slashem-0.0.7E7F3/0000775000076400007640000000000010545462320011646 5ustar alialislashem-0.0.7E7F3/sys/0000775000076400007640000000000010545462317012472 5ustar alialislashem-0.0.7E7F3/sys/vms/0000775000076400007640000000000010545462317013277 5ustar alialislashem-0.0.7E7F3/sys/vms/Makefile.dat0000664000076400007640000000774210545462317015520 0ustar aliali# 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. MAKE = $(MMS) CD = set default ECHO = write sys$output NOOP = continue # don't do anything interesting RUN = mcr # simplest way to pass command line args TOUCH = append/New _NLA0: # only one file per $(TOUCH) # support directories, relative to each other and to 'src' DAT = [-.dat] UTL = [-.util] WINSHR = [-.win.share] WINX11 = [-.win.X11] # utilities; must match Makefile.utl in spelling and punctuation MAKEDEFS = $(UTL)makedefs.exe; LEVCOMP = $(UTL)lev_comp.exe; DGNCOMP = $(UTL)dgn_comp.exe; 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; VARDAT = data.;,rumors.;,quest.dat;,oracles.;,options.; DUNGEON = dungeon.; X11TILES= x11tiles.; # note: the level lists need to be space separated QUESTLEVS = Arch.des Barb.des Caveman.des Healer.des Knight.des \ Monk.des Priest.des Ranger.des Rogue.des Samurai.des Tourist.des \ Valkyrie.des Wizard.des SPECLEVS = bigroom.des castle.des endgame.des gehennom.des knox.des \ medusa.des mines.des oracle.des sokoban.des tower.des yendor.des all : $(VARDAT) $(DUNGEON) $(MARKERS) $(DLB) @ $(ECHO) "data files are up to date." # these are convenience targets for "manual" interactive use spec_levs : spev_levs.timestamp @ $(ECHO) "special levels are up to date." quest_levs : quest_levs.timestamp @ $(ECHO) "quest levels are up to date." dungeon : $(DUNGEON) @ $(ECHO) "dungeon is up to date." data : data.; @ $(NOOP) rumors : rumors.; @ $(NOOP) quest.dat : quest.dat; @ $(NOOP) oracles : oracles.; @ $(NOOP) options : options.; @ $(NOOP) 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) $(X11TILES) : $(TILE2X11) \ $(WINSHR)monsters.txt $(WINSHR)objects.txt $(WINSHR)other.txt $(RUN) $(TILE2X11) \ $(WINSHR)monsters.txt $(WINSHR)objects.txt $(WINSHR)other.txt pet_mark.xbm : $(WINX11)pet_mark.xbm copy $(WINX11)pet_mark.xbm pet_mark.xbm rip.xpm : $(WINX11)rip.xpm copy $(WINX11)rip.xpm rip.xpm data.; : data.base $(MAKEDEFS) $(RUN) $(MAKEDEFS) -d rumors.; : rumors.tru rumors.fal $(MAKEDEFS) $(RUN) $(MAKEDEFS) -r quest.dat; : quest.txt $(MAKEDEFS) $(RUN) $(MAKEDEFS) -q oracles.; : oracles.txt $(MAKEDEFS) $(RUN) $(MAKEDEFS) -h # note: 'options' should have already been made when include/date.h was created options.; : $(MAKEDEFS) $(RUN) $(MAKEDEFS) -v spec_levs.timestamp; : $(SPECLEVS) $(LEVCOMP) $(RUN) $(LEVCOMP) $(SPECLEVS) $(TOUCH) spec_levs.timestamp; quest_levs.timestamp; : $(QUESTLEVS) $(LEVCOMP) $(RUN) $(LEVCOMP) $(QUESTLEVS) $(TOUCH) quest_levs.timestamp; $(DUNGEON) : dungeon.def $(MAKEDEFS) $(DGNCOMP) $(RUN) $(MAKEDEFS) -e !dungeon.def -> dungeon.pdf $(RUN) $(DGNCOMP) dungeon.pdf !dungeon.pdr -> dungeon clean : - if f$search("*.*;-1").nes."" then purge - if f$search("dungeon.pdf").nes."" then delete dungeon.pdf; - if f$search("*.timestamp").nes."" then delete $(MARKERS) spotless : clean - delete $(VARDAT) - if f$search("$(DUNGEON)").nes."" then delete $(DUNGEON) - if f$search("*.lev").nes."" then delete *.lev; - if f$search("$(X11TILES)").nes."" then delete $(X11TILES) - if f$search("*.x%m").nes."" then delete *.x%m; !*.xbm,*.xpm - if f$search("nh*.dlb").nes."" then delete nh*.dlb; - if f$search("nhdat.lst").nes."" then delete nhdat.lst; slashem-0.0.7E7F3/sys/vms/Makefile.doc0000664000076400007640000000431210545462317015503 0ustar aliali# 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. GUIDEBOOK = Guidebook. # regular ASCII file #GUIDEBOOK = Guidebook.ps # PostScript file #GUIDEBOOK = Guidebook.dvi # TeX device-independent file ALLDOCS = $(GUIDEBOOK) #ALLDOCS = $(GUIDEBOOK) manpages NOOP = ! Guidebook : $(GUIDEBOOK) $(NOOP) # the basic guidebook #Guidebook. : Guidebook.mn # #tbl tmac.n Guidebook.mn | nroff | col > Guidebook # write sys$output "Guidebook.mn cannot be processed under VMS." Guidebook. : Guidebook.txt # distributed version of plain text copy Guidebook.txt Guidebook. # Fancier output for those with ditroff, psdit and a PostScript printer. #Guidebook.ps : Guidebook.mn # #tbl tmac.n Guidebook.mn | ditroff | psdit > Guidebook.ps # write sys$output "Guidebook.mn cannot be processed under VMS." Guidebook.ps : Guidebook.dvi # generated with LaTeX dvi2ps Guidebook # Guidebook.tex is the same as Guidebook.mn but formatted with LaTeX. # - The invocation command for LaTeX may vary in different installations. # - To print Guidebook.dvi you need to use a suitable dvi-driver. Guidebook.dvi : Guidebook.tex latex Guidebook.tex all : $(ALLDOCS) $(NOOP) GAME = nethack MANDIR = HACKDIR: MANEXT = man #MANDIR = /usr/man/man6 #MANEXT = 6 # manual non-installation; raw man pages may be better than nothing GAMEMANCREATE = copy nethack.6 LEVMANCREATE = copy lev_comp.6 DGNMANCREATE = copy dgn_comp.6 RCVRMANCREATE = copy recover.6 # GAMEMANCREATE = nroff -man nethack.6 > # LEVMANCREATE = nroff -man lev_comp.6 > # DGNMANCREATE = nroff -man dgn_comp.6 > # RCVRMANCREATE = nroff -man recover.6 > manpages : - $(GAMEMANCREATE) $(MANDIR)$(GAME).$(MANEXT) - $(LEVMANCREATE) $(MANDIR)lev_comp.$(MANEXT) - $(DGNMANCREATE) $(MANDIR)dgn_comp.$(MANEXT) - $(RCVRMANCREATE) $(MANDIR)recover.$(MANEXT) spotless : - if f$search("Guidebook.") .nes."" then delete Guidebook.;* - if f$search("Guidebook.ps") .nes."" then delete Guidebook.ps;* - if f$search("Guidebook.dvi").nes."" then delete Guidebook.dvi;* - if f$search("Guidebook.aux").nes."" then delete Guidebook.aux;* - if f$search("Guidebook.log").nes."" then delete Guidebook.log;* slashem-0.0.7E7F3/sys/vms/install.com0000775000076400007640000002271410545462317015456 0ustar aliali$ ! vms/install.com -- set up nethack 'playground' $ ! $ ! Use vmsbuild.com to create nethack.exe, makedefs, and lev_comp *first*. $ ! $ ! Edit this file to define gamedir & gameuic, or else invoke it with two $ ! command line parameters, as in: $ ! @[.sys.vms]install "disk$users:[games.nethack]" "games" $ ! or @[.sys.vms]install "[-.play]" "[40,1]" $ ! $ ! default location is old playground, default owner is installer $ gamedir = f$trnlnm("NETHACKDIR") !location of playground $ if gamedir.eqs."" then gamedir = f$trnlnm("HACKDIR") $ gameuic = f$user() !owner of playground $ ! --- nothing below this line should need to be changed --- $ if p1.nes."" then gamedir := 'p1' $ if p2.nes."" then gameuic := 'p2' $ $ ! note: all filespecs contain some punctuation, $ ! to avoid inadvertent logical name interaction $ play_files = "PERM.,RECORD.,LOGFILE.,PANICLOG." $ help_files = "HELP.,HH.,CMDHELP.,WIZHELP.,OPTHELP.,HISTORY.,LICENSE." $ data_files = "DATA.,RUMORS.,ORACLES.,OPTIONS.,QUEST.DAT" $ guidebook = "[.doc]Guidebook.txt" $ invoc_proc = "[.sys.vms]nethack.com" $ trmcp_file = "[.sys.share]termcap" $ spec_files = "AIR.LEV,ASMODEUS.LEV,ASTRAL.LEV,BAALZ.LEV,BIGRM-%.LEV," - + "CASTLE.LEV,EARTH.LEV,FAKEWIZ%.LEV,FIRE.LEV," - + "JUIBLEX.LEV,KNOX.LEV,MEDUSA-%.LEV,MINEFILL.LEV," - + "MINETN-%.LEV,MINEND-%.LEV,ORACLE.LEV,ORCUS.LEV," - + "SANCTUM.LEV,SOKO%-%.LEV,TOWER%.LEV,VALLEY.LEV," - + "WATER.LEV,WIZARD%.LEV" $ spec_input = "bigroom.des castle.des endgame.des " - + "gehennom.des knox.des medusa.des mines.des " - + "oracle.des sokoban.des tower.des yendor.des" $ qstl_files = "%%%-GOAL.LEV,%%%-FIL%.LEV,%%%-LOCA.LEV,%%%-STRT.LEV" $ qstl_input = "Arch.des Barb.des Caveman.des Healer.des " - + "Knight.des Monk.des Priest.des Ranger.des Rogue.des " - + "Samurai.des Tourist.des Wizard.des Valkyrie.des" $ dngn_files = "DUNGEON." $ dngn_input = "dungeon.pdf" $ dlb_files = help_files + "," + data_files + "," - + spec_files + "," + qstl_files + "," + dngn_files $ data_libry = "nh-data.dlb" $ xtrn_files = "LICENSE.,HISTORY.,OPTIONS." $ makedefs := $sys$disk:[-.util]makedefs $ lev_comp := $sys$disk:[-.util]lev_comp $ dgn_comp := $sys$disk:[-.util]dgn_comp $ dlb := $sys$disk:[-.util]dlb $ milestone = "write sys$output f$fao("" !5%T "",0)," $ if p3.nes."" .and. f$edit(p4,"UPCASE").nes."VERBOSE" then milestone = "!" $ echo = "write sys$output" $ warn = echo !could be "write sys$error" $! $! make sure we've got a playground location $ gamedir := 'gamedir' $ if gamedir.eqs."" then gamedir = "[.play]" !last ditch default $ gamedir = f$parse(gamedir,,,,"SYNTAX_ONLY") - ".;" $ if gamedir.eqs."" then write sys$error "% must specify playground directory" $ if gamedir.eqs."" then exit %x1000002C !ss$_abort $ $! $! ['p3' is used in Makefile.top] $ if p3.nes."" then goto make_'p3' $ $ milestone "" $! $make_data_plus_dlb: $make_data: $ ! start from a known location -- [.sys.vms] $ set default 'f$parse(f$environment("PROCEDURE"),,,"DIRECTORY")' $! generate miscellaneous data files $ set default [-.-.dat] !move to data directory $ milestone "(data)" $ makedefs -d !data.base -> data $ milestone "(rumors)" $ makedefs -r !rumors.tru + rumors.fal -> rumors $ milestone "(oracles)" $ makedefs -h !oracles.txt -> oracles $ milestone "(dungeon preprocess)" $ makedefs -e !dungeon.def -> dungeon.pdf $ milestone "(quest text)" $ makedefs -q !quest.txt -> quest.dat $ milestone "(special levels)" $ lev_comp 'spec_input' !special levels $ milestone "(quest levels)" $ lev_comp 'qstl_input' !quest levels $ milestone "(dungeon compile)" $ dgn_comp 'dngn_input' !dungeon database $ set default [-] !move up $ if p3.nes."" .and. f$edit(p3,"UPCASE").nes."DATA_PLUS_DLB" then exit $ $make_dlb: $ ! start from a known location -- [.sys.vms] $ set default 'f$parse(f$environment("PROCEDURE"),,,"DIRECTORY")' $! construct data library $ set default [-.-.dat] !move to data directory $ milestone "(dlb setup)" $! since DLB doesn't support wildcard expansion and we don't have shell $! file globbing, start by making a file listing its intended contents $ create nhdat.lst $ if f$search("nhdat.lst;-1").nes."" then - purge/noConfirm/noLog nhdat.lst $! an old data file might fool us later, so get rid of it $ if f$search(data_libry).nes."" then - delete/noConfirm/noLog 'data_libry';* $ if f$trnlnm("PFILE$").nes."" then close/noLog pfile$ $ open/Append pfile$ nhdat.lst $ i = 0 $dloop: $ g = f$element(i,",",dlb_files) $ if g.eqs."," then goto ddone $ wild = f$locate("*",g).ne.f$locate("%",g) $ fcnt = 0 $floop: $ f = f$search(g) $ if f.eqs."" then goto fdone $ fcnt = fcnt + 1 $! strip device, directory, and version from name $ f = f$parse(f,,,"NAME") + f$parse(f,,,"TYPE") $! strip trailing dot, if present, and change case $ f = f$edit(f + "#" - ".#" - "#","LOWERCASE") $ if f$extract(3,1,f).eqs."-" then - !"xyz-foo.lev" -> "Xyz-foo.lev" f = f$edit(f$extract(0,1,f),"UPCASE") + f$extract(1,255,f) $ write pfile$ f $ if wild then goto floop $fdone: $ if fcnt.eq.0 then warn "? no file(s) found for """,g,"""" $ i = i + 1 $ goto dloop $ddone: $ close pfile$ $ milestone "(dlb create)" $ dlb "-cfI" 'data_libry' nhdat.lst $ set default [-] !move up $ if p3.nes."" then exit $ $! $! set up the playground and save directories $ milestone "(directories)" $make_directories: $ srctree = f$environment("DEFAULT") $ set default 'gamedir' $ if f$parse("[-]").eqs."" then create/dir/log [-] !default owner & protection $ if f$parse("[]" ).eqs."" then - !needs to be world writable create/directory/owner='gameuic'/prot=(s:rwe,o:rwe,g:rwe,w:rwe)/log [] $ if f$search("SAVE.DIR;1").eqs."" then - create/directory/owner='gameuic'/prot=(s:rwe,o:rwe,g:rwe,w:rwe)/log - [.SAVE]/version_limit=2 $ set default 'srctree' $ if p3.nes."" then exit $! $! create empty writeable files -- logfile, scoreboard, multi-user access lock $! [if old versions are already present, validate and retain them if possible] $make_writeable_files: $ milestone "(writeable files)" !-!$ create/owner='gameuic'/prot=(s:rwed,o:rwed,g:rwed,w:rwed) - !-! 'gamedir''play_files' $ i = 0 $ploop: if f$trnlnm("PFILE$").nes."" then close/nolog pfile$ $ f = f$element(i,",",play_files) $ if f.eqs."," then goto pdone $ i = i + 1 $ f = gamedir + f $ if f$search(f).eqs."" then goto pmake !make it if not found $ if f$file_attrib(f,"RFM").nes."STMLF" then goto prej !must be stream_lf $ open/read/error=prej pfile$ 'f' $ read/end=ploop pfile$ pline !empty is ok $ close pfile$ $ pfield = f$element(0," ",pline) !1st field is version number $ if f$locate(".",pfield).lt.f$length(pfield) then goto ploop !keep $prej: rename/new_vers 'f' *.old !reject old version $pmake: create/fdl=sys$input:/owner='gameuic' 'f'/log file organization sequential protection (system:rwd,owner:rwd,group:rw,world:rw) record format stream_lf $ goto ploop $pdone: $ if p3.nes."" then exit $! $! copy over the remaining game files, then make them readonly $make_readonly_files: $ milestone "(readonly files)" $ if f$search("[.dat]''data_libry'").nes."" $ then call copyfiles 'f$string(data_libry+","+xtrn_files)' [.dat] "r" $ else !'dlb_files' is too long for a single command $ k = 200 + f$locate(",",f$extract(200,999,dlb_files)) $ call copyfiles 'f$extract(0,k,dlb_files)' [.dat] "r" $ call copyfiles 'f$extract(k+1,999,dlb_files)' [.dat] "r" $ endif $ if p3.nes."" then exit $! $make_executable: $ milestone "(nethack.exe)" $ call copy_file [.src]nethack.exe 'gamedir'nethack.exe "re" $ if p3.nes."" then exit $! $! provide invocation procedure (if available) $make_procedure: $ if f$search(invoc_proc).eqs."" then goto skip_dcl $ if f$search("''gamedir'nethack.com").nes."" then - if f$cvtime(f$file_attr("''gamedir'nethack.com","RDT")) - .ges. f$cvtime(f$file_attr(invoc_proc,"RDT")) then goto skip_dcl $ milestone "(nethack.com)" $ call copy_file 'invoc_proc' 'gamedir'nethack.com "re" $skip_dcl: $ if p3.nes."" then exit $! $! provide plain-text Guidebook doc file (if available) $make_documentation: $ if f$search(guidebook).eqs."" then goto skip_doc $ milestone "(Guidebook)" $ call copy_file 'guidebook' 'gamedir'Guidebook.doc "r" $skip_doc: $ if p3.nes."" then exit $! $! provide last-resort termcap file (if available) $make_termcap: $ if f$search(trmcp_file).eqs."" then goto skip_termcap $ if f$search("''gamedir'termcap").nes."" then goto skip_termcap $ milestone "(termcap)" $ call copy_file 'trmcp_file' 'gamedir'termcap "r" $skip_termcap: $ if p3.nes."" then exit $! $! done $ milestone "" $ define/nolog nethackdir 'gamedir' $ define/nolog hackdir 'gamedir' $ echo - f$fao("!/ Nethack installation complete. !/ Playground is !AS !/",gamedir) $ exit $ $! $! copy one file, resetting the protection on an earlier version first $copy_file: subroutine $ if f$search(p2).nes."" then set file/Prot=(s:rwed,o:rwed) 'p2' $ copy/Prot=(s:'p3'wd,o:'p3'wd,g:'p3',w:'p3') 'p1' 'p2' $ set file/Owner='gameuic'/Prot=(s:'p3',o:'p3') 'p2' $endsubroutine !copy_file $ $! $! copy a comma-separated list of wildcarded files, one file at a time $copyfiles: subroutine $ i = 0 $lloop: $ g = f$element(i,",",p1) $ if g.eqs."," then goto ldone $ g = p2 + g $ wild = f$locate("*",g).ne.f$locate("%",g) $ fcnt = 0 $eloop: $ f = f$search(g) $ if f.eqs."" then goto edone $ fcnt = fcnt + 1 $ f = f - f$parse(f,,,"VERSION") $ e = f$parse(f,,,"NAME") + f$parse(f,,,"TYPE") $ call copy_file 'f' 'gamedir''e' "''p3'" $ if wild then goto eloop $edone: $ if fcnt.eq.0 then warn "? no file(s) found for """,g,"""" $ i = i + 1 $ goto lloop $ldone: $endsubroutine !copyfiles $ $! slashem-0.0.7E7F3/sys/vms/Makefile.utl0000664000076400007640000002776610545462317015564 0ustar aliali# 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 RUN = mcr # simplest way to pass command line args TOUCH = append/New _NLA0: # only one file per $(TOUCH) # source tree, relative to 'src' and 'util' DAT = [-.dat] INC = [-.include] SYSSHR = [-.sys.share] SRC = [-.src] UTL = [-.util] VMS = [-.sys.vms] WINSHR = [-.win.share] WINX11 = [-.win.X11] # targets, with enough punctuation to keep MCR and DELETE happy MAKEDEFS= $(UTL)makedefs.exe; LEVCOMP = $(UTL)lev_comp.exe; DGNCOMP = $(UTL)dgn_comp.exe; DLB = $(UTL)dlb.exe; RECOVER = $(UTL)recover.exe; # used by $(DAT)Makefile for synchronization 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 # If you don't have yacc, byacc, or bison or just don't want to run any of # them, then make target "no_yacc" before trying to build lev_comp # or dgn_comp. You won't be able to modify *_comp.y though. # If you don't have lex or flex, then make target "no_lex" and leave # *_comp.l alone. $(VMS)lev_lex.h will be used to work-around some # suspect code included in the distributed copies of *_lex.c. # If you do either of the above, the corresponding value of YACC and/or LEX # below won't matter. # # Note: VMS POSIX V1.1 lex and yacc generate code which contains an # invalid #module directive; it order to prevent warnings for CC or # choking by GCC, the SEARCH command is used in an attempt to strip # then out. Otherwise MMS would quit when making the affected targets. # Each "munged" copy should be identical to its original if no #module # directives are present. # # yacc/lex programs to use to generate *_comp.c, *_comp.h, and *_lex.c. # choose xxxOUT that matches xxx tool's output YACC = bison /Define LEX = flex #YACC = yacc -d #LEX = lex #YACC = posix/Run posix$bin:yacc. "-d #LEX = posix/Run posix$bin:lex. " # blank means foo.y -> foo_tab.c & foo_tab.h YACCOUT = # bison #YACCOUT = ytab # VMS POSIX #YACCOUT = y_tab # DEC/Shell LEXOUT = lexyy # flex #LEXOUT = lex_yy # VMS POSIX # Nothing below this line should have to be changed. # linker options file LIBOPT = $(SRC)crtl.opt; # timestamps for primary header files, matching src/Makefile CONFIG_H = $(SRC)config.h-t HACK_H = $(SRC)hack.h-t # utility .c files MAKESRC = makedefs.c SPLEVSRC = lev_yacc.c lev_lex.c lev_main.c DGNCOMPSRC = dgn_yacc.c dgn_lex.c dgn_main.c RECOVSRC = recover.c DLBSRC = dlb_main.c UTILSRCS = $(MAKESRC) $(SPLEVSRC) $(DGNCOMPSRC) $(RECOVSRC) $(DLBSRC) panic.c # object files that provide access to NetHack's names NAMEOBJ1 = $(SRC)monst.obj,$(SRC)objects.obj NAMEOBJ2 = $(SRC)drawing.obj,$(SRC)decl.obj NAMEOBJS = $(NAMEOBJ1),$(NAMEOBJ2) # object files for makedefs MAKEOBJS = makedefs.obj,$(NAMEOBJ1) VMSMAKEOBJS = $(SRC)vmsmisc.obj # object files for special levels compiler SPLEVOBJS = lev_main.obj,lev_yacc.obj,lev_lex.obj,panic.obj,\ $(SRC)alloc.obj,$(NAMEOBJS) VMSSPLEVOBJS = $(SRC)vmsmisc.obj,$(SRC)vmsfiles.obj # object files for dungeon compiler DGNCOMPOBJS = dgn_main.obj,dgn_yacc.obj,dgn_lex.obj,panic.obj,$(SRC)alloc.obj VMSDGNCOBJS = $(SRC)vmsmisc.obj # object files for recovery utility RECOVOBJS = recover.obj VMSRECOBJS = $(SRC)vmsmisc.obj,$(SRC)vmsfiles.obj # object files for dlb utility DLBOBJS = dlb_main.obj,panic.obj,$(SRC)alloc.obj,$(SRC)dlb.obj VMSDLBOBJS = $(SRC)vmsmisc.obj,$(SRC)vmsfiles.obj # fake target default : @ $(ECHO) "Oops! No target(s) specified...." all : $(MAKEDEFS) $(LEVCOMP) $(DGNCOMP) $(RECOVER) $(DLB) @ $(ECHO) "util is up to date." # special targets for folks without yacc/bison and or lex/flex no_yacc : copy $(SYSSHR)%%%_yacc.c $(UTL) copy $(SYSSHR)%%%_comp.h $(INC) @ $(ECHO) "distributed yacc output (*_yacc.c) copied into place" no_lex : copy $(SYSSHR)%%%_lex.c $(UTL) copy $(VMS)lev_lex.h $(UTL) @ $(ECHO) "distributed lex output (*_lex.c) copied into place" # alternate target names for possible interactive use makedefs : $(MAKEDEFS) @ $(ECHO) "makedefs is up to date." lev_comp : $(LEVCOMP) @ $(ECHO) "lev_comp is up to date." dgn_comp : $(DGNCOMP) @ $(ECHO) "dgn_comp is up to date." recover : $(RECOVER) @ $(ECHO) "recover is up to date." dlb : $(DLB) @ $(ECHO) "recover is up to date." $(LIBOPT) : $(SRC)Makefile.; # linker options file $(CD) $(SRC) $(MAKE)$(MAKEFLAGS) $(LIBOPT) @ $(CD) $(UTL) # dependencies for makedefs # $(MAKEDEFS) : $(MAKEOBJS) $(VMSMAKEOBJS) $(LIBOPT) $(LINK) $(LFLAGS) $(MAKEOBJS),$(VMSMAKEOBJS),$(LIBS) @ $(TOUCH) $(MARKER) makedefs.obj : makedefs.c \ $(CONFIG_H) $(INC)permonst.h $(INC)objclass.h \ $(INC)monsym.h $(INC)artilist.h $(INC)dungeon.h \ $(INC)obj.h $(INC)monst.h $(INC)you.h $(INC)flag.h \ $(INC)dlb.h $(INC)patchlevel.h $(INC)qtext.h $(INC)onames.h : $(MAKEDEFS) $(RUN) $(MAKEDEFS) -o $(INC)pm.h : $(MAKEDEFS) $(RUN) $(MAKEDEFS) -p $(SRC)monstr.c : $(MAKEDEFS) $(RUN) $(MAKEDEFS) -m # both vis_tab.h and vis_tab.c are made at the same time by makedefs -z $(INC)vis_tab.h : $(SRC)vis_tab.c $(TOUCH) $(INC)vis_tab.h $(SRC)vis_tab.c : $(MAKEDEFS) $(RUN) $(MAKEDEFS) -z # the src Makefile is responsible for knowing when to call this, since # it knows all about the main src and include files $(INC)date.h : $(MAKEDEFS) $(RUN) $(MAKEDEFS) -v # dependencies for lev_comp # $(LEVCOMP) : $(SPLEVOBJS) $(VMSSPLEVOBJS) # $(LIBOPT) $(LINK)/Exe=$(LEVCOMP) $(LFLAGS) $(SPLEVOBJS),$(VMSSPLEVOBJS),$(LIBS) lev_yacc.obj : $(HACK_H) $(INC)sp_lev.h lev_yacc.c $(CC) $(CFLAGS) lev_yacc.c lev_lex.obj : $(HACK_H) $(INC)lev_comp.h $(INC)sp_lev.h lev_lex.c @ if f$search("lev_lex.h").nes."" then $(MOVE) lev_lex.h stdio.h $(CC) $(CFLAGS) lev_lex.c @ if f$search("stdio.h").nes."" then $(MOVE) stdio.h lev_lex.h lev_main.obj : $(HACK_H) $(INC)sp_lev.h $(INC)tcap.h $(INC)date.h lev_main.c $(CC) $(CFLAGS) lev_main.c panic.obj : $(CONFIG_H) $(CC) $(CFLAGS) panic.c $(INC)lev_comp.h : lev_yacc.c $(TOUCH) $(INC)lev_comp.h lev_yacc.c : lev_comp.y $(YACC) lev_comp.y $(MUNG) 'f$parse("$(YACCOUT)","lev_comp_tab.c")' "#module" /Outp=lev_yacc.c @ if f$search("''f$parse("$(YACCOUT)","lev_comp_tab.c")'").nes."" then \ $(RM) 'f$parse("$(YACCOUT)","lev_comp_tab.c")' $(MOVE) 'f$parse("$(YACCOUT)","lev_comp_tab.h")' $(INC)lev_comp.h lev_lex.c : lev_comp.l $(LEX) lev_comp.l $(MUNG) 'f$parse("$(LEXOUT)","lev_comp_lex.c")' "#module" /Outp=lev_lex.c @ if f$search("''f$parse("$(LEXOUT)","lev_comp_lex.c")'").nes."" then \ $(RM) 'f$parse("$(LEXOUT)","lev_comp_lex.c")' # dependencies for dgn_comp # $(DGNCOMP) : $(DGNCOMPOBJS) $(VMSDGNCOBJS) # $(LIBOPT) $(LINK)/Exe=$(DGNCOMP) $(LFLAGS) $(DGNCOMPOBJS),$(VMSDGNCOBJS),$(LIBS) dgn_yacc.obj : $(CONFIG_H) $(INC)dgn_file.h $(INC)date.h dgn_yacc.c $(CC) $(CFLAGS) dgn_yacc.c dgn_lex.obj : $(CONFIG_H) $(INC)dgn_comp.h $(INC)dgn_file.h dgn_lex.c @ if f$search("lev_lex.h").nes."" then $(MOVE) lev_lex.h stdio.h $(CC) $(CFLAGS) dgn_lex.c @ if f$search("stdio.h").nes."" then $(MOVE) stdio.h lev_lex.h dgn_main.obj : $(CONFIG_H) dgn_main.c $(CC) $(CFLAGS) dgn_main.c $(INC)dgn_comp.h : dgn_yacc.c $(TOUCH) $(INC)dgn_comp.h dgn_yacc.c : dgn_comp.y $(YACC) dgn_comp.y $(MUNG) 'f$parse("$(YACCOUT)","dgn_comp_tab.c")' "#module" /Outp=dgn_yacc.c @ if f$search("''f$parse("$(YACCOUT)","dgn_comp_tab.c")'").nes."" then \ $(RM) 'f$parse("$(YACCOUT)","dgn_comp_tab.c")' $(MOVE) 'f$parse("$(YACCOUT)","dgn_comp_tab.h")' $(INC)dgn_comp.h dgn_lex.c : dgn_comp.l $(LEX) dgn_comp.l $(MUNG) 'f$parse("$(LEXOUT)","dgn_comp_lex.c")' "#module" /Outp=dgn_lex.c @ if f$search("''f$parse("$(LEXOUT)","dgn_comp_lex.c")'").nes."" then \ $(RM) 'f$parse("$(LEXOUT)","dgn_comp_lex.c")' # dependencies for recover # $(RECOVER) : $(RECOVOBJS) $(VMSRECOBJS) # $(LIBOPT) $(LINK) $(LFLAGS) $(RECOVOBJS),$(VMSRECOBJS),$(LIBS) recover.obj : $(CONFIG_H) recover.c # dependencies for dlb # $(DLB) : $(DLBOBJS) $(VMSDLBOBJS) # $(LIBOPT) $(LINK)/Exe=$(DLB) $(LFLAGS) $(DLBOBJS),$(VMSDLBOBJS),$(LIBS) dlb_main.obj : $(CONFIG_H) $(INC)dlb.h dlb_main.c # dependencies and build rules for tile utilities # TILEMAP = $(UTL)tilemap.exe; GIF2TXT = $(UTL)gif2txt.exe; TXT2PPM = $(UTL)txt2ppm.exe; TILE2X11 = $(UTL)tile2x11.exe; TILEUTILS = $(TILEMAP),$(GIF2TXT),$(TXT2PPM),$(TILE2X11) TEXTIO = $(UTL)tiletxt.obj,tiletext.obj,$(NAMEOBJS),$(SRC)vmsmisc.obj GIFREADERS = gifread.obj,panic.obj,$(SRC)alloc.obj PPMWRITERS = ppmwrite.obj,panic.obj,$(SRC)alloc.obj tileutils : $(TILEUTILS) @ $(NOOP) $(GIF2TXT) : $(GIFREADERS) $(TEXTIO) $(LINK)/Exe=$(GIF2TXT) $(LFLAGS) $(GIFREADERS),$(TEXTIO),$(LIBS) $(TXT2PPM) : $(PPMWRITERS) $(TEXTIO) $(LINK)/Exe=$(TXT2PPM) $(LFLAGS) $(PPMWRITERS),$(TEXTIO),$(LIBS) $(TILE2X11) : tile2x11.obj $(TEXTIO) $(LINK) $(LFLAGS) tile2x11.obj,$(TEXTIO),$(LIBS) $(TILEMAP) : tilemap.obj $(SRC)vmsmisc.obj $(LINK) $(LFLAGS) tilemap.obj,$(SRC)vmsmisc.obj,$(LIBS) $(SRC)tile.c : $(TILEMAP) $(RUN) $(TILEMAP) $(INC)tile.h : $(WINSHR)tile.h copy $(WINSHR)tile.h $(INC)tile.h # Force an explicit directory prefix on tiletxt.obj so that we don't get # unwanted "sticky defaults" when $(TEXTIO) is used in a comma-separated # list on the link command line. # $(UTL)tiletxt.obj : $(HACK_H) $(WINSHR)tilemap.c $(CC) $(CFLAGS) /Def=("TILETEXT")/Obj=$@ $(WINSHR)tilemap.c tilemap.obj : $(HACK_H) $(WINSHR)tilemap.c tiletext.obj : $(CONFIG_H) $(INC)tile.h $(WINSHR)tiletext.c gifread.obj : $(CONFIG_H) $(INC)tile.h $(WINSHR)gifread.c ppmwrite.obj : $(CONFIG_H) $(INC)tile.h $(WINSHR)ppmwrite.c tile2x11.obj : $(HACK_H) $(INC)tile.h $(INC)tile2x11.h $(WINX11)tile2x11.c # make sure object files from src are available when needed # $(SRC)alloc.obj : $(SRC)alloc.c $(CONFIG_H) $(CD) $(SRC) $(MAKE)$(MAKEFLAGS) alloc.obj @ $(CD) $(UTL) $(SRC)monst.obj : $(SRC)monst.c $(CONFIG_H) $(CD) $(SRC) $(MAKE)$(MAKEFLAGS) monst.obj @ $(CD) $(UTL) $(SRC)objects.obj : $(SRC)objects.c $(CONFIG_H) $(CD) $(SRC) $(MAKE)$(MAKEFLAGS) objects.obj @ $(CD) $(UTL) $(SRC)decl.obj : $(SRC)decl.c $(HACK_H) $(CD) $(SRC) $(MAKE)$(MAKEFLAGS) decl.obj @ $(CD) $(UTL) $(SRC)drawing.obj : $(SRC)drawing.c $(HACK_H) $(CD) $(SRC) $(MAKE)$(MAKEFLAGS) drawing.obj @ $(CD) $(UTL) $(SRC)dlb.obj : $(SRC)dlb.c $(HACK_H) $(INC)dlb.h $(CD) $(SRC) $(MAKE)$(MAKEFLAGS) dlb.obj @ $(CD) $(UTL) # make sure hack.h dependencies get transitive information $(HACK_H) : $(CONFIG_H) $(CD) $(SRC) $(MAKE)$(MAKEFLAGS) $(HACK_H) @ $(CD) $(UTL) $(CONFIG_H) : $(INC)config.h $(CD) $(SRC) $(MAKE)$(MAKEFLAGS) $(CONFIG_H) @ $(CD) $(UTL) # VMS specific dependencies $(SRC)vmsmisc.obj : $(VMS)vmsmisc.c $(CD) $(SRC) $(MAKE)$(MAKEFLAGS) vmsmisc.obj @ $(CD) $(UTL) $(SRC)vmsfiles.obj : $(VMS)vmsfiles.c $(CONFIG_H) $(CD) $(SRC) $(MAKE)$(MAKEFLAGS) vmsfiles.obj @ $(CD) $(UTL) clean : - if f$search("*.*;-1").nes."" then purge - if f$search("*.obj") .nes."" then $(RM) *.obj; spotless : clean - if f$search("%%%_lex.c") .nes."" then $(RM) %%%_lex.c; - if f$search("%%%_yacc.c").nes."" then $(RM) %%%_yacc.c; - if f$search("$(INC)%%%_comp.h").nes."" then $(RM) $(INC)%%%_comp.h;* - if f$search("$(INC)tile.h").nes."" then $(RM) $(INC)tile.h;* - if f$search("lev_lex.h") .nes."" then $(RM) lev_lex.h; - if f$search("*tab.c") .nes."" then $(RM) *tab.c; - 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) slashem-0.0.7E7F3/sys/vms/spec_lev.com0000775000076400007640000000620510545462317015605 0ustar aliali$ ! sys/vms/spec_lev.com -- preprocess nethack's special level compiler code $ ! $ ! This operation needs to be performed prior to executing vmsbuild.com. $ ! Process the scanning and parsing code for NetHack's special level $ ! and dungeon compilers. *.l and *.y are converted into *'.c and *.h. $ ! $ $ ! setup yacc/bison and lex/flex; $ ! (Uncomment the alternatives appropriate for your site; $ ! if yacc and lex are not defined, the pre-processed files $ ! distributed in sys/share will be copied and used.) $ ! yacc := bison /Define !native bison (w/ DCL CLD) $ ! yacc := $bison$dir:bison -y -d !'foreign' bison (w/o CLD) $ ! yacc := posix /Run/Input=nl: posix$bin:yacc. """-d $ ! yacc := $shell$exe:yacc -d !yacc from DEC/Shell $ ! lex := $flex$dir:flex !flex $ ! lex := posix /Run/Input=nl: posix$bin:lex. """ $ ! lex := $shell$exe:lex $ ! (Nothing below this line should need to be changed.) $ ! additional setup $ rename := rename/New_Vers $ mung := call mung ! not to be confused with teco :-) $ delete := delete/noConfirm $ search := search/Exact $ copy := copy/noConcat $ ! start from a known location -- [.sys.vms], then move to [-.-.util] $ cur_dir = f$environment("DEFAULT") $ set default 'f$parse(f$environment("PROCEDURE"),,,"DIRECTORY")' $ set default [-.-.util] !move to utility directory $ $mung: subroutine $ ! kludge to strip bogus #module directives from POSIX-processed files $ ! in lieu of $ rename 'p1' 'p2' $ search/Match=NOR 'p1' "#module" /Output='p2' $ delete 'p1';* $ endsubroutine !mung $ $ ! first cleanup any old intermediate files (to safely handle blind renaming) $ if f$search("*tab.%").nes."" then delete *tab.%;* !yacc & bison $ if f$search("*yy.c") .nes."" then delete *yy.c;* !lex & flex $ $ ! process lev_comp.y into lev_yacc.c and ../include/lev_comp.h $ if f$type(yacc).eqs."STRING" $ then $ yacc lev_comp.y $ if f$search("y_tab.%").nes."" then rename y_tab.% lev_comp_tab.* $ if f$search("ytab.%") .nes."" then rename ytab.% lev_comp_tab.* $ else ! use preprocessed files $ copy [-.sys.share]lev_yacc.c,lev_comp.h []lev_comp_tab.* $ endif $ mung lev_comp_tab.c lev_yacc.c $ rename lev_comp_tab.h [-.include]lev_comp.h $ $ ! process lev_comp.l into lev_lex.c $ if f$type(lex).eqs."STRING" $ then $ lex lev_comp.l $ if f$search("lexyy.c").nes."" then rename lexyy.c lex_yy.* $ else ! use preprocessed file $ copy [-.sys.share]lev_lex.c []lex_yy.* $ endif $ mung lex_yy.c lev_lex.c $ $ ! process dgn_comp.y into dgn_yacc.c and ../include/dgn_comp.h $ if f$type(yacc).eqs."STRING" $ then $ yacc dgn_comp.y $ if f$search("y_tab.%").nes."" then rename y_tab.% dgn_comp_tab.* $ if f$search("ytab.%") .nes."" then rename ytab.% dgn_comp_tab.* $ else $ copy [-.sys.share]dgn_yacc.c,dgn_comp.h []dgn_comp_tab.* $ endif $ mung dgn_comp_tab.c dgn_yacc.c $ rename dgn_comp_tab.h [-.include]dgn_comp.h $ $ ! process dgn_comp.l into dgn_lex.c $ if f$type(lex).eqs."STRING" $ then $ lex dgn_comp.l $ if f$search("lexyy.c").nes."" then rename lexyy.c lex_yy.* $ else $ copy [-.sys.share]dgn_lex.c []lex_yy.* $ endif $ mung lex_yy.c dgn_lex.c $ $ ! done $ set default 'cur_dir' $ exit slashem-0.0.7E7F3/sys/vms/vmstty.c0000664000076400007640000003652310545462317015022 0ustar aliali/* SCCS Id: @(#)vmstty.c 3.4 2003/09/18 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ /* tty.c - (VMS) version */ #define NEED_VARARGS #include "hack.h" #include "wintty.h" #include "tcap.h" #include #include #ifndef __GNUC__ #include #include #include #else /* values needed from missing include files */ # define SMG$K_TRM_UP 274 # define SMG$K_TRM_DOWN 275 # define SMG$K_TRM_LEFT 276 # define SMG$K_TRM_RIGHT 277 # define TT$M_MECHTAB 0x00000100 /* hardware tab support */ # define TT$M_MECHFORM 0x00080000 /* hardware form-feed support */ # define TT$M_NOBRDCST 0x00020000 /* disable broadcast messages, but */ # define TT2$M_BRDCSTMBX 0x00000010 /* catch them in associated mailbox */ # define TT2$M_APP_KEYPAD 0x00800000 /* application vs numeric keypad mode */ #endif /* __GNUC__ */ #ifdef USE_QIO_INPUT #include #endif #include #include unsigned long lib$disable_ctrl(), lib$enable_ctrl(); unsigned long sys$assign(), sys$dassgn(), sys$qiow(); #ifndef USE_QIO_INPUT unsigned long smg$create_virtual_keyboard(), smg$delete_virtual_keyboard(), smg$read_keystroke(), smg$cancel_input(); #else static short FDECL(parse_function_key, (int)); #endif static void NDECL(setctty); static void NDECL(resettty); #define vms_ok(sts) ((sts)&1) #define META(c) ((c)|0x80) /* 8th bit */ #define CTRL(c) ((c)&0x1F) #define CMASK(c) (1< 0) { /* we have buffered character(s) from previous read */ kb_buf = *inp++; --inc; sts = SS$_NORMAL; } else { sts = sys$qiow(0, tt_chan, QIO_FUNC, &iosb, (void(*)())0, 0, &kb_buf, sizeof kb_buf, 0, 0, 0, 0); } if (vms_ok(sts)) { if (kb_buf == CTRL('C')) { if (intr_char) gsignal(SIGINT); key = (short)kb_buf; } else if (kb_buf == '\r') { /* */ key = (short)'\n'; } else if (kb_buf == ESC || kb_buf == CSI || kb_buf == SS3) { switch(parse_function_key((int)kb_buf)) { case SMG$K_TRM_UP: key = iflags.num_pad ? '8' : 'k'; break; case SMG$K_TRM_DOWN: key = iflags.num_pad ? '2' : 'j'; break; case SMG$K_TRM_LEFT: key = iflags.num_pad ? '4' : 'h'; break; case SMG$K_TRM_RIGHT: key = iflags.num_pad ? '6' : 'l'; break; default: key = ESC; break; } } else { key = (short)kb_buf; } } else if (sts == SS$_HANGUP || iosb.status == SS$_HANGUP || sts == SS$_DEVOFFLINE) { gsignal(SIGHUP); key = ESC; } else /*(this should never happen)*/ key = getchar(); #else /*!USE_QIO_INPUT*/ if (recurse++ == 0 && kb != 0) { smg$read_keystroke(&kb, &key); switch (key) { case SMG$K_TRM_UP: iflags.num_pad ? '8' : key = 'k'; break; case SMG$K_TRM_DOWN: iflags.num_pad ? '2' : key = 'j'; break; case SMG$K_TRM_LEFT: iflags.num_pad ? '4' : key = 'h'; break; case SMG$K_TRM_RIGHT: iflags.num_pad ? '6' : key = 'l'; break; case '\r': key = '\n'; break; default: if (key > 255) key = ESC; break; } } else { /* abnormal input--either SMG didn't initialize properly or vms_getchar() has been called recursively (via SIGINT handler). */ if (kb != 0) /* must have been a recursive call */ smg$cancel_input(&kb); /* from an interrupt handler */ key = getchar(); } --recurse; #endif /* USE_QIO_INPUT */ return (int)key; } #ifdef USE_QIO_INPUT /* * We've just gotten an character. Do a timed read to * get any other characters, then try to parse them as an escape * sequence. This isn't perfect, since there's no guarantee * that a full escape sequence will be available, or even if one * is, it might actually by regular input from a fast typist or * a stalled input connection. {For packetized environments, * cross plural(body_part(FINGER)) and hope for best. :-} * * This is needed to preserve compatability with SMG interface * for two reasons: * 1) retain support for arrow keys, and * 2) treat other VTxxx function keys as for aborting * various NetHack prompts. * The second reason is compelling; otherwise remaining chars of * an escape sequence get treated as inappropriate user commands. * * SMG code values for these key sequences fall in the range of * 256 thru 3xx. The assignments are not particularly intuitive. */ /*= -- Summary of VTxxx-style keyboards and transmitted escape sequences. -- Keypad codes are prefixed by 7 bit (\033 O) or 8 bit SS3: keypad: PF1 PF2 PF3 PF4 codes: P Q R S 7 8 9 - w x y m 4 5 6 . t u v n 1 2 3 :en-: q r s : : ...0... , :ter: ...p... l :M: Arrows are prefixed by either SS3 or CSI (either 7 or 8 bit), depending on whether the terminal is in application or numeric mode (ditto for PF keys): arrows: A B D C Additional function keys (vk201/vk401) generate CSI nn ~ (nn is 1 or 2 digits): vk201 keys: F6 F7 F8 F9 F10 F11 F12 F13 F14 Help Do F17 F18 F19 F20 'nn' digits: 17 18 19 20 21 23 24 25 26 28 29 31 32 33 34 alternate: ^C ^[ ^H ^J (when in VT100 mode) edit keypad: digits: 1 2 3 4 5 6 VT52 mode: arrows and PF keys send ESCx where x is in A-D or P-S. =*/ static const char *arrow_or_PF = "ABCDPQRS", /* suffix char */ *smg_keypad_codes = "PQRSpqrstuvwxyMmlnABDC"; /* PF1..PF4,KP0..KP9,enter,dash,comma,dot,up-arrow,down,left,right */ /* Ultimate return value is (index into smg_keypad_codes[] + 256). */ static short parse_function_key(c) register int c; { struct _rd_iosb iosb; unsigned long sts; char seq_buf[15+1]; /* plenty room for escape sequence + slop */ short result = ESC; /* translate to by default */ /* * Read whatever we can from type-ahead buffer (1 second timeout). * If the user typed an actual to deliberately abort * something, he or she should be able to tolerate the necessary * restriction of a negligible pause before typing anything else. * We might already have [at least some of] an escape sequence from a * previous read, particularly if user holds down the arrow keys... */ if (inc > 0) strncpy(seq_buf, inp, inc); if (inc < (int)(sizeof seq_buf) - 1) { sts = sys$qiow(0, tt_chan, QIO_FUNC|IO$M_TIMED, &iosb, (void(*)())0, 0, seq_buf + inc, sizeof seq_buf - 1 - inc, 1, 0, 0, 0); if (vms_ok(sts)) sts = iosb.status; } else sts = SS$_NORMAL; if (vms_ok(sts) || sts == SS$_TIMEOUT) { register int cnt = iosb.trm_offset + iosb.trm_siz + inc; register char *p = seq_buf; if (c == ESC) /* check for 7-bit vt100/ANSI, or vt52 */ if (*p == '[' || *p == 'O') c = META(CTRL(*p++)), cnt--; else if (strchr(arrow_or_PF, *p)) c = SS3; /*CSI*/ if (cnt > 0 && (c == SS3 || (c == CSI && strchr(arrow_or_PF, *p)))) { register char *q = strchr(smg_keypad_codes, *p); if (q) result = 256 + (q - smg_keypad_codes); p++, --cnt; /* one more char consumed */ } else if (cnt > 1 && c == CSI) { static short /* "CSI nn ~" -> F_keys[nn] */ F_keys[35] = { ESC, /*(filler)*/ 311, 312, 313, 314, 315, 316, /* E1-E6 */ ESC, ESC, ESC, ESC, /*(more filler)*/ 281, 282, 283, 284, 285, ESC, /* F1-F5 */ 286, 287, 288, 289, 290, ESC, /* F6-F10*/ 291, 292, 293, 294, ESC, /*F11-F14*/ 295, 296, ESC, /*,, aka F15,F16*/ 297, 298, 299, 300 /*F17-F20*/ }; /* note: there are several missing nn in CSI nn ~ values */ int nn; char *q; *(p + cnt) = '\0'; /* terminate string */ q = strchr(p, '~'); if (q && sscanf(p, "%d~", &nn) == 1) { if (nn > 0 && nn < SIZE(F_keys)) result = F_keys[nn]; cnt -= (++q - p); p = q; } } if (cnt > 0) strncpy((inp = inputbuf), p, (inc = cnt)); else inc = 0, inp = 0; } return result; } #endif /* USE_QIO_INPUT */ static void setctty() { struct _sm_iosb iosb; unsigned long status; status = sys$qiow(0, tt_chan, IO$_SETMODE, &iosb, (void(*)())0, 0, &sg.sm, sizeof sg.sm, 0, 0, 0, 0); if (vms_ok(status)) status = iosb.status; if (vms_ok(status)) { /* try to force terminal into synch with TTDRIVER's setting */ number_pad((sg.sm.tt2_char & TT2$M_APP_KEYPAD) ? -1 : 1); } else { raw_print(""); errno = EVMSERR, vaxc$errno = status; perror("NetHack(setctty: setmode)"); wait_synch(); } } static void resettty() /* atexit() routine */ { if (settty_needed) { bombing = TRUE; /* don't clear screen; preserve traceback info */ settty((char *)0); } (void) sys$dassgn(tt_chan), tt_chan = 0; } /* * Get initial state of terminal, set ospeed (for termcap routines) * and switch off tab expansion if necessary. * Called by init_nhwindows() and resume_nhwindows() in wintty.c * (for initial startup and for returning from '!' or ^Z). */ void gettty() { static char dev_tty[] = "TT:"; static $DESCRIPTOR(tty_dsc, dev_tty); int err = 0; unsigned long status, zero = 0; if (tt_chan == 0) { /* do this stuff once only */ iflags.cbreak = OFF, iflags.echo = ON; /* until setup is complete */ status = sys$assign(&tty_dsc, &tt_chan, 0, 0); if (!vms_ok(status)) { raw_print(""), err++; errno = EVMSERR, vaxc$errno = status; perror("NetHack(gettty: $assign)"); } atexit(resettty); /* register an exit handler to reset things */ } status = sys$qiow(0, tt_chan, IO$_SENSEMODE, &sg.io, (void(*)())0, 0, &sg.sm, sizeof sg.sm, 0, 0, 0, 0); if (vms_ok(status)) status = sg.io.status; if (!vms_ok(status)) { raw_print(""), err++; errno = EVMSERR, vaxc$errno = status; perror("NetHack(gettty: sensemode)"); } ospeed = sg.io.xmt_speed; erase_char = '\177'; /* , aka */ kill_char = CTRL('U'); intr_char = CTRL('C'); (void) lib$enable_ctrl(&zero, &ctrl_mask); /* Use the systems's values for lines and columns if it has any idea. */ if (sg.sm.page_length) LI = sg.sm.page_length; if (sg.sm.page_width) CO = sg.sm.page_width; /* suppress tab and form-feed expansion, in case termcap uses them */ tt_char_restore = sg.sm.tt_char; tt_char_active = sg.sm.tt_char |= TT_SPECIAL_HANDLING; tt2_char_restore = sg.sm.tt2_char; tt2_char_active = sg.sm.tt2_char |= TT2_SPECIAL_HANDLING; #if 0 /*[ defer until setftty() ]*/ setctty(); #endif if (err) wait_synch(); } /* reset terminal to original state */ void settty(s) const char *s; { if (!bombing) end_screen(); if (s) raw_print(s); disable_broadcast_trapping(); #if 0 /* let SMG's exit handler do the cleanup (as per doc) */ /* #ifndef USE_QIO_INPUT */ if (kb) smg$delete_virtual_keyboard(&kb), kb = 0; #endif /* 0 (!USE_QIO_INPUT) */ if (ctrl_mask) (void) lib$enable_ctrl(&ctrl_mask, 0); iflags.echo = ON; iflags.cbreak = OFF; /* reset original tab, form-feed, broadcast settings */ sg.sm.tt_char = tt_char_restore; sg.sm.tt2_char = tt2_char_restore; setctty(); settty_needed = FALSE; } /* same as settty, with no clearing of the screen */ void shuttty(s) const char *s; { bombing = TRUE; settty(s); bombing = FALSE; } void setftty() { unsigned long mask = LIB$M_CLI_CTRLT | LIB$M_CLI_CTRLY; (void) lib$disable_ctrl(&mask, 0); if (kb == 0) { /* do this stuff once only */ #ifdef USE_QIO_INPUT kb = tt_chan; #else /*!USE_QIO_INPUT*/ smg$create_virtual_keyboard(&kb); #endif /*USE_QIO_INPUT*/ init_broadcast_trapping(); } enable_broadcast_trapping(); /* no-op if !defined(MAIL) */ iflags.cbreak = (kb != 0) ? ON : OFF; iflags.echo = (kb != 0) ? OFF : ON; /* disable tab & form-feed expansion; prepare for broadcast trapping */ sg.sm.tt_char = tt_char_active; sg.sm.tt2_char = tt2_char_active; setctty(); start_screen(); settty_needed = TRUE; } void intron() /* enable kbd interupts if enabled when game started */ { intr_char = CTRL('C'); } void introff() /* disable kbd interrupts if required*/ { intr_char = 0; } #ifdef TIMED_DELAY extern unsigned long FDECL(lib$emul, (const long *,const long *,const long *,long *)); extern unsigned long sys$schdwk(), sys$hiber(); #define VMS_UNITS_PER_SECOND 10000000L /* hundreds of nanoseconds, 1e-7 */ /* constant for conversion from milliseconds to VMS delta time (negative) */ static const long mseconds_to_delta = VMS_UNITS_PER_SECOND / 1000L * -1L; /* sleep for specified number of milliseconds (note: the timer used generally only has 10-millisecond resolution at the hardware level...) */ void msleep(mseconds) unsigned mseconds; /* milliseconds */ { long pid = 0L, zero = 0L, msec, qtime[2]; msec = (long) mseconds; if (msec > 0 && /* qtime{0:63} = msec{0:31} * mseconds_to_delta{0:31} + zero{0:31} */ vms_ok(lib$emul(&msec, &mseconds_to_delta, &zero, qtime))) { /* schedule a wake-up call, then go to sleep */ if (vms_ok(sys$schdwk(&pid, (genericptr_t)0, qtime, (long *)0))) (void)sys$hiber(); } } #endif /* TIMED_DELAY */ /* fatal error */ /*VARARGS1*/ void error VA_DECL(const char *,s) VA_START(s); VA_INIT(s, const char *); if(settty_needed) settty((char *)0); Vprintf(s,VA_ARGS); (void) putchar('\n'); VA_END(); #ifndef SAVE_ON_FATAL_ERROR /* prevent vmsmain's exit handler byebye() from calling hangup() */ (void)signal(SIGHUP, SIG_DFL); #endif exit(EXIT_FAILURE); } slashem-0.0.7E7F3/sys/vms/Makefile.src0000664000076400007640000004407110545462317015533 0ustar aliali# NetHack Makefile (VMS) - for building nethack itself. # SCCS Id: @(#)Makefile.src 3.4 2003/02/13 # 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, # which will trigger an update of makedefs, which will in turn # result in a full build of just about _everything_. MAKE = $(MMS) CD = set default ECHO = write sys$output NOOP = continue RUN = mcr TOUCH = append/New _NLA0: # only one file per $(TOUCH) # source tree, relative to 'src' and 'util' INC = [-.include] SYSSHR = [-.sys.share] SRC = [-.src] TTY = [-.win.tty] UTL = [-.util] VMS = [-.sys.vms] WINSHR = [-.win.share] X11 = [-.win.X11] MAKEFILE= $(SRC)Makefile. # if you are using gcc as your compiler: # uncomment the CC definition below if it's not in your environment # CC = gcc # 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 # Specific VMS object files SYSSRC = $(VMS)vmsmain.c,$(VMS)vmstty.c,$(VMS)vmsunix.c,\ $(VMS)vmsmisc.c,$(VMS)vmsfiles.c,$(VMS)vmsmail.c SYSOBJ = vmsmain.obj,vmstty.obj,vmsunix.obj,vmsfiles.obj,vmsmail.obj #,vmsmisc.obj LIBOPT = $(SRC)crtl.opt; # termcap library TERMCAPSRC = tclib.c TERMCAPOBJ = ,tclib.obj # Set WINSRC and WINOBJ lines corresponding to your desired combination # of windowing systems. Also set windowing systems in config.h. # # a straight tty port using no native windowing system WINTTYSRC = $(TTY)getline.c $(TTY)termcap.c $(TTY)topl.c $(TTY)wintty.c \ $(TERMCAPSRC) WINTTYOBJ = getline.obj,termcap.obj,topl.obj,wintty.obj $(TERMCAPOBJ) # # an X11 port (not supported under DECwindows) WINX11SRC = $(X11)Window.c $(X11)dialogs.c $(X11)winX.c $(X11)winmap.c \ $(X11)winmenu.c $(X11)winmesg.c $(X11)winmisc.c $(X11)winstat.c \ $(X11)wintext.c $(X11)winval.c $(SRC)tile.c WINX11OBJ = Window.obj,dialogs.obj,winX.obj,winmap.obj,winmenu.obj,\ winmesg.obj,winmisc.obj,winstat.obj,wintext.obj,winval.obj,tile.obj # # WINSRC = $(WINTTYSRC) WINOBJ = $(WINTTYOBJ) # make NetHack for VMS SYSTEM = SysVMS.timestamp; GAME = $(SRC)nethack.exe; # RANDOM is defined in vmsconf.h RANDSRC = random.c RANDOBJ = random.obj # ---------------------------------------- # # Nothing below this line should have to be changed. # # Other things that have to be reconfigured are in vmsconf.h, # and config.h VERSION = 3.4.3 MAKEDEFS = $(UTL)makedefs.exe; # timestamp files to reduce `make' overhead and shorten .obj dependency lists CONFIG_H = $(SRC)config.h-t HACK_H = $(SRC)hack.h-t # all .c that are part of the main NetHack program and are not operating- or # windowing-system specific HACKCSRC = allmain.c alloc.c apply.c artifact.c attrib.c ball.c bones.c \ botl.c cmd.c dbridge.c decl.c detect.c dig.c display.c dlb.c do.c \ do_name.c do_wear.c dog.c dogmove.c dokick.c dothrow.c drawing.c \ dungeon.c eat.c end.c engrave.c exper.c explode.c extralev.c \ files.c fountain.c hack.c hacklib.c invent.c light.c lock.c mail.c \ makemon.c mapglyph.c mcastu.c mhitm.c mhitu.c minion.c mklev.c mkmap.c \ mkmaze.c mkobj.c mkroom.c mon.c mondata.c monmove.c monst.c \ mplayer.c mthrowu.c muse.c music.c o_init.c objects.c objnam.c \ options.c pager.c pickup.c pline.c polyself.c potion.c pray.c \ priest.c quest.c questpgr.c read.c rect.c region.c restore.c rip.c rnd.c \ role.c rumors.c save.c shk.c shknam.c sit.c sounds.c sp_lev.c spell.c \ steal.c steed.c teleport.c timeout.c topten.c track.c trap.c u_init.c \ uhitm.c vault.c version.c vision.c weapon.c were.c wield.c \ windows.c wizard.c worm.c worn.c write.c zap.c # generated source files (tile.c is handled separately via WINxxxSRC) GENCSRC = 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" # and dgn_comp.h, dgn_file.h, lev_comp.h, special level & dungeon files. # HACKINCL = align.h amiconf.h artifact.h artilist.h attrib.h beconf.h color.h \ config.h config1.h coord.h decl.h def_os2.h display.h dlb.h \ dungeon.h edog.h emin.h engrave.h epri.h eshk.h extern.h flag.h \ func_tab.h global.h hack.h lev.h macconf.h mfndpos.h micro.h \ mkroom.h monattk.h mondata.h monflag.h monst.h monsym.h obj.h \ objclass.h os2conf.h patchlevel.h pcconf.h permonst.h prop.h rect.h \ region.h rm.h sp_lev.h spell.h system.h tcap.h timeout.h tosconf.h \ tradstdc.h trampoli.h trap.h unixconf.h vault.h vision.h vmsconf.h \ wintty.h winX.h winprocs.h wintype.h you.h youprop.h #HSOURCES = $(HACKINCL) date.h onames.h pm.h vis_tab.h\ # lev_comp.h dgn_comp.h dgn_file.h # the following .obj's should be made before any others (for makedefs) FIRSTOBJ = vmsmisc.obj,monst.obj,objects.obj # split up long list so that we can write pieces of it into nethack.opt HOBJ1 = allmain.obj,alloc.obj,apply.obj,artifact.obj,attrib.obj, \ ball.obj,bones.obj,botl.obj,cmd.obj,dbridge.obj,decl.obj, \ detect.obj,dig.obj,display.obj,dlb.obj,do.obj,do_name.obj,do_wear.obj 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, \ rumors.obj,save.obj,shk.obj,shknam.obj,sit.obj,sounds.obj,sp_lev.obj, \ spell.obj,steal.obj,steed.obj,teleport.obj,timeout.obj,topten.obj, \ track.obj,trap.obj HOBJ6 = u_init.obj,uhitm.obj,vault.obj,vision.obj,vis_tab.obj,weapon.obj, \ were.obj,wield.obj,windows.obj,wizard.obj,worm.obj,worn.obj, \ write.obj,zap.obj,version.obj HOBJ = $(FIRSTOBJ) $(SYSOBJ) $(WINOBJ) $(RANDOBJ) \ $(HOBJ1) $(HOBJ2) $(HOBJ3) $(HOBJ4) $(HOBJ5) $(HOBJ6) # simpler target name nethack : $(GAME) @ $(ECHO) "nethack is up to date." $(GAME) : $(SYSTEM) @ $(NOOP) $(SYSTEM) : $(LIBOPT) $(HOBJ) nethack.opt @ $(ECHO) "Linking ..." $(LINK)/Exe=$(GAME) $(LFLAGS) nethack.opt/Opt,$(LIBOPT)/Opt $(TOUCH) $(SYSTEM) all : $(GAME) @ $(ECHO) "nethack is up to date." # linker options file for nethack's object modules nethack.opt : $(MAKEFILE) # this file open/Write f nethack.opt write f "! nethack.opt" @ write f f$edit("$(SYSOBJ)","COLLAPSE") @ write f f$edit("$(WINOBJ)","COLLAPSE") @ write f f$edit("$(RANDOBJ)","COLLAPSE") @ write f f$edit("$(FIRSTOBJ)","COLLAPSE") @ write f f$edit("$(HOBJ1)","COLLAPSE") @ write f f$edit("$(HOBJ2)","COLLAPSE") @ write f f$edit("$(HOBJ3)","COLLAPSE") @ write f f$edit("$(HOBJ4)","COLLAPSE") @ write f f$edit("$(HOBJ5)","COLLAPSE") @ write f f$edit("$(HOBJ6)","COLLAPSE") @ write f "iosegment=128" write f "identification=$(VERSION)" close f # linker options file for run-time libraries, also used by $(UTL)Makefile $(LIBOPT) : $(MAKEFILE) # this file open/Write f $(LIBOPT) write f "! crtl.opt" write f "$(LIBS)" write f "$(MORELIBS)" close f # simplified target name, for interactive convenience crtl.opt : $(LIBOPT) @ $(NOOP) # dependencies for makedefs and its outputs, which the util # Makefile is responsible for keeping up to date # # special rules, to force update of makedefs, real dependencies should be # below in the 'make depend' output. monst.obj : $(CC) $(CFLAGS) monst.c @- if f$search("$(MAKEDEFS)").nes."" then delete $(MAKEDEFS) objects.obj : $(CC) $(CFLAGS) objects.c @- if f$search("$(MAKEDEFS)").nes."" then delete $(MAKEDEFS) $(MAKEDEFS) : $(FIRSTOBJ) $(UTL)makedefs.c \ $(CONFIG_H) $(INC)permonst.h $(INC)objclass.h \ $(INC)monsym.h $(INC)artilist.h $(INC)dungeon.h \ $(INC)obj.h $(INC)monst.h $(INC)you.h $(INC)flag.h \ $(INC)dlb.h $(INC)patchlevel.h $(INC)qtext.h $(LIBOPT) $(CD) $(UTL) $(MAKE)$(MAKEFLAGS) $(MAKEDEFS) @ $(CD) $(SRC) $(INC)onames.h : $(MAKEDEFS) $(CD) $(UTL) $(MAKE)$(MAKEFLAGS) $(INC)onames.h @ $(CD) $(SRC) $(INC)pm.h : $(MAKEDEFS) $(CD) $(UTL) $(MAKE)$(MAKEFLAGS) $(INC)pm.h @ $(CD) $(SRC) monstr.c : $(MAKEDEFS) $(CD) $(UTL) $(MAKE)$(MAKEFLAGS) $(SRC)monstr.c @ $(CD) $(SRC) # both vis_tab.h and vis_tab.c are made at the same time by makedefs $(INC)vis_tab.h : vis_tab.c $(TOUCH) $(INC)vis_tab.h vis_tab.c : $(MAKEDEFS) $(CD) $(UTL) $(MAKE)$(MAKEFLAGS) $(SRC)vis_tab.c @ $(CD) $(SRC) $(SRC)tile.c : $(WINSHR)tilemap.c $(HACK_H) $(CD) $(UTL) $(MAKE)$(MAKEFLAGS) $(SRC)tile.c @ $(CD) $(SRC) # 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. # # hack.h depends on makedefs' output, so we know makedefs will be # up to date before being executed; kill old date.h to force update $(INC)date.h : $(VERSOURCES) $(HACK_H) @- if f$search("$(INC)date.h").nes."" then delete $(INC)date.h;* $(CD) $(UTL) $(MAKE)$(MAKEFLAGS) $(INC)date.h @ $(CD) $(SRC) # special targets clean : - if f$search("*.*;-1") .nes."" then purge - if f$search("$(INC)*.*;-1").nes."" then purge $(INC) /Exclude=*conf*.h - if f$search("*.obj") .nes."" then delete *.obj; - if f$search("*.h-t").nes."" then delete *.h-t; !$(HACK_H),$(CONFIG_H) - if f$search("*.opt").nes."" then delete *.opt; !nethack.opt,$(LIBOPT) spotless : clean - if f$search("$(LIBOPT)").nes."" then delete $(LIBOPT) - if f$search("$(SYSTEM)").nes."" then delete $(SYSTEM) - if f$search("$(GAME)") .nes."" then delete $(GAME) - delete monstr.c;,vis_tab.c;,$(INC)vis_tab.h;,\ $(INC)pm.h;,$(INC)onames.h;,$(INC)date.h; - if f$search("tile.c") .nes."" then delete tile.c; - if f$search("tclib.c") .nes."" then delete tclib.c; - if f$search("random.c") .nes."" then delete random.c; - if f$search("nethack.olb").nes."" then delete nethack.olb; # dependencies (mostly cloned from sys/unix/Makefile.src) # config.h timestamp $(CONFIG_H) : $(INC)config.h $(INC)config1.h $(INC)tradstdc.h $(INC)global.h \ $(INC)coord.h $(INC)vmsconf.h $(INC)system.h \ $(INC)unixconf.h $(INC)os2conf.h $(INC)micro.h \ $(INC)pcconf.h $(INC)tosconf.h $(INC)amiconf.h \ $(INC)macconf.h $(INC)beconf.h $(INC)wceconf.h \ $(INC)ntconf.h $(INC)nhlan.h $(TOUCH) $(CONFIG_H) # hack.h timestamp $(HACK_H) : $(INC)hack.h $(CONFIG_H) $(INC)align.h \ $(INC)dungeon.h $(INC)monsym.h $(INC)mkroom.h \ $(INC)objclass.h $(INC)youprop.h $(INC)prop.h \ $(INC)permonst.h $(INC)monattk.h \ $(INC)monflag.h $(INC)mondata.h $(INC)pm.h \ $(INC)wintype.h $(INC)decl.h $(INC)quest.h \ $(INC)spell.h $(INC)color.h $(INC)obj.h \ $(INC)you.h $(INC)attrib.h $(INC)monst.h $(INC)skills.h \ $(INC)onames.h $(INC)timeout.h $(INC)trap.h \ $(INC)flag.h $(INC)rm.h $(INC)vision.h \ $(INC)display.h $(INC)engrave.h $(INC)rect.h $(INC)region.h \ $(INC)winprocs.h $(INC)wintty.h $(INC)trampoli.h $(TOUCH) $(HACK_H) # 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 \ $(INC)wintype.h $(INC)winprocs.h # conditionally used code -- VMS always wants these random.obj : random.c $(HACK_H) random.c : $(SYSSHR)random.c copy $(SYSSHR)random.c random.c tclib.obj : tclib.c $(CONFIG_H) tclib.c : $(SYSSHR)tclib.c copy $(SYSSHR)tclib.c tclib.c # user interface code -- VMS uses tty (1st 4) only getline.obj : $(TTY)getline.c $(HACK_H) $(INC)func_tab.h termcap.obj : $(TTY)termcap.c $(HACK_H) $(INC)tcap.h topl.obj : $(TTY)topl.c $(HACK_H) $(INC)tcap.h wintty.obj : $(TTY)wintty.c $(HACK_H) $(INC)dlb.h \ $(INC)patchlevel.h $(INC)tcap.h Window.obj : $(X11)Window.c $(INC)xwindowp.h $(INC)xwindow.h $(CONFIG_H) dialogs.obj : $(X11)dialogs.c $(CONFIG_H) winX.obj : $(X11)winX.c $(HACK_H) $(INC)winX.h $(INC)dlb.h \ $(INC)patchlevel.h $(X11)nh72icon $(X11)nh56icon $(X11)nh32icon winmap.obj : $(X11)winmap.c $(INC)xwindow.h $(HACK_H) $(INC)dlb.h \ $(INC)winX.h $(INC)tile2x11.h winmenu.obj : $(X11)winmenu.c $(HACK_H) $(INC)winX.h winmesg.obj : $(X11)winmesg.c $(INC)xwindow.h $(HACK_H) $(INC)winX.h winmisc.obj : $(X11)winmisc.c $(HACK_H) $(INC)func_tab.h $(INC)winX.h winstat.obj : $(X11)winstat.c $(HACK_H) $(INC)winX.h wintext.obj : $(X11)wintext.c $(HACK_H) $(INC)winX.h $(INC)xwindow.h winval.obj : $(X11)winval.c $(HACK_H) $(INC)winX.h tile.obj : $(SRC)tile.c $(HACK_H) 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) apply.obj : apply.c $(HACK_H) $(INC)edog.h artifact.obj : artifact.c $(HACK_H) $(INC)artifact.h $(INC)artilist.h attrib.obj : attrib.c $(HACK_H) ball.obj : ball.c $(HACK_H) bones.obj : bones.c $(HACK_H) $(INC)lev.h botl.obj : botl.c $(HACK_H) cmd.obj : cmd.c $(HACK_H) $(INC)func_tab.h dbridge.obj : dbridge.c $(HACK_H) decl.obj : decl.c $(HACK_H) detect.obj : detect.c $(HACK_H) $(INC)artifact.h dig.obj : dig.c $(HACK_H) $(INC)edog.h display.obj : display.c $(HACK_H) dlb.obj : dlb.c $(CONFIG_H) $(INC)dlb.h do.obj : do.c $(HACK_H) $(INC)lev.h do_name.obj : do_name.c $(HACK_H) do_wear.obj : do_wear.c $(HACK_H) dog.obj : dog.c $(HACK_H) $(INC)edog.h dogmove.obj : dogmove.c $(HACK_H) $(INC)mfndpos.h $(INC)edog.h dokick.obj : dokick.c $(HACK_H) $(INC)eshk.h dothrow.obj : dothrow.c $(HACK_H) $(INC)edog.h drawing.obj : drawing.c $(HACK_H) $(INC)tcap.h dungeon.obj : dungeon.c $(HACK_H) $(INC)dgn_file.h $(INC)dlb.h eat.obj : eat.c $(HACK_H) end.obj : end.c $(HACK_H) $(INC)eshk.h $(INC)dlb.h engrave.obj : engrave.c $(HACK_H) $(INC)lev.h exper.obj : exper.c $(HACK_H) explode.obj : explode.c $(HACK_H) extralev.obj : extralev.c $(HACK_H) files.obj : files.c $(HACK_H) $(INC)dlb.h fountain.obj : fountain.c $(HACK_H) hack.obj : hack.c $(HACK_H) hacklib.obj : hacklib.c $(HACK_H) invent.obj : invent.c $(HACK_H) light.obj : light.c $(HACK_H) $(INC)lev.h 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 minion.obj : minion.c $(HACK_H) $(INC)emin.h $(INC)epri.h mklev.obj : mklev.c $(HACK_H) mkmap.obj : mkmap.c $(HACK_H) $(INC)sp_lev.h mkmaze.obj : mkmaze.c $(HACK_H) $(INC)sp_lev.h $(INC)lev.h mkobj.obj : mkobj.c $(HACK_H) mkroom.obj : mkroom.c $(HACK_H) mon.obj : mon.c $(HACK_H) $(INC)mfndpos.h $(INC)edog.h mondata.obj : mondata.c $(HACK_H) $(INC)eshk.h $(INC)epri.h monmove.obj : monmove.c $(HACK_H) $(INC)mfndpos.h $(INC)artifact.h \ $(INC)epri.h monst.obj : monst.c $(CONFIG_H) $(INC)permonst.h $(INC)align.h \ $(INC)monattk.h $(INC)monflag.h $(INC)monsym.h \ $(INC)dungeon.h $(INC)eshk.h $(INC)vault.h \ $(INC)epri.h $(INC)color.h mplayer.obj : mplayer.c $(HACK_H) mthrowu.obj : mthrowu.c $(HACK_H) muse.obj : muse.c $(HACK_H) $(INC)edog.h music.obj : music.c $(HACK_H) #interp.c o_init.obj : o_init.c $(HACK_H) $(INC)lev.h objects.obj : objects.c $(CONFIG_H) $(INC)obj.h $(INC)objclass.h \ $(INC)prop.h $(INC)skills.h $(INC)color.h objnam.obj : objnam.c $(HACK_H) options.obj : options.c $(CONFIG_H) $(INC)objclass.h $(INC)flag.h \ $(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 priest.obj : priest.c $(HACK_H) $(INC)mfndpos.h $(INC)eshk.h \ $(INC)epri.h $(INC)emin.h quest.obj : quest.c $(HACK_H) $(INC)qtext.h 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) role.obj : role.c $(HACK_H) rumors.obj : rumors.c $(HACK_H) $(INC)lev.h $(INC)dlb.h save.obj : save.c $(HACK_H) $(INC)lev.h shk.obj : shk.c $(HACK_H) $(INC)eshk.h shknam.obj : shknam.c $(HACK_H) $(INC)eshk.h sit.obj : sit.c $(HACK_H) $(INC)artifact.h sounds.obj : sounds.c $(HACK_H) $(INC)edog.h sp_lev.obj : sp_lev.c $(HACK_H) $(INC)dlb.h $(INC)sp_lev.h spell.obj : spell.c $(HACK_H) steal.obj : steal.c $(HACK_H) steed.obj : steed.c $(HACK_H) teleport.obj : teleport.c $(HACK_H) timeout.obj : timeout.c $(HACK_H) $(INC)lev.h topten.obj : topten.c $(HACK_H) $(INC)dlb.h $(INC)patchlevel.h track.obj : track.c $(HACK_H) trap.obj : trap.c $(HACK_H) u_init.obj : u_init.c $(HACK_H) uhitm.obj : uhitm.c $(HACK_H) vault.obj : vault.c $(HACK_H) $(INC)vault.h version.obj : version.c $(HACK_H) $(INC)date.h $(INC)patchlevel.h vision.obj : vision.c $(HACK_H) $(INC)vis_tab.h weapon.obj : weapon.c $(HACK_H) were.obj : were.c $(HACK_H) wield.obj : wield.c $(HACK_H) windows.obj : windows.c $(HACK_H) $(INC)wingem.h $(INC)winGnome.h wizard.obj : wizard.c $(HACK_H) $(INC)qtext.h $(INC)epri.h worm.obj : worm.c $(HACK_H) $(INC)lev.h worn.obj : worn.c $(HACK_H) write.obj : write.c $(HACK_H) zap.obj : zap.c $(HACK_H) # eof slashem-0.0.7E7F3/sys/vms/vmsmain.c0000664000076400007640000002572010545462317015123 0ustar aliali/* SCCS Id: @(#)vmsmain.c 3.4 2003/10/16 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ /* main.c - VMS NetHack */ #include "hack.h" #include "dlb.h" #include static void NDECL(whoami); static void FDECL(process_options, (int, char **)); static void NDECL(byebye); #ifndef SAVE_ON_FATAL_ERROR # ifndef __DECC # define vms_handler_type int # else # define vms_handler_type unsigned int # endif extern void FDECL(VAXC$ESTABLISH, (vms_handler_type (*)(genericptr_t,genericptr_t))); static vms_handler_type FDECL(vms_handler, (genericptr_t,genericptr_t)); #include /* system service status codes */ #endif static void NDECL(wd_message); #ifdef WIZARD static boolean wiz_error_flag = FALSE; #endif int main(argc,argv) int argc; char *argv[]; { register int fd; #ifdef CHDIR register char *dir; #endif #ifdef SECURE /* this should be the very first code executed */ privoff(); fflush((FILE *)0); /* force stdio to init itself */ privon(); #endif atexit(byebye); hname = argv[0]; hname = vms_basename(hname); /* name used in 'usage' type messages */ hackpid = getpid(); (void) umask(0); choose_windows(DEFAULT_WINDOW_SYS); #ifdef CHDIR /* otherwise no chdir() */ /* * See if we must change directory to the playground. * (Perhaps hack is installed with privs and playground is * inaccessible for the player.) * The logical name HACKDIR is overridden by a * -d command line option (must be the first option given) */ dir = nh_getenv("NETHACKDIR"); if (!dir) dir = nh_getenv("HACKDIR"); #endif if(argc > 1) { #ifdef CHDIR if (!strncmp(argv[1], "-d", 2) && argv[1][2] != 'e') { /* avoid matching "-dec" for DECgraphics; since the man page * says -d directory, hope nobody's using -desomething_else */ argc--; argv++; dir = argv[0]+2; if(*dir == '=' || *dir == ':') dir++; if(!*dir && argc > 1) { argc--; argv++; dir = argv[0]; } if(!*dir) error("Flag -d must be followed by a directory name."); } if (argc > 1) #endif /* CHDIR */ /* * Now we know the directory containing 'record' and * may do a prscore(). */ if (!strncmp(argv[1], "-s", 2)) { #ifdef CHDIR chdirx(dir, FALSE); #endif prscore(argc, argv); exit(EXIT_SUCCESS); } } #ifdef CHDIR /* move to the playground directory; 'termcap' might be found there */ chdirx(dir, TRUE); #endif #ifdef SECURE /* disable installed privs while loading nethack.cnf and termcap, and also while initializing terminal [$assign("TT:")]. */ privoff(); #endif initoptions(); init_nhwindows(&argc, argv); whoami(); #ifdef SECURE privon(); #endif /* * It seems you really want to play. */ u.uhp = 1; /* prevent RIP on early quits */ #ifndef SAVE_ON_FATAL_ERROR /* used to clear hangup stuff while still giving standard traceback */ VAXC$ESTABLISH(vms_handler); #endif (void) signal(SIGHUP, (SIG_RET_TYPE) hangup); process_options(argc, argv); /* command line options */ #ifdef WIZARD if (wizard) Strcpy(plname, "wizard"); else #endif if (!*plname || !strncmpi(plname, "games", 4) || !strcmpi(plname, "nethack")) askname(); plnamesuffix(); /* strip suffix from name; calls askname() */ /* again if suffix was whole name */ /* accepts any suffix */ #ifdef WIZARD if(!wizard) { #endif /* * check for multiple games under the same name * (if !locknum) or check max nr of players (otherwise) */ (void) signal(SIGQUIT,SIG_IGN); (void) signal(SIGINT,SIG_IGN); if(!locknum) Sprintf(lock, "_%u%s", (unsigned)getuid(), plname); getlock(); #ifdef WIZARD } else { Sprintf(lock, "_%u%s", (unsigned)getuid(), plname); getlock(); } #endif /* WIZARD */ dlb_init(); /* must be before newgame() */ /* * Initialization of the boundaries of the mazes * Both boundaries have to be even. */ x_maze_max = COLNO-1; if (x_maze_max % 2) x_maze_max--; y_maze_max = ROWNO-1; if (y_maze_max % 2) y_maze_max--; /* * Initialize the vision system. This must be before mklev() on a * new game or before a level restore on a saved game. */ vision_init(); display_gamewindows(); if ((fd = restore_saved_game()) >= 0) { #ifdef WIZARD /* Since wizard is actually flags.debug, restoring might * overwrite it. */ boolean remember_wiz_mode = wizard; #endif const char *fq_save = fqname(SAVEF, SAVEPREFIX, 1); (void) chmod(fq_save,0); /* disallow parallel restores */ (void) signal(SIGINT, (SIG_RET_TYPE) done1); #ifdef NEWS if(iflags.news) { display_file_area(NEWS_AREA, NEWS, FALSE); iflags.news = FALSE; /* in case dorecover() fails */ } #endif pline("Restoring save file..."); mark_synch(); /* flush output */ if(!dorecover(fd)) goto not_recovered; #ifdef WIZARD if(!wizard && remember_wiz_mode) wizard = TRUE; #endif check_special_room(FALSE); wd_message(); if (discover || wizard) { if (yn("Do you want to keep the save file?") == 'n') (void) delete_savefile(); else (void) chmod(fq_save,FCMASK); /* back to readable */ } flags.move = 0; } else { not_recovered: player_selection(); newgame(); wd_message(); flags.move = 0; set_wear(); (void) pickup(1); } moveloop(); exit(EXIT_SUCCESS); /*NOTREACHED*/ return(0); } static void process_options(argc, argv) int argc; char *argv[]; { int i; /* * Process options. */ while(argc > 1 && argv[1][0] == '-'){ argv++; argc--; switch(argv[0][1]){ case 'D': case 'Z': #ifdef WIZARD if(!strcmpi(nh_getenv("USER"), WIZARD_NAME)) { wizard = TRUE; break; } /* otherwise fall thru to discover */ wiz_error_flag = TRUE; #endif /* WIZARD */ case 'X': case 'x': discover = TRUE; break; #ifdef NEWS case 'n': iflags.news = FALSE; break; #endif case 'u': if(argv[0][2]) (void) strncpy(plname, argv[0]+2, sizeof(plname)-1); else if(argc > 1) { argc--; argv++; (void) strncpy(plname, argv[0], sizeof(plname)-1); } else raw_print("Player name expected after -u"); break; case 'I': case 'i': if (!strncmpi(argv[0]+1, "IBM", 3)) switch_graphics(IBM_GRAPHICS); break; /* case 'D': */ case 'd': if (!strncmpi(argv[0]+1, "DEC", 3)) switch_graphics(DEC_GRAPHICS); break; case 'p': /* profession (role) */ if (argv[0][2]) { if ((i = str2role(&argv[0][2])) >= 0) flags.initrole = i; } else if (argc > 1) { argc--; argv++; if ((i = str2role(argv[0])) >= 0) flags.initrole = i; } break; case 'r': /* race */ if (argv[0][2]) { if ((i = str2race(&argv[0][2])) >= 0) flags.initrace = i; } else if (argc > 1) { argc--; argv++; if ((i = str2race(argv[0])) >= 0) flags.initrace = i; } break; case 'g': /* gender */ 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 'a': /* alignment */ 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 '@': flags.randomall = 1; break; default: if ((i = str2role(&argv[0][1])) >= 0) { flags.initrole = i; break; } /* else raw_printf("Unknown option: %s", *argv); */ } } if(argc > 1) locknum = atoi(argv[1]); #ifdef MAX_NR_OF_PLAYERS if(!locknum || locknum > MAX_NR_OF_PLAYERS) locknum = MAX_NR_OF_PLAYERS; #endif } #ifdef CHDIR void chdirx(dir, wr) const char *dir; boolean wr; { # ifndef HACKDIR static const char *defdir = "."; # else static const char *defdir = HACKDIR; if(dir == (const char *)0) dir = defdir; else if (wr && !same_dir(HACKDIR, dir)) /* If we're playing anywhere other than HACKDIR, turn off any privs we may have been installed with. */ privoff(); # endif if(dir && chdir(dir) < 0) { perror(dir); error("Cannot chdir to %s.", dir); } /* warn the player if we can't write the record file */ if (wr) check_recordfile(dir); defdir = dir; } #endif /* CHDIR */ static void whoami() { /* * Who am i? Algorithm: 1. Use name as specified in NETHACKOPTIONS * 2. Use lowercase of $USER (if 1. fails) * The resulting name is overridden by command line options. * If everything fails, or if the resulting name is some generic * account like "games" then eventually we'll ask him. * Note that we trust the user here; it is possible to play under * somebody else's name. */ register char *s; if (!*plname && (s = nh_getenv("USER"))) (void) lcase(strncpy(plname, s, sizeof(plname)-1)); } static void byebye() { /* Different versions of both VAX C and GNU C use different return types for signal functions. Return type 'int' along with the explicit casts below satisfy the most combinations of compiler vs . */ int (*hup)(); #ifdef SHELL extern unsigned long dosh_pid, mail_pid; extern unsigned long FDECL(sys$delprc,(unsigned long *,const genericptr_t)); /* clean up any subprocess we've spawned that may still be hanging around */ if (dosh_pid) (void) sys$delprc(&dosh_pid, 0), dosh_pid = 0; if (mail_pid) (void) sys$delprc(&mail_pid, 0), mail_pid = 0; #endif /* SIGHUP doesn't seem to do anything on VMS, so we fudge it here... */ hup = (int(*)()) signal(SIGHUP, SIG_IGN); if (!program_state.exiting++ && hup != (int(*)()) SIG_DFL && hup != (int(*)()) SIG_IGN) (void) (*hup)(); #ifdef CHDIR (void) chdir(getenv("PATH")); #endif } #ifndef SAVE_ON_FATAL_ERROR /* Condition handler to prevent byebye's hangup simulation from saving the game after a fatal error has occurred. */ /*ARGSUSED*/ static vms_handler_type /* should be `unsigned long', but the -*/ vms_handler(sigargs, mechargs) /*+ prototype in is screwed */ genericptr_t sigargs, mechargs; /* [0] is argc, [1..argc] are the real args */ { unsigned long condition = ((unsigned long *)sigargs)[1]; if (condition == SS$_ACCVIO /* access violation */ || (condition >= SS$_ASTFLT && condition <= SS$_TBIT) || (condition >= SS$_ARTRES && condition <= SS$_INHCHME)) { program_state.done_hup = TRUE; /* pretend hangup has been attempted */ # if defined(WIZARD) && !defined(BETA) if (wizard) # endif /*WIZARD && !BETA*/ # if defined(WIZARD) || defined(BETA) abort(); /* enter the debugger */ # endif /*WIZARD || BETA*/ } return SS$_RESIGNAL; } #endif #ifdef PORT_HELP void port_help() { /* * Display VMS-specific help. Just show contents of the helpfile * named by PORT_HELP. */ display_file_area(FILE_AREA_SHARE, PORT_HELP, TRUE); } #endif /* PORT_HELP */ static void wd_message() { #ifdef WIZARD if (wiz_error_flag) { pline("Only user \"%s\" may access debug (wizard) mode.", WIZARD_NAME); pline("Entering discovery mode instead."); } else #endif if (discover) You("are in non-scoring discovery mode."); } /*vmsmain.c*/ slashem-0.0.7E7F3/sys/vms/vmsmisc.c0000664000076400007640000000100510545462317015120 0ustar aliali/* SCCS Id: @(#)vmsmisc.c 3.4 1996/03/02 */ /* NetHack may be freely redistributed. See license for details. */ #include #include void vms_exit( /*_ int _*/ ); void vms_abort( /*_ void _*/ ); extern void exit( /*_ int _*/ ); extern void lib$signal( /*_ unsigned long,... _*/ ); void vms_exit(status) int status; { exit(status ? (SS$_ABORT | STS$M_INHIB_MSG) : SS$_NORMAL); } void vms_abort() { lib$signal(SS$_DEBUG); } #ifdef VERYOLD_VMS #include "oldcrtl.c" #endif /*vmsmisc.c*/ slashem-0.0.7E7F3/sys/vms/vmsunix.c0000664000076400007640000003203710545462317015161 0ustar aliali/* 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 #include #include #include #include #undef off_t #ifdef GNUC #include #else # define umask hide_umask_dummy /* DEC C: avoid conflict with system.h */ #include # undef umask #endif #include extern unsigned long sys$setprv(); extern unsigned long lib$getdvi(), lib$getjpi(), lib$spawn(), lib$attach(); extern unsigned long smg$init_term_table_by_type(), smg$del_term_table(); #define vms_ok(sts) ((sts) & 1) /* odd => success */ 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 static int veryold(fd) int fd; { register int i; time_t date; struct stat buf; if(fstat(fd, &buf)) return(0); /* cannot get status */ #ifndef INSURANCE if(buf.st_size != sizeof(int)) return(0); /* not an xlock file */ #endif (void) time(&date); if(date - buf.st_mtime < 3L*24L*60L*60L) { /* recent */ int lockedpid; /* should be the same size as hackpid */ unsigned long status, dummy, code = JPI$_PID; if (read(fd, (genericptr_t)&lockedpid, sizeof(lockedpid)) != sizeof(lockedpid)) /* strange ... */ return 0; status = lib$getjpi(&code, &lockedpid, 0, &dummy); if (vms_ok(status) || status != SS$_NONEXPR) return 0; } (void) close(fd); /* cannot use maxledgerno() here, because we need to find a lock name * before starting everything (including the dungeon initialization * that sets astral_level, needed for maxledgerno()) up */ for(i = 1; i <= MAXDUNGEON*MAXLEVEL + 1; i++) { /* try to remove all */ set_levelfile_name(lock, i); (void) delete(lock); } set_levelfile_name(lock, 0); if(delete(lock)) return(0); /* cannot remove it */ return(1); /* success! */ } void getlock() { register int i = 0, fd; /* idea from rpick%ucqais@uccba.uc.edu * prevent automated rerolling of characters * test input (fd0) so that tee'ing output to get a screen dump still * works * also incidentally prevents development of any hack-o-matic programs */ if (isatty(0) <= 0) error("You must play from a terminal."); /* we ignore QUIT and INT at this point */ if (!lock_file(HLOCK, LOCKPREFIX, 10)) { wait_synch(); error("Quitting."); } regularize(lock); set_levelfile_name(lock, 0); if(locknum > 25) locknum = 25; do { if(locknum) lock[0] = 'a' + i++; if((fd = open(lock, 0, 0)) == -1) { if(errno == ENOENT) goto gotlock; /* no such file */ perror(lock); unlock_file(HLOCK); error("Cannot open %s", lock); } if(veryold(fd)) /* if true, this closes fd and unlinks lock */ goto gotlock; (void) close(fd); } while(i < locknum); unlock_file(HLOCK); error(locknum ? "Too many hacks running now." : "There is a game in progress under your name."); gotlock: fd = creat(lock, FCMASK); unlock_file(HLOCK); if(fd == -1) { error("cannot creat lock file."); } else { if(write(fd, (char *) &hackpid, sizeof(hackpid)) != sizeof(hackpid)){ error("cannot write lock"); } if(close(fd) == -1) { error("cannot close lock"); } } } void regularize(s) /* normalize file name */ register char *s; { register char *lp; for (lp = s; *lp; lp++) /* note: '-' becomes '_' */ if (!(isalpha(*lp) || isdigit(*lp) || *lp == '$')) *lp = '_'; } #undef getuid int vms_getuid() { return (getgid() << 16) | getuid(); } #ifndef FAB$C_STMLF #define FAB$C_STMLF 5 #endif /* check whether the open file specified by `fd' is in stream-lf format */ boolean file_is_stmlf(fd) int fd; { int rfm; struct stat buf; if (fstat(fd, &buf)) return FALSE; /* cannot get status? */ #ifdef stat_alignment_fix /* gcc-vms alignment kludge */ rfm = stat_alignment_fix(&buf)->st_fab_rfm; #else rfm = buf.st_fab_rfm; #endif return rfm == FAB$C_STMLF; } /*------*/ #ifndef LNM$_STRING #include /* logical name definitions */ #endif #define ENVSIZ LNM$C_NAMLENGTH /*255*/ #define ENV_USR 0 /* user-mode */ #define ENV_SUP 1 /* supervisor-mode */ #define ENV_JOB 2 /* job-wide entry */ /* vms_define() - assign a value to a logical name */ int vms_define(name, value, flag) const char *name; const char *value; int flag; { struct dsc { unsigned short len, mbz; const char *adr; }; /* descriptor */ struct itm3 { short buflen, itmcode; const char *bufadr; short *retlen; }; static struct itm3 itm_lst[] = { {0,LNM$_STRING,0,0}, {0,0} }; struct dsc nam_dsc, val_dsc, tbl_dsc; unsigned long result, sys$crelnm(), lib$set_logical(); /* set up string descriptors */ nam_dsc.mbz = val_dsc.mbz = tbl_dsc.mbz = 0; nam_dsc.len = strlen( nam_dsc.adr = name ); val_dsc.len = strlen( val_dsc.adr = value ); tbl_dsc.len = strlen( tbl_dsc.adr = "LNM$PROCESS" ); switch (flag) { case ENV_JOB: /* job logical name */ tbl_dsc.len = strlen( tbl_dsc.adr = "LNM$JOB" ); /*FALLTHRU*/ case ENV_SUP: /* supervisor-mode process logical name */ result = lib$set_logical(&nam_dsc, &val_dsc, &tbl_dsc); break; case ENV_USR: /* user-mode process logical name */ itm_lst[0].buflen = val_dsc.len; itm_lst[0].bufadr = val_dsc.adr; result = sys$crelnm(0, &tbl_dsc, &nam_dsc, 0, itm_lst); break; default: /*[ bad input ]*/ result = 0; break; } result &= 1; /* odd => success (== 1), even => failure (== 0) */ return !result; /* 0 == success, 1 == failure */ } /* vms_putenv() - create or modify an environment value */ int vms_putenv(string) const char *string; { char name[ENVSIZ+1], value[ENVSIZ+1], *p; /* [255+1] */ p = strchr(string, '='); if (p > string && p < string + sizeof name && strlen(p+1) < sizeof value) { (void)strncpy(name, string, p - string), name[p - string] = '\0'; (void)strcpy(value, p+1); return vms_define(name, value, ENV_USR); } else return 1; /* failure */ } /* Support for VT420 was added to VMS in version V5.4, but as of V5.5-2 VAXCRTL still doesn't handle it and puts TERM=undefined into the environ[] array. getenv("TERM") will return "undefined" instead of something sensible. Even though that's finally fixed in V6.0, site defined terminals also return "undefined" so query SMG's TERMTABLE instead of just checking VMS's device-type value for VT400_Series. Called by verify_termcap() for convenience. */ static char *verify_term() { char *term = getenv("NETHACK_TERM"); if (!term) term = getenv("HACK_TERM"); if (!term) term = getenv("EMACS_TERM"); if (!term) term = getenv("TERM"); if (!term || !*term || !strcmpi(term, "undefined") || !strcmpi(term, "unknown")) { static char smgdevtyp[31+1]; /* size is somewhat arbitrary */ static char dev_tty[] = "TT:"; static $DESCRIPTOR(smgdsc, smgdevtyp); static $DESCRIPTOR(tt, dev_tty); unsigned short dvicode = DVI$_DEVTYPE; unsigned long devtype = 0L, termtab = 0L; (void)lib$getdvi(&dvicode, (unsigned short *)0, &tt, &devtype, (genericptr_t)0, (unsigned short *)0); if (devtype && vms_ok(smg$init_term_table_by_type(&devtype, &termtab, &smgdsc))) { register char *p = &smgdevtyp[smgdsc.dsc$w_length]; /* strip trailing blanks */ while (p > smgdevtyp && *--p == ' ') *p = '\0'; /* (void)smg$del_term_table(); */ term = smgdevtyp; } } return term; } /* Figure out whether the termcap code will find a termcap file; if not, try to help it out. This avoids modifying the GNU termcap sources and can simplify configuration for sites which don't already use termcap. */ #define GNU_DEFAULT_TERMCAP "emacs_library:[etc]termcap.dat" #define NETHACK_DEF_TERMCAP "nethackdir:termcap" #define HACK_DEF_TERMCAP "hackdir:termcap" char * verify_termcap() /* called from startup(src/termcap.c) */ { struct stat dummy; const char *tc = getenv("TERMCAP"); if (tc) return verify_term(); /* no termcap fixups needed */ if (!tc && !stat(NETHACK_DEF_TERMCAP, &dummy)) tc = NETHACK_DEF_TERMCAP; if (!tc && !stat(HACK_DEF_TERMCAP, &dummy)) tc = HACK_DEF_TERMCAP; if (!tc && !stat(GNU_DEFAULT_TERMCAP, &dummy)) tc = GNU_DEFAULT_TERMCAP; if (!tc && !stat("[]termcap", &dummy)) tc = "[]termcap"; /* current dir */ if (!tc && !stat("$TERMCAP", &dummy)) tc = "$TERMCAP"; /* alt environ */ if (tc) { /* putenv(strcat(strcpy(buffer,"TERMCAP="),tc)); */ vms_define("TERMCAP", tc, ENV_USR); } else { /* perhaps someday we'll construct a termcap entry string */ } return verify_term(); } /*------*/ #ifdef SHELL # ifndef CLI$M_NOWAIT # define CLI$M_NOWAIT 1 # endif #endif #if defined(CHDIR) || defined(SHELL) || defined(SECURE) static unsigned long oprv[2]; void privoff() { unsigned long pid = 0, prv[2] = { ~0, ~0 }; unsigned short code = JPI$_PROCPRIV; (void) sys$setprv(0, prv, 0, oprv); (void) lib$getjpi(&code, &pid, (genericptr_t)0, prv); (void) sys$setprv(1, prv, 0, (unsigned long *)0); } void privon() { (void) sys$setprv(1, oprv, 0, (unsigned long *)0); } #endif /* CHDIR || SHELL || SECURE */ #if defined(SHELL) || defined(SUSPEND) static void hack_escape(screen_manip, msg_str) boolean screen_manip; const char *msg_str; { if (screen_manip) suspend_nhwindows(msg_str); /* clear screen, reset terminal, &c */ (void) signal(SIGQUIT,SIG_IGN); /* ignore ^Y */ (void) signal(SIGINT,SIG_DFL); /* don't trap ^C (implct cnvrs to ^Y) */ } static void hack_resume(screen_manip) boolean screen_manip; { (void) signal(SIGINT, (SIG_RET_TYPE) done1); # ifdef WIZARD if (wizard) (void) signal(SIGQUIT,SIG_DFL); # endif if (screen_manip) resume_nhwindows(); /* setup terminal modes, redraw screen, &c */ } #endif /* SHELL || SUSPEND */ #ifdef SHELL unsigned long dosh_pid = 0, /* this should cover any interactive escape */ mail_pid = 0; /* this only covers the last mail or phone; */ /*(mail & phone commands aren't expected to leave any process hanging around)*/ int dosh() { return vms_doshell("", TRUE); /* call for interactive child process */ } /* vms_doshell -- called by dosh() and readmail() */ /* If execstring is not a null string, then it will be executed in a spawned */ /* subprocess, which will then return. It is for handling mail or phone */ /* interactive commands, which are only available if both MAIL and SHELL are */ /* #defined, but we don't bother making the support code conditionalized on */ /* MAIL here, just on SHELL being enabled. */ /* Normally, all output from this interaction will be 'piped' to the user's */ /* screen (SYS$OUTPUT). However, if 'screenoutput' is set to FALSE, output */ /* will be piped into oblivion. Used for silent phone call rejection. */ int vms_doshell(execstring, screenoutput) const char *execstring; boolean screenoutput; { unsigned long status, new_pid, spawnflags = 0; struct dsc$descriptor_s comstring, *command, *inoutfile = 0; static char dev_null[] = "_NLA0:"; static $DESCRIPTOR(nulldevice, dev_null); /* Is this an interactive shell spawn, or do we have a command to do? */ if (execstring && *execstring) { comstring.dsc$w_length = strlen(execstring); comstring.dsc$b_dtype = DSC$K_DTYPE_T; comstring.dsc$b_class = DSC$K_CLASS_S; comstring.dsc$a_pointer = (char *)execstring; command = &comstring; } else command = 0; /* use asynch subprocess and suppress output iff one-shot command */ if (!screenoutput) { spawnflags = CLI$M_NOWAIT; inoutfile = &nulldevice; } hack_escape(screenoutput, command ? (const char *) 0 : " \"Escaping\" into a subprocess; LOGOUT to reconnect and resume play. "); if (command || !dosh_pid || !vms_ok(status = lib$attach(&dosh_pid))) { # ifdef CHDIR (void) chdir(getenv("PATH")); # endif privoff(); new_pid = 0; status = lib$spawn(command, inoutfile, inoutfile, &spawnflags, (struct dsc$descriptor_s *) 0, &new_pid); if (!command) dosh_pid = new_pid; else mail_pid = new_pid; privon(); # ifdef CHDIR chdirx((char *) 0, 0); # endif } hack_resume(screenoutput); if (!vms_ok(status)) { pline(" Spawn failed. (%%x%08lX) ", status); mark_synch(); } return 0; } #endif /* SHELL */ #ifdef SUSPEND /* dosuspend() -- if we're a subprocess, attach to our parent; * if not, there's nothing we can do. */ int dosuspend() { static long owner_pid = -1; unsigned long status; if (owner_pid == -1) /* need to check for parent */ owner_pid = getppid(); if (owner_pid == 0) { pline( " No parent process. Use '!' to Spawn, 'S' to Save, or 'Q' to Quit. "); mark_synch(); return 0; } /* restore normal tty environment & clear screen */ hack_escape(1, " Attaching to parent process; use the ATTACH command to resume play. "); status = lib$attach(&owner_pid); /* connect to parent */ hack_resume(1); /* resume game tty environment & refresh screen */ if (!vms_ok(status)) { pline(" Unable to attach to parent. (%%x%08lX) ", status); mark_synch(); } return 0; } #endif /* SUSPEND */ /*vmsunix.c*/ slashem-0.0.7E7F3/sys/vms/lev_lex.h0000664000076400007640000000147010545462317015110 0ustar aliali/* 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 * `lex' and is benign when either of those configurations are used.) * It works because the actual setup of yyin & yyout is performed in * src/lev_main.c, where stdin & stdout are still correctly defined. * * The troublesome code is * #include "stdio.h" * ... * FILE *yyin = stdin, *yyout = stdout; * The file scope initializers with non-constant values require this * hack, and the quotes instead of brackets makes it easy to do. */ #include #ifdef stdin # undef stdin #endif #define stdin 0 #ifdef stdout # undef stdout #endif #define stdout 0 slashem-0.0.7E7F3/sys/vms/oldcrtl.c0000664000076400007640000001270510545462317015113 0ustar aliali/* 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 */ #ifdef VERYOLD_VMS /* * The following routines are used by NetHack but were not available * from the C Run-Time Library (VAXCRTL) prior to VMS V4.6. * * atexit, memcmp, memcpy, qsort, rename, vprintf, vsprintf * * Most of them are implemented here, but others will have to be worked * around in another fashion [such as '#define USE_OLDARGS' (even though * is available) to avoid the need for vprintf & vsprintf]. * */ #define REG register #define const #ifndef SUPPRESS_MEM_FUNCS /* note: hand optimized for VAX (hardware pre-decrement & post-increment) */ /* void *memset(void *, int, size_t) -- fill chunk of memory. */ char *memset( dst, fil, cnt ) REG char *dst; REG char fil; REG int cnt; { char *dst_p = dst; while ( --cnt >= 0 ) *dst++ = fil; return dst_p; } /* void *memcpy(void *, const void *, size_t) -- copy chunk of memory. */ char *memcpy( dst, src, cnt ) REG char *dst; REG const char *src; REG int cnt; { char *dst_p = dst; while ( --cnt >= 0 ) *dst++ = *src++; return dst_p; } /* void *memmove(void *, const void *, size_t) -- copy possibly overlapping mem. */ char *memmove( dst, src, cnt ) REG char *dst; REG const char *src; REG int cnt; { char *dst_p = dst; if ( src == dst || cnt <= 0 ) { ; /* do nothing */ } else if ( dst < src || dst >= src + cnt ) { while ( --cnt >= 0 ) *dst++ = *src++; } else { /* work backwards */ dst += cnt, src += cnt; while ( --cnt >= 0 ) *--dst = *--src; } return dst_p; } /* void *memchr(const void *, int, size_t) -- search for a byte. */ char *memchr( buf, byt, len ) REG const char *buf; REG char byt; REG int len; { while ( --len >= 0 ) if ( *buf++ == byt ) /* found */ return (char *)--buf; return (char *)0; /* not found */ } /* int memcmp(const void *, const void *, size_t) -- compare two chunks. */ int memcmp( buf1, buf2, len ) REG const char *buf1; REG const char *buf2; REG int len; { while ( --len >= 0 ) if ( *buf1++ != *buf2++ ) return (*--buf1 - *--buf2); return 0; /* buffers matched */ } #endif /*!SUPPRESS_MEM_FUNCS*/ #ifndef SUPPRESS_ATEXIT /* int atexit(void (*)(void)) -- register an exit handler. */ #define MAX_EXIT_FUNCS 32 /* arbitrary (32 matches VAX C v3.x docs) */ struct ex_hndlr { long reserved, (*routine)(), arg_count, *arg1_addr; }; static int ex_cnt = 0; /* number of handlers registered so far */ static struct { long dummy_arg; struct ex_hndlr handler; /*(black box)*/ } ex_data[MAX_EXIT_FUNCS]; /* static handler data */ extern unsigned long sys$dclexh(); int atexit( function ) void (*function)(); /* note: actually gets called with 1 arg */ { if ( ex_cnt < MAX_EXIT_FUNCS ) { ex_data[ex_cnt].dummy_arg = 0; /* ultimately receives exit reason */ ex_data[ex_cnt].handler.reserved = 0; ex_data[ex_cnt].handler.routine = (long (*)()) function; ex_data[ex_cnt].handler.arg_count = 1; /*(required)*/ ex_data[ex_cnt].handler.arg1_addr = &ex_data[ex_cnt].dummy_arg; (void)sys$dclexh(&ex_data[ex_cnt].handler); /* declare exit handler */ return ++ex_cnt; /*(non-zero)*/ } else return 0; } #endif /*!SUPPRESS_ATEXIT*/ #ifndef SUPPRESS_RENAME /* int rename(const char *, const char *) -- rename a file (on same device). */ #ifndef EVMSERR #include #define C$$TRANSLATE(status) (errno = EVMSERR, vaxc$errno = (status)) #endif extern unsigned long lib$rename_file(); int rename( old_name, new_name ) const char *old_name; const char *new_name; { struct dsc { unsigned short len, mbz; const char *adr; } old_dsc, new_dsc; unsigned long status; /* put strings into descriptors and call run-time library routine */ new_dsc.mbz = old_dsc.mbz = 0; /* type and class unspecified */ old_dsc.len = strlen( old_dsc.adr = old_name ); new_dsc.len = strlen( new_dsc.adr = new_name ); status = lib$rename_file(&old_dsc, &new_dsc); /* omit optional args */ if ( !(status & 1) ) { /* even => failure */ C$$TRANSLATE(status); return -1; } else /* odd => success */ return 0; } #endif /*!SUPPRESS_RENAME*/ #ifndef SUPPRESS_QSORT /* void qsort(void *, size_t, size_t, int (*)()) -- sort arbitrary collection. */ extern char *malloc(); /* assume no alloca() available */ extern void free(); void qsort( base, count, size, compare ) char *base; int count; REG int size; int (*compare)(); { REG int i, cmp; REG char *next, *prev, *tmp = 0; char wrk_buf[512]; /* just use a shuffle sort (tradeoff between efficiency & simplicity) */ /* [Optimal if already sorted; worst case when initially reversed.] */ for ( next = base, i = 1; i < count; i++ ) { prev = next, next += size; /* increment front pointer */ if ( (cmp = (*compare)( next, prev)) < 0 ) { /* found element out of order; move other(s) up then re-insert it */ if ( !tmp ) tmp = size > (int)(sizeof wrk_buf) ? malloc(size) : wrk_buf; memcpy( tmp, next, size); /* save smaller element */ while ( cmp < 0 ) { memcpy( prev + size, prev, size); /* move larger elem. up */ prev -= size; /* decrement back pointer */ cmp = (prev >= base ? (*compare)( tmp, prev) : 0); } memcpy( prev + size, tmp, size); /* restore small element */ } } if ( tmp != 0 && tmp != wrk_buf ) free(tmp); return; } #endif /*!SUPPRESS_QSORT*/ #endif /*VERYOLD_VMS*/ slashem-0.0.7E7F3/sys/vms/vmsfiles.c0000664000076400007640000002126310545462317015277 0ustar aliali/* 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. */ /* * VMS-specific file manipulation routines to implement some missing * routines or substitute for ones where we want behavior modification. */ #include "config.h" #include /* lint supression due to lack of extern.h */ int FDECL(vms_link, (const char *,const char *)); int FDECL(vms_unlink, (const char *)); int FDECL(vms_creat, (const char *,unsigned int)); int FDECL(vms_open, (const char *,int,unsigned int)); boolean FDECL(same_dir, (const char *,const char *)); int FDECL(c__translate, (int)); char *FDECL(vms_basename, (const char *)); #include #if 0 #include #else #define PSL$C_EXEC 1 /* executive mode, for priv'd logical name handling */ #endif #include #ifndef C$$TRANSLATE /* don't rely on VAXCRTL's internal routine */ #define C$$TRANSLATE(status) (errno = EVMSERR, vaxc$errno = (status)) #endif extern unsigned long sys$parse(), sys$search(), sys$enter(), sys$remove(); extern int VDECL(lib$match_cond, (int,int,...)); #define vms_success(sts) ((sts)&1) /* odd, */ #define vms_failure(sts) (!vms_success(sts)) /* even */ /* vms_link() -- create an additional directory for an existing file */ int vms_link(file, new) const char *file, *new; { struct FAB fab; struct NAM nam; unsigned short fid[3]; char esa[NAM$C_MAXRSS]; fab = cc$rms_fab; /* set block ID and length, zero the rest */ fab.fab$l_fop = FAB$M_OFP; fab.fab$l_fna = (char *) file; fab.fab$b_fns = strlen(file); fab.fab$l_nam = &nam; nam = cc$rms_nam; nam.nam$l_esa = esa; nam.nam$b_ess = sizeof esa; if (vms_success(sys$parse(&fab)) && vms_success(sys$search(&fab))) { fid[0] = nam.nam$w_fid[0]; fid[1] = nam.nam$w_fid[1]; fid[2] = nam.nam$w_fid[2]; fab.fab$l_fna = (char *) new; fab.fab$b_fns = strlen(new); if (vms_success(sys$parse(&fab))) { nam.nam$w_fid[0] = fid[0]; nam.nam$w_fid[1] = fid[1]; nam.nam$w_fid[2] = fid[2]; nam.nam$l_esa = nam.nam$l_name; nam.nam$b_esl = nam.nam$b_name + nam.nam$b_type + nam.nam$b_ver; (void) sys$enter(&fab); } } if (vms_failure(fab.fab$l_sts)) { C$$TRANSLATE(fab.fab$l_sts); return -1; } return 0; /* success */ } /* vms_unlink() -- remove a directory entry for a file; should only be used for files which have had extra directory entries added, not for deletion (because the file won't be deleted, just made inaccessible!). */ int vms_unlink(file) const char *file; { struct FAB fab; struct NAM nam; char esa[NAM$C_MAXRSS]; fab = cc$rms_fab; /* set block ID and length, zero the rest */ fab.fab$l_fop = FAB$M_DLT; fab.fab$l_fna = (char *) file; fab.fab$b_fns = strlen(file); fab.fab$l_nam = &nam; nam = cc$rms_nam; nam.nam$l_esa = esa; nam.nam$b_ess = sizeof esa; if (vms_failure(sys$parse(&fab)) || vms_failure(sys$remove(&fab))) { C$$TRANSLATE(fab.fab$l_sts); return -1; } return 0; } /* Substitute creat() routine -- if trying to create a specific version, explicitly remove an existing file of the same name. Since it's only used when we expect exclusive access, add a couple RMS options for optimization. (Don't allow sharing--eliminates coordination overhead, and use 32 block buffer for faster throughput; ~30% speedup measured.) */ #undef creat int vms_creat(file, mode) const char *file; unsigned int mode; { if (index(file, ';')) { /* assumes remove or delete, not vms_unlink */ if (!unlink(file)) { (void)sleep(1); (void)unlink(file); } } return creat(file, mode, "shr=nil", "mbc=32", "mbf=2", "rop=wbh"); } /* Similar substitute for open() -- if an open attempt fails due to being locked by another user, retry it once (work-around for a limitation of at least one NFS implementation). */ #undef open int vms_open(file, flags, mode) const char *file; int flags; unsigned int mode; { int fd = open(file, flags, mode, "mbc=32", "mbf=2", "rop=rah"); if (fd < 0 && errno == EVMSERR && lib$match_cond(vaxc$errno, RMS$_FLK)) { (void)sleep(1); fd = open(file, flags, mode, "mbc=32", "mbf=2", "rop=rah"); } return fd; } /* Determine whether two strings contain the same directory name. Used for deciding whether installed privileges should be disabled when HACKDIR is defined in the environment (or specified via -d on the command line). This version doesn't handle Unix-style file specs. */ boolean same_dir(d1, d2) const char *d1, *d2; { if (!d1 || !*d1 || !d2 || !*d2) return FALSE; else if (!strcmp(d1, d2)) /* strcmpi() would be better, but that leads */ return TRUE; /* to linking problems for the utilities */ else { struct FAB f1, f2; struct NAM n1, n2; f1 = f2 = cc$rms_fab; /* initialize file access block */ n1 = n2 = cc$rms_nam; /* initialize name block */ f1.fab$b_acmodes = PSL$C_EXEC << FAB$V_LNM_MODE; f1.fab$b_fns = strlen( f1.fab$l_fna = (char *)d1 ); f2.fab$b_fns = strlen( f2.fab$l_fna = (char *)d2 ); f1.fab$l_nam = (genericptr_t)&n1; /* link nam to fab */ f2.fab$l_nam = (genericptr_t)&n2; n1.nam$b_nop = n2.nam$b_nop = NAM$M_NOCONCEAL; /* want true device name */ return (vms_success(sys$parse(&f1)) && vms_success(sys$parse(&f2)) && n1.nam$t_dvi[0] == n2.nam$t_dvi[0] && !strncmp(&n1.nam$t_dvi[1], &n2.nam$t_dvi[1], n1.nam$t_dvi[0]) && !memcmp((genericptr_t)n1.nam$w_did, (genericptr_t)n2.nam$w_did, sizeof n1.nam$w_did)); /*{ short nam$w_did[3]; }*/ } } /* * c__translate -- substitute for VAXCRTL routine C$$TRANSLATE. * * Try to convert a VMS status code into its Unix equivalent, * then set `errno' to that value; use EVMSERR if there's no * appropriate translation; set `vaxc$errno' to the original * status code regardless. * * These translations match only a subset of VAXCRTL's lookup * table, but work even if the severity has been adjusted or * the inhibit-message bit has been set. */ #include #include #include /* #include */ /* #include */ #define VALUE(U) trans = U; break #define CASE1(V) case (V >> 3) #define CASE2(V,W) CASE1(V): CASE1(W) int c__translate(code) int code; { register int trans; switch ((code & 0x0FFFFFF8) >> 3) { /* strip upper 4 and bottom 3 bits */ CASE2(RMS$_PRV,SS$_NOPRIV): VALUE(EPERM); /* not owner */ CASE2(RMS$_DNF,RMS$_DIR): CASE2(RMS$_FNF,RMS$_FND): CASE1(SS$_NOSUCHFILE): VALUE(ENOENT); /* no such file or directory */ CASE2(RMS$_IFI,RMS$_ISI): VALUE(EIO); /* i/o error */ CASE1(RMS$_DEV): CASE2(SS$_NOSUCHDEV,SS$_DEVNOTMOUNT): VALUE(ENXIO); /* no such device or address codes */ CASE1(RMS$_DME): /* CASE1(LIB$INSVIRMEM): */ CASE2(SS$_VASFULL,SS$_INSFWSL): VALUE(ENOMEM); /* not enough core */ CASE1(SS$_ACCVIO): VALUE(EFAULT); /* bad address */ CASE2(RMS$_DNR,SS$_DEVASSIGN): CASE2(SS$_DEVALLOC,SS$_DEVALRALLOC): CASE2(SS$_DEVMOUNT,SS$_DEVACTIVE): VALUE(EBUSY); /* mount device busy codes to name a few */ CASE2(RMS$_FEX,SS$_FILALRACC): VALUE(EEXIST); /* file exists */ CASE2(RMS$_IDR,SS$_BADIRECTORY): VALUE(ENOTDIR); /* not a directory */ CASE1(SS$_NOIOCHAN): VALUE(EMFILE); /* too many open files */ CASE1(RMS$_FUL): CASE2(SS$_DEVICEFULL,SS$_EXDISKQUOTA): VALUE(ENOSPC); /* no space left on disk codes */ CASE2(RMS$_WLK,SS$_WRITLCK): VALUE(EROFS); /* read-only file system */ default: VALUE(EVMSERR); }; errno = trans; vaxc$errno = code; return code; /* (not very useful) */ } #undef VALUE #undef CASE1 #undef CASE2 static char base_name[NAM$C_MAXRSS+1]; /* return a copy of the 'base' portion of a filename */ char * vms_basename(name) const char *name; { unsigned len; char *base, *base_p; register const char *name_p; /* skip directory/path */ if ((name_p = strrchr(name, ']')) != 0) name = name_p + 1; if ((name_p = strrchr(name, '>')) != 0) name = name_p + 1; if ((name_p = strrchr(name, ':')) != 0) name = name_p + 1; if ((name_p = strrchr(name, '/')) != 0) name = name_p + 1; if (!*name) name = "."; /* this should never happen */ /* find extension/version and derive length of basename */ if ((name_p = strchr(name, '.')) == 0 || name_p == name) name_p = strchr(name, ';'); len = (name_p && name_p > name) ? name_p - name : strlen(name); /* return a lowercase copy of the name in a private static buffer */ base = strncpy(base_name, name, len); base[len] = '\0'; /* we don't use lcase() so that utilities won't need hacklib.c */ for (base_p = base; base_p < &base[len]; base_p++) if (isupper(*base_p)) *base_p = tolower(*base_p); return base; } /*vmsfiles.c*/ slashem-0.0.7E7F3/sys/vms/vmsbuild.com0000775000076400007640000003036010545462317015631 0ustar aliali$ ! vms/vmsbuild.com -- compile and link NetHack 3.4.* [pr] $ version_number = "3.4.3" $ ! $ ! usage: $ ! $ set default [.src] !or [-.-.src] if starting from [.sys.vms] $ ! $ @[-.sys.vms]vmsbuild [compiler-option] [link-option] [cc-switches] $ ! options: $ ! compiler-option : either "VAXC", "DECC" or "GNUC" or "" !default VAXC $ ! link-option : either "SHARE[able]" or "LIB[rary]" !default SHARE $ ! cc-switches : optional qualifiers for CC (such as "/noOpt/Debug") $ ! notes: $ ! If the symbol "CC" is defined, compiler-option is not used. $ ! The link-option refers to VAXCRTL (C Run-Time Library) handling; $ ! to specify it while letting compiler-option default, use "" as $ ! the compiler-option. $ ! To re-link without compiling, use "LINK" as special 'compiler-option'; $ ! to re-link with GNUC library, 'CC' must begin with "G" (or "g"). $ ! Default wizard definition moved to include/vmsconf.h. $ $ decc_dflt = f$trnlnm("DECC$CC_DEFAULT") $ j = (decc_dflt.nes."") .and. 1 $ vaxc_ = "CC" + f$element(j,"#","#/VAXC") + "/NOLIST/OPTIMIZE=NOINLINE" $ decc_ = "CC" + f$element(j,"#","#/DECC") + "/PREFIX=ALL/NOLIST" $ gnuc_ = "GCC" $ if f$type(gcc).eqs."STRING" then gnuc_ = gcc $ gnulib = "gnu_cc:[000000]gcclib/Library" !(not used w/ vaxc) $ ! common CC options (/obj=file doesn't work for GCC 1.36, use rename instead) $ c_c_ = "/INCLUDE=[-.INCLUDE]" $ veryold_vms = f$extract(1,1,f$getsyi("VERSION")).eqs."4" - .and. f$extract(3,3,f$getsyi("VERSION")).lts."6" $ if veryold_vms then c_c_ = c_c_ + "/DEFINE=(""VERYOLD_VMS"")" $ axp = (f$getsyi("CPU").ge.128) !f$getsyi("ARCH_NAME").eqs."Alpha" $ ! miscellaneous setup $ ivqual = %x00038240 !DCL-W-IVQUAL (used to check for ancient vaxc) $ abort := exit %x1000002A $ cur_dir = f$environment("DEFAULT") $ vmsbuild = f$environment("PROCEDURE") $ ! validate first parameter $ p1 := 'p1' $ if p1.eqs."" .and. (axp .or. decc_dflt.eqs."/DECC") then p1 = "DECC" $ o_VAXC = 0 !(c_opt substring positions) $ o_DECC = 5 $ o_GNUC = 10 $ o_LINK = 15 $ o_SPCL = 20 $ c_opt = f$locate("|"+p1, "|VAXC|DECC|GNUC|LINK|SPECIAL|") !5 $ if (c_opt/5)*5 .eq. c_opt then goto p1_ok $ copy sys$input: sys$error: !p1 usage %first arg is compiler option; it must be one of "VAXC" -- use VAX C to compile everything or "DECC" -- use DEC C to compile everything or "GNUC" -- use GNU C to compile everything or "LINK" -- skip compilation, just relink nethack.exe or "SPEC[IAL]" -- just compile and link lev_comp.exe or "" -- default operation (VAXC unless 'CC' is defined) Note: if a DCL symbol for CC is defined, "VAXC" and "GNUC" are no-ops. If the symbol value begins with "G" (or "g"), then the GNU C library will be included in all link operations. Do not rebuild lev_comp with "SPECIAL" unless you have a CC symbol setup with the proper options. $ abort $p1_ok: $ ! validate second parameter $ p2 := 'p2' $ l_opt = f$locate("|"+p2, "|SHAREABLE|LIBRARY__|NONE_____|") !10 $ if (l_opt/10)*10 .eq. l_opt then goto p2_ok $ copy sys$input: sys$error: !p2 usage %second arg is C run-time library handling; it must be one of "SHAREABLE" -- link with SYS$SHARE:VAXCRTL.EXE/SHAREABLE or "LIBRARY" -- link with SYS$LIBRARY:VAXCRTL.OLB/LIBRARY or "NONE" -- explicitly indicate DECC$SHR or "" -- default operation (use shareable image) Note: for MicroVMS 4.x, "SHAREABLE" (which is the default) is required. Specify "NONE" if using DEC C with a CC symbol overriding 1st arg. $ abort $p2_ok: $ ! start from a known location -- [.sys.vms], then move to [-.-.src] $ set default 'f$parse(vmsbuild,,,"DEVICE")''f$parse(vmsbuild,,,"DIRECTORY")' $ set default [-.-.src] !move to source directory $ ! compiler setup; if a symbol for "CC" is already defined it will be used $ if f$type(cc).eqs."STRING" then goto got_cc $ cc = vaxc_ !assume "VAXC" requested or defaulted $ if c_opt.eq.o_GNUC then goto chk_gcc !explicitly invoked w/ "GNUC" option $ if c_opt.eq.o_DECC then cc = decc_ $ if c_opt.ne.o_VAXC then goto got_cc !"SPEC" or "LINK", skip compiler check $ ! we want to prevent function inlining with vaxc v3.x (/opt=noinline) $ ! but we can't use noInline with v2.x, so need to determine version $ set noOn $ msgenv = f$environment("MESSAGE") $ set message/noFacil/noSever/noIdent/noText $ cc/noObject _NLA0:/Include=[] !strip 'noinline' if error $ sts = $status $ if sts then goto reset_msg !3.0 or later will check out OK $ ! must be dealing with vaxc 2.x; ancient version (2.2 or earlier) $ ! can't handle /include='dir', needs c$include instead $ cc = cc - "=NOINLINE" - ",NOINLINE" - "NOINLINE," $ if sts.ne.IVQUAL then goto reset_msg $ define/noLog c$include [-.INCLUDE] $ c_c_ = "/DEFINE=(""ANCIENT_VAXC"")" $ if veryold_vms then c_c_ = c_c_ - ")" + ",""VERYOLD_VMS"")" $reset_msg: $ set message 'msgenv' $ set On $ goto got_cc $ ! $chk_gcc: $ cc = gnuc_ $ ! old versions of gcc-vms don't have or available $ c_c_ = "/DEFINE=(""USE_OLDARGS"")" $ if veryold_vms then c_c_ = c_c_ - ")" + ",""VERYOLD_VMS"")" $ if veryold_vms then goto chk_gas !avoid varargs & stdarg $ if f$search("gnu_cc_include:[000000]varargs.h").nes."" then - c_c_ = "/DEFINE=(""USE_VARARGS"")" $ if f$search("gnu_cc_include:[000000]stdarg.h").nes."" then - c_c_ = "/DEFINE=(""USE_STDARG"")" $chk_gas: $ ! test whether this version of gas handles the 'const' construct correctly $ gas_chk_tmp = "sys$scratch:gcc-gas-chk.tmp" $ if f$search(gas_chk_tmp).nes."" then delete/noconfirm/nolog 'gas_chk_tmp';* $ gas_ok = 0 !assume bad $ on warning then goto skip_gas $ define/user/nolog sys$error 'gas_chk_tmp' $ mcr gnu_cc:[000000]gcc-as sys$input: -o _NLA0: $DECK .const .comm dummy,0 .const .comm dummy,0 $EOD $ gas_ok = 1 !assume good $ if f$search(gas_chk_tmp).eqs."" then goto skip_gas $ ! if the error file is empty, gas can deal properly with const $ gas_ok = f$file_attrib(gas_chk_tmp,"EOF") .eq. 0 $ delete/noconfirm/nolog 'gas_chk_tmp';* $skip_gas: $ on warning then continue $ if .not.gas_ok then c_c_ = c_c_ - ")" + ",""const="")" $ c_c_ = "/INCLUDE=[-.INCLUDE]" + c_c_ $ ! $got_cc: $ cc = cc + c_c_ !append common qualifiers $ if p3.nes."" then cc = cc + p3 !append optional user preferences $ g := 'f$extract(0,1,cc)' $ if g.eqs."$" then g := 'f$extract(1,1,cc)' !"foreign" gcc $ if f$edit(f$extract(1,1,cc),"UPCASE").eqs."E" then g := X !GEMC $ if g.nes."G" .and. c_opt.ne.o_GNUC then gnulib = "" $ if g.eqs."G" .or. c_opt.eq.o_GNUC then gnulib = "," + gnulib $ ! linker setup; if a symbol for "LINK" is defined, we'll use it $ if f$type(link).nes."STRING" then link = "LINK/NOMAP" $ if p4.nes."" then link = link + p4 !append optional user preferences $ if c_opt.eq.o_DECC .or. l_opt.eq.10 $ then $ crtl = "" !sys$share:decc$shr.exe/Sharable found automatically $ create crtl.opt !empty $ else $ crtl = ",sys$library:vaxcrtl.olb/Library" !object library $ if l_opt.ne.0 then goto crtl_ok $ crtl = ",sys$disk:[-.src]crtl.opt/Options" !shareable image $ if f$search("crtl.opt").nes."" then goto crtl_ok !assume its right $ create sys$disk:[-.src]crtl.opt sys$share:vaxcrtl.exe/Shareable $ endif $crtl_ok: $ if f$search("crtl.opt;-2").nes."" then purge/Keep=2/noLog crtl.opt $ ! version ID info for linker to record in .EXE files $ create ident.opt $ open/Append f ident.opt $ write f "identification=""",version_number,""" !version" $ close f $ if f$search("ident.opt;-1").nes."" then purge/noLog ident.opt $ ident_opt = ",sys$disk:[-.src]ident.opt/Options" $ ! final setup $ nethacklib = "[-.src]nethack.olb" $ milestone = "write sys$output f$fao("" !5%T "",0)," $ if c_opt.eq.o_LINK then goto link !"LINK" requested, skip compilation $ rename := rename/New_Vers $ touch := set file/Truncate $ makedefs := $sys$disk:[-.util]makedefs $ show symbol cc $ goto begin !skip subroutines $! $compile_file: !input via 'c_file' $ no_lib = ( f$extract(0,1,c_file) .eqs. "#" ) $ if no_lib then c_file = f$extract(1,255,c_file) $ c_name = f$edit(f$parse(c_file,,,"NAME"),"LOWERCASE") $ f_opts = "" !options for this file $ if f$type('c_name'_options).nes."" then f_opts = 'c_name'_options $ milestone " (",c_name,")" $ if f$search("''c_name'.obj").nes."" then delete 'c_name'.obj;* $ cc 'f_opts' 'c_file' $ if .not.no_lib then nh_obj_list == nh_obj_list + ",''c_name'.obj;0" $ return $! $compile_list: !input via 'c_list' $ nh_obj_list == "" $ j = -1 $ c_loop: $ j = j + 1 $ c_file = f$element(j,",",c_list) !get next file $ if c_file.eqs."," then goto c_done $ c_file = c_file + ".c" $ gosub compile_file $ goto c_loop $ c_done: $ nh_obj_list == f$extract(1,999,nh_obj_list) $ if nh_obj_list.nes."" then libr/Obj 'nethacklib' 'nh_obj_list'/Replace $ if nh_obj_list.nes."" then delete 'nh_obj_list' $ delete/symbol/global nh_obj_list $ return $! $begin: $! $! miscellaneous special source file setup $! $ if f$search("random.c").eqs."" then copy [-.sys.share]random.c []*.* $ if f$search("tclib.c") .eqs."" then copy [-.sys.share]tclib.c []*.* $ if f$search("[-.util]lev_yacc.c").eqs."" then @[-.sys.vms]spec_lev.com $! $! create object library $! $ if c_opt.ne.o_SPCL .or. f$search("''nethacklib'").eqs."" then - libr/Obj 'nethacklib'/Create=(Block=3000,Hist=0) $ if f$search("''nethacklib';-1").nes."" then purge 'nethacklib' $! $! compile and link makedefs, then nethack, finally lev_comp & dgn_comp. $! $ milestone "" $ c_list = "[-.sys.vms]vmsmisc,[]alloc,dlb,monst,objects" $ if c_opt.eq.o_SPCL then c_list = c_list + ",decl,drawing" $ gosub compile_list $ if c_opt.eq.o_SPCL then goto special !"SPECIAL" requested, skip main build $ set default [-.util] $ c_list = "#makedefs" $ gosub compile_list $ link makedefs.obj,'nethacklib'/Lib'crtl''gnulib''ident_opt' $ milestone "makedefs" $! create some build-time files $ makedefs -p !pm.h $ makedefs -o !onames.h $ makedefs -v !date.h $ milestone " (*.h)" $ makedefs -m !../src/monstr.c $ makedefs -z !../src/vis_tab.c, ../include/vis_tab.h $ milestone " (*.c)" $ set default [-.src] $! compile most of the source files: $ c_list = "decl,version,[-.sys.vms]vmsmain,[-.sys.vms]vmsunix" - + ",[-.sys.vms]vmstty,[-.sys.vms]vmsmail,[-.sys.vms]vmsfiles" - + ",[]random,[]tclib" !copied from [-.sys.share] $ gosub compile_list $ c_list = "[-.win.tty]getline,[-.win.tty]termcap" - + ",[-.win.tty]topl,[-.win.tty]wintty" $ gosub compile_list $ c_list = "allmain,apply,artifact,attrib,ball,bones,botl,cmd,dbridge,detect" - + ",dig,display,do,do_name,do_wear,dog,dogmove,dokick,dothrow,drawing" - + ",dungeon,eat,end,engrave,exper,explode,extralev,files,fountain" $ 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" - + ",sounds,sp_lev,spell,steal,steed,teleport,timeout,topten,track" - + ",trap,u_init" $ gosub compile_list $ c_list = "uhitm,vault,vision,vis_tab,weapon,were,wield,windows" - + ",wizard,worm,worn,write,zap" $ gosub compile_list $! $link: $ milestone "" $ link/Exe=nethack.exe 'nethacklib'/Lib/Incl=(vmsmain)'crtl''gnulib''ident_opt' $ milestone "NetHack" $ if c_opt.eq.o_LINK then goto done !"LINK" only $special: $! $! build special level and dungeon compilers $! $ set default [-.util] $ c_list = "#panic,#lev_main,#lev_yacc,#dgn_main,#dgn_yacc" $ if c_opt.eq.o_SPCL then c_list = "[-.sys.vms]vmsfiles," + c_list $ gosub compile_list $ c_list = "#lev_lex,#dgn_lex" $ copy [-.sys.vms]lev_lex.h stdio.*/Prot=(s:rwd,o:rwd) $ gosub compile_list $ rename stdio.h lev_lex.* $ link/exe=lev_comp.exe lev_main.obj,lev_yacc.obj,lev_lex.obj,- panic.obj,'nethacklib'/Lib'crtl''gnulib''ident_opt' $ milestone "lev_comp" $ link/exe=dgn_comp.exe dgn_main.obj,dgn_yacc.obj,dgn_lex.obj,- panic.obj,'nethacklib'/Lib'crtl''gnulib''ident_opt' $ milestone "dgn_comp" $! $ c_list = "#dlb_main,#recover" $ gosub compile_list $ link/exe=dlb.exe dlb_main.obj,panic.obj,'nethacklib'/Lib'crtl''gnulib''ident_opt' $ milestone "dlb" $ link/exe=recover.exe recover.obj,'nethacklib'/Lib'crtl''gnulib''ident_opt' $ milestone "recover" $! $done: $ set default 'cur_dir' $ exit slashem-0.0.7E7F3/sys/vms/Makefile.top0000664000076400007640000001066510545462317015550 0ustar aliali# NetHack Makefile (VMS) - top level for making & installing everything. # SCCS Id: @(#)Makefile.top 3.4 2003/05/19 # Copy this file to Makefile.; edit the appropriate values for # GAMEDIR ("playground" location) and GAMEOWNER (UIC or identifier # for the owner of playground files). # usage: mms all,install # or mms no_tools,all,install # or substitute freeware `MMK' for Digital's `MMS'. MAKE = $(MMS) CD = set default ECHO = write sys$output EXEC = @ NOOP = continue # don't do anything interesting TOUCH = set file/truncate # multiple files per $(TOUCH), but no creation # support directories, relative to 'top' DAT = [.dat] DOC = [.doc] SRC = [.src] TOP = [-] # relative to the others UTL = [.util] VMS = [.sys.vms] GAMEDIR = # defaults to [.play] GAMEOWNER = # defaults to installer's UIC # these are the distributed values in [.include]vmsconf.h #GAMEDIR = DISK$USERS:[GAMES.NETHACK.3-4-2.PLAY] #GAMEOWNER = NHWIZARD # just about everything, except installation all : program utilities data dlb_data documentation @ $(ECHO) "all code and data is now up to date." program : $(CD) $(SRC) $(MAKE)$(MAKEFLAGS) all @ $(CD) $(TOP) utilities : $(CD) $(UTL) $(MAKE)$(MAKEFLAGS) all @ $(CD) $(TOP) data : $(CD) $(DAT) $(MAKE)$(MAKEFLAGS) all @ $(CD) $(TOP) documentation : $(CD) $(DOC) $(MAKE)$(MAKEFLAGS) all @ $(CD) $(TOP) install : program all_data make_directories create_writeable_files update @ $(ECHO) "installation is now complete." # assume there're no active games in progress update : place_readonly_files place_executable place_vms_support @ open/Write f tmp-update.com; @ write f "$ set noon" @ write f "$ if p1.eqs."""" then p1 = f$trnlnm(""HACKDIR"")" @ write f "$ if p1.eqs."""" then p1 = ""[.play]""" @ write f "$ old_default = f$environ(""DEFAULT"")" @ write f "$ set default 'p1'" @ write f\ "$ if f$search(""*.*;-2"").nes."""" then set file/prot=(s:rwed,o:rwed) *.*;-2" @ write f\ "$ if f$search(""*.*;-1"").nes."""" then set file/prot=(s:rwed,o:rwed) *.*;-1" @ write f "$ if f$search(""*.*;-1"").nes."""" then purge" @ write f "$! if f$search(""bones*.*"").nes."""" then $(TOUCH) bones*.*" @ write f "$! if f$search(""[.save]*"").nes."""" then $(TOUCH) [.save]*" @ write f "$ set default 'old_default'" @ write f "$ exit" @ close f - $(EXEC)tmp-update.com; $(GAMEDIR) !purge old version @ delete tmp-update.com; @ $(ECHO) "playground files updated." Guidebook : $(CD) $(DOC) $(MAKE)$(MAKEFLAGS) Guidebook @ $(CD) $(TOP) manpages : $(CD) $(DOC) $(MAKE)$(MAKEFLAGS) manpages @ $(CD) $(TOP) all_data : data dlb_data @ $(NOOP) dlb_data : $(EXEC)$(VMS)install.com "$(GAMEDIR)" "$(GAMEOWNER)" dlb make_directories : $(EXEC)$(VMS)install.com "$(GAMEDIR)" "$(GAMEOWNER)" directories create_writeable_files : $(EXEC)$(VMS)install.com "$(GAMEDIR)" "$(GAMEOWNER)" writeable_files place_readonly_files : $(EXEC)$(VMS)install.com "$(GAMEDIR)" "$(GAMEOWNER)" readonly_files place_executable : $(EXEC)$(VMS)install.com "$(GAMEDIR)" "$(GAMEOWNER)" executable place_vms_support : $(EXEC)$(VMS)install.com "$(GAMEDIR)" "$(GAMEOWNER)" termcap $(EXEC)$(VMS)install.com "$(GAMEDIR)" "$(GAMEOWNER)" procedure $(EXEC)$(VMS)install.com "$(GAMEDIR)" "$(GAMEOWNER)" documentation # 'make no_tools' should be done first if you don't have the appropriate # tools to process the parser and scanner for the special level and # dungeon compilers; doing so will copy distributed, pre-processed files # from [.sys.share] to [.util]. If you _do_ have the tools, be sure to # edit [.util]Makefile so that it uses the right ones. no_tools : $(CD) $(UTL) $(MAKE)$(MAKEFLAGS) no_yacc $(MAKE)$(MAKEFLAGS) no_lex @ $(CD) $(TOP) # 'make clean' removes all the .obj files, but leaves around all the executables # and compiled data files. clean : $(CD) $(SRC) - $(MAKE)$(MAKEFLAGS) clean @ $(CD) $(TOP) $(CD) $(UTL) - $(MAKE)$(MAKEFLAGS) clean @ $(CD) $(TOP) # 'make spotless' returns the source tree to near-distribution condition. # it removes .obj files, executables, and compiled data files. spotless : $(CD) $(SRC) - $(MAKE)$(MAKEFLAGS) spotless @ $(CD) $(TOP) $(CD) $(UTL) - $(MAKE)$(MAKEFLAGS) spotless @ $(CD) $(TOP) $(CD) $(DAT) - $(MAKE)$(MAKEFLAGS) spotless @ $(CD) $(TOP) $(CD) $(DOC) - $(MAKE)$(MAKEFLAGS) spotless @ $(CD) $(TOP) slashem-0.0.7E7F3/sys/vms/Install.vms0000664000076400007640000007060410545462317015443 0ustar aliali Instructions for Installing NetHack 3.4.3 on a VMS (aka OpenVMS) 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.3-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 and in some of the assorted files, but which may be a subdirectory-- that has these subdirectories [.dat] -- data files [.doc] -- documentation files [.include] -- C header files [.src] -- primary source files [.sys] -- parent for [.sys.*] [.sys .share] -- files shared by several ports, including VMS [.sys .vms] -- VMS-specific source and support files [.util] -- sources for essential utility programs [.win] -- parent for [.win.*] [.win .tty] -- "window" routines for ordinary terminals (including terminal windows on workstations) The following subdirectories may be present, but are not useful for building NetHack on VMS and are not required: [.sys .amiga] -- AmigaDOS [.sys .atari] -- Atari TOS [.sys .be] -- BeBox BeOS [.sys .mac] -- Macintosh [.sys .msdos] -- MSDOS for IBM PCs and compatibles [.sys .os2] -- OS/2 [.sys .share .sounds] -- AIFF format audio files [.sys .unix] -- guess :-) [.sys .wince] -- Windows CE [.sys .wince .ceinc] -- more WinCE [.sys .wince .ceinc .sys] -- ditto [.sys .winnt] -- Windows NT [.win .gem] -- window routines for Atari/GEM [.win .gnome] -- window routines for Unix/GNOME [.win .Qt] -- window routines for Qt [.win .share] -- "tile" graphic support [.win .win32] -- Windows NT and Windows CE [.win .X11] -- window routines for X-Windows; requires X11R4 or later and MIT's Athena Widget set You must arrange things in this structure or the supplied procedures and instructions in this file will not work properly. Several DCL command files are present in the [.sys.vms] subdirectory and won't work as intended if they're moved elsewhere. The file called Files in the top directory contains lists of everything that should be in each subdirectory, including things that are constructed as NetHack is being built. 3. Prior to beginning compilation, go to the [.include] subdirectory and edit vmsconf.h according to its comments. You should set Local_WIZARD and Local_HACKDIR to appropriate values, and you might want to define TEXTCOLOR if you have any color VAXstations or color terminals which handle ANSI-format escape sequences to set foreground and background color for text characters. (VT241/VT340 color graphics won't work.) Other things which may be of interest are SECURE if you intend to set up NetHack as an installed image which is granted privileges, and SHELL which should be disabled if you intend to allow captive accounts to run NetHack. You may also want to edit file config.h, but that's only necessary if you want or need to disable some of the game options. The distributed copy of config.h will work successfully on VMS; vmsconf.h has conditional code to deal with the UNIX-specific items. 4. If you have the programming utilities lex or flex and yacc or bison, you may edit the procedure [.sys.vms]spec_lev.com and execute it to process several source files for NetHack's special level and dungeon compilers. If you don't modify spec_lev.com, it will copy some pre-processed versions of the appropriate files (dgn_lex.c, lev_lex.c, dgn_yacc.c, lev_yacc.c, dgn_comp.h, and lev_comp.h) from [.sys.share] into [.util]*.c and [.include]*.h. $ @[.SYS.VMS]SPEC_LEV ![OPTIONAL] If you perform this step, do it prior to executing vmsbuild.com; if you don't perform this step, vmsbuild.com will do so for you. 5. To build NETHACK.EXE and its auxiliary programs, execute the following DCL command: $ @[.SYS.VMS]VMSBUILD !defaults to CC, either VAXC or DECC or $ @[.SYS.VMS]VMSBUILD "GNUC" !force "GCC" It can take quite a bit of time for a full build to complete. vmsbuild.com will display some feedback as it executes; generally this will be the name of each source file that's about to be compiled or the name of the executable that has just been linked. 6. If you have already started (or finished) a build and decide to start over with a different compiler, you should DELETE [.SRC]CRTL.OPT;* first. 7. After compilation, it's time to perform installation. Go back to the top directory. Either edit [.sys.vms]install.com to indicate where you want everything to be installed, or specify the location and "playground" owner on the command line. Then execute either $ @[.SYS.VMS]INSTALL or $ @[.SYS.VMS]INSTALL location owner where location is a device:[directory] specification and owner is either a rights identifier or UIC. If install.com is not modified and if values aren't supplied on the command line, the default values used are the translation of logical name HACKDIR, if any, or else [.PLAY] (relative to the current directory), and the UIC for the current process. install.com will use the auxiliary programs constructed by vmsbuild.com to process quite a few data files in the [.dat] subdirectory. Then it will create the playground directory, if necessary, plus the associated [.save] subdirectory. Next it will copy the data files into the playground; this step can take a while. Finally it will copy nethack.exe and a few additional support files. After it completes, the files [.src]nethack.olb, [.src]nethack.exe, [.util]*.obj, [.util]*_comp.exe, and [.util]makedefs.exe can be deleted in order to save disk space if desired. The other program, [.util]recover.exe, should not be deleted unless you make a copy of it somewhere--perhaps in the playground directory--first. It can be used to resurrect some games disrupted by system or program crash. 8. The file nethack.com which is copied to the playground directory can be used to invoke NetHack, or nethack.exe can be run directly. Most of the command-line options specified in the Unix man-page (file [.doc]nethack.txt) are also applicable to VMS. Some comments at the beginning of nethack.com illustrate several of the options. New players should read the file "Guidebook.txt" which will be copied into the playground directory as "Guidebook.doc". Notes: 1. Save files and bones files from versions 3.4.0, 3.4.1 and 3.4.2 will work with 3.4.3; those from earlier versions will not. The scoreboard file (RECORD) from 3.4.x or 3.3.x will also 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 logical name NETHACKOPTIONS to have the value of a quoted string containing a comma separated list of option values. The option names are case-insensitive. $ define nethackoptions "noAutoPickup,Dog:Rover,Cat:Felix,DECgraphics" One value you'll probably want to specify is "noLegacy" to turn off the initial introductory passage. The "checkpoint" option controls whether or not enough data is saved to disk so that the set of level files left behind after a crash contains sufficient information for recover.exe to be able to construct a save file after the fact. The tradeoff for enabling checkpoint is that using it makes level changes do more I/O and take longer. The "menustyle" option controls some aspects of the user interface, and can be set to "menustyle:traditional" to make nethack behave more like older versions. If logical name or DCL symbol NETHACKOPTIONS is not defined, NetHack will try HACKOPTIONS instead. Regardless of whether or not either is defined, it will also try to find a configuration file containing additional option settings. If the value of the translation of NETHACKOPTIONS--or HACKOPTIONS--begins with an "@" character then the rest of the translation is assumed to be the name of the configuration file. Otherwise, the following are tried: file specified by logical name NETHACKINI, file SYS$LOGIN:NETHACK.INI, and file HOME:NETHACK.CNF (note that the C run-time library sets up the value of HOME to match sys$login). Syntax for the configuration file is similar to NETHACKOPTIONS, but multiple lines can be used, each must start with OPTIONS=, and comments can be included by placing '#' in the first column. Several options which take more complex values (graphics representation) can also be present; see the "Guidebook" for details. (Guidebook.txt can be found in the [.doc] subdirectory; a copy gets placed in the playground directory by install.com. Also, an example configuration file can be found in [.win.X11]nethack.rc.) 3. Instead of using vmsbuild.com to compile and link everything, you can use the set of Makefiles found in the vms subdirectory, provided you have an appropriate and compatible make utility. They've been tested using MMK, a freeware clone of Digital's MMS. There are five of them, and the suffix or filetype on their names indicates where they should be placed. $ copy [.sys.vms]Makefile.top []Makefile. $ copy [.sys.vms]Makefile.src [.src]Makefile. $ copy [.sys.vms]Makefile.utl [.util]Makefile. $ copy [.sys.vms]Makefile.dat [.dat]Makefile. $ copy [.sys.vms]Makefile.doc [.doc]Makefile. After doing that, edit [.src]Makefile and [.util]Makefile to specify pertinent compiler options in CFLAGS, linker options in LFLAGS, and libraries in LIBS and/or MORELIBS if the default values aren't right. Be sure to make compatible compilation and linking settings in both files. While in there, edit [.util]Makefile to specify the appropriate values for lex and yacc, _or_ move to that directory and use MMS or make to build targets no_lex and no_yacc which will copy several pre-processed files from [.sys.share] into [.util]. Finally, edit Makefile in the top directory to specify values for GAMEDIR and GAMEOWNER. This top Makefile invokes [.sys.vms]install.com to do much of the actual installation work, so if you want to make any customizations or file protection changes, edit install.com to suit. Also set MAKE in all of the Makefiles to the appropriate command if not using MMS or MMK. Once the Makefiles are tailored for your site, give the command $ mms all,install or $ make all install To compile and install everything. The object files compiled via the Makefiles are left as individual .OBJ files rather than placed into an object library (in contrast to step #7 above and note #10 below). These Makefiles are provided on an as-is basis; vmsbuild.com is the preferred way to compile because it's guaranteed to compile and link everything. 4. termcap is an ASCII data file containing descriptions of terminal capabilities and the escape sequences that software must use to take advantage of them. If you do not already have a termcap file in use on your system there is a small one in file [.SYS.SHARE]TERMCAP. It contains definitions for common Digital terminals, also suitable for most clones and emulators. This file is copied into the playground by install.com, and NetHack will use it if it can't find any other one. NetHack uses the following sequence to attempt to locate the termcap file: translation of the logical name TERMCAP (used as-is), file NETHACKDIR:TERMCAP, similar file HACKDIR:TERMCAP, GNU-Emacs file EMACS_LIBRARY:[ETC]TERMCAP.DAT, file []TERMCAP, and lastly file $TERMCAP (which most likely would be a logical name). If NetHack can't find the termcap file, or if the above search sequence finds a different one than you'd prefer, then use the DCL ASSIGN or DEFINE command to define a value for logical name TERMCAP. NetHack also tries fairly hard to figure out what kind of terminal you're using. It checks for logical names (or symbols) NETHACK_TERM, HACK_TERM, EMACS_TERM, and lastly TERM. The last is set up by the C run-time library and you cannot use a logical name or symbol for it. If all those fail, or if whichever one succeeds has a value of "undefined" or "unknown" (which can happen under VMS V5.4-* and V5.5-* for VT420 terminals), NetHack will query the VMS TERMTABLE database used by the SMG library routines. Whatever value NetHack eventually comes up with needs to be the name of an entry in the termcap file, otherwise a message about "Unknown terminal type" will be printed and NetHack will exit. 5. NetHack contains code which attempts to make it secure in case it's installed with privileges (to allow the playground to be protected against world write access). This has only undergone limited testing, so install NetHack with privileges at your own risk. If you discover any potential security holes, please let us know so that we can take steps to correct the problem(s). NetHack always includes filename punctuation when accessing files, so that it should never be affected by inadvertent or malicious logical name definitions, and it always deactivates installed privileges prior to spawning a subprocess. Note to end users: "installing with privileges" is an option for system managers who set up system-wide access to the game. Since CMKRNL privilege and modification of the system boot routines are both required, it is not an option for ordinary users. There are no explicit instructions on how to do such an installation, because only system managers who are already familiar with the process and its potential security ramifications should even consider it. The default setup by install.com assumes no privileges and uses world-writable files to allow arbitrary users to play. This is NOT secure and not advisable in any environment where there are untrustworthy users, but works fine for many sites. If you allow users to run NetHack from captive accounts (VMS 5.1-* or earlier) or from restricted accounts (5.2 and later), you should either make sure that they do not have TMPMBX privilege or else disable NetHack's ability to spawn an interactive subprocess. To disable subprocesses, disable the "!" (shell escape) command by commenting out the definition of SHELL in vmsconf.h prior to building the program. This necessity may be removed in some future release, where NetHack will check for captive accounts instead of spawning unconditionally. Note that disabling the SHELL command also prevents spawning MAIL when scrolls of new mail are received. In order for installed privileges to be used at all, the value of HACKDIR (via Local_HACKDIR in vmsconf.h) compiled into the program must correspond to the actual playground directory. If logical name HACKDIR (or NETHACKDIR) is used to override that value, installed privileges will be deactivated unless its value corresponds to the same device and directory as the internal value. If that internal value contains a logical name, only an executive-mode translation will be honored; if there is no such translation, installed privs will be deactivated. To be able to install nethack.exe with privileges (SYSPRV or GRPPRV, perhaps EXQUOTA, depending on site usage and needs), you'll need to link it with debugging and tracebacks both disabled. You can do this by specifying an argument to vmsbuild.com when performing step #6 above; pass it "/noTrace/noDebug" as the 4th parameter. $ @[.SYS.VMS]VMSBUILD "" "" "" "/noTrace/noDebug" /Trace/noDebug is the linker's normal default. If you've already built NetHack, you can relink with tracebacks disabled by doing $ @[.SYS.VMS]VMSBUILD "LINK" "" "" "/noTrace/noDebug" 6. If you can't or won't install nethack.exe with privileges and if you don't have access to a privileged account yourself, then if you intend to allow other users to access your copy of NetHack you should probably place an ACL on the playground directory and its save subdirectory. The access control list should contain a default protection ACE which grants delete+control access to the playground owner (ie, your own account if there's no special games account involved). install.com does not attempt to do this automatically at the present time. After executing install.com to create the playground directory, perform a pair of commands similar to the following $ SET ACL/ACL=(IDENT=your_id, OPTIONS=DEFAULT, ACCESS=R+W+E+D+C) - $_ device:[playground's.parent.directory]playground.DIR $ SET ACL/ACL=(IDENT=your_id, OPTIONS=DEFAULT, ACCESS=R+W+E+D+C) - $_ device:[playground.directory]SAVE.DIR The two commands use the same options, but SET ACL won't accept a list of files to modify. (For recent versions of VMS, SET ACL was made obsolete in favor of SET FILE/ACL, which in turn has been made obsolete in favor of SET SECURITY/CLASS=FILE/ACL; however, the older forms will still work.) 'your_id' should be the rights identifier which corresponds to the account which should retain access to those files; 'device:[playground's.parent.directory]' is the name of the parent directory for the playground (ie, if your playground directory is disk$foo:[me.games.nethack.play], then you want to specify disk$foo:[me.games.nethack]play.dir on the SET ACL command), and 'device:[playground.directory]' is the playground itself. Those ACLs establish a default protection scheme such that every newly created file in those directories will have an ACL attached to it, and the attached ACL will grant 'your_id' full access to the corresponding file. That should allow you to clear away level files from aborted games, and to delete old save files if necessary. It will not enable you to run recover.exe on behalf of other users, because you won't be able to create files owned by them unless you have elevated privileges. 7. Many NetHack commands can be aborted by sending it the character when it wants input. This is displayed as ESC inside the game. Digital VK201 keyboards (used by VT2xx and VT3xx and older VAXstations) and VK401 keyboards (used by VT4xx, newer VAXstations, and DEC's X Terminals) do not have an key. They may transmit for the key if the terminal or emulator window is set to operate in VT100 mode, or there may be a setup-type option for making the <` | ~> key behave as . If your terminal does not have that, or if it's set to a mode where that won't work, then just use instead. (Press the "[" key while holding down the "Ctrl" key, then release both; and have the same ASCII code and are indistinguishable once they reach the computer; note that VAXstations and X Terminals _can_ tell the difference, but that won't matter for NetHack.) VMS NetHack is configured to use the SYS$QIOW system service for reading characters from the keyboard. This allows ^C and ^Y (as well as ^X and ^O for wizard mode debugging) to be used as commands without being intercepted or interpreted by the terminal driver. The code which parses arrow and function keys is not perfect, and it's possible to get strange results if you hold such keys down or just type too quickly, particularly on slow multiplexor lines. Those keys are never needed in actual play, and most function keys are just treated as for use in aborting partial commands. VMS NetHack also still has code to use SMG$READ_KEYSTROKE instead. That can be activated by modifying vmsconf.h and recompiling, but it should never be necessary. If you use it, you'll need to press either or twice to abort partial commands, or else press an arbitrary function key, such as , once. If SUSPEND is defined in vmsconf.h, is used for that command. Since Unix-style job control is not available, it's used for connecting to the parent process if NetHack is running in a subprocess. When not in a subprocess, it doesn't do anything except give a message to the effect that it's not doing anything.... The suspend command does not save the current game; if you use ^Z to attach to your parent process, be sure to remember to eventually reattach to the NetHack subprocess; otherwise the game in progress won't get saved when you logout. 8. NetHack optionally maintains a logfile which receives one line appended to it whenever a game ends. This can be disabled entirely by adding an "#undef LOGFILE" directive to vmsconf.h prior to building the program, or it can be disabled later by removing the file(s) LOGFILE.;* from the playground directory. If not disabled prior to compilation, the logfile can be reinitialized by simply creating an empty file named LOGFILE in the playground, but make sure that users are able to write into it, or new entries will not be appended. 9. Some attempt at support for VMS versions earlier than V4.6 has been included, but no such obsolete system was available for testing it. vmsbuild.com detects the need for the extra support routines and arranges automatically for them to be compiled. The reason that special support is needed is that the C Run-Time Library (VAXCRTL) underwent a major revision for VMS V4.6 and several routines which NetHack utilizes were not available prior to that upgrade. 10. vmsbuild.com collects almost all of the object files (xxx.OBJ) into an object library (NETHACK.OLB) as it compiles the source files. This should prevent the quota-exceeded problems from the linker that some sites have reported for prior versions. Note that if you compile any source files manually, you'll need to replace those modules in the object library prior to linking the program: $ cc/include=[-.include] [-.sys.vms]vmstty !for example $ libr/obj []nethack vmstty !replace VMSTTY $ @[-.sys.vms]vmsbuild LINK !re-link NETHACK.EXE If you forget to replace the library entry, your newly compiled code will not be included in the new executable image. 11. To access "wizard mode"--intended for debugging purposes, not to spoil the game with unlimited wishes--you must be running from the username compiled into the game via Local_WIZARD in vmsconf.h, and you must specify "-D" on the command line when invoking NetHack. Note that -D must be uppercase, and it must be in quotes to prevent the C run-time library's program startup code from converting it into lowercase. $ @hackdir:nethack "-D" Any character name you specify will be ignored in favor of "wizard". 12. At program startup time, NetHack uses the empty file PERM to prevent two different processes from using the same character name (under the same UIC ownership) at the same time. It does this by temporarily giving that file a second directory entry named PERM.LOCK, then removing the alternate entry once started. If the PERM file is missing or inaccessible, NetHack will give a message and then quit. Several possible messages and their usual causes are: Can't find file perm;1 to lock! PERM.;1 is missing from the playground directory. Fix: reinstall the playground directory using install.com, or use CREATE or an editor to make an empty file named PERM. Version number must be 1. Can't lock perm;1 due to directory protection. The playground directory is not allowing write access. Fix: players need to be able to write files for dungeon levels and "bones" into the playground directory. Set the protection or ACL on the xxx.DIR;1 file in the playground's parent directory to allow write access. Can't unlink perm.lock;1. The empty file PERM.;1 is protected against delete access; only matters under some versions of VMS. Fix: set the protection or ACL on PERM.;1 to allow delete access to players. Under VMS V5.5-2, delete access is not necessary. PERM does not have to remain writable. Waiting for access to perm;1. (# retries left). If some other process is also starting up NetHack at about the same time, you may have to wait a short period. NetHack will retry once per second, counting down to 0. If 0 is reached, the message Perhaps there is an old perm.lock;1 around? will be displayed and then NetHack will give up. Fix: to forcibly remove a stale PERM.LOCK entry, issue the following command $ SET FILE/REMOVE PERM.LOCK;1 from the playground directory. The file PERM should remain intact. Do not use that command for real files, only alternate directory entries. If output from a DIRECTORY command on the playground reports PERM.LOCK;1 no such file then someone has deleted PERM.;1 while the synonym entry was still in place, and PERM.LOCK was left as a dangling name which no longer points at any file. The SET FILE/REMOVE command above will fix the dangling name; a new PERM.;1 will need to be created as mentioned above. In similar fashion, synchronized access to the scoreboard file RECORD is accomplished using temporary entry RECORD.LOCK and LOGFILE using entry LOGFILE.LOCK. 13. Unless you have both Motif and the Athena Widget set from MIT, you will not be able to use the X11 interface on VMS. Even if you do have both those things, such a configuration has not been tested and there are no provisions for it in vmsbuild.com. Makefile.src does have the extra source files listed, but not the necessary libraries. The X11 port will not compile and link with DECwindows, but it will be able to display on a VMS DECwindows X server provided that it and its Unix X client have a compatible transport between them (either TCP/IP added to VMS or DECnet added to Unix) and session security is set up appropriately. You'll need to add the contents of file [.win.X11]SlashEM.ad into your DECW$USER_DEFAULTS:DECW$XDEFAULTS.DAT, and modify some of the lines. The DECwindows window manager does not support having input focus automatically follow the pointer, so you should uncomment the "NetHack*autofocus" resource line. (For Motif this may not be necessary, depending on customization options.) Uncommenting the "NetHack*slow" line is highly recommended. You'll also need to set "NetHack*fonts: fixed" (rather than "variable"), and either set the map font to "fixed" too or install the "nh10" font that comes in file [.win.X11]nh10.bdf. If NetHack warns that the map font is variable, then something isn't set up properly. After creating or modifying decw$xdefaults.dat, you must restart the window manager in order for any changes to take effect; it's easiest to just make the session manager quit and then log in again. 14. If necessary, send problem reports via e-mail to Always include version information for NetHack, the operating system, and the C compiler used. 20-OCT-2003 slashem-0.0.7E7F3/sys/vms/nethack.com0000775000076400007640000000451210545462317015421 0ustar aliali$! NetHack.Com -- sample command procedure for invoking NetHack 9-JAN-1993 $ v = 'f$verify(0)' $! $! Possible command line arguments include $! "-uConan-B" !play a barbarian named Conan $! "-u" "Merlin-W" !play a wizard named Merlin (slight variant of above) $! "-e" or "-E" !play an elf with default name (from environment $! ! [ie, NETHACKOPTIONS logical name] or VMS username) $! "-a" or "-A", "-b" or "-B", "-c" or "-C", ... !specify character type $! !note: "-s" is ambiguous between "play as a samurai" $! ! vs "show scoreboard", so use "-S" for the former $! "-x" or "-X" !play in 'explore' mode (practice for beginners) $! "-D" !play in 'wizard' mode (for debugging, available only $! ! to the username compiled into nethack.exe as WIZARD) $! "-dec" !turn on DECgraphics mode (VT100 line drawing, done $! ! automatically below if appropriate term attribs set) $! "-d" dir-path !specify an alternate playground directory (not $! ! recommended; define HACKDIR instead) $! $ $! $! assume this command procedure has been placed in the playground directory; $! get its device:[directory] $ hackdir = f$parse("_._;0",f$environ("PROCEDURE")) - "_._;0" $! $! hackdir should point to the 'playground' directory $ if f$trnlnm("HACKDIR").eqs."" then define hackdir 'hackdir' $! $! termcap is a text file defining terminal capabilities and escape sequences $ if f$trnlnm("TERMCAP").eqs."" then define termcap hackdir:termcap $! ! [ obsolete: now handled within nethack itself ] ! $! prior to VMS v6, the C Run-Time Library doesn't understand vt420 :-( ! $ TT$_VT400_Series = 113 ! $ if f$getdvi("TT:","DEVTYPE").eq.TT$_VT400_Series - ! .and. f$trnlnm("NETHACK_TERM").eqs."" then define nethack_term "vt400" $! $! use the VT100 line drawing character set if possible $ graphics = "" $ usropt = f$trnlnm("NETHACKOPTIONS") $ if usropt.eqs."" then usropt = f$trnlnm("HACKOPTIONS") $ if f$locate("DECG",f$edit(usropt,"UPCASE")) .ge. f$length(usropt) then - if f$getdvi("TT:","TT_DECCRT") .and. f$getdvi("TT:","TT_ANSICRT") then - $ graphics = " -dec" !select DECgraphics mode by default $! $! get input from the terminal, not from this .com file $ deassign sys$input $! $ nethack := $hackdir:nethack $ if p1.nes."-s" .and. p1.nes."-s all" then - nethack = nethack + graphics $ nethack "''p1'" "''p2'" "''p3'" "''p4'" "''p5'" "''p6'" "''p7'" "''p8'" $! slashem-0.0.7E7F3/sys/vms/vmsmail.c0000664000076400007640000004100310545462317015111 0ustar aliali/* SCCS Id: @(#)vmsmail.c 3.4 1995/06/01 */ /* Copyright (c) Robert Patrick Rankin, 1991. */ /* NetHack may be freely redistributed. See license for details. */ #include "config.h" #include "mail.h" /* lint supression due to lack of extern.h */ unsigned long NDECL(init_broadcast_trapping); unsigned long NDECL(enable_broadcast_trapping); unsigned long NDECL(disable_broadcast_trapping); struct mail_info *NDECL(parse_next_broadcast); #ifdef MAIL #include "wintype.h" #include "winprocs.h" #include #include #include # ifndef __GNUC__ #include # else # define MSG$_TRMHANGUP 6 # define MSG$_TRMBRDCST 83 # endif /*__GNUC__*/ #include /* #include */ # define vms_ok(sts) ((sts)&1) static struct mail_info *FDECL(parse_brdcst, (char *)); static void FDECL(filter_brdcst, (char *)); static void NDECL(flush_broadcasts); static void FDECL(broadcast_ast, (int)); extern char *FDECL(eos, (char *)); extern char *FDECL(strstri, (const char *,const char *)); extern int FDECL(strncmpi, (const char *,const char *,int)); extern size_t FDECL(strspn, (const char *,const char *)); #ifndef __DECC extern int VDECL(sscanf, (const char *,const char *,...)); #endif extern unsigned long smg$create_pasteboard(), smg$get_broadcast_message(), smg$set_broadcast_trapping(), smg$disable_broadcast_trapping(); extern volatile int broadcasts; /* defining declaration in mail.c */ static long pasteboard_id = 0; /* SMG's magic cookie */ /* * Mail (et al) overview: * * When a broadcast is asynchronously captured, a volatile counter * ('broadcasts') is incremented. Each player turn, ckmailstatus() polls * the counter and calls parse_next_broadcast() if it's positive; this * returns some display text, object name, and response command, which is * passed to newmail(). Routine newmail() generates a mail-daemon monster * who approaches the character, "speaks" the display text, and delivers * a scroll of mail pre-named to the object name; the response command is * initially appended to the name, so that the object is tagged with both * of them; a NUL is inserted to terminate the ordinary name and hide the * command. (If the player renames such a scroll, the hidden command will * be lost; who cares?) Unrecognized broadcasts result in the mail-daemon * arriving and announcing the display text, but no scroll being created. * If SHELL is undefined, then all broadcasts are treated as 'other'; since * no subproceses are allowed, there'd be no way to respond to the scroll. * * When a scroll of mail is read by the character, readmail() extracts * the hidden command string and uses it for the default when prompting the * player for a system command to spawn. The player may enter any command * he or she chooses, or just to accept the default or to * avoid executing any command. If the command is "SPAWN", a regular shell * escape to DCL is performed; otherwise, the indicated single command is * spawned. Either way, NetHack resumes play when the subprocess terminates * or explicitly reattaches to its parent. * * Broadcast parsing: * * The following broadcast messages are [attempted to be] recognized: * text fragment name for scroll default command * New mail VMSmail MAIL * New ALL-IN-1 MAIL A1mail A1M * Software Tools mail STmail MSG [+folder] * MM mail MMmail MM * WPmail: New mail WPmail OFFICE/MAIL * **M400 mail M400mail M400 * " mail", ^"mail " unknown mail SPAWN * " phoning" Phone call PHONE ANSWER * talk-daemon...by...foo Talk request TALK[/OLD] foo@bar * (node)user - Bitnet noise XYZZY user@node * Anything else results in just the message text being passed along, no * scroll of mail so consequently no command to execute when scroll read. * The user can set up ``$ XYZZY :== SEND'' prior to invoking NetHack if * vanilla JNET responses to Bitnet messages are prefered. * * Static return buffers are used because only one broadcast gets * processed at a time, and the essential information in each one is * either displayed and discarded or copied into a scroll-of-mail object. * * The test driver code below can be used to check out potential new * entries without rebuilding NetHack itself. CC/DEFINE="TEST_DRIVER" * Link it with hacklib.obj or nethack.olb/incl=hacklib (not nethack/lib). */ static struct mail_info msg; /* parse_*()'s return buffer */ static char nam_cmd_buf[63], /* maximum onamelth, size of ONAME(object) */ txt_buf[255+1]; /* same size as used for message buf[] */ /* try to decipher and categorize broadcast message text */ static struct mail_info * parse_brdcst(buf) /* called by parse_next_broadcast() */ char *buf; /* input: filtered broadcast text */ { int typ; char *txt; const char *nam, *cmd; # ifdef SHELL /* only parse if spawned commands are enabled */ register char *p, *q; boolean is_jnet_send; char cmd_buf[127+1], user[127+1], node[127+1], sentinel; /* Check these first; otherwise, their arbitrary text would enable easy spoofing of some other message patterns. Unfortunately, any home-grown broadcast delivery program poses a similar risk. */ if (!strncmpi(buf, "reply received", 14)) goto other; is_jnet_send = (sscanf(buf, "(%[^)])%s -%c", node, user, &sentinel) == 3); if (is_jnet_send) goto jnet_send; /* scan the text more or less by brute force */ if ((q = strstri(buf, " mail")) != 0 || /* all known mail broadcasts */ !strncmpi(q = buf, "mail ", 5)) { /* unexpected alternative */ typ = MSG_MAIL; p = strstri(q, " from"); txt = p ? strcat(strcpy(txt_buf, "Mail for you"), p) : (char *) 0; if (!strncmpi(buf, "new mail", 8)) { /* New mail [on node FOO] from [SPAM::]BAR [\"personal_name\"] [\(HH:MM:SS\)] */ nam = "VMSmail"; /* assume VMSmail */ cmd = "MAIL"; if (txt && (p = strrchr(txt, '(')) > txt && /* discard time */ (--p, strspn(p, "0123456789( :.)") == strlen(p))) *p = '\0'; } else if (!strncmpi(buf, "new all-in-1", 12)) { int i; /* New ALL-IN-1 MAIL message [on node FOO] from Personal Name \(BAR@SPAM\) [\(DD-MMM-YYYY HH:MM:SS\)] */ nam = "A1mail"; cmd = "A1M"; if (txt && (p = strrchr(txt, '(')) > txt && /* discard date+time */ sscanf(p-1," (%*d-%*[^-]-%*d %*d:%*d:%d) %c",&i,&sentinel) == 1) *--p = '\0'; } else if (!strncmpi(buf, "software tools", 14)) { /* Software Tools mail has arrived on FOO from \'BAR\' [in SPAM] */ nam = "STmail"; cmd = "MSG"; if (txt && (p = strstri(p, " in ")) != 0) /* specific folder */ cmd = strcat(strcpy(cmd_buf, "MSG +"), p + 4); } else if (q - 2 >= buf && !strncmpi(q - 2, "mm", 2)) { /* {MultiNet\ |PMDF\/}MM mail has arrived on FOO from BAR\n [Subject: subject_text] (PMDF only) */ nam = "MMmail"; /* MultiNet's version of MM */ cmd = "MM"; /*{ perhaps "MM READ"? }*/ } else if (!strncmpi(buf, "wpmail:", 7)) { /* WPmail: New mail from BAR. subject_text */ nam = "WPmail"; /* WordPerfect [sic] Office */ cmd = "OFFICE/MAIL"; } else if (!strncmpi(buf, "**m400 mail", 7)) { /* **M400 mail waiting** */ nam = "M400mail"; /* Messenger 400 [not seen] */ cmd = "M400"; } else { /* not recognized, but presumed to be mail */ nam = "unknown mail"; cmd = "SPAWN"; /* generic escape back to DCL */ txt = (char *) 0; /* don't rely on "from" info here */ } if (!txt) txt = strcat(strcpy(txt_buf, "Mail for you: "), buf); /* : end of mail recognition; now check for call-type interruptions... */ } else if ((q = strstri(buf, " phoning")) != 0) { /* BAR is phoning you [on FOO] \(HH:MM:SS\) */ typ = MSG_CALL; nam = "Phone call"; cmd = "PHONE ANSWER"; if (!strncmpi(q + 8, " you", 4)) q += (8 + 4), *q = '\0'; txt = strcat(strcpy(txt_buf, "Do you hear ringing? "), buf); } else if ((q = strstri(buf, " talk-daemon")) != 0 || (q = strstri(buf, " talk_daemon")) != 0) { /* Message from TALK-DAEMON@FOO at HH:MM:SS\n Connection request by BAR@SPAM\n \[Respond with: TALK[/OLD] BAR@SPAM\] */ typ = MSG_CALL; nam = "Talk request"; /* MultiNet's TALK and/or TALK/OLD */ cmd = "TALK"; if ((p = strstri(q, " by ")) != 0) { txt = strcat(strcpy(txt_buf, "Talk request from"), p + 3); if ((p = strstri(p, "respond with")) != 0) { if (*(p-1) == '[') *(p-1) = '\0'; else *p = '\0'; /* terminate */ p += (sizeof "respond with" - sizeof ""); if (*p == ':') p++; if (*p == ' ') p++; cmd = strcpy(cmd_buf, p); /* "TALK[/OLD] bar@spam" */ p = eos(cmd_buf); if (*--p == ']') *p = '\0'; } } else txt = strcat(strcpy(txt_buf, "Pardon the interruption: "), buf); } else if (is_jnet_send) { /* sscanf(,"(%[^)])%s -%c",,,)==3 */ jnet_send: /* \(SPAM\)BAR - arbitrary_message_text (from BAR@SPAM) */ typ = MSG_CALL; nam = "Bitnet noise"; /* RSCS/NJE message received via JNET */ Sprintf(cmd_buf, "XYZZY %s@%s", user, node); cmd = cmd_buf; /*{ perhaps just vanilla SEND instead of XYZZY? }*/ Sprintf(txt_buf, "Message from %s@%s:%s", user, node, &buf[1+strlen(node)+1+strlen(user)+2-1]); /* "(node)user -" */ txt = txt_buf; /* : end of call recognition; anything else is none-of-the-above... */ } else { other: # endif /* SHELL */ /* arbitrary broadcast: batch job completed, system shutdown imminent, &c */ typ = MSG_OTHER; nam = (char *) 0; /*"captured broadcast message"*/ cmd = (char *) 0; txt = strcat(strcpy(txt_buf, "Message for you: "), buf); # ifdef SHELL } /* Daemon in newmail() will append period when the text is displayed */ if ((p = eos(txt)) > txt && *--p == '.') *p = '\0'; /* newmail() and readmail() assume that nam and cmd are concatenated */ if (nam) { /* object name to attach to scroll of mail */ char *join = strcpy(nam_cmd_buf, nam); if (cmd) { /* append command to name; readmail() requires it */ int len = sizeof nam_cmd_buf - sizeof "" - (strlen(join) + 1); cmd_buf[len] = '\0'; /* possibly truncate */ (void) strcat(join, " "); cmd = strcpy(eos(join), cmd); } nam = join; } # endif /* SHELL */ /* truncate really long messages to prevent verbalize() from blowing up */ if (txt && strlen(txt) > BUFSZ - 50) txt[BUFSZ - 50] = '\0'; msg.message_typ = typ; /* simple index */ msg.display_txt = txt; /* text for daemon to pline() */ msg.object_nam = nam; /* 'name' for mail scroll */ msg.response_cmd = cmd; /* command to spawn when scroll read */ return &msg; } /* filter out non-printable characters and redundant noise */ static void filter_brdcst(buf) /* called by parse_next_broadcast() */ register char *buf; /* in: original text; out: filtered text */ { register char c, *p, *buf_p; /* filter the text; restrict consecutive spaces or dots to just two */ for (p = buf_p = buf; *buf_p; buf_p++) { c = *buf_p & '\177'; if (c == ' ' || c == '\t' || c == '\n') if (p == buf || /* ignore leading whitespace */ (p >= buf+2 && *(p-1) == ' ' && *(p-2) == ' ')) continue; else c = ' '; else if (c == '.' || c < ' ' || c == '\177') if (p == buf || /* skip leading beeps & such */ (p >= buf+2 && *(p-1) == '.' && *(p-2) == '.')) continue; else c = '.'; else if (c == '%' && /* trim %%% OPCOM verbosity %%% */ p >= buf+2 && *(p-1) == '%' && *(p-2) == '%') continue; *p++ = c; } *p = '\0'; /* terminate, then strip trailing junk */ while (p > buf && (*--p == ' ' || *p == '.')) *p = '\0'; return; } static char empty_string[] = ""; /* fetch the text of a captured broadcast, then mangle and decipher it */ struct mail_info * parse_next_broadcast() /* called by ckmailstatus(mail.c) */ { short length, msg_type; $DESCRIPTOR(message, empty_string); /* string descriptor for buf[] */ struct mail_info *result = 0; /* messages could actually be longer; let long ones be truncated */ char buf[255+1]; message.dsc$a_pointer = buf, message.dsc$w_length = sizeof buf - 1; msg_type = length = 0; smg$get_broadcast_message(&pasteboard_id, &message, &length, &msg_type); if (msg_type == MSG$_TRMBRDCST) { buf[length] = '\0'; filter_brdcst(buf); /* mask non-printable characters */ result = parse_brdcst(buf); /* do the real work */ } else if (msg_type == MSG$_TRMHANGUP) { (void) gsignal(SIGHUP); } return result; } /* spit out any pending broadcast messages whenever we leave */ static void flush_broadcasts() /* called from disable_broadcast_trapping() */ { if (broadcasts > 0) { short len, typ; $DESCRIPTOR(msg_dsc, empty_string); char buf[512+1]; msg_dsc.dsc$a_pointer = buf, msg_dsc.dsc$w_length = sizeof buf - 1; raw_print(""); /* print at least one line for wait_synch() */ do { typ = len = 0; smg$get_broadcast_message(&pasteboard_id, &msg_dsc, &len, &typ); if (typ == MSG$_TRMBRDCST) buf[len] = '\0', raw_print(buf); } while (--broadcasts); wait_synch(); /* prompt with "Hit return to continue: " */ } } /* AST routine called when the terminal's associated mailbox receives a message */ /*ARGSUSED*/ static void broadcast_ast(dummy) /* called asynchronously by terminal driver */ int dummy; /* not used */ { broadcasts++; } /* initialize the broadcast manipulation code; SMG makes this easy */ unsigned long init_broadcast_trapping() /* called by setftty() [once only] */ { unsigned long sts, preserve_screen_flag = 1; /* we need a pasteboard to pass to the broadcast setup/teardown routines */ sts = smg$create_pasteboard(&pasteboard_id, 0, 0, 0, &preserve_screen_flag); if (!vms_ok(sts)) { errno = EVMSERR, vaxc$errno = sts; raw_print(""); perror("?can't create SMG pasteboard for broadcast trapping"); wait_synch(); broadcasts = -1; /* flag that trapping is currently broken */ } return sts; } /* set up the terminal driver to deliver $brkthru data to a mailbox device */ unsigned long enable_broadcast_trapping() /* called by setftty() */ { unsigned long sts = 1; if (broadcasts >= 0) { /* (-1 => no pasteboard, so don't even try) */ /* register callback routine to be triggered when broadcasts arrive */ /* Note side effect: also intercepts hangup notification. */ /* Another note: TMPMBX privilege is required. */ sts = smg$set_broadcast_trapping(&pasteboard_id, broadcast_ast, 0); if (!vms_ok(sts)) { errno = EVMSERR, vaxc$errno = sts; raw_print(""); perror("?can't enable broadcast trapping"); wait_synch(); } } return sts; } /* return to 'normal'; $brkthru data goes straight to the terminal */ unsigned long disable_broadcast_trapping() /* called by settty() */ { unsigned long sts = 1; if (broadcasts >= 0) { /* disable trapping; releases associated MBX so that SPAWN can work */ sts = smg$disable_broadcast_trapping(&pasteboard_id); if (!vms_ok(sts)) errno = EVMSERR, vaxc$errno = sts; flush_broadcasts(); /* don't hold on to any buffered ones */ } return sts; } #else /* MAIL */ /* simple stubs for non-mail configuration */ unsigned long init_broadcast_trapping() { return 1; } unsigned long enable_broadcast_trapping() { return 1; } unsigned long disable_broadcast_trapping() { return 1; } struct mail_info *parse_next_broadcast() { return 0; } #endif /* MAIL */ /*----------------------------------------------------------------------*/ #ifdef TEST_DRIVER /* (Take parse_next_broadcast for a spin. :-) */ volatile int broadcasts = 0; void newmail(foo) struct mail_info *foo; { # define STRING(s) ((s) ? (s) : "") printf("\n\ message type = %d\n\ display text = \"%s\"\n\ object name = \"%.*s\"\n\ response cmd = \"%s\"\n\ ", foo->message_typ, STRING(foo->display_txt), (foo->object_nam && foo->response_cmd) ? (foo->response_cmd - foo->object_nam - 1) : strlen(STRING(foo->object_nam)), STRING(foo->object_nam), STRING(foo->response_cmd)); # undef STRING } void ckmailstatus() { struct mail_info *brdcst, *parse_next_broadcast(); while (broadcasts > 0) { /* process all trapped broadcasts [until] */ broadcasts--; if ((brdcst = parse_next_broadcast()) != 0) { newmail(brdcst); break; /* only handle one real message at a time */ } else printf("\n--< non-broadcast encountered >--\n"); } } int main() { char dummy[BUFSIZ]; init_broadcast_trapping(); enable_broadcast_trapping(); for (;;) { ckmailstatus(); printf("> "), fflush(stdout); /* issue a prompt */ if (!gets(dummy)) break; /* wait for a response */ } disable_broadcast_trapping(); return 1; } void panic(s) char *s; { raw_print(s); exit(EXIT_FAILURE); } void raw_print(s) char *s; { puts(s); fflush(stdout); } void wait_synch() { char dummy[BUFSIZ]; printf("\nPress to continue: "); fflush(stdout); (void) gets(dummy); } #endif /* TEST_DRIVER */ /*vmsmail.c*/ slashem-0.0.7E7F3/sys/os2/0000775000076400007640000000000010545462317013175 5ustar alialislashem-0.0.7E7F3/sys/os2/nhpmico.uu0000664000076400007640000000237110545462317015210 0ustar alialibegin 644 nethack.ico M0D$H``````````````!#21H`````````>`````P````@`$```0`!`````/___ M_T-)&@````````!X`0``#````"``(``!``0```````"``(```("`@```@`"`L M@(``@("`P,#```#_`/\``/___P``_P#___\`____````````````````````! M````````````````````````````````````````````````````````````` M````````````````````````````````````````````````````````````` M````````````````````````````````````````````````````````````` M````````````````````````````````````````````````````````````` M````````````````````````````````````````````````````````````` M`````````````````````/9F9F9F9F9F9F9F9F9F9F;_9F9F9F9F9F9F9F9F7 M9F9F_XB(B(B(B(B(B(B(B(AF9O^(B(B(B(B(B(B(B(B(9F;_B(B(B(5558B(" MB(B(B&9F_XB(B(@`506(B(B(B(AF9O^(B(B(```%B(B(B(B(9F;_B(A555``@ M55B(B(B(B&9F_XB+N[NP#N-5B(B(B(AF9O^(N[N[`+[N-5B(B(B(9F;_B[N[E MN[N[[N-8B(B(B&9F_XN[N[N[N[[N4XB(B(AF9O^+N[N9F9N[[N,XB(B(9F;_) MB[NYF9F9N[[N,XB(B&9F_XN[F9F9F9N[[N,XB(AF9O^+N9F9F9F9NU[N,XB(< M9F;_B[F9F9F9F;M8[N,XB&9F_XNYF9F9F9F[6([N,XAF9O^+N9F9F9F9NUB(] M[N.(9F;_B[F9F9F9F;M8B([NB&9F_XN[F9F9F9N[6(B([HAF9O^+N[F9F9F[# MNUB(B(B(9F;_B[N[F9F;N[M8B(B(B&9F_XN[N[N[N[N[6(B(B(AF9O^+N[N[) MN[N[NXB(B(B(9F;_B[N(B(B(B[N(B(B(B&9F_XNXB(B(B(B[B(B(B(AF9O^(/ MB(B(B(B(B(B(B(B(9F;_B(B(B(B(B(B(B(B(B&9F_XB(B(B(B(B(B(B(B(AFN A9O__________________]F;_____________________? `` end slashem-0.0.7E7F3/sys/os2/os2.c0000664000076400007640000001601010545462317014042 0ustar aliali/* 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. */ /* * OS/2 system functions. */ #define NEED_VARARGS #include "hack.h" #ifdef OS2 #include "tcap.h" /* OS/2 system definitions */ #ifdef __EMX__ #undef CLR_BLACK #undef CLR_WHITE #undef CLR_BLUE #undef CLR_RED #undef CLR_GREEN #undef CLR_CYAN #undef CLR_YELLOW #undef CLR_BROWN #endif #include "def_os2.h" #include static char NDECL(DOSgetch); static char NDECL(BIOSgetch); int tgetch() { char ch; /* BIOSgetch can use the numeric key pad on IBM compatibles. */ if (iflags.BIOS) ch = BIOSgetch(); else ch = DOSgetch(); return ((ch == '\r') ? '\n' : ch); } /* * Keyboard translation tables. */ #define KEYPADLO 0x47 #define KEYPADHI 0x53 #define PADKEYS (KEYPADHI - KEYPADLO + 1) #define iskeypad(x) (KEYPADLO <= (x) && (x) <= KEYPADHI) /* * Keypad keys are translated to the normal values below. * When iflags.BIOS is active, shifted keypad keys are translated to the * shift values below. */ static const struct pad { char normal, shift, cntrl; } keypad[PADKEYS] = { {'y', 'Y', C('y')}, /* 7 */ {'k', 'K', C('k')}, /* 8 */ {'u', 'U', C('u')}, /* 9 */ {'m', C('p'), C('p')}, /* - */ {'h', 'H', C('h')}, /* 4 */ {'g', 'g', 'g'}, /* 5 */ {'l', 'L', C('l')}, /* 6 */ {'p', 'P', C('p')}, /* + */ {'b', 'B', C('b')}, /* 1 */ {'j', 'J', C('j')}, /* 2 */ {'n', 'N', C('n')}, /* 3 */ {'i', 'I', C('i')}, /* Ins */ {'.', ':', ':'} /* Del */ }, numpad[PADKEYS] = { {'7', M('7'), '7'}, /* 7 */ {'8', M('8'), '8'}, /* 8 */ {'9', M('9'), '9'}, /* 9 */ {'m', C('p'), C('p')}, /* - */ {'4', M('4'), '4'}, /* 4 */ {'g', 'G', 'g'}, /* 5 */ {'6', M('6'), '6'}, /* 6 */ {'p', 'P', C('p')}, /* + */ {'1', M('1'), '1'}, /* 1 */ {'2', M('2'), '2'}, /* 2 */ {'3', M('3'), '3'}, /* 3 */ {'i', 'I', C('i')}, /* Ins */ {'.', ':', ':'} /* Del */ }; /* * Unlike Ctrl-letter, the Alt-letter keystrokes have no specific ASCII * meaning unless assigned one by a keyboard conversion table, so the * keyboard BIOS normally does not return a character code when Alt-letter * is pressed. So, to interpret unassigned Alt-letters, we must use a * scan code table to translate the scan code into a letter, then set the * "meta" bit for it. -3. */ #define SCANLO 0x10 #define SCANHI 0x32 #define SCANKEYS (SCANHI - SCANLO + 1) #define inmap(x) (SCANLO <= (x) && (x) <= SCANHI) static const char scanmap[SCANKEYS] = { /* ... */ 'q','w','e','r','t','y','u','i','o','p','[',']', '\n', 0, 'a','s','d','f','g','h','j','k','l',';','\'', '`', 0, '\\', 'z','x','c','v','b','N','m' /* ... */ }; /* * BIOSgetch emulates the MSDOS way of getting keys directly with a BIOS call. */ #define SHIFT_KEY (0x1 | 0x2) #define CTRL_KEY 0x4 #define ALT_KEY 0x8 static char BIOSgetch() { unsigned char scan, shift, ch; const struct pad *kpad; KBDKEYINFO CharData; USHORT IOWait = 0; HKBD KbdHandle = 0; KbdCharIn(&CharData,IOWait,KbdHandle); ch = CharData.chChar; scan = CharData.chScan; shift = CharData.fsState; /* Translate keypad keys */ if (iskeypad(scan)) { kpad = iflags.num_pad ? numpad : keypad; if (shift & SHIFT_KEY) ch = kpad[scan - KEYPADLO].shift; else if (shift & CTRL_KEY) ch = kpad[scan - KEYPADLO].cntrl; else ch = kpad[scan - KEYPADLO].normal; } /* Translate unassigned Alt-letters */ if ((shift & ALT_KEY) && !ch) { if (inmap(scan)) ch = scanmap[scan - SCANLO]; return (isprint(ch) ? M(ch) : ch); } return ch; } static char DOSgetch() { KBDKEYINFO CharData; USHORT IOWait = 0; HKBD KbdHandle = 0; KbdCharIn(&CharData,IOWait,KbdHandle); if (CharData.chChar == 0) { /* an extended code -- not yet supported */ KbdCharIn(&CharData,IOWait,KbdHandle); /* eat the next character */ CharData.chChar = 0; /* and return a 0 */ } return (CharData.chChar); } char switchar() { return '/'; } int kbhit() { KBDKEYINFO CharData; HKBD KbdHandle = 0; KbdPeek(&CharData,KbdHandle); return (CharData.fbStatus & (1 << 6)); } long freediskspace(path) char *path; { FSALLOCATE FSInfoBuf; #ifdef OS2_32BITAPI ULONG #else USHORT #endif DriveNumber, FSInfoLevel = 1, res; if (path[0] && path[1] == ':') DriveNumber = (toupper(path[0]) - 'A') + 1; else DriveNumber = 0; res = #ifdef OS2_32BITAPI DosQueryFSInfo(DriveNumber,FSInfoLevel,(PVOID)&FSInfoBuf,(ULONG)sizeof(FSInfoBuf)); #else DosQFSInfo(DriveNumber,FSInfoLevel,(PBYTE)&FSInfoBuf,(USHORT)sizeof(FSInfoBuf)); #endif if (res) return -1L; /* error */ else return ((long) FSInfoBuf.cSectorUnit * FSInfoBuf.cUnitAvail * FSInfoBuf.cbSector); } /* * Functions to get filenames using wildcards */ #ifdef OS2_32BITAPI static FILEFINDBUF3 ResultBuf; #else static FILEFINDBUF ResultBuf; #endif static HDIR DirHandle; int findfirst(path) char *path; { #ifdef OS2_32BITAPI ULONG #else USHORT #endif res, SearchCount = 1; DirHandle = 1; res = #ifdef OS2_32BITAPI DosFindFirst((PSZ)path,&DirHandle,0L,(PVOID)&ResultBuf,(ULONG)sizeof(ResultBuf),&SearchCount,1L); #else DosFindFirst((PSZ)path,&DirHandle,0,&ResultBuf,(USHORT)sizeof(ResultBuf),&SearchCount,0L); #endif return(!res); } int findnext() { #ifdef OS2_32BITAPI ULONG #else USHORT #endif res, SearchCount = 1; res = #ifdef OS2_32BITAPI DosFindNext(DirHandle,(PVOID)&ResultBuf,(ULONG)sizeof(ResultBuf),&SearchCount); #else DosFindNext(DirHandle,&ResultBuf,(USHORT)sizeof(ResultBuf),&SearchCount); #endif return(!res); } char * foundfile_buffer() { return(ResultBuf.achName); } long filesize(file) char *file; { if (findfirst(file)) { return (* (long *) (ResultBuf.cbFileAlloc)); } else return -1L; } /* * Chdrive() changes the default drive. */ void chdrive(str) char *str; { char *ptr; char drive; if ((ptr = index(str, ':')) != (char *)0) { drive = toupper(*(ptr - 1)); #ifdef OS2_32BITAPI DosSetDefaultDisk((ULONG)(drive - 'A' + 1)); #else DosSelectDisk((USHORT)(drive - 'A' + 1)); #endif } } void disable_ctrlP() { KBDINFO KbdInfo; HKBD KbdHandle = 0; if (!iflags.rawio) return; KbdInfo.cb = sizeof(KbdInfo); KbdGetStatus(&KbdInfo,KbdHandle); KbdInfo.fsMask &= 0xFFF7; /* ASCII off */ KbdInfo.fsMask |= 0x0004; /* BINARY on */ KbdSetStatus(&KbdInfo,KbdHandle); } void enable_ctrlP() { KBDINFO KbdInfo; HKBD KbdHandle = 0; if (!iflags.rawio) return; KbdInfo.cb = sizeof(KbdInfo); KbdGetStatus(&KbdInfo,KbdHandle); KbdInfo.fsMask &= 0xFFFB; /* BINARY off */ KbdInfo.fsMask |= 0x0008; /* ASCII on */ KbdSetStatus(&KbdInfo,KbdHandle); } void get_scr_size() { VIOMODEINFO ModeInfo; HVIO VideoHandle = 0; ModeInfo.cb = sizeof(ModeInfo); (void) VioGetMode(&ModeInfo,VideoHandle); CO = ModeInfo.col; LI = ModeInfo.row; } void gotoxy(x,y) int x,y; { HVIO VideoHandle = 0; x--; y--; /* (0,0) is upper right corner */ (void) VioSetCurPos(x, y, VideoHandle); } char* get_username(lan_username_size) int *lan_username_size; { return (char*)0; } #ifdef X11_GRAPHICS int errno; #endif #endif /* OS2 */ slashem-0.0.7E7F3/sys/os2/Install.os20000664000076400007640000002602110545462317015231 0ustar aliali ========================================================================= Instructions for compiling and installing NetHack 3.4 on an OS/2 system ========================================================================= Timo Hakulinen (Last revision: 29 October 1996) Revised for Slash'EM 0.0.7 by Pekka Rousu (update: 2 September 2003) --------------- Quick configure --------------- 1. Run "setup.cmd" located in sys\os2. 2. Run "dmake" to compile the game. -------------------- Detailed explanation -------------------- 0. Read this entire file before starting, and come back to the Notes below if you have any problems. 1. Make sure all the Slash'EM files are in the appropriate directory structure. You should have a top directory (e.g. slashem, or whatever you like) with subdirectories dat, doc, include, src, util, sys\share, sys\os2, and win\tty. You may have other subdirectories under sys and win, but they will not affect compilation for an OS/2 system. If you do not follow this structure, the makefile will not function properly. The .c files for the main program belong in src, those for utility programs in util, and OS/2-specific ones in sys\os2. All the .h files belong in include, the documentation in doc, and assorted data files in dat. There are also some necessary files in sys\share (pc*.c, random.c, dgn_*.*, lev_*.*). A more detailed explanation of the directory structure is found in file Files, which should be in the top directory. 2. The makefile for OS/2, Makefile.os2, is found in directory sys\os2. Copy it to directory src and rename it Makefile. From now on, Makefile.os2 will be referred to as "the makefile" in this document. The makefile supports the following make utilities: DMAKE a public domain make for DOS and OS/2 by Dennis Vadura DMAKE is available at major archive sites. The following compilers are supported: compiler: runs in: compiles for: emx 0.9d with GCC 2.8.1 or 3.2.1 OS/2 2.x, Warp OS/2 2.x, Warp If you're using some other compiler than one listed above, you will have to adapt the makefile to your needs. In particular, change the CC, CFLAGS, LINK, and LFLAGS macros to your C compiler's and linker's liking. See the makefile for more information. If you are going to be constructing Fred Fish's termcap library, you'll need Makefile.lib in sys\share (see note 3). 3. Go to the include subdirectory. First edit config.h according to the comments to match your desired set of features. If your compiler is ANSI compliant (like practically all OS/2 compilers are), it's probable that nothing else needs to be configured in config.h. Next look at os2conf.h. This file shouldn't need much changing. If you want to use the hardcoded OS/2 system definitions in def_os2.h instead of the compiler's standard headers, comment out OS2_USESYSHEADERS. This may become necessary if you are using a compiler which doesn't come with proper system headers by default. In this case you may have to edit the definitions there, because every compiler has its own way of declaring the necessary system functions and data structures. In general you should prefer the compiler's offerings, if possible. If you are using a 32 bit compiler other than GCC emx or C Set/2 in OS/2 2.x, force OS2_32BITAPI to be defined. Otherwise it is defined only for the above mentioned compilers. If you are not going to include random.c, because you are using the random number generator provided by your compiler, you will need to comment out RANDOM. If you want to muck with different termcap settings, uncomment TERMLIB to enable the use of termcap routines (see note 3). This is not necessary to create a fully functional game, however. 4. If you are using another compiler than MSC, GCC, or IBM C Set/2, you may want to look through system.h in the include directory. This file matches the return and parameter types for system calls and library routines with various flavors of compilers and operating systems. Leaving this file alone is unlikely to cause problems, but if you get compile errors with any functions in the standard library, it's worth checking the declarations there. 5. If you want to change the high score list behavior, examine the top of topten.c, in the src directory. You may want to change the definitions of PERSMAX, POINTSMIN, and ENTRYMAX. 6. Go to the src directory and edit the top of the makefile. Be sure that the directory you want the game installed to actually exists. If you want to have X11 support or debug Slash'EM, you need to change the format to "a.out" and uncomment "with_x11 = yes" and/or "debug = yes" from the beginning of the makefile. You'll need nroff and/or TeX/LaTeX to do the files in doc. If you don't have either of these, you can skip it. If you elected not to use the high quality BSD random number routines by commenting out RANDOM in os2conf.h, comment out (or set equal to nothing) the RANDOM macro in the makefile. If you elected to use Fred Fish's termcap library (bundled in as termcap.uu in directory sys\share), you will have to generate termlib.lib from those sources by typing "make -f makefile.lib termlib.lib". You must set the TERMLIB option in the makefile to link the resulting termlib.lib into the game. If you are recompiling after patching your sources, or if you got your files from somewhere other than the official distribution, "touch makedefs.c" to ensure that certain files (onames.h and pm.h) are remade, lest potentially troublesome time stamps fool make. If you have lex and yacc programs, or the equivalent flex and bison programs, you can set up the makefile to generate the appropriate .h and .c files from their .l and .y counterparts whenever you recompile. This is done by changing the do_yacc and do_lex targets in the makefile to depend on targets yacc_act and lex_act instead of yacc_cpy and lex_cpy. Otherwise the makefile will copy pre-generated yacc and lex output files dgn_*.* and lev_*.* from directory sys\share to util and include. Now, enter "dmake all", and take a siesta; your computer will be occupied for a fair amount of time. If all goes well, you will get an executable. 7. All the support data files should have been copied to the game directory by the make process. Here is the complete list in alphabetical order of all the files that should have gotten there during a full build: Guidebook.txt history.txt LICENSE nhshare nhushare readme.txt recover.exe slamfaq.txt slashem.cmd slashem.cnf slashem.exe It's 11 files for a full featured Slash'EM 0.0.7. If any of the files are missing, try to rerun make. If that doesn't help, you'll have to try to decipher the makefile to find out how to manually create the missing files. These kinds of troubles shouldn't happen except for two reasons: You've run out of disk space while compiling or your make utility doesn't understand the makefile properly for some reason. In either case, you should get some warnings from the make, though. If you have old record, logfile, or news files in the game directory, they are not overwritten. Of course, old records from Slash'EM 0.0.6 are not worth keeping with 0.0.7, since these games are really quite different. Edit file slashem.cnf in the game directory to reflect your particular setup and personal preferences, following the comments there. More info about settable options can be found in the file opthelp and the guidebook. If you compiled in the TERMLIB feature, also move the sys\share\termcap file to your game directory. 8. If you'll be running Slash'EM from a different subdirectory, you will want to "set HACKDIR=c:\games\slashem" (or whatever directory you want to use). Add it to your config.sys, if you'll be playing often. You can also create a special Slash'EM entry in your Presentation Manager / Workplace Shell desktop. This will use the included Slash'EM icon. The following is a sample program description for OS/2 2.0 desktop: Program title: Slash'EM 0.0.7 Path and file name: c:\games\slashem\slashem.cmd Parameters: Working directory: c:\games\slashem Program type: OS/2 Full screen Naturally you must fill in your own game directory and parameters if you want to set any. The program type can be either OS/2 Full screen or OS/2 Windowed. Note that you should set the executable path to use the .cmd file generated by the makefile. This file generates an extra pause after the program exit, because otherwise you wouldn't get to see the high score list upon quitting due to PM/WPS automatically closing the program window. When starting Slash'EM normally from OS/2 command prompt, the command processor starts slashem.exe instead, so no extra pause is generated. 9. If you want to clear up the temporary files and objects created by the compilation process, you may issue "make spotless". This will return your source tree to near-distribution condition. Naturally, it will not affect your newly built game files in any way. 10. Play Slash'EM. If it works, you're done! ----- Notes ----- 1) Save-files and bones-files from previous versions will not work with Slash'EM 0.0.7. Don't bother trying to keep them. 2) To install an update of Slash'EM after changing something, enter "dmake" from the src directory. If you add, delete, or reorder monsters or objects, or you change the format of saved level files, delete any save and bones files. (Trying to use such files sometimes produces amusing confusions on the game's part, but usually crashes.) 3) The file sys\share\termcap.uu is the fixed version of the Fred Fish termcap library. You will need to run a uudecode utility on it to generate the file termcap.zip. termcap.zip contains several files of termcap routines. Using them with Slash'EM involves very little knowledge of the UNIX concept of a termcap database; mostly you need to know enough to set a TERM environment variable. You can unzip termcap.zip in the sys\share directory, but if you are going to use it, it is probably best to unzip a copy in the src directory. That way you will not miss copying any files over. Wherever you unzip it, get rid of the included makefile since a better version has been provided as Makefile.lib. After creating the termcap library file termlib.lib, copy it to src before compiling the game main source. slashem-0.0.7E7F3/sys/os2/Makefile.os20000664000076400007640000017274610545462317015360 0ustar aliali# SCCS Id: @(#)Makefile.os2 3.4.3 1996/10/29 # OS/2 NetHack 3.4.1 Makefile for OS/2 versions 1.x and 2.x # Copyright (C) 1990, 1991, 1992, 1993, 1996 Timo Hakulinen # # 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). # # Slash'EM version by Pekka Rousu (prousu@users.sourceforge.net). # # 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. # # Copy this file into $(SRC) directory, rename it to "makefile" # (important, many targets rely on it), compile and link inside # $(SRC). If required, termcap library can be built from termcap # sources using makefile.lib in "sys\share" directory. # # # "OMF" is short for "Object Module Format" and refers to the # standard OS/2 object format, which e.g. link386 uses. # # "a.out" refers to Unix object file format, which is used by GCC # in its default compilation mode. These object files must be # linked using GCC's own linker to produce a proper OS/2 executable. # GDB debugger shipped with GCC can only be used with a.out object # format. # # Note that the default setup in this makefile is my personal setup, # which you will have to adapt to your configuration. # format = omf #format = a.out .IF $(format) == a.out with_x11 = yes #debug = yes .END # # Compiler and linker selection. # CC = gcc LINK = gcc .IF $(format) == omf LFLAGS = -Zomf -Zsys .END # # Make syntax peculiarities. # MAKEB = @dmake # Executable name (change if necessary) CMD = @cmd /C # Command processor name if required AB = $(@:B).c # Base name of the target in target action CB = $$(@:B).c # - " - dependent BEG = $(CMD) " # Command line begin in shell one-liners END = " # - " - end - " - SEP = & # Command separator - " - P = % # Literal percent sign # # Most makes execute actions automatically inside a subshell, # which makes even the shell internals work ok. DMAKE wants it # spelled out for it. ECHO = $(CMD) echo X11ECHO = $(CMD) echo #RM = -$(CMD) del #CP = $(CMD) copy #CAT = $(CMD) type RM = -$(CMD) rm -f CP = $(CMD) cp CAT = $(CMD) cat # # For those of us who have these on PC. # #YACC = yacc #LEX = lex YACC = bison -y LEX = flex # # For extracting NetHack icon. # UUDECODE = uudecode # # For people with TeX and LaTeX. # LATEX = latex # # If you have TOUCH, some things become slightly easier. # TOUCH = touch # # Standard file naming for LEX and YACC output may vary in PC # installations. These three are probably the most generally used # names. # YTABC = y.tab.c YTABH = y.tab.h LEXYYC = lexyy.c # # Source tree base directory. # NHSRC = \slashem # # Source directories. Makedefs hardcodes these, don't change them. # INCL = $(NHSRC)\include # NetHack include files DAT = $(NHSRC)\dat # NetHack data files DOC = $(NHSRC)\doc # NetHack documentation files UTIL = $(NHSRC)\util # Utility source SRC = $(NHSRC)\src # Main source WIN = $(NHSRC)\win\tty # Window system specific source WINX11 = $(NHSRC)\win\x11 # Window system specific source SYS = $(NHSRC)\sys\os2 # System specific source SSYS = $(NHSRC)\sys\share # Shared system files WINSHARE= $(NHSRC)\win\share # Shared system files # # Modifiable directories. Set these according to your setup and # preferences. They must all be present prior to compilation. # OBJ, TEMP and GAMEDIR should all preferably be separate and, # in particular, not the same as any of the source directories. # Note that DMAKE may dislike drive designators in paths because # it misinterprets the colon as being part of a make rule. In that # case, all directories have to reside on the same drive. # .IF $(with_x11) == yes GAMEDIR = \games\$(GAME)-x11 # Game directory .ELSE GAMEDIR = \games\$(GAME) # Game directory .END OBJ = \tmp\se_obj # Object files TEMP = \tmp\se_bin # Temporary files during make process DLBFILE = nhshare # Platform independent data files DLBFILE2 = nhushare # Platform specific data files MAN6DIR = $(GAMEDIR) # Manual page section 6 directory (\man\man6) PLIBP = c:\emx\lib # Protected mode C libraries RLIBP = c:\emx\lib # Possible real mode C libraries X11ROOT = c:\xfree86 # # The game name and description. # GAME = slashem GAMEDES = "SlashEM 0.0.7" # # GCC: compile only, compiler id, object format selection, warnings, # include file path, debug flags, ANSI conformance. # CFLAGS =-c $(GCCO) $(WARN) -I$(INCL) $(CDFLAGS) $(STDC) $(WINX11CFLAGS) OPT =-o .IF $(with_x11) == yes WINX11CFLAGS = -DX11_GRAPHICS -DUSE_XPM -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 WINX11VARDAT= x11tiles x11bigtiles pet_mark.xbm rip.xpm .END # # Compiler warning levels. These are really for development, so # they are commented out in general distribution to save the user # from masses of benign warnings. If any problems arise, however, # they may help in finding the trouble. # # GCC: max. reasonable GCC warning levels. Can't use -Wall, because then # it would whine about all the zillions of unused declarations etc. # Even with these switches you'll get a lot of warnings, but they should # all be benign. # .IF $(debug) == yes WARN =-W -Wimplicit -Wreturn-type -Wunused -Wformat -Wswitch -Wshadow -Wcast-qual -Wwrite-strings -DGCC_WARN # GCC .ELSE WARN =-w .END # # GCC object format selection. # .IF $(format) == omf GCCO =-Zomf -Zsys .ELSE GCCO = .END # # Prepare for a debugger. # .IF $(debug) == yes CDFLAGS = -g # GDB (GCC a.out) LDFLAGS = -g # - " - .ELSE CDFLAGS = -O -s LDFLAGS = $(LFLAGS) -s .END # # How to produce the most ANSI-like environment. # STDC =-ansi # # Possible system object files required during linking. # SYSOBJ = # # Compiler library selection. Change if necessary. # # GCC : extra GCC lib, C standard lib, extra GCC lib (again), # OS/2 API entry points. # PLIBS =-lgcc -lc -lgcc -los2 $(X11LIBS) # # C libraries used by makedefs, lev_comp and dgn_comp (change if # necessary). If compilation is done in DOS, enable the upper line # possibly setting the library name to something else, if in OS/2, # enable the lower line (protected mode libraries). # #RLIBS = $(RLIBP)\llibcer RLIBS = $(PLIBS) SRCCC = $(CC) $(CFLAGS) $(OPT) $@ $(AB) UTILCC = $(BEG) cd $(UTIL) $(SEP) $(CC) $(CFLAGS) $(OPT) $@ $(AB) $(END) SYSCC = $(BEG) cd $(SYS) $(SEP) $(CC) $(CFLAGS) $(OPT) $@ $(AB) $(END) SSYSCC = $(BEG) cd $(SSYS) $(SEP) $(CC) $(CFLAGS) $(OPT) $@ $(AB) $(END) PSYSCC = $(BEG) cd $(SSYS) $(SEP) $(CC) $(CFLAGS) $(OPT) $@ pc$(AB) $(END) WINCC = $(BEG) cd $(WIN) $(SEP) $(CC) $(CFLAGS) $(OPT) $@ $(AB) $(END) # # Default linker skeletons. # GAMELN = $(CC) $(LDFLAGS) -o $(GAMEFILE) @$(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, # makedefs, dgn_comp, lev_comp, recover, dlb. # GAMEDEF = $(GAME).def MKDFDEF = makedefs.def LEVCDEF = lev_comp.def DGNCDEF = dgn_comp.def RCVRDEF = recover.def DLBDEF = dlb.def # # For compilation in DOS, enable the lower three lines and # disable the upper three. # MKDFMD = $(TEMP)\$(MKDFDEF) LEVCMD = $(TEMP)\$(LEVCDEF) DGNCMD = $(TEMP)\$(DGNCDEF) #MKDFMD = #LEVCMD = #DGNCMD = # # Optional high-quality BSD random number generation routines # (see os2conf.h). Set to nothing if not used. # RANDOM = $(OBJ)\random.o #RANDOM = # # If TERMLIB is defined in os2conf.h, comment out the upper line and # uncomment the lower. If the termcap-library doesn't exist, use # sys\share\makefile.lib to build it. # TERMLIB = #TERMLIB = termlib.lib # # Short / long file name selection for FAT and HPFS. # Only three files need consideration. # #GUIDEBOO = Guideboo # FAT #PATCHLEV = patchlev # - " - #DATABASE = data.bas # - " - GUIDEBOO = Guidebook # HPFS PATCHLEV = patchlevel # - " - DATABASE = data.base # - " - # # If you have LaTeX and want to create the NetHack Guidebook in TeX # device-independent file format, comment out the upper line and # uncomment the lower. # GUIDE = #GUIDE = $(TEMP)\$(GUIDEBOO).dvi # # Set WINOBJ lines corresponding to your desired combination # of windowing systems. Also set windowing systems in config.h. # WINOBJ1 = $(OBJ)\getline.o WINOBJ2 = $(OBJ)\termcap.o WINOBJ3 = $(OBJ)\topl.o WINOBJ4 = $(OBJ)\wintty.o .IF $(with_x11) == yes WINX11OBJ01 = $(OBJ)\Window.o WINX11OBJ02 = $(OBJ)\dialogs.o WINX11OBJ03 = $(OBJ)\winX.o WINX11OBJ04 = $(OBJ)\winmap.o WINX11OBJ05 = $(OBJ)\winmenu.o WINX11OBJ06 = $(OBJ)\winmesg.o WINX11OBJ07 = $(OBJ)\winmisc.o WINX11OBJ08 = $(OBJ)\winstat.o WINX11OBJ09 = $(OBJ)\wintext.o WINX11OBJ10 = $(OBJ)\winval.o WINX11OBJ11 = $(OBJ)\tile.o WINX11OBJ = $(WINX11OBJ01) $(WINX11OBJ02) $(WINX11OBJ03) $(WINX11OBJ04) $(WINX11OBJ05)\ $(WINX11OBJ06) $(WINX11OBJ07) $(WINX11OBJ08) $(WINX11OBJ09) $(WINX11OBJ10) $(WINX11OBJ11) .END WINOBJ = $(WINOBJ1) $(WINOBJ2) $(WINOBJ3) $(WINOBJ4) $(WINX11OBJ) # # The default make target, so just typing 'make' is useful. # Has to be the first target in the makefile. # default : all # # If you have yacc and lex programs and make any changes, uncomment # the lowermost two lines and comment out the others. If you make # changes to the .y and .l files but prefer processing the files # separately elsewhere, activate the middle two lines, so your changes # don't get overwritten. # #do_yacc : yacc_cpy # use pre-generated files #do_lex : lex_cpy # - " - #do_yacc : yacc_msg # show message if changed #do_lex : lex_msg # - " - do_yacc : yacc_act # re-process files do_lex : lex_act # - " - # # If you have the TOUCH utility the upper line is ok. Otherwise # the lower one does the same albeit in an ugly manner. Besides, # the latter method only works for text files. # do_touch : realtouch #do_touch : faketouch # # If you don't have uudecode program, use the upper line. # If you still want the icon, you'll have to extract the # file manually somewhere else. # do_icon : icon_msg # show message if changed #do_icon : icon_act # extract icon file # # If you don't want to generate nethack.cmd, use the upper line. # This could be the case, e.g., if you use a different shell than # the standard cmd.exe. # #do_cmd : cmd_msg # show message do_cmd : cmd_act # generate nethack.cmd # # If you want to try the data librarian scheme to reduce # the amount of data files in the NetHack home directory, comment # out the lower line and uncomment the upper. Also, make sure # that DLB is defined in config.h. # # Slash'EM requires DLB. # do_dlb : dlb_yup #do_dlb : dlb_nope # # man_msg = Do not copy man pages. # copy_txt = copy preformatted man pages into GAMEDIR # copy_man = copy man pages into MAN6DIR # do_man: man_msg #do_man: copy_txt #do_man: copy_man #do_man: copy_txt copy_man # # util_msg = Do not copy utils. # copy_utils = copies dlb.exe, lev_comp.exe and dgn_comp.exe # into the GAMEDIR # do_utils: util_msg #do_utils: copy_utils ###################################################################### # # Nothing below this line should have to be changed. # # Other things that have to be reconfigured are in # config.h, os2conf.h and possibly system.h. # # # The game filename. # GAMEFILE = $(GAMEDIR)\$(GAME).exe # # Object files for makedefs. # MAKEOBJS = $(OBJ)\makedefs.o $(OBJ)\monst.o $(OBJ)\objects.o # # Object files for special levels compiler. # SOBJ01 = $(OBJ)\lev_yacc.o $(OBJ)\lev_lex.o $(OBJ)\lev_main.o $(OBJ)\alloc.o SOBJ02 = $(OBJ)\monst.o $(OBJ)\objects.o $(OBJ)\panic.o $(OBJ)\decl.o SOBJ03 = $(OBJ)\drawing.o SPLEVOBJS = $(SOBJ01) $(SOBJ02) $(SOBJ03) # # Object files for dungeon compiler. # DOBJ01 = $(OBJ)\dgn_yacc.o $(OBJ)\dgn_lex.o $(OBJ)\dgn_main.o DOBJ02 = $(OBJ)\panic.o $(OBJ)\alloc.o DGNCOMPOBJS = $(DOBJ01) $(DOBJ02) # # Object files for recovery utility. # RECOVOBJS = $(OBJ)\recover.o # # Object files for dlb. # DLBOBJS = $(OBJ)\dlb_main.o $(OBJ)\dlb.o $(OBJ)\alloc.o $(OBJ)\panic.o # # Data files for dlb. # DATHELP = \ help hh cmdhelp history opthelp wizhelp license gypsy.txt $(GUIDEBOO).txt SPEC_LEVS = \ asmodeus.lev baalz.lev bigrm-1.lev bigrm-2.lev bigrm-3.lev \ bigrm-4.lev bigrm-5.lev castle.lev fakewiz1.lev fakewiz2.lev\ juiblex.lev knox.lev medusa-1.lev medusa-2.lev minend-1.lev\ minend-2.lev minend-3.lev minefill.lev minetn-1.lev minetn-2.lev\ minetn-3.lev minetn-4.lev minetn-5.lev minetn-6.lev minetn-7.lev\ oracle.lev orcus.lev sanctum.lev tower1.lev tower2.lev \ tower3.lev valley.lev wizard1.lev wizard2.lev wizard3.lev \ astral.lev air.lev earth.lev fire.lev water.lev \ soko1-1.lev soko1-2.lev soko2-1.lev soko2-2.lev soko3-1.lev \ soko3-2.lev soko4-1.lev soko4-2.lev \ \ soko1-3.lev soko1-4.lev soko2-3.lev soko2-4.lev soko2-5.lev \ soko2-6.lev soko2-7.lev soko3-3.lev soko3-4.lev soko3-5.lev \ soko3-6.lev soko3-7.lev soko4-3.lev soko4-4.lev soko4-5.lev \ beholder.lev blkmar.lev cav2fill.lev demogorg.lev dispater.lev\ dragons.lev geryon.lev grund-1.lev grund-2.lev grund-3.lev \ guild.lev frnknstn.lev kobold-1.lev kobold-2.lev lich.lev \ mall.lev mall-1.lev mall-2.lev medusa-3.lev medusa-4.lev\ mineking.lev mtemple.lev nightmar.lev nymph.lev rats.lev \ sea.lev spiders.lev stor-1.lev stor-2.lev stor-3.lev \ tomb.lev yeenoghu.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 \ \ Fla-goal.lev Fla-fila.lev Fla-filb.lev Fla-loca.lev Fla-strt.lev \ Ice-goal.lev Ice-fila.lev Ice-filb.lev Ice-loca.lev Ice-strt.lev \ Nec-goal.lev Nec-fila.lev Nec-filb.lev Nec-loca.lev Nec-strt.lev \ Und-goal.lev Und-fila.lev Und-filb.lev Und-loca.lev Und-strt.lev \ Yeo-goal.lev Yeo-fila.lev Yeo-filb.lev Yeo-loca.lev Yeo-strt.lev VARDATD = data oracles options rumors DATDLB = $(VARDATD) $(DATHELP) DATDLB2 = dungeon quest.dat $(SPEC_LEVS) $(QUEST_LEVS) # # 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 VOBJ301 = $(OBJ)\borg.o VOBJ302 = $(OBJ)\gypsy.o VOBJ303 = $(OBJ)\tech.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) VOBJ30 = $(VOBJ301) $(VOBJ302) $(VOBJ303) 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) $(VOBJ30) HOBJ = $(VOBJ) $(HHOBJ) EXTERN_H = # $(INCL)\extern.h OS2CONF_H = $(INCL)\os2conf.h $(INCL)\micro.h $(INCL)\system.h $(EXTERN_H) GLOBAL_H = $(INCL)\global.h $(INCL)\coord.h $(OS2CONF_H) CONFIG_H = $(INCL)\config.h $(INCL)\config1.h $(INCL)\tradstdc.h $(GLOBAL_H) TRAP_H = $(INCL)\trap.h PERMONST_H = $(INCL)\permonst.h $(INCL)\monattk.h $(INCL)\monflag.h YOU_H = $(INCL)\you.h $(INCL)\attrib.h $(PERMONST_H) $(INCL)\mondata.h \ $(INCL)\monst.h $(INCL)\youprop.h $(INCL)\prop.h $(INCL)\pm.h DECL_H = $(INCL)\decl.h $(INCL)\spell.h $(INCL)\obj.h $(YOU_H) \ $(INCL)\onames.h $(INCL)\color.h HACK_H = $(CONFIG_H) $(DECL_H) $(INCL)\monsym.h $(INCL)\mkroom.h \ $(INCL)\objclass.h $(TRAP_H) $(INCL)\engrave.h $(INCL)\flag.h \ $(INCL)\rm.h $(INCL)\dungeon.h $(INCL)\hack.h $(INCL)\display.h \ $(INCL)\vision.h $(INCL)\wintty.h $(INCL)\wintype.h $(INCL)\align.h \ $(INCL)\winprocs.h # # The default target. # all : makedefs dgn_comp lev_comp recover $(GAMEFILE) $(GUIDE) $(WINX11VARDAT) \ dat do_dlb do_man do_utils finish $(ECHO) Done building all targets. # # Definition file creation. # $(TEMP)\$(GAMEDEF) : $(MAKEB) DD_NAME=$(GAME) DD_DESC=$(GAMEDES) DD_TARG=$@ do_def $(TEMP)\$(MKDFDEF) : $(MAKEB) DD_NAME=makedefs DD_DESC="Definitions compiler" DD_TARG=$@ do_def $(TEMP)\$(DGNCDEF) : $(MAKEB) DD_NAME=dgn_comp DD_DESC="Dungeon compiler" DD_TARG=$@ do_def $(TEMP)\$(LEVCDEF) : $(MAKEB) DD_NAME=lev_comp DD_DESC="Level compiler" DD_TARG=$@ do_def $(TEMP)\$(RCVRDEF) : $(MAKEB) DD_NAME=recover DD_DESC="Recovery utility" DD_TARG=$@ do_def $(TEMP)\$(DLBDEF) : $(MAKEB) DD_NAME=dlb DD_DESC="Archive utility" DD_TARG=$@ do_def do_def : $(ECHO) NAME $(DD_NAME) WINDOWCOMPAT> $(DD_TARG) $(ECHO) DESCRIPTION '$(DD_DESC)'>> $(DD_TARG) $(ECHO) PROTMODE>> $(DD_TARG) $(ECHO) EXETYPE OS2>> $(DD_TARG) # # The main target. # $(GAME) : $(GAMEFILE) $(GAMEFILE) : $(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) $(VOBJ301) >> $@ $(ECHO) $(VOBJ302) >> $@ $(ECHO) $(VOBJ303) >> $@ $(ECHO) $(WINOBJ1) >> $@ $(ECHO) $(WINOBJ2) >> $@ $(ECHO) $(WINOBJ3) >> $@ $(ECHO) $(WINOBJ4) >> $@ $(ECHO) $(HHOBJ) >> $@ $(ECHO) $(RANDOM) >> $@ .IF $(with_x11) == yes $(X11ECHO) $(WINX11OBJ01) >> $@ $(X11ECHO) $(WINX11OBJ02) >> $@ $(X11ECHO) $(WINX11OBJ03) >> $@ $(X11ECHO) $(WINX11OBJ04) >> $@ $(X11ECHO) $(WINX11OBJ05) >> $@ $(X11ECHO) $(WINX11OBJ06) >> $@ $(X11ECHO) $(WINX11OBJ07) >> $@ $(X11ECHO) $(WINX11OBJ08) >> $@ $(X11ECHO) $(WINX11OBJ09) >> $@ $(X11ECHO) $(WINX11OBJ10) >> $@ $(X11ECHO) $(WINX11OBJ11) >> $@ .END # # Targets for makedefs. # makedefs : $(TEMP)\makedefs.exe $(TEMP)\makedefs.exe : $(MAKEOBJS) $(TEMP)\$(MKDFDEF) $(MKDFLN) $(OBJ)\makedefs.o : $(UTIL)\$(CB) $(CONFIG_H) $(INCL)\permonst.h $(INCL)\objclass.h \ $(INCL)\monsym.h $(INCL)\artilist.h $(INCL)\qtext.h $(UTILCC) # # Targets for the special levels compiler. # lev_comp : $(TEMP)\lev_comp.exe $(TEMP)\lev_comp.exe : $(SPLEVOBJS) $(TEMP)\$(LEVCDEF) $(LEVCLN) $(OBJ)\lev_yacc.o : $(UTIL)\$(CB) $(HACK_H) $(INCL)\sp_lev.h $(UTILCC) $(OBJ)\lev_lex.o : $(UTIL)\$(CB) $(HACK_H) $(INCL)\sp_lev.h $(INCL)\lev_comp.h $(UTILCC) $(OBJ)\lev_main.o : $(UTIL)\$(CB) $(HACK_H) $(INCL)\sp_lev.h $(INCL)\tcap.h $(UTILCC) $(INCL)\lev_comp.h : $(UTIL)\lev_yacc.c $(UTIL)\lev_yacc.c : $(UTIL)\lev_comp.y $(MAKEB) YY=lev do_yacc $(UTIL)\lev_lex.c : $(UTIL)\lev_comp.l $(MAKEB) YY=lev do_lex # # Targets for the dungeon compiler. # dgn_comp : $(TEMP)\dgn_comp.exe $(TEMP)\dgn_comp.exe : $(DGNCOMPOBJS) $(TEMP)\$(DGNCDEF) $(DGNCLN) $(OBJ)\dgn_yacc.o : $(UTIL)\$(CB) $(CONFIG_H) $(INCL)\date.h $(INCL)\dgn_file.h $(UTILCC) $(OBJ)\dgn_lex.o : $(UTIL)\$(CB) $(CONFIG_H) $(INCL)\dgn_comp.h $(INCL)\dgn_file.h $(UTILCC) $(OBJ)\dgn_main.o : $(UTIL)\$(CB) $(CONFIG_H) $(UTILCC) $(INCL)\dgn_comp.h : $(UTIL)\dgn_yacc.c $(UTIL)\dgn_yacc.c : $(UTIL)\dgn_comp.y $(MAKEB) YY=dgn do_yacc $(UTIL)\dgn_lex.c : $(UTIL)\dgn_comp.l $(MAKEB) YY=dgn do_lex # # For both lev_comp and dgn_comp. # $(OBJ)\panic.o : $(UTIL)\$(CB) $(CONFIG_H) $(UTILCC) # # Yacc and Lex targets. # yacc_cpy : $(CP) $(SSYS)\$(YY)_yacc.c $(UTIL) $(CP) $(SSYS)\$(YY)_comp.h $(INCL) $(MAKEB) TT=$(UTIL)\$(YY)_yacc.c do_touch $(MAKEB) TT=$(INCL)\$(YY)_comp.h do_touch yacc_msg : $(ECHO) $(YY)_comp.y has changed. To update $(YY)_yacc.c and $(YY)_comp.h run $(YACC). yacc_act : $(YACC) -d $(UTIL)\$(YY)_comp.y $(CP) $(YTABC) $(UTIL)\$(YY)_yacc.c $(CP) $(YTABH) $(INCL)\$(YY)_comp.h $(RM) $(YTABC) $(RM) $(YTABH) lex_cpy : $(CP) $(SSYS)\$(YY)_lex.c $(UTIL) $(MAKEB) TT=$(UTIL)\$(YY)_lex.c do_touch lex_msg : $(ECHO) $(YY)_comp.l has changed. To update $(YY)_lex.c run $(LEX). lex_act : $(LEX) $(UTIL)\$(YY)_comp.l $(CP) $(LEXYYC) $(UTIL)\$(YY)_lex.c $(RM) $(LEXYYC) # # Why must this be so kludgy? # realtouch : $(TOUCH) $(TT) faketouch : $(BEG) $(CAT) $(TT) > $(TEMP)\foo.bar $(SEP) $(CP) $(TEMP)\foo.bar $(TT) $(SEP) $(RM) $(TEMP)\foo.bar $(END) # # Targets for the recovery utility. # recover : $(GAMEDIR)\recover.exe $(GAMEDIR)\recover.exe : $(RECOVOBJS) $(TEMP)\$(RCVRDEF) $(RCVRLN) $(OBJ)\recover.o : $(UTIL)\$(CB) $(CONFIG_H) $(UTILCC) # # Targets for the dlb. # dlb : $(TEMP)\dlb.exe $(TEMP)\dlb.exe : $(DLBOBJS) $(TEMP)\$(DLBDEF) $(DLBRLN) $(OBJ)\dlb_main.o : $(UTIL)\$(CB) $(CONFIG_H) $(INCL)\dlb.h $(UTILCC) $(GAMEDIR)\$(DLBFILE): $(TEMP)\dlb.exe cCf $(TEMP) $(GAMEDIR)\$(DLBFILE) $(DATDLB) $(GAMEDIR)\$(DLBFILE2): $(HACK_H) $(TEMP)\dlb.exe cCf $(TEMP) $(GAMEDIR)\$(DLBFILE2) $(DATDLB2) dlb_yup : $(TEMP)\dlb.exe $(GAMEDIR)\$(DLBFILE) $(GAMEDIR)\$(DLBFILE2) removedat: $(RM) $(DATDIR)\cmdhelp $(RM) $(DATDIR)\data $(RM) $(DATDIR)\dungeon $(RM) $(DATDIR)\help $(RM) $(DATDIR)\hh $(RM) $(DATDIR)\history $(RM) $(DATDIR)\opthelp $(RM) $(DATDIR)\options $(RM) $(DATDIR)\oracles $(RM) $(DATDIR)\quest.dat $(RM) $(DATDIR)\rumors $(RM) $(DATDIR)\wizhelp $(RM) $(DATDIR)\gypsy.txt\ $(RM) $(DATDIR)\???-fil?.lev $(RM) $(DATDIR)\???-goal.lev $(RM) $(DATDIR)\???-loca.lev $(RM) $(DATDIR)\???-strt.lev $(RM) $(DATDIR)\air.lev $(RM) $(DATDIR)\asmodeus.lev $(RM) $(DATDIR)\astral.lev $(RM) $(DATDIR)\bigrm-?.lev $(RM) $(DATDIR)\castle.lev $(RM) $(DATDIR)\earth.lev $(RM) $(DATDIR)\fakewiz?.lev $(RM) $(DATDIR)\fire.lev $(RM) $(DATDIR)\guild.lev $(RM) $(DATDIR)\juiblex.lev $(RM) $(DATDIR)\knox.lev $(RM) $(DATDIR)\medusa-?.lev $(RM) $(DATDIR)\minefill.lev $(RM) $(DATDIR)\minend-?.lev $(RM) $(DATDIR)\minetn-?.lev $(RM) $(DATDIR)\oracle.lev $(RM) $(DATDIR)\orcus.lev $(RM) $(DATDIR)\sanctum.lev $(RM) $(DATDIR)\soko?-?.lev $(RM) $(DATDIR)\tower?.lev $(RM) $(DATDIR)\valley.lev $(RM) $(DATDIR)\water.lev $(RM) $(DATDIR)\wizard?.lev\ $(RM) $(DATDIR)\baalz.lev $(RM) $(DATDIR)\beholder.lev $(RM) $(DATDIR)\blkmar.lev $(RM) $(DATDIR)\cav2fill.lev $(RM) $(DATDIR)\demogorg.lev $(RM) $(DATDIR)\dispater.lev $(RM) $(DATDIR)\dragons.lev $(RM) $(DATDIR)\frnknstn.lev $(RM) $(DATDIR)\geryon.lev $(RM) $(DATDIR)\grund-?.lev $(RM) $(DATDIR)\kobold-?.lev $(RM) $(DATDIR)\lich.lev $(RM) $(DATDIR)\mall-?.lev $(RM) $(DATDIR)\mall.lev $(RM) $(DATDIR)\mineking.lev $(RM) $(DATDIR)\mtemple.lev $(RM) $(DATDIR)\nightmar.lev $(RM) $(DATDIR)\nymph.lev $(RM) $(DATDIR)\rats.lev $(RM) $(DATDIR)\sea.lev $(RM) $(DATDIR)\spiders.lev $(RM) $(DATDIR)\stor-?.lev $(RM) $(DATDIR)\tomb.lev $(RM) $(DATDIR)\yeenoghu.lev copydat: $(CP) $(TEMP)\cmdhelp $(GAMEDIR) $(CP) $(TEMP)\data $(GAMEDIR) $(CP) $(TEMP)\dungeon $(GAMEDIR) $(CP) $(TEMP)\help $(GAMEDIR) $(CP) $(TEMP)\hh $(GAMEDIR) $(CP) $(TEMP)\history $(GAMEDIR) $(CP) $(TEMP)\opthelp $(GAMEDIR) $(CP) $(TEMP)\options $(GAMEDIR) $(CP) $(TEMP)\oracles $(GAMEDIR) $(CP) $(TEMP)\quest.dat $(GAMEDIR) $(CP) $(TEMP)\rumors $(GAMEDIR) $(CP) $(TEMP)\wizhelp $(GAMEDIR) $(CP) $(TEMP)\gypsy.txt $(GAMEDIR)\ $(CP) $(TEMP)\???-fil?.lev $(GAMEDIR) $(CP) $(TEMP)\???-goal.lev $(GAMEDIR) $(CP) $(TEMP)\???-loca.lev $(GAMEDIR) $(CP) $(TEMP)\???-strt.lev $(GAMEDIR) $(CP) $(TEMP)\air.lev $(GAMEDIR) $(CP) $(TEMP)\asmodeus.lev $(GAMEDIR) $(CP) $(TEMP)\astral.lev $(GAMEDIR) $(CP) $(TEMP)\bigrm-?.lev $(GAMEDIR) $(CP) $(TEMP)\castle.lev $(GAMEDIR) $(CP) $(TEMP)\earth.lev $(GAMEDIR) $(CP) $(TEMP)\fakewiz?.lev $(GAMEDIR) $(CP) $(TEMP)\fire.lev $(GAMEDIR) $(CP) $(TEMP)\guild.lev $(GAMEDIR) $(CP) $(TEMP)\juiblex.lev $(GAMEDIR) $(CP) $(TEMP)\knox.lev $(GAMEDIR) $(CP) $(TEMP)\medusa-?.lev $(GAMEDIR) $(CP) $(TEMP)\minefill.lev $(GAMEDIR) $(CP) $(TEMP)\minend-?.lev $(GAMEDIR) $(CP) $(TEMP)\minetn-?.lev $(GAMEDIR) $(CP) $(TEMP)\oracle.lev $(GAMEDIR) $(CP) $(TEMP)\orcus.lev $(GAMEDIR) $(CP) $(TEMP)\sanctum.lev $(GAMEDIR) $(CP) $(TEMP)\soko?-?.lev $(GAMEDIR) $(CP) $(TEMP)\tower?.lev $(GAMEDIR) $(CP) $(TEMP)\valley.lev $(GAMEDIR) $(CP) $(TEMP)\water.lev $(GAMEDIR) $(CP) $(TEMP)\wizard?.lev $(GAMEDIR)\ $(CP) $(TEMP)\baalz.lev $(GAMEDIR) $(CP) $(TEMP)\beholder.lev $(GAMEDIR) $(CP) $(TEMP)\blkmar.lev $(GAMEDIR) $(CP) $(TEMP)\cav2fill.lev $(GAMEDIR) $(CP) $(TEMP)\demogorg.lev $(GAMEDIR) $(CP) $(TEMP)\dispater.lev $(GAMEDIR) $(CP) $(TEMP)\dragons.lev $(GAMEDIR) $(CP) $(TEMP)\frnknstn.lev $(GAMEDIR) $(CP) $(TEMP)\geryon.lev $(GAMEDIR) $(CP) $(TEMP)\grund-?.lev $(GAMEDIR) $(CP) $(TEMP)\kobold-?.lev $(GAMEDIR) $(CP) $(TEMP)\lich.lev $(GAMEDIR) $(CP) $(TEMP)\mall-?.lev $(GAMEDIR) $(CP) $(TEMP)\mall.lev $(GAMEDIR) $(CP) $(TEMP)\mineking.lev $(GAMEDIR) $(CP) $(TEMP)\mtemple.lev $(GAMEDIR) $(CP) $(TEMP)\nightmar.lev $(GAMEDIR) $(CP) $(TEMP)\nymph.lev $(GAMEDIR) $(CP) $(TEMP)\rats.lev $(GAMEDIR) $(CP) $(TEMP)\sea.lev $(GAMEDIR) $(CP) $(TEMP)\spiders.lev $(GAMEDIR) $(CP) $(TEMP)\stor-?.lev $(GAMEDIR) $(CP) $(TEMP)\tomb.lev $(GAMEDIR) $(CP) $(TEMP)\yeenoghu.lev $(GAMEDIR) dlb_nope : $(ECHO) DLB not requested. $(MAKEB) copydat $(RM) $(GAMEDIR)\$(DLBFILE) $(RM) $(GAMEDIR)\$(DLBFILE2) # # The following files depend on makedefs to be created. # # date.h should be remade every time any of the source or include # files is modified. # $(INCL)\date.h : $(VOBJ) $(TEMP)\makedefs.exe $(TEMP)\makedefs -v $(CP) $(DAT)\options $(TEMP) $(RM) $(DAT)\options $(INCL)\onames.h : $(TEMP)\makedefs.exe $(TEMP)\makedefs -o $(INCL)\pm.h : $(TEMP)\makedefs.exe $(TEMP)\makedefs -p $(INCL)\filename.h : $(TEMP)\makedefs.exe $(TEMP)\makedefs -f monstr.c : $(TEMP)\makedefs.exe $(TEMP)\makedefs -m $(OBJ)\monstr.o : $(CB) $(SRCCC) $(TEMP)\data : $(DAT)\$(DATABASE) $(TEMP)\makedefs.exe $(TEMP)\makedefs -d $(CP) $(DAT)\data $(TEMP) $(RM) $(DAT)\data $(TEMP)\rumors : $(DAT)\rumors.tru $(DAT)\rumors.fal $(TEMP)\makedefs.exe $(TEMP)\makedefs -r $(CP) $(DAT)\rumors $(TEMP) $(RM) $(DAT)\rumors $(TEMP)\oracles : $(DAT)\oracles.txt $(TEMP)\makedefs.exe $(TEMP)\makedefs -h $(CP) $(DAT)\oracles $(TEMP) $(RM) $(DAT)\oracles $(TEMP)\quest.dat : $(DAT)\quest.txt $(TEMP)\makedefs.exe $(TEMP)\makedefs -q $(CP) $(DAT)\quest.dat $(TEMP) $(RM) $(DAT)\quest.dat # # Vision tables for algorithm D. # vis_tab.c : $(INCL)\vis_tab.h $(INCL)\vis_tab.h : $(TEMP)\makedefs.exe $(TEMP)\makedefs -z $(OBJ)\vis_tab.o : $(CB) $(SRCCC) # # The following programs vary depending on what OS you are using. # $(OBJ)\main.o : $(SSYS)\pc$(CB) $(HACK_H) $(INCL)\dlb.h $(PSYSCC) $(OBJ)\tty.o : $(SSYS)\pc$(CB) $(HACK_H) $(INCL)\func_tab.h $(PSYSCC) $(OBJ)\unix.o : $(SSYS)\pc$(CB) $(HACK_H) $(PSYSCC) # # Other system specific modules. # $(OBJ)\os2.o : $(SYS)\$(CB) $(HACK_H) $(INCL)\tcap.h $(INCL)\def_os2.h $(SYSCC) $(OBJ)\pcsys.o : $(SSYS)\$(CB) $(HACK_H) $(SSYSCC) # # Berkeley random(3) routines. # $(OBJ)\random.o : $(SSYS)\$(CB) $(SSYSCC) # # Window source. # $(OBJ)\getline.o : $(WIN)\$(CB) $(HACK_H) $(INCL)\func_tab.h $(WINCC) $(OBJ)\termcap.o : $(WIN)\$(CB) $(HACK_H) $(INCL)\tcap.h $(WINCC) $(OBJ)\topl.o : $(WIN)\$(CB) $(HACK_H) $(INCL)\tcap.h $(WINCC) $(OBJ)\wintty.o : $(WIN)\$(CB) $(HACK_H) $(INCL)\tcap.h $(WINCC) # # Secondary targets. # dat : spec_lev help_fil $(TEMP)\dungeon $(TEMP)\data $(TEMP)\rumors \ $(TEMP)\oracles $(TEMP)\quest.dat $(GAMEDIR)\$(GAME).ico \ $(GAMEDIR)\$(GAME).cmd $(GAMEDIR)\$(GAME).cnf $(WINX11VARDAT) help_fil : $(TEMP)\cmdhelp $(TEMP)\help $(TEMP)\hh $(TEMP)\history \ $(TEMP)\license $(TEMP)\opthelp $(TEMP)\wizhelp $(TEMP)\gypsy.txt \ $(TEMP)\$(GUIDEBOO).txt $(TEMP)\cmdhelp : $(DAT)\cmdhelp $(CP) $(DAT)\cmdhelp $(TEMP) $(TEMP)\help : $(DAT)\help $(CP) $(DAT)\help $(TEMP) $(TEMP)\hh : $(DAT)\hh $(CP) $(DAT)\hh $(TEMP) $(TEMP)\history : $(DAT)\history $(CP) $(DAT)\history $(TEMP) $(TEMP)\license : $(DAT)\license $(CP) $(DAT)\license $(TEMP) $(TEMP)\opthelp : $(DAT)\opthelp $(CP) $(DAT)\opthelp $(TEMP) $(TEMP)\wizhelp : $(DAT)\wizhelp $(CP) $(DAT)\wizhelp $(TEMP) $(TEMP)\gypsy.txt : $(DAT)\gypsy.txt $(CP) $(DAT)\gypsy.txt $(TEMP) $(TEMP)\$(GUIDEBOO).txt: $(DOC)\$(GUIDEBOO).txt $(CP) $(DOC)\$(GUIDEBOO).txt $(TEMP) $(TEMP)\dungeon : $(DAT)\dungeon.def $(TEMP)\makedefs.exe $(TEMP)\dgn_comp.exe $(TEMP)\makedefs -e $(TEMP)\dgn_comp $(DAT)\dungeon.pdf $(CP) $(DAT)\dungeon $(TEMP) $(RM) $(DAT)\dungeon.pdf $(RM) $(DAT)\dungeon AFILES = $(TEMP)\Arc-goal.lev BFILES = $(TEMP)\Bar-goal.lev CFILES = $(TEMP)\Cav-goal.lev HFILES = $(TEMP)\Hea-goal.lev KFILES = $(TEMP)\Kni-goal.lev MFILES = $(TEMP)\Mon-goal.lev PFILES = $(TEMP)\Pri-goal.lev RANFILES = $(TEMP)\Ran-goal.lev RFILES = $(TEMP)\Rog-goal.lev SFILES = $(TEMP)\Sam-goal.lev TFILES = $(TEMP)\Tou-goal.lev VFILES = $(TEMP)\Val-goal.lev WFILES = $(TEMP)\Wiz-goal.lev FFILES = $(TEMP)\Fla-goal.lev IFILES = $(TEMP)\Ice-goal.lev NFILES = $(TEMP)\Nec-goal.lev UFILES = $(TEMP)\Und-goal.lev YFILES = $(TEMP)\Yeo-goal.lev XFILES = $(AFILES) $(BFILES) $(CFILES) $(HFILES) $(KFILES) $(MFILES) \ $(PFILES) $(RANFILES) $(RFILES) $(SFILES) $(TFILES) $(VFILES) $(WFILES) \ $(FFILES) $(IFILES) $(NFILES) $(UFILES) $(YFILES) spec_lev :\ $(TEMP)\astral.lev \ $(TEMP)\bigrm-1.lev \ $(TEMP)\castle.lev \ $(TEMP)\knox.lev \ $(TEMP)\medusa-1.lev \ $(TEMP)\minefill.lev \ $(TEMP)\oracle.lev \ $(TEMP)\soko1-1.lev \ $(TEMP)\tower1.lev \ $(TEMP)\valley.lev \ $(TEMP)\wizard1.lev \ \ $(TEMP)\beholder.lev \ $(TEMP)\blkmar.lev \ $(TEMP)\cav2fill.lev \ $(TEMP)\dragons.lev \ $(TEMP)\frnknstn.lev \ $(TEMP)\guild.lev \ $(TEMP)\grund-1.lev \ $(TEMP)\kobold-1.lev \ $(TEMP)\kobold-2.lev \ $(TEMP)\lich.lev \ $(TEMP)\mall.lev \ $(TEMP)\mall-1.lev \ $(TEMP)\mall-2.lev \ $(TEMP)\mtemple.lev \ $(TEMP)\nightmar.lev \ $(TEMP)\nymph.lev \ $(TEMP)\rats.lev \ $(TEMP)\sea.lev \ $(TEMP)\spiders.lev \ $(TEMP)\stor-1.lev \ $(TEMP)\stor-2.lev \ $(TEMP)\stor-3.lev \ $(TEMP)\tomb.lev \ $(XFILES) # Single special level files $(TEMP)\castle.lev : $(DAT)\castle.des $(TEMP)\lev_comp.exe $(MAKEB) LF=castle do_slev $(TEMP)\knox.lev : $(DAT)\knox.des $(TEMP)\lev_comp.exe $(MAKEB) LF=knox do_slev $(TEMP)\oracle.lev : $(DAT)\oracle.des $(TEMP)\lev_comp.exe $(MAKEB) LF=oracle do_slev $(TEMP)\beholder.lev : $(DAT)\beholder.des $(TEMP)\lev_comp.exe $(MAKEB) LF=beholder do_slev $(TEMP)\blkmar.lev : $(DAT)\blkmar.des $(TEMP)\lev_comp.exe $(MAKEB) LF=blkmar do_slev $(TEMP)\dragons.lev : $(DAT)\dragons.des $(TEMP)\lev_comp.exe $(MAKEB) LF=dragons do_slev $(TEMP)\frnknstn.lev : $(DAT)\frnknstn.des $(TEMP)\lev_comp.exe $(MAKEB) LF=frnknstn do_slev $(TEMP)\guild.lev : $(DAT)\guild.des $(TEMP)\lev_comp.exe $(MAKEB) LF=guild do_slev $(TEMP)\kobold-1.lev : $(DAT)\kobold-1.des $(TEMP)\lev_comp.exe $(MAKEB) LF=kobold-1 do_slev $(TEMP)\kobold-2.lev : $(DAT)\kobold-2.des $(TEMP)\lev_comp.exe $(MAKEB) LF=kobold-2 do_slev $(TEMP)\lich.lev : $(DAT)\lich.des $(TEMP)\lev_comp.exe $(MAKEB) LF=lich do_slev $(TEMP)\mall-1.lev : $(DAT)\mall-1.des $(TEMP)\lev_comp.exe $(MAKEB) LF=mall-1 do_slev $(TEMP)\mall-2.lev : $(DAT)\mall-2.des $(TEMP)\lev_comp.exe $(MAKEB) LF=mall-2 do_slev $(TEMP)\mtemple.lev : $(DAT)\mtemple.des $(TEMP)\lev_comp.exe $(MAKEB) LF=mtemple do_slev $(TEMP)\nightmar.lev : $(DAT)\nightmar.des $(TEMP)\lev_comp.exe $(MAKEB) LF=nightmar do_slev $(TEMP)\nymph.lev : $(DAT)\nymph.des $(TEMP)\lev_comp.exe $(MAKEB) LF=nymph do_slev $(TEMP)\rats.lev : $(DAT)\rats.des $(TEMP)\lev_comp.exe $(MAKEB) LF=rats do_slev $(TEMP)\sea.lev : $(DAT)\sea.des $(TEMP)\lev_comp.exe $(MAKEB) LF=sea do_slev $(TEMP)\spiders.lev : $(DAT)\spiders.des $(TEMP)\lev_comp.exe $(MAKEB) LF=spiders do_slev $(TEMP)\stor-1.lev : $(DAT)\stor-1.des $(TEMP)\lev_comp.exe $(MAKEB) LF=stor-1 do_slev $(TEMP)\stor-2.lev : $(DAT)\stor-2.des $(TEMP)\lev_comp.exe $(MAKEB) LF=stor-2 do_slev $(TEMP)\stor-3.lev : $(DAT)\stor-3.des $(TEMP)\lev_comp.exe $(MAKEB) LF=stor-3 do_slev $(TEMP)\tomb.lev : $(DAT)\tomb.des $(TEMP)\lev_comp.exe $(MAKEB) LF=tomb do_slev do_slev : $(TEMP)\lev_comp $(DAT)\$(LF).des $(CP) $(LF).lev $(TEMP) $(RM) $(LF).lev # Multiple special level files $(TEMP)\astral.lev : $(DAT)\endgame.des $(TEMP)\lev_comp.exe $(TEMP)\lev_comp $(DAT)\endgame.des $(CP) air.lev $(TEMP) $(CP) astral.lev $(TEMP) $(CP) earth.lev $(TEMP) $(CP) fire.lev $(TEMP) $(CP) water.lev $(TEMP) $(RM) air.lev $(RM) astral.lev $(RM) earth.lev $(RM) fire.lev $(RM) water.lev $(TEMP)\bigrm-1.lev : $(DAT)\bigroom.des $(TEMP)\lev_comp.exe $(TEMP)\lev_comp $(DAT)\bigroom.des $(CP) bigrm-?.lev $(TEMP) $(RM) bigrm-?.lev $(TEMP)\cav2fill.lev : $(DAT)\giants.des $(TEMP)\lev_comp.exe $(TEMP)\lev_comp $(DAT)\giants.des $(CP) cav2fill.lev $(TEMP) $(RM) cav2fill.lev $(TEMP)\grund-1.lev : $(DAT)\grund.des $(TEMP)\lev_comp.exe $(TEMP)\lev_comp $(DAT)\grund.des $(CP) grund-?.lev $(TEMP) $(RM) grund-?.lev $(TEMP)\mall.lev : $(DAT)\newmall.des $(TEMP)\lev_comp.exe $(TEMP)\lev_comp $(DAT)\newmall.des $(CP) mall.lev $(TEMP) $(RM) mall.lev $(TEMP)\medusa-1.lev : $(DAT)\medusa.des $(TEMP)\lev_comp.exe $(TEMP)\lev_comp $(DAT)\medusa.des $(CP) medusa-?.lev $(TEMP) $(RM) medusa-?.lev $(TEMP)\minefill.lev : $(DAT)\mines.des $(TEMP)\lev_comp.exe $(TEMP)\lev_comp $(DAT)\mines.des $(CP) minend-?.lev $(TEMP) $(CP) minefill.lev $(TEMP) $(CP) minetn-?.lev $(TEMP) $(CP) mineking.lev $(TEMP) $(RM) minend-?.lev $(RM) minefill.lev $(RM) minetn-?.lev $(RM) mineking.lev $(TEMP)\tower1.lev : $(DAT)\tower.des $(TEMP)\lev_comp.exe $(TEMP)\lev_comp $(DAT)\tower.des $(CP) tower?.lev $(TEMP) $(RM) tower?.lev $(TEMP)\valley.lev : $(DAT)\gehennom.des $(TEMP)\lev_comp.exe $(TEMP)\lev_comp $(DAT)\gehennom.des $(CP) asmodeus.lev $(TEMP) $(CP) baalz.lev $(TEMP) $(CP) demogorg.lev $(TEMP) $(CP) dispater.lev $(TEMP) $(CP) geryon.lev $(TEMP) $(CP) juiblex.lev $(TEMP) $(CP) orcus.lev $(TEMP) $(CP) sanctum.lev $(TEMP) $(CP) valley.lev $(TEMP) $(CP) yeenoghu.lev $(TEMP) $(RM) asmodeus.lev $(RM) demogorg.lev $(RM) dispater.lev $(RM) geryon.lev $(RM) baalz.lev $(RM) juiblex.lev $(RM) orcus.lev $(RM) sanctum.lev $(RM) valley.lev $(RM) yeenoghu.lev $(TEMP)\wizard1.lev : $(DAT)\yendor.des $(TEMP)\lev_comp.exe $(TEMP)\lev_comp $(DAT)\yendor.des $(CP) wizard?.lev $(TEMP) $(CP) fakewiz?.lev $(TEMP) $(RM) wizard?.lev $(RM) fakewiz?.lev $(TEMP)\soko1-1.lev : $(DAT)\sokoban.des $(TEMP)\lev_comp.exe $(TEMP)\lev_comp $(DAT)\sokoban.des $(CP) soko?-?.lev $(TEMP) $(RM) soko?-?.lev # Quest dungeons $(AFILES) : $(DAT)\Arch.des $(TEMP)\lev_comp.exe $(MAKEB) QQ=Arc QF=Arch do_quest $(BFILES) : $(DAT)\Barb.des $(TEMP)\lev_comp.exe $(MAKEB) QQ=Bar QF=Barb do_quest $(CFILES) : $(DAT)\Caveman.des $(TEMP)\lev_comp.exe $(MAKEB) QQ=Cav QF=Caveman do_quest $(HFILES) : $(DAT)\Healer.des $(TEMP)\lev_comp.exe $(MAKEB) QQ=Hea QF=Healer do_quest $(KFILES) : $(DAT)\Knight.des $(TEMP)\lev_comp.exe $(MAKEB) QQ=Kni QF=Knight do_quest $(MFILES) : $(DAT)\Monk.des $(TEMP)\lev_comp.exe $(MAKEB) QQ=Mon QF=Monk do_quest $(PFILES) : $(DAT)\Priest.des $(TEMP)\lev_comp.exe $(MAKEB) QQ=Pri QF=Priest do_quest $(RANFILES) : $(DAT)\Ranger.des $(TEMP)\lev_comp.exe $(MAKEB) QQ=Ran QF=Ranger do_quest $(RFILES) : $(DAT)\Rogue.des $(TEMP)\lev_comp.exe $(MAKEB) QQ=Rog QF=Rogue do_quest $(SFILES) : $(DAT)\Samurai.des $(TEMP)\lev_comp.exe $(MAKEB) QQ=Sam QF=Samurai do_quest $(TFILES) : $(DAT)\Tourist.des $(TEMP)\lev_comp.exe $(MAKEB) QQ=Tou QF=Tourist do_quest $(VFILES) : $(DAT)\Valkyrie.des $(TEMP)\lev_comp.exe $(MAKEB) QQ=Val QF=Valkyrie do_quest $(WFILES) : $(DAT)\Wizard.des $(TEMP)\lev_comp.exe $(MAKEB) QQ=Wiz QF=Wizard do_quest $(FFILES) : $(DAT)\Flame.des $(TEMP)\lev_comp.exe $(MAKEB) QQ=Fla QF=Flame do_quest $(IFILES) : $(DAT)\Ice.des $(TEMP)\lev_comp.exe $(MAKEB) QQ=Ice QF=Ice do_quest $(NFILES) : $(DAT)\Necro.des $(TEMP)\lev_comp.exe $(MAKEB) QQ=Nec QF=Necro do_quest $(UFILES) : $(DAT)\Slayer.des $(TEMP)\lev_comp.exe $(MAKEB) QQ=Und QF=Slayer do_quest $(YFILES) : $(DAT)\Yeoman.des $(TEMP)\lev_comp.exe $(MAKEB) QQ=Yeo QF=Yeoman do_quest do_quest : $(TEMP)\lev_comp $(DAT)\$(QF).des $(CP) $(QQ)-fil?.lev $(TEMP) $(CP) $(QQ)-goal.lev $(TEMP) $(CP) $(QQ)-loca.lev $(TEMP) $(CP) $(QQ)-strt.lev $(TEMP) $(RM) $(QQ)-fil?.lev $(RM) $(QQ)-goal.lev $(RM) $(QQ)-loca.lev $(RM) $(QQ)-strt.lev # # NetHack icon for Presentation Manager. # $(GAMEDIR)\$(GAME).ico : $(SYS)\nhpmico.uu $(MAKEB) do_icon icon_msg : $(ECHO) Icon file not extracted. Extract manually if required. icon_act : $(UUDECODE) $(SYS)\nhpmico.uu $(CP) nethack.ico $(GAMEDIR)\$(GAME).ico $(RM) nethack.ico # # NetHack command file to use with Presentation Manager. # $(GAMEDIR)\$(GAME).cmd : $(MAKEB) CMDF=$@ do_cmd cmd_msg : $(ECHO) Command file not created. Create manually if required. cmd_act : $(ECHO) @echo off> $(CMDF) $(ECHO) REM Command file for starting nethack.exe from PM/WPS Desktop>> $(CMDF) $(ECHO) $(GAME).exe $(P)1 $(P)2 $(P)3 $(P)4 $(P)5 $(P)6 $(P)7>> $(CMDF) $(ECHO) pause>> $(CMDF) # # NetHack configuration file. Will not overwrite an existing file. # $(GAMEDIR)\$(GAME).cnf : $(CP) $(SSYS)\nethack.cnf $(GAMEDIR)\$(GAME).cnf # # Documentation. # $(TEMP)\$(GUIDEBOO).dvi : $(DOC)\$(GUIDEBOO).tex $(LATEX) $(DOC)\$(GUIDEBOO).tex $(CP) $(GUIDEBOO).dvi $(TEMP) $(CP) $(GUIDEBOO).aux $(TEMP) $(CP) $(GUIDEBOO).log $(TEMP) $(RM) $(GUIDEBOO).dvi $(RM) $(GUIDEBOO).aux $(RM) $(GUIDEBOO).log # # Manual pages. # copy_txt: $(CP) $(DOC)\$(GAME).txt $(GAMEDIR) $(CP) $(DOC)\recover.txt $(GAMEDIR) $(CP) $(DOC)\lev_comp.txt $(GAMEDIR) $(CP) $(DOC)\dgn_comp.txt $(GAMEDIR) $(CP) $(DOC)\dlb.txt $(GAMEDIR) copy_man: $(CP) $(DOC)\$(GAME).6 $(MAN6DIR) $(CP) $(DOC)\recover.6 $(MAN6DIR) $(CP) $(DOC)\lev_comp.6 $(MAN6DIR) $(CP) $(DOC)\dgn_comp.6 $(MAN6DIR) $(CP) $(DOC)\dlb.6 $(MAN6DIR) man_msg: $(ECHO) Manual pages not copied. Copy manually if required. # # Utilities. # copy_utils: $(GAMEDIR)\lev_comp.exe $(GAMEDIR)\dgn_comp.exe $(GAMEDIR)\dlb.exe util_msg: $(ECHO) Utils not copied. Copy manually if required. # # Housekeeping. # clean : $(RM) $(OBJ)\*.o spotless : clean $(RM) $(INCL)\date.h $(RM) $(INCL)\onames.h $(RM) $(INCL)\pm.h $(RM) $(INCL)\vis_tab.h $(RM) $(INCL)\filename.h $(RM) $(INCL)\tile.h $(RM) $(INCL)\dgn_comp.h $(RM) $(INCL)\lev_comp.h $(RM) vis_tab.c $(RM) monstr.c $(RM) tile.c $(RM) *.lev $(RM) nethack.ico $(RM) $(UTIL)\???_lex.c $(RM) $(UTIL)\???_yacc.c $(RM) $(UTIL)\???_comp.h $(RM) $(TEMP)\makedefs.exe $(RM) $(TEMP)\lev_comp.exe $(RM) $(TEMP)\dgn_comp.exe $(RM) $(TEMP)\dlb.exe $(RM) $(TEMP)\bigtile.exe $(RM) $(TEMP)\magtile.exe $(RM) $(TEMP)\txtbg.exe $(RM) $(TEMP)\txtmerge.exe $(RM) $(TEMP)\*.def $(RM) $(TEMP)\*.map $(RM) $(TEMP)\tile2x11.exe $(RM) $(TEMP)\tilemap.exe $(RM) $(TEMP)\$(GAME).r $(RM) $(TEMP)\$(GUIDEBOO).dvi $(RM) $(TEMP)\$(GUIDEBOO).aux $(RM) $(TEMP)\$(GUIDEBOO).log $(RM) $(TEMP)\$(GUIDEBOO).txt $(RM) $(TEMP)\license $(MAKEB) DATDIR=$(TEMP) removedat $(RM) x11*tiles* $(RM) $(WINSHARE)\???3?-t.txt $(RM) $(WINSHARE)\???3?.txt $(RM) $(WINSHARE)\???big.txt $(RM) $(WINSHARE)\???mag.txt uninstall: $(RM) $(GAMEFILE) $(RM) $(GAMEDIR)\$(GAME).ico $(RM) $(GAMEDIR)\$(GAME).cmd $(RM) $(GAMEDIR)\$(DLBFILE) $(RM) $(GAMEDIR)\$(DLBFILE2) $(MAKEB) DATDIR=$(GAMEDIR) removedat $(RM) $(GAMEDIR)\license $(RM) $(GAMEDIR)\$(GUIDEBOO).txt $(RM) $(GAMEDIR)\recover.exe $(RM) $(GAMEDIR)\makedefs.exe $(RM) $(GAMEDIR)\lev_comp.exe $(RM) $(GAMEDIR)\dgn_comp.exe $(RM) $(GAMEDIR)\dlb.exe $(RM) $(GAMEDIR)\$(GAME).txt $(RM) $(GAMEDIR)\recover.txt $(RM) $(GAMEDIR)\dlb.txt $(RM) $(GAMEDIR)\lev_comp.txt $(RM) $(GAMEDIR)\dgn_comp.txt $(RM) $(MAN6DIR)\slashem.6 $(RM) $(MAN6DIR)\recover.6 $(RM) $(MAN6DIR)\dlb.6 $(RM) $(MAN6DIR)\lev_comp.6 $(RM) $(MAN6DIR)\dgn_comp.6 $(RM) $(GAMEDIR)\readme.txt $(RM) $(GAMEDIR)\slamfaq.txt $(RM) $(GAMEDIR)\history.txt $(RM) $(GAMEDIR)\x11*tiles* $(RM) $(GAMEDIR)\pet_mark.xbm $(RM) $(GAMEDIR)\rip.xpm finish: $(GAMEDIR)\$(GUIDEBOO).txt $(CP) $(DAT)\license $(GAMEDIR)\LICENSE $(CP) $(NHSRC)\readme.txt $(GAMEDIR) $(CP) $(NHSRC)\slamfaq.txt $(GAMEDIR) $(CP) $(NHSRC)\history.txt $(GAMEDIR) .IF $(with_x11) == yes $(CP) x11tiles $(GAMEDIR) $(CP) x11bigtiles $(GAMEDIR) $(CP) $(WINX11)\$(GAME).ad $(GAMEDIR) $(CP) $(WINX11)\$(GAME).rc $(GAMEDIR) .END $(GAMEDIR)\$(GUIDEBOO).txt : $(TEMP)\$(GUIDEBOO).txt $(CP) $(TEMP)\$(GUIDEBOO).txt $(GAMEDIR) $(GAMEDIR)\dgn_comp.exe : $(TEMP)\dgn_comp.exe $(CP) $(TEMP)\dgn_comp.exe $(GAMEDIR) $(GAMEDIR)\lev_comp.exe : $(TEMP)\lev_comp.exe $(CP) $(TEMP)\lev_comp.exe $(GAMEDIR) $(GAMEDIR)\dlb.exe : $(TEMP)\dlb.exe $(CP) $(TEMP)\dlb.exe $(GAMEDIR) # # Main source. # # Default rules are sooo difficult for so many make # programs that we do this the most straightforward way. # $(OBJ)\allmain.o : $(SRC)\$(CB) $(HACK_H) $(SRCCC) $(OBJ)\alloc.o : $(SRC)\$(CB) $(CONFIG_H) $(SRCCC) $(OBJ)\apply.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\edog.h $(SRCCC) $(OBJ)\artifact.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\artifact.h $(INCL)\artilist.h $(SRCCC) $(OBJ)\attrib.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\artifact.h $(SRCCC) $(OBJ)\ball.o : $(SRC)\$(CB) $(HACK_H) $(SRCCC) $(OBJ)\bones.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\lev.h $(SRCCC) $(OBJ)\botl.o : $(SRC)\$(CB) $(HACK_H) $(SRCCC) $(OBJ)\cmd.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\func_tab.h $(SRCCC) $(OBJ)\dbridge.o : $(SRC)\$(CB) $(HACK_H) $(SRCCC) $(OBJ)\decl.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\quest.h $(SRCCC) $(OBJ)\detect.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\artifact.h $(SRCCC) $(OBJ)\dig.o : $(SRC)\$(CB) $(HACK_H) $(SRCCC) $(OBJ)\display.o : $(SRC)\$(CB) $(HACK_H) $(SRCCC) $(OBJ)\dlb.o : $(SRC)\$(CB) $(CONFIG_H) $(INCL)\dlb.h $(SRCCC) $(OBJ)\do.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\lev.h $(SRCCC) $(OBJ)\do_name.o : $(SRC)\$(CB) $(HACK_H) $(SRCCC) $(OBJ)\do_wear.o : $(SRC)\$(CB) $(HACK_H) $(SRCCC) $(OBJ)\dog.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\edog.h $(SRCCC) $(OBJ)\dogmove.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\mfndpos.h $(INCL)\edog.h $(SRCCC) $(OBJ)\dokick.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\eshk.h $(SRCCC) $(OBJ)\dothrow.o : $(SRC)\$(CB) $(HACK_H) $(SRCCC) $(OBJ)\drawing.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\tcap.h $(SRCCC) $(OBJ)\dungeon.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\dgn_file.h $(SRCCC) $(OBJ)\eat.o : $(SRC)\$(CB) $(HACK_H) $(SRCCC) $(OBJ)\end.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\eshk.h $(SRCCC) $(OBJ)\engrave.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\lev.h $(SRCCC) $(OBJ)\exper.o : $(SRC)\$(CB) $(HACK_H) $(SRCCC) $(OBJ)\explode.o : $(SRC)\$(CB) $(HACK_H) $(SRCCC) $(OBJ)\extralev.o : $(SRC)\$(CB) $(HACK_H) $(SRCCC) $(OBJ)\files.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\filename.h $(SRCCC) $(OBJ)\fountain.o : $(SRC)\$(CB) $(HACK_H) $(SRCCC) $(OBJ)\hack.o : $(SRC)\$(CB) $(HACK_H) $(SRCCC) $(OBJ)\hacklib.o : $(SRC)\$(CB) $(HACK_H) $(SRCCC) $(OBJ)\invent.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\artifact.h $(SRCCC) $(OBJ)\light.o : $(SRC)\$(CB) $(HACK_H) $(SRCCC) $(OBJ)\lock.o : $(SRC)\$(CB) $(HACK_H) $(SRCCC) $(OBJ)\mail.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\mail.h $(SRCCC) $(OBJ)\makemon.o : $(SRC)\$(CB) $(HACK_H) $(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 $(SRCCC) $(OBJ)\mhitu.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\artifact.h $(INCL)\edog.h $(SRCCC) $(OBJ)\minion.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\emin.h $(INCL)\epri.h $(SRCCC) $(OBJ)\mklev.o : $(SRC)\$(CB) $(HACK_H) $(SRCCC) $(OBJ)\mkmap.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\sp_lev.h $(SRCCC) $(OBJ)\mkmaze.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\sp_lev.h $(SRCCC) $(OBJ)\mkobj.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\artifact.h $(SRCCC) $(OBJ)\mkroom.o : $(SRC)\$(CB) $(HACK_H) $(SRCCC) $(OBJ)\mon.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\mfndpos.h $(INCL)\edog.h $(SRCCC) $(OBJ)\mondata.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\eshk.h $(INCL)\epri.h $(SRCCC) $(OBJ)\monmove.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\mfndpos.h $(INCL)\artifact.h $(SRCCC) $(OBJ)\monst.o : $(SRC)\$(CB) $(CONFIG_H) $(PERMONST_H) $(INCL)\monsym.h $(INCL)\eshk.h $(INCL)\vault.h $(INCL)\epri.h $(INCL)\color.h $(SRCCC) $(OBJ)\mplayer.o : $(SRC)\$(CB) $(HACK_H) $(SRCCC) $(OBJ)\mthrowu.o : $(SRC)\$(CB) $(HACK_H) $(SRCCC) $(OBJ)\muse.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\edog.h $(SRCCC) $(OBJ)\music.o : $(SRC)\$(CB) $(HACK_H) $(SRCCC) $(OBJ)\o_init.o : $(SRC)\$(CB) $(HACK_H) $(SRCCC) $(OBJ)\objects.o : $(SRC)\$(CB) $(CONFIG_H) $(INCL)\obj.h $(INCL)\objclass.h $(INCL)\prop.h $(INCL)\color.h $(SRCCC) $(OBJ)\objnam.o : $(SRC)\$(CB) $(HACK_H) $(SRCCC) $(OBJ)\options.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\tcap.h $(SRCCC) $(OBJ)\pager.o : $(SRC)\$(CB) $(HACK_H) $(SRCCC) $(OBJ)\pickup.o : $(SRC)\$(CB) $(HACK_H) $(SRCCC) $(OBJ)\pline.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\epri.h $(SRCCC) $(OBJ)\polyself.o : $(SRC)\$(CB) $(HACK_H) $(SRCCC) $(OBJ)\potion.o : $(SRC)\$(CB) $(HACK_H) $(SRCCC) $(OBJ)\pray.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\epri.h $(SRCCC) $(OBJ)\priest.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\mfndpos.h $(INCL)\eshk.h $(INCL)\epri.h $(INCL)\emin.h $(SRCCC) $(OBJ)\quest.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\quest.h $(INCL)\qtext.h $(SRCCC) $(OBJ)\questpgr.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\qtext.h $(SRCCC) $(OBJ)\read.o : $(SRC)\$(CB) $(HACK_H) $(SRCCC) $(OBJ)\region.o : $(SRC)\$(CB) $(HACK_H) $(SRCCC) $(OBJ)\rect.o : $(SRC)\$(CB) $(HACK_H) $(SRCCC) $(OBJ)\restore.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\lev.h $(INCL)\tcap.h $(INCL)\quest.h $(SRCCC) $(OBJ)\rip.o : $(SRC)\$(CB) $(HACK_H) $(SRCCC) $(OBJ)\rnd.o : $(SRC)\$(CB) $(HACK_H) $(SRCCC) $(OBJ)\role.o : $(SRC)\$(CB) $(HACK_H) $(SRCCC) $(OBJ)\rumors.o : $(SRC)\$(CB) $(HACK_H) $(SRCCC) $(OBJ)\save.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\lev.h $(INCL)\quest.h $(SRCCC) $(OBJ)\shk.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\eshk.h $(SRCCC) $(OBJ)\shknam.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\eshk.h $(SRCCC) $(OBJ)\sit.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\artifact.h $(SRCCC) $(OBJ)\sounds.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\edog.h $(INCL)\eshk.h $(SRCCC) $(OBJ)\sp_lev.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\sp_lev.h $(INCL)\rect.h $(SRCCC) $(OBJ)\spell.o : $(SRC)\$(CB) $(HACK_H) $(SRCCC) $(OBJ)\steal.o : $(SRC)\$(CB) $(HACK_H) $(SRCCC) $(OBJ)\steed.o : $(SRC)\$(CB) $(HACK_H) $(SRCCC) $(OBJ)\teleport.o : $(SRC)\$(CB) $(HACK_H) $(SRCCC) $(OBJ)\timeout.o : $(SRC)\$(CB) $(HACK_H) $(SRCCC) $(OBJ)\topten.o : $(SRC)\$(CB) $(HACK_H) $(SRCCC) $(OBJ)\track.o : $(SRC)\$(CB) $(HACK_H) $(SRCCC) $(OBJ)\trap.o : $(SRC)\$(CB) $(HACK_H) $(SRCCC) $(OBJ)\u_init.o : $(SRC)\$(CB) $(HACK_H) $(SRCCC) $(OBJ)\uhitm.o : $(SRC)\$(CB) $(HACK_H) $(SRCCC) $(OBJ)\vault.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\vault.h $(SRCCC) $(OBJ)\version.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\date.h $(INCL)\$(PATCHLEV).h $(SRCCC) $(OBJ)\vision.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\vis_tab.h $(SRCCC) $(OBJ)\weapon.o : $(SRC)\$(CB) $(HACK_H) $(SRCCC) $(OBJ)\were.o : $(SRC)\$(CB) $(HACK_H) $(SRCCC) $(OBJ)\wield.o : $(SRC)\$(CB) $(HACK_H) $(SRCCC) $(OBJ)\windows.o : $(SRC)\$(CB) $(HACK_H) $(SRCCC) $(OBJ)\wizard.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\qtext.h $(SRCCC) $(OBJ)\worm.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\lev.h $(SRCCC) $(OBJ)\worn.o : $(SRC)\$(CB) $(HACK_H) $(SRCCC) $(OBJ)\write.o : $(SRC)\$(CB) $(HACK_H) $(SRCCC) $(OBJ)\zap.o : $(SRC)\$(CB) $(HACK_H) $(SRCCC) $(OBJ)\borg.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\func_tab.h $(SRCCC) $(OBJ)\gypsy.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\egyp.h $(INCL)\qtext.h $(SRCCC) $(OBJ)\tech.o : $(SRC)\$(CB) $(HACK_H) $(INCL)\tech.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 $(INCL)\tile.h: $(TEMP)\tilemap.exe TEXT_IO = $(OBJ)\tiletext.o $(OBJ)\tiletxt.o $(OBJ)\drawing.o $(OBJ)\decl.o $(OBJ)\monst.o $(OBJ)\objects.o $(TEMP)\txtbg.exe: $(WINSHARE)\txtbg.c $(HACK_H) $(INCL)\tile.h $(TEXT_IO) $(CC) $(GCCO) $(WARN) -I$(INCL) $(CDFLAGS) $(STDC) $(WINX11CFLAGS) $(LFLAGS) \ -o $(TEMP)\txtbg.exe $(WINSHARE)\txtbg.c $(TEXT_IO) $(LIBS) $(TEMP)\txtmerge.exe: $(WINSHARE)\txtmerge.c $(CONFIG_H) $(INCL)\tile.h $(TEXT_IO) $(CC) $(GCCO) $(WARN) -I$(INCL) $(CDFLAGS) $(STDC) $(WINX11CFLAGS) $(LFLAGS) \ -o $(TEMP)\txtmerge.exe $(WINSHARE)\txtmerge.c $(TEXT_IO) $(LIBS) $(TEMP)\magtile.exe: $(WINSHARE)\magtile.c $(CONFIG_H) $(INCL)\tile.h $(TEXT_IO) $(CC) $(GCCO) $(WARN) -I$(INCL) $(CDFLAGS) $(STDC) $(WINX11CFLAGS) $(LFLAGS) \ -o $(TEMP)\magtile.exe $(WINSHARE)\magtile.c $(TEXT_IO) $(LIBS) $(TEMP)\bigtile.exe: $(WINSHARE)\bigtile.c $(CONFIG_H) $(INCL)\tile.h $(TEXT_IO) $(CC) $(GCCO) $(WARN) -I$(INCL) $(CDFLAGS) $(STDC) $(WINX11CFLAGS) $(LFLAGS) \ -o $(TEMP)\bigtile.exe $(WINSHARE)\bigtile.c $(TEXT_IO) $(LIBS) 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 x11bigtiles: $(TEMP)\tile2x11.exe $(WINSHARE)\mon32.txt $(WINSHARE)\obj32.txt $(WINSHARE)\oth32.txt $(TEMP)\tile2x11.exe -o x11bigtiles $(WINSHARE)\mon32.txt $(WINSHARE)\obj32.txt $(WINSHARE)\oth32.txt x11big3dtiles: $(TEMP)\tile2x11.exe $(WINSHARE)\mon3d.txt $(WINSHARE)\obj3d.txt $(WINSHARE)\oth3d.txt $(TEMP)\tile2x11.exe -o x11big3dtiles $(WINSHARE)\mon3d.txt $(WINSHARE)\obj3d.txt $(WINSHARE)\oth3d.txt $(OBJ)\tiletext.o: $(WINSHARE)\tiletext.c $(CONFIG_H) $(INCL)\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) $(WINSHARE)\mon32.txt: $(TEMP)\txtbg.exe $(WINSHARE)\mon32-t.txt $(TEMP)\txtbg $(WINSHARE)\mon32-t.txt $(WINSHARE)\mon32.txt $(WINSHARE)\obj32.txt: $(TEMP)\txtbg.exe $(WINSHARE)\obj32-t.txt $(TEMP)\txtbg.exe $(WINSHARE)\obj32-t.txt $(WINSHARE)\obj32.txt $(WINSHARE)\oth32.txt: $(TEMP)\txtbg.exe $(WINSHARE)\oth32-t.txt $(TEMP)\txtbg.exe $(WINSHARE)\oth32-t.txt $(WINSHARE)\oth32.txt $(WINSHARE)\mon32-t.txt: $(TEMP)\txtmerge.exe $(WINSHARE)\monmag.txt \ $(WINSHARE)\mon32mi.txt $(WINSHARE)\mon32alg.txt $(WINSHARE)\mon32aw.txt \ $(WINSHARE)\mon32se.txt $(WINSHARE)\palette.txt $(TEMP)\txtmerge.exe -p $(WINSHARE)\palette.txt \ $(WINSHARE)\mon32-t.txt $(WINSHARE)\monmag.txt -b $(WINSHARE)\mon32mi.txt \ -b $(WINSHARE)\mon32se.txt -bff00ff $(WINSHARE)\mon32alg.txt \ -bff00ff $(WINSHARE)\mon32aw.txt $(WINSHARE)\obj32-t.txt: $(TEMP)\txtmerge.exe $(WINSHARE)\objmag.txt \ $(WINSHARE)\obj32mi.txt $(WINSHARE)\obj32se.txt $(WINSHARE)\obj32alg.txt \ $(WINSHARE)\palette.txt $(TEMP)\txtmerge.exe -p $(WINSHARE)\palette.txt \ $(WINSHARE)\obj32-t.txt $(WINSHARE)\objmag.txt -b $(WINSHARE)\obj32mi.txt \ -b $(WINSHARE)\obj32se.txt -bff00ff $(WINSHARE)\obj32alg.txt $(WINSHARE)\oth32-t.txt: $(TEMP)\txtmerge.exe $(WINSHARE)\othmag.txt \ $(WINSHARE)\oth32mi.txt $(WINSHARE)\oth32se.txt $(WINSHARE)\oth32alg.txt \ $(WINSHARE)\palette.txt $(TEMP)\txtmerge.exe -p $(WINSHARE)\palette.txt \ $(WINSHARE)\oth32-t.txt $(WINSHARE)\othmag.txt -b $(WINSHARE)\oth32mi.txt \ -b $(WINSHARE)\oth32se.txt -bff00ff $(WINSHARE)\oth32alg.txt $(WINSHARE)\monmag.txt: $(TEMP)\magtile.exe $(WINSHARE)\monsters.txt $(TEMP)\magtile.exe $(WINSHARE)\objmag.txt: $(TEMP)\magtile.exe $(WINSHARE)\objects.txt $(TEMP)\magtile.exe $(WINSHARE)\othmag.txt: $(TEMP)\magtile.exe $(WINSHARE)\other.txt $(TEMP)\magtile.exe $(WINSHARE)\mon3d.txt: $(TEMP)\txtmerge.exe $(WINSHARE)\monbig.txt \ $(WINSHARE)\mon3dmi.txt $(WINSHARE)\palette.txt $(TEMP)\txtmerge.exe -p $(WINSHARE)\palette.txt $(WINSHARE)\mon3d.txt \ $(WINSHARE)\monbig.txt -b $(WINSHARE)\mon3dmi.txt $(WINSHARE)\obj3d.txt: $(TEMP)\txtmerge.exe $(WINSHARE)\objbig.txt cp $(WINSHARE)\objbig.txt $(WINSHARE)\obj3d.txt $(WINSHARE)\oth3d.txt: $(TEMP)\txtmerge.exe $(WINSHARE)\othbig.txt \ $(WINSHARE)\oth3dmi.txt $(WINSHARE)\oth-2kmi.txt $(WINSHARE)\oth3dse.txt \ $(WINSHARE)\palette.txt $(TEMP)\txtmerge.exe -p $(WINSHARE)\palette.txt $(WINSHARE)\oth3d.txt \ $(WINSHARE)\othbig.txt -b $(WINSHARE)\oth3dmi.txt -b $(WINSHARE)\oth-2kmi.txt \ -b $(WINSHARE)\oth3dse.txt $(WINSHARE)\monbig.txt: $(TEMP)\bigtile.exe $(WINSHARE)\mon32-t.txt \ $(WINSHARE)\obj32-t.txt $(WINSHARE)\oth32-t.txt $(TEMP)\bigtile.exe $(WINSHARE)\objbig.txt: $(TEMP)\bigtile.exe $(WINSHARE)\mon32-t.txt \ $(WINSHARE)\obj32-t.txt $(WINSHARE)\oth32-t.txt $(TEMP)\bigtile.exe $(WINSHARE)\othbig.txt: $(TEMP)\bigtile.exe $(WINSHARE)\mon32-t.txt \ $(WINSHARE)\obj32-t.txt $(WINSHARE)\oth32-t.txt $(TEMP)\bigtile.exe slashem-0.0.7E7F3/sys/os2/setup.cmd0000664000076400007640000000237610545462317015032 0ustar aliali/* REXX script which prepares OS/2 NetHack build environment. * * Created by Pekka Rousu */ '@echo off' SAY 'Configuring OS/2 NetHack...' /* extract the source tree top-level directory */ PARSE SOURCE nhpath PARSE VAR nhpath forget forget nhpath nhdrive = SUBSTR(nhpath,1,2) nhpath = SUBSTR(nhpath,3,LASTPOS('\sys\os2', nhpath)-3) /* Copy the makefile to src and define temporary directories */ nhdrive 'cd 'nhpath'\src' 'del Makefile >nul' infile = '..\sys\os2\Makefile.os2' outfile = 'Makefile' curline = LINEIN(infile) DO WHILE LINES(infile) IF (SUBSTR(curline, 1, 5) == 'NHSRC') then rc = LINEOUT(outfile, 'NHSRC = 'nhpath) ELSE if (SUBSTR(curline, 1, 3) == 'OBJ') then rc = LINEOUT(outfile, 'OBJ = 'nhpath'\tmp') ELSE if (SUBSTR(curline, 1, 4) == 'TEMP') then rc = LINEOUT(outfile, 'TEMP = 'nhpath'\tmp') ELSE rc = LINEOUT(outfile, curline) if rc then do SAY 'Could not write 'outfile'. Setup failed!' exit 1 end curline = LINEIN(infile) END 'md 'nhpath'\tmp >nul 2>nul' 'md \games >nul 2>nul' 'md \games\slashem >nul 2>nul' 'md \games\slashem-x11 >nul 2>nul' SAY 'Source tree is now prepared! Enter "dmake" to start the build process...' slashem-0.0.7E7F3/sys/wince/0000775000076400007640000000000010545462317013577 5ustar alialislashem-0.0.7E7F3/sys/wince/mhmsg.h0000664000076400007640000000255310545462317015070 0ustar aliali/* Copyright (C) 2001 by Alex Kompel */ /* NetHack may be freely redistributed. See license for details. */ #ifndef MHNethackMessages_H #define MHNethackMessages_H /* nethack messages */ #define WM_MSNH_COMMAND (WM_APP+1) #define MSNH_MSG_ADDWND 100 #define MSNH_MSG_PUTSTR 101 #define MSNH_MSG_PRINT_GLYPH 102 #define MSNH_MSG_CLEAR_WINDOW 103 #define MSNH_MSG_CLIPAROUND 104 #define MSNH_MSG_STARTMENU 105 #define MSNH_MSG_ADDMENU 106 #define MSNH_MSG_CURSOR 107 #define MSNH_MSG_ENDMENU 108 typedef struct mswin_nhmsg_add_wnd { winid wid; } MSNHMsgAddWnd, *PMSNHMsgAddWnd; typedef struct mswin_nhmsg_putstr { int attr; const char* text; boolean append; } MSNHMsgPutstr, *PMSNHMsgPutstr; typedef struct mswin_nhmsg_print_glyph { XCHAR_P x; XCHAR_P y; int glyph; } MSNHMsgPrintGlyph, *PMSNHMsgPrintGlyph; typedef struct mswin_nhmsg_cliparound { int x; int y; } MSNHMsgClipAround, *PMSNHMsgClipAround; typedef struct mswin_nhmsg_add_menu { int glyph; const ANY_P* identifier; CHAR_P accelerator; CHAR_P group_accel; int attr; const char * str; BOOLEAN_P presel; } MSNHMsgAddMenu, *PMSNHMsgAddMenu; typedef struct mswin_nhmsg_cursor { int x; int y; } MSNHMsgCursor, *PMSNHMsgCursor; typedef struct mswin_nhmsg_end_menu { const char* text; } MSNHMsgEndMenu, *PMSNHMsgEndMenu; #endif slashem-0.0.7E7F3/sys/wince/slashem.ini0000664000076400007640000000032310545462317015732 0ustar aliali[CEAppManager] Version = 1.0 Component = SLASHEM [SLASHEM] Description = "SLASH'EM 0.0.7E1 Prerelease" Uninstall = SLASHEM CabFiles = slashem.arm.cab,slashem.mips.cab,slashem.sa.cab,slashem.sh3.cabslashem-0.0.7E7F3/sys/wince/winmain.c0000664000076400007640000000456310545462317015415 0ustar aliali// winmain.cpp : Defines the entry point for the application. #include "winMS.h" #include #define MAX_CMDLINE_PARAM 255 extern int FDECL (main, (int,char **)); static TCHAR* _get_cmd_arg(TCHAR* pCmdLine); int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow) { int argc; char* argv[MAX_CMDLINE_PARAM]; size_t len; TCHAR* p; TCHAR wbuf[NHSTR_BUFSIZE]; char buf[NHSTR_BUFSIZE]; /* get command line parameters */ p = _get_cmd_arg( #if defined(WIN_CE_PS2xx) || defined(WIN32_PLATFORM_HPCPRO) lpCmdLine #else GetCommandLine() #endif ); for( argc = 1; p && 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)); main(argc, argv); return 0; } TCHAR* _get_cmd_arg(TCHAR* pCmdLine) { static TCHAR* pArgs = NULL; TCHAR *pRetArg; BOOL bQuoted; if( !pCmdLine && !pArgs ) return NULL; if( !pArgs ) pArgs = pCmdLine; /* skip whitespace */ for(pRetArg = pArgs; *pRetArg && _istspace(*pRetArg); pRetArg = CharNext(pRetArg)); if( !*pRetArg ) { pArgs = NULL; return NULL; } /* check for quote */ if( *pRetArg==TEXT('"') ) { bQuoted = TRUE; pRetArg = CharNext(pRetArg); pArgs = _tcschr(pRetArg, TEXT('"')); } else { /* skip to whitespace */ for(pArgs = pRetArg; *pArgs && !_istspace(*pArgs); pArgs = CharNext(pArgs)); } if( pArgs && *pArgs ) { TCHAR* p; p = pArgs; pArgs = CharNext(pArgs); *p = (TCHAR)0; } else { pArgs = NULL; } return pRetArg; } #ifndef STRNCMPI char lowc(c) /* force 'c' into lowercase */ char c; { return((char)(('A' <= c && c <= 'Z') ? (c | 040) : c)); } int strncmpi(s1, s2, n) /* case insensitive counted string comparison */ register const char *s1, *s2; register int n; /*(should probably be size_t, which is usually unsigned)*/ { /*{ aka strncasecmp }*/ register char t1, t2; while (n--) { if (!*s2) return (*s1 != 0); /* s1 >= s2 */ else if (!*s1) return -1; /* s1 < s2 */ t1 = lowc(*s1++); t2 = lowc(*s2++); if (t1 != t2) return (t1 > t2) ? 1 : -1; } return 0; /* s1 == s2 */ } #endif /* STRNCMPI */ slashem-0.0.7E7F3/sys/wince/mhcolor.c0000664000076400007640000001631010545462317015407 0ustar aliali/* Copyright (C) 2001 by Alex Kompel */ /* NetHack may be freely redistributed. See license for details. */ /* color management and such */ #include "winMS.h" #include "mhcolor.h" #define TOTAL_BRUSHES 10 #define NHBRUSH_CODE(win, type) ((((win)&0xFF)<<8)|((type)&0xFF)) struct t_brush_table { int code; HBRUSH brush; COLORREF color; }; static struct t_brush_table brush_table[TOTAL_BRUSHES]; static int max_brush = 0; static struct t_brush_table default_brush_table[] = { { NHBRUSH_CODE(NHW_STATUS, MSWIN_COLOR_FG), NULL, RGB(0, 0, 0) }, { NHBRUSH_CODE(NHW_MESSAGE, MSWIN_COLOR_FG), NULL, RGB(0, 0, 0) }, { NHBRUSH_CODE(NHW_STATUS, MSWIN_COLOR_FG), NULL, RGB(0, 0, 0) }, { NHBRUSH_CODE(NHW_TEXT, MSWIN_COLOR_FG), NULL, RGB(0, 0, 0) }, { NHBRUSH_CODE(NHW_KEYPAD, MSWIN_COLOR_FG), NULL, RGB(0, 0, 0) }, { NHBRUSH_CODE(NHW_MAP, MSWIN_COLOR_FG), NULL, RGB(96, 96, 96) }, { NHBRUSH_CODE(NHW_MENU, MSWIN_COLOR_BG), NULL, RGB(255, 255, 255) }, { NHBRUSH_CODE(NHW_MESSAGE, MSWIN_COLOR_BG), NULL, RGB(192, 192, 192) }, { NHBRUSH_CODE(NHW_STATUS, MSWIN_COLOR_BG), NULL, RGB(192, 192, 192) }, { NHBRUSH_CODE(NHW_TEXT, MSWIN_COLOR_BG), NULL, RGB(255, 255, 255) }, { NHBRUSH_CODE(NHW_KEYPAD, MSWIN_COLOR_BG), NULL, RGB(255, 255, 255) }, { NHBRUSH_CODE(NHW_MAP, MSWIN_COLOR_BG), NULL, RGB(192, 192, 192) }, { -1, NULL, RGB(0, 0, 0) } }; static void mswin_color_from_string(char *colorstring, HBRUSH* brushptr, COLORREF *colorptr); typedef struct ctv { const char *colorstring; COLORREF colorvalue; } color_table_value; /* * The color list here is a combination of: * NetHack colors. (See mhmap.c) * HTML colors. (See http://www.w3.org/TR/REC-html40/types.html#h-6.5 ) */ static color_table_value color_table[] = { /* NetHack colors */ { "black", RGB(0x55, 0x55, 0x55)}, { "red", RGB(0xFF, 0x00, 0x00)}, { "green", RGB(0x00, 0x80, 0x00)}, { "brown", RGB(0xA5, 0x2A, 0x2A)}, { "blue", RGB(0x00, 0x00, 0xFF)}, { "magenta", RGB(0xFF, 0x00, 0xFF)}, { "cyan", RGB(0x00, 0xFF, 0xFF)}, { "orange", RGB(0xFF, 0xA5, 0x00)}, { "brightgreen", RGB(0x00, 0xFF, 0x00)}, { "yellow", RGB(0xFF, 0xFF, 0x00)}, { "brightblue", RGB(0x00, 0xC0, 0xFF)}, { "brightmagenta", RGB(0xFF, 0x80, 0xFF)}, { "brightcyan", RGB(0x80, 0xFF, 0xFF)}, { "white", RGB(0xFF, 0xFF, 0xFF)}, /* Remaining HTML colors */ { "trueblack", RGB(0x00, 0x00, 0x00)}, { "gray", RGB(0x80, 0x80, 0x80)}, { "grey", RGB(0x80, 0x80, 0x80)}, { "purple", RGB(0x80, 0x00, 0x80)}, { "silver", RGB(0xC0, 0xC0, 0xC0)}, { "maroon", RGB(0x80, 0x00, 0x00)}, { "fuchsia", RGB(0xFF, 0x00, 0xFF)}, /* = NetHack magenta */ { "lime", RGB(0x00, 0xFF, 0x00)}, /* = NetHack bright green */ { "olive", RGB(0x80, 0x80, 0x00)}, { "navy", RGB(0x00, 0x00, 0x80)}, { "teal", RGB(0x00, 0x80, 0x80)}, { "aqua", RGB(0x00, 0xFF, 0xFF)}, /* = NetHack cyan */ { "", RGB(0x00, 0x00, 0x00)}, }; typedef struct ctbv { char *colorstring; int syscolorvalue; } color_table_brush_value; static color_table_brush_value color_table_brush[] = { { "activeborder", COLOR_ACTIVEBORDER }, { "activecaption", COLOR_ACTIVECAPTION }, { "appworkspace", COLOR_APPWORKSPACE }, { "background", COLOR_BACKGROUND }, { "btnface", COLOR_BTNFACE }, { "btnshadow", COLOR_BTNSHADOW }, { "btntext", COLOR_BTNTEXT }, { "captiontext", COLOR_CAPTIONTEXT }, { "graytext", COLOR_GRAYTEXT }, { "greytext", COLOR_GRAYTEXT }, { "highlight", COLOR_HIGHLIGHT }, { "highlighttext", COLOR_HIGHLIGHTTEXT }, { "inactiveborder", COLOR_INACTIVEBORDER }, { "inactivecaption", COLOR_INACTIVECAPTION }, { "menu", COLOR_MENU }, { "menutext", COLOR_MENUTEXT }, { "scrollbar", COLOR_SCROLLBAR }, { "window", COLOR_WINDOW }, { "windowframe", COLOR_WINDOWFRAME }, { "windowtext", COLOR_WINDOWTEXT }, { "", -1 }, }; void mswin_init_color_table() { int i; struct t_brush_table* p; /* cleanup */ for( i=0; icode != -1; p++ ) { if( p->code==brush_table[i].code ) { brush_table[i].brush = CreateSolidBrush(p->color); brush_table[i].color = p->color; } } } } } HBRUSH mswin_get_brush(int win_type, int color_index) { int i; for(i=0; icolorstring && _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); } slashem-0.0.7E7F3/sys/wince/mhdlg.c0000664000076400007640000005502010545462317015040 0ustar aliali/* Copyright (C) 2001 by Alex Kompel */ /* NetHack may be freely redistributed. See license for details. */ /* various dialog boxes are defined here */ #include "winMS.h" #include "hack.h" #include "func_tab.h" #include "mhdlg.h" #include "mhmain.h" #define CheckDlgButton(dlg, btn_id, st) SendDlgItemMessage((dlg), (btn_id), BM_SETCHECK, (WPARAM)(st), 0) /*---------------------------------------------------------------*/ /* data for getlin dialog */ struct getlin_data { const char* question; char* result; size_t result_size; }; LRESULT CALLBACK GetlinDlgProc(HWND, UINT, WPARAM, LPARAM); int mswin_getlin_window ( const char *question, char *result, size_t result_size ) { int ret; struct getlin_data data; /* initilize dialog data */ ZeroMemory(&data, sizeof(data)); data.question = question; data.result = result; data.result_size = result_size; /* create modal dialog window */ ret = DialogBoxParam( GetNHApp()->hApp, MAKEINTRESOURCE(IDD_GETLIN), GetNHApp()->hMainWnd, GetlinDlgProc, (LPARAM)&data ); if( ret==-1 ) panic("Cannot create getlin window"); return ret; } LRESULT CALLBACK GetlinDlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { struct getlin_data* data; RECT main_rt, text_rt, dlg_rt, edit_rt; SIZE dlg_sz; TCHAR wbuf[BUFSZ]; HDC hdc; HWND control; HWND hwndMap; #if defined(WIN_CE_POCKETPC) SHInputDialog(hWnd, message, wParam); #endif switch (message) { case WM_INITDIALOG: data = (struct getlin_data*)lParam; SetWindowText(hWnd, NH_A2W(data->question, wbuf, sizeof(wbuf))); SetWindowLong(hWnd, GWL_USERDATA, lParam); /* get title text width */ SetRect(&text_rt, 0, 0, 100, 50); hdc = GetWindowDC(hWnd); DrawText(hdc, wbuf, _tcslen(wbuf), &text_rt, DT_CALCRECT | DT_SINGLELINE | DT_NOPREFIX | DT_LEFT | DT_VCENTER ); ReleaseDC(hWnd, hdc); /* center dialog in the main window */ GetWindowRect(hWnd, &dlg_rt); hwndMap = mswin_hwnd_from_winid(WIN_MAP); GetWindowRect( IsWindow(hwndMap)? hwndMap : GetNHApp()->hMainWnd, &main_rt); dlg_sz.cx = max(dlg_rt.right-dlg_rt.left, min( text_rt.right-text_rt.left+GetSystemMetrics(SM_CXICON), main_rt.right-main_rt.left ) ); dlg_sz.cy = min(dlg_rt.bottom - dlg_rt.top, main_rt.bottom - main_rt.top); dlg_rt.left = (main_rt.left+main_rt.right-dlg_sz.cx)/2; dlg_rt.right = dlg_rt.left + dlg_sz.cx; dlg_rt.top = (main_rt.top+main_rt.bottom-dlg_sz.cy)/2; dlg_rt.bottom = dlg_rt.top + dlg_sz.cy; MoveWindow( hWnd, (main_rt.left+main_rt.right-dlg_sz.cx)/2, (main_rt.top+main_rt.bottom-dlg_sz.cy)/2, dlg_sz.cx, dlg_sz.cy, TRUE ); /* change layout of controls */ GetClientRect(hWnd, &dlg_rt); control = GetDlgItem(hWnd, IDC_GETLIN_EDIT); GetWindowRect(control, &edit_rt); MoveWindow( control, 0, 0, dlg_rt.right - dlg_rt.left, edit_rt.bottom - edit_rt.top, TRUE ); control = GetDlgItem(hWnd, IDOK); GetWindowRect(control, &text_rt); MoveWindow( control, 0, edit_rt.bottom - edit_rt.top, (dlg_rt.right-dlg_rt.left)/2, text_rt.bottom - text_rt.top, TRUE ); control = GetDlgItem(hWnd, IDCANCEL); GetWindowRect(control, &text_rt); MoveWindow( control, (dlg_rt.right-dlg_rt.left)/2, edit_rt.bottom - edit_rt.top, (dlg_rt.right-dlg_rt.left)/2, text_rt.bottom - text_rt.top, TRUE ); #if defined(WIN_CE_SMARTPHONE) NHSPhoneDialogSetup(hWnd, TRUE, FALSE); #endif /* set focus to the edit control */ SetFocus(GetDlgItem(hWnd, IDC_GETLIN_EDIT)); /* tell windows that we've set the focus */ return FALSE; break; case WM_COMMAND: { TCHAR wbuf[BUFSZ]; switch (LOWORD(wParam)) { /* OK button was pressed */ case IDOK: data = (struct getlin_data*)GetWindowLong(hWnd, GWL_USERDATA); SendDlgItemMessage(hWnd, IDC_GETLIN_EDIT, WM_GETTEXT, (WPARAM)sizeof(wbuf), (LPARAM)wbuf ); NH_W2A(wbuf, data->result, data->result_size); /* Fall through. */ /* cancel button was pressed */ case IDCANCEL: EndDialog(hWnd, wParam); return TRUE; } } break; #if defined(WIN_CE_SMARTPHONE) case WM_HOTKEY: if(VK_TBACK == HIWORD(lParam)) { SHSendBackToFocusWindow(message, wParam, lParam); } break; #endif } /* end switch (message) */ return FALSE; } /*---------------------------------------------------------------*/ /* dialog data for the list of extended commands */ struct extcmd_data { int* selection; }; LRESULT CALLBACK ExtCmdDlgProc(HWND, UINT, WPARAM, LPARAM); int mswin_ext_cmd_window (int* selection) { int ret; struct extcmd_data data; /* init dialog data */ ZeroMemory(&data, sizeof(data)); *selection = -1; data.selection = selection; /* create modal dialog window */ ret = DialogBoxParam( GetNHApp()->hApp, MAKEINTRESOURCE(IDD_EXTCMD), GetNHApp()->hMainWnd, ExtCmdDlgProc, (LPARAM)&data ); if( ret==-1 ) panic("Cannot create extcmd window"); return ret; } LRESULT CALLBACK ExtCmdDlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { struct extcmd_data* data; RECT main_rt, dlg_rt; SIZE dlg_sz; int i; const char *ptr; TCHAR wbuf[255]; switch (message) { case WM_INITDIALOG: data = (struct extcmd_data*)lParam; SetWindowLong(hWnd, GWL_USERDATA, lParam); /* center dialog in the main window */ GetWindowRect(GetNHApp()->hMainWnd, &main_rt); GetWindowRect(hWnd, &dlg_rt); dlg_sz.cx = dlg_rt.right - dlg_rt.left; dlg_sz.cy = dlg_rt.bottom - dlg_rt.top; dlg_rt.left = (main_rt.left+main_rt.right-dlg_sz.cx)/2; dlg_rt.right = dlg_rt.left + dlg_sz.cx; dlg_rt.top = (main_rt.top+main_rt.bottom-dlg_sz.cy)/2; dlg_rt.bottom = dlg_rt.top + dlg_sz.cy; MoveWindow( hWnd, (main_rt.left+main_rt.right-dlg_sz.cx)/2, (main_rt.top+main_rt.bottom-dlg_sz.cy)/2, dlg_sz.cx, dlg_sz.cy, TRUE ); /* fill combobox with extended commands */ for(i=0; (ptr=extcmdlist[i].ef_txt); i++) { SendDlgItemMessage(hWnd, IDC_EXTCMD_LIST, LB_ADDSTRING, (WPARAM)0, (LPARAM)NH_A2W(ptr, wbuf, sizeof(wbuf)) ); } #if defined(WIN_CE_SMARTPHONE) NHSPhoneDialogSetup(hWnd, FALSE, FALSE); GetClientRect(hWnd, &dlg_rt); MoveWindow(GetDlgItem(hWnd, IDC_EXTCMD_LIST), dlg_rt.left, dlg_rt.top, dlg_rt.right-dlg_rt.left, dlg_rt.bottom-dlg_rt.top, TRUE); #endif /* set focus to the list control */ SetFocus(GetDlgItem(hWnd, IDC_EXTCMD_LIST)); /* tell windows we set the focus */ return FALSE; break; case WM_COMMAND: data = (struct extcmd_data*)GetWindowLong(hWnd, GWL_USERDATA); switch (LOWORD(wParam)) { /* OK button ws clicked */ case IDOK: *data->selection = SendDlgItemMessage(hWnd, IDC_EXTCMD_LIST, LB_GETCURSEL, (WPARAM)0, (LPARAM)0 ); if( *data->selection==LB_ERR ) *data->selection = -1; /* Fall through. */ /* CANCEL button ws clicked */ case IDCANCEL: EndDialog(hWnd, wParam); return TRUE; /* list control events */ case IDC_EXTCMD_LIST: switch(HIWORD(wParam)) { case LBN_DBLCLK: /* double click within the list wParam The low-order word is the list box identifier. The high-order word is the notification message. lParam Handle to the list box */ *data->selection = SendMessage((HWND)lParam, LB_GETCURSEL, (WPARAM)0, (LPARAM)0); if( *data->selection==LB_ERR ) *data->selection = -1; EndDialog(hWnd, IDOK); return TRUE; } break; } } return FALSE; } /*---------------------------------------------------------------*/ /* player selector dialog data */ struct plsel_data { int* selection; }; BOOL CALLBACK PlayerSelectorDlgProc(HWND, UINT, WPARAM, LPARAM); static void plselInitDialog(HWND hWnd); static void plselAdjustLists(HWND hWnd, int changed_opt); static int plselFinalSelection(HWND hWnd, int* selection); int mswin_player_selection_window ( int* selection ) { int ret; struct plsel_data data; /* init dialog data */ ZeroMemory(&data, sizeof(data)); data.selection = selection; /* create modal dialog */ ret = DialogBoxParam( GetNHApp()->hApp, MAKEINTRESOURCE(IDD_PLAYER_SELECTOR), GetNHApp()->hMainWnd, PlayerSelectorDlgProc, (LPARAM)&data ); if( ret==-1 ) panic("Cannot create getlin window"); return ret; } BOOL CALLBACK PlayerSelectorDlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { struct plsel_data* data; RECT main_rt, dlg_rt; SIZE dlg_sz; switch (message) { case WM_INITDIALOG: data = (struct plsel_data*)lParam; SetWindowLong(hWnd, GWL_USERDATA, lParam); /* center dialog in the main window */ GetWindowRect(GetNHApp()->hMainWnd, &main_rt); GetWindowRect(hWnd, &dlg_rt); dlg_sz.cx = dlg_rt.right - dlg_rt.left; dlg_sz.cy = dlg_rt.bottom - dlg_rt.top; dlg_rt.left = (main_rt.left+main_rt.right-dlg_sz.cx)/2; dlg_rt.right = dlg_rt.left + dlg_sz.cx; dlg_rt.top = (main_rt.top+main_rt.bottom-dlg_sz.cy)/2; dlg_rt.bottom = dlg_rt.top + dlg_sz.cy; MoveWindow( hWnd, (main_rt.left+main_rt.right-dlg_sz.cx)/2, (main_rt.top+main_rt.bottom-dlg_sz.cy)/2, dlg_sz.cx, dlg_sz.cy, TRUE ); /* init dialog */ plselInitDialog(hWnd); #if defined(WIN_CE_SMARTPHONE) NHSPhoneDialogSetup(hWnd, FALSE, FALSE); #endif /* set focus on the role checkbox (random) field */ SetFocus(GetDlgItem(hWnd, IDC_PLSEL_ROLE_RANDOM)); /* tell windows we set the focus */ return FALSE; break; case WM_COMMAND: data = (struct plsel_data*)GetWindowLong(hWnd, GWL_USERDATA); switch (LOWORD(wParam)) { /* OK button was clicked */ case IDOK: if( plselFinalSelection(hWnd, data->selection) ) { EndDialog(hWnd, wParam); } else { MessageBox(hWnd, TEXT("Cannot match this role. Try something else."), TEXT("STOP"), MB_OK ); } return TRUE; /* CANCEL button was clicked */ case IDCANCEL: *data->selection = -1; EndDialog(hWnd, wParam); return TRUE; /* following are events from dialog controls: "random" checkboxes send BN_CLICKED messages; role/race/... combo-boxes send CBN_SELENDOK if something was selected; */ case IDC_PLSEL_ROLE_RANDOM: if( HIWORD(wParam)==BN_CLICKED ) { /* enable corresponding list window if "random" checkbox was "unchecked" */ EnableWindow( GetDlgItem(hWnd, IDC_PLSEL_ROLE_LIST), SendMessage((HWND)lParam, BM_GETCHECK, 0, 0)==BST_UNCHECKED ); } break; case IDC_PLSEL_RACE_RANDOM: if( HIWORD(wParam)==BN_CLICKED ) { EnableWindow( GetDlgItem(hWnd, IDC_PLSEL_RACE_LIST), SendMessage((HWND)lParam, BM_GETCHECK, 0, 0)==BST_UNCHECKED ); } break; case IDC_PLSEL_GENDER_RANDOM: if( HIWORD(wParam)==BN_CLICKED ) { EnableWindow( GetDlgItem(hWnd, IDC_PLSEL_GENDER_LIST), SendMessage((HWND)lParam, BM_GETCHECK, 0, 0)==BST_UNCHECKED ); } break; case IDC_PLSEL_ALIGN_RANDOM: if( HIWORD(wParam)==BN_CLICKED ) { EnableWindow( GetDlgItem(hWnd, IDC_PLSEL_ALIGN_LIST), SendMessage((HWND)lParam, BM_GETCHECK, 0, 0)==BST_UNCHECKED ); } break; case IDC_PLSEL_ROLE_LIST: if( HIWORD(wParam)==CBN_SELENDOK ) { /* filter out invalid options if the selection was made */ plselAdjustLists( hWnd, LOWORD(wParam) ); } break; case IDC_PLSEL_RACE_LIST: if( HIWORD(wParam)==CBN_SELENDOK ) { plselAdjustLists( hWnd, LOWORD(wParam) ); } break; case IDC_PLSEL_GENDER_LIST: if( HIWORD(wParam)==CBN_SELENDOK ) { plselAdjustLists( hWnd, LOWORD(wParam) ); } break; case IDC_PLSEL_ALIGN_LIST: if( HIWORD(wParam)==CBN_SELENDOK ) { plselAdjustLists( hWnd, LOWORD(wParam) ); } break; } break; } return FALSE; } void setComboBoxValue(HWND hWnd, int combo_box, int value) { int index_max = SendDlgItemMessage(hWnd, combo_box, CB_GETCOUNT, 0, 0); int index; int value_to_set = LB_ERR; for (index = 0; index < index_max; index++) { if (SendDlgItemMessage(hWnd, combo_box, CB_GETITEMDATA, (WPARAM)index, 0) == value) { value_to_set = index; break; } } SendDlgItemMessage(hWnd, combo_box, CB_SETCURSEL, (WPARAM)value_to_set, 0); } /* initialize player selector dialog */ void plselInitDialog(HWND hWnd) { TCHAR wbuf[BUFSZ]; /* set player name */ SetDlgItemText(hWnd, IDC_PLSEL_NAME, NH_A2W(plname, wbuf, sizeof(wbuf))); /* check flags for consistency */ if( flags.initrole>=0 ) { if (flags.initrace>=0 && !validrace(flags.initrole, flags.initrace)) { flags.initrace = ROLE_NONE; } if (flags.initgend>=0 && !validgend(flags.initrole, flags.initrace, flags.initgend)) { flags.initgend = ROLE_NONE; } if (flags.initalign>=0 && !validalign(flags.initrole, flags.initrace, flags.initalign)) { flags.initalign = ROLE_NONE; } } /* populate select boxes */ plselAdjustLists(hWnd, -1); /* intialize roles list */ if( flags.initrole<0 || !ok_role(flags.initrole, ROLE_NONE, ROLE_NONE, ROLE_NONE)) { CheckDlgButton(hWnd, IDC_PLSEL_ROLE_RANDOM, BST_CHECKED); EnableWindow(GetDlgItem(hWnd, IDC_PLSEL_ROLE_LIST), FALSE); } else { CheckDlgButton(hWnd, IDC_PLSEL_ROLE_RANDOM, BST_UNCHECKED); EnableWindow(GetDlgItem(hWnd, IDC_PLSEL_ROLE_LIST), TRUE); setComboBoxValue(hWnd, IDC_PLSEL_ROLE_LIST, flags.initrole); } /* intialize races list */ if( flags.initrace<0 || !ok_race(flags.initrole, flags.initrace, ROLE_NONE, ROLE_NONE) ) { CheckDlgButton(hWnd, IDC_PLSEL_RACE_RANDOM, BST_CHECKED); EnableWindow(GetDlgItem(hWnd, IDC_PLSEL_RACE_LIST), FALSE); } else { CheckDlgButton(hWnd, IDC_PLSEL_RACE_RANDOM, BST_UNCHECKED); EnableWindow(GetDlgItem(hWnd, IDC_PLSEL_RACE_LIST), TRUE); setComboBoxValue(hWnd, IDC_PLSEL_RACE_LIST, flags.initrace); } /* intialize genders list */ if( flags.initgend<0 || !ok_gend(flags.initrole, flags.initrace, flags.initgend, ROLE_NONE)) { CheckDlgButton(hWnd, IDC_PLSEL_GENDER_RANDOM, BST_CHECKED); EnableWindow(GetDlgItem(hWnd, IDC_PLSEL_GENDER_LIST), FALSE); } else { CheckDlgButton(hWnd, IDC_PLSEL_GENDER_RANDOM, BST_UNCHECKED); EnableWindow(GetDlgItem(hWnd, IDC_PLSEL_GENDER_LIST), TRUE); setComboBoxValue(hWnd, IDC_PLSEL_GENDER_LIST, flags.initgend); } /* intialize alignments list */ if( flags.initalign<0 || !ok_align(flags.initrole, flags.initrace, flags.initgend, flags.initalign) ) { CheckDlgButton(hWnd, IDC_PLSEL_ALIGN_RANDOM, BST_CHECKED); EnableWindow(GetDlgItem(hWnd, IDC_PLSEL_ALIGN_LIST), FALSE); } else { CheckDlgButton(hWnd, IDC_PLSEL_ALIGN_RANDOM, BST_UNCHECKED); EnableWindow(GetDlgItem(hWnd, IDC_PLSEL_ALIGN_LIST), TRUE); setComboBoxValue(hWnd, IDC_PLSEL_ALIGN_LIST, flags.initalign); } } /* adjust role/race/alignment/gender list - filter out invalid combinations changed_sel points to the list where selection 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)? flags.initrole : SendMessage(control_role, CB_GETITEMDATA, ind, 0); ind = SendMessage(control_race, CB_GETCURSEL, 0, 0); initrace = (ind==LB_ERR)? flags.initrace : SendMessage(control_race, CB_GETITEMDATA, ind, 0); ind = SendMessage(control_gender, CB_GETCURSEL, 0, 0); initgend = (ind==LB_ERR)? flags.initgend : SendMessage(control_gender, CB_GETITEMDATA, ind, 0); ind = SendMessage(control_align, CB_GETCURSEL, 0, 0); initalign = (ind==LB_ERR)? flags.initalign : SendMessage(control_align, CB_GETITEMDATA, ind, 0); /* intialize roles list */ if( changed_sel==-1 ) { valid_opt = 0; /* reset content and populate the list */ SendMessage(control_role, CB_RESETCONTENT, 0, 0); for (i = 0; roles[i].name.m; i++) { if (ok_role(i, initrace, initgend, initalign)) { if (initgend>=0 && flags.female && roles[i].name.f) ind = SendMessage(control_role, CB_ADDSTRING, (WPARAM)0, (LPARAM)NH_A2W(roles[i].name.f, wbuf, sizeof(wbuf)) ); else ind = SendMessage(control_role, CB_ADDSTRING, (WPARAM)0, (LPARAM)NH_A2W(roles[i].name.m, wbuf, sizeof(wbuf)) ); SendMessage(control_role, CB_SETITEMDATA, (WPARAM)ind, (LPARAM)i ); if( i==initrole ) { SendMessage(control_role, CB_SETCURSEL, (WPARAM)ind, (LPARAM)0 ); valid_opt = 1; } } } /* set selection to the previously selected role if it is still valid */ if( !valid_opt ) { initrole = ROLE_NONE; initrace = ROLE_NONE; initgend = ROLE_NONE; initalign = ROLE_NONE; SendMessage(control_role, CB_SETCURSEL, (WPARAM)-1, (LPARAM)0 ); } /* trigger change of the races list */ changed_sel=IDC_PLSEL_ROLE_LIST; } /* intialize races list */ if( changed_sel==IDC_PLSEL_ROLE_LIST ) { valid_opt = 0; /* reset content and populate the list */ SendMessage(control_race, CB_RESETCONTENT, 0, 0); for (i = 0; races[i].noun; i++) if (ok_race(initrole, i, ROLE_NONE, ROLE_NONE)) { ind = SendMessage(control_race, CB_ADDSTRING, (WPARAM)0, (LPARAM)NH_A2W(races[i].noun, wbuf, sizeof(wbuf)) ); SendMessage(control_race, CB_SETITEMDATA, (WPARAM)ind, (LPARAM)i ); if( i==initrace ) { SendMessage(control_race, CB_SETCURSEL, (WPARAM)ind, (LPARAM)0 ); valid_opt = 1; } } /* set selection to the previously selected race if it is still valid */ if( !valid_opt ) { initrace = ROLE_NONE; initgend = ROLE_NONE; initalign = ROLE_NONE; SendMessage(control_race, CB_SETCURSEL, (WPARAM)-1, (LPARAM)0 ); } /* trigger change of the genders list */ changed_sel=IDC_PLSEL_RACE_LIST; } /* intialize genders list */ if( changed_sel==IDC_PLSEL_RACE_LIST ) { valid_opt = 0; /* reset content and populate the list */ SendMessage(control_gender, CB_RESETCONTENT, 0, 0); for (i = 0; i < ROLE_GENDERS; i++) if (ok_gend(initrole, initrace, i, ROLE_NONE)) { ind = SendMessage(control_gender, CB_ADDSTRING, (WPARAM)0, (LPARAM)NH_A2W(genders[i].adj, wbuf, sizeof(wbuf)) ); SendMessage(control_gender, CB_SETITEMDATA, (WPARAM)ind, (LPARAM)i ); if( i==initgend ) { SendMessage(control_gender, CB_SETCURSEL, (WPARAM)ind, (LPARAM)0 ); valid_opt = 1; } } /* set selection to the previously selected gender if it is still valid */ if( !valid_opt ) { initgend = ROLE_NONE; initalign = ROLE_NONE; SendMessage(control_gender, CB_SETCURSEL, (WPARAM)-1, (LPARAM)0 ); } /* trigger change of the alignments list */ changed_sel=IDC_PLSEL_GENDER_LIST; } /* intialize alignments list */ if( changed_sel==IDC_PLSEL_GENDER_LIST ) { valid_opt = 0; /* reset content and populate the list */ SendMessage(control_align, CB_RESETCONTENT, 0, 0); for (i = 0; i < ROLE_ALIGNS; i++) if (ok_align(initrole, initrace, initgend, i)) { ind = SendMessage(control_align, CB_ADDSTRING, (WPARAM)0, (LPARAM)NH_A2W(aligns[i].adj, wbuf, sizeof(wbuf)) ); SendMessage(control_align, CB_SETITEMDATA, (WPARAM)ind, (LPARAM)i ); if( i==initalign ) { SendMessage(control_align, CB_SETCURSEL, (WPARAM)ind, (LPARAM)0 ); valid_opt = 1; } } /* set selection to the previously selected alignment if it is still valid */ if( !valid_opt ) { initalign = ROLE_NONE; SendMessage(control_align, CB_SETCURSEL, (WPARAM)-1, (LPARAM)0 ); } } } /* player made up his mind - get final selection here */ int plselFinalSelection(HWND hWnd, int* selection) { int ind; /* get current selections */ if( SendDlgItemMessage(hWnd, IDC_PLSEL_ROLE_RANDOM, BM_GETCHECK, 0, 0)==BST_CHECKED ) { flags.initrole = ROLE_RANDOM; } else { ind = SendDlgItemMessage(hWnd, IDC_PLSEL_ROLE_LIST, CB_GETCURSEL, 0, 0); flags.initrole = (ind==LB_ERR)? ROLE_RANDOM : SendDlgItemMessage(hWnd, IDC_PLSEL_ROLE_LIST, CB_GETITEMDATA, ind, 0); } if( SendDlgItemMessage(hWnd, IDC_PLSEL_RACE_RANDOM, BM_GETCHECK, 0, 0)==BST_CHECKED ) { flags.initrace = ROLE_RANDOM; } else { ind = SendDlgItemMessage(hWnd, IDC_PLSEL_RACE_LIST, CB_GETCURSEL, 0, 0); flags.initrace = (ind==LB_ERR)? ROLE_RANDOM : SendDlgItemMessage(hWnd, IDC_PLSEL_RACE_LIST, CB_GETITEMDATA, ind, 0); } if( SendDlgItemMessage(hWnd, IDC_PLSEL_GENDER_RANDOM, BM_GETCHECK, 0, 0)==BST_CHECKED ) { flags.initgend = ROLE_RANDOM; } else { ind = SendDlgItemMessage(hWnd, IDC_PLSEL_GENDER_LIST, CB_GETCURSEL, 0, 0); flags.initgend = (ind==LB_ERR)? ROLE_RANDOM : SendDlgItemMessage(hWnd, IDC_PLSEL_GENDER_LIST, CB_GETITEMDATA, ind, 0); } if( SendDlgItemMessage(hWnd, IDC_PLSEL_ALIGN_RANDOM, BM_GETCHECK, 0, 0)==BST_CHECKED ) { flags.initalign = ROLE_RANDOM; } else { ind = SendDlgItemMessage(hWnd, IDC_PLSEL_ALIGN_LIST, CB_GETCURSEL, 0, 0); flags.initalign = (ind==LB_ERR)? ROLE_RANDOM : SendDlgItemMessage(hWnd, IDC_PLSEL_ALIGN_LIST, CB_GETITEMDATA, ind, 0); } /* check the role */ if( flags.initrole==ROLE_RANDOM ) { flags.initrole = pick_role(flags.initrace, flags.initgend, flags.initalign, PICK_RANDOM); if (flags.initrole < 0) { MessageBox(hWnd, TEXT("Incompatible role!"), TEXT("STOP"), MB_OK); return FALSE; } } /* Select a race, if necessary */ /* force compatibility with role */ if (flags.initrace==ROLE_RANDOM || !validrace(flags.initrole, flags.initrace)) { /* pre-selected race not valid */ if (flags.initrace == ROLE_RANDOM) { flags.initrace = pick_race(flags.initrole, flags.initgend, flags.initalign, PICK_RANDOM); } if (flags.initrace < 0) { MessageBox(hWnd, TEXT("Incompatible race!"), TEXT("STOP"), MB_OK); return FALSE; } } /* Select a gender, if necessary */ /* force compatibility with role/race, try for compatibility with * pre-selected alignment */ if (flags.initgend < 0 || !validgend(flags.initrole, flags.initrace, flags.initgend)) { /* pre-selected gender not valid */ if (flags.initgend == ROLE_RANDOM) { flags.initgend = pick_gend(flags.initrole, flags.initrace, flags.initalign, PICK_RANDOM); } if (flags.initgend < 0) { MessageBox(hWnd, TEXT("Incompatible gender!"), TEXT("STOP"), MB_OK); return FALSE; } } /* Select an alignment, if necessary */ /* force compatibility with role/race/gender */ if (flags.initalign < 0 || !validalign(flags.initrole, flags.initrace, flags.initalign)) { /* pre-selected alignment not valid */ if (flags.initalign == ROLE_RANDOM) { flags.initalign = pick_align(flags.initrole, flags.initrace, flags.initgend, PICK_RANDOM); } else { MessageBox(hWnd, TEXT("Incompatible alignment!"), TEXT("STOP"), MB_OK); return FALSE; } } return TRUE; } slashem-0.0.7E7F3/sys/wince/resource.h0000664000076400007640000001534510545462317015607 0ustar aliali//{{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_WINHACK 107 #define IDC_WINHACK 109 #define IDC_SPHONE_DIALOGBAR 111 #define IDR_MAINFRAME 128 #define IDB_TILES 129 #define IDD_TEXT 130 #define IDD_NHTEXT 130 #define IDD_MENU 132 #define IDB_MENU_SEL 133 #define IDB_MENU_UNSEL 134 #define IDD_COMMANDS 136 #define IDD_GETLIN 138 #define IDD_EXTCMD 139 #define IDD_PLAYER_SELECTOR 141 #define IDB_PETMARK 145 #define IDB_MENU_SEL_COUNT 146 #define IDB_KEYPAD 147 #define IDB_MENUBAR 154 #define IDC_TEXT_VIEW 1001 #define IDC_CMD_MOVE_NW 1001 #define IDC_CMD_MOVE_N 1002 #define IDC_MENU_LIST 1003 #define IDC_CMD_MOVE_NE 1003 #define IDC_MENU_TEXT 1004 #define IDC_CMD_MOVE_W 1004 #define IDC_CMD_MOVE_SELF 1005 #define IDC_CMD_MOVE_E 1006 #define IDC_CMD_MOVE_SW 1007 #define IDC_CMD_MOVE_S 1008 #define IDC_CMD_MOVE_SE 1009 #define IDC_CMD_MOVE_UP 1010 #define IDC_CMD_MOVE_DOWN 1011 #define IDC_CMD_5 1012 #define IDC_CMD_A 1013 #define IDC_CMD_B 1014 #define IDC_CMD_C 1015 #define IDC_CMD_D 1016 #define IDC_CMD_E 1017 #define IDC_CMD_F 1018 #define IDC_CMD_G 1019 #define IDC_CMD_H 1020 #define IDC_CMD_I 1021 #define IDC_CMD_J 1022 #define IDC_CMD_K 1023 #define IDC_CMD_L 1024 #define IDC_CMD_M 1025 #define IDC_CMD_N 1026 #define IDC_CMD_O 1027 #define IDC_CMD_P 1028 #define IDC_CMD_Q 1029 #define IDC_CMD_R 1030 #define IDC_CMD_S 1031 #define IDC_CMD_T 1032 #define IDC_CMD_U 1033 #define IDC_CMD_V 1034 #define IDC_CMD_W 1035 #define IDC_CMD_X 1036 #define IDC_CMD_Y 1037 #define IDC_CMD_Z 1038 #define IDC_CMD_AA 1039 #define IDC_CMD_BB 1040 #define IDC_CMD_CC 1041 #define IDC_CMD_DD 1042 #define IDC_CMD_EE 1043 #define IDC_CMD_FF 1044 #define IDC_CMD_GG 1045 #define IDC_CMD_HH 1046 #define IDC_CMD_II 1047 #define IDC_CMD_JJ 1048 #define IDC_CMD_KK 1049 #define IDC_CMD_LL 1050 #define IDC_CMD_MM 1051 #define IDC_CMD_NN 1052 #define IDC_CMD_OO 1053 #define IDC_CMD_PP 1054 #define IDC_CMD_QQ 1055 #define IDC_CMD_RR 1056 #define IDC_CMD_SS 1057 #define IDC_CMD_TT 1058 #define IDC_CMD_UU 1059 #define IDC_CMD_VV 1060 #define IDC_CMD_WW 1061 #define IDC_CMD_XX 1062 #define IDC_CMD_YY 1063 #define IDC_CMD_ZZ 1064 #define IDC_CMD_FIRST 1100 #define IDC_CMD_LAST 1300 #define IDC_GETLIN_EDIT 1309 #define IDC_EXTCMD_LIST 1310 #define IDC_PLSEL_NAME 1314 #define IDC_PLSEL_ROLE_RANDOM 1315 #define IDC_PLSEL_RACE_RANDOM 1318 #define IDC_PLSEL_GENDER_RANDOM 1319 #define IDC_PLSEL_ALIGN_RANDOM 1320 #define IDC_PLSEL_ROLE_LIST 1323 #define IDC_PLSEL_RACE_LIST 1324 #define IDC_PLSEL_ALIGN_LIST 1325 #define IDC_PLSEL_GENDER_LIST 1326 #define IDC_ABOUT_VERSION 1327 #define IDC_TEXT_CONTROL 1331 #define IDC_ABOUT_COPYRIGHT 1332 #define IDM_SAVE 32771 #define IDM_HELP_LONG 32772 #define IDM_HELP_COMMANDS 32773 #define IDM_HELP_HISTORY 32774 #define IDM_HELP_INFO_CHAR 32775 #define IDM_HELP_INFO_KEY 32776 #define IDM_HELP_OPTIONS 32777 #define IDM_HELP_OPTIONS_LONG 32778 #define IDM_HELP_EXTCMD 32779 #define IDM_HELP_LICENSE 32780 #define IDM_MAP_TILES 32781 #define IDM_MAP_ASCII4X6 32782 #define IDM_MAP_ASCII6X8 32783 #define IDM_MAP_ASCII8X8 32784 #define IDM_MAP_ASCII16X8 32785 #define IDM_MAP_ASCII7X12 32786 #define IDM_MAP_ASCII8X12 32787 #define IDM_MAP_ASCII16X12 32788 #define IDM_MAP_ASCII12X16 32789 #define IDM_MAP_ASCII10X18 32790 #define IDM_MAP_FIT_TO_SCREEN 32791 #define ID_FILE 32792 #define IDS_CAP_FILE 32793 #define ID_HELP 32794 #define IDS_CAP_HELP 32795 #define IDS_CAP_TEMP 32796 #define ID_MAP 32797 #define IDS_CAP_AMP 32798 #define IDS_CAP_MAP 32799 #define IDM_VIEW_KEYPAD 32800 #define ID_VIEW 32801 #define IDS_CAP_VIEW 32802 #define IDS_CAP_ENTIREMAP 32826 #define IDS_CAP_NORMALMAP 32827 #define IDM_HELP_MENU 32828 #define IDM_VIEW_OPTIONS 32829 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 155 #define _APS_NEXT_COMMAND_VALUE 32830 #define _APS_NEXT_CONTROL_VALUE 1334 #define _APS_NEXT_SYMED_VALUE 110 #endif #endif slashem-0.0.7E7F3/sys/wince/ceinc/0000775000076400007640000000000010545462317014660 5ustar alialislashem-0.0.7E7F3/sys/wince/ceinc/sys/0000775000076400007640000000000010545462317015476 5ustar alialislashem-0.0.7E7F3/sys/wince/ceinc/sys/stat.h0000664000076400007640000000002210545462317016614 0ustar aliali/* empty file */ slashem-0.0.7E7F3/sys/wince/ceinc/errno.h0000664000076400007640000000004510545462317016155 0ustar aliali/* empty file */ extern int errno; slashem-0.0.7E7F3/sys/wince/ceinc/assert.h0000664000076400007640000000036210545462317016333 0ustar aliali/*** *assert.h - define the assert macro * ****/ #undef assert #ifdef NDEBUG #define assert(exp) ((void)0) #else #define assert(exp) (void)( (exp) || (panic("%s at %s line %ld", #exp, __FILE__,__LINE__), 1) ) #endif /* NDEBUG */ slashem-0.0.7E7F3/sys/wince/ceinc/fcntl.h0000664000076400007640000000405610545462317016144 0ustar aliali/*** *fcntl.h - file control options used by open() * *Purpose: * This file defines constants for the file control options used * by the _open() function. * [System V] * * [Public] * ****/ #ifndef _INC_FCNTL #define _INC_FCNTL #define _O_RDONLY 0x0000 /* open for reading only */ #define _O_WRONLY 0x0001 /* open for writing only */ #define _O_RDWR 0x0002 /* open for reading and writing */ #define _O_APPEND 0x0008 /* writes done at eof */ #define _O_CREAT 0x0100 /* create and open file */ #define _O_TRUNC 0x0200 /* open and truncate */ #define _O_EXCL 0x0400 /* open only if file doesn't already exist */ /* O_TEXT files have sequences translated to on read()'s, ** and sequences translated to on write()'s */ #define _O_TEXT 0x4000 /* file mode is text (translated) */ #define _O_BINARY 0x8000 /* file mode is binary (untranslated) */ /* macro to translate the C 2.0 name used to force binary mode for files */ #define _O_RAW _O_BINARY /* Open handle inherit bit */ #define _O_NOINHERIT 0x0080 /* child process doesn't inherit file */ /* Temporary file bit - file is deleted when last handle is closed */ #define _O_TEMPORARY 0x0040 /* temporary file bit */ /* sequential/random access hints */ #define _O_SEQUENTIAL 0x0020 /* file access is primarily sequential */ #define _O_RANDOM 0x0010 /* file access is primarily random */ #if !__STDC__ || defined(_POSIX_) /* Non-ANSI names for compatibility */ #define O_RDONLY _O_RDONLY #define O_WRONLY _O_WRONLY #define O_RDWR _O_RDWR #define O_APPEND _O_APPEND #define O_CREAT _O_CREAT #define O_TRUNC _O_TRUNC #define O_EXCL _O_EXCL #define O_TEXT _O_TEXT #define O_BINARY _O_BINARY #define O_RAW _O_BINARY #define O_TEMPORARY _O_TEMPORARY #define O_NOINHERIT _O_NOINHERIT #define O_SEQUENTIAL _O_SEQUENTIAL #define O_RANDOM _O_RANDOM #endif /* __STDC__ */ #endif /* _INC_FCNTL */ slashem-0.0.7E7F3/sys/wince/mhrip.c0000664000076400007640000000052610545462317015065 0ustar aliali/* Copyright (C) 2001 by Alex Kompel */ /* NetHack may be freely redistributed. See license for details. */ #include "winMS.h" #include "mhrip.h" #include "mhtext.h" HWND mswin_init_RIP_window () { return mswin_init_text_window(); } void mswin_display_RIP_window (HWND hWnd) { mswin_display_text_window(hWnd); } slashem-0.0.7E7F3/sys/wince/defaults.nh0000664000076400007640000001164110545462317015740 0ustar aliali# 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 "r." to read...' use: #OPTIONS=suppress_alert:0.0.7 # # Set some options to control graphical window-port (these will # be safely and silently ignored by the tty port) # # Map window settings # possible map_mode options include: tiles|ascii4x6|ascii6x8|ascii8x8|ascii16x8| # ascii7x12|ascii8x12|ascii16x12|ascii12x16| # ascii10x18|fit_to_screen OPTIONS=map_mode:tiles,scroll_margin:4 # Menu settings # OPTIONS=font_menu:Arial # Other OPTIONS=hilite_pet,!toptenwin OPTIONS=!splash_screen,player_selection:prompts OPTIONS=vary_msgcount:3 OPTIONS=fullscreen,wraptext,softkeyboard # Status/message window colors # Possible color options include: # six digit hexadecimal RGB color value ("#8F8F8F"), black, red, green, brown, # blue, magenta, cyan, gray (or grey), orange, brightgreen, yellow, brightblue, # brightmagenta, brightcyan, white, trueblack, purple, silver, maroon, fuchsia, # lime, olive, navy, teal, aqua, activeborder, activecaption, appworkspace, # background, btnface, btnshadow, btntext, captiontext, graytext, highlight, # highlighttext, inactiveborder, inactivecaption, menu, menutext, scrollbar, # window, windowframe, windowtext. #OPTIONS=windowcolors:status windowtext/window message windowtext/window OPTIONS=windowcolors:status white/#000000 message white/#000000 menu white/#000000 text white/#000000 # #HACKDIR=c:\games\nethack # # Note: On Windows HACKDIR defaults to the location # of the NetHack.exe or NetHackw.exe file. # Setting HACKDIR above will override that. # # LEVELS and SAVE default to HACKDIR # #LEVELS=c:\games\nethack\bones #SAVE=c:\games\nethack\bones # *** 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 slashem-0.0.7E7F3/sys/wince/mhaskyn.c0000664000076400007640000000044310545462317015416 0ustar aliali/* 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'; } slashem-0.0.7E7F3/sys/wince/mswproc.c0000664000076400007640000016251310545462317015445 0ustar aliali/* Copyright (C) 2001 by Alex Kompel */ /* NetHack may be freely redistributed. See license for details. */ /* * This file implements the interface between the window port specific * code in the mswin port and the rest of the nethack game engine. */ #include "hack.h" #include "dlb.h" #include "winMS.h" #include "mhmap.h" #include "mhstatus.h" #include "mhtext.h" #include "mhmsgwnd.h" #include "mhmenu.h" #include "mhmsg.h" #include "mhcmd.h" #include "mhinput.h" #include "mhaskyn.h" #include "mhdlg.h" #include "mhrip.h" #include "mhmain.h" #include "mhfont.h" #include "mhcolor.h" #define LLEN 128 #ifdef _DEBUG extern void logDebug(const char *fmt, ...); #else void logDebug(const char *fmt, ...) { } #endif static void mswin_main_loop(); static BOOL initMapTiles(void); static void prompt_for_player_selection(void); /* Interface definition, for windows.c */ struct window_procs mswin_procs = { "MSWIN", WC_COLOR|WC_HILITE_PET|WC_ALIGN_MESSAGE|WC_ALIGN_STATUS| WC_INVERSE|WC_SCROLL_MARGIN|WC_MAP_MODE| WC_FONT_MESSAGE|WC_FONT_STATUS|WC_FONT_MENU|WC_FONT_TEXT|WC_FONT_MAP| WC_FONTSIZ_MESSAGE|WC_FONTSIZ_STATUS|WC_FONTSIZ_MENU|WC_FONTSIZ_TEXT| WC_TILE_WIDTH|WC_TILE_HEIGHT|WC_TILE_FILE|WC_VARY_MSGCOUNT| WC_WINDOWCOLORS|WC_PLAYER_SELECTION, WC2_FULLSCREEN|WC2_SOFTKEYBOARD|WC2_WRAPTEXT, mswin_init_nhwindows, 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) { HWND hWnd; logDebug("mswin_init_nhwindows()\n"); #ifdef _DEBUG { /* truncate trace file */ FILE *dfp = fopen("nhtrace.log", "w"); fclose(dfp); } #endif /* intialize input subsystem */ mswin_nh_input_init(); /* read registry settings */ mswin_read_reg(); /* set it to WIN_ERR so we can detect attempts to use this ID before it is inialized */ WIN_MAP = WIN_ERR; /* check default values */ if( iflags.wc_fontsiz_statusNHFONT_SIZE_MAX ) iflags.wc_fontsiz_status = NHFONT_STATUS_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_BOTTOM; if( iflags.wc_align_status==0 ) iflags.wc_align_status = ALIGN_TOP; if( iflags.wc_scroll_margin==0 ) iflags.wc_scroll_margin = DEF_CLIPAROUND_MARGIN; if( iflags.wc_tile_width==0 ) iflags.wc_tile_width = TILE_X; if( iflags.wc_tile_height==0 ) iflags.wc_tile_height = TILE_Y; if( iflags.wc_vary_msgcount==0 ) iflags.wc_vary_msgcount = 3; /* force tabs in menus */ iflags.menu_tab_sep = 1; /* force toptenwin to be true. toptenwin is the option that decides whether to * write output to a window or stdout. stdout doesn't make sense on Windows * non-console applications */ 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); /* init color table */ mswin_init_color_table(); /* set font-related options to change in the game */ set_wc_option_mod_status( WC_HILITE_PET | WC_ALIGN_MESSAGE | WC_ALIGN_STATUS | WC_SCROLL_MARGIN | WC_MAP_MODE | WC_FONT_MESSAGE | WC_FONT_STATUS | WC_FONT_MENU | WC_FONT_TEXT | WC_FONTSIZ_MESSAGE | WC_FONTSIZ_STATUS | WC_FONTSIZ_MENU | WC_FONTSIZ_TEXT | WC_VARY_MSGCOUNT, SET_IN_GAME ); /* WC2 options */ set_wc2_option_mod_status( WC2_FULLSCREEN| WC2_SOFTKEYBOARD, SET_IN_FILE ); GetNHApp()->bFullScreen = iflags.wc2_fullscreen; GetNHApp()->bUseSIP = iflags.wc2_softkeyboard; set_wc2_option_mod_status( WC2_WRAPTEXT, SET_IN_GAME ); GetNHApp()->bWrapText = iflags.wc2_wraptext; /* create the main nethack window */ hWnd = mswin_init_main_window(); if (!hWnd) panic( "Cannot create the main window." ); ShowWindow(hWnd, GetNHApp()->nCmdShow); UpdateWindow(hWnd); GetNHApp()->hMainWnd = hWnd; /* set Full screen if requested */ mswin_set_fullscreen(GetNHApp()->bFullScreen); /* let nethack code know that the window subsystem is ready */ iflags.window_inited = TRUE; } /* Do a window-port specific player type selection. If player_selection() offers a Quit option, it is its responsibility to clean up and terminate the process. You need to fill in pl_character[0]. */ void mswin_player_selection(void) { logDebug("mswin_player_selection()\n"); #if defined(WIN_CE_SMARTPHONE) /* SmartPhone does not supprt combo-boxes therefor we cannot use dialog for player selection */ prompt_for_player_selection(); #else if (iflags.wc_player_selection == VIA_DIALOG) { int nRole; /* pick player type randomly (use pre-selected role/race/gender/alignment) */ if( flags.randomall ) { if (flags.initrole < 0) { flags.initrole = pick_role(flags.initrace, flags.initgend, flags.initalign, PICK_RANDOM); if (flags.initrole < 0) { raw_print("Incompatible role!"); flags.initrole = randrole(); } } if (flags.initrace < 0 || !validrace(flags.initrole, flags.initrace)) { flags.initrace = pick_race(flags.initrole, flags.initgend, flags.initalign, PICK_RANDOM); if (flags.initrace < 0) { raw_print("Incompatible race!"); flags.initrace = randrace(flags.initrole); } } if (flags.initgend < 0 || !validgend(flags.initrole, flags.initrace, flags.initgend)) { flags.initgend = pick_gend(flags.initrole, flags.initrace, flags.initalign, PICK_RANDOM); if (flags.initgend < 0) { raw_print("Incompatible gender!"); flags.initgend = randgend(flags.initrole, flags.initrace); } } if (flags.initalign < 0 || !validalign(flags.initrole, flags.initrace, flags.initalign)) { flags.initalign = pick_align(flags.initrole, flags.initrace, flags.initgend, PICK_RANDOM); if (flags.initalign < 0) { raw_print("Incompatible alignment!"); flags.initalign = randalign(flags.initrole, flags.initrace); } } } else { /* select a role */ if( mswin_player_selection_window( &nRole ) == IDCANCEL ) { bail(0); } } } else { /* iflags.wc_player_selection == VIA_PROMPTS */ prompt_for_player_selection(); } #endif /* defined(WIN_CE_SMARTPHONE) */ } void prompt_for_player_selection(void) { int i, k, n; char pick4u = 'n', thisch, lastch = 0; char pbuf[QBUFSZ], plbuf[QBUFSZ]; winid win; anything any; menu_item *selected = 0; int box_result; TCHAR wbuf[BUFSZ]; logDebug("prompt_for_player_selection()\n"); /* prevent an unnecessary prompt */ rigid_role_checks(); /* Should we randomly pick for the player? */ if (!flags.randomall && (flags.initrole == ROLE_NONE || flags.initrace == ROLE_NONE || flags.initgend == ROLE_NONE || flags.initalign == ROLE_NONE)) { /* int echoline; */ char *prompt = build_plselection_prompt(pbuf, QBUFSZ, flags.initrole, flags.initrace, flags.initgend, flags.initalign); /* tty_putstr(BASE_WINDOW, 0, ""); */ /* echoline = wins[BASE_WINDOW]->cury; */ box_result = MessageBox(NULL, NH_A2W(prompt, wbuf, BUFSZ), TEXT("NetHack for Windows"), #if defined(WIN_CE_SMARTPHONE) MB_YESNO | MB_DEFBUTTON1 #else MB_YESNOCANCEL | MB_DEFBUTTON1 #endif ); pick4u = (box_result == IDYES) ? 'y' : (box_result == IDNO) ? 'n' : '\033'; /* tty_putstr(BASE_WINDOW, 0, prompt); */ do { /* pick4u = lowc(readchar()); */ if (index(quitchars, pick4u)) pick4u = 'y'; } while(!index(ynqchars, pick4u)); if ((int)strlen(prompt) + 1 < CO) { /* Echo choice and move back down line */ /* tty_putsym(BASE_WINDOW, (int)strlen(prompt)+1, echoline, pick4u); */ /* tty_putstr(BASE_WINDOW, 0, ""); */ } else /* Otherwise it's hard to tell where to echo, and things are * wrapping a bit messily anyway, so (try to) make sure the next * question shows up well and doesn't get wrapped at the * bottom of the window. */ /* tty_clear_nhwindow(BASE_WINDOW) */ ; if (pick4u != 'y' && pick4u != 'n') { give_up: /* Quit */ if (selected) free((genericptr_t) selected); bail((char *)0); /*NOTREACHED*/ return; } } (void) root_plselection_prompt(plbuf, QBUFSZ - 1, flags.initrole, flags.initrace, flags.initgend, flags.initalign); /* Select a role, if necessary */ /* we'll try to be compatible with pre-selected race/gender/alignment, * but may not succeed */ if (flags.initrole < 0) { char rolenamebuf[QBUFSZ]; /* Process the choice */ if (pick4u == 'y' || flags.initrole == ROLE_RANDOM || flags.randomall) { /* Pick a random role */ flags.initrole = pick_role(flags.initrace, flags.initgend, flags.initalign, PICK_RANDOM); if (flags.initrole < 0) { /* tty_putstr(BASE_WINDOW, 0, "Incompatible role!"); */ flags.initrole = randrole(); } } 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(); // Don't do any of this (?) - exit_nhwindows does not terminate // the application // DestroyWindow(GetNHApp()->hMainWnd); // terminate(EXIT_SUCCESS); } /* Prepare the window to be suspended. */ void mswin_suspend_nhwindows(const char *str) { logDebug("mswin_suspend_nhwindows(%s)\n", str); return; } /* Restore the windows after being suspended. */ void mswin_resume_nhwindows() { logDebug("mswin_resume_nhwindows()\n"); return; } /* Create a window of type "type" which can be NHW_MESSAGE (top line) NHW_STATUS (bottom lines) NHW_MAP (main dungeon) NHW_MENU (inventory or other "corner" windows) NHW_TEXT (help/text, full screen paged window) */ winid mswin_create_nhwindow(int type) { winid i = 0; MSNHMsgAddWnd data; logDebug("mswin_create_nhwindow(%d)\n", type); /* Return the next available winid */ for (i=1; 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 (wid != -1) { if( !GetNHApp()->windowlist[wid].dead && GetNHApp()->windowlist[wid].win != NULL ) DestroyWindow(GetNHApp()->windowlist[wid].win); GetNHApp()->windowlist[wid].win = NULL; GetNHApp()->windowlist[wid].type = 0; GetNHApp()->windowlist[wid].dead = 0; } } /* Next output to window will start at (x,y), also moves displayable cursor to (x,y). For backward compatibility, 1 <= x < cols, 0 <= y < rows, where cols and rows are the size of window. */ void mswin_curs(winid wid, int x, int y) { logDebug("mswin_curs(%d, %d, %d)\n", wid, x, y); if ((wid >= 0) && (wid < MAXWINDOWS) && (GetNHApp()->windowlist[wid].win != NULL)) { MSNHMsgCursor data; data.x = x; data.y = y; SendMessage( GetNHApp()->windowlist[wid].win, WM_MSNH_COMMAND, (WPARAM)MSNH_MSG_CURSOR, (LPARAM)&data ); } } /* putstr(window, attr, str) -- Print str on the window with the given attribute. Only printable ASCII characters (040-0126) must be supported. Multiple putstr()s are output on separate lines. Attributes can be one of ATR_NONE (or 0) ATR_ULINE ATR_BOLD ATR_BLINK ATR_INVERSE If a window-port does not support all of these, it may map unsupported attributes to a supported one (e.g. map them all to ATR_INVERSE). putstr() may compress spaces out of str, break str, or truncate str, if necessary for the display. Where putstr() breaks a line, it has to clear to end-of-line. -- putstr should be implemented such that if two putstr()s are done consecutively the user will see the first and then the second. In the tty port, pline() achieves this by calling more() or displaying both on the same line. */ void mswin_putstr(winid wid, int attr, const char *text) { logDebug("mswin_putstr(%d, %d, %s)\n", wid, attr, text); mswin_putstr_ex(wid, attr, text, 0); } void mswin_putstr_ex(winid wid, int attr, const char *text, boolean app) { if( (wid >= 0) && (wid < MAXWINDOWS) ) { if( GetNHApp()->windowlist[wid].win==NULL && GetNHApp()->windowlist[wid].type==NHW_MENU ) { GetNHApp()->windowlist[wid].win = mswin_init_menu_window(MENU_TYPE_TEXT); GetNHApp()->windowlist[wid].dead = 0; } if (GetNHApp()->windowlist[wid].win != NULL) { MSNHMsgPutstr data; ZeroMemory(&data, sizeof(data)); data.attr = attr; data.text = text; data.append = app; SendMessage( GetNHApp()->windowlist[wid].win, WM_MSNH_COMMAND, (WPARAM)MSNH_MSG_PUTSTR, (LPARAM)&data ); } } } /* Display the file named str. Complain about missing files iff complain is TRUE. */ void mswin_display_file(const char *filename,BOOLEAN_P must_exist) { dlb *f; TCHAR wbuf[BUFSZ]; logDebug("mswin_display_file(%s, %d)\n", filename, must_exist); f = dlb_fopen(filename, RDTMODE); if (!f) { if (must_exist) { TCHAR message[90]; _stprintf(message, TEXT("Warning! Could not find file: %s\n"), NH_A2W(filename, wbuf, sizeof(wbuf))); MessageBox(GetNHApp()->hMainWnd, message, TEXT("ERROR"), MB_OK | MB_ICONERROR ); } } else { winid text; char line[LLEN]; text = mswin_create_nhwindow(NHW_TEXT); while (dlb_fgets(line, LLEN, f)) { size_t len; len = strlen(line); if( line[len-1]=='\n' ) line[len-1]='\x0'; mswin_putstr(text, ATR_NONE, line); } (void) dlb_fclose(f); mswin_display_nhwindow(text, 1); mswin_destroy_nhwindow(text); } } /* Start using window as a menu. You must call start_menu() before add_menu(). After calling start_menu() you may not putstr() to the window. Only windows of type NHW_MENU may be used for menus. */ void mswin_start_menu(winid wid) { logDebug("mswin_start_menu(%d)\n", wid); if( (wid >= 0) && (wid < MAXWINDOWS) ) { if( GetNHApp()->windowlist[wid].win==NULL && GetNHApp()->windowlist[wid].type==NHW_MENU ) { GetNHApp()->windowlist[wid].win = mswin_init_menu_window(MENU_TYPE_MENU); GetNHApp()->windowlist[wid].dead = 0; } if(GetNHApp()->windowlist[wid].win != NULL) { SendMessage( GetNHApp()->windowlist[wid].win, WM_MSNH_COMMAND, (WPARAM)MSNH_MSG_STARTMENU, (LPARAM)NULL ); } } } /* add_menu(windid window, int glyph, const anything identifier, char accelerator, char groupacc, int attr, char *str, boolean preselected) -- Add a text line str to the given menu window. If identifier is 0, then the line cannot be selected (e.g. a title). Otherwise, identifier is the value returned if the line is selected. Accelerator is a keyboard key that can be used to select the line. If the accelerator of a selectable item is 0, the window system is free to select its own accelerator. It is up to the window-port to make the accelerator visible to the user (e.g. put "a - " in front of str). The value attr is the same as in putstr(). Glyph is an optional glyph to accompany the line. If window port cannot or does not want to display it, this is OK. If there is no glyph applicable, then this value will be NO_GLYPH. -- All accelerators should be in the range [A-Za-z]. -- It is expected that callers do not mix accelerator choices. Either all selectable items have an accelerator or let the window system pick them. Don't do both. -- Groupacc is a group accelerator. It may be any character outside of the standard accelerator (see above) or a number. If 0, the item is unaffected by any group accelerator. If this accelerator conflicts with the menu command (or their user defined 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"); SendMessage(mswin_hwnd_from_winid(WIN_MESSAGE), WM_VSCROLL, MAKEWPARAM(SB_LINEUP, 0), (LPARAM)NULL); return 0; } /* char yn_function(const char *ques, const char *choices, char default) -- Print a prompt made up of ques, choices and default. Read a single character response that is contained in choices or default. If choices is NULL, all possible inputs are accepted and returned. This overrides everything else. The choices are expected to be in lower case. Entering ESC always maps to 'q', or 'n', in that order, if present in choices, otherwise it maps to default. Entering any other quit character (SPACE, RETURN, NEWLINE) maps to default. -- If the choices string contains ESC, then anything after it is an acceptable response, but the ESC and whatever follows is not included in the prompt. -- If the choices string contains a '#' then accept a count. Place this value in the global "yn_number" and return '#'. -- This uses the top line in the tty window-port, other ports might use a popup. */ char mswin_yn_function(const char *question, const char *choices, CHAR_P def) { int result=-1; char ch; char yn_esc_map='\033'; char message[BUFSZ]; char res_ch[2]; logDebug("mswin_yn_function(%s, %s, %d)\n", question, choices, def); if (choices) { char *cb, choicebuf[QBUFSZ]; Strcpy(choicebuf, choices); if ((cb = index(choicebuf, '\033')) != 0) { /* anything beyond is hidden */ *cb = '\0'; } 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); } #if defined(WIN_CE_SMARTPHONE) { char buf[BUFSZ]; ZeroMemory(buf, sizeof(buf)); if( choices ) { if( !index(choices, '\033') ) buf[0]='\033'; /* make sure ESC is always available */ strncat( buf, choices, sizeof(buf)-2); NHSPhoneSetKeypadFromString( buf ); } else { /* sometimes choices are included in the message itself, e.g. "what? [abcd]" */ char *p1, *p2; p1 = strchr(question, '['); p2 = strrchr(question, ']'); if( p1 && p2 && p1= 0) && (wid < MAXWINDOWS) ) { DestroyWindow(GetNHApp()->windowlist[wid].win); GetNHApp()->windowlist[wid].win = mswin_init_RIP_window(); GetNHApp()->windowlist[wid].type = NHW_RIP; GetNHApp()->windowlist[wid].dead = 0; } genl_outrip(wid, how); } /* 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; } if( _stricmp( pref, "fullscreen")==0 ) { mswin_set_fullscreen(iflags.wc2_fullscreen); return; } if( _stricmp( pref, "softkeyboard")==0 ) { GetNHApp()->bUseSIP = iflags.wc2_softkeyboard; return; } if( _stricmp( pref, "wraptext")==0 ) { GetNHApp()->bWrapText = iflags.wc2_wraptext; return; } } void mswin_main_loop() { MSG msg; while( !mswin_have_input() && GetMessage(&msg, NULL, 0, 0)!=0 ) { if (!TranslateAccelerator(msg.hwnd, GetNHApp()->hAccelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } } /* clean up and quit */ void bail(const char *mesg) { clearlocks(); mswin_exit_nhwindows(mesg); terminate(EXIT_SUCCESS); /*NOTREACHED*/ } BOOL initMapTiles(void) { HBITMAP hBmp; BITMAP bm; TCHAR wbuf[MAX_PATH]; int tl_num; SIZE map_size; extern int total_tiles_used; /* no file - no tile */ if( !(iflags.wc_tile_file && *iflags.wc_tile_file) ) return TRUE; /* load bitmap */ hBmp = SHLoadDIBitmap(NH_A2W(iflags.wc_tile_file, wbuf, MAX_PATH)); if( hBmp==NULL ) { raw_print("Cannot load tiles from the file. Reverting back to default."); return FALSE; } /* calculate tile dimensions */ GetObject(hBmp, sizeof(BITMAP), (LPVOID)&bm); if( bm.bmWidth%iflags.wc_tile_width || bm.bmHeight%iflags.wc_tile_height ) { DeleteObject(hBmp); raw_print("Tiles bitmap does not match tile_width and tile_height options. Reverting back to default."); return FALSE; } tl_num = (bm.bmWidth/iflags.wc_tile_width)* (bm.bmHeight/iflags.wc_tile_height); if( tl_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; } void mswin_popup_display(HWND hWnd, int* done_indicator) { MSG msg; HWND hChild; /* activate the menu window */ GetNHApp()->hPopupWnd = hWnd; mswin_layout_main_window(hWnd); /* disable game windows */ for( hChild=GetWindow(GetNHApp()->hMainWnd, GW_CHILD); hChild; hChild = GetWindow(hChild, GW_HWNDNEXT) ) { if( hChild!=hWnd ) EnableWindow(hChild, FALSE); } #if defined(WIN_CE_SMARTPHONE) ShowWindow(GetNHApp()->hMenuBar, SW_HIDE); ShowWindow(SHFindMenuBar(hWnd), SW_SHOW); #else EnableWindow(GetNHApp()->hMenuBar, FALSE); #endif /* bring menu window on top */ SetWindowPos(hWnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW); /* go into message loop */ if( done_indicator ) *done_indicator = 0; while( IsWindow(hWnd) && (done_indicator==NULL || !*done_indicator) && GetMessage(&msg, NULL, 0, 0)!=0 ) { if( !IsDialogMessage(hWnd, &msg) ) { if (!TranslateAccelerator(msg.hwnd, GetNHApp()->hAccelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } } } void mswin_popup_destroy(HWND hWnd) { HWND hChild; /* enable game windows */ for( hChild=GetWindow(GetNHApp()->hMainWnd, GW_CHILD); hChild; hChild = GetWindow(hChild, GW_HWNDNEXT) ) { if( hChild!= hWnd) { EnableWindow(hChild, TRUE); } } #if defined(WIN_CE_SMARTPHONE) ShowWindow(SHFindMenuBar(hWnd), SW_HIDE); ShowWindow(GetNHApp()->hMenuBar, SW_SHOW); #else EnableWindow(GetNHApp()->hMenuBar, TRUE); #endif SetWindowPos(hWnd, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_HIDEWINDOW); GetNHApp()->hPopupWnd = NULL; mswin_window_mark_dead( mswin_winid_from_handle(hWnd) ); DestroyWindow(hWnd); mswin_layout_main_window(hWnd); SetFocus(GetNHApp()->hMainWnd ); } void mswin_set_fullscreen(BOOL is_fullscreen) { #if defined(WIN_CE_POCKETPC) || defined(WIN_CE_SMARTPHONE) SetForegroundWindow(GetNHApp()->hMainWnd); if( is_fullscreen ) { SHFullScreen(GetNHApp()->hMainWnd, SHFS_HIDETASKBAR | SHFS_HIDESTARTICON); MoveWindow( GetNHApp()->hMainWnd, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), FALSE ); } else { RECT rc; SystemParametersInfo(SPI_GETWORKAREA, 0, &rc, 0); SHFullScreen(GetNHApp()->hMainWnd, SHFS_SHOWTASKBAR | SHFS_SHOWSTARTICON); MoveWindow( GetNHApp()->hMainWnd, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, FALSE ); } GetNHApp()->bFullScreen = is_fullscreen; #else GetNHApp()->bFullScreen = FALSE; #endif } #if defined(WIN_CE_SMARTPHONE) void NHSPhoneDialogSetup(HWND hDlg, BOOL is_edit, BOOL is_fullscreen) { SHMENUBARINFO mbi; HWND hOK, hCancel; RECT rtOK, rtDlg; // Create our MenuBar ZeroMemory(&mbi, sizeof(SHMENUBARINFO)); mbi.cbSize = sizeof(mbi); mbi.hwndParent = hDlg; mbi.nToolBarId = IDC_SPHONE_DIALOGBAR; mbi.hInstRes = GetNHApp()->hApp; if(!SHCreateMenuBar(&mbi)) { error("cannot create dialog menu"); } if(is_fullscreen) { SHINITDLGINFO shidi; RECT main_wnd_rect; shidi.dwMask = SHIDIM_FLAGS; shidi.dwFlags = SHIDIF_SIZEDLGFULLSCREEN; shidi.hDlg = hDlg; SHInitDialog(&shidi); GetWindowRect(GetNHApp()->hMainWnd, &main_wnd_rect); MoveWindow( hDlg, main_wnd_rect.left, main_wnd_rect.top, main_wnd_rect.right - main_wnd_rect.left, main_wnd_rect.bottom - main_wnd_rect.top, FALSE ); } /* hide OK and CANCEL buttons */ hOK = GetDlgItem(hDlg, IDOK); hCancel = GetDlgItem(hDlg, IDCANCEL); if( IsWindow(hCancel) ) ShowWindow(hCancel, SW_HIDE); if( IsWindow(hOK) ) { GetWindowRect(hOK, &rtOK); GetWindowRect(hDlg, &rtDlg); rtDlg.bottom -= rtOK.bottom-rtOK.top; ShowWindow(hOK, SW_HIDE); SetWindowPos( hDlg, HWND_TOP, 0, 0, rtDlg.right-rtDlg.left, rtDlg.bottom-rtDlg.top, SWP_NOMOVE | SWP_NOREPOSITION | SWP_NOZORDER ); } /* override "Back" button for edit box dialogs */ if( is_edit ) SendMessage(mbi.hwndMB, SHCMBM_OVERRIDEKEY, VK_TBACK, MAKELPARAM(SHMBOF_NODEFAULT | SHMBOF_NOTIFY, SHMBOF_NODEFAULT | SHMBOF_NOTIFY)); } #endif /* defined(WIN_CE_SMARTPHONE) */ void mswin_read_reg(void) { } void mswin_destroy_reg(void) { } void mswin_write_reg(void) { } #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 slashem-0.0.7E7F3/sys/wince/mhtext.c0000664000076400007640000001361010545462317015255 0ustar aliali/* Copyright (C) 2001 by Alex Kompel */ /* NetHack may be freely redistributed. See license for details. */ #include "winMS.h" #include "mhtext.h" #include "mhmsg.h" #include "mhfont.h" #include "mhcolor.h" #include "mhtxtbuf.h" typedef struct mswin_nethack_text_window { PNHTextBuffer window_text; int done; } NHTextWindow, *PNHTextWindow; static WNDPROC editControlWndProc = NULL; LRESULT CALLBACK TextWndProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK NHTextControlWndProc(HWND, UINT, WPARAM, LPARAM); static void onMSNHCommand(HWND hWnd, WPARAM wParam, LPARAM lParam); static void LayoutText(HWND hwnd); HWND mswin_init_text_window () { HWND ret; PNHTextWindow data; ret = CreateDialog( GetNHApp()->hApp, MAKEINTRESOURCE(IDD_NHTEXT), GetNHApp()->hMainWnd, TextWndProc ); if( !ret ) panic("Cannot create text window"); data = (PNHTextWindow)malloc(sizeof(NHTextWindow)); if( !data ) panic("out of memory"); ZeroMemory(data, sizeof(NHTextWindow)); data->window_text = mswin_init_text_buffer( program_state.gameover? FALSE : GetNHApp()->bWrapText ); SetWindowLong(ret, GWL_USERDATA, (LONG)data); return ret; } void mswin_display_text_window (HWND hWnd) { PNHTextWindow data; data = (PNHTextWindow)GetWindowLong(hWnd, GWL_USERDATA); if( data ) { HWND control; control = GetDlgItem(hWnd, IDC_TEXT_CONTROL); SendMessage(control, EM_FMTLINES, 1, 0 ); mswin_render_text(data->window_text, GetDlgItem(hWnd, IDC_TEXT_CONTROL)); data->done = 0; mswin_popup_display(hWnd, &data->done); mswin_popup_destroy(hWnd); } } LRESULT CALLBACK TextWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { HWND control; HDC hdc; PNHTextWindow data; data = (PNHTextWindow)GetWindowLong(hWnd, GWL_USERDATA); switch (message) { case WM_INITDIALOG: /* set text control font */ control = GetDlgItem(hWnd, IDC_TEXT_CONTROL); if( !control ) { panic("cannot get text view window"); } hdc = GetDC(control); SendMessage(control, WM_SETFONT, (WPARAM)mswin_get_font(NHW_TEXT, ATR_NONE, hdc, FALSE), 0); ReleaseDC(control, hdc); #if defined(WIN_CE_SMARTPHONE) /* special initialization for SmartPhone dialogs */ NHSPhoneDialogSetup(hWnd, FALSE, GetNHApp()->bFullScreen); #endif /* subclass edit control */ editControlWndProc = (WNDPROC)GetWindowLong(control, GWL_WNDPROC); SetWindowLong(control, GWL_WNDPROC, (LONG)NHTextControlWndProc); if( !program_state.gameover && GetNHApp()->bWrapText ) { DWORD styles; styles = GetWindowLong(control, GWL_STYLE); if( styles ) { SetWindowLong(control, GWL_STYLE, styles & (~WS_HSCROLL)); SetWindowPos(control, NULL, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOZORDER | SWP_NOMOVE | SWP_NOSIZE ); } } SetFocus(control); return FALSE; case WM_MSNH_COMMAND: onMSNHCommand(hWnd, wParam, lParam); break; case WM_SIZE: LayoutText(hWnd); return FALSE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: case IDCANCEL: data->done = 1; return TRUE; } break; case WM_CTLCOLORBTN: case WM_CTLCOLOREDIT: case WM_CTLCOLORSTATIC: { /* sent by edit control before it is drawn */ HDC hdcEdit = (HDC) wParam; HWND hwndEdit = (HWND) lParam; if( hwndEdit == GetDlgItem(hWnd, IDC_TEXT_CONTROL) ) { SetBkColor(hdcEdit, mswin_get_color(NHW_TEXT, MSWIN_COLOR_BG)); SetTextColor(hdcEdit, mswin_get_color(NHW_TEXT, MSWIN_COLOR_FG)); return (BOOL)mswin_get_brush(NHW_TEXT, MSWIN_COLOR_BG); } } return FALSE; case WM_DESTROY: if( data ) { mswin_free_text_buffer(data->window_text); free(data); SetWindowLong(hWnd, GWL_USERDATA, (LONG)0); } break; } return FALSE; } void onMSNHCommand(HWND hWnd, WPARAM wParam, LPARAM lParam) { PNHTextWindow data; data = (PNHTextWindow)GetWindowLong(hWnd, GWL_USERDATA); switch( wParam ) { case MSNH_MSG_PUTSTR: { PMSNHMsgPutstr msg_data = (PMSNHMsgPutstr)lParam; mswin_add_text(data->window_text, msg_data->attr, msg_data->text); break; } } } void 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 */ if( IsWindow(btn_ok) ) { 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; MoveWindow(btn_ok, pt_ok.x, pt_ok.y, sz_ok.cx, sz_ok.cy, TRUE ); pt_elem.x = clrt.left; pt_elem.y = clrt.top; sz_elem.cx = clrt.right - clrt.left; sz_elem.cy = pt_ok.y; MoveWindow(text, pt_elem.x, pt_elem.y, sz_elem.cx, sz_elem.cy, TRUE ); } else { pt_elem.x = clrt.left; pt_elem.y = clrt.top; sz_elem.cx = clrt.right - clrt.left; sz_elem.cy = clrt.bottom - clrt.top; MoveWindow(text, pt_elem.x, pt_elem.y, sz_elem.cx, sz_elem.cy, TRUE ); } } /* Text control window proc - implements close on space and scrolling on arrows */ LRESULT CALLBACK NHTextControlWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { case WM_KEYUP: switch( wParam ) { case VK_SPACE: case VK_RETURN: /* close on space */ PostMessage(GetParent(hWnd), WM_COMMAND, MAKELONG(IDOK, 0), 0); return 0; case VK_UP: /* scoll up */ PostMessage(hWnd, WM_VSCROLL, MAKEWPARAM(SB_LINEUP, 0), (LPARAM)NULL); return 0; case VK_DOWN: /* scoll down */ PostMessage(hWnd, WM_VSCROLL, MAKEWPARAM(SB_LINEDOWN, 0), (LPARAM)NULL); return 0; case VK_LEFT: /* scoll left */ PostMessage(hWnd, WM_HSCROLL, MAKEWPARAM(SB_LINELEFT, 0), (LPARAM)NULL); return 0; case VK_RIGHT: /* scoll right */ PostMessage(hWnd, WM_HSCROLL, MAKEWPARAM(SB_LINERIGHT, 0), (LPARAM)NULL); return 0; } break; /* case WM_KEYUP: */ } if( editControlWndProc ) return CallWindowProc(editControlWndProc, hWnd, message, wParam, lParam); else return 0; } slashem-0.0.7E7F3/sys/wince/mhcolor.h0000664000076400007640000000076210545462317015420 0ustar aliali/* Copyright (C) 2001 by Alex Kompel */ /* NetHack may be freely redistributed. See license for details. */ /* color management functions */ #ifndef MSWINColor_h #define MSWINColor_h #define MSWIN_COLOR_BG 0 #define MSWIN_COLOR_FG 1 #define SYSCLR_TO_BRUSH(x) ((HBRUSH)((x) + 1)) extern void mswin_init_color_table(); extern HBRUSH mswin_get_brush(int win_type, int color_index); extern COLORREF mswin_get_color(int win_type, int color_index); #endif /* MSWINColor_h */ slashem-0.0.7E7F3/sys/wince/mhmap.c0000664000076400007640000006112110545462317015046 0ustar aliali/* Copyright (C) 2001 by Alex Kompel */ /* NetHack may be freely redistributed. See license for details. */ #include "winMS.h" #include "mhmap.h" #include "mhmsg.h" #include "mhinput.h" #include "mhfont.h" #include "patchlevel.h" #define NHMAP_FONT_NAME TEXT("Terminal") #define MAXWINDOWTEXT 255 extern short glyph2tile[]; /* map window data */ typedef struct mswin_nethack_map_window { int map[COLNO][ROWNO]; /* glyph map */ int mapMode; /* current map mode */ boolean bAsciiMode; /* switch ASCII/tiled mode */ boolean bFitToScreenMode; /* switch Fit map to screen mode on/off */ int xPos, yPos; /* scroll position */ int xPageSize, yPageSize; /* scroll page size */ int xCur, yCur; /* position of the cursor */ int xScrTile, yScrTile; /* size of display tile */ POINT map_orig; /* map origin point */ HFONT hMapFont; /* font for ASCII mode */ } NHMapWindow, *PNHMapWindow; static TCHAR szNHMapWindowClass[] = TEXT("MSNethackMapWndClass"); LRESULT CALLBACK MapWndProc(HWND, UINT, WPARAM, LPARAM); static void register_map_window_class(void); static void onMSNHCommand(HWND hWnd, WPARAM wParam, LPARAM lParam); static void onMSNH_VScroll(HWND hWnd, WPARAM wParam, LPARAM lParam); static void onMSNH_HScroll(HWND hWnd, WPARAM wParam, LPARAM lParam); static void onPaint(HWND hWnd); static void onCreate(HWND hWnd, WPARAM wParam, LPARAM lParam); static void nhcoord2display(PNHMapWindow data, int x, int y, LPRECT lpOut); #if (VERSION_MAJOR < 4) && (VERSION_MINOR < 4) && (PATCHLEVEL < 2) static void nhglyph2charcolor(short glyph, uchar* ch, int* color); #endif static COLORREF nhcolor_to_RGB(int c); HWND mswin_init_map_window () { static int run_once = 0; HWND ret; DWORD styles; if( !run_once ) { register_map_window_class(); run_once = 1; } styles = WS_CHILD | WS_CLIPSIBLINGS; if( !GetNHApp()->bHideScrollBars ) styles |= WS_HSCROLL | WS_VSCROLL; ret = CreateWindow( szNHMapWindowClass, /* registered class name */ NULL, /* window name */ styles, /* window style */ 0, /* horizontal position of window - set it later */ 0, /* vertical position of window - set it later */ 0, /* window width - set it later */ 0, /* window height - set it later*/ GetNHApp()->hMainWnd, /* handle to parent or owner window */ NULL, /* menu handle or child identifier */ GetNHApp()->hApp, /* handle to application instance */ NULL ); /* window-creation data */ if( !ret ) { panic("Cannot create map window"); } return ret; } void mswin_map_stretch(HWND hWnd, LPSIZE lpsz, BOOL redraw) { PNHMapWindow data; RECT client_rt; SCROLLINFO si; SIZE wnd_size; LOGFONT lgfnt; /* check arguments */ if( !IsWindow(hWnd) || !lpsz || lpsz->cx<=0 || lpsz->cy<=0 ) return; /* calculate window size */ GetClientRect(hWnd, &client_rt); wnd_size.cx = client_rt.right - client_rt.left; wnd_size.cy = client_rt.bottom - client_rt.top; /* set new screen tile size */ data = (PNHMapWindow)GetWindowLong(hWnd, GWL_USERDATA); data->xScrTile = max(1, (data->bFitToScreenMode? wnd_size.cx : lpsz->cx) / COLNO); data->yScrTile = max(1, (data->bFitToScreenMode? wnd_size.cy : lpsz->cy) / ROWNO); /* set map origin point */ data->map_orig.x = max(0, client_rt.left + (wnd_size.cx - data->xScrTile*COLNO)/2 ); data->map_orig.y = max(0, client_rt.top + (wnd_size.cy - data->yScrTile*ROWNO)/2 ); data->map_orig.x -= data->map_orig.x % data->xScrTile; data->map_orig.y -= data->map_orig.y % data->yScrTile; /* adjust horizontal scroll bar */ if( data->bFitToScreenMode ) data->xPageSize = COLNO+1; /* disable scroll bar */ else data->xPageSize = wnd_size.cx/data->xScrTile; if( data->xPageSize >= COLNO ) { data->xPos = 0; GetNHApp()->bNoHScroll = TRUE; } else { GetNHApp()->bNoHScroll = FALSE; data->xPos = max(0, min(COLNO-data->xPageSize+1, u.ux - data->xPageSize/2)); } if( !GetNHApp()->bHideScrollBars ) { si.cbSize = sizeof(si); si.fMask = SIF_RANGE | SIF_PAGE | SIF_POS; si.nMin = 0; si.nMax = COLNO; si.nPage = data->xPageSize; si.nPos = data->xPos; SetScrollInfo(hWnd, SB_HORZ, &si, TRUE); } /* adjust vertical scroll bar */ if( data->bFitToScreenMode ) data->yPageSize = ROWNO+1; /* disable scroll bar */ else data->yPageSize = wnd_size.cy/data->yScrTile; if( data->yPageSize >= ROWNO ) { data->yPos = 0; GetNHApp()->bNoVScroll = TRUE; } else { GetNHApp()->bNoVScroll = FALSE; data->yPos = max(0, min(ROWNO-data->yPageSize+1, u.uy - data->yPageSize/2)); } if( !GetNHApp()->bHideScrollBars ) { si.cbSize = sizeof(si); si.fMask = SIF_RANGE | SIF_PAGE | SIF_POS; si.nMin = 0; si.nMax = ROWNO; si.nPage = data->yPageSize; si.nPos = data->yPos; SetScrollInfo(hWnd, SB_VERT, &si, TRUE); } /* create font */ if( data->hMapFont ) DeleteObject(data->hMapFont); ZeroMemory(&lgfnt, sizeof(lgfnt)); lgfnt.lfHeight = -data->yScrTile; // height of font lgfnt.lfWidth = -data->xScrTile; // average character width lgfnt.lfEscapement = 0; // angle of escapement lgfnt.lfOrientation = 0; // base-line orientation angle lgfnt.lfWeight = FW_NORMAL; // font weight lgfnt.lfItalic = FALSE; // italic attribute option lgfnt.lfUnderline = FALSE; // underline attribute option lgfnt.lfStrikeOut = FALSE; // strikeout attribute option lgfnt.lfCharSet = mswin_charset(); // character set identifier lgfnt.lfOutPrecision = OUT_DEFAULT_PRECIS; // output precision lgfnt.lfClipPrecision = CLIP_DEFAULT_PRECIS; // clipping precision lgfnt.lfQuality = DEFAULT_QUALITY; // output quality if( iflags.wc_font_map && *iflags.wc_font_map ) { lgfnt.lfPitchAndFamily = DEFAULT_PITCH; // pitch and family NH_A2W(iflags.wc_font_map, lgfnt.lfFaceName, LF_FACESIZE); } else { lgfnt.lfPitchAndFamily = FIXED_PITCH; // pitch and family _tcsncpy(lgfnt.lfFaceName, NHMAP_FONT_NAME, LF_FACESIZE); } data->hMapFont = CreateFontIndirect(&lgfnt); mswin_cliparound(data->xCur, data->yCur); if(redraw) InvalidateRect(hWnd, NULL, TRUE); } /* set map mode */ int mswin_map_mode(HWND hWnd, int mode) { PNHMapWindow data; int oldMode; SIZE mapSize; data = (PNHMapWindow)GetWindowLong(hWnd, GWL_USERDATA); if( mode == data->mapMode ) return mode; oldMode = data->mapMode; data->mapMode = mode; switch( data->mapMode ) { case MAP_MODE_ASCII4x6: data->bAsciiMode = TRUE; data->bFitToScreenMode = FALSE; mapSize.cx = 4*COLNO; mapSize.cy = 6*ROWNO; break; case MAP_MODE_ASCII6x8: data->bAsciiMode = TRUE; data->bFitToScreenMode = FALSE; mapSize.cx = 6*COLNO; mapSize.cy = 8*ROWNO; break; case MAP_MODE_ASCII8x8: data->bAsciiMode = TRUE; data->bFitToScreenMode = FALSE; mapSize.cx = 8*COLNO; mapSize.cy = 8*ROWNO; break; case MAP_MODE_ASCII16x8: data->bAsciiMode = TRUE; data->bFitToScreenMode = FALSE; mapSize.cx = 16*COLNO; mapSize.cy = 8*ROWNO; break; case MAP_MODE_ASCII7x12: data->bAsciiMode = TRUE; data->bFitToScreenMode = FALSE; mapSize.cx = 7*COLNO; mapSize.cy = 12*ROWNO; break; case MAP_MODE_ASCII8x12: data->bAsciiMode = TRUE; data->bFitToScreenMode = FALSE; mapSize.cx = 8*COLNO; mapSize.cy = 12*ROWNO; break; case MAP_MODE_ASCII16x12: data->bAsciiMode = TRUE; data->bFitToScreenMode = FALSE; mapSize.cx = 16*COLNO; mapSize.cy = 12*ROWNO; break; case MAP_MODE_ASCII12x16: data->bAsciiMode = TRUE; data->bFitToScreenMode = FALSE; mapSize.cx = 12*COLNO; mapSize.cy = 16*ROWNO; break; case MAP_MODE_ASCII10x18: data->bAsciiMode = TRUE; data->bFitToScreenMode = FALSE; mapSize.cx = 10*COLNO; mapSize.cy = 18*ROWNO; break; case MAP_MODE_ASCII_FIT_TO_SCREEN: { RECT client_rt; GetClientRect(hWnd, &client_rt); mapSize.cx = client_rt.right - client_rt.left; mapSize.cy = client_rt.bottom - client_rt.top; data->bAsciiMode = TRUE; data->bFitToScreenMode = TRUE; } break; case MAP_MODE_TILES_FIT_TO_SCREEN: { RECT client_rt; GetClientRect(hWnd, &client_rt); mapSize.cx = client_rt.right - client_rt.left; mapSize.cy = client_rt.bottom - client_rt.top; data->bAsciiMode = FALSE; data->bFitToScreenMode = TRUE; } break; case MAP_MODE_TILES: default: data->bAsciiMode = FALSE; data->bFitToScreenMode = FALSE; mapSize.cx = GetNHApp()->mapTile_X*COLNO; mapSize.cy = GetNHApp()->mapTile_Y*ROWNO; break; } mswin_map_stretch(hWnd, &mapSize, TRUE); return oldMode; } /* 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) ); mcam += iflags.wc_scroll_amount - 1; /* get page size and center horizontally on x-position */ if( scroll_x ) { if( data->xPageSize<=2*mcam ) { x = max(0, min(COLNO, msg_data->x - data->xPageSize/2)); } else if( msg_data->x < data->xPos+data->xPageSize/2 ) { x = max(0, min(COLNO, msg_data->x - mcam)); } else { x = max(0, min(COLNO, msg_data->x - data->xPageSize + mcam)); } SendMessage( hWnd, WM_HSCROLL, (WPARAM)MAKELONG(SB_THUMBTRACK, x), (LPARAM)NULL ); } /* get page size and center vertically on y-position */ if( scroll_y ) { if( data->yPageSize<=2*mcam ) { y = max(0, min(ROWNO, msg_data->y - data->yPageSize/2)); } else if( msg_data->y < data->yPos+data->yPageSize/2 ) { y = max(0, min(ROWNO, msg_data->y - mcam)); } else { y = max(0, min(ROWNO, msg_data->y - data->yPageSize + mcam)); } SendMessage( hWnd, WM_VSCROLL, (WPARAM)MAKELONG(SB_THUMBTRACK, y), (LPARAM)NULL ); } } break; case MSNH_MSG_CLEAR_WINDOW: { int i, j; for(i=0; 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; COLORREF OldFg; nhcoord2display(data, i, j, &glyph_rect); #if (VERSION_MAJOR < 4) && (VERSION_MINOR < 4) && (PATCHLEVEL < 2) nhglyph2charcolor(data->map[i][j], &ch, &color); OldFg = SetTextColor (hDC, nhcolor_to_RGB(color) ); #else /* rely on NetHack core helper routine */ 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(nhcolor_to_RGB(CLR_GRAY)); FillRect (hDC, &glyph_rect, back_brush); DeleteObject (back_brush); switch (color) { case CLR_GRAY: case CLR_WHITE: OldFg = SetTextColor( hDC, nhcolor_to_RGB(CLR_BLACK)); break; default: OldFg = SetTextColor (hDC, nhcolor_to_RGB(color) ); } } else { OldFg = SetTextColor (hDC, nhcolor_to_RGB(color) ); } #endif DrawText(hDC, NH_A2W(&ch, &wch, 1), 1, &glyph_rect, DT_CENTER | DT_VCENTER | DT_NOPREFIX ); SetTextColor (hDC, OldFg); } SelectObject(hDC, oldFont); } else { /* prepare tiles DC for mapping */ tileDC = CreateCompatibleDC(hDC); saveBmp = SelectObject(tileDC, GetNHApp()->bmpMapTiles); /* draw the map */ for(i=paint_rt.left; 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); if( !GetNHApp()->bHideScrollBars ) { si.cbSize = sizeof(si); si.fMask = SIF_POS; si.nPos = data->yPos; SetScrollInfo(hWnd, SB_VERT, &si, TRUE); } } /* on WM_HSCROLL */ void onMSNH_HScroll(HWND hWnd, WPARAM wParam, LPARAM lParam) { PNHMapWindow data; SCROLLINFO si; int xNewPos; int xDelta; /* get window data */ data = (PNHMapWindow)GetWindowLong(hWnd, GWL_USERDATA); switch(LOWORD (wParam)) { /* User clicked shaft left of the scroll box. */ case SB_PAGEUP: xNewPos = data->xPos-data->xPageSize; break; /* User clicked shaft right of the scroll box. */ case SB_PAGEDOWN: xNewPos = data->xPos+data->xPageSize; break; /* User clicked the left arrow. */ case SB_LINEUP: xNewPos = data->xPos-1; break; /* User clicked the right arrow. */ case SB_LINEDOWN: xNewPos = data->xPos+1; break; /* User dragged the scroll box. */ case SB_THUMBTRACK: xNewPos = HIWORD(wParam); break; default: xNewPos = data->xPos; } xNewPos = max(0, min(COLNO-data->xPageSize+1, xNewPos)); if( xNewPos == data->xPos ) return; xDelta = xNewPos - data->xPos; data->xPos = xNewPos; ScrollWindowEx (hWnd, -data->xScrTile * xDelta, 0, (CONST RECT *) NULL, (CONST RECT *) NULL, (HRGN) NULL, (LPRECT) NULL, SW_INVALIDATE | SW_ERASE); if( !GetNHApp()->bHideScrollBars ) { si.cbSize = sizeof(si); si.fMask = SIF_POS; si.nPos = data->xPos; SetScrollInfo(hWnd, SB_HORZ, &si, TRUE); } } /* map nethack map coordinates to the screen location */ void nhcoord2display(PNHMapWindow data, int x, int y, LPRECT lpOut) { lpOut->left = (x - data->xPos)*data->xScrTile + data->map_orig.x; lpOut->top = (y - data->yPos)*data->yScrTile + data->map_orig.y; lpOut->right = lpOut->left + data->xScrTile; lpOut->bottom = lpOut->top + data->yScrTile; } #if (VERSION_MAJOR < 4) && (VERSION_MINOR < 4) && (PATCHLEVEL < 2) /* map glyph to character/color combination */ void nhglyph2charcolor(short g, uchar* ch, int* color) { int offset; #ifdef TEXTCOLOR #define zap_color(n) *color = iflags.use_color ? zapcolors[n] : NO_COLOR #define cmap_color(n) *color = iflags.use_color ? defsyms[n].color : NO_COLOR #define obj_color(n) *color = iflags.use_color ? objects[n].oc_color : NO_COLOR #define mon_color(n) *color = iflags.use_color ? mons[n].mcolor : NO_COLOR #define pet_color(n) *color = iflags.use_color ? mons[n].mcolor : NO_COLOR #define warn_color(n) *color = iflags.use_color ? def_warnsyms[n].color : NO_COLOR # else /* no text color */ #define zap_color(n) #define cmap_color(n) #define obj_color(n) #define mon_color(n) #define pet_color(c) #define warn_color(c) *color = CLR_WHITE; #endif if ((offset = (g - GLYPH_WARNING_OFF)) >= 0) { /* a warning flash */ *ch = 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 ) { TransparentImage( hDC, x, y, width, height, sourceDC, s_x, s_y, s_width, s_height, cTransparent ); } slashem-0.0.7E7F3/sys/wince/mhrip.h0000664000076400007640000000053510545462317015072 0ustar aliali/* Copyright (C) 2001 by Alex Kompel */ /* NetHack may be freely redistributed. See license for details. */ #ifndef MSWINRIPWindow_h #define MSWINRIPWindow_h #include "winMS.h" #include "config.h" #include "global.h" HWND mswin_init_RIP_window (); void mswin_display_RIP_window (HWND hwnd); #endif /* MSWINRIPWindow_h */ slashem-0.0.7E7F3/sys/wince/mhaskyn.h0000664000076400007640000000046510545462317015427 0ustar aliali/* 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 */ slashem-0.0.7E7F3/sys/wince/mhinput.h0000664000076400007640000000155510545462317015442 0ustar aliali/* Copyright (C) 2001 by Alex Kompel */ /* NetHack may be freely redistributed. See license for details. */ #ifndef MSWINInput_h #define MSWINInput_h /* nethack input queue - store/extract input events */ #include "winMS.h" #define NHEVENT_CHAR 1 #define NHEVENT_MOUSE 2 typedef struct mswin_event { int type; union { struct { int ch; } kbd; struct { int mod; int x, y; } ms; }; } MSNHEvent, *PMSNHEvent; #define NHEVENT_KBD(c) { MSNHEvent e; e.type=NHEVENT_CHAR; e.kbd.ch=(c); mswin_input_push(&e); } #define NHEVENT_MS(_mod, _x, _y) { MSNHEvent e; e.type=NHEVENT_MOUSE; e.ms.mod = (_mod); e.ms.x=(_x); e.ms.y=(_y); mswin_input_push(&e); } void mswin_nh_input_init(); int mswin_have_input(); void mswin_input_push(PMSNHEvent event); PMSNHEvent mswin_input_pop(); PMSNHEvent mswin_input_peek(); #endif /* MSWINInput_h */ slashem-0.0.7E7F3/sys/wince/mksetup.bat0000775000076400007640000000064310545462317015765 0ustar aliali@echo off REM This file generates the .CAB files and packages them REM using ezsetup into an installer REM echo Generating CAB install files for ARM, MIPS, SH3 "f:\Windows CE Tools\wce300\MS Pocket PC\support\ActiveSync\windows ce application installation\cabwiz\cabwiz" slashem.inf /err makecab.err /cpu arm mips sa sh3 ezsetup -l english -i slashem.ini -r ..\slashem.nfo -e ..\Readme.txt -o slashemCE_install-%1.exeslashem-0.0.7E7F3/sys/wince/winMS.h0000664000076400007640000001261110545462317015006 0ustar aliali/* Copyright (C) 2001 by Alex Kompel */ /* NetHack may be freely redistributed. See license for details. */ #ifndef WINMS_H #define WINMS_H #pragma warning(disable:4142) /* benign redefinition of type */ #define WIN32_LEAN_AND_MEAN #include #include #include #include #include "resource.h" #include "hack.h" #if defined(WIN_CE_POCKETPC) #include #include #endif #if defined(WIN_CE_SMARTPHONE) #include #include #include #include #include #include #include #endif #if defined(WIN_CE_PS2xx) || defined(WIN32_PLATFORM_HPCPRO) #include #endif /* Taskbar Menu height */ #define MENU_HEIGHT 26 /* Create an array to keep track of the various windows */ #ifndef MAXWINDOWS #define MAXWINDOWS 15 #endif /* RIP window ID */ #define NHW_RIP 32 #define NHW_KEYPAD 33 /* size of tiles */ #ifndef TILE_X #define TILE_X 16 #endif #define TILE_Y 16 /* tiles per line in the bitmap */ #define TILES_PER_LINE 40 /* tile background color */ #define TILE_BK_COLOR RGB(71, 108, 108) /* minimum/maximum font size (in points - 1/72 inch) */ #define NHFONT_DEFAULT_SIZE 9 #define NHFONT_STATUS_DEFAULT_SIZE 6 #define NHFONT_SIZE_MIN 3 #define NHFONT_SIZE_MAX 20 typedef struct mswin_nhwindow_data { HWND win; int type; int dead; } MSNHWinData, *PMSNHWinData; /* global application data - alailable thour GetNHApp() */ typedef struct mswin_nhwindow_app { HINSTANCE hApp; /* hInstance from WinMain */ int nCmdShow; /* main window mode flag */ HWND hMainWnd; /* main window handle */ HACCEL hAccelTable; /* accelerator table */ HWND hPopupWnd; /* active dialog window (nethack menu, text, etc) */ HWND hMenuBar; /* menu bar */ MSNHWinData windowlist[MAXWINDOWS]; /* nethack windows array */ HBITMAP bmpTiles; /* nethack tiles */ HBITMAP bmpPetMark; /* pet mark Bitmap */ HBITMAP bmpMapTiles; /* alternative map tiles */ int mapTile_X; /* alt. tiles width */ int mapTile_Y; /* alt. tiles height */ int mapTilesPerLine; /* number of tile per row in the bitmap */ boolean bNoHScroll; /* disable cliparound for horizontal grid (map) */ boolean bNoVScroll; /* disable cliparound for vertical grid (map) */ int mapDisplayModeSave; /* saved map display mode */ int bCmdPad; /* command pad - on-screen keyboard */ HWND hCmdWnd; /* handle of on-screen keyboard window */ /* options */ boolean bWrapText; /* format text to fit the window */ boolean bFullScreen;/* run nethack in full-screen mode */ boolean bHideScrollBars; /* hide scroll bars */ boolean bUseSIP; /* use SIP (built-in software keyboard) for menus (PocketPC only) */ } NHWinApp, *PNHWinApp; extern PNHWinApp GetNHApp(); #define E extern E struct window_procs mswin_procs; #undef E /* Some prototypes */ void mswin_init_nhwindows(int* argc, char** argv); void mswin_player_selection(void); void mswin_askname(void); void mswin_get_nh_event(void); void mswin_exit_nhwindows(const char *); void mswin_suspend_nhwindows(const char *); void mswin_resume_nhwindows(void); winid mswin_create_nhwindow(int type); void mswin_clear_nhwindow(winid wid); void mswin_display_nhwindow(winid wid, BOOLEAN_P block); void mswin_destroy_nhwindow(winid wid); void mswin_curs(winid wid, int x, int y); void mswin_putstr(winid wid, int attr, const char *text); void mswin_putstr_ex(winid wid, int attr, const char *text, boolean append); void mswin_display_file(const char *filename,BOOLEAN_P must_exist); void mswin_start_menu(winid wid); void mswin_add_menu(winid wid, int glyph, const ANY_P * identifier, CHAR_P accelerator, CHAR_P group_accel, int attr, const char *str, BOOLEAN_P presel); void mswin_end_menu(winid wid, const char *prompt); int mswin_select_menu(winid wid, int how, MENU_ITEM_P **selected); void mswin_update_inventory(void); void mswin_mark_synch(void); void mswin_wait_synch(void); void mswin_cliparound(int x, int y); void mswin_print_glyph(winid wid,XCHAR_P x,XCHAR_P y,int glyph); 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_popup_display(HWND popup, int* done_indicator); void mswin_popup_destroy(HWND popup); #if defined(WIN_CE_SMARTPHONE) void NHSPhoneDialogSetup(HWND hDlg, BOOL is_edit, BOOL is_fullscreen); #endif void mswin_read_reg(void); void mswin_destroy_reg(void); void mswin_write_reg(void); void mswin_set_fullscreen(BOOL is_fullscreen); #endif /* WINmswin_H */ slashem-0.0.7E7F3/sys/wince/winhack.c0000664000076400007640000002003610545462317015370 0ustar aliali/* Copyright (C) 2001 by Alex Kompel */ // winhack.cpp : Defines the entry point for the application. // #include "winMS.h" #include "hack.h" #include "dlb.h" #include "mhmain.h" #include "mhmap.h" #ifdef OVL0 #define SHARED_DCL #else #define SHARED_DCL extern #endif SHARED_DCL char orgdir[PATHLEN]; /* also used in pcsys.c, amidos.c */ extern void FDECL(nethack_exit,(int)); static TCHAR* _get_cmd_arg(TCHAR* pCmdLine); // Global Variables: NHWinApp _nethack_app; // Foward declarations of functions included in this code module: BOOL InitInstance(HINSTANCE, int); static void win_hack_init(int, char **); static void __cdecl mswin_moveloop(void *); static BOOL setMapTiles(const char* fname); extern void FDECL(pcmain, (int,char **)); #define MAX_CMDLINE_PARAM 255 int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow) { INITCOMMONCONTROLSEX InitCtrls; HWND nethackWnd; int argc; char* argv[MAX_CMDLINE_PARAM]; size_t len; TCHAR* p; TCHAR wbuf[NHSTR_BUFSIZE]; char buf[NHSTR_BUFSIZE]; /* ensure that we don't access violate on a panic() */ windowprocs.win_raw_print = mswin_raw_print; windowprocs.win_raw_print_bold = mswin_raw_print_bold; /* init applicatio structure */ _nethack_app.hApp = hInstance; _nethack_app.nCmdShow = nCmdShow; _nethack_app.hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_WINHACK); _nethack_app.hMainWnd = NULL; _nethack_app.hPopupWnd = NULL; _nethack_app.hMenuBar = NULL; _nethack_app.bmpTiles = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_TILES)); if( _nethack_app.bmpTiles==NULL ) panic("cannot load tiles bitmap"); _nethack_app.bmpPetMark = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_PETMARK)); if( _nethack_app.bmpPetMark==NULL ) panic("cannot load pet mark bitmap"); _nethack_app.bmpMapTiles = _nethack_app.bmpTiles; _nethack_app.mapTile_X = TILE_X; _nethack_app.mapTile_Y = TILE_Y; _nethack_app.mapTilesPerLine = TILES_PER_LINE; _nethack_app.bNoHScroll = FALSE; _nethack_app.bNoVScroll = FALSE; #if defined(WIN_CE_PS2xx) || defined(WIN_CE_POCKETPC) || defined(WIN_CE_SMARTPHONE) _nethack_app.bCmdPad = TRUE; #else _nethack_app.bCmdPad = FALSE; #endif _nethack_app.bWrapText = TRUE; _nethack_app.bFullScreen = TRUE; #if defined(WIN_CE_SMARTPHONE) _nethack_app.bHideScrollBars = TRUE; #else _nethack_app.bHideScrollBars = FALSE; #endif _nethack_app.bUseSIP = TRUE; // check for running nethack programs nethackWnd = FindWindow(szMainWindowClass, NULL); if( nethackWnd ) { // bring on top SetForegroundWindow(nethackWnd); return FALSE; } // init controls ZeroMemory(&InitCtrls, sizeof(InitCtrls)); InitCtrls.dwSize = sizeof(InitCtrls); InitCtrls.dwICC = ICC_LISTVIEW_CLASSES; if( !InitCommonControlsEx(&InitCtrls) ) { MessageBox(NULL, TEXT("Cannot init common controls"), TEXT("ERROR"), MB_OK | MB_ICONSTOP); return FALSE; } // Perform application initialization: if (!InitInstance (hInstance, nCmdShow)) { return FALSE; } /* get command line parameters */ p = _get_cmd_arg( #if defined(WIN_CE_PS2xx) || defined(WIN32_PLATFORM_HPCPRO) lpCmdLine #else GetCommandLine() #endif ); for( argc = 1; p && 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: Saves instance handle and creates main window // // COMMENTS: // // In this function, we save the instance handle in a global variable and // create and display the main program window. // BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { return TRUE; } PNHWinApp GetNHApp() { return &_nethack_app; } static int eraseoldlocks() { register int i; /* cannot use maxledgerno() here, because we need to find a lock name * before starting everything (including the dungeon initialization * that sets astral_level, needed for maxledgerno()) up */ for(i = 1; i <= MAXDUNGEON*MAXLEVEL + 1; i++) { /* try to remove all */ set_levelfile_name(lock, i); (void) unlink(fqname(lock, LEVELPREFIX, 0)); } set_levelfile_name(lock, 0); if(unlink(fqname(lock, LEVELPREFIX, 0))) return 0; /* cannot remove it */ return(1); /* success! */ } void getlock() { const char *fq_lock; char tbuf[BUFSZ]; TCHAR wbuf[BUFSZ]; HANDLE f; int fd; int choice; /* regularize(lock); */ /* already done in pcmain */ Sprintf(tbuf, "%s", fqname(lock, LEVELPREFIX, 0)); set_levelfile_name(lock, 0); fq_lock = fqname(lock, LEVELPREFIX, 1); f = CreateFile( NH_A2W(fq_lock, wbuf, BUFSZ), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if( f==INVALID_HANDLE_VALUE ) { if(GetLastError()==ERROR_FILE_NOT_FOUND) goto gotlock; /* no such file */ error("Cannot open %s", fq_lock); } CloseHandle(f); /* prompt user that the game alredy exist */ choice = MessageBox( GetNHApp()->hMainWnd, TEXT("There are files from a game in progress under your name. Recover?"), TEXT("Nethack"), MB_YESNO | MB_DEFBUTTON1 ); switch(choice) { case IDYES: if(recover_savefile()) { goto gotlock; } else { error("Couldn't recover old game."); } break; case IDNO: unlock_file(HLOCK); error("%s", "Cannot start a new game."); break; }; gotlock: fd = creat(fq_lock, FCMASK); if(fd == -1) { error("cannot creat lock file (%s.)", fq_lock); } else { if(write(fd, (char *) &hackpid, sizeof(hackpid)) != sizeof(hackpid)){ error("cannot write lock (%s)", fq_lock); } if(close(fd) == -1) { error("cannot close lock (%s)", fq_lock); } } } /* misc functions */ void error VA_DECL(const char *,s) TCHAR wbuf[1024]; char buf[1024]; DWORD last_error = GetLastError(); VA_START(s); VA_INIT(s, const char *); /* error() may get called before tty is initialized */ if (iflags.window_inited) end_screen(); vsprintf(buf, s, VA_ARGS); NH_A2W(buf, wbuf, sizeof(wbuf)/sizeof(wbuf[0])); if( last_error>0 ) { LPVOID lpMsgBuf; if( FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, last_error, 0, // Default language (LPTSTR) &lpMsgBuf, 0, NULL ) ) { _tcsncat(wbuf, TEXT("\nSystem Error: "), sizeof(wbuf)/sizeof(wbuf[0]) - _tcslen(wbuf) ); _tcsncat(wbuf, lpMsgBuf, sizeof(wbuf)/sizeof(wbuf[0]) - _tcslen(wbuf) ); // Free the buffer. LocalFree( lpMsgBuf ); } } VA_END(); MessageBox( NULL, wbuf, TEXT("Error"), MB_OK | MB_ICONERROR ); exit(EXIT_FAILURE); } TCHAR* _get_cmd_arg(TCHAR* pCmdLine) { static TCHAR* pArgs = NULL; TCHAR *pRetArg; BOOL bQuoted; if( !pCmdLine && !pArgs ) return NULL; if( !pArgs ) pArgs = pCmdLine; /* skip whitespace */ for(pRetArg = pArgs; *pRetArg && _istspace(*pRetArg); pRetArg = CharNext(pRetArg)); if( !*pRetArg ) { pArgs = NULL; return NULL; } /* check for quote */ if( *pRetArg==TEXT('"') ) { bQuoted = TRUE; pRetArg = CharNext(pRetArg); pArgs = _tcschr(pRetArg, TEXT('"')); } else { /* skip to whitespace */ for(pArgs = pRetArg; *pArgs && !_istspace(*pArgs); pArgs = CharNext(pArgs)); } if( pArgs && *pArgs ) { TCHAR* p; p = pArgs; pArgs = CharNext(pArgs); *p = (TCHAR)0; } else { pArgs = NULL; } return pRetArg; } /* * Strip out troublesome file system characters. */ void nt_regularize(s) /* normalize file name */ register char *s; { register unsigned char *lp; for (lp = s; *lp; lp++) if ( *lp == '?' || *lp == '"' || *lp == '\\' || *lp == '/' || *lp == '>' || *lp == '<' || *lp == '*' || *lp == '|' || *lp == ':' || (*lp > 127)) *lp = '_'; } void win32_abort() { #ifdef WIZARD if (wizard) DebugBreak(); #endif abort(); } void append_port_id(buf) char *buf; { char *portstr = PORT_CE_PLATFORM " " PORT_CE_CPU; Sprintf(eos(buf), " %s", portstr); } slashem-0.0.7E7F3/sys/wince/mhmsgwnd.h0000664000076400007640000000057110545462317015577 0ustar aliali/* Copyright (C) 2001 by Alex Kompel */ /* NetHack may be freely redistributed. See license for details. */ #ifndef MSWINMessageWindow_h #define MSWINMessageWindow_h #include "winMS.h" #include "config.h" #include "global.h" HWND mswin_init_message_window (); void mswin_message_window_size (HWND hWnd, LPSIZE sz); #endif /* MSWINMessageWindow_h */ slashem-0.0.7E7F3/sys/wince/menubar.uu0000664000076400007640000000104210545462317015600 0ustar alialibegin 600 menubar.bmp M0DUV`0```````'8````H````(````!`````!``0````````!```````````` M````````````````````@```@````("``(````"``(``@(```,#`P`"`@(`` M``#_``#_````__\`_P```/\`_P#__P``____`'=W=W=W=W=W=W=W=W=W=W=W M=W=W=W=W=W=W=W=W=W=W=$1$1$1$1'=W=W=W=W=W=W1$_T1/]$1W=W=W=W=W M=W=T1/_T__1$=W=W=W=W=W=W=/______]'=W=P<'!P=W=W3_______1W=W#P M\/#P=W=T3__T__]$=W */ /* NetHack may be freely redistributed. See license for details. */ #ifndef MSWINMainWindow_h #define MSWINMainWindow_h /* this is a main appliation window */ #include "winMS.h" extern TCHAR szMainWindowClass[]; HWND mswin_init_main_window (); void mswin_layout_main_window(HWND changed_child); void mswin_select_map_mode(int map_mode); #endif /* MSWINMainWindow_h */ slashem-0.0.7E7F3/sys/wince/mhstatus.h0000664000076400007640000000056310545462317015624 0ustar aliali/* Copyright (C) 2001 by Alex Kompel */ /* NetHack may be freely redistributed. See license for details. */ #ifndef MSWINStatusWindow_h #define MSWINStatusWindow_h #include "winMS.h" #include "config.h" #include "global.h" HWND mswin_init_status_window (); void mswin_status_window_size (HWND hWnd, LPSIZE sz); #endif /* MSWINStatusWindow_h */ slashem-0.0.7E7F3/sys/wince/celib.c0000664000076400007640000004332310545462317015026 0ustar aliali/* Copyright (C) 2001 by Alex Kompel */ /* NetHack may be freely redistributed. See license for details. */ #define NEED_VARARGS #include "hack.h" #include // #include "wceconf.h" static union { time_t t_val; struct time_pack { unsigned int ss:6; unsigned int mm:6; unsigned int dd:5; unsigned int hh:6; unsigned int mo:4; unsigned int yr:10; unsigned int wd:3; } tm_val; } _t_cnv; #define IS_LEAP(yr) (((yr)%4==0 || (yr)%100==0) && !(yr)%400==0) static char _day_mo_leap[12] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; static char _day_mo[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; struct tm * __cdecl localtime ( const time_t *ptime ) { static struct tm ptm; int i; if( !ptime ) return NULL; _t_cnv.t_val = *ptime; ptm.tm_sec = _t_cnv.tm_val.ss ; /* seconds after the minute - [0,59] */ ptm.tm_min = _t_cnv.tm_val.mm; /* minutes after the hour - [0,59] */ ptm.tm_hour = _t_cnv.tm_val.hh; /* hours since midnight - [0,23] */ ptm.tm_mday = _t_cnv.tm_val.dd; /* day of the month - [1,31] */ ptm.tm_mon = _t_cnv.tm_val.mo-1; /* months since January - [0,11] */ ptm.tm_year = _t_cnv.tm_val.yr; /* years since 1900 */ ptm.tm_wday = _t_cnv.tm_val.wd; /* days since Sunday - [0,6] */ ptm.tm_yday = _t_cnv.tm_val.dd; /* days since January 1 - [0,365] */ for( i=0; i=0 && i=FILE_TABLE_SIZE ) return -1; retval = (CloseHandle(_nh_file_table[f])? 0 : -1); _nh_file_table[f] = INVALID_HANDLE_VALUE; return retval; } int __cdecl creat(const char *fname , int mode) { HANDLE f; TCHAR wbuf[MAX_PATH+1]; ZeroMemory(wbuf, sizeof(wbuf)); NH_A2W(fname, wbuf, MAX_PATH); f = CreateFile( wbuf, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if( f==INVALID_HANDLE_VALUE ) return -1; else return alloc_file_handle(f); } int __cdecl eof(int f) { DWORD fpos, fsize; HANDLE p = get_file_handle(f); if( f==-1 ) return -1; fpos = SetFilePointer(p, 0, NULL, FILE_CURRENT); fsize = SetFilePointer(p, 0, NULL, FILE_END); if( fpos==0xFFFFFFFF || fsize==0xFFFFFFFF ) return -1; if( fpos==fsize ) return 1; else { SetFilePointer(p, fpos, NULL, FILE_BEGIN); return 0; } } long __cdecl lseek( int f, long offset, int origin ) { HANDLE p = get_file_handle(f); DWORD fpos; switch(origin) { case SEEK_SET: fpos = SetFilePointer(p, offset, NULL, FILE_BEGIN); break; case SEEK_CUR: fpos = SetFilePointer(p, offset, NULL, FILE_CURRENT); break; case SEEK_END: fpos = SetFilePointer(p, offset, NULL, FILE_END); break; default: fpos = 0xFFFFFFFF; break; } if( fpos==0xFFFFFFFF ) return -1; else return (long)fpos; } int __cdecl open( const char *filename, int oflag, ... ) { TCHAR fname[MAX_PATH+1]; TCHAR path[MAX_PATH+1]; HANDLE f; DWORD fileaccess; DWORD filecreate; /* O_TEXT is not supported */ /* * decode the access flags */ switch( oflag & (_O_RDONLY | _O_WRONLY | _O_RDWR) ) { case _O_RDONLY: /* read access */ fileaccess = GENERIC_READ; break; case _O_WRONLY: /* write access */ fileaccess = GENERIC_READ | GENERIC_WRITE; break; case _O_RDWR: /* read and write access */ fileaccess = GENERIC_READ | GENERIC_WRITE; break; default: /* error, bad oflag */ return -1; } /* * decode open/create method flags */ switch ( oflag & (_O_CREAT | _O_EXCL | _O_TRUNC) ) { case 0: case _O_EXCL: // ignore EXCL w/o CREAT filecreate = OPEN_EXISTING; break; case _O_CREAT: filecreate = OPEN_ALWAYS; break; case _O_CREAT | _O_EXCL: case _O_CREAT | _O_TRUNC | _O_EXCL: filecreate = CREATE_NEW; break; case _O_TRUNC: case _O_TRUNC | _O_EXCL: // ignore EXCL w/o CREAT filecreate = TRUNCATE_EXISTING; break; case _O_CREAT | _O_TRUNC: filecreate = CREATE_ALWAYS; break; default: return -1; } /* assemple the file name */ ZeroMemory(fname, sizeof(fname)); ZeroMemory(path, sizeof(path)); NH_A2W(filename, fname, MAX_PATH); if( *filename!='\\' && *filename!='/' ) { _tcscpy(path, _nh_cwd); _tcsncat(path, _T("\\"), MAX_PATH - _tcslen(path)); } _tcsncat(path, fname, MAX_PATH - _tcslen(path)); /* * try to open/create the file */ if ( (f = CreateFile( path, fileaccess, 0, NULL, filecreate, FILE_ATTRIBUTE_NORMAL, NULL )) == INVALID_HANDLE_VALUE ) { return -1; } if( !(oflag & O_APPEND) ) SetFilePointer(f, 0, NULL, FILE_BEGIN); return alloc_file_handle(f); } int __cdecl read( int f, void *buffer, unsigned int count ) { HANDLE p = get_file_handle(f); DWORD bytes_read; if( !ReadFile(p, buffer, count, &bytes_read, NULL) ) return -1; else return (int)bytes_read; } int __cdecl unlink(const char * filename) { TCHAR wbuf[MAX_PATH+1]; TCHAR fname[MAX_PATH+1]; ZeroMemory(wbuf, sizeof(wbuf)); ZeroMemory(fname, sizeof(fname)); NH_A2W(filename, wbuf, MAX_PATH); if( *filename!='\\' && *filename!='/' ) { _tcscpy(fname, _nh_cwd); _tcsncat(fname, _T("\\"), MAX_PATH - _tcslen(fname)); } _tcsncat(fname, wbuf, MAX_PATH - _tcslen(fname)); return !DeleteFileW(fname); } int __cdecl write( int f, const void *buffer, unsigned int count ) { HANDLE p = get_file_handle(f); DWORD bytes_written; if( !WriteFile(p, buffer, count, &bytes_written, NULL) ) return -1; else return (int)bytes_written; } int __cdecl rename( const char *oldname, const char *newname ) { WCHAR f1[MAX_PATH+1]; WCHAR f2[MAX_PATH+1]; ZeroMemory(f1, sizeof(f1)); ZeroMemory(f2, sizeof(f2)); MultiByteToWideChar(CP_ACP, 0, oldname, -1, f1, MAX_PATH); MultiByteToWideChar(CP_ACP, 0, newname, -1, f2, MAX_PATH); return !MoveFile(f1, f2); } int __cdecl access( const char *path, int mode ) { DWORD attr; WCHAR f[MAX_PATH+1]; ZeroMemory(f, sizeof(f)); MultiByteToWideChar(CP_ACP, 0, path, -1, f, MAX_PATH); attr = GetFileAttributes(f); if( attr == (DWORD)-1 ) return -1; if ( (attr & FILE_ATTRIBUTE_READONLY) && (mode & 2) ) return -1; else return 0; } int chdir( const char *dirname ) { ZeroMemory(_nh_cwd, sizeof(_nh_cwd)); NH_A2W(dirname, _nh_cwd, MAX_PATH); return 0; } char *getcwd( char *buffer, int maxlen ) { if( maxlen<(int)_tcslen(_nh_cwd) ) return NULL; else return NH_W2A(_nh_cwd, buffer, maxlen); } /*------------------------------------------------------------------------------*/ /* __errno.h__ */ int errno; /*------------------------------------------------------------------------------*/ /* * Chdrive() changes the default drive. */ void chdrive(char *str) { return; } /* * This is used in nhlan.c to implement some of the LAN_FEATURES. */ char *get_username(lan_username_size) int *lan_username_size; { static char username_buffer[BUFSZ]; strcpy(username_buffer, "nhsave"); return username_buffer; } void Delay(int ms) { (void)Sleep(ms); } void more() { } int isatty(int f) { return 0; } #if defined(WIN_CE_PS2xx) || defined(WIN32_PLATFORM_HPCPRO) int __cdecl isupper(int c) { char str[2]; WCHAR wstr[2]; str[0] = c; str[1] = 0; NH_A2W(str, wstr, 1); return iswupper(wstr[0]); } int __cdecl isdigit(int c) { return ('0' <= c && c <= '9'); } int __cdecl isxdigit(int c) { return (('0' <= c && c <= '9') || ('a' <= c && c <= 'f') || ('A' <= c && c <= 'F')); } int __cdecl isspace(int c) { char str[2]; WCHAR wstr[2]; str[0] = c; str[1] = 0; NH_A2W(str, wstr, 1); return iswspace(wstr[0]); } int __cdecl isprint(int c) { char str[2]; WCHAR wstr[2]; str[0] = c; str[1] = 0; NH_A2W(str, wstr, 1); return iswprint(wstr[0]); } char* __cdecl _strdup(const char* s) { char* p; p = malloc(strlen(s)+1); return strcpy(p, s); } char* __cdecl strrchr( const char *s, int c ) { WCHAR wstr[1024]; WCHAR *w; w = wcsrchr(NH_A2W(s, wstr, 1024), c); if(w) return (char*)(s + (w - wstr)); else return NULL; } int __cdecl _stricmp(const char* a, const char* b) { return strncmpi(a, b, 65535u); } #endif #if defined(WIN_CE_PS2xx) /* stdio.h functions are missing from PAlm Size PC SDK 1.2 (SH3 and MIPS) */ #pragma warning(disable:4273) FILE * __cdecl fopen(const char* filename, const char *mode) { int modeflag; int whileflag; int filedes; /* First mode character must be 'r', 'w', or 'a'. */ switch (*mode) { case 'r': modeflag = _O_RDONLY; break; case 'w': modeflag = _O_WRONLY | _O_CREAT | _O_TRUNC; break; case 'a': modeflag = _O_WRONLY | _O_CREAT | _O_APPEND; break; default: return NULL; } whileflag=1; while(*++mode && whileflag) switch(*mode) { case '+': if (modeflag & _O_RDWR) whileflag=0; else { modeflag |= _O_RDWR; modeflag &= ~(_O_RDONLY | _O_WRONLY); } break; case 'b': if (modeflag & (_O_TEXT | _O_BINARY)) whileflag=0; else modeflag |= _O_BINARY; break; case 't': /* not supported */ whileflag=0; break; default: whileflag=0; break; } if ((filedes = open(filename, modeflag))==-1) return NULL; return (FILE*)filedes; } int __cdecl fscanf(FILE *f , const char *format, ...) { /* Format spec: %[*] [width] [l] type ] */ int ch; int sch; int matched = 0; int width = 65535; int modifier = -1; int skip_flag = 0; int n_read = 0; char buf[BUFSZ]; TCHAR wbuf[BUFSZ]; char* p; va_list args; #define RETURN_SCANF(i) { va_end(args); return i; } #define NEXT_CHAR(f) (n_read++, fgetc(f)) va_start(args, format); ch = *format++; sch = NEXT_CHAR(f); while( ch && sch!=EOF ) { if( isspace(ch) ) { while( ch && isspace(ch) ) ch = *format++; while( sch!=EOF && isspace(sch) ) sch = NEXT_CHAR(f); format--; goto next_spec; } /* read % */ if( ch!='%' ) { if( sch!=ch ) RETURN_SCANF(matched); sch = NEXT_CHAR(f); goto next_spec; } else { /* process '%%' */ ch = *format++; if( ch=='%' ) { if( sch!='%' ) RETURN_SCANF(matched); sch = NEXT_CHAR(f); goto next_spec; } if( ch=='*' ) { /* read skip flag - '*' */ skip_flag=1; ch = *format++; } /* get width */ if( isdigit(ch) ) { width = 0; while(ch && isdigit(ch)) { width = width*10 + (ch-'0'); ch = *format++; } } /* get modifier */ if( ch=='l' ) { modifier = 'l'; ch = *format++; } /* get type */ switch(ch) { case 'c': if( !skip_flag ) { *(va_arg(args, char*))=sch; matched++; } sch = NEXT_CHAR(f); goto next_spec; case 'd': p = buf; /* skip space */ while(sch!=EOF && isspace(sch)) sch=NEXT_CHAR(f); while(sch!=EOF && isdigit(sch) && --width>=0) { *p++ = sch; sch=NEXT_CHAR(f); } *p = '\x0'; if( !skip_flag ) { matched++; if( modifier=='l' ) { *(va_arg(args, long*))=wcstol(NH_A2W(buf, wbuf, BUFSZ), NULL, 10); } else { *(va_arg(args, int*))=wcstol(NH_A2W(buf, wbuf, BUFSZ), NULL, 10); } } goto next_spec; case 'x': p = buf; while(sch!=EOF && isspace(sch)) sch=NEXT_CHAR(f); while(sch!=EOF && isxdigit(sch) && --width>=0) { *p++ = sch; sch=NEXT_CHAR(f); } *p = '\x0'; if( !skip_flag ) { matched++; if( modifier=='l' ) { *(va_arg(args, long*))=wcstol(NH_A2W(buf, wbuf, BUFSZ), NULL, 16); } else { *(va_arg(args, int*))=wcstol(NH_A2W(buf, wbuf, BUFSZ), NULL, 16); } } goto next_spec; case 'n': *(va_arg(args, int*)) = n_read; matched++; goto next_spec; case 's': if( skip_flag ) { while(sch!=EOF && !isspace(sch) && --width>=0) { sch=NEXT_CHAR(f); } } else { p = va_arg(args, char*); while(sch!=EOF && !isspace(sch) && --width>=0) { *p++ = sch; sch=NEXT_CHAR(f); } *p = '\x0'; matched++; } goto next_spec; case '[': { char pattern[256]; int start, end; int negate; ZeroMemory(pattern, sizeof(pattern)); p = pattern; /* try to parse '^' modifier */ ch = *format++; if( ch=='^' ) { negate=1; ch=*format++; } else { negate=0; } if( ch==0 ) RETURN_SCANF(EOF); for( ; ch && ch!=']'; ch = *format++ ) { /* try to parse range: a-z */ if( format[0]=='-' && format[1] && format[1]!=']' ) { start = ch; format++; end = *format++; while(start<=end) { if(!strchr(pattern, (char)start)) *p++ = (char)start; start++; } } else { if(!strchr(pattern, (char)ch)) *p++ = (char)ch; } } if( skip_flag ) { while(sch!=EOF && strchr(pattern, sch) && --width>=0) { sch=NEXT_CHAR(f); } } else { p = va_arg(args, char*); if( negate ) while(sch!=EOF && !strchr(pattern, sch) && --width>=0) { *p++ = sch; sch=NEXT_CHAR(f); } else while(sch!=EOF && strchr(pattern, sch) && --width>=0) { *p++ = sch; sch=NEXT_CHAR(f); } *p = '\x0'; matched++; } } goto next_spec; default: RETURN_SCANF(EOF); } } next_spec: width = 65535; modifier = -1; skip_flag = 0; ch = *format++; } fseek(f, -1, SEEK_CUR); RETURN_SCANF(matched); #undef RETURN_SCANF #undef NEXT_CHAR } int __cdecl fprintf(FILE *f , const char *format, ...) { int retval; va_list args; if( !f || !format ) return 0; va_start(args, format); retval = vfprintf(f, format, args); va_end(args); return retval; } int __cdecl vfprintf(FILE* f, const char *format, va_list args) { char buf[4096]; int retval; if( !f || !format ) return 0; retval = vsprintf(buf, format, args); write((int)f, buf, strlen(buf)); return retval; } int __cdecl fgetc(FILE * f) { char c; int fh = (int)f; if( !f ) return EOF; if( read(fh, &c, 1)==1 ) return c; else return EOF; } char * __cdecl fgets(char *s, int size, FILE *f) { /* not the best performance but it will do for now...*/ char c; if( !f || !s || size==0 ) return NULL; while( --size>0 ) { if( (c = fgetc(f))==EOF ) return NULL; *s++ = c; if( c=='\n' ) break; } *s = '\x0'; return s; } int __cdecl printf(const char *format, ...) { int retval; va_list args; if( !format ) return 0; va_start(args, format); retval = vprintf(format, args); va_end(args); return retval; } int __cdecl vprintf(const char *format, va_list args) { char buf[4096]; int retval; retval = vsprintf(buf, format, args); puts(buf); return retval; } // int __cdecl putchar(int); int __cdecl puts(const char * s) { TCHAR wbuf[4096]; NH_A2W(s, wbuf, 4096); MessageBox(NULL, wbuf, _T("stdout"), MB_OK); return 0; } FILE* __cdecl _getstdfilex(int desc) { return NULL; } int __cdecl fclose(FILE * f) { if(!f) return EOF; return close((int)f)==-1? EOF : 0; } size_t __cdecl fread(void *p, size_t size, size_t count, FILE *f) { int read_bytes; if(!f || !p || size==0 || count==0) return 0; read_bytes = read((int)f, p, size*count); return read_bytes>0? (read_bytes/size) : 0; } size_t __cdecl fwrite(const void *p, size_t size, size_t count, FILE * f) { int write_bytes; if(!f || !p || size==0 || count==0) return 0; write_bytes = write((int)f, p, size*count); return write_bytes>0? write_bytes/size : 0; } int __cdecl fflush(FILE *f) { return 0; } int __cdecl feof(FILE *f) { return (f && eof((int)f)==0)? 0 : 1; } int __cdecl fseek(FILE *f, long offset, int from) { return (f && lseek((int)f, offset, from)>=0)? 0 : 1; } long __cdecl ftell(FILE * f) { return f? lseek((int)f, 0, SEEK_CUR) : -1; } #endif slashem-0.0.7E7F3/sys/wince/keypad.uu0000664000076400007640000000044510545462317015432 0ustar alialibegin 600 keypad.bmp M0DV^`````````#X````H````<`````@````!``$``````(`````````````` M`````````````````/___P#__________________P``[__[____________ M_R0``.?_\_?C]__W__?_]^MU``#CP>/GU?/AX\/OY_O5=0``X>/#Q\'QX\'C MS^?YZR4``/_W_^?5\^?_\^__^]5M``#____WX_?O__OW__?_)```________ *__________\``.?5 ` end slashem-0.0.7E7F3/sys/wince/mhstatus.c0000664000076400007640000001602110545462317015613 0ustar aliali/* Copyright (C) 2001 by Alex Kompel */ /* NetHack may be freely redistributed. See license for details. */ #include "winMS.h" #include "mhstatus.h" #include "mhmsg.h" #include "mhfont.h" #include "mhcolor.h" #define MAXWINDOWTEXT 255 #define NHSTAT_LINES_2 2 #define NHSTAT_LINES_4 4 typedef struct mswin_nethack_status_window { int nhstat_format; char window_text[MAXWINDOWTEXT]; } NHStatusWindow, *PNHStatusWindow; static TCHAR szStatusWindowClass[] = TEXT("MSNHStatusWndClass"); LRESULT CALLBACK StatusWndProc(HWND, UINT, WPARAM, LPARAM); static void register_status_window_class(void); static void FormatStatusString(char* text, int format); HWND mswin_init_status_window () { static int run_once = 0; HWND ret; NHStatusWindow* data; if( !run_once ) { register_status_window_class( ); run_once = 1; } ret = CreateWindow( szStatusWindowClass, NULL, WS_CHILD | WS_DISABLED | WS_CLIPSIBLINGS, 0, /* x position */ 0, /* y position */ 0, /* x-size - we will set it later */ 0, /* y-size - we will set it later */ GetNHApp()->hMainWnd, NULL, GetNHApp()->hApp, NULL ); if( !ret ) panic("Cannot create status window"); EnableWindow(ret, FALSE); data = (PNHStatusWindow)malloc(sizeof(NHStatusWindow)); if( !data ) panic("out of memory"); ZeroMemory(data, sizeof(NHStatusWindow)); data->nhstat_format = NHSTAT_LINES_4; SetWindowLong(ret, GWL_USERDATA, (LONG)data); return ret; } void register_status_window_class() { WNDCLASS wcex; ZeroMemory( &wcex, sizeof(wcex)); wcex.style = CS_NOCLOSE; wcex.lpfnWndProc = (WNDPROC)StatusWndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = GetNHApp()->hApp; wcex.hIcon = NULL; wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = mswin_get_brush(NHW_STATUS, MSWIN_COLOR_BG); wcex.lpszMenuName = NULL; wcex.lpszClassName = szStatusWindowClass; RegisterClass(&wcex); } LRESULT CALLBACK StatusWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { RECT rt; PAINTSTRUCT ps; HDC hdc; PNHStatusWindow data; data = (PNHStatusWindow)GetWindowLong(hWnd, GWL_USERDATA); switch (message) { case WM_MSNH_COMMAND: { switch( wParam ) { case MSNH_MSG_PUTSTR: case MSNH_MSG_CLEAR_WINDOW: ZeroMemory(data->window_text, sizeof(data->window_text)); FormatStatusString(data->window_text, data->nhstat_format); break; case MSNH_MSG_CURSOR: { PMSNHMsgCursor msg_data = (PMSNHMsgCursor)lParam; if( msg_data->y==0 ) { InvalidateRect(hWnd, NULL, TRUE); } } break; } } break; case WM_PAINT: { HGDIOBJ oldFont; TCHAR wbuf[MAXWINDOWTEXT]; COLORREF OldBg, OldFg; hdc = BeginPaint(hWnd, &ps); GetClientRect(hWnd, &rt); oldFont = SelectObject(hdc, mswin_get_font(NHW_STATUS, ATR_NONE, hdc, FALSE)); OldBg = SetBkColor(hdc, mswin_get_color(NHW_STATUS, MSWIN_COLOR_BG)); OldFg = SetTextColor(hdc, mswin_get_color(NHW_STATUS, MSWIN_COLOR_FG)); DrawText(hdc, NH_A2W(data->window_text, wbuf, MAXWINDOWTEXT), strlen(data->window_text), &rt, DT_LEFT | DT_NOPREFIX); SetTextColor (hdc, OldFg); SetBkColor (hdc, OldBg); SelectObject(hdc, oldFont); EndPaint(hWnd, &ps); } break; case WM_DESTROY: free(data); SetWindowLong(hWnd, GWL_USERDATA, (LONG)0); break; case WM_SETFOCUS: SetFocus(GetNHApp()->hMainWnd); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } void mswin_status_window_size (HWND hWnd, LPSIZE sz) { TEXTMETRIC tm; HGDIOBJ saveFont; HDC hdc; PNHStatusWindow data; RECT rt; GetWindowRect(hWnd, &rt); sz->cx = rt.right - rt.left; sz->cy = rt.bottom - rt.top; data = (PNHStatusWindow)GetWindowLong(hWnd, GWL_USERDATA); if(data) { hdc = GetDC(hWnd); saveFont = SelectObject(hdc, mswin_get_font(NHW_STATUS, ATR_NONE, hdc, FALSE)); GetTextMetrics(hdc, &tm); /* see if the status window can fit 80 characters per line */ if( (80*tm.tmMaxCharWidth)>=sz->cx ) data->nhstat_format = NHSTAT_LINES_4; else data->nhstat_format = NHSTAT_LINES_2; /* set height of the status box */ sz->cy = tm.tmHeight * data->nhstat_format; SelectObject(hdc, saveFont); ReleaseDC(hWnd, hdc); } } extern const char *hu_stat[]; /* defined in eat.c */ extern const char *enc_stat[]; /* define in botl.c */ void FormatStatusString(char* text, int format) { register char *nb; int hp, hpmax; int cap = near_capacity(); Strcpy(text, plname); if('a' <= text[0] && text[0] <= 'z') text[0] += 'A'-'a'; text[10] = 0; Sprintf(nb = eos(text)," the "); if (Upolyd) { char mbot[BUFSZ]; int k = 0; Strcpy(mbot, mons[u.umonnum].mname); while(mbot[k] != 0) { if ((k == 0 || (k > 0 && mbot[k-1] == ' ')) && 'a' <= mbot[k] && mbot[k] <= 'z') mbot[k] += 'A' - 'a'; k++; } Sprintf(nb = eos(nb), mbot); } else Sprintf(nb = eos(nb), rank_of(u.ulevel, Role_switch, flags.female)); if( format==NHSTAT_LINES_4 ) Sprintf(nb = eos(nb),"\r\n"); if (ACURR(A_STR) > 18) { if (ACURR(A_STR) > STR18(100)) Sprintf(nb = eos(nb),"St:%2d ",ACURR(A_STR)-100); else if (ACURR(A_STR) < STR18(100)) Sprintf(nb = eos(nb), "St:18/%02d ",ACURR(A_STR)-18); else Sprintf(nb = eos(nb),"St:18/** "); } else Sprintf(nb = eos(nb), "St:%-1d ",ACURR(A_STR)); Sprintf(nb = eos(nb), "Dx:%-1d Co:%-1d In:%-1d Wi:%-1d Ch:%-1d", ACURR(A_DEX), ACURR(A_CON), ACURR(A_INT), ACURR(A_WIS), ACURR(A_CHA)); Sprintf(nb = eos(nb), (u.ualign.type == A_CHAOTIC) ? " Chaotic" : (u.ualign.type == A_NEUTRAL) ? " Neutral" : " Lawful"); #ifdef SCORE_ON_BOTL if (flags.showscore) Sprintf(nb = eos(nb), " S:%ld", botl_score()); #endif if( format==NHSTAT_LINES_4 || format==NHSTAT_LINES_2 ) strcat(text, "\r\n"); /* third line */ hp = Upolyd ? u.mh : u.uhp; hpmax = Upolyd ? u.mhmax : u.uhpmax; if(hp < 0) hp = 0; (void) describe_level(nb=eos(nb)); Sprintf(nb = eos(nb), "%c:%-2ld HP:%d(%d) Pw:%d(%d) AC:%-2d", oc_syms[COIN_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); #ifdef EXP_ON_BOTL else if(flags.showexp) Sprintf(nb = eos(nb), " Xp:%u/%-1ld", u.ulevel,u.uexp); #endif else Sprintf(nb = eos(nb), " Exp:%u", u.ulevel); if( format==NHSTAT_LINES_4 ) strcat(text, "\r\n"); else strcat(text, " "); /* forth line */ if(flags.time) Sprintf(nb = eos(nb), "T:%ld ", moves); if(strcmp(hu_stat[u.uhs], " ")) { Strcat(text, hu_stat[u.uhs]); Sprintf(nb = eos(nb), " "); } if(Confusion) Sprintf(nb = eos(nb), "Conf"); if(Sick) { if (u.usick_type & SICK_VOMITABLE) Sprintf(nb = eos(nb), " FoodPois"); if (u.usick_type & SICK_NONVOMITABLE) Sprintf(nb = eos(nb), " Ill"); } if(Blind) Sprintf(nb = eos(nb), " Blind"); if(Stunned) Sprintf(nb = eos(nb), " Stun"); if(Hallucination) Sprintf(nb = eos(nb), " Hallu"); if(Slimed) Sprintf(nb = eos(nb), " Slime"); if(cap > UNENCUMBERED) Sprintf(nb = eos(nb), " %s", enc_stat[cap]); } slashem-0.0.7E7F3/sys/wince/mhdlg.h0000664000076400007640000000070310545462317015043 0ustar aliali/* 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 */ slashem-0.0.7E7F3/sys/wince/mhmenu.h0000664000076400007640000000067010545462317015244 0ustar aliali/* 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 */ slashem-0.0.7E7F3/sys/wince/mhmenu.c0000664000076400007640000012053010545462317015235 0ustar aliali/* NetHack may be freely redistributed. See license for details. */ #include "winMS.h" #include #include "mhmenu.h" #include "mhmain.h" #include "mhmsg.h" #include "mhcmd.h" #include "mhinput.h" #include "mhfont.h" #include "mhcolor.h" #include "mhtxtbuf.h" #define MENU_MARGIN 0 #define NHMENU_STR_SIZE BUFSZ #define MIN_TABSTOP_SIZE 0 #define NUMTABS 15 #define TAB_SEPARATION 10 /* pixels between each tab stop */ typedef struct mswin_menu_item { int glyph; ANY_P identifier; CHAR_P accelerator; CHAR_P group_accel; int attr; char str[NHMENU_STR_SIZE]; BOOLEAN_P presel; int count; BOOL has_focus; BOOL has_tab; } NHMenuItem, *PNHMenuItem; typedef struct mswin_nethack_menu_window { int type; /* MENU_TYPE_TEXT or MENU_TYPE_MENU */ int how; /* for menus: PICK_NONE, PICK_ONE, PICK_ANY */ union { struct menu_list { int size; /* number of items in items[] */ int allocated; /* number of allocated slots in items[] */ PNHMenuItem items; /* menu items */ char gacc[QBUFSZ]; /* group accelerators */ BOOL counting; /* counting flag */ char prompt[QBUFSZ]; /* menu prompt */ int tab_stop_size[NUMTABS];/* tabstops to align option values */ } menu; struct menu_text { PNHTextBuffer text; } text; }; int result; int done; HBITMAP bmpChecked; HBITMAP bmpCheckedCount; HBITMAP bmpNotChecked; } NHMenuWindow, *PNHMenuWindow; extern short glyph2tile[]; static WNDPROC wndProcListViewOrig = NULL; static WNDPROC editControlWndProc = NULL; #define NHMENU_IS_SELECTABLE(item) ((item).identifier.a_obj!=NULL) #define NHMENU_IS_SELECTED(item) ((item).count!=0) LRESULT CALLBACK MenuWndProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK NHMenuListWndProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK NHMenuTextWndProc(HWND, UINT, WPARAM, LPARAM); static void CheckInputDialog(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); static void onMSNHCommand(HWND hWnd, WPARAM wParam, LPARAM lParam); static LRESULT onMeasureItem(HWND hWnd, WPARAM wParam, LPARAM lParam); static LRESULT onDrawItem(HWND hWnd, WPARAM wParam, LPARAM lParam); static void LayoutMenu(HWND hwnd); static void SetMenuType(HWND hwnd, int type); static void SetMenuListType(HWND hwnd, int now); static HWND GetMenuControl(HWND hwnd); static void SelectMenuItem(HWND hwndList, PNHMenuWindow data, int item, int count); static void reset_menu_count(HWND hwndList, PNHMenuWindow data); static LRESULT onListChar(HWND hWnd, HWND hwndList, WORD ch); static char* parse_menu_str(char* dest, const char* src, size_t size); HWND mswin_init_menu_window (int type) { HWND ret; ret = CreateDialog( GetNHApp()->hApp, MAKEINTRESOURCE(IDD_MENU), GetNHApp()->hMainWnd, MenuWndProc ); if( !ret ) { panic("Cannot create menu window"); } SetMenuType(ret, type); return ret; } int mswin_menu_window_select_menu (HWND hWnd, int how, MENU_ITEM_P ** _selected) { PNHMenuWindow data; int ret_val; MENU_ITEM_P *selected = NULL; int i; char* ap; char accell_str[256]; assert( _selected!=NULL ); *_selected = NULL; ret_val = -1; data = (PNHMenuWindow)GetWindowLong(hWnd, GWL_USERDATA); /* set menu type */ SetMenuListType(hWnd, how); /* Ok, now give items a unique accelerators */ ZeroMemory(accell_str, sizeof(accell_str)); ap = accell_str; #if defined(WIN_CE_SMARTPHONE) if( data->menu.size>10 ) { *ap++ = MENU_FIRST_PAGE; *ap++ = MENU_LAST_PAGE; *ap++ = MENU_NEXT_PAGE; *ap++ = MENU_PREVIOUS_PAGE; if( data->how == PICK_ANY ) { *ap++ = MENU_SELECT_ALL; *ap++ = MENU_UNSELECT_ALL; *ap++ = MENU_INVERT_ALL; *ap++ = MENU_SELECT_PAGE; *ap++ = MENU_UNSELECT_PAGE; *ap++ = MENU_INVERT_PAGE; } *ap++ = MENU_SEARCH; } #endif if( data->type == MENU_TYPE_MENU ) { char next_char = 'a'; for( i=0; imenu.size; i++) { if( data->menu.items[i].accelerator!=0 ) { *ap++ = data->menu.items[i].accelerator; next_char = (char)(data->menu.items[i].accelerator+1); } else if( NHMENU_IS_SELECTABLE(data->menu.items[i]) ) { if ( (next_char>='a' && next_char<='z') || (next_char>='A' && next_char<='Z') ) { data->menu.items[i].accelerator = next_char; *ap++ = data->menu.items[i].accelerator; } else { if( next_char > 'z' ) next_char = 'A'; else if ( next_char > 'Z' ) break; data->menu.items[i].accelerator = next_char; *ap++ = data->menu.items[i].accelerator; } next_char ++; } } /* collect group accelerators */ data->menu.gacc[0] = '\0'; ap = data->menu.gacc; if( data->how != PICK_NONE ) { for( i=0; imenu.size; i++) { if( data->menu.items[i].group_accel && !strchr(data->menu.gacc, data->menu.items[i].group_accel) ) { *ap++ = data->menu.items[i].group_accel; *ap = '\x0'; } } } reset_menu_count(NULL, data); } #if defined(WIN_CE_SMARTPHONE) if( data->type==MENU_TYPE_MENU ) NHSPhoneSetKeypadFromString( accell_str ); #endif mswin_popup_display(hWnd, &data->done); /* get the result */ if( data->result != -1 ) { if(how==PICK_NONE) { if(data->result>=0) ret_val=0; else ret_val=-1; } else if(how==PICK_ONE || how==PICK_ANY) { /* count selected items */ ret_val = 0; for(i=0; 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; } } } mswin_popup_destroy(hWnd); #if defined(WIN_CE_SMARTPHONE) if( data->type==MENU_TYPE_MENU ) NHSPhoneSetKeypadDefault(); #endif return ret_val; } LRESULT CALLBACK MenuWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { PNHMenuWindow data; CheckInputDialog(hWnd, message, wParam, lParam); data = (PNHMenuWindow)GetWindowLong(hWnd, GWL_USERDATA); switch (message) { case WM_INITDIALOG: { HWND text_control; HDC hDC; text_control = GetDlgItem(hWnd, IDC_MENU_TEXT); data = (PNHMenuWindow)malloc(sizeof(NHMenuWindow)); ZeroMemory(data, sizeof(NHMenuWindow)); data->type = MENU_TYPE_TEXT; data->how = PICK_NONE; data->result = 0; data->done = 0; data->bmpChecked = LoadBitmap(GetNHApp()->hApp, MAKEINTRESOURCE(IDB_MENU_SEL)); data->bmpCheckedCount = LoadBitmap(GetNHApp()->hApp, MAKEINTRESOURCE(IDB_MENU_SEL_COUNT)); data->bmpNotChecked = LoadBitmap(GetNHApp()->hApp, MAKEINTRESOURCE(IDB_MENU_UNSEL)); SetWindowLong(hWnd, GWL_USERDATA, (LONG)data); /* subclass edit control */ editControlWndProc = (WNDPROC)GetWindowLong(text_control, GWL_WNDPROC); SetWindowLong(text_control, GWL_WNDPROC, (LONG)NHMenuTextWndProc); /* set text window font */ hDC = GetDC(text_control); SendMessage( text_control, WM_SETFONT, (WPARAM)mswin_get_font(NHW_TEXT, ATR_NONE, hDC, FALSE), (LPARAM)0 ); ReleaseDC(text_control, hDC); #if defined(WIN_CE_SMARTPHONE) /* special initialization for SmartPhone dialogs */ NHSPhoneDialogSetup(hWnd, FALSE, GetNHApp()->bFullScreen); #endif } break; case WM_MSNH_COMMAND: onMSNHCommand(hWnd, wParam, lParam); break; case WM_SIZE: LayoutMenu(hWnd); return FALSE; case WM_COMMAND: { switch (LOWORD(wParam)) { case IDCANCEL: if( data->type == MENU_TYPE_MENU && (data->how==PICK_ONE || data->how==PICK_ANY) && data->menu.counting) { HWND list; int i; /* reset counter if counting is in progress */ list = GetMenuControl(hWnd); i = ListView_GetNextItem(list, -1, LVNI_FOCUSED); if( i>=0 ) { SelectMenuItem(list, data, i, 0); } return FALSE; } else { data->result = -1; data->done = 1; } return FALSE; case IDOK: data->done = 1; data->result = 0; return FALSE; } } break; case WM_NOTIFY: { LPNMHDR lpnmhdr = (LPNMHDR)lParam; switch (LOWORD(wParam)) { case IDC_MENU_LIST: { if( !data || data->type!=MENU_TYPE_MENU ) break; switch(lpnmhdr->code) { case LVN_ITEMACTIVATE: { LPNMLISTVIEW lpnmlv = (LPNMLISTVIEW)lParam; if(data->how==PICK_ONE) { if( lpnmlv->iItem>=0 && lpnmlv->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; } } else if( data->how==PICK_ANY ) { if( lpnmlv->iItem>=0 && lpnmlv->iItemmenu.size && NHMENU_IS_SELECTABLE(data->menu.items[lpnmlv->iItem]) ) { SelectMenuItem( lpnmlv->hdr.hwndFrom, data, lpnmlv->iItem, NHMENU_IS_SELECTED(data->menu.items[lpnmlv->iItem])? 0 : -1 ); } } } break; case NM_CLICK: { LPNMLISTVIEW lpnmlv = (LPNMLISTVIEW) lParam; if( lpnmlv->iItem==-1 ) return 0; if( data->how==PICK_ANY ) { SelectMenuItem( lpnmlv->hdr.hwndFrom, data, lpnmlv->iItem, NHMENU_IS_SELECTED(data->menu.items[lpnmlv->iItem])? 0 : -1 ); } } break; case LVN_ITEMCHANGED: { LPNMLISTVIEW lpnmlv = (LPNMLISTVIEW)lParam; if( lpnmlv->iItem==-1 ) return 0; if( !(lpnmlv->uChanged & LVIF_STATE) ) return 0; /* update item that has the focus */ data->menu.items[lpnmlv->iItem].has_focus = !!(lpnmlv->uNewState & LVIS_FOCUSED); ListView_RedrawItems(lpnmlv->hdr.hwndFrom, lpnmlv->iItem, lpnmlv->iItem); /* update count for single-selection menu (follow the listview selection) */ if( data->how==PICK_ONE ) { if( lpnmlv->uNewState & LVIS_SELECTED ) { SelectMenuItem( lpnmlv->hdr.hwndFrom, data, lpnmlv->iItem, -1 ); } } /* check item focus */ data->menu.items[lpnmlv->iItem].has_focus = !!(lpnmlv->uNewState & LVIS_FOCUSED); ListView_RedrawItems(lpnmlv->hdr.hwndFrom, lpnmlv->iItem, lpnmlv->iItem); } break; case NM_KILLFOCUS: reset_menu_count(lpnmhdr->hwndFrom, data); break; } } break; } } break; case WM_SETFOCUS: if( hWnd!=GetNHApp()->hPopupWnd ) { SetFocus(GetNHApp()->hPopupWnd ); return 0; } break; case WM_MEASUREITEM: if( wParam==IDC_MENU_LIST ) return onMeasureItem(hWnd, wParam, lParam); else return FALSE; case WM_DRAWITEM: if( wParam==IDC_MENU_LIST ) return onDrawItem(hWnd, wParam, lParam); else return FALSE; case WM_CTLCOLORBTN: case WM_CTLCOLOREDIT: case WM_CTLCOLORSTATIC: { /* sent by edit control before it is drawn */ HDC hdcEdit = (HDC) wParam; HWND hwndEdit = (HWND) lParam; if( hwndEdit == GetDlgItem(hWnd, IDC_MENU_TEXT) ) { SetBkColor(hdcEdit, mswin_get_color(NHW_TEXT, MSWIN_COLOR_BG)); SetTextColor(hdcEdit, mswin_get_color(NHW_TEXT, MSWIN_COLOR_FG)); return (BOOL)mswin_get_brush(NHW_TEXT, MSWIN_COLOR_BG); } } return FALSE; case WM_DESTROY: if( data ) { DeleteObject(data->bmpChecked); DeleteObject(data->bmpCheckedCount); DeleteObject(data->bmpNotChecked); if( data->type == MENU_TYPE_TEXT ) { if( data->text.text ) { mswin_free_text_buffer(data->text.text); data->text.text = NULL; } } free(data); SetWindowLong(hWnd, GWL_USERDATA, (LONG)0); } return TRUE; } return FALSE; } void CheckInputDialog(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { #if defined(WIN_CE_POCKETPC) PNHMenuWindow data; data = (PNHMenuWindow)GetWindowLong(hWnd, GWL_USERDATA); if( !( data && data->type==MENU_TYPE_MENU && (data->how==PICK_ONE || data->how==PICK_ANY) ) ) return; switch(message) { case WM_SETFOCUS: if( GetNHApp()->bUseSIP ) SHSipPreference(hWnd, SIP_UP); return; case WM_DESTROY: case WM_KILLFOCUS: if( GetNHApp()->bUseSIP ) SHSipPreference(hWnd, SIP_DOWN); return; case WM_NOTIFY: { LPNMHDR lpnmhdr = (LPNMHDR)lParam; switch(lpnmhdr->code) { case NM_SETFOCUS: if( GetNHApp()->bUseSIP ) SHSipPreference(hWnd, SIP_UP); break; case NM_KILLFOCUS: if( GetNHApp()->bUseSIP ) SHSipPreference(hWnd, SIP_DOWN); break; } } return; case WM_COMMAND: switch(HIWORD(wParam)) { case BN_SETFOCUS: if( GetNHApp()->bUseSIP ) SHSipPreference(hWnd, SIP_UP); break; case BN_KILLFOCUS: if( GetNHApp()->bUseSIP ) SHSipPreference(hWnd, SIP_DOWN); break; } return; } /* end switch */ #endif } void onMSNHCommand(HWND hWnd, WPARAM wParam, LPARAM lParam) { PNHMenuWindow data; data = (PNHMenuWindow)GetWindowLong(hWnd, GWL_USERDATA); switch( wParam ) { case MSNH_MSG_PUTSTR: { PMSNHMsgPutstr msg_data = (PMSNHMsgPutstr)lParam; HWND text_view; if( data->type!=MENU_TYPE_TEXT ) SetMenuType(hWnd, MENU_TYPE_TEXT); if( !data->text.text ) { data->text.text = mswin_init_text_buffer( program_state.gameover? FALSE : GetNHApp()->bWrapText ); if( !data->text.text ) break; } mswin_add_text(data->text.text, msg_data->attr, msg_data->text); text_view = GetDlgItem(hWnd, IDC_MENU_TEXT); if( !text_view ) panic("cannot get text view window"); mswin_render_text(data->text.text, text_view); } break; case MSNH_MSG_STARTMENU: { int i; if( data->type!=MENU_TYPE_MENU ) SetMenuType(hWnd, MENU_TYPE_MENU); if( data->menu.items ) free(data->menu.items); data->how = PICK_NONE; data->menu.items = NULL; data->menu.size = 0; data->menu.allocated = 0; data->done = 0; data->result = 0; for (i = 0; i < NUMTABS; ++i) data->menu.tab_stop_size[i] = MIN_TABSTOP_SIZE; } break; case MSNH_MSG_ADDMENU: { PMSNHMsgAddMenu msg_data = (PMSNHMsgAddMenu)lParam; char *p, *p1; int new_item; HDC hDC; int column; HFONT saveFont; if( data->type!=MENU_TYPE_MENU ) break; if( strlen(msg_data->str)==0 ) break; if( data->menu.size==data->menu.allocated ) { data->menu.allocated += 10; data->menu.items = (PNHMenuItem)realloc(data->menu.items, data->menu.allocated*sizeof(NHMenuItem)); } new_item = data->menu.size; ZeroMemory( &data->menu.items[new_item], sizeof(data->menu.items[new_item])); data->menu.items[new_item].glyph = msg_data->glyph; data->menu.items[new_item].identifier = *msg_data->identifier; data->menu.items[new_item].accelerator = msg_data->accelerator; data->menu.items[new_item].group_accel = msg_data->group_accel; data->menu.items[new_item].attr = msg_data->attr; parse_menu_str(data->menu.items[new_item].str, msg_data->str, NHMENU_STR_SIZE); data->menu.items[new_item].presel = msg_data->presel; /* calculate tabstop size */ p = strchr(data->menu.items[new_item].str, '\t'); if( p ) { data->menu.items[new_item].has_tab = TRUE; hDC = GetDC(hWnd); saveFont = SelectObject(hDC, mswin_get_font(NHW_MENU, msg_data->attr, hDC, FALSE)); p1 = data->menu.items[new_item].str; column = 0; for (;;) { TCHAR wbuf[BUFSZ]; RECT drawRect; SetRect ( &drawRect, 0, 0, 1, 1 ); if (p != NULL) *p = '\0'; /* for time being, view tab field as zstring */ DrawText(hDC, NH_A2W(p1, wbuf, BUFSZ), strlen(p1), &drawRect, DT_CALCRECT | DT_LEFT | DT_VCENTER | DT_EXPANDTABS | DT_SINGLELINE ); data->menu.tab_stop_size[column] = max( data->menu.tab_stop_size[column], drawRect.right - drawRect.left ); if (p != NULL) *p = '\t'; else /* last string so, */ break; ++column; p1 = p + 1; p = strchr(p1, '\t'); } SelectObject(hDC, saveFont); ReleaseDC(hWnd, hDC); } else { data->menu.items[new_item].has_tab = FALSE; } /* increment size */ data->menu.size++; } break; case MSNH_MSG_ENDMENU: { PMSNHMsgEndMenu msg_data = (PMSNHMsgEndMenu)lParam; if( msg_data->text ) { strncpy( data->menu.prompt, msg_data->text, sizeof(data->menu.prompt)-1 ); } else { ZeroMemory(data->menu.prompt, sizeof(data->menu.prompt)); } } break; } /* end switch */ } void LayoutMenu(HWND hWnd) { PNHMenuWindow data; HWND menu_ok; HWND menu_cancel; RECT clrt, rt; POINT pt_elem, pt_ok, pt_cancel; SIZE sz_elem, sz_ok, sz_cancel; data = (PNHMenuWindow)GetWindowLong(hWnd, GWL_USERDATA); menu_ok = GetDlgItem(hWnd, IDOK); menu_cancel = GetDlgItem(hWnd, IDCANCEL); /* get window coordinates */ GetClientRect(hWnd, &clrt ); /* set window placements */ if( IsWindow(menu_ok) ) { GetWindowRect(menu_ok, &rt); sz_ok.cx = (clrt.right - clrt.left)/2 - 2*MENU_MARGIN; sz_ok.cy = rt.bottom-rt.top; pt_ok.x = clrt.left + MENU_MARGIN; pt_ok.y = clrt.bottom - MENU_MARGIN - sz_ok.cy; MoveWindow(menu_ok, pt_ok.x, pt_ok.y, sz_ok.cx, sz_ok.cy, TRUE ); } else { pt_ok.x = 0; pt_ok.y = clrt.bottom; sz_ok.cx = sz_ok.cy = 0; } if( IsWindow(menu_cancel) ) { GetWindowRect(menu_cancel, &rt); sz_cancel.cx = (clrt.right - clrt.left)/2 - 2*MENU_MARGIN; sz_cancel.cy = rt.bottom-rt.top; pt_cancel.x = (clrt.left + clrt.right)/2 + MENU_MARGIN; pt_cancel.y = clrt.bottom - MENU_MARGIN - sz_cancel.cy; MoveWindow(menu_cancel, pt_cancel.x, pt_cancel.y, sz_cancel.cx, sz_cancel.cy, TRUE ); } else { pt_cancel.x = 0; pt_cancel.y = clrt.bottom; sz_cancel.cx = sz_cancel.cy = 0; } pt_elem.x = clrt.left + MENU_MARGIN; pt_elem.y = clrt.top + MENU_MARGIN; sz_elem.cx = (clrt.right - clrt.left) - 2*MENU_MARGIN; sz_elem.cy = min(pt_cancel.y, pt_ok.y) - MENU_MARGIN - pt_elem.y; MoveWindow(GetMenuControl(hWnd), pt_elem.x, pt_elem.y, sz_elem.cx, sz_elem.cy, TRUE ); /* reformat text for the text menu */ if( data && data->type==MENU_TYPE_TEXT && data->text.text ) mswin_render_text(data->text.text, GetMenuControl(hWnd)); } void SetMenuType(HWND hWnd, int type) { PNHMenuWindow data; HWND list, text; data = (PNHMenuWindow)GetWindowLong(hWnd, GWL_USERDATA); data->type = type; text = GetDlgItem(hWnd, IDC_MENU_TEXT); list = GetDlgItem(hWnd, IDC_MENU_LIST); if(data->type==MENU_TYPE_TEXT) { ShowWindow(list, SW_HIDE); EnableWindow(list, FALSE); EnableWindow(text, TRUE); ShowWindow(text, SW_SHOW); SetFocus(text); } else { ShowWindow(text, SW_HIDE); EnableWindow(text, FALSE); EnableWindow(list, TRUE); ShowWindow(list, SW_SHOW); SetFocus(list); } LayoutMenu(hWnd); } void SetMenuListType(HWND hWnd, int how) { PNHMenuWindow data; RECT rt; DWORD dwStyles; char buf[BUFSZ]; TCHAR wbuf[BUFSZ]; int nItem; int i; HWND control; LVCOLUMN lvcol; LRESULT fnt; SIZE wnd_size; data = (PNHMenuWindow)GetWindowLong(hWnd, GWL_USERDATA); if( data->type != MENU_TYPE_MENU ) return; data->how = how; switch(how) { case PICK_NONE: dwStyles = WS_VISIBLE | WS_TABSTOP | WS_BORDER | WS_CHILD | WS_VSCROLL | WS_HSCROLL | LVS_REPORT | LVS_OWNERDRAWFIXED | LVS_SINGLESEL; break; case PICK_ONE: dwStyles = WS_VISIBLE | WS_TABSTOP | WS_BORDER | WS_CHILD | WS_VSCROLL | WS_HSCROLL | LVS_REPORT | LVS_OWNERDRAWFIXED | LVS_SINGLESEL; break; case PICK_ANY: dwStyles = WS_VISIBLE | WS_TABSTOP | WS_BORDER | WS_CHILD | WS_VSCROLL | WS_HSCROLL | LVS_REPORT | LVS_OWNERDRAWFIXED | LVS_SINGLESEL; break; default: panic("how should be one of PICK_NONE, PICK_ONE or PICK_ANY"); }; if( strlen(data->menu.prompt)==0 ) { dwStyles |= LVS_NOCOLUMNHEADER ; } GetWindowRect(GetDlgItem(hWnd, IDC_MENU_LIST), &rt); DestroyWindow(GetDlgItem(hWnd, IDC_MENU_LIST)); control = CreateWindow(WC_LISTVIEW, NULL, dwStyles, rt.left, rt.top, rt.right - rt.left, rt.bottom - rt.top, hWnd, (HMENU)IDC_MENU_LIST, GetNHApp()->hApp, NULL ); if( !control ) panic( "cannot create menu control" ); /* install the hook for the control window procedure */ wndProcListViewOrig = (WNDPROC)GetWindowLong(control, GWL_WNDPROC); SetWindowLong(control, GWL_WNDPROC, (LONG)NHMenuListWndProc); /* set control font */ fnt = SendMessage(hWnd, WM_GETFONT, (WPARAM)0, (LPARAM)0); SendMessage(control, WM_SETFONT, (WPARAM)fnt, (LPARAM)0); /* set control colors */ ListView_SetBkColor(control, mswin_get_color(NHW_MENU, MSWIN_COLOR_BG)); ListView_SetTextBkColor(control, mswin_get_color(NHW_MENU, MSWIN_COLOR_BG)); ListView_SetTextColor(control, mswin_get_color(NHW_MENU, MSWIN_COLOR_FG)); /* add column to the list view */ mswin_menu_window_size(hWnd, &wnd_size); ZeroMemory(&lvcol, sizeof(lvcol)); lvcol.mask = LVCF_WIDTH | LVCF_TEXT; lvcol.cx = max( wnd_size.cx, GetSystemMetrics(SM_CXSCREEN)); lvcol.pszText = NH_A2W(data->menu.prompt, wbuf, BUFSZ); ListView_InsertColumn(control, 0, &lvcol); /* add items to the list view */ for(i=0; 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); } } LRESULT onMeasureItem(HWND hWnd, WPARAM wParam, LPARAM lParam) { LPMEASUREITEMSTRUCT lpmis; TEXTMETRIC tm; HGDIOBJ saveFont; HDC hdc; PNHMenuWindow data; RECT list_rect; lpmis = (LPMEASUREITEMSTRUCT) lParam; data = (PNHMenuWindow)GetWindowLong(hWnd, GWL_USERDATA); GetClientRect(GetMenuControl(hWnd), &list_rect); hdc = GetDC(GetMenuControl(hWnd)); saveFont = SelectObject(hdc, mswin_get_font(NHW_MENU, ATR_INVERSE, hdc, FALSE)); GetTextMetrics(hdc, &tm); /* Set the height of the list box items. */ lpmis->itemHeight = max(tm.tmHeight, TILE_Y)+2; lpmis->itemWidth = list_rect.right - list_rect.left; SelectObject(hdc, saveFont); ReleaseDC(GetMenuControl(hWnd), hdc); return TRUE; } LRESULT onDrawItem(HWND hWnd, WPARAM wParam, LPARAM lParam) { LPDRAWITEMSTRUCT lpdis; PNHMenuItem item; PNHMenuWindow data; TEXTMETRIC tm; HGDIOBJ saveFont; HDC tileDC; short ntile; int t_x, t_y; int x, y; TCHAR wbuf[BUFSZ]; RECT drawRect; COLORREF OldBg, OldFg, NewBg; char *p, *p1; int column; lpdis = (LPDRAWITEMSTRUCT) lParam; /* If there are no list box items, skip this message. */ if (lpdis->itemID == -1) return FALSE; data = (PNHMenuWindow)GetWindowLong(hWnd, GWL_USERDATA); item = &data->menu.items[lpdis->itemID]; tileDC = CreateCompatibleDC(lpdis->hDC); saveFont = SelectObject(lpdis->hDC, mswin_get_font(NHW_MENU, item->attr, lpdis->hDC, FALSE)); NewBg = mswin_get_color(NHW_MENU, MSWIN_COLOR_BG); OldBg = SetBkColor(lpdis->hDC, NewBg); OldFg = SetTextColor(lpdis->hDC, mswin_get_color(NHW_MENU, MSWIN_COLOR_FG)); GetTextMetrics(lpdis->hDC, &tm); x = lpdis->rcItem.left + 1; /* print check mark if it is a "selectable" menu */ if( data->how!=PICK_NONE ) { if( NHMENU_IS_SELECTABLE(*item) ) { HGDIOBJ saveBrush; HBRUSH hbrCheckMark; char buf[2]; switch(item->count) { case -1: hbrCheckMark = CreatePatternBrush(data->bmpChecked); break; case 0: hbrCheckMark = CreatePatternBrush(data->bmpNotChecked); break; default: hbrCheckMark = CreatePatternBrush(data->bmpCheckedCount); break; } y = (lpdis->rcItem.bottom + lpdis->rcItem.top - TILE_Y) / 2; SetBrushOrgEx(lpdis->hDC, x, y, NULL); saveBrush = SelectObject(lpdis->hDC, hbrCheckMark); PatBlt(lpdis->hDC, x, y, TILE_X, TILE_Y, PATCOPY); SelectObject(lpdis->hDC, saveBrush); DeleteObject(hbrCheckMark); x += TILE_X + 5; if(item->accelerator!=0) { buf[0] = item->accelerator; buf[1] = '\x0'; SetRect( &drawRect, x, lpdis->rcItem.top, lpdis->rcItem.right, lpdis->rcItem.bottom ); DrawText(lpdis->hDC, NH_A2W(buf, wbuf, 2), 1, &drawRect, DT_LEFT | DT_VCENTER | DT_SINGLELINE | DT_NOPREFIX); } x += tm.tmAveCharWidth + tm.tmOverhang + 5; } else { x += TILE_X + tm.tmAveCharWidth + tm.tmOverhang + 10; } } /* print glyph if present */ if( item->glyph != NO_GLYPH ) { HGDIOBJ saveBmp; saveBmp = SelectObject(tileDC, GetNHApp()->bmpTiles); ntile = glyph2tile[ item->glyph ]; t_x = (ntile % TILES_PER_LINE)*TILE_X; t_y = (ntile / TILES_PER_LINE)*TILE_Y; y = (lpdis->rcItem.bottom + lpdis->rcItem.top - TILE_Y) / 2; nhapply_image_transparent( lpdis->hDC, x, y, TILE_X, TILE_Y, tileDC, t_x, t_y, TILE_X, TILE_Y, TILE_BK_COLOR ); SelectObject(tileDC, saveBmp); } x += TILE_X + 5; /* draw item text */ if( item->has_tab ) { p1 = item->str; p = strchr(item->str, '\t'); column = 0; SetRect( &drawRect, x, lpdis->rcItem.top, min(x + data->menu.tab_stop_size[0], lpdis->rcItem.right), lpdis->rcItem.bottom ); for (;;) { TCHAR wbuf[BUFSZ]; if (p != NULL) *p = '\0'; /* for time being, view tab field as zstring */ DrawText(lpdis->hDC, NH_A2W(p1, wbuf, BUFSZ), strlen(p1), &drawRect, DT_LEFT | DT_VCENTER | DT_SINGLELINE ); if (p != NULL) *p = '\t'; else /* last string so, */ break; p1 = p + 1; p = strchr(p1, '\t'); drawRect.left = drawRect.right + TAB_SEPARATION; ++column; drawRect.right = min (drawRect.left + data->menu.tab_stop_size[column], lpdis->rcItem.right); } } else { TCHAR wbuf[BUFSZ]; SetRect( &drawRect, x, lpdis->rcItem.top, lpdis->rcItem.right, lpdis->rcItem.bottom); DrawText(lpdis->hDC, NH_A2W(item->str, wbuf, BUFSZ), strlen(item->str), &drawRect, DT_LEFT | DT_VCENTER | DT_SINGLELINE ); } /* draw focused item */ if( item->has_focus ) { RECT client_rt; HBRUSH bkBrush; GetClientRect(lpdis->hwndItem, &client_rt); if( NHMENU_IS_SELECTABLE(*item) && data->menu.items[lpdis->itemID].count>0 && item->glyph != NO_GLYPH ) { if( data->menu.items[lpdis->itemID].count==-1 ) { _stprintf(wbuf, TEXT("Count: All") ); } else { _stprintf(wbuf, TEXT("Count: %d"), data->menu.items[lpdis->itemID].count ); } SelectObject(lpdis->hDC, mswin_get_font(NHW_MENU, ATR_BLINK, lpdis->hDC, FALSE)); /* calculate text rectangle */ SetRect( &drawRect, client_rt.left, lpdis->rcItem.top, client_rt.right, lpdis->rcItem.bottom ); DrawText(lpdis->hDC, wbuf, _tcslen(wbuf), &drawRect, DT_CALCRECT | DT_RIGHT | DT_VCENTER | DT_SINGLELINE | DT_NOPREFIX ); /* erase text rectangle */ drawRect.left = max(client_rt.left+1, client_rt.right - (drawRect.right - drawRect.left) - 10); drawRect.right = client_rt.right-1; drawRect.top = lpdis->rcItem.top; drawRect.bottom = lpdis->rcItem.bottom; bkBrush = CreateSolidBrush( GetBkColor(lpdis->hDC) ); FillRect(lpdis->hDC, &drawRect, bkBrush ); DeleteObject( bkBrush ); /* draw text */ DrawText(lpdis->hDC, wbuf, _tcslen(wbuf), &drawRect, DT_RIGHT | DT_VCENTER | DT_SINGLELINE | DT_NOPREFIX ); } /* draw focus rect */ SetRect( &drawRect, client_rt.left, lpdis->rcItem.top, client_rt.right, lpdis->rcItem.bottom ); DrawFocusRect(lpdis->hDC, &drawRect); } SetTextColor (lpdis->hDC, OldFg); SetBkColor (lpdis->hDC, OldBg); SelectObject(lpdis->hDC, saveFont); DeleteDC(tileDC); return TRUE; } BOOL onListChar(HWND hWnd, HWND hwndList, WORD ch) { int i = 0; PNHMenuWindow data; int curIndex, topIndex, pageSize; boolean is_accelerator = FALSE; data = (PNHMenuWindow)GetWindowLong(hWnd, GWL_USERDATA); switch( ch ) { case MENU_FIRST_PAGE: i = 0; ListView_SetItemState(hwndList, i, LVIS_FOCUSED, LVIS_FOCUSED); ListView_EnsureVisible(hwndList, i, FALSE); return -2; case MENU_LAST_PAGE: i = max(0, data->menu.size-1); ListView_SetItemState(hwndList, i, LVIS_FOCUSED, LVIS_FOCUSED); ListView_EnsureVisible(hwndList, i, FALSE); return -2; case MENU_NEXT_PAGE: topIndex = ListView_GetTopIndex( hwndList ); pageSize = ListView_GetCountPerPage( hwndList ); curIndex = ListView_GetNextItem(hwndList, -1, LVNI_FOCUSED); /* Focus down one page */ i = min(curIndex+pageSize, data->menu.size-1); ListView_SetItemState(hwndList, i, LVIS_FOCUSED, LVIS_FOCUSED); /* Scrollpos down one page */ i = min(topIndex+(2*pageSize - 1), data->menu.size-1); ListView_EnsureVisible(hwndList, i, FALSE); return -2; case MENU_PREVIOUS_PAGE: topIndex = ListView_GetTopIndex( hwndList ); pageSize = ListView_GetCountPerPage( hwndList ); curIndex = ListView_GetNextItem(hwndList, -1, LVNI_FOCUSED); /* Focus up one page */ i = max(curIndex-pageSize, 0); ListView_SetItemState(hwndList, i, LVIS_FOCUSED, LVIS_FOCUSED); /* Scrollpos up one page */ i = max(topIndex-pageSize, 0); ListView_EnsureVisible(hwndList, i, FALSE); break; case MENU_SELECT_ALL: if( data->how == PICK_ANY ) { reset_menu_count(hwndList, data); for(i=0; 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]; int selected_item; reset_menu_count(hwndList, data); mswin_getlin("Search for:", buf); if (!*buf || *buf == '\033') return -2; selected_item = -1; for(i=0; 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 ); /* save the first item - we will move focus to it */ if( selected_item == -1 ) selected_item = i; } else if( data->how == PICK_ONE ) { SelectMenuItem( hwndList, data, i, -1 ); selected_item = i; break; } } } if( selected_item>0 ) { ListView_SetItemState(hwndList, selected_item, LVIS_FOCUSED, LVIS_FOCUSED); ListView_EnsureVisible(hwndList, selected_item, FALSE); } } else { mswin_nhbell(); } return -2; case ' ': /* ends menu for PICK_ONE/PICK_NONE select item for PICK_ANY */ if( data->how==PICK_ONE || data->how==PICK_NONE ) { data->done = 1; data->result = 0; return -2; } else if( data->how==PICK_ANY ) { i = ListView_GetNextItem(hwndList, -1, LVNI_FOCUSED); if( i>=0 ) { SelectMenuItem( hwndList, data, i, NHMENU_IS_SELECTED(data->menu.items[i])? 0 : -1 ); } return -2; } break; default: if( strchr(data->menu.gacc, ch) && !(ch=='0' && data->menu.counting) ) { /* matched a group accelerator */ if (data->how == PICK_ANY || data->how == PICK_ONE) { reset_menu_count(hwndList, data); for(i=0; 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, wrt; int extra_cx; GetClientRect(hWnd, &rt); sz->cx = rt.right - rt.left; sz->cy = rt.bottom - rt.top; GetWindowRect(hWnd, &wrt); extra_cx = (wrt.right-wrt.left) - sz->cx; data = (PNHMenuWindow)GetWindowLong(hWnd, GWL_USERDATA); if(data) { control = GetMenuControl(hWnd); hdc = GetDC(control); if( data->type==MENU_TYPE_MENU ) { /* Calculate the width of the list box. */ saveFont = SelectObject(hdc, mswin_get_font(NHW_MENU, ATR_NONE, hdc, FALSE)); GetTextMetrics(hdc, &tm); for(i=0; imenu.size; i++ ) { LONG menuitemwidth = 0; int column; char *p, *p1; p1 = data->menu.items[i].str; p = strchr(data->menu.items[i].str, '\t'); column = 0; for (;;) { TCHAR wbuf[BUFSZ]; RECT tabRect; SetRect ( &tabRect, 0, 0, 1, 1 ); if (p != NULL) *p = '\0'; /* for time being, view tab field as zstring */ DrawText(hdc, NH_A2W(p1, wbuf, BUFSZ), strlen(p1), &tabRect, DT_CALCRECT | DT_LEFT | DT_VCENTER | DT_SINGLELINE ); /* it probably isn't necessary to recompute the tab width now, but do so * just in case, honoring the previously computed value */ menuitemwidth += max(data->menu.tab_stop_size[column], tabRect.right - tabRect.left); if (p != NULL) *p = '\t'; else /* last string so, */ break; /* add the separation only when not the last item */ /* in the last item, we break out of the loop, in the statement just above */ menuitemwidth += TAB_SEPARATION; ++column; p1 = p + 1; p = strchr(p1, '\t'); } sz->cx = max(sz->cx, (LONG)(2*TILE_X + menuitemwidth + tm.tmAveCharWidth*12 + tm.tmOverhang)); } SelectObject(hdc, saveFont); } else { /* do not change size for text output - the text will be formatted to fit any window */ } sz->cx += extra_cx; ReleaseDC(control, hdc); } } void SelectMenuItem(HWND hwndList, PNHMenuWindow data, int item, int count) { int i; if( item<0 || item>=data->menu.size ) return; if( data->how==PICK_ONE && count!=0 ) { for(i=0; 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 = FALSE; switch(message) { /* filter keyboard input for the control */ #if !defined(WIN_CE_SMARTPHONE) case WM_KEYDOWN: case WM_KEYUP: { MSG msg; if( PeekMessage(&msg, hWnd, WM_CHAR, WM_CHAR, PM_REMOVE) ) { if( onListChar(GetParent(hWnd), hWnd, (char)msg.wParam)==-2 ) { return 0; } } if( wParam==VK_LEFT || wParam==VK_RIGHT ) bUpdateFocusItem = TRUE; } break; #else /* defined(WIN_CE_SMARTPHONE) */ case WM_KEYDOWN: if( wParam==VK_TACTION ) { if( onListChar(GetParent(hWnd), hWnd, ' ')==-2 ) { return 0; } } else if( NHSPhoneTranslateKbdMessage(wParam, lParam, TRUE) ) { PMSNHEvent evt; BOOL processed = FALSE; if( mswin_have_input() ) { evt = mswin_input_pop(); if( evt->type==NHEVENT_CHAR && onListChar(GetParent(hWnd), hWnd, evt->kbd.ch)==-2 ) { processed = TRUE; } /* eat the rest of the events */ if( mswin_have_input() ) mswin_input_pop(); } if( processed ) return 0; } if( wParam==VK_LEFT || wParam==VK_RIGHT ) bUpdateFocusItem = TRUE; break; case WM_KEYUP: /* translate SmartPhone keyboard message */ if( NHSPhoneTranslateKbdMessage(wParam, lParam, FALSE) ) return 0; break; /* tell Windows not to process default button on VK_RETURN */ case WM_GETDLGCODE: return DLGC_DEFPUSHBUTTON | DLGC_WANTALLKEYS | (wndProcListViewOrig? CallWindowProc(wndProcListViewOrig, hWnd, message, wParam, lParam) : 0 ); #endif case WM_SIZE: case WM_HSCROLL: bUpdateFocusItem = TRUE; break; } if( bUpdateFocusItem ) { int i; RECT rt; /* invalidate the focus rectangle */ i = ListView_GetNextItem(hWnd, -1, LVNI_FOCUSED); if( i!=-1 ) { ListView_GetItemRect(hWnd, i, &rt, LVIR_BOUNDS); InvalidateRect(hWnd, &rt, TRUE); } } if( wndProcListViewOrig ) return CallWindowProc(wndProcListViewOrig, hWnd, message, wParam, lParam); else return 0; } /* Text control window proc - implements close on space */ LRESULT CALLBACK NHMenuTextWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { case WM_KEYUP: switch( wParam ) { case VK_SPACE: case VK_RETURN: /* close on space */ PostMessage(GetParent(hWnd), WM_COMMAND, MAKELONG(IDOK, 0), 0); return 0; case VK_UP: /* scoll up */ PostMessage(hWnd, WM_VSCROLL, MAKEWPARAM(SB_LINEUP, 0), (LPARAM)NULL); return 0; case VK_DOWN: /* scoll down */ PostMessage(hWnd, WM_VSCROLL, MAKEWPARAM(SB_LINEDOWN, 0), (LPARAM)NULL); return 0; case VK_LEFT: /* scoll left */ PostMessage(hWnd, WM_HSCROLL, MAKEWPARAM(SB_LINELEFT, 0), (LPARAM)NULL); return 0; case VK_RIGHT: /* scoll right */ PostMessage(hWnd, WM_HSCROLL, MAKEWPARAM(SB_LINERIGHT, 0), (LPARAM)NULL); return 0; } break; /* case WM_KEYUP: */ } if( editControlWndProc ) return CallWindowProc(editControlWndProc, hWnd, message, wParam, lParam); else return 0; } /*----------------------------------------------------------------------------*/ char* parse_menu_str(char* dest, const char* src, size_t size) { char *p1, *p2; if( !dest || size==0 ) return NULL; strncpy(dest, src, size); dest[size-1] = '\x0'; /* replace "[ ]*\[" with "\t\[" */ p1 = p2 = strstr(dest, " ["); if( p1 ) { while( p1!=dest && *p1==' ') p1--; p1++; /* backup to space */ *p2 = '\t'; memmove(p1, p2, strlen(p2)); p1[strlen(p2)] = '\x0'; } return dest; } slashem-0.0.7E7F3/sys/wince/mhfont.h0000664000076400007640000000053110545462317015242 0ustar aliali/* Copyright (C) 2001 by Alex Kompel */ /* NetHack may be freely redistributed. See license for details. */ /* font management functions */ #ifndef MSWINFont_h #define MSWINFont_h #include "winMS.h" HGDIOBJ mswin_get_font(int win_type, int attr, HDC hdc, BOOL replace); UINT mswin_charset(); #endif /* MSWINFont_h */ slashem-0.0.7E7F3/sys/wince/mhtext.h0000664000076400007640000000054110545462317015261 0ustar aliali/* Copyright (C) 2001 by Alex Kompel */ /* NetHack may be freely redistributed. See license for details. */ #ifndef MSWINTextWindow_h #define MSWINTextWindow_h #include "winMS.h" #include "config.h" #include "global.h" HWND mswin_init_text_window (); void mswin_display_text_window (HWND hwnd); #endif /* MSWINTextWindow_h */ slashem-0.0.7E7F3/sys/wince/mhmain.c0000664000076400007640000007267010545462317015230 0ustar aliali/* Copyright (C) 2001 by Alex Kompel */ /* NetHack may be freely redistributed. See license for details. */ #include "winMS.h" #include "mhmsg.h" #include "mhinput.h" #include "mhmain.h" #include "mhmenu.h" #include "mhstatus.h" #include "mhmsgwnd.h" #include "mhcmd.h" #include "mhmap.h" #include "patchlevel.h" #define MAX_LOADSTRING 100 typedef struct mswin_nethack_main_window { int mapAcsiiModeSave; } NHMainWindow, *PNHMainWindow; TCHAR szMainWindowClass[] = TEXT("MSNHMainWndClass"); static TCHAR szTitle[MAX_LOADSTRING]; LRESULT CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM); static LRESULT onWMCommand(HWND hWnd, WPARAM wParam, LPARAM lParam); static void onMSNHCommand(HWND hWnd, WPARAM wParam, LPARAM lParam); static void register_main_window_class(); static void select_map_mode(int map_mode); static int menuid2mapmode(int menuid); static int mapmode2menuid(int map_mode); static HMENU _get_main_menu(UINT menu_id); HWND mswin_init_main_window () { static int run_once = 0; HWND ret; RECT rc; /* register window class */ if( !run_once ) { LoadString(GetNHApp()->hApp, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); register_main_window_class( ); run_once = 1; } /* create the main window */ SystemParametersInfo(SPI_GETWORKAREA, 0, &rc, 0); ret = CreateWindow( szMainWindowClass, /* registered class name */ szTitle, /* window name */ WS_CLIPCHILDREN, /* window style */ rc.left, /* horizontal position of window */ rc.top, /* vertical position of window */ rc.right - rc.left, /* window width */ rc.bottom - rc.top, /* window height */ NULL, /* handle to parent or owner window */ NULL, /* menu handle or child identifier */ GetNHApp()->hApp, /* handle to application instance */ NULL /* window-creation data */ ); if( !ret ) panic("Cannot create main window"); return ret; } void register_main_window_class() { WNDCLASS wcex; ZeroMemory(&wcex, sizeof(wcex)); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = (WNDPROC)MainWndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = GetNHApp()->hApp; wcex.hIcon = LoadIcon(GetNHApp()->hApp, (LPCTSTR)IDI_WINHACK); wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = NULL; wcex.lpszClassName = szMainWindowClass; RegisterClass(&wcex); } /* * Keypad keys are translated to the normal values below. * Shifted keypad keys are translated to the * shift values below. */ enum KEY_INDEXES { KEY_NW, KEY_N, KEY_NE, KEY_MINUS, KEY_W, KEY_GOINTERESTING, KEY_E, KEY_PLUS, KEY_SW, KEY_S, KEY_SE, KEY_INV, KEY_WAITLOOK, KEY_LAST}; static const unsigned char /* normal, shift, control */ keypad[KEY_LAST][3] = { {'y', 'Y', C('y')}, /* 7 */ {'k', 'K', C('k')}, /* 8 */ {'u', 'U', C('u')}, /* 9 */ {'m', C('p'), C('p')}, /* - */ {'h', 'H', C('h')}, /* 4 */ {'g', 'G', 'g'}, /* 5 */ {'l', 'L', C('l')}, /* 6 */ {'+', 'P', C('p')}, /* + */ {'b', 'B', C('b')}, /* 1 */ {'j', 'J', C('j')}, /* 2 */ {'n', 'N', C('n')}, /* 3 */ {'i', 'I', C('i')}, /* Ins */ {'.', ':', ':'} /* Del */ }, numpad[KEY_LAST][3] = { {'7', M('7'), '7'}, /* 7 */ {'8', M('8'), '8'}, /* 8 */ {'9', M('9'), '9'}, /* 9 */ {'m', C('p'), C('p')}, /* - */ {'4', M('4'), '4'}, /* 4 */ {'g', 'G', 'g'}, /* 5 */ {'6', M('6'), '6'}, /* 6 */ {'+', 'P', C('p')}, /* + */ {'1', M('1'), '1'}, /* 1 */ {'2', M('2'), '2'}, /* 2 */ {'3', M('3'), '3'}, /* 3 */ {'i', 'I', C('i')}, /* Ins */ {'.', ':', ':'} /* Del */ }; #define STATEON(x) ((GetKeyState(x) & 0xFFFE) != 0) #define KEYTABLE_REGULAR(x) ((iflags.num_pad ? numpad : keypad)[x][0]) #define KEYTABLE_SHIFT(x) ((iflags.num_pad ? numpad : keypad)[x][1]) #define KEYTABLE(x) (STATEON(VK_SHIFT) ? KEYTABLE_SHIFT(x) : KEYTABLE_REGULAR(x)) /* map mode macros */ #define IS_MAP_FIT_TO_SCREEN(mode) ((mode)==MAP_MODE_ASCII_FIT_TO_SCREEN || \ (mode)==MAP_MODE_TILES_FIT_TO_SCREEN ) #define IS_MAP_ASCII(mode) ((mode)!=MAP_MODE_TILES && (mode)!=MAP_MODE_TILES_FIT_TO_SCREEN) /* // FUNCTION: WndProc(HWND, unsigned, WORD, LONG) // // PURPOSE: Processes messages for the main window. */ LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { PNHMainWindow data; switch (message) { /*-----------------------------------------------------------------------*/ case WM_CREATE: { #if defined(WIN_CE_POCKETPC) || defined(WIN_CE_SMARTPHONE) SHMENUBARINFO menubar; #endif /* set window data */ data = (PNHMainWindow)malloc(sizeof(NHMainWindow)); if( !data ) panic("out of memory"); ZeroMemory(data, sizeof(NHMainWindow)); data->mapAcsiiModeSave = MAP_MODE_ASCII12x16; SetWindowLong(hWnd, GWL_USERDATA, (LONG)data); GetNHApp()->hMainWnd = hWnd; /* create menu bar */ #if defined(WIN_CE_POCKETPC) || defined(WIN_CE_SMARTPHONE) ZeroMemory(&menubar, sizeof(menubar)); menubar.cbSize = sizeof(menubar); menubar.hwndParent = hWnd; menubar.dwFlags = 0; menubar.nToolBarId = IDC_WINHACK; menubar.hInstRes = GetNHApp()->hApp; # if defined(WIN_CE_POCKETPC) menubar.nBmpId = IDB_MENUBAR; menubar.cBmpImages = 2; # else menubar.nBmpId = 0; menubar.cBmpImages = 0; # endif if( !SHCreateMenuBar(&menubar) ) panic("cannot create menu"); GetNHApp()->hMenuBar = menubar.hwndMB; #else GetNHApp()->hMenuBar = CommandBar_Create(GetNHApp()->hApp, hWnd, 1); if( !GetNHApp()->hMenuBar ) panic("cannot create menu"); CommandBar_InsertMenubar( GetNHApp()->hMenuBar, GetNHApp()->hApp, IDC_WINHACK, 0 ); #endif CheckMenuItem( _get_main_menu(ID_VIEW), IDM_VIEW_KEYPAD, MF_BYCOMMAND | (GetNHApp()->bCmdPad? MF_CHECKED : MF_UNCHECKED) ); /* create command pad (keyboard emulator) */ GetNHApp()->hCmdWnd = mswin_init_command_window(); } break; /*-----------------------------------------------------------------------*/ case WM_MSNH_COMMAND: onMSNHCommand(hWnd, wParam, lParam); break; /*-----------------------------------------------------------------------*/ case WM_KEYDOWN: data = (PNHMainWindow)GetWindowLong(hWnd, GWL_USERDATA); /* translate arrow keys into nethack commands */ switch (wParam) { case VK_LEFT: if( STATEON(VK_CONTROL) ) { /* scroll map window one line left */ SendMessage( mswin_hwnd_from_winid(WIN_MAP), WM_HSCROLL, MAKEWPARAM(SB_LINEUP, 0), (LPARAM)NULL ); } else { NHEVENT_KBD(KEYTABLE(KEY_W)); } return 0; case VK_RIGHT: if( STATEON(VK_CONTROL) ) { /* scroll map window one line right */ SendMessage( mswin_hwnd_from_winid(WIN_MAP), WM_HSCROLL, MAKEWPARAM(SB_LINEDOWN, 0), (LPARAM)NULL ); } else { NHEVENT_KBD(KEYTABLE(KEY_E)); } return 0; case VK_UP: if( STATEON(VK_CONTROL) ) { /* scroll map window one line up */ SendMessage( mswin_hwnd_from_winid(WIN_MAP), WM_VSCROLL, MAKEWPARAM(SB_LINEUP, 0), (LPARAM)NULL ); } else { NHEVENT_KBD(KEYTABLE(KEY_N)); } return 0; case VK_DOWN: if( STATEON(VK_CONTROL) ) { /* scroll map window one line down */ SendMessage( mswin_hwnd_from_winid(WIN_MAP), WM_VSCROLL, MAKEWPARAM(SB_LINEDOWN, 0), (LPARAM)NULL ); } else { NHEVENT_KBD(KEYTABLE(KEY_S)); } return 0; case VK_HOME: if( STATEON(VK_CONTROL) ) { /* scroll map window to upper left corner */ SendMessage( mswin_hwnd_from_winid(WIN_MAP), WM_VSCROLL, MAKEWPARAM(SB_THUMBTRACK, 0), (LPARAM)NULL ); SendMessage( mswin_hwnd_from_winid(WIN_MAP), WM_HSCROLL, MAKEWPARAM(SB_THUMBTRACK, 0), (LPARAM)NULL ); } else { NHEVENT_KBD(KEYTABLE(KEY_NW)); } return 0; case VK_END: if( STATEON(VK_CONTROL) ) { /* scroll map window to lower right corner */ SendMessage( mswin_hwnd_from_winid(WIN_MAP), WM_VSCROLL, MAKEWPARAM(SB_THUMBTRACK, ROWNO), (LPARAM)NULL ); SendMessage( mswin_hwnd_from_winid(WIN_MAP), WM_HSCROLL, MAKEWPARAM(SB_THUMBTRACK, COLNO), (LPARAM)NULL ); } else { NHEVENT_KBD(KEYTABLE(KEY_SW)); } return 0; case VK_PRIOR: if( STATEON(VK_CONTROL) ) { /* scroll map window one page up */ SendMessage( mswin_hwnd_from_winid(WIN_MAP), WM_VSCROLL, MAKEWPARAM(SB_PAGEUP, 0), (LPARAM)NULL ); } else { NHEVENT_KBD(KEYTABLE(KEY_NE)); } return 0; case VK_NEXT: if( STATEON(VK_CONTROL) ) { /* scroll map window one page down */ SendMessage( mswin_hwnd_from_winid(WIN_MAP), WM_VSCROLL, MAKEWPARAM(SB_PAGEDOWN, 0), (LPARAM)NULL ); } else { NHEVENT_KBD(KEYTABLE(KEY_SE)); } return 0; case VK_DECIMAL: case VK_DELETE: NHEVENT_KBD(KEYTABLE(KEY_WAITLOOK)); return 0; case VK_INSERT: NHEVENT_KBD(KEYTABLE(KEY_INV)); return 0; case VK_SUBTRACT: NHEVENT_KBD(KEYTABLE(KEY_MINUS)); return 0; case VK_ADD: NHEVENT_KBD(KEYTABLE(KEY_PLUS)); return 0; case VK_CLEAR: /* This is the '5' key */ NHEVENT_KBD(KEYTABLE(KEY_GOINTERESTING)); return 0; case VK_F4: if( IS_MAP_FIT_TO_SCREEN(iflags.wc_map_mode) ) { mswin_select_map_mode( IS_MAP_ASCII(iflags.wc_map_mode)? data->mapAcsiiModeSave : MAP_MODE_TILES ); } else { mswin_select_map_mode( IS_MAP_ASCII(iflags.wc_map_mode)? MAP_MODE_ASCII_FIT_TO_SCREEN : MAP_MODE_TILES_FIT_TO_SCREEN ); } return 0; case VK_F5: if( IS_MAP_ASCII(iflags.wc_map_mode) ) { if( IS_MAP_FIT_TO_SCREEN(iflags.wc_map_mode) ) { mswin_select_map_mode(MAP_MODE_TILES_FIT_TO_SCREEN); } else { mswin_select_map_mode(MAP_MODE_TILES); } } else { if( IS_MAP_FIT_TO_SCREEN(iflags.wc_map_mode) ) { mswin_select_map_mode(MAP_MODE_ASCII_FIT_TO_SCREEN); } else { mswin_select_map_mode(data->mapAcsiiModeSave); } } return 0; case VK_RETURN: NHEVENT_MS( CLICK_1, u.ux, u.uy); return 0; } #if defined(WIN_CE_SMARTPHONE) if( NHSPhoneTranslateKbdMessage(wParam, lParam, TRUE) ) return 0; #endif return 1; /* end of WM_KEYDOWN */ /*-----------------------------------------------------------------------*/ #if defined(WIN_CE_SMARTPHONE) case WM_KEYUP: if( NHSPhoneTranslateKbdMessage(wParam, lParam, FALSE) ) return 0; return 1; /* end of WM_KEYUP */ #endif /*-----------------------------------------------------------------------*/ #if !defined(WIN_CE_SMARTPHONE) case WM_CHAR: if( wParam=='\n' || wParam=='\r' || wParam==C('M') ) return 0; /* we already processed VK_RETURN */ /* all characters go to nethack except Ctrl-P that scrolls message window up */ if( wParam==C('P') || wParam==C('p') ) { SendMessage(mswin_hwnd_from_winid(WIN_MESSAGE), WM_VSCROLL, MAKEWPARAM(SB_LINEUP, 0), (LPARAM)NULL); } else { NHEVENT_KBD( (lParam & 1<<29)? M(tolower(wParam)) : wParam ); } return 0; #endif /*-----------------------------------------------------------------------*/ case WM_COMMAND: /* process commands - menu commands mostly */ if( IsWindow(GetNHApp()->hPopupWnd) ) { return SendMessage(GetNHApp()->hPopupWnd, message, wParam, lParam); } else if( onWMCommand(hWnd, wParam, lParam) ) return DefWindowProc(hWnd, message, wParam, lParam); else return 0; /*-----------------------------------------------------------------------*/ case WM_ACTIVATE: if( LOWORD(wParam)!=WA_INACTIVE ) { #if defined(WIN_CE_POCKETPC) || defined(WIN_CE_SMARTPHONE) if( GetNHApp()->bFullScreen ) SHFullScreen(GetNHApp()->hMainWnd, SHFS_HIDETASKBAR | SHFS_HIDESTARTICON); else SHFullScreen(GetNHApp()->hMainWnd, SHFS_SHOWTASKBAR | SHFS_SHOWSTARTICON); #endif mswin_layout_main_window(NULL); } break; case WM_SETTINGCHANGE: #if defined(WIN_CE_POCKETPC) || defined(WIN_CE_SMARTPHONE) if( GetNHApp()->bFullScreen ) SHFullScreen(GetNHApp()->hMainWnd, SHFS_HIDETASKBAR | SHFS_HIDESTARTICON); else SHFullScreen(GetNHApp()->hMainWnd, SHFS_SHOWTASKBAR | SHFS_SHOWSTARTICON); #endif mswin_layout_main_window(NULL); break; case WM_SIZE: mswin_layout_main_window(NULL); break; /*-----------------------------------------------------------------------*/ case WM_SETFOCUS: /* if there is a menu window out there - transfer input focus to it */ if( IsWindow( GetNHApp()->hPopupWnd ) ) { SetFocus( GetNHApp()->hPopupWnd ); } break; /*-----------------------------------------------------------------------*/ case WM_CLOSE: { /* exit gracefully */ dosave0(); } 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); terminate(EXIT_SUCCESS); } break; /*-----------------------------------------------------------------------*/ default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } void onMSNHCommand(HWND hWnd, WPARAM wParam, LPARAM lParam) { switch(wParam) { /* new window was just added */ case MSNH_MSG_ADDWND: { PMSNHMsgAddWnd msg_param = (PMSNHMsgAddWnd)lParam; HWND child = GetNHApp()->windowlist[msg_param->wid].win; if( GetNHApp()->windowlist[msg_param->wid].type == NHW_MAP ) mswin_select_map_mode(iflags.wc_map_mode); if( child ) mswin_layout_main_window(child); } break; } } /* adjust windows to fit main window layout --------------------------- | Status | +-------------------------+ | | | | | MAP | | | | | +-------------------------+ | Command pad | +-------------------------+ | Messages | --------------------------- */ void mswin_layout_main_window(HWND changed_child) { winid i; RECT client_rt, wnd_rect; POINT status_org; SIZE status_size; POINT msg_org; SIZE msg_size; POINT map_org; SIZE map_size; POINT cmd_org; SIZE cmd_size; HWND wnd_status, wnd_msg; PNHMainWindow data; #if defined(WIN_CE_POCKETPC) SIPINFO sip; RECT menu_bar; RECT visible_rt; POINT pt; #endif GetClientRect(GetNHApp()->hMainWnd, &client_rt); #if defined(WIN_CE_POCKETPC) ZeroMemory(&sip, sizeof(sip)); sip.cbSize = sizeof(sip); SHSipInfo(SPI_GETSIPINFO, 0, &sip, 0); if( GetNHApp()->bFullScreen ) sip.rcVisibleDesktop.top = 0; /* adjust client rectangle size */ GetWindowRect(GetNHApp()->hMenuBar, &menu_bar); client_rt.bottom -= menu_bar.bottom-menu_bar.top; /* calcuate visible rect in client coordinates */ pt.x = sip.rcVisibleDesktop.left; pt.y = sip.rcVisibleDesktop.top; ScreenToClient(GetNHApp()->hMainWnd, &pt); SetRect(&wnd_rect, pt.x, pt.y, pt.x+sip.rcVisibleDesktop.right-sip.rcVisibleDesktop.left, pt.y+sip.rcVisibleDesktop.bottom-sip.rcVisibleDesktop.top ); IntersectRect(&visible_rt, &client_rt, &wnd_rect); #else # if !defined(WIN_CE_SMARTPHONE) client_rt.top += CommandBar_Height(GetNHApp()->hMenuBar); # else /* Smartphone only */ if( GetNHApp()->bFullScreen ) { RECT menu_bar; GetWindowRect(GetNHApp()->hMenuBar, &menu_bar); client_rt.bottom -= menu_bar.bottom-menu_bar.top; } # endif #endif /* get window data */ data = (PNHMainWindow)GetWindowLong(GetNHApp()->hMainWnd, GWL_USERDATA); /* get sizes of child windows */ wnd_status = mswin_hwnd_from_winid(WIN_STATUS); if( IsWindow(wnd_status) ) { mswin_status_window_size(wnd_status, &status_size); } else { status_size.cx = status_size.cy = 0; } wnd_msg = mswin_hwnd_from_winid(WIN_MESSAGE); if( IsWindow(wnd_msg) ) { mswin_message_window_size(wnd_msg, &msg_size); } else { msg_size.cx = msg_size.cy = 0; } cmd_size.cx = cmd_size.cy = 0; if( GetNHApp()->bCmdPad && IsWindow(GetNHApp()->hCmdWnd) ) { mswin_command_window_size(GetNHApp()->hCmdWnd, &cmd_size); } /* set window positions */ /* calculate the application windows size */ #if defined(WIN_CE_POCKETPC) SetRect(&wnd_rect, visible_rt.left, visible_rt.top, visible_rt.right, visible_rt.bottom); if( sip.fdwFlags & SIPF_ON ) cmd_size.cx = cmd_size.cy = 0; /* hide keypad window */ #else SetRect(&wnd_rect, client_rt.left, client_rt.top, client_rt.right, client_rt.bottom); #endif #if !defined(WIN_CE_SMARTPHONE) /* other ports have it at the bottom of the screen */ cmd_size.cx = (wnd_rect.right-wnd_rect.left); cmd_org.x = wnd_rect.left; cmd_org.y = wnd_rect.bottom - cmd_size.cy; wnd_rect.bottom -= cmd_size.cy; #endif /* status window */ switch(iflags.wc_align_status) { case ALIGN_LEFT: status_size.cx = (wnd_rect.right-wnd_rect.left)/4; status_size.cy = (wnd_rect.bottom-wnd_rect.top); // that won't look good status_org.x = wnd_rect.left; status_org.y = wnd_rect.top; wnd_rect.left += status_size.cx; break; case ALIGN_RIGHT: status_size.cx = (wnd_rect.right-wnd_rect.left)/4; status_size.cy = (wnd_rect.bottom-wnd_rect.top); // that won't look good status_org.x = wnd_rect.right - status_size.cx; status_org.y = wnd_rect.top; wnd_rect.right -= status_size.cx; break; case ALIGN_TOP: status_size.cx = (wnd_rect.right-wnd_rect.left); status_org.x = wnd_rect.left; status_org.y = wnd_rect.top; wnd_rect.top += status_size.cy; break; case ALIGN_BOTTOM: default: status_size.cx = (wnd_rect.right-wnd_rect.left); status_org.x = wnd_rect.left; status_org.y = wnd_rect.bottom - status_size.cy; wnd_rect.bottom -= status_size.cy; break; } /* message window */ switch(iflags.wc_align_message) { case ALIGN_LEFT: #if defined(WIN_CE_SMARTPHONE) /* smartphone has a keypad window on the right (bottom) side of the message window */ msg_size.cx = cmd_size.cx = max(msg_size.cx, cmd_size.cx); msg_size.cy = (wnd_rect.bottom-wnd_rect.top) - cmd_size.cy; msg_org.x = cmd_org.x = wnd_rect.left; msg_org.y = wnd_rect.top; cmd_org.y = msg_org.y + msg_size.cy; #else msg_size.cx = (wnd_rect.right-wnd_rect.left)/4; msg_size.cy = (wnd_rect.bottom-wnd_rect.top); msg_org.x = wnd_rect.left; msg_org.y = wnd_rect.top; #endif wnd_rect.left += msg_size.cx; break; case ALIGN_RIGHT: #if defined(WIN_CE_SMARTPHONE) /* smartphone has a keypad window on the right (bottom) side of the message window */ msg_size.cx = cmd_size.cx = max(msg_size.cx, cmd_size.cx); msg_size.cy = (wnd_rect.bottom-wnd_rect.top) - cmd_size.cy; msg_org.x = cmd_org.x = wnd_rect.right - msg_size.cx; msg_org.y = wnd_rect.top; cmd_org.y = msg_org.y + msg_size.cy; #else msg_size.cx = (wnd_rect.right-wnd_rect.left)/4; msg_size.cy = (wnd_rect.bottom-wnd_rect.top); msg_org.x = wnd_rect.right - msg_size.cx; msg_org.y = wnd_rect.top; #endif wnd_rect.right -= msg_size.cx; break; case ALIGN_TOP: #if defined(WIN_CE_SMARTPHONE) /* smartphone has a keypad window on the right side of the message window */ msg_size.cy = cmd_size.cy = max(msg_size.cy, cmd_size.cy); msg_size.cx = (wnd_rect.right - wnd_rect.left) - cmd_size.cx; msg_org.x = wnd_rect.left; cmd_org.x = msg_org.x + msg_size.cx; msg_org.y = cmd_org.y = wnd_rect.bottom - msg_size.cy; #else msg_size.cx = (wnd_rect.right-wnd_rect.left); msg_org.x = wnd_rect.left; msg_org.y = wnd_rect.top; #endif wnd_rect.top += msg_size.cy; break; case ALIGN_BOTTOM: default: #if defined(WIN_CE_SMARTPHONE) /* smartphone has a keypad window on the right side of the message window */ msg_size.cy = cmd_size.cy = max(msg_size.cy, cmd_size.cy); msg_size.cx = (wnd_rect.right - wnd_rect.left) - cmd_size.cx; msg_org.x = wnd_rect.left; cmd_org.x = msg_org.x + msg_size.cx; msg_org.y = cmd_org.y = wnd_rect.bottom - msg_size.cy; #else msg_size.cx = (wnd_rect.right-wnd_rect.left); msg_org.x = wnd_rect.left; msg_org.y = wnd_rect.bottom - msg_size.cy; #endif wnd_rect.bottom -= msg_size.cy; break; } map_org.x = wnd_rect.left; map_org.y = wnd_rect.top; map_size.cx = wnd_rect.right - wnd_rect.left; map_size.cy = wnd_rect.bottom - wnd_rect.top; /* go through the windows list and adjust sizes */ for( i=0; iwindowlist[i].win && !GetNHApp()->windowlist[i].dead) { switch( GetNHApp()->windowlist[i].type ) { case NHW_MESSAGE: MoveWindow(GetNHApp()->windowlist[i].win, msg_org.x, msg_org.y, msg_size.cx, msg_size.cy, TRUE ); break; case NHW_MAP: MoveWindow(GetNHApp()->windowlist[i].win, map_org.x, map_org.y, map_size.cx, map_size.cy, TRUE ); break; case NHW_STATUS: MoveWindow(GetNHApp()->windowlist[i].win, status_org.x, status_org.y, status_size.cx, status_size.cy, TRUE ); break; case NHW_TEXT: case NHW_MENU: case NHW_RIP: { POINT menu_org; SIZE menu_size; menu_org.x = client_rt.left; menu_org.y = client_rt.top; #if defined(WIN_CE_POCKETPC) menu_size.cx = min(sip.rcVisibleDesktop.right-sip.rcVisibleDesktop.left, client_rt.right - client_rt.left); menu_size.cy = min(sip.rcVisibleDesktop.bottom-sip.rcVisibleDesktop.top, client_rt.bottom - client_rt.top); #else menu_size.cx = client_rt.right - client_rt.left; menu_size.cy = client_rt.bottom - client_rt.top; #endif #if defined(WIN_CE_SMARTPHONE) /* leave room for the command window */ if( GetNHApp()->windowlist[i].type == NHW_MENU ) { menu_size.cy -= cmd_size.cy; } /* dialogs are popup windows unde SmartPhone so we need to convert to screen coordinates */ ClientToScreen(GetNHApp()->hMainWnd, &menu_org); #endif MoveWindow(GetNHApp()->windowlist[i].win, menu_org.x, menu_org.y, menu_size.cx, menu_size.cy, TRUE ); } break; } ShowWindow(GetNHApp()->windowlist[i].win, SW_SHOW); InvalidateRect(GetNHApp()->windowlist[i].win, NULL, TRUE); } } if( IsWindow(GetNHApp()->hCmdWnd) ) { /* show command window only if it exists and the game is ready (plname is set) */ if( GetNHApp()->bCmdPad && cmd_size.cx>0 && cmd_size.cy>0 && *plname) { MoveWindow(GetNHApp()->hCmdWnd, cmd_org.x, cmd_org.y, cmd_size.cx, cmd_size.cy, TRUE ); ShowWindow(GetNHApp()->hCmdWnd, SW_SHOW); } else { ShowWindow(GetNHApp()->hCmdWnd, SW_HIDE); } } } LRESULT onWMCommand(HWND hWnd, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; PNHMainWindow data; data = (PNHMainWindow)GetWindowLong(hWnd, GWL_USERDATA); wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); // process the menu selections: switch (wmId) { case IDM_ABOUT: DialogBox(GetNHApp()->hApp, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About); break; case IDM_EXIT: done2(); break; case IDM_SAVE: dosave(); break; case IDM_MAP_TILES: case IDM_MAP_ASCII4X6: case IDM_MAP_ASCII6X8: case IDM_MAP_ASCII8X8: case IDM_MAP_ASCII16X8: case IDM_MAP_ASCII7X12: case IDM_MAP_ASCII8X12: case IDM_MAP_ASCII12X16: case IDM_MAP_ASCII16X12: case IDM_MAP_ASCII10X18: mswin_select_map_mode(menuid2mapmode(wmId)); break; case IDM_MAP_FIT_TO_SCREEN: if( IS_MAP_FIT_TO_SCREEN(iflags.wc_map_mode) ) { mswin_select_map_mode( IS_MAP_ASCII(iflags.wc_map_mode)? data->mapAcsiiModeSave : MAP_MODE_TILES ); } else { mswin_select_map_mode( IS_MAP_ASCII(iflags.wc_map_mode)? MAP_MODE_ASCII_FIT_TO_SCREEN : MAP_MODE_TILES_FIT_TO_SCREEN ); } break; case IDM_VIEW_KEYPAD: GetNHApp()->bCmdPad = !GetNHApp()->bCmdPad; CheckMenuItem( _get_main_menu(ID_VIEW), IDM_VIEW_KEYPAD, MF_BYCOMMAND | (GetNHApp()->bCmdPad? MF_CHECKED : MF_UNCHECKED) ); mswin_layout_main_window(GetNHApp()->hCmdWnd); break; case IDM_VIEW_OPTIONS: doset(); break; case IDM_HELP_LONG: display_file(NH_HELP, TRUE); break; case IDM_HELP_COMMANDS: display_file(NH_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(NH_OPTIONFILE, TRUE); break; case IDM_HELP_EXTCMD: (void) doextlist(); break; case IDM_HELP_LICENSE: display_file(NH_LICENSE, TRUE); break; case IDM_HELP_MENU: dohelp(); break; default: return 1; } return 0; } // Mesage handler for about box. LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { char buf[BUFSZ]; TCHAR wbuf[NHSTR_BUFSIZE]; RECT main_rt, dlg_rt; SIZE dlg_sz; switch (message) { case WM_INITDIALOG: getversionstring(buf); SetDlgItemText(hDlg, IDC_ABOUT_VERSION, NH_A2W(buf, wbuf, NHSTR_BUFSIZE)); SetDlgItemText(hDlg, IDC_ABOUT_COPYRIGHT, NH_A2W( COPYRIGHT_BANNER_A "\n" COPYRIGHT_BANNER_B "\n" COPYRIGHT_BANNER_C, wbuf, NHSTR_BUFSIZE ) ); /* center dialog in the main window */ GetWindowRect(GetNHApp()->hMainWnd, &main_rt); GetWindowRect(hDlg, &dlg_rt); dlg_sz.cx = dlg_rt.right - dlg_rt.left; dlg_sz.cy = dlg_rt.bottom - dlg_rt.top; dlg_rt.left = (main_rt.left+main_rt.right-dlg_sz.cx)/2; dlg_rt.right = dlg_rt.left + dlg_sz.cx; dlg_rt.top = (main_rt.top+main_rt.bottom-dlg_sz.cy)/2; dlg_rt.bottom = dlg_rt.top + dlg_sz.cy; MoveWindow( hDlg, (main_rt.left+main_rt.right-dlg_sz.cx)/2, (main_rt.top+main_rt.bottom-dlg_sz.cy)/2, dlg_sz.cx, dlg_sz.cy, TRUE ); return TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { EndDialog(hDlg, LOWORD(wParam)); return TRUE; } break; } return FALSE; } /* Set map display mode */ void mswin_select_map_mode(int mode) { HMENU hmenuMap; PNHMainWindow data; winid map_id; map_id = WIN_MAP; data = (PNHMainWindow)GetWindowLong(GetNHApp()->hMainWnd, GWL_USERDATA); #if defined(WIN_CE_SMARTPHONE) /* Smartphone manu has only 2 items */ hmenuMap = _get_main_menu(ID_VIEW); #else hmenuMap = _get_main_menu(ID_MAP); #endif /* override for Rogue level */ #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( hmenuMap, IDM_MAP_TILES, IDM_MAP_FIT_TO_SCREEN, mapmode2menuid( IS_MAP_FIT_TO_SCREEN(mode)? data->mapAcsiiModeSave : mode ), MF_BYCOMMAND); } else { CheckMenuRadioItem( hmenuMap, IDM_MAP_TILES, IDM_MAP_FIT_TO_SCREEN, mapmode2menuid( MAP_MODE_TILES ), MF_BYCOMMAND); } #if defined(WIN_CE_SMARTPHONE) /* update "Fit To Screen" item text */ { TCHAR wbuf[BUFSZ]; TBBUTTONINFO tbbi; ZeroMemory( wbuf, sizeof(wbuf) ); if( !LoadString( GetNHApp()->hApp, (IS_MAP_FIT_TO_SCREEN(mode)? IDS_CAP_NORMALMAP : IDS_CAP_ENTIREMAP), wbuf, BUFSZ) ) { panic("cannot load main menu strings"); } ZeroMemory( &tbbi, sizeof(tbbi) ); tbbi.cbSize = sizeof(tbbi); tbbi.dwMask = TBIF_TEXT; tbbi.pszText = wbuf; if( !SendMessage( GetNHApp()->hMenuBar, TB_SETBUTTONINFO, IDM_MAP_FIT_TO_SCREEN, (LPARAM)&tbbi) ) { error( "Cannot update IDM_MAP_FIT_TO_SCREEN menu item." ); } } #else /* set fit-to-screen mode mark */ CheckMenuItem( hmenuMap, IDM_MAP_FIT_TO_SCREEN, MF_BYCOMMAND | (IS_MAP_FIT_TO_SCREEN(mode)? MF_CHECKED : MF_UNCHECKED) ); #endif if( IS_MAP_ASCII(iflags.wc_map_mode) && !IS_MAP_FIT_TO_SCREEN(iflags.wc_map_mode)) { data->mapAcsiiModeSave = iflags.wc_map_mode; } iflags.wc_map_mode = mode; /* ** first, check if WIN_MAP has been inialized. ** If not - attempt to retrieve it by type, then check it again */ if( 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; } HMENU _get_main_menu(UINT menu_id) { HMENU hmenuMap; #if defined(WIN_CE_POCKETPC) || defined(WIN_CE_SMARTPHONE) TBBUTTONINFO tbbi; #endif #if defined(WIN_CE_POCKETPC) || defined(WIN_CE_SMARTPHONE) tbbi.cbSize = sizeof(tbbi); tbbi.dwMask = TBIF_LPARAM; SendMessage( GetNHApp()->hMenuBar, TB_GETBUTTONINFO, menu_id, (LPARAM)&tbbi); hmenuMap = (HMENU)tbbi.lParam; #else hmenuMap = CommandBar_GetMenu(GetNHApp()->hMenuBar, 0); #endif return hmenuMap; } slashem-0.0.7E7F3/sys/wince/mhinput.c0000664000076400007640000000343410545462317015433 0ustar aliali/* Copyright (C) 2001 by Alex Kompel */ /* NetHack may be freely redistributed. See license for details. */ #include #include "winMS.h" #include "mhinput.h" /* nethack input queue functions */ #define NH_INPUT_BUFFER_SIZE 64 /* as it stands right now we need only one slot since events are processed almost the same time as they occur but I like large round numbers */ static MSNHEvent nhi_input_buffer[NH_INPUT_BUFFER_SIZE]; static int nhi_init_input = 0; static int nhi_read_pos = 0; static int nhi_write_pos = 0; /* initialize input queue */ void mswin_nh_input_init() { if( !nhi_init_input ) { nhi_init_input = 1; ZeroMemory( nhi_input_buffer, sizeof(nhi_input_buffer) ); nhi_read_pos = 0; nhi_write_pos = 0; } } /* check for input */ int mswin_have_input() { return (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; } slashem-0.0.7E7F3/sys/wince/mhmsgwnd.c0000664000076400007640000003632110545462317015574 0ustar aliali/* Copyright (C) 2001 by Alex Kompel */ /* NetHack may be freely redistributed. See license for details. */ #include "winMS.h" #include "mhmsgwnd.h" #include "mhmsg.h" #include "mhcmd.h" #include "mhfont.h" #include "mhcolor.h" #define MSG_WRAP_TEXT #define MSG_VISIBLE_LINES max(iflags.wc_vary_msgcount, 2) #define MAX_MSG_LINES 32 #define MSG_LINES (int)min(iflags.msg_history, MAX_MSG_LINES) #define MAXWINDOWTEXT 200 struct window_line { int attr; char text[MAXWINDOWTEXT]; }; typedef struct mswin_nethack_message_window { size_t max_text; struct window_line window_text[MAX_MSG_LINES]; int xChar; /* horizontal scrolling unit */ int yChar; /* vertical scrolling unit */ int xUpper; /* average width of uppercase letters */ int xPos; /* current horizontal scrolling position */ int yPos; /* current vertical scrolling position */ int xMax; /* maximum horizontal scrolling position */ int yMax; /* maximum vertical scrolling position */ int xPage; /* page size of horizontal scroll bar */ int lines_last_turn; /* lines added during the last turn */ int dont_care; /* flag the the user does not care if messages are lost */ } NHMessageWindow, *PNHMessageWindow; static TCHAR szMessageWindowClass[] = TEXT("MSNHMessageWndClass"); LRESULT CALLBACK NHMessageWndProc(HWND, UINT, WPARAM, LPARAM); static void register_message_window_class(); static void onMSNHCommand(HWND hWnd, WPARAM wParam, LPARAM lParam); static void onMSNH_VScroll(HWND hWnd, WPARAM wParam, LPARAM lParam); #ifndef MSG_WRAP_TEXT static void onMSNH_HScroll(HWND hWnd, WPARAM wParam, LPARAM lParam); #endif static void onPaint(HWND hWnd); static void onCreate(HWND hWnd, WPARAM wParam, LPARAM lParam); #ifdef USER_SOUNDS extern void play_sound_for_message(const char* str); #endif HWND mswin_init_message_window () { static int run_once = 0; HWND ret; DWORD style; if( !run_once ) { register_message_window_class( ); run_once = 1; } #ifdef MSG_WRAP_TEXT style = WS_BORDER | WS_CHILD | WS_CLIPSIBLINGS | WS_VSCROLL; #else style = WS_BORDER | WS_CHILD | WS_CLIPSIBLINGS | WS_VSCROLL | WS_HSCROLL; #endif ret = CreateWindow( szMessageWindowClass, /* registered class name */ NULL, /* window name */ style, /* window style */ 0, /* horizontal position of window */ 0, /* vertical position of window */ 0, /* window width */ 0, /* window height - set it later */ GetNHApp()->hMainWnd, /* handle to parent or owner window */ NULL, /* menu handle or child identifier */ GetNHApp()->hApp, /* handle to application instance */ NULL ); /* window-creation data */ if( !ret ) panic("Cannot create message window"); return ret; } void register_message_window_class() { WNDCLASS wcex; ZeroMemory( &wcex, sizeof(wcex)); wcex.style = CS_NOCLOSE; wcex.lpfnWndProc = (WNDPROC)NHMessageWndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = GetNHApp()->hApp; wcex.hIcon = NULL; wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = mswin_get_brush(NHW_MESSAGE, MSWIN_COLOR_BG); wcex.lpszMenuName = NULL; wcex.lpszClassName = szMessageWindowClass; RegisterClass(&wcex); } LRESULT CALLBACK NHMessageWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_CREATE: onCreate( hWnd, wParam, lParam ); break; case WM_MSNH_COMMAND: onMSNHCommand(hWnd, wParam, lParam); break; case WM_PAINT: onPaint(hWnd); break; case WM_SETFOCUS: SetFocus(GetNHApp()->hMainWnd); break; #ifndef MSG_WRAP_TEXT case WM_HSCROLL: onMSNH_HScroll(hWnd, wParam, lParam); break; #endif case WM_VSCROLL: onMSNH_VScroll(hWnd, wParam, lParam); break; case WM_DESTROY: { PNHMessageWindow data; data = (PNHMessageWindow)GetWindowLong(hWnd, GWL_USERDATA); free(data); SetWindowLong(hWnd, GWL_USERDATA, (LONG)0); } break; case WM_SIZE: { SCROLLINFO si; int xNewSize; int yNewSize; PNHMessageWindow data; data = (PNHMessageWindow)GetWindowLong(hWnd, GWL_USERDATA); xNewSize = LOWORD(lParam); yNewSize = HIWORD(lParam); if( xNewSize>0 || yNewSize>0 ) { #ifndef MSG_WRAP_TEXT data->xPage = xNewSize/data->xChar; data->xMax = max(0, (int)(1 + data->max_text - data->xPage)); data->xPos = min(data->xPos, data->xMax); ZeroMemory(&si, sizeof(si)); si.cbSize = sizeof(si); si.fMask = SIF_RANGE | SIF_PAGE | SIF_POS; si.nMin = 0; si.nMax = data->max_text; si.nPage = data->xPage; si.nPos = data->xPos; SetScrollInfo(hWnd, SB_HORZ, &si, TRUE); #endif data->yMax = MSG_LINES-1; data->yPos = min(data->yPos, data->yMax); ZeroMemory(&si, sizeof(si)); si.cbSize = sizeof(si); si.fMask = SIF_RANGE | SIF_PAGE | SIF_POS; si.nMin = MSG_VISIBLE_LINES; si.nMax = data->yMax + MSG_VISIBLE_LINES - 1; si.nPage = MSG_VISIBLE_LINES; si.nPos = data->yPos; SetScrollInfo(hWnd, SB_VERT, &si, TRUE); } } break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } void onMSNHCommand(HWND hWnd, WPARAM wParam, LPARAM lParam) { PNHMessageWindow data; data = (PNHMessageWindow)GetWindowLong(hWnd, GWL_USERDATA); switch( wParam ) { case MSNH_MSG_PUTSTR: { PMSNHMsgPutstr msg_data = (PMSNHMsgPutstr)lParam; SCROLLINFO si; char* p; if( msg_data->append ) { strncat(data->window_text[MSG_LINES-1].text, msg_data->text, MAXWINDOWTEXT - strlen(data->window_text[MSG_LINES-1].text)); } else { /* check if the string is empty */ for(p = data->window_text[MSG_LINES-1].text; *p && isspace(*p); p++); if( *p ) { /* last string is not empty - scroll up */ memmove(&data->window_text[0], &data->window_text[1], (MSG_LINES-1)*sizeof(data->window_text[0])); } /* append new text to the end of the array */ data->window_text[MSG_LINES-1].attr = msg_data->attr; strncpy(data->window_text[MSG_LINES-1].text, msg_data->text, MAXWINDOWTEXT); } /* reset V-scroll position to display new text */ data->yPos = data->yMax; ZeroMemory(&si, sizeof(si)); si.cbSize = sizeof(si); si.fMask = SIF_POS; si.nPos = data->yPos; SetScrollInfo(hWnd, SB_VERT, &si, TRUE); /* deal with overflows */ data->lines_last_turn++; if( !data->dont_care && data->lines_last_turn>=MSG_LINES-2 ) { char c; BOOL done; /* append "--More--" to the message window text (cannot call putstr here - infinite recursion) */ memmove(&data->window_text[0], &data->window_text[1], (MSG_LINES-1)*sizeof(data->window_text[0])); data->window_text[MSG_LINES-1].attr = ATR_NONE; strncpy(data->window_text[MSG_LINES-1].text, "--More--", MAXWINDOWTEXT); /* update window content */ InvalidateRect(hWnd, NULL, TRUE); #if defined(WIN_CE_SMARTPHONE) NHSPhoneSetKeypadFromString( "\033- <>" ); #endif done = FALSE; while( !done ) { int x, y, mod; c = mswin_nh_poskey(&x, &y, &mod); switch (c) { /* ESC indicates that we can safely discard any further messages during this turn */ case '\033': data->dont_care = 1; done = TRUE; break; case '<': SendMessage(hWnd, WM_VSCROLL, MAKEWPARAM(SB_LINEUP, 0), (LPARAM)NULL); break; case '>': SendMessage(hWnd, WM_VSCROLL, MAKEWPARAM(SB_LINEDOWN, 0), (LPARAM)NULL); break; /* continue scrolling on any key */ default: data->lines_last_turn = 0; done = TRUE; break; } } #if defined(WIN_CE_SMARTPHONE) NHSPhoneSetKeypadDefault(); #endif /* remove "--More--" from the message window text */ data->window_text[MSG_LINES-1].attr = ATR_NONE; strncpy(data->window_text[MSG_LINES-1].text, " ", MAXWINDOWTEXT); } /* update window content */ InvalidateRect(hWnd, NULL, TRUE); #ifdef USER_SOUNDS play_sound_for_message(msg_data->text); #endif } break; case MSNH_MSG_CLEAR_WINDOW: data->lines_last_turn = 0; data->dont_care = 0; break; } } void onMSNH_VScroll(HWND hWnd, WPARAM wParam, LPARAM lParam) { PNHMessageWindow data; SCROLLINFO si; int yInc; /* get window data */ data = (PNHMessageWindow)GetWindowLong(hWnd, GWL_USERDATA); ZeroMemory(&si, sizeof(si)); si.cbSize = sizeof(si); si.fMask = SIF_PAGE | SIF_POS; GetScrollInfo(hWnd, SB_VERT, &si); switch(LOWORD (wParam)) { // User clicked the shaft above the scroll box. case SB_PAGEUP: yInc = -(int)si.nPage; break; // User clicked the shaft below the scroll box. case SB_PAGEDOWN: yInc = si.nPage; break; // User clicked the top arrow. case SB_LINEUP: yInc = -1; break; // User clicked the bottom arrow. case SB_LINEDOWN: yInc = 1; break; // User dragged the scroll box. case SB_THUMBTRACK: yInc = HIWORD(wParam) - data->yPos; break; default: yInc = 0; } // If applying the vertical scrolling increment does not // take the scrolling position out of the scrolling range, // increment the scrolling position, adjust the position // of the scroll box, and update the window. UpdateWindow // sends the WM_PAINT message. if (yInc = max( MSG_VISIBLE_LINES - data->yPos, min(yInc, data->yMax - data->yPos))) { data->yPos += yInc; /* ScrollWindowEx(hWnd, 0, -data->yChar * yInc, (CONST RECT *) NULL, (CONST RECT *) NULL, (HRGN) NULL, (LPRECT) NULL, SW_INVALIDATE | SW_ERASE); */ InvalidateRect(hWnd, NULL, TRUE); ZeroMemory(&si, sizeof(si)); si.cbSize = sizeof(si); si.fMask = SIF_POS; si.nPos = data->yPos; SetScrollInfo(hWnd, SB_VERT, &si, TRUE); UpdateWindow (hWnd); } } #ifndef MSG_WRAP_TEXT void onMSNH_HScroll(HWND hWnd, WPARAM wParam, LPARAM lParam) { PNHMessageWindow data; SCROLLINFO si; int xInc; /* get window data */ data = (PNHMessageWindow)GetWindowLong(hWnd, GWL_USERDATA); ZeroMemory(&si, sizeof(si)); si.cbSize = sizeof(si); si.fMask = SIF_PAGE; GetScrollInfo(hWnd, SB_HORZ, &si); switch(LOWORD (wParam)) { // User clicked shaft left of the scroll box. case SB_PAGEUP: xInc = - (int)si.nPage; break; // User clicked shaft right of the scroll box. case SB_PAGEDOWN: xInc = si.nPage; break; // User clicked the left arrow. case SB_LINEUP: xInc = -1; break; // User clicked the right arrow. case SB_LINEDOWN: xInc = 1; break; // User dragged the scroll box. case SB_THUMBTRACK: xInc = HIWORD(wParam) - data->xPos; break; default: xInc = 0; } // If applying the horizontal scrolling increment does not // take the scrolling position out of the scrolling range, // increment the scrolling position, adjust the position // of the scroll box, and update the window. if (xInc = max (-data->xPos, min (xInc, data->xMax - data->xPos))) { data->xPos += xInc; ScrollWindowEx (hWnd, -data->xChar * xInc, 0, (CONST RECT *) NULL, (CONST RECT *) NULL, (HRGN) NULL, (LPRECT) NULL, SW_INVALIDATE | SW_ERASE); ZeroMemory(&si, sizeof(si)); si.cbSize = sizeof(si); si.fMask = SIF_POS; si.nPos = data->xPos; SetScrollInfo(hWnd, SB_HORZ, &si, TRUE); UpdateWindow (hWnd); } } #endif // MSG_WRAP_TEXT void onPaint(HWND hWnd) { PAINTSTRUCT ps; HDC hdc; PNHMessageWindow data; RECT client_rt, draw_rt; int FirstLine, LastLine; int i, x, y; HGDIOBJ oldFont; TCHAR wbuf[MAXWINDOWTEXT+2]; size_t wlen; COLORREF OldBg, OldFg; hdc = BeginPaint(hWnd, &ps); OldBg = SetBkColor(hdc, mswin_get_color(NHW_MESSAGE, MSWIN_COLOR_BG)); OldFg = SetTextColor(hdc, mswin_get_color(NHW_MESSAGE, MSWIN_COLOR_FG)); data = (PNHMessageWindow)GetWindowLong(hWnd, GWL_USERDATA); GetClientRect(hWnd, &client_rt); if( !IsRectEmpty(&ps.rcPaint) ) { FirstLine = max (0, data->yPos - (client_rt.bottom - ps.rcPaint.top)/data->yChar + 1); LastLine = min (MSG_LINES-1, data->yPos - (client_rt.bottom - ps.rcPaint.bottom)/data->yChar); y = min( ps.rcPaint.bottom, client_rt.bottom - 2); for (i=LastLine; i>=FirstLine; i--) { if( i==MSG_LINES-1 ) { x = data->xChar * (2 - data->xPos); } else { x = data->xChar * (4 - data->xPos); } if( strlen(data->window_text[i].text)>0 ) { /* convert to UNICODE */ NH_A2W(data->window_text[i].text, wbuf, sizeof(wbuf)); wlen = _tcslen(wbuf); /* calculate text height */ draw_rt.left = x; draw_rt.right = client_rt.right; draw_rt.top = y - data->yChar; draw_rt.bottom = y; oldFont = SelectObject(hdc, mswin_get_font(NHW_MESSAGE, data->window_text[i].attr, hdc, FALSE)); #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 ); DrawEdge(hdc, &draw_rt, EDGE_SUNKEN, BF_BOTTOM ); } } } SetTextColor (hdc, OldFg); SetBkColor (hdc, OldBg); EndPaint(hWnd, &ps); } void onCreate(HWND hWnd, WPARAM wParam, LPARAM lParam) { HDC hdc; TEXTMETRIC tm; PNHMessageWindow data; HGDIOBJ saveFont; /* set window data */ data = (PNHMessageWindow)malloc(sizeof(NHMessageWindow)); if( !data ) panic("out of memory"); ZeroMemory(data, sizeof(NHMessageWindow)); data->max_text = MAXWINDOWTEXT; SetWindowLong(hWnd, GWL_USERDATA, (LONG)data); /* Get the handle to the client area's device context. */ hdc = GetDC(hWnd); saveFont = SelectObject(hdc, mswin_get_font(NHW_MESSAGE, ATR_NONE, hdc, FALSE)); /* Extract font dimensions from the text metrics. */ GetTextMetrics (hdc, &tm); data->xChar = tm.tmAveCharWidth; data->xUpper = (tm.tmPitchAndFamily & 1 ? 3 : 2) * data->xChar/2; data->yChar = tm.tmHeight + tm.tmExternalLeading; data->xPage = 1; /* Free the device context. */ SelectObject(hdc, saveFont); ReleaseDC (hWnd, hdc); } 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; } } slashem-0.0.7E7F3/sys/wince/winhack.rc0000664000076400007640000002561610545462317015563 0ustar aliali//Microsoft Developer Studio generated resource script. // #include "resource.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // #include "newres.h" ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // English (U.S.) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) #ifdef _WIN32 LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US #pragma code_page(1252) #endif //_WIN32 ///////////////////////////////////////////////////////////////////////////// // // Icon // // Icon with lowest ID value placed first to ensure application icon // remains consistent on all systems. IDI_WINHACK ICON DISCARDABLE "..\\..\\wince\\NETHACK.ICO" ///////////////////////////////////////////////////////////////////////////// // // Menubar // IDC_WINHACK MENU DISCARDABLE BEGIN POPUP "File" BEGIN MENUITEM "&Save", IDM_SAVE MENUITEM SEPARATOR MENUITEM "&Quit", IDM_EXIT END POPUP "Map" BEGIN MENUITEM "&0 - Use Tiles", IDM_MAP_TILES MENUITEM "&1 - ASCII (4x6)", IDM_MAP_ASCII4X6 MENUITEM "&2 - ASCII (6x8)", IDM_MAP_ASCII6X8 MENUITEM "&3 - ASCII (8x8)", IDM_MAP_ASCII8X8 MENUITEM "&4 - ASCII (16x8)", IDM_MAP_ASCII16X8 MENUITEM "&5 - ASCII (7x12)", IDM_MAP_ASCII7X12 MENUITEM "&6 - ASCII (8x12)", IDM_MAP_ASCII8X12 MENUITEM "&7 - ASCII (16x12)", IDM_MAP_ASCII16X12 MENUITEM "&8 - ASCII (12x16)", IDM_MAP_ASCII12X16 MENUITEM "&9 - ASCII (10x18)", IDM_MAP_ASCII10X18 MENUITEM SEPARATOR MENUITEM "&Fit To Screen", IDM_MAP_FIT_TO_SCREEN END POPUP "View" BEGIN MENUITEM "&Keypad", IDM_VIEW_KEYPAD MENUITEM "&Options", IDM_VIEW_OPTIONS END POPUP "Help" BEGIN MENUITEM "&About ...", IDM_ABOUT MENUITEM "&Long description of the game", IDM_HELP_LONG MENUITEM "List of &commands", IDM_HELP_COMMANDS MENUITEM "&History of NetHack", IDM_HELP_HISTORY MENUITEM "&Info on a character", IDM_HELP_INFO_CHAR MENUITEM "Info on what a given &key does", IDM_HELP_INFO_KEY MENUITEM "List of game &options", IDM_HELP_OPTIONS MENUITEM "&Longer list of game options", IDM_HELP_OPTIONS_LONG MENUITEM "List of e&xtended commands", IDM_HELP_EXTCMD MENUITEM "The &NetHack license", IDM_HELP_LICENSE END END ///////////////////////////////////////////////////////////////////////////// // // Accelerator // IDC_WINHACK ACCELERATORS MOVEABLE PURE BEGIN "?", IDM_ABOUT, ASCII, ALT "/", IDM_ABOUT, ASCII, ALT END ///////////////////////////////////////////////////////////////////////////// // // Dialog // IDD_ABOUTBOX DIALOG DISCARDABLE 22, 17, 123, 87 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "About" FONT 8, "System" BEGIN LTEXT "NetHack",IDC_ABOUT_VERSION,0,2,120,15,SS_NOPREFIX LTEXT "Copyright",IDC_ABOUT_COPYRIGHT,0,20,120,50 DEFPUSHBUTTON "OK",IDOK,45,75,30,11,WS_GROUP END IDD_MENU DIALOG DISCARDABLE 0, 0, 109, 153 STYLE WS_CHILD | WS_CLIPSIBLINGS | WS_BORDER FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "OK",IDOK,5,130,50,14,BS_NOTIFY PUSHBUTTON "Cancel",IDCANCEL,55,130,50,14,BS_NOTIFY CONTROL "List1",IDC_MENU_LIST,"SysListView32",WS_BORDER | WS_TABSTOP,5,5,100,60 EDITTEXT IDC_MENU_TEXT,5,70,100,55,ES_MULTILINE | ES_READONLY | WS_VSCROLL | WS_HSCROLL END IDD_GETLIN DIALOG DISCARDABLE 0, 0, 115, 30 STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Question?" FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "OK",IDOK,0,16,55,14 PUSHBUTTON "Cancel",IDCANCEL,55,16,60,14 EDITTEXT IDC_GETLIN_EDIT,0,0,115,15,ES_AUTOHSCROLL END IDD_PLAYER_SELECTOR DIALOG DISCARDABLE 0, 0, 105, 124 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "What are you?" FONT 8, "MS Sans Serif" BEGIN EDITTEXT IDC_PLSEL_NAME,35,0,70,12,ES_AUTOHSCROLL | ES_READONLY LTEXT "Name:",IDC_STATIC,0,0,25,10 CONTROL "Random",IDC_PLSEL_ROLE_RANDOM,"Button",BS_AUTOCHECKBOX | BS_NOTIFY | WS_GROUP | WS_TABSTOP,5,20,40,10 COMBOBOX IDC_PLSEL_ROLE_LIST,50,20,50,50,CBS_DROPDOWNLIST | WS_VSCROLL | WS_GROUP | WS_TABSTOP CONTROL "Random",IDC_PLSEL_RACE_RANDOM,"Button",BS_AUTOCHECKBOX | BS_NOTIFY | WS_GROUP | WS_TABSTOP,5,45,40,10 COMBOBOX IDC_PLSEL_RACE_LIST,50,45,50,45,CBS_DROPDOWNLIST | WS_VSCROLL | WS_GROUP | WS_TABSTOP CONTROL "Random",IDC_PLSEL_GENDER_RANDOM,"Button", BS_AUTOCHECKBOX | BS_NOTIFY | WS_GROUP | WS_TABSTOP,5,70, 40,10 COMBOBOX IDC_PLSEL_GENDER_LIST,50,70,50,40,CBS_DROPDOWNLIST | WS_VSCROLL | WS_GROUP | WS_TABSTOP CONTROL "Random",IDC_PLSEL_ALIGN_RANDOM,"Button",BS_AUTOCHECKBOX | BS_NOTIFY | WS_GROUP | WS_TABSTOP,5,95,40,10 COMBOBOX IDC_PLSEL_ALIGN_LIST,50,95,50,45,CBS_DROPDOWNLIST | WS_VSCROLL | WS_GROUP | WS_TABSTOP GROUPBOX "Role",IDC_STATIC,0,10,105,25,WS_GROUP GROUPBOX "Race",IDC_STATIC,0,35,105,25 GROUPBOX "Gender",IDC_STATIC,0,60,105,25 GROUPBOX "Alignment",IDC_STATIC,0,85,105,25 DEFPUSHBUTTON "Play",IDOK,0,110,55,14 PUSHBUTTON "Quit",IDCANCEL,55,110,50,14 END IDD_NHTEXT DIALOG DISCARDABLE 0, 0, 83, 97 STYLE WS_CHILD | WS_BORDER FONT 8, "System" BEGIN DEFPUSHBUTTON "OK",IDOK,15,80,50,14 EDITTEXT IDC_TEXT_CONTROL,5,0,70,75,ES_MULTILINE | ES_READONLY | WS_VSCROLL | WS_HSCROLL END IDD_EXTCMD DIALOG DISCARDABLE 0, 0, 109, 114 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Extended Commands" FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "OK",IDOK,75,5,30,14 PUSHBUTTON "Cancel",IDCANCEL,75,20,30,14 LISTBOX IDC_EXTCMD_LIST,5,5,65,105,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP END #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // TEXTINCLUDE // 2 TEXTINCLUDE DISCARDABLE BEGIN "#include ""newres.h""\r\n" "\0" END 3 TEXTINCLUDE DISCARDABLE BEGIN "\r\n" "\0" END 1 TEXTINCLUDE DISCARDABLE BEGIN "resource.h\0" END #endif // APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Bitmap // IDB_TILES BITMAP DISCARDABLE "..\\..\\wince\\tiles.bmp" IDB_MENU_SEL BITMAP DISCARDABLE "..\\..\\wince\\mnsel.bmp" IDB_MENU_UNSEL BITMAP DISCARDABLE "..\\..\\wince\\mnunsel.bmp" IDB_PETMARK BITMAP DISCARDABLE "..\\..\\wince\\petmark.bmp" IDB_MENU_SEL_COUNT BITMAP DISCARDABLE "..\\..\\wince\\mnselcnt.bmp" IDB_KEYPAD BITMAP DISCARDABLE "..\\..\\wince\\keypad.bmp" IDB_MENUBAR BITMAP DISCARDABLE "..\\..\\wince\\menubar.bmp" ///////////////////////////////////////////////////////////////////////////// // // DESIGNINFO // #ifdef APSTUDIO_INVOKED GUIDELINES DESIGNINFO DISCARDABLE BEGIN IDD_PLAYER_SELECTOR, DIALOG BEGIN RIGHTMARGIN, 98 BOTTOMMARGIN, 117 END IDD_NHTEXT, DIALOG BEGIN LEFTMARGIN, 5 RIGHTMARGIN, 76 TOPMARGIN, 7 BOTTOMMARGIN, 94 END IDD_EXTCMD, DIALOG BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 102 TOPMARGIN, 7 BOTTOMMARGIN, 107 END END #endif // APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Data // IDC_WINHACK SHMENUBAR DISCARDABLE BEGIN IDC_WINHACK, 6, I_IMAGENONE, ID_FILE, TBSTATE_ENABLED, TBSTYLE_DROPDOWN | TBSTYLE_AUTOSIZE, IDS_CAP_FILE, 0, 0, I_IMAGENONE, ID_MAP, TBSTATE_ENABLED, TBSTYLE_DROPDOWN | TBSTYLE_AUTOSIZE, IDS_CAP_MAP, 0, 1, I_IMAGENONE, ID_VIEW, TBSTATE_ENABLED, TBSTYLE_DROPDOWN | TBSTYLE_AUTOSIZE, IDS_CAP_VIEW, 0, 2, I_IMAGENONE, ID_HELP, TBSTATE_ENABLED, TBSTYLE_DROPDOWN | TBSTYLE_AUTOSIZE, IDS_CAP_HELP, 0, 3, 0, IDM_MAP_FIT_TO_SCREEN, TBSTATE_ENABLED, TBSTYLE_AUTOSIZE, 0, IDM_MAP_FIT_TO_SCREEN, NOMENU, 1, IDM_VIEW_KEYPAD, TBSTATE_ENABLED, TBSTYLE_AUTOSIZE, 0, IDM_VIEW_KEYPAD, NOMENU, END #ifndef _MAC ///////////////////////////////////////////////////////////////////////////// // // Version // VS_VERSION_INFO VERSIONINFO FILEVERSION 3,4,2,0 PRODUCTVERSION 3,4,2,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x9L #else FILEFLAGS 0x8L #endif FILEOS 0x40004L FILETYPE 0x1L FILESUBTYPE 0x0L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904b0" BEGIN VALUE "Comments", "NetHack 3.4.3 for Windows CE\0" VALUE "CompanyName", " \0" VALUE "FileDescription", "nethackm\0" VALUE "FileVersion", "3, 4, 3, 0\0" VALUE "InternalName", "nethackm\0" VALUE "LegalCopyright", "Copyright © 2003\0" VALUE "LegalTrademarks", "\0" VALUE "OriginalFilename", "nethackm.exe\0" VALUE "PrivateBuild", "031014\0" VALUE "ProductName", "NetHack\0" VALUE "ProductVersion", "3, 4, 3, 0\0" VALUE "SpecialBuild", "\0" END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x409, 1200 END END #endif // !_MAC ///////////////////////////////////////////////////////////////////////////// // // String Table // STRINGTABLE DISCARDABLE BEGIN IDS_APP_TITLE "NetHack" IDC_WINHACK "NETHACK" END STRINGTABLE DISCARDABLE BEGIN IDM_MAP_FIT_TO_SCREEN "Fit to Screen" IDS_CAP_FILE "File" IDS_CAP_HELP "Help" IDS_CAP_MAP "Map" END STRINGTABLE DISCARDABLE BEGIN IDM_VIEW_KEYPAD "Show/Hide keypad." IDS_CAP_VIEW "View" END STRINGTABLE DISCARDABLE BEGIN IDOK "Done" IDCANCEL "Cancel" END #endif // English (U.S.) resources ///////////////////////////////////////////////////////////////////////////// #ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 3 resource. // ///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED slashem-0.0.7E7F3/sys/wince/cesound.c0000664000076400007640000000143510545462317015406 0ustar aliali/* SCCS Id: @(#)cesound.c 3.4 $Date: 2003/02/28 12:13:30 $ */ /* Copyright (c) NetHack PC Development Team 1993 */ /* NetHack may be freely redistributed. See license for details. */ /* */ /* * cesound.c - Windows CE NetHack sound support * * */ #include "hack.h" #include #ifdef USER_SOUNDS void play_usersound(filename, volume) const char* filename; int volume; { TCHAR wbuf[MAX_PATH+1]; /* pline("play_usersound: %s (%d).", filename, volume); */ ZeroMemory(wbuf, sizeof(wbuf)); (void)sndPlaySound(NH_A2W(filename, wbuf, MAX_PATH), SND_ASYNC | SND_NODEFAULT); } #endif /*USER_SOUNDS*/ /* cesound.c */ slashem-0.0.7E7F3/sys/wince/mhtxtbuf.h0000664000076400007640000000101310545462317015604 0ustar aliali/* Copyright (C) 2001 by Alex Kompel */ /* NetHack may be freely redistributed. See license for details. */ #ifndef MSWINTextBuffer_h #define MSWINTextBuffer_h #include "winMS.h" typedef struct mswin_nethack_text_buffer* PNHTextBuffer; PNHTextBuffer mswin_init_text_buffer(BOOL wrap_text); void mswin_free_text_buffer(PNHTextBuffer pb); void mswin_add_text(PNHTextBuffer pb, int attr, const char* text); void mswin_render_text(PNHTextBuffer pb, HWND edit_control); #endif /* MSWINTextBuffer_h */ slashem-0.0.7E7F3/sys/wince/bootstrp.mak0000664000076400007640000007314210545462317016154 0ustar aliali# SCCS Id: @(#)bootstrp.mak 3.4 2002/03/24 # Copyright (c) Michael Allison # # NetHack Windows CE bootstrap file for MS Visual C++ V6.x and # above and MS NMAKE # # This will: # - build makedefs # - #============================================================================== # Do not delete the following 3 lines. # TARGETOS=BOTH APPVER=4.0 !include # # Source directories. Makedefs hardcodes these, don't change them. # INCL = ..\include # NetHack include files DAT = ..\dat # NetHack data files DOC = ..\doc # NetHack documentation files UTIL = ..\util # Utility source SRC = ..\src # Main source SSYS = ..\sys\share # Shared system files NTSYS = ..\sys\winnt # NT Win32 specific files TTY = ..\win\tty # window port files (tty) WIN32 = ..\win\win32 # window port files (WINCE) WSHR = ..\win\share # Tile support files SWINCE= ..\wince # wince files WINCE = ..\wince # wince build area OBJ = $(WINCE)\ceobj DLB = $(DAT)\nhdat #========================================== # Setting up the compiler and linker # macros. All builds include the base ones. #========================================== CFLAGSBASE = -c $(cflags) $(cvarsmt) -I$(INCL) -nologo $(cdebug) $(WINPINC) -DDLB LFLAGSBASEC = $(linkdebug) /NODEFAULTLIB /INCREMENTAL:NO /RELEASE /NOLOGO -subsystem:console,4.0 $(conlibsmt) LFLAGSBASEG = $(linkdebug) $(guiflags) $(guilibsmt) comctl32.lib #========================================== # Util builds #========================================== CFLAGSU = $(CFLAGSBASE) $(WINPFLAG) LFLAGSU = $(LFLAGSBASEC) LEVCFLAGS= -c -nologo -DWINVER=0x0400 -DWIN32 -D_WIN32 \ -D_MT -MT -I..\include -nologo -Z7 -Od -DDLB #========================================== #================ RULES ================== #========================================== .SUFFIXES: .exe .o .til .uu .c .y .l #========================================== # Rules for files in src #========================================== #.c{$(OBJ)}.o: # $(cc) $(CFLAGSU) -Fo$@ $< {$(SRC)}.c{$(OBJ)}.o: $(CC) $(CFLAGSU) -Fo$@ $< #========================================== # Rules for files in sys\share #========================================== {$(SSYS)}.c{$(OBJ)}.o: $(CC) $(CFLAGSU) -Fo$@ $< #========================================== # Rules for files in sys\winnt #========================================== {$(NTSYS)}.c{$(OBJ)}.o: $(CC) $(CFLAGSU) -Fo$@ $< {$(NTSYS)}.h{$(INCL)}.h: copy $< $@ #========================================== # Rules for files in util #========================================== {$(UTIL)}.c{$(OBJ)}.o: $(CC) $(CFLAGSU) -Fo$@ $< #========================================== # Rules for files in win\share #========================================== {$(WSHR)}.c{$(OBJ)}.o: $(CC) $(CFLAGSU) -Fo$@ $< {$(WSHR)}.h{$(INCL)}.h: copy $< $@ #{$(WSHR)}.txt{$(DAT)}.txt: # copy $< $@ #========================================== # Rules for files in win\tty #========================================== {$(TTY)}.c{$(OBJ)}.o: $(CC) $(CFLAGSU) -Fo$@ $< #========================================== # Rules for files in win\win32 #========================================== {$(WIN32)}.c{$(OBJ)}.o: $(cc) $(CFLAGSU) -Fo$@ $< #========================================== # Rules for files in sys\wince #========================================== {$(SWINCE)}.c{$(OBJ)}.o: $(cc) $(CFLAGSU) -Fo$@ $< #========================================== #================ MACROS ================== #========================================== # # Shorten up the location for some files # O = $(OBJ)^\ U = $(UTIL)^\ # # Utility Objects. # MAKESRC = $(U)makedefs.c SPLEVSRC = $(U)lev_yacc.c $(U)lev_$(LEX).c $(U)lev_main.c $(U)panic.c DGNCOMPSRC = $(U)dgn_yacc.c $(U)dgn_$(LEX).c $(U)dgn_main.c MAKEOBJS = $(O)makedefs.o $(O)monst.o $(O)objects.o SPLEVOBJS = $(O)lev_yacc.o $(O)lev_$(LEX).o $(O)lev_main.o \ $(O)alloc.o $(O)decl.o $(O)drawing.o \ $(O)monst.o $(O)objects.o $(O)panic.o DGNCOMPOBJS = $(O)dgn_yacc.o $(O)dgn_$(LEX).o $(O)dgn_main.o \ $(O)alloc.o $(O)panic.o TILEFILES = $(WSHR)\monsters.txt $(WSHR)\objects.txt $(WSHR)\other.txt # # These are not invoked during a normal game build in 3.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 DLBOBJ = $(O)dlb.o #========================================== # Header file macros #========================================== CONFIG_H = $(INCL)\config.h $(INCL)\config1.h $(INCL)\tradstdc.h \ $(INCL)\global.h $(INCL)\coord.h $(INCL)\vmsconf.h \ $(INCL)\system.h $(INCL)\unixconf.h $(INCL)\os2conf.h \ $(INCL)\micro.h $(INCL)\pcconf.h $(INCL)\tosconf.h \ $(INCL)\amiconf.h $(INCL)\macconf.h $(INCL)\beconf.h \ $(INCL)\ntconf.h $(INCL)\nhlan.h $(INCL)\wceconf.h HACK_H = $(INCL)\hack.h $(CONFIG_H) $(INCL)\align.h \ $(INCL)\dungeon.h $(INCL)\monsym.h $(INCL)\mkroom.h \ $(INCL)\objclass.h $(INCL)\youprop.h $(INCL)\prop.h \ $(INCL)\permonst.h $(INCL)\monattk.h \ $(INCL)\monflag.h $(INCL)\mondata.h $(INCL)\pm.h \ $(INCL)\wintype.h $(INCL)\decl.h $(INCL)\quest.h \ $(INCL)\spell.h $(INCL)\color.h $(INCL)\obj.h \ $(INCL)\you.h $(INCL)\attrib.h $(INCL)\monst.h \ $(INCL)\skills.h $(INCL)\onames.h $(INCL)\timeout.h \ $(INCL)\trap.h $(INCL)\flag.h $(INCL)\rm.h \ $(INCL)\vision.h $(INCL)\display.h $(INCL)\engrave.h \ $(INCL)\rect.h $(INCL)\region.h $(INCL)\winprocs.h \ $(INCL)\wintty.h $(INCL)\trampoli.h LEV_H = $(INCL)\lev.h DGN_FILE_H = $(INCL)\dgn_file.h LEV_COMP_H = $(INCL)\lev_comp.h SP_LEV_H = $(INCL)\sp_lev.h TILE_H = ..\win\share\tile.h #========================================== # Miscellaneous #========================================== DATABASE = $(DAT)\data.base #========================================== #=============== TARGETS ================== #========================================== # # The default make target (so just typing 'nmake' is useful). # default : all # # Everything # all : $(INCL)\date.h $(INCL)\onames.h $(INCL)\pm.h \ $(SRC)\monstr.c $(SRC)\vis_tab.c $(U)lev_comp.exe $(INCL)\vis_tab.h \ $(U)dgn_comp.exe $(U)uudecode.exe \ $(DAT)\data $(DAT)\rumors $(DAT)\dungeon \ $(DAT)\oracles $(DAT)\quest.dat $(O)sp_lev.tag $(DLB) $(SRC)\tile.c \ $(SWINCE)\nethack.ico $(SWINCE)\tiles.bmp $(SWINCE)\mnsel.bmp \ $(SWINCE)\mnunsel.bmp $(SWINCE)\petmark.bmp $(SWINCE)\mnselcnt.bmp \ $(SWINCE)\keypad.bmp $(SWINCE)\menubar.bmp @echo Done! $(O)sp_lev.tag: $(DAT)\bigroom.des $(DAT)\castle.des \ $(DAT)\endgame.des $(DAT)\gehennom.des $(DAT)\knox.des \ $(DAT)\medusa.des $(DAT)\oracle.des $(DAT)\tower.des \ $(DAT)\yendor.des $(DAT)\arch.des $(DAT)\barb.des \ $(DAT)\caveman.des $(DAT)\healer.des $(DAT)\knight.des \ $(DAT)\monk.des $(DAT)\priest.des $(DAT)\ranger.des \ $(DAT)\rogue.des $(DAT)\samurai.des $(DAT)\sokoban.des \ $(DAT)\tourist.des $(DAT)\valkyrie.des $(DAT)\wizard.des cd $(DAT) $(U)lev_comp bigroom.des $(U)lev_comp castle.des $(U)lev_comp endgame.des $(U)lev_comp gehennom.des $(U)lev_comp knox.des $(U)lev_comp mines.des $(U)lev_comp medusa.des $(U)lev_comp oracle.des $(U)lev_comp sokoban.des $(U)lev_comp tower.des $(U)lev_comp yendor.des $(U)lev_comp arch.des $(U)lev_comp barb.des $(U)lev_comp caveman.des $(U)lev_comp healer.des $(U)lev_comp knight.des $(U)lev_comp monk.des $(U)lev_comp priest.des $(U)lev_comp ranger.des $(U)lev_comp rogue.des $(U)lev_comp samurai.des $(U)lev_comp tourist.des $(U)lev_comp valkyrie.des $(U)lev_comp wizard.des cd $(WINCE) echo sp_levs done > $(O)sp_lev.tag #$(NHRES): $(TILEBMP16) $(WINCE)\winhack.rc $(WINCE)\mnsel.bmp \ # $(WINCE)\mnselcnt.bmp $(WINCE)\mnunsel.bmp \ # $(WINCE)\petmark.bmp $(WINCE)\NetHack.ico $(WINCE)\rip.bmp \ # $(WINCE)\splash.bmp # $(rc) -r -fo$@ -i$(WINCE) -dNDEBUG $(WINCE)\winhack.rc # # Utility Targets. # #========================================== # Makedefs Stuff #========================================== $(U)makedefs.exe: $(MAKEOBJS) $(link) $(LFLAGSU) -out:$@ $(MAKEOBJS) $(O)makedefs.o: $(CONFIG_H) $(INCL)\monattk.h $(INCL)\monflag.h $(INCL)\objclass.h \ $(INCL)\monsym.h $(INCL)\qtext.h $(INCL)\patchlevel.h \ $(U)makedefs.c if not exist $(OBJ)\*.* echo creating directory $(OBJ) if not exist $(OBJ)\*.* mkdir $(OBJ) $(CC) $(CFLAGSU) -Fo$@ $(U)makedefs.c # # date.h should be remade every time any of the source or include # files is modified. # $(INCL)\date.h $(OPTIONS_FILE) : $(U)makedefs.exe $(U)makedefs -v $(INCL)\onames.h : $(U)makedefs.exe $(U)makedefs -o $(INCL)\pm.h : $(U)makedefs.exe $(U)makedefs -p #$(INCL)\trap.h : $(U)makedefs.exe # $(U)makedefs -t $(SRC)\monstr.c: $(U)makedefs.exe $(U)makedefs -m $(INCL)\vis_tab.h: $(U)makedefs.exe $(U)makedefs -z $(SRC)\vis_tab.c: $(U)makedefs.exe $(U)makedefs -z #========================================== # uudecode utility and uuencoded targets #========================================== $(U)uudecode.exe: $(O)uudecode.o $(link) $(LFLAGSU) -out:$@ $(O)uudecode.o $(O)uudecode.o: $(SSYS)\uudecode.c $(SWINCE)\NetHack.ico : $(U)uudecode.exe $(SWINCE)\nhico.uu chdir $(SWINCE) ..\util\uudecode.exe nhico.uu chdir $(WINCE) $(SWINCE)\mnsel.bmp: $(U)uudecode.exe $(SWINCE)\mnsel.uu chdir $(SWINCE) ..\util\uudecode.exe mnsel.uu chdir $(WINCE) $(SWINCE)\mnselcnt.bmp: $(U)uudecode.exe $(SWINCE)\mnselcnt.uu chdir $(SWINCE) ..\util\uudecode.exe mnselcnt.uu chdir $(WINCE) $(SWINCE)\mnunsel.bmp: $(U)uudecode.exe $(SWINCE)\mnunsel.uu chdir $(SWINCE) ..\util\uudecode.exe mnunsel.uu chdir $(WINCE) $(SWINCE)\petmark.bmp: $(U)uudecode.exe $(SWINCE)\petmark.uu chdir $(SWINCE) ..\util\uudecode.exe petmark.uu chdir $(WINCE) $(SWINCE)\rip.bmp: $(U)uudecode.exe $(SWINCE)\rip.uu chdir $(SWINCE) ..\util\uudecode.exe rip.uu chdir $(WINCE) $(SWINCE)\splash.bmp: $(U)uudecode.exe $(SWINCE)\splash.uu chdir $(SWINCE) ..\util\uudecode.exe splash.uu chdir $(WINCE) $(SWINCE)\keypad.bmp: $(U)uudecode.exe $(SWINCE)\keypad.uu chdir $(SWINCE) ..\util\uudecode.exe keypad.uu chdir $(WINCE) $(SWINCE)\menubar.bmp: $(U)uudecode.exe $(SWINCE)\menubar.uu chdir $(SWINCE) ..\util\uudecode.exe menubar.uu chdir $(WINCE) #========================================== # Level Compiler Stuff #========================================== $(U)lev_comp.exe: $(SPLEVOBJS) echo Linking $@... $(link) $(LFLAGSU) -out:$@ @<<$(@B).lnk $(SPLEVOBJS:^ =^ ) << $(O)lev_yacc.o: $(HACK_H) $(SP_LEV_H) $(INCL)\lev_comp.h $(U)lev_yacc.c $(CC) $(LEVCFLAGS) -W0 -Fo$@ $(U)lev_yacc.c $(O)lev_$(LEX).o: $(HACK_H) $(INCL)\lev_comp.h $(SP_LEV_H) \ $(U)lev_$(LEX).c $(CC) $(LEVCFLAGS) -W0 -Fo$@ $(U)lev_$(LEX).c $(O)lev_main.o: $(U)lev_main.c $(HACK_H) $(SP_LEV_H) $(CC) $(LEVCFLAGS) -W0 -Fo$@ $(U)lev_main.c $(U)lev_yacc.c $(INCL)\lev_comp.h : $(U)lev_comp.y @echo We will copy the prebuilt lev_yacc.c and @echo lev_comp.h from $(SSYS) into $(UTIL) and use them. @copy $(SSYS)\lev_yacc.c $(U)lev_yacc.c >nul @copy $(SSYS)\lev_comp.h $(INCL)\lev_comp.h >nul @echo /**/ >>$(U)lev_yacc.c @echo /**/ >>$(INCL)\lev_comp.h $(U)lev_$(LEX).c: $(U)lev_comp.l @echo We will copy the prebuilt lev_lex.c @echo from $(SSYS) into $(UTIL) and use it. @copy $(SSYS)\lev_lex.c $@ >nul @echo /**/ >>$@ #========================================== # Dungeon Compiler Stuff #========================================== $(U)dgn_comp.exe: $(DGNCOMPOBJS) @echo Linking $@... $(link) $(LFLAGSU) -out:$@ @<<$(@B).lnk $(DGNCOMPOBJS:^ =^ ) << $(O)dgn_yacc.o: $(HACK_H) $(DGN_FILE_H) $(INCL)\dgn_comp.h $(U)dgn_yacc.c $(CC) $(LEVCFLAGS) -W0 -Fo$@ $(U)dgn_yacc.c $(O)dgn_$(LEX).o: $(HACK_H) $(DGN_FILE_H) $(INCL)\dgn_comp.h \ $(U)dgn_$(LEX).c $(CC) $(LEVCFLAGS) -W0 -Fo$@ $(U)dgn_$(LEX).c $(O)dgn_main.o: $(HACK_H) $(U)dgn_main.c $(CC) $(LEVCFLAGS) -W0 -Fo$@ $(U)dgn_main.c $(U)dgn_yacc.c $(INCL)\dgn_comp.h : $(U)dgn_comp.y @echo We will copy the prebuilt $(U)dgn_yacc.c and @echo dgn_comp.h from $(SSYS) into $(UTIL) and use them. @copy $(SSYS)\dgn_yacc.c $(U)dgn_yacc.c >nul @copy $(SSYS)\dgn_comp.h $(INCL)\dgn_comp.h >nul @echo /**/ >>$(U)dgn_yacc.c @echo /**/ >>$(INCL)\dgn_comp.h $(U)dgn_$(LEX).c: $(U)dgn_comp.l @echo We will copy the prebuilt dgn_lex.c @echo from $(SSYS) into $(UTIL) and use it. @copy $(SSYS)\dgn_lex.c $@ >nul @echo /**/ >>$@ #========================================== # Create directory for holding object files #========================================== $(O)obj.tag: if not exist $(OBJ)\*.* echo creating directory $(OBJ) if not exist $(OBJ)\*.* mkdir $(OBJ) echo directory created >$@ #========================================== # Notify of any CL environment variables # in effect since they change the compiler # options. #========================================== envchk: ! IF "$(CL)"!="" @echo Warning, the CL Environment variable is defined: @echo CL=$(CL) ! ENDIF @echo ---- @echo NOTE: This build will include tile support. @echo ---- #========================================== #=========== SECONDARY TARGETS ============ #========================================== #=========================================== # Header files NOT distributed in ..\include #=========================================== $(INCL)\win32api.h: $(NTSYS)\win32api.h copy $(NTSYS)\win32api.h $@ #========================================== # DLB utility and nhdat file creation #========================================== $(U)dlb_main.exe: $(DLBOBJ) $(O)dlb.o $(link) $(LFLAGSU) -out:$@ @<<$(@B).lnk $(O)dlb_main.o $(O)dlb.o $(O)alloc.o $(O)panic.o << $(O)dlb.o: $(O)dlb_main.o $(O)alloc.o $(O)panic.o $(INCL)\dlb.h $(CC) $(CFLAGSU) /Fo$@ $(SRC)\dlb.c $(O)dlb_main.o: $(UTIL)\dlb_main.c $(INCL)\config.h $(INCL)\dlb.h $(CC) $(CFLAGSU) /Fo$@ $(UTIL)\dlb_main.c #$(DAT)\porthelp: $(NTSYS)\porthelp # copy $(NTSYS)\porthelp $@ >nul $(DAT)\nhdat: $(U)dlb_main.exe $(DAT)\data $(DAT)\oracles $(OPTIONS_FILE) \ $(DAT)\quest.dat $(DAT)\rumors $(DAT)\help $(DAT)\hh $(DAT)\cmdhelp \ $(DAT)\history $(DAT)\opthelp $(DAT)\wizhelp $(DAT)\dungeon \ $(DAT)\license $(O)sp_lev.tag cd $(DAT) echo data >dlb.lst echo oracles >>dlb.lst if exist options echo options >>dlb.lst if exist ttyoptions echo ttyoptions >>dlb.lst if exist guioptions echo guioptions >>dlb.lst if exist porthelp echo porthelp >>dlb.lst echo quest.dat >>dlb.lst echo rumors >>dlb.lst echo help >>dlb.lst echo hh >>dlb.lst echo cmdhelp >>dlb.lst echo history >>dlb.lst echo opthelp >>dlb.lst echo wizhelp >>dlb.lst echo dungeon >>dlb.lst echo license >>dlb.lst for %%N in (*.lev) do echo %%N >>dlb.lst $(U)dlb_main cIf dlb.lst nhdat cd $(WINCE) #========================================== # Tile Mapping #========================================== $(SRC)\tile.c: $(U)tilemap.exe echo A new $@ has been created $(U)tilemap $(U)tilemap.exe: $(O)tilemap.o $(link) $(LFLAGSU) -out:$@ $(O)tilemap.o $(O)tilemap.o: $(WSHR)\tilemap.c $(HACK_H) $(CC) $(CFLAGSU) -Fo$@ $(WSHR)\tilemap.c $(O)tiletx32.o: $(WSHR)\tilemap.c $(HACK_H) $(CC) $(CFLAGSU) /DTILETEXT /DTILE_X=32 /DTILE_Y=32 -Fo$@ $(WSHR)\tilemap.c $(O)tiletxt.o: $(WSHR)\tilemap.c $(HACK_H) $(CC) $(CFLAGSU) /DTILETEXT -Fo$@ $(WSHR)\tilemap.c $(O)gifread.o: $(WSHR)\gifread.c $(CONFIG_H) $(TILE_H) $(CC) $(CFLAGSU) -I$(WSHR) -Fo$@ $(WSHR)\gifread.c $(O)gifrd32.o: $(WSHR)\gifread.c $(CONFIG_H) $(TILE_H) $(CC) $(CFLAGSU) -I$(WSHR) /DTILE_X=32 /DTILE_Y=32 -Fo$@ $(WSHR)\gifread.c $(O)ppmwrite.o: $(WSHR)\ppmwrite.c $(CONFIG_H) $(TILE_H) $(CC) $(CFLAGSU) -I$(WSHR) -Fo$@ $(WSHR)\ppmwrite.c $(O)tiletext.o: $(WSHR)\tiletext.c $(CONFIG_H) $(TILE_H) $(CC) $(CFLAGSU) -I$(WSHR) -Fo$@ $(WSHR)\tiletext.c $(O)tilete32.o: $(WSHR)\tiletext.c $(CONFIG_H) $(TILE_H) $(CC) $(CFLAGSU) -I$(WSHR) /DTILE_X=32 /DTILE_Y=32 -Fo$@ $(WSHR)\tiletext.c $(SWINCE)\tiles.bmp: $(U)tile2bmp.exe $(TILEFILES) echo Creating 16x16 binary tile files (this may take some time) $(U)tile2bmp $@ #$(TILEBMP32): $(TILEUTIL32) $(TILEFILES32) # echo Creating 32x32 binary tile files (this may take some time) # $(U)til2bm32 $(TILEBMP32) $(U)tile2bmp.exe: $(O)tile2bmp.o $(TEXT_IO) @echo Linking $@... $(link) $(LFLAGSU) -out:$@ @<<$(@B).lnk $(O)tile2bmp.o $(TEXT_IO:^ =^ ) << $(U)til2bm32.exe: $(O)til2bm32.o $(TEXT_IO32) @echo Linking $@... $(link) $(LFLAGSU) -out:$@ @<<$(@B).lnk $(O)til2bm32.o $(TEXT_IO32:^ =^ ) << $(O)tile2bmp.o: $(WSHR)\tile2bmp.c $(HACK_H) $(TILE_H) $(INCL)\win32api.h $(CC) $(CFLAGSU) -I$(WSHR) /DPACKED_FILE /Fo$@ $(WSHR)\tile2bmp.c $(O)til2bm32.o: $(WSHR)\tile2bmp.c $(HACK_H) $(TILE_H) $(INCL)\win32api.h $(CC) $(CFLAGSU) -I$(WSHR) /DPACKED_FILE /DTILE_X=32 /DTILE_Y=32 /Fo$@ $(WSHR)\tile2bmp.c #=================================================================== # OTHER DEPENDENCIES #=================================================================== # # dat dependencies # $(DAT)\data: $(UTIL)\makedefs.exe $(U)makedefs -d $(DAT)\rumors: $(UTIL)\makedefs.exe $(DAT)\rumors.tru $(DAT)\rumors.fal $(U)makedefs -r $(DAT)\quest.dat: $(UTIL)\makedefs.exe $(DAT)\quest.txt $(U)makedefs -q $(DAT)\oracles: $(UTIL)\makedefs.exe $(DAT)\oracles.txt $(U)makedefs -h $(DAT)\dungeon: $(UTIL)\makedefs.exe $(DAT)\dungeon.def $(U)makedefs -e cd $(DAT) $(U)dgn_comp dungeon.pdf cd $(WINCE) # # NT dependencies # # #$(O)nttty.o: $(HACK_H) $(TILE_H) $(INCL)\win32api.h $(NTSYS)\nttty.c # $(CC) $(CFLAGSU) -I$(WSHR) -Fo$@ $(NTSYS)\nttty.c #$(O)winnt.o: $(HACK_H) $(INCL)\win32api.h $(NTSYS)\winnt.c # $(CC) $(CFLAGSU) -Fo$@ $(NTSYS)\winnt.c #$(O)ntsound.o: $(HACK_H) $(NTSYS)\ntsound.c # $(CC) $(CFLAGSU) -Fo$@ $(NTSYS)\ntsound.c #$(O)mapimail.o: $(HACK_H) $(INCL)\nhlan.h $(NTSYS)\mapimail.c # $(CC) $(CFLAGSU) -DMAPI_VERBOSE -Fo$@ $(NTSYS)\mapimail.c # # util dependencies # $(O)panic.o: $(U)panic.c $(CONFIG_H) $(CC) $(CFLAGSU) -Fo$@ $(U)panic.c # # The rest are stolen from sys/unix/Makefile.src, # with slashes changed to back-slashes # and -c (which is included in CFLAGSU) substituted # with -Fo$@ , but otherwise untouched. That # means that there is some irrelevant stuff # in here, but maintenance should be easier. # $(O)tos.o: ..\sys\atari\tos.c $(HACK_H) $(INCL)\tcap.h $(CC) $(CFLAGSU) -Fo$@ ..\sys\atari\tos.c $(O)pcmain.o: ..\sys\share\pcmain.c $(HACK_H) $(INCL)\dlb.h \ $(INCL)\win32api.h $(CC) $(CFLAGSU) -Fo$@ ..\sys\share\pcmain.c $(O)pcsys.o: ..\sys\share\pcsys.c $(HACK_H) $(CC) $(CFLAGSU) -Fo$@ ..\sys\share\pcsys.c $(O)pctty.o: ..\sys\share\pctty.c $(HACK_H) $(CC) $(CFLAGSU) -Fo$@ ..\sys\share\pctty.c $(O)pcunix.o: ..\sys\share\pcunix.c $(HACK_H) $(CC) $(CFLAGSU) -Fo$@ ..\sys\share\pcunix.c $(O)random.o: ..\sys\share\random.c $(HACK_H) $(CC) $(CFLAGSU) -Fo$@ ..\sys\share\random.c $(O)ioctl.o: ..\sys\share\ioctl.c $(HACK_H) $(INCL)\tcap.h $(CC) $(CFLAGSU) -Fo$@ ..\sys\share\ioctl.c $(O)unixtty.o: ..\sys\share\unixtty.c $(HACK_H) $(CC) $(CFLAGSU) -Fo$@ ..\sys\share\unixtty.c $(O)unixmain.o: ..\sys\unix\unixmain.c $(HACK_H) $(INCL)\dlb.h $(CC) $(CFLAGSU) -Fo$@ ..\sys\unix\unixmain.c $(O)unixunix.o: ..\sys\unix\unixunix.c $(HACK_H) $(CC) $(CFLAGSU) -Fo$@ ..\sys\unix\unixunix.c $(O)bemain.o: ..\sys\be\bemain.c $(HACK_H) $(INCL)\dlb.h $(CC) $(CFLAGSU) -Fo$@ ..\sys\be\bemain.c $(O)getline.o: ..\win\tty\getline.c $(HACK_H) $(INCL)\func_tab.h $(CC) $(CFLAGSU) -Fo$@ ..\win\tty\getline.c $(O)termcap.o: ..\win\tty\termcap.c $(HACK_H) $(INCL)\tcap.h $(CC) $(CFLAGSU) -Fo$@ ..\win\tty\termcap.c $(O)topl.o: ..\win\tty\topl.c $(HACK_H) $(INCL)\tcap.h $(CC) $(CFLAGSU) -Fo$@ ..\win\tty\topl.c $(O)wintty.o: ..\win\tty\wintty.c $(HACK_H) $(INCL)\dlb.h \ $(INCL)\patchlevel.h $(INCL)\tcap.h $(CC) $(CFLAGSU) -Fo$@ ..\win\tty\wintty.c $(O)Window.o: ..\win\X11\Window.c $(INCL)\xwindowp.h $(INCL)\xwindow.h \ $(CONFIG_H) $(CC) $(CFLAGSU) -Fo$@ ..\win\X11\Window.c $(O)dialogs.o: ..\win\X11\dialogs.c $(CONFIG_H) $(CC) $(CFLAGSU) -Fo$@ ..\win\X11\dialogs.c $(O)winX.o: ..\win\X11\winX.c $(HACK_H) $(INCL)\winX.h $(INCL)\dlb.h \ $(INCL)\patchlevel.h ..\win\X11\nh72icon \ ..\win\X11\nh56icon ..\win\X11\nh32icon $(CC) $(CFLAGSU) -Fo$@ ..\win\X11\winX.c $(O)winmap.o: ..\win\X11\winmap.c $(INCL)\xwindow.h $(HACK_H) $(INCL)\dlb.h \ $(INCL)\winX.h $(INCL)\tile2x11.h $(CC) $(CFLAGSU) -Fo$@ ..\win\X11\winmap.c $(O)winmenu.o: ..\win\X11\winmenu.c $(HACK_H) $(INCL)\winX.h $(CC) $(CFLAGSU) -Fo$@ ..\win\X11\winmenu.c $(O)winmesg.o: ..\win\X11\winmesg.c $(INCL)\xwindow.h $(HACK_H) $(INCL)\winX.h $(CC) $(CFLAGSU) -Fo$@ ..\win\X11\winmesg.c $(O)winmisc.o: ..\win\X11\winmisc.c $(HACK_H) $(INCL)\func_tab.h \ $(INCL)\winX.h $(CC) $(CFLAGSU) -Fo$@ ..\win\X11\winmisc.c $(O)winstat.o: ..\win\X11\winstat.c $(HACK_H) $(INCL)\winX.h $(CC) $(CFLAGSU) -Fo$@ ..\win\X11\winstat.c $(O)wintext.o: ..\win\X11\wintext.c $(HACK_H) $(INCL)\winX.h $(INCL)\xwindow.h $(CC) $(CFLAGSU) -Fo$@ ..\win\X11\wintext.c $(O)winval.o: ..\win\X11\winval.c $(HACK_H) $(INCL)\winX.h $(CC) $(CFLAGSU) -Fo$@ ..\win\X11\winval.c $(O)tile.o: $(SRC)\tile.c $(HACK_H) $(O)gnaskstr.o: ..\win\gnome\gnaskstr.c ..\win\gnome\gnaskstr.h \ ..\win\gnome\gnmain.h $(CC) $(CFLAGSU) $(GNOMEINC) -c ..\win\gnome\gnaskstr.c $(O)gnbind.o: ..\win\gnome\gnbind.c ..\win\gnome\gnbind.h ..\win\gnome\gnmain.h \ ..\win\gnome\gnaskstr.h ..\win\gnome\gnyesno.h $(CC) $(CFLAGSU) $(GNOMEINC) -c ..\win\gnome\gnbind.c $(O)gnglyph.o: ..\win\gnome\gnglyph.c ..\win\gnome\gnglyph.h $(CC) $(CFLAGSU) $(GNOMEINC) -c ..\win\gnome\gnglyph.c $(O)gnmain.o: ..\win\gnome\gnmain.c ..\win\gnome\gnmain.h ..\win\gnome\gnsignal.h \ ..\win\gnome\gnbind.h ..\win\gnome\gnopts.h $(HACK_H) \ $(INCL)\date.h $(CC) $(CFLAGSU) $(GNOMEINC) -c ..\win\gnome\gnmain.c $(O)gnmap.o: ..\win\gnome\gnmap.c ..\win\gnome\gnmap.h ..\win\gnome\gnglyph.h \ ..\win\gnome\gnsignal.h $(HACK_H) $(CC) $(CFLAGSU) $(GNOMEINC) -c ..\win\gnome\gnmap.c $(O)gnmenu.o: ..\win\gnome\gnmenu.c ..\win\gnome\gnmenu.h ..\win\gnome\gnmain.h \ ..\win\gnome\gnbind.h $(CC) $(CFLAGSU) $(GNOMEINC) -c ..\win\gnome\gnmenu.c $(O)gnmesg.o: ..\win\gnome\gnmesg.c ..\win\gnome\gnmesg.h ..\win\gnome\gnsignal.h $(CC) $(CFLAGSU) $(GNOMEINC) -c ..\win\gnome\gnmesg.c $(O)gnopts.o: ..\win\gnome\gnopts.c ..\win\gnome\gnopts.h ..\win\gnome\gnglyph.h \ ..\win\gnome\gnmain.h ..\win\gnome\gnmap.h $(HACK_H) $(CC) $(CFLAGSU) $(GNOMEINC) -c ..\win\gnome\gnopts.c $(O)gnplayer.o: ..\win\gnome\gnplayer.c ..\win\gnome\gnplayer.h \ ..\win\gnome\gnmain.h $(HACK_H) $(CC) $(CFLAGSU) $(GNOMEINC) -c ..\win\gnome\gnplayer.c $(O)gnsignal.o: ..\win\gnome\gnsignal.c ..\win\gnome\gnsignal.h \ ..\win\gnome\gnmain.h $(CC) $(CFLAGSU) $(GNOMEINC) -c ..\win\gnome\gnsignal.c $(O)gnstatus.o: ..\win\gnome\gnstatus.c ..\win\gnome\gnstatus.h \ ..\win\gnome\gnsignal.h ..\win\gnome\gn_xpms.h \ ..\win\gnome\gnomeprv.h $(CC) $(CFLAGSU) $(GNOMEINC) -c ..\win\gnome\gnstatus.c $(O)gntext.o: ..\win\gnome\gntext.c ..\win\gnome\gntext.h ..\win\gnome\gnmain.h \ ..\win\gnome\gn_rip.h $(CC) $(CFLAGSU) $(GNOMEINC) -c ..\win\gnome\gntext.c $(O)gnyesno.o: ..\win\gnome\gnyesno.c ..\win\gnome\gnbind.h ..\win\gnome\gnyesno.h $(CC) $(CFLAGSU) $(GNOMEINC) -c ..\win\gnome\gnyesno.c $(O)wingem.o: ..\win\gem\wingem.c $(HACK_H) $(INCL)\func_tab.h $(INCL)\dlb.h \ $(INCL)\patchlevel.h $(INCL)\wingem.h $(CC) $(CFLAGSU) -Fo$@ ..\win\gem\wingem.c $(O)wingem1.o: ..\win\gem\wingem1.c $(INCL)\gem_rsc.h $(INCL)\load_img.h \ $(INCL)\wintype.h $(INCL)\wingem.h $(CC) $(CFLAGSU) -Fo$@ ..\win\gem\wingem1.c $(O)load_img.o: ..\win\gem\load_img.c $(INCL)\load_img.h $(CC) $(CFLAGSU) -Fo$@ ..\win\gem\load_img.c $(O)tile.o: $(SRC)\tile.c $(HACK_H) $(O)qt_win.o: ..\win\Qt\qt_win.cpp $(HACK_H) $(INCL)\func_tab.h \ $(INCL)\dlb.h $(INCL)\patchlevel.h $(INCL)\qt_win.h \ $(INCL)\qt_clust.h $(INCL)\qt_kde0.h \ $(INCL)\qt_xpms.h qt_win.moc qt_kde0.moc $(CXX) $(CXXFLAGS) -c ..\win\Qt\qt_win.cpp $(O)qt_clust.o: ..\win\Qt\qt_clust.cpp $(INCL)\qt_clust.h $(CXX) $(CXXFLAGS) -c ..\win\Qt\qt_clust.cpp $(O)monstr.o: $(SRC)\monstr.c $(CONFIG_H) $(O)vis_tab.o: $(SRC)\vis_tab.c $(CONFIG_H) $(INCL)\vis_tab.h $(O)allmain.o: $(SRC)\allmain.c $(HACK_H) $(O)alloc.o: $(SRC)\alloc.c $(CONFIG_H) $(O)apply.o: $(SRC)\apply.c $(HACK_H) $(INCL)\edog.h $(O)artifact.o: $(SRC)\artifact.c $(HACK_H) $(INCL)\artifact.h $(INCL)\artilist.h $(O)attrib.o: $(SRC)\attrib.c $(HACK_H) $(INCL)\artifact.h $(O)ball.o: $(SRC)\ball.c $(HACK_H) $(O)bones.o: $(SRC)\bones.c $(HACK_H) $(INCL)\lev.h $(O)botl.o: $(SRC)\botl.c $(HACK_H) $(O)cmd.o: $(SRC)\cmd.c $(HACK_H) $(INCL)\func_tab.h $(O)dbridge.o: $(SRC)\dbridge.c $(HACK_H) $(O)decl.o: $(SRC)\decl.c $(HACK_H) $(O)detect.o: $(SRC)\detect.c $(HACK_H) $(INCL)\artifact.h $(O)dig.o: $(SRC)\dig.c $(HACK_H) $(INCL)\edog.h $(O)display.o: $(SRC)\display.c $(HACK_H) $(O)dlb.o: $(SRC)\dlb.c $(CONFIG_H) $(INCL)\dlb.h $(O)do.o: $(SRC)\do.c $(HACK_H) $(INCL)\lev.h $(O)do_name.o: $(SRC)\do_name.c $(HACK_H) $(O)do_wear.o: $(SRC)\do_wear.c $(HACK_H) $(O)dog.o: $(SRC)\dog.c $(HACK_H) $(INCL)\edog.h $(O)dogmove.o: $(SRC)\dogmove.c $(HACK_H) $(INCL)\mfndpos.h $(INCL)\edog.h $(O)dokick.o: $(SRC)\dokick.c $(HACK_H) $(INCL)\eshk.h $(O)dothrow.o: $(SRC)\dothrow.c $(HACK_H) $(O)drawing.o: $(SRC)\drawing.c $(HACK_H) $(INCL)\tcap.h $(O)dungeon.o: $(SRC)\dungeon.c $(HACK_H) $(INCL)\dgn_file.h $(INCL)\dlb.h $(O)eat.o: $(SRC)\eat.c $(HACK_H) $(O)end.o: $(SRC)\end.c $(HACK_H) $(INCL)\eshk.h $(INCL)\dlb.h $(O)engrave.o: $(SRC)\engrave.c $(HACK_H) $(INCL)\lev.h $(O)exper.o: $(SRC)\exper.c $(HACK_H) $(O)explode.o: $(SRC)\explode.c $(HACK_H) $(O)extralev.o: $(SRC)\extralev.c $(HACK_H) $(O)files.o: $(SRC)\files.c $(HACK_H) $(INCL)\dlb.h $(O)fountain.o: $(SRC)\fountain.c $(HACK_H) $(O)hack.o: $(SRC)\hack.c $(HACK_H) $(O)hacklib.o: $(SRC)\hacklib.c $(HACK_H) $(O)invent.o: $(SRC)\invent.c $(HACK_H) $(INCL)\artifact.h $(O)light.o: $(SRC)\light.c $(HACK_H) $(INCL)\lev.h $(O)lock.o: $(SRC)\lock.c $(HACK_H) $(O)mail.o: $(SRC)\mail.c $(HACK_H) $(INCL)\mail.h $(O)makemon.o: $(SRC)\makemon.c $(HACK_H) $(INCL)\epri.h $(INCL)\emin.h \ $(INCL)\edog.h $(O)mapglyph.o: $(SRC)\mapglyph.c $(HACK_H) $(O)mcastu.o: $(SRC)\mcastu.c $(HACK_H) $(O)mhitm.o: $(SRC)\mhitm.c $(HACK_H) $(INCL)\artifact.h $(INCL)\edog.h $(O)mhitu.o: $(SRC)\mhitu.c $(HACK_H) $(INCL)\artifact.h $(INCL)\edog.h $(O)minion.o: $(SRC)\minion.c $(HACK_H) $(INCL)\emin.h $(INCL)\epri.h $(O)mklev.o: $(SRC)\mklev.c $(HACK_H) $(O)mkmap.o: $(SRC)\mkmap.c $(HACK_H) $(INCL)\sp_lev.h $(O)mkmaze.o: $(SRC)\mkmaze.c $(HACK_H) $(INCL)\sp_lev.h $(INCL)\lev.h $(O)mkobj.o: $(SRC)\mkobj.c $(HACK_H) $(INCL)\artifact.h $(O)mkroom.o: $(SRC)\mkroom.c $(HACK_H) $(O)mon.o: $(SRC)\mon.c $(HACK_H) $(INCL)\mfndpos.h $(INCL)\edog.h $(O)mondata.o: $(SRC)\mondata.c $(HACK_H) $(INCL)\eshk.h $(INCL)\epri.h $(O)monmove.o: $(SRC)\monmove.c $(HACK_H) $(INCL)\mfndpos.h $(INCL)\artifact.h $(O)monst.o: $(SRC)\monst.c $(CONFIG_H) $(INCL)\permonst.h $(INCL)\align.h \ $(INCL)\monattk.h $(INCL)\monflag.h $(INCL)\monsym.h \ $(INCL)\dungeon.h $(INCL)\eshk.h $(INCL)\vault.h \ $(INCL)\epri.h $(INCL)\color.h $(O)mplayer.o: $(SRC)\mplayer.c $(HACK_H) $(O)mthrowu.o: $(SRC)\mthrowu.c $(HACK_H) $(O)muse.o: $(SRC)\muse.c $(HACK_H) $(INCL)\edog.h $(O)music.o: $(SRC)\music.c $(HACK_H) #interp.c $(O)o_init.o: $(SRC)\o_init.c $(HACK_H) $(INCL)\lev.h $(O)objects.o: $(SRC)\objects.c $(CONFIG_H) $(INCL)\obj.h $(INCL)\objclass.h \ $(INCL)\prop.h $(INCL)\skills.h $(INCL)\color.h $(O)objnam.o: $(SRC)\objnam.c $(HACK_H) $(O)options.o: $(SRC)\options.c $(CONFIG_H) $(INCL)\objclass.h $(INCL)\flag.h \ $(HACK_H) $(INCL)\tcap.h $(O)pager.o: $(SRC)\pager.c $(HACK_H) $(INCL)\dlb.h $(O)pickup.o: $(SRC)\pickup.c $(HACK_H) $(O)pline.o: $(SRC)\pline.c $(HACK_H) $(INCL)\epri.h $(INCL)\edog.h $(O)polyself.o: $(SRC)\polyself.c $(HACK_H) $(O)potion.o: $(SRC)\potion.c $(HACK_H) $(O)pray.o: $(SRC)\pray.c $(HACK_H) $(INCL)\epri.h $(O)priest.o: $(SRC)\priest.c $(HACK_H) $(INCL)\mfndpos.h $(INCL)\eshk.h \ $(INCL)\epri.h $(INCL)\emin.h $(O)quest.o: $(SRC)\quest.c $(HACK_H) $(INCL)\qtext.h $(O)questpgr.o: $(SRC)\questpgr.c $(HACK_H) $(INCL)\dlb.h $(INCL)\qtext.h $(O)read.o: $(SRC)\read.c $(HACK_H) $(O)rect.o: $(SRC)\rect.c $(HACK_H) $(O)region.o: $(SRC)\region.c $(HACK_H) $(INCL)\lev.h $(O)restore.o: $(SRC)\restore.c $(HACK_H) $(INCL)\lev.h $(INCL)\tcap.h $(O)rip.o: $(SRC)\rip.c $(HACK_H) $(O)rnd.o: $(SRC)\rnd.c $(HACK_H) $(O)role.o: $(SRC)\role.c $(HACK_H) $(O)rumors.o: $(SRC)\rumors.c $(HACK_H) $(INCL)\lev.h $(INCL)\dlb.h $(O)save.o: $(SRC)\save.c $(HACK_H) $(INCL)\lev.h $(O)shk.o: $(SRC)\shk.c $(HACK_H) $(INCL)\eshk.h $(O)shknam.o: $(SRC)\shknam.c $(HACK_H) $(INCL)\eshk.h $(O)sit.o: $(SRC)\sit.c $(HACK_H) $(INCL)\artifact.h $(O)sounds.o: $(SRC)\sounds.c $(HACK_H) $(INCL)\edog.h $(O)sp_lev.o: $(SRC)\sp_lev.c $(HACK_H) $(INCL)\dlb.h $(INCL)\sp_lev.h $(O)spell.o: $(SRC)\spell.c $(HACK_H) $(O)steal.o: $(SRC)\steal.c $(HACK_H) $(O)steed.o: $(SRC)\steed.c $(HACK_H) $(O)teleport.o: $(SRC)\teleport.c $(HACK_H) $(O)timeout.o: $(SRC)\timeout.c $(HACK_H) $(INCL)\lev.h $(O)topten.o: $(SRC)\topten.c $(HACK_H) $(INCL)\dlb.h $(INCL)\patchlevel.h $(O)track.o: $(SRC)\track.c $(HACK_H) $(O)trap.o: $(SRC)\trap.c $(HACK_H) $(O)u_init.o: $(SRC)\u_init.c $(HACK_H) $(O)uhitm.o: $(SRC)\uhitm.c $(HACK_H) $(O)vault.o: $(SRC)\vault.c $(HACK_H) $(INCL)\vault.h $(O)version.o: $(SRC)\version.c $(HACK_H) $(INCL)\date.h $(INCL)\patchlevel.h $(O)vision.o: $(SRC)\vision.c $(HACK_H) $(INCL)\vis_tab.h $(O)weapon.o: $(SRC)\weapon.c $(HACK_H) $(O)were.o: $(SRC)\were.c $(HACK_H) $(O)wield.o: $(SRC)\wield.c $(HACK_H) $(O)windows.o: $(SRC)\windows.c $(HACK_H) $(INCL)\wingem.h $(INCL)\winGnome.h $(O)wizard.o: $(SRC)\wizard.c $(HACK_H) $(INCL)\qtext.h $(O)worm.o: $(SRC)\worm.c $(HACK_H) $(INCL)\lev.h $(O)worn.o: $(SRC)\worn.c $(HACK_H) $(O)write.o: $(SRC)\write.c $(HACK_H) $(O)zap.o: $(SRC)\zap.c $(HACK_H) # end of file slashem-0.0.7E7F3/sys/wince/mhtxtbuf.c0000664000076400007640000001674210545462317015616 0ustar aliali/* Copyright (C) 2003 by Alex Kompel */ /* NetHack may be freely redistributed. See license for details. */ #include "mhtxtbuf.h" /* Collect Nethack text messages and render text into edit box. Wrap text if necessary. Recognize formatted lines as having more that 4 consecutive. spaces inside the string. Strip leading and trailing spaces. Always break at the original line end (do not merge text that comes from NetHack engine) */ /*----------------------------------------------------------------*/ #define NHTEXT_BUFFER_INCREMENT 10 /*----------------------------------------------------------------*/ struct text_buffer_line { int attr; short beg_padding; short end_padding; BOOL formatted; char* text; }; /*----------------------------------------------------------------*/ typedef struct mswin_nethack_text_buffer { BOOL b_wrap_text; int n_size; int n_used; struct text_buffer_line *text_buffer_line; } NHTextBuffer, *PNHTextBuffer; /*----------------------------------------------------------------*/ #define NHTextLine(pb,i) ((pb)->text_buffer_line[(i)]) static TCHAR* nh_append( TCHAR* s, int* size, const char* ap ); /*----------------------------------------------------------------*/ PNHTextBuffer mswin_init_text_buffer(BOOL wrap_text) { PNHTextBuffer pb = (PNHTextBuffer)malloc(sizeof(NHTextBuffer)); if( !pb ) panic("Out of memory"); ZeroMemory(pb, sizeof(NHTextBuffer)); pb->b_wrap_text = wrap_text; pb->n_size = 0; pb->n_used = 0; pb->text_buffer_line = NULL; return pb; } /*----------------------------------------------------------------*/ void mswin_free_text_buffer(PNHTextBuffer pb) { int i; if( !pb ) return; for(i=0; in_used; i++ ) { free(pb->text_buffer_line[i].text); } free( pb->text_buffer_line ); free( pb ); } /*----------------------------------------------------------------*/ void mswin_add_text(PNHTextBuffer pb, int attr, const char* text) { char* p; struct text_buffer_line* new_line; /* grow buffer */ if( pb->n_used >= pb->n_size ) { pb->n_size += NHTEXT_BUFFER_INCREMENT; pb->text_buffer_line = (struct text_buffer_line*)realloc( pb->text_buffer_line, pb->n_size*sizeof(struct text_buffer_line) ); if( !pb->text_buffer_line ) panic("Memory allocation error"); } /* analyze the new line of text */ new_line = &NHTextLine(pb, pb->n_used); new_line->attr = attr; new_line->beg_padding = 0; new_line->text = strdup(text); for( p = new_line->text; *p && isspace(*p); p++ ) { new_line->beg_padding++; } if( *p ) { memmove(new_line->text, new_line->text + new_line->beg_padding, strlen(new_line->text) - new_line->beg_padding + 1 ); for( p = new_line->text+strlen(new_line->text); p>=new_line->text && isspace(*p); p-- ) { new_line->end_padding++; *p = 0; } /* if there are 3 (or more) consecutive spaces inside the string consider it formatted */ new_line->formatted = (strstr(new_line->text, " ")!=NULL); } else { new_line->end_padding = 0; new_line->text[0] = 0; new_line->formatted = FALSE; } pb->n_used++; } /*----------------------------------------------------------------*/ static TCHAR* nh_append( TCHAR* s, int* size, const char* ap ) { int tlen, tnewlen; if( !(ap && *ap) ) return s; /* append the calculated line to the text buffer */ tlen = s? _tcslen(s) : 0; tnewlen = tlen+strlen(ap); if( tnewlen>=*size ) { *size = max(tnewlen, *size + BUFSZ); s = (TCHAR*)realloc(s, *size * sizeof(TCHAR)); if( !s ) panic("Out of memory"); ZeroMemory(s+tlen, (*size-tlen)*sizeof(TCHAR)); } if( strcmp(ap, "\r\n")==0 ) { _tcscat(s, TEXT("\r\n")); } else { NH_A2W(ap, s+tlen, strlen(ap)); s[tnewlen] = 0; } return s; } /*----------------------------------------------------------------*/ void mswin_render_text(PNHTextBuffer pb, HWND edit_control) { RECT rt_client; /* boundaries of the client area of the edit control */ SIZE size_text; /* size of the edit control */ RECT rt_text; /* calculated text rectangle for the visible line */ char buf[BUFSZ]; /* buffer for the visible line */ TCHAR tbuf[BUFSZ]; /* temp buffer for DrawText */ TCHAR* pText = NULL; /* resulting text (formatted) */ int pTextSize = 0; /* resulting text size */ char* p_cur = NULL; /* current position in the NHTextBuffer->text_buffer_line->text */ char* p_buf_cur = NULL; /* current position in the visible line buffer */ int i; HDC hdcEdit; /* device context for the edit control */ HFONT hFont, hOldFont; /* edit control font */ GetClientRect(edit_control, &rt_client ); size_text.cx = rt_client.right - rt_client.left; size_text.cy = rt_client.bottom - rt_client.top; size_text.cx -= GetSystemMetrics(SM_CXVSCROLL); /* add a slight right margin - the text looks better that way */ hdcEdit = GetDC(edit_control); hFont = (HFONT)SendMessage(edit_control, WM_GETFONT, 0, 0); if( hFont ) hOldFont = SelectObject(hdcEdit, hFont); /* loop through each line (outer loop) and wrap it around (inner loop) */ ZeroMemory(buf, sizeof(buf)); p_buf_cur = buf; for( i=0; in_used; i++ ) { if( pb->b_wrap_text ) { p_cur = NHTextLine(pb,i).text; /* insert an line break for the empty string */ if( !NHTextLine(pb,i).text[0] ) { pText = nh_append(pText, &pTextSize, "\r\n"); continue; } /* add margin to the "formatted" line of text */ if( NHTextLine(pb,i).formatted ) { strcpy(buf, " "); p_buf_cur += 3; } /* scroll thourgh the current line of text and wrap it so it fits to width of the edit control */ while( *p_cur ) { char *p_word_pos = p_buf_cur; /* copy one word into the buffer */ while( *p_cur && isspace(*p_cur) ) if( p_buf_cur!=buf ) *p_buf_cur++ = *p_cur++; else p_cur++; while( *p_cur && !isspace(*p_cur) ) *p_buf_cur++ = *p_cur++; /* check if it fits */ SetRect( &rt_text, 0, 0, size_text.cx, size_text.cy ); DrawText(hdcEdit, NH_A2W(buf, tbuf, p_buf_cur-buf), p_buf_cur-buf, &rt_text, DT_CALCRECT | DT_LEFT | DT_SINGLELINE | DT_NOCLIP); if( (rt_text.right - rt_text.left)>=size_text.cx ) { /* Backtrack. Only backtrack if the last word caused the overflow - do not backtrack if the entire current line does not fit the visible area. Otherwise it is a infinite loop. */ if( p_word_pos>buf ) { p_cur -= (p_buf_cur-p_word_pos); p_buf_cur = p_word_pos; } *p_buf_cur = 0; /* break the line */ /* append the calculated line to the text buffer */ pText = nh_append(pText, &pTextSize, buf); pText = nh_append(pText, &pTextSize, "\r\n"); ZeroMemory(buf, sizeof(buf)); p_buf_cur = buf; } } /* always break the line at the end of the buffer text */ if( p_buf_cur != buf ) { /* flush the current buffrer */ *p_buf_cur = 0; /* break the line */ pText = nh_append(pText, &pTextSize, buf); pText = nh_append(pText, &pTextSize, "\r\n"); ZeroMemory(buf, sizeof(buf)); p_buf_cur = buf; } } else { /* do not wrap text */ int j; for( j=0; j #define SHMENUBAR RCDATA #if (defined(WIN32_PLATFORM_PSPC) || defined(WIN32_PLATFORM_WFSP)) && (_WIN32_WCE >= 300) #include #else #define I_IMAGENONE (-2) #define NOMENU 0xFFFF #define IDS_SHNEW 1 #define IDM_SHAREDNEW 10 #define IDM_SHAREDNEWDEFAULT 11 #endif #endif // _WIN32_WCE #ifdef RC_INVOKED #ifndef _INC_WINDOWS #define _INC_WINDOWS #include "winuser.h" // extract from windows header #endif #endif #ifdef IDC_STATIC #undef IDC_STATIC #endif #define IDC_STATIC (-1) #endif //__NEWRES_H__ slashem-0.0.7E7F3/sys/wince/Install.ce0000664000076400007640000001343710545462317015526 0ustar alialiCopyright (c) Alex Kompel, 2002 NetHack may be freely redistributed. See license for details. ======================================================================== Instructions for compiling and installing NetHack 3.4.3 on a Windows CE or PocketPC system ======================================================================== Last revision: $Date: 2003/12/11 09:49:08 $ Credit for the porting of NetHack to Windows CE goes to Alex Kompel who initially developed and contributed the port. In order to build NetHack for Windows CE, you need *both* of the following: o A copy of Microsoft Visual C V6.0 SP3 or later. Things may work with an earlier version of the compiler, but the current code has not been tested with an earlier version. o Embedded Visual C++ 3.0 or later FIRST STEP: The first step in building NetHack for Windows CE is to execute sys/wince/cesetup.bat. From the command prompt: cd sys\wince cesetup From a Windows explorer window: double-click on cesetup.bat A "wince" directory will be created off the top of the NetHack source tree, and a Microsoft embedded C workspace file will be placed in the top of the NetHack source tree. ------------ | BUILDING | ------------ Boostrapping the build process on Windows NT/2000/XP 1. With the Visual C++ 6.0 tools in your path, Run "nmake /f bootstrp.mak" from the wince folder. Compiling 2. Start the Embedded Visual C IDE. In the Embedded Visual C IDE Menus, choose: File | Open Workspace 3. Set up for the build. o In the Visual C "Open Workspace" dialog box, navigate to the top of your NetHack source directory tree. In there, highlight "wince.vcw" and click on Open. Once the workspace has been opened, you should see the following list in the Visual C selection window: + nethack_hpc files + nethack_palm_pc files + nethack_pocket_pc files + nethack_smartphone files o On the Embedded Visual C menus, choose: Build | Set Active Platform Select the platform that corresponds to your device: Palm-size PC 2.11 - palm size PC running Windows CE version 2.11 Pocket PC - palm-size PC running Windows CE 3.0 and higher (PocketPC) H/PC Pro 2.11 - handheld computers running Windows CE 2.11 anf higher Smartphone 2002 - Microsoft SmartPhone device o On the Visual C menus again, choose either: Build | Set Active Configuration where configuration is one of the following (make sure it matches the platform you have selected): nethack_hpc - Win32 (WCE MIPS) HPCRelease - H/PC Pro 2.11 MIPS processor release executable nethack_hpc - Win32 (WCE x86em) HPCDebug - H/PC Pro 2.11 x86 emulation debug executable nethack_hpc - Win32 (WCE ARM) HPCRelease - H/PC Pro 2.11 ARM processor release executable nethack_hpc - Win32 (WCE SH3) HPCRelease - H/PC Pro 2.11 SH3 processor release executable nethack_hpc - Win32 (WCE x86em) HPCRelease - H/PC Pro 2.11 x86 emulation release executable nethack_hpc - Win32 (WCE SH4) HPCRelease - H/PC Pro 2.11 SH4 processor release executable nethack_palm_pc - Win32 (WCE MIPS) PalmPCRelease - Palm-size PC 2.11 MIPS processor release executable nethack_palm_pc - Win32 (WCE x86em) PalmPCDebug - Palm-size PC 2.11 x86 emulation debug executable nethack_palm_pc - Win32 (WCE SH3) PalmPCRelease - Palm-size PC 2.11 SH3 processor release executable nethack_palm_pc - Win32 (WCE x86em) PalmPCRelease - Palm-size PC 2.11 x86 emulation release executable nethack_pocket_pc - Win32 (WCE MIPS) PocketPCRelease - Pocket PC MIPS processor release executable nethack_pocket_pc - Win32 (WCE ARM) PocketPCRelease - Pocket PC ARM processor release executable nethack_pocket_pc - Win32 (WCE x86em) PocketPCRelease - Pocket PC x86 emulation release executable nethack_pocket_pc - Win32 (WCE x86em) PocketPCDebug - Pocket PC x86 emulation debug executable nethack_pocket_pc - Win32 (WCE SH3) PocketPCRelease - Pocket PC SH3 processor release executable nethack_smartphone - Win32 (WCE ARM) SPhoneRelease - Smartphone 2002 ARM processor release executable nethack_smartphone - Win32 (WCE x86em) SPhoneDebug - Smartphone 2002 x86 emulation debug executable Building 4. Start your build. o On the Embedded Visual C menus once again, choose: Build | Build nethackm.exe This starts the build. It is likely that the IDE message window where you are doing the compiling will be occupied for a while. Notes: o You may get a bunch of warnings regarding missing include files in the beginning of the build process - ignore them. For some reason the tool that produces these messages ignores preprocessor directives. The actual build will go just fine. o Sometimes the compiler chokes on do_wear.c Ignore that - let the build finish. Then run it again - it will compile just fine. (Seems to be some sort of bug in EVC++) Transfer 5. Transfer the files and executables to your handheld by extracting the files into some folder on the CE device - that should do it. Notes If you want to use IBMGraphics make sure that you have a proper font installed on the device that supports OEM character set (for example, Lucida Console) PROBLEMS If you discover a bug and wish to report it, or if you have comments or suggestions we recommend using our "Contact Us" web page at: http://www.nethack.org/common/contact.html If you don't have access to the web, or you want to send us a patch to the NetHack source code feel free to drop us a line c/o: DevTeam (at) nethack.org Happy NetHacking! slashem-0.0.7E7F3/sys/wince/mhmap.h0000664000076400007640000000102310545462317015046 0ustar aliali/* 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 #define DEF_CLIPAROUND_AMOUNT 1 #endif /* MSWINMapWindow_h */ slashem-0.0.7E7F3/sys/wince/mhfont.c0000664000076400007640000001511110545462317015235 0ustar aliali/* Copyright (C) 2001 by Alex Kompel */ /* NetHack may be freely redistributed. See license for details. */ /* font management and such */ #include "mhfont.h" #define MAXFONTS 64 /* font table - 64 fonts ought to be enough */ static struct font_table_entry { int code; HFONT hFont; } font_table[MAXFONTS] ; static int font_table_size = 0; HFONT version_splash_font; HFONT extrainfo_splash_font; #define NHFONT_CODE(win, attr) (((attr&0xFF)<<8)|(win_type&0xFF)) static void __cdecl font_table_cleanup(void); /* create font based on window type, charater attributes and window device context */ HGDIOBJ mswin_get_font(int win_type, int attr, HDC hdc, BOOL replace) { HFONT fnt = NULL; LOGFONT lgfnt; int font_size; int font_index; static BOOL once = FALSE; if( !once ) { once = TRUE; atexit(font_table_cleanup); } ZeroMemory( &lgfnt, sizeof(lgfnt) ); /* try find font in the table */ for(font_index=0; font_index=MAXFONTS ) panic( "font table overflow!" ); font_table_size++; } else { DeleteObject(font_table[font_index].hFont); } font_table[font_index].code = NHFONT_CODE(win_type, attr); font_table[font_index].hFont = fnt; return fnt; } UINT mswin_charset() { CHARSETINFO cis; if( iflags.IBMgraphics ) if( TranslateCharsetInfo((DWORD*)GetOEMCP(), &cis, TCI_SRCCODEPAGE) ) return cis.ciCharset; else return OEM_CHARSET; else if( TranslateCharsetInfo((DWORD*)GetACP(), &cis, TCI_SRCCODEPAGE) ) return cis.ciCharset; else return ANSI_CHARSET; } void __cdecl font_table_cleanup(void) { int i; for(i=0; i #include "mhcmd.h" #include "mhinput.h" #include "mhcolor.h" static TCHAR szNHCmdWindowClass[] = TEXT("MSNethackCmdWndClass"); #ifndef C # define C(c) (0x1f & (c)) #endif /* cell status 0 */ #define NH_CST_CHECKED 1 /* fonts */ #define NH_CMDPAD_FONT_NORMAL 0 #define NH_CMDPAD_FONT_MAX 0 /* type of the cell */ #define NH_CELL_REG 0 #define NH_CELL_CTRL 1 #define NH_CELL_CAP 2 #define NH_CELL_SHIFT 3 #define NH_CELL_LAYOUT_NEW 4 #define NH_CELL_LAYOUT_MENU 5 #define NH_CMDSET_MAXSIZE 64 /* Keypad cell information NHCmdPadCell.cell_type NHCmdPadCell.data ----------- ---------- NH_CELL_REG (int)>=0 - index in the current keypad layout set (loads a new layout) -1 - restore default (saved) layout NH_CELL_CTRL not used NH_CELL_CAP not used NH_CELL_SHIFT not used NH_CELL_LAYOUT_NEW pointer to the new keypad layout layout (NHCmdLayout*) NH_CELL_LAYOUT_MENU pointer to the layout set (NHCmdSet* - if NULL then nhcmdset_default is used) */ typedef struct t_NHCmdPadCell { UINT cmd_code; /* Windows command code (menu processing - not implemented - set to -1) */ char f_char[16]; /* nethack char */ char text[16]; /* display text */ int image; /* >0 - image ID in IDB_KEYPAD bitmap <=0 - absolute index of the font table */ int type; /* cell type */ int mult; /* cell width multiplier */ void* data; /* internal data for the cell type */ } NHCmdPadCell, *PNHCmdPadCell; /* command layout */ typedef struct t_NHCmdLayout { char name[64]; int rows; int columns; NHCmdPadCell cells[]; } NHCmdLayout, *PNHCmdLayout; /* set of command layouts */ typedef struct t_NHCmdSet { int count; struct t_NHCmdSetElem { PNHCmdLayout layout; BOOL free_on_destroy; } elements[NH_CMDSET_MAXSIZE]; } NHCmdSet, *PNHCmdSet; /* display cell layout */ typedef struct t_NHCmdPadLayoutCell { POINT orig; /* origin of the cell rect */ BYTE type; /* cell type */ int state; /* cell state */ } NHCmdPadLayoutCell, *PNHCmdPadLayoutCell; /* command window data */ typedef struct mswin_nethack_cmd_window { SIZE cell_size; /* cell size */ HFONT font[NH_CMDPAD_FONT_MAX+1]; /* fonts for cell text */ HBITMAP images; /* key images map */ int active_cell; /* current active cell */ boolean is_caps; /* is CAPS selected */ boolean is_ctrl; /* is CRTL selected */ boolean is_shift; /* is SHIFT selected */ PNHCmdLayout layout_current; /* current layout */ PNHCmdLayout layout_save; /* saved layout */ PNHCmdPadLayoutCell cells; /* display cells */ #if defined(WIN_CE_SMARTPHONE) PNHCmdLayout layout_selected; /* since we use layout command for menu also we need to store the layout that was selected by a user */ #endif } NHCmdWindow, *PNHCmdWindow; LRESULT CALLBACK NHCommandWndProc(HWND, UINT, WPARAM, LPARAM); static void register_command_window_class(); static void LayoutCmdWindow(HWND hWnd); static void SetCmdWindowLayout(HWND hWnd, PNHCmdLayout layout); static int CellFromPoint(PNHCmdWindow data, POINT pt ); static void CalculateCellSize(HWND hWnd, LPSIZE pSize, LPSIZE windowSize); static void HighlightCell(HWND hWnd, int cell, BOOL isSelected); static void ActivateCell(HWND hWnd, int cell); static void PushNethackCommand( const char* cmd_char_str, int is_ctrl ); /*------------------- keyboard keys layout functions -----------------------*/ PNHCmdLayout nhcmdlayout_create( const char* name, int rows, int columns ); void nhcmdlayout_init( PNHCmdLayout p, PNHCmdPadCell cells ); #define nhcmdlayout_rows(p) ((p)->rows) #define nhcmdlayout_columns(p) ((p)->columns) #define nhcmdlayout_row(p, x) (&((p)->cells[(p)->columns*(x)])) #define nhcmdlayout_cell(p, x, y) (&((p)->cells[(p)->columns*(x)+(y)])) #define nhcmdlayout_cell_direct(p, i) (&((p)->cells[(i)])) void nhcmdlayout_destroy(PNHCmdLayout p); /*----------------- keyboard keys layout set functions ---------------------*/ PNHCmdSet nhcmdset_create(); int nhcmdset_count( PNHCmdSet p ); PNHCmdLayout nhcmdset_get( PNHCmdSet p, int index ); const char* nhcmdset_get_name( PNHCmdSet p, int index ); void nhcmdset_add( PNHCmdSet p, PNHCmdLayout layout ); void nhcmdset_destroy( PNHCmdSet p); /*-------------------- message handlers -----------------------------------*/ static void onPaint(HWND hWnd); // on WM_PAINT static void onCreate(HWND hWnd, WPARAM wParam, LPARAM lParam); // on WM_CREATE static void onMouseDown(HWND hWnd, WPARAM wParam, LPARAM lParam); // on WM_LBUTTONDOWN static void onMouseMove(HWND hWnd, WPARAM wParam, LPARAM lParam); // on WM_MOUSEMOVE static void onMouseUp(HWND hWnd, WPARAM wParam, LPARAM lParam); // on WM_LBUTTONUP /*----------------------- static data -------------------------------------*/ static PNHCmdSet nhcmdset_current = 0; static PNHCmdSet nhcmdset_default = 0; /*---------------------- Pre-definde keyboard layouts --------------------*/ #ifdef WIN_CE_SMARTPHONE /* dimensions of the command pad */ #define NH_CMDPAD_ROWS 4 #define NH_CMDPAD_COLS 3 #define NH_CMDPAD_CELLNUM (NH_CMDPAD_COLS*NH_CMDPAD_ROWS) /* layout indexes */ #define NH_LAYOUT_GENERAL 0 #define NH_LAYOUT_MOVEMENT 1 #define NH_LAYOUT_ATTACK 2 #define NH_LAYOUT_ITEM_HANDLING 3 #define NH_LAYOUT_CONTROLS 4 #define NH_LAYOUT_ADV_MOVEMENT 5 /* template menu layout */ NHCmdPadCell cells_layout_menu[NH_CMDPAD_CELLNUM] = { { -1, "", "", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1 , (void*)-1 }, { -1, "", "", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1 , (void*)-1 }, { -1, "", "", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1 , (void*)-1 }, { -1, "", "", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1 , (void*)-1 }, { -1, "", "", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1 , (void*)-1 }, { -1, "", "", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1 , (void*)-1 }, { -1, "", "", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1 , (void*)-1 }, { -1, "", "", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1 , (void*)-1 }, { -1, "", "", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1 , (void*)-1 }, { -1, "", "<<", -NH_CMDPAD_FONT_NORMAL, NH_CELL_LAYOUT_NEW, 1 , NULL }, { -1, "", "", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1 , (void*)-1 }, { -1, "", ">>", -NH_CMDPAD_FONT_NORMAL, NH_CELL_LAYOUT_NEW, 1 , NULL } }; /* movement layout */ NHCmdPadCell cells_layout_movement[NH_CMDPAD_CELLNUM] = { { -1, "7", "7", 1, NH_CELL_REG, 1, (void*)-1 }, { -1, "8", "8", 2, NH_CELL_REG, 1, (void*)-1 }, { -1, "9", "9", 3, NH_CELL_REG, 1, (void*)-1 }, { -1, "4", "4", 4, NH_CELL_REG, 1, (void*)-1 }, { -1, ".", ".", 5, NH_CELL_REG, 1, (void*)-1 }, { -1, "6", "6", 6, NH_CELL_REG, 1, (void*)-1 }, { -1, "1", "1", 7, NH_CELL_REG, 1, (void*)-1 }, { -1, "2", "2", 8, NH_CELL_REG, 1, (void*)-1 }, { -1, "3", "3", 9, NH_CELL_REG, 1, (void*)-1 }, { -1, "<", "<", 10, NH_CELL_REG, 1, (void*)-1 }, { -1, ">", ">", 12, NH_CELL_REG, 1, (void*)-1 }, { -1, "X", "X", 13, NH_CELL_LAYOUT_MENU, 1, 0 } }; /* attack layout */ NHCmdPadCell cells_layout_attack[NH_CMDPAD_CELLNUM] = { { -1, "t", "t", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "w", "w", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "x", "x", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "f", "f", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "z", "z", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "Z", "Z", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "r", "r", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "a", "a", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "q", "q", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "\x04", "^D", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "F", "F", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "X", "X", 13, NH_CELL_LAYOUT_MENU, 1 , 0 } }; /* item handling layout */ NHCmdPadCell cells_layout_item_handling[NH_CMDPAD_CELLNUM] = { { -1, "W", "W", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "P", "P", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "d", "d", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "T", "T", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "R", "R", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "D", "D", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "=", "=", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "i", "i", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "[", "[", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "A", "A", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "I", "I", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "X", "X", 13, NH_CELL_LAYOUT_MENU, 1 , 0 } }; /* General */ NHCmdPadCell cells_layout_general[NH_CMDPAD_CELLNUM] = { { -1, "q", "q", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "e", "e", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "l", "l", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "s", "s", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "E", "E", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "\x04", "^D", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "c", "c", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "o", "o", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "p", "p", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, ":", ":", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, ",", ",", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "X", "X", 13, NH_CELL_LAYOUT_MENU, 1 , 0 } }; /* game controls layout */ NHCmdPadCell cells_layout_game[NH_CMDPAD_CELLNUM] = { { -1, "S", "S", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "h", "h", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "C", "C", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "@", "@", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "\\", "\\", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "O", "O", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "&", "&", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "\x18", "^X", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "\x10", "^P", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "X", "X", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "#", "#", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "X", "X", 13, NH_CELL_LAYOUT_MENU, 1 , 0 } }; /* advanced movement layout */ NHCmdPadCell cells_layout_adv_movement[NH_CMDPAD_CELLNUM] = { { -1, "g", "g", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)NH_LAYOUT_MOVEMENT }, { -1, "G", "G", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)NH_LAYOUT_MOVEMENT }, { -1, "m", "m", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)NH_LAYOUT_MOVEMENT }, { -1, "M", "M", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)NH_LAYOUT_MOVEMENT }, { -1, "_", "_", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "\x14", "^T", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "j", "j", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "", "", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "", "", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "", "", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "", "", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "X", "X", 13, NH_CELL_LAYOUT_MENU, 1 , 0 } }; #else /* !WIN_CE_SMARTPHONE */ /* dimensions of the command pad */ #define NH_CMDPAD_ROWS 4 #define NH_CMDPAD_COLS 14 #define NH_CMDPAD_CELLNUM (NH_CMDPAD_COLS*NH_CMDPAD_ROWS) /* lowercase layout */ NHCmdPadCell cells_layout_mod1[NH_CMDPAD_ROWS*NH_CMDPAD_COLS] = { { -1, "7", "7", 1, NH_CELL_REG, 1, (void*)-1 }, { -1, "8", "8", 2, NH_CELL_REG, 1, (void*)-1 }, { -1, "9", "9", 3, NH_CELL_REG, 1, (void*)-1 }, { -1, "\x1b", "Esc", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 2 , NULL }, { -1, " ", "", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 0 , NULL }, /* complement for ESC */ { -1, "?", "?", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "*", "*", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, ",", ",", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "/", "/", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, ":", ":", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, ";", ";", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "-", "-", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "#", "#", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "^", "^", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "4", "4", 4, NH_CELL_REG, 1, (void*)-1 }, { -1, "5", "5", 5, NH_CELL_REG, 1, (void*)-1 }, { -1, "6", "6", 6, NH_CELL_REG, 1, (void*)-1 }, { -1, " ", "CAP", -NH_CMDPAD_FONT_NORMAL, NH_CELL_CAP, 2 , NULL }, { -1, " ", "", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 0 , NULL }, /* complement for CAPS */ { -1, "a", "a", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "b", "b", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "c", "c", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "d", "d", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "e", "e", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "f", "f", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "g", "g", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "h", "h", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "i", "i", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "1", "1", 7, NH_CELL_REG, 1, (void*)-1 }, { -1, "2", "2", 8, NH_CELL_REG, 1, (void*)-1 }, { -1, "3", "3", 9, NH_CELL_REG, 1, (void*)-1 }, { -1, " ", "Shft", -NH_CMDPAD_FONT_NORMAL, NH_CELL_SHIFT, 2 , NULL }, { -1, " ", "", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 0 , NULL }, /* complement for shift */ { -1, "j", "j", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "k", "k", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "l", "l", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "m", "m", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "n", "n", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "o", "o", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "p", "p", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "q", "q", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "r", "r", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "<", "<", 10, NH_CELL_REG, 1, (void*)-1 }, { -1, ".", ".", 11, NH_CELL_REG, 1, (void*)-1 }, { -1, ">", ">", 12, NH_CELL_REG, 1, (void*)-1 }, { -1, " ", "Ctrl", -NH_CMDPAD_FONT_NORMAL, NH_CELL_CTRL, 2 , NULL }, { -1, " ", "", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 0 , NULL }, /* complement for CTRL */ { -1, "s", "s", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "t", "t", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "u", "u", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "v", "v", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "w", "w", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "x", "x", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "y", "y", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "z", "z", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "\\", "\\", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 } }; /* uppercase layout */ NHCmdPadCell cells_layout_mod2[-NH_CMDPAD_ROWS*-NH_CMDPAD_COLS] = { { -1, "7", "7", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "8", "8", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "9", "9", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "\x1b", "Esc", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 2 , NULL }, { -1, " ", "", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 0 , NULL }, /* complement for ESC */ { -1, "?", "?", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "*", "*", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "[", "[", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "(", "(", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, ")", ")", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "+", "+", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "=", "=", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "\"", "\"", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "$", "$", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "4", "4", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "5", "5", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "6", "6", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, " ", "CAP", -NH_CMDPAD_FONT_NORMAL, NH_CELL_CAP, 2 , NULL }, { -1, " ", "", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 0 , NULL }, /* complement for CAPS */ { -1, "A", "A", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "B", "B", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "C", "C", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "D", "D", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "E", "E", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "F", "F", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "G", "G", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "H", "H", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "I", "I", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "1", "1", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "2", "2", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "3", "3", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, " ", "Shft", -NH_CMDPAD_FONT_NORMAL, NH_CELL_SHIFT, 2 , NULL }, { -1, " ", "", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 0 , NULL }, /* complement for shift */ { -1, "J", "J", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "K", "K", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "L", "L", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "M", "M", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "N", "N", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "O", "O", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "P", "P", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "Q", "Q", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "R", "R", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "<", "<", 10, NH_CELL_REG, 1, (void*)-1 }, { -1, "0", "0", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, ">", ">", 12, NH_CELL_REG, 1, (void*)-1 }, { -1, " ", "Ctrl", -NH_CMDPAD_FONT_NORMAL, NH_CELL_CTRL, 2 , NULL }, { -1, " ", "", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 0 , NULL }, /* complement for CTRL */ { -1, "S", "S", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "T", "T", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "U", "U", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "V", "V", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "W", "W", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "X", "X", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "Y", "Y", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "Z", "Z", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 }, { -1, "@", "@", -NH_CMDPAD_FONT_NORMAL, NH_CELL_REG, 1, (void*)-1 } }; #endif /* !WIN_CE_SMARTPHONE */ /*-------------------------------------------------------------------------*/ HWND mswin_init_command_window () { static int run_once = 0; HWND ret; /* register window class */ if( !run_once ) { register_command_window_class(); run_once = 1; } /* create window */ ret = CreateWindow( szNHCmdWindowClass, /* registered class name */ NULL, /* window name */ WS_CHILD | WS_CLIPSIBLINGS, /* window style */ 0, /* horizontal position of window - set it later */ 0, /* vertical position of window - set it later */ 0, /* window width - set it later */ 0, /* window height - set it later*/ GetNHApp()->hMainWnd, /* handle to parent or owner window */ NULL, /* menu handle or child identifier */ GetNHApp()->hApp, /* handle to application instance */ NULL ); /* window-creation data */ if( !ret ) { panic("Cannot create command window"); } return ret; } /*-------------------------------------------------------------------------*/ /* calculate mimimum window size */ void mswin_command_window_size (HWND hwnd, LPSIZE sz) { SIZE cell_size; PNHCmdWindow data; data = (PNHCmdWindow)GetWindowLong(hwnd, GWL_USERDATA); if( !data ) { sz->cx = sz->cy = 0; } else { CalculateCellSize(hwnd, &cell_size, sz); sz->cx = max( cell_size.cx*nhcmdlayout_columns(data->layout_current)+2*GetSystemMetrics(SM_CXBORDER), sz->cx ); sz->cy = max( cell_size.cy*nhcmdlayout_rows(data->layout_current)+2*GetSystemMetrics(SM_CYBORDER), sz->cy ); } } /*-------------------------------------------------------------------------*/ void register_command_window_class() { WNDCLASS wcex; PNHCmdLayout plt; ZeroMemory( &wcex, sizeof(wcex)); /* window class */ wcex.style = CS_NOCLOSE; wcex.lpfnWndProc = (WNDPROC)NHCommandWndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = GetNHApp()->hApp; wcex.hIcon = NULL; wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = mswin_get_brush(NHW_KEYPAD, MSWIN_COLOR_BG); wcex.lpszMenuName = NULL; wcex.lpszClassName = szNHCmdWindowClass; if( !RegisterClass(&wcex) ) { panic("cannot register Map window class"); } /* create default command set */ nhcmdset_current = nhcmdset_default = nhcmdset_create(); #ifdef WIN_CE_SMARTPHONE plt = nhcmdlayout_create("General", NH_CMDPAD_ROWS, NH_CMDPAD_COLS); nhcmdlayout_init(plt, cells_layout_general); nhcmdset_add(nhcmdset_current, plt); plt = nhcmdlayout_create("Movement", NH_CMDPAD_ROWS, NH_CMDPAD_COLS); nhcmdlayout_init(plt, cells_layout_movement); nhcmdset_add(nhcmdset_current, plt ); plt = nhcmdlayout_create("Attack", NH_CMDPAD_ROWS, NH_CMDPAD_COLS); nhcmdlayout_init(plt, cells_layout_attack); nhcmdset_add(nhcmdset_current, plt); plt = nhcmdlayout_create("Item Handling", NH_CMDPAD_ROWS, NH_CMDPAD_COLS); nhcmdlayout_init(plt, cells_layout_item_handling); nhcmdset_add(nhcmdset_current, plt); plt = nhcmdlayout_create("Game Controls", NH_CMDPAD_ROWS, NH_CMDPAD_COLS); nhcmdlayout_init(plt, cells_layout_game); nhcmdset_add(nhcmdset_current, plt); plt = nhcmdlayout_create("Advanced Movement", NH_CMDPAD_ROWS, NH_CMDPAD_COLS); nhcmdlayout_init(plt, cells_layout_adv_movement); nhcmdset_add(nhcmdset_current, plt); #else /* ! WIN_CE_SMARTPHONE */ plt = nhcmdlayout_create("lowercase", NH_CMDPAD_ROWS, NH_CMDPAD_COLS); nhcmdlayout_init(plt, cells_layout_mod1); nhcmdset_add(nhcmdset_current, plt); plt = nhcmdlayout_create("uppercase", NH_CMDPAD_ROWS, NH_CMDPAD_COLS); nhcmdlayout_init(plt, cells_layout_mod2); nhcmdset_add(nhcmdset_current, plt); #endif /* WIN_CE_SMARTPHONE */ } /*-------------------------------------------------------------------------*/ LRESULT CALLBACK NHCommandWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { PNHCmdWindow data; int i; switch (message) { case WM_CREATE: onCreate( hWnd, wParam, lParam ); break; case WM_PAINT: onPaint(hWnd); break; case WM_SIZE: LayoutCmdWindow(hWnd); break; case WM_LBUTTONDOWN: onMouseDown(hWnd, wParam, lParam); return 0; case WM_MOUSEMOVE: /* proceed only if if have mouse focus (set in onMouseDown() - left mouse button is pressed) */ if( GetCapture()==hWnd ) { onMouseMove(hWnd, wParam, lParam); return 0; } else { return 1; } break; case WM_LBUTTONUP: /* proceed only if if have mouse focus (set in onMouseDown()) */ if( GetCapture()==hWnd ) { onMouseUp(hWnd, wParam, lParam); return 0; } else { return 1; } break; case WM_DESTROY: data = (PNHCmdWindow)GetWindowLong(hWnd, GWL_USERDATA); for(i=0; i<=NH_CMDPAD_FONT_MAX; i++ ) if( data->font[i] ) DeleteObject(data->font[i]); free(data); SetWindowLong(hWnd, GWL_USERDATA, (LONG)0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return FALSE; } /*-------------------------------------------------------------------------*/ void onPaint(HWND hWnd) { PNHCmdWindow data; PAINTSTRUCT ps; HDC hDC; int x, y; TCHAR wbuf[BUFSZ]; HGDIOBJ saveFont; BITMAP bm; int cell_index; /* get window data */ data = (PNHCmdWindow)GetWindowLong(hWnd, GWL_USERDATA); hDC = BeginPaint(hWnd, &ps); if( !IsRectEmpty(&ps.rcPaint) ) { HGDIOBJ oldBr; HBRUSH hbrPattern; COLORREF OldBg, OldFg; HPEN hPen; HGDIOBJ hOldPen; saveFont = SelectObject(hDC, data->font[NH_CMDPAD_FONT_NORMAL]); OldBg = SetBkColor(hDC, mswin_get_color(NHW_KEYPAD, MSWIN_COLOR_BG)); OldFg = SetTextColor(hDC, mswin_get_color(NHW_KEYPAD, MSWIN_COLOR_FG)); GetObject(data->images, sizeof(BITMAP), (LPVOID)&bm); hbrPattern = CreatePatternBrush(data->images); hPen = CreatePen(PS_SOLID, 1, mswin_get_color(NHW_KEYPAD, MSWIN_COLOR_FG)); for( x=0, cell_index = 0; xlayout_current); x++ ) for( y=0; ylayout_current); y++, cell_index++ ) { RECT cell_rt; POINT pt[5]; PNHCmdPadCell p_cell_data; p_cell_data = nhcmdlayout_cell_direct(data->layout_current, cell_index); /* calculate the cell rectangle */ cell_rt.left = data->cells[cell_index].orig.x; cell_rt.top = data->cells[cell_index].orig.y; cell_rt.right = data->cells[cell_index].orig.x + data->cell_size.cx*p_cell_data->mult; cell_rt.bottom = data->cells[cell_index].orig.y + data->cell_size.cy; /* draw border */ hOldPen = SelectObject(hDC, hPen); pt[0].x = cell_rt.left; pt[0].y = cell_rt.top; pt[1].x = cell_rt.right; pt[1].y = cell_rt.top; pt[2].x = cell_rt.right; pt[2].y = cell_rt.bottom; pt[3].x = cell_rt.left; pt[3].y = cell_rt.bottom; pt[4].x = cell_rt.left; pt[4].y = cell_rt.top; Polyline(hDC, pt, 5); SelectObject(hDC, hOldPen); /* calculate clipping rectangle for the text */ cell_rt.left++; cell_rt.top ++; cell_rt.right--; cell_rt.bottom--; /* draw the cell text */ if( p_cell_data->image<=0 ) { SelectObject(hDC, data->font[ -p_cell_data->image ]); DrawText(hDC, NH_A2W(p_cell_data->text, wbuf, BUFSZ), strlen(p_cell_data->text), &cell_rt, DT_CENTER | DT_VCENTER | DT_SINGLELINE | DT_NOPREFIX ); } else { /* draw bitmap */ int bmOffset; RECT bitmap_rt; bmOffset = (p_cell_data->image - 1)*bm.bmHeight; bitmap_rt.left = ((cell_rt.left+cell_rt.right) - min(bm.bmHeight, (cell_rt.right-cell_rt.left)))/2; bitmap_rt.top = ((cell_rt.bottom+cell_rt.top) - min(bm.bmHeight, (cell_rt.bottom-cell_rt.top)))/2; bitmap_rt.right = bitmap_rt.left + min(bm.bmHeight, (cell_rt.right-cell_rt.left)); bitmap_rt.bottom = bitmap_rt.top + min(bm.bmHeight, (cell_rt.bottom-cell_rt.top)); SetBrushOrgEx(hDC, bitmap_rt.left-bmOffset, bitmap_rt.top, NULL); oldBr = SelectObject(hDC, hbrPattern); PatBlt( hDC, bitmap_rt.left, bitmap_rt.top, bitmap_rt.right-bitmap_rt.left, bitmap_rt.bottom-bitmap_rt.top, PATCOPY); SelectObject(hDC, oldBr); } /* invert the cell if it is selected */ if( data->cells[cell_index].state == NH_CST_CHECKED ) { IntersectRect( &cell_rt, &cell_rt, &ps.rcPaint); PatBlt( hDC, cell_rt.left, cell_rt.top, cell_rt.right - cell_rt.left, cell_rt.bottom - cell_rt.top, DSTINVERT ); } } SetTextColor(hDC, OldFg); SetBkColor(hDC, OldBg); SelectObject(hDC, saveFont); DeleteObject(hbrPattern); DeleteObject(hPen); } EndPaint(hWnd, &ps); } /*-------------------------------------------------------------------------*/ void onCreate(HWND hWnd, WPARAM wParam, LPARAM lParam) { PNHCmdWindow data; /* set window data */ data = (PNHCmdWindow)malloc(sizeof(NHCmdWindow)); if( !data ) panic("out of memory"); ZeroMemory(data, sizeof(NHCmdWindow)); SetWindowLong(hWnd, GWL_USERDATA, (LONG)data); data->active_cell = -1; /* load images bitmap */ data->images = LoadBitmap(GetNHApp()->hApp, MAKEINTRESOURCE(IDB_KEYPAD)); if( !data->images ) panic("cannot load keypad bitmap"); /* create default layouts */ data->layout_current = 0; data->layout_save = 0; data->cells = 0; #if defined(WIN_CE_SMARTPHONE) data->layout_selected = nhcmdset_get(nhcmdset_current, 0); #endif /* set default layout */ SetCmdWindowLayout(hWnd, nhcmdset_get(nhcmdset_current, 0)); } /*-------------------------------------------------------------------------*/ void LayoutCmdWindow(HWND hWnd) { RECT clrt; SIZE windowSize; PNHCmdWindow data; int i, j; int x, y; LOGFONT lgfnt; int index; GetClientRect(hWnd, &clrt); if( IsRectEmpty(&clrt) ) return; data = (PNHCmdWindow)GetWindowLong(hWnd, GWL_USERDATA); if( !data->layout_current ) return; /* calculate cell size */ windowSize.cx = clrt.right-clrt.left; windowSize.cy = clrt.bottom-clrt.top; CalculateCellSize(hWnd, &data->cell_size, &windowSize); /* initialize display cells aray */ x = 0; y = 0; for( i=0, index=0; ilayout_current); i++ ) { for( j=0; jlayout_current); j++, index++ ) { data->cells[index].orig.x = x; data->cells[index].orig.y = y; data->cells[index].type = nhcmdlayout_cell_direct(data->layout_current, index)->type; switch(data->cells[index].type) { case NH_CELL_CTRL: data->cells[index].state = data->is_ctrl? NH_CST_CHECKED : 0; break; case NH_CELL_CAP: data->cells[index].state = data->is_caps? NH_CST_CHECKED : 0; break; case NH_CELL_SHIFT: data->cells[index].state = data->is_shift? NH_CST_CHECKED : 0; break; default: data->cells[index].state = 0; } x += data->cell_size.cx * nhcmdlayout_cell_direct(data->layout_current, index)->mult; } x = 0; y += data->cell_size.cy; } /* create font for display cell text */ for(i=0; i<=NH_CMDPAD_FONT_MAX; i++ ) if( data->font[i] ) DeleteObject(data->font[i]); ZeroMemory( &lgfnt, sizeof(lgfnt) ); lgfnt.lfHeight = data->cell_size.cy; // height of font lgfnt.lfWidth = 0; // average character width lgfnt.lfEscapement = 0; // angle of escapement lgfnt.lfOrientation = 0; // base-line orientation angle lgfnt.lfWeight = FW_NORMAL; // font weight lgfnt.lfItalic = FALSE; // italic attribute option lgfnt.lfUnderline = FALSE; // underline attribute option lgfnt.lfStrikeOut = FALSE; // strikeout attribute option lgfnt.lfCharSet = ANSI_CHARSET; // character set identifier lgfnt.lfOutPrecision = OUT_DEFAULT_PRECIS; // output precision lgfnt.lfClipPrecision = CLIP_CHARACTER_PRECIS; // clipping precision lgfnt.lfQuality = DEFAULT_QUALITY; // output quality if( iflags.wc_font_message && *iflags.wc_font_message ) { lgfnt.lfPitchAndFamily = DEFAULT_PITCH; // pitch and family NH_A2W( iflags.wc_font_message, lgfnt.lfFaceName, LF_FACESIZE); } else { lgfnt.lfPitchAndFamily = VARIABLE_PITCH; // pitch and family } data->font[NH_CMDPAD_FONT_NORMAL] = CreateFontIndirect(&lgfnt); InvalidateRect(hWnd, NULL, TRUE); } /*-------------------------------------------------------------------------*/ void SetCmdWindowLayout(HWND hWnd, PNHCmdLayout layout) { PNHCmdWindow data; int size; data = (PNHCmdWindow)GetWindowLong(hWnd, GWL_USERDATA); if( data->layout_current == layout ) return; data->layout_current = layout; size = sizeof(NHCmdPadLayoutCell)*nhcmdlayout_rows(layout)*nhcmdlayout_columns(layout); data->cells = (PNHCmdPadLayoutCell)realloc(data->cells, size); ZeroMemory(data->cells, size); LayoutCmdWindow(hWnd); } /*-------------------------------------------------------------------------*/ void onMouseDown(HWND hWnd, WPARAM wParam, LPARAM lParam) { PNHCmdWindow data; POINT mpt; /* get mouse coordinates */ mpt.x = LOWORD(lParam); mpt.y = HIWORD(lParam); /* map mouse coordinates to the display cell */ data = (PNHCmdWindow)GetWindowLong(hWnd, GWL_USERDATA); data->active_cell = CellFromPoint(data, mpt); if( data->active_cell==-1 ) return; /* set mouse focus to the current window */ SetCapture(hWnd); /* invert the selection */ HighlightCell(hWnd, data->active_cell, (data->cells[data->active_cell].state!=NH_CST_CHECKED) ); } /*-------------------------------------------------------------------------*/ void onMouseMove(HWND hWnd, WPARAM wParam, LPARAM lParam) { PNHCmdWindow data; POINT mpt; int newActiveCell; /* get mouse coordinates */ mpt.x = LOWORD(lParam); mpt.y = HIWORD(lParam); /* map mouse coordinates to the display cell */ data = (PNHCmdWindow)GetWindowLong(hWnd, GWL_USERDATA); newActiveCell = CellFromPoint(data, mpt); if( data->active_cell == -1 ) return; /* if mouse is within orginal display cell - select the cell otherwise clear the selection */ switch( nhcmdlayout_cell_direct(data->layout_current, data->active_cell)->type ) { case NH_CELL_REG: HighlightCell(hWnd, data->active_cell, (newActiveCell==data->active_cell) ); break; case NH_CELL_CTRL: HighlightCell(hWnd, data->active_cell, ((newActiveCell==data->active_cell)? !data->is_ctrl : data->is_ctrl) ); break; case NH_CELL_CAP: HighlightCell(hWnd, data->active_cell, ((newActiveCell==data->active_cell)? !data->is_caps : data->is_caps) ); break; } } /*-------------------------------------------------------------------------*/ void onMouseUp(HWND hWnd, WPARAM wParam, LPARAM lParam) { PNHCmdWindow data; /* release mouse capture */ ReleaseCapture(); /* get active display cell */ data = (PNHCmdWindow)GetWindowLong(hWnd, GWL_USERDATA); if( data->active_cell == -1 ) return; ActivateCell(hWnd, data->active_cell); data->active_cell = -1; } /*-------------------------------------------------------------------------*/ void ActivateCell(HWND hWnd, int cell) { PNHCmdWindow data; PNHCmdPadCell p_cell_data; int i; data = (PNHCmdWindow)GetWindowLong(hWnd, GWL_USERDATA); if( !data ) return; p_cell_data = nhcmdlayout_cell_direct(data->layout_current, cell); /* act depending on the cell type: CAPS - change layout CTRL - modify CTRL status REG - place keyboard event on the nethack input queue */ switch( p_cell_data->type ) { case NH_CELL_REG: if( data->is_ctrl ) { PushNethackCommand(p_cell_data->f_char, 1); data->is_ctrl = 0; for( i=0; ilayout_current)*nhcmdlayout_columns(data->layout_current); i++ ) { if( nhcmdlayout_cell_direct(data->layout_current, i)->type == NH_CELL_CTRL ) { HighlightCell(hWnd, i, data->is_ctrl); } } } else { PushNethackCommand(p_cell_data->f_char, 0); } HighlightCell(hWnd, cell, FALSE); // select a new layout if present i = (int)p_cell_data->data; if( i==-1 ) { if( data->layout_save ) SetCmdWindowLayout(hWnd, data->layout_save); data->layout_save = NULL; } else { if( !data->layout_save ) data->layout_save = data->layout_current; SetCmdWindowLayout(hWnd, nhcmdset_get(nhcmdset_current, i)); } if( !data->is_shift ) break; // else fall through and reset the shift case NH_CELL_SHIFT: data->is_shift = !data->is_shift; SetCmdWindowLayout( hWnd, (data->is_shift ^ data->is_caps)? nhcmdset_get(nhcmdset_current, 1) : nhcmdset_get(nhcmdset_current, 0) ); data->cells[cell].state = data->is_shift? NH_CST_CHECKED : 0; InvalidateRect(hWnd, NULL, TRUE); break; case NH_CELL_CTRL: data->is_ctrl = !data->is_ctrl; HighlightCell(hWnd, cell, data->is_ctrl); break; case NH_CELL_CAP: data->is_caps = !data->is_caps; SetCmdWindowLayout( hWnd, (data->is_shift ^ data->is_caps)? nhcmdset_get(nhcmdset_current, 1) : nhcmdset_get(nhcmdset_current, 0) ); data->cells[cell].state = data->is_caps? NH_CST_CHECKED : 0; InvalidateRect(hWnd, NULL, TRUE); break; case NH_CELL_LAYOUT_NEW: { PNHCmdLayout pLayout; HighlightCell(hWnd, cell, FALSE); pLayout = (PNHCmdLayout)p_cell_data->data; if( pLayout ) { SetCmdWindowLayout(hWnd, pLayout); } } break; case NH_CELL_LAYOUT_MENU: { winid wid; int i; anything any; menu_item* selected = 0; PNHCmdSet pSet; HighlightCell(hWnd, cell, FALSE); pSet = (PNHCmdSet)p_cell_data->data; if( !pSet ) pSet = nhcmdset_default; wid = mswin_create_nhwindow(NHW_MENU); mswin_start_menu(wid); for( i=0; ilayout_selected = (PNHCmdLayout)selected[0].item.a_void; #endif SetCmdWindowLayout(hWnd, (PNHCmdLayout)selected[0].item.a_void ); } } break; } } /*-------------------------------------------------------------------------*/ int CellFromPoint(PNHCmdWindow data, POINT pt ) { int i; for( i=0; ilayout_current)*nhcmdlayout_columns(data->layout_current); i++ ) { RECT cell_rt; cell_rt.left = data->cells[i].orig.x; cell_rt.top = data->cells[i].orig.y; cell_rt.right = data->cells[i].orig.x + data->cell_size.cx*nhcmdlayout_cell_direct(data->layout_current, i)->mult; cell_rt.bottom = data->cells[i].orig.y + data->cell_size.cy; if( PtInRect(&cell_rt, pt) ) return i; } return -1; } /*-------------------------------------------------------------------------*/ void CalculateCellSize(HWND hWnd, LPSIZE pSize, LPSIZE pWindowSize) { HDC hdc; PNHCmdWindow data; data = (PNHCmdWindow)GetWindowLong(hWnd, GWL_USERDATA); if( !data ) return; hdc = GetDC(hWnd); /* if windows size is specified - attempt ro stretch cells across the the window size. If not - make default cell size based on 10 points font. Make sure that cell cesize does not exceeds 20 points */ if( pWindowSize->cx>0 ) pSize->cx = pWindowSize->cx/nhcmdlayout_columns(data->layout_current); else pSize->cx = 10*GetDeviceCaps(hdc, LOGPIXELSX)/72; pSize->cx = min(pSize->cx, 20*GetDeviceCaps(hdc, LOGPIXELSX)/72 ); if( pWindowSize->cy>0 ) pSize->cy = pWindowSize->cy/nhcmdlayout_rows(data->layout_current); else pSize->cy = 10*GetDeviceCaps(hdc, LOGPIXELSY)/72; pSize->cy = min(pSize->cy, 20*GetDeviceCaps(hdc, LOGPIXELSY)/72 ); ReleaseDC(hWnd, hdc); } /*-------------------------------------------------------------------------*/ void HighlightCell(HWND hWnd, int cell, BOOL isSelected) { HDC hDC; PNHCmdWindow data; int prevState; data = (PNHCmdWindow)GetWindowLong(hWnd, GWL_USERDATA); prevState = data->cells[cell].state; data->cells[cell].state = (isSelected)? NH_CST_CHECKED : 0; if( prevState!=data->cells[cell].state ) { hDC = GetDC(hWnd); PatBlt( hDC, data->cells[cell].orig.x+1, data->cells[cell].orig.y+1, data->cell_size.cx*nhcmdlayout_cell_direct(data->layout_current, cell)->mult - 2, data->cell_size.cy - 2, DSTINVERT ); ReleaseDC(hWnd, hDC); } } /*-------------------------------------------------------------------------*/ void PushNethackCommand( const char* cmd_char_str, int is_ctrl ) { while( *cmd_char_str ) { if( is_ctrl ) { NHEVENT_KBD( C(*cmd_char_str) ); } else { NHEVENT_KBD( *cmd_char_str ); } cmd_char_str++; } } /*-------------------------------------------------------------------------*/ /*------------------- keyboard keys layout functions ----------------------*/ /*-------------------------------------------------------------------------*/ PNHCmdLayout nhcmdlayout_create(const char* name, int rows, int columns) { PNHCmdLayout p; int i; i = sizeof(NHCmdLayout)+rows*columns*sizeof(NHCmdPadCell); p = (PNHCmdLayout)malloc(i); ZeroMemory(p, i); p->rows = rows; p->columns = columns; strncpy(p->name, name, sizeof(p->name)-1); for(i=0; icells[i].cmd_code = -1; p->cells[i].image = -NH_CMDPAD_FONT_NORMAL; p->cells[i].type = 1; p->cells[i].mult = 1; } return p; } /*-------------------------------------------------------------------------*/ void nhcmdlayout_init( PNHCmdLayout p, PNHCmdPadCell cells ) { memcpy(p->cells, cells, p->rows*p->columns*sizeof(NHCmdPadCell)); } void nhcmdlayout_destroy(PNHCmdLayout p) { free(p); } /*-------------------------------------------------------------------------*/ /*----------------- keyboard keys layout set functions --------------------*/ /*-------------------------------------------------------------------------*/ PNHCmdSet nhcmdset_create() { PNHCmdSet p; p = (PNHCmdSet)malloc(sizeof(NHCmdSet)); ZeroMemory(p, sizeof(NHCmdSet)); return p; } /*-------------------------------------------------------------------------*/ int nhcmdset_count(PNHCmdSet p) { assert(p); return p->count; } /*-------------------------------------------------------------------------*/ PNHCmdLayout nhcmdset_get( PNHCmdSet p, int index ) { assert(p); assert(index>=0 && indexcount); return p->elements[index].layout; } /*-------------------------------------------------------------------------*/ const char* nhcmdset_get_name( PNHCmdSet p, int index ) { assert(p); assert(index>=0 && indexcount); return p->elements[index].layout->name; } /*-------------------------------------------------------------------------*/ void nhcmdset_add( PNHCmdSet p, PNHCmdLayout layout ) { assert(p); assert(p->countelements[p->count].layout = layout; p->elements[p->count].free_on_destroy = 0; p->count++; } /*-------------------------------------------------------------------------*/ void nhcmdset_destroy(PNHCmdSet p) { int i=0; assert(p); for(i=0; icount; i++) { if( p->elements[i].free_on_destroy ) { nhcmdlayout_destroy( p->elements[i].layout ); } } free(p); } /*-------------------------------------------------------------------------*/ #if defined(WIN_CE_SMARTPHONE) /* special keypad input handling for SmartPhone the phone keypad maps to VK_* as shown below. some keys might not be present, e.g. VK_TFLIP sofkey1 softkey2 VK_TSOFT1, VK_TSOFT2 ^ VK_TUP < + > VK_TLEFT, VK_TACTION, VK_TRIGHT v VK_TDOWN home back VK_THOME, VK_TBACK talk end VK_TTALK, VK_TEND 1 2 3 VK_T0..VK_T9 4 5 6 ... 7 8 9 ... * 0 # VK_TSTAR, VK_TPOUND other buttons include VK_TRECORD VK_TPOWER, VK_TVOLUMEUP, VK_TVOLUMEDOWN VK_TFLIP */ BOOL NHSPhoneTranslateKbdMessage(WPARAM wParam, LPARAM lParam, BOOL keyDown) { PNHCmdWindow data; int index = -1; /* get window data */ data = (PNHCmdWindow)GetWindowLong(GetNHApp()->hCmdWnd, GWL_USERDATA); if( !data ) return FALSE; switch (wParam) { case VK_T0: index = 10; break; case VK_T1: index = 0; break; case VK_T2: index = 1; break; case VK_T3: index = 2; break; case VK_T4: index = 3; break; case VK_T5: index = 4; break; case VK_T6: index = 5; break; case VK_T7: index = 6; break; case VK_T8: index = 7; break; case VK_T9: index = 8; break; case VK_TSTAR: index = 9; break; case VK_TPOUND: index = 11; break; } if( index>=0 ) { HighlightCell(GetNHApp()->hCmdWnd, index, keyDown); if( keyDown ) ActivateCell(GetNHApp()->hCmdWnd, index); return TRUE; } else { return FALSE; } } /*-------------------------------------------------------------------------*/ void NHSPhoneSetKeypadFromString(const char* str) { PNHCmdWindow data; PNHCmdSet p = 0; PNHCmdLayout layout_prev = 0; PNHCmdLayout layout_cur = 0; char buf[2][BUFSZ]; int i, lcount; char *s; assert(NH_CMDPAD_ROWS==4); data = (PNHCmdWindow)GetWindowLong(GetNHApp()->hCmdWnd, GWL_USERDATA); if( !data ) return; p = nhcmdset_create(); ZeroMemory(buf, sizeof(buf)); if( sscanf(str, "%s or %s", buf[1], buf[0])!=2 ) { ZeroMemory(buf, sizeof(buf)); strncpy(buf[0], str, sizeof(buf[0])-1); } lcount = 10; /* create new layout on the first iteration */ for(i=0; i<2; i++) { s = buf[i]; while( *s ) { char c_start, c_end, c_char; /* parse character ranges */ if( isalnum( (c_start=s[0]) ) && s[1]=='-' && isalnum( (c_end=s[2]) ) ) { s += 2; } else { c_start = c_end = *s; } for( c_char=c_start; c_char<=c_end; c_char++ ) { if( lcount>=10 ) { /* create layout */ lcount = 0; layout_prev = layout_cur; layout_cur = nhcmdlayout_create("noname", NH_CMDPAD_ROWS, NH_CMDPAD_COLS); nhcmdlayout_init(layout_cur, cells_layout_menu); nhcmdlayout_cell(layout_cur, 3, 0)->data = layout_prev; nhcmdlayout_cell(layout_cur, 3, 2)->data = 0; nhcmdset_add( p, layout_cur ); p->elements[p->count-1].free_on_destroy = 1; if( layout_prev ) { nhcmdlayout_cell(layout_prev, 3, 2)->data = layout_cur; } } if( lcount==9 ) lcount=10; // skip '#' nhcmdlayout_cell_direct(layout_cur, lcount)->f_char[0] = c_char; if( c_char == '\033' ) { strcpy(nhcmdlayout_cell_direct(layout_cur, lcount)->text, "esc"); nhcmdlayout_cell_direct(layout_cur, lcount)->image = 14; /* 14 is a ESC symbol in IDB_KEYPAD */ } else { nhcmdlayout_cell_direct(layout_cur, lcount)->text[0] = c_char; nhcmdlayout_cell_direct(layout_cur, lcount)->text[1] = '\x0'; } /* increment character count in the current layout */ lcount++; } /* prepareg next charcter from the source string */ s++; } } /* install the new set */ if( nhcmdset_current!=nhcmdset_default ) nhcmdset_destroy( nhcmdset_current ); nhcmdset_current = p; SetCmdWindowLayout( GetNHApp()->hCmdWnd, nhcmdset_get(nhcmdset_current, 0) ); } /*-------------------------------------------------------------------------*/ void NHSPhoneSetKeypadDirection() { PNHCmdWindow data; data = (PNHCmdWindow)GetWindowLong(GetNHApp()->hCmdWnd, GWL_USERDATA); if( !data ) return; if( nhcmdset_current!=nhcmdset_default ) nhcmdset_destroy( nhcmdset_current ); nhcmdset_current = nhcmdset_default; SetCmdWindowLayout( GetNHApp()->hCmdWnd, nhcmdset_get(nhcmdset_current, NH_LAYOUT_MOVEMENT) ); } /*-------------------------------------------------------------------------*/ void NHSPhoneSetKeypadDefault() { PNHCmdWindow data; data = (PNHCmdWindow)GetWindowLong(GetNHApp()->hCmdWnd, GWL_USERDATA); if( !data ) return; if( nhcmdset_current!=nhcmdset_default ) nhcmdset_destroy( nhcmdset_current ); nhcmdset_current = nhcmdset_default; SetCmdWindowLayout( GetNHApp()->hCmdWnd, data->layout_selected ? data->layout_selected : nhcmdset_get(nhcmdset_current, 0) ); } #endif /* defined (WIN_CE_SMARTHPONE) */ slashem-0.0.7E7F3/sys/wince/mhcmd.h0000664000076400007640000000135710545462317015046 0ustar aliali/* NetHack may be freely redistributed. See license for details. */ #ifndef MSWINCMDWindow_h #define MSWINCMDWindow_h #include "winMS.h" #include "config.h" #include "global.h" HWND mswin_init_command_window (); /* if either sz->cx or sz->cy are already set this function will no modify it. It will adjust them to the minimum size required by the command window */ void mswin_command_window_size (HWND hwnd, LPSIZE sz); #if defined(WIN_CE_SMARTPHONE) /* special keypad input handling for SmartPhone */ BOOL NHSPhoneTranslateKbdMessage(WPARAM wParam, LPARAM lParam, BOOL keyDown); void NHSPhoneSetKeypadFromString(const char* str); void NHSPhoneSetKeypadDirection(); void NHSPhoneSetKeypadDefault(); #endif #endif /* MSWINCMDWindow_h */ slashem-0.0.7E7F3/sys/wince/cesetup.bat0000664000076400007640000000341410545462317015741 0ustar aliali@REM SCCS Id: @(#)nhsetup.bat $Date: 2003/11/06 00:04:12 $ @REM Copyright (c) Alex Kompel, 2002 @REM NetHack may be freely redistributed. See license for details. @REM Win32 nhsetup batch file, see Install.ce for details @REM @echo off REM REM Make sure directories necessary for build exist REM if NOT exist ..\..\wince\*.* mkdir ..\..\wince REM REM Get these files from the win\win32 port REM copy ..\..\win\win32\mnsel.uu ..\..\wince\mnsel.uu copy ..\..\win\win32\mnselcnt.uu ..\..\wince\mnselcnt.uu copy ..\..\win\win32\mnunsel.uu ..\..\wince\mnunsel.uu copy ..\..\win\win32\petmark.uu ..\..\wince\petmark.uu copy ..\..\sys\winnt\nhico.uu ..\..\wince\nhico.uu copy ..\..\sys\wince\menubar.uu ..\..\wince\menubar.uu copy ..\..\sys\wince\keypad.uu ..\..\wince\keypad.uu REM REM Get these files from sys\wince REM copy bootstrp.mak ..\..\wince\bootstrp.mak copy wince.vcw ..\..\wince.vcw copy hpc.vcp ..\..\wince\wince_hpc.vcp copy palmpc.vcp ..\..\wince\wince_palm_pc.vcp copy pocketpc.vcp ..\..\wince\wince_pocket_pc.vcp copy smartphn.vcp ..\..\wince\wince_smartphone.vcp copy mksetup.bat ..\..\wince\mksetup.bat copy slashem.inf ..\..\wince\slashem.inf copy slashem.ini ..\..\wince\slashem.ini echo. echo Attempting to copy existing data files echo This will only succeed if you have successfully echo built the sys/winnt SLASHEM copy ..\..\binary\nhshare ..\..\wince\nhshare copy ..\..\binary\nhushare ..\..\wince\nhushare copy ..\..\binary\defaults.nh ..\..\wince\defaults.nh echo. echo Proceed with the following steps: echo. echo cd ..\..\wince echo nmake /f bootstrp.mak echo. echo Then start Embedded Visual C and open echo the workspace wince.vcw (at the top of the NetHack tree) echo to build. See Install.ce for details. echo. slashem-0.0.7E7F3/sys/msdos/0000775000076400007640000000000010545462317013617 5ustar alialislashem-0.0.7E7F3/sys/msdos/alnames.h0000664000076400007640000000307710545462317015417 0ustar aliali#define NUM_SUBSTITUTES 21 BITMAP *substitutes[NUM_SUBSTITUTES]; static const char *substnames[] = { "dummy", "arc_fem", "bar_fem", "hea_fem", "kni_fem", "mon_fem", "ran_fem", "rog_fem", "sam_fem", "tou_fem", "wiz_fem", "pri_mall", "pri_feml", "pri_maln", "pri_femn", "pri_malc", "pri_femc", "altarl", /* lawful altar */ "altarn", /* neutral altar */ "altarc", /* chaotic altar */ "altarm", /* Moloch's altar */ }; #define SUB_ARCF 1 #define SUB_BARF 2 #define SUB_HEAF 3 #define SUB_KNIF 4 #define SUB_MONF 5 #define SUB_RANF 6 #define SUB_ROGF 7 #define SUB_SAMF 8 #define SUB_TOUF 9 #define SUB_WIZF 10 #define SUB_PLM 11 #define SUB_PLF 12 #define SUB_PNM 13 #define SUB_PNF 14 #define SUB_PCM 15 #define SUB_PCF 16 #define SUB_ALTARL 17 #define SUB_ALTARN 18 #define SUB_ALTARC 19 #define SUB_ALTARM 20 static const char *enames[] = { "gasspore", "magblast", "fireball", "snowball", "sleepexp", "dthfield", "balllit", "poisball", "acidball" }; static const char *anames[] = { "fail", "attack", "heal", "divine", "enchant", "cleric", "escape", "matter" }; slashem-0.0.7E7F3/sys/msdos/moveinit.pat0000664000076400007640000000221710545462317016161 0ustar aliali These are patches for MOVEINIT.C, supplied with the MSVC compiler in the compiler's SOURCE\MOVE subdirectory. (Copy that and the MOVEAPI.H file into your NetHack src directory and apply this patch) *** ../linc/src/moveinit.c Tue Nov 23 08:01:00 1993 --- src/moveinit.c Sun Mar 13 10:13:10 1994 *************** *** 13,18 **** --- 13,19 ---- *******************************************************************************/ #include "moveapi.h" + extern unsigned memavail(unsigned); #ifndef MOVE_ENV *************** *** 125,132 **** /* attempt to allocate the overlay heap. ignore return value (heap size). * note that MOVE will abort if not enough memory to alloc minimum size. */ ! ! _movesetheap ($$COVL, cparaLarge, cparaMax); /* get available cache ressource amount */ --- 126,133 ---- /* attempt to allocate the overlay heap. ignore return value (heap size). * note that MOVE will abort if not enough memory to alloc minimum size. */ ! cparaMax = memavail(cparaMin); ! _movesetheap ($$COVL, cparaMin, cparaMax); /* get available cache ressource amount */ slashem-0.0.7E7F3/sys/msdos/anethack.txt0000664000076400007640000000642510545462317016145 0ustar aliali ### # # #### ### #### ### @ @ @@@ @@@ @ @ # # # # # # # # # # @ @ @ @ @ @ @ ##### # # ### # ## #### # # @@@@@ @@@@@ @ @@ # # # # # # # # # # # @ @ @ @ @ @ @ # # #### #### #### ### # # ### @ @ @ @ @@@ @ @ (Angel, leprechaun, leprechaun, eye, gremlin, rodent, orc, giant, ant, cockatrice, kobold) Version 3.3.0 - 1.3 Manual Legal stuff: AllegroHack (c) 2000 by Kelly Youngblood. AllegroHack is distributed under the same terms as Nethack, see license for details. System requirements: Pentium class CPU or better. 8 megabytes RAM. Windows 98, windows 95, or MSDOS-compatible operating system. AllegroHack may run on a 486 or with less RAM. It will most certainly NOT run under Windows NT or Windows 2000. Installing AllegroHack: From the command line, copy ahack12b.zip to your Nethack 3.3.0 directory, and then type "pkunzip -d ahack12b.zip". Or using Winzip, Extract ahack12b.zip to your Nethack 3.3.0 directory with the "use folder names" box checked. Then, edit alleg.cnf in a text editor such as Notepad to set your preferences. Edit defaults.nh and ensure the line "OPTIONS=video:autodetect" doesn't have a # in front of it. Finally, run anethack.exe as you would nethack.exe. If AllegroHack crashes when you run it, make sure that OPTIONS=video:autodetect is set in your nethack config file! Controls: F3 : Cycle HUD between equipment display, mini-map, and off. F4 : Toggle overview mode. F5 : Save screenshot. This will dump 2 files, "nethack.bmp" contains what's on your screen. "nhmap.bmp" is a graphical map of the whole level. Control-Left : Pan the screen left. Control-Right : Pan the screen right. Control-PgUp : Pan the screen up. Control-PgDn : Pan the screen down. (I can't get Control-up or Control-down to work) Known Bugs: There is a long pause when entering or leaving the rogue level, just be patient. AllegroHack may not allow you to alt-tab out of it. Create a shortcut to anethack.exe and make sure that all the windows function keys are enabled in its shortcut properties. You may also be able to shell out with '!' then alt-tab. If this doesn't fix it email me or post to rec.games.roguelike.nethack. On some systems, AllegroHack crashes when the backspace key is pressed. I have no idea why. Contacting me: You can email me at jry@pinn.net, or post to rec.games.roguelike.nethack. I check news more often than email, so a post to RGRN will probably reach me quicker. In either case, be sure to include "AllegroHack" somewhere in the subject: line. slashem-0.0.7E7F3/sys/msdos/Makefile.GCC0000664000076400007640000016030210545462317015654 0ustar aliali# SCCS Id: @(#)Makefile.GCC 3.4 $Date: 2004/01/13 14:48:24 $ # Copyright (c) NetHack PC Development Team 1996-2003. # PC NetHack 3.4 Makefile for djgpp V2 # # Gnu gcc compiler for msdos (djgpp) # Requires Gnu Make utility (V3.79.1 or greater) supplied with djgpp # # For questions or comments: devteam@nethack.org # # In addition to your C compiler, # # if you want to change you will need a # files with suffix workalike for # .y yacc # .l lex # # Note that flex (lex) and bison (yacc) are included with the # djgpp distribution and work quite well. This makefile assumes # you have them installed correctly. # Game Installation Variables # NOTE: Make sure GAMEDIR exists before make is started. GAME = slashem #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 # OBJ = o DAT = ../dat DOC = ../doc INCL = ../include MSYS = ../sys/msdos SRC = ../src SSHR = ../sys/share UTIL = ../util WIN = ../win/tty WSHR = ../win/share # # Executables. CC = gcc #CC = redir -ea cerrors.out gcc LINK = gcc MAKEBIN = make # # Special libraries and how to link them in. # NOTE lwmemu has a panic.o in its library, so it can't be used :( LIBS = -lpc -lemu # WAC # if you have an executable compressor (DJP for DJGPP), place it here EXECOMPRESS = #EXECOMPRESS = UPX -9 #EXECOMPRESS = DJP -0 # If TERMLIB is defined in pcconf.h, comment out the upper line and # uncomment the lower. Note that you must build the termc library # and place it in djgpp's lib directory. See termcap.zip for details TERMLIB = #TERMLIB = -ltermc # # Yacc/Lex ... if you got 'em. # # If you have yacc/lex or a work-alike set YACC_LEX to Y # YACC_LEX = Y ifeq ($(YACC_LEX),Y) DO_YACC = YACC_ACT DO_LEX = LEX_ACT endif # If YACC_LEX is Y above, set the following to values appropriate for # your tools. # YACC = bison -y LEX = flex YTABC = y_tab.c YTABH = y_tab.h #If your tool produces y.tab.c and y.tab.h DOS might require #the following instead. #YTABC = ytab~1.c #YTABH = ytab~1.h LEXYYC = lexyy.c # # Uncomment the line below if you want to store all the level files, # help files, etc. in a single library file. USE_DLB = Y # djgpp includes ls.exe and touch.exe in fil41b.zip from the v2gnu # folder so be sure to include that when downloading djgpp. Doing # so will make changing this unnecessary. LS = ls -1 # ls.exe from djgpp distribution #LS = dir /l/b/-p # DOS command WAC - disable pause for dos6 #LS = *dir /l/b/z # 4DOS command - cuts through ALIASes # slowly adjusting to 'update' for fun # if you want to try it, uncomment the top and comment the uncommented one #UPD = update # update.exe from djgpp #UPD = cp # cp.exe from filutils UPD = copy # copy from DOS # To build a binary without any graphics # suitable for blind players, # set SUPPRESS_GRAPHICS to Y # (Note: binary will require ANSI.SYS driver or equivalent loaded) # SUPPRESS_GRAPHICS = Y SUPPRESS_GRAPHICS = # set USE_VGA to Y to use the VGA tiles # you also need to uncomment SCREEN_VGA in pcconf.h USE_VGA = Y #USE_VGA # set USE_ALLEGRO to Y to use the allegro library # set USE_AALIB to Y to use anti-aliasing library # BE SURE TO ALSO UNCOMMENT OUT the #define ALLEG_FX in pcconf.h #USE_ALLEGRO = USE_ALLEGRO = Y USE_AALIB = #USE_AALIB = Y # # set USE_BIG_BMP to Y to have one big BMP rather than many small ones #USE_BIG_BMP = USE_BIG_BMP = Y #=============================================== #======= End of Modification Section =========== #=============================================== ################################################ # # # Nothing below here should have to be changed.# # # ################################################ GAMEFILE = $(GAMEDIR)/$(GAME).exe ifeq ($(USE_ALLEGRO),Y) ifeq ($(USE_AALIB),Y) LIBALLEGRO = -lalleg -laastr AAFLAG = -DALLEGRO_USE_AA else LIBALLEGRO = -lalleg AAFLAG = endif ifeq ($(USE_BIG_BMP),Y) txt2bmp_FLG = -b else txt2bmp_FLG = -f endif else LIBALLEGRO = txt2bmp_FLG = endif LIBRARIES = $(LIBS) $(TERMLIB) $(LIBALLEGRO) ifeq ($(USE_DLB),Y) DLBFLG = -DDLB else DLBFLG = endif ifeq ($(SUPPRESS_GRAPHICS),Y) TERMLIB = # Debugging flags for suppressed graphics #cflags = -pg -c -I../include $(DLBFLG) -DSUPPRESS_GRAPHICS #LFLAGS = -pg cflags = -c -O -I../include $(DLBFLG) -DSUPPRESS_GRAPHICS LFLAGS = else # # Flags. # # Debugging #cflags = -pg -c -I../include $(DLBFLG) -DUSE_TILES #LFLAGS = -pg #LFLAGS = -pg -lemu # Normal #cflags = -c -O -I../include $(DLBFLG) -DUSE_TILES #LFLAGS = # Optimize # # PGCC should be able to optimize up to -O6. Use at your own risk. #cflags = -c -O6 -I../include $(DLBFLG) -DUSE_TILES # GCC (and PGCC) can optimize up to -O2 safely cflags = -c -O2 -I../include $(DLBFLG) -DUSE_TILES # JRN: I like to do things differently (Optimize and Debug =) #cflags = -Wall -W -ggdb -c -O3 -I../include $(DLBFLG) -DUSE_TILES # -s removes debugging symbols. LFLAGS = #LFLAGS = -s -lemu endif #========================================== # Utility Objects. #========================================== ifeq ($(USE_ALLEGRO),Y) ALLEGROOBJ = $(O)vidalleg.o $(O)2xsai.o else ALLEGROOBJ = endif ifeq ($(USE_VGA),Y) VGAOBJ = $(O)vidvga.o else VGAOBJ = endif 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)monst.o $(O)objects.o $(O)panic.o \ $(O)drawing.o $(O)decl.o $(O)stubvid.o DGNCOMPOBJS = $(O)dgn_yacc.o $(O)dgn_$(LEX).o $(O)dgn_main.o $(O)alloc.o \ $(O)panic.o RECOVOBJS = $(O)recover.o #========================================== # Tile related object files. #========================================== ifeq ($(SUPPRESS_GRAPHICS),Y) TEXTIO = TILOBJ = PLANAR_TIB = OVERVIEW_TIB = TILEUTIL = TILEFILES = TILEFILES2 = IGIFREADERS = GIFREADERS = PPMWRITERS = else TEXTIO = $(O)tiletext.o $(O)tiletxt.o $(O)drawing.o $(O)decl.o $(O)monst.o \ $(O)objects.o $(O)stubvid.o TEXTIO2 = $(O)tiletex2.o $(O)tiletxt2.o $(O)drawing.o $(O)decl.o $(O)monst.o \ $(O)objects.o $(O)stubvid.o ifeq ($(USE_ALLEGRO),Y) ALLEG_TILOBJ = $(ALLEGROOBJ) ALLEG_TILEUTIL = $(TILOBJ) $(O)allegro.tag $(O)alltiles.tag ALLEG_IGIFREADERS = $(O)igifread.o $(O)alloc.o $(O)panic.o else ALLEG_TILOBJ = ALLEG_TILEUTIL = ALLEG_IGIFREADERS = endif ifeq ($(USE_VGA),Y) VGA_TILOBJ = $(O)pctiles.o $(VGAOBJ) VGA_PLANAR_TIB = $(DAT)/$(GAME)1.tib VGA_OVERVIEW_TIB = $(DAT)/$(GAME)o.tib VGA_TILEUTIL = $(TILOBJ) $(U)tile2bin.exe $(U)til2bin2.exe $(PLANAR_TIB) $(OVERVIEW_TIB) VGA_TILEFILES = $(WSHR)/monsters.txt $(WSHR)/objects.txt $(WSHR)/other.txt VGA_TILEFILES2 = $(WSHR)/monthin.txt $(WSHR)/objthin.txt $(WSHR)/oththin.txt else VGA_TILOBJ = VGA_PLANAR_TIB = VGA_OVERVIEW_TIB = VGA_TILEUTIL = VGA_TILEFILES = VGA_TILEFILES2 = endif TILOBJ = $(O)tile.o $(ALLEG_TILOBJ) $(VGA_TILOBJ) PLANAR_TIB = $(VGA_PLANAR_TIB) OVERVIEW_TIB = $(VGA_OVERVIEW_TIB) TILEUTIL = $(ALLEG_TILEUTIL) $(VGA_TILEUTIL) TILEFILES = $(VGA_TILEFILES) TILEFILES2 = $(VGA_TILEFILES2) IGIFREADERS = $(ALLEG_IGIFREADERS) PLANAR_TIB = $(DAT)/$(GAME)1.tib GIFREADERS = $(O)gifread.o $(O)alloc.o $(O)panic.o GIFREAD2 = $(O)gifread2.o $(O)alloc.o $(O)panic.o PPMWRITERS = $(O)ppmwrite.o $(O)alloc.o $(O)panic.o PPMWRIT2 = $(O)ppmwrit2.o $(O)alloc.o $(O)panic.o endif DLBOBJ = $(O)dlb.o # Object files for the game itself. VOBJ01 = $(O)allmain.o $(O)alloc.o $(O)apply.o $(O)artifact.o $(O)attrib.o VOBJ02 = $(O)ball.o $(O)bones.o $(O)borg.o $(O)botl.o $(O)cmd.o $(O)dbridge.o VOBJ03 = $(O)decl.o $(O)detect.o $(O)display.o $(O)do.o $(O)do_name.o VOBJ04 = $(O)do_wear.o $(O)dog.o $(O)dogmove.o $(O)dokick.o $(O)dothrow.o VOBJ05 = $(O)drawing.o $(O)dungeon.o $(O)eat.o $(O)end.o $(O)engrave.o VOBJ06 = $(O)exper.o $(O)explode.o $(O)extralev.o $(O)files.o $(O)fountain.o VOBJ07 = $(O)getline.o $(O)hack.o $(O)hacklib.o $(O)invent.o $(O)lock.o VOBJ08 = $(O)mail.o $(O)main.o $(O)makemon.o $(O)mapglyph.o $(O)mcastu.o $(O)mhitm.o VOBJ09 = $(O)mhitu.o $(O)minion.o $(O)mkmap.o $(O)mklev.o $(O)mkmaze.o VOBJ10 = $(O)mkobj.o $(O)mkroom.o $(O)mon.o $(O)mondata.o $(O)monmove.o VOBJ11 = $(O)monst.o $(O)monstr.o $(O)mplayer.o $(O)mthrowu.o $(O)muse.o VOBJ12 = $(O)music.o $(O)o_init.o $(O)objects.o $(O)objnam.o $(O)options.o VOBJ13 = $(O)pickup.o $(O)pline.o $(O)polyself.o $(O)potion.o $(O)quest.o VOBJ14 = $(O)questpgr.o $(O)pager.o $(O)pray.o $(O)priest.o $(O)read.o VOBJ15 = $(O)rect.o $(O)restore.o $(O)rip.o $(O)rnd.o $(O)role.o VOBJ16 = $(O)rumors.o $(O)save.o $(O)shk.o $(O)shknam.o $(O)sit.o VOBJ17 = $(O)sounds.o $(O)sp_lev.o $(O)spell.o $(O)steal.o $(O)steed.o VOBJ18 = $(O)termcap.o $(O)timeout.o $(O)topl.o $(O)topten.o $(O)track.o VOBJ19 = $(O)trap.o $(O)u_init.o $(O)uhitm.o $(O)vault.o $(O)vision.o VOBJ20 = $(O)vis_tab.o $(O)weapon.o $(O)were.o $(O)wield.o $(O)windows.o VOBJ21 = $(O)wintty.o $(O)wizard.o $(O)worm.o $(O)worn.o $(O)write.o VOBJ22 = $(O)zap.o $(O)light.o $(O)dlb.o $(O)dig.o $(O)teleport.o VOBJ23 = $(O)region.o $(O)tech.o $(O)gypsy.o SOBJ = $(O)msdos.o $(O)sound.o $(O)sys.o $(O)tty.o $(O)unix.o \ $(O)video.o $(O)vidtxt.o $(O)pckeys.o VVOBJ = $(O)version.o VOBJ = $(VOBJ01) $(VOBJ02) $(VOBJ03) $(VOBJ04) $(VOBJ05) \ $(VOBJ06) $(VOBJ07) $(VOBJ08) $(VOBJ09) $(VOBJ10) \ $(VOBJ11) $(VOBJ12) $(VOBJ13) $(VOBJ14) $(VOBJ15) \ $(VOBJ16) $(VOBJ17) $(VOBJ18) $(VOBJ19) $(VOBJ20) \ $(VOBJ21) $(VOBJ22) $(VOBJ23) ALLOBJ = $(VOBJ) $(SOBJ) $(TILOBJ) $(VVOBJ) #========================================== # Header file macros #========================================== PATCHLEV_H = $(INCL)/patchlev.h DGN_FILE_H = $(INCL)/align.h $(INCL)/dgn_file.h DUNGEON_H = $(INCL)/align.h $(INCL)/dungeon.h EMIN_H = $(DUNGEON_H) $(INCL)/emin.h EPRI_H = $(DUNGEON_H) $(INCL)/align.h $(INCL)/epri.h ESHK_H = $(DUNGEON_H) $(INCL)/eshk.h MONDATA_H = $(INCL)/align.h $(INCL)/mondata.h MONST_H = $(INCL)/align.h $(INCL)/monst.h PERMONST_H = $(INCL)/monattk.h $(INCL)/monflag.h $(INCL)/align.h \ $(INCL)/permonst.h REGION_H = $(INCL)/region.h RM_H = $(INCL)/align.h $(INCL)/rm.h SKILLS_H = $(INCL)/skills.h SP_LEV_H = $(INCL)/align.h $(INCL)/sp_lev.h VAULT_H = $(DUNGEON_H) $(INCL)/vault.h YOUPROP_H = $(PERMONST_H) $(MONDATA_H) $(INCL)/prop.h \ $(INCL)/pm.h $(INCL)/youprop.h YOU_H = $(MONST_H) $(YOUPROP_H) $(INCL)/align.h \ $(INCL)/attrib.h $(INCL)/you.h DISPLAY_H = $(MONDATA_H) $(INCL)/vision.h $(INCL)/display.h PCCONF_H = $(INCL)/micro.h $(INCL)/system.h $(INCL)/pcconf.h \ $(MSYS)/pcvideo.h CONFIG_H = $(GLOBAL_H) $(INCL)/tradstdc.h $(INCL)/config1.h \ $(INCL)/config.h DECL_H = $(YOU_H) $(INCL)/spell.h $(INCL)/color.h \ $(INCL)/obj.h $(INCL)/onames.h $(INCL)/pm.h \ $(INCL)/decl.h GLOBAL_H = $(PCCONF_H) $(INCL)/coord.h $(INCL)/global.h HACK_H = $(CONFIG_H) $(DUNGEON_H) $(DECL_H) \ $(DISPLAY_H) $(INCL)/monsym.h $(INCL)/mkroom.h \ $(INCL)/objclass.h $(INCL)/trap.h $(INCL)/flag.h \ $(RM_H) $(INCL)/vision.h $(INCL)/wintype.h \ $(INCL)/engrave.h $(INCL)/rect.h \ $(INCL)/trampoli.h $(INCL)/hack.h $(REGION_H) DLB_H = $(INCL)/dlb.h ifeq ($(SUPPRESS_GRAPHICS),Y) TILE_H = else TILE_H = $(INCL)/tile.h $(MSYS)/pctiles.h endif ifeq ($(USE_DLB),Y) DLB = dlb DLBOBJS = $(O)dlb_main.o $(O)dlb.o $(O)alloc.o $(O)panic.o else DLB = DLBOBJS = endif ifdef DJGPP DJ1 = $(dir $(DJGPP)) CWSDPMI = $(subst /,\,$(DJ1))bin/CWSDPMI.* endif #========================================== #================ RULES ================== #========================================== .SUFFIXES: .exe .o .tib .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 : $(SSHR)/%.c $(CC) $(cflags) -o$@ $< #========================================== # Rules for files in sys/msdos #========================================== $(OBJ)/%.o : $(MSYS)/%.c $(CC) $(cflags) -I../sys/msdos -o$@ $< #========================================== # Rules for files in util #========================================== $(OBJ)/%.o : $(UTIL)/%.c $(CC) $(cflags) -o$@ $< #========================================== # Rules for files in win/share #========================================== $(OBJ)/%.o : $(WSHR)/%.c $(CC) $(cflags) -I../win/share -o$@ $< #{$(WSHR)}.txt{$(DAT)}.txt: # copy $< $@ #========================================== # Rules for files in win/tty #========================================== $(OBJ)/%.o : $(TTY)/%.c $(CC) $(cflags) -o$@ $< #========================================== #================ MACROS ================== #========================================== # This section creates shorthand macros for many objects # referenced later on in the Makefile. # # # Shorten up the location for some files # O = $(OBJ)/ U = $(UTIL)/ #========================================== # Primary Targets. #========================================== all : install install: $(GAMEFILE) $(O)install.tag @echo Done. default: $(GAMEFILE) util: $(O)utility.tag $(O)utility.tag: $(INCL)/date.h $(INCL)/trap.h $(INCL)/onames.h \ $(INCL)/pm.h $(SRC)/monstr.c $(SRC)/vis_tab.c \ $(U)lev_comp.exe $(U)dgn_comp.exe $(TILEUTIL) $(subst /,\,echo utilities made > $@) tileutil: $(U)gif2txt.exe $(U)txt2ppm.exe @echo Optional tile development utilities are up to date. recover: $(U)recover.exe @$(subst /,\,if exist $(U)recover.exe $(UPD) $(U)recover.exe $(GAMEDIR)) @$(subst /,\,if exist $(DOC)/recover.txt $(UPD) $(DOC)/recover.txt $(GAMEDIR)) $(O)install.tag: $(O)dat.tag $(GAMEFILE) ifeq ($(USE_DLB),Y) @$(subst /,\,$(UPD) $(DAT)/nhshare $(GAMEDIR)) @$(subst /,\,$(UPD) $(DAT)/nhushare $(GAMEDIR)) @$(subst /,\,$(UPD) $(DAT)/license $(GAMEDIR)) else @$(subst /,\,$(UPD) $(DAT)/*. $(GAMEDIR)) @$(subst /,\,$(UPD) $(DAT)/*.dat $(GAMEDIR)) @$(subst /,\,$(UPD) $(DAT)/*.lev $(GAMEDIR)) @$(subst /,\,$(UPD) $(MSYS)/msdoshlp.txt $(GAMEDIR)) @$(subst /,\,if exist $(GAMEDIR)/makefile. del $(GAMEDIR)/makefile.) endif ifdef TERMLIB @$(subst /,\,$(UPD) $(SSHR)/termcap $(GAMEDIR)) endif @$(subst /,\,if exist $(DAT)/*.tib $(UPD) $(DAT)/*.tib $(GAMEDIR)) @$(subst /,\,if exist *.tib $(UPD) *.tib $(GAMEDIR)) @$(subst /,\,$(UPD) $(SSHR)/NetHack.cnf $(GAMEDIR)/defaults.nh) @$(subst /,\,$(UPD) $(MSYS)/NHAccess.nh $(GAMEDIR)) ifeq ($(USE_ALLEGRO),Y) @$(subst /,\,$(UPD) $(MSYS)/alleg.cnf $(GAMEDIR)/alleg.cnf) @$(subst /,\,$(UPD) $(MSYS)/anethack.fnt $(GAMEDIR)/anethack.fnt) @$(subst /,\,if not exist $(GAMEDIR)/tiles/NUL md $(GAMEDIR)/tiles) ifeq ($(USE_BIG_BMP),Y) @$(subst /,\,$(UPD) slam??.bmp $(GAMEDIR)) else @$(subst /,\,$(UPD) index $(GAMEDIR)/tiles/index) @$(subst /,\,$(UPD) *.bmp $(GAMEDIR)/tiles) endif @$(subst /,\,if not exist $(GAMEDIR)/tiles/spfx/NUL md $(GAMEDIR)/tiles/spfx) @$(subst /,\,if not exist $(GAMEDIR)/tiles/subs/NUL md $(GAMEDIR)/tiles/subs) @$(subst /,\,$(UPD) $(MSYS)/tiles/*.* $(GAMEDIR)/tiles) @$(subst /,\,$(UPD) $(MSYS)/tiles/spfx/*.* $(GAMEDIR)/tiles/spfx) @$(subst /,\,$(UPD) $(MSYS)/tiles/subs/*.* $(GAMEDIR)/tiles/subs) endif @$(subst /,\,$(UPD) $(DOC)/guidebo*.txt $(GAMEDIR)) @$(subst /,\,if exist $(DOC)/$(GAME).txt $(UPD) $(DOC)/$(GAME).txt $(GAMEDIR)) @$(subst /,\,if exist ../readme.txt $(UPD) ../readme.txt $(GAMEDIR)/readme.txt) @$(subst /,\,if exist ../slamfaq.txt $(UPD) ../slamfaq.txt $(GAMEDIR)/slamfaq.txt) @$(subst /,\,if exist ../history.txt $(UPD) ../history.txt $(GAMEDIR)/history.txt) ifdef CWSDPMI @$(subst /,\,if exist $(CWSDPMI) $(UPD) $(CWSDPMI) $(GAMEDIR)) else @$(subst /,\,echo Could not find a copy of CWSDPMI.EXE to put into $(GAMEDIR)) endif @$(subst /,\,echo install done > $@) #========================================== # The main target. #========================================== $(GAMEFILE): $(O)obj.tag $(PATCHLEV_H) $(O)utility.tag $(ALLOBJ) $(O)$(GAME).lnk $(LINK) $(LFLAGS) -o$(GAME).exe @$(O)$(GAME).lnk $(LIBRARIES) @$(subst /,\,stubedit $(GAME).exe minstack=2048K argv0=$(GAME)) ifdef EXECOMPRESS @$(subst /,\,$(EXECOMPRESS) $(GAME).exe) endif @$(subst /,\,$(UPD) $(GAME).exe $(GAMEFILE)) @$(subst /,\,del $(GAME).exe) $(O)$(GAME).lnk: $(ALLOBJ) echo $(VOBJ01) > $(subst /,\,$@) echo $(VOBJ02) >> $(subst /,\,$@) echo $(VOBJ03) >> $(subst /,\,$@) echo $(VOBJ04) >> $(subst /,\,$@) echo $(VOBJ05) >> $(subst /,\,$@) echo $(VOBJ06) >> $(subst /,\,$@) echo $(VOBJ07) >> $(subst /,\,$@) echo $(VOBJ08) >> $(subst /,\,$@) echo $(VOBJ09) >> $(subst /,\,$@) echo $(VOBJ10) >> $(subst /,\,$@) echo $(VOBJ11) >> $(subst /,\,$@) echo $(VOBJ12) >> $(subst /,\,$@) echo $(VOBJ13) >> $(subst /,\,$@) echo $(VOBJ14) >> $(subst /,\,$@) echo $(VOBJ15) >> $(subst /,\,$@) echo $(VOBJ16) >> $(subst /,\,$@) echo $(VOBJ17) >> $(subst /,\,$@) echo $(VOBJ18) >> $(subst /,\,$@) echo $(VOBJ19) >> $(subst /,\,$@) echo $(VOBJ20) >> $(subst /,\,$@) echo $(VOBJ21) >> $(subst /,\,$@) echo $(VOBJ22) >> $(subst /,\,$@) echo $(VOBJ23) >> $(subst /,\,$@) echo $(SOBJ) >> $(subst /,\,$@) echo $(TILOBJ) >> $(subst /,\,$@) echo $(VVOBJ) >> $(subst /,\,$@) #========================================== # Housekeeping. #========================================== clean: $(subst /,\,if exist $(O)*.o del $(O)*.o) $(subst /,\,if exist $(O)dat.tag del $(O)dat.tag) $(subst /,\,if exist $(O)install.tag del $(O)install.tag) $(subst /,\,if exist $(O)$(GAME).lnk del $(O)$(GAME).lnk) $(subst /,\,if exist $(O)obj.tag del $(O)obj.tag) $(subst /,\,if exist $(O)sp_lev.tag del $(O)sp_lev.tag) $(subst /,\,if exist $(O)thintile.tag del $(O)thintile.tag) $(subst /,\,if exist $(O)utility.tag del $(O)utility.tag) spotless: clean $(subst /,\,if exist $(U)lev_flex.c del $(U)lev_flex.c) $(subst /,\,if exist $(U)lev_lex.c del $(U)lev_lex.c) $(subst /,\,if exist $(U)lev_yacc.c del $(U)lev_yacc.c) $(subst /,\,if exist $(U)dgn_flex.c del $(U)dgn_flex.c) $(subst /,\,if exist $(U)dgn_lex.c del $(U)dgn_lex.c) $(subst /,\,if exist $(U)dgn_yacc.c del $(U)lev_yacc.c) $(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 $(U)recover.exe del $(U)recover.exe) $(subst /,\,if exist $(U)tilemap.exe del $(U)tilemap.exe) $(subst /,\,if exist $(U)tile2bin.exe del $(U)tile2bin.exe) $(subst /,\,if exist $(U)til2bin2.exe del $(U)til2bin2.exe) $(subst /,\,if exist $(U)thintile.exe del $(U)thintile.exe) $(subst /,\,if exist $(U)dlb_main.exe del $(U)dlb_main.exe) $(subst /,\,if exist $(INCL)/vis_tab.h del $(INCL)/vis_tab.h) $(subst /,\,if exist $(INCL)/onames.h del $(INCL)/onames.h) $(subst /,\,if exist $(INCL)/pm.h del $(INCL)/pm.h) $(subst /,\,if exist $(INCL)/date.h del $(INCL)/date.h) $(subst /,\,if exist $(INCL)/dgn_comp.h del $(INCL)/dgn_comp.h) $(subst /,\,if exist $(INCL)/lev_comp.h del $(INCL)/lev_comp.h) $(subst /,\,if exist $(SRC)/monstr.c del $(SRC)/monstr.c) $(subst /,\,if exist $(SRC)/vis_tab.c del $(SRC)/vis_tab.c) $(subst /,\,if exist $(SRC)/tile.c del $(SRC)/tile.c) $(subst /,\,if exist $(DAT)/options del $(DAT)/options) $(subst /,\,if exist $(DAT)/data del $(DAT)/data) $(subst /,\,if exist $(DAT)/rumors del $(DAT)/rumors) $(subst /,\,if exist $(DAT)/dungeon.pdf del $(DAT)/dungeon.pdf) $(subst /,\,if exist $(DAT)/dungeon del $(DAT)/dungeon) $(subst /,\,if exist $(DAT)/oracles del $(DAT)/oracles) $(subst /,\,if exist $(DAT)/quest.dat del $(DAT)/quest.dat) $(subst /,\,if exist $(DAT)/dlb.lst del $(DAT)/dlb.lst) $(subst /,\,if exist $(DAT)/*.lev del $(DAT)/*.lev) $(subst /,\,if exist $(PLANAR_TIB) del $(PLANAR_TIB)) $(subst /,\,if exist $(OVERVIEW_TIB) del $(OVERVIEW_TIB)) $(subst /,\,if exist $(WSHR)/monthin.txt del $(WSHR)/monthin.txt) $(subst /,\,if exist $(WSHR)/objthin.txt del $(WSHR)/objthin.txt) $(subst /,\,if exist $(WSHR)/oththin.txt del $(WSHR)/oththin.txt) # [CC] Old make spotless code which has not been made obsolete by 3.4.1 merge # txt2bmp: bitmap tiles $(subst /,\,if exist index del index) $(subst /,\,if exist $(INCL)/allegfx.h del $(INCL)/allegfx.h) $(subst /,\,if exist *.bmp del *.bmp) # dlb_main: data library stuff $(subst /,\,if exist $(DAT)/nhshare del $(DAT)/nhshare) $(subst /,\,if exist $(DAT)/nhushare del $(DAT)/nhushare) $(subst /,\,if exist $(DAT)/dlb.lst del $(DAT)/dlb.lst) $(subst /,\,if exist $(DAT)/dlb2.lst del $(DAT)/dlb2.lst) # tile2bin: datafiles for the standard VGA mode $(subst /,\,if exist *.tib del *.tib) $(subst /,\,if exist $(DAT)/*.tib del $(DAT)/*.tib) # txtmerge: merged (transparent) 32x32 tile files $(subst /,\,if exist $(WSHR)/mon32-t.txt del $(WSHR)/mon32-t.txt) $(subst /,\,if exist $(WSHR)/obj32-t.txt del $(WSHR)/obj32-t.txt) $(subst /,\,if exist $(WSHR)/oth32-t.txt del $(WSHR)/oth32-t.txt) # txtbg: 32x32 tile files with backgrounds $(subst /,\,if exist $(WSHR)/mon32.txt del $(WSHR)/mon32.txt) $(subst /,\,if exist $(WSHR)/obj32.txt del $(WSHR)/obj32.txt) $(subst /,\,if exist $(WSHR)/oth32.txt del $(WSHR)/oth32.txt) # magtile: magnified tile files (16x16 tiles -> 32x32 tiles) $(subst /,\,if exist $(WSHR)/monmag.txt del $(WSHR)/monmag.txt) $(subst /,\,if exist $(WSHR)/objmag.txt del $(WSHR)/objmag.txt) $(subst /,\,if exist $(WSHR)/othmag.txt del $(WSHR)/othmag.txt) # bigtile: recentered tile files (32x32 tiles -> 48x64 tiles) $(subst /,\,if exist $(WSHR)/monbig.txt del $(WSHR)/monbig.txt) $(subst /,\,if exist $(WSHR)/objbig.txt del $(WSHR)/objbig.txt) $(subst /,\,if exist $(WSHR)/othbig.txt del $(WSHR)/othbig.txt) # txtmerge: merged 3d (48x64) tile files $(subst /,\,if exist $(WSHR)/mon3d.txt del $(WSHR)/mon3d.txt) $(subst /,\,if exist $(WSHR)/obj3d.txt del $(WSHR)/obj3d.txt) $(subst /,\,if exist $(WSHR)/oth3d.txt del $(WSHR)/oth3d.txt) # redir/gcc: C warnings captured from -Wall -W if you're me $(subst /,\,if exist cerrors.out del cerrors.out) @echo All clean, hopefully! If you get any cruft, e-mail WACko or me #End of Slash'em specific make spotless additions #========================================== # Create directory for holding object files #========================================== $(O)obj.tag: @$(subst /,\,@if not exist $(OBJ)/*.* mkdir $(OBJ)) @$(subst /,\,@echo directory created > $@) #=========================================== # Work around some djgpp long file name woes #=========================================== $(PATCHLEV_H): @$(subst /,\,if not exist $@ $(UPD) $(INCL)/patchlevel.h $(INCL)/patchlev.h) #========================================== #=========== SECONDARY TARGETS ============ #========================================== # # The following include files depend on makedefs to be created. # # date.h should be remade every time any of the source or include # files is modified. # For the Makefile surfer # (or strange person who goes 'make ../dat/options'): $(DAT)/options : $(INCL)/date.h $(INCL)/date.h : $(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) $(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) $(INCL)/filename.h: $(U)makedefs.exe @$(subst /,\,$(U)makedefs -f) #========================================== # Makedefs Stuff #========================================== $(U)makedefs.exe: $(MAKEOBJS) $(LINK) $(LFLAGS) -o$@ $(MAKEOBJS) $(O)makedefs.o: $(CONFIG_H) $(PERMONST_H) $(INCL)/objclass.h \ $(INCL)/monsym.h $(INCL)/qtext.h $(U)makedefs.c #========================================== # Level Compiler Dependencies #========================================== $(U)lev_comp.exe: $(SPLEVOBJS) $(LINK) $(LFLAGS) -o$@ $(SPLEVOBJS) ifeq ($(YACC_LEX),Y) $(O)lev_yacc.o: $(HACK_H) $(SP_LEV_H) $(U)lev_yacc.c $(CC) $(cflags) -o$@ $(U)lev_yacc.c else $(O)lev_yacc.o: $(HACK_H) $(SP_LEV_H) $(INCL)/lev_comp.h $(U)lev_yacc.c $(CC) $(cflags) -o$@ $(U)lev_yacc.c endif $(O)lev_$(LEX).o: $(HACK_H) $(SP_LEV_H) $(INCL)/lev_comp.h \ $(U)lev_$(LEX).c $(CC) $(cflags) -o$@ $(U)lev_$(LEX).c $(O)lev_main.o: $(HACK_H) $(INCL)/sp_lev.h $(INCL)/date.h $(U)lev_main.c ifeq "$(DO_YACC)" "YACC_ACT" $(INCL)/lev_comp.h: $(U)/lev_yacc.c $(U)lev_yacc.c $(INCL)/lev_comp.h : $(U)lev_comp.y @$(subst /,\,chdir $(UTIL)) @$(subst /,\,$(YACC) -d lev_comp.y) @$(subst /,\,$(UPD) $(YTABC) lev_yacc.c) @$(subst /,\,$(UPD) $(YTABH) $(INCL)/lev_comp.h) @$(subst /,\,@del $(YTABC)) @$(subst /,\,@del $(YTABH)) @$(subst /,\,chdir $(SRC)) else $(U)lev_yacc.c: $(SSHR)/lev_yacc.c @echo --- @echo For now, we will copy the prebuilt @echo lev_yacc.c from $(SSHR) into $(U) and use that. @$(subst /,\,$(UPD) $(SSHR)/lev_yacc.c $(U)lev_yacc.c) @$(subst /,\,echo.>>$(U)lev_yacc.c) $(INCL)/lev_comp.h : $(SSHR)/lev_comp.h @echo --- @echo For now, we will copy the prebuilt lev_comp.h @echo from $(SSHR) into $(INCL) and use that. @$(subst /,\,$(UPD) $(SSHR)/lev_comp.h $(INCL)/lev_comp.h) @$(subst /,\,echo.>>$(INCL)/lev_comp.h) endif $(U)lev_$(LEX).c: $(U)lev_comp.l ifeq "$(DO_LEX)" "LEX_ACT" @$(subst /,\,chdir $(UTIL)) @$(subst /,\,$(LEX) $(FLEXSKEL) lev_comp.l) @$(subst /,\,$(UPD) $(LEXYYC) $@) @$(subst /,\,if exist $@ del $@) @$(subst /,\,$(UPD) $(LEXYYC) $@) @$(subst /,\,del $(LEXYYC)) @$(subst /,\,chdir $(SRC)) else @echo --- @echo For now, we will copy the prebuilt lev_lex.c @echo from $(SSHR) into $(U) and use it. @$(subst /,\,$(UPD) $(SSHR)/lev_lex.c $@) @$(subst /,\,echo.>>$@) endif #========================================== # Dungeon Dependencies #========================================== $(U)dgn_comp.exe: $(DGNCOMPOBJS) $(LINK) $(LFLAGS) -o$@ $(DGNCOMPOBJS) ifeq "$(DO_YACC)" "YACC_ACT" $(U)dgn_yacc.c $(INCL)/dgn_comp.h : $(U)dgn_comp.y @$(subst /,\,chdir $(UTIL)) @$(subst /,\,$(YACC) -d dgn_comp.y) @$(subst /,\,$(UPD) $(YTABC) dgn_yacc.c) @$(subst /,\,$(UPD) $(YTABH) $(INCL)/dgn_comp.h) @$(subst /,\,@del $(YTABC)) @$(subst /,\,@del $(YTABH)) @$(subst /,\,chdir $(SRC)) else $(U)dgn_yacc.c: $(SSHR)/dgn_yacc.c @echo --- @echo For now, we will copy the prebuilt $(U)dgn_yacc.c and @echo dgn_comp.h from $(SSHR) into $(U) and use that. @$(subst /,\,$(UPD) $(SSHR)/dgn_yacc.c $(U)dgn_yacc.c) @$(subst /,\,echo.>>$(U)dgn_yacc.c) $(INCL)/dgn_comp.h: $(SSHR)/dgn_comp.h @echo --- @echo For now, we will copy the prebuilt dgn_comp.h @echo from $(SSHR) into $(INCL) and use that. @$(subst /,\,$(UPD) $(SSHR)/dgn_comp.h $(INCL)/dgn_comp.h) @$(subst /,\,echo.>>$(INCL)/dgn_comp.h) endif ifeq "$(DO_LEX)" "LEX_ACT" $(U)dgn_$(LEX).c: $(U)dgn_comp.l $(INCL)/dgn_comp.h @$(subst /,\,chdir $(UTIL)) @$(subst /,\,$(LEX) $(FLEXSKEL) dgn_comp.l) @$(subst /,\,if exist $@ del $@) @$(subst /,\,$(UPD) $(LEXYYC) $@) @$(subst /,\,del $(LEXYYC)) @$(subst /,\,chdir $(SRC)) else $(U)dgn_$(LEX).c: $(SSHR)/dgn_lex.c $(INCL)/dgn_comp.h @echo --- @echo For now, we will copy the prebuilt dgn_lex.c @echo from $(SSHR) into $(U) and use it. @$(subst /,\,$(UPD) $(SSHR)/dgn_lex.c $@) @$(subst /,\,echo.>>$@) endif #========================================== # Recover Utility #========================================== $(U)recover.exe: $(RECOVOBJS) $(LINK) $(LFLAGS) -o$@ $(O)recover.o ifdef EXECOMPRESS $(EXECOMPRESS) recover.exe endif $(O)recover.o: $(CONFIG_H) $(U)recover.c $(CC) $(cflags) -o$@ $(U)recover.c #========================================== # Header file moves required for tile support #========================================== ifeq ($(SUPPRESS_GRAPHICS),Y) else $(INCL)/tile.h: $(WSHR)/tile_t.h @$(subst /,\,$(UPD) $< $@) $(INCL)/pctiles.h: $(MSYS)/pctiles.h $(INCL)/filename.h @$(subst /,\,$(UPD) $< $@) $(INCL)/pcvideo.h: $(MSYS)/pcvideo.h @$(subst /,\,$(UPD) $< $@) $(INCL)/portio.h: $(MSYS)/portio.h @$(subst /,\,$(UPD) $< $@) # # Tile Mapping # $(SRC)/tile.c: $(U)tilemap.exe @$(subst /,\,$(U)tilemap.exe) @echo A new $@ has been created $(U)tilemap.exe: $(O)tilemap.o $(LINK) $(LFLAGS) -o$@ $(O)tilemap.o $(O)tilemap.o: $(WSHR)/tilemap.c $(HACK_H) $(TILE_H) $(CC) $(cflags) -I$(WSHR) -I$(MSYS) -o$@ $(WSHR)/tilemap.c #========================================== # Tile Utilities # Required for tile support #========================================== $(DAT)/$(GAME)1.tib: $(TILEFILES) $(U)tile2bin.exe @echo Creating binary tile files (this may take some time) @$(subst /,\,chdir $(DAT)) @$(subst /,\,$(U)tile2bin.exe) @$(subst /,\,chdir $(SRC)) $(DAT)/$(GAME)o.tib: $(O)thintile.tag $(TILEFILES2) $(U)til2bin2.exe @echo Creating overview binary tile files (this may take some time) @$(subst /,\,chdir $(DAT)) @$(subst /,\,$(U)til2bin2.exe) @$(subst /,\,chdir $(SRC)) $(U)tile2bin.exe: $(O)tile2bin.o $(TEXTIO) $(LINK) $(LFLAGS) -o$@ $(O)tile2bin.o $(TEXTIO) $(U)til2bin2.exe: $(O)til2bin2.o $(TEXTIO2) $(LINK) $(LFLAGS) -o$@ $(O)til2bin2.o $(TEXTIO2) $(U)thintile.exe: $(O)thintile.o $(TEXTIO) $(LINK) $(LFLAGS) -o$@ $(O)thintile.o $(TEXTIO) $(O)thintile.o: $(HACK_H) $(INCL)/tile.h $(WSHR)/thintile.c $(CC) $(cflags) -o$@ $(WSHR)/thintile.c $(O)thintile.tag: $(U)thintile.exe $(TILEFILES) @$(subst /,\,$(U)thintile.exe) @$(subst /,\,echo thintiles created >$@) $(O)tile2bin.o: $(HACK_H) $(TILE_H) $(MSYS)/pctiles.h $(MSYS)/pcvideo.h $(MSYS)/tile2bin.c $(CC) $(cflags) -I$(MSYS) -I$(WSHR) -o$@ $(MSYS)/tile2bin.c $(O)til2bin2.o: $(HACK_H) $(TILE_H) $(MSYS)/pctiles.h $(MSYS)/pcvideo.h $(MSYS)/tile2bin.c $(CC) $(cflags) -I$(MSYS) -I$(WSHR) -DTILE_X=8 -DOVERVIEW_FILE -o$@ $(MSYS)/tile2bin.c $(O)tiletext.o: $(CONFIG_H) $(TILE_H) $(WSHR)/tiletext.c $(CC) $(cflags) -I$(MSYS) -I$(WSHR) -o$@ $(WSHR)/tiletext.c $(O)tiletex2.o: $(CONFIG_H) $(TILE_H) $(WSHR)/tiletext.c $(CC) $(cflags) -I$(MSYS) -I$(WSHR) -DTILE_X=8 -o$@ $(WSHR)/tiletext.c $(O)tiletxt.o: $(CONFIG_H) $(TILE_H) $(WSHR)/tilemap.c $(CC) $(cflags) -I$(MSYS) -I$(WSHR) -DTILETEXT -o$@ $(WSHR)/tilemap.c $(O)tiletxt2.o: $(CONFIG_H) $(TILE_H) $(WSHR)/tilemap.c $(CC) $(cflags) -I$(MSYS) -I$(WSHR) -DTILETEXT -DTILE_X=8 -o$@ $(WSHR)/tilemap.c # # Allegro Tile Support # $(O)txt2bmp.o: $(MSYS)/txt2bmp.c $(HACK_H) $(INCL)/tile.h $(INCL)/portio.h $(CC) $(cflags) -o$@ $< txt2bmp.exe: $(O)txt2bmp.o $(TEXTIO) $(SRC)/tile.c $(LINK) $(LFLAGS) -o$@ $< -lalleg $(TEXTIO) $(O)idx2bmp.o: $(MSYS)/idx2bmp.c $(HACK_H) $(INCL)/tile.h $(INCL)/portio.h $(CC) $(cflags) -o$@ $< idx2bmp.exe: $(O)idx2bmp.o $(TEXTIO) $(LINK) $(LFLAGS) -o$@ $< -lalleg $(TEXTIO) bmp2txt.o: $(MSYS)/bmp2txt.c $(HACK_H) $(INCL)/tile.h $(INCL)/portio.h $(CC) $(cflags) -o$@ $< bmp2txt.exe: bmp2txt.o $(TEXTIO) $(LINK) $(LFLAGS) -obmp2txt.exe bmp2txt.o -lalleg $(TEXTIO) $(O)allegro.tag: txt2bmp.exe $(O)alltiles.tag echo allegro tiles made > $(O)allegro.tag index: txt2bmp.exe txt2bmp.exe -i # # 32x32 Tile Support # txtbg.exe: txtbg.o $(TEXTIO) $(LINK) $(LFLAGS) -otxtbg.exe txtbg.o $(TEXTIO) txtbg.o: $(WSHR)/txtbg.c $(INCL)/hack.h $(INCL)/tile.h $(CC) $(cflags) -o$@ $< txtmerge.exe: txtmerge.o $(TEXTIO) $(LINK) $(LFLAGS) -otxtmerge.exe txtmerge.o $(TEXTIO) magtile.exe: magtile.o $(TEXTIO) $(LINK) $(LFLAGS) -omagtile.exe magtile.o $(TEXTIO) magtile.o: $(WSHR)/magtile.c $(INCL)/config.h $(INCL)/tile.h $(CC) $(cflags) -o$@ $< bigtile.exe: bigtile.o $(TEXTIO) $(LINK) $(LFLAGS) -obigtile.exe bigtile.o $(TEXTIO) bigtile.o: $(WSHR)/bigtile.c $(INCL)/config.h $(INCL)/tile.h $(CC) $(cflags) -o$@ $< txtmerge.o: $(WSHR)/txtmerge.c $(INCL)/config.h $(INCL)/tile.h $(CC) $(cflags) -o$@ $< $(WSHR)/monmag.txt: magtile.exe $(WSHR)/monsters.txt magtile $(WSHR)/objmag.txt: magtile.exe $(WSHR)/objects.txt magtile $(WSHR)/othmag.txt: magtile.exe $(WSHR)/other.txt magtile $(WSHR)/mon32-t.txt: txtmerge.exe $(WSHR)/monmag.txt $(WSHR)/mon32mi.txt \ $(WSHR)/mon32alg.txt $(WSHR)/mon32al2.txt \ $(WSHR)/mon32aw.txt $(WSHR)/mon32mi.txt \ $(WSHR)/palette.txt txtmerge -p $(WSHR)/palette.txt $(WSHR)/mon32-t.txt $(WSHR)/monmag.txt \ -b $(WSHR)/mon32mi.txt -b $(WSHR)/mon32se.txt \ -bff00ff $(WSHR)/mon32alg.txt \ -bff00ff $(WSHR)/mon32al2.txt \ -bff00ff $(WSHR)/mon32aw.txt $(WSHR)/obj32-t.txt: txtmerge.exe $(WSHR)/objmag.txt $(WSHR)/obj32mi.txt \ $(WSHR)/obj32se.txt $(WSHR)/obj32alg.txt \ $(WSHR)/obj32al2.txt $(WSHR)/palette.txt txtmerge -p $(WSHR)/palette.txt $(WSHR)/obj32-t.txt $(WSHR)/objmag.txt \ -b $(WSHR)/obj32mi.txt -b $(WSHR)/obj32se.txt \ -bff00ff $(WSHR)/obj32alg.txt \ -bff00ff $(WSHR)/obj32al2.txt $(WSHR)/oth32-t.txt: txtmerge.exe $(WSHR)/othmag.txt \ $(WSHR)/oth32mi.txt $(WSHR)/oth32se.txt \ $(WSHR)/oth32fl.txt $(WSHR)/palette.txt txtmerge -p $(WSHR)/palette.txt $(WSHR)/oth32-t.txt $(WSHR)/othmag.txt \ -bff00ff $(WSHR)/oth32alg.txt \ -bff00ff $(WSHR)/oth32al2.txt \ -b $(WSHR)/oth32mi.txt $(WSHR)/oth32se.txt \ -b $(WSHR)/oth32fl.txt -bff00ff $(WSHR)/oth32alg.txt \ -bff00ff $(WSHR)/oth32al2.txt $(WSHR)/mon32.txt: txtbg.exe $(WSHR)/mon32-t.txt txtbg $(WSHR)/mon32-t.txt $(WSHR)/mon32.txt $(WSHR)/obj32.txt: txtbg.exe $(WSHR)/obj32-t.txt txtbg $(WSHR)/obj32-t.txt $(WSHR)/obj32.txt $(WSHR)/oth32.txt: txtbg.exe $(WSHR)/oth32-t.txt txtbg $(WSHR)/oth32-t.txt $(WSHR)/oth32.txt $(WSHR)/monbig.txt: bigtile.exe $(WSHR)/mon32-t.txt bigtile $(WSHR)/objbig.txt: bigtile.exe $(WSHR)/obj32-t.txt bigtile $(WSHR)/othbig.txt: bigtile.exe $(WSHR)/oth32-t.txt bigtile $(WSHR)/mon3d.txt: txtmerge.exe $(WSHR)/monbig.txt $(WSHR)/mon3dmi.txt \ $(WSHR)/palette.txt txtmerge -p $(WSHR)/palette.txt $(WSHR)/mon3d.txt \ $(WSHR)/monbig.txt -b $(WSHR)/mon3dmi.txt $(WSHR)/obj3d.txt: txtmerge.exe $(WSHR)/objbig.txt $(WSHR)/palette.txt txtmerge -p $(WSHR)/palette.txt $(WSHR)/obj3d.txt \ $(WSHR)/objbig.txt $(WSHR)/oth3d.txt: txtmerge.exe $(WSHR)/othbig.txt $(WSHR)/palette.txt \ $(WSHR)/oth3dmi.txt $(WSHR)/oth-2kmi.txt \ $(WSHR)/oth3dse.txt txtmerge -p $(WSHR)/palette.txt $(WSHR)/oth3d.txt \ $(WSHR)/othbig.txt -b $(WSHR)/oth3dmi.txt \ -b $(WSHR)/oth-2kmi.txt -b $(WSHR)/oth3dse.txt # For makefile greppers that want to know what the heck allegfx.h is $(INCL)/allegfx.h: txt2bmp.exe txt2bmp.exe -h echo You just made something completely useless!! Congrats! $(O)tiles3d.tag: $(WSHR)/mon3d.txt $(WSHR)/obj3d.txt $(WSHR)/oth3d.txt txt2bmp.exe txt2bmp.exe $(txt2bmp_FLG)3d echo tiles3d done > tiles3d.tag $(O)tiles32.tag: $(WSHR)/mon32.txt $(WSHR)/obj32.txt $(WSHR)/oth32.txt txt2bmp.exe txt2bmp.exe $(txt2bmp_FLG)32 echo tiles32 done > tiles32.tag $(O)tiles16.tag: $(WSHR)/monsters.txt $(WSHR)/objects.txt $(WSHR)/other.txt txt2bmp.exe txt2bmp.exe $(txt2bmp_FLG)16 echo tiles16 done > tiles16.tag $(O)alltiles.tag: $(O)tiles32.tag $(O)tiles16.tag $(O)tiles3d.tag echo alltiles done > $(O)alltiles.tag # End from Slash'em pre 3.4.1 merge # # Optional GIF Utilities (for development) # $(U)gif2txt.exe: $(GIFREADERS) $(TEXTIO) $(LINK) $(LFLAGS) -o$@ $(GIFREADERS) $(TEXTIO) $(U)gif2txt2.exe: $(GIFREAD2) $(TEXTIO2) $(LINK) $(LFLAGS) -o$@ $(GIFREAD2) $(TEXTIO2) $(U)igif2txt.exe: $(IGIFREADERS) $(TEXTIO) $(LINK) $(LFLAGS) -o$@ $(IGIFREADERS) $(TEXTIO) $(U)txt2ppm.exe: $(PPMWRITERS) $(TEXTIO) $(LINK) $(LFLAGS) -o$@ $(PPMWRITERS) $(TEXTIO) $(U)txt2ppm2.exe: $(PPMWRIT2) $(TEXTIO2) $(LINK) $(LFLAGS) -o$@ $(PPMWRIT2) $(TEXTIO2) $(U)txtfilt.exe: txtfilt.o $(TEXT_IO) $(CC) $(LFLAGS) -o$@ txtfilt.o $(TEXTIO) $(O)gifread.o: $(CONFIG_H) $(INCL)/tile.h $(WSHR)/gifread.c $(O)gifread2.o: $(CONFIG_H) $(INCL)/tile.h $(WSHR)/gifread.c $(CC) $(cflags) -DTILE_X=8 -o$@ $(WSHR)/gifread.c $(O)igifread.o: $(WSHR)/gifread.c $(CONFIG_H) $(INCL)/tile.h $(CC) $(cflags) -DINDEX -o$@ $< ppmwrite.c: $(WSHR)/ppmwrite.c @$(subst /,\,$(UPD) $(WSHR)/ppmwrite.c .) $(O)ppmwrite.o: $(CONFIG_H) $(INCL)/tile.h $(O)ppmwrit2.o: $(CONFIG_H) $(INCL)/tile.h ppmwrite.c $(CC) $(cflags) -DTILE_X=8 -o$@ ppmwrite.c $(O)txtfilt.o: $(WSHR)/txtfilt.c $(INCL)/config.h $(INCL)/tile.h $(CC) $(cflags) -o$@ $< # # Optional tile viewer (development sources only) # $(U)viewtib.exe: $(O)viewtib.o $(LINK) $(LFLAGS) -o$@ $(O)viewtib.o $(LIBRARIES) $(O)viewtib.o: $(MSYS)/viewtib.c endif # # Other Util Dependencies. # #JRN huh? removed the the whole thing. It's weird. Aren't its # dependencies at the end with the other "normal" things? And whenever # monst.o is made, so is objects.o, so why depend? $(O)panic.o: $(CONFIG_H) $(U)panic.c #============================================================ # make data.base an 8.3 filename to prevent an make warning #============================================================ DATABASE = $(DAT)/data.bas $(O)dat.tag: $(DAT)/nhshare $(DAT)/nhushare @$(subst /,\,echo dat done >$@) $(DAT)/data: $(O)utility.tag $(DATABASE) @$(subst /,\,$(U)makedefs.exe -d) $(DAT)/rumors: $(O)utility.tag $(DAT)/rumors.tru $(DAT)/rumors.fal @$(subst /,\,$(U)makedefs.exe -r) $(DAT)/quest.dat: $(O)utility.tag $(DAT)/quest.txt @$(subst /,\,$(U)makedefs.exe -q) $(DAT)/oracles: $(O)utility.tag $(DAT)/oracles.txt @$(subst /,\,$(U)makedefs.exe -h) $(O)sp_lev.tag: $(O)utility.tag $(DAT)/beholder.des $(DAT)/bigroom.des \ $(DAT)/blkmar.des $(DAT)/castle.des $(DAT)/grund.des \ $(DAT)/dragons.des $(DAT)/endgame.des \ $(DAT)/gehennom.des $(DAT)/giants.des $(DAT)/guild.des \ $(DAT)/knox.des $(DAT)/kobold-1.des $(DAT)/kobold-2.des \ $(DAT)/lich.des $(DAT)/mall-1.des $(DAT)/mall-2.des \ $(DAT)/medusa.des $(DAT)/sokoban.des \ $(DAT)/mines.des $(DAT)/mtemple.des $(DAT)/newmall.des \ $(DAT)/nymph.des $(DAT)/oracle.des $(DAT)/rats.des \ $(DAT)/sea.des $(DAT)/spiders.des $(DAT)/stor-1.des \ $(DAT)/stor-2.des $(DAT)/stor-3.des $(DAT)/tomb.des \ $(DAT)/tower.des $(DAT)/yendor.des \ $(DAT)/arch.des $(DAT)/barb.des $(DAT)/caveman.des \ $(DAT)/flame.des \ $(DAT)/healer.des $(DAT)/ice.des \ $(DAT)/knight.des $(DAT)/monk.des \ $(DAT)/necro.des $(DAT)/priest.des $(DAT)/rogue.des \ $(DAT)/samurai.des $(DAT)/tourist.des $(DAT)/slayer.des \ $(DAT)/valkyrie.des $(DAT)/wizard.des $(DAT)/yeoman.des \ $(DAT)/frnknstn.des $(DAT)/nightmar.des $(DAT)/ranger.des @$(subst /,\,cd $(DAT)) @$(subst /,\,$(U)lev_comp beholder.des) @$(subst /,\,$(U)lev_comp bigroom.des) @$(subst /,\,$(U)lev_comp blkmar.des) @$(subst /,\,$(U)lev_comp castle.des) @$(subst /,\,$(U)lev_comp grund.des) @$(subst /,\,$(U)lev_comp dragons.des) @$(subst /,\,$(U)lev_comp endgame.des) @$(subst /,\,$(U)lev_comp frnknstn.des) @$(subst /,\,$(U)lev_comp gehennom.des) @$(subst /,\,$(U)lev_comp giants.des) @$(subst /,\,$(U)lev_comp guild.des) @$(subst /,\,$(U)lev_comp knox.des) @$(subst /,\,$(U)lev_comp kobold-1.des) @$(subst /,\,$(U)lev_comp kobold-2.des) @$(subst /,\,$(U)lev_comp lich.des) @$(subst /,\,$(U)lev_comp mall-1.des) @$(subst /,\,$(U)lev_comp mall-2.des) @$(subst /,\,$(U)lev_comp mines.des) @$(subst /,\,$(U)lev_comp medusa.des) @$(subst /,\,$(U)lev_comp mtemple.des) @$(subst /,\,$(U)lev_comp necro.des) @$(subst /,\,$(U)lev_comp newmall.des) @$(subst /,\,$(U)lev_comp nightmar.des) @$(subst /,\,$(U)lev_comp nymph.des) @$(subst /,\,$(U)lev_comp oracle.des) @$(subst /,\,$(U)lev_comp rats.des) @$(subst /,\,$(U)lev_comp sea.des) @$(subst /,\,$(U)lev_comp sokoban.des) @$(subst /,\,$(U)lev_comp spiders.des) @$(subst /,\,$(U)lev_comp stor-1.des) @$(subst /,\,$(U)lev_comp stor-2.des) @$(subst /,\,$(U)lev_comp stor-3.des) @$(subst /,\,$(U)lev_comp tomb.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 darkelf.des) # @$(subst /,\,$(U)lev_comp dopp.des) # @$(subst /,\,$(U)lev_comp dwarf.des) # @$(subst /,\,$(U)lev_comp elf.des) @$(subst /,\,$(U)lev_comp flame.des) # @$(subst /,\,$(U)lev_comp gnome.des) @$(subst /,\,$(U)lev_comp healer.des) # @$(subst /,\,$(U)lev_comp hobbit.des) @$(subst /,\,$(U)lev_comp ice.des) @$(subst /,\,$(U)lev_comp knight.des) # @$(subst /,\,$(U)lev_comp lycn.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 slayer.des) @$(subst /,\,$(U)lev_comp tourist.des) @$(subst /,\,$(U)lev_comp valkyrie.des) @$(subst /,\,$(U)lev_comp wizard.des) @$(subst /,\,$(U)lev_comp yeoman.des) @$(subst /,\,cd $(SRC)) @$(subst /,\,echo sp_levs done > $@) $(DAT)/dungeon: $(O)utility.tag $(DAT)/dungeon.def @$(subst /,\,$(U)makedefs.exe -e) @$(subst /,\,cd $(DAT)) @$(subst /,\,$(U)dgn_comp.exe dungeon.pdf) @$(subst /,\,cd $(SRC)) #========================================== # DLB stuff #========================================== #note that dir below assumes bin/dir.exe from djgpp distribution # $(DAT)/dlb.lst: $(U)dlb_main.exe $(DAT)/data $(DAT)/rumors $(DAT)/dungeon \ $(DAT)/oracles $(DAT)/quest.dat $(O)sp_lev.tag @$(subst /,\,echo dat done >$(O)dat.tag) @$(subst /,\,cd $(DAT)) @$(subst /,\,$(UPD) $(MSYS)/msdoshlp.txt .) @$(subst /,\,echo data >dlb.lst) @$(subst /,\,echo oracles >>dlb.lst) @$(subst /,\,echo options >>dlb.lst) @$(subst /,\,echo rumors >>dlb.lst) @$(subst /,\,echo help >>dlb.lst) @$(subst /,\,echo hh >>dlb.lst) @$(subst /,\,echo cmdhelp >>dlb.lst) @$(subst /,\,echo history >>dlb.lst) @$(subst /,\,echo opthelp >>dlb.lst) @$(subst /,\,echo wizhelp >>dlb.lst) @$(subst /,\,echo license >>dlb.lst) @$(subst /,\,echo msdoshlp.txt >>dlb.lst) @$(subst /,\,echo gypsy.txt >>dlb.lst) @$(subst /,\,cd $(SRC)) $(DAT)/nhshare: $(U)dlb_main.exe $(DAT)/data $(DAT)/rumors \ $(DAT)/oracles $(DAT)/dlb.lst @$(subst /,\,cd $(DAT)) @$(subst /,\,$(UPD) $(MSYS)/msdoshlp.txt $(DAT)/msdoshlp.txt) @$(subst /,\,$(U)dlb_main CcvIf $(DAT) dlb.lst nhshare) @$(subst /,\,cd $(SRC)) $(DAT)/nhushare: $(U)dlb_main.exe $(DAT)/dungeon $(DAT)/quest.dat $(O)sp_lev.tag @$(subst /,\,cd $(DAT)) @$(subst /,\,echo dungeon >dlb2.lst) @$(subst /,\,echo quest.dat >>dlb2.lst) @$(LS) $(subst /,\,*.lev) >>dlb2.lst @$(subst /,\,$(U)dlb_main cvIf dlb2.lst nhushare) @$(subst /,\,cd $(SRC)) $(U)dlb_main.exe: $(DLBOBJS) $(LINK) $(LFLAGS) -o$@ $(DLBOBJS) @$(subst /,\,@$(UPD) $@ $(DAT)/dlb_main.exe) $(O)dlb_main.o: $(U)dlb_main.c $(INCL)/config.h $(DLB_H) $(CC) $(cflags) -o$@ $(U)dlb_main.c #========================================== # Game Dependencies #========================================== # sys/share $(O)main.o: $(HACK_H) $(DLB_H) $(SSHR)/pcmain.c $(CC) $(cflags) -o$@ $(SSHR)/pcmain.c $(O)tty.o: $(HACK_H) $(INCL)/wintty.h $(SSHR)/pctty.c $(CC) $(cflags) -o$@ $(SSHR)/pctty.c $(O)unix.o: $(HACK_H) $(SSHR)/pcunix.c $(CC) $(cflags) -o$@ $(SSHR)/pcunix.c $(O)sys.o : $(HACK_H) $(SSHR)/pcsys.c $(CC) $(cflags) -o$@ $(SSHR)/pcsys.c # sys/msdos $(O)msdos.o : $(HACK_H) $(MSYS)/msdos.c $(CC) $(cflags) -o$@ $(MSYS)/msdos.c $(O)pckeys.o : $(HACK_H) $(MSYS)/pckeys.c $(CC) $(cflags) -o$@ $(MSYS)/pckeys.c $(O)pctiles.o : $(HACK_H) $(MSYS)/pctiles.c $(MSYS)/portio.h $(INCL)/filename.h $(CC) $(cflags) -I$(MSYS) -I$(WSHR) -o$@ $(MSYS)/pctiles.c $(O)sound.o : $(HACK_H) $(MSYS)/sound.c $(MSYS)/portio.h $(CC) $(cflags) -o$@ $(MSYS)/sound.c $(O)video.o : $(HACK_H) $(MSYS)/pcvideo.h $(MSYS)/portio.h $(MSYS)/video.c $(CC) $(cflags) -o$@ -I$(MSYS) $(MSYS)/video.c $(O)vidvga.o : $(HACK_H) $(MSYS)/pcvideo.h $(MSYS)/portio.h $(TILE_H) $(MSYS)/vidvga.c $(CC) $(cflags) -I$(MSYS) -I$(WSHR) -o$@ $(MSYS)/vidvga.c $(O)vidtxt.o : $(HACK_H) $(MSYS)/pcvideo.h $(MSYS)/portio.h $(TILE_H) $(MSYS)/vidtxt.c $(CC) $(cflags) -o$@ -I$(MSYS) $(MSYS)/vidtxt.c $(O)stubvid.o : $(HACK_H) $(MSYS)/pcvideo.h $(MSYS)/video.c $(CC) $(cflags) -I$(MSYS) -DSTUBVIDEO -o$@ $(MSYS)/video.c # JRN: Instead of copying all those header files from $(MSYS), just use -I vidalleg.o : $(MSYS)/vidalleg.c $(HACK_H) $(INCL)/pcvideo.h $(INCL)/portio.h \ $(TILE_H) $(MSYS)/alginit.h $(MSYS)/alfuncs.h $(MSYS)/alnames.h \ $(MSYS)/loadfont.h $(MSYS)/2xsai.h $(CC) $(cflags) -I$(MSYS) -o$@ $(AAFLAG) $< 2xsai.o: $(MSYS)/2xsai.c $(MSYS)/2xsai.h $(CC) $(cflags) -I$(MSYS) $< # src dependencies # # The rest are stolen from sys/unix/Makefile.src, # with the following changes: # o -c (which is included in cflags) substituted with -o$@ , # o an explicit build instruction for dlb.o because it requires # a .h file in ../sys/msdos. # o the PATCHLEV_H macro is substitued for $(INCL)/patchlevel.h # to work around a long filename issue. # o $(cflags) changed to $(cflags) # Other than that, these dependencies are untouched. # That means that there is some irrelevant stuff # in here, but maintenance should be easier. # $(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)unixres.o: ../sys/unix/unixres.c $(CONFIG_H) $(CC) $(cflags) -o$@ ../sys/unix/unixres.c $(O)bemain.o: ../sys/be/bemain.c $(HACK_H) $(INCL)/dlb.h $(CC) $(cflags) -o$@ ../sys/be/bemain.c $(O)getline.o: ../win/tty/getline.c $(HACK_H) $(INCL)/func_tab.h $(CC) $(cflags) -o$@ ../win/tty/getline.c $(O)termcap.o: ../win/tty/termcap.c $(HACK_H) $(INCL)/tcap.h $(CC) $(cflags) -o$@ ../win/tty/termcap.c $(O)topl.o: ../win/tty/topl.c $(HACK_H) $(INCL)/tcap.h $(CC) $(cflags) -o$@ ../win/tty/topl.c $(O)wintty.o: ../win/tty/wintty.c $(HACK_H) $(INCL)/dlb.h \ $(PATCHLEV_H) $(INCL)/tcap.h $(CC) $(cflags) -o$@ ../win/tty/wintty.c $(O)Window.o: ../win/X11/Window.c $(INCL)/xwindowp.h $(INCL)/xwindow.h \ $(CONFIG_H) $(CC) $(cflags) -o$@ ../win/X11/Window.c $(O)dialogs.o: ../win/X11/dialogs.c $(CONFIG_H) $(CC) $(cflags) -o$@ ../win/X11/dialogs.c $(O)winX.o: ../win/X11/winX.c $(HACK_H) $(INCL)/winX.h $(INCL)/dlb.h \ $(PATCHLEV_H) ../win/X11/nh72icon \ ../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) $(TILE_H) $(O)gnaskstr.o: ../win/gnome/gnaskstr.c ../win/gnome/gnaskstr.h \ ../win/gnome/gnmain.h $(CC) $(cflags) $(GNOMEINC) -o$@ ../win/gnome/gnaskstr.c $(O)gnbind.o: ../win/gnome/gnbind.c ../win/gnome/gnbind.h ../win/gnome/gnmain.h \ ../win/gnome/gnaskstr.h ../win/gnome/gnyesno.h $(CC) $(cflags) $(GNOMEINC) -o$@ ../win/gnome/gnbind.c $(O)gnglyph.o: ../win/gnome/gnglyph.c ../win/gnome/gnglyph.h $(INCL)/tile2x11.h $(CC) $(cflags) $(GNOMEINC) -o$@ ../win/gnome/gnglyph.c $(O)gnmain.o: ../win/gnome/gnmain.c ../win/gnome/gnmain.h ../win/gnome/gnsignal.h \ ../win/gnome/gnbind.h ../win/gnome/gnopts.h $(HACK_H) \ $(INCL)/date.h $(CC) $(cflags) $(GNOMEINC) -o$@ ../win/gnome/gnmain.c $(O)gnmap.o: ../win/gnome/gnmap.c ../win/gnome/gnmap.h ../win/gnome/gnglyph.h \ ../win/gnome/gnsignal.h $(HACK_H) $(CC) $(cflags) $(GNOMEINC) -o$@ ../win/gnome/gnmap.c $(O)gnmenu.o: ../win/gnome/gnmenu.c ../win/gnome/gnmenu.h ../win/gnome/gnmain.h \ ../win/gnome/gnbind.h $(CC) $(cflags) $(GNOMEINC) -o$@ ../win/gnome/gnmenu.c $(O)gnmesg.o: ../win/gnome/gnmesg.c ../win/gnome/gnmesg.h ../win/gnome/gnsignal.h $(CC) $(cflags) $(GNOMEINC) -o$@ ../win/gnome/gnmesg.c $(O)gnopts.o: ../win/gnome/gnopts.c ../win/gnome/gnopts.h ../win/gnome/gnglyph.h \ ../win/gnome/gnmain.h ../win/gnome/gnmap.h $(HACK_H) $(CC) $(cflags) $(GNOMEINC) -o$@ ../win/gnome/gnopts.c $(O)gnplayer.o: ../win/gnome/gnplayer.c ../win/gnome/gnplayer.h \ ../win/gnome/gnmain.h $(HACK_H) $(CC) $(cflags) $(GNOMEINC) -o$@ ../win/gnome/gnplayer.c $(O)gnsignal.o: ../win/gnome/gnsignal.c ../win/gnome/gnsignal.h \ ../win/gnome/gnmain.h $(CC) $(cflags) $(GNOMEINC) -o$@ ../win/gnome/gnsignal.c $(O)gnstatus.o: ../win/gnome/gnstatus.c ../win/gnome/gnstatus.h \ ../win/gnome/gnsignal.h ../win/gnome/gn_xpms.h \ ../win/gnome/gnomeprv.h $(CC) $(cflags) $(GNOMEINC) -o$@ ../win/gnome/gnstatus.c $(O)gntext.o: ../win/gnome/gntext.c ../win/gnome/gntext.h ../win/gnome/gnmain.h \ ../win/gnome/gn_rip.h $(CC) $(cflags) $(GNOMEINC) -o$@ ../win/gnome/gntext.c $(O)gnworn.o: ../win/gnome/gnworn.c ../win/gnome/gnworn.h ../win/gnome/gnglyph.h \ ../win/gnome/gnsignal.h ../win/gnome/gnomeprv.h $(CC) $(cflags) $(GNOMEINC) -o$@ ../win/gnome/gnworn.c $(O)gnyesno.o: ../win/gnome/gnyesno.c ../win/gnome/gnbind.h ../win/gnome/gnyesno.h $(CC) $(cflags) $(GNOMEINC) -o$@ ../win/gnome/gnyesno.c $(O)wingem.o: ../win/gem/wingem.c $(HACK_H) $(INCL)/func_tab.h $(INCL)/dlb.h \ $(PATCHLEV_H) $(INCL)/wingem.h $(CC) $(cflags) -o$@ ../win/gem/wingem.c $(O)wingem1.o: ../win/gem/wingem1.c $(INCL)/gem_rsc.h $(INCL)/load_img.h \ $(INCL)/gr_rect.h $(INCL)/wintype.h $(INCL)/wingem.h $(CC) $(cflags) -o$@ ../win/gem/wingem1.c $(O)load_img.o: ../win/gem/load_img.c $(INCL)/load_img.h $(CC) $(cflags) -o$@ ../win/gem/load_img.c $(O)gr_rect.o: ../win/gem/gr_rect.c $(INCL)/gr_rect.h $(CC) $(cflags) -o$@ ../win/gem/gr_rect.c $(O)qt_win.o: ../win/Qt/qt_win.cpp $(HACK_H) $(INCL)/func_tab.h \ $(INCL)/dlb.h $(PATCHLEV_H) $(INCL)/tile2x11.h \ $(INCL)/qt_win.h $(INCL)/qt_clust.h $(INCL)/qt_kde0.h \ $(INCL)/qt_xpms.h qt_win.moc qt_kde0.moc qttableview.moc $(CXX) $(CXXFLAGS) -o$@ ../win/Qt/qt_win.cpp $(O)qt_clust.o: ../win/Qt/qt_clust.cpp $(INCL)/qt_clust.h $(CXX) $(CXXFLAGS) -o$@ ../win/Qt/qt_clust.cpp $(O)qttableview.o: ../win/Qt/qttableview.cpp $(INCL)/qttableview.h $(CXX) $(CXXFLAGS) -o$@ ../win/Qt/qttableview.cpp $(O)monstr.o: monstr.c $(CONFIG_H) $(O)vis_tab.o: vis_tab.c $(CONFIG_H) $(INCL)/vis_tab.h $(O)allmain.o: allmain.c $(HACK_H) $(O)alloc.o: alloc.c $(CONFIG_H) $(O)apply.o: apply.c $(HACK_H) $(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)borg.o: borg.c $(HACK_H) $(INCL)/func_tab.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 $(CC) $(cflags) -I../sys/msdos -o$@ dlb.c $(O)do.o: do.c $(HACK_H) $(INCL)/lev.h $(O)do_name.o: do_name.c $(HACK_H) $(O)do_wear.o: do_wear.c $(HACK_H) $(O)dog.o: dog.c $(HACK_H) $(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 $(INCL)/file.h $(INCL)/filename.h $(O)fountain.o: fountain.c $(HACK_H) $(O)gypsy.o: gypsy.c $(HACK_H) $(INCL)/egyp.h $(INCL)/qtext.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 $(INCL)/prop.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 \ $(INCL)/epri.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 $(INCL)/quest.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 $(INCL)/quest.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 $(INCL)/quest.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 $(INCL)/align.h $(INCL)/rect.h $(O)spell.o: spell.c $(HACK_H) $(O)steal.o: steal.c $(HACK_H) $(O)steed.o: steed.c $(HACK_H) $(O)tech.o: tech.c $(HACK_H) $(INCL)/tech.h $(O)teleport.o: teleport.c $(HACK_H) $(O)timeout.o: timeout.c $(HACK_H) $(INCL)/lev.h $(O)topten.o: topten.c $(HACK_H) $(INCL)/dlb.h $(PATCHLEV_H) $(O)track.o: track.c $(HACK_H) $(O)trap.o: trap.c $(HACK_H) $(O)u_init.o: u_init.c $(HACK_H) $(O)uhitm.o: uhitm.c $(HACK_H) $(O)vault.o: vault.c $(HACK_H) $(INCL)/vault.h $(O)version.o: version.c $(HACK_H) $(INCL)/date.h $(PATCHLEV_H) $(O)vision.o: vision.c $(HACK_H) $(INCL)/vis_tab.h $(O)weapon.o: weapon.c $(HACK_H) $(INCL)/skills.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 $(INCL)/epri.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 slashem-0.0.7E7F3/sys/msdos/tiles/0000775000076400007640000000000010545462317014737 5ustar alialislashem-0.0.7E7F3/sys/msdos/tiles/subs/0000775000076400007640000000000010545462317015713 5ustar alialislashem-0.0.7E7F3/sys/msdos/tiles/subs/altarn.bmp0000664000076400007640000000406610545462317017702 0ustar alialiBM66( ÿÿ0P0@a0 0qqq¡¡¡@@@‘‘‘aqaPaPPPP000 aaa qqaPa@@P0  0 qq @0@0@ 0qaPa0 0aaP0‘‘@P @P@aqP@qq@a@aa@‘‘0PÿH$m$Um$ªm$ÿm$‘$U‘$ª‘$ÿ‘$¶$U¶$ª¶$ÿ¶$Ú$UÚ$ªÚ$ÿÚ$ÿ$Uÿ$ªÿ$ÿÿ$HUHªHÿH$HU$Hª$Hÿ$HHHUHHªHHÿHHmHUmHªmHÿmH‘HU‘Hª‘Hÿ‘H¶HU¶Hª¶Hÿ¶HÚHUÚHªÚHÿÚHÿHUÿHªÿHÿÿHmUmªmÿm$mU$mª$mÿ$mHmUHmªHmÿHmmmUmmªmmÿmm‘mU‘mª‘mÿ‘m¶mU¶mª¶mÿ¶mÚmUÚmªÚmÿÚmÿmUÿmªÿmÿÿm‘U‘ª‘ÿ‘$‘U$‘ª$‘ÿ$‘H‘UH‘ªH‘ÿH‘m‘Um‘ªm‘ÿm‘‘‘U‘‘ª‘‘ÿ‘‘¶‘U¶‘ª¶‘ÿ¶‘Ú‘UÚ‘ªÚ‘ÿÚ‘ÿ‘Uÿ‘ªÿ‘ÿÿ‘¶U¶ª¶ÿ¶$¶U$¶ª$¶ÿ$¶H¶UH¶ªH¶ÿH¶m¶Um¶ªm¶ÿm¶‘¶U‘¶ª‘¶ÿ‘¶¶¶U¶¶ª¶¶ÿ¶¶Ú¶UÚ¶ªÚ¶ÿÚ¶ÿ¶Uÿ¶ªÿ¶ÿÿ¶ÚUÚªÚÿÚ$ÚU$Úª$Úÿ$ÚHÚUHÚªHÚÿHÚmÚUmÚªmÚÿmÚ‘ÚU‘Úª‘Úÿ‘Ú¶ÚU¶Úª¶Úÿ¶ÚÚÚUÚÚªÚÚÿÚÚÿÚUÿÚªÿÚÿÿÚÿUÿªÿÿÿ$ÿU$ÿª$ÿÿ$ÿHÿUHÿªHÿÿHÿmÿUmÿªmÿÿmÿ‘ÿU‘ÿª‘ÿÿ‘ÿ¶ÿU¶ÿª¶ÿÿ¶ÿÚÿUÚÿªÚÿÿÚÿÿÿUÿÿÿÿÿIIIIIIIIIIIIIIIIIIIIIIIIIIImI'          M  MM#   #MM )M   M&")slashem-0.0.7E7F3/sys/msdos/tiles/subs/pri_feml.bmp0000664000076400007640000000406610545462317020216 0ustar alialiBM66( ÿÿòòò0¡@ÂPò@¡Ââââ ÒÒÒòò@aÂÂa‘²ò¡âÂÂÂPq¡00¡²²²¡ÒòqÂââ000@ªÚÿÚÿUÿªÿÿÿ$U$ª$ÿ$$$U$$ª$$ÿ$$H$UH$ªH$ÿH$m$Um$ªm$ÿm$‘$U‘$ª‘$ÿ‘$¶$U¶$ª¶$ÿ¶$Ú$UÚ$ªÚ$ÿÚ$ÿ$Uÿ$ªÿ$ÿÿ$HUHªHÿH$HU$Hª$Hÿ$HHHUHHªHHÿHHmHUmHªmHÿmH‘HU‘Hª‘Hÿ‘H¶HU¶Hª¶Hÿ¶HÚHUÚHªÚHÿÚHÿHUÿHªÿHÿÿHmUmªmÿm$mU$mª$mÿ$mHmUHmªHmÿHmmmUmmªmmÿmm‘mU‘mª‘mÿ‘m¶mU¶mª¶mÿ¶mÚmUÚmªÚmÿÚmÿmUÿmªÿmÿÿm‘U‘ª‘ÿ‘$‘U$‘ª$‘ÿ$‘H‘UH‘ªH‘ÿH‘m‘Um‘ªm‘ÿm‘‘‘U‘‘ª‘‘ÿ‘‘¶‘U¶‘ª¶‘ÿ¶‘Ú‘UÚ‘ªÚ‘ÿÚ‘ÿ‘Uÿ‘ªÿ‘ÿÿ‘¶U¶ª¶ÿ¶$¶U$¶ª$¶ÿ$¶H¶UH¶ªH¶ÿH¶m¶Um¶ªm¶ÿm¶‘¶U‘¶ª‘¶ÿ‘¶¶¶U¶¶ª¶¶ÿ¶¶Ú¶UÚ¶ªÚ¶ÿÚ¶ÿ¶Uÿ¶ªÿ¶ÿÿ¶ÚUÚªÚÿÚ$ÚU$Úª$Úÿ$ÚHÚUHÚªHÚÿHÚmÚUmÚªmÚÿmÚ‘ÚU‘Úª‘Úÿ‘Ú¶ÚU¶Úª¶Úÿ¶ÚÚÚUÚÚªÚÚÿÚÚÿÚUÿÚªÿÚÿÿÚÿUÿªÿÿÿ$ÿU$ÿª$ÿÿ$ÿHÿUHÿªHÿÿHÿmÿUmÿªmÿÿmÿ‘ÿU‘ÿª‘ÿÿ‘ÿ¶ÿU¶ÿª¶ÿÿ¶ÿÚÿUÚÿªÚÿÿÚÿÿÿUÿÿÿÿÿÿ ÿ üüüÿ ÿ üüü üüÿ ÿ  üÿ ÿ   ÿÿ  ÿÿ  ÿÿ  ÿÿÿ ÿÿÿöö ÿÿÿöÑüÿÿÿÿüÿÿühühhÿÿ h    h     höÑÿÿÿ hööÿÿ ÿÿÿ hööÿ ÿÿÿ ÿ hü ÿ  hh     hüh hh h  öh öööÑ hüü ö ü ÿ ü höh hÿüü  ÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿslashem-0.0.7E7F3/sys/msdos/tiles/subs/altarc.bmp0000664000076400007640000000406610545462317017667 0ustar alialiBM66( ÿÿ0P0@a0 0PPP@@@ÂÂÂaaa000òÒÒÒ²ÒÒòòòÿm‘U‘ª‘ÿ‘¶U¶ª¶ÿ¶ÚUÚªÚÿÚÿUÿªÿÿÿ$U$ª$ÿ$$$U$$ª$$ÿ$$H$UH$ªH$ÿH$m$Um$ªm$ÿm$‘$U‘$ª‘$ÿ‘$¶$U¶$ª¶$ÿ¶$Ú$UÚ$ªÚ$ÿÚ$ÿ$Uÿ$ªÿ$ÿÿ$HUHªHÿH$HU$Hª$Hÿ$HHHUHHªHHÿHHmHUmHªmHÿmH‘HU‘Hª‘Hÿ‘H¶HU¶Hª¶Hÿ¶HÚHUÚHªÚHÿÚHÿHUÿHªÿHÿÿHmUmªmÿm$mU$mª$mÿ$mHmUHmªHmÿHmmmUmmªmmÿmm‘mU‘mª‘mÿ‘m¶mU¶mª¶mÿ¶mÚmUÚmªÚmÿÚmÿmUÿmªÿmÿÿm‘U‘ª‘ÿ‘$‘U$‘ª$‘ÿ$‘H‘UH‘ªH‘ÿH‘m‘Um‘ªm‘ÿm‘‘‘U‘‘ª‘‘ÿ‘‘¶‘U¶‘ª¶‘ÿ¶‘Ú‘UÚ‘ªÚ‘ÿÚ‘ÿ‘Uÿ‘ªÿ‘ÿÿ‘¶U¶ª¶ÿ¶$¶U$¶ª$¶ÿ$¶H¶UH¶ªH¶ÿH¶m¶Um¶ªm¶ÿm¶‘¶U‘¶ª‘¶ÿ‘¶¶¶U¶¶ª¶¶ÿ¶¶Ú¶UÚ¶ªÚ¶ÿÚ¶ÿ¶Uÿ¶ªÿ¶ÿÿ¶ÚUÚªÚÿÚ$ÚU$Úª$Úÿ$ÚHÚUHÚªHÚÿHÚmÚUmÚªmÚÿmÚ‘ÚU‘Úª‘Úÿ‘Ú¶ÚU¶Úª¶Úÿ¶ÚÚÚUÚÚªÚÚÿÚÚÿÚUÿÚªÿÚÿÿÚÿUÿªÿÿÿ$ÿU$ÿª$ÿÿ$ÿHÿUHÿªHÿÿHÿmÿUmÿªmÿÿmÿ‘ÿU‘ÿª‘ÿÿ‘ÿ¶ÿU¶ÿª¶ÿÿ¶ÿÚÿUÚÿªÚÿÿÚÿÿÿUÿÿÿÿÿIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII   ÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛàÛÛàÛÛàÛÛàÛàÛàÛààÛàÛàààààààÿààÿàààÿàÿààÿÿslashem-0.0.7E7F3/sys/msdos/tiles/subs/pri_mall.bmp0000664000076400007640000000406610545462317020220 0ustar alialiBM66( ÿÿÒÒÒ0¡ÂÂÂòòòâââPò@¡ÂÂÂòò‘²òP¡q²²²¡Òò@ª‘ÿ‘¶U¶ª¶ÿ¶ÚUÚªÚÿÚÿUÿªÿÿÿ$U$ª$ÿ$$$U$$ª$$ÿ$$H$UH$ªH$ÿH$m$Um$ªm$ÿm$‘$U‘$ª‘$ÿ‘$¶$U¶$ª¶$ÿ¶$Ú$UÚ$ªÚ$ÿÚ$ÿ$Uÿ$ªÿ$ÿÿ$HUHªHÿH$HU$Hª$Hÿ$HHHUHHªHHÿHHmHUmHªmHÿmH‘HU‘Hª‘Hÿ‘H¶HU¶Hª¶Hÿ¶HÚHUÚHªÚHÿÚHÿHUÿHªÿHÿÿHmUmªmÿm$mU$mª$mÿ$mHmUHmªHmÿHmmmUmmªmmÿmm‘mU‘mª‘mÿ‘m¶mU¶mª¶mÿ¶mÚmUÚmªÚmÿÚmÿmUÿmªÿmÿÿm‘U‘ª‘ÿ‘$‘U$‘ª$‘ÿ$‘H‘UH‘ªH‘ÿH‘m‘Um‘ªm‘ÿm‘‘‘U‘‘ª‘‘ÿ‘‘¶‘U¶‘ª¶‘ÿ¶‘Ú‘UÚ‘ªÚ‘ÿÚ‘ÿ‘Uÿ‘ªÿ‘ÿÿ‘¶U¶ª¶ÿ¶$¶U$¶ª$¶ÿ$¶H¶UH¶ªH¶ÿH¶m¶Um¶ªm¶ÿm¶‘¶U‘¶ª‘¶ÿ‘¶¶¶U¶¶ª¶¶ÿ¶¶Ú¶UÚ¶ªÚ¶ÿÚ¶ÿ¶Uÿ¶ªÿ¶ÿÿ¶ÚUÚªÚÿÚ$ÚU$Úª$Úÿ$ÚHÚUHÚªHÚÿHÚmÚUmÚªmÚÿmÚ‘ÚU‘Úª‘Úÿ‘Ú¶ÚU¶Úª¶Úÿ¶ÚÚÚUÚÚªÚÚÿÚÚÿÚUÿÚªÿÚÿÿÚÿUÿªÿÿÿ$ÿU$ÿª$ÿÿ$ÿHÿUHÿªHÿÿHÿmÿUmÿªmÿÿmÿ‘ÿU‘ÿª‘ÿÿ‘ÿ¶ÿU¶ÿª¶ÿÿ¶ÿÚÿUÚÿªÚÿÿÚÿÿÿUÿÿÿÿÿü   ÿÿ ÿÿ ÿ ÿüü  ÿÿ ÿÿ üÿÿ üÑÿÿ ü ÿÿü ÿÿÿ  ÿÿ Ñ ÿ ÿÿÿÑöÑ ÿÿÿÿöö ÿÿÿöÿÿüÿöööÿ ÿööööÑÿüÿöööÑ ÿöÑöÑ üÿüü üü üüü ÿ ü ÿüü  ü  ÿÿüüslashem-0.0.7E7F3/sys/msdos/tiles/subs/pri_femn.bmp0000664000076400007640000000406610545462317020220 0ustar alialiBM66( ÿÿ¡òòòÂò@¡ÂâââÒÒÒòò@aÂÂa‘²ò¡âÂÂÂPq¡00¡²²²¡ÒòqÂââ000@ªÚÿÚÿUÿªÿÿÿ$U$ª$ÿ$$$U$$ª$$ÿ$$H$UH$ªH$ÿH$m$Um$ªm$ÿm$‘$U‘$ª‘$ÿ‘$¶$U¶$ª¶$ÿ¶$Ú$UÚ$ªÚ$ÿÚ$ÿ$Uÿ$ªÿ$ÿÿ$HUHªHÿH$HU$Hª$Hÿ$HHHUHHªHHÿHHmHUmHªmHÿmH‘HU‘Hª‘Hÿ‘H¶HU¶Hª¶Hÿ¶HÚHUÚHªÚHÿÚHÿHUÿHªÿHÿÿHmUmªmÿm$mU$mª$mÿ$mHmUHmªHmÿHmmmUmmªmmÿmm‘mU‘mª‘mÿ‘m¶mU¶mª¶mÿ¶mÚmUÚmªÚmÿÚmÿmUÿmªÿmÿÿm‘U‘ª‘ÿ‘$‘U$‘ª$‘ÿ$‘H‘UH‘ªH‘ÿH‘m‘Um‘ªm‘ÿm‘‘‘U‘‘ª‘‘ÿ‘‘¶‘U¶‘ª¶‘ÿ¶‘Ú‘UÚ‘ªÚ‘ÿÚ‘ÿ‘Uÿ‘ªÿ‘ÿÿ‘¶U¶ª¶ÿ¶$¶U$¶ª$¶ÿ$¶H¶UH¶ªH¶ÿH¶m¶Um¶ªm¶ÿm¶‘¶U‘¶ª‘¶ÿ‘¶¶¶U¶¶ª¶¶ÿ¶¶Ú¶UÚ¶ªÚ¶ÿÚ¶ÿ¶Uÿ¶ªÿ¶ÿÿ¶ÚUÚªÚÿÚ$ÚU$Úª$Úÿ$ÚHÚUHÚªHÚÿHÚmÚUmÚªmÚÿmÚ‘ÚU‘Úª‘Úÿ‘Ú¶ÚU¶Úª¶Úÿ¶ÚÚÚUÚÚªÚÚÿÚÚÿÚUÿÚªÿÚÿÿÚÿUÿªÿÿÿ$ÿU$ÿª$ÿÿ$ÿHÿUHÿªHÿÿHÿmÿUmÿªmÿÿmÿ‘ÿU‘ÿª‘ÿÿ‘ÿ¶ÿU¶ÿª¶ÿÿ¶ÿÚÿUÚÿªÚÿÿÚÿÿÿUÿÿÿÿÿÿ ÿ üüüÿ ÿ üüü üüÿ ÿ  üÿ ÿ   ÿÿ  ÿÿ  ÿÿ  ÿÿÿ ÿÿÿöö ÿÿÿöÑüÿÿÿÿüÿÿühühhÿÿ h    h     höÑÿÿÿ hööÿÿ ÿÿÿ hööÿ ÿÿÿ ÿ hü ÿ  hh     hüh hh h  öh öööÑ hüü ö ü ÿ ü höh hÿüü  ÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿslashem-0.0.7E7F3/sys/msdos/tiles/subs/rog_fem.bmp0000664000076400007640000000406610545462317020037 0ustar alialiBM66( ÿÿ@@@@@²@@²²@²²²²Ò²Òò@ÒÒÒÒÒòòò@@@@@ª‘ÿ‘¶U¶ª¶ÿ¶ÚUÚªÚÿÚÿUÿªÿÿÿ$U$ª$ÿ$$$U$$ª$$ÿ$$H$UH$ªH$ÿH$m$Um$ªm$ÿm$‘$U‘$ª‘$ÿ‘$¶$U¶$ª¶$ÿ¶$Ú$UÚ$ªÚ$ÿÚ$ÿ$Uÿ$ªÿ$ÿÿ$HUHªHÿH$HU$Hª$Hÿ$HHHUHHªHHÿHHmHUmHªmHÿmH‘HU‘Hª‘Hÿ‘H¶HU¶Hª¶Hÿ¶HÚHUÚHªÚHÿÚHÿHUÿHªÿHÿÿHmUmªmÿm$mU$mª$mÿ$mHmUHmªHmÿHmmmUmmªmmÿmm‘mU‘mª‘mÿ‘m¶mU¶mª¶mÿ¶mÚmUÚmªÚmÿÚmÿmUÿmªÿmÿÿm‘U‘ª‘ÿ‘$‘U$‘ª$‘ÿ$‘H‘UH‘ªH‘ÿH‘m‘Um‘ªm‘ÿm‘‘‘U‘‘ª‘‘ÿ‘‘¶‘U¶‘ª¶‘ÿ¶‘Ú‘UÚ‘ªÚ‘ÿÚ‘ÿ‘Uÿ‘ªÿ‘ÿÿ‘¶U¶ª¶ÿ¶$¶U$¶ª$¶ÿ$¶H¶UH¶ªH¶ÿH¶m¶Um¶ªm¶ÿm¶‘¶U‘¶ª‘¶ÿ‘¶¶¶U¶¶ª¶¶ÿ¶¶Ú¶UÚ¶ªÚ¶ÿÚ¶ÿ¶Uÿ¶ªÿ¶ÿÿ¶ÚUÚªÚÿÚ$ÚU$Úª$Úÿ$ÚHÚUHÚªHÚÿHÚmÚUmÚªmÚÿmÚ‘ÚU‘Úª‘Úÿ‘Ú¶ÚU¶Úª¶Úÿ¶ÚÚÚUÚÚªÚÚÿÚÚÿÚUÿÚªÿÚÿÿÚÿUÿªÿÿÿ$ÿU$ÿª$ÿÿ$ÿHÿUHÿªHÿÿHÿmÿUmÿªmÿÿmÿ‘ÿU‘ÿª‘ÿÿ‘ÿ¶ÿU¶ÿª¶ÿÿ¶ÿÚÿUÚÿªÚÿÿÚÿÿÿUÿÿÿÿÿ         úú  ÛÛÿú úú ÚÚ ú ÚÚúÚú   ú  slashem-0.0.7E7F3/sys/msdos/tiles/subs/pri_maln.bmp0000664000076400007640000000406610545462317020222 0ustar alialiBM66( ÿÿÒÒÒ¡ÂÂÂòòòâââò@¡ÂÂÂòò‘²òP¡q²²²¡Òò@ª‘ÿ‘¶U¶ª¶ÿ¶ÚUÚªÚÿÚÿUÿªÿÿÿ$U$ª$ÿ$$$U$$ª$$ÿ$$H$UH$ªH$ÿH$m$Um$ªm$ÿm$‘$U‘$ª‘$ÿ‘$¶$U¶$ª¶$ÿ¶$Ú$UÚ$ªÚ$ÿÚ$ÿ$Uÿ$ªÿ$ÿÿ$HUHªHÿH$HU$Hª$Hÿ$HHHUHHªHHÿHHmHUmHªmHÿmH‘HU‘Hª‘Hÿ‘H¶HU¶Hª¶Hÿ¶HÚHUÚHªÚHÿÚHÿHUÿHªÿHÿÿHmUmªmÿm$mU$mª$mÿ$mHmUHmªHmÿHmmmUmmªmmÿmm‘mU‘mª‘mÿ‘m¶mU¶mª¶mÿ¶mÚmUÚmªÚmÿÚmÿmUÿmªÿmÿÿm‘U‘ª‘ÿ‘$‘U$‘ª$‘ÿ$‘H‘UH‘ªH‘ÿH‘m‘Um‘ªm‘ÿm‘‘‘U‘‘ª‘‘ÿ‘‘¶‘U¶‘ª¶‘ÿ¶‘Ú‘UÚ‘ªÚ‘ÿÚ‘ÿ‘Uÿ‘ªÿ‘ÿÿ‘¶U¶ª¶ÿ¶$¶U$¶ª$¶ÿ$¶H¶UH¶ªH¶ÿH¶m¶Um¶ªm¶ÿm¶‘¶U‘¶ª‘¶ÿ‘¶¶¶U¶¶ª¶¶ÿ¶¶Ú¶UÚ¶ªÚ¶ÿÚ¶ÿ¶Uÿ¶ªÿ¶ÿÿ¶ÚUÚªÚÿÚ$ÚU$Úª$Úÿ$ÚHÚUHÚªHÚÿHÚmÚUmÚªmÚÿmÚ‘ÚU‘Úª‘Úÿ‘Ú¶ÚU¶Úª¶Úÿ¶ÚÚÚUÚÚªÚÚÿÚÚÿÚUÿÚªÿÚÿÿÚÿUÿªÿÿÿ$ÿU$ÿª$ÿÿ$ÿHÿUHÿªHÿÿHÿmÿUmÿªmÿÿmÿ‘ÿU‘ÿª‘ÿÿ‘ÿ¶ÿU¶ÿª¶ÿÿ¶ÿÚÿUÚÿªÚÿÿÚÿÿÿUÿÿÿÿÿü   ÿÿ ÿÿ ÿ ÿüü  ÿÿ ÿÿ üÿÿ üÑÿÿ ü ÿÿü ÿÿÿ  ÿÿ Ñ ÿ ÿÿÿÑöÑ ÿÿÿÿöö ÿÿÿöÿÿüÿöööÿ ÿööööÑÿüÿöööÑ ÿöÑöÑ üÿüü üü üüü ÿ ü ÿüü  ü  ÿÿüüslashem-0.0.7E7F3/sys/msdos/tiles/subs/altarm.bmp0000664000076400007640000000406610545462317017701 0ustar alialiBM66( ÿÿ0P0@a0 00ÂâÒ¡¡ò 0 0 q@ò ‘PòqÒ² P‘òaò P 0aò@P@ 0P0â0@0aÒò @‘0Òâ0²ò0@@0¡aÂò²PÒ @P 0‘ 0 Â0PP@PP0²Ò0Ò a¡ ¡ ¡Pâ0Pq²@òò²òqò0ò@Ò @a00 00qÂòòò@qÂ0Â0ÂÒ0Pa@¡ @¡0qq0q 0qÒò ÒòÒò ²ò @ P@ q‘aÒ Ò a0Ââ@âòPâòaâòqâò0²0¡òmUmªmÿm$mU$mª$mÿ$mHmUHmªHmÿHmmmUmmªmmÿmm‘mU‘mª‘mÿ‘m¶mU¶mª¶mÿ¶mÚmUÚmªÚmÿÚmÿmUÿmªÿmÿÿm‘U‘ª‘ÿ‘$‘U$‘ª$‘ÿ$‘H‘UH‘ªH‘ÿH‘m‘Um‘ªm‘ÿm‘‘‘U‘‘ª‘‘ÿ‘‘¶‘U¶‘ª¶‘ÿ¶‘Ú‘UÚ‘ªÚ‘ÿÚ‘ÿ‘Uÿ‘ªÿ‘ÿÿ‘¶U¶ª¶ÿ¶$¶U$¶ª$¶ÿ$¶H¶UH¶ªH¶ÿH¶m¶Um¶ªm¶ÿm¶‘¶U‘¶ª‘¶ÿ‘¶¶¶U¶¶ª¶¶ÿ¶¶Ú¶UÚ¶ªÚ¶ÿÚ¶ÿ¶Uÿ¶ªÿ¶ÿÿ¶ÚUÚªÚÿÚ$ÚU$Úª$Úÿ$ÚHÚUHÚªHÚÿHÚmÚUmÚªmÚÿmÚ‘ÚU‘Úª‘Úÿ‘Ú¶ÚU¶Úª¶Úÿ¶ÚÚÚUÚÚªÚÚÿÚÚÿÚUÿÚªÿÚÿÿÚÿUÿªÿÿÿ$ÿU$ÿª$ÿÿ$ÿHÿUHÿªHÿÿHÿmÿUmÿªmÿÿmÿ‘ÿU‘ÿª‘ÿÿ‘ÿ¶ÿU¶ÿª¶ÿÿ¶ÿÚÿUÚÿªÚÿÿÚÿÿÿUÿÿÿÿÿ   @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ è èèO =P ô[Z ä ¤ìùML%õððÄ \Nðõùù $ ý  úYˆ  ?]ðÌ3ˆ._;=VJV7'RUV5 ¨H„I05  *Ä /9:à4V 2d(„ðW)-è ; O -;/) = (#O) E ;:^  ˆ; ;Èì;„ )„ W^R#)-slashem-0.0.7E7F3/sys/msdos/tiles/subs/kni_fem.bmp0000664000076400007640000000406610545462317020031 0ustar alialiBM66( ÿÿÂqò‘¡âPa‘²ò¡ÂqÂaÂòâââP¡²²²@ÂòâPq¡â¡@¡Ââ@a¡aòâÂ0¡a‘qUÿªÿÿÿ$U$ª$ÿ$$$U$$ª$$ÿ$$H$UH$ªH$ÿH$m$Um$ªm$ÿm$‘$U‘$ª‘$ÿ‘$¶$U¶$ª¶$ÿ¶$Ú$UÚ$ªÚ$ÿÚ$ÿ$Uÿ$ªÿ$ÿÿ$HUHªHÿH$HU$Hª$Hÿ$HHHUHHªHHÿHHmHUmHªmHÿmH‘HU‘Hª‘Hÿ‘H¶HU¶Hª¶Hÿ¶HÚHUÚHªÚHÿÚHÿHUÿHªÿHÿÿHmUmªmÿm$mU$mª$mÿ$mHmUHmªHmÿHmmmUmmªmmÿmm‘mU‘mª‘mÿ‘m¶mU¶mª¶mÿ¶mÚmUÚmªÚmÿÚmÿmUÿmªÿmÿÿm‘U‘ª‘ÿ‘$‘U$‘ª$‘ÿ$‘H‘UH‘ªH‘ÿH‘m‘Um‘ªm‘ÿm‘‘‘U‘‘ª‘‘ÿ‘‘¶‘U¶‘ª¶‘ÿ¶‘Ú‘UÚ‘ªÚ‘ÿÚ‘ÿ‘Uÿ‘ªÿ‘ÿÿ‘¶U¶ª¶ÿ¶$¶U$¶ª$¶ÿ$¶H¶UH¶ªH¶ÿH¶m¶Um¶ªm¶ÿm¶‘¶U‘¶ª‘¶ÿ‘¶¶¶U¶¶ª¶¶ÿ¶¶Ú¶UÚ¶ªÚ¶ÿÚ¶ÿ¶Uÿ¶ªÿ¶ÿÿ¶ÚUÚªÚÿÚ$ÚU$Úª$Úÿ$ÚHÚUHÚªHÚÿHÚmÚUmÚªmÚÿmÚ‘ÚU‘Úª‘Úÿ‘Ú¶ÚU¶Úª¶Úÿ¶ÚÚÚUÚÚªÚÚÿÚÚÿÚUÿÚªÿÚÿÿÚÿUÿªÿÿÿ$ÿU$ÿª$ÿÿ$ÿHÿUHÿªHÿÿHÿmÿUmÿªmÿÿmÿ‘ÿU‘ÿª‘ÿÿ‘ÿ¶ÿU¶ÿª¶ÿÿ¶ÿÚÿUÚÿªÚÿÿÚÿÿÿUÿÿÿÿÿ» »     »Ñ» Ñ Ñ öÑÑÑ ÑÑ Ñ» »      »  »ÑÑö Ñö  Ñö  Ñö  Ñö ÑÑÑöö öÑööööööÑÑöö Ñö öö ö öö    slashem-0.0.7E7F3/sys/msdos/tiles/subs/wiz_fem.bmp0000664000076400007640000000406610545462317020061 0ustar alialiBM66( ÿÿaaaaa@PP@òò‘²òq¡ÒòÂòòòòòâââqòòòÂÿ‘¶U¶ª¶ÿ¶ÚUÚªÚÿÚÿUÿªÿÿÿ$U$ª$ÿ$$$U$$ª$$ÿ$$H$UH$ªH$ÿH$m$Um$ªm$ÿm$‘$U‘$ª‘$ÿ‘$¶$U¶$ª¶$ÿ¶$Ú$UÚ$ªÚ$ÿÚ$ÿ$Uÿ$ªÿ$ÿÿ$HUHªHÿH$HU$Hª$Hÿ$HHHUHHªHHÿHHmHUmHªmHÿmH‘HU‘Hª‘Hÿ‘H¶HU¶Hª¶Hÿ¶HÚHUÚHªÚHÿÚHÿHUÿHªÿHÿÿHmUmªmÿm$mU$mª$mÿ$mHmUHmªHmÿHmmmUmmªmmÿmm‘mU‘mª‘mÿ‘m¶mU¶mª¶mÿ¶mÚmUÚmªÚmÿÚmÿmUÿmªÿmÿÿm‘U‘ª‘ÿ‘$‘U$‘ª$‘ÿ$‘H‘UH‘ªH‘ÿH‘m‘Um‘ªm‘ÿm‘‘‘U‘‘ª‘‘ÿ‘‘¶‘U¶‘ª¶‘ÿ¶‘Ú‘UÚ‘ªÚ‘ÿÚ‘ÿ‘Uÿ‘ªÿ‘ÿÿ‘¶U¶ª¶ÿ¶$¶U$¶ª$¶ÿ$¶H¶UH¶ªH¶ÿH¶m¶Um¶ªm¶ÿm¶‘¶U‘¶ª‘¶ÿ‘¶¶¶U¶¶ª¶¶ÿ¶¶Ú¶UÚ¶ªÚ¶ÿÚ¶ÿ¶Uÿ¶ªÿ¶ÿÿ¶ÚUÚªÚÿÚ$ÚU$Úª$Úÿ$ÚHÚUHÚªHÚÿHÚmÚUmÚªmÚÿmÚ‘ÚU‘Úª‘Úÿ‘Ú¶ÚU¶Úª¶Úÿ¶ÚÚÚUÚÚªÚÚÿÚÚÿÚUÿÚªÿÚÿÿÚÿUÿªÿÿÿ$ÿU$ÿª$ÿÿ$ÿHÿUHÿªHÿÿHÿmÿUmÿªmÿÿmÿ‘ÿU‘ÿª‘ÿÿ‘ÿ¶ÿU¶ÿª¶ÿÿ¶ÿÚÿUÚÿªÚÿÿÚÿÿÿUÿÿÿÿÿööÑ öÑööööÑ öÑ ö  ö ö¿ öü ö ööüüöÑüüÑüü ööüü öööüüüÑöÑüüüüÑàÑüüüÿüÑüÿüüüüüüüüüüüüüslashem-0.0.7E7F3/sys/msdos/tiles/subs/pri_malc.bmp0000664000076400007640000000406610545462317020207 0ustar alialiBM66( ÿÿÒÒÒÂÂÂòòòâââ@¡ÂÂÂòò‘²òP¡q²²²¡Òò@U‘ª‘ÿ‘¶U¶ª¶ÿ¶ÚUÚªÚÿÚÿUÿªÿÿÿ$U$ª$ÿ$$$U$$ª$$ÿ$$H$UH$ªH$ÿH$m$Um$ªm$ÿm$‘$U‘$ª‘$ÿ‘$¶$U¶$ª¶$ÿ¶$Ú$UÚ$ªÚ$ÿÚ$ÿ$Uÿ$ªÿ$ÿÿ$HUHªHÿH$HU$Hª$Hÿ$HHHUHHªHHÿHHmHUmHªmHÿmH‘HU‘Hª‘Hÿ‘H¶HU¶Hª¶Hÿ¶HÚHUÚHªÚHÿÚHÿHUÿHªÿHÿÿHmUmªmÿm$mU$mª$mÿ$mHmUHmªHmÿHmmmUmmªmmÿmm‘mU‘mª‘mÿ‘m¶mU¶mª¶mÿ¶mÚmUÚmªÚmÿÚmÿmUÿmªÿmÿÿm‘U‘ª‘ÿ‘$‘U$‘ª$‘ÿ$‘H‘UH‘ªH‘ÿH‘m‘Um‘ªm‘ÿm‘‘‘U‘‘ª‘‘ÿ‘‘¶‘U¶‘ª¶‘ÿ¶‘Ú‘UÚ‘ªÚ‘ÿÚ‘ÿ‘Uÿ‘ªÿ‘ÿÿ‘¶U¶ª¶ÿ¶$¶U$¶ª$¶ÿ$¶H¶UH¶ªH¶ÿH¶m¶Um¶ªm¶ÿm¶‘¶U‘¶ª‘¶ÿ‘¶¶¶U¶¶ª¶¶ÿ¶¶Ú¶UÚ¶ªÚ¶ÿÚ¶ÿ¶Uÿ¶ªÿ¶ÿÿ¶ÚUÚªÚÿÚ$ÚU$Úª$Úÿ$ÚHÚUHÚªHÚÿHÚmÚUmÚªmÚÿmÚ‘ÚU‘Úª‘Úÿ‘Ú¶ÚU¶Úª¶Úÿ¶ÚÚÚUÚÚªÚÚÿÚÚÿÚUÿÚªÿÚÿÿÚÿUÿªÿÿÿ$ÿU$ÿª$ÿÿ$ÿHÿUHÿªHÿÿHÿmÿUmÿªmÿÿmÿ‘ÿU‘ÿª‘ÿÿ‘ÿ¶ÿU¶ÿª¶ÿÿ¶ÿÚÿUÚÿªÚÿÿÚÿÿÿUÿÿÿÿÿ$ü$ÿÿÿÿ ÿÿüü ÿÿ$$ ÿÿ$$ üÿÿ$$ üÑÿÿ$$ ü ÿÿ$$ü ÿÿÿ$$ ÿ$ÿ$$Ñ ÿ ÿÿÿ$$ÑöÑ ÿÿ$ÿÿ$öö ÿ$ÿÿöÿÿüÿöööÿÿööööÑÿüÿöööÑÿöÑöÑüÿüüüü$üü$üÿü$$$$ÿüü$$$$$$üÿÿüüslashem-0.0.7E7F3/sys/msdos/tiles/subs/tou_fem.bmp0000664000076400007640000000406610545462317020057 0ustar alialiBM66( ÿÿ@ @¡Òò²²‘²òÒÒPPòò‘²ââââââq‘Ò¡âqq²²²@‘@Â@¡ÂòqòqaaP¡òòò0qÂÂPÒP¡¡¡²ò@@¡Â‘‘ÂÂÂPÂPaâa²âò¡òª$$ÿ$$H$UH$ªH$ÿH$m$Um$ªm$ÿm$‘$U‘$ª‘$ÿ‘$¶$U¶$ª¶$ÿ¶$Ú$UÚ$ªÚ$ÿÚ$ÿ$Uÿ$ªÿ$ÿÿ$HUHªHÿH$HU$Hª$Hÿ$HHHUHHªHHÿHHmHUmHªmHÿmH‘HU‘Hª‘Hÿ‘H¶HU¶Hª¶Hÿ¶HÚHUÚHªÚHÿÚHÿHUÿHªÿHÿÿHmUmªmÿm$mU$mª$mÿ$mHmUHmªHmÿHmmmUmmªmmÿmm‘mU‘mª‘mÿ‘m¶mU¶mª¶mÿ¶mÚmUÚmªÚmÿÚmÿmUÿmªÿmÿÿm‘U‘ª‘ÿ‘$‘U$‘ª$‘ÿ$‘H‘UH‘ªH‘ÿH‘m‘Um‘ªm‘ÿm‘‘‘U‘‘ª‘‘ÿ‘‘¶‘U¶‘ª¶‘ÿ¶‘Ú‘UÚ‘ªÚ‘ÿÚ‘ÿ‘Uÿ‘ªÿ‘ÿÿ‘¶U¶ª¶ÿ¶$¶U$¶ª$¶ÿ$¶H¶UH¶ªH¶ÿH¶m¶Um¶ªm¶ÿm¶‘¶U‘¶ª‘¶ÿ‘¶¶¶U¶¶ª¶¶ÿ¶¶Ú¶UÚ¶ªÚ¶ÿÚ¶ÿ¶Uÿ¶ªÿ¶ÿÿ¶ÚUÚªÚÿÚ$ÚU$Úª$Úÿ$ÚHÚUHÚªHÚÿHÚmÚUmÚªmÚÿmÚ‘ÚU‘Úª‘Úÿ‘Ú¶ÚU¶Úª¶Úÿ¶ÚÚÚUÚÚªÚÚÿÚÚÿÚUÿÚªÿÚÿÿÚÿUÿªÿÿÿ$ÿU$ÿª$ÿÿ$ÿHÿUHÿªHÿÿHÿmÿUmÿªmÿÿmÿ‘ÿU‘ÿª‘ÿÿ‘ÿ¶ÿU¶ÿª¶ÿÿ¶ÿÚÿUÚÿªÚÿÿÚÿÿÿUÿÿÿÿÿÿ !!¶¶ÿ  ! ÖÖÖˆˆˆüül}ü ´ü}l´    }ü#üü  ö ö$ööööööslashem-0.0.7E7F3/sys/msdos/tiles/subs/pri_femc.bmp0000664000076400007640000000406610545462317020205 0ustar alialiBM66( ÿÿòòò@¡ÂâââÒÒÒòò@aÂÂa‘²ò¡âÂÂÂPq¡00¡²²²¡ÒòqÂââ000@ÿ¶ÚUÚªÚÿÚÿUÿªÿÿÿ$U$ª$ÿ$$$U$$ª$$ÿ$$H$UH$ªH$ÿH$m$Um$ªm$ÿm$‘$U‘$ª‘$ÿ‘$¶$U¶$ª¶$ÿ¶$Ú$UÚ$ªÚ$ÿÚ$ÿ$Uÿ$ªÿ$ÿÿ$HUHªHÿH$HU$Hª$Hÿ$HHHUHHªHHÿHHmHUmHªmHÿmH‘HU‘Hª‘Hÿ‘H¶HU¶Hª¶Hÿ¶HÚHUÚHªÚHÿÚHÿHUÿHªÿHÿÿHmUmªmÿm$mU$mª$mÿ$mHmUHmªHmÿHmmmUmmªmmÿmm‘mU‘mª‘mÿ‘m¶mU¶mª¶mÿ¶mÚmUÚmªÚmÿÚmÿmUÿmªÿmÿÿm‘U‘ª‘ÿ‘$‘U$‘ª$‘ÿ$‘H‘UH‘ªH‘ÿH‘m‘Um‘ªm‘ÿm‘‘‘U‘‘ª‘‘ÿ‘‘¶‘U¶‘ª¶‘ÿ¶‘Ú‘UÚ‘ªÚ‘ÿÚ‘ÿ‘Uÿ‘ªÿ‘ÿÿ‘¶U¶ª¶ÿ¶$¶U$¶ª$¶ÿ$¶H¶UH¶ªH¶ÿH¶m¶Um¶ªm¶ÿm¶‘¶U‘¶ª‘¶ÿ‘¶¶¶U¶¶ª¶¶ÿ¶¶Ú¶UÚ¶ªÚ¶ÿÚ¶ÿ¶Uÿ¶ªÿ¶ÿÿ¶ÚUÚªÚÿÚ$ÚU$Úª$Úÿ$ÚHÚUHÚªHÚÿHÚmÚUmÚªmÚÿmÚ‘ÚU‘Úª‘Úÿ‘Ú¶ÚU¶Úª¶Úÿ¶ÚÚÚUÚÚªÚÚÿÚÚÿÚUÿÚªÿÚÿÿÚÿUÿªÿÿÿ$ÿU$ÿª$ÿÿ$ÿHÿUHÿªHÿÿHÿmÿUmÿªmÿÿmÿ‘ÿU‘ÿª‘ÿÿ‘ÿ¶ÿU¶ÿª¶ÿÿ¶ÿÚÿUÚÿªÚÿÿÚÿÿÿUÿÿÿÿÿÿÿüüüÿÿ üüü üüÿÿ üÿÿ  $$ÿÿ $$$ÿÿ $$$$ÿÿ $$$ÿÿÿ  $$$ÿÿÿöö $ÿÿÿö Ñü$ÿÿÿÿ$üÿÿ$üh$$$ühhÿÿ $h    h  hö Ñ$ÿ$$$ÿÿ höö $ÿÿ$ÿÿÿ höö ÿ$ÿÿÿ$ÿ hüÿ$ hh   hüh hh h  ö h ööö Ñ hüü ö  ü ÿ ü hö h hÿüü  ÿÿÿÿ üÿÿÿÿ ÿ ÿÿÿÿ  ÿÿ slashem-0.0.7E7F3/sys/msdos/tiles/subs/altarl.bmp0000664000076400007640000000406610545462317017700 0ustar alialiBM66( ÿÿ0P0@a0 0ÂÂÂ@@@âââòòò¡¡¡²²²ÿHmUmªmÿm‘U‘ª‘ÿ‘¶U¶ª¶ÿ¶ÚUÚªÚÿÚÿUÿªÿÿÿ$U$ª$ÿ$$$U$$ª$$ÿ$$H$UH$ªH$ÿH$m$Um$ªm$ÿm$‘$U‘$ª‘$ÿ‘$¶$U¶$ª¶$ÿ¶$Ú$UÚ$ªÚ$ÿÚ$ÿ$Uÿ$ªÿ$ÿÿ$HUHªHÿH$HU$Hª$Hÿ$HHHUHHªHHÿHHmHUmHªmHÿmH‘HU‘Hª‘Hÿ‘H¶HU¶Hª¶Hÿ¶HÚHUÚHªÚHÿÚHÿHUÿHªÿHÿÿHmUmªmÿm$mU$mª$mÿ$mHmUHmªHmÿHmmmUmmªmmÿmm‘mU‘mª‘mÿ‘m¶mU¶mª¶mÿ¶mÚmUÚmªÚmÿÚmÿmUÿmªÿmÿÿm‘U‘ª‘ÿ‘$‘U$‘ª$‘ÿ$‘H‘UH‘ªH‘ÿH‘m‘Um‘ªm‘ÿm‘‘‘U‘‘ª‘‘ÿ‘‘¶‘U¶‘ª¶‘ÿ¶‘Ú‘UÚ‘ªÚ‘ÿÚ‘ÿ‘Uÿ‘ªÿ‘ÿÿ‘¶U¶ª¶ÿ¶$¶U$¶ª$¶ÿ$¶H¶UH¶ªH¶ÿH¶m¶Um¶ªm¶ÿm¶‘¶U‘¶ª‘¶ÿ‘¶¶¶U¶¶ª¶¶ÿ¶¶Ú¶UÚ¶ªÚ¶ÿÚ¶ÿ¶Uÿ¶ªÿ¶ÿÿ¶ÚUÚªÚÿÚ$ÚU$Úª$Úÿ$ÚHÚUHÚªHÚÿHÚmÚUmÚªmÚÿmÚ‘ÚU‘Úª‘Úÿ‘Ú¶ÚU¶Úª¶Úÿ¶ÚÚÚUÚÚªÚÚÿÚÚÿÚUÿÚªÿÚÿÿÚÿUÿªÿÿÿ$ÿU$ÿª$ÿÿ$ÿHÿUHÿªHÿÿHÿmÿUmÿªmÿÿmÿ‘ÿU‘ÿª‘ÿÿ‘ÿ¶ÿU¶ÿª¶ÿÿ¶ÿÚÿUÚÿªÚÿÿÚÿÿÿUÿÿÿÿÿ¶¶¶ÿÿÿÿÿÿ ÿÿ  ÿÿ  ÿÿ  ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿ  ÿÿ  ÿÿ ÿÿslashem-0.0.7E7F3/sys/msdos/tiles/index0000664000076400007640000014404710545462317016003 0ustar aliali0000 (giant ant) : mon\giantant.bmp 0001 (killer bee) : mon\killerb.bmp 0002 (soldier ant) : mon\soldiera.bmp 0003 (fire ant) : mon\fireant.bmp 0004 (giant beetle) : mon\gbeetle.bmp 0005 (queen bee) : mon\queenb.bmp 0006 (acid blob) : mon\acidblob.bmp 0007 (quivering blob) : mon\quivblob.bmp 0008 (gelatinous cube) : mon\gelcube.bmp 0009 (chickatrice) : mon\chick.bmp 0010 (cockatrice) : mon\cock.bmp 0011 (pyrolisk) : mon\pyrolisk.bmp 0012 (jackal) : mon\jackal.bmp 0013 (fox) : mon\fox.bmp 0014 (coyote) : mon\coyote.bmp 0015 (werejackal) : mon\wwjackal.bmp 0016 (little dog) : mon\dog1.bmp 0017 (dog) : mon\dog2.bmp 0018 (large dog) : mon\dog3.bmp 0019 (dingo) : mon\dingo.bmp 0020 (wolf) : mon\wolf.bmp 0021 (werewolf) : mon\wwwolf.bmp 0022 (warg) : mon\warg.bmp 0023 (winter wolf cub) : mon\wwolfc.bmp 0024 (winter wolf) : mon\wwolf.bmp 0025 (hell hound pup) : mon\hellhp.bmp 0026 (hell hound) : mon\hellh.bmp 0027 (Cerberus) : mon\cerberus.bmp 0028 (gas spore) : mon\gasspore.bmp 0029 (floating eye) : mon\floateye.bmp 0030 (freezing sphere) : mon\freezesp.bmp 0031 (flaming sphere) : mon\flamesp.bmp 0032 (shocking sphere) : mon\shocksp.bmp 0035 (beholder) : mon\beholder.bmp 0036 (kitten) : mon\cat1.bmp 0037 (housecat) : mon\cat2.bmp 0038 (jaguar) : mon\jaguar.bmp 0039 (lynx) : mon\lynx.bmp 0040 (panther) : mon\panther.bmp 0041 (large cat) : mon\cat3.bmp 0042 (tiger) : mon\tiger.bmp 0045 (gremlin) : mon\gremlin.bmp 0046 (gargoyle) : mon\gargoyl.bmp 0047 (winged gargoyle) : mon\gargoylw.bmp 0048 (hobbit) : mon\hobbit.bmp 0049 (dwarf) : mon\dwarf.bmp 0050 (bugbear) : mon\bugbear.bmp 0051 (dwarf lord) : mon\dwalord.bmp 0052 (dwarf king) : mon\dwaking.bmp 0053 (mind flayer) : mon\mflayer.bmp 0054 (master mind flayer) : mon\mmflayer.bmp 0055 (manes) : mon\manes.bmp 0056 (homunculus) : mon\homun.bmp 0057 (imp) : mon\imp.bmp 0058 (lemure) : mon\lemure.bmp 0059 (quasit) : mon\quasit.bmp 0060 (tengu) : mon\tengu.bmp 0061 (blue jelly) : mon\bjelly.bmp 0062 (spotted jelly) : mon\sjelly.bmp 0063 (ochre jelly) : mon\ojelly.bmp 0064 (kobold) : mon\kobold.bmp 0065 (large kobold) : mon\lkobold.bmp 0066 (kobold lord) : mon\koboldl.bmp 0067 (kobold shaman) : mon\kobolds.bmp 0068 (leprechaun) : mon\lep.bmp 0069 (small mimic) : mon\mimsmall.bmp 0070 (large mimic) : mon\mimlarge.bmp 0071 (giant mimic) : mon\mimgiant.bmp 0072 (wood nymph) : mon\nymphwo.bmp 0073 (water nymph) : mon\nymphwa.bmp 0074 (mountain nymph) : mon\nymphmo.bmp 0075 (goblin) : mon\goblin.bmp 0076 (hobgoblin) : mon\hobgob.bmp 0077 (orc) : mon\orc.bmp 0078 (hill orc) : mon\hillorc.bmp 0079 (Mordor orc) : mon\mordoro.bmp 0080 (Uruk-hai) : mon\urukhai.bmp 0081 (orc shaman) : mon\oshaman.bmp 0082 (orc-captain) : mon\ocaptain.bmp 0083 (rock piercer) : mon\rpiercer.bmp 0084 (iron piercer) : mon\ipiercer.bmp 0085 (glass piercer) : mon\gpiercer.bmp 0086 (rothe) : mon\rothe.bmp 0087 (mumak) : mon\mumak.bmp 0088 (leocrotta) : mon\leocrota.bmp 0089 (wumpus) : mon\wumpus.bmp 0090 (titanothere) : mon\titant.bmp 0091 (baluchitherium) : mon\baluch.bmp 0092 (mastodon) : mon\mastodon.bmp 0093 (sewer rat) : mon\sewerrat.bmp 0094 (giant rat) : mon\giantrat.bmp 0095 (rabid rat) : mon\rabidrat.bmp 0096 (wererat) : mon\wwererat.bmp 0097 (rock mole) : mon\rockmole.bmp 0098 (woodchuck) : mon\zotme.bmp 0099 (cave spider) : mon\cavespid.bmp 0100 (centipede) : mon\centiped.bmp 0101 (giant spider) : mon\giantspi.bmp 0102 (scorpion) : mon\scorpion.bmp 0103 (lurker above) : mon\labove.bmp 0104 (trapper) : mon\trapper.bmp 0105 (white unicorn) : mon\wunicorn.bmp 0106 (gray unicorn) : mon\gunicorn.bmp 0107 (black unicorn) : mon\bunicorn.bmp 0108 (pony) : mon\horse1.bmp 0109 (horse) : mon\horse2.bmp 0110 (warhorse) : mon\horse3.bmp 0111 (fog cloud) : mon\fogcloud.bmp 0112 (dust vortex) : mon\dustv.bmp 0113 (ice vortex) : mon\icev.bmp 0114 (energy vortex) : mon\energyv.bmp 0115 (steam vortex) : mon\steamv.bmp 0116 (fire vortex) : mon\firev.bmp 0117 (baby long worm) : mon\blongw.bmp 0118 (baby purple worm) : mon\bpurplew.bmp 0119 (long worm) : mon\longw.bmp 0120 (purple worm) : mon\purplew.bmp 0121 (grid bug) : mon\gridbug.bmp 0122 (xan) : mon\xan.bmp 0123 (yellow light) : mon\ylight.bmp 0124 (black light) : mon\blight.bmp 0125 (zruty) : mon\zruty.bmp 0126 (couatl) : mon\couatl.bmp 0127 (Aleax) : mon\aleax.bmp 0128 (Angel) : mon\angel.bmp 0129 (ki-rin) : mon\kirin.bmp 0130 (Archon) : mon\archon.bmp 0131 (bat) : mon\bat.bmp 0132 (giant bat) : mon\giantbat.bmp 0133 (raven) : mon\raven.bmp 0134 (vampire bat) : mon\vampbat.bmp 0135 (plains centaur) : mon\centaurp.bmp 0136 (forest centaur) : mon\centaurf.bmp 0137 (mountain centaur) : mon\centaurm.bmp 0138 (baby gray dragon) : mon\bgrayd.bmp 0139 (baby silver dragon) : mon\bsilverd.bmp 0140 (baby shimmering dragon) : mon\bshimd.bmp 0141 (baby red dragon) : mon\bredd.bmp 0142 (baby white dragon) : mon\bwhited.bmp 0143 (baby orange dragon) : mon\boranged.bmp 0144 (baby black dragon) : mon\bblackd.bmp 0145 (baby blue dragon) : mon\bblued.bmp 0146 (baby green dragon) : mon\bgreend.bmp 0147 (baby yellow dragon) : mon\byellowd.bmp 0148 (gray dragon) : mon\grayd.bmp 0149 (silver dragon) : mon\silverd.bmp 0150 (shimmering dragon) : mon\shimd.bmp 0151 (red dragon) : mon\redd.bmp 0152 (white dragon) : mon\whited.bmp 0153 (orange dragon) : mon\oranged.bmp 0154 (black dragon) : mon\blackd.bmp 0155 (blue dragon) : mon\blued.bmp 0156 (green dragon) : mon\greend.bmp 0157 (yellow dragon) : mon\yellowd.bmp 0158 (stalker) : mon\stalker.bmp 0159 (air elemental) : mon\aire.bmp 0160 (fire elemental) : mon\firee.bmp 0161 (earth elemental) : mon\earthe.bmp 0162 (water elemental) : mon\watere.bmp 0163 (lichen) : mon\lichen.bmp 0164 (brown mold) : mon\brownm.bmp 0165 (yellow mold) : mon\yellowm.bmp 0166 (green mold) : mon\greenm.bmp 0167 (red mold) : mon\redm.bmp 0168 (shrieker) : mon\shrieker.bmp 0169 (violet fungus) : mon\vfungus.bmp 0170 (gnome) : mon\gnome.bmp 0171 (gnome lord) : mon\gnolord.bmp 0172 (gnomish wizard) : mon\gnowiz.bmp 0173 (gnome king) : mon\gnoking.bmp 0174 (giant) : mon\giant.bmp 0175 (stone giant) : mon\sgiant.bmp 0176 (hill giant) : mon\hgiant.bmp 0177 (fire giant) : mon\figiant.bmp 0178 (frost giant) : mon\frgiant.bmp 0179 (storm giant) : mon\stgiant.bmp 0180 (ettin) : mon\ettin.bmp 0181 (titan) : mon\titan.bmp 0182 (minotaur) : mon\minotaur.bmp 0183 (jabberwock) : mon\jabber.bmp 0184 (vorpal jabberwock) : mon\jabber.bmp 0185 (Keystone Kop) : mon\kop.bmp 0186 (Kop Sergeant) : mon\kopsgt.bmp 0187 (Kop Lieutenant) : mon\koplt.bmp 0188 (Kop Kaptain) : mon\kopcapt.bmp 0189 (lich) : mon\lich.bmp 0190 (demilich) : mon\demilich.bmp 0191 (master lich) : mon\mastlich.bmp 0192 (arch-lich) : mon\archlich.bmp 0193 (kobold mummy) : mon\koboldm.bmp 0194 (gnome mummy) : mon\gnomem.bmp 0195 (orc mummy) : mon\orcm.bmp 0196 (dwarf mummy) : mon\dwarfm.bmp 0197 (elf mummy) : mon\elfm.bmp 0198 (human mummy) : mon\humanm.bmp 0199 (ettin mummy) : mon\ettinm.bmp 0200 (giant mummy) : mon\giantm.bmp 0201 (red naga hatchling) : mon\rednagah.bmp 0202 (black naga hatchling) : mon\blnagah.bmp 0203 (golden naga hatchling) : mon\gldnagah.bmp 0204 (guardian naga hatchling) : mon\grdnagah.bmp 0205 (red naga) : mon\rednaga.bmp 0206 (black naga) : mon\blnaga.bmp 0207 (golden naga) : mon\gldnaga.bmp 0208 (guardian naga) : mon\grdnaga.bmp 0209 (ogre) : mon\ogre.bmp 0210 (ogre lord) : mon\ogrelord.bmp 0211 (ogre king) : mon\ogreking.bmp 0212 (gray ooze) : mon\grayooze.bmp 0213 (brown pudding) : mon\brownp.bmp 0214 (black pudding) : mon\blackp.bmp 0215 (green slime) : mon\slime.bmp 0216 (quantum mechanic) : mon\quantum.bmp 0217 (rust monster) : mon\rustmon.bmp 0218 (disenchanter) : mon\disench.bmp 0219 (garter snake) : mon\garters.bmp 0220 (snake) : mon\snake.bmp 0221 (water moccasin) : mon\watermoc.bmp 0222 (pit viper) : mon\pitviper.bmp 0223 (python) : mon\python.bmp 0224 (cobra) : mon\cobra.bmp 0225 (troll) : mon\troll.bmp 0226 (ice troll) : mon\itroll.bmp 0227 (rock troll) : mon\rtroll.bmp 0228 (water troll) : mon\wtroll.bmp 0229 (Olog-hai) : mon\ologhai.bmp 0230 (umber hulk) : mon\hulk.bmp 0231 (vampire) : mon\vampire.bmp 0232 (vampire lord) : mon\vampirel.bmp 0233 (vampire mage) : mon\vampire.bmp 0234 (Vlad the Impaler) : mon\vlad.bmp 0235 (barrow wight) : mon\wight.bmp 0236 (wraith) : mon\wraith.bmp 0237 (Nazgul) : mon\nazgul.bmp 0238 (xorn) : mon\xorn.bmp 0239 (monkey) : mon\monkey.bmp 0240 (ape) : mon\ape.bmp 0241 (owlbear) : mon\owlbear.bmp 0242 (yeti) : mon\yeti.bmp 0243 (carnivorous ape) : mon\carnape.bmp 0244 (sasquatch) : mon\bigfoot.bmp 0245 (kobold zombie) : mon\koboldz.bmp 0246 (gnome zombie) : mon\gnomez.bmp 0247 (orc zombie) : mon\orcz.bmp 0248 (dwarf zombie) : mon\dwarfz.bmp 0249 (elf zombie) : mon\elfz.bmp 0250 (human zombie) : mon\humanz.bmp 0251 (ettin zombie) : mon\ettinz.bmp 0252 (giant zombie) : mon\giantz.bmp 0253 (ghoul) : mon\ghoul.bmp 0254 (skeleton) : mon\skeleton.bmp 0255 (straw golem) : mon\strawg.bmp 0256 (paper golem) : mon\paperg.bmp 0257 (rope golem) : mon\ropeg.bmp 0258 (gold golem) : mon\goldg.bmp 0259 (leather golem) : mon\leatherg.bmp 0260 (wood golem) : mon\woodg.bmp 0261 (flesh golem) : mon\fleshg.bmp 0262 (clay golem) : mon\clayg.bmp 0263 (stone golem) : mon\stoneg.bmp 0264 (glass golem) : mon\glassg.bmp 0265 (iron golem) : mon\irong.bmp 0266 (human) : mon\human.bmp 0267 (wererat) : mon\hwererat.bmp 0268 (werejackal) : mon\hwjackal.bmp 0269 (werewolf) : mon\hwwolf.bmp 0272 (elf) : mon\elf.bmp 0273 (Woodland-elf) : mon\woodelf.bmp 0274 (Green-elf) : mon\greenelf.bmp 0275 (Grey-elf) : mon\greyelf.bmp 0276 (elf-lord) : mon\elflord.bmp 0277 (Elvenking) : mon\elfking.bmp 0278 (doppelganger) : mon\dplgngr.bmp 0279 (nurse) : mon\nurse.bmp 0280 (shopkeeper) : mon\shk.bmp 0281 (guard) : mon\guard.bmp 0282 (prisoner) : mon\prisoner.bmp 0283 (Oracle) : mon\oracle.bmp 0284 (aligned priest) : mon\apriest.bmp 0285 (high priest) : mon\hpriest.bmp 0286 (soldier) : mon\soldier.bmp 0287 (sergeant) : mon\sgt.bmp 0288 (lieutenant) : mon\lt.bmp 0289 (captain) : mon\capt.bmp 0290 (watchman) : mon\watch.bmp 0291 (watch captain) : mon\watchc.bmp 0292 (Medusa) : mon\medusa.bmp 0293 (Wizard of Yendor) : mon\rodney.bmp 0294 (Croesus) : mon\croesus.bmp 0295 (Charon) : mon\charon.bmp 0296 (ghost) : mon\ghost.bmp 0297 (shade) : mon\shade.bmp 0298 (water demon) : mon\waterd.bmp 0299 (horned devil) : mon\hornedd.bmp 0300 (succubus) : mon\succubus.bmp 0301 (incubus) : mon\incubus.bmp 0302 (erinys) : mon\erinys.bmp 0303 (barbed devil) : mon\barbedd.bmp 0304 (marilith) : mon\marilith.bmp 0305 (vrock) : mon\vrock.bmp 0306 (hezrou) : mon\hezrou.bmp 0309 (bone devil) : mon\bondevil.bmp 0310 (ice devil) : mon\icedevil.bmp 0311 (nalfeshnee) : mon\nalfesh.bmp 0312 (pit fiend) : mon\pitfiend.bmp 0313 (balrog) : mon\balrog.bmp 0314 (Juiblex) : mon\juiblex.bmp 0315 (Yeenoghu) : mon\yeenoghu.bmp 0316 (Orcus) : mon\orcus.bmp 0317 (Geryon) : mon\geryon.bmp 0318 (Dispater) : mon\dispater.bmp 0319 (Baalzebub) : mon\balzebub.bmp 0320 (Asmodeus) : mon\asmodeus.bmp 0321 (Demogorgon) : mon\demogorg.bmp 0322 (Death) : mon\death.bmp 0323 (Pestilence) : mon\pestilen.bmp 0324 (Famine) : mon\famine.bmp 0325 (mail daemon) : mon\mail.bmp 0326 (djinni) : mon\djinni.bmp 0327 (sandestin) : mon\sandest.bmp 0328 (jellyfish) : mon\jelyfish.bmp 0329 (piranha) : mon\piranha.bmp 0330 (shark) : mon\shark.bmp 0331 (giant eel) : mon\gianteel.bmp 0332 (electric eel) : mon\eleceel.bmp 0333 (kraken) : mon\kraken.bmp 0334 (newt) : mon\newt.bmp 0335 (gecko) : mon\gecko.bmp 0336 (iguana) : mon\iguana.bmp 0337 (baby crocodile) : mon\bcroc.bmp 0338 (lizard) : mon\lizard.bmp 0339 (chameleon) : mon\cham.bmp 0340 (crocodile) : mon\croc.bmp 0341 (salamander) : mon\salamand.bmp 0342 (long worm tail) : mon\longwt.bmp 0343 (archeologist) : mon\arc.bmp 0344 (barbarian) : mon\bar.bmp 0345 (caveman) : mon\cav_mal.bmp 0346 (cavewoman) : mon\cav_fem.bmp 0347 (healer) : mon\hea.bmp 0348 (knight) : mon\kni.bmp 0349 (monk) : mon\mon.bmp 0351 (priest) : mon\pri_mal.bmp 0352 (priestess) : mon\pri_fem.bmp 0353 (ranger) : mon\ran.bmp 0354 (rogue) : mon\rog.bmp 0355 (samurai) : mon\sam.bmp 0356 (tourist) : mon\tou.bmp 0357 (valkyrie) : mon\val.bmp 0358 (wizard) : mon\wiz.bmp 0359 (Lord Carnarvon) : mon\arc_l.bmp 0360 (Pelias) : mon\bar_l.bmp 0361 (Shaman Karnov) : mon\cav_l.bmp 0362 (Earendil) : mon\invis.bmp 0363 (Elwing) : mon\invis.bmp 0364 (Hippocrates) : mon\hea_l.bmp 0365 (King Arthur) : mon\kni_l.bmp 0366 (Grand Master) : mon\mon_l.bmp 0368 (Arch Priest) : mon\pri_l.bmp 0369 (Orion) : mon\ran_l.bmp 0370 (Master of Thieves) : mon\rog_l.bmp 0371 (Lord Sato) : mon\sam_l.bmp 0372 (Twoflower) : mon\tou_l.bmp 0373 (Norn) : mon\val_l.bmp 0374 (Wizard of Balance) : mon\wiz_l.bmp 0375 (Minion of Huhetotl) : mon\minion.bmp 0376 (Thoth Amon) : mon\thothamn.bmp 0377 (Chromatic Dragon) : mon\tiamat.bmp 0378 (Goblin King) : mon\invis.bmp 0379 (Cyclops) : mon\cyclops.bmp 0380 (Ixoth) : mon\ixoth.bmp 0381 (Master Kaen) : mon\kaen.bmp 0383 (Nalzok) : mon\nalzok.bmp 0384 (Scorpius) : mon\scorpius.bmp 0385 (Master Assassin) : mon\assassin.bmp 0386 (Ashikaga Takauji) : mon\ashikaga.bmp 0387 (Lord Surtur) : mon\surtur.bmp 0388 (Dark One) : mon\sauron.bmp 0389 (student) : mon\arc_g.bmp 0390 (chieftain) : mon\bar_g.bmp 0391 (neanderthal) : mon\cav_g.bmp 0392 (High-elf) : mon\invis.bmp 0393 (attendant) : mon\hea_g.bmp 0394 (page) : mon\kni_g.bmp 0395 (abbot) : mon\mon_g.bmp 0397 (acolyte) : mon\pri_g.bmp 0398 (hunter) : mon\ran_g.bmp 0399 (thug) : mon\rog_g.bmp 0400 (ninja) : mon\ninja.bmp 0401 (roshi) : mon\sam_g.bmp 0402 (guide) : mon\tou_g.bmp 0403 (warrior) : mon\val_g.bmp 0404 (apprentice) : mon\wiz_g.bmp 0405 (invisible monster) : mon\invis.bmp # objects 0406 (strange object) : obj\strange.bmp #weapons 0407 (arrow) : obj\)arrow.bmp 0408 (runed arrow / elven arrow) : obj\)arrowe.bmp 0409 (crude arrow / orcish arrow) : obj\)arrowo.bmp 0410 (silver arrow) : obj\)arrows.bmp 0411 (bamboo arrow / ya) : obj\)ya.bmp 0412 (crossbow bolt) : obj\)bolt.bmp 0413 (dart) : obj\)dart.bmp 0414 (throwing star / shuriken) : obj\)star.bmp 0415 (boomerang) : obj\)brang.bmp 0416 (spear) : obj\)spear.bmp 0417 (runed spear / elven spear) : obj\)speare.bmp 0418 (crude spear / orcish spear) : obj\)spearo.bmp 0419 (stout spear / dwarvish spear) : obj\)speard.bmp 0420 (silver spear) : obj\)spears.bmp 0421 (throwing spear / javelin) : obj\)javelin.bmp 0422 (trident) : obj\)trident.bmp 0423 (dagger) : obj\)dagger.bmp 0424 (runed dagger / elven dagger) : obj\)daggere.bmp 0425 (crude dagger / orcish dagger) : obj\)daggero.bmp 0426 (silver dagger) : obj\)daggers.bmp 0427 (athame) : obj\)athame.bmp 0428 (scalpel) : obj\)scalpel.bmp 0429 (knife) : obj\)knife.bmp 0430 (stiletto) : obj\)stileto.bmp 0431 (worm tooth) : obj\)tooth.bmp 0432 (crysknife) : obj\)crknife.bmp 0433 (axe) : obj\)axe.bmp 0434 (double-headed axe / battle-axe) : obj\)baxe.bmp 0435 (short sword) : obj\)shorts.bmp 0436 (runed short sword / elven short sword) : obj\)shortse.bmp 0437 (crude short sword / orcish short sword) : obj\)shortso.bmp 0438 (broad short sword / dwarvish short sword) : obj\)shortsd.bmp 0439 (curved sword / scimitar) : obj\)scim.bmp 0440 (silver saber) : obj\)ssaber.bmp 0441 (broadsword) : obj\)broads.bmp 0442 (runed broadsword / elven broadsword) : obj\)broadse.bmp 0443 (long sword) : obj\)longs.bmp 0444 (two-handed sword) : obj\)2hs.bmp 0445 (samurai sword / katana) : obj\)katana.bmp 0446 (long samurai sword / tsurugi) : obj\)tsurugi.bmp 0447 (runed broadsword / runesword) : obj\)stormy.bmp 0448 (vulgar polearm / partisan) : obj\)partisa.bmp 0449 (hilted polearm / ranseur) : obj\)ranseur.bmp 0450 (forked polearm / spetum) : obj\)spetum.bmp 0451 (single-edged polearm / glaive) : obj\)glaive.bmp 0452 (lance) : obj\)lance.bmp 0453 (angled poleaxe / halberd) : obj\)halberd.bmp 0454 (long poleaxe / bardiche) : obj\)bardich.bmp 0455 (pole cleaver / voulge) : obj\)voulge.bmp 0456 (broad pick / dwarvish mattock) : obj\)mattock.bmp 0457 (pole sickle / fauchard) : obj\)fauchar.bmp 0458 (pruning hook / guisarme) : obj\)guisarm.bmp 0459 (hooked polearm / bill-guisarme) : obj\)bilguis.bmp 0460 (pronged polearm / lucern hammer) : obj\)lucernh.bmp 0461 (beaked polearm / bec de corbin) : obj\)bcorbin.bmp 0462 (mace) : obj\)mace.bmp 0463 (morning star) : obj\)m_star.bmp 0464 (war hammer) : obj\)hammer.bmp 0465 (club) : obj\)club.bmp 0466 (rubber hose) : obj\)hose.bmp 0467 (staff / quarterstaff) : obj\)staff.bmp 0468 (thonged club / aklys) : obj\)aklys.bmp 0469 (flail) : obj\)flail.bmp 0470 (bullwhip) : obj\)whip.bmp 0471 (bow) : obj\)bow.bmp 0472 (runed bow / elven bow) : obj\)bowe.bmp 0473 (crude bow / orcish bow) : obj\)bowo.bmp 0474 (long bow / yumi) : obj\)yumi.bmp 0475 (sling) : obj\)sling.bmp 0476 (crossbow) : obj\)xbow.bmp # armor # helmets 0477 (leather hat / elven leather helm) : obj\h_elf.bmp 0478 (iron skull cap / orcish helm) : obj\h_orc.bmp 0479 (hard hat / dwarvish iron helm) : obj\h_dwarf.bmp 0480 (fedora) : obj\h_fedora.bmp 0481 (conical hat / cornuthaum) : obj\h_cone.bmp 0482 (conical hat / dunce cap) : obj\h_cone.bmp 0483 (dented pot) : obj\h_pot.bmp 0484 (plumed helmet / helmet) : obj\h_plumed.bmp 0485 (etched helmet / helm of brilliance) : obj\h_etched.bmp 0486 (crested helmet / helm of opposite alignment) : obj\h_crest.bmp 0487 (visored helmet / helm of telepathy) : obj\h_visor.bmp # dragon scale mails 0488 (gray dragon scale mail) : obj\dsmgray.bmp 0489 (silver dragon scale mail) : obj\dsmsilvr.bmp 0490 (shimmering dragon scale mail) : obj\dsmshim.bmp 0491 (red dragon scale mail) : obj\dsmred.bmp 0492 (white dragon scale mail) : obj\dsmwhite.bmp 0493 (orange dragon scale mail) : obj\dsmorang.bmp 0494 (black dragon scale mail) : obj\dsmblack.bmp 0495 (blue dragon scale mail) : obj\dsmblue.bmp 0496 (green dragon scale mail) : obj\dsmgreen.bmp 0497 (yellow dragon scale mail) : obj\dsmyello.bmp 0498 (gray dragon scales) : obj\dsgray.bmp 0499 (silver dragon scales) : obj\dssilvr.bmp 0500 (shimmering dragon scales) : obj\dsshim.bmp 0501 (red dragon scales) : obj\dsred.bmp 0502 (white dragon scales) : obj\dswhite.bmp 0503 (orange dragon scales) : obj\dsorang.bmp 0504 (black dragon scales) : obj\dsblack.bmp 0505 (blue dragon scales) : obj\dsblue.bmp 0506 (green dragon scales) : obj\dsgreen.bmp 0507 (yellow dragon scales) : obj\dsyello.bmp # mundane body armor 0508 (plate mail) : obj\_platem.bmp 0509 (crystal plate mail) : obj\_cplatem.bmp 0510 (bronze plate mail) : obj\_bplatem.bmp 0511 (splint mail) : obj\_splintm.bmp 0512 (banded mail) : obj\_bandedm.bmp 0513 (dwarvish mithril-coat) : obj\_dmithc.bmp 0514 (elven mithril-coat) : obj\_emithc.bmp 0515 (chain mail) : obj\_chainm.bmp 0516 (crude chain mail / orcish chain mail) : obj\_ochainm.bmp 0517 (scale mail) : obj\_scalem.bmp 0518 (studded leather armor) : obj\_studla.bmp 0519 (ring mail) : obj\_ringm.bmp 0520 (crude ring mail / orcish ring mail) : obj\_oringm.bmp 0521 (leather armor) : obj\_larmor.bmp 0522 (leather jacket) : obj\_ljacket.bmp # shirts 0523 (Hawaiian shirt) : obj\_hshirt.bmp 0524 (T-shirt) : obj\_tshirt.bmp # cloaks 0525 (mummy wrapping) : obj\c_mummy.bmp 0526 (faded pall / elven cloak) : obj\c_elf.bmp 0527 (coarse mantelet / orcish cloak) : obj\c_orc.bmp 0528 (hooded cloak / dwarvish cloak) : obj\c_dwarf.bmp 0529 (slippery cloak / oilskin cloak) : obj\c_oils.bmp 0530 (robe) : obj\c_robe.bmp 0531 (apron / alchemy smock) : obj\c_apron.bmp 0532 (tattered cape / cloak of protection) : obj\c_cape.bmp 0533 (opera cloak / cloak of invisibility) : obj\c_opera.bmp 0534 (ornamental cope / cloak of magic resistance) : obj\c_cope.bmp 0535 (piece of cloth / cloak of displacement) : obj\c_cloth.bmp # shields 0536 (small shield) : obj\ssmall.bmp 0537 (blue and green shield / elven shield) : obj\self.bmp 0538 (white-handed shield / Uruk-hai shield) : obj\surukhai.bmp 0539 (red-eyed shield / orcish shield) : obj\sorc.bmp 0540 (large shield) : obj\slarge.bmp 0541 (large round shield / dwarvish roundshield) : obj\sdwarf.bmp 0542 (polished silver shield / shield of reflection) : obj\sreflect.bmp # gloves 0547 (old gloves) : obj\_gold.bmp 0548 (padded gloves) : obj\_gpadded.bmp 0549 (fencing gloves) : obj\_gfence.bmp 0550 (riding gloves) : obj\_griding.bmp # shoes 0551 (walking shoes / low boots) : obj\blow.bmp 0552 (hard shoes / iron shoes) : obj\biron.bmp 0553 (jackboots / high boots) : obj\bhigh.bmp 0555 (combat boots / speed boots) : obj\bcombat.bmp 0556 (jungle boots / water walking boots) : obj\bjungle.bmp 0557 (hiking boots / jumping boots) : obj\bhiking.bmp 0558 (mud boots / elven boots) : obj\bmud.bmp 0559 (buckled boots / kicking boots) : obj\bbuckled.bmp 0560 (riding boots / fumble boots) : obj\briding.bmp 0561 (snow boots / levitation boots) : obj\bsnow.bmp # rings 0562 (wooden / adornment) : obj\r_wood.bmp 0563 (granite / gain strength) : obj\r_gran.bmp 0564 (opal / gain constitution) : obj\r_opal.bmp 0565 (clay / increase accuracy) : obj\r_clay.bmp 0566 (coral / increase damage) : obj\r_coral.bmp 0567 (black onyx / protection) : obj\r_bonyx.bmp 0568 (moonstone / regeneration) : obj\r_moons.bmp 0569 (tiger eye / searching) : obj\r_teye.bmp 0570 (jade / stealth) : obj\r_jade.bmp 0571 (bronze / sustain ability) : obj\r_bronze.bmp 0572 (agate / levitation) : obj\r_agate.bmp 0573 (topaz / hunger) : obj\r_topaz.bmp 0574 (sapphire / aggravate monster) : obj\r_saph.bmp 0575 (ruby / conflict) : obj\r_ruby.bmp 0576 (diamond / warning) : obj\r_diam.bmp 0577 (pearl / poison resistance) : obj\r_pearl.bmp 0578 (iron / fire resistance) : obj\r_iron.bmp 0579 (brass / cold resistance) : obj\r_brass.bmp 0580 (copper / shock resistance) : obj\r_copper.bmp 0581 (twisted / free action) : obj\r_twist.bmp 0582 (steel / slow digestion) : obj\r_steel.bmp 0583 (silver / teleportation) : obj\r_silver.bmp 0584 (gold / teleport control) : obj\r_gold.bmp 0585 (ivory / polymorph) : obj\r_ivory.bmp 0586 (emerald / polymorph control) : obj\r_emrld.bmp 0587 (wire / invisibility) : obj\r_wire.bmp 0588 (engagement / see invisible) : obj\r_eng.bmp 0589 (shiny / protection from shape changers) : obj\r_shiny.bmp # amulets 0590 (circular / amulet of ESP) : obj\a_circle.bmp 0591 (spherical / amulet of life saving) : obj\a_sphere.bmp 0592 (oval / amulet of strangulation) : obj\a_oval.bmp 0593 (triangular / amulet of restful sleep) : obj\a_tri.bmp 0594 (pyramidal / amulet versus poison) : obj\a_pyra.bmp 0595 (square / amulet of change) : obj\a_square.bmp 0596 (concave / amulet of unchanging) : obj\a_conc.bmp 0597 (hexagonal / amulet of reflection) : obj\a_hex.bmp 0598 (octagonal / amulet of magical breathing) : obj\a_octa.bmp 0599 (Amulet of Yendor / cheap plastic imitation of the Amulet of Yendor) : obj\a_yendor.bmp 0600 (Amulet of Yendor / Amulet of Yendor) : obj\a_yendor.bmp # tools 0601 (large box) : obj\(box.bmp 0602 (chest) : obj\(chest.bmp 0603 (ice box) : obj\(icebox.bmp 0604 (bag / sack) : obj\(bag.bmp 0605 (bag / oilskin sack) : obj\(bag.bmp 0606 (bag / bag of holding) : obj\(bag.bmp 0607 (bag / bag of tricks) : obj\(bag.bmp 0608 (key / skeleton key) : obj\(key.bmp 0609 (lock pick) : obj\(l_pick.bmp 0610 (credit card) : obj\(card.bmp 0611 (candle / tallow candle) : obj\(candle.bmp 0612 (candle / wax candle) : obj\(candle.bmp 0613 (brass lantern) : obj\(lantern.bmp 0614 (lamp / oil lamp) : obj\(lamp.bmp 0615 (lamp / magic lamp) : obj\(lamp.bmp 0616 (expensive camera) : obj\(camera.bmp 0617 (looking glass / mirror) : obj\(mirror.bmp 0618 (glass orb / crystal ball) : obj\(ball.bmp 0619 (lenses) : obj\(lenses.bmp 0620 (blindfold) : obj\(blindf.bmp 0621 (towel) : obj\(towel.bmp 0622 (saddle) : obj\(saddle.bmp 0623 (leash) : obj\(leash.bmp 0624 (stethoscope) : obj\(scope.bmp 0625 (tinning kit) : obj\(kit.bmp 0626 (tin opener) : obj\(opener.bmp 0627 (can of grease) : obj\(grease.bmp 0628 (figurine) : obj\(figurin.bmp 0629 (magic marker) : obj\(marker.bmp 0630 (land mine) : obj\(mine.bmp 0631 (beartrap) : obj\(bear.bmp 0632 (whistle / tin whistle) : obj\(whistle.bmp 0633 (whistle / magic whistle) : obj\(whistle.bmp 0634 (flute / wooden flute) : obj\(flute.bmp 0635 (flute / magic flute) : obj\(flute.bmp 0636 (horn / tooled horn) : obj\(horn.bmp 0637 (horn / frost horn) : obj\(horn.bmp 0638 (horn / fire horn) : obj\(horn.bmp 0639 (horn / horn of plenty) : obj\(horn.bmp 0640 (harp / wooden harp) : obj\(harp.bmp 0641 (harp / magic harp) : obj\(harp.bmp 0642 (bell) : obj\(bell.bmp 0643 (bugle) : obj\(bugle.bmp 0644 (drum / leather drum) : obj\(drum.bmp 0645 (drum / drum of earthquake) : obj\(drum.bmp 0646 (pick-axe) : obj\(pickaxe.bmp 0647 (iron hook / grappling hook) : obj\(hook.bmp 0648 (unicorn horn) : obj\(u_horn.bmp 0649 (candelabrum / Candelabrum of Invocation) : obj\(menorah.bmp 0650 (silver bell / Bell of Opening) : obj\(thebell.bmp # food 0656 (tripe ration) : obj\tripe.bmp 0657 (corpse) : obj\corpse.bmp 0658 (egg) : obj\egg.bmp 0659 (meatball) : obj\meatball.bmp 0660 (meat stick) : obj\meatwand.bmp 0661 (huge chunk of meat) : obj\meathunk.bmp 0662 (meat ring) : obj\meatring.bmp 0663 (kelp frond) : obj\kelp.bmp 0664 (eucalyptus leaf) : obj\leaf.bmp 0665 (apple) : obj\apple.bmp 0666 (orange) : obj\orange.bmp 0667 (pear) : obj\pear.bmp 0668 (melon) : obj\melon.bmp 0669 (banana) : obj\banana.bmp 0670 (carrot) : obj\carrot.bmp 0671 (sprig of wolfsbane) : obj\sprig.bmp 0672 (clove of garlic) : obj\garlic.bmp 0673 (slime mold) : obj\fruit.bmp 0674 (lump of royal jelly): obj\jelly.bmp 0675 (cream pie) : obj\pie.bmp 0676 (candy bar) : obj\candybar.bmp 0677 (fortune cookie) : obj\cookie.bmp 0678 (pancake) : obj\pancake.bmp 0679 (lembas wafer) : obj\lembas.bmp 0680 (cram ration) : obj\cram.bmp 0681 (food ration) : obj\ration.bmp 0682 (K-ration) : obj\kration.bmp 0683 (C-ration) : obj\cration.bmp 0684 (tin) : obj\tin.bmp # potions 0685 (ruby / gain ability) : obj\p_ruby.bmp 0686 (pink / restore ability) : obj\p_pink.bmp 0687 (orange / confusion) : obj\p_orange.bmp 0688 (yellow / blindness) : obj\p_yellow.bmp 0689 (emerald / paralysis) : obj\p_emerld.bmp 0690 (dark green / speed) : obj\p_dgreen.bmp 0691 (cyan / levitation) : obj\p_cyan.bmp 0692 (sky blue / hallucination) : obj\p_skyblu.bmp 0693 (brilliant blue / invisibility) : obj\p_briblu.bmp 0694 (magenta / see invisible) : obj\p_magent.bmp 0695 (purple-red / healing) : obj\p_pred.bmp 0696 (puce / extra healing) : obj\p_puce.bmp 0697 (milky / gain level) : obj\p_milky.bmp 0698 (swirly / enlightenment) : obj\p_swirly.bmp 0699 (bubbly / monster detection) : obj\p_bubbly.bmp 0700 (smoky / object detection) : obj\p_smoky.bmp 0701 (cloudy / gain energy) : obj\p_cloudy.bmp 0702 (effervescent / sleeping) : obj\p_efferv.bmp 0703 (black / full healing) : obj\p_black.bmp 0704 (golden / polymorph) : obj\p_golden.bmp 0705 (brown / booze) : obj\p_brown.bmp 0706 (fizzy / sickness) : obj\p_fizzy.bmp 0707 (dark / fruit juice) : obj\p_dark.bmp 0708 (white / acid) : obj\p_white.bmp 0709 (murky / oil) : obj\p_murky.bmp 0710 (clear / water) : obj\p_clear.bmp # scrolls 0711 (ZELGO MER / enchant armor) : obj\s_scroll.bmp 0712 (JUYED AWK YACC / destroy armor) : obj\s_scroll.bmp 0713 (NR 9 / confuse monster) : obj\s_scroll.bmp 0714 (XIXAXA XOXAXA XUXAXA / scare monster) : obj\s_scroll.bmp 0715 (PRATYAVAYAH / remove curse) : obj\s_scroll.bmp 0716 (DAIYEN FOOELS / enchant weapon) : obj\s_scroll.bmp 0717 (LEP GEX VEN ZEA / create monster) : obj\s_scroll.bmp 0718 (PRIRUTSENIE / taming) : obj\s_scroll.bmp 0719 (ELBIB YLOH / genocide) : obj\s_scroll.bmp 0720 (VERR YED HORRE / light) : obj\s_scroll.bmp 0721 (VENZAR BORGAVVE / teleportation) : obj\s_scroll.bmp 0722 (THARR / gold detection) : obj\s_scroll.bmp 0723 (YUM YUM / food detection) : obj\s_scroll.bmp 0724 (KERNOD WEL / identify) : obj\s_scroll.bmp 0725 (ELAM EBOW / magic mapping) : obj\s_scroll.bmp 0726 (DUAM XNAHT / amnesia) : obj\s_scroll.bmp 0727 (ANDOVA BEGARIN / fire) : obj\s_scroll.bmp 0728 (KIRJE / earth) : obj\s_scroll.bmp 0729 (VE FORBRYDERNE / punishment) : obj\s_scroll.bmp 0730 (HACKEM MUCHE / charging) : obj\s_scroll.bmp 0731 (VELOX NEB / stinking cloud) : obj\s_scroll.bmp 0732 (FOOBIE BLETCH) : obj\s_scroll.bmp 0733 (TEMOV) : obj\s_scroll.bmp 0734 (GARVEN DEH) : obj\s_scroll.bmp 0735 (READ ME) : obj\s_scroll.bmp 0736 (stamped / mail) : obj\s_mail.bmp 0737 (unlabeled / blank paper) : obj\s_blank.bmp # spellbooks 0738 (parchment / dig) : obj\b_parch.bmp 0739 (vellum / magic missile) : obj\b_vellum.bmp 0740 (ragged / fireball) : obj\b_ragged.bmp 0741 (dog eared / cone of cold) : obj\b_eared.bmp 0742 (mottled / sleep) : obj\b_mottle.bmp 0743 (stained / finger of death) : obj\b_stain.bmp 0744 (cloth / light) : obj\b_cloth.bmp 0745 (leather / detect monsters) : obj\b_leath.bmp 0746 (white / healing) : obj\b_white.bmp 0747 (pink / knock) : obj\b_pink.bmp 0748 (red / force bolt) : obj\b_red.bmp 0749 (orange / confuse monster) : obj\b_orange.bmp 0750 (yellow / cure blindness) : obj\b_yellow.bmp 0751 (velvet / drain life) : obj\b_velvet.bmp 0752 (light green / slow monster) : obj\b_lgreen.bmp 0753 (dark green / wizard lock) : obj\b_dgreen.bmp 0754 (turquoise / create monster) : obj\b_turq.bmp 0755 (cyan / detect food) : obj\b_cyan.bmp 0756 (light blue / cause fear) : obj\b_lblue.bmp 0757 (dark blue / clairvoyance) : obj\b_dblue.bmp 0758 (indigo / cure sickness) : obj\b_indigo.bmp 0759 (magenta / charm monster) : obj\b_wrink.bmp 0760 (purple / haste self) : obj\b_purple.bmp 0761 (violet / detect unseen) : obj\b_violet.bmp 0762 (tan / levitation) : obj\b_tan.bmp 0763 (plaid / extra healing) : obj\b_plaid.bmp 0764 (light brown / restore ability) : obj\b_lbrown.bmp 0765 (dark brown / invisibility) : obj\b_dbrown.bmp 0766 (gray / detect treasure) : obj\b_gray.bmp 0767 (wrinkled / remove curse) : obj\b_wrink.bmp 0768 (dusty / magic mapping) : obj\b_dusty.bmp 0769 (bronze / identify) : obj\b_bronze.bmp 0770 (copper / turn undead) : obj\b_copper.bmp 0771 (silver / polymorph) : obj\b_silver.bmp 0772 (gold / teleport away) : obj\b_gold.bmp 0773 (glittering / create familiar) : obj\b_gliter.bmp 0774 (shining / cancellation) : obj\b_shine.bmp 0775 (dull / protection) : obj\b_dull.bmp 0776 (thin / jumping) : obj\b_thin.bmp 0779 (thick / stone to flesh) : obj\b_thick.bmp 0780 (plain / blank paper) : obj\b_blank.bmp 0781 (papyrus / Book of the Dead) : obj\b_dead.bmp #wands 0782 (glass / light) : obj\w_glass.bmp 0783 (balsa / secret door detection) : obj\w_balsa.bmp 0784 (crystal / enlightenment) : obj\w_crys.bmp 0785 (maple / create monster) : obj\w_maple.bmp 0786 (pine / wishing) : obj\w_pine.bmp 0787 (oak / nothing) : obj\w_oak.bmp 0788 (ebony / striking) : obj\w_ebony.bmp 0789 (marble / make invisible) : obj\w_marble.bmp 0790 (tin / slow monster) : obj\w_tin.bmp 0791 (brass / speed monster) : obj\w_brass.bmp 0792 (copper / undead turning) : obj\w_copper.bmp 0793 (silver / polymorph) : obj\w_silver.bmp 0794 (platinum / cancellation) : obj\w_platin.bmp 0795 (iridium / teleportation) : obj\w_irid.bmp 0796 (zinc / opening) : obj\w_zinc.bmp 0797 (aluminum / locking) : obj\w_alum.bmp 0798 (uranium / probing) : obj\w_uran.bmp 0799 (iron / digging) : obj\w_iron.bmp 0800 (steel / magic missile) : obj\w_steel.bmp 0801 (hexagonal / fire) : obj\w_hex.bmp 0802 (short / cold) : obj\w_short.bmp 0803 (runed / sleep) : obj\w_runed.bmp 0804 (long / death) : obj\w_long.bmp 0805 (curved / lightning) : obj\w_curved.bmp 0806 (forked) : obj\w_forked.bmp 0807 (spiked) : obj\w_spiked.bmp 0808 (jeweled) : obj\w_jewel.bmp # money 0809 (gold piece) : obj\gold.bmp # glass, and a few gems 0810 (white / dilithium crystal) : obj\g_white.bmp 0811 (white / diamond) : obj\g_white.bmp 0812 (red / ruby) : obj\g_red.bmp 0813 (orange / jacinth) : obj\g_orange.bmp 0814 (blue / sapphire) : obj\g_blue.bmp 0815 (black / black opal) : obj\g_black.bmp 0816 (green / emerald) : obj\g_green.bmp 0817 (green / turquoise) : obj\g_green.bmp 0818 (yellow / citrine) : obj\g_yellow.bmp 0819 (green / aquamarine) : obj\g_green.bmp 0820 (yellowish brown / amber) : obj\g_yb.bmp 0821 (yellowish brown / topaz) : obj\g_yb.bmp 0822 (black / jet) : obj\g_black.bmp 0823 (white / opal) : obj\g_white.bmp 0824 (yellow / chrysoberyl) : obj\g_yellow.bmp 0825 (red / garnet) : obj\g_red.bmp 0826 (violet / amethyst) : obj\g_violet.bmp 0827 (red / jasper) : obj\g_red.bmp 0828 (violet / fluorite) : obj\g_violet.bmp 0829 (black / obsidian) : obj\g_black.bmp 0830 (orange / agate) : obj\g_orange.bmp 0831 (green / jade) : obj\g_green.bmp 0832 (white / worthless piece of white glass) : obj\g_white.bmp 0833 (blue / worthless piece of blue glass) : obj\g_blue.bmp 0834 (red / worthless piece of red glass) : obj\g_red.bmp 0835 (yellowish brown / worthless piece of yellowish brown glass) : obj\g_yb.bmp 0836 (orange / worthless piece of orange glass) : obj\g_orange.bmp 0837 (yellow / worthless piece of yellow glass) : obj\g_yellow.bmp 0838 (black / worthless piece of black glass) : obj\g_black.bmp 0839 (green / worthless piece of green glass) : obj\g_green.bmp 0840 (violet / worthless piece of violet glass) : obj\g_violet.bmp # rocks 0841 (gray / luckstone) : obj\g_stone.bmp 0842 (gray / loadstone) : obj\g_stone.bmp 0843 (gray / flint) : obj\g_stone.bmp 0844 (rock) : obj\g_rock.bmp # other 0845 (boulder) : obj\boulder.bmp 0846 (statue) : obj\statue.bmp 0847 (heavy iron ball) : obj\ball.bmp 0848 (iron chain) : obj\chain.bmp 0849 (splash of venom / blinding venom) : obj\venom.bmp 0850 (splash of venom / acid venom) : obj\venom.bmp # terrain 0852 (dark part of a room) : etc\blank.bmp 0853 (wall) : etc\wall11.bmp 0854 (wall) : etc\wall12.bmp 0855 (wall) : etc\wall13.bmp 0856 (wall) : etc\wall14.bmp 0857 (wall) : etc\wall15.bmp 0858 (wall) : etc\wall16.bmp 0859 (wall) : etc\wall17.bmp 0860 (wall) : etc\wall18.bmp 0861 (wall) : etc\wall19.bmp 0862 (wall) : etc\wall1a.bmp 0863 (wall) : etc\wall1b.bmp 0864 (doorway) : etc\doorway.bmp 0865 (open door) : etc\odoor1.bmp 0866 (open door) : etc\odoor2.bmp 0867 (closed door) : etc\cdoor1.bmp 0868 (closed door) : etc\cdoor2.bmp 0869 (iron bars) : etc\bars.bmp 0870 (tree) : etc\tree.bmp 0871 (floor of a room) : etc\floor.bmp 0872 (corridor) : etc\corr.bmp 0873 (lit corridor) : etc\litcorr.bmp 0874 (staircase up) : etc\stairsu.bmp 0875 (staircase down) : etc\stairsd.bmp 0876 (ladder up) : etc\ladderu.bmp 0877 (ladder down) : etc\ladderd.bmp 0878 (altar) : etc\altar.bmp 0879 (grave) : etc\grave.bmp 0880 (opulent throne) : etc\throne.bmp 0881 (sink) : etc\sink.bmp 0882 (fountain) : etc\fountain.bmp 0883 (water) : etc\water.bmp 0884 (ice) : etc\ice.bmp 0885 (molten lava) : etc\lava.bmp 0886 (lowered drawbridge) : etc\bridged1.bmp 0887 (lowered drawbridge) : etc\bridged2.bmp 0888 (raised drawbridge) : etc\bridgeu1.bmp 0889 (raised drawbridge) : etc\bridgeu2.bmp 0890 (air) : etc\air.bmp 0891 (cloud) : etc\cloud.bmp 0892 (water) : etc\water2.bmp 0893 (arrow trap) : etc\t_arrow.bmp 0894 (dart trap) : etc\t_dart.bmp 0895 (falling rock trap) : etc\t_rock.bmp 0896 (squeaky board) : etc\t_board.bmp 0897 (bear trap) : etc\t_bear.bmp 0898 (land mine) : etc\t_mine.bmp 0899 (rolling boulder trap) : etc\t_roll.bmp 0900 (sleeping gas trap) : etc\t_sleep.bmp 0901 (rust trap) : etc\t_rust.bmp 0902 (fire trap) : etc\t_fire.bmp 0903 (pit) : etc\t_pit.bmp 0904 (spiked pit) : etc\t_spiked.bmp 0905 (hole) : etc\t_hole.bmp 0906 (trap door) : etc\t_door.bmp 0907 (teleportation trap) : etc\t_port.bmp 0908 (level teleporter) : etc\t_lport.bmp 0909 (magic portal) : etc\t_portal.bmp 0910 (web) : etc\t_web.bmp 0911 (statue trap) : etc\t_statue.bmp 0912 (magic trap) : etc\t_magic.bmp 0913 (anti-magic trap field) : etc\t_amagic.bmp 0914 (polymorph trap) : etc\t_morph.bmp 0915 (wall) : etc\blank.bmp 0916 (wall) : etc\blank.bmp 0917 (wall) : etc\blank.bmp 0918 (wall) : etc\blank.bmp 0919 (cmap 67) : etc\cmap_67.bmp 0920 (cmap 68) : etc\cmap_68.bmp 0921 (cmap 69) : etc\cmap_69.bmp 0922 (cmap 70) : etc\cmap_70.bmp 0923 (cmap 71) : etc\cmap_71.bmp 0924 (cmap 72) : etc\cmap_72.bmp 0925 (cmap 73) : etc\cmap_73.bmp 0926 (cmap 74) : etc\cmap_74.bmp 0927 (cmap 75) : etc\cmap_75.bmp 0928 (cmap 76) : etc\cmap_76.bmp 0929 (cmap 77) : etc\cmap_77.bmp 0930 (cmap 78) : etc\cmap_78.bmp 0931 (cmap 79) : etc\cmap_79.bmp 0932 (cmap 80) : etc\cmap_80.bmp 0933 (cmap 81) : etc\cmap_81.bmp 0934 (cmap 82) : etc\cmap_82.bmp 0935 (cmap 83) : etc\boom1.bmp 0936 (cmap 84) : etc\boom2.bmp 0937 (cmap 85) : etc\boom3.bmp 0938 (cmap 86) : etc\boom4.bmp 0939 (cmap 87) : etc\boom5.bmp 0940 (cmap 88) : etc\boom6.bmp 0941 (cmap 89) : etc\boom7.bmp 0942 (cmap 90) : etc\boom8.bmp 0943 (cmap 91) : etc\boom9.bmp 0944 (zap 0 0) : etc\zap00.bmp 0945 (zap 0 1) : etc\zap01.bmp 0946 (zap 0 2) : etc\zap02.bmp 0947 (zap 0 3) : etc\zap03.bmp 0948 (zap 1 0) : etc\zap10.bmp 0949 (zap 1 1) : etc\zap11.bmp 0950 (zap 1 2) : etc\zap12.bmp 0951 (zap 1 3) : etc\zap13.bmp 0952 (zap 2 0) : etc\zap20.bmp 0953 (zap 2 1) : etc\zap21.bmp 0954 (zap 2 2) : etc\zap22.bmp 0955 (zap 2 3) : etc\zap23.bmp 0956 (zap 3 0) : etc\zap30.bmp 0957 (zap 3 1) : etc\zap31.bmp 0958 (zap 3 2) : etc\zap32.bmp 0959 (zap 3 3) : etc\zap33.bmp 0960 (zap 4 0) : etc\zap40.bmp 0961 (zap 4 1) : etc\zap41.bmp 0962 (zap 4 2) : etc\zap42.bmp 0963 (zap 4 3) : etc\zap43.bmp 0964 (zap 5 0) : etc\zap50.bmp 0965 (zap 5 1) : etc\zap51.bmp 0966 (zap 5 2) : etc\zap52.bmp 0967 (zap 5 3) : etc\zap53.bmp 0968 (zap 6 0) : etc\zap60.bmp 0969 (zap 6 1) : etc\zap61.bmp 0970 (zap 6 2) : etc\zap62.bmp 0971 (zap 6 3) : etc\zap63.bmp 0972 (zap 7 0) : etc\zap70.bmp 0973 (zap 7 1) : etc\zap71.bmp 0974 (zap 7 2) : etc\zap72.bmp 0975 (zap 7 3) : etc\zap73.bmp 0976 (sub mine walls 0) : etc\wall21.bmp 0977 (sub mine walls 1) : etc\wall22.bmp 0978 (sub mine walls 2) : etc\wall23.bmp 0979 (sub mine walls 3) : etc\wall24.bmp 0980 (sub mine walls 4) : etc\wall25.bmp 0981 (sub mine walls 5) : etc\wall26.bmp 0982 (sub mine walls 6) : etc\wall27.bmp 0983 (sub mine walls 7) : etc\wall28.bmp 0984 (sub mine walls 8) : etc\wall29.bmp 0985 (sub mine walls 9) : etc\wall2a.bmp 0986 (sub mine walls 10) : etc\wall2b.bmp 0987 (sub gehennom walls 0) : etc\wall31.bmp 0988 (sub gehennom walls 1) : etc\wall32.bmp 0989 (sub gehennom walls 2) : etc\wall33.bmp 0990 (sub gehennom walls 3) : etc\wall34.bmp 0991 (sub gehennom walls 4) : etc\wall35.bmp 0992 (sub gehennom walls 5) : etc\wall36.bmp 0993 (sub gehennom walls 6) : etc\wall37.bmp 0994 (sub gehennom walls 7) : etc\wall38.bmp 0995 (sub gehennom walls 8) : etc\wall39.bmp 0996 (sub gehennom walls 9) : etc\wall3a.bmp 0997 (sub gehennom walls 10) : etc\wall3b.bmp 0998 (sub knox walls 0) : etc\wall41.bmp 0999 (sub knox walls 1) : etc\wall42.bmp 1000 (sub knox walls 2) : etc\wall43.bmp 1001 (sub knox walls 3) : etc\wall44.bmp 1002 (sub knox walls 4) : etc\wall45.bmp 1003 (sub knox walls 5) : etc\wall46.bmp 1004 (sub knox walls 6) : etc\wall47.bmp 1005 (sub knox walls 7) : etc\wall48.bmp 1006 (sub knox walls 8) : etc\wall49.bmp 1007 (sub knox walls 9) : etc\wall4a.bmp 1008 (sub knox walls 10) : etc\wall4b.bmp 1009 (sub sokoban walls 0) : etc\wall41.bmp 1010 (sub sokoban walls 1) : etc\wall42.bmp 1011 (sub sokoban walls 2) : etc\wall43.bmp 1012 (sub sokoban walls 3) : etc\wall44.bmp 1013 (sub sokoban walls 4) : etc\wall45.bmp 1014 (sub sokoban walls 5) : etc\wall46.bmp 1015 (sub sokoban walls 6) : etc\wall47.bmp 1016 (sub sokoban walls 7) : etc\wall48.bmp 1017 (sub sokoban walls 8) : etc\wall49.bmp 1018 (sub sokoban walls 9) : etc\wall4a.bmp 1019 (sub sokoban walls 10) : etc\wall4b.bmp slashem-0.0.7E7F3/sys/msdos/tiles/pal.bmp0000664000076400007640000000066610545462317016223 0ustar alialiBM¶6(€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüTüüTüüTüüTüüTüüTüüTüüTüTüüTüüTüüTüüTüüTüüTüüTüüTTüTTüTTüTTüTTüTTüTTüTTTüüTüüTüüTüüTüüTüüTüüTüüTüTTüTTüTTüTTüTTüTTüTTüTTTüTTüTTüTTüTTüTTüTTüTTüªªªªªªªªªªªªªªªªªªªªªªªª¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨T¨T¨T¨T¨T¨T¨T¨T¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨UUUUUUUUUUUUUUUUUUUUUUUUslashem-0.0.7E7F3/sys/msdos/tiles/cursor.bmp0000664000076400007640000000406610545462317016762 0ustar alialiBM66( ÿÿòòòÿ$U$ª$ÿ$HUHªHÿHmUmªmÿm‘U‘ª‘ÿ‘¶U¶ª¶ÿ¶ÚUÚªÚÿÚÿUÿªÿÿÿ$U$ª$ÿ$$$U$$ª$$ÿ$$H$UH$ªH$ÿH$m$Um$ªm$ÿm$‘$U‘$ª‘$ÿ‘$¶$U¶$ª¶$ÿ¶$Ú$UÚ$ªÚ$ÿÚ$ÿ$Uÿ$ªÿ$ÿÿ$HUHªHÿH$HU$Hª$Hÿ$HHHUHHªHHÿHHmHUmHªmHÿmH‘HU‘Hª‘Hÿ‘H¶HU¶Hª¶Hÿ¶HÚHUÚHªÚHÿÚHÿHUÿHªÿHÿÿHmUmªmÿm$mU$mª$mÿ$mHmUHmªHmÿHmmmUmmªmmÿmm‘mU‘mª‘mÿ‘m¶mU¶mª¶mÿ¶mÚmUÚmªÚmÿÚmÿmUÿmªÿmÿÿm‘U‘ª‘ÿ‘$‘U$‘ª$‘ÿ$‘H‘UH‘ªH‘ÿH‘m‘Um‘ªm‘ÿm‘‘‘U‘‘ª‘‘ÿ‘‘¶‘U¶‘ª¶‘ÿ¶‘Ú‘UÚ‘ªÚ‘ÿÚ‘ÿ‘Uÿ‘ªÿ‘ÿÿ‘¶U¶ª¶ÿ¶$¶U$¶ª$¶ÿ$¶H¶UH¶ªH¶ÿH¶m¶Um¶ªm¶ÿm¶‘¶U‘¶ª‘¶ÿ‘¶¶¶U¶¶ª¶¶ÿ¶¶Ú¶UÚ¶ªÚ¶ÿÚ¶ÿ¶Uÿ¶ªÿ¶ÿÿ¶ÚUÚªÚÿÚ$ÚU$Úª$Úÿ$ÚHÚUHÚªHÚÿHÚmÚUmÚªmÚÿmÚ‘ÚU‘Úª‘Úÿ‘Ú¶ÚU¶Úª¶Úÿ¶ÚÚÚUÚÚªÚÚÿÚÚÿÚUÿÚªÿÚÿÿÚÿUÿªÿÿÿ$ÿU$ÿª$ÿÿ$ÿHÿUHÿªHÿÿHÿmÿUmÿªmÿÿmÿ‘ÿU‘ÿª‘ÿÿ‘ÿ¶ÿU¶ÿª¶ÿÿ¶ÿÚÿUÚÿªÚÿÿÚÿÿÿUÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿslashem-0.0.7E7F3/sys/msdos/tiles/curs3d-2.bmp0000664000076400007640000002206610545462317017007 0ustar alialiBM6$6(0@$ttÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦¦¦¦¦¦¦¦¦¦¦ŸŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ““™™ŸŸŸŸŸŸŸŸŸŸŸ™™““ŒŒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŒŒ“““™™™™™™™™™™™“““ŒŒ†ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ†ŒŒŒ“““““““““““ŒŒŒ††ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŒŒŒŒŒŒŒŒŒŒŒŒ†ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿslashem-0.0.7E7F3/sys/msdos/tiles/32on.bmp0000664000076400007640000000406610545462317016226 0ustar alialiBM66( ÿÿPa@@P00aP@a0‘q @ @a@Pq@0P PqPqa¡²¡@ @‘¡00P0¡ P aqPq‘aÚUÚªÚÿÚÿUÿªÿÿÿ$U$ª$ÿ$$$U$$ª$$ÿ$$H$UH$ªH$ÿH$m$Um$ªm$ÿm$‘$U‘$ª‘$ÿ‘$¶$U¶$ª¶$ÿ¶$Ú$UÚ$ªÚ$ÿÚ$ÿ$Uÿ$ªÿ$ÿÿ$HUHªHÿH$HU$Hª$Hÿ$HHHUHHªHHÿHHmHUmHªmHÿmH‘HU‘Hª‘Hÿ‘H¶HU¶Hª¶Hÿ¶HÚHUÚHªÚHÿÚHÿHUÿHªÿHÿÿHmUmªmÿm$mU$mª$mÿ$mHmUHmªHmÿHmmmUmmªmmÿmm‘mU‘mª‘mÿ‘m¶mU¶mª¶mÿ¶mÚmUÚmªÚmÿÚmÿmUÿmªÿmÿÿm‘U‘ª‘ÿ‘$‘U$‘ª$‘ÿ$‘H‘UH‘ªH‘ÿH‘m‘Um‘ªm‘ÿm‘‘‘U‘‘ª‘‘ÿ‘‘¶‘U¶‘ª¶‘ÿ¶‘Ú‘UÚ‘ªÚ‘ÿÚ‘ÿ‘Uÿ‘ªÿ‘ÿÿ‘¶U¶ª¶ÿ¶$¶U$¶ª$¶ÿ$¶H¶UH¶ªH¶ÿH¶m¶Um¶ªm¶ÿm¶‘¶U‘¶ª‘¶ÿ‘¶¶¶U¶¶ª¶¶ÿ¶¶Ú¶UÚ¶ªÚ¶ÿÚ¶ÿ¶Uÿ¶ªÿ¶ÿÿ¶ÚUÚªÚÿÚ$ÚU$Úª$Úÿ$ÚHÚUHÚªHÚÿHÚmÚUmÚªmÚÿmÚ‘ÚU‘Úª‘Úÿ‘Ú¶ÚU¶Úª¶Úÿ¶ÚÚÚUÚÚªÚÚÿÚÚÿÚUÿÚªÿÚÿÿÚÿUÿªÿÿÿ$ÿU$ÿª$ÿÿ$ÿHÿUHÿªHÿÿHÿmÿUmÿªmÿÿmÿ‘ÿU‘ÿª‘ÿÿ‘ÿ¶ÿU¶ÿª¶ÿÿ¶ÿÚÿUÚÿªÚÿÿÚÿÿÿUÿÿÿÿÿMM)))))MM)))))) M)))) )) MM  MMMMMMMMMMM  MMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMM MMMMMMMMMM MMMM MMMMMMMM MMM MMMMMMMMMM MMMMMMMMMM MMMMMMMMMMMMM MMMMMMMMMMMM MMMMMM MMMMM MMMMMMMMMMMMM MMMMMMMMM)MMMM  MMMMMMMMMM  MMMMMMMMMM  MM)MMMMMM MM MMMMMMM MMMMMMMMMMMMMM MMMMMMMMMMMM MMMMM  MMMMMMM MM  MMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMM  MMMMMM MM MM    ) )) slashem-0.0.7E7F3/sys/msdos/tiles/map.bmp0000664000076400007640000000225610545462317016221 0ustar alialiBMš6( dÿÿòòòªÿ$U$ª$ÿ$HUHªHÿHmUmªmÿm‘U‘ª‘ÿ‘¶U¶ª¶ÿ¶ÚUÚªÚÿÚÿUÿªÿÿÿ$U$ª$ÿ$$$U$$ª$$ÿ$$H$UH$ªH$ÿH$m$Um$ªm$ÿm$‘$U‘$ª‘$ÿ‘$¶$U¶$ª¶$ÿ¶$Ú$UÚ$ªÚ$ÿÚ$ÿ$Uÿ$ªÿ$ÿÿ$HUHªHÿH$HU$Hª$Hÿ$HHHUHHªHHÿHHmHUmHªmHÿmH‘HU‘Hª‘Hÿ‘H¶HU¶Hª¶Hÿ¶HÚHUÚHªÚHÿÚHÿHUÿHªÿHÿÿHmUmªmÿm$mU$mª$mÿ$mHmUHmªHmÿHmmmUmmªmmÿmm‘mU‘mª‘mÿ‘m¶mU¶mª¶mÿ¶mÚmUÚmªÚmÿÚmÿmUÿmªÿmÿÿm‘U‘ª‘ÿ‘$‘U$‘ª$‘ÿ$‘H‘UH‘ªH‘ÿH‘m‘Um‘ªm‘ÿm‘‘‘U‘‘ª‘‘ÿ‘‘¶‘U¶‘ª¶‘ÿ¶‘Ú‘UÚ‘ªÚ‘ÿÚ‘ÿ‘Uÿ‘ªÿ‘ÿÿ‘¶U¶ª¶ÿ¶$¶U$¶ª$¶ÿ$¶H¶UH¶ªH¶ÿH¶m¶Um¶ªm¶ÿm¶‘¶U‘¶ª‘¶ÿ‘¶¶¶U¶¶ª¶¶ÿ¶¶Ú¶UÚ¶ªÚ¶ÿÚ¶ÿ¶Uÿ¶ªÿ¶ÿÿ¶ÚUÚªÚÿÚ$ÚU$Úª$Úÿ$ÚHÚUHÚªHÚÿHÚmÚUmÚªmÚÿmÚ‘ÚU‘Úª‘Úÿ‘Ú¶ÚU¶Úª¶Úÿ¶ÚÚÚUÚÚªÚÚÿÚÚÿÚUÿÚªÿÚÿÿÚÿUÿªÿÿÿ$ÿU$ÿª$ÿÿ$ÿHÿUHÿªHÿÿHÿmÿUmÿªmÿÿmÿ‘ÿU‘ÿª‘ÿÿ‘ÿ¶ÿU¶ÿª¶ÿÿ¶ÿÚÿUÚÿªÚÿÿÚÿÿÿUÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿslashem-0.0.7E7F3/sys/msdos/tiles/16on.bmp0000664000076400007640000000246610545462317016232 0ustar alialiBM66(ÿÿPa@@P0@a@aP 0@a00aqP @ ‘qPaP0P qaPqPaa @‘¡‘Pq@@P@q‘a‘0P0ÚUÚªÚÿÚÿUÿªÿÿÿ$U$ª$ÿ$$$U$$ª$$ÿ$$H$UH$ªH$ÿH$m$Um$ªm$ÿm$‘$U‘$ª‘$ÿ‘$¶$U¶$ª¶$ÿ¶$Ú$UÚ$ªÚ$ÿÚ$ÿ$Uÿ$ªÿ$ÿÿ$HUHªHÿH$HU$Hª$Hÿ$HHHUHHªHHÿHHmHUmHªmHÿmH‘HU‘Hª‘Hÿ‘H¶HU¶Hª¶Hÿ¶HÚHUÚHªÚHÿÚHÿHUÿHªÿHÿÿHmUmªmÿm$mU$mª$mÿ$mHmUHmªHmÿHmmmUmmªmmÿmm‘mU‘mª‘mÿ‘m¶mU¶mª¶mÿ¶mÚmUÚmªÚmÿÚmÿmUÿmªÿmÿÿm‘U‘ª‘ÿ‘$‘U$‘ª$‘ÿ$‘H‘UH‘ªH‘ÿH‘m‘Um‘ªm‘ÿm‘‘‘U‘‘ª‘‘ÿ‘‘¶‘U¶‘ª¶‘ÿ¶‘Ú‘UÚ‘ªÚ‘ÿÚ‘ÿ‘Uÿ‘ªÿ‘ÿÿ‘¶U¶ª¶ÿ¶$¶U$¶ª$¶ÿ$¶H¶UH¶ªH¶ÿH¶m¶Um¶ªm¶ÿm¶‘¶U‘¶ª‘¶ÿ‘¶¶¶U¶¶ª¶¶ÿ¶¶Ú¶UÚ¶ªÚ¶ÿÚ¶ÿ¶Uÿ¶ªÿ¶ÿÿ¶ÚUÚªÚÿÚ$ÚU$Úª$Úÿ$ÚHÚUHÚªHÚÿHÚmÚUmÚªmÚÿmÚ‘ÚU‘Úª‘Úÿ‘Ú¶ÚU¶Úª¶Úÿ¶ÚÚÚUÚÚªÚÚÿÚÚÿÚUÿÚªÿÚÿÿÚÿUÿªÿÿÿ$ÿU$ÿª$ÿÿ$ÿHÿUHÿªHÿÿHÿmÿUmÿªmÿÿmÿ‘ÿU‘ÿª‘ÿÿ‘ÿ¶ÿU¶ÿª¶ÿÿ¶ÿÚÿUÚÿªÚÿÿÚÿÿÿUÿÿÿÿÿ )(    MMMMMMMMMMMMMMMMMMM MMMM MMMMMMMM M M slashem-0.0.7E7F3/sys/msdos/tiles/credits0000664000076400007640000000011010545462317016307 0ustar alialiTiles by M. Itakura, K. Youngblood, P. Pliska, J. Harris and A. Walker. slashem-0.0.7E7F3/sys/msdos/tiles/16off.bmp0000664000076400007640000000246610545462317016370 0ustar alialiBM66(ÿÿPP@@@0aqa PPPP@@aaPqqa 0 q‘‘‘ @P@0@000 P@@ 00@0Pa@ÚUÚªÚÿÚÿUÿªÿÿÿ$U$ª$ÿ$$$U$$ª$$ÿ$$H$UH$ªH$ÿH$m$Um$ªm$ÿm$‘$U‘$ª‘$ÿ‘$¶$U¶$ª¶$ÿ¶$Ú$UÚ$ªÚ$ÿÚ$ÿ$Uÿ$ªÿ$ÿÿ$HUHªHÿH$HU$Hª$Hÿ$HHHUHHªHHÿHHmHUmHªmHÿmH‘HU‘Hª‘Hÿ‘H¶HU¶Hª¶Hÿ¶HÚHUÚHªÚHÿÚHÿHUÿHªÿHÿÿHmUmªmÿm$mU$mª$mÿ$mHmUHmªHmÿHmmmUmmªmmÿmm‘mU‘mª‘mÿ‘m¶mU¶mª¶mÿ¶mÚmUÚmªÚmÿÚmÿmUÿmªÿmÿÿm‘U‘ª‘ÿ‘$‘U$‘ª$‘ÿ$‘H‘UH‘ªH‘ÿH‘m‘Um‘ªm‘ÿm‘‘‘U‘‘ª‘‘ÿ‘‘¶‘U¶‘ª¶‘ÿ¶‘Ú‘UÚ‘ªÚ‘ÿÚ‘ÿ‘Uÿ‘ªÿ‘ÿÿ‘¶U¶ª¶ÿ¶$¶U$¶ª$¶ÿ$¶H¶UH¶ªH¶ÿH¶m¶Um¶ªm¶ÿm¶‘¶U‘¶ª‘¶ÿ‘¶¶¶U¶¶ª¶¶ÿ¶¶Ú¶UÚ¶ªÚ¶ÿÚ¶ÿ¶Uÿ¶ªÿ¶ÿÿ¶ÚUÚªÚÿÚ$ÚU$Úª$Úÿ$ÚHÚUHÚªHÚÿHÚmÚUmÚªmÚÿmÚ‘ÚU‘Úª‘Úÿ‘Ú¶ÚU¶Úª¶Úÿ¶ÚÚÚUÚÚªÚÚÿÚÚÿÚUÿÚªÿÚÿÿÚÿUÿªÿÿÿ$ÿU$ÿª$ÿÿ$ÿHÿUHÿªHÿÿHÿmÿUmÿªmÿÿmÿ‘ÿU‘ÿª‘ÿÿ‘ÿ¶ÿU¶ÿª¶ÿÿ¶ÿÚÿUÚÿªÚÿÿÚÿÿÿUÿÿÿÿÿ     II IIIIIIIIII II II I I  slashem-0.0.7E7F3/sys/msdos/tiles/error.bmp0000664000076400007640000000406610545462317016576 0ustar alialiBM66( ÿÿÂÿ$U$ª$ÿ$HUHªHÿHmUmªmÿm‘U‘ª‘ÿ‘¶U¶ª¶ÿ¶ÚUÚªÚÿÚÿUÿªÿÿÿ$U$ª$ÿ$$$U$$ª$$ÿ$$H$UH$ªH$ÿH$m$Um$ªm$ÿm$‘$U‘$ª‘$ÿ‘$¶$U¶$ª¶$ÿ¶$Ú$UÚ$ªÚ$ÿÚ$ÿ$Uÿ$ªÿ$ÿÿ$HUHªHÿH$HU$Hª$Hÿ$HHHUHHªHHÿHHmHUmHªmHÿmH‘HU‘Hª‘Hÿ‘H¶HU¶Hª¶Hÿ¶HÚHUÚHªÚHÿÚHÿHUÿHªÿHÿÿHmUmªmÿm$mU$mª$mÿ$mHmUHmªHmÿHmmmUmmªmmÿmm‘mU‘mª‘mÿ‘m¶mU¶mª¶mÿ¶mÚmUÚmªÚmÿÚmÿmUÿmªÿmÿÿm‘U‘ª‘ÿ‘$‘U$‘ª$‘ÿ$‘H‘UH‘ªH‘ÿH‘m‘Um‘ªm‘ÿm‘‘‘U‘‘ª‘‘ÿ‘‘¶‘U¶‘ª¶‘ÿ¶‘Ú‘UÚ‘ªÚ‘ÿÚ‘ÿ‘Uÿ‘ªÿ‘ÿÿ‘¶U¶ª¶ÿ¶$¶U$¶ª$¶ÿ$¶H¶UH¶ªH¶ÿH¶m¶Um¶ªm¶ÿm¶‘¶U‘¶ª‘¶ÿ‘¶¶¶U¶¶ª¶¶ÿ¶¶Ú¶UÚ¶ªÚ¶ÿÚ¶ÿ¶Uÿ¶ªÿ¶ÿÿ¶ÚUÚªÚÿÚ$ÚU$Úª$Úÿ$ÚHÚUHÚªHÚÿHÚmÚUmÚªmÚÿmÚ‘ÚU‘Úª‘Úÿ‘Ú¶ÚU¶Úª¶Úÿ¶ÚÚÚUÚÚªÚÚÿÚÚÿÚUÿÚªÿÚÿÿÚÿUÿªÿÿÿ$ÿU$ÿª$ÿÿ$ÿHÿUHÿªHÿÿHÿmÿUmÿªmÿÿmÿ‘ÿU‘ÿª‘ÿÿ‘ÿ¶ÿU¶ÿª¶ÿÿ¶ÿÚÿUÚÿªÚÿÿÚÿÿÿUÿÿÿÿÿslashem-0.0.7E7F3/sys/msdos/tiles/title.bmp0000664000076400007640000026062610545462317016574 0ustar alialiBM–a6(¬`]ÿÿ000ÿ$U$ª$ÿ$HUHªHÿHmUmªmÿm‘U‘ª‘ÿ‘¶U¶ª¶ÿ¶ÚUÚªÚÿÚÿUÿªÿÿÿ$U$ª$ÿ$$$U$$ª$$ÿ$$H$UH$ªH$ÿH$m$Um$ªm$ÿm$‘$U‘$ª‘$ÿ‘$¶$U¶$ª¶$ÿ¶$Ú$UÚ$ªÚ$ÿÚ$ÿ$Uÿ$ªÿ$ÿÿ$HUHªHÿH$HU$Hª$Hÿ$HHHUHHªHHÿHHmHUmHªmHÿmH‘HU‘Hª‘Hÿ‘H¶HU¶Hª¶Hÿ¶HÚHUÚHªÚHÿÚHÿHUÿHªÿHÿÿHmUmªmÿm$mU$mª$mÿ$mHmUHmªHmÿHmmmUmmªmmÿmm‘mU‘mª‘mÿ‘m¶mU¶mª¶mÿ¶mÚmUÚmªÚmÿÚmÿmUÿmªÿmÿÿm‘U‘ª‘ÿ‘$‘U$‘ª$‘ÿ$‘H‘UH‘ªH‘ÿH‘m‘Um‘ªm‘ÿm‘‘‘U‘‘ª‘‘ÿ‘‘¶‘U¶‘ª¶‘ÿ¶‘Ú‘UÚ‘ªÚ‘ÿÚ‘ÿ‘Uÿ‘ªÿ‘ÿÿ‘¶U¶ª¶ÿ¶$¶U$¶ª$¶ÿ$¶H¶UH¶ªH¶ÿH¶m¶Um¶ªm¶ÿm¶‘¶U‘¶ª‘¶ÿ‘¶¶¶U¶¶ª¶¶ÿ¶¶Ú¶UÚ¶ªÚ¶ÿÚ¶ÿ¶Uÿ¶ªÿ¶ÿÿ¶ÚUÚªÚÿÚ$ÚU$Úª$Úÿ$ÚHÚUHÚªHÚÿHÚmÚUmÚªmÚÿmÚ‘ÚU‘Úª‘Úÿ‘Ú¶ÚU¶Úª¶Úÿ¶ÚÚÚUÚÚªÚÚÿÚÚÿÚUÿÚªÿÚÿÿÚÿUÿªÿÿÿ$ÿU$ÿª$ÿÿ$ÿHÿUHÿªHÿÿHÿmÿUmÿªmÿÿmÿ‘ÿU‘ÿª‘ÿÿ‘ÿ¶ÿU¶ÿª¶ÿÿ¶ÿÚÿUÚÿªÚÿÿÚÿÿÿUÿÿÿÿÿslashem-0.0.7E7F3/sys/msdos/tiles/32off.bmp0000664000076400007640000000406610545462317016364 0ustar alialiBM66( ÿÿPP@@@0aaPq 0 @P@qqa00  PPP¡‘¡ PaP0@  ‘0@0ª¶ÿ¶ÚUÚªÚÿÚÿUÿªÿÿÿ$U$ª$ÿ$$$U$$ª$$ÿ$$H$UH$ªH$ÿH$m$Um$ªm$ÿm$‘$U‘$ª‘$ÿ‘$¶$U¶$ª¶$ÿ¶$Ú$UÚ$ªÚ$ÿÚ$ÿ$Uÿ$ªÿ$ÿÿ$HUHªHÿH$HU$Hª$Hÿ$HHHUHHªHHÿHHmHUmHªmHÿmH‘HU‘Hª‘Hÿ‘H¶HU¶Hª¶Hÿ¶HÚHUÚHªÚHÿÚHÿHUÿHªÿHÿÿHmUmªmÿm$mU$mª$mÿ$mHmUHmªHmÿHmmmUmmªmmÿmm‘mU‘mª‘mÿ‘m¶mU¶mª¶mÿ¶mÚmUÚmªÚmÿÚmÿmUÿmªÿmÿÿm‘U‘ª‘ÿ‘$‘U$‘ª$‘ÿ$‘H‘UH‘ªH‘ÿH‘m‘Um‘ªm‘ÿm‘‘‘U‘‘ª‘‘ÿ‘‘¶‘U¶‘ª¶‘ÿ¶‘Ú‘UÚ‘ªÚ‘ÿÚ‘ÿ‘Uÿ‘ªÿ‘ÿÿ‘¶U¶ª¶ÿ¶$¶U$¶ª$¶ÿ$¶H¶UH¶ªH¶ÿH¶m¶Um¶ªm¶ÿm¶‘¶U‘¶ª‘¶ÿ‘¶¶¶U¶¶ª¶¶ÿ¶¶Ú¶UÚ¶ªÚ¶ÿÚ¶ÿ¶Uÿ¶ªÿ¶ÿÿ¶ÚUÚªÚÿÚ$ÚU$Úª$Úÿ$ÚHÚUHÚªHÚÿHÚmÚUmÚªmÚÿmÚ‘ÚU‘Úª‘Úÿ‘Ú¶ÚU¶Úª¶Úÿ¶ÚÚÚUÚÚªÚÚÿÚÚÿÚUÿÚªÿÚÿÿÚÿUÿªÿÿÿ$ÿU$ÿª$ÿÿ$ÿHÿUHÿªHÿÿHÿmÿUmÿªmÿÿmÿ‘ÿU‘ÿª‘ÿÿ‘ÿ¶ÿU¶ÿª¶ÿÿ¶ÿÚÿUÚÿªÚÿÿÚÿÿÿUÿÿÿÿÿ                                                                                               ’    ’ ’        slashem-0.0.7E7F3/sys/msdos/tiles/cursor3d.bmp0000664000076400007640000001006610545462317017206 0ustar alialiBM66(0@ ÿÿòòÿ$U$ª$ÿ$HUHªHÿHmUmªmÿm‘U‘ª‘ÿ‘¶U¶ª¶ÿ¶ÚUÚªÚÿÚÿUÿªÿÿÿ$U$ª$ÿ$$$U$$ª$$ÿ$$H$UH$ªH$ÿH$m$Um$ªm$ÿm$‘$U‘$ª‘$ÿ‘$¶$U¶$ª¶$ÿ¶$Ú$UÚ$ªÚ$ÿÚ$ÿ$Uÿ$ªÿ$ÿÿ$HUHªHÿH$HU$Hª$Hÿ$HHHUHHªHHÿHHmHUmHªmHÿmH‘HU‘Hª‘Hÿ‘H¶HU¶Hª¶Hÿ¶HÚHUÚHªÚHÿÚHÿHUÿHªÿHÿÿHmUmªmÿm$mU$mª$mÿ$mHmUHmªHmÿHmmmUmmªmmÿmm‘mU‘mª‘mÿ‘m¶mU¶mª¶mÿ¶mÚmUÚmªÚmÿÚmÿmUÿmªÿmÿÿm‘U‘ª‘ÿ‘$‘U$‘ª$‘ÿ$‘H‘UH‘ªH‘ÿH‘m‘Um‘ªm‘ÿm‘‘‘U‘‘ª‘‘ÿ‘‘¶‘U¶‘ª¶‘ÿ¶‘Ú‘UÚ‘ªÚ‘ÿÚ‘ÿ‘Uÿ‘ªÿ‘ÿÿ‘¶U¶ª¶ÿ¶$¶U$¶ª$¶ÿ$¶H¶UH¶ªH¶ÿH¶m¶Um¶ªm¶ÿm¶‘¶U‘¶ª‘¶ÿ‘¶¶¶U¶¶ª¶¶ÿ¶¶Ú¶UÚ¶ªÚ¶ÿÚ¶ÿ¶Uÿ¶ªÿ¶ÿÿ¶ÚUÚªÚÿÚ$ÚU$Úª$Úÿ$ÚHÚUHÚªHÚÿHÚmÚUmÚªmÚÿmÚ‘ÚU‘Úª‘Úÿ‘Ú¶ÚU¶Úª¶Úÿ¶ÚÚÚUÚÚªÚÚÿÚÚÿÚUÿÚªÿÚÿÿÚÿUÿªÿÿÿ$ÿU$ÿª$ÿÿ$ÿHÿUHÿªHÿÿHÿmÿUmÿªmÿÿmÿ‘ÿU‘ÿª‘ÿÿ‘ÿ¶ÿU¶ÿª¶ÿÿ¶ÿÚÿUÚÿªÚÿÿÚÿÿÿUÿÿÿÿÿslashem-0.0.7E7F3/sys/msdos/tiles/spfx/0000775000076400007640000000000010545462317015717 5ustar alialislashem-0.0.7E7F3/sys/msdos/tiles/spfx/matter.bmp0000664000076400007640000034206610545462317017726 0ustar alialiBM6Ä6(@Àÿÿòòªÿ$U$ª$ÿ$HUHªHÿHmUmªmÿm‘U‘ª‘ÿ‘¶U¶ª¶ÿ¶ÚUÚªÚÿÚÿUÿªÿÿÿ$U$ª$ÿ$$$U$$ª$$ÿ$$H$UH$ªH$ÿH$m$Um$ªm$ÿm$‘$U‘$ª‘$ÿ‘$¶$U¶$ª¶$ÿ¶$Ú$UÚ$ªÚ$ÿÚ$ÿ$Uÿ$ªÿ$ÿÿ$HUHªHÿH$HU$Hª$Hÿ$HHHUHHªHHÿHHmHUmHªmHÿmH‘HU‘Hª‘Hÿ‘H¶HU¶Hª¶Hÿ¶HÚHUÚHªÚHÿÚHÿHUÿHªÿHÿÿHmUmªmÿm$mU$mª$mÿ$mHmUHmªHmÿHmmmUmmªmmÿmm‘mU‘mª‘mÿ‘m¶mU¶mª¶mÿ¶mÚmUÚmªÚmÿÚmÿmUÿmªÿmÿÿm‘U‘ª‘ÿ‘$‘U$‘ª$‘ÿ$‘H‘UH‘ªH‘ÿH‘m‘Um‘ªm‘ÿm‘‘‘U‘‘ª‘‘ÿ‘‘¶‘U¶‘ª¶‘ÿ¶‘Ú‘UÚ‘ªÚ‘ÿÚ‘ÿ‘Uÿ‘ªÿ‘ÿÿ‘¶U¶ª¶ÿ¶$¶U$¶ª$¶ÿ$¶H¶UH¶ªH¶ÿH¶m¶Um¶ªm¶ÿm¶‘¶U‘¶ª‘¶ÿ‘¶¶¶U¶¶ª¶¶ÿ¶¶Ú¶UÚ¶ªÚ¶ÿÚ¶ÿ¶Uÿ¶ªÿ¶ÿÿ¶ÚUÚªÚÿÚ$ÚU$Úª$Úÿ$ÚHÚUHÚªHÚÿHÚmÚUmÚªmÚÿmÚ‘ÚU‘Úª‘Úÿ‘Ú¶ÚU¶Úª¶Úÿ¶ÚÚÚUÚÚªÚÚÿÚÚÿÚUÿÚªÿÚÿÿÚÿUÿªÿÿÿ$ÿU$ÿª$ÿÿ$ÿHÿUHÿªHÿÿHÿmÿUmÿªmÿÿmÿ‘ÿU‘ÿª‘ÿÿ‘ÿ¶ÿU¶ÿª¶ÿÿ¶ÿÚÿUÚÿªÚÿÿÚÿÿÿUÿÿÿÿÿüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüslashem-0.0.7E7F3/sys/msdos/tiles/spfx/acidball.bmp0000664000076400007640000002406610545462317020162 0ustar alialiBM6(6(``$ÿÿ ¡‘@²aâÂqòÒU$ª$ÿ$HUHªHÿHmUmªmÿm‘U‘ª‘ÿ‘¶U¶ª¶ÿ¶ÚUÚªÚÿÚÿUÿªÿÿÿ$U$ª$ÿ$$$U$$ª$$ÿ$$H$UH$ªH$ÿH$m$Um$ªm$ÿm$‘$U‘$ª‘$ÿ‘$¶$U¶$ª¶$ÿ¶$Ú$UÚ$ªÚ$ÿÚ$ÿ$Uÿ$ªÿ$ÿÿ$HUHªHÿH$HU$Hª$Hÿ$HHHUHHªHHÿHHmHUmHªmHÿmH‘HU‘Hª‘Hÿ‘H¶HU¶Hª¶Hÿ¶HÚHUÚHªÚHÿÚHÿHUÿHªÿHÿÿHmUmªmÿm$mU$mª$mÿ$mHmUHmªHmÿHmmmUmmªmmÿmm‘mU‘mª‘mÿ‘m¶mU¶mª¶mÿ¶mÚmUÚmªÚmÿÚmÿmUÿmªÿmÿÿm‘U‘ª‘ÿ‘$‘U$‘ª$‘ÿ$‘H‘UH‘ªH‘ÿH‘m‘Um‘ªm‘ÿm‘‘‘U‘‘ª‘‘ÿ‘‘¶‘U¶‘ª¶‘ÿ¶‘Ú‘UÚ‘ªÚ‘ÿÚ‘ÿ‘Uÿ‘ªÿ‘ÿÿ‘¶U¶ª¶ÿ¶$¶U$¶ª$¶ÿ$¶H¶UH¶ªH¶ÿH¶m¶Um¶ªm¶ÿm¶‘¶U‘¶ª‘¶ÿ‘¶¶¶U¶¶ª¶¶ÿ¶¶Ú¶UÚ¶ªÚ¶ÿÚ¶ÿ¶Uÿ¶ªÿ¶ÿÿ¶ÚUÚªÚÿÚ$ÚU$Úª$Úÿ$ÚHÚUHÚªHÚÿHÚmÚUmÚªmÚÿmÚ‘ÚU‘Úª‘Úÿ‘Ú¶ÚU¶Úª¶Úÿ¶ÚÚÚUÚÚªÚÚÿÚÚÿÚUÿÚªÿÚÿÿÚÿUÿªÿÿÿ$ÿU$ÿª$ÿÿ$ÿHÿUHÿªHÿÿHÿmÿUmÿªmÿÿmÿ‘ÿU‘ÿª‘ÿÿ‘ÿ¶ÿU¶ÿª¶ÿÿ¶ÿÚÿUÚÿªÚÿÿÚÿÿÿUÿÿÿÿÿÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝslashem-0.0.7E7F3/sys/msdos/tiles/spfx/snowball.bmp0000664000076400007640000002406610545462317020250 0ustar alialiBM6(6(``$ÿÿòââòòòâPPâ@@òÒÒòaaò²²òÂÂâ00Âò‘‘ò¡¡òqqâ òòPPÒÒâ¶U¶ª¶ÿ¶ÚUÚªÚÿÚÿUÿªÿÿÿ$U$ª$ÿ$$$U$$ª$$ÿ$$H$UH$ªH$ÿH$m$Um$ªm$ÿm$‘$U‘$ª‘$ÿ‘$¶$U¶$ª¶$ÿ¶$Ú$UÚ$ªÚ$ÿÚ$ÿ$Uÿ$ªÿ$ÿÿ$HUHªHÿH$HU$Hª$Hÿ$HHHUHHªHHÿHHmHUmHªmHÿmH‘HU‘Hª‘Hÿ‘H¶HU¶Hª¶Hÿ¶HÚHUÚHªÚHÿÚHÿHUÿHªÿHÿÿHmUmªmÿm$mU$mª$mÿ$mHmUHmªHmÿHmmmUmmªmmÿmm‘mU‘mª‘mÿ‘m¶mU¶mª¶mÿ¶mÚmUÚmªÚmÿÚmÿmUÿmªÿmÿÿm‘U‘ª‘ÿ‘$‘U$‘ª$‘ÿ$‘H‘UH‘ªH‘ÿH‘m‘Um‘ªm‘ÿm‘‘‘U‘‘ª‘‘ÿ‘‘¶‘U¶‘ª¶‘ÿ¶‘Ú‘UÚ‘ªÚ‘ÿÚ‘ÿ‘Uÿ‘ªÿ‘ÿÿ‘¶U¶ª¶ÿ¶$¶U$¶ª$¶ÿ$¶H¶UH¶ªH¶ÿH¶m¶Um¶ªm¶ÿm¶‘¶U‘¶ª‘¶ÿ‘¶¶¶U¶¶ª¶¶ÿ¶¶Ú¶UÚ¶ªÚ¶ÿÚ¶ÿ¶Uÿ¶ªÿ¶ÿÿ¶ÚUÚªÚÿÚ$ÚU$Úª$Úÿ$ÚHÚUHÚªHÚÿHÚmÚUmÚªmÚÿmÚ‘ÚU‘Úª‘Úÿ‘Ú¶ÚU¶Úª¶Úÿ¶ÚÚÚUÚÚªÚÚÿÚÚÿÚUÿÚªÿÚÿÿÚÿUÿªÿÿÿ$ÿU$ÿª$ÿÿ$ÿHÿUHÿªHÿÿHÿmÿUmÿªmÿÿmÿ‘ÿU‘ÿª‘ÿÿ‘ÿ¶ÿU¶ÿª¶ÿÿ¶ÿÚÿUÚÿªÚÿÿÚÿÿÿUÿÿÿÿÿ K ''  o'o   oKKK'    o o    KK 'oo ''K  KKKKooKK Ko  KKo Koo o K   o  Kooo       o    K  o  o KKK o     K  o  K    Ko  KKo o    o oo   K         o Ko o ·Û Û   ·ÛÛ K      o ÛÛÛ Û   ·ÛÛ oK  oooKK ÛÛÛÛ Û  · oo o KK ÛÛÛÛÛÛÛÛÛÛ Ûo     o ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ ÛÛÛ  oo KKK ÛÛÛÛÛÛÛÛÛÛ ÛÛ      ÛÛÛÛÛÛ oÛÛ o   ooK  ·ÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛ o 'o K   ÛÛÛÛÛ ÛÛÛÛ          ÛÛÛÛÛ··ÛÛÛÛ ooK o 'o ÛÛÛÛÛÛÛÛ K   K ÛÛÛÛÛ  o '  K ÛÛÛÛÛÛÛÛÛÛÛÛ  o oo  ÛÛÛÛÛÛÛÛ  o  K oo · ÛÛÛÛ   o ÛÛÛÛ·      ÛÛÛÛÛÛÛÛÛ ·ÛÛÛ·   '  ·ÛÛÛ ÛÛK'   ÛÛÛÛ Û o K   Û ÛÛÛ  K  ÛÛÛÛÛo o  ÛÛÛ    ÛÛÛÛ    o  ÛÛÛÛÛÛ  o o    ÛÛ Ko oo  ÛÛÛ oK Ko  ÛÛ o o    ÛÛ   o o ·ÛÛÛÛÛÛ oK  ÛÛÛÛ o o  oo ÛÛÛÛÛÛÛÛÛ  KoÛÛÛÛÛÛ o··o ' K ÛÛÛ   ·      ÛÛÛÛÛ  Û·  Ko ÛÛÛÛÛ  ÛÛ o       ÛÛÛÛ  Û Ko   ' ÛÛÛÛÛÛÛÛ Û    o  ÛÛÛÛ       K ÛÛÛÛÛÛÛ · oK ' oo ·ÛÛÛÛÛÛÛ   o K  ÛÛÛÛÛÛÛ  Koo ÛÛÛÛ ÛÛ Û  KK  ÛÛÛÛÛÛÛÛÛÛ · oo  K·ÛÛÛÛÛÛÛÛÛÛ K Ko ·ÛÛÛÛÛÛÛÛ·  '  o ·ÛÛÛÛÛ o  o o o Û·ÛÛÛÛÛÛÛÛÛÛ o   ' Û· ÛÛÛÛÛ·  ·oK  K · ·ÛÛÛ oo  K  Û·  o  ÛÛÛ o KK   ÛÛÛÛ    o o o  ÛÛÛÛÛÛÛ K     K ÛÛÛÛÛÛÛÛÛÛÛÛ oK     ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ   K  ÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛ   o  ÛÛÛÛÛÛÛ ÛÛÛ     oKK ÛÛ ÛÛÛÛ ··    K   ÛÛÛÛÛÛÛ· ÛÛÛ o K  o 'K ÛÛÛÛÛÛÛÛÛÛÛ    '   ·ÛÛÛ Û  K   K  ÛÛÛ   ÛÛÛÛÛÛÛ    KK        ÛÛÛÛ ooo K K       ÛÛÛ    K K '  'Û KK o' 'K  o  K  K o     K o o oo  o o'   o  oooK  ' KK KKK  ' oo KKo   KKo o KK  oKKK    oo   K'  K  ooslashem-0.0.7E7F3/sys/msdos/tiles/spfx/divine.bmp0000664000076400007640000034206610545462317017710 0ustar alialiBM6Ä6(@Àÿÿòòòò²ò²ÒÒ²‘aÿ$HUHªHÿHmUmªmÿm‘U‘ª‘ÿ‘¶U¶ª¶ÿ¶ÚUÚªÚÿÚÿUÿªÿÿÿ$U$ª$ÿ$$$U$$ª$$ÿ$$H$UH$ªH$ÿH$m$Um$ªm$ÿm$‘$U‘$ª‘$ÿ‘$¶$U¶$ª¶$ÿ¶$Ú$UÚ$ªÚ$ÿÚ$ÿ$Uÿ$ªÿ$ÿÿ$HUHªHÿH$HU$Hª$Hÿ$HHHUHHªHHÿHHmHUmHªmHÿmH‘HU‘Hª‘Hÿ‘H¶HU¶Hª¶Hÿ¶HÚHUÚHªÚHÿÚHÿHUÿHªÿHÿÿHmUmªmÿm$mU$mª$mÿ$mHmUHmªHmÿHmmmUmmªmmÿmm‘mU‘mª‘mÿ‘m¶mU¶mª¶mÿ¶mÚmUÚmªÚmÿÚmÿmUÿmªÿmÿÿm‘U‘ª‘ÿ‘$‘U$‘ª$‘ÿ$‘H‘UH‘ªH‘ÿH‘m‘Um‘ªm‘ÿm‘‘‘U‘‘ª‘‘ÿ‘‘¶‘U¶‘ª¶‘ÿ¶‘Ú‘UÚ‘ªÚ‘ÿÚ‘ÿ‘Uÿ‘ªÿ‘ÿÿ‘¶U¶ª¶ÿ¶$¶U$¶ª$¶ÿ$¶H¶UH¶ªH¶ÿH¶m¶Um¶ªm¶ÿm¶‘¶U‘¶ª‘¶ÿ‘¶¶¶U¶¶ª¶¶ÿ¶¶Ú¶UÚ¶ªÚ¶ÿÚ¶ÿ¶Uÿ¶ªÿ¶ÿÿ¶ÚUÚªÚÿÚ$ÚU$Úª$Úÿ$ÚHÚUHÚªHÚÿHÚmÚUmÚªmÚÿmÚ‘ÚU‘Úª‘Úÿ‘Ú¶ÚU¶Úª¶Úÿ¶ÚÚÚUÚÚªÚÚÿÚÚÿÚUÿÚªÿÚÿÿÚÿUÿªÿÿÿ$ÿU$ÿª$ÿÿ$ÿHÿUHÿªHÿÿHÿmÿUmÿªmÿÿmÿ‘ÿU‘ÿª‘ÿÿ‘ÿ¶ÿU¶ÿª¶ÿÿ¶ÿÚÿUÚÿªÚÿÿÚÿÿÿUÿÿÿÿÿÚÿÿÿÚrÿÿÿrÿÿÿÚÿÿÿÚÿÿÿÿÿÚÿÿÿÚÿÿÿÿÿrÿÿÿrÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÚrÿÿÿÿÿÿÿrÿÿÿÿÿÚÿÿÿÚÿÿÿÿÿÚÿÿÿÚÚÿÿÿÿÿÚrÿÿÿrÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrÚÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrÚÿÿÿÚÚÿÿÿÚrÿÿÿrÿÿÿÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÚÿÿÿÚrÿÿÿÿÿÿÿrrÿÿÿrÚÿÿÿÚÿÿÿÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrÚÿÿÿÚÚÿÿÿÚrÿÿÿrÿÿÿÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÚÿÿÿÚÚÿÿÿÿÿÚrÿÿÿrÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrÚÿÿÿÚÚÿÿÿÚÿÿÿÿÿÚÿÿÿÚÿÿÿÿÿrÿÿÿrÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÚrÿÿÿÿÿÿÿrÿÿÿÿÿÚÿÿÿÚÿÿÿÿÿÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrÚÿÿÿÚÚÿÿÿÚrÿÿÿrÿÿÿÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÚÿÿÿÚÚÿÿÿÚrÿÿÿÿÿÿÿrrÿÿÿrrÿÿÿrÚÿÿÿÚÿÿÿÿÿÿÚÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrrÿÿÿÿÿÿÿrÚÿÿÿÚÚÿÿÿÚÚÿÿÿÚrÿÿÿrÚÿÿÿÚÿÿÿrÿÿÿrÚÿÿÿÚÿÿÿÿÿÿÿÿÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚrÿÿÿÿÿÿÿrÿÿÿÿÿÿÿÿÿÚÿÿÿÚrÿÿÿÿÿÿÿrÚÿÿÿÚÚÿÿÿÚÚÿÿÿÚrÿÿÿrrÿÿÿrÿÿÿÿÿÿÚÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÚrÿÿÿÿÿÿÿrrÿÿÿÿÿÿÿrrÿÿÿrÚÿÿÿÚÚÿÿÿÚÿÿÿÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrÚÿÿÿÚÚÿÿÿÚrÿÿÿrÿÿÿÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÚÿÿÿÚÚÿÿÿÿÿÚrÿÿÿrÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrÚÿÿÿÚÚÿÿÿÚÚÿÿÿÚrÿÿÿrÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÚÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrÚÿÿÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrÚÿÿÿÚÚÿÿÿÚrÿÿÿrÿÿÿÚÿÿÿÚÿÿÿÿÿÚÿÿÿÚÿÿÿÿÿrÿÿÿrÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÚrÿÿÿÿÿÿÿrÿÿÿÿÿÚÿÿÿÚÿÿÿÿÿÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrÚÿÿÿÚÚÿÿÿÚrÿÿÿrÿÿÿÚÿÿÿÚÚÿÿÿÚrÿÿÿrÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÚÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrÚÿÿÿÚÚÿÿÿÿÿÚÚÿÿÿÚrÿÿÿrÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrÚÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrÚÿÿÿÚÚÿÿÿÚrÿÿÿrÿÿÿÚÿÿÿÚÚÿÿÿÚÿÿÿÿÿrÿÿÿrÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrÿÿÿÿÿÚÿÿÿÚÚÿÿÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿrÿÿÿrrÿÿÿÿÿÿÿrÿÿÿÚÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÚÿÿÿÚrÿÿÿÿÿÿÿrrÿÿÿrÚÿÿÿÚÿÿÿÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrÚÿÿÿÚÚÿÿÿÚrÿÿÿrÿÿÿÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÚÿÿÿÚrÿÿÿÿÿÿÿrrÿÿÿrÚÿÿÿÚÿÿÿÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿrÿÿÿrrÿÿÿÿÿÿÿrÿÿÿÚÿÿÿÚÚÿÿÿÚÚÿÿÿÚÿÿÿÿÿrÿÿÿrÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrÿÿÿÿÿÚÿÿÿÚÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrÚÿÿÿÚÚÿÿÿÚÚÿÿÿÚrÿÿÿrrÿÿÿrÿÿÿÿÿÿÚÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrrÿÿÿÿÿÿÿrÚÿÿÿÚÚÿÿÿÚÚÿÿÿÚrÿÿÿrÿÿÿÚÿÿÿÚÚÿÿÿÚrÿÿÿrÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÚÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrÚÿÿÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrÚÿÿÿÚÚÿÿÿÚrÿÿÿrÿÿÿÚÿÿÿÚÚÿÿÿÚrÿÿÿrÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÚÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrÚÿÿÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrÚÿÿÿÚÚÿÿÿÚÚÿÿÿÚrÿÿÿrrÿÿÿrÿÿÿÿÿÿÚÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrrÿÿÿÿÿÿÿrÚÿÿÿÚÚÿÿÿÚÚÿÿÿÚÚÿÿÿÚrÿÿÿrrÿÿÿrÿÿÿÿÿÿÚÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrrÿÿÿÿÿÿÿrÚÿÿÿÚÚÿÿÿÚÚÿÿÿÚrÿÿÿrÿÿÿÚÿÿÿÚÚÿÿÿÚrÿÿÿrÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÚÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrÚÿÿÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrÚÿÿÿÚÚÿÿÿÚrÿÿÿrÿÿÿÚÿÿÿÚÚÿÿÿÚrÿÿÿrÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÚÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrÚÿÿÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrÚÿÿÿÚÚÿÿÿÚÚÿÿÿÚrÿÿÿrrÿÿÿrÿÿÿÿÿÿÚÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrrÿÿÿÿÿÿÿrÚÿÿÿÚÚÿÿÿÚÚÿÿÿÚrÿÿÿrÿÿÿÚÿÿÿÚÚÿÿÿÚrÿÿÿrÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÚÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrÚÿÿÿÿÿÚÚÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿrÿÿÿrrÿÿÿÿÿÿÿrÿÿÿÚÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿrÿÿÿrrÿÿÿÿÿÿÿrÿÿÿÚÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrÚÿÿÿÚÚÿÿÿÚrÿÿÿrÿÿÿÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿrÿÿÿrrÿÿÿÿÿÿÿrÿÿÿÚÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿrÿÿÿrrÿÿÿÿÿÿÿrÿÿÿÚÿÿÿÚÚÿÿÿÚÚÿÿÿÚrÿÿÿrÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÚÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrÚÿÿÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrÚÿÿÿÚÚÿÿÿÚrÿÿÿrÿÿÿÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÚÿÿÿÚÚÿÿÿÿÿÚrÿÿÿrÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿrrÿÿÿÿÿÿÿrÚÿÿÿÚÿÿÿÚÿÿÿÚÿÿÿÿÿÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚrÿÿÿÿÿÿÿrÿÿÿÿÿÿÿÿÿÚÿÿÿÚrÿÿÿÿÿÿÿrÚÿÿÿÚÚÿÿÿÚrÿÿÿrÿÿÿÚÿÿÿÚÚÿÿÿÚÿÿÿÿÿrÿÿÿrÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrÿÿÿÿÿÚÿÿÿÚÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrÚÿÿÿÚÚÿÿÿÚrÿÿÿrÚÿÿÿÚÿÿÿrÿÿÿrÚÿÿÿÚÿÿÿÿÿÿÿÿÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚÿÿÿÿÿÚÿÿÿÚÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚrÿÿÿrrÿÿÿÿÿÿÿrÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÚrÿÿÿÿÿÿÿrÚÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrÚÿÿÿÚÚÿÿÿÚrÿÿÿrÿÿÿÚÿÿÿÚÿÿÿÿÿÚÿÿÿÚÿÿÿÿÿrÿÿÿrÚÿÿÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿrÚÿÿÿÚrÿÿÿÿÿÿÿrÿÿÿÿÿÿÿÿÚÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚrÿÿÿÿÿÿÿrÿÿÿÿÿÿÿÿÿÚÿÿÿÚrÿÿÿÿÿÿÿrÚÿÿÿÚÚÿÿÿÚÚÿÿÿÚrÿÿÿrrÿÿÿrÿÿÿÿÿÿÚÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrrÿÿÿÿÿÿÿrÚÿÿÿÚÚÿÿÿÚÚÿÿÿÚrÿÿÿrÚÿÿÿÚÿÿÿrÿÿÿrÚÿÿÿÚÿÿÿÿÿÿÿÿÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿrÚÿÿÿÿÿÚrÿÿÿÿÿÿÿrÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÚÚÿÿÿÚrÿÿÿÿÿÿÿrÿÿÿÿÿÚÿÿÿÚÿÿÿÿÿÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrÚÿÿÿÚÚÿÿÿÚrÿÿÿrÿÿÿÚÿÿÿÚÚÿÿÿÚrÿÿÿrÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÚÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÚÿÿÿÿÿrÿÿÿÿÿÿÿrrÿÿÿrÚÿÿÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÚrÿÿÿÿÿÿÿrÿÿÿÿÿÚÿÿÿÚÿÿÿÿÿÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÚÿÿÿÚrÿÿÿÿÿÿÿrrÿÿÿrÚÿÿÿÚÿÿÿÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿrÿÿÿrrÿÿÿÿÿÿÿrÿÿÿÚÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÚÿÿÿÚrÿÿÿÿÿÿÿrrÿÿÿrÚÿÿÿÚÿÿÿÚÿÿÿÚÿÿÿÿÿÚÿÿÿÚÿÿÿÿÿrÿÿÿrÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÚÚÿÿÿÚrÿÿÿÿÿÿÿrrÿÿÿrÿÿÿÿÿÚÿÿÿÚÿÿÿÿÿÿÿÿÚÿÿÿÚÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrÚÿÿÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrÚÿÿÿÚÚÿÿÿÚrÿÿÿrÚÿÿÿÚÿÿÿrÿÿÿrÚÿÿÿÚÿÿÿÿÿÿÿÿÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚrÿÿÿÿÿÿÿrÚÿÿÿÚÿÿÿÿÿÿÿÿÿÚÿÿÿÚrÿÿÿrrÿÿÿÿÿÿÿrÿÿÿÚÿÿÿÚÚÿÿÿÚÚÿÿÿÚÿÿÿÿÿrÿÿÿrÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrÿÿÿÿÿÚÿÿÿÚÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrÚÿÿÿÚÚÿÿÿÚrÿÿÿrÿÿÿÚÿÿÿÚÚÿÿÿÚÿÿÿÿÿrÿÿÿrÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrÿÿÿÿÿÚÿÿÿÚÚÿÿÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿrÿÿÿrrÿÿÿÿÿÿÿrÚÿÿÿÚÿÿÿÚÿÿÿÚrÿÿÿrÚÿÿÿÚÿÿÿÿÿÿÿÿÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚrÿÿÿÿÿÿÿrÿÿÿÿÿÿÿÿÿÚÿÿÿÚrÿÿÿÿÿÿÿrÚÿÿÿÚÚÿÿÿÚÚÿÿÿÚrÿÿÿrrÿÿÿrÿÿÿÿÿÿÚÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrrÿÿÿÿÿÿÿrÚÿÿÿÚÚÿÿÿÚÚÿÿÿÚÚÿÿÿÚrÿÿÿrrÿÿÿrÿÿÿÿÿÿÚÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrrÿÿÿÿÿÿÿrÚÿÿÿÚÚÿÿÿÚÚÿÿÿÚÚÿÿÿÚrÿÿÿrrÿÿÿrÿÿÿÿÿÿÚÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrrÿÿÿÿÿÿÿrÚÿÿÿÚÚÿÿÿÚÚÿÿÿÚÚÿÿÿÚrÿÿÿrrÿÿÿrÿÿÿÿÿÿÚÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrrÿÿÿÿÿÿÿrÚÿÿÿÚÚÿÿÿÚÚÿÿÿÚrÿÿÿrÚÿÿÿÚÿÿÿrÿÿÿrÚÿÿÿÚÿÿÿÿÿÿÿÿÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚÿÿÿÿÿÚÿÿÿÚÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚrÿÿÿrrÿÿÿÿÿÿÿrÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÚrÿÿÿÿÿÿÿrÚÿÿÿÚÚÿÿÿÚÿÿÿÿÿÚÿÿÿÚÿÿÿÿÿrÿÿÿrÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÚrÿÿÿÿÿÿÿrÿÿÿÿÿÚÿÿÿÚÿÿÿÿÿÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÚÿÿÿÚrÿÿÿÿÿÿÿrrÿÿÿrÚÿÿÿÚÿÿÿÚÿÿÿÚÿÿÿÿÿÚÿÿÿÚÿÿÿÿÿrÿÿÿrÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÚrÿÿÿÿÿÿÿrÿÿÿÿÿÚÿÿÿÚÿÿÿÿÿÚÿÿÿÚÚÿÿÿÿÿÚrÿÿÿrÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿrrÿÿÿÿÿÿÿrÚÿÿÿÚÿÿÿÚÿÿÿÚÿÿÿÿÿÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚrÿÿÿÿÿÿÿrÿÿÿÿÿÿÿÿÿÚÿÿÿÚrÿÿÿÿÿÿÿrÚÿÿÿÚÚÿÿÿÚrÿÿÿrÿÿÿÚÿÿÿÚÚÿÿÿÚÿÿÿÿÿrÿÿÿrÿÿÿÿÿÿÿÿÚÿÿÿÚÚÿÿÿÿÿÚÚÿÿÿÚrÿÿÿrÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrÿÿÿÿÿÚÿÿÿÚÚÿÿÿÚÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrÚÿÿÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿÚÿÿÿÚrÿÿÿÿÿÿÿrrÿÿÿrÚÿÿÿÚÿÿÿÚÿÿÿÚÚÿÿÿÚÿÿÿÿÿrÿÿÿrÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrÿÿÿÿÿÚÿÿÿÚÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÚÿÿÿÚrÿÿÿÿÿÿÿrrÿÿÿrÚÿÿÿÚÿÿÿÚÿÿÿÚÚÿÿÿÚrÿÿÿrÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÚÚÿÿÿÚÚÿÿÿÿÿÚÿÿÿÿÿrÿÿÿrÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrÚÿÿÿÿÿÚÚÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrÿÿÿÿÿÚÿÿÿÚÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrÚÿÿÿÚÚÿÿÿÚrÿÿÿrÿÿÿÚÿÿÿÚÚÿÿÿÚÿÿÿÿÿÚÿÿÿÚrÿÿÿrÿÿÿÿÿrÿÿÿrÿÿÿÚÿÿÿÿÿÚÿÿÿÚÿÿÿÚÿÿÿÿÿÿÿÿÿÚÿÿÿÚÿÿÿÿÿrÿÿÿÿÿÿÿrÿÿÿÿÿÿÿÿÿÿÚÿÿÿÚÿÿÿÿÿÚÿÿÿÿÿÚÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrrÿÿÿÿÿÿÿrÚÿÿÿÚÚÿÿÿÚÚÿÿÿÚÚÿÿÿÚrÿÿÿrrÿÿÿrÿÿÿÿÿÿÚÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrrÿÿÿÿÿÿÿrÚÿÿÿÚÚÿÿÿÚÚÿÿÿÚÚÿÿÿÚrÿÿÿrrÿÿÿrÿÿÿÿÿÿÚÿÿÿÚÚÿÿÿÚÿÿÿÿÿÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿrÿÿÿrÿÿÿÿÿÚÿÿÿÿÿÚÿÿÿÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÚÿÿÿÚÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrÿÿÿÿÿrÿÿÿÿÿÿÿrÚÿÿÿÚÿÿÿÿÿÚÿÿÿÚÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrÚÿÿÿÚÚÿÿÿÚrÿÿÿrÿÿÿÚÿÿÿÚÚÿÿÿÚrÿÿÿrÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÚÚÿÿÿÚÿÿÿÿÿÚrÿÿÿrÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrÚÿÿÿÚÚÿÿÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrÚÿÿÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿÚÿÿÿÚrÿÿÿÿÿÿÿrrÿÿÿrÚÿÿÿÚÿÿÿÚÿÿÿÚÚÿÿÿÚrÿÿÿrÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÚÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrÚÿÿÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿÚÿÿÿÚrÿÿÿÿÿÿÿrrÿÿÿrÚÿÿÿÚÿÿÿÚÿÿÿÚÚÿÿÿÚrÿÿÿrÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÚÚÿÿÿÚÚÿÿÿÿÿÚrÿÿÿrÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrÚÿÿÿÚÿÿÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrÚÿÿÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrÚÿÿÿÚÚÿÿÿÚÚÿÿÿÚrÿÿÿrrÿÿÿrÿÿÿÿÿÿÚÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÚÿÿÿÿÿÿÿÿÿrÿÿÿrÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÚÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿrÚÿÿÿÚÿÿÿÿÿrÿÿÿrÿÿÚÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrÿÿÿÿÿÚÿÿÿÚÚÿÿÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿrÿÿÿrrÿÿÿÿÿÿÿrÿÿÿÚÿÿÿÚÚÿÿÿÚÚÿÿÿÚÿÿÿÿÿrÿÿÿrÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿrÿÿÿÿÿÿÿrÿÿÿÿÿÚÿÿÿÚrÿÿÚÿÿÿÚÚÿÿÿÿÿÚÿÿrÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÚrÿÿÿÿÿÿÿrÿÿÿÿÿÿÿÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrrÿÿÿÿÿÿÿrÚÿÿÿÚÚÿÿÿÚÚÿÿÿÚÚÿÿÿÚrÿÿÿrrÿÿÿrÿÿÿÿÿÿÚÿÿÿÚÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚÿÿÿÿÚÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿrrÿÿÿrÿÿÿÿÿrrÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚÚÿÿÿÚÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrrÿÿÿÿÿÿÿrÚÿÿÿÚÚÿÿÿÚrÿÿÿrrÿÿÿrÿÿÿÿÿÿÚÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚÚÿÿÿÿÿÚÿÿÿÚÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrrÿrÿÿÿÿÿÿÿrrÿÿÿÿÿÿÿrÿÿÿÿÚÿÿÿÚÚÿÿÿÚÿÿÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrrÿÿÿÿÿÿÿrÚÿÿÿÚÚÿÿÿÚÚÿÿÿÚrÿÿÿrÚÿÿÿÚÿÿÿrÿÿÿrÚÿÿÿÚÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÿÿÿÚÿÿÿÚÿÿÿÿÚÿÿÿrÿÿÿrÿÿÿÿÿÿÿÿÿÿÚÿÿÿÚÿÿÿÿÿÿÿÿrÿÿÿÿÿÿrÿÿÿrÚÿÿÿÚÿÿÚrÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚrÿÿÿÿÿÿÿrÿÿÿÿÿÿÿÿÿÚÿÿÿÚÚrÿÿÿÿÿÿÿrrÿÿÿrÚÚÿÿÿÚÿÿÿrÿÿÿrÚÿÿÿÚÿÿÿÿÿÿÿÿÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrÚÿÿÚÿÿÿÿÿÚrÿÿÿÿÿÿÿrÿÿrÿÿÿÿÿÿÿÿÿÿÚÿÿÿÚÿÿÿrÿÿÿÿÿÿÿrÿÿÿÚÿÿÚÿÿÿÚÿÿÿÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚrÿÿÿÿÿÿÿrÿÿÿÿÿÿÿÿÿÚÿÿÿÚrÿÿÿÿÿÿÿrÚÿÿÿÚÚÿÿÿÚrÿÿÿrÚÿÿÿÚÿÿÿÿÿÿrÚÿÿÿÚÿÿÚÿÿÿÚÿÿÿÿÿÿÚrÿÿÿrÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÚÿÿÿÚÿÿÿÿÿÿÿÿÚrÿÿÿrÿÿÿrÚÿÿÿÿÿÚÚÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÚrÚÿÿÿÚÿÿrÿÿÿÿÿrÿÿÿrÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrÿÿÿÿÿrÿÚÿÿÿÚrÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÚÚÿÿÿÚrÿÿÿÿÿÿÿrÿÿrÚÿÿÿÿÿÿÿÿÚÿÿÿÚÿrÿÿÿÿÿÿÚÿÿÿÚÿÿÿÿÿÚÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrÚÿÿÿÿÿÿÿÚÿÿÿÚÿÿÿÿÿÿÿÚÿÿÿÿÿÚrÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÚrÿÿÿÿÿÿÿrÚÿÿÿÚÚÿÿÿÚrÿÿÿrÿÿÿÚÿÿÿÚÿÿÿÚÚÿÿÿÚÿÿÿÿÿrrÿÿÿrÿÿÿÿÿÿÿÿÿÿÿÚÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿÿÿÿÚÿÿÚÿÿÿÚÚÿÿÿÿÿÚÿÿÿÿrÿÿÿrÚÿÿÿÚÿÿÿÿÿrÿÿÿÿÿÿrÿÿÿrÿÿrÚÚÿÿÿÚÿÿÿÚÿÿÿÿÿÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚÚrÿrÿÿÿÿÿÿÿrÿÿÿÿÿÿÿÿÿÿÿrÿÚÿÿÿÚrÿÿÿÿÿÿÿrÿÿÚÿÿÿÚÚÿÿÿÚÿÿÚÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚÚÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrrÿÿÿÿÿÿÿÿÚÿÿÿÚÚÿÿÿÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrÚÿÿÿÚÚÿÿÿÚrÿÿÿrÚÿÿÿÚÿÿrÿÿÿrÿÿÚÿÿÿÚÿÿÿÿÿÿÿÿrÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚÿÿÿÿrÿÿÿÚÿÿÿÚÿÿÿÿÿÿÿÿÚÿÿÚÿÿÿÚÚrÿÿÿrÿÿrÿÿrÿÿÿrÿÿÿÚrÿÿÿÿÚÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÿrÚÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrÿÿrÿrÿÿÿÿÿÿÿrÚÚÿÿÿÚÿÿÚÿÿÿÿÚÿÿÿÚÿÿrÿÚÿÿÿÚÿÿÿÿÿÿÿÿÚÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÚrÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÚÿÿrÿÿÿÿÿÿÿrÿÿÿÿÿÿÿÿÚÿÿÿÚrÿÿÿÿÿÿÿrÚÿÿÿÚÚÿÿÿÚÚÿÿÿÚÿÿÿrrÿÿÿrÿÿÿÿÿÿÿÚÿÿÚÚÿÿÿÚÿÿÿÿÿrÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÚÚÿÿÿÚÿÿÿÚÿÿÿÿÿÿÿÿrÿÿÿrÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿÿrÿÿÿÚÿÚÿÿÿÚÿÚÚÿÿÿÚÿrÿÿÿrÿÿÿÿÿrÿÿÿÿÿÿÿÿÚÿÿÿÚÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿÿÿrÿÿÿÿÿÿÿrÿÚÿÿÿÿÿÚÚÿÚÿÿÿÚÿÚÿÿÿrÿÿÿÿÿÿÿÿÿÿÿÿrÿÿrÿÿÿÿÿÿÿrÿÿÿÚÿÚÿÿÿÚÚÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÚÿÿÿÿÿÚÚÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrrÿÿÿÿÿÿÿÚÿÿÿÚÚÿÿÿÚÚÿÿÿÚÚÿÿÿÚÿÿrrÿÿÿrÿÿÿÿÿÿÿÚÚÿÿÿÚÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿrrÿÿÿrÿÿÿÿÿÿÚÿÿÿÿÿÿÿÿÚÿÿÿÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿrÿÿÿÿÿÿÿÿÿÿrÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÚÚÿrÿÿÿrÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÚrÿÿÿÿÿÿÿrÿÚÚÿÿÿÿÿÿÿÚÿÿÿÚÚÿÿrÿÿÿÿÿÿÿÿrÿÿÚÿÿÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿrÿÿÿÿÿÿÿrrÿÿÿÿÿÿÚÿÿÿÚÚÿÿÚÿÿÿÿÿÚÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrrÿÿÿÿÿÿÚÿÿÿÚÚÿÿÿÚÚÿÿÿÚÚÿÿÿÚrÿÿÿrÿÿrÿÿÿÿÿÚÿÿÿÚÿÿÚÿÿÚrÿÿÿrÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrÚÿÿÿÚÿÿÿÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÿÿrÿÿÿÿrÿÿÿÚÿÿÿÿÿÚÚÚÿÿÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÚrÿÿÿrÚÚrÿÿÿÿÿÿÿrÚÿÿÿÿÿÚÿÿÿÚÿÿÚÚÚÿÿÿÚÿÿrÿrÿÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÚÿÚÿÚÿÿÿÿÿÚrÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿrÚÿÿÚÿÿÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿÿrÿÿÿÿÿÿÿrÚÿÿÿÚÚÿÿÿÚÚÿÿÿÚÿÿÿÚrÿÿÿrÿÿrÚÿÿÿÚÿÿÿÿrÿÿÿrÿÿÚÿÿÚÿÿÿÿÿÿÿÿÿÚÿÿÿÚÿÿÿÿÿÿrÿÿÿÿÿÿÿÿÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚÚÿÿÿÿÿÚÿÿÚÿÿÿÚÿÿÿÚÿÿÿÿÿÿÿÿÿÿrÿÿÿrÿÿrÿÿÿÿÿÿÿrÿÿÿÿÚÿÿÚÿÿÿÚÿÚÿÿÿÚÚÿÿÿÿÿÿÿÿÿÿÚÿÚÿÿÿÿÿÿrÿÿÿÿÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÚÿÿrÿÿÿÿÿÿÿrÿÿÿÿÿÿÿÿÿÿÚÿÿÿÚrÿÿÿrÿÿÿÿÿÿÿrÚÿÿÿÚÿÿÿÚÚÿÿÿÚrÿÿÿrÿÚÚÿÿÿÚÿÿÿÿrrÿÿÿrÿÿÚÿÿÿÿÿÿÿÿÿÿÚÚÿÿÿÚÿÿÿÿÿÿrÿÿÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÚÚÿÿÿÿÿÚÚÿÿÿÚÿÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿÿrÿÿÿÿÿÿÿrÿÿÿÚÿÿÿÚÿÿÿÚÚÿÿÿÚÚÿÚÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÿÿrÿÿÿÿÚÿÿÿÿÿÚÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿrÿÿÿÿÿÿÿrrÿÿÿÿÿÿÿÿÚÿÿÿÚÚÿrÿÿÿÿÿÿÿrÚÿÿÿÚÚÿÿÿÚÚÿÿÿÚÿÿrÚrÿÿÿrÿÿÿÿrÿÿÿÿÿÚÿÿÚÿÿÿÚÿÿÿÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÚÚÿÿÿÿÿÚÿÿÚÿÿÚÚÿÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿÿrÿÿÿÿÿÿÿrÿÿÿÿÚÚÿÚÿÿÿÚÿÿÚÚÿÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÿÿÿÚÿÿÿÿÿÚÿÿÚÿÿÿÿÿÿÿÿÿÿÿrÿÿÿÿÿrÿÿÿÿÿÿÿrÚrÿÿÿÿÚÿÿÿÚÚÿÿÿÚslashem-0.0.7E7F3/sys/msdos/tiles/spfx/cleric.bmp0000664000076400007640000034206610545462317017673 0ustar alialiBM6Ä6(@Àÿÿòòòòòòò$U$ª$ÿ$HUHªHÿHmUmªmÿm‘U‘ª‘ÿ‘¶U¶ª¶ÿ¶ÚUÚªÚÿÚÿUÿªÿÿÿ$U$ª$ÿ$$$U$$ª$$ÿ$$H$UH$ªH$ÿH$m$Um$ªm$ÿm$‘$U‘$ª‘$ÿ‘$¶$U¶$ª¶$ÿ¶$Ú$UÚ$ªÚ$ÿÚ$ÿ$Uÿ$ªÿ$ÿÿ$HUHªHÿH$HU$Hª$Hÿ$HHHUHHªHHÿHHmHUmHªmHÿmH‘HU‘Hª‘Hÿ‘H¶HU¶Hª¶Hÿ¶HÚHUÚHªÚHÿÚHÿHUÿHªÿHÿÿHmUmªmÿm$mU$mª$mÿ$mHmUHmªHmÿHmmmUmmªmmÿmm‘mU‘mª‘mÿ‘m¶mU¶mª¶mÿ¶mÚmUÚmªÚmÿÚmÿmUÿmªÿmÿÿm‘U‘ª‘ÿ‘$‘U$‘ª$‘ÿ$‘H‘UH‘ªH‘ÿH‘m‘Um‘ªm‘ÿm‘‘‘U‘‘ª‘‘ÿ‘‘¶‘U¶‘ª¶‘ÿ¶‘Ú‘UÚ‘ªÚ‘ÿÚ‘ÿ‘Uÿ‘ªÿ‘ÿÿ‘¶U¶ª¶ÿ¶$¶U$¶ª$¶ÿ$¶H¶UH¶ªH¶ÿH¶m¶Um¶ªm¶ÿm¶‘¶U‘¶ª‘¶ÿ‘¶¶¶U¶¶ª¶¶ÿ¶¶Ú¶UÚ¶ªÚ¶ÿÚ¶ÿ¶Uÿ¶ªÿ¶ÿÿ¶ÚUÚªÚÿÚ$ÚU$Úª$Úÿ$ÚHÚUHÚªHÚÿHÚmÚUmÚªmÚÿmÚ‘ÚU‘Úª‘Úÿ‘Ú¶ÚU¶Úª¶Úÿ¶ÚÚÚUÚÚªÚÚÿÚÚÿÚUÿÚªÿÚÿÿÚÿUÿªÿÿÿ$ÿU$ÿª$ÿÿ$ÿHÿUHÿªHÿÿHÿmÿUmÿªmÿÿmÿ‘ÿU‘ÿª‘ÿÿ‘ÿ¶ÿU¶ÿª¶ÿÿ¶ÿÚÿUÚÿªÚÿÿÚÿÿÿUÿÿÿÿÿüüüüüÿÿüÿüÿÿüüüüüüüüüüÿÿüÿüÿÿüüüüüüüüüüÿÿüÿüÿÿüüüüüüüüüüÿÿüÿüÿÿüüüüüüüüüüÿÿüÿüÿÿüüüüüüüüüüÿÿüÿüÿÿüüüüüüüüüüÿÿüÿüÿÿüüüüüüüüüüüüüüÿÿüüÿÿüÿÿüÿÿüüÿÿüüüüüüüüüüüüüüÿÿüÿüÿÿüüüüüüüüüüÿÿüÿüÿÿüüüüüüüüüüÿÿüÿüÿÿüüüüüüüüüüÿÿüÿüÿÿüüüüüüüÿüüÿÿÿüüüüÿüüüüÿÿüüÿüÿÿüüüüüüüüüüüüüüÿÿüüÿÿüÿÿüÿÿüüÿÿüüüüüüüüüüüÿüüÿÿÿüüÿüüüüüüüüÿÿüüÿüÿüÿÿÿüüÿÿüüÿüüüüüüüüüüüÿÿüÿüÿÿüüüüüüüüüüÿÿüÿüüÿÿüüüüÿüüüüÿÿÿüüÿüüüüüüüüÿÿüüÿüÿüÿÿÿüüÿÿüüÿüÿüüüüüüüüüüüüüüüüüüÿÿüÿüÿÿüüüüüüüüüüÿÿüÿüÿÿüüüüüüüüüÿüüüüÿÿÿüüÿÿüüÿüÿüüÿÿüüüüüüüÿüüüüüüÿÿÿüüÿÿüüÿüÿüÿÿüüüüüüüüüüüüüüüüüüüüüüÿÿüüÿÿüÿÿüÿÿüüÿÿüüüüüüüüüüüüüüÿÿüÿüÿÿüüüüüüüüüüÿÿüÿüÿÿüüüüüüüüÿüüÿÿÿüüÿüüüüÿüüÿÿÿüüüüüüÿüüÿÿüüüÿüüüüÿÿüüüüüüüüüüüüÿÿüÿüÿÿüüüüüüüüüüÿÿüÿüÿÿüüüüüüüüüüÿÿüÿüÿÿüüüüüüüüüüÿÿüÿüÿÿüüüüüüüüüüÿÿüÿüÿÿüüüüüüüüüÿüüüÿÿÿüüüüüüÿüüüüüüüÿÿüüÿüÿüüÿÿüüÿÿÿüüüüÿüüüüüüüüüüüüüÿÿüüÿÿüÿÿüÿÿüüÿÿüüüüüüüüüüüüüüÿÿüÿüÿÿüüüüüüüüüüüüüüÿÿüüÿÿüÿÿüÿÿüüÿÿüüüüüüüüüüüüüüüüÿüüüÿÿÿüüüüÿüüüüÿÿüüÿüÿÿüüüüüüüÿüüÿÿÿüüüüÿüüüüÿÿüüÿüÿÿüüüüüüüüüüÿÿüÿüÿÿüüüüüüüüüüÿÿüÿüÿÿüüüüüüüüüüÿÿüÿüÿÿüüüüüüüüüüüüüüüÿüüÿüüÿÿÿüüÿÿÿüüüüÿüüÿüüüüüÿÿüüüÿüÿüüÿÿüüÿÿÿüüüüÿüüüüüüüüüüüüüÿÿüüÿÿüÿÿüÿÿüüÿÿüüüüüüüüüüüÿüüÿÿÿüüÿüüüüüüüüüüÿÿüüÿüüüüÿüÿÿÿüüüüÿÿüüÿüÿüÿüüüüüüÿÿÿüüüüüÿüüüüüüüÿÿüÿüÿÿüüüüüüüüüüÿÿüÿüüÿÿüüüüÿüüüüÿÿÿüüÿüüüüüüüüÿÿüüÿüÿüÿÿÿüüÿÿüüÿüÿüüüüüüüüüüüüüüüüüüüüüüüÿÿüÿüÿÿüüüüüüüüüüÿÿüÿüÿÿüüüüüüüüüÿüüüüÿÿÿüüÿÿüüÿüÿüüÿÿüüüüüüüÿüüüüüüÿÿÿüüÿÿüüÿüÿüÿÿüüüüüüüüüüüüüüüüüüüüüüÿÿüüÿÿüÿÿüÿÿüüÿÿüüüüüüüüüüüüüüÿÿüÿüÿÿüüüüüüüüüüÿÿüÿüÿÿüüüüüüüüÿüüÿÿÿüüÿüüüüÿüüÿÿÿüüüüüüÿüüÿÿüüüÿüüüüÿÿüüüüüüüüüüüüÿÿüÿüÿÿüüüüüüüüüüÿÿüÿüÿÿüüüüüüüüüüÿÿüÿüÿÿüüüüüüüüüüÿÿüÿüÿÿüüüüüüüüüüÿÿüÿüÿÿüüüüüüüüüÿüüüÿÿÿüüüüüüÿüüüüüüüÿÿüüÿüÿüüÿÿüüÿÿÿüüüüÿüüüüüüüüüüüüüÿÿüüÿÿüÿÿüÿÿüüÿÿüüüüüüüüüüüüüüÿÿüÿüÿÿüüüüüüüüüüüüüüÿÿüüÿÿüÿÿüÿÿüüÿÿüüüüüüüüüüüüüüüüÿüüüÿÿÿüüüüÿüüüüÿÿüüÿüÿÿüüüüüüüÿüüÿÿÿüüüüÿüüüüÿÿüüÿüÿÿüüüüüüüüüüÿÿüÿüÿÿüüüüüüüüüüÿÿüÿüÿÿüüüüüüüüüüÿÿüÿüÿÿüüüüüüüüüüüüüüüÿüüÿüüÿÿÿüüÿÿÿüüüüÿüüÿüüüüüÿÿüüüÿüÿüüÿÿüüÿÿÿüüüüÿüüüüüüüüüüüüüÿÿüüÿÿüÿÿüÿÿüüÿÿüüüüüüüüüüüÿüüÿÿÿüüÿüüüüüüüüüüÿÿüüÿüüüüÿüÿÿÿüüüüÿÿüüÿüÿüÿüüüüüüÿÿÿüüüüüÿüüüüüüüÿÿüÿüÿÿüüüüüüüüüüÿÿüÿüüÿÿüüüüÿüüüüÿÿÿüüÿüüüüüüüüÿÿüüÿüÿüÿÿÿüüÿÿüüÿüÿüüüüüüüüüüüüüüüüüüüüüüüÿÿüÿüÿÿüüüüüüüüüüÿÿüÿüÿÿüüüüüüüÿüüÿÿÿüüÿüüüüüüÿüüüüÿÿÿüüÿÿüüÿüÿüÿÿüüüüüüüüüüüüüüüüüüüüüüÿÿüüÿÿüÿÿüÿÿüüÿÿüüüüüüüüüüüüüüÿÿüÿüÿÿüüüüüüüüÿüüÿÿÿüüÿüüÿüüÿÿÿüüüüÿüüüüüüüüüüüüüÿÿüÿüÿÿüüüüüüüüüüÿÿüÿüÿÿüüüüüüüüüüÿÿüÿüÿÿüüüüüüüüüÿüüüÿÿÿüüüüÿüüüüüüÿüüÿÿÿüüÿüüüüüüüüüüüÿÿüüÿÿüÿÿüÿÿüüÿÿüüüüüüüüüüüüüüüüÿüüüÿÿÿüüÿüüüüÿüüÿÿÿüüüüÿüüüüÿÿüüÿüÿÿüüüüüüüüüüüüüüÿüüÿÿÿüüÿüüüüÿüüÿÿÿüüÿüüüüüüüüüüÿüüüüÿÿÿüüÿüüüüüüüüüüslashem-0.0.7E7F3/sys/msdos/tiles/spfx/enchant.bmp0000664000076400007640000034206610545462317020052 0ustar alialiBM6Ä6(@ÀÿÿPâò@âq ÂP¡mUmªmÿm‘U‘ª‘ÿ‘¶U¶ª¶ÿ¶ÚUÚªÚÿÚÿUÿªÿÿÿ$U$ª$ÿ$$$U$$ª$$ÿ$$H$UH$ªH$ÿH$m$Um$ªm$ÿm$‘$U‘$ª‘$ÿ‘$¶$U¶$ª¶$ÿ¶$Ú$UÚ$ªÚ$ÿÚ$ÿ$Uÿ$ªÿ$ÿÿ$HUHªHÿH$HU$Hª$Hÿ$HHHUHHªHHÿHHmHUmHªmHÿmH‘HU‘Hª‘Hÿ‘H¶HU¶Hª¶Hÿ¶HÚHUÚHªÚHÿÚHÿHUÿHªÿHÿÿHmUmªmÿm$mU$mª$mÿ$mHmUHmªHmÿHmmmUmmªmmÿmm‘mU‘mª‘mÿ‘m¶mU¶mª¶mÿ¶mÚmUÚmªÚmÿÚmÿmUÿmªÿmÿÿm‘U‘ª‘ÿ‘$‘U$‘ª$‘ÿ$‘H‘UH‘ªH‘ÿH‘m‘Um‘ªm‘ÿm‘‘‘U‘‘ª‘‘ÿ‘‘¶‘U¶‘ª¶‘ÿ¶‘Ú‘UÚ‘ªÚ‘ÿÚ‘ÿ‘Uÿ‘ªÿ‘ÿÿ‘¶U¶ª¶ÿ¶$¶U$¶ª$¶ÿ$¶H¶UH¶ªH¶ÿH¶m¶Um¶ªm¶ÿm¶‘¶U‘¶ª‘¶ÿ‘¶¶¶U¶¶ª¶¶ÿ¶¶Ú¶UÚ¶ªÚ¶ÿÚ¶ÿ¶Uÿ¶ªÿ¶ÿÿ¶ÚUÚªÚÿÚ$ÚU$Úª$Úÿ$ÚHÚUHÚªHÚÿHÚmÚUmÚªmÚÿmÚ‘ÚU‘Úª‘Úÿ‘Ú¶ÚU¶Úª¶Úÿ¶ÚÚÚUÚÚªÚÚÿÚÚÿÚUÿÚªÿÚÿÿÚÿUÿªÿÿÿ$ÿU$ÿª$ÿÿ$ÿHÿUHÿªHÿÿHÿmÿUmÿªmÿÿmÿ‘ÿU‘ÿª‘ÿÿ‘ÿ¶ÿU¶ÿª¶ÿÿ¶ÿÚÿUÚÿªÚÿÿÚÿÿÿUÿÿÿÿÿ                 slashem-0.0.7E7F3/sys/msdos/tiles/spfx/magblast.bmp0000664000076400007640000006607010545462317020222 0ustar alialiBM8l6(``  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÄÄÄþþþÿÿÿÄÄÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÓÓÓþþþÿÿÿÓÓÓÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÞÞÞýýýÿÿÿÞÞÞÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿåååýýýÿÿÿæææÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿêêêýýýÿÿÿíííÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿îîîýýýÿÿÿððð¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇÇÇòòòýýýÿÿÿõõõÇÇÇÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿËËËõõõÿÿÿÿÿÿùùùÍÍÍÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿ÔÔÔöööÿÿÿÿÿÿûûûÕÕÕ¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÃÃÃÕÕÕôôôÿÿÿÿÿÿûûû×××ÃÃÃÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÉÉÉÚÚÚóóóÿÿÿÿÿÿúúúÞÞÞÊÊÊÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿ÌÌÌÜÜÜòòòÿÿÿÿÿÿúúúàààÍÍÍ¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÐÐÐßßßóóóÿÿÿÿÿÿúúúãããÓÓÓÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿ÇÇÇÓÓÓàààõõõÿÿÿÿÿÿúúúçççÔÔÔÈÈÈ¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿ÇÇÇÒÒÒåååõõõÿÿÿÿÿÿúúúêêêØØØÈÈÈ¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿ÆÆÆÎÎÎØØØåååûûûÿÿÿÿÿÿýýýëëëÛÛÛÐÐÐÆÆÆ¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿ÅÅÅÎÎÎÙÙÙìììÿÿÿÿÿÿÿÿÿÿÿÿðððÛÛÛÐÐÐÆÆÆ¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿ÄÄÄÌÌÌ×××àààñññÿÿÿÿÿÿÿÿÿÿÿÿóóóááá×××ÍÍÍÅÅÅ¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿ÄÄÄÌÌÌÙÙÙãããòòòÿÿÿÿÿÿÿÿÿÿÿÿöööåååÙÙÙÍÍÍÅÅÅ¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿ÂÂÂÌÌÌÕÕÕÝÝÝççç÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿéééßßß×××ËËËÃÃÿ¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿ÂÂÂÌÌÌÖÖÖÞÞÞééé÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿþþþîîîâââØØØÌÌÌÃÃÿ¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿ÁÁÁÌÌÌÒÒÒÚÚÚãããîîîúúúÿÿÿÿÿÿÿÿÿÿÿÿþþþòòòæææÝÝÝÔÔÔÌÌÌÁÁÁ¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿ÁÁÁÌÌÌÌÌÌÒÒÒÙÙÙåååòòòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöööçççÝÝÝÕÕÕÌÌÌÌÌÌÀÀÀ¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿ËËËÌÌÌÑÑÑÙÙÙäääíííúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþñññåååÙÙÙÒÒÒÍÍÍÌÌÌ¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿ÁÁÁËËËÐÐÐÙÙÙÛÛÛåååîîîúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóóóçççÜÜÜÙÙÙÑÑÑÌÌÌÁÁÁ¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿ÂÂÂÊÊÊÌÌÌ×××ÚÚÚâââåååòòòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøøìììäääÜÜÜÙÙÙÌÌÌËËË¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿ÂÂÂÉÉÉÌÌÌÑÑÑØØØãããåååðððüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñññåååãããÙÙÙÒÒÒÌÌÌÊÊÊ¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿ÂÂÂÉÉÉÌÌÌÐÐÐØØØÚÚÚåååìììóóóýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöööñññæææÚÚÚØØØÒÒÒÌÌÌÉÉÉ¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿ÂÂÂÉÉÉÌÌÌÏÏÏÙÙÙÚÚÚâââåååóóóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòòòéééäääÜÜÜÙÙÙÑÑÑÌÌÌÉÉÉ¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿ÁÁÁÊÊÊÌÌÌÐÐÐÙÙÙÙÙÙãããæææïïïöööÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþòòòçççãããÚÚÚÙÙÙÑÑÑÌÌÌÊÊÊ¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿¿¿¿ÁÁÁËËËÌÌÌÑÑÑØØØÚÚÚãããåååïïïôôôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöööðððçççåååÚÚÚÙÙÙÒÒÒÌÌÌËËËÁÁÁ¿¿¿¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿ÁÁÁÌÌÌÌÌÌÌÌÌÑÑÑØØØÚÚÚâââæææïïïòòòþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷÷÷òòòçççãããÜÜÜØØØÒÒÒÌÌÌÌÌÌÌÌÌÀÀÀ¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿ÂÂÂÌÌÌÌÌÌÑÑÑÙÙÙÚÚÚÙÙÙååååååïïïôôôþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷÷÷ðððçççäääÚÚÚÙÙÙÙÙÙÑÑÑÍÍÍÌÌÌÁÁÁ¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿ÃÃÃÃÃÃÌÌÌÌÌÌÒÒÒÙÙÙÛÛÛâââåååêêêïïïôôôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöööòòòéééæææãããÜÜÜÙÙÙÒÒÒÌÌÌÌÌÌÃÃÃÃÃÿ¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿ÅÅÅÅÅÅËËËÌÌÌÕÕÕÕÕÕÙÙÙÚÚÚäääåååðððóóóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþòòòñññåååäääÜÜÜÙÙÙÕÕÕÔÔÔÌÌÌËËËÅÅÅÅÅÅ¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿ÀÀÀÇÇÇÇÇÇÎÎÎÍÍÍ×××ÙÙÙÝÝÝÝÝÝäääåååíííïïïòòòýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöööñññìììçççåååÝÝÝÝÝÝØØØ×××ÍÍÍÍÍÍÆÆÆÆÆÆ¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿ÁÁÁÉÉÉÊÊÊÑÑÑÑÑÑØØØÙÙÙàààãããæææèèèðððòòòùùùüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøøøóóóñññçççæææâââßßßÙÙÙ×××ÐÐÐÐÐÐÈÈÈÈÈÈÀÀÀ¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿ÄÄÄÊÊÊÏÏÏÓÓÓÖÖÖÚÚÚÝÝÝÜÜÜâââåååêêêïïïòòòöööûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþöööòòòîîîéééåååáááÛÛÛÛÛÛØØØÔÔÔÓÓÓÍÍÍÊÊÊÃÃÿ¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿ÉÉÉÏÏÏ×××ÚÚÚàààáááæææéééëëëîîîòòòôôô÷÷÷ÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿöööóóóðððëëëêêêçççãããàààÞÞÞ×××ÕÕÕÍÍÍÇÇÇ¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇÇÇÚÚÚæææíííôôôøøøüüüüüüüüüûûûûûûúúúûûûûûûûûûþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýúúúúúúúúúúúúúúúûûûûûûùùùõõõðððíííæææÞÞÞÓÓÓÄÄÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýýýýýýýýýýýýýþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇÇÇÙÙÙäääìììòòòõõõùùùøøø÷÷÷öööõõõôôôöööööö÷÷÷þþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûõõõõõõóóóòòòóóóôôôöööõõõòòòîîîêêêåååÞÞÞÓÓÓÄÄÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿ÈÈÈÎÎÎÕÕÕØØØÝÝÝÞÞÞáááãããçççæææîîîñññôôôùùùøøøúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúúú÷÷÷÷÷÷òòòñññìììååååååàààßßßÜÜÜÚÚÚÕÕÕÔÔÔËËËÇÇÇ¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿ÄÄÄÉÉÉÎÎÎÑÑÑÓÓÓÕÕÕÚÚÚÙÙÙâââäääçççêêêîîîòòòùùùúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúúúúúúòòòîîîéééçççãããàààÙÙÙØØØÒÒÒÓÓÓÐÐÐÌÌÌÉÉÉÃÃÿ¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿ÁÁÁÈÈÈÉÉÉÏÏÏÎÎÎØØØÙÙÙÞÞÞßßßãããåååíííîîîòòòúúúüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýüüüòòòîîîíííåååãããÞÞÞÝÝÝÙÙÙ×××ÎÎÎÎÎÎÇÇÇÇÇÇÀÀÀ¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿ÀÀÀÆÆÆÆÆÆÌÌÌÌÌÌÖÖÖ×××ÚÚÚÚÚÚääääääçççíííòòòúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóóóðððååååååäääÙÙÙÚÚÚÖÖÖÕÕÕÌÌÌÌÌÌÅÅÅÆÆÆ¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿ÄÄÄÄÄÄÌÌÌÌÌÌÓÓÓÓÓÓÙÙÙÚÚÚáááåååëëëòòò÷÷÷üüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöööóóóìììåååâââÛÛÛÙÙÙÒÒÒÒÒÒÌÌÌÌÌÌÄÄÄÄÄÄ¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿ÂÂÂÂÂÂÌÌÌÌÌÌÐÐÐÙÙÙÚÚÚàààååååååíííòòòûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþôôôïïïååååååãããÚÚÚÙÙÙÑÑÑÌÌÌÌÌÌ¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿ÁÁÁÌÌÌÌÌÌÏÏÏØØØØØØÙÙÙáááåååëëëòòòüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþòòòïïïæææâââÚÚÚØØØ×××ÐÐÐÌÌÌÌÌÌÁÁÁ¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿ÀÀÀËËËËËËÌÌÌÑÑÑ×××ÚÚÚàààåååíííòòòûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôôôïïïåååãããÚÚÚØØØÑÑÑÌÌÌËËËËËËÁÁÁ¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿¿¿¿ÁÁÁÊÊÊÌÌÌÐÐÐØØØÙÙÙâââåååëëëòòòüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôôôïïïæææãããÙÙÙÙÙÙÐÐÐÌÌÌÊÊÊÁÁÁ¿¿¿¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿ÂÂÂÉÉÉÌÌÌÎÎÎÙÙÙÙÙÙàààåååííí÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïïïåååâââÚÚÚÙÙÙÏÏÏÌÌÌÉÉÉ¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿ÂÂÂÉÉÉÌÌÌÎÎÎØØØÚÚÚáááåååòòòúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýóóóêêêåååÚÚÚØØØÐÐÐÌÌÌÉÉÉ¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿ÂÂÂÉÉÉÌÌÌÐÐÐ×××ÙÙÙåååëëëòòòüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòòòðððåååÙÙÙØØØÑÑÑÌÌÌÉÉÉ¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿ÂÂÂÉÉÉÌÌÌÑÑÑØØØàààåååíííúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüïïïåååâââÚÚÚÑÑÑÌÌÌÊÊÊ¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿ÂÂÂÊÊÊÌÌÌØØØÚÚÚáááçççòòòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùùùíííäääÛÛÛÙÙÙÌÌÌËËËÁÁÁ¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿ÁÁÁËËËÏÏÏÙÙÙÚÚÚäääîîîúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòòòåååÚÚÚÙÙÙÑÑÑÌÌÌÁÁÁ¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿ËËËÌÌÌÐÐÐÙÙÙäääíííùùùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûðððäääÙÙÙÒÒÒÌÌÌÌÌÌ¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿ÀÀÀÌÌÌÌÌÌÓÓÓÚÚÚåååòòòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöööèèèÝÝÝÕÕÕÌÌÌÌÌÌÁÁÁ¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿ÁÁÁÌÌÌÓÓÓÚÚÚãããîîîúúúÿÿÿÿÿÿÿÿÿÿÿÿþþþòòòæææÝÝÝÕÕÕÌÌÌ¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿ÂÂÂÌÌÌ×××ßßßêêêøøøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïïïãããÙÙÙÌÌÌÃÃÿ¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿ÂÂÂÌÌÌÖÖÖÞÞÞçççùùùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿêêêààà×××ËËËÃÃÿ¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿ÄÄÄÌÌÌÙÙÙäääôôôÿÿÿÿÿÿÿÿÿÿÿÿ÷÷÷åååÙÙÙÍÍÍÅÅÅ¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿ÄÄÄÌÌÌØØØâââñññÿÿÿÿÿÿÿÿÿÿÿÿôôôâââØØØÎÎÎÅÅÅ¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿ÆÆÆÎÎÎÙÙÙîîîÿÿÿÿÿÿÿÿÿÿÿÿòòòÜÜÜÑÑÑÇÇÇ¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿ÆÆÆÏÏÏÚÚÚæææþþþÿÿÿÿÿÿþþþîîîÝÝÝÑÑÑÇÇÇ¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÉÉÉÕÕÕççç÷÷÷ÿÿÿÿÿÿûûûëëëÚÚÚÊÊÊÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿ÈÈÈÓÓÓãããöööÿÿÿÿÿÿûûûéééÖÖÖÉÉÉ¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÁÁÁÑÑÑáááöööÿÿÿÿÿÿûûûæææÓÓÓÁÁÁÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿ÎÎÎÞÞÞôôôÿÿÿÿÿÿúúúáááÏÏÏ¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÉÉÉÝÝÝõõõÿÿÿÿÿÿûûûàààÊÊÊÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÄÄÄØØØöööÿÿÿÿÿÿûûûÚÚÚÄÄÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿ÕÕÕ÷÷÷ÿÿÿÿÿÿüüü××׿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÎÎÎøøøÿÿÿÿÿÿüüüÏÏÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÈÈÈùùùÿÿÿÿÿÿüüüÉÉÉÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿õõõþþþÿÿÿøøø¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòòòþþþÿÿÿôôôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿìììþþþÿÿÿíííÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿäääþþþÿÿÿæææÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÙÙÙþþþÿÿÿÚÚÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇÇÇþþþÿÿÿÇÇÇÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿslashem-0.0.7E7F3/sys/msdos/tiles/spfx/dthfield.bmp0000664000076400007640000002406610545462317020212 0ustar alialiBM6(6(``$ÿÿªÿ$U$ª$ÿ$HUHªHÿHmUmªmÿm‘U‘ª‘ÿ‘¶U¶ª¶ÿ¶ÚUÚªÚÿÚÿUÿªÿÿÿ$U$ª$ÿ$$$U$$ª$$ÿ$$H$UH$ªH$ÿH$m$Um$ªm$ÿm$‘$U‘$ª‘$ÿ‘$¶$U¶$ª¶$ÿ¶$Ú$UÚ$ªÚ$ÿÚ$ÿ$Uÿ$ªÿ$ÿÿ$HUHªHÿH$HU$Hª$Hÿ$HHHUHHªHHÿHHmHUmHªmHÿmH‘HU‘Hª‘Hÿ‘H¶HU¶Hª¶Hÿ¶HÚHUÚHªÚHÿÚHÿHUÿHªÿHÿÿHmUmªmÿm$mU$mª$mÿ$mHmUHmªHmÿHmmmUmmªmmÿmm‘mU‘mª‘mÿ‘m¶mU¶mª¶mÿ¶mÚmUÚmªÚmÿÚmÿmUÿmªÿmÿÿm‘U‘ª‘ÿ‘$‘U$‘ª$‘ÿ$‘H‘UH‘ªH‘ÿH‘m‘Um‘ªm‘ÿm‘‘‘U‘‘ª‘‘ÿ‘‘¶‘U¶‘ª¶‘ÿ¶‘Ú‘UÚ‘ªÚ‘ÿÚ‘ÿ‘Uÿ‘ªÿ‘ÿÿ‘¶U¶ª¶ÿ¶$¶U$¶ª$¶ÿ$¶H¶UH¶ªH¶ÿH¶m¶Um¶ªm¶ÿm¶‘¶U‘¶ª‘¶ÿ‘¶¶¶U¶¶ª¶¶ÿ¶¶Ú¶UÚ¶ªÚ¶ÿÚ¶ÿ¶Uÿ¶ªÿ¶ÿÿ¶ÚUÚªÚÿÚ$ÚU$Úª$Úÿ$ÚHÚUHÚªHÚÿHÚmÚUmÚªmÚÿmÚ‘ÚU‘Úª‘Úÿ‘Ú¶ÚU¶Úª¶Úÿ¶ÚÚÚUÚÚªÚÚÿÚÚÿÚUÿÚªÿÚÿÿÚÿUÿªÿÿÿ$ÿU$ÿª$ÿÿ$ÿHÿUHÿªHÿÿHÿmÿUmÿªmÿÿmÿ‘ÿU‘ÿª‘ÿÿ‘ÿ¶ÿU¶ÿª¶ÿÿ¶ÿÚÿUÚÿªÚÿÿÚÿÿÿUÿÿÿÿÿslashem-0.0.7E7F3/sys/msdos/tiles/spfx/fail.bmp0000664000076400007640000034206610545462317017345 0ustar alialiBM6Ä6(@ÀÿÿP‘aò@0¡q ²@âmUmªmÿm‘U‘ª‘ÿ‘¶U¶ª¶ÿ¶ÚUÚªÚÿÚÿUÿªÿÿÿ$U$ª$ÿ$$$U$$ª$$ÿ$$H$UH$ªH$ÿH$m$Um$ªm$ÿm$‘$U‘$ª‘$ÿ‘$¶$U¶$ª¶$ÿ¶$Ú$UÚ$ªÚ$ÿÚ$ÿ$Uÿ$ªÿ$ÿÿ$HUHªHÿH$HU$Hª$Hÿ$HHHUHHªHHÿHHmHUmHªmHÿmH‘HU‘Hª‘Hÿ‘H¶HU¶Hª¶Hÿ¶HÚHUÚHªÚHÿÚHÿHUÿHªÿHÿÿHmUmªmÿm$mU$mª$mÿ$mHmUHmªHmÿHmmmUmmªmmÿmm‘mU‘mª‘mÿ‘m¶mU¶mª¶mÿ¶mÚmUÚmªÚmÿÚmÿmUÿmªÿmÿÿm‘U‘ª‘ÿ‘$‘U$‘ª$‘ÿ$‘H‘UH‘ªH‘ÿH‘m‘Um‘ªm‘ÿm‘‘‘U‘‘ª‘‘ÿ‘‘¶‘U¶‘ª¶‘ÿ¶‘Ú‘UÚ‘ªÚ‘ÿÚ‘ÿ‘Uÿ‘ªÿ‘ÿÿ‘¶U¶ª¶ÿ¶$¶U$¶ª$¶ÿ$¶H¶UH¶ªH¶ÿH¶m¶Um¶ªm¶ÿm¶‘¶U‘¶ª‘¶ÿ‘¶¶¶U¶¶ª¶¶ÿ¶¶Ú¶UÚ¶ªÚ¶ÿÚ¶ÿ¶Uÿ¶ªÿ¶ÿÿ¶ÚUÚªÚÿÚ$ÚU$Úª$Úÿ$ÚHÚUHÚªHÚÿHÚmÚUmÚªmÚÿmÚ‘ÚU‘Úª‘Úÿ‘Ú¶ÚU¶Úª¶Úÿ¶ÚÚÚUÚÚªÚÚÿÚÚÿÚUÿÚªÿÚÿÿÚÿUÿªÿÿÿ$ÿU$ÿª$ÿÿ$ÿHÿUHÿªHÿÿHÿmÿUmÿªmÿÿmÿ‘ÿU‘ÿª‘ÿÿ‘ÿ¶ÿU¶ÿª¶ÿÿ¶ÿÚÿUÚÿªÚÿÿÚÿÿÿUÿÿÿÿÿ                                                                       ÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈÈslashem-0.0.7E7F3/sys/msdos/tiles/spfx/balllit.bmp0000664000076400007640000002406610545462317020052 0ustar alialiBM6(6(``$ÿÿòòòÒ@ ÿ$U$ª$ÿ$HUHªHÿHmUmªmÿm‘U‘ª‘ÿ‘¶U¶ª¶ÿ¶ÚUÚªÚÿÚÿUÿªÿÿÿ$U$ª$ÿ$$$U$$ª$$ÿ$$H$UH$ªH$ÿH$m$Um$ªm$ÿm$‘$U‘$ª‘$ÿ‘$¶$U¶$ª¶$ÿ¶$Ú$UÚ$ªÚ$ÿÚ$ÿ$Uÿ$ªÿ$ÿÿ$HUHªHÿH$HU$Hª$Hÿ$HHHUHHªHHÿHHmHUmHªmHÿmH‘HU‘Hª‘Hÿ‘H¶HU¶Hª¶Hÿ¶HÚHUÚHªÚHÿÚHÿHUÿHªÿHÿÿHmUmªmÿm$mU$mª$mÿ$mHmUHmªHmÿHmmmUmmªmmÿmm‘mU‘mª‘mÿ‘m¶mU¶mª¶mÿ¶mÚmUÚmªÚmÿÚmÿmUÿmªÿmÿÿm‘U‘ª‘ÿ‘$‘U$‘ª$‘ÿ$‘H‘UH‘ªH‘ÿH‘m‘Um‘ªm‘ÿm‘‘‘U‘‘ª‘‘ÿ‘‘¶‘U¶‘ª¶‘ÿ¶‘Ú‘UÚ‘ªÚ‘ÿÚ‘ÿ‘Uÿ‘ªÿ‘ÿÿ‘¶U¶ª¶ÿ¶$¶U$¶ª$¶ÿ$¶H¶UH¶ªH¶ÿH¶m¶Um¶ªm¶ÿm¶‘¶U‘¶ª‘¶ÿ‘¶¶¶U¶¶ª¶¶ÿ¶¶Ú¶UÚ¶ªÚ¶ÿÚ¶ÿ¶Uÿ¶ªÿ¶ÿÿ¶ÚUÚªÚÿÚ$ÚU$Úª$Úÿ$ÚHÚUHÚªHÚÿHÚmÚUmÚªmÚÿmÚ‘ÚU‘Úª‘Úÿ‘Ú¶ÚU¶Úª¶Úÿ¶ÚÚÚUÚÚªÚÚÿÚÚÿÚUÿÚªÿÚÿÿÚÿUÿªÿÿÿ$ÿU$ÿª$ÿÿ$ÿHÿUHÿªHÿÿHÿmÿUmÿªmÿÿmÿ‘ÿU‘ÿª‘ÿÿ‘ÿ¶ÿU¶ÿª¶ÿÿ¶ÿÚÿUÚÿªÚÿÿÚÿÿÿUÿÿÿÿÿ++ÿ+++++++++++ÿÿÿÿ+ÿÿÿÿÿÿÿÿÿÿ+ÿÿ++ÿÿÿÿÿÿÿÿÿÿÿÿÿ+ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ+ÿÿÿÿ+ÿÿÿÿÿÿÿÿÿ++++ÿÿÿÿ+ÿÿÿÿ++ÿÿÿ+ÿ++++ÿÿ++ÿÿÿ++ÿ++++++ÿ++ÿÿ+ÿÿÿ+ÿ+++ÿ+++++ÿ+ÿÿÿÿÿÿ++++ÿ++++++ÿÿ+ÿÿÿÿ++++ÿÿ+ÿÿÿ+ÿ++ÿÿÿÿ+ÿÿ++ÿÿ++ÿÿ+++ÿÿ++ÿ+++ÿ+ÿ++++ÿÿÿ+ÿÿÿÿ++ÿÿ+++++ÿÿÿ++ÿÿ+ÿ+ÿÿ+ÿ+ÿÿ++ÿ+ÿ++ÿ+ÿ+ÿ++ÿÿÿ+++ÿ+ÿÿÿ++ÿÿÿÿ++ÿ+ÿÿÿ++ÿ+ÿÿÿÿÿ+ÿ+ÿ+ÿÿ+++++ÿ+++ÿ+ÿÿÿÿ++ÿ+ÿ+ÿ++ÿÿ+ÿ++ÿÿÿÿ+ÿÿÿÿÿ+ÿÿÿÿÿ++ÿÿÿÿÿÿÿÿ++ÿÿÿÿÿÿÿÿÿÿÿÿ++++ÿÿÿÿÿÿÿÿÿÿÿÿ+++++ÿÿÿÿÿÿÿÿÿ+++ÿ+ÿÿÿÿ+ÿ+ÿÿ++ÿÿ++ÿÿ++ÿÿÿÿ+ÿ+ÿÿÿ++ÿÿ+ÿÿÿ+ÿÿÿÿÿ+ÿÿÿ+ÿÿÿÿ++ÿÿÿ+++ÿ+ÿÿÿ+++++++ÿ+ÿ+ÿÿ++++++ÿ+ÿ+ÿÿ+++ÿ+ÿÿÿÿÿ+ÿ+ÿÿÿ+ÿÿÿÿÿÿÿ++ÿÿÿÿÿÿÿÿÿÿÿ++ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ+ÿÿÿÿÿÿ+ÿÿ+slashem-0.0.7E7F3/sys/msdos/tiles/spfx/heal.bmp0000664000076400007640000034206610545462317017343 0ustar alialiBM6Ä6(@ÀÿÿòÂÿ$U$ª$ÿ$HUHªHÿHmUmªmÿm‘U‘ª‘ÿ‘¶U¶ª¶ÿ¶ÚUÚªÚÿÚÿUÿªÿÿÿ$U$ª$ÿ$$$U$$ª$$ÿ$$H$UH$ªH$ÿH$m$Um$ªm$ÿm$‘$U‘$ª‘$ÿ‘$¶$U¶$ª¶$ÿ¶$Ú$UÚ$ªÚ$ÿÚ$ÿ$Uÿ$ªÿ$ÿÿ$HUHªHÿH$HU$Hª$Hÿ$HHHUHHªHHÿHHmHUmHªmHÿmH‘HU‘Hª‘Hÿ‘H¶HU¶Hª¶Hÿ¶HÚHUÚHªÚHÿÚHÿHUÿHªÿHÿÿHmUmªmÿm$mU$mª$mÿ$mHmUHmªHmÿHmmmUmmªmmÿmm‘mU‘mª‘mÿ‘m¶mU¶mª¶mÿ¶mÚmUÚmªÚmÿÚmÿmUÿmªÿmÿÿm‘U‘ª‘ÿ‘$‘U$‘ª$‘ÿ$‘H‘UH‘ªH‘ÿH‘m‘Um‘ªm‘ÿm‘‘‘U‘‘ª‘‘ÿ‘‘¶‘U¶‘ª¶‘ÿ¶‘Ú‘UÚ‘ªÚ‘ÿÚ‘ÿ‘Uÿ‘ªÿ‘ÿÿ‘¶U¶ª¶ÿ¶$¶U$¶ª$¶ÿ$¶H¶UH¶ªH¶ÿH¶m¶Um¶ªm¶ÿm¶‘¶U‘¶ª‘¶ÿ‘¶¶¶U¶¶ª¶¶ÿ¶¶Ú¶UÚ¶ªÚ¶ÿÚ¶ÿ¶Uÿ¶ªÿ¶ÿÿ¶ÚUÚªÚÿÚ$ÚU$Úª$Úÿ$ÚHÚUHÚªHÚÿHÚmÚUmÚªmÚÿmÚ‘ÚU‘Úª‘Úÿ‘Ú¶ÚU¶Úª¶Úÿ¶ÚÚÚUÚÚªÚÚÿÚÚÿÚUÿÚªÿÚÿÿÚÿUÿªÿÿÿ$ÿU$ÿª$ÿÿ$ÿHÿUHÿªHÿÿHÿmÿUmÿªmÿÿmÿ‘ÿU‘ÿª‘ÿÿ‘ÿ¶ÿU¶ÿª¶ÿÿ¶ÿÚÿUÚÿªÚÿÿÚÿÿÿUÿÿÿÿÿàààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààslashem-0.0.7E7F3/sys/msdos/tiles/spfx/poisball.bmp0000664000076400007640000002406610545462317020234 0ustar alialiBM6(6(``$ÿÿ ¡ @Â@aâaqòqU$ª$ÿ$HUHªHÿHmUmªmÿm‘U‘ª‘ÿ‘¶U¶ª¶ÿ¶ÚUÚªÚÿÚÿUÿªÿÿÿ$U$ª$ÿ$$$U$$ª$$ÿ$$H$UH$ªH$ÿH$m$Um$ªm$ÿm$‘$U‘$ª‘$ÿ‘$¶$U¶$ª¶$ÿ¶$Ú$UÚ$ªÚ$ÿÚ$ÿ$Uÿ$ªÿ$ÿÿ$HUHªHÿH$HU$Hª$Hÿ$HHHUHHªHHÿHHmHUmHªmHÿmH‘HU‘Hª‘Hÿ‘H¶HU¶Hª¶Hÿ¶HÚHUÚHªÚHÿÚHÿHUÿHªÿHÿÿHmUmªmÿm$mU$mª$mÿ$mHmUHmªHmÿHmmmUmmªmmÿmm‘mU‘mª‘mÿ‘m¶mU¶mª¶mÿ¶mÚmUÚmªÚmÿÚmÿmUÿmªÿmÿÿm‘U‘ª‘ÿ‘$‘U$‘ª$‘ÿ$‘H‘UH‘ªH‘ÿH‘m‘Um‘ªm‘ÿm‘‘‘U‘‘ª‘‘ÿ‘‘¶‘U¶‘ª¶‘ÿ¶‘Ú‘UÚ‘ªÚ‘ÿÚ‘ÿ‘Uÿ‘ªÿ‘ÿÿ‘¶U¶ª¶ÿ¶$¶U$¶ª$¶ÿ$¶H¶UH¶ªH¶ÿH¶m¶Um¶ªm¶ÿm¶‘¶U‘¶ª‘¶ÿ‘¶¶¶U¶¶ª¶¶ÿ¶¶Ú¶UÚ¶ªÚ¶ÿÚ¶ÿ¶Uÿ¶ªÿ¶ÿÿ¶ÚUÚªÚÿÚ$ÚU$Úª$Úÿ$ÚHÚUHÚªHÚÿHÚmÚUmÚªmÚÿmÚ‘ÚU‘Úª‘Úÿ‘Ú¶ÚU¶Úª¶Úÿ¶ÚÚÚUÚÚªÚÚÿÚÚÿÚUÿÚªÿÚÿÿÚÿUÿªÿÿÿ$ÿU$ÿª$ÿÿ$ÿHÿUHÿªHÿÿHÿmÿUmÿªmÿÿmÿ‘ÿU‘ÿª‘ÿÿ‘ÿ¶ÿU¶ÿª¶ÿÿ¶ÿÚÿUÚÿªÚÿÿÚÿÿÿUÿÿÿÿÿ}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}slashem-0.0.7E7F3/sys/msdos/tiles/spfx/sleepexp.bmp0000664000076400007640000002406610545462317020254 0ustar alialiBM6(6(``$ÿÿòòòòâòòÒòò²òòÂòò¡òÂ0qòqâaaaò@Âò‘òòqòâ@ òòòPÒÒ@â@‘ò@¡PPP²0qòqÂ@@@000¡0aò@‘òâò@²òaâqqqÒ@‘òPÂòqÒ@PÂ@q@PqPa‘0a‘0P¡@qÒ@q²@qaPP²0aaPaâ@¡@P@qaaa@Pâ‘ò‘@q¡0P²0PÂ@òò¡â¡Pqâ¡òPaPaqÒaòÂ0aâqòòÒP@@ÒqòòP²òP¡òq²òPâ‘Pq@a@PP 00q@a‘@a@q0 0P@Pa0@Ò@aò@òPaâPòâ@²0P@PP@qqq @q0@‘a ÒòÒ@ò@00‘aq0@0 @ò@qòaò²Pqq0P0 P0@PP 0 âaòâa¡@aP@ âP²ò@P @qq‘‘Pqa 0Pq ‘qâP‘q00a òPò¡@P0q@0 P ‘Paaa@P0 â@qH‘UH‘ªH‘ÿH‘m‘Um‘ªm‘ÿm‘‘‘U‘‘ª‘‘ÿ‘‘¶‘U¶‘ª¶‘ÿ¶‘Ú‘UÚ‘ªÚ‘ÿÚ‘ÿ‘Uÿ‘ªÿ‘ÿÿ‘¶U¶ª¶ÿ¶$¶U$¶ª$¶ÿ$¶H¶UH¶ªH¶ÿH¶m¶Um¶ªm¶ÿm¶‘¶U‘¶ª‘¶ÿ‘¶¶¶U¶¶ª¶¶ÿ¶¶Ú¶UÚ¶ªÚ¶ÿÚ¶ÿ¶Uÿ¶ªÿ¶ÿÿ¶ÚUÚªÚÿÚ$ÚU$Úª$Úÿ$ÚHÚUHÚªHÚÿHÚmÚUmÚªmÚÿmÚ‘ÚU‘Úª‘Úÿ‘Ú¶ÚU¶Úª¶Úÿ¶ÚÚÚUÚÚªÚÚÿÚÚÿÚUÿÚªÿÚÿÿÚÿUÿªÿÿÿ$ÿU$ÿª$ÿÿ$ÿHÿUHÿªHÿÿHÿmÿUmÿªmÿÿmÿ‘ÿU‘ÿª‘ÿÿ‘ÿ¶ÿU¶ÿª¶ÿÿ¶ÿÚÿUÚÿªÚÿÿÚÿÿÿUÿÿÿÿÿ< I%   JJ'*,* =HT:Hh ***\\,*Hh g&H:$I,++:=%*T k:H< glI%,D,$= 11h«,*  k%  =&,+%I' 1'00%H =] :,yK':,+,,,$&= l:\:M*%,%Hg:,\  && :**,*,M' +‹,** K\[   *=K =$M,!:'3*DM,««*,i<  :fj=%T*‹‹!«I&M,«,«D,'T,«.$=\k JYRO=T,,**%f*MM*,**‹,$I,,QhH*%O&*,+T&BX[D‹,*lM*lMD* '"‹,Y<=I*= *,+Iw[R‹¯¯D[[««"«) RG«+6= k=IT  TD)l=%+" #"«D"6+‹«D«+l+‹¯0,&   k=\$'Y &D‹RR‹««óóóGe"+«DI«ï6' v  ''\*lI*&)+‹D‹« ó«R.oëê") eêêD+[ K J   I*%**M[6E"A óëóó>>óóAëëó[)G nêï0'  hghO' u *+,,+"##ïóC>>óó""Uïó "[« ee«$' ==  ' Y' $M,+Aê^ó ó ¯. eê«I$' Y''   u **D‹oó÷÷÷"ëê÷óM3'*$'B  'g  '*'*+¯ó÷÷÷÷‹ ó^CïDR$'M,$ &y &$M.A óûû÷ûû‹÷>óR$I%‹' h  =\ 'I‹‹+[[‹o ÷÷ûû÷ûûóDó,*‹"*&  h y+sD6)«#÷ûûûóóó>C "D«D%y    ‹"D÷÷÷ûûûûûûû ÷Ue#"!‹' XI‹ ó #"óûûûûÿÿû÷ó #A«.+[& h=T*€‹#ë>÷ûÿÿûÿÿÿû>C 0'  ~6,M+D  óï÷ûûûûÿÿÿÿÿÿ÷÷ó"#DTB 3I00 #óó÷ûûûÿÿÿÿÿÿû÷ó#e"0&    .+"G0‹  Aûûÿÿûûÿÿÿÿûûûû÷  D%y'‹«"  ûûûÿÿûû «%j :"eG ûûûûûûÿÿÿÿÿÿÿÿA óê@U cQb ] ]ó " ûÿÿÿÿÿÿÿÿÿÿÿÿÿûûDoó@>ó>e e«lb y'XB,Dóûûÿÿÿÿÿÿÿÿÿÿÿÿûó>>óê"DD& \,,*) ûÿÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûó# CCêe#"= &+D ó ó÷÷ûûûÿÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûóóïïnïë«‹: =%!o# óûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûóe nU:X  l«6Gó÷ûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûD.: h:«!Ge÷÷ûÿÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿû G‹'  H,0«« óûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûû  ""D+*' ]'*,!0«e0¯ûÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿÿÿÿÿÿûûûû#o‹+)$  '*!"ó«D"Aûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûû"D06)&  *DD" «oo"eûÿÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûD),*MI' M‹"""0oA  ûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ 0+%,M' 3I*""D"Aó ûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿó D‹D‹DD,M 'I%‹0 óÿÿÿÿÿÿÿÿÿÿÿÿÿûó¯¯"D,H 'H::,o ó÷ûÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûÿÿ D0 ó ‹*&] B: ÷óûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿó#¯D«óï ":   JX["÷ûûÿÿÿÿÿÿÿÿÿÿûûÿÿÿÿÿÿÿûûÿÿÿADo Cë "j   $.« ó÷ûûûÿÿÿÿÿÿûÿÿÿÿÿÿÿÿÿÿÿÿÿ"¯# óG~    )óûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûA¯óóóG:u h  [+« ÷÷ûûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿAóeDIJ  gH BO+‹#÷÷ûÿÿÿÿÿÿÿÿÿÿÿÿÿÿ" ó «sk v%=j+‹««A÷ûÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ # ó ó"‹.l H\&%‹‹D# ûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿû ## ei3  ] HD"ÿÿÿÿÿÿÿÿÿÿÿÿÿû",I ] ')+‹‹"óûûÿÿÿÿÿÿÿÿÿÿÿAûûÿÿ ïê«**I' :+%oo#÷û÷ÿÿÿÿÿÿÿÿÿóûÿû÷C«,M  \,%oo¯ ÷ÿûÿÿÿÿÿÿÿÿûóó"#"+IJ  B&:‹D ÷ûûûûÿÿÿÿÿÿÿûûû÷û÷óêó «G«6= QD‹ ÷ûÿÿÿÿûûû÷÷óóóe«0D,i*  qD‹ó ÷ûûûÿÿÿÿ# ó ‹‹[M]:«  A÷ûÿÿÿÿÿû o óó«‹+'J M6+« A# ÿûA0o# +: ]  'IM#A#óÿ  "«  o: g= 'l,¯##óÿÿÿ ûûûûûû «0«R+*  ='l&&*óÿÿÿûûûûó+6,D66*M   3IR >U÷ÿÿÿûûûûó+D,%,y  K T.óC÷Cn÷ûÿÿûûû÷û÷#o+«D«««**:3K Hóêó>ûû÷óû÷÷ ÷"«G"*: &6Deó ÷÷ÿÿ÷ó#ûû÷  ó#"%$   'I‹Dó÷êóûûûû# ûû>^ óeA#«%I  O  =:+‹"‹« ó^óïC÷ûûA÷^ó "«# D&  \  [++#êê÷e>û ¯A÷ûûûû"¯E«+[h]   'Xl"Uêêêóó ."óû«oDDDDDDD) K    ëê>^C^.«ï÷óGDR++RRf   o#ëë#óCóA)"ó÷÷÷÷óe««"""6['T[ITlllTyKh $6¯«"D"ó#oc.sD÷ó"‹‹‹6 u<'&wWãDYð7Q÷77ç77ç7oÿ77·77çÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ7O÷77ç7?ê7bö9eì9kà6qÔ2qÎ0xÔ.Šà™NÛPà %¼Ê7·ÿ7·ÿ7·ÿ7·ÿ7·ÿ2”ö ZÇ hÑ)—è]ùÿwæÿ{êÿqæÿjâÿ{êÿ•÷ÿ“úÿŸëÿ£èÿ’÷ÿøÿ¦ïÿ­ìÿ’ðÿyéÿ‰ñÿ‘ùÿšúÿ¸üÿ­íÿ¼õÿÌÿÿÃúÿÉúÿªùÿ€òÿxåÿ‰ÝÿxãÿdÞÿdÖÿmÞÿråÿrçÿoäÿnäÿwèÿTóÿ[ôÿ…ðÿ7·ÿ7·ÿ7·ÿ1¬þ‡ù Vë@á2Ô +Â*© - *U°2ˆÎ9xË:N°NLÌXKæ7oÿ77ç77ç7O÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ7O÷7O÷8Dëiß=cÊ6X·,K¬#=£0£ )Ápðdñ1êæ!eô7·ÿ7·ÿŸãÿ7·ÿ8’ú%gÐ%vÙ-žëƒçÿoæÿxìÿïÿvèÿtçÿ“öÿ“úÿžìÿ£éÿ–ùÿøÿ«ïÿ¯óÿùÿ|ëÿ‰óÿ“óÿªôÿÕÿÿ»ñÿ½õÿÉÿÿ¿÷ÿÄøÿ¦úÿ€óÿ~èÿ˜æÿ‡ëÿ~óÿ„õÿðÿsçÿkâÿvéÿ€ìÿpÝÿtÒÿcÍÿSÒÿgÚÿ7·ÿ†ãþ7·ÿ7·ÿ2¶þ¬ÿVö6æ1½@ÂTÆY¾2C“3A¼P9ÎVHÛ7oÿ77ç7O÷7O÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ77·7O÷:Gé@cåBdÑ>Y»2J¯#@²<Á<Üdòšÿ{ÿDï5ö!lÿH¬ÿ4ºþ7·ÿ7«ÿ<”ü'lÔ(uØ-äOÃõ|ëÿ–ôÿŸûÿ†ðÿyêÿ“öÿ’ùÿŸìÿ¡èÿŽõÿöÿºþÿ·üÿ‰óÿ–øÿ’úÿ˜ìÿ¯çÿÃúÿÅÿÿÍÿÿ¾öÿáÿ áÿšíÿ•øÿ–ùÿ’ùÿ—öÿšõÿš÷ÿ–øÿ}ìÿoåÿ…ñÿ•õÿsÕÿ[¿þ?¶ÿ6´ÿM´þ;·þ7·ÿ)¯ÿÿ-°ÿ+¤þ’ÿ[ò Lß YãhçkæIÇ35È["ÂPá7oÿ77ç7O÷77·ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ7O÷8Fç=bß=bÈ6Sµ(F²D OÝf÷xý~ÿvÿsüdý#qÿ#›ÿI·þ.¬ÿ9¥ÿB›ý.}ß.€Þ5œéUÉö•ôÿ¢éÿ›ñÿ÷ÿõÿ“öÿ‘ùÿ£íÿ™ãÿwìÿöÿ¢ûÿŠðÿtèÿ÷ÿ‘üÿšðÿ¨ãÿ¥çÿ’òÿ¸ÿÿÇùÿâÿŸãÿ¤äÿðÿúÿ÷ÿšëÿ£âÿœëÿ’øÿŽ÷ÿŒöÿ’øÿ‘õÿsæÿgÑþmÓÿhÎÿO¥þ4­þ)¸ÿ/±ÿ2¨ÿ+¯ÿ/«þ4¯ÿ vø `înírëzôaêVã?Æ2V¾7oÿ77ç7O÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ77·7Bè7hã4gÇ,T³FµJÌ eë–þ”ÿ‡þ4¥ÿ “ÿ%rÿ1iþ2—þfÓþ\ÙÿE¬ÿU´ÿ;–ì5ä?©î_Ñøšöÿ¨ãÿœîÿ‘ûÿ“úÿ‘ùÿ–úÿ øÿ‹åÿhÒÿtäÿŠõÿ‹õÿ†îÿœíÿ›ëÿ—äÿ§æÿ½öÿ³üÿ«òÿ±íÿ¼öÿÃúÿ®éÿ–àÿœíÿ²úÿ¿ùÿÈ÷ÿ¹ôÿíÿŸîÿ¤íÿšñÿŠöÿ‹÷ÿtâÿ?—ý%eü<€ÿF®ÿW´þ:Àÿ ðÿ[Þÿ.èÿ×þ‰ûtörï{ï}øqøeóLÙ!_Ä7oÿ77ç77·ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ77·7:è7oòM½KÏ_éiò„û"¤ÿ(¤þ6­ÿRÁÿ.•ÿnÿ tÿG­ÿtéÿ~òÿhÕÿoÚÿgØþN±ñE¨íWÃôyãûžìÿ™ôÿ–÷ÿ›ðÿ›ðÿŠïÿŒùÿƒìÿhÐÿrãÿ‰ôÿ—ýÿ™÷ÿ¢äÿ¯çÿ´îÿ¶òÿÀøÿÓÿÿ¼óÿ´ñÿÐÿÿÇýÿ¶òÿ¬êÿºðÿÓÿÿÈüÿÁúÿ¹óÿ¤âÿ£áÿ¦àÿ¨ëÿ¥ûÿ¢ÿÿoÜÿ„þ@ùBôA˜ûHÔÿ%ãÿôÿZÛÿJôÿöÿ™ýˆúrïƒò}ûtýhø NÞ fÎ7oÿ77ç77·ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ77·77ç7oÿR½ OÔ o÷ zþŠÿ‰ÿ&¢ÿ3½ÿ0°ÿ>”ÿ xÿÿEÇÿpåÿqçÿ‡ðÿŽôÿuèÿxßû^ÈöU¾óiÔø†íýøÿšîÿªäÿ¥æÿzäÿ„ñÿôÿuéÿõÿ˜÷ÿ“öÿ—óÿ£çÿÂøÿÓÿÿ¿øÿ¥çÿÀøÿÍÿÿÌÿÿÆüÿ¤æÿ¹ôÿÒÿÿÌÿÿÉþÿ¯íÿ äÿ¥çÿ§èÿ§èÿ äÿ¶ïÿÊÿÿ¡ýÿkÓþEÅÿ( ú6ç(~÷òÿùÿUµÿ2­ÿbÎÿRýÿÀÿ ý•û›þ€ÿvÿ]ó @Æ2žè7oÿ77ç77·ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ77·77ç7O÷SØ_ç‡û’þ™þ(¦ÿ% ÿ$Ÿÿ1¶ÿ7±ÿ‰ÿ‘ÿ^Íÿuêÿuêÿtçÿ‚îÿŒóÿxéÿ€èý`ÊömÙù„ìýŠóþ‡êÿ«æÿ˜òÿ„óÿ­üÿ»þÿŠôÿ‘øÿ™íÿœäÿ¦ìÿ¾øÿÏÿÿºôÿ©éÿÀùÿÍÿÿ´ñÿ±îÿÈþÿ¥çÿ¼öÿ×ÿÿÄûÿ­ìÿ¼öÿÉþÿÄûÿÂùÿÅüÿ¬ëÿ±ìÿÉÿÿœùÿ‹ðþ|ëÿPÍý“ù-†ýYÐÿYíÿ;³ÿkÒÿ4ûÿ,ÿÿ8æÿØþ¾ÿ%§þ‹ÿ wýSè .´/šì7Xø77ç77·ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ77·77ç7O÷7¶ÿÔ @ð$ÿ(¨þ;Ãþ—ÿ Šÿ8¿ÿ8Ãÿ&ªÿ)¥ÿH¾ÿ[Éÿoàÿnæÿzêÿ˜ùÿ€ðÿŠôÿyâûxäüëý‰óÿ‰ñÿšóÿúÿ—óÿ¶ðÿ¶õÿ•ùÿŽ÷ÿ±øÿ¶êÿ¥äÿÊÿÿÑÿÿ¼öÿ¶òÿÎÿÿÏÿÿºôÿ¹ôÿÈýÿ¨éÿ©êÿÄûÿÄûÿ¡äÿ­ìÿ¶òÿ¼öÿÎÿÿÕÿÿ­ìÿ­êÿÌÿÿ™úÿ•üÿ›ýþ€ñÿZáÿZ·ÿ_·þHÄÿ0ºÿ\Ñÿ&ßÿ#Óÿ\Ìÿæÿ,Êþ)Ôÿ»ü‚ùRí0Í+“î7[÷77ç77·ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ77·7O÷7£ÿ&ÌFã#‹ÿ*ªÿ.²ÿƒÿ€ÿ+°ÿ#¦ÿ6¶ÿ9»ÿ7µÿTÁÿmÞÿréÿ{ëÿ•÷ÿõÿ˜õÿòþ‰ðþ‰ðþ“óÿ–ôÿ”õÿ•òÿ¤çÿ§ßÿ›èÿ’øÿ‹öÿ²ûÿÀôÿ¯îÿÇýÿËÿÿÌÿÿÏÿÿËÿÿÉþÿÍÿÿÐÿÿÆüÿ«éÿ˜Þÿ´ðÿÉþÿ¥çÿ¤æÿ¦èÿ³ðÿÌÿÿÎÿÿ¸óÿ´ïÿ½ùÿóÿ‘ôÿ˜ùÿ“÷ÿ|îÿ{åÿTÆÿ)ªÿ%§ÿ¤ÿ0©ÿ5¯ÿ'¬ÿ/ ÿ2›ÿáÿÏü{õDë.Ù(ñ7`ø77·ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ77·7Q÷7|ÿYÙXܘÿ•ÿÿ&tÿ*rÿŽÿzÿ3¥ÿYÁÿVÄÿqåÿtéÿnåÿ{ìÿ•öÿ¤èÿœîÿúÿ–õÿ¢èÿ¥åÿ¤æÿ¤çÿ£æÿ¤æÿ§äÿ ëÿ’÷ÿùÿ˜éÿµíÿÍÿÿÊÿÿÊÿÿÉþÿÊÿÿÊÿÿÊÿÿÉþÿÌÿÿÆüÿªêÿœáÿ·óÿÇýÿ¤æÿ»õÿÎÿÿÊÿÿÊÿÿÊÿÿÎÿÿ½÷ÿ¢åÿ¥åÿ™ñÿ”úÿóÿsçÿréÿxáÿQ·ÿˆÿ†ÿ&¥ÿ7¾ÿ-¯ÿÿ‰ÿœÿ ¡ýcô4ä0×)ó7\ø77·ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ77·7Mô7€ÿ- ûpí¡ÿ,­þ0²þ—ÿsÿ$lþsþ©ÿ\ÐÿqÍÿbËÿnàÿmæÿwéÿ•÷ÿšòÿ—óÿ‘ùÿ•ôÿ¡æÿ½óÿ²îÿ¤äÿÀöÿ¡öÿ’òÿ–óÿ›úÿ¹ÿÿ¿ùÿÂøÿÍÿÿÉþÿÍÿÿÔÿÿÅüÿªêÿÁùÿÍÿÿÍÿÿÅýÿ–ôÿ™çÿ©ãÿ­íÿ¼öÿÒÿÿÂúÿ¥çÿªêÿÆüÿÁúÿ©èÿ¤âÿ©áÿ™ñÿûÿ“öÿ‹òÿtéÿqæÿnÚÿQµÿ-pÿqÿ!«þ4¾ÿ8˜ÿ%•ÿ™ÿ‰üPó,Ü@×/xö7Uø77·ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ77·7>ë7}þ1§ü~ö#¦ÿ.°ÿ0´ÿx÷^ö*}ÿpÿ|þE²ÿRÍÿ6­ÿ_Ôÿðÿˆñÿ”÷ÿ’ùÿ‘ùÿúÿ”õÿ¡äÿÆùÿÆýÿ¸óÿÏÿÿ¨õÿõÿˆöÿ„íÿ°ïÿÑÿÿÒÿÿÉþÿËÿÿ¼õÿ³ðÿ³ðÿ¯îÿÃúÿÌÿÿÍÿÿËÿÿ³ÿÿ›õÿŸëÿ¼ôÿÒÿÿÁùÿ¯íÿ­ìÿ°îÿÎÿÿµïÿ’àÿ˜îÿœíÿŸìÿ˜ñÿ”øÿ™ùÿŒóÿ{ïÿråþiÌÿB›ÿ$—þ(§ÿ3–ÿ)wÿký zÿtüMñ-ØXß4sú7Aí77·ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ77·7;é7qû4ªý †ø$ ý'¤þþ@ì8è‡ÿ+rÿ(\ÿ#zÿ+¯ÿ5ºÿ_ÛÿŽöÿœûÿ“öÿ“÷ÿ•õÿ–ôÿ˜òÿèÿ½öÿÒÿÿÏÿÿÊÿÿ²èÿœíÿ…õÿuæÿšåÿ»òÿÉþÿËÿÿÌÿÿ±ïÿâÿ¯îÿÎÿÿÍÿÿÊÿÿÇýÿÃúÿÎüÿ¡÷ÿ¡øÿÎþÿÅüÿ©éÿ¶òÿÕÿÿÎÿÿÈýÿ¶ïÿ£îÿ™ûÿ‘ûÿŸëÿ ëÿ’ùÿ”÷ÿ—øÿ‡ôÿgÛÿL¹þ.¬þ'²ÿ-üKõ<ô.éAìOðKì;ÞSÞ/iô7=é77·ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ77·79æ7\ö5§þ%ùŒúŽü‡øPî çOý~þÿcÿ>ÿkßÿríÿ‡òÿ›úÿ“öÿ‘øÿœîÿ§äÿ¢èÿ’òÿ¹þÿÕÿÿÍÿÿÊÿÿ°êÿ˜ìÿøÿ“õÿÀýÿ²ìÿ®íÿÍÿÿÊÿÿÆýÿÄûÿÆüÿÊÿÿÌÿÿÐÿÿ½÷ÿ£åÿ¨èÿ¤éÿ¥èÿªèÿ§èÿ»öÿÍÿÿÐÿÿÌÿÿ©éÿµñÿÑÿÿÂÿÿœùÿ‘õÿ–õÿ—ùÿ—øÿìÿvìÿpåÿOºþaûJÿEí%Ê%ÍÅ"É+Ï1Ó4ÑGÔ)`é6Bê77·ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ77º7Nð5šþ*”úoötø YñDîWùlýŸþªÿ“ÿ=ÿfÏÿ`ÍÿgÙÿ…òÿ”÷ÿ’ùÿ ëÿ¥æÿ•óÿˆ÷ÿ¥óÿ²ëÿµñÿÏÿÿ¶êÿ–ëÿ‹üÿ˜ûÿÊÿÿÊüÿ¿øÿËÿÿÉþÿÌÿÿÍÿÿÏÿÿÏÿÿ±îÿºôÿÌÿÿ»õÿ¥çÿ ßÿšèÿ”ðÿäÿËûÿËýÿ­íÿ³ðÿ½öÿ¶óÿ¶íÿ´îþ…îþŽýÿ‘üÿ}îþíþuêÿkÞÿZÂÿAžþ(jÿ@ÿÓžµ±"´%¸(½ -¿DÇ)^à6DÇÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ77·7=è7~û-’û^ð[ñ_õKö8†ÿ1®ÿ;¸þD½þ6½ÿ-ºÿ@´ÿAªÿaÍÿŠöÿ”÷ÿ’ùÿ¡ëÿ æÿ•ôÿ¨üÿ¢êÿ£ãÿµðÿ¾õÿ¦ïÿ˜îÿ˜ïÿðÿ·óÿÂ÷ÿÅüÿÊÿÿÊÿÿÊÿÿËÿÿÇýÿ¼öÿ«ëÿ»õÿÍÿÿ¿øÿ§èÿ®êÿ¦òÿ’ïÿŸäÿ´øÿ¯òÿœÝÿ¡âÿ½öÿ¿õÿ©ëÿ‘èÿmÛÿ{Üü}ÜügÛÿnåþ{ñÿ^Öÿ6þ/vÿ)nÿBëÁ·/Ò/È.Ä . /Á7ÂRÍ-bã6CÇÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ77·7=ç7dö.‰ù^éFæjûtÿ@‰þYÇÿWÂÿ[ÂÿJ¾ÿ/¶ÿ-´ÿ@µÿxÝÿœþÿ“÷ÿ’øÿœîÿ¥äÿ®êÿÊýÿ¬ñÿ«ïÿ´òþ¢æÿ“óÿ›ðÿ§åÿ¤çÿ¡æÿ›âÿ±îÿÎÿÿÊÿÿÉþÿÎÿÿ¿÷ÿ¢åÿÁùÿÕÿÿ¼öÿŸãÿŸãÿÃúÿÄúÿ¥äÿ©çÿ”ôÿ–ñÿ¦æÿ£èÿâÿ¾õÿ¿ÿÿ‹ñÿoÔÿe¼øh¾ùlÔÿqãþzëÿ:·ÿ)þVÿIÿ&Õ#Ë<óGý=è @Ý CØGÒTÒ#nà2_ë7=Äÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ77·7:Ü7Sñ1÷iâ4ØVö*“ÿ:³þYÄÿkÞÿqåÿpäÿYÔÿ/´ÿWÏÿwèÿ‚ïÿ”÷ÿ”÷ÿŽôÿ¬÷ÿ¯øÿ«õÿ˜ïÿêÿ¥éþ–óÿ éÿíÿ“÷ÿ•õÿ’öÿ—èÿ¶îÿÒÿÿÊÿÿÉþÿÎÿÿ¾÷ÿŸãÿ¿÷ÿÕÿÿ¼õÿœáÿŸãÿ¾÷ÿÍÿÿÃùÿÅúÿžùÿŒöÿ—óÿ—óÿ¤äÿžïÿ÷ÿœèÿqâÿgÛýkÞýkßÿkÐþfÈÿ9¸ÿ)‚þRú 9ì$ß=ë'[ÿ%Xÿ^öoîmæoâ'ë3võ7Hë78»ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ77¿7Hí4xö$sÝ 0Ê Gíÿ?ÎÿXÀÿvÝÿvÝÿ|çÿiáÿ(®ÿ^Øÿxíÿxèÿ‡ïþ‹ñþŽôþõþŽñÿŽðÿìþ›êÿ—îþ‘øÿ™óÿ˜íÿ˜ìÿîÿ–îÿ˜åÿ¥äÿ·òÿÌÿÿÍÿÿËÿÿÅûÿ¸óÿÊüÿ×ÿÿÊýÿµñÿ£æÿ¹ôÿÐÿÿÏÿÿÑÿÿ¨ïÿíÿ•ýÿ˜÷ÿ¢õÿ«øÿ±ôÿžàþäþ‚óÿˆóÿ…ãþkÚþ@½ÿ1¢ÿ*{þQ÷ EöÕJÞ;©ÿ,‘ÿ#“þ/©ú+Œó-™÷7‡þ7Dì77»ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ77½7Cê5nõ)vß8À<á{ü>¾ÿW¿ÿT¿ÿcÈÿußÿgàÿBÂÿcÛÿtéÿyèþ€éþêþƒëþ‚ìþëþ‰ìþ–ìÿšíþúÿ“÷ÿ’õÿ¨ðÿ±êÿ¢éÿ°ëÿ´îÿ¬ìÿ«ëÿ»õÿÇýÿÊÿÿÌÿÿÑÿÿÁþÿ´úÿÂÿÿÌÿÿ¥çÿ·òÿÏÿÿÊÿÿËÿÿ¾ðÿ¢ñÿöÿóÿŸ÷ÿ¯ÿÿÁùÿ°íÿ·ìÿ òÿ¨òÿ³îÿ†ìÿMØÿ,Œÿ.hþ"^üNÿ$ÜZÚ0ÂÿFÌÿ.Ïÿ0Éÿ9§ü6¬þ7lü77å77·ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ77¹7<ß6^ó0}éJÄ,Ï mø0©ÿQ¿ÿ/±ÿXÔÿ|íÿræÿræÿræÿnåÿtáþvßþwàþyãþ{åþŠïÿ“ëþšðÿ‘ùÿ“÷ÿ“÷ÿ›çÿÁòÿ¼ÿÿ”öÿ¿ýÿÏÿÿÍÿÿÃúÿ¥çÿ»õÿÎÿÿÌÿÿÊÿÿ øÿ†ôÿ§ûÿÊýÿ§çÿ¸óÿÏÿÿÊÿÿÊÿÿÑÿÿ´ÿÿ‡îÿ‰íÿš÷ÿúÿ¥ùÿÎÿÿÎÿÿ¬ëÿ²ïÿÈýÿ¨çÿ„ðÿ[Çÿ>…ÿ)gþEûRü$tÿ"šÿfÓþ6ñÿâÿ.¹ÿ7²ÿ7_ù77ç77·ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ78À7Lï5}ô&fÒ ¿ Uï#¨ÿ?¾þWÒþjãÿ„ðÿŽôÿwêÿpâÿrßþoØþvÞþzãþ|æþ†íÿ„îþ•ðÿ—öÿ‘ùÿùÿ‘ùÿ˜öÿ­ïÿ¯ëÿŸìÿ°ìÿªèÿºóÿÕÿÿÃúÿÊÿÿÔÿÿÉýÿ¯íÿôÿŸûÿÄþÿÊþÿÀøÿÅûÿÊÿÿËÿÿÐÿÿ·òÿ¥æÿ…éÿ…éÿ–÷ÿ©þÿ¹öÿ³ïÿÈþÿÍÿÿ½õÿ­ëÿ¨æÿšõÿƒòÿL¹ÿwþaý+]ÿ-…ÿ)´þ<ºþ@ÞÿGìþ?Çÿ7Žÿ7Dí77·ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ77¼7Dì6w÷*sع2é‡ÿ8Åÿzîÿ|îÿ|êÿ‡ñÿsçÿlÛÿn×þmÓþsÚþyáþèþóþ}ìÿùÿ’úÿ—óÿîÿ éÿšêÿëÿ–êÿ¦äÿ•êÿ§îÿ¶÷ÿ³þÿ¿öÿ¼óÿºõÿ³ïÿŸãÿçÿ¶øÿ×ÿÿÉÿÿÎÿÿÌÿÿËÿÿÆüÿ¶òÿ¶ðÿ­ïþ†çÿ„éÿ“öÿÄûþÃõÿœáÿÈþÿÈþÿ«ëÿáÿ¥åÿ£÷ÿ‘ÿÿ`Þþ0¢ÿ1yÿ/\ÿ/wþ7¬ÿ>¾ÿ^ÙÿséþMÉÿ7„ÿ7@ë77·ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ77·7;å7bö2„êCÉâSÿ:°ÿ`ÚÿuìÿtéþoåÿfÔÿhÔÿeËþjÏþwÜþ…ìþ‡íÿõÿ˜øÿ—ôÿ‘øÿ›ïÿ¤äÿ›çÿ™èÿ”ïÿ–ôÿ¤æÿ’ñÿ¹üÿ¶úÿ‰íÿ›çÿŸãÿŸâÿ äÿ£æÿ§åÿ¾õÿÎÿÿÊÿÿÊÿÿÊÿÿÍÿÿÃúÿ§èÿÄöÿ·ýÿ‡çÿ‚éÿ’óÿÃøÿÄûÿ«ëÿÂùÿ´ðÿ£åÿ¥æÿ¦åÿ˜òÿóÿhßÿO¼ÿ4xÿ#`ÿ+vÿHÿeÑÿwæÿgÙÿC¿ÿ7oû7;é77·ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ77½7Aë7yý*ˆñ ë Wÿ2›ÿ3µÿbæÿóþ[ÂÿQ¹ÿbÊÿ_ÃþdÈþrÖþ|äþŠðþzìÿ™öÿ£èÿ–ôÿ˜òÿ•çÿ‘çÿ—ëÿ›òþ—õÿ¥æÿ¤æÿ§èÿžáÿ‘àÿ“ôÿëÿ¥ãÿ¢åÿ¢åÿ½öÿÌÿÿÊÿÿÊÿÿÊÿÿÊÿÿÊÿÿÊÿÿÈþÿ´ïÿ“äÿ…èÿˆíýŽîþ¸þÿÕÿÿÂúÿ¨éÿÀøÿ¾÷ÿ¢ãÿ§åÿƒçÿvîÿaÝÿ/°ÿ/qÿlÿ(žÿX¾ÿZÃÿUÈÿ?¦ÿ8iö7Gí77¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ77¹7:ç7\÷ZñEôoþ Sõ Uï0uøCžÿAŸÿ<•þ?˜þK¨þR²þaÃþr×þ}çþxíÿž÷ÿ¨åÿ”çÿ•èÿ…åÿ™ëþ¡ñÿ•òÿ¥æÿ¤çÿ–ïÿµøÿ´óÿìÿŒùÿ¶ýÿ¸ïÿ¥çÿ¼öÿÊÿÿÍÿÿÉþÿÊÿÿÊÿÿÊÿÿÉþÿËÿÿÏÿÿ¨÷ÿ„æþæû‹íúòýŸðÿÆöÿÒÿÿ§çÿ¨éÿ®ëÿ¢èÿœñÿvçÿnèÿjÞÿE¶ÿ#ˆÿ"{ÿ4«ÿ1°ÿ7¡þ;•ý7…û7Fï78ç77·ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ77·77ç^ó JúFö+ð èJö$ÿ$yþ7þ1‹ý:•ýD¡ýN¯þiËþoÖþsãÿòÿ†çÿåÿæÿ~ãÿ•êþžìÿ˜ìÿ¥èÿ¨çÿ—ïÿ·öÿ¶úÿùÿ˜ïÿºøÿ´ïÿ«êÿÏÿÿÌÿÿÉþÿÊÿÿÊÿÿÊÿÿÊÿÿÊÿÿËÿÿÌÿÿ¬ùÿåýyåú‡îþ‘øÿœéþªéÿµûÿ¢çÿ«êÿ¯êÿ éÿ’øÿ‡óÿ}îÿhÜÿF·ÿ˜ÿ …ÿ'œÿ$¤ÿ0ˆý7tû7Ró77Î77·ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ77·77çhúYù<ó<ô7ç ló^ú`ü'~þ1“þ8˜þ?ŸþW¸þlÑþdÄÿjÓÿpáÿsàÿlÜÿpÞÿãþ—åÿ¦äÿ™òÿ“õÿ æÿ¤çÿ¤äÿ™îÿ”öÿ¢èÿ£äÿŸâÿ­ìÿÉþÿËÿÿÊÿÿÊÿÿÊÿÿÊÿÿÉþÿÊÿÿËÿÿÌÿÿ¹ðÿˆØÿV¾ÿJ³ÿ}çÿ¥óÿìÿõÿ¢éÿÅùÿÀõÿæÿ”öÿ—ùÿ‹õÿ\Ùÿ+°ÿ‘ÿˆÿ¡ÿ&¤þ1‚ú6l÷7O÷77ç77·ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ77·7kü-†ý_ô/ä+Ô:áCöcÿ%…ý3›þ?ŸþM­þpÙþsçÿm×ÿmÙÿiØÿdÓÿiÚþwåÿñÿ£æÿžðÿ™üÿ‰ôÿ{æÿ•òÿ›õÿ“õÿøÿôÿ¢êÿ§áÿ®êÿÉþÿËÿÿÊÿÿÊÿÿÊÿÿÊÿÿÉþÿËÿÿÏÿÿÐÿÿ»ñÿŠÛÿR³ÿA¡ÿW½ÿ„éÿš÷ÿ˜÷ÿÅüÿ½ñÿ¨ãÿ£èÿ•öÿ€îÿ|íÿ^Ùÿ%¬ÿ‹ÿ#‘ÿ¹ÿ!®ÿ-—ý5`ó7O÷77·ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ77·6Uó0qûió_æ2Û >ë Aô_ý3¨þ>¡þB¡þL«þbÇþpÜþeÓÿdÓÿ]ËÿdÒþjÙÿ{äÿ ûÿ¥çÿ‚ëÿˆêÿŠãÿgåÿtêÿ†øÿ–õÿ¥íÿ¹þÿ’ìÿ‚äÿªõÿÎÿÿÍÿÿÉþÿÊÿÿÉþÿÉþÿÑÿÿÃúÿ¬ëÿ°íÿ¨òÿ‡íÿTÂÿ=šÿIªÿkÑÿ‰ïÿúÿ¯þÿ òÿ˜ìÿ ôÿšùÿyêÿmæÿsâÿXÅÿ'¡ÿŒþ¶ÿÅÿ,¨ÿ4pü77ç77·ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ78½7Gî2wørð =èHôDó[ú1 þVÀÿM¶þN¯þ`ÃþjÔþTÂÿWÄÿ`ËþqÞÿm×ÿtÝÿ•óÿ¦æÿ€èÿƒäÿäÿzìÿséÿ‰ðÿžîÿ©ëÿÄþÿŒñÿtðÿ¡úÿÀöÿËþÿÌÿÿÉþÿÊÿÿËÿÿÅüÿ¶òÿ«êÿ­êÿœöÿ†ùÿsåÿE¤ÿK¬ÿkÑÿ‡ïÿóÿõÿ“úÿŽøÿ‡ôÿŒõÿ}ìÿvæÿnðÿXðÿGÇÿ’ÿŠý-¼ÿ3uú7Bë77·ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ7;Å6Wò*vùZñEóFôWø1—þS¿ÿ[ËþTºþY¸þ^ÅÿS¼þ`Îÿzíÿ”öÿíÿhäÿ}æÿ£æÿšóÿ’ùÿ”÷ÿ”÷ÿ’øÿ¡êÿ¡êÿ‘øÿ’öÿ“öÿ‘øÿ•ñÿ£æÿÁøÿÍÿÿÊÿÿÊÿÿÎÿÿ¬ìÿ­ìÿÏÿÿÌÿÿ£ùÿõÿ”÷ÿrÖÿZ½ÿZ¾ÿvßÿ~ìÿôÿšúÿ…ðÿnäÿræÿræÿ}ãÿ[îÿøÿCÙÿ6­ÿ!›þ(‚þ7^ï7<Âÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿç3÷7:Ç4Uð%söLî EòS÷2‰þO»ÿ\ÍÿZÀþQ±ÿT½þY¾þeÑÿ{íÿ¨ìÿ‰éþfåÿyèÿ—òÿ–øÿœðÿžîÿ•÷ÿŸîÿªâÿ ëþ‘öÿ–äÿ…êÿwïþ€ðÿ“óÿ éÿ¼óÿÐÿÿÏÿÿÕÿÿµìÿ áÿ¬ëÿ±íÿšöÿùÿ•øÿ”ûÿqÕÿdÉÿfÌÿzåÿ{ëÿ€ðÿ~òÿqåÿdÑÿTÑÿ_ÔÿSÙÿ$Ûÿ/Ìÿ:»ÿ5†ÿ3[ð7GÈç4üÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÞ3ó7>Æ1bókòNïUø4„þM²ÿbÊÿdÞÿVÉÿL­ÿeÉÿzèú{âõäýzäÿhãÿyëÿ‘øÿüÿŸëÿ¢èÿ’øÿ¤çÿ¢éÿ—öÿˆæútÕúfÏþcÏÿußÿ•îÿ¬ðÿËûÿÍüÿ¸ñÿ·üÿŸõÿ¤ðÿµïÿ£æÿŸçÿ™ñÿ“÷ÿœïÿ”ïÿyÝÿkÓÿvâÿ{ëÿbØÿgÜÿ`ÔþC°þ9®ÿG¶ÿNÀþ:Àÿ4½ÿ7Šÿ7Lë7BÃç4üÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ77·7?ë3mú&w÷uù(ŒþA¢ÿaÂÿh×ÿG§ÿ@Žÿ[Àÿyëøyßðlåývêÿuçÿwéÿ’÷ÿ”öÿ êÿ¢éÿ—óÿ¤çÿœîÿ•úÿ€äûkÑýaËÿ_ÉÿuÎÿ±êÿÆùÿÉÿÿ´õÿ˜æÿ…ïÿ†óÿ¯úÿÇúÿ åÿšäÿ–êþ™ñÿ§äÿ©áÿ™ïÿäÿxãÿzéÿhØÿN¯þG¯ÿ'›ÿ'‹ý8’ýH¦þB³ÿ7™ÿ7]ù77ç77·ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ77Á7Eï5gú1‰þ0­ÿ5·ÿ;©ÿ9‚ÿ-mÿ4ÿG©ÿdÔþuéýpåþóÿ…ïÿsèÿ‘÷ÿŸëÿ¥äÿ¥çÿ£çÿ¤çÿ¦åÿ¡ñÿ‚èÿqØÿdÎÿ_ËÿgÍÿÌþÿ·íÿ›íÿ–úÿ‘ôÿréÿŽåÿ­çÿ§èÿ•äþˆßþ„âþ¤çÿ¥æÿ§äÿ™òÿ—òÿìÿëÿsáÿV±ÿ2‡ÿ’ÿk÷)kø=˜ý<™ÿ7jû7?ë77·ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ77½7<ê7Vø7xÿ7·ÿ ÿ-bÿ8~ÿ0eÿ*ŠþRÔÿôÿxíÿ|ìþ‚ñÿ‰ñÿ˜èÿ¿÷ÿµïÿßÿ¨ãÿ¥æÿ¨ãÿŸîþùÿ€çÿmÒÿaËÿaÎÿn×ÿ™ðÿ”òÿùÿùÿ…ñÿñÿ¡êÿ¦áÿŽäþ}ÚþxÜþ‘ðÿ§äÿ¨ãÿšñÿ–÷ÿ—ñÿíÿxåÿ_Çÿ=˜ÿ€ÿ Lò&pø8‹þ8iû7Bî77Àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ77·77ç7O÷7oÿ7·ÿM—ÿY³ÿ/„ÿ!Žÿ>ÀÿZÕÿ`ÑÿcÜÿƒìÿ¬òÿ¸ðÿ¾õÿ»ôÿ«îÿìÿ£èÿ¨äÿ¢èÿñÿ¥öÿ|áÿdÉÿaÇÿfÒÿøÿ“ûÿ•õÿ›ðÿ˜ùÿüÿ—ôÿ¢íÿ†äþpÔþjÑþxåþžìÿ§äÿŸîÿ–ýÿ‘ùÿ‹ñÿyáÿVÄÿ.‹úKït÷/wü7dú7=ê77½ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ77·77·77ç7O÷7oÿ7·ÿFÆÿ)Àÿ&·ÿ4°ÿL¹ÿcÚÿ‰êÿ³ìÿÈþÿ«êÿ¾óÿÁÿÿ÷ÿ éÿ¥æÿ£èÿ¥çÿ§çÿ{Ýÿ`Àÿ`ÂÿlÐÿ•ùÿ’øÿœîÿ¦åÿ™ñÿ”÷ÿöÿŽ÷ÿ‘ùÿpÛþZÇþ\Æý“øÿ¢êÿšîÿ÷ÿóÿ|íÿnçÿ<ªý1¡ü"Uô2lù6Kî7=Â77·ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ77·77ç7O÷7oÿ7·ÿöÿ Þÿ_²ÿkÚÿmåÿ€îÿŸóÿ«èÿÂõÿ×ÿÿ¼ÿÿ÷ÿ£æÿžìÿ•÷ÿšõÿ’õÿoÑÿP©ÿI­ÿxéÿ÷ÿžñÿ¥æÿ¥æÿ¦åÿžóÿƒòÿzêÿ–øÿg×þN¼þN´ý—ùÿžøÿ‡îÿsçÿwéÿzìÿMØÿ5´ÿ6vÿ6R÷7>ê78½ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ77·77ç7O÷7oÿ7·ÿ'ùÿåÿlêÿuåÿ‚ðÿšúÿ–íÿ¨úÿ³öÿªëÿœíÿœîÿ–øÿ…öÿðÿ{åÿ]»ÿ@–ÿEªÿoåÿŠöÿ¢ïÿªáÿ¦åÿžëÿŸøÿ†òÿnäÿ€íÿbÓþH±ýB¡üŠõÿˆ÷ÿzïÿqéÿuìÿóÿ7·ÿ7oÿ7O÷77ç77·ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ77·77·77ç7O÷7oÿ7·ÿpèÿyâÿzëÿŽõÿ“úÿ‰øÿðÿ³æÿ¦äÿ”öÿšøÿ‰êÿlåÿZÂÿ6Šÿ;—ÿUÆÿpåÿŠ÷ÿ£ïÿªåÿ îÿ”øÿŒöÿ~ëÿoåÿmäÿ_ÎýH¨ü:ûLÆÿcØÿjÙÿkÚÿ7·ÿ7oÿ7O÷77ç77·77·ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ77·77ç77ç7O÷7oÿ7·ÿoäÿxéÿ‘õÿöÿ´þÿÇøÿ¡çÿ“õÿ£îÿ—èÿiáÿK°ÿ'ÿ:žÿ_ÒÿtçÿŒ÷ÿ¡íÿŸéÿ‘øÿ–øÿíÿnäÿsæÿsæÿSÂûN¡ù7ù9ˆý?¸ÿ7·ÿ7oÿ7O÷77ç77ç77·ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ77·77·77ç77ç7O÷7oÿ7·ÿzêÿõÿ¢ûÿ ÷ÿ—óÿ—øÿ øÿ”øÿkßÿCŸÿ!Žÿ@¹ÿ|ëÿõÿ˜úÿ†ìÿrâÿwêÿõÿ—øÿƒïÿräÿxåÿúÿ5™÷Czó7có7^û7O÷77ç77ç77·77·ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ77·77·77ç77ç77ç7O÷7oÿ7·ÿ7·ÿ•úÿ†ðÿ„óÿ{íþ\Âÿ8„ÿ6£ÿ]Þýòÿƒîÿ“öÿ‰óÿyìÿíÿ’öÿŽôÿxéÿnãÿ7·ÿ7·ÿ7oÿ7Cï77ç77ç77ç77·77·ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ77·77·77·77ç77ç77ç7O÷7O÷7oÿ7·ÿ7·ÿ;¢ü Ní9øgàÿyîÿwèÿóÿ›úÿšúÿ™ùÿ7·ÿ7·ÿ7oÿ7O÷7O÷77ç77ç77ç77·77·77·ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ77·77·77·77ç77ç77ç77ç7O÷7O÷7O÷7O÷7O÷7O÷7O÷7O÷7O÷7O÷7O÷7O÷77ç77ç77ç77ç77·77·77·ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ77·77·77·77·77ç77ç77ç77ç77ç77ç77ç77ç77·77·77·77·ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿslashem-0.0.7E7F3/sys/msdos/tiles/spfx/attack.bmp0000664000076400007640000034206610545462317017701 0ustar alialiBM6Ä6(@Àÿÿ@Òaò‘ò ²P‘q0a@ ¡ ÂqÒqP²0‘@âPÂ0¡qâªÚÿÚÿUÿªÿÿÿ$U$ª$ÿ$$$U$$ª$$ÿ$$H$UH$ªH$ÿH$m$Um$ªm$ÿm$‘$U‘$ª‘$ÿ‘$¶$U¶$ª¶$ÿ¶$Ú$UÚ$ªÚ$ÿÚ$ÿ$Uÿ$ªÿ$ÿÿ$HUHªHÿH$HU$Hª$Hÿ$HHHUHHªHHÿHHmHUmHªmHÿmH‘HU‘Hª‘Hÿ‘H¶HU¶Hª¶Hÿ¶HÚHUÚHªÚHÿÚHÿHUÿHªÿHÿÿHmUmªmÿm$mU$mª$mÿ$mHmUHmªHmÿHmmmUmmªmmÿmm‘mU‘mª‘mÿ‘m¶mU¶mª¶mÿ¶mÚmUÚmªÚmÿÚmÿmUÿmªÿmÿÿm‘U‘ª‘ÿ‘$‘U$‘ª$‘ÿ$‘H‘UH‘ªH‘ÿH‘m‘Um‘ªm‘ÿm‘‘‘U‘‘ª‘‘ÿ‘‘¶‘U¶‘ª¶‘ÿ¶‘Ú‘UÚ‘ªÚ‘ÿÚ‘ÿ‘Uÿ‘ªÿ‘ÿÿ‘¶U¶ª¶ÿ¶$¶U$¶ª$¶ÿ$¶H¶UH¶ªH¶ÿH¶m¶Um¶ªm¶ÿm¶‘¶U‘¶ª‘¶ÿ‘¶¶¶U¶¶ª¶¶ÿ¶¶Ú¶UÚ¶ªÚ¶ÿÚ¶ÿ¶Uÿ¶ªÿ¶ÿÿ¶ÚUÚªÚÿÚ$ÚU$Úª$Úÿ$ÚHÚUHÚªHÚÿHÚmÚUmÚªmÚÿmÚ‘ÚU‘Úª‘Úÿ‘Ú¶ÚU¶Úª¶Úÿ¶ÚÚÚUÚÚªÚÚÿÚÚÿÚUÿÚªÿÚÿÿÚÿUÿªÿÿÿ$ÿU$ÿª$ÿÿ$ÿHÿUHÿªHÿÿHÿmÿUmÿªmÿÿmÿ‘ÿU‘ÿª‘ÿÿ‘ÿ¶ÿU¶ÿª¶ÿÿ¶ÿÚÿUÚÿªÚÿÿÚÿÿÿUÿÿÿÿÿ                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    ¤¤¤¤ È ¤¤¤¤ Ȥ ÈÈ ¤¤¤¤ ÈÈ ¤È ¤ ÈÈ ¤ÈȤ ÈÈ ¤ ÈÈÈ ¤¤ È ¤ÈȤ È ¤¤ ÈÈ ÈÈ ¤ ¤ÈȤ ¤ ÈÈ È ÈÈ ¤ÈȤ ÈÈ È  È È ÈÈ È È  ¤ È  ÈÈ  È ¤ È È ÈÈ È È È È ÈÈ È ÈÈÈÈÈ È  È ÈÈÈȤ ÈÈ È  È ÈÈ ¤¤¤¤ È    È ¤¤¤ ¤¤È      Ȥ¤ ÈÈÈ ÈÈÈ      ÈÈÈ ÈÈÈ ÈÈÈ ÈÈ   ÈÈ ÈÈÈ ÈÈ    ÈÈ  ¤¤   ¤¤ ¤¤¤ ¤¤¤¤  ¤¤¤¤ ¤¤¤¤¤¤¤¤¤¤¤ÈÈ ¤¤¤ ¤¤¤ ÈȤ¤¤¤¤¤¤¤ ¤¤¤¤¤ÈÈÈÈÈȤ¤¤¤¤ ¤¤¤¤¤ÈÈÈÈÈȤ¤¤¤¤ ¤¤¤¤¤¤¤¤ÈÈ ¤¤¤ ¤¤¤ ÈȤ¤¤¤¤¤¤¤¤¤¤ ¤¤¤¤  ¤¤¤¤ ¤¤¤ ¤¤   ¤¤  ÈÈ    ÈÈ ÈÈÈ ÈÈ   ÈÈ ÈÈÈ ÈÈÈ ÈÈÈ      ÈÈÈ ÈÈÈ ¤¤È      Ȥ¤ ¤¤¤ È    È ¤¤¤¤ ÈÈ È  È ÈÈ ¤ÈÈÈÈ È  È ÈÈÈÈÈ È ÈÈ È È È È ÈÈ È È ¤ È  ÈÈ  È ¤  È È ÈÈ È È  È ÈÈ ¤ÈȤ ÈÈ È ÈÈ ¤ ¤ÈȤ ¤ ÈÈ ÈÈ ¤¤ È ¤ÈȤ È ¤¤ ÈÈÈ ¤ ÈÈ ¤ÈȤ ÈÈ ¤ Ȥ ÈÈ ¤¤¤¤ ÈÈ ¤È ¤¤¤¤ È ¤¤¤¤ ¤  ¤ ¤¤  ¤¤ ¤  ¤¤ ¤¤ ¤¤  ¤¤¤  ¤ ¤¤ ¤  ¤¤ ¤¤  ¤¤  ¤¤ ¤ ¤¤ ¤¤ ¤¤ ¤ ¤ ¤ ¤¤ ¤ ¤   ¤ ¤¤ ¤   ¤ ¤ ¤¤ ¤ ¤ ¤ ¤ ¤¤ ¤ ¤¤¤¤¤ ¤  ¤ ¤¤¤¤ ¤¤ ¤  ¤ ¤¤  ¤    ¤  ¤      ¤ ¤¤¤ ¤¤¤    ¤¤¤ ¤¤¤ ¤¤¤ ¤¤    ¤¤ ¤¤¤ ¤¤   ¤¤          ¤¤   ¤¤ ¤¤¤¤¤¤ ¤¤¤¤¤¤ ¤¤   ¤¤          ¤¤   ¤¤ ¤¤¤ ¤¤    ¤¤ ¤¤¤ ¤¤¤ ¤¤¤    ¤¤¤ ¤¤¤ ¤      ¤  ¤    ¤  ¤¤ ¤  ¤ ¤¤ ¤¤¤¤ ¤  ¤ ¤¤¤¤¤ ¤ ¤¤ ¤ ¤ ¤ ¤ ¤¤ ¤ ¤   ¤ ¤¤ ¤   ¤ ¤ ¤¤ ¤ ¤ ¤ ¤¤ ¤¤ ¤¤ ¤ ¤¤  ¤¤  ¤¤ ¤¤  ¤ ¤¤ ¤  ¤¤¤  ¤¤ ¤¤ ¤¤  ¤ ¤¤  ¤¤ ¤  ¤                                                                                                                                                                                                                                                                                                                                                                slashem-0.0.7E7F3/sys/msdos/tiles/spfx/gasspore.bmp0000664000076400007640000002406610545462317020252 0ustar alialiBM6(6(``$ÿÿ‘òòqâò¡âòÂòòòò²òò‘âòaÒò Ââò â@ò0â Òaâò ² ¡ò0²òqò0ò¡òòò@²òaòÂPÂòPò²âò‘òPÒòP²òÒòò0¡ò0ÒqÒò ²ò òaÂò0Â@Âò ‘ò qò ‘ ¡òÒ aò00a²PPa  00‘òPaa¡@PPqò q@Pa0‘0@qaò ²0²òòqòò¡@â@‘ò@@P a0¡0000òòò0@@@¡ò@Pq0ÂòÂaaaPPP@@@0¡aP@ Pò‘Pâ 0aaPPaq@@0‘ò Pò¡ò00@ òòPòò PP@00  ¡0@a 0q00q@Òò0@P òâ0Pq‘PP0 q@@a 00 @ Òò 0‘Pâò @‘P@ PPq0òòaòò0qò@ÒÒaaq0 q0P0²@@ PaP0 P@ò00P@Pâò 000aâ Âòò@P@ ‘P@0Òò0ÒòÒò@@qPa0 aPP 0a@0a@òò 0 P0P‘‘ÂòÂò@ò0@aa@P@P@0 aP00@âò 0@0@‘ qa²òP@@00PP 0¡@aq@0P ‘0 @¡0@0 ²0 a@ââò¡ò0aò@a  ¡0òqaP@ PP P@P‘aâqÂòqqPaPa aÒò‘Òòòqa@0 @  0q@0@@‘‘aqa@qqq@qq  @@@@ 0PPÒa@¡0â @P @a@P¡@P0 âò 0²q@@ Â@ µ6/Mb&&ÐyVNKXžƒyžAM@|W&&S‚~‚‚¸7c&8£„ŠV¥6Ž nÓ8XÓ $ó~kžè?+8£>¬‚C/  €Þ+m”*ˆEM½8«¿¹µ8£>@$* zSVƒƒ£ ˜MS&Z7¸*$bm:S4  $I*@qS6QNƒ8QZ¢*$_I*¬æZ8Þ±Xì&<‚ÆŒ[—<`@$$  C4ÀVæØ½¿¬€/M* *‚Ny£¿ ¬N8&&6:|q4kk€*M@ M$/A?Z6n‰  M*$$$M[7¬$$${<èŠ:K×W@S&—V¬`@ * ñ€444n  t$M*MlKE$IxhµaaabcV€ ûí}³”‚`@ ˆ_ /Ç/ÆI_ *E ¢± $1z”¬õ+&ƒ”* çA±/E@MŽ*  n/ M Æn$$ ``E$ $LuX£¬MŽí[L€  `4§ÒÖ Mpn M>M* M6A d £ysS`MÓul@ zl²XÖ’33 t  5^{/ ­Z|U d D”lðŒ``bccæ` ;‹±ó 99(=;;2 g ³q2 =3I Æ488h«”¬>¢bb?‹ ’22 ' ,,gB ™= z­ -Ê Hq&:ès6&<4A¬M>€€>­3  ,'2DB•P=5H1FFÊ {a—Zb:ƒQs<6?Ncb~MŽM/å5È.(OR FPPj°tŸFr T= H ÉFT ;¢XQQÁSb6<6&&&裣<8Ab×üA@  39(ú…††PP†,!=• % TB œ9™É' z|Šæ¢¢SSK<&&:8K4|:£4WÝ6>M $ =(‡F¨   %  9eU =J,P'*`>AŠbq¢Kc+6::&?al:aê6 $MŽ eË.G%  G32='®PG, /44@`qLQ:6:W4/z“XN&NNh<66qŒ¸\6640 $n>/;DôJ  G  O !Pr /`E$ *AVæVN&bSÌ8&:4@$ ^{$]R  . - Ž Æqb&&bbèh&bwÜ=.ôHH - .,iiI $  Žw8}NNm¥ZÆt.(Èv(!  ɯ(=ˆ; nA[NVáÒéz9,O  !†G,-O]ˆn5q8bSk€@y5R9•i "G   Pi #T  4?&²Nâø @’#J#J †" jj=O zÁ?b&+m4 I_ 3R9#9J "% ((' qZhc”U2d .#OR"%!T-1 *ŒX&<c¢5 13.)G % R ímaN¿2#.‡9   J3°!,P…Ú1œò8u7cZàÞn 9.. """ ’J úP jP, ½877ZVwAÁÑÆTJd,""""" ,(PP! jFT= ;4æ²y¬*Æå$1- G""" -O j ……†P(=1$0Œ:No$ 2 -,,, """"""!» ú úTŸ ¿ÁNSŽ ˆ$’O""""""'##ÉŸ ¿öu´¥p_ D*d..#""""!T ;‚6Nè¬*1$5ˆd=. % """"""!‡=T#- /A²Nb‚*I1$(=(  """"""" J-9.=04¥W7lqŽ ˆ B .3( """"""""" '9e ­>W×6&„qM$ˆ3, 1°G"""""""""GB 5DøqSbb6&æ§Md B]’]R """"""R. H n//`A6VWc4M  ]O,T "  #‡.’5$***/qVZ“€  1=J"""%))% 3  */|Z<¢`ó  39  """"  ,3 ’33B-  ±Z:bA~Ä¿Æ$ ’r  """""" ,-O3 2È9-, Æ47NbbKQ8L€, , """" 9Ë3 ÔTr RB¿8&hæyëÒ{# """""" ""°3 ].i•*á<èQ+N&[>D', """"=33O† Td$Ùy:Q7NN+<>n . %,T'  )2D  ˆD;M /³ÐV&66bh:aŠ4[cU$) P•»"   1$ *EŒ||Ð+8<&mNfy±$1 iGGiú G G (’  1MŽÄom\&N6±,†P¡·i»R   !3$dŽÄ<&ÐbL;  ,,‡O G ‡( Žz|QK8X&|€ r %Pj R-i… TJJ(11Ž/6yVh–\&è<[AÄjj ¨r …)O#…j'T#B(##d>|ž+²„Ó?K6&mK{ $2‰ (FP†GÚi#e9  -(3 ’‡-1ºÐ76b66y&bq§ö‹=ÉFFFj -DÔ R9  ].  2­Ð—\XèV8èaÃu[/d®®FP¨ i¨3D˜   Uv ‰2‰ÄA&KhX´³5 ](ŸF'( …j J’H  %rg D½€C`½qq¹wmc×aD$3 !'(]œDš,   D6êyoqW²²²l&hbŒM>n ø555D --=HѺ2‡  …•= 5 zS}?bN++¶S”`C55ºÙH ]3= qÙU]G j=š$*5///£m&}AŒ4§A5 $@4§º3== `>t )R !(šv*€|qqK6Äs—6ÌÁÁ¬* $ ŽEE*  $§Á š39‡3OB; n|:²l<²:[&a²A¢VA>@*$$ I 5 §öMt’ ]tš;`Œ6VŠ&}6a„V:>/MMŽ* ’]I /Ž  €Á>$]] 2ø48&mm8}£ðQ&Qo:X+–Sb8Wæ&?b&slashem-0.0.7E7F3/sys/msdos/tiles/spfx/escape.bmp0000664000076400007640000034206610545462317017672 0ustar alialiBM6Ä6(@Àÿÿòòòòòòò$U$ª$ÿ$HUHªHÿHmUmªmÿm‘U‘ª‘ÿ‘¶U¶ª¶ÿ¶ÚUÚªÚÿÚÿUÿªÿÿÿ$U$ª$ÿ$$$U$$ª$$ÿ$$H$UH$ªH$ÿH$m$Um$ªm$ÿm$‘$U‘$ª‘$ÿ‘$¶$U¶$ª¶$ÿ¶$Ú$UÚ$ªÚ$ÿÚ$ÿ$Uÿ$ªÿ$ÿÿ$HUHªHÿH$HU$Hª$Hÿ$HHHUHHªHHÿHHmHUmHªmHÿmH‘HU‘Hª‘Hÿ‘H¶HU¶Hª¶Hÿ¶HÚHUÚHªÚHÿÚHÿHUÿHªÿHÿÿHmUmªmÿm$mU$mª$mÿ$mHmUHmªHmÿHmmmUmmªmmÿmm‘mU‘mª‘mÿ‘m¶mU¶mª¶mÿ¶mÚmUÚmªÚmÿÚmÿmUÿmªÿmÿÿm‘U‘ª‘ÿ‘$‘U$‘ª$‘ÿ$‘H‘UH‘ªH‘ÿH‘m‘Um‘ªm‘ÿm‘‘‘U‘‘ª‘‘ÿ‘‘¶‘U¶‘ª¶‘ÿ¶‘Ú‘UÚ‘ªÚ‘ÿÚ‘ÿ‘Uÿ‘ªÿ‘ÿÿ‘¶U¶ª¶ÿ¶$¶U$¶ª$¶ÿ$¶H¶UH¶ªH¶ÿH¶m¶Um¶ªm¶ÿm¶‘¶U‘¶ª‘¶ÿ‘¶¶¶U¶¶ª¶¶ÿ¶¶Ú¶UÚ¶ªÚ¶ÿÚ¶ÿ¶Uÿ¶ªÿ¶ÿÿ¶ÚUÚªÚÿÚ$ÚU$Úª$Úÿ$ÚHÚUHÚªHÚÿHÚmÚUmÚªmÚÿmÚ‘ÚU‘Úª‘Úÿ‘Ú¶ÚU¶Úª¶Úÿ¶ÚÚÚUÚÚªÚÚÿÚÚÿÚUÿÚªÿÚÿÿÚÿUÿªÿÿÿ$ÿU$ÿª$ÿÿ$ÿHÿUHÿªHÿÿHÿmÿUmÿªmÿÿmÿ‘ÿU‘ÿª‘ÿÿ‘ÿ¶ÿU¶ÿª¶ÿÿ¶ÿÚÿUÚÿªÚÿÿÚÿÿÿUÿÿÿÿÿüüüüüýüüüýýüýüüüýÿüüüüÿýüüýýüýüüýÿýýüüüýüÿýÿüÿýÿüýüüüýýÿýüüýüýýüÿýÿüüüüÿýüüüýüýýüüüýüüüüüüüüýüüüýüýüüýýÿüüýüÿýÿüÿýÿýÿüüýÿýÿýÿüÿýüýüÿýÿüüýýÿüýüýüüüýýüüüýüüýÿýüýÿýüüýüüüýýüüüýüýüÿýýüüÿýÿüýüýÿüÿýÿýÿýüüÿýÿýÿüÿýÿüýüüÿýýüüýüýüüüýüüüüüüýüüýýüüýÿýÿüüüÿýÿüýÿýýüüýýÿýüÿýÿüüÿýÿüüÿýÿüüüýýÿýüýüüýüÿýÿüüýüüýüýüüüýýüÿýÿüüüÿýÿüýÿýýÿýüÿýÿüüüÿýÿüýýüüüýüýüüýüüÿýÿüýüüýüýÿýýüüüÿýÿüüÿýÿüüÿýÿüýÿýýüüýýÿýüÿýÿüüüÿýÿýüüýýüüýüüüüüüüýüüýýüüýüÿýÿüüÿýÿüýÿýýÿýüÿýÿüüüÿýÿüýüüýýüüýüýüüýüüÿýÿüýüüýüýÿýüÿýÿüüÿýÿüýÿýýüüýüÿýÿüüüüüýüüýýüüýüüüüüÿýÿüýüüýýÿýüÿýÿüüÿýÿüýÿýüýüüýüÿýÿüüýüüýüýüüýýüüýüÿýÿüüüÿýÿüýÿýýÿýüÿýÿüüÿýÿüýüüýýüüýüüüüüüüüýüüýýüüýüÿýÿüüÿýÿüýÿýýÿýüÿýÿüüÿýÿüýüüýýüüýüüüüüüüüýüüýýüüýüÿýÿüüÿýÿüýÿýýÿýüÿýÿüüÿýÿüýüüýýüüýüüüüüüüüýüüýýüüýüÿýÿüüÿýÿüýÿýýÿýüÿýÿüüÿýÿüýüüýýüüýüüüüüüüüýüüýýüüýüÿýÿüüÿýÿüýÿýýÿýüÿýÿüüÿýÿüýüüýýüüýüüüüüüüüýüüýýüüýüÿýÿüüÿýÿüýÿýýÿýüÿýÿüüÿýÿüýüüýýüüýüüüüüüýüüýüüüÿýÿüýüüýýÿýüÿýÿüüÿýÿüýÿýýüüýüÿýÿüüüýüüýüüüüýüüýüüüÿýÿüýüüýýÿýüÿýÿüüÿýÿüýÿýýüüýüÿýÿüüüýüüýüüüüüüýüüýýüüýüÿýÿüüÿýÿüýÿýýÿýüÿýÿüüÿýÿüýüüýýüüýüüüüüüýüüýüÿýÿüüüýÿýýüüýüÿýÿüüÿýÿüýüüýýÿýüüüÿýÿüüüýüüýýüüýüüüÿýÿüýÿýüÿýÿüüüýüüýýüüýüüüÿýÿüýÿýüÿýÿüýüüýüüüüýüüýüÿýÿüýÿýüÿýÿüüüýüüýýüüýüüüÿýÿüýÿýüÿýÿüüüýüüýýüüýüüüÿýÿüüüýÿýýüüýüÿýÿüüÿýÿüýüüýýÿýüüüÿýÿüýüüýüüüüýüüýüÿýÿüýÿýüÿýÿüüüýüüýýüüýüüüüüÿýÿüýüüýýÿýüÿýÿüüÿýÿüýÿýýüüýüÿýÿüüüýüüýüüüüýüüýüÿýÿüýÿýüüüÿýÿüýüüýýüüýüÿýÿüüüýÿýüÿýÿüýüüýüüüüýüüýüüüÿýÿüýüüýýÿýüÿýÿüüÿýÿüýÿýýüüýüÿýÿüüüüüýüüýýüüýüüüÿýÿüýÿýüÿýÿüýüüýüüüüýüüýüÿýÿüýÿýüÿýÿüüüýüüýýüüýüüüüüÿýÿüýüüýýÿýüÿýÿüüÿýÿüýÿýýüüýüÿýÿüüüýüüýüüüüüüýüüýýüüýüÿýÿüüÿýÿüýÿýýÿýüÿýÿüüÿýÿüýüüýýüüýüüüüüüýüüýüüüÿýÿüýüüýýÿýüÿýÿüüÿýÿüýÿýýüüýüÿýÿüüüüüýüüýýüüýüüüÿýÿüýÿýüÿýÿüýüüýüüüüýüüýüÿýÿüýÿýüüüÿýÿüýüüýýüüýüÿýÿüüüýÿýüÿýÿüüüýüüýýüüýüüüÿýÿüýÿýüÿýÿüýüüýüüüüýüüýüÿýÿüýÿýüÿýÿüýüüýüüüüýüüýüÿýÿüýÿýüÿýÿüýüüýüüüüýüüýüÿýÿüýÿýüÿýÿüüüýüüýýüüýüüüÿýÿüýÿýüüüÿýÿüýüüýýüüýüÿýÿüüüýÿýüÿýÿüýüüýüüüüýüüýüüüÿýÿüýüüýýÿýüÿýÿüüÿýÿüýÿýýüüýüÿýÿüüüýüüýüüüüýüüýüÿýÿüýÿýüÿýÿüüüýüüýýüüýüüüÿýÿüýÿýüÿýÿüýüüýüüüüýüüýüÿýÿüýÿýüÿýÿüüüýüüýýüüýüüüÿýÿüýÿýüÿýÿüýüüýüüüüýüüýüüüÿýÿüýüüýýÿýüÿýÿüüÿýÿüýÿýýüüýüÿýÿüüüýüüýüüüüüüýüüýýüüýüÿýÿüüÿýÿüýÿýýÿýüÿýÿüüÿýÿüýüüýýüüýüüüüüüüüýüüýýüüýüÿýÿüüÿýÿüýÿýýÿýüÿýÿüüÿýÿüýüüýýüüýüüüüüüüüýüüýýüüýüÿýÿüüÿýÿüýÿýýÿýüÿýÿüüÿýÿüýüüýýüüýüüüüüüüüýüüýýüüýüÿýÿüüÿýÿüýÿýýÿýüÿýÿüüÿýÿüýüüýýüüýüüüüüüýüüýüÿýÿüüüýÿýýüüýüÿýÿüüÿýÿüýüüýýÿýüüüÿýÿüýüüýüüüüýüüýüÿýÿüýÿýüÿýÿüýüüýüüüüýüüýüÿýÿüýÿýüÿýÿüýüüýüüüüýüüýüÿýÿüýÿýüÿýÿüýüüýüüüüýüüýüÿýÿüýÿýüÿýÿüýüüýüüüüýüüýüÿýÿüüüýÿýýüüýüÿýÿüüÿýÿüýüüýýÿýüüüÿýÿüýüüýüüüüýüüýüÿýÿüýÿýüÿýÿüýüüýüüüüýüüýüÿýÿüýÿýüÿýÿüüüýüüýýüüýüüüÿýÿüýÿýüÿýÿüýüüýüüüüýüüýüÿýÿüýÿýüÿýÿüýüüýüüüüýüüýüÿýÿüýÿýüÿýÿüýüüýüüüüýüüýüÿýÿüýÿýüÿýÿüüüýüüýýüüýüüüÿýÿüýÿýüÿýÿüýüüýüüüüýüüýüÿýÿüýÿýüÿýÿüýüüýüüüüýüüýüÿýÿüýÿýüÿýÿüýüüýüüüüüüýüüýýüüýüÿýÿüüÿýÿüýÿýýÿýüÿýÿüüÿýÿüýüüýýüüýüüüüüüýüüýüüüÿýÿüýüüýýÿýüÿýÿüüÿýÿüýÿýýüüýüÿýÿüüüýüüýüüüüüüýüüýýüüýüÿýÿüüÿýÿüýÿýýÿýüÿýÿüüÿýÿüýüüýýüüýüüüüüüýüüýüÿýÿüýÿýüÿýÿüýüüýüüüüýüüýüÿýÿüýÿýüÿýÿüüüýüüýýüüýüüüÿýÿüýÿýüÿýÿüüüýüüýýüüýüüüÿýÿüýÿýüÿýÿüýüüýüüüüýüüýüÿýÿüýÿýüÿýÿüüüýüüýýüüýüüüÿýÿüýÿýüÿýÿüýüüýüüüüýüüýüÿýÿüýÿýüÿýÿüüüýüüýýüüýüüüÿýÿüýÿýüÿýÿüüüýüüýýüüýüüüÿýÿüýÿýüÿýÿüýüüýüüüüýüüýüüüÿýÿüýüüýýÿýüÿýÿüüÿýÿüýÿýýüüýüÿýÿüüüýüüýüüüüýüüýüÿýÿüýÿýüÿýÿüýüüýüüüüýüüýüÿýÿüýÿýüÿýÿüýüüýüüüüýüüýüÿýÿüýÿýüÿýÿüýüüýüüüüýüüýüÿýÿüýÿýüÿýÿüýüüýüüüüýüüýüüüÿýÿüýüüýýÿýüÿýÿüüÿýÿüýÿýýüüýüÿýÿüüüýüüýüüüüüüýüüýýüüýüÿýÿüüÿýÿüýÿýýÿýüÿýÿüüÿýÿüýüüýýüüýüüüüüüýüüýüüüÿýÿüýüüýýÿýüÿýÿüüÿýÿüýÿýýüüýüÿýÿüüüýüüýüüüüýüüýüüüÿýÿüýüüýýÿýüÿýÿüüÿýÿüýÿýýüüýüÿýÿüüüýüüýüüüüüüýüüýýüüýüÿýÿüüÿýÿüýÿýýÿýüÿýÿüüÿýÿüýüüýýüüýüüüüüüýüüýüüüÿýÿüýüüýýÿýüÿýÿüüÿýÿüýÿýýüüýüÿýÿüüüýüüýüüüüýüüýüÿýÿüüüýÿýýüüýüÿýÿüüÿýÿüýüüýýÿýüüüÿýÿüýüüýüüüüýüüýüÿýÿüüüýÿýýüüýüÿýÿüüÿýÿüýüüýýÿýüüüÿýÿüýüüýüüüüýüüýüüüÿýÿüýüüýýÿýüÿýÿüüÿýÿüýÿýýüüýüÿýÿüüüýüüýüüüüýüüýüÿýÿüýÿýüüüÿýÿüýüüýýüüýüÿýÿüüüýÿýüüüÿýÿüýüüýýüüýüÿýÿüüüýÿýüÿýÿüýüüýüüüüýüüýüÿýÿüýÿýüÿýÿüýüüýüüüüýüüýüÿýÿüýÿýüÿýÿüýüüýüüüüýüüýüÿýÿüýÿýüüüÿýÿüýüüýýüüýüÿýÿüüüýÿýüüüÿýÿüýüüýýüüýüÿýÿüüüýÿýüÿýÿüýüüýüüüüýüüýüÿýÿüýÿýüüüÿýÿüýüüýüüýüüýüÿýÿüýüüýüüýÿýüÿýÿüüÿýÿüýÿýýüüýüÿýÿüüüýüüýüüüüýüüýüüüÿýÿüýüüýýÿýüÿýÿüüÿýÿüýÿýýüüýüÿýÿüüüýüüýüüüüýüüýüüüÿýÿüýüüýýÿýüÿýÿüüÿýÿüýÿýüüýüüýüÿýÿüýüüýüüýüüýüÿýÿüüüýÿýüÿýÿüýüüýüüüüýüüýüÿýÿüüüýÿýýüüýüÿýÿüüüüÿýÿüýüüýýüüýýÿýüüüÿýÿüüÿýÿüýÿýýüüýüÿýÿüüüýüüýüüüüýüüýüÿýÿüüüýÿýýüüýüÿýÿüüÿýÿüýüüýýÿýüüüÿýÿüýüüýüüüüýüüýüüüÿýÿüýüüýýÿýüÿýÿüüÿýÿüüüýÿýýüüýýüüýüÿýÿüüüüÿýÿüýüüýýÿýüüüÿýÿüýüüýüüüüýüüýüüüÿýÿüýüüýýÿýüÿýÿüüÿýÿüüüýÿýýüüýýüüýüÿýÿüüüüÿýÿüýüüýýÿýüüüüüÿýÿüýüüýýüüýüÿýÿüüüýÿýüÿýÿüüüýüüýýüüýüüüÿýÿüýÿýüüüÿýÿüýüüýýüüýüÿýÿüüüüüýÿýýüüýüÿýÿüüüüÿýÿüýüüýýüüýýÿýüüüÿýÿüüÿýÿüýÿýýüüýüÿýÿüüüýüüýüüüüüüýüüýýüüýüÿýÿüüÿýÿüýÿýýÿýüÿýÿüüüÿýÿüýüüýýüüýüýüüýüüÿýÿüýüüýüýÿýüÿýÿüüÿýÿüýÿýýüüýüÿýÿüüüüüýüüýýüüýüüüüüÿýÿüýüüýýÿýüÿýÿüüÿýÿüýÿýüýüüýüÿýÿüüýüüýüýüüýýüüýüÿýÿüüüÿýÿüýÿýýÿýüÿýÿüüÿýÿüýüüýýüüýüüüüüüýüüýüüÿýÿüüüýýÿýüÿýÿüüüÿüÿüýÿýüýüüýüýÿýÿüüüýüÿýÿüýüüýÿýÿüýÿýüüÿýüüÿýÿüüüÿýÿüýýüüüýýüüüýýüÿýÿüüüÿýÿüüýÿüüýÿýüÿýÿýüüýüÿýÿüýüüüÿýÿýüýüüýüýÿýüÿüÿüüüÿýÿüýÿýýüüüÿýÿüüýüüýüüüüýüüüýüüüÿýüüüýýüüýýÿýÿüüüÿýÿüÿüÿýüýüýÿýüüýýÿüÿüýüÿýÿüüüüüýýüüýüÿüýýüÿüýüüýýüüüüüÿýÿüýüÿüÿýýüüýÿýüýüýÿüÿüÿýÿüüüÿýÿýýüüýýüüüýÿüüüýüüüýüüüüüüüýüüüýýüýüüüýÿüüüüÿýÿüýýüýüüýÿýýüüüýüÿýÿüÿýÿüýüüüýýÿýüüýüýýüüýÿüüüüÿýüüüýüýýüüüýüüüüüüüýüüýüÿýÿüýÿýüÿýÿüýüüýüüslashem-0.0.7E7F3/sys/msdos/tiles/titlebg.bmp0000664000076400007640000020206610545462317017077 0ustar alialiBM66(ÿÿ‘¡Â‘²¡²‘¡‘¡²‘²Â¡²Òq‘¡q¡¡²Âq‘¡ÂÒa‘²Ââ²ÂÒaq‘qq‘²Òâ¡¶U¶ª¶ÿ¶ÚUÚªÚÿÚÿUÿªÿÿÿ$U$ª$ÿ$$$U$$ª$$ÿ$$H$UH$ªH$ÿH$m$Um$ªm$ÿm$‘$U‘$ª‘$ÿ‘$¶$U¶$ª¶$ÿ¶$Ú$UÚ$ªÚ$ÿÚ$ÿ$Uÿ$ªÿ$ÿÿ$HUHªHÿH$HU$Hª$Hÿ$HHHUHHªHHÿHHmHUmHªmHÿmH‘HU‘Hª‘Hÿ‘H¶HU¶Hª¶Hÿ¶HÚHUÚHªÚHÿÚHÿHUÿHªÿHÿÿHmUmªmÿm$mU$mª$mÿ$mHmUHmªHmÿHmmmUmmªmmÿmm‘mU‘mª‘mÿ‘m¶mU¶mª¶mÿ¶mÚmUÚmªÚmÿÚmÿmUÿmªÿmÿÿm‘U‘ª‘ÿ‘$‘U$‘ª$‘ÿ$‘H‘UH‘ªH‘ÿH‘m‘Um‘ªm‘ÿm‘‘‘U‘‘ª‘‘ÿ‘‘¶‘U¶‘ª¶‘ÿ¶‘Ú‘UÚ‘ªÚ‘ÿÚ‘ÿ‘Uÿ‘ªÿ‘ÿÿ‘¶U¶ª¶ÿ¶$¶U$¶ª$¶ÿ$¶H¶UH¶ªH¶ÿH¶m¶Um¶ªm¶ÿm¶‘¶U‘¶ª‘¶ÿ‘¶¶¶U¶¶ª¶¶ÿ¶¶Ú¶UÚ¶ªÚ¶ÿÚ¶ÿ¶Uÿ¶ªÿ¶ÿÿ¶ÚUÚªÚÿÚ$ÚU$Úª$Úÿ$ÚHÚUHÚªHÚÿHÚmÚUmÚªmÚÿmÚ‘ÚU‘Úª‘Úÿ‘Ú¶ÚU¶Úª¶Úÿ¶ÚÚÚUÚÚªÚÚÿÚÚÿÚUÿÚªÿÚÿÿÚÿUÿªÿÿÿ$ÿU$ÿª$ÿÿ$ÿHÿUHÿªHÿÿHÿmÿUmÿªmÿÿmÿ‘ÿU‘ÿª‘ÿÿ‘ÿ¶ÿU¶ÿª¶ÿÿ¶ÿÚÿUÚÿªÚÿÿÚÿÿÿUÿÿÿÿÿÖÖ ÖÖ ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ ÖÖÖÖÖÖÖÖÖ Ö ÖÖ ÖÖ ÖÖÖ ÖÖ ÖÖ ÖÖ ÖÖ ÖÖ ÖÖÖÖÖÖÖÖÖÖÖÖ ÖÖ ÖÖ Ö ÖÖ  ÖÖÖÖÖÖÖ ÖÖÖÖÖÖÖ ÖÖ ÖÖÖÖÖÖÖ ÖÖ  ÖÖ ÖÖÖ ÖÖ ÖÖÖ ÖÖ ÖÖ Ö ÖÖÖÖÖÖ  ÖÖÖÖÖ ÖÖÖ ÖÖ ÖÖ Ö  Ö  Ö ÖÖ Ö    Ö Ö Ö  ÖÖ  ÖÖ Ö  ÖÖÖÖÖÖÖÖÖ  ÖÖÖÖÖÖ ÖÖÖÖ ÖÖÖ  ÖÖ ÖÖ ÖÖ ÖÖ  ÖÖÖÖ ÖÖÖÖ Ö   ÖÖ ÖÖÖÖÖÖÖÖÖ ÖÖÖÖÖ Ö  ÖÖÖÖÖ Ö ÖÖÖÖÖ ÖÖÖÖ  Ö ÖÖÖÖ ÖÖÖÖ   ÖÖÖÖ ÖÖÖÖÖÖÖ Ö ÖÖ ÖÖÖ ÖÖÖ ÖÖÖ ÖÖÖ ÖÖÖÖÖ ÖÖÖÖÖÖÖ ÖÖ ÖÖÖ ÖÖ ÖÖ ÖÖÖÖ ÖÖ ÖÖ  Ö ÖÖ ÖÖÖÖÖÖ ÖÖ Ö Ö Ö ÖÖ Ö  ÖÖÖ ÖÖ ÖÖÖÖ ÖÖ    ÖÖÖÖÖÖ ÖÖ ÖÖ Ö ÖÖÖÖÖÖÖ ÖÖ ÖÖ ÖÖÖÖÖÖÖÖÖÖÖÖÖ ÖÖ Ö ÖÖÖ ÖÖÖÖÖ   ÖÖÖÖÖ ÖÖÖÖÖ   Ö ÖÖÖÖÖÖÖÖÖÖ  ÖÖÖÖÖÖÖÖÖÖÖÖ  ÖÖÖÖ ÖÖ ÖÖÖÖÖ Ö ÖÖ ÖÖÖÖ   ÖÖÖÖÖÖÖ   ÖÖ ÖÖ Ö ÖÖÖ ÖÖÖÖÖ  ÖÖ ÖÖÖÖÖÖ ÖÖÖÖ ÖÖ ÖÖÖ Ö Ö ÖÖÖÖÖÖÖÖÖ  Ö ÖÖÖÖ ÖÖÖÖÖÖ ÖÖ Ö Ö ÖÖÖÖÖ ÖÖÖ ÖÖÖÖ  ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ ÖÖÖÖÖ  ÖÖ ÖÖÖÖÖÖ ÖÖÖÖÖÖ ÖÖÖÖÖÖÖÖÖÖÖÖÖ  Ö ÖÖ ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ Ö ÖÖÖ Ö ÖÖ  ÖÖÖÖÖÖÖÖÖÖÖÖ ÖÖÖÖÖ ÖÖÖÖÖÖÖÖÖÖÖ  ÖÖÖÖÖÖÖÖ ÖÖÖÖÖÖÖ ÖÖ  ÖÖÖ ÖÖÖ Ö  ÖÖ ÖÖÖ ÖÖ ÖÖÖÖÖÖ Ö  ÖÖÖ Ö Ö Ö ÖÖÖ  Ö Ö ÖÖÖ ÖÖÖÖÖ    ÖÖÖÖÖÖÖ Ö Ö ÖÖÖÖÖÖÖ ÖÖÖ Ö    Ö  ÖÖÖÖ ÖÖ ÖÖÖ   Ö  ÖÖ ÖÖÖ ÖÖ ÖÖÖ ÖÖ ÖÖÖ ÖÖ ÖÖÖ ÖÖÖÖÖÖÖÖÖÖÖÖÖÖ ÖÖÖÖÖÖÖÖÖÖÖÖ ÖÖÖ ÖÖ ÖÖÖ Ö ÖÖ ÖÖ ÖÖÖ ÖÖÖÖÖ Ö ÖÖ ÖÖ ÖÖ Ö ÖÖ ÖÖÖ ÖÖ ÖÖ ÖÖÖ  ÖÖ ÖÖ  ÖÖÖÖÖÖÖÖÖÖÖ Ö  Ö ÖÖÖÖÖ  ÖÖÖÖÖÖÖÖ ÖÖ ÖÖÖÖÖ Ö ÖÖ Ö ÖÖÖÖ Ö Ö  ÖÖÖ  Ö Ö  Ö  ÖÖÖ ÖÖÖ Ö Ö Ö  ÖÖ  Ö      ÖÖÖ  ÖÖ   Ö  ÖÖÖÖÖ    Ö  ÖÖÖÖÖ  Ö  Ö   Ö  Ö Ö  Ö  ÖÖÖÖ  Ö ÖÖ ÖÖ  Ö ÖÖ ÖÖÖ ÖÖÖÖÖ Ö Ö    ÖÖ ÖÖ Ö  Ö ÖÖÖÖÖÖ Ö ÖÖÖÖÖÖ  ÖÖ Ö  ÖÖ  Ö ÖÖÖÖÖÖ      Ö ÖÖ Ö ÖÖÖ Ö ÖÖÖ   ÖÖÖÖÖÖ ÖÖÖÖ ÖÖ ÖÖ Ö Ö ÖÖÖ ÖÖ ÖÖÖÖÖÖÖ  ÖÖÖÖÖ Ö ÖÖÖ ÖÖÖÖÖ ÖÖ ÖÖÖÖÖÖÖ  ÖÖÖÖÖÖÖÖÖ ÖÖ Ö  ÖÖÖÖÖÖ ÖÖÖ ÖÖ  ÖÖÖ ÖÖÖÖ ÖÖ   ÖÖÖ Ö  Ö ÖÖÖ Ö  Ö ÖÖÖ ÖÖÖ ÖÖ ÖÖ ÖÖÖÖÖÖÖ ÖÖÖÖÖ ÖÖÖ ÖÖÖ ÖÖÖÖÖÖÖ ÖÖ ÖÖÖ ÖÖÖÖÖÖÖ Ö ÖÖ Ö  Ö ÖÖÖ Ö  Ö Ö ÖÖÖÖÖÖ  Ö  ÖÖÖÖ ÖÖÖÖÖÖÖÖ Ö  Ö ÖÖÖ Ö ÖÖÖÖÖ  ÖÖÖÖÖÖÖ  ÖÖÖÖ  ÖÖÖ   ÖÖÖ Ö  ÖÖÖÖÖÖÖÖ Ö Ö Ö  ÖÖÖÖ Ö Ö ÖÖ ÖÖ Ö Ö ÖÖÖ ÖÖ   Ö ÖÖÖÖÖ  Ö    Ö ÖÖ ÖÖ   ÖÖ Ö ÖÖ ÖÖÖ ÖÖÖÖ ÖÖÖÖÖ ÖÖ ÖÖ Ö ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ ÖÖÖ ÖÖ  Ö  Ö  ÖÖ ÖÖ ÖÖÖÖ   ÖÖ ÖÖ ÖÖ ÖÖÖ ÖÖÖÖÖÖÖÖÖÖ ÖÖ ÖÖÖÖÖÖÖÖÖÖ ÖÖÖ ÖÖÖÖÖÖ ÖÖÖÖÖ ÖÖÖÖ ÖÖÖÖ Ö  ÖÖÖÖ  ÖÖ  Ö Ö  ÖÖ ÖÖÖÖÖ  ÖÖ Ö  ÖÖÖ Ö Ö  ÖÖÖÖÖ  ÖÖ ÖÖ ÖÖÖÖÖÖÖÖÖÖÖÖÖ  Ö Ö Ö  ÖÖÖÖÖ ÖÖÖ Ö  Ö ÖÖÖÖÖ Ö  Ö ÖÖÖÖÖÖÖÖ ÖÖÖ ÖÖÖÖÖÖÖÖÖÖÖ ÖÖÖÖ Ö ÖÖÖÖ Ö ÖÖ ÖÖ  Ö ÖÖÖÖÖÖÖÖÖÖÖ   ÖÖÖÖÖ   Ö Ö   ÖÖÖ  ÖÖÖÖ ÖÖÖÖÖ ÖÖÖ ÖÖÖÖÖ ÖÖÖÖÖ ÖÖ ÖÖÖ  ÖÖÖÖÖ ÖÖ ÖÖÖÖÖ Ö   ÖÖ ÖÖÖÖÖÖÖ ÖÖÖ  Ö  Ö ÖÖÖÖ Ö ÖÖÖÖÖ ÖÖÖ ÖÖÖÖÖ ÖÖ ÖÖÖÖÖ Ö ÖÖÖÖÖ   Ö Ö  Ö Ö  Ö Ö  ÖÖÖ   Ö Ö ÖÖÖÖÖÖÖ ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ ÖÖÖÖÖÖÖÖÖÖÖÖÖÖ ÖÖÖÖÖÖÖÖÖÖÖÖÖÖ ÖÖÖÖÖ ÖÖÖÖÖ ÖÖÖ ÖÖÖÖ  Ö Ö ÖÖÖÖÖÖ Öslashem-0.0.7E7F3/sys/msdos/nhpif.uu0000664000076400007640000000141610545462317015300 0ustar alialibegin 666 nethack.pif M`%M00R!.971H86-K(#,N,2`@("`@("`@("`@("`@(""``(``0SI<3D542$%# M2UQ.151(04-++D5810`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@ M("`@("`@("`@$`!#.EQ.151(04-+`"`@("`@("`@("`@("`@("`@("`@("`@ M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@```````````````````` M```````````````````````````````````````````````````````````` M```````!`/\94```!P`````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M`````````.`@34E#4D]33T94(%!)1D58`( #include #include #include /* splits bitmaps into sub-sprites, using regions bounded by col #255 */ void datedit_find_character(BITMAP *bmp, int *x, int *y, int *w, int *h) { int c1; int c2; if (bitmap_color_depth(bmp) == 8) { c1 = 255; c2 = 255; } else { c1 = makecol_depth(bitmap_color_depth(bmp), 255, 255, 0); c2 = makecol_depth(bitmap_color_depth(bmp), 0, 255, 255); } /* look for top left corner of character */ while ((getpixel(bmp, *x, *y) != c1) || (getpixel(bmp, *x+1, *y) != c2) || (getpixel(bmp, *x, *y+1) != c2) || (getpixel(bmp, *x+1, *y+1) == c1) || (getpixel(bmp, *x+1, *y+1) == c2)) { (*x)++; if (*x >= bmp->w) { *x = 0; (*y)++; if (*y >= bmp->h) { *w = 0; *h = 0; return; } } } /* look for right edge of character */ *w = 0; while ((getpixel(bmp, *x+*w+1, *y) == c2) && (getpixel(bmp, *x+*w+1, *y+1) != c2) && (*x+*w+1 <= bmp->w)) (*w)++; /* look for bottom edge of character */ *h = 0; while ((getpixel(bmp, *x, *y+*h+1) == c2) && (getpixel(bmp, *x+1, *y+*h+1) != c2) && (*y+*h+1 <= bmp->h)) (*h)++; } /* creates a new font object */ static void *makenew_font(long *size) { FONT *f = malloc(sizeof(FONT)); f->height = 8; f->dat.dat_8x8 = malloc(sizeof(FONT_8x8)); memcpy(f->dat.dat_8x8, font->dat.dat_8x8, sizeof(FONT_8x8)); return f; } /* GRX font file reader by Mark Wodrich. * * GRX FNT files consist of the header data (see struct below). If the font * is proportional, followed by a table of widths per character (unsigned * shorts). Then, the data for each character follows. 1 bit/pixel is used, * with each line of the character stored in contiguous bytes. High bit of * first byte is leftmost pixel of line. * * Note : FNT files can have a variable number of characters, so we must * check that the chars 32..127 exist. */ #define FONTMAGIC 0x19590214L /* .FNT file header */ typedef struct { unsigned long magic; unsigned long bmpsize; unsigned short width; unsigned short height; unsigned short minchar; unsigned short maxchar; unsigned short isfixed; unsigned short reserved; unsigned short baseline; unsigned short undwidth; char fname[16]; char family[16]; } FNTfile_header; #define GRX_TMP_SIZE 4096 /* converts images from bit to byte format */ static void convert_grx_bitmap(int width, int height, unsigned char *src, unsigned char *dest) { unsigned short x, y, bytes_per_line; unsigned char bitpos, bitset; bytes_per_line = (width+7) >> 3; for (y=0; y>3)] & (1<width; /* temporary working area to store FNT bitmap */ temp = malloc(GRX_TMP_SIZE); for (t=0; tisfixed) width = wtable[t]; /* work out how many bytes to read */ bmp_size = ((width+7) >> 3) * hdr->height; /* oops, out of space! */ if (bmp_size > GRX_TMP_SIZE) { free(temp); for (t--; t>=0; t--) free(bmp[t]); free(bmp); return NULL; } /* alloc space for converted bitmap */ bmp[t] = malloc(width*hdr->height); /* read data */ pack_fread(temp, bmp_size, f); /* convert to 1 byte/pixel */ convert_grx_bitmap(width, hdr->height, temp, bmp[t]); } free(temp); return bmp; } /* main import routine for the GRX font format */ static FONT *import_grx_font(char *fname) { PACKFILE *f, *cf; FNTfile_header hdr; /* GRX font header */ int numchar; /* number of characters in the font */ unsigned short *wtable = NULL; /* table of widths for each character */ unsigned char **bmp; /* array of font bitmaps */ FONT *font = NULL; /* the Allegro font */ FONT_PROP *font_prop; int c, c2, start, width; char copyright[256]; f = pack_fopen(fname, F_READ); if (!f) return NULL; pack_fread(&hdr, sizeof(hdr), f); /* read the header structure */ if (hdr.magic != FONTMAGIC) { /* check magic number */ pack_fclose(f); return NULL; } numchar = hdr.maxchar-hdr.minchar+1; if (!hdr.isfixed) { /* proportional font */ wtable = malloc(sizeof(unsigned short) * numchar); pack_fread(wtable, sizeof(unsigned short) * numchar, f); } bmp = load_grx_bmps(f, &hdr, numchar, wtable); if (!bmp) goto get_out; if (pack_ferror(f)) goto get_out; if ((hdr.minchar < ' ') || (hdr.maxchar >= ' '+FONT_SIZE)) printf("Warning: font exceeds range 32..256. Characters will be lost in conversion"); font = malloc(sizeof(FONT)); font->height = -1; font->dat.dat_prop = font_prop = malloc(sizeof(FONT_PROP)); font_prop->render = NULL; start = 32 - hdr.minchar; width = hdr.width; for (c=0; c= 0) && (c2 < numchar)) { if (!hdr.isfixed) width = wtable[c2]; font_prop->dat[c] = create_bitmap_ex(8, width, hdr.height); memcpy(font_prop->dat[c]->dat, bmp[c2], width*hdr.height); } else { font_prop->dat[c] = create_bitmap_ex(8, 8, hdr.height); clear(font_prop->dat[c]); } } if (!pack_feof(f)) { strcpy(copyright, fname); strcpy(get_extension(copyright), "txt"); c = 'n'; if ((c != 27) && (c != 'n') && (c != 'N')) { cf = pack_fopen(copyright, F_WRITE); if (cf) { while (!pack_feof(f)) { pack_fgets(copyright, 255, f); if (isspace(copyright[0])) { pack_fputs(copyright, cf); pack_fputs("\n", cf); } else if (!copyright[0]) pack_fputs("\n", cf); } pack_fclose(cf); } } } get_out: pack_fclose(f); if (wtable) free(wtable); if (bmp) { for (c=0; ctodo == 2048) ? 8 : 16; if (font_h == 16) pack_fread(data16, sizeof(data16), f); else pack_fread(data8, sizeof(data8), f); pack_fclose(f); font = malloc(sizeof(FONT)); font->height = -1; font->dat.dat_prop = malloc(sizeof(FONT_PROP)); font->dat.dat_prop->render = NULL; for (c=0; cdat.dat_prop->dat[c] = create_bitmap_ex(8, 8, font_h); clear(font->dat.dat_prop->dat[c]); for (y=0; y> x)) font->dat.dat_prop->dat[c]->line[y][x] = 1; } else { if (data8[c + ' '][y] & (0x80 >> x)) font->dat.dat_prop->dat[c]->line[y][x] = 1; } } } } return font; } /* main import routine for the Allegro .pcx font format */ static void *import_bitmap_font(char *fname) { PALLETE junk; BITMAP *bmp; FONT *f; int x, y, w, h, c; int max_h = 0; bmp = load_bitmap(fname, junk); if (!bmp) return NULL; if (bitmap_color_depth(bmp) != 8) { destroy_bitmap(bmp); return NULL; } f = malloc(sizeof(FONT)); f->height = -1; f->dat.dat_prop = malloc(sizeof(FONT_PROP)); f->dat.dat_prop->render = NULL; for (c=0; cdat.dat_prop->dat[c] = NULL; x = 0; y = 0; for (c=0; cdat.dat_prop->dat[c] = create_bitmap_ex(8, w, h); clear(f->dat.dat_prop->dat[c]); blit(bmp, f->dat.dat_prop->dat[c], x+1, y+1, 0, 0, w, h); max_h = MAX(max_h, h); x += w; } for (c=0; cdat.dat_prop->dat[c]->h < max_h) { BITMAP *b = f->dat.dat_prop->dat[c]; f->dat.dat_prop->dat[c] = create_bitmap_ex(8, b->w, max_h); clear(f->dat.dat_prop->dat[c]); blit(b, f->dat.dat_prop->dat[c], 0, 0, 0, 0, b->w, b->h); destroy_bitmap(b); } } destroy_bitmap(bmp); return f; } /* converts a proportional font to 8x8 format */ static FONT *make_font8x8(FONT *f) { FONT_PROP *fp = f->dat.dat_prop; FONT_8x8 *f8 = malloc(sizeof(FONT_8x8)); BITMAP *bmp; int c, x, y; for (c=0; cdat[c]; for (y=0; y<8; y++) { f8->dat[c][y] = 0; for (x=0; x<8; x++) if (bmp->line[y][x]) f8->dat[c][y] |= (0x80 >> x); } destroy_bitmap(bmp); } free(fp); f->dat.dat_8x8 = f8; f->height = 8; return f; } /* converts a proportional font to 8x16 format */ static FONT *make_font8x16(FONT *f) { FONT_PROP *fp = f->dat.dat_prop; FONT_8x16 *f16 = malloc(sizeof(FONT_8x16)); BITMAP *bmp; int c, x, y; for (c=0; cdat[c]; for (y=0; y<16; y++) { f16->dat[c][y] = 0; for (x=0; x<8; x++) if (bmp->line[y][x]) f16->dat[c][y] |= (0x80 >> x); } destroy_bitmap(bmp); } free(fp); f->dat.dat_8x16 = f16; f->height = 16; return f; } /* make sure a font will use 8x8 or 8x16 format if that is possible */ static FONT *fixup_font(FONT *f) { int c, w, h, x, y, n; int col = -1; if (!f) return NULL; w = f->dat.dat_prop->dat[0]->w; h = f->dat.dat_prop->dat[0]->h; for (c=1; cdat.dat_prop->dat[c]->w != w) || (f->dat.dat_prop->dat[c]->h != h)) return f; for (y=0; ydat.dat_prop->dat[c]->line[y][x]; if (n) { if (col < 0) col = n; else if (col != n) return f; } } } } if ((w == 8) && (h == 8)) return make_font8x8(f); else if ((w == 8) && (h == 16)) return make_font8x16(f); else return f; } /* imports a font from an external file (handles various formats) */ static void *load_font(char *filename) { PACKFILE *f; int id; if ((stricmp(get_extension(filename), "bmp") == 0) || (stricmp(get_extension(filename), "lbm") == 0) || (stricmp(get_extension(filename), "pcx") == 0) || (stricmp(get_extension(filename), "tga") == 0)) { return fixup_font(import_bitmap_font(filename)); } else { f = pack_fopen(filename, F_READ); if (!f) return NULL; id = pack_igetl(f); pack_fclose(f); if(0) /* (id == FONTMAGIC) */ return fixup_font(import_grx_font(filename)); else return fixup_font(import_bios_font(filename)); } } #endif slashem-0.0.7E7F3/sys/msdos/schema3.MSC0000664000076400007640000010354110545462317015512 0ustar aliali; SCCS Id: @(#)schema3.MSC 3.4 2003/08/03 ; Copyright (c) NetHack PC Development Team, 2000 ; ; NetHack Overlay Schema ; This overlay schema is for use only when NetHack is built ; using packaged-functions for function-level linking. ; ; Overlay tuning level: 0 ; functions:0 _main _dosave0 _moveloop _bputc _bwrite _random _rn2 _newsym _show_glyph _on_level _txt_gotoxy _txt_get_cursor functions:0 _xputc _txt_xputc _t_at _tty_curs _acurr _dist2 _tty_print_glyph _isok _back_to_glyph functions:0 _show_map_spot _adjust_cursor_flags _lowc _g_putch _has_color _is_pool _mread functions:0 _is_lava _welded _magic_map_background _end_glyphout _visible_region_at _domove functions:0 _engr_at _rnd _run_regions _mcalcmove _depth _done _distmin _does_block _eos functions:0 _move _move_bc _in_rooms _map_background _map_invisible _map_location _alloc functions:0 _impossible _in_container _in_fcorridor _In_hell _In_mines _in_or_out_menu _In_quest functions:0 _do_positionbar _iswall _iswall_or_stone _itimeout _is_solid _Is_special functions:0 _is_swallow_sym _check_here _check_leash _check_map_spot _check_pos functions:0 _monsndx _m_move _lcase _tty_create_nhwindow _tty_delay_output _tty_destroy_nhwindow functions:0 _tty_dismiss_nhwindow _gender _genl_outrip _get_cost _get_free_room_loc _get_level functions:0 _get_location _get_map _get_mleash ; functions:1 _move_update _movebubbles _movecmd _movemon _moverock _movobj _mpickgold functions:1 _doaltarobj _doapply _dobreathe _docall _docast ; functions:2 _do_vicinity_map functions:3 _pcmain functions:4 _spell_let_to_idx _cursed_book _deadbook _learn _getspell _spelltypemnemonic functions:5 _dospellmenu _percent_success _throwspell _cast_protection _isqrt ; functions:6 _a_gname _a_gname_at _a_monnam _abon _abuse_dog _accessible _activate_statue_trap functions:7 _add_branch _add_damage _add_debug_extended_commands _add_door _add_id_mapping _add_level functions:8 _add_menu_cmd_alias _add_one_tobill _add_rect _add_room _add_subroom _add_to_billobjs _add_to_buried _add_to_container functions:9 _add_to_migration _add_to_minv _add_valid_menu_class _add_weapon_skill _addinv _addtobill _addtopl _addupbill functions:10 _Adjmonnam functions:11 _align_gname functions:12 _altar_wrath _Amonnam _amulet _Amulet_off _Amulet_on _An _an _angry_guards functions:13 _angry_priest _angry_shk_exists _any_light_source _aobjnam _append_slash _append_str _Armor_gone _Armor_off functions:14 _Armor_on _armor_to_dragon _armoroff _arti_invoke _artifact_exists _artifact_hit _artifact_name _artiname functions:15 _artitouch _askchain _assign_graphics _assign_level _assign_rnd_level _assign_rogue_graphics _assign_soundcard _assign_video functions:16 _assign_videocolors _assign_videoshades _assigninvlet _at_dgn_entrance _attach_egg_hatch_timeout _attack _attack_checks _attacks functions:17 _awaken_monsters _awaken_soldiers functions:18 _backfire _backsp _bad_location _bad_negation _bad_rock _badoption _bail _ballfall functions:19 _bc_order _bclose _bcsign _beg _begin_burn _bflush _bhit _bhitm functions:20 _bhito _bhitpile _big_to_little _bill_box_content _bill_dummy_object _bite _bless _blessorcurse functions:21 _Blindf_off _Blindf_on _block_door _block_entry _block_point _blow_up_landmine _body_part functions:22 _boomhit _Boots_off _Boots_on _bot _bot1 _bot2 _boulder_hits_pool _bound_digging functions:23 _boxlock _br_string _break_armor _break_statue _breakarm _breakmsg functions:24 _breakobj _breaks _breaksink _breaktest _breamu _bribe _bufoff _bufon functions:25 _build_room _burn_floor_paper _burn_object _burnarmor _bury_an_obj _bury_objs _buzz _buzzmu functions:26 _Can_dig_down functions:27 _Can_fall_thru _can_make_bones _can_ooze _can_pray _can_reach_floor _Can_rise_up _can_track functions:28 _cancel_bonesfile _cancel_don _cancel_item _cancel_monst _candle_light_range _canletgo _cant_create _canwearobj functions:29 _carry_count _carrying _castmu _ceiling _center _change_inv_order _change_luck _change_sex functions:30 _charm_monsters _charm_snakes _chat_with_guardian _chat_with_leader _chat_with_nemesis _chdirx _chdrive _cheapest_item functions:31 _check_capacity _check_contained _check_credit _check_recordfile functions:32 _check_room _check_shop_obj _check_special_room _check_unpaid _check_unpaid_usage _check_version _checkfile _chest_shatter_msg functions:33 _chest_trap _choke _choke_dialogue _choose_classes_menu _choose_windows _christen_monst _chwepon _ck_bag functions:34 _ckmailstatus _ckunpaid _cl_end _cl_eos _classmon _clear_fcorr _clear_glyph_buffer functions:35 _clear_id_mapping _clear_level_structures _clear_path _clear_screen _clear_stale_map _clear_unpaid _clearlocks _clearpriests functions:36 _click_to_cmd _Cloak_off _Cloak_on _clone_mon _cloneu _clonewiz _close_drawbridge _close_library functions:37 _closed_door _CloseTileFile _cls _cmov _cnv_trap_obj _co_false _collect_obj_classes _com_pager functions:38 _commit_bonesfile _compactify _compress _compress_bonesfile _compress_str _comspec_exists _confdir _construct_qtlist functions:39 _consume_offering _contained _contained_cost _contained_gold _container_contents _container_weight _convert_arg _convert_line functions:40 _copybones _copyfile _corpse_chance _corpse_xname _corr _correct_branch_type _cost _cost_per_charge functions:41 _costly_cancel _costly_gold _costly_spot _could_seduce _count_categories _count_obj _count_unpaid _count_wsegs functions:42 _counter_were _courtmon _cpostfx _cprefx _create_altar _create_bonesfile _create_corridor _create_critters functions:43 _create_door _create_drawbridge _create_engraving _create_feature _create_gold _create_levelfile _create_monster _create_mplayers functions:44 _create_object _create_particular _create_polymon _create_room _create_savefile _create_secret_door _create_stairs _create_subroom functions:45 _create_trap _create_worm_tail _curr_mon_load _currentlevel_rewrite _curs_on_u _curse _cursed _cursed_object_at functions:46 _cursetxt _cuss _cutworm _cvt_sdoor_to_door _d _damageum _dbon _ddocall functions:47 _ddoinv _dead_species _dealloc_obj _decl_init _deepest_lev_reached _def_char_to_monclass _def_char_to_objclass _def_raw_print functions:48 _defends _deferred_goto _del_engr _del_engr_at _del_light_source _delallobj _delete_bonesfile _delete_contents functions:49 _delete_levelfile _delete_savefile _delfloortrap _deliver_by_pline _deliver_by_window _delobj _deltrap _demon_talk functions:50 _demonpet _destroy_arm _destroy_drawbridge _destroy_item _destroy_mitem _dev_name _dig functions:51 _dig_check _dig_corridor _dig_point _dig_typ _digactualhole _dighole _digit _dipfountain functions:52 _disable_ctrlP _disarm_landmine _disarm_shooting_trap _disarm_squeaky_board _discard_minvent _disclose _discover_object functions:53 _diseasemu _display_binventory _display_cinventory _display_gamewindows _display_inventory _display_minventory functions:54 _distant_name _distfleeck _disturb _djinni_from_bottle _dlb_cleanup _dlb_fclose functions:55 _dlb_fgets _dlb_fopen _dlb_fread _dlb_fseek _dlb_ftell _dlb_init _dlord _dmgtype functions:56 _dmgval _dmonsfree _dmore _dname_to_dnum _do_break_wand _do_clear_area _do_comp _do_dknown_of functions:57 _do_earthquake _do_entity _do_genocide _do_improvisation _do_light_sources _do_look _do_mapping _do_mname functions:57 _vga_xputg _vga_xputs _video_update_positionbar _view_from _view_init _visctrl _vision_init _vision_recalc functions:58 _do_oname _do_osshock _do_play_instrument _do_reset_eat _do_room_or_subroom _do_storms _do_takeoff functions:60 _doclose _doconsult _docorner _docrt _doddoremarm _doddrop _dodip functions:61 _adjust_prefix _build_plselection_prompt _duplicate_opt_detection _enter_explore_mode _maybe_wail functions:62 _doextcmd _doextlist _doextversion _dofindgem _dofiretrap _doforce _dog_eat _dog_goal functions:63 _dog_hunger _dog_invent _dog_move _dog_nutrition _dogfood _dogushforth _dohelp _dohide functions:64 _dohistory _doidtrap _doinvbill _doinvoke _dojump _dokick _dolook _doloot functions:65 _domagicportal functions:66 _done_eating _done_in_by _done_intr _done1 _done2 _donning _donull _doopen functions:67 _doorganize _doorlock _dopay _dopayobj _dopickup _dopotion _dopramulet _doprarm functions:68 _dopray _doprev_message _doprgold _doprring _doprtool _doprwep _doputon _doquickwhatis functions:69 _doread _dorecover _doredraw _doremove _doremring _dorub _dosacrifice _dosave functions:70 _dosdoor _dosearch _dosearch0 _doseduce _doset _doset_add_menu _dosh functions:71 _dosinkfall _dosinkring _dosit _dosounds _dospinweb _dospit _dosummon _dotakeoff functions:72 _dotalk _dotele _dothrow _dotogglepickup _dotrap _doturn _dotypeinv _dounpaid functions:73 _dountrap _doup _doversion _dovspell _dowaterdemon _dowaternymph _dowatersnakes _dowear functions:74 _dowhatdoes _dowhatis _dowield _dowipe _down_gate _dowrite _dozap _dprince functions:75 _drag_ball _drag_down _drain_en _DrawCursor _drinkfountain _drinksink _drop _drop_ball functions:76 _drop_throw _drop_to _drop_upon_death _drop_weapon _DROPPABLES _dropped_container _dropx _dropy functions:77 _drown _dryup _dtoxy _dungeon_branch _dunlev _dunlevs_in_dungeon _e_at _e_died functions:78 _e_jumps _e_missed _e_nam _E_phrase _e_survives_at _eataccessory _eatcorpse _eaten_stat functions:79 _eatfood _eatmdone _eatspecial _egg_type_from_parent _emergency_disrobe _enable_ctrlP _encumber_msg _end_burn functions:80 _end_engulf ;functions:81 functions:82 _exclam _exepath _exerchk _exercise _exerper _exist_artifact _expels _experience functions:83 _explmm _explmu _explode _explum _expulsion _ext_cmd_getlin_hook _extend_spine _extract_nexthere functions:84 _extract_nobj _fall_asleep _fall_through _feel_cockatrice _feel_location _fightm _filesize_nh _fill_pit functions:85 _nh_getenv _promptsep _rigid_role_checks _set_duplicate_opt_detection _tool_in_use functions:86 _find_drawbridge _find_hell _find_lev_obj _find_level _find_mac _find_mid _find_misc _find_offensive functions:87 _find_oid _find_roll_to_hit _find_skates _find_unpaid _finddpos _findfirst_file _findgd _findit functions:88 _findnext_file _findone _findpriest _finish_map _finish_paybill _fix_stair_rooms _fix_worst_trouble _fixup_special functions:89 _flash_hits_mon _float_down _float_up _floating_above _flood_fill_rm _flooreffects _floorfood _flush_screen _term_start_color functions:90 _flushout _fmt_ptr _food_detect _food_disappears _food_xname _foodword _fopen_config_file _fopen_datafile functions:91 _fopenp _forcelock _forget_levels _forget_map _forget_objects _forget_traps _foundfile_buffer _fpostfx functions:92 _fprefx _fracture_rock _free_dungeons _free_rooms _free_ttlist _free_window_info _freediskspace _freedynamicdata functions:93 _freefruitchn _freehand _freeinv _friday_13th _fruitadd _fry_by_god _fully_identify_obj _g_at functions:94 _gainstr _gameDiskPrompt _gazemm _gazemu _gd_move _gd_sound _gem_accept functions:95 _display_warning _dlb_fgetc _doattributes _dochug _dochugw functions:96 _fill_point _fill_room _fill_zoo _fillholetyp _find_ac _find_branch _find_branch_room _find_defensive functions:96 _get_mon_location _get_mplname _get_obj_location _get_rect _get_rect_ind _get_room_loc _get_scr_size _get_shop_item functions:97 _get_uchars _get_unused_cs _get_valuables _get_wall_for_db _get_wet _get_wormno _getbones _getdir functions:98 _gethungry functions:99 _gettty _getversionstring _getyear _ggetobj _ghitm _ghod_hitsu _ghost_from_bottle _ghostfruit functions:100 _givit _glibr _Gloves_off _Gloves_on _glyph_at _god_zaps_you _gods_angry _gods_upset functions:101 _godvoice _gold_detect _golemeffects _golemhp _goodfruit _goodpos _goto_hell _goto_level functions:102 _gr_finish _gr_init _graphics_opts _grddead _grease_protect _grow_up _growl _growl_sound functions:103 _guardname _gulpmm _gulpmu _gulpum _gush _hack_artifacts _has_dnstairs functions:104 _has_shrine _has_upstairs _hatch_egg _hates_silver _have_lizard _hcolor _heal_legs _healup functions:105 _Hear_again _Helmet_off _Helmet_on _help_menu _help_monster_out _hero_breaks _hidden_gold _HideCursor functions:106 _highc _histemple_at _hit _hitfloor _hitmm _hitmsg _hitmu _hitum functions:107 _hitval _hmon _hmon_hitmon _hmonas _hold_another_object _holetime _home _home_shk functions:108 _homebase _hooked_tty_getlin _hot_pursuit _hurtarmor _hurtle _identify _identify_pack _impact_drop functions:110 _in_trouble _In_V_tower _In_W_tower _in_your_sanctuary _incr_itimeout _induced_align _inherits _inhishop functions:111 _init_artifacts _init_attr _init_dungeons _init_fill _init_level _init_map _init_objects functions:112 _init_oracles _init_rect _init_rumors _init_ttycolor _init_uhunger _initedog _initoptions _initrack functions:113 _initworm _insert_branch _insert_timer _inside_room _inside_shop _instapetrify _intemple _interesting_to_discover functions:114 _intermed _intervene _intrinsic_possible _inv_cnt _inv_weight _invault _invdisp_nothing _inven_inuse functions:115 _invert_all _invert_all_on_page _Invocation_lev _invocation_message _invocation_pos _Is_botlevel _Is_branchlev _is_chargeable functions:116 _is_db_wall _is_drawbridge_wall _is_edible _is_fainted _is_flammable _is_fshk _is_home_elemental _is_ice ;functions:117 functions:118 _is_worn _is_worn_by_type _isbig _isclearpath functions:119 _itimeout_incr _its_dead _itsstuck _Japanese_item_name _join _join_map _jump _keepdogs functions:119 _sticks _still_chewing _stock_room _stolen_container _stolen_value _stone_luck _stoned_dialogue _stop_occupation functions:120 _kick_monster _kick_object _kickdmg _kickstr _kill_egg _kill_eggs _kill_genocided_monsters _killed functions:121 _kind_name _known_hitum _kops_gone _l_monnam _lantern_message _launch_obj _lava_effects functions:122 _ldrname _leader_speaks _learn_egg_type _ledger_no _ledger_to_dlev _ledger_to_dnum functions:123 _left_side _lesshungry _let_to_name _letter _lev_by_name _level_difficulty _level_distance _level_range functions:124 _level_tele _level_tele_trap _levl_follower _lifesaved_monster _lift_object _light_cocktail _light_region _lined_up functions:125 _linedup _list_genocided _list_vanquished _litroom _litter _little_to_big _llord _lminion functions:126 _load_common_data _load_maze _load_one_engraving _load_one_monster _load_one_object _load_qtlist _load_rooms _load_special functions:127 _loadfruitchn _lock_action _lock_file _locomotion _lookaround _lookat _lookup_id_mapping _lose_weapon_skill functions:128 _losedogs _losehp _losespells _losestr _losexp _m_arrival functions:129 _m_carrying _m_detach _m_dowear _m_dowear_type _m_initgrp _m_initinv _m_initthrow _m_initweap functions:130 _m_lose_armor functions:131 _m_useup _make_angry_shk _make_blinded _make_confused _make_corpse _make_engr_at _make_familiar _make_hallucinated functions:132 _make_happy_shk _make_lockname _make_niches _make_sick _make_stunned _make_vomiting _makecorridors _makedog functions:133 _makekops _makelevel _makemaz _makemon _makeniche _makeplural _makerogueghost _makeroguerooms functions:134 _makerooms functions:135 _map_menu_cmd _map_object _map_trap _match_optname _mattackm _mattacku _max_capacity _max_mon_load functions:136 _max_passive_dmg _max_rank_sz _maxledgerno _may_dig _may_passwall _maybe_write_ls _maybe_write_timer _mayberem functions:137 _maze0xy _maze1xy _mazexy _mb_trapped _mbag_explodes _mbhit _mbhitm _mcalcdistress functions:138 _md_rush _md_start _md_stop _mdig_tunnel functions:139 _meatobj _melt_ice _menu_drop _menu_identify _menu_loot _menu_remarm _mergable _merge_choice functions:140 _merged _mfndpos _midnight _migrate_to_level _mineralize _minit _miniwalk _minstapetrify functions:140 _On_stairs _on_start _On_W_tower_level _oname _onbill _online2 _only_here _onlyspace functions:141 _mintrap functions:142 _mk_bubble _mk_knox_portal _mk_mplayer _mk_named_object _mk_roamer _mk_tt_object _mkaltar _mkbox_cnts functions:143 _mkcavearea _mkcavepos _mkclass _mkcorpstat _mkfount _mkgold _mkgoldobj _mkinvokearea functions:144 _mkinvpos _mklev _mkmap _mkobj _mkobj_at _mkportal _mkroll_launch _mkroom functions:145 _mkshobj_at _mkshop _mksink _mksobj _mksobj_at _mkstairs _mkswamp _mktemple functions:146 _mktrap _mkundead _mkzoo _mlevel_tele_trap _mlifesaver _mnearto _mnexto _mon_arrive functions:147 _mon_break_armor _mon_catchup_elapsed_time _mon_chain _mon_has_amulet _mon_has_arti _mon_has_special _mon_invent_chain _mon_is_local functions:148 _mon_nam _mon_nam_too _mon_owns _mon_reflects _mon_regen _mon_set_minvis _mon_to_stone _mon_wield_item functions:149 _mondead _mondied _mongets _mongone _monkilled _Monnam _monnear functions:150 _monst_init _monster_detect _monster_nearby _monstinroom _monstone _monstr_init _more _more_experienced functions:151 _morehungry _morguemon _move_gold _move_into_trap _move_special functions:153 _mpickobj functions:154 _mselftouch _msg_in _msleep _msmsg _mstatusline _msummon _mswings _mswingsm functions:155 _mtele_trap _mungspaces _munstone _mv_bubble _mvault_tele _mzapmsg _n_or_more _name_to_mon functions:156 _nameshk _nartifact_exist _nasty _ndemon _near_capacity _nemdead _nemesis_speaks _neminame functions:157 _nethack_exit _new_light_source _new_were _newcham _newexplevel _newgame _newhp _newmail functions:158 _newman _newuexp _newuhs _next_level _next_opt _next_shkp _next_to_u functions:159 _nexttodoor _nh_timeout _nhusage _night _nmcpy _no_bones_level _noattacks _nocmov functions:160 _nohandglow _noises _nomul _Norep _not_capable _not_fully_identified _number_leashed _o_in functions:161 _o_on _o_unleash _obfree _obj_chain _obj_delivery _obj_extract_self _obj_here _obj_ice_effects functions:162 _obj_is_burning _obj_is_local _obj_is_pname _obj_merge_light_sources _obj_move_light_source _obj_move_timers _obj_resists _obj_sanity_check functions:163 _obj_sheds_light _obj_shudders _obj_split_light_source _obj_split_timers _obj_stop_timers _obj_to_let _object_detect _objects_init functions:164 _observable_depth _obstructed _oc_to_str _occupied _off_msg _ohitmon _oinit _ok_to_quest functions:165 _okay functions:167 _onquest _onscary _open_bonesfile _open_drawbridge _open_levelfile _open_library _open_savefile _openit functions:168 _openone _OpenTileFile _opentin _option_help _oselect _other_mon_has_arti _otransit_msg functions:169 _out_container _outentry _outheader _outoracle _outrumor _p_coaligned _pacify_guards _pacify_shk functions:170 _panic _parent_dlevel _parent_dnum _parse _parse_config_line _parseoptions _pass_one _pass_three functions:171 _pass_two _passive _passivemm _passiveum _pay _pay_for_damage _paybill _paygd functions:172 _pckeys _peace_minded _peek_at_iced_corpse_age _peffects _pet_type _pgetchar _phase_of_the_moon functions:173 _pick_level _pick_lock _pick_obj _pick_room _picked_container _picking_at _picking_lock _picklock functions:174 _pickup _pickup_object _place_branch _place_level _place_lregion _place_niche _place_object _place_worm_tail_randomly functions:175 _place_wsegs _placebc _playwoRAMdisk _pleased _pline _pline_The _plnamesuffix _pluslvl functions:176 _pmatch _poisoned _poisontell _poly_gender _poly_obj _poly_when_stoned _polyman _polymon functions:177 _polyself _polyuse _port_help _pos_to_room _positionbar _possible_places _possibly_unwield _potionbreathe functions:178 _potionhit _prayer_done _precheck _prev_level _pri_move _price_quote _priest_talk _priestini functions:179 _priestname _print_branch _print_dungeon _print_queue _prinv _probe_monster _process_menu_window _process_text_window functions:180 _pronoun_gender _protects _prscore _punish _pushch _put_monsters_to_sleep _putsyms functions:181 _qt_montype _qt_pager _query_category _query_classes _query_objlist _quest_chat _quest_info functions:182 _quest_stat_check _quest_talk _random_dir _random_engraving _random_teleport_level _ranged_attk functions:183 _rank _rank_of _raw_printf _read_config_file _read_engr_at _readchar _readentry functions:184 _readmail _readobjnam _ReadPlanarTileFile _ReadPlanarTileFile_O _ReadTileFileHeader _reassign _recalc_wt _recharge functions:185 _record_exists _redist_attr _redotoplin _regularize _rehumanize _rejectoption _relink_light_sources _relink_timers functions:186 _relmon _remember_topl _remove_damage _remove_object _remove_rect _remove_timer _remove_worm functions:187 _removetopl _reorder_invent _repair_damage _replmon _replshk _rescham _reset_attribute_clock functions:188 _reset_eat _reset_faint _reset_hostility _reset_occupations _reset_pick _reset_remarm _reset_rndmonst _reset_trapset functions:189 _resetobjs _resist _resists_blnd _resists_drli _resists_magm _rest_engravings _rest_room _rest_rooms functions:190 _rest_worm _restartcham _restdamage _restfakecorr _restgamestate _restlevchn _restlevelfile _restlevelstate functions:191 _restmonchn _restnames _restobjchn _restore_artifacts _restore_attrib _restore_dungeon _restore_light_sources _restore_oracles functions:192 _restore_saved_game _restore_timers _restore_waterlevel _restpriest _restrap _restrict_name _restshk _resurrect functions:193 _reverse _revive _revive_corpse _revive_egg _revive_mon _revive_nasty _reward_untrap _rhack functions:194 _right_side _rile_shk _Ring_gone _Ring_off _Ring_off_or_gone _Ring_on _rloc _rloc_engr functions:195 _rloc_pos_ok _rloc_to _rloco _rm_waslit _rnd_class _rnd_defensive_item functions:196 _rnd_misc_item _rnd_offensive_item _rnd_rect _rndcurse _rnddoor _rndexp _rndghostname _rndmonnam functions:197 _rndmonnum _rndmonst _rndtrap _rne _rnl _rnz _rogue_vision _roguecorr functions:198 _roguejoin _roguename _rot_corpse _rot_organic _rottenfood _rounddiv _row_refresh _run_timers functions:199 _rust_dmg _s_suffix _safe_teleds _saleable _same_price _sanity_check _save_artifacts _save_currentstate functions:200 _save_dungeon _save_engravings _save_light_sources _save_oracles _save_room _save_rooms _save_savefile_name _save_timers functions:201 _save_waterlevel _save_worm _savebones _savech _savedamage _saveDiskPrompt _savefruitchn _savegamestate functions:202 _savelev _savelev0 _savelevchn _savelife _savemonchn _savenames _saveobjchn _savestateinlock functions:203 _savetrapchn _scatter _schedule_goto _score_wanted _search_door _search_special _searches_for_item _see_lamp_flicker functions:204 _see_monsters _see_objects _see_traps _see_wsegs _seemimic _seetrap _seffects _select_hwep functions:205 _select_off _select_rwep _selftouch _sellobj _sellobj_state _sengr_at _sense_trap functions:206 _set_all_on_page _set_apparxy _set_artifact_intrinsic _set_bc _set_bonesfile_name _set_bonestemp_name _set_corn _set_cost functions:207 _set_crosswall _set_entity _set_item_state _set_itimeout _set_levelfile_name _set_lit _set_lock_and_bones _set_malign functions:208 _set_mimic_blocking _set_mimic_sym _set_mon_data _set_moreluck _set_occupation _set_repo_loc _set_residency _set_savefile_name functions:209 _set_seenv _set_trap _set_twall _set_uasmon _set_wall _set_wall_property _set_wall_state _set_wear functions:210 _set_wounded_legs _set_wportal _setclipped _setftty _setgemprobs _setmangry _setnotworn _setpaid functions:211 _setrandom _settrack _settty _setup_waterlevel _setuwep _setworn _sgn _Shield_off functions:212 _shieldeff _ship_object _shk_chat _shk_embellish _shk_move _shk_names_obj _shk_owns _shk_your functions:213 _Shk_Your _shkcatch _shkgone _shkinit _shkname _sho_obj_return_to_u _shop_debt _shop_keeper functions:214 _shop_object _shopdig _shopper_financial_report _shrine_pos _shrink_worm _shuffle functions:215 _shuffle_all _shuffle_tiles _simple_look _singular _sitoa _skill_advance _skill_init _skill_level_name functions:216 _skinback _sleep_monst _slept_monst _slip_or_trip _sliparm _slots_required _snuff_candle _snuff_light_source functions:217 _snuff_lit _sobj_at _some_armor _somegold _somex _somexy _somey _sort_rooms functions:218 _sort_valuables _sp_lev_shuffle _spec_ability _spec_abon _spec_applies _spec_dbon _spell_damage_bonus _spell_hit_bonus functions:219 _spell_skilltype _spelleffects _spitmu _splatter_burning_oil _split_mon _split_rects _splitbill _splitobj functions:220 _spoteffects _squadmon _srandom _stackobj _standoutbeg _standoutend _start_corpse_timeout _start_eating functions:221 _start_engulf _start_timer _start_tin _steal _steal_it _stealamulet _stealarm _stealgold functions:223 _stop_timer _store_version _strange_feeling _strategy _string_for_env_opt _string_for_opt _strncmpi _strprepend functions:224 _strstri _study_book _stumble_onto_mimic _sub_one_frombill _subfrombill _substitute_tiles _summon_minion _surface functions:225 _swallow_to_glyph _swapin_file _swapout_oldest _switch_graphics _switchar _t_warn functions:226 _tabexpand _tactics _take_gold _take_off _tamedog _target_on _tele _tele_jump_ok functions:227 _tele_restrict _tele_trap _teleds _teleok _teleport_pet _temple_occupied _tended_shop _term_end_attr functions:228 _term_end_color functions:229 _The _this_type_only _thitm _thitmonst _thitu _throw_gold _throwing_weapon _throwit functions:230 _thrwmu _tileview _timed_occupation _timer_is_local _timer_sanity_check _tinnable _title_to_mon _tmp_at functions:231 _topl_putsym _topologize _topten _topten_print _topten_print_bold _toss_up _toss_wsegs _touch_artifact functions:232 _touchfood _trap_detect _trickery _try_disarm _try_lift _trycall _tt_oname _tty_add_menu functions:233 _tty_askname _tty_clear_nhwindow _tty_cliparound functions:234 _tty_display_file _tty_display_nhwindow _tty_doprev_message _tty_end_menu _tty_end_screen _tty_exit_nhwindows _tty_get_ext_cmd _tty_get_nh_event functions:235 _tty_getlin _tty_init_nhwindows _tty_mark_synch _tty_message_menu _tty_nh_poskey _tty_nhbell _tty_nhgetch _tty_number_pad functions:236 _tty_player_selection _tty_raw_print _tty_raw_print_bold _tty_resume_nhwindows _tty_select_menu functions:237 _tty_start_menu _tty_start_screen _tty_startup _tty_suspend_nhwindows _tty_update_inventory _tty_yn_function functions:238 _txt_backsp _txt_cl_end _txt_cl_eos _txt_clear_screen _txt_get_scr_size _txt_monoadapt_check functions:239 _txt_nhbell _txt_startup _u_entered_shop _u_gname _u_init functions:240 _u_left_shop _u_on_dnstairs _u_on_newpos _u_on_sstairs _u_on_upstairs _u_slip_free _u_slow_down _u_teleport_mon functions:241 _u_to_e _u_wipe_engr _ugolemeffects _um_dist _unbless _unblock_point _uncommon _uncompress functions:242 _unconscious _uncurse _undead_to_corpse _under_ground _under_water _undiscover_object _unearth_objs _unfaint functions:243 _unleash_all _unload_qtlist _unlock_file _unmap_object _unmul _unpaid_cost _unplacebc _unpunish functions:244 _unrestrict_weapon_skill _unset_all_on_page _unsetup_waterlevel _unstuck _untrap _untrap_prob _unturn_dead _update_mon_intrinsics functions:245 _update_topl _uptodate _urustm _use_bell _use_camera _use_candelabrum _use_candle _use_container functions:246 _use_crystal_ball _use_defensive _use_figurine _use_grease _use_lamp _use_leash _use_magic_whistle _use_mirror functions:247 _use_misc _use_offensive _use_pick_axe _use_skill _use_stethoscope _use_tinning_kit _use_towel _use_trap functions:248 _use_unicorn_horn _use_whip _use_whistle _useup _useupall _useupf _ustatusline _uunstick functions:249 _uwepgone _vault_occupied _vault_tele _verbalize _vga_backsp _vga_cl_end _vga_cl_eos _vga_clear_screen functions:250 _vga_cliparound _vga_detect _vga_DisplayCell _vga_DisplayCell_O _vga_DrawCursor _vga_Finish _vga_FontPtrs _vga_get_scr_size functions:251 _vga_gotoloc _vga_HideCursor _vga_Init _vga_overview _vga_redrawmap _vga_refresh _vga_SetPalette _vga_SwitchMode functions:252 _vga_traditional _vga_tty_end_screen _vga_tty_startup _vga_update_positionbar _vga_userpan _vga_WriteChar _vga_WriteStr _vga_xputc functions:254 _vision_reset _dodiscovered _dodoor _dodown _dodrink _dodrop _doeat _doengrave functions:255 _wallification _wallify_map _wallify_vault _wantdoor _watch_on_duty _water_damage _water_friction functions:256 _water_prayer _weapon_dam_bonus _weapon_hit_bonus _weapon_type _wearing_armor _weffects _weight functions:257 _weight_cap functions:258 _whimper _wield_tool _wildmiss _win_tty_init _wipe_engr_at _wipeoff _wipeout_text functions:259 _wiz_detect _wiz_genesis _wiz_identify _wiz_level_tele _wiz_light_sources _wiz_map _wiz_show_seenv _wiz_show_vision functions:260 _wiz_show_wmodes _wiz_timeout_queue _wiz_where _wiz_wish _wizdead _worm_known _worm_move _worm_nomove functions:261 _wormgone _wormhitu _worn_wield_only _write_ls _writeentry _wrong_elem_type _x_monnam _xcrypt _xkilled _xlev_to_rank _xname _xprname functions:263 _xytod _yelp _yname _Yname2 _You _you_aggravate _You_cant _You_feel _you_have _You_hear _you_unwere _you_were _Your _zap_dig functions:265 _zap_hit _zap_over_floor _zap_updown _zapdir_to_glyph _zapnodir _zappable _zapyourself _zhitm _zhitu _put_lregion_here _role_init ; tuning ; this was 23 functions:266 _bp_to_obj ; the next two were 238 functions:268 _aggravate ; the following were 118 ;functions:269 ; the following were 261 ;functions:270 functions:271 _xputg functions:272 _xputs _xwaitforspace ; the following were 158 functions:273 _enermod _enlightenment ; the following was 214 ;functions:274 _enter_explore_mode ; the following were 26 functions:275 _bydoor functions:276 _calc_capacity _call_kops _calm_nymphs functions:277 _can_advance _can_be_hatched functions:278 _can_carry ; the following were 239 functions:279 _equipname functions:280 _txt_xputs ; the following were 80 functions:281 _enexto ;functions:282 functions:283 _enhance_weapon_skill ; the following were 165 functions:284 _okdoor functions:285 _omon_adj functions:286 _on_goal functions:287 _on_ground functions:288 _b_trapped functions:289 _on_locate functions:290 _on_msg ; the following were 182 functions:291 _y_monnam ; the following were 195 ;functions:293 ; the following were 225 functions:294 _erode_armor functions:295 _swallowed ; the following were 7 functions:298 _acurrstr ; the following were 17 functions:299 _attacktype functions:300 _attrcurse functions:301 _automiss functions:302 _autopick ; the following were 10 functions:303 _adj_abon functions:304 _adj_lev functions:305 _adjabil functions:306 _adjalign functions:307 _adjattrib ; was 53 functions:308 _display_monster functions:309 _error ; was 117 ;functions:310 functions:311 _is_ok_location ;functions:312 functions:313 _is_pure functions:314 _is_quest_artifact ; was 236 functions:316 _tty_putstr _tty_putsym ; was 81 functions:318 _escapes functions:319 _erase_menu_or_text functions:320 _eraseall ; tuning 2 ; was 269 functions:321 _weldmsg _were_change _were_summon functions:322 _where_name _which_armor _which_arti functions:325 _term_end_raw_bold functions:326 _term_start_attr ;functions:327 functions:328 _term_start_raw_bold functions:329 _terminate functions:330 _tgetch functions:331 _the functions:332 _m_monnam functions:333 _domagictrap _domindblast _domonability functions:334 _m_respond functions:335 _m_slips_free functions:336 _m_throw functions:337 _m_to_e functions:338 _m_unleash functions:339 _mpickstuff functions:340 _mplayer_talk functions:341 _mpoisons_subj functions:342 _mquaffmsg functions:343 _miss functions:344 _mreadmsg functions:345 _mrustm functions:346 _vomit _vomiting_dialogue functions:347 _wake_nearby functions:348 _wake_nearto functions:349 _wakeup functions:350 _walkfrom functions:351 _wall_angle functions:352 _able_to_loot _add_mon_to_reg _add_rect_to_reg _add_region _addinv_core1 functions:352 _addinv_core2 _age_spells _align_gtitle _align_shift _align_str _all_but_uchain functions:353 _allow_all _allow_category _already_wearing _already_wearing2 _angrygods functions:354 _animate_statue _antholemon _arti_speak _assign_warnings _attach_fig_transform_timeout _blocked_boulder functions:355 _book_substitution _burn_away_slime _can_blnd _can_ride _can_saddle _can_twoweapon functions:356 _carry_obj_effects _clear_regions _container_at _coyotename _create_gas_cloud _create_region functions:357 _describe_level _dfeature_at _dig_up_grave _discover_artifact _dismount_steed _disp_artifact_discoveries functions:359 _doconduct _dofire _doprinuse _doride _doswapweapon _dotwoweapon functions:360 _dowieldquiver _drain_item _exercise_steed _expire_gas_cloud _extcmd_via_menu _feature_alert_opts functions:361 _fig_transform _figurine_location_checks _final_level _find_trap _finish_quest _fix_petrification functions:362 _food_substitution _fqname _free_invbuf _free_region _free_youbuf _freeinv_core functions:363 _fuzzymatch _get_compopt_value _get_current_feature_ver _get_feature_notice_ver _get_mtraits _getlev functions:364 _getlock _getobj _getpos _give_may_advance_msg _Goodbye _halu_gname functions:365 _Hello _hurtle_step _hurtmarmor _in_out_region _initialspell _inside_gas_cloud functions:366 _inside_rect _inside_region _kick_steed _look_here _m_in_out_region _make_grave functions:367 _mbodypart _mdamagem _mdamageu _minimal_enlightenment _mk_mplayer_armor _mm_aggression functions:368 _mon_adjust_speed _mon_animal_list _mon_beside _mon_in_region _montraits _mount_steed functions:369 _noit_mon_nam _noit_Monnam _noncoalignment _num_genocides _obj_attach_mid _obj_timer_checks functions:370 _obj_typename _ok_align _ok_gend _ok_race _ok_role _ordin functions:371 _pick_align _pick_animal _pick_gend _pick_nasty _pick_race _pick_role functions:372 _place_monster _pm_to_cham _prisoner_speaks _process_options _randalign _randgend functions:373 _randrace _randrole _realloc_obj _relobj _remove_mon_from_reg _remove_region functions:374 _remove_worn_item _replace_object _reset_oattached_mids _rest_regions _restore_cham _rnd_treefruit_at functions:375 _save_regions _select_newcham_form _self_invis_message _setuqwep _setuswapwep _show_conduct functions:376 _show_region _simple_typename _slime_dialogue _sokoban_detect _spec_m2 _special_handling functions:377 _str2align _str2gend _str2race _str2role _There _throw_obj functions:378 _tmiss _tty_update_positionbar _tty_wait_synch _undiscovered_artifact _untwoweapon _update_mlstmv functions:379 _update_monster_region _update_player_regions _uqwepgone _ureflects _use_grapple _use_pole functions:380 _use_saddle _uswapwepgone _uwep_skill_type _validalign _validgend _validrace functions:381 _validrole _violated_vegetarian _walk_path _warning_opts _wary_dog _welcome functions:382 _write_timer _yyyymmdd _zap_steed functions:383 _getprice _getreturn _getrumor _gettrack functions:384 _ini_inv _knows_object _knows_class _restricted_spell_discipline _ready_weapon functions:385 _doname _Doname2 functions:386 _minliquid functions:387 _missmm functions:388 _missmu functions:389 _missum functions:390 _mixtype _mk_artifact functions:391 _makesingular functions:392 _maketrap _makevtele _makewish slashem-0.0.7E7F3/sys/msdos/2xsai.c0000664000076400007640000006551310545462317015023 0ustar aliali/* Modified 2xSaI code - thanks to Kreed for supplying original source * * Fixed the for loops so that they don't declare variables (C convention) * Replaced all // comments (C convention) * Hopefully, all the code is certified C code :) * * Added basic transparent pixel detection (color 255, 0, 255) * (#define DETECT_TRANSPARENT_PIXELS) * -transparent pixels are now converted internally to black * -if original pixel was transparent and the changed pixel is still black * after modification, the new pixel is also transparent */ #include "2xsai.h" #define DETECT_TRANSPARENT_PIXELS bool mmx_cpu = false; static uint32 colorMask = 0xF7DEF7DE; static uint32 lowPixelMask = 0x08210821; static uint32 qcolorMask = 0xE79CE79C; static uint32 qlowpixelMask = 0x18631863; #ifdef DETECT_TRANSPARENT_PIXELS #define TRANS_COLOR16 0xF81F #define TRANS_COLOR15 0x7C1F static uint16 transpixelcolor = TRANS_COLOR16; #endif #include int Init_2xSaI(uint32 BitFormat) { if (BitFormat == 565) { colorMask = 0xF7DEF7DE; lowPixelMask = 0x08210821; qcolorMask = 0xE79CE79C; qlowpixelMask = 0x18631863; #ifdef DETECT_TRANSPARENT_PIXELS transpixelcolor = TRANS_COLOR16; #endif } else if (BitFormat == 555) { colorMask = 0x7BDE7BDE; lowPixelMask = 0x04210421; qcolorMask = 0x739C739C; qlowpixelMask = 0x0C630C63; #ifdef DETECT_TRANSPARENT_PIXELS transpixelcolor = TRANS_COLOR15; #endif } else { return 0; } #ifdef MMX Init_2xSaIMMX(BitFormat); #endif return 1; } STATIC inline int GetResult1(uint32 A, uint32 B, uint32 C, uint32 D, uint32 E) { int x = 0; int y = 0; int r = 0; if (A == C) x+=1; else if (B == C) y+=1; if (A == D) x+=1; else if (B == D) y+=1; if (x <= 1) r+=1; if (y <= 1) r-=1; return r; } STATIC inline int GetResult2(uint32 A, uint32 B, uint32 C, uint32 D, uint32 E) { int x = 0; int y = 0; int r = 0; if (A == C) x+=1; else if (B == C) y+=1; if (A == D) x+=1; else if (B == D) y+=1; if (x <= 1) r-=1; if (y <= 1) r+=1; return r; } STATIC inline int GetResult(uint32 A, uint32 B, uint32 C, uint32 D) { int x = 0; int y = 0; int r = 0; if (A == C) x+=1; else if (B == C) y+=1; if (A == D) x+=1; else if (B == D) y+=1; if (x <= 1) r+=1; if (y <= 1) r-=1; return r; } STATIC inline uint32 INTERPOLATE(uint32 A, uint32 B) { if (A !=B) { return ( ((A & colorMask) >> 1) + ((B & colorMask) >> 1) + (A & B & lowPixelMask) ); } else return A; } STATIC inline uint32 Q_INTERPOLATE(uint32 A, uint32 B, uint32 C, uint32 D) { register uint32 x = ((A & qcolorMask) >> 2) + ((B & qcolorMask) >> 2) + ((C & qcolorMask) >> 2) + ((D & qcolorMask) >> 2); register uint32 y = (A & qlowpixelMask) + (B & qlowpixelMask) + (C & qlowpixelMask) + (D & qlowpixelMask); y = (y>>2) & qlowpixelMask; return x+y; } #define HOR #define VER void Super2xSaI(uint8 *srcPtr, uint32 srcPitch, uint8 *deltaPtr, uint8 *dstPtr, uint32 dstPitch, int width, int height) { uint32 *dP; uint16 *bP; #ifdef MMX_BLA /* no MMX version yet */ if (cpu_mmx && width != 512) { for (height; height; height-=1) { bP = (uint16 *) srcPtr; xP = (uint16 *) deltaPtr; dP = (uint32 *) dstPtr; _2xSaISuperEagleLine ((uint8 *) bP, (uint8 *) xP, srcPitch, width, (uint8 *) dP, dstPitch); dstPtr += dstPitch << 1; srcPtr += srcPitch; deltaPtr += srcPitch; } } else { #endif uint32 Nextline = srcPitch >> 1; for (height; height; height-=1) { uint32 finish; bP = (uint16 *) srcPtr; dP = (uint32 *) dstPtr; for (finish = width; finish; finish -= 1 ) { uint32 color4, color5, color6; uint32 color1, color2, color3; uint32 colorA0, colorA1, colorA2, colorA3, colorB0, colorB1, colorB2, colorB3, colorS1, colorS2; uint32 product1a, product1b, product2a, product2b; #ifdef DETECT_TRANSPARENT_PIXELS bool trans1 = 0, trans2 = 0; #endif /* *--------------------------------------- B1 B2 * 4 5 6 S2 * 1 2 3 S1 * A1 A2 */ colorB0 = *(bP- Nextline - 1); colorB1 = *(bP- Nextline); colorB2 = *(bP- Nextline + 1); colorB3 = *(bP- Nextline + 2); color4 = *(bP - 1); color5 = *(bP); color6 = *(bP + 1); colorS2 = *(bP + 2); color1 = *(bP + Nextline - 1); color2 = *(bP + Nextline); color3 = *(bP + Nextline + 1); colorS1 = *(bP + Nextline + 2); colorA0 = *(bP + Nextline + Nextline - 1); colorA1 = *(bP + Nextline + Nextline); colorA2 = *(bP + Nextline + Nextline + 1); colorA3 = *(bP + Nextline + Nextline + 2); #ifdef DETECT_TRANSPARENT_PIXELS if (color5 == transpixelcolor) trans1 = 1; if (color2 == transpixelcolor) trans2 = 1; if (colorB0 == transpixelcolor) colorB0 = 0; if (colorB1 == transpixelcolor) colorB1 = 0; if (colorB2 == transpixelcolor) colorB2 = 0; if (colorB3 == transpixelcolor) colorB3 = 0; if (color4 == transpixelcolor) color4 = 0; if (color5 == transpixelcolor) color5 = 0; if (color6 == transpixelcolor) color6 = 0; if (colorS2 == transpixelcolor) colorS2 = 0; if (color1 == transpixelcolor) color1 = 0; if (color2 == transpixelcolor) color2 = 0; if (color3 == transpixelcolor) color3 = 0; if (colorS1 == transpixelcolor) colorS1 = 0; if (colorA0 == transpixelcolor) colorA0 = 0; if (colorA1 == transpixelcolor) colorA1 = 0; if (colorA2 == transpixelcolor) colorA2 = 0; if (colorA3 == transpixelcolor) colorA3 = 0; #endif /*--------------------------------------*/ if (color2 == color6 && color5 != color3) { product2b = product1b = color2; } else if (color5 == color3 && color2 != color6) { product2b = product1b = color5; } else if (color5 == color3 && color2 == color6 && color5 != color6) { register int r = 0; r += GetResult (color6, color5, color1, colorA1); r += GetResult (color6, color5, color4, colorB1); r += GetResult (color6, color5, colorA2, colorS1); r += GetResult (color6, color5, colorB2, colorS2); if (r > 0) product2b = product1b = color6; else if (r < 0) product2b = product1b = color5; else { product2b = product1b = INTERPOLATE (color5, color6); } } else { #ifdef VER if (color6 == color3 && color3 == colorA1 && color2 != colorA2 && color3 != colorA0) product2b = Q_INTERPOLATE (color3, color3, color3, color2); else if (color5 == color2 && color2 == colorA2 && colorA1 != color3 && color2 != colorA3) product2b = Q_INTERPOLATE (color2, color2, color2, color3); else #endif product2b = INTERPOLATE (color2, color3); #ifdef VER if (color6 == color3 && color6 == colorB1 && color5 != colorB2 && color6 != colorB0) product1b = Q_INTERPOLATE (color6, color6, color6, color5); else if (color5 == color2 && color5 == colorB2 && colorB1 != color6 && color5 != colorB3) product1b = Q_INTERPOLATE (color6, color5, color5, color5); else #endif product1b = INTERPOLATE (color5, color6); } #ifdef HOR if (color5 == color3 && color2 != color6 && color4 == color5 && color5 != colorA2) product2a = INTERPOLATE (color2, color5); else if (color5 == color1 && color6 == color5 && color4 != color2 && color5 != colorA0) product2a = INTERPOLATE(color2, color5); else #endif product2a = color2; #ifdef HOR if (color2 == color6 && color5 != color3 && color1 == color2 && color2 != colorB2) product1a = INTERPOLATE (color2, color5); else if (color4 == color2 && color3 == color2 && color1 != color5 && color2 != colorB0) product1a = INTERPOLATE(color2, color5); else #endif product1a = color5; #ifdef DETECT_TRANSPARENT_PIXELS if (trans1 && !product1a) product1a = transpixelcolor; if (trans1 && !product1b) product1b = transpixelcolor; if (trans2 && !product2a) product2a = transpixelcolor; if (trans2 && !product2b) product2b = transpixelcolor; #endif product1a = product1a | (product1b << 16); product2a = product2a | (product2b << 16); *(dP) = product1a; *(dP+(dstPitch>>2)) = product2a; bP += 1; dP += 1; } /* end of for ( finish= width etc..) */ dstPtr += dstPitch << 1; srcPtr += srcPitch; deltaPtr += srcPitch; }; /* endof: for (height; height; height--) */ #ifdef MMX_BLA } #endif } /*ONLY use with 640x480x16 or higher resolutions*/ /*Only use this if 2*width * 2*height fits on the current screen*/ void SuperEagle(uint8 *srcPtr, uint32 srcPitch, uint8 *deltaPtr, uint8 *dstPtr, uint32 dstPitch, int width, int height) { uint32 *dP; uint16 *bP; uint16 *xP; #ifdef MMX if (mmx_cpu && width != 512) { for (height; height; height-=1) { bP = (uint16 *) srcPtr; xP = (uint16 *) deltaPtr; dP = (uint32 *) dstPtr; _2xSaISuperEagleLine ((uint8 *) bP, (uint8 *) xP, srcPitch, width, (uint8 *)dP, dstPitch); dstPtr += dstPitch << 1; srcPtr += srcPitch; deltaPtr += srcPitch; } } else { #endif uint32 Nextline = srcPitch >> 1; for (height; height; height-=1) { uint32 finish; bP = (uint16 *) srcPtr; dP = (uint32 *) dstPtr; for (finish = width; finish; finish -= 1 ) { uint32 color4, color5, color6; uint32 color1, color2, color3; uint32 colorA0, colorA1, colorA2, colorA3, colorB0, colorB1, colorB2, colorB3, colorS1, colorS2; uint32 product1a, product1b, product2a, product2b; #ifdef DETECT_TRANSPARENT_PIXELS bool trans1 = 0, trans2 = 0; #endif colorB0 = *(bP- Nextline - 1); colorB1 = *(bP- Nextline); colorB2 = *(bP- Nextline + 1); colorB3 = *(bP- Nextline + 2); color4 = *(bP - 1); color5 = *(bP); color6 = *(bP + 1); colorS2 = *(bP + 2); color1 = *(bP + Nextline - 1); color2 = *(bP + Nextline); color3 = *(bP + Nextline + 1); colorS1 = *(bP + Nextline + 2); colorA0 = *(bP + Nextline + Nextline - 1); colorA1 = *(bP + Nextline + Nextline); colorA2 = *(bP + Nextline + Nextline + 1); colorA3 = *(bP + Nextline + Nextline + 2); #ifdef DETECT_TRANSPARENT_PIXELS if (color5 == transpixelcolor) trans1 = 1; if (color2 == transpixelcolor) trans2 = 1; if (colorB0 == transpixelcolor) colorB0 = 0; if (colorB1 == transpixelcolor) colorB1 = 0; if (colorB2 == transpixelcolor) colorB2 = 0; if (colorB3 == transpixelcolor) colorB3 = 0; if (color4 == transpixelcolor) color4 = 0; if (color5 == transpixelcolor) color5 = 0; if (color6 == transpixelcolor) color6 = 0; if (colorS2 == transpixelcolor) colorS2 = 0; if (color1 == transpixelcolor) color1 = 0; if (color2 == transpixelcolor) color2 = 0; if (color3 == transpixelcolor) color3 = 0; if (colorS1 == transpixelcolor) colorS1 = 0; if (colorA0 == transpixelcolor) colorA0 = 0; if (colorA1 == transpixelcolor) colorA1 = 0; if (colorA2 == transpixelcolor) colorA2 = 0; if (colorA3 == transpixelcolor) colorA3 = 0; #endif /* -------------------------------------- */ if (color2 == color6 && color5 != color3) { product1b = product2a = color2; if ((color1 == color2 && color6 == colorS2) || (color2 == colorA1 && color6 == colorB2)) { product1a = INTERPOLATE (color2, color5); product1a = INTERPOLATE (color2, product1a); product2b = INTERPOLATE (color2, color3); product2b = INTERPOLATE (color2, product2b); #if 0 product1a = color2; product2b = color2; #endif } else { product1a = INTERPOLATE (color5, color6); product2b = INTERPOLATE (color2, color3); } } else if (color5 == color3 && color2 != color6) { product2b = product1a = color5; if ((colorB1 == color5 && color3 == colorA2) || (color4 == color5 && color3 == colorS1)) { product1b = INTERPOLATE (color5, color6); product1b = INTERPOLATE (color5, product1b); product2a = INTERPOLATE (color5, color2); product2a = INTERPOLATE (color5, product2a); #if 0 product1b = color5; product2a = color5; #endif } else { product1b = INTERPOLATE (color5, color6); product2a = INTERPOLATE (color2, color3); } } else if (color5 == color3 && color2 == color6 && color5 != color6) { register int r = 0; r += GetResult (color6, color5, color1, colorA1); r += GetResult (color6, color5, color4, colorB1); r += GetResult (color6, color5, colorA2, colorS1); r += GetResult (color6, color5, colorB2, colorS2); if (r > 0) { product1b = product2a = color2; product1a = product2b = INTERPOLATE (color5, color6); } else if (r < 0) { product2b = product1a = color5; product1b = product2a = INTERPOLATE (color5, color6); } else { product2b = product1a = color5; product1b = product2a = color2; } } else { if ((color2 == color5) || (color3 == color6)) { product1a = color5; product2a = color2; product1b = color6; product2b = color3; } else { product1b = product1a = INTERPOLATE (color5, color6); product1a = INTERPOLATE (color5, product1a); product1b = INTERPOLATE (color6, product1b); product2a = product2b = INTERPOLATE (color2, color3); product2a = INTERPOLATE (color2, product2a); product2b = INTERPOLATE (color3, product2b); } } #ifdef DETECT_TRANSPARENT_PIXELS if (trans1 && !product1a) product1a = transpixelcolor; if (trans1 && !product1b) product1b = transpixelcolor; if (trans2 && !product2a) product2a = transpixelcolor; if (trans2 && !product2b) product2b = transpixelcolor; #endif product1a = product1a | (product1b << 16); product2a = product2a | (product2b << 16); *(dP) = product1a; *(dP+(dstPitch>>2)) = product2a; bP += 1; dP += 1; } /* end of for ( finish= width etc..) */ dstPtr += dstPitch << 1; srcPtr += srcPitch; deltaPtr += srcPitch; }; /* endof: for (height; height; height--) */ #ifdef MMX } #endif } /*ONLY use with 640x480x16 or higher resolutions*/ /*Only use this if 2*width * 2*height fits on the current screen*/ void _2xSaI(uint8 *srcPtr, uint32 srcPitch, uint8 *deltaPtr, uint8 *dstPtr, uint32 dstPitch, int width, int height) { uint32 *dP; uint16 *bP; uint16 *xP; #ifdef MMX if (mmx_cpu && width != 512) { for (height; height; height-=1) { bP = (uint16 *) srcPtr; xP = (uint16 *) deltaPtr; dP = (uint32 *) dstPtr; _2xSaILine ((uint8 *) bP, (uint8 *) xP, srcPitch, width, (uint8 *)dP, dstPitch); dstPtr += dstPitch << 1; srcPtr += srcPitch; deltaPtr += srcPitch; } } else { #endif uint32 Nextline = srcPitch >> 1; for (height; height; height-=1) { uint32 finish; bP = (uint16 *) srcPtr; dP = (uint32 *) dstPtr; for (finish = width; finish; finish -= 1 ) { register uint32 colorA, colorB; uint32 colorC, colorD, colorE, colorF, colorG, colorH, colorI, colorJ, colorK, colorL, colorM, colorN, colorO, colorP; uint32 product, product1, product2; #ifdef DETECT_TRANSPARENT_PIXELS bool trans1 = 0, trans2 = 0; #endif /*--------------------------------------- * Map of the pixels: I|E F|J * G|A B|K * H|C D|L * M|N O|P */ colorI = *(bP- Nextline - 1); colorE = *(bP- Nextline); colorF = *(bP- Nextline + 1); colorJ = *(bP- Nextline + 2); colorG = *(bP - 1); colorA = *(bP); colorB = *(bP + 1); colorK = *(bP + 2); colorH = *(bP + Nextline - 1); colorC = *(bP + Nextline); colorD = *(bP + Nextline + 1); colorL = *(bP + Nextline + 2); colorM = *(bP + Nextline + Nextline - 1); colorN = *(bP + Nextline + Nextline); colorO = *(bP + Nextline + Nextline + 1); colorP = *(bP + Nextline + Nextline + 2); #ifdef DETECT_TRANSPARENT_PIXELS if (colorA == transpixelcolor) trans1 = 1; if (colorC == transpixelcolor) trans2 = 1; if (colorI == transpixelcolor) colorI = 0; if (colorE == transpixelcolor) colorE = 0; if (colorF == transpixelcolor) colorF = 0; if (colorJ == transpixelcolor) colorJ = 0; if (colorG == transpixelcolor) colorG = 0; if (colorA == transpixelcolor) colorA = 0; if (colorB == transpixelcolor) colorB = 0; if (colorK == transpixelcolor) colorK = 0; if (colorH == transpixelcolor) colorH = 0; if (colorC == transpixelcolor) colorC = 0; if (colorD == transpixelcolor) colorD = 0; if (colorL == transpixelcolor) colorL = 0; if (colorM == transpixelcolor) colorM = 0; if (colorN == transpixelcolor) colorN = 0; if (colorO == transpixelcolor) colorO = 0; if (colorP == transpixelcolor) colorP = 0; #endif if ((colorA == colorD) && (colorB != colorC)) { if ( ((colorA == colorE) && (colorB == colorL)) || ((colorA == colorC) && (colorA == colorF) && (colorB != colorE) && (colorB == colorJ)) ) { product = colorA; } else { product = INTERPOLATE(colorA, colorB); } if (((colorA == colorG) && (colorC == colorO)) || ((colorA == colorB) && (colorA == colorH) && (colorG != colorC) && (colorC == colorM)) ) { product1 = colorA; } else { product1 = INTERPOLATE(colorA, colorC); } product2 = colorA; } else if ((colorB == colorC) && (colorA != colorD)) { if (((colorB == colorF) && (colorA == colorH)) || ((colorB == colorE) && (colorB == colorD) && (colorA != colorF) && (colorA == colorI)) ) { product = colorB; } else { product = INTERPOLATE(colorA, colorB); } if (((colorC == colorH) && (colorA == colorF)) || ((colorC == colorG) && (colorC == colorD) && (colorA != colorH) && (colorA == colorI)) ) { product1 = colorC; } else { product1 = INTERPOLATE(colorA, colorC); } product2 = colorB; } else if ((colorA == colorD) && (colorB == colorC)) { if (colorA == colorB) { product = colorA; product1 = colorA; product2 = colorA; } else { register int r = 0; product1 = INTERPOLATE(colorA, colorC); product = INTERPOLATE(colorA, colorB); r += GetResult1 (colorA, colorB, colorG, colorE, colorI); r += GetResult2 (colorB, colorA, colorK, colorF, colorJ); r += GetResult2 (colorB, colorA, colorH, colorN, colorM); r += GetResult1 (colorA, colorB, colorL, colorO, colorP); if (r > 0) product2 = colorA; else if (r < 0) product2 = colorB; else { product2 = Q_INTERPOLATE(colorA, colorB, colorC, colorD); } } } else { product2 = Q_INTERPOLATE(colorA, colorB, colorC, colorD); if ((colorA == colorC) && (colorA == colorF) && (colorB != colorE) && (colorB == colorJ)) { product = colorA; } else if ((colorB == colorE) && (colorB == colorD) && (colorA != colorF) && (colorA == colorI)) { product = colorB; } else { product = INTERPOLATE(colorA, colorB); } if ((colorA == colorB) && (colorA == colorH) && (colorG != colorC) && (colorC == colorM)) { product1 = colorA; } else if ((colorC == colorG) && (colorC == colorD) && (colorA != colorH) && (colorA == colorI)) { product1 = colorC; } else { product1 = INTERPOLATE(colorA, colorC); } } #ifdef DETECT_TRANSPARENT_PIXELS if (trans1) colorA = transpixelcolor; if (trans1 && !product) product = transpixelcolor; if (trans2 && !product1) product1 = transpixelcolor; if (trans2 && !product2) product2 = transpixelcolor; #endif product = colorA | (product << 16); product1 = product1 | (product2 << 16); *(dP) = product; *(dP+(dstPitch>>2)) = product1; bP += 1; dP += 1; } /* end of for ( finish= width etc..) */ dstPtr += dstPitch << 1; srcPtr += srcPitch; deltaPtr += srcPitch; }; /* endof: for (height; height; height--) */ #ifdef MMX } #endif } slashem-0.0.7E7F3/sys/msdos/idx2bmp.c0000664000076400007640000001132510545462317015332 0ustar aliali/* SCCS Id: @(#)idx2bmp.c 3.3 95/01/26 */ /* Copyright (c) NetHack PC Development Team 1993, 1994, 1995 */ /* NetHack may be freely redistributed. See license for details. */ /* * This creates an idx2bmp.exe [indexfile [outputfile]] * * This takes an index file (index or indexfile) * (generated via txt2bmp.exe -i or otherwise) * and uses the same parsing algorithm as in the alleg_init(). * The bmp files referenced by the index file are then taken and put into * the output file (tiles.bmp or outputfile) * * Edit History: * * Initial Creation W.Cheung 00/06/23 * */ #define alleg_mouse_unused #define alleg_timer_unused #define alleg_keyboard_unused #define alleg_joystick_unused #define alleg_sound_unused #define alleg_gui_unused #include #include "hack.h" #include "pcvideo.h" #include "tile.h" #include "pctiles.h" #include #include #ifndef MONITOR_HEAP #include #endif #include extern char *FDECL(tilename, (int, int)); #define Fprintf (void) fprintf #define Fclose (void) fclose static const char *output_file = "tiles.bmp", *index_file = "index"; /* These next two functions were stolen from hacklib.c */ char * eos(s) /* return the end of a string (pointing at '\0') */ register char *s; { while (*s) s++; /* s += strlen(s); */ return s; } /* remove excess whitespace from a string buffer (in place) */ char * mungspaces(bp) char *bp; { register char c, *p, *p2; boolean was_space = TRUE; for (p = p2 = bp; (c = *p) != '\0'; p++) { if (c == '\t') c = ' '; if (c != ' ' || !was_space) *p2++ = c; was_space = (c == ' '); } if (was_space && p2 > bp) p2--; *p2 = '\0'; return bp; } int main(argc, argv) int argc; char *argv[]; { int i; FILE *fp; char buf[BUFSZ]; char *bufp; BITMAP *bigtile_bmp = (BITMAP *)0; BITMAP *tilebmp; struct tm *newtime; time_t aclock; char filename[60]; int tile_x = 32, tile_y = 32; int col, row; boolean has_index = 0, has_output = 0; if (argc > 3) { Fprintf(stderr, "Bad arg count (%d).\n", argc-1); (void) fflush(stderr); exit(EXIT_FAILURE); } has_index = (argc > 1); has_output = (argc > 2); set_color_depth(24); time(&aclock); newtime = localtime(&aclock); /* Open the index file */ if (has_index) sprintf(filename, argv[1]); else sprintf(filename, index_file); if ((fp = fopen(filename, "r")) == (FILE *)0) { Fprintf(stderr, "Could not open index file '%s'!\n", filename); exit(EXIT_FAILURE); } i = 0; while(fgets(buf,120,fp)) { if (*buf == '#') continue; bufp = eos(buf); while (--bufp > buf && isspace(*bufp)) continue; if (bufp <= buf) continue; /* skip all-blank lines */ else *(bufp + 1) = '\0'; /* terminate line */ /* find the '=' or ':' */ bufp = index(buf, ':'); if (!bufp) continue; *bufp = '\0'; bufp++; /* we only want what's after the ':' */ /* skip whitespace between '=' and value */ do { ++bufp; } while (isspace(*bufp)); bufp = mungspaces(bufp); sprintf(filename, "%s", bufp); tilebmp = load_bitmap(filename, (RGB *)0); if(!tilebmp) { Fprintf(stderr, "Could not open file '%s', continuing.\n", filename); continue; } if (!bigtile_bmp) { tile_x = tilebmp->w; tile_y = tilebmp->h; bigtile_bmp = create_bitmap(tile_x * TILES_PER_ROW, tile_y * TILES_PER_COL); } col = (int)(i % TILES_PER_ROW); row = (int)(i / TILES_PER_ROW); #ifdef DEBUG Fprintf(stderr, "col: %i row: %i\n", col, row); #endif blit(tilebmp, bigtile_bmp, 0, 0, col * tile_x, row * tile_y, tile_x, tile_y); i++; } if (has_output) sprintf(filename, argv[2]); else sprintf(filename, output_file); if (save_bitmap(filename, bigtile_bmp, 0)) { Fprintf(stderr, "Could not save bitmap '%s'!\n", filename); exit(EXIT_FAILURE); } exit(EXIT_SUCCESS); /*NOTREACHED*/ return 0; } slashem-0.0.7E7F3/sys/msdos/anethack.fnt0000664000076400007640000001000010545462317016075 0ustar aliali~¥½™~~ÿÛÿÿÃçÿÿ~lþþþþ|88|þ|8<<ççç<<~ÿÿ~<<<ÿÿÿÿÿÿçÃÃçÿÿÿÿÿÿþ><~~<fffffffffÛÛÛ{|Æ`8lÆÆl8 Æ|þþþþ<~~<~<~~< þ 0`þ`0ÀÀÀþ(lþl(88||þþþþ||8800000000fB$lllþlllþlll|ÒÐð|>–|bf8pàÌŒ0hX8pòÔÈÔv0000000 Öþ|î|þÖ~88 ~8pàÀ€&ffnvffd88x~fd8008  0`0 ~~ 0  0 |Ɔ 000FFïüfbf|fbbfü>FÂÀÀÀÀÂæ|ünffffffdøþb`d|d``bþþb`d|d```ðfffffff; >c`c>6<>ff;ff<>ff;0 <>ff;6<>ff;c`c>ff>c`c>0 >c`c>ff8<03n;~ØÜw6fffffg6>cccc>cc>cccc>0 >cccc>~ÃÀÀÃ~620x000s~Ãf<ÿÿüff|bfoffó~Øp 0<>ff; 08< 0>cccc> 0fffff;;nn33333;ncs{ogcc~8ll8|0cc>````àcfl0nà `àcfl3gÏ<<<6l6l66lDDDDDDDDUªUªUªUªUªUªUªUªÝwÝwÝwÝwÝwÝwÝwÝwøøø6666666ö66666666þ66666666øø66666öö666666666666666666666666þö6666666666666öþ6666666þøøøÿÿÿÿ66666667666666666666670??076666666666666÷ÿÿ÷666666666666670766666666ÿÿ66666÷÷66666666ÿÿ6666666ÿÿÿÿ666666666666666??666666666666666ÿ66666666ÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿððððððððððððððððÿÿÿÿÿÿÿ;nlln;>c~cc~`` cc``````666666c0 0c?llll83333>00`;n ~fff<~ÛÛ~~ÛÛó~`À0``|``0>cccccccÿÿ0  0~ 0`0 ~ØØpÿ;n;n8ll8 ìl<ØlllllpØ0`Èø~~~~~~~slashem-0.0.7E7F3/sys/msdos/pckeys.c0000664000076400007640000001154310545462317015265 0ustar aliali/* 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. */ /* * MSDOS specific key handling. * WAC - Used to be tile-specific, but also used for access to function * keys for help */ #include "hack.h" #ifdef MSDOS #include "wintty.h" #include "pcvideo.h" # ifdef PC_MOUSE #include # endif /* WAC is now a char */ char FDECL(pckeys, (unsigned char, unsigned char)); extern struct WinDesc *wins[MAXWIN]; /* from wintty.c */ extern boolean inmap; /* from video.c */ #define SHIFT (0x1 | 0x2) #define CTRL 0x4 #define ALT 0x8 # ifdef PC_MOUSE STATIC_DCL boolean NDECL(mouse_detect); STATIC_DCL void NDECL(mouse_show); STATIC_DCL void NDECL(mouse_hide); STATIC_DCL unsigned char FDECL(mouse_button, (unsigned char)); STATIC_DCL void FDECL(mouse_abs_pos, (int *,int *)); STATIC_DCL int FDECL(mouse_rel_pos, (int *,int *)); # endif /* * Check for special interface manipulation keys. * Returns equivalent keypress if the scan code triggered something. * WAC changed from boolean to char (used to returnt TRUE or FALSE) */ char pckeys(scancode, shift) unsigned char scancode; unsigned char shift; { boolean opening_dialog; opening_dialog = pl_character[0] ? FALSE : TRUE; switch(scancode) { case 0x3B: /* F1 = Help */ return ('?'); break; # ifdef USE_TILES # ifdef SIMULATE_CURSOR case 0x3D: /* F3 = toggle cursor type */ # ifdef ALLEG_FX if (iflags.usealleg) cycleHUD(); /* Cycle HUD mode on Allegro */ # else HideCursor(); cursor_type += 1; if (cursor_type >= NUM_CURSOR_TYPES) cursor_type = 0; DrawCursor(); break; # endif /* ALLEG_FX */ # endif /* SIMULATE_CURSOR */ #ifdef ALLEG_FX case 0x76: /* Control-page_down = scroll vertically downwards*/ if ((shift & CTRL) && iflags.tile_view && !opening_dialog) { # ifdef SCREEN_VGA if (iflags.usevga) { vga_userpan(3); } else # endif # ifdef ALLEG_FX if (iflags.usealleg) { alleg_userpan(3); } else # endif ; } break; case 0x84: /* Control-page_up = scroll vertically upwards*/ if ((shift & CTRL) && iflags.tile_view && !opening_dialog) # ifdef SCREEN_VGA if (iflags.usevga) { vga_userpan(2); } else # endif # ifdef ALLEG_FX if (iflags.usealleg) { alleg_userpan(2); } else # endif ; break; #endif case 0x74: /* Control-right_arrow = scroll horizontal to right */ if ((shift & CTRL) && iflags.tile_view && !opening_dialog) # ifdef SCREEN_VGA if (iflags.usevga) { vga_userpan(1); } else # endif # ifdef ALLEG_FX if (iflags.usealleg) { alleg_userpan(1); } else # endif ; break; case 0x73: /* Control-left_arrow = scroll horizontal to left */ if ((shift & CTRL) && iflags.tile_view && !opening_dialog) # ifdef SCREEN_VGA if (iflags.usevga) { vga_userpan(0); } else # endif # ifdef ALLEG_FX if (iflags.usealleg) { alleg_userpan(0); } else # endif ; break; case 0x3E: /* F4 = toggle overview mode */ if (iflags.tile_view && !opening_dialog) { #ifdef REINCARNATION if(Is_rogue_level(&u.uz)) break; #endif # ifdef SCREEN_VGA if (iflags.usevga) { iflags.traditional_view = FALSE; vga_overview(iflags.over_view ? FALSE : TRUE); vga_refresh(); } else # endif # ifdef ALLEG_FX if (iflags.usealleg) { alleg_overview(iflags.over_view ? FALSE : TRUE); alleg_refresh(); } else # endif ; } break; case 0x3F: /* F5 = toggle traditional mode */ if (iflags.tile_view && !opening_dialog #ifdef REINCARNATION && !Is_rogue_level(&u.uz) #endif ) { iflags.over_view = FALSE; # ifdef SCREEN_VGA if (iflags.usevga) { vga_traditional(iflags.traditional_view ? FALSE : TRUE); vga_refresh(); } else # endif # ifdef ALLEG_FX if (iflags.usealleg) { alleg_traditional(iflags.traditional_view ? FALSE : TRUE); /* NEED TO ADD REDRAW CODE */ } else # endif ; } break; case 0x40: /* F6 = screenshot */ # ifdef ALLEG_FX if (iflags.usealleg) { alleg_screenshot(); alleg_refresh(); } break; # endif # endif /* USE_TILES */ default: return NULL; } return (0xFF); } # ifdef PC_MOUSE #define MOUSE_LB 0x01 /* mouse left button */ #define MOUSE_RB 0x02 /* mouse right button */ #define MOUSE_CB 0x04 /* mouse center button */ void mouse_init(void) { /* mouse_show();*/ } void mouse_finish(void) { /* mouse_hide();*/ } # endif /* PC_MOUSE */ #endif /* MSDOS */ /*pckeys.c*/ slashem-0.0.7E7F3/sys/msdos/Install.dos0000664000076400007640000002704210545462317015741 0ustar alialiWAC Note: Allegro support can be defined in the makefile.gcc by defining ALLEG_FX SCCS Id: @(#)Install.dos 3.4 Copyright (c) NetHack PC Development Team 1990-2002. 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: $Date: 2003/11/24 20:12:12 $ 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 on the previous effort of Pierre Martineau, Stephen Spackman, Steve Creps, Mike Threepoint, Mike Stephenson, Norm Meluch and Don Kneller. There has been very little port-specific maintenance for NetHack on DOS since NetHack 3.3.0. CONTENTS: I. Dispelling the Myths II. Compiling on a DOS machine Appendix A - Building the "official binary" Appendix B - DJGPP Compiler (gcc ported to msdos) notes Appendix C - Additional Notes Appendix D - Contacting Us 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 proper Makefile for building NetHack using the following compilers: djgpp V2.03 or later For specific details concerning the djgpp compiler, please see the appendix B. The makefile named Makefile.GCC is for use with GNU Make that accompanies djgpp. If you want to build a copy of NetHack that is identical to the "official binary", please see appendix A. The unsupported sys/msdos/Makefile.MSC was for the old 16 bit Microsoft Visual C 1.52c compiler and has not been made compliant with 3.4.x. You may find it useful to obtain copies of lex (flex) and yacc (bison or byacc). While not strictly necessary to compile nethack, they are required should you desire to make any changes to the level and dungeon compilers. Flex and Bison are included with the DJGPP distribution and are also available on many archive sites. Also be sure to pick up djgpp v2gnu/fil41b.zip to get ls.exe and touch.exe, since the Makefile uses them by default. II. To compile your copy of NetHack on a DOS machine: (or "just follow these few 'simple' steps outlined below.") 1. It almost goes without saying that you should make sure that your tools are set up and running correctly. 2. Make sure all the NetHack files are in the appropriate directory structure. You should have a main directory with subdirectories dat, doc, include, src, sys\share, sys\msdos, util, win\tty and win\share. Other subdirectories may also be included in your distribution, but they are not necessary for use with DOS. You can delete them to save space. Required Source Directories for DOS NetHack: (top) | ------------------------------------------------- | | | | | | | util dat doc include src sys win | | ------ ----- | | | | share msdos tty share Check the file "Files" in your top level directory for an exact listing of what files are in which directory. In order for the Makefiles to work, all the source files must be in the proper locations. If you downloaded or ftp'd the sources from a UNIX system, the lines will probably end in UNIX-style newlines, instead of the carriage return and line feed pairs used by DOS. Some programs have trouble with them, so you may need to convert them (with a utility like Rahul Dhesi's "flip"). 3. Go to the sys/msdos directory and ensure that the file setup.bat has MSDOS style end-of-line characters rather than UNIX style end-of-line characters. You can do that using a utility like Rahul Dhesi's "flip", or by invoking the MSDOS edit utility on setup.bat and saving the file without making any changes. Failure to do this will prevent the bat file from executing completely, yet no warning message will be given. Run the setup.bat batch file with the following as the argument: GCC For djgpp and GNU MAKE. The appropriate and necessary Makefile movement will be accomplished for you, as well as verifying a few files and fixing a few file names on FAT systems with long file name support. 4. Now go to the include subdirectory to check a couple of the header files there. Things *should* work as they are, but since you have probably set up your system in some sort of custom configuration it doesn't hurt to check out the following: First check config.h according to the comments to match your system and desired set of features. Mostly you need to check the WIZARD option, and check TERMLIB and COMPRESS. Also be sure to leave DLB support commented out in config.h. MSDOS has support for DLB, but it must be done through the Makefile, rather than config.h, to ensure that the necessary packaging steps are done. We've managed to enable all the special features. You may include all or as few of them as you wish. To conserve disk space, you may wish to disable LOGFILE and NEWS. Also check pcconf.h, which should not need much editing (if you are including random.c, and if you do not require termcap for screen management). If you are not including random.c you will need to comment out RANDOM. If using DJGPP, you can choose between SCREEN_BIOS and SCREEN_DJGPPFAST. Never, never, ever choose both. Bad things will happen. We are not kidding. 5. If you want to change the high score list behavior, examine the top of topten.c, in the src directory. You may want to change the definitions of PERSMAX, POINTSMIN, and ENTRYMAX. We set POINTSMIN to 51 and ENTRYMAX to 50 to keep the size of the score list down. 6. Go to the src directory and edit the top of your Makefile. Be sure the directory you want the game installed in (GAMEDIR) actually exists. 7. Now that everything is set up, Go to the src directory, and using the GNU Make utility, "make install". Depending on your particular machine and compiler, you can either grab a cup of coffee or go home for the day. Your computer will be occupied for quite some time. If all goes well, you will get an NetHack executable. 9. If you chose DLB support (recommended), make sure that the file nhdat got copied into the game directory. If you didn't choose DLB support, make sure the support files -- data, rumors, cmdhelp, opthelp, help, hh,history, guidebook.txt license, and all the *.lev files -- were copied to the game directory. If not, move them there from the dat directory yourself. rumors can be created manually be entering "makedefs -r", data by entering "makedefs -d". Make sure the files NetHack1.tib and NetHacko.tib made it to your game directory. Copy them from src to the game directory yourself if necessary. Make sure the files defaults.nh and termcap made it to your game directory. If not, go to sys\share and copy NetHack.cnf to your game directory as defaults.nh. The name in previous versions was nethack.cnf, but the CNF extension conflicted with the MS Windows speed-dialer, making the file hidden on many machines. If you changed your build settings to include TERMCAP support, copy termcap to your game directory. Also, make sure the file msdoshlp.txt made it to your game directory. If it didn't, move it from sys\msdos to your game directory yourself. 10. In your game directory, review the settings in defaults.nh and adjust them according to your style of play. 11. Play NetHack. If it works, you're done! Appendix A - Building the "official binary" If you wish to build a copy of NetHack identical to the one that the pc team distributes, simply do the following: The 32-bit Protected Mode DPMI version built with 32-bit djgpp compiler V2.03 or greater, make no changes to any of the defines and use the Makefile.GCC as distributed, and as moved in step 3. Paths below are relative to the top of your unpacked NetHack source distribution: md \nethack\binary (must match Makefile) cd sys\msdos setup GCC cd ..\..\src make install Make sure the following files have been converted from the unix style "^J" end of line, to the msdos style "^M^J": license, defaults.nh. Place all the files in a clean directory and test. Appendix B - DJGPP Compiler (gcc ported to msdos) If you have a 386 or better machine, you are in luck. You can compile NetHack without spending money on a compiler. DJGPP is available free from many archive sites. At the time of this release in April 2002, the URL http://www.delorie.com/djgpp/zip-picker.html/ had information on how to obtain djgpp and what pieces to get. Be sure to pick up djgpp v2gnu/fil41b.zip to get ls.exe and touch.exe, since the Makefile uses them by default (or change the Makefile to use alternatives). Special note for Windows 2000 / Windows XP users: You must have a recent djgpp distribution for the build process, and the generated executables to work properly on those platforms. Setting up DJGPP is more than adequately explained in the documentation that comes with it. Be sure to pick up the yacc and flex built with DJGPP if you intend to do any modification of the special levels or dungeon compilers. They should be available at the same place you got djgpp. The latest version of djgpp, V2.03 with the most recent refresh will produce a binary that will run under Microsoft Windows, or any other DPMI provider. djgpp also comes with a DPMI provider called CWSDPMI. Place CWSDPMI.EXE in your path and it will be used in the absence of any other DPMI provider. If you want to use the built-in DJGPP screen routines, uncomment SCREEN_DJGPPFAST in pcconf.h (the default for djgpp). Appendix C - Additional Notes 1) Save files and bones files from versions of NetHack prior to 3.4.0 will not work with this NetHack. Don't bother trying to keep them. 2) To install an update of NetHack after changing something, type 'make' for DJGPP from the src directory. If you add, delete, or reorder monsters or objects, or you change the format of saved level files, delete any save and bones files. (Trying to use such files sometimes produces amusing confusions on the game's part, but usually crashes.) Appendix D - Contacting the Development Team If you discover a bug and wish to report it, or if you have comments or suggestions we recommend using our "Contact Us" web page at: http://www.nethack.org/common/contact.html If you don't have access to the web, or you want to send us a patch to the NetHack source code feel free to drop us a line c/o: DevTeam (at) nethack.org slashem-0.0.7E7F3/sys/msdos/vidvga.c0000664000076400007640000012266610545462317015260 0ustar aliali/* 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. */ /* * vidvga.c - VGA Hardware video support */ #include "hack.h" #ifdef SCREEN_VGA /* this file is for SCREEN_VGA only */ #include "pcvideo.h" #include "tile.h" #include "pctiles.h" #include #include #include "wintty.h" # ifdef __GO32__ #include #include # endif /*========================================================================= * VGA Video supporting routines (for tiles). * * The following routines carry out the lower level video functions required * to make PC NetHack work with VGA graphics. * * - The binary files NetHack1.tib and NetHacko.tib must be in your * game directory. Currently, unpredictable results may occur if they * aren't since the code hasn't been tested with it missing (yet). * * Notes (96/02/16): * * - Cursor emulation on the map is now implemented. The input routine * in msdos.c calls the routine to display the cursor just before * waiting for input, and hides the cursor immediately after satisfying * the input request. * * - A check for a VGA adapter is implemented. * * - With 640 x 480 resolution, the use of 16 x 16 icons allows only 40 * columns for the map display. This makes it necessary to support the * TTY CLIPPING code. The right/left scrolling with this can be * a little annoying. Feel free to rework the routines. * * - NetHack1.tib is built from text files derived from bitmap files * provided by Warwick Allison, using routines developed and supplied * by Janet Walz. The icons are very well done and thanks to * Warwick Allison for an excellent effort! * * - The text fonts that this is using while in graphics mode come from * the Video BIOS ROM on board the VGA adapter. Code in vga_WriteChar * copies the appropriate pixels from the video ROM to the Video buffer. * * - Currently, most of the routines are in an ifdef OVLB. * If you change that, you may have to muck with some of the * variable declarations which now assume this. This is not a * problem in a non-overlaid environment (djgpp for example). * * - VGA 640 by 480, 16 colour mode (0x12) uses an odd method to * represent a colour value from the palette. There are four * planes of video memory, all overlaid at the same memory location. * For example, if a pixel has the colour value 7: * * 0 1 1 1 * \ \ \ \ * \ \ \ plane 0 * \ \ plane 1 * \ plane 2 * plane 3 * * - VGA write mode 2 requires that a read be done before a write to * set some latches on the card. The value read had to be placed * into a variable declared 'volatile' to prevent djgpp from * optimizing away the entire instruction (the value was assigned * to a variable which was never used). This corrects the striping * problem that was apparent with djgpp. * * - A check for valid mode switches has been added. * * - No tiles are displayed on the Rogue Level in keeping with the * original Rogue. The display adapter remains in graphics mode * however. * * - Added handling for missing NetHackX.tib files, and resort to using * video:default and tty if one of them can't be located. * * ToDo (96/02/17): * * - Nothing prior to release. *========================================================================= */ # if defined(_MSC_VER) # if _MSC_VER >= 700 #pragma warning(disable:4018) /* signed/unsigned mismatch */ #pragma warning(disable:4127) /* conditional expression is constant */ #pragma warning(disable:4131) /* old style declarator */ #pragma warning(disable:4305) /* prevents complaints with MK_FP */ #pragma warning(disable:4309) /* initializing */ # if _MSC_VER > 700 #pragma warning(disable:4759) /* prevents complaints with MK_FP */ # endif # endif # 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 STATIC_DCL void FDECL(vga_scrollmap,(BOOLEAN_P)); #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); static void FDECL(vga_special,(int, int, int)); #endif /* WAC draw a pet mark */ void vga_Draw_PetMark(int,int,BOOLEAN_P); extern int clipx, clipxmax; /* current clipping column from wintty.c */ extern boolean clipping; /* clipping on? from wintty.c */ extern int savevmode; /* store the original video mode */ extern int curcol,currow; /* current column and row */ extern int g_attribute; extern int attrib_text_normal; /* text mode normal attribute */ extern int attrib_gr_normal; /* graphics mode normal attribute */ extern int attrib_text_intense; /* text mode intense attribute */ extern int attrib_gr_intense; /* graphics mode intense attribute */ extern boolean inmap; /* in the map window */ /* * Global Variables */ 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, 0x00, 0xaa, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0xaa, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0xcc, 0xcc, 0xcc, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff }; #endif # ifndef ALTERNATE_VIDEO_METHOD int vp[SCREENPLANES] = {8,4,2,1}; # endif int vp2[SCREENPLANES] = {1,2,4,8}; # else extern int vgacmap[CLR_MAX]; extern int viewport_size; extern char masktable[8]; extern char bittable[8]; extern char defpalette[]; # ifndef ALTERNATE_VIDEO_METHOD extern int vp[SCREENPLANES]; # endif extern int vp2[SCREENPLANES]; # endif /* OVLB */ STATIC_VAR struct planar_cell_struct *planecell; STATIC_VAR struct overview_planar_cell_struct *planecell_O; # if defined(USE_TILES) STATIC_VAR struct tibhdr_struct tibheader; /* extern FILE *tilefile; */ /* Not needed in here most likely */ # endif /* WAC quick colortest * 1 - purple * 2 - dark blue * 3 - background gray * 4 - orange * 5 - brown * 6 - bright green * 7 - bright white * 8 - light blue * 9 - dark brown * 10 - green * 11 - white * 12 - red * 13 - skin * 14 - yellow * 15 - gray * 16 - black */ STATIC_VAR int petmark_color = 12; /* STATIC_VAR int g_attribute; */ /* Current attribute to use */ #ifdef OVLB void vga_get_scr_size() { CO = 80; LI = 29; } #endif /*OVLB*/ # ifdef OVLB void vga_backsp() { int col,row; col = curcol; /* Character cell row and column */ row = currow; if (col > 0) col = col-1; vga_gotoloc(col,row); } # endif /* OVLB */ # ifdef OVL0 void vga_clear_screen(colour) int colour; { char __far *pch; int y,j; char volatile a; outportb(0x3ce,5); outportb(0x3cf,2); for (y=0; y < SCREENHEIGHT; ++y) { pch = screentable[y]; for (j=0; j < SCREENBYTES; ++j) { outportb(0x3ce,8); outportb(0x3cf,255); a = READ_ABSOLUTE(pch); /* Must read , then write */ WRITE_ABSOLUTE(pch, (char)colour); ++pch; } } outportb(0x3ce,5); outportb(0x3cf,0); if (iflags.tile_view) vga_clearmap(); vga_gotoloc(0,0); /* is this needed? */ } void vga_cl_end(col,row) /* clear to end of line */ int col,row; { int count; /* * This is being done via character writes. * This should perhaps be optimized for speed by using VGA write * mode 2 methods as did clear_screen() */ for (count = col; count < (CO-1); ++count) { vga_WriteChar(' ',count,row,BACKGROUND_VGA_COLOR); } } void vga_cl_eos(cy) /* clear to end of screen */ int cy; { int count; cl_end(); while(cy <= LI-2) { for (count = 0; count < (CO-1); ++count) { vga_WriteChar(' ',count,cy, BACKGROUND_VGA_COLOR); } cy++; } } # endif /* OVL0 */ # ifdef OVLB void vga_tty_end_screen() { vga_clear_screen(BACKGROUND_VGA_COLOR); vga_SwitchMode(MODETEXT); } void vga_tty_startup(wid, hgt) int *wid, *hgt; { /* code to sense display adapter is required here - MJA */ vga_get_scr_size(); if (CO && LI) { *wid = CO; *hgt = LI; } attrib_gr_normal = ATTRIB_VGA_NORMAL; attrib_gr_intense = ATTRIB_VGA_INTENSE; g_attribute = attrib_gr_normal; /* Give it a starting value */ } # endif /* OVLB */ /* * Screen output routines (these are heavily used). * * These are the 3 routines used to place information on the screen * in the VGA PC tty port of NetHack. These are the routines * that get called by the general interface routines in video.c. * * vga_xputs -Writes a c null terminated string at the current location. * * vga_xputc -Writes a single character at the current location. Since * various places in the code assume that control characters * can be used to control, we are forced to interpret some of * the more common ones, in order to keep things looking correct. * * vga_xputg -This routine is used to display a graphical representation of a * NetHack glyph (a tile) at the current location. For more * information on NetHack glyphs refer to the comments in * include/display.h. * */ # ifdef OVL0 void vga_xputs(s,col,row) const char *s; int col,row; { if (s != (char *)0) { vga_WriteStr((char *)s,strlen(s),col,row,g_attribute); } } void vga_xputc(ch,attr) /* write out character (and attribute) */ char ch; int attr; { int col,row; col = curcol; row = currow; switch(ch) { case '\n': col = 0; ++row; break; default: vga_WriteChar((unsigned char)ch,col,row,attr); if (col < (CO -1 )) ++col; break; } /* end switch */ vga_gotoloc(col,row); } # 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); if (glyph_is_pet(glyphnum) #ifdef TEXTCOLOR && iflags.hilite_pet #endif ) vga_Draw_PetMark(col- clipx, row, FALSE); } else { pline("vga_xputg: Error reading tile (%d,%d) from file", glyphnum,glyph2tile[glyphnum]); } } } else { if (!ReadPlanarTileFile_O(glyph2tile[glyphnum], &planecell_O)) { vga_DisplayCell_O(planecell_O, col, row); if (glyph_is_pet(glyphnum) #ifdef TEXTCOLOR && iflags.hilite_pet #endif ) vga_Draw_PetMark(col- clipx, row,TRUE); } else { pline("vga_xputg: Error reading tile (%d,%d) from file", glyphnum,glyph2tile[glyphnum]); } } if (col < (CO - 1 )) ++col; vga_gotoloc(col,row); } # endif /* USE_TILES */ /* * Cursor location manipulation, and location information fetching * routines. * These include: * * vga_gotoloc(x,y) - Moves the "cursor" on screen to the specified x * and y character cell location. This routine * determines the location where screen writes * will occur next, it does not change the location * of the player on the NetHack level. */ void vga_gotoloc(col,row) int col,row; { curcol = min(col,CO - 1); /* protection from callers */ currow = min(row,LI - 1); } # if defined(USE_TILES) && defined(CLIPPING) void vga_cliparound(x, y) int x, y; { extern boolean restoring; int oldx = clipx; if (!iflags.tile_view || iflags.over_view || iflags.traditional_view) return; if (x < clipx + 5) { clipx = max(0, x - (viewport_size / 2)); clipxmax = clipx + (viewport_size - 1); } else if (x > clipxmax - 5) { clipxmax = min(COLNO - 1, x + (viewport_size / 2)); clipx = clipxmax - (viewport_size - 1); } if (clipx != oldx) { if (on_level(&u.uz0, &u.uz) && !restoring) /* (void) doredraw(); */ vga_redrawmap(1); } } STATIC_OVL void vga_redrawmap(clearfirst) boolean clearfirst; { int j,x,y,t; char __far *pch; char volatile a; if (clearfirst) { /* y here is in pixel rows */ outportb(0x3ce,5); outportb(0x3cf,2); t = TOP_MAP_ROW * ROWS_PER_CELL; for (y = t; y < (ROWNO * ROWS_PER_CELL) + t; ++y) { pch = screentable[y]; for (j=0; j < SCREENBYTES; ++j) { outportb(0x3ce,8); outportb(0x3cf,255); /* On VGA mode2, must read first, then write */ a = READ_ABSOLUTE(pch); WRITE_ABSOLUTE(pch, (char)BACKGROUND_VGA_COLOR); ++pch; } } outportb(0x3ce,5); outportb(0x3cf,0); } /* y here is in screen rows*/ # ifdef ROW_BY_ROW for (y = 0; y < ROWNO; ++y) for (x = clipx; x <= clipxmax; ++x) { # else for (x = clipx; x <= clipxmax; ++x) for (y = 0; y < ROWNO; ++y) { # endif if (iflags.traditional_view) { if (!(clearfirst && map[y][x].ch == S_stone)) vga_WriteChar( (unsigned char)map[y][x].ch, x,y + TOP_MAP_ROW,map[y][x].attr); } else { t = map[y][x].glyph; if (!(clearfirst && t == cmap_to_glyph(S_stone))) { if (!iflags.over_view) { 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); if (glyph_is_pet(t) #ifdef TEXTCOLOR && iflags.hilite_pet #endif ) vga_Draw_PetMark(x - clipx, y + TOP_MAP_ROW,FALSE); } else pline("vga_redrawmap: Error reading tile (%d,%d)", t,glyph2tile[t]); } else { if (!ReadPlanarTileFile_O(glyph2tile[t], &planecell_O)) { vga_DisplayCell_O(planecell_O, x, y + TOP_MAP_ROW); if (glyph_is_pet(t) #ifdef TEXTCOLOR && iflags.hilite_pet #endif ) vga_Draw_PetMark(x, y + TOP_MAP_ROW,TRUE); } else pline("vga_redrawmap: Error reading tile (%d,%d)", t,glyph2tile[t]); } } } } } # endif /* USE_TILES && CLIPPING */ # endif /* OVL0 */ # ifdef OVL2 void vga_userpan(left) boolean left; { int x; /* pline("Into userpan"); */ if (iflags.over_view || iflags.traditional_view) return; if (left) x = min(COLNO - 1, clipxmax + 10); else x = max(0, clipx - 10); vga_cliparound(x, 10); /* y value is irrelevant on VGA clipping */ positionbar(); vga_DrawCursor(); } void vga_overview(on) boolean on; { /* vga_HideCursor(); */ if (on) { iflags.over_view = TRUE; clipx = 0; clipxmax = CO - 1; } else { iflags.over_view = FALSE; clipx = max(0, (curcol - viewport_size / 2)); if (clipx > ((CO - 1) - viewport_size)) clipx = (CO - 1) - viewport_size; clipxmax = clipx + (viewport_size - 1); } } void vga_traditional(on) boolean on; { /* vga_HideCursor(); */ if (on) { /* switch_graphics(ASCII_GRAPHICS); */ iflags.traditional_view = TRUE; clipx = 0; clipxmax = CO - 1; } else { iflags.traditional_view = FALSE; if (!iflags.over_view) { clipx = max(0, (curcol - viewport_size / 2)); if (clipx > ((CO - 1) - viewport_size)) clipx = (CO - 1) - viewport_size; clipxmax = clipx + (viewport_size - 1); } } } void vga_refresh() { positionbar(); vga_redrawmap(1); vga_DrawCursor(); } # ifdef SCROLLMAP STATIC_OVL void vga_scrollmap(left) boolean left; { int j,x,y,t; int i,pixx,pixy,x1,y1,x2,y2; int byteoffset, vplane; char __far *tmp1; char __far *tmp2; unsigned char source[SCREENPLANES][80]; unsigned char first,second; pixy = row2y(TOP_MAP_ROW); /* convert to pixels */ pixx = col2x(x1); if (left) { x1 = 20; x2 = 0; } else { x1 = 0; x2 = 20; } /* read each row, all columns but the one to be replaced */ for(i = 0;i < (ROWNO-1) * ROWS_PER_CELL; ++i) { tmp1 = screentable[i + pixy]; tmp1 += x1; for(vplane=0; vplane < SCREENPLANES; ++vplane) { egareadplane(vplane); for (byteoffset = 0; byteoffset < 20; ++byteoffset) { tmp2 = tmp1 + byteoffset; source[vplane][byteoffset] = READ_ABSOLUTE(tmp2); } } tmp1 = screentable[i + pixy]; tmp1 += x2; for(vplane=0; vplane < SCREENPLANES; ++vplane) { egawriteplane(vp2[vplane]); for (byteoffset = 0; byteoffset < 20; ++byteoffset) { tmp2 = tmp1 + byteoffset; WRITE_ABSOLUTE(tmp2,source[vplane][byteoffset]); } } egawriteplane(15); } if (left) { i = clipxmax - 1; j = clipxmax; } else { i = clipx; j = clipx + 1; } 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); if (glyph_is_pet(t) #ifdef TEXTCOLOR && iflags.hilite_pet #endif ) vga_Draw_PetMark(x - clipx, y + TOP_MAP_ROW,FALSE); } else pline("vga_shiftmap: Error reading tile (%d,%d)", t, glyph2tile[t]); } } } } # endif /* SCROLLMAP */ # 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, * initialize the SCREEN, switch it to graphics mode, * initialize the pointers to the fonts, clear * the screen. * */ void vga_Init(void) { int i; # ifdef USE_TILES int tilefailure = 0; /* * Attempt to open the required tile files. If we can't * don't perform the video mode switch, use TTY code instead. * */ if (OpenTileFile(NETHACK_PLANAR_TILEFILE, FALSE)) tilefailure |= 1; if (OpenTileFile(NETHACK_OVERVIEW_TILEFILE, TRUE)) tilefailure |= 2; if (ReadTileFileHeader(&tibheader, FALSE)) tilefailure |= 4; if (tilefailure) { raw_printf("Reverting to TTY mode, tile initialization failure (%d).", tilefailure); wait_synch(); iflags.usevga = 0; iflags.tile_view = FALSE; iflags.over_view = FALSE; CO = 80; LI = 25; /* clear_screen() */ /* not vga_clear_screen() */ return; } # endif if (iflags.usevga) { for (i=0; i < SCREENHEIGHT; ++i) { screentable[i]=MK_PTR(VIDEOSEG, (i * SCREENBYTES)); } } 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; iflags.over_view = FALSE; # else paletteptr = defpalette; # endif vga_SetPalette(paletteptr); g_attribute = attrib_gr_normal; font = vga_FontPtrs(); clear_screen(); clipx = 0; clipxmax = clipx + (viewport_size - 1); } /* * Switches modes of the video card. * * If mode == MODETEXT (0x03), then the card is placed into text * mode. If mode == 640x480, then the card is placed into vga * mode (video mode 0x12). No other modes are currently supported. * */ void vga_SwitchMode(unsigned int mode) { union REGS regs; if ((mode == MODE640x480) || (mode == MODETEXT)) { if (iflags.usevga && (mode == MODE640x480)) { iflags.grmode = 1; } else { iflags.grmode = 0; } regs.x.ax = mode; (void) int86(VIDEO_BIOS, ®s, ®s); } else { iflags.grmode = 0; /* force text mode for error msg */ regs.x.ax = MODETEXT; (void) int86(VIDEO_BIOS, ®s, ®s); g_attribute = attrib_text_normal; impossible("vga_SwitchMode: Bad video mode requested 0x%X", mode); } } /* * This allows grouping of several tasks to be done when * switching back to text mode. This is a public (extern) function. * */ void vga_Finish(void) { CloseTileFile(0); CloseTileFile(1); vga_SwitchMode(MODETEXT); windowprocs.win_cliparound = tty_cliparound; g_attribute = attrib_text_normal; iflags.tile_view = FALSE; } #if 0 /* * Turn off any border colour that might be enabled in the VGA card * register. * * I disabled this after modifying tile2bin.c to remap black & white * to a more standard values - MJA 94/04/23. * */ STATIC_OVL void vga_NoBorder(int bc) { union REGS regs; regs.h.ah = (char)0x10; regs.h.al = (char)0x01; regs.h.bh = (char)bc; regs.h.bl = 0; (void) int86(VIDEO_BIOS, ®s, ®s); } #endif /* * * Returns a far pointer (or flat 32 bit pointer under djgpp) to the * location of the appropriate ROM font for the _current_ video mode * (so you must place the card into the desired video mode before * calling this function). * * This function takes advantage of the video BIOS loading the * address of the appropriate character definition table for * the current graphics mode into interrupt vector 0x43 (0000:010C). */ char __far *vga_FontPtrs(void) { USHORT __far *tmp; char __far *retval; USHORT fseg, foff; tmp = (USHORT __far *)MK_PTR(((USHORT)FONT_PTR_SEGMENT), ((USHORT)FONT_PTR_OFFSET)); foff = READ_ABSOLUTE_WORD(tmp); ++tmp; fseg = READ_ABSOLUTE_WORD(tmp); retval = (char __far *)MK_PTR(fseg,foff); return retval; } /* * This will verify the existance of a VGA adapter on the machine. * Video function call 0x1a returns 0x1a in AL if successful, and * returns the following values in BL for the active display: * * 0=no display, 1=MDA, 2=CGA, 4=EGA(color-monitor), * 5=EGA(mono-monitor), 6=PGA, 7=VGA(mono-monitor), 8=VGA(color-monitor), * 0xB=MCGA(mono-monitor), 0xC=MCGA(color-monitor), 0xFF=unknown) */ int vga_detect() { union REGS regs; regs.h.al = 0; regs.h.ah = 0x1a; (void) int86(VIDEO_BIOS, ®s, ®s); /* * debug * * printf("vga_detect returned al=%02x, bh=%02x, bl=%02x\n", * (int)regs.h.al, (int)regs.h.bh, (int)regs.h.bl); * getch(); */ if ((int)regs.h.al == 0x1a) { if (((int)regs.h.bl == 8) || ((int)regs.h.bl == 7)) { return 1; } } return 0; } /* * Write character 'ch', at (x,y) and * do it using the colour 'colour'. * */ void vga_WriteChar(chr,col,row,colour) int chr,col,row,colour; { int i; int x,pixy; char volatile tc; char __far *cp; unsigned char __far *fp = font; unsigned char fnt; int actual_colour = vgacmap[colour]; 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); chr = chr<<4; for (i=0; i < MAX_ROWS_PER_CELL; ++i) { cp = screentable[pixy+i] + x; fnt = READ_ABSOLUTE((fp + chr + i)); outportb(0x3ce,8); outportb(0x3cf,fnt); tc = READ_ABSOLUTE(cp); /* wrt mode 2, must read, then write */ WRITE_ABSOLUTE(cp, (char)actual_colour); outportb(0x3ce,8); outportb(0x3cf,~fnt); tc = READ_ABSOLUTE(cp); /* wrt mode 2, must read, then write */ WRITE_ABSOLUTE(cp, (char)BACKGROUND_VGA_COLOR); } outportb(0x3ce,5); outportb(0x3cf,0); outportb(0x3ce,8); outportb(0x3cf,255); } /* * This is the routine that displays a high-res "cell" pointed to by 'gp' * at the desired location (col,row). * * Note: (col,row) in this case refer to the coordinate location in * NetHack character grid terms, (ie. the 40 x 25 character grid), * not the x,y pixel location. * */ void vga_DisplayCell(gp,col,row) struct planar_cell_struct *gp; int col,row; { int i,pixx,pixy; char __far *tmp_s; /* source pointer */ char __far *tmp_d; /* destination pointer */ int vplane; pixy = row2y(row); /* convert to pixels */ pixx = col2x(col); for(vplane=0; vplane < SCREENPLANES; ++vplane) { egawriteplane(vp[vplane]); for(i=0;i < ROWS_PER_CELL; ++i) { tmp_d = screentable[i+pixy]; tmp_d += pixx; /* * memcpy((void *)tmp,(void *)gp->plane[vplane].image[i], * BYTES_PER_CELL); */ tmp_s = gp->plane[vplane].image[i]; WRITE_ABSOLUTE(tmp_d, (*tmp_s)); ++tmp_s; ++tmp_d; WRITE_ABSOLUTE(tmp_d, (*tmp_s)); } } egawriteplane(15); } void vga_DisplayCell_O(gp,col,row) struct overview_planar_cell_struct *gp; int col,row; { int i,pixx,pixy; char __far *tmp_s; /* source pointer */ char __far *tmp_d; /* destination pointer */ int vplane; pixy = row2y(row); /* convert to pixels */ pixx = col; for(vplane=0; vplane < SCREENPLANES; ++vplane) { egawriteplane(vp[vplane]); for(i=0;i < ROWS_PER_CELL; ++i) { tmp_d = screentable[i+pixy]; tmp_d += pixx; /* * memcpy((void *)tmp,(void *)gp->plane[vplane].image[i], * BYTES_PER_CELL); */ tmp_s = gp->plane[vplane].image[i]; WRITE_ABSOLUTE(tmp_d, (*tmp_s)); } } egawriteplane(15); } /* * Write the character string pointed to by 's', whose maximum length * is 'len' at location (x,y) using the 'colour' colour. * */ void vga_WriteStr(s,len,col,row,colour) char *s; int len,col,row,colour; { unsigned char *us; int i = 0; /* protection from callers */ if (row > (LI-1)) return; i = 0; us = (unsigned char *)s; while( (*us != 0) && (i < len) && (col < (CO - 1))) { vga_WriteChar(*us,col,row,colour); ++us; ++i; ++col; } } # endif /* OVLB */ # ifdef OVLB /* * Initialize the VGA palette with the desired colours. This * must be a series of 48 bytes for use with a card in * 16 colour mode at 640 x 480. * */ void vga_SetPalette(p) char *p; { union REGS regs; int i; outportb(0x3c6,0xff); for(i=0;i < COLORDEPTH; ++i) { outportb(0x3c8,i); outportb(0x3c9,(*p++) >> 2); outportb(0x3c9,(*p++) >> 2); outportb(0x3c9,(*p++) >> 2); } regs.x.bx = 0x0000; for(i=0;i < COLORDEPTH; ++i) { regs.x.ax = 0x1000; (void) int86(VIDEO_BIOS,®s,®s); regs.x.bx += 0x0101; } } /*static unsigned char colorbits[]={0x01,0x02,0x04,0x08}; */ /* wrong */ static unsigned char colorbits[]={0x08,0x04,0x02,0x01}; #ifdef POSITIONBAR #define PBAR_ROW (LI - 4) #define PBAR_COLOR_ON 15 /* slate grey background colour of tiles */ #define PBAR_COLOR_OFF 12 /* bluish grey, used in old style only */ #define PBAR_COLOR_STAIRS 9 /* brown */ #define PBAR_COLOR_HERO 14 /* creamy white */ static unsigned char pbar[COLNO]; void vga_update_positionbar(posbar) char *posbar; { char *p = pbar; if (posbar) while (*posbar) *p++ = *posbar++; *p = 0; } STATIC_OVL void positionbar() { char *posbar = pbar; int feature, ucol; int k, y, colour, row; char __far *pch; int startk, stopk; char volatile a; boolean nowhere = FALSE; int pixy = (PBAR_ROW * MAX_ROWS_PER_CELL); int tmp; if (!iflags.grmode || !iflags.tile_view) return; if ((clipx < 0) || (clipxmax <= 0) || (clipx >= clipxmax)) nowhere = TRUE; if (nowhere) { #ifdef DEBUG pline("Would have put bar using %d - %d.",clipx,clipxmax); #endif return; } #ifdef OLD_STYLE outportb(0x3ce,5); outportb(0x3cf,2); for (y=pixy; y < (pixy + MAX_ROWS_PER_CELL); ++y) { pch = screentable[y]; for (k=0; k < SCREENBYTES; ++k) { if ((k < clipx) || (k > clipxmax)) { colour = PBAR_COLOR_OFF; } else colour = PBAR_COLOR_ON; outportb(0x3ce,8); outportb(0x3cf,255); a = READ_ABSOLUTE(pch); /* Must read , then write */ WRITE_ABSOLUTE(pch, (char)colour); ++pch; } } outportb(0x3ce,5); outportb(0x3cf,0); #else colour = PBAR_COLOR_ON; outportb(0x3ce,5); outportb(0x3cf,2); for (y=pixy, row = 0; y < (pixy + MAX_ROWS_PER_CELL); ++y, ++row) { pch = screentable[y]; if ((!row) || (row == (ROWS_PER_CELL-1))) { startk = 0; stopk = SCREENBYTES; } else { startk = clipx; stopk = clipxmax; } for (k=0; k < SCREENBYTES; ++k) { if ((k < startk) || (k > stopk)) colour = BACKGROUND_VGA_COLOR; else colour = PBAR_COLOR_ON; outportb(0x3ce,8); outportb(0x3cf,255); a = READ_ABSOLUTE(pch); /* Must read , then write */ WRITE_ABSOLUTE(pch, (char)colour); ++pch; } } outportb(0x3ce,5); outportb(0x3cf,0); #endif ucol = 0; if (posbar) { while (*posbar != 0) { feature = *posbar++; switch (feature) { case '>': vga_special(feature, (int)*posbar++, PBAR_COLOR_STAIRS); break; case '<': vga_special(feature, (int)*posbar++, PBAR_COLOR_STAIRS); break; case '@': ucol = (int)*posbar++; vga_special(feature, ucol, PBAR_COLOR_HERO); break; default: /* unanticipated symbols */ vga_special(feature, (int)*posbar++, PBAR_COLOR_STAIRS); break; } } } # ifdef SIMULATE_CURSOR if (inmap) { tmp = curcol + 1; if ((tmp != ucol) && (curcol >= 0)) vga_special('_', tmp, PBAR_COLOR_HERO); } # endif } void vga_special(chr,col,color) int chr,col,color; { int i,y,pixy; char __far *tmp_d; /* destination pointer */ int vplane; char fnt; char bits[SCREENPLANES][ROWS_PER_CELL]; pixy = PBAR_ROW * MAX_ROWS_PER_CELL; for(vplane=0; vplane < SCREENPLANES; ++vplane) { egareadplane(vplane); y = pixy; for(i=0;i < ROWS_PER_CELL; ++i) { tmp_d = screentable[y++] + col; bits[vplane][i] = READ_ABSOLUTE(tmp_d); fnt = READ_ABSOLUTE((font + ((chr<<4) + i))); if (colorbits[vplane] & color) bits[vplane][i] |= fnt; else bits[vplane][i] &= ~fnt; } } for(vplane=0; vplane < SCREENPLANES; ++vplane) { egawriteplane(vp[vplane]); y = pixy; for(i=0;i < ROWS_PER_CELL; ++i) { tmp_d = screentable[y++] + col; WRITE_ABSOLUTE(tmp_d, (bits[vplane][i])); } } egawriteplane(15); } # endif POSITIONBAR # ifdef SIMULATE_CURSOR static struct planar_cell_struct undercursor; static struct planar_cell_struct cursor; void vga_DrawCursor() { int i,pixx,pixy,x,y,p; char __far *tmp1; char __far *tmp2; unsigned char first,second; /* char on[2] = {0xFF,0xFF}; */ /* char off[2] = {0x00,0x00}; */ #ifdef REINCARNATION boolean isrogue = Is_rogue_level(&u.uz); boolean singlebyte = (isrogue || iflags.over_view || iflags.traditional_view || !inmap); #else boolean singlebyte = (iflags.over_view || iflags.traditional_view || !inmap); #endif int curtyp; if (!cursor_type && inmap) return; /* CURSOR_INVIS - nothing to do */ x = min(curcol,(CO - 1)); /* protection from callers */ y = min(currow,(LI - 1)); /* protection from callers */ if (!singlebyte && ((x < clipx) || (x > clipxmax))) return; pixy = row2y(y); /* convert to pixels */ if (singlebyte) pixx = x; else pixx = col2x((x-clipx)); for(i=0;i < ROWS_PER_CELL; ++i) { tmp1 = screentable[i+pixy]; tmp1 += pixx; tmp2 = tmp1 + 1; egareadplane(3); /* memcpy(undercursor.plane[3].image[i],tmp1,BYTES_PER_CELL); */ undercursor.plane[3].image[i][0] = READ_ABSOLUTE(tmp1); if (!singlebyte) undercursor.plane[3].image[i][1] = READ_ABSOLUTE(tmp2); egareadplane(2); /* memcpy(undercursor.plane[2].image[i],tmp1,BYTES_PER_CELL); */ undercursor.plane[2].image[i][0] = READ_ABSOLUTE(tmp1); if (!singlebyte) undercursor.plane[2].image[i][1] = READ_ABSOLUTE(tmp2); egareadplane(1); /* memcpy(undercursor.plane[1].image[i],tmp1,BYTES_PER_CELL); */ undercursor.plane[1].image[i][0] = READ_ABSOLUTE(tmp1); if (!singlebyte) undercursor.plane[1].image[i][1] = READ_ABSOLUTE(tmp2); egareadplane(0); /* memcpy(undercursor.plane[0].image[i],tmp1,BYTES_PER_CELL); */ undercursor.plane[0].image[i][0] = READ_ABSOLUTE(tmp1); if (!singlebyte) undercursor.plane[0].image[i][1] = READ_ABSOLUTE(tmp2); } /* * Now we have a snapshot of the current cell. * Make a copy of it, then manipulate the copy * to include the cursor, and place the tinkered * version on the display. */ cursor = undercursor; if (inmap) curtyp = cursor_type; else curtyp = CURSOR_UNDERLINE; switch(curtyp) { case CURSOR_CORNER: for(i = 0; i < 2; ++i) { if (!i) { if (singlebyte) first = 0xC3; else first = 0xC0; second = 0x03; } else { if (singlebyte) first = 0x81; else first = 0x80; second = 0x01; } for (p=0; p < 4; ++p) { if (cursor_color & colorbits[p]) { cursor.plane[p].image[i][0] |= first; if (!singlebyte) cursor.plane[p].image[i][1] |= second; } else { cursor.plane[p].image[i][0] &= ~first; if (!singlebyte) cursor.plane[p].image[i][1] &= ~second; } } } for(i = ROWS_PER_CELL - 2; i < ROWS_PER_CELL; ++i) { if (i != (ROWS_PER_CELL-1)) { if (singlebyte) first = 0x81; else first = 0x80; second = 0x01; } else { if (singlebyte) first = 0xC3; else first = 0xC0; second = 0x03; } for (p=0; p < SCREENPLANES; ++p) { if (cursor_color & colorbits[p]) { cursor.plane[p].image[i][0] |= first; if (!singlebyte) cursor.plane[p].image[i][1] |= second; } else { cursor.plane[p].image[i][0] &= ~first; if (!singlebyte) cursor.plane[p].image[i][1] &= ~second; } } } break; case CURSOR_UNDERLINE: i = ROWS_PER_CELL - 1; first = 0xFF; second = 0xFF; for (p=0; p < SCREENPLANES; ++p) { if (cursor_color & colorbits[p]) { cursor.plane[p].image[i][0] |= first; if (!singlebyte) cursor.plane[p].image[i][1] |= second; } else { cursor.plane[p].image[i][0] &= ~first; if (!singlebyte) cursor.plane[p].image[i][1] &= ~second; } } break; case CURSOR_FRAME: /* fall through */ default: for(i = 0; i < ROWS_PER_CELL; ++i) { if ((i == 0) || (i == (ROWS_PER_CELL-1))) { first = 0xFF; second = 0xFF; } else { if (singlebyte) first = 0x81; else first = 0x80; second = 0x01; } for (p=0; p < SCREENPLANES; ++p) { if (cursor_color & colorbits[p]) { cursor.plane[p].image[i][0] |= first; if (!singlebyte) cursor.plane[p].image[i][1] |= second; } else { cursor.plane[p].image[i][0] &= ~first; if (!singlebyte) cursor.plane[p].image[i][1] &= ~second; } } } break; } /* * Place the new cell onto the display. * */ for(i=0;i < ROWS_PER_CELL; ++i) { tmp1 = screentable[i+pixy]; tmp1 += pixx; tmp2 = tmp1 + 1; egawriteplane(8); /* memcpy(tmp1,cursor.plane[3].image[i],BYTES_PER_CELL); */ WRITE_ABSOLUTE(tmp1,cursor.plane[3].image[i][0]); if (!singlebyte) WRITE_ABSOLUTE(tmp2,cursor.plane[3].image[i][1]); egawriteplane(4); /* memcpy(tmp1,cursor.plane[2].image[i],BYTES_PER_CELL); */ WRITE_ABSOLUTE(tmp1,cursor.plane[2].image[i][0]); if (!singlebyte) WRITE_ABSOLUTE(tmp2,cursor.plane[2].image[i][1]); egawriteplane(2); /* memcpy(tmp1,cursor.plane[1].image[i],BYTES_PER_CELL); */ WRITE_ABSOLUTE(tmp1,cursor.plane[1].image[i][0]); if (!singlebyte) WRITE_ABSOLUTE(tmp2,cursor.plane[1].image[i][1]); egawriteplane(1); /* memcpy(tmp1,cursor.plane[0].image[i],BYTES_PER_CELL); */ WRITE_ABSOLUTE(tmp1,cursor.plane[0].image[i][0]); if (!singlebyte) WRITE_ABSOLUTE(tmp2,cursor.plane[0].image[i][1]); } egawriteplane(15); #ifdef POSITIONBAR if (inmap) positionbar(); #endif } void vga_HideCursor() { int i,pixx,pixy,x,y; char __far *tmp1; char __far *tmp2; #ifdef REINCARNATION boolean isrogue = Is_rogue_level(&u.uz); boolean singlebyte = (isrogue || iflags.over_view || iflags.traditional_view || !inmap); #else boolean singlebyte = (iflags.over_view || iflags.traditional_view || !inmap); #endif int curtyp; if (inmap && !cursor_type) return; /* CURSOR_INVIS - nothing to do */ /* protection from callers */ x = min(curcol,(CO - 1)); y = min(currow,(LI-1)); if (!singlebyte && ((x < clipx) || (x > clipxmax))) return; pixy = row2y(y); /* convert to pixels */ if (singlebyte) pixx = x; else pixx = col2x((x-clipx)); if (inmap) curtyp = cursor_type; else curtyp = CURSOR_UNDERLINE; if (curtyp == CURSOR_UNDERLINE) /* optimization for uline */ i = ROWS_PER_CELL - 1; else i = 0; for(;i < ROWS_PER_CELL; ++i) { tmp1 = screentable[i+pixy]; tmp1 += pixx; tmp2 = tmp1 + 1; egawriteplane(8); /* memcpy(tmp,undercursor.plane[3].image[i],BYTES_PER_CELL); */ WRITE_ABSOLUTE(tmp1,undercursor.plane[3].image[i][0]); if (!singlebyte) WRITE_ABSOLUTE(tmp2,undercursor.plane[3].image[i][1]); egawriteplane(4); /* memcpy(tmp,undercursor.plane[2].image[i],BYTES_PER_CELL); */ WRITE_ABSOLUTE(tmp1,undercursor.plane[2].image[i][0]); if (!singlebyte) WRITE_ABSOLUTE(tmp2,undercursor.plane[2].image[i][1]); egawriteplane(2); /* memcpy(tmp,undercursor.plane[1].image[i],BYTES_PER_CELL); */ WRITE_ABSOLUTE(tmp1,undercursor.plane[1].image[i][0]); if (!singlebyte) WRITE_ABSOLUTE(tmp2,undercursor.plane[1].image[i][1]); egawriteplane(1); /* memcpy(tmp,undercursor.plane[0].image[i],BYTES_PER_CELL); */ WRITE_ABSOLUTE(tmp1,undercursor.plane[0].image[i][0]); if (!singlebyte) WRITE_ABSOLUTE(tmp2,undercursor.plane[0].image[i][1]); } egawriteplane(15); } # endif /* SIMULATE_CURSOR */ /* WAC simulate graphical pet marks * This is actually a hack so that we don't have to have another tile file for * petmarked monsters - this takes the cell on screen and modifies it * then puts it back. Most of the code is similar to that used in drawing the cursor */ static struct planar_cell_struct underpetmark; static struct planar_cell_struct petmark; void vga_Draw_PetMark(x,y,singlebyte) int x,y; boolean singlebyte; { int i,pixx,pixy,p; char __far *tmp1; char __far *tmp2; unsigned char first,second; /* char on[2] = {0xFF,0xFF}; */ /* char off[2] = {0x00,0x00}; */ #ifdef REINCARNATION if (Is_rogue_level(&u.uz)) return; /* No graphical petmarks on the rogue level */ #endif pixy = row2y(y); /* convert to pixels */ if (singlebyte) pixx = x; else pixx = col2x(x); for(i=0;i < ROWS_PER_CELL; ++i) { tmp1 = screentable[i+pixy]; tmp1 += pixx; tmp2 = tmp1 + 1; egareadplane(3); /* memcpy(underpetmark.plane[3].image[i],tmp1,BYTES_PER_CELL); */ underpetmark.plane[3].image[i][0] = READ_ABSOLUTE(tmp1); if (!singlebyte) underpetmark.plane[3].image[i][1] = READ_ABSOLUTE(tmp2); egareadplane(2); /* memcpy(underpetmark.plane[2].image[i],tmp1,BYTES_PER_CELL); */ underpetmark.plane[2].image[i][0] = READ_ABSOLUTE(tmp1); if (!singlebyte) underpetmark.plane[2].image[i][1] = READ_ABSOLUTE(tmp2); egareadplane(1); /* memcpy(underpetmark.plane[1].image[i],tmp1,BYTES_PER_CELL); */ underpetmark.plane[1].image[i][0] = READ_ABSOLUTE(tmp1); if (!singlebyte) underpetmark.plane[1].image[i][1] = READ_ABSOLUTE(tmp2); egareadplane(0); /* memcpy(underpetmark.plane[0].image[i],tmp1,BYTES_PER_CELL); */ underpetmark.plane[0].image[i][0] = READ_ABSOLUTE(tmp1); if (!singlebyte) underpetmark.plane[0].image[i][1] = READ_ABSOLUTE(tmp2); } /* * Now we have a snapshot of the current cell. * Make a copy of it, then manipulate the copy * to include the cursor, and place the tinkered * version on the display. */ petmark = underpetmark; for(i = 0; i < 5; ++i) { if (i == 0) { if (!singlebyte) first = 0x6C; /* 01101100 */ else first = 0x50; } else if (i == 1) { if (!singlebyte) first = 0xFE; /* 11111110 */ else first = 0xF8; } else if (i == 2) { if (!singlebyte) first = 0x7C; /* 01111100 */ else first = 0x70; } else if (i == 3) { if (!singlebyte) first = 0x38; /* 00111000 */ else first = 0x20; } else { if (!singlebyte) first = 0x10; /* 00010000 */ else first = 0x00; } for (p=0; p < SCREENPLANES; ++p) { if (petmark_color & colorbits[p]) { petmark.plane[p].image[i][0] |= first; } else { petmark.plane[p].image[i][0] &= ~first; } } } /* * Place the new cell onto the display. * */ for(i=0;i < ROWS_PER_CELL; ++i) { tmp1 = screentable[i+pixy]; tmp1 += pixx; tmp2 = tmp1 + 1; egawriteplane(8); /* memcpy(tmp1,petmark.plane[3].image[i],BYTES_PER_CELL); */ WRITE_ABSOLUTE(tmp1,petmark.plane[3].image[i][0]); if (!singlebyte) WRITE_ABSOLUTE(tmp2,petmark.plane[3].image[i][1]); egawriteplane(4); /* memcpy(tmp1,petmark.plane[2].image[i],BYTES_PER_CELL); */ WRITE_ABSOLUTE(tmp1,petmark.plane[2].image[i][0]); if (!singlebyte) WRITE_ABSOLUTE(tmp2,petmark.plane[2].image[i][1]); egawriteplane(2); /* memcpy(tmp1,petmark.plane[1].image[i],BYTES_PER_CELL); */ WRITE_ABSOLUTE(tmp1,petmark.plane[1].image[i][0]); if (!singlebyte) WRITE_ABSOLUTE(tmp2,petmark.plane[1].image[i][1]); egawriteplane(1); /* memcpy(tmp1,petmark.plane[0].image[i],BYTES_PER_CELL); */ WRITE_ABSOLUTE(tmp1,petmark.plane[0].image[i][0]); if (!singlebyte) WRITE_ABSOLUTE(tmp2,petmark.plane[0].image[i][1]); } egawriteplane(15); #ifdef POSITIONBAR if (inmap) positionbar(); #endif } # endif /* OVLB */ #endif /* SCREEN_VGA */ /* vidvga.c */ slashem-0.0.7E7F3/sys/msdos/schema1.BC0000664000076400007640000001503610545462317015353 0ustar aliali/* SCCS Id: @(#)schema1.BC 3.4 1999/10/28 */ /* Copyright (c) Yitzhak Sapir, 1999 */ /* */ /* NetHack Overlay Schema */ /* Minimal extended memory available, lots of 640K base RAM free */ /* Overlay buffer size will be (20 + 20 + 19) = 59K (sum of 3 largest overlays). */ /* Requires about 490K (for exe load plus overlay buffer), but */ /* an additional 70K free (minimum) will be needed for malloc calls, */ /* bringing the total requirement to about 560K. */ /* Optimized for minimal overlay turns. */ /* */ -zCallmain_0 -zAOVLY -zCOVL1 -zCallmain_1 -zAOVLY -zCOVL2 -zCallmain_b -zAOVLY -zCOVL3 -zCalloc_o -zCapply_0 -zAOVLY -zCOVL4 -zCapply_1 -zAOVLY -zCOVL5 -zCapply_b -zAOVLY -zCOVL6 -zCartifact_0 -zAOVLY -zCOVL7 -zCartifact_1 -zAOVLY -zCOVL8 -zCartifact_b -zAOVLY -zCOVL9 -zCattrib_0 -zCattrib_1 -zAOVLY -zCOVL10 -zCattrib_2 -zAOVLY -zCOVL11 -zCattrib_b -zAOVLY -zCOVL12 -zCball_o -zAOVLY -zCOVL13 -zCbones_o -zAOVLY -zCOVL14 -zCbotl_0 -zCbotl_1 -zAOVLY -zCOVL15 -zCbotl_b -zAOVLY -zCOVL16 -zCcmd_0 -zCcmd_1 -zAOVLY -zCOVL17 -zCcmd_b -zAOVLY -zCOVL18 -zCdbridge_0 -zCdbridge_1 -zAOVLY -zCOVL19 -zCdbridge_b -zAOVLY -zCOVL20 -zCdecl_o -zAOVLY -zCOVL21 -zCdetect_o -zCdig_o -zAOVLY -zCOVL22 -zCdisplay_o -zCdlb_o -zAOVLY -zCOVL23 -zCdo_0 -zAOVLY -zCOVL24 -zCdo_1 -zAOVLY -zCOVL25 -zCdo_2 -zAOVLY -zCOVL26 -zCdo_3 -zAOVLY -zCOVL27 -zCdo_b -zAOVLY -zCOVL28 -zCdo_name_0 -zAOVLY -zCOVL29 -zCdo_name_2 -zAOVLY -zCOVL30 -zCdo_name_b -zAOVLY -zCOVL31 -zCdo_wear_0 -zAOVLY -zCOVL32 -zCdo_wear_1 -zAOVLY -zCOVL33 -zCdo_wear_2 -zAOVLY -zCOVL34 -zCdo_wear_b -zAOVLY -zCOVL35 -zCdog_1 -zAOVLY -zCOVL36 -zCdog_2 -zAOVLY -zCOVL37 -zCdog_b -zAOVLY -zCOVL38 -zCdogmove_0 -zAOVLY -zCOVL39 -zCdogmove_b -zCdokick_o -zAOVLY -zCOVL40 -zCdothrow_o -zAOVLY -zCOVL41 -zCdrawing_o -zAOVLY -zCOVL42 -zCdungeon_0 -zCdungeon_1 -zAOVLY -zCOVL43 -zCeat_0 -zAOVLY -zCOVL44 -zCeat_1 -zAOVLY -zCOVL45 -zCeat_b -zAOVLY -zCOVL46 -zCend_o -zAOVLY -zCOVL47 -zCengrave_0 -zCengrave_1 -zAOVLY -zCOVL48 -zCengrave_2 -zAOVLY -zCOVL49 -zCengrave_b -zAOVLY -zCOVL50 -zCexper_o -zAOVLY -zCOVL51 -zCexplode_0 -zAOVLY -zCOVL52 -zCexplode_1 -zAOVLY -zCOVL53 -zCextralev_o -zAOVLY -zCOVL54 -zCfiles_o -zAOVLY -zCOVL55 -zCfountain_o -zAOVLY -zCOVL56 -zCgetline_1 -zAOVLY -zCOVL57 -zCgetline_2 -zAOVLY -zCOVL58 -zChack_1 -zChack_2 -zAOVLY -zCOVL59 -zChack_3 -zChack_b -zAOVLY -zCOVL60 -zChacklib_0 -zChacklib_1 -zChacklib_2 -zChacklib_b -zAOVLY -zCOVL61 -zCinvent_0 -zCinvent_1 -zAOVLY -zCOVL62 -zCinvent_2 -zAOVLY -zCOVL63 -zCinvent_3 -zAOVLY -zCOVL64 -zCinvent_b -zAOVLY -zCOVL65 -zClight_3 -zAOVLY -zCOVL66 -zClock_0 -zAOVLY -zCOVL67 -zClock_b -zAOVLY -zCOVL68 -zCmail_0 -zAOVLY -zCOVL68 -zCmail_b -zAOVLY -zCOVL69 -zCmakemon_0 -zAOVLY -zCOVL70 -zCmakemon_1 -zAOVLY -zCOVL71 -zCmakemon_2 -zAOVLY -zCOVL72 -zCmakemon_b -zAOVLY -zCOVL73 -zCmcastu_0 -zAOVLY -zCOVL74 -zCmcastu_b -zAOVLY -zCOVL75 -zCmhitm_0 -zAOVLY -zCOVL76 -zCmhitm_b -zAOVLY -zCOVL77 -zCmhitu_0 -zAOVLY -zCOVL78 -zCmhitu_1 -zAOVLY -zCOVL79 -zCmhitu_b -zAOVLY -zCOVL80 -zCminion_o -zAOVLY -zCOVL81 -zCmklev_o -zAOVLY -zCOVL82 -zCmkmap_o -zAOVLY -zCOVL83 -zCmkmaze_o -zAOVLY -zCOVL84 -zCmkobj_0 -zAOVLY -zCOVL85 -zCmkobj_1 -zAOVLY -zCOVL86 -zCmkobj_b -zAOVLY -zCOVL87 -zCmkroom_0 -zAOVLY -zCOVL88 -zCmkroom_b -zAOVLY -zCOVL89 -zCmon_0 -zCmon_1 -zAOVLY -zCOVL90 -zCmon_2 -zAOVLY -zCOVL91 -zCmon_b -zAOVLY -zCOVL92 -zCmondata_0 -zCmondata_1 -zAOVLY -zCOVL93 -zCmondata_2 -zAOVLY -zCOVL94 -zCmondata_b -zAOVLY -zCOVL95 -zCmonmove_0 -zCmonmove_1 -zCmonmove_2 -zCmonmove_b -zAOVLY -zCOVL96 -zCmonst_o -zAOVLY -zCOVL97 -zCmonstr_o -zAOVLY -zCOVL98 -zCmplayer_o -zAOVLY -zCOVL99 -zCmsdos_0 -zCmsdos_b -zAOVLY -zCOVL100 -zCmthrowu_0 -zAOVLY -zCOVL101 -zCmthrowu_1 -zAOVLY -zCOVL102 -zCmthrowu_b -zAOVLY -zCOVL103 -zCmuse_o -zAOVLY -zCOVL104 -zCmusic_o -zAOVLY -zCOVL105 -zCo_init_o -zAOVLY -zCOVL106 -zCobjects_o -zAOVLY -zCOVL107 -zCobjnam_0 -zAOVLY -zCOVL108 -zCobjnam_1 -zAOVLY -zCOVL109 -zCobjnam_b -zAOVLY -zCOVL110 -zCoptions_o -zAOVLY -zCOVL111 -zCovlinit_o -zCpager_o -zAOVLY -zCOVL112 -zCpckeys_o -zCpcmain_0 -zCpcmain_1 -zAOVLY -zCOVL113 -zCpcmain_b -zAOVLY -zCOVL114 -zCpctiles_0 -zCpctiles_b -zCpcunix_b -zAOVLY -zCOVL115 -zCpickup_o -zAOVLY -zCOVL116 -zCpline_b -zAOVLY -zCOVL117 -zCpolyself_0 -zAOVLY -zCOVL118 -zCpolyself_1 -zAOVLY -zCOVL119 -zCpolyself_b -zAOVLY -zCOVL120 -zCpotion_b -zAOVLY -zCOVL121 -zCpray_o -zAOVLY -zCOVL122 -zCpriest_0 -zAOVLY -zCOVL123 -zCpriest_b -zAOVLY -zCOVL124 -zCquest_o -zAOVLY -zCOVL125 -zCquestpgr_o -zAOVLY -zCOVL126 -zCrandom_o -zCread_b -zAOVLY -zCOVL127 -zCrect_o -zAOVLY -zCOVL128 -zCregion_o -zAOVLY -zCOVL129 -zCrestore_o -zAOVLY -zCOVL130 -zCrip_o -zAOVLY -zCOVL131 -zCrnd_0 -zCrnd_1 -zAOVLY -zCOVL132 -zCrnd_b -zAOVLY -zCOVL133 -zCrole_o -zAOVLY -zCOVL113 -zCrumors_o -zAOVLY -zCOVL134 -zCsave_o -zAOVLY -zCOVL135 -zCshk_0 -zAOVLY -zCOVL136 -zCshk_1 -zAOVLY -zCOVL137 -zCshk_2 -zAOVLY -zCOVL138 -zCshk_3 -zAOVLY -zCOVL139 -zCshk_b -zAOVLY -zCOVL140 -zCshknam_0 -zAOVLY -zCOVL141 -zCshknam_b -zAOVLY -zCOVL142 -zCsit_o -zAOVLY -zCOVL143 -zCsound_o -zCsounds_0 -zAOVLY -zCOVL144 -zCsounds_b -zAOVLY -zCOVL145 -zCsp_lev_o -zAOVLY -zCOVL146 -zCspell_o -zAOVLY -zCOVL147 -zCsteal_0 -zAOVLY -zCOVL148 -zCsteal_1 -zAOVLY -zCOVL149 -zCsteal_b -zAOVLY -zCOVL150 -zCsteed_o -zAOVLY -zCOVL188 -zCsys_o -zAOVLY -zCOVL151 -zCteleport_o -zAOVLY -zCOVL152 -zCtermcap_0 -zAOVLY -zCOVL153 -zCtermcap_1 -zAOVLY -zCOVL154 -zCtermcap_b -zAOVLY -zCOVL155 -zCtile_o -zCtimeout_0 -zAOVLY -zCOVL156 -zCtimeout_1 -zAOVLY -zCOVL157 -zCtimeout_b -zAOVLY -zCOVL158 -zCtopl_1 -zAOVLY -zCOVL159 -zCtopl_2 -zAOVLY -zCOVL160 -zCtopl_b -zAOVLY -zCOVL161 -zCtopten_o -zAOVLY -zCOVL162 -zCtrack_0 -zAOVLY -zCOVL163 -zCtrack_1 -zAOVLY -zCOVL164 -zCtrack_b -zAOVLY -zCOVL165 -zCtrap_0 -zCtrap_1 -zAOVLY -zCOVL166 -zCtrap_2 -zAOVLY -zCOVL167 -zCtrap_3 -zAOVLY -zCOVL168 -zCtrap_b -zAOVLY -zCOVL169 -zCtty_o -zAOVLY -zCOVL170 -zCu_init_o -zAOVLY -zCOVL171 -zCuhitm_o -zAOVLY -zCOVL172 -zCvault_0 -zAOVLY -zCOVL173 -zCvault_b -zAOVLY -zCOVL174 -zCversion_o -zAOVLY -zCOVL175 -zCvideo_0 -zCvideo_1 -zCvideo_b -zCvidtxt_0 -zCvidtxt_b -zCvidvga_0 -zCvidvga_1 -zCvidvga_2 -zAOVLY -zCOVL176 -zCvidvga_b -zCvis_tab_o -zAOVLY -zCOVL177 -zCvision_o -zCweapon_0 -zAOVLY -zCOVL178 -zCweapon_1 -zAOVLY -zCOVL179 -zCweapon_b -zAOVLY -zCOVL180 -zCwere_0 -zAOVLY -zCOVL181 -zCwere_b -zAOVLY -zCOVL182 -zCwield_o -zAOVLY -zCOVL183 -zCwindows_o -zAOVLY -zCOVL184 -zCwintty_o -zCwizard_0 -zAOVLY -zCOVL185 -zCwizard_b -zAOVLY -zCOVL186 -zCworm_o -zAOVLY -zCOVL187 -zCworn_o -zAOVLY -zCOVL188 -zCwrite_o -zAOVLY -zCOVL189 -zCzap_0 -zAOVLY -zCOVL190 -zCzap_1 -zAOVLY -zCOVL191 -zCzap_2 -zAOVLY -zCOVL192 -zCzap_3 -zAOVLY -zCOVL193 -zCzap_b -zAOVLY -zCOVL194 slashem-0.0.7E7F3/sys/msdos/Makefile.MSC0000664000076400007640000015667110545462317015720 0ustar aliali# SCCS Id: @(#)Makefile.MSC 3.2 96/10/25 # Copyright (c) NetHack PC Development Team, 1996. # NetHack may be freely distributed. See license for details. # # PC NetHack 3.2 Makefile for Microsoft(tm) "C" >= 7.0 and MSVC >= 1.0 # # Nota Bene: Before you get to here you should have already read # the Install.dos file located in the sys/msdos directory. # # This Makefile is for use with Microsoft C version 7 and Microsoft Visual C++ # Professional Edition (MSVC) version 1.0 or greater. # # This Makefile is specific to Microsoft's NMAKE which is supplied with the # more recent Microsoft C compilers. # It supports only one overlay management facility - MOVE. # (This Makefile won't work with make45l or NDMAKE) # # 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 or byacc) # .l lex (such as flex) # # Game Installation Variables. # NOTE: Make sure GAMEDIR exists before nmake is started. # GAME = NetHack GAMEDIR = c:\games\nethack # # # Directories # DAT = ..\dat DOC = ..\doc INCL = ..\include SRC = ..\src OBJ = o MSYS = ..\sys\msdos SYS = ..\sys\share UTIL = ..\util WTTY = ..\win\tty WSHR = ..\win\share # # Compiler File Info. # ($(MAKE) macro is often predefined, so we use $(MAKEBIN) instead.) # CC = cl # Compiler LINK = link # Linker ASM = masm # Assembler (not currently needed for MSC 7 and > ) MAKEBIN = nmake UUDECODE = uudecode # Unix style uudecoder # # Yacc/Lex ... if you got 'em. # # If you have yacc and lex programs (or work-alike such as bison # and flex), comment out the upper two lines below, and uncomment # the lower two. # DO_YACC = YACC_MSG DO_LEX = LEX_MSG #DO_YACC = YACC_ACT #DO_LEX = LEX_ACT # # - Specify your yacc and lex programs (or work-alikes for each) here. # YACC = bison -y #YACC = yacc #YACC = byacc LEX = flex #LEX = lex # # - Specify your flex skeleton file (if needed). # FLEXSKEL = #FLEXSKEL = -Sc:\tools16\flex.ske # # - Your yacc (or work-alike) output files # YTABC = y_tab.c YTABH = y_tab.h #YTABC = ytab.c #YTABH = ytab.h # # - Your lex (or work-alike) output files # LEXYYC = lexyy.c #LEXYYC = lex.yy.c # # Optional high-quality BSD random number generation routines # (see pcconf.h). Set to nothing if not used. # RANDOM = $(OBJ)\random.o #RANDOM = # # If TERMLIB is #defined in the source (in include\pcconf.h), # comment out the upper line and uncomment the lower. Make sure # that TERMLIB contains the full pathname to the termcap library. TERMLIB = #TERMLIB = $(SYS)\termcap.lib # # MEMORY USAGE AND OVERLAYING # # Overlay Schema 1 # # - Minimal extended memory available, lots of 640K base RAM free # Minimize overlay turns. Requires that a minimum of # 560K RAM be free as follows: # 430K Executable load requirement # 60K Overlay buffer # 70K for malloc() calls # 560K Total memory requirement # # Overlay Schema 2 # # - Favor small load size, requires extended memory for bearable performance. # If you have very little base 640K RAM available, but lots of extended # memory for caching overlays, you might try this. (eg. A machine with # lots of TSR's or network drivers). Do not try to set SCHEMA = 2 # without a disk cache and extended memory. # 360K Executable load requirement # 60K Overlay buffer # 70K for malloc() calls # 419K Total memory requirement # # Overlay Schema 3 # # - Minimal extended memory available, lots of 640K base RAM free # Similar to schema1, but the overlay buffer is twice as large, so # in theory more overlays can be resident at the same time. The cost is # that the base memory requirement goes up considerably. # This requires that you obtain the moveinit.c and moveapi.h files from # your Microsoft C source/move directory, and place them into the src # directory. Then apply the patch moveinit.pat file found in sys/msdos. # Requirements: # 360K Executable load requirement # 95K Overlay buffer # 70K for malloc() calls # 525K Total memory requirement # SCHEMA = 1 # # OPTIONAL TILE SUPPORT. # # This release of NetHack allows you to build a version of NetHack # that will draw 16x16 color tiles on the display to represent # NetHack maps, objects, monsters, etc. on machines with appropriate # display hardware. Currently the only supported video hardware is # VGA. # # Note: You can build NetHack with tile support and then choose # whether to use it or not at runtime via the NetHack.cnf file option # "video". # TILESUPPORT = Y # # C COMPILER AND LINKER SETTINGS # # For debugging ability, comment out the upper three # macros and uncomment the lower three. You can also # uncomment only either LDFLAGSU or LDFLAGSN if you # want to include debug information only in the utilities # or only in the game file. #CDFLAGS = #LDFLAGSN = #LDFLAGSU = CDFLAGS = /Zi # use debug info (compiler) LDFLAGSN = /CO # use debug info (linker - game) LDFLAGSU = /CO # use debug info (linker - utilities) # # - Force a change in the C warning level for all builds. # (Its W0 setting in the CL environment variable will take # precedence if left blank here). # CW = #CW =/W3 # # Select whether to use pre-compiled headers or not. # Set PRECOMPHEAD to Y to use pre-compiled headers, set it to anything # else and pre-compiled headers will not be used. # (Pre-compiled headers speed up compiles, but require a bit more # disk space during the build. The pre-compiled headers can be deleted # afterwards via DEL *.PCH if desired). # PRECOMPHEAD = N # # C Compiler Flags # # Note: # # CL environment variable should already be set to: # CL= /AL /G2 /Oo /Gs /Gt16 /Zp1 /W0 /I..\include /nologo /DMOVERLAY # CFLAGS = /c # Uncomment the line below if you want to store all the level files, # help files, etc. in a single library file (recommended). USE_DLB = Y # ######################################################################## ######################################################################## # # Nothing below here should have to be changed. # ######################################################################## ######################################################################## # # Warning: # # Changing anything below here means that you should be *very* # familiar with your compiler's workings, *very* knowledgeable # about the overlay structure and mechanics of NetHack, and *very* # confident in your understanding of Makefiles and Make utilities. # ######################################################################## # # Default Make Procedure # default: $(GAME) # ######################################################################## # Tile preparation # ! IF ("$(TILESUPPORT)"=="Y") TILEGAME = $(OBJ)\tile.o $(OBJ)\pctiles.0 $(OBJ)\pctiles.b # # - VGA Tile Support, uncomment these three lines. # TILEVGA = $(OBJ)\vidvga.0 $(OBJ)\vidvga.1 $(OBJ)\vidvga.2 $(OBJ)\vidvga.b PLANAR_TIB = NetHack1.tib OVERVIEW_TIB = NetHacko.tib # # Leave this line uncommented and unchanged. TILEUTIL = $(TILEGAME) $(TILEVGA) $(UTIL)\tile2bin.exe $(UTIL)\til2bin2.exe \ $(PLANAR_TIB) $(OVERVIEW_TIB) ! ENDIF ! IF ("$(USE_DLB)"=="Y") DLB = nhdat ! ELSE DLB = ! ENDIF # ############################################################################# # # General Overlay Schema Settings # LNKOPT = schema$(SCHEMA).def # # - Specific Overlay Schema Settings # ! IF ($(SCHEMA)==1) INTOVL = /DYNAMIC:1250 /NOE OVLINIT = ! ENDIF ! IF ($(SCHEMA)==2) INTOVL = /DYNAMIC:1380 /NOE OVLINIT = ! ENDIF ! IF ($(SCHEMA)==3) INTOVL = /DYNAMIC:1170 OVLINIT = $(OBJ)\moveinit.o $(OBJ)\ovlinit.o ! ENDIF # ############################################################################# # # C Compiler and Linker Setup Options # (To Maintainer; modify only if absolutely necessary) # # # Model # MODEL = L # # - Optional C library specifier for those with non-standard # libraries or a multiple-target library setup. # CLIB = #CLIB = llibcer /nod # # Compiler Options # CNOLNK = /c # just generate .OBJ CPCHUSE = /YuHACK.H # use precompiled headers CPCHGEN = /YcHACK.H # generate precompiled headers CPCHNAM = /Fp # set the name of the precompiled header file CPCHEXT = .PCH # precompiled header extension CDEFINE = /D # define a macro CCSNAM = /NT # set the code segment name COBJNAM = /Fo # name the .OBJ file CNOOPT = /f- /Od # disable optimizations (must be first in line) # /f- = don't use the "fast" compiler,its buggy # # Linker Options # LWCASE = /NOI # treat case as significant LMAP = /MAP # create map file LSTKSZ = /ST: # set stack size LMAXSEG = /SE:400 # maximum number of segments allowed LMAXALL = /CPARM:1 # maximum program memory allocation (?) LINFO = /INFO # display link information while processing # # Stack Sizes # STKSUTL = 4096 # Utilities Stack Size STKSNRM = 5120 # Normal Stack Size LUSTACK = $(LSTKSZ)$(STKSUTL) # Utilities Stack Set for Linker LNSTACK = $(LSTKSZ)$(STKSNRM) # Normal Stack Set for Linker # ######################################################################## # DLB preparation # ! IF ("$(USE_DLB)"=="Y") DLBFLG = $(CDEFINE)DLB ! ELSE DLBFLG = ! ENDIF # ######################################################################## # tile preparation # ! IF ("$(TILESUPPORT)"=="Y") TILFLG = $(CDEFINE)USE_TILES ! ELSE TILFLG = ! ENDIF ############################################################################# # # Overlay switches # COVL0 = $(CDEFINE)OVL0 COVL1 = $(CDEFINE)OVL1 COVL2 = $(CDEFINE)OVL2 COVL3 = $(CDEFINE)OVL3 COVLB = $(CDEFINE)OVLB # # Flags # FLAGOPT = $(DLBFLG) $(TILFLG) # # Precompiled Header Section # #util builds CFLAGSU = $(CDFLAGS) $(CFLAGS) $(CW) $(FLAGOPT) $(CUSTACK) #normal build, no PCH CFLAGSN = $(CDFLAGS) $(CFLAGS) $(CW) $(FLAGOPT) $(CNSTACK) #no optimizations CFLAGNO = $(CNOOPT) $(CFLAGSN) ! IF ("$(PRECOMPHEAD)"!="Y") CFLAGCO = $(COVLO) CFLAGUO = $(COVLO) CFLAGC0 = $(COVL0) CFLAGU0 = $(COVL0) CFLAGC1 = $(COVL1) CFLAGU1 = $(COVL1) CFLAGC2 = $(COVL2) CFLAGU2 = $(COVL2) CFLAGC3 = $(COVL3) CFLAGU3 = $(COVL3) CFLAGCB = $(COVLB) CFLAGUB = $(COVLB) PCHO = PCH0 = PCH1 = PCH2 = PCH3 = PCHB = precomp.msg: @echo Not using precompiled headers... ! ELSE # .o files CFLAGUO = $(CPCHUSE) $(CPCHNAM)PHO$(CPCHEXT) $(COVLO) CFLAGCO = $(CPCHGEN) $(CPCHNAM)PHO$(CPCHEXT) $(COVLO) PCHO = PHO$(CPCHEXT) # .0 files CFLAGU0 = $(CPCHUSE) $(CPCHNAM)PH0$(CPCHEXT) $(COVL0) CFLAGC0 = $(CPCHGEN) $(CPCHNAM)PH0$(CPCHEXT) $(COVL0) PCH0 = PH0$(CPCHEXT) # .1 files CFLAGU1 = $(CPCHUSE) $(CPCHNAM)PH1$(CPCHEXT) $(COVL1) CFLAGC1 = $(CPCHGEN) $(CPCHNAM)PH1$(CPCHEXT) $(COVL1) PCH1 = PH1$(CPCHEXT) # .2 files CFLAGU2 = $(CPCHUSE) $(CPCHNAM)PH2$(CPCHEXT) $(COVL2) CFLAGC2 = $(CPCHGEN) $(CPCHNAM)PH2$(CPCHEXT) $(COVL2) PCH2 = PH2$(CPCHEXT) # .3 files CFLAGU3 = $(CPCHUSE) $(CPCHNAM)PH3$(CPCHEXT) $(COVL3) CFLAGC3 = $(CPCHGEN) $(CPCHNAM)PH3$(CPCHEXT) $(COVL3) PCH3 = PH3$(CPCHEXT) # .B files CFLAGUB = $(CPCHUSE) $(CPCHNAM)PHB$(CPCHEXT) $(COVLB) CFLAGCB = $(CPCHGEN) $(CPCHNAM)PHB$(CPCHEXT) $(COVLB) PCHB = PHB$(CPCHEXT) precomp.msg: @echo Using precompiled headers... ! ENDIF FLAGCO = $(CFLAGSN) $(CFLAGCO) FLAGUO = $(CFLAGSN) $(CFLAGUO) FLAGC0 = $(CFLAGSN) $(CFLAGC0) FLAGU0 = $(CFLAGSN) $(CFLAGU0) FLAGC1 = $(CFLAGSN) $(CFLAGC1) FLAGU1 = $(CFLAGSN) $(CFLAGU1) FLAGC2 = $(CFLAGSN) $(CFLAGC2) FLAGU2 = $(CFLAGSN) $(CFLAGU2) FLAGC3 = $(CFLAGSN) $(CFLAGC3) FLAGU3 = $(CFLAGSN) $(CFLAGU3) FLAGCB = $(CFLAGSN) $(CFLAGCB) FLAGUB = $(CFLAGSN) $(CFLAGUB) # End of Pre-compiled header section #=========================================================================== # # Controls whether MOVE tracing is enabled in the executable # This should be left commented unless you are tinkering with the # overlay structure of NetHack. The executable runs _very_ # slowly when the movetr.lib is linked in. # #MOVETR= movetr.lib # do not change this ! IF ("$(MOVETR)"!="") MVTRCL = $(CDEFINE)MOVE_PROF ! ELSE MVTRCL = ! ENDIF # # Linker options for building various things. # LFLAGSU = $(LDFLAGSU) $(LUSTACK) $(LINIT) LFLAGSN = $(LDFLAGSN) $(LNSTACK) $(LWCASE) $(LMAXSEG) $(INTOVL) $(LMAXALL) \ $(LINFO) $(LINIT) $(LOVL) # # Make Roolz dude. # Due to the inadequacy of some makes these must accord with a # topological sort of the generated-from relation... output on # the left, input on the right. Trust me. # .SUFFIXES: .exe .0 .1 .2 .3 .B .o .til .uu .c .y .l # # Rules for files in src # .c{$(OBJ)}.o: @$(CC) $(FLAGUO) $(CCSNAM)$(@F) $(COBJNAM)$@ $< {$(SRC)}.c{$(OBJ)}.o: $(CC) $(FLAGUO) $(CCSNAM)$(@F) $(COBJNAM)$@ $< {$(SRC)}.c{$(OBJ)}.0: $(CC) $(FLAGU0) $(CCSNAM)$(@F) $(COBJNAM)$@ $< {$(SRC)}.c{$(OBJ)}.1: $(CC) $(FLAGU1) $(CCSNAM)$(@F) $(COBJNAM)$@ $< {$(SRC)}.c{$(OBJ)}.2: $(CC) $(FLAGU2) $(CCSNAM)$(@F) $(COBJNAM)$@ $< {$(SRC)}.c{$(OBJ)}.3: $(CC) $(FLAGU3) $(CCSNAM)$(@F) $(COBJNAM)$@ $< {$(SRC)}.c{$(OBJ)}.B: $(CC) $(FLAGUB) $(CCSNAM)$(@F) $(COBJNAM)$@ $< # # Rules for files in sys\share # {$(SYS)}.c{$(OBJ)}.o: $(CC) $(FLAGUO) $(COBJNAM)$@ $< {$(SYS)}.c{$(OBJ)}.0: $(CC) $(FLAGU0) $(CCSNAM)$(@F) $(COBJNAM)$@ $< {$(SYS)}.c{$(OBJ)}.1: $(CC) $(FLAGU1) $(CCSNAM)$(@F) $(COBJNAM)$@ $< {$(SYS)}.c{$(OBJ)}.2: $(CC) $(FLAGU2) $(CCSNAM)$(@F) $(COBJNAM)$@ $< {$(SYS)}.c{$(OBJ)}.3: $(CC) $(FLAGU3) $(CCSNAM)$(@F) $(COBJNAM)$@ $< {$(SYS)}.c{$(OBJ)}.B: $(CC) $(FLAGUB) $(CCSNAM)$(@F) $(COBJNAM)$@ $< # # Rules for files in sys\msdos # {$(MSYS)}.c{$(OBJ)}.o: $(CC) $(FLAGUO) $(COBJNAM)$@ $< {$(MSYS)}.c{$(OBJ)}.0: $(CC) $(FLAGU0) $(CCSNAM)$(@F) $(COBJNAM)$@ $< {$(MSYS)}.c{$(OBJ)}.1: $(CC) $(FLAGU1) $(CCSNAM)$(@F) $(COBJNAM)$@ $< {$(MSYS)}.c{$(OBJ)}.2: $(CC) $(FLAGU2) $(CCSNAM)$(@F) $(COBJNAM)$@ $< {$(MSYS)}.c{$(OBJ)}.3: $(CC) $(FLAGU3) $(CCSNAM)$(@F) $(COBJNAM)$@ $< {$(MSYS)}.c{$(OBJ)}.B: $(CC) $(FLAGUB) $(CCSNAM)$(@F) $(COBJNAM)$@ $< {$(MSYS)}.h{$(INCL)}.h: @copy $< $@ # # Rules for files in util # {$(UTIL)}.c{$(OBJ)}.o: $(CC) $(CFLAGSU) $(CCSNAM)$(@F) $(COBJNAM)$@ $< # # Rules for files in win\share # {$(WSHR)}.c.o: @$(CC) $(FLAGUO) $(COBJNAM)$@ $< {$(WSHR)}.c{$(OBJ)}.o: @$(CC) $(FLAGUO) $(COBJNAM)$@ $< {$(WSHR)}.h{$(INCL)}.h: @copy $< $@ {$(WSHR)}.txt{$(DAT)}.txt: @copy $< $@ # # Rules for files in win\tty # {$(WTTY)}.c{$(OBJ)}.o: $(CC) $(FLAGUO) $(COBJNAM)$@ $< {$(WTTY)}.c{$(OBJ)}.0: $(CC) $(FLAGU0) $(CCSNAM)$(@F) $(COBJNAM)$@ $< {$(WTTY)}.c{$(OBJ)}.1: $(CC) $(FLAGU1) $(CCSNAM)$(@F) $(COBJNAM)$@ $< {$(WTTY)}.c{$(OBJ)}.2: $(CC) $(FLAGU2) $(CCSNAM)$(@F) $(COBJNAM)$@ $< {$(WTTY)}.c{$(OBJ)}.3: $(CC) $(FLAGU3) $(CCSNAM)$(@F) $(COBJNAM)$@ $< {$(WTTY)}.c{$(OBJ)}.B: $(CC) $(FLAGUB) $(CCSNAM)$(@F) $(COBJNAM)$@ $< # # NETHACK OBJECTS # # This section creates shorthand macros for many objects # referenced later on in the Makefile. # # # Shorten up the location for some files # O = $(OBJ)\ # comment so \ isn't last char U = $(UTIL)\ # comment so \ isn't last char # # Utility Objects. # MAKESRC = $(U)makedefs.c SPLEVSRC = $(U)lev_yacc.c $(U)lev_$(LEX).c $(U)lev_main.c $(U)panic.c DGNCOMPSRC = $(U)dgn_yacc.c $(U)dgn_$(LEX).c $(U)dgn_main.c MAKEOBJS = $(O)makedefs.o $(O)monst.o $(O)objects.o SPLEVOBJS =$(O)lev_yacc.o $(O)lev_$(LEX).o $(O)lev_main.o \ $(O)alloc.o $(O)decl.o $(O)drawing.o $(O)monst.o \ $(O)objects.o $(O)panic.o $(O)stubvid.o DGNCOMPOBJS =$(O)dgn_yacc.o $(O)dgn_$(LEX).o $(O)dgn_main.o \ $(O)alloc.o $(O)panic.o RECOVOBJS = $(O)recover.o GIFREADERS =$(O)gifread.o $(O)alloc.o $(O)panic.o TEXT_IO =$(O)tiletext.o $(O)tiletxt.o $(O)drawing.o \ $(O)decl.o $(O)monst.o $(O)objects.o $(O)stubvid.o PPMWRITERS = $(O)ppmwrite.o $(O)alloc.o $(O)panic.o GIFREAD2 =$(O)gifread2.o $(O)alloc.o $(O)panic.o TEXT_IO2 =$(O)tiletex2.o $(O)tiletxt2.o $(O)drawing.o \ $(O)decl.o $(O)monst.o $(O)objects.o $(O)stubvid.o PPMWRIT2 = $(O)ppmwrit2.o $(O)alloc.o $(O)panic.o TILEFILES = $(WSHR)\monsters.txt $(WSHR)\objects.txt $(WSHR)\other.txt TILEFILES2 = $(WSHR)\monthin.txt $(WSHR)\objthin.txt $(WSHR)\oththin.txt DLBOBJS = $(O)dlb_main.o $(O)dlb.o $(O)alloc.o $(O)panic.o # # Object files for the game itself. # OBJ01 = $(O)alloc.o $(RANDOM) $(O)decl.o $(O)objects.o \ $(O)muse.o $(O)display.o $(O)vision.o \ $(O)rect.o $(O)vis_tab.o $(O)monst.o $(O)wintty.o \ $(O)files.o $(O)sys.o $(O)monstr.o $(O)minion.o \ $(O)worm.o $(O)detect.o $(O)exper.o $(O)mplayer.o \ $(O)uhitm.o $(O)pager.o $(O)windows.o $(O)quest.o \ $(O)questpgr.o $(O)write.o $(O)drawing.o $(O)dokick.o \ $(O)dothrow.o $(O)pickup.o $(O)pray.o $(O)spell.o \ $(O)ball.o $(O)wield.o $(O)worn.o $(O)fountain.o \ $(O)music.o $(O)rumors.o $(O)dlb.o $(O)sit.o \ $(O)bones.o $(O)mklev.o $(O)save.o $(O)restore.o \ $(O)mkmaze.o $(O)mkmap.o $(O)end.o $(O)o_init.o \ $(O)options.o $(O)rip.o $(O)sound.o $(O)teleport.o \ $(O)topten.o $(O)tty.o $(O)u_init.o $(O)extralev.o \ $(O)sp_lev.o $(O)dig.o $(O)pckeys.o OVL0 = $(O)allmain.0 $(O)apply.0 $(O)artifact.0 $(O)attrib.0 \ $(O)botl.0 $(O)cmd.0 $(O)dbridge.0 $(O)do.0 \ $(O)do_name.0 $(O)do_wear.0 $(O)dogmove.0 $(O)dungeon.0 \ $(O)eat.0 $(O)engrave.0 $(O)hacklib.0 $(O)invent.0 \ $(O)lock.0 $(O)pcmain.0 $(O)mail.0 $(O)makemon.0 \ $(O)mcastu.0 $(O)mhitm.0 $(O)mhitu.0 $(O)mkobj.0 \ $(O)mkroom.0 $(O)mon.0 $(O)mondata.0 $(O)monmove.0 \ $(O)mthrowu.0 $(O)objnam.0 $(O)polyself.0 $(O)priest.0 \ $(O)rnd.0 $(O)shknam.0 $(O)sounds.0 $(O)steal.0 \ $(O)timeout.0 $(O)track.0 $(O)trap.0 $(O)vault.0 \ $(O)weapon.0 $(O)were.0 $(O)wizard.0 $(O)msdos.0 \ $(O)termcap.0 $(O)video.0 $(O)vidtxt.0 $(O)zap.0 \ $(O)explode.0 $(O)shk.0 OVL1 = $(O)allmain.1 $(O)apply.1 $(O)artifact.1 $(O)attrib.1 \ $(O)botl.1 $(O)cmd.1 $(O)dbridge.1 $(O)do.1 \ $(O)do_wear.1 $(O)dog.1 $(O)dungeon.1 $(O)eat.1 \ $(O)engrave.1 $(O)hack.1 $(O)hacklib.1 $(O)invent.1 \ $(O)makemon.1 $(O)mhitu.1 $(O)mkobj.1 $(O)mon.1 \ $(O)mondata.1 $(O)monmove.1 $(O)mthrowu.1 $(O)objnam.1 \ $(O)pcmain.1 $(O)polyself.1 $(O)rnd.1 $(O)shk.1 \ $(O)steal.1 $(O)timeout.1 $(O)track.1 $(O)trap.1 \ $(O)weapon.1 $(O)getline.1 $(O)termcap.1 $(O)topl.1 \ $(O)video.1 $(O)zap.1 $(O)explode.1 OVL2 = $(O)attrib.2 $(O)do.2 $(O)do_name.2 $(O)do_wear.2 \ $(O)dog.2 $(O)engrave.2 $(O)hack.2 $(O)hacklib.2 \ $(O)invent.2 $(O)makemon.2 $(O)mon.2 $(O)mondata.2 \ $(O)monmove.2 $(O)getline.2 $(O)shk.2 $(O)topl.2 \ $(O)trap.2 $(O)zap.2 OVL3 = $(O)do.3 $(O)hack.3 $(O)invent.3 $(O)light.3 \ $(O)shk.3 $(O)trap.3 $(O)zap.3 OVLB = $(O)allmain.B $(O)apply.B $(O)artifact.B $(O)attrib.B \ $(O)botl.B $(O)cmd.B $(O)dbridge.B $(O)do.B \ $(O)do_name.B $(O)do_wear.B $(O)dog.B $(O)dogmove.B \ $(O)eat.B $(O)engrave.B $(O)hack.B $(O)hacklib.B \ $(O)invent.B $(O)lock.B $(O)mail.B $(O)makemon.B \ $(O)mcastu.B $(O)mhitm.B $(O)mhitu.B $(O)mkobj.B \ $(O)mkroom.B $(O)mon.B $(O)mondata.B $(O)monmove.B \ $(O)mthrowu.B $(O)objnam.B $(O)pcmain.B $(O)pline.B \ $(O)polyself.B $(O)potion.B $(O)priest.B $(O)read.B \ $(O)rnd.B $(O)shk.B $(O)shknam.B $(O)sounds.B \ $(O)steal.B $(O)timeout.B $(O)track.B $(O)trap.B \ $(O)vault.B $(O)weapon.B $(O)were.B $(O)wizard.B \ $(O)msdos.B $(O)pcunix.B $(O)termcap.B $(O)topl.B \ $(O)video.B $(O)vidtxt.B $(O)zap.B TILOBJ = $(TILEGAME) $(TILEVGA) VVOBJ = $(O)version.o NVOBJ = $(OBJ01) $(OVL0) $(OVL1) $(OVL2) \ $(OVL3) $(OVLB) $(TILOBJ) ALLOBJ= $(NVOBJ) $(VVOBJ) $(OVLINIT) # # Header objects # # This comment copied from sys/unix/Makefile.src, # extern.h is ignored, even though its declared function types may affect the # compilation of all the .c files, since extern.h changes every time the # type of an external function does, and we would spend all our time recompiling # if we did not ignore it. #EXTERN_H = $(INCL)\extern.h EXTERN_H = PCCONF_H = $(INCL)\pcconf.h $(INCL)\micro.h $(INCL)\system.h PERMONST_H = $(INCL)\monattk.h $(INCL)\monflag.h $(INCL)\align.h YOUPROP_H = $(INCL)\prop.h $(PERMONST_H) $(INCL)\pm.h $(INCL)\youprop.h \ $(INCL)\mondata.h YOU_H = $(INCL)\attrib.h $(INCL)\monst.h $(YOUPROP_H) $(INCL)\align.h DECL_H = $(INCL)\quest.h $(INCL)\spell.h $(INCL)\color.h \ $(INCL)\obj.h $(YOU_H) $(INCL)\onames.h $(INCL)\pm.h CONFIG_H = $(INCL)\tradstdc.h $(INCL)\coord.h $(PCCONF_H) $(INCL)\config.h HACK_H = $(CONFIG_H) $(INCL)\dungeon.h $(INCL)\align.h $(INCL)\monsym.h \ $(INCL)\mkroom.h $(INCL)\objclass.h $(DECL_H) \ $(INCL)\timeout.h $(INCL)\trap.h $(INCL)\flag.h $(INCL)\rm.h \ $(INCL)\vision.h $(INCL)\mondata.h $(INCL)\wintype.h \ $(INCL)\engrave.h $(INCL)\rect.h $(EXTERN_H) \ $(INCL)\winprocs.h $(INCL)\trampoli.h $(INCL)\display.h TILE_H = $(INCL)\tile.h $(INCL)\pctiles.h PCVIDEO_H = $(INCL)\portio.h $(INCL)\pcvideo.h ALIGN_H = $(INCL)\align.h ARTIFACT_H = $(INCL)\artifact.h ARTILIST_H = $(INCL)\artilist.h COLOR_H = $(INCL)\color.h DATE_H = $(INCL)\date.h DGN_FILE_H = $(INCL)\dgn_file.h DLB_H = $(INCL)\dlb.h EMIN_H = $(INCL)\emin.h EPRI_H = $(INCL)\epri.h ESHK_H = $(INCL)\eshk.h EDOG_H = $(INCL)\edog.h FUNC_TAB_H = $(INCL)\func_tab.h LEV_H = $(INCL)\lev.h LEV_COMP_H = $(INCL)\lev_comp.h MAIL_H = $(INCL)\mail.h MFNDPOS_H = $(INCL)\mfndpos.h MONSYM_H = $(INCL)\monsym.h OBJ_H = $(INCL)\obj.h OBJCLASS_H = $(INCL)\objclass.h OBJECTS_H = $(INCL)\objects.h PROP_H = $(INCL)\prop.h QTEXT_H = $(INCL)\qtext.h QUEST_H = $(INCL)\quest.h SP_LEV_H = $(INCL)\sp_lev.h TERMCAP_H = $(INCL)\termcap.h VAULT_H = $(INCL)\vault.h VIS_TAB_H = $(INCL)\vis_tab.h WINTTY_H = $(INCL)\wintty.h # # In the unix distribution this file is patchlevel.h, make it 8.3 here # to avoid an nmake warning under dos. # PATCHLEVEL_H = $(INCL)\patchlev.h # # The name of the game. # GAMEFILE = $(GAMEDIR)\$(GAME).exe # # make data.base an 8.3 filename to prevent an nmake warning # DATABASE = $(DAT)\data.bas ####################################################################### # # TARGETS # # The main target. # $(GAME): obj.tag envchk $(U)utility.tag $(GAMEFILE) @echo $(GAME) is up to date. # # Everything # all : install install: $(GAME) install.tag @echo Done. install.tag: $(DAT)\data $(DAT)\rumors $(DAT)\dungeon \ $(DAT)\oracles $(DAT)\quest.dat $(DAT)\sp_lev.tag $(DLB) ! IF ("$(USE_DLB)"=="Y") copy nhdat $(GAMEDIR) copy $(DAT)\license $(GAMEDIR) ! ELSE copy $(DAT)\*. $(GAMEDIR) copy $(DAT)\*.dat $(GAMEDIR) copy $(DAT)\*.lev $(GAMEDIR) copy $(MSYS)\msdoshlp.txt $(GAMEDIR) if exist $(GAMEDIR)\makefile del $(GAMEDIR)\makefile ! ENDIF copy $(SYS)\termcap $(GAMEDIR) if exist $(DOC)\guideb*.txt copy $(DOC)\guideb*.txt $(GAMEDIR) if exist $(DOC)\nethack.txt copy $(DOC)\nethack.txt $(GAMEDIR)\NetHack.txt if exist $(DOC)\recover.txt copy $(DOC)\recover.txt $(GAMEDIR) copy $(SYS)\NetHack.cnf $(GAMEDIR) copy $(U)recover.exe $(GAMEDIR) if exist *.tib copy *.tib $(GAMEDIR) echo install done > $@ $(DAT)\sp_lev.tag: $(U)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)\elf.des $(DAT)\healer.des \ $(DAT)\knight.des $(DAT)\priest.des $(DAT)\rogue.des \ $(DAT)\samurai.des $(DAT)\tourist.des $(DAT)\valkyrie.des \ $(DAT)\wizard.des cd $(DAT) $(U)lev_comp bigroom.des $(U)lev_comp castle.des $(U)lev_comp endgame.des $(U)lev_comp gehennom.des $(U)lev_comp knox.des $(U)lev_comp mines.des $(U)lev_comp medusa.des $(U)lev_comp oracle.des $(U)lev_comp 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 elf.des $(U)lev_comp healer.des $(U)lev_comp knight.des $(U)lev_comp priest.des $(U)lev_comp rogue.des $(U)lev_comp samurai.des $(U)lev_comp tourist.des $(U)lev_comp valkyrie.des $(U)lev_comp wizard.des cd $(SRC) echo sp_levs done > $(DAT)\sp_lev.tag $(U)utility.tag: envchk $(INCL)\date.h $(INCL)\onames.h \ $(INCL)\pm.h $(SRC)\monstr.c $(SRC)\vis_tab.c \ $(U)lev_comp.exe $(VIS_TAB_H) $(U)dgn_comp.exe \ $(U)recover.exe $(TILEUTIL) @echo utilities made >$@ @echo utilities made. tileutil: $(U)gif2txt.exe $(U)txt2ppm.exe @echo Optional tile development utilities are up to date. # The section for linking the NetHack image looks a little strange at # first, especially if you are used to UNIX makes, or NDMAKE. It is # Microsoft nmake specific, and it gets around the problem of the link # command line being too long for the linker. An "in-line" linker # response file is generated temporarily. # # It takes advantage of the following features of nmake: # # Inline files : # Specifying the "<<" means to start an inline file. # Another "<<" at the start of a line closes the # inline file. # # Substitution within Macros: # $(mymacro:string1=string2) replaces every # occurrence of string1 with string2 in the # macro mymacro. Special ascii key codes may be # used in the substitution text by preceding it # with ^ as we have done below. Every occurrence # of a in $(ALLOBJ) is replaced by # <+>. # # DO NOT INDENT THE << below! # $(GAMEFILE) : $(LNKOPT) $(ALLOBJ) @echo Linking.... $(LINK) $(LFLAGSN) @<<$(GAME).lnk $(ALLOBJ:^ =+^ ) $(GAMEFILE) $(GAME) $(TERMLIB) $(MOVETR) $(CLIB) $(BCOVL) $(BCMDL) $(LNKOPT); << @if exist $(O)install.tag del $(O)install.tag @if exist $(GAMEDIR)\$(GAME).bak del $(GAMEDIR)\$(GAME).bak # # Makedefs Stuff # $(U)makedefs.exe: $(MAKEOBJS) @$(LINK) $(LFLAGSU) $(MAKEOBJS), $@,, $(CLIB) $(BCMDL); $(O)makedefs.o: $(CONFIG_H) $(PERMONST_H) $(OBJCLASS_H) \ $(MONSYM_H) $(QTEXT_H) $(PATCHLEVEL_H) \ $(U)makedefs.c @$(CC) $(CFLAGSU) $(COBJNAM)$@ $(U)makedefs.c # # date.h should be remade every time any of the source or include # files is modified. # $(INCL)\date.h : $(U)makedefs.exe $(U)makedefs -v @echo A new $@ has been created. $(INCL)\onames.h : $(U)makedefs.exe $(U)makedefs -o $(INCL)\pm.h : $(U)makedefs.exe $(U)makedefs -p #$(INCL)\trap.h : $(U)makedefs.exe # $(U)makedefs -t $(SRC)\monstr.c: $(U)makedefs.exe $(U)makedefs -m $(INCL)\vis_tab.h: $(U)makedefs.exe $(U)makedefs -z $(SRC)\vis_tab.c: $(U)makedefs.exe $(U)makedefs -z # # Level Compiler Stuff # $(U)lev_comp.exe: $(SPLEVOBJS) @echo Linking $@... $(LINK) $(LFLAGSU) @<<$(@B).lnk $(SPLEVOBJS:^ =+^ ) $@ $(@B) $(BCMDL); << $(O)lev_yacc.o: $(HACK_H) $(SP_LEV_H) $(INCL)\lev_comp.h $(U)lev_yacc.c @$(CC) $(CFLAGSU) $(COBJNAM)$@ $(U)lev_yacc.c $(O)lev_$(LEX).o: $(HACK_H) $(INCL)\lev_comp.h $(SP_LEV_H) \ $(U)lev_$(LEX).c $(CC) $(CFLAGSU) $(COBJNAM)$@ $(U)lev_$(LEX).c $(O)lev_main.o: $(U)lev_main.c $(HACK_H) $(SP_LEV_H) @$(CC) $(CFLAGSU) $(COBJNAM)$@ $(U)lev_main.c $(U)lev_yacc.c $(INCL)\lev_comp.h : $(U)lev_comp.y ! IF "$(DO_YACC)"=="YACC_ACT" $(YACC) -d -l $(U)lev_comp.y copy $(YTABC) $(U)lev_yacc.c copy $(YTABH) $(INCL)\lev_comp.h @del $(YTABC) @del $(YTABH) ! ELSE @echo. @echo $(U)lev_comp.y has changed. @echo To update $(U)lev_yacc.c and $(INCL)\lev_comp.h run $(YACC). @echo. @echo For now, we will copy the prebuilt lev_yacc.c @echo from $(SYS) to $(U)lev_yacc.c, and copy the prebuilt @echo lev_comp.h from $(SYS) to $(UTIL)\lev_comp.h @echo and use those. @echo. copy $(SYS)\lev_yacc.c $@ >nul touch $@ copy $(SYS)\lev_comp.h $(INCL)\lev_comp.h >nul touch $(INCL)\lev_comp.h ! ENDIF $(U)lev_$(LEX).c: $(U)lev_comp.l ! IF "$(DO_LEX)"=="LEX_ACT" $(LEX) $(FLEXSKEL) $(U)lev_comp.l copy $(LEXYYC) $@ @del $(LEXYYC) ! ELSE @echo. @echo $(U)lev_comp.l has changed. To update $@ run $(LEX). @echo. @echo For now, we will copy a prebuilt lev_lex.c @echo from $(SYS) to $@ and use it. @echo. copy $(SYS)\lev_lex.c $@ >nul touch $@ ! ENDIF # # Dungeon Stuff # $(U)dgn_comp.exe: $(DGNCOMPOBJS) @echo Linking $@... $(LINK) $(LFLAGSU) @<<$(@B).lnk $(DGNCOMPOBJS:^ =+^ ) $@ $(@B) $(BCMDL); << $(O)dgn_yacc.o: $(HACK_H) $(DGN_FILE_H) $(INCL)\dgn_comp.h \ $(U)dgn_yacc.c @$(CC) $(CFLAGSU) $(COBJNAM)$@ $(U)dgn_yacc.c $(O)dgn_$(LEX).o: $(HACK_H) $(DGN_FILE_H) $(INCL)\dgn_comp.h \ $(U)dgn_$(LEX).c @$(CC) $(CFLAGSU) $(COBJNAM)$@ $(U)dgn_$(LEX).c $(O)dgn_main.o: $(HACK_H) $(U)dgn_main.c @$(CC) $(CFLAGSU) $(COBJNAM)$@ $(U)dgn_main.c $(U)dgn_yacc.c $(INCL)\dgn_comp.h : $(U)dgn_comp.y ! IF "$(DO_YACC)"=="YACC_ACT" $(YACC) -d -l $(U)dgn_comp.y copy $(YTABC) $(U)dgn_yacc.c copy $(YTABH) $(INCL)\dgn_comp.h @del $(YTABC) @del $(YTABH) ! ELSE @echo. @echo $(U)dgn_comp.y has changed. To update $@ and @echo $(INCL)\dgn_comp.h run $(YACC). @echo. @echo For now, we will copy the prebuilt dgn_yacc.c from @echo $(SYS) to $(U)dgn_yacc.c, and copy the prebuilt @echo dgn_comp.h from $(SYS) to $(INCL)\dgn_comp.h @echo and use those. @echo. copy $(SYS)\dgn_yacc.c $@ >nul touch $@ copy $(SYS)\dgn_comp.h $(INCL)\dgn_comp.h >nul touch $(INCL)\dgn_comp.h ! ENDIF $(U)dgn_$(LEX).c: $(U)dgn_comp.l ! IF "$(DO_LEX)"=="LEX_ACT" $(LEX) $(FLEXSKEL) $(U)dgn_comp.l copy $(LEXYYC) $@ @del $(LEXYYC) ! ELSE @echo. @echo $(U)dgn_comp.l has changed. To update $@ run $(LEX). @echo. @echo For now, we will copy a prebuilt dgn_lex.c @echo from $(SYS) to $@ and use it. @echo. copy $(SYS)\dgn_lex.c $@ >nul touch $@ ! ENDIF obj.tag: @if not exist $(O)*.* mkdir $(OBJ) @echo directory $(OBJ) created @echo directory $(OBJ) created >$@ # # The correct switches for the C compiler depend on the CL environment # variable being set correctly. This will check that it is. # The correct setting needs to be: # CL= /AL /G2 /Oo /Gs /Gt16 /Zp1 /W0 /I..\include /nologo /DMOVERLAY # envchk: precomp.msg ! IF ("$(CL)"=="") ! MESSAGE The CL environment variable is not defined! ! MESSAGE You must CD $(MSYS) and execute the SETUP.BAT procedure ! MESSAGE ie. setup MSC ! MESSAGE ! ERROR ! ELSE @echo CL Environment variable is defined: @echo CL=$(CL) ! ENDIF ! IF "$(TILEGAME)"=="" @echo. @echo NOTE: This build will NOT include tile support. @echo. ! ELSE @echo. @echo This build includes tile support. @echo. ! ENDIF # # SECONDARY TARGETS # # # Header files NOT distributed in ..\include # #$(WSHR)\tile.h: $(WSHR)\tile.h # copy $(WSHR)\tile.h $@ #$(MSYS)\pctiles.h: $(MSYS)\pctiles.h # copy $(MSYS)\pctiles.h $@ #$(INCL)\pcvideo.h: $(MSYS)\pcvideo.h # copy $(MSYS)\pcvideo.h $@ #$(MSYS)\portio.h: $(MSYS)\portio.h # copy $(MSYS)\portio.h $@ # # Recover Utility # $(U)recover.exe: $(RECOVOBJS) @$(LINK) $(LFLAGSU) $(RECOVOBJS),$@,, $(CLIB) $(BCMDL); # # Tile Mapping # $(SRC)\tile.c: $(U)tilemap.exe @echo A new $@ is being created. @$(U)tilemap $(U)tilemap.exe: $(O)tilemap.o @$(LINK) $(LFLAGSU) $(O)tilemap.o,$@,, $(CLIB) $(BCMDL); $(O)tilemap.o: $(WSHR)\tilemap.c $(HACK_H) $(CC) $(CFLAGSU) $(COBJNAM)$@ $(WSHR)\tilemap.c # # Tile Utilities # # # Optional (for development) # # $(U)gif2txt.exe: $(GIFREADERS) $(TEXT_IO) @$(LINK) $(LFLAGSU) $(GIFREADERS) $(TEXT_IO),$@,, \ $(CLIB) $(BCMDL); $(U)txt2ppm.exe: $(PPMWRITERS) $(TEXT_IO) @$(LINK) $(LFLAGSU) $(PPMWRITERS) $(TEXT_IO),$@,, \ $(CLIB) $(BCMDL); $(U)gif2txt2.exe: $(GIFREAD2) $(TEXT_IO2) @$(LINK) $(LFLAGSU) $(GIFREAD2) $(TEXT_IO2),$@,, \ $(CLIB) $(BCMDL); $(U)txt2ppm2.exe: $(PPMWRIT2) $(TEXT_IO2) @$(LINK) $(LFLAGSU) $(PPMWRIT2) $(TEXT_IO2),$@,, \ $(CLIB) $(BCMDL); # # Required for tile support # NetHack1.tib: $(TILEFILES) $(U)tile2bin.exe @echo Creating binary tile files (this may take some time) @$(U)tile2bin NetHackO.tib: thintile.tag $(TILEFILES2) $(U)til2bin2.exe @echo Creating overview binary tile files (this may take some time) @$(U)til2bin2 thintile.tag: $(U)thintile.exe $(TILEFILES) $(U)thintile @echo thintiles created >thintile.tag $(U)tile2bin.exe: $(O)tile2bin.o $(TEXT_IO) @echo Linking $@... $(LINK) $(LFLAGSU) @<<$(@B).lnk $(O)tile2bin.o+ $(TEXT_IO:^ =+^ ) $@ $(@B) $(BCMDL); << $(U)til2bin2.exe: $(O)til2bin2.o $(TEXT_IO2) @echo Linking $@... $(LINK) $(LFLAGSU) @<<$(@B).lnk $(O)til2bin2.o+ $(TEXT_IO2:^ =+^ ) $@ $(@B) $(BCMDL); << $(U)thintile.exe: $(O)thintile.o @$(LINK) $(LFLAGSU) $(O)thintile.o,$@,, $(CLIB) $(BCMDL); $(O)thintile.o: $(HACK_H) $(INCL)\tile.h $(WSHR)\thintile.c $(CC) $(CFLAGSU) $(COBJNAM)$@ $(WSHR)\thintile.c $(O)tile2bin.o: $(HACK_H) $(TILE_H) $(PCVIDEO_H) $(CC) $(CFLAGSU) $(COBJNAM)$@ $(MSYS)\tile2bin.c $(O)til2bin2.o: $(HACK_H) $(TILE_H) $(PCVIDEO_H) $(CC) $(CFLAGSU) $(CDEFINE)TILE_X=8 $(CDEFINE)OVERVIEW_FILE \ $(COBJNAM)$@ $(MSYS)\tile2bin.c # # DLB stuff # nhdat: $(U)dlb_main.exe @copy $(MSYS)\msdoshlp.txt $(DAT) @cd $(DAT) @echo data >dlb.lst @echo oracles >>dlb.lst @echo options >>dlb.lst @echo quest.dat >>dlb.lst @echo rumors >>dlb.lst @echo help >>dlb.lst @echo hh >>dlb.lst @echo cmdhelp >>dlb.lst @echo history >>dlb.lst @echo opthelp >>dlb.lst @echo wizhelp >>dlb.lst @echo dungeon >>dlb.lst @echo license >>dlb.lst @echo msdoshlp.txt >>dlb.lst @for %%N in (*.lev) do echo %%N >>dlb.lst $(U)dlb_main cvIf dlb.lst $(SRC)\nhdat @cd $(SRC) $(U)dlb_main.exe: $(DLBOBJS) @$(LINK) $(LFLAGSU) $(DLBOBJS),$@,, $(CLIB) $(BCMDL); $(O)dlb_main.o: $(U)dlb_main.c $(INCL)\config.h $(DLB_H) $(CC) $(CFLAGSU) $(COBJNAM)$@ $(U)dlb_main.c # # Housekeeping # spotless: clean rmdir $(OBJ) if exist $(DATE_H) del $(DATE_H) if exist $(INCL)\onames.h del $(INCL)\onames.h if exist $(INCL)\pm.h del $(INCL)\pm.h if exist $(VIS_TAB_H) del $(VIS_TAB_H) if exist $(SRC)\vis_tab.c del $(SRC)\vis_tab.c if exist $(SRC)\tile.c del $(SRC)\tile.c if exist $(DAT)\rumors del $(DAT)\rumors if exist $(DAT)\data del $(DAT)\data if exist $(DAT)\dungeon del $(DAT)\dungeon if exist $(DAT)\dungeon.pdf del $(DAT)\dungeon.pdf if exist $(DAT)\options del $(DAT)\options if exist $(DAT)\oracles del $(DAT)\oracles if exist $(DAT)\rumors del $(DAT)\rumors if exist $(DAT)\quest.dat del $(DAT)\quest.dat if exist $(DAT)\*.lev del $(DAT)\*.lev if exist $(DAT)\sp_lev.tag del $(DAT)\sp_lev.tag if exist $(SRC)\monstr.c del $(SRC)\monstr.c if exist $(SRC)\vis_tab.c del $(SRC)\vis_tab.c if exist $(SRC)\$(PLANAR_TIB) del $(SRC)\$(PLANAR_TIB) if exist $(SRC)\$(OVERVIEW_TIB) del $(SRC)\$(OVERVIEW_TIB) if exist $(U)recover.exe del $(U)recover.exe clean: if exist $(O)*.o del $(O)*.o if exist $(O)*.0 del $(O)*.0 if exist $(O)*.1 del $(O)*.1 if exist $(O)*.2 del $(O)*.2 if exist $(O)*.3 del $(O)*.3 if exist $(O)*.b del $(O)*.b if exist $(U)utility.tag del $(U)utility.tag if exist $(U)makedefs.exe del $(U)makedefs.exe if exist $(U)lev_comp.exe del $(U)lev_comp.exe if exist $(U)dgn_comp.exe del $(U)dgn_comp.exe if exist $(U)dlb_main.exe del $(U)dlb_main.exe if exist $(SRC)\*.lnk del $(SRC)\*.lnk if exist $(SRC)\*.map del $(SRC)\*.map if exist $(SRC)\*$(CPCHEXT) del $(SRC)\*$(CPCHEXT) if exist $(DAT)\dlb.lst del $(DAT)\dlb.lst pch.c: $(HACK_H) @echo ^#include "hack.h" > $@ @echo main(int argc, char *argv[]) >> $@ @echo { >> $@ @echo } >> $@ @echo. >> $@ # # OTHER DEPENDENCIES # # # Precompiled Header dependencies # (We need to force the generation of these at the beginning) # PHO$(CPCHEXT): $(HACK_H) pch.c @echo Generating new precompiled header for .O files @$(CC) $(FLAGCO) pch.c PH0$(CPCHEXT): $(HACK_H) pch.c @echo Generating new precompiled header for .0 files @$(CC) $(FLAGC0) pch.c PH1$(CPCHEXT): $(HACK_H) pch.c @echo Generating new precompiled header for .1 files @$(CC) $(FLAGC1) pch.c PH2$(CPCHEXT): $(HACK_H) pch.c @echo Generating new precompiled header for .2 files @$(CC) $(FLAGC2) pch.c PH3$(CPCHEXT): $(HACK_H) pch.c @echo Generating new precompiled header for .3 files @$(CC) $(FLAGC3) pch.c PHB$(CPCHEXT): $(HACK_H) pch.c @echo Generating new precompiled header for .B files @$(CC) $(FLAGCB) pch.c # # Compiler supplied, manually moved file - MOVEINIT.C. # - This is only compiled if you selected the alternate overlay # schema3. (MOVEAPI.H must reside in your include search list, # and MOVEINIT.C must be in your src directory). The patch # in sys/msdos/moveinit.pat must be applied to moveinit.c # MS will not allow us to distribute an already patched version. $(O)moveinit.o: $(SRC)\moveinit.c $(CC) $(CFLAGSN) $(COBJNAM)$@ $(MVTRCL) $(SRC)\moveinit.c $(SRC)\moveinit.c: @echo. @echo * CANNOT COMPLETE THE BUILD * @echo You must manually copy moveinit.c and moveinit.h @echo from your Microsoft C Compiler directory tree @echo source/move directory and apply the sys/msdos/moveinit.pat @echo patch to moveinit.c after doing so. @echo. # Overlay initialization routines used by MOVEINIT.C $(O)ovlinit.o: $(MSYS)\ovlinit.c $(HACK_H) $(CC) $(CFLAGSN) $(RECOGNIZE_XMS) $(COBJNAM)$@ $(MSYS)\ovlinit.c # # dat dependencies # $(DAT)\data: $(U)utility.tag $(DATABASE) $(U)makedefs -d $(DAT)\rumors: $(U)utility.tag $(DAT)\rumors.tru $(DAT)\rumors.fal $(U)makedefs -r $(DAT)\quest.dat: $(U)utility.tag $(DAT)\quest.txt $(U)makedefs -q $(DAT)\oracles: $(U)utility.tag $(DAT)\oracles.txt $(U)makedefs -h $(DAT)\dungeon: $(U)utility.tag $(DAT)\dungeon.def $(U)makedefs -e cd $(DAT) $(U)dgn_comp dungeon.pdf cd $(SRC) # # Util Dependencies. # $(O)panic.o: $(U)panic.c $(CONFIG_H) $(CC) $(CFLAGSU) $(COBJNAM)$@ $(U)panic.c $(O)recover.o: $(CONFIG_H) $(U)recover.c $(CC) $(CFLAGSU) $(COBJNAM)$@ $(U)recover.c # # from win\share # $(O)tiletxt.o: $(WSHR)\tilemap.c $(HACK_H) $(CC) $(CFLAGSU) $(CDEFINE)TILETEXT $(COBJNAM)$@ $(WSHR)\tilemap.c $(O)tiletxt2.o: $(WSHR)\tilemap.c $(HACK_H) $(CC) $(CFLAGSU) $(CDEFINE)TILETEXT \ $(CDEFINE)TILE_X=8 $(COBJNAM)$@ $(WSHR)\tilemap.c $(O)gifread.o: $(WSHR)\gifread.c $(CONFIG_H) $(INCL)\tile.h $(CC) $(CFLAGSU) $(COBJNAM)$@ $(WSHR)\gifread.c $(O)gifread2.o: $(WSHR)\gifread.c $(CONFIG_H) $(INCL)\tile.h $(CC) $(CFLAGSU) $(COBJNAM)$@ $(CDEFINE)TILE_X=8 $(WSHR)\gifread.c $(O)ppmwrite.o: $(WSHR)\ppmwrite.c $(CONFIG_H) $(INCL)\tile.h $(CC) $(CFLAGSU) $(COBJNAM)$@ $(WSHR)\ppmwrite.c $(O)ppmwrit2.o: $(WSHR)\ppmwrite.c $(CONFIG_H) $(INCL)\tile.h $(CC) $(CFLAGSU) $(COBJNAM)$@ $(CDEFINE)TILE_X=8 $(WSHR)\ppmwrite.c $(O)tiletext.o: $(WSHR)\tiletext.c $(CONFIG_H) $(INCL)\tile.h $(CC) $(CFLAGSU) $(COBJNAM)$@ $(WSHR)\tiletext.c $(O)tiletex2.o: $(WSHR)\tiletext.c $(CONFIG_H) $(INCL)\tile.h $(CC) $(CFLAGSU) $(CDEFINE)TILE_X=8 $(COBJNAM)$@ $(WSHR)\tiletext.c # # from win\tty # $(O)getline.1: $(PCH1) $(WTTY)\getline.c $(HACK_H) $(WINTTY_H) $(FUNC_TAB_H) $(CC) $(FLAGU1) $(CCSNAM)$(@F) $(COBJNAM)$@ $(WTTY)\getline.c $(O)getline.2: $(PCH2) $(WTTY)\getline.c $(HACK_H) $(WINTTY_H) $(FUNC_TAB_H) $(CC) $(FLAGU2) $(CCSNAM)$(@F) $(COBJNAM)$@ $(WTTY)\getline.c $(O)termcap.0: $(PCH0) $(WTTY)\termcap.c $(HACK_H) $(WINTTY_H) $(TERMCAP_H) $(CC) $(FLAGU0) $(CCSNAM)$(@F) $(COBJNAM)$@ $(WTTY)\termcap.c $(O)termcap.1: $(PCH1) $(WTTY)\termcap.c $(HACK_H) $(WINTTY_H) $(TERMCAP_H) $(CC) $(FLAGU1) $(CCSNAM)$(@F) $(COBJNAM)$@ $(WTTY)\termcap.c $(O)termcap.B: $(PCHB) $(WTTY)\termcap.c $(HACK_H) $(WINTTY_H) $(TERMCAP_H) $(CC) $(FLAGUB) $(CCSNAM)$(@F) $(COBJNAM)$@ $(WTTY)\termcap.c $(O)topl.1: $(PCH1) $(WTTY)\topl.c $(HACK_H) $(TERMCAP_H) $(WINTTY_H) $(CC) $(FLAGU1) $(CCSNAM)$(@F) $(COBJNAM)$@ $(WTTY)\topl.c $(O)topl.2: $(PCH2) $(WTTY)\topl.c $(HACK_H) $(TERMCAP_H) $(WINTTY_H) $(CC) $(FLAGU2) $(CCSNAM)$(@F) $(COBJNAM)$@ $(WTTY)\topl.c $(O)topl.B: $(PCHB) $(WTTY)\topl.c $(HACK_H) $(TERMCAP_H) $(WINTTY_H) $(CC) $(FLAGUB) $(CCSNAM)$(@F) $(COBJNAM)$@ $(WTTY)\topl.c $(O)wintty.o: $(PCHO) $(CONFIG_H) $(WTTY)\wintty.c $(PATCHLEVEL_H) $(CC) $(FLAGUO) $(CCSNAM)$(@F) $(COBJNAM)$@ $(WTTY)\wintty.c # # from sys\share # $(O)pcmain.0: $(PCH0) $(HACK_H) $(SYS)\pcmain.c $(CC) $(FLAGU0) $(CCSNAM)$(@F) $(COBJNAM)$@ $(SYS)\pcmain.c $(O)pcmain.1: $(PCH1) $(HACK_H) $(SYS)\pcmain.c $(CC) $(FLAGU1) $(CCSNAM)$(@F) $(COBJNAM)$@ $(SYS)\pcmain.c $(O)pcmain.B: $(PCHB) $(HACK_H) $(SYS)\pcmain.c $(CC) $(FLAGUB) $(CCSNAM)$(@F) $(COBJNAM)$@ $(SYS)\pcmain.c $(O)pcunix.B: $(PCHB) $(SYS)\pcunix.c $(HACK_H) $(CC) $(FLAGUB) $(CCSNAM)$(@F) $(COBJNAM)$@ $(SYS)\pcunix.c $(O)tty.o: $(HACK_H) $(WINTTY_H) $(SYS)\pctty.c $(CC) $(CFLAGSN) $(CCSNAM)$(@F) $(COBJNAM)$@ $(SYS)\pctty.c $(O)sys.o: $(HACK_H) $(SYS)\pcsys.c $(CC) $(CFLAGSN) $(CCSNAM)$(@F) $(COBJNAM)$@ $(SYS)\pcsys.c $(O)random.o: $(PCHO) $(HACK_H) $(SYS)\random.c $(CC) $(FLAGUO) $(CCSNAM)$(@F) $(COBJNAM)$@ $(SYS)\random.c # # from sys\msdos # $(O)msdos.0: $(MSYS)\msdos.c $(HACK_H) $(PCVIDEO_H) $(CC) $(FLAGU0) $(CCSNAM)$(@F) $(COBJNAM)$@ $(MSYS)\msdos.c $(O)msdos.B: $(MSYS)\msdos.c $(HACK_H) $(PCVIDEO_H) $(CC) $(FLAGUB) $(CCSNAM)$(@F) $(COBJNAM)$@ $(MSYS)\msdos.c $(O)pctiles.0: $(PCH0) $(MSYS)\pctiles.c $(HACK_H) $(TILE_H) $(PCVIDEO_H) $(CC) $(FLAGU0) $(CCSNAM)$(@F) $(COBJNAM)$@ $(MSYS)\pctiles.c $(O)pctiles.B: $(PCHB) $(MSYS)\pctiles.c $(HACK_H) $(TILE_H) $(PCVIDEO_H) $(CC) $(FLAGUB) $(CCSNAM)$(@F) $(COBJNAM)$@ $(MSYS)\pctiles.c $(O)sound.o: $(PCH0) $(MSYS)\sound.c $(HACK_H) $(INCL)\portio.h $(CC) $(FLAGUO) $(CCSNAM)$(@F) $(COBJNAM)$@ $(MSYS)\sound.c $(O)pckeys.o: $(PCHO) $(MSYS)\pckeys.c $(HACK_H) $(PCVIDEO_H) $(CC) $(FLAGUO) $(CCSNAM)$(@F) $(COBJNAM)$@ $(MSYS)\pckeys.c $(O)stubvid.o : $(MSYS)\video.c $(HACK_H) $(CC) $(FLAGUO) $(CDEFINE)STUBVIDEO $(CCSNAM)$(@F) $(COBJNAM)$@ $(MSYS)\video.c $(O)video.0: $(PCH0) $(MSYS)\video.c $(HACK_H) $(WINTTY_H) $(PCVIDEO_H) \ $(TILE_H) $(CC) $(FLAGU0) $(CCSNAM)$(@F) $(COBJNAM)$@ $(MSYS)\video.c $(O)video.1: $(PCH1) $(MSYS)\video.c $(HACK_H) $(WINTTY_H) $(PCVIDEO_H) \ $(TILE_H) $(CC) $(FLAGU1) $(CCSNAM)$(@F) $(COBJNAM)$@ $(MSYS)\video.c $(O)video.B: $(PCHB) $(MSYS)\video.c $(HACK_H) $(WINTTY_H) $(PCVIDEO_H) \ $(TILE_H) $(CC) $(FLAGUB) $(CCSNAM)$(@F) $(COBJNAM)$@ $(MSYS)\video.c $(O)vidtxt.0: $(MSYS)\vidtxt.c $(HACK_H) $(WINTTY_H) $(PCVIDEO_H) $(CC) $(FLAGU0) $(CCSNAM)$(@F) $(COBJNAM)$@ $(MSYS)\vidtxt.c $(O)vidtxt.B: $(MSYS)\vidtxt.c $(HACK_H) $(WINTTY_H) $(PCVIDEO_H) $(CC) $(FLAGUB) $(CCSNAM)$(@F) $(COBJNAM)$@ $(MSYS)\vidtxt.c $(O)vidvga.0: $(PCH0) $(MSYS)\vidvga.c $(HACK_H) $(WINTTY_H) $(PCVIDEO_H) \ $(TILE_H) $(CC) $(FLAGU0) $(CCSNAM)$(@F) $(COBJNAM)$@ $(MSYS)\vidvga.c $(O)vidvga.1: $(PCH1) $(MSYS)\vidvga.c $(HACK_H) $(WINTTY_H) $(PCVIDEO_H) \ $(TILE_H) $(CC) $(FLAGU1) $(CCSNAM)$(@F) $(COBJNAM)$@ $(MSYS)\vidvga.c $(O)vidvga.2: $(PCH2) $(MSYS)\vidvga.c $(HACK_H) $(WINTTY_H) $(PCVIDEO_H) \ $(TILE_H) $(CC) $(FLAGU2) $(CCSNAM)$(@F) $(COBJNAM)$@ $(MSYS)\vidvga.c $(O)vidvga.B: $(PCHB) $(MSYS)\vidvga.c $(HACK_H) $(WINTTY_H) $(PCVIDEO_H) \ $(TILE_H) $(CC) $(FLAGUB) $(CCSNAM)$(@F) $(COBJNAM)$@ $(MSYS)\vidvga.c # # from src # $(O)alloc.o: $(SRC)\alloc.c $(CONFIG_H) $(CC) $(CFLAGSN) $(CCSNAM)$(@F) $(COBJNAM)$@ $(SRC)\alloc.c $(O)ball.o: $(PCHO) $(SRC)\ball.c $(HACK_H) $(O)bones.o: $(PCHO) $(SRC)\bones.c $(HACK_H) $(LEV_H) $(O)decl.o: $(PCHO) $(SRC)\decl.c $(HACK_H) $(QUEST_H) $(O)detect.o: $(PCHO) $(SRC)\detect.c $(HACK_H) $(ARTIFACT_H) $(O)dig.o: $(PCHO) $(SRC)\dig.c $(HACK_H) $(EDOG_H) # check dep $(O)display.o: $(PCHO) $(SRC)\display.c $(HACK_H) $(O)dlb.o: $(SRC)\dlb.c $(DLB_H) $(HACK_H) $(CC) $(CFLAGSN) $(CCSNAM)$(@F) $(COBJNAM)$@ $(SRC)\dlb.c $(O)dokick.o: $(PCHO) $(SRC)\dokick.c $(HACK_H) $(ESHK_H) $(O)dothrow.o: $(PCHO) $(SRC)\dothrow.c $(HACK_H) $(O)drawing.o: $(SRC)\drawing.c $(HACK_H) $(TERMCAP_H) $(CC) $(CFLAGSN) $(CCSNAM)$(@F) $(COBJNAM)$@ $(SRC)\drawing.c $(O)end.o: $(SRC)\end.c $(HACK_H) $(ESHK_H) $(DLB_H) $(CC) $(CFLAGSN) $(CCSNAM)$(@F) $(COBJNAM)$@ $(SRC)\end.c $(O)exper.o: $(PCHO) $(SRC)\exper.c $(HACK_H) $(O)extralev.o: $(PCHO) $(SRC)\extralev.c $(HACK_H) $(O)files.o: $(PCHO) $(SRC)\files.c $(HACK_H) $(DLB_H) $(O)fountain.o: $(PCHO) $(SRC)\fountain.c $(HACK_H) $(O)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) $(O)mkmaze.o: $(PCHO) $(SRC)\mkmaze.c $(HACK_H) $(SP_LEV_H) $(LEV_H) $(O)monst.o: $(SRC)\monst.c $(CONFIG_H) $(PERMONST_H) $(MONSYM_H) \ $(ESHK_H) $(EPRI_H) $(COLOR_H) $(ALIGN_H) $(CC) $(CFLAGSN) $(CCSNAM)$(@F) $(COBJNAM)$@ $(SRC)\monst.c $(O)monstr.o: $(SRC)\monstr.c $(CONFIG_H) $(CC) $(CFLAGSN) $(CCSNAM)$(@F) $(COBJNAM)$@ $(SRC)\monstr.c $(O)mplayer.o: $(PCHO) $(SRC)\mplayer.c $(HACK_H) $(O)muse.o: $(PCHO) $(SRC)\muse.c $(HACK_H) $(O)music.o: $(PCHO) $(SRC)\music.c $(HACK_H) $(O)o_init.o: $(PCHO) $(SRC)\o_init.c $(HACK_H) $(LEV_H) $(O)objects.o: $(SRC)\objects.c $(CONFIG_H) $(OBJ_H) $(OBJCLASS_H) \ $(PROP_H) $(COLOR_H) $(CC) $(CFLAGSN) $(CCSNAM)$(@F) $(COBJNAM)$@ $(SRC)\objects.c $(O)options.o: $(SRC)\options.c $(HACK_H) $(TERMCAP_H) $(OBJCLASS_H) $(CC) $(CFLAGSN) $(CCSNAM)$(@F) $(COBJNAM)$@ $(SRC)\options.c $(O)pager.o: $(SRC)\pager.c $(HACK_H) $(DLB_H) $(CC) $(CFLAGNO) $(COBJNAM)$@ $(SRC)\pager.c $(O)pickup.o: $(PCHO) $(SRC)\pickup.c $(HACK_H) $(O)pray.o: $(PCHO) $(SRC)\pray.c $(HACK_H) $(EPRI_H) $(O)quest.o: $(PCHO) $(SRC)\quest.c $(HACK_H) $(QUEST_H) $(QTEXT_H) $(O)questpgr.o: $(PCHO) $(SRC)\questpgr.c $(HACK_H) $(QTEXT_H) $(DLB_H) $(O)rect.o: $(PCHO) $(SRC)\rect.c $(HACK_H) $(O)restore.o: $(PCHO) $(SRC)\restore.c $(HACK_H) $(LEV_H) $(TERMCAP_H) \ $(QUEST_H) $(O)rip.o: $(PCHO) $(SRC)\rip.c $(HACK_H) $(O)rumors.o: $(PCHO) $(SRC)\rumors.c $(HACK_H) $(DLB_H) $(O)save.o: $(PCHO) $(SRC)\save.c $(HACK_H) $(LEV_H) $(QUEST_H) $(O)sit.o: $(PCHO) $(SRC)\sit.c $(HACK_H) $(ARTIFACT_H) $(O)sp_lev.o: $(PCHO) $(SRC)\sp_lev.c $(HACK_H) $(SP_LEV_H) $(DLB_H) $(O)spell.o: $(PCHO) $(SRC)\spell.c $(HACK_H) $(O)teleport.o: $(PCHO) $(SRC)\teleport.c $(HACK_H) # check dep $(O)tile.o: $(PCHO) $(SRC)\tile.c $(HACK_H) $(O)topten.o: $(PCHO) $(SRC)\topten.c $(HACK_H) $(DLB_H) $(PATCHLEVEL_H) $(O)u_init.o: $(PCHO) $(SRC)\u_init.c $(HACK_H) $(O)uhitm.o: $(PCHO) $(SRC)\uhitm.c $(HACK_H) $(O)version.o: $(PCHO) $(SRC)\version.c $(HACK_H) $(PATCHLEVEL_H) $(O)vision.o: $(PCHO) $(SRC)\vision.c $(HACK_H) $(VIS_TAB_H) $(O)vis_tab.o: $(SRC)\vis_tab.c $(HACK_H) $(VIS_TAB_H) $(CC) $(CFLAGSN) $(CCSNAM)$(@F) $(COBJNAM)$@ $(SRC)\vis_tab.c $(O)wield.o: $(PCHO) $(SRC)\wield.c $(HACK_H) $(O)windows.o: $(PCHO) $(SRC)\windows.c $(HACK_H) $(WINTTY_H) $(O)worm.o: $(PCHO) $(SRC)\worm.c $(HACK_H) $(LEV_H) $(O)worn.o: $(PCHO) $(SRC)\worn.c $(HACK_H) $(O)write.o: $(PCHO) $(SRC)\write.c $(HACK_H) # # Overlays # # OVL0 # $(O)allmain.0: $(PCH0) $(SRC)\allmain.c $(HACK_H) $(O)apply.0: $(PCH0) $(SRC)\apply.c $(HACK_H) $(EDOG_H) $(O)artifact.0: $(PCH0) $(SRC)\artifact.c $(HACK_H) $(ARTIFACT_H) $(ARTILIST_H) $(O)attrib.0: $(PCH0) $(SRC)\attrib.c $(HACK_H) $(O)botl.0: $(PCH0) $(SRC)\botl.c $(HACK_H) $(O)cmd.0: $(PCH0) $(SRC)\cmd.c $(HACK_H) $(FUNC_TAB_H) $(O)dbridge.0: $(PCH0) $(SRC)\dbridge.c $(HACK_H) $(O)do.0: $(PCH0) $(SRC)\do.c $(HACK_H) $(LEV_H) $(O)do_name.0: $(PCH0) $(SRC)\do_name.c $(HACK_H) $(O)do_wear.0: $(PCH0) $(SRC)\do_wear.c $(HACK_H) $(O)dogmove.0: $(PCH0) $(SRC)\dogmove.c $(HACK_H) $(MFNDPOS_H) $(EDOG_H) $(O)dungeon.0: $(PCH0) $(SRC)\dungeon.c $(HACK_H) $(ALIGN_H) $(DGN_FILE_H) \ $(DLB_H) $(O)eat.0: $(PCH0) $(SRC)\eat.c $(HACK_H) $(O)engrave.0: $(PCH0) $(SRC)\engrave.c $(HACK_H) $(LEV_H) $(O)explode.0: $(PCH0) $(SRC)\explode.c $(HACK_H) $(O)hacklib.0: $(PCH0) $(SRC)\hacklib.c $(HACK_H) $(O)invent.0: $(PCH0) $(SRC)\invent.c $(HACK_H) $(ARTIFACT_H) $(O)lock.0: $(PCH0) $(SRC)\lock.c $(HACK_H) $(O)mail.0: $(PCH0) $(SRC)\mail.c $(HACK_H) $(MAIL_H) $(O)makemon.0: $(PCH0) $(SRC)\makemon.c $(HACK_H) $(EPRI_H) $(EMIN_H) $(O)mcastu.0: $(PCH0) $(SRC)\mcastu.c $(HACK_H) $(O)mhitm.0: $(PCH0) $(SRC)\mhitm.c $(HACK_H) $(ARTIFACT_H) $(EDOG_H) $(O)mhitu.0: $(PCH0) $(SRC)\mhitu.c $(HACK_H) $(ARTIFACT_H) $(EDOG_H) $(O)mkobj.0: $(PCH0) $(SRC)\mkobj.c $(HACK_H) $(ARTIFACT_H) $(PROP_H) $(O)mkroom.0: $(PCH0) $(SRC)\mkroom.c $(HACK_H) $(O)mon.0: $(PCH0) $(SRC)\mon.c $(HACK_H) $(MFNDPOS_H) $(EDOG_H) $(O)mondata.0: $(PCH0) $(SRC)\mondata.c $(HACK_H) $(ESHK_H) $(EPRI_H) $(O)monmove.0: $(PCH0) $(SRC)\monmove.c $(HACK_H) $(MFNDPOS_H) $(ARTIFACT_H) $(O)mthrowu.0: $(PCH0) $(SRC)\mthrowu.c $(HACK_H) $(O)objnam.0: $(PCH0) $(SRC)\objnam.c $(HACK_H) $(O)polyself.0: $(PCH0) $(SRC)\polyself.c $(HACK_H) $(O)priest.0: $(PCH0) $(SRC)\priest.c $(HACK_H) $(MFNDPOS_H) $(ESHK_H) \ $(EPRI_H) $(EMIN_H) $(O)rnd.0: $(PCH0) $(SRC)\rnd.c $(HACK_H) $(O)shk.0: $(PCH0) $(SRC)\shk.c $(HACK_H) $(ESHK_H) $(O)shknam.0: $(PCH0) $(SRC)\shknam.c $(HACK_H) $(ESHK_H) $(O)sounds.0: $(PCH0) $(SRC)\sounds.c $(HACK_H) $(EDOG_H) $(O)steal.0: $(PCH0) $(SRC)\steal.c $(HACK_H) $(O)timeout.0: $(PCH0) $(SRC)\timeout.c $(HACK_H) $(LEV_H) $(O)track.0: $(PCH0) $(SRC)\track.c $(HACK_H) $(O)trap.0: $(PCH0) $(SRC)\trap.c $(HACK_H) $(O)vault.0: $(PCH0) $(SRC)\vault.c $(HACK_H) $(VAULT_H) $(O)weapon.0: $(PCH0) $(SRC)\weapon.c $(HACK_H) $(O)were.0: $(PCH0) $(SRC)\were.c $(HACK_H) $(O)wizard.0: $(PCH0) $(SRC)\wizard.c $(HACK_H) $(QTEXT_H) $(O)zap.0: $(PCH0) $(SRC)\zap.c $(HACK_H) # # OVL1 # $(O)allmain.1: $(PCH1) $(SRC)\allmain.c $(HACK_H) $(O)apply.1: $(PCH1) $(SRC)\apply.c $(HACK_H) $(EDOG_H) $(O)artifact.1: $(PCH1) $(SRC)\artifact.c $(HACK_H) $(ARTIFACT_H) $(ARTILIST_H) $(O)attrib.1: $(PCH1) $(SRC)\attrib.c $(HACK_H) $(O)botl.1: $(PCH1) $(SRC)\botl.c $(HACK_H) $(O)cmd.1: $(PCH1) $(SRC)\cmd.c $(HACK_H) $(FUNC_TAB_H) $(O)dbridge.1: $(PCH1) $(SRC)\dbridge.c $(HACK_H) $(O)do.1: $(PCH1) $(SRC)\do.c $(HACK_H) $(LEV_H) $(O)do_wear.1: $(PCH1) $(SRC)\do_wear.c $(HACK_H) $(O)dog.1: $(PCH1) $(SRC)\dog.c $(HACK_H) $(EDOG_H) $(O)dungeon.1: $(PCH1) $(SRC)\dungeon.c $(HACK_H) $(ALIGN_H) $(DGN_FILE_H) $(DLB_H) $(O)eat.1: $(PCH1) $(SRC)\eat.c $(HACK_H) $(O)engrave.1: $(PCH1) $(SRC)\engrave.c $(HACK_H) $(LEV_H) $(O)explode.1: $(PCH1) $(SRC)\explode.c $(HACK_H) $(O)hack.1: $(PCH1) $(SRC)\hack.c $(HACK_H) $(O)hacklib.1: $(PCH1) $(SRC)\hacklib.c $(HACK_H) $(O)invent.1: $(PCH1) $(SRC)\invent.c $(HACK_H) $(ARTIFACT_H) $(O)makemon.1: $(PCH1) $(SRC)\makemon.c $(HACK_H) $(EPRI_H) $(EMIN_H) $(O)mhitu.1: $(PCH1) $(SRC)\mhitu.c $(HACK_H) $(ARTIFACT_H) $(EDOG_H) $(O)mkobj.1: $(PCH1) $(SRC)\mkobj.c $(HACK_H) $(ARTIFACT_H) $(PROP_H) $(O)mon.1: $(PCH1) $(SRC)\mon.c $(HACK_H) $(MFNDPOS_H) $(EDOG_H) $(O)mondata.1: $(PCH1) $(SRC)\mondata.c $(HACK_H) $(ESHK_H) $(EPRI_H) $(O)monmove.1: $(PCH1) $(SRC)\monmove.c $(HACK_H) $(MFNDPOS_H) $(ARTIFACT_H) $(O)mthrowu.1: $(PCH1) $(SRC)\mthrowu.c $(HACK_H) $(O)objnam.1: $(PCH1) $(SRC)\objnam.c $(HACK_H) $(O)polyself.1: $(PCH1) $(SRC)\polyself.c $(HACK_H) $(O)rnd.1: $(PCH1) $(SRC)\rnd.c $(HACK_H) $(O)shk.1: $(PCH1) $(SRC)\shk.c $(HACK_H) $(ESHK_H) $(O)steal.1: $(PCH1) $(SRC)\steal.c $(HACK_H) $(O)timeout.1: $(PCH1) $(SRC)\timeout.c $(HACK_H) $(LEV_H) $(O)track.1: $(PCH1) $(SRC)\track.c $(HACK_H) $(O)trap.1: $(PCH1) $(SRC)\trap.c $(HACK_H) $(O)weapon.1: $(PCH1) $(SRC)\weapon.c $(HACK_H) $(O)zap.1: $(PCH1) $(SRC)\zap.c $(HACK_H) # # OVL2 # $(O)attrib.2: $(PCH2) $(SRC)\attrib.c $(HACK_H) $(O)do.2: $(PCH2) $(SRC)\do.c $(HACK_H) $(LEV_H) $(O)do_name.2: $(PCH2) $(SRC)\do_name.c $(HACK_H) $(O)do_wear.2: $(PCH2) $(SRC)\do_wear.c $(HACK_H) $(O)dog.2: $(PCH2) $(SRC)\dog.c $(HACK_H) $(EDOG_H) $(O)engrave.2: $(PCH2) $(SRC)\engrave.c $(HACK_H) $(LEV_H) $(O)hack.2: $(PCH2) $(SRC)\hack.c $(HACK_H) $(O)hacklib.2: $(PCH2) $(SRC)\hacklib.c $(HACK_H) $(O)invent.2: $(PCH2) $(SRC)\invent.c $(HACK_H) $(ARTIFACT_H) $(O)makemon.2: $(PCH2) $(SRC)\makemon.c $(HACK_H) $(EPRI_H) $(EMIN_H) $(O)mon.2: $(PCH2) $(SRC)\mon.c $(HACK_H) $(MFNDPOS_H) $(EDOG_H) $(O)mondata.2: $(PCH2) $(SRC)\mondata.c $(HACK_H) $(ESHK_H) $(EPRI_H) $(O)monmove.2: $(PCH2) $(SRC)\monmove.c $(HACK_H) $(MFNDPOS_H) $(ARTIFACT_H) $(O)shk.2: $(PCH2) $(SRC)\shk.c $(HACK_H) $(ESHK_H) $(O)trap.2: $(PCH2) $(SRC)\trap.c $(HACK_H) $(O)zap.2: $(PCH2) $(SRC)\zap.c $(HACK_H) # # OVL3 # $(O)do.3: $(PCH3) $(SRC)\do.c $(HACK_H) $(LEV_H) $(O)hack.3: $(PCH3) $(SRC)\hack.c $(HACK_H) $(O)invent.3: $(PCH3) $(SRC)\invent.c $(HACK_H) $(ARTIFACT_H) $(O)light.3: $(PCH3) $(SRC)\light.c $(HACK_H) $(O)shk.3: $(PCH3) $(SRC)\shk.c $(HACK_H) $(ESHK_H) $(O)trap.3: $(PCH3) $(SRC)\trap.c $(HACK_H) $(O)zap.3: $(PCH3) $(SRC)\zap.c $(HACK_H) # # OVLB # $(O)allmain.B: $(PCHB) $(SRC)\allmain.c $(HACK_H) $(O)apply.B: $(PCHB) $(SRC)\apply.c $(HACK_H) $(EDOG_H) $(O)artifact.B: $(PCHB) $(SRC)\artifact.c $(HACK_H) $(ARTIFACT_H) $(ARTILIST_H) $(O)attrib.B: $(PCHB) $(SRC)\attrib.c $(HACK_H) $(O)botl.B: $(PCHB) $(SRC)\botl.c $(HACK_H) $(O)cmd.B: $(PCHB) $(SRC)\cmd.c $(HACK_H) $(FUNC_TAB_H) $(O)dbridge.B: $(PCHB) $(SRC)\dbridge.c $(HACK_H) $(O)do.B: $(PCHB) $(SRC)\do.c $(HACK_H) $(LEV_H) $(O)do_name.B: $(PCHB) $(SRC)\do_name.c $(HACK_H) $(O)do_wear.B: $(PCHB) $(SRC)\do_wear.c $(HACK_H) $(O)dog.B: $(PCHB) $(SRC)\dog.c $(HACK_H) $(EDOG_H) $(O)dogmove.B: $(PCHB) $(SRC)\dogmove.c $(HACK_H) $(MFNDPOS_H) $(EDOG_H) $(O)eat.B: $(PCHB) $(SRC)\eat.c $(HACK_H) $(O)engrave.B: $(PCHB) $(SRC)\engrave.c $(HACK_H) $(LEV_H) $(O)hack.B: $(PCHB) $(SRC)\hack.c $(HACK_H) $(O)hacklib.B: $(PCHB) $(SRC)\hacklib.c $(HACK_H) $(O)invent.B: $(PCHB) $(SRC)\invent.c $(HACK_H) $(ARTIFACT_H) $(O)lock.B: $(PCHB) $(SRC)\lock.c $(HACK_H) $(O)mail.B: $(PCHB) $(SRC)\mail.c $(HACK_H) $(MAIL_H) $(O)makemon.B: $(PCHB) $(SRC)\makemon.c $(HACK_H) $(EPRI_H) $(EMIN_H) $(O)mcastu.B: $(PCHB) $(SRC)\mcastu.c $(HACK_H) $(O)mhitm.B: $(PCHB) $(SRC)\mhitm.c $(HACK_H) $(ARTIFACT_H) $(EDOG_H) $(O)mhitu.B: $(PCHB) $(SRC)\mhitu.c $(HACK_H) $(ARTIFACT_H) $(EDOG_H) $(O)mkobj.B: $(PCHB) $(SRC)\mkobj.c $(HACK_H) $(ARTIFACT_H) $(PROP_H) $(O)mkroom.B: $(PCHB) $(SRC)\mkroom.c $(HACK_H) $(O)mon.B: $(PCHB) $(SRC)\mon.c $(HACK_H) $(MFNDPOS_H) $(EDOG_H) $(O)mondata.B: $(PCHB) $(SRC)\mondata.c $(HACK_H) $(ESHK_H) $(EPRI_H) $(O)monmove.B: $(PCHB) $(SRC)\monmove.c $(HACK_H) $(MFNDPOS_H) $(ARTIFACT_H) $(O)mthrowu.B: $(PCHB) $(SRC)\mthrowu.c $(HACK_H) $(O)objnam.B: $(PCHB) $(SRC)\objnam.c $(HACK_H) $(O)pline.B: $(SRC)\pline.c $(HACK_H) $(EPRI_H) $(CC) $(CFLAGSN) $(CCSNAM)$(@F) $(COBJNAM)$@ $(SRC)\pline.c $(O)polyself.B: $(PCHB) $(SRC)\polyself.c $(HACK_H) $(O)potion.B: $(PCHB) $(SRC)\potion.c $(HACK_H) $(O)priest.B: $(PCHB) $(SRC)\priest.c $(HACK_H) $(MFNDPOS_H) $(ESHK_H) \ $(EPRI_H) $(EMIN_H) $(O)read.B: $(PCHB) $(SRC)\read.c $(HACK_H) $(O)rnd.B: $(PCHB) $(SRC)\rnd.c $(HACK_H) $(O)shk.B: $(PCHB) $(SRC)\shk.c $(HACK_H) $(ESHK_H) $(O)shknam.B: $(PCHB) $(SRC)\shknam.c $(HACK_H) $(ESHK_H) $(O)sounds.B: $(PCHB) $(SRC)\sounds.c $(HACK_H) $(EDOG_H) $(O)steal.B: $(PCHB) $(SRC)\steal.c $(HACK_H) $(O)timeout.B: $(PCHB) $(SRC)\timeout.c $(HACK_H) $(LEV_H) $(O)track.B: $(PCHB) $(SRC)\track.c $(HACK_H) $(O)trap.B: $(PCHB) $(SRC)\trap.c $(HACK_H) $(O)vault.B: $(PCHB) $(SRC)\vault.c $(HACK_H) $(VAULT_H) $(O)weapon.B: $(PCHB) $(SRC)\weapon.c $(HACK_H) $(O)were.B: $(PCHB) $(SRC)\were.c $(HACK_H) $(O)wizard.B: $(PCHB) $(SRC)\wizard.c $(HACK_H) $(QTEXT_H) $(O)zap.B: $(PCHB) $(SRC)\zap.c $(HACK_H) # end of file slashem-0.0.7E7F3/sys/msdos/maintovl.doc0000664000076400007640000004310610545462317016143 0ustar aliali SCCS Id: @(#)maintovl.doc 3.1 92/11/23 Copyright (c) NetHack PC Development Team 1990, 1991, 1992, 1993. NetHack may be freely redistributed. See license for details. =========================== Maintaining PC NetHack =========================== Last revision: 1992november23 The installation of the system of overlay management that currently brings full-featured NetHack to the IBM PC and compatibles has introduced a number of arcanities into the source code of the programme, and unfortunately running afoul of these intricacies can result (as we ourselves have discovered) in the most bizarre and strangely inexplicable dysfunctional manifestations, aka sick bugs. This document is required reading for anyone making substantive changes to NetHack for the PC or embarking upon a revision of its overlay structure. 1. The overlay manager ---------------------- NetHack is by now a fairly large programme (in excess of 800 kilobytes), and in order to compile it for the PC (which typically has little more than 500k of available memory) it was necessary to rely on the technique of _overlaying_, whereby not all the programme is resident in memory at the same time, segments of the programme being loaded and discarded as they are needed. Unlike traditional candidates for the overlaying strategy, however, NetHack does not exhibit strongly phased behaviour; although much of the code is not being used at any one moment, there is comparatively little code that can confidently be said not to be related to or potentially necessary for the immediate progress of the game. Furthermore we wished to develop an overlaying strategy that did _not_ involve intimate knowledge of the operation of the programme (since NetHack is an international team effort, and few people have a good feeling for the totality of the code structure), and which would not require substantive changes to the source code, impacting on its maintainability and portability. It turned out to be impossible to satisfy these goals with tools that are widely available at the time of writing, and so we undertook to write our own overlay manager (compatible with Microsoft's, but more in concert with NetHack's particular needs). The result is called ovlmgr.asm and is documented in the file ovlmgr.doc. You would probably be well advised to read at least the less technical parts of that file now. 2. The trampoli mechanism ------------------------- One of the difficulties with using overlays for C (particularly Microsoft C) is that while common C programming practise places heavy reliance on function pointers, Microsoft's overlay linker is unable to resolve calls through pointers to functions that are in remote overlays. Nor, unfortunately, does it choose to report such failures; rather, it generates calls into (what often turns out to be in the case of our nonstandard overlay manager) the deepest of space. This can result in truly strange behaviour on the part of your programme - including bugs that come and go in as close to a random pattern as you are ever likely to see. Other than the creative use of pattern-matching utilities such as grep to locate the offending calls, there is unfortunately no advice we can offer in tracking down these bugs. Once they have been isolated, however, they can be remedied straightforwardly. In order for the linker not to screw up on a pointered function call it is (to simplify an actually rather complicated situation) necessary that the function called be located in the ROOT "overlay", and thus not be subject to swapping. Rather than linking the full text of every pointered function into the root, however, it suffices to place a "trampoline" function there which performs a direct call to the "real" function that does the work, in whatever overlay it might naturally reside in. Due to a not-quite-accident of the behaviour of the C preprocessor (it was originally intended to make possible functions whose address can be taken but which expand inline as macros where possible, a not unrelated function), it turns out to be possible to arrange for this without major change to the C source code - and without serious impact on the performance of "regular" calls to the same functions. The C preprocessor's expansion of a macro with parameters is triggered by an encounter with the macro name immediately followed by an open parenthesis. If the name is found, but it is not followed by a parenthesis, the macro is not matched and no expansion takes place. At the same time it may be noted that (unless someone has been oddly strange and enclosed a function name in quite unneeded parentheses!), a function name is typically followed by an open parenthesis if, and only if, it is being declared, defined or invoked; if its address is being taken it will necessarily be followed by some other token. Furthermore it will be observed that (except in the unfortunate case of the ill-conceived new-style ANSI declaration of a function that takes no parameters) the number of parameters to a call of the function (assuming that this number is fixed; if not, I grant, we have a problem) is the same in all these contexts. This implies that if all the modules of a programme are uniformly processed in the context of a macro definition such as #define zook(a,b) plenk(a,b) and assuming that all functions named zook() take exactly two arguments, then the resulting programme will be completely identical to the original (without this definition) except that the link map will report the existence of the function plenk() in place of zook() -- UNLESS there was a place in the programme where the address of zook was taken. In that case, the linker would report an unresolved external reference for zook. That unresolved reference is, of course, precisely what we need; if in another source file (one that did not see the macro definition) we placed the function definition some_t zook(this_t a, that_t b) { extern some_t plenk(this_t, that_t); return plenk(a, b); } this would both satisfy the unresolved reference and restore the original semantics of the programme (even including pointer comparison!) -- while providing us with precisely the kind of "trampoline" module that we need to circumvent the problem with the linker. This is the basis of the approach we have taken in PC NetHack; rather than using the somewhat idiosyncratic identifier "plenk", however, we have systematically employed (in the files trampoli.h and trampoli.c) identifiers generated by appending underscores to the ends of the names of the functions we have needed to so indirect(1). There are a few small complications. The first is ensuring that both the versions of the trampoli'd function (foo() and foo_()) are similarly typed by the appropriate extern declarations (which themselves must be written); this can be accomplished by placing all of these declarations in a header file that is processed _twice_, once before and once after the inclusion of the file containing the trampoli macro definitions, thereby ensuring that both variants of the name have been seen in connection with the appropriate types. The second is that some care must be exercised not to employ other macros that interfere with the normal recognition of function syntax: it is the presence of the open parenthesis after the name of the function that triggers name substitution, and not the fact that the function is called; and so (particularly in the case of declarations) it is necessary that if a macro is used to supply the _arguments_ of a trampoli'd function, it must also supply the name (this necessity in fact triggered a change in the style of the macros that provide dialect-independent function declaration in NetHack; the new style would have you write FDECL(functionName, (argTypes...)). Finally, there is the case of functions declared to take no arguments whatsoever; in Standard C this is notated: some_t aFunction(void); for no theoretically well-motivated reason I can discern. Such a declaration will _not_ match a macro definition such as #define aFunction() aFunction_() -- in fact the compiler will detect an error when processing that declaration in the scope of this macro. The only solution is to eschew the use of this strange syntax and unfrabjously forgo the concomitant security of well- and thoroughly- checked typage. To which end we have provided an ecchy macro, NDECL(functionName), which uses the new syntax _unless_ the compiler is not Standard or OVERLAY is enabled. There is one further consideration: that this technique only applies, of course, to functions that are published to the linker. For this reason, wherever such trampoli'd functions were originally declared static, that declaration has been changed to "STATIC_PTR", a macro that expands to "static" unless the OVERLAY flag has been selected in the configuration file, enabling the trampoli mechanism. Thus such functions lose their privacy in this one case. 3. OVLx ------- The strategies described above work fine, but they only stretch so far. In particular, they do not admit of an overlay structure in which functions are linked into different overlays even though they originate in the same source file. Classically, this is not considered a real limitation, because one has the freedom to regroup the functions into different source files as needed; however, in the case of NetHack this was not a realistic option, since what structure this unwieldy programme has is precisely in the current grouping of functions together. Nonetheless, the ability to perform some functional grouping is an absolute requirement for acceptable performance, since many NetHack source modules (were.c, for example) contain one or two tiny functions that are called with great frequency (several millions of times per game is not unheard of) and whose return value determines whether the remaining large, slow functions of the file will be required at all in the near future. Obviously these small checking functions should be linked into the same overlays with their callers, while the remainder of the source module should not. In order to make this possible we ran a dynamic profile on the game to determine exactly which functions in which modules required such distinguished treatment, and we have flagged each function for conditional compilation (with #if ... #endif) in groups according approximately to their frequency of invocation and functionality. These groups have been arbitrarily named in each source file (in decreasing order of frequency), OVL0, OVL1, OVL2, OVL3 and OVLB (B for "base functions", those that deserve no special treatment at all). It is thus possible to compile only a small number of the functions in a file by defining but one or two of these symbols on the compiler's command line (with the switch /DOVL2, for example); the compiler will ignore the remainder as if they did not exist. (There is an "escape clause" in hack.h that ensures that if none of these flags is defined on the command line, then all of them will be during compilation; this makes the non-use of this mechanism straightforward!) By repeated invocation of the compiler on the _same_ source file it is possible to accumulate disjoint object modules that between them contain the images of all the functions in the original source, but partitioned as is most convenient. Care must, of course, be taken over conflicts of name in both the object file put out (all slices will by default be called SRCFILE.OBJ, and this default must be overridden with distinct file names for each output slice) and in the names of the text segments the compiler is to generate; you can see this at work in Makefile.ovl. (You may wonder, as we did at first, why the text segment name would have to be made distinct in each object file slice (the default segment name is a function of the source file name and the compilation model only). The reason for this is, quite daftly to my mind, that the linker considers the identity of segment names and combine classes better reason to combine segments than the programmer's explicit instructions in the requested overlay pattern is reason to keep them apart. Programmer, ask not why...). Once again, that works fine except for the small matter of declarations (where have we heard this before?). For objects that once were static must now be made visible to the linker that they may be resolved across the reaches of inter-overlay space. To this end we have provided three macros, all of which expand simply to "static" if no OVLx flags are defined on the compilation command line. They are: STATIC_DCL which introduces a declaration (as distinct from a definition) of an object that would be static were it not for the requirements of the OVLx mechanism. Its expansion is "static", normally, but it becomes "extern" in the event that this source file has been split into slices with the OVLx mechanism. STATIC_OVL is used when _defining_ a function (giving its text, that is) that is logically static but may be called across slices; it expands to "static" unless OVLx is active; in the latter case it expands to null, leaving the function with "previous linkage" as the standard says. Note that this behaviour is quite similar to, but very different from, that of STATIC_PTR (described above), which has the same two expansions but which is triggered not by OVLx but by the OVERLAY flag which enables the trampoli mechanism. STATIC_OVL also differs from the STATIC_DCL and STATIC_VAR in that it is employed _within_ OVLx slices, while the others are used to generate declarations and are deployed in areas common to all slices. STATIC_VAR is used to introduce uninitialised would-be-static variables. Its expansion is complex, since it must read as "static" in the usual case, but as "extern" if OVLx is in use -- in all overlays but one, where it must expand to the null sequence -- giving it "previous linkage" and "tentative definition" (to ensure that the variable gets defined at all). This one took a while to get right, and believe me, using the macro is a lot easier than trying to keep the #ifdefs straight yourself! An initialised variable that is file-level static unless OVLx is in use must now be written with a STATIC_DCL declaration, and a definition (and static initialiser) enclosed within the bracketing tag of one of the OVLx slices (any will do; we use OVLB). Type definitions, macro definitions and extern declarations should, of course remain outside any OVLx slice. Finally, of course, objects whose visibility need not be extended may safely continue to be declared static. And in this case, at least, the compiler will provide diagnostics that inform you when an object has slipped through the cracks and requires the application of Magic Macro Salve. It is perhaps less than obvious that when a function is _both_ called across an OVLx split and referenced through a pointer, it should be treated as a pointered function (that is, it should get trampoli entries and should be defined STATIC_PTR). The reason for this is that the STATIC_xxx macros associated with OVLx _only_ change the declaration patterns of the objects, while trampoli results in the generation of necessary code. It is correct to do this, because the declarations produced by STATIC_PTR are triggered by OVERLAY's being defined, and the selection of OVERLAY is an absolute precondition for the activation of OVLx. 4. Hacking ---------- Before undertaking any serious modifications to the overlay structure or support mechanisms, you should know that a _lot_ of work has gone into the current scheme. If performance seems poor, remember: the overlay manager itself can be invoked up to ten thousand times in a second, and although the space available for loading overlays (once the data and stack spaces have been accounted for) is less than half the total size of the overlays that are swapped through it, a disk access occurs well under 0.1% of the time(2). Furthermore, this performance (such as it is) has been achieved without substantive change or restructuring of the NetHack source code, which must remain portable to many platforms other than the PC. If these observations do not daunt you, you are a Bit Warrior indeed (or aspiration anyway), and we await your comments with bait. ------------------------------------------------------------------------ NOTES: ------ (1) In fact, we have applied this technique throughout NetHack, even in cases where it is not strictly necessary (since the pointered calls are not across overlay splits, for example - though note that there are more splits than might be initially apparent, due to the effects of the OVLx hackage as described in section 3). There is, however, one exception; and beware: it is an exception with fangs. The file termcap.c contains a few pointered functions that we decided _not_ to trampoli for performance reasons (screen output is one of the problem areas on the PC port at the moment, in terms of performance). It is therefore vital to the health of PC NetHack as it currently stands that the OVLx slice termcap.0 be linked into the ROOT "overlay". (2) These figures are for a 4.77 MHz PC-XT running in low memory with an older version of both the overlay manager and the NetHack overlay arrangement. On a more capable computer and with the current software, the figures are probably more like a 100kHz peak service rate and a hit rate (since we fixed the bug in the LRU clock logic!) in excess of 99.99% -- hopefully not both at the same time. ------------------------------------------------------------------------ Stephen P Spackman stephen@estragon.uchicago.edu ------------------------------------------------------------------------ * Hack On! * slashem-0.0.7E7F3/sys/msdos/vidtxt.c0000664000076400007640000002734110545462317015314 0ustar aliali/* 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. */ /* */ /* * vidtxt.c - Textmode video hardware support (BIOS and DJGPPFAST) * *Edit History: * Initial Creation M. Allison 93/04/04 * Add djgpp support K. Smolkowski 93/04/26 * Add runtime monoadapter check M. Allison 93/05/09 */ #define VIDEO_TEXT #include "hack.h" #include "pcvideo.h" #include "wintty.h" #include #include #if defined(_MSC_VER) # if _MSC_VER >= 700 #pragma warning(disable:4018) /* signed/unsigned mismatch */ #pragma warning(disable:4127) /* conditional expression is constant */ #pragma warning(disable:4131) /* old style declarator */ #pragma warning(disable:4305) /* prevents complaints with MK_FP */ #pragma warning(disable:4309) /* initializing */ #pragma warning(disable:4759) /* prevents complaints with MK_FP */ # endif #endif /* void FDECL(txt_xputc,(char, int)); */ /* write out character (and 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 */ extern int attrib_gr_intense; /* graphics mode intense attribute */ #ifdef OVLB void txt_get_scr_size() { union REGS regs; if (!iflags.BIOS) { CO = 80; LI = 24; return; } # ifdef PC9800 regs.h.ah = SENSEMODE; (void) int86(CRT_BIOS, ®s, ®s); CO = (regs.h.al & 0x02) ? 40 : 80; LI = (regs.h.al & 0x01) ? 20 : 25; # else regs.x.ax = FONTINFO; regs.x.bx = 0; /* current ROM BIOS font */ regs.h.dl = 24; /* default row count */ /* in case no EGA/MCGA/VGA */ (void) int86(VIDEO_BIOS, ®s, ®s); /* Get Font Information */ /* MDA/CGA/PCjr ignore INT 10h, Function 11h, but since we * cleverly loaded up DL with the default, everything's fine. * * Otherwise, DL now contains rows - 1. Also, CX contains the * points (bytes per character) and ES:BP points to the font * table. -3. */ regs.h.ah = GETMODE; (void) int86(VIDEO_BIOS, ®s, ®s); /* Get Video Mode */ /* This goes back all the way to the original PC. Completely * safe. AH contains # of columns, AL contains display mode, * and BH contains the active display page. */ LI = regs.h.dl + 1; CO = regs.h.ah; # endif /* PC9800 */ } #endif /*OVLB*/ /* * -------------------------------------------------------------- * The rest of this file is only compiled if NO_TERMS is defined. * -------------------------------------------------------------- */ #ifdef NO_TERMS /* #include "wintty.h" */ # ifdef SCREEN_DJGPPFAST #include #include # endif void FDECL(txt_gotoxy, (int,int)); # if defined(SCREEN_BIOS) && !defined(PC9800) void FDECL(txt_get_cursor, (int *, int *)); # endif # ifdef SCREEN_DJGPPFAST #define txt_get_cursor(x,y) ScreenGetCursor(y,x) # endif extern int g_attribute; /* Current attribute to use */ extern int monoflag; /* 0 = not monochrome, else monochrome */ # ifdef OVLB void txt_backsp() { # ifdef PC9800 union REGS regs; regs.h.dl = 0x01; /* one column */ regs.h.ah = CURSOR_LEFT; regs.h.cl = DIRECT_CON_IO; int86(DOS_EXT_FUNC, ®s, ®s); # else int col,row; txt_get_cursor(&col, &row); if (col > 0) col = col-1; txt_gotoxy(col,row); # endif } void txt_nhbell() { union REGS regs; if (flags.silent) return; regs.h.dl = 0x07; /* bell */ regs.h.ah = 0x02; /* Character Output function */ (void) int86(DOSCALL, ®s, ®s); } # endif /* OVLB */ # ifdef OVL0 void txt_clear_screen() /* djgpp provides ScreenClear(), but in version 1.09 it is broken * so for now we just use the BIOS Routines */ { union REGS regs; # ifdef PC9800 regs.h.dl = attr98[attrib_text_normal]; regs.h.ah = SETATT; regs.h.cl = DIRECT_CON_IO; (void) int86(DOS_EXT_FUNC, ®s, ®s); regs.h.dl = 0x02; /* clear whole screen */ regs.h.ah = SCREEN_CLEAR; regs.h.cl = DIRECT_CON_IO; (void) int86(DOS_EXT_FUNC, ®s, ®s); # else regs.h.dl = (char)(CO - 1); /* columns */ regs.h.dh = (char)(LI - 1); /* rows */ regs.x.cx = 0; /* CL,CH = x,y of upper left */ regs.x.ax = 0; regs.x.bx = 0; regs.h.bh = (char)attrib_text_normal; regs.h.ah = (char)SCROLL; /* DL,DH = x,y of lower rt */ (void) int86(VIDEO_BIOS, ®s, ®s); /* Scroll or init window */ txt_gotoxy(0,0); # endif } void txt_cl_end(col,row) /* clear to end of line */ int col,row; { union REGS regs; # ifndef PC9800 int count; # endif # ifdef PC9800 regs.h.dl = attr98[attrib_text_normal]; regs.h.ah = SETATT; regs.h.cl = DIRECT_CON_IO; (void) int86(DOS_EXT_FUNC, ®s, ®s); regs.h.dl = 0x00; /* clear to end of line */ regs.h.ah = LINE_CLEAR; regs.h.cl = DIRECT_CON_IO; (void) int86(DOS_EXT_FUNC, ®s, ®s); # else count = CO - col; txt_gotoxy(col,row); regs.h.ah = PUTCHARATT; /* write attribute & character */ regs.h.al = ' '; /* character */ regs.h.bh = 0; /* display page */ /* BL = attribute */ regs.h.bl = (char)attrib_text_normal; regs.x.cx = count; if (count != 0) (void) int86(VIDEO_BIOS, ®s, ®s); /* write attribute & character */ # endif } void txt_cl_eos() /* clear to end of screen */ { union REGS regs; # ifndef PC9800 int col,row; # endif # ifdef PC9800 regs.h.dl = attr98[attrib_text_normal]; regs.h.ah = SETATT; regs.h.cl = DIRECT_CON_IO; (void) int86(DOS_EXT_FUNC, ®s, ®s); regs.h.dl = 0x00; /* clear to end of screen */ regs.h.ah = SCREEN_CLEAR; regs.h.cl = DIRECT_CON_IO; (void) int86(DOS_EXT_FUNC, ®s, ®s); # else txt_get_cursor(&col, &row); txt_cl_end(col,row); /* clear to end of line */ txt_gotoxy(0,(row < (LI-1) ? row+1 : (LI-1))); regs.h.dl = (char) (CO-1); /* X of lower right */ regs.h.dh = (char) (LI-1); /* Y of lower right */ regs.h.cl = 0; /* X of upper left */ /* Y (row) of upper left */ regs.h.ch = (char) (row < (LI-1) ? row+1 :(LI-1)); regs.x.cx = 0; regs.x.ax = 0; regs.x.bx = 0; regs.h.bh = (char)attrib_text_normal; regs.h.ah = SCROLL; (void) int86(VIDEO_BIOS, ®s, ®s); /* Scroll or initialize window */ # endif } # endif /* OVL0 */ # ifdef OVLB void txt_startup(wid, hgt) int *wid, *hgt; { txt_get_scr_size(); *wid = CO; *hgt = LI; attrib_gr_normal = attrib_text_normal; attrib_gr_intense = attrib_text_intense; g_attribute = attrib_text_normal; /* Give it a starting value */ } # endif /* OVLB */ /* * Screen output routines (these are heavily used). * * These are the 3 routines used to place information on the screen * in the NO_TERMS PC tty port of NetHack. These are the routines * that get called by routines in other NetHack source files (such * as those in win/tty). * * txt_xputs - Writes a c null terminated string at the current location. * Depending on compile options, this could just be a series * of repeated calls to xputc() for each character. * txt_xputc - Writes a single character at the current location. Since * various places in the code assume that control characters * can be used to control, we are forced to interpret some of * the more common ones, in order to keep things looking correct. * * NOTES: * wintty.h uses macros to redefine common output functions * such as puts, putc, putchar, so that they get steered into * either xputs (for strings) or xputc (for single characters). * References to puts, putc, and putchar in other source files * (that include wintty.h) are actually using these routines. */ # ifdef OVL0 void txt_xputs(s,col,row) const char *s; int col,row; { char c; if (s != (char *)0) { while (*s != '\0') { txt_gotoxy(col,row); c = *s++; txt_xputc(c,g_attribute); if (col < (CO-1)) col++; txt_gotoxy(col,row); } } } void txt_xputc(ch,attr) /* write out character (and attribute) */ char ch; int attr; { # ifdef PC9800 union REGS regs; regs.h.dl = attr98[attr]; regs.h.ah = SETATT; regs.h.cl = DIRECT_CON_IO; (void) int86(DOS_EXT_FUNC, ®s, ®s); if (ch == '\n') { regs.h.dl = '\r'; regs.h.ah = PUTCHAR; regs.h.cl = DIRECT_CON_IO; (void) int86(DOS_EXT_FUNC, ®s, ®s); } regs.h.dl = ch; regs.h.ah = PUTCHAR; regs.h.cl = DIRECT_CON_IO; (void) int86(DOS_EXT_FUNC, ®s, ®s); # else # ifdef SCREEN_BIOS union REGS regs; # endif int col,row; txt_get_cursor(&col,&row); switch(ch) { case '\n': #if 0 col = 0; ++row; #endif break; default: # ifdef SCREEN_DJGPPFAST ScreenPutChar((int)ch,attr,col,row); # endif # ifdef SCREEN_BIOS regs.h.ah = PUTCHARATT; /* write att & character */ regs.h.al = ch; /* character */ regs.h.bh = 0; /* display page */ regs.h.bl = (char)attr; /* BL = attribute */ regs.x.cx = 1; /* one character */ (void) int86(VIDEO_BIOS, ®s, ®s); # endif if (col < (CO -1 )) ++col; break; } /* end switch */ txt_gotoxy(col,row); # endif /* PC9800 */ } # endif /* OVL0 */ /* * This marks the end of the general screen output routines that are * called from other places in NetHack. * --------------------------------------------------------------------- */ /* * Cursor location manipulation, and location information fetching * routines. * These include: * * txt_get_cursor(x,y) - Returns the current location of the cursor. In * some implementations this is implemented as a * function (BIOS), and in others it is a macro * (DJGPPFAST). * * txt_gotoxy(x,y) - Moves the cursor on screen to the specified x and * y location. This routine moves the location where * screen writes will occur next, it does not change * the location of the player on the NetHack level. */ # ifdef OVL0 # if defined(SCREEN_BIOS) && !defined(PC9800) /* * This is implemented as a macro under DJGPPFAST. */ void txt_get_cursor(x,y) /* get cursor position */ int *x, *y; { union REGS regs; regs.x.dx = 0; regs.h.ah = GETCURPOS; /* get cursor position */ regs.x.cx = 0; regs.x.bx = 0; (void) int86(VIDEO_BIOS, ®s, ®s); /* Get Cursor Position */ *x = regs.h.dl; *y = regs.h.dh; } # endif /* SCREEN_BIOS && !PC9800 */ void txt_gotoxy(x,y) int x,y; { # ifdef SCREEN_BIOS union REGS regs; # ifdef PC9800 regs.h.dh = (char)y; /* row */ regs.h.dl = (char)x; /* column */ regs.h.ah = SETCURPOS; regs.h.cl = DIRECT_CON_IO; (void) int86(DOS_EXT_FUNC, ®s, ®s); /* Set Cursor Position */ # else regs.h.ah = SETCURPOS; regs.h.bh = 0; /* display page */ regs.h.dh = (char)y; /* row */ regs.h.dl = (char)x; /* column */ (void) int86(VIDEO_BIOS, ®s, ®s); /* Set Cursor Position */ # endif # endif # if defined(SCREEN_DJGPPFAST) ScreenSetCursor(y,x); # endif /* The above, too, goes back all the way to the original PC. If * we ever get so fancy as to swap display pages (i doubt it), * then we'll need to set BH appropriately. This function * returns nothing. -3. */ } # endif /* OVL0 */ /* * This marks the end of the cursor manipulation/information routines. * ------------------------------------------------------------------- */ # ifdef OVLB # ifdef MONO_CHECK int txt_monoadapt_check() { union REGS regs; regs.h.al = 0; regs.h.ah = GETMODE; /* get video mode */ (void) int86(VIDEO_BIOS, ®s, ®s); return (regs.h.al == 7) ? 1 : 0; /* 7 means monochrome mode */ } # endif /* MONO_CHECK */ # endif /* OVLB */ #endif /* NO_TERMS */ /* vidtxt.c */ slashem-0.0.7E7F3/sys/msdos/makefile.doc0000664000076400007640000000571010545462317016066 0ustar aliali # NetHack Makefile. # SCCS Id: @(#)Makefile.doc 3.2 97/DEC/17 # WAC - added support for DOS DJGPP using GNU Groff package # Standard distribution documents are built using nroff, tbl and col # We'll be using groff to simulate nroff and col # tbl is in the Groff package # I don't see why this won't work on any other platform with GNU Groff # If you have Groff and col or nroff and col, use the standard Unix Makefile.doc GUIDEBOOK = Guidebook # regular ASCII file #GUIDEBOOK = Guidebook.ps # PostScript file #GUIDEBOOK = Guidebook.dvi # TeX device-independent file # Use the "cat" GUIDECMD if groff and/or tbl are not installed # DOS w/o cat users can use "type" # GUIDECMD = cat Guidebook.txt # GUIDECMD = type Guidebook.txt GUIDECMD = tbl tmac.n Guidebook.mn | groff -Wall -mtty-char -Tascii -P-u -P-b # the basic guidebook Guidebook: Guidebook.mn $(GUIDECMD) > Guidebook # 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. # - To print Guidebook.dvi you need to use a suitable dvi-driver. Guidebook.dvi: Guidebook.tex latex Guidebook.tex GAME = slashem #GAME = nethack MANDIR = /games/slash/doc MANEXT = 1n # manual installation for most SYSV-style systems # and for man files readable in less (eg dos DJGPP+GNU) GAMEMANCREATE = groff -Wall -mtty-char -Tascii -man $(GAME).6 > LEVMANCREATE = groff -Wall -mtty-char -Tascii -man lev_comp.6 > DGNMANCREATE = groff -Wall -mtty-char -Tascii -man dgn_comp.6 > RCVRMANCREATE = groff -Wall -mtty-char -Tascii -man recover.6 > DLBMANCREATE = groff -Wall -mtty-char -Tascii -man dlb.6 > manpages: -$(GAMEMANCREATE) $(MANDIR)/$(GAME).$(MANEXT) -$(LEVMANCREATE) $(MANDIR)/lev_comp.$(MANEXT) -$(DGNMANCREATE) $(MANDIR)/dgn_comp.$(MANEXT) -$(RCVRMANCREATE) $(MANDIR)/recover.$(MANEXT) -$(DLBMANCREATE) $(MANDIR)/dlb.$(MANEXT) # manual creation for distribution DISTRIB = Guidebook.txt $(GAME).txt lev_comp.txt dgn_comp.txt recover.txt dlb.txt distrib: $(DISTRIB) @echo "Plain text documentation is up to date." Guidebook.txt : Guidebook.mn tmac.n tbl tmac.n Guidebook.mn | groff -Wall -mtty-char -Tascii -P-u -P-b \ > Guidebook.txt $(GAME).txt : $(GAME).6 groff -Wall -mtty-char -Tascii -P-u -P-b -man $(GAME).6 > $(GAME).txt lev_comp.txt : lev_comp.6 groff -Wall -mtty-char -Tascii -P-u -P-b -man lev_comp.6 > lev_comp.txt dgn_comp.txt : dgn_comp.6 groff -Wall -mtty-char -Tascii -P-u -P-b -man dgn_comp.6 > dgn_comp.txt recover.txt : recover.6 groff -Wall -mtty-char -Tascii -P-u -P-b -man recover.6 > recover.txt dlb.txt : dlb.6 groff -Wall -mtty-char -Tascii -P-u -P-b -man dlb.6 > dlb.txt clean: -rm -f Guidebook.aux Guidebook.log spotless: clean -rm -f Guidebook Guidebook.ps Guidebook.dvi maintainer-clean: spotless -rm -f $(DISTRIB) # -rm -f Makefile slashem-0.0.7E7F3/sys/msdos/pcvideo.h0000664000076400007640000002246310545462317015430 0ustar aliali/* 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. */ /* */ /* * pcvideo.h - Hardware video support definitions and prototypes * *Edit History: * Initial Creation M. Allison 93/10/30 * */ #ifndef PCVIDEO_H #define PCVIDEO_H #include "portio.h" # ifdef SCREEN_BIOS # if !defined(PC9800) # define MONO_CHECK /* Video BIOS can do the check */ # endif # endif # ifdef SCREEN_DJGPPFAST /*# define MONO_CHECK *//* djgpp should be able to do check */ # endif /* * PC interrupts */ # ifdef PC9800 #define CRT_BIOS 0x18 #define DOS_EXT_FUNC 0xdc #define DIRECT_CON_IO 0x10 # else #define VIDEO_BIOS 0x10 # endif #define DOSCALL 0x21 /* * Video BIOS functions */ # if defined(PC9800) #define SENSEMODE 0x0b /* Sense CRT Mode */ #define PUTCHAR 0x00 /* Put Character */ #define SETATT 0x02 /* Set Attribute */ #define SETCURPOS 0x03 /* Set Cursor Position */ #define CURSOR_RIGHT 0x08 /* Move Cursor Right */ #define CURSOR_LEFT 0x09 /* Move Cursor Left */ #define SCREEN_CLEAR 0x0a /* Clear Screen */ #define LINE_CLEAR 0x0b /* Clear Line */ # else #define SETCURPOS 0x02 /* Set Cursor Position */ # endif #define GETCURPOS 0x03 /* Get Cursor Position */ #define GETMODE 0x0f /* Get Video Mode */ #define SETMODE 0x00 /* Set Video Mode */ #define SETPAGE 0x05 /* Set Video Page */ #define FONTINFO 0x1130 /* Get Font Info */ #define SCROLL 0x06 /* Scroll or initialize window */ #define PUTCHARATT 0x09 /* Write attribute & char at cursor */ /* * VGA Specific Stuff */ # ifdef SCREEN_VGA /* #define HW_PANNING *//* Hardware panning enabled */ #define USHORT unsigned short #define MODE640x480 0x0012 /* Switch to VGA 640 x 480 Graphics mode */ #define MODETEXT 0x0003 /* Switch to Text mode 3 */ #ifdef HW_PANNING #define PIXELINC 16 /* How much to increment by when panning */ /*#define PIXELINC 1 *//* How much to increment by when panning */ #define SCREENBYTES 128 #define CharRows 30 #define VERT_RETRACE {while (!(inportb(crt_status) & 0x08)); } #define VERT_RETRACE_END {while ( (inportb(crt_status) & 0x08)); } #else #define SCREENBYTES 80 #endif #define CharacterWidth 8 #define SCREENHEIGHT 480 #define SCREENWIDTH (SCREENBYTES * CharacterWidth) #define VIDEOSEG 0xa000 #define FONT_PTR_SEGMENT 0x0000 #define FONT_PTR_OFFSET 0x010C #define SCREENPLANES 4 #define COLORDEPTH 16 #define egawriteplane(n) { outportb(0x3c4,2); outportb(0x3c5,n); } #define egareadplane(n) { outportb(0x3ce,4); outportb(0x3cf,n); } #define col2x8(c) ((c) * 8) #define col2x16(c) ((c) * 16) #define col2x(c) ((c) * 2) #define row2y(c) ((c) * 16) #define MAX_ROWS_PER_CELL 16 #define MAX_COLS_PER_CELL 16 #define MAX_BYTES_PER_CELL 2 /* MAX_COLS_PER_CELL/8 */ #define ROWS_PER_CELL MAX_ROWS_PER_CELL #define COLS_PER_CELL MAX_COLS_PER_CELL #define BYTES_PER_CELL MAX_BYTES_PER_CELL struct cellplane { char image[MAX_ROWS_PER_CELL][MAX_BYTES_PER_CELL]; }; struct planar_cell_struct { struct cellplane plane[SCREENPLANES]; }; struct overview_cellplane { char image[MAX_ROWS_PER_CELL][1]; }; struct overview_planar_cell_struct { struct overview_cellplane plane[SCREENPLANES]; }; # endif /* SCREEN_VGA */ /* * Default color Indexes for hardware palettes * * Do not change the values below. * These are the color mappings defined by the particular video * hardware/mode. You can rearrange the NetHack color mappings at * run-time via the defaults.nh "videocolors" and "videoshades" * settings. * */ # if defined(SCREEN_BIOS) || defined(SCREEN_DJGPPFAST) #define M_BLACK 8 #define M_WHITE 15 #define M_GRAY 7 /* low-intensity white */ #define M_RED 4 #define M_GREEN 2 #define M_BROWN 6 /* low-intensity yellow */ #define M_BLUE 1 #define M_MAGENTA 5 #define M_CYAN 3 #define M_ORANGE 12 #define M_BRIGHTGREEN 10 #define M_YELLOW 14 #define M_BRIGHTBLUE 9 #define M_BRIGHTMAGENTA 13 #define M_BRIGHTCYAN 11 #define M_TEXT M_GRAY #define BACKGROUND_COLOR 0 #define ATTRIB_NORMAL M_TEXT /* Normal attribute */ #define ATTRIB_INTENSE M_WHITE /* Intense White */ #define ATTRIB_MONO_NORMAL 0x01 /* Underlined,white */ #define ATTRIB_MONO_UNDERLINE 0x01 /* Underlined,white */ #define ATTRIB_MONO_BLINK 0x87 /* Flash bit, white */ #define ATTRIB_MONO_REVERSE 0x70 /* Black on white */ # endif /*SCREEN_BIOS || SCREEN_DJGPPFAST */ # if defined(SCREEN_VGA) || defined(SCREEN_8514) #define BACKGROUND_VGA_COLOR 0 #define ATTRIB_VGA_NORMAL CLR_GRAY /* Normal attribute */ #define ATTRIB_VGA_INTENSE 13 /* Intense White 94/06/07 palette chg*/ # endif /*SCREEN_VGA || SCREEN_8514*/ # ifdef ALLEG_FX long colorpal[16]; # define BACKGROUND_ALLEGRO_COLOR colorpal[8] # endif # if defined(PC9800) static unsigned char attr98[CLR_MAX] = { 0xe1, /* 0 white */ 0x21, /* 1 blue */ 0x81, /* 2 green */ 0xa1, /* 3 cyan */ 0x41, /* 4 red */ 0x61, /* 5 magenta */ 0xc1, /* 6 yellow */ 0xe1, /* 7 white */ 0xe1, /* 8 white */ 0x25, /* 9 reversed blue */ 0x85, /* 10 reversed green */ 0xa5, /* 11 reversed cyan */ 0x45, /* 12 reversed red */ 0x65, /* 13 reversed magenta */ 0xc5, /* 14 reversed yellow */ 0xe5, /* 15 reversed white */ }; # endif # ifdef SIMULATE_CURSOR #define CURSOR_HEIGHT 3 /* this should go - MJA */ /* cursor styles */ #define CURSOR_INVIS 0 /* cursor not visible at all */ #define CURSOR_FRAME 1 /* block around the current tile */ #define CURSOR_UNDERLINE 2 /* thin line at bottom of the tile */ #define CURSOR_CORNER 3 /* cursor visible at the 4 tile corners */ #define NUM_CURSOR_TYPES 4 /* number of different cursor types */ #define CURSOR_DEFAULT_STYLE CURSOR_CORNER #define CURSOR_DEFAULT_COLOR M_GRAY /* global variables for cursor */ extern int cursor_type; extern int cursor_flag; extern int cursor_color; # endif /* * Function Prototypes * */ #define E extern /* ### video.c ### */ # ifdef SIMULATE_CURSOR E void NDECL(DrawCursor); E void NDECL(HideCursor); # endif /* ### vidtxt.c ### */ # ifdef NO_TERMS E void NDECL(txt_backsp); E void NDECL(txt_clear_screen); E void FDECL(txt_cl_end,(int,int)); E void NDECL(txt_cl_eos); E void NDECL(txt_get_scr_size); E void FDECL(txt_gotoxy,(int,int)); E int NDECL(txt_monoadapt_check); E void NDECL(txt_nhbell); E void FDECL(txt_startup,(int*,int*)); E void FDECL(txt_xputs, (const char *, int, int)); E void FDECL(txt_xputc, (CHAR_P, int)); /* ### vidvga.c ### */ # ifdef SCREEN_VGA E void NDECL(vga_backsp); E void FDECL(vga_clear_screen,(int)); E void FDECL(vga_cl_end,(int,int)); E void FDECL(vga_cl_eos,(int)); E int NDECL(vga_detect); # ifdef SIMULATE_CURSOR E void NDECL(vga_DrawCursor); # endif E void FDECL(vga_DisplayCell, (struct planar_cell_struct *, int, int)); E void FDECL(vga_DisplayCell_O, (struct overview_planar_cell_struct *, int, int)); E void NDECL(vga_Finish); E char __far *NDECL(vga_FontPtrs); E void NDECL(vga_get_scr_size); E void FDECL(vga_gotoloc,(int,int)); # ifdef POSITIONBAR E void FDECL(vga_update_positionbar, (char *)); # endif # ifdef SIMULATE_CURSOR E void NDECL(vga_HideCursor); # endif E void NDECL(vga_Init); E void FDECL(vga_SwitchMode, (unsigned int)); E void FDECL(vga_SetPalette, (char *)); E void NDECL(vga_tty_end_screen); E void FDECL(vga_tty_startup,(int*,int*)); E void FDECL(vga_WriteChar, (int, int, int, int)); 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)); E void NDECL(vga_refresh); # endif /* SCREEN_VGA */ # ifdef ALLEG_FX E void NDECL(alleg_backsp); E void FDECL(alleg_clear_screen,(int)); E void FDECL(alleg_cl_end,(int,int)); E void FDECL(alleg_cl_eos,(int)); E int NDECL(alleg_detect); # ifdef SIMULATE_CURSOR E void NDECL(alleg_DrawCursor); # endif E void NDECL(alleg_Finish); E void NDECL(alleg_get_scr_size); E void FDECL(alleg_gotoloc,(int,int)); /* This should be made a macro */ # ifdef POSITIONBAR E void FDECL(alleg_update_positionbar, (char *)); # endif # ifdef SIMULATE_CURSOR E void NDECL(alleg_HideCursor); # endif E void NDECL(alleg_Init); E void NDECL(alleg_tty_end_screen); E void FDECL(alleg_tty_startup,(int*,int*)); E void FDECL(alleg_WriteChar, (int, int, int, int)); E void FDECL(alleg_xputs, (char *, int, int)); E void FDECL(alleg_xputc, (CHAR_P, int)); E void FDECL(alleg_xputg, (int, int)); E void FDECL(alleg_userpan, (BOOLEAN_P)); E void FDECL(alleg_overview, (BOOLEAN_P)); E void FDECL(alleg_traditional, (BOOLEAN_P)); E void NDECL(alleg_refresh); E void NDECL(alleg_screenshot); # endif /* ALLEG_FX */ # endif /* NO_TERMS */ #undef E #endif /* PCVIDEO_H */ /* pcvideo.h */ slashem-0.0.7E7F3/sys/msdos/pctiles.h0000664000076400007640000000375210545462317015442 0ustar aliali/* 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. */ /* */ /* * pctiles.h - Definitions for PC graphical tile support * *Edit History: * Initial Creation M. Allison 93/10/30 * */ #ifdef USE_TILES #include "filename.h" /*WAC the tile name defs are in there now*/ #define ROWS_PER_TILE TILE_Y #define COLS_PER_TILE TILE_X #define EMPTY_TILE -1 #define TIBHEADER_SIZE 1024 /* Use this for size, allows expansion */ #define PLANAR_STYLE 0 #define PACKED_STYLE 1 #define DJGPP_COMP 0 #define MSC_COMP 1 #define BC_COMP 2 #define OTHER_COMP 10 struct tibhdr_struct { char ident[80]; /* Identifying string */ char timestamp[26]; /* Ascii timestamp */ char tilestyle; /* 0 = planar, 1 = pixel */ char compiler; /* 0 = DJGPP, 1 = MSC, 2= BC etc. see above */ short tilecount; /* number of tiles in file */ short numcolors; /* number of colors in palette */ char palette[256 * 3]; /* palette */ }; /* Note on packed style tile file: * Each record consists of one of the following arrays: * char packtile[TILE_Y][TILE_X]; */ extern void FDECL(CloseTileFile, (BOOLEAN_P)); extern int FDECL(OpenTileFile, (char *, BOOLEAN_P)); extern int FDECL(ReadTileFileHeader, (struct tibhdr_struct *, BOOLEAN_P)); # ifdef PLANAR_FILE # ifdef SCREEN_VGA extern int FDECL(ReadPlanarTileFile,(int, struct planar_cell_struct **)); extern int FDECL(ReadPlanarTileFile_O, (int, struct overview_planar_cell_struct **)); # endif # endif # ifdef PACKED_FILE extern int FDECL(ReadPackedTileFile, (int, char (*)[TILE_X])); # endif extern short glyph2tile[MAX_GLYPH]; /* in tile.c (made from tilemap.c) */ #endif /* USE_TILES */ /* pctiles.h */ slashem-0.0.7E7F3/sys/msdos/sound.c0000664000076400007640000001526510545462317015124 0ustar aliali/* 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. */ /* */ /* * sound.c - Hardware sound support * *Edit History: * Initial Creation 93/10/01 * Added PC Speaker Support for BC compilers 95/06/14 * Completed various fixes 96/02/19 * */ #include "hack.h" #include #include "portio.h" #include #include #ifndef TESTING #define printf pline int assign_soundcard(sopt) char *sopt; { iflags.hassound = 0; # ifdef PCMUSIC iflags.usepcspeaker = 0; # endif if (strncmpi(sopt,"def",3) == 0) { /* default */ /* do nothing - default */ } # ifdef PCMUSIC else if (strncmpi(sopt,"speaker",7) == 0) { /* pc speaker */ iflags.usepcspeaker = 1; } # endif else if (strncmpi(sopt,"auto",4) == 0) { /* autodetect */ /* * Auto-detect Priorities (arbitrary for now): * Just pcspeaker */ if (0) ; # ifdef PCMUSIC else iflags.usepcspeaker = 1; # endif } else { return 0; } return 1; } #endif #ifdef PCMUSIC /* 8254/3 Control Word Defines */ #define CTR0SEL (0<<6) #define CTR1SEL (1<<6) #define CTR2SEL (2<<6) #define RDBACK (3<<6) #define LATCH (0<<4) #define RW_LSB (1<<4) #define RW_MSB (2<<4) /* If both LSB and MSB are read, LSB is done first */ #define MODE0 (0<<1) /* Interrupt on terminal count */ #define MODE1 (1<<1) /* Hardware One-Shot */ #define MODE2 (2<<1) /* Pulse Generator */ #define MODE3 (3<<1) /* Square Wave Generator */ #define MODE4 (4<<1) /* Software Triggered Strobe */ #define MODE5 (5<<1) /* Hardware Triggered Strobe */ #define BINARY (0<<0) /* Binary counter (16 bits) */ #define BCD (1<<0) /* Binary Coded Decimal (BCD) Counter (4 Decades) */ /* Misc 8254/3 Defines */ #define TIMRFRQ (1193180UL) /* Input frequency to the clock (Hz) */ /* Speaker Defines */ #define TIMER (1<<0) /* Timer 2 Output connected to Speaker */ #define SPKR_ON (1<<1) /* Turn on/off Speaker */ /* Port Definitions */ /* 8254/3 Ports */ #define CTR0 0x40 #define CTR1 0x41 #define CTR2 0x42 #define CTRL 0x43 /* Speaker Port */ #define SPEAKER 0x61 void startsound (unsigned freq) { /* To start a sound on the PC: * * First, set the second counter to have the correct frequency: */ unsigned count; if (freq == 0) freq = 523; count = TIMRFRQ / freq; /* Divide frequencies to get count. */ #ifdef TESTING printf ("freq = %u, count = %u\n", freq, count); #endif outportb (CTRL, CTR2SEL|RW_LSB|RW_MSB|MODE3|BINARY); outportb (CTR2, count & 0x0FF); outportb (CTR2, count / 0x100); /* Next, turn on the speaker */ outportb (SPEAKER, inportb(SPEAKER)|TIMER|SPKR_ON); } void stopsound (void) { outportb (SPEAKER, inportb(SPEAKER) & ~(TIMER|SPKR_ON)); } static unsigned tempo, length, octave, mtype; /* The important numbers here are 287700UL for the factors and 4050816000UL * which gives the 440 Hz for the A below middle C. "middle C" is assumed to * be the C at octave 3. The rest are computed by multiplication/division of * 2^(1/12) which came out to 1.05946 on my calculator. It is assumed that * no one will request an octave beyond 6 or below 0. (At octave 7, some * notes still come out ok, but by the end of the octave, the "notes" that * are produced are just ticks. * These numbers were chosen by a process based on the C64 tables (which * weren't standardized) and then were 'standardized' by giving them the * closest value. That's why they don't seem to be based on any sensible * number. */ unsigned long notefactors[12] = { 483852, 456695, 431063, 406869, 384033, 362479, 342135, 322932, 304808, 287700, 271553, 256312 }; void note (long notenum) { startsound ((unsigned) (4050816000UL / notefactors[notenum % 12] >> (7 - notenum / 12))); } int notes[7] = { 9, 11, 0, 2, 4, 5, 7 }; char * startnote (char *c) { long n; n = notes[toupper(*c++) - 'A'] + octave * 12; if (*c == '#' || *c == '+') { n++; c++; } else if (*c == '-') { if (n) n--; c++; } note (n); return --c; } void delaytime (unsigned time) { /* time and twait are in units of milliseconds */ unsigned twait; switch (toupper (mtype)) { case 'S': twait = time / 4; break; case 'L': twait = 0; break; default: twait = time / 8; break; } msleep (time - twait); stopsound (); msleep (twait); } char * delaynote (char *c) { unsigned time = 0; while (isdigit(*c)) time = time * 10 + (*c++ - '0'); if (!time) time = length; time = (unsigned)(240000 / time / tempo); while (*c == '.') { time = time * 3 / 2; c++; } delaytime (time); return c; } void initspeaker (void) { tempo = 120, length = 4, octave = 3, mtype = 'N'; } void play (char *tune) { char *c, *n; unsigned num; for (c = tune; *c; ) { sscanf (c + 1, "%u", &num); for (n = c + 1; isdigit(*n); n++) /* do nothing */; if (isspace(*c)) c++; else switch (toupper(*c)) { case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': c = startnote (c); case 'P': c = delaynote (++c); break; #if 0 case 'M': c++; mtype = *c; c++; break; case 'T': if (num) tempo = num; else printf ("Zero Tempo (%s)!\n", c); c = n; break; case 'L': if (num) length = num; else printf ("Zero Length (%s)!\n", c); c = n; break; case 'O': if (num <= 7) octave = num; c = n; break; case 'N': note (num); delaytime ((240000/length/tempo)); c = n; break; case '>': if (octave < 7) octave++; c++; break; case '<': if (octave) octave--; c++; break; #endif case ' ': c++; break; default: printf ("Unrecognized play value (%s)!\n", c); return; } } } #ifndef TESTING void pc_speaker (struct obj *instr, char *tune) { if (!iflags.usepcspeaker) return; initspeaker (); switch (instr->otyp) { case WOODEN_FLUTE: case MAGIC_FLUTE: octave = 5; /* up one octave */ break; case TOOLED_HORN: case FROST_HORN: case FIRE_HORN: octave = 2; /* drop two octaves */ break; case BUGLE: break; case WOODEN_HARP: case MAGIC_HARP: length = 8; mtype = 'L'; /* fast, legato */ break; } play (tune); } #else main () { char s[80]; int tool; initspeaker(); printf ("1) flute\n2) horn\n3) harp\n4) other\n"); fgets (s, 80, stdin); sscanf (s, "%d", &tool); switch (tool) { case 1: octave = 5; break; case 2: octave = 2; break; case 3: length = 8; mtype = 'L'; break; default: break; } printf ("Enter tune:"); fgets(s, 80, stdin); play (s); } #endif #endif /* PCMUSIC */ /* sound.c */ slashem-0.0.7E7F3/sys/msdos/setup.bat0000775000076400007640000001263710545462317015463 0ustar aliali@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. if not %1.==. goto ok_parm goto err_set :ok_parm 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 ..\..\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 if exist ..\..\dat\data~1.bas goto long1b goto err_long :long1a echo Changing some long-named distribution file names: echo "Copying ..\..\dat\data.base -> ..\..\dat\data.bas" copy ..\..\dat\data.base ..\..\dat\data.bas if exist ..\..\dat\data.old del /Q ..\..\dat\data.old ren ..\..\dat\data.base data.old goto long1ok :long1b echo Changing some long-named distribution file names: echo "Copying ..\..\dat\data~1.bas -> ..\..\dat\data.bas" copy ..\..\dat\data~1.bas ..\..\dat\data.bas if exist ..\..\dat\data.old del /Q ..\..\dat\data.old ren ..\..\dat\data~1.bas data.old :long1ok if exist ..\..\include\patchlev.h goto long2ok if exist ..\..\include\patchlevel.h goto long2a if exist ..\..\include\patchl~1.h goto long2b goto err_long :long2a echo "Copying ..\..\include\patchlevel.h -> ..\..\include\patchlev.h" copy ..\..\include\patchlevel.h ..\..\include\patchlev.h if exist ..\..\include\patchlev.old del /Q ..\..\include\patchlev.old ren ..\..\include\patchlevel.h patchlev.old goto long2ok :long2b echo "Copying ..\..\include\patchl~1.h -> ..\..\include\patchlev.h" copy ..\..\include\patchl~1.h ..\..\include\patchlev.h if exist ..\..\include\patchlev.old del /Q ..\..\include\patchlev.old ren ..\..\include\patchl~1.h patchlev.old :long2ok REM Missing guidebook is not fatal to the build process if exist ..\..\doc\guideboo.txt goto long3ok if exist ..\..\doc\guidebook.txt goto long3a if exist ..\..\doc\guideb~1.txt goto long3b goto warn3long :long3a echo "Copying ..\..\doc\guidebook.txt -> ..\..\doc\guideboo.txt" copy ..\..\doc\guidebook.txt ..\..\doc\guideboo.txt if exist ..\..\doc\guideboo.old del /Q ..\..\doc\guideboo.old ren ..\..\doc\guidebook.txt guideboo.old goto long3ok :long3b echo "Copying ..\..\doc\guideb~1.txt -> ..\..\doc\guideboo.txt" copy ..\..\doc\guideb~1.txt ..\..\doc\guideboo.txt if exist ..\..\doc\guideboo.old del /Q ..\..\doc\guideboo.old ren ..\..\doc\guideb~1.txt guideboo.old goto long3ok :warn3long echo "Warning - There is no NetHack Guidebook (..\..\doc\guideboo.txt)" echo " included in your distribution. Build will proceed anyway." :long3ok if "%1"=="GCC" goto ok_gcc if "%1"=="gcc" goto ok_gcc if "%1"=="nmake" goto ok_msc if "%1"=="NMAKE" goto ok_msc if "%1"=="BC" goto ok_bc if "%1"=="bc" goto ok_bc if "%1"=="MSC" goto ok_msc if "%1"=="msc" goto ok_msc goto err_set :ok_gcc echo Symbolic links, msdos style echo "Makefile.GCC -> ..\..\src\makefile" copy makefile.GCC ..\..\src\makefile goto done :ok_msc echo Copying Makefile for Microsoft C and Microsoft NMAKE. echo "Makefile.MSC -> ..\..\src\makefile" copy Makefile.MSC ..\..\src\makefile echo Copying overlay schemas to ..\..\src copy schema*.MSC ..\..\src\schema*.DEF :ok_cl goto done :ok_bc echo Copying Makefile for Borland C and Borland's MAKE. echo "Makefile.BC -> ..\..\src\makefile" copy Makefile.BC ..\..\src\makefile echo Copying overlay schemas to ..\..\src copy schema*.BC ..\..\src goto done :err_long echo. echo ** ERROR - New file system with "long file name support" problem. ** echo A couple of NetHack distribution files that are packaged with echo a long filename ( exceeds 8.3) appear to be missing from your echo distribution. echo The following files need to exist under the names on the echo right in order to build NetHack: echo. echo ..\..\dat\data.base needs to be copied to ..\..\dat\data.bas echo ..\..\include\patchlevel.h needs to be copied to ..\..\include\patchlev.h echo. echo setup.bat was unable to perform the necessary changes because at least echo one of the files doesn't exist under its short name, and the echo original (long) file name to copy it from was not found either. echo. goto end :err_set echo. echo Usage: echo "%0 " echo. echo Run this batch file specifying on of the following: echo GCC, MSC, BC echo. echo (depending on which compiler and/or make utility you are using). echo. echo The GCC argument is for use with djgpp and the NDMAKE utility. echo. echo The MSC argument is for use with Microsoft C and the NMAKE utility echo that ships with it (MSC 7.0 or greater only, including Visual C). echo. echo The BC argument is for use with Borland C and Borland's MAKE utility echo that ships with it (Borland C++ 3.1 only). echo. goto end :err_dir echo/ echo Your directories are not set up properly, please re-read the echo Install.dos and README documentation. goto end :done echo Setup Done! echo Please continue with next step from Install.dos. :end slashem-0.0.7E7F3/sys/msdos/msdos.c0000664000076400007640000003251410545462317015115 0ustar aliali/* 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. */ /* * MSDOS system functions. * Many thanks to Don Kneller who originated the DOS port and * contributed much to the cause. */ #define NEED_VARARGS #include "hack.h" #ifdef MSDOS #include "pcvideo.h" #include #include /* * MS-DOS functions */ #define DIRECT_INPUT 0x07 /* Unfiltered Character Input Without Echo */ #define FATINFO 0x1B /* Get Default Drive Data */ /* MS-DOS 2.0+: */ #define GETDTA 0x2F /* Get DTA Address */ #define FREESPACE 0x36 /* Get Drive Allocation Info */ #define GETSWITCHAR 0x3700 /* Get Switch Character */ #define FINDFIRST 0x4E /* Find First File */ #define FINDNEXT 0x4F /* Find Next File */ #define SETFILETIME 0x5701 /* Set File Date & Time */ /* * BIOS interrupts */ #ifdef PC9800 #define KEYBRD_BIOS 0x18 #else #define KEYBRD_BIOS 0x16 #endif /* * Keyboard BIOS functions */ #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 *)); #ifdef OVL0 /* direct bios calls are used only when iflags.BIOS is set */ static char NDECL(DOSgetch); static char NDECL(BIOSgetch); #ifndef __GO32__ static char * NDECL(getdta); #endif static unsigned int FDECL(dos_ioctl, (int,int,unsigned)); /* WAC pckeys is now a char */ extern char FDECL(pckeys,(unsigned char, unsigned char)); /* pckeys.c */ int tgetch() { char ch; /* BIOSgetch can use the numeric key pad on IBM compatibles. */ # ifdef SIMULATE_CURSOR if (iflags.grmode && cursor_flag) DrawCursor(); # endif if (iflags.BIOS) ch = BIOSgetch(); else ch = DOSgetch(); # ifdef SIMULATE_CURSOR if (iflags.grmode && cursor_flag) HideCursor(); # endif return ((ch == '\r') ? '\n' : ch); } /* * Keyboard translation tables. */ #ifdef PC9800 #define KEYPADLO 0x38 #define KEYPADHI 0x50 #else #define KEYPADLO 0x47 #define KEYPADHI 0x53 #endif #define PADKEYS (KEYPADHI - KEYPADLO + 1) #define iskeypad(x) (KEYPADLO <= (x) && (x) <= KEYPADHI) /* * Keypad keys are translated to the normal values below. * When iflags.BIOS is active, shifted keypad keys are translated to the * shift values below. */ static const struct pad { char normal, shift, cntrl; } keypad[PADKEYS] = { #ifdef PC9800 {'>', '>', '>'}, /* Ins */ {'<', '<', '<'}, /* Del */ {'k', 'K', C('k')}, /* Up */ {'h', 'H', C('h')}, /* Left */ {'l', 'L', C('l')}, /* Right */ {'j', 'J', C('j')}, /* Down */ { 0 , 0 , 0 }, /* HomeClr */ {'?', '?', '?' }, /* Help */ {'m', C('p'), C('p')}, /* - */ {'/', '/', '/'}, /* / */ {'y', 'Y', C('y')}, /* 7 */ {'k', 'K', C('k')}, /* 8 */ {'u', 'U', C('u')}, /* 9 */ {'*', '*', '*'}, /* * */ {'h', 'H', C('h')}, /* 4 */ {'g', 'g', 'g'}, /* 5 */ {'l', 'L', C('l')}, /* 6 */ {'p', 'P', C('p')}, /* + */ {'b', 'B', C('b')}, /* 1 */ {'j', 'J', C('j')}, /* 2 */ {'n', 'N', C('n')}, /* 3 */ {'=', '=', '='}, /* = */ {'i', 'I', C('i')}, /* 0 */ {',', ':', ':'}, /* , */ {'.', '.', '.'} /* . */ #else {'y', 'Y', C('y')}, /* 7 */ {'k', 'K', C('k')}, /* 8 */ {'u', 'U', C('u')}, /* 9 */ {'m', C('p'), C('p')}, /* - */ {'h', 'H', C('h')}, /* 4 */ {'g', 'g', 'g'}, /* 5 */ {'l', 'L', C('l')}, /* 6 */ {'p', 'P', C('p')}, /* + */ {'b', 'B', C('b')}, /* 1 */ {'j', 'J', C('j')}, /* 2 */ {'n', 'N', C('n')}, /* 3 */ {'i', 'I', C('i')}, /* Ins */ {'.', ':', ':'} /* Del */ #endif }, numpad[PADKEYS] = { #ifdef PC9800 {'>', '>', '>'}, /* Ins */ {'<', '<', '<'}, /* Del */ {'8', M('8'), '8'}, /* Up */ {'4', M('4'), '4'}, /* Left */ {'6', M('6'), '6'}, /* Right */ {'2', M('2'), '2'}, /* Down */ { 0 , 0 , 0 }, /* HomeClr */ {'?', '?', '?'}, /* Help */ {'m', C('p'), C('p')}, /* - */ {'/', '/', '/'}, /* / */ {'7', M('7'), '7'}, /* 7 */ {'8', M('8'), '8'}, /* 8 */ {'9', M('9'), '9'}, /* 9 */ {'*', '*', '*'}, /* * */ {'4', M('4'), '4'}, /* 4 */ {'g', 'G', 'g'}, /* 5 */ {'6', M('6'), '6'}, /* 6 */ {'p', 'P', C('p')}, /* + */ {'1', M('1'), '1'}, /* 1 */ {'2', M('2'), '2'}, /* 2 */ {'3', M('3'), '3'}, /* 3 */ {'=', '=', '='}, /* = */ {'i', 'I', C('i')}, /* 0 */ {',', ':', ':'}, /* , */ {'.', '.', '.'} /* . */ #else {'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 */ {'5', M('5'), '5'}, /* 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 */ {'0', M('0'), '0'}, /* Ins */ {'.', ':', ':'} /* Del */ #endif }; /* * Unlike Ctrl-letter, the Alt-letter keystrokes have no specific ASCII * meaning unless assigned one by a keyboard conversion table, so the * keyboard BIOS normally does not return a character code when Alt-letter * is pressed. So, to interpret unassigned Alt-letters, we must use a * scan code table to translate the scan code into a letter, then set the * "meta" bit for it. -3. */ #ifdef PC9800 #define SCANLO 0x5 /* #define SCANLO2 0x5 /* ... */ #else #define SCANLO 0x10 #define SCANLO2 0x78 #endif /* PC9800 */ static const char scanmap[] = { /* ... */ #ifdef PC9800 0, 0, 0, 0, 0, 0, '-','^','\\','\b', '\t','q','w','e','r','t','y','u','i','o','p','@','[', '\n', 'a','s','d','f','g','h','j','k','l',';',':', ']', 'z','x','c','v','b','n','m',',','.','/' /* ... */ #else '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',',','.','?' /* ... */ #endif /* PC9800 */ }; static const char scanmap2[] = { /* ... */ #ifdef PC9800 /* ... */ #else '1','2','3','4','5','6','7','8','9','0','-','=' /* ... */ #endif /* PC9800 */ }; #define inmap(x) (SCANLO <= (x) && (x) < SCANLO + SIZE(scanmap)) #define inmap2(x) (SCANLO2 <= (x) && (x) < SCANLO2 + SIZE(scanmap2)) #ifdef NEW_ALT #define NUMERIC_SCANLO 0x78 static const char numeric_scanmap[] = { /* ... */ '1','2','3','4','5','6','7','8','9','0','-','=' }; # define in_numericmap(x) (NUMERIC_SCANLO <= (x) && \ (x) < NUMERIC_SCANLO + SIZE(numeric_scanmap)) # endif /* * BIOSgetch gets keys directly with a BIOS call. */ #ifdef PC9800 #define SHIFT 0x1 #define KANA 0x4 #define GRPH 0x8 #define CTRL 0x10 #else #define SHIFT (0x1 | 0x2) #define CTRL 0x4 #define ALT 0x8 #endif /* PC9800 */ static char BIOSgetch() { /* WAC added pckeypress */ unsigned char scan, shift, ch=0, pckeypress=0; const struct pad *kpad; union REGS regs; do { /* Get scan code. */ regs.h.ah = READCHAR; int86(KEYBRD_BIOS, ®s, ®s); ch = regs.h.al; scan = regs.h.ah; /* Get shift status. */ regs.h.ah = GETKEYFLAGS; int86(KEYBRD_BIOS, ®s, ®s); shift = regs.h.al; /* Translate keypad keys */ if (iskeypad(scan)) { kpad = iflags.num_pad ? numpad : keypad; if (shift & SHIFT) ch = kpad[scan - KEYPADLO].shift; else if (shift & CTRL) ch = kpad[scan - KEYPADLO].cntrl; else ch = kpad[scan - KEYPADLO].normal; } /* Check for special interface manipulation keys */ /* WAC for help and stuff */ pckeypress = pckeys(scan, shift); if (pckeypress) { /* ch = 0xFF; */ ch = pckeypress; continue; } /* Translate unassigned Alt-letters */ #ifdef PC9800 if (shift & KANA) return 0; if ((shift & GRPH) && (ch >= 0x80)) { #else if ((shift & ALT) && !ch) { #endif /* WAC DEBUGGING */ #ifdef KEY_DEBUG pline("scan: %d", scan); #endif if (inmap(scan)) ch = scanmap[scan - SCANLO]; else if (inmap2(scan)) ch = scanmap2[scan - SCANLO2]; return (isprint(ch) ? M(ch) : ch); } } while (ch == 0xFF); return ch; } static char DOSgetch() { union REGS regs; char ch; struct pad (*kpad)[PADKEYS]; regs.h.ah = DIRECT_INPUT; intdos(®s, ®s); ch = regs.h.al; #ifdef PC9800 if (ch < 0) /* KANA letters and GRPH-shifted letters(?) */ ch = 0; /* munch it */ #else /* * The extended codes for Alt-shifted letters, and unshifted keypad * and function keys, correspond to the scan codes. So we can still * translate the unshifted cursor keys and Alt-letters. -3. */ if (ch == 0) { /* an extended key */ regs.h.ah = DIRECT_INPUT; intdos(®s, ®s); /* get the extended key code */ ch = regs.h.al; if (iskeypad(ch)) { /* unshifted keypad keys */ kpad = (void *)(iflags.num_pad ? numpad : keypad); ch = (*kpad)[ch - KEYPADLO].normal; } else if (inmap(ch)) { /* Alt-letters */ ch = scanmap[ch - SCANLO]; if (isprint(ch)) ch = M(ch); #if 0 } else if (inmap2(ch)) ch = scanmap2[ch - SCANLO2]; if (isprint(ch)) ch = M(ch); #endif } else ch = 0; /* munch it */ } #endif return (ch); } char switchar() { union REGS regs; regs.x.ax = GETSWITCHAR; intdos(®s, ®s); return regs.h.dl; } long freediskspace(path) char *path; { union REGS regs; regs.h.ah = FREESPACE; if (path[0] && path[1] == ':') regs.h.dl = (toupper(path[0]) - 'A') + 1; else regs.h.dl = 0; intdos(®s, ®s); if (regs.x.ax == 0xFFFF) return -1L; /* bad drive number */ else return ((long) regs.x.bx * regs.x.cx * regs.x.ax); } #ifndef __GO32__ /* * Functions to get filenames using wildcards */ int findfirst_file(path) char *path; { union REGS regs; struct SREGS sregs; regs.h.ah = FINDFIRST; regs.x.cx = 0; /* attribute: normal files */ regs.x.dx = FP_OFF(path); sregs.ds = FP_SEG(path); intdosx(®s, ®s, &sregs); return !regs.x.cflag; } int findnext_file() { union REGS regs; regs.h.ah = FINDNEXT; intdos(®s, ®s); return !regs.x.cflag; } char * foundfile_buffer() { return (getdta() + 30); } /* Get disk transfer area */ static char * getdta() { union REGS regs; struct SREGS sregs; char *ret; regs.h.ah = GETDTA; intdosx(®s, ®s, &sregs); # ifdef MK_FP ret = (char *)MK_FP(sregs.es, regs.x.bx); # else FP_OFF(ret) = regs.x.bx; FP_SEG(ret) = sregs.es; # endif return ret; } long filesize_nh(file) char *file; { char *dta; if (findfirst_file(file)) { dta = getdta(); return (* (long *) (dta + 26)); } else return -1L; } #endif /* __GO32__ */ /* * Chdrive() changes the default drive. */ void chdrive(str) char *str; { # define SELECTDISK 0x0E char *ptr; union REGS inregs; char drive; if ((ptr = index(str, ':')) != (char *)0) { drive = toupper(*(ptr - 1)); inregs.h.ah = SELECTDISK; inregs.h.dl = drive - 'A'; intdos(&inregs, &inregs); } return; } /* Use the IOCTL DOS function call to change stdin and stdout to raw * mode. For stdin, this prevents MSDOS from trapping ^P, thus * freeing us of ^P toggling 'echo to printer'. * Thanks to Mark Zbikowski (markz@microsoft.UUCP). */ #define DEVICE 0x80 #define RAW 0x20 #define IOCTL 0x44 #define STDIN fileno(stdin) #define STDOUT fileno(stdout) #define GETBITS 0 #define SETBITS 1 static unsigned int old_stdin, old_stdout; void disable_ctrlP() { if (!iflags.rawio) return; old_stdin = dos_ioctl(STDIN, GETBITS, 0); old_stdout = dos_ioctl(STDOUT, GETBITS, 0); if (old_stdin & DEVICE) dos_ioctl(STDIN, SETBITS, old_stdin | RAW); if (old_stdout & DEVICE) dos_ioctl(STDOUT, SETBITS, old_stdout | RAW); return; } void enable_ctrlP() { if (!iflags.rawio) return; if (old_stdin) (void) dos_ioctl(STDIN, SETBITS, old_stdin); if (old_stdout) (void) dos_ioctl(STDOUT, SETBITS, old_stdout); return; } static unsigned int dos_ioctl(handle, mode, setvalue) int handle, mode; unsigned setvalue; { union REGS regs; regs.h.ah = IOCTL; regs.h.al = mode; regs.x.bx = handle; regs.h.dl = setvalue; regs.h.dh = 0; /* Zero out dh */ intdos(®s, ®s); return (regs.x.dx); } /* WAC added Win95 DOS Box Title Changer for DJGPP */ # ifdef __DJGPP__ /* Defines */ #define APP_TITLE_BUFFER_LEN 80 /* Max. title length */ /* -------------------- - w95_setapptitle - -------------------- */ /* Set the application title, e.g. "MS-DOS Prompt" -> "MS-DOS Prompt - MyApp". This returns 1 on success, 0 on failure. */ int w95_setapptitle (char *apptitle) { __dpmi_regs r; /* Registers for function call */ int segment, selector; /* Allocated memory's segment, selector */ int paras; /* No. paragraphs to allocate */ /* Check the title isn't too long */ if ((strlen(apptitle) + 1) > APP_TITLE_BUFFER_LEN) return(0); /* Allocate some DOS memory */ paras = (APP_TITLE_BUFFER_LEN + 15) >> 4; segment = __dpmi_allocate_dos_memory(paras, &selector); if (segment == -1) return(0); /* Put the title in it */ movedata(_my_ds(), (int) apptitle, selector, 0, strlen(apptitle) + 1); /* Set up the registers - nuke DX as part of this; set AX to set the app title */ memset (&r, 0, sizeof(r)); r.x.ax = 0x168E; r.x.dx = 0x0000; r.x.es = segment; r.x.di = 0; /* Interrupt */ __dpmi_int (0x2F, &r); /* Free the memory */ __dpmi_free_dos_memory(selector); /* Return result - AX contain 1 on success, 0 on failure */ return(r.x.ax); } # endif # endif /* OVLB */ #endif /* MSDOS */ slashem-0.0.7E7F3/sys/msdos/schema2.BC0000664000076400007640000001533210545462317015353 0ustar aliali/* SCCS Id: @(#)schema2.BC 3.4 1999/10/28 */ /* Copyright (c) Yitzhak Sapir, 1999 */ /* */ /* NetHack Overlay Schema */ /* Small Root footprint, with extended memory available for caching. */ /* Almost everything is overlaid. */ /* */ -zCallmain_0 -zAOVLY -zCOVL1 -zCallmain_1 -zAOVLY -zCOVL2 -zCallmain_b -zAOVLY -zCOVL3 -zCalloc_o -zCapply_0 -zAOVLY -zCOVL4 -zCapply_1 -zAOVLY -zCOVL5 -zCapply_b -zAOVLY -zCOVL6 -zCartifact_0 -zAOVLY -zCOVL7 -zCartifact_1 -zAOVLY -zCOVL8 -zCartifact_b -zAOVLY -zCOVL9 -zCattrib_0 -zAOVLY -zCOVL10 -zCattrib_1 -zAOVLY -zCOVL11 -zCattrib_2 -zAOVLY -zCOVL12 -zCattrib_b -zAOVLY -zCOVL13 -zCball_o -zAOVLY -zCOVL14 -zCbones_o -zAOVLY -zCOVL15 -zCbotl_0 -zAOVLY -zCOVL16 -zCbotl_1 -zAOVLY -zCOVL17 -zCbotl_b -zAOVLY -zCOVL18 -zCcmd_0 -zAOVLY -zCOVL19 -zCcmd_1 -zAOVLY -zCOVL20 -zCcmd_b -zAOVLY -zCOVL21 -zCdbridge_0 -zAOVLY -zCOVL22 -zCdbridge_1 -zAOVLY -zCOVL23 -zCdbridge_b -zAOVLY -zCOVL24 -zCdecl_o -zAOVLY -zCOVL25 -zCdetect_o -zAOVLY -zCOVL26 -zCdig_o -zAOVLY -zCOVL27 -zCdisplay_o -zAOVLY -zCOVL28 -zCdlb_o -zAOVLY -zCOVL29 -zCdo_0 -zAOVLY -zCOVL30 -zCdo_1 -zAOVLY -zCOVL31 -zCdo_2 -zAOVLY -zCOVL32 -zCdo_3 -zAOVLY -zCOVL33 -zCdo_b -zAOVLY -zCOVL34 -zCdo_name_0 -zAOVLY -zCOVL35 -zCdo_name_2 -zAOVLY -zCOVL36 -zCdo_name_b -zAOVLY -zCOVL37 -zCdo_wear_0 -zAOVLY -zCOVL38 -zCdo_wear_1 -zAOVLY -zCOVL39 -zCdo_wear_2 -zAOVLY -zCOVL40 -zCdo_wear_b -zAOVLY -zCOVL41 -zCdog_1 -zAOVLY -zCOVL42 -zCdog_2 -zAOVLY -zCOVL43 -zCdog_b -zAOVLY -zCOVL44 -zCdogmove_0 -zAOVLY -zCOVL45 -zCdogmove_b -zAOVLY -zCOVL46 -zCdokick_o -zAOVLY -zCOVL47 -zCdothrow_o -zAOVLY -zCOVL48 -zCdrawing_o -zAOVLY -zCOVL49 -zCdungeon_0 -zAOVLY -zCOVL50 -zCdungeon_1 -zAOVLY -zCOVL51 -zCeat_0 -zAOVLY -zCOVL52 -zCeat_1 -zAOVLY -zCOVL53 -zCeat_b -zAOVLY -zCOVL54 -zCend_o -zAOVLY -zCOVL55 -zCengrave_0 -zAOVLY -zCOVL56 -zCengrave_1 -zAOVLY -zCOVL57 -zCengrave_2 -zAOVLY -zCOVL58 -zCengrave_b -zAOVLY -zCOVL59 -zCexper_o -zAOVLY -zCOVL60 -zCexplode_0 -zAOVLY -zCOVL61 -zCexplode_1 -zAOVLY -zCOVL62 -zCextralev_o -zAOVLY -zCOVL63 -zCfiles_o -zAOVLY -zCOVL64 -zCfountain_o -zAOVLY -zCOVL65 -zCgetline_1 -zAOVLY -zCOVL66 -zCgetline_2 -zAOVLY -zCOVL67 -zChack_1 -zAOVLY -zCOVL68 -zChack_2 -zAOVLY -zCOVL69 -zChack_3 -zChack_b -zAOVLY -zCOVL70 -zChacklib_0 -zAOVLY -zCOVL71 -zChacklib_1 -zAOVLY -zCOVL72 -zChacklib_2 -zAOVLY -zCOVL73 -zChacklib_b -zAOVLY -zCOVL74 -zCinvent_0 -zAOVLY -zCOVL75 -zCinvent_1 -zAOVLY -zCOVL76 -zCinvent_2 -zAOVLY -zCOVL77 -zCinvent_3 -zAOVLY -zCOVL78 -zCinvent_b -zAOVLY -zCOVL79 -zClight_3 -zAOVLY -zCOVL80 -zClock_0 -zAOVLY -zCOVL81 -zClock_b -zAOVLY -zCOVL82 -zCmail_0 -zAOVLY -zCOVL82 -zCmail_b -zAOVLY -zCOVL83 -zCmakemon_0 -zAOVLY -zCOVL84 -zCmakemon_1 -zAOVLY -zCOVL85 -zCmakemon_2 -zAOVLY -zCOVL86 -zCmakemon_b -zAOVLY -zCOVL87 -zCmcastu_0 -zAOVLY -zCOVL88 -zCmcastu_b -zAOVLY -zCOVL89 -zCmhitm_0 -zAOVLY -zCOVL90 -zCmhitm_b -zAOVLY -zCOVL91 -zCmhitu_0 -zAOVLY -zCOVL92 -zCmhitu_1 -zAOVLY -zCOVL93 -zCmhitu_b -zAOVLY -zCOVL94 -zCminion_o -zAOVLY -zCOVL95 -zCmklev_o -zAOVLY -zCOVL96 -zCmkmap_o -zAOVLY -zCOVL97 -zCmkmaze_o -zAOVLY -zCOVL98 -zCmkobj_0 -zAOVLY -zCOVL99 -zCmkobj_1 -zAOVLY -zCOVL100 -zCmkobj_b -zAOVLY -zCOVL101 -zCmkroom_0 -zAOVLY -zCOVL102 -zCmkroom_b -zAOVLY -zCOVL103 -zCmon_0 -zAOVLY -zCOVL104 -zCmon_1 -zAOVLY -zCOVL105 -zCmon_2 -zAOVLY -zCOVL106 -zCmon_b -zAOVLY -zCOVL107 -zCmondata_0 -zAOVLY -zCOVL108 -zCmondata_1 -zAOVLY -zCOVL109 -zCmondata_2 -zAOVLY -zCOVL110 -zCmondata_b -zAOVLY -zCOVL111 -zCmonmove_0 -zAOVLY -zCOVL112 -zCmonmove_1 -zAOVLY -zCOVL113 -zCmonmove_2 -zAOVLY -zCOVL114 -zCmonmove_b -zAOVLY -zCOVL115 -zCmonst_o -zAOVLY -zCOVL116 -zCmonstr_o -zAOVLY -zCOVL117 -zCmplayer_o -zAOVLY -zCOVL118 -zCmsdos_0 -zAOVLY -zCOVL119 -zCmsdos_b -zAOVLY -zCOVL120 -zCmthrowu_0 -zAOVLY -zCOVL121 -zCmthrowu_1 -zAOVLY -zCOVL122 -zCmthrowu_b -zAOVLY -zCOVL123 -zCmuse_o -zAOVLY -zCOVL124 -zCmusic_o -zAOVLY -zCOVL125 -zCo_init_o -zAOVLY -zCOVL126 -zCobjects_o -zAOVLY -zCOVL127 -zCobjnam_0 -zAOVLY -zCOVL128 -zCobjnam_1 -zAOVLY -zCOVL129 -zCobjnam_b -zAOVLY -zCOVL130 -zCoptions_o -zAOVLY -zCOVL131 -zCovlinit_o -zCpager_o -zAOVLY -zCOVL132 -zCpckeys_o -zAOVLY -zCOVL119 -zCpcmain_0 -zCpcmain_1 -zAOVLY -zCOVL133 -zCpcmain_b -zAOVLY -zCOVL134 -zCpctiles_0 -zCpctiles_b -zCpcunix_b -zAOVLY -zCOVL135 -zCpickup_o -zAOVLY -zCOVL136 -zCpline_b -zAOVLY -zCOVL137 -zCpolyself_0 -zAOVLY -zCOVL138 -zCpolyself_1 -zAOVLY -zCOVL139 -zCpolyself_b -zAOVLY -zCOVL140 -zCpotion_b -zAOVLY -zCOVL141 -zCpray_o -zAOVLY -zCOVL142 -zCpriest_0 -zAOVLY -zCOVL143 -zCpriest_b -zAOVLY -zCOVL144 -zCquest_o -zAOVLY -zCOVL145 -zCquestpgr_o -zAOVLY -zCOVL146 -zCrandom_o -zAOVLY -zCOVL147 -zCread_b -zAOVLY -zCOVL148 -zCrect_o -zAOVLY -zCOVL149 -zCregion_o -zAOVLY -zCOVL150 -zCrestore_o -zAOVLY -zCOVL151 -zCrip_o -zAOVLY -zCOVL152 -zCrnd_0 -zAOVLY -zCOVL153 -zCrnd_1 -zAOVLY -zCOVL154 -zCrnd_b -zAOVLY -zCOVL155 -zCrole_o -zAOVLY -zCOVL133 -zCrumors_o -zAOVLY -zCOVL156 -zCsave_o -zAOVLY -zCOVL157 -zCshk_0 -zAOVLY -zCOVL158 -zCshk_1 -zAOVLY -zCOVL159 -zCshk_2 -zAOVLY -zCOVL160 -zCshk_3 -zAOVLY -zCOVL161 -zCshk_b -zAOVLY -zCOVL162 -zCshknam_0 -zAOVLY -zCOVL163 -zCshknam_b -zAOVLY -zCOVL164 -zCsit_o -zAOVLY -zCOVL165 -zCsound_o -zCsounds_0 -zAOVLY -zCOVL166 -zCsounds_b -zAOVLY -zCOVL167 -zCsp_lev_o -zAOVLY -zCOVL168 -zCspell_o -zAOVLY -zCOVL169 -zCsteal_0 -zAOVLY -zCOVL170 -zCsteal_1 -zAOVLY -zCOVL171 -zCsteal_b -zAOVLY -zCOVL172 -zCsteed_o -zAOVLY -zCOVL173 -zCsys_o -zAOVLY -zCOVL174 -zCteleport_o -zAOVLY -zCOVL175 -zCtermcap_0 -zAOVLY -zCOVL176 -zCtermcap_1 -zAOVLY -zCOVL177 -zCtermcap_b -zAOVLY -zCOVL178 -zCtile_o -zCtimeout_0 -zAOVLY -zCOVL179 -zCtimeout_1 -zAOVLY -zCOVL180 -zCtimeout_b -zAOVLY -zCOVL181 -zCtopl_1 -zAOVLY -zCOVL182 -zCtopl_2 -zAOVLY -zCOVL183 -zCtopl_b -zAOVLY -zCOVL184 -zCtopten_o -zAOVLY -zCOVL185 -zCtrack_0 -zAOVLY -zCOVL186 -zCtrack_1 -zAOVLY -zCOVL187 -zCtrack_b -zAOVLY -zCOVL188 -zCtrap_0 -zAOVLY -zCOVL189 -zCtrap_1 -zAOVLY -zCOVL190 -zCtrap_2 -zAOVLY -zCOVL191 -zCtrap_3 -zAOVLY -zCOVL192 -zCtrap_b -zAOVLY -zCOVL193 -zCtty_o -zAOVLY -zCOVL194 -zCu_init_o -zAOVLY -zCOVL195 -zCuhitm_o -zAOVLY -zCOVL196 -zCvault_0 -zAOVLY -zCOVL197 -zCvault_b -zAOVLY -zCOVL198 -zCversion_o -zAOVLY -zCOVL199 -zCvideo_0 -zCvideo_1 -zCvideo_b -zCvidtxt_0 -zCvidtxt_b -zCvidvga_0 -zCvidvga_1 -zCvidvga_2 -zAOVLY -zCOVL200 -zCvidvga_b -zCvis_tab_o -zAOVLY -zCOVL201 -zCvision_o -zAOVLY -zCOVL202 -zCweapon_0 -zAOVLY -zCOVL203 -zCweapon_1 -zAOVLY -zCOVL204 -zCweapon_b -zAOVLY -zCOVL205 -zCwere_0 -zAOVLY -zCOVL206 -zCwere_b -zAOVLY -zCOVL207 -zCwield_o -zAOVLY -zCOVL208 -zCwindows_o -zAOVLY -zCOVL209 -zCwintty_o -zAOVLY -zCOVL210 -zCwizard_0 -zAOVLY -zCOVL211 -zCwizard_b -zAOVLY -zCOVL212 -zCworm_o -zAOVLY -zCOVL213 -zCworn_o -zAOVLY -zCOVL173 -zCwrite_o -zAOVLY -zCOVL214 -zCzap_0 -zAOVLY -zCOVL215 -zCzap_1 -zAOVLY -zCOVL216 -zCzap_2 -zAOVLY -zCOVL217 -zCzap_3 -zAOVLY -zCOVL218 -zCzap_b -zAOVLY -zCOVL219 slashem-0.0.7E7F3/sys/msdos/ovlinit.c0000664000076400007640000001020610545462317015446 0ustar aliali/* 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. */ #include "hack.h" #include #include #ifdef _MSC_VER #define RESERVED_PARAGRAPHS 5120 /* leave 80K for malloc and inits */ /* subject to change before release */ /* * memavail() Returns the amount of RAM available (in paragraphs which are 16 * bytes) - the amount to be reserved for heap allocations. * */ unsigned memavail(minovl) unsigned minovl; /* minimum size of overlay heap */ { unsigned available; unsigned farparaavail; unsigned tmp; /* * _dos_allocmem will return the maximum block size available. * It uses DOS (int 21h) service 0x48. */ _dos_allocmem(0xFFFF, &farparaavail); available = farparaavail - RESERVED_PARAGRAPHS; tmp = RESERVED_PARAGRAPHS + minovl; if (farparaavail < tmp) { panic("Not enough free RAM to begin a game of NetHack (%ld bytes)", (long)((long)tmp * 16L)); } return available; } #endif /*_MSC_VER*/ #ifdef __BORLANDC__ #define RSRVD_MALLOC 65 * 1024L /* malloc() calls use about 65K */ #define RSRVD_CRTL 50 * 1024L /* C runtime library uses 50K */ #define RSRVD_TOTAL 115 * 1024L /* reserved for use in malloc() */ /* as well as by C runtime library */ /* routines which allocate memory */ /* after this routine runs. */ #define MIN_OVRBUF 30 * 1024L /* Overlay buffer gets minimum of */ #define MAX_OVRBUF 200 * 1024L /* 30K and maximum of 200K. */ #define RESIZE_OVL #ifdef RESIZE_OVL extern unsigned _ovrbuffer = 0; /* Use default size initially */ unsigned appFail = 0; /* Fail flag if not enough RAM */ unsigned memAlloc = 0; unsigned long ProgramSize; unsigned long runAlloc; unsigned far *mem_top; unsigned total; signed long tmpbuffer; int emsstatus; int xmsstatus; void NDECL(_resizeOvrBuffer); void _resizeOvrBuffer() { mem_top = (unsigned far *) MK_FP( _psp, 0x02 ); total = *mem_top - _psp; ProgramSize = * (unsigned far *) MK_FP( _psp - 1, 0x03 ); tmpbuffer = total - ProgramSize - RSRVD_TOTAL / 16; memAlloc = min (MAX_OVRBUF / 16, tmpbuffer); if (tmpbuffer >= MIN_OVRBUF / 16) _ovrbuffer = memAlloc; else { _ovrbuffer = 1; appFail = 1; }; /* * Remember, when inside this code, nothing has been setup on * the system, so do NOT call any RTL functions for I/O or * anything else that might rely on a startup function. This * includes accessing any global objects as their constructors * have not been called yet. */ } #pragma startup _resizeOvrBuffer 0 /* Put function in table */ void startup () { if (appFail) { printf ("NetHack fits in memory, but it cannot allocate memory"); printf (" for the overlay buffer\nand the runtime functions. "); printf ("Please free up just %ld more bytes.", (long)(MIN_OVRBUF - tmpbuffer * 16L)); exit (-1); } else { /* Now try to use expanded memory for the overlay manager */ /* If that doesn't work, we revert to extended memory */ emsstatus = _OvrInitEms (0, 0, 0); #ifdef RECOGNIZE_XMS xmsstatus = (emsstatus) ? _OvrInitExt (0, 0) : -1; #endif } } void show_borlandc_stats(win) winid win; { char buf[BUFSZ]; putstr(win, 0, ""); putstr(win, 0, ""); putstr(win, 0, "Memory usage stats"); putstr(win, 0, ""); putstr(win, 0, ""); Sprintf (buf, "Overlay buffer memory allocation: %ld bytes.", memAlloc * 16L); putstr(win, 0, buf); Sprintf (buf, "_ovrbuffer = %u.", _ovrbuffer); putstr(win, 0, buf); Sprintf (buf, "Startup memory usage: 0x%X", ProgramSize); putstr(win, 0, buf); runAlloc = * (unsigned far *) MK_FP( _psp - 1, 0x03); Sprintf (buf, "Current memory usage: 0x%X", runAlloc); putstr(win, 0, buf); if (emsstatus) Sprintf (buf, "EMS search failed (%d).", emsstatus); else Sprintf (buf, "EMS search successful."); putstr(win, 0, buf); #ifdef RECOGNIZE_XMS if (xmsstatus) Sprintf (buf, "XMS search failed (%d).", xmsstatus); else Sprintf (buf, "XMS search successful."); putstr(win, 0, buf); #endif } #endif /* #ifdef RESIZE_OVL */ #endif /* #ifdef __BORLANDC__ */ /*ovlinit.c*/ slashem-0.0.7E7F3/sys/msdos/nhico.uu0000664000076400007640000000235710545462317015301 0ustar alialisection 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 slashem-0.0.7E7F3/sys/msdos/2xsai.h0000664000076400007640000000272410545462317015023 0ustar aliali/* * A basic header for the 2xSaI routines */ /* * Some basic declarations */ #define false 0 #define true 1 #define bool int #define STATIC static #define uint32 unsigned long #define uint16 unsigned short #define uint8 unsigned char extern void Super2xSaI(uint8 *srcPtr, uint32 srcPitch, uint8 *deltaPtr, uint8 *dstPtr, uint32 dstPitch, int width, int height); extern void _2xSaI(uint8 *srcPtr, uint32 srcPitch, uint8 *deltaPtr, uint8 *dstPtr, uint32 dstPitch, int width, int height); extern void SuperEagle(uint8 *srcPtr, uint32 srcPitch, uint8 *deltaPtr, uint8 *dstPtr, uint32 dstPitch, int width, int height); #if 0 extern void Scale_2xSaI(uint8 *srcPtr, uint32 srcPitch, uint8 *deltaPtr, BITMAP *dstBitmap, int width, int height); #endif /* * A couple handy macros * Note that these will be broken in a future version if the deltaPtr ends up * ever being changed * * Note that the dest bitmap should be twice the width and height of the source */ #define Super2xSaiBlit(src, dest) Super2xSaI((uint8 *) src->dat, src->w*2, \ (uint8 *)src->dat, \ (uint8 *)dest->dat, dest->w*2, src->w, src->h) #define SuperEagleBlit(src, dest) SuperEagle((uint8 *) src->dat, src->w*2, \ (uint8 *)src->dat, \ (uint8 *)dest->dat, dest->w*2, src->w, src->h) #define _2xSaiBlit(src, dest) _2xSaI((uint8 *) src->dat, src->w*2, \ (uint8 *)src->dat, \ (uint8 *)dest->dat, dest->w*2, src->w, src->h) slashem-0.0.7E7F3/sys/msdos/txt2bmp.c0000664000076400007640000003305210545462317015366 0ustar aliali/* SCCS Id: @(#)txt2bmp.c 3.3 95/01/26 */ /* Copyright (c) NetHack PC Development Team 1993, 1994, 1995 */ /* NetHack may be freely redistributed. See license for details. */ /* * This creates a txt2bmp.exe * * txt2bmp.exe -i generates 'index' * txt2bmp.exe -h generates 'allegfx.h' THIS FILE IS OBSOLETE * txt2bmp.exe -fXX generates all the *.bmp * txt2bmp.exe -bXX generates slamXX.bmp * txt2bmp.exe -c txtname bmpname converts txtname to a single bmpname * txt2bmp.exe -p bmpname changes the bitmap to a 256 color bmp with * the pink as the first color * * Edit History: * * Initial Creation K.Youngblood ??/??/?? * added 32x32 text tile support W.Cheung 00/06/19 * added direct write to files W.Cheung 00/06/21 * */ #include #include "hack.h" #include "pcvideo.h" #include "tile.h" #include "pctiles.h" #include #include #ifndef MONITOR_HEAP #include #endif #include extern char *FDECL(tilename, (int, int)); #define Fprintf (void) fprintf #define Fclose (void) fclose static int num_colors; static pixel pixels[MAX_TILE_Y][MAX_TILE_X]; static BITMAP *bigtile_bmp; static struct tibhdr_struct tibheader; /* [WAC] Use the 32x32x262 color tiles */ static const char *tilefiles3d[] = { "../win/share/mon3d.txt", "../win/share/obj3d.txt", "../win/share/oth3d.txt"}, *tilefiles32[] = { "../win/share/mon32.txt", "../win/share/obj32.txt", "../win/share/oth32.txt"}, *tilefiles16[] = { "../win/share/monsters.txt", "../win/share/objects.txt", "../win/share/other.txt"}; static const char *Dont_Edit_Code = "/* This source file is generated by 'txt2bmp'. Do not edit. */\n", *Dont_Edit_Index = "# This index file was generated by 'txt2bmp'.\n"; static int tilecount; static int filenum; static int paletteflag; #define TRANS_COLOR MASK_COLOR_24 static const char *bigtile_file3d = "../src/slam3D.bmp", *bigtile_file32 = "../src/slam32.bmp", *bigtile_file16 = "../src/slam16.bmp", *index_file = "../src/index", *allegfx_file = "../include/allegfx.h"; /* #define FINAL_COLORDEPTH_8_BPP */ /* Currently interpolation is OFF */ /* Should handle all sizes tile files now */ void make_bitmap(pixels, tilecount, trans, filename, make_big) pixel (*pixels)[MAX_TILE_X]; int tilecount; int trans; char *filename; boolean make_big; { int i, j, x, y; long color, color2; char cmd[60]; BITMAP *tilebmp; tilebmp = create_bitmap(tile_x, tile_y); color2 = 0L; color2 |= 71; color2 |= (108) << 8; color2 |= (108) << 16; /* load the origional tile */ for (j = 0; j < tile_y; j++) { for (i = 0; i < tile_x; i++) { color = 0L; color |= (pixels[j][i].r & 0x0000ff); color |= (pixels[j][i].g & 0x0000ff) << 8; color |= (pixels[j][i].b & 0x0000ff) << 16; putpixel(tilebmp, i, j, color); } } #if 0 drawing_mode(DRAW_MODE_TRANS, tilebmp, 0, 0); set_trans_blender(255, 255, 255, 127); for(y = 0; y < tile_y; y++) for(x = 1; x < tile_x; x += 2) { color=getpixel(tilebmp, min(x+1,tile_x - 2),y); putpixel(tilebmp, x, y, color); } /* interpolate horizontal lines */ for(x = 0; x < tile_x; x++) for(y = 1; y < tile_y; y += 2) { color = getpixel(tilebmp, x, min(y+1,tile_y - 2)); putpixel(tilebmp, x, y, color); } #endif drawing_mode(DRAW_MODE_SOLID, tilebmp, 0, 0); if(trans) { /* WAC probably slower, but more accurate */ for (x = 0; x < tile_x; x++) for (y = 0; y < tile_y; y++) if(getpixel(tilebmp, x, y) == color2) putpixel(tilebmp,x,y, TRANS_COLOR); #if 0 if(getpixel(tilebmp, 0, 0) == color2) floodfill(tilebmp,0,0, TRANS_COLOR); if(getpixel(tilebmp, 0, 31) == color2) floodfill(tilebmp,0,31, TRANS_COLOR); if(getpixel(tilebmp, 31, 0) == color2) floodfill(tilebmp,31,0, TRANS_COLOR); if(getpixel(tilebmp, 31, 31) == color2) floodfill(tilebmp,31,31, TRANS_COLOR); #endif } if (!make_big) { save_bitmap(filename, tilebmp, 0); } else { int col = (int)(tilecount % TILES_PER_ROW); int row = (int)(tilecount / TILES_PER_ROW); #ifdef DEBUG Fprintf(stderr, "col: %i row: %i\n", col, row); #endif blit(tilebmp, bigtile_bmp, 0, 0, col * tile_x, row * tile_y, tile_x, tile_y); } destroy_bitmap(tilebmp); } int main(argc, argv) int argc; char *argv[]; { int i; struct tm *newtime; time_t aclock; char *paletteptr; char cmd2[60]; char filename[60]; char util_mode; FILE *ofp; /* Output for -i, -h */ const char **tilefiles; char bigtile_file[BUFSZ]; boolean trans_background = FALSE; /* All operations assume 24 bit internal files */ set_color_depth(24); if (argc < 2) { Fprintf(stderr, "Bad arg count (%d).\n", argc-1); (void) fflush(stderr); exit(EXIT_FAILURE); } util_mode = argv[1][1]; if (util_mode == 'I') util_mode = 'i'; if (util_mode == 'H') util_mode = 'h'; if (util_mode == 'F') util_mode = 'f'; if (util_mode == 'B') util_mode = 'b'; if (util_mode == 'C') util_mode = 'c'; if (util_mode != 'i' && util_mode != 'h' && util_mode != 'f' && util_mode != 'b' && util_mode != 'c' && util_mode != 'p') { Fprintf(stderr, "Unknown option '-%c'.\n Use -i, -h, -f, -b, -c or -p.\n", util_mode); (void) fflush(stderr); exit(EXIT_FAILURE); } if (util_mode == 'p') { if (argc != 3) { Fprintf(stderr, "Bad arg count (%d).\n", argc-1); (void) fflush(stderr); exit(EXIT_FAILURE); } else { #ifdef FINAL_COLORDEPTH_8_BPP PALETTE tmp_pal; BITMAP* tmp_bmp; char rsvd[256]; int i; Strcpy(bigtile_file, argv[2]); bigtile_bmp = load_bitmap(bigtile_file,tmp_pal); if (!bigtile_bmp) { Fprintf(stderr, "Unable to load %s.\n", argv[2]); (void) fflush(stderr); exit(EXIT_FAILURE); } tmp_pal[0].r = tmp_pal[0].b = 63; tmp_pal[0].g = 0; rsvd[0] = 1; for (i = 1; i < 256; i++) rsvd[i] = 0; generate_optimized_palette(bigtile_bmp, tmp_pal, rsvd); select_palette(tmp_pal); tmp_bmp = create_bitmap_ex(8, bigtile_bmp->w, bigtile_bmp->h); blit(bigtile_bmp, tmp_bmp, 0, 0, 0, 0,bigtile_bmp->w, bigtile_bmp->h); save_bitmap(bigtile_file, tmp_bmp, tmp_pal); destroy_bitmap(bigtile_bmp); destroy_bitmap(tmp_bmp); #endif exit(EXIT_SUCCESS); } } if ((util_mode == 'c' && argc != 4) || (util_mode != 'c' && argc != 2)) { Fprintf(stderr, "Bad arg count (%d).\n", argc-1); (void) fflush(stderr); exit(EXIT_FAILURE); } if (util_mode != 'c') { if (argv[1][2] == '1' && argv[1][3] == '6') { Fprintf(stderr, "Using 16x16 text tile files\n"); (void) fflush(stderr); tilefiles = tilefiles16; Strcpy(bigtile_file, bigtile_file16); } else if (argv[1][2] == '3' && (argv[1][3] == 'D' || argv[1][3] == 'd')) { Fprintf(stderr, "Using 48x64 text tile files\n"); (void) fflush(stderr); tilefiles = tilefiles3d; Strcpy(bigtile_file, bigtile_file3d); trans_background = TRUE; } else { /* Default mode is 32 */ Fprintf(stderr, "Using 32x32 text tile files\n"); (void) fflush(stderr); tilefiles = tilefiles32; Strcpy(bigtile_file, bigtile_file32); } } else { Strcpy(bigtile_file, argv[3]); } time(&aclock); newtime = localtime(&aclock); tilecount = 0; paletteflag = 0; filenum = 0; /* Open file (if needed) */ if (util_mode == 'i') { if (!(ofp = fopen(index_file, WRTMODE))) { perror(index_file); exit(EXIT_FAILURE); } Fprintf(ofp,Dont_Edit_Index); } else if (util_mode == 'h') { if (!(ofp = fopen(allegfx_file, WRTMODE))) { perror(allegfx_file); exit(EXIT_FAILURE); } Fprintf(ofp,"/*\tSCCS Id: @(#)allegfx.h\t3.2\t96/05/17 */\n\n"); Fprintf(ofp,Dont_Edit_Code); Fprintf(ofp,"/*\tNOTE: This file is completely obselete! */\n" "/*\tI have no idea why you made it */\n\n"); } else if (util_mode == 'b' || util_mode == 'c') { bigtile_bmp = NULL; } while (filenum < 3) { int index = 0; boolean trans_mode = ((filenum < 2) || trans_background); if (util_mode != 'c') { if (!fopen_text_file(tilefiles[filenum], RDTMODE)) { Fprintf(stderr, "Cannot find file '%s'.\n", tilefiles[filenum]); exit(EXIT_FAILURE); } } else if (!fopen_text_file(argv[2], RDTMODE)) { Fprintf(stderr, "Cannot find file '%s'.\n", tilefiles[filenum]); exit(EXIT_FAILURE); } num_colors = colorsinmap; if (num_colors > MAXCOLORMAPSIZE) { Fprintf(stderr, "too many colors (%d)\n", num_colors); exit(EXIT_FAILURE); } if (!paletteflag) { paletteptr = tibheader.palette; for (i = 0; i < num_colors; i++) { *paletteptr++ = ColorMap[CM_RED][i], *paletteptr++ = ColorMap[CM_GREEN][i], *paletteptr++ = ColorMap[CM_BLUE][i]; } paletteflag++; } if ((util_mode == 'b' || util_mode == 'c') && !bigtile_bmp) { /* Only make this once */ bigtile_bmp = create_bitmap(tile_x * TILES_PER_ROW, tile_y * TILES_PER_COL); } while (read_text_tile(pixels)) { sprintf(filename, "%c%03d%s", (!filenum) ? 'm' : (filenum == 1) ? 'o' : 'e', index, ".bmp"); if (util_mode == 'i') { Fprintf(ofp, "%04d (%s) : %s\n", tilecount, tilename(filenum+1,index), filename); } else if (util_mode == 'f') { make_bitmap(pixels, tilecount, trans_mode ,filename, FALSE); } else if (util_mode == 'b' || util_mode == 'c') { make_bitmap(pixels, tilecount, trans_mode ,filename, TRUE); } tilecount++; index++; } if (util_mode == 'h') switch(filenum) { case 0: Fprintf(ofp, "#define NUMBER_OF_MONS %d\n", tilecount); break; case 1: Fprintf(ofp, "#define NUMBER_OF_OBJS %d\n", tilecount); break; case 2: Fprintf(ofp, "#define NUMBER_OF_TILES %d\n", tilecount); break; } if (util_mode == 'f') Fprintf(stderr, "%d tiles processed from %s\n", index, tilefiles[filenum]); (void) fclose_text_file(); ++filenum; /* Only process 1 file */ if (util_mode == 'c') break; } /* Close file */ if ((util_mode == 'i') || (util_mode == 'h')) Fclose(ofp); else if (util_mode == 'f') Fprintf(stderr, "Total of %d bmp tiles written.\n", tilecount); else if (util_mode == 'b' || util_mode == 'c') { PALETTE tmp_pal; #ifdef FINAL_COLORDEPTH_8_BPP BITMAP *tmp_bmp; char rsvd[256]; int i; tmp_pal[0].r = tmp_pal[0].b = 63; tmp_pal[0].g = 0; rsvd[0] = 1; for (i = 1; i < 256; i++) rsvd[i] = 0; generate_optimized_palette(bigtile_bmp, tmp_pal, rsvd); select_palette(tmp_pal); tmp_bmp = create_bitmap_ex(8, TILES_PER_ROW * tile_x, (int)(tile_y * (1 + (tilecount / TILES_PER_ROW)))); blit(bigtile_bmp, tmp_bmp, 0, 0, 0, 0,bigtile_bmp->w, bigtile_bmp->h); save_bitmap(bigtile_file, tmp_bmp, tmp_pal); destroy_bitmap(bigtile_bmp); destroy_bitmap(tmp_bmp); #else save_bitmap(bigtile_file, bigtile_bmp, tmp_pal); destroy_bitmap(bigtile_bmp); #endif } exit(EXIT_SUCCESS); /*NOTREACHED*/ return 0; } slashem-0.0.7E7F3/sys/msdos/alleg.cnf0000664000076400007640000000625610545462317015404 0ustar aliali# X and Y resolution, and color depth(in bits) # minimum of 512x384x15bit width = 640 height = 480 colordepth = 16 # If you can't get AllegroHack to start, try changing this to specify # how AllegroHack should try to cummunicate with your video card. # # Valid choices are: (not case sensitive) # VESA1 = VESA 1.0 # VESA2L = VESA 2.0 linear # VESA2B = VESA 2.0 banked # VESA3 = VESA 3.0 # VBEAF = VBE/AF # any other value will use autodetection videomode = auto # This sets the speed of AllegroHack's animations, it's is in vsyncs/frame, # so the animation speed will change dependant on your refresh rate. # IE: with "fxdelay = 1" # 60hz = 60 frames/second # 75hz = 75 frames/second # # Set it to 0 to play animations as fast as possible with no vsync. # # this doesn't seem to work on some systems, I'm working on a fix # fxdelay = 1 # Controls how smooth the screen scrolling is # # You can also use the smoothing setting to control the scrolling speed # # 0 - no smoothing (fastest) # 1 - medium smoothing # 2 - maximum smoothing (slowest) smoothing = 2 # Heads-up-display # # This controls the display in the lower-right hand corner of the screen. # # Can be set to either # equipment - shows your curent weapons/armors, or # map - shows a map of the level showing your position # as an X and stairs as arrows pointing up or down. # # Other settings turn head-up-display off. HUD = Map # Text Colors # # text - normal text # hilite - emphasized text # status - status bar text # #black 0 invisible 8 (not advised) #red 1 orange 9 #green 2 bright green 10 #brown 3 yellow 11 #blue 4 bright blue 12 #magenta 5 bright magenta 13 #cyan 6 bright cyan 14 #gray 7 white 15 # text = 2 hilite = 10 status = 12 # Tile Files # # bigtile_file - name of file containing all the tiles # the game will automatically look for slam3d.bmp, slam32.bmp and slam16.bmp # in that order and use the first one found # You can use this to override the default ordering or specify a custom tileset #bigtile_file = slam3D.bmp #bigtile_file = slam32.bmp #bigtile_file = slam16.bmp # tile_width - width of tile displayed (tiles will be stretched to this size) # tile_height - height of tile displayed (tiles will be stretched to this size) # # Please note that for 3D tiles to be autodetected properly, the width:height ratio # must remain 3:4 # Or, you can set the draw_3Dtiles below to force 3D tile drawing #tile_width = #tile_height = # interpolate - set this to 1 to activate Kreed's 2xSaI interpolation and # scaling routines. # A big thanks to Kreed for making the source code accessible :) # # Valid values are: # 1 - the 2xSaI engine # 2 - the SuperEagle engine # 3 - the Super2xSaI engine #interpolate = 3 # draw_3Dtiles - set this to Y or 1 to force 3D tile drawing # use this if you rescale the 3D tiles to an odd width:height ratio # - set this to N or 0 to force normal tile drawing # - anything else sets for autodetection (default) # #draw_3Dtiles = Y slashem-0.0.7E7F3/sys/msdos/Makefile.BC0000664000076400007640000015317010545462317015551 0ustar aliali# 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. # Additionally, you should run this makefile with the -N # Microsoft Compatibility option. # # This Makefile is for use with Borland C++ version 3.1 and 4.5, but might # also work with more up to date versions. # # This Makefile is specific to Borland's MAKE which is supplied with the # compiler. It supports only one overlay management facility - VROOMM. # (This Makefile won't work with make45l or NDMAKE) # # Game Installation Variables. # NOTE: Make sure GAMEDIR exists before nmake is started. # GAME = NetHack GAMEDIR = ..\binary # # # Directories # DAT = ..\dat DOC = ..\doc INCL = ..\include SRC = ..\src OBJ = o MSYS = ..\sys\msdos SYS = ..\sys\share UTIL = ..\util WTTY = ..\win\tty WSHR = ..\win\share # # Compiler File Info. # ($(MAKE) macro is often predefined, so we use $(MAKEBIN) instead.) # CC = bcc # Compiler LINK = tlink # Linker ASM = tasm # Assembler (not currently needed for BC) MAKEBIN = make UUDECODE = uudecode # Unix style uudecoder #BCTOP = c:\borlandc # main Borland C++ directory BCTOP = c:\bc31 # # Yacc/Lex ... if you got 'em. # # If you have yacc and lex programs (or work-alike such as bison # and flex), comment out the upper two lines below, and uncomment # the lower two. # # On Borland C++, the newest versions of flex and bison provide # problems when run from MAKE. # DO_YACC = YACC_MSG DO_LEX = LEX_MSG #DO_YACC = YACC_ACT #DO_LEX = LEX_ACT # # - Specify your yacc and lex programs (or work-alikes for each) here. # YACC = bison -y #YACC = yacc #YACC = byacc LEX = flex #LEX = lex # # - Specify your flex skeleton file (if needed). # FLEXSKEL = #FLEXSKEL = -Sc:\tools16\flex.ske # # - Your yacc (or work-alike) output files # YTABC = y_tab.c YTABH = y_tab.h #YTABC = ytab.c #YTABH = ytab.h # # - Your lex (or work-alike) output files # LEXYYC = lexyy.c #LEXYYC = lex.yy.c # # Optional high-quality BSD random number generation routines # (see pcconf.h). Set to nothing if not used. # RANDOM = $(OBJ)\random.o #RANDOM = # # If TERMLIB is #defined in the source (in include\pcconf.h), # comment out the upper line and uncomment the lower. Make sure # that TERMLIB contains the full pathname to the termcap library. TERMLIB = #TERMLIB = $(SYS)\termcap.lib # # MEMORY USAGE AND OVERLAYING # # Overlay Schema 1 # # - Minimal extended memory available, lots of 640K base RAM free # Minimize overlay turns. Requires that a minimum of # 607K RAM be free as follows: # 462K Executable load requirement # 115K for malloc() calls # 30K Overlay buffer # 607K Total memory requirement # # Overlay Schema 2 # # - Favor small load size, requires extended memory for bearable performance. # If you have very little base 640K RAM available, but lots of extended # memory for caching overlays, you might try this. (eg. A machine with # lots of TSR's or network drivers). Do not try to set SCHEMA = 2 # without a disk cache and extended memory. # 381K Executable load requirement # 115K for malloc() calls # 30K Overlay buffer # 526K Total memory requirement # # On Borland C++, you have to make a full rebuild of all object modules each # time you change schemas. # SCHEMA = 2 # # OPTIONAL TILE SUPPORT. # # This release of NetHack allows you to build a version of NetHack # that will draw 16x16 color tiles on the display to represent # NetHack maps, objects, monsters, etc. on machines with appropriate # display hardware. Currently the only supported video hardware is # VGA. # # Note: You can build NetHack with tile support and then choose # whether to use it or not at runtime via the NetHack.cnf file option # "video". # TILESUPPORT = Y # # C COMPILER AND LINKER SETTINGS # # For debugging ability, comment out the upper three # macros and uncomment the lower three. You can also # uncomment only either LDFLAGSU or LDFLAGSN if you # want to include debug information only in the utilities # or only in the game file. # On Borland C++, you cannot include debug information for # all the object modules because the linker cannot handle # it. #CDFLAGS = LDFLAGSN = #LDFLAGSU = CDFLAGS = -v -vi # use debug info (compiler) #LDFLAGSN = /v # use debug info (linker - game) LDFLAGSU = /v # use debug info (linker - utilities) # # - Don't warn about unreachable code because flex generates a whole bunch # of unreachable code warnings, which stops the compile process. # CW = -w-rch # # Select whether to use pre-compiled headers or not. # Set PRECOMPHEAD to Y to use pre-compiled headers, set it to anything # else and pre-compiled headers will not be used. # (Pre-compiled headers speed up compiles, but require a bit more # disk space during the build. The pre-compiled headers can be deleted # afterwards via DEL *.PCH if desired). # PRECOMPHEAD = N # # C Compiler Flags # CFLAGS = -c # Uncomment the line below if you want to store all the level files, # help files, etc. in a single library file (recommended). USE_DLB = Y # ######################################################################## ######################################################################## # # Nothing below here should have to be changed. # ######################################################################## ######################################################################## # # Warning: # # Changing anything below here means that you should be *very* # familiar with your compiler's workings, *very* knowledgeable # about the overlay structure and mechanics of NetHack, and *very* # confident in your understanding of Makefiles and Make utilities. # ######################################################################## # # Default Make Procedure # default: $(GAME) # ######################################################################## # Tile preparation # ! IF ("$(TILESUPPORT)"=="Y") TILEGAME = $(OBJ)\tile.o $(OBJ)\pctiles.0 $(OBJ)\pctiles.b # # - VGA Tile Support, uncomment these three lines. # TILEVGA = $(OBJ)\vidvga.0 $(OBJ)\vidvga.1 $(OBJ)\vidvga.2 $(OBJ)\vidvga.b PLANAR_TIB = NetHack1.tib OVERVIEW_TIB = NetHacko.tib # # Leave this line uncommented and unchanged. TILEUTIL = $(TILEGAME) $(TILEVGA) $(UTIL)\tile2bin.exe $(UTIL)\til2bin2.exe \ $(PLANAR_TIB) $(OVERVIEW_TIB) ! ENDIF ! IF ("$(USE_DLB)"=="Y") DLB = nhdat ! ELSE DLB = ! ENDIF # ############################################################################# # # General Overlay Schema Settings # !include schema$(SCHEMA).bc OVLINIT =$(OBJ)\ovlinit.o # ############################################################################# # # C Compiler and Linker Setup Options # (To Maintainer; modify only if absolutely necessary) # BCINCL = $(BCTOP)\include # include directory for main BC headers BCLIB = $(BCTOP)\lib # library directory for main BC libraries BCCFG = nethack.cfg # name of the nethack configuration file # # Model # MODEL = h # # - Optional C library specifier for those with non-standard # libraries or a multiple-target library setup. # CLIB = # # Borland C++ libraries # BCOVL = $(BCLIB)\OVERLAY BCMDL = $(BCLIB)\C$(MODEL) # # Compiler Options # CNOLNK = -c # just generate .OBJ CPCHUSE = -Hu # use precompiled headers CPCHGEN = -H # generate precompiled headers CPCHNAM = -H= # set the name of the precompiled header file CPCHEXT = .PCH # precompiled header extension CDEFINE = -D # define a macro CSTKSZ = -DSTKSIZ= # set stack size CCSNAM = -zC # set the code segment name COBJNAM = -o # name the .OBJ file # # Linker Options # LWCASE = /c # treat case as significant LMAP = /m # create map file LINIT = $(BCLIB)\C0$(MODEL) # initialization object file LOVL = /oOVLY # overlay all needed segments # # Stack Sizes # STKSUTL = 4096 # Utilities Stack Size STKSNRM = 5120 # Normal Stack Size CUSTACK = $(CSTKSZ)$(STKSUTL) # Utilities Stack Set for Compiler CNSTACK = $(CSTKSZ)$(STKSNRM) # Normal Stack Set for Compiler # ######################################################################## # DLB preparation # ! IF ("$(USE_DLB)"=="Y") DLBFLG = $(CDEFINE)DLB ! ELSE DLBFLG = ! ENDIF # ######################################################################## # tile preparation # ! IF ("$(TILESUPPORT)"=="Y") TILFLG = $(CDEFINE)USE_TILES ! ELSE TILFLG = ! ENDIF ############################################################################# # # Overlay switches # COVL0 = $(CDEFINE)OVL0 COVL1 = $(CDEFINE)OVL1 COVL2 = $(CDEFINE)OVL2 COVL3 = $(CDEFINE)OVL3 COVLB = $(CDEFINE)OVLB # # Flags # FLAGOPT = $(DLBFLG) $(TILFLG) # # Precompiled Header Section # #common options (placed in $(BCCFG)) CFLGTOT = $(CDFLAGS) $(CFLAGS) $(FLAGOPT) $(CW) #util builds CFLAGSU = +$(BCCFG) $(CUSTACK) #normal build, no PCH CFLAGSN = +$(BCCFG) $(CNSTACK) #no optimizations CFLAGNO = $(CNOOPT) $(CFLAGSN) ! IF ("$(PRECOMPHEAD)"!="Y") CFLAGCO = $(COVLO) CFLAGUO = $(COVLO) CFLAGC0 = $(COVL0) CFLAGU0 = $(COVL0) CFLAGC1 = $(COVL1) CFLAGU1 = $(COVL1) CFLAGC2 = $(COVL2) CFLAGU2 = $(COVL2) CFLAGC3 = $(COVL3) CFLAGU3 = $(COVL3) CFLAGCB = $(COVLB) CFLAGUB = $(COVLB) PCHO = PCH0 = PCH1 = PCH2 = PCH3 = PCHB = precomp.msg: @echo Not using precompiled headers... ! ELSE # .o files CFLAGUO = $(CPCHUSE) $(CPCHNAM)PHO$(CPCHEXT) $(COVLO) CFLAGCO = $(CPCHGEN) $(CPCHNAM)PHO$(CPCHEXT) $(COVLO) PCHO = PHO$(CPCHEXT) # .0 files CFLAGU0 = $(CPCHUSE) $(CPCHNAM)PH0$(CPCHEXT) $(COVL0) CFLAGC0 = $(CPCHGEN) $(CPCHNAM)PH0$(CPCHEXT) $(COVL0) PCH0 = PH0$(CPCHEXT) # .1 files CFLAGU1 = $(CPCHUSE) $(CPCHNAM)PH1$(CPCHEXT) $(COVL1) CFLAGC1 = $(CPCHGEN) $(CPCHNAM)PH1$(CPCHEXT) $(COVL1) PCH1 = PH1$(CPCHEXT) # .2 files CFLAGU2 = $(CPCHUSE) $(CPCHNAM)PH2$(CPCHEXT) $(COVL2) CFLAGC2 = $(CPCHGEN) $(CPCHNAM)PH2$(CPCHEXT) $(COVL2) PCH2 = PH2$(CPCHEXT) # .3 files CFLAGU3 = $(CPCHUSE) $(CPCHNAM)PH3$(CPCHEXT) $(COVL3) CFLAGC3 = $(CPCHGEN) $(CPCHNAM)PH3$(CPCHEXT) $(COVL3) PCH3 = PH3$(CPCHEXT) # .B files CFLAGUB = $(CPCHUSE) $(CPCHNAM)PHB$(CPCHEXT) $(COVLB) CFLAGCB = $(CPCHGEN) $(CPCHNAM)PHB$(CPCHEXT) $(COVLB) PCHB = PHB$(CPCHEXT) precomp.msg: @echo Using precompiled headers... ! ENDIF FLAGCO = $(CNSTACK) +CFLAGCO.CFG FLAGUO = $(CNSTACK) +CFLAGUO.CFG FLAGC0 = $(CNSTACK) +CFLAGC0.CFG FLAGU0 = $(CNSTACK) +CFLAGU0.CFG FLAGC1 = $(CNSTACK) +CFLAGC1.CFG FLAGU1 = $(CNSTACK) +CFLAGU1.CFG FLAGC2 = $(CNSTACK) +CFLAGC2.CFG FLAGU2 = $(CNSTACK) +CFLAGU2.CFG FLAGC3 = $(CNSTACK) +CFLAGC3.CFG FLAGU3 = $(CNSTACK) +CFLAGU3.CFG FLAGCB = $(CNSTACK) +CFLAGCB.CFG FLAGUB = $(CNSTACK) +CFLAGUB.CFG # End of Pre-compiled header section #=========================================================================== # # Linker options for building various things. # LFLAGSU = $(LDFLAGSU) $(LUSTACK) $(LINIT) LFLAGSN = $(LDFLAGSN) $(LNSTACK) $(LWCASE) $(LMAXSEG) $(INTOVL) $(LMAXALL) \ $(LINFO) $(LINIT) $(LOVL) # # Make Roolz dude. # Due to the inadequacy of some makes these must accord with a # topological sort of the generated-from relation... output on # the left, input on the right. Trust me. # .SUFFIXES: .exe .0 .1 .2 .3 .B .o .til .uu .c .y .l # # Rules for files in src # .c{$(OBJ)}.o: @$(CC) $(FLAGUO) $$($(@B)_o) $(COBJNAM)$@ $< {$(SRC)}.c{$(OBJ)}.o: $(CC) $(FLAGUO) $$($(@B)_o) $(COBJNAM)$@ $< {$(SRC)}.c{$(OBJ)}.0: $(CC) $(FLAGU0) $$($(@B)_0) $(COBJNAM)$@ $< {$(SRC)}.c{$(OBJ)}.1: $(CC) $(FLAGU1) $$($(@B)_1) $(COBJNAM)$@ $< {$(SRC)}.c{$(OBJ)}.2: $(CC) $(FLAGU2) $$($(@B)_2) $(COBJNAM)$@ $< {$(SRC)}.c{$(OBJ)}.3: $(CC) $(FLAGU3) $$($(@B)_3) $(COBJNAM)$@ $< {$(SRC)}.c{$(OBJ)}.B: $(CC) $(FLAGUB) $$($(@B)_b) $(COBJNAM)$@ $< # # Rules for files in sys\share # {$(SYS)}.c{$(OBJ)}.o: $(CC) $(FLAGUO) $$($(@B)_o) $(COBJNAM)$@ $< {$(SYS)}.c{$(OBJ)}.0: $(CC) $(FLAGU0) $$($(@B)_0) $(COBJNAM)$@ $< {$(SYS)}.c{$(OBJ)}.1: $(CC) $(FLAGU1) $$($(@B)_1) $(COBJNAM)$@ $< {$(SYS)}.c{$(OBJ)}.2: $(CC) $(FLAGU2) $$($(@B)_2) $(COBJNAM)$@ $< {$(SYS)}.c{$(OBJ)}.3: $(CC) $(FLAGU3) $$($(@B)_3) $(COBJNAM)$@ $< {$(SYS)}.c{$(OBJ)}.B: $(CC) $(FLAGUB) $$($(@B)_b) $(COBJNAM)$@ $< # # Rules for files in sys\msdos # {$(MSYS)}.c{$(OBJ)}.o: $(CC) $(FLAGUO) $$($(@B)_o) $(COBJNAM)$@ $< {$(MSYS)}.c{$(OBJ)}.0: $(CC) $(FLAGU0) $$($(@B)_0) $(COBJNAM)$@ $< {$(MSYS)}.c{$(OBJ)}.1: $(CC) $(FLAGU1) $$($(@B)_1) $(COBJNAM)$@ $< {$(MSYS)}.c{$(OBJ)}.2: $(CC) $(FLAGU2) $$($(@B)_2) $(COBJNAM)$@ $< {$(MSYS)}.c{$(OBJ)}.3: $(CC) $(FLAGU3) $$($(@B)_3) $(COBJNAM)$@ $< {$(MSYS)}.c{$(OBJ)}.B: $(CC) $(FLAGUB) $$($(@B)_b) $(COBJNAM)$@ $< {$(MSYS)}.h{$(INCL)}.h: @copy $< $@ # # Rules for files in util # {$(UTIL)}.c{$(OBJ)}.o: $(CC) $(CFLAGSU) $$($(@B)_o) $(COBJNAM)$@ $< # # Rules for files in win\share # {$(WSHR)}.c.o: @$(CC) $(FLAGUO) $$($(@B)_o) $(COBJNAM)$@ $< {$(WSHR)}.c{$(OBJ)}.o: @$(CC) $(FLAGUO) $$($(@B)_o) $(COBJNAM)$@ $< {$(WSHR)}.h{$(INCL)}.h: @copy $< $@ {$(WSHR)}.txt{$(DAT)}.txt: @copy $< $@ # # Rules for files in win\tty # {$(WTTY)}.c{$(OBJ)}.o: $(CC) $(FLAGUO) $$($(@B)_o) $(COBJNAM)$@ $< {$(WTTY)}.c{$(OBJ)}.0: $(CC) $(FLAGU0) $$($(@B)_0) $(COBJNAM)$@ $< {$(WTTY)}.c{$(OBJ)}.1: $(CC) $(FLAGU1) $$($(@B)_1) $(COBJNAM)$@ $< {$(WTTY)}.c{$(OBJ)}.2: $(CC) $(FLAGU2) $$($(@B)_2) $(COBJNAM)$@ $< {$(WTTY)}.c{$(OBJ)}.3: $(CC) $(FLAGU3) $$($(@B)_3) $(COBJNAM)$@ $< {$(WTTY)}.c{$(OBJ)}.B: $(CC) $(FLAGUB) $$($(@B)_b) $(COBJNAM)$@ $< # # NETHACK OBJECTS # # This section creates shorthand macros for many objects # referenced later on in the Makefile. # # # Shorten up the location for some files # O = $(OBJ)\ # comment so \ isn't last char U = $(UTIL)\ # comment so \ isn't last char # # Utility Objects. # MAKESRC = $(U)makedefs.c SPLEVSRC = $(U)lev_yacc.c $(U)lev_$(LEX).c $(U)lev_main.c $(U)panic.c DGNCOMPSRC = $(U)dgn_yacc.c $(U)dgn_$(LEX).c $(U)dgn_main.c MAKEOBJS = $(O)makedefs.o $(O)monst.o $(O)objects.o SPLEVOBJS =$(O)lev_yacc.o $(O)lev_$(LEX).o $(O)lev_main.o \ $(O)alloc.o $(O)decl.o $(O)drawing.o $(O)monst.o \ $(O)objects.o $(O)panic.o $(O)stubvid.o DGNCOMPOBJS =$(O)dgn_yacc.o $(O)dgn_$(LEX).o $(O)dgn_main.o \ $(O)alloc.o $(O)panic.o RECOVOBJS = $(O)recover.o GIFREADERS =$(O)gifread.o $(O)alloc.o $(O)panic.o TEXT_IO =$(O)tiletext.o $(O)tiletxt.o $(O)drawing.o \ $(O)decl.o $(O)monst.o $(O)objects.o $(O)stubvid.o PPMWRITERS = $(O)ppmwrite.o $(O)alloc.o $(O)panic.o GIFREAD2 =$(O)gifread2.o $(O)alloc.o $(O)panic.o TEXT_IO2 =$(O)tiletex2.o $(O)tiletxt2.o $(O)drawing.o \ $(O)decl.o $(O)monst.o $(O)objects.o $(O)stubvid.o PPMWRIT2 = $(O)ppmwrit2.o $(O)alloc.o $(O)panic.o TILEFILES = $(WSHR)\monsters.txt $(WSHR)\objects.txt $(WSHR)\other.txt TILEFILES2 = $(WSHR)\monthin.txt $(WSHR)\objthin.txt $(WSHR)\oththin.txt DLBOBJS = $(O)dlb_main.o $(O)dlb.o $(O)alloc.o $(O)panic.o # # Object files for the game itself. # OBJ01 = $(O)alloc.o $(RANDOM) $(O)decl.o $(O)objects.o \ $(O)muse.o $(O)display.o $(O)vision.o $(O)mapglyph.o \ $(O)rect.o $(O)vis_tab.o $(O)monst.o $(O)wintty.o \ $(O)files.o $(O)sys.o $(O)monstr.o $(O)minion.o \ $(O)worm.o $(O)detect.o $(O)exper.o $(O)mplayer.o \ $(O)uhitm.o $(O)pager.o $(O)windows.o $(O)quest.o \ $(O)questpgr.o $(O)write.o $(O)drawing.o $(O)dokick.o \ $(O)dothrow.o $(O)pickup.o $(O)pray.o $(O)spell.o \ $(O)ball.o $(O)wield.o $(O)worn.o $(O)fountain.o \ $(O)music.o $(O)rumors.o $(O)dlb.o $(O)sit.o \ $(O)bones.o $(O)mklev.o $(O)save.o $(O)restore.o \ $(O)mkmaze.o $(O)mkmap.o $(O)end.o $(O)o_init.o \ $(O)options.o $(O)rip.o $(O)sound.o $(O)teleport.o \ $(O)topten.o $(O)tty.o $(O)u_init.o $(O)extralev.o \ $(O)sp_lev.o $(O)dig.o $(O)pckeys.o OVL0 = $(O)allmain.0 $(O)apply.0 $(O)artifact.0 $(O)attrib.0 \ $(O)botl.0 $(O)cmd.0 $(O)dbridge.0 $(O)do.0 \ $(O)do_name.0 $(O)do_wear.0 $(O)dogmove.0 $(O)dungeon.0 \ $(O)eat.0 $(O)engrave.0 $(O)hacklib.0 $(O)invent.0 \ $(O)lock.0 $(O)pcmain.0 $(O)mail.0 $(O)makemon.0 \ $(O)mcastu.0 $(O)mhitm.0 $(O)mhitu.0 $(O)mkobj.0 \ $(O)mkroom.0 $(O)mon.0 $(O)mondata.0 $(O)monmove.0 \ $(O)mthrowu.0 $(O)objnam.0 $(O)polyself.0 $(O)priest.0 \ $(O)rnd.0 $(O)shknam.0 $(O)sounds.0 $(O)steal.0 \ $(O)timeout.0 $(O)track.0 $(O)trap.0 $(O)vault.0 \ $(O)weapon.0 $(O)were.0 $(O)wizard.0 $(O)msdos.0 \ $(O)termcap.0 $(O)video.0 $(O)vidtxt.0 $(O)zap.0 \ $(O)explode.0 $(O)shk.0 OVL1 = $(O)allmain.1 $(O)apply.1 $(O)artifact.1 $(O)attrib.1 \ $(O)botl.1 $(O)cmd.1 $(O)dbridge.1 $(O)do.1 \ $(O)do_wear.1 $(O)dog.1 $(O)dungeon.1 $(O)eat.1 \ $(O)engrave.1 $(O)hack.1 $(O)hacklib.1 $(O)invent.1 \ $(O)makemon.1 $(O)mhitu.1 $(O)mkobj.1 $(O)mon.1 \ $(O)mondata.1 $(O)monmove.1 $(O)mthrowu.1 $(O)objnam.1 \ $(O)pcmain.1 $(O)polyself.1 $(O)rnd.1 $(O)shk.1 \ $(O)steal.1 $(O)timeout.1 $(O)track.1 $(O)trap.1 \ $(O)weapon.1 $(O)getline.1 $(O)termcap.1 $(O)topl.1 \ $(O)video.1 $(O)zap.1 $(O)explode.1 OVL2 = $(O)attrib.2 $(O)do.2 $(O)do_name.2 $(O)do_wear.2 \ $(O)dog.2 $(O)engrave.2 $(O)hack.2 $(O)hacklib.2 \ $(O)invent.2 $(O)makemon.2 $(O)mon.2 $(O)mondata.2 \ $(O)monmove.2 $(O)getline.2 $(O)shk.2 $(O)topl.2 \ $(O)trap.2 $(O)zap.2 OVL3 = $(O)do.3 $(O)hack.3 $(O)invent.3 $(O)light.3 \ $(O)shk.3 $(O)trap.3 $(O)zap.3 OVLB = $(O)allmain.B $(O)apply.B $(O)artifact.B $(O)attrib.B \ $(O)botl.B $(O)cmd.B $(O)dbridge.B $(O)do.B \ $(O)do_name.B $(O)do_wear.B $(O)dog.B $(O)dogmove.B \ $(O)eat.B $(O)engrave.B $(O)hack.B $(O)hacklib.B \ $(O)invent.B $(O)lock.B $(O)mail.B $(O)makemon.B \ $(O)mcastu.B $(O)mhitm.B $(O)mhitu.B $(O)mkobj.B \ $(O)mkroom.B $(O)mon.B $(O)mondata.B $(O)monmove.B \ $(O)mthrowu.B $(O)objnam.B $(O)pcmain.B $(O)pline.B \ $(O)polyself.B $(O)potion.B $(O)priest.B $(O)read.B \ $(O)rnd.B $(O)shk.B $(O)shknam.B $(O)sounds.B \ $(O)steal.B $(O)timeout.B $(O)track.B $(O)trap.B \ $(O)vault.B $(O)weapon.B $(O)were.B $(O)wizard.B \ $(O)msdos.B $(O)pcunix.B $(O)termcap.B $(O)topl.B \ $(O)video.B $(O)vidtxt.B $(O)zap.B TILOBJ = $(TILEGAME) $(TILEVGA) VVOBJ = $(O)version.o NVOBJ = $(OBJ01) $(OVL0) $(OVL1) $(OVL2) \ $(OVL3) $(OVLB) $(TILOBJ) ALLOBJ= $(NVOBJ) $(VVOBJ) $(OVLINIT) # # Header objects # # This comment copied from sys/unix/Makefile.src, # extern.h is ignored, even though its declared function types may affect the # compilation of all the .c files, since extern.h changes every time the # type of an external function does, and we would spend all our time recompiling # if we did not ignore it. #EXTERN_H = $(INCL)\extern.h EXTERN_H = PCCONF_H = $(INCL)\pcconf.h $(INCL)\micro.h $(INCL)\system.h PERMONST_H = $(INCL)\monattk.h $(INCL)\monflag.h $(INCL)\align.h YOUPROP_H = $(INCL)\prop.h $(PERMONST_H) $(INCL)\pm.h $(INCL)\youprop.h \ $(INCL)\mondata.h YOU_H = $(INCL)\attrib.h $(INCL)\monst.h $(YOUPROP_H) $(INCL)\align.h DECL_H = $(INCL)\quest.h $(INCL)\spell.h $(INCL)\color.h \ $(INCL)\obj.h $(YOU_H) $(INCL)\onames.h $(INCL)\pm.h CONFIG_H = $(INCL)\tradstdc.h $(INCL)\coord.h $(PCCONF_H) $(INCL)\config.h HACK_H = $(CONFIG_H) $(INCL)\dungeon.h $(INCL)\align.h $(INCL)\monsym.h \ $(INCL)\mkroom.h $(INCL)\objclass.h $(DECL_H) \ $(INCL)\timeout.h $(INCL)\trap.h $(INCL)\flag.h $(INCL)\rm.h \ $(INCL)\vision.h $(INCL)\mondata.h $(INCL)\wintype.h \ $(INCL)\engrave.h $(INCL)\rect.h $(EXTERN_H) \ $(INCL)\winprocs.h $(INCL)\trampoli.h $(INCL)\display.h TILE_H = $(INCL)\tile.h $(INCL)\pctiles.h PCVIDEO_H = $(INCL)\portio.h $(INCL)\pcvideo.h ALIGN_H = $(INCL)\align.h ARTIFACT_H = $(INCL)\artifact.h ARTILIST_H = $(INCL)\artilist.h COLOR_H = $(INCL)\color.h DATE_H = $(INCL)\date.h DGN_FILE_H = $(INCL)\dgn_file.h DLB_H = $(INCL)\dlb.h EMIN_H = $(INCL)\emin.h EPRI_H = $(INCL)\epri.h ESHK_H = $(INCL)\eshk.h EDOG_H = $(INCL)\edog.h FUNC_TAB_H = $(INCL)\func_tab.h LEV_H = $(INCL)\lev.h LEV_COMP_H = $(INCL)\lev_comp.h MAIL_H = $(INCL)\mail.h MFNDPOS_H = $(INCL)\mfndpos.h MONSYM_H = $(INCL)\monsym.h OBJ_H = $(INCL)\obj.h OBJCLASS_H = $(INCL)\objclass.h OBJECTS_H = $(INCL)\objects.h PROP_H = $(INCL)\prop.h QTEXT_H = $(INCL)\qtext.h QUEST_H = $(INCL)\quest.h SP_LEV_H = $(INCL)\sp_lev.h TERMCAP_H = $(INCL)\termcap.h VAULT_H = $(INCL)\vault.h VIS_TAB_H = $(INCL)\vis_tab.h WINTTY_H = $(INCL)\wintty.h # # In the unix distribution this file is patchlevel.h, make it 8.3 here # to avoid an nmake warning under dos. # PATCHLEVEL_H = $(INCL)\patchlev.h # # The name of the game. # GAMEFILE = $(GAMEDIR)\$(GAME).exe # # make data.base an 8.3 filename to prevent an nmake warning # DATABASE = $(DAT)\data.bas ####################################################################### # # TARGETS # # The main target. # $(GAME): obj.tag envchk $(U)utility.tag $(GAMEFILE) @echo $(GAME) is up to date. # # Everything # all : install install: $(GAME) install.tag @echo Done. install.tag: $(DAT)\data $(DAT)\rumors $(DAT)\dungeon \ $(DAT)\oracles $(DAT)\quest.dat $(DAT)\sp_lev.tag $(DLB) ! IF ("$(USE_DLB)"=="Y") copy nhdat $(GAMEDIR) copy $(DAT)\license $(GAMEDIR) ! ELSE copy $(DAT)\*. $(GAMEDIR) copy $(DAT)\*.dat $(GAMEDIR) copy $(DAT)\*.lev $(GAMEDIR) copy $(MSYS)\msdoshlp.txt $(GAMEDIR) if exist $(GAMEDIR)\makefile del $(GAMEDIR)\makefile ! ENDIF copy $(SYS)\termcap $(GAMEDIR) if exist $(DOC)\guideb*.txt copy $(DOC)\guideb*.txt $(GAMEDIR) if exist $(DOC)\nethack.txt copy $(DOC)\nethack.txt $(GAMEDIR)\NetHack.txt if exist $(DOC)\recover.txt copy $(DOC)\recover.txt $(GAMEDIR) copy $(SYS)\NetHack.cnf $(GAMEDIR) copy $(U)recover.exe $(GAMEDIR) if exist *.tib copy *.tib $(GAMEDIR) echo install done > $@ $(DAT)\sp_lev.tag: $(U)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)\elf.des $(DAT)\healer.des \ $(DAT)\knight.des $(DAT)\priest.des $(DAT)\rogue.des \ $(DAT)\samurai.des $(DAT)\tourist.des $(DAT)\valkyrie.des \ $(DAT)\wizard.des cd $(DAT) $(U)lev_comp bigroom.des $(U)lev_comp castle.des $(U)lev_comp endgame.des $(U)lev_comp gehennom.des $(U)lev_comp knox.des $(U)lev_comp mines.des $(U)lev_comp medusa.des $(U)lev_comp oracle.des $(U)lev_comp 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 elf.des $(U)lev_comp healer.des $(U)lev_comp knight.des $(U)lev_comp priest.des $(U)lev_comp rogue.des $(U)lev_comp samurai.des $(U)lev_comp tourist.des $(U)lev_comp valkyrie.des $(U)lev_comp wizard.des cd $(SRC) echo sp_levs done > $(DAT)\sp_lev.tag $(U)utility.tag: envchk $(INCL)\date.h $(INCL)\onames.h \ $(INCL)\pm.h $(SRC)\monstr.c $(SRC)\vis_tab.c \ $(U)lev_comp.exe $(VIS_TAB_H) $(U)dgn_comp.exe \ $(U)recover.exe $(TILEUTIL) @echo utilities made >$@ @echo utilities made. tileutil: $(U)gif2txt.exe $(U)txt2ppm.exe @echo Optional tile development utilities are up to date. # # Inline files : # Specifying the "<<" means to start an inline file. # Another "<<" at the start of a line closes the # inline file. # # DO NOT INDENT THE << below! # $(GAMEFILE) : $(ALLOBJ) @echo Linking.... $(LINK) $(LFLAGSN) @<<$(GAME).lnk $(ALLOBJ) $(GAMEFILE) $(GAME) $(TERMLIB) $(MOVETR) $(CLIB) $(BCOVL) $(BCMDL) << @if exist $(GAMEDIR)\$(GAME).bak del $(GAMEDIR)\$(GAME).bak # # Makedefs Stuff # $(U)makedefs.exe: $(MAKEOBJS) @$(LINK) $(LFLAGSU) $(MAKEOBJS), $@,, $(CLIB) $(BCMDL); $(O)makedefs.o: $(CONFIG_H) $(PERMONST_H) $(OBJCLASS_H) \ $(MONSYM_H) $(QTEXT_H) $(PATCHLEVEL_H) \ $(U)makedefs.c @$(CC) $(CFLAGSU) $(COBJNAM)$@ $(U)makedefs.c # # date.h should be remade every time any of the source or include # files is modified. # $(INCL)\date.h : $(U)makedefs.exe $(U)makedefs -v @echo A new $@ has been created. $(INCL)\onames.h : $(U)makedefs.exe $(U)makedefs -o $(INCL)\pm.h : $(U)makedefs.exe $(U)makedefs -p #$(INCL)\trap.h : $(U)makedefs.exe # $(U)makedefs -t $(SRC)\monstr.c: $(U)makedefs.exe $(U)makedefs -m $(INCL)\vis_tab.h: $(U)makedefs.exe $(U)makedefs -z $(SRC)\vis_tab.c: $(U)makedefs.exe $(U)makedefs -z # # Level Compiler Stuff # $(U)lev_comp.exe: $(SPLEVOBJS) @echo Linking $@... $(LINK) $(LFLAGSU) @&&! $(O)stubvid.o $(O)panic.o $(O)objects.o $(O)monst.o + $(O)drawing.o $(O)decl.o $(O)alloc.o $(O)lev_main.o + $(O)lev_$(LEX).o $(O)lev_yacc.o $@ $(@B) $(BCMDL); ! $(O)lev_yacc.o: $(HACK_H) $(SP_LEV_H) $(INCL)\lev_comp.h $(U)lev_yacc.c @$(CC) $(CFLAGSU) $(COBJNAM)$@ $(U)lev_yacc.c $(O)lev_$(LEX).o: $(HACK_H) $(INCL)\lev_comp.h $(SP_LEV_H) \ $(U)lev_$(LEX).c $(CC) $(CFLAGSU) $(COBJNAM)$@ $(U)lev_$(LEX).c $(O)lev_main.o: $(U)lev_main.c $(HACK_H) $(SP_LEV_H) @$(CC) $(CFLAGSU) $(COBJNAM)$@ $(U)lev_main.c $(U)lev_yacc.c $(INCL)\lev_comp.h : $(U)lev_comp.y ! IF "$(DO_YACC)"=="YACC_ACT" $(YACC) -d -l $(U)lev_comp.y copy $(YTABC) $(U)lev_yacc.c copy $(YTABH) $(INCL)\lev_comp.h @del $(YTABC) @del $(YTABH) ! ELSE @echo. @echo $(U)lev_comp.y has changed. @echo To update $(U)lev_yacc.c and $(INCL)\lev_comp.h run $(YACC). @echo. @echo For now, we will copy the prebuilt lev_yacc.c @echo from $(SYS) to $(U)lev_yacc.c, and copy the prebuilt @echo lev_comp.h from $(SYS) to $(UTIL)\lev_comp.h @echo and use those. @echo. copy $(SYS)\lev_yacc.c $@ >nul touch $@ copy $(SYS)\lev_comp.h $(INCL)\lev_comp.h >nul touch $(INCL)\lev_comp.h ! ENDIF $(U)lev_$(LEX).c: $(U)lev_comp.l ! IF "$(DO_LEX)"=="LEX_ACT" $(LEX) $(FLEXSKEL) $(U)lev_comp.l copy $(LEXYYC) $@ @del $(LEXYYC) ! ELSE @echo. @echo $(U)lev_comp.l has changed. To update $@ run $(LEX). @echo. @echo For now, we will copy a prebuilt lev_lex.c @echo from $(SYS) to $@ and use it. @echo. copy $(SYS)\lev_lex.c $@ >nul touch $@ ! ENDIF # # Dungeon Stuff # $(U)dgn_comp.exe: $(DGNCOMPOBJS) @echo Linking $@... $(LINK) $(LFLAGSU) @&&! $(O)panic.o $(O)alloc.o $(O)dgn_main.o $(O)dgn_$(LEX).o + $(O)dgn_yacc.o $@ $(@B) $(BCMDL); ! $(O)dgn_yacc.o: $(HACK_H) $(DGN_FILE_H) $(INCL)\dgn_comp.h \ $(U)dgn_yacc.c @$(CC) $(CFLAGSU) $(COBJNAM)$@ $(U)dgn_yacc.c $(O)dgn_$(LEX).o: $(HACK_H) $(DGN_FILE_H) $(INCL)\dgn_comp.h \ $(U)dgn_$(LEX).c @$(CC) $(CFLAGSU) $(COBJNAM)$@ $(U)dgn_$(LEX).c $(O)dgn_main.o: $(HACK_H) $(U)dgn_main.c @$(CC) $(CFLAGSU) $(COBJNAM)$@ $(U)dgn_main.c $(U)dgn_yacc.c $(INCL)\dgn_comp.h : $(U)dgn_comp.y ! IF "$(DO_YACC)"=="YACC_ACT" $(YACC) -d -l $(U)dgn_comp.y copy $(YTABC) $(U)dgn_yacc.c copy $(YTABH) $(INCL)\dgn_comp.h @del $(YTABC) @del $(YTABH) ! ELSE @echo. @echo $(U)dgn_comp.y has changed. To update $@ and @echo $(INCL)\dgn_comp.h run $(YACC). @echo. @echo For now, we will copy the prebuilt dgn_yacc.c from @echo $(SYS) to $(U)dgn_yacc.c, and copy the prebuilt @echo dgn_comp.h from $(SYS) to $(INCL)\dgn_comp.h @echo and use those. @echo. copy $(SYS)\dgn_yacc.c $@ >nul touch $@ copy $(SYS)\dgn_comp.h $(INCL)\dgn_comp.h >nul touch $(INCL)\dgn_comp.h ! ENDIF $(U)dgn_$(LEX).c: $(U)dgn_comp.l ! IF "$(DO_LEX)"=="LEX_ACT" $(LEX) $(FLEXSKEL) $(U)dgn_comp.l copy $(LEXYYC) $@ @del $(LEXYYC) ! ELSE @echo. @echo $(U)dgn_comp.l has changed. To update $@ run $(LEX). @echo. @echo For now, we will copy a prebuilt dgn_lex.c @echo from $(SYS) to $@ and use it. @echo. copy $(SYS)\dgn_lex.c $@ >nul touch $@ ! ENDIF obj.tag: @if not exist $(O)*.* mkdir $(OBJ) @echo directory $(OBJ) created @echo directory $(OBJ) created >$@ envchk: precomp.msg # # Borland Configuration File Section # @echo Making Borland configuration files... @echo -Y -O -Z -Oe -Ob -Os -Ff -I$(BCINCL);$(INCL) > $(BCCFG) @echo -m$(MODEL) -D__IO_H $(CFLGTOT) -DSTRNCMPI >> $(BCCFG) @type $(BCCFG) > CFLAGCO.CFG @type $(BCCFG) > CFLAGUO.CFG @type $(BCCFG) > CFLAGC0.CFG @type $(BCCFG) > CFLAGU0.CFG @type $(BCCFG) > CFLAGC1.CFG @type $(BCCFG) > CFLAGU1.CFG @type $(BCCFG) > CFLAGC2.CFG @type $(BCCFG) > CFLAGU2.CFG @type $(BCCFG) > CFLAGC3.CFG @type $(BCCFG) > CFLAGU3.CFG @type $(BCCFG) > CFLAGCB.CFG @type $(BCCFG) > CFLAGUB.CFG @echo -Y $(CFLAGCO) >> CFLAGCO.CFG @echo -Y $(CFLAGUO) >> CFLAGUO.CFG @echo -Y $(CFLAGC0) >> CFLAGC0.CFG @echo -Y $(CFLAGU0) >> CFLAGU0.CFG @echo -Y $(CFLAGC1) >> CFLAGC1.CFG @echo -Y $(CFLAGU1) >> CFLAGU1.CFG @echo -Y $(CFLAGC2) >> CFLAGC2.CFG @echo -Y $(CFLAGU2) >> CFLAGU2.CFG @echo -Y $(CFLAGC3) >> CFLAGC3.CFG @echo -Y $(CFLAGU3) >> CFLAGU3.CFG @echo -Y $(CFLAGCB) >> CFLAGCB.CFG @echo -Y $(CFLAGUB) >> CFLAGUB.CFG ! IF "$(TILEGAME)"=="" @echo. @echo NOTE: This build will NOT include tile support. @echo. ! ELSE @echo. @echo This build includes tile support. @echo. ! ENDIF # # SECONDARY TARGETS # # # Header files NOT distributed in ..\include # $(INCL)\tile.h: $(WSHR)\tile.h copy $(WSHR)\tile.h $@ $(INCL)\pctiles.h: $(MSYS)\pctiles.h copy $(MSYS)\pctiles.h $@ $(INCL)\pcvideo.h: $(MSYS)\pcvideo.h copy $(MSYS)\pcvideo.h $@ $(INCL)\portio.h: $(MSYS)\portio.h copy $(MSYS)\portio.h $@ # # Recover Utility # $(U)recover.exe: $(RECOVOBJS) @$(LINK) $(LFLAGSU) $(RECOVOBJS),$@,, $(CLIB) $(BCMDL); # # Tile Mapping # $(SRC)\tile.c: $(U)tilemap.exe @echo A new $@ is being created. @$(U)tilemap $(U)tilemap.exe: $(O)tilemap.o @$(LINK) $(LFLAGSU) $(O)tilemap.o,$@,, $(CLIB) $(BCMDL); $(O)tilemap.o: $(WSHR)\tilemap.c $(HACK_H) $(CC) $(CFLAGSU) $(COBJNAM)$@ $(WSHR)\tilemap.c # # Tile Utilities # # # Optional (for development) # # $(U)gif2txt.exe: $(GIFREADERS) $(TEXT_IO) @$(LINK) $(LFLAGSU) $(GIFREADERS) $(TEXT_IO),$@,, \ $(CLIB) $(BCMDL); $(U)txt2ppm.exe: $(PPMWRITERS) $(TEXT_IO) @$(LINK) $(LFLAGSU) $(PPMWRITERS) $(TEXT_IO),$@,, \ $(CLIB) $(BCMDL); $(U)gif2txt2.exe: $(GIFREAD2) $(TEXT_IO2) @$(LINK) $(LFLAGSU) $(GIFREAD2) $(TEXT_IO2),$@,, \ $(CLIB) $(BCMDL); $(U)txt2ppm2.exe: $(PPMWRIT2) $(TEXT_IO2) @$(LINK) $(LFLAGSU) $(PPMWRIT2) $(TEXT_IO2),$@,, \ $(CLIB) $(BCMDL); # # Required for tile support # NetHack1.tib: $(TILEFILES) $(U)tile2bin.exe @echo Creating binary tile files (this may take some time) @$(U)tile2bin NetHackO.tib: thintile.tag $(TILEFILES2) $(U)til2bin2.exe @echo Creating overview binary tile files (this may take some time) @$(U)til2bin2 thintile.tag: $(U)thintile.exe $(TILEFILES) $(U)thintile @echo thintiles created >thintile.tag $(U)tile2bin.exe: $(O)tile2bin.o $(TEXT_IO) @echo Linking $@... $(LINK) $(LFLAGSU) @&&! $(O)tile2bin.o+ $(O)stubvid.o $(O)objects.o $(O)monst.o $(O)decl.o + $(O)drawing.o $(O)tiletxt.o $(O)tiletext.o $@ $(@B) $(BCMDL); ! $(U)til2bin2.exe: $(O)til2bin2.o $(TEXT_IO2) @echo Linking $@... $(LINK) $(LFLAGSU) @&&! $(O)til2bin2.o+ $(O)stubvid.o $(O)objects.o $(O)monst.o $(O)decl.o + $(O)drawing.o $(O)tiletxt2.o $(O)tiletex2.o $@ $(@B) $(BCMDL); ! $(U)thintile.exe: $(O)thintile.o @$(LINK) $(LFLAGSU) $(O)thintile.o,$@,, $(CLIB) $(BCMDL); $(O)thintile.o: $(HACK_H) $(INCL)\tile.h $(WSHR)\thintile.c $(CC) $(CFLAGSU) $(COBJNAM)$@ $(WSHR)\thintile.c $(O)tile2bin.o: $(HACK_H) $(TILE_H) $(PCVIDEO_H) $(CC) $(CFLAGSU) $(COBJNAM)$@ $(MSYS)\tile2bin.c $(O)til2bin2.o: $(HACK_H) $(TILE_H) $(PCVIDEO_H) $(CC) $(CFLAGSU) $(CDEFINE)TILE_X=8 $(CDEFINE)OVERVIEW_FILE \ $(COBJNAM)$@ $(MSYS)\tile2bin.c # # DLB stuff # nhdat: $(U)dlb_main.exe @copy $(MSYS)\msdoshlp.txt $(DAT) @cd $(DAT) @echo data >dlb.lst @echo oracles >>dlb.lst @echo options >>dlb.lst @echo quest.dat >>dlb.lst @echo rumors >>dlb.lst @echo help >>dlb.lst @echo hh >>dlb.lst @echo cmdhelp >>dlb.lst @echo history >>dlb.lst @echo opthelp >>dlb.lst @echo wizhelp >>dlb.lst @echo dungeon >>dlb.lst @echo license >>dlb.lst @echo msdoshlp.txt >>dlb.lst @for %%N in (*.lev) do echo %%N >>dlb.lst $(U)dlb_main cvIf dlb.lst $(SRC)\nhdat @cd $(SRC) $(U)dlb_main.exe: $(DLBOBJS) @$(LINK) $(LFLAGSU) $(DLBOBJS),$@,, $(CLIB) $(BCMDL); $(O)dlb_main.o: $(U)dlb_main.c $(INCL)\config.h $(DLB_H) $(CC) $(CFLAGSU) $(COBJNAM)$@ $(U)dlb_main.c # # Housekeeping # spotless: clean rmdir $(OBJ) if exist $(DATE_H) del $(DATE_H) if exist $(INCL)\onames.h del $(INCL)\onames.h if exist $(INCL)\pm.h del $(INCL)\pm.h if exist $(VIS_TAB_H) del $(VIS_TAB_H) if exist $(SRC)\vis_tab.c del $(SRC)\vis_tab.c if exist $(SRC)\tile.c del $(SRC)\tile.c if exist $(DAT)\rumors del $(DAT)\rumors if exist $(DAT)\data del $(DAT)\data if exist $(DAT)\dungeon del $(DAT)\dungeon if exist $(DAT)\dungeon.pdf del $(DAT)\dungeon.pdf if exist $(DAT)\options del $(DAT)\options if exist $(DAT)\oracles del $(DAT)\oracles if exist $(DAT)\rumors del $(DAT)\rumors if exist $(DAT)\quest.dat del $(DAT)\quest.dat if exist $(DAT)\*.lev del $(DAT)\*.lev if exist $(DAT)\sp_lev.tag del $(DAT)\sp_lev.tag if exist $(SRC)\monstr.c del $(SRC)\monstr.c if exist $(SRC)\vis_tab.c del $(SRC)\vis_tab.c if exist $(SRC)\$(PLANAR_TIB) del $(SRC)\$(PLANAR_TIB) if exist $(SRC)\$(OVERVIEW_TIB) del $(SRC)\$(OVERVIEW_TIB) if exist $(U)recover.exe del $(U)recover.exe clean: if exist $(O)*.o del $(O)*.o if exist $(O)*.0 del $(O)*.0 if exist $(O)*.1 del $(O)*.1 if exist $(O)*.2 del $(O)*.2 if exist $(O)*.3 del $(O)*.3 if exist $(O)*.b del $(O)*.b if exist $(U)utility.tag del $(U)utility.tag if exist $(U)makedefs.exe del $(U)makedefs.exe if exist $(U)lev_comp.exe del $(U)lev_comp.exe if exist $(U)dgn_comp.exe del $(U)dgn_comp.exe if exist $(U)dlb_main.exe del $(U)dlb_main.exe if exist $(SRC)\*.lnk del $(SRC)\*.lnk if exist $(SRC)\*.map del $(SRC)\*.map if exist $(SRC)\*$(CPCHEXT) del $(SRC)\*$(CPCHEXT) if exist $(SRC)\*.cfg del $(SRC)\*.cfg if exist $(DAT)\dlb.lst del $(DAT)\dlb.lst pch.c: $(HACK_H) @echo ^#include "hack.h" > $@ @echo main(int argc, char *argv[]) >> $@ @echo { >> $@ @echo } >> $@ @echo. >> $@ # # OTHER DEPENDENCIES # # # Precompiled Header dependencies # (We need to force the generation of these at the beginning) # PHO$(CPCHEXT): $(HACK_H) pch.c @echo Generating new precompiled header for .O files @$(CC) $(FLAGCO) pch.c PH0$(CPCHEXT): $(HACK_H) pch.c @echo Generating new precompiled header for .0 files @$(CC) $(FLAGC0) pch.c PH1$(CPCHEXT): $(HACK_H) pch.c @echo Generating new precompiled header for .1 files @$(CC) $(FLAGC1) pch.c PH2$(CPCHEXT): $(HACK_H) pch.c @echo Generating new precompiled header for .2 files @$(CC) $(FLAGC2) pch.c PH3$(CPCHEXT): $(HACK_H) pch.c @echo Generating new precompiled header for .3 files @$(CC) $(FLAGC3) pch.c PHB$(CPCHEXT): $(HACK_H) pch.c @echo Generating new precompiled header for .B files @$(CC) $(FLAGCB) pch.c # Overlay initialization routines used by pcmain() at startup to # determine EMS/XMS memory usage. # Comment out the following line if you don't want Borland C++ to check for # extended memory. RECOGNIZE_XMS = $(CDEFINE)RECOGNIZE_XMS $(O)ovlinit.o: $(MSYS)\ovlinit.c $(HACK_H) $(CC) $(CFLAGSN) $(RECOGNIZE_XMS) $(COBJNAM)$@ $(MSYS)\ovlinit.c # # dat dependencies # $(DAT)\data: $(U)utility.tag $(DATABASE) $(U)makedefs -d $(DAT)\rumors: $(U)utility.tag $(DAT)\rumors.tru $(DAT)\rumors.fal $(U)makedefs -r $(DAT)\quest.dat: $(U)utility.tag $(DAT)\quest.txt $(U)makedefs -q $(DAT)\oracles: $(U)utility.tag $(DAT)\oracles.txt $(U)makedefs -h $(DAT)\dungeon: $(U)utility.tag $(DAT)\dungeon.def $(U)makedefs -e cd $(DAT) $(U)dgn_comp dungeon.pdf cd $(SRC) # # Util Dependencies. # $(O)panic.o: $(U)panic.c $(CONFIG_H) $(CC) $(CFLAGSU) $(COBJNAM)$@ $(U)panic.c $(O)recover.o: $(CONFIG_H) $(U)recover.c $(CC) $(CFLAGSU) $(COBJNAM)$@ $(U)recover.c # # from win\share # $(O)tiletxt.o: $(WSHR)\tilemap.c $(HACK_H) $(CC) $(CFLAGSU) $(CDEFINE)TILETEXT $(COBJNAM)$@ $(WSHR)\tilemap.c $(O)tiletxt2.o: $(WSHR)\tilemap.c $(HACK_H) $(CC) $(CFLAGSU) $(CDEFINE)TILETEXT \ $(CDEFINE)TILE_X=8 $(COBJNAM)$@ $(WSHR)\tilemap.c $(O)gifread.o: $(WSHR)\gifread.c $(CONFIG_H) $(INCL)\tile.h $(CC) $(CFLAGSU) $(COBJNAM)$@ $(WSHR)\gifread.c $(O)gifread2.o: $(WSHR)\gifread.c $(CONFIG_H) $(INCL)\tile.h $(CC) $(CFLAGSU) $(COBJNAM)$@ $(CDEFINE)TILE_X=8 $(WSHR)\gifread.c $(O)ppmwrite.o: $(WSHR)\ppmwrite.c $(CONFIG_H) $(INCL)\tile.h $(CC) $(CFLAGSU) $(COBJNAM)$@ $(WSHR)\ppmwrite.c $(O)ppmwrit2.o: $(WSHR)\ppmwrite.c $(CONFIG_H) $(INCL)\tile.h $(CC) $(CFLAGSU) $(COBJNAM)$@ $(CDEFINE)TILE_X=8 $(WSHR)\ppmwrite.c $(O)tiletext.o: $(WSHR)\tiletext.c $(CONFIG_H) $(INCL)\tile.h $(CC) $(CFLAGSU) $(COBJNAM)$@ $(WSHR)\tiletext.c $(O)tiletex2.o: $(WSHR)\tiletext.c $(CONFIG_H) $(INCL)\tile.h $(CC) $(CFLAGSU) $(CDEFINE)TILE_X=8 $(COBJNAM)$@ $(WSHR)\tiletext.c # # from win\tty # $(O)getline.1: $(PCH1) $(WTTY)\getline.c $(HACK_H) $(WINTTY_H) $(FUNC_TAB_H) $(CC) $(FLAGU1) $$($(@B)_1) $(COBJNAM)$@ $(WTTY)\getline.c $(O)getline.2: $(PCH2) $(WTTY)\getline.c $(HACK_H) $(WINTTY_H) $(FUNC_TAB_H) $(CC) $(FLAGU2) $$($(@B)_2) $(COBJNAM)$@ $(WTTY)\getline.c $(O)termcap.0: $(PCH0) $(WTTY)\termcap.c $(HACK_H) $(WINTTY_H) $(TERMCAP_H) $(CC) $(FLAGU0) $$($(@B)_0) $(COBJNAM)$@ $(WTTY)\termcap.c $(O)termcap.1: $(PCH1) $(WTTY)\termcap.c $(HACK_H) $(WINTTY_H) $(TERMCAP_H) $(CC) $(FLAGU1) $$($(@B)_1) $(COBJNAM)$@ $(WTTY)\termcap.c $(O)termcap.B: $(PCHB) $(WTTY)\termcap.c $(HACK_H) $(WINTTY_H) $(TERMCAP_H) $(CC) $(FLAGUB) $$($(@B)_b) $(COBJNAM)$@ $(WTTY)\termcap.c $(O)topl.1: $(PCH1) $(WTTY)\topl.c $(HACK_H) $(TERMCAP_H) $(WINTTY_H) $(CC) $(FLAGU1) $$($(@B)_1) $(COBJNAM)$@ $(WTTY)\topl.c $(O)topl.2: $(PCH2) $(WTTY)\topl.c $(HACK_H) $(TERMCAP_H) $(WINTTY_H) $(CC) $(FLAGU2) $$($(@B)_2) $(COBJNAM)$@ $(WTTY)\topl.c $(O)topl.B: $(PCHB) $(WTTY)\topl.c $(HACK_H) $(TERMCAP_H) $(WINTTY_H) $(CC) $(FLAGUB) $$($(@B)_b) $(COBJNAM)$@ $(WTTY)\topl.c $(O)wintty.o: $(PCHO) $(CONFIG_H) $(WTTY)\wintty.c $(PATCHLEVEL_H) $(CC) $(FLAGUO) $$($(@B)_o) $(COBJNAM)$@ $(WTTY)\wintty.c # # from sys\share # $(O)pcmain.0: $(PCH0) $(HACK_H) $(SYS)\pcmain.c $(CC) $(FLAGU0) $$($(@B)_0) $(COBJNAM)$@ $(SYS)\pcmain.c $(O)pcmain.1: $(PCH1) $(HACK_H) $(SYS)\pcmain.c $(CC) $(FLAGU1) $$($(@B)_1) $(COBJNAM)$@ $(SYS)\pcmain.c $(O)pcmain.B: $(PCHB) $(HACK_H) $(SYS)\pcmain.c $(CC) $(FLAGUB) $$($(@B)_b) $(COBJNAM)$@ $(SYS)\pcmain.c $(O)pcunix.B: $(PCHB) $(SYS)\pcunix.c $(HACK_H) $(CC) $(FLAGUB) $$($(@B)_b) $(COBJNAM)$@ $(SYS)\pcunix.c $(O)tty.o: $(HACK_H) $(WINTTY_H) $(SYS)\pctty.c $(CC) $(CFLAGSN) $$($(@B)_o) $(COBJNAM)$@ $(SYS)\pctty.c $(O)sys.o: $(HACK_H) $(SYS)\pcsys.c $(CC) $(CFLAGSN) $$($(@B)_o) $(COBJNAM)$@ $(SYS)\pcsys.c $(O)random.o: $(PCHO) $(HACK_H) $(SYS)\random.c $(CC) $(FLAGUO) $$($(@B)_o) $(COBJNAM)$@ $(SYS)\random.c # # from sys\msdos # $(O)msdos.0: $(MSYS)\msdos.c $(HACK_H) $(PCVIDEO_H) $(CC) $(CFLAGSN) $(COVL0) $$($(@B)_0) $(COBJNAM)$@ $(MSYS)\msdos.c $(O)msdos.B: $(MSYS)\msdos.c $(HACK_H) $(PCVIDEO_H) $(CC) $(CFLAGSN) $(COVLB) $$($(@B)_b) $(COBJNAM)$@ $(MSYS)\msdos.c $(O)pctiles.0: $(PCH0) $(MSYS)\pctiles.c $(HACK_H) $(TILE_H) $(PCVIDEO_H) $(CC) $(FLAGU0) $$($(@B)_0) $(COBJNAM)$@ $(MSYS)\pctiles.c $(O)pctiles.B: $(PCHB) $(MSYS)\pctiles.c $(HACK_H) $(TILE_H) $(PCVIDEO_H) $(CC) $(FLAGUB) $$($(@B)_b) $(COBJNAM)$@ $(MSYS)\pctiles.c $(O)sound.o: $(PCH0) $(MSYS)\sound.c $(HACK_H) $(INCL)\portio.h $(CC) $(FLAGUO) $$($(@B)_o) $(COBJNAM)$@ $(MSYS)\sound.c $(O)pckeys.o: $(PCHO) $(MSYS)\pckeys.c $(HACK_H) $(PCVIDEO_H) $(CC) $(FLAGUO) $$($(@B)_o) $(COBJNAM)$@ $(MSYS)\pckeys.c $(O)stubvid.o : $(MSYS)\video.c $(HACK_H) $(CC) $(FLAGUO) $(CDEFINE)STUBVIDEO $$($(@B)_o) $(COBJNAM)$@ $(MSYS)\video.c $(O)video.0: $(PCH0) $(MSYS)\video.c $(HACK_H) $(WINTTY_H) $(PCVIDEO_H) \ $(TILE_H) $(CC) $(FLAGU0) $$($(@B)_0) $(COBJNAM)$@ $(MSYS)\video.c $(O)video.1: $(PCH1) $(MSYS)\video.c $(HACK_H) $(WINTTY_H) $(PCVIDEO_H) \ $(TILE_H) $(CC) $(FLAGU1) $$($(@B)_1) $(COBJNAM)$@ $(MSYS)\video.c $(O)video.B: $(PCHB) $(MSYS)\video.c $(HACK_H) $(WINTTY_H) $(PCVIDEO_H) \ $(TILE_H) $(CC) $(FLAGUB) $$($(@B)_b) $(COBJNAM)$@ $(MSYS)\video.c $(O)vidtxt.0: $(MSYS)\vidtxt.c $(HACK_H) $(WINTTY_H) $(PCVIDEO_H) $(CC) $(CFLAGSN) $(COVL0) $$($(@B)_0) $(COBJNAM)$@ $(MSYS)\vidtxt.c $(O)vidtxt.B: $(MSYS)\vidtxt.c $(HACK_H) $(WINTTY_H) $(PCVIDEO_H) $(CC) $(CFLAGSN) $(COVLB) $$($(@B)_b) $(COBJNAM)$@ $(MSYS)\vidtxt.c $(O)vidvga.0: $(PCH0) $(MSYS)\vidvga.c $(HACK_H) $(WINTTY_H) $(PCVIDEO_H) \ $(TILE_H) $(CC) $(FLAGU0) $$($(@B)_0) $(COBJNAM)$@ $(MSYS)\vidvga.c $(O)vidvga.1: $(PCH1) $(MSYS)\vidvga.c $(HACK_H) $(WINTTY_H) $(PCVIDEO_H) \ $(TILE_H) $(CC) $(FLAGU1) $$($(@B)_0) $(COBJNAM)$@ $(MSYS)\vidvga.c $(O)vidvga.2: $(PCH2) $(MSYS)\vidvga.c $(HACK_H) $(WINTTY_H) $(PCVIDEO_H) \ $(TILE_H) $(CC) $(FLAGU2) $$($(@B)_0) $(COBJNAM)$@ $(MSYS)\vidvga.c $(O)vidvga.B: $(PCHB) $(MSYS)\vidvga.c $(HACK_H) $(WINTTY_H) $(PCVIDEO_H) \ $(TILE_H) $(CC) $(FLAGUB) $$($(@B)_b) $(COBJNAM)$@ $(MSYS)\vidvga.c # # from src # $(O)alloc.o: $(SRC)\alloc.c $(CONFIG_H) $(CC) $(CFLAGSN) $$($(@B)_o) $(COBJNAM)$@ $(SRC)\alloc.c $(O)ball.o: $(PCHO) $(SRC)\ball.c $(HACK_H) $(O)bones.o: $(PCHO) $(SRC)\bones.c $(HACK_H) $(LEV_H) $(O)decl.o: $(PCHO) $(SRC)\decl.c $(HACK_H) $(QUEST_H) $(O)detect.o: $(PCHO) $(SRC)\detect.c $(HACK_H) $(ARTIFACT_H) $(O)dig.o: $(PCHO) $(SRC)\dig.c $(HACK_H) $(EDOG_H) # check dep $(O)display.o: $(PCHO) $(SRC)\display.c $(HACK_H) $(O)dlb.o: $(SRC)\dlb.c $(DLB_H) $(HACK_H) $(CC) $(CFLAGSN) $$($(@B)_o) $(COBJNAM)$@ $(SRC)\dlb.c $(O)dokick.o: $(PCHO) $(SRC)\dokick.c $(HACK_H) $(ESHK_H) $(O)dothrow.o: $(PCHO) $(SRC)\dothrow.c $(HACK_H) $(O)drawing.o: $(SRC)\drawing.c $(HACK_H) $(TERMCAP_H) $(CC) $(CFLAGSN) $$($(@B)_o) $(COBJNAM)$@ $(SRC)\drawing.c $(O)end.o: $(SRC)\end.c $(HACK_H) $(ESHK_H) $(DLB_H) $(CC) $(CFLAGSN) $$($(@B)_o) $(COBJNAM)$@ $(SRC)\end.c $(O)exper.o: $(PCHO) $(SRC)\exper.c $(HACK_H) $(O)extralev.o: $(PCHO) $(SRC)\extralev.c $(HACK_H) $(O)files.o: $(PCHO) $(SRC)\files.c $(HACK_H) $(DLB_H) $(O)fountain.o: $(PCHO) $(SRC)\fountain.c $(HACK_H) $(O)mapglyph.o: $(PCHO) $(SRC)\mapglyph.c $(HACK_H) $(O)minion.o: $(PCHO) $(SRC)\minion.c $(HACK_H) $(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) $(O)mkmaze.o: $(PCHO) $(SRC)\mkmaze.c $(HACK_H) $(SP_LEV_H) $(LEV_H) $(O)monst.o: $(SRC)\monst.c $(CONFIG_H) $(PERMONST_H) $(MONSYM_H) \ $(ESHK_H) $(EPRI_H) $(COLOR_H) $(ALIGN_H) $(CC) $(CFLAGSN) $$($(@B)_o) $(COBJNAM)$@ $(SRC)\monst.c $(O)monstr.o: $(SRC)\monstr.c $(CONFIG_H) $(CC) $(CFLAGSN) $$($(@B)_o) $(COBJNAM)$@ $(SRC)\monstr.c $(O)mplayer.o: $(PCHO) $(SRC)\mplayer.c $(HACK_H) $(O)muse.o: $(PCHO) $(SRC)\muse.c $(HACK_H) $(O)music.o: $(PCHO) $(SRC)\music.c $(HACK_H) $(O)o_init.o: $(PCHO) $(SRC)\o_init.c $(HACK_H) $(LEV_H) $(O)objects.o: $(SRC)\objects.c $(CONFIG_H) $(OBJ_H) $(OBJCLASS_H) \ $(PROP_H) $(COLOR_H) $(CC) $(CFLAGSN) $$($(@B)_o) $(COBJNAM)$@ $(SRC)\objects.c $(O)options.o: $(SRC)\options.c $(HACK_H) $(TERMCAP_H) $(OBJCLASS_H) $(CC) $(CFLAGSN) $$($(@B)_o) $(COBJNAM)$@ $(SRC)\options.c $(O)pager.o: $(SRC)\pager.c $(HACK_H) $(DLB_H) $(CC) $(CFLAGNO) $(COBJNAM)$@ $$($(@B)_o) $(SRC)\pager.c $(O)pickup.o: $(PCHO) $(SRC)\pickup.c $(HACK_H) $(O)pray.o: $(PCHO) $(SRC)\pray.c $(HACK_H) $(EPRI_H) $(O)quest.o: $(PCHO) $(SRC)\quest.c $(HACK_H) $(QUEST_H) $(QTEXT_H) $(O)questpgr.o: $(PCHO) $(SRC)\questpgr.c $(HACK_H) $(QTEXT_H) $(DLB_H) $(O)rect.o: $(PCHO) $(SRC)\rect.c $(HACK_H) $(O)restore.o: $(PCHO) $(SRC)\restore.c $(HACK_H) $(LEV_H) $(TERMCAP_H) \ $(QUEST_H) $(O)rip.o: $(PCHO) $(SRC)\rip.c $(HACK_H) $(O)rumors.o: $(PCHO) $(SRC)\rumors.c $(HACK_H) $(DLB_H) $(O)save.o: $(PCHO) $(SRC)\save.c $(HACK_H) $(LEV_H) $(QUEST_H) $(O)sit.o: $(PCHO) $(SRC)\sit.c $(HACK_H) $(ARTIFACT_H) $(O)sp_lev.o: $(PCHO) $(SRC)\sp_lev.c $(HACK_H) $(SP_LEV_H) $(DLB_H) $(O)spell.o: $(PCHO) $(SRC)\spell.c $(HACK_H) $(O)teleport.o: $(PCHO) $(SRC)\teleport.c $(HACK_H) # check dep $(O)tile.o: $(PCHO) $(SRC)\tile.c $(HACK_H) $(O)topten.o: $(PCHO) $(SRC)\topten.c $(HACK_H) $(DLB_H) $(PATCHLEVEL_H) $(O)u_init.o: $(PCHO) $(SRC)\u_init.c $(HACK_H) $(O)uhitm.o: $(PCHO) $(SRC)\uhitm.c $(HACK_H) $(O)version.o: $(PCHO) $(SRC)\version.c $(HACK_H) $(PATCHLEVEL_H) $(O)vision.o: $(PCHO) $(SRC)\vision.c $(HACK_H) $(VIS_TAB_H) $(O)vis_tab.o: $(SRC)\vis_tab.c $(HACK_H) $(VIS_TAB_H) $(CC) $(CFLAGSN) $$($(@B)_o) $(COBJNAM)$@ $(SRC)\vis_tab.c $(O)wield.o: $(PCHO) $(SRC)\wield.c $(HACK_H) $(O)windows.o: $(PCHO) $(SRC)\windows.c $(HACK_H) $(WINTTY_H) $(O)worm.o: $(PCHO) $(SRC)\worm.c $(HACK_H) $(LEV_H) $(O)worn.o: $(PCHO) $(SRC)\worn.c $(HACK_H) $(O)write.o: $(PCHO) $(SRC)\write.c $(HACK_H) # # Overlays # # OVL0 # $(O)allmain.0: $(PCH0) $(SRC)\allmain.c $(HACK_H) $(O)apply.0: $(PCH0) $(SRC)\apply.c $(HACK_H) $(EDOG_H) $(O)artifact.0: $(PCH0) $(SRC)\artifact.c $(HACK_H) $(ARTIFACT_H) $(ARTILIST_H) $(O)attrib.0: $(PCH0) $(SRC)\attrib.c $(HACK_H) $(O)botl.0: $(PCH0) $(SRC)\botl.c $(HACK_H) $(O)cmd.0: $(PCH0) $(SRC)\cmd.c $(HACK_H) $(FUNC_TAB_H) $(O)dbridge.0: $(PCH0) $(SRC)\dbridge.c $(HACK_H) $(O)do.0: $(PCH0) $(SRC)\do.c $(HACK_H) $(LEV_H) $(O)do_name.0: $(PCH0) $(SRC)\do_name.c $(HACK_H) $(O)do_wear.0: $(PCH0) $(SRC)\do_wear.c $(HACK_H) $(O)dogmove.0: $(PCH0) $(SRC)\dogmove.c $(HACK_H) $(MFNDPOS_H) $(EDOG_H) $(O)dungeon.0: $(PCH0) $(SRC)\dungeon.c $(HACK_H) $(ALIGN_H) $(DGN_FILE_H) \ $(DLB_H) $(O)eat.0: $(PCH0) $(SRC)\eat.c $(HACK_H) $(O)engrave.0: $(PCH0) $(SRC)\engrave.c $(HACK_H) $(LEV_H) $(O)explode.0: $(PCH0) $(SRC)\explode.c $(HACK_H) $(O)hacklib.0: $(PCH0) $(SRC)\hacklib.c $(HACK_H) $(O)invent.0: $(PCH0) $(SRC)\invent.c $(HACK_H) $(ARTIFACT_H) $(O)lock.0: $(PCH0) $(SRC)\lock.c $(HACK_H) $(O)mail.0: $(PCH0) $(SRC)\mail.c $(HACK_H) $(MAIL_H) $(O)makemon.0: $(PCH0) $(SRC)\makemon.c $(HACK_H) $(EPRI_H) $(EMIN_H) $(O)mcastu.0: $(PCH0) $(SRC)\mcastu.c $(HACK_H) $(O)mhitm.0: $(PCH0) $(SRC)\mhitm.c $(HACK_H) $(ARTIFACT_H) $(EDOG_H) $(O)mhitu.0: $(PCH0) $(SRC)\mhitu.c $(HACK_H) $(ARTIFACT_H) $(EDOG_H) $(O)mkobj.0: $(PCH0) $(SRC)\mkobj.c $(HACK_H) $(ARTIFACT_H) $(PROP_H) $(O)mkroom.0: $(PCH0) $(SRC)\mkroom.c $(HACK_H) $(O)mon.0: $(PCH0) $(SRC)\mon.c $(HACK_H) $(MFNDPOS_H) $(EDOG_H) $(O)mondata.0: $(PCH0) $(SRC)\mondata.c $(HACK_H) $(ESHK_H) $(EPRI_H) $(O)monmove.0: $(PCH0) $(SRC)\monmove.c $(HACK_H) $(MFNDPOS_H) $(ARTIFACT_H) $(O)mthrowu.0: $(PCH0) $(SRC)\mthrowu.c $(HACK_H) $(O)objnam.0: $(PCH0) $(SRC)\objnam.c $(HACK_H) $(O)polyself.0: $(PCH0) $(SRC)\polyself.c $(HACK_H) $(O)priest.0: $(PCH0) $(SRC)\priest.c $(HACK_H) $(MFNDPOS_H) $(ESHK_H) \ $(EPRI_H) $(EMIN_H) $(O)rnd.0: $(PCH0) $(SRC)\rnd.c $(HACK_H) $(O)shk.0: $(PCH0) $(SRC)\shk.c $(HACK_H) $(ESHK_H) $(O)shknam.0: $(PCH0) $(SRC)\shknam.c $(HACK_H) $(ESHK_H) $(O)sounds.0: $(PCH0) $(SRC)\sounds.c $(HACK_H) $(EDOG_H) $(O)steal.0: $(PCH0) $(SRC)\steal.c $(HACK_H) $(O)timeout.0: $(PCH0) $(SRC)\timeout.c $(HACK_H) $(LEV_H) $(O)track.0: $(PCH0) $(SRC)\track.c $(HACK_H) $(O)trap.0: $(PCH0) $(SRC)\trap.c $(HACK_H) $(O)vault.0: $(PCH0) $(SRC)\vault.c $(HACK_H) $(VAULT_H) $(O)weapon.0: $(PCH0) $(SRC)\weapon.c $(HACK_H) $(O)were.0: $(PCH0) $(SRC)\were.c $(HACK_H) $(O)wizard.0: $(PCH0) $(SRC)\wizard.c $(HACK_H) $(QTEXT_H) $(O)zap.0: $(PCH0) $(SRC)\zap.c $(HACK_H) # # OVL1 # $(O)allmain.1: $(PCH1) $(SRC)\allmain.c $(HACK_H) $(O)apply.1: $(PCH1) $(SRC)\apply.c $(HACK_H) $(EDOG_H) $(O)artifact.1: $(PCH1) $(SRC)\artifact.c $(HACK_H) $(ARTIFACT_H) $(ARTILIST_H) $(O)attrib.1: $(PCH1) $(SRC)\attrib.c $(HACK_H) $(O)botl.1: $(PCH1) $(SRC)\botl.c $(HACK_H) $(O)cmd.1: $(PCH1) $(SRC)\cmd.c $(HACK_H) $(FUNC_TAB_H) $(O)dbridge.1: $(PCH1) $(SRC)\dbridge.c $(HACK_H) $(O)do.1: $(PCH1) $(SRC)\do.c $(HACK_H) $(LEV_H) $(O)do_wear.1: $(PCH1) $(SRC)\do_wear.c $(HACK_H) $(O)dog.1: $(PCH1) $(SRC)\dog.c $(HACK_H) $(EDOG_H) $(O)dungeon.1: $(PCH1) $(SRC)\dungeon.c $(HACK_H) $(ALIGN_H) $(DGN_FILE_H) $(DLB_H) $(O)eat.1: $(PCH1) $(SRC)\eat.c $(HACK_H) $(O)engrave.1: $(PCH1) $(SRC)\engrave.c $(HACK_H) $(LEV_H) $(O)explode.1: $(PCH1) $(SRC)\explode.c $(HACK_H) $(O)hack.1: $(PCH1) $(SRC)\hack.c $(HACK_H) $(O)hacklib.1: $(PCH1) $(SRC)\hacklib.c $(HACK_H) $(O)invent.1: $(PCH1) $(SRC)\invent.c $(HACK_H) $(ARTIFACT_H) $(O)makemon.1: $(PCH1) $(SRC)\makemon.c $(HACK_H) $(EPRI_H) $(EMIN_H) $(O)mhitu.1: $(PCH1) $(SRC)\mhitu.c $(HACK_H) $(ARTIFACT_H) $(EDOG_H) $(O)mkobj.1: $(PCH1) $(SRC)\mkobj.c $(HACK_H) $(ARTIFACT_H) $(PROP_H) $(O)mon.1: $(PCH1) $(SRC)\mon.c $(HACK_H) $(MFNDPOS_H) $(EDOG_H) $(O)mondata.1: $(PCH1) $(SRC)\mondata.c $(HACK_H) $(ESHK_H) $(EPRI_H) $(O)monmove.1: $(PCH1) $(SRC)\monmove.c $(HACK_H) $(MFNDPOS_H) $(ARTIFACT_H) $(O)mthrowu.1: $(PCH1) $(SRC)\mthrowu.c $(HACK_H) $(O)objnam.1: $(PCH1) $(SRC)\objnam.c $(HACK_H) $(O)polyself.1: $(PCH1) $(SRC)\polyself.c $(HACK_H) $(O)rnd.1: $(PCH1) $(SRC)\rnd.c $(HACK_H) $(O)shk.1: $(PCH1) $(SRC)\shk.c $(HACK_H) $(ESHK_H) $(O)steal.1: $(PCH1) $(SRC)\steal.c $(HACK_H) $(O)timeout.1: $(PCH1) $(SRC)\timeout.c $(HACK_H) $(LEV_H) $(O)track.1: $(PCH1) $(SRC)\track.c $(HACK_H) $(O)trap.1: $(PCH1) $(SRC)\trap.c $(HACK_H) $(O)weapon.1: $(PCH1) $(SRC)\weapon.c $(HACK_H) $(O)zap.1: $(PCH1) $(SRC)\zap.c $(HACK_H) # # OVL2 # $(O)attrib.2: $(PCH2) $(SRC)\attrib.c $(HACK_H) $(O)do.2: $(PCH2) $(SRC)\do.c $(HACK_H) $(LEV_H) $(O)do_name.2: $(PCH2) $(SRC)\do_name.c $(HACK_H) $(O)do_wear.2: $(PCH2) $(SRC)\do_wear.c $(HACK_H) $(O)dog.2: $(PCH2) $(SRC)\dog.c $(HACK_H) $(EDOG_H) $(O)engrave.2: $(PCH2) $(SRC)\engrave.c $(HACK_H) $(LEV_H) $(O)hack.2: $(PCH2) $(SRC)\hack.c $(HACK_H) $(O)hacklib.2: $(PCH2) $(SRC)\hacklib.c $(HACK_H) $(O)invent.2: $(PCH2) $(SRC)\invent.c $(HACK_H) $(ARTIFACT_H) $(O)makemon.2: $(PCH2) $(SRC)\makemon.c $(HACK_H) $(EPRI_H) $(EMIN_H) $(O)mon.2: $(PCH2) $(SRC)\mon.c $(HACK_H) $(MFNDPOS_H) $(EDOG_H) $(O)mondata.2: $(PCH2) $(SRC)\mondata.c $(HACK_H) $(ESHK_H) $(EPRI_H) $(O)monmove.2: $(PCH2) $(SRC)\monmove.c $(HACK_H) $(MFNDPOS_H) $(ARTIFACT_H) $(O)shk.2: $(PCH2) $(SRC)\shk.c $(HACK_H) $(ESHK_H) $(O)trap.2: $(PCH2) $(SRC)\trap.c $(HACK_H) $(O)zap.2: $(PCH2) $(SRC)\zap.c $(HACK_H) # # OVL3 # $(O)do.3: $(PCH3) $(SRC)\do.c $(HACK_H) $(LEV_H) $(O)hack.3: $(PCH3) $(SRC)\hack.c $(HACK_H) $(O)invent.3: $(PCH3) $(SRC)\invent.c $(HACK_H) $(ARTIFACT_H) $(O)light.3: $(PCH3) $(SRC)\light.c $(HACK_H) $(O)shk.3: $(PCH3) $(SRC)\shk.c $(HACK_H) $(ESHK_H) $(O)trap.3: $(PCH3) $(SRC)\trap.c $(HACK_H) $(O)zap.3: $(PCH3) $(SRC)\zap.c $(HACK_H) # # OVLB # $(O)allmain.B: $(PCHB) $(SRC)\allmain.c $(HACK_H) $(O)apply.B: $(PCHB) $(SRC)\apply.c $(HACK_H) $(EDOG_H) $(O)artifact.B: $(PCHB) $(SRC)\artifact.c $(HACK_H) $(ARTIFACT_H) $(ARTILIST_H) $(O)attrib.B: $(PCHB) $(SRC)\attrib.c $(HACK_H) $(O)botl.B: $(PCHB) $(SRC)\botl.c $(HACK_H) $(O)cmd.B: $(PCHB) $(SRC)\cmd.c $(HACK_H) $(FUNC_TAB_H) $(O)dbridge.B: $(PCHB) $(SRC)\dbridge.c $(HACK_H) $(O)do.B: $(PCHB) $(SRC)\do.c $(HACK_H) $(LEV_H) $(O)do_name.B: $(PCHB) $(SRC)\do_name.c $(HACK_H) $(O)do_wear.B: $(PCHB) $(SRC)\do_wear.c $(HACK_H) $(O)dog.B: $(PCHB) $(SRC)\dog.c $(HACK_H) $(EDOG_H) $(O)dogmove.B: $(PCHB) $(SRC)\dogmove.c $(HACK_H) $(MFNDPOS_H) $(EDOG_H) $(O)eat.B: $(PCHB) $(SRC)\eat.c $(HACK_H) $(O)engrave.B: $(PCHB) $(SRC)\engrave.c $(HACK_H) $(LEV_H) $(O)hack.B: $(PCHB) $(SRC)\hack.c $(HACK_H) $(O)hacklib.B: $(PCHB) $(SRC)\hacklib.c $(HACK_H) $(O)invent.B: $(PCHB) $(SRC)\invent.c $(HACK_H) $(ARTIFACT_H) $(O)lock.B: $(PCHB) $(SRC)\lock.c $(HACK_H) $(O)mail.B: $(PCHB) $(SRC)\mail.c $(HACK_H) $(MAIL_H) $(O)makemon.B: $(PCHB) $(SRC)\makemon.c $(HACK_H) $(EPRI_H) $(EMIN_H) $(O)mcastu.B: $(PCHB) $(SRC)\mcastu.c $(HACK_H) $(O)mhitm.B: $(PCHB) $(SRC)\mhitm.c $(HACK_H) $(ARTIFACT_H) $(EDOG_H) $(O)mhitu.B: $(PCHB) $(SRC)\mhitu.c $(HACK_H) $(ARTIFACT_H) $(EDOG_H) $(O)mkobj.B: $(PCHB) $(SRC)\mkobj.c $(HACK_H) $(ARTIFACT_H) $(PROP_H) $(O)mkroom.B: $(PCHB) $(SRC)\mkroom.c $(HACK_H) $(O)mon.B: $(PCHB) $(SRC)\mon.c $(HACK_H) $(MFNDPOS_H) $(EDOG_H) $(O)mondata.B: $(PCHB) $(SRC)\mondata.c $(HACK_H) $(ESHK_H) $(EPRI_H) $(O)monmove.B: $(PCHB) $(SRC)\monmove.c $(HACK_H) $(MFNDPOS_H) $(ARTIFACT_H) $(O)mthrowu.B: $(PCHB) $(SRC)\mthrowu.c $(HACK_H) $(O)objnam.B: $(PCHB) $(SRC)\objnam.c $(HACK_H) $(O)pline.B: $(SRC)\pline.c $(HACK_H) $(EPRI_H) $(CC) $(CFLAGSN) $$($(@B)_b) $(COBJNAM)$@ $(SRC)\pline.c $(O)polyself.B: $(PCHB) $(SRC)\polyself.c $(HACK_H) $(O)potion.B: $(PCHB) $(SRC)\potion.c $(HACK_H) $(O)priest.B: $(PCHB) $(SRC)\priest.c $(HACK_H) $(MFNDPOS_H) $(ESHK_H) \ $(EPRI_H) $(EMIN_H) $(O)read.B: $(PCHB) $(SRC)\read.c $(HACK_H) $(O)rnd.B: $(PCHB) $(SRC)\rnd.c $(HACK_H) $(O)shk.B: $(PCHB) $(SRC)\shk.c $(HACK_H) $(ESHK_H) $(O)shknam.B: $(PCHB) $(SRC)\shknam.c $(HACK_H) $(ESHK_H) $(O)sounds.B: $(PCHB) $(SRC)\sounds.c $(HACK_H) $(EDOG_H) $(O)steal.B: $(PCHB) $(SRC)\steal.c $(HACK_H) $(O)timeout.B: $(PCHB) $(SRC)\timeout.c $(HACK_H) $(LEV_H) $(O)track.B: $(PCHB) $(SRC)\track.c $(HACK_H) $(O)trap.B: $(PCHB) $(SRC)\trap.c $(HACK_H) $(O)vault.B: $(PCHB) $(SRC)\vault.c $(HACK_H) $(VAULT_H) $(O)weapon.B: $(PCHB) $(SRC)\weapon.c $(HACK_H) $(O)were.B: $(PCHB) $(SRC)\were.c $(HACK_H) $(O)wizard.B: $(PCHB) $(SRC)\wizard.c $(HACK_H) $(QTEXT_H) $(O)zap.B: $(PCHB) $(SRC)\zap.c $(HACK_H) # end of file slashem-0.0.7E7F3/sys/msdos/NHAccess.nh0000664000076400007640000001043110545462317015574 0ustar aliali# 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. # # Modified defaults.nh for blind access. Copy to working directory as # defaults.nh. # # A '#' at the beginning of a line means the rest of the line is a comment. # # This configuration file is set up for two cases, for a hard disk # (as drive C:), and for two floppy disks. # # Some options MUST be set in this file, other options can be toggled while # playing. For a list of options available see the file. If # the game plays slowly you might notice some improvement by setting # !time and !showexp, which will reduce screen I/O somewhat. # # To change the configuration, comment out the unwanted lines, and # uncomment the configuration you want. # *** OPTIONS *** # # The three options on this line should be used for most setups. # If your machine isn't very IBM-compatible, and NetHack doesn't work, # try commenting out this line. # # Note to blind players: # # Turn off IBMgraphics, using the exclamation-mark, as done below. # OPTIONS=rawio,BIOS,!IBMgraphics # Some versions of NetHack use the pc speaker to play the notes given when # playing music instruments in NetHack. To use this feature, if available, # uncomment the following line: #OPTIONS=soundcard:autodetect # If your machine is NEC PC-9800, use: #OPTIONS=rawio,BIOS,video:default # # # General options. You might also set "silent" so as not to attract # the boss's attention. # # Note for blind players: # # A lot of speech access programs use the number-pad to review the screen. # If this is the case, exclamation-mark out the number_pad option (as done # below) and use the traditional Rogue-like commands. # OPTIONS=notime,noshowexp,!number_pad,lit_corridor,!rest_on_space # # # 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. # # Note to blind players: # # Use menustyle:traditional for the best interface to speech synthesizers. # #OPTIONS=name:Janet-V,female,dogname:Fido,catname:Morris,fruit:apricot #OPTIONS=autopickup,pickup_types:$"=/!?+ #OPTIONS=packorder:")[%?+/=!(*0_` #OPTIONS=scores:10 top/2 around/own #OPTIONS=nolegacy,noverbose OPTIONS=nolegacy,menustyle:traditional # *** HARD DISK CONFIGURATION *** # #HACKDIR=c:\games\nethack # # Note: Under MSDOS ports HACKDIR defaults to the location # of the NetHack.exe file. Setting HACKDIR above will override that. # # LEVELS and SAVE default to HACKDIR # #LEVELS=c:\games\nethack\bones #SAVE=c:\games\nethack\bones;n # # appending a ";n" to SAVE means don't prompt to insert a disk. SAVE=;n # # Note that RAMDISK must *not* be the same (or even implicitly # get expanded to the same path by the OS) as HACKDIR. # #RAMDISK=d: # *** 2-FLOPPY CONFIGURATION *** # # HACKDIR=a:\ # LEVELS=b:\ # SAVE=b:\ # RAMDISK=c: # *** CHARACTER GRAPHICS *** # # See the on-line help or the Guidebook for which symbols are in which # positions. # # Note to blind players: # # You very probably do not want to use these character graphics. # # If you merely set the IBMgraphics option, 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. # #DUNGEON= 032 124 045 124 124 124 124 045 045 045 \ # 124 124 046 045 124 043 043 035 035 046 \ # 035 035 060 062 060 062 095 124 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 # ================================================= # *** VIDEOCOLORS AND VIDEOSHADES *** # # While playing on NEC PC-9800, default game display may be difficult to # read. Try following setting. # #OPTIONS=videocolors:4-2-6-1-5-3-4-2-6-1-5-3,videoshades:normal-normal-normal slashem-0.0.7E7F3/sys/msdos/vidalleg.c0000664000076400007640000016741710545462317015572 0ustar aliali/* SCCS Id: @(#)vidalleg.c 3.4 - 1.5 96/02/16 */ /* Copyright (c) NetHack PC Development Team 1995 */ /* NetHack may be freely redistributed. See license for details. */ /* AllegroHack (c) Kelly Youngblood 2000 */ /* AllegroHack is licensed on the same terms as nethack, again, see license for details. */ /* * vidalleg.c - Video using Allegro library */ #define COPYRIGHT_BANNER_D "Based on AllegroHack v1.5 By Kelly Youngblood." #include "hack.h" #include "epri.h" #include #ifdef ALLEGRO_USE_AA # include #endif #ifdef SHORT_FILENAMES #include "patchlev.h" #else #include "patchlevel.h" #endif #include #include #include "wintty.h" #include "pcvideo.h" #include "tile.h" void nh_stretch_blit(BITMAP *, BITMAP *, int, int, int, int, int, int, int, int); #ifdef ALLEGRO_USE_AA #define nh_stretch_sprite aa_stretch_sprite #else #define aa_stretch_blit stretch_blit #define nh_stretch_sprite stretch_sprite #endif /* accessory functions */ #include "alnames.h" #include "alfuncs.h" #include "loadfont.h" /* As Allegro works only with the DJGPP compiler, overlay support and support for non-DJGPP compilers isn't needed. */ /* prototypes */ int FDECL(alleg_swallowed,(int,int)); STATIC_DCL void FDECL(alleg_redrawmap,(BOOLEAN_P)); STATIC_DCL void NDECL(alleg_full_redraw); STATIC_DCL void NDECL(alleg_load_cnf); void FDECL(alleg_cliparound,(int,int)); STATIC_DCL void FDECL(alleg_scrollmap,(BOOLEAN_P)); STATIC_DCL void NDECL(positionbar); STATIC_DCL void NDECL(init_progress_meter); STATIC_DCL void NDECL(inc_progress_meter); STATIC_DCL void FDECL(alleg_printGlyph_at, (int,int,int)); /* row, col, level */ #define PRINT_BACKGROUND 1 #define PRINT_FOREGROUND 2 STATIC_DCL int FDECL(alleg_SwitchMode,(int)); #define ALLEG_MODETEXT 0 #define ALLEG_MODEGFX 1 #define ALLEG_MODE_NONE -1 #define FLOOR_GLYPH cmap_to_glyph(S_room) /* Settings */ static int video_mode = GFX_AUTODETECT; static int smoothing = 0; /* slightly smoother scrolling */ static int hud_setting = 0; /* HUD status */ static int fx_delay = 1; /* vsyncs per animation frame */ static int alleg_colordepth = 16; /* color depth 15-32 */ static int X_RES = 640; /* X resolution min 640 */ static int Y_RES = 480; /* Y resolution min 400 */ static int X_WIDTH = 640; /* viewport sixe, automatically set */ static int Y_HEIGHT = 480; /* viewport sixe, automatically set */ static int attrib_allegro_normal = CLR_CYAN; /* was ATTRIB_VGA_NORMAL */ static int attrib_allegro_intense = CLR_BRIGHT_MAGENTA; /* was ATTRIB_VGA_INTENSE */ static int attrib_allegro_status = CLR_BRIGHT_BLUE; /* was ATTRIB_STATUS */ static int scroll_lim = 0; /* how many pixels to wait before a scroll*/ static int need_update = 0; /* screen-update code flag */ static int no_update = 0; static int did_update = 0; /* cursor-drawing code flag */ static int tiles_loaded = 0; /* initialization flag */ static int player_dead = 0; /* darken the screen if true */ static int fancy_meters = 1; static int faded_out = 0; static int use_2xsai = 0; /* use 2xsai interpolation routines */ static int draw_3Dtiles = -1; static PALETTE tilepal; /* Save the palette of the tile file */ /* * When draw_3Dtiles is on, this switches the system into "pseudo-3D" tile mode * This currently uses 3D tiles that are 48x64, and are put onto the screen * in an overlapping manner (top ones furthest back, left on top of right) * * It kinda looks like this (from the GTK winport) BIG3DTILE +----------+ ^ / /| | / / | | / / | | / / | *6 / / | | +----------+ + | ^ | | / ^ | | | | / | | *2 | | / *4 | | | | / | v v | |/ v +----------+ <-- *1 --> <-*3-> <-- *5 --> *1 = 3D_WIDTH = 32 = tile_x * 2 / 3 *2 = 3D_HEIGHT = 32 = tile_y / 2 *3 = 3D_OFFSETX = 16 = tile_x - tile_y / 2 *4 = 3D_OFFSETY = 32 = tile_y / 2 *5 = WIDTH = 48 = tile_x *6 = HEIGHT = 64 = tile_y */ #define TILE_3D_WIDTH (tile_x * 2 / 3) #define TILE_3D_HEIGHT (tile_y / 2) #define TILE_3D_OFFSETX (tile_x - TILE_3D_WIDTH) #define TILE_3D_OFFSETY (tile_y - TILE_3D_HEIGHT) /* * Global Variables */ extern int clipx, clipxmax; /* current clipping column from wintty.c */ extern boolean clipping; /* clipping on? from wintty.c */ extern int curcol,currow; /* current column and row */ extern int g_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 */ extern int attrib_gr_intense; /* graphics mode intense attribute */ extern boolean inmap; /* in the map window */ extern short glyph2tile[MAX_GLYPH]; extern long colorpal[16]; int tile_x = 0; int tile_y = 0; STATIC_VAR int TILEX = 0; STATIC_VAR int TILEY = 0; int font_x, font_y; static const char *default_tilesets[] = { "slam3d.bmp", "slam32.bmp", "slam16.bmp" }; #define TILEDIR "tiles\\" #define EXT ".bmp" #define FONTX 8 #define FONTY 16 STATIC_VAR struct map_struct { int glyph; int ch; int attr; } map[ROWNO][COLNO]; /* track the glyphs */ # define alleg_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 /* The following are macros that convert from x, y pixel coordinates * to their 3D versions * posx = normal x position = col * tile_x * posy = normal y position = row * tile_y */ #define posxy_to_posx3d(posx, posy) \ (((posx) * TILE_3D_WIDTH)/tile_x + \ (ROWNO+TOP_MAP_ROW)*TILE_3D_OFFSETX - \ ((posy) * TILE_3D_OFFSETX/tile_y)) #define posxy3d_to_posx(posx3d, posy3d) \ (((posx3d) - \ (ROWNO+TOP_MAP_ROW)*TILE_3D_OFFSETX + \ ((posy3d)*TILE_3D_OFFSETX/TILE_3D_HEIGHT)) * tile_x \ / TILE_3D_WIDTH) #define colrow_to_posx3d(col, row) (posxy_to_posx3d(((col) * tile_x), ((row) * tile_y))) #define col_to_maxx3d(col) (posxy_to_posx3d(((col) * tile_x), 0)) #define posy_to_posy3d(posy) (((posy) * TILE_3D_HEIGHT) / tile_y) #define posy3d_to_posy(posy3d) (((posy3d) * tile_y) / TILE_3D_HEIGHT) #define row_to_posy3d(row) (posy_to_posy3d((row) * tile_y)) #define row_to_maxy3d(row) (posy_to_posy3d((row) * tile_y)) static int clipwinx, clipwiny; static BITMAP *subscreen = (BITMAP *)0; static BITMAP *txt_subscreen = (BITMAP *)0; static BITMAP *tile_subscreen = (BITMAP *)0; static BITMAP *minimap = (BITMAP *)0; static BITMAP *under_cursor = (BITMAP *)0; static BITMAP *cursorbmp = (BITMAP *)0; static BITMAP *ovcursor = (BITMAP *)0; static BITMAP *font_cursor = (BITMAP *)0; static BITMAP *errorbmp = (BITMAP *)0; static BITMAP *tilecache[TOTAL_TILES_USED]; static BITMAP *explosions[10]; static BITMAP *shields[16]; static BITMAP *auras[8][28]; static BITMAP *hudwidgets[4]; static BITMAP *mapwidgets[3]; static BITMAP *alltiles = (BITMAP *)0; /* Holds the combined tiles file */ /* blender colormaps for 256 color mode */ static COLOR_MAP half_solidity; static char bigtile_file[BUFSZ] = ""; #define ON32 0 #define OFF32 1 #define ON16 2 #define OFF16 3 #define MW_U 0 #define MW_UP 1 #define MW_DOWN 2 int alleg_detect() { boolean retval; alleg_load_cnf(); set_color_depth(alleg_colordepth); retval = !((alleg_SwitchMode(ALLEG_MODEGFX)) < 0); (void) alleg_SwitchMode(ALLEG_MODETEXT); return(retval); } void alleg_backsp() { int col,row; col = curcol; /* Character cell row and column */ row = currow; if (col > 0) col = col-1; alleg_gotoloc(col,row); alleg_xputc(' ',colorpal[g_attribute]); alleg_gotoloc(col,row); } void alleg_clear_screen(colour) int colour; { clear_to_color(screen, colour); clear_to_color(subscreen, colour); clear_to_color(minimap, makecol(0,0,0)); if (iflags.tile_view) alleg_clearmap(); alleg_gotoloc(0,0); /* is this needed? */ } void alleg_cl_end(col,row) /* clear to end of line */ int col,row; { int count; /* * This is being done via character writes. * This should perhaps be optimized for speed by using VGA write * mode 2 methods as did clear_screen() */ for (count = col; count < (CO-1); ++count) { alleg_WriteChar(' ',count,row,BACKGROUND_ALLEGRO_COLOR); } } void alleg_cl_eos(cy) /* clear to end of screen */ int cy; { int count; cl_end(); while(cy <= LI-2) { for (count = 0; count < (CO-1); ++count) { alleg_WriteChar(' ',count,cy, BACKGROUND_ALLEGRO_COLOR); } cy++; } } void alleg_tty_end_screen() { /* vga_clear_screen(BACKGROUND_ALLEGRO_COLOR); */ (void) alleg_SwitchMode(ALLEG_MODETEXT); } void alleg_get_scr_size() { CO = X_RES/FONTX; LI = Y_RES/FONTY; } void alleg_tty_startup(wid, hgt) int *wid, *hgt; { CO = X_RES/FONTX; LI = Y_RES/FONTY; *wid = CO; *hgt = LI; clipx = 0; clipxmax = CO - 1; attrib_gr_normal = attrib_allegro_normal; attrib_gr_intense = attrib_allegro_intense; g_attribute = attrib_gr_normal; /* Give it a starting value */ } /* * Screen output routines (these are heavily used). * * These are the 3 routines used to place information on the screen * in the VGA PC tty port of NetHack. These are the routines * that get called by the general interface routines in video.c. * * alleg_xputs -Writes a c null terminated string at the current location. * * alleg_xputc -Writes a single character at the current location. Since * various places in the code assume that control characters * can be used to control, we are forced to interpret some of * the more common ones, in order to keep things looking correct. * * alleg_xputg -This routine is used to display a graphical representation of a * NetHack glyph (a tile) at the current location. For more * information on NetHack glyphs refer to the comments in * include/display.h. * */ #if 0 /* in 2xSai.c */ inline long Q_INTERPOLATE(long A, long B, long C, long D) { register long qcolorMask = 0xE79CE79C; register long qlowpixelMask = 0x18631863; register long x = ((A & qcolorMask) >> 2) + ((B & qcolorMask) >> 2) + ((C & qcolorMask) >> 2) + ((D & qcolorMask) >> 2); register long y = (A & qlowpixelMask) + (B & qlowpixelMask) + (C & qlowpixelMask) + (D & qlowpixelMask); y = (y>>2) & qlowpixelMask; return x+y; } #endif #define alleg_text(s,x,y,color) textout(screen, font, s, x, y, color) /* Magenta-Blue-Cyan gradient for energy bars */ long MBC(n) int n; { long c; if(n >= 512) c = makecol(0,255,255); else if(n < 256) c = makecol(255-n,0,255); else c = makecol(0, n-256, 255); return c; } /* Red-Yellow-Green gradient for health bars */ long RYG(n) int n; { long c; if(n >= 512) c = makecol(0,255,0); else if(n < 256) c = makecol(255,n,0); else c = makecol(511-n, 255, 0); return c; } void drawbars() { int maxx; int hmax = max((Upolyd ? u.mhmax : u.uhpmax), 1); int emax = max(u.uenmax, 1); int hcur = (Upolyd ? u.mh : u.uhp); BITMAP *healthbar = create_bitmap(hmax, 1); BITMAP *energybar = create_bitmap(u.uenmax, 1); int i; long hpfact = 512*hcur; long enfact = 512*u.uen; int hcolor = RYG(hpfact/(long)hmax); int ecolor = MBC(enfact/(long)emax); if(hud_setting == 2) maxx = X_RES-81; else if (hud_setting) maxx = X_RES-97; else maxx = X_RES-1; clear_to_color(healthbar,makecol(0,0,0)); clear_to_color(energybar,makecol(0,0,0)); if(!fancy_meters) { hline(healthbar, 0, 0, hcur, hcolor); hline(energybar, 0, 0, u.uen, ecolor); } else { for(i = 0; i < hcur; i++) putpixel(healthbar, i, 0, RYG((i*512L)/(long)hmax)); for(i = 0; i < u.uen; i++) putpixel(energybar, i, 0, MBC((i*512L)/(long)emax)); } rect(screen, 0, Y_RES-48, maxx, Y_RES-41, hcolor); rect(screen, 0, Y_RES-40, maxx, Y_RES-33, ecolor); nh_stretch_blit(healthbar, screen, 0, 0, hmax, 1, 1, Y_RES-47, maxx-1, 6); nh_stretch_blit(energybar, screen, 0, 0, emax, 1, 1, Y_RES-39, maxx-1, 6); destroy_bitmap(healthbar); destroy_bitmap(energybar); } void alleg_stats(s1, row) char *s1; int row; { int y, s2siz, maxx; char *s2 = (char *) 0; if (row == 0) { char* bp; /* Find St: */ bp = s2 = index(s1, ':') - 2; for (bp--; *(bp - 1) == ' '; bp--); *bp = '\0'; } if (s2){ s2siz = strlen(s2)*FONTX; } else { } if(hud_setting == 2) maxx = X_RES-81; else if (hud_setting) maxx = X_RES-97; else maxx = X_RES-1; if(row) y = Y_RES-FONTY; else y = Y_RES-FONTY*2; if(row) drawbars(); rectfill(screen, 0, y, X_RES, y+(FONTY-1), BACKGROUND_ALLEGRO_COLOR); alleg_text(s1, 0, y, colorpal[attrib_allegro_status]); if (s2) { alleg_text(" ", maxx-s2siz - FONTX, y, colorpal[attrib_allegro_status]); alleg_text(s2, maxx-s2siz, y, colorpal[attrib_allegro_status]); } } /* This assumes that the ON32 and the ON16 are 32x32 and 16x16 respectively * Will scale the object tiles as needed */ void draw_HUD() { int i=6; draw_sprite(screen, hudwidgets[ON32], X_RES-3*32, Y_RES-48); if(uwep) nh_stretch_sprite(screen, tilecache[glyph2tile[obj_to_glyph(uwep)]], X_RES-3*32, Y_RES-48, 32, 32); draw_sprite(screen, hudwidgets[ u.twoweap ? ON32 : OFF32], X_RES-2*32, Y_RES-48); if(uswapwep) nh_stretch_sprite(screen, tilecache[glyph2tile[obj_to_glyph(uswapwep)]], X_RES-2*32, Y_RES-48, 32, 32); if(uquiver && (is_missile(uquiver) || ammo_and_launcher(uquiver,uwep))) draw_sprite(screen, hudwidgets[ON32], X_RES-32, Y_RES-48); else draw_sprite(screen, hudwidgets[OFF32], X_RES-32, Y_RES-48); if(uquiver) stretch_sprite(screen, tilecache[glyph2tile[obj_to_glyph(uquiver)]], X_RES-32, Y_RES-48, 32, 32); if(uarms) { draw_sprite(screen, hudwidgets[ON16], X_RES-i*16, Y_RES-16); nh_stretch_sprite(screen, tilecache[glyph2tile[obj_to_glyph(uarms)]], X_RES-i*16, Y_RES-16, 16, 16); } else draw_sprite(screen, hudwidgets[OFF16], X_RES-i*16, Y_RES-16); i--; if(uarm || uskin #ifdef TOURIST /* this is still a #define! sheesh! */ || uarmu #endif ) { draw_sprite(screen, hudwidgets[ON16], X_RES-i*16, Y_RES-16); if(uskin) nh_stretch_sprite(screen, tilecache[glyph2tile[obj_to_glyph(uskin)]], X_RES-i*16, Y_RES-16, 16, 16); else if(uarm) nh_stretch_sprite(screen, tilecache[glyph2tile[obj_to_glyph(uarm)]], X_RES-i*16, Y_RES-16, 16, 16); #ifdef TOURIST else nh_stretch_sprite(screen, tilecache[glyph2tile[obj_to_glyph(uarmu)]], X_RES-i*16, Y_RES-16, 16, 16); #endif } else draw_sprite(screen, hudwidgets[OFF16], X_RES-i*16, Y_RES-16); i--; if(uarmc) { draw_sprite(screen, hudwidgets[ON16], X_RES-i*16, Y_RES-16); nh_stretch_sprite(screen, tilecache[glyph2tile[obj_to_glyph(uarmc)]], X_RES-i*16, Y_RES-16, 16, 16); } else draw_sprite(screen, hudwidgets[OFF16], X_RES-i*16, Y_RES-16); i--; if(uarmh) { draw_sprite(screen, hudwidgets[ON16], X_RES-i*16, Y_RES-16); nh_stretch_sprite(screen, tilecache[glyph2tile[obj_to_glyph(uarmh)]], X_RES-i*16, Y_RES-16, 16, 16); } else draw_sprite(screen, hudwidgets[OFF16], X_RES-i*16, Y_RES-16); i--; if(uarmg) { draw_sprite(screen, hudwidgets[ON16], X_RES-i*16, Y_RES-16); nh_stretch_sprite(screen, tilecache[glyph2tile[obj_to_glyph(uarmg)]], X_RES-i*16, Y_RES-16, 16, 16); } else draw_sprite(screen, hudwidgets[OFF16], X_RES-i*16, Y_RES-16); i--; if(uarmf) { draw_sprite(screen, hudwidgets[ON16], X_RES-i*16, Y_RES-16); nh_stretch_sprite(screen, tilecache[glyph2tile[obj_to_glyph(uarmf)]], X_RES-i*16, Y_RES-16, 16, 16); } else draw_sprite(screen, hudwidgets[OFF16], X_RES-i*16, Y_RES-16); return; } void draw_miniHUD() { draw_sprite(screen, hudwidgets[ON16], X_RES-3*32, Y_RES-48); if(uwep) nh_stretch_sprite(screen, tilecache[glyph2tile[obj_to_glyph(uwep)]], X_RES-3*32, Y_RES-48, 16, 16); draw_sprite(screen, hudwidgets[u.twoweap ? ON16 : OFF16], X_RES-3*32, Y_RES-32); if(uswapwep) nh_stretch_sprite(screen, tilecache[glyph2tile[obj_to_glyph(uswapwep)]], X_RES-3*32, Y_RES-32, 16, 16); if(uquiver && (is_missile(uquiver) || ammo_and_launcher(uquiver,uwep))) draw_sprite(screen, hudwidgets[ON16], X_RES-3*32, Y_RES-16); else draw_sprite(screen, hudwidgets[OFF16], X_RES-3*32, Y_RES-16); if(uquiver) nh_stretch_sprite(screen, tilecache[glyph2tile[obj_to_glyph(uquiver)]], X_RES-3*32, Y_RES-16, 16, 16); } void maybe_stairs(dmap,x,y,up) BITMAP *dmap; int x,y,up; { if(!levl[x][y].seenv) return; draw_sprite(dmap, mapwidgets[up ? MW_UP : MW_DOWN], x-2, y*2-2); return; } void draw_minimap() { BITMAP *dmap = create_bitmap(80,48); int mapwinx = clipwinx; int mapwiny = clipwiny; /* don't anti-alias */ stretch_blit(minimap, dmap, 0, 0, 80, 24, 0, 0, 80, 48); if (draw_3Dtiles && !iflags.traditional_view) { mapwinx = posxy3d_to_posx(clipwinx, clipwiny); mapwiny = posy3d_to_posy(clipwiny); } draw_sprite(dmap, mapwidgets[MW_U], u.ux-2, u.uy*2-2); rect(dmap, mapwinx/tile_x, (mapwiny/tile_y)*2-2, (mapwinx+X_RES)/tile_x, ((mapwiny+Y_HEIGHT)/tile_y)*2-2, colorpal[CLR_GREEN]); rect(dmap, 0, 0, 79, 47, colorpal[CLR_WHITE]); if(xdnstair) maybe_stairs(dmap,xdnstair,ydnstair,0); if(xdnladder) maybe_stairs(dmap,xdnstair,ydnstair,0); if(sstairs.sx) maybe_stairs(dmap,sstairs.sx,sstairs.sy,sstairs.up); if(xupstair) maybe_stairs(dmap,xupstair,yupstair,1); if(xupladder) maybe_stairs(dmap,xupladder,yupladder,1); blit(dmap, screen, 0, 0, X_RES-80, Y_RES-48, 80, 48); destroy_bitmap(dmap); } void display_HUD() { switch(hud_setting) { case 1: draw_HUD(); break; case 2: draw_minimap(); break; case 3: draw_minimap(); draw_miniHUD(); break; default: break; } } void cycleHUD() { hud_setting++; if(hud_setting > 3) hud_setting = 0; rectfill(screen, X_RES-96, Y_RES-48, X_RES-1, Y_RES-1, 0); bot(); display_HUD(); } void alleg_xputs(s,col,row) char *s; int col,row; { int x,y; x = min(col,(CO-1)); /* min() used protection from callers */ y = min(row,(LI-1)); if (s != (char *)0) { alleg_text(s, x*FONTX, y*FONTY, colorpal[g_attribute]); } } void alleg_xputc(ch,attr) /* write out character (and attribute) */ char ch; int attr; { int col,row; col = curcol; row = currow; CO = X_RES/FONTX; LI = Y_RES/FONTY; switch(ch) { case '\n': col = 0; ++row; break; default: alleg_WriteChar((unsigned char)ch,col,row,attr); if (col < (CO -1 )) ++col; break; } /* end switch */ alleg_gotoloc(col,row); need_update = 2; } inline int getmalign(mtmp) struct monst *mtmp; { int alignment; if (mtmp->ispriest || mtmp->data == &mons[PM_ALIGNED_PRIEST] || mtmp->data == &mons[PM_ANGEL]) return(EPRI(mtmp)->shralign); else alignment = mtmp->data->maligntyp; alignment = (alignment > 0) ? A_LAWFUL : (alignment < 0) ? A_CHAOTIC : A_NEUTRAL; return alignment; } BITMAP* subst_mon(pm, fem, lev, a) int pm, fem, lev, a; { int v = 0; BITMAP *ptr; switch(pm) { case PM_ALIGNED_PRIEST: case PM_PRIEST: case PM_PRIESTESS: v = fem ? -PM_PRIESTESS: -PM_PRIEST; switch(a) { case A_LAWFUL: v = fem ? SUB_PLF : SUB_PLM; break; case A_NEUTRAL: v = fem ? SUB_PNF : SUB_PNM; break; case A_CHAOTIC: v = fem ? SUB_PCF : SUB_PCM; break; } break; case PM_ARCHEOLOGIST: if(fem) v = SUB_ARCF; break; case PM_BARBARIAN: if(fem) v = SUB_BARF; break; case PM_HEALER: if(fem) v = SUB_HEAF; break; case PM_KNIGHT: if(fem) v = SUB_KNIF; break; case PM_MONK: if(fem) v = SUB_MONF; break; case PM_RANGER: if(fem) v = SUB_RANF; break; case PM_ROGUE: if(fem) v = SUB_ROGF; break; case PM_SAMURAI: if(fem) v = SUB_SAMF; break; case PM_TOURIST: if(fem) v = SUB_TOUF; break; case PM_WIZARD: if(fem) v = SUB_WIZF; break; case PM_VALKYRIE: if(!fem) v = -PM_KNIGHT; break; default: break; } if((v > 0) && substitutes[v]) ptr = substitutes[v]; else { if(v < 0) pm = -v; ptr = tilecache[glyph2tile[pm]]; } return ptr; } BITMAP* getutile() { if(u.umonnum == PM_WIZARD && Race_if(PM_GNOME) && !flags.female) return(tilecache[glyph2tile[PM_GNOMISH_WIZARD]]); return (subst_mon(u.umonnum, flags.female, u.ulevel, u.ualign.type)); } BITMAP* sub_altar(a) int a; { if (draw_3Dtiles) return (tilecache[glyph2tile[cmap_to_glyph(S_altar)]]); switch(a) { case A_LAWFUL: return(substitutes[SUB_ALTARL]); case A_NEUTRAL: return(substitutes[SUB_ALTARN]); case A_CHAOTIC: return(substitutes[SUB_ALTARC]); default: return(substitutes[SUB_ALTARM]); } } void rogue_xputg(x,y,ch,attr) int x,y; char ch; int attr; { char buf[2]; buf[0] = ch; buf[1] = 0; /* Check the subscreen */ if (subscreen != txt_subscreen) { /* alleg_full_redraw() should fix this */ alleg_full_redraw(); /* No need to do any more - the whole screen has been painted */ return; } /* Actually, tile_x and tile_y should be set to FONTX, FONTY ... */ textout(subscreen, font, buf, x, y, colorpal[attr]); } void alleg_xputg(glyphnum,ch) /* Place tile represent. a glyph at current location */ int glyphnum; int ch; { int col,row; int attr; int mapx, mapy; row = currow; col = curcol; if ((col < 0 || col >= COLNO) || (row < TOP_MAP_ROW || row >= (ROWNO + TOP_MAP_ROW))) return; /* Update glyph table */ map[row - TOP_MAP_ROW][col].glyph = glyphnum; map[row - TOP_MAP_ROW][col].ch = ch; attr = g_attribute; map[row - TOP_MAP_ROW][col].attr = attr; mapx = col+1; mapy = row - TOP_MAP_ROW; /* Update the minimap */ if(ch == ' ') putpixel(minimap, mapx, mapy, 0); else if(glyphnum == cmap_to_glyph(S_room)) putpixel(minimap, mapx, mapy, colorpal[CLR_BLACK]); else putpixel(minimap, mapx, mapy, colorpal[attr]); if ( #ifdef REINCARNATION Is_rogue_level(&u.uz) || #endif iflags.traditional_view) { rogue_xputg(col*tile_x, row*tile_y, ch, attr); if (col < (CO - 1 )) ++col; alleg_gotoloc(col,row); need_update = 1; return; } /* Draw in tilemode */ if (subscreen == txt_subscreen) { alleg_full_redraw(); return; } if (!draw_3Dtiles) { alleg_printGlyph_at(col, row, PRINT_BACKGROUND|PRINT_FOREGROUND); } else { /* To update the 3D tiles, we need to get parts of all the surrounding tiles */ /* Update Backgrounds, then foregrounds */ /* Set clipping */ int posx = colrow_to_posx3d(col, row); int posy = row_to_posy3d(row); int i, j; set_clip(subscreen, posx, posy, posx + tile_x - 1, posy + tile_y - 1); #if 0 rect(subscreen, posx, posy, posx + tile_x - 1, posy + tile_y - 1, colorpal[CLR_BLACK]); #endif for (j = row - 1; j <= row + 1; j++) for (i = col - 1; i <= col + 1; i++) alleg_printGlyph_at(i, j, PRINT_BACKGROUND); for (j = row - 1; j <= row + 1; j++) for (i = col - 1; i <= col + 1; i++) alleg_printGlyph_at(i, j, PRINT_FOREGROUND); /* Reset clip */ set_clip(subscreen, 0, 0, subscreen->w, subscreen->h); /* Put cursor to the right position */ if (col < (CO - 1 )) ++col; alleg_gotoloc(col,row); } } static void alleg_printGlyph_at(col, row, mode) int col, row, mode; { int glyphnum = NO_GLYPH; int mapx = col+1; int mapy = row-1; int glyph2num = NO_GLYPH; int posx = col*tile_x; int posy = row*tile_y; register struct trap *trap; int draw_trans = 0, draw_gray = 0; struct obj *otmp; BITMAP *f_tile; BITMAP *b_tile; if ((col < 0 || col >= COLNO) || (row < TOP_MAP_ROW || row >= (ROWNO + TOP_MAP_ROW))) return; glyphnum = map[row - TOP_MAP_ROW][col].glyph; glyph2num = memory_glyph(mapx, mapy); if(Blind || (viz_array && !cansee(mapx, mapy))){ if(glyph_is_object(glyph2num)){ if(!levl[mapx][mapy].waslit) glyph2num = cmap_to_glyph(S_stone); else glyph2num = back_to_glyph(mapx, mapy); } } else { glyph2num = back_to_glyph(mapx, mapy); } if (draw_3Dtiles) { posx = posxy_to_posx3d(posx, posy); posy = posy_to_posy3d(posy); } need_update = 1; if (mode & PRINT_BACKGROUND) { /* Draw floor */ b_tile = tilecache[glyph2tile[FLOOR_GLYPH]]; draw_sprite(subscreen, b_tile, posx, posy); /* Use alternate altar tiles if appropriate */ if(!draw_3Dtiles && glyph2num == cmap_to_glyph(S_altar) && !(Is_astralevel(&u.uz) || Is_sanctum(&u.uz))) { b_tile = sub_altar((aligntyp)Amask2align(levl[mapx][mapy].altarmask & ~AM_SHRINE)); } else { b_tile = tilecache[glyph2tile[glyph2num]]; } #define glyph_is_wall(glyphnum) (glyph_to_cmap(glyphnum) != NO_GLYPH && \ glyph_to_cmap(glyphnum) > S_stone && \ glyph_to_cmap(glyphnum) <= S_hcdoor) #define glyph_is_wall_or_stone(glyphnum) \ (glyph_to_cmap(glyphnum) != NO_GLYPH && \ glyph_to_cmap(glyphnum) >= S_stone && \ glyph_to_cmap(glyphnum) <= S_hcdoor) /* Check above, above right and to the left */ if (draw_3Dtiles && glyph_is_wall(glyph2num) && ( ((row > TOP_MAP_ROW) && !glyph_is_wall_or_stone(map[row - TOP_MAP_ROW - 1][col].glyph) || (col > 0 && !glyph_is_wall_or_stone(map[row - TOP_MAP_ROW - 1][col - 1].glyph)) || (col < (COLNO - 1) && !glyph_is_wall_or_stone(map[row - TOP_MAP_ROW - 1][col + 1].glyph))) || (col > 0 && !glyph_is_wall_or_stone(map[row - TOP_MAP_ROW][col - 1].glyph)))) { /* Make walls see-through */ if (alleg_colordepth != 8) set_trans_blender(255, 255, 255, 128); draw_trans_sprite(subscreen, b_tile, posx, posy); } else { draw_sprite(subscreen, b_tile, posx, posy); } } if (!(mode & PRINT_FOREGROUND)) { if (col < (CO - 1 )) ++col; alleg_gotoloc(col,row); return; } /* Draw the foreground layers */ f_tile = tilecache[glyph2tile[glyphnum]]; #if 0 if ((trap = t_at(mapx,mapy)) != 0 && trap->tseen && !covers_traps(mapx,mapy)) glyph2num = trap_to_glyph(trap); else glyph2num = back_to_glyph(mapx,mapy); #define glyph_is_wall(glyphnum) (glyph_to_cmap(glyphnum) != NO_GLYPH && \ glyph_to_cmap(glyphnum) > S_stone && \ glyph_to_cmap(glyphnum) <= S_hcdoor) #define glyph_is_wall_or_stone(glyphnum) \ (glyph_to_cmap(glyphnum) != NO_GLYPH && \ glyph_to_cmap(glyphnum) >= S_stone && \ glyph_to_cmap(glyphnum) <= S_hcdoor) /* Check above, above right and to the left */ if (draw_3Dtiles && glyphnum == glyph2num && glyph_is_wall(glyph2num) && ( ((row > TOP_MAP_ROW) && !glyph_is_wall_or_stone(map[row - TOP_MAP_ROW - 1][col].glyph) || (col > 0 && !glyph_is_wall_or_stone(map[row - TOP_MAP_ROW - 1][col - 1].glyph)) || (col < (COLNO - 1) && !glyph_is_wall_or_stone(map[row - TOP_MAP_ROW - 1][col + 1].glyph))) || (col > 0 && !glyph_is_wall_or_stone(map[row - TOP_MAP_ROW][col - 1].glyph)))) { /* Make walls see-through */ if (alleg_colordepth != 8) set_trans_blender(255, 255, 255, 128); draw_trans_sprite(subscreen, f_tile, posx, posy); } else { draw_sprite(subscreen, b_tile, posx, posy); } #endif /* Only draw foreground if it isn't the same as the background */ if(glyphnum != glyph2num) { if(glyph_to_mon(glyphnum) == NO_GLYPH) { /* Do nothing */ } else /* (glyphnum < NUMBER_OF_MONS) */ { struct monst* mtmp = level.monsters[mapx][mapy]; if(mapx == u.ux && mapy == u.uy && !u.usteed && (Blind || !Invisible)) f_tile = getutile(); else if(mtmp) f_tile = subst_mon(glyph_to_mon(glyphnum), mtmp->female, mtmp->m_lev, getmalign(mtmp)); if(mapx == u.ux && mapy == u.uy && Invis && !Blind && See_invisible) draw_trans = 1; else if(mtmp && mtmp->minvis && See_invisible) draw_trans = 1; if(cansee(mapx,mapy) && !covers_objects(mapx,mapy) && (otmp = vobj_at(mapx,mapy))) { if(!Hallucination && (otmp->otyp == STATUE)) draw_gray_sprite(subscreen, tilecache[glyph2tile[otmp->corpsenm]], posx, posy); else { glyph2num = obj_to_glyph(otmp); draw_sprite(subscreen, tilecache[glyph2tile[glyph2num]], posx, posy); } } } if(f_tile == tilecache[glyph2tile[PM_ALIGNED_PRIEST]]) f_tile = tilecache[glyph2tile[PM_PRIEST]]; otmp = vobj_at(mapx,mapy); if(glyphnum == objnum_to_glyph(STATUE) && !Hallucination && otmp) { f_tile = tilecache[glyph2tile[otmp->corpsenm]]; draw_gray = 1; } if (draw_gray) { draw_gray_sprite(subscreen,f_tile,posx, posy); } else if(draw_trans) { if (alleg_colordepth != 8) set_trans_blender(255, 255, 255, 128); draw_trans_sprite(subscreen, f_tile, posx, posy); } else { draw_sprite(subscreen, f_tile, posx, posy); } } /* Draw Aura if protection is active */ if(u.uspellprot && mapx == u.ux && mapy == u.uy) { int pixelcolor = ((u.uspellprot*20 < 200) ? (u.uspellprot*20 + 55) : 255); drawing_mode(DRAW_MODE_TRANS, screen, 0, 0); if (alleg_colordepth != 8) set_trans_blender(255,255,255,128); circlefill(subscreen, posx+(tile_x/2), posy+(tile_y/2), (min((tile_x/2), (tile_y/2)) - 1), makecol(pixelcolor, pixelcolor,0)); drawing_mode(DRAW_MODE_SOLID, screen, 0, 0); } if (col < (CO - 1 )) ++col; alleg_gotoloc(col,row); } /* * Cursor location manipulation, and location information fetching * routines. * These include: * * alleg_gotoloc(x,y) - Moves the "cursor" on screen to the specified x * and y character cell location. This routine * determines the location where screen writes * will occur next, it does not change the location * of the player on the NetHack level. */ void alleg_gotoloc(col,row) int col,row; { #if 0 if (row < TOP_MAP_ROW || row >= (ROWNO + TOP_MAP_ROW)) { curcol = min(col,CO - 1); /* protection from callers */ } else { curcol = min(col,COLNO - 1); /* protection from callers */ } currow = min(row,LI - 1); #endif curcol = min(col,CO - 1); /* protection from callers */ currow = min(row,LI - 1); } void alleg_cliparound(x, y) int x, y; { extern boolean restoring; static int oldtx = 0; static int oldty = 0; int oldx = clipwinx; int oldy = clipwiny; int finalx, finaly; int minx, miny, maxx, maxy; if(scroll_lim) { if(abs(oldtx-x) (maxx - X_WIDTH)) finalx = maxx - X_WIDTH; } if((maxy - miny) < Y_HEIGHT) { finaly = ((miny+maxy) - Y_HEIGHT)/2; } else { if(finaly < miny) finaly = miny; if(finaly > (maxy - Y_HEIGHT)) finaly = maxy - Y_HEIGHT; } /* Convert to 3D pixel equivalents if needed */ if(draw_3Dtiles && !iflags.traditional_view) { finalx = posxy_to_posx3d(finalx, finaly) - X_WIDTH/4; finaly = posy_to_posy3d(finaly) - Y_HEIGHT/4; } if( (finalx != oldx) || (finaly != oldy) ) { if (!restoring) { if(smoothing == 2) { clipwinx = (oldx*3+finalx)/4; clipwiny = (oldy*3+finaly)/4; need_update = 1; alleg_redrawmap(0); } if(smoothing) { clipwinx = (oldx+finalx)/2; clipwiny = (oldy+finaly)/2; need_update = 1; alleg_redrawmap(0); } if(smoothing == 2) { clipwinx = (oldx+finalx*3)/4; clipwiny = (oldy+finaly*3)/4; need_update = 0; alleg_redrawmap(0); } clipwinx = finalx; clipwiny = finaly; need_update = 1; alleg_redrawmap(1); } } } void alleg_overview(on) boolean on; { if (on && !iflags.traditional_view && !draw_3Dtiles) { if(iflags.over_view) return; iflags.over_view = TRUE; } else { if(!iflags.over_view) return; iflags.over_view = FALSE; } need_update = 1; alleg_redrawmap(1); } void alleg_redrawmap(final) boolean final; { if(hud_setting) display_HUD(); if(no_update || faded_out) return; if ((iflags.traditional_view && subscreen != txt_subscreen) || (!iflags.traditional_view && subscreen == txt_subscreen) || (need_update == 2)) alleg_full_redraw(); if(u.uswallow && !iflags.over_view && !iflags.traditional_view) { rectfill(screen, 0, FONTY, X_RES, (Y_HEIGHT)-1, makecol(0,0,0)); alleg_swallowed(u.ux,u.uy); return; } if (need_update) { if (iflags.over_view) { int maxx = 80*tile_x; int maxy = 23*tile_y; #if 0 if (draw_3Dtiles && !iflags.traditional_view) { maxx = posxy_to_posx3d(COLNO*tile_x, 0); maxy = posy_to_posy3d((ROWNO-1)*tile_y) + tile_y; } #endif if(final) /* don't anti-alias, it's too much of a slowdown */ stretch_blit(subscreen, screen, 0, 0, maxx, maxy, 0, FONTY, X_RES, Y_HEIGHT); } else { if(player_dead) tinted_blit(subscreen, screen, clipwinx, clipwiny, 0, FONTY, X_RES, Y_HEIGHT, makecol(0,0,0), 128); else if(Hallucination) { int r, g, b; hsv_to_rgb(moves % 360, 1, 1, &r, &g, &b); tinted_blit(subscreen, screen, clipwinx, clipwiny, 0, FONTY, X_RES, Y_HEIGHT, makecol(r,g,b), 96); } #if 0 else if (use_2xsai && subscreen != txt_subscreen) { /* Only when drawing in gfx mode */ nh_stretch_blit(subscreen, screen, clipwinx + (X_RES / 4), clipwiny + (Y_RES / 4), X_RES / 2, Y_HEIGHT / 2, 0, FONTY, X_RES, Y_HEIGHT); } #endif else blit(subscreen, screen, clipwinx, clipwiny, 0, FONTY, X_RES, Y_HEIGHT); } need_update = 0; did_update = 1; } } static void alleg_full_redraw() { int x, y; int t; int old_currow = currow; int old_curcol = curcol; /* Check for right subscreen */ if ( #ifdef REINCARNATION Is_rogue_level(&u.uz) || #endif iflags.traditional_view) { if (subscreen != txt_subscreen) subscreen = txt_subscreen; } else { if (subscreen == txt_subscreen) subscreen = tile_subscreen; } clear_to_color(subscreen, BACKGROUND_ALLEGRO_COLOR); for (y = TOP_MAP_ROW; y < (ROWNO + TOP_MAP_ROW); ++y) for (x = 0; x < COLNO; ++x) { t = y - TOP_MAP_ROW; if (!(map[t][x].glyph == cmap_to_glyph(S_stone))) { curcol = x; currow = y; g_attribute = map[t][x].attr; alleg_xputg(map[t][x].glyph, map[t][x].ch); } } currow = old_currow; curcol = old_curcol; need_update = 1; } void alleg_userpan(dir) int dir; { int i; int delta = 10; for(i = 0; i < Y_HEIGHT/2; i+=delta) { switch(dir) { case 0: clipwinx-=delta; break; case 1: clipwinx+=delta; break; case 2: clipwiny-=delta; break; case 3: clipwiny+=delta; break; } if(dir < 2) { if(clipwinx < 0) { clipwinx = 0; i=1000; } if(clipwinx > ((80*tile_x) - X_RES)) { clipwinx = 80*tile_x - X_RES; i=1000; } } else { if(Y_HEIGHT >= 21*tile_y) { clipwiny = tile_y-(Y_HEIGHT-21*tile_y)/2; return; } else { if(clipwiny < tile_y) { clipwiny = tile_y; i=1000; } if(clipwiny > ((22*tile_y) - Y_HEIGHT)) { clipwiny = 22*tile_y - Y_HEIGHT; i=1000; } } } need_update = 1; alleg_redrawmap(0); } } /* take a sceeenshot */ void alleg_screenshot() { BITMAP *buffer = create_bitmap(X_RES,Y_RES); blit(screen, buffer, 0, 0, 0, 0, X_RES,Y_RES); save_bitmap("nethack.bmp", buffer, tilepal); save_bitmap("nhmap.bmp", subscreen, tilepal); return; } /* Currently does nothing */ void alleg_traditional(on) boolean on; { alleg_overview(FALSE); if (on) { iflags.traditional_view = TRUE; tile_x = FONTX; tile_y = FONTY; } else { iflags.traditional_view = FALSE; tile_x = TILEX; tile_y = TILEY; } alleg_cliparound(u.ux, u.uy); need_update = 2; alleg_redrawmap(1); return; } void alleg_refresh() { positionbar(); alleg_redrawmap(0); alleg_DrawCursor(); } void alleg_vid_refresh() { alleg_redrawmap(1); } STATIC_OVL void alleg_scrollmap(left) boolean left; { return; } int string_to_int(buf) char *buf; { char *bufp; int result = 0; bufp = buf; while (*bufp && (*bufp >= '0') && (*bufp <= '9') ) { result *= 10; result += *bufp - '0'; bufp++; } return result; } /* * Open tile files, * initialize the SCREEN, switch it to graphics mode, * initialize the pointers to the fonts, clear * the screen. * */ #define TOTAL_PROGRESS TOTAL_TILES_USED+NUM_SUBSTITUTES+10+224+16 static void init_progress_meter() { BITMAP *progress_meter = create_bitmap(TOTAL_PROGRESS, 30); /* Progress display bar box */ rect(screen, 0, Y_RES-64, X_RES-1, Y_RES-33, colorpal[CLR_WHITE]); /* Fill with empty color */ clear_to_color(progress_meter, colorpal[CLR_BLUE]); /* No anti-alias */ stretch_blit(progress_meter, screen, 0, 0, TOTAL_PROGRESS, 30, 1, Y_RES-63, X_RES-2, 30); } static void inc_progress_meter() { BITMAP *progress_meter = create_bitmap(TOTAL_PROGRESS, 30); static int i = 0; i++; clear_to_color(progress_meter, colorpal[CLR_BLUE]); rectfill(progress_meter, 0, 0, i, 30, colorpal[CLR_GREEN]); /* No anti-alias */ stretch_blit(progress_meter, screen, 0, 0, TOTAL_PROGRESS, 30, 1, Y_RES-63, X_RES-2, 30); destroy_bitmap(progress_meter); } /* The initialization function is so big, it's now a seperate file */ #include "alginit.h" /* * This allows grouping of several tasks to be done when * switching back to text mode. This is a public (extern) function. * * Note that this should not deallocate memory, etc., as it is often paired * with alleg_Init() */ void alleg_Finish(void) { int i; #if 0 windowprocs.win_cliparound = tty_cliparound; #endif g_attribute = attrib_text_normal; alleg_SwitchMode(ALLEG_MODETEXT); /* iflags.tile_view = FALSE; destroy_bitmap(txt_subscreen); destroy_bitmap(tile_subscreen); destroy_bitmap(cursorbmp); destroy_bitmap(ovcursor); destroy_bitmap(font_cursor); destroy_bitmap(errorbmp); destroy_bitmap(under_cursor); destroy_bitmap(alltiles); for(i=0; i < TOTAL_TILES_USED; i++) { destroy_bitmap(tilecache[i]); } allegro_exit(); */ } /* * Write character 'ch', at (x,y) and * do it using the colour 'colour'. * */ void alleg_WriteChar(chr,col,row,colour) int chr,col,row,colour; { int actual_colour = colorpal[colour]; int x,y; char buf[2]; x = min(col,(CO-1)); /* min() used protection from callers */ y = min(row,(LI-1)); buf[0] = chr; buf[1] = 0; alleg_text(buf, x*FONTX, y*FONTY, actual_colour); } void alleg_update_positionbar(posbar) char *posbar; { #if 1 return; #else char *p = pbar; if (posbar) while (*posbar) *p++ = *posbar++; *p = 0; #endif } STATIC_OVL void positionbar() { return; } int oldcursx = -1; int oldcursy = -1; void alleg_DrawCursor() { int pixelx, pixely; int x,y; if(!inmap) return; x = min(curcol,(CO - 1)); y = min(currow,(LI - 1)); if (draw_3Dtiles && !iflags.traditional_view) { pixelx = posxy_to_posx3d(x*tile_x, y*tile_y) - clipwinx; pixely = posy_to_posy3d(y*tile_y) - clipwiny + FONTY; } else { pixelx = x*tile_x - clipwinx; pixely = y*tile_y - clipwiny + FONTY; } if( (oldcursx != x) || (oldcursy != y) ) { if(!did_update) { need_update = 1; alleg_redrawmap(0); } did_update = 0; oldcursx = x; oldcursy = y; } if(iflags.over_view) { masked_blit(ovcursor, screen, 0, 0, (x*X_RES)/80, (y*Y_HEIGHT)/23+FONTY, X_RES/80, Y_HEIGHT/23); } else if ( #ifdef REINCARNATION Is_rogue_level(&u.uz) || #endif iflags.traditional_view) { line(screen, pixelx, pixely+FONTY, pixelx+FONTX, pixely+FONTY, colorpal[CLR_WHITE]); return; } else { draw_sprite(screen, cursorbmp, pixelx, pixely); #if 0 masked_blit(cursorbmp, screen, 0, 0, pixelx, pixely, tile_x, tile_y); #endif } } void alleg_HideCursor() { int pixelx, pixely; int x,y; if(!inmap) return; x = min(curcol,(CO - 1)); y = min(currow,(LI - 1)); pixelx = x*tile_x - clipwinx; pixely = y*tile_y - clipwiny + FONTY; } /* ##################################################################### */ /* Let the special effects begin. */ void delayfx() { int i; for(i = 0; i < fx_delay; i++) vsync(); } void cleanup_explosions() { no_update = 0; need_update = 1; alleg_redrawmap(1); } #define maxof4(a,b,c,d) max(max(a,b),max(c,d)) /* Integer square root function without using floating point. */ static int lsqrt(val) long val; { long rt = 0; long odd = 1; while(val >= odd) { val = val-odd; odd = odd+2; rt = rt + 1; } return rt; } void nh_fade_in(portal) int portal; { int factor = 64; BITMAP *buffer = create_bitmap(X_RES, Y_HEIGHT); BITMAP *buffer2; if(iflags.over_view) nh_stretch_blit(subscreen, buffer, 0, 0, 80*tile_x, 23*tile_y, 0, 0, X_RES, Y_HEIGHT); else blit(subscreen, buffer, clipwinx, clipwiny, 0, 0, X_RES, Y_HEIGHT); while(factor > 1) { if(portal) buffer2 = blur(buffer, factor); else buffer2 = mosaic(buffer, factor); blit(buffer2, screen, 0, 0, 0, FONTY, X_RES, Y_HEIGHT); destroy_bitmap(buffer2); delayfx(); factor-=3; } destroy_bitmap(buffer); faded_out = 0; } void nh_fade_out(portal) int portal; { int factor = 1; BITMAP *buffer = create_bitmap(X_RES, Y_HEIGHT); BITMAP *buffer2; blit(screen, buffer, 0, FONTY, 0, 0, X_RES, Y_HEIGHT); while(factor <= 64) { if(portal) buffer2 = blur(buffer, factor); else buffer2 = mosaic(buffer, factor); blit(buffer2, screen, 0, 0, 0, FONTY, X_RES, Y_HEIGHT); destroy_bitmap(buffer2); delayfx(); factor+=3; } destroy_bitmap(buffer); faded_out = 1; } void fade_to_black() { int pixelx = u.ux*tile_x - clipwinx - (tile_x/2); int pixely = u.uy*tile_y - clipwiny + (tile_y/2) + FONTY; BITMAP *circlebmp = create_bitmap(X_RES, Y_HEIGHT); int i; long start_rad, incr, rt, odd; no_update = 0; if (draw_3Dtiles) { pixelx = colrow_to_posx3d(u.ux, u.uy) - clipwinx - (tile_x/2); pixely = row_to_posy3d(u.uy) - clipwiny + (tile_y/2) + FONTY; } /* use the furthest corner to determine the starting radius of the circle */ start_rad = maxof4(abs(dist2(pixelx, pixely, 0, FONTY)), abs(dist2(pixelx, pixely, X_RES, FONTY)), abs(dist2(pixelx, pixely, 0, Y_HEIGHT+FONTY)), abs(dist2(pixelx, pixely, X_RES, Y_HEIGHT+FONTY))); start_rad = lsqrt(start_rad); if(u.uswallow) start_rad = 64; start_rad += 90; player_dead = 1; incr = max(start_rad/80,1); for(i=start_rad; i >= 0; i-=incr) { int v,w; v = max(i-90,0); w = i; clear_to_color(circlebmp, makecol(255,0,255)); circlefill(circlebmp, pixelx, pixely, w, 0); circlefill(circlebmp, pixelx, pixely, v, makecol(255,0,255)); if (alleg_colordepth != 8) set_trans_blender(0,0,0,max(incr*2,8)); draw_trans_sprite(screen, circlebmp, 0, FONTY); delayfx(); } } int alleg_swallowed(x,y) int x,y; { int mpixelx = x*tile_x - clipwinx - tile_x*2; int mpixely = y*tile_y - clipwiny + FONTY; int upixelx = x*tile_x - clipwinx - tile_x; int upixely = y*tile_y - clipwiny + FONTY + tile_y; int v; BITMAP* utile; BITMAP* mtile; if(iflags.over_view || iflags.traditional_view) return 0; if (draw_3Dtiles) { upixelx = colrow_to_posx3d(x - 1, y + 1) - clipwinx; upixely = row_to_posy3d(y + 1) - clipwiny + FONTY; } mpixelx = upixelx - tile_x; mpixely = upixely - tile_y; if (alleg_colordepth != 8) set_trans_blender(0, 0, 0, 128); mtile = subst_mon(monsndx(u.ustuck->data), u.ustuck->female, u.ustuck->m_lev); utile = getutile(); nh_stretch_sprite(screen, mtile, mpixelx, mpixely, tile_x*3, tile_y*3); draw_trans_sprite(screen, utile, upixelx, upixely); if(player_dead) { drawing_mode(DRAW_MODE_TRANS, screen, 0, 0); if (alleg_colordepth != 8) set_trans_blender(0,0,0,128); rectfill(screen, mpixelx, mpixely, mpixelx+(tile_x*3), mpixely+(tile_y*3), 0); drawing_mode(DRAW_MODE_SOLID, screen, 0, 0); } return 1; } void alleg_aura(x,y,skill) int x,y,skill; { int pixelx = x*tile_x - clipwinx - tile_x*3/2; int pixely = y*tile_y - clipwiny + FONTY + tile_y/2; BITMAP* undersh; BITMAP* buffer2; int i; int type = skill - P_ATTACK_SPELL + 1; if(iflags.over_view) return; if (draw_3Dtiles) { pixelx = colrow_to_posx3d(x, y) - clipwinx - tile_x*3/2; pixely = row_to_posy3d(y) - clipwiny + FONTY; } if(pixelx < 0 || pixely < 0 || pixelx>X_RES || pixely > (Y_RES-3*FONTY)) return; undersh=create_bitmap(tile_x*2,tile_y*2); need_update = 1; alleg_redrawmap(1); blit(screen, undersh, pixelx, pixely, 0, 0, tile_x*2, tile_y*2); for(i=0; i < 28; i++) { if (alleg_colordepth != 8) set_trans_blender(0, 0, 0, 255-5*i); draw_sprite(screen, undersh, pixelx, pixely); draw_trans_sprite(screen, auras[type][i], pixelx, pixely); delayfx(); } draw_sprite(screen, undersh, pixelx, pixely); destroy_bitmap(undersh); } int alleg_shield(x,y) int x,y; { int pixelx = x*tile_x - clipwinx - tile_x; int pixely = y*tile_y - clipwiny + FONTY + tile_y; BITMAP* undersh; BITMAP* buffer2; int i; if(iflags.over_view) return 0; if (draw_3Dtiles) { pixelx = colrow_to_posx3d(x, y) - clipwinx - tile_x; pixely = row_to_posy3d(y) - clipwiny + FONTY + tile_y/2; } if(pixelx < 0 || pixely < 0 || pixelx>X_RES || pixely > (Y_RES-3*FONTY)) return 1; undersh=create_bitmap(tile_x,tile_y); need_update = 1; alleg_redrawmap(0); blit(screen, undersh, pixelx, pixely, 0, 0, tile_x, tile_y); for(i=0; i < 16; i++) { if (alleg_colordepth != 8) set_trans_blender(0, 0, 0, 192-8*i); draw_sprite(screen, undersh, pixelx, pixely); draw_trans_sprite(screen, shields[i], pixelx, pixely); delayfx(); } draw_sprite(screen, undersh, pixelx, pixely); destroy_bitmap(undersh); return 1; } void alleg_explode(x,y,adtyp) int x,y,adtyp; { int pixelx = x*tile_x - clipwinx - tile_x*2; int pixely = y*tile_y - clipwiny + FONTY; int expl_x = 3*tile_x; int expl_y = 3*tile_y; BITMAP *buffer, *underexp, *buffer2; int i; if (draw_3Dtiles) { pixelx = colrow_to_posx3d(x, y) - clipwinx - TILE_3D_WIDTH - tile_x; pixely = row_to_posy3d(y) - clipwiny + FONTY; expl_x = tile_x + 2*TILE_3D_WIDTH; expl_y = tile_y + 2*TILE_3D_HEIGHT; } buffer=create_bitmap(expl_x,expl_y); underexp=create_bitmap(expl_x,expl_y); if(iflags.over_view) alleg_overview(0); if(Hallucination) adtyp = rn2(SIZE(explosions)); else if (adtyp < 0 || adtyp > SIZE(explosions)) adtyp = 1; /* Magical explosion */ no_update = 1; blit(screen, underexp, pixelx, pixely, 0, 0, expl_x, expl_y); for(i = (min((expl_x*5/12), (expl_y*5/12))); i > 0; i-=2) { clear_to_color(buffer, makecol(255, 0, 255)); /* explosions are 96x96 */ nh_stretch_blit(explosions[adtyp], buffer, 0, 0, explosions[adtyp]->w, explosions[adtyp]->h, i, i, (expl_x-(2*i)), (expl_y-(2*i))); if(adtyp == AD_ELEC || adtyp == AD_MAGM) { buffer2=create_bitmap(expl_x,expl_y); clear_to_color(buffer2, makecol(255, 0, 255)); rotate_sprite(buffer2, buffer, 0, 0, itofix(rn2(256))); destroy_bitmap(buffer); buffer = buffer2; } if (alleg_colordepth != 8) set_trans_blender(0, 0, 0, min(255,100+4*i)); draw_sprite(screen, underexp, pixelx, pixely); draw_trans_sprite(screen, buffer, pixelx, pixely); draw_trans_sprite(screen, buffer, pixelx, pixely); delayfx(); } /* draw_sprite(screen, underexp, pixelx, pixely); */ destroy_bitmap(buffer); destroy_bitmap(underexp); } /* Use this to heopfully prevent unnecessary mode switches * Same return values as set_gfx_mode (0 on success, negative otherwise) */ int alleg_SwitchMode(mode) int mode; { static curr_mode = ALLEG_MODE_NONE; int retval = 0; if (curr_mode == mode) return retval; if (mode == ALLEG_MODEGFX) { retval = set_gfx_mode(video_mode, X_RES, Y_RES, 0, 0); /* Set palette for 8-bit mode */ if (alleg_colordepth == 8) { set_palette(tilepal); } } else if (mode == ALLEG_MODETEXT) { retval = set_gfx_mode(GFX_TEXT,80,25,0,0); } curr_mode = mode; return retval; } void nh_stretch_blit(source, dest, source_x, source_y, source_width, source_height, dest_x, dest_y, dest_width, dest_height) BITMAP *source; BITMAP *dest; int source_x, source_y, source_width, source_height; int dest_x, dest_y, dest_width, dest_height; { if (use_2xsai) { BITMAP *tmptile, *tmptile2; tmptile = new_bitmap(source_width, source_height + 1); clear_to_color(tmptile, makecol(0,0,0)); blit(source, tmptile, source_x, source_y, 0, 0, source_width, source_height + 1); tmptile2 = new_bitmap(source_width * 2, (source_height * 2) + 2); clear_to_color(tmptile2, makecol(0,0,0)); switch (use_2xsai) { case 3: Super2xSaiBlit(tmptile, tmptile2); break; case 2: SuperEagleBlit(tmptile, tmptile2); break; case 1: default: _2xSaiBlit(tmptile, tmptile2); break; } stretch_blit(tmptile2, dest, 0, 0, source_width * 2 , source_height * 2, dest_x, dest_y, dest_width, dest_height); destroy_bitmap(tmptile); destroy_bitmap(tmptile2); } else aa_stretch_blit(source, dest, source_x, source_y, source_width, source_height, dest_x, dest_y, dest_width, dest_height); } /* vidalleg.c */ slashem-0.0.7E7F3/sys/msdos/alfuncs.h0000664000076400007640000001006710545462317015427 0ustar aliali#define greyscale(b) grayscale(b) inline BITMAP* grayscale(colorimg) BITMAP *colorimg; { BITMAP *greyimg=create_bitmap(colorimg->w, colorimg->h); int x,y; long color; long gray; int r, g, b; for(y = 0; y < colorimg->h; y++) for(x = 0; x < colorimg->w; x++) { color = getpixel(colorimg, x, y); r = getr(color); g = getg(color); b = getb(color); if(r == 255 && g == 0 && b == 255) putpixel(greyimg, x, y, color); else { gray = (r+g+b)/3; gray /= 2; gray += 64; putpixel(greyimg, x, y, makecol(gray, gray, gray)); } } return(greyimg); } void draw_gray_sprite(dest, sprite, x, y) BITMAP *dest; BITMAP *sprite; int x,y; { BITMAP *gray_sprite; if (!dest || !sprite) return; gray_sprite = grayscale(sprite); draw_sprite(dest, gray_sprite, x, y); destroy_bitmap(gray_sprite); } inline void tinted_blit(source, dest, source_x, source_y, dest_x, dest_y, width, height, color, alpha) BITMAP *source; BITMAP *dest; int source_x,source_y,dest_x,dest_y,width,height; long color; int alpha; { BITMAP *buffer = create_bitmap(width,height); blit(source, buffer, source_x, source_y, 0, 0, width, height); drawing_mode(DRAW_MODE_TRANS, buffer, 0, 0); set_trans_blender(255,255,255,alpha); rectfill(buffer, 0, 0, width, height, color); drawing_mode(DRAW_MODE_SOLID, buffer, 0, 0); blit(buffer, dest, 0, 0, dest_x, dest_y, width, height); destroy_bitmap(buffer); } BITMAP* mosaic(bitmap,factor) BITMAP *bitmap; int factor; { int small_w, small_h; int width = bitmap->w; int height = bitmap->h; BITMAP *smallimg; BITMAP *final = create_bitmap(width, height); small_w = width/factor; small_h = height/factor; smallimg = create_bitmap(small_w, small_h); stretch_blit(bitmap, smallimg, 0, 0, width, height, 0, 0, small_w, small_h); stretch_blit(smallimg, final, 0, 0, small_w, small_h, 0, 0, width, height); destroy_bitmap(smallimg); return(final); } inline void mosaic_blit(source, dest, source_x, source_y, dest_x, dest_y, width, height, factor) BITMAP *source; BITMAP *dest; int source_x,source_y,dest_x,dest_y,width,height; int factor; { BITMAP *buffer = create_bitmap(width,height); BITMAP *buffer2; blit(source, buffer, source_x, source_y, 0, 0, width, height); buffer2 = mosaic(buffer, factor); blit(buffer2, dest, 0, 0, dest_x, dest_y, width, height); destroy_bitmap(buffer); destroy_bitmap(buffer2); } BITMAP* blur(bitmap,factor) BITMAP *bitmap; int factor; { int small_w, small_h; int width = bitmap->w; int height = bitmap->h; BITMAP *smallimg; BITMAP *final = create_bitmap(width, height); small_w = width/factor; small_h = height/factor; smallimg = create_bitmap(small_w, small_h); nh_stretch_blit(bitmap, smallimg, 0, 0, width, height, 0, 0, small_w, small_h); nh_stretch_blit(smallimg, final, 0, 0, small_w, small_h, 0, 0, width, height); destroy_bitmap(smallimg); return(final); } inline void blur_blit(source, dest, source_x, source_y, dest_x, dest_y, width, height, factor) BITMAP *source; BITMAP *dest; int source_x,source_y,dest_x,dest_y,width,height; int factor; { BITMAP *buffer = create_bitmap(width,height); BITMAP *buffer2; blit(source, buffer, source_x, source_y, 0, 0, width, height); buffer2 = blur(buffer, factor); blit(buffer2, dest, 0, 0, dest_x, dest_y, width, height); destroy_bitmap(buffer); destroy_bitmap(buffer2); } slashem-0.0.7E7F3/sys/msdos/tile2bin.c0000664000076400007640000001627010545462317015501 0ustar aliali/* 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. */ /* * Edit History: * * Initial Creation M.Allison 93/10/21 * ifndef MONITOR_HEAP for heaputil.c P.Winner 94/03/12 * added Borland C _stklen variable Y.Sapir 94/05/01 * fixed to use text tiles from win/share M.Allison 95/01/31 * */ #include "hack.h" #include "pcvideo.h" #include "tile.h" #include "pctiles.h" #include #ifndef MONITOR_HEAP #include #endif #include #ifdef __GO32__ #include #endif #if defined(_MSC_VER) && _MSC_VER >= 700 #pragma warning(disable:4309) /* initializing */ #pragma warning(disable:4018) /* signed/unsigned mismatch */ #pragma warning(disable:4131) /* old style declarator */ #pragma warning(disable:4127) /* conditional express. is constant */ #endif #ifdef __BORLANDC__ extern unsigned _stklen = STKSIZ; #endif extern char *FDECL(tilename, (int, int)); #ifdef PLANAR_FILE char masktable[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; char charcolors[MAXCOLORMAPSIZE]; #ifdef OVERVIEW_FILE struct overview_planar_cell_struct planetile; #else struct planar_cell_struct planetile; #endif FILE *tibfile1; #endif #ifdef PACKED_FILE char packtile[MAX_TILE_Y][MAX_TILE_X]; FILE *tibfile2; #endif int num_colors; pixel pixels[MAX_TILE_Y][MAX_TILE_X]; struct tibhdr_struct tibheader; static void FDECL(write_tibtile, (int)); static void FDECL(write_tibheader, (FILE *, struct tibhdr_struct *)); static void FDECL(build_tibtile, (pixel (*)[MAX_TILE_X])); #ifndef OVERVIEW_FILE char *tilefiles[] = { "../win/share/monsters.txt", "../win/share/objects.txt", "../win/share/other.txt"}; #else char *tilefiles[] = { "../win/share/monthin.txt", "../win/share/objthin.txt", "../win/share/oththin.txt"}; #endif int tilecount; int filenum; int paletteflag; int main(argc, argv) int argc; char *argv[]; { int i; struct tm *newtime; time_t aclock; char *paletteptr; if (argc != 1) { Fprintf(stderr, "usage: tile2bin (from the util directory)\n"); exit(EXIT_FAILURE); } #ifdef PLANAR_FILE # ifndef OVERVIEW_FILE tibfile1 = fopen(NETHACK_PLANAR_TILEFILE, WRBMODE); # else tibfile1 = fopen(NETHACK_OVERVIEW_TILEFILE, WRBMODE); # endif if (tibfile1 == (FILE *)0) { Fprintf(stderr, "Unable to open output file %s\n", # ifndef OVERVIEW_FILE NETHACK_PLANAR_TILEFILE); #else NETHACK_OVERVIEW_TILEFILE); #endif exit(EXIT_FAILURE); } #endif #ifdef PACKED_FILE tibfile2 = fopen(NETHACK_PACKED_TILEFILE, WRBMODE); if (tibfile2 == (FILE *)0) { Fprintf(stderr, "Unable to open output file %s\n", NETHACK_PACKED_TILEFILE); exit(EXIT_FAILURE); } #endif time(&aclock); newtime = localtime(&aclock); tilecount = 0; paletteflag = 0; filenum = 0; while (filenum < 3) { if (!fopen_text_file(tilefiles[filenum], RDTMODE)) { Fprintf(stderr, "usage: tile2bin (from the util or src 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 (!paletteflag) { paletteptr = tibheader.palette; for (i = 0; i < num_colors; i++) { *paletteptr++ = ColorMap[CM_RED][i], *paletteptr++ = ColorMap[CM_GREEN][i], *paletteptr++ = ColorMap[CM_BLUE][i]; } paletteflag++; } while (read_text_tile(pixels)) { build_tibtile(pixels); write_tibtile(tilecount); tilecount++; } (void) fclose_text_file(); ++filenum; } # if defined(_MSC_VER) tibheader.compiler = MSC_COMP; # elif defined(__BORLANDC__) tibheader.compiler = BC_COMP; # elif defined(__GO32__) tibheader.compiler = DJGPP_COMP; # else tibheader.compiler = OTHER_COMP; # 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; tibheader.numcolors = num_colors; # ifdef PLANAR_FILE tibheader.tilestyle = PLANAR_STYLE; write_tibheader(tibfile1, &tibheader); (void) fclose(tibfile1); # ifndef OVERVIEW_FILE Fprintf(stderr, "Total of %d planar tiles written to %s.\n", tilecount, NETHACK_PLANAR_TILEFILE); # else Fprintf(stderr, "Total of %d planar tiles written to %s.\n", tilecount, NETHACK_OVERVIEW_TILEFILE); # endif # endif # ifdef PACKED_FILE tibheader.tilestyle = PACKED_STYLE; write_tibheader(tibfile2, &tibheader); Fprintf(stderr, "Total of %d packed tiles written to %s.\n", tilecount, NETHACK_PACKED_TILEFILE); (void) fclose(tibfile2); # endif exit(EXIT_SUCCESS); /*NOTREACHED*/ return 0; } static void write_tibheader(fileptr,tibhdr) FILE *fileptr; struct tibhdr_struct *tibhdr; { if (fseek(fileptr,0L,SEEK_SET)) { Fprintf(stderr, "Error writing header to tile file\n"); } fwrite(tibhdr, sizeof(struct tibhdr_struct), 1, fileptr); } static void build_tibtile(pixels) pixel (*pixels)[MAX_TILE_X]; { int i, j, k, co_off; unsigned char co_mask,tmp; #ifndef OVERVIEW_FILE memset((void *)&planetile,0,sizeof(struct planar_cell_struct)); #else memset((void *)&planetile,0, sizeof(struct overview_planar_cell_struct)); #endif for (j = 0; j < tile_y; j++) { for (i = 0; i < tile_x; i++) { for (k = 0; k < num_colors; k++) { if (ColorMap[CM_RED][k] == pixels[j][i].r && ColorMap[CM_GREEN][k] == pixels[j][i].g && ColorMap[CM_BLUE][k] == pixels[j][i].b) break; } if (k >= num_colors) Fprintf(stderr, "color not in colormap!\n"); #ifdef PACKED_FILE packtile[j][i] = k; #endif #ifdef PLANAR_FILE if (i > 7) { co_off = 1; co_mask = masktable[i - 8]; } else { co_off = 0; co_mask = masktable[i]; } tmp = planetile.plane[0].image[j][co_off]; planetile.plane[0].image[j][co_off] = (k & 0x0008) ? (tmp | co_mask) : (tmp & ~co_mask); tmp = planetile.plane[1].image[j][co_off]; planetile.plane[1].image[j][co_off] = (k & 0x0004) ? (tmp | co_mask) : (tmp & ~co_mask); tmp = planetile.plane[2].image[j][co_off]; planetile.plane[2].image[j][co_off] = (k & 0x0002) ? (tmp | co_mask) : (tmp & ~co_mask); tmp = planetile.plane[3].image[j][co_off]; planetile.plane[3].image[j][co_off] = (k & 0x0001) ? (tmp | co_mask) : (tmp & ~co_mask); #endif /* PLANAR_FILE */ } } } static void write_tibtile(recnum) int recnum; { long fpos; #ifdef PLANAR_FILE # ifndef OVERVIEW_FILE fpos = ((long)(recnum) * (long)sizeof(struct planar_cell_struct)) + (long)TIBHEADER_SIZE; # else fpos = ((long)(recnum) * (long)sizeof(struct overview_planar_cell_struct)) + (long)TIBHEADER_SIZE; # endif if (fseek(tibfile1,fpos,SEEK_SET)) { Fprintf(stderr, "Error seeking before planar tile write %d\n", recnum); } # ifndef OVERVIEW_FILE fwrite(&planetile, sizeof(struct planar_cell_struct), 1, tibfile1); # else fwrite(&planetile, sizeof(struct overview_planar_cell_struct), 1, tibfile1); # endif #endif #ifdef PACKED_FILE fpos = ((long)(recnum) * (long)sizeof(packtile)) + (long)TIBHEADER_SIZE; if (fseek(tibfile2,fpos,SEEK_SET)) { Fprintf(stderr, "Error seeking before packed tile write %d\n", recnum); } fwrite(&packtile, sizeof(packtile), 1, tibfile2); #endif } slashem-0.0.7E7F3/sys/msdos/bmp2txt.c0000664000076400007640000001037410545462317015370 0ustar aliali/* SCCS Id: @(#)bmp2txt.c 3.3 95/01/26 */ /* Copyright (c) NetHack PC Development Team 1993, 1994, 1995 */ /* NetHack may be freely redistributed. See license for details. */ /* * This creates a bmp2txt.exe * * This takes a big tile file (generated by txt2bmp -bXX or idx2bmp) * and converts it back into the nethack .txt format * Uses 'index' to generate the associated names * * Edit History: * * Initial Creation W.Cheung 00/06/23 */ #define alleg_mouse_unused #define alleg_timer_unused #define alleg_keyboard_unused #define alleg_joystick_unused #define alleg_sound_unused #define alleg_gui_unused #include #include "hack.h" #include "pcvideo.h" #include "tile.h" #include "pctiles.h" #include #include #ifndef MONITOR_HEAP #include #endif #include extern char *FDECL(tilename, (int, int)); #define Fprintf (void) fprintf #define Fclose (void) fclose static const char *output_file = "tiles.txt", *index_file = "index", *input_file = "tiles.bmp"; /* These next two functions were stolen from hacklib.c */ char * eos(s) /* return the end of a string (pointing at '\0') */ register char *s; { while (*s) s++; /* s += strlen(s); */ return s; } /* remove excess whitespace from a string buffer (in place) */ char * mungspaces(bp) char *bp; { register char c, *p, *p2; boolean was_space = TRUE; for (p = p2 = bp; (c = *p) != '\0'; p++) { if (c == '\t') c = ' '; if (c != ' ' || !was_space) *p2++ = c; was_space = (c == ' '); } if (was_space && p2 > bp) p2--; *p2 = '\0'; return bp; } int main(argc, argv) int argc; char *argv[]; { int i; FILE *fp; char buf[BUFSZ]; char *bufp; BITMAP *bigtile_bmp; BITMAP *tilebmp; RGB *bmp_pal[256]; struct tm *newtime; time_t aclock; char filename[60]; char tilename[BUFSZ]; int tile_x = 32, tile_y = 32; int col, row; boolean has_index = 0, has_output = 0; if (argc > 3) { Fprintf(stderr, "Bad arg count (%d).\n", argc-1); (void) fflush(stderr); exit(EXIT_FAILURE); } has_index = (argc > 1); has_output = (argc > 2); time(&aclock); newtime = localtime(&aclock); /* Open the index file */ if (has_index) sprintf(filename, argv[1]); else sprintf(filename, index_file); if ((fp = fopen(filename, "r")) == (FILE *)0) { Fprintf(stderr, "Could not open index file '%s'!\n", filename); exit(EXIT_FAILURE); } set_color_depth(24); sprintf(filename, input_file); bigtile_bmp = load_bitmap(filename, bmp_pal); if (!bigtile_bmp) { Fprintf(stderr, "Could not open bitmap file '%s'!\n", filename); exit(EXIT_FAILURE); } /* Deal with the palette - bmp is truecolor, * This code assumes that txt files need to have < 256 colors * HOW DO WE HANDLE TRANSPARENT TILES? */ Fprintf(stderr, "Generating rgb lookup table create_rgb_table(rgb_map, bmp_pal, NULL); i = 0; while(fgets(buf,120,fp)) { if (*buf == '#') continue; bufp = eos(buf); while (--bufp > buf && isspace(*bufp)) continue; if (bufp <= buf) continue; /* skip all-blank lines */ else *(bufp + 1) = '\0'; /* terminate line */ /* find the '=' or ':' */ bufp = index(buf, ':'); if (!bufp) continue; *bufp = '\0'; /* we only want everything before the : */ /* #### (tile name) */ sscanf (buf, "%*4c (%[^)])", tilename); Fprintf(stderr, "# tile %d (%s)\n", i, tilename); col = (int)(i % TILES_PER_ROW); row = (int)(i / TILES_PER_ROW); i++; } exit(EXIT_SUCCESS); /*NOTREACHED*/ return 0; } slashem-0.0.7E7F3/sys/msdos/pctiles.c0000664000076400007640000001462510545462317015436 0ustar aliali/* 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. */ /* */ /* * pctiles.c - PC Graphical Tile Support Routines * *Edit History: * Initial Creation M. Allison 93/10/30 * */ #include "hack.h" #ifdef USE_TILES #if defined(__GO32__) || defined(__DJGPP__) #include #define TILES_IN_RAM /* allow tiles to be read into ram */ #endif # if defined(_MSC_VER) # if _MSC_VER >= 700 #pragma warning(disable:4018) /* signed/unsigned mismatch */ #pragma warning(disable:4127) /* conditional expression is constant */ #pragma warning(disable:4131) /* old style declarator */ #pragma warning(disable:4309) /* initializing */ # endif #include # endif #include "pcvideo.h" #include "tile.h" #include "pctiles.h" STATIC_VAR FILE *tilefile; STATIC_VAR FILE *tilefile_O; extern short glyph2tile[]; /* in tile.c (made from tilemap.c) */ #ifdef TILES_IN_RAM struct planar_cell_struct *ramtiles; struct overview_planar_cell_struct *oramtiles; boolean tiles_in_ram = FALSE; boolean otiles_in_ram = FALSE; extern int total_tiles_used; /* tile.c */ #endif # ifdef OVLB /* * Read the header/palette information at the start of the * NetHack.tib file. * * There is 1024 bytes (1K) of header information * at the start of the file, including a palette. * */ int ReadTileFileHeader(tibhdr, filestyle) struct tibhdr_struct *tibhdr; boolean filestyle; { FILE *x; x = filestyle ? tilefile_O : tilefile; if (fseek(x,0L,SEEK_SET)) { return 1; } else { fread(tibhdr, sizeof(struct tibhdr_struct), 1, x); } return 0; } /* * Open the requested tile file. * * NetHack1.tib file is a series of * 'struct planar_tile_struct' structures, one for each * glyph tile. * * NetHack2.tib file is a series of * char arrays [TILE_Y][TILE_X] in dimensions, one for each * glyph tile. * * There is 1024 bytes (1K) of header information * at the start of each .tib file. The first glyph tile starts at * location 1024. * */ int OpenTileFile(tilefilename, filestyle) char *tilefilename; boolean filestyle; { #ifdef TILES_IN_RAM int k; #endif if (filestyle) { tilefile_O = fopen(tilefilename,"rb"); if (tilefile_O == (FILE *)0) return 1; } else { tilefile = fopen(tilefilename,"rb"); if (tilefile == (FILE *)0) return 1; } #ifdef TILES_IN_RAM if (iflags.preload_tiles) { if (filestyle) { struct overview_planar_cell_struct *gp; long ram_needed = sizeof(struct overview_planar_cell_struct) * total_tiles_used; if (fseek(tilefile_O,(long)TIBHEADER_SIZE, SEEK_SET)) { /*failure*/ } oramtiles = (struct overview_planar_cell_struct *)alloc(ram_needed); /* Todo: fall back to file method here if alloc failed */ gp = oramtiles; for(k=0; k < total_tiles_used; ++k) { fread(gp, sizeof(struct overview_planar_cell_struct), 1, tilefile_O); ++gp; } #ifdef DEBUG_RAMTILES pline("%d overview tiles read into ram.", k); mark_synch(); #endif otiles_in_ram = TRUE; } else { struct planar_cell_struct *gp; long ram_needed = sizeof(struct planar_cell_struct) * total_tiles_used; if (fseek(tilefile,(long)TIBHEADER_SIZE, SEEK_SET)) { /*failure*/ } ramtiles = (struct planar_cell_struct *)alloc(ram_needed); /* Todo: fall back to file method here if alloc failed */ gp = ramtiles; for(k=0; k < total_tiles_used; ++k) { fread(gp, sizeof(struct planar_cell_struct), 1, tilefile); ++gp; } #ifdef DEBUG_RAMTILES pline("%d tiles read into ram.", k); mark_synch(); #endif tiles_in_ram = TRUE; } } #endif return 0; } void CloseTileFile(filestyle) boolean filestyle; { fclose(filestyle ? tilefile_O : tilefile); #ifdef TILES_IN_RAM if (!filestyle && tiles_in_ram) { if (ramtiles) free((genericptr_t) ramtiles); tiles_in_ram = FALSE; } else if (filestyle && otiles_in_ram) { if (oramtiles) free((genericptr_t) oramtiles); otiles_in_ram = FALSE; } #endif } # endif /* OVLB */ # ifdef OVL0 struct planar_cell_struct plancell; struct overview_planar_cell_struct oplancell; /* This routine retrieves the requested NetHack glyph tile * from the planar style binary .tib file. * This is currently done 'on demand', so if the player * is running without a disk cache (ie. smartdrv) operating, * things can really be slowed down. We don't have any * base memory under MSDOS, in which to store the pictures. * * Todo: Investigate the possibility of loading the glyph * tiles into extended or expanded memory using * the MSC virtual memory routines. * * Under an environment like djgpp, it should be possible to * read the entire set of glyph tiles into a large * array of 'struct planar_cell_struct' structures at * game initialization time, and recall them from the array * as needed. That should speed things up (at the cost of * increasing the memory requirement - can't have everything). * */ # ifdef PLANAR_FILE int ReadPlanarTileFile(tilenum,gp) int tilenum; struct planar_cell_struct **gp; { long fpos; #ifdef TILES_IN_RAM if (tiles_in_ram) { *gp = ramtiles + tilenum; return 0; } #endif fpos = ((long)(tilenum) * (long)sizeof(struct planar_cell_struct)) + (long)TIBHEADER_SIZE; if (fseek(tilefile,fpos,SEEK_SET)) { return 1; } else { fread(&plancell, sizeof(struct planar_cell_struct), 1, tilefile); } *gp = &plancell; return 0; } int ReadPlanarTileFile_O(tilenum,gp) int tilenum; struct overview_planar_cell_struct **gp; { long fpos; #ifdef TILES_IN_RAM if (otiles_in_ram) { *gp = oramtiles + tilenum; return 0; } #endif fpos = ((long)(tilenum) * (long)sizeof(struct overview_planar_cell_struct)) + (long)TIBHEADER_SIZE; if (fseek(tilefile_O,fpos,SEEK_SET)) { return 1; } else { fread(&oplancell, sizeof(struct overview_planar_cell_struct), 1, tilefile_O); } *gp = &oplancell; return 0; } # endif # ifdef PACKED_FILE int ReadPackedTileFile(tilenum,pta) int tilenum; char (*pta)[TILE_X]; { long fpos; fpos = ((long)(tilenum) * (long)(TILE_Y * TILE_X) + (long)TIBHEADER_SIZE; if (fseek(tilefile,fpos,SEEK_SET)) { return 1; } else { fread(pta, (TILE_Y * TILE_X), 1, tilefile); } return 0; } # endif # endif /* OVL0 */ #endif /* USE_TILES */ /* pctiles.c */ slashem-0.0.7E7F3/sys/msdos/2xtest.c0000664000076400007640000000114210545462317015212 0ustar aliali/* Some code I used to test the 2xSaI routines */ #include "2xsai2.c" int main() { BITMAP *tile_in, *tile_out; PALETTE tilepal; set_color_depth(16); tile_in = load_bitmap("tmp.bmp", tilepal); tile_out = create_bitmap((tile_in->w)*2, (tile_in->h)*2); Super2xSaiBlit(tile_in, tile_out); save_bitmap("tmp2.bmp", tile_out, tilepal); SuperEagleBlit(tile_in, tile_out); save_bitmap("tmp3.bmp", tile_out, tilepal); _2xSaiBlit(tile_in, tile_out); save_bitmap("tmp4.bmp", tile_out, tilepal); printf("Color15: %0x\n", makecol15(255, 0, 255)); printf("Color16: %0x\n", makecol16(255, 0, 255)); } slashem-0.0.7E7F3/sys/msdos/msdoshlp.txt0000664000076400007640000001647510545462317016226 0ustar aliali MSDOS specific help file for NetHack 3.4.3 (Last Revision: March 16, 2003) Copyright (c) NetHack PC Development Team 1993-2003. NetHack may be freely distributed. See license for details. New players should be sure to read GuideBoo.txt which contains essential information about playing NetHack. It can be found in the same directory as your NetHack executable. The MSDOS port of NetHack supports some additional or enhanced commands as well as some defaults.nh file options specific to configuration choices used during the building of PC NetHack. Listed below are those commands and defaults.nh file options. Recognized MSDOS specific defaults.nh entries are outlined below. Boolean Options: IBMgraphics Use IBM extended characters for the dungeon Default: [FALSE] BIOS Allow the use of IBM ROM BIOS calls Default: [FALSE] rawio Allow the use of raw I/O (may only be set on startup) Default: [FALSE] preload_tiles Preload tiles into RAM at start of game. Faster, but uses more memory. Default: [TRUE] Color Options: OPTIONS=!color Players will need this if they have a real, true, (old) monochrome adapter, and they are seeing underlined, and flashing, and reverse-video characters on the screen. Or they find that some things are missing from the display. This means that the auto-detection for monochromes has failed. The color support stuff is active in video.c, but may be (will have to be) overridden by adding an OPTIONS=nocolor to defaults.nh. OPTIONS=VIDEO (defaults.nh only) ie: OPTIONS=video:autodetect Possible values are: AUTODETECT, DEFAULT, VGA AUTODETECT Checks for a supported hi-res video adaptor, and if it detects one, NetHack will run in "TILE MODE." DEFAULT NetHack will run in TTY mode. This is the same as not specifying OPTIONS=VIDEO at all. VGA Forces use of VGA specific video routines. Any forcing of specific video routines has potential to cause machine lock-ups if the specified video hardware is not present. OPTIONS=VIDEOSHADES (defaults.nh only) Players may wish to add this option because one of their shades of gray is difficult to read on their video display hardware. Allows a level of intensity to be assigned to the 3 possible shades of gray in NetHack, those being BLACK, GRAY, WHITE. To each of those shades, the player may assign a DARK, NORMAL, or LIGHT value. Here is the default if not specified: ie. OPTIONS=VIDEOSHADES:dark-normal-light Anytime the same intensity value (DARK NORMAL LIGHT) is used for more than one shade of gray, it will not be possible to visually distinguish those two shades from each other. ie. OPTIONS=VIDEOSHADES:normal-normal-light This, while eliminating the dark shade normally used for displaying black items, means that the player won't be able to distinguish black items and creatures from gray items and creatures visually. Note also that the controversial gray schema used in pl 3.1.2 as the default, corresponded to: OPTIONS=VIDEOSHADES:normal-dark-normal This is NOT the default in pl 3.1.3 and above, so many people will probably not even need to use this option, and will find the default just fine. The maps are built using gray, and in pl 3.1.3, that is mapped to normal by default. In 3.1.2, it was mapped to dark (as above). OPTIONS=VIDEOCOLORS (defaults.nh only) This option is only provided because some people on r.g.r.n mentioned how they liked to modify the color values from the default ANSI.SYS behaviour, and were "upset" to find out that they could no longer do so under 3.1.2. The color map is as accurate as possible on standard PC video hardware as it stands, and any deviation from the default, will mean that people are mapping blue to green for example. The option is available to provide as much flexibility as possible, but it is not encouraged to be used. One possible use might be for the dark blue in fountains. On video hardware that has trouble displaying blacks, there may also be problems displaying the darker blue used in fountains. If that is the case then the default map: OPTIONS=VIDEOCOLORS:4-2-6-1-5-3-12-10-14-9-13-11 could be changed to the following to map blue to br. blue: OPTIONS=VIDEOCOLORS:4-2-6-9-5-3-12-10-14-9-13-11 The mapping order for the options: red, green, brown, blue, magenta, cyan br.red, br.green, yellow, br.blue, br.magenta, br.cyan The PC hardware uses the following values: red(4), green(2), brown(6), blue(1), magenta(5), cyan(3), bright red(12), bright green(10), yellow(14), bright blue(9), bright magenta(13), bright cyan(11), normal white(7), bright white(15). The following options are NOT currently recognized under the MSDOS port of PC NetHack: LEVELS= Where to store/create per level data files. SAVE= Where to save games. BONES= Where to store bones files. MSDOS Additional/Enhanced Commands: If you have opted to use the "graphical" or "tiled" option, (usually set via OPTIONS=VIDEO:AUTODETECT ((see above)), then the following function keys are active: F3 cycle through the current position indicator, or halo. Usually this halo highlights the player's tile, unless the game is asking you for an answer to a question that requires positional information, (ie, the discover command). F4 toggle level overview mode on/off F5 toggle tiled display on/off. (Switches between tiled and traditional ASCII display.) While playing NetHack under MSDOS 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: Alt-2 twoweapon - toggle two-weapon combat Alt-a adjust - adjust inventory letters. Alt-b bereave - steal Alt-c chat - talk to someone or something. Alt-d dip - dip an object into something. Alt-e effect - special class ability Alt-f force - force a lock. Alt-i invoke - invoke an object's powers. Alt-j jump - jump to a location. Alt-k enhance - advance skills 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-y youpoly - polymorph yourself Alt-v version - list compile time options for this version of NetHack. Alt-w wipe - wipe off your face. If you are playing on NEC PC-9800, use the GRPH key instead of the ALT key. slashem-0.0.7E7F3/sys/msdos/vidal2.c0000664000076400007640000007450110545462317015153 0ustar aliali/* SCCS Id: @(#)vidvga.c 3.2 96/02/16 */ /* Copyright (c) NetHack PC Development Team 1995 */ /* NetHack may be freely redistributed. See license for details. */ /* * vidalleg.c - Allegro video support - WAC's version [non-working] */ #include "hack.h" #ifdef USE_ALLEGRO /* this file is for USE_ALLEGRO only */ #include "pcvideo.h" #include "tile.h" #include "pctiles.h" #include #include #include "wintty.h" # ifdef __GO32__ #include #include # endif #include void FDECL(alleg_gotoloc, (int,int)); /* This should be made a macro */ void NDECL(alleg_backsp); #ifdef SCROLLMAP STATIC_DCL void FDECL(alleg_scrollmap,(BOOLEAN_P)); #endif STATIC_DCL void FDECL(alleg_redrawmap,(BOOLEAN_P)); void FDECL(alleg_cliparound,(int, int)); #ifdef POSITIONBAR STATIC_DCL void NDECL(positionbar); static void FDECL(alleg_special,(int, int, int)); #endif extern int clipx, clipxmax; /* current clipping column from wintty.c */ extern boolean clipping; /* clipping on? from wintty.c */ extern int savevmode; /* store the original video mode */ extern int curcol,currow; /* current column and row */ extern int g_attribute; extern int attrib_text_normal; /* text mode normal attribute */ extern int attrib_gr_normal; /* graphics mode normal attribute */ extern int attrib_text_intense; /* text mode intense attribute */ extern int attrib_gr_intense; /* graphics mode intense attribute */ extern boolean inmap; /* in the map window */ /* * Global Variables */ STATIC_VAR BITMAP *screentable[SCREENHEIGHT]; STATIC_VAR BITMAP *planar_tile_bmp; STATIC_VAR BITMAP *overview_tile_bmp; STATIC_VAR char tmp[SCREENWIDTH]; STATIC_VAR PALETTE *paletteptr; STATIC_VAR struct map_struct { int glyph; int ch; int attr; } map[ROWNO][COLNO]; /* track the glyphs */ # define alleg_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 = 50; 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 PALETTE defpalette[] = { /* Default Allegro palette ? */ {0, 0, 0}, {0, 182, 255}, {255, 108, 0}, {255, 0, 0}, {0, 0, 255}, {0, 145, 0}, {108, 255, 0}, {255, 255, 0}, {255, 0, 255}, {145, 71, 0}, {182, 71, 0}, {255, 182, 145}, {71, 108, 108}, {255, 255, 255}, {218, 218, 182}, {108, 145, 182}, }; # ifndef ALTERNATE_VIDEO_METHOD int vp[SCREENPLANES] = {8,4,2,1}; # endif int vp2[SCREENPLANES] = {1,2,4,8}; # else extern int vgacmap[CLR_MAX]; extern int viewport_size; extern char masktable[8]; extern char bittable[8]; extern char defpalette[]; # ifndef ALTERNATE_VIDEO_METHOD extern int vp[SCREENPLANES]; # endif extern int vp2[SCREENPLANES]; # endif /* OVLB */ STATIC_VAR struct planar_cell_struct *planecell; STATIC_VAR struct overview_planar_cell_struct *planecell_O; # 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 */ /* * Write character 'ch', at (x,y) and * do it using the colour 'colour'. * */ #define alleg_WriteChar(chr,col,row,colour) textout(screen,font,chr,col,row,colour) #ifdef OVLB void alleg_get_scr_size() { CO = 100; LI = 36; } #endif /*OVLB*/ # ifdef OVLB void alleg_backsp() { int col,row; col = curcol; /* Character cell row and column */ row = currow; if (col > 0) col = col-1; alleg_gotoloc(col,row); alleg_xputc(' ',g_attribute); alleg_gotoloc(col,row); } # endif /* OVLB */ # ifdef OVL0 void alleg_clear_screen(colour) int colour; { clear_to_color(screen, colour); alleg_gotoloc(0,0); /* is this needed? */ } void alleg_cl_end(col,row) /* clear to end of line */ int col,row; { int count; /* * This is being done via character writes. * This should perhaps be optimized for speed by using VGA write * mode 2 methods as did clear_screen() */ for (count = col; count < (CO-1); ++count) { alleg_WriteChar(' ',count,row,BACKGROUND_alleg_COLOR); } } void alleg_cl_eos(cy) /* clear to end of screen */ int cy; { int count; cl_end(); while(cy <= LI-2) { for (count = 0; count < (CO-1); ++count) { alleg_WriteChar(' ',count,cy, BACKGROUND_alleg_COLOR); } cy++; } } # endif /* OVL0 */ # ifdef OVLB void alleg_tty_end_screen() { alleg_clear_screen(BACKGROUND_alleg_COLOR); alleg_SwitchMode(MODETEXT); } void alleg_tty_startup(wid, hgt) int *wid, *hgt; { /* code to sense display adapter is required here - MJA */ alleg_get_scr_size(); if (CO && LI) { *wid = CO; *hgt = LI; } attrib_gr_normal = ATTRIB_alleg_NORMAL; attrib_gr_intense = ATTRIB_alleg_INTENSE; g_attribute = attrib_gr_normal; /* Give it a starting value */ } # endif /* OVLB */ /* * Screen output routines (these are heavily used). * * These are the 3 routines used to place information on the screen * in the VGA PC tty port of NetHack. These are the routines * that get called by the general interface routines in video.c. * * alleg_xputs -Writes a c null terminated string at the current location. * * alleg_xputc -Writes a single character at the current location. Since * various places in the code assume that control characters * can be used to control, we are forced to interpret some of * the more common ones, in order to keep things looking correct. * * alleg_xputg -This routine is used to display a graphical representation of a * NetHack glyph (a tile) at the current location. For more * information on NetHack glyphs refer to the comments in * include/display.h. * */ # ifdef OVL0 void alleg_xputs(s,col,row) const char *s; int col,row; { if (s != (char *)0) { alleg_WriteStr((char *)s,strlen(s),col,row,g_attribute); } } void alleg_xputc(ch,attr) /* write out character (and attribute) */ char ch; int attr; { int col,row; col = curcol; row = currow; switch(ch) { case '\n': col = 0; ++row; break; default: alleg_WriteChar((unsigned char)ch,col,row,attr); if (col < (CO -1 )) ++col; break; } /* end switch */ alleg_gotoloc(col,row); } # if defined(USE_TILES) void alleg_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) { alleg_WriteChar((unsigned char)ch,col,row,attr); } else if (!iflags.over_view) { if ((col >= clipx) && (col <= clipxmax)) { if (!ReadPlanarTileFile(glyph2tile[glyphnum], &planecell)) alleg_DisplayCell(planecell, col - clipx, row); else pline("alleg_xputg: Error reading tile (%d,%d) from file", glyphnum,glyph2tile[glyphnum]); } } else { if (!ReadPlanarTileFile_O(glyph2tile[glyphnum], &planecell_O)) alleg_DisplayCell_O(planecell_O, col, row); else pline("alleg_xputg: Error reading tile (%d,%d) from file", glyphnum,glyph2tile[glyphnum]); } if (col < (CO - 1 )) ++col; alleg_gotoloc(col,row); } # endif /* USE_TILES */ /* * Cursor location manipulation, and location information fetching * routines. * These include: * * alleg_gotoloc(x,y) - Moves the "cursor" on screen to the specified x * and y character cell location. This routine * determines the location where screen writes * will occur next, it does not change the location * of the player on the NetHack level. */ void alleg_gotoloc(col,row) int col,row; { curcol = min(col,CO - 1); /* protection from callers */ currow = min(row,LI - 1); } # if defined(USE_TILES) && defined(CLIPPING) void alleg_cliparound(x, y) int x, y; { extern boolean restoring; int oldx = clipx; if (!iflags.tile_view || iflags.over_view || iflags.traditional_view) return; if (x < clipx + 5) { clipx = max(0, x - (viewport_size / 2)); clipxmax = clipx + (viewport_size - 1); } else if (x > clipxmax - 5) { clipxmax = min(COLNO - 1, x + (viewport_size / 2)); clipx = clipxmax - (viewport_size - 1); } if (clipx != oldx) { if (on_level(&u.uz0, &u.uz) && !restoring) /* (void) doredraw(); */ alleg_redrawmap(1); } } STATIC_OVL void alleg_redrawmap(clearfirst) boolean clearfirst; { int j,x,y,t; char __far *pch; char volatile a; if (clearfirst) { /* y here is in pixel rows */ outportb(0x3ce,5); outportb(0x3cf,2); t = TOP_MAP_ROW * ROWS_PER_CELL; for (y = t; y < (ROWNO * ROWS_PER_CELL) + t; ++y) { pch = screentable[y]; for (j=0; j < SCREENBYTES; ++j) { outportb(0x3ce,8); outportb(0x3cf,255); /* On VGA mode2, must read first, then write */ a = READ_ABSOLUTE(pch); WRITE_ABSOLUTE(pch, (char)BACKGROUND_alleg_COLOR); ++pch; } } outportb(0x3ce,5); outportb(0x3cf,0); } /* y here is in screen rows*/ # ifdef ROW_BY_ROW for (y = 0; y < ROWNO; ++y) for (x = clipx; x <= clipxmax; ++x) { # else for (x = clipx; x <= clipxmax; ++x) for (y = 0; y < ROWNO; ++y) { # endif if (iflags.traditional_view) { if (!(clearfirst && map[y][x].ch == S_stone)) alleg_WriteChar( (unsigned char)map[y][x].ch, x,y + TOP_MAP_ROW,map[y][x].attr); } else { t = map[y][x].glyph; if (!(clearfirst && t == cmap_to_glyph(S_stone))) { if (!iflags.over_view) { if (!ReadPlanarTileFile(glyph2tile[t], &planecell)) { alleg_DisplayCell(planecell, x - clipx, y + TOP_MAP_ROW); } else pline("alleg_redrawmap: Error reading tile (%d,%d)", t,glyph2tile[t]); } else { if (!ReadPlanarTileFile_O(glyph2tile[t], &planecell_O)) { alleg_DisplayCell_O(planecell_O, x, y + TOP_MAP_ROW); } else pline("alleg_redrawmap: Error reading tile (%d,%d)", t,glyph2tile[t]); } } } } } # endif /* USE_TILES && CLIPPING */ # endif /* OVL0 */ # ifdef OVL2 void alleg_userpan(left) boolean left; { int x; /* pline("Into userpan"); */ if (iflags.over_view || iflags.traditional_view) return; if (left) x = min(COLNO - 1, clipxmax + 10); else x = max(0, clipx - 10); alleg_cliparound(x, 10); /* y value is irrelevant on VGA clipping */ positionbar(); alleg_DrawCursor(); } void alleg_overview(on) boolean on; { /* alleg_HideCursor(); */ if (on) { iflags.over_view = TRUE; clipx = 0; clipxmax = CO - 1; } else { iflags.over_view = FALSE; clipx = max(0, (curcol - viewport_size / 2)); if (clipx > ((CO - 1) - viewport_size)) clipx = (CO - 1) - viewport_size; clipxmax = clipx + (viewport_size - 1); } } void alleg_traditional(on) boolean on; { /* alleg_HideCursor(); */ if (on) { /* switch_graphics(ASCII_GRAPHICS); */ iflags.traditional_view = TRUE; clipx = 0; clipxmax = CO - 1; } else { iflags.traditional_view = FALSE; if (!iflags.over_view) { clipx = max(0, (curcol - viewport_size / 2)); if (clipx > ((CO - 1) - viewport_size)) clipx = (CO - 1) - viewport_size; clipxmax = clipx + (viewport_size - 1); } } } void alleg_refresh() { positionbar(); alleg_redrawmap(1); alleg_DrawCursor(); } # ifdef SCROLLMAP STATIC_OVL void alleg_scrollmap(left) boolean left; { int j,x,y,t; int i,pixx,pixy,x1,y1,x2,y2; int byteoffset, vplane; char __far *tmp1; char __far *tmp2; unsigned char source[SCREENPLANES][80]; unsigned char first,second; pixy = row2y(TOP_MAP_ROW); /* convert to pixels */ pixx = col2x(x1); if (left) { x1 = 20; x2 = 0; } else { x1 = 0; x2 = 20; } /* read each row, all columns but the one to be replaced */ for(i = 0;i < (ROWNO-1) * ROWS_PER_CELL; ++i) { tmp1 = screentable[i + pixy]; tmp1 += x1; for(vplane=0; vplane < SCREENPLANES; ++vplane) { egareadplane(vplane); for (byteoffset = 0; byteoffset < 20; ++byteoffset) { tmp2 = tmp1 + byteoffset; source[vplane][byteoffset] = READ_ABSOLUTE(tmp2); } } tmp1 = screentable[i + pixy]; tmp1 += x2; for(vplane=0; vplane < SCREENPLANES; ++vplane) { egawriteplane(vp2[vplane]); for (byteoffset = 0; byteoffset < 20; ++byteoffset) { tmp2 = tmp1 + byteoffset; WRITE_ABSOLUTE(tmp2,source[vplane][byteoffset]); } } egawriteplane(15); } if (left) { i = clipxmax - 1; j = clipxmax; } else { i = clipx; j = clipx + 1; } for (y = 0; y < ROWNO; ++y) { for (x = i; x < j; x += 2) { t = map[y][x].glyph; if (!ReadPlanarTileFile(glyph2tile[t], &planecell)) alleg_DisplayCell(planecell, x - clipx, y + TOP_MAP_ROW); else pline("alleg_shiftmap: Error reading tile (%d,%d)", t, glyph2tile[t]); } } } # endif /* SCROLLMAP */ # endif /* OVL2 */ # ifdef OVLB /* * Open tile files, * initialize the SCREEN, switch it to graphics mode, * initialize the pointers to the fonts, clear * the screen. * */ void alleg_Init(void) { int i, c; (void) allegro_init(); # ifdef USE_TILES int tilefailure = 0; /* * Attempt to open the required tile files. If we can't * don't perform the video mode switch, use TTY code instead. * */ /* if (alleg_OpenTileBMP(NETHACK_PLANAR_TILEFILE, FALSE)) tilefailure |= 1; if (alleg_OpenTileBMP(NETHACK_OVERVIEW_TILEFILE, TRUE)) tilefailure |= 2; if (!(planar_tile_bmp = load_bitmap("ptile.bmp",paletteptr))) tilefailure |= 1; if (!(overview_tile_bmp = load_bitmap("otile.bmp", NULL))) tilefailure |= 2; if (!paletteptr) tilefailure |= 4; */ if (tilefailure) { raw_printf("Reverting to TTY mode, tile initialization failure (%d).", tilefailure); wait_synch(); iflags.usevga = 0; iflags.tile_view = FALSE; iflags.over_view = FALSE; CO = 80; LI = 25; /* clear_screen() /* not alleg_clear_screen() */ return; } # endif if (iflags.usealleg) { for (i=0; i < SCREENHEIGHT; ++i) { screentable[i]=create_bitmap(800, 600); clear(screentable[i]); } } alleg_SwitchMode(MODE800x600); windowprocs.win_cliparound = alleg_cliparound; # ifdef USE_TILES iflags.tile_view = TRUE; iflags.over_view = FALSE; set_palette(paletteptr); # endif g_attribute = attrib_gr_normal; clear_screen(); clipx = 0; clipxmax = clipx + (viewport_size - 1); } /* * Switches modes of the video card. * * If mode == MODETEXT (0x03), then the card is placed into text * mode. If mode == 640x480, then the card is placed into vga * mode (video mode 0x12). No other modes are currently supported. * */ void alleg_SwitchMode(unsigned int mode) { if ((mode == MODE800x600) || (mode == MODETEXT)) { if (iflags.usealleg && (mode == MODE800x600)) { iflags.grmode = 1; } else { iflags.grmode = 0; } (void) set_gfx_mode(GFX_AUTODETECT,800,600,0,0); } else { iflags.grmode = 0; /* force text mode for error msg */ (void) set_gfx_mode(GFX_TEXT,0,0,0,0); g_attribute = attrib_text_normal; impossible("alleg_SwitchMode: Bad video mode requested 0x%X", mode); } } /* * This allows grouping of several tasks to be done when * switching back to text mode. This is a public (extern) function. * */ void alleg_Finish(void) { CloseTileFile(0); CloseTileFile(1); alleg_SwitchMode(MODETEXT); windowprocs.win_cliparound = tty_cliparound; g_attribute = attrib_text_normal; iflags.tile_view = FALSE; } #if 0 /* * Turn off any border colour that might be enabled in the VGA card * register. * * I disabled this after modifying tile2bin.c to remap black & white * to a more standard values - MJA 94/04/23. * */ STATIC_OVL void alleg_NoBorder(int bc) { union REGS regs; regs.h.ah = (char)0x10; regs.h.al = (char)0x01; regs.h.bh = (char)bc; regs.h.bl = 0; (void) int86(VIDEO_BIOS, ®s, ®s); } #endif /* * This will verify the existance of a VGA adapter on the machine. * Video function call 0x1a returns 0x1a in AL if successful, and * returns the following values in BL for the active display: * * 0=no display, 1=MDA, 2=CGA, 4=EGA(color-monitor), * 5=EGA(mono-monitor), 6=PGA, 7=VGA(mono-monitor), 8=VGA(color-monitor), * 0xB=MCGA(mono-monitor), 0xC=MCGA(color-monitor), 0xFF=unknown) */ int alleg_detect() { return 1; } /* * This is the routine that displays a high-res "cell" pointed to by 'gp' * at the desired location (col,row). * * Note: (col,row) in this case refer to the coordinate location in * NetHack character grid terms, (ie. the 40 x 25 character grid), * not the x,y pixel location. * */ void alleg_DisplayCell(gp,col,row) struct planar_cell_struct *gp; int col,row; { int i,pixx,pixy; char __far *tmp_s; /* source pointer */ char __far *tmp_d; /* destination pointer */ int vplane; pixy = row2y(row); /* convert to pixels */ pixx = col2x(col); for(vplane=0; vplane < SCREENPLANES; ++vplane) { egawriteplane(vp[vplane]); for(i=0;i < ROWS_PER_CELL; ++i) { tmp_d = screentable[i+pixy]; tmp_d += pixx; /* * memcpy((void *)tmp,(void *)gp->plane[vplane].image[i], * BYTES_PER_CELL); */ tmp_s = gp->plane[vplane].image[i]; WRITE_ABSOLUTE(tmp_d, (*tmp_s)); ++tmp_s; ++tmp_d; WRITE_ABSOLUTE(tmp_d, (*tmp_s)); } } egawriteplane(15); } void alleg_DisplayCell_O(gp,col,row) struct overview_planar_cell_struct *gp; int col,row; { int i,pixx,pixy; char __far *tmp_s; /* source pointer */ char __far *tmp_d; /* destination pointer */ int vplane; pixy = row2y(row); /* convert to pixels */ pixx = col; for(vplane=0; vplane < SCREENPLANES; ++vplane) { egawriteplane(vp[vplane]); for(i=0;i < ROWS_PER_CELL; ++i) { tmp_d = screentable[i+pixy]; tmp_d += pixx; /* * memcpy((void *)tmp,(void *)gp->plane[vplane].image[i], * BYTES_PER_CELL); */ tmp_s = gp->plane[vplane].image[i]; WRITE_ABSOLUTE(tmp_d, (*tmp_s)); } } egawriteplane(15); } /* * Write the character string pointed to by 's', whose maximum length * is 'len' at location (x,y) using the 'colour' colour. * */ void alleg_WriteStr(s,len,col,row,colour) char *s; int len,col,row,colour; { unsigned char *us; int i = 0; /* protection from callers */ if (row > (LI-1)) return; i = 0; us = (unsigned char *)s; while( (*us != 0) && (i < len) && (col < (CO - 1))) { alleg_WriteChar(*us,col,row,colour); ++us; ++i; ++col; } } # endif /* OVLB */ # ifdef OVLB /*static unsigned char colorbits[]={0x01,0x02,0x04,0x08}; /* wrong */ static unsigned char colorbits[]={0x08,0x04,0x02,0x01}; #ifdef POSITIONBAR #define PBAR_ROW (LI - 4) #define PBAR_COLOR_ON 15 /* slate grey background colour of tiles */ #define PBAR_COLOR_OFF 12 /* bluish grey, used in old style only */ #define PBAR_COLOR_STAIRS 9 /* brown */ #define PBAR_COLOR_HERO 14 /* creamy white */ static unsigned char pbar[COLNO]; void alleg_update_positionbar(posbar) char *posbar; { char *p = pbar; if (posbar) while (*posbar) *p++ = *posbar++; *p = 0; } STATIC_OVL void positionbar() { char *posbar = pbar; int feature, ucol; int k, y, colour, row; char __far *pch; char bitblock; int startk, stopk; char volatile a; boolean nowhere = FALSE; int pixy = (PBAR_ROW * MAX_ROWS_PER_CELL); int tmp; if (!iflags.grmode || !iflags.tile_view) return; if ((clipx < 0) || (clipxmax <= 0) || (clipx >= clipxmax)) nowhere = TRUE; if (nowhere) { #ifdef DEBUG pline("Would have put bar using %d - %d.",clipx,clipxmax); #endif return; } #ifdef OLD_STYLE outportb(0x3ce,5); outportb(0x3cf,2); for (y=pixy; y < (pixy + MAX_ROWS_PER_CELL); ++y) { pch = screentable[y]; for (k=0; k < SCREENBYTES; ++k) { if ((k < clipx) || (k > clipxmax)) { colour = PBAR_COLOR_OFF; } else colour = PBAR_COLOR_ON; outportb(0x3ce,8); outportb(0x3cf,255); a = READ_ABSOLUTE(pch); /* Must read , then write */ WRITE_ABSOLUTE(pch, (char)colour); ++pch; } } outportb(0x3ce,5); outportb(0x3cf,0); #else colour = PBAR_COLOR_ON; outportb(0x3ce,5); outportb(0x3cf,2); for (y=pixy, row = 0; y < (pixy + MAX_ROWS_PER_CELL); ++y, ++row) { pch = screentable[y]; if ((!row) || (row == (ROWS_PER_CELL-1))) { startk = 0; stopk = SCREENBYTES; } else { startk = clipx; stopk = clipxmax; } for (k=0; k < SCREENBYTES; ++k) { if ((k < startk) || (k > stopk)) colour = BACKGROUND_alleg_COLOR; else colour = PBAR_COLOR_ON; outportb(0x3ce,8); outportb(0x3cf,255); a = READ_ABSOLUTE(pch); /* Must read , then write */ WRITE_ABSOLUTE(pch, (char)colour); ++pch; } } outportb(0x3ce,5); outportb(0x3cf,0); #endif ucol = 0; if (posbar) { while (*posbar != 0) { feature = *posbar++; switch (feature) { case '>': alleg_special(feature, (int)*posbar++, PBAR_COLOR_STAIRS); break; case '<': alleg_special(feature, (int)*posbar++, PBAR_COLOR_STAIRS); break; case '@': ucol = (int)*posbar++; alleg_special(feature, ucol, PBAR_COLOR_HERO); break; default: /* unanticipated symbols */ alleg_special(feature, (int)*posbar++, PBAR_COLOR_STAIRS); break; } } } # ifdef SIMULATE_CURSOR if (inmap) { tmp = curcol + 1; if ((tmp != ucol) && (curcol >= 0)) alleg_special('_', tmp, PBAR_COLOR_HERO); } # endif } void alleg_special(chr,col,color) int chr,col,color; { int i,y,pixx,pixy; char __far *tmp_d; /* destination pointer */ int vplane; char fnt; char bits[SCREENPLANES][ROWS_PER_CELL]; pixy = PBAR_ROW * MAX_ROWS_PER_CELL; for(vplane=0; vplane < SCREENPLANES; ++vplane) { egareadplane(vplane); y = pixy; for(i=0;i < ROWS_PER_CELL; ++i) { tmp_d = screentable[y++] + col; bits[vplane][i] = READ_ABSOLUTE(tmp_d); fnt = READ_ABSOLUTE((font + ((chr<<4) + i))); if (colorbits[vplane] & color) bits[vplane][i] |= fnt; else bits[vplane][i] &= ~fnt; } } for(vplane=0; vplane < SCREENPLANES; ++vplane) { egawriteplane(vp[vplane]); y = pixy; for(i=0;i < ROWS_PER_CELL; ++i) { tmp_d = screentable[y++] + col; WRITE_ABSOLUTE(tmp_d, (bits[vplane][i])); } } egawriteplane(15); } # endif POSITIONBAR # ifdef SIMULATE_CURSOR static struct planar_cell_struct undercursor; static struct planar_cell_struct cursor; void alleg_DrawCursor() { int i,pixx,pixy,x,y,p; char __far *tmp1; char __far *tmp2; unsigned char first,second; /* char on[2] = {0xFF,0xFF}; */ /* char off[2] = {0x00,0x00}; */ boolean isrogue = Is_rogue_level(&u.uz); boolean singlebyte = (isrogue || iflags.over_view || iflags.traditional_view || !inmap); int curtyp; if (!cursor_type && inmap) return; /* CURSOR_INVIS - nothing to do */ x = min(curcol,(CO - 1)); /* protection from callers */ y = min(currow,(LI - 1)); /* protection from callers */ if (!singlebyte && ((x < clipx) || (x > clipxmax))) return; pixy = row2y(y); /* convert to pixels */ if (singlebyte) pixx = x; else pixx = col2x((x-clipx)); for(i=0;i < ROWS_PER_CELL; ++i) { tmp1 = screentable[i+pixy]; tmp1 += pixx; tmp2 = tmp1 + 1; egareadplane(3); /* memcpy(undercursor.plane[3].image[i],tmp1,BYTES_PER_CELL); */ undercursor.plane[3].image[i][0] = READ_ABSOLUTE(tmp1); if (!singlebyte) undercursor.plane[3].image[i][1] = READ_ABSOLUTE(tmp2); egareadplane(2); /* memcpy(undercursor.plane[2].image[i],tmp1,BYTES_PER_CELL); */ undercursor.plane[2].image[i][0] = READ_ABSOLUTE(tmp1); if (!singlebyte) undercursor.plane[2].image[i][1] = READ_ABSOLUTE(tmp2); egareadplane(1); /* memcpy(undercursor.plane[1].image[i],tmp1,BYTES_PER_CELL); */ undercursor.plane[1].image[i][0] = READ_ABSOLUTE(tmp1); if (!singlebyte) undercursor.plane[1].image[i][1] = READ_ABSOLUTE(tmp2); egareadplane(0); /* memcpy(undercursor.plane[0].image[i],tmp1,BYTES_PER_CELL); */ undercursor.plane[0].image[i][0] = READ_ABSOLUTE(tmp1); if (!singlebyte) undercursor.plane[0].image[i][1] = READ_ABSOLUTE(tmp2); } /* * Now we have a snapshot of the current cell. * Make a copy of it, then manipulate the copy * to include the cursor, and place the tinkered * version on the display. */ cursor = undercursor; if (inmap) curtyp = cursor_type; else curtyp = CURSOR_UNDERLINE; switch(curtyp) { case CURSOR_CORNER: for(i = 0; i < 2; ++i) { if (!i) { if (singlebyte) first = 0xC3; else first = 0xC0; second = 0x03; } else { if (singlebyte) first = 0x81; else first = 0x80; second = 0x01; } for (p=0; p < 4; ++p) { if (cursor_color & colorbits[p]) { cursor.plane[p].image[i][0] |= first; if (!singlebyte) cursor.plane[p].image[i][1] |= second; } else { cursor.plane[p].image[i][0] &= ~first; if (!singlebyte) cursor.plane[p].image[i][1] &= ~second; } } } for(i = ROWS_PER_CELL - 2; i < ROWS_PER_CELL; ++i) { if (i != (ROWS_PER_CELL-1)) { if (singlebyte) first = 0x81; else first = 0x80; second = 0x01; } else { if (singlebyte) first = 0xC3; else first = 0xC0; second = 0x03; } for (p=0; p < SCREENPLANES; ++p) { if (cursor_color & colorbits[p]) { cursor.plane[p].image[i][0] |= first; if (!singlebyte) cursor.plane[p].image[i][1] |= second; } else { cursor.plane[p].image[i][0] &= ~first; if (!singlebyte) cursor.plane[p].image[i][1] &= ~second; } } } break; case CURSOR_UNDERLINE: i = ROWS_PER_CELL - 1; first = 0xFF; second = 0xFF; for (p=0; p < SCREENPLANES; ++p) { if (cursor_color & colorbits[p]) { cursor.plane[p].image[i][0] |= first; if (!singlebyte) cursor.plane[p].image[i][1] |= second; } else { cursor.plane[p].image[i][0] &= ~first; if (!singlebyte) cursor.plane[p].image[i][1] &= ~second; } } break; case CURSOR_FRAME: /* fall through */ default: for(i = 0; i < ROWS_PER_CELL; ++i) { if ((i == 0) || (i == (ROWS_PER_CELL-1))) { first = 0xFF; second = 0xFF; } else { if (singlebyte) first = 0x81; else first = 0x80; second = 0x01; } for (p=0; p < SCREENPLANES; ++p) { if (cursor_color & colorbits[p]) { cursor.plane[p].image[i][0] |= first; if (!singlebyte) cursor.plane[p].image[i][1] |= second; } else { cursor.plane[p].image[i][0] &= ~first; if (!singlebyte) cursor.plane[p].image[i][1] &= ~second; } } } break; } /* * Place the new cell onto the display. * */ for(i=0;i < ROWS_PER_CELL; ++i) { tmp1 = screentable[i+pixy]; tmp1 += pixx; tmp2 = tmp1 + 1; egawriteplane(8); /* memcpy(tmp1,cursor.plane[3].image[i],BYTES_PER_CELL); */ WRITE_ABSOLUTE(tmp1,cursor.plane[3].image[i][0]); if (!singlebyte) WRITE_ABSOLUTE(tmp2,cursor.plane[3].image[i][1]); egawriteplane(4); /* memcpy(tmp1,cursor.plane[2].image[i],BYTES_PER_CELL); */ WRITE_ABSOLUTE(tmp1,cursor.plane[2].image[i][0]); if (!singlebyte) WRITE_ABSOLUTE(tmp2,cursor.plane[2].image[i][1]); egawriteplane(2); /* memcpy(tmp1,cursor.plane[1].image[i],BYTES_PER_CELL); */ WRITE_ABSOLUTE(tmp1,cursor.plane[1].image[i][0]); if (!singlebyte) WRITE_ABSOLUTE(tmp2,cursor.plane[1].image[i][1]); egawriteplane(1); /* memcpy(tmp1,cursor.plane[0].image[i],BYTES_PER_CELL); */ WRITE_ABSOLUTE(tmp1,cursor.plane[0].image[i][0]); if (!singlebyte) WRITE_ABSOLUTE(tmp2,cursor.plane[0].image[i][1]); } egawriteplane(15); #ifdef POSITIONBAR if (inmap) positionbar(); #endif } void alleg_HideCursor() { int i,pixx,pixy,x,y; char __far *tmp1; char __far *tmp2; boolean isrogue = Is_rogue_level(&u.uz); boolean singlebyte = (isrogue || iflags.over_view || iflags.traditional_view || !inmap); int curtyp; if (inmap && !cursor_type) return; /* CURSOR_INVIS - nothing to do */ /* protection from callers */ x = min(curcol,(CO - 1)); y = min(currow,(LI-1)); if (!singlebyte && ((x < clipx) || (x > clipxmax))) return; pixy = row2y(y); /* convert to pixels */ if (singlebyte) pixx = x; else pixx = col2x((x-clipx)); if (inmap) curtyp = cursor_type; else curtyp = CURSOR_UNDERLINE; if (curtyp == CURSOR_UNDERLINE) /* optimization for uline */ i = ROWS_PER_CELL - 1; else i = 0; for(;i < ROWS_PER_CELL; ++i) { tmp1 = screentable[i+pixy]; tmp1 += pixx; tmp2 = tmp1 + 1; egawriteplane(8); /* memcpy(tmp,undercursor.plane[3].image[i],BYTES_PER_CELL); */ WRITE_ABSOLUTE(tmp1,undercursor.plane[3].image[i][0]); if (!singlebyte) WRITE_ABSOLUTE(tmp2,undercursor.plane[3].image[i][1]); egawriteplane(4); /* memcpy(tmp,undercursor.plane[2].image[i],BYTES_PER_CELL); */ WRITE_ABSOLUTE(tmp1,undercursor.plane[2].image[i][0]); if (!singlebyte) WRITE_ABSOLUTE(tmp2,undercursor.plane[2].image[i][1]); egawriteplane(2); /* memcpy(tmp,undercursor.plane[1].image[i],BYTES_PER_CELL); */ WRITE_ABSOLUTE(tmp1,undercursor.plane[1].image[i][0]); if (!singlebyte) WRITE_ABSOLUTE(tmp2,undercursor.plane[1].image[i][1]); egawriteplane(1); /* memcpy(tmp,undercursor.plane[0].image[i],BYTES_PER_CELL); */ WRITE_ABSOLUTE(tmp1,undercursor.plane[0].image[i][0]); if (!singlebyte) WRITE_ABSOLUTE(tmp2,undercursor.plane[0].image[i][1]); } egawriteplane(15); } # endif /* SIMULATE_CURSOR */ # endif /* OVLB */ #endif /* SCREEN_VGA */ /* vidvga.c */ slashem-0.0.7E7F3/sys/msdos/alginit.h0000664000076400007640000005624510545462317015433 0ustar aliali/* WAC - added some error checking code so that it exits gracefully rather than * crashing if some of the load_bitmap() calls fail * - since TTY works again, will switch to TTY if we haven't set the * graphics mode yet and there's an error * * - Added support for one big tile file for all the monsters/objects/other tiles * I can't seem to get the sub-bitmaps coexisting in the mix so far, so right * now it needs a lot of memory when loading - it loads the big tile bitmap * then has to make a lot of smaller ones. :( (pretty much using 2x the amount * of space that it really should) * - tiles_loaded also determines whether all gfx bitmaps are drawn, etc as well * well as tiles being loaded. * - use new_bitmap instead of create_bitmap - check for running out of memory * - 8-bit color mode support is barely functional * -indexed tile loading not done * -blending, color conversion problems * -fade out doesn't work * - don't do antialiasing, 2xSaI on the tiles here */ #include "2xsai.h" static BITMAP * FDECL(load_tile_bitmap,(char *, RGB *)); static BITMAP * FDECL(new_bitmap,(int, int)); static BITMAP * FDECL(load_convert_bitmap,(char *, RGB *)); static void NDECL(display_nh_title); static void FDECL(resize_tile_bitmap, (BITMAP *, BITMAP *, int, int, int, int)); static boolean font_loaded = FALSE; static PALETTE loadpal; /* For loading - using NULL pointers causes * problems in pure DOS, it seems :P */ static RGB background_black = { 0, 0, 0 }; void alleg_Init(void) { char filename[60]; int i; FILE *fp; char buf[BUFSZ]; char *bufp; uchar translate[MAXPCHARS]; int len; windowprocs.win_cliparound = alleg_cliparound; if(tiles_loaded) { /* * Seems we need this, since we can't detect our current video state * Otherwise, things will crash if we shell out (to text-mode) * then return without fixing the videomode */ alleg_SwitchMode(ALLEG_MODEGFX); return; } alleg_load_cnf(); set_color_depth(alleg_colordepth); if(alleg_SwitchMode(ALLEG_MODEGFX) < 0) { /* This shouldn't occur! But it might... */ raw_printf("Reverting to TTY mode, could not initialize %dx%dx%d video mode.", X_RES, Y_RES, alleg_colordepth); wait_synch(); iflags.usevga = 0; iflags.tile_view = FALSE; iflags.over_view = FALSE; CO = 80; LI = 25; /* clear_screen() /* not vga_clear_screen() */ return; } iflags.grmode = 1; /* In graphics mode now */ CO = X_RES/FONTX; LI = Y_RES/FONTY; X_WIDTH = X_RES; Y_HEIGHT = (Y_RES - 4*FONTY); #if 0 if(tiles_loaded) #endif { int x, y; clear_to_color(screen, makecol(0,0,0)); /* Load the tiles. Try the big amalgamation before index */ /* This should also set up tile_x and tile_y */ if (strlen(bigtile_file) > 0) { /* Try to load user-specified tile file */ sprintf(filename, bigtile_file); alltiles = load_bitmap(filename, tilepal); } if (!alltiles) { /* Try default tile files */ for (i = 0; (i < SIZE(default_tilesets) && !alltiles); i++) { sprintf(filename, default_tilesets[i]); alltiles = load_bitmap(filename, tilepal); } } if (alltiles) { int tilefile_x = alltiles->w / TILES_PER_ROW; int tilefile_y = alltiles->h / TILES_PER_COL; if (alleg_colordepth == 8) { /* Set palette for 8-bit mode */ set_palette(tilepal); /* setup transparent drawing */ create_trans_table(&half_solidity, tilepal, 128, 128, 128, NULL); color_map = &half_solidity; } if (!tile_x) { tile_x = tilefile_x; } if (!tile_y) { tile_y = tilefile_y; } /* Autodetect 3D tiles if needed * Look for tile_x : tile_y ratio of * 3 : 4 */ if (draw_3Dtiles == -1) { if (((tile_x * 4) / 3) == tile_y) draw_3Dtiles = 1; else draw_3Dtiles = 0; } sprintf(filename, "%serror%s", TILEDIR, EXT); errorbmp = load_tile_bitmap (filename, loadpal); if (!errorbmp) { error("could not open %s!", filename); } display_nh_title(); for(i = 0; i < TOTAL_TILES_USED; i++) { int col = (int)(i % TILES_PER_ROW); int row = (int)(i / TILES_PER_ROW); /* using create_sub_bitmap * doesn't seem to agree well with some of the drawing * functions in vidalleg.c so we have to blit a copy * * However, we now can do stretching here as well... */ tilecache[i] = new_bitmap(tile_x, tile_y); resize_tile_bitmap(alltiles, tilecache[i],col*tilefile_x, row*tilefile_y, tilefile_x, tilefile_y); #if 0 nh_stretch_blit(alltiles, tilecache[i], col*tilefile_x, row*tilefile_y, tilefile_x, tilefile_y, 0,0, tile_x, tile_y); #endif inc_progress_meter(); } destroy_bitmap (alltiles); } else { sprintf(filename, "%sindex", TILEDIR); if ((fp = fopenp(filename, "r")) == (FILE *)0) { error("could not open 32tile.bmp or tiles/index!"); return; } i = 0; while(fgets(buf,120,fp) && i < TOTAL_TILES_USED) { if (*buf == '#') continue; bufp = eos(buf); while (--bufp > buf && isspace(*bufp)) continue; if (bufp <= buf) continue; /* skip all-blank lines */ else *(bufp + 1) = '\0'; /* terminate line */ /* find the '=' or ':' */ bufp = index(buf, ':'); if (!bufp) { error("invalid entry in index!"); } bufp++; /* we only want what's after the ':' */ /* skip whitespace between '=' and value */ do { ++bufp; } while (isspace(*bufp)); bufp = mungspaces(bufp); sprintf(filename, "%s%s", TILEDIR, bufp); tilecache[i] = load_tile_bitmap(filename, loadpal); if(!tilecache[i]) { tilecache[i] = errorbmp; } if (i == 0) { if (!tile_x || !tile_y) { /* Fill in unknown tile size info */ if (tilecache[i]) { /* First tile is not an error */ if (!tile_x) tile_x = tilecache[i]->w; if (!tile_y) tile_y = tilecache[i]->h; } else { /* Default to 32x32 */ if (!tile_x) tile_x = 32; if (!tile_y) tile_y = 32; } /* Autodetect 3D tiles if needed * Look for tile_x : tile_y ratio of * 3 : 4 */ if (draw_3Dtiles == -1) { if (((tile_x * 4) / 3) == tile_y) draw_3Dtiles = 1; else draw_3Dtiles = 0; } } display_nh_title(); sprintf(filename, "%serror%s", TILEDIR, EXT); errorbmp = load_tile_bitmap (filename, loadpal); if (!errorbmp) { error("could not open %s!", filename); } } inc_progress_meter(); i++; } while (i < TOTAL_TILES_USED) { tilecache[i] = errorbmp; inc_progress_meter(); i++; } fclose(fp); } for(i=0; i < NUM_SUBSTITUTES; i++) { sprintf(filename, "%s%s%s%s", TILEDIR, "subs\\", substnames[i], EXT); substitutes[i] = load_tile_bitmap(filename, loadpal); #if 0 /* We want to leave this null so that we don't sub in */ if(!substitutes[i]) substitutes[i] = errorbmp; #endif inc_progress_meter(); } for(i = 0; i < (min(tile_x/2, tile_y/2) - 1); i++) { shields[i] = new_bitmap(tile_x,tile_y); clear_to_color(shields[i], makecol(255,0,255)); circlefill(shields[i], tile_x/2, tile_y/2, min(tile_x/2, tile_y/2), makecol(255,255,255)); circlefill(shields[i], tile_x/2, tile_y/2, i, makecol(255,0,255)); inc_progress_meter(); } for(i = 0; i < SIZE(enames); i++) { sprintf(filename, "%s%s%s%s", TILEDIR, "spfx\\", enames[i], EXT); explosions[i] = load_convert_bitmap(filename, loadpal); if (!explosions[i]) { error("could not open %s!", filename); } inc_progress_meter(); } for(i = 0; i < 8; i++) { BITMAP *animation; int j; sprintf(filename, "%s%s%s%s", TILEDIR, "spfx\\", anames[i], EXT); animation = load_convert_bitmap(filename, loadpal); if (!animation) { error("could not open %s!", filename); } for(j = 0; j < 28; j++) { auras[i][j] = new_bitmap(tile_x*2,tile_y*2); nh_stretch_blit(animation, auras[i][j], 0, j*64, 64, 64, 0, 0, tile_x*2, tile_y*2); inc_progress_meter(); } destroy_bitmap(animation); } sprintf(filename, "%s%s%s", TILEDIR, "32on", EXT); hudwidgets[ON32] = load_convert_bitmap(filename, loadpal); if (!hudwidgets[ON32]) { error("could not open %s!", filename); } sprintf(filename, "%s%s%s", TILEDIR, "32off", EXT); hudwidgets[OFF32] = load_convert_bitmap(filename, loadpal); if (!hudwidgets[OFF32]) { error("could not open %s!", filename); } sprintf(filename, "%s%s%s", TILEDIR, "16on", EXT); hudwidgets[ON16] = load_convert_bitmap(filename, loadpal); if (!hudwidgets[ON16]) { error("could not open %s!", filename); } sprintf(filename, "%s%s%s", TILEDIR, "16off", EXT); hudwidgets[OFF16] = load_convert_bitmap(filename, loadpal); if (!hudwidgets[OFF16]) { error("could not open %s!", filename); } { BITMAP *wbmp; sprintf(filename, "%s%s%s", TILEDIR, "map", EXT); wbmp = load_convert_bitmap(filename, loadpal); if (!wbmp) { error("could not open %s!", filename); } mapwidgets[0] = new_bitmap(5,5); blit(wbmp, mapwidgets[0], 0, 0, 0, 0, 5, 5); mapwidgets[1] = new_bitmap(5,5); blit(wbmp, mapwidgets[1], 5, 0, 0, 0, 5, 5); mapwidgets[2] = new_bitmap(5,5); blit(wbmp, mapwidgets[2], 5, 5, 0, 0, 5, 5); } tiles_loaded = 1; TILEX = tile_x; TILEY = tile_y; /* These need tile_x and tile_y to be set up properly first */ if (draw_3Dtiles) sprintf(filename, "%scursor3d%s", TILEDIR, EXT); else sprintf(filename, "%scursor%s", TILEDIR, EXT); cursorbmp = load_tile_bitmap (filename, loadpal); if (!cursorbmp) { error("could not open %s!", filename); } ovcursor = new_bitmap(X_RES/80, Y_HEIGHT/23); nh_stretch_blit (cursorbmp, ovcursor, 0, 0, tile_x, tile_y, 0, 0, X_RES/80, Y_HEIGHT/23); txt_subscreen = new_bitmap(80*FONTX, 23*FONTY); clear_to_color(txt_subscreen, makecol(0,0,0)); tile_subscreen = new_bitmap(80*tile_x, 23*tile_y); clear_to_color(tile_subscreen, makecol(0,0,0)); subscreen = tile_subscreen; minimap = new_bitmap(80, 24); clear_to_color(minimap, makecol(0,0,0)); under_cursor = new_bitmap(tile_x, tile_y); } #if 0 else { /* Set palette for 8-bit mode */ if (alleg_colordepth == 8) { set_palette(tilepal); } } #endif windowprocs.win_cliparound = alleg_cliparound; iflags.tile_view = TRUE; iflags.over_view = FALSE; g_attribute = attrib_gr_normal; alleg_clear_screen(makecol(0,0,0)); } /* * Investigated problems with lower resolutions. It seems that since this is based * off tty code, so it thinks that there isn't room, even though the clipping * is actually done in this code. */ #define MIN_XRES (COLNO*FONTX) #define MIN_YRES ((ROWNO+3)*FONTX) #define MIN_COLORDEPTH 8 void alleg_load_cnf() { FILE *fp; char buf[BUFSZ]; char *bufp; if ((fp = fopenp("alleg.cnf", "r")) != (FILE *)0) { while(fgets(buf,80,fp)) { if (*buf == '#') continue; /* remove trailing whitespace */ bufp = eos(buf); while (--bufp > buf && isspace(*bufp)) continue; if (bufp <= buf) continue; /* skip all-blank lines */ else *(bufp + 1) = '\0'; /* terminate line */ /* find the '=' or ':' */ bufp = index(buf, '='); if (!bufp) continue; /* skip whitespace between '=' and value */ do { ++bufp; } while (isspace(*bufp)); if(!strncmpi(buf, "videomode", 9)) { if(!strncmpi(bufp, "vesa1", 5)) video_mode = GFX_VESA1; else if(!strncmpi(bufp, "vesa2l", 6)) video_mode = GFX_VESA2L; else if(!strncmpi(bufp, "vesa2b", 6)) video_mode = GFX_VESA2B; else if(!strncmpi(bufp, "vesa3", 5)) video_mode = GFX_VESA3; else if(!strncmpi(bufp, "vbeaf", 5)) video_mode = GFX_VBEAF; } else if(!strncmpi(buf, "hud", 3)) { if(!strncmpi(bufp, "equip", 5)) hud_setting = 1; else if(!strncmpi(bufp, "map", 3)) hud_setting = 2; else if(!strncmpi(bufp, "combo", 5)) hud_setting = 3; } else if(!strncmpi(buf, "barstyle", 8)) { if(!strncmpi(bufp, "fancy", 5)) fancy_meters = 1; else fancy_meters = 0; } else if(!strncmpi(buf, "width", 5)) { X_RES = string_to_int(bufp); } else if(!strncmpi(buf, "height", 6)) { Y_RES = string_to_int(bufp); } else if(!strncmpi(buf, "colordepth", 10)) { alleg_colordepth = string_to_int(bufp); } else if(!strncmpi(buf, "text", 4)) { attrib_allegro_normal = string_to_int(bufp); } else if(!strncmpi(buf, "hilite", 6)) { attrib_allegro_intense = string_to_int(bufp); } else if(!strncmpi(buf, "status", 6)) { attrib_allegro_status = string_to_int(bufp); } else if(!strncmpi(buf, "scroll_lim", 10)) { scroll_lim = string_to_int(bufp); } else if(!strncmpi(buf, "smoothing", 9)) { smoothing = string_to_int(bufp); } else if(!strncmpi(buf, "fxdelay", 7)) { fx_delay = string_to_int(bufp); } else if(!strncmpi(buf, "tile_width", 10)) { tile_x = string_to_int(bufp); } else if(!strncmpi(buf, "tile_height", 11)) { tile_y = string_to_int(bufp); } else if(!strncmpi(buf, "bigtile_file", 12)) { Strcpy(bigtile_file, bufp); } else if(!strncmpi(buf, "interpolate", 11)) { use_2xsai = string_to_int(bufp); } else if(!strncmpi(buf, "draw_3Dtiles", 12)) { if(!strncmpi(bufp, "Y", 1)) draw_3Dtiles = 1; else if(!strncmpi(bufp, "1", 1)) draw_3Dtiles = 1; else if(!strncmpi(bufp, "N", 1)) draw_3Dtiles = 0; else if(!strncmpi(bufp, "0", 1)) draw_3Dtiles = 0; else draw_3Dtiles = -1; } if (use_2xsai && alleg_colordepth != 16) { use_2xsai = !use_2xsai; } if(X_RES < MIN_XRES) error("Width specified too small."); if(Y_RES < MIN_YRES) error("Height specified too small."); if(alleg_colordepth < MIN_COLORDEPTH) error("minimum color depth is 15."); if(smoothing > 2) smoothing = 2; attrib_gr_normal = attrib_allegro_normal; attrib_gr_intense = attrib_allegro_intense; } fclose(fp); } } /* This loads a bitmap and stretches it to tile_x by tile_y if needed * Assumes only 1 (one) tile in the file */ static BITMAP * load_tile_bitmap(filename, colors) char * filename; RGB * colors; { BITMAP * retbmp; retbmp = load_convert_bitmap(filename, colors); /* tile_x or tile_y not initialized yet! */ /* No bitmap loaded! */ if (!tile_x || !tile_y || !retbmp) return retbmp; /* Check size */ if (retbmp->w != tile_x || retbmp->h != tile_y) { /* Stretch to fit*/ BITMAP *tmp = retbmp; retbmp = new_bitmap(tile_x, tile_y); resize_tile_bitmap(tmp, retbmp, 0, 0, tmp->w, tmp->h); #if 0 nh_stretch_blit(tmp, retbmp, 0, 0, tmp->w, tmp->h, 0, 0, tile_x, tile_y); #endif destroy_bitmap(tmp); } return (retbmp); } /* This creates a new bitmap and checks whether it succeeded */ static BITMAP * new_bitmap(x, y) int x, y; { BITMAP * new_bmp; new_bmp = create_bitmap(x, y); if (!new_bmp) { error("Could not generate bitmap (%i, %i) - possibly out of memory?", x, y); } else return new_bmp; } /* This loads the files required for the title and displays them * It also initializes the progress bar (for tile loading) */ static void display_nh_title() { char filename[60]; FILE *fp; char buf[BUFSZ]; BITMAP *titlebmp; BITMAP *palbmp; int x,y, i; int bottom_of_title; FONT *loadfont; /* WAC load font file if present (do this only once!) */ #if 0 if (!font_loaded) { font_loaded = TRUE; loadfont = load_font("anethack.fnt"); if (loadfont) font = loadfont; else { error("Could not load anethack.fnt."); } } #endif /* Background */ sprintf(filename, "%stitlebg%s", TILEDIR, EXT); titlebmp=load_convert_bitmap(filename, loadpal); if (titlebmp) { for(x = 0; x < X_RES; x += titlebmp->w) for(y = 0; y < Y_RES; y += titlebmp->h) blit(titlebmp, screen, 0, 0, x, y, titlebmp->w, titlebmp->h); destroy_bitmap(titlebmp); } else clear_to_color(screen, colorpal[CLR_WHITE]); sprintf(filename, "%stitle%s", TILEDIR, EXT); titlebmp=load_convert_bitmap(filename, loadpal); if (titlebmp) { masked_blit(titlebmp, screen, 0, 0, (X_RES-titlebmp->w)/2, (Y_RES-titlebmp->h)/4, titlebmp->w, titlebmp->h); bottom_of_title = (Y_RES-titlebmp->h)/4 + titlebmp->h; destroy_bitmap(titlebmp); } else bottom_of_title = Y_RES; text_mode(-1); /* transparent text output */ textout_centre(screen, font, mungspaces(COPYRIGHT_BANNER_A), X_RES/2, bottom_of_title + FONTY*2, makecol(0,0,0)); textout_centre(screen, font, mungspaces(COPYRIGHT_BANNER_B), X_RES/2, bottom_of_title + FONTY*3, makecol(0,0,0)); textout_centre(screen, font, mungspaces(COPYRIGHT_BANNER_C), X_RES/2, bottom_of_title + FONTY*4, makecol(0,0,0)); textout_centre(screen, font, mungspaces(COPYRIGHT_BANNER_D), X_RES/2, bottom_of_title + FONTY*5, makecol(0,0,0)); sprintf(filename, "%scredits", TILEDIR); if ((fp = fopenp(filename, "r")) != (FILE *)0) { fgets(buf,80,fp); textout_centre(screen, font, mungspaces(buf), X_RES/2, bottom_of_title + FONTY*6, makecol(0,0,0)); fclose(fp); } text_mode(makecol(0,0,0)); /* on black */ /* load the Nethack compatible palette */ sprintf(filename, "%spal%s", TILEDIR, EXT); palbmp=load_convert_bitmap(filename, loadpal); if (!palbmp) { error("could not open %s!", filename); } for(i=0; i < 16; i++) { colorpal[i] = getpixel(palbmp, 0, i); } destroy_bitmap(palbmp); init_progress_meter(); } /* a dodgy hack to convert all files loaded to the current palette (for 8bit) * This code loads the the bitmap in truecolor (24bit) mode then converts it * to the current palette via blit() * * It returne load_bitmap() if alleg_colordepth != 8 */ static BITMAP * load_convert_bitmap(filename, colors) char * filename; RGB * colors; { BITMAP * retbmp; if (alleg_colordepth == 8) { BITMAP * tmp_bmp; set_color_depth(24); tmp_bmp = load_bitmap(filename, colors); if (tmp_bmp) { retbmp = create_bitmap_ex(8, tmp_bmp->w, tmp_bmp->h); blit(tmp_bmp, retbmp, 0, 0, 0, 0, tmp_bmp->w, tmp_bmp->h); destroy_bitmap(tmp_bmp); } else retbmp = tmp_bmp; set_color_depth(8); } else { /* Load the bitmap */ retbmp = load_bitmap(filename, colors); } return retbmp; } static void resize_tile_bitmap (source, dest, source_x, source_y, width, height) BITMAP *source, *dest; int source_x, source_y, width, height; { /* Basic sanity checks */ if (!source || !dest || (dest->w != tile_x) || (dest->h != tile_y)) return; if (!draw_3Dtiles || ((width * 4 / 3) == height)) { nh_stretch_blit(source, dest, source_x, source_y, width, height, 0, 0, tile_x, tile_y); } else { clear_to_color(dest, makecol(255, 0, 255)); nh_stretch_blit(source, dest, source_x, source_y, width, height, TILE_3D_OFFSETX/2, TILE_3D_OFFSETY/2, TILE_3D_WIDTH, TILE_3D_HEIGHT); } } slashem-0.0.7E7F3/sys/msdos/template.mak0000664000076400007640000017473610545462317016146 0ustar aliali# SCCS Id: @(#)template.mak 3.4 1996/10/25 # Copyright (c) NetHack PC Development Team 1996 # ?BEGIN? ?SCCS? ?MSC? # PC NetHack 3.4 Makefile for Microsoft(tm) "C" >= 7.0 and MSVC >= 1.0 ?ENDMSC? ?BC? # PC NetHack 3.4 Makefile for Borland C++ 3.1. ?ENDBC? # # Nota Bene: Before you get to here you should have already read # the Install.dos file located in the sys/msdos directory. ?BC? # Additionally, you should run this makefile with the -N # Microsoft Compatibility option. # # This Makefile is for use with Borland C++ version 3.1. # # This Makefile is specific to Borland's MAKE which is supplied with the # compiler. It supports only one overlay management facility - VROOMM. # (This Makefile won't work with make45l or NDMAKE) ?ENDBC? ?MSC? # # This Makefile is for use with Microsoft C version 7 and Microsoft Visual C++ # Professional Edition (MSVC) version 1.0 or greater. # # This Makefile is specific to Microsoft's NMAKE which is supplied with the # more recent Microsoft C compilers. # It supports only one overlay management facility - MOVE. # (This Makefile won't work with make45l or NDMAKE) # # 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 or byacc) # .l lex (such as flex) ?ENDMSC? # # Game Installation Variables. # NOTE: Make sure GAMEDIR exists before nmake is started. # GAME = NetHack GAMEDIR = c:\games\nethack # # # Directories # DAT = ..\dat DOC = ..\doc INCL = ..\include SRC = ..\src OBJ = o MSYS = ..\sys\msdos SYS = ..\sys\share UTIL = ..\util WTTY = ..\win\tty WSHR = ..\win\share # # Compiler File Info. # ($(MAKE) macro is often predefined, so we use $(MAKEBIN) instead.) # ?MSC? CC = cl # Compiler LINK = link # Linker ASM = masm # Assembler (not currently needed for MSC 7 and > ) MAKEBIN = nmake UUDECODE = uudecode # Unix style uudecoder ?ENDMSC? ?BC? CC = bcc # Compiler LINK = tlink # Linker ASM = tasm # Assembler (not currently needed for BC) MAKEBIN = make UUDECODE = uudecode # Unix style uudecoder #BCTOP = c:\borlandc # main Borland C++ directory BCTOP = c:\bc31 ?ENDBC? # # Yacc/Lex ... if you got 'em. # # If you have yacc and lex programs (or work-alike such as bison # and flex), comment out the upper two lines below, and uncomment # the lower two. ?BC? # # On Borland C++, the newest versions of flex and bison provide # problems when run from MAKE. ?ENDBC? # DO_YACC = YACC_MSG DO_LEX = LEX_MSG #DO_YACC = YACC_ACT #DO_LEX = LEX_ACT # # - Specify your yacc and lex programs (or work-alikes for each) here. # YACC = bison -y #YACC = yacc #YACC = byacc LEX = flex #LEX = lex # # - Specify your flex skeleton file (if needed). # FLEXSKEL = #FLEXSKEL = -Sc:\tools16\flex.ske # # - Your yacc (or work-alike) output files # YTABC = y_tab.c YTABH = y_tab.h #YTABC = ytab.c #YTABH = ytab.h # # - Your lex (or work-alike) output files # LEXYYC = lexyy.c #LEXYYC = lex.yy.c # # Optional high-quality BSD random number generation routines # (see pcconf.h). Set to nothing if not used. # RANDOM = $(OBJ)\random.o #RANDOM = # # If TERMLIB is #defined in the source (in include\pcconf.h), # comment out the upper line and uncomment the lower. Make sure # that TERMLIB contains the full pathname to the termcap library. TERMLIB = #TERMLIB = $(SYS)\termcap.lib # # MEMORY USAGE AND OVERLAYING # # Overlay Schema 1 # # - Minimal extended memory available, lots of 640K base RAM free # Minimize overlay turns. Requires that a minimum of ?MSC? # 560K RAM be free as follows: # 430K Executable load requirement # 60K Overlay buffer # 70K for malloc() calls # 560K Total memory requirement ?ENDMSC? ?BC? # 607K RAM be free as follows: # 462K Executable load requirement # 115K for malloc() calls # 30K Overlay buffer # 607K Total memory requirement ?ENDBC? # # Overlay Schema 2 # # - Favor small load size, requires extended memory for bearable performance. # If you have very little base 640K RAM available, but lots of extended # memory for caching overlays, you might try this. (eg. A machine with # lots of TSR's or network drivers). Do not try to set SCHEMA = 2 # without a disk cache and extended memory. ?BC? # 381K Executable load requirement # 115K for malloc() calls # 30K Overlay buffer # 526K Total memory requirement ?ENDBC? ?MSC? # 360K Executable load requirement # 60K Overlay buffer # 70K for malloc() calls # 419K Total memory requirement # # Overlay Schema 3 # # - Minimal extended memory available, lots of 640K base RAM free # Similar to schema1, but the overlay buffer is twice as large, so # in theory more overlays can be resident at the same time. The cost is # that the base memory requirement goes up considerably. # This requires that you obtain the moveinit.c and moveapi.h files from # your Microsoft C source/move directory, and place them into the src # directory. Then apply the patch moveinit.pat file found in sys/msdos. # Requirements: # 360K Executable load requirement # 95K Overlay buffer # 70K for malloc() calls # 525K Total memory requirement ?ENDMSC? # ?BC? # On Borland C++, you have to make a full rebuild of all object modules each # time you change schemas. # ?ENDBC? SCHEMA = 1 # # OPTIONAL TILE SUPPORT. # # This release of NetHack allows you to build a version of NetHack # that will draw 16x16 color tiles on the display to represent # NetHack maps, objects, monsters, etc. on machines with appropriate # display hardware. Currently the only supported video hardware is # VGA. # # Note: You can build NetHack with tile support and then choose # whether to use it or not at runtime via the defaults.nh file option # "video". # TILESUPPORT = Y # # C COMPILER AND LINKER SETTINGS # # For debugging ability, comment out the upper three # macros and uncomment the lower three. You can also # uncomment only either LDFLAGSU or LDFLAGSN if you # want to include debug information only in the utilities # or only in the game file. ?BC? # On Borland C++, you cannot include debug information for # all the object modules because the linker cannot handle # it. ?ENDBC? #CDFLAGS = ?MSC? #LDFLAGSN = ?ENDMSC? ?BC? LDFLAGSN = ?ENDBC? #LDFLAGSU = ?MSC? CDFLAGS = /Zi # use debug info (compiler) LDFLAGSN = /CO # use debug info (linker - game) LDFLAGSU = /CO # use debug info (linker - utilities) ?ENDMSC? ?BC? CDFLAGS = -v -vi # use debug info (compiler) #LDFLAGSN = /v # use debug info (linker - game) LDFLAGSU = /v # use debug info (linker - utilities) ?ENDBC? # ?MSC? # - Force a change in the C warning level for all builds. # (Its W0 setting in the CL environment variable will take # precedence if left blank here). ?ENDMSC? ?BC? # - Don't warn about unreachable code because flex generates a whole bunch # of unreachable code warnings, which stops the compile process. ?ENDBC? # ?MSC? CW = #CW =/W3 ?ENDMSC? ?BC? CW = -w-rch ?ENDBC? # # Select whether to use pre-compiled headers or not. # Set PRECOMPHEAD to Y to use pre-compiled headers, set it to anything # else and pre-compiled headers will not be used. # (Pre-compiled headers speed up compiles, but require a bit more # disk space during the build. The pre-compiled headers can be deleted # afterwards via DEL *.PCH if desired). # PRECOMPHEAD = N # # C Compiler Flags # ?MSC? # Note: # # CL environment variable should already be set to: # CL= /AL /G2 /Oo /Gs /Gt16 /Zp1 /W0 /I..\include /nologo /DMOVERLAY # ?ENDMSC? ?MSC? CFLAGS = /c ?ENDMSC? ?BC? CFLAGS = -c ?ENDBC? # Uncomment the line below if you want to store all the level files, # help files, etc. in a single library file (recommended). USE_DLB = Y # ######################################################################## ######################################################################## # # Nothing below here should have to be changed. # ######################################################################## ######################################################################## # # Warning: # # Changing anything below here means that you should be *very* # familiar with your compiler's workings, *very* knowledgeable # about the overlay structure and mechanics of NetHack, and *very* # confident in your understanding of Makefiles and Make utilities. # ######################################################################## # # Default Make Procedure # default: $(GAME) # ######################################################################## # Tile preparation # ! IF ("$(TILESUPPORT)"=="Y") TILEGAME = $(OBJ)\tile.o $(OBJ)\pctiles.0 $(OBJ)\pctiles.b # # - VGA Tile Support, uncomment these three lines. # TILEVGA = $(OBJ)\vidvga.0 $(OBJ)\vidvga.1 $(OBJ)\vidvga.2 $(OBJ)\vidvga.b PLANAR_TIB = NetHack1.tib OVERVIEW_TIB = NetHacko.tib # # Leave this line uncommented and unchanged. TILEUTIL = $(TILEGAME) $(TILEVGA) $(UTIL)\tile2bin.exe $(UTIL)\til2bin2.exe \ $(PLANAR_TIB) $(OVERVIEW_TIB) ! ENDIF ! IF ("$(USE_DLB)"=="Y") DLB = nhdat ! ELSE DLB = ! ENDIF # ############################################################################# # # General Overlay Schema Settings # ?MSC? LNKOPT = schema$(SCHEMA).def ?ENDMSC? ?BC? !include schema$(SCHEMA).bc OVLINIT =$(OBJ)\ovlinit.o ?ENDBC? ?MSC? # # - Specific Overlay Schema Settings # ! IF ($(SCHEMA)==1) INTOVL = /DYNAMIC:1250 /NOE OVLINIT = ! ENDIF ! IF ($(SCHEMA)==2) INTOVL = /DYNAMIC:1380 /NOE OVLINIT = ! ENDIF ! IF ($(SCHEMA)==3) INTOVL = /DYNAMIC:1170 OVLINIT = $(OBJ)\moveinit.o $(OBJ)\ovlinit.o ! ENDIF ?ENDMSC? # ############################################################################# # # C Compiler and Linker Setup Options # (To Maintainer; modify only if absolutely necessary) # ?BC? BCINCL = $(BCTOP)\include # include directory for main BC headers BCLIB = $(BCTOP)\lib # library directory for main BC libraries BCCFG = nethack.cfg # name of the nethack configuration file ?ENDBC? # # Model # ?MSC? MODEL = L ?ENDMSC? ?BC? MODEL = h ?ENDBC? # # - Optional C library specifier for those with non-standard # libraries or a multiple-target library setup. # CLIB = ?MSC? #CLIB = llibcer /nod ?ENDMSC? ?BC? # # Borland C++ libraries # BCOVL = $(BCLIB)\OVERLAY BCMDL = $(BCLIB)\C$(MODEL) ?ENDBC? # # Compiler Options # ?MSC? CNOLNK = /c # just generate .OBJ CPCHUSE = /YuHACK.H # use precompiled headers CPCHGEN = /YcHACK.H # generate precompiled headers CPCHNAM = /Fp # set the name of the precompiled header file CPCHEXT = .PCH # precompiled header extension CDEFINE = /D # define a macro CCSNAM = /NT # set the code segment name COBJNAM = /Fo # name the .OBJ file CNOOPT = /f- /Od # disable optimizations (must be first in line) # /f- = don't use the "fast" compiler,its buggy ?ENDMSC? ?MSCMACRO:CSNAMOA= ? ?MSCMACRO:CSNAMOB=$(CCSNAM)$(@F) ? ?MSCMACRO:CSNAM0=$(CCSNAM)$(@F) ? ?MSCMACRO:CSNAM1=$(CCSNAM)$(@F) ? ?MSCMACRO:CSNAM2=$(CCSNAM)$(@F) ? ?MSCMACRO:CSNAM3=$(CCSNAM)$(@F) ? ?MSCMACRO:CSNAMB=$(CCSNAM)$(@F) ? ?BC? CNOLNK = -c # just generate .OBJ CPCHUSE = -Hu # use precompiled headers CPCHGEN = -H # generate precompiled headers CPCHNAM = -H= # set the name of the precompiled header file CPCHEXT = .PCH # precompiled header extension CDEFINE = -D # define a macro CSTKSZ = -DSTKSIZ= # set stack size CCSNAM = -zC # set the code segment name COBJNAM = -o # name the .OBJ file ?ENDBC? ?BCMACRO:CSNAMOA=$$($(@B)_o) ? ?BCMACRO:CSNAMOB=$$($(@B)_o) ? ?BCMACRO:CSNAM0=$$($(@B)_0) ? ?BCMACRO:CSNAM1=$$($(@B)_1) ? ?BCMACRO:CSNAM2=$$($(@B)_2) ? ?BCMACRO:CSNAM3=$$($(@B)_3) ? ?BCMACRO:CSNAMB=$$($(@B)_b) ? # # Linker Options # ?MSC? LWCASE = /NOI # treat case as significant LMAP = /MAP # create map file LSTKSZ = /ST: # set stack size LMAXSEG = /SE:400 # maximum number of segments allowed LMAXALL = /CPARM:1 # maximum program memory allocation (?) LINFO = /INFO # display link information while processing ?ENDMSC? ?BC? LWCASE = /c # treat case as significant LMAP = /m # create map file LINIT = $(BCLIB)\C0$(MODEL) # initialization object file LOVL = /oOVLY # overlay all needed segments ?ENDBC? # # Stack Sizes # STKSUTL = 4096 # Utilities Stack Size STKSNRM = 5120 # Normal Stack Size ?MSC? LUSTACK = $(LSTKSZ)$(STKSUTL) # Utilities Stack Set for Linker LNSTACK = $(LSTKSZ)$(STKSNRM) # Normal Stack Set for Linker ?ENDMSC? ?BC? CUSTACK = $(CSTKSZ)$(STKSUTL) # Utilities Stack Set for Compiler CNSTACK = $(CSTKSZ)$(STKSNRM) # Normal Stack Set for Compiler ?ENDBC? # ######################################################################## # DLB preparation # ! IF ("$(USE_DLB)"=="Y") DLBFLG = $(CDEFINE)DLB ! ELSE DLBFLG = ! ENDIF # ######################################################################## # tile preparation # ! IF ("$(TILESUPPORT)"=="Y") TILFLG = $(CDEFINE)USE_TILES ! ELSE TILFLG = ! ENDIF ############################################################################# # # Overlay switches # COVL0 = $(CDEFINE)OVL0 COVL1 = $(CDEFINE)OVL1 COVL2 = $(CDEFINE)OVL2 COVL3 = $(CDEFINE)OVL3 COVLB = $(CDEFINE)OVLB # # Flags # FLAGOPT = $(DLBFLG) $(TILFLG) # # Precompiled Header Section # ?BC? #common options (placed in $(BCCFG)) CFLGTOT = $(CDFLAGS) $(CFLAGS) $(FLAGOPT) $(CW) #util builds CFLAGSU = +$(BCCFG) $(CUSTACK) #normal build, no PCH CFLAGSN = +$(BCCFG) $(CNSTACK) ?ENDBC? ?MSC? #util builds CFLAGSU = $(CDFLAGS) $(CFLAGS) $(CW) $(FLAGOPT) $(CUSTACK) #normal build, no PCH CFLAGSN = $(CDFLAGS) $(CFLAGS) $(CW) $(FLAGOPT) $(CNSTACK) ?ENDMSC? #no optimizations CFLAGNO = $(CNOOPT) $(CFLAGSN) ! IF ("$(PRECOMPHEAD)"!="Y") CFLAGCO = $(COVLO) CFLAGUO = $(COVLO) CFLAGC0 = $(COVL0) CFLAGU0 = $(COVL0) CFLAGC1 = $(COVL1) CFLAGU1 = $(COVL1) CFLAGC2 = $(COVL2) CFLAGU2 = $(COVL2) CFLAGC3 = $(COVL3) CFLAGU3 = $(COVL3) CFLAGCB = $(COVLB) CFLAGUB = $(COVLB) PCHO = PCH0 = PCH1 = PCH2 = PCH3 = PCHB = precomp.msg: @echo Not using precompiled headers... ! ELSE # .o files CFLAGUO = $(CPCHUSE) $(CPCHNAM)PHO$(CPCHEXT) $(COVLO) CFLAGCO = $(CPCHGEN) $(CPCHNAM)PHO$(CPCHEXT) $(COVLO) PCHO = PHO$(CPCHEXT) # .0 files CFLAGU0 = $(CPCHUSE) $(CPCHNAM)PH0$(CPCHEXT) $(COVL0) CFLAGC0 = $(CPCHGEN) $(CPCHNAM)PH0$(CPCHEXT) $(COVL0) PCH0 = PH0$(CPCHEXT) # .1 files CFLAGU1 = $(CPCHUSE) $(CPCHNAM)PH1$(CPCHEXT) $(COVL1) CFLAGC1 = $(CPCHGEN) $(CPCHNAM)PH1$(CPCHEXT) $(COVL1) PCH1 = PH1$(CPCHEXT) # .2 files CFLAGU2 = $(CPCHUSE) $(CPCHNAM)PH2$(CPCHEXT) $(COVL2) CFLAGC2 = $(CPCHGEN) $(CPCHNAM)PH2$(CPCHEXT) $(COVL2) PCH2 = PH2$(CPCHEXT) # .3 files CFLAGU3 = $(CPCHUSE) $(CPCHNAM)PH3$(CPCHEXT) $(COVL3) CFLAGC3 = $(CPCHGEN) $(CPCHNAM)PH3$(CPCHEXT) $(COVL3) PCH3 = PH3$(CPCHEXT) # .B files CFLAGUB = $(CPCHUSE) $(CPCHNAM)PHB$(CPCHEXT) $(COVLB) CFLAGCB = $(CPCHGEN) $(CPCHNAM)PHB$(CPCHEXT) $(COVLB) PCHB = PHB$(CPCHEXT) precomp.msg: @echo Using precompiled headers... ! ENDIF ?BC? FLAGCO = $(CNSTACK) +CFLAGCO.CFG FLAGUO = $(CNSTACK) +CFLAGUO.CFG FLAGC0 = $(CNSTACK) +CFLAGC0.CFG FLAGU0 = $(CNSTACK) +CFLAGU0.CFG FLAGC1 = $(CNSTACK) +CFLAGC1.CFG FLAGU1 = $(CNSTACK) +CFLAGU1.CFG FLAGC2 = $(CNSTACK) +CFLAGC2.CFG FLAGU2 = $(CNSTACK) +CFLAGU2.CFG FLAGC3 = $(CNSTACK) +CFLAGC3.CFG FLAGU3 = $(CNSTACK) +CFLAGU3.CFG FLAGCB = $(CNSTACK) +CFLAGCB.CFG FLAGUB = $(CNSTACK) +CFLAGUB.CFG ?ENDBC? ?MSC? FLAGCO = $(CFLAGSN) $(CFLAGCO) FLAGUO = $(CFLAGSN) $(CFLAGUO) FLAGC0 = $(CFLAGSN) $(CFLAGC0) FLAGU0 = $(CFLAGSN) $(CFLAGU0) FLAGC1 = $(CFLAGSN) $(CFLAGC1) FLAGU1 = $(CFLAGSN) $(CFLAGU1) FLAGC2 = $(CFLAGSN) $(CFLAGC2) FLAGU2 = $(CFLAGSN) $(CFLAGU2) FLAGC3 = $(CFLAGSN) $(CFLAGC3) FLAGU3 = $(CFLAGSN) $(CFLAGU3) FLAGCB = $(CFLAGSN) $(CFLAGCB) FLAGUB = $(CFLAGSN) $(CFLAGUB) ?ENDMSC? # End of Pre-compiled header section #=========================================================================== ?MSC? # # Controls whether MOVE tracing is enabled in the executable # This should be left commented unless you are tinkering with the # overlay structure of NetHack. The executable runs _very_ # slowly when the movetr.lib is linked in. # #MOVETR= movetr.lib # do not change this ! IF ("$(MOVETR)"!="") MVTRCL = $(CDEFINE)MOVE_PROF ! ELSE MVTRCL = ! ENDIF ?ENDMSC? # # Linker options for building various things. # LFLAGSU = $(LDFLAGSU) $(LUSTACK) $(LINIT) LFLAGSN = $(LDFLAGSN) $(LNSTACK) $(LWCASE) $(LMAXSEG) $(INTOVL) $(LMAXALL) \ $(LINFO) $(LINIT) $(LOVL) # # Make Roolz dude. # Due to the inadequacy of some makes these must accord with a # topological sort of the generated-from relation... output on # the left, input on the right. Trust me. # .SUFFIXES: .exe .0 .1 .2 .3 .B .o .til .uu .c .y .l # # Rules for files in src # .c{$(OBJ)}.o: @$(CC) $(FLAGUO) ?[CSNAMOB]$(COBJNAM)$@ $< {$(SRC)}.c{$(OBJ)}.o: $(CC) $(FLAGUO) ?[CSNAMOB]$(COBJNAM)$@ $< {$(SRC)}.c{$(OBJ)}.0: $(CC) $(FLAGU0) ?[CSNAM0]$(COBJNAM)$@ $< {$(SRC)}.c{$(OBJ)}.1: $(CC) $(FLAGU1) ?[CSNAM1]$(COBJNAM)$@ $< {$(SRC)}.c{$(OBJ)}.2: $(CC) $(FLAGU2) ?[CSNAM2]$(COBJNAM)$@ $< {$(SRC)}.c{$(OBJ)}.3: $(CC) $(FLAGU3) ?[CSNAM3]$(COBJNAM)$@ $< {$(SRC)}.c{$(OBJ)}.B: $(CC) $(FLAGUB) ?[CSNAMB]$(COBJNAM)$@ $< # # Rules for files in sys\share # {$(SYS)}.c{$(OBJ)}.o: $(CC) $(FLAGUO) ?[CSNAMOA]$(COBJNAM)$@ $< {$(SYS)}.c{$(OBJ)}.0: $(CC) $(FLAGU0) ?[CSNAM0]$(COBJNAM)$@ $< {$(SYS)}.c{$(OBJ)}.1: $(CC) $(FLAGU1) ?[CSNAM1]$(COBJNAM)$@ $< {$(SYS)}.c{$(OBJ)}.2: $(CC) $(FLAGU2) ?[CSNAM2]$(COBJNAM)$@ $< {$(SYS)}.c{$(OBJ)}.3: $(CC) $(FLAGU3) ?[CSNAM3]$(COBJNAM)$@ $< {$(SYS)}.c{$(OBJ)}.B: $(CC) $(FLAGUB) ?[CSNAMB]$(COBJNAM)$@ $< # # Rules for files in sys\msdos # {$(MSYS)}.c{$(OBJ)}.o: $(CC) $(FLAGUO) ?[CSNAMOA]$(COBJNAM)$@ $< {$(MSYS)}.c{$(OBJ)}.0: $(CC) $(FLAGU0) ?[CSNAM0]$(COBJNAM)$@ $< {$(MSYS)}.c{$(OBJ)}.1: $(CC) $(FLAGU1) ?[CSNAM1]$(COBJNAM)$@ $< {$(MSYS)}.c{$(OBJ)}.2: $(CC) $(FLAGU2) ?[CSNAM2]$(COBJNAM)$@ $< {$(MSYS)}.c{$(OBJ)}.3: $(CC) $(FLAGU3) ?[CSNAM3]$(COBJNAM)$@ $< {$(MSYS)}.c{$(OBJ)}.B: $(CC) $(FLAGUB) ?[CSNAMB]$(COBJNAM)$@ $< {$(MSYS)}.h{$(INCL)}.h: @copy $< $@ # # Rules for files in util # {$(UTIL)}.c{$(OBJ)}.o: $(CC) $(CFLAGSU) ?[CSNAMOB]$(COBJNAM)$@ $< # # Rules for files in win\share # {$(WSHR)}.c.o: @$(CC) $(FLAGUO) ?[CSNAMOA]$(COBJNAM)$@ $< {$(WSHR)}.c{$(OBJ)}.o: @$(CC) $(FLAGUO) ?[CSNAMOA]$(COBJNAM)$@ $< {$(WSHR)}.h{$(INCL)}.h: @copy $< $@ {$(WSHR)}.txt{$(DAT)}.txt: @copy $< $@ # # Rules for files in win\tty # {$(WTTY)}.c{$(OBJ)}.o: $(CC) $(FLAGUO) ?[CSNAMOA]$(COBJNAM)$@ $< {$(WTTY)}.c{$(OBJ)}.0: $(CC) $(FLAGU0) ?[CSNAM0]$(COBJNAM)$@ $< {$(WTTY)}.c{$(OBJ)}.1: $(CC) $(FLAGU1) ?[CSNAM1]$(COBJNAM)$@ $< {$(WTTY)}.c{$(OBJ)}.2: $(CC) $(FLAGU2) ?[CSNAM2]$(COBJNAM)$@ $< {$(WTTY)}.c{$(OBJ)}.3: $(CC) $(FLAGU3) ?[CSNAM3]$(COBJNAM)$@ $< {$(WTTY)}.c{$(OBJ)}.B: $(CC) $(FLAGUB) ?[CSNAMB]$(COBJNAM)$@ $< # # NETHACK OBJECTS # # This section creates shorthand macros for many objects # referenced later on in the Makefile. # # # Shorten up the location for some files # O = $(OBJ)\ # comment so \ isn't last char U = $(UTIL)\ # comment so \ isn't last char # # 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 ?LIST:SPLEVOBJS? $(O)lev_yacc.o $(O)lev_$(LEX).o $(O)lev_main.o $(O)alloc.o $(O)decl.o $(O)drawing.o $(O)monst.o $(O)objects.o $(O)panic.o $(O)stubvid.o ?ENDLIST? ?LIST:DGNCOMPOBJS? $(O)dgn_yacc.o $(O)dgn_$(LEX).o $(O)dgn_main.o $(O)alloc.o $(O)panic.o ?ENDLIST? RECOVOBJS = $(O)recover.o ?LIST:GIFREADERS? $(O)gifread.o $(O)alloc.o $(O)panic.o ?ENDLIST? ?LIST:TEXT_IO? $(O)tiletext.o $(O)tiletxt.o $(O)drawing.o $(O)decl.o $(O)monst.o $(O)objects.o $(O)stubvid.o ?ENDLIST? PPMWRITERS = $(O)ppmwrite.o $(O)alloc.o $(O)panic.o ?LIST:GIFREAD2? $(O)gifread2.o $(O)alloc.o $(O)panic.o ?ENDLIST? ?LIST:TEXT_IO2? $(O)tiletex2.o $(O)tiletxt2.o $(O)drawing.o $(O)decl.o $(O)monst.o $(O)objects.o $(O)stubvid.o ?ENDLIST? PPMWRIT2 = $(O)ppmwrit2.o $(O)alloc.o $(O)panic.o TILEFILES = $(WSHR)\monsters.txt $(WSHR)\objects.txt $(WSHR)\other.txt TILEFILES2 = $(WSHR)\monthin.txt $(WSHR)\objthin.txt $(WSHR)\oththin.txt DLBOBJS = $(O)dlb_main.o $(O)dlb.o $(O)alloc.o $(O)panic.o # # Object files for the game itself. # OBJ01 = $(O)alloc.o $(RANDOM) $(O)decl.o $(O)objects.o \ $(O)muse.o $(O)display.o $(O)vision.o \ $(O)rect.o $(O)vis_tab.o $(O)monst.o $(O)wintty.o \ $(O)files.o $(O)sys.o $(O)monstr.o $(O)minion.o \ $(O)worm.o $(O)detect.o $(O)exper.o $(O)mplayer.o \ $(O)uhitm.o $(O)pager.o $(O)windows.o $(O)quest.o \ $(O)questpgr.o $(O)write.o $(O)drawing.o $(O)dokick.o \ $(O)dothrow.o $(O)pickup.o $(O)pray.o $(O)spell.o \ $(O)ball.o $(O)wield.o $(O)worn.o $(O)fountain.o \ $(O)music.o $(O)rumors.o $(O)dlb.o $(O)sit.o \ $(O)bones.o $(O)mklev.o $(O)save.o $(O)restore.o \ $(O)mkmaze.o $(O)mkmap.o $(O)end.o $(O)o_init.o \ $(O)options.o $(O)rip.o $(O)sound.o $(O)teleport.o \ $(O)topten.o $(O)tty.o $(O)u_init.o $(O)extralev.o \ $(O)sp_lev.o $(O)dig.o $(O)pckeys.o $(O)role.o \ $(O)steed.o $(O)region.o OVL0 = $(O)allmain.0 $(O)apply.0 $(O)artifact.0 $(O)attrib.0 \ $(O)botl.0 $(O)cmd.0 $(O)dbridge.0 $(O)do.0 \ $(O)do_name.0 $(O)do_wear.0 $(O)dogmove.0 $(O)dungeon.0 \ $(O)eat.0 $(O)engrave.0 $(O)hacklib.0 $(O)invent.0 \ $(O)lock.0 $(O)pcmain.0 $(O)mail.0 $(O)makemon.0 \ $(O)mcastu.0 $(O)mhitm.0 $(O)mhitu.0 $(O)mkobj.0 \ $(O)mkroom.0 $(O)mon.0 $(O)mondata.0 $(O)monmove.0 \ $(O)mthrowu.0 $(O)objnam.0 $(O)polyself.0 $(O)priest.0 \ $(O)rnd.0 $(O)shknam.0 $(O)sounds.0 $(O)steal.0 \ $(O)timeout.0 $(O)track.0 $(O)trap.0 $(O)vault.0 \ $(O)weapon.0 $(O)were.0 $(O)wizard.0 $(O)msdos.0 \ $(O)termcap.0 $(O)video.0 $(O)vidtxt.0 $(O)zap.0 \ $(O)explode.0 $(O)shk.0 OVL1 = $(O)allmain.1 $(O)apply.1 $(O)artifact.1 $(O)attrib.1 \ $(O)botl.1 $(O)cmd.1 $(O)dbridge.1 $(O)do.1 \ $(O)do_wear.1 $(O)dog.1 $(O)dungeon.1 $(O)eat.1 \ $(O)engrave.1 $(O)hack.1 $(O)hacklib.1 $(O)invent.1 \ $(O)makemon.1 $(O)mhitu.1 $(O)mkobj.1 $(O)mon.1 \ $(O)mondata.1 $(O)monmove.1 $(O)mthrowu.1 $(O)objnam.1 \ $(O)pcmain.1 $(O)polyself.1 $(O)rnd.1 $(O)shk.1 \ $(O)steal.1 $(O)timeout.1 $(O)track.1 $(O)trap.1 \ $(O)weapon.1 $(O)getline.1 $(O)termcap.1 $(O)topl.1 \ $(O)video.1 $(O)zap.1 $(O)explode.1 OVL2 = $(O)attrib.2 $(O)do.2 $(O)do_name.2 $(O)do_wear.2 \ $(O)dog.2 $(O)engrave.2 $(O)hack.2 $(O)hacklib.2 \ $(O)invent.2 $(O)makemon.2 $(O)mon.2 $(O)mondata.2 \ $(O)monmove.2 $(O)getline.2 $(O)shk.2 $(O)topl.2 \ $(O)trap.2 $(O)zap.2 OVL3 = $(O)do.3 $(O)hack.3 $(O)invent.3 $(O)light.3 \ $(O)shk.3 $(O)trap.3 $(O)zap.3 OVLB = $(O)allmain.B $(O)apply.B $(O)artifact.B $(O)attrib.B \ $(O)botl.B $(O)cmd.B $(O)dbridge.B $(O)do.B \ $(O)do_name.B $(O)do_wear.B $(O)dog.B $(O)dogmove.B \ $(O)eat.B $(O)engrave.B $(O)hack.B $(O)hacklib.B \ $(O)invent.B $(O)lock.B $(O)mail.B $(O)makemon.B \ $(O)mcastu.B $(O)mhitm.B $(O)mhitu.B $(O)mkobj.B \ $(O)mkroom.B $(O)mon.B $(O)mondata.B $(O)monmove.B \ $(O)mthrowu.B $(O)objnam.B $(O)pcmain.B $(O)pline.B \ $(O)polyself.B $(O)potion.B $(O)priest.B $(O)read.B \ $(O)rnd.B $(O)shk.B $(O)shknam.B $(O)sounds.B \ $(O)steal.B $(O)timeout.B $(O)track.B $(O)trap.B \ $(O)vault.B $(O)weapon.B $(O)were.B $(O)wizard.B \ $(O)msdos.B $(O)pcunix.B $(O)termcap.B $(O)topl.B \ $(O)video.B $(O)vidtxt.B $(O)zap.B TILOBJ = $(TILEGAME) $(TILEVGA) VVOBJ = $(O)version.o NVOBJ = $(OBJ01) $(OVL0) $(OVL1) $(OVL2) \ $(OVL3) $(OVLB) $(TILOBJ) ALLOBJ= $(NVOBJ) $(VVOBJ) $(OVLINIT) # # Header objects # # This comment copied from sys/unix/Makefile.src, # extern.h is ignored, even though its declared function types may affect the # compilation of all the .c files, since extern.h changes every time the # type of an external function does, and we would spend all our time recompiling # if we did not ignore it. #EXTERN_H = $(INCL)\extern.h EXTERN_H = PCCONF_H = $(INCL)\pcconf.h $(INCL)\micro.h $(INCL)\system.h PERMONST_H = $(INCL)\monattk.h $(INCL)\monflag.h $(INCL)\align.h YOUPROP_H = $(INCL)\prop.h $(PERMONST_H) $(INCL)\pm.h $(INCL)\youprop.h \ $(INCL)\mondata.h YOU_H = $(INCL)\attrib.h $(INCL)\monst.h $(YOUPROP_H) $(INCL)\align.h DECL_H = $(INCL)\quest.h $(INCL)\spell.h $(INCL)\color.h \ $(INCL)\obj.h $(YOU_H) $(INCL)\onames.h $(INCL)\pm.h CONFIG_H = $(INCL)\tradstdc.h $(INCL)\coord.h $(PCCONF_H) $(INCL)\config.h HACK_H = $(CONFIG_H) $(INCL)\dungeon.h $(INCL)\align.h $(INCL)\monsym.h \ $(INCL)\mkroom.h $(INCL)\objclass.h $(DECL_H) \ $(INCL)\timeout.h $(INCL)\trap.h $(INCL)\flag.h $(INCL)\rm.h \ $(INCL)\vision.h $(INCL)\mondata.h $(INCL)\wintype.h \ $(INCL)\engrave.h $(INCL)\rect.h $(EXTERN_H) \ $(INCL)\winprocs.h $(INCL)\trampoli.h $(INCL)\display.h TILE_H = $(INCL)\tile.h $(INCL)\pctiles.h PCVIDEO_H = $(INCL)\portio.h $(INCL)\pcvideo.h ALIGN_H = $(INCL)\align.h ARTIFACT_H = $(INCL)\artifact.h ARTILIST_H = $(INCL)\artilist.h COLOR_H = $(INCL)\color.h DATE_H = $(INCL)\date.h DGN_FILE_H = $(INCL)\dgn_file.h DLB_H = $(INCL)\dlb.h EMIN_H = $(INCL)\emin.h EPRI_H = $(INCL)\epri.h ESHK_H = $(INCL)\eshk.h EDOG_H = $(INCL)\edog.h FUNC_TAB_H = $(INCL)\func_tab.h LEV_H = $(INCL)\lev.h LEV_COMP_H = $(INCL)\lev_comp.h MAIL_H = $(INCL)\mail.h MFNDPOS_H = $(INCL)\mfndpos.h MONSYM_H = $(INCL)\monsym.h OBJ_H = $(INCL)\obj.h OBJCLASS_H = $(INCL)\objclass.h OBJECTS_H = $(INCL)\objects.h PROP_H = $(INCL)\prop.h QTEXT_H = $(INCL)\qtext.h QUEST_H = $(INCL)\quest.h SP_LEV_H = $(INCL)\sp_lev.h TERMCAP_H = $(INCL)\tcap.h VAULT_H = $(INCL)\vault.h VIS_TAB_H = $(INCL)\vis_tab.h WINTTY_H = $(INCL)\wintty.h # # In the unix distribution this file is patchlevel.h, make it 8.3 here # to avoid an nmake warning under dos. # PATCHLEVEL_H = $(INCL)\patchlev.h # # The name of the game. # GAMEFILE = $(GAMEDIR)\$(GAME).exe # # make data.base an 8.3 filename to prevent an nmake warning # DATABASE = $(DAT)\data.bas ####################################################################### # # TARGETS # # The main target. # $(GAME): obj.tag envchk $(U)utility.tag $(GAMEFILE) @echo $(GAME) is up to date. # # Everything # all : install install: $(GAME) install.tag @echo Done. install.tag: $(DAT)\data $(DAT)\rumors $(DAT)\dungeon \ $(DAT)\oracles $(DAT)\quest.dat $(DAT)\sp_lev.tag $(DLB) ! IF ("$(USE_DLB)"=="Y") copy nhdat $(GAMEDIR) copy $(DAT)\license $(GAMEDIR) ! ELSE copy $(DAT)\*. $(GAMEDIR) copy $(DAT)\*.dat $(GAMEDIR) copy $(DAT)\*.lev $(GAMEDIR) copy $(MSYS)\msdoshlp.txt $(GAMEDIR) if exist $(GAMEDIR)\makefile del $(GAMEDIR)\makefile ! ENDIF copy $(SYS)\termcap $(GAMEDIR) if exist $(DOC)\guideb*.txt copy $(DOC)\guideb*.txt $(GAMEDIR) if exist $(DOC)\nethack.txt copy $(DOC)\nethack.txt $(GAMEDIR)\NetHack.txt if exist $(DOC)\recover.txt copy $(DOC)\recover.txt $(GAMEDIR) copy $(SYS)\nethack.cnf $(GAMEDIR)\defaults.nh copy $(U)recover.exe $(GAMEDIR) if exist *.tib copy *.tib $(GAMEDIR) echo install done > $@ $(DAT)\sp_lev.tag: $(U)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)\elf.des $(DAT)\healer.des \ $(DAT)\knight.des $(DAT)\priest.des $(DAT)\rogue.des \ $(DAT)\samurai.des $(DAT)\tourist.des $(DAT)\valkyrie.des \ $(DAT)\wizard.des cd $(DAT) $(U)lev_comp bigroom.des $(U)lev_comp castle.des $(U)lev_comp endgame.des $(U)lev_comp gehennom.des $(U)lev_comp knox.des $(U)lev_comp mines.des $(U)lev_comp medusa.des $(U)lev_comp oracle.des $(U)lev_comp 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 elf.des $(U)lev_comp healer.des $(U)lev_comp knight.des $(U)lev_comp priest.des $(U)lev_comp rogue.des $(U)lev_comp samurai.des $(U)lev_comp tourist.des $(U)lev_comp valkyrie.des $(U)lev_comp wizard.des cd $(SRC) echo sp_levs done > $(DAT)\sp_lev.tag $(U)utility.tag: envchk $(INCL)\date.h $(INCL)\onames.h \ $(INCL)\pm.h $(SRC)\monstr.c $(SRC)\vis_tab.c \ $(U)lev_comp.exe $(VIS_TAB_H) $(U)dgn_comp.exe \ $(U)recover.exe $(TILEUTIL) @echo utilities made >$@ @echo utilities made. tileutil: $(U)gif2txt.exe $(U)txt2ppm.exe @echo Optional tile development utilities are up to date. ?MSC? # 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: ?ENDMSC? # # Inline files : # Specifying the "<<" means to start an inline file. # Another "<<" at the start of a line closes the # inline file. # ?MSC? # Substitution within Macros: # $(mymacro:string1=string2) replaces every # occurrence of string1 with string2 in the # macro mymacro. Special ascii key codes may be # used in the substitution text by preceding it # with ^ as we have done below. Every occurrence # of a in $(ALLOBJ) is replaced by # <+>. # ?ENDMSC? # DO NOT INDENT THE << below! # ?MSC? $(GAMEFILE) : $(LNKOPT) $(ALLOBJ) ?ENDMSC? ?BC? $(GAMEFILE) : $(ALLOBJ) ?ENDBC? @echo Linking.... $(LINK) $(LFLAGSN) @<<$(GAME).lnk ?BC? $(ALLOBJ) ?ENDBC? ?MSC? $(ALLOBJ:^ =+^ ) ?ENDMSC? $(GAMEFILE) $(GAME) $(TERMLIB) $(MOVETR) $(CLIB) $(BCOVL) $(BCMDL) ?MSC? $(LNKOPT); ?ENDMSC? << @if exist $(GAMEDIR)\$(GAME).bak del $(GAMEDIR)\$(GAME).bak # # Makedefs Stuff # $(U)makedefs.exe: $(MAKEOBJS) @$(LINK) $(LFLAGSU) $(MAKEOBJS), $@,, $(CLIB) $(BCMDL); $(O)makedefs.o: $(CONFIG_H) $(PERMONST_H) $(OBJCLASS_H) \ $(MONSYM_H) $(QTEXT_H) $(PATCHLEVEL_H) \ $(U)makedefs.c @$(CC) $(CFLAGSU) $(COBJNAM)$@ $(U)makedefs.c # # date.h should be remade every time any of the source or include # files is modified. # $(INCL)\date.h : $(U)makedefs.exe $(U)makedefs -v @echo A new $@ has been created. $(INCL)\onames.h : $(U)makedefs.exe $(U)makedefs -o $(INCL)\pm.h : $(U)makedefs.exe $(U)makedefs -p #$(INCL)\trap.h : $(U)makedefs.exe # $(U)makedefs -t $(SRC)\monstr.c: $(U)makedefs.exe $(U)makedefs -m $(INCL)\vis_tab.h: $(U)makedefs.exe $(U)makedefs -z $(SRC)\vis_tab.c: $(U)makedefs.exe $(U)makedefs -z # # Level Compiler Stuff # $(U)lev_comp.exe: $(SPLEVOBJS) @echo Linking $@... ?MSC? $(LINK) $(LFLAGSU) @<<$(@B).lnk ?ENDMSC? ?BC? $(LINK) $(LFLAGSU) @&&! ?ENDBC? ?LINKLIST:SPLEVOBJS? $@ $(@B) $(BCMDL); ?MSC? << ?ENDMSC? ?BC? ! ?ENDBC? $(O)lev_yacc.o: $(HACK_H) $(SP_LEV_H) $(INCL)\lev_comp.h $(U)lev_yacc.c @$(CC) $(CFLAGSU) $(COBJNAM)$@ $(U)lev_yacc.c $(O)lev_$(LEX).o: $(HACK_H) $(INCL)\lev_comp.h $(SP_LEV_H) \ $(U)lev_$(LEX).c $(CC) $(CFLAGSU) $(COBJNAM)$@ $(U)lev_$(LEX).c $(O)lev_main.o: $(U)lev_main.c $(HACK_H) $(SP_LEV_H) @$(CC) $(CFLAGSU) $(COBJNAM)$@ $(U)lev_main.c $(U)lev_yacc.c $(INCL)\lev_comp.h : $(U)lev_comp.y ! IF "$(DO_YACC)"=="YACC_ACT" $(YACC) -d -l $(U)lev_comp.y copy $(YTABC) $(U)lev_yacc.c copy $(YTABH) $(INCL)\lev_comp.h @del $(YTABC) @del $(YTABH) ! ELSE @echo. @echo $(U)lev_comp.y has changed. @echo To update $(U)lev_yacc.c and $(INCL)\lev_comp.h run $(YACC). @echo. @echo For now, we will copy the prebuilt lev_yacc.c @echo from $(SYS) to $(U)lev_yacc.c, and copy the prebuilt @echo lev_comp.h from $(SYS) to $(UTIL)\lev_comp.h @echo and use those. @echo. copy $(SYS)\lev_yacc.c $@ >nul touch $@ copy $(SYS)\lev_comp.h $(INCL)\lev_comp.h >nul touch $(INCL)\lev_comp.h ! ENDIF $(U)lev_$(LEX).c: $(U)lev_comp.l ! IF "$(DO_LEX)"=="LEX_ACT" $(LEX) $(FLEXSKEL) $(U)lev_comp.l copy $(LEXYYC) $@ @del $(LEXYYC) ! ELSE @echo. @echo $(U)lev_comp.l has changed. To update $@ run $(LEX). @echo. @echo For now, we will copy a prebuilt lev_lex.c @echo from $(SYS) to $@ and use it. @echo. copy $(SYS)\lev_lex.c $@ >nul touch $@ ! ENDIF # # Dungeon Stuff # $(U)dgn_comp.exe: $(DGNCOMPOBJS) @echo Linking $@... ?MSC? $(LINK) $(LFLAGSU) @<<$(@B).lnk ?ENDMSC? ?BC? $(LINK) $(LFLAGSU) @&&! ?ENDBC? ?LINKLIST:DGNCOMPOBJS? $@ $(@B) $(BCMDL); ?MSC? << ?ENDMSC? ?BC? ! ?ENDBC? $(O)dgn_yacc.o: $(HACK_H) $(DGN_FILE_H) $(INCL)\dgn_comp.h \ $(U)dgn_yacc.c @$(CC) $(CFLAGSU) $(COBJNAM)$@ $(U)dgn_yacc.c $(O)dgn_$(LEX).o: $(HACK_H) $(DGN_FILE_H) $(INCL)\dgn_comp.h \ $(U)dgn_$(LEX).c @$(CC) $(CFLAGSU) $(COBJNAM)$@ $(U)dgn_$(LEX).c $(O)dgn_main.o: $(HACK_H) $(U)dgn_main.c @$(CC) $(CFLAGSU) $(COBJNAM)$@ $(U)dgn_main.c $(U)dgn_yacc.c $(INCL)\dgn_comp.h : $(U)dgn_comp.y ! IF "$(DO_YACC)"=="YACC_ACT" $(YACC) -d -l $(U)dgn_comp.y copy $(YTABC) $(U)dgn_yacc.c copy $(YTABH) $(INCL)\dgn_comp.h @del $(YTABC) @del $(YTABH) ! ELSE @echo. @echo $(U)dgn_comp.y has changed. To update $@ and @echo $(INCL)\dgn_comp.h run $(YACC). @echo. @echo For now, we will copy the prebuilt dgn_yacc.c from @echo $(SYS) to $(U)dgn_yacc.c, and copy the prebuilt @echo dgn_comp.h from $(SYS) to $(INCL)\dgn_comp.h @echo and use those. @echo. copy $(SYS)\dgn_yacc.c $@ >nul touch $@ copy $(SYS)\dgn_comp.h $(INCL)\dgn_comp.h >nul touch $(INCL)\dgn_comp.h ! ENDIF $(U)dgn_$(LEX).c: $(U)dgn_comp.l ! IF "$(DO_LEX)"=="LEX_ACT" $(LEX) $(FLEXSKEL) $(U)dgn_comp.l copy $(LEXYYC) $@ @del $(LEXYYC) ! ELSE @echo. @echo $(U)dgn_comp.l has changed. To update $@ run $(LEX). @echo. @echo For now, we will copy a prebuilt dgn_lex.c @echo from $(SYS) to $@ and use it. @echo. copy $(SYS)\dgn_lex.c $@ >nul touch $@ ! ENDIF obj.tag: @if not exist $(O)*.* mkdir $(OBJ) @echo directory $(OBJ) created @echo directory $(OBJ) created >$@ ?MSC? # # The correct switches for the C compiler depend on the CL environment # variable being set correctly. This will check that it is. # The correct setting needs to be: # CL= /AL /G2 /Oo /Gs /Gt16 /Zp1 /W0 /I..\include /nologo /DMOVERLAY # ?ENDMSC? envchk: precomp.msg ?MSC? ! IF ("$(CL)"=="") ! MESSAGE The CL environment variable is not defined! ! MESSAGE You must CD $(MSYS) and execute the SETUP.BAT procedure ! MESSAGE ie. setup MSC ! MESSAGE ! ERROR ! ELSE @echo CL Environment variable is defined: @echo CL=$(CL) ! ENDIF ?ENDMSC? ?COMMENT? # CL= /AL /G2 /Oo /Gs /Gt16 /Zp1 /W0 /I..\include /nologo /DMOVERLAY ?ENDCOMMENT? ?BC? # # Borland Configuration File Section # @echo Making Borland configuration files... @echo -Y -O -Z -Oe -Ob -Os -Ff -I$(BCINCL);$(INCL) > $(BCCFG) @echo -m$(MODEL) -D__IO_H $(CFLGTOT) -DSTRNCMPI >> $(BCCFG) @type $(BCCFG) > CFLAGCO.CFG @type $(BCCFG) > CFLAGUO.CFG @type $(BCCFG) > CFLAGC0.CFG @type $(BCCFG) > CFLAGU0.CFG @type $(BCCFG) > CFLAGC1.CFG @type $(BCCFG) > CFLAGU1.CFG @type $(BCCFG) > CFLAGC2.CFG @type $(BCCFG) > CFLAGU2.CFG @type $(BCCFG) > CFLAGC3.CFG @type $(BCCFG) > CFLAGU3.CFG @type $(BCCFG) > CFLAGCB.CFG @type $(BCCFG) > CFLAGUB.CFG @echo -Y $(CFLAGCO) >> CFLAGCO.CFG @echo -Y $(CFLAGUO) >> CFLAGUO.CFG @echo -Y $(CFLAGC0) >> CFLAGC0.CFG @echo -Y $(CFLAGU0) >> CFLAGU0.CFG @echo -Y $(CFLAGC1) >> CFLAGC1.CFG @echo -Y $(CFLAGU1) >> CFLAGU1.CFG @echo -Y $(CFLAGC2) >> CFLAGC2.CFG @echo -Y $(CFLAGU2) >> CFLAGU2.CFG @echo -Y $(CFLAGC3) >> CFLAGC3.CFG @echo -Y $(CFLAGU3) >> CFLAGU3.CFG @echo -Y $(CFLAGCB) >> CFLAGCB.CFG @echo -Y $(CFLAGUB) >> CFLAGUB.CFG ?ENDBC? ! IF "$(TILEGAME)"=="" @echo. @echo NOTE: This build will NOT include tile support. @echo. ! ELSE @echo. @echo This build includes tile support. @echo. ! ENDIF # # SECONDARY TARGETS # # # Header files NOT distributed in ..\include # $(INCL)\tile.h: $(WSHR)\tile.h copy $(WSHR)\tile.h $@ $(INCL)\pctiles.h: $(MSYS)\pctiles.h copy $(MSYS)\pctiles.h $@ $(INCL)\pcvideo.h: $(MSYS)\pcvideo.h copy $(MSYS)\pcvideo.h $@ $(INCL)\portio.h: $(MSYS)\portio.h copy $(MSYS)\portio.h $@ # # Recover Utility # $(U)recover.exe: $(RECOVOBJS) @$(LINK) $(LFLAGSU) $(RECOVOBJS),$@,, $(CLIB) $(BCMDL); # # Tile Mapping # $(SRC)\tile.c: $(U)tilemap.exe @echo A new $@ is being created. @$(U)tilemap $(U)tilemap.exe: $(O)tilemap.o @$(LINK) $(LFLAGSU) $(O)tilemap.o,$@,, $(CLIB) $(BCMDL); $(O)tilemap.o: $(WSHR)\tilemap.c $(HACK_H) $(CC) $(CFLAGSU) $(COBJNAM)$@ $(WSHR)\tilemap.c # # Tile Utilities # # # Optional (for development) # # $(U)gif2txt.exe: $(GIFREADERS) $(TEXT_IO) @$(LINK) $(LFLAGSU) $(GIFREADERS) $(TEXT_IO),$@,, \ $(CLIB) $(BCMDL); $(U)txt2ppm.exe: $(PPMWRITERS) $(TEXT_IO) @$(LINK) $(LFLAGSU) $(PPMWRITERS) $(TEXT_IO),$@,, \ $(CLIB) $(BCMDL); $(U)gif2txt2.exe: $(GIFREAD2) $(TEXT_IO2) @$(LINK) $(LFLAGSU) $(GIFREAD2) $(TEXT_IO2),$@,, \ $(CLIB) $(BCMDL); $(U)txt2ppm2.exe: $(PPMWRIT2) $(TEXT_IO2) @$(LINK) $(LFLAGSU) $(PPMWRIT2) $(TEXT_IO2),$@,, \ $(CLIB) $(BCMDL); # # Required for tile support # NetHack1.tib: $(TILEFILES) $(U)tile2bin.exe @echo Creating binary tile files (this may take some time) @$(U)tile2bin NetHackO.tib: thintile.tag $(TILEFILES2) $(U)til2bin2.exe @echo Creating overview binary tile files (this may take some time) @$(U)til2bin2 thintile.tag: $(U)thintile.exe $(TILEFILES) $(U)thintile @echo thintiles created >thintile.tag $(U)tile2bin.exe: $(O)tile2bin.o $(TEXT_IO) @echo Linking $@... ?MSC? $(LINK) $(LFLAGSU) @<<$(@B).lnk ?ENDMSC? ?BC? $(LINK) $(LFLAGSU) @&&! ?ENDBC? $(O)tile2bin.o+ ?LINKLIST:TEXT_IO? $@ $(@B) $(BCMDL); ?MSC? << ?ENDMSC? ?BC? ! ?ENDBC? $(U)til2bin2.exe: $(O)til2bin2.o $(TEXT_IO2) @echo Linking $@... ?MSC? $(LINK) $(LFLAGSU) @<<$(@B).lnk ?ENDMSC? ?BC? $(LINK) $(LFLAGSU) @&&! ?ENDBC? $(O)til2bin2.o+ ?LINKLIST:TEXT_IO2? $@ $(@B) $(BCMDL); ?MSC? << ?ENDMSC? ?BC? ! ?ENDBC? $(U)thintile.exe: $(O)thintile.o @$(LINK) $(LFLAGSU) $(O)thintile.o,$@,, $(CLIB) $(BCMDL); $(O)thintile.o: $(HACK_H) $(INCL)\tile.h $(WSHR)\thintile.c $(CC) $(CFLAGSU) $(COBJNAM)$@ $(WSHR)\thintile.c $(O)tile2bin.o: $(HACK_H) $(TILE_H) $(PCVIDEO_H) $(CC) $(CFLAGSU) $(COBJNAM)$@ $(MSYS)\tile2bin.c $(O)til2bin2.o: $(HACK_H) $(TILE_H) $(PCVIDEO_H) $(CC) $(CFLAGSU) $(CDEFINE)TILE_X=8 $(CDEFINE)OVERVIEW_FILE \ $(COBJNAM)$@ $(MSYS)\tile2bin.c ?COMMENT? $(U)tile2btb.exe: $(O)tile2btb.o $(GIFREADERS) @echo Linking $@... $(LINK) $(LFLAGSU) @&&! $(O)tile2btb.o+ ?LINKLIST:GIFREADERS? $@ $(@B) $(BCMDL) $(BGI_LIB); ! $(O)tile2btb.o: $(HACK_H) $(TILE_H) $(PCVIDEO_H) $(MSYS)\tile2btb.c $(CC) -DBGI_FILE $(CFLAGSU) $(COBJNAM)$@ $(MSYS)\tile2btb.c ?ENDCOMMENT? # # DLB stuff # nhdat: $(U)dlb_main.exe @copy $(MSYS)\msdoshlp.txt $(DAT) @cd $(DAT) @echo data >dlb.lst @echo oracles >>dlb.lst @echo options >>dlb.lst @echo quest.dat >>dlb.lst @echo rumors >>dlb.lst @echo help >>dlb.lst @echo hh >>dlb.lst @echo cmdhelp >>dlb.lst @echo history >>dlb.lst @echo opthelp >>dlb.lst @echo wizhelp >>dlb.lst @echo dungeon >>dlb.lst @echo license >>dlb.lst @echo msdoshlp.txt >>dlb.lst @for %%N in (*.lev) do echo %%N >>dlb.lst $(U)dlb_main cvIf dlb.lst $(SRC)\nhdat @cd $(SRC) $(U)dlb_main.exe: $(DLBOBJS) @$(LINK) $(LFLAGSU) $(DLBOBJS),$@,, $(CLIB) $(BCMDL); $(O)dlb_main.o: $(U)dlb_main.c $(INCL)\config.h $(DLB_H) $(CC) $(CFLAGSU) $(COBJNAM)$@ $(U)dlb_main.c # # Housekeeping # spotless: clean rmdir $(OBJ) if exist $(DATE_H) del $(DATE_H) if exist $(INCL)\onames.h del $(INCL)\onames.h if exist $(INCL)\pm.h del $(INCL)\pm.h if exist $(VIS_TAB_H) del $(VIS_TAB_H) if exist $(SRC)\vis_tab.c del $(SRC)\vis_tab.c if exist $(SRC)\tile.c del $(SRC)\tile.c if exist $(DAT)\rumors del $(DAT)\rumors if exist $(DAT)\data del $(DAT)\data if exist $(DAT)\dungeon del $(DAT)\dungeon if exist $(DAT)\dungeon.pdf del $(DAT)\dungeon.pdf if exist $(DAT)\options del $(DAT)\options if exist $(DAT)\oracles del $(DAT)\oracles if exist $(DAT)\rumors del $(DAT)\rumors if exist $(DAT)\quest.dat del $(DAT)\quest.dat if exist $(DAT)\*.lev del $(DAT)\*.lev if exist $(DAT)\sp_lev.tag del $(DAT)\sp_lev.tag if exist $(SRC)\monstr.c del $(SRC)\monstr.c if exist $(SRC)\vis_tab.c del $(SRC)\vis_tab.c if exist $(SRC)\$(PLANAR_TIB) del $(SRC)\$(PLANAR_TIB) if exist $(SRC)\$(OVERVIEW_TIB) del $(SRC)\$(OVERVIEW_TIB) if exist $(U)recover.exe del $(U)recover.exe clean: if exist $(O)*.o del $(O)*.o if exist $(O)*.0 del $(O)*.0 if exist $(O)*.1 del $(O)*.1 if exist $(O)*.2 del $(O)*.2 if exist $(O)*.3 del $(O)*.3 if exist $(O)*.b del $(O)*.b if exist $(U)utility.tag del $(U)utility.tag if exist $(U)makedefs.exe del $(U)makedefs.exe if exist $(U)lev_comp.exe del $(U)lev_comp.exe if exist $(U)dgn_comp.exe del $(U)dgn_comp.exe if exist $(U)dlb_main.exe del $(U)dlb_main.exe if exist $(SRC)\*.lnk del $(SRC)\*.lnk if exist $(SRC)\*.map del $(SRC)\*.map if exist $(SRC)\*$(CPCHEXT) del $(SRC)\*$(CPCHEXT) ?BC? if exist $(SRC)\*.cfg del $(SRC)\*.cfg ?ENDBC? if exist $(DAT)\dlb.lst del $(DAT)\dlb.lst pch.c: $(HACK_H) @echo ^#include "hack.h" > $@ @echo main(int argc, char *argv[]) >> $@ @echo { >> $@ @echo } >> $@ @echo. >> $@ # # OTHER DEPENDENCIES # # # Precompiled Header dependencies # (We need to force the generation of these at the beginning) # PHO$(CPCHEXT): $(HACK_H) pch.c @echo Generating new precompiled header for .O files @$(CC) $(FLAGCO) pch.c PH0$(CPCHEXT): $(HACK_H) pch.c @echo Generating new precompiled header for .0 files @$(CC) $(FLAGC0) pch.c PH1$(CPCHEXT): $(HACK_H) pch.c @echo Generating new precompiled header for .1 files @$(CC) $(FLAGC1) pch.c PH2$(CPCHEXT): $(HACK_H) pch.c @echo Generating new precompiled header for .2 files @$(CC) $(FLAGC2) pch.c PH3$(CPCHEXT): $(HACK_H) pch.c @echo Generating new precompiled header for .3 files @$(CC) $(FLAGC3) pch.c PHB$(CPCHEXT): $(HACK_H) pch.c @echo Generating new precompiled header for .B files @$(CC) $(FLAGCB) pch.c ?MSC? # # Compiler supplied, manually moved file - MOVEINIT.C. # - This is only compiled if you selected the alternate overlay # schema3. (MOVEAPI.H must reside in your include search list, # and MOVEINIT.C must be in your src directory). The patch # in sys/msdos/moveinit.pat must be applied to moveinit.c # MS will not allow us to distribute an already patched version. $(O)moveinit.o: $(SRC)\moveinit.c $(CC) $(CFLAGSN) $(COBJNAM)$@ $(MVTRCL) $(SRC)\moveinit.c $(SRC)\moveinit.c: @echo. @echo * CANNOT COMPLETE THE BUILD * @echo You must manually copy moveinit.c and moveinit.h @echo from your Microsoft C Compiler directory tree @echo source/move directory and apply the sys/msdos/moveinit.pat @echo patch to moveinit.c after doing so. @echo. ?ENDMSC? ?BC? # Overlay initialization routines used by pcmain() at startup to # determine EMS/XMS memory usage. # Comment out the following line if you don't want Borland C++ to check for # extended memory. RECOGNIZE_XMS = $(CDEFINE)RECOGNIZE_XMS ?ENDBC? ?MSC? # Overlay initialization routines used by MOVEINIT.C ?ENDMSC? $(O)ovlinit.o: $(MSYS)\ovlinit.c $(HACK_H) $(CC) $(CFLAGSN) $(RECOGNIZE_XMS) $(COBJNAM)$@ $(MSYS)\ovlinit.c # # dat dependencies # $(DAT)\data: $(U)utility.tag $(DATABASE) $(U)makedefs -d $(DAT)\rumors: $(U)utility.tag $(DAT)\rumors.tru $(DAT)\rumors.fal $(U)makedefs -r $(DAT)\quest.dat: $(U)utility.tag $(DAT)\quest.txt $(U)makedefs -q $(DAT)\oracles: $(U)utility.tag $(DAT)\oracles.txt $(U)makedefs -h $(DAT)\dungeon: $(U)utility.tag $(DAT)\dungeon.def $(U)makedefs -e cd $(DAT) $(U)dgn_comp dungeon.pdf cd $(SRC) # # Util Dependencies. # $(O)panic.o: $(U)panic.c $(CONFIG_H) $(CC) $(CFLAGSU) $(COBJNAM)$@ $(U)panic.c $(O)recover.o: $(CONFIG_H) $(U)recover.c $(CC) $(CFLAGSU) $(COBJNAM)$@ $(U)recover.c # # from win\share # $(O)tiletxt.o: $(WSHR)\tilemap.c $(HACK_H) $(CC) $(CFLAGSU) $(CDEFINE)TILETEXT $(COBJNAM)$@ $(WSHR)\tilemap.c $(O)tiletxt2.o: $(WSHR)\tilemap.c $(HACK_H) $(CC) $(CFLAGSU) $(CDEFINE)TILETEXT \ $(CDEFINE)TILE_X=8 $(COBJNAM)$@ $(WSHR)\tilemap.c $(O)gifread.o: $(WSHR)\gifread.c $(CONFIG_H) $(INCL)\tile.h $(CC) $(CFLAGSU) $(COBJNAM)$@ $(WSHR)\gifread.c $(O)gifread2.o: $(WSHR)\gifread.c $(CONFIG_H) $(INCL)\tile.h $(CC) $(CFLAGSU) $(COBJNAM)$@ $(CDEFINE)TILE_X=8 $(WSHR)\gifread.c $(O)ppmwrite.o: $(WSHR)\ppmwrite.c $(CONFIG_H) $(INCL)\tile.h $(CC) $(CFLAGSU) $(COBJNAM)$@ $(WSHR)\ppmwrite.c $(O)ppmwrit2.o: $(WSHR)\ppmwrite.c $(CONFIG_H) $(INCL)\tile.h $(CC) $(CFLAGSU) $(COBJNAM)$@ $(CDEFINE)TILE_X=8 $(WSHR)\ppmwrite.c $(O)tiletext.o: $(WSHR)\tiletext.c $(CONFIG_H) $(INCL)\tile.h $(CC) $(CFLAGSU) $(COBJNAM)$@ $(WSHR)\tiletext.c $(O)tiletex2.o: $(WSHR)\tiletext.c $(CONFIG_H) $(INCL)\tile.h $(CC) $(CFLAGSU) $(CDEFINE)TILE_X=8 $(COBJNAM)$@ $(WSHR)\tiletext.c # # from win\tty # $(O)getline.1: $(PCH1) $(WTTY)\getline.c $(HACK_H) $(WINTTY_H) $(FUNC_TAB_H) $(CC) $(FLAGU1) ?[CSNAM1]$(COBJNAM)$@ $(WTTY)\getline.c $(O)getline.2: $(PCH2) $(WTTY)\getline.c $(HACK_H) $(WINTTY_H) $(FUNC_TAB_H) $(CC) $(FLAGU2) ?[CSNAM2]$(COBJNAM)$@ $(WTTY)\getline.c $(O)termcap.0: $(PCH0) $(WTTY)\termcap.c $(HACK_H) $(WINTTY_H) $(TERMCAP_H) $(CC) $(FLAGU0) ?[CSNAM0]$(COBJNAM)$@ $(WTTY)\termcap.c $(O)termcap.1: $(PCH1) $(WTTY)\termcap.c $(HACK_H) $(WINTTY_H) $(TERMCAP_H) $(CC) $(FLAGU1) ?[CSNAM1]$(COBJNAM)$@ $(WTTY)\termcap.c $(O)termcap.B: $(PCHB) $(WTTY)\termcap.c $(HACK_H) $(WINTTY_H) $(TERMCAP_H) $(CC) $(FLAGUB) ?[CSNAMB]$(COBJNAM)$@ $(WTTY)\termcap.c $(O)topl.1: $(PCH1) $(WTTY)\topl.c $(HACK_H) $(TERMCAP_H) $(WINTTY_H) $(CC) $(FLAGU1) ?[CSNAM1]$(COBJNAM)$@ $(WTTY)\topl.c $(O)topl.2: $(PCH2) $(WTTY)\topl.c $(HACK_H) $(TERMCAP_H) $(WINTTY_H) $(CC) $(FLAGU2) ?[CSNAM2]$(COBJNAM)$@ $(WTTY)\topl.c $(O)topl.B: $(PCHB) $(WTTY)\topl.c $(HACK_H) $(TERMCAP_H) $(WINTTY_H) $(CC) $(FLAGUB) ?[CSNAMB]$(COBJNAM)$@ $(WTTY)\topl.c $(O)wintty.o: $(PCHO) $(CONFIG_H) $(WTTY)\wintty.c $(PATCHLEVEL_H) $(CC) $(FLAGUO) ?[CSNAMOB]$(COBJNAM)$@ $(WTTY)\wintty.c # # from sys\share # $(O)pcmain.0: $(PCH0) $(HACK_H) $(SYS)\pcmain.c $(CC) $(FLAGU0) ?[CSNAM0]$(COBJNAM)$@ $(SYS)\pcmain.c $(O)pcmain.1: $(PCH1) $(HACK_H) $(SYS)\pcmain.c $(CC) $(FLAGU1) ?[CSNAM1]$(COBJNAM)$@ $(SYS)\pcmain.c $(O)pcmain.B: $(PCHB) $(HACK_H) $(SYS)\pcmain.c $(CC) $(FLAGUB) ?[CSNAMB]$(COBJNAM)$@ $(SYS)\pcmain.c $(O)pcunix.B: $(PCHB) $(SYS)\pcunix.c $(HACK_H) $(CC) $(FLAGUB) ?[CSNAMB]$(COBJNAM)$@ $(SYS)\pcunix.c $(O)tty.o: $(HACK_H) $(WINTTY_H) $(SYS)\pctty.c $(CC) $(CFLAGSN) ?[CSNAMOB]$(COBJNAM)$@ $(SYS)\pctty.c $(O)sys.o: $(HACK_H) $(SYS)\pcsys.c $(CC) $(CFLAGSN) ?[CSNAMOB]$(COBJNAM)$@ $(SYS)\pcsys.c $(O)random.o: $(PCHO) $(HACK_H) $(SYS)\random.c $(CC) $(FLAGUO) ?[CSNAMOB]$(COBJNAM)$@ $(SYS)\random.c # # from sys\msdos # $(O)msdos.0: $(MSYS)\msdos.c $(HACK_H) $(PCVIDEO_H) ?BC? $(CC) $(CFLAGSN) $(COVL0) $$($(@B)_0) $(COBJNAM)$@ $(MSYS)\msdos.c ?ENDBC? ?MSC? $(CC) $(FLAGU0) $(CCSNAM)$(@F) $(COBJNAM)$@ $(MSYS)\msdos.c ?ENDMSC? ?COMMENT? $(CC) $(CFLAGSN) $(COVL0) ?[CSNAM0]$(COBJNAM)$@ $(MSYS)\vidtxt.c ?ENDCOMMENT? $(O)msdos.B: $(MSYS)\msdos.c $(HACK_H) $(PCVIDEO_H) ?BC? $(CC) $(CFLAGSN) $(COVLB) $$($(@B)_b) $(COBJNAM)$@ $(MSYS)\msdos.c ?ENDBC? ?MSC? $(CC) $(FLAGUB) $(CCSNAM)$(@F) $(COBJNAM)$@ $(MSYS)\msdos.c ?ENDMSC? ?COMMENT? $(CC) $(CFLAGSN) $(COVLB) ?[CSNAMB]$(COBJNAM)$@ $(MSYS)\vidtxt.c ?ENDCOMMENT? $(O)pctiles.0: $(PCH0) $(MSYS)\pctiles.c $(HACK_H) $(TILE_H) $(PCVIDEO_H) $(CC) $(FLAGU0) ?[CSNAM0]$(COBJNAM)$@ $(MSYS)\pctiles.c $(O)pctiles.B: $(PCHB) $(MSYS)\pctiles.c $(HACK_H) $(TILE_H) $(PCVIDEO_H) $(CC) $(FLAGUB) ?[CSNAMB]$(COBJNAM)$@ $(MSYS)\pctiles.c $(O)sound.o: $(PCH0) $(MSYS)\sound.c $(HACK_H) $(INCL)\portio.h $(CC) $(FLAGUO) ?[CSNAMOB]$(COBJNAM)$@ $(MSYS)\sound.c $(O)pckeys.o: $(PCHO) $(MSYS)\pckeys.c $(HACK_H) $(PCVIDEO_H) $(CC) $(FLAGUO) ?[CSNAMOB]$(COBJNAM)$@ $(MSYS)\pckeys.c $(O)stubvid.o : $(MSYS)\video.c $(HACK_H) $(CC) $(FLAGUO) $(CDEFINE)STUBVIDEO ?[CSNAMOB]$(COBJNAM)$@ $(MSYS)\video.c $(O)video.0: $(PCH0) $(MSYS)\video.c $(HACK_H) $(WINTTY_H) $(PCVIDEO_H) \ $(TILE_H) $(CC) $(FLAGU0) ?[CSNAM0]$(COBJNAM)$@ $(MSYS)\video.c $(O)video.1: $(PCH1) $(MSYS)\video.c $(HACK_H) $(WINTTY_H) $(PCVIDEO_H) \ $(TILE_H) $(CC) $(FLAGU1) ?[CSNAM1]$(COBJNAM)$@ $(MSYS)\video.c $(O)video.B: $(PCHB) $(MSYS)\video.c $(HACK_H) $(WINTTY_H) $(PCVIDEO_H) \ $(TILE_H) $(CC) $(FLAGUB) ?[CSNAMB]$(COBJNAM)$@ $(MSYS)\video.c $(O)vidtxt.0: $(MSYS)\vidtxt.c $(HACK_H) $(WINTTY_H) $(PCVIDEO_H) ?BC? $(CC) $(CFLAGSN) $(COVL0) $$($(@B)_0) $(COBJNAM)$@ $(MSYS)\vidtxt.c ?ENDBC? ?MSC? $(CC) $(FLAGU0) $(CCSNAM)$(@F) $(COBJNAM)$@ $(MSYS)\vidtxt.c ?ENDMSC? ?COMMENT? $(CC) $(CFLAGSN) $(COVL0) ?[CSNAM0]$(COBJNAM)$@ $(MSYS)\vidtxt.c ?ENDCOMMENT? $(O)vidtxt.B: $(MSYS)\vidtxt.c $(HACK_H) $(WINTTY_H) $(PCVIDEO_H) ?BC? $(CC) $(CFLAGSN) $(COVLB) $$($(@B)_b) $(COBJNAM)$@ $(MSYS)\vidtxt.c ?ENDBC? ?MSC? $(CC) $(FLAGUB) $(CCSNAM)$(@F) $(COBJNAM)$@ $(MSYS)\vidtxt.c ?ENDMSC? ?COMMENT? $(CC) $(CFLAGSN) $(COVLB) ?[CSNAMB]$(COBJNAM)$@ $(MSYS)\vidtxt.c ?ENDCOMMENT? $(O)vidvga.0: $(PCH0) $(MSYS)\vidvga.c $(HACK_H) $(WINTTY_H) $(PCVIDEO_H) \ $(TILE_H) $(CC) $(FLAGU0) ?[CSNAM0]$(COBJNAM)$@ $(MSYS)\vidvga.c $(O)vidvga.1: $(PCH1) $(MSYS)\vidvga.c $(HACK_H) $(WINTTY_H) $(PCVIDEO_H) \ $(TILE_H) $(CC) $(FLAGU1) ?[CSNAM0]$(COBJNAM)$@ $(MSYS)\vidvga.c $(O)vidvga.2: $(PCH2) $(MSYS)\vidvga.c $(HACK_H) $(WINTTY_H) $(PCVIDEO_H) \ $(TILE_H) $(CC) $(FLAGU2) ?[CSNAM0]$(COBJNAM)$@ $(MSYS)\vidvga.c $(O)vidvga.B: $(PCHB) $(MSYS)\vidvga.c $(HACK_H) $(WINTTY_H) $(PCVIDEO_H) \ $(TILE_H) $(CC) $(FLAGUB) ?[CSNAMB]$(COBJNAM)$@ $(MSYS)\vidvga.c # # from src # $(O)alloc.o: $(SRC)\alloc.c $(CONFIG_H) $(CC) $(CFLAGSN) ?[CSNAMOB]$(COBJNAM)$@ $(SRC)\alloc.c $(O)ball.o: $(PCHO) $(SRC)\ball.c $(HACK_H) $(O)bones.o: $(PCHO) $(SRC)\bones.c $(HACK_H) $(LEV_H) $(O)decl.o: $(PCHO) $(SRC)\decl.c $(HACK_H) $(QUEST_H) $(O)detect.o: $(PCHO) $(SRC)\detect.c $(HACK_H) $(ARTIFACT_H) $(O)dig.o: $(PCHO) $(SRC)\dig.c $(HACK_H) $(EDOG_H) # check dep $(O)display.o: $(PCHO) $(SRC)\display.c $(HACK_H) $(O)dlb.o: $(SRC)\dlb.c $(DLB_H) $(HACK_H) $(CC) $(CFLAGSN) ?[CSNAMOB]$(COBJNAM)$@ $(SRC)\dlb.c $(O)dokick.o: $(PCHO) $(SRC)\dokick.c $(HACK_H) $(ESHK_H) $(O)dothrow.o: $(PCHO) $(SRC)\dothrow.c $(HACK_H) $(O)drawing.o: $(SRC)\drawing.c $(HACK_H) $(TERMCAP_H) $(CC) $(CFLAGSN) ?[CSNAMOB]$(COBJNAM)$@ $(SRC)\drawing.c $(O)end.o: $(SRC)\end.c $(HACK_H) $(ESHK_H) $(DLB_H) $(CC) $(CFLAGSN) ?[CSNAMOB]$(COBJNAM)$@ $(SRC)\end.c $(O)exper.o: $(PCHO) $(SRC)\exper.c $(HACK_H) $(O)extralev.o: $(PCHO) $(SRC)\extralev.c $(HACK_H) $(O)files.o: $(PCHO) $(SRC)\files.c $(HACK_H) $(DLB_H) $(O)fountain.o: $(PCHO) $(SRC)\fountain.c $(HACK_H) $(O)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) $(O)mkmaze.o: $(PCHO) $(SRC)\mkmaze.c $(HACK_H) $(SP_LEV_H) $(LEV_H) $(O)monst.o: $(SRC)\monst.c $(CONFIG_H) $(PERMONST_H) $(MONSYM_H) \ $(ESHK_H) $(EPRI_H) $(COLOR_H) $(ALIGN_H) $(CC) $(CFLAGSN) ?[CSNAMOB]$(COBJNAM)$@ $(SRC)\monst.c $(O)monstr.o: $(SRC)\monstr.c $(CONFIG_H) $(CC) $(CFLAGSN) ?[CSNAMOB]$(COBJNAM)$@ $(SRC)\monstr.c $(O)mplayer.o: $(PCHO) $(SRC)\mplayer.c $(HACK_H) $(O)muse.o: $(PCHO) $(SRC)\muse.c $(HACK_H) $(O)music.o: $(PCHO) $(SRC)\music.c $(HACK_H) $(O)o_init.o: $(PCHO) $(SRC)\o_init.c $(HACK_H) $(LEV_H) $(O)objects.o: $(SRC)\objects.c $(CONFIG_H) $(OBJ_H) $(OBJCLASS_H) \ $(PROP_H) $(COLOR_H) $(CC) $(CFLAGSN) ?[CSNAMOB]$(COBJNAM)$@ $(SRC)\objects.c $(O)options.o: $(SRC)\options.c $(HACK_H) $(TERMCAP_H) $(OBJCLASS_H) $(CC) $(CFLAGSN) ?[CSNAMOB]$(COBJNAM)$@ $(SRC)\options.c $(O)pager.o: $(SRC)\pager.c $(HACK_H) $(DLB_H) $(CC) $(CFLAGNO) $(COBJNAM)$@ ?[CSNAMOA]$(SRC)\pager.c $(O)pickup.o: $(PCHO) $(SRC)\pickup.c $(HACK_H) $(O)pray.o: $(PCHO) $(SRC)\pray.c $(HACK_H) $(EPRI_H) $(O)quest.o: $(PCHO) $(SRC)\quest.c $(HACK_H) $(QUEST_H) $(QTEXT_H) $(O)questpgr.o: $(PCHO) $(SRC)\questpgr.c $(HACK_H) $(QTEXT_H) $(DLB_H) $(O)rect.o: $(PCHO) $(SRC)\rect.c $(HACK_H) $(O)region.o: $(PCHO) $(SRC)\region.c $(HACK_H) $(O)restore.o: $(PCHO) $(SRC)\restore.c $(HACK_H) $(LEV_H) $(TERMCAP_H) \ $(QUEST_H) $(O)rip.o: $(PCHO) $(SRC)\rip.c $(HACK_H) $(O)role.o: $(PCHO) $(SRC)\role.c $(HACK_H) $(O)rumors.o: $(PCHO) $(SRC)\rumors.c $(HACK_H) $(DLB_H) $(O)save.o: $(PCHO) $(SRC)\save.c $(HACK_H) $(LEV_H) $(QUEST_H) $(O)sit.o: $(PCHO) $(SRC)\sit.c $(HACK_H) $(ARTIFACT_H) $(O)steed.o: $(PCHO) $(SRC)\steed.c $(HACK_H) $(O)sp_lev.o: $(PCHO) $(SRC)\sp_lev.c $(HACK_H) $(SP_LEV_H) $(DLB_H) $(O)spell.o: $(PCHO) $(SRC)\spell.c $(HACK_H) $(O)teleport.o: $(PCHO) $(SRC)\teleport.c $(HACK_H) # check dep $(O)tile.o: $(PCHO) $(SRC)\tile.c $(HACK_H) $(O)topten.o: $(PCHO) $(SRC)\topten.c $(HACK_H) $(DLB_H) $(PATCHLEVEL_H) $(O)u_init.o: $(PCHO) $(SRC)\u_init.c $(HACK_H) $(O)uhitm.o: $(PCHO) $(SRC)\uhitm.c $(HACK_H) $(O)version.o: $(PCHO) $(SRC)\version.c $(HACK_H) $(PATCHLEVEL_H) $(O)vision.o: $(PCHO) $(SRC)\vision.c $(HACK_H) $(VIS_TAB_H) $(O)vis_tab.o: $(SRC)\vis_tab.c $(HACK_H) $(VIS_TAB_H) $(CC) $(CFLAGSN) ?[CSNAMOB]$(COBJNAM)$@ $(SRC)\vis_tab.c $(O)wield.o: $(PCHO) $(SRC)\wield.c $(HACK_H) $(O)windows.o: $(PCHO) $(SRC)\windows.c $(HACK_H) $(WINTTY_H) $(O)worm.o: $(PCHO) $(SRC)\worm.c $(HACK_H) $(LEV_H) $(O)worn.o: $(PCHO) $(SRC)\worn.c $(HACK_H) $(O)write.o: $(PCHO) $(SRC)\write.c $(HACK_H) # # Overlays # # OVL0 # $(O)allmain.0: $(PCH0) $(SRC)\allmain.c $(HACK_H) $(O)apply.0: $(PCH0) $(SRC)\apply.c $(HACK_H) $(EDOG_H) $(O)artifact.0: $(PCH0) $(SRC)\artifact.c $(HACK_H) $(ARTIFACT_H) $(ARTILIST_H) $(O)attrib.0: $(PCH0) $(SRC)\attrib.c $(HACK_H) $(O)botl.0: $(PCH0) $(SRC)\botl.c $(HACK_H) $(O)cmd.0: $(PCH0) $(SRC)\cmd.c $(HACK_H) $(FUNC_TAB_H) $(O)dbridge.0: $(PCH0) $(SRC)\dbridge.c $(HACK_H) $(O)do.0: $(PCH0) $(SRC)\do.c $(HACK_H) $(LEV_H) $(O)do_name.0: $(PCH0) $(SRC)\do_name.c $(HACK_H) $(O)do_wear.0: $(PCH0) $(SRC)\do_wear.c $(HACK_H) $(O)dogmove.0: $(PCH0) $(SRC)\dogmove.c $(HACK_H) $(MFNDPOS_H) $(EDOG_H) $(O)dungeon.0: $(PCH0) $(SRC)\dungeon.c $(HACK_H) $(ALIGN_H) $(DGN_FILE_H) \ $(DLB_H) $(O)eat.0: $(PCH0) $(SRC)\eat.c $(HACK_H) $(O)engrave.0: $(PCH0) $(SRC)\engrave.c $(HACK_H) $(LEV_H) $(O)explode.0: $(PCH0) $(SRC)\explode.c $(HACK_H) $(O)hacklib.0: $(PCH0) $(SRC)\hacklib.c $(HACK_H) $(O)invent.0: $(PCH0) $(SRC)\invent.c $(HACK_H) $(ARTIFACT_H) $(O)lock.0: $(PCH0) $(SRC)\lock.c $(HACK_H) $(O)mail.0: $(PCH0) $(SRC)\mail.c $(HACK_H) $(MAIL_H) $(PATCHLEVEL_H) $(O)makemon.0: $(PCH0) $(SRC)\makemon.c $(HACK_H) $(EPRI_H) $(EMIN_H) $(O)mcastu.0: $(PCH0) $(SRC)\mcastu.c $(HACK_H) $(O)mhitm.0: $(PCH0) $(SRC)\mhitm.c $(HACK_H) $(ARTIFACT_H) $(EDOG_H) $(O)mhitu.0: $(PCH0) $(SRC)\mhitu.c $(HACK_H) $(ARTIFACT_H) $(EDOG_H) $(O)mkobj.0: $(PCH0) $(SRC)\mkobj.c $(HACK_H) $(ARTIFACT_H) $(PROP_H) $(O)mkroom.0: $(PCH0) $(SRC)\mkroom.c $(HACK_H) $(O)mon.0: $(PCH0) $(SRC)\mon.c $(HACK_H) $(MFNDPOS_H) $(EDOG_H) $(O)mondata.0: $(PCH0) $(SRC)\mondata.c $(HACK_H) $(ESHK_H) $(EPRI_H) $(O)monmove.0: $(PCH0) $(SRC)\monmove.c $(HACK_H) $(MFNDPOS_H) $(ARTIFACT_H) $(O)mthrowu.0: $(PCH0) $(SRC)\mthrowu.c $(HACK_H) $(O)objnam.0: $(PCH0) $(SRC)\objnam.c $(HACK_H) $(O)polyself.0: $(PCH0) $(SRC)\polyself.c $(HACK_H) $(O)priest.0: $(PCH0) $(SRC)\priest.c $(HACK_H) $(MFNDPOS_H) $(ESHK_H) \ $(EPRI_H) $(EMIN_H) $(O)rnd.0: $(PCH0) $(SRC)\rnd.c $(HACK_H) $(O)shk.0: $(PCH0) $(SRC)\shk.c $(HACK_H) $(ESHK_H) $(O)shknam.0: $(PCH0) $(SRC)\shknam.c $(HACK_H) $(ESHK_H) $(O)sounds.0: $(PCH0) $(SRC)\sounds.c $(HACK_H) $(EDOG_H) $(O)steal.0: $(PCH0) $(SRC)\steal.c $(HACK_H) $(O)timeout.0: $(PCH0) $(SRC)\timeout.c $(HACK_H) $(LEV_H) $(O)track.0: $(PCH0) $(SRC)\track.c $(HACK_H) $(O)trap.0: $(PCH0) $(SRC)\trap.c $(HACK_H) $(O)vault.0: $(PCH0) $(SRC)\vault.c $(HACK_H) $(VAULT_H) $(O)weapon.0: $(PCH0) $(SRC)\weapon.c $(HACK_H) $(O)were.0: $(PCH0) $(SRC)\were.c $(HACK_H) $(O)wizard.0: $(PCH0) $(SRC)\wizard.c $(HACK_H) $(QTEXT_H) $(O)zap.0: $(PCH0) $(SRC)\zap.c $(HACK_H) # # OVL1 # $(O)allmain.1: $(PCH1) $(SRC)\allmain.c $(HACK_H) $(O)apply.1: $(PCH1) $(SRC)\apply.c $(HACK_H) $(EDOG_H) $(O)artifact.1: $(PCH1) $(SRC)\artifact.c $(HACK_H) $(ARTIFACT_H) $(ARTILIST_H) $(O)attrib.1: $(PCH1) $(SRC)\attrib.c $(HACK_H) $(O)botl.1: $(PCH1) $(SRC)\botl.c $(HACK_H) $(O)cmd.1: $(PCH1) $(SRC)\cmd.c $(HACK_H) $(FUNC_TAB_H) $(O)dbridge.1: $(PCH1) $(SRC)\dbridge.c $(HACK_H) $(O)do.1: $(PCH1) $(SRC)\do.c $(HACK_H) $(LEV_H) $(O)do_wear.1: $(PCH1) $(SRC)\do_wear.c $(HACK_H) $(O)dog.1: $(PCH1) $(SRC)\dog.c $(HACK_H) $(EDOG_H) $(O)dungeon.1: $(PCH1) $(SRC)\dungeon.c $(HACK_H) $(ALIGN_H) $(DGN_FILE_H) $(DLB_H) $(O)eat.1: $(PCH1) $(SRC)\eat.c $(HACK_H) $(O)engrave.1: $(PCH1) $(SRC)\engrave.c $(HACK_H) $(LEV_H) $(O)explode.1: $(PCH1) $(SRC)\explode.c $(HACK_H) $(O)hack.1: $(PCH1) $(SRC)\hack.c $(HACK_H) $(O)hacklib.1: $(PCH1) $(SRC)\hacklib.c $(HACK_H) $(O)invent.1: $(PCH1) $(SRC)\invent.c $(HACK_H) $(ARTIFACT_H) $(O)makemon.1: $(PCH1) $(SRC)\makemon.c $(HACK_H) $(EPRI_H) $(EMIN_H) $(O)mhitu.1: $(PCH1) $(SRC)\mhitu.c $(HACK_H) $(ARTIFACT_H) $(EDOG_H) $(O)mkobj.1: $(PCH1) $(SRC)\mkobj.c $(HACK_H) $(ARTIFACT_H) $(PROP_H) $(O)mon.1: $(PCH1) $(SRC)\mon.c $(HACK_H) $(MFNDPOS_H) $(EDOG_H) $(O)mondata.1: $(PCH1) $(SRC)\mondata.c $(HACK_H) $(ESHK_H) $(EPRI_H) $(O)monmove.1: $(PCH1) $(SRC)\monmove.c $(HACK_H) $(MFNDPOS_H) $(ARTIFACT_H) $(O)mthrowu.1: $(PCH1) $(SRC)\mthrowu.c $(HACK_H) $(O)objnam.1: $(PCH1) $(SRC)\objnam.c $(HACK_H) $(O)polyself.1: $(PCH1) $(SRC)\polyself.c $(HACK_H) $(O)rnd.1: $(PCH1) $(SRC)\rnd.c $(HACK_H) $(O)shk.1: $(PCH1) $(SRC)\shk.c $(HACK_H) $(ESHK_H) $(O)steal.1: $(PCH1) $(SRC)\steal.c $(HACK_H) $(O)timeout.1: $(PCH1) $(SRC)\timeout.c $(HACK_H) $(LEV_H) $(O)track.1: $(PCH1) $(SRC)\track.c $(HACK_H) $(O)trap.1: $(PCH1) $(SRC)\trap.c $(HACK_H) $(O)weapon.1: $(PCH1) $(SRC)\weapon.c $(HACK_H) $(O)zap.1: $(PCH1) $(SRC)\zap.c $(HACK_H) # # OVL2 # $(O)attrib.2: $(PCH2) $(SRC)\attrib.c $(HACK_H) $(O)do.2: $(PCH2) $(SRC)\do.c $(HACK_H) $(LEV_H) $(O)do_name.2: $(PCH2) $(SRC)\do_name.c $(HACK_H) $(O)do_wear.2: $(PCH2) $(SRC)\do_wear.c $(HACK_H) $(O)dog.2: $(PCH2) $(SRC)\dog.c $(HACK_H) $(EDOG_H) $(O)engrave.2: $(PCH2) $(SRC)\engrave.c $(HACK_H) $(LEV_H) $(O)hack.2: $(PCH2) $(SRC)\hack.c $(HACK_H) $(O)hacklib.2: $(PCH2) $(SRC)\hacklib.c $(HACK_H) $(O)invent.2: $(PCH2) $(SRC)\invent.c $(HACK_H) $(ARTIFACT_H) $(O)makemon.2: $(PCH2) $(SRC)\makemon.c $(HACK_H) $(EPRI_H) $(EMIN_H) $(O)mon.2: $(PCH2) $(SRC)\mon.c $(HACK_H) $(MFNDPOS_H) $(EDOG_H) $(O)mondata.2: $(PCH2) $(SRC)\mondata.c $(HACK_H) $(ESHK_H) $(EPRI_H) $(O)monmove.2: $(PCH2) $(SRC)\monmove.c $(HACK_H) $(MFNDPOS_H) $(ARTIFACT_H) $(O)shk.2: $(PCH2) $(SRC)\shk.c $(HACK_H) $(ESHK_H) $(O)trap.2: $(PCH2) $(SRC)\trap.c $(HACK_H) $(O)zap.2: $(PCH2) $(SRC)\zap.c $(HACK_H) # # OVL3 # $(O)do.3: $(PCH3) $(SRC)\do.c $(HACK_H) $(LEV_H) $(O)hack.3: $(PCH3) $(SRC)\hack.c $(HACK_H) $(O)invent.3: $(PCH3) $(SRC)\invent.c $(HACK_H) $(ARTIFACT_H) $(O)light.3: $(PCH3) $(SRC)\light.c $(HACK_H) $(O)shk.3: $(PCH3) $(SRC)\shk.c $(HACK_H) $(ESHK_H) $(O)trap.3: $(PCH3) $(SRC)\trap.c $(HACK_H) $(O)zap.3: $(PCH3) $(SRC)\zap.c $(HACK_H) # # OVLB # $(O)allmain.B: $(PCHB) $(SRC)\allmain.c $(HACK_H) $(O)apply.B: $(PCHB) $(SRC)\apply.c $(HACK_H) $(EDOG_H) $(O)artifact.B: $(PCHB) $(SRC)\artifact.c $(HACK_H) $(ARTIFACT_H) $(ARTILIST_H) $(O)attrib.B: $(PCHB) $(SRC)\attrib.c $(HACK_H) $(O)botl.B: $(PCHB) $(SRC)\botl.c $(HACK_H) $(O)cmd.B: $(PCHB) $(SRC)\cmd.c $(HACK_H) $(FUNC_TAB_H) $(O)dbridge.B: $(PCHB) $(SRC)\dbridge.c $(HACK_H) $(O)do.B: $(PCHB) $(SRC)\do.c $(HACK_H) $(LEV_H) $(O)do_name.B: $(PCHB) $(SRC)\do_name.c $(HACK_H) $(O)do_wear.B: $(PCHB) $(SRC)\do_wear.c $(HACK_H) $(O)dog.B: $(PCHB) $(SRC)\dog.c $(HACK_H) $(EDOG_H) $(O)dogmove.B: $(PCHB) $(SRC)\dogmove.c $(HACK_H) $(MFNDPOS_H) $(EDOG_H) $(O)eat.B: $(PCHB) $(SRC)\eat.c $(HACK_H) $(O)engrave.B: $(PCHB) $(SRC)\engrave.c $(HACK_H) $(LEV_H) $(O)hack.B: $(PCHB) $(SRC)\hack.c $(HACK_H) $(O)hacklib.B: $(PCHB) $(SRC)\hacklib.c $(HACK_H) $(O)invent.B: $(PCHB) $(SRC)\invent.c $(HACK_H) $(ARTIFACT_H) $(O)lock.B: $(PCHB) $(SRC)\lock.c $(HACK_H) $(O)mail.B: $(PCHB) $(SRC)\mail.c $(HACK_H) $(MAIL_H) $(PATCHLEVEL_H) $(O)makemon.B: $(PCHB) $(SRC)\makemon.c $(HACK_H) $(EPRI_H) $(EMIN_H) $(O)mcastu.B: $(PCHB) $(SRC)\mcastu.c $(HACK_H) $(O)mhitm.B: $(PCHB) $(SRC)\mhitm.c $(HACK_H) $(ARTIFACT_H) $(EDOG_H) $(O)mhitu.B: $(PCHB) $(SRC)\mhitu.c $(HACK_H) $(ARTIFACT_H) $(EDOG_H) $(O)mkobj.B: $(PCHB) $(SRC)\mkobj.c $(HACK_H) $(ARTIFACT_H) $(PROP_H) $(O)mkroom.B: $(PCHB) $(SRC)\mkroom.c $(HACK_H) $(O)mon.B: $(PCHB) $(SRC)\mon.c $(HACK_H) $(MFNDPOS_H) $(EDOG_H) $(O)mondata.B: $(PCHB) $(SRC)\mondata.c $(HACK_H) $(ESHK_H) $(EPRI_H) $(O)monmove.B: $(PCHB) $(SRC)\monmove.c $(HACK_H) $(MFNDPOS_H) $(ARTIFACT_H) $(O)mthrowu.B: $(PCHB) $(SRC)\mthrowu.c $(HACK_H) $(O)objnam.B: $(PCHB) $(SRC)\objnam.c $(HACK_H) $(O)pline.B: $(SRC)\pline.c $(HACK_H) $(EPRI_H) $(CC) $(CFLAGSN) ?[CSNAMB]$(COBJNAM)$@ $(SRC)\pline.c $(O)polyself.B: $(PCHB) $(SRC)\polyself.c $(HACK_H) $(O)potion.B: $(PCHB) $(SRC)\potion.c $(HACK_H) $(O)priest.B: $(PCHB) $(SRC)\priest.c $(HACK_H) $(MFNDPOS_H) $(ESHK_H) \ $(EPRI_H) $(EMIN_H) $(O)read.B: $(PCHB) $(SRC)\read.c $(HACK_H) $(O)rnd.B: $(PCHB) $(SRC)\rnd.c $(HACK_H) $(O)shk.B: $(PCHB) $(SRC)\shk.c $(HACK_H) $(ESHK_H) $(O)shknam.B: $(PCHB) $(SRC)\shknam.c $(HACK_H) $(ESHK_H) $(O)sounds.B: $(PCHB) $(SRC)\sounds.c $(HACK_H) $(EDOG_H) $(O)steal.B: $(PCHB) $(SRC)\steal.c $(HACK_H) $(O)timeout.B: $(PCHB) $(SRC)\timeout.c $(HACK_H) $(LEV_H) $(O)track.B: $(PCHB) $(SRC)\track.c $(HACK_H) $(O)trap.B: $(PCHB) $(SRC)\trap.c $(HACK_H) $(O)vault.B: $(PCHB) $(SRC)\vault.c $(HACK_H) $(VAULT_H) $(O)weapon.B: $(PCHB) $(SRC)\weapon.c $(HACK_H) $(O)were.B: $(PCHB) $(SRC)\were.c $(HACK_H) $(O)wizard.B: $(PCHB) $(SRC)\wizard.c $(HACK_H) $(QTEXT_H) $(O)zap.B: $(PCHB) $(SRC)\zap.c $(HACK_H) # end of file slashem-0.0.7E7F3/sys/msdos/portio.h0000664000076400007640000000426010545462317015306 0ustar aliali/* 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. */ /* */ /* * portio.h - PC port I/O Hardware support definitions and other * low-level definitions. * */ #ifndef PORTIO_H #define PORTIO_H # if defined(__GO32__) || defined(__DJGPP__) #define __far #include #include #include #endif # if defined(_MSC_VER) #define outportb _outp #define outportw _outpw #define inportb _inp # endif # if defined(__BORLANDC__) #define outportw outport /* #define inportb inport */ # endif # ifndef MK_PTR /* * Depending on environment, this is a macro to construct either: * * - a djgpp long 32 bit pointer from segment & offset values * - a far pointer from segment and offset values * */ # if defined(_MSC_VER) || defined(__BORLANDC__) #define MK_PTR(seg, offset) (void __far *)(((unsigned long)seg << 16) \ + (unsigned long)(unsigned)offset) #define READ_ABSOLUTE(x) *(x) #define READ_ABSOLUTE_WORD(x) *(x) #define WRITE_ABSOLUTE(x,y) *(x) = (y) #define WRITE_ABSOLUTE_WORD(x,y) *(x) = (y) # endif # if defined(__GO32__) || defined(__DJGPP__) #define MK_PTR(seg, offset) (void *)(((unsigned)seg << 4) + (unsigned)offset) #define READ_ABSOLUTE(x) \ (_farpeekb(_go32_conventional_mem_selector(), (unsigned)x)) #define READ_ABSOLUTE_WORD(x) \ (_farpeekw(_go32_conventional_mem_selector(), (unsigned)x)) #define WRITE_ABSOLUTE(x,y) \ _farpokeb(_go32_conventional_mem_selector(), (unsigned)x, (y)) #define WRITE_ABSOLUTE_WORD(x,y) \ _farpokew(_go32_conventional_mem_selector(), (unsigned)x, (y)) # endif # ifdef OBSOLETE /* old djgpp V1.x way of mapping 1st MB */ #define MK_PTR(seg, offset) (void *)(0xE0000000+((((unsigned)seg << 4) \ + (unsigned)offset))) #define READ_ABSOLUTE(x) *(x) #define READ_ABSOLUTE_WORD(x) *(x) #define WRITE_ABSOLUTE(x,y) *(x) = (y) #define WRITE_ABSOLUTE_WORD(x,y) *(x) = (y) # endif # endif /* MK_PTR */ #endif /* PORTIO_H */ /* portio.h */ slashem-0.0.7E7F3/sys/msdos/video.c0000664000076400007640000005477710545462317015115 0ustar aliali/* 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" #ifndef STUBVIDEO #include "pcvideo.h" #include "pctiles.h" #if defined(_MSC_VER) # if _MSC_VER >= 700 #pragma warning(disable:4018) /* signed/unsigned mismatch */ #pragma warning(disable:4127) /* conditional expression is constant */ #pragma warning(disable:4131) /* old style declarator */ #pragma warning(disable:4305) /* prevents complaints with MK_FP */ #pragma warning(disable:4309) /* initializing */ #pragma warning(disable:4759) /* prevents complaints with MK_FP */ # endif #endif /*========================================================================= * General PC Video routines. * * The following routines are the video interfacing functions. * In general these make calls to more hardware specific * routines in other source files. * * Assumptions (94/04/23): * * - Supported defaults.nh file video options: * * If OPTIONS=video:autodetect is defined in defaults.nh then * check for a VGA video adapter. If one is detected, then * use the VGA code, otherwise resort to using the 'standard' * video BIOS routines. * * If OPTIONS=video:vga is defined in defaults.nh, then use * the VGA code. * * If OPTIONS=video:default is defined in defaults.nh use the * 'standard' video BIOS routines (in the overlaid version), * or DJGPPFAST routines (under djgpp). This is equivalent to * having no OPTIONS=video:xxxx entry at all. * * Notes (94/04/23): * * - The handler for defaults.nh file entry: * * OPTIONS=video:xxxxx * * has now been added. The handler is in video.c and is called * from options.c. * * - Handling of videocolors and videoshades are now done with * OPTIONS= statements. The new syntax separates the colour * values with dashes ('-') rather than spaces (' '). * * To Do (94/04/23): * * *========================================================================= */ #ifdef OVLB void get_scr_size() { # ifdef SCREEN_VGA if (iflags.usevga) { vga_get_scr_size(); } else # endif # ifdef ALLEG_FX if (iflags.usealleg) { alleg_get_scr_size(); } else # endif txt_get_scr_size(); } #endif /*OVLB*/ /* * -------------------------------------------------------------- * The rest of this file is only compiled if NO_TERMS is defined. * -------------------------------------------------------------- */ #ifdef NO_TERMS #include #include "wintty.h" # ifdef __GO32__ #include #include #if !(__DJGPP__ >= 2) typedef long clock_t; #endif # endif # ifdef __BORLANDC__ #include /* needed for delay() */ # endif # ifdef SCREEN_DJGPPFAST /* parts of this block may be unecessary now */ #define get_cursor(x,y) ScreenGetCursor(y,x) # endif # ifdef SCREEN_BIOS void FDECL(get_cursor, (int *, int *)); # endif void FDECL(adjust_cursor_flags, (struct WinDesc *)); void FDECL(cmov, (int, int)); void FDECL(nocmov, (int, int)); STATIC_DCL void NDECL(init_ttycolor); # ifdef OVLB int savevmode; /* store the original video mode in here */ int curcol,currow; /* graphics mode current cursor locations */ int g_attribute; /* Current attribute to use */ int monoflag; /* 0 = not monochrome, else monochrome */ int attrib_text_normal; /* text mode normal attribute */ int attrib_gr_normal; /* graphics mode normal attribute */ int attrib_text_intense; /* text mode intense attribute */ int attrib_gr_intense; /* graphics mode intense attribute */ boolean traditional = FALSE; /* traditonal TTY character mode */ boolean inmap = FALSE; /* in the map window */ # ifdef TEXTCOLOR char ttycolors[CLR_MAX]; /* also used/set in options.c */ # endif /* TEXTCOLOR */ # else extern int savevmode; extern int curcol,currow; extern int g_attribute; extern int monoflag; extern int attrib_text_normal; extern int attrib_gr_normal; extern int attrib_text_intense; extern int attrib_gr_intense; extern boolean traditonal; extern boolean inmap; # ifdef TEXTCOLOR extern char ttycolors[CLR_MAX]; /* also used/set in options.c */ # endif /* TEXTCOLOR */ # endif /* OVLB */ # ifdef OVLB void backsp() { if (!iflags.grmode) { txt_backsp(); # ifdef SCREEN_VGA } else if (iflags.usevga) { vga_backsp(); # endif # ifdef ALLEG_FX } else if (iflags.usealleg) { alleg_backsp(); # endif } } # endif /* OVLB */ # ifdef OVL0 void clear_screen() { if (!iflags.grmode) { txt_clear_screen(); # ifdef SCREEN_VGA } else if (iflags.usevga) { vga_clear_screen(BACKGROUND_VGA_COLOR); # endif # ifdef ALLEG_FX } else if (iflags.usealleg) { alleg_clear_screen(BACKGROUND_ALLEGRO_COLOR); # endif } } void cl_end() /* clear to end of line */ { int col,row; col = (int)ttyDisplay->curx; row = (int)ttyDisplay->cury; if (!iflags.grmode) { txt_cl_end(col,row); # ifdef SCREEN_VGA } else if (iflags.usevga) { vga_cl_end(col,row); # endif # ifdef ALLEG_FX } else if (iflags.usealleg) { alleg_cl_end(col,row); # endif } tty_curs(BASE_WINDOW, (int)ttyDisplay->curx+1, (int)ttyDisplay->cury); } void cl_eos() /* clear to end of screen */ { int cy = (int)ttyDisplay->cury+1; if (!iflags.grmode) { txt_cl_eos(); # ifdef SCREEN_VGA } else if (iflags.usevga) { vga_cl_eos(cy); # endif # ifdef ALLEG_FX } else if (iflags.usealleg) { alleg_cl_eos(cy); # endif } tty_curs(BASE_WINDOW, (int)ttyDisplay->curx+1, (int)ttyDisplay->cury); } void cmov(col, row) register int col, row; { ttyDisplay->cury = (uchar)row; ttyDisplay->curx = (uchar)col; if (!iflags.grmode) { txt_gotoxy(col,row); # ifdef SCREEN_VGA } else if (iflags.usevga) { vga_gotoloc(col,row); # endif # ifdef ALLEG_FX } else if (iflags.usealleg) { alleg_gotoloc(col,row); # endif } } # endif /* OVL0 */ # ifdef OVLB int has_color(int color) { ++color; /* prevents compiler warning (unref. param) */ # ifdef TEXTCOLOR return (monoflag) ? 0 : 1; # else return 0; # endif } # endif /* OVLB */ # ifdef OVL0 void home() { tty_curs(BASE_WINDOW, 1, 0); ttyDisplay->curx = ttyDisplay->cury = (uchar)0; if (!iflags.grmode) { txt_gotoxy(0,0); # ifdef SCREEN_VGA } else if (iflags.usevga) { vga_gotoloc(0,0); # endif # ifdef ALLEG_FX } else if (iflags.usealleg) { alleg_gotoloc(0,0); # endif } } void nocmov(col, row) int col,row; { if (!iflags.grmode) { txt_gotoxy(col,row); # ifdef SCREEN_VGA } else if (iflags.usevga) { vga_gotoloc(col,row); # endif # ifdef ALLEG_FX } else if (iflags.usealleg) { alleg_gotoloc(col,row); # endif } } void standoutbeg() { g_attribute = iflags.grmode ? attrib_gr_intense : attrib_text_intense; } void standoutend() { g_attribute = iflags.grmode ? attrib_gr_normal : attrib_text_normal; } # endif /* OVL0 */ # ifdef OVLB void term_end_attr(int attr) { switch(attr) { case ATR_ULINE: case ATR_BOLD: case ATR_BLINK: case ATR_INVERSE: default: g_attribute = iflags.grmode ? attrib_gr_normal : attrib_text_normal; } } void term_end_color(void) { g_attribute = iflags.grmode ? attrib_gr_normal : attrib_text_normal; } void term_end_raw_bold(void) { standoutend(); } void term_start_attr(int attr) { switch(attr){ case ATR_ULINE: if (monoflag) { g_attribute = ATTRIB_MONO_UNDERLINE; } else { g_attribute = iflags.grmode ? attrib_gr_intense : attrib_text_intense; } break; case ATR_BOLD: g_attribute = iflags.grmode ? attrib_gr_intense : attrib_text_intense; break; case ATR_BLINK: if (monoflag) { g_attribute = ATTRIB_MONO_BLINK; } else { g_attribute = iflags.grmode ? attrib_gr_intense : attrib_text_intense; } break; case ATR_INVERSE: if (monoflag) { g_attribute = ATTRIB_MONO_REVERSE; } else { g_attribute = iflags.grmode ? attrib_gr_intense : attrib_text_intense; } break; default: g_attribute = iflags.grmode ? attrib_gr_normal : attrib_text_normal; break; } } void term_start_color(int color) { # ifdef TEXTCOLOR if (monoflag) { g_attribute = attrib_text_normal; } else { if (color >= 0 && color < CLR_MAX) { if (iflags.grmode) g_attribute = color; else g_attribute = ttycolors[color]; } } # endif } void term_start_raw_bold(void) { standoutbeg(); } # endif /* OVLB */ # ifdef OVL0 void tty_delay_output() { #ifdef TIMED_DELAY if (flags.nap) { (void) fflush(stdout); msleep(50); /* sleep for 50 milliseconds */ return; } #endif } # endif /* OVL0 */ # ifdef OVLB void tty_end_screen() { if (!iflags.grmode) { txt_clear_screen(); # ifdef PC9800 fputs("\033[>1l", stdout); # endif # ifdef SCREEN_VGA } else if (iflags.usevga) { vga_tty_end_screen(); # endif # ifdef ALLEG_FX } else if (iflags.usealleg) { alleg_tty_end_screen(); # endif } } void tty_nhbell() { txt_nhbell(); } void tty_number_pad(state) int state; { ++state; /* prevents compiler warning (unref. param) */ } void tty_startup(wid, hgt) int *wid, *hgt; { /* code to sense display adapter is required here - MJA */ attrib_text_normal = ATTRIB_NORMAL; attrib_text_intense = ATTRIB_INTENSE; /* These are defaults and may get overridden */ attrib_gr_normal = attrib_text_normal; attrib_gr_intense = attrib_text_intense; g_attribute = attrib_text_normal; /* Give it a starting value */ # ifdef SCREEN_VGA if (iflags.usevga) { vga_tty_startup(wid, hgt); } else # endif # ifdef ALLEG_FX if (iflags.usealleg) { alleg_tty_startup(wid, hgt); } else # endif txt_startup(wid, hgt); *wid = CO; *hgt = LI; # ifdef CLIPPING if (CO < COLNO || LI < ROWNO+3) setclipped(); # endif # ifdef TEXTCOLOR init_ttycolor(); # endif # ifdef MONO_CHECK monoflag = txt_monoadapt_check(); # else monoflag = 0; # endif } void tty_start_screen() { # ifdef PC9800 fputs("\033[>1h", stdout); # endif if (iflags.num_pad) tty_number_pad(1); /* make keypad send digits */ } void gr_init(){ if (iflags.usevga) { # ifdef SCREEN_VGA vga_Init(); # endif # ifdef ALLEG_FX } else if (iflags.usealleg) { alleg_Init(); # endif # ifdef SCREEN_VESA } else if (iflags.usevesa) { vesa_Init(); # endif # ifdef SCREEN_8514 } else if (iflags.use8514) { v8514_Init(); # endif } } void gr_finish() { if (iflags.grmode) { if (iflags.usevga) { # ifdef SCREEN_VGA vga_Finish(); # endif # ifdef ALLEG_FX } else if (iflags.usealleg) { alleg_Finish(); # endif # ifdef SCREEN_VESA } else if (iflags.usevesa) { vesa_Finish(); # endif # ifdef SCREEN_8514 } else if (iflags.use8514) { v8514_Finish(); # endif } } } # endif /* OVLB */ /* * Screen output routines (these are heavily used). * * These are the 3 routines used to place information on the screen * in the NO_TERMS PC tty port of NetHack. These are the routines * that get called by routines in other NetHack source files (such * as those in win/tty). * * xputs - Writes a c null terminated string at the current location. * Depending on compile options, this could just be a series * of repeated calls to xputc() for each character. * * xputc - Writes a single character at the current location. Since * various places in the code assume that control characters * can be used to control, we are forced to interpret some of * the more common ones, in order to keep things looking correct. * * xputg - If using a graphics mode display mechanism (such as VGA, this * routine is used to display a graphical representation of a * NetHack glyph at the current location. For more information on * NetHack glyphs refer to the comments in include/display.h. * * NOTES: * wintty.h uses macros to redefine common output functions * such as puts, putc, putchar, so that they get steered into * either xputs (for strings) or xputc (for single characters). * References to puts, putc, and putchar in other source files * (that include wintty.h) are actually using these routines. */ # ifdef OVL0 void xputs(s) const char *s; { int col,row; col = (int)ttyDisplay->curx; row = (int)ttyDisplay->cury; if (!iflags.grmode) { txt_xputs(s,col,row); # ifdef SCREEN_VGA } else if (iflags.usevga) { vga_xputs(s,col,row); # endif # ifdef ALLEG_FX } else if (iflags.usealleg) { alleg_xputs(s,col,row); # endif } } void xputc(ch) /* write out character (and attribute) */ char ch; { int i; char attribute; i = iflags.grmode ? attrib_gr_normal : attrib_text_normal; attribute = (char)((g_attribute == 0) ? i : g_attribute); if (!iflags.grmode) { txt_xputc(ch,attribute); # ifdef SCREEN_VGA } else if (iflags.usevga) { vga_xputc(ch,attribute); # endif /*SCREEN_VGA*/ # ifdef ALLEG_FX } else if (iflags.usealleg) { alleg_xputc(ch,attribute); # endif /*ALLEG_FX*/ } } 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 if (iflags.usevga) { vga_xputg(glyphnum, ch, special); # endif # ifdef ALLEG_FX } else if (iflags.usealleg) { alleg_xputg(glyphnum, ch); # endif } } # ifdef POSITIONBAR void video_update_positionbar(posbar) char *posbar; { if (!iflags.grmode) return; # ifdef SCREEN_VGA else if (iflags.usevga) vga_update_positionbar(posbar); # endif # ifdef ALLEG_FX else if (iflags.usealleg) alleg_update_positionbar(posbar); # endif } # endif void adjust_cursor_flags(cw) struct WinDesc *cw; { # ifdef SIMULATE_CURSOR # if 0 if (cw->type == NHW_MAP) cursor_flag = 1; else cursor_flag = 0; # else if (cw->type == NHW_MAP) { inmap = 1; cursor_flag = 1; } else { inmap = 0; cursor_flag = 1; } # endif /* 0 */ # endif /* SIMULATE_CURSOR */ } # ifdef SIMULATE_CURSOR /* change the defaults in pcvideo.h, not here */ int cursor_type = CURSOR_DEFAULT_STYLE; int cursor_color = CURSOR_DEFAULT_COLOR; int cursor_flag; /* The check for iflags.grmode is made BEFORE calling these. */ void DrawCursor() { # ifdef SCREEN_VGA if (iflags.usevga) vga_DrawCursor(); # ifdef ALLEG_FX else # endif # endif # ifdef ALLEG_FX if (iflags.usealleg) alleg_DrawCursor(); # endif } void HideCursor() { # ifdef SCREEN_VGA if (iflags.usevga) vga_HideCursor(); # endif # ifdef ALLEG_FX if (iflags.usealleg) alleg_HideCursor(); # endif } # endif /* SIMULATE_CURSOR */ # endif /* OVL0 */ # ifdef TEXTCOLOR /* * CLR_BLACK 0 * CLR_RED 1 * CLR_GREEN 2 * CLR_BROWN 3 low-intensity yellow * CLR_BLUE 4 * CLR_MAGENTA 5 * CLR_CYAN 6 * CLR_GRAY 7 low-intensity white * NO_COLOR 8 * CLR_ORANGE 9 * CLR_BRIGHT_GREEN 10 * CLR_YELLOW 11 * CLR_BRIGHT_BLUE 12 * CLR_BRIGHT_MAGENTA 13 * CLR_BRIGHT_CYAN 14 * CLR_WHITE 15 * CLR_MAX 16 * BRIGHT 8 */ # ifdef VIDEOSHADES /* assign_videoshades() is prototyped in extern.h */ /* assign_videocolors() is prototyped in extern.h */ /* assign_video() is prototyped in extern.h */ # ifdef OVLB int shadeflag; /* shades are initialized */ int colorflag; /* colors are initialized */ char *schoice[3] = {"dark","normal","light"}; char *shade[3]; # else extern int shadeflag; extern int colorflag; extern char *schoice[3]; extern char *shade[3]; # endif /* OVLB */ # endif /* VIDEOSHADES */ # ifdef OVLB STATIC_OVL void init_ttycolor() { # ifdef VIDEOSHADES if (!shadeflag) { ttycolors[CLR_BLACK] = M_BLACK; /* 8 = dark gray */ ttycolors[CLR_WHITE] = M_WHITE; /* 15 = bright white */ ttycolors[CLR_GRAY] = M_GRAY; /* 7 = normal white */ shade[0] = schoice[0]; shade[1] = schoice[1]; shade[2] = schoice[2]; } # else ttycolors[CLR_BLACK] = M_GRAY; /* mapped to white */ ttycolors[CLR_WHITE] = M_GRAY; /* mapped to white */ ttycolors[CLR_GRAY] = M_GRAY; /* mapped to white */ # endif # ifdef VIDEOSHADES if (!colorflag) { # endif ttycolors[CLR_RED] = M_RED; ttycolors[CLR_GREEN] = M_GREEN; ttycolors[CLR_BROWN] = M_BROWN; ttycolors[CLR_BLUE] = M_BLUE; ttycolors[CLR_MAGENTA] = M_MAGENTA; ttycolors[CLR_CYAN] = M_CYAN; ttycolors[BRIGHT] = M_WHITE; ttycolors[CLR_ORANGE] = M_ORANGE; ttycolors[CLR_BRIGHT_GREEN] = M_BRIGHTGREEN; ttycolors[CLR_YELLOW] = M_YELLOW; ttycolors[CLR_BRIGHT_BLUE] = M_BRIGHTBLUE; ttycolors[CLR_BRIGHT_MAGENTA] = M_BRIGHTMAGENTA; ttycolors[CLR_BRIGHT_CYAN] = M_BRIGHTCYAN; # ifdef VIDEOSHADES } # endif } # endif /* OVLB */ # ifdef OVL1 static int FDECL(convert_uchars,(char *, uchar *, int)); # ifdef VIDEOSHADES int assign_videoshades(char *choiceptr) { char choices[120]; char *cptr, *cvalue[3]; int i,icolor = CLR_WHITE; strcpy(choices,choiceptr); cvalue[0] = choices; /* find the next ' ' or tab */ cptr = index(cvalue[0], '-'); if (!cptr) cptr = index(cvalue[0], ' '); if (!cptr) cptr = index(cvalue[0], '\t'); if (!cptr) return 0; *cptr = '\0'; /* skip whitespace between '=' and value */ do { ++cptr; } while (isspace(*cptr) || (*cptr == '-')); cvalue[1] = cptr; cptr = index(cvalue[1], '-'); if (!cptr) cptr = index(cvalue[0], ' '); if (!cptr) cptr = index(cvalue[0], '\t'); if (!cptr) return 0; *cptr = '\0'; do { ++cptr; } while (isspace(*cptr) || (*cptr == '-')); cvalue[2] = cptr; for (i=0; i < 3; ++i) { switch(i) { case 0: icolor = CLR_BLACK; break; case 1: icolor = CLR_GRAY; break; case 2: icolor = CLR_WHITE; break; } shadeflag = 1; if ((strncmpi(cvalue[i],"black",5) == 0) || (strncmpi(cvalue[i],"dark",4) == 0)) { shade[i] = schoice[0]; ttycolors[icolor] = M_BLACK; /* dark gray */ } else if ((strncmpi(cvalue[i],"gray",4) == 0) || (strncmpi(cvalue[i],"grey",4) == 0) || (strncmpi(cvalue[i],"medium",6) == 0) || (strncmpi(cvalue[i],"normal",6) == 0)) { shade[i] = schoice[1]; ttycolors[icolor] = M_GRAY; /* regular gray */ } else if ((strncmpi(cvalue[i],"white",5) == 0) || (strncmpi(cvalue[i],"light",5) == 0)) { shade[i] = schoice[2]; ttycolors[icolor] = M_WHITE; /* bright white */ } else { shadeflag = 0; return 0; } } return 1; } /* * Process defaults.nh OPTIONS=videocolors:xxx * Left to right assignments for: * red green brown blue magenta cyan orange br.green yellow * br.blue br.mag br.cyan * * Default Mapping (BIOS): 4-2-6-1-5-3-12-10-14-9-13-11 */ int assign_videocolors(char *colorvals) { int i,icolor; uchar *tmpcolor; init_ttycolor(); /* in case defaults.nh entry wasn't complete */ i = strlen(colorvals); tmpcolor = (uchar *)alloc(i); (void)convert_uchars(colorvals,tmpcolor,i); icolor = CLR_RED; for( i = 0; tmpcolor[i] != 0; ++i) { if (icolor < (CLR_WHITE)) { ttycolors[icolor++] = tmpcolor[i]; if ((icolor > CLR_CYAN) && (icolor < CLR_ORANGE)) { icolor = CLR_ORANGE; } } } colorflag = 1; free((genericptr_t)tmpcolor); return 1; } static int convert_uchars(bufp,list,size) char *bufp; /* current pointer */ uchar *list; /* return list */ int size; { unsigned int num = 0; int count = 0; while (1) { switch(*bufp) { case ' ': case '\0': case '\t': case '-': case '\n': if (num) { list[count++] = num; num = 0; } if ((count==size) || !*bufp) return count; bufp++; break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': num = num*10 + (*bufp-'0'); bufp++; break; return count; } } /*NOTREACHED*/ } # endif /* VIDEOSHADES */ # endif /* OVL1 */ # endif /* TEXTCOLOR */ /* * Process defaults.nh OPTIONS=video:xxxx * * where (current) legitimate values are: * * autodetect (attempt to determine the adapter type) * default (force use of the default video method for environment) * vga (use vga adapter code) * allegro (use allegro code) */ # ifdef OVL1 int assign_video(sopt) char *sopt; { /* * debug * * printf("video is %s",sopt); * getch(); */ iflags.grmode = 0; iflags.hasvga = 0; iflags.hasalleg = 0; iflags.usevga = 0; iflags.hasalleg = 0; if (strncmpi(sopt,"def",3) == 0) { /* default */ /* do nothing - default */ # ifdef SCREEN_VGA } else if (strncmpi(sopt,"vga",3) == 0) { /* vga */ iflags.usevga = 1; iflags.hasvga = 1; # endif # ifdef ALLEG_FX } else if (strncmpi(sopt,"alleg",5) == 0) { /* Allegro */ iflags.hasalleg = 1; iflags.usealleg = 1; # endif # ifdef SCREEN_VESA } else if (strncmpi(sopt,"vesa",4) == 0) { /* vesa */ iflags.hasvesa = 1; iflags.usevesa = 1; # endif # ifdef SCREEN_8514 } else if (strncmpi(sopt,"8514",4) == 0) { /* 8514/A */ iflags.use8514 = 1; iflags.has8514 = 1; # endif } else if (strncmpi(sopt,"auto",4) == 0) { /* autodetect */ # ifdef SCREEN_VESA if (vesa_detect()) { iflags.hasvesa = 1; } # endif # ifdef SCREEN_8514 if (v8514_detect()) { iflags.has8514 = 1; } # endif # ifdef SCREEN_VGA if (vga_detect()) { iflags.hasvga = 1; } # endif # ifdef ALLEG_FX if (alleg_detect()) { iflags.hasalleg = 1; } # endif /* * Auto-detect Priorities (arbitrary for now): * Allegro, VGA */ if (iflags.hasalleg) { iflags.usealleg = 1; /* VGA depends on BIOS to enable function keys*/ iflags.BIOS = 1; iflags.rawio = 1; } else if (iflags.hasvga) { iflags.usevga = 1; /* VGA depends on BIOS to enable function keys*/ iflags.BIOS = 1; iflags.rawio = 1; } } else { return 0; } return 1; } # endif /* OVL1 */ # ifdef OVL0 void tileview(enable) boolean enable; { if (iflags.grmode) #ifdef SCREEN_VGA if (iflags.usevga) vga_traditional(enable ? FALSE : TRUE); #endif #ifdef ALLEG_FX if (iflags.usealleg) alleg_traditional(enable ? FALSE : TRUE); #endif } # endif /* OVL0 */ #endif /* NO_TERMS */ #else /* STUBVIDEO */ void tileview(enable) boolean enable; { } #endif /* STUBVIDEO */ slashem-0.0.7E7F3/sys/winnt/0000775000076400007640000000000010545462317013631 5ustar alialislashem-0.0.7E7F3/sys/winnt/mapimail.c0000664000076400007640000003122210545462317015566 0ustar aliali/* SCCS Id: @(#)mapimail.c 3.4 $Date: 2003/03/12 11:15:16 $ */ /* Copyright (c) Michael Allison, 1997 */ /* NetHack may be freely redistributed. See license for details. */ #ifdef MAX_BODY_SIZE #undef MAX_BODY_SIZE #define MAX_BODY_SIZE 2048 /* largest body held in ram in bytes */ #endif #include "hack.h" # ifdef LAN_MAIL #include "win32api.h" #include #define MAPI_MSGID_SIZE 512 /* as recommended */ #define MAPI_LIB_FAIL 1 #define MAPI_FUNC_FAIL 2 HANDLE hLibrary; /* Handle for MAPI32.DLL */ LHANDLE MAPISession; /* Handle for MAPI session */ char MAPIMessageID[MAPI_MSGID_SIZE]; /* Msg ID from provider */ lpMapiMessage MAPIMessage; /* Ptr to message from prov */ struct lan_mail_struct received_msg; /* store received msg here */ #ifdef MAPI_VERBOSE FILE *dbgfile; #define MAPIDEBUGFILENAME "mapidebug.log" #endif /* * Prototypes for functions in this file * (Not in normal NetHack style, but its doubtful that any * of the code in here is at all portable between platforms) */ static long __stdcall start_mailthread(LPVOID ThreadParam); static boolean MAPI_mail_check(char *); static boolean MAPI_mail_fetch(char *); static void MAPI_mail_finish(void); static int MAPI_mail_context(int *); static boolean MAPI_mail_init(char *); static int InitMAPI(void); static int DeInitMAPI(void); static void MAPI_mail_abort(unsigned long); /* * Declare the function pointers used to access MAPI routines * from the MAPI32.DLL */ LPMAPILOGON fpMAPILogon; LPMAPILOGOFF fpMAPILogoff; LPMAPIFINDNEXT fpMAPIFindNext; LPMAPIREADMAIL fpMAPIReadMail; LPMAPIFREEBUFFER fpMAPIFreeBuffer; /* * Data requiring synchronized access between the * two thread contexts contained in this file * (nethack thread and the MAPI-mail thread) */ HANDLE mailthread = 0; /* handle for the mail-thread */ unsigned nhmailthread_ID; /* thread ID for mail-thread */ unsigned long nhmail_param; /* value passed to mail-thread */ long mailthread_continue = 0; /* nh -> mapi thread: shut down! */ long mailthread_stopping = 0; /* mapi -> nh thread: MAPI is ill! */ /* * Data updated by the NetHack thread only * but read by the MAPI-mail thread. * */ char MAPI_username[120]; boolean debugmapi; /* * Data updated by the MAPI-mail thread only * but read by the NetHack thread. */ long mail_fetched = 0; /* * Data used only by the MAPI-mail thread. */ long mailpasses; /* counts the FindNext calls issued to MAPI */ char msgID[80]; /* message ID of msg under manipulation */ /*=============================================================== * NetHack thread routines * * These routines run in the context of the main NetHack thread. * They are used to provide an interface between the NetHack * LAN_MAIL code and the MAPI-thread code. * * These routines are referenced by shared code in * sys/share/nhlan.c and they are prototyped in include/extern.h *=============================================================== */ boolean mail_check() { if (!mailthread_stopping) { if (mail_fetched > 0) return TRUE; } else lan_mail_terminate(); return FALSE; } boolean mail_fetch(msg) struct lan_mail_struct *msg; { /* shouldn't need to check mailthread_stopping here as the data should be valid anyway */ *msg = received_msg; iflags.lan_mail_fetched = TRUE; /* clear the marker now so new messages can arrive */ InterlockedDecrement(&mail_fetched); /* check to see if the MAPI-mail thread is saying "stop" */ if (mailthread_stopping) lan_mail_terminate(); return TRUE; } void mail_finish() { InterlockedDecrement(&mailthread_continue); } void mail_init(uname) char *uname; { /* This routine invokes the _beginthreadex() * run-time library call to start the execution * of the MAPI-mail thread. It also performs * few other preparatory tasks. */ if (mailthread_continue) { /* Impossible - something is really messed up */ /* We better do some sanity checking */ /* Is there a valid thread handle and ID? */ if (mailthread && nhmailthread_ID) { /* TODO: check 'em via WIN32 call */ /* if valid, do something about them */ /* if not, clear them */ } } mailthread = 0; nhmailthread_ID = 0; mailthread_continue = 0; /* no interlock needed yet */ mailthread_stopping = 0; /* no interlock needed yet */ #ifdef MAPI_VERBOSE if (getenv("DEBUG_MAPI")) debugmapi = TRUE; #endif if (uname) strcpy(MAPI_username, uname); else { #ifdef MAPI_VERBOSE if (debugmapi) dbgfile = fopen(MAPIDEBUGFILENAME,"w"); if (dbgfile) { fprintf(dbgfile, "mapi initialization bypassed because uname not available\n"); fclose(dbgfile); } #endif return; } mailthread = (HANDLE)_beginthreadex( (void *)0, (unsigned)0, start_mailthread, (void *)&nhmail_param, (unsigned)0, (unsigned *)&nhmailthread_ID); #if 0 /* TODO: check for failure of the thread. For now nethack * doesn't care */ if (!mailthread) { } #endif } /*=============================================================== * MAPI-mail thread routines * * These routines run in the context of their own * MAPI-mail thread. They were placed into their own * thread, because MAPI calls can sometimes (often?) take * a horribly long time to return (minutes even). * * Each of the routines below are referenced only by other * routines below, with the exception of start_mailthread(), * of course, which is started by a run-time library call * issued from the main NetHack thread. *=============================================================== */ /* * start_mailthread() is the entry point of the MAPI-mail thread. * */ static long __stdcall start_mailthread(LPVOID ThreadParam) { char *lu = MAPI_username; if(MAPI_mail_init(lu)) { InterlockedIncrement(&mailthread_continue); while (mailthread_continue) { mailpasses++; if (MAPI_mail_check(msgID)) { if (MAPI_mail_fetch(msgID)) { /* getting here means success */ } } Sleep(MAILTHREADFREQ); } #ifdef MAPI_VERBOSE if (debugmapi && !mailthread_continue) { fprintf(dbgfile, "MAPI-thread detected mailthread_continue change.\n"); fprintf(dbgfile, "NetHack has requested that the MAPI-thread cease.\n"); } #endif } return 0; } static int MAPI_mail_context(mcount) int *mcount; { unsigned long status; char tmpID[80]; int count = 0; tmpID[0] = '\0'; MAPIMessageID[0] = '\0'; /* Get the ID of the first unread message */ status = fpMAPIFindNext(MAPISession, 0, 0, 0, MAPI_UNREAD_ONLY | MAPI_GUARANTEE_FIFO, 0, tmpID); /* Now loop through them all until we have no more */ while (status == SUCCESS_SUCCESS) { strcpy(MAPIMessageID, tmpID); count++; status = fpMAPIFindNext(MAPISession, 0, 0, MAPIMessageID, MAPI_UNREAD_ONLY | MAPI_GUARANTEE_FIFO, 0, tmpID); } if (status == MAPI_E_NO_MESSAGES) { /* context is now at last message */ if (mcount) *mcount = count; return SUCCESS_SUCCESS; } return status; } static boolean MAPI_mail_check(mID) char *mID; { unsigned long status; char tmpID[80]; tmpID[0] = '\0'; #ifdef MAPI_VERBOSE if (debugmapi) fprintf(dbgfile, "MAPI_mail_check() "); #endif if (mail_fetched) { #ifdef MAPI_VERBOSE if (debugmapi) fprintf(dbgfile, "returning FALSE (buffer occupied)\n"); #endif return FALSE; /* buffer occupied, don't bother */ } /* Get the ID of the next unread message if there is one */ status = fpMAPIFindNext(MAPISession, 0, 0, MAPIMessageID, MAPI_UNREAD_ONLY | MAPI_GUARANTEE_FIFO, 0, tmpID); if (status == SUCCESS_SUCCESS) { strcpy(mID, tmpID); #ifdef MAPI_VERBOSE if (debugmapi) fprintf(dbgfile, "returning TRUE\n"); #endif return TRUE; } if (status == MAPI_E_NO_MESSAGES) { #ifdef MAPI_VERBOSE if (debugmapi) fprintf(dbgfile, "returning FALSE\n"); #endif return FALSE; } #ifdef MAPI_VERBOSE if (debugmapi) fprintf(dbgfile,"Error, check_newmail() status: %d\n", status); MAPI_mail_abort(status); #endif return FALSE; } static boolean MAPI_mail_fetch(mID) char *mID; { unsigned long status; #ifdef MAPI_VERBOSE if (debugmapi) fprintf(dbgfile, "MAPI_mail_fetch() "); #endif /* * Update context right away so we don't loop if there * was a problem getting the message */ strcpy(MAPIMessageID, mID); if (mail_fetched) { #ifdef MAPI_VERBOSE if (debugmapi) fprintf(dbgfile, "returning FALSE (buffer occupied)\n"); #endif return FALSE; /* buffer occupied */ } status = fpMAPIReadMail(MAPISession, 0, mID, MAPI_SUPPRESS_ATTACH | MAPI_PEEK, 0, &MAPIMessage); if (status == SUCCESS_SUCCESS) { strncpy(received_msg.subject, MAPIMessage->lpszSubject, sizeof(received_msg.subject) - 1); if((MAPIMessage->lpOriginator->lpszName != (char *)0) && MAPIMessage->lpOriginator->lpszName[0] != '\0') strncpy(received_msg.sender, MAPIMessage->lpOriginator->lpszName, sizeof(received_msg.sender) - 1); else strncpy(received_msg.sender, MAPIMessage->lpOriginator->lpszAddress, sizeof(received_msg.sender) - 1); strncpy(received_msg.body, MAPIMessage->lpszNoteText,MAX_BODY_SIZE - 1); received_msg.body[MAX_BODY_SIZE - 1] = '\0'; received_msg.body_in_ram = TRUE; status = fpMAPIFreeBuffer(MAPIMessage); InterlockedIncrement(&mail_fetched); #ifdef MAPI_VERBOSE if (debugmapi) fprintf(dbgfile, "returning TRUE\n"); #endif return TRUE; } #ifdef MAPI_VERBOSE else if (debugmapi) fprintf(dbgfile,"MAPIRead failed, status = %d\n", status); if (debugmapi) fprintf(dbgfile, "returning FALSE (failed)\n"); #endif return FALSE; } static void MAPI_mail_finish() { InterlockedIncrement(&mailthread_stopping); (void) fpMAPILogoff(MAPISession,0,0,0); (void) DeInitMAPI(); #ifdef MAPI_VERBOSE if (debugmapi) fclose(dbgfile); #endif (void) _endthreadex(0); } static void MAPI_mail_abort(reason) unsigned long reason; { #ifdef MAPI_VERBOSE if (debugmapi) fprintf(dbgfile, "Terminating MAPI-thread due to error %d.\n", reason); #endif MAPI_mail_finish(); } static boolean MAPI_mail_init(uname) char *uname; { unsigned long status; int count = 0; #ifdef MAPI_VERBOSE if (debugmapi) dbgfile = fopen(MAPIDEBUGFILENAME,"w"); if (debugmapi) fprintf(dbgfile,"Hello %s, NetHack is initializing MAPI.\n", uname); #endif status = InitMAPI(); if (status) { #ifdef MAPI_VERBOSE if (debugmapi) fprintf(dbgfile,"Error initializing MAPI %d\n", status); #endif return FALSE; } status = fpMAPILogon(0,uname,0L,0L,0L,(LPLHANDLE)&MAPISession); if (status != SUCCESS_SUCCESS) { #ifdef MAPI_VERBOSE if (debugmapi) fprintf(dbgfile,"Status of MAPI logon is %d\n", status); #endif return FALSE; } #ifdef MAPI_VERBOSE if (debugmapi) fprintf(dbgfile, "Stage 1 of MAPI initialization successful.\n"); if (debugmapi) fprintf(dbgfile,"MAPI Session handle: %d\n", MAPISession); #endif status = MAPI_mail_context(&count); if (status == SUCCESS_SUCCESS) { #ifdef MAPI_VERBOSE if (debugmapi) fprintf(dbgfile, "Stage 2 of MAPI initialization successful.\n"); if (debugmapi) fprintf(dbgfile,"Detected %d old unread messages.\n", count); #endif return TRUE; } #ifdef MAPI_VERBOSE if (debugmapi) fprintf(dbgfile, "Error, status of MAPI_mail_context() is %d.\n", status); if (debugmapi) fprintf(dbgfile, "Dismantling MAPI interface and cleaning up.\n"); #endif MAPI_mail_finish(); return FALSE; } int InitMAPI() { if (!(hLibrary = LoadLibrary("MAPI32.DLL"))) return MAPI_LIB_FAIL; if ((fpMAPILogon = (LPMAPILOGON)GetProcAddress(hLibrary,"MAPILogon")) == NULL) return MAPI_FUNC_FAIL; if ((fpMAPILogoff = (LPMAPILOGOFF)GetProcAddress(hLibrary,"MAPILogoff")) == NULL) return MAPI_FUNC_FAIL; if ((fpMAPIFindNext= (LPMAPIFINDNEXT)GetProcAddress(hLibrary,"MAPIFindNext")) == NULL) return MAPI_FUNC_FAIL; if ((fpMAPIReadMail= (LPMAPIREADMAIL)GetProcAddress(hLibrary,"MAPIReadMail")) == NULL) return MAPI_FUNC_FAIL; if ((fpMAPIFindNext= (LPMAPIFINDNEXT)GetProcAddress(hLibrary,"MAPIFindNext")) == NULL) return MAPI_FUNC_FAIL; if ((fpMAPIFreeBuffer= (LPMAPIFREEBUFFER)GetProcAddress(hLibrary,"MAPIFreeBuffer")) == NULL) return MAPI_FUNC_FAIL; #ifdef MAPI_VERBOSE if (debugmapi) { fprintf(dbgfile,"Entry Points:\n"); fprintf(dbgfile,"MAPILogon = %p\n",fpMAPILogon); fprintf(dbgfile,"MAPILogoff = %p\n",fpMAPILogoff); fprintf(dbgfile,"MAPIFindNext = %p\n",fpMAPIFindNext); fprintf(dbgfile,"MAPIFreeBuffer = %p\n",fpMAPIReadMail); fprintf(dbgfile,"MAPIReadMail = %p\n",fpMAPIFreeBuffer); } #endif return 0; } int DeInitMAPI() { fpMAPILogon = NULL; fpMAPILogoff= NULL; fpMAPIFindNext= NULL; fpMAPIReadMail= NULL; fpMAPIFreeBuffer = NULL; FreeLibrary(hLibrary); return 0; } #endif /*LAN_MAIL*/ slashem-0.0.7E7F3/sys/winnt/nh340key.c0000664000076400007640000001775410545462317015360 0ustar aliali/* SCCS Id: @(#)nh340key.c 3.4 $Date: 2003/12/11 09:49:08 $ */ /* Copyright (c) NetHack PC Development Team 2003 */ /* NetHack may be freely redistributed. See license for details. */ /* * This is the NetHack keystroke processing from NetHack 3.4.0. * It can be built as a run-time loadable dll (nh340key.dll), * placed in the same directory as the nethack.exe executable, * and loaded by specifying OPTIONS=altkeyhandler:nh340key * in defaults.nh */ static char where_to_get_source[] = "http://www.nethack.org/"; static char author[] = "The NetHack Development Team"; #include "hack.h" #include "wintty.h" #include "win32api.h" extern HANDLE hConIn; extern INPUT_RECORD ir; char dllname[512]; char *shortdllname; int FDECL(__declspec(dllexport) __stdcall ProcessKeystroke, (HANDLE hConIn, INPUT_RECORD *ir, boolean *valid, BOOLEAN_P numberpad, int portdebug)); int WINAPI DllMain(HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved) { char dlltmpname[512]; char *tmp = dlltmpname, *tmp2; *(tmp + GetModuleFileName(hInstance, tmp, 511)) = '\0'; (void)strcpy(dllname, tmp); tmp2 = strrchr(dllname, '\\'); if (tmp2) { tmp2++; shortdllname = tmp2; } return TRUE; } /* * Keyboard translation tables. * (Adopted from the MSDOS port) */ #define KEYPADLO 0x47 #define KEYPADHI 0x53 #define PADKEYS (KEYPADHI - KEYPADLO + 1) #define iskeypad(x) (KEYPADLO <= (x) && (x) <= KEYPADHI) /* * Keypad keys are translated to the normal values below. * Shifted keypad keys are translated to the * shift values below. */ static const struct pad { uchar normal, shift, cntrl; } keypad[PADKEYS] = { {'y', 'Y', C('y')}, /* 7 */ {'k', 'K', C('k')}, /* 8 */ {'u', 'U', C('u')}, /* 9 */ {'m', C('p'), C('p')}, /* - */ {'h', 'H', C('h')}, /* 4 */ {'g', 'G', 'g'}, /* 5 */ {'l', 'L', C('l')}, /* 6 */ {'+', 'P', C('p')}, /* + */ {'b', 'B', C('b')}, /* 1 */ {'j', 'J', C('j')}, /* 2 */ {'n', 'N', C('n')}, /* 3 */ {'i', 'I', C('i')}, /* Ins */ {'.', ':', ':'} /* Del */ }, numpad[PADKEYS] = { {'7', M('7'), '7'}, /* 7 */ {'8', M('8'), '8'}, /* 8 */ {'9', M('9'), '9'}, /* 9 */ {'m', C('p'), C('p')}, /* - */ {'4', M('4'), '4'}, /* 4 */ {'g', 'G', 'g'}, /* 5 */ {'6', M('6'), '6'}, /* 6 */ {'+', 'P', C('p')}, /* + */ {'1', M('1'), '1'}, /* 1 */ {'2', M('2'), '2'}, /* 2 */ {'3', M('3'), '3'}, /* 3 */ {'i', 'I', C('i')}, /* Ins */ {'.', ':', ':'} /* Del */ }; #define inmap(x,vk) (((x) > 'A' && (x) < 'Z') || (vk) == 0xBF || (x) == '2') int __declspec(dllexport) __stdcall ProcessKeystroke(hConIn, ir, valid, numberpad, portdebug) HANDLE hConIn; INPUT_RECORD *ir; boolean *valid; boolean numberpad; int portdebug; { int metaflags = 0, k = 0; int keycode, vk; unsigned char ch, pre_ch, mk = 0; unsigned short int scan; unsigned long shiftstate; int altseq = 0; const struct pad *kpad; shiftstate = 0L; ch = pre_ch = ir->Event.KeyEvent.uChar.AsciiChar; scan = ir->Event.KeyEvent.wVirtualScanCode; vk = ir->Event.KeyEvent.wVirtualKeyCode; keycode = MapVirtualKey(vk, 2); shiftstate = ir->Event.KeyEvent.dwControlKeyState; if (shiftstate & (LEFT_ALT_PRESSED|RIGHT_ALT_PRESSED)) { if (ch || inmap(keycode,vk)) altseq = 1; else altseq = -1; /* invalid altseq */ } if (ch || (iskeypad(scan)) || (altseq > 0)) *valid = TRUE; /* if (!valid) return 0; */ /* * shiftstate can be checked to see if various special * keys were pressed at the same time as the key. * Currently we are using the ALT & SHIFT & CONTROLS. * * RIGHT_ALT_PRESSED, LEFT_ALT_PRESSED, * RIGHT_CTRL_PRESSED, LEFT_CTRL_PRESSED, * SHIFT_PRESSED,NUMLOCK_ON, SCROLLLOCK_ON, * CAPSLOCK_ON, ENHANCED_KEY * * are all valid bit masks to use on shiftstate. * eg. (shiftstate & LEFT_CTRL_PRESSED) is true if the * left control key was pressed with the keystroke. */ if (iskeypad(scan)) { kpad = numberpad ? numpad : keypad; if (shiftstate & SHIFT_PRESSED) { ch = kpad[scan - KEYPADLO].shift; } else if (shiftstate & (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED)) { ch = kpad[scan - KEYPADLO].cntrl; } else { ch = kpad[scan - KEYPADLO].normal; } } else if (altseq > 0) { /* ALT sequence */ if (vk == 0xBF) ch = M('?'); else ch = M(tolower(keycode)); } if (ch == '\r') ch = '\n'; #ifdef PORT_DEBUG if (portdebug) { char buf[BUFSZ]; Sprintf(buf, "PORTDEBUG (%s): ch=%u, sc=%u, vk=%d, sh=0x%X (ESC to end)", shortdllname, ch, scan, vk, shiftstate); fprintf(stdout, "\n%s", buf); } #endif return ch; } int __declspec(dllexport) __stdcall NHkbhit(hConIn, ir) HANDLE hConIn; INPUT_RECORD *ir; { 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; int altseq = 0, keycode, vk; done = 0; retval = 0; while (!done) { count = 0; PeekConsoleInput(hConIn,ir,1,&count); if (count > 0) { if (ir->EventType == KEY_EVENT && ir->Event.KeyEvent.bKeyDown) { ch = ir->Event.KeyEvent.uChar.AsciiChar; scan = ir->Event.KeyEvent.wVirtualScanCode; shiftstate = ir->Event.KeyEvent.dwControlKeyState; vk = ir->Event.KeyEvent.wVirtualKeyCode; keycode = MapVirtualKey(vk, 2); if (shiftstate & (LEFT_ALT_PRESSED|RIGHT_ALT_PRESSED)) { if (ch || inmap(keycode,vk)) altseq = 1; else altseq = -1; /* invalid altseq */ } if (ch || iskeypad(scan) || altseq) { done = 1; /* Stop looking */ retval = 1; /* Found what we sought */ } else { /* Strange Key event; let's purge it to avoid trouble */ ReadConsoleInput(hConIn,ir,1,&count); } } else if ((ir->EventType == MOUSE_EVENT && (ir->Event.MouseEvent.dwButtonState & MOUSEMASK))) { done = 1; retval = 1; } else /* Discard it, it's an insignificant event */ ReadConsoleInput(hConIn,ir,1,&count); } else /* There are no events in console event queue */ { done = 1; /* Stop looking */ retval = 0; } } return retval; } int __declspec(dllexport) __stdcall CheckInput(hConIn, ir, count, numpad, mode, mod, cc) HANDLE hConIn; INPUT_RECORD *ir; DWORD *count; boolean numpad; int mode; int *mod; coord *cc; { int ch; boolean valid = 0, done = 0; while (!done) { ReadConsoleInput(hConIn,ir,1,count); if (mode == 0) { if ((ir->EventType == KEY_EVENT) && ir->Event.KeyEvent.bKeyDown) { ch = ProcessKeystroke(hConIn, ir, &valid, numpad, 0); done = valid; } } else { if (count > 0) { if (ir->EventType == KEY_EVENT && ir->Event.KeyEvent.bKeyDown) { ch = ProcessKeystroke(hConIn, ir, &valid, numpad, 0); if (valid) return ch; } else if (ir->EventType == MOUSE_EVENT) { if ((ir->Event.MouseEvent.dwEventFlags == 0) && (ir->Event.MouseEvent.dwButtonState & MOUSEMASK)) { cc->x = ir->Event.MouseEvent.dwMousePosition.X + 1; cc->y = ir->Event.MouseEvent.dwMousePosition.Y - 1; if (ir->Event.MouseEvent.dwButtonState & LEFTBUTTON) *mod = CLICK_1; else if (ir->Event.MouseEvent.dwButtonState & RIGHTBUTTON) *mod = CLICK_2; #if 0 /* middle button */ else if (ir->Event.MouseEvent.dwButtonState & MIDBUTTON) *mod = CLICK_3; #endif return 0; } } } else done = 1; } } return mode ? 0 : ch; } int __declspec(dllexport) __stdcall SourceWhere(buf) char **buf; { if (!buf) return 0; *buf = where_to_get_source; return 1; } int __declspec(dllexport) __stdcall SourceAuthor(buf) char **buf; { if (!buf) return 0; *buf = author; return 1; } int __declspec(dllexport) __stdcall KeyHandlerName(buf, full) char **buf; int full; { if (!buf) return 0; if (full) *buf = dllname; else *buf = shortdllname; return 1; } slashem-0.0.7E7F3/sys/winnt/Makefile.msc0000664000076400007640000013371310545462317016062 0ustar aliali# SCCS Id: @(#)Makefile.msc 3.4 $Date: 2003/12/11 09:49:08 $ # Copyright (c) NetHack PC Development Team 1993-2003 # # 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 two versions of NetHack: # A tty port utilizing the Win32 Console I/O subsystem, Console # NetHack; # A Win32 native port built on the Windows API, Graphical NetHack or # NetHackW. # # In addition to your C compiler, # # if you want to change you will need a # files with suffix workalike for # .y yacc (such as bison) # .l lex (such as flex) # # # If you have any questions read the sys/winnt/Install.nt file included # with the distribution. #============================================================================== # 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. !IF "$(GRAPHICAL)" == "Y" GAME = NetHackW # Game Name !ELSE GAME = NetHack # Game Name !ENDIF 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 = # # 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 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 WINDLLS = WINPFLAG= -DTILES -DMSWIN_GRAPHICS NHRES = $(O)winhack.res WINPINC = -I$(WIN32) !ELSE WINPORT = $(O)nttty.o WINPHDR = WINDLLS = $(GAMEDIR)\nhdefkey.dll $(GAMEDIR)\nh340key.dll $(GAMEDIR)\nhraykey.dll WINPFLAG= -DWIN32CON 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 # 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) copy $(DAT)\opthelp $(GAMEDIR) ! ELSE copy $(DAT)\*. $(GAMEDIR) copy $(DAT)\*.dat $(GAMEDIR) copy $(DAT)\*.lev $(GAMEDIR) if exist $(GAMEDIR)\makefile del $(GAMEDIR)\makefile ! ENDIF if exist $(DOC)\guidebook.txt copy $(DOC)\guidebook.txt $(GAMEDIR)\Guidebook.txt if exist $(DOC)\nethack.txt copy $(DOC)\nethack.txt $(GAMEDIR)\NetHack.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 echo install done > $@ # copy $(NTSYS)\winnt.hlp $(GAMEDIR) recover: $(U)recover.exe if exist $(U)recover.exe copy $(U)recover.exe $(GAMEDIR) if exist $(DOC)\recover.txt copy $(DOC)\recover.txt $(GAMEDIR)\recover.txt $(O)sp_lev.tag: $(O)utility.tag $(DAT)\bigroom.des $(DAT)\castle.des \ $(DAT)\endgame.des $(DAT)\gehennom.des $(DAT)\knox.des \ $(DAT)\medusa.des $(DAT)\oracle.des $(DAT)\tower.des \ $(DAT)\yendor.des $(DAT)\arch.des $(DAT)\barb.des \ $(DAT)\caveman.des $(DAT)\healer.des $(DAT)\knight.des \ $(DAT)\monk.des $(DAT)\priest.des $(DAT)\ranger.des \ $(DAT)\rogue.des $(DAT)\samurai.des $(DAT)\sokoban.des \ $(DAT)\tourist.des $(DAT)\valkyrie.des $(DAT)\wizard.des cd $(DAT) $(U)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 @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) $(O)gamedir.tag $(WINDLLS) @if not exist $(GAMEDIR)\*.* mkdir $(GAMEDIR) @echo Linking.... $(link) $(LFLAGS) user32.lib winmm.lib -out:$@ @<<$(GAME).lnk $(ALLOBJ:^ =^ ) $(NHRES) << @if exist $(O)install.tag del $(O)install.tag @if exist $(GAMEDIR)\$(GAME).bak del $(GAMEDIR)\$(GAME).bak $(O)gamedir.tag: @if not exist $(GAMEDIR)\*.* echo creating directory $(GAMEDIR) @if not exist $(GAMEDIR)\*.* mkdir $(GAMEDIR) @echo directory created > $@ $(O)nhdefkey.def: @echo EXPORTS >$@ @echo ProcessKeystroke >>$@ @echo NHkbhit >>$@ @echo CheckInput >>$@ @echo SourceWhere >>$@ @echo SourceAuthor >>$@ @echo KeyHandlerName >>$@ $(GAMEDIR)\nhdefkey.dll : $(O)$(@B).o $(O)gamedir.tag $(O)$(@B).def @echo Linking $@ @$(link) -debug:full -debugtype:cv /RELEASE /NOLOGO /DLL user32.lib \ /PDB:"$(@B).PDB" /MAP:"$(@B).map" /DEF:$(O)$(@B).def \ /IMPLIB:$(O)$(@B).lib -out:$@ $(O)$(@B).o $(O)nh340key.def: @echo EXPORTS >$@ @echo ProcessKeystroke >>$@ @echo NHkbhit >>$@ @echo CheckInput >>$@ @echo SourceWhere >>$@ @echo SourceAuthor >>$@ @echo KeyHandlerName >>$@ $(GAMEDIR)\nh340key.dll : $(O)$(@B).o $(O)gamedir.tag $(O)$(@B).def @echo Linking $@ @$(link) -debug:full -debugtype:cv /RELEASE /NOLOGO /DLL user32.lib \ /PDB:"$(@B).PDB" /MAP:"$(@B).map" /DEF:$(O)$(@B).def \ /IMPLIB:$(O)$(@B).lib -out:$@ $(O)$(@B).o $(O)nhraykey.def: @echo EXPORTS >$@ @echo ProcessKeystroke >>$@ @echo NHkbhit >>$@ @echo CheckInput >>$@ @echo SourceWhere >>$@ @echo SourceAuthor >>$@ @echo KeyHandlerName >>$@ $(GAMEDIR)\nhraykey.dll : $(O)$(@B).o $(O)gamedir.tag $(O)$(@B).def @echo Linking $@ @$(link) -debug:full -debugtype:cv /RELEASE /NOLOGO /DLL user32.lib \ /PDB:"$(@B).PDB" /MAP:"$(@B).map" /DEF:$(O)$(@B).def \ /IMPLIB:$(O)$(@B).lib -out:$@ $(O)$(@B).o # # 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. if exist $(O)obj.tag del $(O)obj.tag if exist $(O)gamedir.tag del $(O)gamedir.tag if exist $(O)nh*key.lib del $(O)nh*key.lib if exist $(O)nh*key.exp del $(O)nh*key.exp 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 $(O)install.tag del $(O)install.tag ! 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)nhkeys.o: $(HACK_H) $(TILE_H) $(INCL)\win32api.h $(NTSYS)\nhkeys.c @$(CC) $(CFLAGS) -I$(WSHR) -Fo$@ $(NTSYS)\nhkeys.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 the following changes: # * ../include changed to $(INCL) # * slashes changed to back-slashes # * -c (which is included in CFLAGS) substituted with -Fo$@ # * targets prefixed with $(O) # but otherwise untouched. # That means that there is some irrelevant stuff # in here, but maintenance should be easier. # $(O)tos.o: ..\sys\atari\tos.c $(HACK_H) $(INCL)\tcap.h @$(CC) $(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)unixres.o: ..\sys\unix\unixres.c $(CONFIG_H) @$(CC) $(CFLAGS) -Fo$@ ..\sys\unix\unixres.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) -Fo$@ ..\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) -Fo$@ ..\win\gnome\gnbind.c $(O)gnglyph.o: ..\win\gnome\gnglyph.c ..\win\gnome\gnglyph.h $(INCL)\tile2x11.h @$(CC) $(CFLAGS) $(GNOMEINC) -Fo$@ ..\win\gnome\gnglyph.c $(O)gnmain.o: ..\win\gnome\gnmain.c ..\win\gnome\gnmain.h ..\win\gnome\gnsignal.h \ ..\win\gnome\gnbind.h ..\win\gnome\gnopts.h $(HACK_H) \ $(INCL)\date.h @$(CC) $(CFLAGS) $(GNOMEINC) -Fo$@ ..\win\gnome\gnmain.c $(O)gnmap.o: ..\win\gnome\gnmap.c ..\win\gnome\gnmap.h ..\win\gnome\gnglyph.h \ ..\win\gnome\gnsignal.h $(HACK_H) @$(CC) $(CFLAGS) $(GNOMEINC) -Fo$@ ..\win\gnome\gnmap.c $(O)gnmenu.o: ..\win\gnome\gnmenu.c ..\win\gnome\gnmenu.h ..\win\gnome\gnmain.h \ ..\win\gnome\gnbind.h @$(CC) $(CFLAGS) $(GNOMEINC) -Fo$@ ..\win\gnome\gnmenu.c $(O)gnmesg.o: ..\win\gnome\gnmesg.c ..\win\gnome\gnmesg.h ..\win\gnome\gnsignal.h @$(CC) $(CFLAGS) $(GNOMEINC) -Fo$@ ..\win\gnome\gnmesg.c $(O)gnopts.o: ..\win\gnome\gnopts.c ..\win\gnome\gnopts.h ..\win\gnome\gnglyph.h \ ..\win\gnome\gnmain.h ..\win\gnome\gnmap.h $(HACK_H) @$(CC) $(CFLAGS) $(GNOMEINC) -Fo$@ ..\win\gnome\gnopts.c $(O)gnplayer.o: ..\win\gnome\gnplayer.c ..\win\gnome\gnplayer.h \ ..\win\gnome\gnmain.h $(HACK_H) @$(CC) $(CFLAGS) $(GNOMEINC) -Fo$@ ..\win\gnome\gnplayer.c $(O)gnsignal.o: ..\win\gnome\gnsignal.c ..\win\gnome\gnsignal.h \ ..\win\gnome\gnmain.h @$(CC) $(CFLAGS) $(GNOMEINC) -Fo$@ ..\win\gnome\gnsignal.c $(O)gnstatus.o: ..\win\gnome\gnstatus.c ..\win\gnome\gnstatus.h \ ..\win\gnome\gnsignal.h ..\win\gnome\gn_xpms.h \ ..\win\gnome\gnomeprv.h @$(CC) $(CFLAGS) $(GNOMEINC) -Fo$@ ..\win\gnome\gnstatus.c $(O)gntext.o: ..\win\gnome\gntext.c ..\win\gnome\gntext.h ..\win\gnome\gnmain.h \ ..\win\gnome\gn_rip.h @$(CC) $(CFLAGS) $(GNOMEINC) -Fo$@ ..\win\gnome\gntext.c $(O)gnworn.o: ..\win\gnome\gnworn.c ..\win\gnome\gnworn.h ..\win\gnome\gnglyph.h \ ..\win\gnome\gnsignal.h ..\win\gnome\gnomeprv.h @$(CC) $(CFLAGS) $(GNOMEINC) -Fo$@ ..\win\gnome\gnworn.c $(O)gnyesno.o: ..\win\gnome\gnyesno.c ..\win\gnome\gnbind.h ..\win\gnome\gnyesno.h @$(CC) $(CFLAGS) $(GNOMEINC) -Fo$@ ..\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)\gr_rect.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)gr_rect.o: ..\win\gem\gr_rect.c $(INCL)\gr_rect.h @$(CC) $(CFLAGS) -Fo$@ ..\win\gem\gr_rect.c $(O)tile.o: tile.c $(HACK_H) $(O)qt_win.o: ..\win\Qt\qt_win.cpp $(HACK_H) $(INCL)\func_tab.h \ $(INCL)\dlb.h $(INCL)\patchlevel.h $(INCL)\tile2x11.h \ $(INCL)\qt_win.h $(INCL)\qt_clust.h $(INCL)\qt_kde0.h \ $(INCL)\qt_xpms.h qt_win.moc qt_kde0.moc qttableview.moc $(CXX) $(CXXFLAGS) -Fo$@ ..\win\Qt\qt_win.cpp $(O)qt_clust.o: ..\win\Qt\qt_clust.cpp $(INCL)\qt_clust.h $(CXX) $(CXXFLAGS) -Fo$@ ..\win\Qt\qt_clust.cpp $(O)qttableview.o: ..\win\Qt\qttableview.cpp $(INCL)\qttableview.h $(CXX) $(CXXFLAGS) -Fo$@ ..\win\Qt\qttableview.cpp $(O)monstr.o: monstr.c $(CONFIG_H) $(O)vis_tab.o: vis_tab.c $(CONFIG_H) $(INCL)\vis_tab.h $(O)allmain.o: allmain.c $(HACK_H) $(O)alloc.o: alloc.c $(CONFIG_H) $(O)apply.o: apply.c $(HACK_H) $(INCL)\edog.h $(O)artifact.o: artifact.c $(HACK_H) $(INCL)\artifact.h $(INCL)\artilist.h $(O)attrib.o: attrib.c $(HACK_H) $(O)ball.o: ball.c $(HACK_H) $(O)bones.o: bones.c $(HACK_H) $(INCL)\lev.h $(O)botl.o: botl.c $(HACK_H) $(O)cmd.o: cmd.c $(HACK_H) $(INCL)\func_tab.h $(O)dbridge.o: dbridge.c $(HACK_H) $(O)decl.o: decl.c $(HACK_H) $(O)detect.o: detect.c $(HACK_H) $(INCL)\artifact.h $(O)dig.o: dig.c $(HACK_H) $(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) $(INCL)\edog.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) $(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) $(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 \ $(INCL)\epri.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 $(INCL)\epri.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 slashem-0.0.7E7F3/sys/winnt/nhraykey.c0000664000076400007640000004661710545462317015645 0ustar aliali/* SCCS Id: @(#)nhraykey.c 3.4 $Date: 2003/12/11 09:49:08 $ */ /* Copyright (c) NetHack PC Development Team 2003 */ /* NetHack may be freely redistributed. See license for details. */ /* * Keystroke handling contributed by Ray Chason. * The following text was written by Ray Chason. * * The problem * =========== * * The console-mode Nethack wants both keyboard and mouse input. The * problem is that the Windows API provides no easy way to get mouse input * and also keyboard input properly translated according to the user's * chosen keyboard layout. * * The ReadConsoleInput function returns a stream of keyboard and mouse * events. Nethack is interested in those events that represent a key * pressed, or a click on a mouse button. The keyboard events from * ReadConsoleInput are not translated according to the keyboard layout, * and do not take into account the shift, control, or alt keys. * * The PeekConsoleInput function works similarly to ReadConsoleInput, * except that it does not remove an event from the queue and it returns * instead of blocking when the queue is empty. * * A program can also use ReadConsole to get a properly translated stream * of characters. Unfortunately, ReadConsole does not return mouse events, * does not distinguish the keypad from the main keyboard, does not return * keys shifted with Alt, and does not even return the ESC key when * pressed. * * We want both the functionality of ReadConsole and the functionality of * ReadConsoleInput. But Microsoft didn't seem to think of that. * * * The solution, in the original code * ================================== * * The original 3.4.1 distribution tries to get proper keyboard translation * by passing keyboard events to the ToAscii function. This works, to some * extent -- it takes the shift key into account, and it processes dead * keys properly. But it doesn't take non-US keyboards into account. It * appears that ToAscii is meant for windowed applications, and does not * have enough information to do its job properly in a console application. * * * The Finnish keyboard patch * ========================== * * This patch adds the "subkeyvalue" option to the defaults.nh file. The * user can then add OPTIONS=sukeyvalue:171/92, for instance, to replace * the 171 character with 92, which is \. This works, once properly * configured, but places too much burden on the user. It also bars the * use of the substituted characters in naming objects or monsters. * * * The solution presented here * =========================== * * The best way I could find to combine the functionality of ReadConsole * with that of ReadConsoleInput is simple in concept. First, call * PeekConsoleInput to get the first event. If it represents a key press, * call ReadConsole to retrieve the key. Otherwise, pop it off the queue * with ReadConsoleInput and, if it's a mouse click, return it as such. * * But the Devil, as they say, is in the details. The problem is in * recognizing an event that ReadConsole will return as a key. We don't * want to call ReadConsole unless we know that it will immediately return: * if it blocks, the mouse and the Alt sequences will cease to function * until it returns. * * Separating process_keystroke into two functions, one for commands and a * new one, process_keystroke2, for answering prompts, makes the job a lot * easier. process_keystroke2 doesn't have to worry about mouse events or * Alt sequences, and so the consequences are minor if ReadConsole blocks. * process_keystroke, OTOH, never needs to return a non-ASCII character * that was read from ReadConsole; it returns bytes with the high bit set * only in response to an Alt sequence. * * So in process_keystroke, before calling ReadConsole, a bogus key event * is pushed on the queue. This event causes ReadConsole to return, even * if there was no other character available. Because the bogus key has * the eighth bit set, it is filtered out. This is not done in * process_keystroke2, because that would render dead keys unusable. * * A separate process_keystroke2 can also process the numeric keypad in a * way that makes sense for prompts: just return the corresponding symbol, * and pay no mind to number_pad or the num lock key. * * The recognition of Alt sequences is modified, to support the use of * characters generated with the AltGr key. A keystroke is an Alt sequence * if an Alt key is seen that can't be an AltGr (since an AltGr sequence * could be a character, and in some layouts it could even be an ASCII * character). This recognition is different on NT-based and 95-based * Windows: * * * On NT-based Windows, AltGr signals as right Alt and left Ctrl * together. So an Alt sequence is recognized if either Alt key is * pressed and if right Alt and left Ctrl are not both present. This * is true even if the keyboard in use does not have an AltGr key, and * uses right Alt for AltGr. * * * On 95-based Windows, with a keyboard that lacks the AltGr key, the * right Alt key is used instead. But it still signals as right Alt, * without left Ctrl. There is no way for the application to know * whether right Alt is Alt or AltGr, and so it is always assumed * to be AltGr. This means that Alt sequences must be formed with * left Alt. * * So the patch processes keystrokes as follows: * * * If the scan and virtual key codes are both 0, it's the bogus key, * and we ignore it. * * * Keys on the numeric keypad are processed for commands as in the * unpatched Nethack, and for prompts by returning the ASCII * character, even if the num lock is off. * * * Alt sequences are processed for commands as in the unpatched * Nethack, and ignored for prompts. * * * Control codes are returned as received, because ReadConsole will * not return the ESC key. * * * Other key-down events are passed to ReadConsole. The use of * ReadConsole is different for commands than for prompts: * * o For commands, the bogus key is pushed onto the queue before * ReadConsole is called. On return, non-ASCII characters are * filtered, so they are not mistaken for Alt sequences; this also * filters the bogus key. * * o For prompts, the bogus key is not used, because that would * interfere with dead keys. Eight bit characters may be returned, * and are coded in the configured code page. * * * Possible improvements * ===================== * * Some possible improvements remain: * * * Integrate the existing Finnish keyboard patch, for use with non- * QWERTY layouts such as the German QWERTZ keyboard or Dvorak. * * * Fix the keyboard glitches in the graphical version. Namely, dead * keys don't work, and input comes in as ISO-8859-1 but is displayed * as code page 437 if IBMgraphics is set on startup. * * * Transform incoming text to ISO-8859-1, for full compatibility with * the graphical version. * * * After pushing the bogus key and calling ReadConsole, check to see * if we got the bogus key; if so, and an Alt is pressed, process the * event as an Alt sequence. * */ static char where_to_get_source[] = "http://www.nethack.org/"; static char author[] = "Ray Chason"; #include "hack.h" #include "wintty.h" #include "win32api.h" extern HANDLE hConIn; extern INPUT_RECORD ir; char dllname[512]; char *shortdllname; int FDECL(__declspec(dllexport) __stdcall ProcessKeystroke, (HANDLE hConIn, INPUT_RECORD *ir, boolean *valid, BOOLEAN_P numberpad, int portdebug)); static INPUT_RECORD bogus_key; int WINAPI DllMain(HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved) { char dlltmpname[512]; char *tmp = dlltmpname, *tmp2; *(tmp + GetModuleFileName(hInstance, tmp, 511)) = '\0'; (void)strcpy(dllname, tmp); tmp2 = strrchr(dllname, '\\'); if (tmp2) { tmp2++; shortdllname = tmp2; } /* A bogus key that will be filtered when received, to keep ReadConsole * from blocking */ bogus_key.EventType = KEY_EVENT; bogus_key.Event.KeyEvent.bKeyDown = 1; bogus_key.Event.KeyEvent.wRepeatCount = 1; bogus_key.Event.KeyEvent.wVirtualKeyCode = 0; bogus_key.Event.KeyEvent.wVirtualScanCode = 0; bogus_key.Event.KeyEvent.uChar.AsciiChar = (uchar)0x80; bogus_key.Event.KeyEvent.dwControlKeyState = 0; return TRUE; } /* * Keyboard translation tables. * (Adopted from the MSDOS port) */ #define KEYPADLO 0x47 #define KEYPADHI 0x53 #define PADKEYS (KEYPADHI - KEYPADLO + 1) #define iskeypad(x) (KEYPADLO <= (x) && (x) <= KEYPADHI) #define isnumkeypad(x) (KEYPADLO <= (x) && (x) <= 0x51 && (x) != 0x4A && (x) != 0x4E) /* * Keypad keys are translated to the normal values below. * Shifted keypad keys are translated to the * shift values below. */ static const struct pad { uchar normal, shift, cntrl; } keypad[PADKEYS] = { {'y', 'Y', C('y')}, /* 7 */ {'k', 'K', C('k')}, /* 8 */ {'u', 'U', C('u')}, /* 9 */ {'m', C('p'), C('p')}, /* - */ {'h', 'H', C('h')}, /* 4 */ {'g', 'G', 'g'}, /* 5 */ {'l', 'L', C('l')}, /* 6 */ {'+', 'P', C('p')}, /* + */ {'b', 'B', C('b')}, /* 1 */ {'j', 'J', C('j')}, /* 2 */ {'n', 'N', C('n')}, /* 3 */ {'i', 'I', C('i')}, /* Ins */ {'.', ':', ':'} /* Del */ }, numpad[PADKEYS] = { {'7', M('7'), '7'}, /* 7 */ {'8', M('8'), '8'}, /* 8 */ {'9', M('9'), '9'}, /* 9 */ {'m', C('p'), C('p')}, /* - */ {'4', M('4'), '4'}, /* 4 */ {'g', 'G', 'g'}, /* 5 */ {'6', M('6'), '6'}, /* 6 */ {'+', 'P', C('p')}, /* + */ {'1', M('1'), '1'}, /* 1 */ {'2', M('2'), '2'}, /* 2 */ {'3', M('3'), '3'}, /* 3 */ {'i', 'I', C('i')}, /* Ins */ {'.', ':', ':'} /* Del */ }; #define inmap(x,vk) (((x) > 'A' && (x) < 'Z') || (vk) == 0xBF || (x) == '2') /* Use process_keystroke for key commands, process_keystroke2 for prompts */ /* int FDECL(process_keystroke, (INPUT_RECORD *ir, boolean *valid, int portdebug)); */ int FDECL(process_keystroke2, (HANDLE,INPUT_RECORD *ir, boolean *valid)); static int FDECL(is_altseq, (unsigned long shiftstate)); static int is_altseq(shiftstate) unsigned long shiftstate; { /* We need to distinguish the Alt keys from the AltGr key. * On NT-based Windows, AltGr signals as right Alt and left Ctrl together; * on 95-based Windows, AltGr signals as right Alt only. * So on NT, we signal Alt if either Alt is pressed and left Ctrl is not, * and on 95, we signal Alt for left Alt only. */ switch (shiftstate & (RIGHT_ALT_PRESSED | LEFT_ALT_PRESSED | LEFT_CTRL_PRESSED)) { case LEFT_ALT_PRESSED: case LEFT_ALT_PRESSED | LEFT_CTRL_PRESSED: return 1; case RIGHT_ALT_PRESSED: case RIGHT_ALT_PRESSED | LEFT_ALT_PRESSED: return (GetVersion() & 0x80000000) == 0; default: return 0; } } int __declspec(dllexport) __stdcall ProcessKeystroke(hConIn, ir, valid, numberpad, portdebug) HANDLE hConIn; INPUT_RECORD *ir; boolean *valid; boolean numberpad; int portdebug; { int metaflags = 0, k = 0; int keycode, vk; unsigned char ch, pre_ch, mk = 0; unsigned short int scan; unsigned long shiftstate; int altseq = 0; const struct pad *kpad; DWORD count; shiftstate = 0L; ch = pre_ch = ir->Event.KeyEvent.uChar.AsciiChar; scan = ir->Event.KeyEvent.wVirtualScanCode; vk = ir->Event.KeyEvent.wVirtualKeyCode; keycode = MapVirtualKey(vk, 2); shiftstate = ir->Event.KeyEvent.dwControlKeyState; if (scan == 0 && vk == 0) { /* It's the bogus_key */ ReadConsoleInput(hConIn,ir,1,&count); *valid = FALSE; return 0; } if (is_altseq(shiftstate)) { if (ch || inmap(keycode,vk)) altseq = 1; else altseq = -1; /* invalid altseq */ } if (ch || (iskeypad(scan)) || (altseq > 0)) *valid = TRUE; /* if (!valid) return 0; */ /* * shiftstate can be checked to see if various special * keys were pressed at the same time as the key. * Currently we are using the ALT & SHIFT & CONTROLS. * * RIGHT_ALT_PRESSED, LEFT_ALT_PRESSED, * RIGHT_CTRL_PRESSED, LEFT_CTRL_PRESSED, * SHIFT_PRESSED,NUMLOCK_ON, SCROLLLOCK_ON, * CAPSLOCK_ON, ENHANCED_KEY * * are all valid bit masks to use on shiftstate. * eg. (shiftstate & LEFT_CTRL_PRESSED) is true if the * left control key was pressed with the keystroke. */ if (iskeypad(scan)) { ReadConsoleInput(hConIn,ir,1,&count); kpad = numberpad ? numpad : keypad; if (shiftstate & SHIFT_PRESSED) { ch = kpad[scan - KEYPADLO].shift; } else if (shiftstate & (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED)) { ch = kpad[scan - KEYPADLO].cntrl; } else { ch = kpad[scan - KEYPADLO].normal; } } else if (altseq > 0) { /* ALT sequence */ ReadConsoleInput(hConIn,ir,1,&count); if (vk == 0xBF) ch = M('?'); else ch = M(tolower(keycode)); } else if (ch < 32 && !isnumkeypad(scan)) { /* Control code; ReadConsole seems to filter some of these, * including ESC */ ReadConsoleInput(hConIn,ir,1,&count); } /* Attempt to work better with international keyboards. */ else { CHAR ch2; DWORD written; /* The bogus_key guarantees that ReadConsole will return, * and does not itself do anything */ WriteConsoleInput(hConIn, &bogus_key, 1, &written); ReadConsole(hConIn,&ch2,1,&count,NULL); /* Prevent high characters from being interpreted as alt * sequences; also filter the bogus_key */ if (ch2 & 0x80) *valid = FALSE; else ch = ch2; if (ch == 0) *valid = FALSE; } if (ch == '\r') ch = '\n'; #ifdef PORT_DEBUG if (portdebug) { char buf[BUFSZ]; Sprintf(buf, "PORTDEBUG: ch=%u, scan=%u, vk=%d, pre=%d, shiftstate=0x%X (ESC to end)\n", ch, scan, vk, pre_ch, shiftstate); fprintf(stdout, "\n%s", buf); } #endif return ch; } int process_keystroke2(hConIn, ir, valid) HANDLE hConIn; INPUT_RECORD *ir; boolean *valid; { /* Use these values for the numeric keypad */ static const char keypad_nums[] = "789-456+1230."; unsigned char ch; int vk; unsigned short int scan; unsigned long shiftstate; int altseq; DWORD count; ch = ir->Event.KeyEvent.uChar.AsciiChar; vk = ir->Event.KeyEvent.wVirtualKeyCode; scan = ir->Event.KeyEvent.wVirtualScanCode; shiftstate = ir->Event.KeyEvent.dwControlKeyState; if (scan == 0 && vk == 0) { /* It's the bogus_key */ ReadConsoleInput(hConIn,ir,1,&count); *valid = FALSE; return 0; } altseq = is_altseq(shiftstate); if (ch || (iskeypad(scan)) || altseq) *valid = TRUE; /* if (!valid) return 0; */ /* * shiftstate can be checked to see if various special * keys were pressed at the same time as the key. * Currently we are using the ALT & SHIFT & CONTROLS. * * RIGHT_ALT_PRESSED, LEFT_ALT_PRESSED, * RIGHT_CTRL_PRESSED, LEFT_CTRL_PRESSED, * SHIFT_PRESSED,NUMLOCK_ON, SCROLLLOCK_ON, * CAPSLOCK_ON, ENHANCED_KEY * * are all valid bit masks to use on shiftstate. * eg. (shiftstate & LEFT_CTRL_PRESSED) is true if the * left control key was pressed with the keystroke. */ if (iskeypad(scan) && !altseq) { ReadConsoleInput(hConIn,ir,1,&count); ch = keypad_nums[scan - KEYPADLO]; } else if (ch < 32 && !isnumkeypad(scan)) { /* Control code; ReadConsole seems to filter some of these, * including ESC */ ReadConsoleInput(hConIn,ir,1,&count); } /* Attempt to work better with international keyboards. */ else { CHAR ch2; ReadConsole(hConIn,&ch2,1,&count,NULL); ch = ch2 & 0xFF; if (ch == 0) *valid = FALSE; } if (ch == '\r') ch = '\n'; return ch; } int __declspec(dllexport) __stdcall CheckInput(hConIn, ir, count, numpad, mode, mod, cc) HANDLE hConIn; INPUT_RECORD *ir; DWORD *count; int *mod; boolean numpad; coord *cc; { int ch; boolean valid = 0, done = 0; while (!done) { *count = 0; WaitForSingleObject(hConIn, INFINITE); PeekConsoleInput(hConIn,ir,1,count); if (mode == 0) { if ((ir->EventType == KEY_EVENT) && ir->Event.KeyEvent.bKeyDown) { ch = process_keystroke2(hConIn, ir, &valid); done = valid; } else ReadConsoleInput(hConIn,ir,1,count); } else { ch = 0; if (count > 0) { if (ir->EventType == KEY_EVENT && ir->Event.KeyEvent.bKeyDown) { ch = ProcessKeystroke(hConIn, ir, &valid, numpad, #ifdef PORTDEBUG 1); #else 0); #endif if (valid) return ch; } else { ReadConsoleInput(hConIn,ir,1,count); if (ir->EventType == MOUSE_EVENT) { if ((ir->Event.MouseEvent.dwEventFlags == 0) && (ir->Event.MouseEvent.dwButtonState & MOUSEMASK)) { cc->x = ir->Event.MouseEvent.dwMousePosition.X + 1; cc->y = ir->Event.MouseEvent.dwMousePosition.Y - 1; if (ir->Event.MouseEvent.dwButtonState & LEFTBUTTON) *mod = CLICK_1; else if (ir->Event.MouseEvent.dwButtonState & RIGHTBUTTON) *mod = CLICK_2; #if 0 /* middle button */ else if (ir->Event.MouseEvent.dwButtonState & MIDBUTTON) *mod = CLICK_3; #endif return 0; } } #if 0 /* We ignore these types of console events */ else if (ir->EventType == FOCUS_EVENT) { } else if (ir->EventType == MENU_EVENT) { } #endif } } else done = 1; } } *mod = 0; return ch; } int __declspec(dllexport) __stdcall NHkbhit(hConIn, ir) HANDLE hConIn; INPUT_RECORD *ir; { 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; int altseq = 0, keycode, vk; done = 0; retval = 0; while (!done) { count = 0; PeekConsoleInput(hConIn,ir,1,&count); if (count > 0) { if (ir->EventType == KEY_EVENT && ir->Event.KeyEvent.bKeyDown) { ch = ir->Event.KeyEvent.uChar.AsciiChar; scan = ir->Event.KeyEvent.wVirtualScanCode; shiftstate = ir->Event.KeyEvent.dwControlKeyState; vk = ir->Event.KeyEvent.wVirtualKeyCode; keycode = MapVirtualKey(vk, 2); if (is_altseq(shiftstate)) { if (ch || inmap(keycode,vk)) altseq = 1; else altseq = -1; /* invalid altseq */ } if (ch || iskeypad(scan) || altseq) { done = 1; /* Stop looking */ retval = 1; /* Found what we sought */ } else { /* Strange Key event; let's purge it to avoid trouble */ ReadConsoleInput(hConIn,ir,1,&count); } } else if ((ir->EventType == MOUSE_EVENT && (ir->Event.MouseEvent.dwButtonState & MOUSEMASK))) { done = 1; retval = 1; } else /* Discard it, it's an insignificant event */ ReadConsoleInput(hConIn,ir,1,&count); } else /* There are no events in console event queue */ { done = 1; /* Stop looking */ retval = 0; } } return retval; } int __declspec(dllexport) __stdcall SourceWhere(buf) char **buf; { if (!buf) return 0; *buf = where_to_get_source; return 1; } int __declspec(dllexport) __stdcall SourceAuthor(buf) char **buf; { if (!buf) return 0; *buf = author; return 1; } int __declspec(dllexport) __stdcall KeyHandlerName(buf, full) char **buf; int full; { if (!buf) return 0; if (full) *buf = dllname; else *buf = shortdllname; return 1; } slashem-0.0.7E7F3/sys/winnt/Install.gcc0000664000076400007640000001145310545462317015721 0ustar aliali Copyright (c) NetHack Development Team 1990-2002 Copyright (c) Slash'EM Development Team 2002-2004 NetHack may be freely redistributed. See license for details. ============================================================== Instructions for compiling and installing Slash'EM 0.0.7 on a Windows NT, 95, 98, Me, 2000, or XP system ============================================================== Last revision: January 17, 2004 This file deals with compiling Slash'EM with gcc (the GNU Compiler Collection) and other free utility programs and libraries. You can build either the TTY version of Slash'EM or one of the GUI versions: GTK or native MS-Windows. Note that Makefile.gcc contains rules suitable for use with the procedure documented here rather than in Install.nt -- follow the procedure laid out in this file to build a TTY version of Slash'EM with gcc. You will need ------------- o A copy of MinGW 1.0 or later (2.0 or later recommended). You can download MinGW at http://www.mingw.org/ o You may find it useful to obtain copies of lex (flex) and yacc (bison, or byacc). While not strictly necessary to compile Slash'EM, they are required should you desire to make any changes to the level and dungeon compilers. o If you are running an early version of Windows 95 then you may need to get a copy of msvcrt.dll (which normally lives in c:\windows\system). To do this go to Microsoft's Windows 95 downloads page at: http://www.microsoft.com/windows95/downloads/ scroll down to the "Windows Library Update" and follow the instructions to install it. To build the GTK interface, you will also need: o GTK Development Environment version 2.2.1 or later o GTK Runtime Environment version 2.2.1 or later Both these packages can be downloaded from http://www.dropline.net/gtk/ Setting up the MinGW build environment -------------------------------------- 1. Run the mingw installation program and install in c:\MinGW 2. Add c:\MinGW\bin to your path. The last step may be accomplished by adding the following line to the end of your autoexec.bat file and re-booting: PATH=c:\MinGW\bin;%PATH% Setting up the GTK build environment ------------------------------------ 1. Run the GTK Development Environment installer and install in c:\win-gtk 2. Run the GTK Runtime Environment installer and install in c:\Program Files\Common Files\GTK\2.0 3. Add c:\Program Files\Common Files\GTK\2.0\lib and c:\win-gtk\bin to your path. Setting up the Slash'EM build environment ----------------------------------------- 1. Extract the Slash'EM source tarball to a suitable directory. We recommend winzip for this which appears to handle text files appropriately. If you use a different unpacker you may need to convert at least sys/winnt/setup.bat and win/share/*.txt to text format. 2. Start an Command Prompt window (MS-DOS Prompt window under Win 95). 3. Change into the sys/winnt subdirectory and run setup.bat 4. Change into the src subdirectory and edit Makefile to review and, if necessary, modify any variables. The following, in particular, may need consideration: GAMEDIR The directory where the game will be installed. Default: \games\slam32d MW32GTK The directory where the MinGW version of the Gtk+ 2.0 tree is installed. Default: /win-gtk MS_BITFIELDS Switch between gcc 2.x and 3.x command line flags. Default: gcc 3.x (MinGW 2.x) RDEL Switch between Win 95 and Win 2000 derived systems. Default: rd (Win 2K) You may want to change some of the other commands in this section, but you shouldn't need to when building from a clean install. YACC_LEX Set to Y if yacc and lex are installed. Default: N USE_DLB Set to N to keep data files seperate. Default: Y USE_MSWIN Set to Y to include the native windowing interface. Default: N USE_GTK Set to Y to include the GTK windowing interface. Default: N USE_PROXY Set to Y to support proxified and plug-in interfaces. Default: N Note: While there's no theoretical reason why an executable could not contain both the native and GTK windowing interfaces, Makefile.gcc does not support this configuration. Building a proxified GTK interface under MS-Windows is possible, if somewhat pointless. Building a proxified native interface is not possible. 5. If the comments in the Makefile told you to make any changes to config.h, then change into the include subdirectory and do so now. Compiling and installing Slash'EM --------------------------------- Now, from your command prompt, change to the src directory, and type: mingw32-make install After some time, the game should be compiled and installed in the \games\slam32d directory or whatever directory you specified. Happy Hacking! slashem-0.0.7E7F3/sys/winnt/Makefile.cygwin0000664000076400007640000010101310545462317016564 0ustar aliali# Mingw32 under Win95, modified for use with SLASH'EM # # This version uses DOS-style Directory separators only! # # Requires Gnu gcc compiler for Win32 (Mingw32 or Cygwin) # Also requires Gnu Make utility, either Mingw32 or Cygwin version # # For questions or comments: karlgarrison@earthlink.net # # In addition to your C compiler, you will need a workalike for the # UNIX yacc and lex utilities. Theoretically, you should be able to # compile without them, but I ran into errors when I tried to do this. # # Note that flex (workalike for lex) and bison (workalike for yacc) are # included with the Cygwin package (full version only). There may be # other ports of these tools available for Win32, but these are the only # ones I am aware of. # # Directory Seperator # # Game Installation Variables # NOTE: Make sure GAMEDIR exists before make is started. GAME = slashem # The GNU Make has a problem if you include a drive spec below (unfortunately). GAMEDIR = /slam32d # # Directories # # These are for Mingw32's GCC, which gets confused by \ DDAT = ../dat DUTIL = ../util DSRC = ../src DINCL = ../include # Normal dos commands get confused by \\ JRN change DAT = ../dat DOC = ../doc INCL = ../include WSYS = ../sys/winnt SRC = ../src SSHR = ../sys/share UTIL = ../util WTTY = ../win/tty WGTK = ../win/gtk WSHR = ../win/share # # Executables. CC = gcc LINK = gcc MAKEBIN = make # The copy, del and echo commands don't seem to work from a makefile since # it's part of the shell rather than an external utility. We can get around # this by specifying an external utility that performs the same function like # the cp and rm commands from Cygwin32, or xcopy for copy. Another way to do # it is to call the shell explicitly and use the /c option to run the built-in # command. All of these examples appear below. #COPY = command.com /c copy #COPY = cmd.exe /c copy # Same as above, but for Windows NT #COPY = xcopy COPY = cp # UNIX copy command #COPY = copy # MSDOS copy command #DEL = command.com /c del #DEL = cmd.exe /c del # Same as above, but for Windows NT DEL = rm -f #UNIX del command #DEL = del #MSDOS del command #ECHO = command.com /c echo # For some reason this doesn't seem to work #ECHO = cmd.exe /c $(ECHO) # Same as above, but for Windows NT #ECHO = echo.exe # UNIX echo command ECHO = echo # MSDOS echo command LS = ls -1 # ls.exe from djgpp distribution #LS = dir /l/b/-p # DOS command WAC - disable pause for dos6 #LS = *dir /l/b/z # 4DOS command - cuts through ALIASes # if you have a uudecode program, add its name here # otherwise leave blank UUDECODE = # # Yacc/Lex ... if you got 'em. # # If you have yacc/lex or a work-alike set YACC_LEX to Y # YACC_LEX = Y # If YACC_LEX is Y above, set the following to values appropriate for # your tools. # YACC = bison -y LEX = flex # Win32 versions YTABC = y.tab.c YTABH = y.tab.h LEXYYC = lex.yy.c # DJGPP bison/lex doesn't use LFN #YTABC = y_tab.c #YTABH = y_tab.h #LEXYYC = lexyy.c # # Uncomment the line below if you want to store all the level files, # help files, etc. in a single library file. USE_DLB = Y # To build a binary without any graphics # suitable for blind players, # set SUPPRESS_GRAPHICS to Y # (Note: binary will require ANSI.SYS driver or equivalent loaded) # SUPPRESS_GRAPHICS = Y SUPPRESS_GRAPHICS = ############################################################################# # # nothing below this line should have to be changed # #Do not uncomment these for 3.3.0 #TILEGAME = $(OBJ)/tile.o #TILEDEF = -DTILES #TILEHDR = #SOUND = $(OBJ)/ntsound.o GAMEFILE = $(GAMEDIR)/$(GAME).exe # Changing this conditional block is not recommended ifeq ($(USE_DLB),Y) DLBFLG = -DDLB else DLBFLG = endif # # Flags. # ifeq ($(SUPPRESS_GRAPHICS),Y) TERMLIB = # Build NetHack suitable for blind players # Debugging #CFLAGS = -pg -c -I../include $(DLBFLG) -DSUPPRESS_GRAPHICS #LFLAGS = -pg CFLAGS = -c -O -I../include $(DLBFLG) -DSUPPRESS_GRAPHICS LFLAGS = else # Debugging #CFLAGS = -pg -c -I../include -I../sys/winnt $(DLBFLG) -DWIN32CON #LFLAGS = -pg # Normal CFLAGS = -ggdb -funsigned-char -c -O -I../include -I../sys/winnt \ $(DLBFLG) -DWIN32CON LFLAGS = endif # Select Windowing system(s) below # GTK windowing system #WINGTKCFLAGS=`gtk-config --cflags` #WINGTKCFLAGS=-Ic:/mingw32/src/gtk+ -Ic:/mingw32/src/glib -Ic:/mingw32/src/gtk+/gdk #WINGTKCFLAGS=-Ic:/mingw32/src/ # Set the WINSRC, WINOBJ, and WINLIB lines to correspond to your desired # combination of windowing systems. Also set windowing systems in config.h. # # files for a straight tty port using no native windowing system WINTTYSRC = ../win/tty/getline.c ../win/tty/termcap.c ../win/tty/topl.c \ ../win/tty/wintty.c WINTTYOBJ = getline.o termcap.o topl.o wintty.o # # files for a GTK port # (tile.c is included in the defn. for WINCSRC, below) WINGTKSRC = ../win/gtk/gtk.c ../win/gtk/gtkgetlin.c ../win/gtk/gtkstatus.c \ ../win/gtk/gtkmenu.c ../win/gtk/gtkyn.c ../win/gtk/gtkextcmd.c \ ../win/gtk/gtkmap.c ../win/gtk/gtkmessage.c ../win/gtk/gtkmisc.c \ ../win/gtk/xshmmap.c ../win/gtk/xshm.c WINGTKOBJ = gtk.o gtkgetlin.o gtkstatus.o gtkmenu.o gtkyn.o gtkextcmd.o \ gtkmap.o gtkmessage.o gtkmisc.o xshmmap.o xshm.o nhwin.a # Use these declarations if you only want to support the TTY windowing system WINSRC = $(WINTTYSRC) WINOBJ = $(WINTTYOBJ) # Use these declarations if you want to support the GTK windowing system # WINSRC = $(WINTTYSRC) $(WINGTKSRC) # WINOBJ = $(WINTTYOBJ) $(WINGTKOBJ) # # You must also change the definition of WINLIB (below) to match these WINTTYLIB = # libraries for GTK # WINGTKLIB = `gtk-config --libs` WINGTKLIB = /mingw32/src/gtk+/gtk/libgtk~1.a /mingw32/src/gtk+/gdk/libgdk~1.a # Use this declaration if you only want to support the TTY windowing system WINLIB = $(WINTTYLIB) # Shareable (architecture independent) data files which are not candidates # for inclusion in DLB libraries (ND) and which are (D). Port specific files # per discussions in Install.X11, Install.Qt and Install.GTK CNF_SHARE_GTKND = x11bigtiles x11tiles rip.xpm credit.xpm #Uncomment below to build tiles needed for GTK distrib #CNF_SHARE_DATND = $(CNF_SHARE_GTKND) CNF_SHARE_DATND = # # Utility Objects. # MAKESRC = makedefs.c SPLEVSRC = lev_yacc.c lev_$(LEX).c lev_main.c panic.c DGNCOMPSRC = dgn_yacc.c dgn_$(LEX).c dgn_main.c MAKEOBJS = makedefs.o monst.o objects.o SPLEVOBJS = lev_yacc.o lev_$(LEX).o lev_main.o alloc.o \ monst.o objects.o panic.o \ drawing.o decl.o DGNCOMPOBJS = dgn_yacc.o dgn_$(LEX).o dgn_main.o alloc.o \ panic.o RECOVOBJS = recover.o # Tile related object files. ifeq ($(SUPPRESS_GRAPHICS),Y) TILOBJ = TEXTIO = TEXTIO2 = PLANAR_TIB = OVERVIEW_TIB = TILEUTIL = TILEFILES = TILEFILES2 = GIFREADERS = GIFREAD2 = PPMWRITERS = PPMWRIT2 = else TEXTIO = tiletext.o tiletxt.o drawing.o decl.o monst.o objects.o TEXTIO2 = tiletex2.o tiletxt2.o drawing.o decl.o monst.o objects.o PLANAR_TIB = NetHack1.tib OVERVIEW_TIB = NetHacko.tib DLBOBJ = dlb.o endif # Object files for the game itself. VOBJ01 = allmain.o alloc.o apply.o artifact.o attrib.o VOBJ02 = ball.o bones.o borg.o botl.o cmd.o dbridge.o VOBJ03 = decl.o detect.o display.o do.o do_name.o VOBJ04 = do_wear.o dog.o dogmove.o dokick.o dothrow.o VOBJ05 = drawing.o dungeon.o eat.o end.o engrave.o VOBJ06 = exper.o explode.o extralev.o files.o fountain.o VOBJ07 = 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 VOBJ12 = music.o o_init.o objects.o objnam.o options.o VOBJ13 = pickup.o pline.o polyself.o potion.o quest.o VOBJ14 = questpgr.o pager.o pray.o priest.o read.o VOBJ15 = rect.o restore.o rip.o rnd.o role.o VOBJ16 = rumors.o save.o shk.o shknam.o sit.o VOBJ17 = sounds.o sp_lev.o spell.o steal.o steed.o VOBJ18 = timeout.o topten.o track.o VOBJ19 = trap.o u_init.o uhitm.o vault.o vision.o VOBJ20 = vis_tab.o weapon.o were.o wield.o windows.o VOBJ21 = wizard.o worm.o worn.o write.o VOBJ22 = zap.o light.o dlb.o dig.o teleport.o VOBJ23 = region.o tech.o gypsy.o SOBJ = winnt.o sys.o unix.o nttty.o # $(SOUND) mapimail.o nhlan.o random.o VVOBJ = version.o VOBJ = $(VOBJ01) $(VOBJ02) $(VOBJ03) $(VOBJ04) $(VOBJ05) \ $(VOBJ06) $(VOBJ07) $(VOBJ08) $(VOBJ09) $(VOBJ10) \ $(VOBJ11) $(VOBJ12) $(VOBJ13) $(VOBJ14) $(VOBJ15) \ $(VOBJ16) $(VOBJ17) $(VOBJ18) $(VOBJ19) $(VOBJ20) \ $(VOBJ21) $(VOBJ22) $(VOBJ23) ALLOBJ = $(VOBJ) $(SOBJ) $(VVOBJ) $(WINOBJ) # # Header Objects. # DGN_FILE_H = $(INCL)/align.h $(INCL)/dgn_file.h DUNGEON_H = $(INCL)/align.h $(INCL)/dungeon.h EMIN_H = $(DUNGEON_H) $(INCL)/emin.h EPRI_H = $(DUNGEON_H) $(INCL)/align.h $(INCL)/epri.h ESHK_H = $(DUNGEON_H) $(INCL)/eshk.h MONDATA_H = $(INCL)/align.h $(INCL)/mondata.h MONST_H = $(INCL)/align.h $(INCL)/monst.h NHLAN_H = $(INCL)/nhlan.h PERMONST_H = $(INCL)/monattk.h $(INCL)/monflag.h $(INCL)/align.h \ $(INCL)/permonst.h REGION_H = $(INCL)/region.h RM_H = $(INCL)/align.h $(INCL)/rm.h SKILLS_H = $(INCL)/skills.h SP_LEV_H = $(INCL)/align.h $(INCL)/sp_lev.h VAULT_H = $(DUNGEON_H) $(INCL)/vault.h YOUPROP_H = $(PERMONST_H) $(MONDATA_H) $(INCL)/prop.h \ $(INCL)/pm.h $(INCL)/youprop.h YOU_H = $(MONST_H) $(YOUPROP_H) $(INCL)/align.h \ $(INCL)/attrib.h $(INCL)/you.h DISPLAY_H = $(MONDATA_H) $(INCL)/vision.h $(INCL)/display.h NTCONF_H = $(INCL)/micro.h $(INCL)/system.h $(INCL)/ntconf.h CONFIG_H = $(GLOBAL_H) $(INCL)/tradstdc.h $(INCL)/config1.h \ $(INCL)/config.h DECL_H = $(YOU_H) $(INCL)/spell.h $(INCL)/color.h \ $(INCL)/obj.h $(INCL)/onames.h $(INCL)/pm.h \ $(INCL)/decl.h GLOBAL_H = $(NTCONF_H) $(INCL)/coord.h $(INCL)/global.h HACK_H = $(CONFIG_H) $(DUNGEON_H) $(DECL_H) \ $(DISPLAY_H) $(INCL)/monsym.h $(INCL)/mkroom.h \ $(INCL)/objclass.h $(INCL)/trap.h $(INCL)/flag.h \ $(RM_H) $(INCL)/vision.h $(INCL)/wintype.h \ $(INCL)/engrave.h $(INCL)/rect.h \ $(INCL)/trampoli.h $(INCL)/hack.h $(REGION_H) DLB_H = $(INCL)/dlb.h #ifeq ($(SUPPRESS_GRAPHICS),Y) #TILE_H = #else #TILE_H = $(INCL)/tile.h $(INCL)/pctiles.h #endif ifeq ($(USE_DLB),Y) DLB = $(DAT)/nhshare $(DAT)/nhushare DLBOBJS = dlb_main.o dlb.o alloc.o panic.o else DLB = DLBOBJS = endif # # Make Rules. # .SUFFIXES: .exe .o .c .y .l .c.o: $(CC) $(CFLAGS) -o$@ $< #.phony: dlb # # Primary Targets. # # The default target. default: $(GAMEFILE) all: install.tag util: utility.tag install: install.tag utility.tag: $(INCL)/date.h $(INCL)/trap.h $(INCL)/onames.h \ $(INCL)/pm.h monstr.c vis_tab.c $(INCL)/filename.h\ lev_comp.exe dgn_comp.exe recover.exe $(TILEUTIL) $(ECHO) utilities made > utility.tag install.tag: dat.tag $(GAMEFILE) ifeq ($(USE_DLB),Y) $(COPY) $(DAT)/nhshare $(GAMEDIR) $(COPY) $(DAT)/nhushare $(GAMEDIR) $(COPY) $(DAT)/license $(GAMEDIR) else $(COPY) $(DAT)/*. $(GAMEDIR) $(COPY) $(DAT)/*.dat $(GAMEDIR) $(COPY) $(DAT)/*.lev $(GAMEDIR) # $(DEL) $(GAMEDIR)/makefile. endif # $(COPY) *.tib $(GAMEDIR) $(COPY) $(SSHR)/NetHack.cnf $(GAMEDIR)/defaults.nh $(COPY) ../sys/msdos/NHAccess.nh $(GAMEDIR) $(COPY) recover.exe $(GAMEDIR) $(COPY) $(DOC)/guidebook.txt $(GAMEDIR) $(COPY) $(DOC)/recover.txt $(GAMEDIR) $(COPY) $(DOC)/slashem.txt $(GAMEDIR) $(ECHO) install done > install.tag # The main target. $(GAMEFILE): utility.tag $(ALLOBJ) $(GAME).lnk $(LINK) $(LFLAGS) -o$(GAME).exe $(GAME).lnk $(COPY) $(GAME).exe $(GAMEFILE) $(DEL) $(GAME).exe $(GAME).lnk: $(ALLOBJ) @echo INPUT\( $(VOBJ01) \)> $@ @echo INPUT\( $(VOBJ02) \)>> $@ @echo INPUT\( $(VOBJ03) \)>> $@ @echo INPUT\( $(VOBJ04) \)>> $@ @echo INPUT\( $(VOBJ05) \)>> $@ @echo INPUT\( $(VOBJ06) \)>> $@ @echo INPUT\( $(VOBJ07) \)>> $@ @echo INPUT\( $(VOBJ08) \)>> $@ @echo INPUT\( $(VOBJ09) \)>> $@ @echo INPUT\( $(VOBJ10) \)>> $@ @echo INPUT\( $(VOBJ11) \)>> $@ @echo INPUT\( $(VOBJ12) \)>> $@ @echo INPUT\( $(VOBJ13) \)>> $@ @echo INPUT\( $(VOBJ14) \)>> $@ @echo INPUT\( $(VOBJ15) \)>> $@ @echo INPUT\( $(VOBJ16) \)>> $@ @echo INPUT\( $(VOBJ17) \)>> $@ @echo INPUT\( $(VOBJ18) \)>> $@ @echo INPUT\( $(VOBJ19) \)>> $@ @echo INPUT\( $(VOBJ20) \)>> $@ @echo INPUT\( $(VOBJ21) \)>> $@ @echo INPUT\( $(VOBJ22) \)>> $@ @echo INPUT\( $(VOBJ23) \)>> $@ @echo INPUT\( $(SOBJ) \)>> $@ @echo INPUT\( $(VVOBJ) \)>> $@ @echo INPUT\( $(WINOBJ) \)>> $@ # # Housekeeping. # clean: $(DEL) *.o $(DEL) *.map $(DEL) dlb_main.exe spotless: clean $(DEL) utility.tag $(DEL) install.tag $(DEL) dat.tag $(DEL) $(GAME).lnk $(DEL) makedefs.exe $(DEL) lev_comp.exe $(DEL) dgn_comp.exe $(DEL) txtmerge.exe $(DEL) magtile.exe $(DEL) tile2x11.exe $(DEL) x11bigtiles $(DEL) x11tiles $(DEL) tiletext.c $(DEL) txtmerge.c $(DEL) magtile.c $(DEL) x11tiles $(DEL) lev_flex.c $(DEL) lev_yacc.c $(DEL) dgn_flex.c $(DEL) dgn_yacc.c $(DEL) recover.exe $(DEL) $(INCL)/onames.h $(DEL) $(INCL)/pm.h $(DEL) $(INCL)/vis_tab.h $(DEL) $(INCL)/pcvideo.h $(DEL) $(INCL)/pctiles.h $(DEL) $(INCL)/portio.h $(DEL) $(INCL)/tile.h $(DEL) monstr.c $(DEL) vis_tab.c $(DEL) $(SRC)/panic.c $(DEL) $(SRC)/makedefs.c $(DEL) $(SRC)/recover.c $(DEL) $(SRC)/lev_main.c $(DEL) $(SRC)/dlb_main.c $(DEL) $(SRC)/dgn_main.c $(DEL) $(SRC)/wintty.c $(DEL) $(SRC)/topl.c $(DEL) $(SRC)/getline.c $(DEL) $(SRC)/termcap.c $(DEL) $(SRC)/tile2bin.c $(DEL) $(SRC)/msdos.c $(DEL) $(SRC)/pckeys.c $(DEL) $(SRC)/video.c $(DEL) $(SRC)/sound.c $(DEL) $(SRC)/tilemap.c $(DEL) $(SRC)/gifread.c $(DEL) $(SRC)/ppmwrite.c $(DEL) $(SRC)/pcmain.c $(DEL) $(SRC)/pcunix.c $(DEL) $(SRC)/pcsys.c $(DEL) $(SRC)/tile.c $(DEL) $(SRC)/gtk*.c $(DEL) $(SRC)/xshmmap.c $(DEL) $(SRC)/xshm.c $(DEL) $(INCL)/date.h $(DEL) $(INCL)/onames.h $(DEL) $(INCL)/pm.h $(DEL) $(INCL)/vis_tab.h $(DEL) $(SRC)/nhlan.c $(DEL) $(SRC)/winnt.c $(DEL) $(SRC)/nttty.c $(DEL) $(SRC)/ntsound.c $(DEL) $(SRC)/mapimail.c $(DEL) vis_tab.c $(DEL) random.c $(DEL) nhlan.c $(DEL) *.lnk $(DEL) *.def $(DEL) *.map $(DEL) *.lev $(DEL) a.out $(DEL) tilemap.exe $(DEL) tile2bin.exe $(DEL) $(DAT)/data $(DEL) $(DAT)/*.lev $(DEL) $(DAT)/data $(DEL) $(DAT)/dungeon $(DEL) $(DAT)/options $(DEL) $(DAT)/oracles $(DEL) $(DAT)/rumors $(DEL) $(DAT)/quest.dat $(DEL) $(DAT)/nhshare $(DEL) $(DAT)/nhushare $(DEL) $(DAT)/dlb.lst $(DEL) $(DAT)/msdoshlp.txt $(DEL) $(DAT)/dlb_main.exe $(DEL) $(DAT)/lev_comp.exe $(DEL) $(DAT)/dgn_comp.exe $(DEL) sp_lev.tag $(DEL) $(PLANAR_TIB) $(DEL) $(OVERVIEW_TIB) $(DEL) $(INCL)/win32api.h $(DEL) $(DAT)/dlb2.lst # # Secondary Targets. # # The following include files depend on makedefs to be created. # # date.h should be remade every time any of the source or include # files is modified. $(INCL)/date.h : makedefs.exe -./makedefs -v $(INCL)/onames.h: makedefs.exe -./makedefs -o $(INCL)/pm.h: makedefs.exe -./makedefs -p monstr.c: makedefs.exe -./makedefs -m $(INCL)/vis_tab.h: makedefs.exe -./makedefs -z vis_tab.c: makedefs.exe -./makedefs -z $(INCL)/filename.h: makedefs.exe -./makedefs -f # # Makedefs Stuff # makedefs.exe: $(MAKEOBJS) $(LINK) $(LFLAGS) -omakedefs.exe $(MAKEOBJS) makedefs.c: $(UTIL)/makedefs.c $(COPY) $(UTIL)/makedefs.c . makedefs.o: $(CONFIG_H) $(PERMONST_H) $(INCL)/objclass.h \ $(INCL)/monsym.h $(INCL)/qtext.h makedefs.c # # Level Compiler Dependencies # lev_comp.exe: $(SPLEVOBJS) $(LINK) $(LFLAGS) -olev_comp.exe $(SPLEVOBJS) ifeq ($(YACC_LEX),Y) lev_yacc.o: $(HACK_H) $(SP_LEV_H) lev_yacc.c $(CC) $(CFLAGS) -o$@ lev_yacc.c else lev_yacc.o: $(HACK_H) $(SP_LEV_H) $(INCL)/lev_comp.h lev_yacc.c $(CC) $(CFLAGS) -o$@ lev_yacc.c endif lev_$(LEX).o: $(HACK_H) $(SP_LEV_H) $(INCL)/lev_comp.h \ lev_$(LEX).c $(CC) $(CFLAGS) -o$@ lev_$(LEX).c lev_main.c: $(UTIL)/lev_main.c $(COPY) $(UTIL)/lev_main.c . lev_main.o: $(HACK_H) lev_main.c $(INCL)/lev_comp.h: lev_yacc.c ifeq ($(YACC_LEX),Y) lev_yacc.c: $(UTIL)/lev_comp.y $(YACC) -d $(DUTIL)/lev_comp.y $(COPY) $(YTABC) $@ $(COPY) $(YTABH) $(INCL)/lev_comp.h $(DEL) $(YTABC) $(DEL) $(YTABH) lev_$(LEX).c: $(UTIL)/lev_comp.l $(LEX) $(DUTIL)/lev_comp.l $(COPY) $(LEXYYC) $@ $(DEL) $(LEXYYC) else lev_yacc.c: $(SSHR)/lev_yacc.c $(COPY) $(SSHR)/lev_yacc.c $@ $(INCL)/lev_comp.h: $(SSHR)/lev_comp.h $(COPY) $(SSHR)/lev_comp.h $@ touch $(DINCL)/lev_comp.h lev_$(LEX).c: $(SSHR)/lev_lex.c $(COPY) $(SSHR)/lev_lex.c $@ endif # # Dungeon Dependencies # dgn_comp.exe: $(DGNCOMPOBJS) $(LINK) $(LFLAGS) -odgn_comp.exe $(DGNCOMPOBJS) ifeq ($(YACC_LEX),Y) dgn_yacc.o: $(HACK_H) $(DGN_FILE_H) dgn_yacc.c $(CC) $(CFLAGS) -o$@ dgn_yacc.c else dgn_yacc.o: $(HACK_H) $(DGN_FILE_H) $(INCL)/dgn_comp.h dgn_yacc.c $(CC) $(CFLAGS) -o$@ dgn_yacc.c endif dgn_$(LEX).o: $(HACK_H) $(DGN_FILE_H) $(INCL)/dgn_comp.h \ dgn_$(LEX).c $(CC) $(CFLAGS) -o$@ dgn_$(LEX).c dgn_main.c: $(UTIL)/dgn_main.c $(COPY) $(UTIL)/dgn_main.c . dgn_main.o: $(HACK_H) $(INCL)/dgn_comp.h: dgn_yacc.c ifeq ($(YACC_LEX),Y) dgn_yacc.c: $(UTIL)/dgn_comp.y $(YACC) -d $(DUTIL)/dgn_comp.y $(COPY) $(YTABC) $@ $(COPY) $(YTABH) $(INCL)/dgn_comp.h $(DEL) $(YTABC) $(DEL) $(YTABH) dgn_$(LEX).c: $(UTIL)/dgn_comp.l $(LEX) $(DUTIL)/dgn_comp.l $(COPY) $(LEXYYC) $@ $(DEL) $(LEXYYC) else dgn_yacc.c: $(SSHR)/dgn_yacc.c $(COPY) $(SSHR)/dgn_yacc.c $@ $(INCL)/dgn_comp.h: $(SSHR)/dgn_comp.h $(COPY) $(SSHR)/dgn_comp.h $@ touch $(DINCL)/dgn_comp.h dgn_$(LEX).c: $(SSHR)/dgn_lex.c $(COPY) $(SSHR)/dgn_lex.c $@ endif # # Recover Utility # recover.exe: $(RECOVOBJS) $(LINK) $(LFLAGS) -orecover.exe recover.o recover.c: $(UTIL)/recover.c $(COPY) $(UTIL)/recover.c . recover.o: $(CONFIG_H) recover.c $(CC) $(CFLAGS) -o$@ recover.c # # Tiles # # Headers $(INCL)/tile.h: $(WSHR)/tile.h tilemap.exe ./tilemap.exe # Utilities txtmerge.exe: txtmerge.o $(TEXTIO) $(CC) $(LFLAGS) -otxtmerge.exe txtmerge.o $(TEXTIO) tile2x11.exe: tile2x11.o $(TEXTIO) $(CC) $(LFLAGS) -otile2x11.exe tile2x11.o $(TEXTIO) magtile.exe: magtile.o $(TEXTIO) $(CC) $(LFLAGS) -omagtile.exe magtile.o $(TEXTIO) tilemap.exe: tilemap.o $(CC) $(LFLAGS) -o tilemap.exe tilemap.o tilemap.c: $(WSHR)/tilemap.c copy $(WSHR)/tilemap.c . tilemap.o: $(WSHR)/tilemap.c $(HACK_H) $(CC) $(CFLAGS) -c ../win/share/tilemap.c magtile.o: $(WSHR)/magtile.c $(INCL)/config.h $(INCL)/tile.h $(COPY) $(WSHR)/magtile.c . $(CC) $(CFLAGS) -c magtile.c txtmerge.o: $(WSHR)/txtmerge.c $(INCL)/config.h $(INCL)/tile.h $(CC) $(CFLAGS) -c ../win/share/txtmerge.c tile2x11.o: ../win/X11/tile2x11.c $(INCL)/hack.h $(INCL)/tile.h \ $(INCL)/tile2x11.h $(CC) $(CFLAGS) -c ../win/X11/tile2x11.c x11tiles: tile2x11.exe $(WSHR)/monsters.txt $(WSHR)/objects.txt \ $(WSHR)/other.txt ./tile2x11 ../win/share/monsters.txt ../win/share/objects.txt \ ../win/share/other.txt x11bigtiles: tile2x11.exe $(WSHR)/mon32.txt $(WSHR)/obj32.txt \ $(WSHR)/oth32.txt ./tile2x11 -o x11bigtiles ../win/share/mon32.txt \ ../win/share/obj32.txt ../win/share/oth32.txt $(WSHR)/monmag.txt: magtile.exe $(WSHR)/monsters.txt ./magtile.exe $(WSHR)/objmag.txt: magtile.exe $(WSHR)/objects.txt ./magtile.exe $(WSHR)/othmag.txt: magtile.exe $(WSHR)/other.txt ./magtile.exe $(WSHR)/mon32.txt: txtmerge.exe $(WSHR)/monmag.txt $(WSHR)/mon32mi.txt ./txtmerge ../win/share/mon32.txt ..\\win\\share\\monmag.txt -b ..\\win\\share\\mon32mi.txt $(WSHR)/obj32.txt: txtmerge.exe $(WSHR)/objmag.txt \ ../win/share/obj32mi.txt ../win/share/obj32se.txt ./txtmerge ../win/share/obj32.txt ../win/share/objmag.txt \ -b ../win/share/obj32mi.txt -b ../win/share/obj32se.txt $(WSHR)/oth32.txt: txtmerge.exe $(WSHR)/othmag.txt \ ../win/share/oth32mi.txt ../win/share/oth32se.txt ./txtmerge ../win/share/oth32.txt ../win/share/othmag.txt \ -b ../win/share/oth32mi.txt -b ../win/share/oth32se.txt pet_mark.xbm: ../win/X11/pet_mark.xbm $(COPY) ../win/X11/pet_mark.xbm pet_mark.xbm rip.xpm: ../win/X11/rip.xpm $(COPY) ../win/X11/rip.xpm rip.xpm credit.xpm: ../dat/credit.xpm $(COPY) ../dat/credit.xpm credit.xpm tiletext.o: $(CONFIG_H) $(INCL)/tile.h $(WSHR)/tiletext.c $(COPY) $(WSHR)/tiletext.c . $(CC) $(CFLAGS) -o$@ tiletext.c tiletxt.o: $(CONFIG_H) $(INCL)/tile.h tilemap.c $(CC) $(CFLAGS) -DTILETEXT -o$@ tilemap.c # # Other Util Dependencies. # alloc.o: $(CONFIG_H) alloc.c $(CC) $(CFLAGS) -oalloc.o alloc.c drawing.o: $(CONFIG_H) drawing.c $(CC) $(CFLAGS) -odrawing.o drawing.c decl.o: $(CONFIG_H) decl.c $(CC) $(CFLAGS) -odecl.o decl.c monst.o: $(CONFIG_H) $(PERMONST_H) $(ESHK_H) \ $(EPRI_H) $(VAULT_H) $(INCL)/monsym.h \ $(INCL)/color.h monst.c $(CC) $(CFLAGS) -omonst.o monst.c objects.o: $(CONFIG_H) $(INCL)/obj.h $(INCL)/objclass.h \ $(INCL)/prop.h $(INCL)/color.h objects.c $(CC) $(CFLAGS) -oobjects.o objects.c panic.c: $(UTIL)/panic.c $(COPY) $(UTIL)/panic.c . panic.o: $(CONFIG_H) panic.c random.c: $(SSHR)/random.c $(COPY) $(SSHR)/random.c . random.o: $(HACK_H) random.c $(CC) $(CFLAGS) -orandom.o random.c nhlan.c: $(SSHR)/nhlan.c $(COPY) $(SSHR)/nhlan.c . nhlan.o: $(HACK_H) $(NHLAN_H) $(SSHR)/nhlan.c $(COPY) $(SSHR)/nhlan.c . $(CC) $(CFLAGS) -o$@ nhlan.c DATABASE = $(DAT)/data.base dat.tag: $(DAT)/nhshare $(DAT)/nhushare $(CNF_SHARE_DATND) @echo dat done >dat.tag $(DAT)/data: utility.tag $(DATABASE) -./makedefs -d $(DAT)/rumors: utility.tag $(DAT)/rumors.tru $(DAT)/rumors.fal -./makedefs -r $(DAT)/quest.dat: utility.tag $(DAT)/quest.txt -./makedefs -q $(DAT)/oracles: utility.tag $(DAT)/oracles.txt -./makedefs -h sp_lev.tag: utility.tag $(DAT)/beholder.des $(DAT)/bigroom.des \ $(DAT)/blkmar.des $(DAT)/castle.des $(DAT)/grund.des \ $(DAT)/dragons.des $(DAT)/endgame.des \ $(DAT)/gehennom.des $(DAT)/giants.des $(DAT)/guild.des \ $(DAT)/knox.des $(DAT)/kobold-1.des $(DAT)/kobold-2.des \ $(DAT)/lich.des $(DAT)/mall-1.des $(DAT)/mall-2.des \ $(DAT)/medusa.des $(DAT)/sokoban.des \ $(DAT)/mines.des $(DAT)/mtemple.des $(DAT)/newmall.des \ $(DAT)/nymph.des $(DAT)/oracle.des $(DAT)/rats.des \ $(DAT)/sea.des $(DAT)/spiders.des $(DAT)/stor-1.des \ $(DAT)/stor-2.des $(DAT)/stor-3.des $(DAT)/tomb.des \ $(DAT)/tower.des $(DAT)/yendor.des \ $(DAT)/arch.des $(DAT)/barb.des $(DAT)/caveman.des \ $(DAT)/flame.des \ $(DAT)/healer.des $(DAT)/ice.des \ $(DAT)/knight.des $(DAT)/monk.des \ $(DAT)/necro.des $(DAT)/priest.des $(DAT)/rogue.des \ $(DAT)/samurai.des $(DAT)/tourist.des $(DAT)/slayer.des \ $(DAT)/valkyrie.des $(DAT)/wizard.des $(DAT)/yeoman.des \ $(DAT)/frnknstn.des $(DAT)/nightmar.des $(DAT)/ranger.des ./lev_comp $(DDAT)/beholder.des ./lev_comp $(DDAT)/bigroom.des ./lev_comp $(DDAT)/blkmar.des ./lev_comp $(DDAT)/castle.des ./lev_comp $(DDAT)/grund.des # ./lev_comp $(DDAT)/darkelf.des ./lev_comp $(DDAT)/dragons.des ./lev_comp $(DDAT)/endgame.des ./lev_comp $(DDAT)/gehennom.des ./lev_comp $(DDAT)/giants.des ./lev_comp $(DDAT)/guild.des ./lev_comp $(DDAT)/knox.des ./lev_comp $(DDAT)/kobold-1.des ./lev_comp $(DDAT)/kobold-2.des ./lev_comp $(DDAT)/lich.des ./lev_comp $(DDAT)/mall-1.des ./lev_comp $(DDAT)/mall-2.des ./lev_comp $(DDAT)/medusa.des ./lev_comp $(DDAT)/sokoban.des ./lev_comp $(DDAT)/mines.des ./lev_comp $(DDAT)/mtemple.des ./lev_comp $(DDAT)/newmall.des ./lev_comp $(DDAT)/nymph.des ./lev_comp $(DDAT)/oracle.des ./lev_comp $(DDAT)/rats.des ./lev_comp $(DDAT)/sea.des ./lev_comp $(DDAT)/spiders.des ./lev_comp $(DDAT)/stor-1.des ./lev_comp $(DDAT)/stor-2.des ./lev_comp $(DDAT)/stor-3.des ./lev_comp $(DDAT)/tomb.des ./lev_comp $(DDAT)/tower.des ./lev_comp $(DDAT)/yendor.des ./lev_comp $(DDAT)/arch.des ./lev_comp $(DDAT)/barb.des ./lev_comp $(DDAT)/caveman.des # ./lev_comp $(DDAT)/dopp.des # ./lev_comp $(DDAT)/elf.des ./lev_comp $(DDAT)/flame.des # ./lev_comp $(DDAT)/gnome.des ./lev_comp $(DDAT)/healer.des ./lev_comp $(DDAT)/ice.des ./lev_comp $(DDAT)/knight.des # ./lev_comp $(DDAT)/lycn.des ./lev_comp $(DDAT)/monk.des ./lev_comp $(DDAT)/necro.des ./lev_comp $(DDAT)/priest.des ./lev_comp $(DDAT)/rogue.des ./lev_comp $(DDAT)/samurai.des ./lev_comp $(DDAT)/tourist.des ./lev_comp $(DDAT)/slayer.des ./lev_comp $(DDAT)/valkyrie.des ./lev_comp $(DDAT)/wizard.des ./lev_comp $(DDAT)/yeoman.des # ./lev_comp $(DDAT)/hobbit.des ./lev_comp $(DDAT)/frnknstn.des # ./lev_comp $(DDAT)/dwarf.des ./lev_comp $(DDAT)/nightmar.des ./lev_comp $(DDAT)/ranger.des $(COPY) ./*.lev $(DAT) $(ECHO) sp_levs done > sp_lev.tag $(DAT)/dungeon: utility.tag $(DAT)/dungeon.def @$(COPY) $(SRC)/dgn_comp.exe $(DAT)/dgn_comp.exe -./makedefs -e ( cd $(DAT); ./dgn_comp dungeon.pdf ) # # DLB stuff # $(DAT)/nhshare: dlb_main.exe $(DAT)/data $(DAT)/rumors $(DAT)/dungeon \ $(DAT)/oracles $(DAT)/quest.dat sp_lev.tag $(ECHO) data >$(DAT)/dlb.lst $(ECHO) oracles >>$(DAT)/dlb.lst $(ECHO) options >>$(DAT)/dlb.lst $(ECHO) rumors >>$(DAT)/dlb.lst $(ECHO) help >>$(DAT)/dlb.lst $(ECHO) hh >>$(DAT)/dlb.lst $(ECHO) cmdhelp >>$(DAT)/dlb.lst $(ECHO) history >>$(DAT)/dlb.lst $(ECHO) opthelp >>$(DAT)/dlb.lst $(ECHO) wizhelp >>$(DAT)/dlb.lst $(ECHO) license >>$(DAT)/dlb.lst # The line above works, but the line below doesn't. I can't figure-out why. # WAC - for some reason, this is OK under the DJGPP make... ( cd $(DAT) ; ./dlb_main cvIf dlb.lst nhshare ) cd $(SRC) $(DAT)/nhushare: dlb_main.exe $(DAT)/dungeon $(DAT)/quest.dat sp_lev.tag $(ECHO) dungeon > $(DAT)/dlb2.lst $(ECHO) quest.dat >>$(DAT)/dlb2.lst cd $(DAT) ; $(LS) *.lev >>dlb2.lst ; ./dlb_main cvIf dlb2.lst nhushare cd $(SRC) dlb_main.exe: $(DLBOBJS) $(LINK) $(LFLAGS) -odlb_main.exe $(DLBOBJS) $(COPY) $@ $(DAT)/dlb_main.exe dlb_main.o: $(UTIL)/dlb_main.c $(INCL)/config.h $(DLB_H) $(COPY) $(UTIL)/dlb_main.c . $(CC) $(CFLAGS) -odlb_main.o dlb_main.c # Game Dependencies # sys/share main.o: $(HACK_H) $(DLB_H) $(SSHR)/pcmain.c $(COPY) $(SSHR)/pcmain.c . $(CC) $(CFLAGS) -o$@ pcmain.c unix.o: $(HACK_H) $(SSHR)/pcunix.c $(COPY) $(SSHR)/pcunix.c . $(CC) $(CFLAGS) -o$@ pcunix.c sys.o : $(HACK_H) $(SSHR)/pcsys.c $(COPY) $(SSHR)/pcsys.c . $(CC) $(CFLAGS) -o$@ pcsys.c # sys/winnt winnt.o : $(HACK_H) $(WSYS)/winnt.c $(COPY) $(WSYS)/winnt.c . $(COPY) $(WSYS)/win32api.h ../include $(CC) $(CFLAGS) -o$@ winnt.c nttty.o : $(HACK_H) $(WSYS)/nttty.c $(COPY) $(WSYS)/nttty.c . $(CC) $(CFLAGS) -o$@ nttty.c ntsound.o: $(PCH) $(WSYS)/ntsound.c $(HACK_H) $(COPY) $(WSYS)/ntsound.c . $(CC) $(CFLAGS) -o$@ ntsound.c mapimail.o: $(PCH) $(WSYS)/mapimail.c $(HACK_H) $(NHLAN_H) $(COPY) $(WSYS)/mapimail.c . $(CC) $(CFLAGS) -DMAPI_VERBOSE -o$@ mapimail.c # win/tty getline.o : $(HACK_H) $(INCL)/wintty.h $(WTTY)/getline.c $(COPY) $(WTTY)/getline.c . $(CC) $(CFLAGS) -o$@ getline.c termcap.o : $(CONFIG_H) $(WTTY)/termcap.c $(COPY) $(WTTY)/termcap.c . $(CC) $(CFLAGS) -o$@ termcap.c topl.o : $(CONFIG_H) $(WTTY)/topl.c $(COPY) $(WTTY)/topl.c . $(CC) $(CFLAGS) -o$@ topl.c wintty.o : $(HACK_H) $(WTTY)/wintty.c $(COPY) $(WTTY)/wintty.c . $(CC) $(CFLAGS) -o$@ wintty.c # win/gtk gtk.o: ../win/gtk/gtk.c ../include/winGTK.h $(HACK_H) ../include/func_tab.h \ ../include/dlb.h ../include/patchlevel.h $(COPY) $(WGTK)/gtk.c . $(CC) $(CFLAGS) $(WINGTKCFLAGS) -c ../win/gtk/gtk.c gtkgetlin.o: ../win/gtk/gtkgetlin.c ../include/winGTK.h $(HACK_H) $(COPY) $(WGTK)/gtkgetlin.c . $(CC) $(CFLAGS) $(WINGTKCFLAGS) -c ../win/gtk/gtkgetlin.c gtkstatus.o: ../win/gtk/gtkstatus.c ../include/winGTK.h $(HACK_H) $(COPY) $(WGTK)/gtkstatus.c . $(CC) $(CFLAGS) $(WINGTKCFLAGS) -c ../win/gtk/gtkstatus.c gtkmenu.o: ../win/gtk/gtkmenu.c ../include/winGTK.h $(HACK_H) $(COPY) $(WGTK)/gtkmenu.c . $(CC) $(CFLAGS) $(WINGTKCFLAGS) -c ../win/gtk/gtkmenu.c gtkyn.o: ../win/gtk/gtkyn.c ../include/winGTK.h $(HACK_H) $(COPY) $(WGTK)/gtkyn.c . $(CC) $(CFLAGS) $(WINGTKCFLAGS) -c ../win/gtk/gtkyn.c gtkextcmd.o: ../win/gtk/gtkextcmd.c ../include/winGTK.h $(HACK_H) \ ../include/func_tab.h $(COPY) $(WGTK)/gtkextcmd.c . $(CC) $(CFLAGS) $(WINGTKCFLAGS) -c ../win/gtk/gtkextcmd.c gtkmap.o: ../win/gtk/gtkmap.c ../include/winGTK.h $(HACK_H) ../include/dlb.h \ ../include/patchlevel.h $(COPY) $(WGTK)/gtkmap.c . $(CC) $(CFLAGS) $(WINGTKCFLAGS) -c ../win/gtk/gtkmap.c gtkmessage.o: ../win/gtk/gtkmessage.c ../include/winGTK.h $(HACK_H) $(COPY) $(WGTK)/gtkmessage.c . $(CC) $(CFLAGS) $(WINGTKCFLAGS) -c ../win/gtk/gtkmessage.c gtkmisc.o: ../win/gtk/gtkmisc.c ../include/winGTK.h $(HACK_H) $(COPY) $(WGTK)/gtkmisc.c . $(CC) $(CFLAGS) $(WINGTKCFLAGS) -c ../win/gtk/gtkmisc.c xshmmap.o: ../win/gtk/xshmmap.c ../include/winGTK.h $(HACK_H) ../include/xshm.h $(COPY) $(WGTK)/xshmmap.c . $(CC) $(CFLAGS) $(WINGTKCFLAGS) -c ../win/gtk/xshmmap.c xshm.o: ../win/gtk/xshm.c ../include/xshm.h $(COPY) $(WGTK)/xshm.c . $(CC) $(CFLAGS) $(WINGTKCFLAGS) -c ../win/gtk/xshm.c # src dependencies allmain.o: $(HACK_H) alloc.o: $(CONFIG_H) apply.o: $(HACK_H) $(INCL)/edog.h artifact.o: $(HACK_H) $(INCL)/artifact.h $(INCL)/artilist.h attrib.o: $(HACK_H) $(INCL)/artifact.h ball.o: $(HACK_H) bones.o: $(HACK_H) $(INCL)/lev.h botl.o: $(HACK_H) cmd.o: $(HACK_H) $(INCL)/func_tab.h dbridge.o: $(HACK_H) decl.o: $(HACK_H) $(INCL)/quest.h detect.o: $(HACK_H) $(INCL)/artifact.h dig.o: $(HACK_H) display.o: $(HACK_H) dlb.o: $(HACK_H) $(DLB_H) do.o: $(HACK_H) $(INCL)/lev.h do_name.o: $(HACK_H) do_wear.o: $(HACK_H) dog.o: $(HACK_H) $(INCL)/edog.h dogmove.o: $(HACK_H) $(INCL)/mfndpos.h $(INCL)/edog.h dokick.o: $(HACK_H) $(ESHK_H) dothrow.o: $(HACK_H) drawing.o: $(HACK_H) $(INCL)/tcap.h dungeon.o: $(HACK_H) $(INCL)/dgn_file.h eat.o: $(HACK_H) end.o: $(HACK_H) $(ESHK_H) engrave.o: $(HACK_H) $(INCL)/lev.h exper.o: $(HACK_H) explode.o: $(HACK_H) extralev.o: $(HACK_H) files.o: $(HACK_H) fountain.o: $(HACK_H) gypsy.o: $(HACK_H) hack.o: $(HACK_H) hacklib.o: $(HACK_H) invent.o: $(HACK_H) $(INCL)/artifact.h light.o: $(HACK_H) $(INCL)/lev.h lock.o: $(HACK_H) mail.o: $(HACK_H) $(INCL)/mail.h makemon.o: $(HACK_H) $(EPRI_H) $(EMIN_H) $(INCL)/edog.h mcastu.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) mklev.o: $(HACK_H) mkmap.o: $(HACK_H) $(INCL)/sp_lev.h mkmaze.o: $(HACK_H) $(INCL)/sp_lev.h mkobj.o: $(HACK_H) $(INCL)/artifact.h $(INCL)/prop.h mkroom.o: $(HACK_H) mon.o: $(HACK_H) $(INCL)/mfndpos.h $(INCL)/edog.h mondata.o: $(HACK_H) $(ESHK_H) $(EPRI_H) monmove.o: $(HACK_H) $(INCL)/mfndpos.h $(INCL)/artifact.h monst.o: $(CONFIG_H) $(PERM_H) $(ESHK_H) $(EPRI_H) \ $(INCL)/color.h $(INCL)/monsym.h $(INCL)/vault.h mplayer.o: $(HACK_H) mthrowu.o: $(HACK_H) muse.o: $(HACK_H) music.o: $(HACK_H) o_init.o: $(HACK_H) objects.o: $(CONFIG_H) $(INCL)/obj.h $(INCL)/objclass.h \ $(INCL)/prop.h $(SKILLS_H) $(INCL)/color.h objnam.o: $(HACK_H) options.o: $(CONFIG_H) $(HACK_H) $(INCL)/objclass.h $(INCL)/flag.h \ $(INCL)/tcap.h pager.o: $(HACK_H) pickup.o: $(HACK_H) pline.o: $(HACK_H) $(EPRI_H) polyself.o: $(HACK_H) potion.o: $(HACK_H) pray.o: $(HACK_H) $(EPRI_H) priest.o: $(HACK_H) $(INCL)/mfndpos.h $(ESHK_H) $(EPRI_H) $(EMIN_H) quest.o: $(HACK_H) $(INCL)/quest.h $(INCL)/qtext.h questpgr.o: $(HACK_H) $(INCL)/qtext.h read.o: $(HACK_H) rect.o: $(HACK_H) region.o: $(HACK_H) restore.o: $(HACK_H) $(INCL)/lev.h $(INCL)/tcap.h $(INCL)/quest.h rip.o: $(HACK_H) role.o: $(HACK_H) rnd.o: $(HACK_H) rumors.o: $(HACK_H) save.o: $(HACK_H) $(INCL)/lev.h $(INCL)/quest.h shk.o: $(HACK_H) $(ESHK_H) shknam.o: $(HACK_H) $(ESHK_H) sit.o: $(HACK_H) $(INCL)/artifact.h sounds.o: $(HACK_H) $(INCL)/edog.h sp_lev.o: $(HACK_H) $(INCL)/sp_lev.h $(INCL)/align.h $(INCL)/rect.h spell.o: $(HACK_H) steal.o: $(HACK_H) steed.o: $(HACK_H) teleport.o: $(HACK_H) tech.o: $(HACK_H) $(INCL)/tech.h tile.o: $(HACK_H) $(TILE_H) timeout.o: $(HACK_H) topten.o: $(HACK_H) track.o: $(HACK_H) trap.o: $(HACK_H) u_init.o: $(HACK_H) uhitm.o: $(HACK_H) vault.o: $(HACK_H) $(INCL)/vault.h version.o: $(HACK_H) $(INCL)/patchlevel.h vision.o: $(HACK_H) $(INCL)/vis_tab.h weapon.o: $(HACK_H) were.o: $(HACK_H) wield.o: $(HACK_H) windows.o: $(HACK_H) $(INCL)/wintty.h wizard.o: $(HACK_H) $(INCL)/qtext.h worm.o: $(HACK_H) $(INCL)/lev.h worn.o: $(HACK_H) write.o: $(HACK_H) zap.o: $(HACK_H) # end of file slashem-0.0.7E7F3/sys/winnt/defaults.nh0000664000076400007640000001605710545462317016000 0ustar aliali# 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. # *** Tilesets provided for use by plug-in window interfaces. TILESET=name:Small tiles,file:gltile16.png TILESET=name:Big tiles,file:gltile32.png,transparent TILESET=name:Big 3D tiles,file:gltile64.png,transparent,pseudo3D OPTIONS=tiles:Big tiles # *** OPTIONS *** # # Use the TTY (console) window interface instead of the default GUI interface. # Note: This has no effect if you are using a plug-in window interface, such # as gtkhack. # OPTIONS=windowtype:tty # Use the IBM character set rather than just plain ascii characters # for tty window-port. OPTIONS=IBMGraphics # Keyboard handling # Different keyboard handlers can be loaded. # Default is nhdefkey.dll but you can override that. # Ray Chason's keyboard handler # OPTIONS=altkeyhandler:nhraykey.dll # # NetHack 3.4.0 keyboard handling # OPTIONS=altkeyhandler:nh340key.dll # *** 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. # # number_pad option can have an optional value of 0 (off), 1 (on), # or 2(on,legacy-mode) which causes 5='g', alt-5='G', alt-0='I' OPTIONS=time,noshowexp,number_pad:2,lit_corridor # # If you want to get rid of 'use "r." to read...' use: #OPTIONS=suppress_alert:0.0.7 # # Note: the rest_on_space in the next line may not be # appropriate for a beginning NetHack player, since # it could result in use of a turn unintentionally. # If you're new to NetHack, leave it commented it out. #OPTIONS=rest_on_space # # 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 # The 32x32 tiles #OPTIONS=tile_file:tiles32.bmp,tile_width:32,tile_height:32 # 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:9 # 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 # *** LOCATIONS *** # IMPORTANT: If you change any of these locations, the directories they # point at must exist. NetHack will not create them for you. # # HACKDIR is the default location for everything. # Note: On Windows HACKDIR defaults to the location # of the NetHack.exe or NetHackw.exe file so # setting HACKDIR below to override that is # not usually necessary or recommended. #HACKDIR=c:\games\nethack # # The location that level files in progress are stored (default=HACKDIR, writeable) #LEVELDIR=c:\nethack\levels # # The location where saved games are kept (default=HACKDIR, writeable) #SAVEDIR=c:\nethack\save # # The location that bones files are kept (default=HACKDIR, writeable) #BONESDIR=c:\nethack\save # # The location that file synchronization locks are stored (default=HACKDIR, writeable) #LOCKDIR=c:\nethack\levels # # The location that a record of game aborts and self-diagnosed game problems # is kept (default=HACKDIR, writeable) #TROUBLEDIR=c:\nethack\trouble # Finnish keyboards might need these modifications uncommented. # For \, @, $, [, | #OPTIONS=subkeyvalue:171/92 #OPTIONS=subkeyvalue:178/64 #OPTIONS=subkeyvalue:180/36 #OPTIONS=subkeyvalue:184/91 #OPTIONS=subkeyvalue:188/124 # # *** 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 slashem-0.0.7E7F3/sys/winnt/nhdefkey.c0000664000076400007640000002163310545462317015577 0ustar aliali/* SCCS Id: @(#)nhdefkey.c 3.4 $Date: 2003/12/11 09:49:08 $ */ /* Copyright (c) NetHack PC Development Team 2003 */ /* NetHack may be freely redistributed. See license for details. */ /* * This is the default NetHack keystroke processing. * It can be built as a run-time loadable dll (nhdefkey.dll). * Alternative keystroke handlers can be built using the * entry points in this file as a template. * * Use the defaults.nh "altkeyhandler" option to set a * different dll name (without the ".DLL" extension) to * get different processing. Ensure that the dll referenced * in defaults.nh exists in the same directory as NetHack in * order for it to load successfully. * */ static char where_to_get_source[] = "http://www.nethack.org/"; static char author[] = "The NetHack Development Team"; #include "hack.h" #include "wintty.h" #include "win32api.h" extern HANDLE hConIn; extern INPUT_RECORD ir; char dllname[512]; char *shortdllname; int FDECL(__declspec(dllexport) __stdcall ProcessKeystroke, (HANDLE hConIn, INPUT_RECORD *ir, boolean *valid, BOOLEAN_P numberpad, int portdebug)); int WINAPI DllMain(HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved) { char dlltmpname[512]; char *tmp = dlltmpname, *tmp2; *(tmp + GetModuleFileName(hInstance, tmp, 511)) = '\0'; (void)strcpy(dllname, tmp); tmp2 = strrchr(dllname, '\\'); if (tmp2) { tmp2++; shortdllname = tmp2; } return TRUE; } /* * Keyboard translation tables. * (Adopted from the MSDOS port) */ #define KEYPADLO 0x47 #define KEYPADHI 0x53 #define PADKEYS (KEYPADHI - KEYPADLO + 1) #define iskeypad(x) (KEYPADLO <= (x) && (x) <= KEYPADHI) /* * Keypad keys are translated to the normal values below. * Shifted keypad keys are translated to the * shift values below. */ static const struct pad { uchar normal, shift, cntrl; } keypad[PADKEYS] = { {'y', 'Y', C('y')}, /* 7 */ {'k', 'K', C('k')}, /* 8 */ {'u', 'U', C('u')}, /* 9 */ {'m', C('p'), C('p')}, /* - */ {'h', 'H', C('h')}, /* 4 */ {'g', 'G', 'g'}, /* 5 */ {'l', 'L', C('l')}, /* 6 */ {'+', 'P', C('p')}, /* + */ {'b', 'B', C('b')}, /* 1 */ {'j', 'J', C('j')}, /* 2 */ {'n', 'N', C('n')}, /* 3 */ {'i', 'I', C('i')}, /* Ins */ {'.', ':', ':'} /* Del */ }, numpad[PADKEYS] = { {'7', M('7'), '7'}, /* 7 */ {'8', M('8'), '8'}, /* 8 */ {'9', M('9'), '9'}, /* 9 */ {'m', C('p'), C('p')}, /* - */ {'4', M('4'), '4'}, /* 4 */ {'5', M('5'), '5'}, /* 5 */ {'6', M('6'), '6'}, /* 6 */ {'+', 'P', C('p')}, /* + */ {'1', M('1'), '1'}, /* 1 */ {'2', M('2'), '2'}, /* 2 */ {'3', M('3'), '3'}, /* 3 */ {'0', M('0'), '0'}, /* Ins */ {'.', ':', ':'} /* Del */ }; #define inmap(x,vk) (((x) > 'A' && (x) < 'Z') || (vk) == 0xBF || (x) == '2') static BYTE KeyState[256]; int __declspec(dllexport) __stdcall ProcessKeystroke(hConIn,ir, valid, numberpad, portdebug) HANDLE hConIn; INPUT_RECORD *ir; boolean *valid; boolean numberpad; int portdebug; { int metaflags = 0, k = 0; int keycode, vk; unsigned char ch, pre_ch, mk = 0; unsigned short int scan; unsigned long shiftstate; int altseq = 0; const struct pad *kpad; shiftstate = 0L; ch = pre_ch = ir->Event.KeyEvent.uChar.AsciiChar; scan = ir->Event.KeyEvent.wVirtualScanCode; vk = ir->Event.KeyEvent.wVirtualKeyCode; keycode = MapVirtualKey(vk, 2); shiftstate = ir->Event.KeyEvent.dwControlKeyState; KeyState[VK_SHIFT] = (shiftstate & SHIFT_PRESSED) ? 0x81 : 0; KeyState[VK_CONTROL] = (shiftstate & (LEFT_CTRL_PRESSED|RIGHT_CTRL_PRESSED)) ? 0x81 : 0; KeyState[VK_CAPITAL] = (shiftstate & CAPSLOCK_ON) ? 0x81 : 0; if (shiftstate & (LEFT_ALT_PRESSED|RIGHT_ALT_PRESSED)) { if (ch || inmap(keycode,vk)) altseq = 1; else altseq = -1; /* invalid altseq */ } if (ch || (iskeypad(scan)) || (altseq > 0)) *valid = TRUE; /* if (!valid) return 0; */ /* * shiftstate can be checked to see if various special * keys were pressed at the same time as the key. * Currently we are using the ALT & SHIFT & CONTROLS. * * RIGHT_ALT_PRESSED, LEFT_ALT_PRESSED, * RIGHT_CTRL_PRESSED, LEFT_CTRL_PRESSED, * SHIFT_PRESSED,NUMLOCK_ON, SCROLLLOCK_ON, * CAPSLOCK_ON, ENHANCED_KEY * * are all valid bit masks to use on shiftstate. * eg. (shiftstate & LEFT_CTRL_PRESSED) is true if the * left control key was pressed with the keystroke. */ if (iskeypad(scan)) { kpad = numberpad ? numpad : keypad; if (shiftstate & SHIFT_PRESSED) { ch = kpad[scan - KEYPADLO].shift; } else if (shiftstate & (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED)) { ch = kpad[scan - KEYPADLO].cntrl; } else { ch = kpad[scan - KEYPADLO].normal; } } else if (altseq > 0) { /* ALT sequence */ if (vk == 0xBF) ch = M('?'); else ch = M(tolower(keycode)); } /* Attempt to work better with international keyboards. */ else { WORD chr[2]; k = ToAscii(vk, scan, KeyState, chr, 0); if (k <= 2) switch(k) { case 2: /* two characters */ ch = (unsigned char)chr[1]; *valid = TRUE; break; case 1: /* one character */ ch = (unsigned char)chr[0]; *valid = TRUE; break; case 0: /* no translation */ default: /* negative */ *valid = FALSE; } } if (ch == '\r') ch = '\n'; #ifdef PORT_DEBUG if (portdebug) { char buf[BUFSZ]; Sprintf(buf, "PORTDEBUG (%s): ch=%u, sc=%u, vk=%d, pre=%d, sh=0x%X, ta=%d (ESC to end)", shortdllname, ch, scan, vk, pre_ch, shiftstate, k); fprintf(stdout, "\n%s", buf); } #endif return ch; } int __declspec(dllexport) __stdcall NHkbhit(hConIn, ir) HANDLE hConIn; INPUT_RECORD *ir; { 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; int altseq = 0, keycode, vk; done = 0; retval = 0; while (!done) { count = 0; PeekConsoleInput(hConIn,ir,1,&count); if (count > 0) { if (ir->EventType == KEY_EVENT && ir->Event.KeyEvent.bKeyDown) { ch = ir->Event.KeyEvent.uChar.AsciiChar; scan = ir->Event.KeyEvent.wVirtualScanCode; shiftstate = ir->Event.KeyEvent.dwControlKeyState; vk = ir->Event.KeyEvent.wVirtualKeyCode; keycode = MapVirtualKey(vk, 2); if (shiftstate & (LEFT_ALT_PRESSED|RIGHT_ALT_PRESSED)) { if (ch || inmap(keycode,vk)) altseq = 1; else altseq = -1; /* invalid altseq */ } if (ch || iskeypad(scan) || altseq) { done = 1; /* Stop looking */ retval = 1; /* Found what we sought */ } else { /* Strange Key event; let's purge it to avoid trouble */ ReadConsoleInput(hConIn,ir,1,&count); } } else if ((ir->EventType == MOUSE_EVENT && (ir->Event.MouseEvent.dwButtonState & MOUSEMASK))) { done = 1; retval = 1; } else /* Discard it, it's an insignificant event */ ReadConsoleInput(hConIn,ir,1,&count); } else /* There are no events in console event queue */ { done = 1; /* Stop looking */ retval = 0; } } return retval; } int __declspec(dllexport) __stdcall CheckInput(hConIn, ir, count, numpad, mode, mod, cc) HANDLE hConIn; INPUT_RECORD *ir; DWORD *count; boolean numpad; int mode; int *mod; coord *cc; { int ch; boolean valid = 0, done = 0; while (!done) { ReadConsoleInput(hConIn,ir,1,count); if (mode == 0) { if ((ir->EventType == KEY_EVENT) && ir->Event.KeyEvent.bKeyDown) { ch = ProcessKeystroke(hConIn, ir, &valid, numpad, 0); done = valid; } } else { if (count > 0) { if (ir->EventType == KEY_EVENT && ir->Event.KeyEvent.bKeyDown) { ch = ProcessKeystroke(hConIn, ir, &valid, numpad, 0); if (valid) return ch; } else if (ir->EventType == MOUSE_EVENT) { if ((ir->Event.MouseEvent.dwEventFlags == 0) && (ir->Event.MouseEvent.dwButtonState & MOUSEMASK)) { cc->x = ir->Event.MouseEvent.dwMousePosition.X + 1; cc->y = ir->Event.MouseEvent.dwMousePosition.Y - 1; if (ir->Event.MouseEvent.dwButtonState & LEFTBUTTON) *mod = CLICK_1; else if (ir->Event.MouseEvent.dwButtonState & RIGHTBUTTON) *mod = CLICK_2; #if 0 /* middle button */ else if (ir->Event.MouseEvent.dwButtonState & MIDBUTTON) *mod = CLICK_3; #endif return 0; } } } else done = 1; } } return mode ? 0 : ch; } int __declspec(dllexport) __stdcall SourceWhere(buf) char **buf; { if (!buf) return 0; *buf = where_to_get_source; return 1; } int __declspec(dllexport) __stdcall SourceAuthor(buf) char **buf; { if (!buf) return 0; *buf = author; return 1; } int __declspec(dllexport) __stdcall KeyHandlerName(buf, full) char **buf; int full; { if (!buf) return 0; if (full) *buf = dllname; else *buf = shortdllname; return 1; } slashem-0.0.7E7F3/sys/winnt/ntsound.c0000664000076400007640000000145710545462317015476 0ustar aliali/* SCCS Id: @(#)ntsound.c 3.4 $Date: 2003/03/12 11:15:16 $ */ /* Copyright (c) NetHack PC Development Team 1993 */ /* NetHack may be freely redistributed. See license for details. */ /* */ /* * ntsound.c - Windows NT NetHack sound support * *Edit History: * Initial Creation 93/12/11 * */ #include "hack.h" #include "win32api.h" #include #ifdef USER_SOUNDS void play_usersound(filename, volume) const char* filename; int volume; { /* pline("play_usersound: %s (%d).", filename, volume); */ (void)sndPlaySound(filename, SND_ASYNC | SND_NODEFAULT); } #endif /*USER_SOUNDS*/ /* ntsound.c */ slashem-0.0.7E7F3/sys/winnt/nttty.c0000664000076400007640000005712610545462317015172 0ustar aliali/* SCCS Id: @(#)nttty.c 3.4 $Date: 2003/12/11 09:49:08 $ */ /* Copyright (c) NetHack PC Development Team 1993 */ /* NetHack may be freely redistributed. See license for details. */ /* tty.c - (Windows NT) version */ /* * Initial Creation M. Allison 1993/01/31 * Switch to low level console output routines M. Allison 2003/10/01 * Restrict cursor movement until input pending M. Lehotay 2003/10/02 * */ #ifdef WIN32CON #define NEED_VARARGS /* Uses ... */ #include "hack.h" #include "wintty.h" #include #include #include "win32api.h" /* Some defines missing from early mingw32/cygwin wincon.h */ #if defined(__MINGW32__) && !defined(MOUSE_MOVED) #define FROM_LEFT_1ST_BUTTON_PRESSED 0x0001 #define RIGHTMOST_BUTTON_PRESSED 0x0002 #define FROM_LEFT_2ND_BUTTON_PRESSED 0x0004 #define FROM_LEFT_3RD_BUTTON_PRESSED 0x0008 #define FROM_LEFT_4TH_BUTTON_PRESSED 0x0010 #define MOUSE_MOVED 0x0001 #define DOUBLE_CLICK 0x0002 #define MOUSE_WHEELED 0x0004 #endif void FDECL(cmov, (int, int)); void FDECL(nocmov, (int, int)); int FDECL(process_keystroke, (INPUT_RECORD *, boolean *, BOOLEAN_P numberpad, int portdebug)); /* * The following WIN32 Console API routines are used in this file. * * CreateFile * GetConsoleScreenBufferInfo * GetStdHandle * SetConsoleCursorPosition * SetConsoleTextAttribute * SetConsoleCtrlHandler * PeekConsoleInput * ReadConsoleInput * WriteConsoleOutputCharacter * FillConsoleOutputAttribute */ /* Win32 Console handles for input and output */ HANDLE hConIn; HANDLE hConOut; /* Win32 Screen buffer,coordinate,console I/O information */ CONSOLE_SCREEN_BUFFER_INFO csbi, origcsbi; COORD ntcoord; INPUT_RECORD ir; /* [ALI] Flag for whether nttty_open() has been called. This is important * because we shouldn't call tty_ routines unless the tty interface is active * (nttty_open() is called by the tty interface initialization routine). */ static int TTYInitialized = FALSE; /* [ALI] Flag for whether hConIn is actually a console */ static DWORD cmode; /* Flag for whether NetHack was launched via the GUI, not the command line. * The reason we care at all, is so that we can get * a final RETURN at the end of the game when launched from the GUI * to prevent the scoreboard (or panic message :-|) from vanishing * immediately after it is displayed, yet not bother when started * from the command line. */ int GUILaunched; static BOOL FDECL(CtrlHandler, (DWORD)); #ifdef PORT_DEBUG static boolean display_cursor_info = FALSE; #endif extern boolean getreturn_enabled; /* from sys/share/pcsys.c */ /* dynamic keystroke handling .DLL support */ typedef int (__stdcall * PROCESS_KEYSTROKE)( HANDLE, INPUT_RECORD *, boolean *, BOOLEAN_P, int ); typedef int (__stdcall * NHKBHIT)( HANDLE, INPUT_RECORD * ); typedef int (__stdcall * CHECKINPUT)( HANDLE, INPUT_RECORD *, DWORD *, BOOLEAN_P, int, int *, coord * ); typedef int (__stdcall * SOURCEWHERE)( char ** ); typedef int (__stdcall * SOURCEAUTHOR)( char ** ); typedef int (__stdcall * KEYHANDLERNAME)( char **, int ); HANDLE hLibrary; PROCESS_KEYSTROKE pProcessKeystroke; NHKBHIT pNHkbhit; CHECKINPUT pCheckInput; SOURCEWHERE pSourceWhere; SOURCEAUTHOR pSourceAuthor; KEYHANDLERNAME pKeyHandlerName; #ifndef CLR_MAX #define CLR_MAX 16 #endif int ttycolors[CLR_MAX]; # ifdef TEXTCOLOR int ttycolors[CLR_MAX]; static void NDECL(init_ttycolor); # endif static void NDECL(really_move_cursor); #define MAX_OVERRIDES 256 unsigned char key_overrides[MAX_OVERRIDES]; static char nullstr[] = ""; char erase_char,kill_char; #define DEFTEXTCOLOR ttycolors[7] static WORD background = 0; static WORD foreground = (FOREGROUND_GREEN|FOREGROUND_BLUE|FOREGROUND_RED); static WORD attr = (FOREGROUND_GREEN|FOREGROUND_BLUE|FOREGROUND_RED); static DWORD ccount, acount; static COORD cursor = {0,0}; /* * 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 } /* reset terminal to original state */ void settty(s) const char *s; { cmov(ttyDisplay->curx, ttyDisplay->cury); end_screen(); if(s) raw_print(s); } /* called by init_nhwindows() and resume_nhwindows() */ void setftty() { start_screen(); } void tty_startup(wid, hgt) int *wid, *hgt; { int twid = origcsbi.srWindow.Right - origcsbi.srWindow.Left + 1; if (twid > 80) twid = 80; *wid = twid; *hgt = origcsbi.srWindow.Bottom - origcsbi.srWindow.Top + 1; set_option_mod_status("mouse_support", SET_IN_GAME); } 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(); really_move_cursor(); 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); } FlushConsoleInputBuffer(hConIn); } static BOOL CtrlHandler(ctrltype) DWORD ctrltype; { switch(ctrltype) { /* case CTRL_C_EVENT: */ case CTRL_BREAK_EVENT: clear_screen(); case CTRL_CLOSE_EVENT: case CTRL_LOGOFF_EVENT: case CTRL_SHUTDOWN_EVENT: getreturn_enabled = FALSE; #ifndef NOSAVEONHANGUP hangup(0); #endif #if 0 clearlocks(); terminate(EXIT_FAILURE); #endif default: return FALSE; } } /* * Check that we have valid standard I/O and allocate a console if not. * Called by nttty_open below and msmsg in pcsys.c for WIN32CON port. */ void nttty_check_stdio() { int fd = fileno(stdin); HWND wnd; HWND (*get_console_window)(VOID); MSG msg; if (fd < 0 || (HANDLE)_get_osfhandle(fd) == INVALID_HANDLE_VALUE) { CloseHandle((HANDLE)_get_osfhandle(fd)); close(fd); fd = fileno(stdout); CloseHandle((HANDLE)_get_osfhandle(fd)); close(fd); fd = fileno(stderr); CloseHandle((HANDLE)_get_osfhandle(fd)); close(fd); AllocConsole(); freopen("CONIN$", "r", stdin); freopen("CONOUT$", "w", stdout); freopen("CONOUT$", "w", stderr); setbuf(stderr, NULL); /* * If we were started by eg., explorer, then the new console * window will not have the focus and MS-Windows will continue * to wait for us to open a new window and start processing * events. We want our new console to become the foreground * window and for the cursor to return to normal (which we * achieve by calling PeekMessage so MS-Windows knows we have * started processing events). */ get_console_window = (HWND (*)(VOID)) GetProcAddress( GetModuleHandle("kernel32"), "GetConsoleWindow"); /* Win2K and above */ if (get_console_window) wnd = get_console_window(); else { /* This works, but is hardly ideal */ char buf[64]; sprintf(buf, "Slash'EM TTY - %lX", GetCurrentProcessId()); SetConsoleTitle(buf); wnd = FindWindow(NULL, buf); } SetConsoleTitle("Slash'EM TTY"); if (wnd) { SetForegroundWindow(wnd); PeekMessage(&msg, wnd, 0, 0, PM_NOREMOVE); } } } /* called by init_tty in wintty.c for WIN32CON port only */ void nttty_open() { HANDLE hStdOut; long mask; nttty_check_stdio(); /* The following 6 lines of code were suggested by * Bob Landau of Microsoft WIN32 Developer support, * as the only current means of determining whether * we were launched from the command prompt, or from * the NT program manager. M. Allison */ hStdOut = GetStdHandle( STD_OUTPUT_HANDLE ); if (GetConsoleScreenBufferInfo( hStdOut, &origcsbi)) GUILaunched = ((origcsbi.dwCursorPosition.X == 0) && (origcsbi.dwCursorPosition.Y == 0)); else { GUILaunched = 0; origcsbi.srWindow.Left = 0; origcsbi.srWindow.Right = 80; origcsbi.srWindow.Top = 0; origcsbi.srWindow.Bottom = 25; } if ((origcsbi.dwSize.X <= 0) || (origcsbi.dwSize.Y <= 0)) GUILaunched = 0; /* Obtain handles for the standard Console I/O devices */ hConIn = GetStdHandle(STD_INPUT_HANDLE); hConOut = GetStdHandle(STD_OUTPUT_HANDLE); #if 0 hConIn = CreateFile("CONIN$", GENERIC_READ |GENERIC_WRITE, FILE_SHARE_READ |FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0); hConOut = CreateFile("CONOUT$", GENERIC_READ |GENERIC_WRITE, FILE_SHARE_READ |FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,0); #endif if (!GetConsoleMode(hConIn,&cmode)) cmode = 0; #ifdef NO_MOUSE_ALLOWED mask = ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT | ENABLE_MOUSE_INPUT | ENABLE_ECHO_INPUT | ENABLE_WINDOW_INPUT; #else mask = ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT | ENABLE_WINDOW_INPUT; #endif /* Turn OFF the settings specified in the mask */ cmode &= ~mask; #ifndef NO_MOUSE_ALLOWED cmode |= ENABLE_MOUSE_INPUT; #endif if (!SetConsoleMode(hConIn,cmode)) /* Unable to set control mode */ cmode = 0; if (!SetConsoleCtrlHandler((PHANDLER_ROUTINE)CtrlHandler, TRUE)) /* Unable to set control handler */ cmode = 0; if (cmode) { load_keyboard_handler(); /* Initialize the function pointer that points to * the kbhit() equivalent, in this TTY case nttty_kbhit() */ nt_kbhit = nttty_kbhit; } get_scr_size(); cursor.X = cursor.Y = 0; really_move_cursor(); TTYInitialized = TRUE; } int process_keystroke(ir, valid, numberpad, portdebug) INPUT_RECORD *ir; boolean *valid; boolean numberpad; int portdebug; { int ch = pProcessKeystroke(hConIn, ir, valid, numberpad, portdebug); /* check for override */ if (ch && ch < MAX_OVERRIDES && key_overrides[ch]) ch = key_overrides[ch]; return ch; } int nttty_kbhit() { return pNHkbhit(hConIn, &ir); } void get_scr_size() { if (GetConsoleScreenBufferInfo(hConOut, &csbi)) { LI = csbi.srWindow.Bottom - (csbi.srWindow.Top + 1); CO = csbi.srWindow.Right - (csbi.srWindow.Left + 1); } else { LI = 25; CO = 80; } if ( (LI < 25) || (CO < 80) ) { COORD newcoord; LI = 25; CO = 80; newcoord.Y = LI; newcoord.X = CO; SetConsoleScreenBufferSize( hConOut, newcoord ); } } int tgetch() { int mod; coord cc; DWORD count; if (!cmode) { char c; return ReadFile(hConIn,&c,1,&count,NULL) && count ? c : EOF; } else { really_move_cursor(); return pCheckInput(hConIn, &ir, &count, iflags.num_pad, 0, &mod, &cc); } } int ntposkey(x, y, mod) int *x, *y, *mod; { int ch; coord cc; DWORD count; if (!cmode) { char ch; *mod = 0; return ReadFile(hConIn,&ch,1,&count,NULL) && count ? ch : '\032'; } else { really_move_cursor(); ch = pCheckInput(hConIn, &ir, &count, iflags.num_pad, 1, mod, &cc); if (!ch) { *x = cc.x; *y = cc.y; } return ch; } } static void really_move_cursor() { #if defined(PORT_DEBUG) && defined(WIZARD) char oldtitle[BUFSZ], newtitle[BUFSZ]; if (display_cursor_info && wizard) { oldtitle[0] = '\0'; if (GetConsoleTitle(oldtitle, BUFSZ)) { oldtitle[39] = '\0'; } Sprintf(newtitle, "%-55s tty=(%02d,%02d) nttty=(%02d,%02d)", oldtitle, ttyDisplay->curx, ttyDisplay->cury, cursor.X, cursor.Y); (void)SetConsoleTitle(newtitle); } #endif if (ttyDisplay) { cursor.X = ttyDisplay->curx; cursor.Y = ttyDisplay->cury; } SetConsoleCursorPosition(hConOut, cursor); } void cmov(x, y) register int x, y; { ttyDisplay->cury = y; ttyDisplay->curx = x; cursor.X = x; cursor.Y = y; } void nocmov(x, y) int x,y; { cursor.X = x; cursor.Y = y; ttyDisplay->curx = x; ttyDisplay->cury = y; } void xputc_core(ch) char ch; { switch(ch) { case '\n': cursor.Y++; /* fall through */ case '\r': cursor.X = 1; break; case '\b': cursor.X--; break; default: WriteConsoleOutputAttribute(hConOut,&attr,1, cursor,&acount); WriteConsoleOutputCharacter(hConOut,&ch,1, cursor,&ccount); cursor.X++; } } void xputc(ch) char ch; { cursor.X = ttyDisplay->curx; cursor.Y = ttyDisplay->cury; xputc_core(ch); } void xputs(s) const char *s; { int k; int slen = strlen(s); if (ttyDisplay) { cursor.X = ttyDisplay->curx; cursor.Y = ttyDisplay->cury; } if (s) { for (k=0; k < slen && s[k]; ++k) xputc_core(s[k]); } } /* * Overrides wintty.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; cursor.X = ttyDisplay->curx; cursor.Y = ttyDisplay->cury; WriteConsoleOutputAttribute(hConOut,&attr,1,cursor,&acount); WriteConsoleOutputCharacter(hConOut,&ch,1,cursor,&ccount); } void cl_end() { int cx; cursor.X = ttyDisplay->curx; cursor.Y = ttyDisplay->cury; cx = CO - cursor.X; FillConsoleOutputAttribute(hConOut, DEFTEXTCOLOR, cx, cursor, &acount); FillConsoleOutputCharacter(hConOut,' ', cx, cursor,&ccount); tty_curs(BASE_WINDOW, (int)ttyDisplay->curx+1, (int)ttyDisplay->cury); } 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); FillConsoleOutputCharacter(hConOut,' ', csbi.dwSize.X * csbi.dwSize.Y, newcoord, &ccnt); } home(); } void home() { if (TTYInitialized) { cursor.X = cursor.Y = 0; ttyDisplay->curx = ttyDisplay->cury = 0; } } void backsp() { cursor.X = ttyDisplay->curx; cursor.Y = ttyDisplay->cury; xputc_core('\b'); } void cl_eos() { int cy = ttyDisplay->cury+1; if (GetConsoleScreenBufferInfo(hConOut,&csbi)) { DWORD ccnt; COORD newcoord; newcoord.X = ttyDisplay->curx; newcoord.Y = ttyDisplay->cury; FillConsoleOutputAttribute(hConOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE, csbi.dwSize.X * csbi.dwSize.Y - cy, newcoord, &ccnt); FillConsoleOutputCharacter(hConOut,' ', csbi.dwSize.X * csbi.dwSize.Y - cy, newcoord, &ccnt); } tty_curs(BASE_WINDOW, (int)ttyDisplay->curx+1, (int)ttyDisplay->cury); } void tty_nhbell() { if (flags.silent) return; 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 */ } } # ifdef TEXTCOLOR /* * CLR_BLACK 0 * CLR_RED 1 * CLR_GREEN 2 * CLR_BROWN 3 low-intensity yellow * CLR_BLUE 4 * CLR_MAGENTA 5 * CLR_CYAN 6 * CLR_GRAY 7 low-intensity white * NO_COLOR 8 * CLR_ORANGE 9 * CLR_BRIGHT_GREEN 10 * CLR_YELLOW 11 * CLR_BRIGHT_BLUE 12 * CLR_BRIGHT_MAGENTA 13 * CLR_BRIGHT_CYAN 14 * CLR_WHITE 15 * CLR_MAX 16 * BRIGHT 8 */ static void init_ttycolor() { ttycolors[CLR_BLACK] = FOREGROUND_INTENSITY; /* fix by Quietust */ ttycolors[CLR_RED] = FOREGROUND_RED; ttycolors[CLR_GREEN] = FOREGROUND_GREEN; ttycolors[CLR_BROWN] = FOREGROUND_GREEN|FOREGROUND_RED; ttycolors[CLR_BLUE] = FOREGROUND_BLUE; ttycolors[CLR_MAGENTA] = FOREGROUND_BLUE|FOREGROUND_RED; ttycolors[CLR_CYAN] = FOREGROUND_GREEN|FOREGROUND_BLUE; ttycolors[CLR_GRAY] = FOREGROUND_GREEN|FOREGROUND_RED|FOREGROUND_BLUE; ttycolors[BRIGHT] = FOREGROUND_GREEN|FOREGROUND_BLUE|FOREGROUND_RED|\ FOREGROUND_INTENSITY; ttycolors[CLR_ORANGE] = FOREGROUND_RED|FOREGROUND_INTENSITY; ttycolors[CLR_BRIGHT_GREEN] = FOREGROUND_GREEN|FOREGROUND_INTENSITY; ttycolors[CLR_YELLOW] = FOREGROUND_GREEN|FOREGROUND_RED|\ FOREGROUND_INTENSITY; ttycolors[CLR_BRIGHT_BLUE] = FOREGROUND_BLUE|FOREGROUND_INTENSITY; ttycolors[CLR_BRIGHT_MAGENTA] = FOREGROUND_BLUE|FOREGROUND_RED|\ FOREGROUND_INTENSITY; ttycolors[CLR_BRIGHT_CYAN] = FOREGROUND_GREEN|FOREGROUND_BLUE|\ FOREGROUND_INTENSITY; ttycolors[CLR_WHITE] = FOREGROUND_GREEN|FOREGROUND_BLUE|FOREGROUND_RED|\ FOREGROUND_INTENSITY; } # endif /* TEXTCOLOR */ int has_color(int color) { # ifdef TEXTCOLOR return 1; # else if (color == CLR_BLACK) return 1; else if (color == CLR_WHITE) return 1; else return 0; # endif } void term_start_attr(int attrib) { switch(attrib){ case ATR_INVERSE: if (iflags.wc_inverse) { /* Suggestion by Lee Berger */ if ((foreground & (FOREGROUND_GREEN|FOREGROUND_BLUE|FOREGROUND_RED)) == (FOREGROUND_GREEN|FOREGROUND_BLUE|FOREGROUND_RED)) foreground &= ~(FOREGROUND_GREEN|FOREGROUND_BLUE|FOREGROUND_RED); background = (BACKGROUND_RED|BACKGROUND_BLUE|BACKGROUND_GREEN); break; } /*FALLTHRU*/ case ATR_ULINE: case ATR_BLINK: case ATR_BOLD: foreground |= FOREGROUND_INTENSITY; break; default: foreground &= ~FOREGROUND_INTENSITY; break; } attr = (foreground | background); } void term_end_attr(int attrib) { switch(attrib){ case ATR_INVERSE: if ((foreground & (FOREGROUND_GREEN|FOREGROUND_BLUE|FOREGROUND_RED)) == 0) foreground |= (FOREGROUND_GREEN|FOREGROUND_BLUE|FOREGROUND_RED); background = 0; break; case ATR_ULINE: case ATR_BLINK: case ATR_BOLD: foreground &= ~FOREGROUND_INTENSITY; break; } attr = (foreground | background); } void term_end_raw_bold(void) { term_end_attr(ATR_BOLD); } void term_start_raw_bold(void) { term_start_attr(ATR_BOLD); } void term_start_color(int color) { #ifdef TEXTCOLOR if (color >= 0 && color < CLR_MAX) { foreground = (background != 0 && (color == CLR_GRAY || color == CLR_WHITE)) ? ttycolors[0] : ttycolors[color]; } #else foreground = DEFTEXTCOLOR; #endif attr = (foreground | background); } void term_end_color(void) { #ifdef TEXTCOLOR foreground = DEFTEXTCOLOR; #endif attr = (foreground | background); } void standoutbeg() { term_start_attr(ATR_BOLD); } void standoutend() { term_end_attr(ATR_BOLD); } #ifndef NO_MOUSE_ALLOWED void toggle_mouse_support() { DWORD cmode; GetConsoleMode(hConIn,&cmode); if (iflags.wc_mouse_support) cmode |= ENABLE_MOUSE_INPUT; else cmode &= ~ENABLE_MOUSE_INPUT; SetConsoleMode(hConIn,cmode); } #endif /* handle tty options updates here */ void nttty_preference_update(pref) const char *pref; { if( stricmp( pref, "mouse_support")==0) { #ifndef NO_MOUSE_ALLOWED toggle_mouse_support(); #endif } return; } #ifdef PORT_DEBUG void win32con_debug_keystrokes() { DWORD count; boolean valid = 0; int ch; xputs("\n"); while (!valid || ch != 27) { nocmov(ttyDisplay->curx, ttyDisplay->cury); ReadConsoleInput(hConIn,&ir,1,&count); if ((ir.EventType == KEY_EVENT) && ir.Event.KeyEvent.bKeyDown) ch = process_keystroke(&ir, &valid, iflags.num_pad, 1); } (void)doredraw(); } void win32con_handler_info() { char *buf; int ci; if (!pSourceAuthor && !pSourceWhere) pline("Keyboard handler source info and author unavailable."); else { if (pKeyHandlerName && pKeyHandlerName(&buf, 1)) { xputs("\n"); xputs("Keystroke handler loaded: \n "); xputs(buf); } if (pSourceAuthor && pSourceAuthor(&buf)) { xputs("\n"); xputs("Keystroke handler Author: \n "); xputs(buf); } if (pSourceWhere && pSourceWhere(&buf)) { xputs("\n"); xputs("Keystroke handler source code available at:\n "); xputs(buf); } xputs("\nPress any key to resume."); ci=nhgetch(); (void)doredraw(); } } void win32con_toggle_cursor_info() { display_cursor_info = !display_cursor_info; } #endif void map_subkeyvalue(op) register char *op; { char digits[] = "0123456789"; int length, i, idx, val; char *kp; idx = -1; val = -1; kp = index(op, '/'); if (kp) { *kp = '\0'; kp++; length = strlen(kp); if (length < 1 || length > 3) return; for (i = 0; i < length; i++) if (!index(digits, kp[i])) return; val = atoi(kp); length = strlen(op); if (length < 1 || length > 3) return; for (i = 0; i < length; i++) if (!index(digits, op[i])) return; idx = atoi(op); } if (idx >= MAX_OVERRIDES || idx < 0 || val >= MAX_OVERRIDES || val < 1) return; key_overrides[idx] = val; } void load_keyboard_handler() { char suffx[] = ".dll"; char *truncspot; #define MAX_DLLNAME 25 char kh[MAX_ALTKEYHANDLER]; if (iflags.altkeyhandler[0]) { if (hLibrary) { /* already one loaded apparently */ FreeLibrary(hLibrary); hLibrary = (HANDLE)0; pNHkbhit = (NHKBHIT)0; pCheckInput = (CHECKINPUT)0; pSourceWhere = (SOURCEWHERE)0; pSourceAuthor = (SOURCEAUTHOR)0; pKeyHandlerName = (KEYHANDLERNAME)0; pProcessKeystroke = (PROCESS_KEYSTROKE)0; } if ((truncspot = strstri(iflags.altkeyhandler, suffx)) != 0) *truncspot = '\0'; (void) strncpy(kh, iflags.altkeyhandler, (MAX_ALTKEYHANDLER - sizeof suffx) - 1); kh[(MAX_ALTKEYHANDLER - sizeof suffx) - 1] = '\0'; Strcat(kh, suffx); Strcpy(iflags.altkeyhandler, kh); hLibrary = LoadLibrary(kh); if (hLibrary) { pProcessKeystroke = (PROCESS_KEYSTROKE) GetProcAddress (hLibrary, TEXT ("ProcessKeystroke")); pNHkbhit = (NHKBHIT) GetProcAddress (hLibrary, TEXT ("NHkbhit")); pCheckInput = (CHECKINPUT) GetProcAddress (hLibrary, TEXT ("CheckInput")); pSourceWhere = (SOURCEWHERE) GetProcAddress (hLibrary, TEXT ("SourceWhere")); pSourceAuthor = (SOURCEAUTHOR) GetProcAddress (hLibrary, TEXT ("SourceAuthor")); pKeyHandlerName = (KEYHANDLERNAME) GetProcAddress (hLibrary, TEXT ("KeyHandlerName")); } } if (!pProcessKeystroke || !pNHkbhit || !pCheckInput) { if (hLibrary) { FreeLibrary(hLibrary); hLibrary = (HANDLE)0; pNHkbhit = (NHKBHIT)0; pCheckInput = (CHECKINPUT)0; pSourceWhere = (SOURCEWHERE)0; pSourceAuthor = (SOURCEAUTHOR)0; pKeyHandlerName = (KEYHANDLERNAME)0; pProcessKeystroke = (PROCESS_KEYSTROKE)0; } (void)strncpy(kh, "nhdefkey.dll", (MAX_ALTKEYHANDLER - sizeof suffx) - 1); kh[(MAX_ALTKEYHANDLER - sizeof suffx) - 1] = '\0'; Strcpy(iflags.altkeyhandler, kh); hLibrary = LoadLibrary(kh); if (hLibrary) { pProcessKeystroke = (PROCESS_KEYSTROKE) GetProcAddress (hLibrary, TEXT ("ProcessKeystroke")); pCheckInput = (CHECKINPUT) GetProcAddress (hLibrary, TEXT ("CheckInput")); pNHkbhit = (NHKBHIT) GetProcAddress (hLibrary, TEXT ("NHkbhit")); pSourceWhere = (SOURCEWHERE) GetProcAddress (hLibrary, TEXT ("SourceWhere")); pSourceAuthor = (SOURCEAUTHOR) GetProcAddress (hLibrary, TEXT ("SourceAuthor")); pKeyHandlerName = (KEYHANDLERNAME) GetProcAddress (hLibrary, TEXT ("KeyHandlerName")); } } if (!pProcessKeystroke || !pNHkbhit || !pCheckInput) { if (!hLibrary) raw_printf("\nNetHack was unable to load keystroke handler.\n"); else { FreeLibrary(hLibrary); hLibrary = (HANDLE)0; raw_printf("\nNetHack keystroke handler is invalid.\n"); } exit(EXIT_FAILURE); } } /* this is used as a printf() replacement when the window * system isn't initialized yet */ void msmsg VA_DECL(const char *, fmt) char buf[ROWNO * COLNO]; /* worst case scenario */ VA_START(fmt); VA_INIT(fmt, const char *); Vsprintf(buf, fmt, VA_ARGS); VA_END(); nttty_check_stdio(); xputs(buf); if (ttyDisplay) curs(BASE_WINDOW, cursor.X+1, cursor.Y); return; } /* fatal error */ /*VARARGS1*/ void error VA_DECL(const char *,s) char buf[BUFSZ]; VA_START(s); VA_INIT(s, const char *); /* error() may get called before tty is initialized */ if (iflags.window_inited) end_screen(); buf[0] = '\n'; (void) vsprintf(&buf[1], s, VA_ARGS); VA_END(); msmsg(buf); really_move_cursor(); exit(EXIT_FAILURE); } void synch_cursor() { really_move_cursor(); } #endif /* WIN32CON */ slashem-0.0.7E7F3/sys/winnt/Makefile.nt0000664000076400007640000011214410545462317015714 0ustar aliali# SCCS Id: @(#)Makefile.nt 3.3 2000/08/01 # Copyright (c) NetHack PC Development Team 1993-2000 # # Slash'EM modifications by Lars Huttar and J. Ali Harlow. # # Slash'EM 0.0.7 Makefile for MS Visual C++ V4.x and above and MS NMAKE # # Win32 Compilers Tested (with NetHack 3.3): # - 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 Slash'EM using WIN32 Console # I/O routines only. It should be possible to build the GTK interface # using Microsoft C, but nobody has done this yet. See Makefile.gcc for # a starting point if you want to try this. # # 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 Install.nt file included with # the distribution. # # Michael Allison # #---------------------------------------------------------------------- # Do not delete the following 3 lines. # TARGETOS=BOTH APPVER=4.0 !include # # Set the gamedir according to your preference. It must be present prior # to compilation. GAME = slashem # Game Name GAMEDIR = d:\downloads\slashem\custbld # 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. # ($(MAKE) macro is often predefined, so we use $(MAKEBIN) instead.) # MAKEBIN = nmake # # 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 ######################################################################## ######################################################################## # # Nothing below this line should have to be changed. # RESFILE = $(GAME).res #Do not uncomment these for 0.0.7 #TILEGAME = $(OBJ)\tile.o #TILEDEF = -DTILES #TILEHDR = #SOUND = $(OBJ)\ntsound.o #SOUND = #TILEUTIL = #TILEBMP = #TILEGAME = #TILEDEF = #TILEHDR = # # Uncomment the line below if you want to store all the level files, # help files, etc. in a single library file. USE_DLB = Y ! IF ("$(USE_DLB)"=="Y") DLBFLG = -DDLB ! ELSE DLBFLG = ! ENDIF # You can actually build a set of tiles with this makefile # even though they are not used. # Use 'nmake o\nhtiles.bmp' # TILEUTIL = $(UTIL)\tile2bmp.exe TILEBMP = $(OBJ)\nhtiles.bmp # # - Util builds # CFLAGSU = -c $(cflags) $(cvars) -I$(INCL) -nologo $(cdebug) \ $(TILEDEF) $(DLBFLG) LFLAGSU = $(linkdebug) $(conflags) # # - Game build # # CFLAGSG = $(CFLAGSU) #LFLAGSG = $(guiflags) $(linkdebug) -IGNORE:505 $(guilibs) comct132.lib LFLAGSG = $(conflags) $(linkdebug) -IGNORE:505 $(conlibs) comct132.lib GAMEFILE = $(GAMEDIR)\$(GAME).exe # whole thing # This line should not be deleted. NTSUB = -DWIN32CON ! IF ("$(USE_DLB)"=="Y") DLB = $(DAT)\nhshare $(DAT)\nhushare ! ELSE DLB = ! ENDIF # # Make Rules. # .SUFFIXES: .exe .o .til .uu .c .y .l # # Rules for files in src # .c{$(OBJ)}.o: @$(cc) $(CFLAGSG) $(NTSUB) -Fo$@ $< {$(SRC)}.c{$(OBJ)}.o: @$(cc) $(CFLAGSG) $(NTSUB) -Fo$@ $< # # Rules for files in sys\share # {$(SSYS)}.c{$(OBJ)}.o: @$(cc) $(CFLAGSG) -Fo$@ $< # # Rules for files in sys\winnt # {$(NTSYS)}.c{$(OBJ)}.o: @$(cc) $(CFLAGSG) -Fo$@ $< {$(NTSYS)}.h{$(INCL)}.h: @copy $< $@ # # Rules for files in util # {$(UTIL)}.c{$(OBJ)}.o: @$(cc) $(CFLAGSU) $(NTSUB) -Fo$@ $< # # Rules for files in win\share # {$(WSHR)}.c{$(OBJ)}.o: @$(cc) $(CFLAGSG) -Fo$@ $< {$(WSHR)}.h{$(INCL)}.h: @copy $< $@ #{$(WSHR)}.txt{$(DAT)}.txt: # @copy $< $@ # # Rules for files in win\tty # {$(TTY)}.c{$(OBJ)}.o: @$(cc) $(CFLAGSG) -Fo$@ $< # # Rules for files in win\win32 # {$(WIN32)}.c{$(OBJ)}.o: @$(cc) $(CFLAGSG) -Fo$@ $< # # NETHACK OBJECTS # # 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)^\ W = $(WIN32)^\ # # 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 # # These are not invoked during a normal game build in 3.3.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 TILEFILES = $(WSHR)\monsters.txt $(WSHR)\objects.txt $(WSHR)\other.txt # # 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)main.o $(O)makemon.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 VOBJ28 = $(O)gypsy.o $(O)tech.o DLBOBJ = $(O)dlb.o TTYOBJ = $(O)topl.o $(O)getline.o $(O)wintty.o #WOBJ = $(O)nhprocs.o $(O)winmain.o $(O)win32msg.o WOBJ = SOBJ = $(O)winnt.o $(O)sys.o $(O)nttty.o $(O)unix.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) $(VOBJ28) $(DLBOBJ) TILOBJ = $(TILEGAME) VVOBJ = $(O)version.o ALLOBJ = $(TILOBJ) $(SOBJ) $(DLBOBJ) $(TTYOBJ) $(WOBJ) $(OBJS) $(VVOBJ) # # Header objects # #NTCONF_H = $(INCL)\ntwarn.h $(INCL)\ntconf.h $(INCL)\micro.h \ NTCONF_H = $(INCL)\ntconf.h $(INCL)\micro.h \ $(INCL)\system.h $(INCL)\config.h PERMONST_H = $(INCL)\monattk.h $(INCL)\monflag.h YOUPROP_H = $(INCL)\prop.h $(PERMONST_H) $(INCL)\pm.h YOU_H = $(INCL)\attrib.h $(INCL)\monst.h $(YOUPROP_H) DECL_H = $(INCL)\quest.h $(INCL)\spell.h $(INCL)\color.h \ $(INCL)\obj.h $(YOU_H) $(INCL)\onames.h CONFIG_H = $(INCL)\tradstdc.h $(INCL)\coord.h $(NTCONF_H) HACK_H = $(CONFIG_H) $(INCL)\dungeon.h $(INCL)\align.h $(INCL)\monsym.h \ $(INCL)\mkroom.h $(INCL)\objclass.h $(DECL_H) $(INCL)\trap.h \ $(INCL)\flag.h $(INCL)\rm.h $(INCL)\vision.h $(INCL)\mondata.h \ $(INCL)\wintype.h $(INCL)\engrave.h $(INCL)\rect.h \ $(INCL)\winprocs.h $(INCL)\trampoli.h \ $(INCL)\align.h TILE_H = ..\win\share\tile.h $(TILEHDR) ALIGN_H = $(INCL)\align.h ARTIFACT_H = $(INCL)\artifact.h ARTILIST_H = $(INCL)\artilist.h COLOR_H = $(INCL)\color.h DATE_H = $(INCL)\date.h DLB_H = $(INCL)\dlb.h DGN_FILE_H = $(INCL)\dgn_file.h EGYP_H = $(INCL)\egyp.h EMIN_H = $(INCL)\emin.h EPRI_H = $(INCL)\epri.h ESHK_H = $(INCL)\eshk.h EDOG_H = $(INCL)\edog.h FUNC_TAB_H = $(INCL)\func_tab.h LEV_H = $(INCL)\lev.h LEV_COMP_H = $(INCL)\lev_comp.h MAIL_H = $(INCL)\mail.h MFNDPOS_H = $(INCL)\mfndpos.h MONSYM_H = $(INCL)\monsym.h NHLAN_H = $(INCL)\nhlan.h OBJ_H = $(INCL)\obj.h OBJCLASS_H = $(INCL)\objclass.h OBJECTS_H = $(INCL)\objects.h PROP_H = $(INCL)\prop.h QTEXT_H = $(INCL)\qtext.h QUEST_H = $(INCL)\quest.h SKILLS_H = $(INCL)\skills.h SP_LEV_H = $(INCL)\sp_lev.h TERMCAP_H = $(INCL)\tcap.h VAULT_H = $(INCL)\vault.h VIS_TAB_H = $(INCL)\vis_tab.h WINTTY_H = $(INCL)\wintty.h WIN32API_H = $(INCL)\win32api.h WIN32_H = $(INCL)\nhwin32.h PATCHLEVEL_H = $(INCL)\patchlevel.h 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 $(TILEBMP) 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 $(DAT)\nhshare $(GAMEDIR) copy $(DAT)\nhushare $(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)\$(GAME).txt copy $(DOC)\$(GAME).txt $(GAMEDIR)\$(GAME).txt if exist $(DOC)\recover.txt copy $(DOC)\recover.txt $(GAMEDIR)\recover.txt if exist $(DOC)\readme.txt copy $(DOC)\readme.txt $(GAMEDIR)\readme.txt if exist $(DOC)\slamfaq.txt copy $(DOC)\slamfaq.txt $(GAMEDIR)\slamfaq.txt if exist $(DOC)\history.txt copy $(DOC)\history.txt $(GAMEDIR)\history.txt @if exist $(SRC)\$(GAME).PDB copy $(SRC)\$(GAME).pdb $(GAMEDIR)\$(GAME).pdb @if exist $(SRC)\$(GAME).PDB echo NOTE: You may want to remove $(GAMEDIR)\$(GAME).pdb to conserve space -copy $(NTSYS)\winnt.cnf $(GAMEDIR)\$(GAME).cnf copy $(U)recover.exe $(GAMEDIR) ! IF ("$(TILEDEF)"!="") if exist $(TILEBMP) copy $(TILEBMP) $(GAMEDIR) ! ENDIF 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)\beholder.des $(DAT)\blkmar.des $(DAT)\grund.des \ $(DAT)\dragons.des $(DAT)\flame.des $(DAT)\frnknstn.des\ $(DAT)\giants.des $(DAT)\guild.des $(DAT)\ice.des \ $(DAT)\lich.des $(DAT)\mall-1.des $(DAT)\mall-2.des \ $(DAT)\mines.des $(DAT)\mtemple.des $(DAT)\newmall.des \ $(DAT)\necro.des $(DAT)\nightmar.des $(DAT)\nymph.des \ $(DAT)\kobold-1.des $(DAT)\kobold-2.des $(DAT)\rats.des \ $(DAT)\sea.des $(DAT)\slayer.des $(DAT)\spiders.des \ $(DAT)\stor-1.des $(DAT)\stor-2.des $(DAT)\stor-3.des \ $(DAT)\tomb.des $(DAT)\yeoman.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 beholder.des $(U)lev_comp blkmar.des $(U)lev_comp grund.des $(U)lev_comp dragons.des $(U)lev_comp flame.des $(U)lev_comp frnknstn.des $(U)lev_comp giants.des $(U)lev_comp guild.des $(U)lev_comp ice.des $(U)lev_comp kobold-1.des $(U)lev_comp kobold-2.des $(U)lev_comp lich.des $(U)lev_comp mall-1.des $(U)lev_comp mall-2.des $(U)lev_comp mtemple.des $(U)lev_comp necro.des $(U)lev_comp newmall.des $(U)lev_comp nightmar.des $(U)lev_comp nymph.des $(U)lev_comp rats.des $(U)lev_comp sea.des $(U)lev_comp slayer.des $(U)lev_comp spiders.des $(U)lev_comp stor-1.des $(U)lev_comp stor-2.des $(U)lev_comp stor-3.des $(U)lev_comp tomb.des $(U)lev_comp yeoman.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 \ $(INCL)\filename.h \ $(U)lev_comp.exe $(VIS_TAB_H) \ $(U)dgn_comp.exe $(U)recover.exe $(TILEUTIL) @echo utilities made >$@ @echo utilities made. tileutil: $(U)gif2txt.exe $(U)txt2ppm.exe @echo Optional tile development utilities are up to date. # 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! # # # The main target. # $(GAMEFILE) : $(RESFILE) $(ALLOBJ) @echo Linking.... @$(link) $(LFLAGSG) -out:$@ @<<$(GAME).lnk $(ALLOBJ:^ =^ ) $(RESFILE) $(conlibs) << @if exist $(O)install.tag del $(O)install.tag @if exist $(GAMEDIR)\$(GAME).bak del $(GAMEDIR)\$(GAME).bak $(RESFILE) : $(GAME).rc $(GAME)_.ico $(WIN32API_H) $(INCL)\nhwin32.h rc -r $(GAME).rc $(GAME)_.ico : $(NTSYS)\$(GAME).ico @copy $(NTSYS)\$(GAME).ico $@ $(GAME).rc : $(WIN32)\nhwin32.rc @copy $(WIN32)\nhwin32.rc $@ # # Secondary Targets. # # # Makedefs Stuff # $(U)makedefs.exe: $(MAKEOBJS) @$(link) $(LFLAGSU) -out:$@ $(MAKEOBJS) $(conlibs) $(O)makedefs.o: $(CONFIG_H) $(PERMONST_H) $(OBJCLASS_H) \ $(MONSYM_H) $(QTEXT_H) $(PATCHLEVEL_H) \ $(U)makedefs.c @$(cc) $(CFLAGSU) $(NTSUB) -Fo$@ $(U)makedefs.c # # date.h should be remade every time any of the source or include # files is modified. # $(INCL)\date.h : $(U)makedefs.exe $(U)makedefs -v $(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 $(INCL)\filename.h: $(U)makedefs.exe $(U)makedefs -f # # Level Compiler Stuff # #LEVCFLAGS=-c -nologo -DWINVER=0x0400 -DWIN32 -D_WIN32 -D_MT -MT -I..\include -nologo -Z7 -Od -DDLB LEVCFLAGS= $(CFLAGSU) $(U)lev_comp.exe: $(SPLEVOBJS) @echo Linking $@... @$(link) $(LFLAGSU) -out:$@ @<<$(@B).lnk $(SPLEVOBJS:^ =^ ) $(conlibs) << $(O)lev_yacc.o: $(HACK_H) $(SP_LEV_H) $(INCL)\lev_comp.h $(U)lev_yacc.c @$(cc) $(LEVCFLAGS) -W0 $(NTSUB) -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 $(NTSUB) -Fo$@ $(U)lev_$(LEX).c $(O)lev_main.o: $(U)lev_main.c $(HACK_H) $(SP_LEV_H) @$(cc) $(LEVCFLAGS) -W0 $(NTSUB) -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 Stuff # $(U)dgn_comp.exe: $(DGNCOMPOBJS) @echo Linking $@... @$(link) $(LFLAGSU) -out:$@ @<<$(@B).lnk $(DGNCOMPOBJS:^ =^ ) $(conlibs) << $(O)dgn_yacc.o: $(HACK_H) $(DGN_FILE_H) $(INCL)\dgn_comp.h $(U)dgn_yacc.c @$(cc) $(LEVCFLAGS) -W0 $(NTSUB) -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 $(NTSUB) -Fo$@ $(U)dgn_$(LEX).c $(O)dgn_main.o: $(HACK_H) $(U)dgn_main.c @$(cc) $(LEVCFLAGS) -W0 $(NTSUB) -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 $(O)obj.tag: @if not exist $(O)*.* mkdir $(OBJ) @echo directory $(OBJ) created >$@ # # envchk: ! IF "$(CL)"!="" @echo Warning, the CL Environment variable is defined: @echo CL=$(CL) ! ENDIF ! IF "$(TILEGAME)"!="" @echo ---- @echo NOTE: This build will include tile support. @echo ---- ! ENDIF # # SECONDARY TARGETS # # # Header files NOT distributed in ..\include # $(INCL)\nhwin32.h: $(WIN32)\nhwin32.h copy $(WIN32)\nhwin32.h $@ $(INCL)\win32api.h: $(NTSYS)\win32api.h copy $(NTSYS)\win32api.h $@ #$(INCL)\ntwarn.h: $(NTSYS)\ntwarn.h # copy $(NTSYS)\ntwarn.h $@ #$(INCL)\pctiles.h: $(NTSYS)\pctiles.h # copy $(NTSYS)\pctiles.h $@ #$(INCL)\pcvideo.h: $(NTSYS)\pcvideo.h # copy $(NTSYS)\pcvideo.h $@ # # Recover Utility # $(U)recover.exe: $(RECOVOBJS) @$(link) $(LFLAGSU) -out:$@ $(RECOVOBJS) $(conlibs) # # 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 $(conlibs) $(O)tilemap.o: $(WSHR)\tilemap.c $(HACK_H) @$(cc) $(CFLAGSU) $(NTSUB) -Fo$@ $(WSHR)\tilemap.c # # Tile Utilities # # # Optional (for development) # $(U)gif2txt.exe: $(GIFREADERS) $(TEXT_IO) @echo Linking $@... @$(link) $(LFLAGSU) -out:$@ @<<$(@B).lnk $(GIFREADERS:^ =^ ) $(TEXT_IO:^ =^ ) $(conlibs) << $(U)txt2ppm.exe: $(PPMWRITERS) $(TEXT_IO) @echo Linking $@... @$(link) $(LFLAGSU) -out:$@ @<<$(@B).lnk $(PPMWRITERS:^ =^ ) $(TEXT_IO:^ =^ ) $(conlibs) << # # Required for tile support # $(TILEBMP): $(TILEUTIL) $(TILEFILES) @echo Creating binary tile files (this may take some time) @$(U)tile2bmp $(TILEBMP) $(U)tile2bmp.exe: $(O)tile2bmp.o $(TEXT_IO) @echo Linking $@... @$(link) $(LFLAGSU) -out:$@ @<<$(@B).lnk $(O)tile2bmp.o $(TEXT_IO:^ =^ ) $(conlibs) << $(O)tile2bmp.o: $(WIN32)\tile2bmp.c $(HACK_H) $(TILE_H) $(WIN32API_H) @$(cc) $(CFLAGSG) -I$(WSHR) $(NTSUB) /DPACKED_FILE /Fo$@ $(WIN32)\tile2bmp.c # # DLB stuff # nhdat: $(U)dlb_main.exe $(DAT)\data $(DAT)\oracles $(DAT)\options \ $(DAT)\quest.dat $(DAT)\rumors $(DAT)\help $(DAT)\hh $(DAT)\cmdhelp \ $(DAT)\history $(DAT)\opthelp $(DAT)\wizhelp $(DAT)\dungeon \ $(DAT)\license $(O)sp_lev.tag cd $(DAT) echo data >dlb.lst echo oracles >>dlb.lst echo options >>dlb.lst echo quest.dat >>dlb.lst echo rumors >>dlb.lst echo help >>dlb.lst echo hh >>dlb.lst echo cmdhelp >>dlb.lst echo history >>dlb.lst echo opthelp >>dlb.lst echo wizhelp >>dlb.lst echo dungeon >>dlb.lst echo license >>dlb.lst for %%N in (*.lev) do echo %%N >>dlb.lst $(U)dlb_main cIf dlb.lst $(SRC)\nhdat cd $(SRC) $(DAT)\nhshare: $(U)dlb_main.exe $(DAT)\data $(DAT)\oracles $(DAT)\options \ $(DAT)\rumors $(DAT)\help $(DAT)\hh $(DAT)\cmdhelp \ $(DAT)\history $(DAT)\opthelp $(DAT)\wizhelp $(DAT)\gypsy.txt \ $(DAT)\license cd $(DAT) echo data >dlb.lst echo oracles >>dlb.lst echo options >>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 gypsy.txt >>dlb.lst echo license >>dlb.lst $(U)dlb_main cIf dlb.lst $(SRC)\nhdat cd $(SRC) $(DAT)\nhushare: $(U)dlb_main.exe $(DAT)\quest.dat \ $(DAT)\dungeon $(O)sp_lev.tag cd $(DAT) echo quest.dat >>dlb.lst echo dungeon >>dlb.lst for %%N in (*.lev) do echo %%N >>dlb.lst $(U)dlb_main cIf dlb.lst nhushare cd $(SRC) $(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 $(conlibs) << $(O)dlb.o: $(O)dlb_main.o $(O)alloc.o $(O)panic.o $(DLB_H) @$(cc) $(CFLAGSG) $(NTSUB) /Fo$@ $(SRC)\dlb.c $(O)dlb_main.o: $(UTIL)\dlb_main.c $(INCL)\config.h $(DLB_H) @$(cc) $(CFLAGSG) $(NTSUB) /Fo$@ $(UTIL)\dlb_main.c # # Housekeeping # spotless: clean rmdir $(OBJ) if exist $(DATE_H) del $(DATE_H) if exist $(INCL)\onames.h del $(INCL)\onames.h if exist $(INCL)\pm.h del $(INCL)\pm.h if exist $(VIS_TAB_H) del $(VIS_TAB_H) if exist $(SRC)\vis_tab.c del $(SRC)\vis_tab.c if exist $(SRC)\tile.c del $(SRC)\tile.c if exist $(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)\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 clean: if exist $(O)*.o del $(O)*.o if exist $(O)*.tag del $(O)*.tag 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 ("$(TILEDEF)"!="") if exist $(TILEBMP) del $(TILEBMP) ! 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) # # Util Dependencies. # $(O)panic.o: $(U)panic.c $(CONFIG_H) @$(cc) $(CFLAGSG) $(NTSUB) -Fo$@ $(U)panic.c $(O)recover.o: $(CONFIG_H) $(U)recover.c $(INCL)\win32api.h @$(cc) $(CFLAGSU) $(NTSUB) -Fo$@ $(U)recover.c # # from win\share # $(O)tiletxt.o: $(WSHR)\tilemap.c $(HACK_H) @$(cc) $(CFLAGSG) $(NTSUB) /DTILETEXT -Fo$@ $(WSHR)\tilemap.c $(O)gifread.o: $(WSHR)\gifread.c $(CONFIG_H) $(TILE_H) @$(cc) $(CFLAGSG) -I$(WSHR) $(NTSUB) -Fo$@ $(WSHR)\gifread.c $(O)ppmwrite.o: $(WSHR)\ppmwrite.c $(CONFIG_H) $(TILE_H) @$(cc) $(CFLAGSG) -I$(WSHR) $(NTSUB) -Fo$@ $(WSHR)\ppmwrite.c $(O)tiletext.o: $(WSHR)\tiletext.c $(CONFIG_H) $(TILE_H) @$(cc) $(CFLAGSG) -I$(WSHR) $(NTSUB) -Fo$@ $(WSHR)\tiletext.c # # from win\tty # $(O)getline.o: $(TTY)\getline.c $(HACK_H) $(WINTTY_H) $(INCL)\func_tab.h @$(CC) $(CFLAGSG) $(NTSUB) -Fo$@ $(TTY)\getline.c $(O)termcap.o: $(TTY)\termcap.c $(HACK_H) $(WINTTY_H) $(INCL)\tcap.h @$(CC) $(CFLAGSG) $(NTSUB) -Fo$@ $(TTY)\termcap.c $(O)topl.o: $(TTY)\topl.c $(HACK_H) $(WINTTY_H) $(INCL)\tcap.h @$(CC) $(CFLAGSG) $(NTSUB) -Fo$@ $(TTY)\topl.c $(O)wintty.o: $(CONFIG_H) $(TTY)\wintty.c $(WINTTY_H) $(INCL)\dlb.h \ $(INCL)\patchlevel.h $(INCL)\tcap.h @$(CC) $(CFLAGSG) $(NTSUB) -Fo$@ $(TTY)\wintty.c # # from win\win32 # $(O)nhprocs.o: $(WIN32)\nhprocs.c $(HACK_H) $(WIN32_H) \ $(FUNC_TAB_H) $(WIN32API_H) @$(cc) $(CFLAGSG) $(NTSUB) -Fo$@ $(WIN32)\nhprocs.c $(O)winmain.o: $(WIN32)\winmain.c $(HACK_H) $(WIN32_H) $(WIN32API_H) @$(cc) $(CFLAGSG) $(NTSUB) -Fo$@ $(WIN32)\winmain.c $(O)win32msg.o: $(WIN32)\win32msg.c $(HACK_H) $(WIN32_H) $(WIN32API_H) @$(cc) $(CFLAGSG) $(NTSUB) -Fo$@ $(WIN32)\win32msg.c # # from sys\share # $(O)main.o: $(SSYS)\pcmain.c $(HACK_H) $(WIN32API_H) $(INCL)\dlb.h @$(CC) $(CFLAGSG) $(NTSUB) -Fo$@ $(SSYS)\pcmain.c $(O)sys.o: $(SSYS)\pcsys.c $(HACK_H) @$(CC) $(CFLAGSG) $(NTSUB) -Fo$@ $(SSYS)\pcsys.c #$(O)tty.o: $(SSYS)\pctty.c $(HACK_H) $(WINTTY_H) # @$(CC) $(CFLAGSG) $(NTSUB) -Fo$@ $(SSYS)\pctty.c $(O)unix.o: $(SSYS)\pcunix.c $(HACK_H) @$(CC) $(CFLAGSG) $(NTSUB) -Fo$@ $(SSYS)\pcunix.c $(O)random.o: $(SSYS)\random.c $(HACK_H) @$(CC) $(CFLAGSG) $(NTSUB) -Fo$@ $(SSYS)\random.c $(O)nhlan.o: $(HACK_H) $(NHLAN_H) $(SSYS)\nhlan.c @$(cc) $(CFLAGSG) $(NTSUB) -Fo$@ $(SSYS)\nhlan.c # # from sys\winnt # $(O)nttty.o: $(NTSYS)\nttty.c $(HACK_H) $(WINTTY_H) \ $(TILE_H) $(WIN32API_H) @$(cc) $(CFLAGSG) -I$(WSHR) $(NTSUB) -Fo$@ $(NTSYS)\nttty.c $(O)winnt.o: $(NTSYS)\winnt.c $(HACK_H) $(WIN32API_H) @$(cc) $(CFLAGSG) $(NTSUB) -Fo$@ $(NTSYS)\winnt.c $(O)ntsound.o: $(NTSYS)\ntsound.c $(HACK_H) @$(cc) $(CFLAGSG) $(NTSUB) -Fo$@ $(NTSYS)\ntsound.c $(O)mapimail.o: $(NTSYS)\mapimail.c $(HACK_H) $(NHLAN_H) @$(cc) $(CFLAGSG) -DMAPI_VERBOSE $(NTSUB) -Fo$@ $(NTSYS)\mapimail.c # # from src # #$(O)alloc.o: $(SRC)\alloc.c $(CONFIG_H) # @$(cc) $(CFLAGSG) $(NTSUB) -Fo$@ $(SRC)\alloc.c #$(O)end.o: $(SRC)\end.c $(HACK_H) $(ESHK_H) $(DLB_H) # @$(cc) $(CFLAGSG) $(NTSUB) -Fo$@ $(SRC)\end.c #$(O)version.o: $(SRC)\version.c $(HACK_H) $(DATE_H) $(PATCHLEVEL_H) # @$(cc) $(CFLAGSG) $(NTSUB) -Fo$@ $(SRC)\version.c #$(O)vis_tab.o: $(SRC)\vis_tab.c $(HACK_H) $(VIS_TAB_H) # @$(cc) $(CFLAGSG) $(NTSUB) -Fo$@ $(SRC)\vis_tab.c $(O)allmain.o: $(SRC)\allmain.c $(HACK_H) $(O)alloc.o: $(SRC)\alloc.c $(CONFIG_H) $(O)apply.o: $(SRC)\apply.c $(HACK_H) $(INCL)\edog.h $(O)artifact.o: $(SRC)\artifact.c $(HACK_H) $(INCL)\artifact.h $(INCL)\artilist.h $(O)attrib.o: $(SRC)\attrib.c $(HACK_H) $(INCL)\artifact.h $(O)ball.o: $(SRC)\ball.c $(HACK_H) $(O)bones.o: $(SRC)\bones.c $(HACK_H) $(INCL)\lev.h $(O)botl.o: $(SRC)\botl.c $(HACK_H) $(O)cmd.o: $(SRC)\cmd.c $(HACK_H) $(INCL)\func_tab.h $(O)dbridge.o: $(SRC)\dbridge.c $(HACK_H) $(O)decl.o: $(SRC)\decl.c $(HACK_H) $(O)detect.o: $(SRC)\detect.c $(HACK_H) $(INCL)\artifact.h $(O)dig.o: $(SRC)\dig.c $(HACK_H) $(INCL)\edog.h $(O)display.o: $(SRC)\display.c $(HACK_H) $(O)dlb.o: $(SRC)\dlb.c $(CONFIG_H) $(INCL)\dlb.h $(O)do.o: $(SRC)\do.c $(HACK_H) $(INCL)\lev.h $(O)do_name.o: $(SRC)\do_name.c $(HACK_H) $(O)do_wear.o: $(SRC)\do_wear.c $(HACK_H) $(O)dog.o: $(SRC)\dog.c $(HACK_H) $(INCL)\edog.h $(O)dogmove.o: $(SRC)\dogmove.c $(HACK_H) $(INCL)\mfndpos.h $(INCL)\edog.h $(O)dokick.o: $(SRC)\dokick.c $(HACK_H) $(INCL)\eshk.h $(O)dothrow.o: $(SRC)\dothrow.c $(HACK_H) $(O)drawing.o: $(SRC)\drawing.c $(HACK_H) $(INCL)\tcap.h $(O)dungeon.o: $(SRC)\dungeon.c $(HACK_H) $(INCL)\dgn_file.h $(INCL)\dlb.h $(O)eat.o: $(SRC)\eat.c $(HACK_H) $(O)end.o: $(SRC)\end.c $(HACK_H) $(INCL)\eshk.h $(INCL)\dlb.h $(O)engrave.o: $(SRC)\engrave.c $(HACK_H) $(INCL)\lev.h $(O)exper.o: $(SRC)\exper.c $(HACK_H) $(O)explode.o: $(SRC)\explode.c $(HACK_H) $(O)extralev.o: $(SRC)\extralev.c $(HACK_H) $(O)files.o: $(SRC)\files.c $(HACK_H) $(INCL)\dlb.h $(INCL)\filename.h $(O)fountain.o: $(SRC)\fountain.c $(HACK_H) $(O)gypsy.o: $(SRC)\gypsy.c $(HACK_H) $(EGYP_H) $(INCL)\qtext.h $(O)hack.o: $(SRC)\hack.c $(HACK_H) $(O)hacklib.o: $(SRC)\hacklib.c $(HACK_H) $(O)invent.o: $(SRC)\invent.c $(HACK_H) $(INCL)\artifact.h $(O)light.o: $(SRC)\light.c $(HACK_H) $(INCL)\lev.h $(O)lock.o: $(SRC)\lock.c $(HACK_H) $(O)mail.o: $(SRC)\mail.c $(HACK_H) $(INCL)\mail.h $(O)makemon.o: $(SRC)\makemon.c $(HACK_H) $(INCL)\epri.h $(INCL)\emin.h \ $(INCL)\edog.h $(O)mcastu.o: $(SRC)\mcastu.c $(HACK_H) $(O)mhitm.o: $(SRC)\mhitm.c $(HACK_H) $(INCL)\artifact.h $(INCL)\edog.h $(O)mhitu.o: $(SRC)\mhitu.c $(HACK_H) $(INCL)\artifact.h $(INCL)\edog.h $(O)minion.o: $(SRC)\minion.c $(HACK_H) $(INCL)\emin.h $(INCL)\epri.h $(O)mklev.o: $(SRC)\mklev.c $(HACK_H) $(O)mkmap.o: $(SRC)\mkmap.c $(HACK_H) $(INCL)\sp_lev.h $(O)mkmaze.o: $(SRC)\mkmaze.c $(HACK_H) $(INCL)\sp_lev.h $(INCL)\lev.h $(O)mkobj.o: $(SRC)\mkobj.c $(HACK_H) $(INCL)\artifact.h $(O)mkroom.o: $(SRC)\mkroom.c $(HACK_H) $(O)mon.o: $(SRC)\mon.c $(HACK_H) $(INCL)\mfndpos.h $(INCL)\edog.h $(O)mondata.o: $(SRC)\mondata.c $(HACK_H) $(INCL)\eshk.h $(INCL)\epri.h $(O)monmove.o: $(SRC)\monmove.c $(HACK_H) $(INCL)\mfndpos.h $(INCL)\artifact.h $(O)monst.o: $(SRC)\monst.c $(CONFIG_H) $(INCL)\permonst.h $(INCL)\align.h \ $(INCL)\monattk.h $(INCL)\monflag.h $(INCL)\monsym.h \ $(INCL)\dungeon.h $(INCL)\eshk.h $(INCL)\vault.h \ $(INCL)\epri.h $(INCL)\egyp.h $(INCL)\color.h $(O)monstr.o: $(SRC)\monstr.c $(CONFIG_H) $(O)mplayer.o: $(SRC)\mplayer.c $(HACK_H) $(O)mthrowu.o: $(SRC)\mthrowu.c $(HACK_H) $(O)muse.o: $(SRC)\muse.c $(HACK_H) $(INCL)\edog.h $(O)music.o: $(SRC)\music.c $(HACK_H) #interp.c $(O)o_init.o: $(SRC)\o_init.c $(HACK_H) $(INCL)\lev.h $(O)objects.o: $(SRC)\objects.c $(CONFIG_H) $(INCL)\obj.h $(INCL)\objclass.h \ $(INCL)\prop.h $(INCL)\skills.h $(INCL)\color.h $(O)objnam.o: $(SRC)\objnam.c $(HACK_H) $(O)options.o: $(SRC)\options.c $(CONFIG_H) $(INCL)\objclass.h $(INCL)\flag.h \ $(HACK_H) $(INCL)\tcap.h $(INCL)\filename.h $(O)pager.o: $(SRC)\pager.c $(HACK_H) $(INCL)\dlb.h @$(cc) $(CFLAGSG) -Od $(NTSUB) -Fo$@ $(SRC)\pager.c $(O)pickup.o: $(SRC)\pickup.c $(HACK_H) $(O)pline.o: $(SRC)\pline.c $(HACK_H) $(INCL)\epri.h $(O)polyself.o: $(SRC)\polyself.c $(HACK_H) $(O)potion.o: $(SRC)\potion.c $(HACK_H) $(O)pray.o: $(SRC)\pray.c $(HACK_H) $(INCL)\epri.h $(O)priest.o: $(SRC)\priest.c $(HACK_H) $(INCL)\mfndpos.h $(INCL)\eshk.h \ $(INCL)\epri.h $(INCL)\emin.h $(O)quest.o: $(SRC)\quest.c $(HACK_H) $(INCL)\qtext.h $(O)questpgr.o: $(SRC)\questpgr.c $(HACK_H) $(INCL)\dlb.h $(INCL)\qtext.h $(O)read.o: $(SRC)\read.c $(HACK_H) $(O)rect.o: $(SRC)\rect.c $(HACK_H) $(O)region.o: $(SRC)\region.c $(HACK_H) $(O)restore.o: $(SRC)\restore.c $(HACK_H) $(INCL)\lev.h $(INCL)\tcap.h $(O)rip.o: $(SRC)\rip.c $(HACK_H) $(O)rnd.o: $(SRC)\rnd.c $(HACK_H) $(O)role.o: $(SRC)\role.c $(HACK_H) $(O)rumors.o: $(SRC)\rumors.c $(HACK_H) $(INCL)\lev.h $(INCL)\dlb.h $(O)save.o: $(SRC)\save.c $(HACK_H) $(INCL)\lev.h $(O)shk.o: $(SRC)\shk.c $(HACK_H) $(INCL)\eshk.h $(O)shknam.o: $(SRC)\shknam.c $(HACK_H) $(INCL)\eshk.h $(O)sit.o: $(SRC)\sit.c $(HACK_H) $(INCL)\artifact.h $(O)sounds.o: $(SRC)\sounds.c $(HACK_H) $(INCL)\edog.h $(O)sp_lev.o: $(SRC)\sp_lev.c $(HACK_H) $(INCL)\dlb.h $(INCL)\sp_lev.h $(O)spell.o: $(SRC)\spell.c $(HACK_H) $(O)steal.o: $(SRC)\steal.c $(HACK_H) $(O)steed.o: $(SRC)\steed.c $(HACK_H) $(O)tech.o: $(SRC)\tech.c $(HACK_H) $(O)teleport.o: $(SRC)\teleport.c $(HACK_H) $(O)tile.o: $(SRC)\tile.c $(HACK_H) $(O)timeout.o: $(SRC)\timeout.c $(HACK_H) $(INCL)\lev.h $(O)topten.o: $(SRC)\topten.c $(HACK_H) $(INCL)\dlb.h $(INCL)\patchlevel.h $(O)track.o: $(SRC)\track.c $(HACK_H) $(O)trap.o: $(SRC)\trap.c $(HACK_H) $(O)u_init.o: $(SRC)\u_init.c $(HACK_H) $(O)uhitm.o: $(SRC)\uhitm.c $(HACK_H) $(O)vault.o: $(SRC)\vault.c $(HACK_H) $(INCL)\vault.h $(O)version.o: $(SRC)\version.c $(HACK_H) $(INCL)\date.h $(INCL)\patchlevel.h $(O)vis_tab.o: $(SRC)\vis_tab.c $(HACK_H) $(INCL)\vis_tab.h $(O)vision.o: $(SRC)\vision.c $(HACK_H) $(INCL)\vis_tab.h $(O)weapon.o: $(SRC)\weapon.c $(HACK_H) $(O)were.o: $(SRC)\were.c $(HACK_H) $(O)wield.o: $(SRC)\wield.c $(HACK_H) $(O)windows.o: $(SRC)\windows.c $(HACK_H) $(WINTTY_H) $(O)wizard.o: $(SRC)\wizard.c $(HACK_H) $(INCL)\qtext.h $(O)worm.o: $(SRC)\worm.c $(HACK_H) $(INCL)\lev.h $(O)worn.o: $(SRC)\worn.c $(HACK_H) $(O)write.o: $(SRC)\write.c $(HACK_H) $(O)zap.o: $(SRC)\zap.c $(HACK_H) # end of file slashem-0.0.7E7F3/sys/winnt/setup.bat0000775000076400007640000000056610545462317015473 0ustar alialiREM In case some of the long file names are MIA if exist ..\..\dat\data.bas copy ..\..\dat\data.bas ..\..\dat\data.base if exist ..\..\include\patchlev.h copy ..\..\include\patchlev.h ..\..\include\patchlevel.h if exist ..\..\doc\guideboo.txt copy ..\..\doc\guideboo.txt ..\..\doc\guidebook.txt copy makefile.gcc ..\..\src\Makefile copy win32api.h ..\..\include\win32api.h slashem-0.0.7E7F3/sys/winnt/porthelp0000664000076400007640000003220110545462317015407 0ustar aliali Microsoft Windows specific help file for NetHack 3.4.3 Copyright (c) NetHack PC Development Team 1993-2002. NetHack may be freely distributed. See license for details. (Last Revision: October 14, 2003) 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.3, 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 slashem-0.0.7E7F3/sys/winnt/nhsetup.bat0000775000076400007640000001014610545462317016014 0ustar aliali@REM SCCS Id: @(#)nhsetup.bat 3.4 $Date: 2003/05/18 20:40:54 $ @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 copy ..\..\win\win32\magtile.dsp ..\..\build >nul copy ..\..\win\win32\txtbg.dsp ..\..\build >nul copy ..\..\win\win32\txtmerge.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= slashem-0.0.7E7F3/sys/winnt/Makefile.gcc0000664000076400007640000017762310545462317016044 0ustar aliali# $Id: Makefile.gcc,v 1.49 2004/01/20 20:58:47 entro-p Exp $ # Copyright (c) NetHack PC Development Team 1993-2003 # Copyright (c) Karl Garrison 1999 # Copyright (c) Slash'EM Development Team 1999-2003 # # Slash'EM 0.0.7 Makefile for MinGW 2.0 and above and Gtk+ 2.0 and above # # Win32 systems tested: # - Windows 95 # - Windows 2000 SP1 # # Win32 compilers tested: # - MinGW 2.0.0-3 # # Win32 libraries tested: # - Gtk+ Development Environment 2.2.4.1 # # 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.gcc file included # with the distribution. # # Note that compiling will fail under WinNT (including Win2k and XP) if # the command line gets too long (eg., your directory names are longer # than the default). # Game Installation Variables GAME = slashem # The GNU Make has a problem if you include a drive spec below (unfortunately). GAMEDIR = \games\slam32d # # Directories # # These are for MinGW's GCC, which gets confused by \ DDAT = ../dat DUTIL = ../util DSRC = ../src DINCL = ../include NTSYS = ../sys/winnt MW32GTK = /win-gtk # Normal dos commands get confused by \\ DAT = ..\dat DOC = ..\doc INCL = ..\include WSYS = ..\sys\winnt SRC = ..\src SSHR = ..\sys\share UTIL = ..\util WTTY = ..\win\tty WIN32 = ..\win\win32 WGTK = ..\win\gtk WSHR = ..\win\share # # Executables. CC = gcc RC = windres LINK = gcc # # The MinGW switch needed to specify Microsoft packing & alignment rules # (use gcc --target-help if you're not sure) MS_BITFIELDS = -mms-bitfields # MS_BITFIELDS = -fnative-struct # The copy, del and echo commands don't work from a makefile since they are # internal shell commands rather than external utilities. We can get around # this by specifying an external utility that performs the same function like # the cp and rm commands from Cygwin32, or xcopy for copy. Another way to do # it is to call the shell explicitly and use the /c option to run the built-in # command. All of these examples appear below. #COPY = command.com /c copy #COPY = cmd.exe /c copy # Same as above, but for Windows NT #COPY = xcopy # MSDOS xcopy command (asks if target File or Dir) #COPY = cp # UNIX copy command COPY = copy /y # MSDOS copy command (gets confused by '+') RCOPY = xcopy /y /s #RCOPY = cp -r #DEL = command.com /c del #DEL = cmd.exe /c del # Same as above, but for Windows NT #DEL = rm -f # UNIX del command DEL = del # MSDOS del command #RDEL = deltree # Win 95 recursive del command RDEL = rd /s /q # Win 2K recursive del command #RDEL = rm -rf # Echo is very sensitive to trailing spaces so comments should be avoided # on the following lines, which define Win95, NT, UNIX and MS-DOS versions. #ECHO = command.com /c echo #ECHO = cmd.exe /c echo #ECHO = echo.exe ECHO = echo #LS = ls -1 # ls.exe from djgpp distribution LS = dir /l/b/-p # DOS command WAC - disable pause for dos6 #LS = *dir /l/b/z # 4DOS command - cuts through ALIASes # # Yacc/Lex ... if you got 'em. # # If you have yacc/lex or a work-alike set YACC_LEX to Y # YACC_LEX = N # If YACC_LEX is Y above, set the following to values appropriate for # your tools. # YACC = bison -y -o y_tab.c LEX = flex # Win32 versions #YTABC = y.tab.c #YTABH = y.tab.h #LEXYYC = lex.yy.c # DJGPP bison/lex doesn't use LFN YTABC = y_tab.c YTABH = y_tab.h LEXYYC = lexyy.c # # Uncomment the line below if you want to store all the level files, # help files, etc. in a single library file. USE_DLB = Y # To build a binary without any graphics # suitable for blind players, # set SUPPRESS_GRAPHICS to Y # (Note: binary will require ANSI.SYS driver or equivalent loaded) # SUPPRESS_GRAPHICS = Y # # Uncomment the line below if you want to compile with the native # MS-Windows graphics windowsystem. You will also need to define # MSWIN_GRAPHICS in config.h. # USE_MSWIN = Y # # Uncomment the line below if you want to compile with the GTK windowsystem. # You will also need to define GTK_GRAPHICS in config.h. # USE_GTK = Y # # Uncomment the line below if you want to compile with the proxy system. # You will also need to define PROXY_GRAPHICS in config.h. # USE_PROXY = Y # # Uncomment USE_GTK, USE_PROXY and the line below if you want to build a # proxified GTK interface. You will also need to define GTK_PROXY in config.h. # USE_PROXIFIED = Y # # Uncomment the line below if you want to compile with the internal malloc # routines (used to test for memory leaks). # You will also need to define MONITOR_HEAP and INTERNAL_MALLOC in config.h # # Warning: Doing this increases the risk of a non-recoverable game crash. # USE_NHALLOC = Y ############################################################################# # # nothing below this line should have to be changed # SOUND = ntsound.o #SOUND = GAMEFILE = $(GAMEDIR)\$(GAME).exe # Changing this conditional block is not recommended ifeq ($(USE_DLB),Y) DLBFLG = -DDLB else DLBFLG = endif # # Flags. # ifeq ($(SUPPRESS_GRAPHICS),Y) TERMLIB = # Build NetHack suitable for blind players # Debugging #CFLAGS = -pg -c -I../include $(DLBFLG) -DSUPPRESS_GRAPHICS #LFLAGS = -pg CFLAGS = -c -O -I../include $(DLBFLG) -DSUPPRESS_GRAPHICS LFLAGS = else # Debugging #CFLAGS = -pg -c -I..\include $(DLBFLG) #LFLAGS = -pg # Normal CFLAGS = -c -O -I../include $(DLBFLG) LFLAGS = # Comment out this line if you have also commented out TTY_GRAPHICS in config.h CFLAGS += -DWIN32CON endif # The pkg-config executable PKG_CONFIG = $(MW32GTK)/bin/pkg-config # A semi-colon seperated list of directories to add to the path when # calling pkg-config so that MS-Windows can find the DLLs needed. PKG_CONFIG_DLL = $(MW32GTK)/lib # A semi-colon seperated list of directories to add to PKG_CONFIG_PATH # so that pkg-config can find the package config files (eg., gtk+-2.0.pc). PKG_CONFIG_PATH = $(MW32GTK)/lib/pkgconfig # The pkg-config commands GTKCFLAGS = $(PKG_CONFIG) --cflags gtk+-2.0 libpng GTKLIBS = $(PKG_CONFIG) --libs gtk+-2.0 libpng # Select Windowing system(s) below # GTK windowing system WINGTKCFLAGS= # Set the WINSRC, WINOBJ, and WINLIB lines to correspond to your desired # combination of windowing systems. Also set windowing systems in config.h. # # files for a straight tty port using no native windowing system WINTTYSRC = ../win/tty/getline.c ../win/tty/termcap.c ../win/tty/topl.c \ ../win/tty/wintty.c WINTTYOBJ = getline.o termcap.o topl.o wintty.o # # files for a native MS-Windows port # (tile.c is included in the defn. for WINCSRC, below) ifeq ($(USE_MSWIN),Y) WINMSCFLAGS=-I../win/win32 -D_WIN32_IE=0x0400 WINMSSRC = ../win/win32/mswproc.c ../win/win32/winhack.c ../win/win32/mhdlg.c \ ../win/win32/mhaskyn.c ../win/win32/mhfont.c ../win/win32/mhinput.c \ ../win/win32/mhmain.c ../win/win32/mhmsgwnd.c ../win/win32/mhsplash.c \ ../win/win32/mhstatus.c ../win/win32/mhtext.c ../win/win32/mhmenu.c \ ../win/win32/mhmap.c ../win/win32/mhrip.c WINMSOBJ1 = mswproc.o winhack.o mhdlg.o mhaskyn.o mhfont.o mhinput.o mhmain.o WINMSOBJ2 = mhmsgwnd.o mhsplash.o mhstatus.o mhtext.o mhmenu.o mhmap.o mhrip.o endif # # files for a GTK port # (tile.c is included in the defn. for WINCSRC, below) ifeq ($(USE_GTK),Y) WINGTKSRC = ../win/gtk/gtk.c ../win/gtk/gtkgetlin.c ../win/gtk/gtkstatus.c \ ../win/gtk/gtkmenu.c ../win/gtk/gtkyn.c ../win/gtk/gtkextcmd.c \ ../win/gtk/gtkmap.c ../win/gtk/gtkmessage.c ../win/gtk/gtkmisc.c \ ../win/gtk/xshmmap.c ../win/gtk/gtktile.c ../win/gtk/gtkhackrc.c \ ../win/gtk/gtkprefs.c ../win/gtk/gtkprogress.c ../win/gtk/gtkint.c \ ../win/gtk/gtkext.c WINGTKOBJ1 = gtk.o gtkgetlin.o gtkstatus.o gtkmenu.o gtkyn.o gtkextcmd.o \ gtkmap.o gtkmessage.o gtkmisc.o xshmmap.o WINGTKOBJ2 = gtktile.o gtkhackrc.o gtkprefs.o gtkprogress.o gtkint.o gtkext.o endif # # Files for a proxy interface. ifeq ($(USE_PROXY),Y) WINPROXYSRC = ../win/proxy/winproxy.c ../win/proxy/callback.c WINPROXYOBJ = winproxy.o callback.o endif # # Common files for proxy window interface and window servers. PROXYCOMSRC = ../win/proxy/nhext.c ../win/proxy/nhxdr.c \ ../win/proxy/nhextxdr.c ../win/proxy/nhextio.c ../win/proxy/nhextnb.c \ ../win/proxy/compxdr.c PROXYCOMOBJ = nhext.o nhxdr.o nhextxdr.o nhextio.o nhextnb.o compxdr.o # Common files that are also shared with non-proxy window interfaces PROXYSHRSRC = ../win/proxy/md5.c PROXYSHROBJ = md5.o # Files for the proxy utility modules. These are provided for use with window # ports that support the proxy interface. The GTK window interface needs # these files regardless of whether proxy support is enabled or not. PROXYUTLSRC = ../win/proxy/dlbh.c ../win/proxy/mapid.c \ ../win/proxy/riputil.c ../win/proxy/getopt.c ../win/proxy/glyphmap.c PROXYUTLOBJ = dlbh.o mapid.o riputil.o getopt.o glyphmap.o # # Files for plug-in window interfaces. These are needed to support external # window ports and provide the interface to the game executable. Currently, # only the GTK window interface supports plug-in window interfaces. PROXYCLNTSRC = ../win/proxy/proxysvc.c ../win/proxy/proxycb.c \ ../win/proxy/prxymap.c ../win/proxy/prxychar.c ../win/proxy/prxytile.c \ ../win/proxy/prxyconn.c PROXYCLNTOBJ = proxysvc.o proxycb.o prxymap.o prxychar.o prxytile.o prxyconn.o WINSRC = $(WINTTYSRC) WOBJ01 = $(WINTTYOBJ) WOBJ02 = WOBJ03 = WOBJ04 = CCOMPILE = $(CC) $(MS_BITFIELDS) ifeq ($(USE_MSWIN),Y) USE_GUI = Y WINSRC += $(WINMSSRC) WOBJ02 += $(WINMSOBJ1) WOBJ03 += $(WINMSOBJ2) WOBJ04 += winres.o tile.o LFLAGS += -mwindows -Wl,-Map,slashem.map -v else # USE_MSWIN ifeq ($(USE_GTK),Y) USE_GUI = Y USE_PNG = Y WINSRC += $(WINGTKSRC) WOBJ02 += $(WINGTKOBJ1) WOBJ03 += $(WINGTKOBJ2) LFLAGS += -mwindows ifneq ($(USE_PROXY),Y) WINSRC += $(PROXYUTLSRC) $(PROXYSHRSRC) WOBJ04 += tile.o WOBJ05 += $(PROXYUTLOBJ) $(PROXYSHROBJ) endif # USE_PROXY endif # USE_GTK endif # USE_MSWIN ifeq ($(USE_PROXY),Y) USE_PNG = Y WINSRC += $(WINPROXYSRC) $(PROXYUTLSRC) $(PROXYCOMSRC) $(PROXYSHRSRC) WOBJ02 += $(WINPROXYOBJ) WOBJ03 += $(PROXYCOMOBJ) $(PROXYSHROBJ) ifneq ($(USE_MSWIN),Y) WOBJ04 += tile.o endif WOBJ05 += $(PROXYUTLOBJ) endif ifeq ($(USE_PROXIFIED),Y) WINSRC += $(PROXYCLNTSRC) WOBJ04 += $(PROXYCLNTOBJ) endif WINOBJ = $(WOBJ01) $(WOBJ02) $(WOBJ03) $(WOBJ04) $(WOBJ05) # # The definition of WINLIB (below) must also be changed to match # WINSRC & WINOBJ. # WINTTYLIB = # libraries for native MS-Windows ifeq ($(USE_MSWIN),Y) WINMSLIB = libcomctl32.a libgdi32.a endif # libraries for GTK # Note: cc-gtk handles Gtk+ and its dependencies. ifeq ($(USE_GTK),Y) WINGTKLIB = endif ifeq ($(USE_PROXY),Y) WINPROXYLIB = libwsock32.a endif WINLIB = $(WINTTYLIB) ifeq ($(USE_MSWIN),Y) WINLIB += $(WINMSLIB) endif ifeq ($(USE_GTK),Y) WINLIB +=$(WINGTKLIB) endif ifeq ($(USE_PROXY),Y) WINLIB += $(WINPROXYLIB) endif # Shareable (architecture independent) data files which are not candidates # for inclusion in DLB libraries (ND). Port specific files per discussions # in Install.GTK and Install.pxy CNF_SHARE_GTKND = gltile16.png gltile32.png gltile64.png rip.xpm credit.xpm CNF_SHARE_PROXYND = gltile16.png gltile32.png gltile64.png \ gltile16.map gltile32.map gltile64.map ifeq ($(USE_GTK),Y) CNF_SHARE_DATND += $(CNF_SHARE_GTKND) endif ifeq ($(USE_PROXY),Y) CNF_SHARE_DATND += $(CNF_SHARE_PROXYND) endif ifeq ($(USE_PNG),Y) CCGTK = cc-gtk -v -c $(CCOMPILE) endif # # Utility Objects. # ifeq ($(USE_NHALLOC),Y) NHALLOCOBJ = nhalloc.o NHALLOCDLL = nhalloc.dll NHALLOCA = nhalloc.a else NHALLOCOBJ = NHALLOCDLL = NHALLOCA = endif MAKESRC = makedefs.c SPLEVSRC = lev_yacc.c lev_$(LEX).c lev_main.c panic.c DGNCOMPSRC = dgn_yacc.c dgn_$(LEX).c dgn_main.c MAKEOBJS = makedefs.o monst.o objects.o alloc.o panic.o $(NHALLOCOBJ) SPLEVOBJS = lev_yacc.o lev_$(LEX).o lev_main.o alloc.o \ monst.o objects.o panic.o \ drawing.o decl.o $(NHALLOCOBJ) DGNCOMPOBJS = dgn_yacc.o dgn_$(LEX).o dgn_main.o alloc.o \ panic.o $(NHALLOCOBJ) RECOVOBJS = recover.o # Tile related object files. ifeq ($(SUPPRESS_GRAPHICS),Y) TILOBJ = TEXTIO = TEXTIO2 = PLANAR_TIB = OVERVIEW_TIB = TILEUTIL = TILEFILES = TILEFILES2 = GIFREADERS = GIFREAD2 = PPMWRITERS = PPMWRIT2 = else TEXTIO = tiletext.o tiletxt.o drawing.o decl.o monst.o objects.o \ panic.o alloc.o $(NHALLOCOBJ) TEXTIO2 = tiletex2.o tiletxt2.o drawing.o decl.o monst.o objects.o \ panic.o alloc.o $(NHALLOCOBJ) PLANAR_TIB = NetHack1.tib OVERVIEW_TIB = NetHacko.tib DLBOBJ = dlb.o endif # Object files for the game itself. VOBJ01 = allmain.o alloc.o apply.o artifact.o attrib.o VOBJ02 = ball.o bones.o borg.o botl.o cmd.o dbridge.o VOBJ03 = decl.o detect.o display.o do.o do_name.o VOBJ04 = do_wear.o dog.o dogmove.o dokick.o dothrow.o VOBJ05 = drawing.o dungeon.o eat.o end.o engrave.o VOBJ06 = exper.o explode.o extralev.o files.o fountain.o VOBJ07 = hack.o hacklib.o invent.o lock.o VOBJ08 = mail.o pcmain.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 VOBJ12 = music.o o_init.o objects.o objnam.o options.o VOBJ13 = pickup.o pline.o polyself.o potion.o quest.o VOBJ14 = questpgr.o pager.o pray.o priest.o read.o VOBJ15 = rect.o restore.o rip.o rnd.o role.o VOBJ16 = rumors.o save.o shk.o shknam.o sit.o VOBJ17 = sounds.o sp_lev.o spell.o steal.o steed.o VOBJ18 = timeout.o topten.o track.o VOBJ19 = trap.o u_init.o uhitm.o vault.o vision.o VOBJ20 = vis_tab.o weapon.o were.o wield.o windows.o VOBJ21 = wizard.o worm.o worn.o write.o VOBJ22 = zap.o light.o dlb.o dig.o teleport.o VOBJ23 = region.o tech.o gypsy.o mapglyph.o SOBJ = winnt.o pcsys.o pcunix.o nttty.o random.o \ $(SOUND) nhlan.o # $(SOUND) mapimail.o nhlan.o SYSLIB = libwinmm.a VVOBJ = version.o VOBJ = $(VOBJ01) $(VOBJ02) $(VOBJ03) $(VOBJ04) $(VOBJ05) \ $(VOBJ06) $(VOBJ07) $(VOBJ08) $(VOBJ09) $(VOBJ10) \ $(VOBJ11) $(VOBJ12) $(VOBJ13) $(VOBJ14) $(VOBJ15) \ $(VOBJ16) $(VOBJ17) $(VOBJ18) $(VOBJ19) $(VOBJ20) \ $(VOBJ21) $(VOBJ22) $(VOBJ23) ALLOBJ = $(VOBJ) $(SOBJ) $(VVOBJ) $(WINOBJ) # # Header Objects. # DGN_FILE_H = $(INCL)\align.h $(INCL)\dgn_file.h DUNGEON_H = $(INCL)\align.h $(INCL)\dungeon.h EMIN_H = $(DUNGEON_H) $(INCL)\emin.h EPRI_H = $(DUNGEON_H) $(INCL)\align.h $(INCL)\epri.h ESHK_H = $(DUNGEON_H) $(INCL)\eshk.h MONDATA_H = $(INCL)\align.h $(INCL)\mondata.h MONST_H = $(INCL)\align.h $(INCL)\monst.h NHLAN_H = $(INCL)\nhlan.h PERMONST_H = $(INCL)\monattk.h $(INCL)\monflag.h $(INCL)\align.h \ $(INCL)\permonst.h REGION_H = $(INCL)\region.h RM_H = $(INCL)\align.h $(INCL)\rm.h SKILLS_H = $(INCL)\skills.h SP_LEV_H = $(INCL)\align.h $(INCL)\sp_lev.h VAULT_H = $(DUNGEON_H) $(INCL)\vault.h YOUPROP_H = $(PERMONST_H) $(MONDATA_H) $(INCL)\prop.h \ $(INCL)\pm.h $(INCL)\youprop.h YOU_H = $(MONST_H) $(YOUPROP_H) $(INCL)\align.h \ $(INCL)\attrib.h $(INCL)\you.h DISPLAY_H = $(MONDATA_H) $(INCL)\vision.h $(INCL)\display.h NTCONF_H = $(INCL)\micro.h $(INCL)\system.h $(INCL)\ntconf.h CONFIG_H = $(GLOBAL_H) $(INCL)\tradstdc.h $(INCL)\config1.h \ $(INCL)\config.h DECL_H = $(YOU_H) $(INCL)\spell.h $(INCL)\color.h \ $(INCL)\obj.h $(INCL)\onames.h $(INCL)\pm.h \ $(INCL)\decl.h GLOBAL_H = $(NTCONF_H) $(INCL)\coord.h $(INCL)\global.h HACK_H = $(CONFIG_H) $(DUNGEON_H) $(DECL_H) \ $(DISPLAY_H) $(INCL)\monsym.h $(INCL)\mkroom.h \ $(INCL)\objclass.h $(INCL)\trap.h $(INCL)\flag.h \ $(RM_H) $(INCL)\vision.h $(INCL)\wintype.h \ $(INCL)\engrave.h $(INCL)\rect.h $(INCL)\hack.h \ $(REGION_H) $(INCL)\trampoli.h DLB_H = $(INCL)\dlb.h #ifeq ($(SUPPRESS_GRAPHICS),Y) #TILE_H = #else #TILE_H = $(INCL)\tile.h $(INCL)\pctiles.h #endif ifeq ($(USE_DLB),Y) DLB = $(DAT)\nhshare $(DAT)\nhushare DLBOBJS = dlb_main.o dlb.o alloc.o panic.o $(NHALLOCOBJ) else DLB = DLBOBJS = endif # # Make Rules. # .SUFFIXES: .exe .o .c .y .l .c.o: $(CCOMPILE) $(CFLAGS) -o$@ $< #.phony: dlb # # Primary Targets. # # The default target. default: $(GAMEFILE) all: install.tag util: utility.tag install: install.tag utility.tag: $(INCL)\date.h $(INCL)\trap.h $(INCL)\onames.h \ $(INCL)\pm.h monstr.c vis_tab.c $(INCL)\filename.h\ lev_comp.exe dgn_comp.exe recover.exe $(TILEUTIL) $(ECHO) utilities made > utility.tag install.tag: $(GAMEFILE) dat.tag ifeq ($(USE_DLB),Y) $(COPY) $(DAT)\nhshare $(GAMEDIR) $(COPY) $(DAT)\nhushare $(GAMEDIR) $(COPY) $(DAT)\license $(GAMEDIR) $(COPY) $(DAT)\opthelp $(GAMEDIR) else $(COPY) $(DAT)\*. $(GAMEDIR) $(COPY) $(DAT)\*.dat $(GAMEDIR) $(COPY) $(DAT)\*.lev $(GAMEDIR) # $(DEL) $(GAMEDIR)\makefile. endif ifeq ($(USE_GTK),Y) $(COPY) $(subst /,\,$(WGTK)\GTKRC.w32 $(GAMEDIR)\gtkrc) $(COPY) $(subst /,\,rip.xpm $(GAMEDIR)) $(COPY) $(subst /,\,credit.xpm $(GAMEDIR)) $(COPY) $(subst /,\,$(WSYS)\winnt.cnf $(GAMEDIR)\defaults.nh) else $(COPY) $(subst /,\,$(WSYS)\defaults.nh $(GAMEDIR)\defaults.nh) endif ifeq ($(USE_PROXY),Y) $(COPY) $(subst /,\,gltile16.map $(GAMEDIR)) $(COPY) $(subst /,\,gltile32.map $(GAMEDIR)) $(COPY) $(subst /,\,gltile64.map $(GAMEDIR)) endif ifeq ($(USE_PNG),Y) $(COPY) $(subst /,\,gltile16.png $(GAMEDIR)) $(COPY) $(subst /,\,gltile32.png $(GAMEDIR)) $(COPY) $(subst /,\,gltile64.png $(GAMEDIR)) endif ifeq ($(USE_NHALLOC),Y) $(COPY) $(subst /,\,nhalloc.dll $(GAMEDIR)) endif $(COPY) $(subst /,\,recover.exe $(GAMEDIR)) $(COPY) $(subst /,\,$(DOC)\guidebook.txt $(GAMEDIR)) $(COPY) $(subst /,\,$(DOC)\recover.txt $(GAMEDIR)) $(COPY) $(subst /,\,$(DOC)\slashem.txt $(GAMEDIR)) $(ECHO) install done > install.tag # The main target. gamedir.tag: $(subst /,\,@if not exist $(GAMEDIR)/*.* echo creating directory $(GAMEDIR)) $(subst /,\,@if not exist $(GAMEDIR)/*.* mkdir $(GAMEDIR)) $(subst /,\,@echo directory created > $@) FORCE: ifeq ($(USE_PNG),Y) cc-gtk.h: FORCE @echo #define PKG_CONFIG_DLL "$(PKG_CONFIG_DLL)" > cc-gtk.h @echo #define PKG_CONFIG_PATH "$(PKG_CONFIG_PATH)" >> cc-gtk.h @echo #define GTKCFLAGS "$(GTKCFLAGS)" >> cc-gtk.h @echo #define GTKLIBS "$(GTKLIBS)" >> cc-gtk.h cc-gtk.exe: $(WGTK)\cc-gtk.c cc-gtk.h $(COPY) $(WGTK)\cc-gtk.c . $(CC) -o$@ cc-gtk.c endif ifeq ($(USE_GTK),Y) $(GAMEFILE): cc-gtk.exe gamedir.tag utility.tag $(NHALLOCDLL) $(NHALLOCA) \ $(ALLOBJ) $(GAME).lnk $(GAMEDIR)/nhdefkey.dll \ $(GAMEDIR)/nh340key.dll $(GAMEDIR)/nhraykey.dll cc-gtk -l $(LINK) $(LFLAGS) $(GTKGCCFLAGS) -o$(GAME).exe $(GAME).lnk $(COPY) $(GAME).exe $(GAMEFILE) $(DEL) $(GAME).exe else $(GAMEFILE): gamedir.tag utility.tag $(NHALLOCDLL) $(NHALLOCA) \ $(ALLOBJ) $(GAME).lnk $(GAMEDIR)/nhdefkey.dll \ $(GAMEDIR)/nh340key.dll $(GAMEDIR)/nhraykey.dll $(LINK) $(LFLAGS) $(GTKGCCFLAGS) -o$(GAME).exe $(GAME).lnk $(COPY) $(GAME).exe $(GAMEFILE) $(DEL) $(GAME).exe endif nhdefkey.o: $(CCOMPILE) $(CFLAGS) -DBUILD_DLL -o$@ $(NTSYS)/nhdefkey.c $(GAMEDIR)/nhdefkey.dll: nhdefkey.o gamedir.tag @echo Linking $@ $(CCOMPILE) -shared -Wl,--export-all-symbols \ -Wl,--add-stdcall-alias -o $@ $< nh340key.o: $(CCOMPILE) $(CFLAGS) -DBUILD_DLL -o$@ $(NTSYS)/nh340key.c $(GAMEDIR)/nh340key.dll: nh340key.o gamedir.tag @echo Linking $@ $(CCOMPILE) -shared -Wl,--export-all-symbols \ -Wl,--add-stdcall-alias -o $@ $< nhraykey.o: $(CCOMPILE) $(CFLAGS) -DBUILD_DLL -o$@ $(NTSYS)/nhraykey.c $(GAMEDIR)/nhraykey.dll: nhraykey.o gamedir.tag @echo Linking $@ $(CCOMPILE) -shared -Wl,--export-all-symbols \ -Wl,--add-stdcall-alias -o $@ $< $(GAME).lnk: $(ALLOBJ) @echo INPUT( $(VOBJ01) )> $@ @echo INPUT( $(VOBJ02) )>> $@ @echo INPUT( $(VOBJ03) )>> $@ @echo INPUT( $(VOBJ04) )>> $@ @echo INPUT( $(VOBJ05) )>> $@ @echo INPUT( $(VOBJ06) )>> $@ @echo INPUT( $(VOBJ07) )>> $@ @echo INPUT( $(VOBJ08) )>> $@ @echo INPUT( $(VOBJ09) )>> $@ @echo INPUT( $(VOBJ10) )>> $@ @echo INPUT( $(VOBJ11) )>> $@ @echo INPUT( $(VOBJ12) )>> $@ @echo INPUT( $(VOBJ13) )>> $@ @echo INPUT( $(VOBJ14) )>> $@ @echo INPUT( $(VOBJ15) )>> $@ @echo INPUT( $(VOBJ16) )>> $@ @echo INPUT( $(VOBJ17) )>> $@ @echo INPUT( $(VOBJ18) )>> $@ @echo INPUT( $(VOBJ19) )>> $@ @echo INPUT( $(VOBJ20) )>> $@ @echo INPUT( $(VOBJ21) )>> $@ @echo INPUT( $(VOBJ22) )>> $@ @echo INPUT( $(VOBJ23) )>> $@ @echo INPUT( $(SOBJ) )>> $@ @echo INPUT( $(VVOBJ) )>> $@ @echo INPUT( $(WOBJ01) )>> $@ ifneq ($(WOBJ02),) @echo INPUT( $(WOBJ02) )>> $@ endif ifneq ($(WOBJ03),) @echo INPUT( $(WOBJ03) )>> $@ endif ifneq ($(WOBJ04),) @echo INPUT( $(WOBJ04) )>> $@ endif ifneq ($(WOBJ05),) @echo INPUT( $(WOBJ05) )>> $@ endif ifneq ($(WINLIB),) @echo INPUT( $(WINLIB) )>> $@ endif ifneq ($(SYSLIB),) @echo INPUT( $(SYSLIB) )>> $@ endif ifeq ($(USE_NHALLOC),Y) @echo INPUT( nhalloc.a )>> $@ endif # # Housekeeping. # clean: -$(DEL) *.o -$(DEL) *.map -$(DEL) nhalloc.* -$(DEL) dlb_main.exe spotless: clean -$(DEL) gamedir.tag -$(DEL) utility.tag -$(DEL) install.tag -$(DEL) dat.tag -$(DEL) cc-gtk.h -$(DEL) cc-gtk.c -$(DEL) cc-gtk.exe -$(DEL) $(GAME).lnk -$(DEL) makedefs.exe -$(DEL) lev_comp.exe -$(DEL) dgn_comp.exe -$(DEL) txtmerge.exe -$(DEL) magtile.exe -$(DEL) bigtile.exe -$(DEL) txtbg.exe -$(DEL) mapmerge.exe -$(DEL) tile2x11.exe -$(DEL) x11bigtiles -$(DEL) x11big3dtiles -$(DEL) x11tiles -$(DEL) x11bigtiles.map -$(DEL) x11big3dtiles.map -$(DEL) x11tiles.map -$(DEL) tile2png.exe -$(DEL) gltile16.png -$(DEL) gltile32.png -$(DEL) gltile64.png -$(DEL) gltile16.map -$(DEL) gltile32.map -$(DEL) gltile64.map -$(DEL) gtkrc -$(DEL) *.xpm -$(DEL) tiletext.c -$(DEL) txtmerge.c -$(DEL) magtile.c -$(DEL) lev_flex.c -$(DEL) lev_yacc.c -$(DEL) dgn_flex.c -$(DEL) dgn_yacc.c -$(DEL) recover.exe -$(DEL) $(INCL)\onames.h -$(DEL) $(INCL)\pm.h -$(DEL) $(INCL)\vis_tab.h -$(DEL) $(INCL)\pcvideo.h -$(DEL) $(INCL)\pctiles.h -$(DEL) $(INCL)\portio.h -$(DEL) $(INCL)\tile.h -$(DEL) monstr.c -$(DEL) vis_tab.c -$(DEL) $(SRC)\panic.c -$(DEL) $(SRC)\makedefs.c -$(DEL) $(SRC)\recover.c -$(DEL) $(SRC)\lev_main.c -$(DEL) $(SRC)\dlb_main.c -$(DEL) $(SRC)\dgn_main.c -$(DEL) $(SRC)\wintty.c -$(DEL) $(SRC)\topl.c -$(DEL) $(SRC)\getline.c -$(DEL) $(SRC)\termcap.c -$(DEL) $(SRC)\tile2bin.c -$(DEL) $(SRC)\msdos.c -$(DEL) $(SRC)\pckeys.c -$(DEL) $(SRC)\video.c -$(DEL) $(SRC)\sound.c -$(DEL) $(SRC)\tilemap.c -$(DEL) $(SRC)\gifread.c -$(DEL) $(SRC)\ppmwrite.c -$(DEL) $(SRC)\pcmain.c -$(DEL) $(SRC)\pcunix.c -$(DEL) $(SRC)\pcsys.c -$(DEL) $(SRC)\tile.c -$(DEL) $(SRC)\gtk*.c -$(DEL) $(SRC)\xshmmap.c -$(DEL) $(SRC)\xshm.c -$(DEL) $(INCL)\date.h -$(DEL) $(INCL)\onames.h -$(DEL) $(INCL)\pm.h -$(DEL) $(INCL)\vis_tab.h -$(DEL) $(SRC)\nhlan.c -$(DEL) $(SRC)\winnt.c -$(DEL) $(SRC)\nttty.c -$(DEL) $(SRC)\ntsound.c -$(DEL) $(SRC)\mapimail.c -$(DEL) vis_tab.c -$(DEL) random.c -$(DEL) nhlan.c -$(DEL) *.lnk -$(DEL) *.def -$(DEL) *.map -$(DEL) *.lev -$(DEL) a.out -$(DEL) tilemap.exe -$(DEL) tile2bin.exe -$(DEL) $(DAT)\data -$(DEL) $(DAT)\*.lev -$(DEL) $(DAT)\data -$(DEL) $(DAT)\dungeon -$(DEL) $(DAT)\ttyoptions -$(DEL) $(DAT)\guioptions -$(DEL) $(DAT)\oracles -$(DEL) $(DAT)\rumors -$(DEL) $(DAT)\quest.dat -$(DEL) $(DAT)\nhshare -$(DEL) $(DAT)\nhushare -$(DEL) $(DAT)\dlb.lst -$(DEL) $(DAT)\msdoshlp.txt -$(DEL) $(DAT)\dlb_main.exe -$(DEL) $(DAT)\lev_comp.exe -$(DEL) $(DAT)\dgn_comp.exe -$(DEL) sp_lev.tag -$(DEL) $(PLANAR_TIB) -$(DEL) $(OVERVIEW_TIB) -$(DEL) pet_mark.xbm -$(DEL) $(WSHR)\monmag.txt -$(DEL) $(WSHR)\mon32.txt -$(DEL) $(WSHR)\objmag.txt -$(DEL) $(WSHR)\obj32.txt -$(DEL) $(WSHR)\othmag.txt -$(DEL) $(WSHR)\oth32.txt -$(DEL) $(WSHR)\monbig.txt -$(DEL) $(WSHR)\mon3d.txt -$(DEL) $(WSHR)\objbig.txt -$(DEL) $(WSHR)\obj3d.txt -$(DEL) $(WSHR)\othbig.txt -$(DEL) $(WSHR)\oth3d.txt -$(DEL) $(WSHR)\mon32-t.txt -$(DEL) $(WSHR)\obj32-t.txt -$(DEL) $(WSHR)\oth32-t.txt # # Secondary Targets. # # The following include files depend on makedefs to be created. # # date.h should be remade every time any of the source or include # files is modified. $(INCL)\date.h : makedefs.exe -makedefs -v $(INCL)\onames.h: makedefs.exe -makedefs -o $(INCL)\pm.h: makedefs.exe -makedefs -p monstr.c: makedefs.exe -makedefs -m $(INCL)\vis_tab.h: makedefs.exe -makedefs -z vis_tab.c: makedefs.exe -makedefs -z $(INCL)\filename.h: makedefs.exe -makedefs -f nhalloc.o: $(CONFIG_H) alloc.c $(CCOMPILE) $(CFLAGS) -DNHALLOC_DLL -onhalloc.o alloc.c nhalloc.def: @echo EXPORTS > nhalloc.def @echo malloc >> nhalloc.def @echo calloc >> nhalloc.def @echo realloc >> nhalloc.def @echo free >> nhalloc.def @echo monitor_heap_push >> nhalloc.def @echo monitor_heap_pop >> nhalloc.def @echo monitor_heap_set_subid >> nhalloc.def @echo monitor_heap_getmem >> nhalloc.def @echo monitor_heap_trace >> nhalloc.def @echo monitor_heap_mark >> nhalloc.def @echo monitor_heap_release >> nhalloc.def nhalloc.dll: nhalloc.def nhalloc.o panic.o $(CCOMPILE) -mdll -o junk.tmp -Wl,--base-file,base.tmp nhalloc.o panic.o $(DEL) junk.tmp dlltool --dllname nhalloc.dll --base-file base.tmp --output-exp nhalloc.exp --def nhalloc.def $(DEL) base.tmp $(CCOMPILE) -mdll -o nhalloc.dll nhalloc.o panic.o -Wl,nhalloc.exp $(DEL) nhalloc.exp nhalloc.a: nhalloc.def dlltool --dllname nhalloc.dll --def nhalloc.def --output-lib nhalloc.a -k nhproxy.a: $(PROXYCLNTOBJ) $(PROXYCOMOBJ) $(PROXYSHROBJ) -$(DEL) nhproxy.a ar rc nhproxy.a $(PROXYCLNTOBJ) ar r nhproxy.a $(PROXYCOMOBJ) $(PROXYSHROBJ) ranlib nhproxy.a $(WIN32)\mnsel.bmp: $(UTIL)\uudecode.exe $(WIN32)\mnsel.uu $(UTIL)\uudecode $(WIN32)\mnsel.uu $(COPY) mnsel.bmp $@ $(DEL) mnsel.bmp $(WIN32)\mnselcnt.bmp: $(UTIL)\uudecode.exe $(WIN32)\mnselcnt.uu $(UTIL)\uudecode $(WIN32)\mnselcnt.uu $(COPY) mnselcnt.bmp $@ $(DEL) mnselcnt.bmp $(WIN32)\mnunsel.bmp: $(UTIL)\uudecode.exe $(WIN32)\mnunsel.uu $(UTIL)\uudecode $(WIN32)\mnunsel.uu $(COPY) mnunsel.bmp $@ $(DEL) mnunsel.bmp $(WIN32)\petmark.bmp: $(UTIL)\uudecode.exe $(WIN32)\petmark.uu $(UTIL)\uudecode $(WIN32)\petmark.uu $(COPY) petmark.bmp $@ $(DEL) petmark.bmp $(WIN32)\SlashEM.ico: $(UTIL)\uudecode.exe $(WSYS)\seico.uu $(UTIL)\uudecode $(WSYS)\seico.uu $(COPY) SlashEM.ico $@ $(DEL) SlashEM.ico $(WIN32)\rip.bmp: $(UTIL)\uudecode.exe $(WIN32)\rip.uu $(UTIL)\uudecode $(WIN32)\rip.uu $(COPY) rip.bmp $@ $(DEL) rip.bmp $(WIN32)\splash.bmp: $(UTIL)\uudecode.exe $(WIN32)\splash.uu $(UTIL)\uudecode $(WIN32)\splash.uu $(COPY) splash.bmp $@ $(DEL) splash.bmp winres.o: tiles.bmp $(WIN32)\winhack.rc $(WIN32)\mnsel.bmp \ $(WIN32)\mnselcnt.bmp $(WIN32)\mnunsel.bmp $(WIN32)\rip.bmp \ $(WIN32)\petmark.bmp $(WIN32)\SlashEM.ico $(WIN32)\splash.bmp $(RC) -o$@ --include-dir=$(WIN32) -DNODEBUG -i $(WIN32)\winhack.rc # # Makedefs Stuff # makedefs.exe: $(MAKEOBJS) $(LINK) $(LFLAGS) -mconsole -omakedefs.exe $(MAKEOBJS) makedefs.c: $(UTIL)\makedefs.c $(COPY) $(UTIL)\makedefs.c . makedefs.o: $(CONFIG_H) $(PERMONST_H) $(INCL)\objclass.h \ $(INCL)\monsym.h $(INCL)\qtext.h makedefs.c # # Level Compiler Dependencies # lev_comp.exe: $(SPLEVOBJS) @echo INPUT( $(SPLEVOBJS) )> tmp.lnk $(LINK) $(LFLAGS) -mconsole $(GTKGCCFLAGS) -olev_comp.exe tmp.lnk @$(DEL) tmp.lnk ifeq ($(YACC_LEX),Y) lev_yacc.o: $(HACK_H) $(SP_LEV_H) lev_yacc.c $(CCOMPILE) $(CFLAGS) -o$@ lev_yacc.c else lev_yacc.o: $(HACK_H) $(SP_LEV_H) $(INCL)\lev_comp.h lev_yacc.c $(CCOMPILE) $(CFLAGS) -o$@ lev_yacc.c endif lev_$(LEX).o: $(HACK_H) $(SP_LEV_H) $(INCL)\lev_comp.h \ lev_$(LEX).c $(CCOMPILE) $(CFLAGS) -o$@ lev_$(LEX).c lev_main.c: $(UTIL)\lev_main.c $(COPY) $(UTIL)\lev_main.c . lev_main.o: $(HACK_H) lev_main.c $(INCL)\lev_comp.h: lev_yacc.c ifeq ($(YACC_LEX),Y) lev_yacc.c: $(UTIL)\lev_comp.y $(YACC) -d $(DUTIL)/lev_comp.y $(COPY) $(YTABC) $@ $(COPY) $(YTABH) $(INCL)\lev_comp.h $(DEL) $(YTABC) $(DEL) $(YTABH) lev_$(LEX).c: $(UTIL)\lev_comp.l $(LEX) $(DUTIL)/lev_comp.l $(COPY) $(LEXYYC) $@ $(DEL) $(LEXYYC) else lev_yacc.c: $(SSHR)\lev_yacc.c $(COPY) $(SSHR)\lev_yacc.c $@ $(INCL)\lev_comp.h: $(SSHR)\lev_comp.h $(COPY) $(SSHR)\lev_comp.h $@ $(ECHO) /**/ >>$(INCL)\lev_comp.h lev_$(LEX).c: $(SSHR)\lev_lex.c $(COPY) $(SSHR)\lev_lex.c $@ endif # # Dungeon Dependencies # dgn_comp.exe: $(DGNCOMPOBJS) @echo INPUT( $(DGNCOMPOBJS) )> tmp.lnk $(LINK) $(LFLAGS) -mconsole $(GTKGCCFLAGS) -odgn_comp.exe tmp.lnk @$(DEL) tmp.lnk ifeq ($(YACC_LEX),Y) dgn_yacc.o: $(HACK_H) $(DGN_FILE_H) dgn_yacc.c $(CCOMPILE) $(CFLAGS) -o$@ dgn_yacc.c else dgn_yacc.o: $(HACK_H) $(DGN_FILE_H) $(INCL)\dgn_comp.h dgn_yacc.c $(CCOMPILE) $(CFLAGS) -o$@ dgn_yacc.c endif dgn_$(LEX).o: $(HACK_H) $(DGN_FILE_H) $(INCL)\dgn_comp.h \ dgn_$(LEX).c $(CCOMPILE) $(CFLAGS) -o$@ dgn_$(LEX).c dgn_main.c: $(UTIL)\dgn_main.c $(COPY) $(UTIL)\dgn_main.c . dgn_main.o: $(HACK_H) $(INCL)\dgn_comp.h: dgn_yacc.c ifeq ($(YACC_LEX),Y) dgn_yacc.c: $(UTIL)\dgn_comp.y $(YACC) -d $(DUTIL)/dgn_comp.y $(COPY) $(YTABC) $@ $(COPY) $(YTABH) $(INCL)\dgn_comp.h $(DEL) $(YTABC) $(DEL) $(YTABH) dgn_$(LEX).c: $(UTIL)\dgn_comp.l $(LEX) $(DUTIL)/dgn_comp.l $(COPY) $(LEXYYC) $@ $(DEL) $(LEXYYC) else dgn_yacc.c: $(SSHR)\dgn_yacc.c $(COPY) $(SSHR)\dgn_yacc.c $@ $(INCL)\dgn_comp.h: $(SSHR)\dgn_comp.h $(COPY) $(SSHR)\dgn_comp.h $@ $(ECHO) /**/ >>$(INCL)\dgn_comp.h dgn_$(LEX).c: $(SSHR)\dgn_lex.c $(COPY) $(SSHR)\dgn_lex.c $@ endif # # Recover Utility # recover.exe: $(RECOVOBJS) $(LINK) $(LFLAGS) -mconsole -orecover.exe recover.o recover.c: $(UTIL)\recover.c $(COPY) $(UTIL)\recover.c . recover.o: $(CONFIG_H) recover.c $(CCOMPILE) $(CFLAGS) -o$@ recover.c # # Tiles # # Headers $(INCL)\tile.h: $(WSHR)\tile_t.h tilemap.exe tilemap.exe # Utilities txtmerge.exe: txtmerge.o $(TEXTIO) @echo INPUT( txtmerge.o )> tmp.lnk @echo INPUT( $(TEXTIO) )>> tmp.lnk $(LINK) $(LFLAGS) -mconsole $(GTKGCCFLAGS) -otxtmerge.exe tmp.lnk @$(DEL) tmp.lnk tile2x11.exe: tile2x11.o $(TEXTIO) @echo INPUT( tile2x11.o )> tmp.lnk @echo INPUT( $(TEXTIO) )>> tmp.lnk $(LINK) $(LFLAGS) -mconsole $(GTKGCCFLAGS) -otile2x11.exe tmp.lnk @$(DEL) tmp.lnk tile2bmp.exe: tile2bmp.o $(TEXTIO) @echo INPUT( tile2bmp.o )> tmp.lnk @echo INPUT( $(TEXTIO) )>> tmp.lnk $(LINK) $(LFLAGS) -mconsole $(GTKGCCFLAGS) -otile2bmp.exe tmp.lnk @$(DEL) tmp.lnk tile2png.exe: tile2png.o $(TEXTIO) @echo INPUT( tile2png.o )> tmp.lnk @echo INPUT( $(TEXTIO) )>> tmp.lnk cc-gtk -l $(LINK) $(LFLAGS) -mconsole $(GTKGCCFLAGS) -otile2png.exe tmp.lnk @$(DEL) tmp.lnk magtile.exe: magtile.o $(TEXTIO) @echo INPUT( magtile.o )> tmp.lnk @echo INPUT( $(TEXTIO) )>> tmp.lnk $(LINK) $(LFLAGS) -mconsole $(GTKGCCFLAGS) -omagtile.exe tmp.lnk @$(DEL) tmp.lnk bigtile.exe: bigtile.o $(TEXTIO) @echo INPUT( bigtile.o )> tmp.lnk @echo INPUT( $(TEXTIO) )>> tmp.lnk $(LINK) $(LFLAGS) -mconsole $(GTKGCCFLAGS) -obigtile.exe tmp.lnk @$(DEL) tmp.lnk txtbg.exe: txtbg.o $(TEXTIO) @echo INPUT( txtbg.o )> tmp.lnk @echo INPUT( $(TEXTIO) )>> tmp.lnk $(LINK) $(LFLAGS) -mconsole $(GTKGCCFLAGS) -otxtbg.exe tmp.lnk @$(DEL) tmp.lnk mapmerge.exe: mapmerge.o $(CCOMPILE) $(LFLAGS) -mconsole -omapmerge.exe mapmerge.o tile.c: tilemap.exe tilemap.exe @echo A new $@ has been created tilemap.exe: tilemap.o $(CCOMPILE) $(LFLAGS) -mconsole -otilemap.exe tilemap.o tilemap.c: $(WSHR)\tilemap.c copy $(WSHR)\tilemap.c . tilemap.o: $(WSHR)\tilemap.c $(HACK_H) $(CCOMPILE) $(CFLAGS) -c ../win/share/tilemap.c magtile.o: $(WSHR)\magtile.c $(INCL)\config.h $(INCL)\tile.h $(CCOMPILE) $(CFLAGS) -c $(WSHR)\magtile.c bigtile.o: $(WSHR)\bigtile.c $(INCL)\config.h $(INCL)\tile.h $(CCOMPILE) $(CFLAGS) -c $(WSHR)\bigtile.c txtbg.o: $(WSHR)\txtbg.c $(INCL)\config.h $(INCL)\tile.h $(CCOMPILE) $(CFLAGS) -c $(WSHR)\txtbg.c mapmerge.o: $(WSHR)\mapmerge.c $(HACK_H) $(CCOMPILE) $(CFLAGS) -c $(WSHR)\mapmerge.c txtmerge.o: $(WSHR)\txtmerge.c $(INCL)\config.h $(INCL)\tile.h $(CCOMPILE) $(CFLAGS) -c ../win/share/txtmerge.c tile2x11.o: ../win/X11/tile2x11.c $(INCL)\hack.h $(INCL)\tile.h \ $(INCL)\tile2x11.h $(CCOMPILE) $(CFLAGS) -c ../win/X11/tile2x11.c tile2bmp.o: ../win/share/tile2bmp.c $(INCL)\hack.h $(INCL)\tile.h \ $(INCL)\win32api.h $(CCOMPILE) $(CFLAGS) -c ../win/share/tile2bmp.c tile2png.o: cc-gtk.exe ../win/share/tile2png.c $(INCL)\hack.h $(INCL)\tile.h $(CCGTK) $(CFLAGS) -I$(MW32GTK)/include -c ../win/share/tile2png.c x11tiles: tile2x11.exe ../win/share/monsters.txt ../win/share/objects.txt \ ../win/share/other.txt tile2x11 -o x11tiles $(WSHR)\monsters.txt $(WSHR)\objects.txt \ $(WSHR)\other.txt x11tiles.map: mapmerge.exe ../win/share/monsters.map ../win/share/objects.map \ ../win/share/other.map mapmerge x11tiles.map $(WSHR)\monsters.map $(WSHR)\objects.map \ $(WSHR)\other.map x11bigtiles: tile2x11.exe ../win/share/mon32.txt \ ../win/share/obj32.txt ../win/share/oth32.txt tile2x11 -o x11bigtiles $(WSHR)\mon32.txt $(WSHR)\obj32.txt \ $(WSHR)\oth32.txt x11bigtiles.map: x11tiles.map $(COPY) x11tiles.map x11bigtiles.map x11big3dtiles: tile2x11.exe ../win/share/mon3d.txt \ ../win/share/obj3d.txt ../win/share/oth3d.txt tile2x11 -o x11big3dtiles $(WSHR)\mon3d.txt $(WSHR)\obj3d.txt \ $(WSHR)\oth3d.txt x11big3dtiles.map: x11tiles.map $(COPY) x11tiles.map x11big3dtiles.map tiles.bmp: tile2bmp.exe ../win/share/monsters.txt \ ../win/share/objects.txt ../win/share/other.txt tile2bmp $@ $(WSHR)\monsters.txt $(WSHR)\objects.txt \ $(WSHR)\other.txt tiles32.bmp: tile2bmp.exe ../win/share/mon32.txt \ ../win/share/obj32.txt ../win/share/oth32.txt tile2bmp $@ $(WSHR)\mon32.txt $(WSHR)\obj32.txt \ $(WSHR)\oth32.txt gltile16.png: tile2png.exe ../win/share/monsters.txt ../win/share/objects.txt \ ../win/share/other.txt tile2png -o gltile16.png $(WSHR)\monsters.txt $(WSHR)\objects.txt \ $(WSHR)\other.txt gltile16.map: mapmerge.exe ../win/share/monsters.map ../win/share/objects.map \ ../win/share/other.map mapmerge gltile16.map $(WSHR)\monsters.map $(WSHR)\objects.map \ $(WSHR)\other.map gltile32.png: tile2png.exe ../win/share/mon32.txt \ ../win/share/obj32.txt ../win/share/oth32.txt tile2png -o gltile32.png $(WSHR)\mon32.txt $(WSHR)\obj32.txt \ $(WSHR)\oth32.txt gltile32.map: gltile16.map $(COPY) gltile16.map gltile32.map gltile64.png: tile2png.exe ../win/share/mon3d.txt \ ../win/share/obj3d.txt ../win/share/oth3d.txt tile2png -o gltile64.png $(WSHR)\mon3d.txt $(WSHR)\obj3d.txt \ $(WSHR)\oth3d.txt gltile64.map: gltile16.map $(COPY) gltile16.map gltile64.map $(WSHR)\monmag.txt: magtile.exe ../win/share/monsters.txt magtile $(WSHR)\objmag.txt: magtile.exe ../win/share/objects.txt magtile $(WSHR)\othmag.txt: magtile.exe ../win/share/other.txt magtile $(WSHR)\monbig.txt: bigtile.exe ../win/share/mon32-t.txt \ ../win/share/obj32-t.txt \ ../win/share/oth32-t.txt bigtile $(WSHR)\objbig.txt: bigtile.exe ../win/share/mon32-t.txt \ ../win/share/obj32-t.txt \ ../win/share/oth32-t.txt bigtile $(WSHR)\othbig.txt: bigtile.exe ../win/share/mon32-t.txt \ ../win/share/obj32-t.txt \ ../win/share/oth32-t.txt bigtile ../win/share/mon32.txt: txtbg.exe ../win/share/mon32-t.txt txtbg ../win/share/mon32-t.txt ../win/share/mon32.txt ../win/share/obj32.txt: txtbg.exe ../win/share/obj32-t.txt txtbg ../win/share/obj32-t.txt ../win/share/obj32.txt ../win/share/oth32.txt: txtbg.exe ../win/share/oth32-t.txt txtbg ../win/share/oth32-t.txt ../win/share/oth32.txt ../win/share/mon32-t.txt: txtmerge.exe $(WSHR)\monmag.txt \ $(WSHR)\mon32mi.txt $(WSHR)\mon32alg.txt \ $(WSHR)\mon32aw.txt $(WSHR)\mon32se.txt $(WSHR)\palette.txt txtmerge -p $(WSHR)\palette.txt $(WSHR)\mon32-t.txt $(WSHR)\monmag.txt \ -b $(WSHR)\mon32mi.txt -b $(WSHR)\mon32se.txt txtmerge $(WSHR)\mon32-t.txt $(WSHR)\mon32-t.txt \ -bff00ff $(WSHR)\mon32alg.txt -bff00ff $(WSHR)\mon32aw.txt ../win/share/obj32-t.txt: txtmerge.exe $(WSHR)\objmag.txt \ $(WSHR)\obj32mi.txt $(WSHR)\obj32se.txt \ $(WSHR)\obj32alg.txt $(WSHR)\palette.txt txtmerge -p $(WSHR)\palette.txt $(WSHR)\obj32-t.txt $(WSHR)\objmag.txt \ -b $(WSHR)\obj32mi.txt txtmerge $(WSHR)\obj32-t.txt $(WSHR)\obj32-t.txt \ -b $(WSHR)\obj32se.txt -bff00ff $(WSHR)\obj32alg.txt ../win/share/oth32-t.txt: txtmerge.exe $(WSHR)\othmag.txt \ $(WSHR)\oth32mi.txt $(WSHR)\oth32se.txt \ $(WSHR)\oth32alg.txt $(WSHR)\palette.txt txtmerge -p $(WSHR)\palette.txt $(WSHR)\oth32-t.txt $(WSHR)\othmag.txt \ -b $(WSHR)\oth32mi.txt txtmerge $(WSHR)\oth32-t.txt $(WSHR)\oth32-t.txt \ -b $(WSHR)\oth32se.txt -bff00ff $(WSHR)\oth32alg.txt ../win/share/mon3d.txt: txtmerge.exe $(WSHR)\monbig.txt \ $(WSHR)\mon3dmi.txt $(WSHR)\palette.txt txtmerge -p $(WSHR)\palette.txt $(WSHR)\mon3d.txt $(WSHR)\monbig.txt \ -b $(WSHR)\mon3dmi.txt ../win/share/obj3d.txt: txtmerge.exe $(WSHR)\objbig.txt $(COPY) $(WSHR)\objbig.txt $(WSHR)\obj3d.txt ../win/share/oth3d.txt: txtmerge.exe $(WSHR)\othbig.txt \ $(WSHR)\oth3dmi.txt $(WSHR)\oth-2kmi.txt \ $(WSHR)\oth3dse.txt $(WSHR)\palette.txt txtmerge -p $(WSHR)\palette.txt $(WSHR)\oth3d.txt $(WSHR)\othbig.txt \ -b $(WSHR)\oth3dmi.txt txtmerge $(WSHR)\oth3d.txt $(WSHR)\oth3d.txt -b $(WSHR)\oth-2kmi.txt \ -b $(WSHR)\oth3dse.txt pet_mark.xbm: ../win/X11/pet_mark.xbm $(COPY) ..\win\X11\pet_mark.xbm pet_mark.xbm rip.xpm: ../win/X11/rip.xpm $(COPY) ..\win\X11\rip.xpm rip.xpm credit.xpm: ../dat/credit.xpm $(COPY) ..\dat\credit.xpm credit.xpm tiletext.o: $(CONFIG_H) $(INCL)\tile.h $(WSHR)\tiletext.c $(COPY) $(WSHR)\tiletext.c . $(CCOMPILE) $(CFLAGS) -o$@ tiletext.c tiletxt.o: $(CONFIG_H) $(INCL)\tile.h tilemap.c $(CCOMPILE) $(CFLAGS) -DTILETEXT -o$@ tilemap.c uudecode.o: $(SSHR)\uudecode.c $(CCOMPILE) $(CFLAGS) -c $(SSHR)\uudecode.c $(UTIL)\uudecode.exe: uudecode.o $(CCOMPILE) $(LFLAGS) -mconsole -o$@ uudecode.o # # Other Util Dependencies. # alloc.o: $(CONFIG_H) alloc.c $(CCOMPILE) $(CFLAGS) -oalloc.o alloc.c drawing.o: $(CONFIG_H) drawing.c $(CCOMPILE) $(CFLAGS) -odrawing.o drawing.c decl.o: $(CONFIG_H) decl.c $(CCOMPILE) $(CFLAGS) -odecl.o decl.c monst.o: $(CONFIG_H) $(PERMONST_H) $(ESHK_H) \ $(EPRI_H) $(VAULT_H) $(INCL)\monsym.h \ $(INCL)\color.h monst.c $(CCOMPILE) $(CFLAGS) -omonst.o monst.c objects.o: $(CONFIG_H) $(INCL)\obj.h $(INCL)\objclass.h \ $(INCL)\prop.h $(INCL)\color.h objects.c $(CCOMPILE) $(CFLAGS) -oobjects.o objects.c panic.c: $(UTIL)\panic.c $(COPY) $(UTIL)\panic.c . panic.o: $(CONFIG_H) panic.c nhlan.c: $(SSHR)\nhlan.c $(COPY) $(SSHR)\nhlan.c . nhlan.o: $(HACK_H) $(NHLAN_H) $(SSHR)\nhlan.c $(COPY) $(SSHR)\nhlan.c . $(CCOMPILE) $(CFLAGS) -o$@ nhlan.c DATABASE = $(DAT)\data.base dat.tag: $(DAT)\nhshare $(DAT)\nhushare $(CNF_SHARE_DATND) @echo dat done >dat.tag $(DAT)\data: utility.tag $(DATABASE) -makedefs -d $(DAT)\rumors: utility.tag $(DAT)\rumors.tru $(DAT)\rumors.fal -makedefs -r $(DAT)\quest.dat: utility.tag $(DAT)\quest.txt -makedefs -q $(DAT)\oracles: utility.tag $(DAT)\oracles.txt -makedefs -h sp_lev.tag: utility.tag $(DAT)\beholder.des $(DAT)\bigroom.des \ $(DAT)\blkmar.des $(DAT)\castle.des $(DAT)\grund.des \ $(DAT)\dragons.des $(DAT)\endgame.des $(DAT)\gehennom.des \ $(DAT)\giants.des $(DAT)\guild.des $(DAT)\knox.des \ $(DAT)\kobold-1.des $(DAT)\kobold-2.des $(DAT)\lich.des \ $(DAT)\mall-1.des $(DAT)\mall-2.des $(DAT)\medusa.des \ $(DAT)\sokoban.des $(DAT)\mines.des $(DAT)\mtemple.des \ $(DAT)\newmall.des $(DAT)\nymph.des $(DAT)\oracle.des \ $(DAT)\rats.des $(DAT)\sea.des $(DAT)\spiders.des \ $(DAT)\stor-1.des $(DAT)\stor-2.des $(DAT)\stor-3.des \ $(DAT)\tomb.des $(DAT)\tower.des $(DAT)\yendor.des \ $(DAT)\arch.des $(DAT)\barb.des $(DAT)\caveman.des \ $(DAT)\flame.des $(DAT)\healer.des $(DAT)\ice.des \ $(DAT)\knight.des $(DAT)\monk.des $(DAT)\necro.des \ $(DAT)\priest.des $(DAT)\rogue.des $(DAT)\samurai.des \ $(DAT)\tourist.des $(DAT)\slayer.des $(DAT)\valkyrie.des \ $(DAT)\wizard.des $(DAT)\yeoman.des $(DAT)\frnknstn.des \ $(DAT)\nightmar.des $(DAT)\ranger.des lev_comp $(DDAT)/beholder.des lev_comp $(DDAT)/bigroom.des lev_comp $(DDAT)/blkmar.des lev_comp $(DDAT)/castle.des lev_comp $(DDAT)/grund.des lev_comp $(DDAT)/dragons.des lev_comp $(DDAT)/endgame.des lev_comp $(DDAT)/gehennom.des lev_comp $(DDAT)/giants.des lev_comp $(DDAT)/guild.des lev_comp $(DDAT)/knox.des lev_comp $(DDAT)/kobold-1.des lev_comp $(DDAT)/kobold-2.des lev_comp $(DDAT)/lich.des lev_comp $(DDAT)/mall-1.des lev_comp $(DDAT)/mall-2.des lev_comp $(DDAT)/medusa.des lev_comp $(DDAT)/sokoban.des lev_comp $(DDAT)/mines.des lev_comp $(DDAT)/mtemple.des lev_comp $(DDAT)/newmall.des lev_comp $(DDAT)/nymph.des lev_comp $(DDAT)/oracle.des lev_comp $(DDAT)/rats.des lev_comp $(DDAT)/sea.des lev_comp $(DDAT)/spiders.des lev_comp $(DDAT)/stor-1.des lev_comp $(DDAT)/stor-2.des lev_comp $(DDAT)/stor-3.des lev_comp $(DDAT)/tomb.des lev_comp $(DDAT)/tower.des lev_comp $(DDAT)/yendor.des lev_comp $(DDAT)/arch.des lev_comp $(DDAT)/barb.des lev_comp $(DDAT)/caveman.des lev_comp $(DDAT)/flame.des lev_comp $(DDAT)/healer.des lev_comp $(DDAT)/ice.des lev_comp $(DDAT)/knight.des lev_comp $(DDAT)/monk.des lev_comp $(DDAT)/necro.des lev_comp $(DDAT)/priest.des lev_comp $(DDAT)/rogue.des lev_comp $(DDAT)/samurai.des lev_comp $(DDAT)/tourist.des lev_comp $(DDAT)/slayer.des lev_comp $(DDAT)/valkyrie.des lev_comp $(DDAT)/wizard.des lev_comp $(DDAT)/yeoman.des lev_comp $(DDAT)/frnknstn.des lev_comp $(DDAT)/nightmar.des lev_comp $(DDAT)/ranger.des $(COPY) *.lev $(DAT) $(ECHO) sp_levs done > sp_lev.tag $(DAT)\dungeon: utility.tag $(DAT)\dungeon.def -makedefs -e dgn_comp $(DAT)\dungeon.pdf # # DLB stuff # $(DAT)\nhshare: dlb_main.exe $(DAT)\data $(DAT)\rumors $(DAT)\dungeon \ $(DAT)\oracles $(DAT)\quest.dat sp_lev.tag $(ECHO) data >$(DAT)\dlb.lst $(ECHO) oracles >>$(DAT)\dlb.lst ifeq ($(USE_GUI),Y) $(ECHO) guioptions >>$(DAT)\dlb.lst else $(ECHO) ttyoptions >>$(DAT)\dlb.lst endif $(ECHO) rumors >>$(DAT)\dlb.lst $(ECHO) help >>$(DAT)\dlb.lst $(ECHO) hh >>$(DAT)\dlb.lst $(ECHO) cmdhelp >>$(DAT)\dlb.lst $(ECHO) history >>$(DAT)\dlb.lst $(ECHO) opthelp >>$(DAT)\dlb.lst $(ECHO) wizhelp >>$(DAT)\dlb.lst $(ECHO) gypsy.txt >>$(DAT)\dlb.lst $(ECHO) license >>$(DAT)\dlb.lst dlb_main cvCIf $(DAT) dlb.lst nhshare $(DAT)\nhushare: dlb_main.exe $(DAT)\dungeon $(DAT)\quest.dat sp_lev.tag $(ECHO) dungeon > $(DAT)\dlb2.lst $(ECHO) quest.dat >>$(DAT)\dlb2.lst $(LS) $(DAT)\*.lev >>$(DAT)\dlb2.lst dlb_main cvCIf $(DAT) dlb2.lst nhushare dlb_main.exe: $(DLBOBJS) $(LINK) $(LFLAGS) -mconsole -odlb_main.exe $(DLBOBJS) $(COPY) $@ $(DAT)\dlb_main.exe dlb_main.o: $(UTIL)\dlb_main.c $(INCL)\config.h $(DLB_H) $(COPY) $(UTIL)\dlb_main.c . $(CCOMPILE) $(CFLAGS) -odlb_main.o dlb_main.c # # NT dependencies # nttty.o: $(HACK_H) $(TILE_H) $(INCL)/win32api.h $(NTSYS)/nttty.c $(CCOMPILE) $(CFLAGS) -o$@ $(NTSYS)/nttty.c winnt.o: $(HACK_H) $(INCL)/win32api.h $(NTSYS)/winnt.c $(CCOMPILE) $(CFLAGS) -o$@ $(NTSYS)/winnt.c ntsound.o: $(HACK_H) $(NTSYS)/ntsound.c $(CCOMPILE) $(CFLAGS) -o$@ $(NTSYS)/ntsound.c mapimail.o: $(HACK_H) $(INCL)/nhlan.h $(NTSYS)/mapimail.c $(CCOMPILE) $(CFLAGS) -DMAPI_VERBOSE -o$@ $(NTSYS)/mapimail.c # # win/win32 # mswproc.o: $(WIN32)/mswproc.c $(CCOMPILE) $(CFLAGS) $(WINMSCFLAGS) -o$@ ../win/win32/mswproc.c winhack.o: $(WIN32)/winhack.c $(CCOMPILE) $(CFLAGS) $(WINMSCFLAGS) -o$@ ../win/win32/winhack.c mhdlg.o: $(WIN32)/mhdlg.c $(CCOMPILE) $(CFLAGS) $(WINMSCFLAGS) -o$@ ../win/win32/mhdlg.c mhaskyn.o: $(WIN32)/mhaskyn.c $(CCOMPILE) $(CFLAGS) $(WINMSCFLAGS) -o$@ ../win/win32/mhaskyn.c mhfont.o: $(WIN32)/mhfont.c $(CCOMPILE) $(CFLAGS) $(WINMSCFLAGS) -o$@ ../win/win32/mhfont.c mhinput.o: $(WIN32)/mhinput.c $(CCOMPILE) $(CFLAGS) $(WINMSCFLAGS) -o$@ ../win/win32/mhinput.c mhmain.o: $(WIN32)/mhmain.c $(CCOMPILE) $(CFLAGS) $(WINMSCFLAGS) -o$@ ../win/win32/mhmain.c mhmsgwnd.o: $(WIN32)/mhmsgwnd.c $(CCOMPILE) $(CFLAGS) $(WINMSCFLAGS) -o$@ ../win/win32/mhmsgwnd.c mhsplash.o: $(WIN32)/mhsplash.c $(CCOMPILE) $(CFLAGS) $(WINMSCFLAGS) -o$@ ../win/win32/mhsplash.c mhstatus.o: $(WIN32)/mhstatus.c $(CCOMPILE) $(CFLAGS) $(WINMSCFLAGS) -o$@ ../win/win32/mhstatus.c mhtext.o: $(WIN32)/mhtext.c $(CCOMPILE) $(CFLAGS) $(WINMSCFLAGS) -o$@ ../win/win32/mhtext.c mhmenu.o: $(WIN32)/mhmenu.c $(CCOMPILE) $(CFLAGS) $(WINMSCFLAGS) -o$@ ../win/win32/mhmenu.c mhmap.o: $(WIN32)/mhmap.c $(CCOMPILE) $(CFLAGS) $(WINMSCFLAGS) -o$@ ../win/win32/mhmap.c mhrip.o: $(WIN32)/mhrip.c $(CCOMPILE) $(CFLAGS) $(WINMSCFLAGS) -o$@ ../win/win32/mhrip.c # The rest are stolen from sys/unix/Makefile.src, # with the following changes: # * ../include changed to $(INCL) # * -c (which is included in CFLAGS) substituted # with -o$@ # * $(CC) changed to $(CCOMPILE) # * Dependencies on win32api.h revealed # but otherwise untouched. # That means that there is some irrelevant stuff # in here, but maintenance should be easier. # tos.o: ../sys/atari/tos.c $(HACK_H) $(INCL)/tcap.h $(CCOMPILE) $(CFLAGS) -o$@ ../sys/atari/tos.c pcmain.o: ../sys/share/pcmain.c $(HACK_H) $(INCL)/dlb.h \ $(INCL)/patchlevel.h $(INCL)/win32api.h $(CCOMPILE) $(CFLAGS) -o$@ ../sys/share/pcmain.c pcsys.o: ../sys/share/pcsys.c $(HACK_H) $(CCOMPILE) $(CFLAGS) -o$@ ../sys/share/pcsys.c pctty.o: ../sys/share/pctty.c $(HACK_H) $(CCOMPILE) $(CFLAGS) -o$@ ../sys/share/pctty.c pcunix.o: ../sys/share/pcunix.c $(HACK_H) $(CCOMPILE) $(CFLAGS) -o$@ ../sys/share/pcunix.c random.o: ../sys/share/random.c $(HACK_H) $(CCOMPILE) $(CFLAGS) -o$@ ../sys/share/random.c ioctl.o: ../sys/share/ioctl.c $(HACK_H) $(INCL)/tcap.h $(CCOMPILE) $(CFLAGS) -o$@ ../sys/share/ioctl.c unixtty.o: ../sys/share/unixtty.c $(HACK_H) $(CCOMPILE) $(CFLAGS) -o$@ ../sys/share/unixtty.c unixmain.o: ../sys/unix/unixmain.c $(HACK_H) $(INCL)/dlb.h $(CCOMPILE) $(CFLAGS) -o$@ ../sys/unix/unixmain.c unixunix.o: ../sys/unix/unixunix.c $(HACK_H) $(CCOMPILE) $(CFLAGS) -o$@ ../sys/unix/unixunix.c unixres.o: ../sys/unix/unixres.c $(CONFIG_H) $(CCOMPILE) $(CFLAGS) -o$@ ../sys/unix/unixres.c bemain.o: ../sys/be/bemain.c $(HACK_H) $(INCL)/dlb.h $(CCOMPILE) $(CFLAGS) -o$@ ../sys/be/bemain.c getline.o: ../win/tty/getline.c $(HACK_H) $(INCL)/func_tab.h $(CCOMPILE) $(CFLAGS) -o$@ ../win/tty/getline.c termcap.o: ../win/tty/termcap.c $(HACK_H) $(INCL)/tcap.h $(CCOMPILE) $(CFLAGS) -o$@ ../win/tty/termcap.c topl.o: ../win/tty/topl.c $(HACK_H) $(INCL)/tcap.h $(CCOMPILE) $(CFLAGS) -o$@ ../win/tty/topl.c wintty.o: ../win/tty/wintty.c $(HACK_H) $(INCL)/dlb.h \ $(INCL)/patchlevel.h $(INCL)/tcap.h $(CCOMPILE) $(CFLAGS) -o$@ ../win/tty/wintty.c Window.o: ../win/X11/Window.c $(INCL)/xwindowp.h $(INCL)/xwindow.h \ $(CONFIG_H) $(CCOMPILE) $(CFLAGS) -o$@ ../win/X11/Window.c dialogs.o: ../win/X11/dialogs.c $(CONFIG_H) $(CCOMPILE) $(CFLAGS) -o$@ ../win/X11/dialogs.c 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 $(CCOMPILE) $(CFLAGS) -o$@ ../win/X11/winX.c winmap.o: ../win/X11/winmap.c $(INCL)/xwindow.h $(HACK_H) $(INCL)/dlb.h \ $(INCL)/winX.h $(INCL)/patchlevel.h $(INCL)/tile2x11.h $(CCOMPILE) $(CFLAGS) -o$@ ../win/X11/winmap.c winmenu.o: ../win/X11/winmenu.c $(HACK_H) $(INCL)/winX.h $(CCOMPILE) $(CFLAGS) -o$@ ../win/X11/winmenu.c winmesg.o: ../win/X11/winmesg.c $(INCL)/xwindow.h $(HACK_H) $(INCL)/winX.h $(CCOMPILE) $(CFLAGS) -o$@ ../win/X11/winmesg.c winmisc.o: ../win/X11/winmisc.c $(HACK_H) $(INCL)/func_tab.h \ $(INCL)/winX.h $(CCOMPILE) $(CFLAGS) -o$@ ../win/X11/winmisc.c winstat.o: ../win/X11/winstat.c $(HACK_H) $(INCL)/winX.h $(CCOMPILE) $(CFLAGS) -o$@ ../win/X11/winstat.c wintext.o: ../win/X11/wintext.c $(HACK_H) $(INCL)/winX.h $(INCL)/xwindow.h $(CCOMPILE) $(CFLAGS) -o$@ ../win/X11/wintext.c winval.o: ../win/X11/winval.c $(HACK_H) $(INCL)/winX.h $(CCOMPILE) $(CFLAGS) -o$@ ../win/X11/winval.c gtk.o: ../win/gtk/gtk.c $(INCL)/md5.h $(INCL)/winGTK.h $(HACK_H) \ $(INCL)/nhxdr.h $(INCL)/proxycom.h $(INCL)/func_tab.h \ $(INCL)/dlb.h $(INCL)/patchlevel.h $(INCL)/proxycb.h \ $(INCL)/prxyclnt.h $(CCGTK) $(CFLAGS) $(WINGTKCFLAGS) -o$@ ../win/gtk/gtk.c gtkgetlin.o: ../win/gtk/gtkgetlin.c $(INCL)/winGTK.h $(HACK_H) \ $(INCL)/nhxdr.h $(INCL)/proxycom.h $(CCGTK) $(CFLAGS) $(WINGTKCFLAGS) -o$@ ../win/gtk/gtkgetlin.c gtkstatus.o: ../win/gtk/gtkstatus.c $(INCL)/winGTK.h $(HACK_H) \ $(INCL)/nhxdr.h $(INCL)/proxycom.h $(CCGTK) $(CFLAGS) $(WINGTKCFLAGS) -o$@ ../win/gtk/gtkstatus.c gtkmenu.o: ../win/gtk/gtkmenu.c $(INCL)/winGTK.h $(HACK_H) \ $(INCL)/nhxdr.h $(INCL)/proxycom.h $(INCL)/patchlevel.h $(CCGTK) $(CFLAGS) $(WINGTKCFLAGS) -o$@ ../win/gtk/gtkmenu.c gtkyn.o: ../win/gtk/gtkyn.c $(INCL)/winGTK.h $(HACK_H) $(INCL)/nhxdr.h \ $(INCL)/proxycom.h $(CCGTK) $(CFLAGS) $(WINGTKCFLAGS) -o$@ ../win/gtk/gtkyn.c gtkextcmd.o: ../win/gtk/gtkextcmd.c $(INCL)/winGTK.h $(HACK_H) \ $(INCL)/nhxdr.h $(INCL)/proxycom.h $(INCL)/proxycb.h \ $(INCL)/func_tab.h $(CCGTK) $(CFLAGS) $(WINGTKCFLAGS) -o$@ ../win/gtk/gtkextcmd.c gtkmap.o: ../win/gtk/gtkmap.c $(INCL)/winGTK.h $(HACK_H) $(INCL)/nhxdr.h \ $(INCL)/proxycom.h $(INCL)/dlb.h $(INCL)/patchlevel.h \ $(INCL)/proxycb.h $(INCL)/prxyclnt.h \ ../win/gtk/gtkprogress.h $(CCGTK) $(CFLAGS) $(WINGTKCFLAGS) -o$@ ../win/gtk/gtkmap.c gtkmessage.o: ../win/gtk/gtkmessage.c $(INCL)/winGTK.h $(HACK_H) \ $(INCL)/nhxdr.h $(INCL)/proxycom.h $(CCGTK) $(CFLAGS) $(WINGTKCFLAGS) -o$@ ../win/gtk/gtkmessage.c gtkmisc.o: ../win/gtk/gtkmisc.c $(INCL)/winGTK.h $(HACK_H) \ $(INCL)/nhxdr.h $(INCL)/proxycom.h $(INCL)/proxycb.h $(CCGTK) $(CFLAGS) $(WINGTKCFLAGS) -o$@ ../win/gtk/gtkmisc.c gtktile.o: ../win/gtk/gtktile.c $(INCL)/winGTK.h $(HACK_H) \ $(INCL)/nhxdr.h $(INCL)/proxycom.h $(INCL)/dlb.h \ $(INCL)/proxycb.h $(INCL)/prxyclnt.h \ ../win/gtk/gtkprogress.h $(CCGTK) $(CFLAGS) $(WINGTKCFLAGS) -o$@ ../win/gtk/gtktile.c xshmmap.o: ../win/gtk/xshmmap.c $(INCL)/winGTK.h $(HACK_H) \ $(INCL)/nhxdr.h $(INCL)/proxycom.h $(CCGTK) $(CFLAGS) $(WINGTKCFLAGS) -o$@ ../win/gtk/xshmmap.c gtkhackrc.o: ../win/gtk/gtkhackrc.c $(INCL)/winGTK.h $(HACK_H) \ $(INCL)/nhxdr.h $(INCL)/proxycom.h $(INCL)/prxyclnt.h $(CCGTK) $(CFLAGS) $(WINGTKCFLAGS) -o$@ ../win/gtk/gtkhackrc.c gtkprefs.o: ../win/gtk/gtkprefs.c $(INCL)/winGTK.h $(HACK_H) \ $(INCL)/nhxdr.h $(INCL)/proxycom.h $(CCGTK) $(CFLAGS) $(WINGTKCFLAGS) -o$@ ../win/gtk/gtkprefs.c gtkprogress.o: ../win/gtk/gtkprogress.c $(INCL)/winGTK.h $(HACK_H) \ $(INCL)/nhxdr.h $(INCL)/proxycom.h \ ../win/gtk/gtkprogress.h $(CCGTK) $(CFLAGS) $(WINGTKCFLAGS) -o$@ ../win/gtk/gtkprogress.c gtkext.o: ../win/gtk/gtkext.c $(INCL)/winGTK.h $(HACK_H) \ $(INCL)/nhxdr.h $(INCL)/proxycom.h $(INCL)/prxyclnt.h $(CCGTK) $(CFLAGS) $(WINGTKCFLAGS) -o$@ ../win/gtk/gtkext.c gtkint.o: ../win/gtk/gtkint.c $(INCL)/nhxdr.h $(INCL)/proxycom.h \ $(INCL)/prxyclnt.h $(INCL)/winGTK.h $(HACK_H) \ $(INCL)/func_tab.h $(INCL)/dlb.h $(INCL)/patchlevel.h $(CCGTK) $(CFLAGS) $(WINGTKCFLAGS) -o$@ ../win/gtk/gtkint.c gnaskstr.o: ../win/gnome/gnaskstr.c ../win/gnome/gnaskstr.h \ ../win/gnome/gnmain.h $(CCOMPILE) $(CFLAGS) $(GNOMEINC) -o$@ ../win/gnome/gnaskstr.c gnbind.o: ../win/gnome/gnbind.c ../win/gnome/gnbind.h ../win/gnome/gnmain.h \ ../win/gnome/gnaskstr.h ../win/gnome/gnyesno.h $(CCOMPILE) $(CFLAGS) $(GNOMEINC) -o$@ ../win/gnome/gnbind.c gnglyph.o: ../win/gnome/gnglyph.c ../win/gnome/gnglyph.h $(CCOMPILE) $(CFLAGS) $(GNOMEINC) -o$@ ../win/gnome/gnglyph.c gnmain.o: ../win/gnome/gnmain.c ../win/gnome/gnmain.h ../win/gnome/gnsignal.h \ ../win/gnome/gnbind.h ../win/gnome/gnopts.h $(HACK_H) \ $(INCL)/date.h $(CCOMPILE) $(CFLAGS) $(GNOMEINC) -o$@ ../win/gnome/gnmain.c gnmap.o: ../win/gnome/gnmap.c ../win/gnome/gnmap.h ../win/gnome/gnglyph.h \ ../win/gnome/gnsignal.h $(HACK_H) $(CCOMPILE) $(CFLAGS) $(GNOMEINC) -o$@ ../win/gnome/gnmap.c gnmenu.o: ../win/gnome/gnmenu.c ../win/gnome/gnmenu.h ../win/gnome/gnmain.h \ ../win/gnome/gnbind.h $(CCOMPILE) $(CFLAGS) $(GNOMEINC) -o$@ ../win/gnome/gnmenu.c gnmesg.o: ../win/gnome/gnmesg.c ../win/gnome/gnmesg.h ../win/gnome/gnsignal.h $(CCOMPILE) $(CFLAGS) $(GNOMEINC) -o$@ ../win/gnome/gnmesg.c gnopts.o: ../win/gnome/gnopts.c ../win/gnome/gnopts.h ../win/gnome/gnglyph.h \ ../win/gnome/gnmain.h ../win/gnome/gnmap.h $(HACK_H) $(CCOMPILE) $(CFLAGS) $(GNOMEINC) -o$@ ../win/gnome/gnopts.c gnplayer.o: ../win/gnome/gnplayer.c ../win/gnome/gnplayer.h \ ../win/gnome/gnmain.h $(HACK_H) $(CCOMPILE) $(CFLAGS) $(GNOMEINC) -o$@ ../win/gnome/gnplayer.c gnsignal.o: ../win/gnome/gnsignal.c ../win/gnome/gnsignal.h \ ../win/gnome/gnmain.h $(CCOMPILE) $(CFLAGS) $(GNOMEINC) -o$@ ../win/gnome/gnsignal.c gnstatus.o: ../win/gnome/gnstatus.c ../win/gnome/gnstatus.h \ ../win/gnome/gnsignal.h ../win/gnome/gn_xpms.h \ ../win/gnome/gnomeprv.h $(CCOMPILE) $(CFLAGS) $(GNOMEINC) -o$@ ../win/gnome/gnstatus.c gntext.o: ../win/gnome/gntext.c ../win/gnome/gntext.h ../win/gnome/gnmain.h \ ../win/gnome/gn_rip.h $(CCOMPILE) $(CFLAGS) $(GNOMEINC) -o$@ ../win/gnome/gntext.c gnyesno.o: ../win/gnome/gnyesno.c ../win/gnome/gnbind.h ../win/gnome/gnyesno.h $(CCOMPILE) $(CFLAGS) $(GNOMEINC) -o$@ ../win/gnome/gnyesno.c gnworn.o: ../win/gnome/gnworn.c ../win/gnome/gnworn.h ../win/gnome/gnglyph.h \ ../win/gnome/gnsignal.h ../win/gnome/gnomeprv.h $(CCOMPILE) $(CFLAGS) $(GNOMEINC) -o$@ ../win/gnome/gnworn.c wingem.o: ../win/gem/wingem.c $(HACK_H) $(INCL)/func_tab.h $(INCL)/dlb.h \ $(INCL)/patchlevel.h $(INCL)/wingem.h $(CCOMPILE) $(CFLAGS) -o$@ ../win/gem/wingem.c wingem1.o: ../win/gem/wingem1.c $(INCL)/gem_rsc.h $(INCL)/load_img.h \ $(INCL)/gr_rect.h $(INCL)/wintype.h $(INCL)/wingem.h $(CCOMPILE) $(CFLAGS) -o$@ ../win/gem/wingem1.c load_img.o: ../win/gem/load_img.c $(INCL)/load_img.h $(CCOMPILE) $(CFLAGS) -o$@ ../win/gem/load_img.c gr_rect.o: ../win/gem/gr_rect.c $(INCL)/gr_rect.h $(CCOMPILE) $(CFLAGS) -o$@ ../win/gem/gr_rect.c winproxy.o: ../win/proxy/winproxy.c $(HACK_H) $(INCL)/patchlevel.h \ $(INCL)/date.h $(INCL)/nhxdr.h $(INCL)/proxycom.h \ $(INCL)/winproxy.h $(INCL)/win32api.h $(CCOMPILE) $(CFLAGS) -o$@ ../win/proxy/winproxy.c callback.o: ../win/proxy/callback.c $(HACK_H) $(INCL)/func_tab.h \ $(INCL)/md5.h $(INCL)/nhxdr.h $(INCL)/proxycom.h \ $(INCL)/winproxy.h $(CCOMPILE) $(CFLAGS) -o$@ ../win/proxy/callback.c md5.o: ../win/proxy/md5.c $(INCL)/md5.h $(CCOMPILE) $(CFLAGS) -o$@ ../win/proxy/md5.c dlbh.o: ../win/proxy/dlbh.c $(HACK_H) $(INCL)/dlb.h $(CCOMPILE) $(CFLAGS) -o$@ ../win/proxy/dlbh.c mapid.o: ../win/proxy/mapid.c $(HACK_H) $(INCL)/nhxdr.h $(INCL)/winproxy.h $(CCOMPILE) $(CFLAGS) -o$@ ../win/proxy/mapid.c riputil.o: ../win/proxy/riputil.c $(HACK_H) $(CCOMPILE) $(CFLAGS) -o$@ ../win/proxy/riputil.c getopt.o: ../win/proxy/getopt.c $(HACK_H) $(CCOMPILE) $(CFLAGS) -o$@ ../win/proxy/getopt.c glyphmap.o: ../win/proxy/glyphmap.c $(HACK_H) $(INCL)/nhxdr.h \ $(INCL)/proxycom.h $(INCL)/winproxy.h $(CCOMPILE) $(CFLAGS) -o$@ ../win/proxy/glyphmap.c proxysvc.o: ../win/proxy/proxysvc.c $(INCL)/nhxdr.h $(INCL)/proxycom.h \ $(INCL)/proxycb.h $(INCL)/prxyclnt.h $(CCOMPILE) $(CFLAGS) -o$@ ../win/proxy/proxysvc.c proxycb.o: ../win/proxy/proxycb.c $(INCL)/nhxdr.h $(INCL)/proxycom.h \ $(INCL)/proxycb.h $(CCOMPILE) $(CFLAGS) -o$@ ../win/proxy/proxycb.c prxymap.o: ../win/proxy/prxymap.c $(INCL)/nhxdr.h $(INCL)/proxycom.h \ $(INCL)/prxyclnt.h $(CCOMPILE) $(CFLAGS) -o$@ ../win/proxy/prxymap.c prxychar.o: ../win/proxy/prxychar.c $(INCL)/nhxdr.h $(INCL)/proxycom.h \ $(INCL)/prxyclnt.h $(CCOMPILE) $(CFLAGS) -o$@ ../win/proxy/prxychar.c prxytile.o: ../win/proxy/prxytile.c $(INCL)/nhxdr.h $(INCL)/proxycom.h \ $(INCL)/prxyclnt.h $(INCL)/proxycb.h $(CCOMPILE) $(CFLAGS) -o$@ ../win/proxy/prxytile.c prxyconn.o: ../win/proxy/prxyconn.c $(INCL)/nhxdr.h $(INCL)/proxycom.h \ $(INCL)/prxyclnt.h $(CCOMPILE) $(CFLAGS) -o$@ ../win/proxy/prxyconn.c nhext.o: ../win/proxy/nhext.c $(INCL)/nhxdr.h $(INCL)/proxycom.h $(CCOMPILE) $(CFLAGS) -o$@ ../win/proxy/nhext.c nhxdr.o: ../win/proxy/nhxdr.c $(INCL)/nhxdr.h $(CCOMPILE) $(CFLAGS) -o$@ ../win/proxy/nhxdr.c nhextxdr.o: ../win/proxy/nhextxdr.c $(INCL)/nhxdr.h $(CCOMPILE) $(CFLAGS) -o$@ ../win/proxy/nhextxdr.c nhextio.o: ../win/proxy/nhextio.c $(INCL)/nhxdr.h $(CCOMPILE) $(CFLAGS) -o$@ ../win/proxy/nhextio.c nhextnb.o: ../win/proxy/nhextnb.c $(INCL)/nhxdr.h $(CCOMPILE) $(CFLAGS) -o$@ ../win/proxy/nhextnb.c compxdr.o: ../win/proxy/compxdr.c $(INCL)/nhxdr.h $(INCL)/proxycom.h $(CCOMPILE) $(CFLAGS) -o$@ ../win/proxy/compxdr.c gl_conf.o: ../win/gl/gl_conf.c $(HACK_H) $(INCL)/dlb.h \ $(INCL)/patchlevel.h $(INCL)/winGL.h $(CCOMPILE) $(CFLAGS) $(SDLGL_CFLAGS) -o$@ ../win/gl/gl_conf.c gl_emul.o: ../win/gl/gl_emul.c $(HACK_H) $(INCL)/winGL.h \ $(INCL)/func_tab.h $(CCOMPILE) $(CFLAGS) $(SDLGL_CFLAGS) -o$@ ../win/gl/gl_emul.c gl_font.o: ../win/gl/gl_font.c $(HACK_H) $(INCL)/patchlevel.h \ $(INCL)/winGL.h $(CCOMPILE) $(CFLAGS) $(SDLGL_CFLAGS) -o$@ ../win/gl/gl_font.c gl_hardw.o: ../win/gl/gl_hardw.c $(HACK_H) $(INCL)/patchlevel.h \ $(INCL)/winGL.h $(CCOMPILE) $(CFLAGS) $(SDLGL_CFLAGS) -o$@ ../win/gl/gl_hardw.c gl_image.o: ../win/gl/gl_image.c $(HACK_H) $(INCL)/patchlevel.h \ $(INCL)/winGL.h $(CCOMPILE) $(CFLAGS) $(SDLGL_CFLAGS) -o$@ ../win/gl/gl_image.c gl_main.o: ../win/gl/gl_main.c $(HACK_H) $(INCL)/dlb.h \ $(INCL)/patchlevel.h $(INCL)/winGL.h $(CCOMPILE) $(CFLAGS) $(SDLGL_CFLAGS) -o$@ ../win/gl/gl_main.c gl_map.o: ../win/gl/gl_map.c $(HACK_H) $(INCL)/patchlevel.h \ $(INCL)/winGL.h $(CCOMPILE) $(CFLAGS) $(SDLGL_CFLAGS) -o$@ ../win/gl/gl_map.c gl_menu.o: ../win/gl/gl_menu.c $(HACK_H) $(INCL)/dlb.h \ $(INCL)/patchlevel.h $(INCL)/winGL.h $(CCOMPILE) $(CFLAGS) $(SDLGL_CFLAGS) -o$@ ../win/gl/gl_menu.c gl_opt.o: ../win/gl/gl_opt.c $(HACK_H) $(INCL)/dlb.h \ $(INCL)/patchlevel.h $(INCL)/date.h $(INCL)/winGL.h $(CCOMPILE) $(CFLAGS) $(SDLGL_CFLAGS) -o$@ ../win/gl/gl_opt.c gl_role.o: ../win/gl/gl_role.c $(HACK_H) $(INCL)/dlb.h \ $(INCL)/patchlevel.h $(INCL)/winGL.h $(CCOMPILE) $(CFLAGS) $(SDLGL_CFLAGS) -o$@ ../win/gl/gl_role.c gl_rendu.o: ../win/gl/gl_rendu.c $(HACK_H) $(INCL)/patchlevel.h \ $(INCL)/winGL.h $(CCOMPILE) $(CFLAGS) $(SDLGL_CFLAGS) -o$@ ../win/gl/gl_rendu.c gl_softw.o: ../win/gl/gl_softw.c $(HACK_H) $(INCL)/patchlevel.h \ $(INCL)/winGL.h $(CCOMPILE) $(CFLAGS) $(SDLGL_CFLAGS) -o$@ ../win/gl/gl_softw.c gl_stat.o: ../win/gl/gl_stat.c $(HACK_H) $(INCL)/winGL.h $(CCOMPILE) $(CFLAGS) $(SDLGL_CFLAGS) -o$@ ../win/gl/gl_stat.c gl_text.o: ../win/gl/gl_text.c $(HACK_H) $(INCL)/dlb.h \ $(INCL)/patchlevel.h $(INCL)/winGL.h $(CCOMPILE) $(CFLAGS) $(SDLGL_CFLAGS) -o$@ ../win/gl/gl_text.c gl_tile.o: ../win/gl/gl_tile.c $(HACK_H) $(INCL)/patchlevel.h \ $(INCL)/winGL.h $(CCOMPILE) $(CFLAGS) $(SDLGL_CFLAGS) -o$@ ../win/gl/gl_tile.c gl_unit.o: ../win/gl/gl_unit.c $(HACK_H) $(INCL)/winGL.h $(CCOMPILE) $(CFLAGS) $(SDLGL_CFLAGS) -o$@ ../win/gl/gl_unit.c gl_win.o: ../win/gl/gl_win.c $(HACK_H) $(INCL)/dlb.h \ $(INCL)/patchlevel.h $(INCL)/winGL.h $(CCOMPILE) $(CFLAGS) $(SDLGL_CFLAGS) -o$@ ../win/gl/gl_win.c tile.o: tile.c $(HACK_H) qt_win.o: ../win/Qt/qt_win.cpp $(HACK_H) $(INCL)/func_tab.h \ $(INCL)/dlb.h $(INCL)/date.h $(INCL)/patchlevel.h \ $(INCL)/tile2x11.h $(INCL)/qt_win.h \ $(INCL)/qt_clust.h $(INCL)/qt_kde0.h \ $(INCL)/qt_xpms.h qt_win.moc qt_kde0.moc qttableview.moc $(CXX) $(CXXFLAGS) -o$@ ../win/Qt/qt_win.cpp qt_clust.o: ../win/Qt/qt_clust.cpp $(INCL)/qt_clust.h $(CXX) $(CXXFLAGS) -o$@ ../win/Qt/qt_clust.cpp qttableview.o: ../win/Qt/qttableview.cpp $(INCL)/qttableview.h $(CXX) $(CXXFLAGS) -o$@ ../win/Qt/qttableview.cpp monstr.o: monstr.c $(CONFIG_H) vis_tab.o: vis_tab.c $(CONFIG_H) $(INCL)/vis_tab.h allmain.o: allmain.c $(HACK_H) $(INCL)/patchlevel.h alloc.o: alloc.c $(CONFIG_H) apply.o: apply.c $(HACK_H) $(INCL)/edog.h artifact.o: artifact.c $(HACK_H) $(INCL)/artifact.h $(INCL)/artilist.h attrib.o: attrib.c $(HACK_H) ball.o: ball.c $(HACK_H) bones.o: bones.c $(HACK_H) $(INCL)/lev.h botl.o: botl.c $(HACK_H) cmd.o: cmd.c $(HACK_H) $(INCL)/func_tab.h dbridge.o: dbridge.c $(HACK_H) decl.o: decl.c $(HACK_H) detect.o: detect.c $(HACK_H) $(INCL)/artifact.h dig.o: dig.c $(HACK_H) $(INCL)/edog.h display.o: display.c $(HACK_H) dlb.o: dlb.c $(CONFIG_H) $(INCL)/dlb.h do.o: do.c $(HACK_H) $(INCL)/lev.h do_name.o: do_name.c $(HACK_H) do_wear.o: do_wear.c $(HACK_H) dog.o: dog.c $(HACK_H) $(INCL)/edog.h $(INCL)/emin.h $(INCL)/epri.h dogmove.o: dogmove.c $(HACK_H) $(INCL)/mfndpos.h $(INCL)/edog.h \ $(INCL)/emin.h $(INCL)/epri.h dokick.o: dokick.c $(HACK_H) $(INCL)/eshk.h dothrow.o: dothrow.c $(HACK_H) $(INCL)/eshk.h drawing.o: drawing.c $(HACK_H) $(INCL)/tcap.h dungeon.o: dungeon.c $(HACK_H) $(INCL)/dgn_file.h $(INCL)/dlb.h eat.o: eat.c $(HACK_H) end.o: end.c $(HACK_H) $(INCL)/eshk.h $(INCL)/dlb.h engrave.o: engrave.c $(HACK_H) $(INCL)/lev.h exper.o: exper.c $(HACK_H) explode.o: explode.c $(HACK_H) extralev.o: extralev.c $(HACK_H) files.o: files.c $(HACK_H) $(INCL)/dlb.h $(INCL)/filename.h \ $(INCL)/winGL.h $(INCL)/winproxy.h fountain.o: fountain.c $(HACK_H) hack.o: hack.c $(HACK_H) hacklib.o: hacklib.c $(HACK_H) invent.o: invent.c $(HACK_H) light.o: light.c $(HACK_H) $(INCL)/lev.h lock.o: lock.c $(HACK_H) mail.o: mail.c $(HACK_H) $(INCL)/mail.h makemon.o: makemon.c $(HACK_H) $(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 minion.o: minion.c $(HACK_H) $(INCL)/emin.h $(INCL)/epri.h mklev.o: mklev.c $(HACK_H) mkmap.o: mkmap.c $(HACK_H) $(INCL)/sp_lev.h mkmaze.o: mkmaze.c $(HACK_H) $(INCL)/sp_lev.h $(INCL)/lev.h mkobj.o: mkobj.c $(HACK_H) mkroom.o: mkroom.c $(HACK_H) mon.o: mon.c $(HACK_H) $(INCL)/mfndpos.h $(INCL)/edog.h \ $(INCL)/artifact.h mondata.o: mondata.c $(HACK_H) $(INCL)/eshk.h $(INCL)/epri.h monmove.o: monmove.c $(HACK_H) $(INCL)/mfndpos.h $(INCL)/artifact.h \ $(INCL)/epri.h monst.o: monst.c $(CONFIG_H) $(INCL)/permonst.h $(INCL)/align.h \ $(INCL)/monattk.h $(INCL)/monflag.h $(INCL)/monsym.h \ $(INCL)/dungeon.h $(INCL)/eshk.h $(INCL)/vault.h \ $(INCL)/epri.h $(INCL)/egyp.h $(INCL)/color.h mplayer.o: mplayer.c $(HACK_H) mthrowu.o: mthrowu.c $(HACK_H) muse.o: muse.c $(HACK_H) $(INCL)/edog.h music.o: music.c $(HACK_H) #interp.c o_init.o: o_init.c $(HACK_H) $(INCL)/lev.h objects.o: objects.c $(CONFIG_H) $(INCL)/obj.h $(INCL)/objclass.h \ $(INCL)/prop.h $(INCL)/skills.h $(INCL)/color.h objnam.o: objnam.c $(HACK_H) options.o: options.c $(CONFIG_H) $(INCL)/objclass.h $(INCL)/flag.h \ $(HACK_H) $(INCL)/tcap.h $(INCL)/winGL.h \ $(INCL)/filename.h pager.o: pager.c $(HACK_H) $(INCL)/dlb.h pickup.o: pickup.c $(HACK_H) pline.o: pline.c $(HACK_H) $(INCL)/epri.h $(INCL)/edog.h polyself.o: polyself.c $(HACK_H) potion.o: potion.c $(HACK_H) pray.o: pray.c $(HACK_H) $(INCL)/epri.h priest.o: priest.c $(HACK_H) $(INCL)/mfndpos.h $(INCL)/eshk.h \ $(INCL)/epri.h $(INCL)/emin.h quest.o: quest.c $(HACK_H) $(INCL)/qtext.h questpgr.o: questpgr.c $(HACK_H) $(INCL)/dlb.h $(INCL)/qtext.h read.o: read.c $(HACK_H) rect.o: rect.c $(HACK_H) region.o: region.c $(HACK_H) $(INCL)/lev.h restore.o: restore.c $(HACK_H) $(INCL)/lev.h $(INCL)/tcap.h rip.o: rip.c $(HACK_H) rnd.o: rnd.c $(HACK_H) role.o: role.c $(HACK_H) rumors.o: rumors.c $(HACK_H) $(INCL)/lev.h $(INCL)/dlb.h save.o: save.c $(HACK_H) $(INCL)/lev.h shk.o: shk.c $(HACK_H) $(INCL)/eshk.h shknam.o: shknam.c $(HACK_H) $(INCL)/eshk.h sit.o: sit.c $(HACK_H) $(INCL)/artifact.h sounds.o: sounds.c $(HACK_H) $(INCL)/edog.h sp_lev.o: sp_lev.c $(HACK_H) $(INCL)/dlb.h $(INCL)/sp_lev.h spell.o: spell.c $(HACK_H) $(INCL)/edog.h steal.o: steal.c $(HACK_H) steed.o: steed.c $(HACK_H) teleport.o: teleport.c $(HACK_H) timeout.o: timeout.c $(HACK_H) $(INCL)/lev.h topten.o: topten.c $(HACK_H) $(INCL)/dlb.h $(INCL)/patchlevel.h track.o: track.c $(HACK_H) trap.o: trap.c $(HACK_H) u_init.o: u_init.c $(HACK_H) uhitm.o: uhitm.c $(HACK_H) vault.o: vault.c $(HACK_H) $(INCL)/vault.h version.o: version.c $(HACK_H) $(INCL)/date.h $(INCL)/patchlevel.h vision.o: vision.c $(HACK_H) $(INCL)/vis_tab.h weapon.o: weapon.c $(HACK_H) were.o: were.c $(HACK_H) wield.o: wield.c $(HACK_H) windows.o: windows.c $(HACK_H) $(INCL)/wingem.h $(INCL)/winGnome.h \ $(INCL)/winGL.h $(INCL)/winproxy.h wizard.o: wizard.c $(HACK_H) $(INCL)/qtext.h $(INCL)/epri.h worm.o: worm.c $(HACK_H) $(INCL)/lev.h worn.o: worn.c $(HACK_H) write.o: write.c $(HACK_H) zap.o: zap.c $(HACK_H) gypsy.o: gypsy.c $(HACK_H) $(INCL)/egyp.h $(INCL)/qtext.h tech.o: tech.c $(HACK_H) # end of file slashem-0.0.7E7F3/sys/winnt/seico.uu0000664000076400007640000001010210545462317015300 0ustar alialibegin 640 slashem.ico M```!``(`("`0``$`!`#H`@``)@```"`@```!``@`J`@```X#```H````(``` M`$`````!``0````````"````````````````````````````````@```@``` M`("``(````"``(``@(```("`@`#`P,````#_``#_````__\`_P```/\`_P#_ M_P``____```````````````````````)!]``````!V```````````+=P```` M`'8'``````````NW!P````=@,&!@```````/7 M!P``9F`'\+`'8``````)<'EP!@8`"W#[\`=@``````>7!P!@![`/O[^P!V`` M```)_O[^_`'``````>7``>_!P>_O[^_```````)<+=[\```<_O[ M^P`````'8`"[OP\`8`(\`9F8`,```!V9@>_``=W=X\`9F9@````9N`+\&8` M=W>(\`9F9F8``&8+\`9@9@=W>(\`9F9@``!F#[!F!F9@=W>(\`9F````9F`& M8&9F9@=W>(\`8````&9O9@9F9F9@=W>(\`````!F]F!F9F9F9@<'>(\````` M;V8&9F9F9F9@<'>(\`````9@9F9F9F9F9@<'>(\`````!F9F9F9F9F9@<'>( M\``````&9F9F9F9F8`=W>(\```````9F9F9F9@``!W>(````````!F9F9F`` M```'>(`````````&9F8``````'>```````````9@```````'@``````````` M`````````(``````````````````````A_Y__P/\/_\!^`?_`/`!_P!@`'^` M```?P```!^````/P```!^````_@```?P```'X```!\````?````'@````X`` M``&````#@```!X````^````?@```'X````_````'X````_@```'^``8!_X`/ M@/_@'^#_^#_P__Y_^/____TH````(````$`````!``@````````$```````` M```````!`````0``````````@```@````("``(````"``(``@(```,#`P`#` MW,``\,BD``0$!``("`@`#`P,`!$1$0`6%A8`'!P<`"(B(@`I*2D`5555`$U- M30!"0D(`.3DY`(&!@0```($``($```"!@0"!````@0"!`(&!`````#,```!F M````F0```,P``#,````S,P``,V8``#.9```SS```,_\``&8```!F,P``9F8` M`&:9``!FS```9O\``)D```"9,P``F68``)F9``"9S```F?\``,P```#,,P`` MS&8``,R9``#,S```S/\``/]F``#_F0``_\P`,P```#,`,P`S`&8`,P"9`#,` MS``S`/\`,S,``#,S,P`S,V8`,S.9`#,SS``S,_\`,V8``#-F,P`S9F8`,V:9 M`#-FS``S9O\`,YD``#.9,P`SF68`,YF9`#.9S``SF?\`,\P``#/,,P`SS&8` M,\R9`#/,S``SS/\`,_\S`#/_9@`S_YD`,__,`#/__P!F````9@`S`&8`9@!F M`)D`9@#,`&8`_P!F,P``9C,S`&8S9@!F,YD`9C/,`&8S_P!F9@``9F8S`&9F M9@!F9ID`9F;,`&:9``!FF3,`9IEF`&:9F0!FF````#@````8````.````'@```#X```!^````?@```#\````?@```# <^````?X`!@'_@`^`_^`?X/_X/_#__G_X_____0`` ` end slashem-0.0.7E7F3/sys/winnt/Install.nt0000664000076400007640000004314310545462317015607 0ustar aliali 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 9x, NT, 2000, or XP system ============================================================== Last revision: $Date: 2003/12/11 09:49:08 $ {This file is included unchanged from NetHack 3.4. You may want to read Install.gcc first and come back here if necessary afterwards.} 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, David Cohrs, Alex Kompel, Dion Nicolaas, Yitzhak Sapir, and Janet Walz maintained the tty and graphical win32 versions of NetHack 3.4.3. 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/ OR o A copy of MinGW 2.0. MinGW is a collection of header files and import libraries with which native Windows32 programs can be made; the MinGW 2.0 distribution contains the GNU Compiler Collection. You can download MinGW at http://www.mingw.org/ Earlier versions of MinGW will not allow you to build the Windows Graphical version. In addition to the makefiles that allow you to build NetHack from the command line, there is also a set of project files and a workspace file that allow you to build the Windows Graphical version from Microsoft Visual C's IDE (Integrated Development Environment.) 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 from the command line, proceed to "BUILDING FROM THE COMMAND LINE." If you wish to build using Visual C's IDE, proceed now to "BUILDING USING VISUAL C'S IDE." BUILDING FROM THE COMMAND LINE You can built two different versions of NetHack for Win32 from the command line: A tty port utilizing the Win32 Console I/O subsystem, Console NetHack; A Win32 native port built on the Windows API, Graphical NetHack or NetHackW. The executable for Console NetHack will be named NetHack.exe. The executable for Graphical NetHack will be named NetHackW.exe. You can opt to build both; they will be able to use the same datafiles, save files and bones files. I. Dispelling the Myths: Compiling NetHack for Win32 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 2.0 (with GCC 3.2) 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 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. 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, and binary (The "binary" directory was created by nhsetup.bat earlier if you followed the steps appropriately). For Console NetHack you need win\tty in addition to these; for Graphical NetHack you need win\win32 in addition to these. 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 | | ------ ----- | | | share winnt tty Required Directories for a Win32 Graphical NetHack: top | ----------------------------------------------------/ /----- | | | | | | | | util dat doc include src sys win binary | | ------ ----- | | | share winnt win32 Check the file "Files" in your top level directory for an exact listing of what file is in which directory. In order for the Makefiles to work, all the source files must be in the proper locations. If you downloaded or ftp'd the sources from a UNIX system, the lines will probably end in UNIX-style newlines, instead of the carriage return and line feed pairs used by Windows. Some programs have trouble with them, so you may need to convert them. The compiler should not have any problems with them however. 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 section 4 and 5. You may include all or as few of the special game features as you wish (they are located last in the file). 4. Edit your Makefile. For building Console NetHack, ensure that GRAPHICAL is set to "N", or commented out. For building Graphical NetHack, set GRAPHICAL to "Y". 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: mingw32-make -f Makefile.gcc install If you get any errors along the way then something has not been set up correctly. The time it takes to compile depends on your particular machine of course, but you should be able to go for lunch and return to find everything finished. The less memory, and slower your machine, the longer the lunch you may take. :-) In any case, it is likely that the command prompt window where you are doing the compiling will be occupied for a while. If all goes well, you will get an NetHack executable. Notes: 1. To install an update of NetHack after changing something, change your current directory to src and issue the appropriate command for your compiler: For Microsoft compiler: nmake For Borland compiler: make /f Makefile.bcc For GCC: mingw32-make -f Makefile.gcc If you add, delete, or reorder monsters or objects, or you change the format of saved level files, delete any save and bones files. (Trying to use such files sometimes produces amusing confusions on the game's part, but usually crashes.) If you made changes to any of the level compiler software, you may have to delete dgn_flex.c, dgn_yacc.c, lev_flex.c, and lev_yacc.c from the util directory to ensure that they are remade. 2. 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. The executable built by the graphical built is a 32-bit, flat-address space, non-overlayed .exe file, which should run on any true Win32 graphical environment. To run NetHack, proceed to RUNNING NETHACK. BUILDING USING VISUAL C'S IDE Only the Win32 native port built on the Windows API, or Graphical NetHack, can be built using the Visual C IDE. I. Dispelling the Myths: Compiling NetHack using the Visual C IDE is straightforward, as long as you have your compiler and tools correctly installed. It is again 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 using the Visual C IDE: Setting Up 1. It almost goes without saying that you should make sure that your tools are set up and running correctly. (For the Microsoft Visual C IDE it should correctly fire up when you choose it in your Start | Programs menus.) 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 building Graphical NetHack with the Visual C IDE: 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 C 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. Note: It's possible to build a graphical version using the Makefile, as explained above. However, the IDE build has full game functionality and is the officially released build. Start the Visual C IDE. In the Visual C IDE menus, choose: File | Open Workspace 4. Set up for the build. 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 On the Visual C menus, choose: Project | Set Active Project | NetHackW 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. Building 5. Start your build. 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. 6. If all has gone well to this point, you should now have a NetHack executable called NetHackW.exe in the "binary" directory, along with all the support files that it needs. RUNNING NETHACK I. Checking the installation: Make sure all of the support files -- Guidebook.txt, license, Defaults.nh, NetHack.exe or NetHackW.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 or NetHackW.exe executable resides. You only need to set HACKDIR in defaults.nh if, for some reason, you wish to override that (be careful). II. Executing the game 1. 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" or "nethackw" or "nethackw -umike" to start it up. Alternatively, you can explicitly invoke it with a command such as "c:\nethack\binary\nethack.exe" or "c:\nethack\binary\nethackw.exe" (specifying whatever drive and directory your NetHack executable resides in) each time. 2. 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.3 Console version Command Line : C:\NETHACK\BINARY\NETHACK.EXE Description : NetHack 3.4.3 Graphical Interface Command Line : C:\NETHACK\BINARY\NETHACKW.EXE (changing the directory to the appropriate one of course) III. Play NetHack. If it works, you're done! PROBLEMS If you discover a bug and wish to report it, or if you have comments or suggestions we recommend using our "Contact Us" web page at: http://www.nethack.org/common/contact.html If you don't have access to the web, or you want to send us a patch to the NetHack source code feel free to drop us a line c/o: DevTeam (at) nethack.org Happy NetHacking! slashem-0.0.7E7F3/sys/winnt/nhico.uu0000664000076400007640000000275410545462317015314 0ustar alialibegin 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 slashem-0.0.7E7F3/sys/winnt/Makefile.bcc0000664000076400007640000013024710545462317016026 0ustar aliali# SCCS Id: @(#)Makefile.bcc 3.4 $Date: 2003/12/11 09:49:08 $ # Copyright (c) NetHack PC Development Team 1993-2003 # # # IMPORTANT NOTE: This Makefile has not been tested for 3.4.3. # # # 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 two versions of NetHack: # A tty port utilizing the Win32 Console I/O subsystem, Console # NetHack; # A Win32 native port built on the Windows API, Graphical NetHack or # NetHackW. # # In addition to your C compiler, # # if you want to change you will need a # files with suffix workalike for # .y yacc (such as bison) # .l lex (such as flex) # # # If you have any questions read the sys/winnt/Install.nt file included # with the distribution. # # -- # 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-csu -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. !IF "$(GRAPHICAL)" == "Y" GAME = NetHackW # Game Name !ELSE GAME = NetHack # Game Name !ENDIF 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), uncomment the upper two macros. # #DO_YACC = YACC_ACT #DO_LEX = LEX_ACT !IFNDEF DO_YACC DO_YACC = YACC_MSG !ENDIF !IFNDEF DO_LEX DO_LEX = LEX_MSG !ENDIF # Wilbur Streett's Win32 ports of GNU bison and flex are available at: # http://www.monmouth.com/~wstreett/lex-yacc/lex-yacc.html # # To use them, download the executables and templates (bison.simple, # bison.hairy) to some directory, and set the environment variables # BISON_SIMPLE and BISON_HAIRY, and your path to point to this # directory. # # For example, if you placed them in C:\BIN, you should set: # C:> SET BISON_SIMPLE=C:\BIN\BISON.SIMPLE # C:> SET BISON_HAIRY=C:\BIN\BISON.HAIRY # # Also, make sure your path points to the bison/flex directories. # # The following settings are configured for Wilbur Streett's ports. # - 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 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 = # # 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 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 WINDLLS = WINPFLAG= -DTILES -DMSWIN_GRAPHICS NHRES = $(O)winhack.res WINPINC = -I$(WIN32) !ELSE WINPORT = $(O)nttty.o WINPHDR = WINDLLS = $(GAMEDIR)\nhdefkey.dll $(GAMEDIR)\nh340key.dll $(GAMEDIR)\nhraykey.dll WINPFLAG= -DWIN32CON 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) $(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 # 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) copy $(DAT)\opthelp $(GAMEDIR) ! ELSE copy $(DAT)\*. $(GAMEDIR) copy $(DAT)\*.dat $(GAMEDIR) copy $(DAT)\*.lev $(GAMEDIR) if exist $(GAMEDIR)\makefile del $(GAMEDIR)\makefile ! ENDIF if exist $(DOC)\guidebook.txt copy $(DOC)\guidebook.txt $(GAMEDIR)\Guidebook.txt if exist $(DOC)\nethack.txt copy $(DOC)\nethack.txt $(GAMEDIR)\NetHack.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 echo install done > $@ # copy $(NTSYS)\winnt.hlp $(GAMEDIR) recover: $(U)recover.exe if exist $(U)recover.exe copy $(U)recover.exe $(GAMEDIR) if exist $(DOC)\recover.txt copy $(DOC)\recover.txt $(GAMEDIR)\recover.txt $(O)sp_lev.tag: $(O)utility.tag $(DAT)\bigroom.des $(DAT)\castle.des \ $(DAT)\endgame.des $(DAT)\gehennom.des $(DAT)\knox.des \ $(DAT)\medusa.des $(DAT)\oracle.des $(DAT)\tower.des \ $(DAT)\yendor.des $(DAT)\arch.des $(DAT)\barb.des \ $(DAT)\caveman.des $(DAT)\healer.des $(DAT)\knight.des \ $(DAT)\monk.des $(DAT)\priest.des $(DAT)\ranger.des \ $(DAT)\rogue.des $(DAT)\samurai.des $(DAT)\sokoban.des \ $(DAT)\tourist.des $(DAT)\valkyrie.des $(DAT)\wizard.des cd $(DAT) $(U)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 $(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 $(O)gamedir.tag $(WINDLLS) @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 $(O)gamedir.tag: @if not exist $(GAMEDIR)\*.* echo creating directory $(GAMEDIR) @if not exist $(GAMEDIR)\*.* mkdir $(GAMEDIR) @echo directory created > $@ $(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 $(GAMEDIR)\nhdefkey.dll : $(O)nhdefkey.o @if not exist $(GAMEDIR)\*.* mkdir $(GAMEDIR) @echo EXPORTS >nhdefkey.def @echo ProcessKeystroke >>nhdefkey.def @echo NHkbhit >>nhdefkey.def @echo CheckInput >>nhdefkey.def @echo SourceWhere >>nhdefkey.def @echo SourceAuthor >>nhdefkey.def @echo KeyHandlerName >>nhdefkey.def @echo Linking $@ $(link) $(linkdebug) /Gn /Gz /q -L$(bcclib) /c /aa /Tpd /V$(APPVER) -L$(bcclib) -v \ c0d32.obj $(O)nhdefkey.o, $@,nhdefkey.map,$(libsmt),nhdefkey.def $(GAMEDIR)\nh340key.dll : $(O)nh340key.o @if not exist $(GAMEDIR)\*.* mkdir $(GAMEDIR) @echo EXPORTS >nh340key.def @echo ProcessKeystroke >>nh340key.def @echo NHkbhit >>nh340key.def @echo CheckInput >>nh340key.def @echo SourceWhere >>nh340key.def @echo SourceAuthor >>nh340key.def @echo KeyHandlerName >>nh340key.def @echo Linking $@ $(link) $(linkdebug) /Gn /Gz /q -L$(bcclib) /c /aa /Tpd /V$(APPVER) -L$(bcclib) -v \ c0d32.obj $(O)nh340key.o, $@,nh340key.map,$(libsmt),nh340key.def $(GAMEDIR)\nhraykey.dll : $(O)nhraykey.o @if not exist $(GAMEDIR)\*.* mkdir $(GAMEDIR) @echo EXPORTS >nhraykey.def @echo ProcessKeystroke >>nhraykey.def @echo NHkbhit >>nhraykey.def @echo CheckInput >>nhraykey.def @echo SourceWhere >>nhraykey.def @echo SourceAuthor >>nhraykey.def @echo KeyHandlerName >>nhraykey.def @echo Linking $@ $(link) $(linkdebug) /Gn /Gz /q -L$(bcclib) /c /aa /Tpd /V$(APPVER) -L$(bcclib) -v \ c0d32.obj $(O)nhraykey.o, $@,nhraykey.map,$(libsmt),nhraykey.def # # 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 the following changes: # * ../include changed to $(INCL) # * slashes changed to back-slashes # * -c (which is included in CFLAGS) substituted # with -o$@ # * $(CC) changed to $(cc) # but otherwise untouched. # That means that there is some irrelevant stuff # in here, but maintenance should be easier. # $(O)tos.o: ..\sys\atari\tos.c $(HACK_H) $(INCL)\tcap.h $(cc) $(CFLAGS) -o$@ ..\sys\atari\tos.c $(O)pcmain.o: ..\sys\share\pcmain.c $(HACK_H) $(INCL)\dlb.h \ $(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) $(INCL)\edog.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 slashem-0.0.7E7F3/sys/winnt/winnt.c0000664000076400007640000001720210545462317015136 0ustar aliali/* SCCS Id: @(#)winnt.c 3.4 $Date: 2003/12/11 09:49:08 $ */ /* Copyright (c) NetHack PC Development Team 1993, 1994 */ /* NetHack may be freely redistributed. See license for details. */ /* $Id: winnt.c,v 1.8 2003/12/11 09:49:08 j_ali Exp $ */ /* Modifications copyright (c) Slash'EM Development Team 2002 */ /* * WIN32 system functions. * * Initial Creation: Michael Allison - January 31/93 * Add set_binary_mode: J. Ali Harlow - October 5/02 * */ #define NEED_VARARGS #include "hack.h" #ifndef __CYGWIN__ #include #ifndef __BORLANDC__ #include #endif #endif #include #include "win32api.h" #ifdef WIN32CON #include "wintty.h" #endif #ifdef WIN32 /* * The following WIN32 API routines are used in this file. * * CloseHandle * DuplicateHandle * GetCurrentProcess * GetDiskFreeSpace * GetVolumeInformation * GetUserName * FindFirstFile * FindNextFile * FindClose * SetStdHandle * */ /* globals required within here */ HANDLE ffhandle = (HANDLE)0; WIN32_FIND_DATA ffd; /* The function pointer nt_kbhit contains a kbhit() equivalent * which varies depending on which window port is active. * For the tty port it is tty_kbhit() [from nttty.c] * For the win32 port it is win32_kbhit() [from winmain.c] * It is initialized to point to def_kbhit [in here] for safety. */ int def_kbhit(void); int (*nt_kbhit)() = def_kbhit; char switchar() { /* Could not locate a WIN32 API call for this- MJA */ return '-'; } long freediskspace(path) char *path; { char tmppath[4]; DWORD SectorsPerCluster = 0; DWORD BytesPerSector = 0; DWORD FreeClusters = 0; DWORD TotalClusters = 0; tmppath[0] = *path; tmppath[1] = ':'; tmppath[2] = '\\'; tmppath[3] = '\0'; GetDiskFreeSpace(tmppath, &SectorsPerCluster, &BytesPerSector, &FreeClusters, &TotalClusters); return (long)(SectorsPerCluster * BytesPerSector * FreeClusters); } /* * Functions to get filenames using wildcards */ int findfirst(path) char *path; { if (ffhandle){ FindClose(ffhandle); ffhandle = (HANDLE)0; } ffhandle = FindFirstFile(path,&ffd); return (ffhandle == INVALID_HANDLE_VALUE) ? 0 : 1; } int findnext() { return FindNextFile(ffhandle,&ffd) ? 1 : 0; } char * foundfile_buffer() { return &ffd.cFileName[0]; } long filesize(file) char *file; { if (findfirst(file)) { return ((long)ffd.nFileSizeLow); } else return -1L; } /* * Chdrive() changes the default drive. */ #ifndef __CYGWIN__ void chdrive(str) char *str; { char *ptr; char drive; if ((ptr = index(str, ':')) != (char *)0) { drive = toupper(*(ptr - 1)); _chdrive((drive - 'A') + 1); } } #endif static int max_filename() { DWORD maxflen; int status=0; status = GetVolumeInformation((LPTSTR)0,(LPTSTR)0, 0 ,(LPDWORD)0,&maxflen,(LPDWORD)0,(LPTSTR)0,0); if (status) return maxflen; else return 0; } int def_kbhit() { return 0; } /* * Strip out troublesome file system characters. */ void nt_regularize(s) /* normalize file name */ register char *s; { register unsigned char *lp; for (lp = s; *lp; lp++) if ( *lp == '?' || *lp == '"' || *lp == '\\' || *lp == '/' || *lp == '>' || *lp == '<' || *lp == '*' || *lp == '|' || *lp == ':' || (*lp > 127)) *lp = '_'; } /* * This is used in nhlan.c to implement some of the LAN_FEATURES. */ char *get_username(lan_username_size) int *lan_username_size; { static TCHAR username_buffer[BUFSZ]; unsigned int status; DWORD i = BUFSZ - 1; /* i gets updated with actual size */ status = GetUserName(username_buffer, &i); if (status) username_buffer[i] = '\0'; else Strcpy(username_buffer, "NetHack"); if (lan_username_size) *lan_username_size = strlen(username_buffer); return username_buffer; } /* * This is used in pcmain.c to switch standard I/O to binary mode. */ int set_binary_mode(fd, mode) int fd, mode; { int dfd, retval; HANDLE h, dh; /* * Force the setting of binary mode by re-opening the file descriptor * (Microsoft's supplied setmode() doesn't work). */ h = (HANDLE)_get_osfhandle(fd); if (h == INVALID_HANDLE_VALUE) return FALSE; if (!DuplicateHandle(GetCurrentProcess(), h, GetCurrentProcess(), &dh, 0, FALSE, DUPLICATE_SAME_ACCESS)) return FALSE; switch(fd) { case 0: SetStdHandle(STD_INPUT_HANDLE, dh); break; case 1: SetStdHandle(STD_OUTPUT_HANDLE, dh); break; case 2: SetStdHandle(STD_ERROR_HANDLE, dh); break; } dfd = _open_osfhandle((long)dh, mode); if (dfd < 0) { CloseHandle(dh); return FALSE; } retval = (dup2(dfd, fd) >= 0); close(dfd); return retval; } # if 0 char *getxxx() { char szFullPath[MAX_PATH] = ""; HMODULE hInst = NULL; /* NULL gets the filename of this module */ GetModuleFileName(hInst, szFullPath, sizeof(szFullPath)); return &szFullPath[0]; } # endif #ifndef WIN32CON /* fatal error */ /*VARARGS1*/ void error VA_DECL(const char *,s) char buf[BUFSZ]; VA_START(s); VA_INIT(s, const char *); /* error() may get called before tty is initialized */ if (iflags.window_inited) end_screen(); if (!strncmpi(windowprocs.name, "tty", 3)) { buf[0] = '\n'; (void) vsprintf(&buf[1], s, VA_ARGS); Strcat(buf, "\n"); msmsg(buf); } else { (void) vsprintf(buf, s, VA_ARGS); Strcat(buf, "\n"); raw_printf(buf); } VA_END(); exit(EXIT_FAILURE); } #endif void Delay(int ms) { (void)Sleep(ms); } #ifdef WIN32CON extern void NDECL(backsp); #endif void win32_abort() { #ifdef WIZARD if (wizard) { # ifdef WIN32CON int c, ci, ct; if (!iflags.window_inited) c = 'n'; ct = 0; msmsg("Execute debug breakpoint wizard?"); while ((ci=nhgetch()) != '\n') { if (ct > 0) { backsp(); /* \b is visible on NT */ (void) putchar(' '); backsp(); ct = 0; c = 'n'; } if (ci == 'y' || ci == 'n' || ci == 'Y' || ci == 'N') { ct = 1; c = ci; msmsg("%c",c); } } if (c == 'y') DebugBreak(); # endif } #endif abort(); } static char interjection_buf[INTERJECTION_TYPES][1024]; static int interjection[INTERJECTION_TYPES]; void interject_assistance(num, interjection_type, ptr1, ptr2) int num; int interjection_type; genericptr_t ptr1; genericptr_t ptr2; { switch(num) { case 1: { char *panicmsg = (char *)ptr1; char *datadir = (char *)ptr2; char *tempdir = nh_getenv("TEMP"); interjection_type = INTERJECT_PANIC; interjection[INTERJECT_PANIC] = 1; /* * ptr1 = the panic message about to be delivered. * ptr2 = the directory prefix of the dungeon file * that failed to open. * Check to see if datadir matches tempdir or a * common windows temp location. If it does, inform * the user that they are probably trying to run the * game from within their unzip utility, so the required * files really don't exist at the location. Instruct * them to unpack them first. */ if (panicmsg && datadir) { if (!strncmpi(datadir, "C:\\WINDOWS\\TEMP", 15) || strstri(datadir, "TEMP") || (tempdir && strstri(datadir, tempdir))) { (void)strncpy(interjection_buf[INTERJECT_PANIC], "\nOne common cause of this error is attempting to execute\n" "the game by double-clicking on it while it is displayed\n" "inside an unzip utility.\n\n" "You have to unzip the contents of the zip file into a\n" "folder on your system, and then run \"NetHack.exe\" or \n" "\"NetHackW.exe\" from there.\n\n" "If that is not the situation, you are encouraged to\n" "report the error as shown above.\n\n", 1023); } } } break; } } void interject(interjection_type) int interjection_type; { if (interjection_type >= 0 && interjection_type < INTERJECTION_TYPES) msmsg(interjection_buf[interjection_type]); } #endif /* WIN32 */ /*winnt.c*/ slashem-0.0.7E7F3/sys/winnt/console.rc0000664000076400007640000000233310545462317015622 0ustar aliali/* SCCS Id: @(#)console.rc 3.4 $Date: 2003/12/11 09:49:08 $ */ /* Copyright (c) Yitzhak Sapir, 2002. */ /* NetHack may be freely redistributed. See license for details. */ #include "windows.h" 1 ICON DISCARDABLE "NetHack.ICO" ///////////////////////////////////////////////////////////////////////////// // // Version // VS_VERSION_INFO VERSIONINFO FILEVERSION 3,4,3,0 PRODUCTVERSION 3,4,3,0 FILEFLAGSMASK 0x1fL #ifdef _DEBUG FILEFLAGS 0x9L #else FILEFLAGS 0x8L #endif FILEOS 0x4L FILETYPE 0x0L FILESUBTYPE 0x0L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904b0" BEGIN VALUE "FileDescription", "NetHack for Windows - TTY Interface\0" VALUE "FileVersion", "3.4.3\0" VALUE "InternalName", "NetHack\0" VALUE "LegalCopyright", "Copyright (C) 1985 - 2003. By Stichting Mathematisch Centrum and M. Stephenson. See license for details.\0" VALUE "OriginalFilename", "NetHack.exe\0" VALUE "PrivateBuild", "031014\0" VALUE "ProductName", "NetHack\0" VALUE "ProductVersion", "3.4.3\0" END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x409, 1200 END END /*console.rc*/ slashem-0.0.7E7F3/sys/winnt/nethack.def0000664000076400007640000000031710545462317015727 0ustar alialiNAME NETHACK DESCRIPTION 'NetHack 3.4.1 for Windows NT' EXETYPE WINDOWS STUB 'WINSTUB.EXE' CODE PRELOAD MOVEABLE DISCARDABLE DATA PRELOAD MOVEABLE MULTIPLE HEAPSIZE 4096 STACKSIZE 9216 EXPORTS WndProc slashem-0.0.7E7F3/sys/winnt/slashem.rc0000664000076400007640000000007610545462317015616 0ustar aliali#define ICON_APPWND 100 ICON_APPWND ICON "Slashem.ico" slashem-0.0.7E7F3/sys/winnt/winnt.cnf0000664000076400007640000001024310545462317015460 0ustar aliali# 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. # *** WIN32/GTK *** # The default, graphical interface TILESET=name:Small tiles,file:gltile16.png TILESET=name:Big tiles,file:gltile32.png,transparent TILESET=name:Big 3D tiles,file:gltile64.png,transparent,pseudo3D OPTIONS=windowtype:gtk # Choose one of the three tileset names to use OPTIONS=tiles:Big tiles # Win32/GTK has no mechanism for requesting CP437 fonts, so this isn't useful OPTIONS=!IBMGraphics # Enable the radar window OPTIONS=radar # Enable the permenant inventory window OPTIONS=perm_invent # *** CONSOLE *** # Text interface # To enable console mode, comment out the Win32/GTK lines and uncomment these. #OPTIONS=windowtype:tty # Use the IBM character set rather than just plain ascii characters. #OPTIONS=IBMGraphics # *** OPTIONS *** # 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 "r." to read...' use: #OPTIONS=suppress_alert:0.0.7 # # #HACKDIR=c:\games\nethack # # Note: Under MSDOS ports HACKDIR defaults to the location # of the NetHack.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 slashem-0.0.7E7F3/sys/winnt/win32api.h0000664000076400007640000000131610545462317015437 0ustar aliali/* SCCS Id: @(#)win32api.h 3.4 $Date: 2003/03/12 11:15:16 $ */ /* Copyright (c) NetHack PC Development Team 1996 */ /* NetHack may be freely redistributed. See license for details. */ /* * This header file is used to clear up some discrepencies with Visual C * header files & NetHack before including windows.h, so all NetHack * files should include "win32api.h" rather than . */ # if defined(_MSC_VER) # undef strcmpi # undef min # undef max # pragma warning(disable:4142) /* Warning, Benign redefinition of type */ # pragma pack(8) # endif #define WIN32_LEAN_AND_MEAN #include #include # if defined(_MSC_VER) # pragma pack() # endif /*win32api.h*/ slashem-0.0.7E7F3/sys/mac/0000775000076400007640000000000010545462317013232 5ustar alialislashem-0.0.7E7F3/sys/mac/macmenu.c0000664000076400007640000007277010545462317015040 0ustar aliali/* 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. */ /****************************************\ * Extended Macintosh menu support * * provides access to all keyboard commands from cmd.c * provides control key functionality for classic keyboards * provides key equivalent references and logical menu groups * supports various menu highlighting modes \****************************************/ /****************************************\ * Edit History: * * 930512 - More bug fixes and getting tty to work again, Jon W{tte * 930508 - Bug fixes in-flight, Jon W{tte * 04/29/93 - 1st Release Draft, David Hairston * 04/11/93 - 1st Draft, David Hairston \****************************************/ /******** Application Defines ********/ #include "hack.h" #include "mactty.h" #include "macwin.h" #include "macpopup.h" #include "patchlevel.h" /******** Toolbox Defines ********/ #if !TARGET_API_MAC_CARBON #include #include #include #include #include #include #endif /* Borrowed from the Mac tty port */ extern WindowPtr _mt_window; /******** Local Defines ********/ /* 'MNU#' (menu list record) */ typedef union menuRefUnn { short mresID; /* MENU resource ID (before GetMenu) */ MenuHandle mhnd; /* MENU handle (after GetMenu) */ } menuRefUnn; typedef struct menuListRec { short firstMenuID; short numMenus; menuRefUnn mref[]; } menuListRec, *menuListPtr, **menuListHandle; /* indices and resource IDs of the menu list data */ enum { listMenubar, listSubmenu, menuBarListID = 128, subMenuListID }; /* the following mref[] indices are reserved */ enum { /* menu bar */ menuApple, menuFile, menuEdit, /* submenu */ menuWizard = 0 }; /* the following menu items are reserved */ enum { /* apple */ menuAppleAboutBox = 1, ____Apple__1, /* File */ menuFileRedraw = 1, menuFilePrevMsg, menuFileCleanup, ____File___1, menuFilePlayMode, menuFileEnterExplore, ____File___2, menuFileSave, ____File___3, menuFileQuit, /* standard minimum Edit menu items */ /* Wizard */ menuWizardAttributes = 1 }; /* * menuListRec data (preloaded and locked) specifies the number of menus in * the menu bar, the number of hierarchal or submenus and the menu IDs of * all of those menus. menus that go into in the menu bar are specified by * 'MNU#' 128 and submenus are specified by 'MNU#' 129. the fields of the * menuListRec are: * firstMenuID - the menu ID (not resource ID) of the 1st menu. subsequent * menus in the list are _forced_ to have consecutively incremented IDs. * numMenus - the total count of menus in a given list (and the extent of * valid menu IDs). * mref[] - initially the MENU resource ID is stored in the placeholder for * the resource handle. after loading (GetResource), the menu handle * is stored and the menu ID, in memory, is set as noted above. * * NOTE: a ResEdit template editor is supplied to edit the 'MNU#' resources. * * NOTE: the resource IDs do not need to match the menu IDs in a menu list * record although they have been originally set that way. * * NOTE: the menu ID's of menus in the submenu list record may be reset, as * noted above. it is the programmers responsibility to make sure that * submenu references/IDs are valid. * * WARNING: the existence of the submenu list record is assumed even if the * number of submenus is zero. also, no error checking is done on the * extents of the menu IDs. this must be correctly setup by the programmer. */ #define ID1_MBAR pMenuList[listMenubar]->firstMenuID #define ID1_SUBM pMenuList[listSubmenu]->firstMenuID #define NUM_MBAR pMenuList[listMenubar]->numMenus #define NUM_SUBM pMenuList[listSubmenu]->numMenus #define MHND_APPLE pMenuList[listMenubar]->mref[menuApple].mhnd #define MHND_FILE pMenuList[listMenubar]->mref[menuFile].mhnd #define MHND_EDIT pMenuList[listMenubar]->mref[menuEdit].mhnd #define MBARHND(x) pMenuList[listMenubar]->mref[(x)].mhnd #define MHND_WIZ pMenuList[listSubmenu]->mref[menuWizard].mhnd /* mutually exclusive (and prioritized) menu bar states */ enum { mbarDim, mbarNoWindows, mbarDA, mbarNoMap, mbarRegular, mbarSpecial /* explore or debug mode */ }; #define WKND_MAP (WIN_BASE_KIND + NHW_MAP) /* menu routine error numbers */ enum { errGetMenuList, errGetMenu, errGetANDlogTemplate, errGetANDlogItems, errGetANDialog, errANNewMenu, err_Menu_total }; /* menu 'STR#' comment char */ #define mstrEndChar 0xA5 /* '\245' or option-* or "bullet" */ /* 'ALRT' */ enum { alrt_Menu_start = 5000, alrtMenuNote = alrt_Menu_start, alrtMenu_NY, alrt_Menu_limit }; #define beepMenuAlertErr 1 /* # of SysBeep()'s before exitting */ enum { bttnMenuAlertNo = 1, bttnMenuAlertYes }; /******** Globals ********/ static unsigned char *menuErrStr[err_Menu_total] = { "\pAbort: Bad \'MNU#\' resource!", /* errGetMenuList */ "\pAbort: Bad \'MENU\' resource!", /* errGetMenu */ "\pAbort: Bad \'DLOG\' resource!", /* errGetANDlogTemplate */ "\pAbort: Bad \'DITL\' resource!", /* errGetANDlogItems */ "\pAbort: Bad Dialog Allocation!", /* errGetANDialog */ "\pAbort: Bad Menu Allocation!", /* errANNewMenu */ }; static menuListPtr pMenuList[2]; static short theMenubar = mbarDA; /* force initial update */ static short kAdjustWizardMenu = 1; /******** Prototypes ********/ #if !TARGET_API_MAC_CARBON static void alignAD(Rect *, short); #endif static void mustGetMenuAlerts(void); static void menuError(short); static void aboutNetHack(void); static void askSave(void); static void askQuit(void); /*** Askname dialog box ***/ #define RSRC_ASK 6000 /* Askname dialog and item list */ #define RSRC_ASK_PLAY 1 /* Play button */ #define RSRC_ASK_QUIT 2 /* Quit button */ #define RSRC_ASK_DEFAULT 3 /* Default ring */ #define RSRC_ASK_ROLE 4 /* Role popup menu */ #define RSRC_ASK_RACE 5 /* Race popup menu */ #define RSRC_ASK_GEND 6 /* Gender popup menu */ #define RSRC_ASK_ALIGN 7 /* Alignment popup menu */ #define RSRC_ASK_MODE 8 /* Mode popup menu */ #define RSRC_ASK_NAME 9 /* Name text field */ #define RSRC_ASK_MAX 10 /* Maximum enabled item */ #define KEY_MASK 0xff00 #define KEY_RETURN 0x2400 #define KEY_ENTER 0x4c00 #define KEY_ESCAPE 0x3500 #define CH_MASK 0x00ff #define CH_RETURN 0x000d #define CH_ENTER 0x0003 #define CH_ESCAPE 0x001b static void ask_restring(const char *cstr, unsigned char *pstr); static void ask_enable(DialogRef wind, short item, int enable); static pascal void ask_redraw(DialogRef wind, DialogItemIndex item); static pascal Boolean ask_filter(DialogRef wind, EventRecord *event, DialogItemIndex *item); #define noresource(t,n) {SysBeep(3); ExitToShell();} #define fatal(s) {SysBeep(3); ExitToShell();} static MenuHandle askmenu[RSRC_ASK_MAX]; static int askselect[RSRC_ASK_MAX]; #define currrole askselect[RSRC_ASK_ROLE] #define currrace askselect[RSRC_ASK_RACE] #define currgend askselect[RSRC_ASK_GEND] #define curralign askselect[RSRC_ASK_ALIGN] #define currmode askselect[RSRC_ASK_MODE] static RGBColor blackcolor = {0x0000, 0x0000, 0x0000}, // indentcolor = {0x4000, 0x4000, 0x4000}, darkcolor = {0x8000, 0x8000, 0x8000}, backcolor = {0xdddd, 0xdddd, 0xdddd}, lightcolor = {0xffff, 0xffff, 0xffff}, whitecolor = {0xffff, 0xffff, 0xffff}; /* Convert a mixed-case C string to a Capitalized Pascal string */ static void ask_restring (const char *cstr, unsigned char *pstr) { int i; for (i = 0; *cstr && (i < 255); i++) pstr[i+1] = *cstr++; pstr[0] = i; if ((pstr[1] >= 'a') && (pstr[1] <= 'z')) pstr[1] += 'A' - 'a'; return; } /* Enable the dialog item with the given index */ static void ask_enable (DialogRef wind, short item, int enable) { short type; Handle handle; Rect rect; /* Enable or disable the appropriate item */ GetDialogItem(wind, item, &type, &handle, &rect); if (enable) type &= ~itemDisable; else type |= itemDisable; HiliteControl((ControlHandle)handle, enable ? 0 : 255); SetDialogItem(wind, item, type, handle, &rect); return; } static pascal void ask_redraw (DialogRef wind, DialogItemIndex item) { short type; Handle handle; Rect rect; static char *modechar = "NED"; /* Which item shall we redraw? */ GetDialogItem(wind, item, &type, &handle, &rect); switch (item) { case RSRC_ASK_DEFAULT: PenSize(3, 3); FrameRoundRect(&rect, 16, 16); break; case RSRC_ASK_ROLE: case RSRC_ASK_RACE: case RSRC_ASK_GEND: case RSRC_ASK_ALIGN: case RSRC_ASK_MODE: if (macFlags.color) { RGBForeColor(&blackcolor); RGBBackColor(&backcolor); } PenNormal(); TextMode(srcOr); EraseRect(&rect); /* Draw the frame and drop shadow */ rect.right--; rect.bottom--; FrameRect(&rect); MoveTo(rect.right, rect.top+1); LineTo(rect.right, rect.bottom); LineTo(rect.left+1, rect.bottom); /* Draw the menu character */ MoveTo(rect.left+4, rect.top+12); switch (item) { case RSRC_ASK_ROLE: DrawText(roles[askselect[item]].filecode, 0, 3); break; case RSRC_ASK_RACE: DrawText(races[askselect[item]].filecode, 0, 3); break; case RSRC_ASK_GEND: DrawText(genders[askselect[item]].filecode, 0, 3); break; case RSRC_ASK_ALIGN: DrawText(aligns[askselect[item]].filecode, 0, 3); break; case RSRC_ASK_MODE: DrawChar(modechar[askselect[item]]); break; } /* Draw the popup symbol */ MoveTo(rect.right - 16, rect.top + 5); LineTo(rect.right - 6, rect.top + 5); LineTo(rect.right - 11, rect.top + 10); LineTo(rect.right - 15, rect.top + 6); LineTo(rect.right - 8, rect.top + 6); LineTo(rect.right - 11, rect.top + 9); LineTo(rect.right - 13, rect.top + 7); LineTo(rect.right - 10, rect.top + 7); LineTo(rect.right - 11, rect.top + 8); /* Draw the shadow */ InsetRect(&rect, 1, 1); if (macFlags.color) { RGBColor color; /* Save the foreground color */ GetForeColor(&color); /* Draw the top and left */ RGBForeColor(&lightcolor); MoveTo(rect.left, rect.bottom-1); LineTo(rect.left, rect.top); LineTo(rect.right-1, rect.top); /* Draw the bottom and right */ RGBForeColor(&darkcolor); MoveTo(rect.right-1, rect.top+1); LineTo(rect.right-1, rect.bottom-1); LineTo(rect.left+1, rect.bottom-1); /* Restore the foreground color */ RGBForeColor(&color); } break; case RSRC_ASK_NAME: PenNormal(); if (macFlags.color) { RGBForeColor(&whitecolor); RGBBackColor(&whitecolor); TextMode(srcOr); } else { PenMode(notPatCopy); TextMode(srcBic); } InsetRect(&rect, -1, -1); FrameRect(&rect); InsetRect(&rect, -1, -1); FrameRect(&rect); InsetRect(&rect, -2, -2); if (macFlags.color) { /* Draw the top and left */ RGBForeColor(&darkcolor); MoveTo(rect.left, rect.bottom-1); LineTo(rect.left, rect.top); LineTo(rect.right-1, rect.top); /* Draw the bottom and right */ RGBForeColor(&lightcolor); MoveTo(rect.right-1, rect.top+1); LineTo(rect.right-1, rect.bottom-1); LineTo(rect.left+1, rect.bottom-1); /* Restore the colors */ RGBForeColor(&blackcolor); RGBBackColor(&backcolor); } break; } return; } static pascal Boolean ask_filter (DialogRef wind, EventRecord *event, DialogItemIndex *item) { short ch, key; switch (event->what) { case keyDown: case autoKey: ch = event->message & CH_MASK; key = event->message & KEY_MASK; /* Handle equivalents for OK */ if ((ch == CH_RETURN) || (key == KEY_RETURN) || (ch == CH_ENTER) || (key == KEY_ENTER)) { if (GetDialogTextEditHandle(wind)[0]->teLength) { FlashButton(wind, RSRC_ASK_PLAY); *item = RSRC_ASK_PLAY; } else *item = 0; return (TRUE); } /* Handle equivalents for Normal/Explore/Debug */ if ((event->modifiers & cmdKey) && (ch == 'n')) { currmode = 0; ask_redraw(wind, RSRC_ASK_MODE); *item = RSRC_ASK_MODE; return (TRUE); } if ((event->modifiers & cmdKey) && (ch == 'e')) { currmode = 1; ask_redraw(wind, RSRC_ASK_MODE); *item = RSRC_ASK_MODE; return (TRUE); } if ((event->modifiers & cmdKey) && (ch == 'd')) { currmode = 2; ask_redraw(wind, RSRC_ASK_MODE); *item = RSRC_ASK_MODE; return (TRUE); } /* Handle equivalents for Cancel and Quit */ if ((ch == CH_ESCAPE) || (key == KEY_ESCAPE) || ((event->modifiers & cmdKey) && (ch == 'q')) || ((event->modifiers & cmdKey) && (ch == '.'))) { FlashButton(wind, RSRC_ASK_QUIT); *item = RSRC_ASK_QUIT; return (TRUE); } return (FALSE); case updateEvt: ask_redraw(wind, RSRC_ASK_NAME); return (FALSE); default: return (FALSE); } } void mac_askname () { GrafPtr oldport; DialogRef askdialog; short i, j, item, type; Handle handle; Rect rect; Str255 str; Point pt; UserItemUPP redraw = NewUserItemUPP(ask_redraw); ModalFilterUPP filter = NewModalFilterUPP(ask_filter); /* Create the dialog */ if (!(askdialog = GetNewDialog(RSRC_ASK, NULL, (WindowRef)-1))) noresource('DLOG', RSRC_ASK); GetPort(&oldport); SetPortDialogPort(askdialog); /* Initialize the name text item */ ask_restring(plname, str); if (plname[0]) { GetDialogItem(askdialog, RSRC_ASK_NAME, &type, &handle, &rect); SetDialogItemText(handle, str); } #if 0 { Str32 pName; pName [0] = 0; if (plname && plname [0]) { strcpy ((char *) pName, plname); c2pstr ((char *) pName); } else { Handle h; h = GetResource ('STR ', -16096); if (((Handle) 0 != h) && (GetHandleSize (h) > 0)) { DetachResource (h); HLock (h); if (**h > 31) { **h = 31; } BlockMove (*h, pName, **h + 1); DisposeHandle (h); } } if (pName [0]) { GetDialogItem(askdialog, RSRC_ASK_NAME, &type, &handle, &rect); SetDialogItemText(handle, pName); if (pName [0] > 2 && pName [pName [0] - 1] == '-') { short role = (*pANR).anMenu[anRole]; char suffix = (char) pName[pName[0]], *sfxindx = strchr(pl_classes, suffix); if (sfxindx) role = (short) (sfxindx - pl_classes); else if (suffix == '@') role = (short) rn2((int) strlen(pl_classes)); (*pANR).anMenu[anRole] = role; } } } #endif SelectDialogItemText(askdialog, RSRC_ASK_NAME, 0, 32767); /* Initialize the role popup menu */ if (!(askmenu[RSRC_ASK_ROLE] = NewMenu(RSRC_ASK_ROLE, "\p"))) fatal("\pCannot create role menu"); for (i = 0; roles[i].name.m; i++) { ask_restring(roles[i].name.m, str); AppendMenu(askmenu[RSRC_ASK_ROLE], str); } InsertMenu(askmenu[RSRC_ASK_ROLE], hierMenu); if (flags.initrole >= 0) currrole = flags.initrole; /* Check for backward compatibility */ else if ((currrole = str2role(pl_character)) < 0) currrole = randrole(); /* Initialize the race popup menu */ if (!(askmenu[RSRC_ASK_RACE] = NewMenu(RSRC_ASK_RACE, "\p"))) fatal("\pCannot create race menu"); for (i = 0; races[i].noun; i++) { ask_restring(races[i].noun, str); AppendMenu(askmenu[RSRC_ASK_RACE], str); } InsertMenu(askmenu[RSRC_ASK_RACE], hierMenu); if (flags.initrace >= 0) currrace = flags.initrace; else currrace = randrace(currrole); /* Initialize the gender popup menu */ if (!(askmenu[RSRC_ASK_GEND] = NewMenu(RSRC_ASK_GEND, "\p"))) fatal("\pCannot create gender menu"); for (i = 0; i < ROLE_GENDERS; i++) { ask_restring(genders[i].adj, str); AppendMenu(askmenu[RSRC_ASK_GEND], str); } InsertMenu(askmenu[RSRC_ASK_GEND], hierMenu); if (flags.initgend >= 0) currgend = flags.initgend; else if (flags.female) currgend = 1; else currgend = randgend(currrole, currrace); /* Initialize the alignment popup menu */ if (!(askmenu[RSRC_ASK_ALIGN] = NewMenu(RSRC_ASK_ALIGN, "\p"))) fatal("\pCannot create alignment menu"); for (i = 0; i < ROLE_ALIGNS; i++) { ask_restring(aligns[i].adj, str); AppendMenu(askmenu[RSRC_ASK_ALIGN], str); } InsertMenu(askmenu[RSRC_ASK_ALIGN], hierMenu); if (flags.initalign >= 0) curralign = flags.initalign; else curralign = randalign(currrole, currrace); /* Initialize the mode popup menu */ if (!(askmenu[RSRC_ASK_MODE] = NewMenu(RSRC_ASK_MODE, "\p"))) fatal("\pCannot create mode menu"); AppendMenu(askmenu[RSRC_ASK_MODE], "\pNormal"); AppendMenu(askmenu[RSRC_ASK_MODE], "\pExplore"); #ifdef WIZARD AppendMenu(askmenu[RSRC_ASK_MODE], "\pDebug"); #endif InsertMenu(askmenu[RSRC_ASK_MODE], hierMenu); currmode = 0; /* Set the redraw procedures */ for (item = RSRC_ASK_DEFAULT; item <= RSRC_ASK_MODE; item++) { GetDialogItem(askdialog, item, &type, &handle, &rect); SetDialogItem(askdialog, item, type, (Handle)redraw, &rect); } /* Handle dialog events */ do { /* Adjust the Play button */ ask_enable(askdialog, RSRC_ASK_PLAY, GetDialogTextEditHandle(askdialog)[0]->teLength); /* Adjust the race popup menu */ i = j = currrace; do { if (validrace(currrole, j)) { EnableMenuItem(askmenu[RSRC_ASK_RACE], j+1); CheckMenuItem(askmenu[RSRC_ASK_RACE], j+1, currrace == j); } else { DisableMenuItem(askmenu[RSRC_ASK_RACE], j+1); CheckMenuItem(askmenu[RSRC_ASK_RACE], j+1, FALSE); if ((currrace == j) && !races[++currrace].noun) currrace = 0; } if (!races[++j].noun) j = 0; } while (i != j); if (currrace != i) { GetDialogItem(askdialog, RSRC_ASK_RACE, &type, &handle, &rect); InvalWindowRect(GetDialogWindow(askdialog), &rect); } /* Adjust the gender popup menu */ i = j = currgend; do { if (validgend(currrole, currrace, j)) { EnableMenuItem(askmenu[RSRC_ASK_GEND], j+1); CheckMenuItem(askmenu[RSRC_ASK_GEND], j+1, currgend == j); } else { DisableMenuItem(askmenu[RSRC_ASK_GEND], j+1); CheckMenuItem(askmenu[RSRC_ASK_GEND], j+1, FALSE); if ((currgend == j) && (++currgend >= ROLE_GENDERS)) currgend = 0; } if (++j >= ROLE_GENDERS) j = 0; } while (i != j); if (currgend != i) { GetDialogItem(askdialog, RSRC_ASK_GEND, &type, &handle, &rect); InvalWindowRect(GetDialogWindow(askdialog), &rect); } /* Adjust the alignment popup menu */ i = j = curralign; do { if (validalign(currrole, currrace, j)) { EnableMenuItem(askmenu[RSRC_ASK_ALIGN], j+1); CheckMenuItem(askmenu[RSRC_ASK_ALIGN], j+1, curralign == j); } else { DisableMenuItem(askmenu[RSRC_ASK_ALIGN], j+1); CheckMenuItem(askmenu[RSRC_ASK_ALIGN], j+1, FALSE); if ((curralign == j) && (++curralign >= ROLE_ALIGNS)) curralign = 0; } if (++j >= ROLE_ALIGNS) j = 0; } while (i != j); if (curralign != i) { GetDialogItem(askdialog, RSRC_ASK_ALIGN, &type, &handle, &rect); InvalWindowRect(GetDialogWindow(askdialog), &rect); } /* Adjust the role popup menu */ for (i = 0; roles[i].name.m; i++) { ask_restring((currgend && roles[i].name.f) ? roles[i].name.f : roles[i].name.m, str); SetMenuItemText(askmenu[RSRC_ASK_ROLE], i+1, str); CheckMenuItem(askmenu[RSRC_ASK_ROLE], i+1, currrole == i); } /* Adjust the mode popup menu */ CheckMenuItem(askmenu[RSRC_ASK_MODE], 1, currmode == 0); CheckMenuItem(askmenu[RSRC_ASK_MODE], 2, currmode == 1); #ifdef WIZARD CheckMenuItem(askmenu[RSRC_ASK_MODE], 3, currmode == 2); #endif /* Wait for an action on an item */ ModalDialog(filter, &item); switch (item) { case RSRC_ASK_PLAY: break; case RSRC_ASK_QUIT: currmode = -1; break; case RSRC_ASK_ROLE: case RSRC_ASK_RACE: case RSRC_ASK_ALIGN: case RSRC_ASK_GEND: case RSRC_ASK_MODE: GetDialogItem(askdialog, item, &type, &handle, &rect); pt = *(Point *)▭ LocalToGlobal(&pt); if (!!(i = PopUpMenuSelect(askmenu[item], pt.v, pt.h, askselect[item] + 1))) askselect[item] = LoWord(i) - 1; InvalWindowRect(GetDialogWindow(askdialog), &rect); break; case RSRC_ASK_NAME: #if 0 /* limit the data here to 25 chars */ { short beepTEDelete = 1; while ((**dRec.textH).teLength > 25) { if (beepTEDelete++ <= 3) SysBeep(3); TEKey('\b', dRec.textH); } } /* special case filter (that doesn't plug all the holes!) */ if (((**dRec.textH).teLength == 1) && (**((**dRec.textH).hText) < 32)) TEKey('\b', dRec.textH); #endif break; } } while ((item != RSRC_ASK_PLAY) && (item != RSRC_ASK_QUIT)); /* Process the name */ GetDialogItem(askdialog, RSRC_ASK_NAME, &type, &handle, &rect); GetDialogItemText(handle, str); if (str[0] > PL_NSIZ-1) str[0] = PL_NSIZ-1; BlockMove(&str[1], plname, str[0]); plname[str[0]] = '\0'; /* Destroy the dialog */ for (i = RSRC_ASK_ROLE; i <= RSRC_ASK_MODE; i++) { DeleteMenu(i); DisposeMenu(askmenu[i]); } SetPort(oldport); DisposeDialog(askdialog); DisposeRoutineDescriptor(filter); DisposeRoutineDescriptor(redraw); /* Process the mode */ #ifdef WIZARD wizard = #endif discover = 0; switch (currmode) { case 0: /* Normal */ break; case 1: /* Explore */ discover = 1; break; #ifdef WIZARD case 2: /* Debug */ wizard = 1; strcpy(plname, WIZARD); break; #endif default: /* Quit */ ExitToShell(); } /* Process the role */ strcpy(pl_character, roles[currrole].name.m); flags.initrole = currrole; /* Process the race */ flags.initrace = currrace; /* Process the gender */ flags.female = flags.initgend = currgend; /* Process the alignment */ flags.initalign = curralign; return; } /*** Menu bar routines ***/ #if !TARGET_API_MAC_CARBON static void alignAD(Rect *pRct, short vExempt) { (*pRct).right -= (*pRct).left; /* width */ (*pRct).bottom -= (*pRct).top; /* height */ (*pRct).left = (qd.screenBits.bounds.right - (*pRct).right) / 2; (*pRct).top = (qd.screenBits.bounds.bottom - (*pRct).bottom - vExempt) / 2; (*pRct).top += vExempt; (*pRct).right += (*pRct).left; (*pRct).bottom += (*pRct).top; } #endif static void mustGetMenuAlerts() { short i; Rect **hRct; for (i = alrt_Menu_start; i < alrt_Menu_limit; i++) { if (! (hRct = (Rect **) GetResource('ALRT', i))) /* AlertTHndl */ { for (i = 0; i < beepMenuAlertErr; i++) SysBeep(3); ExitToShell(); } #if !TARGET_API_MAC_CARBON alignAD(*hRct, GetMBarHeight()); #endif } } static void menuError(short menuErr) { short i; for (i = 0; i < beepMenuAlertErr; i++) SysBeep(3); ParamText(menuErrStr[menuErr], "\p", "\p", "\p"); (void) Alert(alrtMenuNote, (ModalFilterUPP) 0L); ExitToShell(); } void InitMenuRes() { static Boolean was_inited = 0; short i, j; menuListHandle mlHnd; MenuHandle menu; if (was_inited) return; was_inited = 1; mustGetMenuAlerts(); for (i = listMenubar; i <= listSubmenu; i++) { if (! (mlHnd = (menuListHandle) GetResource('MNU#', (menuBarListID + i)))) menuError(errGetMenuList); pMenuList[i] = (menuListPtr) NewPtr(GetHandleSize((Handle) mlHnd)); *pMenuList[i] = **mlHnd; for (j = 0; j < pMenuList[i]->numMenus; j++) { if (! (menu = (MenuHandle) GetMenu((**mlHnd).mref[j].mresID))) { Str31 d; NumToString ((**mlHnd).mref[j].mresID, d); menuError(errGetMenu); } pMenuList[i]->mref[j].mhnd = menu; #if !TARGET_API_MAC_CARBON * ((short *) *menu) = j + (**mlHnd).firstMenuID; #else SetMenuID(menu, j + (**mlHnd).firstMenuID); #endif /* consecutive IDs */ /* expand apple menu */ if ((i == listMenubar) && (j == menuApple)) { AppendResMenu(menu, 'DRVR'); } InsertMenu(menu, ((i == listSubmenu) ? hierMenu : 0)); } } DrawMenuBar(); return; } void AdjustMenus(short dimMenubar) { short newMenubar = mbarRegular; WindowRef win = FrontWindow(); short i; /* * if (windowprocs != mac_procs) { * return; * } */ /* determine the new menubar state */ if (dimMenubar) newMenubar = mbarDim; else if (!win) newMenubar = mbarNoWindows; else if (GetWindowKind(win) < 0) newMenubar = mbarDA; else if (!IsWindowVisible(_mt_window)) newMenubar = mbarNoMap; if (newMenubar != mbarRegular) ; /* we've already found its state */ #ifdef WIZARD else if (wizard) { newMenubar = mbarSpecial; if (kAdjustWizardMenu) { kAdjustWizardMenu = 0; SetMenuItemText(MHND_FILE, menuFilePlayMode, "\pDebug"); } } #endif else if (discover) { newMenubar = mbarSpecial; if (kAdjustWizardMenu) { kAdjustWizardMenu = 0; SetMenuItemText(MHND_FILE, menuFilePlayMode, "\pExplore"); for (i = CountMenuItems(MHND_WIZ); i > menuWizardAttributes; i--) DeleteMenuItem(MHND_WIZ, i); } } /* adjust the menubar, if there's a state change */ if (theMenubar != newMenubar) { switch(theMenubar = newMenubar) { case mbarDim: /* disable all menus (except the apple menu) */ for (i = menuFile; i < NUM_MBAR; i++) DisableMenuItem(MBARHND(i), 0); break; case mbarNoWindows: case mbarDA: case mbarNoMap: /* enable the file menu, but ... */ EnableMenuItem(MHND_FILE, 0); /* ... disable the window commands! */ for (i = menuFileRedraw; i <= menuFileEnterExplore; i++) DisableMenuItem(MHND_FILE, i); /* ... and disable the rest of the menus */ for (i = menuEdit; i < NUM_MBAR; i++) DisableMenuItem(MBARHND(i), 0); if (theMenubar == mbarDA) EnableMenuItem(MHND_EDIT, 0); break; case mbarRegular: case mbarSpecial: /* enable all menus ... */ for (i = menuFile; i < NUM_MBAR; i++) EnableMenuItem(MBARHND(i), 0); /* ... except the unused Edit menu */ DisableMenuItem(MHND_EDIT, 0); /* ... enable the window commands */ for (i = menuFileRedraw; i <= menuFileEnterExplore; i++) EnableMenuItem(MHND_FILE, i); if (theMenubar == mbarRegular) DisableMenuItem(MHND_FILE, menuFilePlayMode); else DisableMenuItem(MHND_FILE, menuFileEnterExplore); break; } DrawMenuBar(); } } void DoMenuEvt(long menuEntry) { short menuID = HiWord(menuEntry); short menuItem = LoWord(menuEntry); switch(menuID - ID1_MBAR) /* all submenus are default case */ { case menuApple: if (menuItem == menuAppleAboutBox) aboutNetHack(); #if !TARGET_API_MAC_CARBON else { unsigned char daName[32]; GetMenuItemText(MHND_APPLE, menuItem, * (Str255 *) daName); (void) OpenDeskAcc(daName); } #endif break; /* * Those direct calls are ugly: they should be installed into cmd.c . * Those AddToKeyQueue() calls are also ugly: they should be put into * the 'STR#' resource. */ case menuFile: switch(menuItem) { case menuFileRedraw: AddToKeyQueue ('R' & 0x1f, 1); break; case menuFilePrevMsg: AddToKeyQueue ('P' & 0x1f, 1); break; case menuFileCleanup: (void) SanePositions(); break; case menuFileEnterExplore: AddToKeyQueue ('X', 1); break; case menuFileSave: askSave(); break; case menuFileQuit: askQuit(); break; } break; case menuEdit: #if !TARGET_API_MAC_CARBON (void) SystemEdit(menuItem - 1); #endif break; default: /* get associated string and add to key queue */ { Str255 mstr; short i; GetIndString(mstr, menuID, menuItem); if (mstr[0] > QUEUE_LEN) mstr[0] = QUEUE_LEN; for (i = 1; ((i <= mstr[0]) && (mstr[i] != mstrEndChar)); i++) AddToKeyQueue(mstr[i], false); /* Special processing for extended commands. The command selection appears before mstrEndChar, the rest appears after. The rest is used only when in Mac windows mode. In any case we add a newline to get the command going. */ if ( mstr[1] == '#' ) { if ( windowprocs.win_init_nhwindows == mac_procs.win_init_nhwindows ) for ( i++; ((i <= mstr[0]) && (mstr[i] != mstrEndChar)); i++) AddToKeyQueue(mstr[i], false); AddToKeyQueue('\n', false); } } break; } HiliteMenu(0); } static void aboutNetHack() { if (theMenubar >= mbarRegular) { (void) doversion(); /* is this necessary? */ } else { unsigned char aboutStr[32] = "\pSlash'EM 0.0."; if (PATCHLEVEL > 10) { aboutStr[++aboutStr[0]] = '0' + PATCHLEVEL / 10; } aboutStr[++aboutStr[0]] = '0' + PATCHLEVEL % 10; if (EDITLEVEL) { aboutStr[++aboutStr[0]] = 'e'; aboutStr[++aboutStr[0]] = '0' + EDITLEVEL; } #ifdef FIXLEVEL if (FIXLEVEL) { aboutStr[++aboutStr[0]] = 'f'; aboutStr[++aboutStr[0]] = '0' + FIXLEVEL; } #endif aboutStr[++aboutStr[0]] = CHAR_CR; ParamText(aboutStr, "\pwww.slashem.org", "\p", "\p"); (void) Alert(alrtMenuNote, (ModalFilterUPP) 0L); ResetAlertStage(); } } static void askSave() { Boolean doSave = 1; Boolean doYes = 0; if (theMenubar < mbarRegular) { short itemHit; ParamText("\pReally Save?", "\p", "\p", "\p"); itemHit = Alert(alrtMenu_NY, (ModalFilterUPP) 0L); ResetAlertStage(); if (itemHit != bttnMenuAlertYes) { doSave = 0; } else { doYes = 1; } } if (doSave) { AddToKeyQueue ('S', 1); if (doYes) { AddToKeyQueue ('y', 1); } } } static void askQuit() { Boolean doQuit = 1; Boolean doYes = 0; Boolean winMac; char *quitinput; if (!strcmp (windowprocs.name, "mac")) winMac = 1; else winMac = 0; if (theMenubar < mbarRegular) { short itemHit; ParamText("\pReally Quit?", "\p", "\p", "\p"); itemHit = Alert(alrtMenu_NY, (ModalFilterUPP) 0L); ResetAlertStage(); if (itemHit != bttnMenuAlertYes) { doQuit = 0; } else { doYes = 1; } } if (doQuit) { /* MWM -- forgive me lord, an even uglier kludge to deal with differences in command input handling */ if (winMac) quitinput = "#quit\r"; else quitinput = "#q\r"; /* KMH -- Ugly kludge */ while (*quitinput) AddToKeyQueue(*quitinput++, 1); if (doYes) { if (winMac) quitinput = "y\rq\r\r\r"; else quitinput = "yq\r"; while (*quitinput) AddToKeyQueue(*quitinput++, 1); } } } slashem-0.0.7E7F3/sys/mac/dprintf.c0000664000076400007640000000201510545462317015042 0ustar aliali/* SCCS Id: @(#)dprintf.c 3.1 94/01/29 */ /* Copyright (c) Jon W{tte, 1993. */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" #include "macwin.h" static Boolean KeyDown (unsigned short code) { unsigned char keys [16]; GetKeys ((void *) keys); return ((keys [code >> 3] >> (code & 7)) & 1) != 0; } void dprintf (char *format, ...) { char buffer [500]; va_list list; int doit; #define DO_DEBUGSTR 1 #define DO_PLINE 2 if (flags.debug) { doit = 0; if (macFlags.hasDebugger && KeyDown (0x39)) { /* Caps Lock */ doit = DO_DEBUGSTR; } else if (KeyDown (0x3B) && iflags.window_inited && /* Control */ (WIN_MESSAGE != -1) && theWindows [WIN_MESSAGE].its_window) { doit = DO_PLINE; } if (doit) { va_start (list, format); vsprintf (&buffer [1], format, list); va_end (list) ; if (doit == DO_DEBUGSTR) { buffer [0] = strlen (&buffer [1]); DebugStr ((uchar *) buffer); } else if (doit == DO_PLINE) pline ("%s", &buffer [1]); } } } slashem-0.0.7E7F3/sys/mac/Levels.make0000664000076400007640000002240510545462317015326 0ustar alialiLevels Ä LevelList #include "{LibDir}"Levels.list "{LibDir}"Arc-strt.lev Ä "{Dat}"Arch.des "{ObjDir}"LevComp "{ObjDir}"LevComp "{Dat}"Arch.des SetFile -t "{FileType}" -c "{FileCreator}" Å.lev Move -y Å.lev "{LibDir}" "{LibDir}"Bar-strt.lev Ä "{Dat}"Barb.des "{ObjDir}"LevComp "{ObjDir}"LevComp "{Dat}"Barb.des SetFile -t "{FileType}" -c "{FileCreator}" Å.lev Move -y Å.lev "{LibDir}" "{LibDir}"beholder.lev Ä "{Dat}"beholder.des "{ObjDir}"LevComp "{ObjDir}"LevComp "{Dat}"beholder.des SetFile -t "{FileType}" -c "{FileCreator}" Å.lev Move -y Å.lev "{LibDir}" "{LibDir}"bigrm-1.lev Ä "{Dat}"bigroom.des "{ObjDir}"LevComp "{ObjDir}"LevComp "{Dat}"bigroom.des SetFile -t "{FileType}" -c "{FileCreator}" Å.lev Move -y Å.lev "{LibDir}" "{LibDir}"blkmar.lev Ä "{Dat}"blkmar.des "{ObjDir}"LevComp "{ObjDir}"LevComp "{Dat}"blkmar.des SetFile -t "{FileType}" -c "{FileCreator}" Å.lev Move -y Å.lev "{LibDir}" "{LibDir}"castle.lev Ä "{Dat}"castle.des "{ObjDir}"LevComp "{ObjDir}"LevComp "{Dat}"castle.des SetFile -t "{FileType}" -c "{FileCreator}" Å.lev Move -y Å.lev "{LibDir}" "{LibDir}"Cav-strt.lev Ä "{Dat}"Caveman.des "{ObjDir}"LevComp "{ObjDir}"LevComp "{Dat}"Caveman.des SetFile -t "{FileType}" -c "{FileCreator}" Å.lev Move -y Å.lev "{LibDir}" "{LibDir}"grund-1.lev Ä "{Dat}"grund.des "{ObjDir}"LevComp "{ObjDir}"LevComp "{Dat}"grund.des SetFile -t "{FileType}" -c "{FileCreator}" Å.lev Move -y Å.lev "{LibDir}" "{LibDir}"dragons.lev Ä "{Dat}"dragons.des "{ObjDir}"LevComp "{ObjDir}"LevComp "{Dat}"dragons.des SetFile -t "{FileType}" -c "{FileCreator}" Å.lev Move -y Å.lev "{LibDir}" "{LibDir}"earth.lev Ä "{Dat}"endgame.des "{ObjDir}"LevComp "{ObjDir}"LevComp "{Dat}"endgame.des SetFile -t "{FileType}" -c "{FileCreator}" Å.lev Move -y Å.lev "{LibDir}" "{LibDir}"Fla-strt.lev Ä "{Dat}"Flame.des "{ObjDir}"LevComp "{ObjDir}"LevComp "{Dat}"Flame.des SetFile -t "{FileType}" -c "{FileCreator}" Å.lev Move -y Å.lev "{LibDir}" "{LibDir}"frnknstn.lev Ä "{Dat}"frnknstn.des "{ObjDir}"LevComp "{ObjDir}"LevComp "{Dat}"frnknstn.des SetFile -t "{FileType}" -c "{FileCreator}" Å.lev Move -y Å.lev "{LibDir}" "{LibDir}"valley.lev Ä "{Dat}"gehennom.des "{ObjDir}"LevComp "{ObjDir}"LevComp "{Dat}"gehennom.des SetFile -t "{FileType}" -c "{FileCreator}" Å.lev Move -y Å.lev "{LibDir}" "{LibDir}"cav2fill.lev Ä "{Dat}"giants.des "{ObjDir}"LevComp "{ObjDir}"LevComp "{Dat}"giants.des SetFile -t "{FileType}" -c "{FileCreator}" Å.lev Move -y Å.lev "{LibDir}" "{LibDir}"guild.lev Ä "{Dat}"guild.des "{ObjDir}"LevComp "{ObjDir}"LevComp "{Dat}"guild.des SetFile -t "{FileType}" -c "{FileCreator}" Å.lev Move -y Å.lev "{LibDir}" "{LibDir}"Hea-strt.lev Ä "{Dat}"Healer.des "{ObjDir}"LevComp "{ObjDir}"LevComp "{Dat}"Healer.des SetFile -t "{FileType}" -c "{FileCreator}" Å.lev Move -y Å.lev "{LibDir}" "{LibDir}"Ice-strt.lev Ä "{Dat}"Ice.des "{ObjDir}"LevComp "{ObjDir}"LevComp "{Dat}"Ice.des SetFile -t "{FileType}" -c "{FileCreator}" Å.lev Move -y Å.lev "{LibDir}" "{LibDir}"Kni-strt.lev Ä "{Dat}"Knight.des "{ObjDir}"LevComp "{ObjDir}"LevComp "{Dat}"Knight.des SetFile -t "{FileType}" -c "{FileCreator}" Å.lev Move -y Å.lev "{LibDir}" "{LibDir}"knox.lev Ä "{Dat}"knox.des "{ObjDir}"LevComp "{ObjDir}"LevComp "{Dat}"knox.des SetFile -t "{FileType}" -c "{FileCreator}" Å.lev Move -y Å.lev "{LibDir}" "{LibDir}"kobold-1.lev Ä "{Dat}"kobold-1.des "{ObjDir}"LevComp "{ObjDir}"LevComp "{Dat}"kobold-1.des SetFile -t "{FileType}" -c "{FileCreator}" Å.lev Move -y Å.lev "{LibDir}" "{LibDir}"kobold-2.lev Ä "{Dat}"kobold-2.des "{ObjDir}"LevComp "{ObjDir}"LevComp "{Dat}"kobold-2.des SetFile -t "{FileType}" -c "{FileCreator}" Å.lev Move -y Å.lev "{LibDir}" "{LibDir}"lich.lev Ä "{Dat}"lich.des "{ObjDir}"LevComp "{ObjDir}"LevComp "{Dat}"lich.des SetFile -t "{FileType}" -c "{FileCreator}" Å.lev Move -y Å.lev "{LibDir}" "{LibDir}"mall-1.lev Ä "{Dat}"mall-1.des "{ObjDir}"LevComp "{ObjDir}"LevComp "{Dat}"mall-1.des SetFile -t "{FileType}" -c "{FileCreator}" Å.lev Move -y Å.lev "{LibDir}" "{LibDir}"mall-2.lev Ä "{Dat}"mall-2.des "{ObjDir}"LevComp "{ObjDir}"LevComp "{Dat}"mall-2.des SetFile -t "{FileType}" -c "{FileCreator}" Å.lev Move -y Å.lev "{LibDir}" "{LibDir}"medusa-1.lev Ä "{Dat}"medusa.des "{ObjDir}"LevComp "{ObjDir}"LevComp "{Dat}"medusa.des SetFile -t "{FileType}" -c "{FileCreator}" Å.lev Move -y Å.lev "{LibDir}" "{LibDir}"Xyz-start.lev Ä Echo Ignore example template "{LibDir}"minefill.lev Ä "{Dat}"mines.des "{ObjDir}"LevComp "{ObjDir}"LevComp "{Dat}"mines.des SetFile -t "{FileType}" -c "{FileCreator}" Å.lev Move -y Å.lev "{LibDir}" "{LibDir}"Mon-strt.lev Ä "{Dat}"Monk.des "{ObjDir}"LevComp "{ObjDir}"LevComp "{Dat}"Monk.des SetFile -t "{FileType}" -c "{FileCreator}" Å.lev Move -y Å.lev "{LibDir}" "{LibDir}"mtemple.lev Ä "{Dat}"mtemple.des "{ObjDir}"LevComp "{ObjDir}"LevComp "{Dat}"mtemple.des SetFile -t "{FileType}" -c "{FileCreator}" Å.lev Move -y Å.lev "{LibDir}" "{LibDir}"Nec-strt.lev Ä "{Dat}"Necro.des "{ObjDir}"LevComp "{ObjDir}"LevComp "{Dat}"Necro.des SetFile -t "{FileType}" -c "{FileCreator}" Å.lev Move -y Å.lev "{LibDir}" "{LibDir}"mall.lev Ä "{Dat}"newmall.des "{ObjDir}"LevComp "{ObjDir}"LevComp "{Dat}"newmall.des SetFile -t "{FileType}" -c "{FileCreator}" Å.lev Move -y Å.lev "{LibDir}" "{LibDir}"nightmar.lev Ä "{Dat}"nightmar.des "{ObjDir}"LevComp "{ObjDir}"LevComp "{Dat}"nightmar.des SetFile -t "{FileType}" -c "{FileCreator}" Å.lev Move -y Å.lev "{LibDir}" "{LibDir}"nymph.lev Ä "{Dat}"nymph.des "{ObjDir}"LevComp "{ObjDir}"LevComp "{Dat}"nymph.des SetFile -t "{FileType}" -c "{FileCreator}" Å.lev Move -y Å.lev "{LibDir}" "{LibDir}"oracle.lev Ä "{Dat}"oracle.des "{ObjDir}"LevComp "{ObjDir}"LevComp "{Dat}"oracle.des SetFile -t "{FileType}" -c "{FileCreator}" Å.lev Move -y Å.lev "{LibDir}" "{LibDir}"Pri-strt.lev Ä "{Dat}"Priest.des "{ObjDir}"LevComp "{ObjDir}"LevComp "{Dat}"Priest.des SetFile -t "{FileType}" -c "{FileCreator}" Å.lev Move -y Å.lev "{LibDir}" "{LibDir}"rats.lev Ä "{Dat}"rats.des "{ObjDir}"LevComp "{ObjDir}"LevComp "{Dat}"rats.des SetFile -t "{FileType}" -c "{FileCreator}" Å.lev Move -y Å.lev "{LibDir}" "{LibDir}"Rog-strt.lev Ä "{Dat}"Rogue.des "{ObjDir}"LevComp "{ObjDir}"LevComp "{Dat}"Rogue.des SetFile -t "{FileType}" -c "{FileCreator}" Å.lev Move -y Å.lev "{LibDir}" "{LibDir}"Sam-strt.lev Ä "{Dat}"Samurai.des "{ObjDir}"LevComp "{ObjDir}"LevComp "{Dat}"Samurai.des SetFile -t "{FileType}" -c "{FileCreator}" Å.lev Move -y Å.lev "{LibDir}" "{LibDir}"sea.lev Ä "{Dat}"sea.des "{ObjDir}"LevComp "{ObjDir}"LevComp "{Dat}"sea.des SetFile -t "{FileType}" -c "{FileCreator}" Å.lev Move -y Å.lev "{LibDir}" "{LibDir}"Und-strt.lev Ä "{Dat}"Slayer.des "{ObjDir}"LevComp "{ObjDir}"LevComp "{Dat}"Slayer.des SetFile -t "{FileType}" -c "{FileCreator}" Å.lev Move -y Å.lev "{LibDir}" "{LibDir}"sokoban4.lev Ä "{Dat}"sokoban.des "{ObjDir}"LevComp "{ObjDir}"LevComp "{Dat}"sokoban.des SetFile -t "{FileType}" -c "{FileCreator}" Å.lev Move -y Å.lev "{LibDir}" "{LibDir}"spiders.lev Ä "{Dat}"spiders.des "{ObjDir}"LevComp "{ObjDir}"LevComp "{Dat}"spiders.des SetFile -t "{FileType}" -c "{FileCreator}" Å.lev Move -y Å.lev "{LibDir}" "{LibDir}"stor-1.lev Ä "{Dat}"stor-1.des "{ObjDir}"LevComp "{ObjDir}"LevComp "{Dat}"stor-1.des SetFile -t "{FileType}" -c "{FileCreator}" Å.lev Move -y Å.lev "{LibDir}" "{LibDir}"stor-2.lev Ä "{Dat}"stor-2.des "{ObjDir}"LevComp "{ObjDir}"LevComp "{Dat}"stor-2.des SetFile -t "{FileType}" -c "{FileCreator}" Å.lev Move -y Å.lev "{LibDir}" "{LibDir}"stor-3.lev Ä "{Dat}"stor-3.des "{ObjDir}"LevComp "{ObjDir}"LevComp "{Dat}"stor-3.des SetFile -t "{FileType}" -c "{FileCreator}" Å.lev Move -y Å.lev "{LibDir}" "{LibDir}"tomb.lev Ä "{Dat}"tomb.des "{ObjDir}"LevComp "{ObjDir}"LevComp "{Dat}"tomb.des SetFile -t "{FileType}" -c "{FileCreator}" Å.lev Move -y Å.lev "{LibDir}" "{LibDir}"Tou-strt.lev Ä "{Dat}"Tourist.des "{ObjDir}"LevComp "{ObjDir}"LevComp "{Dat}"Tourist.des SetFile -t "{FileType}" -c "{FileCreator}" Å.lev Move -y Å.lev "{LibDir}" "{LibDir}"tower1.lev Ä "{Dat}"tower.des "{ObjDir}"LevComp "{ObjDir}"LevComp "{Dat}"tower.des SetFile -t "{FileType}" -c "{FileCreator}" Å.lev Move -y Å.lev "{LibDir}" "{LibDir}"Val-strt.lev Ä "{Dat}"Valkyrie.des "{ObjDir}"LevComp "{ObjDir}"LevComp "{Dat}"Valkyrie.des SetFile -t "{FileType}" -c "{FileCreator}" Å.lev Move -y Å.lev "{LibDir}" "{LibDir}"Wiz-strt.lev Ä "{Dat}"Wizard.des "{ObjDir}"LevComp "{ObjDir}"LevComp "{Dat}"Wizard.des SetFile -t "{FileType}" -c "{FileCreator}" Å.lev Move -y Å.lev "{LibDir}" "{LibDir}"wizard1.lev Ä "{Dat}"yendor.des "{ObjDir}"LevComp "{ObjDir}"LevComp "{Dat}"yendor.des SetFile -t "{FileType}" -c "{FileCreator}" Å.lev Move -y Å.lev "{LibDir}" "{LibDir}"Yeo-strt.lev Ä "{Dat}"Yeoman.des "{ObjDir}"LevComp "{ObjDir}"LevComp "{Dat}"Yeoman.des SetFile -t "{FileType}" -c "{FileCreator}" Å.lev Move -y Å.lev "{LibDir}" "{LibDir}"Ran-strt.lev Ä "{Dat}"Ranger.des "{ObjDir}"LevComp "{ObjDir}"LevComp "{Dat}"Ranger.des SetFile -t "{FileType}" -c "{FileCreator}" Å.lev Move -y Å.lev "{LibDir}" "{LibDir}"soko4-1.lev Ä "{Dat}"sokoban.des "{ObjDir}"LevComp "{ObjDir}"LevComp "{Dat}"sokoban.des SetFile -t "{FileType}" -c "{FileCreator}" Å.lev Move -y Å.lev "{LibDir}" slashem-0.0.7E7F3/sys/mac/Install.mpw0000664000076400007640000000551110545462317015367 0ustar alialiHow to make Mac Slash'EM using MPW ================================== Copyright (c) 1992-11-23 Jon W{tte Modifications copyright (c) 1999-2004 Paul Hurtley Please read these instructions through carefully before starting to build Slash'EM for the Macintosh. Most important is the part about keeping the folder structure intact. 1) Suggested Requirements: - MPW development software - Macintosh computer system - 72 MB free disk (my Power-Mac only build area uses this much) - bison, from http://perso.wanadoo.fr/gilles.depeyrot/DevTools_en.html#Bison; other yacc-alikes should also work. - lex, from http://perso.wanadoo.fr/gilles.depeyrot/DevTools_en.html#Flex; other lex-alikes should also work. - MacCVS Pro, from http://sourceforge.net/projects/maccvspro/ This will allow you to keep up-to-date with our development sources. Other CVS clients should also work, or you can do without 2) Unpack the source files onto your hard disk. Make sure to keep the folder structure the way it is. 3) Edit the make file :sys:mac:Macintosh.make to set the Top variable. 4) You may want to edit some of the options in :include:config.h to suit your tastes. However, using MPW, this file will self-configure for the default Mac distribution. 5) Choose Update Dependencies from the Build menu. This should create the sub-makefiles. You can leave this step out, but then header dependencies won't be added to the sub-makefiles, and the builds will stop at each CreateMake. 6) Make sure your current folder is :sys:mac, choose Build from the Build menu and build "Macintosh". 7) When the build is done the results are in the DungeonPPC, DungeonFat or Dungeon68K folder, depending on which Processor you have chosen. Enjoy! 8) If, heaven forbid, you experience any configuration problems or make errors, try to fix it yourself (there are several READMEs and the like you can check)[though not very many of them have been updated for Slash'EM], but be sure to save a copy of the original files if you change anything. There should be no problems if you use the correct versions etc. as per step 1 but you never know. As always, turn off all INITs and re-boot if you have any problems, and they might go away. If you experience any bugs, please report them via our web page http://www.slashem.org Be sure to include what computer you use, how it is configured, what version of MPW and C and the headers you use, where you got the Slash'EM source etc. etc. 9) This code is provided "as is" free of charge, and no warranty of any kind can or will cover it. Use at your own risk. This code is protected under copyright law, and may only be re-distributed under the terms of the NetHack license also found in this package, or otherwise with the authors' permission. (If the license is missing, email us via the web page for a copy.) slashem-0.0.7E7F3/sys/mac/macsnd.c0000664000076400007640000000454110545462317014647 0ustar aliali/* SCCS Id: @(#)macsnd.c 3.1 92/11/28 */ /* Copyright (c) 1992 by Jon Watte */ /* NetHack may be freely redistributed. See license for details. */ /* * This file contains music playing code. * * If we were REALLY determinated, we would make the sound play * asynchronously, but I'll save that one for a rainy day... * * This may break A/UX, since it defines MAC but we need to * check that the toolbox is booted. I'll defer that one too. * * - h+ 921128 */ #include "hack.h" #include "mactty.h" #include "macwin.h" #if !TARGET_API_MAC_CARBON # include # include #else # define freqDurationCmd 40 #endif #define SND_BUFFER(s) (&(*s)[20]) #define SND_LEN(s) (GetHandleSize(s)-42) void mac_speaker (struct obj *instr, char *melody) { SndChannelPtr theChannel = (SndChannelPtr) 0; SndCommand theCmd; Handle theSound; unsigned char theName [32]; char *n = (char *) &theName [1]; int typ = instr->otyp; const char *actualn = OBJ_NAME (objects [typ]); /* * First: are we in the library ? */ if (flags.silent) { return; } /* * Is this a known instrument ? */ strcpy (n, actualn); theName [0] = strlen (n); theSound = GetNamedResource ('snd ', theName); if (! theSound) { return; } HLock (theSound); /* * Set up the synth */ if (SndNewChannel(&theChannel, sampledSynth, initMono + initNoInterp, (void *) 0) == noErr) { char midi_note [] = {57, 59, 60, 62, 64, 65, 67}; short err; short snd_len = SND_LEN (theSound) / 18; theCmd.cmd = soundCmd; theCmd.param1 = 0; theCmd.param2 = (long) SND_BUFFER (theSound); err = SndDoCommand (theChannel, &theCmd, false); /* * We rack 'em up all in a row * The mac will play them correctly and then end, since * we do a sync close below. * */ while (*melody && ! err) { while (*melody > 'G') { *melody -= 8; } while (*melody < 'A') { *melody += 8; } theCmd.cmd = freqDurationCmd; theCmd.param1 = snd_len; theCmd.param2 = midi_note [*melody - 'A']; err = SndDoCommand (theChannel, &theCmd, false); melody ++; } SndDisposeChannel (theChannel, false); /* Sync wait for completion */ ReleaseResource (theSound); } } void tty_nhbell (void) { Handle h = GetNamedResource ('snd ', "\pNetHack Bell"); if (h) { HLock (h); SndPlay ((SndChannelPtr) 0, (SndListHandle) h, 0); ReleaseResource (h); } else SysBeep (30); } slashem-0.0.7E7F3/sys/mac/MRecover.r0000664000076400007640000001726310545462317015150 0ustar alialidata 'ALRT' (128) { $"0028 0028 0082 017C 0080 0004" /* .(.(.‚.|.€.. */ }; data 'ALRT' (129) { $"0028 0028 00C2 017C 0081 0004" /* .(.(.Â.|... */ }; resource 'DITL' (128, purgeable) { { /* array DITLarray: 2 elements */ /* [1] */ {56, 110, 76, 230}, Button { enabled, "OK" }, /* [2] */ {10, 10, 42, 330}, StaticText { disabled, "^0" } } }; resource 'DITL' (129, purgeable) { { /* array DITLarray: 2 elements */ /* [1] */ {120, 110, 140, 230}, Button { enabled, "OK" }, /* [2] */ {10, 10, 106, 330}, StaticText { disabled, "1) Select \"Open...\" from the File menu.\n" "2) Select the game to recover from the d" "ialog.\n3) Wait for the result (OK or Sor" "ry).\n\nDo not attempt to recover a game t" "hat is \"in progress\" (i.e. still running" " in Slash'EM)!" } } }; resource 'DITL' (256, purgeable) { { /* array DITLarray: 1 elements */ /* [1] */ {7, 11, 17, 269}, UserItem { disabled } } }; resource 'MENU' (130) { 130, textMenuProc, 0x7FFFFFFD, enabled, "Edit", { /* array: 6 elements */ /* [1] */ "Undo", noIcon, "Z", noMark, plain, /* [2] */ "-", noIcon, noKey, noMark, plain, /* [3] */ "Cut", noIcon, "X", noMark, plain, /* [4] */ "Copy", noIcon, "C", noMark, plain, /* [5] */ "Paste", noIcon, "V", noMark, plain, /* [6] */ "Clear", noIcon, noKey, noMark, plain } }; resource 'MENU' (128) { 128, textMenuProc, 0x7FFFFFFB, enabled, apple, { /* array: 3 elements */ /* [1] */ "About Recover...", noIcon, noKey, noMark, plain, /* [2] */ "Help...", noIcon, noKey, noMark, plain, /* [3] */ "-", noIcon, noKey, noMark, plain } }; resource 'MENU' (129) { 129, textMenuProc, 0x7FFFFFF5, enabled, "File", { /* array: 5 elements */ /* [1] */ "Open...", noIcon, "O", noMark, plain, /* [2] */ "-", noIcon, noKey, noMark, plain, /* [3] */ "Close DA", noIcon, "W", noMark, plain, /* [4] */ "-", noIcon, noKey, noMark, plain, /* [5] */ "Quit", noIcon, "Q", noMark, plain } }; resource 'CURS' (128, locked, preload) { $"0000 03C0 02C0 03C0 0180 03C0 0C30 0810" $"1028 1048 1788 1008 0810 0C30 03C0", $"03C0 07E0 07E0 07E0 03C0 0FF0 1FF8 1FF8" $"3FFC 3FFC 3FFC 3FFC 1FF8 1FF8 0FF0 03C0", {9, 7} }; resource 'CURS' (129, locked, preload) { $"0000 03C0 0340 03C0 0180 0180 0240 0460" $"0420 0460 05A0 0420 0460 0240 0180", $"03C0 07E0 07E0 07E0 03C0 03C0 07E0 0FF0" $"0FF0 0FF0 0FF0 0FF0 0FF0 07E0 03C0 0180", {9, 7} }; resource 'CURS' (130, locked, preload) { $"0000 03C0 02C0 03C0 0180 0180 0240 03C0" $"0240 07C0 0640 03C0 0240 03C0 0180", $"03C0 07E0 07E0 07E0 03C0 03C0 07E0 07E0" $"07E0 0FE0 0FE0 07E0 07E0 07E0 03C0 0180", {9, 7} }; resource 'CURS' (135, locked, preload) { $"0000 03C0 0340 03C0 0180 0180 0240 0660" $"0420 0660 05A0 0620 0460 0340 0180", $"03C0 07E0 07E0 07E0 03C0 03C0 07E0 0FF0" $"0FF0 0FF0 0FF0 0FF0 0FF0 07E0 03C0 0180", {9, 7} }; resource 'CURS' (133, locked, preload) { $"0000 03C0 0340 03C0 0180 0180 0340 0620" $"0560 0520 0560 0520 0560 0240 0180", $"03C0 07E0 07E0 07E0 03C0 03C0 07E0 0FF0" $"0FF0 0FF0 0FF0 0FF0 0FF0 07E0 03C0 0180", {9, 7} }; resource 'CURS' (134, locked, preload) { $"0000 03C0 02C0 03C0 0180 0180 0240 03C0" $"0240 03E0 0260 03C0 0240 03C0 0180", $"03C0 07E0 07E0 07E0 03C0 03C0 07E0 07E0" $"07E0 07F0 07F0 07E0 07E0 07E0 03C0 0180", {9, 7} }; resource 'CURS' (132, locked, preload) { $"0000 03C0 02C0 03C0 0180 0380 0F90 0C10" $"1998 1998 1998 1998 0990 0C10 03C0", $"03C0 07E0 07E0 07E0 03C0 0FF0 1FF8 1FF8" $"3FFC 3FFC 3FFC 3FFC 1FF8 1FF8 0FF0 03C0", {9, 7} }; resource 'CURS' (131, locked, preload) { $"0000 03C0 0340 03C0 0180 0180 03C0 0520" $"06A0 04A0 06A0 04A0 06A0 0340 0180", $"03C0 07E0 07E0 07E0 03C0 03C0 07E0 0FF0" $"0FF0 0FF0 0FF0 0FF0 0FF0 07E0 03C0 0180", {9, 7} }; resource 'ICN#' (128) { { /* array: 2 elements */ /* [1] */ $"0000 0000 001F 0000 007F C000 207F C000" $"383F B000 143F 7000 1238 F800 0937 7800" $"04FF 7800 027F B800 013F F800 619F F800" $"FFCC 30E0 FFE4 0130 EEF2 0290 E9F9 0550" $"F7E5 8AA0 EFE3 D540 4EE1 2280 01E0 C900" $"0FF0 8200 0FF1 2400 07C2 8A00 0005 5900" $"000A A480 0015 4240 0012 8160 0019 00D0" $"000E 0050 0000 0030", /* [2] */ $"0FFF 0000 3FFF C000 7FFF F000 7FFF F800" $"FFFF FC00 FFFF FE00 FFFF FF00 FFFF FF80" $"FFFF FFC0 FFFF FFE0 FFFF FFF0 FFFF FFF8" $"FFFF FFFC FFFF FFFC FFFF FFFE FFFF FFFE" $"FFFF FFFF 7FFF FFFF 7FFF FFFF 3FFF FFFF" $"3FFF FFFF 1FFF FFFF 0FFF FFFF 07FF FFFF" $"03FF FFFF 01FF FFFF 00FF FFFF 007F FFFF" $"003F FFFE 001F FFFE 0007 FFFC 0001 FFF0" } }; resource 'ics#' (128) { { /* array: 2 elements */ /* [1] */ $"0680 0EC0 66E0 3760 1FC0 4FCC FE12 FF2A" $"E9D4 EC88 2910 32B0 0558 048C 0304", /* [2] */ $"1FC0 7FF0 7FF8 FFFC FFFE FFFE FFFF FFFF" $"FFFF FFFF 7FFF 7FFF 3FFF 1FFE 0FFE 03F8" } }; resource 'BNDL' (128) { 'slRc', 0, { /* array TypeArray: 2 elements */ /* [1] */ 'FREF', { /* array IDArray: 1 elements */ /* [1] */ 0, 128 }, /* [2] */ 'ICN#', { /* array IDArray: 1 elements */ /* [1] */ 0, 128 } } }; resource 'FREF' (128) { 'APPL', 0, "" }; resource 'icl4' (128) { $"0000 0000 0000 0000 0000 0000 0000 0000" $"0000 0000 00FF FFFF 0000 0000 0000 0000" $"0000 0000 0F11 1111 FF00 0000 0000 0000" $"00F0 0000 0F11 1111 1F00 0000 0000 0000" $"00FF F000 00F1 1111 1FFF 0000 0000 0000" $"000F DF00 00F1 1111 F11F 0000 0000 0000" $"000F DDF0 00F1 1FFF 1111 F000 0000 0000" $"0000 FDDF 00F1 F111 F111 F000 0000 0000" $"0000 0FDD FF11 1111 F111 F000 0000 0000" $"0000 00FD DF11 1111 1F11 F000 0000 0000" $"0000 000F DDF1 1111 1111 F000 0000 0000" $"0FF0 000F FDDF 11FF FF11 F000 0000 0000" $"F11F FFF1 1FDD FF00 00FF 0000 FFF0 0000" $"F111 1111 11FD DF00 0000 000F 44FF 0000" $"F11F 111F 111F DDF0 0000 00F4 F44F 0000" $"F11F 1FF1 11FF FDDF 0000 0F4F 4F4F 0000" $"F111 F111 11F0 0FD0 F000 F4F4 F4F0 0000" $"F11F 1111 11F0 00F0 0F0F 4F4F 4F00 0000" $"0FFF 111F 11F0 000F DDF4 44F4 F000 0000" $"000F FFF1 11F0 0000 FF44 F44F 0000 0000" $"000F 1111 111F 0000 F444 44F0 0000 0000" $"000F F111 111F 000F 44F4 4F00 0000 0000" $"0000 0FFF FFF0 00F4 F444 FDF0 0000 0000" $"0000 0000 0000 0F4F 4F4F FDDF 0000 0000" $"0000 0000 0000 F4F4 F4F0 0FDD F000 0000" $"0000 0000 000F 4F4F 4F00 00FD DF00 0000" $"0000 0000 000F 44F4 F000 000F D0F0 0000" $"0000 0000 000F F44F 0000 0000 F0DF 0000" $"0000 0000 0000 FFF0 0000 0000 0FDF 0000" $"0000 0000 0000 0000 0000 0000 00FF" }; resource 'ics4' (128) { $"0000 0FFF F000 0000 0000 F11F 1F00 0000" $"0DD0 0F1F 11F0 0000 00DD 0F11 F1F0 0000" $"000D DF11 1F00 0000 0F00 DDFF FF00 FF00" $"F1FF FDD0 000F 44F0 F111 1FDD 00F4 F4F0" $"F11F 1F0D DF4F 4F00 FFFF 1F00 F444 F000" $"0000 F00F 444F 0000 0000 00F4 F4FD 0000" $"0000 0F4F 4F0D D000 0000 0F44 F000 DD00" $"0000 00FF 0000 0D" }; resource 'SICN' (128) { { /* array: 1 elements */ /* [1] */ $"0680 0EC0 66E0 3760 1FC0 4FCC FE12 FF2A" $"E9D4 EC88 2910 32B0 0558 048C 0304" } }; data 'memB' (128, locked, preload) { $"0000 0004 0000 8000 0000 3000 0000 1000" /* ......€...0..... */ $"0000 4000" /* ..@. */ }; data 'TMPL' (128, "memB") { $"0450 7269 7646 5752 4407 436C 6561 6E75" /* .PrivFWRD.Cleanu */ $"7044 5752 4407 5072 6565 6D70 7444 4C4E" /* pDWRD.PreemptDLN */ $"4707 5761 726E 696E 6744 4C4E 4705 4162" /* G.WarningDLNG.Ab */ $"6F72 7444 4C4E 4706 494F 2042 7566 444C" /* ortDLNG.IO BufDL */ $"4E47" /* NG */ }; data 'DLOG' (256) { $"0028 0028 0040 0140 0004 0000 0000 0000" /* .(.(.@.@........ */ $"0000 0100 0850 726F 6772 6573 73" /* .....Progress */ }; slashem-0.0.7E7F3/sys/mac/maccurs.c0000664000076400007640000001020010545462317015024 0ustar aliali/* SCCS Id: @(#)maccurs.c 3.1 93/01/24 */ /* Copyright (c) Jon W{tte, 1992. */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" #include "mactty.h" #include "macwin.h" #if !TARGET_API_MAC_CARBON #include #include #include #endif static Boolean winFileInit = 0; static unsigned char winFileName [32] = "\pSlash'EM Preferences"; static long winFileDir; static short winFileVol; typedef struct WinPosSave { char validPos; char validSize; short top; short left; short height; short width; } WinPosSave; static WinPosSave savePos [kLastWindowKind + 1]; static void InitWinFile (void) { StringHandle sh; long len; short ref = 0; if (winFileInit) { return; } /* We trust the glue. If there's an error, store in game dir. */ if (FindFolder (kOnSystemDisk, kPreferencesFolderType, kCreateFolder , &winFileVol, &winFileDir)) { winFileVol = 0; winFileDir = 0; } sh = GetString (128); if (sh && *sh) { BlockMove (*sh, winFileName, **sh + 1); ReleaseResource ((Handle) sh); } if (HOpen (winFileVol, winFileDir, winFileName, fsRdPerm, &ref)) { return; } len = sizeof (savePos); if (!FSRead (ref, &len, savePos)) { winFileInit = 1; } FSClose (ref); } static void FlushWinFile (void) { short ref; long len; if (!winFileInit) { if (!winFileName [0]) { return; } HCreate (winFileVol, winFileDir, winFileName, MAC_CREATOR, PREF_TYPE); HCreateResFile (winFileVol, winFileDir, winFileName); } if (HOpen (winFileVol, winFileDir, winFileName, fsWrPerm, &ref)) { return; } winFileInit = 1; len = sizeof (savePos); (void) FSWrite (ref, &len, savePos); /* Don't care about error */ FSClose (ref); } Boolean RetrievePosition (short kind, short *top, short *left) { Point p; if (kind < 0 || kind > kLastWindowKind) { dprintf ("Retrieve Bad kind %d", kind); return 0; } InitWinFile (); if (!savePos [kind].validPos) { dprintf ("Retrieve Not stored kind %d", kind); return 0; } p.v = savePos [kind].top; p.h = savePos [kind].left; *left = p.h; *top = p.v; dprintf ("Retrieve Kind %d Pt (%d,%d)", kind, p.h, p.v); return (PtInRgn (p, GetGrayRgn ())); } Boolean RetrieveSize (short kind, short top, short left, short *height, short *width) { Point p; if (kind < 0 || kind > kLastWindowKind) { return 0; } InitWinFile (); if (!savePos [kind].validSize) { return 0; } *width = savePos [kind].width; *height = savePos [kind].height; p.h = left + *width; p.v = top + *height; return PtInRgn (p, GetGrayRgn ()); } static void SavePosition (short kind, short top, short left) { if (kind < 0 || kind > kLastWindowKind) { dprintf ("Save bad kind %d", kind); return; } InitWinFile(); savePos[kind].validPos = 1; savePos[kind].top = top; savePos[kind].left = left; dprintf("Save kind %d pt (%d,%d)", kind, left, top); FlushWinFile(); } static void SaveSize (short kind, short height, short width) { if (kind < 0 || kind > kLastWindowKind) { dprintf ("Save bad kind %d", kind); return; } InitWinFile (); savePos [kind].validSize = 1; savePos [kind].width = width; savePos [kind].height = height; FlushWinFile (); } static short GetWinKind (WindowPtr win) { short kind; if (!CheckNhWin (win)) { return -1; } kind = GetWindowKind(win) - WIN_BASE_KIND; if (kind < 0 || kind > NHW_TEXT) { return -1; } dprintf ("In win kind %d (%lx)", kind, win); switch (kind) { case NHW_MAP : case NHW_STATUS : case NHW_BASE : kind = kMapWindow; break; case NHW_MESSAGE : kind = kMessageWindow; break; case NHW_MENU : kind = kMenuWindow; break; default : kind = kTextWindow; break; } dprintf ("Out kind %d", kind); return kind; } Boolean RetrieveWinPos(WindowPtr win, short *top, short *left) { return RetrievePosition(GetWinKind (win), top, left); } void SaveWindowPos(WindowPtr win) { Rect r; GetWindowBounds(win, kWindowContentRgn, &r); SavePosition(GetWinKind(win), r.top, r.left); } void SaveWindowSize(WindowPtr win) { short width, height; Rect r; GetWindowBounds(win, kWindowContentRgn, &r); width = r.right - r.left; height = r.bottom - r.top; SaveSize(GetWinKind (win), height, width); } slashem-0.0.7E7F3/sys/mac/Files.r0000664000076400007640000000432310545462317014461 0ustar aliali#include "MacTypes.r" #include "BalloonTypes.r" #include "date.h" #include "patchlevel.h" #ifdef TGT_API_MAC_CARBON resource 'plst' (0, purgeable) { }; #endif type 'sLem' as 'STR '; resource 'sLem' (0, purgeable) { "Slash'EM " VERSION_STRING " Copyright © Stichting Mathematisch Centrum, Amsterdam, 1985Ð2003" }; resource 'vers' (1, purgeable) { VERSION_MAJOR, (VERSION_MINOR<<4) | PATCHLEVEL, beta, EDITLEVEL, verUS, VERSION_STRING, "Slash'EM " VERSION_STRING }; resource 'vers' (2, purgeable) { VERSION_MAJOR, (VERSION_MINOR<<4) | PATCHLEVEL, beta, EDITLEVEL, verUS, VERSION_STRING, "for Slash'EM " VERSION_STRING " (www.slashem.org)" }; resource 'SIZE' (-1) { reserved, acceptSuspendResumeEvents, reserved, canBackground, doesActivateOnFGSwitch, backgroundAndForeground, dontGetFrontClicks, ignoreAppDiedEvents, is32BitCompatible, notHighLevelEventAware, onlyLocalHLEvents, notStationeryAware, dontUseTextEditServices, reserved, reserved, reserved, 3000 * 1024, /* recommended */ 2000 * 1024 /* absolute minimum, to be determined */ }; /* Classic help balloon information */ resource 'hfdr' (-5696, purgeable) { HelpMgrVersion, hmDefaultOptions, 0, 0, /* header information */ { HMSTRResItem { /* use 'STR ' resource 2000 */ 2000 } } }; resource 'STR ' (2000, purgeable) { /* Help message for app icon */ "Slash'EM\nThis is the famous Dungeons and Dragons*-like game ported to the Macintosh." }; resource 'STR '(-16396, purgeable) { /* Will be copied to the saved file. */ "Slash'EM" /* See Inside Mac VI, page 9-21. */ }; read 'File' (1000,"cmdhelp") ":dat:cmdhelp"; read 'File' (1001,"help") ":dat:help"; read 'File' (1002,"hh") ":dat:hh"; read 'File' (1003,"history") ":dat:history"; read 'File' (1004,"license") ":dat:license"; read 'File' (1005,"MacHelp") ":sys:mac:MacHelp"; read 'File' (1006,"News") ":sys:mac:News"; read 'File' (1007,"opthelp") ":dat:opthelp"; read 'File' (1008,"wizhelp") ":dat:wizhelp"; read 'File' (1019,"data") "::lib:data"; read 'File' (1020,"dungeon") "::lib:dungeon"; read 'File' (1041,"options") "::lib:options"; read 'File' (1043,"oracles") "::lib:oracles"; read 'File' (1045,"quest.dat") "::lib:quest.dat"; read 'File' (1046,"rumors") "::lib:rumors"; slashem-0.0.7E7F3/sys/mac/macwin.c0000664000076400007640000017656610545462317014701 0ustar aliali/* 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. */ #include "hack.h" #include "func_tab.h" #include "macwin.h" #include "mactty.h" #include "wintty.h" #if !TARGET_API_MAC_CARBON #include #include #include #include #include #include #ifdef MAC_MPW # include #endif #endif NhWindow *theWindows = (NhWindow *) 0; Cursor qdarrow; #ifdef MAC_MPW #define qdarrow qd.arrow #define USESROUTINEDESCRIPTORS #endif /* Macintosh Programmer's Workshop */ /* Borrowed from the Mac tty port */ extern WindowPtr _mt_window; /* Some useful #defines for the scroll bar width and height */ #define SBARWIDTH 15 #define SBARHEIGHT 15 /* * We put a TE on the message window for the "top line" queries. * top_line is the TE that holds both the query and the user's * response. The first topl_query_len characters in top_line are * the query, the rests are the response. topl_resp is the valid * response to a yn query, while topl_resp[topl_def_idx] is the * default response to a yn query. */ static TEHandle top_line = (TEHandle) nil; static int topl_query_len; static int topl_def_idx = -1; static char topl_resp[10] = ""; #define CHAR_ANY '\n' /* * inSelect means we have a menu window up for selection or * something similar. It makes the window with win number == * inSelect a movable modal (unfortunately without the border) * and clicking the close box forces an RET into the key * buffer. Don't forget to set inSelect to WIN_ERR when you're * done... */ static winid inSelect = WIN_ERR; /* * The key queue ring buffer where Read is where to take from, * Write is where next char goes and count is queue depth. */ static unsigned char keyQueue [QUEUE_LEN]; static int keyQueueRead = 0, keyQueueWrite = 0, keyQueueCount = 0; static Boolean gClickedToMove = 0; /* For ObscureCursor */ static Point clicked_pos; /* For nh_poskey */ static int clicked_mod; static Boolean cursor_locked = false; static ControlActionUPP MoveScrollUPP; /* scrolling callback, init'ed in InitMac */ void lock_mouse_cursor(Boolean new_cursor_locked) { cursor_locked = new_cursor_locked; } /* * Add key to input queue, force means flush left and replace if full */ void AddToKeyQueue (unsigned char ch, Boolean force) { if (keyQueueCount < QUEUE_LEN) { keyQueue [keyQueueWrite++] = ch; keyQueueCount++; } else if (force) { keyQueue [keyQueueWrite++] = ch; keyQueueRead++; if (keyQueueRead >= QUEUE_LEN) keyQueueRead = 0; keyQueueCount = QUEUE_LEN; } if (keyQueueWrite >= QUEUE_LEN) keyQueueWrite = 0; } /* * Get key from queue */ unsigned char GetFromKeyQueue (void) { unsigned char ret; if (keyQueueCount) { ret = keyQueue [keyQueueRead++]; keyQueueCount--; if (keyQueueRead >= QUEUE_LEN) keyQueueRead = 0; } else ret = 0; return ret; } /* * Cursor movement */ static RgnHandle gMouseRgn = (RgnHandle) 0; /* * _Gestalt madness - we rely heavily on the _Gestalt glue, since we * don't check for the trap... */ MacFlags macFlags; /* * The screen layouts on the small 512x342 screen need special cares. */ Boolean small_screen = 0; #ifdef NHW_BASE # undef NHW_BASE #endif #define NHW_BASE 0 static int FDECL(filter_scroll_key,(const int, NhWindow *)); static void FDECL(GeneralKey, (EventRecord *, WindowPtr)); static void FDECL(macKeyMenu, (EventRecord *, WindowPtr)); static void FDECL(macKeyText, (EventRecord *, WindowPtr)); static void FDECL(macClickMessage, (EventRecord *, WindowPtr)); static void FDECL(macClickTerm, (EventRecord *, WindowPtr)); static void FDECL(macClickMenu, (EventRecord *, WindowPtr)); static void FDECL(macClickText, (EventRecord *, WindowPtr)); static short FDECL(macDoNull, (EventRecord *, WindowPtr)); static short FDECL(macUpdateMessage, (EventRecord *, WindowPtr)); static short FDECL(macUpdateMenu, (EventRecord *, WindowPtr)); static short FDECL(GeneralUpdate, (EventRecord *, WindowPtr)); static void FDECL(macCursorTerm, (EventRecord *, WindowPtr, RgnHandle)); static void FDECL(GeneralCursor, (EventRecord *, WindowPtr, RgnHandle)); static void FDECL(DoScrollBar,(Point, short, ControlHandle, NhWindow *)); static pascal void FDECL(MoveScrollBar, (ControlHandle, short)); typedef void (*CbFunc) (EventRecord *, WindowPtr); typedef short (*CbUpFunc) (EventRecord *, WindowPtr); typedef void (*CbCursFunc) (EventRecord *, WindowPtr, RgnHandle); #define NUM_FUNCS 6 static const CbFunc winKeyFuncs [NUM_FUNCS] = { GeneralKey, GeneralKey, GeneralKey, GeneralKey, macKeyMenu, macKeyText }; static const CbFunc winClickFuncs [NUM_FUNCS] = { (CbFunc)macDoNull, macClickMessage, macClickTerm, macClickTerm, macClickMenu, macClickText }; static const CbUpFunc winUpdateFuncs [NUM_FUNCS] = { macDoNull, macUpdateMessage, image_tty, image_tty, macUpdateMenu, GeneralUpdate }; static const CbCursFunc winCursorFuncs [NUM_FUNCS] = { (CbCursFunc) macDoNull, GeneralCursor, macCursorTerm, macCursorTerm, GeneralCursor, GeneralCursor }; static NhWindow * GetNhWin(WindowPtr mac_win) { if (mac_win == _mt_window) /* term window is still maintained by both systems, and */ return theWindows; /* WRefCon still refers to tty struct, so we have to map it */ else { NhWindow *aWin = (NhWindow *)GetWRefCon (mac_win); if (aWin >= theWindows && aWin < &theWindows[NUM_MACWINDOWS]) return aWin; } return ((NhWindow *) nil); } Boolean CheckNhWin (WindowPtr mac_win) { return GetNhWin (mac_win) != nil; } static pascal OSErr AppleEventHandler (const AppleEvent* inAppleEvent, AppleEvent* outAEReply, long inRefCon) { #if defined(__SC__) || defined(__MRC__) # pragma unused(outAEReply,inRefCon) #endif Size actualSize; DescType typeCode; AEEventID EventID; OSErr err; /* Get Event ID */ err = AEGetAttributePtr (inAppleEvent, keyEventIDAttr, typeType, &typeCode, &EventID, sizeof (EventID), &actualSize); if (err == noErr) { switch (EventID) { default : case kAEOpenApplication : macFlags.gotOpen = 1; /* fall through */ case kAEPrintDocuments : err = errAEEventNotHandled; break; case kAEQuitApplication : /* Flush key queue */ keyQueueCount = keyQueueWrite = keyQueueRead = 0; AddToKeyQueue ('S', 1); break; case kAEOpenDocuments : { FSSpec fss; FInfo fndrInfo; AEKeyword keywd; AEDescList docList; long index, itemsInList; if((err = AEGetParamDesc(inAppleEvent, keyDirectObject, typeAEList, &docList)) != noErr || (err = AECountItems(&docList, &itemsInList)) != noErr){ if (err == errAEDescNotFound) itemsInList = 0; else break; } for(index = 1; index <= itemsInList; index++){ err = AEGetNthPtr(&docList, index, typeFSS, &keywd, &typeCode, (Ptr)&fss, sizeof(FSSpec), &actualSize); if(noErr != err) break; err = FSpGetFInfo (&fss, &fndrInfo); if (noErr != err) break; if (fndrInfo.fdType != SAVE_TYPE) continue; /* only look at save files */ process_openfile (fss.vRefNum, fss.parID, fss.name, fndrInfo.fdType); if (macFlags.gotOpen) break; /* got our save file */ } err = AEDisposeDesc(&docList); break; } } } /* Check to see if all required parameters for this type of event are present */ if (err == noErr) { err = AEGetAttributePtr (inAppleEvent, keyMissedKeywordAttr, typeWildCard, &typeCode, NULL, 0, &actualSize); if (err == errAEDescNotFound) err = noErr; /* got all the required parameters */ else if (err == noErr) /* missed a required parameter */ err = errAEEventNotHandled; } return err; } short win_fonts [NHW_TEXT + 1]; void InitMac(void) { short i; long l; Str255 volName; #if !TARGET_API_MAC_CARBON if (LMGetDefltStack() < 50 * 1024L) { SetApplLimit ((void *) ((long) LMGetCurStackBase() - (50 * 1024L))); } MaxApplZone (); for (i = 0; i < 5; i ++) MoreMasters (); InitGraf (&qd.thePort); InitFonts (); InitWindows (); InitMenus (); InitDialogs (0L); TEInit (); #endif memset (&macFlags, 0, sizeof(macFlags)); if (!Gestalt (gestaltOSAttr, & l)) { macFlags.processes = (l & (1 << gestaltLaunchControl)) ? 1 : 0; macFlags.tempMem = (l & (1 << gestaltRealTempMemory)) ? 1 : 0; macFlags.hasDebugger = (l & (1 << gestaltSysDebuggerSupport)) ? 1 : 0; } if (!Gestalt (gestaltQuickdrawVersion, & l)) macFlags.color = (l >= gestalt8BitQD) ? 1 : 0; if (!Gestalt (gestaltFindFolderAttr, & l)) macFlags.folders = (l & (1 << gestaltFindFolderPresent)) ? 1 : 0; if (!Gestalt (gestaltHelpMgrAttr, & l)) macFlags.help = (l & (1 << gestaltHelpMgrPresent)) ? 1 : 0; if (!Gestalt (gestaltFSAttr, & l)) macFlags.fsSpec = (l & (1 << gestaltHasFSSpecCalls)) ? 1 : 0; if (!Gestalt (gestaltFontMgrAttr, & l)) macFlags.trueType = (l & (1 << gestaltOutlineFonts)) ? 1 : 0; if (!Gestalt (gestaltAUXVersion, & l)) macFlags.aux = (l >= 0x200) ? 1 : 0; if (!Gestalt (gestaltAliasMgrAttr, & l)) macFlags.alias = (l & (1 << gestaltAliasMgrPresent)) ? 1 : 0; if (!Gestalt (gestaltStandardFileAttr, & l)) macFlags.standardFile = (l & (1 << gestaltStandardFile58)) ? 1 : 0; gMouseRgn = NewRgn (); InitCursor(); #if TARGET_API_MAC_CARBON GetQDGlobalsArrow(&qdarrow); #endif ObscureCursor (); MoveScrollUPP = NewControlActionUPP(MoveScrollBar); /* Set up base fonts for all window types */ GetFNum ("\pHackFont", &i); if (i == 0) i = kFontIDMonaco; win_fonts [NHW_BASE] = win_fonts [NHW_MAP] = win_fonts [NHW_STATUS] = i; GetFNum ("\pPSHackFont", &i); if (i == 0) i = kFontIDGeneva; win_fonts [NHW_MESSAGE] = i; win_fonts [NHW_TEXT] = kFontIDGeneva; macFlags.hasAE = 0; if(!Gestalt(gestaltAppleEventsAttr, &l) && (l & (1L << gestaltAppleEventsPresent))){ if (AEInstallEventHandler (kCoreEventClass, typeWildCard, NewAEEventHandlerUPP(AppleEventHandler), 0, FALSE) == noErr) macFlags.hasAE = 1; } #if TARGET_API_MAC_CARBON HGetVol(volName, &theDirs.dataRefNum, &theDirs.dataDirID); #else /* * We should try to get this data from a rsrc, in the profile file * the user double-clicked... This data should be saved with the * save file in the resource fork, AND be saveable in "stationary" */ GetVol (volName, &theDirs.dataRefNum ); GetWDInfo (theDirs.dataRefNum, &theDirs.dataRefNum, &theDirs.dataDirID, &l); #endif if (volName [0] > 31) volName [0] = 31; for (l = 1; l <= volName [0]; l++) { if (volName [l] == ':') { volName [l] = 0; volName [0] = l - 1; break; } } BlockMove (volName, theDirs.dataName, l); BlockMove (volName, theDirs.saveName, l); BlockMove (volName, theDirs.levelName, l); theDirs.saveRefNum = theDirs.levelRefNum = theDirs.dataRefNum; theDirs.saveDirID = theDirs.levelDirID = theDirs.dataDirID; /* Create the "record" file, if necessary */ check_recordfile(""); return; } /* * Change default window fonts. */ short set_tty_font_name (int window_type, char *font_name) { short fnum; Str255 new_font; if (window_type < NHW_BASE || window_type > NHW_TEXT) return general_failure; C2P (font_name, new_font); GetFNum (new_font, &(fnum)); if (!fnum) return general_failure; win_fonts [window_type] = fnum; return noErr; } static void DrawScrollbar (NhWindow *aWin) { WindowPtr theWindow = aWin->its_window; Rect crect, wrect; Boolean vis; short val, lin, win_height; if (!aWin->scrollBar) return; #if !TGT_API_MAC_CARBON crect = (*aWin->scrollBar)->contrlRect; #else GetControlBounds(aWin->scrollBar, &crect); #endif GetWindowBounds(aWin->its_window, kWindowContentRgn, &wrect); OffsetRect(&wrect, -wrect.left, -wrect.top); win_height = wrect.bottom - wrect.top; if (crect.top != wrect.top - 1 || crect.left != wrect.right - SBARWIDTH) { MoveControl (aWin->scrollBar, wrect.right - SBARWIDTH, wrect.top - 1); } if (crect.bottom != wrect.bottom - SBARHEIGHT || crect.right != wrect.right + 1) { SizeControl (aWin->scrollBar, SBARWIDTH+1, win_height - SBARHEIGHT + 2); } vis = (win_height > (50 + SBARHEIGHT)); if (vis != IsControlVisible(aWin->scrollBar)) { /* current status != control */ if (vis)/* if visible, show */ ShowControl (aWin->scrollBar); else /* else hide */ HideControl (aWin->scrollBar); } lin = aWin->y_size; if (aWin == theWindows + WIN_MESSAGE) { /* calculate how big scroll bar is for message window */ lin -= (win_height - SBARHEIGHT) / aWin->row_height; if (lin < 0) lin = 0; val = 0; /* always have message scrollbar active */ } else { /* calculate how big scroll bar is for other windows */ lin -= win_height / aWin->row_height; if (lin < 0) lin = 0; if (lin) val = 0; /* if there are 1+ screen lines, activate scrollbar */ else val = 255; /* else grey it out */ } SetControlMaximum (aWin->scrollBar, lin); HiliteControl (aWin->scrollBar, val); val = GetControlValue (aWin->scrollBar); if (val != aWin->scrollPos) { InvalWindowRect(theWindow, &wrect); aWin->scrollPos = val; } } #define MAX_HEIGHT 100 #define MIN_HEIGHT 50 #define MIN_WIDTH 300 /* * This function could be overloaded with any amount of intelligence... */ int SanePositions (void) { #if TARGET_API_MAC_CARBON ConstrainWindowToScreen(_mt_window, kWindowStructureRgn, kWindowConstrainMoveRegardlessOfFit, NULL, NULL); #else short left, top, width, height; int ix, numText = 0, numMenu = 0; int mbar_height = GetMBarHeight (); Rect screenArea = qd.screenBits.bounds; WindowPtr theWindow; NhWindow *nhWin; OffsetRect (&screenArea, - screenArea.left, - screenArea.top); /* Map Window */ height = _mt_window->portRect.bottom - _mt_window->portRect.top; width = _mt_window->portRect.right - _mt_window->portRect.left; if (!RetrievePosition (kMapWindow, &top, &left)) { top = mbar_height + (small_screen ? 2 : 20); left = (screenArea.right - width) / 2; } MoveWindow (_mt_window, left, top, 1); /* Message Window */ if (!RetrievePosition (kMessageWindow, &top, &left)) { top += height; if (!small_screen) top += 20; } if (!RetrieveSize (kMessageWindow, top, left, &height, &width)) { height = screenArea.bottom - top - (small_screen ? 2-SBARHEIGHT : 2); if (height > MAX_HEIGHT) { height = MAX_HEIGHT; } else if (height < MIN_HEIGHT) { height = MIN_HEIGHT; width = MIN_WIDTH; left = screenArea.right - width; top = screenArea.bottom - MIN_HEIGHT; } } /* Move these windows */ nhWin = theWindows + WIN_MESSAGE; theWindow = nhWin->its_window; MoveWindow (theWindow, left, top, 1); SizeWindow (theWindow, width, height, 1); if (nhWin->scrollBar) DrawScrollbar (nhWin); /* Handle other windows */ for (ix = 0; ix < NUM_MACWINDOWS; ix ++) { if (ix != WIN_STATUS && ix != WIN_MESSAGE && ix != WIN_MAP && ix != BASE_WINDOW) { theWindow = theWindows [ix].its_window; if (theWindow && ((WindowPeek) theWindow)->visible) { int shift; if (((WindowPeek)theWindow)->windowKind == WIN_BASE_KIND + NHW_MENU) { if (!RetrievePosition (kMenuWindow, &top, &left)) { top = mbar_height * 2; left = 2; } top += (numMenu * mbar_height); numMenu++; shift = 20; } else { if (!RetrievePosition (kTextWindow, &top, &left)) { top = mbar_height * 2; left = screenArea.right - 3 - (theWindow->portRect.right - theWindow->portRect.left); } top += (numText * mbar_height); numText++; shift = -20; } while (top > screenArea.bottom - MIN_HEIGHT) { top -= screenArea.bottom - mbar_height * 2; left += shift; } MoveWindow (theWindow, left, top, 1); } } } #endif return (0); } winid mac_create_nhwindow (int kind) { int i; NhWindow *aWin; FontInfo fi; if (kind < NHW_BASE || kind > NHW_TEXT) { error ("cre_win: Invalid kind %d.", kind); return WIN_ERR; } for (i = 0; i < NUM_MACWINDOWS; i ++) { if (!theWindows [i].its_window) break; } if (i >= NUM_MACWINDOWS) { error ("cre_win: Win full; freeing extras"); for (i = 0; i < NUM_MACWINDOWS; i ++) { if (IsWindowVisible(theWindows [i].its_window) || i == WIN_INVEN || GetWindowKind(theWindows [i].its_window) != WIN_BASE_KIND + NHW_MENU && GetWindowKind(theWindows [i].its_window) != WIN_BASE_KIND + NHW_TEXT) continue; mac_destroy_nhwindow(i); goto got1; } error ("cre_win: Out of ids!"); return WIN_ERR; } got1 : aWin = &theWindows [i]; aWin->windowTextLen = 0L; aWin->scrollBar = (ControlHandle) 0; aWin->menuInfo = 0; aWin->menuSelected = 0; aWin->miLen = 0; aWin->miSize = 0; aWin->menuChar = 'a'; dprintf ("cre_win: New kind %d", kind); if (kind == NHW_BASE || kind == NHW_MAP || kind == NHW_STATUS) { short x_sz, x_sz_p, y_sz, y_sz_p; if (kind != NHW_BASE) { if (i != tty_create_nhwindow(kind)) { dprintf ("cre_win: error creating kind %d", kind); } if (kind == NHW_MAP) { wins[i]->offy = 0; /* the message box is in a separate window */ } } aWin->its_window = _mt_window; get_tty_metrics(aWin->its_window, &x_sz, &y_sz, &x_sz_p, &y_sz_p, &aWin->font_number, &aWin->font_size, &aWin->char_width, &aWin->row_height); return i; } aWin->its_window = GetNewWindow (WIN_BASE_RES + kind, (WindowPtr) 0L, (WindowPtr) -1L); SetWindowKind(aWin->its_window, WIN_BASE_KIND + kind); SetWRefCon(aWin->its_window, (long) aWin); if (!(aWin->windowText = NewHandle (TEXT_BLOCK))) { error ("cre_win: NewHandle fail(%ld)", (long) TEXT_BLOCK); DisposeWindow (aWin->its_window); aWin->its_window = (WindowPtr) 0; return WIN_ERR; } aWin->x_size = aWin->y_size = 0; aWin->x_curs = aWin->y_curs = 0; aWin->drawn = TRUE; mac_clear_nhwindow (i); SetPortWindowPort(aWin->its_window); if (kind == NHW_MESSAGE) { aWin->font_number = win_fonts [NHW_MESSAGE]; aWin->font_size = iflags.wc_fontsiz_message? iflags.wc_fontsiz_message : iflags.large_font ? 12 : 9; if (!top_line) { const Rect out_of_scr = {10000, 10000, 10100, 10100}; TextFont(aWin->font_number); TextSize(aWin->font_size); TextFace(bold); top_line = TENew(&out_of_scr, &out_of_scr); TEActivate(top_line); TextFace(normal); } } else { aWin->font_number = win_fonts [NHW_TEXT]; aWin->font_size = iflags.wc_fontsiz_text ? iflags.wc_fontsiz_text : 9; } TextFont (aWin->font_number); TextSize (aWin->font_size); GetFontInfo (&fi); aWin->ascent_height = fi.ascent + fi.leading; aWin->row_height = aWin->ascent_height + fi.descent; aWin->char_width = fi.widMax; if (kind == NHW_MENU || kind == NHW_TEXT || kind == NHW_MESSAGE) { Rect r; GetWindowBounds(aWin->its_window, kWindowContentRgn, &r); r.right -= (r.left - 1); r.left = r.right - SBARWIDTH; r.bottom -= (r.top + SBARHEIGHT); r.top = -1; aWin->scrollBar = NewControl (aWin->its_window, &r, "\p", (r.bottom > r.top + 50), 0, 0, 0, 16, 0L); aWin->scrollPos = 0; } return i; } void mac_init_nhwindows (int *argcp, char **argv) { Rect r; #if !TARGET_API_MAC_CARBON Rect scr = (*GetGrayRgn())->rgnBBox; small_screen = scr.bottom - scr.top <= (iflags.large_font ? 12*40 : 9*40); #endif InitMenuRes (); theWindows = (NhWindow *) NewPtrClear (NUM_MACWINDOWS * sizeof (NhWindow)); if (MemError()) error("mac_init_nhwindows: Couldn't allocate memory for windows."); DimMenuBar (); tty_init_nhwindows(argcp, argv); iflags.window_inited = TRUE; /* Some ugly hacks to make both interfaces happy: * Mac port uses both tty interface (for main map) and extra windows. The winids need to * be kept in synch for both interfaces to map. Also, the "blocked" display_nhwindow case * for the map automatically calls the tty interface for the message box, so some version * of the message box has to exist in the tty world to prevent a meltdown, even though most * messages are handled in mac window. */ mac_create_nhwindow(NHW_BASE); tty_create_nhwindow(NHW_MESSAGE); RetrievePosition(kMessageWindow, &r.top, &r.left); RetrieveSize(kMessageWindow, r.top, r.left, &r.bottom, &r.right); MoveWindow(theWindows[NHW_MESSAGE].its_window, r.left, r.top, false); SizeWindow(theWindows[NHW_MESSAGE].its_window, r.right, r.bottom, true); #if TARGET_API_MAC_CARBON ConstrainWindowToScreen(theWindows[NHW_MESSAGE].its_window, kWindowStructureRgn, kWindowConstrainMoveRegardlessOfFit, NULL, NULL); #endif return; } void mac_clear_nhwindow (winid win) { long l; Rect r; NhWindow *aWin = &theWindows [win]; WindowPtr theWindow = aWin->its_window; if (win < 0 || win >= NUM_MACWINDOWS || !theWindow) { error ("clr_win: Invalid win %d.", win); return; } if (theWindow == _mt_window) { tty_clear_nhwindow(win); return; } if (!aWin->drawn) return; SetPortWindowPort(theWindow); GetWindowBounds(theWindow, kWindowContentRgn, &r); OffsetRect(&r, -r.left, -r.top); if (aWin->scrollBar) r.right -= SBARWIDTH; switch (GetWindowKind(theWindow) - WIN_BASE_KIND) { case NHW_MESSAGE : if (aWin->scrollPos == aWin->y_size - 1) /* if no change since last clear */ return; /* don't bother with redraw */ r.bottom -= SBARHEIGHT; for (l = 0; aWin->y_size > iflags.msg_history;) { const char cr = CHAR_CR; l = Munger(aWin->windowText, l, &cr, 1, nil, 0) + 1; --aWin->y_size; } if (l) { aWin->windowTextLen -= l; BlockMove(*aWin->windowText + l, *aWin->windowText, aWin->windowTextLen); } aWin->last_more_lin = aWin->y_size; aWin->save_lin = aWin->y_size; aWin->scrollPos = aWin->y_size ? aWin->y_size - 1 : 0; break; case NHW_MENU: if (aWin->menuInfo) { DisposeHandle((Handle)aWin->menuInfo); aWin->menuInfo = NULL; } if (aWin->menuSelected) { DisposeHandle((Handle)aWin->menuSelected); aWin->menuSelected = NULL; } aWin->menuChar = 'a'; aWin->miSelLen = 0; aWin->miLen = 0; aWin->miSize = 0; /* Fall-Through */ default : SetHandleSize (aWin->windowText, TEXT_BLOCK); aWin->windowTextLen = 0L; aWin->x_size = 0; aWin->y_size = 0; aWin->scrollPos = 0; break; } if (aWin->scrollBar) { SetControlMaximum (aWin->scrollBar, aWin->y_size); SetControlValue(aWin->scrollBar, aWin->scrollPos); } aWin->y_curs = 0; aWin->x_curs = 0; aWin->drawn = FALSE; InvalWindowRect(theWindow, &r); } static Boolean ClosingWindowChar(const int c) { return c == CHAR_ESC || c == CHAR_BLANK || c == CHAR_LF || c == CHAR_CR || c == 'q'; } static Boolean in_topl_mode(void) { Rect rect; GetWindowBounds(theWindows[WIN_MESSAGE].its_window, kWindowContentRgn, &rect); OffsetRect(&rect, -rect.left, -rect.top); return (WIN_MESSAGE != WIN_ERR && top_line && (*top_line)->viewRect.left < rect.right); } #define BTN_IND 2 #define BTN_W 40 #define BTN_H (SBARHEIGHT-3) static void topl_resp_rect(int resp_idx, Rect *r) { Rect rect; GetWindowBounds(theWindows[WIN_MESSAGE].its_window, kWindowContentRgn, &rect); OffsetRect(&rect, -rect.left, -rect.top); r->left = (BTN_IND + BTN_W) * resp_idx + BTN_IND; r->right = r->left + BTN_W; r->bottom = rect.bottom - 1; r->top = r->bottom - BTN_H; return; } void enter_topl_mode(char *query) { if (in_topl_mode()) return; putstr(WIN_MESSAGE, ATR_BOLD, query); topl_query_len = strlen(query); (*top_line)->selStart = topl_query_len; (*top_line)->selEnd = topl_query_len; (*top_line)->viewRect.left = 0; PtrToXHand(query, (*top_line)->hText, topl_query_len); TECalText(top_line); DimMenuBar(); mac_display_nhwindow(WIN_MESSAGE, FALSE); } void leave_topl_mode(char *answer) { unsigned char *ap, *bp; int ans_len = (*top_line)->teLength - topl_query_len; NhWindow *aWin = theWindows + WIN_MESSAGE; if (!in_topl_mode()) return; /* Cap length of reply */ if (ans_len >= BUFSZ) ans_len = BUFSZ-1; /* remove unprintables from the answer */ for (ap = *(*top_line)->hText + topl_query_len, bp = answer; ans_len > 0; ans_len--, ap++) { if (*ap >= ' ' && *ap < 128) { *bp++ = *ap; } } *bp = 0; if (aWin->windowTextLen && (*aWin->windowText)[aWin->windowTextLen-1] == CHAR_CR) { -- aWin->windowTextLen; -- aWin->y_size; } putstr(WIN_MESSAGE, ATR_BOLD, answer); (*top_line)->viewRect.left += 10000; UndimMenuBar(); } /* * TESetSelect flushes out all the pending key strokes. I hate it. */ static void topl_set_select(short selStart, short selEnd) { TEDeactivate(top_line); (*top_line)->selStart = selStart; (*top_line)->selEnd = selEnd; TEActivate(top_line); } static void topl_replace(char *new_ans) { topl_set_select(topl_query_len, (*top_line)->teLength); TEDelete(top_line); TEInsert(new_ans, strlen(new_ans), top_line); } Boolean topl_key(unsigned char ch, Boolean ext) { switch (ch) { case CHAR_ESC: topl_replace("\x1b"); case CHAR_ENTER: case CHAR_CR: case CHAR_LF: return false; case 0x1f & 'P': mac_doprev_message(); return true; case '\x1e'/* up arrow */: topl_replace (""); return true; case CHAR_BS: case '\x1c'/* left arrow */: if ((*top_line)->selEnd <= topl_query_len) return true; else if (ext) { topl_replace (""); return true; } default: TEKey(ch, top_line); if (ext) { int com_index = -1, oindex = 0; while(extcmdlist[oindex].ef_txt != (char *)0) { if(!strncmpi(*(*top_line)->hText + topl_query_len, extcmdlist[oindex].ef_txt, (*top_line)->teLength - topl_query_len)) { if(com_index == -1) /* No matches yet*/ com_index = oindex; else /* More than 1 match */ { com_index = -2; break; } } oindex++; } if(com_index >= 0) topl_replace((char *) extcmdlist[com_index].ef_txt); } return true; } } static void topl_flash_resp(int resp_idx) { unsigned long dont_care; Rect frame; SetPortWindowPort(theWindows[WIN_MESSAGE].its_window); topl_resp_rect(resp_idx, &frame); InsetRect(&frame, 1, 1); InvertRect(&frame); Delay(GetDblTime() / 2, &dont_care); InvertRect(&frame); } static void topl_set_def(int new_def_idx) { Rect frame; SetPortWindowPort(theWindows[WIN_MESSAGE].its_window); topl_resp_rect(topl_def_idx, &frame); InvalWindowRect(theWindows[WIN_MESSAGE].its_window, &frame); topl_def_idx = new_def_idx; topl_resp_rect(new_def_idx, &frame); InvalWindowRect(theWindows[WIN_MESSAGE].its_window, &frame); } void topl_set_resp(char *resp, char def) { char *loc; Rect frame; int r_len, r_len1; if (!resp) { const char any_str[2] = {CHAR_ANY, '\0'}; resp = (char *) any_str; def = CHAR_ANY; } SetPortWindowPort(theWindows[WIN_MESSAGE].its_window); r_len1 = strlen(resp); r_len = strlen(topl_resp); if (r_len < r_len1) r_len = r_len1; topl_resp_rect(0, &frame); frame.right = (BTN_IND + BTN_W) * r_len; InvalWindowRect(theWindows[WIN_MESSAGE].its_window, &frame); strcpy(topl_resp, resp); loc = strchr (resp, def); topl_def_idx = loc ? loc - resp : -1; } static char topl_resp_key(char ch) { if (strlen(topl_resp) > 0) { char *loc = strchr(topl_resp, ch); if (!loc) { if (ch == '\x9'/* tab */) { topl_set_def(topl_def_idx<=0 ? strlen(topl_resp)-1 : topl_def_idx-1); ch = '\0'; } else if (ch == CHAR_ESC) { loc = strchr(topl_resp, 'q'); if (!loc) { loc = strchr(topl_resp, 'n'); if (!loc && topl_def_idx >= 0) loc = topl_resp + topl_def_idx; } } else if (ch == (0x1f & 'P')) { mac_doprev_message(); ch = '\0'; } else if (topl_def_idx >= 0) { if (ch == CHAR_ENTER || ch == CHAR_CR || ch == CHAR_LF || ch == CHAR_BLANK || topl_resp[topl_def_idx] == CHAR_ANY) loc = topl_resp + topl_def_idx; else if (strchr(topl_resp, '#')) { if (digit(ch)) { topl_set_def(strchr(topl_resp, '#') - topl_resp); TEKey(ch, top_line); ch = '\0'; } else if (topl_resp[topl_def_idx] == '#') { if (ch == '\x1e'/* up arrow */) { topl_set_select(topl_query_len, topl_query_len); ch = '\0'; } else if (ch == '\x1d'/* right arrow */ || ch == '\x1f'/* down arrow */ || ch == CHAR_BS || ch == '\x1c'/* left arrow */ && (*top_line)->selEnd > topl_query_len) { TEKey(ch, top_line); ch = '\0'; } } } } } if (loc) { topl_flash_resp(loc - topl_resp); if (*loc != CHAR_ANY) ch = *loc; TEKey(ch, top_line); } } return ch; } static void adjust_window_pos(NhWindow *aWin, short width, short height) { WindowRef theWindow = aWin->its_window; #if TARGET_API_MAC_CARBON Rect r; GetWindowBounds(theWindow, kWindowContentRgn, &r); RetrieveWinPos(theWindow, &r.top, &r.left); MoveWindow(theWindow, r.left, r.top, false); SizeWindow(theWindow, width, height, true); ConstrainWindowToScreen(theWindow, kWindowStructureRgn, kWindowConstrainMoveRegardlessOfFit, NULL, NULL); #else Rect scr_r = (*GetGrayRgn())->rgnBBox; const Rect win_ind = {2, 2, 3, 3}; const short min_w = theWindow->portRect.right - theWindow->portRect.left, max_w = scr_r.right - scr_r.left - win_ind.left - win_ind.right; Point pos; short max_h; SetPortWindowPort(theWindow); if (!RetrieveWinPos(theWindow, &pos.v, &pos.h)) { pos.v = 0; /* take window's existing position */ pos.h = 0; LocalToGlobal(&pos); } max_h = scr_r.bottom - win_ind.bottom - pos.v; if (height > max_h) height = max_h; if (height < MIN_HEIGHT) height = MIN_HEIGHT; if (width < min_w) width = min_w; if (width > max_w) width = max_w; SizeWindow(theWindow, width, height, true); if (pos.v + height + win_ind.bottom > scr_r.bottom) pos.v = scr_r.bottom - height - win_ind.bottom; if (pos.h + width + win_ind.right > scr_r.right) pos.h = scr_r.right - width - win_ind.right; MoveWindow(theWindow, pos.h, pos.v, false); if (aWin->scrollBar) DrawScrollbar (aWin); #endif return; } /* * display/select/update the window. * If f is true, this window should be "modal" - don't return * until presumed seen. */ void mac_display_nhwindow (winid win, BOOLEAN_P f) { NhWindow *aWin = &theWindows [win]; WindowPtr theWindow = aWin->its_window; if (win < 0 || win >= NUM_MACWINDOWS || !theWindow) { error ("disp_win: Invalid window %d.", win); return; } if (theWindow == _mt_window) { tty_display_nhwindow(win, f); return; } if (f && inSelect == WIN_ERR && win == WIN_MESSAGE) { topl_set_resp ((char *)0, 0); if (aWin->windowTextLen > 0 && (*aWin->windowText) [aWin->windowTextLen - 1] == CHAR_CR) { -- aWin->windowTextLen; -- aWin->y_size; } putstr (win, flags.standout ? ATR_INVERSE : ATR_NONE, " --More--"); } if (!IsWindowVisible(theWindow)) { if (win != WIN_MESSAGE) adjust_window_pos(aWin, aWin->x_size + SBARWIDTH+1, aWin->y_size *aWin->row_height); SelectWindow (theWindow); ShowWindow (theWindow); } if (f && inSelect == WIN_ERR) { int ch; DimMenuBar(); inSelect = win; do { ch = mac_nhgetch (); } while (!ClosingWindowChar (ch)); inSelect = WIN_ERR; UndimMenuBar(); if (win == WIN_MESSAGE) topl_set_resp ("", '\0'); else HideWindow (theWindow); } } void mac_destroy_nhwindow (winid win) { WindowPtr theWindow; NhWindow *aWin = &theWindows [win]; int kind; if (win < 0 || win >= NUM_MACWINDOWS) { if (iflags.window_inited) error ("dest_win: Invalid win %d.", win); return; } theWindow = aWin->its_window; if (!theWindow) { error ("dest_win: Not allocated win %d.", win); return; } /* * Check special windows. The base window should never go away. * Other "standard" windows should not go away unless we've exitted nhwindows. */ if (theWindow == _mt_window) { return; } if (win == WIN_INVEN || win == WIN_MESSAGE) { if (iflags.window_inited) { if (flags.tombstone && killer) { /* Prepare for the coming of the tombstone window. */ win_fonts [NHW_TEXT] = kFontIDMonaco; } return; } if (win == WIN_MESSAGE) WIN_MESSAGE = WIN_ERR; } kind = GetWindowKind(theWindow) - WIN_BASE_KIND; if ((!IsWindowVisible(theWindow) || (kind != NHW_MENU && kind != NHW_TEXT))) { DisposeWindow (theWindow); if (aWin->windowText) { DisposeHandle(aWin->windowText); } aWin->its_window = (WindowPtr) 0; aWin->windowText = (Handle) 0; } } void mac_number_pad (int pad) { iflags.num_pad = pad; } void trans_num_keys(EventRecord *theEvent) { #if defined(MAC_MPW) # pragma unused(theEvent) #endif /* KMH -- Removed this translation. * Number pad keys should always emit digit characters. * That's consistent with the default MacOS behavior. * The number_pad option controls how digits are interpreted. */ #if 0 if (iflags.num_pad) { Handle h = GetResource('Nump', theEvent->modifiers & shiftKey ? 129 : 128); if (h) { short inkey = (theEvent->message & keyCodeMask), *ab = (short *)*h; int i = ab[0]; for (; i; i--) { if (inkey == (ab[i] & keyCodeMask)) { theEvent->message = ab[i]; break; } } } } #endif } /* * Note; theWindow may very well be null here, since keyDown may call * it when theres no window !!! */ static void GeneralKey (EventRecord *theEvent, WindowPtr theWindow) { #if defined(MAC_MPW) # pragma unused(theWindow) #endif #if 0 trans_num_keys (theEvent); #endif AddToKeyQueue (topl_resp_key (theEvent->message & 0xff), TRUE); } /* * Routine used to select and de-select elements in a menu window, used by KeyMenu, * ClickMenu, and UpdateMenu. Takes the NhWindow and a line ref relative to the scrollbar. */ static void ToggleMenuSelect (NhWindow *aWin, int line) { Rect r; GetWindowBounds(aWin->its_window, kWindowContentRgn, &r); OffsetRect(&r, -r.left, -r.top); if (aWin->scrollBar) r.right -= SBARWIDTH; r.top = line * aWin->row_height; r.bottom = r.top + aWin->row_height; LMSetHiliteMode((UInt8) (LMGetHiliteMode() & 0x7F)); InvertRect(&r); } /* * Check to see if given item is selected, return index if it is */ static int ListItemSelected (NhWindow *aWin, int item) { int i; HLock ((char**)aWin->menuSelected); /* Find item in selection list */ for (i = aWin->miSelLen - 1; i >= 0; i--) { if ((*aWin->menuSelected) [i] == item) break; } HUnlock ((char**)aWin->menuSelected); return i; } /* * Add item to selection list if it's not selected already * If it is selected already, remove it from the list. */ static void ToggleMenuListItemSelected (NhWindow *aWin, short item) { int i = ListItemSelected (aWin, item); HLock ((char**)aWin->menuSelected); if (i < 0) { /* not there, so add */ (*aWin->menuSelected) [aWin->miSelLen] = item; aWin->miSelLen++; } else { /* there, so remove */ short *mi = &(*aWin->menuSelected)[i]; aWin->miSelLen --; memcpy (mi, mi + 1, (aWin->miSelLen - i)*sizeof(short)); } HUnlock ((char**)aWin->menuSelected); } /* * Find menu item in list given a line number on the window */ static short ListCoordinateToItem (NhWindow *aWin, short Row) { int i, item = -1; MacMHMenuItem * mi; HLock ((char**)aWin->menuInfo); for (i = 0, mi = *aWin->menuInfo; i < aWin->miLen; i++, mi++) { if (mi->line == Row + aWin->scrollPos) { item = i; break; } } HUnlock ((char**)aWin->menuInfo); return item; } static void macKeyMenu (EventRecord *theEvent, WindowPtr theWindow) { NhWindow *aWin = GetNhWin(theWindow); MacMHMenuItem *mi; int l, ch = theEvent->message & 0xff; if (aWin && aWin->menuInfo) { HLock ((char**)aWin->menuInfo); for (l = 0, mi = *aWin->menuInfo; l < aWin->miLen; l++, mi++) { if (mi->accelerator == ch) { ToggleMenuListItemSelected (aWin, l); if (mi->line >= aWin->scrollPos && mi->line <= aWin->y_size) { SetPortWindowPort(theWindow); ToggleMenuSelect (aWin, mi->line - aWin->scrollPos); } /* Dismiss window if only picking one item */ if (aWin->how != PICK_ANY) AddToKeyQueue(CHAR_CR, 1); break; } } HUnlock ((char**)aWin->menuInfo); /* add key if didn't find it in menu and not filtered */ if (l == aWin->miLen && filter_scroll_key (ch, aWin)) GeneralKey (theEvent, theWindow); } } static void macClickMenu (EventRecord *theEvent, WindowRef theWindow) { Point p; NhWindow *aWin = GetNhWin(theWindow); Rect wrect; GetWindowBounds(theWindow, kWindowContentRgn, &wrect); OffsetRect(&wrect, -wrect.left, -wrect.top); if (aWin->scrollBar && IsControlVisible(aWin->scrollBar)) { short code; ControlHandle theBar; p = theEvent->where; GlobalToLocal (&p); code = FindControl (p, theWindow, &theBar); if (code) { DoScrollBar (p, code, theBar, aWin); return; } } if (inSelect != WIN_ERR && aWin->how != PICK_NONE) { short currentRow = -1, previousRow = -1; short previousItem = -1, item = -1; Boolean majorSelectState, firstRow = TRUE; do { #if !TARGET_API_MAC_CARBON SystemTask (); #endif GetMouse (&p); currentRow = p.v / aWin->row_height; if (p.h < wrect.left || p.h > wrect.right || p.v < 0 || p.v > wrect.bottom || currentRow >= aWin->y_size) { continue; /* not in window range */ } item = ListCoordinateToItem (aWin, currentRow); if (item != previousItem) { /* Implement typical Mac multiple-selection behavior * (ie, not the UI implemented by the Finder) */ Boolean itemIsSelected = (ListItemSelected (aWin,item) >= 0); if (firstRow) { /* this is first valid row, so major state is opposite of what this row is */ majorSelectState = !itemIsSelected; firstRow = FALSE; } if (aWin->how == PICK_ONE && previousItem != -1) { /* if previous row was selected and we're only selecting one object, * deselect previous row! */ ToggleMenuListItemSelected (aWin, previousItem); ToggleMenuSelect (aWin, previousRow); previousItem = -1; } if (item == -1) continue; /* header line */ if (majorSelectState != itemIsSelected) { ToggleMenuListItemSelected (aWin, item); ToggleMenuSelect (aWin, currentRow); } previousRow = currentRow; previousItem = item; } } while (StillDown ()); /* Dismiss window if only picking one item */ if (aWin->how == PICK_ONE) AddToKeyQueue(CHAR_CR, 1); } } static void macKeyText (EventRecord *theEvent, WindowPtr theWindow) { NhWindow *aWin = GetNhWin (theWindow); char c = filter_scroll_key (theEvent->message & 0xff, aWin); if (c) { if (inSelect == WIN_ERR && ClosingWindowChar (c)) { HideWindow (theWindow); mac_destroy_nhwindow (aWin - theWindows); } else { GeneralKey (theEvent, theWindow); } } } static void macClickText (EventRecord *theEvent, WindowPtr theWindow) { NhWindow *aWin = GetNhWin (theWindow); if (aWin->scrollBar && IsControlVisible(aWin->scrollBar)) { short code; Point p = theEvent->where; ControlHandle theBar; GlobalToLocal (&p); code = FindControl (p, theWindow, &theBar); if (code) { DoScrollBar (p, code, theBar, aWin); } } } static void macClickMessage (EventRecord *theEvent, WindowPtr theWindow) { int r_idx = 0; Point mouse = theEvent->where; GlobalToLocal(&mouse); while (topl_resp[r_idx]) { Rect frame; topl_resp_rect(r_idx, &frame); InsetRect(&frame, 1, 1); if (PtInRect(mouse, &frame)) { Boolean in_btn = true; InvertRect(&frame); while (WaitMouseUp()) { #if !TARGET_API_MAC_CARBON SystemTask(); #endif GetMouse(&mouse); if (PtInRect(mouse, &frame) != in_btn) { in_btn = !in_btn; InvertRect(&frame); } } if (in_btn) { InvertRect(&frame); AddToKeyQueue (topl_resp [r_idx], 1); } return; } ++r_idx; } macClickText(theEvent, theWindow); } static void macClickTerm (EventRecord *theEvent, WindowPtr theWindow) { NhWindow *nhw = GetNhWin(theWindow); Point where = theEvent->where; GlobalToLocal(&where); where.h = where.h / nhw->char_width + 1; 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 !TARGET_API_MAC_CARBON if (cursor_locked) while (WaitMouseUp()) SystemTask(); #endif gClickedToMove = TRUE; clicked_pos = where; } } static pascal void MoveScrollBar (ControlHandle theBar, short part) { EventRecord fake; Rect r; RgnHandle rgn; int now, amtToScroll; WindowPtr theWin; NhWindow *winToScroll; if (!part) return; #if !TGT_API_MAC_CARBON theWin = (*theBar)->contrlOwner; #else theWin = GetControlOwner(theBar); #endif GetWindowBounds(theWin, kWindowContentRgn, &r); OffsetRect(&r, -r.left, -r.top); winToScroll = (NhWindow*)(GetWRefCon(theWin)); now = GetControlValue (theBar); if (part == kControlPageUpPart || part == kControlPageDownPart) amtToScroll = (r.bottom - r.top) / winToScroll->row_height; else amtToScroll = 1; if (part == kControlPageUpPart || part == kControlUpButtonPart) { int bound = GetControlMinimum (theBar); if (now - bound < amtToScroll) amtToScroll = now - bound; amtToScroll = -amtToScroll; } else { int bound = GetControlMaximum (theBar); if (bound - now < amtToScroll) amtToScroll = bound - now; } if (!amtToScroll) return; SetControlValue (theBar, now + amtToScroll); winToScroll->scrollPos = now + amtToScroll; r.right -= SBARWIDTH; if (winToScroll == theWindows + WIN_MESSAGE) r.bottom -= SBARHEIGHT; rgn = NewRgn (); ScrollRect (&r, 0, -amtToScroll * winToScroll->row_height, rgn); if (rgn) { InvalWindowRgn(theWin, rgn); BeginUpdate(theWin); } winUpdateFuncs [GetWindowKind(theWin) - WIN_BASE_KIND] (&fake, theWin); if (rgn) { EndUpdate(theWin); DisposeRgn(rgn); } } static void DoScrollBar (Point p, short code, ControlHandle theBar, NhWindow *aWin) { ControlActionUPP func = NULL; Rect rect; if (code == kControlUpButtonPart || code == kControlPageUpPart || code == kControlDownButtonPart || code == kControlPageDownPart) func = MoveScrollUPP; (void) TrackControl(theBar, p, func); if (!func) { if (aWin->scrollPos != GetControlValue (theBar)) { aWin->scrollPos = GetControlValue (theBar); GetWindowBounds(aWin->its_window, kWindowContentRgn, &rect); OffsetRect(&rect, -rect.left, -rect.top); InvalWindowRect(aWin->its_window, &rect); } } } static int filter_scroll_key(const int ch, NhWindow *aWin) { if (aWin->scrollBar && GetControlValue(aWin->scrollBar) < GetControlMaximum(aWin->scrollBar)) { short part = 0; if (ch == CHAR_BLANK) { part = kControlPageDownPart; } else if (ch == CHAR_CR || ch == CHAR_LF) { part = kControlDownButtonPart; } if (part) { SetPortWindowPort(aWin->its_window); MoveScrollBar(aWin->scrollBar, part); return 0; } } return ch; } int mac_doprev_message(void) { if (WIN_MESSAGE) { NhWindow *winToScroll = &theWindows[WIN_MESSAGE]; mac_display_nhwindow(WIN_MESSAGE, FALSE); SetPortWindowPort(winToScroll->its_window); MoveScrollBar(winToScroll->scrollBar, kControlUpButtonPart); } return 0; } static short macDoNull (EventRecord *theEvent, WindowPtr theWindow) { return 0; } static void draw_growicon_vert_only(WindowPtr wind) { GrafPtr org_port; RgnHandle org_clip = NewRgn(); Rect r; GetPort(&org_port); SetPortWindowPort(wind); GetClip(org_clip); GetWindowBounds(wind, kWindowContentRgn, &r); OffsetRect(&r, -r.left, -r.top); r.left = r.right - SBARWIDTH; ClipRect(&r); DrawGrowIcon(wind); SetClip(org_clip); DisposeRgn(org_clip); SetPort(org_port); } static short macUpdateMessage (EventRecord *theEvent, WindowPtr theWindow) { RgnHandle org_clip = NewRgn(), clip = NewRgn(); Rect r; NhWindow *aWin = GetNhWin(theWindow); int l; if (!theEvent) return 0; GetClip(org_clip); GetWindowBounds(theWindow, kWindowContentRgn, &r); OffsetRect(&r, -r.left, -r.top); DrawControls(theWindow); DrawGrowIcon(theWindow); for (l = 0; topl_resp[l]; l++) { StringPtr name; unsigned char tmp[2]; FontInfo font; Rect frame; topl_resp_rect(l, &frame); switch (topl_resp[l]) { case 'y': name = "\pyes"; break; case 'n': name = "\pno"; break; case 'N': name = "\pNone"; break; case 'a': name = "\pall"; break; case 'q': name = "\pquit"; break; case CHAR_ANY: name = "\pany key"; break; default: tmp[0] = 1; tmp[1] = topl_resp[l]; name = tmp; break; } TextFont(kFontIDGeneva); TextSize(9); GetFontInfo(&font); MoveTo ((frame.left + frame.right - StringWidth(name)) / 2, (frame.top + frame.bottom + font.ascent-font.descent-font.leading-1) / 2); DrawString(name); PenNormal(); if (l == topl_def_idx) PenSize(2, 2); FrameRoundRect(&frame, 4, 4); } r.right -= SBARWIDTH; r.bottom -= SBARHEIGHT; /* Clip to the portrect - scrollbar/growicon *before* adjusting the rect to be larger than the size of the window (!) */ RectRgn(clip, &r); SectRgn(clip, org_clip, clip); if (r.right < MIN_RIGHT) r.right = MIN_RIGHT; r.top -= aWin->scrollPos * aWin->row_height; #if 0 /* If you enable this band of code (and disable the next band), you will get fewer flickers but a slower performance while drawing the dot line. */ { RgnHandle dotl_rgn = NewRgn(); Rect dotl; dotl.left = r.left; dotl.right = r.right; dotl.bottom = r.top + aWin->save_lin * aWin->row_height; dotl.top = dotl.bottom - 1; FillRect(&dotl, &qd.gray); RectRgn(dotl_rgn, &dotl); DiffRgn(clip, dotl_rgn, clip); DisposeRgn(dotl_rgn); SetClip(clip); } #endif if (in_topl_mode()) { RgnHandle topl_rgn = NewRgn(); Rect topl_r = r; topl_r.top += (aWin->y_size - 1) * aWin->row_height; l = (*top_line)->destRect.right - (*top_line)->destRect.left; (*top_line)->viewRect = topl_r; (*top_line)->destRect = topl_r; if (l != topl_r.right - topl_r.left) TECalText(top_line); TEUpdate(&topl_r, top_line); RectRgn(topl_rgn, &topl_r); DiffRgn(clip, topl_rgn, clip); DisposeRgn(topl_rgn); SetClip(clip); } DisposeRgn(clip); TextFont (aWin->font_number); TextSize (aWin->font_size); HLock (aWin->windowText); TETextBox (*aWin->windowText, aWin->windowTextLen, &r, teJustLeft); HUnlock (aWin->windowText); #if !TARGET_API_MAC_CARBON r.bottom = r.top + aWin->save_lin * aWin->row_height; r.top = r.bottom - 1; FillRect(&r, (void *) &qd.gray); #endif SetClip(org_clip); DisposeRgn(org_clip); return 0; } static short macUpdateMenu (EventRecord *theEvent, WindowPtr theWindow) { NhWindow *aWin = GetNhWin (theWindow); int i, line; MacMHMenuItem *mi; GeneralUpdate (theEvent, theWindow); HLock ((char**)aWin->menuInfo); HLock ((char**)aWin->menuSelected); for (i = 0; i < aWin->miSelLen; i++) { mi = &(*aWin->menuInfo) [(*aWin->menuSelected) [i]]; line = mi->line; if (line > aWin->scrollPos && line <= aWin->y_size) ToggleMenuSelect (aWin, line - aWin->scrollPos); } HUnlock ((char**)aWin->menuInfo); HUnlock ((char**)aWin->menuSelected); return 0; } static short GeneralUpdate (EventRecord *theEvent, WindowPtr theWindow) { Rect r, r2; NhWindow *aWin = GetNhWin (theWindow); RgnHandle h; Boolean vis; if (!theEvent) return 0; GetWindowBounds(theWindow, kWindowContentRgn, &r); OffsetRect(&r, -r.left, -r.top); r2 = r; r2.left = r2.right - SBARWIDTH; r2.right += 1; r2.top -= 1; vis = (r2.bottom > r2.top + 50); draw_growicon_vert_only(theWindow); DrawControls (theWindow); h = (RgnHandle) 0; if (vis && (h = NewRgn ())) { RgnHandle tmp = NewRgn (); if (!tmp) { DisposeRgn (h); h = (RgnHandle) 0; } else { GetClip (h); RectRgn (tmp, &r2); DiffRgn (h, tmp, tmp); SetClip (tmp); DisposeRgn (tmp); } } if (r.right < MIN_RIGHT) r.right = MIN_RIGHT; r.top -= aWin->scrollPos * aWin->row_height; r.right -= SBARWIDTH; HLock (aWin->windowText); TETextBox (*aWin->windowText, aWin->windowTextLen, &r, teJustLeft); HUnlock (aWin->windowText); if (h) { SetClip (h); DisposeRgn (h); } return 0; } static void macCursorTerm (EventRecord *theEvent, WindowPtr theWindow, RgnHandle mouseRgn) { char *dir_bas, *dir; CursHandle ch; GrafPtr gp; NhWindow *nhw = GetNhWin (theWindow); Rect r = {0, 0, 1, 1}; GetPort (&gp); SetPortWindowPort(theWindow); if (cursor_locked) dir = (char *)0; else { Point where = theEvent->where; 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); if (ch) { HLock ((Handle) ch); SetCursor (*ch); HUnlock ((Handle) ch); } else { SetCursor(&qdarrow); } OffsetRect (&r, theEvent->where.h, theEvent->where.v); RectRgn (mouseRgn, &r); SetPort (gp); } static void GeneralCursor (EventRecord *theEvent, WindowPtr theWindow, RgnHandle mouseRgn) { #if defined(MAC_MPW) # pragma unused(theWindow) #endif Rect r = {-1, -1, 2, 2}; SetCursor(&qdarrow); OffsetRect (&r, theEvent->where.h, theEvent->where.v); RectRgn (mouseRgn, &r); } static void HandleKey (EventRecord *theEvent) { WindowPtr theWindow = FrontWindow (); if (theEvent->modifiers & cmdKey) { if (theEvent->message & 0xff == '.') { /* Flush key queue */ keyQueueCount = keyQueueWrite = keyQueueRead = 0; theEvent->message = '\033'; } else { UndimMenuBar (); DoMenuEvt (MenuKey (theEvent->message & 0xff)); return; } } else if (theEvent->modifiers & optionKey) { if ((theEvent->message & charCodeMask) == '#') { /* On the British keyboard layout the # key is option+3 */ theEvent->modifiers -= optionKey; } else { Ptr KCHRPtr; UInt16 keycode; unsigned long state = 0; KCHRPtr = (char*)GetScriptManagerVariable(smKCHRCache); keycode = (theEvent->message & keyCodeMask) >> 8; keycode |= (theEvent->modifiers - optionKey) & 0xFF00; keycode = KeyTranslate(KCHRPtr, keycode, &state); theEvent->message &= ~charCodeMask; theEvent->message |= keycode | 0x80; } } if (theWindow) { int kind = ((WindowPeek)theWindow)->windowKind - WIN_BASE_KIND; winKeyFuncs [kind] (theEvent, theWindow); } else { GeneralKey (theEvent, (WindowPtr) 0); } } static void WindowGoAway (EventRecord *theEvent, WindowPtr theWindow) { NhWindow *aWin = GetNhWin(theWindow); if (!theEvent || TrackGoAway (theWindow, theEvent->where)) { if (aWin - theWindows == BASE_WINDOW && !iflags.window_inited) { AddToKeyQueue ('\033', 1); } else { HideWindow (theWindow); if (aWin - theWindows != inSelect) mac_destroy_nhwindow (aWin - theWindows); else /* if this IS the inSelect window put a close char */ AddToKeyQueue (CHAR_CR, 1); /* in queue to exit and maintain inSelect */ } } } static void HandleClick (EventRecord *theEvent) { int code; unsigned long l; WindowPtr theWindow; NhWindow *aWin; Rect r; Boolean not_inSelect; #if !TARGET_API_MAC_CARBON r = (*GetGrayRgn ())->rgnBBox; InsetRect (&r, 4, 4); #else InsetRect(GetRegionBounds(GetGrayRgn(), &r), 4, 4); #endif code = FindWindow (theEvent->where, &theWindow); aWin = GetNhWin (theWindow); not_inSelect = (inSelect == WIN_ERR || aWin - theWindows == inSelect); switch (code) { case inContent : if (not_inSelect) { int kind = GetWindowKind(theWindow) - WIN_BASE_KIND; winCursorFuncs [kind] (theEvent, theWindow, gMouseRgn); SelectWindow (theWindow); SetPortWindowPort(theWindow); winClickFuncs [kind] (theEvent, theWindow); } else { nhbell (); } break; case inDrag : if (not_inSelect) { SetCursor(&qdarrow); DragWindow (theWindow, theEvent->where, &r); SaveWindowPos(theWindow); } else { nhbell (); } break; case inGrow : if (not_inSelect) { SetCursor(&qdarrow); SetRect (&r, 80, 2 * aWin->row_height + 1, r.right, r.bottom); if (aWin == theWindows + WIN_MESSAGE) r.top += SBARHEIGHT; l = GrowWindow (theWindow, theEvent->where, &r); SizeWindow (theWindow, l & 0xffff, l >> 16, FALSE); SaveWindowSize(theWindow); SetPortWindowPort(theWindow); GetWindowBounds(theWindow, kWindowContentRgn, &r); OffsetRect(&r, -r.left, -r.top); InvalWindowRect(theWindow, &r); if (aWin->scrollBar) { DrawScrollbar (aWin); } } else { nhbell (); } break; case inGoAway : WindowGoAway(theEvent, theWindow); break; case inMenuBar : DoMenuEvt (MenuSelect (theEvent->where)); break; #if !TARGET_API_MAC_CARBON case inSysWindow : SystemClick(theEvent, theWindow); #endif default : break; } } static void HandleUpdate (EventRecord *theEvent) { WindowPtr theWindow = (WindowPtr) theEvent->message; NhWindow *aWin = GetNhWin (theWindow); Rect r; char existing_update_region = FALSE; Rect rect; if (theWindow == _mt_window) { existing_update_region = (get_invalid_region (theWindow, &rect) == noErr); } BeginUpdate (theWindow); SetPortWindowPort(theWindow); GetWindowBounds(theWindow, kWindowContentRgn, &r); OffsetRect(&r, -r.left, -r.top); EraseRect(&r); winUpdateFuncs [GetWindowKind(theWindow) - WIN_BASE_KIND] (theEvent, theWindow); if (theWindow == _mt_window && existing_update_region) { set_invalid_region (theWindow, &rect); } aWin->drawn = TRUE; EndUpdate (theWindow); } static void DoOsEvt (EventRecord *theEvent) { WindowRef win; short code; if ((theEvent->message & 0xff000000) == 0xfa000000) { /* Mouse Moved */ code = FindWindow (theEvent->where, &win); if (code != inContent) { Rect r = {-1, -1, 2, 2}; SetCursor(&qdarrow); OffsetRect (&r, theEvent->where.h, theEvent->where.v); RectRgn (gMouseRgn, &r); } else { int kind = GetWindowKind(win) - WIN_BASE_KIND; if (kind >= 0 && kind <= NHW_TEXT) { winCursorFuncs [kind] (theEvent, win, gMouseRgn); } } } } void HandleEvent (EventRecord *theEvent) { switch (theEvent->what) { case autoKey : case keyDown : HandleKey (theEvent); break; case updateEvt : HandleUpdate (theEvent); break; case mouseDown : HandleClick (theEvent); break; #if !TARGET_API_MAC_CARBON case diskEvt : if ((theEvent->message & 0xffff0000) != 0) { Point p = {150, 150}; (void) DIBadMount (p, theEvent->message); } break; #endif case osEvt : DoOsEvt (theEvent); break; case kHighLevelEvent: AEProcessAppleEvent(theEvent); default : break; } } void mac_get_nh_event(void) { EventRecord anEvent; /* KMH -- Don't proceed if the window system isn't set up */ if (!iflags.window_inited) return; (void) WaitNextEvent (everyEvent, &anEvent, -1, gMouseRgn); HandleEvent(&anEvent); } int mac_nhgetch(void) { int ch; long doDawdle; EventRecord anEvent; /* We want to take care of keys in the buffer as fast as * possible */ if (keyQueueCount) doDawdle = 0L; else { long total, contig; static char warn = 0; doDawdle = (in_topl_mode() ? GetCaretTime () : 120L); /* Since we have time, check memory */ PurgeSpace (&total, &contig); if (contig < 25000L || total < 50000L) { if (!warn) { pline ("Low Memory!"); warn = 1; } } else { warn = 0; } } do { (void) WaitNextEvent (everyEvent, &anEvent, doDawdle, gMouseRgn); HandleEvent (&anEvent); ch = GetFromKeyQueue (); } while (!ch && !gClickedToMove); if (!gClickedToMove) ObscureCursor (); else gClickedToMove = 0; #ifdef THINK_C if (ch == '\r') ch = '\n'; #endif return ch; } void mac_delay_output(void) { long destTicks = TickCount () + 1; while (TickCount () < destTicks) { mac_get_nh_event (); } } #ifdef CLIPPING static void mac_cliparound (int x, int y) { #if defined(MAC_MPW) # pragma unused(x,y) #endif /* TODO */ } #endif void mac_exit_nhwindows (const char *s) { clear_screen (); tty_exit_nhwindows (s); mac_destroy_nhwindow (WIN_MESSAGE); mac_destroy_nhwindow (WIN_INVEN); } /* * Don't forget to decrease in_putstr before returning... */ void mac_putstr (winid win, int attr, const char *str) { long len, slen; NhWindow *aWin = &theWindows [win]; static char in_putstr = 0; short newWidth, maxWidth; Rect r; char *src, *sline, *dst, ch; if (win < 0 || win >= NUM_MACWINDOWS || !aWin->its_window) { error ("putstr: Invalid win %d (Max %d).", win, NUM_MACWINDOWS, attr); return; } if (aWin->its_window == _mt_window) { tty_putstr(win, attr, str); return; } if (in_putstr > 3) return; in_putstr ++; slen = strlen (str); SetPortWindowPort(aWin->its_window); GetWindowBounds(aWin->its_window, kWindowContentRgn, &r); OffsetRect(&r, -r.left, -r.top); if (win == WIN_MESSAGE) { r.right -= SBARWIDTH; r.bottom -= SBARHEIGHT; if (flags.page_wait && aWin->last_more_lin <= aWin->y_size - (r.bottom - r.top) / aWin->row_height) { aWin->last_more_lin = aWin->y_size; mac_display_nhwindow(win, TRUE); } } /* * A "default" text window - uses TETextBox * We just add the text, without attributes for now */ len = GetHandleSize (aWin->windowText); while (aWin->windowTextLen + slen + 1 > len) { len = (len > 2048) ? (len + 2048) : (len * 2); SetHandleSize (aWin->windowText, len); if (MemError ()) { error ("putstr: SetHandleSize"); aWin->windowTextLen = 0L; aWin->save_lin = 0; aWin->y_curs = 0; aWin->y_size = 0; } } len = aWin->windowTextLen; dst = *(aWin->windowText) + len; sline = src = (char *)str; maxWidth = newWidth = 0; for (ch = *src; ch; ch = *src) { if (ch == CHAR_LF) ch = CHAR_CR; *dst++ = ch; if (ch == CHAR_CR) { aWin->y_curs ++; aWin->y_size ++; aWin->x_curs = 0; newWidth = TextWidth (sline, 0, src - sline); if (newWidth > maxWidth) { maxWidth = newWidth; } sline = src+1; /* keep track of where new line begins */ } else aWin->x_curs ++; src++; } newWidth = TextWidth (sline, 0, src - sline); if (newWidth > maxWidth) { maxWidth = newWidth; } aWin->windowTextLen += slen; if (ch != CHAR_CR) { (*(aWin->windowText)) [len + slen] = CHAR_CR; aWin->windowTextLen ++; aWin->y_curs ++; aWin->y_size ++; aWin->x_curs = 0; } if (win == WIN_MESSAGE) { short min = aWin->y_size - (r.bottom - r.top) / aWin->row_height; if (aWin->scrollPos < min) { aWin->scrollPos = min; SetControlMaximum (aWin->scrollBar, aWin->y_size); SetControlValue(aWin->scrollBar, min); } InvalWindowRect(aWin->its_window, &r); } else /* Message has a fixed width, other windows base on content */ if (maxWidth > aWin->x_size) aWin->x_size = maxWidth; in_putstr --; } void mac_curs (winid win, int x, int y) { NhWindow *aWin = &theWindows [win]; if (aWin->its_window == _mt_window) { tty_curs(win, x, y); return; } SetPortWindowPort(aWin->its_window); MoveTo (x * aWin->char_width, (y * aWin->row_height) + aWin->ascent_height); aWin->x_curs = x; aWin->y_curs = y; } int mac_nh_poskey (int *a, int *b, int *c) { int ch = mac_nhgetch(); *a = clicked_pos.h; *b = clicked_pos.v; *c = clicked_mod; return ch; } void mac_start_menu (winid win) { HideWindow (theWindows [win].its_window); mac_clear_nhwindow (win); } void mac_add_menu (winid win, int glyph, const anything *any, CHAR_P menuChar, CHAR_P groupAcc, int attr, const char *inStr, int preselected) { #if defined(MAC_MPW) # pragma unused(glyph) #endif NhWindow *aWin = &theWindows [win]; const char *str; char locStr[4+BUFSZ]; MacMHMenuItem *item; if (!inStr) return; if (any->a_void != 0) { #define kMenuSizeBump 26 if (!aWin->miSize) { aWin->menuInfo = (MacMHMenuItem **)NewHandle(sizeof(MacMHMenuItem) * kMenuSizeBump); if (!aWin->menuInfo) { error("Can't alloc menu handle"); return; } aWin->menuSelected = (short **)NewHandle(sizeof(short) * kMenuSizeBump); if (!aWin->menuSelected) { error("Can't alloc menu select handle"); return; } aWin->miSize = kMenuSizeBump; } if (aWin->miLen >= aWin->miSize) { SetHandleSize((Handle)aWin->menuInfo, sizeof(MacMHMenuItem) * (aWin->miLen+kMenuSizeBump)); if (MemError()) { error("Can't resize menu handle"); return; } SetHandleSize((Handle)aWin->menuSelected, sizeof(short) * (aWin->miLen+kMenuSizeBump)); if (MemError()) { error("Can't resize menu select handle"); return; } aWin->miSize += kMenuSizeBump; } if (menuChar == 0) { if (('a' <= aWin->menuChar && aWin->menuChar <= 'z') || ('A' <= aWin->menuChar && aWin->menuChar <= 'Z')) { menuChar = aWin->menuChar++; if (menuChar == 'z') aWin->menuChar = 'A'; } } Sprintf(locStr, "%c - %s", (menuChar ? menuChar : ' '), inStr); str = locStr; HLock ((char**)aWin->menuInfo); HLock ((char**)aWin->menuSelected); (*aWin->menuSelected)[aWin->miLen] = preselected; item = &(*aWin->menuInfo)[aWin->miLen]; aWin->miLen++; item->id = *any; item->accelerator = menuChar; item->groupAcc = groupAcc; item->line = aWin->y_size; HUnlock ((char**)aWin->menuInfo); HUnlock ((char**)aWin->menuSelected); } else str = inStr; putstr (win, attr, str); } /* * End a menu in this window, window must a type NHW_MENU. * str is a list of cancel characters (values that may be input) * morestr is a prompt to display, rather than the default. * str and morestr might be ignored by some ports. */ void mac_end_menu (winid win, const char *morestr) { Str255 buf; NhWindow *aWin = &theWindows [win]; buf [0] = 0; if (morestr) C2P (morestr, buf); SetWTitle (aWin->its_window, buf); } int mac_select_menu (winid win, int how, menu_item **selected_list) { int c; NhWindow *aWin = &theWindows [win]; WindowPtr theWin = aWin->its_window; inSelect = win; mac_display_nhwindow (win, FALSE); aWin->how = (short) how; for (;;) { c = map_menu_cmd (mac_nhgetch()); if (c == CHAR_ESC) { /* deselect everything */ aWin->miSelLen = 0; break; } else if (ClosingWindowChar(c)) { break; } else { nhbell(); } } HideWindow (theWin); if (aWin->miSelLen) { menu_item *mp; MacMHMenuItem *mi; *selected_list = mp = (menu_item *) alloc(aWin->miSelLen * sizeof(menu_item)); HLock ((char**)aWin->menuInfo); HLock ((char**)aWin->menuSelected); for (c = 0; c < aWin->miSelLen; c++) { mi = &(*aWin->menuInfo)[(*aWin->menuSelected) [c]]; mp->item = mi->id; mp->count = -1L; mp++; } HUnlock ((char**)aWin->menuInfo); HUnlock ((char**)aWin->menuSelected); } else *selected_list = 0; inSelect = WIN_ERR; return aWin->miSelLen; } #include "dlb.h" static void mac_display_file (name, complain) const char *name; /* not ANSI prototype because of boolean parameter */ boolean complain; { Ptr buf; int win; dlb *fp = dlb_fopen(name, "r"); if (fp) { long l = dlb_fseek(fp, 0, SEEK_END); (void) dlb_fseek(fp, 0, 0L); buf = NewPtr(l+1); if (buf) { l = dlb_fread(buf, 1, l, fp); if (l > 0) { buf[l] = '\0'; win = create_nhwindow(NHW_TEXT); if (WIN_ERR == win) { if (complain) error ("Cannot make window."); } else { putstr(win, 0, buf); display_nhwindow(win, FALSE); } } DisposePtr(buf); } dlb_fclose(fp); } else if (complain) error("Cannot open %s.", name); } void port_help () { display_file (PORT_HELP, TRUE); } static void mac_unimplemented (void) { } static void mac_suspend_nhwindows (const char *foo) { #if defined(MAC_MPW) # pragma unused(foo) #endif /* Can't really do that :-) */ } int try_key_queue (char *bufp) { if (keyQueueCount) { char ch; for (ch = GetFromKeyQueue(); ; ch = GetFromKeyQueue()) { if (ch == CHAR_LF || ch == CHAR_CR) ch = 0; *bufp++ = ch; if (ch == 0) break; } return 1; } return 0; } /* Interface definition, for windows.c */ struct window_procs mac_procs = { "mac", WC_COLOR | WC_HILITE_PET | WC_FONT_MAP | WC_FONT_MENU | WC_FONT_MESSAGE | WC_FONT_STATUS | WC_FONT_TEXT | WC_FONTSIZ_MAP | WC_FONTSIZ_MENU | WC_FONTSIZ_MESSAGE | WC_FONTSIZ_STATUS | WC_FONTSIZ_TEXT, 0L, mac_init_nhwindows, mac_unimplemented, /* see macmenu.c:mac_askname() for player selection */ mac_askname, mac_get_nh_event, mac_exit_nhwindows, mac_suspend_nhwindows, mac_unimplemented, mac_create_nhwindow, mac_clear_nhwindow, mac_display_nhwindow, mac_destroy_nhwindow, mac_curs, mac_putstr, mac_display_file, mac_start_menu, mac_add_menu, mac_end_menu, mac_select_menu, genl_message_menu, mac_unimplemented, mac_get_nh_event, mac_get_nh_event, #ifdef CLIPPING mac_cliparound, #endif #ifdef POSITIONBAR donull, #endif tty_print_glyph, tty_raw_print, tty_raw_print_bold, mac_nhgetch, mac_nh_poskey, tty_nhbell, mac_doprev_message, mac_yn_function, mac_getlin, mac_get_ext_cmd, mac_number_pad, mac_delay_output, #ifdef CHANGE_COLOR tty_change_color, tty_change_background, set_tty_font_name, tty_get_color_string, #endif /* other defs that really should go away (they're tty specific) */ 0, // mac_start_screen, 0, // mac_end_screen, genl_outrip, genl_preference_update, }; /*macwin.c*/ slashem-0.0.7E7F3/sys/mac/MFiles.r0000664000076400007640000000073410545462317014600 0ustar aliali#include "date.h" #include "patchlevel.h" type 'slRc' as 'STR '; resource 'slRc' (0, purgeable) { "Recover " VERSION_STRING " Copyright © David Hairston 1993" }; resource 'vers' (1) { VERSION_MAJOR, (VERSION_MINOR<<4) | PATCHLEVEL, beta, EDITLEVEL, verUS, VERSION_STRING, "Recover " VERSION_STRING }; resource 'vers' (2) { VERSION_MAJOR, (VERSION_MINOR<<4) | PATCHLEVEL, beta, EDITLEVEL, verUS, VERSION_STRING, "for Slash'EM " VERSION_STRING " (www.slashem.org)" }; slashem-0.0.7E7F3/sys/mac/mgetline.c0000664000076400007640000000322210545462317015201 0ustar aliali/* 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. */ #include "hack.h" #include "mactty.h" #include "macwin.h" #include "macpopup.h" #include "func_tab.h" extern int NDECL(extcmd_via_menu); /* cmd.c */ typedef Boolean FDECL ((* key_func), (unsigned char)); int get_line_from_key_queue (char * bufp) { * bufp = 0; if (try_key_queue (bufp)) { while (* bufp) { if (* bufp == 10 || * bufp == 13) { * bufp = 0; } bufp ++; } return true; } return false; } static void topl_getlin(const char *query, char *bufp, Boolean ext) { if (get_line_from_key_queue (bufp)) return; enter_topl_mode((char *) query); while (topl_key(nhgetch(), ext)) ; leave_topl_mode(bufp); } /* * Read a line closed with '\n' into the array char bufp[BUFSZ]. * (The '\n' is not stored. The string is closed with a '\0'.) * Reading can be interrupted by an escape ('\033') - now the * resulting string is "\033". */ void mac_getlin(const char *query, char *bufp) { topl_getlin (query, bufp, false); } /* Read in an extended command - doing command line completion for * when enough characters have been entered to make a unique command. * This is just a modified getlin() followed by a lookup. -jsb */ int mac_get_ext_cmd() { char bufp[BUFSZ]; int i; if (iflags.extmenu) return extcmd_via_menu(); topl_getlin("# ", bufp, true); for (i = 0; extcmdlist[i].ef_txt != (char *)0; i++) if (!strcmp(bufp, extcmdlist[i].ef_txt)) break; if (extcmdlist[i].ef_txt == (char *)0) i = -1; /* not found */ return i; } /* macgetline.c */ slashem-0.0.7E7F3/sys/mac/macmain.c0000664000076400007640000001443510545462317015012 0ustar aliali/* SCCS Id: @(#)macmain.c 3.1 97/01/22 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ /* main.c - Mac NetHack */ #include "hack.h" #include "dlb.h" #include "macwin.h" #include "mactty.h" #if !TARGET_API_MAC_CARBON #include #include #include #include #include #include #include #include #endif #ifndef O_RDONLY #include #endif static void finder_file_request(void); int main(void); #if defined(MAC_MPW) QDGlobals qd; #endif int main (void) { register int fd = -1; int argc = 1; windowprocs = mac_procs; InitMac (); theWindows = (NhWindow *) NewPtrClear (NUM_MACWINDOWS * sizeof (NhWindow)); hname = "Slash'EM"; hackpid = getpid(); /* * Initialisation of the boundaries of the mazes * Both boundaries have to be even. */ x_maze_max = COLNO-1; if (x_maze_max % 2) x_maze_max--; y_maze_max = ROWNO-1; if (y_maze_max % 2) y_maze_max--; setrandom(); initoptions(); init_nhwindows(&argc, (char **)&hname); DimMenuBar(); /* * It seems you really want to play. */ u.uhp = 1; /* prevent RIP on early quits */ finder_file_request (); dlb_init(); /* must be before newgame() */ /* * Initialize the vision system. This must be before mklev() on a * new game or before a level restore on a saved game. */ vision_init(); display_gamewindows(); #ifdef WIZARD if (wizard) Strcpy(plname, "wizard"); else #endif if(!*plname || !strncmp(plname, "player", 4) || !strncmp(plname, "games", 4)) askname(); plnamesuffix(); /* strip suffix from name; calls askname() */ /* again if suffix was whole name */ /* accepts any suffix */ Sprintf (lock, "%d%s", getuid (), plname); getlock (); if ((fd = restore_saved_game()) >= 0) { #ifdef WIZARD /* Since wizard is actually flags.debug, restoring might * overwrite it. */ boolean remember_wiz_mode = wizard; #endif #ifdef NEWS if(iflags.news) { display_file(NEWS, FALSE); iflags.news = FALSE; /* in case dorecover() fails */ } #endif pline("Restoring save file..."); mark_synch(); /* flush output */ game_active = 1; if (dorecover(fd)) { #ifdef WIZARD if(!wizard && remember_wiz_mode) wizard = TRUE; #endif check_special_room(FALSE); if (discover || wizard) { if(yn("Do you want to keep the save file?") == 'n') (void) delete_savefile(); else { compress_area(FILE_AREA_SAVE, SAVEF); } } } else { fd = -1; /* set bad status */ } } if (fd < 0) { player_selection(); game_active = 1; /* done with selection, draw active game window */ newgame(); set_wear(); (void) pickup(1); } if (discover) You("are in non-scoring discovery mode."); flags.move = 0; UndimMenuBar (); /* Yes, this is the place for it (!) */ moveloop(); exit(EXIT_SUCCESS); /*NOTREACHED*/ return 0; } static OSErr copy_file(short src_vol, long src_dir, short dst_vol, long dst_dir, Str255 fName, pascal OSErr (*opener)(short vRefNum, long dirID, ConstStr255Param fileName, signed char permission, short *refNum)) { short src_ref, dst_ref; OSErr err = (*opener)(src_vol, src_dir, fName, fsRdPerm, &src_ref); if (err == noErr) { err = (*opener)(dst_vol, dst_dir, fName, fsWrPerm, &dst_ref); if (err == noErr) { long file_len; err = GetEOF(src_ref, &file_len); if (err == noErr) { Handle buf; long count = MaxBlock(); if (count > file_len) count = file_len; buf = NewHandle(count); err = MemError(); if (err == noErr) { while (count > 0) { OSErr rd_err = FSRead(src_ref, &count, *buf); err = FSWrite(dst_ref, &count, *buf); if (err == noErr) err = rd_err; file_len -= count; } if (file_len == 0) err = noErr; DisposeHandle(buf); } } FSClose(dst_ref); } FSClose(src_ref); } return err; } static void force_hdelete(short vol, long dir, Str255 fName) { HRstFLock(vol, dir, fName); HDelete (vol, dir, fName); } void process_openfile (short src_vol, long src_dir, Str255 fName, OSType ftype) { OSErr err = noErr; if (ftype != SAVE_TYPE) return; /* only deal with save files */ if (src_vol != theDirs.dataRefNum || src_dir != theDirs.dataDirID && CatMove(src_vol, src_dir, fName, theDirs.dataDirID, "\p:") != noErr) { HCreate(theDirs.dataRefNum, theDirs.dataDirID, fName, MAC_CREATOR, SAVE_TYPE); err = copy_file(src_vol, src_dir, theDirs.dataRefNum, theDirs.dataDirID, fName, &HOpen); /* HOpenDF is only there under 7.0 */ if (err == noErr) err = copy_file(src_vol, src_dir, theDirs.dataRefNum, theDirs.dataDirID, fName, &HOpenRF); if (err == noErr) force_hdelete(src_vol, src_dir, fName); else HDelete(theDirs.dataRefNum, theDirs.dataDirID, fName); } if (err == noErr) { short ref; ref = HOpenResFile(theDirs.dataRefNum, theDirs.dataDirID, fName, fsRdPerm); if (ref != -1) { Handle name = Get1Resource('STR ', PLAYER_NAME_RES_ID); if (name) { Str255 save_f_p; P2C(*(StringHandle)name, plname); set_savefile_name(); C2P(fqname(SAVEF, SAVEPREFIX, 0), save_f_p); force_hdelete(theDirs.dataRefNum, theDirs.dataDirID, save_f_p); if (HRename(theDirs.dataRefNum, theDirs.dataDirID, fName, save_f_p) == noErr) macFlags.gotOpen = 1; } CloseResFile(ref); } } } static void finder_file_request(void) { if (macFlags.hasAE) { /* we're capable of handling Apple Events, so let's see if we have any */ EventRecord event; long toWhen = TickCount () + 20; /* wait a third of a second for all initial AE */ while (TickCount () < toWhen) { if (WaitNextEvent (highLevelEventMask, &event, 3L, 0)) { AEProcessAppleEvent(&event); if (macFlags.gotOpen) break; } } } #if 0 #ifdef MAC68K else { short finder_msg, file_count; CountAppFiles(&finder_msg, &file_count); if (finder_msg == appOpen && file_count == 1) { OSErr err; AppFile src; FSSpec filespec; GetAppFiles(1, &src); err = FSMakeFSSpec(src.vRefNum, 0, src.fName, &filespec); if (err == noErr && src.fType == SAVE_TYPE) { process_openfile (filespec.vRefNum, filespec.parID, filespec.name, src.fType); if (macFlags.gotOpen) ClrAppFiles(1); } } } #endif /* MAC68K */ #endif /* 0 */ } /*macmain.c*/ slashem-0.0.7E7F3/sys/mac/macerrs.c0000664000076400007640000000765710545462317015051 0ustar aliali/* SCCS Id: @(#)macerrs.c 3.1 93/01/24 */ /* Copyright (c) Michael Hamel, 1991 */ /* NetHack may be freely redistributed. See license for details. */ #if defined(__SC__) && !defined(__FAR_CODE__) /* this needs to be resident always */ #pragma segment Main #endif #include "hack.h" #include "macwin.h" #if !TARGET_API_MAC_CARBON #include #include #include #endif void error(const char *format,...) { Str255 buf; va_list ap; va_start(ap, format); vsprintf((char *)buf, format, ap); va_end(ap); C2P((char *)buf, buf); ParamText(buf, (StringPtr)"", (StringPtr)"", (StringPtr)""); Alert(128, (ModalFilterUPP) NULL); ExitToShell(); } #if 0 /* Remainder of file is obsolete and will be removed */ #define stackDepth 1 #define errAlertID 129 #define stdIOErrID 1999 static Str255 gActivities[stackDepth] = {""}; static short gTopactivity = 0; void showerror(char * errdesc, const char * errcomment) { short itemHit; Str255 paserr, pascomment; SetCursor(&qd.arrow); if (errcomment == nil) errcomment = ""; C2P (errcomment, pascomment); C2P (errdesc, paserr); ParamText(paserr,pascomment,gActivities[gTopactivity],(StringPtr)""); itemHit = Alert(errAlertID, (ModalFilterUPP)nil); } Boolean itworked(short errcode) /* Return TRUE if it worked, do an error message and return false if it didn't. Error strings for native C errors are in STR#1999, Mac errs in STR 2000-errcode, e.g 2108 for not enough memory */ { if (errcode != 0) { short itemHit; Str255 errdesc; StringHandle strh; errdesc[0] = '\0'; if (errcode > 0) GetIndString(errdesc,stdIOErrID,errcode); /* STDIO file rres, etc */ else { strh = GetString(2000-errcode); if (strh != (StringHandle) nil) { memcpy(errdesc,*strh,256); ReleaseResource((Handle)strh); } } if (errdesc[0] == '\0') { /* No description found, just give the number */ sprintf((char *)&errdesc[1],"a %d error occurred",errcode); errdesc[0] = strlen((char*)&errdesc[1]); } SetCursor(&qd.arrow); ParamText(errdesc,(StringPtr)"",gActivities[gTopactivity],(StringPtr)""); itemHit = Alert(errAlertID, (ModalFilterUPP)nil); } return(errcode==0); } void mustwork(short errcode) /* For cases where we can't recover from the error by any means */ { if (itworked(errcode)) ; else ExitToShell(); } #if defined(USE_STDARG) || defined(USE_VARARGS) # ifdef USE_STDARG static void vprogerror(const char *line, va_list the_args); # else static void vprogerror(); # endif /* Macro substitute for error() */ void error VA_DECL(const char *, line) VA_START(line); VA_INIT(line, char *); vprogerror(line, VA_ARGS); VA_END(); } # ifdef USE_STDARG static void vprogerror(const char *line, va_list the_args) { # else static void vprogerror(line, the_args) const char *line; va_list the_args; { # endif #else /* USE_STDARG | USE_VARARG */ void error VA_DECL(const char *, line) #endif /* Do NOT use VA_START and VA_END in here... see above */ char pbuf[BUFSZ]; if(index(line, '%')) { Vsprintf(pbuf,line,VA_ARGS); line = pbuf; } 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; short itemHit; sprintf((char *)&paserr[1], "%s - %d",s,n); paserr[0] = strlen ((char*)&paserr[1]); ParamText(paserr,(StringPtr)"",(StringPtr)"",(StringPtr)""); itemHit = Alert(128, (ModalFilterUPP)nil); } void pushattemptingto(char * activity) /* Push a new description onto stack so we can pop later to previous state */ { if (gTopactivity < stackDepth) { gTopactivity++; attemptingto(activity); } else error("activity stack overflow"); } void popattempt(void) /* Pop to previous state */ { if (gTopactivity > 1) --gTopactivity; else error("activity stack underflow"); } #endif /* Obsolete */ slashem-0.0.7E7F3/sys/mac/mmodal.c0000664000076400007640000000132110545462317014644 0ustar aliali/* SCCS Id: @(#)mmodal.c 3.1 93/01/24 */ /* Copyright (c) Jon W{tte, Hao-Yang Wang, Jonathan Handler 1992. */ /* NetHack may be freely redistributed. See license for details. */ #if !TARGET_API_MAC_CARBON # include # include #else # include #endif #include "macpopup.h" /* Flash a dialog button when its accelerator key is pressed */ void FlashButton(DialogRef wind, short item) { short type; Handle handle; Rect rect; unsigned long ticks; /* Apple recommends 8 ticks */ GetDialogItem(wind, item, &type, &handle, &rect); HiliteControl((ControlHandle)handle, kControlButtonPart); Delay(8, &ticks); HiliteControl((ControlHandle)handle, 0); return; } slashem-0.0.7E7F3/sys/mac/News0000664000076400007640000000052110545462317014067 0ustar alialiWelcome to Macintosh Slash'EM This game is a modified version of NetHack (brought to you by Dean Luick, Kevin Hugo, and Mark Modrall), with enhancements by Warren Cheung, J Ali Harlow, et aliud. The Macintosh version was made by Paul Hurtley. Bug reports, suggestions and comments can be submitted via our web page, www.slashem.org. slashem-0.0.7E7F3/sys/mac/MacHelp0000664000076400007640000001551210545462317014472 0ustar aliali Macintosh-specific help file for Slash'EM The following are options, features, or concerns specific to the MacOS Classic port of Slash'EM. Bug reports, suggestions, comments, and so on can be sent via our web page www.slashem.org Please include your machine-type, system software version and other relevant information (eg, system extensions, monitor, accelerators) === Configuration of a playground Slash'EM is packaged in a Dungeon Folder which contains: Slash'EM - the application file itself. Slash'EM Defaults - text file for default option settings. License - licensing terms for Slash'EM. MacHelp - this help file. Guidebook - description of the game in long format. Recover - an application to restore save files from crashed games. Previous versions had a large number of data files in the Dungeon Folder. These are now packaged as resources inside the application file and will no longer appear in the Dungeon Folder. During play another file type appears: Player level files (labelled "iName.n", i is a constant number, Name is the player name and n is the dungeon level). Other types of files appear in the Dungeon Folder as a result of playing Slash'EM: record - top score file. logfile - lists results of all completed games. Bones files (of previously deceased players). Saved games (labelled "save/iName", i is a number, same as above, and Name is the player name). The following files or file types may be thrown away: record - top score file. A new one will be generated. logfile - if it becomes too large. A new one will be generated. Player level files _not_ belonging to a game in progress. Alternatively, these files may be processed by Recover, which may be able to restore a save file from the level files. Old bones files and saved games. === Resuming a saved game Double-click (or open) the desired saved game file or open Slash'EM and answer the "Who are you?" dialog with the player name of the saved game in the Dungeon Folder. === Windows The Dungeon Map and Message windows are the essential windows used during window-mode play. During tty-mode play there is only one window which displays the map, messages, lists and other info. For window-mode play, lists (eg, the list of objects that may be wielded) and special info windows appear as needed. Windows may be closed by clicking their close box The list windows may also be dismissed by hitting the space bar (or Return or Enter Keys). Hitting the ESCape key will dismiss special windows without scrolling to the end. The command "Reposition" on the File menu may be used to restore the startup sizes and locations of the various windows. The window positions are saved in a file labelled "Slash'EM Preferences" in the Preferences Folder. === Default options The following options are specific to the Macintosh port: Macgraphics - use enhanced dungeon map symbols [TRUE] page_wait - display --MORE-- after messages [TRUE] Default options may be set by editing the Slash'EM Defaults text file (using SimpleText or your favorite editor). The following notation is used: OPTIONS=name:Arnold,time,!tombstone It should also be mentioned here that there are two graphic interface modes available: 'mac' and 'tty'. Choosing between these interfaces is accomplished by the option: window:mac - the default multi-window Macintosh(tm) interface. window:tty - traditional Unix(tm)-style TTY window interface. See option help (?f or ?g) for more details. === Movement by mouse The shape (direction) of the cursor over the Dungeon Map window, typically, indicates the direction that you desire to move in when the mouse is clicked. Modifier keys affect mouse-movement in the same way that they affect keyboard movement. Clicking on yourself means rest one turn and Shift-clicking on yourself means "open door" in the subsequently indicated direction. === Sounds Real sounds (resources) have been added for various instruments. The option "silent" [FALSE] controls whether or not a sound will be heard when an instrument is applied. === Explore and Debug Modes You can enter Explore (aka Discover) mode or Debug (aka Wizard) mode by choosing the appropriate entries on the 'Mode' popup-menu section of the "Who are you?" startup dialog. This same dialog allows you to specify your role, race, gender, alignment, and name. Starting in Explore mode is essentially the same as playing in Regular mode except that if you are killed then you are given an opportunity to override your death. Because of this advantage, your Explore mode scores are not entered on the scoreboard record. You also get a wand of wishing in your starting inventory and can see your intrinsic abilities using the command ctl-X (also available on the 'Explore' submenu on the File menu). Starting in Debug mode is only intended for developers and others interested in characterizing bugs. Using this mode for other purposes will have confusing results and may eliminate your enjoyment of the game! === Menus The menus provide access to all the Slash'EM commands and a special 'Keypress' menu is provided to facilitate play using only the mouse. In some cases, a command may appear on more than one menu. In general, the commands have been grouped to appear on an appropriate menu: File - commands related to windows, start mode and play control. Help - info commands generally not related to a specific game (eg, key descriptions, version info, option editor). Info - commands that are generally game-specific (eg, inventory related, describe features seen on the map or name things). Equip - commands related to things you might wield or wear. Action- commands for actions that you might do alone (eg, wait, jump) or do with another dungeon denizen (eg, pay, chat). Magic - commands for things that you might do with items (drop, eat, read) or spell-related. Bits - commands for things you might do to dungeon pieces (eg, open door, loot chest, engrave on the floor, climb stairs). The key related to a command generally appears to the left of the menu entry for that command (eg, w for wield and W for wear). A leftmost # denotes an extended command (without a related key) and a left cloverleaf or command symbol denotes a command that requires either a control or command key modifier (ie, holding down the control or command key while hitting the related key). === We hope you enjoy this game. slashem-0.0.7E7F3/sys/mac/macunix.c0000664000076400007640000000144310545462317015044 0ustar aliali/* SCCS Id: @(#)macunix.c 3.1 94/11/07 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ /* This file collects some Unix dependencies */ #include "hack.h" void regularize(char *s) { register char *lp; for (lp = s; *lp; lp++) { if (*lp == '.' || *lp == ':') *lp = '_'; } } void getlock(void) { int fd; int pid = getpid(); /* Process ID */ set_levelfile_name (lock, 0); if ((fd = open (lock, O_RDWR | O_EXCL | O_CREAT, LEVL_TYPE)) == -1) { raw_printf ("Could not lock the game %s.", lock); panic ("Another game in progress?"); } if (write (fd, (char *)&pid, sizeof (pid)) != sizeof (pid)) { raw_printf ("Could not lock the game %s.", lock); panic("Disk locked?"); } close (fd); } slashem-0.0.7E7F3/sys/mac/Install.mw0000664000076400007640000002224210545462317015207 0ustar alialiBuilding a PPC Slash'EM with the Metrowerks compilers You must be familiar with the Metrowerks compiler and know how to construct projects. The Slash'EM source does not come with the four pre-made projects that are needed to build NetHack and the files it needs, due to license restrictions. These four projects go in :sys:mac and are MakeDefs.u, DgnComp.u, LevComp.u, and SlashEM.u. If you wish to construct them yourself, see the section "Project Contents" below. Note that this file is a lightly edited version of the instructions from the NetHack package, and hasn't been fully tested for Slash'EM. 1. Create each project as needed, in the order given below. 2. Create a folder "lib" in the top level. This is where the files used by Slash'EM will be deposited by MakeDefs, DgnComp, and LevComp. 3. Build and run MakeDefs. You will be presented with a list of options. Initially choose them all (the default). Later you may wish to only run a few of them. The options are "odemvpqrhz", each of which makes a file: -o creates :include:onames.h -p creates :include:pm.h -z creates :src:vis_tab.c -m creates :src:monstr.c -e creates :dat:dundeon.pdf -v creates :lib:options -d creates :lib:data -r creates :lib:rumors -h creates :lib:oracles -q creates :lib:quest.dat 4. If you are _not_ using DLB, follow these directions. Currently DLB is ON for the Mac. Copy the following files. You may want to change News or NHDeflts. a. copy ':sys:mac:MacHelp' to ':lib:MacHelp' b. copy ':sys:mac:News' to ':lib:News' c. copy ':sys:mac:NHDeflts' to ':lib:Slash'EM Defaults' d. copy ':dat:cmdhelp' to ':lib:cmdhelp' e. copy ':dat:help' to ':lib:help' f. copy ':dat:hh' to 'lib:hh' g. copy ':dat:history' to ':lib:history' h. copy ':dat:license' to ':lib:license' i. copy ':dat:opthelp' to ':lib:opthelp' j. copy ':dat:wizhelp' to ':lib:wizhelp' 5. Create an empty file, ':lib:record' 6. Build and run DgnComp. This will create a file "dungeon" in the lib directory. 7. Build and run LevComp. This will build the level files (*.lev) in the lib directory. 8. Build Slash'EM. Move Slash'EM into the lib directory. ------------------------ Building Slash'EM with MetroWerks IDE 1.x To build Slash'EM, you will need to create four projects at the top level of the Slash'EM directory tree. These four projects are MakeDefs.u, DgnComp.u, LevComp.u, and SlashEM.u. The projects don't have to end in ".u", but you should append some form of ".XXX" to the end of the project's name to distinguish the project from the executable that it produces. The files and libraries to include in these projects are listed in the "Project Contents" section below. You must create and run Makedefs before creating Slash'EM because MakeDefs will create files used by Slash'EM. Use the MacOS C/C++ template for each of the projects. The libraries included will be overkill for all the projects (e.g. the C++ libraries are not needed). Add the .c and resource files as indicated below. Unless otherwise noted, the projects can use the default preferences: Font The tabbing on all non-mac files is 8. All mac files have a tab of 4. PPC Processor All projects must have the same alignment to build a consistent Slash'EM. To share save files with 68K, the alignments must match for their projects, as well. Turn on Global Optimization (official version is compiled with level 1). If you don't turn it on, some files may not compile because of register overflow. [Slash'EM only] PPC Project Set name to Other settings [Slash'EM only] creator: sLem preferred heap size:3000 minimum heap size: 2000 stack size: 128 [PPC only] The SIOUX library may be replaced with console.stubs.c for the Slash'EM project. NOTE: Currently you must turn on OLDROUTINENAMES -- so you can't use the default pre-compiled header. You should either remove it from the preferences or insert another precompiled header that has this define off. ------------------------ Building Slash'EM with MetroWerks IDE 2.0. This is for building a PowerPC version only. This doesn't take advantage of the IDE's subprojects. These will be investigated later. MakeDefs.u, DgnComp.u, LevComp.u: Select ANSI C Console PPC. Settings: PPC Target + Change File Name to MakeDefs, DgnComp, or LevComp respectively. C/C++ Language + Turn off ANSI strict, ANSI Keywords Only, Expand Trigraphs PPC Processor + Turn on global optimization (at least to level 1) SlashEM.u: Basic ToolBox PPC PPC Target + Change File Name to Slash'EM. Other settings creator: sLem preferred heap size:3000 minimum heap size: 2000 stack size: 128 [PPC only] C/C++ Language + Options ANSI strict, ANSI Keywords Only, Expand Trigraphs are already turned off, so you don't have to do anything. PPC Processor + Turn on global optimization (at least to level 1) ------------------------ Creating projects for Slash'EM with MetroWerks IDE 3.3 (Pro 4) This is what the NetHack devteam changed from the default settings when creating a 68K version. Some of the settings may not be necessary. For example, Slash'EM doesn't use floating point, so we don't have to check 8 byte doubles. Some are interrelated. For example, the codegen and the Math and MSL libraries used. For MakeDefs.u, DgnComp.u, LevComp.u: 1. Select File>>New Project...>>MacOS>>C_C++>>Standard Console>>Std C Console 68K 2. 68K Settings: Target Settings: + Set "Target Name" to {MakeDefs,DgnComp,LevComp}. 68K Target: + Set "File Name" to {MakeDefs,DgnComp,LevComp}. C/C++ Language: + Check Require Function Prototypes, uncheck everything else. + Clear "Prefix File". 68K Processor: + Set "Code Model" to Large. + Check 68020 Codegen, 4-Byte Ints, 8-Byte Doubles, Far Data, Far Method Tables, Far String Constants. Uncheck everything else. 3. Libraries 68K + Remove the C++ Library (it is not needed). + Change math library to MathLib68K Fa(4i_8d).Lib. + Change MSL C library to MSL C.68K Fa(4i_8d).Lib. Note: The actual libraries used must match the CodeGen options in 68K Processor. For SlashEM.u: 1. Select File>>New Project...>>MacOS>>C_C++>>MacOS ToolBox>>MacOS ToolBox 68K 2. 68K Settings Target Settings: + Set "Target Name" to Slash'EM Debug and Slash'EM Final. 68K Target: + Set "File Name" to Slash'EM Debug and Slash'EM Final. + Set "Creator" to 'sLem'. + Set "Preferred Heap Size (k)" to 3000. + Set "Minimum Heap Size (k)" to 2000. C/C++ Language: + Check Require Function Prototypes, uncheck everything else. + Set "Prefix File" to LocalDefines.h. I use this header to define OLDROUTINENAMES because the pre-compiled header doesn't have it set any more. One of these days we'll fix up the code... 68K Processor: + Set "Code Model" to Large. + Check 68020 Codegen, 4-Byte Ints, 8-Byte Doubles, Far Data, Far Method Tables, Far String Constants. Uncheck everything else. 3. Libraries 68K + Remove the C++ Library (it is not needed). + Change math library to MathLib68K Fa(4i_8d).Lib. + Change MSL C library to MSL C.68K Fa(4i_8d).Lib. Note: The actual libraries used must match the CodeGen options in 68K Processor. For Recover.u: 1. Select File>>New Project...>>MacOS>>C_C++>>MacOS ToolBox>>MacOS ToolBox 68K 2. 68K Settings Target Settings: + Set "Target Name" to Recover Debug and Recover Final. 68K Target: + Set "File Name" to Recover Debug and Recover Final. + Set "Creator" to 'nhRc'. C/C++ Language: + Check Require Function Prototypes, uncheck everything else. + Set "Prefix File" to LocalDefines.h. I use this header to define OLDROUTINENAMES because the pre-compiled header doesn't have it set any more. One of these days we'll fix up the code... 68K Processor: + Set "Code Model" to Large. + Check 68020 Codegen, 4-Byte Ints, 8-Byte Doubles, Far Data, Far Method Tables, Far String Constants. Uncheck everything else. 3. Libraries 68K + Remove the C++ Library (it is not needed). + Change math library to MathLib68K Fa(4i_8d).Lib. + Change MSL C library to MSL C.68K Fa(4i_8d).Lib. Note: The actual libraries used must match the CodeGen options in 68K Processor. ------------------------ Project Contents: MakeDefs.u should contain the following source files: src objects.c monst.c util makedefs.c DgnComp.u should contain the following source files: src alloc.c sys:share dgn_lex.c dgn_yacc.c util dgn_main.c panic.c LevComp.u should contain the following source files: src alloc.c decl.c drawing.c monst.c objects.c sys:mac macerrs.c macfile.c sys:share lev_lex.c lev_yacc.c util lev_main.c panic.c SlashEM.u should contain the following source files: src *.c [can do an add all] sys:mac *.c except mrecover.c NetHack.rsrc machelp.bh [for baloon help] Sound.rsrc [if you wish to have a few, crude sounds] Files.r [if you use DLB (on by default)] sys:share random.c win:tty *.c [can do an add all - termcap.c is not needed, but will compile to nothing] Note: src:monstr.c and src:vis_tab.c are created by MakeDefs -m and -s respectively. Recover.u should contain the following source files: sys:mac mrecover.c mrecover.rsrc slashem-0.0.7E7F3/sys/mac/mrecover.c0000664000076400007640000007426310545462317015234 0ustar aliali/* SCCS Id: @(#)mrecover.c 3.4 1996/07/24 */ /* Copyright (c) David Hairston, 1993. */ /* NetHack may be freely redistributed. See license for details. */ /* Macintosh Recovery Application */ /* based on code in util/recover.c. the significant differences are: * - GUI vs. CLI. the vast majority of code here supports the GUI. * - Mac toolbox equivalents are used in place of ANSI functions. * - void restore_savefile(void) is event driven. * - integral type substitutions here and there. */ /* * Think C 5.0.4 project specs: * signature: 'nhRc' * SIZE (-1) info: flags: 0x5880, size: 65536L/65536L (64k/64k) * libraries: MacTraps [yes], MacTraps2 (HFileStuff) [yes], ANSI [no] * compatibility: system 6 and system 7 * misc: sizeof(int): 2, "\p": unsigned char, enum size varies, * prototypes required, type checking enforced, no optimizers, * FAR CODE [no], FAR DATA [no], SEPARATE STRS [no], single segment, * short macsbug symbols */ /* * To do (maybe, just maybe): * - Merge with the code in util/recover.c. * - Document launch (e.g. GUI equivalent of 'recover basename'). * - Drag and drop. * - Internal memory tweaks (stack and heap usage). * - Use status file to allow resuming aborted recoveries. * - Bundle 'LEVL' files with recover (easier document launch). * - Prohibit recovering games "in progress". * - Share AppleEvents with NetHack to auto-recover crashed games. */ #include "config.h" /**** Toolbox defines ****/ /* MPW C headers (99.44% pure) */ #include #include #include #include #ifdef applec #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #ifdef THINK /* glue for System 7 Icon Family call (needed by Think C 5.0.4) */ pascal OSErr GetIconSuite(Handle *theIconSuite, short theResID, long selector) = {0x303C, 0x0501, 0xABC9}; #endif #if defined(MAC_MPW) QDGlobals qd; #endif #define ResetAlrtStage ResetAlertStage #define SetDItem SetDialogItem #define GetDItem GetDialogItem #define GetItem GetMenuItemText #define DisposHandle DisposeHandle #define AddResMenu AppendResMenu #define DisposPtr DisposePtr #define ResrvMem ReserveMem /**** Application defines ****/ /* Memory */ typedef struct memBytes /* format of 'memB' resource, preloaded/locked */ { short memReserved; short memCleanup; /* 4 - memory monitor activity limit */ long memPreempt; /* 32k - start iff FreeMem() > */ long memWarning; /* 12k - warn if MaxMem() < */ long memAbort; /* 4k - abort if MaxMem() < */ long memIOBuf; /* 16k - read/write buffer size */ } memBytes, *memBytesPtr, **memBytesHandle; #define membID 128 /* 'memB' resource ID */ /* Cursor */ #define CURS_FRAME 4L /* 1/15 second - spin cursor */ #define CURS_LATENT 60L /* pause before spin cursor */ #define curs_Init (-1) /* token for set arrow */ #define curs_Total 8 /* maybe 'acur' would be better */ #define cursorOffset 128 /* GetCursor(cursorOffset + i) */ /* Menu */ enum { mbar_Init = -1, mbarAppl, /* normal mode */ mbarRecover, /* in recovery mode */ mbarDA /* DA in front mode */ }; enum { menuApple, menuFile, menuEdit, menu_Total, muidApple = 128, muidFile, muidEdit }; enum { /* Apple menu */ mitmAbout = 1, mitmHelp, ____128_1, /* File menu */ mitmOpen = 1, ____129_1, mitmClose_DA, ____129_2, mitmQuit /* standard minimum required Edit menu */ }; /* Alerts */ enum { alrtNote, /* general messages */ alrtHelp, /* help message */ alrt_Total, alertAppleMenu = 127, /* menuItem to alert ID offset */ alidNote, alidHelp }; #define aboutBufSize 80 /* i.e. 2 lines of 320 pixels */ /* Notification */ #define nmBufSize (32 + aboutBufSize + 32) typedef struct notifRec { NMRec nmr; struct notifRec * nmNext; short nmDispose; unsigned char nmBuf[nmBufSize]; } notifRec, *notifPtr; #define nmPending nmRefCon /* &in.Notify */ #define iconNotifyID 128 #define ics_1_and_4 0x00000300 /* Dialogs */ enum { dlogProgress = 256 }; enum { uitmThermo = 1 }; enum { initItem, invalItem, drawItem }; /* Miscellaneous */ typedef struct modeFlags { short Front; /* fg/bg event handling */ short Notify; /* level of pending NM notifications */ short Dialog; /* a modeless dialog is open */ short Recover; /* restoration progress index */ } modeFlags; /* convenient define to allow easier (for me) parsing of 'vers' resource */ typedef struct versXRec { NumVersion numVers; short placeCode; unsigned char versStr[]; /* (small string)(large string) */ } versXRec, *versXPtr, **versXHandle; /**** Global variables ****/ modeFlags in = {1}; /* in Front */ EventRecord wnEvt; SysEnvRec sysEnv; unsigned char aboutBuf[aboutBufSize]; /* vers 1 "Get Info" string */ memBytesPtr pBytes; /* memory management */ unsigned short memActivity; /* more memory management */ MenuHandle mHnd[menu_Total]; CursPtr cPtr[curs_Total]; /* busy cursors */ unsigned long timeCursor; /* next cursor frame time */ short oldCursor = curs_Init; /* see adjustGUI() below */ notifPtr pNMQ; /* notification queue pointer */ notifRec nmt; /* notification template */ DialogTHndl thermoTHnd; DialogRecord dlgThermo; /* progress thermometer */ #define DLGTHM ((DialogPtr) &dlgThermo) #define WNDTHM ((WindowPtr) &dlgThermo) #define GRFTHM ((GrafPtr) &dlgThermo) Point sfGetWhere; /* top left corner of get file dialog */ Ptr pIOBuf; /* read/write buffer pointer */ short vRefNum; /* SFGetFile working directory/volume refnum */ long dirID; /* directory i.d. */ NMUPP nmCompletionUPP; /* UPP for nmCompletion */ FileFilterUPP basenameFileFilterUPP; /* UPP for basenameFileFilter */ UserItemUPP drawThermoUPP; /* UPP for progress callback */ #define MAX_RECOVER_COUNT 256 #define APP_NAME_RES_ID (-16396) /* macfile.h */ #define PLAYER_NAME_RES_ID 1001 /* macfile.h */ /* variables from util/recover.c */ #define SAVESIZE FILENAMELEN unsigned char savename[SAVESIZE]; /* originally a C string */ unsigned char lock[256]; /* pascal string */ int hpid; /* NetHack (unix-style) process i.d. */ short saveRefNum; /* save file descriptor */ short gameRefNum; /* level 0 file descriptor */ short levRefNum; /* level n file descriptor */ /**** Prototypes ****/ static void warmup(void); static Handle alignTemplate(ResType, short, short, short, Point *); pascal void nmCompletion(NMRec *); static void noteErrorMessage(unsigned char *, unsigned char *); static void note(short, short, unsigned char *); static void adjustGUI(void); static void adjustMemory(void); static void optionMemStats(void); static void RecoverMenuEvent(long); static void eventLoop(void); static void cooldown(void); pascal void drawThermo(WindowPtr, short); static void itemizeThermo(short); pascal Boolean basenameFileFilter(ParmBlkPtr); static void beginRecover(void); static void continueRecover(void); static void endRecover(void); static short saveRezStrings(void); /* analogous prototypes from util/recover.c */ static void set_levelfile_name(long); static short open_levelfile(long); static short create_savefile(unsigned char *); static void copy_bytes(short, short); static void restore_savefile(void); /* auxiliary prototypes */ static long read_levelfile(short, Ptr, long); static long write_savefile(short, Ptr, long); static void close_file(short *); static void unlink_file(unsigned char *); /**** Routines ****/ main() { /* heap adjust */ MaxApplZone(); MoreMasters(); MoreMasters(); /* manager initialization */ InitGraf(&qd.thePort); InitFonts(); InitWindows(); InitMenus(); TEInit(); InitDialogs(0L); InitCursor(); nmCompletionUPP = NewNMProc(nmCompletion); basenameFileFilterUPP = NewFileFilterProc(basenameFileFilter); drawThermoUPP = NewUserItemProc(drawThermo); /* get system environment, notification requires 6.0 or better */ (void) SysEnvirons(curSysEnvVers, &sysEnv); if (sysEnv.systemVersion < 0x0600) { ParamText("\pAbort: System 6.0 is required", "\p", "\p", "\p"); (void) Alert(alidNote, (ModalFilterUPP) 0L); ExitToShell(); } warmup(); eventLoop(); /* normally these routines are never reached from here */ cooldown(); ExitToShell(); return 0; } static void warmup() { short i; /* pre-System 7 MultiFinder hack for smooth launch */ for (i = 0; i < 10; i++) { if (WaitNextEvent(osMask, &wnEvt, 2L, (RgnHandle) 0L)) if (((wnEvt.message & osEvtMessageMask) >> 24) == suspendResumeMessage) in.Front = (wnEvt.message & resumeFlag); } #if 0 // ??? /* clear out the Finder info */ { short message, count; CountAppFiles(&message, &count); while(count) ClrAppFiles(count--); } #endif /* fill out the notification template */ nmt.nmr.qType = nmType; nmt.nmr.nmMark = 1; nmt.nmr.nmSound = (Handle) -1L; /* system beep */ nmt.nmr.nmStr = nmt.nmBuf; nmt.nmr.nmResp = nmCompletionUPP; nmt.nmr.nmPending = (long) &in.Notify; #if 1 { /* get the app name */ ProcessInfoRec info; ProcessSerialNumber psn; info.processInfoLength = sizeof(info); info.processName = nmt.nmBuf; info.processAppSpec = NULL; GetCurrentProcess(&psn); GetProcessInformation(&psn, &info); } #else /* prepend app name (31 chars or less) to notification buffer */ { short apRefNum; Handle apParams; GetAppParms(* (Str255 *) &nmt.nmBuf, &apRefNum, &apParams); } #endif /* add formatting (two line returns) */ nmt.nmBuf[++(nmt.nmBuf[0])] = '\r'; nmt.nmBuf[++(nmt.nmBuf[0])] = '\r'; /**** note() is usable now but not aesthetically complete ****/ /* get notification icon */ if (sysEnv.systemVersion < 0x0700) { if (! (nmt.nmr.nmIcon = GetResource('SICN', iconNotifyID))) note(nilHandleErr, 0, "\pNil SICN Handle"); } else { if (GetIconSuite(&nmt.nmr.nmIcon, iconNotifyID, ics_1_and_4)) note(nilHandleErr, 0, "\pBad Icon Family"); } /* load and align various dialog/alert templates */ (void) alignTemplate('ALRT', alidNote, 0, 4, (Point *) 0L); (void) alignTemplate('ALRT', alidHelp, 0, 4, (Point *) 0L); thermoTHnd = (DialogTHndl) alignTemplate('DLOG', dlogProgress, 20, 8, (Point *) 0L); (void) alignTemplate('DLOG', getDlgID, 0, 6, (Point *) &sfGetWhere); /* get the "busy cursors" (preloaded/locked) */ for (i = 0; i < curs_Total; i++) { CursHandle cHnd; if (! (cHnd = GetCursor(i + cursorOffset))) note(nilHandleErr, 0, "\pNil CURS Handle"); cPtr[i] = *cHnd; } /* get the 'vers' 1 long (Get Info) string - About Recover... */ { versXHandle vHnd; if (! (vHnd = (versXHandle) GetResource('vers', 1))) note(nilHandleErr, 0, "\pNil vers Handle"); i = (**vHnd).versStr[0] + 1; /* offset to Get Info pascal string */ if ((aboutBuf[0] = (**vHnd).versStr[i]) > (aboutBufSize - 1)) aboutBuf[0] = aboutBufSize - 1; i++; MoveHHi((Handle) vHnd); /* DEE - Fense ... */ HLock((Handle) vHnd); BlockMove(&((**vHnd).versStr[i]), &(aboutBuf[1]), aboutBuf[0]); ReleaseResource((Handle) vHnd); } /* form the menubar */ for (i = 0; i < menu_Total; i++) { if (! (mHnd[i] = GetMenu(i + muidApple))) note(nilHandleErr, 0, "\pNil MENU Handle"); /* expand the apple menu */ if (i == menuApple) AddResMenu(mHnd[menuApple], 'DRVR'); InsertMenu(mHnd[i], 0); } /* pre-emptive memory check */ { memBytesHandle hBytes; Size grow; if (! (hBytes = (memBytesHandle) GetResource('memB', membID))) note(nilHandleErr, 0, "\pNil Memory Handle"); pBytes = *hBytes; if (MaxMem(&grow) < pBytes->memPreempt) note(memFullErr, 0, "\pMore Memory Required\rTry adding 16k"); memActivity = pBytes->memCleanup; /* force initial cleanup */ } /* get the I/O buffer */ if (! (pIOBuf = NewPtr(pBytes->memIOBuf))) note(memFullErr, 0, "\pNil I/O Pointer"); } /* align a window-related template to the main screen */ static Handle alignTemplate(ResType rezType, short rezID, short vOff, short vDenom, Point *pPt) { Handle rtnHnd; Rect *pRct; vOff += GetMBarHeight(); if (! (rtnHnd = GetResource(rezType, rezID))) note(nilHandleErr, 0, "\pNil Template Handle"); pRct = (Rect *) *rtnHnd; /* don't move memory while aligning rect */ pRct->right -= pRct->left; /* width */ pRct->bottom -= pRct->top; /* height */ pRct->left = (qd.screenBits.bounds.right - pRct->right) / 2; pRct->top = (qd.screenBits.bounds.bottom - pRct->bottom - vOff) / vDenom; pRct->top += vOff; pRct->right += pRct->left; pRct->bottom += pRct->top; if (pPt) *pPt = * (Point *) pRct; /* top left corner */ return rtnHnd; } /* notification completion routine */ pascal void nmCompletion(NMRec * pNMR) { (void) NMRemove(pNMR); (* (short *) (pNMR->nmPending))--; /* decrement pending note level */ ((notifPtr) pNMR)->nmDispose = 1; /* allow DisposPtr() */ } /* * handle errors inside of note(). the error message is appended to the * given message but on a separate line and must fit within nmBufSize. */ static void noteErrorMessage(unsigned char *msg, unsigned char *errMsg) { short i = nmt.nmBuf[0] + 1; /* insertion point */ BlockMove(&msg[1], &nmt.nmBuf[i], msg[0]); nmt.nmBuf[i + msg[0]] = '\r'; nmt.nmBuf[0] += (msg[0] + 1); note(memFullErr, 0, errMsg); } /* * display messages using Notification Manager or an alert. * no run-length checking is done. the messages are created to fit * in the allocated space (nmBufSize and aboutBufSize). */ static void note(short errorSignal, short alertID, unsigned char *msg) { if (! errorSignal) { Size grow; if (MaxMem(&grow) < pBytes->memAbort) noteErrorMessage(msg, "\pOut of Memory"); } if (errorSignal || !in.Front) { notifPtr pNMR; short i = nmt.nmBuf[0] + 1; /* insertion point */ if (errorSignal) /* use notification template */ { pNMR = &nmt; /* we're going to abort so add in this prefix */ BlockMove("Abort: ", &nmt.nmBuf[i], 7); i += 7; nmt.nmBuf[0] += 7; } else /* allocate a notification record */ { if (! (pNMR = (notifPtr) NewPtr(sizeof(notifRec)))) noteErrorMessage(msg, "\pNil New Pointer"); /* initialize it */ *pNMR = nmt; pNMR->nmr.nmStr = (StringPtr) &(pNMR->nmBuf); /* update the notification queue */ if (!pNMQ) pNMQ = pNMR; else { notifPtr pNMX; /* find the end of the queue */ for (pNMX = pNMQ; pNMX->nmNext; pNMX = pNMX->nmNext) ; pNMX->nmNext = pNMR; } } /* concatenate the message */ BlockMove(&msg[1], &((pNMR->nmBuf)[i]), msg[0]); (pNMR->nmBuf)[0] += msg[0]; in.Notify++; /* increase note pending level */ NMInstall((NMRec *) pNMR); if (errorSignal) cooldown(); return; } /* in front and no error so use an alert */ ParamText(msg, "\p", "\p", "\p"); (void) Alert(alertID, (ModalFilterUPP) 0L); ResetAlrtStage(); memActivity++; } static void adjustGUI() { static short oldMenubar = mbar_Init; /* force initial update */ short newMenubar; WindowPeek frontWindow; /* oldCursor is external so it can be reset in endRecover() */ static short newCursor = curs_Init; unsigned long timeNow; short useArrow; /* adjust menubar 1st */ newMenubar = in.Recover ? mbarRecover : mbarAppl; /* desk accessories take precedence */ if (frontWindow = (WindowPeek) FrontWindow()) if (frontWindow->windowKind < 0) newMenubar = mbarDA; if (newMenubar != oldMenubar) { /* adjust menus */ switch (oldMenubar = newMenubar) { case mbarAppl: EnableItem(mHnd[menuFile], mitmOpen); SetItemMark(mHnd[menuFile], mitmOpen, noMark); DisableItem(mHnd[menuFile], mitmClose_DA); DisableItem(mHnd[menuEdit], 0); break; case mbarRecover: DisableItem(mHnd[menuFile], mitmOpen); SetItemMark(mHnd[menuFile], mitmOpen, checkMark); DisableItem(mHnd[menuFile], mitmClose_DA); DisableItem(mHnd[menuEdit], 0); break; case mbarDA: DisableItem(mHnd[menuFile], mitmOpen); EnableItem(mHnd[menuFile], mitmClose_DA); EnableItem(mHnd[menuEdit], 0); break; } DrawMenuBar(); } /* now adjust the cursor */ if (useArrow = (!in.Recover || (newMenubar == mbarDA))) newCursor = curs_Init; else if ((timeNow = TickCount()) >= timeCursor) /* spin cursor */ { timeCursor = timeNow + CURS_FRAME; if (++newCursor >= curs_Total) newCursor = 0; } if (newCursor != oldCursor) { oldCursor = newCursor; SetCursor(useArrow ? &qd.arrow : cPtr[newCursor]); } } static void adjustMemory() { Size grow; memActivity = 0; if (MaxMem(&grow) < pBytes->memWarning) note(noErr, alidNote, "\pWarning: Memory is running low"); (void) ResrvMem((Size) FreeMem()); /* move all handles high */ } /* show memory stats: FreeMem, MaxBlock, PurgeSpace, and StackSpace */ static void optionMemStats() { unsigned char *pFormat = "\pFree:#k Max:#k Purge:#k Stack:#k"; char *pSub = "#"; /* not a pascal string */ unsigned char nBuf[16]; long nStat, contig; Handle strHnd; long nOffset; short i; if (wnEvt.modifiers & shiftKey) adjustMemory(); if (! (strHnd = NewHandle((Size) 128))) { note(noErr, alidNote, "\pOops: Memory stats unavailable!"); return; } SetString((StringHandle) strHnd, pFormat); nOffset = 1L; for (i = 1; i <= 4; i++) { /* get the replacement number stat */ switch (i) { case 1: nStat = FreeMem(); break; case 2: nStat = MaxBlock(); break; case 3: PurgeSpace(&nStat, &contig); break; case 4: nStat = StackSpace(); break; } NumToString((nStat >> 10), * (Str255 *) &nBuf); **strHnd += nBuf[0] - 1; nOffset = Munger(strHnd, nOffset, (Ptr) pSub, 1L, (Ptr) &nBuf[1], nBuf[0]); } MoveHHi(strHnd); HLock(strHnd); note(noErr, alidNote, (unsigned char *) *strHnd); DisposHandle(strHnd); } static void RecoverMenuEvent(long menuEntry) { short menuID = HiWord(menuEntry); short menuItem = LoWord(menuEntry); switch (menuID) { case muidApple: switch (menuItem) { case mitmAbout: if (wnEvt.modifiers & optionKey) optionMemStats(); /* fall thru */ case mitmHelp: note(noErr, (alertAppleMenu + menuItem), aboutBuf); break; default: /* DA's or apple menu items */ { unsigned char daName[32]; GetItem(mHnd[menuApple], menuItem, * (Str255 *) &daName); (void) OpenDeskAcc(daName); memActivity++; } break; } break; case muidFile: switch (menuItem) { case mitmOpen: beginRecover(); break; case mitmClose_DA: { WindowPeek frontWindow; short refNum; if (frontWindow = (WindowPeek) FrontWindow()) if ((refNum = frontWindow->windowKind) < 0) CloseDeskAcc(refNum); memActivity++; } break; case mitmQuit: cooldown(); break; } break; case muidEdit: (void) SystemEdit(menuItem - 1); break; } HiliteMenu(0); } static void eventLoop() { short wneMask = (in.Front ? everyEvent : (osMask + updateMask)); long wneSleep = (in.Front ? 0L : 3L); while (1) { if (in.Front) adjustGUI(); if (memActivity >= pBytes->memCleanup) adjustMemory(); (void) WaitNextEvent(wneMask, &wnEvt, wneSleep, (RgnHandle) 0L); if (in.Dialog) (void) IsDialogEvent(&wnEvt); switch (wnEvt.what) { case osEvt: if (((wnEvt.message & osEvtMessageMask) >> 24) == suspendResumeMessage) { in.Front = (wnEvt.message & resumeFlag); wneMask = (in.Front ? everyEvent : (osMask + updateMask)); wneSleep = (in.Front ? 0L : 3L); } break; case nullEvent: /* adjust the FIFO notification queue */ if (pNMQ && pNMQ->nmDispose) { notifPtr pNMX = pNMQ->nmNext; DisposPtr((Ptr) pNMQ); pNMQ = pNMX; memActivity++; } if (in.Recover) continueRecover(); break; case mouseDown: { WindowPtr whichWindow; switch(FindWindow( wnEvt . where , &whichWindow)) { case inMenuBar: RecoverMenuEvent(MenuSelect( wnEvt . where )); break; case inSysWindow: SystemClick(&wnEvt, whichWindow); break; case inDrag: { Rect boundsRect = qd.screenBits.bounds; Point offsetPt; InsetRect(&boundsRect, 4, 4); boundsRect.top += GetMBarHeight(); DragWindow(whichWindow, * ((Point *) &wnEvt.where), &boundsRect); boundsRect = whichWindow->portRect; offsetPt = * (Point *) &(whichWindow->portBits.bounds); OffsetRect(&boundsRect, -offsetPt.h, -offsetPt.v); * (Rect *) *thermoTHnd = boundsRect; } break; } } break; case keyDown: { char key = (wnEvt.message & charCodeMask); if (wnEvt.modifiers & cmdKey) { if (key == '.') { if (in.Recover) { endRecover(); note(noErr, alidNote, "\pSorry: Recovery aborted"); } } else RecoverMenuEvent(MenuKey(key)); } } break; /* without windows these events belong to our thermometer */ case updateEvt: case activateEvt: { DialogPtr dPtr; short itemHit; (void) DialogSelect(&wnEvt, &dPtr, &itemHit); break; } case diskEvt: if (HiWord(wnEvt.message)) { Point pt = {60, 60}; (void) DIBadMount(pt, wnEvt.message); DIUnload(); memActivity++; } break; } /* switch (wnEvt.what) */ } /* while (1) */ } static void cooldown() { if (in.Recover) endRecover(); /* wait for pending notifications to complete */ while (in.Notify) (void) WaitNextEvent(0, &wnEvt, 3L, (RgnHandle) 0L); ExitToShell(); } /* draw the progress thermometer and frame. 1 level <=> 1 horiz. pixel */ pascal void drawThermo(WindowPtr wPtr, short inum) { itemizeThermo(drawItem); } /* manage progress thermometer dialog */ static void itemizeThermo(short itemMode) { short iTyp, iTmp; Handle iHnd; Rect iRct; GetDItem(DLGTHM, uitmThermo, &iTyp, &iHnd, &iRct); switch(itemMode) { case initItem: SetDItem(DLGTHM, uitmThermo, iTyp, (Handle) drawThermoUPP, &iRct); break; case invalItem: { GrafPtr oldPort; GetPort(&oldPort); SetPort(GRFTHM); InsetRect(&iRct, 1, 1); InvalRect(&iRct); SetPort(oldPort); } break; case drawItem: FrameRect(&iRct); InsetRect(&iRct, 1, 1); iTmp = iRct.right; iRct.right = iRct.left + in.Recover; PaintRect(&iRct); iRct.left = iRct.right; iRct.right = iTmp; EraseRect(&iRct); break; } } /* show only .0 files in get file dialog */ pascal Boolean basenameFileFilter(ParmBlkPtr pPB) { unsigned char *pC; if (! (pC = (unsigned char *) pPB->fileParam.ioNamePtr)) return true; if ((*pC < 4) || (*pC > 28)) /* save/ 1name .0 */ return true; if ((pC[*pC - 1] == '.') && (pC[*pC] == '0')) /* bingo! */ return false; return true; } static void beginRecover() { SFTypeList levlType = {'LEVL'}; SFReply sfGetReply; SFGetFile(sfGetWhere, "\p", basenameFileFilterUPP, 1, levlType, (DlgHookUPP) 0L, &sfGetReply); memActivity++; if (! sfGetReply.good) return; /* get volume (working directory) refnum, basename, and directory i.d. */ vRefNum = sfGetReply.vRefNum; BlockMove(sfGetReply.fName, lock, sfGetReply.fName[0] + 1); { static CInfoPBRec catInfo; catInfo.hFileInfo.ioNamePtr = (StringPtr) sfGetReply.fName; catInfo.hFileInfo.ioVRefNum = sfGetReply.vRefNum; catInfo.hFileInfo.ioDirID = 0L; if (PBGetCatInfoSync(&catInfo)) { note(noErr, alidNote, "\pSorry: Bad File Info"); return; } dirID = catInfo.hFileInfo.ioFlParID; } /* open the progress thermometer dialog */ (void) GetNewDialog(dlogProgress, (Ptr) &dlgThermo, (WindowPtr) -1L); if (ResError() || MemError()) note(noErr, alidNote, "\pOops: Progress thermometer unavailable"); else { in.Dialog = 1; memActivity++; itemizeThermo(initItem); ShowWindow(WNDTHM); } timeCursor = TickCount() + CURS_LATENT; saveRefNum = gameRefNum = levRefNum = -1; in.Recover = 1; } static void continueRecover() { restore_savefile(); /* update the thermometer */ if (in.Dialog && ! (in.Recover % 4)) itemizeThermo(invalItem); if (in.Recover <= MAX_RECOVER_COUNT) return; endRecover(); if (saveRezStrings()) return; note(noErr, alidNote, "\pOK: Recovery succeeded"); } /* no messages from here (since we might be quitting) */ static void endRecover() { in.Recover = 0; oldCursor = curs_Init; SetCursor(&qd.arrow); /* clean up abandoned files */ if (gameRefNum >= 0) (void) FSClose(gameRefNum); if (levRefNum >= 0) (void) FSClose(levRefNum); if (saveRefNum >= 0) { (void) FSClose(saveRefNum); (void) FlushVol((StringPtr) 0L, vRefNum); /* its corrupted so trash it ... */ (void) HDelete(vRefNum, dirID, savename); } saveRefNum = gameRefNum = levRefNum = -1; /* close the progress thermometer dialog */ in.Dialog = 0; CloseDialog(DLGTHM); DisposHandle(dlgThermo.items); memActivity++; } /* add friendly, non-essential resource strings to save file */ static short saveRezStrings() { short sRefNum; StringHandle strHnd; short i, rezID; unsigned char *plName; HCreateResFile(vRefNum, dirID, savename); sRefNum = HOpenResFile(vRefNum, dirID, savename, fsRdWrPerm); if (sRefNum <= 0) { note(noErr, alidNote, "\pOK: Minor resource map error"); return 1; } /* savename and hpid get mutilated here... */ plName = savename + 5; /* save/ */ *savename -= 5; do { plName++; (*savename)--; hpid /= 10; } while (hpid); *plName = *savename; for (i = 1; i <= 2; i++) { switch (i) { case 1: rezID = PLAYER_NAME_RES_ID; strHnd = NewString(* (Str255 *) plName); break; case 2: rezID = APP_NAME_RES_ID; strHnd = NewString(* (Str255 *) "\pNetHack"); break; } if (! strHnd) { note(noErr, alidNote, "\pOK: Minor \'STR \' resource error"); CloseResFile(sRefNum); return 1; } /* should check for errors... */ AddResource((Handle) strHnd, 'STR ', rezID, * (Str255 *) "\p"); } memActivity++; /* should check for errors... */ CloseResFile(sRefNum); return 0; } static void set_levelfile_name(long lev) { unsigned char *tf; /* find the dot. this is guaranteed to happen. */ for (tf = (lock + *lock); *tf != '.'; tf--, lock[0]--) ; /* append the level number string (pascal) */ if (tf > lock) { NumToString(lev, * (Str255 *) tf); lock[0] += *tf; *tf = '.'; } else /* huh??? */ { endRecover(); note(noErr, alidNote, "\pSorry: File Name Error"); } } static short open_levelfile(long lev) { OSErr openErr; short fRefNum; set_levelfile_name(lev); if (! in.Recover) return (-1); if ((openErr = HOpen(vRefNum, dirID, lock, fsRdWrPerm, &fRefNum)) && (openErr != fnfErr)) { endRecover(); note(noErr, alidNote, "\pSorry: File Open Error"); return (-1); } return (openErr ? -1 : fRefNum); } static short create_savefile(unsigned char *savename) { short fRefNum; /* translate savename to a pascal string (in place) */ { unsigned char *pC; short nameLen; for (pC = savename; *pC; pC++); nameLen = pC - savename; for ( ; pC > savename; pC--) *pC = *(pC - 1); *savename = nameLen; } if (HCreate(vRefNum, dirID, savename, MAC_CREATOR, SAVE_TYPE) || HOpen(vRefNum, dirID, savename, fsRdWrPerm, &fRefNum)) { endRecover(); note(noErr, alidNote, "\pSorry: File Create Error"); return (-1); } return fRefNum; } static void copy_bytes(short inRefNum, short outRefNum) { char *buf = (char *) pIOBuf; long bufSiz = pBytes->memIOBuf; long nfrom, nto; do { nfrom = read_levelfile(inRefNum, buf, bufSiz); if (! in.Recover) return; nto = write_savefile(outRefNum, buf, nfrom); if (! in.Recover) return; if (nto != nfrom) { endRecover(); note(noErr, alidNote, "\pSorry: File Copy Error"); return; } } while (nfrom == bufSiz); } static void restore_savefile() { static int savelev; long saveTemp, lev; xchar levc; struct version_info version_data; /* level 0 file contains: * pid of creating process (ignored here) * level number for current level of save file * name of save file nethack would have created * and game state */ lev = in.Recover - 1; if (lev == 0L) { gameRefNum = open_levelfile(0L); if (in.Recover) (void) read_levelfile(gameRefNum, (Ptr) &hpid, sizeof(hpid)); if (in.Recover) saveTemp = read_levelfile(gameRefNum, (Ptr) &savelev, sizeof(savelev)); if (in.Recover && (saveTemp != sizeof(savelev))) { endRecover(); note(noErr, alidNote, "\pSorry: \"checkpoint\" was not enabled"); return; } if (in.Recover) (void) read_levelfile(gameRefNum, (Ptr) savename, sizeof(savename)); if (in.Recover) (void) read_levelfile(gameRefNum, (Ptr) &version_data, sizeof version_data); /* save file should contain: * current level (including pets) * (non-level-based) game state * other levels */ if (in.Recover) saveRefNum = create_savefile(savename); if (in.Recover) levRefNum = open_levelfile(savelev); if (in.Recover) (void) write_savefile(saveRefNum, (Ptr) &version_data, sizeof version_data); if (in.Recover) copy_bytes(levRefNum, saveRefNum); if (in.Recover) close_file(&levRefNum); if (in.Recover) unlink_file(lock); if (in.Recover) copy_bytes(gameRefNum, saveRefNum); if (in.Recover) close_file(&gameRefNum); if (in.Recover) set_levelfile_name(0L); if (in.Recover) unlink_file(lock); } else if (lev != savelev) { levRefNum = open_levelfile(lev); if (levRefNum >= 0) { /* any or all of these may not exist */ levc = (xchar) lev; (void) write_savefile(saveRefNum, (Ptr) &levc, sizeof(levc)); if (in.Recover) copy_bytes(levRefNum, saveRefNum); if (in.Recover) close_file(&levRefNum); if (in.Recover) unlink_file(lock); } } if (in.Recover == MAX_RECOVER_COUNT) close_file(&saveRefNum); if (in.Recover) in.Recover++; } static long read_levelfile(short rdRefNum, Ptr bufPtr, long count) { OSErr rdErr; long rdCount = count; if ((rdErr = FSRead(rdRefNum, &rdCount, bufPtr)) && (rdErr != eofErr)) { endRecover(); note(noErr, alidNote, "\pSorry: File Read Error"); return (-1L); } return rdCount; } static long write_savefile(short wrRefNum, Ptr bufPtr, long count) { long wrCount = count; if (FSWrite(wrRefNum, &wrCount, bufPtr)) { endRecover(); note(noErr, alidNote, "\pSorry: File Write Error"); return (-1L); } return wrCount; } static void close_file(short *pFRefNum) { if (FSClose(*pFRefNum) || FlushVol((StringPtr) 0L, vRefNum)) { endRecover(); note(noErr, alidNote, "\pSorry: File Close Error"); return; } *pFRefNum = -1; } static void unlink_file(unsigned char *filename) { if (HDelete(vRefNum, dirID, filename)) { endRecover(); note(noErr, alidNote, "\pSorry: File Delete Error"); return; } } slashem-0.0.7E7F3/sys/mac/README.txt0000664000076400007640000000111010545462317014721 0ustar alialiThis is the binary distribution of Slash'EM 0.0.7E7F2 for Mac OS Classic. This is a Power PC binary, so it will run only on a Macintosh with a Power PC processor. This package is freely distributable; see the file 'License' for details. Read the Guidebook for a general description of what Slash'EM is and how to play. Unfortunately, the Guidebook is > 32K, so you will need something other than SimpleText to view it. Edit the file Slash'EM Defaults in this directory to modify startup options. Feel free to turn off News when you get tired of seeing its message when you start up.slashem-0.0.7E7F3/sys/mac/mactty.c0000664000076400007640000006543010545462317014707 0ustar aliali/* SCCS Id: @(#)mactty.c 3.1 93/03/01 */ /* Copyright (c) Jon W{tte 1993. */ /* NetHack may be freely redistributed. See license for details. */ /* * mactty.c * * This file contains the actual code for the tty library. For a * description, see the file mactty.h, which contains all you * need to know to use the library. */ #include "hack.h" /* to get flags */ #include "mttypriv.h" #if !TARGET_API_MAC_CARBON #include #endif char game_active = 0; /* flag to window rendering routines not to use ppat */ /* these declarations are here because I can't include macwin.h without including the world */ extern void dprintf(char *, ...); /* dprintf.c */ /* * Borrowed from the Mac tty port */ extern WindowPtr _mt_window; static void select_onscreen_window (tty_record *record); static void select_offscreen_port (tty_record *record); #define MEMORY_MARGIN 30000 /* * Convenience macro for most functions - put last in declaration */ #define RECORD_EXISTS(record) \ tty_record * record; \ if (!window || !(record = (tty_record *) GetWRefCon (window))) \ return general_failure; /* * Simple macro for deciding wether we draw at once or delay */ #define DRAW_DIRECT (TA_ALWAYS_REFRESH & record->attribute [TTY_ATTRIB_FLAGS]) /* * Table of special characters. Zero is ALWAYS special; it means * end of string and would be MISSED if it was not included here. */ #define COOKED_CONTROLS 0X00002581 #define RAW_CONTROLS 1 static unsigned long s_control = COOKED_CONTROLS; /* * Memory-related error */ static short mem_err (void) { short ret_val = MemError(); if (!ret_val) { ret_val = general_failure; } return ret_val; } /* * Make a rectangle empty */ static void empty_rect (Rect *r) { r->right = -20000; r->left = 20000; r->top = 20000; r->bottom = -20000; } /* * Union twp rect together */ static void union_rect (Rect *r1, Rect *r2, Rect *dest) { dest->left = min (r1->left, r2->left); dest->top = min (r1->top, r2 ->top); dest->bottom = max (r1->bottom, r2->bottom); dest->right = max (r1->right, r2->right); } /* * Dispose a pointer using the set memory-allocator */ static short dispose_ptr (void *ptr) { if (!ptr) { return noErr; /* Silently accept disposing nulls */ } DisposePtr (ptr); return MemError (); } #ifdef MAC_MPW /* else use alloc.c instead */ /* * Allocate a pointer using the set memory-allocator */ static short alloc_ptr (void **ptr, long size) { *ptr = NewPtr (size); return MemError (); } #endif /* * Set up a GWorld in the record */ static short allocate_offscreen_world (tty_record *record) { GWorldPtr gw = (GWorldPtr)0; GWorldFlags world_flags = 0; long mem_here, mem_there, other, required_mem; Point p = {0, 0}; Rect r_screen; GDHandle gdh; short s_err; select_onscreen_window (record); LocalToGlobal (&p); r_screen = record->its_bits.bounds; OffsetRect (&r_screen, p.h, p.v); gdh = GetMaxDevice (&r_screen); required_mem = (long) (*((*gdh)->gdPMap))->pixelSize * ((long) record->its_bits.bounds.right * record->its_bits.bounds.bottom) >> 3; PurgeSpace (&other, &mem_here); if (other < mem_here + MEMORY_MARGIN) { mem_here = other - MEMORY_MARGIN; } dprintf ("Heap %ld Required %ld", mem_here, required_mem); if (required_mem > mem_here) { mem_there = required_mem; if (required_mem > TempMaxMem (&mem_there)) { dprintf ("No memory"); return memFullErr; } world_flags |= useTempMem; } s_err = NewGWorld (&gw, 0, &r_screen, (CTabHandle) 0, (GDHandle) 0, world_flags); if (!s_err) { record->offscreen_world = gw; select_offscreen_port (record); SetOrigin (0, 0); select_onscreen_window (record); dprintf ("New GWorld @ %lx;dm", gw); } return s_err; } /* * Done with GWorld, release data */ static short deallocate_gworld (tty_record *record) { if (record->offscreen_world) { DisposeGWorld (record->offscreen_world); record->offscreen_world = (GWorldPtr) 0; } return noErr; } /* * Get rid of offscreen bitmap */ static short free_bits (tty_record *record) { short s_err; if (record->uses_gworld) { s_err = deallocate_gworld (record); #if !TARGET_API_MAC_CARBON } else { s_err = dispose_ptr (record->its_bits.baseAddr); if (!s_err) { record->its_bits.baseAddr = (char *)0; if (record->offscreen_port) { ClosePort (record->offscreen_port); s_err = dispose_ptr (record->offscreen_port); if (!s_err) { record->offscreen_port = (GrafPtr) 0; } } } #endif } return s_err; } /* * Snatch a window from the resource fork. Create the record. * Otherwise, do nothing. */ short create_tty (WindowRef *window, short resource_id, Boolean in_color) { tty_record * record; Boolean was_allocated = !!*window; if (in_color) { *window = GetNewCWindow (resource_id, (Ptr) *window, (WindowRef) -1L); } else { *window = GetNewWindow (resource_id, (Ptr) *window, (WindowRef) -1L); } if (!*window) { return mem_err (); } record = (tty_record *) NewPtrClear (sizeof (tty_record)); if (!record) { #if !TARGET_API_MAC_CARBON if (was_allocated) { CloseWindow (*window); } else { #endif DisposeWindow (*window); #if !TARGET_API_MAC_CARBON } #endif return mem_err (); } record->its_window = *window; SetWRefCon (*window, (long) record); record->was_allocated = was_allocated; record->its_bits.baseAddr = (char *)0; record->curs_state = TRUE; /* * We need to keep the window world around if we switch worlds */ record->offscreen_world = (GWorldPtr) 0; record->uses_gworld = in_color; if (in_color) { GDHandle gh; SetPortWindowPort(*window); GetGWorld(&(record->its_window_world), &gh); } else { record->its_window_world = (GWorldPtr)0; } #if CLIP_RECT_ONLY empty_rect (&(record->invalid_rect)); #else record->invalid_part = NewRgn (); if (!record->invalid_part) { return destroy_tty (*window); } #endif return noErr; } short init_tty_number (WindowPtr window, short font_number, short font_size, short x_size, short y_size) { RECORD_EXISTS (record); record->font_number = font_number; record->font_size = font_size; record->x_size = x_size; record->y_size = y_size; return force_tty_coordinate_system_recalc (window); } /* * Done with a window - destroy it. Release the memory only if * it wasn't allocated when we got it! */ short destroy_tty (WindowPtr window) { short s_err; RECORD_EXISTS (record); s_err = free_bits (record); if (!s_err) { #if !TARGET_API_MAC_CARBON if (record->was_allocated) { CloseWindow (window); } else { #endif DisposeWindow (window); #if !TARGET_API_MAC_CARBON } #endif s_err = dispose_ptr (record); } return s_err; } static void do_set_port_font (tty_record *record) { PenNormal (); TextFont (record->font_number); TextSize (record->font_size); if (0L != (record->attribute [TTY_ATTRIB_FLAGS] & TA_OVERSTRIKE)) { TextMode (srcOr); } else { TextMode (srcCopy); } } /* * Fill in some fields from some other fields that may have changed */ static void calc_font_sizes (tty_record *record) { FontInfo font_info; do_set_port_font (record); GetFontInfo (&font_info); record->char_width = font_info.widMax; record->ascent_height = font_info.ascent + font_info.leading; record->row_height = record->ascent_height + font_info.descent; } /* * Allocate memory for the bitmap holding the tty window */ static short alloc_bits (tty_record *record) { short s_err; SetRect (&record->its_bits.bounds, 0, 0, record->char_width * record->x_size, record->row_height * record->y_size); /* * Clear two highest and lowest bit - not a color pixMap, and even in size */ record->its_bits.rowBytes = ((record->its_bits.bounds.right + 15) >> 3) & 0x1ffe; if (record->uses_gworld) { s_err = allocate_offscreen_world (record); #if !TARGET_API_MAC_CARBON } else { s_err = alloc_ptr ((void **) &(record->its_bits.baseAddr), record->its_bits.rowBytes * record->its_bits.bounds.bottom); if (!s_err) { s_err = alloc_ptr ((void **) &(record->offscreen_port), sizeof (GrafPort)); } if (!s_err) { OpenPort (record->offscreen_port); SetPort (record->offscreen_port); ClipRect (&(record->its_bits.bounds)); SetPortBits (&(record->its_bits)); } #endif } return s_err; } /* * Save the current port/world in a safe place for later retrieval */ static void save_port (tty_record *record, void *save) { GWorldPtr gw; GDHandle gh; GrafPtr gp; if (record->uses_gworld) { GetGWorld (&gw, &gh); *(GWorldPtr *) save = gw; } else { GetPort (&gp); *(GrafPtr *) save = gp; } } /* * Restore current port/world after a save */ static void use_port (tty_record *record, void *port) { if (record->uses_gworld) { PixMapHandle pix_map; SetGWorld ((GWorldPtr) port, (GDHandle) 0); pix_map = GetGWorldPixMap (record->offscreen_world); if (pix_map) { if (port == record->offscreen_world) LockPixels (pix_map); else UnlockPixels (pix_map); } } else { SetPort ((GrafPtr) port); } } /* * Use offscreen drawing - lock the pixels through use_port */ static void select_offscreen_port (tty_record *record) { if (record->uses_gworld) { use_port (record, record->offscreen_world); } else { use_port (record, record->offscreen_port); } } /* * Use the window - unlock pixels */ static void select_onscreen_window (tty_record *record) { if (record->uses_gworld) { use_port (record, record->its_window_world); SetPortWindowPort(record->its_window); } else { use_port(record, record->its_window); } } /* * Do bits copy depending on if we're using color or not */ static void copy_bits(tty_record *record, Rect *bounds, short xfer_mode, RgnHandle mask_rgn) { GWorldFlags pix_state; BitMap * source; if (record->uses_gworld) { pix_state = GetPixelsState (GetGWorldPixMap (record->offscreen_world)); LockPixels (GetGWorldPixMap (record->offscreen_world)); source = (BitMapPtr) *GetGWorldPixMap(record->offscreen_world); } else source = &record->its_bits; #if !TARGET_API_MAC_CARBON CopyBits (source, &(record->its_window->portBits), bounds, bounds, xfer_mode, mask_rgn); #else SetPortWindowPort(record->its_window); CopyBits(source, GetPortBitMapForCopyBits(GetWindowPort(record->its_window)), bounds, bounds, xfer_mode, mask_rgn); #endif if (record->uses_gworld) { SetPixelsState (GetGWorldPixMap (record->offscreen_world), pix_state); } } /* * Fill an area with the background color */ static void erase_rect (tty_record *record, Rect *area) { if (game_active && u.uhp > 0 && iflags.use_stone && record->its_window == _mt_window) { PixPatHandle ppat; ppat = GetPixPat(iflags.use_stone + 127); /* find which pat to get */ if (ppat) { /* in game window, using backgroung pattern, and have pattern */ FillCRect (area, ppat); DisposePixPat (ppat); return; } } EraseRect (area); } /* * Recalculate the window based on new size, font, extent values, * and re-allocate the bitmap. */ short force_tty_coordinate_system_recalc (WindowPtr window) { short s_err; RECORD_EXISTS (record); s_err = free_bits (record); if (s_err) { return s_err; } calc_font_sizes (record); s_err = alloc_bits (record); if (s_err) { /* * Catastrophe! We could not allocate memory for the bitmap! Things may go very * much downhill from here! */ dprintf ("alloc_bits returned null in force_tty_coordinate_system_recalc!"); return s_err; } select_offscreen_port (record); do_set_port_font (record); return clear_tty (window); } #if 0 /* * Update TTY according to new color environment for the window */ static short tty_environment_changed (tty_record *record) { Point p = {0, 0}; Rect r_screen; if (record->uses_gworld) { r_screen = record->its_bits.bounds; LocalToGlobal (&p); OffsetRect (&r_screen, p.h, p.v); UpdateGWorld (&(record->offscreen_world), 0, &r_screen, (CTabHandle) 0, (GDHandle) 0, stretchPix); select_offscreen_port (record); SetOrigin (0, 0); select_onscreen_window (record); } return 0; } #endif /* * Read a lot of interesting and useful information from the current tty */ short get_tty_metrics (WindowPtr window, short *x_size, short *y_size, short *x_size_pixels, short *y_size_pixels, short *font_number, short *font_size, short *char_width, short *row_height) { RECORD_EXISTS (record); /* * First, test that we actually have something to draw to... */ if ((((char *)0 == record->its_bits.baseAddr) && !record->uses_gworld) || (((GWorldPtr)0 == record->offscreen_world) && record->uses_gworld)) { return general_failure; } *x_size = record->x_size; *y_size = record->y_size; *x_size_pixels = record->its_bits.bounds.right; *y_size_pixels = record->its_bits.bounds.bottom; *font_number = record->font_number; *font_size = record->font_size; *char_width = record->char_width; *row_height = record->row_height; return noErr; } /* * Map a position on the map to screen coordinates */ static void pos_rect (tty_record *record, Rect *r, short x_pos, short y_pos, short x_end, short y_end) { SetRect (r, x_pos * (record->char_width), y_pos * (record->row_height), (1 + x_end) * (record->char_width) , (1 + y_end) * (record->row_height)); } static void accumulate_rect (tty_record *record, Rect *rect) { #if CLIP_RECT_ONLY union_rect (rect, &(record->invalid_rect), &(record->invalid_rect)); #else RgnHandle rh = NewRgn (); RectRgn (rh, rect); UnionRgn (record->invalid_part, rh, record->invalid_part); DisposeRgn (rh); #endif } /* * get and set window invalid region. exposed for HandleUpdateEvent in macwin.c * to correct display problem */ short get_invalid_region (WindowPtr window, Rect *inval_rect) { RECORD_EXISTS (record); #if CLIP_RECT_ONLY if (record->invalid_rect.right <= record->invalid_rect.left || record->invalid_rect.bottom <= record->invalid_rect.top) { return general_failure; } *inval_rect = record->invalid_rect; #else if (EmptyRgn (record->invalid_part)) { return general_failure; } *inval_rect = (*(record->invalid_part))->rgnBBox; #endif return noErr; } short set_invalid_region (WindowPtr window, Rect *inval_rect) { RECORD_EXISTS (record); accumulate_rect (record, inval_rect); return noErr; } /* * Invert the specified position */ static void curs_pos (tty_record *record, short x_pos, short y_pos, short to_state) { Rect r; if (record->curs_state == to_state) { return; } record->curs_state = to_state; pos_rect (record, &r, x_pos, y_pos, x_pos, y_pos); if (DRAW_DIRECT) { void *old_port; save_port (record, &old_port); select_onscreen_window (record); InvertRect (&r); use_port (record, old_port); } else { accumulate_rect (record, &r); } } /* * Move the cursor (both as displayed and where drawing goes) * HOWEVER: The cursor is NOT stored in the bitmap! */ short move_tty_cursor (WindowPtr window, short x_pos, short y_pos) { RECORD_EXISTS (record); if (record->x_curs == x_pos && record->y_curs == y_pos) { return noErr; } if (record->x_size <= x_pos || x_pos < 0 || record->y_size <= y_pos || y_pos < 0) { return general_failure; } curs_pos (record, record->x_curs, record->y_curs, 0); record->x_curs = x_pos; record->y_curs = y_pos; curs_pos (record, x_pos, y_pos, 1); return noErr; } /* * Update the screen to match the current bitmap, after adding stuff * with add_tty_char etc. */ short update_tty (WindowPtr window) { Rect r; RECORD_EXISTS (record); #if CLIP_RECT_ONLY if (record->invalid_rect.right <= record->invalid_rect.left || record->invalid_rect.bottom <= record->invalid_rect.top) { return noErr; } r = record->invalid_rect; #else if (EmptyRgn (record->invalid_part)) { return noErr; } r = (*(record->invalid_part))->rgnBBox; #endif select_onscreen_window (record); copy_bits (record, &r, srcCopy, (RgnHandle) 0); #if CLIP_RECT_ONLY empty_rect (&(record->invalid_rect)); #else SetEmptyRgn (record->invalid_part); #endif if (record->curs_state) { pos_rect (record, &r, record->x_curs, record->y_curs, record->x_curs, record->y_curs); InvertRect (&r); } return noErr; } /* * Low level add to screen */ static void do_add_string (tty_record *record, char *str, short len) { Rect r; if (len < 1) { return; } select_offscreen_port (record); MoveTo (record->x_curs * record->char_width, record->y_curs * record->row_height + record->ascent_height); DrawText (str, 0, len); pos_rect (record, &r, record->x_curs, record->y_curs, record->x_curs + len - 1, record->y_curs); select_onscreen_window (record); if (DRAW_DIRECT) { copy_bits (record, &r, srcCopy, (RgnHandle)0); } else { accumulate_rect (record, &r); } } /* * Low-level cursor handling routine */ static void do_add_cursor (tty_record *record, short x_pos) { record->x_curs = x_pos; if (record->x_curs >= record->x_size) { if (0L != (record->attribute [TTY_ATTRIB_FLAGS] & TA_WRAP_AROUND)) { record->y_curs ++; record->x_curs = 0; if (record->y_curs >= record->y_size) { if (0L != (record->attribute [TTY_ATTRIB_FLAGS] & TA_INHIBIT_VERT_SCROLL)) { record->y_curs = record->y_size; } else { scroll_tty (record->its_window, 0, 1 + record->y_curs - record->y_size); } } } else { record->x_curs = record->x_size; } } } /* * Do control character */ static void do_control (tty_record *record, short character) { int recurse = 0; /* * Check recursion because nl_add_cr and cr_add_nl may both be set and invoke each other */ do { switch (character) { case '\r' : record->x_curs = 0; if (!recurse && (record->attribute [TTY_ATTRIB_CURSOR] & TA_CR_ADD_NL)) { recurse = 1; } else { recurse = 0; break; } /* FALL-THROUGH: if CR-LF, don't bother with loop */ case '\n' : record->y_curs++; if (record->y_curs >= record->y_size) { scroll_tty (record->its_window, 0, 1 + record->y_curs - record->y_size); } if (!recurse && (record->attribute [TTY_ATTRIB_CURSOR] & TA_NL_ADD_CR)) { character = '\r'; recurse = 1; } else recurse = 0; break; case CHAR_BELL : tty_nhbell(); break; case CHAR_BS : if (record->x_curs > 0) record->x_curs --; default : break; } } while (recurse); } /* * Add a single character. It is drawn directly if the correct flag is set, * else deferred to the next update event or call of update_tty() */ short add_tty_char (WindowPtr window, short character) { register char is_control; char ch; RECORD_EXISTS (record); if (!(record->attribute [TTY_ATTRIB_FLAGS] & TA_WRAP_AROUND) && record->x_curs >= record->x_size) return noErr; /* Optimize away drawing across border without wrap */ if (record->curs_state != 0) curs_pos (record, record->x_curs, record->y_curs, 0); ch = character; is_control = (ch < sizeof(long) * 8) && ((s_control & (1 << ch)) != 0L); if (is_control) do_control (record, ch); else { do_add_string (record, (char *)&ch, 1); do_add_cursor (record, record->x_curs + 1); } return noErr; } /* * Add a null-terminated string of characters */ short add_tty_string(WindowPtr window, const char *string) { register const unsigned char * start_c; register const unsigned char * the_c; register unsigned char ch, is_control = 0, tty_wrap; register short max_x, pos_x; RECORD_EXISTS (record); if (record->curs_state != 0) curs_pos (record, record->x_curs, record->y_curs, 0); the_c = (const unsigned char *) string; max_x = record->x_size; tty_wrap = (record->attribute [TTY_ATTRIB_FLAGS] & TA_WRAP_AROUND); for (;;) { pos_x = record->x_curs; if (!tty_wrap && pos_x >= max_x) break; /* Optimize away drawing across border without wrap */ start_c = the_c; ch = *the_c; while (pos_x < max_x) { is_control = (ch < sizeof(long) * 8) && ((s_control & (1 << ch)) != 0L); if (is_control) break; the_c ++; ch = *the_c; pos_x ++; } do_add_string (record, (char *) start_c, the_c - start_c); do_add_cursor (record, pos_x); if (!ch) break; if (is_control) { do_control (record, ch); the_c ++; } } return noErr; } /* * Read or change attributes for the tty. Note that some attribs may * very well clear and reallocate the bitmap when changed, whereas * others (color, highlight, ...) are guaranteed not to. */ short get_tty_attrib (WindowPtr window, tty_attrib attrib, long *value) { RECORD_EXISTS (record); if (attrib < 0 || attrib >= TTY_NUMBER_ATTRIBUTES) { return general_failure; } *value = record->attribute [attrib]; return noErr; } short set_tty_attrib (WindowPtr window, tty_attrib attrib, long value) { RGBColor rgb_color; RECORD_EXISTS (record); if (attrib < 0 || attrib >= TTY_NUMBER_ATTRIBUTES) { return general_failure; } record->attribute [attrib] = value; /* * Presently, no attributes generate a new bitmap. */ switch (attrib) { case TTY_ATTRIB_CURSOR : /* * Check if we should change tables */ if (0L != (value & TA_RAW_OUTPUT)) { s_control = RAW_CONTROLS; } else { s_control = COOKED_CONTROLS; } break; case TTY_ATTRIB_FLAGS : /* * Check if we should flush the output going from cached to draw-direct */ if (0L != (value & TA_ALWAYS_REFRESH)) { update_tty (window); } break; case TTY_ATTRIB_FOREGROUND : /* * Set foreground color */ TA_TO_RGB (value, rgb_color); select_offscreen_port (record); RGBForeColor (&rgb_color); select_onscreen_window (record); break; case TTY_ATTRIB_BACKGROUND : /* * Set background color */ TA_TO_RGB (value, rgb_color); select_offscreen_port (record); RGBBackColor (&rgb_color); select_onscreen_window (record); break; default : break; } return noErr; } /* * Scroll the window. Positive is up/left. scroll_tty ( window, 0, 1 ) is a line feed. * Scroll flushes the accumulated update area by calling update_tty(). */ short scroll_tty (WindowPtr window, short delta_x, short delta_y) { RgnHandle rgn; short s_err; RECORD_EXISTS (record); s_err = update_tty (window); rgn = NewRgn (); select_offscreen_port (record); ScrollRect (&(record->its_bits.bounds), -delta_x * record->char_width, -delta_y * record->row_height, rgn); EraseRgn (rgn); SetEmptyRgn (rgn); select_onscreen_window (record); ScrollRect (&(record->its_bits.bounds), -delta_x * record->char_width, -delta_y*record->row_height, rgn); EraseRgn (rgn); DisposeRgn (rgn); record->y_curs -= delta_y; record->x_curs -= delta_x; return noErr; } /* * Clear the screen. Immediate. */ short clear_tty (WindowPtr window) { RECORD_EXISTS (record); record->curs_state = 0; select_offscreen_port (record); erase_rect (record, &(record->its_bits.bounds)); accumulate_rect (record, &(record->its_bits.bounds)); update_tty (window); return noErr; } /* * Blink cursor on window if necessary */ short blink_cursor (WindowPtr window, long when) { RECORD_EXISTS (record); if ((record->attribute [TTY_ATTRIB_CURSOR] & TA_BLINKING_CURSOR)) { if (when > record->last_cursor + GetCaretTime ()) { curs_pos (record, record->x_curs, record->y_curs, !record->curs_state); record->last_cursor = when; update_tty (window); } } return 0; } /* * Draw an image of the tty - used for update events and can be called * for screen dumps. */ short image_tty (EventRecord *theEvent, WindowPtr window) { #if defined(__SC__) || defined(__MRC__) # pragma unused(theEvent) #endif RECORD_EXISTS (record); #if CLIP_RECT_ONLY record->invalid_rect = record->its_bits.bounds; #else RgnHandle rh = NewRgn (); RectRgn (rh, record ->its_bits.bounds); UnionRgn (record->invalid_part, rh, record->invalid_part); DisposeRgn (rh); #endif return update_tty (window); } /* * Clear an area */ short clear_tty_window (WindowPtr window, short from_x, short from_y, short to_x, short to_y) { Rect r; RECORD_EXISTS (record); if (from_x > to_x || from_y > to_y) { return general_failure; } pos_rect (record, &r, from_x, from_y, to_x, to_y); select_offscreen_port (record); erase_rect (record, &r); accumulate_rect (record, &r); if (DRAW_DIRECT) { update_tty (window); } else select_onscreen_window (record); return noErr; } #if EXTENDED_SUPPORT /* * Delete or insert operations used by many terminals can bottleneck through * here. Note that the order of executin for row/colum insertions is NOT * specified. Negative values for num_ mean delete, zero means no effect. */ short mangle_tty_rows_columns (WindowPtr window, short from_row, short num_rows, short from_column, short num_columns) { Rect r; RgnHandle rh = NewRgn (); RECORD_EXISTS (record); update_tty (window); /* Always make sure screen is OK */ curs_pos (record, record->x_curs, record->y_curs, 0); if (num_rows) { pos_rect (record, &r, 0, from_row, record->x_size - 1, record->y_size - 1); select_offscreen_port (record); ScrollRect (&r, 0, num_rows * record->row_height, rh); EraseRgn (rh); SetEmptyRgn (rh); select_onscreen_window (record); ScrollRect (&r, 0, num_rows * record->row_height, rh); EraseRgn (rh); SetEmptyRgn (rh); } if (num_columns) { pos_rect (record, &r, from_column, 0, record->x_size - 1, record->y_size - 1); select_offscreen_port (record); ScrollRect (&r, num_columns * record->char_width, 0, rh); EraseRgn (rh); SetEmptyRgn (rh); select_onscreen_window (record); ScrollRect (&r, num_columns * record->char_width, 0, rh); EraseRgn (rh); SetEmptyRgn (rh); } DisposeRgn (rh); if (record->x_curs >= from_column) { record->x_curs += num_columns; } if (record->y_curs >= from_row) { record->y_curs += num_rows; } curs_pos (record, record->x_curs, record->y_curs, 1); return noErr; } /* * Frame an area in an aesthetically pleasing way. */ short frame_tty_window (WindowPtr window, short from_x, short from_y , short to_x, short to_y, short frame_fatness) { Rect r; RECORD_EXISTS (record); if (from_x > to_x || from_y > to_y) { return general_failure; } pos_rect (record, & r, from_x, from_y, to_x, to_y); select_offscreen_port (record); PenSize (frame_fatness, frame_fatness); FrameRect (&r); PenNormal (); accumulate_rect (record, &r); if (DRAW_DIRECT) { update_tty (window); } else select_onscreen_window (record); } /* * Highlighting a specific part of the tty window */ short invert_tty_window (WindowPtr window, short from_x, short from_y , short to_x, short to_y) { Rect r; RECORD_EXISTS (record); if (from_x > to_x || from_y > to_y) { return general_failure; } pos_rect (record, &r, from_x, from_y, to_x, to_y); select_offscreen_port (record); InvertRect ( &r); accumulate_rect (record, &r); if (DRAW_DIRECT) { update_tty (window); } else select_onscreen_window (record); } static void canonical_rect (Rect * r, short x1, short y1, short x2, short y2) { if (x1 < x2) { if (y1 < y2) { SetRect (r, x1, x2, y1, y2); } else { SetRect (r, x1, x2, y2, y1); } } else { if (y1 < y2) { SetRect (r, x2, x1, y1, y2); } else { SetRect (r, x2, x1, y2, y1); } } } /* * Line drawing - very device dependent */ short draw_tty_line (WindowPtr window, short from_x, short from_y , short to_x, short to_y) { Rect r; RECORD_EXISTS (record); select_offscreen_port (record); MoveTo (from_x, from_y); LineTo (to_x, to_y); canonical_rect (&r, from_x, from_y, to_x, to_y); accumulate_rect (record, &r); if (DRAW_DIRECT) { update_tty (window); } else select_onscreen_window (record); } #endif /* EXTENDED_SUPPORT */ slashem-0.0.7E7F3/sys/mac/NHrsrc.r0000664000076400007640000077462410545462317014640 0ustar alialiresource 'WIND' (128, "NULL") { {40, 40, 140, 162}, documentProc, invisible, goAway, 0x0, "Null Window !", staggerMainScreen }; resource 'WIND' (129, "Message") { {264, 8, 330, 240}, documentProc, invisible, noGoAway, 0x0, "Message", staggerMainScreen }; resource 'WIND' (130, "Status") { {302, 4, 338, 458}, documentProc, invisible, noGoAway, 0x0, "Status", staggerMainScreen }; resource 'WIND' (131, "Dungeon") { {40, 40, 330, 494}, documentProc, invisible, noGoAway, 0x0, "Dungeon Map", staggerMainScreen }; resource 'WIND' (132, "Menu") { {124, 218, 248, 394}, documentProc, invisible, goAway, 0x0, "", staggerMainScreen }; resource 'WIND' (133, "Text") { {190, 6, 336, 306}, documentProc, invisible, goAway, 0x0, "Info", staggerMainScreen }; resource 'WIND' (134, "Diagnostics") { {40, 40, 172, 460}, documentProc, invisible, goAway, 0x0, "Diagnostics", staggerMainScreen }; resource 'WIND' (135, "TTY Window") { {48, 16, 322, 493}, noGrowDocProc, invisible, noGoAway, 0x0, "Dungeon Map", centerMainScreen }; data 'TMPL' (128, "Nump") { $"0E4E 756D 6265 7220 6F66 206B 6579 734F" /* .Number of keysO */ $"434E 5405 2A2A 2A2A 2A4C 5354 4307 4B65" /* CNT.*****LSTC.Ke */ $"7963 6F64 6548 4259 5404 4368 6172 4348" /* ycodeHBYT.CharCH */ $"4152 052A 2A2A 2A2A 4C53 5445" /* AR.*****LSTE */ }; data 'TMPL' (129, "MNU#") { $"0B31 7374 206D 656E 7520 4944 4457 5244" /* .1st menu IDDWRD */ $"0A23 206F 6620 4D45 4E55 734F 434E 5405" /* .# of MENUsOCNT. */ $"2A2A 2A2A 2A4C 5354 4306 5265 7320 4944" /* *****LSTC.Res ID */ $"4457 5244 0852 6573 6572 7665 6446 5752" /* DWRD.ReservedFWR */ $"4405 2A2A 2A2A 2A4C 5354 45" /* D.*****LSTE */ }; data 'Nump' (128, "Unshifted") { $"000A 5979 5B6B 5C75 5668 576F 586C 5362" /* ..Yy[k\uVhWoXlSb */ $"546A 556E 522C" /* TjUnR, */ }; data 'Nump' (129, "Shifted") { $"000A 5959 5B4B 5C55 5648 576F 584C 5342" /* ..YY[K\UVHWoXLSB */ $"544A 554E 522C" /* TJUNR, */ }; data 'ALRT' (129, purgeable) { $"005A 006E 00EE 0192 0081 4444" /* .Z.n.î.’.DD */ }; resource 'ALRT' (128) { {68, 68, 178, 469}, 128, { /* array: 4 elements */ /* [1] */ OK, visible, silent, /* [2] */ OK, visible, silent, /* [3] */ OK, visible, silent, /* [4] */ OK, visible, silent }, alertPositionMainScreen }; resource 'ALRT' (5000, "About/error") { {74, 106, 211, 471}, 5000, { /* array: 4 elements */ /* [1] */ OK, invisible, silent, /* [2] */ OK, invisible, silent, /* [3] */ OK, invisible, silent, /* [4] */ OK, visible, silent }, alertPositionMainScreen }; resource 'ALRT' (5001, "Confirm") { {62, 78, 186, 434}, 5001, { /* array: 4 elements */ /* [1] */ OK, invisible, silent, /* [2] */ OK, invisible, silent, /* [3] */ OK, invisible, silent, /* [4] */ OK, visible, silent }, alertPositionMainScreen }; resource 'DITL' (129, purgeable) { { /* array DITLarray: 3 elements */ /* [1] */ {120, 198, 138, 272}, Button { enabled, "OK" }, /* [2] */ {10, 70, 115, 272}, StaticText { disabled, "Could not ^2 because ^0. ^1" }, /* [3] */ {10, 20, 42, 52}, Icon { disabled, 0 } } }; resource 'DITL' (128) { { /* array DITLarray: 2 elements */ /* [1] */ {80, 324, 100, 382}, Button { enabled, "OK" }, /* [2] */ {6, 56, 70, 380}, StaticText { disabled, "^0" } } }; resource 'DITL' (130) { { /* array DITLarray: 6 elements */ /* [1] */ {106, 249, 126, 307}, Button { enabled, "OK" }, /* [2] */ {106, 165, 126, 223}, Button { enabled, "Cancel" }, /* [3] */ {10, 85, 58, 315}, StaticText { disabled, "^0" }, /* [4] */ {68, 87, 84, 310}, EditText { enabled, "" }, /* [5] */ {10, 28, 42, 60}, Icon { disabled, 1 }, /* [6] */ {100, 244, 132, 276}, UserItem { disabled } } }; resource 'DITL' (136) { { /* array DITLarray: 8 elements */ /* [1] */ {99, 301, 119, 359}, Button { enabled, "Yes" }, /* [2] */ {99, 231, 119, 289}, Button { enabled, "No" }, /* [3] */ {99, 161, 119, 219}, EditText { disabled, "" }, /* [4] */ {99, 91, 119, 149}, Button { enabled, "All" }, /* [5] */ {99, 21, 119, 79}, Button { enabled, "Quit" }, /* [6] */ {11, 76, 84, 358}, StaticText { disabled, "^0" }, /* [7] */ {12, 20, 44, 52}, Icon { disabled, 1 }, /* [8] */ {94, 296, 126, 328}, UserItem { disabled } } }; resource 'DITL' (133) { { /* array DITLarray: 5 elements */ /* [1] */ {99, 301, 119, 359}, Button { enabled, "Yes" }, /* [2] */ {99, 231, 119, 289}, Button { enabled, "No" }, /* [3] */ {11, 76, 84, 358}, StaticText { disabled, "^0" }, /* [4] */ {12, 20, 44, 52}, Icon { disabled, 1 }, /* [5] */ {93, 296, 125, 328}, UserItem { disabled } } }; resource 'DITL' (134) { { /* array DITLarray: 6 elements */ /* [1] */ {99, 301, 119, 359}, Button { enabled, "Yes" }, /* [2] */ {99, 231, 119, 289}, Button { enabled, "No" }, /* [3] */ {99, 161, 119, 219}, Button { enabled, "Quit" }, /* [4] */ {11, 76, 84, 358}, StaticText { disabled, "^0" }, /* [5] */ {12, 20, 44, 52}, Icon { disabled, 1 }, /* [6] */ {93, 296, 125, 328}, UserItem { disabled } } }; resource 'DITL' (135) { { /* array DITLarray: 7 elements */ /* [1] */ {99, 301, 119, 359}, Button { enabled, "Yes" }, /* [2] */ {99, 231, 119, 289}, Button { enabled, "No" }, /* [3] */ {99, 161, 119, 219}, Button { enabled, "All" }, /* [4] */ {99, 91, 119, 149}, Button { enabled, "Quit" }, /* [5] */ {11, 76, 84, 358}, StaticText { disabled, "^0" }, /* [6] */ {12, 20, 44, 52}, Icon { disabled, 1 }, /* [7] */ {95, 297, 127, 329}, UserItem { disabled } } }; resource 'DITL' (137) { { /* array DITLarray: 6 elements */ /* [1] */ {66, 77, 86, 135}, Button { enabled, "OK" }, /* [2] */ {66, 11, 86, 69}, Button { enabled, "Cancel" }, /* [3] */ {7, 52, 55, 212}, StaticText { disabled, "^0" }, /* [4] */ {68, 152, 84, 204}, EditText { enabled, "Edit Text" }, /* [5] */ {8, 10, 40, 42}, Icon { disabled, 1 }, /* [6] */ {61, 73, 93, 105}, UserItem { disabled } } }; resource 'DITL' (5000) { { /* array DITLarray: 3 elements */ /* [1] */ {103, 260, 123, 340}, Button { enabled, "OK" }, /* [2] */ {11, 81, 88, 352}, StaticText { disabled, "^0^1" }, /* [3] */ {10, 24, 42, 56}, Icon { disabled, 1 } } }; resource 'DITL' (5001) { { /* array DITLarray: 4 elements */ /* [1] */ {93, 270, 113, 330}, Button { enabled, "No" }, /* [2] */ {93, 93, 113, 153}, Button { enabled, "Yes" }, /* [3] */ {10, 79, 80, 339}, StaticText { disabled, "^0" }, /* [4] */ {10, 22, 42, 54}, Icon { disabled, 0 } } }; resource 'DITL' (6000) { { /* array DITLarray: 17 elements */ /* [1] */ {40, 274, 60, 354}, Button { enabled, "Play" }, /* [2] */ {78, 274, 98, 354}, Button { enabled, "Quit" }, /* [3] */ {36, 270, 64, 358}, UserItem { disabled }, /* [4] */ {80, 72, 97, 122}, UserItem { enabled }, /* [5] */ {80, 186, 97, 238}, UserItem { enabled }, /* [6] */ {120, 72, 137, 122}, UserItem { enabled }, /* [7] */ {120, 188, 137, 238}, UserItem { enabled }, /* [8] */ {120, 318, 137, 353}, UserItem { enabled }, /* [9] */ {41, 74, 57, 240}, EditText { enabled, "Name" }, /* [10] */ {24, 20, 56, 52}, Icon { disabled, 1 }, /* [11] */ {80, 36, 96, 72}, StaticText { disabled, "Role:" }, /* [12] */ {80, 150, 96, 186}, StaticText { disabled, "Race:" }, /* [13] */ {120, 20, 136, 72}, StaticText { disabled, "Gender:" }, /* [14] */ {120, 150, 136, 188}, StaticText { disabled, "Align:" }, /* [15] */ {120, 274, 136, 318}, StaticText { disabled, "Mode:" }, /* [16] */ {19, 72, 36, 242}, StaticText { disabled, "Who are you?" }, /* [17] */ {0, 0, 0, 0}, HelpItem { enabled, HMScanhdlg { 6000 } } } }; resource 'STR#' (128, "Misc. Strings", purgeable) { { /* array StringArray: 1 elements */ /* [1] */ "Mac Slash'EM HelpÉ/?" } }; resource 'STR#' (131, "Keypress") { { /* array StringArray: 13 elements */ /* [1] */ "¥201 Control Keys", /* [2] */ "¥202 Punctuation", /* [3] */ "¥203 Brackets", /* [4] */ "¥204 a - m", /* [5] */ "¥205 n - z", /* [6] */ "¥206 A - M", /* [7] */ "¥207 N - Z", /* [8] */ "¥208 0 - 9", /* [9] */ "¥-", /* [10] */ "\0x1B¥escape", /* [11] */ " ¥space", /* [12] */ "\b¥delete", /* [13] */ "\n¥return" } }; resource 'STR#' (132, "Help") { { /* array StringArray: 8 elements */ /* [1] */ "O", /* [2] */ "¥-", /* [3] */ "?", /* [4] */ "&", /* [5] */ "¥-", /* [6] */ "v", /* [7] */ "V", /* [8] */ "#v¥ersion" } }; resource 'STR#' (133, "Information") { { /* array StringArray: 14 elements */ /* [1] */ "i", /* [2] */ "I", /* [3] */ "#a¥djust", /* [4] */ "¥-", /* [5] */ ":", /* [6] */ ";", /* [7] */ "/", /* [8] */ "^", /* [9] */ "¥-", /* [10] */ "C", /* [11] */ "#n¥ame", /* [12] */ "\\", /* [13] */ "¥-", /* [14] */ "#co¥nduct" } }; resource 'STR#' (134, "Equipment") { { /* array StringArray: 17 elements */ /* [1] */ "¥209 Current", /* [2] */ "¥-", /* [3] */ "w", /* [4] */ "x", /* [5] */ "Q", /* [6] */ "f", /* [7] */ "t", /* [8] */ "a", /* [9] */ "#en¥hance", /* [10] */ "#tw¥oweapon", /* [11] */ "¥-", /* [12] */ "W", /* [13] */ "T", /* [14] */ "A", /* [15] */ "¥-", /* [16] */ "P", /* [17] */ "R" } }; resource 'STR#' (135, "Action") { { /* array StringArray: 21 elements */ /* [1] */ ".", /* [2] */ "¥-", /* [3] */ "\0x14¥ ctl-t", /* [4] */ "#j¥ump", /* [5] */ "#m¥onster", /* [6] */ "#w¥ipe", /* [7] */ "¥-", /* [8] */ "a", /* [9] */ "p", /* [10] */ "\0x04¥ctl-d", /* [11] */ "#ch¥at", /* [12] */ "#o¥ffer", /* [13] */ "#p¥ray", /* [14] */ "#ri¥de", /* [15] */ "#tu¥rn", /* [16] */ "¥-", /* [17] */ "#b¥orrow", /* [18] */ "#te¥chnique", /* [19] */ "x", /* [20] */ "#2¥weapon", /* [21] */ "#en¥hance" } }; resource 'STR#' (136, "Magic") { { /* array StringArray: 17 elements */ /* [1] */ "d", /* [2] */ "D", /* [3] */ ",", /* [4] */ "@", /* [5] */ "¥-", /* [6] */ "e", /* [7] */ "r", /* [8] */ "q", /* [9] */ "#d¥ip", /* [10] */ "¥-", /* [11] */ "+", /* [12] */ "Z", /* [13] */ "z", /* [14] */ "#i¥nvoke", /* [15] */ "#ru¥b", /* [16] */ "¥-", /* [17] */ "#y¥oupoly" } }; resource 'STR#' (137, "Bits") { { /* array StringArray: 16 elements */ /* [1] */ "s", /* [2] */ "c", /* [3] */ "o", /* [4] */ "a", /* [5] */ "\0x04¥ctl-d", /* [6] */ "¥-", /* [7] */ "#u¥ntrap", /* [8] */ "#f¥orce", /* [9] */ "#l¥oot", /* [10] */ "¥-", /* [11] */ "E", /* [12] */ "#d¥ip", /* [13] */ "#s¥it", /* [14] */ "¥-", /* [15] */ "<", /* [16] */ ">" } }; resource 'STR#' (201, "control keys") { { /* array StringArray: 13 elements */ /* [1] */ "\0x02¥ctl-b", /* [2] */ "\r¥ctl-j", /* [3] */ "\0x0E¥ctl-n", /* [4] */ "\b¥ctl-h", /* [5] */ "\f¥ctl-l", /* [6] */ "\0x19¥ctl-y", /* [7] */ "\v¥ctl-k", /* [8] */ "\0x15¥ctl-u", /* [9] */ "¥-", /* [10] */ "\0x04¥ctl-d", /* [11] */ "\0x10¥ctl-p", /* [12] */ "\0x12¥ctl-r", /* [13] */ "\0x14¥ctl-t" } }; resource 'STR#' (202, "punctuation") { { /* array StringArray: 16 elements */ /* [1] */ ".", /* [2] */ ",", /* [3] */ ";", /* [4] */ ":", /* [5] */ "!", /* [6] */ "?", /* [7] */ "+", /* [8] */ "-", /* [9] */ "=", /* [10] */ "#", /* [11] */ "$", /* [12] */ "@", /* [13] */ "&", /* [14] */ "*", /* [15] */ "~", /* [16] */ "_" } }; resource 'STR#' (203, "brackets") { { /* array StringArray: 16 elements */ /* [1] */ "[", /* [2] */ "]", /* [3] */ "(", /* [4] */ ")", /* [5] */ "{", /* [6] */ "}", /* [7] */ "<", /* [8] */ ">", /* [9] */ "^", /* [10] */ "`", /* [11] */ "'", /* [12] */ "\"", /* [13] */ "\\", /* [14] */ "/", /* [15] */ "|", /* [16] */ "%" } }; resource 'STR#' (204, "a - m") { { /* array StringArray: 13 elements */ /* [1] */ "a", /* [2] */ "b", /* [3] */ "c", /* [4] */ "d", /* [5] */ "e", /* [6] */ "f", /* [7] */ "g", /* [8] */ "h", /* [9] */ "i", /* [10] */ "j", /* [11] */ "k", /* [12] */ "l", /* [13] */ "m" } }; resource 'STR#' (205, "n - z") { { /* array StringArray: 13 elements */ /* [1] */ "n", /* [2] */ "o", /* [3] */ "p", /* [4] */ "q", /* [5] */ "r", /* [6] */ "s", /* [7] */ "t", /* [8] */ "u", /* [9] */ "v", /* [10] */ "w", /* [11] */ "x", /* [12] */ "y", /* [13] */ "z" } }; resource 'STR#' (206, "A - M") { { /* array StringArray: 13 elements */ /* [1] */ "A", /* [2] */ "B", /* [3] */ "C", /* [4] */ "D", /* [5] */ "E", /* [6] */ "F", /* [7] */ "G", /* [8] */ "H", /* [9] */ "I", /* [10] */ "J", /* [11] */ "K", /* [12] */ "L", /* [13] */ "M" } }; resource 'STR#' (207, "N - Z") { { /* array StringArray: 13 elements */ /* [1] */ "N", /* [2] */ "O", /* [3] */ "P", /* [4] */ "Q", /* [5] */ "R", /* [6] */ "S", /* [7] */ "T", /* [8] */ "U", /* [9] */ "V", /* [10] */ "W", /* [11] */ "X", /* [12] */ "Y", /* [13] */ "Z" } }; resource 'STR#' (208, "0 - 9") { { /* array StringArray: 10 elements */ /* [1] */ "0", /* [2] */ "1", /* [3] */ "2", /* [4] */ "3", /* [5] */ "4", /* [6] */ "5", /* [7] */ "6", /* [8] */ "7", /* [9] */ "8", /* [10] */ "9" } }; resource 'STR#' (200, "wizard") { { /* array StringArray: 19 elements */ /* [1] */ "\0x18¥ctl-x", /* [2] */ "\0x05¥ctl-e", /* [3] */ "\0x06¥ctl-f", /* [4] */ "\0x07¥ctl-g", /* [5] */ "\t¥ctl-i", /* [6] */ "\0x0F¥ctl-o", /* [7] */ "\0x16¥ctl-v", /* [8] */ "\0x17¥ctl-w", /* [9] */ "¥-", /* [10] */ "\0x03¥ctl-c", /* [11] */ "\r¥ctl-j", /* [12] */ "\0x0E¥ctl-n", /* [13] */ "¥-", /* [14] */ "#li¥ght sources", /* [15] */ "#se¥env", /* [16] */ "#st¥ats", /* [17] */ "#ti¥meout", /* [18] */ "#vi¥sion", /* [19] */ "#wm¥ode" } }; resource 'STR#' (209, "current") { { /* array StringArray: 9 elements */ /* [1] */ ")", /* [2] */ "[", /* [3] */ "=", /* [4] */ "\"", /* [5] */ "(", /* [6] */ "$", /* [7] */ "+", /* [8] */ "¥-", /* [9] */ "*" } }; resource 'ics4' (1000) { $"0000 0000 0000 0000 0000 000F FF00 0000" $"00FF 00F1 01F0 0000 00FB F00F 101F 0000" $"000F BF0F 0101 F000 0000 FBFF 1010 F000" $"00F0 0FBF FFF1 F000 0F0F FFFB F00F 0000" $"0F10 10FF BF00 0000 0F01 01F0 FBF0 0000" $"00F0 10F0 0FBF 0000 000F 010F 00FB F000" $"0000 FFF0 000F BF00 0000 0000 0000 FBF0" $"0000 0000 0000 0FBF 0000 0000 0000 00FF" }; resource 'ics4' (1001) { $"00FF FFFF FFF0 0000 00F0 0000 00FF 0000" $"00F0 0000 00FC F000 00F0 0000 00FF FF00" $"00F0 0000 0000 0F00 00F0 0FF0 0000 0F00" $"00F0 FFFF 0000 0F00 00F0 FFFF 0FFF 0F00" $"00F0 0FF0 0000 0F00 00F0 0000 0000 0F00" $"00F0 0FF0 0000 0F00 00F0 F00F 0FF0 0F00" $"00F0 F00F 0000 0F00 00F0 0FF0 0000 0F00" $"00F0 0000 0000 0F00 00FF FFFF FFFF FF" }; resource 'ics4' (1002) { $"00FF FFFF FFF0 0000 00F0 0000 00FF 0000" $"00F0 0000 00FC F000 00F0 0000 00FF FF00" $"00F0 0000 0000 0F00 00F0 0F00 F0F0 0F00" $"00F0 F0F0 F0F0 0F00 00F0 F0F0 F0F0 0F00" $"00F0 0F00 F0F0 0F00 00F0 0000 0000 0F00" $"00F0 F00F 00F0 0F00 00F0 F0F0 F0F0 0F00" $"00F0 F0F0 F0F0 0F00 00F0 F00F 00F0 0F00" $"00F0 0000 0000 0F00 00FF FFFF FFFF FF" }; resource 'ics4' (1003, purgeable) { $"00FF FFFF FFF0 0000 00F0 0000 00FF 0000" $"00F0 0000 00FC F000 00F0 0000 00FF FF00" $"00F0 0000 0000 0F00 00F0 0000 0000 0F00" $"00F0 00FF FF00 0F00 00F0 0F01 01F0 0F00" $"00F0 F01F F01F 0F00 00F0 F1F1 0F0F 0F00" $"00F0 F0F0 1F1F 0F00 00F0 F10F FFF0 0F00" $"00F0 0F10 1010 0F00 00F0 00FF FFF0 0F00" $"00F0 0000 0000 0F00 00FF FFFF FFFF FF" }; resource 'ics4' (1004, purgeable) { $"00FF FFFF FFF0 0000 00F0 0000 00FF 0000" $"00F0 0000 00FC F000 00F0 0000 00FF FF00" $"00F0 0000 0000 0F00 00F0 00FF FF00 0F00" $"00F0 0F10 10F0 0F00 00F0 F1F1 0F0F 0F00" $"00F0 F0F0 1F1F 0F00 00F0 F101 010F 0F00" $"00F0 0F10 10F0 0F00 00F0 0F0F F1F0 0F00" $"00F0 0F10 10F0 0F00 00F0 00FF FF00 0F00" $"00F0 0000 0000 0F00 00FF FFFF FFFF FF" }; resource 'ics#' (1000) { { /* array: 2 elements */ /* [1] */ $"0000 01C0 3220 3910 1D08 0F08 27E8 5F90" $"43C0 42E0 2270 1138 0E1C 000E 0007 0003", /* [2] */ $"0000 01C0 33E0 39F0 1DF8 0FF8 27F8 7F90" $"7FC0 7EE0 3E70 1F38 0E1C 000E 0007 0003" } }; resource 'ics#' (1001) { { /* array: 2 elements */ /* [1] */ $"3FE0 2030 2028 203C 2004 2604 2F04 2F74" $"2604 2004 2604 2964 2904 2604 2004 3FFC", /* [2] */ $"3FE0 3FF0 3FF8 3FFC 3FFC 3FFC 3FFC 3FFC" $"3FFC 3FFC 3FFC 3FFC 3FFC 3FFC 3FFC 3FFC" } }; resource 'ics#' (1002) { { /* array: 2 elements */ /* [1] */ $"3FE0 2030 2028 203C 2004 24A4 2AA4 2AA4" $"24A4 2004 2924 2AA4 2AA4 2924 2004 3FFC", /* [2] */ $"3FE0 3FF0 3FF8 3FFC 3FFC 3FFC 3FFC 3FFC" $"3FFC 3FFC 3FFC 3FFC 3FFC 3FFC 3FFC 3FFC" } }; resource 'ics#' (1003, purgeable) { { /* array: 2 elements */ /* [1] */ $"3FE0 2030 2028 203C 2004 2004 23C4 2424" $"2994 2A54 2A54 29E4 2404 23E4 2004 3FFC", /* [2] */ $"3FE0 3FF0 3FF8 3FFC 3FFC 3FFC 3FFC 3FFC" $"3FFC 3FFC 3FFC 3FFC 3FFC 3FFC 3FFC 3FFC" } }; resource 'ics#' (1004, purgeable) { { /* array: 2 elements */ /* [1] */ $"3FE0 2030 2028 203C 2004 23C4 2424 2A54" $"2A54 2814 2424 25A4 2424 23C4 2004 3FFC", /* [2] */ $"3FE0 3FF0 3FF8 3FFC 3FFC 3FFC 3FFC 3FFC" $"3FFC 3FFC 3FFC 3FFC 3FFC 3FFC 3FFC 3FFC" } }; resource 'ICN#' (1000) { { /* array: 2 elements */ /* [1] */ $"0000 0000 000F 8000 0030 6000 1020 1000" $"1C10 0800 0E10 0800 0F10 0400 0790 0400" $"03F0 0400 01E0 0400 00F0 0400 30FB E400" $"4F3E 1800 401E 0000 400F 0000 400F 8000" $"4013 C000 4011 E000 2010 F000 2010 7800" $"1008 3C00 0C18 1E00 03E0 0F00 0000 0780" $"0000 03C0 0000 01E0 0000 00F0 0000 0078" $"0000 003C 0000 001E 0000 000E 0000 0004", /* [2] */ $"0000 0000 000F 8000 003F E000 103F F000" $"1C1F F800 0E1F F800 0F1F FC00 079F FC00" $"03FF FC00 01FF FC00 00FF FC00 30FF FC00" $"7FFE 1800 7FFE 0000 7FFF 0000 7FFF 8000" $"7FF3 C000 7FF1 E000 3FF0 F000 3FF0 7800" $"1FF8 3C00 0FF8 1E00 03E0 0F00 0000 0780" $"0000 03C0 0000 01E0 0000 00F0 0000 0078" $"0000 003C 0000 001E 0000 000E 0000 0004" } }; resource 'ICN#' (1001) { { /* array: 2 elements */ /* [1] */ $"0FFF FC00 0800 0600 080E 0500 0991 0480" $"09C8 8440 08E8 4420 0878 47F0 093F 4010" $"0AFC 8010 0A1E 0010 0A17 0010 0913 8010" $"0889 C010 0870 E010 0800 7010 0800 3810" $"0800 1810 0860 0010 0890 0010 0968 0010" $"0969 FE10 0890 0010 0860 0010 0800 0010" $"0860 0010 0890 0010 0908 0010 0909 BF90" $"0890 0010 0860 0010 0800 0010 0FFF FFF0", /* [2] */ $"0FFF FC00 0FFF FE00 0FFF FF00 0FFF FF80" $"0FFF FFC0 0FFF FFE0 0FFF FFF0 0FFF FFF0" $"0FFF FFF0 0FFF FFF0 0FFF FFF0 0FFF FFF0" $"0FFF FFF0 0FFF FFF0 0FFF FFF0 0FFF FFF0" $"0FFF FFF0 0FFF FFF0 0FFF FFF0 0FFF FFF0" $"0FFF FFF0 0FFF FFF0 0FFF FFF0 0FFF FFF0" $"0FFF FFF0 0FFF FFF0 0FFF FFF0 0FFF FFF0" $"0FFF FFF0 0FFF FFF0 0FFF FFF0 0FFF FFF0" } }; resource 'ICN#' (1002) { { /* array: 2 elements */ /* [1] */ $"0FFF FC00 0800 0600 080E 0500 0991 0480" $"09C8 8440 08E8 4420 0878 47F0 093F 4010" $"0AFC 8010 0A1E 0010 0A17 0010 0913 8010" $"0889 C010 0870 E010 0800 7010 0800 3810" $"0800 1810 0994 C650 0A55 2950 0A55 2950" $"0A55 2950 0A55 2950 0994 C650 0800 0010" $"0A65 3190 0A95 4A50 0A95 4A50 0A95 4A50" $"0A95 4A50 0A65 3190 0800 0010 0FFF FFF0", /* [2] */ $"0FFF FC00 0FFF FE00 0FFF FF00 0FFF FF80" $"0FFF FFC0 0FFF FFE0 0FFF FFF0 0FFF FFF0" $"0FFF FFF0 0FFF FFF0 0FFF FFF0 0FFF FFF0" $"0FFF FFF0 0FFF FFF0 0FFF FFF0 0FFF FFF0" $"0FFF FFF0 0FFF FFF0 0FFF FFF0 0FFF FFF0" $"0FFF FFF0 0FFF FFF0 0FFF FFF0 0FFF FFF0" $"0FFF FFF0 0FFF FFF0 0FFF FFF0 0FFF FFF0" $"0FFF FFF0 0FFF FFF0 0FFF FFF0 0FFF FFF0" } }; resource 'ICN#' (1003, purgeable) { { /* array: 2 elements */ /* [1] */ $"0FFF FC00 0800 0600 080E 0500 0991 0480" $"09C8 8440 08E8 4420 0878 47F0 093F 4010" $"0AFC 8010 0A1E 0010 0A17 0010 0913 8010" $"0889 C010 0870 E010 0800 7010 0800 3810" $"0800 1810 0800 0010 0800 0010 0800 0010" $"0803 C010 0804 2010 0809 9010 080A 5010" $"080A 5010 0809 E010 0804 0010 0803 E010" $"0800 0010 0800 0010 0800 0010 0FFF FFF0", /* [2] */ $"0FFF FC00 0FFF FE00 0FFF FF00 0FFF FF80" $"0FFF FFC0 0FFF FFE0 0FFF FFF0 0FFF FFF0" $"0FFF FFF0 0FFF FFF0 0FFF FFF0 0FFF FFF0" $"0FFF FFF0 0FFF FFF0 0FFF FFF0 0FFF FFF0" $"0FFF FFF0 0FFF FFF0 0FFF FFF0 0FFF FFF0" $"0FFF FFF0 0FFF FFF0 0FFF FFF0 0FFF FFF0" $"0FFF FFF0 0FFF FFF0 0FFF FFF0 0FFF FFF0" $"0FFF FFF0 0FFF FFF0 0FFF FFF0 0FFF FFF0" } }; resource 'ICN#' (1004, purgeable) { { /* array: 2 elements */ /* [1] */ $"0FFF FC00 0800 0600 080E 0500 0991 0480" $"09C8 8440 08E8 4420 0878 47F0 093F 4010" $"0AFC 8010 0A1E 0010 0A17 0010 0913 8010" $"0889 C010 0870 E010 0800 7010 0800 3810" $"0800 1810 0887 C210 0958 3510 0960 0D10" $"0A2C 6890 0AD2 9690 0952 9510 084C 6410" $"0920 0910 0AD0 1690 0A17 D090 0928 2910" $"0948 2510 08C7 C610 0800 0010 0FFF FFF0", /* [2] */ $"0FFF FC00 0FFF FE00 0FFF FF00 0FFF FF80" $"0FFF FFC0 0FFF FFE0 0FFF FFF0 0FFF FFF0" $"0FFF FFF0 0FFF FFF0 0FFF FFF0 0FFF FFF0" $"0FFF FFF0 0FFF FFF0 0FFF FFF0 0FFF FFF0" $"0FFF FFF0 0FFF FFF0 0FFF FFF0 0FFF FFF0" $"0FFF FFF0 0FFF FFF0 0FFF FFF0 0FFF FFF0" $"0FFF FFF0 0FFF FFF0 0FFF FFF0 0FFF FFF0" $"0FFF FFF0 0FFF FFF0 0FFF FFF0 0FFF FFF0" } }; resource 'icl4' (1000) { $"0000 0000 0000 0000 0000 0000 0000 0000" $"0000 0000 0000 FFFF F000 0000 0000 0000" $"0000 0000 00FF 1010 1FF0 0000 0000 0000" $"000F 0000 00F1 0101 010F 0000 0000 0000" $"000F FF00 000F 1010 1010 F000 0000 0000" $"0000 FBF0 000F 0101 0101 F000 0000 0000" $"0000 FBBF 000F 1010 1010 1F00 0000 0000" $"0000 0FBB F00F 0101 0101 0F00 0000 0000" $"0000 00FB BFFF 1010 1010 1F00 0000 0000" $"0000 000F BBF1 0101 0101 0F00 0000 0000" $"0000 0000 FBBF 1010 1010 1F00 0000 0000" $"00FF 0000 FFBB F1FF FFF1 0F00 0000 0000" $"0F10 FFFF 10FB BFF0 000F F000 0000 0000" $"0F01 0101 010F BBF0 0000 0000 0000 0000" $"0F10 1010 1010 FBBF 0000 0000 0000 0000" $"0F01 0101 0101 FFBB F000 0000 0000 0000" $"0F10 1010 101F 00FB BF00 0000 0000 0000" $"0F01 0101 010F 000F BBF0 0000 0000 0000" $"00F0 1010 101F 0000 FBBF 0000 0000 0000" $"00F1 0101 010F 0000 0FBB F000 0000 0000" $"000F 1010 1010 F000 00FB BF00 0000 0000" $"0000 FF01 010F F000 000F BBF0 0000 0000" $"0000 00FF FFF0 0000 0000 FBBF 0000 0000" $"0000 0000 0000 0000 0000 0FBB F000 0000" $"0000 0000 0000 0000 0000 00FB BF00 0000" $"0000 0000 0000 0000 0000 000F BBF0 0000" $"0000 0000 0000 0000 0000 0000 FBBF 0000" $"0000 0000 0000 0000 0000 0000 0FBB F000" $"0000 0000 0000 0000 0000 0000 00FB BF00" $"0000 0000 0000 0000 0000 0000 000F BBF0" $"0000 0000 0000 0000 0000 0000 0000 FBF0" $"0000 0000 0000 0000 0000 0000 0000 0F" }; resource 'icl4' (1001) { $"0000 FFFF FFFF FFFF FFFF FF00 0000 0000" $"0000 F000 0000 0000 0000 0FF0 0000 0000" $"0000 F000 0000 FFF0 0000 0FCF 0000 0000" $"0000 F00F F00F 101F 0000 0FCC F000 0000" $"0000 F00F BF00 F101 F000 0FCC CF00 0000" $"0000 F000 FBF0 F010 1F00 0FCC CCF0 0000" $"0000 F000 0FBF F101 0F00 0FFF FFFF 0000" $"0000 F00F 00FB FFFF 1F00 0000 000F 0000" $"0000 F0F0 FFFF BF00 F000 0000 000F 0000" $"0000 F0F1 010F FBF0 0000 0000 000F 0000" $"0000 F0F0 101F 0FBF 0000 0000 000F 0000" $"0000 F00F 010F 00FB F000 0000 000F 0000" $"0000 F000 F010 F00F BF00 0000 000F 0000" $"0000 F000 0FFF 0000 FBF0 0000 000F 0000" $"0000 F000 0000 0000 0FBF 0000 000F 0000" $"0000 F000 0000 0000 00FB F000 000F 0000" $"0000 F000 0000 0000 000F F000 000F 0000" $"0000 F000 0FF0 0000 0000 0000 000F 0000" $"0000 F000 F00F 0000 0000 0000 000F 0000" $"0000 F00F 0FF0 F000 0000 0000 000F 0000" $"0000 F00F 0FF0 F00F FFFF FFF0 000F 0000" $"0000 F000 F00F 0000 0000 0000 000F 0000" $"0000 F000 0FF0 0000 0000 0000 000F 0000" $"0000 F000 0000 0000 0000 0000 000F 0000" $"0000 F000 0FF0 0000 0000 0000 000F 0000" $"0000 F000 F00F 0000 0000 0000 000F 0000" $"0000 F00F 0000 F000 0000 0000 000F 0000" $"0000 F00F 0000 F00F F0FF FFFF F00F 0000" $"0000 F000 F00F 0000 0000 0000 000F 0000" $"0000 F000 0FF0 0000 0000 0000 000F 0000" $"0000 F000 0000 0000 0000 0000 000F 0000" $"0000 FFFF FFFF FFFF FFFF FFFF FFFF" }; resource 'icl4' (1002) { $"0000 FFFF FFFF FFFF FFFF FF00 0000 0000" $"0000 F000 0000 0000 0000 0FF0 0000 0000" $"0000 F000 0000 FFF0 0000 0FCF 0000 0000" $"0000 F00F F00F 101F 0000 0FCC F000 0000" $"0000 F00F BF00 F101 F000 0FCC CF00 0000" $"0000 F000 FBF0 F010 1F00 0FCC CCF0 0000" $"0000 F000 0FBF F101 0F00 0FFF FFFF 0000" $"0000 F00F 00FB FFFF 1F00 0000 000F 0000" $"0000 F0F0 FFFF BF00 F000 0000 000F 0000" $"0000 F0F1 010F FBF0 0000 0000 000F 0000" $"0000 F0F0 101F 0FBF 0000 0000 000F 0000" $"0000 F00F 010F 00FB F000 0000 000F 0000" $"0000 F000 F010 F00F BF00 0000 000F 0000" $"0000 F000 0FFF 0000 FBF0 0000 000F 0000" $"0000 F000 0000 0000 0FBF 0000 000F 0000" $"0000 F000 0000 0000 00FB F000 000F 0000" $"0000 F000 0000 0000 000F F000 000F 0000" $"0000 F00F F00F 0F00 FF00 0FF0 0F0F 0000" $"0000 F0F0 0F0F 0F0F 00F0 F00F 0F0F 0000" $"0000 F0F0 0F0F 0F0F 00F0 F00F 0F0F 0000" $"0000 F0F0 0F0F 0F0F 00F0 F00F 0F0F 0000" $"0000 F0F0 0F0F 0F0F 00F0 F00F 0F0F 0000" $"0000 F00F F00F 0F00 FF00 0FF0 0F0F 0000" $"0000 F000 0000 0000 0000 0000 000F 0000" $"0000 F0F0 0FF0 0F0F 00FF 000F F00F 0000" $"0000 F0F0 F00F 0F0F 0F00 F0F0 0F0F 0000" $"0000 F0F0 F00F 0F0F 0F00 F0F0 0F0F 0000" $"0000 F0F0 F00F 0F0F 0F00 F0F0 0F0F 0000" $"0000 F0F0 F00F 0F0F 0F00 F0F0 0F0F 0000" $"0000 F0F0 0FF0 0F0F 00FF 000F F00F 0000" $"0000 F000 0000 0000 0000 0000 000F 0000" $"0000 FFFF FFFF FFFF FFFF FFFF FFFF" }; resource 'icl4' (1003, purgeable) { $"0000 FFFF FFFF FFFF FFFF FF00 0000 0000" $"0000 F000 0000 0000 0000 0FF0 0000 0000" $"0000 F000 0000 FFF0 0000 0FCF 0000 0000" $"0000 F00F F00F 101F 0000 0FCC F000 0000" $"0000 F00F BF00 F101 F000 0FCC CF00 0000" $"0000 F000 FBF0 F010 1F00 0FCC CCF0 0000" $"0000 F000 0FBF F101 0F00 0FFF FFFF 0000" $"0000 F00F 00FB FFFF 1F00 0000 000F 0000" $"0000 F0F0 FFFF BF00 F000 0000 000F 0000" $"0000 F0F1 010F FBF0 0000 0000 000F 0000" $"0000 F0F0 101F 0FBF 0000 0000 000F 0000" $"0000 F00F 010F 00FB F000 0000 000F 0000" $"0000 F000 F010 F00F BF00 0000 000F 0000" $"0000 F000 0FFF 0000 FBF0 0000 000F 0000" $"0000 F000 0000 0000 0FBF 0000 000F 0000" $"0000 F000 0000 0000 00FB F000 000F 0000" $"0000 F000 0000 0000 000F F000 000F 0000" $"0000 F000 0000 0000 0000 0000 000F 0000" $"0000 F000 0000 0000 0000 0000 000F 0000" $"0000 F000 0000 0000 0000 0000 000F 0000" $"0000 F000 0000 00FF FF00 0000 000F 0000" $"0000 F000 0000 0F01 01F0 0000 000F 0000" $"0000 F000 0000 F01F F01F 0000 000F 0000" $"0000 F000 0000 F1F1 0F0F 0000 000F 0000" $"0000 F000 0000 F0F0 1F1F 0000 000F 0000" $"0000 F000 0000 F10F FFF0 0000 000F 0000" $"0000 F000 0000 0F10 1010 0000 000F 0000" $"0000 F000 0000 00FF FFF0 0000 000F 0000" $"0000 F000 0000 0000 0000 0000 000F 0000" $"0000 F000 0000 0000 0000 0000 000F 0000" $"0000 F000 0000 0000 0000 0000 000F 0000" $"0000 FFFF FFFF FFFF FFFF FFFF FFFF" }; resource 'icl4' (1004, purgeable) { $"0000 FFFF FFFF FFFF FFFF FF00 0000 0000" $"0000 F000 0000 0000 0000 0FF0 0000 0000" $"0000 F000 0000 FFF0 0000 0FCF 0000 0000" $"0000 F00F F00F 101F 0000 0FCC F000 0000" $"0000 F00F BF00 F101 F000 0FCC CF00 0000" $"0000 F000 FBF0 F010 1F00 0FCC CCF0 0000" $"0000 F000 0FBF F101 0F00 0FFF FFFF 0000" $"0000 F00F 00FB FFFF 1F00 0000 000F 0000" $"0000 F0F0 FFFF BF00 F000 0000 000F 0000" $"0000 F0F1 010F FBF0 0000 0000 000F 0000" $"0000 F0F0 101F 0FBF 0000 0000 000F 0000" $"0000 F00F 010F 00FB F000 0000 000F 0000" $"0000 F000 F010 F00F BF00 0000 000F 0000" $"0000 F000 0FFF 0000 FBF0 0000 000F 0000" $"0000 F000 0000 0000 0FBF 0000 000F 0000" $"0000 F000 0000 0000 00FB F000 000F 0000" $"0000 F000 0000 0000 000F F000 000F 0000" $"0000 F000 F000 0FFF FF00 00F0 000F 0000" $"0000 F00F 1F0F F010 10FF 0F1F 000F 0000" $"0000 F00F 0FF1 0101 0101 FF0F 000F 0000" $"0000 F0F0 10F0 FF10 1FF0 F010 F00F 0000" $"0000 F0F1 FF0F CCF1 FCCF 0FF1 F00F 0000" $"0000 F00F 0F1F CCF0 FCCF 1F0F 000F 0000" $"0000 F000 0F01 FF01 0FF1 0F00 000F 0000" $"0000 F00F 00F0 1010 1010 F00F 000F 0000" $"0000 F0F1 FF0F 0101 010F 0FF1 F00F 0000" $"0000 F0F0 101F 1FFF FF1F 1010 F00F 0000" $"0000 F00F 01F0 F101 01F0 F10F 000F 0000" $"0000 F00F 1F00 F010 10F0 0F1F 000F 0000" $"0000 F000 FF00 0FFF FF00 0FF0 000F 0000" $"0000 F000 0000 0000 0000 0000 000F 0000" $"0000 FFFF FFFF FFFF FFFF FFFF FFFF" }; resource 'DLOG' (136, "ynNaq") { {66, 92, 195, 471}, movableDBoxProc, invisible, noGoAway, 0x0, 136, "", alertPositionParentWindowScreen }; resource 'DLOG' (135, "ynaq") { {66, 92, 195, 471}, movableDBoxProc, invisible, noGoAway, 0x0, 135, "", alertPositionParentWindowScreen }; resource 'DLOG' (134, "ynq") { {66, 92, 195, 471}, movableDBoxProc, invisible, noGoAway, 0x0, 134, "", alertPositionParentWindowScreen }; resource 'DLOG' (133, "yn") { {66, 92, 195, 471}, movableDBoxProc, invisible, noGoAway, 0x0, 133, "", alertPositionParentWindowScreen }; resource 'DLOG' (137, "Small Getline") { {188, 154, 283, 371}, movableDBoxProc, invisible, noGoAway, 0x0, 137, "", centerParentWindowScreen }; resource 'DLOG' (130, "Prompt") { {90, 94, 232, 423}, movableDBoxProc, invisible, noGoAway, 0x0, 130, "", alertPositionParentWindowScreen }; resource 'DLOG' (6000, "askname") { {66, 46, 226, 434}, movableDBoxProc, visible, noGoAway, 0x0, 6000, "Select a Character", alertPositionMainScreen }; resource 'FONT' (19337, purgeable) { doExpandFont, proportionalFont, blackFont, notSynthetic, nofctbRsrc, oneBit, noCharWidthTable, noImageHeightTable, 0, 254, 6, 0, -9, 6, 11, 9, 2, 0, 63, $"0000 0000 0000 0000 0000 0000 0000 0000" $"0000 0000 0000 0000 0000 0000 0000 0000" $"0000 0000 0000 0000 0000 0000 0000 0000" $"0000 00D8 0000 0000 0000 1441 0000 0000" $"0029 4000 0030 0000 1A00 0002 1840 056B" $"5889 4007 E039 4420 8040 0495 C070 1C01" $"C214 0015 0014 208F C0FF F001 F800 0000" $"7380 2000 0000 0000 2000 000E 6001 0010" $"0000 0000 0000 0000 0000 0000 0000 0000" $"0000 0000 0000 0000 0000 0000 0000 0000" $"0000 0000 0000 0000 0000 0000 0000 0070" $"0050 8802 1804 0102 80A2 0004 0208 8000" $"0060 0041 2213 6C00 0002 2880 0001 F889" $"4005 A029 4420 8040 0495 4050 1401 4214" $"0015 0014 208F C0FF F00D 0800 0000 2440" $"5002 F3C0 0004 2003 0009 9006 D539 EC4C" $"2000 05CB 9C2F BBEE 7000 0E73 BCEF 7FEE" $"8F0C 6118 BBCE F3BF 18C6 31FF 1A02 0400" $"1018 2130 C000 0000 0200 0000 00A9 AEF9" $"14A1 240A 50AD 5CEF 81EA 5114 453A 2094" $"7C42 4425 A2EC 4002 4920 056B 5889 4005" $"A029 4420 8040 0495 4050 1401 4214 0015" $"0014 208F C0FF F013 003E 0036 745C 4005" $"FC20 121A 2004 8009 20F4 DFD6 B292 A900" $"063C 6268 4031 8820 918C 6318 C211 8A0C" $"A1BC C631 8C49 18C5 510D 0D01 0400 1020" $"2010 4000 0000 0200 0000 00AA D1F8 0000" $"1800 0000 2318 0280 0000 0046 2482 A240" $"0000 3332 0002 AA00 0001 F889 4005 A029" $"4420 8040 0495 4050 1401 4214 0015 0014" $"208F C0FF F023 0012 0009 AC62 203D FC3F" $"912A 240C B839 4095 8552 D421 7100 0A68" $"42AF 7831 8D5F 41EC 6308 C210 8A0D 215A" $"C631 8C09 18C4 9114 8800 7F9C F773 FD32" $"7D67 79F6 7FC6 358C 7EA8 1053 9EF7 BDCE" $"7392 6318 3A8E 73A3 18C6 2EE7 E2E7 CE8D" $"AB32 4001 5560 056B 58F9 41FD BFE9 7C20" $"8040 04F5 7FDF F7FF 7F95 F815 F815 F88F" $"C0FF F765 07C8 FC88 AFE2 EDCB FC20 7CC8" $"2073 7C29 FE97 8FB9 4821 AFCF 8AA8 8D20" $"C44E 8880 22AF FD08 FBD3 FA0E 2119 C7D1" $"F389 18C4 8A24 8800 8C63 18A4 6334 6B98" $"C639 8246 3554 4504 1054 6318 C631 8C52" $"7FFF 57D1 8C63 18C6 3581 3C48 D18E 66EC" $"8FFE 1969 9001 FF8F 7E31 B18F C7FF FFFF" $"FF97 330C 330C 207E 07FF 27FE 27FF FFFF" $"F8A5 0285 1488 AC63 1ACB FC3F 9128 3F88" $"7C40 0E90 8515 B521 2100 1329 03F0 C491" $"785F 44F4 6308 C211 8A8D 2118 C611 8849" $"18D4 8444 4800 8C61 1FA4 633C 6B18 C630" $"7246 3524 48A8 1077 E318 C61F FFD2 6318" $"7E91 8C63 18C6 3487 E448 D18C 6201 0804" $"21F2 4D6B 58F9 4BFD BDF8 3C40 0240 04F5" $"F7FF 77FF 7F81 F941 FD15 F84F FFFC 08A3" $"0289 1488 7463 1DD3 FC20 1218 2070 7F40" $"0E90 0056 B212 0100 122A 2228 C491 0820" $"8084 6318 C211 8A8C A118 C611 8C49 156D" $"4484 4800 9C61 1824 6332 6B18 C630 0A4D" $"5554 50A8 1124 2739 CE10 8412 6318 5291" $"8C67 38C6 3589 2E49 D19C 63FF 1804 4072" $"4801 F889 4A25 A500 0040 0240 0494 1401" $"5401 4000 2140 2514 204F FFFC 08A3 0293" $"1488 2455 1053 FC3F 8008 2480 3880 0090" $"803A 4D0C 0010 61CF DC27 388E 7500 0474" $"7CEF 7E0E 8F74 7F18 BA0E 8B88 E246 24FE" $"38FC 6F9E F7A3 E331 6B17 79F0 F1B4 8A8B" $"FEA8 0E23 DAD6 B5EF 7BD2 631F DEEE 739A" $"D7B9 CEF1 2446 CE6C 6200 E000 7069 956B" $"5889 4A25 A500 0040 0240 0494 1401 5401" $"4000 2140 2514 204F FFFC 076D 02BE E748" $"73B6 E03D FC20 7FF9 2000 0080 00F0 0010" $"0000 0010 2000 0000 0000 0100 0000 0000" $"0000 0000 0000 0001 0000 0000 0000 2000" $"0000 0000 4020 0000 4020 0000 0000 4070" $"0270 0000 0080 0000 0000 0000 0000 0080" $"0400 0640 0000 0000 0000 0000 0001 F889" $"4A25 A500 0040 0240 0494 1401 5401 4000" $"2140 2514 204F FFFC 0020 0000 0400 0000" $"0021 FFE0 0009 2000 0000 0000 0000 0000" $"0020 0000 0000 0000 0200 0000 0000 0000" $"0000 0000 0000 0000 0000 0000 0000 0000" $"0003 80C0 0000 4020 0000 0003 8000 0400" $"0000 0100 0000 0000 0000 0000 0700 0000" $"0180 0000 0000 0000 0000 056B 5889 4A27" $"E700 0040 0240 0494 1C01 DC01 C000 2140" $"2514 204F FFFC 0000 0000 0400 0000 0040" $"0000 0008 C000 0000 0000", { /* array: 257 elements */ /* [1] */ 0, /* [2] */ 0, /* [3] */ 0, /* [4] */ 0, /* [5] */ 0, /* [6] */ 0, /* [7] */ 0, /* [8] */ 0, /* [9] */ 0, /* [10] */ 0, /* [11] */ 0, /* [12] */ 0, /* [13] */ 0, /* [14] */ 0, /* [15] */ 0, /* [16] */ 0, /* [17] */ 0, /* [18] */ 0, /* [19] */ 0, /* [20] */ 0, /* [21] */ 0, /* [22] */ 0, /* [23] */ 0, /* [24] */ 0, /* [25] */ 0, /* [26] */ 0, /* [27] */ 0, /* [28] */ 0, /* [29] */ 0, /* [30] */ 0, /* [31] */ 0, /* [32] */ 0, /* [33] */ 0, /* [34] */ 0, /* [35] */ 1, /* [36] */ 4, /* [37] */ 9, /* [38] */ 14, /* [39] */ 19, /* [40] */ 24, /* [41] */ 26, /* [42] */ 29, /* [43] */ 32, /* [44] */ 37, /* [45] */ 42, /* [46] */ 44, /* [47] */ 49, /* [48] */ 50, /* [49] */ 54, /* [50] */ 59, /* [51] */ 61, /* [52] */ 66, /* [53] */ 71, /* [54] */ 76, /* [55] */ 81, /* [56] */ 86, /* [57] */ 91, /* [58] */ 96, /* [59] */ 101, /* [60] */ 102, /* [61] */ 104, /* [62] */ 107, /* [63] */ 112, /* [64] */ 115, /* [65] */ 120, /* [66] */ 125, /* [67] */ 130, /* [68] */ 135, /* [69] */ 140, /* [70] */ 145, /* [71] */ 150, /* [72] */ 155, /* [73] */ 160, /* [74] */ 165, /* [75] */ 168, /* [76] */ 173, /* [77] */ 178, /* [78] */ 183, /* [79] */ 188, /* [80] */ 193, /* [81] */ 198, /* [82] */ 203, /* [83] */ 208, /* [84] */ 213, /* [85] */ 218, /* [86] */ 223, /* [87] */ 228, /* [88] */ 233, /* [89] */ 238, /* [90] */ 243, /* [91] */ 248, /* [92] */ 253, /* [93] */ 255, /* [94] */ 259, /* [95] */ 261, /* [96] */ 264, /* [97] */ 270, /* [98] */ 272, /* [99] */ 277, /* [100] */ 282, /* [101] */ 287, /* [102] */ 292, /* [103] */ 297, /* [104] */ 301, /* [105] */ 306, /* [106] */ 311, /* [107] */ 312, /* [108] */ 315, /* [109] */ 320, /* [110] */ 322, /* [111] */ 327, /* [112] */ 332, /* [113] */ 337, /* [114] */ 342, /* [115] */ 347, /* [116] */ 352, /* [117] */ 357, /* [118] */ 361, /* [119] */ 366, /* [120] */ 371, /* [121] */ 376, /* [122] */ 381, /* [123] */ 386, /* [124] */ 391, /* [125] */ 394, /* [126] */ 395, /* [127] */ 398, /* [128] */ 403, /* [129] */ 403, /* [130] */ 408, /* [131] */ 413, /* [132] */ 418, /* [133] */ 423, /* [134] */ 428, /* [135] */ 433, /* [136] */ 438, /* [137] */ 443, /* [138] */ 448, /* [139] */ 453, /* [140] */ 458, /* [141] */ 461, /* [142] */ 464, /* [143] */ 466, /* [144] */ 471, /* [145] */ 476, /* [146] */ 481, /* [147] */ 486, /* [148] */ 491, /* [149] */ 496, /* [150] */ 501, /* [151] */ 506, /* [152] */ 511, /* [153] */ 516, /* [154] */ 521, /* [155] */ 526, /* [156] */ 531, /* [157] */ 536, /* [158] */ 541, /* [159] */ 546, /* [160] */ 551, /* [161] */ 556, /* [162] */ 561, /* [163] */ 563, /* [164] */ 568, /* [165] */ 573, /* [166] */ 578, /* [167] */ 583, /* [168] */ 587, /* [169] */ 591, /* [170] */ 596, /* [171] */ 601, /* [172] */ 606, /* [173] */ 612, /* [174] */ 618, /* [175] */ 619, /* [176] */ 624, /* [177] */ 629, /* [178] */ 634, /* [179] */ 639, /* [180] */ 644, /* [181] */ 645, /* [182] */ 649, /* [183] */ 653, /* [184] */ 658, /* [185] */ 663, /* [186] */ 667, /* [187] */ 672, /* [188] */ 675, /* [189] */ 680, /* [190] */ 685, /* [191] */ 690, /* [192] */ 694, /* [193] */ 698, /* [194] */ 701, /* [195] */ 707, /* [196] */ 713, /* [197] */ 716, /* [198] */ 722, /* [199] */ 728, /* [200] */ 731, /* [201] */ 735, /* [202] */ 739, /* [203] */ 743, /* [204] */ 749, /* [205] */ 755, /* [206] */ 759, /* [207] */ 765, /* [208] */ 771, /* [209] */ 777, /* [210] */ 783, /* [211] */ 789, /* [212] */ 795, /* [213] */ 799, /* [214] */ 802, /* [215] */ 805, /* [216] */ 809, /* [217] */ 815, /* [218] */ 821, /* [219] */ 825, /* [220] */ 828, /* [221] */ 834, /* [222] */ 840, /* [223] */ 843, /* [224] */ 846, /* [225] */ 852, /* [226] */ 858, /* [227] */ 863, /* [228] */ 869, /* [229] */ 874, /* [230] */ 879, /* [231] */ 885, /* [232] */ 890, /* [233] */ 896, /* [234] */ 901, /* [235] */ 906, /* [236] */ 911, /* [237] */ 916, /* [238] */ 921, /* [239] */ 927, /* [240] */ 933, /* [241] */ 939, /* [242] */ 945, /* [243] */ 950, /* [244] */ 953, /* [245] */ 956, /* [246] */ 959, /* [247] */ 963, /* [248] */ 968, /* [249] */ 973, /* [250] */ 977, /* [251] */ 982, /* [252] */ 983, /* [253] */ 988, /* [254] */ 992, /* [255] */ 996, /* [256] */ 999, /* [257] */ 1005 }, { /* array: 257 elements */ /* [1] */ 6, /* [2] */ 6, /* [3] */ 6, /* [4] */ 6, /* [5] */ 6, /* [6] */ 6, /* [7] */ 6, /* [8] */ 6, /* [9] */ 6, /* [10] */ 6, /* [11] */ 6, /* [12] */ 6, /* [13] */ 6, /* [14] */ 6, /* [15] */ 6, /* [16] */ 6, /* [17] */ 6, /* [18] */ 6, /* [19] */ 6, /* [20] */ 6, /* [21] */ 6, /* [22] */ 6, /* [23] */ 6, /* [24] */ 6, /* [25] */ 6, /* [26] */ 6, /* [27] */ 6, /* [28] */ 6, /* [29] */ 6, /* [30] */ 6, /* [31] */ 6, /* [32] */ 6, /* [33] */ 1542, /* [34] */ 518, /* [35] */ 262, /* [36] */ 6, /* [37] */ 6, /* [38] */ 6, /* [39] */ 6, /* [40] */ 518, /* [41] */ 262, /* [42] */ 518, /* [43] */ 6, /* [44] */ 6, /* [45] */ 262, /* [46] */ 6, /* [47] */ 518, /* [48] */ 262, /* [49] */ 6, /* [50] */ 518, /* [51] */ 6, /* [52] */ 6, /* [53] */ 6, /* [54] */ 6, /* [55] */ 6, /* [56] */ 6, /* [57] */ 6, /* [58] */ 6, /* [59] */ 518, /* [60] */ 262, /* [61] */ 262, /* [62] */ 6, /* [63] */ 262, /* [64] */ 6, /* [65] */ 6, /* [66] */ 6, /* [67] */ 6, /* [68] */ 6, /* [69] */ 6, /* [70] */ 6, /* [71] */ 6, /* [72] */ 6, /* [73] */ 6, /* [74] */ 262, /* [75] */ 6, /* [76] */ 6, /* [77] */ 6, /* [78] */ 6, /* [79] */ 6, /* [80] */ 6, /* [81] */ 6, /* [82] */ 6, /* [83] */ 6, /* [84] */ 6, /* [85] */ 6, /* [86] */ 6, /* [87] */ 6, /* [88] */ 6, /* [89] */ 6, /* [90] */ 6, /* [91] */ 6, /* [92] */ 518, /* [93] */ 262, /* [94] */ 518, /* [95] */ 262, /* [96] */ 6, /* [97] */ 262, /* [98] */ 6, /* [99] */ 6, /* [100] */ 6, /* [101] */ 6, /* [102] */ 6, /* [103] */ 262, /* [104] */ 6, /* [105] */ 6, /* [106] */ 518, /* [107] */ 6, /* [108] */ 6, /* [109] */ 262, /* [110] */ 6, /* [111] */ 6, /* [112] */ 6, /* [113] */ 6, /* [114] */ 6, /* [115] */ 6, /* [116] */ 6, /* [117] */ 262, /* [118] */ 6, /* [119] */ 6, /* [120] */ 6, /* [121] */ 6, /* [122] */ 6, /* [123] */ 6, /* [124] */ 518, /* [125] */ 518, /* [126] */ 262, /* [127] */ 6, /* [128] */ 0, /* [129] */ 6, /* [130] */ 6, /* [131] */ 6, /* [132] */ 6, /* [133] */ 6, /* [134] */ 6, /* [135] */ 6, /* [136] */ 6, /* [137] */ 6, /* [138] */ 6, /* [139] */ 6, /* [140] */ 262, /* [141] */ 262, /* [142] */ 262, /* [143] */ 6, /* [144] */ 6, /* [145] */ 6, /* [146] */ 6, /* [147] */ 6, /* [148] */ 6, /* [149] */ 6, /* [150] */ 6, /* [151] */ 6, /* [152] */ 6, /* [153] */ 6, /* [154] */ 6, /* [155] */ 6, /* [156] */ 6, /* [157] */ 6, /* [158] */ 6, /* [159] */ 6, /* [160] */ 6, /* [161] */ 6, /* [162] */ 518, /* [163] */ 6, /* [164] */ 6, /* [165] */ 6, /* [166] */ 6, /* [167] */ 262, /* [168] */ 262, /* [169] */ 6, /* [170] */ 6, /* [171] */ 6, /* [172] */ 6, /* [173] */ 6, /* [174] */ 774, /* [175] */ 6, /* [176] */ 6, /* [177] */ 6, /* [178] */ 6, /* [179] */ 6, /* [180] */ 774, /* [181] */ 6, /* [182] */ 6, /* [183] */ 6, /* [184] */ 6, /* [185] */ 6, /* [186] */ 6, /* [187] */ 518, /* [188] */ 6, /* [189] */ 6, /* [190] */ 6, /* [191] */ 6, /* [192] */ 6, /* [193] */ 774, /* [194] */ 6, /* [195] */ 6, /* [196] */ 774, /* [197] */ 6, /* [198] */ 6, /* [199] */ 774, /* [200] */ 518, /* [201] */ 518, /* [202] */ 518, /* [203] */ 6, /* [204] */ 6, /* [205] */ 518, /* [206] */ 6, /* [207] */ 6, /* [208] */ 6, /* [209] */ 6, /* [210] */ 6, /* [211] */ 6, /* [212] */ 518, /* [213] */ 774, /* [214] */ 774, /* [215] */ 518, /* [216] */ 6, /* [217] */ 6, /* [218] */ 6, /* [219] */ 774, /* [220] */ 6, /* [221] */ 6, /* [222] */ 6, /* [223] */ 774, /* [224] */ 6, /* [225] */ 6, /* [226] */ 6, /* [227] */ 6, /* [228] */ 6, /* [229] */ 6, /* [230] */ 6, /* [231] */ 6, /* [232] */ 6, /* [233] */ 6, /* [234] */ 6, /* [235] */ 6, /* [236] */ 6, /* [237] */ 6, /* [238] */ 6, /* [239] */ 6, /* [240] */ 6, /* [241] */ 6, /* [242] */ 6, /* [243] */ 262, /* [244] */ 262, /* [245] */ 774, /* [246] */ 6, /* [247] */ 6, /* [248] */ 6, /* [249] */ 262, /* [250] */ 6, /* [251] */ 518, /* [252] */ 6, /* [253] */ 6, /* [254] */ 6, /* [255] */ 262, /* [256] */ 6, /* [257] */ -1 }, { /* array: 0 elements */ }, { /* array: 0 elements */ } }; resource 'FONT' (19340) { doExpandFont, proportionalFont, blackFont, notSynthetic, nofctbRsrc, oneBit, noCharWidthTable, noImageHeightTable, 0, 255, 7, 0, -3, 7, 15, 12, 3, 0, 66, $"0000 0000 0000 0000 0000 0000 0000 0000" $"0000 0000 0000 0000 0000 0000 0000 0000" $"0000 0000 0000 0000 0000 0000 0000 0000" $"0000 0000 0000 0000 0000 0000 3800 0000" $"0000 0000 0000 0000 0006 8000 0000 0000" $"55AB 5622 5001 F80E 5108 1002 0008 8A70" $"0700 7001 C105 0000 A400 0A08 10FE 03FF" $"F800 0000 0000 0000 0000 0000 0000 2000" $"0000 0000 0000 0000 0000 0000 0000 0000" $"0000 0000 0000 0000 0000 0000 0000 0000" $"0000 0000 0000 0000 0000 0000 0000 0000" $"0000 0000 0000 0000 0000 0000 0000 0005" $"4440 0000 0000 0A50 0000 0C00 000B 0000" $"0020 8000 0001 FE22 5001 680A 5108 1002" $"0008 8A50 0500 5001 4105 0000 A400 0A08" $"10FE 03FF F800 0000 0000 0000 0000 03C0" $"0000 2000 000A 6000 0010 000C 0000 0000" $"0000 0000 0000 0000 0000 0000 0000 0000" $"0000 0000 0000 0000 7070 0000 0000 0000" $"0000 0000 0000 0000 0000 1C00 0000 0006" $"0000 0000 4480 0000 0000 0000 0000 1000" $"0000 0000 0020 8000 55AB 5622 5001 680A" $"5108 1002 0008 8A50 0500 5001 4105 0000" $"A400 0A08 10FE 03FF F800 0000 0000 3800" $"1800 F420 0000 2000 000D 9000 D539 2C52" $"2000 02E5 CE17 CDF7 3800 01C0 3BCE F7FE" $"E8F0 C611 8BBC EF3B F18C 631F C812 0081" $"0004 0608 4C00 0000 0000 0000 0000 2A6B" $"8022 0089 0100 80A7 3BE0 7B00 8220 0E88" $"0D1F 1048 84D8 BDC4 0022 8A00 0001 FE22" $"5001 680A 5108 1002 0008 8A50 0500 5001" $"4105 0000 A400 0A08 10FE 03FF F80E F83E" $"0000 11CE 2001 FC20 0020 2003 0039 207D" $"DFD6 B252 A800 031E 3134 1018 C408 2220" $"4631 8C21 18A0 CA1B 8C63 18C4 918C 6310" $"C815 0041 0004 0808 4C30 0000 0000 8000" $"0000 2AB4 5445 2849 0294 4B58 C600 A494" $"4511 5188 10A8 9091 0968 C624 0024 9200" $"55AB 5622 5001 680A 5108 1002 0008 8A50" $"0500 5001 4105 0000 A400 0A08 10FE 03FF" $"F811 4822 001B 9231 2005 FC20 044C 2004" $"8029 4F44 D552 D261 7100 0514 2154 2018" $"C410 102F 4631 8C21 08A0 D215 CC63 18C0" $"918C 6310 C418 8001 0004 0808 0410 0000" $"0000 8000 0000 2A04 4000 0006 0000 0008" $"C600 A000 0000 1189 11F8 9000 000C C620" $"0008 2000 0001 FE22 5001 680A 5108 1002" $"0008 8A50 0500 5001 4105 0000 A400 0A08" $"10FE 03FF FB71 4010 0024 3A31 1005 FC3F" $"2292 2404 8029 FF44 8531 D421 7100 0534" $"2697 BC27 46A7 C850 C7D0 8C21 08A0 E211" $"AC63 18C0 918C 5511 4410 001F E73D DCFF" $"4C9F 79DE 7D9D D18D 631F AA04 22E7 BDEF" $"739C E498 C60E A39C E8C6 318B 9048 B9F3" $"A36A C624 0016 4A5A 55AB 563E 507F 6FFA" $"5F08 1002 0008 FA5F FDFF DFFF 7FE5 3F80" $"A7F8 0A7F 10FE 03FF FC92 47C8 FC44 4631" $"781D FC20 2152 204B 3820 0F44 8F98 8821" $"AFC0 0954 41F8 6248 C6C0 0496 FE30 8FBD" $"3FA0 C211 9C7D 1F38 918C 48A2 4210 0023" $"18C6 2918 CD1A C631 8E62 918D 5511 4904" $"2318 C631 8C63 1498 C7D5 FC63 18C6 318D" $"79FF 1234 6399 BDC4 FFE9 9AA5 0001 FFE3" $"DF8C 6C63 F1FF FFFF FFFF 8BC6 3060 C60C" $"101F C07F FC47 FF88 FFFF FFFF FC92 4285" $"2444 47F1 8EEB FC3F FA30 3FB0 7C20 0F44" $"8515 5421 210F 8994 8110 6248 BC27 C896" $"C630 8C21 18A0 E211 8C61 1884 918C 5444" $"4210 0023 1847 E918 CE1A C631 8C5C 918D" $"4912 2A04 23F8 C631 87FF F49F FE17 A463" $"18C6 318D 1048 1234 6318 8008 8041 2B42" $"D5AB 563E 52FF 6F7E 0F10 0022 0008 FA7E" $"FFFB DFFF 7FE0 3F94 07FD 0A7F 08FF FFFC" $"0371 4289 2444 4631 8D6B FC20 2411 2048" $"7E20 0F44 0015 B2A1 0100 1115 0110 6248" $"8410 1017 C630 8C21 18A8 D211 8C61 1884" $"918D 6248 4110 0023 1846 0918 CD1A C631" $"8C02 918D 4914 2A04 2308 C631 8421 0498" $"C614 A463 18C6 318D 1249 1234 6318 FFF0" $"8042 7F42 8001 FE22 5289 6940 0010 0022" $"0008 8A02 800A 5001 4000 0414 0045 0A08" $"08FF FFFC 0011 4291 2444 462A 8EEB FC3F" $"20F1 24B0 7DA0 0F44 8056 B112 0010 5116" $"1114 6248 8A88 2090 4631 8C21 18A8 CA11" $"8C61 18C4 9156 E248 4110 0027 18C6 2918" $"CC9A C631 8C22 9355 5518 2A04 6719 CE73" $"8C61 1498 C615 A463 19CE 318D 524B 9274" $"6718 8011 0004 0AA5 55AB 5622 5289 6940" $"0010 0022 0008 8A02 800A 5001 4000 0414" $"0045 0A08 08FF FFFC 0011 42A3 24C4 3A2A" $"882B FC20 0710 C000 3860 0044 803A 4E92" $"0010 60E7 EE13 9C47 3280 008F 47CE F7E0" $"E8F7 47F1 8BA0 E8B8 8E24 624F C090 7F1B" $"E73D C8F8 CC5A C5DE 7C1C 6D22 A2FF AA03" $"9AE6 B5AD 739E E498 C7EE BB9C E6B5 EE73" $"BC49 11B3 9B18 800E 000F 0A5A 0001 FE22" $"5289 6940 0010 0022 0008 8A02 800A 5001" $"4000 0414 0045 0A08 08FF FFFC 0016 42BE" $"C742 11DB 701D FFE0 F810 0000 0020 007D" $"0010 000C 0010 2000 0000 0000 0080 0000" $"0000 0000 0000 0000 0000 4000 0000 0000" $"70F0 0000 0000 0010 0800 0010 0800 0000" $"0010 1C01 0000 0000 2000 0000 0000 0000" $"0000 2001 0001 1000 0000 0000 0000 0000" $"55AB 5622 5289 6940 0010 0022 0008 8A02" $"800A 5001 4000 0414 0045 0A08 08FF FFFC" $"0010 0000 0400 1000 0011 F800 0010 0000" $"0000 0000 0000 0000 0020 0000 0000 0000" $"0100 0000 0000 0000 0000 0000 0000 2000" $"0000 0000 0000 0000 0000 0110 0800 0010" $"0800 0000 0110 0001 0000 0000 2000 0000" $"0000 0000 0000 2000 0001 E000 0000 0000" $"0000 0000 0001 FE22 5289 6940 0010 0022" $"0008 8A02 800A 5001 4000 0414 0045 0A08" $"08FF FFFC 0000 0000 0400 3800 0010 0000" $"0010 0000 0000 0000 0000 0000 0000 0000" $"0000 0000 0000 0000 0000 0000 0000 0000" $"0000 0000 0000 0000 0000 0000 0000 00E0" $"3000 0000 0000 0000 00E0 0002 0000 0000" $"4000 0000 0000 0000 0001 C000 0000 0000" $"0000 0000 0000 0000 55AB 5622 5289 F9C0" $"0010 0022 0008 8A03 800E 7001 C000 0414" $"0045 0A08 08FF FFFC 0000 0000 0000 0000" $"0000 0000 0010 0000 0000 0000", { /* array: 258 elements */ /* [1] */ 0, /* [2] */ 0, /* [3] */ 0, /* [4] */ 0, /* [5] */ 0, /* [6] */ 0, /* [7] */ 0, /* [8] */ 0, /* [9] */ 0, /* [10] */ 0, /* [11] */ 0, /* [12] */ 0, /* [13] */ 0, /* [14] */ 0, /* [15] */ 0, /* [16] */ 0, /* [17] */ 0, /* [18] */ 0, /* [19] */ 0, /* [20] */ 0, /* [21] */ 0, /* [22] */ 0, /* [23] */ 0, /* [24] */ 0, /* [25] */ 0, /* [26] */ 0, /* [27] */ 0, /* [28] */ 0, /* [29] */ 0, /* [30] */ 0, /* [31] */ 0, /* [32] */ 0, /* [33] */ 0, /* [34] */ 0, /* [35] */ 1, /* [36] */ 4, /* [37] */ 9, /* [38] */ 14, /* [39] */ 19, /* [40] */ 25, /* [41] */ 26, /* [42] */ 29, /* [43] */ 32, /* [44] */ 37, /* [45] */ 42, /* [46] */ 44, /* [47] */ 49, /* [48] */ 50, /* [49] */ 55, /* [50] */ 60, /* [51] */ 62, /* [52] */ 67, /* [53] */ 72, /* [54] */ 77, /* [55] */ 82, /* [56] */ 87, /* [57] */ 92, /* [58] */ 97, /* [59] */ 102, /* [60] */ 103, /* [61] */ 105, /* [62] */ 109, /* [63] */ 114, /* [64] */ 118, /* [65] */ 123, /* [66] */ 129, /* [67] */ 134, /* [68] */ 139, /* [69] */ 144, /* [70] */ 149, /* [71] */ 154, /* [72] */ 159, /* [73] */ 164, /* [74] */ 169, /* [75] */ 172, /* [76] */ 177, /* [77] */ 182, /* [78] */ 187, /* [79] */ 192, /* [80] */ 197, /* [81] */ 202, /* [82] */ 207, /* [83] */ 212, /* [84] */ 217, /* [85] */ 222, /* [86] */ 227, /* [87] */ 232, /* [88] */ 237, /* [89] */ 242, /* [90] */ 247, /* [91] */ 252, /* [92] */ 257, /* [93] */ 260, /* [94] */ 265, /* [95] */ 268, /* [96] */ 273, /* [97] */ 280, /* [98] */ 282, /* [99] */ 287, /* [100] */ 292, /* [101] */ 297, /* [102] */ 302, /* [103] */ 307, /* [104] */ 311, /* [105] */ 316, /* [106] */ 321, /* [107] */ 322, /* [108] */ 325, /* [109] */ 330, /* [110] */ 332, /* [111] */ 337, /* [112] */ 342, /* [113] */ 347, /* [114] */ 352, /* [115] */ 357, /* [116] */ 362, /* [117] */ 367, /* [118] */ 371, /* [119] */ 376, /* [120] */ 381, /* [121] */ 386, /* [122] */ 391, /* [123] */ 396, /* [124] */ 401, /* [125] */ 404, /* [126] */ 405, /* [127] */ 408, /* [128] */ 413, /* [129] */ 413, /* [130] */ 418, /* [131] */ 423, /* [132] */ 428, /* [133] */ 433, /* [134] */ 438, /* [135] */ 443, /* [136] */ 448, /* [137] */ 453, /* [138] */ 458, /* [139] */ 463, /* [140] */ 468, /* [141] */ 471, /* [142] */ 474, /* [143] */ 476, /* [144] */ 481, /* [145] */ 486, /* [146] */ 491, /* [147] */ 496, /* [148] */ 501, /* [149] */ 506, /* [150] */ 511, /* [151] */ 516, /* [152] */ 521, /* [153] */ 526, /* [154] */ 531, /* [155] */ 536, /* [156] */ 541, /* [157] */ 546, /* [158] */ 551, /* [159] */ 556, /* [160] */ 561, /* [161] */ 566, /* [162] */ 571, /* [163] */ 573, /* [164] */ 578, /* [165] */ 583, /* [166] */ 588, /* [167] */ 593, /* [168] */ 598, /* [169] */ 603, /* [170] */ 608, /* [171] */ 613, /* [172] */ 618, /* [173] */ 624, /* [174] */ 630, /* [175] */ 631, /* [176] */ 636, /* [177] */ 641, /* [178] */ 648, /* [179] */ 655, /* [180] */ 662, /* [181] */ 663, /* [182] */ 667, /* [183] */ 671, /* [184] */ 676, /* [185] */ 681, /* [186] */ 685, /* [187] */ 690, /* [188] */ 693, /* [189] */ 698, /* [190] */ 703, /* [191] */ 708, /* [192] */ 712, /* [193] */ 716, /* [194] */ 720, /* [195] */ 727, /* [196] */ 734, /* [197] */ 738, /* [198] */ 745, /* [199] */ 752, /* [200] */ 756, /* [201] */ 761, /* [202] */ 766, /* [203] */ 771, /* [204] */ 778, /* [205] */ 785, /* [206] */ 790, /* [207] */ 797, /* [208] */ 804, /* [209] */ 811, /* [210] */ 818, /* [211] */ 825, /* [212] */ 832, /* [213] */ 837, /* [214] */ 841, /* [215] */ 845, /* [216] */ 850, /* [217] */ 857, /* [218] */ 864, /* [219] */ 868, /* [220] */ 872, /* [221] */ 879, /* [222] */ 886, /* [223] */ 890, /* [224] */ 894, /* [225] */ 901, /* [226] */ 907, /* [227] */ 912, /* [228] */ 917, /* [229] */ 922, /* [230] */ 927, /* [231] */ 933, /* [232] */ 938, /* [233] */ 945, /* [234] */ 950, /* [235] */ 955, /* [236] */ 960, /* [237] */ 965, /* [238] */ 970, /* [239] */ 975, /* [240] */ 981, /* [241] */ 987, /* [242] */ 992, /* [243] */ 997, /* [244] */ 1000, /* [245] */ 1003, /* [246] */ 1007, /* [247] */ 1011, /* [248] */ 1016, /* [249] */ 1021, /* [250] */ 1025, /* [251] */ 1030, /* [252] */ 1031, /* [253] */ 1036, /* [254] */ 1040, /* [255] */ 1044, /* [256] */ 1048, /* [257] */ 1048, /* [258] */ 1055 }, { /* array: 258 elements */ /* [1] */ 7, /* [2] */ 7, /* [3] */ 7, /* [4] */ 7, /* [5] */ 7, /* [6] */ 7, /* [7] */ 7, /* [8] */ 7, /* [9] */ 7, /* [10] */ 7, /* [11] */ 7, /* [12] */ 7, /* [13] */ 7, /* [14] */ 7, /* [15] */ 7, /* [16] */ 7, /* [17] */ 7, /* [18] */ 7, /* [19] */ 7, /* [20] */ 7, /* [21] */ 7, /* [22] */ 7, /* [23] */ 7, /* [24] */ 7, /* [25] */ 7, /* [26] */ 7, /* [27] */ 7, /* [28] */ 7, /* [29] */ 7, /* [30] */ 7, /* [31] */ 7, /* [32] */ 7, /* [33] */ 7, /* [34] */ 775, /* [35] */ 519, /* [36] */ 263, /* [37] */ 263, /* [38] */ 263, /* [39] */ 7, /* [40] */ 775, /* [41] */ 519, /* [42] */ 519, /* [43] */ 263, /* [44] */ 263, /* [45] */ 519, /* [46] */ 263, /* [47] */ 775, /* [48] */ 263, /* [49] */ 263, /* [50] */ 519, /* [51] */ 263, /* [52] */ 263, /* [53] */ 263, /* [54] */ 263, /* [55] */ 263, /* [56] */ 263, /* [57] */ 263, /* [58] */ 263, /* [59] */ 775, /* [60] */ 519, /* [61] */ 263, /* [62] */ 263, /* [63] */ 519, /* [64] */ 263, /* [65] */ 7, /* [66] */ 263, /* [67] */ 263, /* [68] */ 263, /* [69] */ 263, /* [70] */ 263, /* [71] */ 263, /* [72] */ 263, /* [73] */ 263, /* [74] */ 519, /* [75] */ 263, /* [76] */ 263, /* [77] */ 263, /* [78] */ 263, /* [79] */ 263, /* [80] */ 263, /* [81] */ 263, /* [82] */ 263, /* [83] */ 263, /* [84] */ 263, /* [85] */ 263, /* [86] */ 263, /* [87] */ 263, /* [88] */ 263, /* [89] */ 263, /* [90] */ 263, /* [91] */ 263, /* [92] */ 519, /* [93] */ 263, /* [94] */ 519, /* [95] */ 263, /* [96] */ 7, /* [97] */ 775, /* [98] */ 263, /* [99] */ 263, /* [100] */ 263, /* [101] */ 263, /* [102] */ 263, /* [103] */ 519, /* [104] */ 263, /* [105] */ 263, /* [106] */ 775, /* [107] */ 263, /* [108] */ 263, /* [109] */ 519, /* [110] */ 263, /* [111] */ 263, /* [112] */ 263, /* [113] */ 263, /* [114] */ 263, /* [115] */ 263, /* [116] */ 263, /* [117] */ 263, /* [118] */ 263, /* [119] */ 263, /* [120] */ 263, /* [121] */ 263, /* [122] */ 263, /* [123] */ 263, /* [124] */ 519, /* [125] */ 775, /* [126] */ 519, /* [127] */ 263, /* [128] */ 0, /* [129] */ 263, /* [130] */ 263, /* [131] */ 263, /* [132] */ 263, /* [133] */ 263, /* [134] */ 263, /* [135] */ 263, /* [136] */ 263, /* [137] */ 263, /* [138] */ 263, /* [139] */ 263, /* [140] */ 519, /* [141] */ 519, /* [142] */ 519, /* [143] */ 263, /* [144] */ 263, /* [145] */ 263, /* [146] */ 263, /* [147] */ 263, /* [148] */ 263, /* [149] */ 263, /* [150] */ 263, /* [151] */ 263, /* [152] */ 263, /* [153] */ 263, /* [154] */ 263, /* [155] */ 263, /* [156] */ 263, /* [157] */ 263, /* [158] */ 263, /* [159] */ 263, /* [160] */ 263, /* [161] */ 263, /* [162] */ 775, /* [163] */ 263, /* [164] */ 263, /* [165] */ 263, /* [166] */ 263, /* [167] */ 263, /* [168] */ 263, /* [169] */ 263, /* [170] */ 263, /* [171] */ 263, /* [172] */ 263, /* [173] */ 263, /* [174] */ 775, /* [175] */ 263, /* [176] */ 263, /* [177] */ 7, /* [178] */ 7, /* [179] */ 7, /* [180] */ 775, /* [181] */ 7, /* [182] */ 7, /* [183] */ 7, /* [184] */ 7, /* [185] */ 7, /* [186] */ 7, /* [187] */ 519, /* [188] */ 7, /* [189] */ 7, /* [190] */ 7, /* [191] */ 7, /* [192] */ 7, /* [193] */ 775, /* [194] */ 7, /* [195] */ 7, /* [196] */ 775, /* [197] */ 7, /* [198] */ 7, /* [199] */ 775, /* [200] */ 519, /* [201] */ 519, /* [202] */ 519, /* [203] */ 7, /* [204] */ 7, /* [205] */ 519, /* [206] */ 7, /* [207] */ 7, /* [208] */ 7, /* [209] */ 7, /* [210] */ 7, /* [211] */ 7, /* [212] */ 519, /* [213] */ 775, /* [214] */ 775, /* [215] */ 519, /* [216] */ 7, /* [217] */ 7, /* [218] */ 7, /* [219] */ 775, /* [220] */ 7, /* [221] */ 7, /* [222] */ 7, /* [223] */ 775, /* [224] */ 7, /* [225] */ 263, /* [226] */ 263, /* [227] */ 263, /* [228] */ 263, /* [229] */ 263, /* [230] */ 263, /* [231] */ 263, /* [232] */ 7, /* [233] */ 263, /* [234] */ 263, /* [235] */ 263, /* [236] */ 263, /* [237] */ 263, /* [238] */ 263, /* [239] */ 263, /* [240] */ 263, /* [241] */ 263, /* [242] */ 263, /* [243] */ 519, /* [244] */ 519, /* [245] */ 775, /* [246] */ 7, /* [247] */ 263, /* [248] */ 263, /* [249] */ 263, /* [250] */ 263, /* [251] */ 775, /* [252] */ 263, /* [253] */ 7, /* [254] */ 7, /* [255] */ 263, /* [256] */ 1, /* [257] */ 7, /* [258] */ -1 }, { /* array: 0 elements */ }, { /* array: 0 elements */ } }; resource 'FONT' (19468, "PSHackFont", purgeable) { doExpandFont, proportionalFont, blackFont, notSynthetic, nofctbRsrc, oneBit, noCharWidthTable, noImageHeightTable, 0, 239, 15, 0, -12, 15, 15, 12, 3, 1, 62, $"0000 0000 0000 0000 0000 0000 0000 0000" $"0000 0000 0000 0000 0000 0000 0000 0000" $"0000 0000 0000 0000 0000 0000 0000 0000" $"0000 0000 0000 0000 0000 0070 0132 0000" $"0000 0600 0000 0000 0000 0000 0000 0000" $"0000 0000 0000 0000 0001 5400 0000 0000" $"1F80 E000 0000 0000 0000 0000 000E 0038" $"0000 0000 0000 0000 0000 0005 0000 0000" $"0000 0000 0000 0000 0000 0000 0000 0000" $"0000 0000 0000 0000 0000 0000 0000 0000" $"0000 0000 0000 0000 0000 0000 0000 0000" $"0000 0000 0000 2888 024C 9240 0000 0900" $"0000 0000 0000 0000 0000 0000 0000 0000" $"0000 0000 0000 0000 0000 0000 1680 A000" $"0000 0000 0000 0E7C E00A 0028 0000 0000" $"0000 0000 F000 0005 0004 0000 3000 0004" $"0000 0000 0000 0000 0000 0000 0000 0000" $"0000 0000 0000 0000 0000 0000 0007 0C00" $"0000 0000 0000 0000 0000 0000 0000 0000" $"0700 0088 0000 0004 2100 D900 8820 1906" $"8904 0344 8201 0000 0000 0000 0000 0000" $"0001 5400 0000 0000 16FC A000 0000 000C" $"0000 0A44 A00A 0028 0000 094A 8000 0301" $"FBC0 0005 D14E 7E61 4920 0004 C4EF C17E" $"77EF 3C00 00F0 008F 9EF3 FF7A 1830 C20E" $"2F7C F7CF 7F86 0C06 31FD 0500 4080 0203" $"0413 0C00 0000 0002 0000 0000 0A99 1071" $"EFE2 F428 1295 6601 0452 A6DB 108A 5588" $"452B B00C 7803 CE00 0074 5A00 7E7A 0000" $"1100 CFFF 96C4 A780 0004 8008 8000 0A5C" $"A00A 0028 0000 124C 8004 4601 FC2F F005" $"D7F5 9291 48C0 0009 2D10 8340 8030 C200" $"0109 E088 618A 1086 1831 431E 30C3 0C30" $"8886 0C06 310C 8680 2080 0204 0401 0400" $"0000 0002 0000 0000 0AA6 1022 1863 0C20" $"0000 0000 0000 0000 0000 0000 0001 4912" $"8405 511E 1E26 E000 A085 5400 0A00 2451" $"16F4 A840 0000 0011 0020 0A50 A00A 0028" $"0000 1295 0040 0C01 FC28 1005 8294 94A0" $"87F2 000A 1611 0541 0050 C204 110A 1148" $"6086 1082 1832 42AD 30C3 0C30 0886 0C45" $"5114 8400 0EF3 9EEE 7DB7 16CD 6779 F777" $"4631 18C7 EA80 2852 0853 0C2E 739C E739" $"CE73 A52B 39CE 73A3 18C5 4B90 81E9 5121" $"2125 4000 A08C 0084 9F44 1211 1694 B02E" $"E3A4 8011 0020 0A50 A7FA 0028 EE00 0000" $"10A4 5FF5 FC28 1005 8FCC 6840 84C2 0012" $"1413 097D F04F 4348 0814 E94F A086 1082" $"1834 424D 30C3 0C30 0885 1249 4A14 4400" $"118C 6314 8E53 2733 98C6 388A 4631 18C4" $"2A80 2852 0853 0C31 8C63 18C6 318C 652C" $"C631 8C63 18C5 3550 7BF9 525C CCA4 4011" $"2095 5488 4444 7111 7697 B031 1444 8023" $"B250 0A50 A41B 80EF 1100 0000 0114 7FFD" $"FC28 1005 8506 10A0 852F 9F12 1420 9103" $"0890 C213 E425 2A28 6087 DE9F F838 420C" $"B0FD 0FCF 0885 12A8 8A24 4400 0F8C 2314" $"8C53 4623 18C6 3082 462A A544 5240 448A" $"0F4B 0C2F 7BDE F7C2 318C 6528 C631 8C63" $"18C4 0538 87F9 5152 D080 01F9 FCA4 03F0" $"3F44 9091 4696 302F 14C8 FC21 4C50 9BD3" $"BF78 FF83 1100 0000 7E0C 7FF9 FC28 1005" $"8005 2D14 8402 0022 1440 6103 0890 BE20" $"0245 2A28 6086 1086 1834 420C B0C1 0D00" $"8884 A2A9 4444 2400 118C 23F4 8C53 8623" $"18C6 3072 454A A244 8A80 448A 084B 0C31" $"8C63 18C3 FFFF E528 C631 8C63 18C4 0510" $"87F5 50DC D080 0022 20C5 5488 4445 1111" $"7697 E851 F550 8641 0089 28D2 094B C1EF" $"1FFF E000 020C 43F9 FC28 1005 8005 5308" $"8402 0022 1480 7F83 0910 8210 0444 F7F8" $"6086 1086 1C32 420C 70C1 0C80 8884 A111" $"4444 2400 118C 2304 8C53 4623 18C6 300A" $"4544 4545 0A80 FFFE 0847 0C31 8C63 18C2" $"1084 2528 C631 8C63 18C4 0510 7BF3 D0D2" $"CC80 0042 2084 0084 8445 1211 1694 0851" $"0651 8541 328A 4FF3 F94A 7F29 1000 0000" $"1114 461F FC28 1005 0015 9314 4800 0041" $"2508 8143 0910 840B E802 0418 618A 1086" $"1C31 420C 70C1 2C50 8884 4112 2484 1400" $"118C 6314 8C53 2623 18C6 308A 4C84 48C6" $"0A80 8306 1847 0C31 8C63 18C6 318C 6528" $"C631 8C67 39CC 0551 05E1 5121 2100 01FC" $"2185 5400 0445 2451 169C 0491 1451 8081" $"4D05 2000 014A 0029 1100 0000 00A4 4801" $"FC28 1005 800E 8CE2 4800 20C0 C7F7 013C" $"F10F 3944 1041 C41F 9EF3 F07A 1BD0 FE0C" $"2F40 F42F 0878 4112 24FC 147F 8FF3 9EE4" $"7C53 1623 1779 F071 B484 48BF EA80 8305" $"EFC2 F3CF 7BDE F7B9 CE73 A528 B9CE 739A" $"D6B4 03BE 8401 761E 1E00 0084 3E78 03FF" $"E47A CFD1 1680 0CCE EB8E 8081 01FC 9000" $"014A 0028 EE00 0000 0043 C001 FC2F F005" $"0004 0000 3000 2000 0000 0000 0000 0040" $"0000 0000 0000 0000 0000 0000 0000 0800" $"0000 0000 0006 0C00 0000 0000 0802 0000" $"0040 2000 0000 0004 0700 0000 4000 0000" $"0000 0010 0000 0000 0000 0000 0000 0100" $"7800 0000 0000 0000 0001 5400 0040 0000" $"1680 0000 0000 0001 0000 0000 014A 0028" $"0000 0000 0000 4000 07E0 0005 0000 0000" $"0000 4000 0000 0000 0000 0080 0000 0000" $"0000 0000 0000 0000 0000 0000 0000 0000" $"0000 0000 0000 0000 8802 0000 0040 2000" $"0000 0044 0000 0000 2000 0000 0000 0020" $"0000 0000 0000 0000 0000 0000 0000 0000" $"0000 0000 0000 0000 0080 0000 1680 0000" $"0000 0001 0000 0000 01CA 0028 0000 0000" $"0004 4000 0000 0005 0000 0000 0000 0000" $"0000 0000 0000 0000 0000 0000 0000 0000" $"0000 0000 0000 0000 0000 0000 0000 0000" $"0000 0000 700C 0000 0000 0000 0000 0038" $"0000 0000 4000 0000 0000 0000 0000 0000" $"0000 0000 0000 0000 0000 0000 0000 0000" $"0001 5400 0000 0000 1F80 0000 0000 0002" $"0000 0000 000E 0038 0000 0000 0003 8000" $"0000 0005", { /* array: 242 elements */ /* [1] */ 0, /* [2] */ 0, /* [3] */ 0, /* [4] */ 0, /* [5] */ 0, /* [6] */ 0, /* [7] */ 0, /* [8] */ 0, /* [9] */ 0, /* [10] */ 0, /* [11] */ 0, /* [12] */ 0, /* [13] */ 0, /* [14] */ 0, /* [15] */ 0, /* [16] */ 0, /* [17] */ 0, /* [18] */ 0, /* [19] */ 0, /* [20] */ 0, /* [21] */ 0, /* [22] */ 0, /* [23] */ 0, /* [24] */ 0, /* [25] */ 0, /* [26] */ 0, /* [27] */ 0, /* [28] */ 0, /* [29] */ 0, /* [30] */ 0, /* [31] */ 0, /* [32] */ 0, /* [33] */ 0, /* [34] */ 0, /* [35] */ 1, /* [36] */ 4, /* [37] */ 11, /* [38] */ 16, /* [39] */ 23, /* [40] */ 31, /* [41] */ 32, /* [42] */ 35, /* [43] */ 38, /* [44] */ 44, /* [45] */ 49, /* [46] */ 51, /* [47] */ 56, /* [48] */ 57, /* [49] */ 62, /* [50] */ 68, /* [51] */ 70, /* [52] */ 76, /* [53] */ 82, /* [54] */ 89, /* [55] */ 95, /* [56] */ 101, /* [57] */ 107, /* [58] */ 113, /* [59] */ 119, /* [60] */ 120, /* [61] */ 122, /* [62] */ 126, /* [63] */ 131, /* [64] */ 135, /* [65] */ 141, /* [66] */ 149, /* [67] */ 156, /* [68] */ 162, /* [69] */ 168, /* [70] */ 174, /* [71] */ 179, /* [72] */ 184, /* [73] */ 190, /* [74] */ 196, /* [75] */ 197, /* [76] */ 203, /* [77] */ 209, /* [78] */ 214, /* [79] */ 221, /* [80] */ 227, /* [81] */ 233, /* [82] */ 239, /* [83] */ 245, /* [84] */ 251, /* [85] */ 257, /* [86] */ 264, /* [87] */ 270, /* [88] */ 277, /* [89] */ 286, /* [90] */ 291, /* [91] */ 296, /* [92] */ 301, /* [93] */ 303, /* [94] */ 308, /* [95] */ 310, /* [96] */ 313, /* [97] */ 321, /* [98] */ 323, /* [99] */ 328, /* [100] */ 333, /* [101] */ 338, /* [102] */ 343, /* [103] */ 348, /* [104] */ 352, /* [105] */ 357, /* [106] */ 362, /* [107] */ 364, /* [108] */ 367, /* [109] */ 372, /* [110] */ 374, /* [111] */ 383, /* [112] */ 388, /* [113] */ 393, /* [114] */ 398, /* [115] */ 403, /* [116] */ 408, /* [117] */ 413, /* [118] */ 417, /* [119] */ 422, /* [120] */ 427, /* [121] */ 436, /* [122] */ 441, /* [123] */ 446, /* [124] */ 451, /* [125] */ 454, /* [126] */ 455, /* [127] */ 458, /* [128] */ 464, /* [129] */ 464, /* [130] */ 471, /* [131] */ 478, /* [132] */ 484, /* [133] */ 489, /* [134] */ 495, /* [135] */ 501, /* [136] */ 507, /* [137] */ 512, /* [138] */ 517, /* [139] */ 522, /* [140] */ 527, /* [141] */ 532, /* [142] */ 537, /* [143] */ 542, /* [144] */ 547, /* [145] */ 552, /* [146] */ 557, /* [147] */ 562, /* [148] */ 564, /* [149] */ 566, /* [150] */ 569, /* [151] */ 572, /* [152] */ 577, /* [153] */ 582, /* [154] */ 587, /* [155] */ 592, /* [156] */ 597, /* [157] */ 602, /* [158] */ 607, /* [159] */ 612, /* [160] */ 617, /* [161] */ 622, /* [162] */ 625, /* [163] */ 629, /* [164] */ 634, /* [165] */ 640, /* [166] */ 646, /* [167] */ 652, /* [168] */ 658, /* [169] */ 665, /* [170] */ 673, /* [171] */ 681, /* [172] */ 690, /* [173] */ 692, /* [174] */ 695, /* [175] */ 701, /* [176] */ 711, /* [177] */ 719, /* [178] */ 726, /* [179] */ 731, /* [180] */ 735, /* [181] */ 739, /* [182] */ 744, /* [183] */ 751, /* [184] */ 756, /* [185] */ 762, /* [186] */ 769, /* [187] */ 774, /* [188] */ 777, /* [189] */ 782, /* [190] */ 787, /* [191] */ 795, /* [192] */ 804, /* [193] */ 811, /* [194] */ 816, /* [195] */ 817, /* [196] */ 822, /* [197] */ 830, /* [198] */ 833, /* [199] */ 839, /* [200] */ 846, /* [201] */ 852, /* [202] */ 857, /* [203] */ 862, /* [204] */ 869, /* [205] */ 876, /* [206] */ 881, /* [207] */ 888, /* [208] */ 895, /* [209] */ 904, /* [210] */ 908, /* [211] */ 915, /* [212] */ 920, /* [213] */ 925, /* [214] */ 927, /* [215] */ 929, /* [216] */ 934, /* [217] */ 941, /* [218] */ 946, /* [219] */ 959, /* [220] */ 959, /* [221] */ 959, /* [222] */ 959, /* [223] */ 959, /* [224] */ 959, /* [225] */ 959, /* [226] */ 959, /* [227] */ 959, /* [228] */ 959, /* [229] */ 959, /* [230] */ 959, /* [231] */ 959, /* [232] */ 959, /* [233] */ 959, /* [234] */ 959, /* [235] */ 959, /* [236] */ 959, /* [237] */ 959, /* [238] */ 959, /* [239] */ 959, /* [240] */ 965, /* [241] */ 971, /* [242] */ 981 }, { /* array: 242 elements */ /* [1] */ 0, /* [2] */ -1, /* [3] */ 0, /* [4] */ 0, /* [5] */ 0, /* [6] */ 0, /* [7] */ -1, /* [8] */ -1, /* [9] */ -1, /* [10] */ 2056, /* [11] */ -1, /* [12] */ -1, /* [13] */ -1, /* [14] */ 0, /* [15] */ -1, /* [16] */ -1, /* [17] */ -1, /* [18] */ -1, /* [19] */ -1, /* [20] */ -1, /* [21] */ -1, /* [22] */ -1, /* [23] */ -1, /* [24] */ -1, /* [25] */ -1, /* [26] */ -1, /* [27] */ -1, /* [28] */ -1, /* [29] */ -1, /* [30] */ -1, /* [31] */ -1, /* [32] */ -1, /* [33] */ 1028, /* [34] */ 259, /* [35] */ 261, /* [36] */ 265, /* [37] */ 263, /* [38] */ 265, /* [39] */ 9, /* [40] */ 259, /* [41] */ 261, /* [42] */ 261, /* [43] */ 264, /* [44] */ 263, /* [45] */ 260, /* [46] */ 263, /* [47] */ 259, /* [48] */ 263, /* [49] */ 264, /* [50] */ 776, /* [51] */ 264, /* [52] */ 264, /* [53] */ 264, /* [54] */ 264, /* [55] */ 264, /* [56] */ 264, /* [57] */ 264, /* [58] */ 264, /* [59] */ 259, /* [60] */ 260, /* [61] */ 262, /* [62] */ 263, /* [63] */ 262, /* [64] */ 264, /* [65] */ 266, /* [66] */ 265, /* [67] */ 264, /* [68] */ 264, /* [69] */ 264, /* [70] */ 263, /* [71] */ 263, /* [72] */ 264, /* [73] */ 264, /* [74] */ 517, /* [75] */ 7, /* [76] */ 264, /* [77] */ 263, /* [78] */ 265, /* [79] */ 264, /* [80] */ 264, /* [81] */ 264, /* [82] */ 264, /* [83] */ 264, /* [84] */ 264, /* [85] */ 8, /* [86] */ 264, /* [87] */ 265, /* [88] */ 267, /* [89] */ 263, /* [90] */ 263, /* [91] */ 263, /* [92] */ 260, /* [93] */ 263, /* [94] */ 260, /* [95] */ 260, /* [96] */ 8, /* [97] */ 260, /* [98] */ 263, /* [99] */ 263, /* [100] */ 263, /* [101] */ 263, /* [102] */ 263, /* [103] */ 262, /* [104] */ 263, /* [105] */ 263, /* [106] */ 261, /* [107] */ 262, /* [108] */ 263, /* [109] */ 261, /* [110] */ 267, /* [111] */ 263, /* [112] */ 263, /* [113] */ 263, /* [114] */ 263, /* [115] */ 262, /* [116] */ 263, /* [117] */ 262, /* [118] */ 263, /* [119] */ 263, /* [120] */ 267, /* [121] */ 263, /* [122] */ 263, /* [123] */ 263, /* [124] */ 261, /* [125] */ 259, /* [126] */ 261, /* [127] */ 264, /* [128] */ 0, /* [129] */ 265, /* [130] */ 265, /* [131] */ 264, /* [132] */ 263, /* [133] */ 264, /* [134] */ 264, /* [135] */ 264, /* [136] */ 263, /* [137] */ 263, /* [138] */ 263, /* [139] */ 263, /* [140] */ 263, /* [141] */ 263, /* [142] */ 263, /* [143] */ 263, /* [144] */ 263, /* [145] */ 263, /* [146] */ 263, /* [147] */ 517, /* [148] */ 261, /* [149] */ 261, /* [150] */ 261, /* [151] */ 263, /* [152] */ 263, /* [153] */ 263, /* [154] */ 263, /* [155] */ 263, /* [156] */ 263, /* [157] */ 263, /* [158] */ 263, /* [159] */ 263, /* [160] */ 263, /* [161] */ 261, /* [162] */ 262, /* [163] */ 263, /* [164] */ 264, /* [165] */ 264, /* [166] */ 264, /* [167] */ 264, /* [168] */ 265, /* [169] */ 266, /* [170] */ 266, /* [171] */ 267, /* [172] */ 260, /* [173] */ 261, /* [174] */ 264, /* [175] */ 268, /* [176] */ 8, /* [177] */ 11, /* [178] */ 263, /* [179] */ 262, /* [180] */ 262, /* [181] */ 263, /* [182] */ 265, /* [183] */ 263, /* [184] */ 264, /* [185] */ 265, /* [186] */ 522, /* [187] */ 261, /* [188] */ 6, /* [189] */ 6, /* [190] */ 266, /* [191] */ 267, /* [192] */ 7, /* [193] */ 264, /* [194] */ 516, /* [195] */ 263, /* [196] */ 266, /* [197] */ 261, /* [198] */ 264, /* [199] */ 265, /* [200] */ 264, /* [201] */ 264, /* [202] */ 522, /* [203] */ 8, /* [204] */ 265, /* [205] */ 521, /* [206] */ 264, /* [207] */ 780, /* [208] */ 267, /* [209] */ 262, /* [210] */ 265, /* [211] */ 263, /* [212] */ 263, /* [213] */ 260, /* [214] */ 260, /* [215] */ 263, /* [216] */ 265, /* [217] */ 264, /* [218] */ 271, /* [219] */ -1, /* [220] */ -1, /* [221] */ -1, /* [222] */ -1, /* [223] */ -1, /* [224] */ -1, /* [225] */ -1, /* [226] */ -1, /* [227] */ -1, /* [228] */ -1, /* [229] */ -1, /* [230] */ -1, /* [231] */ -1, /* [232] */ -1, /* [233] */ -1, /* [234] */ -1, /* [235] */ -1, /* [236] */ -1, /* [237] */ -1, /* [238] */ -1, /* [239] */ 521, /* [240] */ 521, /* [241] */ 10, /* [242] */ -18725 }, { /* array: 0 elements */ }, { /* array: 0 elements */ } }; resource 'FONT' (19593, purgeable) { doExpandFont, proportionalFont, blackFont, notSynthetic, nofctbRsrc, oneBit, noCharWidthTable, noImageHeightTable, 0, 254, 6, 0, -9, 6, 11, 9, 2, 0, 63, $"0000 0000 0000 0080 0000 0000 0000 0004" $"0000 0000 0000 0000 0000 0000 0000 0000" $"2000 0000 0000 0000 0000 0000 0000 0000" $"0001 0006 C000 0000 0000 00A2 0800 0000" $"0001 4A00 0001 8000 00D0 0000 10C2 002B" $"5AC4 4A00 FF83 E510 8201 0012 5787 C1E0" $"F885 0005 4005 0823 F03F FC00 7E00 0000" $"1CE0 0800 0000 0000 2000 000E 6000 0010" $"0000 0000 0080 0000 0000 0000 000E 0000" $"0000 0000 0000 0000 0000 0000 0000 2000" $"0000 0000 0000 0000 0000 0000 0000 0003" $"8002 8440 10C0 2008 1405 1000 2010 4400" $"0003 0002 0910 9B60 0000 1144 0014 0FC4" $"4A00 AEFA A510 8201 0012 55BD 7FBF A885" $"0005 4005 0823 F03F FC03 4200 0000 0910" $"1400 B9C0 0004 2003 0009 9000 D539 EC4C" $"2000 0139 7385 F77D CE00 01C4 779D EFFD" $"D1E1 8C23 1779 DE77 E318 C63F D0D0 1020" $"0080 C109 8600 0000 0010 0000 0005 4D77" $"C8A5 0920 5285 6AE7 7C0F 5288 A229 D104" $"A3E2 1221 2D17 6200 1249 002B 5AC4 4A00" $"DDEF 6510 8201 0012 56EE EB7B D885 0005" $"4005 0823 F03F FC04 C00F 800D 9D17 1001" $"47E0 121A 2004 8009 20F1 DFD6 B292 A900" $"0147 8C4D 0806 3104 122E 8C63 1842 3141" $"9437 98C6 3189 2318 AA21 9068 0820 0081" $"0100 8200 0000 0010 0000 0005 568F C000" $"00C0 0000 0118 C014 0000 0002 3124 1512" $"0000 0199 9000 1550 0014 0FC4 4A00 AED6" $"A510 8201 0012 55DD 77B5 A885 0005 4005" $"0823 F03F FC08 C004 8002 6B18 880F 47FF" $"912A 240C B839 4091 8552 D421 7100 024D" $"0855 EF06 31AB E83F 8C61 1842 1141 A42B" $"58C6 3181 2318 9222 8840 03FC E7BB 9FE9" $"93EB 3BCF B3FE 31AC 63F5 4082 9CF7 BDEE" $"739C 9318 C1D4 739D 18C6 3177 3F17 3E74" $"6D59 9200 0AAB 002B 5AC7 CA0F DDEF 65F0" $"8201 0013 D6EE EB7B DFE5 7E05 7E05 7E23" $"F03F FDD9 41F2 3F22 2BF8 BB72 C7E0 7CC8" $"2073 7C29 FE95 8FB9 4821 AFCF C255 11A4" $"1889 D110 0455 FFA1 1F7A 7F41 C423 38FA" $"3E71 2318 9144 8840 0463 18C5 2319 A35C" $"C631 CC12 31AA A229 2082 A318 C631 8C62" $"93FF FABE 8C63 18C6 31AC 09E2 468C 7337" $"647F F0CB 4C94 0FFC 7BF1 AED6 BF1F FFFF" $"FFFE 5DDD 77B5 A81F 81FF C9FF 89FF FFFF" $"FE29 40A1 4522 2B18 C6B2 C7FF 9128 3F88" $"7C40 0E95 8515 B521 2100 0465 207E 1892" $"2F0B E895 8C61 1842 3151 A423 18C2 3109" $"231A 9088 8440 0463 08FD 2319 E358 C631" $"8392 31A9 2245 4083 BF18 C630 FFFE 9318" $"C3F4 8C63 18C6 31A4 3F22 468C 6310 0840" $"210F 926B 5AC7 CA5F DDEF 60F1 0009 0013" $"D6EE EB7B DFE0 7E50 7F45 7E13 FFFF 0228" $"C0A2 4522 1D18 C774 C7E0 1218 2070 7F40" $"0E95 0056 B212 0100 0445 4445 1892 2104" $"100E 8C63 1842 3151 9423 18C2 3189 22AD" $"A890 8440 04E3 08C1 2319 9358 C631 8052" $"6AAA A285 4089 2139 CE70 8420 9318 C294" $"8C63 39C6 31AC 4972 4E8C E31F F8C0 2203" $"9254 0FC4 4A51 AED6 A001 0009 0012 55DD" $"77B5 A800 0850 0945 0813 FFFF 0228 C0A4" $"C522 0915 4414 C7FF 8008 2480 3880 0091" $"803A 4D0C 0010 2839 FB84 E711 CEA0 008A" $"8F9D EFC1 D1EE 8FE3 1741 D171 1C48 C49F" $"C2C7 E37C F7BD 1F19 8B58 BBCF 878D A454" $"5FF5 4071 1ED6 B5AF 7BDE 9318 FEF7 739C" $"D6BD CE77 8922 3673 6310 0700 0383 4CAB" $"5AC4 4A51 DDEF 6001 0009 0012 56EE EB7B" $"D800 0850 0945 0813 FFFF 01DB 40AF B9D2" $"1CED B80F 47E0 7FF9 2000 0080 00F1 0010" $"0000 0010 0800 0000 0000 0020 000A 0000" $"0000 0000 0000 0000 2000 0000 0000 0200" $"0000 0000 0201 0000 0201 0000 0000 0203" $"8013 8000 0004 0000 0000 0000 0000 0004" $"0020 0032 0000 0000 0000 0000 0014 0FC4" $"4A51 FFFF C001 0009 0012 53FF FFFF F800" $"0850 0945 0813 FFFF 0008 0000 0100 0000" $"0008 7FE0 0009 2000 0000 0000 0000 0000" $"0020 1000 0000 0000 0040 001B 0000 0000" $"0000 0000 0000 0000 0000 0000 0100 0000" $"0000 1C06 0000 0201 0000 0000 1C01 0020" $"0000 0008 0000 0000 0000 0000 0038 0000" $"000C 0000 0000 0000 0000 0001 5AC4 4A51" $"0000 0001 0009 0012 5000 0000 0000 0850" $"0945 0813 FFFF 0000 0000 0100 0000 0010" $"0000 0008 C000 0000 0000", { /* array: 257 elements */ /* [1] */ 0, /* [2] */ 0, /* [3] */ 0, /* [4] */ 0, /* [5] */ 0, /* [6] */ 0, /* [7] */ 0, /* [8] */ 0, /* [9] */ 0, /* [10] */ 0, /* [11] */ 0, /* [12] */ 0, /* [13] */ 0, /* [14] */ 0, /* [15] */ 0, /* [16] */ 0, /* [17] */ 0, /* [18] */ 0, /* [19] */ 0, /* [20] */ 0, /* [21] */ 0, /* [22] */ 0, /* [23] */ 0, /* [24] */ 0, /* [25] */ 0, /* [26] */ 0, /* [27] */ 0, /* [28] */ 0, /* [29] */ 0, /* [30] */ 0, /* [31] */ 0, /* [32] */ 0, /* [33] */ 0, /* [34] */ 0, /* [35] */ 1, /* [36] */ 4, /* [37] */ 9, /* [38] */ 14, /* [39] */ 19, /* [40] */ 24, /* [41] */ 26, /* [42] */ 29, /* [43] */ 32, /* [44] */ 37, /* [45] */ 42, /* [46] */ 44, /* [47] */ 50, /* [48] */ 51, /* [49] */ 57, /* [50] */ 62, /* [51] */ 64, /* [52] */ 69, /* [53] */ 74, /* [54] */ 79, /* [55] */ 84, /* [56] */ 89, /* [57] */ 94, /* [58] */ 99, /* [59] */ 104, /* [60] */ 105, /* [61] */ 107, /* [62] */ 110, /* [63] */ 115, /* [64] */ 118, /* [65] */ 123, /* [66] */ 128, /* [67] */ 133, /* [68] */ 138, /* [69] */ 143, /* [70] */ 148, /* [71] */ 153, /* [72] */ 158, /* [73] */ 163, /* [74] */ 168, /* [75] */ 171, /* [76] */ 176, /* [77] */ 181, /* [78] */ 186, /* [79] */ 191, /* [80] */ 196, /* [81] */ 201, /* [82] */ 206, /* [83] */ 211, /* [84] */ 216, /* [85] */ 221, /* [86] */ 226, /* [87] */ 231, /* [88] */ 236, /* [89] */ 241, /* [90] */ 246, /* [91] */ 251, /* [92] */ 256, /* [93] */ 258, /* [94] */ 264, /* [95] */ 266, /* [96] */ 269, /* [97] */ 275, /* [98] */ 277, /* [99] */ 282, /* [100] */ 287, /* [101] */ 292, /* [102] */ 297, /* [103] */ 302, /* [104] */ 306, /* [105] */ 311, /* [106] */ 316, /* [107] */ 317, /* [108] */ 320, /* [109] */ 325, /* [110] */ 327, /* [111] */ 332, /* [112] */ 337, /* [113] */ 342, /* [114] */ 347, /* [115] */ 352, /* [116] */ 357, /* [117] */ 362, /* [118] */ 366, /* [119] */ 371, /* [120] */ 376, /* [121] */ 381, /* [122] */ 386, /* [123] */ 391, /* [124] */ 396, /* [125] */ 399, /* [126] */ 400, /* [127] */ 403, /* [128] */ 408, /* [129] */ 408, /* [130] */ 413, /* [131] */ 418, /* [132] */ 423, /* [133] */ 428, /* [134] */ 433, /* [135] */ 438, /* [136] */ 443, /* [137] */ 448, /* [138] */ 453, /* [139] */ 458, /* [140] */ 463, /* [141] */ 466, /* [142] */ 469, /* [143] */ 471, /* [144] */ 476, /* [145] */ 481, /* [146] */ 486, /* [147] */ 491, /* [148] */ 496, /* [149] */ 501, /* [150] */ 506, /* [151] */ 511, /* [152] */ 516, /* [153] */ 521, /* [154] */ 526, /* [155] */ 531, /* [156] */ 536, /* [157] */ 541, /* [158] */ 546, /* [159] */ 551, /* [160] */ 556, /* [161] */ 561, /* [162] */ 566, /* [163] */ 568, /* [164] */ 573, /* [165] */ 578, /* [166] */ 583, /* [167] */ 588, /* [168] */ 592, /* [169] */ 596, /* [170] */ 601, /* [171] */ 606, /* [172] */ 611, /* [173] */ 617, /* [174] */ 623, /* [175] */ 624, /* [176] */ 629, /* [177] */ 634, /* [178] */ 639, /* [179] */ 644, /* [180] */ 649, /* [181] */ 650, /* [182] */ 654, /* [183] */ 658, /* [184] */ 663, /* [185] */ 668, /* [186] */ 672, /* [187] */ 677, /* [188] */ 681, /* [189] */ 686, /* [190] */ 691, /* [191] */ 696, /* [192] */ 700, /* [193] */ 704, /* [194] */ 707, /* [195] */ 713, /* [196] */ 719, /* [197] */ 722, /* [198] */ 728, /* [199] */ 734, /* [200] */ 737, /* [201] */ 741, /* [202] */ 745, /* [203] */ 749, /* [204] */ 754, /* [205] */ 759, /* [206] */ 763, /* [207] */ 768, /* [208] */ 773, /* [209] */ 779, /* [210] */ 785, /* [211] */ 791, /* [212] */ 797, /* [213] */ 801, /* [214] */ 804, /* [215] */ 807, /* [216] */ 811, /* [217] */ 817, /* [218] */ 823, /* [219] */ 827, /* [220] */ 830, /* [221] */ 836, /* [222] */ 842, /* [223] */ 845, /* [224] */ 848, /* [225] */ 854, /* [226] */ 860, /* [227] */ 865, /* [228] */ 871, /* [229] */ 876, /* [230] */ 881, /* [231] */ 887, /* [232] */ 892, /* [233] */ 898, /* [234] */ 903, /* [235] */ 908, /* [236] */ 913, /* [237] */ 918, /* [238] */ 923, /* [239] */ 929, /* [240] */ 934, /* [241] */ 939, /* [242] */ 945, /* [243] */ 950, /* [244] */ 953, /* [245] */ 956, /* [246] */ 959, /* [247] */ 963, /* [248] */ 968, /* [249] */ 973, /* [250] */ 977, /* [251] */ 982, /* [252] */ 983, /* [253] */ 988, /* [254] */ 992, /* [255] */ 996, /* [256] */ 999, /* [257] */ 1005 }, { /* array: 257 elements */ /* [1] */ 6, /* [2] */ 6, /* [3] */ 6, /* [4] */ 6, /* [5] */ 6, /* [6] */ 6, /* [7] */ 6, /* [8] */ 6, /* [9] */ 6, /* [10] */ 6, /* [11] */ 6, /* [12] */ 6, /* [13] */ 6, /* [14] */ 6, /* [15] */ 6, /* [16] */ 6, /* [17] */ 6, /* [18] */ 6, /* [19] */ 6, /* [20] */ 6, /* [21] */ 6, /* [22] */ 6, /* [23] */ 6, /* [24] */ 6, /* [25] */ 6, /* [26] */ 6, /* [27] */ 6, /* [28] */ 6, /* [29] */ 6, /* [30] */ 6, /* [31] */ 6, /* [32] */ 6, /* [33] */ 1542, /* [34] */ 518, /* [35] */ 262, /* [36] */ 6, /* [37] */ 6, /* [38] */ 6, /* [39] */ 6, /* [40] */ 518, /* [41] */ 262, /* [42] */ 518, /* [43] */ 6, /* [44] */ 6, /* [45] */ 262, /* [46] */ 6, /* [47] */ 518, /* [48] */ 6, /* [49] */ 6, /* [50] */ 518, /* [51] */ 6, /* [52] */ 6, /* [53] */ 6, /* [54] */ 6, /* [55] */ 6, /* [56] */ 6, /* [57] */ 6, /* [58] */ 6, /* [59] */ 518, /* [60] */ 262, /* [61] */ 262, /* [62] */ 6, /* [63] */ 262, /* [64] */ 6, /* [65] */ 6, /* [66] */ 6, /* [67] */ 6, /* [68] */ 6, /* [69] */ 6, /* [70] */ 6, /* [71] */ 6, /* [72] */ 6, /* [73] */ 6, /* [74] */ 262, /* [75] */ 6, /* [76] */ 6, /* [77] */ 6, /* [78] */ 6, /* [79] */ 6, /* [80] */ 6, /* [81] */ 6, /* [82] */ 6, /* [83] */ 6, /* [84] */ 6, /* [85] */ 6, /* [86] */ 6, /* [87] */ 6, /* [88] */ 6, /* [89] */ 6, /* [90] */ 6, /* [91] */ 6, /* [92] */ 518, /* [93] */ 6, /* [94] */ 518, /* [95] */ 262, /* [96] */ 6, /* [97] */ 262, /* [98] */ 6, /* [99] */ 6, /* [100] */ 6, /* [101] */ 6, /* [102] */ 6, /* [103] */ 262, /* [104] */ 6, /* [105] */ 6, /* [106] */ 518, /* [107] */ 6, /* [108] */ 6, /* [109] */ 262, /* [110] */ 6, /* [111] */ 6, /* [112] */ 6, /* [113] */ 6, /* [114] */ 6, /* [115] */ 6, /* [116] */ 6, /* [117] */ 262, /* [118] */ 6, /* [119] */ 6, /* [120] */ 6, /* [121] */ 6, /* [122] */ 6, /* [123] */ 6, /* [124] */ 518, /* [125] */ 518, /* [126] */ 262, /* [127] */ 6, /* [128] */ 0, /* [129] */ 6, /* [130] */ 6, /* [131] */ 6, /* [132] */ 6, /* [133] */ 6, /* [134] */ 6, /* [135] */ 6, /* [136] */ 6, /* [137] */ 6, /* [138] */ 6, /* [139] */ 6, /* [140] */ 262, /* [141] */ 262, /* [142] */ 262, /* [143] */ 6, /* [144] */ 6, /* [145] */ 6, /* [146] */ 6, /* [147] */ 6, /* [148] */ 6, /* [149] */ 6, /* [150] */ 6, /* [151] */ 6, /* [152] */ 6, /* [153] */ 6, /* [154] */ 6, /* [155] */ 6, /* [156] */ 6, /* [157] */ 6, /* [158] */ 6, /* [159] */ 6, /* [160] */ 6, /* [161] */ 6, /* [162] */ 518, /* [163] */ 6, /* [164] */ 6, /* [165] */ 6, /* [166] */ 6, /* [167] */ 262, /* [168] */ 262, /* [169] */ 6, /* [170] */ 6, /* [171] */ 6, /* [172] */ 6, /* [173] */ 6, /* [174] */ 774, /* [175] */ 6, /* [176] */ 6, /* [177] */ 6, /* [178] */ 6, /* [179] */ 6, /* [180] */ 774, /* [181] */ 6, /* [182] */ 6, /* [183] */ 6, /* [184] */ 6, /* [185] */ 6, /* [186] */ 6, /* [187] */ 262, /* [188] */ 6, /* [189] */ 6, /* [190] */ 6, /* [191] */ 6, /* [192] */ 6, /* [193] */ 774, /* [194] */ 6, /* [195] */ 6, /* [196] */ 774, /* [197] */ 6, /* [198] */ 6, /* [199] */ 774, /* [200] */ 518, /* [201] */ 262, /* [202] */ 262, /* [203] */ 6, /* [204] */ 6, /* [205] */ 262, /* [206] */ 6, /* [207] */ 6, /* [208] */ 6, /* [209] */ 6, /* [210] */ 6, /* [211] */ 6, /* [212] */ 518, /* [213] */ 774, /* [214] */ 774, /* [215] */ 518, /* [216] */ 6, /* [217] */ 6, /* [218] */ 6, /* [219] */ 774, /* [220] */ 6, /* [221] */ 6, /* [222] */ 6, /* [223] */ 774, /* [224] */ 6, /* [225] */ 6, /* [226] */ 6, /* [227] */ 6, /* [228] */ 6, /* [229] */ 6, /* [230] */ 6, /* [231] */ 6, /* [232] */ 6, /* [233] */ 6, /* [234] */ 6, /* [235] */ 6, /* [236] */ 6, /* [237] */ 6, /* [238] */ 6, /* [239] */ 6, /* [240] */ 6, /* [241] */ 6, /* [242] */ 6, /* [243] */ 262, /* [244] */ 262, /* [245] */ 774, /* [246] */ 6, /* [247] */ 6, /* [248] */ 6, /* [249] */ 262, /* [250] */ 6, /* [251] */ 518, /* [252] */ 6, /* [253] */ 6, /* [254] */ 6, /* [255] */ 262, /* [256] */ 6, /* [257] */ -1 }, { /* array: 0 elements */ }, { /* array: 0 elements */ } }; resource 'FONT' (19596) { doExpandFont, proportionalFont, blackFont, notSynthetic, nofctbRsrc, oneBit, noCharWidthTable, noImageHeightTable, 0, 255, 7, 0, -3, 7, 15, 12, 3, 0, 67, $"0000 0000 0000 0000 0000 0000 0000 0000" $"0000 0000 0000 0000 0000 0000 0000 0000" $"0000 0000 0000 0000 0000 0000 0000 0000" $"0000 0040 0000 0000 0000 0000 01C0 0000" $"0000 0000 0000 0000 0000 3400 0000 0000" $"02AA B562 2500 7FF0 3F28 8408 0100 0445" $"3E0F C0F8 1F88 2800 0520 0050 4087 F01F" $"FFC0 0000 0000 0000 0000 0738 0000 0400" $"0000 0000 0003 0000 0000 0000 0020 0000" $"0000 0000 0000 4000 0000 0000 0000 0000" $"0000 0000 0000 0100 0000 0000 0000 0000" $"0000 0000 0000 0000 0040 0000 0000 0000" $"0000 2A22 0000 0000 0052 8000 0060 0000" $"5800 0001 0400 0150 1FE2 2500 57BF B528" $"8408 0100 0445 2AFA FFAF F588 2800 0520" $"0050 4087 F01F FFC0 0000 0000 0000 0000" $"08FC 0000 0400 0001 4C00 0003 0010 000C" $"0000 0020 0000 0000 0000 0000 E000 0000" $"0000 0000 0000 0000 0000 0000 0F03 8000" $"0000 0000 0000 0000 0000 0000 0000 00E0" $"0000 0000 3000 0000 0224 0000 0000 0000" $"0000 0080 0000 0000 0001 0400 02AA B562" $"2500 6B5A EB28 8408 0100 0445 37BD 6BDD" $"7A88 2800 0520 0050 4087 F01F FFC0 0000" $"0000 01C0 00C0 08FC 0000 0400 0001 B200" $"0003 D539 2C52 2000 004E 5CE1 7CDF 7380" $"001C 4779 DEFF DD1E 18C2 3177 9DE7 7E31" $"8C63 F880 9004 0800 2030 4260 0000 0000" $"0000 0000 0153 5C01 1004 4808 0405 39DF" $"03D8 0411 0074 4068 F882 4426 C5EE 2001" $"1450 0150 1FE2 2500 57BD 7528 8408 0100" $"0445 2B5A F5AE B588 2800 0520 0050 4087" $"F01F FFC0 77C1 F000 008E 7100 08FC 0004" $"0400 6007 240F 8003 DFD6 B252 A800 0051" $"E313 4101 8C40 8222 E8C6 3184 2314 1943" $"718C 6318 9231 8C62 1880 A802 0800 2040" $"4261 8000 0000 0400 0000 0155 A2A2 2942" $"4814 A25A C630 0524 A228 8A8C 4085 4484" $"884B 4631 2001 2490 02AA B562 2500 6B5A" $"EB28 8408 0100 0445 37BD 6BDD 7A88 2800" $"0520 0050 4087 F01F FFC0 8A41 1000 DC91" $"8900 28FC 0089 8400 9005 29E8 8003 D552" $"D261 7100 0091 4215 4201 8C41 0103 F8C6" $"3184 2114 1A42 B98C 6318 1231 8C62 1840" $"C400 0800 2040 4020 8000 0000 0400 0000" $"0150 2200 0000 3000 0000 4630 0500 0000" $"008C 488F C480 0000 6631 0000 4100 0150" $"1FE2 2500 57BD 7528 8408 0100 0445 2B5A" $"F5AE B588 2800 0520 0050 4087 F01F FFDB" $"8A00 8001 21D1 8880 28FF E452 4480 9005" $"3FE8 8003 8531 D421 7100 0093 4269 7BC2" $"746A 7C85 58FA 1184 2114 1C42 358C 6318" $"1231 8AA2 2840 8000 FF39 EEE7 FA64 FBCE" $"F3EC EE8C 6B18 FD50 2117 3DEF 7B9C E724" $"C630 751C E746 318C 5C82 45CF 9D1B 5631" $"2000 B252 D2AA B563 E507 EB5A EB2F 8408" $"0100 047D 37BD 6BDD 7AFF 29FC 053F C053" $"F887 F01F FFE4 923E 47E2 2231 8BC0 E8FC" $"042A 4409 6704 01E8 8003 8F98 8821 AFC0" $"0115 441F 8624 8C6C 0049 5FC6 11F7 A7F4" $"1842 338F A3E7 1231 8914 4820 8001 18C6" $"3148 C668 D631 8C73 148C 6AA8 8A48 2118" $"C631 8C63 18A4 C63E AFE3 18C6 318C 6BCF" $"F891 A31C CDEE 27FF 4CD5 2950 1FFE 3DF8" $"D7BD 75F8 FFFF FFFF FFC5 EB5A F5AE B580" $"FE03 FFE2 3FFC 47FF FFFF FFE4 9214 2922" $"223F 8C77 58FF FF46 07F6 0F84 01E8 8003" $"8515 5421 210F E119 4811 0624 8BC2 7C89" $"58C6 1184 2314 1C42 318C 2310 9231 8A88" $"8820 8001 18C2 3F48 C670 D631 8C62 E48C" $"6A48 9150 211F C631 8C3F FFA4 FFF0 BD23" $"18C6 318C 6882 4091 A318 C400 4402 095A" $"16AA B563 E52F EB5A EB07 8800 1100 047D" $"37BD 6BDD 7AFF 01FC A03F E853 F847 FFFF" $"E01B 8A14 4922 2231 8C6B 58FC 0482 2409" $"0FC4 01E8 8003 0015 B2A1 0100 0211 5011" $"0624 8841 0100 48C6 1184 2315 1A42 318C" $"2310 9231 AC49 0810 8001 18C2 3048 C668" $"D631 8C60 148C 6A48 A150 2118 4631 8C21" $"0824 C630 A523 18C6 318C 6892 4891 A318" $"C7FF 8402 13FA 1550 1FE2 2528 D7BD 7500" $"0800 1100 0445 2B5A F5AE B580 0020 A002" $"2850 4047 FFFF E000 8A14 8922 2231 5477" $"58FF E41E 2496 0FB4 01E8 8003 8056 B112" $"0010 1211 6111 4624 88A8 8208 E8C6 3184" $"2315 1942 318C 2318 922A DC49 0810 8001" $"38C6 3148 C664 D631 8C61 149A AAA8 C150" $"2338 CE73 9C63 08A4 C630 AD23 18CE 718C" $"6A92 5C93 A338 C400 8800 2055 2AAA B562" $"2528 EB5A EB00 0800 1100 0445 37BD 6BDD" $"7A80 0020 A002 2850 4047 FFFF E000 8A15" $"1926 21D1 5441 58FC 00E2 1800 070C 0008" $"8003 803A 4E92 0010 140E 7EE1 39C4 7328" $"0008 A8F9 DEFC 1D1E E8FE 3174 1D17 11C4" $"8C49 F808 83F8 DF39 EE47 C662 D62E F3E0" $"E369 1517 FD50 1CD7 35AD 6B9C F724 C63F" $"75DC E735 AF73 9DE2 488D 9CD8 C400 7000" $"7852 D150 1FE2 2528 D7BD 7500 0800 1100" $"0445 2B5A F5AE B580 0020 A002 2850 4047" $"FFFF E000 B215 F63A 108E DB80 E8FC 1F02" $"0000 0004 000F 8003 0010 000C 0010 0400" $"0000 0000 0008 0000 A000 0000 0000 0000" $"0000 0800 0000 0000 0E0B 8000 0000 0000" $"8040 0000 8040 0000 0000 80E0 0800 0000" $"0100 0000 0000 0000 0000 0100 0800 0880" $"0000 0000 0000 0000 02AA B562 2528 EB5A" $"EB00 0800 1100 0445 37BD 6BDD 7A80 0020" $"A002 2850 4047 FFFF E000 8000 0020 0080" $"0000 88FC 0002 0000 0000 0000 0003 0000" $"0000 0020 0800 0000 0000 0010 0000 A000" $"0000 0000 0000 0000 0400 0000 0000 0004" $"0000 0000 0008 8040 0000 8040 0000 0008" $"8040 0800 0000 0100 0000 0000 0000 0000" $"0100 0000 0F00 0000 0000 0000 0000 0150" $"1FE2 2528 FFFF FE00 0800 1100 0445 1FFF" $"FFFF FF80 0020 A002 2850 4047 FFFF E000" $"0000 0020 01C0 0000 8FFC 0002 0000 0000" $"0000 0003 0000 0000 0000 0800 0000 0000" $"0000 0001 B000 0000 0000 0000 0000 0000" $"0000 0000 0004 0000 0000 0007 0180 0000" $"0000 0000 0007 0040 1000 0000 0200 0000" $"0000 0000 0000 0E00 0000 0000 0000 0000" $"0000 0000 000A B562 2528 8000 0000 0800" $"1100 0445 0000 0000 0000 0020 A002 2850" $"4047 FFFF E000 0000 0000 0000 0000 0000" $"0002 0000 0000 0000 0003", { /* array: 258 elements */ /* [1] */ 0, /* [2] */ 0, /* [3] */ 0, /* [4] */ 0, /* [5] */ 0, /* [6] */ 0, /* [7] */ 0, /* [8] */ 0, /* [9] */ 0, /* [10] */ 0, /* [11] */ 0, /* [12] */ 0, /* [13] */ 0, /* [14] */ 0, /* [15] */ 0, /* [16] */ 0, /* [17] */ 0, /* [18] */ 0, /* [19] */ 0, /* [20] */ 0, /* [21] */ 0, /* [22] */ 0, /* [23] */ 0, /* [24] */ 0, /* [25] */ 0, /* [26] */ 0, /* [27] */ 0, /* [28] */ 0, /* [29] */ 0, /* [30] */ 0, /* [31] */ 0, /* [32] */ 0, /* [33] */ 0, /* [34] */ 0, /* [35] */ 1, /* [36] */ 4, /* [37] */ 9, /* [38] */ 14, /* [39] */ 19, /* [40] */ 25, /* [41] */ 26, /* [42] */ 29, /* [43] */ 32, /* [44] */ 37, /* [45] */ 42, /* [46] */ 44, /* [47] */ 51, /* [48] */ 52, /* [49] */ 59, /* [50] */ 64, /* [51] */ 66, /* [52] */ 71, /* [53] */ 76, /* [54] */ 81, /* [55] */ 86, /* [56] */ 91, /* [57] */ 96, /* [58] */ 101, /* [59] */ 106, /* [60] */ 107, /* [61] */ 109, /* [62] */ 113, /* [63] */ 118, /* [64] */ 122, /* [65] */ 127, /* [66] */ 132, /* [67] */ 137, /* [68] */ 142, /* [69] */ 147, /* [70] */ 152, /* [71] */ 157, /* [72] */ 162, /* [73] */ 167, /* [74] */ 172, /* [75] */ 175, /* [76] */ 180, /* [77] */ 185, /* [78] */ 190, /* [79] */ 195, /* [80] */ 200, /* [81] */ 205, /* [82] */ 210, /* [83] */ 215, /* [84] */ 220, /* [85] */ 225, /* [86] */ 230, /* [87] */ 235, /* [88] */ 240, /* [89] */ 245, /* [90] */ 250, /* [91] */ 255, /* [92] */ 260, /* [93] */ 263, /* [94] */ 270, /* [95] */ 273, /* [96] */ 278, /* [97] */ 285, /* [98] */ 287, /* [99] */ 292, /* [100] */ 297, /* [101] */ 302, /* [102] */ 307, /* [103] */ 312, /* [104] */ 316, /* [105] */ 321, /* [106] */ 326, /* [107] */ 327, /* [108] */ 330, /* [109] */ 335, /* [110] */ 337, /* [111] */ 342, /* [112] */ 347, /* [113] */ 352, /* [114] */ 357, /* [115] */ 362, /* [116] */ 367, /* [117] */ 372, /* [118] */ 376, /* [119] */ 381, /* [120] */ 386, /* [121] */ 391, /* [122] */ 396, /* [123] */ 401, /* [124] */ 406, /* [125] */ 409, /* [126] */ 410, /* [127] */ 413, /* [128] */ 418, /* [129] */ 418, /* [130] */ 423, /* [131] */ 428, /* [132] */ 433, /* [133] */ 438, /* [134] */ 443, /* [135] */ 448, /* [136] */ 453, /* [137] */ 458, /* [138] */ 463, /* [139] */ 468, /* [140] */ 473, /* [141] */ 476, /* [142] */ 479, /* [143] */ 481, /* [144] */ 486, /* [145] */ 491, /* [146] */ 496, /* [147] */ 501, /* [148] */ 506, /* [149] */ 511, /* [150] */ 516, /* [151] */ 521, /* [152] */ 526, /* [153] */ 531, /* [154] */ 536, /* [155] */ 541, /* [156] */ 546, /* [157] */ 551, /* [158] */ 556, /* [159] */ 561, /* [160] */ 566, /* [161] */ 571, /* [162] */ 576, /* [163] */ 578, /* [164] */ 583, /* [165] */ 588, /* [166] */ 593, /* [167] */ 598, /* [168] */ 603, /* [169] */ 608, /* [170] */ 613, /* [171] */ 618, /* [172] */ 623, /* [173] */ 629, /* [174] */ 635, /* [175] */ 636, /* [176] */ 641, /* [177] */ 646, /* [178] */ 652, /* [179] */ 659, /* [180] */ 666, /* [181] */ 667, /* [182] */ 671, /* [183] */ 675, /* [184] */ 680, /* [185] */ 685, /* [186] */ 689, /* [187] */ 695, /* [188] */ 700, /* [189] */ 706, /* [190] */ 712, /* [191] */ 717, /* [192] */ 721, /* [193] */ 725, /* [194] */ 729, /* [195] */ 736, /* [196] */ 743, /* [197] */ 747, /* [198] */ 754, /* [199] */ 761, /* [200] */ 765, /* [201] */ 770, /* [202] */ 775, /* [203] */ 780, /* [204] */ 786, /* [205] */ 792, /* [206] */ 797, /* [207] */ 803, /* [208] */ 809, /* [209] */ 816, /* [210] */ 823, /* [211] */ 830, /* [212] */ 837, /* [213] */ 842, /* [214] */ 846, /* [215] */ 850, /* [216] */ 855, /* [217] */ 862, /* [218] */ 869, /* [219] */ 873, /* [220] */ 877, /* [221] */ 884, /* [222] */ 891, /* [223] */ 895, /* [224] */ 899, /* [225] */ 906, /* [226] */ 912, /* [227] */ 917, /* [228] */ 922, /* [229] */ 927, /* [230] */ 932, /* [231] */ 938, /* [232] */ 943, /* [233] */ 950, /* [234] */ 955, /* [235] */ 960, /* [236] */ 965, /* [237] */ 970, /* [238] */ 975, /* [239] */ 980, /* [240] */ 985, /* [241] */ 990, /* [242] */ 995, /* [243] */ 1000, /* [244] */ 1003, /* [245] */ 1006, /* [246] */ 1010, /* [247] */ 1014, /* [248] */ 1019, /* [249] */ 1024, /* [250] */ 1028, /* [251] */ 1033, /* [252] */ 1034, /* [253] */ 1039, /* [254] */ 1043, /* [255] */ 1047, /* [256] */ 1051, /* [257] */ 1051, /* [258] */ 1058 }, { /* array: 258 elements */ /* [1] */ 7, /* [2] */ 7, /* [3] */ 7, /* [4] */ 7, /* [5] */ 7, /* [6] */ 7, /* [7] */ 7, /* [8] */ 7, /* [9] */ 7, /* [10] */ 7, /* [11] */ 7, /* [12] */ 7, /* [13] */ 7, /* [14] */ 7, /* [15] */ 7, /* [16] */ 7, /* [17] */ 7, /* [18] */ 7, /* [19] */ 7, /* [20] */ 7, /* [21] */ 7, /* [22] */ 7, /* [23] */ 7, /* [24] */ 7, /* [25] */ 7, /* [26] */ 7, /* [27] */ 7, /* [28] */ 7, /* [29] */ 7, /* [30] */ 7, /* [31] */ 7, /* [32] */ 7, /* [33] */ 7, /* [34] */ 775, /* [35] */ 519, /* [36] */ 263, /* [37] */ 263, /* [38] */ 263, /* [39] */ 7, /* [40] */ 775, /* [41] */ 519, /* [42] */ 519, /* [43] */ 263, /* [44] */ 263, /* [45] */ 519, /* [46] */ 7, /* [47] */ 775, /* [48] */ 7, /* [49] */ 263, /* [50] */ 519, /* [51] */ 263, /* [52] */ 263, /* [53] */ 263, /* [54] */ 263, /* [55] */ 263, /* [56] */ 263, /* [57] */ 263, /* [58] */ 263, /* [59] */ 775, /* [60] */ 519, /* [61] */ 263, /* [62] */ 263, /* [63] */ 519, /* [64] */ 263, /* [65] */ 263, /* [66] */ 263, /* [67] */ 263, /* [68] */ 263, /* [69] */ 263, /* [70] */ 263, /* [71] */ 263, /* [72] */ 263, /* [73] */ 263, /* [74] */ 519, /* [75] */ 263, /* [76] */ 263, /* [77] */ 263, /* [78] */ 263, /* [79] */ 263, /* [80] */ 263, /* [81] */ 263, /* [82] */ 263, /* [83] */ 263, /* [84] */ 263, /* [85] */ 263, /* [86] */ 263, /* [87] */ 263, /* [88] */ 263, /* [89] */ 263, /* [90] */ 263, /* [91] */ 263, /* [92] */ 519, /* [93] */ 7, /* [94] */ 519, /* [95] */ 263, /* [96] */ 7, /* [97] */ 775, /* [98] */ 263, /* [99] */ 263, /* [100] */ 263, /* [101] */ 263, /* [102] */ 263, /* [103] */ 519, /* [104] */ 263, /* [105] */ 263, /* [106] */ 775, /* [107] */ 263, /* [108] */ 263, /* [109] */ 519, /* [110] */ 263, /* [111] */ 263, /* [112] */ 263, /* [113] */ 263, /* [114] */ 263, /* [115] */ 263, /* [116] */ 263, /* [117] */ 263, /* [118] */ 263, /* [119] */ 263, /* [120] */ 263, /* [121] */ 263, /* [122] */ 263, /* [123] */ 263, /* [124] */ 519, /* [125] */ 775, /* [126] */ 519, /* [127] */ 263, /* [128] */ 0, /* [129] */ 263, /* [130] */ 263, /* [131] */ 263, /* [132] */ 263, /* [133] */ 263, /* [134] */ 263, /* [135] */ 263, /* [136] */ 263, /* [137] */ 263, /* [138] */ 263, /* [139] */ 263, /* [140] */ 519, /* [141] */ 519, /* [142] */ 519, /* [143] */ 263, /* [144] */ 263, /* [145] */ 263, /* [146] */ 263, /* [147] */ 263, /* [148] */ 263, /* [149] */ 263, /* [150] */ 263, /* [151] */ 263, /* [152] */ 263, /* [153] */ 263, /* [154] */ 263, /* [155] */ 263, /* [156] */ 263, /* [157] */ 263, /* [158] */ 263, /* [159] */ 263, /* [160] */ 263, /* [161] */ 263, /* [162] */ 775, /* [163] */ 263, /* [164] */ 263, /* [165] */ 263, /* [166] */ 263, /* [167] */ 263, /* [168] */ 263, /* [169] */ 263, /* [170] */ 263, /* [171] */ 263, /* [172] */ 263, /* [173] */ 263, /* [174] */ 775, /* [175] */ 263, /* [176] */ 263, /* [177] */ 7, /* [178] */ 7, /* [179] */ 7, /* [180] */ 775, /* [181] */ 7, /* [182] */ 7, /* [183] */ 7, /* [184] */ 7, /* [185] */ 7, /* [186] */ 7, /* [187] */ 263, /* [188] */ 7, /* [189] */ 7, /* [190] */ 7, /* [191] */ 7, /* [192] */ 7, /* [193] */ 775, /* [194] */ 7, /* [195] */ 7, /* [196] */ 775, /* [197] */ 7, /* [198] */ 7, /* [199] */ 775, /* [200] */ 519, /* [201] */ 263, /* [202] */ 263, /* [203] */ 7, /* [204] */ 7, /* [205] */ 263, /* [206] */ 7, /* [207] */ 7, /* [208] */ 7, /* [209] */ 7, /* [210] */ 7, /* [211] */ 7, /* [212] */ 519, /* [213] */ 775, /* [214] */ 775, /* [215] */ 519, /* [216] */ 7, /* [217] */ 7, /* [218] */ 7, /* [219] */ 775, /* [220] */ 7, /* [221] */ 7, /* [222] */ 7, /* [223] */ 775, /* [224] */ 7, /* [225] */ 263, /* [226] */ 263, /* [227] */ 263, /* [228] */ 263, /* [229] */ 263, /* [230] */ 263, /* [231] */ 263, /* [232] */ 7, /* [233] */ 263, /* [234] */ 263, /* [235] */ 263, /* [236] */ 263, /* [237] */ 263, /* [238] */ 263, /* [239] */ 263, /* [240] */ 263, /* [241] */ 263, /* [242] */ 263, /* [243] */ 519, /* [244] */ 519, /* [245] */ 775, /* [246] */ 7, /* [247] */ 263, /* [248] */ 263, /* [249] */ 263, /* [250] */ 263, /* [251] */ 775, /* [252] */ 263, /* [253] */ 7, /* [254] */ 7, /* [255] */ 263, /* [256] */ 1, /* [257] */ 7, /* [258] */ -1 }, { /* array: 0 elements */ }, { /* array: 0 elements */ } }; resource 'FONT' (19465, "PSHackFont 9", purgeable) { doExpandFont, proportionalFont, blackFont, notSynthetic, nofctbRsrc, oneBit, noCharWidthTable, noImageHeightTable, 0, 239, 10, 0, -10, 10, 12, 10, 2, 0, 52, $"0000 0000 0000 0000 0000 0000 0000 0000" $"0000 0000 0000 0000 0000 0000 0000 0000" $"0000 0000 0000 0000 0000 0000 0000 0000" $"0003 804D 0000 0000 0000 0000 0000 0000" $"0000 0000 0000 0000 0000 0000 0000 0000" $"001F 81C0 0000 0000 0000 701C 0700 7000" $"0000 0000 0000 0000 0000 0000 0000 0000" $"0000 0000 0000 0000 0000 0000 0000 0000" $"0000 0000 0000 0000 0000 0000 0000 0000" $"0000 0000 0000 0000 0054 4096 5280 0001" $"8000 0000 0000 0000 0000 0000 0000 0000" $"0000 0002 A000 0000 0016 8140 0000 0000" $"8000 5014 0500 5000 0000 0000 0000 0000" $"0510 00C0 C000 0080 0000 0000 0000 0000" $"0000 0000 0000 0000 0000 0000 0000 0001" $"C600 0000 0000 0000 0000 0000 0000 0003" $"8003 8000 0009 0816 4091 0190 5244 0524" $"404C 0038 0001 E1E0 0000 0000 0000 0000" $"0016 814E 0000 000D 0000 5014 0500 5000" $"0155 4000 000F 3C00 DFB9 FD25 2500 00B9" $"77C5 F37D CE00 018E 13CE E7FB A30C 620E" $"5DE7 79DF 8C60 C63F 4280 8200 40C2 1318" $"0000 0004 0000 0005 4D21 1DF9 7450 9569" $"810A A66D A42A 9A42 A9F2 4344 0F72 1217" $"8B40 3E76 A000 8833 FF96 F951 0000 A009" $"0000 5794 0500 5000 0296 4022 401F C3F8" $"D556 4946 1210 0147 888D 0406 3104 1251" $"1231 9444 630C A31E 6318 C624 8C60 C623" $"2340 4200 4102 0108 0000 0004 0000 0005" $"5621 2319 8C40 0000 0000 0000 0000 0000" $"0052 E441 D58D CCCA DC04 5088 0424 5489" $"2976 CF60 8034 0011 0480 5CF6 0581 D800" $"02AA 8850 0F9F C308 8FD2 5082 1F90 0145" $"0915 E80A 31AB E866 AA30 8C44 230D 22AD" $"6318 C604 8C55 2945 2200 1B99 DB9F B72F" $"6E6E 7B7F 3183 19F5 4072 A115 8C5D DDDD" $"D999 9BF6 E666 6699 994D 543B F58D 2D0A" $"A83E 509A A442 FC94 8946 EC60 BE48 A013" $"B884 CDC3 FCFF 0B60 0000 008A 305F C308" $"8539 B952 127C F245 13A4 1F09 CF10 04AA" $"ABD0 8F74 FF0E 224D 63E8 F9C4 8A95 1089" $"1200 0666 6526 534C 9999 9C85 2A54 A928" $"2072 A1D5 8C66 6666 6666 6552 9999 9999" $"9941 4E47 F5B5 CD0A 8808 FCA8 1F81 24A4" $"4976 AFE0 C959 3FA1 4549 7D7F 0DC3 DC90" $"0000 3F06 30FF C308 8014 6622 1510 0245" $"207E 1892 210B E92A FE30 8C44 638D 220C" $"E308 D024 8A8A 2891 1200 1E62 7D26 538C" $"9999 9865 2A54 4945 40FF E113 8C66 6666" $"63FF FD52 9999 9999 9901 543B EF8D 2CC8" $"003E 90CA A442 FCA4 8916 A811 4F6A 22A1" $"3952 0501 DD7E 54FF FC00 008A 307F C308" $"0054 A652 1010 0445 4445 1892 2204 1027" $"4631 9444 638C A20C E30A CA24 890A 4491" $"0A00 2666 6126 534C 9999 9815 2428 A985" $"408C 6313 8C66 6666 6622 2152 9999 9999" $"9900 E485 C58A 1210 0011 1088 0424 24A5" $"2916 A80A 484A 6241 4229 0500 5500 5480" $"0000 0852 2F9F C308 8039 1989 2001 0C39" $"FB84 E711 CCA0 0110 47CE E7C3 A374 7E0C" $"5D07 45C4 710A 449F 0A3F 1F99 D91E 532C" $"996E 78E2 E429 17F5 408C 5DF1 739D DDDD" $"D9D9 9D52 9666 6677 7700 4F44 05B1 E1E0" $"0001 1F72 BFFF 275B E916 B81B 3EB1 A041" $"03E4 8700 5500 53E0 0000 0021 E89F C3F8" $"0010 0000 C001 0000 0000 0000 0020 000E" $"0000 0000 0000 0000 0001 0000 0000 0001" $"8600 0000 0004 0200 0008 1000 0000 0103" $"8000 0800 0000 0000 0800 0000 0000 0000" $"0000 0038 0000 0000 0000 0000 0000 0400" $"001F 8000 0000 0001 0000 0000 5700 7000" $"0000 0000 201F FE00 0000 0000 0002 0000" $"0000 0000 0040 0000 0000 0000 0000 0000" $"0000 0000 0000 0000 0000 0000 0018 0C00" $"0008 1000 0000 0600 0000 1000 0000 0000" $"1000 0000 0000 0000 0000 0000 0000 0000" $"0000 0000 0000 0400 0000 0000 0000 0002" $"0000 0000 7000 0000 0000 0001 C000 0000", { /* array: 242 elements */ /* [1] */ 0, /* [2] */ 0, /* [3] */ 0, /* [4] */ 0, /* [5] */ 0, /* [6] */ 0, /* [7] */ 0, /* [8] */ 0, /* [9] */ 0, /* [10] */ 0, /* [11] */ 0, /* [12] */ 0, /* [13] */ 0, /* [14] */ 0, /* [15] */ 0, /* [16] */ 0, /* [17] */ 0, /* [18] */ 0, /* [19] */ 0, /* [20] */ 0, /* [21] */ 0, /* [22] */ 0, /* [23] */ 0, /* [24] */ 0, /* [25] */ 0, /* [26] */ 0, /* [27] */ 0, /* [28] */ 0, /* [29] */ 0, /* [30] */ 0, /* [31] */ 0, /* [32] */ 0, /* [33] */ 0, /* [34] */ 0, /* [35] */ 1, /* [36] */ 4, /* [37] */ 9, /* [38] */ 14, /* [39] */ 22, /* [40] */ 29, /* [41] */ 30, /* [42] */ 33, /* [43] */ 36, /* [44] */ 41, /* [45] */ 46, /* [46] */ 48, /* [47] */ 52, /* [48] */ 53, /* [49] */ 57, /* [50] */ 62, /* [51] */ 64, /* [52] */ 69, /* [53] */ 74, /* [54] */ 79, /* [55] */ 84, /* [56] */ 89, /* [57] */ 94, /* [58] */ 99, /* [59] */ 104, /* [60] */ 105, /* [61] */ 107, /* [62] */ 110, /* [63] */ 115, /* [64] */ 118, /* [65] */ 122, /* [66] */ 129, /* [67] */ 134, /* [68] */ 139, /* [69] */ 144, /* [70] */ 149, /* [71] */ 153, /* [72] */ 157, /* [73] */ 162, /* [74] */ 167, /* [75] */ 168, /* [76] */ 173, /* [77] */ 178, /* [78] */ 182, /* [79] */ 189, /* [80] */ 194, /* [81] */ 199, /* [82] */ 204, /* [83] */ 209, /* [84] */ 214, /* [85] */ 219, /* [86] */ 224, /* [87] */ 229, /* [88] */ 234, /* [89] */ 241, /* [90] */ 246, /* [91] */ 251, /* [92] */ 255, /* [93] */ 257, /* [94] */ 261, /* [95] */ 263, /* [96] */ 266, /* [97] */ 272, /* [98] */ 274, /* [99] */ 278, /* [100] */ 282, /* [101] */ 286, /* [102] */ 290, /* [103] */ 294, /* [104] */ 298, /* [105] */ 302, /* [106] */ 306, /* [107] */ 308, /* [108] */ 311, /* [109] */ 315, /* [110] */ 317, /* [111] */ 324, /* [112] */ 328, /* [113] */ 332, /* [114] */ 336, /* [115] */ 340, /* [116] */ 344, /* [117] */ 348, /* [118] */ 351, /* [119] */ 355, /* [120] */ 360, /* [121] */ 367, /* [122] */ 372, /* [123] */ 376, /* [124] */ 380, /* [125] */ 383, /* [126] */ 384, /* [127] */ 387, /* [128] */ 392, /* [129] */ 392, /* [130] */ 397, /* [131] */ 402, /* [132] */ 407, /* [133] */ 411, /* [134] */ 416, /* [135] */ 421, /* [136] */ 426, /* [137] */ 430, /* [138] */ 434, /* [139] */ 438, /* [140] */ 442, /* [141] */ 446, /* [142] */ 450, /* [143] */ 454, /* [144] */ 458, /* [145] */ 462, /* [146] */ 466, /* [147] */ 470, /* [148] */ 472, /* [149] */ 474, /* [150] */ 477, /* [151] */ 480, /* [152] */ 484, /* [153] */ 488, /* [154] */ 492, /* [155] */ 496, /* [156] */ 500, /* [157] */ 504, /* [158] */ 508, /* [159] */ 512, /* [160] */ 516, /* [161] */ 520, /* [162] */ 523, /* [163] */ 527, /* [164] */ 532, /* [165] */ 537, /* [166] */ 542, /* [167] */ 547, /* [168] */ 552, /* [169] */ 557, /* [170] */ 565, /* [171] */ 573, /* [172] */ 581, /* [173] */ 583, /* [174] */ 586, /* [175] */ 591, /* [176] */ 599, /* [177] */ 606, /* [178] */ 611, /* [179] */ 616, /* [180] */ 620, /* [181] */ 624, /* [182] */ 629, /* [183] */ 634, /* [184] */ 638, /* [185] */ 643, /* [186] */ 649, /* [187] */ 654, /* [188] */ 657, /* [189] */ 661, /* [190] */ 666, /* [191] */ 673, /* [192] */ 680, /* [193] */ 686, /* [194] */ 690, /* [195] */ 691, /* [196] */ 695, /* [197] */ 702, /* [198] */ 705, /* [199] */ 710, /* [200] */ 715, /* [201] */ 721, /* [202] */ 725, /* [203] */ 729, /* [204] */ 735, /* [205] */ 741, /* [206] */ 745, /* [207] */ 751, /* [208] */ 757, /* [209] */ 764, /* [210] */ 768, /* [211] */ 774, /* [212] */ 778, /* [213] */ 782, /* [214] */ 784, /* [215] */ 786, /* [216] */ 791, /* [217] */ 798, /* [218] */ 803, /* [219] */ 811, /* [220] */ 811, /* [221] */ 811, /* [222] */ 811, /* [223] */ 811, /* [224] */ 811, /* [225] */ 811, /* [226] */ 811, /* [227] */ 811, /* [228] */ 811, /* [229] */ 811, /* [230] */ 811, /* [231] */ 811, /* [232] */ 811, /* [233] */ 811, /* [234] */ 811, /* [235] */ 811, /* [236] */ 811, /* [237] */ 811, /* [238] */ 811, /* [239] */ 811, /* [240] */ 817, /* [241] */ 823, /* [242] */ 830 }, { /* array: 242 elements */ /* [1] */ 0, /* [2] */ 0, /* [3] */ 0, /* [4] */ 0, /* [5] */ 0, /* [6] */ 0, /* [7] */ -1, /* [8] */ -1, /* [9] */ -1, /* [10] */ 1542, /* [11] */ -1, /* [12] */ -1, /* [13] */ -1, /* [14] */ 0, /* [15] */ -1, /* [16] */ -1, /* [17] */ -1, /* [18] */ -1, /* [19] */ -1, /* [20] */ -1, /* [21] */ -1, /* [22] */ -1, /* [23] */ -1, /* [24] */ -1, /* [25] */ -1, /* [26] */ -1, /* [27] */ -1, /* [28] */ -1, /* [29] */ 7, /* [30] */ -1, /* [31] */ -1, /* [32] */ -1, /* [33] */ 771, /* [34] */ 259, /* [35] */ 261, /* [36] */ 263, /* [37] */ 6, /* [38] */ 9, /* [39] */ 8, /* [40] */ 259, /* [41] */ 4, /* [42] */ 4, /* [43] */ 263, /* [44] */ 6, /* [45] */ 260, /* [46] */ 5, /* [47] */ 259, /* [48] */ 262, /* [49] */ 6, /* [50] */ 262, /* [51] */ 6, /* [52] */ 6, /* [53] */ 6, /* [54] */ 6, /* [55] */ 6, /* [56] */ 6, /* [57] */ 6, /* [58] */ 6, /* [59] */ 516, /* [60] */ 260, /* [61] */ 261, /* [62] */ 6, /* [63] */ 261, /* [64] */ 262, /* [65] */ 8, /* [66] */ 263, /* [67] */ 6, /* [68] */ 6, /* [69] */ 6, /* [70] */ 5, /* [71] */ 5, /* [72] */ 6, /* [73] */ 6, /* [74] */ 259, /* [75] */ 6, /* [76] */ 6, /* [77] */ 5, /* [78] */ 8, /* [79] */ 6, /* [80] */ 6, /* [81] */ 6, /* [82] */ 6, /* [83] */ 6, /* [84] */ 6, /* [85] */ 6, /* [86] */ 6, /* [87] */ 6, /* [88] */ 8, /* [89] */ 6, /* [90] */ 6, /* [91] */ 5, /* [92] */ 260, /* [93] */ 262, /* [94] */ 260, /* [95] */ 4, /* [96] */ 6, /* [97] */ 3, /* [98] */ 5, /* [99] */ 5, /* [100] */ 5, /* [101] */ 5, /* [102] */ 5, /* [103] */ 4, /* [104] */ 5, /* [105] */ 5, /* [106] */ 3, /* [107] */ 4, /* [108] */ 5, /* [109] */ 3, /* [110] */ 8, /* [111] */ 5, /* [112] */ 5, /* [113] */ 5, /* [114] */ 5, /* [115] */ 5, /* [116] */ 5, /* [117] */ 4, /* [118] */ 5, /* [119] */ 6, /* [120] */ 8, /* [121] */ 6, /* [122] */ 6, /* [123] */ 5, /* [124] */ 4, /* [125] */ 2, /* [126] */ 4, /* [127] */ 6, /* [128] */ 0, /* [129] */ 6, /* [130] */ 263, /* [131] */ 6, /* [132] */ 5, /* [133] */ 6, /* [134] */ 6, /* [135] */ 6, /* [136] */ 5, /* [137] */ 5, /* [138] */ 5, /* [139] */ 5, /* [140] */ 5, /* [141] */ 5, /* [142] */ 5, /* [143] */ 5, /* [144] */ 5, /* [145] */ 5, /* [146] */ 5, /* [147] */ 3, /* [148] */ 3, /* [149] */ 4, /* [150] */ 4, /* [151] */ 5, /* [152] */ 5, /* [153] */ 5, /* [154] */ 5, /* [155] */ 5, /* [156] */ 5, /* [157] */ 5, /* [158] */ 5, /* [159] */ 5, /* [160] */ 5, /* [161] */ 4, /* [162] */ 5, /* [163] */ 6, /* [164] */ 6, /* [165] */ 6, /* [166] */ 6, /* [167] */ 6, /* [168] */ 6, /* [169] */ 9, /* [170] */ 9, /* [171] */ 9, /* [172] */ 260, /* [173] */ 4, /* [174] */ 6, /* [175] */ 9, /* [176] */ 7, /* [177] */ 266, /* [178] */ 6, /* [179] */ 5, /* [180] */ 5, /* [181] */ 6, /* [182] */ 6, /* [183] */ 5, /* [184] */ 6, /* [185] */ 7, /* [186] */ 776, /* [187] */ 517, /* [188] */ 261, /* [189] */ 5, /* [190] */ 8, /* [191] */ 265, /* [192] */ 6, /* [193] */ 262, /* [194] */ 259, /* [195] */ 5, /* [196] */ 8, /* [197] */ 261, /* [198] */ 6, /* [199] */ 263, /* [200] */ 8, /* [201] */ 8, /* [202] */ 264, /* [203] */ 6, /* [204] */ 7, /* [205] */ 775, /* [206] */ 6, /* [207] */ 9, /* [208] */ 8, /* [209] */ 5, /* [210] */ 7, /* [211] */ 263, /* [212] */ 519, /* [213] */ 260, /* [214] */ 260, /* [215] */ 6, /* [216] */ 8, /* [217] */ 6, /* [218] */ 9, /* [219] */ -1, /* [220] */ -1, /* [221] */ -1, /* [222] */ -1, /* [223] */ -1, /* [224] */ -1, /* [225] */ -1, /* [226] */ -1, /* [227] */ -1, /* [228] */ -1, /* [229] */ -1, /* [230] */ -1, /* [231] */ -1, /* [232] */ -1, /* [233] */ -1, /* [234] */ -1, /* [235] */ -1, /* [236] */ -1, /* [237] */ -1, /* [238] */ -1, /* [239] */ 6, /* [240] */ 6, /* [241] */ 7, /* [242] */ 0 }, { /* array: 0 elements */ }, { /* array: 0 elements */ } }; data 'FOND' (151, "HackFont", preload) { $"00F0 0097 0000 0000 0000 0000 0000 0000" /* .ð.—............ */ $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */ $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */ $"0000 0001 0001 0009 0000 4B89 000C 0000" /* .......Æ..K‰.... */ $"4B8C" /* KŒ */ }; resource 'FOND' (152, "PSHackFont", preload) { proportionalFont, dontUseFractWidthTable, useIntegerExtra, useFractEnable, canAdjustCharSpacing, noCharWidthTable, noImageHeightTable, 152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, { /* array FontEntries: 2 elements */ /* [1] */ 9, plain, 14345, /* [2] */ 12, plain, 14348 }, { /* array: 0 elements */ }, { /* array: 0 elements */ }, { /* array: 0 elements */ }, { /* array: 0 elements */ } }; data 'FOND' (153, "NewHackFont", preload) { $"00F0 0099 0000 0000 0000 0000 0000 0000" /* .ð.™............ */ $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */ $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */ $"0000 0001 0001 0009 0000 4C89 000C 0000" /* .......Æ..L‰.... */ $"4C8C" /* LŒ */ }; resource 'CURS' (512, purgeable) { $"0000 0000 0FF0 0810 0810 0810 0810 0810" $"0810 0810 0810 0810 0FF0", $"0000 0FF0 1FF8 1818 1818 1818 1818 1818" $"1818 1818 1818 1818 1FF8 0FF0", {7, 7} }; resource 'CURS' (515, purgeable) { $"0100 0280 0440 0EE0 0280 0280 0380", $"0100 0380 07C0 0FE0 0380 0380 0380", {6, 7} }; resource 'CURS' (516, purgeable) { $"001F 0009 0009 0017 0029 0010", $"001F 000F 000F 001F 0039 0010", {4, 11} }; resource 'CURS' (517, purgeable) { $"0000 0000 0000 0000 0008 000C 007A 0041" $"007A 000C 0008", $"0000 0000 0000 0000 0008 000C 007E 007F" $"007E 000C 0008", {7, 9} }; resource 'CURS' (519, purgeable) { $"0000 0000 0000 0000 0000 0000 0000 0000" $"0000 01C0 0140 0140 0770 0220 0140 0080", $"0000 0000 0000 0000 0000 0000 0000 0000" $"0000 01C0 01C0 01C0 07F0 03E0 01C0 0080", {9, 8} }; resource 'CURS' (513, purgeable) { $"0000 0000 0000 0000 0000 1000 3000 5E00" $"8200 5E00 3000 10", $"0000 0000 0000 0000 0000 1000 3000 7E00" $"FE00 7E00 3000 10", {8, 6} }; resource 'CURS' (518, purgeable) { $"0000 0000 0000 0000 0000 0000 0000 0000" $"0000 0000 0010 0029 0017 0009 0009 001F", $"0000 0000 0000 0000 0000 0000 0000 0000" $"0000 0000 0010 0039 001F 000F 000F 001F", {11, 11} }; resource 'CURS' (520, purgeable) { $"0000 0000 0000 0000 0000 0000 0000 0000" $"0000 0000 0800 9400 E800 9000 9000 F8", $"0000 0000 0000 0000 0000 0000 0000 0000" $"0000 0000 0800 9C00 F800 F000 F000 F8", {11, 4} }; resource 'CURS' (514, purgeable) { $"F800 9000 9000 E800 9400 08", $"F800 F000 F000 F800 9C00 08", {4, 4} }; resource 'FREF' (128, purgeable) { 'APPL', 0, "" }; resource 'FREF' (129, purgeable) { 'PREF', 1, "" }; resource 'FREF' (130, purgeable) { 'DATA', 2, "" }; resource 'FREF' (131, purgeable) { 'SAVE', 3, "" }; resource 'FREF' (132, purgeable) { 'BONE', 4, "" }; resource 'BNDL' (128, purgeable) { 'slEm', 0, { /* array TypeArray: 2 elements */ /* [1] */ 'FREF', { /* array IDArray: 5 elements */ /* [1] */ 0, 128, /* [2] */ 1, 129, /* [3] */ 2, 130, /* [4] */ 3, 131, /* [5] */ 4, 132 }, /* [2] */ 'ICN#', { /* array IDArray: 5 elements */ /* [1] */ 0, 1000, /* [2] */ 1, 1001, /* [3] */ 2, 1002, /* [4] */ 3, 1003, /* [5] */ 4, 1004 } } }; resource 'MENU' (129) { 129, textMenuProc, 0x7FFFFEA7, enabled, "File", { /* array: 10 elements */ /* [1] */ "Redraw Map", noIcon, "R", "\0x11", plain, /* [2] */ "Previous Msg", noIcon, "P", "\0x11", plain, /* [3] */ "Reposition", noIcon, "N", noMark, plain, /* [4] */ "-", noIcon, noKey, noMark, plain, /* [5] */ "Regular", noIcon, hierarchicalMenu, "È", plain, /* [6] */ "Enter Explore", noIcon, noKey, "X", plain, /* [7] */ "-", noIcon, noKey, noMark, plain, /* [8] */ "Save", noIcon, "S", "S", plain, /* [9] */ "-", noIcon, noKey, noMark, plain, /* [10] */ "Quit", noIcon, "Q", "Q", plain } }; resource 'MENU' (130) { 130, textMenuProc, 0x7FFFFFFD, enabled, "Edit", { /* array: 6 elements */ /* [1] */ "Undo", noIcon, "Z", noMark, plain, /* [2] */ "-", noIcon, noKey, noMark, plain, /* [3] */ "Cut", noIcon, "X", noMark, plain, /* [4] */ "Copy", noIcon, "C", noMark, plain, /* [5] */ "Paste", noIcon, "V", noMark, plain, /* [6] */ "Clear", noIcon, noKey, noMark, plain } }; resource 'MENU' (131) { 131, textMenuProc, 0x7FFFFEFF, enabled, "Keypress", { /* array: 13 elements */ /* [1] */ "Control Keys", noIcon, hierarchicalMenu, "É", plain, /* [2] */ "Punctuation", noIcon, hierarchicalMenu, "Ê", plain, /* [3] */ "Brackets", noIcon, hierarchicalMenu, "Ë", plain, /* [4] */ "a - m", noIcon, hierarchicalMenu, "Ì", plain, /* [5] */ "n - z", noIcon, hierarchicalMenu, "Í", plain, /* [6] */ "A - M", noIcon, hierarchicalMenu, "Î", plain, /* [7] */ "N - Z", noIcon, hierarchicalMenu, "Ï", plain, /* [8] */ "0 - 9", noIcon, hierarchicalMenu, "Ð", plain, /* [9] */ "-", noIcon, noKey, noMark, plain, /* [10] */ "(escape)", noIcon, noKey, noMark, plain, /* [11] */ "(space)", noIcon, noKey, noMark, plain, /* [12] */ "(delete)", noIcon, noKey, noMark, plain, /* [13] */ "(return)", noIcon, noKey, noMark, plain } }; resource 'MENU' (132) { 132, textMenuProc, 0x7FFFFFED, enabled, "Help", { /* array: 8 elements */ /* [1] */ "Options", noIcon, noKey, "O", plain, /* [2] */ "-", noIcon, noKey, noMark, plain, /* [3] */ "Help", noIcon, noKey, "?", plain, /* [4] */ "Describe Key", noIcon, noKey, "&", plain, /* [5] */ "-", noIcon, noKey, noMark, plain, /* [6] */ "Version", noIcon, noKey, "v", plain, /* [7] */ "History", noIcon, noKey, "V", plain, /* [8] */ "Version Features", noIcon, noKey, "#", plain } }; resource 'MENU' (128) { 128, textMenuProc, 0x7FFFFFFD, enabled, apple, { /* array: 2 elements */ /* [1] */ "About Slash'EMÉ", noIcon, noKey, noMark, plain, /* [2] */ "-", noIcon, noKey, noMark, plain } }; resource 'MENU' (133) { 133, textMenuProc, 0x7FFFEEF7, enabled, "Information", { /* array: 14 elements */ /* [1] */ "Inventory All", noIcon, noKey, "i", plain, /* [2] */ "Inventory Select", noIcon, noKey, "I", plain, /* [3] */ "Adjust", noIcon, noKey, "#", plain, /* [4] */ "-", noIcon, noKey, noMark, plain, /* [5] */ "Look Down", noIcon, noKey, ":", plain, /* [6] */ "Describe One", noIcon, noKey, ";", plain, /* [7] */ "Describe Many", noIcon, noKey, "/", plain, /* [8] */ "Describe Trap", noIcon, noKey, "^", plain, /* [9] */ "-", noIcon, noKey, noMark, plain, /* [10] */ "Call Monster", noIcon, noKey, "C", plain, /* [11] */ "Name Object", noIcon, noKey, "#", plain, /* [12] */ "Discoveries", noIcon, noKey, "\\", plain, /* [13] */ "-", noIcon, noKey, noMark, plain, /* [14] */ "Show Conduct", noIcon, noKey, "#", plain } }; resource 'MENU' (134) { 134, textMenuProc, 0x7FFFEDDD, enabled, "Equipment", { /* array: 17 elements */ /* [1] */ "Current", noIcon, hierarchicalMenu, "Ñ", plain, /* [2] */ "-", noIcon, noKey, noMark, plain, /* [3] */ "Wield Weapon", noIcon, noKey, "w", plain, /* [4] */ "Exchange Weapon", noIcon, noKey, "x", plain, /* [5] */ "Select Quiver", noIcon, noKey, "Q", plain, /* [6] */ "Fire Quiver", noIcon, noKey, "f", plain, /* [7] */ "Throw", noIcon, noKey, "t", plain, /* [8] */ "Apply", noIcon, noKey, "a", plain, /* [9] */ "Enhance", noIcon, noKey, "#", plain, /* [10] */ "Two Weapon Combat", noIcon, noKey, "#", plain, /* [11] */ "-", noIcon, noKey, noMark, plain, /* [12] */ "Wear Armor", noIcon, noKey, "W", plain, /* [13] */ "Take Off", noIcon, noKey, "T", plain, /* [14] */ "Ask Remove", noIcon, noKey, "A", plain, /* [15] */ "-", noIcon, noKey, noMark, plain, /* [16] */ "Put On", noIcon, noKey, "P", plain, /* [17] */ "Remove", noIcon, noKey, "R", plain } }; resource 'MENU' (135) { 135, textMenuProc, 0x7FFFBFBD, enabled, "Action", { /* array: 21 elements */ /* [1] */ "Wait", noIcon, noKey, ".", plain, /* [2] */ "-", noIcon, noKey, noMark, plain, /* [3] */ "Teleport", noIcon, "T", "\0x11", plain, /* [4] */ "Jump", noIcon, noKey, "#", plain, /* [5] */ "Monster", noIcon, noKey, "#", plain, /* [6] */ "Wipe", noIcon, noKey, "#", plain, /* [7] */ "-", noIcon, noKey, noMark, plain, /* [8] */ "Apply", noIcon, noKey, "a", plain, /* [9] */ "Pay", noIcon, noKey, "p", plain, /* [10] */ "Kick", noIcon, "D", "\0x11", plain, /* [11] */ "Chat", noIcon, noKey, "#", plain, /* [12] */ "Offer", noIcon, noKey, "#", plain, /* [13] */ "Pray", noIcon, noKey, "#", plain, /* [14] */ "Ride", noIcon, noKey, "#", plain, /* [15] */ "Turn", noIcon, noKey, "#", plain, /* [16] */ "-", noIcon, noKey, noMark, plain, /* [17] */ "Borrow", noIcon, noKey, "#", plain, /* [18] */ "Perform Technique", noIcon, noKey, "#", plain, /* [19] */ "Swap Weapons", noIcon, noKey, "x", plain, /* [20] */ "Use Two Weapons", noIcon, noKey, "#", plain, /* [21] */ "Enhance Ability", noIcon, noKey, "#", plain } }; resource 'MENU' (136) { 136, textMenuProc, 0x7FFF7DEF, enabled, "Magic", { /* array: 17 elements */ /* [1] */ "Drop Item", noIcon, noKey, "d", plain, /* [2] */ "Drop Select", noIcon, noKey, "D", plain, /* [3] */ "Pickup", noIcon, noKey, ",", plain, /* [4] */ "Toggle pickup", noIcon, noKey, "@", plain, /* [5] */ "-", noIcon, noKey, noMark, plain, /* [6] */ "Eat", noIcon, noKey, "e", plain, /* [7] */ "Read", noIcon, noKey, "r", plain, /* [8] */ "Quaff", noIcon, noKey, "q", plain, /* [9] */ "Dip", noIcon, noKey, "#", plain, /* [10] */ "-", noIcon, noKey, noMark, plain, /* [11] */ "List Spells", noIcon, noKey, "+", plain, /* [12] */ "Cast Spell", noIcon, noKey, "Z", plain, /* [13] */ "Zap", noIcon, noKey, "z", plain, /* [14] */ "Invoke", noIcon, noKey, "#", plain, /* [15] */ "Rub", noIcon, noKey, "#", plain, /* [16] */ "-", noIcon, noKey, noMark, plain, /* [17] */ "Polymorph", noIcon, noKey, "#", plain } }; resource 'MENU' (137) { 137, textMenuProc, 0x7FFFDDDF, enabled, "Bits", { /* array: 16 elements */ /* [1] */ "Search", noIcon, noKey, "s", plain, /* [2] */ "Close Door", noIcon, noKey, "c", plain, /* [3] */ "Open Door", noIcon, noKey, "o", plain, /* [4] */ "Apply", noIcon, noKey, "a", plain, /* [5] */ "Kick", noIcon, "D", "\0x11", plain, /* [6] */ "-", noIcon, noKey, noMark, plain, /* [7] */ "Untrap", noIcon, noKey, "#", plain, /* [8] */ "Force", noIcon, noKey, "#", plain, /* [9] */ "Loot", noIcon, noKey, "#", plain, /* [10] */ "-", noIcon, noKey, noMark, plain, /* [11] */ "Engrave", noIcon, noKey, "E", plain, /* [12] */ "Dip", noIcon, noKey, "#", plain, /* [13] */ "Sit", noIcon, noKey, "#", plain, /* [14] */ "-", noIcon, noKey, "#", 2, /* [15] */ "Climb Up", noIcon, noKey, "<", plain, /* [16] */ "Climb Down", noIcon, noKey, ">", plain } }; resource 'MENU' (202) { 202, textMenuProc, allEnabled, enabled, "punctuation", { /* array: 16 elements */ /* [1] */ " .", noIcon, noKey, noMark, plain, /* [2] */ " ,", noIcon, noKey, noMark, plain, /* [3] */ " ;", noIcon, noKey, noMark, plain, /* [4] */ " :", noIcon, noKey, noMark, plain, /* [5] */ " !", noIcon, noKey, noMark, plain, /* [6] */ " ?", noIcon, noKey, noMark, plain, /* [7] */ " +", noIcon, noKey, noMark, plain, /* [8] */ " -", noIcon, noKey, noMark, plain, /* [9] */ " =", noIcon, noKey, noMark, plain, /* [10] */ " #", noIcon, noKey, noMark, plain, /* [11] */ " $", noIcon, noKey, noMark, plain, /* [12] */ " @", noIcon, noKey, noMark, plain, /* [13] */ " &", noIcon, noKey, noMark, plain, /* [14] */ " *", noIcon, noKey, noMark, plain, /* [15] */ " ~", noIcon, noKey, noMark, plain, /* [16] */ " _", noIcon, noKey, noMark, plain } }; resource 'MENU' (203) { 203, textMenuProc, allEnabled, enabled, "brackets", { /* array: 16 elements */ /* [1] */ "[", noIcon, noKey, noMark, plain, /* [2] */ "]", noIcon, noKey, noMark, plain, /* [3] */ "(", noIcon, noKey, noMark, plain, /* [4] */ ")", noIcon, noKey, noMark, plain, /* [5] */ "{", noIcon, noKey, noMark, plain, /* [6] */ "}", noIcon, noKey, noMark, plain, /* [7] */ "<", noIcon, noKey, noMark, plain, /* [8] */ ">", noIcon, noKey, noMark, plain, /* [9] */ "^", noIcon, noKey, noMark, plain, /* [10] */ "`", noIcon, noKey, noMark, plain, /* [11] */ "'", noIcon, noKey, noMark, plain, /* [12] */ "\"", noIcon, noKey, noMark, plain, /* [13] */ "\\", noIcon, noKey, noMark, plain, /* [14] */ "/", noIcon, noKey, noMark, plain, /* [15] */ "|", noIcon, noKey, noMark, plain, /* [16] */ "%", noIcon, noKey, noMark, plain } }; resource 'MENU' (204) { 204, textMenuProc, allEnabled, enabled, "a - m", { /* array: 13 elements */ /* [1] */ "a", noIcon, noKey, noMark, plain, /* [2] */ "b", noIcon, noKey, noMark, plain, /* [3] */ "c", noIcon, noKey, noMark, plain, /* [4] */ "d", noIcon, noKey, noMark, plain, /* [5] */ "e", noIcon, noKey, noMark, plain, /* [6] */ "f", noIcon, noKey, noMark, plain, /* [7] */ "g", noIcon, noKey, noMark, plain, /* [8] */ "h", noIcon, noKey, noMark, plain, /* [9] */ "i", noIcon, noKey, noMark, plain, /* [10] */ "j", noIcon, noKey, noMark, plain, /* [11] */ "k", noIcon, noKey, noMark, plain, /* [12] */ "l", noIcon, noKey, noMark, plain, /* [13] */ "m", noIcon, noKey, noMark, plain } }; resource 'MENU' (205) { 205, textMenuProc, allEnabled, enabled, "n - z", { /* array: 13 elements */ /* [1] */ "n", noIcon, noKey, noMark, plain, /* [2] */ "o", noIcon, noKey, noMark, plain, /* [3] */ "p", noIcon, noKey, noMark, plain, /* [4] */ "q", noIcon, noKey, noMark, plain, /* [5] */ "r", noIcon, noKey, noMark, plain, /* [6] */ "s", noIcon, noKey, noMark, plain, /* [7] */ "t", noIcon, noKey, noMark, plain, /* [8] */ "u", noIcon, noKey, noMark, plain, /* [9] */ "v", noIcon, noKey, noMark, plain, /* [10] */ "w", noIcon, noKey, noMark, plain, /* [11] */ "x", noIcon, noKey, noMark, plain, /* [12] */ "y", noIcon, noKey, noMark, plain, /* [13] */ "z", noIcon, noKey, noMark, plain } }; resource 'MENU' (206) { 206, textMenuProc, allEnabled, enabled, "A - M", { /* array: 13 elements */ /* [1] */ "A", noIcon, noKey, noMark, plain, /* [2] */ "B", noIcon, noKey, noMark, plain, /* [3] */ "C", noIcon, noKey, noMark, plain, /* [4] */ "D", noIcon, noKey, noMark, plain, /* [5] */ "E", noIcon, noKey, noMark, plain, /* [6] */ "F", noIcon, noKey, noMark, plain, /* [7] */ "G", noIcon, noKey, noMark, plain, /* [8] */ "H", noIcon, noKey, noMark, plain, /* [9] */ "I", noIcon, noKey, noMark, plain, /* [10] */ "J", noIcon, noKey, noMark, plain, /* [11] */ "K", noIcon, noKey, noMark, plain, /* [12] */ "L", noIcon, noKey, noMark, plain, /* [13] */ "M", noIcon, noKey, noMark, plain } }; resource 'MENU' (207) { 207, textMenuProc, allEnabled, enabled, "N - Z", { /* array: 13 elements */ /* [1] */ "N", noIcon, noKey, noMark, plain, /* [2] */ "O", noIcon, noKey, noMark, plain, /* [3] */ "P", noIcon, noKey, noMark, plain, /* [4] */ "Q", noIcon, noKey, noMark, plain, /* [5] */ "R", noIcon, noKey, noMark, plain, /* [6] */ "S", noIcon, noKey, noMark, plain, /* [7] */ "T", noIcon, noKey, noMark, plain, /* [8] */ "U", noIcon, noKey, noMark, plain, /* [9] */ "V", noIcon, noKey, noMark, plain, /* [10] */ "W", noIcon, noKey, noMark, plain, /* [11] */ "X", noIcon, noKey, noMark, plain, /* [12] */ "Y", noIcon, noKey, noMark, plain, /* [13] */ "Z", noIcon, noKey, noMark, plain } }; resource 'MENU' (201) { 201, textMenuProc, 0x7FFFFEFF, enabled, "control keys", { /* array: 13 elements */ /* [1] */ "b", noIcon, "1", noMark, plain, /* [2] */ "j", noIcon, "2", noMark, plain, /* [3] */ "n", noIcon, "3", noMark, plain, /* [4] */ "h", noIcon, "4", noMark, plain, /* [5] */ "l", noIcon, "6", noMark, plain, /* [6] */ "y", noIcon, "7", noMark, plain, /* [7] */ "k", noIcon, "8", noMark, plain, /* [8] */ "u", noIcon, "9", noMark, plain, /* [9] */ "-", noIcon, noKey, noMark, plain, /* [10] */ "d", noIcon, "D", noMark, plain, /* [11] */ "p", noIcon, "P", noMark, plain, /* [12] */ "r", noIcon, "R", noMark, plain, /* [13] */ "t", noIcon, "T", noMark, plain } }; resource 'MENU' (208) { 208, textMenuProc, allEnabled, enabled, "0 - 9", { /* array: 10 elements */ /* [1] */ "0", noIcon, noKey, noMark, plain, /* [2] */ "1", noIcon, noKey, noMark, plain, /* [3] */ "2", noIcon, noKey, noMark, plain, /* [4] */ "3", noIcon, noKey, noMark, plain, /* [5] */ "4", noIcon, noKey, noMark, plain, /* [6] */ "5", noIcon, noKey, noMark, plain, /* [7] */ "6", noIcon, noKey, noMark, plain, /* [8] */ "7", noIcon, noKey, noMark, plain, /* [9] */ "8", noIcon, noKey, noMark, plain, /* [10] */ "9", noIcon, noKey, noMark, plain } }; resource 'MENU' (200) { 200, textMenuProc, 0x7FFFEEFF, enabled, "wizard", { /* array: 19 elements */ /* [1] */ "Attributes", noIcon, noKey, "x", plain, /* [2] */ "Detect Unseen", noIcon, noKey, "e", plain, /* [3] */ "Map Floor", noIcon, noKey, "f", plain, /* [4] */ "Generate Monster", noIcon, noKey, "g", plain, /* [5] */ "Identify", noIcon, noKey, "i", plain, /* [6] */ "Show Levels", noIcon, noKey, "o", plain, /* [7] */ "Level Teleport", noIcon, noKey, "v", plain, /* [8] */ "Wish", noIcon, noKey, "w", plain, /* [9] */ "-", noIcon, noKey, "c", plain, /* [10] */ "Raise Armor Class", noIcon, noKey, "c", plain, /* [11] */ "Jump Level", noIcon, noKey, "j", plain, /* [12] */ "Toggle Invulnerable", noIcon, noKey, "n", plain, /* [13] */ "-", noIcon, noKey, noMark, plain, /* [14] */ "Show Lights", noIcon, noKey, "#", plain, /* [15] */ "Show Seen", noIcon, noKey, "#", plain, /* [16] */ "Show Memory", noIcon, noKey, "#", plain, /* [17] */ "Show Timeout", noIcon, noKey, "#", plain, /* [18] */ "Show Vision", noIcon, noKey, "#", plain, /* [19] */ "Show Walls", noIcon, noKey, "#", plain } }; resource 'MENU' (209) { 209, textMenuProc, 0x7FFFFF7F, enabled, "current", { /* array: 9 elements */ /* [1] */ "Weapon", noIcon, noKey, ")", plain, /* [2] */ "Armor", noIcon, noKey, "[", plain, /* [3] */ "Rings", noIcon, noKey, "=", plain, /* [4] */ "Amulet", noIcon, noKey, "\"", plain, /* [5] */ "Tools", noIcon, noKey, "(", plain, /* [6] */ "Gold", noIcon, noKey, "$", plain, /* [7] */ "Spells", noIcon, noKey, "+", plain, /* [8] */ "-", noIcon, noKey, noMark, plain, /* [9] */ "In Use", noIcon, noKey, "*", plain } }; data 'MNU#' (128, "menubar", locked, preload) { $"0080 000A 0080 0000 0081 0000 0082 0000" /* .€...€......‚.. */ $"0083 0000 0084 0000 0085 0000 0086 0000" /* .ƒ...„...…...†.. */ $"0087 0000 0088 0000 0089 0000" /* .‡...ˆ...‰.. */ }; data 'MNU#' (129, "submenu", locked, preload) { $"00C8 000A 00C8 0000 00C9 0000 00CA 0000" /* .È...È...É...Ê.. */ $"00CB 0000 00CC 0000 00CD 0000 00CE 0000" /* .Ë...Ì...Í...Î.. */ $"00CF 0000 00D0 0000 00D1 0000" /* .Ï...Ð...Ñ.. */ }; resource 'STR ' (128, "Pref File Name") { "Slash'EM Preferences" }; resource 'dctb' (6000, "Start") { { /* array ColorSpec: 5 elements */ /* [1] */ wContentColor, 56797, 56797, 56797, /* [2] */ wFrameColor, 0, 0, 0, /* [3] */ wTextColor, 0, 0, 0, /* [4] */ wHiliteColor, 0, 0, 0, /* [5] */ wTitleBarColor, 65535, 65535, 65535 } }; data 'ictb' (6000) { $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */ $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */ $"2000 0040 0000 0000 0000 0000 0000 0000" /* ..@............ */ $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */ $"0000 0000 0000 0000 0000 0000 FFFF FFFF" /* ............ÿÿÿÿ */ $"FFFF 0000" /* ÿÿ.. */ }; resource 'actb' (5000, "About/error") { { /* array ColorSpec: 5 elements */ /* [1] */ wContentColor, 56797, 56797, 56797, /* [2] */ wFrameColor, 0, 0, 0, /* [3] */ wTextColor, 0, 0, 0, /* [4] */ wHiliteColor, 0, 0, 0, /* [5] */ wTitleBarColor, 65535, 65535, 65535 } }; resource 'actb' (5001, "Confirm") { { /* array ColorSpec: 5 elements */ /* [1] */ wContentColor, 56797, 56797, 56797, /* [2] */ wFrameColor, 0, 0, 0, /* [3] */ wTextColor, 0, 0, 0, /* [4] */ wHiliteColor, 0, 0, 0, /* [5] */ wTitleBarColor, 65535, 65535, 65535 } }; resource 'actb' (128) { { /* array ColorSpec: 5 elements */ /* [1] */ wContentColor, 56797, 56797, 56797, /* [2] */ wFrameColor, 0, 0, 0, /* [3] */ wTextColor, 0, 0, 0, /* [4] */ wHiliteColor, 0, 0, 0, /* [5] */ wTitleBarColor, 65535, 65535, 65535 } }; resource 'actb' (129) { { /* array ColorSpec: 5 elements */ /* [1] */ wContentColor, 56797, 56797, 56797, /* [2] */ wFrameColor, 0, 0, 0, /* [3] */ wTextColor, 0, 0, 0, /* [4] */ wHiliteColor, 0, 0, 0, /* [5] */ wTitleBarColor, 65535, 65535, 65535 } }; data 'ppat' (128) { $"0001 0000 001C 0000 004E 0000 0000 FFFF" /* .........N....ÿÿ */ $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */ $"8020 0000 0000 0040 0040 0000 0000 0000" /* € .....@.@...... */ $"0000 0048 0000 0048 0000 0000 0004 0001" /* ...H...H........ */ $"0004 0000 0000 0000 084E 0000 0000 2233" /* .........N...."3 */ $"3222 2222 2222 2322 1112 2222 3B78 B222" /* 2"""""#".."";x²" */ $"2222 2222 2212 2333 2B43 3BB3 2222 2233" /* """"".#3+C;³"""3 */ $"3222 2222 2222 2322 2212 12BC 7DC3 2222" /* 2"""""#""..¼}Ã"" */ $"2222 2222 2122 2333 2543 235B 3222 2233" /* """"!"#3%C#[2""3 */ $"2222 2222 2222 2222 2223 5797 5322 2222" /* """""""""#W—S""" */ $"2222 2222 2222 2343 3B43 32BB 4222 2224" /* """"""#C;C2»B""$ */ $"3222 2222 3222 2334 B67D 9DCB 2223 2222" /* 2"""2"#4¶}Ë"#"" */ $"2322 2222 2222 2233 BB43 3225 6322 2223" /* #""""""3»C2%c""# */ $"B333 BB6C C66C 77D9 AAFD B223 5323 3322" /* ³3»lÆlwÙªý²#S#3" */ $"2222 2222 2222 2222 B443 3323 BCB3 434B" /* """"""""´C3#¼³CK */ $"7999 99AA AAAA FFAA 98C5 3322 2633 3322" /* y™™ªªªÿª˜Å3"&33" */ $"2222 2222 2222 2323 B443 3332 246C 7CC8" /* """"""##´C32$l|È */ $"DC65 55BB BB6C 655B B456 B332 2453 3332" /* ÜeU»»le[´V³2$S32 */ $"2123 3212 23BB 542B B443 3233 3225 C66C" /* !#2.#»T+´C232%Æl */ $"BB43 2222 114B 444B B4B6 B333 335B 3332" /* »C"".KDK´¶³33[32 */ $"2223 BBBB BB42 B42B B433 3333 3333 B322" /* "#»»»B´+´33333³" */ $"5B43 3222 21BB BBBB 4445 B433 44B5 3322" /* [C2"!»»»DE´3Dµ3" */ $"2B65 B322 2222 2B3B 4433 4433 4BBB 3333" /* +e³"""+;D3D3K»33 */ $"BB33 3322 215B BBB4 4433 B444 443B B323" /* »33"![»´D3´DD;³# */ $"6632 2222 2222 2425 4434 3444 BB43 3332" /* f2""""$%D44D»C32 */ $"4533 3322 2254 BBB4 4443 BB44 4433 5B5C" /* E33""T»´DC»DD3[\ */ $"5332 2222 2222 2225 4443 3444 B433 3222" /* S2"""""%DC4D´32" */ $"2533 3332 235B BBB4 4443 3B44 4B32 5C6B" /* %332#[»´DC;DK2\k */ $"3322 2222 2222 2226 BB43 43B4 4433 3222" /* 3""""""&»CC´D32" */ $"2B43 3322 2BB4 BBBB 4B33 2B44 4432 B5B4" /* +C3"+´»»K3+DD2µ´ */ $"3222 2222 2242 2235 B444 3334 4333 3222" /* 2""""B"5´D34C32" */ $"2344 3322 25B4 BB44 4443 3B43 3432 3644" /* #D3"%´»DDC;C426D */ $"3222 2222 2232 225B 4333 3433 3333 3322" /* 2""""2"[C343333" */ $"2243 3222 264B BB44 4433 2434 4432 26B4" /* "C2"&K»DD3$4D2&´ */ $"3222 2222 2242 22B4 4333 343B 3333 3322" /* 2""""B"´C34;333" */ $"2233 3222 B5BB BBB4 4433 23B5 4332 2643" /* "32"µ»»´D3#µC2&C */ $"3222 2222 2243 22BB 4433 4333 3333 3432" /* 2""""C"»D3C33342 */ $"2222 3222 6BBB BBB4 4433 2B56 B432 3633" /* ""2"k»»´D3+V´263 */ $"3322 2222 2234 22B4 4333 3433 3333 3332" /* 3""""4"´C3433332 */ $"2222 3325 6BBB B444 4333 3B56 65B2 4533" /* ""3%k»´DC3;Ve²E3 */ $"3322 2222 112B 2244 3333 3333 3333 2322" /* 3""".+"D333333#" */ $"2222 333C 5BBB B443 3333 4B55 B555 BB33" /* ""3<[»´C33KUµU»3 */ $"3222 2222 111B 3234 3333 3332 2333 2222" /* 2"""..243332#3"" */ $"2122 3255 BBBB BB33 223B B55B BBBB CC33" /* !"2U»»»3";µ[»»Ì3 */ $"2222 2222 111B 4334 3333 3222 2332 2222" /* """"..C4332"#2"" */ $"2222 335B BBBB BB43 234B 555B BBB4 576B" /* ""3[»»»C#KU[»´Wk */ $"3222 2222 1113 533B 3323 3222 3232 2222" /* 2"""..S;3#2"22"" */ $"2220 3655 5BBB BBB3 3BB5 5BBB BBB4 BC66" /* " 6U[»»³;µ[»»´¼f */ $"B432 2222 1112 C334 3233 3222 3232 2222" /* ´2""..Ã4232"22"" */ $"222B CC55 BBBB B433 45B5 5BBB BB43 B6BB" /* "+ÌU»»´3Eµ[»»C¶» */ $"C5B4 2221 1112 CB24 3323 3223 2222 2222" /* Å´"!..Ë$3#2#"""" */ $"2B53 BC55 BBBB B334 5B5B BBBB BB33 65B5" /* +S¼U»»³4[[»»»3eµ */ $"5667 76BB BB68 DB34 4322 3222 2222 222B" /* Vgv»»hÛ4C"2""""+ */ $"6533 3C55 BBB4 B4B5 BBBB BBBB B443 65BB" /* e3 #include #include #include #include #include #endif #include "dlb.h" /* * We should get the default dirID and volRefNum (from name) from prefs and * the situation at startup... For now, this will have to do. */ /* The HandleFiles are resources built into the application which are treated as read-only files: if we fail to open a file we look for a resource */ #define FIRST_HF 32000 /* file ID of first HandleFile */ #define MAX_HF 6 /* Max # of open HandleFiles */ #define APP_NAME_RES_ID (-16396) typedef struct handlefile { long type; /* Resource type */ short id; /* Resource id */ long mark; /* Current position */ long size; /* total size */ Handle data; /* The resource, purgeable */ } HandleFile; static HandleFile *FDECL(IsHandleFile,(int)); static int FDECL(OpenHandleFile,(const unsigned char *, long)); static int FDECL(CloseHandleFile,(int)); static int FDECL(ReadHandleFile,(int, void *, unsigned)); static long FDECL(SetHandleFilePos,(int, short, long)); HandleFile theHandleFiles [MAX_HF]; MacDirs theDirs; /* also referenced in macwin.c */ static HandleFile * IsHandleFile(int fd) { HandleFile *hfp = NULL; if (fd >= FIRST_HF && fd < FIRST_HF+MAX_HF) { /* in valid range, check for data */ hfp = &theHandleFiles[fd-FIRST_HF]; if (!hfp->data) hfp = NULL; } return hfp; } static int OpenHandleFile (const unsigned char *name, long fileType) { int i; Handle h; Str255 s; for (i = 0; i < MAX_HF; i ++) { if (theHandleFiles[i].data == 0L) break; } if (i >= MAX_HF) return -1; h = GetNamedResource (fileType, name); if (!h) return (-1); theHandleFiles[i].data = h; theHandleFiles[i].size = GetHandleSize (h); GetResInfo (h, &theHandleFiles[i].id, (void*) &theHandleFiles[i].type, s); theHandleFiles[i].mark = 0L; return(i + FIRST_HF); } static int CloseHandleFile (int fd) { if (!IsHandleFile (fd)) { return -1; } fd -= FIRST_HF; ReleaseResource (theHandleFiles[fd].data); theHandleFiles[fd].data = 0L; return(0); } static int ReadHandleFile (int fd, void *ptr, unsigned len) { unsigned maxBytes; Handle h; if (!IsHandleFile (fd)) return -1; fd -= FIRST_HF; maxBytes = theHandleFiles[fd].size - theHandleFiles[fd].mark; if (len > maxBytes) len = maxBytes; h = theHandleFiles[fd].data; HLock(h); BlockMove (*h + theHandleFiles[fd].mark, ptr, len); HUnlock(h); theHandleFiles[fd].mark += len; return(len); } static long SetHandleFilePos (int fd, short whence, long pos) { long curpos; if (!IsHandleFile (fd)) return -1; fd -= FIRST_HF; curpos = theHandleFiles [fd].mark; switch (whence) { case SEEK_CUR : curpos += pos; break; case SEEK_END : curpos = theHandleFiles[fd].size - pos; break; default : /* set */ curpos = pos; break; } if (curpos < 0) curpos = 0; else if (curpos > theHandleFiles [fd].size) curpos = theHandleFiles [fd].size; theHandleFiles [fd].mark = curpos; return curpos; } void C2P (const char *c, unsigned char *p) { int len = strlen (c), i; if (len > 255) len = 255; for (i = len; i > 0; i--) p[i] = c[i-1]; p[0] = len; } void P2C (const unsigned char *p, char *c) { int idx = *p++; for (; idx > 0; idx--) *c++ = *p++; *c = '\0'; } static void replace_resource(Handle new_res, ResType its_type, short its_id, Str255 its_name) { Handle old_res; SetResLoad(false); old_res = Get1Resource(its_type, its_id); SetResLoad(true); if (old_res) { RemoveResource(old_res); DisposeHandle(old_res); } AddResource(new_res, its_type, its_id, its_name); } int maccreat (const char *name, long fileType){ return macopen (name, O_RDWR | O_CREAT | O_TRUNC, fileType); } int macopen (const char *name, int flags, long fileType) { short refNum; short perm; Str255 s; long creator; C2P (name, s); if (flags & O_CREAT) { if (fileType == SAVE_TYPE) creator = MAC_CREATOR; else creator = TEXT_CREATOR; if (HCreate (theDirs.dataRefNum, theDirs.dataDirID, s , creator, fileType) && (flags & O_EXCL)) { return -1; } if (fileType == SAVE_TYPE) { short resRef; HCreateResFile(theDirs.dataRefNum, theDirs.dataDirID, s); resRef = HOpenResFile(theDirs.dataRefNum, theDirs.dataDirID, s, fsRdWrPerm); if (resRef != -1) { Handle name; Str255 plnamep; C2P(plname, plnamep); name = (Handle)NewString(plnamep); if (name) replace_resource(name, 'STR ', PLAYER_NAME_RES_ID, "\pPlayer Name"); /* The application name resource. See IM VI, page 9-21. */ name = (Handle)GetString(APP_NAME_RES_ID); if (name) { DetachResource(name); replace_resource(name, 'STR ', APP_NAME_RES_ID, "\pApplication Name"); } CloseResFile(resRef); } } } /* * Here, we should check for file type, maybe a SFdialog if * we fail with default, etc. etc. Besides, we should use HOpen * and permissions. */ if ((flags & O_RDONLY) == O_RDONLY) { perm = fsRdPerm; } if ((flags & O_WRONLY) == O_WRONLY) { perm = fsWrPerm; } if ((flags & O_RDWR) == O_RDWR) { perm = fsRdWrPerm; } if (HOpen (theDirs.dataRefNum, theDirs.dataDirID, s, perm, &refNum)) { return OpenHandleFile (s, fileType); } if (flags & O_TRUNC) { if (SetEOF (refNum, 0L)) { FSClose (refNum); return -1; } } return refNum; } int macclose (int fd) { if (IsHandleFile (fd)) { CloseHandleFile (fd); } else { if (FSClose (fd)) { return -1; } FlushVol ((StringPtr) 0, theDirs . dataRefNum); } return 0; } int macread (int fd, void *ptr, unsigned len) { long amt = len; if (IsHandleFile (fd)) { return ReadHandleFile (fd, ptr, amt); } else { short err = FSRead (fd, &amt, ptr); return ((err == noErr) || (err == eofErr && len)) ? amt : -1; } } #if 0 /* this function isn't used, if you use it, uncomment prototype in macwin.h */ char * macgets (int fd, char *ptr, unsigned len) { int idx = 0; char c; while (-- len > 0) { if (macread (fd, ptr + idx, 1) <= 0) return (char *)0; c = ptr[idx++]; if (c == '\n' || c == '\r') break; } ptr [idx] = '\0'; return ptr; } #endif /* 0 */ int macwrite (int fd, void *ptr, unsigned len) { long amt = len; if (IsHandleFile (fd)) return -1; if (FSWrite(fd, &amt, ptr) == noErr) return (amt); else return (-1); } long macseek (int fd, long where, short whence) { short posMode; long curPos; if (IsHandleFile (fd)) { return SetHandleFilePos (fd, whence, where); } switch (whence) { default : posMode = fsFromStart; break; case SEEK_CUR : posMode = fsFromMark; break; case SEEK_END : posMode = fsFromLEOF; break; } if (SetFPos(fd, posMode, where) == noErr && GetFPos(fd, &curPos) == noErr) return (curPos); else return(-1); } int macunlink(const char *name) { Str255 pname; C2P(name, pname); return (HDelete(theDirs.dataRefNum, theDirs.dataDirID, pname) == noErr ? 0 : -1); } /* ---------------------------------------------------------------------- */ boolean rsrc_dlb_init(void) { return TRUE; } void rsrc_dlb_cleanup(void) { } boolean rsrc_dlb_fopen(dlb *dp, const char *name, const char *mode) { #if defined(MAC_MPW) # pragma unused(mode) #endif Str255 pname; C2P(name, pname); dp->fd = OpenHandleFile(pname, 'File'); /* automatically read-only */ return dp->fd >= 0; } int rsrc_dlb_fclose(dlb *dp) { return CloseHandleFile(dp->fd); } int rsrc_dlb_fread(char *buf, int size, int quan, dlb *dp) { int nread; if (size < 0 || quan < 0) return 0; nread = ReadHandleFile(dp->fd, buf, (unsigned)size * (unsigned)quan); return nread/size; /* # of whole pieces (== quan in normal case) */ } int rsrc_dlb_fseek(dlb *dp, long pos, int whence) { return SetHandleFilePos(dp->fd, whence, pos); } char *rsrc_dlb_fgets(char *buf, int len, dlb *dp) { HandleFile *hfp = IsHandleFile(dp->fd); char *p; int bytesLeft, n = 0; if (hfp && hfp->mark < hfp->size) { bytesLeft = hfp->size - hfp->mark; if (bytesLeft < len) len = bytesLeft; HLock(hfp->data); for (n = 0, p = *hfp->data+hfp->mark; n < len; n++, p++) { buf[n] = *p; if (*p == '\r') buf[n] = '\n'; if (buf[n] == '\n') { n++; /* we want the return in the buffer */ break; } } HUnlock(hfp->data); hfp->mark += n; if (n != 0) buf[n] = '\0'; /* null terminate result */ } return n ? buf : NULL; } int rsrc_dlb_fgetc(dlb *dp) { HandleFile *hfp = IsHandleFile(dp->fd); int ret; if (!hfp || hfp->size <= hfp->mark) return EOF; ret = *(unsigned char *)(*hfp->data + hfp->mark); hfp->mark++; return ret; } long rsrc_dlb_ftell(dlb *dp) { HandleFile *hfp = IsHandleFile(dp->fd); if (!hfp) return 0; return hfp->mark; } slashem-0.0.7E7F3/sys/mac/NHsound.r0000664000076400007640000211242010545462317014775 0ustar alialiresource 'snd ' (21727, "Tooled Horn", purgeable) { FormatOne { { /* array Synthesizers: 1 elements */ /* [1] */ sampledSynth, 160 } }, { /* array SoundCmnds: 1 elements */ /* [1] */ hasData, bufferCmd { 20 } }, { /* array DataTables: 1 elements */ /* [1] */ 14102, Rate22K, 14100, 14101, 0x0, 0x3C, $"8080 8080 8080 8080 8080 8080 8080 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"807F 7F7F 7F7F 7F7F 7F7F 7F80 8081 8283" $"8384 8585 8686 8686 8685 8584 8483 8282" $"8181 8080 7F7F 7F7F 7F7F 7F7F 7F7F 8080" $"8080 8181 8182 8282 8383 8383 8383 8282" $"8282 8282 8181 8080 7F7F 7E7D 7D7B 7A79" $"7776 7473 7170 6F6F 6E6F 6F70 7273 7678" $"7B7D 8084 8688 8B8D 8F90 9090 908F 8D8C" $"8B89 8886 8483 8180 7F7E 7E7D 7D7D 7D7D" $"7D7D 7D7D 7E7E 7F7F 8081 8182 8384 8485" $"8585 8585 8585 8585 8483 8382 8180 7F7E" $"7D7B 7977 7572 706D 6B69 6765 6565 6567" $"696C 7074 797D 8286 8A8E 9295 9798 9998" $"9796 9491 8F8C 8A88 8684 8280 7F7D 7C7C" $"7B7B 7B7B 7B7B 7B7C 7C7D 7D7E 7F80 8183" $"8384 8485 8586 8687 8888 8989 8887 8684" $"8381 7F7D 7B79 7672 6E6A 6561 5D5B 5957" $"5759 5B5E 6368 6E75 7B82 888E 9499 9C9F" $"A1A2 A1A0 9E9C 9996 938F 8C8A 8785 8381" $"7F7E 7C7B 7A7A 7A7A 7A7A 7A7A 7B7B 7C7D" $"7E80 8182 8384 8586 8788 8889 8A8B 8B8B" $"8A89 8886 8583 817E 7B78 746F 6A65 5F5A" $"5652 4F4E 4F50 5357 5B61 666D 747B 848C" $"939A A0A4 A8AA AAAA A8A5 A29E 9B97 938F" $"8C89 8683 817F 7D7C 7B7A 7A7A 7979 797A" $"7A7B 7C7D 7E80 8182 8383 8484 8586 8788" $"8989 8A8A 8A89 8887 8685 8380 7D7A 7671" $"6C67 615B 5551 4D49 4949 4B4D 5155 5B62" $"6972 7B85 8E97 A0A7 ACB0 B2B2 B1AF ABA7" $"A39E 9995 918D 8986 8380 7E7C 7B7A 7979" $"7978 7878 7979 7A7C 7D7F 8081 8282 8384" $"8586 8788 898B 8C8D 8D8D 8C8A 8988 8684" $"817E 7A75 716A 635D 5751 4B47 4341 4042" $"4448 4D54 5C65 6F7A 8691 9CA6 AEB4 B8BA" $"BAB8 B5B0 ABA6 A19B 9692 8D89 8582 7F7D" $"7B7A 7978 7777 7777 7778 7879 7B7C 7E80" $"8182 8283 8485 8788 898A 8B8C 8C8C 8B8A" $"8988 8786 8380 7D78 736D 665F 5750 4843" $"3E3A 383A 3C41 4851 5A65 6F7B 8792 9EA7" $"B0B6 BABC BCBA B7B3 ADA8 A29D 9893 8F8B" $"8784 807E 7C7A 7978 7877 7777 7777 7879" $"7A7C 7E7F 8081 8284 8586 8889 8B8D 8E8F" $"908F 8E8D 8B8A 8884 807C 7873 6D66 5F56" $"4E47 403A 3532 3133 363D 4550 5C69 7786" $"95A2 AEB8 BFC3 C5C4 C2BE B8B2 ABA5 9F99" $"948F 8B87 8481 7E7C 7A79 7877 7777 7777" $"7879 797B 7D7E 7F80 8181 8283 8485 8788" $"8A8B 8C8D 8D8D 8C8C 8B8A 8885 817D 7772" $"6B64 5B53 4C44 3E38 3330 2F31 343A 424E" $"5B6B 7B8B 9BAA B6BF C5C9 CAC8 C4BF B8B1" $"AAA3 9D97 918D 8985 8280 7E7C 7B7A 7979" $"7978 7879 797A 7B7C 7D7E 7E7F 7F80 8081" $"8283 8586 8789 8A8B 8C8C 8B8B 8B8A 8885" $"827E 7973 6C65 5C55 4C45 3E38 3330 2F31" $"343A 424E 5B6B 7C8E 9EAD B9C1 C7CA CAC8" $"C3BD B6AE A7A0 9A94 8F8B 8885 8280 7F7E" $"7D7C 7C7C 7B7B 7B7B 7C7C 7D7D 7E7E 7E7E" $"7E7E 7E7E 7F80 8183 8587 898A 8B8C 8D8D" $"8D8C 8A87 8480 7C75 6E66 5E55 4E47 403A" $"3431 3030 3236 3E48 5667 798B 9DAD BAC4" $"CACD CDCA C5BE B7AF A69F 9993 8E8A 8684" $"8280 7F7E 7D7D 7C7C 7C7C 7C7C 7C7C 7D7D" $"7E7E 7E7D 7D7D 7D7E 7E7F 8182 8486 8889" $"898A 8A8A 8A89 8886 8481 7D78 716A 635A" $"534C 443E 3A37 3636 383B 424A 5564 7485" $"96A5 B2BC C4C8 C9C7 C3BE B7AF A8A0 9A94" $"8F8B 8885 8280 7F7E 7E7D 7D7D 7D7C 7C7C" $"7C7D 7D7E 7E7E 7E7E 7E7E 7E7E 7F80 8283" $"8586 8788 898A 8B8B 8B89 8886 837F 7A74" $"6C65 5C55 4C44 3E38 3330 3031 343B 4451" $"6173 8597 A8B6 C1C8 CCCD CBC7 C0B9 B0A9" $"A09A 948E 8A86 8381 807F 7E7E 7D7D 7D7D" $"7D7E 7E7E 7F7F 8080 7F7F 7E7E 7E7E 7E7E" $"7F81 8284 8687 8888 8989 8A89 8887 8583" $"7F7A 756E 675E 574F 4840 3A35 3130 3032" $"363E 4A59 6A7E 91A3 B3C0 C8CE D0CF CBC4" $"BCB4 ABA2 9B94 8F8B 8784 8281 807F 7F7E" $"7E7E 7E7E 7E7E 7E7F 7F7F 8080 7F7F 7E7E" $"7D7D 7D7D 7E80 8283 8587 888A 8B8C 8C8B" $"8A88 8582 7D78 716A 635A 534C 443E 3833" $"302F 3032 3740 4D5D 7085 99AB BAC6 CED1" $"D2CF CAC3 BAB0 A79F 9791 8C88 8583 8180" $"807F 7F7F 7F7F 7F7F 7F7F 8080 8181 8180" $"7F7F 7E7D 7C7C 7C7C 7E7F 8183 8586 8889" $"8A8B 8C8C 8A88 8581 7D78 716A 625B 534C" $"453F 3934 3130 3032 3740 4C5D 7186 9BAD" $"BCC8 CFD3 D3D0 C9C2 B9AF A69D 9690 8B87" $"8483 8180 8080 7F7F 7F7F 7E7E 7E7F 7F7F" $"8080 807F 7F7E 7E7D 7D7D 7D7D 7E80 8183" $"8586 8788 8989 8A89 8887 8583 7F7A 736C" $"645D 554E 4640 3B37 3433 3436 3B43 4E5D" $"6F83 96A8 B7C3 CBCF D1CE C9C2 B9B0 A79F" $"9791 8C88 8583 8281 8080 7F7F 7F7E 7E7E" $"7E7E 7F7F 8080 8080 7F7E 7E7D 7D7D 7D7E" $"7F80 8283 8586 8787 8889 8A8A 8A89 8784" $"807B 746C 655C 534C 433C 3632 2F2E 2F32" $"3944 5264 788D A0B2 BFC9 CFD2 D1CD C7BE" $"B6AC A39B 948E 8A86 8482 8180 7F7E 7E7E" $"7E7E 7E7E 7E7F 7F80 8181 8180 7F7F 7E7E" $"7D7D 7D7E 7F81 8385 8789 8A8A 8B8B 8B89" $"8886 8480 7B75 6E67 5E56 4D45 3E37 312D" $"2B2C 2F34 3E4B 5B6F 859A ACBC C7CF D3D3" $"D0CA C3BA B0A7 9E97 918C 8885 8381 807F" $"7F7E 7E7E 7E7E 7E7E 7F7F 7F80 8081 8180" $"7F7F 7E7D 7D7D 7D7E 8081 8385 8788 8889" $"8A8B 8A8A 8886 8480 7A74 6C64 5D54 4C43" $"3C36 302C 2B2D 3035 3F4C 5E73 899D AFBE" $"CAD1 D4D4 D0C9 C2B8 AFA6 9D96 908B 8785" $"8382 8180 7F7F 7E7E 7E7E 7E7E 7E7F 7F80" $"8081 8180 7F7F 7E7D 7D7D 7D7E 8082 8486" $"8789 8A8B 8B8B 8B8A 8887 8480 7B74 6D64" $"5C53 4C43 3C36 312E 2D2D 2F34 3E4B 5C71" $"879C AFBF CAD2 D5D5 D1CA C2B8 AFA5 9C95" $"908B 8785 8382 8180 7F7F 7E7E 7E7E 7E7E" $"7E7E 7E7F 8080 807F 7F7E 7D7D 7D7D 7D7E" $"8081 8385 8688 898A 8A8B 8B8B 8A89 8683" $"7D77 6F67 5E56 4D45 3D37 322E 2C2C 2E33" $"3C49 5A6E 8499 ACBC C8D0 D4D5 D1CB C3BA" $"B0A7 9F97 918D 8986 8482 8180 7F7F 7E7E" $"7E7E 7E7E 7E7E 7E7F 7F7F 807F 7F7E 7D7D" $"7D7D 7E7E 8081 8385 8788 898A 8A8A 8B8B" $"8A88 8582 7E78 7168 6057 4F47 3F38 322F" $"2D2E 3036 3E4B 5C6F 8498 AAB9 C5CD D0D1" $"CEC9 C2B9 B0A8 9F98 928E 8A87 8583 8180" $"7F7E 7E7E 7D7D 7D7D 7E7E 7E7E 7F7F 8080" $"7F7F 7E7E 7D7E 7E7E 7F81 8385 8789 8B8C" $"8C8D 8C8B 8A88 8581 7D76 6F66 5D54 4B43" $"3B34 2E2B 2A2B 2F36 404F 6176 8B9F B0BE" $"C9CF D2D1 CEC8 C0B7 AFA6 9E98 928D 8A87" $"8482 807F 7E7D 7D7D 7D7D 7D7D 7D7D 7E7E" $"7F7F 7F7F 7F7E 7D7D 7D7D 7E7F 8082 8486" $"888A 8A8B 8B8C 8B8B 8987 8581 7C75 6E65" $"5D54 4B42 3932 2C29 2829 2C34 4050 6379" $"8FA3 B5C3 CCD2 D4D3 CEC7 BFB6 ADA4 9D96" $"918D 8987 8583 8180 7F7E 7D7D 7D7D 7D7D" $"7D7D 7E7E 7F7F 7F7F 7F7E 7D7D 7C7D 7D7E" $"8082 8385 8789 8A8B 8C8D 8D8D 8C8A 8783" $"7E77 6F66 5D54 4B42 3932 2C28 2626 2931" $"3C4C 6178 8EA3 B5C3 CDD3 D5D4 CFC8 BFB6" $"ADA4 9C96 918D 8987 8583 8180 7F7E 7D7D" $"7D7D 7D7D 7D7D 7E7E 7E7F 7F7F 7E7D 7C7C" $"7C7C 7D7E 7F80 8284 8688 8A8B 8C8D 8D8D" $"8B89 8683 7F7A 736A 6259 5048 3F38 322E" $"2A29 2A2F 3846 586E 859A ADBD C8D0 D3D3" $"D0C9 C2B9 B0A7 A099 938F 8B89 8784 8281" $"7F7E 7D7D 7D7C 7C7C 7C7C 7D7D 7E7E 7E7F" $"7E7E 7D7D 7D7D 7D7E 8081 8284 8688 8A8B" $"8B8C 8C8C 8C8A 8884 807B 756D 665D 544B" $"433C 3631 2E2D 2E31 3944 5366 7B8F A2B3" $"C0C9 CFD0 CFCB C4BB B4AC A39D 9792 8E8B" $"8886 8482 807E 7D7D 7C7C 7C7C 7C7C 7C7C" $"7C7C 7D7D 7D7D 7D7C 7C7C 7D7F 8082 8486" $"8889 8B8C 8C8C 8B8B 8B8A 8784 817C 766F" $"675E 564E 453E 3631 2D2B 2C2F 3641 5064" $"798E A2B3 C0CA D0D1 D0CC C5BC B5AC A49E" $"9893 8F8C 8886 8481 7F7E 7D7C 7C7B 7B7B" $"7B7B 7B7C 7C7C 7D7D 7D7D 7D7C 7C7D 7D7E" $"8082 8486 8788 8A8B 8C8C 8C8C 8B8A 8784" $"817C 7770 685F 564D 443B 352F 2B2A 2A2D" $"3540 5065 7A8F A3B4 C1CB D0D2 D1CC C5BE" $"B5AD A59F 9994 908C 8986 8381 7F7E 7D7C" $"7B7B 7B7B 7B7B 7B7B 7C7C 7C7D 7D7C 7C7C" $"7C7C 7D7E 8081 8385 8789 8A8C 8C8D 8D8D" $"8C8B 8986 837E 7871 6A61 574E 453C 352F" $"2A28 272A 313C 4C61 778D A1B3 C1CB D1D3" $"D2CD C6BF B6AE A6A0 9A94 908D 8A87 8481" $"7F7E 7C7C 7B7B 7B7B 7B7B 7C7C 7C7C 7D7D" $"7D7C 7C7B 7B7B 7C7D 7E80 8284 8689 8B8C" $"8D8E 8D8D 8C8B 8885 827F 7A73 6B62 5950" $"483F 3831 2D2A 292B 303A 495C 7187 9BAD" $"BCC8 CED1 D1CE C8C1 B8AF A8A1 9B96 928E" $"8B88 8683 817F 7E7D 7C7C 7C7C 7B7B 7B7B" $"7B7B 7B7C 7C7C 7B7B 7B7B 7B7D 7E80 8183" $"8587 898A 8C8D 8E8E 8E8D 8C89 8682 7E77" $"7068 5F56 4D44 3B34 2F2B 2928 2B32 3E50" $"657B 91A5 B6C3 CCD2 D3D1 CCC5 BCB5 ACA5" $"9E99 9591 8D8A 8784 817F 7D7C 7B7B 7A7A" $"7A7A 7A7A 7A7B 7B7C 7C7C 7C7C 7B7B 7B7C" $"7E7F 8182 8486 888A 8C8E 8E8D 8D8D 8C89" $"8683 7E79 726A 6159 5048 413B 3631 2E2D" $"2E32 3C4A 5C71 879B ADBB C6CD D0D0 CDC7" $"C0B7 B0A8 A29C 9793 8F8B 8885 8280 7E7D" $"7C7B 7A7A 7A79 7979 7979 7A7A 7B7B 7B7B" $"7B7C 7C7D 7F80 8284 8688 898B 8C8D 8D8D" $"8D8D 8B89 8783 7F7A 736B 635A 5047 3E37" $"312C 2827 2A30 3B4A 5E74 8A9E B0BE C8CF" $"D2D1 CEC8 C1B9 B0A9 A29C 9793 8F8B 8785" $"817F 7D7C 7B7A 7A7A 7A7A 7A7A 7979 7979" $"7979 7A79 797A 7B7C 7E81 8385 8789 8A8B" $"8C8C 8C8B 8B8A 8988 8582 7F7A 746D 665D" $"554C 443C 3731 2D2B 2B2E 3644 566B 8196" $"A9B9 C5CD D1D2 CFCA C3BC B3AB A59F 9995" $"918D 8A86 8481 7E7D 7B7A 7979 7979 7979" $"7979 7979 7A7A 7A7A 7A7A 7B7C 7D7F 8183" $"8587 898B 8D8E 8E8D 8D8C 8B89 8784 817D" $"766E 675E 554C 433B 352F 2B28 272A 3240" $"5369 8096 AABB C8D0 D4D4 D1CC C5BD B4AC" $"A59E 9995 918D 8986 8380 7E7D 7B7A 7A7A" $"7A7A 7A7A 7A7A 7A7A 7A7A 7A7A 7979 7A7B" $"7C7E 8082 8485 8788 898B 8C8D 8E8D 8D8D" $"8B88 8581 7C75 6C64 5B52 483F 3831 2B27" $"2527 2C37 475C 748B A1B3 C2CC D2D5 D3CF" $"C8C1 B8AF A8A2 9C97 938F 8B88 8482 807E" $"7C7B 7A79 7979 7979 7979 797A 7A7B 7B7A" $"7A7A 7A7A 7B7D 7F81 8384 8688 8A8C 8D8E" $"8E8E 8D8C 8B88 8582 7D77 7067 5E55 4D44" $"3C35 2F2A 2626 2A33 4155 6C83 99AC BCC8" $"D0D4 D4D1 CBC4 BCB3 ACA5 9F99 9490 8C88" $"8582 7F7D 7C7B 7A7A 7979 7979 7878 7878" $"7979 7A79 7979 797A 7B7C 7E81 8385 8788" $"8A8C 8D8E 8E8E 8E8D 8C89 8683 7E79 726A" $"6158 4E45 3C34 2E28 2423 262F 3D51 6980" $"97AB BBC8 D0D4 D5D2 CCC5 BDB4 ACA5 9E99" $"9490 8C89 8582 7F7D 7B7A 7979 7979 7979" $"7979 797A 7A7B 7B7B 7B7A 7A7A 7B7C 7D7F" $"8183 8588 8A8C 8D8E 8E8F 8E8D 8C8A 8682" $"7E78 716A 6158 4F47 3F38 322C 2827 282F" $"3B4C 6279 90A4 B6C4 CED3 D4D3 CEC7 BEB7" $"AEA7 A19B 9692 8E8A 8683 807E 7C7B 7A79" $"7979 7878 7878 7878 7979 7A7A 7A79 7A7A" $"7B7C 7E80 8284 8687 898B 8D8D 8E8E 8E8D" $"8D8B 8885 817B 746C 635A 5149 4039 322C" $"2826 272D 3849 5E75 8CA1 B3C2 CDD3 D4D3" $"CFC8 C1B8 B0A8 A19C 9792 8E8B 8783 817E" $"7C7B 7A79 7979 7A7A 7979 7979 7A7A 7A7A" $"7979 7879 7A7B 7C7E 8082 8487 898B 8C8D" $"8E8E 8D8D 8C8B 8885 827D 7871 6A61 5950" $"473E 3730 2A25 2325 2E3D 516A 839A AEBF" $"CAD2 D6D5 D2CB C4BB B3AB A49E 9894 908D" $"8985 827F 7D7B 7A79 7979 7979 7979 7979" $"7A7A 7B7B 7B7A 7A7A 7A7C 7D7F 8082 8485" $"8789 8A8B 8C8D 8E8E 8E8D 8A87 847F 7972" $"6B61 584F 453C 342D 2824 2326 2E3C 5068" $"8097 ABBC C9D1 D5D5 D2CC C5BD B4AC A59F" $"9994 908C 8985 827F 7D7C 7A7A 7979 797A" $"7A79 7979 797A 7A7A 7A79 7979 7A7B 7C7E" $"8082 8485 8789 8B8C 8D8D 8E8E 8E8D 8A87" $"8580 7A73 6C62 5950 473E 372F 2A26 2427" $"2E3B 4E64 7C93 A7B8 C6CF D4D5 D2CD C6BF" $"B6AD A6A0 9A95 918D 8986 8380 7D7B 7A79" $"7979 7979 7979 7979 7979 7A7A 7A79 7979" $"797A 7C7E 8082 8385 8789 8C8D 8E8F 908F" $"8F8E 8C89 8581 7C75 6D64 5B52 4940 3831" $"2B26 2324 2A35 475C 738C A2B4 C3CE D3D5" $"D4CF C8C0 B7AF A7A1 9B96 928E 8A87 8481" $"7E7C 7B7A 7979 7A7A 7A7A 7A7A 7A7A 7B7B" $"7B7A 7A79 797A 7B7C 7E7F 8184 8689 8C8D" $"8E8F 8F8E 8E8D 8C89 8682 7D77 7067 5F56" $"4D44 3C34 2E28 2322 262F 3F55 6E86 9EB2" $"C2CD D4D7 D6D1 CAC2 B9B1 A8A1 9C96 928E" $"8B87 8480 7E7C 7A79 7878 7979 797A 7A7A" $"7A7A 7A7A 7A7A 7A79 797A 7B7C 7E80 8284" $"8688 8A8C 8E8E 8F8F 8F8E 8D8B 8884 7F7A" $"736B 625A 5148 3F37 3029 2422 252B 394C" $"637C 94A9 BBC9 D1D6 D7D4 CEC7 BEB5 ADA5" $"9F99 9591 8D89 8582 7F7D 7B79 7878 7878" $"7979 7979 7979 797A 7A7A 7A79 7979 7A7B" $"7D7F 8184 8688 8B8D 8E8F 8F90 9090 8F8C" $"8986 817C 756D 645B 5249 4039 312A 2422" $"2328 3446 5C75 8EA4 B6C5 CFD5 D6D5 D0C9" $"C0B7 AFA7 A19B 9691 8D8A 8683 807D 7B7A" $"7978 7979 797A 7A7A 7A7A 7A7A 7B7A 7A79" $"7979 7A7B 7D7F 8183 8587 898B 8C8C 8D8E" $"8E8E 8D8C 8986 827D 7770 685F 564D 443B" $"342E 2824 2226 3142 5871 8AA0 B3C3 CED4" $"D6D5 D1CA C2B9 B0A9 A29C 9792 8E8B 8783" $"817E 7C7A 7978 7878 7878 7979 7979 7A7A" $"7B7B 7A7A 7A7A 7B7C 7D7F 8082 8587 898B" $"8D8F 9090 9090 8F8D 8A87 837E 7770 665C" $"5349 4038 3027 1F1B 1B20 2D41 5A74 8EA5" $"B9C8 D2D8 D9D6 D1CA C1B8 AFA7 A19B 9591" $"8D89 8582 7F7D 7B79 7878 7879 797A 7A7B" $"7B7B 7B7B 7B7B 7A79 7878 797A 7C7E 8082" $"8486 898B 8D8E 8E8E 8D8D 8C8B 8986 827D" $"7871 6860 574E 453E 362F 2722 2123 2C3C" $"526C 859D B1C1 CDD4 D7D6 D1CA C3BA B1A9" $"A29C 9793 8F8B 8884 817F 7D7B 7A7A 7A7A" $"7A7A 7A7A 7A7A 7B7B 7B7B 7A79 7878 797A" $"7B7D 7F81 8385 8789 8B8C 8D8E 8F8F 8F8E" $"8C89 8580 7B74 6C63 5A52 4940 3830 2721" $"1F20 2736 4B64 7F98 AEBF CCD4 D8D7 D4CD" $"C5BC B3AA A39C 9793 8F8B 8885 817F 7D7B" $"7A79 797A 7A7A 7A7A 7A7A 7B7B 7B7B 7A79" $"7979 797A 7B7D 7F81 8385 888A 8B8D 8E8F" $"9090 908F 8D8A 8681 7C75 6D64 5B52 483F" $"372E 251E 1B1B 2231 4761 7D96 ADC0 CDD5" $"D9D9 D5CF C7BE B5AC A49E 9893 8F8C 8884" $"827F 7D7B 7A79 7979 797A 7A7A 7B7B 7B7B" $"7B7B 7B7A 7978 7879 7A7C 7E80 8285 878A" $"8C8D 8F90 9191 908F 8D89 8581 7B74 6D64" $"5B52 4940 372F 2822 1E1D 2431 4761 7B96" $"ACBE CCD4 D9D9 D5CE C7BE B5AC A49E 9894" $"908C 8885 827F 7D7B 7A79 7979 797A 7A7A" $"7B7B 7B7C 7C7C 7B7A 7979 7979 7A7C 7E80" $"8284 878A 8C8D 8E8F 8F8F 8F8D 8C89 8682" $"7D76 6E66 5C53 4A41 382F 2721 1B1A 202E" $"445E 7A94 ABBE CBD5 D9D9 D6CF C8BE B5AC" $"A49D 9893 8F8B 8884 817E 7C7A 7978 7879" $"797A 7A7B 7B7B 7C7C 7C7C 7C7A 7979 7979" $"7B7C 7E80 8284 8688 8B8D 8E8F 8F90 908F" $"8D8B 8884 7E77 7066 5C53 4940 382F 261F" $"1A19 1F2C 415B 7792 AABD CCD5 DADB D7D1" $"C9BF B6AD A49D 9893 8F8C 8885 827F 7D7B" $"7A79 7979 7A7A 7B7B 7B7B 7B7C 7C7C 7B7A" $"7979 7878 797B 7C7E 8183 8587 8A8C 8E8F" $"908F 8F8F 8E8C 8984 7F79 7269 6057 4E45" $"3D34 2C24 1E1A 1C26 3852 6D89 A2B7 C7D3" $"D9DB D8D3 CBC2 B8AF A6A0 9A95 918D 8986" $"8380 7E7C 7A79 7979 797A 7B7B 7B7B 7B7C" $"7C7C 7C7B 7A79 7879 797B 7D7F 8284 8687" $"898B 8D8E 8F8F 9090 8F8D 8A86 817B 736B" $"6259 5046 3D35 2B22 1C17 1922 344E 6B87" $"A1B7 C8D3 DADC DAD4 CCC3 B9B0 A8A0 9A95" $"918D 8986 8280 7D7B 7978 7878 797A 7A7B" $"7B7C 7C7C 7C7C 7C7B 7A79 7979 7A7B 7D7F" $"8183 8588 8A8D 9092 9394 9392 918E 8A85" $"8079 7269 5F56 4C42 3931 2820 1916 1823" $"3650 6C88 A2B7 C8D4 DBDD DAD5 CDC4 BAB1" $"A8A1 9A95 918D 8986 837F 7D7B 7A79 7979" $"7A7B 7C7C 7C7C 7C7C 7C7C 7B7A 7978 7777" $"787A 7C7F 8184 8789 8C8E 9091 9191 908F" $"8D8B 8884 8079 7269 6057 4F46 3D35 2C24" $"1D19 1A22 324B 6783 9EB4 C6D2 D9DC DAD4" $"CDC4 BAB1 A8A1 9A95 918E 8A86 8481 7E7C" $"7A79 7979 797A 7B7C 7C7C 7D7D 7D7D 7C7B" $"7978 7878 797A 7C7F 8183 8588 8A8C 8D8F" $"9090 9190 8F8C 8985 817B 746C 6259 5047" $"3E37 2E25 1E19 181F 2F48 6481 9CB2 C4D1" $"D9DC DBD6 CEC5 BCB2 A9A2 9B96 928E 8A86" $"8480 7E7C 7A79 7979 7A7A 7B7B 7C7C 7C7C" $"7D7D 7C7B 7A7A 7979 797A 7B7D 8082 8487" $"8A8C 8E8F 9090 908F 8E8C 8A87 827D 766D" $"655C 534A 4139 3127 1E17 1419 2941 5E7C" $"98B0 C3D2 DADD DCD7 D0C7 BDB4 ABA3 9C97" $"938F 8B88 8481 7E7C 7A79 7878 7979 7A7B" $"7B7C 7C7C 7D7D 7D7C 7B7A 7979 797A 7C7E" $"8082 8486 888A 8C8D 8E8F 8F8F 8F8D 8B88" $"847F 7870 675D 544B 4239 3027 1E17 151A" $"283F 5B79 95AD C0CF D8DC DCD8 D1C8 BEB4" $"ABA3 9D97 938F 8C88 8582 7F7D 7B7A 7979" $"797A 7A7B 7B7B 7C7C 7C7C 7C7C 7B7A 7979" $"797A 7C7E 8082 8487 8A8C 8E8F 8F8F 8F8F" $"8F8E 8C89 8580 7971 685E 554B 4239 2F25" $"1C14 1116 243C 5977 94AD C1D0 DADE DEDA" $"D3CA C0B6 ADA5 9E98 938F 8B88 8481 7E7C" $"7A79 7878 7979 7A7B 7B7C 7C7C 7C7C 7C7C" $"7B7A 7978 7879 7B7D 8082 8487 8A8C 8E8F" $"9091 9292 918F 8D89 8580 7970 685E 554C" $"433A 3026 1C14 1013 2037 5473 91AB C0CF" $"D9DE DEDA D3CA C0B6 ADA5 9E98 938F 8C88" $"8582 7F7C 7A79 7878 797A 7B7B 7C7C 7C7C" $"7C7C 7C7C 7B79 7878 7879 7B7D 7E80 8386" $"898C 8F91 9293 9392 9290 8D8A 8680 7971" $"675D 5349 4036 2C22 1710 0D13 233C 5A79" $"96AF C3D2 DADE DDD9 D2C8 BEB4 ABA3 9C97" $"928E 8B87 8581 7F7D 7B79 7979 797A 7B7C" $"7C7D 7D7D 7D7D 7D7D 7C7A 7978 7878 7A7B" $"7D80 8284 878B 8D8F 9091 9192 918F 8D8A" $"8680 7971 685F 564C 433A 3026 1C14 0F12" $"1F36 5373 91AA BFD0 DADF DFDB D4CA C0B7" $"AEA5 9E98 938F 8C89 8582 7F7D 7B7A 7979" $"797A 7A7B 7B7C 7C7C 7C7C 7C7C 7B7A 7878" $"7879 7A7C 7D80 8285 888B 8D8F 9091 9293" $"9391 8F8C 8882 7C75 6C63 5A50 473E 352C" $"2219 1110 192B 4665 84A0 B7C9 D5DC DEDC" $"D6CE C4BA B1A9 A19B 9692 8E8A 8783 807D" $"7B7A 7979 7979 7A7B 7C7C 7C7D 7D7D 7D7C" $"7C7A 7978 7778 797B 7D80 8385 888C 8E8F" $"9091 9292 9291 8E8B 8783 7C75 6C63 5A52" $"4941 382F 251C 1514 1A2A 4361 7F9B B2C5" $"D2DA DDDB D6CF C5BB B2A9 A29C 9692 8E8B" $"8784 817E 7C7A 7978 7979 7A7B 7B7C 7C7C" $"7C7D 7D7D 7C7B 7A79 7878 797B 7C7E 8083" $"868A 8D8F 9192 9394 9493 918E 8A85 7F78" $"6F65 5C52 483F 362D 231A 1411 1726 3E5C" $"7A97 AFC2 D1D9 DDDC D8D1 C8BE B5AC A49D" $"9894 908C 8985 827F 7C7A 7978 7879 7A7B" $"7B7C 7C7C 7B7B 7B7B 7B7A 7978 7878 797B" $"7D80 8385 888A 8C8E 9091 9293 9392 908D" $"8985 8079 7067 5E55 4B41 382F 261D 1613" $"1725 3B57 7592 AABE CDD7 DBDB D8D1 C9BF" $"B6AD A59F 9994 908D 8986 837F 7D7B 7978" $"7878 797A 7B7B 7C7C 7C7C 7C7C 7C7B 7A7A" $"797A 7B7C 7E7F 8183 8588 8B8D 8E8F 9091" $"9292 918E 8A86 8079 7167 5E54 4B41 382E" $"2419 120F 1524 3C59 7794 ADC1 D0D9 DDDC" $"D8D1 C8BE B5AC A49E 9894 908C 8885 827F" $"7D7B 7A79 7979 7A7B 7C7C 7D7D 7D7D 7D7D" $"7C7B 7A78 7878 787A 7C7E 8082 8487 8B8E" $"9092 9293 9393 918E 8A86 817A 7168 5F57" $"4E45 3C34 2A1F 1610 111C 314D 6C8B A6BB" $"CCD8 DDDE DBD4 CCC2 B9B0 A7A1 9B96 928E" $"8A87 8380 7D7B 7978 7878 7979 7A7B 7B7C" $"7C7C 7D7D 7D7C 7A79 7878 797A 7C7E 8083" $"8587 8A8C 8E90 9192 9393 9290 8D89 847D" $"766D 655C 5249 4038 2F25 1C16 141B 2A42" $"5F7D 98B0 C3D0 D9DC DBD6 CFC6 BDB3 ABA3" $"9D98 948F 8C88 8581 7F7D 7B7A 7979 797A" $"7A7B 7B7B 7B7B 7B7C 7C7C 7B7A 7979 797A" $"7B7D 7F81 8386 898D 8F90 9293 9494 9290" $"8D8A 857F 7870 675E 554C 433A 3026 1C14" $"1014 223A 5776 93AC C0CF D9DD DDD9 D2C9" $"BFB6 ADA5 9E99 9591 8D89 8582 7F7C 7A79" $"7878 7879 7A7A 7A7B 7B7A 7A7B 7B7B 7B7A" $"7979 7A7B 7D7F 8082 8486 888B 8D8F 9192" $"9393 9290 8D8A 8580 7972 695F 564D 443B" $"3229 2018 1517 2338 5370 8CA4 B9C9 D4D9" $"DAD7 D2CA C1B8 AFA7 A19B 9692 8E8A 8783" $"807D 7B79 7878 7878 797A 7A7A 7A7A 7A7A" $"7B7B 7A79 7978 797A 7B7E 8082 8487 8A8D" $"8F91 9293 9393 9290 8E8B 8782 7B74 6B62" $"584E 453B 3227 1D13 0E11 1D34 506F 8DA7" $"BCCC D6DB DCD9 D2CB C1B8 AFA7 A09A 9591" $"8E8A 8683 7F7D 7A78 7777 7879 7A7B 7B7C" $"7C7C 7C7C 7C7B 7B7A 7878 7878 7A7C 7E80" $"8386 898C 8E90 9293 9393 9290 8E8B 8781" $"7B74 6B62 5950 473E 342A 2017 1111 1B2E" $"4A69 87A3 B9CA D6DC DDDB D5CD C4BA B1A8" $"A29C 9793 8F8B 8784 817E 7C7A 7978 7879" $"797A 7B7B 7B7B 7B7B 7C7B 7B7A 7978 7879" $"7A7C 7E80 8386 888B 8E90 9191 9292 9291" $"8F8C 8984 7D76 6F66 5C53 4940 372C 2015" $"0D0B 1429 4564 839F B6C9 D6DC DEDC D6CF" $"C6BC B3AA A39D 9793 8F8B 8884 807E 7B79" $"7878 7879 7A7B 7B7C 7C7C 7C7C 7C7C 7B7A" $"7877 7778 797A 7C7E 8083 868A 8E90 9192" $"9393 9391 8F8D 8A86 8079 7068 5F55 4C43" $"392F 2418 0F0B 1021 3B5A 7A97 B1C4 D3DB" $"DEDD D8D1 C7BE B5AC A49E 9894 908C 8885" $"817F 7C7A 7978 7879 797A 7B7B 7C7C 7C7C" $"7C7C 7C7A 7978 7878 7A7B 7D7F 8183 8688" $"8A8D 8F90 9191 9191 8F8D 8A86 827B 746C" $"635A 5148 3F35 2B1F 150F 101B 324F 6E8C" $"A6BB CCD6 DBDC D9D2 CAC1 B8AF A7A0 9A96" $"928E 8A86 827F 7C7A 7978 7778 797A 7B7B" $"7B7B 7B7B 7B7C 7B7A 7978 7878 7879 7B7E" $"8083 8688 8B8D 8F91 9293 9393 918E 8B87" $"827C 756D 645B 5249 4036 2C22 1811 101A" $"2E49 6887 A2B8 C9D4 DBDC DAD4 CCC3 BAB1" $"A8A2 9C96 928E 8B87 8380 7D7B 7978 7878" $"797A 7B7B 7B7B 7B7B 7B7B 7B7A 7978 7878" $"797B 7D7F 8183 8688 8B8E 9091 9293 9392" $"918F 8C88 847D 766D 645B 5148 3E34 291D" $"120B 0B16 2C49 6989 A4BB CCD8 DEDF DCD5" $"CEC4 BBB2 AAA2 9C96 928E 8A86 837F 7D7B" $"7977 7778 7879 7A7B 7C7C 7C7C 7C7C 7C7B" $"7978 7777 787A 7C7E 8082 8587 898C 8F91" $"9294 9492 918F 8B88 837E 776F 665D 5349" $"3F35 2A1E 130B 0B15 2A47 6787 A2B9 CBD7" $"DDDE DBD6 CDC4 BAB1 A9A2 9C97 928E 8A87" $"8381 7E7B 7978 7878 797A 7B7C 7C7C 7C7C" $"7C7C 7B7A 7978 7777 7779 7B7D 7F81 8386" $"888B 8E90 9294 9494 9492 8F8B 8681 7A71" $"685E 544B 4136 2A1D 1107 050F 2442 6484" $"A1B9 CBD7 DEDF DCD6 CFC5 BBB2 AAA2 9C97" $"928E 8B87 8481 7E7B 7978 7878 797A 7B7C" $"7D7D 7D7D 7C7C 7B7B 7978 7777 7778 7A7C" $"7E80 8386 898D 8F91 9394 9494 9391 8E8A" $"8580 7972 6960 574D 443A 3023 170C 070D" $"1F39 5A7A 98B2 C5D4 DCDF DED8 D1C7 BEB4" $"ABA3 9D97 938F 8B88 8582 7F7C 7A79 7878" $"7879 7A7B 7C7C 7C7C 7C7C 7C7B 7A79 7777" $"7778 797B 7D7F 8285 888C 8F91 9394 9494" $"9491 8E8A 8681 7A72 6A61 584F 463D 3329" $"1D12 0C0E 1B33 5171 90AA BFCF D9DD DDDA" $"D3CA C0B7 AEA6 9F99 9591 8D89 8683 7F7D" $"7B79 7878 7979 7A7B 7B7C 7C7C 7C7B 7B7B" $"7A79 7777 7777 797B 7D7F 8285 888C 8E90" $"9294 9595 9492 8F8B 8782 7D76 6D64 5B53" $"4A42 3930 2419 110F 1629 4464 849F B6C9" $"D5DB DDDB D4CD C4BA B1A8 A19B 9692 8E8A" $"8784 817E 7B79 7878 7879 7A7A 7B7C 7C7C" $"7C7C 7C7B 7B7A 7978 7879 7A7C 7E80 8284" $"868A 8D8F 9193 9495 9493 918D 8984 7E77" $"6F67 5E55 4C42 392E 2318 0F0C 1225 4060" $"809C B4C7 D4DB DEDC D7D0 C7BD B4AB A49D" $"9893 8F8B 8784 817D 7B79 7878 7879 7A7B" $"7C7C 7C7C 7C7C 7B7A 7978 7777 7778 7A7C" $"7E81 8385 888A 8D8F 9192 9393 9291 8E8B" $"8883 7E77 7068 5F57 4E45 3B30 2418 0F0B" $"1223 3E5E 7F9C B4C7 D4DB DEDC D7CF C6BD" $"B4AB A49D 9893 908C 8885 827E 7C7A 7877" $"7778 797A 7B7C 7C7C 7C7C 7C7B 7A79 7776" $"7677 797B 7D7F 8285 878A 8E90 9193 9494" $"9493 918F 8B85 8079 7268 5F56 4D44 3B31" $"271C 110D 111F 3856 7694 AEC2 D0D9 DDDC" $"D8D1 C8BE B5AC A59E 9995 918D 8A87 8380" $"7D7A 7978 7778 797A 7B7C 7C7D 7D7C 7C7C" $"7B79 7877 7778 797B 7C7E 7F82 8588 8B8E" $"9092 9394 9594 938F 8B87 827B 7269 6057" $"4E45 3B31 261B 110C 0F1D 3553 7392 ACC1" $"D0DA DEDD D9D2 CAC0 B6AD A59F 9994 908C" $"8885 827F 7D7B 7978 7878 797B 7C7C 7D7D" $"7D7C 7C7B 7A79 7877 7676 7879 7B7D 7F81" $"8487 8A8E 9294 9596 9695 9390 8D88 837C" $"756C 635A 5148 3E35 2A1E 130C 0C17 2C49" $"6988 A3BA CBD6 DCDD DAD4 CCC3 B9B0 A8A2" $"9C96 928E 8B87 8481 7D7B 7978 7878 797A" $"7B7B 7C7C 7C7C 7C7B 7B7A 7877 7777 7879" $"7B7E 8183 8689 8C8F 9192 9394 9493 918F" $"8C89 847F 7870 685F 564D 4439 2D20 140A" $"0811 2441 6283 A0B7 CAD6 DDDF DCD5 CEC5" $"BBB2 A9A2 9C97 928E 8B87 8481 7D7B 7977" $"7777 7879 7A7B 7C7C 7D7C 7C7C 7C7B 7978" $"7878 7879 7B7D 8082 8487 898C 8F91 9394" $"9594 9391 8E89 847F 786F 675E 544B 4239" $"2E22 150C 0911 2440 6081 9EB6 C9D5 DCDF" $"DCD6 CFC5 BCB3 AAA3 9D97 938F 8B88 8582" $"7E7C 7A78 7878 7879 7A7B 7C7C 7C7C 7C7C" $"7B7A 7877 7676 7778 7A7C 7E81 8588 8B8F" $"9192 9495 9594 9391 8E8A 8580 7A73 6A61" $"584F 463C 3125 190E 080C 1D37 5677 96AF" $"C3D1 DBDE DDD8 D1C8 BEB5 ACA5 9D98 9490" $"8C89 8583 807D 7A78 7878 7879 7A7B 7C7C" $"7C7C 7C7C 7C7B 7A78 7777 7879 7A7C 7E80" $"8284 878A 8D90 9293 9494 9492 8F8C 8883" $"7C75 6C62 5950 463C 3227 1B11 0C0E 1B33" $"5171 90AA BFCE D8DD DDD9 D2C9 C0B7 AEA6" $"9F99 9490 8C89 8583 7F7D 7B79 7878 7879" $"7A7B 7C7C 7C7C 7C7C 7C7B 7A79 7877 7777" $"797B 7D7F 8285 888C 9093 9697 9796 9593" $"908C 8781 7B74 6B61 594F 463C 3227 1B10" $"090A 172F 4E6F 8FAA BFD0 DADE DEDA D3CB" $"C1B8 AFA7 A09A 9591 8D89 8682 7F7C 7A79" $"7877 7879 7A7B 7C7D 7D7D 7D7C 7C7B 7A79" $"7777 7778 797A 7C7E 8184 878B 8F92 9395" $"9696 9593 908D 8983 7D76 6D64 5B51 483F" $"352B 1F14 0D0D 172C 4868 87A3 B9CA D6DB" $"DCDA D3CB C3B9 B0A9 A19B 9692 8E8A 8784" $"817E 7C7A 7978 7879 7A7B 7C7D 7D7D 7D7C" $"7C7B 7A79 7877 7778 797B 7C7F 8285 888C" $"8E90 9192 9393 9291 8F8D 8A85 7F78 7168" $"5F56 4C43 392D 2114 0B08 1125 4364 85A1" $"B8CA D6DD DEDB D5CE C5BB B2A9 A29C 9792" $"8E8B 8784 817E 7B79 7877 7878 797B 7C7C" $"7D7D 7D7D 7C7C 7B7A 7977 7777 7779 7B7D" $"8083 878A 8E91 9394 9494 9594 928F 8B86" $"8079 7168 5F56 4C43 392D 2113 0803 0A1E" $"3D60 81A0 B8CB D8DF E1DE D8D0 C6BC B3AA" $"A39C 9792 8E8A 8784 817E 7B79 7877 7879" $"7A7B 7C7D 7D7D 7D7C 7C7B 7A78 7776 7575" $"7678 7A7D 8083 878B 8E91 9394 9595 9594" $"9290 8C87 827B 746B 6258 4F45 3B31 2519" $"0F0A 0D1B 3352 7392 ACC1 D0D9 DDDD D9D2" $"C9BF B6AD A49E 9894 908D 8986 837F 7D7B" $"7978 7878 797A 7B7C 7C7C 7C7C 7C7C 7B7A" $"7977 7777 7879 7B7D 7E81 8487 8B8E 9193" $"9496 9796 9491 8D88 837C 746B 6259 4F46" $"3C32 261A 0F09 0A18 304F 7190 ABC0 D0DA" $"DFDE DAD3 CAC1 B7AE A6A0 9A95 918D 8986" $"827F 7C7A 7978 7878 797A 7B7C 7D7D 7D7C" $"7C7C 7B7A 7877 7777 7879 7B7D 8083 8689" $"8C8F 9193 9495 9594 9290 8C87 837C 756C" $"635A 5148 3F36 2A1E 120A 0A15 2C4B 6C8C" $"A8BD CED8 DDDE DAD4 CBC2 B8AF A8A0 9A95" $"918D 8986 8280 7D7A 7877 7778 797A 7B7C" $"7C7C 7C7C 7C7C 7B7A 7978 7777 787A 7B7D" $"8082 8588 8B8E 9193 9495 9594 9290 8C88" $"837D 766E 655C 5248 3E34 291D 130C 0B16" $"2C49 6A8A A5BC CDD8 DDDE DBD4 CCC2 B9B0" $"A7A1 9B95 918D 8A87 8481 7E7C 7A79 7979" $"797A 7C7C 7D7D 7D7D 7D7C 7B7A 7977 7676" $"7779 7B7D 8083 8588 8C8E 9092 9393 9493" $"918F 8C88 837D 766D 655C 5349 4036 2C20" $"140C 0B15 2B49 6A8A A5BC CDD8 DDDE DBD4" $"CBC2 B8AF A7A0 9A96 928E 8A87 8481 7E7B" $"7978 7778 797A 7B7C 7D7E 7E7E 7E7D 7C7A" $"7977 7676 7778 7A7D 7F81 8386 898C 8E90" $"9293 9595 9493 908B 8681 7A71 685F 554B" $"4137 2C1F 1106 020B 2140 6283 A1B9 CCD9" $"DFE0 DDD8 CFC5 BCB3 AAA2 9C96 928E 8A86" $"8380 7E7B 7978 7777 7879 7B7C 7D7D 7D7D" $"7D7C 7B7A 7877 7675 7677 797B 7D80 8487" $"8A8D 8F91 9294 9494 9492 8F8C 8782 7B73" $"6A61 574E 443A 2F23 1509 0309 1B37 597B" $"9AB4 C8D6 DEE0 DED9 D0C7 BDB3 AAA3 9C97" $"938F 8C89 8582 7F7C 7A78 7777 7879 7A7B" $"7C7D 7D7E 7E7D 7D7B 7A79 7777 7778 7A7B" $"7D7F 8285 898B 8D8F 9192 9394 9392 908C" $"8883 7C73 6B62 584D 443A 3024 180D 080C" $"1C36 5678 97B0 C5D4 DCDF DED9 D1C8 BEB5" $"ACA4 9E98 938F 8B88 8481 7E7C 7A78 7777" $"7879 7A7C 7D7E 7E7E 7E7D 7D7B 7A78 7777" $"7778 7A7B 7D80 8285 898C 8F91 9395 9595" $"9493 908C 8782 7B73 6A60 574D 443A 3023" $"150A 0509 1A36 5779 99B3 C7D6 DEE1 DFD9" $"D2C8 BFB5 ACA5 9E98 938F 8B88 8481 7E7C" $"7A78 7778 7879 7B7C 7D7E 7E7E 7E7E 7D7C" $"7A78 7777 7778 797B 7D80 8385 888C 8E90" $"9193 9494 9392 8F8C 8883 7C73 6B61 584E" $"4439 2E20 1105 0006 1A38 5C7F 9FB9 CCD9" $"E0E2 DFD9 D1C7 BDB4 ABA3 9D97 928E 8A86" $"8481 7D7B 7978 7778 787A 7B7D 7E7F 7F7F" $"7F7E 7D7C 7A78 7775 7576 787A 7D80 8386" $"898C 8F91 9293 9393 9391 8E8B 8681 7B73" $"6A61 584F 463D 3226 190D 070A 1832 5375" $"95B0 C5D4 DDE0 DFDA D2C8 BEB4 ABA4 9C97" $"938F 8B88 8582 807D 7B79 7878 797A 7B7C" $"7D7E 7E7F 7F7E 7D7C 7A79 7777 7777 797A" $"7C7E 8184 878A 8D8F 9192 9393 9392 8F8C" $"8984 7D76 6D64 5C53 4A41 372B 1D0F 0505" $"1028 486C 8EAA C1D2 DDE2 E1DC D4CB C1B7" $"AEA5 9F99 9490 8C89 8682 807D 7B79 7878" $"7879 7A7C 7D7E 7F7F 7F7F 7E7C 7B79 7877" $"7677 787A 7C7E 8083 8689 8C8F 9092 9393" $"9392 8F8C 8883 7D76 6E65 5C53 4A42 382D" $"2012 0806 1027 476A 8CA9 BFD0 DBE0 E0DC" $"D5CB C1B7 AEA5 9F99 9490 8C88 8683 807D" $"7B79 7877 7879 7A7B 7D7D 7E7E 7E7E 7D7C" $"7B7A 7877 7778 797A 7C7E 8084 878A 8E91" $"9394 9595 9493 918E 8A85 7E77 6E65 5B52" $"483E 3529 1B0F 0605 1128 4669 8AA8 BFD0" $"DBE1 E1DD D6CD C3B9 B0A7 A09A 9490 8C89" $"8683 807D 7B79 7777 7879 7A7C 7D7E 7F7F" $"7F7F 7E7D 7B79 7877 7777 797A 7C7E 8184" $"878C 9092 9496 9696 9593 908D 8883 7C74" $"6B62 584E 443A 2F23 160A 0406 1531 5275" $"96B1 C6D5 DEE1 E0DB D3C9 BFB5 ACA4 9E98" $"938F 8B87 8582 7F7D 7B79 7878 797A 7C7D" $"7E7F 8080 807F 7E7C 7A78 7776 7576 777A" $"7C7F 8284 878B 8D8E 9092 9393 9392 908D" $"8984 7E77 6F66 5D54 4B42 392E 2115 0B07" $"0F23 4163 85A3 BBCE DAE0 E0DD D6CE C3B9" $"B0A8 A09A 9591 8D8A 8784 817E 7C7A 7877" $"7778 7A7B 7C7E 7F7F 7F7F 7E7D 7C7A 7877" $"7777 7879 7A7D 8082 8589 8C90 9293 9494" $"9493 928F 8B86 8079 7066 5D54 4B42 392E" $"2214 0A06 0D20 3C5E 809F B9CC D9E0 E1DE" $"D8CF C5BB B1A8 A19B 9692 8E8B 8884 817E" $"7C79 7877 7778 797B 7D7E 7E7F 7F7F 7E7D" $"7B7A 7877 7777 787A 7C7E 8083 8688 8B8E" $"9091 9394 9493 918E 8A86 8079 7268 5F57" $"4E45 3D33 261A 0F0A 0D1D 3757 7998 B2C6" $"D4DC DFDD D8D0 C7BD B4AB A39D 9793 8F8B" $"8885 827F 7C7A 7978 7878 797A 7C7D 7E7E" $"7E7E 7E7C 7B7A 7978 7777 787A 7C7E 8083" $"8588 8B8D 8F91 9292 9393 928F 8C88 827C" $"746C 635A 5148 3F34 281A 0E07 0917 3151" $"7394 AFC4 D3DC E0DF DAD3 C9C0 B6AD A59F" $"9994 908C 8985 827F 7C7A 7877 7778 797A" $"7C7D 7D7E 7E7E 7D7C 7B79 7877 7676 7879" $"7B7E 8184 878A 8D90 9293 9394 9392 908D" $"8A86 817A 736B 6259 5047 3D33 271C 110B" $"0D1B 3353 7594 AEC3 D2DB DEDD D9D1 C9BF" $"B6AD A59E 9893 8F8C 8985 8280 7C7A 7977" $"7778 797A 7C7D 7E7E 7E7E 7E7D 7C7A 7978" $"7777 797A 7C7E 8083 8689 8D8F 9193 9494" $"9393 918E 8A86 8079 7269 6057 4F46 3D33" $"271A 0F09 0C1A 3252 7493 AEC3 D3DD E0DF" $"DBD3 CAC0 B7AE A59F 9994 908C 8886 837F" $"7D7B 7978 7878 797A 7C7D 7E7E 7F7E 7E7C" $"7B79 7877 7677 7879 7C7E 8083 8588 8B8E" $"9092 9293 9392 918E 8B88 827C 756D 645B" $"5249 4037 2C20 150D 0C16 2A47 6888 A5BC" $"CDD8 DEDE DBD5 CCC2 B9B0 A7A1 9B95 918D" $"8A87 8481 7E7C 7A78 7878 797A 7B7C 7D7E" $"7E7E 7E7D 7C7A 7978 7778 7879 7B7C 7D7F" $"8285 898C 8F91 9394 9595 9492 8F8B 857F" $"776F 655C 5349 3F35 2A1D 120A 0812 2743" $"6486 A3BB CDD8 DEDF DCD6 CDC4 BAB1 A9A1" $"9B96 918D 8A87 8481 7E7C 7A79 7878 797A" $"7B7C 7D7E 7E7E 7E7D 7C7B 7978 7777 7778" $"7A7C 7F82 8487 8A8D 8F91 9394 9494 9391" $"8E8A 857E 776F 665C 5248 3E33 271A 0D03" $"020D 2545 6A8C A9C1 D2DD E2E2 DED7 CEC5" $"BAB1 A8A1 9B95 918D 8985 827F 7C79 7877" $"7777 787A 7C7D 7E7F 7F7F 7F7E 7C7B 7977" $"7676 7778 7A7C 7E81 8487 8B8E 9193 9495" $"9493 928F 8C88 837D 756D 645A 5148 3F35" $"2B1E 120A 0A14 2947 6788 A5BC CEDA DFE0" $"DCD5 CDC4 BAB1 A8A1 9B95 918D 8A86 8481" $"7E7C 7A79 7878 797A 7C7D 7E7F 7F7F 7E7D" $"7C7A 7977 7676 7678 7A7C 7E81 8386 8A8D" $"9092 9394 9494 9391 8D8A 857F 7870 675E" $"544A 4036 2A1D 1007 040E 2443 6688 A5BE" $"D0DB E1E2 DED7 CEC4 BAB1 A8A0 9A95 908C" $"8A87 8481 7E7B 7978 7778 787A 7B7D 7E7F" $"7F80 7F7E 7D7B 7978 7776 7677 797B 7D81" $"8487 8A8E 9091 9293 9494 9391 8E8A 857F" $"7870 675E 564C 433A 2E1F 1105 0108 1C3B" $"6083 A3BC CFDB E2E3 DFD8 CFC5 BBB2 A9A2" $"9B96 928E 8A87 8481 7E7C 7A78 7778 7879" $"7B7C 7D7E 7E7E 7E7D 7C7B 7978 7776 7778" $"797A 7D80 8285 898C 8E91 9395 9594 9392" $"8F8B 8680 7972 695F 564D 443A 2F21 1307" $"0209 1D3C 6082 A1BA CDD9 DFE0 DDD6 CDC3" $"BAB1 A8A1 9A95 918D 8987 8481 7E7B 7A78" $"7778 787A 7B7D 7E7F 7F7F 7F7E 7C7B 7978" $"7776 7677 797B 7D80 8285 888B 8E91 9394" $"9494 9391 8E8B 8681 7A73 6B63 5A52 483F" $"3427 1A0F 090D 1D38 597A 98B1 C5D2 D9DC" $"DAD4 CDC4 BAB1 A9A1 9B96 928E 8B88 8582" $"7F7C 7A79 7878 797A 7B7C 7D7E 7F7F 7F7E" $"7D7B 7978 7878 7878 797B 7D7F 8184 888C" $"8F90 9193 9493 9391 8F8B 8782 7B74 6C62" $"5950 483F 3528 1A0F 0B10 213C 5C7D 9BB3" $"C6D2 D9DB D9D4 CBC2 B9B0 A8A0 9A94 908C" $"8986 8380 7E7C 7A79 7879 797A 7C7D 7E7F" $"7F7F 7F7E 7D7B 7A78 7777 7778 797B 7D7F" $"8284 878B 8E90 9293 9393 9290 8E8B 8681" $"7C75 6D64 5C53 4A42 382C 1F14 0F13 223C" $"5B7B 98AF C2CE D5D7 D5D0 C9C0 B7AF A7A0" $"9A95 918D 8987 8481 7F7C 7A79 7878 797A" $"7C7D 7E7F 7F7F 7F7E 7D7C 7A79 7877 7778" $"7A7B 7D7F 8285 888B 8D8F 9192 9292 918F" $"8D8A 8681 7C75 6E66 5F56 4F46 3D32 271D" $"1819 2439 5473 8FA7 BAC7 D0D3 D3CF C8C0" $"B8AF A8A1 9B96 928E 8A88 8582 807E 7C7A" $"7979 797A 7B7D 7E7E 7F7F 7F7E 7D7B 7A79" $"7878 7878 797B 7C7F 8183 8689 8B8D 8F90" $"9191 9190 8E8C 8884 7E77 7069 6059 5049" $"4035 291F 1919 2338 5371 8DA4 B7C5 CDD1" $"D0CD C6BF B6AE A7A0 9A95 918D 8A87 8482" $"807D 7B7A 7978 7979 7B7C 7D7E 7F7F 7F7E" $"7E7C 7B7A 7878 7878 797A 7B7D 7F82 8589" $"8C8F 9192 9292 9291 8F8C 8883 7F79 726A" $"635B 524B 4339 2F25 1E1D 2537 506C 879E" $"B2C0 C9CD CDCA C5BE B7AE A7A1 9B95 918E" $"8B88 8583 807E 7C7A 7979 797A 7B7C 7D7E" $"7F7F 7F7E 7D7C 7B7A 7978 7879 7A7B 7C7E" $"8183 8589 8C8D 8F90 9090 8F8E 8C8A 8784" $"7F79 736C 655D 564F 473D 332A 2422 2939" $"4F69 849B AEBC C5CA CBC8 C3BD B6AE A7A0" $"9A95 918D 8B88 8683 817F 7D7B 7A79 797A" $"7B7C 7D7E 7E7F 7E7E 7D7C 7B7A 7979 7979" $"7A7B 7C7E 8082 8588 8A8C 8E90 9090 908F" $"8E8B 8884 7F7A 736C 655E 5750 4942 382F" $"2926 2C39 4D67 8096 A9B8 C1C6 C8C6 C2BB" $"B4AD A6A0 9A95 918E 8B88 8683 817F 7D7B" $"7A79 797A 7B7C 7D7E 7E7F 7F7E 7E7D 7C7B" $"7A79 797A 7B7C 7D7F 8082 8486 898B 8D8E" $"8F90 8F8E 8D8A 8784 807A 756E 6861 5A54" $"4D44 3B32 2A27 2C39 4E67 8096 A8B6 BFC4" $"C6C4 C0B9 B3AC A59F 9994 908D 8A88 8583" $"817F 7D7B 7A79 7A7A 7B7C 7D7E 7F7F 7F7F" $"7E7D 7C7A 7A79 7979 7A7B 7C7E 8082 8486" $"898B 8C8D 8D8D 8D8D 8C8A 8885 817C 7771" $"6B64 5E58 5149 4037 2F2A 2B37 4A62 7B91" $"A3B2 BBC1 C3C2 BEB8 B2AB A59E 9995 918D" $"8A88 8683 817F 7D7B 7A7A 7A7A 7B7C 7D7E" $"7E7F 7F7F 7E7D 7C7B 7A7A 797A 7A7B 7C7D" $"7F81 8385 888B 8D8E 8F8F 8E8D 8C8A 8784" $"817C 7772 6B64 5E57 514A 4037 302C 303B" $"4D64 7C91 A3B0 BABF C1BF BBB6 B0A9 A39D" $"9894 908C 8A87 8583 817F 7D7C 7B7A 7A7B" $"7B7C 7D7E 7F7F 7F7F 7E7D 7C7B 7A79 7979" $"7A7B 7C7E 7F81 8385 888A 8C8D 8E8E 8E8D" $"8C8A 8784 817C 7772 6C66 605A 544D 443B" $"3532 3540 5065 7B8F A0AD B5BB BDBB B8B3" $"AEA8 A29C 9793 8F8C 8987 8583 8180 7E7D" $"7C7B 7B7B 7C7D 7D7E 7F7F 7F7F 7E7D 7C7B" $"7A7A 797A 7A7B 7C7E 7F81 8384 8688 8A8B" $"8C8D 8D8D 8C8A 8886 827E 7A74 6F69 635D" $"5750 473F 3734 363F 4F63 788C 9DAA B3B8" $"BAB9 B7B2 ADA7 A09B 9692 8E8C 8987 8583" $"8280 7E7D 7C7B 7B7B 7C7C 7D7E 7E7F 7F7F" $"7E7D 7D7C 7B7A 7A7A 7B7C 7D7E 8082 8385" $"8789 8A8A 8B8B 8B8B 8A89 8784 817E 7A75" $"6F6A 6560 5B55 4E45 3E3A 393F 4C5F 7387" $"98A5 AFB5 B8B8 B5B1 ACA6 A19B 9793 8F8C" $"8A88 8684 8280 7F7D 7C7B 7B7B 7B7C 7D7E" $"7E7F 7F7F 7E7E 7D7C 7B7B 7A7A 7A7B 7C7D" $"7F81 8284 8687 898A 8B8C 8C8C 8B89 8785" $"827F 7B76 716C 6761 5C56 4F47 3F3A 3A40" $"4E60 7487 97A4 ADB3 B5B5 B3AF AAA4 9F9A" $"9692 8E8B 8987 8583 817F 7E7C 7B7B 7B7B" $"7B7C 7D7E 7E7F 7F7F 7E7E 7D7C 7B7A 7A7A" $"7A7B 7C7D 7F80 8283 8588 8A8B 8C8C 8C8B" $"8B89 8785 827F 7B77 726D 6964 5F5A 534C" $"4540 3E43 4E5F 7183 929F A8AE B1B2 B0AD" $"A8A3 9E99 9591 8D8B 8987 8584 8280 7F7E" $"7D7C 7B7B 7C7C 7D7E 7E7E 7E7E 7E7E 7D7C" $"7C7B 7B7A 7B7B 7C7D 7E80 8183 8587 8889" $"8B8B 8B8B 8B8A 8886 8380 7D79 746F 6A65" $"605C 5750 4A45 4347 505D 6D7E 8D9A A4AA" $"AEAF AEAB A8A3 9E9A 9692 8F8C 8987 8583" $"8280 7F7E 7D7C 7C7C 7C7D 7D7E 7E7F 7F7F" $"7E7E 7D7D 7C7B 7B7B 7B7C 7D7E 7F80 8182" $"8385 8788 898A 8A8A 8988 8786 8481 7E7A" $"7672 6E69 6561 5C57 514C 494A 505B 6978" $"8794 9DA5 A9AB ABA9 A6A2 9E9A 9692 8E8C" $"8A88 8684 8381 7F7E 7D7C 7C7C 7C7C 7D7D" $"7E7E 7E7E 7E7E 7D7D 7D7C 7C7C 7C7C 7D7D" $"7E7F 8183 8486 8788 8989 8A8A 8988 8785" $"8381 7E7B 7874 706C 6864 5F5A 544F 4B4B" $"505A 6877 8592 9BA2 A7A9 A9A7 A5A1 9D99" $"9591 8E8C 8987 8684 8381 7F7E 7D7C 7C7C" $"7C7C 7D7D 7E7E 7E7E 7E7E 7E7D 7D7C 7C7C" $"7C7C 7D7D 7E7F 8082 8385 8687 8889 8989" $"8988 8785 8381 7F7C 7874 716D 6965 605B" $"5652 4F4F 545D 6976 848F 989F A3A6 A6A4" $"A29F 9B97 9490 8D8B 8987 8684 8381 807F" $"7E7D 7C7C 7C7D 7D7E 7E7E 7E7F 7F7E 7E7E" $"7D7C 7C7C 7C7C 7D7D 7E7F 8081 8284 8586" $"8687 8788 8887 8685 8482 807D 7A77 7370" $"6C68 6460 5B57 5453 565D 6773 808B 949B" $"9FA2 A3A2 A09D 9A96 9390 8D8B 8987 8684" $"8382 817F 7E7D 7D7C 7C7D 7D7D 7E7E 7E7E" $"7E7E 7E7E 7D7D 7C7C 7C7C 7D7D 7E7F 8081" $"8283 8586 8787 8888 8887 8685 8382 807E" $"7B78 7572 6E6B 6864 605C 5856 585D 6570" $"7C87 9096 9B9F A0A0 9E9C 9996 938F 8D8B" $"8987 8684 8382 8180 7F7E 7D7D 7D7D 7D7D" $"7E7E 7E7E 7E7E 7E7E 7D7D 7D7D 7C7D 7D7D" $"7E7F 8080 8182 8485 8687 8787 8787 8685" $"8482 817F 7C79 7673 706C 6A67 635F 5C5A" $"5A5E 6670 7A84 8D93 989C 9D9D 9C9A 9895" $"928F 8D8B 8987 8684 8382 8180 7F7E 7E7D" $"7D7D 7D7E 7E7E 7E7E 7E7E 7E7E 7E7D 7D7D" $"7D7D 7D7D 7E7F 7F80 8182 8384 8586 8686" $"8686 8685 8382 817F 7D7B 7875 7370 6D6A" $"6764 615F 5F61 666D 767F 888E 9498 999A" $"9A98 9694 918F 8C8A 8887 8684 8382 8180" $"807F 7E7E 7D7D 7D7E 7E7E 7E7E 7E7E 7E7E" $"7D7D 7D7D 7D7D 7D7E 7E7F 7F80 8182 8384" $"8585 8686 8686 8585 8483 8180 7E7C 7A77" $"7472 6F6C 6966 6260 6061 666E 767F 878D" $"9296 9798 9896 9492 908E 8C8A 8887 8584" $"8382 8180 7F7F 7E7E 7D7D 7D7E 7E7E 7E7F" $"7F7F 7E7E 7E7E 7D7D 7D7D 7D7D 7E7E 7F80" $"8182 8283 8485 8585 8585 8484 8382 817F" $"7E7C 7A78 7674 716F 6D69 6765 6465 696F" $"767E 848A 8F92 9495 9594 9291 8F8C 8B89" $"8786 8584 8382 8180 807F 7E7E 7E7E 7E7E" $"7E7E 7E7F 7F7F 7F7E 7E7E 7E7D 7D7D 7E7E" $"7E7E 7F80 8081 8283 8384 8484 8484 8484" $"8382 8180 7F7E 7C7A 7876 7371 6F6C 6967" $"6667 6A6F 767D 8389 8D90 9293 9392 918F" $"8D8B 8A88 8785 8483 8281 8180 7F7F 7E7E" $"7E7E 7E7E 7E7F 7F7F 7F7F 7F7F 7E7E 7E7E" $"7E7E 7E7E 7E7E 7F7F 8081 8182 8383 8384" $"8484 8483 8382 8181 7F7E 7D7B 7977 7674" $"726F 6D6B 6969 6C70 767C 8287 8B8E 8F90" $"9090 8E8D 8B8A 8887 8684 8483 8281 8180" $"807F 7F7E 7E7E 7E7E 7F7F 7F7F 7F7F 7F7F" $"7F7E 7E7E 7E7E 7E7E 7E7F 7F7F 8080 8182" $"8283 8383 8383 8383 8282 8180 7F7E 7D7C" $"7A79 7776 7473 716F 6D6D 6F72 767B 8084" $"888B 8C8D 8E8D 8C8B 8A88 8786 8584 8382" $"8281 8180 807F 7F7F 7E7E 7E7E 7F7F 7F7F" $"7F7F 7F7F 7F7F 7E7E 7E7E 7E7E 7E7F 7F7F" $"8080 8181 8282 8282 8282 8282 8281 8180" $"7F7F 7E7C 7B7A 7978 7775 7472 7171 7274" $"777B 7F83 8688 8A8B 8B8B 8A89 8887 8685" $"8483 8282 8181 8180 807F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 8080 8081 8181 8181 8282 8281" $"8181 8180 807F 7E7D 7D7C 7B7A 7978 7776" $"7574 7576 787B 7F81 8486 8788 8888 8887" $"8685 8584 8382 8281 8181 8080 8080 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F80 8080 8181 8181" $"8181 8181 8181 8080 807F 7F7E 7E7D 7C7C" $"7B7A 7A79 7878 7879 7A7C 7E80 8284 8585" $"8585 8585 8484 8382 8282 8181 8180 8080" $"8080 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F80 8080" $"8080 8080 8181 8080 8080 8080 807F 7F7F" $"7E7E 7E7D 7D7D 7C7C 7B7B 7B7B 7C7D 7F80" $"8182 8283 8383 8382 8282 8181 8181 8080" $"8080 8080 8080 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F80 8080 8080 8080 8080 8080 8080 8080" $"807F 7F7F 7F7F 7F7F 7F7F 7F7E 7E7E 7E7E" $"7F7F 7F80 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080" } }; resource 'snd ' (20553, "Magic Harp", purgeable) { FormatOne { { /* array Synthesizers: 1 elements */ /* [1] */ sampledSynth, 160 } }, { /* array SoundCmnds: 1 elements */ /* [1] */ hasData, bufferCmd { 20 } }, { /* array DataTables: 1 elements */ /* [1] */ 16918, Rate22K, 16916, 16917, 0x0, 0x3C, $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7E7E 7E7E 7E7D 7D7D" $"7C7C 7C7C 7C7B 7877 7777 7877 7574 7476" $"7A7D 7E7F 8081 8282 8281 807E 7B79 7878" $"7B80 8282 8282 8282 8282 8282 8283 8178" $"623D 201D 201F 2327 2C32 363A 3A37 3836" $"2D1B 0600 080C 0E0F 0A03 0A19 2733 383A" $"3E43 484E 535A 5E61 6055 5159 616C 7475" $"7576 797E 8589 8B8D 9092 9292 9190 8F8D" $"8A88 8889 8D91 9191 9090 9090 9090 9090" $"8F8F 8F89 7A63 524F 4E4E 5053 565A 5E60" $"5F5E 5F5D 5543 3029 2A2B 2C2C 2623 2C38" $"434C 5052 555A 5E63 676B 6E70 6C62 626B" $"747E 8382 8283 868C 9295 9799 9B9D 9D9D" $"9C9B 9997 9594 9395 999B 9B9B 9B9B 9B9A" $"9A9A 9A9A 9A99 9893 826C 5F5C 5A5A 5C5F" $"6366 696B 6A69 6A68 5E4B 3B37 3838 3837" $"3131 3B46 5158 5A5D 6165 696D 7175 7778" $"726A 6E77 7F88 8B8A 8B8C 8F95 9A9C 9EA1" $"A3A4 A4A4 A3A2 A09E 9C9B 9B9E A2A2 A2A2" $"A2A1 A1A1 A1A1 A0A0 A0A0 A09A 8772 6765" $"6363 6467 6B6E 7172 7271 7270 6450 4341" $"4040 403E 383A 4550 5A60 6265 686C 7074" $"787B 7D7C 7571 777F 888F 9090 9092 959A" $"9FA1 A3A5 A7A9 A9A8 A8A6 A4A2 A1A0 A0A3" $"A6A6 A6A6 A6A6 A5A5 A5A5 A5A4 A4A4 A49E" $"8C77 6D6A 6868 6A6C 7073 7677 7676 7776" $"6955 4A48 4646 4643 3D40 4B55 5F65 676A" $"6D71 7478 7C7F 807E 7775 7C84 8D93 9393" $"9395 999E A2A4 A6A8 AAAC ACAB ABA9 A7A5" $"A4A3 A4A7 A9A9 A9A9 A9A8 A8A8 A8A8 A7A7" $"A7A7 A7A2 917C 726F 6C6B 6D6F 7276 797A" $"7979 7A7A 6D59 4E4C 4A4A 4A46 4144 4E58" $"6268 6A6D 7073 777B 7E81 827F 7878 7F86" $"8F95 9595 9597 9AA0 A3A5 A7A9 ABAD AEAD" $"ADAB A9A7 A6A5 A6A9 ABAB ABAB AAAA AAAA" $"AAA9 A9A9 A9A8 A8A5 9680 7673 6F6E 6F71" $"7478 7A7C 7C7C 7C7C 705D 5250 4D4C 4B48" $"4245 5059 6369 6B6E 7275 797C 7F81 8381" $"7979 8188 9197 9696 9798 9BA0 A4A6 A8AA" $"ACAE AFAF AEAD ABA9 A7A6 A7AB ADAC ACAC" $"ACAC ABAB ABAB AAAA AAAA A9A8 9B85 7A75" $"716F 6F71 7578 7B7C 7C7D 7D7D 7360 5552" $"4F4D 4C49 4345 4F58 6269 6C6F 7276 797C" $"7F82 8380 7979 8189 9197 9797 9798 9BA0" $"A4A6 A8AA ACAE B0AF AFAD ABA9 A8A7 A8AB" $"ADAD ADAC ACAC ACAC ABAB ABAB AAAA A9A9" $"A08C 7D78 7370 7071 7377 7A7C 7D7D 7D7E" $"7563 5754 504E 4D4B 4544 4D56 6068 6B6E" $"7275 787C 7E80 817F 7878 8089 9197 9797" $"9798 9A9F A3A6 A7A9 ABAD AFAF AFAD ACAA" $"A8A7 A8AB ADAD ADAC ACAC ACAB ABAB ABAA" $"AAAA AAA9 A392 827A 7571 6F70 7275 797B" $"7C7C 7C7D 7766 5954 504D 4C4A 4542 4953" $"5C65 6A6C 7073 767A 7C7E 807E 7775 7E87" $"8F96 9796 9697 999D A2A4 A6A8 AAAC AEAF" $"AFAD ACAA A8A7 A7AA ADAD ACAC ACAC ABAB" $"ABAB AAAA AAAA AAA9 A699 887D 7872 6F6F" $"7073 7679 7B7B 7C7C 786B 5C56 524D 4B4A" $"4640 444E 5761 686A 6E71 7578 7A7C 7E7D" $"7773 7984 8D95 9696 9696 979A 9FA3 A5A7" $"A9AB ADAF AEAD ACAA A8A7 A7A9 ACAC ACAC" $"ACAB ABAB ABAA AAAA AAA9 A9A9 A79F 8F81" $"7B75 706E 6E70 7477 797A 7A7B 796F 6159" $"544F 4C4A 4741 404A 535C 6569 6C6F 7376" $"787A 7C7C 7771 7680 8992 9695 9595 9698" $"9DA1 A3A5 A7A9 ABAD AEAD ACAA A8A7 A6A8" $"ABAC ACAB ABAB ABAA AAAA AAA9 A9A9 A9A9" $"A8A3 9789 7F78 726F 6D6E 7174 7778 797A" $"7972 655C 5751 4C4A 4842 3D44 4D56 6066" $"696D 7073 7678 7A7A 7870 717A 848E 9594" $"9494 9496 999E A1A3 A5A7 A9AB ADAD ACAA" $"A8A7 A6A6 A9AB ABAB AAAA AAAA A9A9 A9A9" $"A8A8 A8A8 A7A5 9D8F 847D 7570 6D6D 6E70" $"7476 7777 7874 695E 5953 4E4A 4744 3E3D" $"464F 5862 676A 6E71 7476 7878 7770 6D74" $"7E88 9294 9393 9394 969B 9FA1 A3A5 A7A9" $"ABAC ACAA A8A6 A5A5 A7AA AAAA AAA9 A9A9" $"A9A8 A8A8 A8A7 A7A7 A6A6 A296 8A82 7B73" $"6F6C 6C6D 7073 7575 7675 6C62 5C56 504B" $"4745 403B 3E48 505B 6366 6A6D 7073 7576" $"7571 6A6D 7780 8B92 9292 9292 9396 9B9E" $"A0A2 A4A6 A8AA ABAA A8A6 A5A4 A5A8 A9A9" $"A9A8 A8A8 A8A7 A7A7 A6A6 A6A6 A6A5 A49D" $"9087 8179 716D 6B6A 6C6F 7173 7374 7065" $"5F5B 544E 4A46 433C 3940 4952 5D63 6669" $"6D70 7274 7472 6C68 7079 838E 9191 9191" $"9193 969B 9E9F A1A3 A5A7 A9AA A8A6 A5A4" $"A3A5 A8A8 A8A8 A7A7 A7A7 A6A6 A6A5 A5A5" $"A5A5 A4A2 998B 8580 7770 6C6A 6A6B 6E70" $"7272 726A 605E 5A52 4D48 4440 3938 424A" $"545E 6366 6A6D 6F71 7272 6E67 6872 7B86" $"8F90 9090 9090 9297 9B9D 9FA1 A3A5 A7A8" $"A8A7 A5A4 A3A3 A6A7 A7A7 A7A6 A6A6 A6A5" $"A5A5 A5A4 A4A4 A4A3 9F93 8784 7E75 6F6B" $"6969 6B6D 6F70 716F 655E 5E58 504B 4642" $"3B35 3942 4B56 5E62 6669 6C6F 7171 706A" $"656A 747D 888E 8F8F 8E8F 9093 979A 9C9E" $"A0A2 A4A6 A7A7 A6A4 A3A2 A3A6 A7A6 A6A6" $"A6A5 A5A5 A5A4 A4A4 A4A3 A3A3 A199 8C85" $"837C 736D 6A68 696B 6D6E 6F70 6C61 5D5E" $"5850 4A44 3F36 333B 444D 585E 6165 686C" $"6E6F 706E 6763 6B75 7E89 8D8D 8D8D 8D8F" $"9397 999B 9D9F A1A3 A5A7 A7A5 A3A2 A2A3" $"A5A6 A6A5 A5A5 A5A4 A4A4 A3A3 A3A3 A2A2" $"A19D 9185 8481 7871 6B68 6868 6A6C 6D6E" $"6F6A 5F5D 5E58 5049 4239 3134 3E46 5059" $"5C60 6468 6B6D 6F6F 6C64 636C 757F 898C" $"8B8B 8B8C 8F93 9698 9A9C 9E9F A1A3 A5A5" $"A4A2 A1A1 A3A5 A5A4 A4A4 A4A3 A3A3 A3A2" $"A2A2 A2A1 A19F 9789 8383 7E74 6E69 6767" $"686A 6B6C 6E6F 695F 5D5F 5A50 473E 322F" $"3841 4A53 575B 6064 686B 6D6F 6E6B 6363" $"6D76 8089 8A8A 8A8A 8C90 9395 9798 9A9C" $"9EA0 A2A4 A4A3 A2A1 A1A2 A4A4 A4A4 A3A3" $"A3A3 A2A2 A2A2 A1A1 A19F 9A8D 8383 8179" $"726C 6867 6768 696A 6D6F 7069 5F5E 605A" $"4F45 372E 333C 444E 5356 5B60 6468 6B6D" $"6F6E 6A63 636E 7780 8889 8888 8A8D 9193" $"9496 9899 9B9D 9FA1 A3A4 A3A1 A0A1 A3A4" $"A4A3 A3A3 A3A2 A2A2 A2A1 A1A1 A19F 9C91" $"8482 837E 756E 6A67 6768 6969 6B6E 7070" $"685F 5F60 5A4E 3F32 3139 404A 4F52 565B" $"6064 686C 6E6F 6E69 6265 7078 8288 8787" $"888A 8E91 9294 9597 999B 9D9F A1A2 A3A2" $"A1A0 A1A3 A4A3 A3A3 A3A2 A2A2 A2A1 A1A1" $"A1A0 9D93 8681 8380 7971 6C68 6767 6868" $"6A6D 7072 7167 5F5F 5F58 4938 3338 3E47" $"4D4F 5257 5B60 6569 6C6E 6F6D 6762 6872" $"7A83 8786 8689 8C8F 9091 9395 9698 9A9C" $"9EA0 A2A3 A2A1 A0A1 A3A3 A3A3 A2A2 A2A2" $"A1A1 A1A1 A0A0 9D95 8882 8281 7C75 6D69" $"6767 6767 696C 6F72 7470 655E 5E5C 5240" $"373A 3E45 4B4D 4F52 575C 6166 6A6D 6F6F" $"6D66 636B 747D 8485 8587 8A8D 8E8F 9192" $"9496 989A 9C9E A0A1 A2A1 A0A0 A1A3 A3A2" $"A2A2 A2A1 A1A1 A1A0 A09F 9D96 8881 8282" $"7E77 6F6B 6867 6767 676A 6E71 7475 6D61" $"5D5C 5547 3D3D 4045 4B4C 4D4F 5458 5E63" $"676B 6E70 6F6B 6465 6F77 7F84 8486 898C" $"8D8E 8F91 9294 9698 999B 9D9F A1A1 A1A0" $"A0A2 A3A2 A2A2 A2A1 A1A1 A0A0 A09F 9D95" $"8881 8282 7F79 716C 6967 6766 676A 6D71" $"7576 7468 5E5B 564B 4544 4448 4C4C 4C4E" $"5155 5A60 656A 6E70 706F 6863 6A73 7A81" $"8485 898A 8B8D 8E8F 9192 9496 989A 9C9E" $"9FA0 A1A0 A0A1 A2A2 A2A2 A2A1 A1A1 A1A0" $"A09F 9D95 8781 8282 807B 736D 6A68 6766" $"676A 6D71 7578 7770 625B 554B 494C 4B4D" $"4E4D 4D4D 4F53 585D 6368 6C6F 7171 6D65" $"666F 777D 8386 888A 8B8C 8D8E 9091 9394" $"9698 9A9C 9E9F A0A1 A0A0 A2A2 A2A2 A2A1" $"A1A1 A1A0 A09F 9C92 8681 8282 817C 746F" $"6B68 6766 676A 6D71 7578 7975 675B 534B" $"4C52 5252 524F 4E4E 4E51 565B 6166 6B6F" $"7172 7069 656C 747B 8286 8889 8A8B 8C8D" $"8E90 9193 9597 989A 9C9E 9FA0 A0A0 A1A2" $"A2A2 A2A1 A1A1 A1A0 A09F 9B8F 8382 8282" $"817D 756F 6B69 6766 676A 6E72 7679 7A77" $"6B5B 504A 4E56 5858 5551 4F4E 4E50 5459" $"5F65 6A6E 7173 726D 6669 7278 8087 8888" $"898A 8B8C 8D8F 9092 9395 9799 9B9D 9E9F" $"A0A0 A0A2 A2A2 A1A1 A1A1 A0A0 A09E 988C" $"8282 8282 817D 7670 6B69 6766 676A 6E72" $"7679 7A78 6E5C 4E4C 5258 5D5E 5853 514F" $"4E50 5358 5D63 686D 7173 736F 6767 7077" $"7F86 8787 8889 8A8B 8C8E 8F91 9294 9698" $"9A9B 9D9E 9F9F A0A2 A2A1 A1A1 A1A1 A0A0" $"9F9D 9588 8283 8281 817D 7670 6C69 6766" $"686B 6F73 7779 7A79 705D 4C4E 555A 6163" $"5C57 5351 5050 5257 5C62 686D 7174 7471" $"6967 6F77 7E86 8787 8889 8A8B 8C8D 8E90" $"9193 9597 999A 9C9D 9E9F A0A1 A2A1 A1A1" $"A1A0 A0A0 9E9B 9185 8283 8282 827D 7670" $"6C69 6767 696C 7074 787A 7B79 705C 4C51" $"595D 6466 605A 5653 5151 5357 5C61 676D" $"7174 7573 6B68 6F77 7E86 8887 8889 8A8A" $"8B8D 8E8F 9192 9496 989A 9B9C 9E9F A0A1" $"A2A2 A1A1 A1A1 A0A0 9E98 8B83 8484 8282" $"827C 7670 6C69 6768 6A6D 7175 797B 7B78" $"6E5A 4F55 5C61 6666 635E 5855 5351 5357" $"5C61 686D 7175 7674 6D69 7078 7F86 8887" $"8889 898A 8B8C 8E8F 9092 9495 9799 9B9C" $"9D9E A0A1 A2A2 A1A1 A1A1 A09F 9C92 8683" $"8484 8383 817C 7470 6C68 6769 6B6F 7377" $"7A7C 7B76 6B59 5359 5F65 6767 6560 5A57" $"5452 5457 5C61 686D 7175 7674 6D6A 7179" $"8086 8787 8888 898A 8B8C 8D8E 9091 9395" $"9798 9A9B 9C9E A0A1 A2A1 A1A1 A1A0 9F9D" $"978B 8484 8483 8383 817A 736F 6B68 686A" $"6D71 7578 7A7B 7973 665A 585D 6467 6768" $"6863 5D59 5654 5457 5C62 676D 7275 7674" $"6E6B 737A 8086 8787 8888 898A 8A8B 8D8E" $"8F91 9294 9698 999B 9C9D 9FA1 A1A1 A1A1" $"A1A0 9E9B 9085 8485 8483 8383 7F78 726D" $"6A68 696C 6F73 777A 7B7B 776D 6560 5D61" $"6868 6869 6966 605B 5755 5658 5D63 686E" $"7376 7775 6E6D 757C 8186 8787 8888 8989" $"8A8B 8D8E 8F91 9294 9697 999A 9B9D 9FA1" $"A1A1 A1A1 A19F 9C94 8884 8585 8483 8382" $"7D76 716C 6969 6B6E 7276 797B 7B79 726A" $"6863 6067 6A68 6869 6A67 625D 5957 575A" $"5F64 696F 7577 7875 6F70 787D 8287 8888" $"8888 898A 8B8B 8D8E 8F91 9294 9697 999A" $"9B9D 9FA2 A2A1 A1A1 A09D 978B 8586 8684" $"8484 8481 7A74 6E6B 6A6B 6D71 7579 7B7B" $"7A75 6D6D 6D66 666A 6969 696A 6B69 635F" $"5B58 595C 6065 6B71 7577 7875 7072 7A7F" $"8488 8888 8888 898A 8B8C 8D8E 8F91 9294" $"9697 999A 9B9D A0A2 A2A1 A1A0 9E98 8D85" $"8686 8585 8485 837D 7671 6C6A 6B6D 7074" $"787A 7C7B 766F 6E73 6F69 696A 6A6A 6A6B" $"6C6A 6560 5C5A 5B5D 6267 6D72 7678 7875" $"7175 7C81 8688 8888 8889 898A 8B8C 8D8E" $"8F91 9294 9697 999A 9B9D A0A2 A2A1 A09E" $"9A8F 8687 8785 8585 8585 817A 736E 6B6B" $"6D6F 7377 797B 7A76 706F 7575 6F6A 6A6B" $"6B6A 6B6C 6D6B 6560 5D5B 5C5F 646A 6F74" $"7779 7974 7279 7F83 8788 8888 8889 898A" $"8B8C 8D8E 8F91 9294 9697 989A 9B9E A0A1" $"A1A0 9E9A 8F86 8787 8685 8585 8583 7C75" $"6F6C 6C6D 6F73 7679 7B7B 7770 7177 7A77" $"6F6A 6B6B 6B6B 6C6D 6F6C 6660 5D5D 5E61" $"676C 7175 787A 7873 757D 8085 8888 8888" $"8889 898A 8B8C 8D8E 8F91 9294 9697 999A" $"9C9F A1A1 A09E 9A8F 8787 8886 8685 8586" $"847E 7771 6E6C 6D6F 7276 797A 7A77 7072" $"797C 7C76 6C6B 6C6C 6C6C 6D6F 706C 6661" $"5F5F 6165 6A6E 7377 7A7B 7572 7980 8488" $"8888 8888 8989 8A8A 8B8C 8D8F 9091 9395" $"9698 999B 9D9F A2A1 9E99 8E87 8888 8786" $"8686 8685 8078 736F 6D6E 7073 7679 7A7A" $"7771 737B 7E7F 7C70 6B6D 6D6C 6D6D 6E70" $"716C 6662 6061 6367 6D72 767A 7C79 7377" $"7E82 8789 8888 8889 8989 8A8B 8C8D 8E8F" $"9192 9495 9798 9A9C 9EA0 A09E 988D 8789" $"8987 8786 8687 8682 7A74 706E 6E70 7376" $"787A 7A76 7174 7C7F 8280 756C 6C6D 6D6D" $"6D6E 7072 706A 6562 6263 666B 7075 797C" $"7B75 757C 8286 8989 8888 8989 898A 8A8B" $"8C8D 8E90 9193 9496 9899 9A9D 9FA0 9E98" $"8D87 8989 8887 8786 8787 847C 7571 6F6E" $"7072 7578 7A79 7672 757D 8183 8279 6E6C" $"6E6D 6D6D 6E6F 7172 6E68 6462 6365 696E" $"7377 7B7B 7774 7A81 8589 8A89 8888 8989" $"898A 8B8C 8D8E 8F90 9293 9596 9899 9B9E" $"9F9E 988E 8889 8988 8787 8787 8785 7F77" $"7370 6F70 7275 7879 7976 7274 7D81 8383" $"7C71 6C6E 6E6E 6E6E 6F71 7371 6C67 6463" $"6568 6C71 767A 7B78 7479 8084 888A 8988" $"8888 8989 8A8A 8B8C 8D8E 9091 9394 9697" $"989A 9D9E 9D9A 9088 898A 8988 8787 8787" $"8782 7A75 716F 7071 7477 7979 7772 747D" $"8183 847E 726C 6E6E 6E6E 6E6F 7072 736F" $"6965 6464 676B 7074 787A 7974 7880 8488" $"8A89 8989 8989 898A 8A8B 8C8D 8E8F 9192" $"9495 9798 9A9C 9D9D 9A91 8989 8A89 8888" $"8787 8788 857E 7773 7170 7173 7678 7977" $"7373 7B81 8485 7F74 6D6E 6F6E 6E6E 6F70" $"7274 716B 6765 6466 6A6E 7377 7979 7577" $"8085 888B 8A89 8989 8989 8A8A 8B8C 8D8E" $"8F90 9293 9597 989A 9C9E 9D9C 948B 898B" $"8A89 8887 8788 8887 837B 7672 7171 7375" $"7778 7874 7279 8184 8581 776E 6E6F 6F6E" $"6E6F 7071 7373 6E68 6665 6668 6C71 7477" $"7875 767F 8588 8B8B 8A89 8989 898A 8A8B" $"8C8D 8E8F 9091 9394 9697 999B 9D9D 9C98" $"8E89 8B8B 8A89 8888 8888 8886 8079 7572" $"7172 7476 7878 7572 7780 8384 8379 6F6E" $"6F6F 6E6E 6E6F 7172 7470 6A67 6565 676A" $"6E72 7576 7476 7E85 888C 8B8A 8A89 8989" $"898A 8A8B 8C8D 8E8F 9192 9495 9698 9A9C" $"9D9D 9A92 898A 8B8A 8988 8888 8888 8884" $"7E78 7472 7273 7576 7776 7273 7C82 8383" $"7C71 6D6F 6F6E 6E6E 6F70 7173 726D 6865" $"6466 686C 7073 7574 747B 8387 8B8C 8B8A" $"8989 8989 8A8A 8B8C 8C8E 8F90 9193 9496" $"9799 9B9D 9D9B 968C 898B 8B8A 8988 8888" $"8888 8883 7B77 7472 7274 7677 7774 7278" $"8183 8480 756E 6F6F 6E6E 6E6E 6F70 7273" $"716B 6765 6567 6A6D 7173 7372 7882 878A" $"8D8C 8A8A 8A89 898A 8A8B 8B8C 8D8E 8F91" $"9294 9596 989A 9C9D 9C9A 928A 8A8C 8B8A" $"8988 8888 8888 8781 7B77 7372 7374 7576" $"7572 737C 8383 837A 706F 706F 6E6E 6E6F" $"7071 7373 6F69 6665 6568 6B6E 7172 7173" $"7E86 898D 8D8C 8B8A 8A8A 8A8A 8A8B 8C8D" $"8E8F 9092 9394 9697 999B 9D9D 9C98 8E8A" $"8C8C 8A8A 8988 8889 8989 8781 7B77 7473" $"7374 7576 7471 7680 8383 7F74 6F70 706E" $"6E6E 6E6F 7071 7372 6D69 6665 6668 6C6F" $"7170 7077 8388 8C8E 8D8C 8B8A 8A8A 8A8A" $"8B8B 8C8D 8E8F 9192 9395 9698 9A9C 9D9C" $"9B95 8C8A 8C8C 8B8A 8989 8989 8989 8781" $"7B77 7473 7374 7575 7271 7981 8382 7B71" $"7071 6F6E 6E6D 6E6F 7071 7271 6C67 6565" $"6668 6B6E 6F6E 707C 868A 8E8E 8D8C 8B8A" $"8A8A 8A8B 8B8C 8C8D 8E90 9192 9495 9799" $"9B9D 9D9C 9A92 8A8B 8D8C 8B8A 8989 8989" $"8989 8782 7B77 7473 7374 7473 7072 7C82" $"8280 776F 7171 6F6E 6D6D 6E6F 7071 7270" $"6B67 6565 6668 6B6D 6D6D 7380 888C 8E8E" $"8D8C 8B8A 8A8A 8A8B 8B8C 8D8E 8F90 9193" $"9496 9799 9B9D 9D9B 9890 8A8C 8D8C 8B8A" $"8989 8989 8989 8782 7B77 7473 7374 7472" $"6F74 7E82 827E 736F 7170 6F6E 6D6D 6E6F" $"7070 7270 6C67 6565 6668 6A6C 6B6C 7682" $"898D 8F8E 8D8C 8B8A 8A8A 8A8B 8B8C 8D8E" $"8F90 9193 9496 9899 9B9D 9C9A 978E 8A8D" $"8D8C 8B8A 8989 8989 8989 8883 7C78 7574" $"7373 7371 6F75 7F82 817C 7270 7270 6F6E" $"6D6D 6E6F 7070 7271 6C68 6665 6668 6A6B" $"6A6C 7984 8A8F 8F8E 8D8C 8B8B 8B8B 8B8B" $"8C8C 8D8E 8F90 9193 9596 989A 9C9D 9C9A" $"958D 8B8E 8D8C 8B8A 8989 8989 8989 8984" $"7E79 7674 7473 7371 6F77 8081 817A 7171" $"7270 6F6E 6D6D 6E6F 6F70 7271 6C68 6665" $"6567 6969 686D 7A85 8A8F 908F 8E8D 8C8B" $"8B8B 8B8B 8C8C 8D8E 8F90 9293 9596 989A" $"9C9D 9C9A 958D 8B8E 8E8C 8B8A 8A89 898A" $"8989 8986 807A 7775 7473 7270 6F77 7F81" $"8079 7171 7270 6F6E 6D6D 6E6E 6F70 7172" $"6E69 6665 6566 6868 676C 7984 8B90 908F" $"8E8D 8C8B 8B8B 8B8B 8C8C 8D8E 8F90 9293" $"9496 989A 9B9D 9B99 958E 8B8E 8E8C 8B8A" $"8A8A 8A8A 8A89 8987 827C 7875 7473 726F" $"6E76 7F81 8078 7071 7270 6F6D 6D6D 6D6E" $"6F6F 7072 6F6A 6765 6566 6767 666B 7983" $"8A8F 908F 8E8D 8C8B 8B8B 8B8B 8B8C 8D8E" $"8F90 9192 9496 9799 9B9D 9B99 958D 8B8E" $"8E8D 8C8A 8A8A 8A8A 8A89 8989 857E 7A77" $"7573 726F 6D74 7D80 7F78 7172 7371 6F6D" $"6D6D 6D6E 6E6F 7072 706B 6866 6565 6666" $"656A 7882 898F 908F 8F8D 8D8C 8B8B 8B8B" $"8B8C 8D8D 8E90 9192 9495 9799 9A9C 9C9A" $"968F 8B8E 8E8D 8C8B 8A8A 8A8A 8A89 898A" $"8882 7C78 7674 726F 6D72 7C7F 7F78 7172" $"7371 6F6E 6D6D 6D6D 6E6F 7071 716D 6866" $"6565 6565 6368 7681 878D 9090 8F8E 8D8C" $"8B8B 8B8B 8B8C 8C8D 8E8F 9092 9395 9698" $"9A9C 9C9A 9790 8B8D 8F8E 8C8B 8A8A 8A8A" $"8A8A 898A 8A85 7F7B 7775 7370 6D70 797E" $"7E79 7272 7472 706E 6D6D 6D6D 6E6F 6F70" $"7270 6B68 6665 6564 6266 737E 868C 9090" $"8F8F 8E8D 8C8B 8B8B 8C8C 8C8D 8E8F 9091" $"9394 9697 999B 9C9A 9892 8C8C 8F8E 8D8C" $"8B8A 8A8A 8A8A 8A8A 8A88 837E 7A76 7471" $"6E6E 767C 7D79 7372 7473 716F 6E6D 6D6D" $"6E6E 6F70 7171 6D69 6765 6463 6264 6F7C" $"838A 8E90 908F 8E8D 8C8B 8B8B 8B8C 8C8D" $"8D8E 8F91 9293 9597 989A 9C9A 9894 8D8B" $"8E8E 8D8C 8B8A 8A8A 8A8A 8A8A 8A8A 8781" $"7C79 7573 6F6D 727A 7D7A 7471 7474 7270" $"6E6D 6D6D 6D6E 6E6F 7072 706B 6866 6463" $"6161 6A78 8087 8C8E 8F8F 8E8D 8C8C 8B8B" $"8B8B 8C8C 8D8E 8F90 9192 9495 9799 9B9A" $"9896 908B 8D8E 8D8C 8B8A 8A89 8A8A 8989" $"898A 8A86 807C 7874 716D 6E76 7B7A 7571" $"7374 7271 6F6D 6D6D 6D6D 6E6E 6F71 726E" $"6A67 6563 6160 6573 7D83 898C 8E8F 8F8E" $"8D8C 8B8B 8B8B 8B8C 8C8D 8E8F 9091 9394" $"9698 9A9B 9997 938C 8B8E 8E8D 8C8B 8A8A" $"8A8A 8A89 898A 8B8A 857F 7B77 736F 6D70" $"787A 7671 7274 7372 706E 6D6D 6D6D 6E6E" $"6F70 7271 6D69 6664 625F 616C 7880 868B" $"8D8F 8F8E 8D8D 8C8B 8B8B 8B8C 8C8D 8D8E" $"8F90 9293 9596 989A 9A98 968F 8A8C 8F8E" $"8D8C 8B8A 8A8A 8A8A 8A8A 8A8B 8A85 7F7A" $"7672 6E6D 7379 7873 7174 7573 7170 6E6D" $"6D6D 6E6E 6E6F 7173 716C 6866 6360 5F65" $"727C 8288 8B8D 8F8F 8E8D 8C8C 8B8B 8B8B" $"8C8C 8D8D 8E90 9192 9495 9799 9A99 9794" $"8D8A 8E8F 8E8D 8B8A 8A8A 8A8A 8A8A 8A8A" $"8B8A 857F 7A76 716D 6E75 7975 7172 7574" $"7271 6F6E 6E6E 6E6E 6E6F 7072 7370 6C68" $"6562 5E60 6B76 7D84 898B 8D8F 8F8E 8D8C" $"8B8B 8B8B 8B8C 8C8D 8E8F 9091 9294 9597" $"999A 9896 918B 8B8F 8F8D 8C8B 8A8A 8A8A" $"8A89 898A 8A8C 8A85 7F7A 7570 6D6F 7677" $"7270 7375 7472 716F 6E6E 6E6D 6E6E 6F70" $"7273 706B 6764 605D 626F 797F 8588 8B8D" $"8F8F 8E8D 8C8B 8B8B 8B8B 8C8C 8D8E 8F90" $"9192 9495 9799 9896 948E 898C 8F8E 8D8C" $"8B8A 8A8A 8989 8989 8A8A 8C8A 847E 7974" $"6F6D 7277 7570 7174 7473 7270 6F6E 6E6E" $"6E6E 6E6F 7072 7370 6B67 635F 5E66 727A" $"8086 888B 8D8F 8E8D 8D8C 8B8B 8B8B 8B8B" $"8C8D 8D8E 9091 9294 9597 9896 9491 8A88" $"8D8F 8E8D 8B8A 8A8A 8A8A 8989 898A 8B8C" $"8A84 7E78 726E 6F75 7874 7072 7574 7372" $"706E 6E6E 6D6E 6E6E 6F71 7374 716C 6763" $"5F5F 6974 7B81 8689 8B8D 8F8E 8D8C 8C8B" $"8B8B 8B8B 8B8C 8C8D 8E8F 9092 9395 9796" $"9492 8C87 898E 8E8D 8C8B 8A8A 8A8A 8989" $"898A 8A8B 8C88 827C 7670 6F74 7979 7470" $"7275 7473 7270 6F6E 6E6E 6E6E 6F70 7173" $"7572 6D68 6460 616B 767C 8287 898C 8E8F" $"8E8D 8D8C 8B8B 8B8B 8B8B 8C8C 8D8E 8F90" $"9293 9596 9492 8E87 868B 8E8E 8D8C 8B8A" $"8A8A 8A8A 8A8A 8A8B 8D8C 8780 7A73 6F73" $"7A7B 7A74 7073 7574 7371 706F 6E6E 6E6E" $"6E6F 7071 7476 746E 6965 6062 6E77 7D83" $"878A 8C8F 8F8E 8E8D 8C8B 8B8B 8B8B 8B8C" $"8C8D 8E8F 9091 9394 9491 8E88 8387 8B8C" $"8D8C 8B8A 8A8A 8A8A 8A8A 8A8B 8C8D 8B84" $"7E77 7172 7A7D 7D7C 7470 7475 7473 716F" $"6E6E 6E6E 6E6E 6F70 7274 7675 706B 6561" $"646F 787E 8488 8A8D 8F8F 8E8E 8D8C 8B8B" $"8A8A 8B8B 8B8C 8D8D 8E90 9193 9290 8E88" $"8284 898A 8B8C 8B8B 8A8A 8A8A 8A8A 8A8A" $"8B8C 8D89 817A 7370 787F 7F7F 7C74 7174" $"7574 7270 6F6E 6E6D 6E6E 6E6F 7072 7477" $"7671 6C66 6267 727A 7F85 888B 8E8F 8F8E" $"8D8C 8C8B 8A8A 8A8A 8A8B 8B8C 8D8E 8F91" $"918E 8C88 8181 8688 898A 8B8B 8A8A 8A8A" $"8A8A 8A8A 8B8C 8D8B 847D 7671 777F 8281" $"807A 7272 7575 7472 706F 6E6E 6E6E 6E6F" $"7071 7375 7778 736D 6764 6A75 7C81 8689" $"8C8E 8F8F 8E8D 8D8C 8B8A 8A8A 8A8A 8B8B" $"8C8D 8E90 908E 8B87 807F 8386 8788 898A" $"8B8A 8A8A 8A8A 8A8A 8B8C 8E8D 8780 7873" $"767E 8384 827F 7871 7375 7573 7170 6E6E" $"6E6E 6E6F 6F70 7274 7678 7873 6D67 666F" $"787E 8387 8B8D 8E8F 8E8E 8D8C 8C8B 8A8A" $"8A8A 8A8B 8B8C 8D8E 8F8D 8A87 807D 8285" $"8687 8789 8A8B 8B8B 8A8A 8A8A 8B8C 8D8E" $"8B83 7A74 777E 8386 8581 7D76 7174 7674" $"7371 6F6E 6E6E 6E6F 6F70 7173 7577 7A79" $"746D 676A 747B 8085 898C 8E8E 8F8E 8E8D" $"8C8B 8B8A 8A8A 8A8A 8B8B 8C8D 8D8B 8985" $"7E7B 8083 8485 8687 888A 8B8B 8B8A 8A8A" $"8B8C 8D8E 8B84 7B75 787F 8386 8783 807A" $"7372 7575 7371 706E 6E6E 6E6E 6F70 7072" $"7476 797B 7973 6C69 6F79 7E83 888B 8D8E" $"8E8E 8E8D 8D8C 8B8A 8A8A 8A8A 8A8A 8B8C" $"8D8A 8783 7C7A 7F82 8283 8485 8789 8A8B" $"8B8B 8A8B 8B8C 8D8E 8C85 7C76 7980 8386" $"8885 827E 7671 7475 7472 706F 6E6E 6E6E" $"6F6F 7071 7375 787A 7C79 726C 6D76 7D82" $"8689 8C8D 8D8E 8E8E 8D8C 8B8A 8A89 8989" $"8A8A 8A8B 8B88 8581 7A79 7E80 8181 8283" $"8587 898B 8B8B 8A8B 8B8C 8D8E 8C86 7D78" $"7C82 8487 8987 8380 7A73 7275 7473 716F" $"6E6E 6E6E 6F6F 7071 7375 7779 7C7C 7770" $"6D74 7C80 8588 8B8D 8D8D 8E8E 8D8D 8C8B" $"8A8A 8989 898A 8A8B 8A86 837E 7879 7D7F" $"8080 8182 8486 888A 8B8B 8B8B 8C8C 8D8E" $"8C86 7D79 7F84 8587 8888 8582 7D75 7174" $"7573 7270 6E6E 6E6E 6F70 7071 7274 7779" $"7B7D 7C75 6F73 7B80 8488 8A8B 8C8D 8D8E" $"8D8D 8C8B 8B8A 8989 8989 8A8A 8884 817B" $"7679 7D7E 7F7F 8081 8385 8789 8B8B 8B8B" $"8C8D 8D8E 8D85 7D7C 8185 8688 8889 8783" $"7F77 7273 7574 7270 6F6E 6E6E 6F70 7071" $"7374 7679 7B7D 7E7A 7373 7B80 8388 8A8B" $"8C8C 8D8D 8D8D 8C8B 8B8A 8989 8989 8989" $"8683 7F78 7579 7C7D 7E7E 7F80 8284 8688" $"8A8B 8B8B 8C8D 8D8D 8C85 7E7F 8486 8788" $"8889 8783 807A 7272 7574 7271 6F6E 6E6F" $"6F70 7172 7374 7679 7B7D 7F7D 7674 7B81" $"8487 8A8A 8B8C 8C8D 8D8D 8C8B 8B8A 8989" $"8989 8988 8481 7C75 767A 7C7C 7C7D 7E7F" $"8183 8587 898A 8B8B 8C8D 8D8D 8B83 7F82" $"8787 8888 8889 8884 817B 7372 7574 7271" $"706F 6E6F 6F70 7172 7374 7678 7B7D 7F7F" $"7976 7B82 8487 8989 8A8B 8C8C 8C8C 8C8B" $"8B8A 8989 8888 8885 817E 7873 767B 7B7B" $"7B7C 7D7E 8082 8486 888A 8B8B 8C8C 8D8D" $"8983 8186 8887 8887 8789 8884 817B 7472" $"7474 7371 706F 6F6F 6F70 7172 7374 7678" $"7B7D 7F80 7C78 7D83 8588 8989 898A 8B8C" $"8C8C 8C8B 8B8A 8989 8888 8783 7F7B 7474" $"787A 7A7A 7B7B 7C7E 7F81 8385 8789 8B8B" $"8C8D 8C8C 8883 8589 8888 8887 8889 8884" $"817B 7472 7474 7371 706F 6F6F 7070 7172" $"7375 7779 7B7D 7F81 7E7A 7E84 8688 8989" $"898A 8A8B 8B8C 8B8B 8A8A 8988 8888 8480" $"7D76 7275 7979 7A7A 7A7B 7C7D 7F81 8385" $"8789 8B8C 8C8C 8C8A 8685 898A 8988 8787" $"8889 8884 817B 7472 7574 7372 7070 7070" $"7071 7273 7475 7779 7C7E 8081 7F7D 8186" $"8889 8A89 8989 8A8B 8B8B 8B8B 8A8A 8988" $"8886 817E 7973 7377 7979 7979 797A 7B7D" $"7F81 8384 8689 8B8C 8C8C 8C89 8689 8B8A" $"8988 8787 8889 8884 817B 7472 7574 7372" $"7170 7070 7171 7273 7476 787A 7C7E 8081" $"807F 8388 898A 8988 8889 898A 8B8B 8B8B" $"8A8A 8888 8783 7E7B 7472 7678 7878 7878" $"797A 7B7D 7F80 8284 8688 8B8C 8C8B 8A89" $"8A8C 8B89 8887 8787 8889 8883 807A 7372" $"7574 7372 7170 7071 7172 7374 7577 797B" $"7D7F 8181 8282 868A 8A8A 8988 8888 898A" $"8A8B 8B8A 8A89 8988 847F 7B75 7174 7778" $"7777 7778 787A 7B7D 7F80 8284 8688 8B8C" $"8B8A 898B 8E8D 8B89 8887 8787 8889 8782" $"7F78 7273 7574 7372 7170 7171 7273 7475" $"7677 797B 7E80 8182 8284 898C 8C8B 8988" $"8888 8989 8A8A 8A8A 8989 8885 807C 7771" $"7377 7777 7776 7777 787A 7B7D 7E80 8284" $"8688 8A8B 8A8A 8C8F 8E8C 8A88 8787 8788" $"8989 8681 7E77 7274 7574 7372 7171 7172" $"7374 7476 7778 7A7C 7F81 8282 8488 8D8E" $"8C8A 8887 8788 8889 898A 8A8A 8989 8681" $"7D78 7273 7677 7776 7676 7677 797A 7C7D" $"7E80 8284 8688 8A8A 898C 9090 8D8B 8887" $"8787 8788 8988 8480 7B74 7275 7574 7372" $"7272 7272 7374 7576 7879 7B7E 8081 8283" $"868C 8F8E 8C8A 8887 8787 8889 8989 8989" $"8986 817D 7872 7276 7777 7676 7576 7778" $"797B 7C7D 7F80 8385 8789 8989 8D92 918E" $"8C89 8787 8787 8888 8986 827E 7873 7375" $"7574 7372 7272 7373 7475 7677 797B 7D7F" $"8182 8384 8A90 918E 8C89 8787 8787 8888" $"8989 8989 8681 7D78 7373 7677 7676 7575" $"7576 7778 7A7B 7C7D 7F81 8385 8788 898D" $"9393 8F8C 8988 8786 8787 8888 8884 807B" $"7572 7475 7574 7372 7273 7374 7576 7778" $"7A7C 7E80 8283 8386 8E93 918E 8B89 8787" $"8787 8888 8889 8986 817D 7873 7376 7776" $"7675 7575 7576 7779 7A7B 7C7E 7F81 8385" $"8688 8E94 9390 8D8A 8786 8686 8787 8888" $"8581 7E78 7373 7675 7574 7373 7373 7475" $"7677 787A 7B7D 7F81 8383 848B 9393 8F8D" $"8A88 8686 8687 8788 8888 8580 7D78 7374" $"7777 7676 7574 7475 7677 7879 7A7B 7D7E" $"8082 8384 868E 9594 908D 8A88 8686 8686" $"8787 8887 827E 7B75 7375 7675 7574 7373" $"7474 7576 7778 797B 7D7F 8082 8384 8891" $"9592 8E8B 8987 8686 8686 8787 8885 807D" $"7874 7578 7777 7675 7575 7576 7778 7979" $"7A7C 7D7F 8182 8385 8C95 9591 8E8A 8886" $"8686 8686 8787 8784 7F7C 7673 7576 7675" $"7574 7474 7475 7677 7879 7B7C 7E80 8183" $"8385 8D95 9490 8D89 8786 8686 8686 8787" $"8580 7D78 7475 7878 7776 7575 7575 7677" $"7878 797A 7B7D 7E80 8182 848B 9496 928F" $"8B88 8786 8586 8687 8787 8581 7D78 7474" $"7777 7675 7474 7474 7576 7778 797A 7C7D" $"7F81 8283 848B 9495 928F 8B88 8786 8586" $"8686 8785 817E 7975 7578 7878 7776 7575" $"7575 7677 7879 7A7B 7C7E 7F81 8283 8992" $"9694 908C 8987 8685 8586 8686 8785 817E" $"7A74 7477 7776 7675 7474 7575 7677 7879" $"7A7B 7D7E 8081 8283 8892 9693 908C 8987" $"8685 8585 8686 8581 7E7B 7675 7879 7877" $"7675 7575 7676 7778 7979 7A7C 7D7F 8081" $"8287 8F96 9591 8D89 8786 8585 8585 8686" $"8581 7E7A 7574 7777 7776 7575 7475 7576" $"7778 7879 7A7C 7E7F 8081 8287 8F95 9491" $"8D89 8786 8585 8585 8685 827E 7B77 7578" $"7978 7777 7675 7575 7677 7878 797A 7B7C" $"7E7F 8081 858C 9496 938F 8B88 8685 8585" $"8585 8685 817E 7B76 7577 7877 7675 7575" $"7575 7677 7878 797A 7B7D 7E80 8182 858D" $"9495 928E 8A88 8685 8585 8585 8683 7F7D" $"7975 7779 7978 7776 7676 7676 7778 7979" $"7A7B 7C7D 7F80 8183 8991 9595 918D 8987" $"8685 8484 8585 8582 7F7C 7775 7778 7877" $"7675 7575 7576 7777 7879 797B 7C7D 7F80" $"8183 8A92 9593 8F8B 8987 8584 8485 8585" $"8480 7D7A 7777 797A 7978 7776 7676 7677" $"7879 7979 7A7B 7D7E 7F80 8286 8E93 9593" $"8F8B 8886 8584 8484 8585 837F 7D79 7577" $"7978 7877 7675 7575 7677 7778 7879 7A7B" $"7D7E 7F80 8288 8F94 9491 8D8A 8886 8584" $"8485 8585 827E 7C78 7679 7A7A 7978 7777" $"7676 7778 7979 797A 7B7C 7D7F 8081 848A" $"9195 9491 8D8A 8886 8584 8484 8584 807E" $"7A77 7779 7978 7776 7675 7576 7677 7878" $"7979 7A7C 7D7E 7F80 848B 9194 938F 8C89" $"8785 8484 8485 8584 807D 7A77 777A 7A7A" $"7978 7777 7677 7778 7979 7A7B 7B7D 7E7F" $"8081 858D 9294 9490 8C89 8785 8484 8484" $"8481 7E7C 7876 7879 7978 7776 7675 7676" $"7777 7878 797A 7B7C 7D7E 7F82 888E 9294" $"928E 8A88 8685 8484 8484 8582 7E7C 7976" $"787B 7A79 7878 7777 7777 7879 797A 7A7B" $"7C7D 7E7F 8082 888E 9294 938F 8B89 8685" $"8484 8484 827F 7D7A 7777 7A7A 7978 7776" $"7676 7676 7777 7878 797A 7B7C 7D7E 7F84" $"8B90 9293 908C 8987 8584 8484 8484 8380" $"7D7B 7877 7A7B 7A79 7978 7777 7778 7879" $"797A 7A7B 7C7D 7E7F 8083 8A90 9294 928F" $"8B88 8685 8484 8483 807E 7C78 7779 7A7A" $"7978 7776 7676 7677 7778 7878 797A 7B7C" $"7D7E 8086 8C8F 9192 8F8B 8986 8584 8384" $"8484 837F 7D7A 7778 7B7B 7A79 7978 7777" $"7778 7979 7A7A 7B7B 7C7D 7E7F 8184 8B90" $"9293 928E 8B88 8685 8483 8382 7F7D 7B77" $"787A 7A7A 7978 7776 7676 7777 7878 7879" $"797A 7B7C 7D7E 8289 8D8F 9191 8E8B 8886" $"8584 8383 8484 817E 7C79 7779 7B7B 7B7A" $"7978 7878 7878 797A 7A7A 7B7C 7D7E 7F80" $"8186 8D90 9293 928E 8A88 8685 8483 8381" $"7E7C 7977 797B 7B7A 7978 7777 7676 7778" $"7878 7879 797A 7B7C 7D7F 838A 8D8F 9191" $"8E8A 8886 8484 8383 8484 817E 7C79 787A" $"7C7B 7B7A 7978 7878 7879 797A 7A7A 7B7C" $"7D7E 7E7F 8187 8D90 9192 918E 8A88 8684" $"8383 8380 7D7B 7877 797B 7B7A 7978 7777" $"7777 7778 7878 7879 797A 7B7C 7D7F 848A" $"8D8F 9090 8E8B 8886 8483 8383 8383 807D" $"7C79 787A 7C7B 7B7A 7978 7878 7879 797A" $"7A7A 7B7C 7C7D 7E7F 8288 8D8F 9192 918E" $"8B88 8684 8383 827F 7D7B 7877 7A7B 7B7A" $"7978 7777 7777 7778 7878 7879 797A 7B7C" $"7D7F 858B 8D8E 9090 8E8A 8886 8483 8383" $"8382 7F7D 7B79 787A 7C7B 7B7A 7978 7878" $"7879 797A 7A7A 7B7B 7C7D 7E7F 8287 8D8F" $"9091 918F 8B88 8685 8483 827E 7C7B 7878" $"7A7B 7B7A 7978 7777 7777 7878 7878 7879" $"797A 7B7C 7D80 858A 8C8E 8F8F 8E8B 8886" $"8483 8383 8382 7F7D 7B79 787B 7C7B 7B7A" $"7978 7878 7879 797A 7A7A 7B7B 7C7D 7E7F" $"8186 8C8E 9091 918F 8C89 8785 8483 827E" $"7C7A 7878 7B7C 7B7A 7978 7877 7777 7878" $"7878 7879 797A 7B7C 7D80 858A 8C8D 8E8F" $"8E8C 8986 8584 8383 8382 7F7D 7B79 787B" $"7C7C 7B7A 7979 7878 7879 7A7A 7A7A 7B7B" $"7C7D 7E7F 8186 8B8E 8F90 9190 8D8A 8886" $"8483 827E 7C7A 7878 7B7C 7B7B 7A79 7877" $"7777 7878 7878 7879 797A 7B7B 7C7F 8489" $"8C8D 8E8F 8E8C 8987 8584 8383 8383 807D" $"7C7A 787A 7C7C 7B7A 7A79 7978 7879 7A7A" $"7A7A 7B7B 7C7D 7E7E 8085 8A8D 8F90 9090" $"8E8B 8886 8483 827E 7C7A 7878 7B7C 7C7B" $"7A79 7878 7777 7878 7878 7879 797A 7A7B" $"7C7F 8489 8B8C 8D8E 8E8C 8A88 8684 8383" $"8383 807D 7C7A 787A 7C7C 7C7B 7A79 7978" $"7879 7A7A 7A7A 7A7B 7C7C 7D7E 8084 898C" $"8E8F 9090 8F8D 8A87 8584 827E 7C7A 7878" $"7A7C 7C7B 7A79 7878 7777 7878 7878 7878" $"7979 7A7B 7B7E 8388 8A8B 8C8D 8E8D 8B88" $"8684 8383 8282 817E 7C7B 7979 7B7C 7C7B" $"7A79 7978 7879 797A 7A7A 7A7B 7B7C 7D7E" $"7F82 878B 8D8E 8F90 908E 8B88 8684 837F" $"7C7B 7877 7A7C 7C7B 7A7A 7978 7878 7878" $"7878 7878 7979 7A7A 7B7D 8287 898B 8B8C" $"8E8E 8C89 8785 8483 8383 827F 7C7B 7979" $"7B7C 7C7B 7B7A 7979 7979 797A 7A7A 7A7B" $"7B7C 7C7D 7E80 858A 8C8E 8F8F 8F8F 8D8A" $"8785 8480 7D7B 7977 797C 7C7B 7B7A 7978" $"7878 7878 7878 7878 7879 797A 7B7C 8085" $"888A 8B8C 8C8D 8C8A 8886 8483 8382 8280" $"7D7C 7A79 7A7C 7C7C 7B7A 7A79 7979 797A" $"7A7A 7A7A 7B7C 7C7D 7E7F 8288 8B8D 8E8F" $"8F8F 8E8C 8987 8582 7E7C 7A77 787B 7C7C" $"7B7A 7A79 7878 7878 7878 7878 7879 797A" $"7A7B 7E83 8789 8A8B 8C8D 8D8B 8987 8584" $"8382 8281 7E7C 7B79 797B 7D7C 7C7B 7A79" $"7979 797A 7A7A 7A7A 7B7B 7C7D 7D7E 8085" $"8A8C 8D8E 8F8F 8F8E 8B88 8684 7F7C 7B78" $"787A 7C7C 7B7B 7A79 7978 7878 7878 7878" $"7878 7979 7A7B 7C81 8688 898A 8B8C 8D8C" $"8A88 8685 8483 8282 807D 7C7A 797A 7C7D" $"7C7B 7B7A 7979 7979 7A7A 7A7A 7A7B 7B7C" $"7D7E 7F82 878B 8C8D 8E8F 8F8F 8D8A 8886" $"817D 7B79 7779 7B7C 7C7B 7A7A 7979 7878" $"7978 7878 7878 7979 797A 7B7E 8387 8889" $"8A8B 8B8C 8B89 8886 8483 8382 817F 7C7B" $"7A79 7B7C 7C7C 7B7A 7A79 7979 797A 7A7A" $"7A7A 7B7B 7C7D 7E7F 8388 8B8C 8D8E 8F8F" $"8E8D 8A88 8480 7D7B 7878 7A7C 7C7B 7B7A" $"7A79 7978 7979 7878 7878 7879 7979 7A7C" $"8185 8788 898A 8B8B 8C8B 8987 8584 8382" $"8281 7E7C 7B79 7A7C 7D7D 7C7B 7A7A 7979" $"797A 7A7A 7A7A 7B7B 7C7C 7D7E 8085 898B" $"8C8D 8E8E 8E8E 8D8A 8783 7F7C 7A78 797B" $"7C7C 7B7B 7A7A 7979 7979 7978 7878 7879" $"7979 7A7B 7D82 8687 8889 8A8A 8B8C 8A88" $"8785 8483 8282 807D 7C7A 797A 7D7D 7D7C" $"7B7A 7A79 797A 7A7A 7A7A 7A7B 7B7C 7D7D" $"7F82 868A 8B8C 8D8E 8E8E 8E8C 8A86 827E" $"7C79 787A 7C7C 7C7B 7B7A 7A79 7979 7979" $"7978 7878 7979 797A 7B7F 8386 8788 898A" $"8A8B 8B8A 8887 8584 8382 817E 7C7B 7A79" $"7B7D 7D7C 7C7B 7A7A 7979 7A7A 7A7A 7A7A" $"7B7B 7C7D 7E7F 8388 8A8B 8C8D 8E8E 8E8E" $"8C89 8581 7D7B 7878 7A7C 7C7C 7B7B 7A7A" $"7979 7979 7979 7878 7979 7979 7A7C 8084" $"8687 8889 8A8A 8B8B 8A89 8785 8483 8280" $"7D7C 7B79 7A7C 7D7D 7C7B 7B7A 7A79 7A7A" $"7A7A 7A7A 7A7B 7B7C 7D7E 8185 898A 8B8C" $"8C8D 8E8E 8D8B 8884 807D 7B78 797B 7C7C" $"7C7B 7B7A 7A79 7979 7979 7979 7979 7979" $"7A7B 7D81 8586 8788 8989 8A8B 8B8A 8987" $"8584 8381 7E7C 7B79 797B 7D7D 7D7C 7B7A" $"7A7A 797A 7A7A 7A7A 7A7A 7B7B 7C7D 7F83" $"8789 8A8A 8B8C 8D8D 8D8C 8A87 837F 7C7A" $"7879 7B7C 7C7C 7B7B 7A7A 7979 7979 7979" $"7979 7979 797A 7B7D 8285 8687 8889 8A8A" $"8B8C 8B89 8785 8482 7F7C 7B7A 797A 7D7D" $"7D7C 7C7B 7A7A 7A7A 7A7A 7A7A 7A7A 7A7B" $"7B7C 7E80 8588 8989 8A8B 8C8C 8D8D 8B89" $"8682 7E7C 7A78 797B 7C7C 7C7B 7A7A 7A79" $"797A 7A79 7979 7979 797A 7A7B 7E82 8587" $"8888 898A 8A8B 8C8C 8A87 8584 817D 7C7A" $"797A 7C7D 7D7D 7C7B 7B7A 7A7A 7A7A 7A7A" $"7A7A 7A7A 7B7B 7C7F 8386 8888 898A 8B8B" $"8C8D 8C8A 8885 817E 7C7A 787A 7C7C 7C7C" $"7B7B 7A7A 7A7A 7A7A 7979 7979 797A 7A7B" $"7C7F 8386 8788 8889 8A8B 8B8C 8C8A 8786" $"837F 7C7B 7979 7B7D 7D7D 7C7C 7B7B 7A7A" $"7A7A 7A7A 7A7A 7A7A 7A7B 7C7E 8285 8788" $"8889 8A8A 8B8C 8C8B 8886 8480 7D7B 7978" $"7A7D 7D7D 7C7B 7B7A 7A7A 7A7A 7A7A 7979" $"797A 7A7B 7B7D 8084 8687 8889 898A 8B8B" $"8C8C 8987 8480 7D7B 7979 7B7D 7D7D 7C7C" $"7B7B 7A7A 7A7A 7A7A 7A7A 797A 7A7B 7B7D" $"8084 8687 8788 8989 8A8B 8B8B 8987 8583" $"7F7C 7B79 797B 7D7D 7D7C 7B7B 7A7A 7A7A" $"7A7A 7A79 797A 7A7A 7B7C 7D81 8587 8788" $"8989 8A8B 8C8C 8B89 8682 7E7C 7A79 7A7C" $"7D7D 7C7C 7B7B 7B7A 7B7B 7A7A 7A7A 797A" $"7A7A 7B7D 8084 8586 8787 8888 898A 8A8B" $"8A88 8684 817D 7C7A 797A 7C7D 7D7C 7C7B" $"7B7A 7A7A 7A7A 7A7A 797A 7A7A 7B7B 7C7F" $"8386 8788 8889 8A8A 8B8C 8C8B 8883 7F7D" $"7B7A 7B7C 7D7C 7C7C 7B7B 7B7B 7B7B 7A7A" $"7A7A 7A79 7A7A 7B7C 7F83 8585 8686 8788" $"8889 8A8A 8988 8684 827F 7C7B 7A79 7B7D" $"7D7D 7C7C 7B7A 7A7A 7A7A 7A7A 7A7A 7A7A" $"7B7B 7C7E 8185 8787 8889 898A 8B8C 8C8B" $"8A85 817E 7B7A 7B7C 7C7C 7C7C 7B7B 7B7B" $"7B7B 7B7A 7A7A 7A79 7A7A 7B7C 7F83 8485" $"8586 8687 8788 8989 8988 8685 8380 7D7C" $"7B79 7A7C 7D7D 7D7C 7B7B 7A7A 7A7A 7B7A" $"7A7A 7A7A 7B7B 7C7D 7F83 8687 8888 898A" $"8A8B 8B8B 8A86 827F 7C7B 7C7D 7D7C 7C7C" $"7B7B 7B7B 7B7B 7B7B 7A7A 7A7A 7A7A 7B7C" $"8083 8484 8585 8686 8788 8889 8987 8685" $"8381 7E7C 7B7A 7A7B 7D7D 7D7C 7C7B 7B7A" $"7A7B 7B7A 7A7A 7B7B 7B7B 7C7D 7E82 8587" $"8888 8989 8A8B 8B8B 8A86 8380 7D7C 7D7D" $"7D7C 7C7C 7B7B 7B7B 7B7B 7B7B 7A7A 7A7A" $"7A7A 7B7D 8083 8384 8485 8586 8687 8788" $"8887 8584 8382 807D 7C7B 7A7B 7D7D 7D7D" $"7C7B 7B7B 7A7B 7B7B 7B7B 7B7B 7B7B 7C7C" $"7E81 8486 8788 8989 8A8A 8B8B 8986 8481" $"7E7D 7E7E 7D7C 7C7B 7B7B 7B7B 7C7C 7B7B" $"7A7A 7A7A 7A7A 7B7D 8183 8384 8484 8585" $"8686 8787 8786 8584 8382 807D 7C7B 7A7A" $"7C7D 7D7D 7C7C 7B7B 7B7B 7B7B 7B7B 7B7B" $"7B7B 7C7C 7D7F 8386 8788 8889 898A 8A8A" $"8885 8482 7F7E 7F7E 7D7C 7C7B 7B7B 7B7B" $"7C7C 7B7B 7B7A 7A7A 7A7A 7C7E 8182 8383" $"8484 8485 8586 8687 8786 8483 8382 817E" $"7C7B 7A7A 7C7D 7D7D 7C7C 7B7B 7B7B 7B7B" $"7B7B 7B7B 7B7C 7C7D 7D7F 8285 8787 8889" $"898A 8A89 8685 8482 8080 807F 7E7D 7C7B" $"7B7B 7B7C 7C7C 7B7B 7B7A 7A7A 7A7B 7C7F" $"8282 8383 8384 8484 8585 8686 8685 8483" $"8282 817E 7C7C 7A7A 7C7D 7D7D 7D7C 7C7B" $"7B7B 7B7B 7B7B 7B7B 7C7C 7C7D 7D7F 8285" $"8787 8888 898A 8A88 8584 8382 8181 817F" $"7E7D 7C7B 7B7B 7C7C 7C7C 7C7B 7B7B 7B7A" $"7B7B 7D80 8282 8283 8383 8484 8585 8586" $"8684 8382 8282 817F 7D7C 7B7A 7C7E 7E7D" $"7D7C 7C7B 7B7B 7B7B 7B7C 7B7C 7C7C 7C7D" $"7E7F 8285 8687 8888 8989 8987 8584 8382" $"8382 817F 7E7D 7C7C 7B7B 7C7C 7C7C 7C7B" $"7B7B 7B7B 7B7C 7F81 8282 8282 8383 8384" $"8485 8585 8584 8382 8281 817F 7D7C 7B7B" $"7C7E 7E7D 7D7C 7C7B 7B7B 7B7C 7C7C 7C7C" $"7C7C 7D7D 7E7F 8285 8687 8888 8989 8785" $"8483 8283 8483 8180 7E7C 7C7C 7B7C 7C7C" $"7C7C 7C7B 7B7B 7B7B 7C7E 8081 8282 8282" $"8383 8383 8484 8585 8483 8281 8181 817F" $"7D7C 7B7B 7C7E 7E7D 7D7C 7C7C 7B7B 7B7C" $"7C7C 7C7C 7C7C 7D7D 7E7F 8285 8787 8788" $"8888 8684 8382 8284 8583 8180 7E7D 7C7C" $"7B7C 7C7C 7C7C 7C7B 7B7B 7B7C 7D7F 8181" $"8182 8282 8283 8383 8484 8484 8382 8181" $"8181 807E 7D7C 7B7B 7C7E 7E7D 7D7C 7C7C" $"7B7B 7C7C 7C7C 7C7C 7C7D 7D7D 7E80 8285" $"8687 8788 8886 8484 8382 8385 8583 8280" $"7E7D 7C7C 7C7C 7C7C 7C7C 7C7B 7B7B 7C7D" $"7F80 8181 8182 8282 8282 8383 8384 8483" $"8281 8180 8080 807E 7D7C 7B7B 7D7E 7E7D" $"7D7C 7C7B 7B7B 7C7C 7C7C 7C7C 7D7D 7D7E" $"7E80 8385 8687 8788 8685 8483 8283 8485" $"8583 8180 7E7D 7C7C 7C7C 7C7C 7C7C 7C7C" $"7C7C 7C7E 8081 8181 8181 8282 8282 8383" $"8383 8382 8181 8080 8080 807E 7D7C 7B7B" $"7D7E 7E7D 7D7D 7C7C 7C7C 7C7D 7D7D 7D7D" $"7D7D 7E7E 7F81 8486 8787 8787 8584 8382" $"8284 8585 8483 8180 7E7D 7D7D 7C7C 7C7C" $"7C7C 7C7C 7C7D 7E80 8181 8181 8181 8182" $"8282 8283 8383 8381 8180 8080 8080 7F7E" $"7D7C 7B7C 7D7E 7E7D 7D7C 7C7C 7C7C 7D7D" $"7D7D 7D7D 7D7D 7E7E 7F81 8486 8687 8684" $"8383 8282 8485 8584 8483 817F 7E7D 7D7D" $"7C7C 7C7C 7C7C 7C7C 7D7E 8081 8181 8181" $"8181 8182 8282 8283 8383 8181 807F 7F7F" $"8080 7F7D 7D7C 7C7C 7E7E 7E7D 7D7C 7C7C" $"7C7C 7D7D 7D7D 7D7D 7D7E 7E7F 8082 8586" $"8686 8483 8382 8283 8484 8484 8382 807F" $"7E7E 7D7D 7C7C 7C7C 7C7C 7C7D 7E80 8181" $"8181 8181 8181 8181 8282 8282 8281 8080" $"7F7F 7F7F 807F 7E7D 7D7C 7C7D 7E7E 7E7D" $"7C7C 7C7C 7C7D 7D7D 7D7D 7D7D 7E7E 7F7F" $"8183 8586 8584 8383 8282 8384 8484 8483" $"8382 807F 7E7E 7D7D 7C7C 7C7C 7C7C 7D7E" $"8081 8181 8181 8181 8181 8181 8282 8282" $"8180 807F 7F7F 7F7F 807F 7E7D 7C7C 7D7E" $"7E7E 7D7D 7D7C 7C7D 7D7D 7D7D 7D7D 7E7E" $"7E7E 7F80 8284 8585 8483 8282 8283 8484" $"8484 8383 8281 807F 7E7E 7D7C 7C7C 7C7C" $"7C7D 7E80 8181 8181 8181 8181 8181 8181" $"8182 8281 8080 7F7F 7F7F 7F7F 7F7E 7D7D" $"7C7C 7D7E 7E7E 7D7D 7D7D 7D7D 7D7D 7E7E" $"7E7E 7E7E 7E7F 8081 8385 8583 8382 8282" $"8384 8484 8483 8383 8281 807F 7E7D 7D7C" $"7C7C 7C7D 7D7F 8081 8181 8180 8081 8181" $"8181 8181 8182 8180 807F 7F7F 7F7F 7F7F" $"7E7D 7D7C 7C7D 7E7E 7E7D 7D7D 7D7D 7D7D" $"7E7E 7E7E 7E7E 7E7E 7F7F 8183 8484 8382" $"8282 8283 8484 8483 8383 8382 8281 807F" $"7E7D 7D7C 7C7C 7D7D 7F80 8181 8181 8080" $"8081 8181 8181 8181 8181 8080 7F7F 7E7E" $"7F7F 7F7F 7D7D 7D7C 7D7E 7E7E 7E7D 7D7D" $"7D7D 7D7E 7E7E 7E7E 7E7E 7E7F 7F80 8284" $"8483 8282 8282 8384 8484 8383 8382 8282" $"8180 7F7E 7D7D 7C7C 7C7D 7D7F 8081 8181" $"8180 8080 8080 8181 8181 8181 8181 807F" $"7F7E 7E7E 7F7F 7F7E 7D7D 7C7C 7E7E 7E7E" $"7D7D 7D7D 7D7D 7E7E 7E7E 7E7E 7E7E 7F7F" $"8081 8383 8282 8281 8283 8484 8383 8383" $"8282 8282 8180 7F7E 7D7D 7C7D 7D7D 7E80" $"8181 8181 8080 8080 8080 8181 8181 8181" $"8180 7F7F 7E7E 7E7F 7F7F 7E7D 7D7D 7D7D" $"7E7E 7E7E 7D7D 7D7D 7D7E 7E7E 7E7E 7E7E" $"7E7F 7F80 8183 8382 8282 8181 8384 8483" $"8383 8382 8282 8281 807F 7E7D 7D7D 7D7D" $"7D7E 8081 8181 8180 8080 8080 8080 8181" $"8181 8181 8080 7F7F 7E7E 7F7F 7F7E 7D7D" $"7D7D 7D7E 7E7E 7E7E 7D7D 7D7D 7E7E 7E7E" $"7E7E 7E7E 7E7F 7F81 8283 8282 8281 8182" $"8383 8383 8383 8282 8282 8280 7F7E 7E7D" $"7D7D 7D7D 7E7F 8081 8181 8080 8080 8080" $"8080 8181 8181 8181 807F 7F7F 7E7F 7F7F" $"7E7D 7D7D 7D7D 7E7F 7E7E 7E7E 7D7D 7D7E" $"7E7E 7E7E 7E7E 7E7E 7F7F 8082 8382 8181" $"8181 8283 8383 8383 8382 8282 8282 8180" $"7F7E 7D7D 7D7D 7D7E 7F80 8181 8180 8080" $"8080 8080 8080 8181 8181 8180 807F 7F7F" $"7F7F 7F7E 7D7D 7D7D 7D7E 7F7E 7E7E 7E7E" $"7D7D 7E7E 7E7E 7E7E 7E7E 7E7F 7F80 8183" $"8382 8181 8181 8283 8383 8383 8282 8282" $"8281 807F 7E7E 7D7D 7D7D 7E7F 8080 8080" $"8080 8080 8080 8080 8080 8081 8181 8180" $"807F 7F7F 7F7F 7E7D 7D7D 7D7D 7E7F 7E7E" $"7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7F" $"7F81 8283 8281 8181 8182 8383 8383 8282" $"8282 8282 8281 807F 7E7E 7D7D 7D7D 7E7F" $"8080 8080 8080 8080 8080 8080 8080 8081" $"8181 8180 7F7F 7F7F 7F7E 7D7D 7D7D 7D7E" $"7F7F 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E" $"7E7E 7F7F 8081 8282 8181 8181 8182 8383" $"8383 8282 8282 8282 8180 807F 7E7E 7D7D" $"7D7E 7F80 8080 8080 8080 8080 8080 8080" $"8080 8081 8181 8180 7F7F 7F7F 7F7E 7D7D" $"7D7D 7D7E 7F7F 7E7E 7E7E 7E7E 7E7E 7E7E" $"7E7E 7E7E 7E7E 7F80 8182 8281 8181 8181" $"8182 8383 8382 8282 8282 8282 8180 7F7F" $"7E7E 7D7D 7E7E 7F80 8080 8080 8080 8080" $"8080 8080 8080 8081 8181 8080 7F7F 7F7F" $"7E7D 7D7D 7D7D 7E7F 7F7F 7E7E 7E7E 7E7E" $"7E7E 7E7E 7E7E 7E7E 7E7F 7F80 8182 8281" $"8181 8181 8282 8383 8282 8282 8282 8282" $"8180 7F7E 7E7E 7E7E 7E7F 7F80 8080 8080" $"8080 8080 8080 8080 8080 8081 8181 8080" $"7F7F 7F7F 7E7D 7D7D 7D7E 7E7F 7F7E 7E7E" $"7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7F 7F80" $"8282 8181 8080 8081 8282 8282 8282 8282" $"8282 8281 8180 7F7E 7E7E 7E7E 7E7F 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8181 8080 7F7F 7F7E 7D7D 7D7D 7D7E 7F7F" $"7F7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E" $"7F7F 8081 8282 8180 8080 8081 8282 8282" $"8282 8281 8181 8281 8180 7F7E 7E7E 7E7E" $"7E7F 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8181 8080 7F7F 7F7E 7D7D 7D7D" $"7D7E 7F7F 7F7E 7E7E 7E7E 7E7E 7E7E 7E7E" $"7E7E 7E7E 7F7F 8081 8281 8180 8080 8081" $"8282 8282 8282 8281 8181 8181 8080 7F7F" $"7E7E 7E7E 7E7F 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8081 8080 807F 7F7E" $"7D7D 7D7D 7E7F 7F7F 7F7E 7E7E 7E7E 7E7E" $"7E7E 7E7E 7E7E 7E7E 7F7F 8081 8181 8080" $"8080 8081 8282 8282 8282 8181 8181 8181" $"8080 7F7F 7E7E 7E7E 7F7F 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8081 8080" $"807F 7F7E 7D7D 7D7D 7E7F 7F7F 7F7E 7E7E" $"7E7E 7E7E 7E7E 7E7E 7E7E 7E7F 7F7F 8081" $"8181 8080 8080 8081 8282 8282 8281 8181" $"8181 8181 8080 7F7F 7E7E 7E7E 7F7F 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 807F 7F7E 7D7D 7D7D 7E7F 7F7F" $"7F7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7F" $"7F7F 8081 8181 8080 8080 8081 8282 8282" $"8281 8181 8181 8181 8180 7F7F 7E7E 7E7E" $"7F7F 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 807F 7F7E 7D7D 7D7D" $"7E7F 7F7F 7F7F 7E7E 7E7E 7E7F 7F7E 7E7E" $"7E7E 7E7F 7F7F 8081 8181 8080 8080 8081" $"8282 8282 8181 8181 8181 8181 8180 7F7F" $"7F7E 7E7E 7F7F 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 807F 7F7E" $"7D7D 7D7D 7E7F 7F7F 7F7F 7E7E 7E7E 7E7F" $"7F7E 7E7E 7E7E 7E7F 7F7F 8081 8181 8080" $"8080 8081 8182 8281 8181 8181 8181 8181" $"8180 807F 7F7E 7E7E 7F7F 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 7F7E 7E7D 7D7D 7E7F 7F7F 7F7F 7E7E" $"7E7E 7F7F 7F7F 7E7E 7E7E 7E7F 7F7F 8081" $"8181 8080 8080 8080 8181 8181 8181 8181" $"8181 8181 8180 807F 7F7F 7E7E 7F7F 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 7F7E 7E7E 7D7E 7E7F 7F7F" $"7F7F 7F7E 7E7E 7F7F 7F7F 7F7E 7E7E 7F7F" $"7F7F 8080 8181 8080 8080 8080 8181 8181" $"8181 8181 8181 8181 8180 807F 7F7F 7F7F" $"7F7F 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 807F 7E7E 7E7E" $"7E7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7E7E 7F7F 7F7F 8080 8181 8080 8080 8080" $"8081 8181 8181 8181 8181 8181 8181 8080" $"7F7F 7F7F 7F7F 7F80 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 807F" $"7E7E 7E7E 7E7E 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F80 8080 8080" $"8080 8080 8081 8181 8181 8181 8181 8181" $"8181 8080 7F7F 7F7F 7F7F 7F80 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 807F 7F7E 7E7E 7E7E 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F80" $"8080 8080 807F 7F80 8080 8181 8181 8181" $"8181 8181 8181 8180 807F 7F7F 7F7F 7F7F" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 7F7F 7E7E 7E7E 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F80 8080 8080 807F 7F7F 8080 8081" $"8181 8181 8181 8181 8181 8180 8080 7F7F" $"7F7F 7F7F 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 807F 7E7E" $"7E7E 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 8080 8080 8080 7F7F" $"7F80 8080 8181 8181 8181 8080 8081 8180" $"8080 807F 7F7F 7F7F 7F80 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"807F 7F7F 7E7E 7E7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 8080 8080" $"8080 7F7F 7F7F 8080 8081 8181 8181 8080" $"8080 8080 8080 807F 7F7F 7F7F 7F7F 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 7F7F 7F7E 7E7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F80 8080 8080 807F 7F7F 7F80 8080 8181" $"8181 8080 8080 8080 8080 8080 7F7F 7F7F" $"7F7F 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 807F 7F7F 7E7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 8080 8080 807F 7F7F 7F80" $"8080 8080 8080 8080 8080 8080 8080 8080" $"807F 7F7F 7F7F 7F80 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 807F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F80 8080 8080" $"7F7F 7F7F 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 7F7F 7F7F 7F80 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F80" $"8080 8080 7F7F 7F7F 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 807F 7F7F 7F7F" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 807F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 8080 8080 807F 7F7F 7F80 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"807F 7F7F 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F80 8080 807F 7F7F" $"7F80 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 8080" $"807F 7F7F 7F7F 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 7F7F 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 807F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F80 807F 7F7F 7F7F 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 807F 7F80 8080 8080 8080" $"8080 8080 8080 8080 8080 807F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F80 807F 7F7F 7F7F 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 7F80 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"7F7F 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 807F 7F80 8080 8080 8080 8080" $"8080 8080 8080 8080 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 807F 7F7F 8080 8080" $"8080 8080 8080 8080 8080 8080 807F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 807F 7F7F" $"7F80 8080 8080 8080 8080 8080 8080 8080" $"807F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 7F7F 7F80 8080 8080 8080 8080 8080" $"8080 8080 807F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 7F7F 7F80 8080 8080 8080" $"8080 8080 8080 8080 807F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F80 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 807F 7F80 8080" $"8080 8080 8080 8080 8080 8080 807F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080" } }; resource 'snd ' (17411, "Magic Flute", purgeable) { FormatOne { { /* array Synthesizers: 1 elements */ /* [1] */ sampledSynth, 160 } }, { /* array SoundCmnds: 1 elements */ /* [1] */ hasData, bufferCmd { 20 } }, { /* array DataTables: 1 elements */ /* [1] */ 17174, Rate22K, 17172, 17173, 0x0, 0x3C, $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"7F7F 807F 8080 8080 7F80 8080 8080 8080" $"7F80 8080 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 807F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 807F 8080 8080 7F80 8080 8080" $"8080 8081 8181 8181 8181 8181 8181 8181" $"8181 8080 8080 7F7F 8080 8080 8080 7F80" $"8180 8081 8180 8080 8182 8181 8181 8281" $"8181 8181 8181 8180 7F81 807F 807E 7F80" $"7F7F 7F7F 807F 7F7F 7F80 7F7F 807E 7E81" $"807F 7F80 807E 8081 7F7F 807F 7F80 7F80" $"807F 8081 7F7E 7F7F 7E7E 7F7F 7F7E 7F80" $"7F80 807F 7F81 817F 8081 8080 8080 807C" $"7E84 7D78 807F 7B7D 7C7B 7D7D 7B7A 7E7D" $"7B7E 7D7E 807D 7D81 817E 7E80 7F7F 807E" $"7E81 7F7F 807F 8080 7E7F 8080 7F7F 807F" $"8080 7F7E 7E7E 8080 7E7D 8180 7B7E 8380" $"7C7E 817F 7D7E 7F80 807D 7E80 807F 7F7E" $"7F80 8081 7F7C 8286 7B7D 8781 7D82 8080" $"847F 7E86 867F 8085 8482 817F 8181 7D82" $"857D 7D85 857D 7C80 8482 7D7C 7F82 817D" $"8185 7F7B 818A 8075 8287 7B7C 8680 7D85" $"837D 8182 7E80 847F 7A81 8678 7C8D 8075" $"8187 847F 8185 797A 847A 7E88 7875 8B8B" $"7372 8A89 747F 8878 7C85 7F83 8274 778E" $"8E76 7281 8184 8C7C 697A 978C 6B79 927C" $"778D 7E72 8785 737F 8C79 737F 7E86 8877" $"7379 878E 7471 8B80 7181 8377 7C8A 7A6F" $"867A 7690 7D73 847A 7C83 7C7D 7C76 8186" $"7B7E 847D 8184 7D87 8A7A 7D85 898F 7C6E" $"7D8A 8C7C 6E7F 8B81 7372 7C7C 827D 7089" $"896F 7B8A 8979 6E84 9A81 6B84 988A 6F7D" $"9B80 6D87 8D81 7871 768B 8970 797D 6F8D" $"9468 729B 8970 8494 8881 8784 898D 7979" $"9595 6B65 A0A1 5B63 9584 6A74 8181 7D81" $"7D71 7F93 8272 878C 7282 9E81 718E 947F" $"7C8E 8978 8084 757C 8277 7680 7F6B 7B9A" $"7264 9D87 5F8E 9A6B 769E 8975 9089 708F" $"9E70 6E95 826A 8286 6F77 8872 748C 7666" $"8394 7B64 7E98 8671 8097 8879 9199 8079" $"868D 8276 7D81 7475 7D73 7576 7279 6F69" $"7484 8A6C 6990 8B7B 8E8C 8382 808D 9085" $"7D76 8690 7571 8779 6D7B 7370 7F6A 6083" $"8373 7A7C 8487 7D88 928D 8980 8797 9787" $"7485 9481 7C75 6B7E 7663 7574 666D 7C86" $"6D58 879F 7971 7A87 9C93 8188 918B 8C9B" $"967B 7987 827F 8475 616C 8477 5F68 787B" $"7B7A 7076 9586 6D98 A876 75AC AE81 7E99" $"958A 847B 8F8B 626B 7A6F 766C 5F7B 7C66" $"7284 7C6C 778F 8C7D 7D8C 9C9D 908B 9598" $"8B8C 887B 868D 826C 5C70 8376 6564 707A" $"767C 7F72 6975 9595 7A7D 94A3 9680 9AAA" $"816C 829C 996E 637F 796A 7474 6A6F 7075" $"8A75 5179 A374 588B 9D82 849A 9E8F 898F" $"8A88 8A82 838D 7568 8676 506A 8C7B 5763" $"8077 6E6F 757D 7570 869F 8D76 8DA8 9D7E" $"7D93 8B7D 9091 716E 7C79 706E 6C6F 7A76" $"6C76 766E 7772 7783 717A 9B92 8496 9D90" $"7F87 9D86 7B98 8C72 7670 717F 7269 717D" $"795D 6D89 6F61 7878 6B83 9681 86A2 958A" $"9892 8088 9F91 798D 865D 79A0 7D5B 7286" $"7C76 7467 6678 7660 6C8D 8478 949B 8C96" $"998B 898A 878C 938F 7B6C 858E 6E75 9277" $"6280 7A5F 7173 5C6A 7E70 7090 9682 8FA2" $"9082 9093 8795 9881 8787 787F 8B88 7875" $"7C6F 6B79 6B59 5D66 7973 617F 9C8F 8490" $"9D93 8483 89A1 9C74 809F 8773 8F91 7B7D" $"7B6F 6870 735B 5A6B 5E65 897D 6992 A488" $"7E8F 9677 7DAB 987D 9282 72A0 9F6F 7A98" $"7A56 6E83 6650 5D6E 6057 788B 7772 869B" $"A285 6D87 A2A3 8F79 8C99 8E94 897B 9EA1" $"6961 7E75 696C 5B4E 5B63 7085 7E6A 739D" $"AB80 6C90 9C93 958C 7F85 A4A0 7993 B786" $"6484 8462 6668 4C56 6F62 5D77 897A 7693" $"9678 83A1 9183 9599 8E93 A091 98BE 9772" $"A38F 4766 915A 3F69 5C43 7585 5E73 9672" $"6997 9A6E 6EAE B473 77AB A992 9EB6 A88A" $"8184 8173 6663 5C54 555C 6468 6E7A 7E6A" $"678F 9065 7FAF 9479 909E A4B4 A58D ADC7" $"8B54 88A8 5C3D 6F69 4259 6B5E 737B 555E" $"957F 5788 9973 8BA4 868F BFAC 87B7 CE9A" $"8F98 7A71 8279 5040 5C63 646B 515E 8069" $"5E67 6F84 777C 9C83 7BA4 B2A5 9EAD C4AB" $"8B93 8C7D 7767 5B55 5158 676A 5B57 6970" $"6258 768A 6D75 968E 7FA0 C39E 97D6 C59B" $"AF9B 858A 7776 583A 6973 474F 6A68 5B59" $"655A 5F7D 7273 8A81 8EB5 A090 C9D6 A7AE" $"CC9B 6D87 967A 574B 566A 7153 4E6C 634D" $"5469 6E5B 668B 7E70 A3B5 97A5 CAD2 B9B2" $"B7A4 9388 7D7A 684D 5A76 654A 4F63 5E4F" $"5756 5565 7876 637F ABA5 9CAA C5CC C3CB" $"B198 9786 8789 664F 626F 5F56 5856 4D48" $"565D 5552 6283 755F A0C1 99A4 C4D2 E1BC" $"94B1 B38D 7E75 6D62 6673 6249 535E 473D" $"5255 4753 7A75 5074 AAA4 AAB8 B4D6 E6BC" $"A4AF BA95 7287 725F 8267 3E5B 6350 3F2B" $"4E64 464E 555C 7777 8CA7 A4B3 BDD8 ECAE" $"A0D7 B583 887C 7875 6469 5F51 584D 353D" $"4751 5B38 467C 6C71 989D ADC4 CFDC CFC1" $"C6B2 A6A4 8073 8680 6659 646A 4C3E 3F34" $"4754 3235 5E65 6576 98A9 AAC4 D2CE D8CA" $"C0C3 A299 9674 7E7F 5D75 7E42 3559 4523" $"425A 3829 4F6E 6B78 98A2 BBD9 C9C4 DECF" $"C6C2 929A AB7E 6877 7E73 5E4D 3D3B 4531" $"2D50 341E 5B6C 5E88 A49A B7E4 D2BB E0E8" $"BBB3 B298 9789 6972 8374 4B3D 4E47 2C22" $"4149 2337 6161 647E A6C3 C0C5 D3CE E1E0" $"C4B8 8C94 BE7A 4674 7B66 603C 2A3D 3B27" $"2C34 284A 7056 74AA ADC7 E1DC D2E0 F4DB" $"B8AB A19D 8F5C 5076 6C44 332F 282C 4032" $"1B2D 4C4A 5076 8695 C9D8 BCD1 EFD8 D9EA" $"BDAB B79B 9578 638D 7356 552E 3146 331C" $"192C 382D 3458 7D94 9BB1 C2BE E1F3 D0CF" $"CDB7 BFB5 826F 939A 614E 6644 2C4E 3E18" $"313D 2B3A 4F6A 8BA3 ACA9 BDDC E1C5 BED3" $"BC9E 9F80 7282 7074 744C 4E56 535C 3721" $"4B50 3E43 4874 9F96 9CAB B4CE D4C4 BCBC" $"B9AD B19A 7596 A575 7178 5A48 595C 2117" $"472C 1137 4755 848C 84A9 C8CE CDCD CDC9" $"C5B0 ADAD 898D 9980 7A69 525D 4D35 353A" $"4629 2056 575C 8E8F 97B3 B9CF BFA6 C5BE" $"A3A0 9E9E 8A86 9C84 7882 7371 4E30 4D44" $"2D2F 2E2F 3765 8463 7BB3 ADB0 BDC3 CDC1" $"C5C9 B0BE B792 B4A8 717C 6C4E 492D 282A" $"171B 242E 3D52 807E 82C4 C6A2 B6CA CDC3" $"A3B0 BC89 87AE 9371 867E 5055 6448 3B48" $"4945 4356 6466 818F 94A7 A5A2 B1B0 ABA3" $"A8A7 95A4 9A85 9B9B 8882 6349 5446 3B3D" $"1E28 3E2D 506F 6178 99A5 ABBA D5C3 B5DF" $"DFC0 B3AF C7AB 7EAA A052 515E 3623 2B15" $"173F 2F18 4A79 7981 969B A4B9 BCB9 B6BB" $"B9A7 AFB1 A0A0 9394 A381 6363 5D59 423D" $"4D41 4748 4C75 7C70 7787 9E9A 8F97 A6BD" $"B3A0 A7AC BAB1 A6BC 975D 757C 3E34 4D28" $"143D 3E2B 4B68 6079 9E96 94AD CAC6 B6D2" $"DBB8 AEC8 CDA8 90A5 935A 5E4B 2542 3A12" $"2439 344D 6A6D 6771 9095 89A2 B89E 99BE" $"C0A6 B1C4 B0A9 B5A5 9291 7E5C 5663 4F26" $"3C59 2E32 6652 5079 6556 82A3 968B B0C5" $"AFB9 DCD7 C0C1 B3A5 9176 764E 2B48 3A17" $"273E 3F35 5065 618E 8F67 9FD7 AC99 C8E2" $"BBA0 C8D8 B29A 9D8F 6867 623A 495B 202C" $"6E51 3A68 7154 6C8B 6C6A A39D 719B C2A0" $"9AB9 B6A7 B5CF B07D 9297 706A 6C5D 4F4C" $"5357 464D 664C 4E6E 5468 AF89 64B3 C19D" $"BCCF B8AB C3C2 8A8C 8F5D 585E 5541 3761" $"5629 5C83 505D 9377 669C B58E 8FCC BB83" $"AFC1 A1B0 A286 7B72 8176 564B 5764 656B" $"5C54 7B76 5661 6C70 6E72 9291 829C A59B" $"A19B B1D2 AD89 9AA5 937D 6B79 7C4E 526A" $"5757 6245 2D52 6B55 6486 7984 B4B9 A9B0" $"B7BA C0B4 9692 A485 6B6D 5F61 5852 5541" $"5D72 575B 5F65 7474 90AB 9A8E 9CBE B68D" $"A6BC 8D82 938C 8C71 607A 6B62 6F59 696E" $"4B64 6D50 4A51 6E7B 6D7E 9A99 92A1 B1A4" $"ABD8 B487 BCC2 96A7 A170 7078 614F 514B" $"3E3E 3235 3D48 5F56 709D 908C B1BE A4A8" $"CDBE 8FAC C795 8EA8 8C7B 7771 6B52 7575" $"406B 6B36 6688 6563 8B90 697B A185 8292" $"7883 A395 8D97 A09F 8090 A680 7484 7C6E" $"5F58 534B 636A 4962 8B6F 638F 937E 9BBF" $"A69C B7B3 C4C7 A39F 9088 8F62 566D 5643" $"393A 4C3F 475C 4B71 9D74 70A7 9D85 AAAD" $"90A2 ACA4 B7B7 9E8C 93A0 7C5F 8299 7858" $"666B 5F76 6D50 6B6B 5E74 6D57 647F 7462" $"7F99 8F99 B5AD A5BB B292 858E 9E8A 5F56" $"7461 3C5E 6343 4F5E 7164 5490 9A85 9E99" $"A9BA B6DF CB97 B3AB 8B87 6661 735F 4F4A" $"474F 4D56 5E51 6677 6674 8276 839F 866C" $"AFBB 88B7 C89E 9FA1 988A 8B98 867D 856F" $"7A8C 6C64 5A4C 6A6A 5353 4664 855E 5E8A" $"9095 ABB3 AAA3 BAA6 8292 8C77 7F83 675C" $"7775 686B 565D 7E72 6A82 8C7F 90B2 9A88" $"AFB8 A3A0 9384 8C80 5A51 6B70 565C 7565" $"6787 7868 7F73 6E89 827B 7B7A 918A 8096" $"9092 A9A0 8588 A095 7583 9786 838E 8380" $"8E72 5F7A 5E4B 6653 5571 5D61 837A 7494" $"9C9B 9790 ABB0 9786 8088 9692 7971 8F98" $"7166 6E6D 7566 6B76 607D 9572 8597 798E" $"9F7F 8493 757D 9E7B 5C6F 8392 7D6D 8F82" $"6789 8467 6D77 7760 678C 7573 9A7E 71A2" $"9B87 A294 8AA5 9A83 8797 998B 817A 828F" $"6E4F 5E56 5E73 4C4D 706B 6A7C 8374 899F" $"7E86 B59A 7FA3 9886 A395 8397 8F87 9796" $"776F 7A6E 7771 647C 7C7A 7460 808A 6A77" $"7168 8F87 7282 7D85 9087 8688 9996 8290" $"8175 8570 7183 6575 A16A 65A0 7F71 9083" $"8089 878D 8A9D A182 8D8B 738C A98F 585F" $"8565 4F69 5F53 6F78 5D6A 8773 7788 8180" $"85A0 A689 96BE A990 AC9E 8EA1 A48F 798C" $"713E 707E 4F61 6867 5B4D 8F80 4A7F 6C50" $"A393 5F97 AF94 90A3 9D7F 93AA 898B 9072" $"7262 668A 725D 7289 816A 8791 708A 9362" $"6D9C 958F B38E 679E A182 8880 726C 7C72" $"4753 6F54 546F 7171 6362 918A 7091 7476" $"AD8D A4CD B8AB 8EC4 D979 A0C2 8586 6E5B" $"6D59 575C 534E 485B 594E 705E 4B80 7254" $"80A1 9B92 A4BA B39F 9B9D BABC 7D81 9B7D" $"6A7C 8C5D 5993 724E 808B 6953 688D 6648" $"8BAF 8F7E 8FAD 9F91 9F91 A0A9 6F6B 8E7A" $"4F4F 8D6D 3076 6A46 7762 5A7B 7B6B 5E9A" $"BF86 AFD2 96B1 C9C0 C88F 9CB5 5A86 B442" $"527E 4E4E 514F 495C 7F4A 3371 7A58 5B80" $"9885 88AE 9F88 9EB4 BD9E 8BA3 A5A4 8874" $"9F92 6471 887A 6D87 7641 5D84 7565 5F6C" $"8282 7F84 8497 AA9B 8D8A 97A5 7562 876E" $"5D65 475A 5A48 897F 446B 8984 9095 9497" $"B5BF A5B2 B2AC CCB3 777F A99B 5E4E 6F61" $"352C 527A 593D 7071 597F 7762 7979 7883" $"997B 5FC0 B96C B1B7 87BD C190 929B 8C7F" $"8377 6492 8B4B 6C7F 5F63 6D6E 533F 6E73" $"5C8B 9B8E A49E 92AB B999 737A 867E 5728" $"5A90 593C 7186 778B A092 86AE AD74 9AB1" $"8FAD B18F 9F97 7B91 9163 595F 473F 5F63" $"3465 AD67 5FAA A581 7D99 8757 727D 596F" $"8B90 9085 A5B7 A8B0 A39F A87C 677A 8588" $"6961 766B 6C7B 7270 6C5D 6477 6C57 80B5" $"9689 BFB9 92A8 A273 766C 504B 353C 5E60" $"6672 809E A7A3 C4CC 989C BE9C 8188 8994" $"8F6A 5D7B 876F 5F5B 5E68 5A4C 6380 8C94" $"8E94 A683 81A7 765D 7F6D 4C4A 5F7A 717A" $"988F A8D1 B29E B3B2 9D84 807A 4F60 855E" $"4F70 7468 7B7C 5D7E B47D 4389 C38E 7794" $"8C94 A478 5368 7A62 4A50 4E49 6F8B 7775" $"B5DB AAB1 E8B3 73AD D676 3B77 7E5C 6352" $"5983 8163 6197 955C 7188 7B7E 7E7F 7579" $"ABA2 5076 A348 69A0 4852 9381 7993 A99B" $"9BE0 CE78 9CBD 8675 7A64 505B 6644 458A" $"945C 73A7 9178 8693 8387 9F83 6F8C 8C86" $"8A71 6E7D 5F52 6F64 5A5E 5F87 8361 A1E5" $"C59A A4CF BC7B 8790 726B 6655 4A6C 8A72" $"7D99 8F85 7C8F 8E63 7E8C 6765 646F 8C88" $"624B 7583 3E4B 8966 6193 828E D2D1 C3DF" $"D9B1 A9A1 8A88 532E 6C5B 2052 6C64 7F76" $"82A2 9477 6B99 AB68 67A4 8941 67B3 6B32" $"8579 3B59 7063 6997 A877 9CE1 B7AD D6B5" $"99A9 8970 7A6D 5E62 6D69 646D 7C93 A191" $"858F 8266 7775 4755 7254 3D51 7067 6278" $"7372 8398 9B91 ABB6 ABB3 A7AC D2C1 9C9F" $"9B80 787C 6755 6370 5855 817D 5A7B 9B76" $"5962 695E 5A70 7154 6987 7086 9F80 889B" $"9496 8A86 8F7B 98B8 8793 BFB0 A8A7 A18E" $"7596 A144 40A2 7E2E 4C7E 5C25 7799 335E" $"9558 768E 6486 9F81 8A99 8A77 7997 7C5E" $"9299 7773 93C0 9793 DBAC 8AC6 B088 9B95" $"7765 6447 2748 5625 2F74 7C56 6BA3 A58D" $"9AAE 9487 A38D 627F 8657 5769 676A 80A0" $"8679 AFA7 9CBA ABB7 CDA6 8389 9477 4D57" $"5C36 3E4E 3F5C 736E 7A9A A383 9DC8 9B7D" $"8973 6778 604A 575C 6A7A 6E6D 95C3 AF87" $"B2E3 B388 C2C8 7F80 7A46 5260 3F46 684F" $"3B76 8F61 72B3 B08C 969B 9DA3 8088 8351" $"738E 544C 7C77 6C86 7269 9CA7 A1A8 9D8D" $"859D 8A4D 5E74 526A 7F4B 5AA0 9F84 9FB2" $"9B9E AC8E 8CA5 836D 6C6D 8066 5E77 616D" $"8C69 5970 8D8D 7282 7F7E A28C 6E7C 7B6D" $"7A7E 6674 8986 999E 8084 C8DC 907C B2A9" $"7A68 6367 716E 544E 7483 717E 8987 8A80" $"877B 5F88 8C4A 5160 5780 794D 759F 8F89" $"9A94 9AC7 C38B 8DC0 C598 7D92 A28A 5F4A" $"6367 6573 617B 8D5D 87B7 796B 9BA2 703C" $"5564 3A4B 5D3B 5876 6D93 A192 AECE C8A3" $"9EC2 C5A5 827C A9B0 6856 8183 8C6F 3574" $"946D 8071 7488 6977 896A 545C 6D5A 4247" $"4D59 5C66 8F95 91B2 BAAC ADD2 E098 8DC4" $"A984 7C86 9B75 7796 787B 8986 7954 818F" $"4170 8720 3F78 4635 3C51 5A55 6E5C 6B9F" $"9697 A3BA E0C8 BABC ABCC C89A AAA6 7B75" $"8081 696E 9D74 3974 9654 4473 6C49 5246" $"3163 6D38 5A86 696C 92AA B2A5 A6BC BAA7" $"9491 AEAF 8E6F 7097 8564 7E83 8593 7872" $"94A2 8C85 9A85 7478 6D69 3A3F 7845 2E60" $"5250 787C 8186 93B6 9473 B0BA 7D71 99AE" $"8D78 919C 8682 A4AD A299 99B5 B389 7E91" $"9F87 5639 404B 3713 0F3C 5A3B 4A8D 7275" $"CEBA 9EBE C1BA A092 9296 B29C 676B 8B82" $"7787 7A83 947B 7D83 888D 7F95 7852 7468" $"5154 4946 5D6B 4D51 87AE B5AD B4B3 ABBF" $"9E86 A680 5053 4F5E 644A 3E67 9181 83AB" $"BDA5 96BD C094 9CA9 9682 6D5F 6676 5527" $"3D57 5958 4D68 8A7F 8EA5 9DAD B69D A2A2" $"8890 6D55 8469 508C A587 81AE C0A2 999C" $"9077 6C60 4859 5134 515C 5365 716B 73A0" $"AD8B 94B0 ABB3 BDBC C2B6 AEBF 8F44 6171" $"422F 303F 565C 4B6A AB7E 5BBA C56D 6B97" $"876E 8495 8478 7D90 AABC 9F70 8FB6 976F" $"6278 8F72 6787 7365 7C58 5D85 5B52 7874" $"7883 6A77 B8B4 8A93 AA9D 8CA8 935A 7F7F" $"426A 9064 577E 8672 8693 7271 9696 837F" $"8185 8792 8B88 B0AE 8595 A888 707E 6A47" $"6156 2E54 6843 537A 7A74 7483 8F7D 90A6" $"97AC B8AF A5A1 D4C5 8AA8 9B77 856A 5256" $"6A77 5B70 947E 626C 815C 4058 5134 3756" $"6C77 7B87 AFB8 BCCC CCCA B1BD C280 8CB5" $"9470 6879 6E4B 5C55 2E3E 5255 6568 768D" $"A7B5 A3B1 CBBA 9274 8A89 5C5B 6658 5F72" $"6E75 7A73 99B4 9688 7668 9190 6975 908B" $"605C 9BA6 7B8B ABA1 A1A6 9A9C 978B 919B" $"9369 4657 5A43 341D 2B4E 352A 5F75 89B9" $"B1B1 DAE6 D9CF D5CE B7A5 7E70 8F7A 4859" $"7463 6576 543C 6880 5040 6F6D 5667 6E81" $"9C95 857E 9DAD 8084 ACA4 99A2 A9A5 98A0" $"B89D 7C84 6447 5B4A 2935 586F 5F5E 7B8D" $"AAAE 989A AABB A07A 877C 7AA1 845B 778A" $"7D63 5767 6C79 6534 587F 707F 9283 82B0" $"BA8A 86AF CBA2 88A4 8999 B875 75AF 8E60" $"6664 4331 474F 3730 3043 726E 69B9 DDA4" $"A4D1 BA9D B5B9 9D8C 8F86 7480 7A88 AF7E" $"6284 7260 5D53 5E65 5B51 4D5D 7174 8076" $"6C9A 906D 8D98 9FAA AED9 C5A5 D0CD A081" $"7B80 4F20 2725 2238 4450 6B7D 94B7 AAA5" $"CDBE A1AE A081 838F 7F6F 7D97 8454 5B6F" $"6873 6556 7075 7C7D 7699 B19F 807F 8466" $"5F74 7667 6B8F A295 A1CD C9BD D7B9 8876" $"5C5A 5220 163B 4026 2C55 727C 8F97 8AA2" $"CEB7 92B4 DBD9 C09D ABBD 9A82 807A 643D" $"4051 3A42 6166 7283 8277 768E 8A62 6270" $"7260 4671 9585 9BBC BFB8 B9C9 B195 B0A0" $"7578 613D 5170 6F5C 536C 644F 7468 4D8C" $"A47C 7496 AEA3 A3B6 B3A5 A088 6872 714C" $"576D 5253 7579 818E 8789 9486 656B 8380" $"7A81 898E A9BB ADA7 A9B8 B58E 7A6C 656E" $"5333 415C 6253 5060 7374 626F 7F7B 848F" $"8A93 ABAA BCD7 BC94 94B1 AD86 7778 7D74" $"5862 7176 8A83 706C 6356 4F54 4D3A 4E76" $"6C51 75B7 D1BA B4D3 D7C0 AF96 8B96 8763" $"565B 5953 6772 5455 7770 5454 6587 B291" $"6FB1 C7A1 A7B0 9D97 9471 505E 6D59 6D85" $"5C64 AFAC 7B8C A592 7868 5748 5E6A 5156" $"6C80 9E97 86A1 C1C0 ADA0 A3A5 9696 9368" $"5F88 8B4D 3467 5E33 3E41 4267 8278 78A4" $"C3C3 C1BA B4B9 BA8E 6883 784E 5560 5F5C" $"6381 8E81 7E8E 9788 6A63 787D 6C60 6B87" $"8A74 7792 A391 7D8D 9796 9B94 8B92 9B99" $"8785 9170 586B 5D43 3633 5761 4D79 9F91" $"9BA6 A8BE A995 AC91 7F8F 6C62 8285 7B79" $"7D81 7A76 8683 5B6B 8E64 618E 7F80 9A89" $"838A 8385 8985 7E73 7189 9477 7B9C 9A81" $"7782 877A 6760 6565 5F58 6176 8F9B 8086" $"A6A8 A98D 83A8 987D 9789 7698 9374 7F93" $"7D66 7E7C 4D4C 6D66 4B54 6E6C 6A8B 8768" $"899E 8F97 857D A4A4 9799 A1AD A0A3 9F87" $"9C98 5D59 6E63 5E4F 5272 6B74 7B70 988A" $"5C79 8D79 6B73 797C 8984 8FA2 949A 9D8B" $"9E95 7078 807F 7567 807F 728C 9283 7167" $"797B 737D 7982 968F 9397 95A7 9E78 637B" $"8443 3B71 553B 687D 6D71 93A2 8C8C A08C" $"8BA2 828C BC99 86A4 9D95 A1A2 8272 887D" $"6D71 6866 696D 6E69 615A 6A6F 5A49 5264" $"6567 718E A796 9DC8 C5C0 BE9C AABE 9B80" $"7D7D 7266 6461 6B72 7675 7587 6E59 7D83" $"7A71 6781 7D74 8679 889B 7A7C 836C 8490" $"8193 7F6D 95A0 999E 8F86 9F8B 4C74 913E" $"4B91 7069 9494 A4B2 9CA4 9D86 8971 667A" $"6148 626B 6374 7A76 7C78 8088 636F 9C8A" $"7F8E 9AB6 B298 A7A2 878C 8165 616E 6F5C" $"6E88 798A A392 8B8C 8368 6171 5750 645D" $"6B77 7390 9C9F A88F 90AE 9888 927F 96AE" $"766D 8F99 895E 6C7E 5F63 6359 5B60 797D" $"7077 919A 899A 9972 8590 6778 7F5A 83B0" $"8770 95B2 A994 9AA5 9684 7C68 5E7D 7C53" $"6881 6573 8770 6F77 7F81 4F52 7F6A 6483" $"8F9C A99E 8999 A985 7692 8265 8588 6A96" $"BB9D 859B B28C 676D 716C 584A 5B6A 7474" $"798D 8D82 7F7C 7464 5C62 6A69 647C 9B9E" $"9F9D A5BB A581 8DA3 9288 9088 859E A389" $"9491 6E87 8149 5664 4F4F 6364 496E A269" $"5289 6C51 8779 537D 8567 82A3 A1AC CDD3" $"BBBE CBB4 A4AF A98D 7366 6562 5B5F 5B5E" $"6A57 484D 5F77 5544 7074 6265 7D9F 9682" $"8FAA A87B 76AE 9F71 96A2 819F C7AA A1C8" $"B98C 8196 8B44 477D 532B 5A78 6D74 747B" $"937D 5E71 825D 476A 6B6E 8C84 7E82 909A" $"7D80 9384 7388 A38D 88B6 D0D5 C5A8 9FB0" $"A971 5C71 6651 3337 7A68 4078 7158 876A" $"3856 6A66 6863 7083 90A8 AC9A 9CC0 B785" $"A5BC 8A90 9D99 B5A3 8DAC B997 6E7F 9356" $"2F4C 4B3D 353A 6152 467A 715C 7E87 7E76" $"7D97 9784 90B9 BCA8 AECE CF96 9AB8 8D84" $"886D 6C66 6F82 5F6D A27E 5B7C 8069 5E5A" $"6262 514B 626D 6270 949B 8E90 8C8B 8E8E" $"9081 9AB7 858B CAA9 98B8 9087 9468 6D70" $"5464 6972 8068 80AC 9982 7C7B 805A 3B50" $"5346 4046 687E 8083 859E B59E 8C9F B6B7" $"A0A0 C0BC A7BB C69E 7F8B 8860 4749 5149" $"343A 5A71 737A 8180 8E72 5066 695C 5C59" $"6278 9798 92B5 CEC2 C0D0 C8A1 96B0 B68D" $"708E 9C76 6268 6458 4A45 3A1D 3660 4543" $"6C87 9996 989B 96A8 A789 7E74 717C 716A" $"859F A7A4 A1B8 BDAB A48F 919D 7B6D 6F64" $"7380 7158 637D 593B 5966 4943 6E74 5352" $"82B8 9F85 A99C 879F 886A 7D91 8871 88BA" $"B1A5 C6D4 C7AF A4A4 8670 777C 6041 525A" $"4C57 4D42 5B4A 364A 392D 6377 637F 9EA6" $"C0E4 CF9F C8E9 AA8A A8AD 9798 8B7D B2B8" $"7878 9C83 4C62 7F3D 2F5B 4F3F 465A 6268" $"7C6D 5962 707D 7366 7F9F 9E8D 9BC4 CBAF" $"ABC5 BC9A A0A1 766D 9484 596A 7F80 8878" $"819C 7E70 8569 4765 7958 5865 4D4C 6163" $"5F61 6171 7962 728B 8FA2 9EAC DCCE B7D6" $"E2C0 B0B9 9974 7A6D 5A6B 7B77 626B 735A" $"606B 5D4D 3D36 3835 4565 5954 8994 7F88" $"9BAD ABA2 9FA6 C0C4 B6BD DEE3 BBB2 AC8D" $"8768 4A58 4D39 3B4E 5646 567E 7261 7871" $"6A79 6256 727F 7479 8983 8FB4 9D78 99AB" $"9E8F 829F A397 B5A0 95B3 9389 9A74 6D8C" $"7451 636E 4D47 6A72 6E7F 7663 6C76 7F67" $"5477 6E51 738C 7375 A4B7 9E94 A1B4 BFAE" $"A2B1 B599 909D 8986 9C92 806F 5F63 562F" $"3857 3A34 4345 697F 7C7D 8195 9685 898F" $"8F9C A99C 97AF BBB0 ADB8 BAAB 937E 766A" $"5D5C 596D 6F4A 5F84 584D 7866 4957 5C64" $"6F6B 7281 9AB5 A194 AC9A 8FAD 9E7A 7F92" $"968D 858F A1B1 AC8F 827E 6E6F 7058 526F" $"6F56 565C 6F7B 6262 7868 4A6B 794A 78A2" $"6B79 A29B A2A2 A4AF A8AC A888 99A6 92B7" $"B479 8AA8 9781 766A 6470 5F32 2936 4A57" $"4A30 427B 6C57 7F77 7F9F 7E7F A39E 96A1" $"BCB8 ADD6 C9A4 B6AD A1AB 9C7F 697A 916C" $"537F 8365 7364 3C40 4E49 3539 493B 527A" $"6967 91AB A187 91AA 9D97 A09C AABE A69A" $"C0CC B3A7 AFAE 8E74 7272 7066 666F 6E66" $"5C61 655D 4F40 4044 4949 4254 697A 8477" $"90AD 9399 B39E A9C3 A4A1 B7B3 B5BE C1BA" $"B0A4 9D98 786F 8C66 4566 4A2D 4E4F 5352" $"3954 6247 4550 5867 736C 658A A799 98B6" $"D0BA B0CE BFA2 AEB8 AAA0 A497 8C99 8B7F" $"8E7E 7266 4744 4841 3E40 4E56 4952 7C82" $"5F6F 9180 696A 7F7F 7C8E 8E9C A8A5 AEA0" $"AAD0 BC9A 9B9F 9898 A19D 8E8C 9688 676A" $"7057 4F4C 3C3D 3C39 4553 5E65 8384 6185" $"B28E 5A76 B6A6 7489 B5A4 89A6 C9B8 95A0" $"BFA7 849C 9B73 8F95 5A5D 755C 5569 5D44" $"4E55 4355 6A56 5074 977A 6FAB B08F A5B6" $"9B82 8CAB 9C78 8698 8B8A 9088 9AA7 9290" $"9392 8972 6B5C 668A 683B 597E 6049 7776" $"5874 7D66 586C 8E81 8AA6 928D B0B1 8994" $"BDA3 7B88 927C 7599 A583 8598 827F 8F6B" $"5A7E 6547 554F 5465 6A5F 5F89 8360 849F" $"796D 8E91 849C A897 A4BC ACA3 B69E 7F8C" $"978A 6E68 746A 7079 614E 5775 7658 545E" $"6770 646C 8683 7E8B 9585 829F AA91 7C88" $"968A 8590 9093 A99C 7687 A191 918F 7578" $"8678 554D 686A 5D56 525A 616D 7067 7D89" $"7F87 7E80 A398 8391 A0A6 988F A196 90B6" $"A271 8792 889F 9272 8495 8168 6765 5963" $"522F 4757 3C4B 665F 6883 9486 7BA0 AF9F" $"9CA1 ACB0 ADA2 9DAA BCB1 898C 9F84 7E84" $"7570 7488 835D 6574 5752 6456 444E 5C59" $"4953 777B 7579 7692 9F7B 8DBF B49F AAB0" $"A2A8 C4AF 92AE A37A 8B95 7D7A 8D89 6C6C" $"7569 5F50 565B 4856 5739 5479 5E59 7A72" $"667F 8076 8A95 8E9B B6AC A3BC C3C3 BDB1" $"B2A1 959A 949F 9370 8584 656B 5C4F 503E" $"414C 403A 5660 455D 8A74 5D7D 9179 849A" $"8C91 A1A2 A8AC AAB2 C7C0 A0A2 A1A5 B691" $"8A9A 8286 7869 623F 5A63 2D3E 5239 4C64" $"474C 857B 5976 9286 8189 9CBA A58E A9AB" $"9EA4 ABB0 928C AF9A 89A6 A696 97A6 9162" $"6769 5A61 463E 5742 4056 5C62 5C69 736A" $"7B77 6E9A 9F7C 99AD 9AA5 A9A8 AF9D 999C" $"8D8C 9899 9AA1 9B95 9B96 8777 707C 5C2E" $"5865 3A41 5058 6357 586A 6F7C 8A72 6595" $"B596 7E9E B6AD AEB4 BAA9 92AF AD8C 988F" $"869A 9381 695F 7C71 4C63 6541 4A4C 4251" $"5C6B 6553 7494 8780 8EA1 AD9C 8999 9F99" $"B6AE 819D B695 8F9D 9E9A 8F8C 7F66 696A" $"594C 5570 674B 596C 646D 8072 5A6E 9087" $"7778 96AC 9290 9A87 8998 9182 8793 9585" $"7D95 A9A2 A0A7 977E 857C 5D64 684A 4462" $"533C 6A7A 5569 9076 698C 8672 8F9B 8A91" $"9183 93A6 978D 9794 8797 A992 94B3 A696" $"A898 8084 715E 614D 3E4B 3A22 3647 414D" $"6D76 6284 B09D A3AF ADC4 B195 A5A2 9EAD" $"A08A 959A 9490 8587 969C 8872 7F6F 4C67" $"6A47 5A5E 3C43 4743 5B62 6564 618C A792" $"9EB7 C6D3 B5A1 AD9E 969A 948F 7B6F 828B" $"7B7A 9095 8A82 797C 8068 6682 6D4A 5B6E" $"5548 676D 5452 6771 646C 8F8E 89A6 A794" $"96A8 BAB2 A59D 95A4 A692 989D 9CA8 9C87" $"8684 7364 6363 5145 5243 3243 464C 585A" $"5B66 7974 7B95 96AE B084 A7D9 AE9F C9C1" $"A7B2 B6A3 8E8E 9A96 8C81 6D64 6555 4E51" $"3D43 542E 3761 5565 706A 8F8B 6F91 A89A" $"97A0 9E92 8C95 A596 8598 9F9C 9387 979F" $"9FA1 928A 8C8D 7F6D 7677 5F54 564C 4047" $"5D5E 5362 7472 7B90 8C7F 90A4 9086 9584" $"849D 8876 99A8 938F 9BAC B5A6 ADB5 9592" $"A27B 5F74 6C57 5742 354E 463A 5259 5358" $"6F83 7685 B4AE 9FB0 A79A ACAB A09B 878B" $"9585 898E 86A1 B889 77A5 955D 697E 6551" $"5756 3B4A 7159 5472 5D5F 887E 6483 AB9A" $"86A3 B5A7 9AA9 B5A0 9491 868B 876D 799A" $"8576 9B93 717B 867B 7175 6843 5573 5A50" $"6770 6564 767C 7072 8E8C 8192 807F ADAF" $"9C99 9FAF B4A0 7F8B B29C 8092 8E72 7F8C" $"6862 7361 5E57 4053 6454 515E 6B60 556D" $"847C 788B 9E9E 8585 B3AF 839A C6AE 94AE" $"A896 B9B7 8F8F 938E 876E 544D 5D57 3E3A" $"3742 5951 4F67 7068 6E79 7989 9799 A69A" $"9FB0 9B9F B1A4 969F A988 789C 9887 9D97" $"838D 9272 5769 7F64 3A38 4A50 515B 6C64" $"6D86 746E 7F81 929F 8E8B 8C84 9DA8 8796" $"A990 9396 8B97 9F9C 9294 ADA0 8898 978B" $"8569 585F 4E37 4352 463C 4F54 4669 7D51" $"64A5 9D74 85B5 B18C 9AC9 C19B A7BA ACA6" $"AB9F 92AC A76D 7296 775E 736B 4D4A 564E" $"3C42 525D 5D51 4D61 7A82 767C AAB8 9491" $"ACA1 A8BD 9299 C095 8EA4 989C 9A94 917A" $"7880 7464 5D5F 5B60 634B 4B71 7F66 6780" $"6B59 8087 6372 8F89 8581 899C 8D86 9693" $"949B 8D83 9FC1 A79A BE9F 88AC 9771 707B" $"6D4D 4D3A 2764 7A4B 5B76 5763 8A74 5F83" $"987E 7A8A 848D A19D 9EA4 9E95 99A4 9C9D" $"AEAB A59D 94A0 9D82 7972 6C5B 302F 4130" $"374B 444F 616A 8188 8491 A9BD 9A89 BCB2" $"889F AF9A 8992 9682 8A9B 8C7F 8D97 7E7D" $"8A71 7791 8069 605B 5455 624F 446C 6A3A" $"5188 7D73 9BB8 A095 B0B2 A19D A6B6 9968" $"788C 858D 8384 A197 7B76 7C84 7F89 8855" $"6088 604F 7075 6467 6F50 3D69 785B 6374" $"7A8F 9F99 9BBA CCAD A3BC 9783 B5A9 7988" $"9F8F 7C84 7C6B 7E88 6A52 5A55 515D 4D4F" $"7675 5B5E 7177 6F6B 7281 877E 717E 99A6" $"B7BA A7B0 C1B6 ACA7 A8AD 9C89 8D77 545D" $"746D 5B57 4747 5B38 3974 5752 8261 618B" $"8E89 83A1 B089 8996 898F 9F94 8891 98A7" $"A28A ABC1 949F B273 77AC 6A3A 767C 4541" $"5B48 2F56 7461 5655 6E85 706E 8CA7 A78B" $"8599 A39B 9196 9490 9078 699C B88F 9BBF" $"AB9B A09E 9892 8C80 6A54 403A 484A 453E" $"3B58 6044 5780 7E7F 9899 8C9B AFAA A4B6" $"B7A4 A499 8A92 9998 887B 99A6 7B75 A090" $"6F93 8B47 5475 4E3A 524C 4456 4C47 6A79" $"747C 8A92 91A0 A092 AFC1 A1A2 B399 8F9E" $"9890 8086 A080 646F 798C 8270 7F7B 6F69" $"5B6A 6E60 706E 534F 626B 6971 7B84 8D80" $"7389 9E9E A39D 909A AA99 78A1 CD93 7AA3" $"9E74 748C 716B 8566 4B5D 675F 6373 6A60" $"6569 7477 706B 7688 7E7C 817E 9697 8D9D" $"9A92 9BA2 9995 B1B7 9B9D 9C90 9F90 606B" $"8D69 3044 5437 4C60 565D 6771 747C 817E" $"9BAD 9178 87A7 A088 8B9E A090 8981 8297" $"9893 9895 9795 8F88 7E88 856D 6B5F 3C3D" $"5D5A 4752 595E 7178 7894 B296 82A7 AF9F" $"9587 99AB 9A88 8475 71A4 A769 76A5 9C80" $"7E88 8A89 8E88 685B 6664 5E54 535C 504C" $"5866 6467 9797 7BA0 B19C 9CAA B7B0 9A98" $"9E91 7C86 9B81 7695 9986 6B6C 8B80 7780" $"6E6F 695A 6C73 6667 695C 585E 5663 766D" $"7A86 8398 9489 B1D6 B48A A4BA 9B88 999A" $"93A5 9576 8787 6970 7F74 644F 4F5F 5358" $"6B65 6C64 566B 6C65 7775 7383 7B7A 8E91" $"92B4 CEA1 94C7 B594 A8A7 9BA6 A27C 6881" $"876F 6661 616A 5438 4665 6954 5975 7269" $"7E85 7A8C 967C 8195 756F 948E 819A 9F86" $"7E9D B69D 9EBE AB91 A1A6 8673 818C 7E6B" $"6455 4C60 6756 4F53 5050 6769 5C73 8B88" $"8990 8B8A 9499 9990 8E88 869A 9B9B ABAE" $"B8C0 B49B 899B A17B 6B6F 5F49 404F 5240" $"4E5D 403D 5F6A 6565 788E 9CA7 9999 BEBE" $"A5B5 AB82 8085 757A 8A7C 7C9A 967C 889A" $"969F 986D 6588 7344 5B81 7057 5665 6F67" $"686A 6C84 856E 7A83 81A1 AD9B 9492 9890" $"7781 8C77 839C 7E6F A1A2 88A3 AFA4 9780" $"858C 6E62 7367 423C 4F58 524F 5C67 7071" $"6875 7D84 A5A5 849A C9AB 8AAF B29E A8A7" $"8E80 8D8F 7073 8D7C 6876 776A 6A66 6F6E" $"4E53 645A 5558 6B89 8C7E 859D A096 A0A1" $"9EAD 9B77 8395 8D92 968A 8D8D 7970 6C6D" $"7B76 6458 5D6A 7C8D 786B 979E 6E6C 9187" $"677F 937E 7480 8F84 8BAB 9477 8286 7A6E" $"7580 7E7D 8392 9189 8FA1 A68E 8687 706F" $"7F6B 607C 775E 6B72 7373 5B7D 9460 6485" $"7F74 7CA1 A18E A8A2 8CA2 AA8F 7D94 A28B" $"796D 7C9D 9280 8474 7177 5B52 6055 5853" $"415C 6C5B 688B A096 94A3 A3A2 9BA8 C1A9" $"8A97 AC98 8599 9A84 817E 7066 5C5C 706F" $"4B50 8179 5872 8271 7E74 5666 7C7B 6D66" $"839C 9A9E 9396 B3A7 94A8 9F82 8882 787E" $"778C 916F 869B 7B70 7B87 8762 5A79 6F5C" $"6680 865E 6B90 6046 6970 6771 736A 717F" $"8EA1 AAB0 B6A6 99AC AE96 9B93 8CAA 9E7F" $"8490 9892 8472 6666 5146 443C 474C 3F43" $"5D65 5D78 8876 7F9A 9581 88A4 BEBD A5B6" $"CEB3 A9B3 AC9C 9999 7669 7773 746E 747C" $"6060 746B 5C4C 4E67 5138 656E 5378 867B" $"A3B0 908B 9B9C 9C9B 8A8D A58D 7999 918A" $"A394 8E98 887D 8595 8179 9382 7277 7C72" $"6587 783F 5161 4C42 4665 7065 7D83 648D" $"C2A1 919A A0AA 8B89 A093 9EA1 A1B1 9391" $"B6A9 898B 9677 5F71 5F4B 6165 5949 475D" $"6452 4257 7675 686B 7C8B A3B5 A4A8 C3B9" $"A7AE 9E8C 948B 8184 7E72 6F8C A785 6781" $"8F74 6569 6462 6A63 5464 7460 6278 7B8F" $"8B56 699C 8B80 958F 859F AC8F 8E9D 92A7" $"AA76 708D 8A7B 7D87 7F81 9488 6371 9177" $"726F 5468 7251 3F65 8967 618A 7B68 8DA2" $"7B7C A192 9199 8A93 99A9 B296 98A4 959B" $"9B7A 7291 865B 5966 646B 725E 5C78 6E51" $"5166 7F79 6A70 818C 8791 A7A3 9C9F 9695" $"9E8B 7F9C 9E81 849B 9D80 80A9 9B77 7970" $"6269 5541 6A6D 425B 7761 6475 7B8D 8A7F" $"898C 9297 A5AA 8A96 B499 828C 9784 7585" $"877E 7770 7F96 9683 858D 7E75 7A6F 5A5D" $"6555 575E 4E5A 6F81 8773 90A0 7393 B993" $"97A8 999D 9D94 8C86 9193 867F 7F70 648C" $"9A6C 74A0 8963 7B7D 5862 7A6C 483F 5650" $"5675 686F 8F7F 86A5 A6A8 A7A7 B2A8 A3AD" $"938A AA95 8294 7765 7E7C 6969 7D80 6663" $"7460 5B87 7946 5470 6A50 516E 7A73 6B82" $"958A 9BB0 AAAC ADA7 B0B2 9D9A 9C8E 928B" $"8182 5F6E 9A6A 5081 7E4C 4E70 6A52 596D" $"736A 5F65 7A87 7B76 9088 708F 9F88 93A4" $"A5A6 A9AE 968A A7A5 8E8B 927D 6987 9073" $"798B 7C67 6666 5848 5064 5947 576D 6D63" $"7EA3 8D79 9093 8790 969A 938D A5AB 9C95" $"9DAF A193 A39B 7B76 918C 7A88 8B79 5F66" $"7049 4456 4038 4B46 445F 6B76 9E9C 7E95" $"B7BD A889 9FCE A777 A0AE 8888 9FA5 9A89" $"807C 8493 8070 827B 605F 6859 4454 5137" $"535B 324A 7D7A 7082 9A9B 9DBA BAA4 BCC0" $"9BA4 B586 6A91 9775 7883 7A6D 738F 9083" $"8883 8289 7C5C 506B 7255 5158 4A51 686C" $"6D70 6F76 8AA2 967F AAC4 9BA5 BFA4 9097" $"A8A7 7E71 978D 657D 9181 8D8D 7E8A 7B5D" $"5C5F 5C51 4850 4C48 5A65 6A76 7B87 8982" $"94A7 ABA8 B0C0 B6B0 AEAD B8A5 9FA8 8061" $"7275 646A 7463 626A 5F6A 5F51 7162 496D" $"7763 5A6D 9C97 6C83 A695 959B 8B9D B292" $"7DA8 BB8D 7A9D B39E 7D78 827A 777A 6D71" $"7066 7670 5453 6979 655B 6D6C 6574 8D89" $"7482 8F82 8F96 8693 A599 8897 AB8B 7EA6" $"A793 A28F 6E93 AC87 6F83 8D6B 5D6E 5739" $"4B55 454E 564E 5C6D 757B 8293 9696 9997" $"A4B0 ABA6 B4AC 8D94 A29E 8F82 9594 7164" $"788B 7A6D 726E 7967 464D 5150 4E48 564F" $"4A79 8978 8EA1 969F B7B3 A09B BBCB 8F8A" $"BB91 7C9B 8478 8B84 7064 606F 7F7B 6460" $"898C 5B54 6969 6162 625A 6566 6587 8777" $"8C9A A2A1 8C9A BAAC 989E A5A8 9584 9997" $"8D99 7F64 7B90 7E6C 727A 7975 6E62 5957" $"5D5D 5D5B 4E5A 6B6A 7676 7293 978B 928F" $"ACC7 A69D BBC3 AC9D A7B3 BBA7 7B77 897E" $"6963 695A 4D69 652F 3660 4B42 5E58 4D66" $"7873 8895 899E AA9C A0A8 AFB1 A6A8 B7B3" $"A793 87A7 B78F 7A83 7B6E 7363 4966 7A4F" $"4460 5037 4869 7262 5770 8D7E 7996 A297" $"969F 9080 9FAF 948B 9FAE 9776 8EAB 9084" $"9896 786A 8A9F 7C5F 768D 714D 4D5B 553D" $"465D 4D5A 6B5C 7B93 868C 8E96 9D8D 959F" $"959C AFB4 A6A0 A59A A7C2 9F7D 898B 877A" $"5D63 7471 6852 4952 3B38 5A45 395D 584E" $"7495 9291 A7B1 B3AE A0AC B8A7 A4AF A294" $"9493 90A0 A185 7D7B 7068 6D77 635A 706A" $"5253 5F59 556A 6B57 6671 657E 9A85 81A7" $"A286 93AC B19C 96AB A895 8C81 89A7 A582" $"788A 857A 817D 7677 7775 5E52 5753 5559" $"5959 5964 686B 828D 7986 A689 7AA5 AA9E" $"AAB8 C3B5 989C A59F AF9B 697C 8460 6D77" $"5D6D 8367 595D 5A57 4950 645B 555F 687A" $"8A89 96AB 9884 91A0 A49E 99A9 B8A5 8FA1" $"A696 A6A0 7A77 7B60 5A6B 6460 6D6C 605B" $"6464 5D68 6A64 6662 6978 7E8F 8E84 9A9D" $"868C 9A99 A0A5 9C9D 9E93 939F A99F 8B99" $"9060 6E8A 6C5F 6D6A 5B5D 6455 4B4C 5E7C" $"6B50 6271 7B8D 8281 9992 8697 9692 B1BA" $"A29E AFAB 9092 AAA4 9490 7C6F 787A 746F" $"6B68 5F5D 553E 414F 5662 5E5B 6770 7E94" $"9F9E 9E9C 8B8E A6A4 9AAD B9A0 96A4 9B91" $"9995 8C85 6D59 6A7A 6E6A 6E6B 7177 6A50" $"4F5D 5F62 625D 6368 7994 9893 9597 9391" $"918E 93A2 A497 90AC AF82 8BAD 988B 8B6B" $"6B86 7265 7476 776B 6A67 494E 6660 585E" $"5C46 5A8F 8E7D 929E 8D89 959E A5A8 ACB4" $"B9A7 8C94 A9A2 9B9C 7C63 767E 655D 7570" $"5C61 5246 564D 445C 6A62 6265 6585 A39E" $"968E 9BA4 9198 A5B0 BFA0 95C3 B378 81A4" $"9875 6A6D 6160 7770 6071 7D75 726B 5350" $"6C59 4976 6B49 7496 8C88 9CA6 898E A687" $"799F ADA1 A09E A4A3 8C91 9D9C 916D 6A76" $"656B 817D 7782 7F5D 576A 6053 5854 4E4E" $"5163 7885 9497 979E 9CA0 A1A6 C4BE 9DAF" $"C3A4 8A99 A89F 937D 6762 6372 6F5C 5C63" $"6858 4A58 5B55 5D61 6968 5569 8B8E 9BA5" $"958E 9EB3 B39F A9CB BCA3 B3A9 887D 8792" $"8366 5A65 665B 6A74 6C64 677E 6A43 5B78" $"6D63 7874 566F 9D9A 838D A58C 768E 9281" $"8AA3 B5AE 9EA8 A38B 9DAF 8B7A 8D6E 5777" $"7A68 727B 746C 5B54 5F5D 4C4B 605D 4158" $"878A 8291 A29A 8D92 998F 8DAC B398 ABC0" $"A599 A3A7 B2A2 776E 786C 5B56 676C 5050" $"5F4A 4260 5A3D 5273 6C58 6C96 9C9C B4BB" $"A599 A4A4 9BA3 ABA7 9D9B 917E 848F 8C88" $"8571 5F6E 6C61 6F72 6757 5860 4D5B 7253" $"5F8B 704D 71A7 A596 A09B 9898 9494 959F" $"9A91 A2A1 908B 878B 9186 7D79 7880 7F7B" $"8783 7171 7160 5154 5643 3D5A 5F51 5F76" $"8A89 91A4 9492 A499 9096 ACC1 B4AE BBB2" $"9D93 99AA 9869 5E79 7550 5379 7458 5A56" $"4B55 4B40 525C 5A59 5771 9296 A6BF B09D" $"A9B1 A69B A7B7 B1AB A492 999D 8F8D 8177" $"7857 4761 6961 5B56 5A67 6B5E 5D69 6872" $"8269 5171 9492 8F93 9295 9996 8C8A 98A6" $"A895 89A1 AB8E 899B 9E95 857D 7D70 6F88" $"8159 4F65 684B 4050 585D 605B 6574 7474" $"8798 9284 8D9A 8A88 A2B1 B2AC AFBD B5A7" $"9F9D A498 867E 6767 7F70 5B5D 5856 5037" $"3847 3C41 5A66 605C 83AA A4A6 B0A8 A4AA" $"A38F 9AAB A0A2 A59F ACA3 828D AA8D 646D" $"735D 5E70 6F61 6571 675B 5B56 595F 666B" $"625E 6E8C 9A95 9CAC A79B 9888 889D 9C8E" $"8893 9C8E 8996 A09D 8D86 877E 777B 7E7A" $"7570 6863 5E5A 544D 5564 5C47 4F6C 7478" $"858D 9291 9CAD A3A2 BCC2 AEA4 ACAE A690" $"85A2 A276 7089 7659 717F 5D4B 5B54 3C40" $"514E 4D5E 6E6E 666F 8C9C 9693 A0A5 9397" $"B2B3 ADBA BAA9 A6AE A283 7478 7868 5D59" $"535B 636A 796F 546D 7E50 4D6B 636B 8280" $"7275 99AB 8D8C A391 8483 7382 9891 96A5" $"A2A0 AC9E 8D9D A38C 7262 696D 6870 7970" $"656D 7566 4E51 6C6B 5758 6062 7382 8391" $"9A95 948B 8A98 A0A8 9D96 B5B4 A1AF AFA8" $"B1A8 9077 7683 6142 6468 3D47 5436 3D59" $"5952 6178 736E 7988 A4A5 929D B0AE 9B9E" $"BAB0 9AA9 AA9F 9B8C 827F 8C8F 7875 7068" $"736D 6771 6653 535A 4E40 5365 697A 7F77" $"8590 97A7 A08D 959E 907D 89A5 A2A2 A895" $"9CA6 8A83 8F8C 867A 6E6C 6E75 888A 6C70" $"8361 4953 494B 5B52 4F63 6A68 809D 9A8A" $"9CA8 898C ABA7 A4AA A0A7 C0B6 9894 9B99" $"9683 6960 5B60 6F68 5E62 5F5C 635D 4847" $"5E68 5D5A 5E69 7E88 8F95 97AC AF99 A3B2" $"ACB0 ADA7 B0A5 9990 8198 A079 6C6E 615C" $"6267 655C 4E5C 7352 3960 7567 6B7E 7E6C" $"7694 8C80 9295 8A86 8EA8 A796 ACB7 A2A3" $"ADA2 8A82 989D 7F71 7066 6C80 755A 5B5F" $"5655 493E 5564 606C 7573 7F93 978E 9095" $"9390 8A94 9B9C AEAF A3AD AEAD A282 90AD" $"855F 6A74 6E65 6C6E 565E 6D50 4049 4D57" $"6166 616A 8B87 84AB A48E AAA8 8B92 A4A4" $"949D A699 A4A9 9487 89A1 9D76 6B68 6D7D" $"6F5C 656D 6860 4E4C 5652 5655 5871 6C6B" $"8691 929B ABAA 9395 B5BE A096 B7B5 9C9D" $"9282 92A2 8D66 6C84 6C60 7165 6268 5A59" $"5A4E 4655 6758 5670 7B72 6C7F 9595 969E" $"9B97 ABBA A7A6 B8B6 ACA6 9D84 8598 8A76" $"6E74 7661 6063 697A 5F49 5F5D 494B 555E" $"6F76 6C6D 7E88 8795 9E83 7A98 ADA8 97A0" $"BFBE ADB9 AE91 A19F 8285 7C6E 6C59 5971" $"7561 505D 6F53 3D53 5951 5F71 766A 7191" $"9996 9E96 99A0 8F94 A39F AAAF A4AA B6AD" $"928F A6A4 8673 7768 5165 7259 4E5A 5E57" $"5042 4360 665E 6873 797E 899C 9B98 B0A8" $"89A5 BD9B 99AF 9D9A B0A6 8E8E 9294 9E89" $"6776 8464 5466 664D 5562 3E32 595E 4964" $"836A 698B 8D8A 97A8 A98C 8BAE B6A2 9AAB" $"AF9F A7AF 8C78 8D9B 9684 6E77 7E63 687D" $"6B60 6056 5442 3854 5948 6B87 6460 89A0" $"9790 9A91 8FAA A596 9CA5 AEB2 AEA3 A59F" $"8693 A987 6773 7863 6373 6858 5E62 564B" $"443E 495D 6970 645B 769E AC99 90A3 ABA4" $"9F9D ACAF A0A9 B2A3 9F9E 918A 8D9B 9367" $"5065 715B 545E 5045 6164 3438 696E 6673" $"7473 8597 9C98 9AA7 ABA9 A798 A1AF 9B9B" $"AA98 969A 827E 9399 8F7E 6B6C 7868 5E67" $"5A52 645F 3835 5D6C 6164 7172 8196 8182" $"A8A6 9599 9A94 9BAE ADA2 A2A7 ACA7 9386" $"94A0 9686 6E6E 7964 616D 5F53 524E 4037" $"4249 5367 6661 7684 87A4 AC98 A2B4 A79D" $"ABB5 A8A3 ACAB B0AF 877C A19E 857F 6757" $"6561 555F 5F46 5070 5838 4859 616B 686A" $"7382 928B 95B3 A797 A4A6 A5A3 9897 A4AD" $"9C8E 9B99 878A 9693 7B62 676D 6066 614E" $"6771 5244 4653 6765 6373 7266 768A 8E92" $"9BA1 9790 A2AF A39E B3BD A79F ABA4 9191" $"A8A8 765D 7272 5F60 5F4A 4C5A 503F 3943" $"4C53 686F 6972 798A 9E96 94A6 ADA2 9AA3" $"B0B3 AEAF BCBC A89F A198 9396 816C 675A" $"5258 5E55 4655 5C46 444A 465C 736A 6F83" $"7B82 A0A1 A3AB 9C9A A091 99A5 96A0 B4A2" $"98A7 9E87 96A8 8C71 7372 6159 676B 5D55" $"5B5F 5245 5063 5C59 7179 6C71 8B97 898B" $"A5A3 8D87 9EB1 9D96 B2B1 9FA3 A99F 97A6" $"A98E 7D74 6D6F 6A61 5A51 5056 5242 3941" $"5063 7167 6077 8A91 9A99 97A5 A698 9AA7" $"A9A5 B0B6 A8A1 A292 88A0 A67F 6B71 675D" $"656C 5D4A 5565 5A44 3A43 5B76 765E 6380" $"939B 9C99 9BA7 A691 96A9 9E93 A1AE A295" $"9E98 8C94 9085 7C64 6077 7159 5F68 7377" $"5B4F 6059 5364 7271 6266 7F8A 8C91 969A" $"9F95 8695 A393 98AA A099 A39E 8D91 A59F" $"8479 7770 6E6F 6A66 5E5D 7068 464A 5C5E" $"6766 6771 6977 9893 849C B094 88A4 AC9F" $"A2AF AB9F A5AA 9687 9292 8079 786B 595A" $"685C 525D 5956 5950 5161 707D 7D71 7690" $"A09A 98A5 A293 98A4 9D93 9BA7 A49B 9695" $"958A 838E 8771 675F 606D 6B57 5B73 6858" $"6059 546C 7369 7581 7779 9AA6 9394 9B97" $"9792 8F94 979E A29A 9FA5 968F 9B9A 8E84" $"7268 6B67 5A52 5964 6254 5059 564F 5965" $"6D71 7075 879A 9495 AFAF 9799 ABA8 9CA4" $"A99C A3B2 A38D 8E9A 9688 7768 625E 514E" $"5953 4555 604C 4056 6966 6A76 787D 8D97" $"969A AAB2 A49C A4A7 A69E 99A8 A796 9694" $"8A91 9684 7473 6B67 6B5B 5265 634A 545F" $"4952 6C58 547F 8A74 7C96 9995 A6A8 8D8F" $"A4A4 9A99 A2A3 A5AA 9E9C A79C 9290 8073" $"6F71 7364 5560 6556 5759 4A4B 5A54 485F" $"7C72 6880 989D A1A4 9C9A ABAD 9593 AAAD" $"ACAD A0A3 AEA5 9393 957E 6A65 5F60 5C5D" $"6251 4C66 6145 5260 535A 7076 6E71 8B99" $"9DAB A49E ADA2 96A7 A997 99A9 A795 929A" $"958D 9088 756F 7167 5760 6D56 4B6C 6A4B" $"5466 6765 676E 6C75 8884 8696 9797 9890" $"96A7 A394 96AA B3A5 8D87 ABB9 8C74 807F" $"7D7B 6960 6866 6167 5842 5363 4F51 6866" $"6D82 7D7B 8D95 999C 908B 9CA5 999C A19F" $"B2B7 9891 A2A2 8E7B 7C75 6872 6350 6C76" $"5A5B 6B60 585E 5D5F 5E66 827B 708E 989A" $"A897 8E9F 9A98 9F8E 889E A69C 9494 A19E" $"8B84 827B 7273 6957 6B78 625A 666F 635A" $"6966 586C 7E6D 7081 848E 9698 9F97 919C" $"A29C 9190 A2A8 8F89 A09C 8992 957F 7076" $"7969 6971 6256 5D63 5D58 575C 6768 6472" $"8182 8284 8DA2 A391 94A1 AAAB 9A99 A7AA" $"A394 8D8E 8887 867C 706B 7179 6F5D 5961" $"6867 5648 5A6A 5A5C 6D70 818A 7E8B 9F9D" $"9596 A19F 979A 9F9F 989C ABA0 8D8B 8989" $"8576 6A63 6C7D 7059 6072 7365 5F64 5F61" $"685C 5C6F 797D 7878 939E 9194 A3A0 999E" $"A297 92A6 B49D 8A95 A199 8A7C 6E72 786D" $"5C54 6572 6253 5B6A 6D5E 5560 6E66 5F74" $"8482 8287 9BA9 9D9A A8AE A79F A3A5 9EA3" $"A897 909E 9581 7878 7E6C 505E 7360 444F" $"665F 5A5F 5961 6F70 7378 7E87 8586 949E" $"9994 9EA3 A2A2 9A9B A8A9 A39A 8C8F 9B91" $"7F78 7978 6C69 7169 5551 6065 534D 585C" $"636B 6870 8182 8690 8F90 9B97 909C A399" $"989E 9A9D ABA6 9294 9E92 807F 8076 7178" $"746A 625C 686E 564D 575A 5A52 576E 7274" $"8486 8897 A3A5 9997 A7A1 8E8F 9EA3 9D99" $"9898 9293 8F7D 7B7E 7871 6868 6F65 6066" $"6660 555B 6C60 5362 6E72 7C85 8886 99B1" $"A297 ABA7 949A A096 8E93 948A 898D 8981" $"797B 8077 6E74 7166 6B68 646C 675D 6A70" $"5B5F 7975 6F83 857C 8D99 8D94 A89C 909D" $"A499 97A5 A191 8C87 8990 8774 7281 8070" $"7073 6C62 6874 6351 5F6A 605C 6A72 7283" $"8B78 84A2 978F A2A3 989A 9A9C A6A6 9892" $"9893 8886 7E6F 6B6F 7372 6B60 6371 7167" $"5F60 6B6F 6365 7471 7489 8E81 8DA2 9A9A" $"A095 9EA6 8D85 9094 988F 8385 8A8F 7F6B" $"7A81 7070 6A64 786B 5674 785C 6C7C 6961" $"6E76 757D 867C 809D 9987 96A8 9F91 909C" $"9988 8B96 8B84 8A8D 887A 757F 8279 6C71" $"7666 5A5D 6769 615B 5C69 716C 6A78 8781" $"8093 9496 A7A2 9AA4 AA9D 93A2 A491 9092" $"8C85 7D82 816F 6E7A 7461 5D6A 6761 6C5E" $"4E6A 735B 636E 727E 7E85 948E 94A5 A19B" $"9FA1 A29B 9692 8E9A 9F8A 8088 8E8C 7669" $"7C83 716D 756F 6066 7267 6672 645A 686A" $"616E 847A 708D A195 909C A1A5 A496 9199" $"A09A 8A8B 9E96 848D 8B79 7D85 796A 6D73" $"6561 645D 626A 6055 5865 6565 7475 7793" $"9585 99A8 A0AA B0A1 9697 A29F 8D93 938A" $"938B 7C84 8176 7876 6A66 6D6E 665E 6166" $"635F 5A60 6A60 657B 7583 9E88 84A8 AE9E" $"969D ABA4 8F91 9A92 9090 878A 8E81 7574" $"7C7E 706A 7571 6066 706A 655E 5F6A 6054" $"697B 7171 7F8A 9394 929A A3A7 A094 939B" $"9E97 9392 928E 8F90 7D7A 857D 7876 6A6B" $"7369 5E66 6966 675D 5664 6C67 6A75 7D85" $"8E8B 899A A29A 9FA4 958F 9DA1 958C 9299" $"9389 8786 8179 7674 6C6B 6D67 6562 656D" $"6563 6966 6970 727A 7F7F 8E99 8E8A 9CA9" $"9A8B 9597 8E96 9188 9192 9093 8B7F 7E88" $"8372 7677 6A6F 6C5B 6677 6E5D 5D6A 6E69" $"6D77 7B80 9091 828B 9D9C 9D9B 8B85 969F" $"8881 928F 8D97 8C82 847F 8885 6C74 8470" $"5E64 6F70 6A66 5A5A 696B 6368 7985 888E" $"8D8E 9CA0 9FA5 9385 9999 8483 8F95 8B87" $"9086 7A88 8975 737A 7573 6E64 6A70 6D69" $"605D 6160 6369 6E7B 807F 909B 949A AAA9" $"9C94 9A9B 8C87 8889 908A 8086 8578 787E" $"7971 7373 6D6A 696E 796F 5E66 706A 6667" $"6F77 7C89 887B 8FA7 9F9C A59E 9094 9F94" $"7F87 968B 8288 8378 7876 797C 706E 7267" $"6C77 7271 7068 6B6E 676A 7477 7981 8784" $"8593 989B 9E97 9796 989C 9190 9C97 9291" $"8984 7D76 7976 6D6D 6C62 616D 7672 615D" $"6C6C 5F64 7172 7A88 8482 949B 9598 A29F" $"9795 9596 9796 9193 9999 9486 797B 7D77" $"6D63 6168 675E 676F 666B 6962 6966 6A7D" $"7E7B 858E 9493 939D A2A1 9D92 8E90 8989" $"8F8C 929B 8C82 8983 8186 7A6C 6C6D 6968" $"6867 6A6C 635B 606B 6766 787B 7B86 8785" $"8E9C A49B 9398 9C9D 9485 8D9D 9288 8D93" $"8C80 8082 8381 7372 7064 686C 675E 5966" $"6753 5A6A 6E7C 837A 8394 9091 A4A8 9B99" $"A1A1 978D 919B 9692 8F84 8482 7675 7D7D" $"7164 6872 706D 6C6A 6E67 5D61 6466 6A74" $"8387 8086 9796 94A1 A099 9E97 878E 9A92" $"8B91 9895 8881 7F80 857F 706C 7171 6B6B" $"6F6F 6E6D 6B67 6061 636A 7A7B 767A 8090" $"9C91 95A6 9A98 9E92 9595 8D96 968F 908F" $"847E 8985 7570 706C 6465 6B67 6169 6D62" $"5D68 6A67 7881 757A 8D8A 8395 A59A 95A2" $"A295 9295 989A 988E 8387 8E82 7379 817A" $"7067 666E 746C 5F62 6D66 5C5E 666C 757F" $"8183 8587 949C 9494 9999 958B 8C94 9291" $"918D 8F90 8A7F 797B 7E79 6F6C 6C6A 7275" $"6864 6F72 655A 5E6A 7376 787C 8186 8C97" $"9E97 9AA4 9887 8E92 888D 958D 888E 938A" $"7C7E 8A87 796D 6A70 7269 676A 6967 6663" $"6161 6778 7B71 7A84 8491 9999 A2A0 9B9A" $"9596 9890 8B95 9584 858C 7F7B 8584 7D74" $"6F75 726C 6D68 6468 6965 5B5C 6E73 7180" $"8179 8B91 8D9B A099 9794 999A 8E8D 9394" $"968F 8282 8883 7A77 797D 786D 6E77 736B" $"6E74 6C62 6161 636A 7378 757A 8688 8E99" $"9894 949C 9B8C 8A94 9794 9490 8A8D 8F86" $"7D7A 8081 6E66 706F 6971 6F65 6D6F 6065" $"6B65 717F 7570 838F 868B 9797 9C9D 948F" $"9293 8E94 9A8E 878D 8F8A 7F78 7E85 7766" $"686D 6B6A 6867 696B 6A61 6674 7271 8286" $"7B80 9093 9197 9D99 8E8F 9693 908F 9294" $"8987 908B 7F77 7F88 766A 716F 6B6F 736B" $"606C 6F61 646B 7174 7885 837A 8A95 8F92" $"9899 958D 8D92 9090 8E91 9991 878B 8B84" $"7F81 7E76 766F 6873 7163 6974 6A5C 6669" $"5F71 7F73 7C8A 8384 97A0 9792 9B9F 948D" $"8F92 9395 908D 8D8A 8983 7B7D 8077 6E6D" $"6B6A 706C 6A6F 6964 6467 6E6C 6F7C 7E7B" $"818A 9396 959B 9D97 9491 9392 8E94 968B" $"868B 8C81 7E84 7B6F 7774 676C 7368 6A71" $"6B6A 6E66 656F 7476 7779 8285 8691 9292" $"9B9A 9494 9493 8E8E 9795 8785 8F89 797C" $"7F7A 7873 6E6D 6C6E 6E6D 6B69 6562 6870" $"6E70 7B7B 7B83 8187 9690 9198 9193 9690" $"9396 9695 9591 8C8B 847E 8381 7870 6F6C" $"676F 756C 6262 6A68 6164 6770 7C7C 787C" $"8890 939A 958E 9DA0 8E8A 9695 9097 9385" $"8991 8D7D 7883 7E74 706A 6C71 7070 6D68" $"6B70 6861 6C74 747A 7B78 818F 908D 9399" $"999A 9587 8A9D 9486 918F 868F 8C7D 7E8B" $"8577 7672 6F76 766E 676B 7268 616A 6969" $"6F6D 747E 7D7F 858F 9694 9A9D 9493 9A99" $"918F 9494 8C84 8987 7D81 8478 7275 7170" $"706D 7171 6A69 6968 6C6A 6976 7D76 7D86" $"7E89 A195 899A 9E93 9493 8E95 9991 8686" $"8984 7F81 7973 7B75 666D 7670 7274 6E6F" $"6F6F 726D 6673 847A 6E78 878D 8E8C 898F" $"9A96 8E8C 8D91 9996 8684 9290 8484 8178" $"7E81 6F65 7079 746C 6D70 7070 6964 6F7B" $"766E 7880 7B82 8F8A 8998 9990 8E8F 9399" $"978E 8A8F 908F 8D80 7E85 7D77 756A 6B75" $"7065 6971 6F69 656B 7271 767C 7B7D 8588" $"8B94 9592 9796 9190 9290 8D90 8D85 868D" $"897E 7F82 807C 7470 7274 7270 716C 6D74" $"6B65 7073 7079 7E7B 7E83 8991 918D 949A" $"8C86 9493 888C 908A 8989 8687 8482 867F" $"7578 776F 7475 6F70 6E69 6B6B 6867 6B70" $"777E 7B7A 8491 9591 9296 9394 978E 8C96" $"918A 918C 838A 8B7E 797E 7F73 6A73 7770" $"6C6D 6D6E 6E6A 6667 6A71 7979 747C 898D" $"9092 9595 9097 9C90 888E 9597 8A7D 8592" $"8A77 7883 7E74 736F 6C75 776D 696F 766D" $"626D 736A 7180 7A74 808D 8E8A 8E95 9392" $"958E 8C94 938D 8987 8D8C 8383 807F 817C" $"7470 7377 736C 6D6F 6C6C 6965 6972 7171" $"7F80 7282 978C 8A92 9292 9494 9194 948F" $"9193 8A89 8B85 8180 7E7A 7777 736F 7373" $"706B 6971 6D62 6A70 6C75 7D7A 7D87 8B8D" $"8F91 9494 9290 8E90 908D 8E91 8A86 8C89" $"8481 7D7F 7A74 7874 727A 7569 6C75 756C" $"636B 7573 7477 7880 8A87 8894 928D 9391" $"9092 898B 958C 858A 8A89 8880 8084 7F7B" $"7573 7975 6F71 726E 6D6E 686B 746D 6D7B" $"7976 7E84 8A8F 8A89 9195 928C 8E93 8E8D" $"8B86 8886 8786 7C7E 817A 777A 7974 7372" $"7070 6E6E 6F69 6C72 7578 797B 8186 8687" $"8F8E 8B90 928F 8C90 928D 8D8D 8886 8584" $"7F7C 7F7D 7976 7477 7976 7170 7472 6E70" $"6D6D 7679 7A7A 7D87 8989 8E8C 8B91 908D" $"8B8B 908C 898C 8988 8985 8581 7D7F 7E78" $"7578 7973 7276 7471 7270 6F72 7477 7777" $"7E81 8287 8989 8E91 8F8B 8D8D 8D8D 8B8B" $"8789 8A83 8787 7D81 857B 747A 7C70 7175" $"6F6E 716F 6E70 7275 7A79 7A80 8388 8989" $"908D 8D93 8E8B 8E8F 8E8B 8888 8783 8383" $"7E7F 817B 7778 7977 7270 7471 6D70 706D" $"7075 7579 807E 8089 8989 8D8B 8B90 8B86" $"8C8E 8987 8989 8481 8483 817C 7A7E 7B7A" $"7A74 7678 7575 7270 716E 6C71 7776 747C" $"807E 858A 878A 8D8C 8D8C 8A87 888F 8F85" $"8186 8886 827C 7D84 7F75 757A 7A74 6F75" $"746E 7070 6E70 7576 767B 7E7B 838E 8888" $"908F 8E90 8F8A 8D92 8C87 8987 8685 8180" $"7E7F 817A 757A 7B76 7274 7671 7476 6C70" $"7B77 787F 7E7D 8289 8A87 898E 8D8C 8C87" $"8B90 8D88 8787 8685 827F 8183 807C 797B" $"7D78 7678 7773 7375 726F 7376 7779 7A7B" $"8084 8687 8789 8C8A 8B8A 8C8D 8A8B 8A89" $"8A87 8584 8380 8182 7C79 7C78 7474 7474" $"7372 6F6D 7378 7274 7E7D 7E83 8385 898D" $"8E8A 8B8D 8B8B 8A8A 8B88 8282 8584 8381" $"7E7E 7E7A 7879 7777 7773 7274 7271 7476" $"7677 7A7C 7E80 8183 898B 8788 8C8C 8B8A" $"8989 8A86 8283 8581 8085 807A 8182 7979" $"7A78 7977 7471 7374 7274 7575 7A7C 797B" $"8082 8388 8985 888D 8A87 898A 8B89 8684" $"8486 8581 7F7F 8280 7977 797A 7875 7774" $"7277 7572 7575 777E 7D7A 7E82 8586 8689" $"8B89 898B 8A89 8C88 8589 8883 8385 817F" $"827F 797B 7D77 757B 7773 7877 7476 7978" $"797E 7D7C 8081 8285 8989 8888 898B 8A87" $"898A 8685 8585 8583 8383 7F7C 807E 7879" $"7B7A 7876 7775 7779 7776 7A7D 7B7B 8082" $"7F82 8888 8686 888C 8683 8B89 8587 8483" $"8787 8280 8281 817E 7879 7C79 7576 7675" $"7575 7577 7678 7C7C 7D7E 8183 8486 8789" $"8886 8889 8788 8885 8386 8681 8184 817D" $"7F80 7B7A 7B78 7878 7577 7775 7575 787A" $"7A7B 7D7F 8081 8285 8788 8787 8787 8888" $"8586 8682 8484 8282 7F7F 807C 7B7C 7B7A" $"7879 7A7A 7776 7776 7879 787A 7B7E 807E" $"8183 8487 8787 8786 8889 8584 8784 8286" $"8381 827F 7D7D 7D7C 7A79 7A79 7A78 7779" $"7978 7878 787A 7D7E 7C7D 8284 8485 8688" $"8988 8686 8888 8584 8484 8484 807E 817F" $"7B7E 7D79 797A 7A79 797A 7779 7C79 797B" $"7C7F 817E 7E84 8583 8587 8686 8987 8587" $"8685 8684 8383 8481 7D80 817C 7C7C 7A7B" $"7A78 7B7B 7779 7879 7A7A 7C7E 7D7F 8180" $"8387 8383 8887 8485 8786 8586 8584 8483" $"8483 807F 7F7F 7C7D 7E79 787B 7C7A 7979" $"7979 7A7B 7A7B 807F 7E81 8183 8685 8486" $"8685 8585 8484 8584 8182 8482 8180 7F7E" $"7E7E 7C7A 7A7A 7A7C 7977 7B7C 797A 7A79" $"7E80 7F7E 7F84 8584 8483 8689 8684 8385" $"8683 8282 8182 837E 7D80 817D 7C7C 7B7C" $"7C7B 7A79 7B7B 7A7A 797B 7E7E 7F7F 7F81" $"8282 8484 8485 8585 8483 8484 8381 8182" $"817F 7E7D 807E 7A7C 7E7D 7B7B 7C7B 7B7C" $"7B79 7B7C 7C7D 7E7F 7F80 8181 8484 8485" $"8383 8584 8383 8483 8182 8280 807E 7E80" $"7E7A 7C7D 7C7C 7C7C 7C7B 7C7C 7B7D 7C7C" $"7F7F 7E7F 8081 8382 8383 8385 8582 8285" $"8482 8282 8181 817F 7F7F 7F7D 7D7D 7B7D" $"7F7B 7B7D 7C7D 7E7C 7C7D 8180 7D7F 8182" $"8282 8383 8283 8382 8383 8383 8180 8182" $"817E 7F80 7F7E 7E7D 7D7E 7D7C 7D7D 7B7D" $"7E7C 7D7E 7E7F 7F80 7F80 8381 8083 8382" $"8283 8382 8282 8281 8182 817F 7E81 807E" $"7E7E 7D7D 7E7E 7D7C 7D7E 7C7C 7C7D 7E7E" $"7F7F 7F80 8181 8282 8283 8282 8282 8181" $"8281 7F81 817F 7F80 7F7E 7E7F 7E7D 7E7E" $"7E7D 7D7E 7E7D 7D7E 7E7E 7F7F 7F7F 8081" $"8182 8281 8281 8182 8181 8181 7F80 8180" $"7F7F 8080 7F7F 7F7E 7E7E 7E7E 7E7E 7E7E" $"7E7D 7E7F 7E7F 7F7F 7F81 8181 8181 8181" $"8181 8181 8180 8080 8080 807F 807F 7F7F" $"7E7F 7F7E 7E7E 7E7F 7F7E 7E7E 7F7F 7F7F" $"7F80 8080 8081 8180 8181 8080 8180 8181" $"8080 8080 7F7F 8080 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 807F 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"807F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 807F 7F7F 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080" } }; resource 'snd ' (9546, "Leather Drum", purgeable) { FormatOne { { /* array Synthesizers: 1 elements */ /* [1] */ sampledSynth, 160 } }, { /* array SoundCmnds: 1 elements */ /* [1] */ hasData, bufferCmd { 20 } }, { /* array DataTables: 1 elements */ /* [1] */ 18048, Rate22K, 18046, 18047, 0x0, 0x3C, $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"807F 7F7F 8080 7F80 8382 8181 8080 7F7F" $"888E 8478 7577 7D81 7976 7C80 807F 7C7C" $"7C79 7470 7174 7575 7576 7979 7878 7A73" $"6B6B 6E72 7475 7877 7271 7176 8288 8C8F" $"8C89 8A8F 9795 8E8D 877E 7A81 9099 9894" $"9396 989B A0A0 948A 8682 8085 8D93 948F" $"8A89 8B86 7E7A 7877 7776 7A83 8582 8487" $"837B 756D 6A7F 9AA0 9A94 8B81 7F7A 7670" $"6864 5E5D 6974 766D 6C77 7165 6161 676C" $"6657 4B45 3C3B 4958 6162 5C59 5C5F 5E5F" $"6162 656C 737A 8081 8082 858B 949C A4AC" $"B4BA B9B6 B8BE C1C2 C8D3 DBDE E0E3 E2DD" $"D5CB C4C3 C3BF B8AD A399 9088 837F 7973" $"6B63 5D5A 5751 4C48 4544 413B 3633 3234" $"3536 383B 3B37 312F 3032 3436 3635 3433" $"3338 424B 5157 5C63 6C72 7679 7B7C 7E82" $"878C 9195 979A 9FA4 A8AD B2B5 B6B7 B7B7" $"B6B4 B2B2 B2B2 B4B7 BABB BCBB BABA BABA" $"B9B7 B4B3 B2B0 AFAB A7A5 A4A3 A1A0 9F9F" $"9D9A 9691 8E8B 8987 837F 7A75 706D 6966" $"625D 5954 504A 423A 342E 2926 2423 2323" $"2425 2625 2627 2A2F 343A 4045 484A 4E52" $"5559 5F64 696E 7379 8085 8B91 969B 9FA3" $"A6A8 ABAE B2B4 B6B8 BABC BFC3 C8CC D1D5" $"D6D6 D6D4 D1CD C9C5 C1BD B9B6 B2AF AAA5" $"A09B 9691 8D89 8683 807D 7975 726F 6C69" $"6664 6260 5F5D 5C5B 5958 5858 5755 5250" $"4E4B 4947 4442 4141 4142 4345 4748 4949" $"4949 494A 4B4D 4E50 5359 5F65 6C72 787F" $"848A 9095 999E A2A5 A8AC AFB3 B6B9 BDBF" $"C1C2 C3C4 C4C4 C5C4 C3C2 C1C0 BFBE BDBB" $"B8B5 B2AF ADAA A7A4 A19E 9B97 9390 8C88" $"847F 7A75 706C 6763 5F5B 5855 5350 4D4A" $"4642 403E 3C3B 3938 3838 3839 3B3D 4043" $"4648 4B4E 5155 585A 5B5C 5E60 6265 686B" $"6F72 7679 7B7E 8084 878A 8E91 9496 999B" $"9DA0 A2A5 A8AC AFB4 B9BE C3C8 CCCF D0D0" $"D1D0 CFCC C9C6 C2BE B9B3 AFAA A5A2 9E9A" $"9794 918E 8A86 827E 7A76 716D 6863 5F5A" $"5550 4C47 4341 3F3E 3F3F 3F3F 3F3F 3F3F" $"4040 4041 4243 4547 4A4E 5155 595E 6368" $"6C70 7478 7B7F 8286 8A8D 9093 9597 989A" $"9C9E A0A2 A4A6 A8A9 ABAC ACAD ADAD ADAE" $"ADAD ACAB ABAA AAAA A9A9 A8A8 A9A9 A8A7" $"A5A3 A09D 9B99 9794 928F 8D8B 8886 8380" $"7D79 7571 6D68 635E 5A57 5350 4C49 4644" $"413F 3F3F 3F3E 3E3E 3F40 4142 4345 4647" $"494B 4D4F 5255 585B 5F64 696E 747A 7F85" $"8A8F 959A 9DA1 A4A7 ABAF B2B5 B7B8 B9B9" $"BABB BBBC BCBC BBBA B8B6 B4B3 B0AE ABA8" $"A4A0 9D9A 9794 918E 8B88 8481 7D79 7673" $"716E 6C6B 6968 6766 6565 6667 6868 6867" $"6766 6564 6361 5F5D 5B59 5757 5655 5656" $"5657 5757 5859 5A5B 5C5E 6063 6668 6B6E" $"7174 777B 7E81 8488 8B8E 9092 9497 999B" $"9D9F A1A3 A5A7 A9AA ACAD AFB2 B5B7 B9BA" $"BBBB BBBA B8B6 B4B1 AEAA A7A3 A09C 9894" $"908C 8884 807C 7874 6F6B 6864 605D 5956" $"5452 504F 4E4D 4D4D 4E4E 4E4F 4F50 5153" $"5456 585B 5E62 6569 6D71 7579 7C7E 8081" $"8282 8383 8383 8383 8384 8485 8788 8A8B" $"8D8F 9091 9192 9395 9697 9899 9A9A 9B9C" $"9C9D 9E9E 9E9E 9E9F 9F9F 9F9E 9D9C 9C9B" $"9A99 9898 9795 9392 908F 8D8B 8986 8481" $"7F7C 7976 726E 6A65 615D 5956 5350 4D4B" $"4947 4645 4546 4747 484A 4B4D 4F50 5255" $"585A 5D61 6569 6C70 7378 7C81 8589 8E93" $"969A 9DA1 A4A6 A9AB ADAE AFB0 B0B0 B0AF" $"AEAC ABA9 A7A5 A3A0 9D9A 9896 9493 9190" $"8E8D 8B89 8887 8584 8281 7F7E 7D7B 7A78" $"7674 7270 6F6E 6E6D 6D6C 6C6D 6D6D 6D6D" $"6D6D 6D6C 6C6B 6B6B 6A69 6968 6767 6767" $"6666 6565 6564 6463 6363 6364 6566 686A" $"6C6F 7174 787B 7E81 8588 8C8F 9396 999C" $"9EA1 A4A6 A7A9 ABAE AFB1 B3B4 B5B5 B5B5" $"B4B3 B1B0 AEAC A9A6 A29F 9B97 938F 8B87" $"837F 7B78 7471 6E6B 6866 6361 605F 5E5E" $"5E5E 5D5D 5D5D 5D5D 5C5C 5C5D 5D5E 5F60" $"6263 6567 696C 6E71 7375 7779 7B7D 7F81" $"8283 8485 8686 8686 8687 8787 8888 8889" $"8989 898A 8A8B 8B8C 8C8D 8E8F 9091 9293" $"9596 9799 9A9B 9C9C 9C9C 9C9C 9C9C 9B9B" $"9B9A 9A99 9796 9492 908E 8C8A 8784 827F" $"7C79 7673 706D 6A67 6461 5E5C 5957 5554" $"5352 5151 5051 5151 5253 5556 585A 5C5F" $"6265 686B 6E71 7477 7A7D 8083 8688 8B8E" $"9093 9596 989A 9C9E 9FA0 A1A2 A3A3 A3A2" $"A2A1 A09F 9E9C 9B99 9896 9593 9291 908F" $"8E8D 8C8A 8988 8887 8685 8483 8281 807F" $"7E7D 7C7B 7B7A 7979 7877 7675 7574 7372" $"7170 6F6E 6D6C 6A68 6765 6463 6261 605F" $"5F5F 5E5E 5F5F 5F60 6163 6466 6769 6B6D" $"6F72 7477 7A7C 7F81 8487 8A8D 9092 9598" $"9A9D 9FA1 A4A6 A7A8 A9AA ABAB ACAB ABAA" $"A9A8 A7A5 A4A2 9F9D 9B98 9693 918E 8C89" $"8684 817E 7C79 7775 7371 6F6E 6D6C 6B6A" $"6867 6665 6565 6465 6565 6565 6666 6667" $"6768 696A 6B6C 6D6E 6F70 7273 7475 7677" $"7879 797A 7B7C 7D7D 7E7F 8080 8182 8485" $"8687 888A 8C8D 8F91 9293 9495 9697 9899" $"9A9A 9B9C 9C9C 9C9D 9D9C 9C9B 9B9A 9998" $"9796 9493 9190 8E8C 8A88 8583 807E 7B79" $"7674 716F 6C6A 6866 6462 6160 5F5E 5D5D" $"5C5C 5C5D 5D5E 5F60 6162 6465 6769 6A6C" $"6E70 7274 7678 7A7B 7D7F 8182 8485 8788" $"8A8C 8E8F 9092 9393 9494 9595 9595 9595" $"9494 9494 9393 9292 9191 9190 9090 908F" $"8F8F 8F8E 8E8D 8D8C 8B89 8887 8584 8382" $"807F 7E7C 7B7A 7977 7675 7574 7372 7170" $"6E6D 6C6B 6A69 6867 6665 6464 6363 6364" $"6464 6566 6768 6A6B 6D6F 7174 7679 7B7D" $"8082 8587 898B 8D90 9293 9597 9899 9B9B" $"9C9C 9D9E 9E9E 9E9E 9F9E 9E9D 9D9C 9B99" $"9897 9594 9291 8F8E 8C8A 8886 8583 817F" $"7D7C 7A79 7877 7675 7473 7372 7171 7070" $"7070 7070 7070 7070 7070 6F6F 6F6F 6F6F" $"7070 7070 7071 7171 7273 7374 7575 7677" $"7879 7A7B 7B7C 7D7D 7E7F 7F80 8182 8485" $"8688 898B 8D8E 9092 9395 9698 999A 9B9C" $"9C9D 9D9D 9C9C 9B9A 9998 9795 9492 918F" $"8D8B 8A88 8684 8280 7E7D 7B79 7775 7371" $"6F6E 6C6A 6967 6665 6463 6362 6262 6363" $"6465 6567 6869 6B6D 6E70 7173 7476 7778" $"797B 7C7D 7E7F 7F80 8182 8384 8586 8787" $"8889 8989 8A8A 8A8B 8C8C 8D8D 8E8E 8E8E" $"8F8F 8E8E 8E8E 8E8E 8E8E 8E8E 8D8D 8D8D" $"8D8C 8C8C 8C8C 8B8B 8A8A 8A89 8887 8584" $"8381 807E 7D7B 7A78 7674 7271 6F6E 6C6B" $"6A69 6968 6868 6868 6868 6868 6969 696A" $"6B6C 6D6E 6F70 7273 7577 787A 7C7E 8083" $"8587 8A8C 8E90 9293 9495 9697 9898 9898" $"9898 9897 9796 9594 9392 9190 908F 8E8D" $"8C8B 8A89 8786 8584 8382 8180 7F7E 7E7D" $"7C7C 7B7B 7A7A 7979 7979 7979 7979 7979" $"7979 7979 7878 7877 7777 7676 7575 7474" $"7373 7272 7272 7272 7272 7272 7373 7475" $"7677 7879 7A7B 7D7E 7F81 8283 8486 8789" $"8A8C 8D8E 9091 9293 9495 9697 9798 9899" $"9999 9898 9797 9695 9392 918F 8D8C 8A88" $"8684 8280 7E7C 7A78 7775 7472 7170 6F6E" $"6D6C 6B6B 6A6A 6A6A 6A6A 6B6B 6C6D 6D6E" $"6F70 7172 7374 7677 787A 7B7C 7D7F 8081" $"8182 8383 8484 8585 8585 8686 8685 8585" $"8585 8585 8686 8687 8787 8788 8888 8889" $"898A 8A8A 8B8B 8B8B 8B8C 8C8C 8C8C 8C8C" $"8C8C 8C8C 8B8B 8A8A 8988 8786 8584 8281" $"7F7E 7D7B 7978 7675 7472 7170 6F6E 6D6C" $"6B6A 6A69 6969 6969 6A6A 6B6C 6D6E 6F70" $"7273 7476 7779 7A7C 7E7F 8183 8586 888A" $"8B8C 8E8F 9090 9192 9393 9393 9393 9393" $"9292 9190 908F 8E8D 8D8C 8B8A 8988 8786" $"8584 8383 8281 8180 7F7F 7E7D 7D7C 7C7C" $"7C7B 7B7B 7B7B 7B7B 7B7B 7A7A 7A7A 7A7A" $"7979 7978 7878 7777 7676 7575 7574 7474" $"7474 7373 7374 7474 7475 7676 7778 7979" $"7A7B 7D7E 7F80 8283 8486 8788 8A8B 8C8D" $"8E8F 9091 9292 9393 9494 9494 9493 9393" $"9291 908F 8E8D 8B8A 8887 8584 8281 7F7E" $"7C7B 7A78 7776 7574 7373 7272 7171 7070" $"7070 7070 7171 7171 7272 7374 7475 7677" $"7879 7A7B 7C7D 7E7F 7F80 8081 8181 8282" $"8283 8383 8383 8383 8383 8383 8383 8384" $"8484 8585 8586 8686 8787 8888 8889 898A" $"8A8A 8A8A 8A8A 8A8A 8B8B 8B8B 8B8B 8A8A" $"8A89 8988 8786 8584 8382 817F 7E7D 7B7A" $"7977 7675 7473 7271 7070 6F6F 6F6E 6E6E" $"6E6F 6F6F 7071 7273 7475 7677 7879 7B7C" $"7D7E 8081 8284 8586 8788 8A8B 8C8C 8D8E" $"8E8F 8F90 9090 9090 8F8F 8E8D 8D8C 8B8A" $"8989 8887 8685 8584 8382 8181 8080 7F7F" $"7F7E 7E7E 7E7D 7D7D 7D7D 7C7C 7C7C 7C7C" $"7C7C 7C7B 7B7B 7B7B 7B7B 7B7A 7A7A 7A7A" $"7979 7979 7878 7877 7777 7776 7676 7676" $"7676 7777 7778 797A 7B7B 7C7D 7E7F 8182" $"8384 8586 8788 898A 8B8C 8C8D 8E8E 8F8F" $"8F90 9090 9090 8F8F 8F8E 8E8D 8C8B 8B8A" $"8887 8685 8482 817F 7E7C 7B7A 7877 7675" $"7474 7372 7272 7171 7171 7172 7273 7374" $"7575 7677 7878 797A 7A7B 7C7C 7D7E 7E7F" $"7F80 8081 8182 8282 8383 8383 8384 8484" $"8484 8483 8383 8384 8484 8484 8484 8484" $"8484 8585 8586 8686 8787 8888 8889 8989" $"8989 8989 8989 8888 8887 8686 8584 8483" $"8282 8180 7F7E 7D7C 7B7A 7978 7877 7675" $"7474 7373 7272 7271 7171 7172 7272 7374" $"7576 7778 797A 7C7D 7E7F 8082 8384 8587" $"8889 898A 8B8B 8C8C 8C8D 8D8D 8D8D 8D8D" $"8C8C 8B8B 8A8A 8988 8887 8686 8584 8382" $"8181 807F 7E7E 7D7D 7C7C 7C7B 7B7B 7B7B" $"7B7B 7B7B 7B7C 7C7C 7D7D 7D7D 7D7D 7D7D" $"7E7D 7D7D 7D7D 7D7D 7C7C 7C7C 7C7B 7B7B" $"7B7B 7A7A 7A7A 7A7A 7A7A 7A7A 7B7B 7B7B" $"7C7C 7D7D 7E7F 7F80 8182 8384 8586 8687" $"8889 8A8A 8B8C 8C8D 8D8D 8D8E 8E8D 8D8D" $"8C8C 8B8A 8989 8887 8685 8382 8180 7F7E" $"7D7C 7B79 7877 7776 7575 7474 7373 7372" $"7272 7273 7373 7475 7576 7778 797A 7A7B" $"7C7D 7E7F 8081 8282 8384 8485 8586 8686" $"8686 8787 8787 8786 8686 8585 8585 8484" $"8484 8484 8383 8383 8382 8282 8282 8282" $"8282 8282 8383 8383 8383 8384 8484 8484" $"8484 8483 8383 8282 8181 807F 7F7E 7E7D" $"7C7C 7B7A 7979 7878 7777 7676 7575 7575" $"7575 7575 7676 7778 7879 7A7B 7C7D 7E7F" $"8081 8283 8485 8687 8889 8A8A 8B8B 8C8C" $"8D8D 8D8D 8D8D 8D8C 8C8C 8B8A 8A89 8887" $"8685 8483 8382 8180 7F7E 7D7C 7B7A 7A79" $"7979 7878 7878 7878 7878 7878 7879 7979" $"7A7A 7B7B 7C7C 7C7D 7D7D 7E7E 7E7F 7F7F" $"8080 8080 8080 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7E 7E7E 7E7F 7F7F 7F7F 7F80 8080" $"8181 8282 8383 8484 8585 8686 8787 8788" $"8888 8888 8888 8888 8888 8787 8686 8584" $"8383 8281 807F 7E7E 7D7C 7B7A 7978 7777" $"7676 7575 7574 7474 7474 7475 7576 7677" $"7879 797A 7B7C 7D7E 7F80 8182 8384 8586" $"8687 8788 8889 8989 8989 8989 8989 8989" $"8888 8887 8686 8585 8484 8383 8281 8180" $"807F 7F7E 7E7E 7E7D 7D7D 7D7D 7D7D 7D7D" $"7D7D 7E7E 7E7E 7F7F 7F7F 7F80 8080 8080" $"8080 8080 8080 807F 7F7F 7F7F 7E7E 7E7E" $"7D7D 7D7D 7D7D 7D7D 7D7D 7D7D 7D7D 7E7E" $"7E7F 7F80 8080 8182 8283 8384 8485 8686" $"8787 8788 8889 8989 8989 8989 8988 8888" $"8787 8686 8584 8382 8180 7F7F 7E7D 7C7C" $"7B7A 7A79 7878 7777 7676 7676 7676 7676" $"7676 7777 7778 7979 7A7B 7B7C 7D7E 7E7F" $"8081 8182 8383 8484 8585 8585 8586 8686" $"8585 8585 8585 8584 8484 8383 8382 8282" $"8181 8181 8181 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8081 8181 8181" $"8080 8080 8080 7F7F 7F7E 7E7E 7D7D 7D7C" $"7C7B 7B7B 7A7A 7A79 7979 7979 7979 797A" $"7A7A 7B7B 7B7C 7C7D 7D7E 7F7F 8081 8182" $"8283 8484 8586 8687 8788 8888 8989 8989" $"8989 8888 8888 8787 8686 8584 8483 8281" $"8080 7F7E 7E7D 7C7C 7B7B 7A7A 7A79 7979" $"7979 7979 7979 7A7A 7A7A 7B7B 7C7C 7D7D" $"7E7E 7F7F 8080 8181 8282 8383 8384 8484" $"8484 8484 8484 8484 8484 8383 8383 8282" $"8282 8281 8181 8181 8181 8181 8181 8181" $"8181 8182 8282 8282 8282 8282 8282 8282" $"8282 8282 8281 8181 8181 8080 807F 7F7E" $"7E7D 7D7C 7C7C 7B7B 7B7B 7A7A 7A7A 7A79" $"7979 7A7A 7A7A 7B7B 7C7C 7D7D 7E7E 7F7F" $"8081 8282 8384 8485 8586 8686 8787 8788" $"8888 8888 8887 8787 8786 8686 8585 8484" $"8382 8281 8080 7F7E 7E7D 7D7C 7C7B 7B7B" $"7A7A 7A7A 7A7A 7A7A 7A7A 7A7A 7B7B 7B7B" $"7C7C 7C7D 7D7E 7E7E 7F7F 7F80 8080 8081" $"8181 8181 8181 8182 8282 8181 8281 8181" $"8181 8181 8181 8181 8181 8181 8181 8181" $"8282 8282 8383 8383 8384 8484 8484 8484" $"8484 8484 8483 8383 8382 8281 8181 8080" $"7F7F 7E7E 7D7C 7C7B 7B7A 7A7A 7979 7979" $"7979 7878 7878 7879 7979 7A7A 7B7B 7C7C" $"7D7D 7E7F 7F80 8182 8283 8484 8585 8686" $"8787 8788 8888 8888 8888 8887 8787 8686" $"8685 8584 8483 8382 8281 8080 7F7F 7F7E" $"7E7D 7D7D 7C7C 7C7C 7C7B 7B7B 7B7B 7B7B" $"7B7B 7C7C 7C7C 7D7D 7D7D 7D7E 7E7E 7E7E" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 8080 8080 8081" $"8181 8182 8282 8383 8384 8484 8585 8585" $"8585 8585 8585 8585 8585 8484 8383 8282" $"8181 8080 7F7E 7E7D 7D7C 7B7B 7A7A 7979" $"7878 7878 7777 7777 7777 7878 7878 7979" $"7A7A 7B7B 7C7D 7D7E 7F7F 8081 8182 8383" $"8485 8586 8687 8787 8888 8888 8888 8888" $"8888 8787 8787 8686 8585 8584 8483 8382" $"8281 8180 807F 7F7F 7E7E 7E7E 7D7D 7D7D" $"7D7D 7D7D 7D7C 7C7C 7C7C 7D7D 7D7D 7D7D" $"7D7D 7D7D 7D7D 7D7D 7D7D 7D7D 7D7D 7D7D" $"7D7D 7D7D 7D7D 7D7D 7E7E 7E7E 7E7F 7F7F" $"8080 8181 8282 8383 8484 8585 8586 8687" $"8788 8888 8888 8989 8988 8888 8888 8787" $"8686 8685 8484 8382 8181 807F 7F7E 7D7D" $"7C7B 7B7A 7A79 7978 7878 7877 7777 7778" $"7878 7878 7979 797A 7A7B 7B7C 7C7D 7E7E" $"7F7F 8081 8182 8283 8383 8484 8585 8585" $"8686 8686 8686 8686 8686 8585 8584 8484" $"8483 8383 8282 8282 8181 8180 8080 8080" $"7F7F 7F7F 7F7F 7F7F 7F7E 7E7E 7E7E 7E7D" $"7D7D 7D7D 7D7D 7C7C 7C7C 7B7B 7B7B 7B7B" $"7B7B 7A7A 7A7A 7A7A 7A7A 7B7B 7B7B 7C7C" $"7C7D 7D7D 7E7E 7F80 8081 8182 8383 8484" $"8586 8687 8787 8888 8889 8989 8989 8989" $"8988 8888 8787 8686 8584 8483 8382 8180" $"807F 7E7D 7D7C 7C7B 7A7A 7979 7878 7877" $"7777 7777 7777 7777 7878 7879 7979 7A7A" $"7B7B 7C7C 7D7E 7E7F 7F80 8081 8182 8283" $"8383 8484 8484 8585 8585 8585 8585 8585" $"8585 8585 8585 8484 8484 8484 8484 8483" $"8383 8383 8382 8282 8282 8282 8281 8181" $"8180 807F 7F7F 7E7E 7E7D 7D7D 7C7C 7B7B" $"7B7A 7A7A 7979 7979 7979 7878 7878 7979" $"7979 7A7A 7A7B 7B7C 7C7D 7D7E 7E7F 8080" $"8182 8283 8484 8586 8687 8788 8888 8989" $"8989 8989 8989 8989 8888 8887 8686 8585" $"8483 8382 8181 807F 7E7E 7D7C 7C7B 7B7A" $"7A79 7979 7878 7878 7878 7878 7878 7979" $"7979 7A7A 7B7B 7B7C 7C7D 7D7E 7E7F 7F80" $"8081 8182 8282 8383 8384 8484 8485 8585" $"8585 8585 8585 8585 8585 8585 8585 8585" $"8585 8584 8484 8484 8483 8383 8382 8282" $"8181 8181 8080 7F7F 7F7E 7E7E 7D7D 7C7C" $"7B7B 7B7A 7A7A 7979 7979 7978 7878 7878" $"7878 7879 7979 7A7A 7A7B 7B7C 7C7D 7E7E" $"7F80 8081 8282 8384 8485 8586 8787 8888" $"8989 8989 8A8A 8A8A 8A8A 8989 8989 8888" $"8787 8685 8584 8383 8281 8180 7F7E 7E7D" $"7C7C 7B7A 7A7A 7979 7878 7878 7877 7777" $"7878 7878 7879 7979 797A 7A7A 7B7B 7C7C" $"7D7D 7D7E 7E7F 7F80 8080 8181 8282 8283" $"8383 8384 8484 8484 8585 8585 8585 8585" $"8585 8585 8585 8585 8585 8585 8585 8484" $"8484 8383 8282 8281 8180 807F 7F7E 7E7D" $"7D7C 7C7B 7B7A 7A79 7979 7878 7878 7777" $"7777 7777 7777 7777 7878 7879 797A 7A7B" $"7B7C 7D7D 7E7F 8081 8182 8384 8485 8686" $"8787 8888 8989 898A 8A8A 8A8A 8A8A 8A89" $"8989 8988 8887 8686 8584 8483 8282 8180" $"7F7F 7E7D 7D7C 7B7B 7A7A 7979 7978 7878" $"7878 7878 7878 7878 7878 7879 7979 7A7A" $"7A7B 7B7B 7C7C 7C7D 7D7E 7E7F 7F7F 8080" $"8181 8282 8383 8384 8484 8585 8686 8686" $"8787 8787 8788 8888 8888 8888 8888 8887" $"8787 8786 8686 8585 8484 8383 8282 8180" $"807F 7F7E 7D7D 7C7B 7B7A 7A79 7978 7877" $"7777 7676 7676 7676 7676 7676 7677 7778" $"7879 797A 7B7B 7C7D 7D7E 7F80 8181 8283" $"8485 8586 8787 8889 898A 8A8A 8A8B 8B8B" $"8B8A 8A8A 8A8A 8989 8888 8787 8685 8584" $"8383 8281 8080 7F7E 7E7D 7C7C 7B7B 7A7A" $"7979 7978 7878 7877 7777 7777 7777 7777" $"7878 7878 7979 797A 7A7A 7B7B 7C7C 7C7D" $"7D7E 7E7F 7F80 8081 8182 8283 8384 8485" $"8585 8686 8787 8787 8888 8888 8888 8989" $"8988 8888 8888 8787 8786 8685 8584 8483" $"8382 8180 807F 7E7D 7D7C 7B7B 7A79 7978" $"7777 7676 7575 7574 7474 7474 7474 7475" $"7575 7676 7777 7879 7A7A 7B7C 7D7E 7F80" $"8182 8283 8485 8687 8788 8989 8A8A 8B8B" $"8C8C 8C8C 8C8C 8C8C 8B8B 8B8A 8A89 8888" $"8786 8685 8483 8382 8180 807F 7E7D 7D7C" $"7B7B 7A79 7978 7878 7777 7676 7676 7676" $"7676 7676 7676 7777 7777 7878 7979 7A7A" $"7B7B 7C7C 7D7D 7E7E 7F80 8081 8182 8383" $"8484 8585 8686 8787 8888 8989 8989 8A8A" $"8A8A 8A8A 8A8A 8A8A 8A8A 8989 8988 8887" $"8686 8584 8383 8281 807F 7E7D 7D7C 7B7A" $"7979 7877 7676 7574 7473 7373 7372 7272" $"7273 7373 7374 7475 7576 7778 7879 7A7B" $"7C7D 7E7F 8081 8283 8485 8687 8788 898A" $"8A8B 8C8C 8C8D 8D8D 8D8D 8D8D 8D8D 8C8C" $"8B8B 8A8A 8988 8787 8685 8484 8382 8180" $"7F7E 7E7D 7C7B 7B7A 7979 7878 7777 7676" $"7675 7575 7575 7575 7575 7575 7576 7676" $"7777 7878 7979 7A7A 7B7C 7C7D 7E7E 7F80" $"8181 8283 8484 8586 8787 8889 898A 8A8B" $"8B8C 8C8C 8C8D 8D8D 8D8D 8D8D 8C8C 8C8B" $"8B8A 8989 8887 8685 8484 8382 8180 7F7E" $"7D7C 7B7A 7978 7776 7575 7473 7372 7272" $"7171 7171 7171 7171 7272 7373 7475 7576" $"7778 797A 7B7C 7D7E 7F80 8182 8384 8586" $"8788 898A 8B8B 8C8D 8D8E 8E8E 8E8E 8E8E" $"8E8E 8E8D 8D8D 8C8B 8B8A 8988 8887 8685" $"8483 8281 807F 7E7D 7C7B 7A7A 7978 7777" $"7675 7574 7474 7373 7272 7272 7272 7272" $"7273 7373 7474 7475 7676 7778 7879 7A7B" $"7C7D 7D7E 7F80 8182 8384 8586 8788 898A" $"8A8B 8C8C 8D8D 8E8E 8E8F 8F8F 8F8F 8F8F" $"8E8E 8D8D 8C8C 8B8A 8988 8786 8584 8382" $"817F 7E7D 7C7B 7978 7776 7574 7372 7171" $"7070 6F6F 6E6E 6E6E 6E6E 6E6F 6F6F 7071" $"7272 7374 7576 7778 797B 7C7D 7E80 8182" $"8485 8687 898A 8B8C 8D8D 8E8F 9090 9191" $"9292 9292 9291 9191 9090 8F8F 8E8D 8C8B" $"8A89 8887 8685 8483 8180 7F7E 7D7C 7B7A" $"7978 7776 7574 7373 7271 7170 7070 706F" $"6F6F 6F6F 7070 7071 7172 7273 7474 7576" $"7778 797A 7B7C 7D7F 8081 8283 8586 8788" $"898A 8B8C 8D8E 8F90 9191 9292 9293 9393" $"9393 9392 9291 9190 8F8F 8E8D 8B8A 8988" $"8785 8482 817F 7E7D 7B7A 7877 7675 7372" $"7170 6F6E 6E6D 6C6C 6B6B 6B6B 6B6B 6B6C" $"6C6D 6D6E 6F70 7172 7374 7577 7879 7B7C" $"7D7F 8082 8385 8688 898A 8C8D 8E8F 9091" $"9292 9394 9494 9495 9595 9494 9493 9292" $"9190 8F8E 8D8C 8B8A 8887 8684 8382 807F" $"7D7C 7B79 7877 7675 7372 7170 6F6F 6E6D" $"6D6C 6C6B 6B6B 6B6B 6B6B 6B6C 6C6D 6D6E" $"6F6F 7071 7274 7576 7779 7A7C 7D7F 8082" $"8385 8688 898A 8C8D 8F90 9192 9394 9595" $"9696 9797 9797 9797 9696 9595 9493 9291" $"8F8E 8D8B 8A88 8685 8381 807E 7C7A 7977" $"7674 7371 706F 6E6D 6C6B 6A69 6868 6867" $"6767 6768 6869 696A 6B6B 6D6E 6F70 7173" $"7476 7779 7B7C 7E80 8183 8486 8889 8B8C" $"8D8F 9091 9293 9495 9696 9797 9797 9897" $"9797 9696 9595 9493 9291 8F8E 8D8B 8A89" $"8785 8482 817F 7D7C 7A79 7776 7573 7271" $"706E 6D6D 6C6B 6A6A 6969 6868 6868 6868" $"6869 696A 6A6B 6C6D 6E6F 7072 7374 7677" $"797B 7C7E 8081 8385 8788 8A8C 8D8F 9092" $"9394 9697 9898 999A 9A9A 9B9B 9B9A 9A9A" $"9998 9796 9594 9391 8F8E 8C8A 8887 8583" $"817F 7D7B 7977 7674 7271 6F6E 6C6B 6A69" $"6867 6666 6565 6564 6465 6565 6666 6768" $"696A 6B6D 6E6F 7173 7476 7879 7B7D 7F80" $"8284 8687 898B 8C8E 9091 9294 9596 9798" $"9999 9A9B 9B9B 9B9B 9B9A 9A99 9898 9796" $"9493 9290 8F8D 8B8A 8886 8483 817F 7D7B" $"7978 7674 7371 706F 6D6C 6B6A 6968 6766" $"6665 6565 6565 6565 6566 6767 6869 6A6B" $"6C6E 6F71 7274 7677 797B 7D7F 8183 8586" $"888A 8C8E 9091 9395 9697 999A 9B9C 9C9D" $"9D9D 9E9D 9D9D 9C9C 9B9A 9998 9695 9392" $"908E 8C8A 8886 8482 807E 7B79 7876 7472" $"706F 6D6C 6A69 6867 6665 6564 6464 6363" $"6364 6465 6566 6768 696A 6B6C 6E6F 7172" $"7476 7779 7B7D 7F80 8284 8688 898B 8D8E" $"9092 9394 9697 9899 999A 9B9B 9B9B 9B9B" $"9B9B 9A9A 9998 9796 9493 9290 8E8D 8B89" $"8785 8381 7F7D 7B7A 7876 7473 716F 6E6C" $"6B6A 6968 6766 6564 6464 6363 6363 6364" $"6465 6666 6769 6A6B 6C6E 7071 7375 7678" $"7A7C 7E80 8284 8688 8A8C 8E90 9293 9597" $"9899 9A9B 9C9D 9D9E 9E9E 9E9D 9D9C 9C9B" $"9A99 9896 9593 9190 8E8C 8A88 8684 817F" $"7D7B 7977 7574 7270 6F6D 6C6B 6968 6767" $"6665 6564 6464 6464 6465 6566 6667 6869" $"6A6B 6D6E 6F71 7374 7677 797B 7D7E 8082" $"8485 8789 8B8D 8E90 9193 9496 9798 999A" $"9B9B 9C9C 9C9C 9C9C 9C9B 9B9A 9998 9796" $"9493 9190 8E8C 8A89 8785 8381 7F7D 7B79" $"7775 7372 706F 6D6C 6B69 6867 6766 6565" $"6464 6464 6464 6565 6666 6768 696A 6C6D" $"6F70 7273 7577 797B 7D7E 8082 8486 888A" $"8C8E 9091 9394 9697 999A 9B9B 9C9D 9D9D" $"9D9D 9D9C 9C9B 9A99 9897 9694 9391 8F8D" $"8B8A 8886 8482 807E 7C7A 7876 7472 716F" $"6E6D 6B6A 6968 6767 6666 6565 6565 6565" $"6666 6767 6869 6A6B 6C6D 6F70 7273 7576" $"7879 7B7D 7F80 8284 8587 898A 8C8E 8F91" $"9293 9596 9798 9999 9A9A 9A9B 9B9B 9A9A" $"9999 9897 9695 9492 9190 8E8C 8B89 8785" $"8381 7F7D 7B79 7876 7473 716F 6E6D 6B6A" $"6968 6867 6666 6565 6565 6566 6666 6768" $"6969 6A6C 6D6E 7071 7274 7677 797B 7C7E" $"8082 8385 8789 8A8C 8E8F 9192 9495 9697" $"9899 9A9A 9B9B 9B9B 9B9A 9A99 9998 9796" $"9493 9290 8E8D 8B89 8785 8482 807E 7C7A" $"7877 7573 7271 6F6E 6D6C 6B6A 6969 6868" $"6767 6767 6767 6768 6869 6A6B 6C6D 6E6F" $"7071 7374 7577 787A 7B7D 7E80 8283 8586" $"888A 8B8D 8E90 9192 9495 9696 9798 9899" $"9999 9999 9998 9897 9695 9493 9291 8F8E" $"8C8B 8987 8584 8280 7E7C 7B79 7776 7473" $"7170 6F6D 6C6B 6A6A 6968 6867 6767 6767" $"6767 6868 696A 6B6C 6D6E 6F70 7273 7576" $"7879 7B7D 7E80 8283 8587 888A 8C8D 8E90" $"9192 9495 9696 9798 9898 9999 9998 9897" $"9796 9594 9392 9190 8E8D 8C8A 8887 8583" $"8280 7E7D 7B7A 7877 7574 7371 706F 6E6D" $"6D6C 6B6B 6A6A 6A6A 6A6A 6A6A 6A6B 6B6C" $"6D6E 6F70 7172 7374 7577 7879 7B7C 7E7F" $"8082 8385 8688 898B 8C8E 8F90 9192 9394" $"9596 9797 9798 9898 9897 9796 9695 9493" $"9291 908F 8D8C 8A88 8785 8381 807E 7C7B" $"7977 7674 7372 706F 6E6D 6C6C 6B6A 6A69" $"6969 6969 6969 6A6A 6B6B 6C6D 6E6F 7071" $"7274 7576 7879 7B7C 7E7F 8183 8486 8789" $"8A8B 8D8E 8F91 9293 9494 9596 9697 9797" $"9797 9696 9695 9494 9392 918F 8E8D 8B8A" $"8887 8584 8280 7F7D 7B7A 7977 7674 7372" $"7170 6F6E 6D6D 6C6C 6B6B 6B6A 6A6A 6B6B" $"6B6B 6C6C 6D6E 6F70 7172 7374 7576 7779" $"7A7B 7D7E 7F81 8284 8586 8889 8A8C 8D8E" $"8F90 9192 9394 9495 9596 9696 9696 9595" $"9494 9392 9190 8F8E 8D8B 8A89 8786 8482" $"817F 7D7C 7A78 7776 7473 7270 6F6E 6D6D" $"6C6B 6B6A 6A6A 6A69 6A6A 6A6A 6B6C 6C6D" $"6E6F 7071 7273 7576 7779 7A7B 7D7E 8081" $"8384 8687 888A 8B8C 8E8F 9091 9293 9394" $"9595 9596 9696 9695 9594 9493 9292 9190" $"8F8D 8C8B 8988 8785 8382 807F 7D7C 7A79" $"7876 7574 7372 7170 6F6F 6E6D 6D6D 6C6C" $"6C6C 6C6C 6C6D 6D6E 6E6F 7070 7172 7374" $"7576 7879 7A7B 7C7E 7F80 8283 8486 8788" $"8A8B 8C8D 8E8F 9091 9292 9393 9494 9595" $"9595 9494 9493 9392 9190 8F8E 8D8C 8B89" $"8886 8583 8281 7F7E 7C7B 7978 7775 7473" $"7271 706F 6E6E 6D6D 6C6C 6C6C 6C6C 6C6C" $"6D6D 6E6E 6F70 7071 7273 7576 7778 797B" $"7C7D 7E80 8182 8485 8688 898A 8B8C 8D8E" $"8F90 9192 9393 9394 9494 9494 9494 9393" $"9291 9190 8F8E 8D8C 8A89 8886 8584 8281" $"7F7E 7D7B 7A78 7776 7574 7372 7170 6F6F" $"6E6E 6D6D 6D6D 6D6D 6D6D 6D6E 6E6F 6F70" $"7171 7273 7475 7677 797A 7B7C 7D7F 8081" $"8384 8586 8889 8A8B 8C8D 8E8F 9091 9192" $"9293 9393 9494 9393 9393 9292 9190 8F8E" $"8D8C 8B8A 8988 8685 8382 817F 7E7C 7B7A" $"7877 7675 7473 7271 706F 6F6E 6E6D 6D6D" $"6D6C 6D6D 6D6D 6E6E 6F6F 7071 7273 7475" $"7677 7879 7A7C 7D7E 7F81 8283 8486 8788" $"898A 8B8C 8D8E 8F8F 9091 9192 9292 9293" $"9392 9292 9291 9190 8F8F 8E8D 8C8B 8A89" $"8786 8583 8281 7F7E 7D7B 7A79 7876 7574" $"7372 7171 706F 6F6E 6E6D 6D6D 6D6D 6D6D" $"6D6E 6E6F 6F70 7171 7273 7475 7677 787A" $"7B7C 7D7E 8081 8283 8586 8788 898A 8C8D" $"8E8F 8F90 9191 9292 9393 9393 9393 9393" $"9292 9190 908F 8E8D 8C8A 8988 8685 8482" $"8180 7E7D 7B7A 7977 7675 7473 7271 7070" $"6F6F 6E6E 6D6D 6D6D 6D6D 6D6E 6E6F 6F70" $"7071 7273 7475 7677 7879 7A7B 7D7E 7F80" $"8182 8485 8687 8889 8A8B 8C8D 8E8F 8F90" $"9191 9192 9292 9292 9292 9291 9190 908F" $"8E8D 8C8B 8A89 8887 8685 8382 817F 7E7D" $"7C7B 7978 7776 7574 7373 7271 7170 706F" $"6F6F 6F6E 6E6F 6F6F 6F70 7071 7172 7373" $"7475 7677 7879 7A7B 7C7D 7F80 8182 8384" $"8687 8889 8A8B 8C8D 8E8F 8F90 9191 9292" $"9292 9292 9292 9291 9190 8F8F 8E8D 8C8B" $"8A89 8886 8584 8281 807E 7D7C 7B79 7877" $"7675 7473 7271 7170 706F 6F6E 6E6E 6E6E" $"6E6E 6F6F 7070 7171 7273 7474 7576 7778" $"797A 7B7C 7E7F 8081 8283 8485 8687 8889" $"8A8B 8C8D 8E8E 8F8F 9090 9191 9191 9191" $"9191 9090 8F8F 8E8D 8C8C 8B8A 8987 8685" $"8483 8180 7F7E 7D7B 7A79 7877 7675 7473" $"7272 7171 7070 6F6F 6F6F 6F6F 6F6F 6F70" $"7071 7172 7273 7474 7576 7778 797A 7B7C" $"7D7E 7F81 8283 8485 8687 8889 8A8B 8C8D" $"8E8E 8F90 9091 9191 9191 9191 9190 9090" $"8F8E 8E8D 8C8B 8A89 8887 8684 8382 8180" $"7E7D 7C7B 7A79 7877 7675 7473 7272 7171" $"7070 706F 6F6F 6F6F 7070 7070 7171 7273" $"7374 7576 7677 7879 7A7B 7C7D 7E7F 8081" $"8284 8586 8788 898A 8A8B 8C8D 8D8E 8F8F" $"9090 9090 9191 9190 9090 908F 8F8E 8D8D" $"8C8B 8A89 8887 8685 8483 8180 7F7E 7D7B" $"7A79 7877 7675 7474 7372 7171 7070 7070" $"6F6F 6F6F 7070 7070 7171 7273 7374 7576" $"7777 7879 7A7B 7D7E 7F80 8182 8384 8586" $"8788 898A 8B8C 8D8E 8E8F 8F90 9090 9191" $"9191 9190 9090 8F8F 8E8D 8D8C 8B8A 8988" $"8786 8583 8281 807F 7D7C 7B7A 7978 7776" $"7574 7473 7272 7171 7170 7070 7070 7070" $"7171 7172 7273 7374 7575 7677 7879 7A7B" $"7C7D 7E7F 8081 8283 8485 8686 8788 898A" $"8B8C 8C8D 8D8E 8E8F 8F8F 8F8F 8F8F 8F8F" $"8F8E 8E8E 8D8C 8C8B 8A89 8887 8685 8483" $"8281 807F 7E7D 7B7A 7978 7777 7675 7473" $"7372 7271 7171 7070 7070 7070 7171 7172" $"7273 7374 7575 7677 7879 7A7B 7B7D 7E7F" $"8081 8283 8485 8687 8889 898A 8B8C 8D8D" $"8E8E 8F8F 8F8F 9090 908F 8F8F 8F8E 8E8D" $"8C8C 8B8A 8988 8786 8584 8382 8180 7E7D" $"7C7B 7A79 7877 7675 7574 7373 7272 7171" $"7171 7170 7071 7171 7172 7272 7374 7475" $"7676 7778 797A 7B7C 7D7E 7F80 8182 8384" $"8485 8687 8889 8A8B 8B8C 8C8D 8D8E 8E8E" $"8F8F 8F8F 8F8F 8E8E 8E8D 8D8C 8C8B 8A89" $"8887 8685 8483 8281 807F 7E7D 7C7B 7A79" $"7877 7675 7474 7372 7272 7171 7171 7070" $"7171 7171 7172 7273 7474 7576 7677 7879" $"7A7B 7C7D 7E7F 8081 8283 8485 8687 8788" $"898A 8B8B 8C8D 8D8E 8E8E 8F8F 8F8F 8F8F" $"8F8E 8E8E 8D8D 8C8C 8B8A 8988 8887 8685" $"8482 8180 7F7E 7D7C 7B7A 7978 7776 7675" $"7474 7373 7272 7271 7171 7171 7172 7272" $"7373 7474 7575 7677 7778 797A 7B7C 7D7E" $"7E7F 8081 8283 8485 8687 8889 8A8A 8B8C" $"8C8D 8E8E 8E8F 8F8F 8F8F 8F8F 8F8F 8E8E" $"8D8D 8C8B 8B8A 8988 8786 8584 8382 8180" $"7E7D 7C7B 7A79 7877 7776 7574 7473 7272" $"7271 7171 7171 7171 7172 7272 7373 7475" $"7576 7778 7879 7A7B 7C7D 7E7F 8081 8283" $"8484 8586 8788 898A 8A8B 8C8C 8D8D 8E8E" $"8E8E 8F8F 8F8E 8E8E 8E8D 8D8C 8C8B 8A8A" $"8988 8786 8584 8382 8180 7F7E 7D7C 7B7A" $"7978 7776 7675 7474 7373 7272 7272 7271" $"7171 7272 7272 7373 7474 7575 7677 7778" $"797A 7B7C 7C7D 7E7F 8081 8283 8485 8687" $"8788 898A 8A8B 8C8C 8D8D 8D8E 8E8E 8E8E" $"8E8E 8D8D 8D8C 8C8B 8B8A 8988 8887 8685" $"8483 8281 807F 7E7D 7C7B 7A79 7877 7776" $"7575 7473 7373 7272 7272 7272 7272 7273" $"7373 7474 7575 7677 7778 797A 7B7C 7C7D" $"7E7F 8081 8283 8484 8586 8788 8889 8A8A" $"8B8B 8C8C 8C8D 8D8D 8D8D 8D8D 8D8C 8C8C" $"8B8B 8A8A 8988 8787 8685 8483 8281 807F" $"7E7E 7D7C 7B7A 7978 7877 7676 7575 7474" $"7473 7373 7373 7373 7374 7474 7575 7676" $"7777 7879 797A 7B7C 7C7D 7E7F 8081 8182" $"8384 8585 8687 8888 898A 8A8B 8B8C 8C8C" $"8C8C 8D8D 8D8D 8C8C 8C8C 8B8B 8A8A 8988" $"8887 8685 8483 8382 8180 7F7E 7D7C 7B7A" $"7A79 7877 7776 7675 7574 7474 7474 7374" $"7474 7474 7475 7576 7677 7778 7979 7A7B" $"7B7C 7D7E 7F7F 8081 8282 8384 8585 8687" $"8788 8989 8A8A 8A8B 8B8B 8B8B 8C8C 8C8B" $"8B8B 8B8A 8A8A 8989 8887 8786 8585 8483" $"8282 8180 7F7E 7D7D 7C7B 7A7A 7978 7877" $"7776 7675 7575 7575 7474 7575 7575 7575" $"7676 7777 7878 7979 7A7B 7B7C 7D7D 7E7F" $"8080 8182 8383 8485 8686 8787 8888 8989" $"8A8A 8A8B 8B8B 8B8B 8B8B 8B8A 8A8A 8989" $"8988 8887 8686 8584 8483 8281 8180 7F7E" $"7D7D 7C7B 7B7A 7979 7878 7777 7676 7675" $"7575 7575 7575 7575 7676 7677 7778 7879" $"797A 7A7B 7C7C 7D7E 7E7F 8080 8182 8383" $"8485 8586 8687 8788 8888 8989 8989 898A" $"8A8A 8989 8989 8989 8888 8787 8686 8585" $"8484 8382 8281 8080 7F7E 7E7D 7C7C 7B7A" $"7A79 7978 7877 7777 7676 7676 7676 7676" $"7676 7677 7777 7878 7879 797A 7A7B 7C7C" $"7D7D 7E7F 7F80 8181 8283 8384 8485 8586" $"8687 8788 8888 8989 8989 8989 8989 8989" $"8989 8888 8887 8786 8685 8584 8383 8281" $"8180 7F7F 7E7D 7C7C 7B7B 7A7A 7979 7878" $"7777 7777 7676 7676 7676 7777 7777 7878" $"7879 797A 7A7B 7B7C 7C7D 7D7E 7F7F 8081" $"8182 8283 8484 8585 8686 8787 8788 8888" $"8889 8989 8989 8988 8888 8888 8787 8786" $"8685 8584 8483 8382 8281 8080 7F7F 7E7E" $"7D7C 7C7B 7B7B 7A7A 7979 7978 7878 7878" $"7878 7878 7878 7878 7979 797A 7A7B 7B7B" $"7C7C 7D7D 7E7E 7F80 8081 8182 8283 8384" $"8485 8586 8686 8787 8787 8888 8888 8888" $"8888 8887 8787 8786 8686 8585 8484 8383" $"8282 8181 8080 7F7F 7E7D 7D7C 7C7B 7B7B" $"7A7A 7979 7979 7878 7878 7878 7878 7878" $"7979 7979 7A7A 7A7B 7B7C 7C7D 7D7E 7E7F" $"7F80 8081 8282 8383 8484 8585 8586 8686" $"8787 8787 8787 8888 8787 8787 8787 8686" $"8685 8585 8484 8383 8282 8181 8080 7F7F" $"7E7D 7D7C 7C7B 7B7B 7A7A 7A79 7979 7878" $"7878 7878 7878 7878 7879 7979 797A 7A7A" $"7B7B 7C7C 7D7D 7E7E 7F7F 8080 8181 8282" $"8383 8484 8585 8686 8687 8787 8787 8787" $"8787 8787 8787 8786 8686 8585 8584 8483" $"8382 8281 8180 807F 7E7E 7D7D 7C7C 7B7B" $"7B7A 7A79 7979 7978 7878 7878 7878 7878" $"7878 7979 7979 7A7A 7B7B 7B7C 7C7D 7D7E" $"7E7F 7F80 8081 8182 8283 8384 8485 8586" $"8686 8787 8787 8788 8888 8888 8887 8787" $"8787 8686 8685 8584 8483 8382 8281 8180" $"807F 7E7E 7D7D 7C7C 7B7B 7B7A 7A79 7979" $"7978 7878 7878 7878 7878 7878 7879 7979" $"7A7A 7A7B 7B7C 7C7D 7D7E 7E7F 7F80 8081" $"8182 8383 8484 8585 8586 8687 8787 8788" $"8888 8888 8888 8888 8888 8787 8786 8686" $"8585 8484 8383 8282 8181 8080 7F7E 7E7D" $"7D7C 7C7B 7B7B 7A7A 7979 7978 7878 7878" $"7878 7878 7878 7879 7979 7A7A 7A7B 7B7C" $"7C7D 7D7E 7E7F 7F80 8081 8182 8283 8384" $"8484 8585 8686 8687 8787 8787 8787 8887" $"8787 8787 8787 8686 8686 8585 8484 8483" $"8382 8281 8180 807F 7F7E 7E7D 7D7C 7C7B" $"7B7B 7A7A 7A79 7979 7978 7878 7878 7878" $"7879 7979 7979 7A7A 7B7B 7B7C 7C7D 7D7E" $"7E7F 7F80 8081 8182 8283 8384 8485 8585" $"8686 8687 8787 8787 8888 8888 8887 8787" $"8787 8686 8685 8584 8484 8383 8281 8180" $"807F 7F7E 7D7D 7C7C 7B7B 7B7A 7A79 7979" $"7878 7878 7878 7878 7878 7878 7879 7979" $"7A7A 7A7B 7B7C 7C7D 7D7E 7E7F 7F80 8081" $"8182 8283 8384 8485 8585 8686 8686 8787" $"8787 8787 8787 8787 8787 8686 8686 8585" $"8484 8483 8382 8281 8180 807F 7F7E 7E7D" $"7D7C 7C7B 7B7B 7A7A 7A79 7979 7978 7878" $"7878 7878 7878 7979 7979 7A7A 7A7B 7B7C" $"7C7C 7D7D 7E7E 7F7F 8080 8181 8282 8383" $"8484 8585 8586 8686 8687 8787 8787 8787" $"8787 8787 8686 8686 8585 8484 8483 8382" $"8281 8180 807F 7F7E 7E7D 7D7C 7C7C 7B7B" $"7A7A 7A7A 7979 7979 7979 7979 7979 7979" $"7979 7A7A 7A7B 7B7B 7C7C 7D7D 7D7E 7E7F" $"7F80 8081 8182 8283 8384 8485 8585 8686" $"8687 8787 8787 8787 8787 8787 8787 8786" $"8686 8585 8584 8483 8382 8281 8180 807F" $"7F7E 7E7D 7D7C 7C7C 7B7B 7A7A 7A7A 7979" $"7979 7979 7979 7979 7979 7979 7A7A 7A7B" $"7B7B 7C7C 7C7D 7D7E 7E7F 7F80 8081 8182" $"8283 8384 8485 8585 8686 8687 8787 8787" $"8788 8887 8787 8787 8786 8686 8685 8584" $"8483 8382 8281 8180 807F 7F7E 7E7D 7D7C" $"7C7B 7B7B 7A7A 7A79 7979 7979 7978 7878" $"7879 7979 7979 7A7A 7A7A 7B7B 7B7C 7C7D" $"7D7E 7E7F 7F80 8081 8182 8283 8384 8484" $"8585 8686 8686 8787 8787 8787 8787 8787" $"8786 8686 8685 8585 8484 8383 8382 8281" $"8180 7F7F 7E7E 7D7D 7D7C 7C7B 7B7A 7A7A" $"7979 7979 7978 7878 7878 7878 7879 7979" $"7979 7A7A 7A7B 7B7C 7C7C 7D7D 7E7E 7F7F" $"8080 8181 8282 8383 8484 8585 8586 8686" $"8787 8787 8787 8787 8787 8787 8686 8686" $"8585 8584 8483 8382 8281 8180 807F 7F7E" $"7D7D 7D7C 7C7B 7B7A 7A7A 7979 7979 7979" $"7878 7878 7878 7979 7979 797A 7A7A 7B7B" $"7C7C 7C7D 7D7E 7E7F 7F80 8081 8182 8283" $"8383 8484 8585 8586 8686 8687 8787 8787" $"8787 8787 8786 8686 8685 8585 8484 8483" $"8382 8281 8180 807F 7F7E 7E7D 7D7D 7C7C" $"7B7B 7B7A 7A7A 7979 7979 7979 7979 7979" $"7979 797A 7A7A 7A7B 7B7B 7C7C 7C7D 7D7E" $"7E7F 7F80 8081 8182 8283 8384 8484 8585" $"8586 8686 8787 8787 8787 8787 8787 8787" $"8686 8686 8585 8484 8483 8382 8281 8180" $"807F 7F7E 7E7D 7D7D 7C7C 7B7B 7B7A 7A7A" $"7A7A 7979 7979 7979 7979 7979 7A7A 7A7A" $"7B7B 7B7B 7C7C 7D7D 7D7E 7E7F 7F80 8081" $"8182 8283 8383 8484 8585 8586 8686 8686" $"8787 8787 8787 8787 8686 8686 8585 8585" $"8484 8383 8282 8181 8180 807F 7F7E 7E7D" $"7D7D 7C7C 7B7B 7B7B 7A7A 7A7A 7A79 7979" $"7979 7979 797A 7A7A 7A7A 7B7B 7B7C 7C7C" $"7D7D 7D7E 7E7F 7F80 8081 8181 8282 8383" $"8484 8485 8585 8686 8686 8686 8787 8786" $"8686 8686 8686 8585 8584 8484 8383 8282" $"8181 8080 7F7F 7E7E 7D7D 7D7C 7C7B 7B7B" $"7A7A 7A7A 7979 7979 7979 7979 7979 7979" $"797A 7A7A 7A7B 7B7B 7C7C 7C7D 7D7E 7E7F" $"7F7F 8080 8181 8282 8383 8384 8484 8585" $"8586 8686 8686 8686 8686 8686 8686 8686" $"8585 8584 8484 8383 8382 8281 8180 807F" $"7F7E 7E7D 7D7D 7C7C 7B7B 7B7A 7A7A 7A79" $"7979 7979 7979 7979 7979 7979 797A 7A7A" $"7B7B 7B7C 7C7C 7D7D 7E7E 7F7F 8080 8181" $"8282 8283 8384 8484 8585 8586 8686 8686" $"8686 8787 8786 8686 8686 8686 8585 8584" $"8484 8383 8282 8181 8080 807F 7F7E 7E7D" $"7D7C 7C7C 7B7B 7B7A 7A7A 7A7A 7A79 7979" $"7979 7979 7A7A 7A7A 7A7B 7B7B 7B7C 7C7D" $"7D7D 7E7E 7F7F 8080 8081 8182 8283 8383" $"8484 8585 8585 8686 8686 8686 8686 8686" $"8686 8686 8685 8585 8584 8484 8383 8282" $"8181 8180 807F 7F7E 7E7E 7D7D 7C7C 7C7B" $"7B7B 7B7A 7A7A 7A7A 7A7A 7A7A 7A7A 7A7A" $"7A7A 7B7B 7B7B 7C7C 7C7D 7D7D 7E7E 7F7F" $"8080 8081 8182 8283 8383 8484 8485 8585" $"8586 8686 8686 8686 8686 8686 8686 8585" $"8585 8484 8483 8383 8282 8181 8180 807F" $"7F7E 7E7E 7D7D 7D7C 7C7C 7B7B 7B7A 7A7A" $"7A7A 7A7A 7A7A 7A7A 7A7A 7A7A 7A7B 7B7B" $"7B7C 7C7C 7D7D 7D7E 7E7F 7F80 8080 8181" $"8282 8283 8384 8484 8485 8585 8585 8686" $"8686 8686 8685 8585 8585 8584 8484 8383" $"8382 8281 8181 8080 7F7F 7F7E 7E7D 7D7D" $"7C7C 7C7B 7B7B 7B7A 7A7A 7A7A 7A7A 7A7A" $"7A7A 7A7A 7A7A 7A7B 7B7B 7C7C 7C7D 7D7D" $"7E7E 7E7F 7F80 8081 8181 8282 8283 8384" $"8484 8485 8585 8585 8585 8686 8685 8585" $"8585 8585 8484 8484 8383 8382 8281 8181" $"8080 7F7F 7F7E 7E7E 7D7D 7D7C 7C7C 7B7B" $"7B7B 7B7A 7A7A 7A7A 7A7A 7A7A 7A7A 7A7B" $"7B7B 7B7B 7C7C 7C7D 7D7D 7E7E 7E7F 7F80" $"8080 8181 8182 8283 8383 8484 8484 8585" $"8585 8585 8585 8585 8585 8585 8585 8484" $"8484 8383 8382 8282 8181 8080 807F 7F7F" $"7E7E 7E7D 7D7D 7C7C 7C7C 7B7B 7B7B 7B7B" $"7A7A 7A7A 7A7A 7B7B 7B7B 7B7B 7C7C 7C7C" $"7D7D 7D7E 7E7E 7F7F 7F80 8081 8181 8282" $"8383 8384 8484 8485 8585 8585 8585 8586" $"8686 8585 8585 8585 8584 8484 8483 8383" $"8282 8281 8180 8080 7F7F 7E7E 7E7D 7D7D" $"7C7C 7C7C 7B7B 7B7B 7B7A 7A7A 7A7A 7A7A" $"7A7B 7B7B 7B7B 7B7C 7C7C 7C7D 7D7D 7E7E" $"7E7F 7F7F 8080 8181 8182 8282 8383 8384" $"8484 8485 8585 8585 8585 8585 8585 8585" $"8585 8584 8484 8483 8383 8282 8281 8181" $"8080 7F7F 7F7E 7E7D 7D7D 7D7C 7C7C 7B7B" $"7B7B 7B7B 7A7A 7A7A 7A7A 7A7B 7B7B 7B7B" $"7B7B 7C7C 7C7D 7D7D 7D7E 7E7E 7F7F 8080" $"8081 8181 8282 8283 8383 8384 8484 8484" $"8585 8585 8585 8585 8585 8584 8484 8484" $"8383 8383 8282 8281 8181 8080 7F7F 7F7E" $"7E7E 7D7D 7D7C 7C7C 7C7B 7B7B 7B7B 7A7A" $"7A7A 7A7A 7A7A 7A7A 7A7B 7B7B 7B7B 7C7C" $"7C7D 7D7D 7E7E 7E7F 7F7F 8080 8181 8182" $"8283 8383 8384 8484 8485 8585 8585 8585" $"8585 8585 8585 8584 8484 8483 8383 8282" $"8281 8181 8080 7F7F 7F7E 7E7E 7D7D 7D7C" $"7C7C 7B7B 7B7B 7B7B 7A7A 7A7A 7A7A 7A7A" $"7A7B 7B7B 7B7B 7C7C 7C7C 7C7D 7D7D 7E7E" $"7F7F 7F80 8080 8181 8282 8283 8383 8384" $"8484 8485 8585 8585 8585 8585 8585 8585" $"8585 8584 8484 8483 8383 8282 8281 8180" $"8080 7F7F 7F7E 7E7D 7D7D 7D7C 7C7C 7C7B" $"7B7B 7B7B 7B7B 7A7A 7A7A 7B7B 7B7B 7B7B" $"7B7C 7C7C 7C7D 7D7D 7E7E 7E7F 7F7F 8080" $"8181 8182 8282 8383 8384 8484 8485 8585" $"8585 8585 8585 8585 8585 8585 8584 8484" $"8483 8383 8282 8281 8181 8080 807F 7F7F" $"7E7E 7D7D 7D7D 7C7C 7C7C 7B7B 7B7B 7B7B" $"7B7B 7B7B 7B7B 7B7B 7B7B 7C7C 7C7C 7C7D" $"7D7D 7E7E 7E7E 7F7F 7F80 8080 8181 8282" $"8282 8383 8384 8484 8484 8485 8585 8585" $"8585 8585 8585 8584 8484 8483 8383 8382" $"8282 8181 8080 807F 7F7F 7E7E 7E7D 7D7D" $"7C7C 7C7B 7B7B 7B7B 7B7A 7A7A 7A7A 7A7A" $"7A7A 7B7B 7B7B 7B7C 7C7C 7C7D 7D7D 7E7E" $"7E7F 7F80 8080 8181 8182 8282 8383 8384" $"8484 8485 8585 8585 8585 8585 8585 8585" $"8584 8484 8483 8383 8382 8282 8181 8080" $"807F 7F7F 7E7E 7D7D 7D7C 7C7C 7C7B 7B7B" $"7B7A 7A7A 7A7A 7A7A 7A7A 7A7A 7A7B 7B7B" $"7B7B 7C7C 7C7D 7D7D 7E7E 7E7F 7F7F 8080" $"8081 8181 8282 8283 8383 8384 8484 8485" $"8585 8585 8585 8585 8585 8585 8484 8484" $"8483 8383 8282 8281 8181 8080 7F7F 7F7E" $"7E7E 7D7D 7D7C 7C7C 7C7B 7B7B 7B7B 7B7B" $"7A7A 7A7A 7A7A 7B7B 7B7B 7B7B 7C7C 7C7C" $"7D7D 7D7E 7E7E 7F7F 7F80 8080 8181 8282" $"8283 8383 8384 8484 8484 8585 8585 8585" $"8585 8585 8585 8584 8484 8484 8383 8382" $"8282 8181 8180 8080 7F7F 7E7E 7E7D 7D7D" $"7D7C 7C7C 7C7B 7B7B 7B7B 7B7B 7B7B 7B7B" $"7B7B 7B7B 7B7C 7C7C 7C7D 7D7D 7D7E 7E7E" $"7F7F 7F80 8080 8181 8182 8282 8383 8384" $"8484 8484 8585 8585 8585 8585 8585 8585" $"8584 8484 8484 8383 8382 8282 8181 8180" $"8080 7F7F 7F7E 7E7E 7D7D 7D7C 7C7C 7C7C" $"7B7B 7B7B 7B7B 7B7B 7B7B 7B7B 7B7B 7B7C" $"7C7C 7C7C 7D7D 7D7E 7E7E 7E7F 7F80 8080" $"8181 8182 8282 8283 8383 8484 8484 8485" $"8585 8585 8585 8585 8584 8484 8484 8483" $"8383 8382 8282 8181 8180 8080 7F7F 7F7E" $"7E7E 7D7D 7D7D 7C7C 7C7C 7B7B 7B7B 7B7B" $"7B7B 7B7B 7B7B 7B7B 7B7B 7C7C 7C7C 7C7D" $"7D7D 7D7E 7E7E 7F7F 7F80 8080 8181 8182" $"8282 8283 8383 8384 8484 8484 8484 8485" $"8584 8484 8484 8484 8484 8383 8383 8282" $"8281 8181 8080 7F7F 7F7E 7E7E 7D7D 7D7C" $"7C7C 7C7B 7B7B 7B7B 7B7B 7A7A 7A7A 7B7B" $"7B7B 7B7B 7B7B 7C7C 7C7C 7D7D 7D7E 7E7E" $"7F7F 7F80 8080 8181 8182 8282 8283 8383" $"8384 8484 8484 8585 8585 8585 8585 8584" $"8484 8484 8483 8383 8382 8282 8181 8180" $"8080 7F7F 7E7E 7E7D 7D7D 7D7C 7C7C 7C7B" $"7B7B 7B7B 7B7B 7B7B 7B7B 7B7B 7B7B 7B7B" $"7C7C 7C7C 7D7D 7D7D 7E7E 7E7F 7F7F 8080" $"8081 8181 8282 8283 8383 8384 8484 8484" $"8585 8585 8585 8585 8585 8584 8484 8484" $"8483 8383 8382 8282 8181 8180 807F 7F7F" $"7E7E 7E7D 7D7D 7D7C 7C7C 7C7C 7B7B 7B7B" $"7B7B 7B7B 7B7B 7B7B 7B7C 7C7C 7C7C 7D7D" $"7D7D 7E7E 7E7F 7F7F 8080 8081 8181 8282" $"8283 8383 8384 8484 8484 8485 8585 8585" $"8585 8585 8584 8484 8484 8383 8383 8282" $"8281 8181 8080 807F 7F7F 7E7E 7E7D 7D7D" $"7D7C 7C7C 7C7B 7B7B 7B7B 7B7B 7B7B 7B7B" $"7B7B 7B7C 7C7C 7C7C 7C7D 7D7D 7D7E 7E7E" $"7F7F 7F80 8080 8181 8182 8282 8383 8383" $"8484 8484 8484 8585 8585 8585 8585 8585" $"8484 8484 8484 8383 8382 8282 8181 8180" $"8080 7F7F 7E7E 7E7D 7D7D 7C7C 7C7C 7B7B" $"7B7B 7B7B 7B7A 7A7A 7A7B 7B7B 7B7B 7B7B" $"7B7C 7C7C 7C7C 7D7D 7D7E 7E7E 7F7F 7F7F" $"8080 8081 8181 8282 8283 8383 8384 8484" $"8484 8485 8585 8585 8585 8585 8484 8484" $"8484 8383 8382 8282 8181 8180 8080 7F7F" $"7E7E 7E7D 7D7D 7C7C 7C7C 7B7B 7B7B 7B7B" $"7A7A 7A7A 7A7A 7A7A 7B7B 7B7B 7B7B 7C7C" $"7C7C 7D7D 7D7E 7E7E 7F7F 7F80 8080 8181" $"8182 8282 8383 8383 8484 8484 8485 8585" $"8585 8585 8585 8585 8584 8484 8484 8383" $"8382 8282 8181 8180 807F 7F7F 7E7E 7E7D" $"7D7D 7C7C 7C7C 7B7B 7B7B 7B7B 7B7B 7B7B" $"7B7B 7B7B 7B7B 7B7B 7C7C 7C7C 7D7D 7D7D" $"7E7E 7E7F 7F7F 8080 8081 8181 8282 8283" $"8383 8484 8484 8485 8585 8585 8585 8585" $"8585 8585 8585 8484 8484 8383 8382 8282" $"8181 8180 807F 7F7F 7E7E 7E7D 7D7D 7C7C" $"7C7B 7B7B 7B7B 7B7B 7A7A 7A7A 7A7A 7B7B" $"7B7B 7B7B 7C7C 7C7C 7D7D 7D7E 7E7E 7F7F" $"7F80 8080 8181 8182 8282 8383 8384 8484" $"8485 8585 8585 8585 8585 8585 8585 8585" $"8585 8584 8484 8483 8383 8282 8181 8180" $"807F 7F7F 7E7E 7D7D 7D7C 7C7C 7C7B 7B7B" $"7B7B 7A7A 7A7A 7A7A 7A7A 7A7A 7B7B 7B7B" $"7B7C 7C7C 7D7D 7D7D 7E7E 7E7F 7F7F 8080" $"8181 8182 8282 8383 8383 8484 8484 8485" $"8585 8585 8585 8585 8585 8585 8484 8484" $"8483 8383 8282 8281 8180 8080 7F7F 7E7E" $"7E7D 7D7D 7C7C 7C7B 7B7B 7B7B 7B7A 7A7A" $"7A7A 7A7A 7A7A 7A7B 7B7B 7B7B 7C7C 7C7C" $"7D7D 7D7D 7E7E 7E7F 7F7F 8080 8181 8182" $"8282 8283 8383 8484 8484 8485 8585 8585" $"8585 8585 8585 8584 8484 8484 8383 8382" $"8282 8181 8180 807F 7F7F 7E7E 7E7D 7D7D" $"7C7C 7C7B 7B7B 7B7B 7A7A 7A7A 7A7A 7A7A" $"7A7A 7B7B 7B7B 7B7B 7C7C 7C7C 7D7D 7D7E" $"7E7E 7F7F 7F80 8080 8181 8182 8282 8383" $"8383 8484 8484 8585 8585 8585 8585 8585" $"8585 8585 8484 8484 8483 8383 8282 8281" $"8181 8080 7F7F 7F7E 7E7E 7D7D 7D7C 7C7C" $"7C7B 7B7B 7B7B 7B7B 7B7B 7B7B 7B7B 7B7B" $"7B7B 7B7C 7C7C 7C7D 7D7D 7D7E 7E7E 7F7F" $"8080 8081 8181 8282 8283 8383 8384 8484" $"8485 8585 8585 8585 8585 8585 8585 8585" $"8584 8484 8483 8383 8282 8281 8181 8080" $"7F7F 7F7E 7E7E 7D7D 7D7C 7C7C 7C7B 7B7B" $"7B7B 7B7B 7B7B 7B7B 7B7B 7B7B 7B7B 7C7C" $"7C7C 7C7D 7D7D 7E7E 7E7F 7F7F 8080 8081" $"8181 8282 8283 8383 8384 8484 8484 8585" $"8585 8585 8585 8585 8585 8585 8484 8484" $"8383 8383 8282 8281 8180 8080 7F7F 7F7E" $"7E7E 7D7D 7D7C 7C7C 7C7B 7B7B 7B7B 7B7B" $"7B7B 7B7B 7B7B 7B7B 7B7B 7B7C 7C7C 7C7D" $"7D7D 7D7E 7E7E 7F7F 7F80 8080 8181 8182" $"8282 8283 8383 8384 8484 8484 8585 8585" $"8585 8585 8584 8484 8484 8483 8383 8382" $"8282 8181 8180 807F 7F7F 7E7E 7E7D 7D7D" $"7C7C 7C7C 7B7B 7B7B 7B7B 7B7B 7A7A 7A7A" $"7B7B 7B7B 7B7B 7B7C 7C7C 7C7D 7D7D 7D7E" $"7E7E 7F7F 7F80 8080 8181 8182 8282 8283" $"8383 8384 8484 8484 8485 8585 8585 8585" $"8484 8484 8484 8383 8383 8282 8281 8181" $"8080 807F 7F7F 7E7E 7E7D 7D7D 7C7C 7C7C" $"7B7B 7B7B 7B7B 7B7B 7B7B 7B7B 7B7B 7B7B" $"7B7B 7C7C 7C7C 7C7D 7D7D 7E7E 7E7F 7F7F" $"7F80 8080 8181 8182 8282 8383 8383 8484" $"8484 8484 8585 8585 8585 8585 8584 8484" $"8484 8483 8383 8382 8282 8181 8180 8080" $"7F7F 7F7E 7E7E 7D7D 7D7D 7C7C 7C7C 7C7B" $"7B7B 7B7B 7B7B 7B7B 7B7B 7B7B 7C7C 7C7C" $"7C7D 7D7D 7D7E 7E7E 7E7F 7F7F 8080 8081" $"8181 8182 8282 8383 8383 8384 8484 8484" $"8485 8585 8585 8585 8484 8484 8484 8483" $"8383 8382 8282 8181 8180 8080 7F7F 7F7E" $"7E7E 7E7D 7D7D 7D7C 7C7C 7C7C 7C7C 7B7B" $"7B7B 7B7B 7B7C 7C7C 7C7C 7C7C 7C7D 7D7D" $"7D7E 7E7E 7E7F 7F7F 8080 8080 8181 8182" $"8282 8283 8383 8383 8484 8484 8484 8484" $"8484 8484 8484 8484 8484 8483 8383 8382" $"8282 8181 8180 8080 7F7F 7F7E 7E7E 7D7D" $"7D7D 7C7C 7C7C 7C7C 7B7B 7B7B 7B7B 7B7B" $"7B7B 7B7B 7C7C 7C7C 7C7C 7D7D 7D7D 7E7E" $"7E7E 7F7F 7F80 8080 8081 8181 8182 8282" $"8283 8383 8383 8484 8484 8484 8484 8484" $"8484 8484 8483 8383 8383 8282 8281 8181" $"8180 8080 7F7F 7F7E 7E7E 7E7D 7D7D 7D7C" $"7C7C 7C7C 7C7B 7B7B 7B7B 7B7B 7B7B 7B7B" $"7C7C 7C7C 7C7C 7D7D 7D7D 7D7E 7E7E 7E7F" $"7F7F 8080 8080 8181 8181 8282 8282 8383" $"8383 8384 8484 8484 8484 8484 8484 8484" $"8483 8383 8383 8282 8282 8181 8181 8080" $"807F 7F7F 7E7E 7E7E 7D7D 7D7D 7C7C 7C7C" $"7C7C 7C7C 7C7C 7C7C 7C7C 7C7C 7C7C 7C7C" $"7C7D 7D7D 7D7D 7E7E 7E7E 7F7F 7F7F 8080" $"8081 8181 8182 8282 8282 8383 8383 8383" $"8384 8484 8484 8484 8484 8383 8383 8383" $"8382 8282 8282 8181 8181 8080 807F 7F7F" $"7F7E 7E7E 7E7E 7D7D 7D7D 7D7D 7D7D 7C7C" $"7C7C 7C7C 7C7C 7C7C 7D7D 7D7D 7D7D 7D7D" $"7E7E 7E7E 7E7F 7F7F 7F80 8080 8081 8181" $"8182 8282 8282 8383 8383 8383 8384 8484" $"8484 8484 8484 8483 8383 8383 8383 8282" $"8282 8181 8180 8080 807F 7F7F 7F7E 7E7E" $"7E7D 7D7D 7D7D 7D7C 7C7C 7C7C 7C7C 7C7C" $"7C7C 7C7C 7C7D 7D7D 7D7D 7D7E 7E7E 7E7E" $"7F7F 7F7F 8080 8080 8181 8181 8182 8282" $"8282 8383 8383 8383 8383 8383 8383 8383" $"8383 8383 8383 8282 8282 8281 8181 8181" $"8080 8080 7F7F 7F7F 7E7E 7E7E 7E7D 7D7D" $"7D7D 7D7D 7D7D 7D7D 7D7C 7C7D 7D7D 7D7D" $"7D7D 7D7D 7D7D 7D7E 7E7E 7E7E 7E7F 7F7F" $"7F80 8080 8080 8181 8181 8182 8282 8282" $"8282 8383 8383 8383 8383 8383 8383 8383" $"8282 8282 8282 8181 8181 8180 8080 807F" $"7F7F 7F7E 7E7E 7E7E 7D7D 7D7D 7D7D 7D7D" $"7C7C 7C7C 7C7C 7C7C 7C7C 7D7D 7D7D 7D7D" $"7D7D 7E7E 7E7E 7E7E 7F7F 7F7F 7F80 8080" $"8080 8181 8181 8182 8282 8282 8282 8383" $"8383 8383 8383 8383 8383 8383 8282 8282" $"8282 8281 8181 8181 8080 8080 7F7F 7F7F" $"7F7E 7E7E 7E7E 7E7D 7D7D 7D7D 7D7D 7D7D" $"7D7D 7D7D 7D7D 7D7D 7D7D 7D7D 7D7D 7E7E" $"7E7E 7E7E 7F7F 7F7F 7F80 8080 8080 8181" $"8181 8182 8282 8282 8282 8383 8383 8383" $"8383 8383 8383 8383 8383 8282 8282 8282" $"8181 8181 8180 8080 8080 7F7F 7F7F 7F7E" $"7E7E 7E7E 7E7E 7D7D 7D7D 7D7D 7D7D 7D7D" $"7D7D 7D7D 7D7D 7D7E 7E7E 7E7E 7E7E 7F7F" $"7F7F 7F7F 8080 8080 8080 8181 8181 8181" $"8282 8282 8282 8282 8383 8383 8383 8383" $"8383 8383 8382 8282 8282 8282 8281 8181" $"8181 8080 8080 807F 7F7F 7F7F 7E7E 7E7E" $"7E7E 7E7D 7D7D 7D7D 7D7D 7D7D 7D7D 7D7D" $"7D7D 7D7D 7D7D 7E7E 7E7E 7E7E 7E7F 7F7F" $"7F7F 7F80 8080 8081 8181 8181 8182 8282" $"8282 8282 8283 8383 8383 8383 8383 8382" $"8282 8282 8282 8281 8181 8181 8080 8080" $"807F 7F7F 7F7F 7E7E 7E7E 7E7E 7D7D 7D7D" $"7D7D 7D7D 7D7D 7D7D 7D7D 7D7D 7D7D 7D7D" $"7D7E 7E7E 7E7E 7E7E 7E7F 7F7F 7F7F 7F80" $"8080 8080 8181 8181 8181 8182 8282 8282" $"8282 8282 8282 8282 8282 8282 8282 8282" $"8282 8181 8181 8181 8080 8080 807F 7F7F" $"7F7F 7F7E 7E7E 7E7E 7E7E 7D7D 7D7D 7D7D" $"7D7D 7D7D 7D7D 7D7D 7D7D 7D7D 7D7D 7D7E" $"7E7E 7E7E 7E7E 7F7F 7F7F 7F7F 8080 8080" $"8081 8181 8181 8182 8282 8282 8282 8282" $"8282 8282 8282 8282 8282 8282 8282 8281" $"8181 8181 8180 8080 8080 807F 7F7F 7F7F" $"7F7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7D 7D7D" $"7D7D 7D7D 7D7D 7D7E 7E7E 7E7E 7E7E 7E7E" $"7E7F 7F7F 7F7F 7F7F 8080 8080 8080 8181" $"8181 8181 8282 8282 8282 8282 8282 8282" $"8282 8282 8282 8282 8282 8282 8281 8181" $"8181 8180 8080 8080 8080 7F7F 7F7F 7F7F" $"7F7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E" $"7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7F7F 7F7F" $"7F7F 7F7F 8080 8080 8080 8081 8181 8181" $"8181 8182 8282 8282 8282 8282 8282 8282" $"8282 8282 8282 8281 8181 8181 8181 8180" $"8080 8080 8080 7F7F 7F7F 7F7F 7F7F 7E7E" $"7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E" $"7E7E 7E7E 7E7E 7E7E 7E7F 7F7F 7F7F 7F7F" $"7F7F 8080 8080 8080 8081 8181 8181 8181" $"8182 8282 8282 8282 8282 8282 8282 8282" $"8181 8181 8181 8181 8180 8080 8080 8080" $"807F 7F7F 7F7F 7F7F 7F7E 7E7E 7E7E 7E7E" $"7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E" $"7E7E 7E7E 7E7E 7E7F 7F7F 7F7F 7F7F 8080" $"8080 8080 8080 8181 8181 8181 8181 8181" $"8181 8181 8181 8181 8181 8181 8181 8181" $"8181 8181 8180 8080 8080 8080 8080 7F7F" $"7F7F 7F7F 7F7F 7F7F 7E7E 7E7E 7E7E 7E7E" $"7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E" $"7E7F 7F7F 7F7F 7F7F 7F7F 8080 8080 8080" $"8080 8181 8181 8181 8181 8181 8181 8181" $"8181 8181 8181 8181 8181 8181 8181 8181" $"8181 8080 8080 8080 8080 8080 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7E7E 7E7E 7E7E 7E7E" $"7E7E 7E7E 7E7E 7E7E 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 8080 8080 8080 8080 8080 8181" $"8181 8181 8181 8181 8181 8181 8181 8181" $"8181 8181 8181 8181 8181 8181 8181 8181" $"8080 8080 8080 8080 8080 807F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7E7E 7E7E 7E7E" $"7E7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"8080 8080 8080 8080 8080 8181 8181 8181" $"8181 8181 8181 8181 8181 8181 8181 8181" $"8181 8181 8181 8181 8080 8080 8080 8080" $"8080 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F80 8080" $"8080 8080 8080 8080 8181 8181 8181 8181" $"8181 8181 8181 8181 8181 8181 8181 8181" $"8181 8080 8080 8080 8080 8080 8080 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7E7E 7E7E 7E7E" $"7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F80 8080 8080" $"8080 8080 8080 8181 8181 8181 8181 8181" $"8181 8181 8181 8181 8181 8181 8181 8181" $"8080 8080 8080 8080 8080 8080 807F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7E 7E7E" $"7E7E 7E7E 7E7E 7E7E 7E7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 8080 8080 8080 8080" $"8080 8080 8181 8181 8181 8181 8181 8181" $"8181 8181 8181 8181 8181 8181 8181 8181" $"8080 8080 8080 8080 8080 8080 807F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 8080 8080 8080 8080 8080 8080 8181" $"8181 8181 8181 8181 8181 8181 8181 8181" $"8181 8181 8181 8181 8181 8181 8181 8080" $"8080 8080 8080 8080 8080 8080 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F80 8080 8080 8080 8080 8080 8080 8080" $"8081 8181 8181 8181 8181 8181 8181 8181" $"8181 8181 8181 8180 8080 8080 8080 8080" $"8080 8080 8080 8080 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F80" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 807F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8081 8181" $"8181 8181 8181 8180 8180 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 807F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"807F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 807F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F80 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" } }; resource 'snd ' (21029, "Horn Of Plenty", purgeable) { FormatOne { { /* array Synthesizers: 1 elements */ /* [1] */ sampledSynth, 160 } }, { /* array SoundCmnds: 1 elements */ /* [1] */ hasData, bufferCmd { 20 } }, { /* array DataTables: 1 elements */ /* [1] */ 17686, Rate22K, 17684, 17685, 0x0, 0x3C, $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"7F7F 7F7F 7F7F 7F7F 7F7E 7A79 7A7A 7B7A" $"7676 7872 6E6F 6B68 7275 7585 8D75 5F59" $"4F50 6675 7B8A 9180 7674 6661 6256 5A76" $"817B 8281 6A63 6D69 6F89 8C78 6F6D 6567" $"706E 778C 8B84 8980 6D68 5F4C 5B81 8C8E" $"9D96 807A 6E5B 606F 7075 8485 848A 7B69" $"747F 7880 9086 7C7E 6E5D 6D80 8089 948F" $"8E8A 7261 6867 657D 9290 98A3 8D76 776B" $"5D6B 7D7E 8991 827B 817B 747D 7E7C 9195" $"7B74 7967 5F7B 8B8B 9B98 7C78 8071 6264" $"6B7D 9599 949E 9574 6665 6071 8B86 7784" $"8C7B 777F 7B80 8A87 868F 8A7B 746A 6075" $"8D89 8F9E 8D72 6F6B 6373 8681 879A 9A97" $"947D 686D 6E67 7A8D 8685 8A77 6E83 897D" $"8796 8C86 8676 7079 726B 7F8F 929C 9679" $"6E74 6762 7B8D 91A0 A18B 858A 7866 676A" $"7786 8480 8E91 7B74 7F82 8B9C 927B 7B7B" $"6662 737D 8691 8A8B 9A90 7469 635C 708E" $"949F B3A0 7A73 756B 727A 6B6B 848A 858C" $"887F 8888 7E8E A293 7F7A 6659 7488 818F" $"A497 8480 7B77 776A 6581 9BA0 ADAF 927E" $"7962 587A 8E7D 7B84 7C7E 8E8B 8691 8D82" $"8A8E 8588 7E60 6177 7985 ABAD 8978 7162" $"677A 7D7E 8B91 9BAB 9F7F 746D 5C60 6F74" $"8297 9275 7389 959A 9684 7678 7C7F 867B" $"676F 7B83 A0AE 8969 7477 6572 8B8A 8B92" $"8F91 9B98 8877 615B 707A 7892 A284 7180" $"8688 9F9F 796D 7E7E 797B 797B 7C74 7C9B" $"A48F 826E 4953 818C 8EAB AB80 7487 8177" $"7A6B 5964 7988 9597 8678 695F 86BA AE86" $"7262 596E 847D 8092 8A80 8E94 8B7D 634D" $"5677 92AA B89D 807B 7067 7E8D 7665 7178" $"8199 9982 7976 7B93 A097 907C 5247 6A82" $"8998 9273 7186 7E70 766E 5A62 7C98 B0AE" $"9379 6860 738E 8373 7E7A 6373 9C9D 8582" $"827E 8D96 8B7C 6654 596B 7B97 AE98 7571" $"6A5F 707E 6C66 8191 8F9E A692 7E6A 5661" $"7E8D 918B 6E63 8697 8A98 A486 7385 8D81" $"7E6F 4B48 75A1 B3A5 8A7C 7056 5477 887E" $"8993 7F80 9893 7B71 685D 6A82 8B8C 7F68" $"6879 7F8E A69D 7F7B 7A65 6679 6E5B 6B87" $"95A1 A38B 7460 5263 808D 9CA9 967E 8991" $"7B76 8070 677A 827A 7977 6A67 6F7B 97A8" $"927D 7760 4F65 7B71 7691 918D 9E99 7D6C" $"635B 6482 9BA2 9784 8388 776D 848C 7674" $"857D 7581 7B70 7E8E 9095 988F 8066 4B53" $"6A6C 789A 9F8C 8D91 7C6D 726B 647B 96A5" $"AA9D 8B86 7E77 8695 8D8D 9482 7484 8B7D" $"849C 9A91 958A 7465 574E 5562 748F 937B" $"7678 5D4D 636C 667C 9B99 959D 917E 766E" $"6F7B 7B7A 8177 5F67 7C79 88AD AC95 9591" $"756A 6C5E 5E7A 8C98 A5A4 9885 6453 6780" $"89A4 BFAA 8C8F 866D 6C74 6867 8398 9277" $"5953 5B5F 759E B6AE A48E 5633 4143 416A" $"959D A2B3 B2A0 8A6C 5A61 708D ABAA 9895" $"8869 7499 988A 8D84 7272 725C 4D55 6681" $"9DAE BDAF 713F 4049 4E75 A0A1 9BA3 9278" $"7B82 6E5F 749A B8BA A18D 7857 5677 8C9C" $"B0A0 7061 7064 576B 7B79 8497 9B8E 7558" $"4744 5081 B1A6 8D8A 7553 576C 6566 818D" $"8C99 A59E 8D7E 809A B0B6 BDAE 7C5C 5D55" $"5882 9A7F 7286 8975 665C 5860 6D85 A4B1" $"ABA0 7D4B 496A 6E62 7688 7F86 9FA4 A4AE" $"A798 9EAB AD9B 7659 5B5C 5A7A 9D95 898A" $"7662 768E 7F72 8087 8084 897F 6A57 5867" $"6C70 8489 6E69 7B70 6A8F A898 909F 9C90" $"9490 8070 656F 817C 6F6E 634F 5E82 8D95" $"ACA6 8788 998D 7368 6560 5E62 7386 8887" $"887C 7B9B B1A1 9BA7 967A 808C 7B6A 665A" $"4E55 6875 6E61 6E89 8D92 B2BD 9986 9188" $"7C87 8363 535B 6169 7F92 9890 8189 A4B0" $"AFAE 997C 8393 7E6B 7165 4846 5D68 676A" $"6C70 757B 90A3 9E98 9479 5D64 7464 5563" $"6868 84A5 B0B1 B8B8 AFAB ADB3 B19A 8B8B" $"7F72 7B79 5E56 6259 516B 827D 757D 8A99" $"A7A9 A08C 6F5E 5948 4256 5C4B 4C65 7175" $"8786 706D 7F8D 9398 9C96 8573 7381 837E" $"7E74 6A79 918F 8CA7 B5AC B3C2 BA9E 7E64" $"5149 4F61 7479 7D8B 877B 8DA0 927E 8489" $"8291 A195 7D6C 6461 626A 736E 574F 6572" $"738B A4AA B8C0 A88E 9698 7355 5869 7681" $"8B91 8C84 8794 9290 A09E 7D6E 776C 5353" $"5D52 4E58 5A5B 636A 6459 617E 9BA2 A3AF" $"A681 6C6E 6B6D 818A 808F B7C3 B6AD A9A9" $"A8AE C5D9 D4BF AC8C 686D 7B63 5163 6B59" $"586B 6855 525B 718A 9DA7 915E 3830 2D29" $"3E58 595C 707C 7D85 8C7B 6372 99B3 BAB6" $"AA8D 706C 7D8D 9AA6 9E7E 7792 9E93 909C" $"A1A5 BED4 C8A5 7D58 3B37 5573 7569 6C76" $"6E6F 868D 7E7C 8994 A1B1 A77A 5348 4C50" $"576F 8375 5D5F 7587 9BB3 B1A7 B9C9 BDA8" $"9D86 6151 6585 9BA2 A295 735B 6A80 858F" $"A49E 8B91 9379 5E4C 392E 3E59 6462 5D59" $"534D 5B80 9899 9C9E 8F81 8C8D 7265 6E70" $"7188 ACB9 B3AC AEB6 BFCE D6C2 A6A0 A39B" $"9EB3 B08D 7A78 685C 666C 5848 5770 8896" $"9280 5C43 546C 6A5D 5741 2935 5364 748C" $"958B 8AA0 B5AF 967F 7D86 97B3 BAA2 856E" $"4D37 5383 949C AEB7 BBC3 C5B4 9379 7070" $"7070 7973 584E 5C69 7BA4 B89C 8287 8D8C" $"8E82 6C66 6F7A 8385 7660 4731 3958 6F7E" $"8F94 94AC CFD1 BEB4 A485 6B6A 7579 7573" $"7476 84A6 BEAC 9393 958A 8488 7E6E 6E6E" $"6971 8182 643B 282F 4154 6B82 8E94 998F" $"7F79 7561 4C54 6F88 9CA1 968B 858C 959D" $"ACBB BCAE A2A5 A49F A4A7 A2A2 ABA9 8D6E" $"553F 3746 668B ACC3 C7B2 927D 7565 4A3C" $"3A40 5872 7869 6064 6463 6E85 999F 9686" $"7E8B A4AA 8F7D 898E 7864 5B56 5761 6F89" $"B9E2 E8D0 AD9A 9177 5750 5E67 6A75 7F86" $"9591 6E55 6480 9096 958B 8482 8181 7C7B" $"847B 5C46 5261 5C5D 7085 A1C3 D6D1 BFA6" $"7F54 424D 667A 8DA6 B2AF B5BB AA8F 8788" $"8289 9DA0 9694 978C 7D7E 8D8E 6D3E 282C" $"3139 4555 78A7 C0B7 AEAA 8B5B 372E 3D61" $"8799 9995 9493 887E 8EAD B4AD B5C3 C4BA" $"AA8E 8194 A7A1 8D7E 6B45 2930 5372 8598" $"A499 8D8A 7650 3B3A 363F 6786 8273 6A66" $"6571 8BA2 ABAF B7B7 A196 A09A 847D 8587" $"8584 7253 464C 5E7B ABE0 F1D3 AD98 8970" $"6061 5F60 7380 7D7E 8676 5147 6387 A2AC" $"A793 7563 6976 7E89 8F7F 6F7C 8164 443D" $"4455 7EB0 D2E0 D7B6 8969 6676 8183 8996" $"9997 9E9B 836F 6F7D 94B7 D0C0 997A 6E6F" $"7A8A 9182 6D61 5541 3439 3832 4B78 97A4" $"A796 6A40 3443 6081 9AA3 9A92 9796 8472" $"7480 8EAD D2DF D4C0 A993 8D9D ACA4 8D7A" $"6B59 484C 5F70 849C ACB1 B3A4 7848 302D" $"3953 7283 7F73 6960 5657 6573 7B8E A8B6" $"B9B9 AF97 8E9B A4A1 9F9C 8663 525D 7189" $"A6C4 CDBF B4A9 8D6D 5D54 4D5D 8194 9089" $"7E65 4946 5C71 7B81 8581 7D84 8775 686D" $"6E61 5A5B 5345 4247 557E B8DD DCC9 B8A1" $"8163 5C65 646A 859F AFBF BF9F 7870 7C82" $"8895 A1A0 9791 9196 9B97 8366 5858 4B33" $"2A2E 3347 76A3 B9BD B08D 6248 474D 5466" $"7F8E 929A A193 7C76 7778 89AA BDBA B5B0" $"A094 98A2 9D8B 7D70 5D4D 4D58 6176 9FBE" $"C3C4 BD9B 694B 4037 3D59 737B 797A 7560" $"4C50 6271 7E95 A6AA B0B1 9A84 8A9A 988F" $"8D81 654E 4C59 6983 A8C4 CCCB C9B1 876F" $"6753 495F 7C82 8183 7154 4D5D 645D 6379" $"8279 7989 8978 757D 7B79 8380 6856 544F" $"506F 9EBA BEBD BAA7 8B7B 746A 6D86 A0A7" $"B1C2 B285 686A 6F6F 7F92 958E 8C8D 857D" $"8180 6C60 6868 4E3A 3C3A 395A 889C 9EA3" $"9C7A 574C 4A44 455E 7C89 95A9 AA92 7F78" $"6E6F 92B5 B6AF B9BC A591 969C 938A 8778" $"5C50 5752 4658 7E8F 96AC B696 6A50 3B29" $"345C 7575 7C8C 8A77 727D 7B73 829F AEB7" $"C6BE 9986 939F A1AB B6AB 8E7C 7973 7182" $"989C A0BA C6A7 7E64 4522 2752 6F77 838A" $"7758 4D4C 3E32 4159 6067 808A 725B 5F64" $"6274 8E81 5B46 3F34 3C64 8FA1 AFCB D6C5" $"B3AB 9675 79A1 BDCA DEE6 C496 8482 7C80" $"95A1 9B9A A398 7D74 7A71 6068 7C73 523C" $"2808 0228 526B 87A6 A587 716A 5A4A 5472" $"8591 AAB8 9E7B 716D 6473 9EBA B7B0 AD9E" $"8A87 908F 8E98 9E8B 6D5A 4626 1C37 5B75" $"92A6 9975 5C4F 3B32 4666 757B 8B92 836E" $"655F 596E 98B1 B3B5 B299 8287 9EAE BBCA" $"C8AF 968A 785C 5267 8196 B4CE C299 755B" $"4240 5D75 7978 7C76 6356 554F 4248 606D" $"6D72 7359 4048 5A66 7B96 997E 6456 4632" $"3146 5F76 94AE B0A3 9580 6565 8EB5 C2C9" $"D0C3 A998 8F85 8595 A5A5 A2AC B09B 7F79" $"7E7E 8797 9273 573D 1B0A 224B 6878 8B98" $"9382 6F5D 4947 5D77 8496 A99F 7F6B 6A6C" $"768E A2A6 A4A8 A797 8788 8C87 8894 937B" $"624B 2A15 2545 5D76 9095 8473 6E69 605D" $"6874 7B84 908F 837D 7B74 7B9B B4B1 A8A7" $"A093 94A2 AEB4 B8B7 A891 7F71 5B49 5577" $"92A8 C2C9 B292 7960 525C 6967 5F60 655E" $"4D44 4647 4A5C 747B 7872 614A 495E 717D" $"888D 7F66 5243 3430 415F 7C9E C2D0 BFA7" $"998B 7D87 A0AB ADB1 B2AC A9AF B2A6 9CA3" $"AEA7 9793 8C77 6F79 8081 8A8B 7252 4031" $"2123 3B59 6F7C 8B92 8A82 7F74 646A 8187" $"8086 8D82 7474 7677 818C 8E89 858B 928F" $"92A1 A598 9394 805F 4936 2428 435C 6974" $"7F7A 6961 6567 5D5A 6870 7585 948F 878B" $"8F8D 99AF B7AB 9F9B 9C9F ABB9 BCB6 B3AF" $"9B80 756B 564F 6582 93A2 AB9E 8B80 786C" $"6569 6C65 5E61 6662 5B5C 5C56 5C6C 7068" $"696B 605A 6678 8181 7E75 675B 554E 464A" $"6277 8397 ADAE 9C8E 8882 8591 989C A6B2" $"B3AB A8B2 B6AF ACB2 B4A9 A19A 8A82 8B90" $"8D8F 9587 684F 413D 3E45 5464 6D76 7F7C" $"706E 6E60 596C 8185 8789 8279 7D86 8D99" $"A7AC A59D A0A6 9D90 9299 938D 8E84 6D5C" $"503E 374A 6268 6566 6963 524A 4D4C 4B54" $"5C5D 6980 847B 89A3 AFB4 BFC4 BEB4 A89C" $"99A1 AEB5 AEAA B3B3 9C86 827A 7381 959E" $"A8B5 AE94 817B 756C 6769 6C6A 6C77 776C" $"6A72 716F 7F8B 7A67 6157 494A 5D6C 7274" $"746D 625B 5D56 4851 6A74 788A 978E 8586" $"8581 8994 9490 96A1 A49F A1AD B3AF B4BE" $"B5A4 9B89 7274 8890 9096 9A8D 7968 5A4F" $"494C 575F 6B81 8F86 7E82 8278 7B87 847D" $"7E7B 767A 8795 9FA9 B1B4 A997 908F 8684" $"9098 989A 957C 635A 5140 3B47 585F 6165" $"6B6D 6A69 665C 5960 5848 4A53 5054 6D8C" $"A2B6 C1BE B5AC A39D 9CA7 BBC7 C6C9 D0C7" $"B1A2 9588 8A99 9F9D A1A5 9E95 9397 9B94" $"8679 6D5D 5149 3F3B 4B5B 6373 8786 756A" $"645F 6066 6A6C 6C6D 6D63 524F 5656 586C" $"7D80 8890 8B86 8D93 9191 948F 847D 7B7D" $"7E82 93A7 B0B7 C0BC ADA8 A698 939E A39B" $"948D 7F70 6763 6469 717E 8177 747D 7E79" $"818F 9090 948A 786E 6961 5F70 8B9F A8AA" $"ADAC A197 9591 8F95 9487 8081 7561 5C61" $"6566 635C 544C 4748 4E54 6373 7671 716A" $"5546 474A 5065 7D8E 9FAE B0AA A6A6 AAAB" $"AAAF B8B5 ADAA A499 9CA5 A3A0 A8A9 9D92" $"8F8F 9092 969C 9E95 8572 5A4B 4C4D 4F61" $"7679 7375 756C 635C 5655 5A61 635F 5C5D" $"5F5C 606C 716E 6D6B 5F5D 6870 727F 929C" $"A1A3 A099 8F85 848D 9BAF C1C3 BEC3 C3B0" $"A4A6 A396 8F8F 8C8B 897D 6F6B 737D 7E73" $"6760 5345 4855 5E6C 7F85 8790 8E79 655C" $"5859 6375 8B9C A1A2 A5A5 A4A8 A496 9198" $"958B 8B8C 837B 766E 6C6D 624E 3A32 3A49" $"525C 7280 7C76 7262 524F 4D4A 5775 90A0" $"AAB1 B5B4 AFAF B2B1 AFB2 B2AE B6C1 BCB6" $"BBBC B3AD A79A 8A80 7C80 8B96 A0A6 A39B" $"927B 5F54 5851 4C59 696E 7272 6B67 6866" $"6264 6970 6F61 575C 615E 5F62 5D5D 635C" $"525C 6C6F 7080 97A7 ADA9 A29D 9692 9499" $"A3B4 BBB0 AAB5 B7AC A6A5 A6AA ADA8 9C92" $"887D 736F 767F 7B6F 6B67 5C59 6166 6F83" $"9395 9596 886E 574D 525F 6D7D 8B8F 9299" $"9C9A A4B3 B3AE B4B6 A895 8471 6462 6364" $"6564 5B4C 3B39 4856 6072 8689 837F 725A" $"4C4B 4E5A 7691 9C99 9594 9290 96A7 B5BB" $"C1BF B2AB ACA4 9393 A1A7 A5A3 9D93 8C89" $"8E9A AABB C2B5 9F90 7C59 403D 4144 5365" $"6C6D 6E68 5E5B 636D 716F 7072 6A5B 5353" $"5358 5F5B 5961 6558 4F58 6775 879B AAAF" $"A693 837D 8391 989A A6B7 B9B1 AFAF A8A3" $"A4A3 A4A9 A592 7A6B 686A 6B6E 777B 736A" $"6357 5056 5C65 7E9C A89F 9281 6E60 5A5F" $"6D7E 8E99 9996 9A9E 9590 9AA3 A5A9 A99C" $"897C 7570 7279 7C75 675A 5146 3F43 4E56" $"667E 8A84 7966 4833 3644 5365 7B8B 9295" $"999C 9998 A0A9 ACB2 B7AB 978F 8B82 828F" $"9DA6 A9A4 998E 8C91 9AA3 AFBD BDAB 998B" $"735B 5151 5869 7C81 7970 6960 5857 6270" $"7776 7570 6766 645B 5865 706D 6968 5E53" $"535A 6880 9DAE AFA5 9788 786D 778A 96A5" $"BDCA C7C1 B6A0 9399 A3A3 A1A1 9A86 7169" $"6A6C 6F7B 8581 776D 5740 3A42 4A59 7690" $"9893 897A 6B64 656B 7280 9397 887F 817D" $"767E 8F9D ACB9 B4A1 9692 897E 7E89 9188" $"7766 533F 3537 3E50 6D7D 776E 6B5D 453A" $"4253 6980 939C 9A94 8B7E 7782 9297 9BA9" $"B2AD AAA8 A099 9DA6 A9A8 A08E 7665 6574" $"8595 ABBD BDB2 A895 7A69 5F53 4F5D 6C6B" $"6057 4D44 4149 5863 6A71 7065 6268 665D" $"667C 8680 786C 5B4D 4749 5670 8D9F 9C95" $"9796 887F 8794 A2B7 C4BE B6B2 A590 8A95" $"A1A7 A9AA A391 7F77 7372 7B86 8174 6D62" $"4A3A 3E4B 5A72 8EA2 A9A6 9983 6A60 656D" $"7381 9192 8782 7F78 787F 8388 959F 9B90" $"8887 8A90 9DAE B2A6 9179 5E4D 4D50 5365" $"7E8D 8E88 7C67 4F41 4451 6579 8582 7A77" $"746D 7184 939B A6AF AB9E 9288 8286 939E" $"A19C 9487 766D 798F A1B3 C7D0 CFC9 B99B" $"8072 6C69 7180 8881 6F5B 4D46 454B 5057" $"6471 7067 686B 6968 7077 7B7C 7361 5350" $"5864 738B A7B6 B5B1 A998 8478 7377 8AA4" $"AFAE ACA8 9D91 8E94 9CA0 A3A0 9589 7F74" $"6763 6C70 6862 6055 4640 444E 6079 909F" $"A4A1 937C 6966 6B6F 798A 9392 908C 8074" $"767D 838E 9FAC AAA0 9B9B 9B9D A4A4 998D" $"816D 5C59 5F63 6D81 959B 9688 6D4E 3830" $"323C 5067 716F 6E6F 6863 6A73 7C8A 9CA4" $"9D97 9490 8F99 A9B4 B3AA 9F91 837E 848B" $"99AF C0C3 C4C1 AD8F 776A 6362 6B77 7B77" $"7066 5A53 5A63 6569 7579 7068 6764 6168" $"7071 7376 7162 5659 6471 7F93 A5A9 A69E" $"8F7B 7374 7578 8A9F A6A6 A5A0 9994 9292" $"949A 9F98 877F 8280 797E 8C8F 887F 7260" $"5450 4C4E 5E78 8C91 8F8A 7F6C 5D59 585B" $"6979 7F83 8C8F 8886 8E95 9BA2 A7A2 968E" $"8C8D 92A0 ADAE A8A4 9983 716D 6A65 6A78" $"8288 8B81 6953 4D50 5258 6A7C 7C75 7576" $"7272 7778 7B89 9795 8B8B 8F8F 909A A7AF" $"B0A9 9B8B 8586 8584 90A6 B2B4 B6B3 A592" $"8375 6F77 878D 8984 827B 6D66 6A6D 6B68" $"6863 5F60 5F59 5B67 7176 7979 6F5B 4942" $"444C 5E73 8189 939A 9590 918F 8789 96A2" $"A8AB AAA4 9E9C A1A6 A8A8 A396 8A8C 9391" $"8C8C 8A85 8178 6857 4E49 4348 5B74 8283" $"817E 7873 7271 6E77 8890 9198 9E96 8784" $"8B91 9596 928B 8788 8A88 8D99 9B8F 847E" $"705E 534C 4346 596D 767B 7F7D 746F 7072" $"706E 7376 7374 7A79 767B 8286 8F9C 9F98" $"9493 908B 8B91 9897 9593 8A7F 7B7B 7470" $"7D90 9DA8 B2B3 AAA1 9990 8E94 9996 8C87" $"8882 766E 6861 6067 6D6E 757B 7165 646A" $"6B67 6159 4F45 3F3E 3F46 596B 7687 9DA8" $"A49F 998C 7F7D 838A 949D A1A2 A4A9 ADAB" $"AAAE B1AC AAAD AA9E 968E 837B 7871 6355" $"4D46 3E3F 4B5C 6E80 929A 9B99 9281 7373" $"7672 727D 8583 8282 8283 8A93 999D A7B0" $"AEA4 A0A0 988E 8983 776C 6253 4748 525D" $"6570 7C7F 776E 665C 5353 5757 5F71 7C79" $"777E 8182 8893 9BA0 A29F 9894 979B 9996" $"9A9C 938A 8884 7D7F 8B98 A9BC C8C6 BBAE" $"9E89 7872 716D 686B 6E69 6465 6563 6972" $"777A 8082 7D78 7A7E 7F7D 7973 6961 5B52" $"494A 5660 6B7D 9098 958E 8275 6F6F 7379" $"8695 9EA0 A3AA AFAC AAAB ACAB ABA6 9990" $"8E8A 817C 7F7E 7469 6460 5C5D 6771 7A89" $"9492 8A87 8173 696C 7174 787C 7C79 7978" $"7576 8292 9592 97A0 A2A0 A19F 9998 9992" $"8881 7866 5653 5A63 6B75 7C78 6F68 5D4F" $"474A 4D50 5F73 7C7D 8084 868B 959B 9A98" $"9792 8A87 8A89 8282 8E95 9594 9189 8284" $"8B95 A6B7 BDB7 AFA9 9F8E 8079 7877 787C" $"7A76 726C 6261 6D77 7573 7573 6C65 6366" $"6D77 8080 7B79 735E 4A47 505A 6677 878E" $"918C 7E73 747C 8184 8D9B A19F A0A2 9F9D" $"A3AA ADB2 B2A5 9186 8179 7070 7676 706C" $"6A63 5F64 6A6D 778A 9799 9A9A 8E7E 7576" $"797C 807F 7973 716E 696B 7783 8B93 9A96" $"8D88 847E 808B 928D 8580 7566 5D5B 5B5B" $"616F 7D82 847E 6D5F 616A 6E71 797E 7972" $"6E6C 6F7A 8589 8B8F 938E 8179 7571 7484" $"959C 9E9A 8F84 8286 8B92 9EAB B3B4 B3B0" $"A698 8F8C 8A8A 8B85 776D 685F 585E 6B71" $"7170 6E6B 6662 5F5D 616D 797C 7B76 6750" $"4343 4954 6474 808B 928F 857D 7D82 858A" $"9397 8E83 7B74 747E 8A91 979F 9F94 8984" $"7F7B 797B 828B 9191 8677 706F 6F77 899A" $"A0A0 9D96 8D86 8482 8489 8C88 817C 7871" $"6869 7581 888F 928D 8984 7D78 7D88 8B87" $"827D 7366 5952 535B 6874 797B 7B76 6961" $"6364 6362 615C 5855 5151 5967 757D 838D" $"938D 837F 7E80 8997 A1AB B5B5 A99D 9795" $"969B A3AC B1B2 B3B1 ACAA ADAB A4A0 9C8F" $"7D6F 6156 545B 656C 7172 6C62 5A58 585B" $"6675 7A74 6E66 5646 3F3D 4458 6E7B 8288" $"8A86 7E7A 7A7D 7D7E 807F 7C7B 7974 7887" $"9295 989C 9A91 877E 797C 8388 8B92 9B9B" $"8C7B 7575 7273 7D87 8D94 9A9C A1A9 ABA4" $"9C97 8E80 736D 6D6D 6C71 787F 878F 8C86" $"8481 7B77 7778 7775 7068 625D 5A5A 5C62" $"6D75 777D 8582 7871 6B64 6162 6264 6A6E" $"6C6B 6F77 7C7E 7F81 827F 7F7F 7D80 8B92" $"959C A39E 9287 8282 878D 949C A6B0 B7BA" $"BABB B8AB A09C 978E 867E 7573 787D 7D7B" $"7B77 6D61 5A55 4E49 4F59 5E5F 5D52 453E" $"3C3C 4659 6972 7C88 8F91 8E89 8480 7F85" $"8A8A 8A8A 847F 848D 9092 999D 9A96 908A" $"878B 9192 9091 928B 7B6C 6461 636D 7882" $"909F A19B 9999 958D 8989 8985 7F7B 7A7D" $"8286 8789 8E8C 8175 6F68 6261 6467 6B6D" $"6960 5853 5352 545E 6C77 8187 8681 7F7C" $"7572 7679 7773 7170 7277 7E84 888E 9598" $"928A 847E 7D88 9498 9BA2 A198 8F8A 8685" $"8688 8D93 9DA4 A19B 9CA3 A7A5 A4A2 988E" $"877F 7A7A 7D7C 787A 7E7B 6F61 5954 5054" $"5D64 696C 6658 5051 504D 5059 636E 7779" $"7778 7C80 8181 888C 8883 8382 8085 8C90" $"959E A5A6 A49F 9790 8D91 9799 999B 9A92" $"8B87 7F77 787C 7B7A 7F82 8283 888C 8E8D" $"8A85 7E76 7069 6365 6E73 7680 8887 817E" $"7A77 787B 7C7B 8086 8378 6F6B 675F 5E63" $"676C 7274 7171 7777 7170 7476 7674 7473" $"7173 777B 818B 908A 8180 807E 818D 969C" $"A3AB ACA8 A096 8B83 8182 8180 838A 8D92" $"999B 9795 938A 7F7A 756C 6566 6D75 7B7F" $"817C 7675 7573 7277 7772 7374 6D61 5851" $"4B48 4B51 585F 6568 686C 777E 7C79 8084" $"8385 8785 868D 9396 9BA1 A29D 9794 9596" $"989D 9E9D A0A5 A29B 978D 7969 6464 6466" $"6D75 7C83 8A8C 8883 7F75 6B6A 6D6A 6669" $"7074 7D8B 9393 9290 8A83 8181 807C 7D84" $"8581 7E77 6756 4E4B 4C58 6B74 767A 8080" $"7C7A 7A79 7878 7D80 858B 8B84 838B 8E8A" $"888A 8885 858A 919A A1A4 A19D 988E 7B68" $"6162 636E 8293 9CA2 A296 8E8F 8D84 7C7C" $"8082 8286 8C8E 8E8E 8C8A 8E91 8573 6A69" $"686A 757B 7870 6658 4A40 3935 3742 5262" $"6D78 8486 8384 888B 9198 9996 999F A09E" $"A0A5 A6A2 A0A3 A196 8A83 7F83 8F96 9492" $"9083 6D60 5D5D 6067 707B 8388 8882 7A76" $"746F 6E79 8283 8285 888D 979D 9D9C 9B97" $"8C80 7C7E 8182 868B 8B86 7C68 5146 4441" $"434F 606C 757C 807F 7B77 7473 777F 8689" $"8E95 9693 98A2 A5A2 9D94 887D 7776 7A83" $"8D95 9898 978F 8075 7272 737A 868E 959B" $"9A91 8D8E 8D89 8788 8C8D 8B8A 8A8D 9497" $"928F 918F 8176 7679 7979 7B7A 7771 6557" $"4B46 433E 3A41 4F5A 6168 6E73 7981 8385" $"8E96 9896 979C A2A8 ADB2 B3AE A79E 948D" $"8B88 8589 949A 9A98 9183 7366 5E5C 6068" $"7076 7D84 8988 878B 8B86 8384 837F 7E80" $"838C 969B 9C9C 9C99 8F85 817F 7B7A 8084" $"8482 7966 5349 413B 3D49 5762 686B 6C6C" $"6B6A 6A6E 7A8A 9191 9497 9591 9296 999E" $"9E99 928D 8984 8083 8C95 9A9C 9C93 8579" $"6F67 6974 8088 939C 9C97 938F 8C89 8788" $"8C90 9394 908D 9091 8E8E 9393 8B85 7F78" $"7473 7275 7A7C 7567 5850 4A41 3A40 4D57" $"5F65 686C 7275 7577 7F87 8988 898F 9496" $"999B 9EA3 A8A3 9790 8C84 8086 95A4 ABAB" $"A49B 9287 796C 666A 6F73 7980 8481 7F7F" $"8186 8C8C 8783 8180 8186 8D95 9B9F A19D" $"9387 7E76 747A 858D 9496 8D7C 6A5E 5651" $"5157 616D 7578 7774 726F 6966 6A6E 6C67" $"666A 7077 7F89 959E 9D92 8780 7A75 727A" $"8DA0 ACB3 B4AF A89D 9087 898F 9393 9598" $"9997 9391 9294 9695 908B 8985 7C78 7E87" $"8F95 9690 877B 6E65 646A 7073 7579 796E" $"635D 5954 5259 636E 777C 7A79 7B7B 7876" $"7779 797A 7C7E 7F83 8A90 98A2 A79F 9187" $"7E78 7A83 909B A3A6 A6A5 A29C 9082 7C7E" $"8183 8990 9292 9292 9294 938A 807B 7B7B" $"7B7E 858D 9397 9A97 8E82 7569 666C 7479" $"7E83 817A 7571 6B64 5F60 6670 797B 7773" $"7373 7172 7473 6F6B 6A68 676B 7075 7D86" $"8C89 8077 716B 6A73 818E 9AA4 A8A8 A8A3" $"9A95 9599 9DA1 A5A7 A7A5 A29F 9D9E A09E" $"958D 877F 7A7A 7F86 8F94 9289 7F73 6457" $"5155 5C61 676F 7575 7068 5F59 5758 5D65" $"6E73 7373 767B 7F82 8382 7F7B 7672 737B" $"868C 9196 9792 897E 736E 7075 7F8C 99A3" $"A7A6 A29C 948C 8A8D 9094 9797 9699 9C9D" $"9C9B 9993 8B85 8282 8285 8C92 9699 948A" $"8077 6D64 656D 757E 8488 8A89 8378 6D66" $"6466 6666 696A 6969 6E72 7578 7773 706D" $"6965 656A 727B 848D 9089 7D74 6B66 6970" $"7987 9AA7 ACAF B1AE A9A3 A2A6 ABAF B1B0" $"AEAB A9A5 A1A1 A29C 938E 8B88 8585 868C" $"9496 9087 7E75 6A5D 5555 5C64 6F79 7F81" $"7D6F 5F56 5352 5153 5A62 6769 6D76 7C7F" $"7C77 7577 7772 7278 7F86 8D95 9B9C 9587" $"7871 6E6F 7682 92A1 A8A8 A6A3 9C96 918D" $"8D94 9999 989A 9A96 918D 8987 8584 8383" $"8181 8388 9198 958C 8376 6760 6269 737F" $"898D 8D89 8071 6158 5759 5C61 686A 6A68" $"6666 6B6F 6E6B 6B6C 6B66 6261 676F 7985" $"8B8A 8275 665B 5A5F 697A 8F9E A5A7 A7A5" $"A29E 9CA0 A8B0 B4B2 AEAD ABA6 A2A2 A3A0" $"988E 8684 8484 8891 9BA1 A198 8A78 6049" $"3E43 5367 787F 7E7B 7265 5953 4F4D 4E52" $"5C68 6E6E 6B6A 6D77 7F84 8687 8178 7375" $"7D88 9297 9996 8D80 7265 6165 6E7B 8E9F" $"A5A2 9C95 908E 8D8D 949E A4A7 A8A6 A39E" $"9895 9695 8F87 7E75 7174 7A85 9399 968D" $"8377 6B61 5B5C 6778 8792 9591 8776 6358" $"5656 5759 5D60 6468 6B70 777D 7F7E 7C7A" $"766E 6766 6B75 8390 9593 8B7A 695E 5B5D" $"6471 818F 9A9E 9D99 9593 969B A1AB B1AF" $"ABA9 A9A9 AAAA A9A6 9F95 8980 7873 7379" $"8696 9A91 8370 5B4B 474C 5766 727A 7E7E" $"776B 5D50 4A49 4D55 6067 6866 6466 6F79" $"7E7D 7B79 7471 7277 818E 989D 9E9A 907F" $"6A5A 565C 6675 8491 9A9E 9C97 9494 9291" $"959C A2A6 A6A6 A6A7 A9AC ACA6 9E93 8478" $"7574 7478 7E81 807B 7168 6260 6164 6B73" $"7E84 827C 756D 6969 6A68 6664 5F5E 6367" $"6B72 7A83 8887 827E 786E 6A6E 798A 9A9E" $"988E 806E 5E54 5257 6370 7C87 8F92 918D" $"8B8E 9296 9A9E A09F 9FA0 A5AE B6B9 B7B4" $"AEA0 8B78 7070 767D 868D 8D87 7A6A 5E5C" $"5C5C 626D 7579 7975 6E66 5C55 5457 5D62" $"6564 6466 676B 7580 8586 847F 7B7B 7C7E" $"8692 9DA2 A19C 9282 6F62 6066 707C 868D" $"9395 928C 8988 888A 8C92 9BA0 A1A2 A4A8" $"ACAC A9A5 A196 8579 7473 767B 8185 8884" $"7A6F 655F 5F61 6874 7F82 7D75 6D66 625E" $"5C60 686D 6D6D 6F72 7678 7C84 8B8B 867E" $"746C 6A6C 7688 989E 9C95 8A7E 7267 6061" $"656A 737B 8183 817D 7C82 8A91 9A9F 9F9F" $"A1A2 A6AC B2B5 B5B2 AAA1 9488 8384 8890" $"9A9F 9D94 836F 625B 5A5E 656E 7578 736D" $"675F 554E 4D51 585E 5F5E 6064 686F 7880" $"8586 8078 736F 6F71 7987 99A7 ABA5 9A8A" $"7B70 6A6A 737C 8083 8788 8784 8385 8B91" $"979D A0A0 9E9B 989B A5AC ADAA A295 8578" $"7172 7981 878D 8E8A 8072 625A 5B60 6874" $"7D7E 7A70 655F 5E5E 5E61 6669 6966 6467" $"6D73 7D89 9093 8E7F 716B 6B70 7D8F 9DA4" $"A298 8D83 776C 6562 6670 787B 7B7B 7874" $"767E 8893 9998 9697 999B 9FA6 AEB4 B6B2" $"AB9F 8F81 7C7E 899A A5A7 A196 8572 645D" $"5C61 666B 7071 6D65 5B51 4C4A 4B4F 5558" $"534E 4E4F 555F 6A76 8188 8881 7975 7981" $"8C9B A9AF AEA5 9786 7A71 6A6D 7883 8B8F" $"9191 8D85 7F81 878E 9293 9291 8F8A 878D" $"9AA4 A7A7 9F94 8980 7C7F 8892 999C 9C98" $"8D7C 6A60 5B5A 6066 6B6F 6F69 605C 5C5D" $"5C59 585B 5D5B 595A 626F 7E8A 9194 8F82" $"7672 747D 8B9A A7AF AEA5 9684 7367 6263" $"6C79 8285 8480 7D7C 7E81 8489 8B8C 8C8C" $"8C8E 939B A6B0 B3AF A699 8E87 858B 98A7" $"B0B1 AB9F 8C78 665C 5A5E 6367 6A6C 6961" $"5751 5050 4F50 5352 4E4A 494C 5665 737F" $"8588 8580 7A78 7C84 919F AAAE ADA3 9180" $"756F 6E73 7D85 8C8F 8D8A 8885 8383 868B" $"9090 8C89 8785 8890 9CA7 ACAA A39A 918A" $"8687 8D96 9B9C 9A94 8877 6962 6064 6A6B" $"6C6C 6960 5855 5557 5756 595D 5F5F 5E5F" $"6775 828B 9295 9187 7F7A 7C86 929D A6A9" $"A59B 8D7E 726A 6767 6E77 7C7E 7D79 7574" $"7577 7D80 7F7E 7E7E 8085 8C97 A4B0 B6B5" $"AB9D 918A 888F 9CA9 AFB0 AA9F 9284 7770" $"6F72 7679 7976 6C5B 4A41 3F42 4950 5354" $"5350 4D50 5862 6B74 7B80 8280 7C7D 838E" $"9EAC B4B8 B5A7 9485 7B76 7679 7E86 8C8F" $"8D86 7F7B 7978 797C 7F7D 7874 7379 848E" $"959D A2A0 9A93 8A81 7C7D 8590 9BA0 9F97" $"8C82 7A76 7980 8484 8380 7970 665D 5654" $"5556 595C 5E5F 5D5E 6773 7E84 8682 7A74" $"7374 7D8B 98A2 AAAD AAA0 9182 7873 7275" $"7A7E 817F 7770 6E6E 6F70 7376 7A7E 7F7F" $"8286 8C93 9BA2 A6A4 9B8F 8885 8890 999F" $"A4A5 A099 938C 8682 8185 8C91 918B 8072" $"645C 5757 5A5C 5A57 5553 5355 585E 666D" $"7175 7674 7172 7A8A 9BA8 B0B2 ADA0 9287" $"807E 8285 898E 908D 857C 7676 7B80 868C" $"8F8C 8780 7B7A 7D82 8A93 9A9A 948A 7F77" $"7374 7D8A 959A 988F 857C 7571 7781 8D95" $"9894 8D84 7A70 6A67 6768 6766 6564 605E" $"636D 787F 7E78 716D 6B6C 7482 929F A5A6" $"A59F 9386 7D79 797C 7F7E 7A73 6A65 666C" $"737A 8084 8788 8683 8080 848B 9298 9C98" $"8D82 7B7B 828C 959E A6A6 9E93 8780 7E81" $"8791 9B9E 998E 8175 6C65 6061 6364 6360" $"5952 4C4A 4B51 5B64 6A6B 6865 6568 707F" $"92A1 ACB0 ACA5 9C91 8784 8588 8C8C 8A88" $"847D 7B7E 858C 9396 938E 867B 7676 797F" $"868C 8F8E 877D 736F 7075 7F88 9095 958E" $"8884 8388 919A A1A4 A098 8D81 766F 6C6D" $"6F70 6D67 615C 5654 5860 6970 716E 6A66" $"6364 6A76 899B A6AB A99F 9186 7E7D 8286" $"8887 8581 7C77 7270 737A 8086 8A8C 8B87" $"817F 8389 8F93 928C 857F 7978 7D85 8E95" $"9DA1 A29E 9690 8F91 979F A5A6 A196 867A" $"7370 6E6D 6B68 645E 564F 4B48 4A50 575F" $"6262 5F5E 5F65 7181 919E A6A8 A5A0 9A93" $"8D8B 8D93 9796 938E 867D 7776 7980 888B" $"8C8B 8882 7D7B 7D82 8789 8A8A 8781 7C77" $"7880 8A93 9A9D 9B94 8C86 8487 8B8E 9194" $"9491 8B84 7D77 706C 6B69 6764 605D 5D61" $"6569 6E70 6F6D 6A69 6A6F 7580 8E9A A2A6" $"A39C 9690 8B8A 8D8D 8984 7F7B 766F 6967" $"696C 7279 7C7E 7E7C 7A7C 8289 8D8E 8B88" $"8785 8488 9099 A0A6 A7A6 A39B 928E 8D8E" $"9194 9596 948C 827A 7470 6E6A 6663 605C" $"5754 5253 585D 646B 6F6E 6A68 696F 7881" $"8992 9A9D 9D9C 9A98 9795 9595 938E 8881" $"7A76 7575 787D 7F7D 7A75 7171 7277 7F87" $"8D8F 908E 8A86 8383 8A93 9A9E 9F9C 9792" $"8C87 8689 8B8D 8E8F 8E89 7F77 7371 6F6D" $"6B68 6561 5C5B 5F66 6A6D 7073 7471 6D6C" $"6E72 7882 8E99 A1A4 A19F 9E9E 9C9A 9894" $"908A 837C 7873 6E6B 6A6D 7172 6F6E 6F72" $"777C 8186 8989 8685 8688 8A8D 9095 9B9E" $"A0A1 9F9A 9695 9699 9B98 918A 837C 7774" $"7374 7370 6C68 6561 5D5A 5A5E 6468 6B6D" $"6E6C 6966 666D 757B 828A 9196 9897 9698" $"999A 9C9D 9D9A 958C 8583 817F 7E7D 7A76" $"7472 7273 7679 7E84 898D 8C87 8481 7D7C" $"7F85 8A8D 8F8F 9193 928F 8C88 8583 8182" $"8382 7E7C 7A76 736E 6862 5E5C 5C60 666C" $"7173 7374 7677 7775 7372 7375 7980 888B" $"8D8D 8E91 9495 9493 908D 8884 7F79 7570" $"6D6D 7072 7375 797E 8387 898C 8E8D 8B89" $"8887 8683 8184 898D 9297 999B 9B96 928F" $"8C88 8482 8282 7F7A 7671 6B66 615D 5C5E" $"605F 5E62 686C 6E6D 6D6E 7071 7172 7374" $"777C 8289 8D8E 9092 9394 9391 8E8D 8B88" $"8687 8787 8581 7E7C 7B7B 7D80 8488 8C90" $"9496 9490 8C89 8581 7F7E 7F83 878B 8E8F" $"8D8A 8580 7E7E 7E7F 8283 827F 7871 6B66" $"615D 5E63 686D 7175 787A 7B7E 8286 8783" $"7C78 7878 787A 7D82 868A 8C8F 9190 8D8A" $"8889 8A86 807C 7973 6D6A 6969 6D72 7882" $"8C92 9493 9497 9794 9290 8C86 8383 858A" $"9093 969B 9F9E 9992 8A84 807F 8184 827B" $"746C 6663 615F 5F62 6567 6B6E 6F71 7272" $"7478 7977 726E 6C6C 7076 7F87 8B8E 8E8B" $"8988 8683 8385 8788 8988 8582 7C77 7577" $"797E 8284 898E 9091 9598 9795 908B 8783" $"7F7D 7F84 8A8F 9191 908A 817C 7B7C 8085" $"8683 7F7A 736D 6864 6466 696F 7576 7677" $"7A7E 8286 8685 827B 7570 6D6C 6D72 7A82" $"888B 8A87 837F 7E7E 7E80 807C 7875 716D" $"6A69 6B70 7980 858A 8E90 908E 8F93 9696" $"9693 8F8B 8885 8488 8E93 9899 968F 8880" $"7D7C 7D80 8281 7D79 736C 6968 6766 686B" $"6E72 7475 787B 7C7E 7F7E 7C77 6E68 6667" $"6971 7C85 8B8F 8E8B 8782 7D7A 797B 7E80" $"807F 7D78 7574 767A 8288 8A8D 9194 9497" $"9999 9898 9795 918D 8986 8487 8C90 908E" $"8981 7975 7374 7B80 8385 847F 786F 6862" $"6264 6A71 777C 8183 8588 8B8B 8989 8781" $"7A73 6E6C 6F76 7E87 8C8F 8F88 7F79 7571" $"7071 7170 6F6C 6865 6568 6E76 8189 8F91" $"9294 9697 9B9F A1A2 A099 908A 8480 838B" $"949D A1A0 9B93 8981 7E7F 8388 8A88 8580" $"766B 6561 6166 6D74 7A7D 7C79 7879 7D80" $"7E7C 7973 6B65 6263 6C78 848F 989A 948A" $"8078 7370 6F71 7477 7777 7674 7779 7A7D" $"848A 8F94 989A 9C9D 9D9F A09E 978D 8178" $"7373 7781 8B90 908E 8781 7B77 7579 8289" $"8D8F 8D88 8076 706F 7275 7778 797B 7C7A" $"797D 8285 8585 837E 786F 6969 6E77 8086" $"898A 867D 7672 7070 7172 7374 726D 6765" $"6669 6F77 818A 9093 9599 9C9D 9D9B 9A99" $"9288 7F78 7474 7882 8E99 9E9C 9790 8B87" $"8586 8B8E 8C89 8784 807C 7976 7474 7372" $"7374 7372 7173 7778 7776 7570 6B68 686D" $"777F 858C 9293 8E87 7F79 7775 7677 7877" $"7470 6D70 757A 7E84 8A8E 9091 9191 9292" $"9292 9290 8A80 7873 7274 7A82 8B90 928F" $"8A87 837F 7F84 8B94 999A 9793 8C84 7E7B" $"7A7B 7A75 7272 7271 7277 7B7D 7F80 7E7B" $"7670 6D6F 7680 888C 8E8D 877F 7975 7171" $"7270 6E6D 6B67 6564 676D 757D 8588 898A" $"8A8B 8D91 9495 9694 8F87 807A 7676 7B83" $"8D95 9999 9590 8C89 878A 9195 9797 9691" $"8A82 7973 7172 7375 7574 7371 7072 7576" $"7572 6D67 6463 656D 7781 8A92 9796 9087" $"7E78 7574 7676 7574 7371 7071 7477 7B80" $"8488 8C8C 8986 8586 8A8E 9092 8E86 7F7B" $"797B 7E81 858B 8E8E 8C8A 8581 8185 8B92" $"9595 918C 8683 8180 8183 8381 807F 7C79" $"7674 7477 7A7B 7874 706F 6E6F 767F 868C" $"8F8D 8884 7E79 7574 7472 706F 7071 7171" $"7476 7879 7978 797B 7C7C 8085 8B90 9595" $"9390 8A83 7F7F 8287 8C91 9698 9693 9292" $"9192 9290 8E8C 8780 7C7A 7878 7A7D 8080" $"7C77 716D 6C6C 6D6F 7273 7271 716F 6E6F" $"747D 8991 9699 9690 877F 7A7A 7C7B 797B" $"7C7A 7979 7979 7A7A 7878 7977 7574 7477" $"7B7F 8589 8A89 8885 8282 8587 8A90 9496" $"938E 8887 8788 8B8D 8E8F 8C87 8381 7F7D" $"7E81 8180 7C76 716D 6C6D 7279 8186 8783" $"7E79 7370 7277 7E87 8C8E 8F8B 837A 7572" $"7274 7678 7875 706C 6A69 6B6E 6F6E 6F70" $"6F6F 7275 7A81 878C 8F8F 8E8B 898B 9198" $"9FA6 ACAD AAA4 9E97 928F 8E8F 9293 8E86" $"7D76 7270 6F71 7370 6B66 6263 6669 6C73" $"7A7E 7E7A 736C 6665 6973 818E 9698 9691" $"8A83 7F80 8284 8688 8781 7A71 6B6A 6C6F" $"7376 7776 716A 6666 696F 767B 7F84 8787" $"878A 8E93 989E A4A8 A6A1 9B96 918F 9090" $"908F 8982 7C77 726F 6D6C 6D6F 6F6C 6968" $"696D 747E 888D 8B86 817A 7573 7478 8088" $"8D90 918E 8880 7B7B 7F84 8685 8079 726B" $"645F 5E5F 5E5E 6163 6363 6265 6B75 7F89" $"9092 918D 8A8C 9197 9FA8 B0B4 B6B3 ADA7" $"A29C 9795 9594 8F86 7C74 6C66 6363 6362" $"6262 6265 696B 6D72 777B 7E7D 7873 706F" $"737A 848D 9597 9694 928D 8B8B 8C8E 8F8C" $"8680 7970 6A68 696D 7070 6E6A 645F 5D5F" $"646C 767E 868A 8A88 8482 838A 929D A5AA" $"AAA7 A29E 9B9A 9A9A 9B9A 938C 847B 736E" $"6B6C 6F72 7271 6D6B 6B6D 7178 8186 8886" $"817B 7775 7375 7D86 8D92 9493 8F8A 8685" $"8789 8A87 8078 716B 6664 6566 686A 6864" $"6260 6165 6D78 868E 9190 8D87 8180 848B" $"95A0 A6AA ACAA A5A1 9D9C 9FA3 A5A2 9B91" $"857A 706C 6C6F 7174 7471 6D6A 6868 6B70" $"777C 7C78 736D 696A 6E75 7F8B 9398 9995" $"8E89 8786 888C 8F8D 877D 746D 6A6A 6F75" $"7A7C 7A76 706C 6A6A 707A 8288 8B8B 8884" $"807E 838C 969F A5A7 A6A1 9992 9091 9294" $"9492 8E89 8078 7576 787C 7F81 817B 716A" $"6769 6E75 7C81 8481 7973 7173 777F 8993" $"9A9C 9892 8B84 807F 8084 8887 8077 7069" $"6565 6A6F 7577 746F 6C6A 6A6C 737E 878C" $"9090 8B85 8181 8691 9DA6 ACAE ABA5 9C95" $"9191 9395 9899 968E 857C 7778 7B7F 8283" $"7F77 7069 6564 6569 6E73 7574 706B 6A6E" $"7580 8C97 9C9C 978F 8884 8180 8387 8886" $"8078 716C 6A6D 757E 8485 817B 7571 6E70" $"7780 888D 9090 8D8A 8686 8B94 9DA5 A8A6" $"A096 8B84 8485 888C 8D8C 8984 7F7C 7C7F" $"8589 8C8A 8378 6C63 5E5F 656E 777D 8181" $"7D7A 797A 7F87 9097 9B9A 958B 827C 7B7C" $"7F84 8580 776F 6761 6166 6D75 7A7B 7770" $"6864 656A 727D 8890 9494 9190 9193 969D" $"A5AA ABA6 9C93 8C88 878B 9093 9390 8B86" $"827F 7F82 8688 8985 7D73 6960 5C5E 646D" $"7578 7976 726F 7074 7B85 8F96 9997 928C" $"8683 8182 8483 7F79 7069 6361 656C 757C" $"8283 7E76 6D68 676D 767F 8890 9596 9694" $"9395 999D A1A1 9D98 938E 8886 8686 888A" $"8784 817E 7C7B 7D81 8587 8580 7971 6B68" $"676C 737A 7E7F 7D79 7573 737A 8591 9A9F" $"A09C 958C 8682 8281 8180 7C75 6D64 5E5C" $"5E61 656A 6E6E 6B64 5F5F 626A 7683 8E96" $"9B9C 9A9A 9999 9B9F A3A4 A19C 9894 9291" $"9295 9798 9690 8A84 7E7A 7878 787A 7A77" $"7370 6D6B 6B6E 7276 7877 7471 6F6F 737A" $"848E 9598 9896 8F89 8686 8789 8987 827B" $"7168 625F 6064 696F 7374 7371 6E6B 6E76" $"808A 9297 9998 9693 9191 9296 999A 9997" $"928E 8A88 898A 8D8E 8C87 817B 7774 7475" $"7676 7878 7673 706D 6C6E 7378 7D80 807E" $"7D7C 7D82 898F 9496 9694 908A 8685 8688" $"8887 827C 756B 625C 595A 5D61 6568 6A6A" $"696A 6E77 818A 9295 9591 8D8A 898B 8E92" $"979C 9E9D 9A97 9492 8F8D 8F91 908B 8680" $"7A77 7575 787B 7B7A 7873 6F6C 6A6B 7075" $"797C 7D7B 7977 7677 7C82 8688 8988 8685" $"8483 8384 8686 837D 766D 645F 5F65 6C73" $"797C 7D7B 7978 7B81 878D 9294 9490 8B88" $"8788 898E 9498 9B9A 9794 908A 8583 8282" $"817E 7C7A 7979 797B 7E80 817F 7A76 726F" $"7075 7A7F 8588 8785 817E 7D7F 8387 8B8E" $"8F8F 8C88 8582 8181 807E 7974 6C65 5F5D" $"5F66 6D73 787B 7B79 7775 7579 7F86 8C8F" $"8F8D 8B8A 8A8B 8D8F 9395 9595 938F 8C8A" $"8989 898A 8986 827E 7B7B 7C7D 7D7D 7B79" $"7572 706F 7175 7C81 8486 8581 7D7A 7879" $"7E82 8587 8787 8583 807E 7C7B 7977 726D" $"6965 6364 6970 787E 8284 8380 7C79 797D" $"8389 8D90 9190 8E8C 8C8D 9093 9494 928F" $"8A86 8483 8383 8181 807E 7C7A 7878 7878" $"797A 7974 706C 6A6B 7075 7B80 8383 8281" $"8082 8488 8D93 9798 9791 8A84 7E79 7676" $"7676 736F 6B68 6565 686D 7276 7979 7774" $"7170 7277 7C82 8789 8A8A 8A89 8B8D 8F91" $"9191 908F 8E8C 8C8C 8D8F 8F8E 8C88 837D" $"7977 7779 7A78 7674 716F 6E6E 6F72 777C" $"8082 807D 7B7B 7E84 8B90 9392 8F8A 8480" $"7C78 7575 7776 7470 6A64 6061 6870 787E" $"8181 807F 7E7D 7E80 8488 8C90 9190 8E8A" $"8786 898C 8E8F 8E8E 8D8B 8888 8886 8482" $"807E 7A75 716F 6F6F 7071 7170 6F6D 6C6E" $"7377 7B7D 7F81 8486 8789 8D92 979A 9B9B" $"9790 8983 7E7B 7B7B 7A78 756E 6762 5E5D" $"5E62 696F 7477 7879 7878 797D 8186 8989" $"8887 8584 8586 878A 8B8C 8E90 9090 8F8E" $"9091 908D 8A85 7F79 7572 7170 6E6D 6E6E" $"6E6E 6E6E 7073 767C 8184 8585 8687 898B" $"8C8C 8C8B 8988 8785 827F 7C79 7775 716A" $"635D 5B5B 5E65 6E75 7B7F 8284 8685 8484" $"8688 8A8B 8B8A 8886 8484 8485 8687 888B" $"8E8F 8F8D 8B88 8481 7E7A 7672 6F6D 6C6C" $"6C6B 6B6D 6E6E 6E70 7378 7D80 8488 8B8B" $"8A8A 8A8C 8F90 9193 9391 8D88 8481 7D79" $"7672 6E69 625B 5656 5A5F 666E 757B 7E7F" $"7E7D 7D7F 8183 8585 8685 8584 8280 7F80" $"8388 8C90 9292 9191 9291 8E8C 8780 7A75" $"7170 706F 6E6F 7173 7474 7373 7579 7E84" $"898B 8A88 8482 8081 8387 898B 8E8F 8C89" $"8681 7D7B 7874 6E67 605B 5858 5C63 6A72" $"797F 8386 8686 8687 898B 8D8D 8C89 8580" $"7E7C 7B7E 8286 898D 8F8F 8E8C 8886 837F" $"7B77 7572 6E6D 6E71 7372 7374 7373 7476" $"797E 8387 898B 8B8B 8986 8485 888C 9092" $"9290 8D89 8785 827F 7B76 716B 655F 5B58" $"595D 6670 787E 8080 7F7E 7E7F 8080 8183" $"8483 817E 7C7C 7D7F 8387 8989 8989 8889" $"8989 8783 7E7A 7979 7878 7878 7979 7979" $"7978 7879 7C82 888B 8D8E 8D8A 8683 8280" $"8081 8386 8888 8886 8381 7E7C 7A76 716A" $"635D 5A5A 5E63 6C76 7E83 8687 8786 8483" $"8487 898B 8B88 8684 8484 8587 8889 8988" $"8887 8581 7E7C 7A79 7877 7675 7372 7375" $"7677 7879 7B7D 7F80 8284 8688 8A8B 8B89" $"8683 8384 878B 8E90 8F8E 8B89 8784 807D" $"7B78 7571 6C66 6260 6267 6E76 7D82 8484" $"8381 7F7D 7D7E 8185 898C 8C89 8786 8687" $"8786 8584 8280 7F7F 807F 7D7B 7B7C 7B79" $"7674 7373 7477 7B7F 8182 8486 898C 8E8F" $"8F8E 8C88 8581 7F7D 7E81 8589 8B8B 8985" $"817E 7C7A 7774 6F6A 6662 6161 6366 6B71" $"7A81 8687 8685 8383 878A 8D90 918F 8E8D" $"8C8A 8988 8788 8888 8784 7F7B 7977 7878" $"7775 736F 6D6D 6D6E 7074 787D 8286 8888" $"8888 898B 8C8C 8C8A 8886 8585 8689 8B8C" $"8D8D 8D8B 8782 7D79 7573 716E 6B69 6767" $"686C 7074 787B 7D7F 7F7E 7D7D 7F82 868B" $"8F92 9290 8D8A 8786 8685 8586 8483 8382" $"807D 7A78 7776 7675 7371 7172 767A 7E80" $"8285 8788 8A8C 8E8E 8E8E 8D8C 8984 7F7C" $"7C7D 8185 898A 8986 837E 7A76 736F 6C6A" $"6A6A 6A6B 6C6E 7073 787D 8182 8281 8082" $"8487 8C90 9496 9694 928E 8A87 8788 8A8A" $"8785 8381 7F7C 7976 7270 7070 7071 7171" $"7274 787C 8083 8587 8789 8C8E 8F90 908D" $"8A87 8381 8183 868A 8E8F 8E8B 8681 7C77" $"7473 7272 7170 6E6E 7071 7375 787A 7C7E" $"7D7B 7977 787B 8188 8E91 9291 8F8C 8A8A" $"8887 8787 8787 8685 8380 7D7B 7B7A 7978" $"7777 7776 7677 7A7C 7D81 8488 8B8D 8D8E" $"8E8E 8C8A 8581 7F7D 7D80 8487 8988 8581" $"7E7C 7977 7675 7576 7775 7371 7272 7374" $"787A 7B7C 7C7C 7D7F 8183 878B 8E8F 9090" $"8F8E 8C8C 8D8E 8E8E 8D8C 8A88 8685 8481" $"7E7B 7874 7271 7171 7273 767A 7E80 8181" $"8182 8384 8789 8988 8786 8585 8688 8A8C" $"8D8B 8985 817D 7B7B 7D7F 8080 7F7C 7A79" $"7877 7675 7576 7878 7674 7374 787D 8286" $"8A8C 8C8B 8A8A 8A8B 8C8E 9090 9190 8F8D" $"8B89 8988 8682 7F7C 7977 7778 7878 7879" $"7A7B 7C7C 7D7E 8084 888C 8D8B 8885 8382" $"8385 8789 8987 8381 807E 7C7B 7C7E 8081" $"807D 7A76 7574 7475 7676 7777 7777 797B" $"7D81 8487 8A8B 8B8A 8887 898C 9094 9696" $"9594 9290 8F8D 8C89 8683 7F7C 7A77 7473" $"7475 7677 7675 7472 7376 7A7F 8487 8888" $"8785 8484 8486 888A 8C8B 8986 8482 8181" $"8182 8282 807D 7B79 7877 7676 7677 7776" $"7574 7475 787D 8285 8787 8785 8382 8386" $"8A8F 9294 9593 908E 8D8D 8E8E 8D8B 8884" $"8180 7E7C 7A79 7978 7675 7474 7577 7B81" $"878A 8A87 8481 7F7E 7F82 8587 8888 8785" $"817E 7C7D 7E7F 8180 7E7B 7775 7574 7577" $"7778 797A 7979 7A7B 7E82 8689 8A88 8683" $"8180 8287 8C90 9293 9292 918F 8F8F 9090" $"8F8D 8984 7F7A 7776 777A 7C7C 7A75 7170" $"7173 767B 7F82 8382 807E 7C7C 7E81 868A" $"8C8C 8A86 8380 7F80 8080 807F 7E7D 7C7A" $"7878 797B 7D7E 7D7C 7976 7577 7B80 8486" $"8686 8481 7F7E 7F82 8588 8B8D 8C8B 8A89" $"8A8C 8E90 908F 8C88 8582 807F 8081 8282" $"807D 7975 7476 787C 8082 8281 7F7D 7C7C" $"7E80 8385 8685 8380 7D7B 7A7A 7B7C 7D7D" $"7C7A 7875 7374 7679 7B7D 7E7E 7D7B 7A7B" $"7E81 8587 8887 8582 7F7F 8082 8589 8B8C" $"8D8C 8C8B 8A8A 8C8E 8E8C 8985 817E 7D7E" $"8183 8484 817D 7874 7170 7173 777A 7C7D" $"7C7A 7979 7B7D 8083 8585 8482 817F 7E7E" $"7E7E 7F7F 7D7C 7A79 797A 7C7F 8283 8280" $"7C79 7879 7B7E 8182 8384 8280 7E7C 7C7E" $"8184 8788 8886 8584 8486 8889 8B8B 8B89" $"8886 8585 8687 8889 8783 7E79 7674 7578" $"7A7C 7E7E 7E7D 7D7D 7C7D 7E7F 8080 7F7D" $"7A78 7777 7878 7979 7775 7576 7779 7B7D" $"7F80 8180 7F7D 7C7C 7E80 8386 8686 8585" $"8585 8586 8787 8788 8786 8585 8687 8889" $"8A89 8784 8281 8182 8486 8786 8480 7C78" $"7574 7476 787A 7B7C 7C7B 7B7B 7C7E 7F81" $"8181 807E 7B79 7877 7777 7879 7979 7A7A" $"7B7D 8082 8382 817F 7E7D 7D7E 7F81 8284" $"8686 8686 8685 8484 8586 8584 8381 8181" $"8182 8384 8585 8585 8584 8383 8385 8686" $"8583 807E 7C7C 7D7D 7D7D 7D7D 7E7E 7F7F" $"7F80 8080 807F 7D7A 7775 7574 7474 7473" $"7475 7677 7878 797A 7B7D 7E7D 7C7C 7D7E" $"8184 8688 8888 8887 8788 8888 8887 8686" $"8687 8787 8787 8786 8583 817E 7C7B 7B7D" $"7F80 8282 8180 7F7D 7C7B 7B7C 7C7D 7D7C" $"7B7B 7B7D 7F80 8181 8080 7F7D 7B7A 7977" $"7676 7778 7877 7777 797B 7C7D 7D7D 7C7B" $"7B7B 7C7F 8182 8385 8686 8583 8181 8283" $"8484 8382 8283 8384 8585 8584 8382 8180" $"7E7C 7B7D 7F81 8384 8484 8382 8282 8283" $"8282 8180 8080 7F7F 8081 8282 8180 7E7C" $"7A78 7776 7575 7473 7372 7272 7375 7678" $"797A 7A79 7877 797C 8083 8485 8686 8686" $"8687 8787 8888 8989 8988 8787 8788 8888" $"8683 807D 7B7A 7A7B 7C7E 7F80 807F 7E7E" $"7E7F 8082 8383 827F 7D7C 7C7C 7D7E 8080" $"8182 8181 807E 7C7B 7A7A 7977 7674 7475" $"777A 7C7E 7E7E 7C7A 7877 7779 7B7E 8083" $"8585 8483 8282 8485 8687 8888 8786 8584" $"8382 8282 8282 817F 7E7D 7C7C 7C7E 7E7F" $"7F7F 7F80 8183 8585 8585 8585 8484 8382" $"8282 8383 8382 817F 7E7D 7C7B 7978 7775" $"7372 7171 7374 7779 7A7A 7977 7573 7375" $"777B 7D80 8385 8586 8585 8587 888B 8D8F" $"908E 8C8B 8988 8684 8381 807F 7E7D 7D7C" $"7C7D 7D7D 7D7D 7C7C 7D7F 8183 8383 8381" $"8181 8283 8384 8484 8484 8381 807F 7E7D" $"7C7A 7978 7676 7677 797A 7B7C 7C7C 7B7A" $"7876 7576 787B 7D7F 8181 8180 8081 8385" $"8789 8C8D 8D8C 8A87 8482 8181 8182 807E" $"7D7C 7D7E 8081 8281 807E 7D7D 7D7E 8081" $"8487 8989 8887 8686 8687 8887 8685 8380" $"7E7D 7D7B 7A78 7776 7675 7575 7575 7778" $"7979 7876 7473 7374 7678 7A7D 7F81 8282" $"8283 8588 8B8E 9090 8F8D 8B8A 8A8A 8987" $"8684 8280 7E7E 7E7F 8082 8382 807D 7977" $"7778 7B7F 8285 8787 8584 8281 8182 8487" $"8888 8785 8280 7E7D 7C7B 7A78 7878 7879" $"7A7A 7B7C 7D7D 7D7C 7A79 7776 7677 797B" $"7C7C 7D7E 7F81 8488 8A8B 8B8B 8987 8584" $"8485 8686 8685 8380 7E7D 7E80 8284 8585" $"8381 7D79 7878 7B80 858A 8D8D 8A87 8482" $"8283 8586 8788 8786 8482 7F7D 7B7A 7A79" $"7877 7675 7576 7778 797A 7A7A 7876 7473" $"7374 777A 7C7E 8081 8283 8688 8A8B 8B8A" $"8989 898A 8A8C 8C8C 8B89 8784 8281 8181" $"8283 8484 817D 7977 7677 7A7E 8386 8786" $"8482 807E 7D7D 7F82 8587 8887 8583 8180" $"7F7E 7E7D 7C7B 7A7A 7979 797B 7C7D 7E7D" $"7C7A 7876 7778 797B 7D7E 7F80 8183 8484" $"8585 8585 8585 8585 8688 8A8A 8987 8582" $"807F 8080 8283 8484 8381 7E7B 797A 7D80" $"8488 8989 8886 8483 8181 8182 8485 8686" $"8584 8281 8181 807F 7D7A 7877 7676 7779" $"7A7B 7B7B 7977 7674 7475 787B 7E81 8282" $"8282 8283 8485 8686 8787 8889 8989 8A89" $"8988 8786 8584 8382 8283 8382 817E 7C7A" $"7A7A 7C7F 8183 8485 8483 817F 7E7D 7E7F" $"8081 8181 8181 8283 8383 8280 7E7C 7A78" $"7878 7A7D 7F80 807F 7D7B 7979 7979 7B7D" $"7F80 8181 8080 7F80 8182 8384 8484 8383" $"8283 8383 8382 8281 8181 8282 8283 8383" $"8381 7F7D 7C7D 7F82 8587 8888 8786 8584" $"8382 8282 8281 8181 8080 8181 8181 807E" $"7B78 7675 7678 7A7D 7F7F 7E7D 7B79 7776" $"7678 7B7D 7F7F 7F7E 7D7D 7E7F 8183 8485" $"8686 8584 8484 8485 8686 8585 8483 8383" $"8484 8483 8281 7F7E 7D7E 7E80 8182 8383" $"8281 807F 7F7F 7F7F 807F 7F7F 7F7F 7F7F" $"7F7E 7D7C 7B79 7878 797C 7F81 8383 8280" $"7E7C 7B7B 7C7D 7F7F 7F7E 7D7C 7B7B 7C7E" $"8082 8384 8382 8180 8080 8283 8382 817F" $"7E7E 7E80 8283 8485 8483 8180 7F7F 8081" $"8384 8585 8584 8383 8282 8283 8383 8382" $"8180 7F7E 7E7D 7D7B 7978 7878 797B 7D7E" $"7F7F 7E7C 7A7A 797A 7B7D 7F80 7F7D 7B7A" $"797A 7C7E 8082 8384 8484 8383 8383 8485" $"8584 8482 8180 8182 8384 8585 8482 807F" $"7E7E 7E7F 8182 8383 8381 8080 7F7F 8081" $"8181 8080 7F7F 7F7F 7E7E 7D7C 7B7B 7A7A" $"7B7D 7E7F 8080 8080 7F7F 8080 8080 8080" $"7F7D 7C7B 7B7B 7C7E 7F80 8182 8281 8282" $"8283 8282 8180 7E7D 7D7D 7E7F 8182 8384" $"8382 807E 7E7E 7F81 8384 8585 8584 8383" $"8384 8585 8584 8382 8080 8080 8080 7E7D" $"7B7A 7979 797A 7B7C 7D7D 7E7E 7D7D 7C7C" $"7D7D 7E7E 7E7D 7C7B 7B7B 7B7D 7E7F 8182" $"8383 8484 8485 8584 8483 8281 8080 8081" $"8182 8282 8181 807F 7F7F 8081 8283 8382" $"8180 8080 8182 8383 8381 807F 7F7F 7F7F" $"8080 7F7E 7D7C 7A7A 7A7B 7C7E 8081 8282" $"8180 7F7E 7D7D 7D7E 7E7E 7E7E 7D7D 7D7D" $"7D7D 7E7F 7F80 8182 8383 8382 8180 7F7F" $"7E7D 7D7E 7E7F 8080 807F 7E7E 7F80 8182" $"8383 8382 8281 8182 8485 8686 8684 8382" $"8180 8080 8080 807F 7D7C 7B7A 7A7B 7C7D" $"7E7F 807F 7D7C 7A7A 7A7B 7B7C 7D7D 7D7D" $"7D7C 7C7C 7C7D 7E80 8182 8383 8485 8585" $"8585 8483 8281 807F 7F7F 7F80 8080 807F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F80 8282 8383" $"8282 8181 807F 7E7E 7E7E 7E7E 7D7D 7D7D" $"7D7E 7F80 8182 8281 807E 7D7C 7C7C 7C7C" $"7D7D 7D7C 7C7B 7B7B 7B7C 7D7E 8081 8182" $"8282 8282 8181 8180 7F7E 7E7E 7E7E 7F7F" $"7F7F 7F7F 7E7E 7E7E 7E7F 8081 8282 8384" $"8485 8585 8584 8483 8281 807F 7E7E 7D7C" $"7C7D 7D7E 7F7F 8081 8180 807F 7D7C 7B7A" $"7A7A 7A7A 7B7B 7A7A 7979 797A 7B7D 7E7F" $"8081 8182 8283 8383 8384 8484 8382 8181" $"8080 8080 8080 7F7E 7D7D 7C7C 7C7D 7E7F" $"8081 8182 8282 8282 8282 8181 8180 7F7F" $"7E7E 7D7D 7D7D 7E7F 8081 8282 8282 8181" $"807F 7E7D 7D7C 7C7C 7C7C 7C7B 7B7B 7B7B" $"7C7D 7E7E 7F80 8181 8182 8282 8282 8281" $"8180 8080 8080 8080 807F 7E7D 7D7C 7C7C" $"7D7E 7F7F 8081 8283 8384 8485 8585 8484" $"8382 8180 7F7F 7E7E 7E7F 7F80 8181 8181" $"8180 7F7F 7E7D 7C7C 7B7B 7B7B 7B7A 7A7A" $"7A7B 7B7C 7C7D 7D7D 7E7F 8081 8282 8383" $"8383 8383 8382 8282 8282 8282 8180 7F7E" $"7D7C 7C7D 7D7D 7E7E 7F7F 8080 8182 8383" $"8383 8382 8180 7F7F 7F7F 7F7F 7F80 8081" $"8181 8080 8080 8080 807F 7E7E 7D7D 7E7E" $"7E7D 7D7D 7D7C 7C7C 7C7C 7C7D 7E7F 8081" $"8182 8282 8181 8180 8080 8080 8080 8080" $"807F 7E7E 7D7C 7C7C 7D7D 7E7E 7E7F 7F80" $"8182 8384 8585 8584 8382 8180 8080 8081" $"8182 8282 8281 807F 7F7F 7F7E 7E7E 7D7D" $"7C7C 7C7C 7C7C 7C7C 7B7B 7B7B 7B7C 7D7D" $"7E7F 8081 8182 8283 8383 8383 8282 8281" $"8182 8282 8181 807F 7E7D 7D7D 7D7E 7E7E" $"7E7F 7F7F 8080 8182 8282 8282 8181 8080" $"8080 8081 8282 8282 8180 807F 7F7F 7F7F" $"7F7F 7E7E 7D7D 7D7D 7E7E 7E7E 7D7C 7C7C" $"7C7C 7D7D 7E7F 8080 8182 8282 8282 8282" $"8181 8080 8080 8080 8080 7F7F 7E7E 7E7E" $"7E7E 7E7F 7F7F 7F7F 8080 8182 8384 8484" $"8383 8282 8282 8282 8283 8282 8181 8180" $"8080 807F 7F7E 7D7C 7C7C 7C7C 7C7D 7D7D" $"7C7C 7C7C 7C7C 7D7D 7E7E 7F7F 8081 8283" $"8484 8483 8281 8181 8181 8181 8181 8180" $"7F7F 7E7E 7E7E 7E7E 7E7E 7E7E 7E7F 7F80" $"8182 8282 8282 8181 8181 8282 8281 8180" $"8080 8181 8282 8180 7F7E 7D7C 7C7C 7C7D" $"7E7E 7E7E 7E7E 7D7D 7D7D 7D7D 7E7F 7F7F" $"8081 8283 8383 8282 8180 7F7F 8080 8080" $"8080 8080 7F7E 7E7E 7E7E 7D7D 7D7D 7E7E" $"7F80 8182 8283 8383 8383 8383 8382 8282" $"8282 8181 8181 8282 8282 8180 7F7D 7C7B" $"7A7A 7A7B 7B7C 7D7D 7D7D 7D7D 7D7D 7C7D" $"7D7E 7E7F 8082 8283 8383 8382 8181 8181" $"8182 8282 8282 8181 807F 7E7E 7E7D 7D7D" $"7D7E 7E7E 7F7F 8081 8181 8181 8182 8282" $"8282 8282 8281 8181 8181 8282 8383 8281" $"807E 7D7C 7B7B 7B7C 7C7D 7E7E 7E7E 7E7E" $"7E7E 7E7E 7F7F 7F80 8081 8282 8383 8282" $"8180 8080 8081 8181 8281 8180 7F7F 7E7E" $"7D7D 7D7D 7D7E 7E7E 7F80 8181 8182 8282" $"8282 8383 8383 8383 8282 8181 8182 8283" $"8383 8281 807F 7D7C 7B7A 7A7B 7B7B 7C7C" $"7D7D 7D7D 7D7E 7E7E 7E7E 7E7F 7F80 8182" $"8383 8382 8282 8182 8282 8283 8382 8281" $"8080 7F7E 7E7E 7E7E 7E7E 7E7E 7F7F 8080" $"8080 8081 8181 8282 8282 8282 8181 8181" $"8181 8282 8382 8281 807F 7E7D 7D7C 7C7D" $"7D7D 7D7D 7D7E 7E7E 7E7F 7F7F 7F7E 7E7F" $"7F80 8081 8282 8282 8282 8181 8181 8282" $"8282 8181 807F 7E7E 7E7E 7E7E 7E7E 7E7F" $"7F7F 8080 8081 8181 8182 8282 8282 8282" $"8281 8181 8181 8282 8282 8281 807F 7E7E" $"7D7D 7C7C 7C7C 7D7D 7D7D 7D7E 7E7E 7E7E" $"7E7E 7E7E 7F7F 8080 8181 8282 8282 8282" $"8283 8383 8382 8281 8080 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 8080 8080 8080 8181" $"8181 8181 8080 8080 8080 8081 8181 8181" $"807F 7F7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E" $"7E7E 7E7E 7E7E 7E7F 7F7F 8080 8081 8181" $"8181 8181 8182 8282 8281 8180 807F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F80 8080 8181" $"8181 8181 8181 8181 8080 8080 8080 8081" $"8181 8181 8080 7F7E 7E7E 7E7E 7E7E 7E7E" $"7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7F 7F80" $"8080 8181 8181 8181 8282 8282 8282 8181" $"8080 7F7F 7F7F 7F80 8080 8080 807F 7F7F" $"8080 8081 8181 8180 8080 807F 7F7F 7F7F" $"7F7F 7F80 8080 8080 8080 7F7F 7F7E 7E7E" $"7E7F 7F7F 7F7F 7F7F 7E7E 7E7E 7E7E 7E7E" $"7F7F 7F80 8080 8081 8080 8080 8181 8182" $"8281 8180 7F7F 7F7F 7F7F 7F7F 7F80 8080" $"8080 8080 8081 8181 8181 8181 8080 8080" $"807F 7F7F 7F7F 7F7F 8080 8080 8080 807F" $"7E7E 7E7E 7E7E 7F7F 7F7F 7F7E 7E7E 7E7E" $"7E7E 7E7E 7F7F 7F7F 7F80 8080 8080 8081" $"8181 8282 8281 8180 8080 7F7F 7F7F 7F7F" $"7F80 8080 8080 8080 8181 8180 8080 8080" $"8080 7F7F 7F7F 7E7E 7E7E 7E7F 7F7F 8080" $"8080 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F80 8080" $"8080 8080 8080 8081 8180 8080 807F 7F7F" $"7F7F 7F7F 7F7F 8080 8080 8181 8181 8181" $"8080 8080 8080 8080 7F7F 7F7E 7E7F 7F7F" $"7F7F 8080 8080 7F7F 7F7F 7F7F 7F7F 7F7F" $"7E7E 7E7E 7E7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 8080 8080 8080 8080 8081 8181 8080" $"8080 7F7F 7F7F 7F7F 8080 8080 8080 8081" $"8181 8180 8080 8080 807F 7F7F 7F7F 7F7F" $"7E7E 7E7E 7E7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F80 8080 7F7F" $"7F7F 7F7F 7F80 8080 8080 8080 8080 8080" $"8080 807F 7F7F 7F7F 7F7F 7F7F 7F7F 8080" $"8080 8081 8181 8181 8080 8080 8080 8080" $"807F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F80 8080" $"8080 8080 8080 8080 7F7F 7F7F 7F7F 7F7F" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 807F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 8080 8080 8080 8080 8080 8080" $"7F7F 7F7F 8080 8080 8080 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F80 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 807F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 8080 8080 8080" $"8080 8080 807F 8080 8080 8080 8080 7F7F" $"7F7F 7F7F 7F7F 7F7F 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 807F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"807F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F80 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F80 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 807F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F80 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080" } }; resource 'snd ' (30537, "Wooden Harp", purgeable) { FormatOne { { /* array Synthesizers: 1 elements */ /* [1] */ sampledSynth, 160 } }, { /* array SoundCmnds: 1 elements */ /* [1] */ hasData, bufferCmd { 20 } }, { /* array DataTables: 1 elements */ /* [1] */ 11286, Rate22K, 11284, 11285, 0x0, 0x3C, $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F80 8080 8080 8080 8080 7F7F 7F7F" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7E" $"7E7E 7E7D 7A78 787D 8182 7F7B 705E 4C41" $"3C3C 3E40 3C31 272F 4554 574F 453D 3734" $"363B 4147 4D53 585E 6367 6B6F 7174 7980" $"8A96 A2AF BBC4 CBD1 D7DD E1E5 E9ED EFF2" $"F3F4 F5F6 F7F7 F6F6 F6F5 F4F3 F3F3 F2F2" $"EFEA D59F 717D 9DA7 ACB1 B2B1 AEA7 A098" $"9088 8075 5014 001B 353D 4449 4946 4038" $"2F28 2524 272C 333A 4147 4C51 565A 5E61" $"6466 6A70 7881 8D99 A4AE B6BC C2C7 CCD0" $"D4D8 DBDE E0E1 E3E4 E5E6 E7E7 E7E8 E8E7" $"E7E7 E6E4 DFD4 AE7E 6C79 8994 9BA2 A6A9" $"A8A5 A099 9289 7F6E 4514 0412 222C 353C" $"4042 403C 3631 2D2C 2D31 363C 4146 4A4E" $"5256 595C 5E60 6368 6D75 7F89 949E A7AE" $"B3B8 BCC0 C4C8 CBCE D1D2 D4D6 D8D9 DADB" $"DCDC DDDD DCDB DAD6 CFBB 9271 6C72 7B84" $"8C93 9A9F A1A0 9D98 9289 7E6B 431A 0B0F" $"161F 282F 373B 3D3C 3A37 3534 3538 3B40" $"4448 4B4E 5154 5759 5B5D 5F62 676C 757F" $"8892 9BA1 A7AC B0B4 B8BC BFC2 C4C7 C9CA" $"CCCE CFD0 D1D2 D3D3 D3D1 CFCB BFA6 836E" $"6B6D 7178 7F86 8E94 989A 9996 9189 7E6A" $"4825 1412 1418 1E25 2C32 373A 3B3B 3B3B" $"3C3F 4245 484B 4E50 5255 5759 5B5C 5D60" $"6368 6F77 8089 9199 9FA3 A7AB AFB2 B5B8" $"BBBE C0C2 C3C5 C7C8 C9CA CACB CBC9 C6BF" $"B198 7D6E 6C6C 6D71 767D 848B 9094 9594" $"918A 7F6D 5132 1F1B 1919 1C20 252B 3136" $"3A3D 3F41 4346 494C 4F51 5354 5657 595B" $"5C5D 5E60 6266 6B72 7A83 8B92 989E A2A5" $"A9AC AFB2 B4B7 B9BB BDBE C0C1 C3C4 C4C5" $"C5C3 BFB6 A791 7C70 6D6D 6D6F 7277 7D83" $"898E 9192 908B 8171 5A41 2D25 2220 2021" $"2328 2D33 383D 4145 484C 5052 5557 595A" $"5A5C 5D5E 5F60 6062 6366 6B70 777E 868D" $"949A 9EA1 A4A7 ABAD AFB2 B4B6 B8BA BBBD" $"BEBF C0C1 C0BE B9B0 A18E 7D73 6F6F 6F70" $"7174 797E 848A 8E90 8F8C 8476 644D 3A2F" $"2A28 2726 2627 2B30 353B 4146 4C50 5458" $"5B5D 5E5F 5F60 6161 6262 6364 6567 6A6F" $"747B 8389 9096 9A9E A1A4 A7A9 ACAE B0B2" $"B4B6 B7B9 BABC BDBD BCBA B5AB 9D8D 7F75" $"7271 7172 7274 767B 8085 8A8D 8E8C 867B" $"6B59 473A 3330 2E2C 2B2B 2C2E 3339 3F46" $"4C52 575C 6062 6364 6464 6465 6565 6666" $"6769 6B6F 7479 7F86 8C92 979B 9FA1 A4A6" $"A8AB ADAF B1B2 B4B6 B7B9 BABA B9B6 B0A7" $"9B8D 8178 7473 7373 7475 7679 7D82 878B" $"8C8B 877E 7162 5245 3D37 3533 3130 3030" $"3338 3D44 4C52 585E 6265 6768 6868 6868" $"6869 6969 696B 6C6F 7378 7D83 898F 9599" $"9C9F A1A4 A6A8 AAAC AEB0 B2B4 B5B7 B7B7" $"B6B3 ADA4 998E 847C 7775 7576 7677 787A" $"7C80 8589 8B8B 8881 776A 5C50 463F 3B39" $"3836 3535 3638 3D43 4A52 5960 6468 6B6C" $"6C6C 6C6C 6C6C 6C6C 6C6D 6E70 7377 7C82" $"878D 9397 9B9E A0A2 A4A7 A9AB ADAF B1B2" $"B4B5 B6B6 B4B1 ABA3 998F 867F 7A78 7778" $"797A 7A7C 7D80 8488 8A8B 8984 7C71 6559" $"5048 4340 3E3D 3C3B 3A3B 3E43 4A51 595F" $"656A 6D6F 7070 7070 706F 6F6F 6F70 7072" $"7478 7C81 868C 9196 9A9D A0A2 A4A6 A8AA" $"ACAE B0B2 B3B5 B5B5 B3B0 AAA3 9A91 8982" $"7D7B 7A7A 7B7C 7D7E 7F81 8487 8A8B 8A86" $"8077 6D62 5850 4A46 4342 4140 3F3F 4144" $"4A50 575F 656B 6F71 7373 7373 7372 7272" $"7272 7274 7578 7C80 858A 9094 989C 9FA1" $"A3A5 A7AA ACAE B0B2 B3B4 B4B4 B2AE A9A2" $"9B92 8B85 807D 7C7C 7D7F 8081 8283 8587" $"898B 8B88 837C 7369 6057 514C 4846 4545" $"4444 4547 4A50 565D 646A 6E72 7475 7575" $"7575 7474 7474 7475 7679 7C7F 8489 8E92" $"979B 9EA0 A2A5 A7A9 ABAD AFB1 B2B3 B3B3" $"B1AD A8A2 9B93 8D87 827F 7E7E 7F80 8182" $"8384 8587 898A 8A89 857F 776E 665D 5651" $"4D4A 4948 4848 484A 4C50 555C 6268 6E72" $"7476 7777 7776 7676 7575 7576 7779 7B7E" $"8287 8C90 9599 9D9F A2A4 A6A8 AAAC AEB0" $"B1B2 B2B1 AFAC A7A2 9B94 8D88 8481 7F7F" $"8081 8384 8586 8788 898A 8A89 8782 7B74" $"6B63 5D57 524E 4C4B 4B4B 4C4D 4F52 565B" $"6167 6C71 7476 7778 7878 7877 7777 7777" $"7879 7B7E 8185 8A8F 9397 9B9F A1A3 A6A8" $"AAAC AEAF B1B2 B1B1 AFAB A6A2 9B95 8F8A" $"8683 8180 8182 8486 8788 8889 8A8B 8B8A" $"8884 7F78 7069 625C 5753 504F 4E4E 4F50" $"5254 575B 6166 6B70 7476 7879 7979 7979" $"7979 7979 797A 7C7E 8185 898D 9296 9A9E" $"A1A3 A5A8 AAAC AEAF B1B1 B1B0 AEAB A7A2" $"9C96 908C 8884 8382 8284 8587 898A 8A8B" $"8B8C 8C8B 8A87 827C 756E 6761 5B57 5452" $"5151 5253 5557 595D 6166 6A6F 7376 7879" $"7A7A 7A7A 7A7A 7A7A 7A7B 7C7E 8184 888C" $"9095 999D A0A3 A6A8 AAAC AEAF B0B1 B1B0" $"AEAB A6A1 9C97 918D 8986 8483 8384 8688" $"8A8B 8C8C 8C8D 8D8C 8B88 847F 7972 6C66" $"605B 5755 5353 5455 5759 5B5E 6165 696D" $"7175 7779 7A7A 7B7B 7B7A 7A7A 7B7B 7C7E" $"8083 868A 8F93 979B 9FA2 A5A7 A9AB ADAE" $"AFB0 B0AF ACA9 A6A1 9C97 928D 8987 8483" $"8384 8688 8A8B 8C8D 8D8D 8D8C 8B89 8681" $"7C76 6F69 645F 5B57 5555 5556 585A 5D5F" $"6265 686C 7073 7677 797A 7A7A 7B7A 7A7B" $"7B7B 7C7D 7F82 8588 8C91 9599 9DA0 A3A6" $"A8AA ABAD AEAE AEAD ABA8 A4A0 9B96 928D" $"8987 8584 8384 8688 8A8B 8D8D 8E8E 8D8D" $"8C8A 8783 7E79 736D 6762 5E5A 5857 5757" $"595B 5E61 6366 696C 6F72 7476 7879 7A7A" $"7A7A 7A7A 7B7B 7C7D 7E81 8487 8A8E 9397" $"9B9F A2A5 A7A9 ABAC ACAD ACAB A9A6 A39F" $"9A96 928E 8A87 8584 8484 8688 8A8C 8E8F" $"8F8F 8E8D 8C8A 8783 7F7A 7570 6A66 625E" $"5B59 5959 5B5D 5F62 6567 6A6C 6E70 7274" $"7677 7778 7979 7979 7A7A 7B7C 7D80 8385" $"898D 9195 999D A1A4 A6A8 A9AA ABAB AAA9" $"A7A4 A19D 9995 918E 8A88 8685 8585 8688" $"8B8D 8F90 9190 908E 8D8B 8885 817C 7873" $"6E6A 6662 5F5D 5B5B 5C5E 6164 6769 6B6D" $"6F71 7273 7475 7677 7878 7879 797A 7B7C" $"7D7F 8285 888C 9094 989C A0A3 A6A8 A9A9" $"AAA9 A8A7 A5A2 9F9C 9895 918E 8B89 8786" $"8586 8788 8B8D 8F91 9292 9190 8E8C 8986" $"837F 7A76 716D 6965 6260 5E5D 5E5F 6164" $"676A 6C6E 7071 7273 7474 7576 7777 7878" $"7979 7A7B 7D7F 8184 878B 8F93 979B 9FA2" $"A4A6 A7A8 A8A8 A7A5 A3A1 9E9A 9794 918D" $"8B89 8786 8585 8688 8A8D 8F90 9292 9190" $"8F8C 8A87 8480 7C78 746F 6B68 6562 605F" $"5F60 6164 676A 6D6F 7071 7273 7373 7475" $"7576 7777 7879 797A 7C7E 8083 8689 8D91" $"9599 9CA0 A2A4 A5A6 A6A6 A5A3 A19F 9C99" $"9693 908D 8A88 8685 8585 8587 898B 8D8F" $"9192 9191 8F8D 8B88 8481 7E7A 7672 6E6A" $"6664 6260 6060 6264 666A 6C6E 7072 7273" $"7373 7374 7475 7676 7778 797A 7B7D 7F81" $"8487 8B8F 9296 9A9E A0A2 A4A5 A5A4 A3A2" $"A09E 9B98 9591 8F8C 8987 8685 8484 8586" $"888A 8D8F 9091 9191 908E 8C89 8683 7F7C" $"7874 706C 6966 6462 6161 6264 6669 6C6E" $"7072 7373 7373 7374 7474 7576 7777 787A" $"7B7C 7E81 8486 898D 9195 989C 9EA1 A3A3" $"A3A3 A2A1 9F9D 9A97 9491 8E8B 8987 8584" $"8484 8485 8789 8C8E 9091 9291 908F 8D8A" $"8884 817E 7A76 736F 6B69 6664 6363 6364" $"6669 6C6E 7072 7374 7474 7474 7474 7576" $"7777 7879 7B7C 7E80 8285 898C 8F93 9699" $"9D9F A1A2 A2A2 A1A0 9E9C 9997 9491 8E8B" $"8987 8584 8383 8485 8688 8B8D 8F90 9191" $"918F 8E8B 8986 8380 7C78 7571 6D6B 6866" $"6564 6464 6668 6B6D 7072 7374 7474 7474" $"7474 7575 7677 7879 7A7C 7D7F 8284 878A" $"8E91 9497 9A9D 9FA0 A1A1 A09F 9D9B 9896" $"9390 8D8A 8886 8483 8282 8283 8587 898B" $"8E8F 9091 9090 8E8C 8A87 8481 7D7A 7673" $"6F6C 6A68 6665 6465 6667 696C 6F71 7273" $"7474 7474 7474 7475 7576 7778 797B 7C7E" $"8082 8588 8B8F 9295 989A 9C9E 9F9F 9E9D" $"9B99 9794 918F 8C89 8785 8382 8181 8182" $"8385 8789 8C8E 8F90 908F 8E8C 8A87 8482" $"7E7B 7874 716D 6B69 6766 6565 6567 696B" $"6D6F 7173 7374 7473 7373 7374 7475 7677" $"787A 7B7D 7F81 8386 898C 8F92 9598 9A9C" $"9D9D 9D9C 9A98 9693 908E 8B88 8684 8281" $"8080 8080 8283 8588 8A8C 8E8F 8F8F 8E8C" $"8A88 8683 807D 7976 726F 6C6A 6867 6665" $"6566 686A 6C6E 7072 7374 7474 7373 7374" $"7475 7677 7879 7B7C 7E80 8285 888A 8D90" $"9396 989A 9B9B 9B9A 9997 9592 8F8D 8A87" $"8583 8180 7F7F 7F80 8182 8487 898B 8D8E" $"8F8E 8E8D 8B89 8784 817E 7B78 7571 6E6C" $"6A68 6766 6667 686A 6C6E 7072 7374 7474" $"7474 7474 7475 7677 7879 7A7C 7E80 8284" $"878A 8C8F 9294 9698 9A9A 9A9A 9897 9592" $"908D 8A88 8583 8180 7F7E 7E7F 8081 8385" $"888A 8C8D 8E8E 8E8D 8C8A 8885 8380 7D79" $"7673 706D 6B69 6867 6767 6869 6B6D 6F71" $"7374 7474 7474 7474 7475 7677 7879 7A7B" $"7D7F 8183 8588 8B8E 9093 9596 9899 9999" $"9896 9492 8F8C 8987 8482 807F 7E7D 7D7E" $"7F80 8284 8689 8B8C 8D8E 8E8D 8C8A 8886" $"8481 7E7B 7875 726F 6D6B 6968 6867 6869" $"6A6C 6E70 7273 7474 7474 7474 7474 7576" $"7778 797B 7C7E 8082 8486 898C 8E91 9394" $"9697 9797 9695 9391 8E8B 8886 8381 7F7E" $"7D7C 7C7C 7D7E 8082 8587 898B 8C8D 8D8C" $"8B8A 8986 8482 7F7B 7976 7270 6D6B 6A69" $"6868 6868 6A6B 6D6F 7172 7374 7474 7473" $"7474 7475 7677 787A 7B7D 7F81 8385 878A" $"8C8E 9092 9495 9595 9594 928F 8D8B 8885" $"8381 7F7D 7C7B 7B7B 7C7D 7F81 8385 8789" $"8B8C 8C8C 8B8A 8987 8583 807D 7A77 7471" $"6F6D 6B69 6868 6868 696B 6C6E 7071 7373" $"7474 7474 7474 7475 7677 7879 7B7C 7E80" $"8284 8688 8B8D 8F91 9293 9494 9493 918F" $"8D8A 8785 8280 7E7D 7C7B 7B7B 7B7C 7E80" $"8284 8688 8A8B 8C8C 8B8A 8988 8684 817F" $"7C79 7673 706E 6C6B 6A69 6969 6A6B 6C6E" $"6F71 7273 7474 7474 7474 7575 7677 7879" $"7B7C 7E80 8284 8688 8A8C 8E90 9193 9393" $"9392 918F 8D8A 8885 8380 7E7D 7C7B 7A7A" $"7B7C 7D7F 8183 8688 898B 8C8C 8C8B 8A89" $"8785 8280 7E7B 7875 7270 6E6C 6B6A 6A6A" $"6A6B 6C6D 6F71 7273 7474 7575 7575 7576" $"7677 7879 7B7C 7E7F 8183 8587 898B 8D8F" $"9091 9292 9292 908F 8D8A 8785 8280 7E7D" $"7B7A 7A7A 7A7B 7C7E 8082 8587 898A 8B8C" $"8B8B 8A89 8886 8481 7F7C 7977 7471 6F6D" $"6C6B 6A6A 6A6B 6C6D 6E70 7173 7474 7575" $"7575 7576 7677 7879 7A7C 7D7F 8082 8486" $"888A 8C8D 8F90 9191 9190 8F8E 8C8A 8784" $"8280 7E7C 7B7A 7979 797A 7B7D 7F81 8385" $"8789 8A8A 8B8B 8A89 8886 8482 807D 7A77" $"7573 706E 6D6B 6A6A 6A6B 6B6C 6E6F 7072" $"7374 7475 7575 7575 7676 7778 7A7B 7C7E" $"7F81 8385 8789 8A8C 8D8E 8F90 908F 8E8D" $"8B89 8684 827F 7D7B 7A79 7878 7879 7A7C" $"7D7F 8284 8687 898A 8A8A 8A89 8886 8583" $"807E 7C79 7674 716F 6E6C 6B6B 6B6B 6B6C" $"6D6F 7071 7273 7474 7575 7575 7676 7778" $"797B 7C7D 7F81 8284 8688 898B 8C8D 8E8F" $"8F8E 8D8C 8B89 8684 827F 7D7B 7A79 7878" $"7879 797B 7D7E 8183 8587 8889 8A8A 8A89" $"8887 8584 827F 7D7B 7875 7371 6F6D 6C6C" $"6B6B 6C6C 6D6F 7071 7273 7475 7575 7676" $"7677 7878 7A7B 7C7E 7F81 8284 8687 898A" $"8C8D 8D8E 8E8E 8D8C 8B89 8784 8280 7E7C" $"7A79 7878 7879 797B 7C7E 8082 8486 8889" $"8A8A 8A8A 8988 8785 8381 7F7C 7A78 7573" $"716F 6E6D 6D6D 6D6D 6E6F 7071 7273 7475" $"7676 7677 7778 7879 7A7B 7C7E 7F81 8284" $"8587 888A 8B8C 8D8D 8D8D 8D8C 8A89 8784" $"8280 7E7C 7B79 7878 7878 797A 7C7D 7F81" $"8385 8788 898A 8A8A 8988 8786 8482 807E" $"7B79 7774 7271 6F6E 6E6D 6D6D 6E6F 7071" $"7273 7475 7676 7777 7778 7879 7A7B 7C7E" $"7F80 8283 8586 8889 8A8B 8C8C 8D8C 8C8B" $"8A88 8684 8280 7E7C 7A79 7878 7878 797A" $"7B7C 7E80 8284 8687 8889 8989 8988 8786" $"8583 817F 7D7A 7876 7472 706F 6E6E 6D6E" $"6E6F 6F70 7173 7475 7576 7777 7778 7879" $"7A7B 7C7D 7E80 8183 8485 8788 898A 8B8B" $"8B8B 8B8A 8987 8684 8280 7E7C 7A79 7877" $"7777 7879 7A7B 7D7F 8183 8586 8788 8989" $"8988 8786 8583 8280 7D7B 7977 7573 7170" $"6F6E 6E6E 6E6F 6F70 7172 7374 7576 7677" $"7778 7879 7A7B 7C7D 7E7F 8182 8385 8687" $"8889 8A8A 8B8B 8A89 8887 8584 8280 7E7C" $"7A79 7877 7777 7878 7A7B 7D7E 8082 8485" $"8788 8889 8988 8887 8684 8381 7F7D 7B78" $"7674 7371 706F 6F6F 6F6F 7070 7172 7374" $"7576 7777 7878 7979 7A7B 7C7D 7E7F 8182" $"8485 8687 8889 8A8A 8A8A 8A89 8887 8584" $"8280 7E7C 7B79 7878 7777 7879 7A7B 7C7E" $"8082 8485 8788 8889 8989 8888 8785 8482" $"807E 7C7A 7876 7573 7271 7070 7070 7071" $"7273 7475 7676 7778 7979 7A7A 7B7C 7C7D" $"7F80 8182 8485 8687 8889 8A8A 8A8A 8A89" $"8887 8684 8281 7F7D 7B7A 7978 7878 7879" $"7A7B 7C7E 8081 8385 8687 8889 8989 8988" $"8786 8583 8280 7E7C 7A78 7674 7372 7171" $"7171 7171 7273 7475 7676 7778 7979 7A7B" $"7B7C 7D7E 7F80 8182 8485 8687 8889 898A" $"8A8A 8989 8887 8584 8281 7F7D 7C7A 7978" $"7878 7878 797A 7C7D 7F81 8284 8587 8888" $"8989 8988 8787 8684 8281 7F7D 7B79 7776" $"7473 7271 7171 7171 7273 7374 7576 7778" $"7979 7A7A 7B7C 7C7D 7E7F 8182 8384 8586" $"8788 8889 8989 8888 8786 8583 8280 7E7D" $"7B7A 7978 7777 7778 797A 7B7C 7E80 8183" $"8486 8787 8888 8888 8787 8684 8381 807E" $"7C7A 7876 7574 7372 7171 7172 7273 7374" $"7576 7778 7879 7A7A 7B7C 7C7D 7E7F 8081" $"8384 8586 8787 8888 8888 8887 8686 8483" $"8280 7E7D 7B7A 7978 7877 7778 7879 7A7C" $"7D7F 8182 8485 8687 8888 8888 8887 8685" $"8482 817F 7D7B 7978 7675 7473 7272 7272" $"7273 7374 7576 7778 7879 7A7B 7B7C 7D7E" $"7E7F 8081 8384 8586 8687 8888 8888 8887" $"8685 8483 8280 7F7D 7C7B 7A79 7878 7878" $"7979 7A7C 7D7F 8082 8385 8687 8788 8888" $"8888 8786 8584 8280 7F7D 7B7A 7877 7574" $"7473 7373 7374 7475 7676 7778 797A 7B7C" $"7C7D 7E7E 7F80 8182 8384 8586 8787 8888" $"8888 8887 8786 8583 8281 7F7E 7C7B 7A79" $"7978 7878 797A 7B7C 7D7F 8082 8385 8687" $"8788 8888 8888 8887 8685 8382 807E 7D7B" $"7A78 7776 7574 7474 7474 7575 7677 7878" $"797A 7B7C 7D7D 7E7F 7F80 8182 8384 8586" $"8787 8888 8888 8887 8786 8583 8281 7F7E" $"7D7B 7B7A 7978 7879 797A 7A7C 7D7E 8081" $"8384 8586 8788 8888 8888 8887 8685 8483" $"817F 7E7C 7B79 7877 7675 7574 7475 7575" $"7677 7778 797A 7B7C 7C7D 7E7F 7F80 8182" $"8384 8585 8687 8788 8888 8787 8685 8483" $"8280 7F7E 7C7B 7A79 7978 7878 7979 7A7B" $"7C7D 7F80 8283 8485 8687 8788 8888 8787" $"8685 8483 8280 7E7D 7B7A 7877 7676 7575" $"7575 7575 7676 7778 7979 7A7B 7C7D 7E7E" $"7F80 8181 8283 8485 8686 8787 8787 8786" $"8685 8483 8180 7F7D 7C7B 7A79 7978 7878" $"7879 7A7B 7C7D 7E80 8182 8485 8586 8787" $"8787 8787 8686 8584 8281 7F7E 7C7B 7A78" $"7777 7675 7575 7576 7677 7778 797A 7A7B" $"7C7D 7E7F 7F80 8182 8283 8485 8686 8787" $"8787 8786 8685 8483 8180 7F7E 7D7B 7B7A" $"7979 7878 7979 7A7B 7C7D 7E7F 8182 8384" $"8586 8787 8787 8787 8786 8584 8382 817F" $"7E7C 7B7A 7978 7777 7676 7676 7777 7878" $"797A 7B7C 7D7E 7E7F 8081 8182 8384 8485" $"8686 8787 8787 8787 8685 8483 8281 807E" $"7D7C 7B7A 7A79 7979 797A 7A7B 7C7D 7E7F" $"8182 8384 8586 8787 8888 8888 8787 8685" $"8483 8281 7F7E 7C7B 7A79 7878 7777 7777" $"7778 7879 7A7A 7B7C 7D7E 7F7F 8081 8282" $"8384 8585 8687 8787 8787 8787 8685 8483" $"8281 807F 7E7C 7C7B 7A7A 7979 797A 7A7B" $"7C7D 7E7F 8082 8384 8586 8687 8788 8888" $"8887 8786 8584 8381 807F 7D7C 7B7A 7978" $"7878 7878 7878 7879 7A7A 7B7C 7D7E 7F7F" $"8081 8282 8384 8485 8686 8787 8787 8786" $"8685 8483 8281 807F 7D7C 7B7B 7A7A 7979" $"797A 7A7B 7B7C 7D7E 8081 8283 8485 8586" $"8787 8787 8787 8686 8584 8382 807F 7E7D" $"7B7A 7A79 7878 7878 7878 7879 797A 7B7B" $"7C7D 7E7F 8081 8182 8383 8485 8586 8686" $"8786 8686 8585 8483 8280 7F7E 7D7C 7B7B" $"7A79 7979 7979 7A7A 7B7C 7D7E 7F80 8182" $"8384 8585 8686 8787 8787 8686 8584 8382" $"8180 7F7D 7C7B 7A79 7978 7878 7878 7879" $"797A 7B7B 7C7D 7E7F 8081 8182 8383 8485" $"8586 8686 8686 8686 8585 8483 8281 807E" $"7D7C 7C7B 7A7A 7979 7979 7A7A 7B7C 7D7E" $"7F80 8182 8384 8485 8686 8787 8787 8786" $"8685 8483 8281 807E 7D7C 7B7A 7A79 7979" $"7979 7979 7A7A 7B7C 7C7D 7E7F 8081 8282" $"8384 8485 8686 8687 8787 8786 8685 8483" $"8281 807F 7E7D 7C7B 7B7A 7A7A 7A7A 7A7B" $"7B7C 7D7E 7F80 8182 8384 8485 8686 8787" $"8787 8787 8686 8584 8382 8180 7F7E 7C7C" $"7B7A 7A7A 7979 7A7A 7A7B 7B7C 7D7E 7F7F" $"8081 8283 8384 8585 8686 8787 8787 8786" $"8685 8484 8382 807F 7E7E 7D7C 7B7B 7B7A" $"7A7B 7B7B 7C7C 7D7E 7F80 8182 8383 8485" $"8686 8687 8787 8787 8686 8585 8483 8280" $"7F7E 7D7C 7C7B 7B7A 7A7A 7A7A 7B7B 7B7C" $"7D7E 7E7F 8081 8283 8384 8585 8686 8687" $"8787 8786 8685 8483 8382 807F 7F7E 7D7C" $"7B7B 7B7A 7A7A 7B7B 7B7C 7D7E 7E7F 8081" $"8283 8484 8585 8686 8687 8786 8686 8584" $"8483 8281 807F 7E7D 7C7B 7B7A 7A7A 7A7A" $"7A7B 7B7C 7C7D 7E7F 8080 8182 8383 8485" $"8586 8686 8686 8686 8585 8483 8281 807F" $"7E7D 7C7C 7B7B 7A7A 7A7A 7A7B 7B7C 7C7D" $"7E7F 7F80 8182 8383 8485 8585 8686 8686" $"8686 8585 8483 8281 807F 7E7D 7C7C 7B7B" $"7A7A 7A7A 7A7B 7B7B 7C7D 7E7E 7F80 8182" $"8283 8484 8585 8686 8686 8686 8585 8483" $"8281 807F 7E7E 7D7C 7B7B 7B7A 7A7A 7A7B" $"7B7C 7C7D 7E7E 7F80 8182 8283 8484 8585" $"8686 8686 8686 8585 8483 8382 8180 7F7E" $"7D7C 7C7B 7B7B 7B7B 7B7B 7B7C 7C7D 7E7F" $"7F80 8182 8383 8484 8585 8686 8686 8686" $"8585 8483 8382 8180 7F7E 7D7D 7C7C 7B7B" $"7B7B 7B7B 7C7C 7D7D 7E7F 7F80 8182 8283" $"8484 8585 8686 8686 8686 8685 8584 8383" $"8281 807F 7E7D 7D7C 7C7C 7B7B 7C7C 7C7C" $"7D7D 7E7F 8080 8182 8384 8485 8586 8686" $"8686 8686 8685 8584 8382 8180 7F7F 7E7D" $"7C7C 7C7B 7B7B 7B7C 7C7C 7D7D 7E7F 7F80" $"8182 8283 8484 8585 8686 8686 8686 8686" $"8585 8483 8281 8180 7F7E 7E7D 7C7C 7C7C" $"7C7C 7C7D 7D7E 7E7F 8080 8182 8383 8485" $"8586 8686 8686 8686 8685 8584 8382 8180" $"807F 7E7D 7D7C 7C7C 7B7B 7C7C 7C7C 7D7D" $"7E7F 7F80 8181 8282 8384 8485 8585 8686" $"8686 8686 8585 8483 8382 8180 7F7E 7E7D" $"7D7C 7C7C 7C7C 7C7C 7D7D 7E7E 7F80 8181" $"8283 8384 8585 8586 8686 8685 8585 8483" $"8382 8180 7F7E 7E7D 7C7C 7C7B 7B7B 7B7B" $"7C7C 7C7D 7D7E 7F7F 8080 8182 8283 8384" $"8485 8585 8585 8585 8584 8483 8282 8180" $"7F7F 7E7D 7D7C 7C7C 7C7C 7C7C 7C7D 7D7E" $"7F7F 8081 8282 8384 8485 8585 8585 8585" $"8584 8483 8382 8180 7F7E 7E7D 7C7C 7C7B" $"7B7B 7B7B 7C7C 7C7D 7D7E 7E7F 8080 8181" $"8282 8383 8484 8585 8585 8585 8585 8483" $"8382 8181 807F 7E7E 7D7D 7C7C 7C7C 7C7C" $"7D7D 7E7E 7F7F 8081 8182 8383 8484 8585" $"8585 8585 8584 8483 8382 8180 807F 7E7D" $"7D7C 7C7C 7C7C 7C7C 7C7C 7D7D 7E7E 7F7F" $"8080 8181 8283 8384 8484 8585 8585 8685" $"8585 8584 8483 8281 8180 7F7F 7E7E 7D7D" $"7D7D 7D7D 7D7E 7E7F 7F80 8081 8282 8384" $"8485 8585 8686 8685 8585 8484 8382 8281" $"807F 7F7E 7D7D 7D7C 7C7C 7C7C 7C7D 7D7D" $"7E7E 7F7F 8080 8181 8282 8383 8484 8585" $"8585 8686 8585 8584 8483 8382 8181 807F" $"7F7E 7E7E 7D7D 7D7D 7E7E 7E7F 7F80 8081" $"8282 8384 8485 8585 8686 8685 8585 8484" $"8383 8281 8080 7F7E 7E7D 7D7D 7C7C 7C7C" $"7D7D 7D7D 7E7E 7F7F 8080 8181 8282 8383" $"8384 8485 8585 8585 8585 8585 8484 8382" $"8281 8080 7F7E 7E7E 7D7D 7D7D 7D7E 7E7E" $"7F7F 8081 8182 8383 8484 8485 8585 8585" $"8584 8483 8382 8181 807F 7F7E 7D7D 7C7C" $"7C7C 7C7C 7C7C 7D7D 7D7E 7E7F 7F80 8080" $"8181 8282 8383 8384 8484 8485 8585 8484" $"8483 8382 8181 8080 7F7E 7E7E 7D7D 7D7D" $"7D7D 7E7E 7E7F 7F80 8181 8282 8384 8484" $"8485 8584 8484 8483 8382 8181 807F 7E7E" $"7D7D 7C7C 7C7C 7C7C 7C7C 7C7D 7D7D 7E7E" $"7F7F 8080 8181 8182 8283 8383 8484 8484" $"8484 8484 8483 8382 8281 8180 7F7F 7E7E" $"7E7D 7D7D 7D7D 7E7E 7E7F 7F80 8081 8282" $"8383 8484 8484 8584 8484 8483 8382 8181" $"807F 7F7E 7E7D 7D7C 7C7C 7C7C 7C7C 7D7D" $"7D7E 7E7E 7F7F 8080 8081 8182 8283 8383" $"8484 8484 8585 8484 8484 8383 8282 8181" $"8080 7F7F 7E7E 7E7E 7E7E 7E7E 7F7F 8080" $"8181 8283 8384 8484 8585 8585 8584 8484" $"8383 8281 8180 7F7F 7E7E 7D7D 7D7D 7D7D" $"7D7D 7D7D 7E7E 7E7F 7F7F 8080 8181 8282" $"8283 8383 8484 8485 8585 8585 8484 8483" $"8382 8281 8180 807F 7F7F 7E7E 7E7E 7F7F" $"7F7F 8080 8181 8283 8384 8484 8585 8585" $"8584 8484 8383 8281 8180 807F 7E7E 7E7D" $"7D7D 7D7D 7D7D 7D7D 7E7E 7E7F 7F7F 8080" $"8181 8182 8282 8383 8384 8484 8485 8585" $"8484 8483 8383 8281 8180 8080 7F7F 7F7F" $"7E7E 7E7F 7F7F 8080 8181 8282 8383 8484" $"8484 8484 8484 8483 8382 8281 8180 7F7F" $"7E7E 7D7D 7D7D 7D7C 7D7D 7D7D 7D7D 7E7E" $"7E7F 7F7F 8080 8181 8182 8282 8383 8384" $"8484 8484 8484 8383 8382 8281 8180 807F" $"7F7F 7E7E 7E7E 7E7E 7E7F 7F80 8080 8181" $"8282 8383 8484 8484 8484 8383 8382 8181" $"8080 7F7E 7E7E 7D7D 7D7C 7C7C 7C7C 7D7D" $"7D7D 7D7E 7E7E 7F7F 8080 8080 8181 8282" $"8283 8383 8383 8484 8483 8383 8382 8281" $"8180 807F 7F7F 7F7E 7E7E 7E7E 7F7F 7F80" $"8080 8181 8282 8383 8384 8484 8483 8383" $"8282 8181 8080 7F7F 7E7E 7D7D 7D7D 7C7C" $"7C7D 7D7D 7D7D 7E7E 7E7E 7F7F 7F80 8080" $"8181 8182 8282 8383 8383 8484 8484 8383" $"8382 8282 8181 8080 807F 7F7F 7F7F 7F7F" $"7F7F 7F80 8081 8182 8282 8383 8484 8484" $"8484 8483 8382 8281 8180 807F 7F7E 7E7E" $"7D7D 7D7D 7D7D 7D7D 7D7E 7E7E 7F7F 7F7F" $"8080 8081 8181 8282 8283 8383 8384 8484" $"8484 8484 8383 8382 8281 8181 8080 807F" $"7F7F 7F7F 7F7F 8080 8081 8182 8283 8383" $"8484 8484 8484 8483 8383 8282 8181 8080" $"7F7F 7E7E 7E7D 7D7D 7D7D 7D7E 7E7E 7E7E" $"7F7F 7F7F 8080 8081 8181 8182 8282 8383" $"8383 8484 8484 8484 8383 8382 8282 8181" $"8080 8080 7F7F 7F7F 7F7F 8080 8081 8181" $"8282 8383 8384 8484 8484 8483 8383 8282" $"8181 8080 7F7F 7E7E 7E7D 7D7D 7D7D 7D7D" $"7E7E 7E7E 7E7E 7F7F 7F80 8080 8081 8181" $"8182 8282 8283 8383 8383 8383 8383 8282" $"8281 8181 8080 807F 7F7F 7F7F 7F7F 7F7F" $"8080 8081 8182 8282 8383 8383 8383 8383" $"8282 8281 8180 807F 7F7E 7E7E 7D7D 7D7D" $"7D7D 7D7D 7D7D 7D7E 7E7E 7E7F 7F7F 7F80" $"8080 8081 8181 8182 8282 8283 8383 8383" $"8382 8282 8281 8180 8080 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F80 8080 8181 8282 8283 8383" $"8383 8383 8282 8281 8180 807F 7F7E 7E7E" $"7D7D 7D7D 7D7D 7D7D 7D7D 7D7E 7E7E 7E7F" $"7F7F 7F7F 8080 8080 8181 8181 8282 8282" $"8383 8383 8383 8282 8281 8181 8080 8080" $"7F7F 7F7F 7F7F 7F7F 8080 8081 8181 8282" $"8283 8383 8383 8383 8382 8281 8181 8080" $"7F7F 7F7E 7E7E 7E7D 7D7D 7D7E 7E7E 7E7E" $"7E7E 7F7F 7F7F 8080 8080 8081 8181 8182" $"8282 8283 8383 8383 8383 8383 8282 8281" $"8181 8080 8080 807F 8080 8080 8080 8181" $"8182 8282 8383 8383 8383 8383 8383 8282" $"8181 8080 807F 7F7F 7E7E 7E7E 7E7E 7E7E" $"7E7E 7E7E 7E7F 7F7F 7F7F 8080 8080 8081" $"8181 8182 8282 8283 8383 8383 8383 8383" $"8282 8282 8181 8180 8080 8080 8080 8080" $"8080 8081 8182 8282 8283 8383 8383 8383" $"8382 8282 8181 8080 807F 7F7F 7E7E 7E7E" $"7E7E 7E7E 7E7E 7E7E 7E7E 7F7F 7F7F 7F80" $"8080 8080 8081 8181 8282 8282 8282 8383" $"8383 8282 8282 8281 8181 8080 8080 7F7F" $"7F7F 7F7F 8080 8080 8181 8181 8282 8282" $"8382 8282 8282 8281 8180 8080 7F7F 7F7E" $"7E7E 7E7D 7D7D 7D7D 7D7D 7E7E 7E7E 7E7E" $"7E7F 7F7F 7F7F 8080 8080 8081 8181 8181" $"8282 8282 8282 8282 8282 8181 8180 8080" $"807F 7F7F 7F7F 7F7F 7F7F 8080 8081 8181" $"8182 8282 8282 8282 8282 8181 8180 8080" $"7F7F 7E7E 7E7E 7E7D 7D7D 7D7D 7D7E 7E7E" $"7E7E 7E7E 7E7F 7F7F 7F7F 7F80 8080 8080" $"8181 8181 8282 8282 8282 8282 8282 8181" $"8181 8080 8080 7F7F 7F7F 7F7F 7F7F 8080" $"8080 8181 8182 8282 8282 8282 8282 8281" $"8181 8080 7F7F 7F7F 7E7E 7E7E 7E7E 7E7E" $"7E7E 7E7E 7E7E 7F7F 7F7F 7F7F 7F80 8080" $"8080 8181 8181 8182 8282 8282 8282 8282" $"8282 8282 8181 8181 8080 8080 8080 8080" $"8080 8080 8181 8181 8282 8282 8282 8382" $"8282 8282 8181 8180 8080 7F7F 7F7F 7E7E" $"7E7E 7E7E 7E7E 7E7E 7F7F 7F7F 7F7F 7F80" $"8080 8080 8080 8181 8181 8182 8282 8282" $"8282 8282 8282 8282 8281 8181 8181 8080" $"8080 8080 8080 8080 8181 8181 8282 8282" $"8282 8282 8282 8282 8181 8180 8080 7F7F" $"7F7F 7E7E 7E7E 7E7E 7E7E 7E7E 7E7F 7F7F" $"7F7F 7F7F 8080 8080 8080 8081 8181 8181" $"8282 8282 8282 8282 8282 8282 8181 8181" $"8180 8080 8080 8080 8080 8080 8080 8181" $"8181 8182 8282 8282 8282 8181 8181 8080" $"7F7F 7F7F 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E" $"7E7E 7E7E 7F7F 7F7F 7F7F 7F7F 7F80 8080" $"8080 8081 8181 8181 8182 8282 8282 8181" $"8181 8180 8080 8080 7F7F 7F7F 7F7F 7F80" $"8080 8080 8181 8181 8181 8181 8181 8181" $"8180 8080 7F7F 7F7E 7E7E 7E7E 7E7E 7E7E" $"7E7E 7E7E 7E7E 7E7E 7E7E 7F7F 7F7F 7F7F" $"7F7F 8080 8080 8081 8181 8181 8181 8182" $"8281 8181 8181 8180 8080 8080 807F 7F7F" $"7F7F 7F80 8080 8080 8181 8181 8181 8181" $"8181 8181 8180 8080 807F 7F7F 7E7E 7E7E" $"7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7F 7F7F" $"7F7F 7F7F 7F80 8080 8080 8081 8181 8181" $"8282 8282 8282 8282 8281 8181 8181 8080" $"8080 8080 8080 8080 8080 8181 8181 8181" $"8282 8282 8282 8181 8181 8080 8080 7F7F" $"7F7F 7F7E 7E7E 7E7E 7E7E 7E7E 7F7F 7F7F" $"7F7F 7F7F 7F80 8080 8080 8080 8080 8181" $"8181 8182 8282 8282 8282 8282 8282 8281" $"8181 8181 8080 8080 8080 8080 8081 8181" $"8181 8182 8282 8282 8282 8281 8181 8180" $"8080 807F 7F7F 7F7F 7F7E 7E7E 7E7E 7E7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 8080 8080 8080" $"8080 8081 8181 8181 8282 8282 8282 8282" $"8282 8181 8181 8181 8080 8080 8080 8080" $"8080 8081 8181 8181 8181 8181 8181 8181" $"8181 8080 8080 7F7F 7F7F 7E7E 7E7E 7E7E" $"7E7E 7E7E 7E7E 7E7E 7E7E 7F7F 7F7F 7F7F" $"7F7F 7F80 8080 8080 8080 8181 8181 8181" $"8181 8181 8181 8181 8181 8080 8080 8080" $"8080 8080 8080 8080 8080 8081 8181 8181" $"8181 8180 8080 8080 7F7F 7F7F 7F7E 7E7E" $"7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E" $"7F7F 7F7F 7F7F 7F7F 7F80 8080 8080 8080" $"8181 8181 8181 8181 8181 8181 8180 8080" $"8080 8080 8080 8080 8080 8080 8080 8081" $"8181 8181 8181 8181 8080 8080 7F7F 7F7F" $"7F7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E" $"7E7E 7E7F 7F7F 7F7F 7F7F 7F7F 7F80 8080" $"8080 8081 8181 8181 8181 8181 8181 8181" $"8181 8181 8080 8080 8080 8080 8080 8080" $"8181 8181 8181 8181 8181 8181 8181 8080" $"8080 807F 7F7F 7F7F 7F7E 7F7E 7E7E 7E7E" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F80 8080" $"8080 8080 8080 8181 8181 8181 8182 8282" $"8282 8281 8181 8181 8181 8180 8080 8080" $"8080 8181 8181 8181 8181 8181 8181 8181" $"8181 8180 8080 8080 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F80 8080 8080 8080 8080 8181 8181 8181" $"8181 8282 8281 8281 8181 8181 8181 8180" $"8080 8080 8080 8081 8181 8181 8181 8181" $"8181 8181 8181 8080 8080 807F 7F7F 7F7F" $"7F7F 7E7E 7E7E 7E7E 7E7E 7E7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F80 8080 8080" $"8080 8181 8181 8181 8181 8181 8181 8181" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8081 8181 8181 8080 8080 8080 807F 7F7F" $"7F7F 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E" $"7E7E 7E7E 7E7E 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 8080 8080 8080 8081 8181 8181 8181" $"8181 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8180 8080 8080 8080" $"807F 7F7F 7F7F 7F7E 7E7E 7E7E 7E7E 7E7E" $"7E7E 7E7E 7E7E 7E7E 7E7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 8080 8080 8080 8081 8181" $"8181 8181 8181 8181 8180 8080 8080 8080" $"8080 8080 8080 8080 8181 8181 8181 8181" $"8180 8080 8080 8080 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 8080 8080 8080 8080 8081" $"8181 8181 8181 8181 8181 8181 8181 8181" $"8181 8080 8080 8081 8181 8181 8181 8181" $"8181 8181 8181 8180 8080 8080 807F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 8080 8080 8080 8080" $"8080 8081 8181 8181 8181 8181 8181 8181" $"8181 8181 8181 8080 8080 8081 8181 8181" $"8181 8181 8181 8181 8181 8080 8080 8080" $"807F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"8080 8080 8080 8080 8080 8081 8181 8181" $"8181 8181 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 7F7F 7F7F 7F7F 7F7F 7F7E 7E7E 7E7E" $"7E7E 7E7E 7E7E 7E7E 7E7E 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F80 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 807F 7F7F 7F7F 7F7F 7F7F 7F7E" $"7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F80 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 807F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 8080" $"8080 8080 8080 8080 8181 8181 8181 8181" $"8181 8181 8180 8080 8080 8080 8080 8081" $"8181 8181 8181 8181 8181 8080 8080 8080" $"8080 807F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F80 8080" $"8080 8080 8080 8080 8080 8181 8181 8181" $"8181 8181 8181 8181 8181 8181 8080 8080" $"8080 8181 8181 8181 8181 8181 8180 8080" $"8080 8080 8080 807F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 8080 8080 8080 8080 8080 8080" $"8080 8181 8181 8181 8181 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7E 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F80 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 807F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 8080 8080 8080 8080 8080 8080" $"8180 8181 8181 8180 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 807F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F80" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8181 8181 8181 8181 8181 8181 8181" $"8181 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F80 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8081 8181 8181 8181" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 807F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F80 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 807F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 807F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F80 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8181 8181 8181" $"8181 8181 8181 8181 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F80 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8181 8181 8181 8181 8181 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F80 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 807F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F80 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"807F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 8080 8080 8080" $"8080 8080 8080" } }; resource 'snd ' (11588, "Frost Horn", purgeable) { FormatOne { { /* array Synthesizers: 1 elements */ /* [1] */ sampledSynth, 160 } }, { /* array SoundCmnds: 1 elements */ /* [1] */ hasData, bufferCmd { 20 } }, { /* array DataTables: 1 elements */ /* [1] */ 10262, Rate22K, 10260, 10261, 0x0, 0x3C, $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 807F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"807F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 8080 8080 8080 8081 8182" $"8384 8586 8789 8A8B 8D95 A1A9 A8A8 B0B7" $"BBBF BDB3 A7A5 B0C2 D5E4 ECF1 F2F0 EAE0" $"D3C7 BBAF A49C 968F 8888 9DC3 DFE5 DEE2" $"F4FF FCFA F8E9 D4BF AC9F 9892 8C86 817B" $"7979 797A 829B C4E6 F5F1 E1C9 B7B5 C1CF" $"D3CF C6B7 A6A7 C2DB D7C3 AF99 7E69 5A52" $"515A 7298 BFD8 E0DA CEBF B1AD B4B9 B7B2" $"B2B6 B8B5 AEA6 9989 745E 4C43 4C6B 94B3" $"BAAB 9277 5E4B 4B5A 6A72 797F 7F78 6C64" $"605E 5D5F 6261 5D57 565F 7694 ACB2 A28B" $"828E A8C2 D8E5 E1D6 D0C9 BCB1 ACAB ABA9" $"A7A2 998E 8A9A BAD7 E2DE CFBB A594 94A3" $"AFAF A79C 8E7D 7B92 AFB7 B0A7 9477 5C46" $"383E 5675 8C99 9D9C 9FA2 9E96 9089 7E72" $"6A69 6F73 716B 6156 5153 5A68 88BA E3F1" $"EDDC C0A7 9FA2 ABB8 C0BF BBBB BCBC BDBE" $"BBB3 A698 8A7D 7163 5650 5763 6C6C 604A" $"3431 4865 7274 7467 533F 2B18 0E0E 1621" $"292D 2D2C 3045 6683 8E87 7561 5148 4D5E" $"6E73 716C 6355 474A 5960 5446 382C 292F" $"3E5C 7E93 978E 7B64 565E 768E 9CA3 A097" $"8F8A 8682 7E77 6C5D 4B37 261E 2B51 7E9B" $"A7A3 907C 6854 4A4F 5E6F 7D89 897D 6D60" $"5B5A 5B5E 6163 605C 5F6E 818E 979E 9C90" $"827E 90A8 B0AB A498 897E 766D 645A 504C" $"4B4A 4740 3E4A 6278 8281 776E 6863 6266" $"6964 594E 4235 2D32 475C 6363 5D4D 3B30" $"3043 5F77 878C 8984 8999 ABB7 BBBD BAAF" $"9E8D 817D 8088 949F A095 8477 7E9C B9C5" $"C5BC AD9F 948A 827E 7971 6A67 686D 747E" $"878A 857C 7062 5657 6B87 999B 8E77 5D4A" $"4252 7DA6 B5B1 A184 6349 3B3A 4148 4E54" $"5859 5554 5C6D 7E85 8074 6A69 6E70 7273" $"716C 6662 6260 5E5F 6A76 7E83 8785 7F7D" $"8499 B1C0 BFB2 A5A2 A9B1 B6B5 B2AF ABA2" $"9486 7C76 7472 716E 675A 4E48 557C A9BF" $"BCAB 937D 706E 7785 8E8F 877A 6B5D 575E" $"6B73 7066 5849 3E3F 5070 8990 897C 6D5E" $"5152 6A88 9695 918A 8079 726A 635B 544E" $"4B4B 4E54 6377 8182 7F79 716B 645E 5851" $"483E 342B 2522 273E 637C 7F75 6147 2E23" $"2D4A 6879 7C76 6D64 5F63 7280 8582 7D76" $"6E65 5F5D 5B57 524E 463B 3134 517E A2B5" $"B6A9 9B96 9390 8E8B 8276 6963 6467 696D" $"7478 705F 4A38 3345 6580 8C8C 857C 757B" $"93A4 9D8A 7967 5953 5257 5D60 5F5B 544B" $"4854 6A7D 8683 7567 6166 6F77 7C7D 786D" $"605B 688C B4CC D1C5 A98D 7D82 9CB9 C6C2" $"B3A2 9792 939B A19F 9990 8A87 8481 7E76" $"695B 534D 433C 4665 8490 8B7E 6D62 6169" $"7173 7272 7274 7A81 8480 7B7A 7C7E 7D7C" $"869C ADAF A18B 7365 6777 98B7 C0B6 A590" $"7D6C 5A4B 474B 4E4E 4C48 4656 7BA1 B7B7" $"A88E 7562 5B60 676D 747A 776B 6063 778C" $"9391 8269 5757 687D 8B8B 8072 6B6C 747F" $"8587 8582 848D 9BA5 A9A4 9785 7770 707E" $"A1C9 E1E4 D8C3 AC9D 999E A6A6 A099 9592" $"908E 8B86 7F7C 7B76 6956 4646 5566 6B68" $"5C4A 3832 4567 7876 6E5F 4E41 362B 2A34" $"444E 4F47 3F46 607C 8988 7F73 6A66 6768" $"665F 564D 4540 404E 6B7E 7E75 6854 4343" $"597B 9196 8F82 746F 7580 878D 918F 877D" $"7268 5E58 575B 5C54 473A 364B 7291 9C97" $"8777 6F6C 6C6E 7070 7071 6F69 605A 5450" $"525A 6268 7287 9EA4 9985 6E59 4E4E 6284" $"9B9E 998C 7F7B 7D7E 8186 8885 8381 828C" $"9CA8 A9A3 9687 7B6F 635B 5857 5551 4C48" $"4344 5165 7175 7066 5E61 7087 9AA6 A8A5" $"A2A0 9FA5 ABAB A6A0 9991 8C8A 8781 7871" $"6E6D 6C74 90BC DEE9 E5D5 BCA6 9A99 A5B2" $"B8B4 ACA7 A6A6 A5A3 9F95 8572 5F4E 4549" $"5E75 817D 6E5A 4942 4D69 8185 8175 6355" $"5051 575D 646B 7376 7475 7F8C 908D 8372" $"6159 5C65 6E76 7774 6E6B 6D79 91A7 AA9D" $"8A72 5E56 5D72 8FA5 AFB0 ADA9 A6A5 A4A2" $"9E9B 9893 897F 7670 6E71 797F 7D75 7082" $"A7C2 C9C4 B39C 8D87 878D 969B 9A93 8B80" $"7262 544C 4A4D 5157 5A5C 677D 9094 8B7C" $"6B62 6882 9CA4 9F97 8C80 7A77 787B 7B76" $"6C62 574C 4752 6A7D 827B 6D5B 493D 3B43" $"4D53 5551 483C 3948 5A5F 5D56 493E 3A40" $"5576 929D 998C 817C 7B7E 8182 8184 8C93" $"9491 8B83 796E 6254 4A4A 5F85 A3AB A592" $"7B6A 6363 686C 6C6A 6C72 7778 756F 6967" $"6A6D 6A65 626D 8497 9B94 8573 6466 7E97" $"9F9A 8B73 5E51 4C4F 5963 6665 6460 5D61" $"7596 B3BE B8A8 9484 7C82 929F A29B 928B" $"92AF CED9 D1BE A38A 7871 7FA0 C0CF D0CA" $"C2BF C3C6 C4BB AFA0 9082 7670 6D6F 7578" $"756D 6256 505D 7A8F 9285 6E56 4848 5365" $"798A 9396 938D 8580 7F80 7C74 685A 4B43" $"4F6B 8591 8D7C 665A 6585 A1AC ABA0 8C78" $"6A64 6569 6D72 7675 6F67 6167 757E 7E78" $"7373 7576 746E 655C 5653 535D 7384 8379" $"6F63 5C5B 5E6A 8098 A8AD A69A 9496 9CA3" $"A9AE B2B3 B3B1 AEAC ADB2 B5AF A18F 848F" $"B1D2 E1DF D0BD B0A9 A8AB AFB0 AEAC A8A1" $"988F 867F 756C 645E 574E 4950 606B 6B60" $"4E3C 3B52 7281 7E74 6252 4C4C 5158 5C59" $"5045 3B32 2C2A 3244 5C6C 7067 594E 4D57" $"6570 7067 594C 4A5C 7B8F 9495 9084 7665" $"5248 5576 96A7 ADA9 9F95 8C84 7E78 6F66" $"5D57 514A 4440 4042 4647 4444 516B 8A9F" $"A396 8272 6E77 8899 A5AB A8A1 9C9C 9FA2" $"A3A2 9D96 8D83 776A 697D 9BAC AA9A 8374" $"81A0 B3B5 AD9C 8572 6461 6A75 7877 7C82" $"8581 7971 707B 878B 857A 6E69 6D75 7C83" $"847E 7467 6370 8184 7D7A 746C 6866 656B" $"7D99 AFB9 B7AF AAAB B1B9 BFBD B3A5 978B" $"8381 8387 8984 7969 5B5A 6E91 B4C5 C0B0" $"9D8B 7E7B 8189 8D8D 8982 786E 665F 5A54" $"504C 4947 4644 4245 4F59 5C58 5255 677D" $"8B90 8E80 716D 7076 7D80 7F7C 7A7A 7A77" $"7578 87A0 B9C6 C4B7 A9A3 A5AA B0B1 AA9C" $"8C83 8CA1 AFB4 B7AE 9C8B 7D71 6E77 8EA8" $"B8B9 B2AA A7A7 A9AD ADA6 9C92 8B87 888C" $"9193 8F83 7261 5961 7289 9EA7 A098 918C" $"8E95 9A9C 9C99 938D 8681 7C76 6E67 6462" $"5F5A 5145 3D44 596A 6D65 5D64 7A8B 9091" $"8C7E 6F62 5956 5858 5450 5154 554F 4336" $"374A 616C 6C68 615C 5D65 6F76 7367 574F" $"5B71 7A77 7165 574F 4D4D 4E55 6881 949B" $"978D 837C 7878 7B7F 817F 7B79 797A 7C7E" $"7D77 706D 7786 8D92 9C9F 9790 8C89 8E97" $"9FA2 A29F 9A94 8F8A 8580 7970 6558 4A40" $"3B3A 4154 7083 8679 696A 7B8C 98A1 A097" $"8F88 817F 7D78 7473 7577 7775 706C 738C" $"AABB BDB5 A798 8B81 7F80 7F77 6C67 7085" $"959C 9F98 8676 6D67 656E 82A0 BBCA CCC2" $"B4A6 9F9E A3A7 A49B 9088 8588 8C8C 867C" $"6F61 575A 6A7D 90A7 B8B7 AC9E 8C7C 7576" $"7E88 8F8F 8980 7872 6D6A 6867 6562 5E59" $"524D 5365 7C8B 8F8D 92A3 B1B0 AAA0 9083" $"8082 878E 918F 8A86 8280 7D78 716D 707B" $"8383 7E77 7170 7680 888C 897E 6F69 7180" $"8789 8983 7A75 726F 6E71 7D95 B2C8 D3CF" $"C1B1 A6A2 A7B4 C1C6 C3B9 ADA2 968A 7F78" $"726D 6F82 99A5 ADBA BDB3 A99F 9794 9597" $"9B9F A09D 9893 8C83 7C74 6A60 5447 3F3B" $"393B 465C 6F71 6658 515B 6768 6460 554B" $"4644 4549 4B4A 4746 4749 4A4A 4948 5067" $"7F8C 8B7F 6E5D 514F 5866 737B 808C 9EA6" $"9F95 8C80 7369 5E55 5054 6685 A1AE AB9F" $"9084 7E7E 8081 7E77 716C 6966 605A 5652" $"4C47 4A58 6975 859B A5A1 988A 7C76 787D" $"858E 9599 9B9D 9D99 918A 847F 7A73 6A61" $"5C5F 708E A9B6 B6B2 B8C1 C1BA B6AE A49C" $"9690 8D8B 8988 8988 847E 776F 6662 6B81" $"959C 9687 7464 5C5C 656D 6F66 5C5E 6F7F" $"8484 7F72 6661 6163 6873 8BAC C7D2 CDC0" $"B5B0 AFB2 B7BA B6AD A49B 9289 8079 7677" $"777A 8696 9B95 98A2 A49F 9A92 8A85 8485" $"8787 857F 7873 6C63 5850 4B4A 4C4E 4F4E" $"4D4F 5A69 7270 6964 6B7A 8389 8F90 8F8F" $"8C87 807A 7471 7274 787C 7F7F 7F89 A0BB" $"CDD1 C9B8 A8A1 A3AC B2B1 A9A1 A6BB CDCD" $"C5B9 A794 8881 7E7F 838E A5BA C0B9 AC9D" $"9490 9192 918E 877E 7976 726B 645F 5E5E" $"616E 889C 9D99 9EA0 9C99 958E 8B89 898A" $"8A88 878A 8D8D 8983 7C76 6E66 5A4B 3C2E" $"262D 4564 787B 797D 8686 817F 7C75 6C62" $"564D 4948 4A50 5658 5651 483F 3C48 5F75" $"7D7A 6F62 5956 575C 605E 5A60 7793 9E9A" $"9180 6B5F 5B59 585A 6478 93A9 B3B4 B0AA" $"A39E 9C9B 9993 8C84 7F7C 7B7C 7F83 8481" $"818A 9797 9196 9F9E 9893 8C87 8689 9098" $"9D9A 8F81 7264 5A58 5B5F 605D 5850 453C" $"3C4D 687E 8788 91A2 ABA7 A19B 9086 7F76" $"706E 6E6F 7275 787D 8180 786E 6A76 8A97" $"9992 867E 7E82 888B 8880 7677 899B 9D96" $"8F84 7973 706E 6D6C 7488 9FAC ABA2 9486" $"7F7F 8894 9DA1 A29E 958A 7E75 6E67 605D" $"616E 7A82 8E9F A6A8 ABA6 9B94 8F8B 8A8A" $"8A89 8A8B 8E90 908D 867E 756F 6D6C 6A6B" $"737E 8585 8287 9BB0 B8B8 B4A5 907E 6E65" $"6469 7077 7D7E 7D7B 7671 6E73 849D AEB4" $"AFA4 9689 7C71 6A66 6260 687F 99A5 A39A" $"8977 6F70 7376 7980 91A6 B7BF C1BF BEBC" $"B7B2 ABA4 9D94 8C87 8687 8A8D 8E8B 8684" $"8C97 9DA3 A9A7 9E97 8E87 8382 8284 8787" $"8077 6D63 5A52 4E4A 4644 403B 332D 2D38" $"4C5A 5D59 5A69 808B 8A87 7E70 655E 595A" $"5E63 696D 7172 716C 6156 5361 7A8D 9493" $"8D87 8482 807E 7970 6A6D 8199 A099 8F82" $"7061 5750 4F55 6683 9EAB AA9F 9288 827F" $"7F83 8786 8179 6F63 5548 4143 4749 4B54" $"616D 7B8D 9694 918D 857F 7C7A 7979 7775" $"7577 7877 746F 6B69 6867 6563 6269 7A91" $"A1A2 9788 8799 ACB1 B0AA 9D93 8E8C 8C8D" $"8D8C 8983 7B6F 6358 5359 6D86 99A0 9C91" $"857F 8087 8E91 8D86 828D A6BB BDB3 A692" $"7F73 6D6B 758B ABC4 CDC9 BCAF A7A5 A8AC" $"ADAA A49E 9B9B 9B99 948B 7E70 6258 596B" $"89A9 BEC1 B6A8 998A 8180 8182 827E 776E" $"6865 6465 6462 5F59 5450 4C4A 5060 737E" $"7F76 6963 6F87 989D 9A8A 7569 6567 6F78" $"7D81 8588 8883 7F80 8DA6 BFCB C8B9 A595" $"8D8D 9399 9D9D 9690 94A7 BBBE B09F 8B76" $"6966 6872 87A2 B2B3 ABA0 958F 8E90 9190" $"8C88 8482 8181 8385 8580 7566 5752 5E7D" $"9EB2 B8AF 9E8C 7B70 6F77 828D 9496 9490" $"8B84 7C71 6963 5E59 534F 4F59 6E82 8987" $"7F73 6E79 8D96 948C 8070 635C 5958 5753" $"4D46 3F3B 3838 4055 6F7F 8078 6C5F 5651" $"5051 514F 4A46 454F 6887 9897 8E80 6C5C" $"5351 5D76 93A6 ACA8 9D91 867F 7D82 898F" $"918E 8984 7E79 7777 7877 736E 686B 819F" $"B4BC B8AA 9A8D 837D 7C7E 848A 8D8C 8A89" $"8887 827B 7269 605A 5758 647B 919A 9381" $"6C60 6987 A6B4 B5AC 9884 7569 656A 7074" $"7676 746F 696C 809D B4C1 C3BC B3AC A9AA" $"ABAA A69F 988F 888C 9EAB A597 8A77 6258" $"5965 7E98 A8AA A6A0 9A96 928F 8C88 837E" $"7976 7578 7D81 8382 7D73 675C 5C73 98B3" $"BDB9 AA96 8679 7378 8083 827F 7B76 7372" $"7373 716D 6760 5954 5764 7A8F 9995 8775" $"696B 7E98 A6A6 9C88 7369 6970 777B 7E7E" $"7C79 7676 8094 A8B1 AEA3 978D 898B 939D" $"A2A0 978A 7E74 7586 9EAC B1B0 A38F 7D73" $"778D A6B4 B5B0 A7A1 9EA2 AAB1 B4B3 AFA9" $"A198 918D 8A88 8681 786B 5F61 799C B2B4" $"AC9C 8878 6C67 6A6E 7170 6E6B 6762 5E5A" $"5857 544E 4740 3C3F 4F69 7B7E 7565 5548" $"4B63 8291 8D82 7564 5650 4E51 585F 6264" $"6666 6771 8597 9C99 8F82 7670 7277 7C7F" $"8180 7E7A 736E 7382 8E8D 8980 6F5F 5C67" $"7D90 9591 887D 7674 7880 8888 8178 6F68" $"6563 605E 5B59 5651 4B47 4C64 8CAA B3AE" $"A089 756A 6B78 8995 9897 9592 8E8A 867E" $"7368 625F 5D5D 677D 95A5 A8A0 9285 7974" $"83A1 B6B8 AE9E 8671 6666 6C75 7B7C 7771" $"6A64 6A7E 95A2 A39C 938D 8B8C 8E8F 8D89" $"8580 7B74 6D70 8194 9A97 8E7E 6D68 7285" $"99A6 A7A1 9EA1 A7B1 BCC2 C2BB B2A8 9D92" $"8984 858C 9396 9489 7D7A 8CAB BCB9 AFA2" $"907E 7373 7A82 8481 7A71 6860 5853 504E" $"4D4D 4D4E 525B 6973 7774 6B60 5956 5862" $"7991 9DA1 A197 8A83 807E 7E7E 7D7B 797B" $"859B B3C2 C3B8 A899 8D88 8D96 9C9D 9D9C" $"9A95 8D83 8597 A7A9 A299 897B 8095 AAB5" $"B5AC A097 9393 9699 9B9C 9B98 948E 8780" $"776F 6864 5F5B 585C 7091 AEB8 B1A3 9381" $"726B 6B6E 6F6F 6C6B 6C70 7477 797A 7771" $"675C 565E 7893 9F9E 9689 7C70 6560 6A80" $"8F8E 867C 6C5B 514C 4C4E 504E 463C 373F" $"5771 8081 776A 605C 5C60 6263 6363 6363" $"6360 5E66 7B8B 8A81 7565 5F6D 8697 9B96" $"897A 7174 7F8D 928F 867C 746F 7179 8388" $"8882 7769 594F 4E5C 7B9D B0B0 A89A 8878" $"7273 787E 8283 807B 7670 6862 5F61 6566" $"676F 8299 A5A4 998B 7F78 7778 7E8E A6B5" $"B1A7 9E94 8B87 8586 8785 7F77 7580 98B3" $"C4C5 BBAC A19B 999B A0A4 A5A4 A19C 968D" $"8071 6C76 858A 8781 787B 8C9A 9E9B 9389" $"8180 868D 9293 918D 8A88 8683 7E77 706B" $"6762 5C5A 6170 849D B3B9 AD9D 8C78 6863" $"6469 6D71 7578 7C7F 8181 807D 7871 6964" $"6878 8E9D 9F96 897C 736F 6E70 7A8C 9A9B" $"958D 7F73 6D6A 6867 6969 6769 7485 96A2" $"A5A2 9C96 9394 989B 9891 8B8A 8C90 9290" $"8F96 A6B0 AA9E 938D 95A9 B9BE BBB4 AEAD" $"B2B9 BFC0 BCB5 AEA7 A099 938F 8D8B 8985" $"7F75 6C69 6E76 8292 9993 8A7F 7167 635F" $"5D5E 5F5D 5854 504C 4B4D 5154 5351 5463" $"7782 827A 6F60 5248 4342 444F 677A 7C75" $"6D62 5854 5354 585C 5D5D 6579 8E97 9285" $"7466 5F61 6B77 8186 8786 817A 736B 6158" $"5766 797F 7D79 7984 9093 8F87 7D74 6F71" $"7779 7878 797C 7D7B 7875 7371 6F6C 665E" $"5755 5C69 7990 A9B4 B0A9 9F93 8C8A 8889" $"8B8B 8885 8484 8383 8381 7C75 727D 92A4" $"A9A3 9889 7C73 7176 7B7F 899A A6A3 9A8F" $"7F72 6D6B 6C6E 6D6A 6E81 9EB4 BDBA AD9E" $"928A 8787 8989 8784 807B 746E 6761 606D" $"879A 9E9A 979C A5A6 9C8F 8177 747A 8897" $"A0A0 9991 8B85 7F7B 7877 7979 7671 6A65" $"6979 8DA1 B6C3 BEAF A193 857E 7C7D 8083" $"837F 7976 7473 7372 6E67 605D 6371 7F85" $"837A 6F67 6569 7278 7E8D A1AB A8A2 9684" $"7670 6F71 767A 7C85 96A8 B0AF A79C 9596" $"9DA7 AFB0 ABA4 9E9C 9A97 928A 807C 8495" $"9F9E 9D9F A5AE B1AC A297 908D 9199 A0A2" $"9F99 9188 8077 706A 6664 6668 6967 676F" $"7C81 848D 999A 958F 8981 7A71 6862 6164" $"686C 7071 6C65 5C55 5053 627C 9097 9489" $"7B70 6865 6463 605C 6272 7C7C 7A74 6A61" $"5A51 4A45 3F3B 4258 707C 7C77 726F 6E70" $"7478 7975 716F 7070 6D68 6057 5562 7983" $"7F7C 8085 8886 817B 797C 818B 959A 9996" $"928D 8987 8685 8380 7C77 726C 6667 7586" $"8F96 A1A9 A8A1 9A90 8885 817D 7873 6C64" $"5E5D 6063 6567 6867 666D 7A86 8B88 8178" $"726E 6D6E 6D6A 6D7E 949D 9991 8473 6862" $"6164 686D 788E ABC0 C8C4 B7A9 9F9C 9C9E" $"A0A0 9E9C 9B9B 9995 8F86 8186 97A6 A297" $"949A A3A8 A6A0 9A94 8E88 888C 908D 8986" $"8687 8786 8585 837F 776B 5E56 5761 6C75" $"859C ACAE ABA3 9589 8079 7371 7376 787A" $"7A78 7570 6A63 5F63 7185 9294 8D82 766F" $"6C6D 6F70 7073 7F8A 8D8C 8884 8284 8684" $"7F79 7475 8499 AAB1 ADA4 9D99 9A9F A5A7" $"A59F 9790 8C8C 8D8A 827C 7E8B 9390 8F9B" $"AAB4 B6AE A49C 999A 9EA3 A7A7 A29C 948F" $"8D8E 9193 928F 8981 7568 6063 6F76 7679" $"8287 847F 7A72 6A64 5E5A 5958 5652 5153" $"5553 4E47 3E38 3B4B 606E 7067 594F 4C52" $"5B60 615E 6272 8488 857E 7165 5E5B 5A5B" $"5C5D 677D 939F 9F99 918C 8B8E 9397 9691" $"8C87 8583 807B 746C 6465 727B 7670 7784" $"8C8E 8A83 7C78 787A 7F84 847F 776D 645F" $"5E5E 5E5E 5E5E 5B56 504F 5A6B 767D 899C" $"A9A7 9D94 8A86 8787 898E 9496 9491 9091" $"9291 8D86 7E7D 8A9B A2A1 998F 8680 7D7D" $"7B73 6A69 7786 8985 7F74 6861 5D5D 5E5E" $"606A 7E93 A2A4 9D92 8A88 8D96 9C9C 9791" $"8A85 817D 7A78 767A 89A0 ACAA A8AD B2B6" $"B5B1 ABA5 A19F 9FA1 A19D 9792 8F8D 8B89" $"857E 7770 6B66 615B 5D69 767B 7D88 9AA3" $"A39F 9587 7D74 6C66 6462 5E5A 5858 595B" $"5D5D 5C5D 6778 8891 918A 7F76 7070 7478" $"7C82 93A9 B4B3 AA9C 8D84 807D 7D7D 7D81" $"90A9 C1CD CEC6 BCB3 AEAB A9A7 A5A3 A2A1" $"9F9E 9B93 877A 747E 8D90 8D90 979B 9C97" $"8E85 7E7C 7D80 8588 8681 7B75 706C 6967" $"6462 5E57 4D43 3B3C 4B5E 6C76 8693 9186" $"7B70 635E 5F63 6D76 7C7F 7F7F 7D7A 766F" $"665B 5A68 8090 928A 807A 797C 7F81 7E77" $"737A 878B 8883 7769 605B 5754 5355 5E72" $"8C9F A39B 8D81 7B7C 8288 8A89 8786 8582" $"7C74 6B63 5E64 778A 8C87 8A92 999B 9791" $"8A86 8688 8D92 9495 9594 928F 8B84 7C73" $"6B66 615C 5756 5D6B 757A 8492 9995 918C" $"8784 8380 7D7D 8184 8381 7E7A 7570 6A64" $"6067 7F9A A7A5 9A8B 7B6C 6059 585A 5E6B" $"8193 9898 9284 7568 5F5C 5C5E 6372 8CA4" $"B0B2 AA9D 928C 8A8B 8D8B 8681 8184 8787" $"837C 726C 717F 8887 878F 9BA4 A59E 958D" $"8A8B 9096 9C9E 9C97 9089 837E 7A75 6F68" $"625D 5957 5B69 7D8C 98A6 B0AD A59F 9994" $"9290 8E8D 8B88 8582 7F7C 7976 716A 615C" $"6070 838D 8E88 8078 7573 7370 6B68 7182" $"8C8D 8A80 7266 5E59 5A5D 616A 7D97 ADB6" $"B0A1 9184 7C7A 7D80 8180 7F7F 8080 7D78" $"706A 6E81 969B 9695 9AA2 A8A6 A199 9391" $"949A 9FA0 9C97 8F86 7E78 7472 716D 6863" $"5E5A 5657 626D 757F 8E98 9894 9089 8686" $"8581 7F7E 7C7A 7773 6F6B 6864 6160 6677" $"8E9E A19B 9188 8281 8385 8483 8B9B A6A6" $"A096 8779 6E66 605E 5E60 6B84 A0B1 B5AE" $"A296 8F8B 8B8F 9191 8E8A 8580 7A72 685C" $"555B 6F7E 7F7C 8089 9496 9089 7F77 7271" $"767B 7C79 7775 7372 706E 6964 5D54 4C46" $"4345 4E5C 6A77 8899 9F9C 9892 8A86 817B" $"7673 7272 757C 8285 827B 7269 6366 7689" $"9494 8D84 7C77 787C 7E7D 7F8D 9D9F 968C" $"7F70 6763 6161 6261 626D 8094 9FA2 9C92" $"8B88 898D 8E8A 827B 7675 7473 726E 696A" $"7683 8681 818B 9DA9 A9A2 9B97 979C A4AD" $"B4B2 ACA2 978C 837B 7570 6E6D 6D6A 6667" $"7287 969A 9DA3 A39A 9289 7F76 7474 7577" $"7775 716D 6966 635F 5A56 5252 5D71 8288" $"8174 6864 666B 6F71 727A 8B97 9691 8778" $"6A64 6364 6769 6B75 8BA4 B6BA B2A4 978E" $"8C92 9A9E 9F9F 9D98 928B 847B 706A 7284" $"8E89 8387 939F A4A1 9992 8D8D 8F91 9291" $"8F8C 8987 8786 847F 766C 6259 5350 5360" $"7280 8891 9CA0 9D99 9690 8C87 8280 807F" $"7973 7072 7678 7671 6A65 6D80 9299 9891" $"887F 7978 7978 726C 7080 8D8B 847B 6E64" $"5E5B 5958 575A 677F 96A2 A197 8A81 8085" $"8C90 8F89 8176 6C64 5F5D 5B5A 5E69 7A83" $"858C 98A1 A29E 958C 8787 8B95 9EA4 A5A3" $"9E98 918A 837D 7772 6C67 625E 5E69 7C88" $"8884 8992 9692 8B80 736D 6E72 7578 7874" $"6D66 605C 5B5A 5858 6275 8890 8D82 756B" $"686A 6F74 7572 7381 949A 938A 7E70 6867" $"6667 6B74 869F B4BF C0B9 AFA7 A2A0 A09E" $"9B97 9493 918C 8780 786F 6664 6C77 7F89" $"99A2 A19E 9891 8E8F 9192 908D 8883 7D77" $"7069 6059 5553 514F 4E4D 5262 798D 9492" $"929D A6A3 9B94 897D 7570 6D6E 7275 797E" $"8281 7B73 6964 6C82 969F 9D93 8882 8081" $"8280 7A72 6A6C 7B8A 8E8B 8376 6A62 5C58" $"5962 7182 8E93 9392 9497 999C 9E9E 9B94" $"8D86 807A 746F 6A65 6160 687B 92A7 B4B3" $"A99E 9692 959C A1A1 9E99 9490 8D89 837E" $"7973 6D67 625C 585A 6575 8388 867C 7782" $"98A4 A39E 9385 7971 6C6B 6C6A 655F 5C5C" $"5C5D 616D 7F90 9796 8F86 8282 8588 8882" $"786D 6566 7891 A0A2 9D8F 7C6C 6361 6D87" $"A0AE B0AA A39D 9B9B 9EA1 A19E 9A97 9492" $"908C 867C 7166 5D55 5461 7C95 A09D 8F7F" $"7370 7680 898D 8C87 817A 7572 706E 6A65" $"615D 5955 555F 6F7C 7F7B 7368 626B 839C" $"A7A5 9A8A 796F 6A6A 7077 7A77 716C 6867" $"6F81 939C 9C96 8D85 8283 898D 8C87 7F75" $"695E 5A65 767E 7E79 6D5E 5657 667D 9197" $"938D 8988 8B90 9493 9089 827C 797A 7D81" $"8484 7E75 6C67 6E86 A7C0 C9C5 B7A4 9791" $"9297 9EA1 A09E 9B97 918B 8580 7B76 6F66" $"605F 6A7B 898E 8A81 756B 6463 6F86 979A" $"958B 7C6C 6058 5454 5656 5554 5662 758A" $"989B 968D 8680 7C7A 7876 736F 6B68 6460" $"5E64 7584 8781 766A 666E 7E8D 999F 9E9B" $"9BA0 A6A9 A7A2 9D99 9592 8E89 847E 7973" $"6C65 6263 6A79 92AA B5B2 AAA0 958E 8C8B" $"8A89 8784 807E 7C7A 7774 6F6A 6663 6877" $"8994 9998 948F 8982 7B73 727F 94A1 A39E" $"9587 7B71 6863 6262 646C 7C8D 9799 9590" $"8C89 8989 8885 8383 8381 7D79 726A 625D" $"626D 7578 7D83 888A 8B8A 8A8D 9191 8F8C" $"8984 807C 7978 797A 7873 6E68 635E 5A5C" $"646C 6F6D 6E7B 92A2 A6A3 9B8F 867F 797A" $"8086 8989 8783 7C75 6C67 6B79 888F 8F89" $"827E 7D7F 8181 7B70 635C 6478 888C 8A83" $"7669 5E57 5965 737D 8286 8887 8583 8487" $"8986 8079 736F 6E6F 7171 706C 6761 606C" $"8399 A6A9 A090 827A 787C 858A 8D90 9396" $"999A 9A97 928B 847B 7372 7B8B 979A 9791" $"8B87 8386 94A7 ADA7 9E93 857A 746E 6B6B" $"6C6A 6869 7280 8C91 9290 8C88 8582 807E" $"7B77 726D 6966 625C 585D 6B75 7572 7275" $"7B81 8485 8586 8688 8C90 9290 8C87 827C" $"7671 6D6A 6868 6A72 7C85 8985 7C76 7B8C" $"9CA2 A29C 9288 837F 7D7E 7F7C 7876 7473" $"757E 8A93 9796 938E 8884 8384 8688 8784" $"7D76 737B 8C98 9996 9089 8A92 989B 9C9A" $"9794 9394 9698 9896 928E 8B87 817A 736E" $"6B6D 747D 817E 766D 6F7D 8A8C 8A84 7A72" $"6D69 6869 6A69 6664 6160 626C 7D8F 9998" $"9087 7E77 716D 6E72 7678 756F 6A6F 808F" $"928C 8278 7681 8D92 9391 8D8A 8A8C 9094" $"9697 9692 8D87 807B 756F 6C6A 696D 7A85" $"867F 7F8A 9394 918D 857F 7C7C 7E80 807E" $"7A76 7270 6C67 656B 7C8F 9794 8B7F 736B" $"6769 7077 7977 7377 8696 9A96 8D7F 6F62" $"5A5B 6C83 9296 948D 8781 7D7C 7E82 8483" $"807C 7875 7372 706C 6660 5957 627B 929D" $"9A91 8273 6B6B 737F 888B 8B89 8681 7C79" $"7878 7570 6B6E 7B8B 969A 968F 8983 7D79" $"777F 909F A19B 948A 7F79 7777 7878 777E" $"8B97 9D9C 9791 8D8B 8A8A 8B8B 8884 807D" $"7B77 726B 625B 575B 6A7F 949F 9E96 8C82" $"7770 6C6D 7075 7778 7777 7878 7776 7471" $"6D69 6B74 8189 8C8A 8379 706E 7C91 9EA1" $"9E94 877E 7976 7779 7A79 787A 828D 979A" $"9994 8F89 8482 8387 8B8B 8985 817C 746C" $"666B 7883 8A91 9699 9996 908A 847F 7B7A" $"7F83 8586 8687 898A 8986 7F77 6E67 656C" $"7A86 8883 7A72 7683 8E90 908D 8681 7F7E" $"7E80 8383 817E 7A78 7D89 9397 958E 877F" $"7A78 7B80 8688 8681 7A70 6867 727E 8280" $"7B78 7B85 8A8B 8A89 8785 8585 878B 8E8E" $"8D8B 8782 7D77 726E 6B69 6F7C 898E 8A84" $"848E 989A 9894 8D87 8381 8080 807E 7B79" $"7773 6E69 6C77 8388 8783 7D78 7574 767A" $"7E7F 7A72 6966 6E7B 817E 786E 6159 5D6B" $"787E 7E7A 7571 6E6F 737A 8082 8280 7B75" $"706D 6B6B 6A67 6565 6B72 7C8B 9BA2 A19D" $"9691 8F91 9292 9391 8E8A 8681 7F7D 7D7C" $"808B 989F 9E9A 938C 847F 7B7A 7977 7371" $"7989 9596 918A 7F73 6A63 626B 7B86 8B8C" $"8985 827F 7D7C 7D7E 7C7A 7878 7877 7573" $"6F6A 6562 6675 8D9F A5A2 998D 827C 7A7B" $"7F81 817F 7E7E 7E7F 8080 807D 7978 7C86" $"8D8F 8D88 817A 7470 6E6E 737F 8E96 948F" $"877E 7671 6C6A 6B71 7B84 8A8E 9090 8E8B" $"8784 8587 8989 8A8B 8B8A 8885 827D 7874" $"798A 9BA4 A5A0 9790 8D8B 8A8B 8C8D 8D8C" $"8B89 8887 8683 7E78 7271 7680 8B91 908B" $"8278 6F68 6368 778B 9697 938B 8077 6E68" $"6463 6366 6F7B 858A 8B88 8581 7D7A 7879" $"7C80 8382 807D 7976 726D 6A6C 7786 939D" $"9F9C 9792 8E8B 8986 8482 8283 8486 8684" $"817D 7A76 726E 6D74 7F87 8886 817B 746E" $"6E78 868D 8C89 837C 7773 6F6D 6B69 6766" $"6B76 828C 8F8E 8B88 8481 8081 8384 8482" $"7E78 736E 6A68 696F 767A 7E84 8888 8683" $"7F7A 7674 7476 797C 8083 827F 7B76 7270" $"706F 6D6D 7076 7B7D 7C79 7572 747D 868A" $"8C8D 8B88 8583 807E 7C7A 797A 7B80 8990" $"9494 928F 8C8A 8987 8786 8686 8685 8381" $"7D79 797F 8484 8489 8E93 938F 8982 7B75" $"7273 787D 8183 8482 817E 7A76 726F 6D6B" $"6B71 7A80 8380 7A74 747C 8488 8A89 8683" $"817F 7D7B 7978 7776 7676 7A82 8D96 9B9A" $"9692 8D89 8583 8384 8484 837F 7A77 7B84" $"8B8D 8B88 8587 8B8D 8D8C 8986 8280 7F80" $"8386 8889 8988 8683 807D 7975 7170 7177" $"7E82 817F 7F86 8E91 908E 8A84 807D 7A79" $"7877 7674 7473 7476 7C86 9095 9592 8F8B" $"8986 8584 8382 7E7A 756F 6E73 7E87 8988" $"837D 7B7E 8385 8686 8380 7E7E 8083 8585" $"8483 8281 817F 7C7A 7876 7372 7479 7C7C" $"7A7D 8690 9390 8C88 8584 8381 7F7D 7C7A" $"7877 7778 7B7F 8489 8D8E 8D8B 8784 8280" $"7F7D 7B79 7673 706E 717B 8486 837F 7A76" $"777D 8387 8886 8381 7F7D 7C7C 7C7B 7A7A" $"7A7A 7A79 7772 6D67 6361 6165 6B70 7376" $"7D83 8581 7D7B 7877 7777 797C 7E7F 7E7D" $"7B79 7776 787D 858D 9293 918C 8682 7E7D" $"7E81 8383 807B 787C 868E 918F 8A84 7E7C" $"8188 8B8C 8B89 8684 8383 8588 8A8B 8C8B" $"8986 827F 7C7A 7876 7371 7174 787A 7D83" $"8B8E 8D8A 8784 8282 8383 8280 7C78 7472" $"7374 7474 7679 7E81 8382 817F 7E7D 7C7A" $"7775 7473 7373 7375 7C83 8684 817D 7978" $"7B7F 8283 8483 8384 8585 8687 8686 8686" $"8787 8887 8685 8483 8281 8285 8888 8685" $"8992 9796 9491 8E8D 8B89 8684 8382 807E" $"7C7A 7979 7A7D 8288 8B8B 8884 807E 7D7D" $"7D80 8384 8482 7E7A 7779 8086 8682 7F7B" $"797A 7F85 8786 837F 7C7B 7D82 8689 8A88" $"8684 8381 807E 7C79 7673 7171 757C 8286" $"8785 8487 8F94 9493 908C 8985 8280 807F" $"7E7D 7C7A 7876 7475 797E 8282 8280 7F7E" $"7E7F 8081 8180 7E7C 7976 7371 6F72 797D" $"7B77 7474 7980 8485 8380 7C78 7778 7B7E" $"8080 7F7D 7C7B 7B7B 7A79 7774 7170 7177" $"7F86 8987 827B 7779 838B 8E8F 8C86 817D" $"7A7A 7C7D 7D7B 7876 7574 7579 7F83 8686" $"8481 7F7F 8183 8483 8280 7E7C 7A78 7675" $"7476 7B81 817F 7F81 8487 8786 8481 8080" $"8284 8688 8887 8583 8181 8284 8482 7F7C" $"7976 767B 8286 8785 807A 7675 7C86 8B8B" $"8985 807C 7B7A 7979 7775 7371 7173 7980" $"8688 8783 7E7A 7777 7A7D 7F7F 7F7E 7D7B" $"7A78 7775 7373 767B 8084 898E 9192 918D" $"8885 8281 8181 8283 8587 8887 8786 8686" $"8786 8381 8081 858C 8F90 8E8B 8682 7E7D" $"818B 9294 928F 8B87 8381 7F7E 7C7A 7774" $"7273 777F 868A 8B8A 8885 8381 8080 8080" $"8080 7F7F 7F7E 7C79 7774 7172 777C 8289" $"8C8B 8885 827F 7D7D 7D7E 7E7D 7D7D 7E7F" $"7E7E 7D7C 7C7C 7C7B 7B7C 7F85 8B8D 8B88" $"8482 807D 797A 8188 8B8A 8885 807C 7A79" $"797A 7A79 7979 7C82 878A 8B8A 8886 8482" $"8180 8080 807F 7F7F 7F7F 7D7B 7875 7371" $"7276 8089 8E8F 8D89 8582 807F 7F7E 7C7B" $"7978 7776 7676 7674 7372 7171 7273 767B" $"8083 8381 7F7D 7B7A 7A79 7776 777D 848A" $"8B89 8682 7E7B 7978 797A 7C7F 8285 8787" $"8685 8585 8586 8787 8685 8484 8381 7F7D" $"7A78 7675 7575 7576 7A82 898E 8E8C 8885" $"8280 7E7E 7D7D 7D7C 7B7A 7877 7675 7576" $"787A 7E81 8486 8887 8683 8180 7F7D 7D7C" $"7C7C 7C7C 7D80 8689 8A87 8481 7E7C 7B7B" $"7C7E 8184 8585 8584 8381 7F7E 7E7F 8081" $"8180 7F7D 7B79 7878 7879 7979 7A7A 7B7C" $"7E80 8387 8A8B 8B89 8684 8383 8382 8180" $"7F7E 7E7D 7D7C 7C7D 7E7F 8284 878B 8C8C" $"8B88 8684 8281 8080 7F7F 7E7D 7C7C 7B7C" $"7D81 8586 8482 7F7D 7C7E 8083 8584 8381" $"7E7D 7C7C 7D7D 7E7E 7E7E 7F7F 8080 7F7F" $"7E7D 7D7D 7D7D 7D7E 8083 8585 8381 8183" $"8789 8987 8684 8383 8383 8382 8181 8080" $"8081 8080 7F7F 8082 8485 8584 8382 807F" $"7E7F 8080 8181 807E 7D7B 7978 7777 7A7E" $"8182 807E 7C7B 7C80 8282 8180 7F7E 7D7D" $"7E7E 7E7E 7E7E 7E7E 7F7F 8080 7F7E 7C7B" $"7A79 7877 7779 7C80 8282 8180 7D7B 797A" $"7E82 8383 8281 807F 7F7E 7D7C 7C7B 7B7A" $"7A79 7979 7B7F 8487 8888 8685 8382 8181" $"8282 8382 8281 8180 7F7E 7E7E 7D7C 7B7B" $"7E82 8485 8688 8989 8886 8483 8180 8080" $"8080 807F 7F7F 7E7E 7D7D 7D7E 7E7E 7D7C" $"7B79 7878 7B7F 8283 8381 7F7E 7C7A 7977" $"787C 8184 8483 817F 7D7C 7B7A 7979 7879" $"797A 7C80 8486 8686 8482 8180 8080 8081" $"8182 8384 8483 8281 807E 7D7C 7C7C 7C7C" $"7E81 868A 8C8C 8A87 8482 8180 8080 8181" $"8182 8383 8382 8281 807F 7E7E 7E7D 7D7E" $"7F80 8183 8483 8382 8080 7F7F 7F7F 7E7D" $"7D7C 7C7F 8387 8786 8482 807E 7D7C 7C7C" $"7C7E 8083 8585 8584 8382 8180 7F7E 7E7E" $"7F7F 8081 8181 8180 7F7E 7D7C 7B7B 7B7B" $"7A7B 7B7D 7F83 8687 8684 8280 7E7E 7E7E" $"7E7E 7E7E 7F7F 7F7F 7F7F 7F7E 7E7E 7E7F" $"7F80 8283 8585 8484 8382 8180 7F7F 7F7F" $"7E7E 7D7C 7C7B 7B7E 8183 8383 8180 7E7D" $"7D7C 7C7D 7E7F 8080 8080 7F7E 7E7D 7C7C" $"7C7D 7D7D 7D7E 7E7E 7F7F 7E7E 7E7D 7E7E" $"7E7E 7D7D 7C7C 7C7C 7C7E 8083 8585 8584" $"8382 8181 8080 8181 8181 8181 8181 8180" $"807F 7E7E 7D7D 7E80 8284 8484 8382 8180" $"807F 7E7E 7D7C 7C7B 7B7A 7A7B 7C7F 8182" $"8281 807E 7D7D 7C7C 7C7D 7E80 8283 8382" $"807F 7E7E 7E7E 7E7F 7F80 8080 8181 8181" $"8180 807F 7F7F 7E7E 7D7D 7C7C 7C7C 7D80" $"8385 8585 8483 8281 807F 7F7E 7F7F 8080" $"8181 8180 8080 8080 8080 807F 7F7E 7E7E" $"7E81 8385 8584 8382 8180 807F 7F7F 7F7F" $"7F7F 7F80 8081 8181 8181 8181 8080 7F7E" $"7D7D 7D7E 8082 8282 8281 807F 7F7E 7E7E" $"7E7E 7E7F 7F80 8181 8080 7F7F 7F7E 7E7E" $"7D7D 7D7D 7C7D 7D7E 8082 8382 8281 8181" $"8282 8181 8080 8080 8081 8181 8181 8181" $"8080 7F7F 7E7E 7E7E 7F80 8182 8383 8382" $"8281 8180 8080 7F7F 7E7E 7D7D 7D7D 7E7E" $"7F7F 7F7F 7F7E 7E7E 7E7E 7E7E 7E7F 7F80" $"8181 8180 8080 807F 7F7F 7F7F 7F7F 7F7F" $"7F80 8080 8080 807F 7F7F 7E7E 7D7D 7E7E" $"7E7E 7F7F 8081 8180 8080 7F7F 7E7E 7E7E" $"7E7E 7F7F 8080 8080 8080 8080 8080 807F" $"7F7F 7F7F 7F7F 7F7F 7F80 8081 8181 8181" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 807F 7F7F 7F7F 7F7F 7F7F 7F7F 8081" $"8282 8181 8080 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7E7F 7F7F 7F7F 7F7F 7F7E 7E7E 7E7E" $"7E7E 7E7E 7F7F 8081 8181 8180 807F 7F7F" $"7F7F 7F7F 7E7F 7F7F 8081 8282 8281 8180" $"8080 8080 8080 8080 7F7F 7F7F 8081 8181" $"8181 8080 807F 7F7F 7F7F 8080 8080 8080" $"8080 7F7F 7F7F 7F7F 7F7F 7F7F 7E7E 7E7E" $"7E7E 7F7F 8081 8282 8181 8080 807F 7F7F" $"7F7F 7F80 8080 8080 8080 7F7F 7F80 8080" $"8080 8080 7F7F 7F7F 7F7F 7F80 8081 8181" $"8180 8080 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"8080 8080 8080 8080 807F 7F7F 7F7F 7F7F" $"7F7F 7F7F 8080 8080 8080 8080 7F7F 7F7F" $"7F7F 7F7F 7F80 8080 8080 807F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F80 8080" $"8080 8080 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F80 8080 8080 807F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 8080 8080 8080 8080 8080 8080" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 8080 8080" $"8080 8080 8080 807F 7F7F 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080" } }; resource 'snd ' (11108, "Wooden Flute", purgeable) { FormatOne { { /* array Synthesizers: 1 elements */ /* [1] */ sampledSynth, 160 } }, { /* array SoundCmnds: 1 elements */ /* [1] */ hasData, bufferCmd { 20 } }, { /* array DataTables: 1 elements */ /* [1] */ 13334, Rate22K, 13332, 13333, 0x0, 0x3C, $"8080 8080 8080 8080 8080 7F7F 7F7F 7F7F" $"7F7F 7F7F 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8081 8180 8181" $"8081 8181 8180 8081 8181 8081 8181 8181" $"8181 8181 8181 8181 8181 8181 7F7E 7F80" $"7F7F 8181 807F 7D7A 797E 8183 8A8D 8889" $"8D88 8381 7F81 8384 8585 8685 807C 7A7A" $"7874 7478 7A84 8C82 777D 7F77 7476 7F8A" $"8D89 827C 7D7E 7E83 8280 7F7B 869A 9386" $"8785 807E 828D 9595 9288 7C71 6C70 7B7B" $"6C66 6C6D 6768 6A65 6368 6662 6D79 7B7F" $"8A85 797F 847E 8A9A 9B94 8F8F 918F 8780" $"868C 8578 6A68 7374 665E 6565 554B 5362" $"6C67 6269 6A69 7079 8C9C 928A 9596 929E" $"AAA3 908F A0A8 9F92 9297 9A95 8779 727E" $"8E79 646B 624A 4047 5E67 5655 6264 6571" $"7973 7889 8D8B 95A7 B1AF B1B5 B2AC ABAE" $"A6A8 BABF B39E 949B 947A 6B6C 6960 605D" $"4C47 514E 3F39 3E4F 636D 798D 999B 9A98" $"A1AF B5BB C2C2 C5CC C3BA C8DA D0BE B8AD" $"9F9B 9483 6F61 5548 4444 3D3D 3F2F 2228" $"394B 4E54 687B 98AE 9D92 A5AC ACBF DADD" $"C6BE D7E0 D1CE C6BB BCB8 A389 7A83 8C75" $"4C2F 2423 292F 2E2E 3739 3132 3C46 5461" $"748B 8C8C A7BE CCDA D0B9 B7C3 C6CC E5EE" $"DFDB D7BF A593 7F6B 6463 563F 3636 2E26" $"2D31 2215 1B2A 394E 6675 818B 9193 939A" $"A8BA CFD8 D1CC CED5 DEDD D3C5 B2A3 A09E" $"8E80 7D6D 5243 3527 313D 3531 3432 3438" $"4358 656C 787F 8593 A5B8 C0C5 CECB C1C4" $"C8BE BBCD E4DB BCB0 AF9F 9492 7B50 3A40" $"443A 3840 4238 2F26 1C16 2249 6D72 6F81" $"9796 94AD BFB6 AFB4 BFCC D8E9 F9F7 E7C9" $"A089 919E 978A 897B 5742 3E39 2F24 1E24" $"2824 2E4B 514C 6070 6255 5E75 8FAD CEDE" $"D2C8 C5B7 A8AD B5B7 C3CA C0AB 9FA3 9A86" $"6D4C 3329 2630 4045 3E38 2F1E 131D 3143" $"5057 5B68 8298 A0A3 A8A8 A09C A5AF BDCD" $"D3D7 D3BB A5A1 9E8A 7573 7360 5154 5445" $"3A36 2E23 1C19 1822 3A4E 5561 6B63 5C6A" $"7E90 A2AE B4C1 C6BC C2D6 D4BF B1AC A29B" $"A1AD AE9B 7C5D 453D 413A 2E2E 332D 262C" $"3B43 413B 4252 5658 6B8A A3AF B5B4 AEB1" $"B6B2 ADB0 B5BC CDDE D9C5 B4A8 9D85 644F" $"4C53 585D 655D 402B 2724 2122 2E46 5F70" $"7C7E 839C AC9E 9299 9FA8 C4E0 E4D9 D3D3" $"C9B7 B0B3 AEA5 9E93 8371 6868 614E 3E39" $"3731 353A 3435 444F 5766 7275 777E 8C9C" $"A9B0 B7BD C3CC CBC6 C0B2 AEB7 BCB4 ACAF" $"B2A6 9479 543F 464E 4D4B 4641 4245 423E" $"352F 3B4C 566B 8DA9 BBC0 B39E 8E92 ABC1" $"C1B8 BBCD DBD8 CBB8 9F8C 8480 7563 5D69" $"7165 503F 3534 3830 252A 4056 626E 7673" $"7585 9498 9189 93A8 BBC1 BBB6 B8B4 A8A2" $"A1A1 ABAF A8A2 937B 706A 5D53 463A 3737" $"393E 4443 3931 333D 546C 7A87 9096 A1A5" $"A19D 9DA7 B3B2 AFB3 C1CF CEC0 B5AB 9D91" $"8980 7160 555B 6155 3E34 3738 3632 2E35" $"424A 5870 8188 949B 9690 8C90 A1B4 BEC2" $"C1BC BCC3 C3BC B29B 8783 8489 8F83 6851" $"4337 2F2E 2F30 3540 453F 3B48 6576 787B" $"7A79 8EAF BDB1 AAB3 B8B2 ACAF B5B8 C3D2" $"CDB5 A79F 9185 7B6E 6051 4C4E 4438 3B43" $"433B 332D 2933 5374 8284 8C95 908C A0B8" $"B3A2 A5AD ABB2 CADF DDC9 B3A0 8C80 8289" $"8270 6B62 4B43 4842 352F 2E29 2836 5067" $"6B6E 7C81 797F 8D93 A4BF CAC4 C1C4 C2B9" $"B1B7 C6C7 B9AC A299 918B 8A7C 5D44 3A37" $"383F 4A4E 4338 3431 3749 5C6A 7378 7A82" $"9DBC C5B6 A6A4 A49C 96A8 C8D6 D3D4 CBB3" $"9C92 8E83 736B 665F 5B56 4F49 463C 2B23" $"2935 3E4C 6987 9186 7F83 8891 A1B4 BFBF" $"BDBD BFC4 D1D9 CEBD B7AC 9A97 9E9C 907A" $"5E49 3932 3943 4036 3333 3337 4050 5F62" $"6973 7380 9DAF B7BF BEAC 9CA1 B3C1 C9CF" $"CEC5 BEB6 ABA4 9B8E 8573 5A4C 4D4F 4F4C" $"4537 2B27 2C34 4056 6A6C 707F 8A88 8CA3" $"B6B3 AAA7 AEB6 B8C2 D1D0 C3B8 AFA0 9CA3" $"A090 8071 5B46 4247 4A45 3C33 2A22 283A" $"444A 5C66 5D5C 7591 9CA4 ADB7 B5A8 A8B6" $"BCBD C1C4 BCAF AAAB AAAA A392 785F 4F44" $"3E42 4B4E 4437 312A 272F 404B 4E59 6F7F" $"848D A0AB A6A1 9D9A A6B9 C2CA CEC5 BDB6" $"ABA7 AAA6 9A92 8567 4E4E 5450 4538 2E2B" $"2727 3035 3742 4D51 5865 788B 979D 9F9C" $"9EAB BABE BFC5 C3BA B7B4 AAA9 B6BD AC8C" $"7367 5D51 4746 4B44 3938 3530 353D 444A" $"4B4D 596F 8B9E A29F 9EA0 A0A0 AAB4 BDC5" $"C6BF B6B4 BBC1 BBA9 9888 7366 6561 564C" $"4541 3E34 2B2D 3234 3C44 434A 617B 8C93" $"979A 999D AAAF AEBB CFD0 C1BE BDB6 B8C1" $"C3BA A591 847C 705B 483F 3937 3734 3235" $"3A3A 3839 3B41 536E 8698 A4A8 A8A8 A7AD" $"B7B9 BCC6 C8CB CFCA CBC9 B9A9 9B85 7371" $"736A 5C4D 3F34 3130 3135 3637 3937 3D4C" $"5966 7989 9496 939B AFB8 B4B6 BDBF BBB9" $"BABF C6C5 B9A6 958A 7F75 6E6A 5F4A 3B38" $"362F 2B31 393A 3432 3A44 556D 7C81 8A98" $"A2AA B0B2 B5BF C3BD B7B6 C2CE CCC8 BDA8" $"958A 8982 6D5B 5751 3F2F 2C30 3433 2F2F" $"3133 3943 5265 757F 8993 9697 A4B6 BFBD" $"B5B3 BBC3 C9CE CDC7 C1B5 A08E 7E76 776F" $"5948 3C32 3333 2F31 3432 3235 3841 5162" $"707C 838B 97A3 AFBA BEBC BCBF C1C3 C9CD" $"CFD1 CAB1 9B97 9789 7668 5E4F 3D33 3231" $"3233 302E 2E30 3747 5A64 6975 8694 9CA5" $"B0B9 BEC0 BBB4 B5BD CAD7 D6C9 BDB5 AA9C" $"8978 7168 5846 3B38 3734 312E 2B24 242F" $"3A47 575F 6A7F 8681 8EA8 B6BF C2BB BDC4" $"C1C1 CBD0 D0C9 BCB3 AFA4 9689 7966 4F3E" $"3A3C 3C37 322F 2824 2426 2F41 4E59 6C7B" $"7F86 94A3 ADB4 BABD BCC0 C7CF D5D1 C8C8" $"C4B6 A9A5 9F92 7F66 4F41 3934 3435 322D" $"2828 2B2C 303D 4C58 6168 7991 A0A8 B6BE" $"B7B2 BDC8 C7C7 D0D8 D7CD C0B9 B6AE A18F" $"796A 5A47 3F41 3D36 3433 2D27 262D 3C45" $"4A54 616F 7E8F A2B1 B6BA C1C3 BFC1 CFDD" $"DDD5 D0D0 CDC4 BBB1 A393 7E66 544A 413A" $"3B3F 3627 2127 2D2D 313E 4C56 616D 7D93" $"A4A8 AEBB C2C0 C7D4 D8D5 D5D9 D6CC C5C0" $"BBB9 AE94 7D6D 5641 3E3D 342E 2E2E 2C28" $"262D 353A 404D 5B6A 7E91 A1AF B5B5 B9C1" $"C5C8 CFD8 DEDA D1CD CDC8 C0B5 A591 7D6C" $"5C4D 4039 3732 2D29 2625 2930 3538 3C45" $"5368 7E91 9FA8 B0B7 BEC2 C2C8 D4DD DAD3" $"CCC9 CAC8 BEAF A08D 7A6A 5B4F 463B 322D" $"2922 1E23 2C31 3136 3F46 5062 7587 9BAC" $"B5B7 BBC1 C7D0 D3D0 CFD0 D2D3 CDC6 C2B6" $"A18E 7F69 4F46 4942 332A 2728 2723 242C" $"3436 3B45 5466 7A8F A1A7 A8B0 BEC7 C9CC" $"D2DA DDD4 CBCB CECB C5B9 A287 7771 6856" $"4136 3432 2A23 2126 2D32 3435 383F 4E66" $"7A85 90A2 B7BE BABE CAD1 D4D6 D2D1 D3D1" $"D2D4 C8B1 9D94 866D 594E 4A47 3A29 2425" $"2628 282C 3136 3D47 525C 6C88 A1AC ADB1" $"BDCA D3D5 D2CD CDD2 D4D4 D4D2 CBC2 AD8A" $"6E66 665B 4A3E 3936 2E24 2023 2427 2F38" $"3C40 4D65 7D88 8A92 A3B3 BFC7 CED5 DAD8" $"D1C9 C7CB D1D6 D1BC A799 8C76 5E4F 4840" $"362F 2C2A 2828 2A29 2829 313E 5166 7783" $"919D A2AA B6C2 CDD9 DCD3 CED2 D6D3 D1D1" $"CABA A99B 8C7E 6D5D 4C3D 3127 242A 2E2B" $"2828 2A2C 2F38 4C60 7385 929A A5AF BBC8" $"CFCE CED2 D4D3 D5DA DAD5 CBBA A797 8D82" $"7362 503F 302C 2D29 292C 2B29 2A2E 343E" $"4C5D 6D7E 8E9C A5B0 BEC8 D0D3 CDCB CED1" $"D6DF E2D9 CABB AB9D 8E7F 7366 5543 342C" $"2B2C 2D2C 2624 272A 3040 515E 6E7F 878F" $"9EAE BDCA D1D2 D1CE CDD3 DBDF DAD0 C7B9" $"A9A1 9B8F 7D66 4A37 332D 2626 2E30 2823" $"2529 2E38 4656 6672 7F94 AAB8 BDC1 C5C7" $"C6C2 C5D4 E0E5 E5D8 C1B2 ACA1 9285 796E" $"5B42 332F 2B2A 2A26 2222 2226 3240 4951" $"5F6E 7984 99B3 C3CB CECA C2C4 CFD9 DEE0" $"E0DA CEC0 B0A3 988F 7E66 4E3E 362F 2C2C" $"2922 1E1E 2026 2D3A 4A56 5D66 7489 9EB0" $"BDC2 C8D1 CEC6 CBD5 DADC DDD8 C8B8 B5B2" $"A18C 7963 4B3B 332F 3032 2F25 1E1D 1E21" $"2C3D 484F 5C6D 7C8B 9BAC BBC3 C3C3 C5CE" $"DAE0 E1E0 DCCE BEB7 B3AC A295 8066 4C3B" $"3530 2D2B 2622 201E 2028 323B 434B 535D" $"7089 A5BA C1BF C1C7 CAC9 CDD9 E2E1 DAD2" $"CCC5 BAAE A492 755A 4942 3C36 3130 2B1F" $"1716 1E28 3038 4754 5861 748A A0B2 BBC4" $"CCC9 C9D6 DEDD DDDA D3D1 CBC1 C1BC A78F" $"795C 443D 3B38 3630 261F 1D1C 1C24 303A" $"3F49 5B6A 7991 A8AF AFB6 C0C6 D0DE E5E6" $"E5DD CFC4 C5C6 C1BA AC98 8064 4F44 3A31" $"2D29 221E 1F22 252A 3135 363D 4C5E 7898" $"B5C0 BBBA C0C2 C8D5 E2E8 E4E2 E1D9 CFCA" $"C4B4 9E8A 7460 554C 433B 3125 1A15 171A" $"202B 3438 3A3D 495E 768A 9EB2 C0C5 C3C7" $"D4DE E0DE DBD9 D6D6 D9D6 CBBA A48D 745F" $"5046 403C 3428 1D1A 1919 1E24 2A2F 3642" $"5261 748C A2AF B2B6 BFCD DFE9 E8E4 E1D8" $"CFCF D4D4 CCBF AE94 755F 574C 3C2F 2824" $"201D 1D21 2325 2627 2B35 4562 849D A8AD" $"B1B7 C2CA CFDC EBEC E4E1 E1DD DBD7 C6AD" $"9889 7D70 6455 4336 2B1D 1311 161D 252B" $"2A29 3038 445A 758A 99AB BCC4 C9D6 E1E2" $"DEDB D9DC E1E3 E3DE CFB9 A28B 7565 5C53" $"473A 2C20 191A 1A18 1D24 2325 2F3F 4C5D" $"7486 94A3 B1BC CBD9 E3E8 E6DE D8D6 D8DC" $"DFDB D2C1 A790 7E6C 584A 4237 2922 1F1D" $"1E21 211B 191F 2937 4D67 7B89 96A2 ABB5" $"C1D1 DDE2 E6E7 E4E3 DFDD E0D8 C5B1 A091" $"8880 6F5A 4632 231C 1A19 1C1F 2325 2322" $"2936 4354 697C 90A0 AFC2 D2D7 D8DC DCD7" $"D3D6 E0EC EEE0 CCB7 A391 8071 675C 4937" $"2C24 1D1B 1E1E 1917 1B23 2D3B 4C58 647A" $"8C96 A6BC CEDD E6E2 D6D3 D8DC E0E5 E5DF" $"D2C0 AC98 877A 6C59 4434 2D2A 251F 1F1F" $"1912 141F 2A35 4961 6F75 7E8C A3BB C9D0" $"DBE3 E1E1 E3E5 E7E4 DCD8 D0BD ADA9 A189" $"6C56 4333 2720 2024 221F 1E1A 191C 2330" $"404E 6075 8B9F AFBC CAD2 D6D4 D4DB E6ED" $"F2F0 E8DC CBB9 ADA4 9383 7863 4938 2C24" $"2320 1B19 1714 1723 2C32 3D4B 5665 7A90" $"A9C2 D0D6 D6D3 D4DB E1E6 ECEC E5E1 D6C3" $"B5AB 9C8A 7056 463B 302A 2722 1915 1414" $"161C 2330 3F4A 5563 7692 ACBA C8D5 D4D1" $"DAE2 E5EB EEEA E4DA CFC7 BCAF A490 735B" $"493A 2F2A 2521 1E19 1514 151C 2830 333C" $"4F65 7E97 ABBB C7CC CDCD D2DF E9EF F3EF" $"E4D8 D1CC C0AC 9B91 846A 4F3D 342B 231E" $"1A16 1314 1C24 292B 2F3B 4B58 6E8E ACC2" $"CFD0 CCCC D2DA E3E9 EDED EFEC DECE C1B4" $"A48E 715E 554C 4136 2B1F 1510 1112 161E" $"2932 393E 444F 698A A0B0 C0CE D6DB DEDF" $"DFE1 E3E5 E2DA DADB D3C2 AA8C 7261 5142" $"3932 2C26 2017 100F 141B 252B 2E39 4A5C" $"7085 99AC BBC4 CBD2 D7E0 EDF0 E5DD DCDE" $"DFDB CEBC A999 846A 5446 3B32 2A22 1A14" $"1519 1B1C 1D21 2A37 4355 6D82 96AB B7BD" $"C6D0 D9E0 E4E7 E9E6 E4E3 DDD5 CEC3 AD96" $"826E 5C4C 3F35 2A1D 1617 1713 151C 2529" $"2B32 4053 687C 8EA5 BBC6 CAD5 E1E3 DFE1" $"E5E3 DCDC E7EA DAC3 AF99 826A 574C 4336" $"2B26 241F 1813 1317 1B20 2B39 4655 697F" $"919B A5B6 C7D3 DFEA EDE8 E2DF E2E4 E0D9" $"D4CB B8A0 8874 6452 4034 2B23 1B17 191B" $"1815 1922 2931 3D4F 667C 8E9C AAB9 C7D5" $"E1E5 E5E6 E5E9 EBE5 DFDC D9CD BAA3 8B76" $"6555 4334 2922 1D19 1919 1918 191D 262E" $"394B 647B 8996 A8BE CACF D6DC DFE3 E7E8" $"E9E8 E7E2 D4C2 B1A1 8E7E 6E56 4438 2B23" $"1F1A 1617 1715 181F 2631 3E49 596F 8598" $"A8B7 C6CF D5E0 EAE8 E5E8 EBE7 E1DB D5CB" $"BBAA 9780 6A59 4835 261F 1C1C 1C19 1516" $"191E 222A 3647 5A6D 8499 AAB7 C6D6 DBD7" $"D9E6 F0EE EDED E6DE D5C8 B8AA 9A85 6E5A" $"4938 2B24 1F1C 1815 1618 191C 242D 3744" $"576B 8094 A5B5 C8D2 D6DE E4E5 EBED E8E8" $"E9E0 D5CE C0AC 9885 745C 4335 2F26 1F1C" $"1916 1615 1519 212C 3744 5465 7A91 A5B9" $"C8CD D4E0 E7EA ECED ECEA E7DC D2CB C0B2" $"A28A 6F57 443A 3126 1B16 181A 1611 121B" $"242A 303D 4D62 7E94 A3B2 BFCD DCE1 DFE3" $"EAF0 F1ED E5DA D3CE C2B2 9C82 7166 5239" $"2A24 1F1B 140E 1016 181C 2226 2D3A 495E" $"7287 A2BC CBD0 D3D8 E0E8 ECEB E7E8 EBEB" $"E4D0 BDB2 A288 6E58 4942 3729 1E17 110E" $"1112 1317 1D27 363E 4354 728C 9FB1 BFCA" $"DBE6 E6E5 EAF1 F0EC E9E3 DAD2 CABE A58A" $"7664 5341 2F25 211B 1512 1010 1319 2026" $"2A31 435C 7081 97AF C3D1 D7D8 E1EB EEEE" $"F0F2 EBE5 E5DE CBB3 A092 8068 5141 362C" $"2119 140F 0D10 1519 1C23 2C35 4252 6681" $"9AAD BDCB D5E1 ECEE ECEE EDE7 E9EE EADE" $"CFBD A790 7864 5545 382C 1F16 1311 0F0E" $"0E12 1A23 2C37 4451 647C 8FA2 B8CB D9E4" $"EBEB EAEE F0EB E9E5 E1DF D7C3 AC94 7D68" $"5541 322A 231C 1611 0D0E 1315 181D 2530" $"4355 6578 8C9E B1C5 D5DF E7EF F4F1 E8E4" $"E7EA E8E2 D2BE AF9B 816C 5842 342C 231B" $"160F 0F14 120C 121D 2835 404B 5F7A 8FA0" $"B2C0 CCDC EAF2 F7F2 EAEB F0EE E2D6 D1CB" $"B99A 806E 5C4A 3B2B 1D17 1515 1410 0D10" $"171B 232E 3A4F 6676 859A AFC0 D3E7 ECE6" $"E9F5 F8F1 E8E5 E7E5 D7C3 B1A0 8F79 5F48" $"372A 221D 1711 0E0E 1317 1716 1F2E 3D4D" $"5C6D 849E B4C3 CDD4 E2F2 F4EE EEEE EEF1" $"EADE D6C8 B29F 8F78 5E49 3B2E 241B 1411" $"1312 0F0C 101A 252F 3A47 556C 889A A3B6" $"D0E3 E9E9 EBF5 F8F0 ECEB E3DD D7CA B9A4" $"8E79 6653 3B28 1F1C 1916 120F 0E10 1417" $"1C26 3546 5C70 7C8F ABC0 CCD7 E2E9 EDF0" $"F3F4 F4F2 EADE D3C6 B3A4 9681 6A51 392D" $"281D 1312 1210 0F10 1017 2127 3141 5066" $"7D92 A9C0 CCD5 E1EA EEEE EFF2 F6F4 ECE4" $"D6C4 B8A8 917E 6D55 3F35 291B 1512 0F0E" $"0F0F 1116 1F2B 3741 4959 7693 A6B7 CDDF" $"E8EA EAED F2F3 F1F0 ECE4 D7CA C2B3 987D" $"6956 4331 2520 1D18 1211 0F0A 0D17 2127" $"2D3B 5266 7688 A2BA CBD5 DCE5 EEF0 F4FC" $"FBF0 E8E4 DDCF BBA8 9C8F 7558 4335 2B22" $"1B16 110D 0E11 1313 1A28 373E 4455 718E" $"A3B7 C8D2 DCE7 EEF3 F5F3 F1F6 F4E3 D1C9" $"C5B9 A084 705F 4A37 2921 1C15 0D0E 1210" $"0F18 2126 2B36 4658 6E86 9DB6 CBD9 DFE4" $"E8EA EFF7 F9F1 E9E5 E3DC C5AE 9D8A 7059" $"493A 2F27 1F18 120B 080D 1216 1B22 2D3B" $"4654 6981 9AB0 BFCC D9E3 ECF3 F5F2 F0EE" $"E9E6 E1D3 C5BA A58B 745E 4A3B 3028 2017" $"100E 0C0D 0F13 1B24 2C35 4051 6880 97AC" $"C0CF D7DE EAF5 F9F6 F2ED E8E5 DFD6 CDC0" $"A98E 7A64 4C3D 3328 1E16 1211 0F0E 1014" $"181D 2733 4153 667C 97AD B9C6 D7E6 E9E9" $"F1FB FAEF E8E8 E5DA CBBC AE98 7B63 5244" $"3528 211B 130D 0C0F 1114 171F 2930 3C4E" $"657E 93A6 BAC6 CDDC EEF7 F6F2 F3F4 EFE6" $"E0DE D3C0 AB95 816C 5442 372D 2014 1214" $"1110 1213 161D 2530 3E4D 607C 94A3 AFC0" $"D4E2 EBF1 F5F7 F7EF E8E8 E5DD D0C2 B29A" $"7F6B 5946 3428 201B 150F 0E11 1414 1417" $"1F2A 394D 667D 8FA0 B4C3 C9D3 E4F2 F6F3" $"F3F5 F4EA DED9 D0BC A898 8976 5D48 3C2F" $"1F14 1010 1112 1215 1A1C 1F28 3545 5B72" $"8BA0 AFBE D2DF E3E6 EDF2 F2EF EDED EAE1" $"D3C4 AD94 8171 6050 412E 201A 140E 0C10" $"1213 1519 1F29 3746 566B 849A ACC0 D3E1" $"E7EC F0F2 F0ED EEF1 F2E9 D8C6 B19C 8871" $"5E51 4131 271E 1510 0F10 1010 1218 212B" $"3849 596A 7F94 A5B7 CDE1 EEF3 F3F2 F1F1" $"EFEC E7E5 DBC8 B4A5 947D 6753 3E2D 241E" $"1916 1514 1111 1315 1C27 3343 576B 7E94" $"A9BD CFDA E0E7 EFF6 F6F3 F4F4 F0E7 D9C8" $"B7A5 927E 6B58 4535 281D 1713 1111 1211" $"1114 1A25 3444 5363 778C A0B6 CCDF E9EC" $"ECEC F3FB F9F0 ECEA DECA B8AB 9A84 6F5A" $"4433 251D 1B19 140F 0C0D 1013 1824 323E" $"4D60 7285 9EB7 C8D5 E0E9 F1F2 EFF3 F7F5" $"EFE6 D9CF C4B1 9B88 735A 4333 281F 1715" $"1716 110E 0C0E 1724 2F39 475E 7589 9DB3" $"C6D3 DCE3 E6EC F6FC FBF8 F3E8 DACF C1AF" $"9B89 7763 4D3A 2B22 1C17 110C 090C 1114" $"1823 2E37 4455 697F 99B4 CAD7 DFE4 EAEE" $"F2F4 F5F7 F5EB DED2 C7B7 A18E 795E 473B" $"3228 1E16 1310 0D0B 0D12 1923 2D35 4255" $"677C 98B2 C3D2 E0E9 ECEC F1F7 F5F2 EEEA" $"E4D9 CBBA A792 795F 4B3A 2E26 211F 1A11" $"0C0C 0C0D 121D 2937 4452 6883 99A9 BBCD" $"D6D9 E3F2 FEFF FBF9 F3E5 D7CD C5BD AF97" $"7D6B 573F 2F26 1C15 110F 1111 0F13 1A1E" $"242E 3A4B 657F 98B2 C2C9 D7E3 E2E4 EEF5" $"F9F9 F4EB E3DA CAB7 A797 7D61 5247 382B" $"231C 140E 0B0C 0E11 171E 2630 3C48 5B78" $"92A7 BAC7 D3DD E6EE F3F4 F3F3 F0E6 E1DE" $"D1C0 AF9A 8068 5444 362D 2821 1810 0E0E" $"0D0F 141B 242E 3C4F 6073 8CA3 B2C2 D3DD" $"E7F3 F8F9 FAF7 EFE4 DFDB D0C3 B7A5 8B6F" $"5745 382C 221C 1715 1411 0E12 1619 1E28" $"3645 5B78 92A6 B5C4 D1D9 E0E7 EEF4 FAFB" $"F5F0 EBE0 D3C3 AE99 8574 6452 4033 2921" $"190F 0A0C 0F12 171D 242C 3643 556C 839C" $"B5C8 D2DA E7F3 F6F0 EDEE EEED E9E4 DBCB" $"B6A0 886F 5948 4038 2C1F 1611 0F0E 0C0B" $"1017 202C 3944 556F 8695 A5B6 CCE0 EDF4" $"F5F3 F3F0 EBE6 E3DF D9D3 C3A6 8C78 614D" $"3D30 271F 1B18 1511 1011 1011 1923 3245" $"5971 8797 A6B8 C7D2 DEEA F2F7 F9F5 F0EC" $"E7DF D4C7 B6A2 9181 6E58 4435 261C 1813" $"0F10 1112 1416 1B24 303D 4F64 7B96 ABB9" $"CADB E1E3 EBF2 F1EE F0F2 ECE5 DDCE B9A3" $"8F7D 6C5A 4A3B 2D22 1A16 120F 0F0F 0F14" $"1C26 313D 5068 7A89 9DB2 C2D6 E8EE EFF1" $"EFEE F0EC E6E0 DAD0 C2AF 9985 735D 4635" $"2C23 1B19 1916 100F 1213 161F 2D3E 5164" $"778C A1B3 C1CC D7E5 EEF2 F2F1 EFEB E9E7" $"DBC8 B7AD A18D 7965 4C39 3027 1C17 1516" $"1817 100D 1622 2D3A 4A5D 748A 9EB2 C4D1" $"DAE0 E5EA EEF5 FAF6 EDE5 DCCD BBAA 9C8B" $"7968 5643 3226 1E1A 1610 0C0F 1215 1C25" $"2E39 4453 6880 93AA C7D9 DCE1 E9ED EEEB" $"E7EA EEE8 DED5 C8B8 A38D 7B66 4E3F 362D" $"2520 1B17 130F 0B0F 1822 2D38 4455 6A7F" $"93A9 BDCB D6E3 E8E9 ECF0 F3F3 ECE3 DCD1" $"C2B7 AC96 7B68 5643 352D 241D 1917 130F" $"0D10 1720 2B38 434F 637B 91A7 BDCE D8DB" $"E0EB F1F2 F3F2 EAE0 D9D1 C7BA AA96 826E" $"5846 372D 2822 1A14 110E 0F14 1921 2B33" $"3E4D 5E74 90A8 BDCF D5D8 E1EC F1F2 EEE8" $"E6E7 E2D7 CBBC AE9D 8367 5244 3B35 2D24" $"1C17 110D 0C0E 151F 2B36 404B 5E78 90A1" $"AFBE D1E1 E8EB F0F5 F6EE E4DB D3CD CCC9" $"BA9E 806B 5C4B 392E 2924 1F1A 140F 1014" $"191D 222B 3A4F 6477 8C9F B2C4 CDD1 DDEE" $"F8F9 F6EE E5DD DAD7 CCBF B4A7 9277 5B46" $"3A35 2F23 1915 1516 1514 1419 222C 3947" $"5976 95A8 B5BC C2CE E0EB F1F6 F5EF ECE9" $"DDD3 CDC3 B2A0 8B74 6557 4638 2E23 1B15" $"1111 1214 181E 2229 3546 5B73 8797 A8BA" $"CBD8 E1ED F5F7 F4EC E3DD DCDC D5C9 B9A3" $"8D7B 6A55 4439 2D23 1B16 1416 1817 1618" $"1D25 3244 596E 859A AAB7 C7D5 DEE8 EFF1" $"F1EC E6E6 E8E0 D1C4 B6A7 927A 675B 4F3D" $"2C23 1F1B 1513 1415 1315 1D28 3340 5673" $"8995 A0B0 C0D0 DEE8 F0F5 F1EB EAEB E4D8" $"CFC7 B69F 8F84 7867 5440 2E21 1815 1618" $"1819 1B1B 1B22 2F42 5666 778E A5B7 C5D2" $"DEE8 EDED EBE8 E4E5 E8E5 D8C4 B2A5 9987" $"725D 4D41 3628 1B16 1719 1A18 1312 1824" $"3341 4F63 7B91 A2B0 BDCB DEEB EDE8 E7EE" $"EFEA E5E0 D6C8 B5A1 9388 7A6A 5946 3122" $"1D1F 1F18 1313 1518 1D25 303F 5163 7381" $"91AA C3D6 DFE0 E2EA EDE6 E5E8 E4DD D7C8" $"B4A4 978D 826A 4F3E 362C 231D 1A19 1815" $"1516 1A24 3341 4D59 6981 9CB0 C0D0 DDE6" $"E9E5 E1E5 EAED EEE5 D1C2 BBAF 9E8B 7968" $"5848 382D 2521 1D1B 1811 0C13 1F29 313D" $"4A59 6C7E 8EA3 BED2 DCE0 E3E5 E8ED EEE9" $"E4DB D2C9 BDAC 9D92 8672 5C46 352D 2822" $"1F1C 1714 1718 1C27 303A 4957 6277 97B2" $"C4CD D4DC DFE1 E8EC ECED EAE0 D6CA BAAB" $"A397 856F 5C4C 3E34 2C24 201B 1614 1517" $"1E29 333A 4451 6379 90A6 BDCF D8DC DBDD" $"E8F3 F4ED E7E1 D5C7 BDB4 AA9A 8572 604C" $"3D35 2F29 2219 1313 1417 1F28 3139 424F" $"5F73 8BA5 BCC8 CDD7 E3E7 E9EF F0EA E0D5" $"CFCD C4B9 B0A1 8A72 5C4B 3F36 2F2A 261F" $"1815 1617 1B22 2C36 404D 5F75 8AA1 B7C1" $"C6CD D6E5 F1F3 EFEC E4D6 CDC9 C2BC B39F" $"8C7A 604A 423C 3229 231C 1716 1616 1B24" $"2C32 3A49 5D71 869E B3BD C6D0 DBE5 EBED" $"F0ED E2D7 D0CA C8C2 B09F 9179 6053 493D" $"332D 261D 1713 141A 1F22 2833 3D46 566F" $"8799 A8B6 C4CF DAE5 ECF1 F0E6 DBD6 D1CC" $"C9C5 BAA6 8F7A 6756 483F 382F 241D 1A18" $"1A1C 1C1F 272D 3545 5B73 8898 A5B3 BFC8" $"D5E3 EDF4 F2E8 E1DA D2CF CBBF B3A6 9480" $"7060 4F41 382C 221D 1B1A 1B1F 2020 242A" $"3443 546B 8499 A5B0 BCC8 D5E2 E9ED EDE7" $"E1DD D8D1 CBC3 B5A3 907E 726B 5A46 392F" $"231C 1A1A 1C1F 2122 2428 3140 526A 8190" $"9FB0 BBC6 D5E1 E5EA ECE7 E1DC D5D7 D8C4" $"AEA2 9384 7A6C 5A4C 3E2F 241E 1A19 1D21" $"2222 2125 3344 5261 7389 A0AD B5C6 DAE4" $"E9E8 E3E0 E0E0 DFDC D1C1 B5A8 9686 786B" $"6051 3F2E 2521 1D1F 211D 1A1D 242A 323D" $"4D64 7A89 93A2 B7CB D8DD E3E8 E5E4 E5E1" $"DBD8 D4CB BCA6 9289 8277 664F 3D33 2C25" $"201E 1D1F 211F 2028 3241 535F 6C80 93A4" $"B8CB D4DB E3E6 E5E4 E2E0 E1DF D5C4 B3A7" $"9F93 8372 6250 4337 2920 2022 221F 1B1C" $"2229 313E 4D5B 6C7F 91A2 B4C6 D6E1 E5DF" $"DBDF E7E9 E4DB D0C6 BDAE 998B 857A 6957" $"4434 2D29 2521 1D1C 1C1D 222A 3340 4E59" $"6475 879C B5C8 D5DD DDDB E4E7 DFDA DEDD" $"D5C9 B9A9 A499 8574 6451 4237 2F2B 2823" $"201E 1B1A 1E27 3341 4C56 6472 859E B0BD" $"CFD9 D9DD E6E5 E0E0 DED6 CEC5 BAAE A398" $"8A7B 6850 4039 322B 2725 221F 1C1A 202A" $"333C 4856 6471 849E B2BE CAD5 DADC DCDF" $"E6E8 DFD5 CFC3 B5B0 AD9F 8A77 6859 493A" $"312F 2C28 201A 1B1F 2128 353E 424C 5E73" $"8597 A9BD CDD1 D2D6 DDE3 E6E4 DDD3 CBC7" $"BFB3 A69C 9283 6A53 4641 3A32 2C26 2220" $"1E1E 232A 303B 4A54 5A67 809C B0BA C3CE" $"D6DD E0E0 E5E8 DDCF CBC7 BCB4 B1A6 917B" $"685A 4D42 3832 2F2C 251F 1E20 232A 333A" $"414A 5B75 8A94 A1B3 C1C9 D1D8 DEE6 EAE5" $"DCD2 C7C2 C1BD B2A2 9285 745E 4D43 3C36" $"2F29 2422 2224 272A 2D35 3E4A 5B6E 8196" $"AAB6 BDC2 CAD5 DFE6 E9E7 DCD1 CBC5 BEB9" $"AFA2 9484 6F5F 5449 4037 2D28 2522 2125" $"2A2C 3035 3B46 5669 8097 A6AF B9C6 CFD5" $"DBE0 E2E1 DCD7 CFC6 C1BD B2A1 9080 7266" $"5C4D 3F37 3027 2324 2524 262E 3436 3842" $"576C 7D8D 9FB0 BAC2 CCD6 DCDF E0DE D8D1" $"CBCA CAC3 B19F 9386 7465 5A4F 463B 312B" $"2521 262B 2B2A 2A32 3E49 5569 7E8E 9DAB" $"B6C0 CBD3 DCE3 E3DB D4D4 D4CE C6BB B0A3" $"9484 776E 6255 4A3B 2C26 2628 292B 2C2B" $"3035 3842 5468 7C8A 99A9 B7C3 CFD8 DBD7" $"D5D9 DBD7 D0CD CEC6 B29F 8F81 7770 6657" $"493C 342E 2824 2428 2B2D 2E35 4049 515F" $"7284 92A0 B5C9 D1D3 DADF D7CE CED0 D3D8" $"D1C2 B7A9 9382 786C 6157 4C42 372E 2D2C" $"2925 2224 2B35 3F4B 5B67 717D 8A98 ABBC" $"CCDB E4DF D4D3 D6D0 CAC9 C7BD B6AE 9E8E" $"8172 5F50 453B 3330 3131 302B 2626 292E" $"3643 5667 7582 8D9A ADBD C4CD D7D7 D6D8" $"D9D8 D4CF C9C0 B0A2 9A93 8777 6A58 463C" $"3632 2E2E 2F2C 2727 2B30 3A48 535D 6C7C" $"8C9D B1BF C7CD D1D0 D0D7 DAD8 D7D4 C7BA" $"B3A7 9C95 8674 6A5E 4C3E 3935 3331 2C28" $"2729 2E35 3E46 4F5B 6A76 859A AFBE CAD2" $"D2D1 D4D8 D7D6 D4CE C7C1 B9AE A297 8C7E" $"6953 4641 3E39 3433 302B 2827 2932 3D46" $"4D5A 6D7B 889E B2BC C1C6 CBD0 D5D7 DBDF" $"DDD2 C3B6 AFAC A69B 8E7D 6B5C 4E40 3A38" $"3531 2D29 2A2E 3034 3D43 4853 6073 8DA3" $"AFBA C4C7 C4C8 D2D9 D9D8 D7D1 C7BF B7AB" $"A19A 8E79 665A 534B 433A 332F 2B2A 2A2B" $"3037 3D43 4953 606F 869E AEB5 BCC6 CCCD" $"D1D7 D9D8 D3C9 C0BB BCB9 AC9C 8E7A 6356" $"504B 433D 3A34 2C27 292E 3134 3940 4956" $"6475 889A A6AF BAC1 C4CD D9E1 DFD5 CAC6" $"C2BB B7B6 AFA2 917D 6B5F 5449 403C 3732" $"3231 2F30 3237 3A3B 414E 6178 8E9D A9B3" $"B8BB C1CA D0D6 DADB D7CC C0BF C0B8 A998" $"897C 7064 5B55 4D41 342E 2C2A 2A31 3A3D" $"3A3C 4652 5D6B 8096 A8B1 B6BF CDD4 D6D7" $"D2CA C7C6 C9CD C6B9 B0A1 8A77 695F 5B56" $"4B42 3C32 2C30 302C 2F37 3B3E 434F 6279" $"888E 97A6 B4BB C4D4 DBD8 D5D1 C8BF BEC3" $"C6C1 B39F 8C7E 756A 594F 4A41 3A35 302F" $"3437 3734 3134 4150 5F74 8A94 9BA7 B0B7" $"C1CC D1D3 D4D2 CFC9 C7C8 C2B4 A89D 907F" $"726F 695A 4A3F 352D 2D31 3335 3634 363C" $"434B 586D 808C 97A5 B3C0 CAD0 D3CF C9C6" $"C6C9 CFCF C8BF B19E 8B7D 756E 645B 4F42" $"3A35 3534 3332 3130 333B 4553 6572 7B85" $"8F99 A8B9 C9D6 D7D2 CBC8 C8C7 C5C4 C3BC" $"B1A4 978B 7E6F 6255 483E 3A3C 3D39 3637" $"362F 2C33 4050 6375 848B 8F9A A9B6 C0C5" $"CBD3 D7D3 CECC CBC8 BFB0 A5A1 9A91 8D82" $"6B56 4A3F 3531 343A 3E3D 3934 3337 3E48" $"5665 7387 9EAB AFB9 C3C5 C5C3 C2C6 CFD7" $"D8CF C4B8 A999 908B 837B 7062 5446 3A37" $"3937 3533 3233 3940 444C 5966 6F7A 8999" $"ABBD CACC C7C3 C2C3 CBD1 CDC9 C3BB B2A7" $"988F 887D 6B59 4B45 4441 3C3A 3831 2D2F" $"3439 4351 5C63 6E7D 8897 A8B6 C0C5 C6C7" $"CACC CDCD CCC5 BEB5 AAA4 A49C 8F7C 685B" $"5145 403F 3C3A 3B39 3433 3639 424C 5259" $"687D 91A1 ABB4 BBBF BEBD C2CB CFD0 D3CD" $"BFB2 ADAA A194 877B 7166 584C 4743 3E37" $"3331 3336 3B42 484A 4E5A 6873 8197 ACBA" $"C1C4 C0BA BFCB CDCB C8C1 BEC0 BAAB 9E98" $"8D7B 6A5E 5852 4D49 443B 3431 3235 383E" $"4850 545B 6876 8494 A4B1 B8BC C2C7 C9CA" $"CAC9 C6C0 B6B4 B6B1 AAA2 927F 6E5B 5152" $"4D43 4043 3D33 3337 3B3D 3F44 4F5B 6578" $"8FA0 A8A9 AFB7 B9BD C9D0 D2CF C7BE BAB6" $"B1AB A8A0 9181 7164 5C56 4E45 403A 3437" $"3C3B 3B40 4447 4C55 6376 8797 A7B1 B0B3" $"BDC4 C6CA CBC8 C5BF BAB8 B6B4 AC9D 8C80" $"7263 5C5A 5147 413C 3937 3439 4040 4044" $"4B55 6377 8A98 A1A5 AAB3 BBC2 C8CB CECD" $"C3B9 B9B9 B3B0 ACA0 8E81 7669 615B 5147" $"3F3B 3B39 3940 4240 3F42 4752 657A 8997" $"A0A6 ADB0 B5BF C7CC CEC9 C2C0 BDB8 B4AD" $"A59C 9085 7C72 675D 5448 3931 353F 4343" $"4141 4241 4450 5F6F 8296 A5AC ADAF BAC5" $"C4C0 C1C2 C3C4 C3BF BBB2 A598 8B7C 7373" $"7266 5549 3F3A 3A38 373D 4242 4346 4B51" $"6075 848A 92A1 B0BA C0C3 C0C2 C8C6 BCB9" $"BDBF BEB8 A998 8C81 7D78 6A5D 564E 433D" $"3A38 3C41 413F 4042 4859 6870 7A88 94A1" $"ADB2 BCC8 C8C3 C0BE BDBD BDBE BCB0 A39D" $"9586 7A73 6C67 5C49 3D3A 3B3F 4241 3E3E" $"4145 4B54 5F6D 7E8B 969F A8B4 C3C8 C4C0" $"BDB9 BDC3 C2BE BDB6 A89A 8F85 7C76 7165" $"564B 4641 3E3E 3E3A 393C 4147 4E57 6675" $"797C 889C ACB6 BDC6 CAC7 BEB8 BCC2 BFB8" $"B5B2 AA9C 928F 8774 655F 594E 433E 4043" $"413C 3B3C 3E42 4C5C 6B70 7480 8D97 A5B6" $"C0C6 C9C4 BEBD BCB8 BABD B7AD A8A6 9A88" $"7E79 6E60 5149 4846 4444 403B 3A3B 3E45" $"4D57 626F 7A81 8997 A8B8 BFC0 BFBF C1C6" $"C3BC BBBA B3B0 AA9C 938F 887D 6F5F 514C" $"4B49 443E 3B3D 3E3C 3D48 5459 606A 757F" $"8B97 A6B4 BEC2 C2C3 C5C2 BABC C3BC ADA7" $"A6A2 9D96 8A7C 6E60 574F 4643 4747 4340" $"3B3B 4246 4A56 6267 7183 8F99 A6B0 B9C0" $"BDB8 BDC8 CBC5 BCB6 AFA4 9FA3 A396 8A82" $"7563 554C 4B4A 4540 3F3F 3E3F 4245 4A52" $"5C68 717A 889B ACB3 B2B3 BAC0 C2C2 C4C6" $"BFB4 B1AD 9F97 9D9F 9280 7265 5C55 4F48" $"4240 403D 3C42 4649 4F55 5A5F 6674 8A9E" $"AAAF B4B9 BCBE C0C1 C2BF B8B5 B0A8 A8AA" $"A49A 8C78 6A66 5F56 5354 4D42 3B3B 3D3C" $"4149 4F55 5B60 6E80 8C92 9CA9 B2B6 BBC1" $"C4C5 C9C5 BAB0 A9A5 A8AA A299 9185 756A" $"6057 524D 4643 403D 3C40 474D 504F 515E" $"6E7A 8593 A5B2 B2AF B8C3 C5C6 C8C1 B8AF" $"A9AC ADA6 A09C 9182 7369 625C 584F 4641" $"3B3A 434B 4948 4C51 5558 6178 909A A2AC" $"B2B2 B6BE C4C4 BEBA BBB9 B1AA AAAB A394" $"867C 756F 6A67 5F51 4842 3B38 3941 4C52" $"514F 535D 6775 8490 9BA3 A9B6 C1C1 C2C8" $"C6BA B1AB A7AC B2AD A29A 9081 736D 6A64" $"584D 4842 3C3C 4148 4B46 434C 545B 6778" $"8895 999B A7B3 B6BC C8CA C2B9 B3B0 AEAA" $"A6A7 A598 8780 807A 6D64 5E52 433A 3B40" $"464B 4C4B 4B49 4B57 6775 818E 9BA2 A7AE" $"B6BF C3BF BBB8 B3AE B0B2 B2AC 9D8C 8784" $"7B75 7672 6655 4439 393D 4248 4B4C 4C4C" $"515C 676F 7B87 8F98 A6B4 C1CB C9BF B7B0" $"ACB0 B5B5 B3AE A496 887F 7A79 766C 6156" $"4B43 3F40 4245 4644 454B 525F 6F78 7C80" $"8894 A2AF BCC9 CEC4 B9B5 B1AC ACAF AFAB" $"A497 8D87 827D 7569 5F54 4743 4646 4648" $"4641 4247 5261 6B72 7F87 858E A0AE BBC9" $"C9C1 BBB6 B2B3 B4AF A9A4 9D99 9287 8284" $"816F 594A 484A 4645 4949 4441 4247 525E" $"6875 8080 828F A1B3 C1C4 C2BF BBB5 B1B4" $"B5AF ACA9 9B8C 8D93 8F84 7669 5E55 4C46" $"4546 4844 4041 4348 5464 6C6F 7278 8496" $"A2AD BDC8 C6BE B7B3 B6BA B6AF A69E 9B9A" $"9493 8F83 786C 5A51 4F4A 4A4E 4B41 3D3F" $"4149 5760 6670 777A 808E A2B5 BFC0 BDB7" $"B6BE C0B9 B1AD A8A0 9693 989A 9287 7B6A" $"5A51 5051 4E49 4442 4242 4045 5462 686A" $"6D73 849A A6AC B6BC BBBB BEBC BCC0 BDB0" $"A298 9496 999B 978B 7E6F 5E53 504D 4B4B" $"4541 4240 4453 5956 5C65 6A74 8594 A4B8" $"BAB4 B4B5 B8BE C1C0 BCAF A29A 9697 9999" $"938C 7E6B 615D 5753 4D42 3D40 4040 4B58" $"5A56 585C 626F 859A A9B2 B5B4 B9BA B6BA" $"C4C2 B6AC A49D 9C9C 9B9B 9383 756C 6864" $"5B55 5247 3C38 3A41 4A50 565B 5C5A 6272" $"8190 A4B2 B3AF B0B8 C1C5 C2BD B5A9 9E99" $"99A1 A29A 928B 7968 6364 645C 4E40 3C3C" $"3E43 4B51 5555 565A 6170 8699 A1A4 AAB1" $"B6BB C0C5 C5BD B1A6 9E9C 9FA2 A29D 9080" $"7976 7065 5C56 5044 393A 4148 4F53 5152" $"5353 5C76 8B94 9EA9 ADAD B1BB C4C6 C2B9" $"B0A9 A49F A3A8 A496 8A81 7974 6F6E 6E61" $"4A3B 3939 3E4A 5252 5250 4E56 6270 8393" $"9CA2 A7AD B8C2 C6C8 C3B6 AAA3 A2A6 ABAB" $"A499 8A7D 7674 7575 6C5B 4A3F 3A3A 4149" $"4D4F 4E4E 5259 6573 8291 9798 9FB0 BFC6" $"C9C9 C1B5 A9A2 A3A6 A9A9 A69C 8E81 7875" $"7671 6457 4D44 3D3F 474C 4C49 4545 4958" $"6D7A 838D 9495 9AA8 B8C3 CBCC C1B4 ACA5" $"A1A7 AFAA 9B90 8D89 817C 7A75 6956 443D" $"3E40 454D 514B 4442 4A58 6774 828A 8D90" $"9CB0 BFC7 C8C2 BCB6 ACA8 A8A8 ACAD A294" $"877E 8085 8071 6556 4640 4043 484B 4846" $"4542 4656 6D79 7E84 868D 9CAE BBC8 CFC7" $"B9B1 AAA7 A9AD AEA9 A091 888B 897E 7974" $"6755 4642 454A 4E4A 443D 3A3F 4C5D 6D77" $"7E84 858A 97A8 BAC7 CBC8 BFB7 B3B3 B2AA" $"A19D 9C97 8F8E 9495 866D 594C 4340 464F" $"534E 4743 413E 4250 6374 7E80 8392 A4B1" $"BBBE BDBB B7B6 B9B8 B6B8 B2A2 8F87 8B93" $"9692 8778 6654 4941 4046 4B4A 4946 3F3F" $"4E5F 6363 6B75 8092 A8B8 C1C4 BFB5 AEB1" $"B5B9 BDBB B0A2 9691 8F8F 8E8A 8379 6B59" $"4D49 4B4C 443B 3A3E 4249 525D 6465 676F" $"7987 9CB6 C6C6 BFB7 B3B6 B8B6 B2B0 ABA3" $"9C98 9799 958F 836E 5B53 5252 514E 4840" $"3B38 3944 525C 6065 696B 7991 A2B0 B9B9" $"B8BB BAB8 BBBF BDB5 A696 9095 9DA2 9C8E" $"7E6F 645A 524D 4E4C 463F 3C3C 424B 5257" $"5958 5D6C 7F92 A4B1 B9BC BAB3 B0B7 C2C3" $"B9B0 AAA1 9B9C 9C9A 9990 7D6C 6562 5C56" $"544C 3F38 373B 434B 5158 5D5E 6064 728A" $"A3B1 B8BA B8B7 BDC0 BDBC BAAF A29B 9DA7" $"AAA3 9A8E 7968 625F 5F60 594B 403B 3736" $"3F4B 5251 525A 626D 7F91 9BA3 AEB3 B2B4" $"BFC9 CBC4 B6A6 9C9A 9FA3 A6A7 9E8D 7C72" $"6A61 5A59 5549 3B38 3E42 464B 4D4E 4E4F" $"5766 7F96 A3A8 ACAF AEB1 BEC6 C5BF B9B2" $"A69C 9EA7 A9A1 9487 7D77 716B 655E 503F" $"3739 3A3E 4952 524C 4749 576A 7B8C 9CA5" $"ABB0 B3B9 C2C5 BFB8 B1A7 A5A8 ACAD A89F" $"9787 7670 7071 6C61 5245 3D39 3A40 4547" $"4749 4E56 5D68 7C90 9797 9CA9 B7C1 C6C9" $"C9C1 B0A2 A2A4 A2A6 ACAA 9C8A 7E7C 776C" $"6057 4F48 3F3B 434B 4A47 443F 3F4A 5C74" $"888D 929E A2A3 ADBA C3CB C9BD B5AE A3A6" $"B0AB 9F9B 978F 8781 7C77 6E5B 463B 3C3E" $"404A 534E 4341 454A 5468 7D8B 939A 9FA8" $"B7C4 C5BF BDB8 B0AD ACAD AFAF AAA0 8F82" $"8184 7D74 6D60 4D41 3F41 4344 4542 4144" $"4951 5D6E 7C82 858E 9DAA B4C2 CECA BCB3" $"AFA9 A5A9 ADAD AA9E 928E 8C85 796F 6658" $"4944 4547 4948 4642 3B38 3F4D 6174 7D7F" $"8791 99A4 B3BE C1C1 C0BA B1AD AFB1 ACA3" $"9D95 908F 8F8D 877D 6955 473E 3A40 474C" $"4D46 3E3D 4551 5861 6E79 8694 A1AF BCC2" $"C0B9 B1AA ACB3 B8B8 B1A9 A49B 8C84 878A" $"857B 6F61 5045 4344 423E 3A3C 464B 4C52" $"5E68 6D6E 7385 9EB1 BFCB CBBD B4B0 ABA7" $"A9AE B2B1 ABA0 9592 9086 7B70 6359 5657" $"5048 4743 3B37 383D 4757 656B 6F75 7B83" $"92A5 B6C1 C3C0 BEBA B3AF B2B1 AAA1 9C9B" $"9E9F 9A8F 8173 6556 4F4E 4C4C 4B47 423C" $"3A3C 4553 5C62 6971 7E90 9DA6 B2BE BEB8" $"B3B3 B9BF BBB2 ACA5 9994 9B9D 9691 8A7A" $"6960 564A 4849 4541 3E3E 4045 4D53 575C" $"636B 7584 9CB1 BDC0 B9B3 B7B9 B4B3 B3AD" $"A8A8 A6A4 A19B 9591 836E 625C 5A5D 584A" $"4343 3D37 3840 4950 5863 696B 768C 9CA3" $"ABB3 B7BD C0BD BBBD B9AD A19A 9CA1 A5A6" $"A193 8073 6C61 564F 4E4F 4A42 3F3B 3C45" $"4B4A 4D55 6171 848F 949F AEB5 B4B5 B9BD" $"BFC0 BAAF A59F 9E9F 9F9E 9C98 8A76 6C67" $"5D52 4C48 403D 4043 4547 4649 5057 5961" $"778E 9DA9 B2B6 B7B4 B3BA BFB8 B0B1 B1A6" $"A1A4 A7A4 9987 7C7A 7165 6262 5847 3C3B" $"3B39 3E48 4B4C 5053 5B6A 7781 90A3 ABAF" $"B6BA BCC0 C1B9 B1AC A4A1 AAAC A4A0 9C92" $"867B 7069 6359 504B 433B 3A41 4545 4445" $"4A51 5966 7686 959F A5AE B8BA B8BC BEB8" $"B3AF ACAC A7A2 A7A8 9A8B 867F 736E 6B5F" $"5348 3C39 3D3F 4144 4549 4C4D 5565 737D" $"8E9C A5AD B5BB C0C0 BBB6 B1AB ACAD A9AA" $"AFA8 9B8F 8279 7675 6D62 5448 423F 3A3A" $"3E41 4447 4950 5B67 737B 8492 9FAB B8C2" $"C4C1 BEBA AEA0 9DA9 B4B3 ADA7 A197 897E" $"766B 615C 5A54 483E 3D43 443C 363B 454F" $"5B69 7783 8991 9AA2 A8B4 C4C9 C2B9 B2AD" $"AEAD A3A2 AAA9 9E97 9186 7A75 705F 4C44" $"4446 4543 3F3C 4045 4447 5463 727E 888D" $"96A3 B3C0 C3BB B8BB B8B0 ADAB AAAD ACA6" $"A299 8D88 877B 685A 534C 4843 3F41 4540" $"3B3D 434C 5561 707A 808A 9BA8 AFB8 C0C4" $"C3B9 AEAC ADAF B1B0 ACA7 A29C 9389 7F73" $"6B62 554E 4944 4445 413B 3939 3E4B 5964" $"6F7A 848B 929E ACB7 BFC3 BEB8 B6B5 B2B1" $"B0A9 A2A1 A19F 9A90 867F 725C 4D49 4A48" $"4341 4341 3C39 3D49 565D 6471 7E88 92A3" $"B5BA B6B5 BBBE B8B0 AFB2 B2AD A5A2 A19C" $"9693 8E80 6C5E 574F 4744 4343 4240 3C3B" $"3F45 4D5B 696E 7789 9BA3 A8B1 BCBF B8B1" $"B4B9 B6B4 B1AB A7A4 A2A2 9D92 857C 7366" $"564D 4C4D 4940 3A38 383C 4347 4D58 626F" $"7E86 8C9A AAB4 B8B8 B6B8 BBBD BCB4 A7A1" $"A6A8 A19F A29E 8F7E 7164 5951 4945 4443" $"403E 3F40 3D3D 4A5B 6164 7286 98A4 ABAF" $"B2B4 B6B8 B7B6 B7B8 B5AF A6A0 A1A4 9E96" $"8F82 746B 6255 4C45 4041 3F39 393F 474C" $"4B4C 5663 6F81 96A3 AAB2 B5B5 B5B3 B5BA" $"BAB6 B1AC AAAC ABA2 9892 8B83 796B 605B" $"554B 4139 3639 3E41 4347 4C4F 5868 7277" $"89A1 ADAF B2B6 B8BA BCB9 B4B1 B0AE A9A9" $"ABA6 A19A 8E82 776B 635D 5448 403D 3B3C" $"4040 3F42 454B 5760 6D84 959C A5AC ACB1" $"B9B9 B7BA BBB8 B2AC AAA8 A5A5 A196 8E87" $"7D74 6B5E 4F43 3E3B 3B3E 4140 4246 4548" $"515D 6B7E 8E9A A4AC B1B6 B9B7 B6B9 B6B4" $"B4B1 AFAC A9A6 A198 8A81 7F79 6B5D 524D" $"463A 3438 3D40 4345 464B 515D 6E7A 8391" $"9FAA B3B9 BBBD BCB9 B4B0 ACA8 AEB8 B7AB" $"A29C 9284 756C 6D67 5950 4940 3C3B 3B3C" $"3C3B 414C 5964 6E7B 868D 959F A9B3 BFC6" $"C4B9 B3B5 B3AC A6A6 AEB4 AD9F 938A 7F75" $"6C62 564D 4541 4543 3A39 4041 4046 4F5B" $"6E7D 8289 97A3 AAB2 BBBF BCB8 B6B5 B1AE" $"AEB0 B2AD A098 968F 847B 6F63 5B4F 4441" $"3E39 3D43 403B 4049 525D 676F 7C8A 949E" $"ACB7 BDBF C0BA B0A9 ABB0 B4B5 B4AD A69F" $"958B 8377 6C64 5E54 4A44 413E 3E3B 383A" $"3F45 505E 6A75 7F84 8B9A A7AE B7C0 C2BE" $"B7AF AFB1 AEAD AEAA A7A2 9891 8C81 7264" $"564C 4845 4344 443E 3939 3B42 4F5B 6673" $"7D84 8B97 A5B2 B9B9 BABC B9B5 B3B3 B1AE" $"ABA6 A3A1 9C96 9187 7461 554D 4844 4142" $"4745 3C3A 3D41 4753 626D 7684 939E A6AC" $"B3B8 B7B5 B3B3 B8B9 B5B2 ADA4 9F9E 9E9B" $"9181 7671 5F4A 4648 4645 433D 393A 3E45" $"4E56 5C66 7684 8E95 9EAC BABD B5AF B2BC" $"BFB7 B0AE A8A7 A6A1 9B99 958C 7F6B 554C" $"4D4B 4744 3F3E 3F3E 3E42 4A52 5D6B 7275" $"849B ACB2 B1B0 B3B8 B9B5 B2B4 B7B4 AAA4" $"A3A2 A1A1 9683 7469 5F5B 5449 4344 433F" $"3A37 3C47 5157 585C 6A7E 8B95 A3A9 AFB9" $"B5AE B4BA B9B7 B6AF A5A4 A8A8 A6A0 9386" $"7B6F 6155 5052 5045 3C38 373D 4749 474C" $"5965 6D74 8095 A5A9 ACAF B0B3 B9BD BCB7" $"AEA7 A7A9 A6A1 A1A2 9D8F 7B68 6061 5D4E" $"4342 413E 4346 4245 4D51 5359 6374 8898" $"A2A7 ABAE AFAF B3B6 B6B6 B3AD ABA7 A0A6" $"ACA0 8E84 7D75 6E65 5A54 4F44 3D3E 4045" $"4A4C 5053 5357 6473 8592 9AA1 ABAF AEB1" $"B3B4 B7B4 AAA6 A8A6 A7AF AC9B 8D85 7B73" $"6F6B 6357 4D46 4241 4144 4A50 504C 515D" $"6B77 808B 98A0 A1A4 ACB5 B7B6 B7B3 A8A2" $"A4A8 AAA9 A39D 968B 7F77 7067 605B 5245" $"3F43 4C50 4E4A 4B50 555A 6273 868F 929B" $"A2A2 A6B0 B7B8 B2A8 A4A8 A9A6 A5A6 A59D" $"9287 7F79 7772 6554 4A49 4A49 484B 5152" $"4F4D 5059 6675 8189 9094 99A6 B1B1 ADAD" $"AFAD A5A0 A5AB AEA9 9E95 9189 7F7C 7C73" $"645B 554C 4648 4E52 514D 4A4F 5961 6874" $"7E81 8590 9BA2 A9AF B6B7 AC9F 9DA2 A5A8" $"AAA6 A09A 9189 847D 7873 695D 524C 4C52" $"5250 4F4D 4C4F 5760 6B75 7D81 848A 94A0" $"ABB3 B4AF A8A3 A3A3 A1A4 A8A6 9F99 958E" $"8781 7B73 675A 5351 5557 5451 5150 4D4F" $"5762 6C74 7A80 878B 939E A7AD ADA9 A7A7" $"A5A2 A5A8 A5A0 9A93 8F8E 8E8A 7F72 685E" $"5552 5456 5757 5450 4F53 5960 6C75 7676" $"808F 989D A4A9 ABA9 A29F A3A6 A6A6 A39E" $"9994 9192 8F86 7D75 6B60 5956 595B 5955" $"5250 5358 5E62 676F 757A 7F86 92A0 A7A7" $"A4A3 A1A0 A2A5 A6A4 9F9B 9997 928E 8D8C" $"8274 6760 5D5D 5C5A 5A58 5353 5657 5B63" $"6B70 7378 7B87 979D 9EA1 A2A2 A0A0 A4A6" $"A5A3 9E97 9291 9395 928A 7F77 6E66 5F5B" $"5B5C 5B5A 5856 575E 6466 6465 6D77 7F89" $"959E A2A1 9C99 9C9E A0A5 A8A2 9B97 9696" $"938F 8C88 8179 7069 6665 615C 5856 5659" $"5D60 6366 6A6C 6C6F 7988 949B 9E9F 9C9A" $"9DA0 9F9D 9D9E 9C9A 9895 9595 8F83 7A74" $"706E 6D6A 6560 5C59 5758 5D61 666A 6B6B" $"6E74 7C86 8D91 959A 9EA0 9F9E 9FA1 9E96" $"9194 9798 9795 8F87 7E77 716D 6968 6764" $"605D 5C5E 6163 6364 666B 7076 7E87 8D91" $"9696 9497 9EA1 A19F 9B97 9593 9293 9594" $"8E86 8079 7472 706A 6662 5E5E 6163 6365" $"6666 6769 6C73 7F88 8D8F 9193 9699 9B9B" $"9C9C 9995 9495 9596 9591 8A83 7D7A 7977" $"726C 6763 6161 6162 6568 6766 686C 7077" $"7E82 878C 8E8F 9399 9C9C 9B9A 9692 9092" $"9496 9490 8C86 817C 7875 736E 6865 6464" $"6568 6866 6767 686A 7079 8084 8689 8D8E" $"9195 989B 9B98 9492 9393 9293 928D 8885" $"8380 7D79 746D 6966 6565 676A 6B6A 6968" $"696D 7277 7B81 8588 8B8E 9396 9696 9694" $"918F 9295 9593 908C 8884 807E 7D7B 7872" $"6C69 6868 696B 6C6A 696B 6D6F 7278 7D7F" $"8083 888D 9395 9695 9491 8F8E 9091 9192" $"918D 8883 8181 7E7A 7672 6E6D 6C6C 6D6E" $"6C6A 6A6B 6D72 767A 7D7E 8083 868A 8E91" $"9494 9290 8F90 8F8F 8F8D 8B89 8887 8582" $"7E7C 7972 6D6C 6D6F 7070 6F6F 6E6D 6E72" $"7577 7A7E 8284 878B 8F90 8F8D 8D8E 8E8E" $"8F91 908D 8A87 8583 8382 817D 7875 7370" $"6F6F 7070 706F 6F71 7374 777A 797A 7E82" $"868A 8D8E 8F8E 8C8B 8B8D 8D8C 8D8D 8A87" $"8786 8381 7F7D 7976 7473 7373 7371 7171" $"7172 7476 787A 7B7D 7F80 8387 8A8B 8B8C" $"8C8B 8B8C 8B8A 8988 8787 8786 8582 807D" $"7977 7575 7575 7576 7473 7374 7576 787A" $"7B7D 7F81 8486 8888 8888 8989 8B8B 8B89" $"8887 8685 8484 8383 817E 7B79 7877 7676" $"7675 7676 7677 7779 7A7A 7B7C 7D80 8486" $"8787 8887 8787 8787 8887 8786 8585 8484" $"8381 7F7D 7C7B 7B7A 7979 7878 7777 7778" $"7A7B 7B7B 7C7D 7F80 8183 8485 8586 8686" $"8686 8585 8483 8484 8483 8281 807E 7D7C" $"7C7C 7B7B 7B7A 7A7A 7A7A 7A7B 7C7D 7D7E" $"7F80 8182 8282 8383 8384 8484 8383 8382" $"8282 8282 8181 807F 7E7E 7D7D 7D7C 7C7C" $"7C7D 7D7D 7D7D 7D7D 7E7E 7F80 8081 8181" $"8181 8181 8181 8181 8181 8181 8180 8080" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F80 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080" } }; resource 'snd ' (21019, "Fire Horn", purgeable) { FormatOne { { /* array Synthesizers: 1 elements */ /* [1] */ sampledSynth, 160 } }, { /* array SoundCmnds: 1 elements */ /* [1] */ hasData, bufferCmd { 20 } }, { /* array DataTables: 1 elements */ /* [1] */ 12054, Rate22K, 12052, 12053, 0x0, 0x3C, $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 807F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F80 8080 8080 8080 8080 8080" $"7F7F 7F7F 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 8080 8080 8080" $"7F7F 7F80 8282 817E 7A7D 8081 817D 8086" $"837E 7974 7579 7A79 7C84 8881 766F 7380" $"8580 808C 99A0 9C89 756E 7274 7274 7784" $"8A7B 7B7F 7E80 7874 7E90 9F9E 9383 6D6C" $"776C 646E 7A82 8074 6C67 656A 646C 8FA0" $"A7A8 8D81 888E 8D7A 7C97 A3B2 B6A0 988E" $"7B7B 7E83 95AB B3A2 8C82 7769 6766 677E" $"908B 8C87 786C 6674 7C83 9EA6 947F 7A7F" $"726C 7373 85A1 A39B 9987 757E 8077 8499" $"A8A2 8570 6660 6252 475A 666B 7A77 6659" $"5453 5B6E 726D 6865 5F54 5E61 403C 5865" $"6B71 6D68 686F 7070 8393 9188 8085 877E" $"7D74 6C74 7F81 7A71 6E6E 6F76 807F 8D9A" $"8176 7E75 787F 767C 8EA1 AFA8 978A 92A0" $"A0AA B2AB B4B0 99A1 B09E 8B88 8791 A19F" $"8361 5554 5867 737D 8886 7E6E 503B 383D" $"4D5E 6F83 9496 7D64 6772 889F A7B8 C4BD" $"A68C 7E71 7181 8F9C AFB3 A491 755A 5467" $"6D6A 7F93 9284 7261 4C40 434E 6885 9596" $"8876 696A 7B8E A0B2 CAD3 BAA1 9183 7B7E" $"8DA1 ADB1 B19F 806A 6B73 6E71 797C 8278" $"5E4D 4538 3139 5480 9997 8E80 7C82 8A9E" $"B6CA D9E1 D9BF 9D8F 908C 8C95 A9BA B9B1" $"9876 6F71 6761 6E74 7881 7967 5240 3E38" $"3D60 7B84 7E65 534F 4A50 5F6D 7985 9094" $"8F83 6E5D 5A69 7A7E 8180 664D 4B4C 4F58" $"6162 6776 6849 3933 3230 3B5C 727A 7969" $"676C 6464 7180 878C 9284 726B 636A 7885" $"9AAA A89E 938D 857B 7675 7681 9AA2 8F75" $"665E 5C5D 5657 6C78 6C5B 5355 5A60 6977" $"91AA AF9B 8377 7580 8D8A 8FA0 A8A3 927D" $"6E64 6367 6B7F 949B 9986 6E61 6775 767F" $"969F 9F9D 9286 807E 818C A1AF AFA0 8373" $"7D8A 949C ACC1 C1BB B39C 8E87 7E7C 899F" $"ACAC A996 7665 666F 7B8B 9388 7B70 635C" $"5C5F 657B 9EAE AFB5 A68B 8282 8487 93A7" $"A291 857D 7972 7177 85A4 B5AB 9571 544A" $"4C5F 737B 8387 887C 6B69 6A6B 7177 8491" $"8F7E 6251 5056 677E 929E A4A1 998D 8176" $"7581 91AE CCCE B899 7A65 6379 909D A9A0" $"8979 634A 404A 5A6F 8FA5 9E8D 7A66 5C5E" $"6874 7E88 8A83 7B6F 6051 4A53 6E8B 9C9E" $"937F 5F47 4449 576F 848D 918D 7B6C 6E6D" $"5E64 818F 8E8F 836B 6A79 8290 9EA8 B1B8" $"B6A0 8779 706C 7A97 A6A6 A59A 867A 7574" $"726D 6E74 8186 6F60 6463 5C65 7D8B A0BC" $"A985 8382 7877 776F 6A70 6D59 4E52 4D4A" $"6283 8A82 7761 5F74 7A6F 686D 7173 8894" $"8172 7374 7173 7F85 7E73 635A 6779 7D7C" $"8285 8785 7973 7D84 8488 9AAC B0A8 978D" $"94A9 B39E 8C92 9593 9AA0 9E96 8D7F 798E" $"A7A9 9D90 8B90 9DA9 A69E AAB4 A596 8A78" $"6B63 554D 5C6E 6D62 5A56 5A70 827B 7A8A" $"8E87 878A 8D90 8C8E 98AD C0B7 A59F 978B" $"888E 9096 A8AF A39B 9685 7160 4C45 5A6A" $"635A 6369 626F 827A 7D8C 8C8A 939B 927D" $"6E5D 5469 87A2 BAB7 997B 767D 7A78 7E80" $"828B 8A7A 6E67 5B54 5A62 6568 6B64 6272" $"776B 696F 737D 8D89 6E63 6D76 7772 7278" $"8289 7D6E 737C 7C82 8C92 9AA0 9789 7E76" $"6F6F 7578 7672 6A59 4D50 5355 6570 768B" $"9588 7C77 7376 7F8D 9AA6 AEA7 9990 897F" $"8298 A2A2 A492 715F 5B50 454B 4F4E 5453" $"463F 4345 3B3E 5562 6F80 7B6B 666B 7075" $"7D7E 7E7D 7065 6770 797B 8195 A6AD AB94" $"756A 6660 6770 7273 6E69 686E 7471 7383" $"939C 9B94 8978 6F67 6274 95A8 A6A9 AF9F" $"9596 8F8D 919E B7C3 B7A4 9388 858D 9FB1" $"B2A4 927F 7673 6A6C 7B87 929D A29C 8B7A" $"6D6B 80A7 BBB0 A298 877E 8086 8C99 AFBA" $"BCBD B196 7A68 6570 869E A397 8273 6962" $"5F61 7084 9399 968F 8375 6B69 7895 A9B2" $"B3A5 9488 8188 989F A1A9 B4B7 B19E 836E" $"656C 777D 8A8D 8073 6762 6468 7281 8C91" $"8E82 6E65 646C 8699 9A98 9188 8283 8891" $"A4AE A6A3 A49F 9892 8B85 8C96 9992 816E" $"5D57 606E 7B86 8C87 7B73 6653 4F4F 4E59" $"6B77 7362 5556 5E61 656E 7F93 9384 755C" $"464B 5554 5C6E 787B 6F55 4441 485B 6C73" $"7B81 837F 766F 6660 5A5F 7E99 9982 6956" $"4F68 7C77 7B83 8278 6E73 766B 6461 6371" $"796F 5744 4346 4C53 585F 696D 665D 595D" $"656A 7073 7577 6A50 4654 6B83 9497 908C" $"887C 7371 6E67 6978 807D 7768 544A 5260" $"6C79 817A 6C62 6167 7383 8688 939C 9A8E" $"8075 6D6B 7084 9EAA A59D 9C9C 9CA3 ACA7" $"A9B7 B29F 8B78 6660 6A72 778D A29A 8983" $"7F7D 838C 9095 A6B2 A68F 7D6B 6271 7D86" $"9AA6 9A81 7570 6866 6871 8AA0 A4A0 9990" $"7E65 5863 80A2 A68F 858D 8D7F 818E 9AB6" $"C8B7 ACAE A79D 8B73 738D A4A9 A9AF B8B8" $"A89E 9EA5 B5B8 A9A0 A3A6 A296 8D97 ABA6" $"9792 8C94 9D9A 9DA4 B6C8 C3BC BBB5 A38D" $"8A8E A1B9 B2A4 A39F 9890 8A85 8794 978F" $"8172 6D60 4B43 4359 736C 5F5B 5A57 4531" $"3451 7080 8F91 7A60 4E3D 313E 6275 757D" $"847F 7870 635A 667A 8895 9173 594E 4D4E" $"5058 6871 7372 6654 4A4D 5056 6B86 A1A9" $"9175 6A73 7F75 7182 959C 9180 7572 6C67" $"7489 9CAE A685 7173 7268 6C80 97AA A997" $"8981 7567 5B5F 7599 BEC4 A67D 665E 5559" $"738F A09B 8984 857F 7262 657E 9DA4 8D70" $"5D5A 5449 5669 7E9C 9980 7B7E 7569 656D" $"819A A595 7C74 7B77 727F 8891 9D97 877A" $"7C7D 7679 828E 9990 6D43 2F2E 364B 6171" $"7A7D 7766 5A4F 4351 6C81 969F 9F98 7B58" $"3226 4775 9197 8F85 7F78 5E46 5374 8D94" $"9593 784F 3631 3D59 7E97 9EA2 A499 8573" $"7487 9EB9 C8C6 BBA8 855E 5A85 AFB9 B8B7" $"A792 826B 5B5B 6882 9FB3 BCBB 9F71 5250" $"6B8B 999C A1AB A98E 6F6E 859C B1C2 CACB" $"C8AF 805E 617B 97AD B8B4 A899 8878 7884" $"8894 ACAE 9981 6146 3B43 5B6F 7D86 8684" $"765F 5A67 7A8B 9BB0 C1BA A088 7A79 90B0" $"C9D5 CEBB 9874 6B79 8E9B 968E 9299 8860" $"3C22 293E 4C60 6C6D 6850 3A32 3B54 646D" $"8198 9C89 7664 4A44 546A 87A1 A691 726A" $"7784 8D90 9099 A59F 846A 594F 4B52 6981" $"8E8D 8075 7177 7B74 7172 8190 8E88 868B" $"9391 8EA2 CDE0 C293 7476 8E97 8E85 7F86" $"8B81 6F68 7679 6A6B 6E6A 6A6F 6F69 727D" $"7C7E 837C 6B6D 786D 6D7D 796D 758B 8E8B" $"988E 84A3 BBB9 B1A7 9E96 918A 7B75 797B" $"7371 776C 5955 6482 9493 8F88 817D 797D" $"8287 91A0 AAA4 9C9F A0A2 A59F 9FA9 B6BA" $"AE9A 806C 717D 766F 7B88 816C 5B4B 3C43" $"5B74 8486 8374 5E55 535D 707B 7D7C 725C" $"443A 3635 4C6C 89A2 AFB1 A38C 7C72 7582" $"8C91 8D8B 8C7C 6958 4954 7296 B4AF 947D" $"6C61 5C69 7E89 96A0 9483 828C 836F 7381" $"97B2 B39F 8F80 7475 7D86 949F 9B95 958C" $"7A6C 6B74 87A9 BAAE 9A89 8479 7088 A3B2" $"BBA9 8974 6A5D 5260 7381 A1B4 AB9F 998E" $"838E A09E 9995 816B 6462 5544 4B65 829B" $"957E 716A 655F 627E 9CA1 968B 7A6B 6968" $"6463 728F 9F9D 9889 746F 7278 868F 8B88" $"8778 6760 6168 6768 7481 877B 6249 4256" $"6E86 9CA1 9B8B 7158 4844 4B54 6479 95AF" $"B29B 8687 95A2 AEB3 A89C 9A93 8376 7578" $"757B 8C97 9C8D 6A55 5A6D 7574 8395 948B" $"8182 9396 7D59 4C64 7C83 7761 5D6C 7978" $"6D75 8D95 9189 8183 887F 6963 7286 9586" $"696B 849A 9688 98B2 BBAE 9998 9E9B 917D" $"758B A5B0 A898 9DB4 BBB0 A298 9B9A 7F73" $"828F 8D7F 7275 8690 8C84 797A 868B 929C" $"A3AA A08A 8999 9C91 8479 7783 8F8A 8281" $"8386 8481 838B 958E 7E7A 7D7D 776A 6876" $"8184 7B75 7061 626F 7A8C 9493 8B7B 716D" $"6251 474D 6178 878D 856C 595E 6F7B 7870" $"7066 5B5B 4F45 515D 6162 5D66 786E 5449" $"4855 6C7C 8183 837A 6D6E 7675 6F6F 757C" $"8A90 7E67 5956 6472 7475 828D 8582 7F6A" $"6E89 9191 9BA6 A8A0 9997 9EA6 A7AC B5C1" $"BFA7 9B9D 968C 8C8C 8A93 9E94 7E76 7E89" $"9196 9291 958A 766D 6B6F 7A8A 9490 8B84" $"7C7B 7471 8590 91A0 AA9F 908E 887D 7E87" $"97AD B9AF 9E95 8A7F 7A7C 8085 8B8C 8476" $"6C72 6D5D 585F 7381 776D 675F 5C5A 647D" $"8687 8D87 7C75 746E 5F60 768E 9692 8E89" $"8D91 8F96 9A95 897A 7468 5F66 6569 7888" $"8E7E 6960 5757 5B6A 8A9D 988A 8484 848D" $"9392 9DAE B3A9 A198 8877 6763 718A 9880" $"645D 595C 6A6C 6A76 878E 8D81 757C 826F" $"6677 909C 9487 8282 8A94 8F81 7F85 8994" $"9A9B A09D 9195 ACB5 A694 8979 6964 6C6D" $"6774 796D 7578 655B 615F 5B6E 8176 6562" $"6663 6678 8487 8580 8188 8C8B 8883 7A84" $"9DA3 9883 6C64 5E57 5F66 6064 6B60 5455" $"4C43 4C50 4950 676F 655E 5E56 505C 6459" $"5A6F 8091 9B97 928E 898B 9DAD A79B 9A90" $"7F7B 7E79 7177 8692 9A9F 9680 756E 6774" $"8584 7F7F 7D79 7977 7A82 7B7C 8D95 9899" $"9380 6766 8295 8E8E A3A7 9F9E 8E77 7E93" $"9AA4 B8BE B3A4 9182 889E A08C 8896 9F9D" $"9278 5B5C 686B 7F98 A0A3 9A81 7787 A4B1" $"A39C 9D92 867E 6F5D 6577 767B 94A5 9C8A" $"7E72 768B 8B7B 7D81 7673 7F7D 665F 6773" $"8CA6 ABA0 9FA2 9FA4 AEA8 9C9D A396 8383" $"8272 6D7C 868B 9497 8772 7281 8B94 9C93" $"8278 6C5F 636C 5D49 5167 798A 9790 7F7E" $"868A 9CAE A48E 8176 696A 6750 4F6A 7D83" $"7D77 7976 7177 7F8B 9B9A 836D 6263 7D94" $"7F64 6B78 7B79 7673 757D 868D 96A6 A796" $"8C8A 919B 937C 737E 8E91 8D89 8C8E 8794" $"B1B2 9F91 826E 6979 8685 7C75 7984 9097" $"908D 8886 95A2 9E98 9987 5F55 6366 6461" $"5C5B 5E60 5A57 6570 7389 9E8A 7279 7861" $"5C6E 7F84 7D70 6E7B 7C6C 6776 8696 A69C" $"7E75 7E74 5851 6A7C 715D 4A39 3A3E 312F" $"4E6D 7A8B 927E 6F6D 5C40 476E 877F 6659" $"606D 7A74 6A80 A4AD A18E 7571 7E73 5757" $"7B99 8C6E 696C 6B6A 594B 6A92 9899 A492" $"7871 614D 5E8B A795 756A 6764 6160 6270" $"8692 9A9D 9080 786D 697E 9796 7C73 7E81" $"7671 7475 8397 9DAA C0BF A186 7570 8297" $"9B8A 7E8E 998D 91A3 A8A7 A9AE B5B0 A18D" $"7D7C 7C7B 7F74 5D60 7987 888E 9581 717F" $"8A99 ADA3 8E8D 8E7D 7288 9686 7F8B 9096" $"A7AD 9E9F ACB1 BCBA A597 9695 8985 9494" $"7B72 7C77 7587 8770 6A7F 8C91 9C9A 8A7C" $"6D5B 535B 655C 5664 6D72 7C82 7F86 9AA0" $"9690 8670 594C 4B59 6B6A 5652 6773 6A63" $"5C4F 5168 757F 97A2 8D72 625D 7598 947B" $"7A8F 9380 7577 7D8F A6B4 B1AC AE9B 7C74" $"7380 9999 877F 878C 8478 6D65 6578 8D8D" $"919E 947B 7179 8284 7F78 7988 9191 8D89" $"8987 90AA B096 7764 5A51 4F55 5A67 6966" $"695B 5568 6F5F 5C7A 9292 938F 7C72 7271" $"757F 867E 757C 7466 6E7A 7983 9CA8 AAA8" $"9378 6D72 7778 7874 6767 756D 595D 5B45" $"4863 6C6E 869A 866E 675F 5F60 5855 617B" $"8C93 9795 959B A0A2 AFC4 C2A9 9A91 8682" $"7560 647E 94A3 A9A1 8E76 625C 5F6C 899D" $"968F 9491 805F 494D 5862 6D7A 847D 6454" $"5560 768A 8E87 94A1 9076 5D43 3745 5F73" $"8B9E 9479 625C 6363 7691 8B90 A195 7B65" $"5D65 6F78 889E B7BD A990 8489 9BA8 A195" $"938C 7E76 6B60 646D 7A8C 9898 8E87 847B" $"7778 8293 8E79 6F74 7E7C 7677 7E8D 9691" $"919C A9AE ADA7 ACCB D0AD 958E 837D 7D75" $"6B71 7F83 736A 736F 6E7F 7F79 939F 7857" $"4E41 4250 5664 7C8C 8776 7E94 9EA6 A79F" $"A6C1 BD89 6963 5756 5A5A 728C 8576 7878" $"7379 7A79 8288 8E8B 7F84 795F 5C63 6C83" $"927E 6B80 8B80 8695 9DA5 B6BA 9F94 9E94" $"8079 7473 8AA0 9183 929B 9793 9290 9396" $"8A86 9690 715C 504F 6E98 A08D 8998 9584" $"858A 8F96 908F 9599 906F 5657 5E5F 6173" $"8793 9284 8184 8084 7A62 6889 9E84 594D" $"5452 4B53 6F8B A3A9 978E 9396 9083 859C" $"B7C3 B393 7769 5C42 3547 667C 7767 6A71" $"6757 4945 5E88 997D 5F54 442D 1E2A 547A" $"8B96 9FAA B29E 7E6E 7791 A3A8 A299 9071" $"493A 3F51 687F 919A 9C94 7D64 5A5F 6377" $"9CA2 8A6D 492D 2834 4852 4F67 8D92 867B" $"6961 7485 8691 A5A2 8B70 5344 526B 7070" $"95B7 AA96 968B 8088 827E 9BA3 7C5B 524F" $"5C74 8181 8AA8 AF94 94AD AFA7 AAA5 A7B8" $"A883 777A 716E 7878 747D 8B86 695D 6768" $"6B6D 6582 A382 544F 5F6B 7687 92A5 B7AF" $"A3A2 A5AE B6B9 B9C5 E3DF AF90 877B 7879" $"6A67 7F8B 7C7A 8385 8F95 939C ADBA AE89" $"6856 4B53 636A 7F99 9697 A7A7 9E9B 9A9F" $"A9A9 9A87 7F79 6C5D 5A6A 7575 6A60 6A74" $"706E 6862 7696 9184 9790 684F 392A 4265" $"6958 5261 7786 8981 82A2 BEAE 9FA2 A095" $"8060 5070 9186 7577 8488 786E 737C 8FA0" $"9F9C A7A7 8868 5356 7A89 8287 8B93 9A92" $"857F 889C A6AB AC9E 8D80 705D 5D75 7A6F" $"6F77 8586 7C78 7D7F 8087 8F98 A8A8 937D" $"6E67 6269 7F8A 8B93 9287 868B 8786 97AA" $"AB9D 948E 8373 5A4E 4D49 4B4D 4C50 5963" $"5E5C 6C7A 7C72 6562 5F51 3A2C 3341 5266" $"696C 7E87 776B 7483 9AB0 A68E 8B92 8872" $"6C7A 8788 8275 6869 6D66 5E5F 718C 8A7D" $"8182 7554 3834 3D4E 5954 5D6A 6E6A 5B5C" $"748E A3A9 A7A1 9589 725B 617A 867B 727C" $"7E6C 6165 7281 9BB6 B4A7 A098 8B7A 798B" $"999D A3A7 AAA7 A099 9393 99A1 B0BC B6A0" $"8D81 797E 8B93 928B 8989 7D6F 6A6E 7A86" $"8589 958D 7B81 8A86 878F 9091 9697 8F88" $"8682 8493 9FAD BAB7 A694 8F8E 8C8C 8683" $"8882 6E5E 5F68 6B6D 7480 949E 9073 6062" $"5F57 5E6A 7886 847A 7C88 908B 7D81 95A2" $"A39B 8C89 918C 8182 888E 9287 6C60 696A" $"5D5B 6772 8086 766D 7F8B 7765 6E77 7471" $"7170 7B93 9B91 8F91 99A4 9F96 939E A190" $"8E9D 9D93 8777 7582 8986 878D 908B 8184" $"8676 7E98 9696 A6A2 9181 7472 767B 8794" $"9F9A 8073 756E 6F82 908E 98A7 8E6D 6A62" $"5A68 7478 7B7B 6F5C 5458 5B56 617D 8889" $"856F 6166 5F57 647B 8A91 8C80 7D83 8881" $"798F ABA8 A094 735A 5648 394F 757C 766E" $"5647 494F 4B47 5666 6660 5246 4D55 565E" $"809C 978F 8B87 9091 8681 8DAE C8C2 A794" $"8A7E 7060 6484 9C92 7764 605D 5758 5D6E" $"8F93 6E54 4C41 3E3E 415C 8494 8472 6E6F" $"7275 7A82 94A8 9F8A 8B8D 817F 7B71 8098" $"978C 8883 7C75 6D72 818A 908F 8C8B 8177" $"7B78 7794 B1A6 9393 8B8B 9998 A1AF A7A3" $"A7AE B6A9 9CA0 9D94 9999 8986 8978 7484" $"8892 A194 8284 8A81 6E70 8591 9295 9895" $"9795 8D98 AAB4 CAD2 B9AF B4A7 988F 8993" $"A29A 8C85 7B76 7471 7275 8391 8367 5B5B" $"5C5B 5352 6D80 7B86 9287 786D 6872 8393" $"9B98 9391 8E8D 8D89 8A90 8073 838D 796C" $"6F76 8288 848B 968A 797B 7D6E 6469 6C5D" $"556B 7869 6C7A 7F8E 968C 9099 9289 8382" $"8992 9999 8C8C 9E9C 847D 8798 A8A3 959E" $"AA95 7C7A 7D81 806F 5E55 5666 7067 616E" $"807E 7685 9B9B 887D 7E84 918A 787C 7D79" $"8582 6F6D 7674 6767 7D92 958C 7C73 8184" $"5F49 5863 676E 6C67 6E7E 7F6E 6D8A A6A6" $"9281 848A 6E47 424A 5261 6862 636E 6A57" $"4950 6B7B 746A 696F 6B4F 3437 4851 5B67" $"727D 7D71 6961 6C93 A79B 9397 9A92 7967" $"717A 7176 858D 9591 8272 6774 8F98 9597" $"9385 745C 4441 4342 5062 6D6A 595C 676B" $"819B A1A2 A28F 7E79 6F6B 7B82 7D8C A5A4" $"8B77 7A82 8591 A2AA B9C1 A390 9383 757B" $"7C81 A0B2 9D83 7C82 8683 96BC D4E1 D2A4" $"8D8C 827F 8781 829A 9C84 726B 6F70 6978" $"9AB6 CAC6 ADA5 A693 7D74 727F 918D 898D" $"8D93 9082 92BF D9D3 BBA3 9D9C 8A73 696D" $"7578 7574 757C 8880 6C7A 9793 8D93 8B8B" $"9285 7168 6766 6563 6469 6E78 766B 7E95" $"98A2 A08F 9598 8885 897F 706A 6B6B 6F77" $"7A74 7688 897C 8287 8081 8185 8D7B 6057" $"5A5D 6369 6B6E 737B 8D9A 98A0 A08C 8988" $"838A 8579 7774 7476 7376 8797 9C9F 9F98" $"9D9F 9595 9294 9274 6671 7475 7972 7281" $"867C 849A A6B4 B9A5 948E 8777 6563 6361" $"5F56 4F5B 6E66 5B6D 8088 9BA5 9EA2 A597" $"8064 5A57 4F57 6874 817C 6560 7792 9EA9" $"AEA8 A495 7960 4F50 544F 4F53 5D6E 6A53" $"4D5A 6568 6C76 756C 6968 5E4F 4E4F 494C" $"5C6B 726B 6165 7284 98A7 B5BD B096 877B" $"696C 7C80 8489 8271 615A 5F6C 7A84 888C" $"7E5B 464F 5A5B 6364 595A 605C 5B58 535F" $"7690 A6BA C7B3 9181 7B6E 6678 8582 8578" $"656C 7067 6E86 A3B2 BEC6 B091 8384 8A8E" $"99A4 A290 7977 8281 7D83 95B1 CDD7 D2BE" $"9E8C 8A83 8393 9F98 8169 6165 666C 7B89" $"9FB2 ADAE A990 7E73 707A 888C 775B 535C" $"6B73 7889 9CB5 C7C1 C7C4 A38E 8E8F 9099" $"9371 5B58 5D68 7179 7E85 948E 7F86 8675" $"7073 7173 7E70 5246 434E 6574 808B 8F95" $"979E B5B8 A9A2 A0A1 A29C 8B76 6962 6775" $"7E86 8F8B 8173 7282 837B 7D82 8383 8784" $"7063 5A61 7882 8885 777C 848C A0A4 9894" $"948D 827D 756B 6A72 89A4 B1AF 9885 8C8D" $"8F9F 998C 9294 826A 686A 6263 656D 8592" $"8A77 6E7B 868D A2AA A2A5 A083 6F71 6A59" $"5658 5D74 8880 6E6A 7577 82A1 AAA1 A296" $"7B67 5948 424F 5666 848A 7B74 7680 8797" $"ACB1 AFA6 8F78 6E6A 594A 535D 6A7D 7961" $"4E4A 4B48 5670 7F81 786C 655B 4D3C 3E58" $"6A77 8A89 776D 6D77 8394 AFB7 ABA1 968A" $"7F72 6764 6D79 828D 8F7F 6E66 6360 687C" $"7F78 756F 6C67 6054 4B54 626E 8183 6E64" $"6568 758D 9E9A 8F89 7F7C 7C6A 585F 6B6D" $"7F9C A195 9392 94A1 A7AB AEA9 A39C 958D" $"8075 6F6A 7081 9AA1 8E88 8E99 ACB0 B0B4" $"A99E 9FA0 9F8E 786D 6A70 849A 9A8D 8D91" $"9398 9399 A699 8787 8A87 7A67 554E 607F" $"9DA7 9E9D A6AC ABA9 B6BE AC95 8F95 9990" $"7557 5264 788B 8F7E 777A 7167 6C77 7F76" $"6B72 7B77 6348 3D45 5065 8696 969D 9A86" $"8496 A8A8 968A 909B 9780 6A5E 6677 8393" $"9F9C 947E 6A6E 7C89 8B82 7F8D 9B8C 6E5B" $"565B 6776 93A5 A197 826F 758D 9FA2 9894" $"9A96 866E 6373 8084 93A9 ACA0 9989 6F74" $"8891 948B 827F 7464 5243 4A5F 6B7A 9AAA" $"9A8D 8372 7E9E B1BB BAA8 998A 755F 4D50" $"6474 879C 947D 7A6D 5A6C 8A96 A3A4 8A72" $"675C 4739 4258 718F A096 8B94 9286 92A7" $"AFB6 AD8B 726D 6458 5962 6E7C 817C 7167" $"6051 4455 7588 9082 6457 5446 3A3F 4F64" $"7B83 776E 7787 8883 93AD B3A8 947D 767C" $"796C 7188 99A2 9882 797A 7465 6277 8F92" $"8774 5C4F 504C 4656 6F6F 696B 655F 656F" $"727B 9AA7 9589 7E67 5F5E 585F 7286 8C88" $"8575 7181 8C8E 98AC AE98 9189 6E66 645F" $"677B 8B8C 9194 8A8A 9194 9FB6 CDCD BDB4" $"A893 8780 7B82 8B88 858E 9186 8286 8D95" $"A1AD AA9B 9A9A 877A 726B 6B6A 6B70 8089" $"858C 959A AABA C6C5 B3A9 A295 8F8B 8683" $"8588 8A90 8B81 8788 8684 7F89 9180 7573" $"675B 5750 4241 515E 696B 697A 8B8A 8A90" $"A1A9 9A89 7C78 8080 7876 7C86 898B 867E" $"878D 8279 7D8A 897E 7B77 7879 6A5B 585F" $"696E 706B 7087 8C82 8391 A3AA A49A 918C" $"847C 7A80 8785 8687 8086 9791 8386 97A2" $"998B 8582 796B 5B55 5B63 6971 7B7D 818E" $"908C 949F A8A5 A4AC A892 7666 666B 7274" $"7479 7776 807F 7B7F 8C9A 978F 938D 7763" $"5A52 5056 585F 6866 6878 8381 8796 A0A1" $"A0A5 A796 7D70 6B6E 7880 847E 6857 646E" $"6767 6D72 7573 6D5F 4E3F 3B3F 4552 6168" $"6459 5E77 8888 8D9C A5A5 9F96 9289 766C" $"707E 94A7 A58F 786B 6D78 7B7F 8890 9087" $"807B 6C59 5051 5666 7871 5C51 5463 747C" $"899B 9F93 8587 8E87 705B 5C74 8F96 8978" $"6F6F 7986 91A6 B8B5 A293 9291 8775 6365" $"7D95 9989 786F 6F83 9699 A9B8 B0A1 9B9B" $"9FA0 947F 7984 94A1 9F91 8178 828C 8D9B" $"A69A 8D87 8685 827B 6C60 606C 7B7D 7165" $"667B 97A4 A5A4 9E99 9597 9DA0 9E93 837F" $"8A98 9687 7C75 7D8A 817C 8787 7969 6266" $"6963 523E 3D55 6B6B 6463 6C84 9793 8F96" $"9890 847A 8393 9282 7372 8599 9B87 7776" $"7E81 746B 7682 8682 7D84 8E84 6B5B 5A64" $"7377 706F 7377 7A79 7E88 8D92 9093 A6AB" $"957F 7879 8089 908E 8C8E 8C89 847F 828A" $"8E8C 8787 8270 5C52 5869 7984 8789 8988" $"8D8D 8A93 9BA3 A9A4 9C94 8C80 777E 8B96" $"A2A3 9C91 8987 7F78 7E89 9BA4 9683 7D77" $"6759 606E 7782 877F 7B84 8A83 7E87 93A3" $"ADA5 9892 8D7D 717D 8D90 8C81 7779 7A72" $"635A 626C 7171 6456 5854 4543 5164 6D68" $"6161 6A75 7B78 7685 9290 867D 7A7A 7573" $"798C 9E9D 8E7D 777C 7B7C 7A75 8087 7A71" $"726D 6158 515F 7B83 735F 5454 5A5E 6875" $"7A81 847A 7375 7774 6F6F 8399 9C95 897E" $"7A7D 828E 9690 9092 8884 8786 7A6E 717C" $"878D 8981 7973 767E 8FA1 9D95 989A 9A98" $"9693 8E8E 9297 999C A098 8D87 889A A087" $"7981 8179 7878 7576 7776 7B85 8A8B 877B" $"7682 9292 807B 8382 848D 929A A197 8787" $"959C 9F9D 8F87 8A8D 806C 6A70 6C65 6368" $"7377 6559 616D 777E 807B 7B87 8B7F 737A" $"8077 6F73 7B83 8982 787A 8591 999C 958A" $"8079 736E 757F 7364 686D 6D6C 6463 6F7C" $"8483 8078 6963 6568 6B7E 9491 8588 8881" $"807E 7A7D 8B99 A0AA A78E 7974 7276 8CA1" $"947F 7D78 6B67 6662 6B81 9199 A099 8376" $"7778 7B92 AEAB 9890 8986 8C89 878D 96A3" $"B2B8 B09D 897C 7372 85A0 9A7E 7167 6064" $"686D 7A8F 9FA0 A098 887E 736F 7891 ABA1" $"8277 7576 7D7E 7D89 989A 9493 9187 7964" $"565C 7A92 825F 4F4C 4C4F 4F56 6C7D 7E77" $"787B 766E 6259 6A89 9682 6761 6266 6D6C" $"7289 9894 8B8E 908A 8171 6A76 8A93 8062" $"5351 5355 5462 7D82 7872 6F6D 6960 5453" $"6884 8D7E 6962 625F 6470 7D90 9B99 908B" $"8E8C 8278 7885 929B 937B 706E 6B6D 6F76" $"8A9A 9991 9192 8F8C 8888 8E9D AEA6 8F89" $"8B88 8785 8691 9DA3 A19A 9A99 9086 8489" $"8E8F 8371 6C6F 7174 7274 8595 9791 9195" $"928C 7F78 7F86 8C86 7470 808A 867E 7F8A" $"8E8F 8E8D 8F91 8979 7881 7E78 6D5E 5F6E" $"746A 6266 6E78 817F 7D86 8877 6F7D 8985" $"7C71 656B 8086 7C78 818A 8B90 9695 9691" $"7E75 8593 8777 6A57 5767 6C69 6D74 7A7E" $"838B 8B87 7E71 748F A7A2 9287 7971 767A" $"7D82 8384 8C97 9D99 8D7D 7580 98A8 A395" $"8976 696C 737B 817C 7B87 939A 9483 736F" $"7F97 A5A4 998B 7A6C 6972 7F89 8685 8D99" $"9F9A 8D7D 7481 98A7 A598 8366 4F4D 596C" $"7B7D 818B 908F 8A7E 706B 758A 9B9E 9785" $"6C5F 636F 7B86 8884 888D 8C86 7B6E 676D" $"7B88 8B82 6F54 3D3A 4B5C 676A 6A6D 6E71" $"7370 6B68 6C7B 8887 7D73 655A 5F6F 7C86" $"8987 8282 8786 8486 878B 9497 8C7C 6F5C" $"4748 5E72 7E7F 786F 6B6C 6A67 6D78 818B" $"8F84 756F 6553 5772 8790 8F85 7D7A 7D79" $"7079 8C96 9FA1 9282 7F74 5E5D 7180 8989" $"817C 7875 6E68 798E 969C A098 8B88 8273" $"758A 9796 908F 908F 8B86 8696 A8AB A49E" $"9287 8276 6871 8285 8587 878D 8E87 8282" $"8B98 938A 8B84 7B7F 8381 8590 9087 817E" $"8082 7E7D 8188 8F91 8C83 786F 7075 7779" $"7D75 6C69 686A 7073 757B 8386 837F 7769" $"616B 7B84 8A8C 887F 7673 7273 777C 8089" $"9295 9183 6C5D 606F 787A 7F7F 766C 6769" $"727F 8786 8A91 928F 8673 666D 7D83 868B" $"8A88 837F 8287 8D93 9195 9DA0 A29E 8E7F" $"8591 8E89 8D8C 8277 7173 7A83 8882 8186" $"8686 857B 7783 9393 8F8E 8880 7C79 7B83" $"9096 9294 968E 8A8A 7D72 7D8A 847E 807C" $"746F 696A 7686 8F8F 8980 7572 736D 6A7C" $"8E90 8E8D 857D 7972 6D74 8084 827E 756F" $"6D6B 6665 727F 7971 706E 6B66 5B58 697A" $"7E7E 796D 6460 5955 5D71 7F7C 7472 7579" $"756F 707A 8386 8684 8080 7D73 737F 8C8F" $"8577 7072 7470 6C6F 777E 8281 7C74 6C64" $"5F6A 8190 948A 7C76 787A 787B 858C 8D8C" $"8A89 857E 7672 829C A9A6 9682 7878 7373" $"7F87 8B90 9291 918D 8173 7182 98A4 A69B" $"8A83 7F79 7B86 8F93 9495 9798 9383 7677" $"8496 A5A5 917D 7672 747F 8E94 9090 8F8C" $"8D87 7B72 7481 8F9A 9C8F 817A 7373 818B" $"8884 837B 7A7E 7970 6D74 828C 9497 8A79" $"716A 6C7D 8C90 8E87 7D7A 7B75 6F6D 7079" $"858D 8C84 7871 6F71 7F8A 8683 827B 7777" $"726F 7273 797F 7F7E 7969 5F5E 657A 847F" $"7B77 716E 6D6B 6F75 7578 7E7C 7E7E 7472" $"7884 9194 8D87 8583 7F80 8083 8989 8D94" $"908D 8A80 7D81 8893 968A 8485 7C73 7881" $"8C96 958F 8B81 7C7C 7879 828C 9698 8F89" $"8781 7D80 8284 8886 8385 7E73 6F6E 7178" $"8490 928C 8C8E 8376 777C 8088 8B8A 8C87" $"7C78 777A 8084 8885 7D7F 8279 7475 716F" $"7474 747A 7870 7076 7B7D 7E84 837C 7D81" $"7C79 7872 6F73 7475 796F 666E 777F 8484" $"8785 7B7B 8384 878D 8984 8582 7E7A 6B63" $"6D7A 868D 8B88 8375 6E71 767B 7E7A 7981" $"8581 7D6F 646D 7B87 8F8E 8D8C 8076 787E" $"8183 8586 8B8B 8781 7067 737D 8794 9390" $"8F87 7E81 878E 918C 8B92 948F 8779 6F74" $"7A84 8E8C 8988 817C 828C 9290 8C8C 908F" $"867D 746F 7A82 8690 908C 887C 7680 8D92" $"928A 8384 8177 7372 717A 8184 8883 7972" $"686B 7A86 8E8E 8682 857F 6D68 6B6D 7885" $"8A8C 8B85 7A6F 707B 878E 8F8A 8581 7A6D" $"6D73 7681 8A8B 8D89 7E72 6A70 7D89 9193" $"8D8A 897D 6A62 605C 6674 7A7D 7B75 6F6A" $"6D78 8286 8481 7E79 716C 6F73 7481 8D8B" $"857D 736E 6F74 808B 8D8A 8680 7E7C 7779" $"7D7D 848F 8E86 7D7A 8083 848E 9BA0 9C95" $"8C86 807A 7C81 8187 8E85 756A 676E 757C" $"8896 9B94 8C83 7E7F 7E7D 7F7E 8790 8577" $"7072 7E88 8B94 9E9F 988E 8583 817D 8187" $"868B 8F82 7165 636C 757C 868F 9088 7F79" $"7676 777C 817E 8185 796B 6666 707F 888D" $"8F8B 837D 7A7B 7C79 7F8A 898A 8D80 706A" $"6970 7C82 888F 918B 8380 817E 7D83 867D" $"7A7C 6E61 6468 7182 8D8E 8D8B 8783 8180" $"8081 8384 7F7E 7E72 6969 686D 7C81 8183" $"8381 8081 8384 8588 8984 8282 7971 7377" $"818E 9495 9490 8E90 918F 9091 8C85 817F" $"7B72 6C6D 727B 868B 8C8C 8A8A 8D8D 8E91" $"918E 8E89 817B 7066 686F 7983 8A92 948D" $"8989 8A8C 8E8C 8582 7F7C 786D 5F5C 626A" $"7078 7E7E 7F81 807F 8181 7D78 7777 7679" $"736A 6B71 757B 8083 8688 8B8C 8D93 9590" $"8985 7E7A 7D7A 716F 6F70 7372 6F6F 767F" $"8388 8D8B 857C 736E 6D6F 6F6D 7173 7378" $"7B76 7982 878A 8E94 9792 887E 7673 7575" $"767A 7B79 7D7C 7576 7D84 8C95 9FA4 A096" $"8C86 8585 8283 898A 878A 8A86 8791 999C" $"A2A7 A9A2 9487 817C 7672 7378 7B79 7B7C" $"7778 7F83 868D 949A 9789 7F7A 7776 7575" $"787A 7B7E 8385 868C 979E 9F9F 9F9B 8D81" $"7C77 7270 7070 706E 6E72 726F 727C 858A" $"8C8D 8C83 7670 6E70 7475 7471 7071 7474" $"7277 8592 9799 9995 8B7F 7873 7071 7372" $"706E 6E6F 706F 717E 898F 9192 9087 786E" $"6B6D 7177 7876 7679 7C7C 7B7E 8793 9999" $"9A97 8C80 7874 7374 7673 7171 7375 7473" $"7680 8A8F 9093 9590 857E 7A79 7B7F 7D7A" $"7879 7D7F 8086 9099 9D9C 9994 8B80 7A75" $"7070 7375 777A 7A7B 7B7B 8189 8F92 9392" $"8E87 7E79 7876 777A 7A79 7A7B 7C7B 7983" $"9197 9B9D 9894 8B7C 7470 6B6B 6D6A 696D" $"7072 7271 7886 8C8E 8F8A 847F 7977 7776" $"787A 7876 7572 7478 797F 8C93 979A 9690" $"887E 7A7C 7874 7573 7070 7073 7778 7F8A" $"8F92 938F 8880 7775 7874 7173 7372 7270" $"7274 747A 848B 9195 918C 887E 7777 7675" $"7B7F 7C7A 7A7F 817F 838B 9196 9B9B 9995" $"8C85 8583 8186 8885 8384 8788 878B 9399" $"9E9F 9A97 9386 7A78 7676 7B7D 7A79 7D85" $"8781 7E85 8A8D 8D8C 8D8C 8279 7878 797C" $"7B78 7A81 898B 878A 9195 9593 8E8E 9086" $"7873 7273 7371 6C6C 737A 7D7C 7D83 8582" $"807D 7E81 7A72 757A 7B7B 7770 6E70 757A" $"7B81 8A8C 8B8A 8787 877E 7575 7677 756F" $"696A 6F72 7679 7C82 8585 8582 807E 7672" $"7579 7B7C 7B77 7676 787C 7D7F 8587 8687" $"8786 827C 7777 7675 7674 7171 7172 787D" $"7E80 8285 898B 8A88 8380 8281 8080 817F" $"7D7B 7E85 8988 8A8C 8C8E 8E8B 8680 7E7E" $"7D7B 7B7B 7A7B 7E82 878A 8989 8886 8687" $"8887 8481 8281 7F80 817F 7D7F 8389 8E8F" $"8F90 8F8E 8C88 837E 7976 7472 7274 7574" $"7476 7B7E 7D7F 8181 8385 8382 7F7C 7B7B" $"7A7B 7D7D 7B78 777B 8184 8586 878B 8D8A" $"8580 7A78 7776 7679 7D7D 7C7A 7C80 8182" $"8587 8A8B 8886 827B 7674 7273 777B 7A77" $"7578 7C7F 8284 878B 8C8A 8883 7C77 7573" $"7375 787A 7A7B 7E81 8183 888D 9191 9090" $"8F8B 8582 7F80 8285 8786 868A 8C8B 8D90" $"9091 918F 8E8C 857E 7A77 7677 797C 7D7B" $"7D81 8283 8586 8686 8586 8782 7D7A 7878" $"787A 7D7F 7F83 8787 878A 8A89 8783 8383" $"7D74 706F 6E70 7375 7473 7579 7C7D 7F81" $"8384 817F 7F7D 7977 7572 7277 7C7B 797B" $"7F82 8588 8A8D 8E8C 8985 7F78 7372 7273" $"777B 7B79 797B 7D80 8384 8686 8483 8381" $"7C79 7878 797C 7E7E 7E81 8383 8286 8A8E" $"8E8C 8A87 837D 7875 7475 787A 7979 7B7E" $"8083 888B 8D8F 908E 8A86 8280 807E 7B7C" $"7F81 8183 8687 888B 8C8B 8B89 8683 7F7A" $"7777 7676 787A 7978 7D82 8484 8789 8989" $"8784 8280 7C7A 7B7B 797A 7B78 767B 8285" $"8687 8989 8885 7E7B 7975 7373 7373 7576" $"7370 747B 7D7E 8184 888B 8882 7F7D 7A78" $"7879 797B 7E7A 787D 8386 8687 8A8D 8F8C" $"8681 7D78 7573 7272 767A 7979 7E83 8583" $"8385 888A 8885 8483 7F7B 7A79 7877 7777" $"797E 8383 8181 8385 8482 8180 807D 7875" $"7472 7072 7274 7B84 8787 8789 8B8C 8B89" $"8889 8988 8785 8381 8180 8085 8D90 908E" $"8D8C 8985 8381 8182 8181 817E 7B7A 787A" $"7F86 8A8B 8B8A 8988 8580 7D7D 7E7E 7E7E" $"7C7D 7F7D 7C81 888C 8D8C 8B8A 8782 7C78" $"7778 7878 7878 7776 7473 767C 7F81 8282" $"8483 817E 7A79 7977 7677 7879 7B7B 7B7F" $"8588 8888 898B 8A86 807C 7A78 7470 7071" $"7375 7577 7D81 8282 8182 8384 8381 807E" $"7B78 7776 7576 797B 7E83 8786 8484 8483" $"8280 7F7E 7E7D 7875 7373 7476 797D 8389" $"8B8A 8889 8B8A 8888 8989 8886 827E 7B7B" $"7E81 8385 898B 8B8A 8988 8785 8584 8383" $"817F 7D7C 7C7E 7F82 8588 8987 8585 8785" $"807C 7C7E 7D7C 7A79 7879 7C7C 7D82 8788" $"8683 8384 837E 7977 7676 7573 7170 7276" $"7776 787D 7F7F 7D7E 8283 817F 7D7C 7B79" $"7777 7879 7C7F 8183 8584 8281 8387 8681" $"7E7C 7976 726F 7073 767A 7D7E 7F81 817E" $"7E80 8486 8483 8280 7D79 7574 7476 7A7E" $"7F80 8282 8080 7F80 8180 8080 7E7A 7674" $"7373 757A 7F83 8586 8585 8484 8486 8585" $"8686 8484 8382 8283 8588 898A 8C8B 8A89" $"898A 8A89 8887 8381 7F7C 7A7A 7C7F 8386" $"8583 8384 8483 8484 8383 837F 7D7D 7D7C" $"7D7E 8184 8686 8686 8787 8684 8381 807F" $"7B78 7675 7578 797B 7F81 8180 7F7F 7F81" $"8384 8484 837F 7B7A 7979 7A7C 8083 8585" $"8382 8281 8080 7F7F 807F 7C79 7774 7273" $"7578 7D80 8080 8081 8080 7F7E 7E7F 807E" $"7C7A 7978 7777 787B 7D7E 7F81 8282 827F" $"7D7C 7D7D 7C7B 7A79 7877 7778 7B7E 8081" $"8485 8585 8584 8381 8080 8080 8181 8182" $"8283 8382 8284 8687 8887 8683 8180 7F7E" $"7D7C 7B7B 7D7E 7F81 8180 8182 8383 8282" $"807E 7D7D 7B7A 7A7C 7E80 8182 8382 7F7E" $"7E7F 7F7E 7D7D 7B7B 7B7A 7876 7677 797B" $"7D80 807E 7E7F 7F7E 7C7D 7F7E 7E7E 7E7D" $"7C7C 7C7E 7F81 8484 8281 8283 8280 7E7E" $"7D7C 7C7C 7B7A 7979 7A7B 7C7F 7F7E 7F81" $"8281 7F7F 7F7E 7E7D 7D7E 7E7F 7F81 8282" $"8383 8384 8586 8684 8383 827F 7E7E 7E7E" $"7D7D 7F80 8182 8281 8284 8585 8383 8383" $"8282 8282 8283 8487 8989 8A89 8786 8584" $"8383 8283 8382 8181 817F 7D7C 7D7F 8082" $"8382 8385 8584 817F 7F7F 7F7F 7F7F 7E7E" $"7E7E 8081 8383 8485 8685 8380 7D7C 7D7C" $"7B7C 7D7E 7E7D 7C7C 7C7C 7B7B 7E81 8383" $"817E 7C7B 7A79 797A 7C7E 7E7F 8081 8180" $"7E7F 8181 8181 8080 817F 7D7C 7A7A 7C7C" $"7D7F 807F 7D7C 7D7E 7F7F 7E7E 7F80 7F7D" $"7D7C 7B7B 7B7D 7F81 8280 8080 8181 7F7D" $"7E80 8181 7F7E 7C7B 7A7A 7C7F 8182 8280" $"8080 7F7E 7C7C 7D7F 8182 8382 8180 8080" $"8182 8485 8585 8483 807E 7D7D 7E7F 8182" $"8180 7F7E 7F80 8081 8181 8283 8381 7E7C" $"7C7C 7D7D 7D7E 7F7F 7E7E 7F7F 7F7F 7F7F" $"8081 807E 7C7B 7C7D 7D7C 7C7C 7C7C 7E80" $"8080 7F7E 7D7D 7E7D 7C7C 7C7C 7D7E 7E7F" $"7F7F 7F80 8383 8382 8181 8281 807E 7D7D" $"7F80 8080 807F 7D7C 7D7F 8080 807E 7D7E" $"7E7C 7B7B 7C7E 8182 8282 8281 7F80 8283" $"8485 8686 8685 827F 7D7D 7F81 8282 8382" $"807E 7E80 8182 8384 8484 8481 7F7D 7D7F" $"8284 8586 8787 8584 8383 8384 8484 8686" $"8381 7F7E 7E80 8384 8484 8483 8282 8283" $"8383 8383 8381 7F7D 7C7C 7D7E 7F80 8181" $"8080 8080 8081 8080 8282 807E 7D7C 7C7D" $"7E7E 7E7E 7F7E 7D7D 7E7E 7E7D 7C7C 7B79" $"7877 7778 7A7C 7E7E 7E7E 7E7E 7E7E 7E7E" $"7E7E 7E7D 7B7A 7979 797A 7C7E 7E7E 7D7D" $"7D7D 7E7E 7E7E 7E7E 7E7B 7A7A 7B7D 7E7F" $"8080 7F7F 8080 8080 8181 8181 8080 7E7D" $"7C7C 7E80 8181 8180 7F80 8182 8284 8585" $"8483 817E 7D7D 7E7F 8284 8585 8482 8182" $"8383 8383 8383 8281 7F7D 7D7E 8081 8283" $"8383 8281 8182 8283 8383 8483 817E 7C7B" $"7B7C 7D7F 8080 8080 7F7F 8080 807F 7F80" $"7F7E 7D7C 7B7B 7B7C 7D7E 7E7F 7F7F 7F7F" $"7F7E 7E7E 7F7F 7F7D 7C7C 7B7B 7C7D 7F80" $"8183 8384 8483 8280 8080 807F 7F7E 7E7E" $"7E7D 7D7D 7D7D 7F80 8181 8180 7F7E 7F7F" $"7F7E 7E7E 7E7E 7F80 8080 8081 8283 8383" $"8281 8180 8080 7F7E 7E7F 8081 8180 7F7F" $"8081 8282 8383 8382 8181 807F 7F7E 7E7E" $"8082 8281 8181 8182 8281 8181 8181 8180" $"7F7E 7D7D 7E7F 8080 8181 8080 8080 8080" $"8080 8081 8180 7E7D 7D7D 7E7F 8080 8081" $"8182 8383 8382 8281 8181 8181 8080 8080" $"8180 807F 7F7F 8081 8080 8080 7F7F 7F7E" $"7E7E 7E7E 7E7E 7E7E 7E7E 7F80 8181 807F" $"7F7E 7E7E 7D7D 7D7E 7E7F 7E7E 7E7E 7D7E" $"7F80 8181 8080 7F7E 7E7E 7E7E 7E7F 807F" $"7F7F 7F7E 7F80 8181 8181 8281 807F 7F7F" $"7F7F 7F80 8080 7F7F 7E7D 7E80 8080 8081" $"8180 7F7E 7E7D 7D7E 7F7F 8081 8180 8080" $"8080 8080 8182 8281 8180 7F7F 7E7F 8081" $"8283 8281 8080 8080 7F80 8181 8282 8180" $"7F7E 7E7E 7F80 8181 8181 8181 807F 7F7F" $"8080 8181 807F 7E7D 7C7C 7D7D 7D7E 7E7F" $"7E7D 7D7D 7D7D 7D7D 7E7F 807F 7F7F 7F7F" $"7E7E 7F80 8282 8181 8181 807F 7E7E 7F80" $"8080 8080 8080 7F7E 7E7E 7F80 8081 8080" $"807F 7F7F 7F7F 8080 8080 807F 7F7F 807F" $"8081 8181 8180 8080 8080 8080 8181 8181" $"807F 7F7F 7F7F 8081 8181 8180 7F7E 7E7F" $"7F80 8182 8281 8080 7F7F 8080 8081 8181" $"8180 807F 7F7F 7F80 8081 8181 8080 807F" $"8080 8080 8080 7F7F 7F7F 7F7F 8080 8080" $"8080 8181 8181 8181 8080 8080 8080 8181" $"8180 8080 7F7E 7E7F 7F7F 7F7F 8080 7F7F" $"7F7F 7F7F 7F80 7F7F 7F7F 7E7E 7F80 8080" $"8080 7F7F 7E7E 7F7F 8080 8080 8080 7F7E" $"7E7E 7F80 8080 8080 7F7F 7E7F 7F7F 8081" $"8180 8080 7F7F 7F80 8181 8181 8180 8080" $"8080 8080 8181 8181 8180 7F7F 7F80 8080" $"8081 8080 8080 7F7F 7F80 8080 8080 8080" $"8080 8080 8080 807F 7F7F 7F80 8080 8080" $"8081 8180 8080 8080 8180 8080 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 8080 7F7F" $"7F7E 7E7E 7E7E 7E7E 7E7F 7F7F 7E7E 7D7D" $"7E7E 7E7F 7F7E 7E7E 7E7E 7E7F 7E7E 7F7F" $"7F7F 7E7E 7E7E 7F7F 8080 7F7F 7F7F 7F7F" $"7F80 8080 8080 807F 7F7F 7E7F 7F7F 8080" $"7F7F 8080 8080 8080 8080 8080 8080 8080" $"8081 8180 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8180 8080 8080 8080 8181" $"8181 8180 8080 7F7F 7F80 8080 8080 807F" $"7F7F 7F80 8080 8080 8080 8080 8080 8080" $"8080 8080 7F7F 7F80 8080 8080 8080 8080" $"8080 8081 8181 8080 807F 7F7F 8080 8080" $"7F7F 7F7F 7F7F 7F7F 8080 8080 807F 7F7F" $"7F80 8080 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F80 8080 7F7F" $"7F7F 7F7F 7F80 8080 8080 807F 7F7F 7F80" $"8080 807F 7F7F 7F7F 7F80 8080 8080 807F" $"7F7F 7F7F 8080 8080 7F7F 7F7F 7F7F 7F80" $"8080 8080 7F7F 7F7F 8080 8080 8080 7F7F" $"7F80 8080 8080 8080 8080 8080 8080 8080" $"8080 807F 7F80 8080 8080 8080 8080 8080" $"8080 8080 807F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F80 7F7F 7F7F 7F7F 7F7F 8080 8080 8080" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"8080 8080 807F 7F7F 7F7F 7F7F 7F80 8080" $"8080 8080 8080 8080 8080 807F 7F7F 7F7F" $"7F7F 7F7F 8080 8080 8080 8080 8080 8080" $"8080 8080 7F7F 7F7F 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 807F 7F7F 8080" $"8080 8080 8080 8080 8080 7F80 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 807F" $"7F7F 7F7F 7F7F 7F7F 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080" } }; resource 'snd ' (10411, "Drum Of Earthquake", purgeable) { FormatOne { { /* array Synthesizers: 1 elements */ /* [1] */ sampledSynth, 160 } }, { /* array SoundCmnds: 1 elements */ /* [1] */ hasData, bufferCmd { 20 } }, { /* array DataTables: 1 elements */ /* [1] */ 37376, Rate22K, 37374, 37375, 0x0, 0x3C, $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 7F7F" $"7F7F 7E7E 7D7C 7C7B 7A79 7877 7674 7371" $"706F 6E6C 6B6A 6866 6463 615E 5D5B 5957" $"5554 5351 504E 4C4A 4846 4544 4240 3F3E" $"3D3C 3C3C 3B3A 3A39 3939 393A 3A3B 3B3B" $"3B3B 3B3C 3D3F 4040 4142 4344 4546 4748" $"494B 4C4D 4E4F 5153 5557 595A 5C5E 6063" $"6568 6B6D 6F70 7274 7678 7A7C 7E80 8283" $"8588 8B8D 8E8E 9093 9697 9796 989C A2A6" $"A7A6 A4A5 A9AE B1AF AAA7 A8AE B5BB BBB7" $"B1AE B2BB C3C6 C3BB B3B1 B6C0 CBD3 D4CD" $"C0B1 A5A3 ABBC CDD9 DAD1 C0AC 9A8D 868C" $"9EBB DBF1 F3F0 EAD0 AD95 9296 9797 9694" $"8F8B 8786 8FA8 C8DB DCD2 C6BC B2A8 9F96" $"8F88 817C 7671 6C67 615C 5752 4C47 423E" $"3A37 3534 3536 393D 4147 4E57 616B 7783" $"909C A9B4 C0CA D4DC E5EC EFEF F0F0 EFEE" $"EEEE EDEE EDEE EDEC EDED EEEE EEEF EFF0" $"F0EF EDEA E7E4 DFDB D7D4 D3D3 D5D6 D8DA" $"DCDD E1E6 ECF1 F4F4 F2F0 EDEA E8E8 E9EA" $"ECEE F0F2 F4F5 F3F1 EFEF EEEE ECE8 E2DD" $"D8D6 D3D0 CCC9 C6C3 C0BE BBBA B8B7 B5B5" $"B4B4 B4B5 B5B5 B6B6 B6B6 B5B4 B3B1 AEAB" $"A8A5 A29E 9A96 928E 8985 807C 7877 7776" $"7575 7575 7575 7575 7575 7474 7372 7271" $"7070 6F6F 6E6E 6D6D 6C6C 6B6A 6968 6766" $"6563 6260 5F5D 5C5B 5A59 5755 5351 5151" $"504E 4943 403E 3B39 3837 3737 3737 3737" $"3737 3736 3635 3330 2C28 2522 1F1D 1B1A" $"1A1B 1B1B 1917 1616 181B 1E21 2221 1F1E" $"1C1C 1B1C 1E21 2427 292A 2A2B 2D30 3336" $"3839 3A3A 3B3D 4043 4648 4A4A 4947 4442" $"4243 4548 4A4C 4D4C 4A45 3E37 3029 231E" $"1B1A 1C20 262C 3238 3C3D 3D3D 3E40 4345" $"484B 4E52 565B 6166 6C6F 7273 7576 7778" $"7879 7877 7573 7374 777C 8084 878A 8B8B" $"8B8B 8B8B 8B8B 8C8C 8B89 8682 7F7D 7B7C" $"8087 8F99 A2AB B3B9 BDBF C2C6 CDD2 D0CC" $"D0D9 E0E1 DEE0 E5E4 D7C6 B8B5 B8B7 AD9D" $"928E 8F8D 877F 7C7F 868D 9090 8B81 746A" $"6667 6C72 777C 8187 8D92 9699 9DA0 A3A8" $"B0BC CCDB E5EA EEF0 EFEB E4D7 C6B5 ABA8" $"A49B 9089 8582 7D78 7672 6B61 564A 403B" $"3A40 484D 4C47 423D 362E 2A2A 2B29 2624" $"221D 1308 0000 0001 050E 1A28 343D 4447" $"4848 4949 494A 4D4E 483E 3533 383F 4242" $"4142 474E 5356 5758 5D67 7074 6F66 5C53" $"4B45 4241 4141 4140 3F3E 3D3D 3C3B 3A39" $"3A3B 3731 2A24 201C 1818 1817 1007 0100" $"0409 0E15 1D23 2622 190F 080A 1524 313B" $"434B 5152 5356 5E64 6765 6366 6E7A 8690" $"979E A4AA ABA7 A19C 9999 9794 9291 9397" $"9A9A 9CA0 A3A8 AEB3 B5B5 B6BB C3C8 CACD" $"D2D8 DAD7 D3D0 CFD2 D5D4 D4D3 CDC4 B9AF" $"A9A7 A9AC ADAB A59F 9790 8A86 8689 8C8F" $"9194 9899 968F 8680 7B76 706E 6F74 787A" $"7A7B 7C7C 7A77 767B 8288 8984 7D7A 7E88" $"939D A5AB AEB0 B0B0 AFAD A79E 938B 888A" $"8D8F 8D89 8484 8891 9DA7 AEB2 B5B9 BDC1" $"C2C3 C3C4 C4C4 C1BF BEBF C5CE D9E5 F0F8" $"FEFF FFFF FFFF FFFF FDF6 EDE5 E0DC D8D2" $"CDC9 C8C9 C9C8 C7C8 CBCF D3D6 D8D6 CFC6" $"BDB9 B9BB BEBF BEBA B2A8 9D94 8E8A 8887" $"8889 8B8D 9092 9497 9A9C 9B99 999B 9FA4" $"A6A5 9F98 9089 817B 7776 7677 7877 7673" $"6F69 6564 6568 6B6C 6C6B 6D73 7A80 8384" $"8483 817F 7F82 868A 8E8F 8D89 8582 8284" $"888D 9093 9391 8D8A 8785 8484 8483 817F" $"7D7A 756F 6864 6262 656A 727A 848E 99A1" $"A3A0 9A93 8C87 8483 8283 8589 8D92 979B" $"9E9F 9F9E 9D99 9490 8C89 888A 8E94 9A9E" $"A09E 9891 8B86 837F 7A74 6B61 5850 4842" $"3E3C 3B3A 3A39 3B3E 4248 4D53 575A 5D5F" $"605F 5C59 544F 4B49 484A 5059 6572 7C83" $"878A 8A8A 8A89 867E 7263 5448 403C 3B3C" $"3B38 3531 2F2E 2D2E 2F31 3436 393C 3F45" $"4C55 606B 767D 807F 7B77 7472 6E6B 6865" $"6362 6161 6161 6162 6364 6464 605A 5455" $"5E68 6964 605F 5C59 5A60 6565 6363 6463" $"5D57 5255 595A 5349 423F 414A 5866 6F70" $"6A60 5655 6275 8083 827F 7E7C 7C7B 7A7A" $"7976 736F 6C69 6663 615E 5B58 5653 4E47" $"3F37 302C 2B2E 3134 3637 3839 3C3F 4347" $"4C4F 5355 585B 6169 7176 7776 7066 5C5B" $"6064 615E 5B57 5554 5556 5758 5859 5B60" $"6873 7D84 8583 838A 949D A1A2 A5A8 ABAB" $"AAA8 A399 8C80 7672 7277 7F85 8B90 9395" $"9696 9594 9290 8F8E 8E8E 8F90 8F8E 8B87" $"837E 7874 706E 6D6F 747D 8996 A1A8 ABA9" $"A5A2 9E9B 9999 999B 9C9C 9B99 9694 9494" $"9595 9696 9695 9594 9391 908E 8C8B 8B8B" $"8C8D 8E8F 8F90 9192 9391 8C83 786C 6460" $"6060 6164 676C 737E 8B9A A7B0 B4B4 B1AE" $"ADAE AFAF AEAC A9A7 A6A5 A6A7 AAAC AEB0" $"B0AF AFAF AEAA A59E 968F 8D95 A0A8 A8A3" $"A0A0 A3A7 ABAE AEAA A193 857E 828F 9DA7" $"A9A3 998C 7F74 6D65 5E57 5456 5C64 696E" $"7277 7D80 817F 7D7B 7A7C 7F83 888E 959D" $"A7B2 BECA D8E5 EDF0 ECE3 D6C9 BEB6 B1AF" $"AEB0 B3B6 B9B7 B2A9 A19B 9999 9A96 8D81" $"766F 6C69 6A6C 6E70 6F6C 6761 5E5E 626A" $"737C 8388 8A89 8581 7D7D 838F 9A9E 9A94" $"908E 9091 908B 8682 7F7C 7975 7169 5F56" $"5252 555B 6370 8190 9B9E 988D 7E72 6C6C" $"6E70 6F6B 645E 5A59 595D 646E 7A84 8A8C" $"8C8B 8A88 888B 9094 9491 8E89 8582 8282" $"817E 7C7C 7C7D 7D7E 8186 8B92 989C 9E9D" $"9B97 918C 8889 8C8F 8E8B 8883 7E7A 7B7F" $"8486 8481 7E7B 7771 6963 5E5D 5D5E 5D5C" $"5854 4F4D 4E52 585E 6263 605C 5855 5355" $"5C64 6763 5B56 565A 616A 737C 8489 8A87" $"837E 7973 6D6C 7074 7675 7476 7A7F 8181" $"8082 8484 807C 7975 7270 7175 7B81 878B" $"8D8C 8882 7B74 6E6A 696B 6E6E 7077 838E" $"9393 969D A4AA ACAC ACAF B6BA B9B6 B8BE" $"C2C0 BCBA BCBD B6A8 9A8F 877F 7978 7B7C" $"786F 6766 6B74 7E84 8178 7274 797A 797B" $"8084 837D 766E 665C 5047 444A 504F 4943" $"4346 4A4C 4D50 565E 6468 6A6E 757E 8792" $"9CA5 A9AC AEAE ADA9 A297 8D89 8A8B 867D" $"7671 6B65 625D 544A 4445 4A4E 4E49 413E" $"434A 4B43 3937 3F49 4E4A 474B 5662 6A6D" $"7176 7976 6F65 594C 3E30 241C 1718 1C21" $"2629 2D33 3B44 4C4E 4E4D 5057 5E62 6263" $"6568 6969 696A 6D71 757B 8085 8A8C 8E8F" $"8F8F 8F90 9396 9590 8B8F 98A2 A8AA ABAD" $"B1B7 BBB9 B3B0 B6C4 D1D6 D3C9 BBAF A6A3" $"A3A6 AAAC ACAA A5A0 9B99 9898 9999 9796" $"9391 8F8F 8F90 9090 8F8E 8E8F 9296 9A9D" $"9D9C 9EA4 A9AA A9A5 A29F 9B98 9594 9393" $"9290 8E8C 8A88 8684 8380 7D7A 7876 7471" $"6A5E 5144 3D39 332A 211B 1A1D 2225 2524" $"2425 282A 271F 1613 161B 1E1E 1C1A 1A1C" $"1E21 2429 2F36 3B3C 3A3C 4147 4845 403E" $"3D3C 362D 2626 2C31 363B 4146 4B52 5C66" $"6D71 7374 767C 848E 979E A09D 968F 8780" $"7976 7573 6D63 5A55 5559 6069 7480 898E" $"8D8B 8C90 918E 8680 7F81 7F7A 7470 7176" $"7F8A 9499 9A9A 9A99 9796 9594 918E 8B89" $"888A 8D8D 8B88 8582 807F 7E7E 8082 8383" $"7F7B 7775 7576 7779 7A7B 7974 6F6C 6C6E" $"7172 7069 5F56 535A 656E 7478 7A77 6F68" $"6568 6D70 706B 645F 5F64 696D 6F70 757D" $"858B 8E91 959C A4A9 AAA7 A19B 9BA0 A8AD" $"ADA9 A39E 9B99 9899 9998 9691 8A83 7C76" $"7271 7273 7372 706E 6F72 757A 7F85 8C94" $"9EAA B9C5 CBCA C4BE BBBA B8B4 B0AE AFB1" $"B0AC A295 8A84 868D 969F A3A4 A6AC B2B3" $"AEA2 958B 8889 8C8E 9190 8D8A 8A8F 97A1" $"A9AD ABA7 A3A3 A6AA ACAB A49A 8D82 776E" $"6765 6C7B 8E9E A9AD ABA3 9990 8E90 9294" $"918C 857E 7B7B 7E7F 7D79 7677 7876 6D61" $"5956 585B 5E5F 5C5B 5D64 6F78 7E81 8384" $"8382 7F7A 7472 767F 8A93 9694 908E 8F93" $"9799 9A9C 9E9F 9D9C 9B9C 9D9D 9C9A 9690" $"877D 736C 6664 6466 6B71 7577 7777 787A" $"7E82 868B 9196 9A9C 9DA1 A9B5 C1C7 C6BD" $"B1A6 A1A2 A7AD B3B9 BDC1 C5C8 CACA C8C6" $"C5C6 C4C1 BDBC BAB7 B5B6 BDC5 CBCB C6C2" $"C3C6 C5C1 BEC1 C7CA C8C2 BBB2 ADAE B3B6" $"B4AF ACAE B4BD C3C6 C6C6 C5C6 C9CE D7E0" $"E4E2 DCD6 CEC6 BEB8 B2AE ACAA AAAD B3B6" $"B4AC A6A6 AAB0 B6BB BFBE BBB7 B6B6 B5B4" $"B2B0 B0B2 B5B7 B7B7 B7B5 AEA5 9D99 9898" $"9184 766D 6868 6B72 7C88 939B A0A0 9C95" $"9090 9294 938E 8881 7B7B 7D7E 7C7A 7B7F" $"8489 8C8D 8E8D 8C8A 8987 8481 7E7A 7877" $"7776 726F 6D6B 6B6C 6E70 7478 7B7B 7A79" $"7775 7478 7F84 837F 7870 6A67 6667 6665" $"625F 5D5B 5B5A 5755 5353 5250 4C45 3F3D" $"4045 494A 4845 423D 3834 3232 3231 3032" $"353A 3F42 4546 433E 3936 3638 3A3C 4045" $"4541 3C3D 4655 626C 747A 8085 898E 9498" $"9A99 999D A5AD B3B5 B5B3 AEA8 A29E 9B9C" $"9C9B 9997 9BA2 A7A4 9B90 8986 878C 9299" $"9E9E 988E 8580 8081 817F 7B79 7879 7A79" $"7777 787B 7F83 8890 99A2 A7A9 AAAB AAA5" $"9E98 9698 9C9F A3A6 A8A8 A6A3 A09E 9B99" $"958E 847C 7877 787B 7E80 807C 7672 7477" $"7773 6A60 5957 585E 6872 787A 7B7C 818A" $"959F A4A2 998F 8785 8687 8580 7B76 7373" $"777F 8B97 A1A9 ACAB A59C 9185 7B76 7880" $"8C97 A0A6 A8A8 A6A1 9B97 948F 887E 756E" $"6966 6260 6064 6A6E 7071 7273 7577 7776" $"777A 7F84 888A 8C8C 8B8C 8E93 999D 9D9B" $"9691 8D8B 8B8C 8F91 9392 918F 9197 9D9E" $"9A93 8D89 8685 8688 8B8E 9193 9393 9599" $"A0A7 ACAD ABA7 A4A3 A4A6 A7A6 A29D 9892" $"8D88 8582 7F7C 7975 7270 6E6C 6B6B 6C6D" $"6C6B 6966 625D 5751 4C47 3F37 302C 2925" $"2222 262E 3331 2821 2027 2E31 2E29 272C" $"343A 3F41 4343 4243 4547 4847 4644 4242" $"4346 4B4F 5253 5353 5354 5556 5757 5655" $"5455 534E 4640 3E3D 3B38 3535 373A 3935" $"2F2C 2E34 3B42 4649 4C4E 5051 504E 4C4C" $"4F53 585B 5A55 4F48 4341 4349 5056 5A5C" $"5E61 6469 6E74 7A80 8382 7C75 6E68 6465" $"6A72 7B82 878B 8E91 9291 8E8A 857F 7872" $"6C68 6665 6464 6466 6A6F 767D 8489 8C8E" $"8D8A 8682 807D 7973 6A60 564E 4741 3C3A" $"3939 3839 3937 342F 2D2F 3439 3D40 4246" $"4C52 5655 524D 4C4C 4D4C 4A49 4A4C 4E51" $"5352 4C44 3B33 2F2F 3134 3535 3330 2D2A" $"2723 2223 262B 2F32 353A 3F46 4C51 5456" $"585C 5F5F 5B52 4840 3D3E 444C 5358 5A5A" $"595A 5D61 656A 7078 7F85 8B94 9FAA B3B9" $"BEC5 CDD2 D4D1 CBC4 BBB4 AEA9 A49F 9C9A" $"9790 877C 736F 7074 797A 7774 7376 7B80" $"807E 7B79 7B7C 7A74 6B63 5D5B 5E66 717C" $"8893 9B9D 9A94 9091 959B A1A6 A9AB ABA9" $"A49C 9187 807D 8087 8C8C 8884 8383 8484" $"878F 99A3 A8A7 A29D 9B9C A0A1 9F9B 9793" $"8E88 827C 7B7E 8284 7F77 706B 6A6C 6F72" $"7679 7A7B 7D83 8D99 A6AF B3B4 B3B3 B3B5" $"B5B5 B4B2 B1AE ABA7 A4A1 9F9D 9B95 8C83" $"7D7C 7D7D 7A76 7577 7C81 8586 8481 7E7C" $"7D81 888E 9398 9CA0 A3A3 A3A3 A2A3 A2A0" $"9B92 8577 6A61 5D5E 6166 6969 6661 5E5C" $"5B5B 5E64 6D77 8087 8B8A 8781 7D7D 8288" $"8E90 8F8D 8C8C 8D8C 8985 817E 7B7B 7E81" $"8587 8886 8077 6E6A 6C72 7778 7776 787B" $"7F81 858B 949F A7AC AEAF B1B5 B8BA BCBE" $"C1C3 C4C4 C3BF BAB5 B0AC A9A8 AAAF B4B9" $"BCC2 CAD1 D6D7 D3CE C9C6 C3C0 BFBF C2C6" $"CACC CBC8 C5C6 C9CE CFCE CAC5 C1BD BABB" $"C0C6 CBCC C8C3 BFBE C0C2 C1BE B9B6 B7BD" $"C5CC CFCD C8C1 BAB3 ABA3 9D9B 9A99 9793" $"908F 8F91 9294 979B 9EA0 A09E 9B98 9593" $"918F 8C8A 8785 8482 7F7C 7978 787A 7B7C" $"7D7E 838B 9399 9DA0 A19F 9994 9396 9BA0" $"A2A5 A8AB AEB0 B0AF ACA7 A29F A0A2 A3A4" $"A5A7 AAAC ACAA A7A5 A5A5 A5A4 A19D 9994" $"8F88 8079 7571 6D68 6462 615F 5D5B 5958" $"5758 5A5D 6266 696B 6F75 7F8B 98A2 A9AD" $"AEAD ADAD ADAD ACA9 A39D 9895 9596 979C" $"A3AC B2B2 ADA6 A19F 9F9E 9C97 928D 8884" $"807D 7C7A 7978 7877 7676 7678 7A7D 7F7E" $"7971 6A64 6262 615F 5D5C 5C5B 5B5C 5F65" $"6A6A 6866 686F 7A86 9199 9C9B 958E 8680" $"7D7B 7A7B 7A7A 7876 726E 6C6B 6B6A 6867" $"686A 6D72 777B 7C7B 7875 7576 797E 848A" $"8D90 9294 9796 938E 8985 8280 7F7F 8081" $"8285 898D 9194 979A 9C9F A4A8 ADAF B1B2" $"B3B5 B6B6 B5B4 B3B6 BCC4 CDD4 DADF E2E2" $"E0DC D7D2 CDC7 C0B6 ACA3 9C98 9798 9C9F" $"A09F 9D9B 9999 9CA2 A8AC ABA8 A5A3 A4A6" $"A8AC B0B6 BCC1 C5C7 C8C9 CACA C9C5 C0BC" $"BBBD BDB9 B0A5 9D9A 9CA0 A4A3 9E97 8F8A" $"8989 8986 8381 8283 8585 8381 7F7D 7E7E" $"7E7B 746C 645F 5B59 595B 6168 6D70 6F6C" $"6866 6564 6463 6364 676B 6D6D 6B6B 7078" $"8185 8581 7B75 7373 787E 858B 8F93 979B" $"9EA1 A2A3 A5A6 A7A8 A8A6 A29B 9288 7F79" $"7573 716F 6D6C 6E71 767C 8082 8384 888C" $"8E8D 8881 7973 7274 787C 7F80 7E79 7471" $"7072 7373 706A 6259 524E 4B4A 4948 4748" $"4B4F 5459 5D5F 5F5E 5B56 5455 5C65 6C6D" $"6961 5C5B 5F64 6869 6A6B 6D6F 6F6B 655E" $"5855 524C 433A 3738 3D46 515C 6364 5F58" $"5251 575F 676C 7176 7A7D 7E7F 7F7E 7A74" $"6D69 6867 6664 6466 6662 584D 423B 3736" $"383A 3D3F 4142 413F 3D3C 3C3C 3B37 3029" $"2525 272A 2C2E 2F30 3030 3133 363A 3D3F" $"4244 4545 4545 464A 5056 5C62 666B 7074" $"7574 7271 757C 8384 7E75 6F71 777E 7F7A" $"726B 6869 6B6B 675F 5651 5257 6069 7073" $"7272 7477 7A7C 7D7E 7F82 8382 7D75 6C66" $"6464 625E 5A57 5656 5655 5452 4F4D 4C50" $"575F 6669 6A6A 6C6F 7171 6F6E 6C6C 6D70" $"7375 7573 6E69 6562 605C 554A 3D31 2822" $"1D1B 1A1B 1D1F 1F1F 222B 353A 3934 3032" $"383F 4343 4040 4349 5055 5A61 6970 7270" $"6D6E 747B 8081 7E79 7470 6E70 7378 7C7F" $"8182 8489 8E90 8D87 817A 736D 6864 605D" $"5955 514E 4C4B 4C4B 4741 3F41 464A 4B49" $"4542 4141 4242 4449 525B 6268 6C72 797E" $"8183 8383 807D 7B79 7776 7574 726F 6A65" $"605F 5F60 6161 605F 5D5B 5855 5457 5D64" $"696E 7276 7879 7978 787A 7E83 8582 7A73" $"7072 7679 7A7D 8188 8C8D 8B89 898A 8A89" $"8684 8283 8891 9AA0 A19C 958E 8A86 837E" $"7A77 7678 7A7C 7E7F 8081 8181 8282 7F79" $"7067 5E57 5356 5D67 6E72 7271 6F6C 6866" $"676A 6C6E 6F6E 6D6E 6F71 7273 7373 7373" $"7373 7575 726D 6762 5E5D 5E5D 5853 4E4C" $"4B4B 4947 4645 4648 4B4F 5357 5A5C 5E61" $"6468 6C6E 6E6D 6A68 6768 6B6E 6F6E 6C69" $"6764 6261 6162 6465 676A 6D71 7578 7B7E" $"8081 8183 8689 8C90 9395 979B A2AA B0B4" $"B3B1 B2B6 BABA B7B4 B3B5 BABE C0BF BDBE" $"C2C7 CBCE CFD1 D2D2 D0CC C8C6 C8CA CCCB" $"C7BF B7B1 B1B9 C5D2 DDE5 EAEC ECE9 E3DE" $"D9D5 D4D4 D2CF CCCA CDD4 DEE8 EFF2 F2F0" $"EBE8 E7E8 EBED F0F1 F2F1 EFEC E9E5 E0DA" $"D5D2 D0CE CECE CCC8 C2BA AFA5 9C97 979D" $"A5AD B1B1 AFAD AAAA ACAE B0B3 B5B6 B5B3" $"B0AD AAA8 A6A3 A19F 9E9E 9FA0 9F9D 9895" $"9596 9797 9899 9B9C 9B98 938E 8A87 8686" $"8684 807A 726A 645F 5D5C 5B5A 5754 514E" $"4D4D 4D4F 5154 575B 5E63 696E 757F 8A94" $"9897 9491 9193 999F A6AA ABA8 A49F 9A95" $"9190 9394 9390 8D8C 8D8E 8E8C 8989 8C91" $"9492 8E8B 8A8D 8D8A 8480 7F7F 7E7B 7B82" $"8F9D A7AC AEB1 B4B6 B3AA 9F95 908F 8E8C" $"8886 888D 9399 9C9A 9691 8D8A 8786 8380" $"7D7A 7978 7877 787C 8084 8789 8D92 9698" $"9798 9BA1 A8AF B5BA BCBA B5B0 ADAC ADAD" $"ACAC ABAB A9A7 A6A8 AAAC ADAC AAA8 A5A4" $"A7AD B8C3 CCD0 D4D8 DCE0 E2E1 DFDF E0E2" $"E3E1 E0E2 E6E9 E7E3 DDD8 D4CE C8C1 BCBA" $"B9B6 B1AA A39C 938B 8584 878A 8B89 8685" $"8687 8886 827E 7B7A 7A7C 7F84 898C 8C8A" $"8887 8684 817E 7D7E 8080 8285 8B93 9A9F" $"A1A0 9C98 9697 9BA0 A3A5 A4A3 A3A3 A4A4" $"A3A1 A0A0 9F9F 9F9F 9E9C 9995 9290 8F90" $"9091 9293 9495 9799 9A9C 9C9A 9895 9290" $"8D89 8683 817E 7C7B 7A7A 7A7B 7E83 8A90" $"9597 9797 9696 9593 8F88 8178 706A 6560" $"5D5C 5D5E 5E5E 5F63 6A6E 7173 767B 8082" $"817C 797A 7D80 8382 7F7D 7B7C 7D7D 7D7B" $"7876 7574 7474 777B 8187 8D8F 8D86 7E77" $"726E 6A69 6A6D 7072 7270 6E6D 6C6E 7175" $"797C 7E80 8488 8C90 9395 999D A0A2 A2A1" $"9F9B 9791 8B86 827F 7B76 7069 6361 6368" $"6E73 7779 7C7E 8184 8789 8B8C 8D8C 8984" $"7D78 7471 6F6E 6F6F 6F6E 6C6B 6968 6767" $"6766 6463 6363 615C 5754 5354 5659 5D60" $"615E 5852 4E4C 4B4B 4D52 585C 5C56 4F49" $"4647 4949 4744 4344 494E 5255 5A61 6769" $"6865 6260 605F 5E5C 5B5E 6163 625F 5B56" $"514A 433E 3A37 3637 3B3F 4244 4546 4646" $"4540 3C3A 3B3E 3F3E 3B3A 3A3B 3E42 464B" $"5056 5D63 696E 7174 777A 7E81 8281 7E7D" $"7E82 8483 7F7B 7876 7572 6D66 5E57 5455" $"5A60 6669 6A67 6360 5D5D 5E60 6367 6A69" $"6763 605D 5955 514D 4C4B 4A48 4643 4140" $"3F40 4245 4A51 575B 5C5D 5D5D 5D5D 5C5D" $"5E61 6364 6360 5E5B 5A59 5B5E 6367 6764" $"6161 6261 5E5A 595B 5E60 5F5A 5554 565A" $"5C5D 5D5E 6266 6867 6564 6464 6462 605F" $"5E5E 5D5D 5C5B 5A5A 5B5D 6062 6160 5F5E" $"5E5E 5E5E 5E60 6367 6A6E 7275 7675 7374" $"767A 7D7F 7E7D 7B78 7879 7D81 8589 8C8F" $"8F8F 8F8E 8F8F 8F91 9191 8E8B 8886 8585" $"8686 8685 8482 807D 7977 7573 706C 655F" $"5750 4A46 423E 3831 2B28 2625 2527 2B34" $"3F4D 5960 6261 6062 6669 6863 5D58 5655" $"5553 5354 5759 5957 5657 5A5F 6367 696C" $"7073 7677 7775 7473 7373 7270 6D6A 696A" $"6C6E 6E6D 6B6A 6A6C 6D6D 6C6C 6D6D 6D6D" $"6B69 6764 625F 5D5B 5A5A 5B5B 5B59 5756" $"5759 5B5E 5F61 6366 6869 696A 6D6F 7172" $"7374 7575 726E 6C6C 7075 7A7F 8385 8381" $"7E7C 7B79 756F 6860 5954 514D 4946 4547" $"4A4F 5459 5F64 696E 7173 7270 6E6E 6E70" $"7274 787C 8083 8483 817E 7B7A 7979 7978" $"7776 7575 7677 7776 7576 797D 8186 8B91" $"979C A0A2 A2A1 9E9A 9692 8F8E 8D8C 8985" $"807D 7C7E 8285 8785 827E 7C7B 7D80 858B" $"929A A0A2 A09D 9895 918E 8986 8482 807C" $"7874 7272 7477 7A7B 7C7F 8285 8582 7D77" $"7472 7477 7B7D 7C79 7777 797A 7977 7574" $"7371 6D68 6463 6363 625F 5B57 5555 585C" $"6169 7077 7C80 8285 8788 8887 8686 898D" $"8F8F 8D8A 898B 9098 9D9F 9E9D 9DA0 A2A3" $"A2A1 A2A5 ABB0 B4B6 B6B6 B5B3 B1AE ACAC" $"ADB1 B6BC C2C6 C9C8 C5C0 BAB4 AEAB AAA9" $"A7A3 9E9B 9B9D A0A1 A1A2 A4A8 ABAE AFB0" $"B1B3 B7BA BCBC BAB7 B3B0 ABA7 A19B 9692" $"9192 9598 9A9E A2A5 A8A8 A7A5 A4A2 A1A0" $"9F9F A09F 9D99 948F 8C89 8685 8586 8888" $"8888 898A 8A89 898A 8A88 827A 726E 6F73" $"797F 8384 8382 8182 8385 878B 9095 9898" $"9693 9191 9294 989D A2A6 AAAE B5BC C2C8" $"CCCD CBC7 C4C2 C0BF BDBB BAB9 BABC BFC4" $"C8CB CCC9 C5C0 BCBA BBBD C0C2 C3C4 C6C6" $"C3BC B4AD A9A8 A9AA A8A3 9D99 999E A6AF" $"B6BC BEBE BDBC BAB7 B5B3 B5B8 BCC0 C4C9" $"CFD3 D7D7 D4CF C9C2 BBB6 B3B2 B3B3 B3B1" $"B0AE AFB2 B7BC BEBF BEBE BFC3 C7CC D2D8" $"DEE1 E0DD D9D5 D3D2 D2D1 CFCB C8C6 C5C5" $"C4C1 BDBA B8B7 B7B7 B7B8 B9B9 B9BB BFC6" $"CDD3 D6D5 D2CC C6C1 BFBF BEBB B7B3 B2B4" $"B8BC BFBF BEBC BCBC BCBB BAB7 B4B1 AEAB" $"AAA9 A8A7 A5A2 A1A1 A4A8 ABAD ADAC AAAA" $"ABAC ADAD ACAA A9A8 A6A3 9D94 8B85 817F" $"7C79 787A 7E83 888C 8F91 9293 9598 9DA1" $"A4A5 A4A0 9B95 8F89 8581 7F7C 7978 797B" $"7C7D 7D7B 7978 7878 797A 7A7B 7C7D 7E7E" $"7F82 868A 8D8F 8F8F 8F91 9292 9292 9393" $"9290 8C88 8480 7B76 7370 7070 7171 7171" $"7071 7274 797E 8286 898C 8E90 9091 908E" $"8A85 817D 7B79 7877 7471 6D69 6662 605E" $"5E5E 5E5E 5E5E 5F61 6466 6563 605D 5D5D" $"5F61 6466 6666 6566 6667 6766 6461 6060" $"6164 686A 6C6C 6B6A 696B 6D70 7375 7676" $"7778 7A7B 7C7B 7976 726F 6C6A 6867 6663" $"605D 5B59 5755 5455 585A 5B5A 5856 5452" $"5253 5455 5554 5251 504F 4E4E 5053 585B" $"5E5F 5E5E 5F61 656C 7378 7C7D 7E7F 8184" $"8A91 979D A0A2 A4A5 A6A6 A5A2 9E9B 9897" $"9693 8E87 807A 7673 7374 777B 7D7E 7B78" $"7573 7374 787E 858C 908F 8C87 8280 7F7E" $"7F81 8385 8786 8380 7C7A 7A7C 7F81 8282" $"8282 8282 807C 7771 6B65 605C 5958 5655" $"5455 575A 5C5D 5B57 5351 5153 5352 4F4D" $"4E51 5457 595B 5D5F 6161 5F5D 5C5B 5A59" $"5653 504C 4947 4748 4B4F 5356 5756 5350" $"4D4D 4F52 5657 5551 4D4A 4A4D 5154 5450" $"4B47 4340 3D3A 3735 3331 2F2D 2C2C 2D31" $"3437 3837 3737 393D 4247 4A4C 4C4D 5056" $"5E66 6E75 7B7F 817E 7770 6A67 6769 6A68" $"6561 5E5D 5F63 686E 7478 7A7A 7978 787A" $"7B7C 7B7A 7875 716C 6864 6261 605F 5E5E" $"5F60 5F5E 5B56 4F49 4749 4D51 5454 5352" $"5251 4F4D 4D50 565A 5D5B 5853 504D 4A47" $"4544 4341 403F 3E3E 3D3C 3B3C 3E40 4244" $"4546 4749 4B4B 4A49 4848 4949 4743 3C35" $"2D26 211F 1F1F 1F1D 1916 1312 100E 0C0A" $"0908 0808 090B 0C0F 1217 1D24 2B31 3537" $"383A 3B3E 4145 4B52 595F 6466 6663 605C" $"5958 595A 5956 504B 4848 494D 5157 5C60" $"6161 6162 666A 6F73 787C 7F80 7F7C 7979" $"7A7D 7F80 8181 8181 8183 8588 8B8D 8E8D" $"8C8B 8A8A 8782 7C75 7170 7377 7C80 8284" $"868A 8F95 9A9E A2A7 ACB1 B5B8 B9B8 B7B4" $"B1AE ABA9 A7A4 A19D 9998 989B 9E9F 9F9D" $"9893 8E8A 8785 8381 807F 7F80 8080 7F7D" $"7C7C 7C7C 7C7C 7C7C 7B79 7675 787E 868E" $"9498 9B9D 9FA0 A2A4 A6A8 A9A9 A8A7 A7A7" $"A5A2 9E9C 9C9E A1A4 A7A9 AAA9 A9A8 A6A3" $"9E97 918C 8885 817D 7A78 7777 787A 7C7F" $"8386 8787 8684 8281 8182 8180 7E7C 7A78" $"7673 6F6C 6B6C 6F73 7575 7371 7171 7376" $"7A7F 858B 8E8F 8E8E 8E8F 8F8F 8F8D 8C8A" $"8782 7D78 7573 7373 7476 797B 7C7C 7A7A" $"7B7D 7F80 807F 7C7A 7775 7475 777B 8187" $"8D92 9495 9493 9393 9495 9696 9695 9495" $"9799 9A99 9795 9596 9696 9492 9191 9192" $"9497 9999 9896 9594 9392 8F8C 8987 8686" $"8687 8788 888B 9097 A1AA B3BA BFC2 C3C1" $"BEBC BAB8 B6B2 AEA9 A49E 9792 8F8F 9195" $"989A 9B9C 9FA2 A4A6 A7A6 A5A2 9F9E 9FA3" $"A7AC B1B6 B9BA B9B6 B2AE ABAA A7A4 A09D" $"9A9A 9B9B 9B9A 9896 9493 9291 908F 8E8E" $"8C8B 8988 8788 898C 9195 9999 9795 9393" $"9597 9A9B 9B98 938F 8D8C 8E8F 8F90 8F8D" $"8A86 8383 8486 8889 8989 8787 8787 8889" $"8886 8585 8687 8888 8785 8381 7F7E 7E80" $"8182 8282 8180 8080 8180 7F7F 8083 878A" $"8D8D 8E90 9395 9798 9899 9B9E A3A8 ADB1" $"B4B6 B7B8 B7B6 B5B4 B3B2 B2B2 B1AE A9A2" $"9A92 8C87 8481 7F7E 8082 8689 8B8C 8D8E" $"8E8F 9091 9497 9A9C 9B9A 9796 9595 9595" $"9697 9797 9798 999B 9EA0 A3A5 A6A8 A8A8" $"A8A6 A5A3 A19F 9E9D 9D9E A0A2 A4A4 A4A4" $"A5A6 A9AA ABAB ABAC ACAA A8A4 A19E 9D9C" $"9C9F A2A4 A5A3 A09D 9B9C 9FA3 A7A9 A7A4" $"9F9B 9999 9A9C 9FA1 A3A4 A3A0 9B96 9190" $"949A A0A5 A8A9 A9A9 ABB0 B8C0 C7CB CDCF" $"CFCF CDC9 C5C2 C1C1 C1BF BBB6 B2AE ACA9" $"A5A1 9D9A 9894 908D 8A89 898A 8C8F 9293" $"928F 8C89 888A 8D90 9496 9898 9897 9595" $"9699 9C9D 9D9D 9D9F A1A3 A5A6 A7A9 ABAD" $"B0B2 B4B5 B5B5 B2AE AAA4 9F9B 9795 9493" $"9292 9497 9B9D 9C9A 9795 9493 9394 969B" $"A0A4 A7A8 A8A8 A8A8 A7A7 A7A6 A49F 9993" $"8E8A 8989 8B8D 8F8F 8F8F 8F91 9599 9FA4" $"A8AC AEAE AAA5 9E99 9593 9291 9192 9496" $"9594 9394 989E A3A7 ABAE B0B1 B1B2 B4B8" $"BBBD BDBC BBBB BBBB BBBB BAB8 B4B1 B0AF" $"AFAD A9A4 9D96 908D 8C8D 8D8E 8D8C 8A89" $"8787 8887 8581 7B76 726F 6D6C 6C6C 6D6D" $"6D6E 6F71 7373 7475 777B 7F82 8484 827F" $"7C78 736C 655E 5957 5656 5453 504D 4A47" $"4546 474A 4E51 5557 5859 5958 5858 595A" $"5A59 5856 5658 5959 5959 5A5D 6163 6463" $"6160 6162 6464 6361 5E5B 5957 5552 4F4D" $"4C4C 4C4C 4D4D 4F50 4F4E 4B4A 4A4B 4C4D" $"4B48 4441 3E3C 3B39 3837 3635 3536 393B" $"3C3C 3B3B 3C3E 4145 484B 4C4D 4D4E 4F50" $"5357 5C60 6364 6362 6263 6465 6564 6362" $"6160 5E5C 5956 5350 4F4E 5052 5558 5B5D" $"5E5F 5F5F 5F5E 5B56 504A 4643 4242 4243" $"4445 4545 4442 4141 454B 5259 5F64 686B" $"6E71 7579 7D80 8281 7E7B 7776 7676 7777" $"7777 7776 7573 716F 6D6C 6B6A 6A6C 6E70" $"6E6A 645E 5A58 585A 5B5B 5A57 524D 4845" $"4446 494D 5256 5857 534E 4A48 4A4E 5357" $"5857 5451 5051 5357 5B60 6467 6765 6260" $"5F5F 5F5F 6061 605D 5850 4943 4040 4245" $"4747 4542 4040 4142 4548 4D53 585B 5B57" $"524E 4B4A 4B4B 4B4A 4947 4544 4345 484D" $"5153 5353 5250 4E4B 4947 4749 4C50 5355" $"5554 5354 5556 5858 5959 5856 524D 4946" $"4545 4647 4849 4948 494A 4D51 5354 5351" $"4E4D 4E51 5457 5757 5757 5859 5A5D 5F61" $"6263 6364 6463 615F 5D5B 5855 514E 4B4A" $"4949 4A4D 5054 575A 5C5D 6166 6C71 7374" $"7577 7A7C 7B79 746F 6B69 6869 6A6C 6F71" $"7374 7474 7679 7D81 8386 888A 8A89 8684" $"8383 8280 7E7B 7977 7574 7476 787B 7E7F" $"7F7E 7B78 7675 7675 7473 7374 777A 7D7E" $"7F7F 7F81 8386 8A8D 8D8C 8A88 8787 8788" $"8989 8A8A 8988 8786 8585 8584 8381 7E7A" $"7673 7273 7577 7877 7572 7171 7377 7C80" $"8486 8785 8483 8486 898C 8F91 9495 9594" $"908D 8B89 8886 8483 8486 898C 8E91 9395" $"9799 9B9B 9A98 9797 9797 9796 9491 8E8B" $"8886 8583 807D 7975 706C 6A6A 6B6C 6E6E" $"6D6C 6B6A 6B6D 7073 7679 7E83 8A92 9AA1" $"A6A8 A6A3 9F9B 9A99 9A9C 9E9E 9D99 948D" $"867F 7B7B 7D80 8384 8483 8484 8585 8382" $"8080 8081 8283 8281 7F7B 7876 787C 8082" $"8280 7C76 7170 7173 767C 8288 8B8C 8C89" $"837C 7774 706C 6B6E 757D 858C 9294 928D" $"8783 7F7C 7B7E 8184 8688 8C94 9B9F 9D96" $"8A7F 7979 7D81 8383 817F 8082 8588 8C90" $"9598 9A9A 9A99 989A 9EA4 AAAF B5BA BEC0" $"BEBB B7B3 B1AF AFB0 B1B1 B2B2 B3B4 B6B8" $"BCC1 C7CD D1D3 D2CE C6BE B6B1 AEAC ABAA" $"A9AA AEB3 B7B8 B4AC A39A 938F 8D8D 9094" $"9AA1 A5A9 AAA9 A6A1 9C97 9594 9598 9FA8" $"B2BB C0C1 BEBB B9B8 BABC BDBD BCBB BCBD" $"BFC0 C1C2 C5C9 CCCB C7C0 B6AD A7A3 A2A1" $"A1A1 A1A1 A19F 9C98 938F 8A86 8383 8588" $"8D94 9BA4 ABB1 B6BC C0C4 C6C7 C7C6 C5C3" $"C1C0 C1C4 C7CA CDCF D0D1 D1D0 CFCE CCC9" $"C8C9 CBCE D1D3 D5D6 D5D1 C9BF B6AF ABA7" $"A39F 9C9A 9B9F A4A9 ACAC ABA9 A6A3 A09D" $"9A99 9BA0 A6AD B3B8 BEC3 C9D0 D5D9 D9D6" $"D1CC C9C8 C8C8 C7C6 C7CA CDD0 D0CE C9C2" $"BBB5 B0AD ACAD AFB1 B2B3 B2B1 AEAC ABAD" $"B0B5 B8BA BBBC BDBF BFBB B5AE A8A5 A5A6" $"A7A5 A29D 9893 8F89 837E 7B7D 8186 8B90" $"9294 9595 9390 8B86 817C 7976 7476 7A81" $"888E 9192 918E 8C8A 8989 8888 8888 898B" $"8D8F 908F 8D88 827A 736E 6A68 6664 6362" $"6365 686A 6D70 7273 7370 6D6C 6C6E 7175" $"797D 8082 8382 807D 7976 7576 7A7F 858A" $"8D8F 9091 9190 8F90 9296 9B9E A09F 9E9E" $"9FA0 9F9C 968E 867E 7875 7374 7678 7978" $"7571 6E6E 7073 7575 7472 7272 7477 7B7D" $"7E7D 7D7D 7F82 8689 8A8A 8B8C 8F92 9599" $"9C9E 9F9E 9D9C 9C9D 9FA3 A7AB ACAB AAA8" $"A8A8 A8A6 A39E 9995 9291 9294 9594 908B" $"8683 8181 8181 8180 807F 8184 888B 8F93" $"9699 9B9C 9C99 9692 8E8C 8C8D 8D8D 8B89" $"8889 8B8E 9193 9494 9495 9799 9B9B 9997" $"9493 9190 8D8A 8784 817F 7B77 716C 6864" $"615E 5C58 534E 4B49 4948 4847 4747 4849" $"4A49 4745 423F 3E3C 3936 3331 3234 3637" $"3839 3C3E 4142 413F 3E3E 3E3D 3C3A 3837" $"3738 3837 3534 3538 3A3B 3B3C 3C3C 3F44" $"4A50 5252 514F 4F4F 5050 504F 4D4B 4A49" $"494B 4F52 5353 524F 4B48 4542 4140 4142" $"4445 4647 4644 413F 3D3E 4044 484D 5256" $"595C 6166 6D71 7372 7171 7273 736F 6A65" $"6160 6062 6466 696B 6E70 7375 7779 7978" $"7775 7373 7375 7575 7370 6F6E 6F71 7272" $"7271 7171 7170 6F70 7172 7474 7373 7373" $"7373 7170 6F6E 6F6F 6F70 7071 7273 7474" $"7371 6E6B 6A68 6665 6466 6769 6A6A 6A6A" $"6A67 635E 5855 5353 5456 5655 514E 4B4B" $"4D50 5355 5552 4F4B 4A4A 4D51 5455 5553" $"504E 4E50 5357 5A5C 5D5D 5E62 676C 7071" $"7271 7272 7475 7779 7B7B 7B78 7673 7272" $"7375 7677 797B 7E81 8588 8A8C 8D8E 9092" $"9496 9799 9A9A 9996 928F 8C8A 8888 8683" $"7D77 716C 6865 615E 5B58 5653 514E 4D4C" $"4E52 575D 6264 625F 5B59 5A5E 6468 6A69" $"6765 6464 6362 615F 5D59 534E 4947 4748" $"4847 4442 403F 4143 4444 4344 4649 4B4E" $"5154 595C 5E5E 5D5C 5A58 5651 4C46 413D" $"3A38 3737 383A 3C3C 3B39 342F 2B2A 2A2D" $"2F31 3233 3334 3638 3837 3634 3435 383C" $"4044 484C 4F52 5457 5A5E 6265 6663 5D57" $"514D 4C4E 5052 5455 585B 5E60 6263 6363" $"6465 6666 6769 6B6F 7377 797A 7A78 7776" $"7879 7B7B 7B7A 7878 7878 7A7B 7D7D 7B7A" $"7877 7778 7A7D 8083 8483 8282 8282 8485" $"8788 8786 8482 8283 8586 8787 8787 898C" $"9196 9CA2 A7AC AFB1 B1B0 ACA7 A19B 958F" $"8A87 8686 8583 8180 7F7E 7D7B 7978 7878" $"7978 7775 7475 7573 716F 6F71 7476 7777" $"7575 777A 7E82 8689 8A8A 8B8E 9397 9999" $"9A9B 9D9C 9A97 9593 9291 8F8D 8C8C 8E90" $"9191 9192 9497 9898 9591 8E8B 8782 7D7C" $"7D81 8485 8381 8285 8A91 9799 9896 9494" $"9596 9696 9596 999E A2A3 A39F 9B97 9492" $"9294 99A0 A6A9 A7A3 9F9D 9E9F 9F9D 9B99" $"9998 9898 9897 9592 8E8B 8886 8685 8586" $"8686 8686 8687 898C 8F91 918F 8E8F 9296" $"9BA0 A4A9 AEB2 B5B6 B6B6 B8BA BDC0 C0BD" $"B8B2 ADAC ADB2 B6BB BFC2 C6C8 CBCC CDCD" $"CDCE CFCE CBC4 BAB0 A8A2 A1A2 A5A9 ABAB" $"A9A7 A7A9 ADB3 BAC1 C8CF D3D4 D3D1 CDC9" $"C6C4 C3C1 BEBC B9B8 B9BB BEBF BFBC B7B1" $"AAA4 9F9D 9D9F A4A9 AFB4 B7BA BCBD BDBB" $"B9B8 B6B4 B1AD ABA9 A9A8 A8A7 A7A7 A6A4" $"A2A0 A0A1 A3A3 A2A0 9E9E A2A7 AEB5 BCC2" $"C8CB CCCC CAC9 C9C9 C9C7 C5C1 BDB8 B4AE" $"A79F 9793 9192 9291 8F8E 8F92 979C A0A3" $"A5A8 ABAF B2B3 B1AE AAA6 A29E 9A95 9290" $"9193 9596 938D 8680 7E7E 8288 8F94 9797" $"9694 9393 9496 989A 9C9F A0A0 9C96 908B" $"8888 8889 8A8A 8A89 8A8C 8E91 9599 9DA1" $"A5A7 A9A9 A8A6 A4A3 A1A1 9F9D 9B98 9696" $"9798 9998 948F 8984 8383 8589 8C8E 8E8B" $"8781 7D7A 7A7B 7F84 898E 9294 9493 9392" $"9291 9193 9597 9898 9795 9290 8D8C 8B8A" $"8B8C 8C8B 8986 8380 7F7E 7F80 8183 8587" $"8888 8685 8688 8C8F 9090 8F8F 9092 9497" $"999A 9895 918E 8B8A 8B8C 8F92 9698 9999" $"9999 9B9C 9D9C 9A97 9491 8E8C 8987 8686" $"888B 9196 9CA0 A3A6 A7A8 AAAD B1B4 B7B8" $"B9B8 B6B4 B1AE ACA9 A7A6 A5A5 A4A3 A2A2" $"A1A2 A3A6 A9AD AFB0 AEA9 A4A0 9FA1 A5A9" $"ADAF AFAD ACAA A9A9 A8A7 A49F 9995 9395" $"989C 9FA1 A1A0 A1A1 A2A3 A4A5 A4A3 A3A4" $"A6A6 A5A1 9C96 9290 8F8E 8D8A 8681 7D7C" $"7D7F 8183 8585 8686 8788 8888 8685 8586" $"888B 8E90 9294 9799 9A9B 9A99 9896 9490" $"8C88 8786 8482 7E79 7570 6D6A 696A 6A6B" $"6A68 6562 6160 6161 6160 5D5A 5756 5757" $"5756 5657 5756 5655 5558 5D64 6C72 7677" $"7776 7675 7473 706B 655E 5650 4B48 4848" $"4846 4340 3D3B 3C3E 4144 4749 4B4C 4D4C" $"4B49 494A 4C4E 4E4C 4944 403D 3D3E 3F40" $"403F 3E3D 3D3D 3D3D 3E40 4346 494C 5054" $"5859 5A59 5858 5858 5858 5858 5858 5959" $"5B5E 6166 6A6D 6F70 706F 6F70 7172 7475" $"7575 7475 7677 7879 7877 7471 6F6E 6D6E" $"7072 7271 6E6A 6663 6263 6569 6C6E 6F70" $"7174 787D 8183 8483 8281 8284 8789 8B8B" $"8986 817E 7A77 7471 6F6E 6F70 7273 7475" $"7576 7777 7673 6D66 5F59 5451 4E4B 4845" $"4342 4345 474A 4B4C 4D4D 4C4C 4C4B 4A47" $"4442 4140 4143 4648 4B4D 4D4D 4D4B 4947" $"4442 403F 3E3B 3835 322F 2C28 2421 1E1C" $"1B1C 1E22 2528 2A2A 2B2C 2E31 3435 3433" $"312F 2E2E 3034 3940 464B 4F51 5251 504D" $"4946 423F 3C3A 3938 3836 3431 2E2C 2C2C" $"2D2F 3338 3E44 494C 4F50 504F 4F4E 4D4D" $"4D4E 4D4C 4C4C 4E51 5457 5A5C 5D5C 5B5A" $"5A5B 5D5F 605F 5E5C 5B5A 5B5C 5E60 6162" $"6263 6363 6363 6466 6768 6868 696A 6B6B" $"6B6B 6A69 6867 6768 6A6E 7378 7B7D 7E7F" $"8081 8181 807F 7E7D 7B7A 7877 7675 7473" $"706C 6864 5F5B 5756 5555 5454 5455 5758" $"595B 5D5F 6265 686A 6C6E 7175 787C 7E80" $"8081 8283 8689 8D90 9294 9596 9798 999A" $"9A9B 9C9D 9EA0 A3A6 A9AA ABA9 A7A4 A2A0" $"9FA0 A1A2 A4A4 A4A3 A2A0 9E9C 9B9C 9C9C" $"9992 8A80 7873 706E 6E6D 6B6A 6868 696B" $"6D6F 7173 7577 7878 797A 7B7D 7E7E 7C7A" $"7775 7371 706F 6E6D 6C6C 6B6B 6B6B 6B6A" $"6868 686B 6D70 7273 7371 6F6C 6968 6869" $"6B6D 7073 7575 7472 706F 7072 7373 706E" $"6C6C 6E71 7579 7D82 8689 8A8B 8B8A 8A89" $"8888 8786 8481 7E7B 7977 7676 7778 7979" $"7979 7878 7879 7B7C 7C7B 7873 6E6A 6663" $"6160 6163 6667 6868 696D 7279 7E80 807F" $"7F7E 7C77 726D 6A68 686B 6F73 7677 7776" $"7779 7B7D 8084 8B92 999D A0A3 A5A8 AAAA" $"A8A6 A4A2 A09F A1A6 ADB3 B7B9 B8B5 B2AE" $"A8A0 9994 9295 9AA0 A4A7 A8A8 A9A9 AAAB" $"ADAF B1B3 B5B8 BCC1 C7CD D1D4 D6D5 D3CF" $"CBC6 C3C0 BEBB B9B7 B5B5 B7BA BFC3 C8CB" $"CDCE CFD0 D2D4 D6D7 D8DA DEE2 E7EB EEF0" $"F0EF ECE8 E3DE D8D3 CFCE CDCD CCCA C7C2" $"BCB6 B0AC A9A9 A9A9 AAAB AEB3 BAC1 C5C8" $"C8C9 CACC CFD1 D1D0 CFCF CFD1 D2D2 D0CD" $"C9C5 C2BE BAB7 B4B3 B3B3 B4B5 B6B6 B4B2" $"AFAD AAA7 A5A5 A9AF B5B9 BABB BAB8 B6B3" $"B1AF ADAC AAA8 A6A4 A3A4 A5A6 A7A6 A5A3" $"A2A3 A4A4 A19C 958F 8C8D 9094 989A 9C9D" $"9FA0 A09F 9E9C 9996 9390 8E8D 8C8A 8885" $"827F 7D7C 7C7C 7D7E 7F7E 7C7A 7774 7270" $"6F6E 6E6D 6D6D 6D6B 6A68 6868 6A6D 7073" $"7679 7C7E 8081 8384 8585 8380 7E7C 7C7C" $"7D7E 7D7D 7E7F 8182 8281 7F7C 7976 726E" $"6C6B 6B6C 6E6E 6E6F 7071 7375 7676 726D" $"6661 5E5D 5E5F 6061 6263 6362 6161 6367" $"6C72 7880 878F 979E A4A9 ACAE B0B0 B0AF" $"ACA9 A7A6 A8A9 A9A7 A3A0 9C9A 9998 9694" $"918E 8C8C 8C8D 8F90 9294 9697 9797 9696" $"9798 9A9B 9C9C 9C9C 9C9C 9C9D 9D9D 9D9E" $"9F9F A0A2 A5A9 ACAF B1B2 B3B3 B4B3 B1B0" $"AEAC AAA8 A8AA ADB0 B2B2 B1B0 AFAF B0B1" $"B1B1 AFAC A8A4 A09E 9B99 9897 999B 9C9D" $"9C9B 9A9B 9EA2 A6AA ADAF AEAC A8A4 A19E" $"9C9A 9897 9796 9695 9595 9595 9595 9699" $"9EA3 A6A7 A6A4 A2A0 A0A0 A1A0 9E9B 9692" $"8E8C 8D8E 8E8D 8983 7D79 7775 7370 6D6B" $"6A6A 6967 6563 6262 6365 676A 6C6F 7172" $"7271 7171 7274 7679 7B7D 7E7D 7A77 7370" $"6D6B 6A6B 6E72 7577 7675 7575 7678 797B" $"7D7F 8184 8689 8B8B 8A88 8581 7F7C 7A77" $"736F 6B67 6563 6260 5F5F 5E5E 5E5E 5E5E" $"5F5F 5F5E 5E5E 6061 6364 6463 6160 6164" $"686E 7376 7777 7675 7474 7372 706F 6E6F" $"7071 7272 7271 6F6D 6966 6463 6363 6363" $"6362 605F 5D5D 5C5A 5753 504E 4C49 4747" $"4A50 575B 5D5D 5C5B 5B5B 5A58 5654 5251" $"5152 5454 5452 4F4B 4642 3E3C 3937 3432" $"3030 3031 3336 393B 3B3B 3B3C 3D3F 4144" $"484B 4E50 5050 5152 5352 504D 4A49 4A4E" $"5256 595B 5C5F 6165 686B 6D6E 6E6E 6F70" $"7171 7273 7475 7676 7471 6D6A 6766 6564" $"6361 5F5D 5C5C 5E60 6263 6261 5F5C 5A58" $"5656 5657 5758 5858 5858 5A5D 6062 615E" $"5A55 514F 5053 575B 5D5F 6164 676B 6D6E" $"7072 7576 7674 7373 7578 7977 736E 6965" $"625F 5D5C 5C5D 5D5D 5D60 6468 6B6C 6E6F" $"6F6F 6F71 767C 8389 8E91 9291 8F8E 8E8F" $"8E8C 8781 7A72 6A62 5A53 4E4B 4946 423D" $"3A39 3B3D 4042 4241 403E 3E3E 4042 4547" $"494C 4F51 5252 5150 4F4E 4D4D 4E51 555A" $"5E60 5F5C 5955 5353 5456 5758 5756 5656" $"5658 595B 5C5C 5A57 534F 4D4D 4E4F 5050" $"4F4F 4F4F 5152 5253 5557 5B5F 6266 696C" $"7073 7677 7674 7372 7172 7273 7374 7576" $"7676 7675 7473 7270 6E6B 6764 6261 6366" $"6868 6765 625E 5A58 5657 5A5D 6062 6465" $"6769 6D71 777D 8388 8C8E 8D8B 8A8A 8A8B" $"8D8E 8F8E 8B87 8380 7E7F 8183 8484 8483" $"817E 7975 7271 7171 706E 6A66 6361 605F" $"5F5F 6062 6466 6561 5C57 5555 575C 6165" $"6767 6766 6768 6B6D 6E6D 6B69 6869 6C71" $"777C 7F81 807E 7B79 7775 7472 6F6D 6C6D" $"6F73 777B 7D7F 8082 8486 8788 888A 8C91" $"969A 9D9D 9C9B 9C9E A0A0 9E9B 9998 999A" $"9A99 9898 9999 9A99 9998 9796 9591 8D88" $"8482 8386 8A8E 9193 9494 9393 9392 9191" $"9191 9292 9291 9193 9597 9691 8C88 8788" $"8B8C 8C8A 8887 8888 8785 8382 8385 8788" $"8786 8586 888C 9095 9A9E A2A5 A7A8 A8A8" $"A8A9 A9AA AAAA A9A8 A7A7 A7A7 A6A5 A3A0" $"9D9B 9896 9492 908F 9091 9294 9494 9393" $"9293 9495 9695 9491 8F8C 8B8B 8D90 9293" $"9290 8E8D 8D8C 8C8B 8B8C 8D8E 8F91 9396" $"9899 9A99 9797 989A 9D9F A0A3 A6AB AFB3" $"B4B4 B3B3 B3B4 B6B8 BABC BEBF C0BF BFBF" $"C0C2 C4C7 C8C8 C7C4 C2C0 BEBD BDBE BFC0" $"BFBD B9B5 B1AE ADAD AEAF B2B5 B8BA BBBB" $"BBBB BBBB BCBD BEBE BDBB B9B6 B5B5 B6B7" $"B9BC BEBF BEBA B6B1 ADAB AAAB ACAE B0B1" $"B2B2 B1B0 AEAC A9A5 A19D 9A99 9A9D A0A3" $"A6A8 A9A9 A9A7 A5A3 A09D 9B9A 9A9A 9B9C" $"9E9F A1A3 A5A7 A8A8 A8A8 A8A9 AAAC ADAE" $"AEAE ADAD ACAC ABAA A8A4 A19F 9E9E A0A2" $"A4A6 A7A8 A8A7 A4A0 9C9A 9B9D A0A2 A3A2" $"A1A1 A2A4 A7AB AFB2 B4B5 B5B4 B2B0 AFAE" $"AEAF B0B2 B1B0 ADAB A8A7 A6A4 A2A0 9D9B" $"9999 9A9A 9B9B 9B9B 9A9A 9B9B 9B99 9795" $"9392 908F 8D8C 8C8B 8A89 8886 8380 7D7B" $"7A7B 7E81 8383 817F 7C7B 7B7D 7F82 8589" $"8E93 989C 9FA0 A09E 9B98 9695 9495 9595" $"9493 918E 8C8A 8989 898A 8B8D 8E8F 8F8F" $"8F8F 8E8E 8F90 9395 9797 9694 9290 8F8E" $"8D8B 8989 8A8D 8F91 9190 8E8D 8B8A 8887" $"8685 8585 8687 8888 8786 8585 8484 8484" $"8484 8484 8383 8384 8586 8787 8685 8484" $"8586 8889 8A8A 8A8A 8B8D 8E8F 8F8E 8D8D" $"8E90 9397 9B9E A1A4 A9AE B2B6 B8B9 B9B9" $"B8B7 B7B7 B6B6 B5B4 B3B1 AFAC A8A5 A3A2" $"A3A3 A2A1 A0A0 A2A5 A7AA ABAC ACAB ABAB" $"AAA7 A4A1 9E9C 9B9A 9793 8E89 8685 8483" $"817E 7A76 7371 7170 6D68 625C 5959 5B5E" $"6162 6160 6163 6669 6B6C 6C6D 6D6E 6F70" $"706F 6E6D 6D6C 6B69 6663 605E 5B59 5755" $"5555 5556 5656 5553 5150 4E4C 4A47 4442" $"403F 3D3C 3A39 393A 3C3E 4142 4241 3F3D" $"3C3C 3D3F 4142 4242 4243 4548 4C50 5252" $"5252 5355 595B 5D5D 5C5A 5755 5453 5454" $"5454 524F 4B47 433F 3B38 3838 393A 3A39" $"3735 3332 3232 3436 393D 4044 4648 494A" $"4C4E 5053 5557 595A 5A5A 5957 5657 5A5D" $"6062 615F 5C5A 5958 5757 5756 5553 5150" $"4F50 5255 585B 5E5F 6060 6060 605F 5E5C" $"5B5B 5B5B 5A58 5553 514F 4C49 4541 3D3A" $"3938 3838 3735 322F 2C2A 2929 2A2C 2F32" $"3436 393C 3F43 4649 4B4C 4C4C 4D4E 4F51" $"5253 5556 595C 6064 686C 7074 7676 7472" $"706F 7072 7374 7372 7170 6F6E 6D6C 6A68" $"6663 6160 5F5E 5D5C 5C5C 5E5F 6163 6464" $"6565 6566 6667 686B 6E72 767A 7E82 8689" $"8C8E 9091 9396 999B 9D9C 9995 908C 8988" $"8786 8583 817E 7B78 7572 7171 7171 6F6B" $"6764 6261 6060 605F 5F5F 5E5C 5B5A 5A5B" $"5C5D 5E5E 5E5E 5D5C 5A58 5552 5150 5151" $"5253 5454 5556 5759 5B5D 5F60 5F5D 5A58" $"5757 595B 5D5E 5F5F 5F60 6060 5F5E 5D5C" $"5C5C 5E60 6264 6564 6362 6263 6466 696B" $"6D6E 6E6E 6D6D 6F71 7476 7879 7977 7574" $"7476 797C 7E7E 7E7E 7D7E 7F80 8284 8687" $"8889 8988 8684 8281 8080 8183 8485 8582" $"807D 7A7A 7B7D 7F80 7F7C 7A78 7777 7778" $"797A 7B7C 7D7D 7D7D 7E7F 8081 807F 7C79" $"7776 7576 7676 7675 7371 6F6C 6967 6667" $"6869 6A6C 6E72 777B 8083 8689 8988 8684" $"827F 7C79 7674 7372 7373 7475 7577 797C" $"8085 888A 8B8B 8987 8482 8283 8688 8B8E" $"9091 9293 9495 9797 9898 9A9C 9EA1 A2A2" $"A2A1 A09F 9E9C 9A98 9694 9291 9191 9396" $"9A9D 9FA0 A1A3 A3A3 A29F 9D9B 9B9C 9FA2" $"A5A5 A4A1 9F9D 9B9B 9C9C 9D9D 9E9E A0A2" $"A4A6 A7A7 A6A6 A6A7 A8A9 AAAB ACAC ADAF" $"B1B1 B0AF ADAC ACAC ADAC ABA8 A6A3 A19F" $"9E9E 9F9F 9F9E 9D9C 9D9E A1A2 A2A1 9E9B" $"9998 9899 9A9A 9997 9491 8E8C 8D8E 9192" $"9393 9394 9699 9EA2 A6A8 A9A9 A9AA ABAD" $"AEAF B0B1 B2B4 B6B8 B8B6 B3B0 ADAB A8A6" $"A3A0 9D9C 9C9D 9E9F 9F9E 9D9B 9A99 9999" $"9999 9A9B 9C9C 9B9C 9D9E A0A1 A19F 9E9C" $"9B9B 9B9C 9C9D 9D9E 9E9E 9E9D 9C9C 9B9B" $"9C9C 9D9E A0A1 A2A3 A3A2 A09E 9D9D 9D9E" $"9E9C 9996 9391 9193 979A 9C9D 9EA0 A3A6" $"AAAD AFAF AFAE ADAD AFB0 B1B2 B3B4 B3B2" $"B0AD ABAB ABAB AAA7 A29D 9895 9495 9697" $"989A 9C9D 9FA1 A2A3 A4A4 A4A4 A2A1 9E9C" $"9A98 9694 918E 8C8A 8989 8A8B 8C8D 8F91" $"9396 999B 9D9E 9FA0 A0A0 A0A0 9F9E 9C9B" $"9A9A 9A99 9897 9899 9B9D 9FA1 A2A2 A09D" $"9A96 9290 8F8F 9091 9294 9596 9798 9897" $"9696 9697 989A 9C9E A0A2 A3A4 A5A5 A5A4" $"A29F 9C99 9796 9696 9695 9492 908E 8C8A" $"8885 8382 8180 807F 7F7E 7E80 8284 8585" $"8380 7D7B 7B7C 7E81 8589 8D8F 9090 8F8F" $"8F8E 8D8B 8987 8686 8787 8888 8787 8687" $"8788 898A 8A8A 8B8B 8C8D 8E8E 8D8B 8782" $"7E7A 7776 7677 7879 7A7A 7A7A 7A7A 7B7D" $"7F80 8182 8383 8587 888A 8A8A 8A89 8989" $"8988 8684 827F 7D7B 7B7B 7B7C 7C7D 7D7E" $"8082 8587 898B 8B8B 8A8A 8A8A 8C8D 9093" $"9698 9B9D 9D9D 9C9C 9B9C 9D9D 9E9E 9FA0" $"A2A4 A5A5 A5A3 A09D 9894 918E 8C8A 8988" $"8785 8482 8180 7E7C 7A77 7574 7474 7575" $"7575 7676 7675 7677 797C 7E80 8080 8080" $"8181 8384 8587 8A8C 8F92 9494 9492 9190" $"9090 8F8E 8C8A 8988 8888 8888 8786 8481" $"7E7B 7877 7677 797A 7B7B 7A79 7775 726F" $"6D6B 6A69 6867 6665 6464 6465 6567 696C" $"6E70 706F 6D6B 6A69 6A6B 6C6C 6C6C 6B6B" $"6C6E 7073 7678 797A 7B7B 7C7D 7D7C 7A79" $"7979 7A7B 7A78 7673 7270 7070 7172 7374" $"7473 7170 6F6E 6E6D 6A68 6460 5D5A 5654" $"5251 5050 5050 4E4D 4C4E 5155 5B60 6467" $"6867 6666 6565 6667 696B 6D6E 6F70 7070" $"7070 7071 7376 787A 7978 7573 7171 7377" $"7C81 8586 8684 8280 8080 807F 7D7B 7875" $"7372 706E 6B68 6666 6666 6769 6A6B 6C6C" $"6C6B 6968 6665 6362 6261 6161 6161 6162" $"6262 6362 615F 5E5D 5C5D 5E60 6060 5F5D" $"5A57 5452 5150 4F4E 4D4B 4845 4342 4141" $"4142 4446 494B 4C4D 4E4F 4F50 5151 5152" $"5355 5556 5555 5453 5354 5455 5657 5859" $"5A5A 5B5B 5D60 6468 6B6E 6F6F 6F6D 6B69" $"6765 625F 5B58 5655 5453 514F 4E4D 4D4D" $"4C4B 4948 4849 4A4C 4E4E 4E4D 4D4D 4C4A" $"4948 494D 5155 595B 5C5D 5F62 6568 6B6D" $"6E6E 6D6B 6967 6666 6769 6A6A 6967 6461" $"6060 6264 6668 6A6B 6B6A 6967 6562 5F5C" $"5956 5350 4D4A 4847 4646 4646 4646 4646" $"4647 4748 494C 4F53 575A 5B5B 5B5B 5D5E" $"6062 6363 6464 6464 6566 6768 6868 6766" $"6462 5F5C 5956 5554 5454 5555 5657 595B" $"5F63 686C 7074 7676 7675 7372 706F 6E6D" $"6D6C 6A68 6562 5F5E 5F61 6466 6768 6869" $"6A6B 6C6E 6F71 7475 7676 7573 7170 6F6F" $"7071 7273 7374 7576 7778 797A 7B7D 7D7E" $"7D7C 7B7B 7C7D 7E7E 7D7A 7673 6F6D 6B6A" $"6968 6765 6260 5F5F 5F5F 5E5D 5B59 5858" $"585A 5E62 6669 6D70 7376 797B 7C7C 7C7D" $"7F81 8487 8A8D 8F91 9192 9293 9393 9291" $"9090 908F 8D8B 8885 8280 7F7E 7D7C 7B7C" $"7D7F 8182 8485 8789 8C8E 9091 908E 8C89" $"8683 817F 7E7E 7E7E 7F7F 8080 8181 8284" $"868A 8E92 9596 9695 9391 8F8E 8D8C 8B89" $"8682 7F7D 7D7C 7C7D 7D7D 7F81 8487 8888" $"8786 8687 8A8D 8F8F 8E8C 8A89 898B 8E90" $"9190 8E8B 8987 8687 898A 8B8A 8886 8482" $"8283 8587 8889 8A8B 8C8E 9091 9293 9393" $"9290 8F8E 8E8F 9192 9494 9494 9597 9A9E" $"A2A4 A6A7 A8AB AEB2 B5B7 B9B9 B8B8 B7B6" $"B6B6 B8BA BDC0 C1C1 C1C0 C0C1 C2C3 C3C2" $"C0BE BEBF C2C5 C6C6 C4C1 C0BF C1C4 C7C8" $"C9C9 C8C7 C7C8 C9C9 C9C8 C8C8 C8C9 CACA" $"CBCB CAC9 C7C5 C3C1 C0C0 C0C0 C0C0 BFBF" $"BFBF BFBF BDBB B8B5 B2B1 B1B2 B3B3 B2B0" $"AEAD ACAD AEB0 B2B3 B4B5 B4B4 B3B2 B1B1" $"B1B2 B3B5 B6B8 BABD C1C4 C6C6 C5C4 C1BF" $"BEBD BEBE BFBF BEBC BBBA BABB BCBC BBB8" $"B3AE AAA7 A5A3 A2A1 A09E 9E9E 9E9E 9FA0" $"A1A2 A2A2 A2A2 A3A4 A5A7 AAAC ADAD ACAB" $"A9A7 A5A3 A2A1 A1A1 A0A0 9F9E 9E9D 9E9F" $"A0A2 A3A3 A29F 9B98 9593 9393 9291 908F" $"8E8D 8D8E 8E90 9296 999C 9E9E 9E9D 9C9B" $"9A98 9796 9593 9291 9090 8F8F 8E8E 8E8E" $"8F91 9496 989A 9B9B 9B9C 9D9F A1A2 A2A2" $"A1A0 9F9C 9996 9390 8F8E 8F90 9191 9190" $"8F90 9296 9A9E A2A5 A7A7 A8A8 A9AB ACAC" $"AAA8 A5A3 A1A1 A1A1 A1A1 A09F 9D9C 9A99" $"9998 9896 938F 8C8A 8A8B 8C8D 8E8D 8C8C" $"8C8D 8F92 9597 9A9B 9B9A 9998 999A 9B9D" $"9F9F 9E9D 9B99 9796 9595 9597 999B 9D9E" $"9D9C 9A99 9897 9695 9493 9292 9292 9191" $"908F 8E8C 8A88 8582 7E7B 7876 7675 7473" $"7170 6E6C 6A69 6969 696B 6C6D 6E6F 7070" $"7172 7273 7372 7272 7476 797C 7F82 8587" $"8889 8988 8786 8585 8586 8686 8584 8483" $"8282 8180 8080 8182 8485 8585 8485 8688" $"8A8C 8C8B 8886 8585 8688 898A 8A89 8888" $"898B 8D8F 9193 9597 9A9C 9E9F 9E9C 9997" $"9492 8F8E 8C8A 8886 8585 8687 8787 8684" $"8280 7F80 8182 8384 8484 8483 8281 8080" $"8082 8384 8482 807C 7975 7270 6D6A 6764" $"615F 5D5C 5B5A 5958 5859 5B5E 6265 6767" $"6767 6666 6565 6566 6565 6463 6262 6261" $"6160 5F5D 5D5C 5C5C 5B5A 5856 5555 5556" $"5757 5656 5554 5250 4F4E 4D4E 4F50 5152" $"5252 5251 5252 5355 5758 595A 5A59 5959" $"5959 5A59 5857 5656 585A 5B5C 5C5C 5A59" $"5857 5655 5352 5150 504F 4F4E 4E4E 4D4D" $"4B4A 4947 4646 4443 4140 3F3E 3D3D 3D3C" $"3C3B 3938 3737 383B 3E41 4343 4343 4242" $"4242 4242 403E 3C3A 3939 393A 3C3E 3F40" $"4041 4142 4343 4342 4140 3F3F 3F3F 4041" $"4244 4546 4748 4847 4746 4647 4849 4A4C" $"4E50 5151 514F 4E4D 4C4B 4C4D 5053 5658" $"5A5B 5C5D 5D5C 5D5D 5E5E 5E5D 5B5A 5857" $"5656 5758 5A5B 5D5F 6062 6465 6768 696A" $"6B6C 6C6B 6B6A 6968 6868 6766 6463 6364" $"6566 6868 6867 6562 605E 5C5A 5856 5554" $"5252 5253 5558 5B5E 6163 6465 6464 6464" $"6464 6362 6160 605F 5E5E 5E5D 5D5D 5D5D" $"5E5E 6062 6568 6A6B 6B6B 6A6A 6A6A 6B6B" $"6B6B 6A6A 6969 6868 6869 696A 6A6A 6967" $"6666 6768 696B 6C6C 6C6C 6C6C 6D6D 6E6E" $"6E6E 6F70 7172 7375 7678 7A7D 7F81 8486" $"898C 8E90 9190 8E8B 8988 8685 8484 8383" $"8382 8281 7F7D 7A78 7676 7676 7778 7877" $"7676 7677 797C 7E80 8181 807F 7E7E 7E7E" $"7E7F 8082 8485 8789 8A8B 8C8D 8E8E 8E8C" $"8A87 837F 7D7B 7A79 7875 7371 706F 7070" $"7171 7171 7171 7171 706F 6E6C 6B69 6765" $"6463 6260 5F5D 5C5C 5D5E 5F61 6264 6566" $"6767 6869 6B6D 6F70 7273 7475 7676 7676" $"7677 797B 7D7E 7E7D 7C7B 7A79 7877 7675" $"7575 7676 7675 7575 7677 7879 797A 7B7C" $"7D7F 7F80 7F7F 7E7D 7D7D 7C7C 7C7C 7B7A" $"7978 787A 7D82 868A 8C8C 8B89 8888 8888" $"8886 8582 8180 7F80 8081 8385 8789 8A8A" $"8A8A 8A8B 8E91 9395 9595 9392 9293 9393" $"9290 8E8C 8B8B 8C8C 8D8C 8B8B 8A8A 8A8B" $"8B8C 8C8D 8E90 9398 9DA1 A4A6 A6A5 A5A4" $"A5A6 A8AA ACAD ADAD ADAD ADAD ADAC ACAC" $"ACAD AEAF AFB0 B0B1 B2B3 B4B4 B3B2 B2B2" $"B2B4 B5B6 B6B6 B4B3 B2B2 B2B3 B4B5 B6B7" $"B8BA BBBB BBBB BBBB BCBC BDBF C1C3 C4C4" $"C5C5 C4C3 C2C0 BEBB B9B8 B7B8 B9BA BCBE" $"BFC0 C0BF BDBB B9B8 B7B8 B8B8 B6B4 B1AE" $"ABA9 A7A6 A4A1 9E9A 9794 9290 9090 9091" $"9192 9495 9799 9A9B 9C9C 9C9C 9C9C 9C9C" $"9B9A 9999 999A 9B9C 9C9A 9998 9796 9696" $"9697 9798 9898 9898 9897 9797 9695 9493" $"9291 908E 8E8E 8F90 9293 9493 9291 908F" $"8E8E 8F90 9294 9799 9C9F A1A1 A1A0 9F9F" $"A1A4 A8AC AFB2 B4B6 B7B7 B7B6 B5B3 B0AC" $"A7A2 9D99 9592 908E 8D8C 8B8B 8C8E 8F92" $"9497 9A9E A1A5 A8AA ACAD ADAD ACAC ABA9" $"A8A7 A6A5 A3A2 A1A1 A1A3 A4A6 A7A8 A8A9" $"AAAC ADAF B0B1 B1B1 B0AE AEAE AFB0 B1B2" $"B0AE AAA8 A6A6 A6A8 A9AA A9A7 A4A1 9E9C" $"9C9C 9D9D 9E9F A0A2 A5A8 ACAF B2B4 B6B8" $"B9BB BDBF C0C0 BFBD BBB9 B8B6 B5B3 B1AF" $"ADAD AEAF B0B1 B1B2 B2B1 AFAE ADAB AAA9" $"A8A7 A5A3 A19E 9B97 9491 8E8D 8D8C 8B89" $"8886 8585 8687 898B 8C8C 8C8C 8D8E 8F90" $"9293 9494 9494 9495 9697 9899 9999 999A" $"9A9B 9C9C 9C9B 9A99 9897 9696 9696 9594" $"9290 8E8D 8C8A 8886 8481 7F7E 7D7C 7B7A" $"7978 7877 7777 7777 7878 7878 7777 7879" $"7B7D 7E7F 8081 8180 7F7D 7B7A 7A7A 7B7B" $"7C7B 7B7A 7A7A 7B7B 7B7A 7979 7879 7A7C" $"7E81 8384 8584 8484 8485 8789 8A8C 8C8D" $"8D8C 8B8A 8A8A 8A8B 8C8D 8E8E 8E8D 8B89" $"8887 8788 898A 8B8A 8886 8382 8284 8689" $"8C8D 8E8E 8D8D 8D8D 8D8C 8C8D 8D8E 8D8B" $"8987 8583 8280 7E7C 7976 716D 6A67 6564" $"6465 6566 6768 696B 6C6D 6E6E 6F6F 6F70" $"7173 7475 7575 7575 7473 716E 6A67 6463" $"6363 6464 6463 6261 6160 6161 6161 6162" $"6262 6262 6262 6262 6263 6364 6464 6463" $"6363 6465 6665 6461 5F5E 5E5F 6062 6363" $"6262 6162 6365 686A 6C6D 6D6B 6A69 6867" $"6767 6666 6565 6666 6767 6868 6767 6767" $"6664 6362 6161 605F 5D5B 5855 524F 4C4A" $"4847 4645 4546 4748 494A 4D50 5458 5A5C" $"5C5C 5D5E 6060 6161 6162 6365 6667 6766" $"6564 6362 605F 5D5B 5A58 5756 5655 5555" $"5555 5351 4E4C 4947 4544 4240 3F3D 3D3C" $"3D3E 3E3E 3D3D 3D3E 4041 4243 4546 4747" $"4747 4543 413E 3C39 3735 3433 3232 3436" $"383B 3E40 4344 4647 494B 4C4D 4D4D 4C4C" $"4C4D 4E50 5152 5150 4E4C 4B4B 4C4C 4D4C" $"4B49 4847 4645 4543 413F 3D3C 3C3D 3E3E" $"3F40 4041 4142 4242 4242 4243 4344 4546" $"4646 4545 4545 4546 4647 494C 4F52 565A" $"5E61 6568 6A6D 6E70 7071 7171 716F 6E6C" $"6A68 6563 615F 5E5D 5C5C 5C5E 6062 6364" $"6566 6767 6869 696A 6B6C 6E6F 7070 7171" $"7172 7373 7371 6F6C 6A69 6969 6B6C 6E70" $"7172 7273 7474 7576 7675 7472 7171 7172" $"7476 7879 7979 7775 7371 6F6C 6967 6564" $"6463 6160 5E5D 5D5D 5E60 6263 6566 6667" $"696A 6C6E 7173 7577 7777 7676 7576 7779" $"7B7D 7F7F 807F 7F7E 7E7F 7F7F 7F7E 7E7E" $"7E7E 7F7F 7F7F 7E7C 7A78 7674 7372 7172" $"7273 7475 7473 706C 6864 615F 5F5F 6062" $"6364 6463 6363 6466 686B 6D6F 7173 767A" $"7E82 868A 8C8D 8D8D 8C8B 8A89 8887 8684" $"8382 8180 7F7E 7D7D 7C7C 7B7B 7A7A 7979" $"797A 7A79 7978 7879 7979 7877 7675 7676" $"7676 7778 797B 7D7F 8183 8383 817F 7D7C" $"7B7B 7B7B 7A79 7877 7674 7272 7272 7374" $"7677 7A7D 8184 8688 8A8A 8B8B 8B8A 8989" $"8889 8A8C 8E8F 9091 9191 9090 8F8E 8D8D" $"8D8D 8E8E 8E8F 8F90 9193 9496 9798 9999" $"9999 9999 9999 999A 9B9B 9A98 9796 9697" $"9798 9898 9899 9B9D 9E9F A0A2 A4A7 AAAC" $"AEAF AFB0 B2B4 B6B8 B9BA B9B8 B6B4 B3B2" $"B1B1 B1B0 AFAD ACAB AAAB ACAE B0B0 B0AF" $"AEAC ABAB ABAB ACAC ACAC ACAC ACAE AFB1" $"B2B2 B2B1 B0AF AEAE AEAD ACAA A8A7 A7A7" $"A8A9 AAAA A9A8 A8A8 A9AB AEB0 B2B4 B5B7" $"B9BB BEC1 C4C7 CACC CDCE CFCF CFD0 D0D1" $"D1D1 D1D0 D0CF CECE CDCD CDCC CAC7 C5C3" $"C1C2 C3C4 C6C6 C5C3 C0BD BAB8 B6B5 B5B5" $"B4B4 B4B3 B3B3 B4B4 B3B2 B1AF ADAA A9A9" $"A9A9 A9A8 A6A4 A3A1 A0A0 9F9F A0A2 A4A6" $"A8AA ACAF B1B3 B5B6 B8B9 B9B9 B9B8 B6B3" $"B0AD AAA7 A4A1 9E9B 9997 9492 908F 8E8F" $"9092 9495 9697 9694 928E 8A87 8482 807E" $"7D7D 7D7E 8083 8586 8787 8787 8889 8A8C" $"8D8E 8E8E 8E8E 8D8D 8D8D 8D8C 8B8A 8A8B" $"8B8C 8D8E 8E8E 8E8F 9090 9192 9393 9494" $"9392 9190 8E8D 8C8B 8A89 8888 8889 8A8C" $"8D8E 8E8D 8D8C 8C8C 8C8C 8D8D 8E8E 8E8E" $"8D8C 8B89 8887 8685 8380 7D7A 7876 7676" $"7779 7B7D 7F80 8181 8284 8689 8D90 9295" $"979A 9C9E A0A1 A1A1 A2A2 A3A4 A5A5 A5A4" $"A3A3 A3A4 A4A5 A5A5 A4A4 A3A3 A3A3 A2A2" $"A3A4 A5A6 A7A7 A7A8 A8A8 A8A8 A8A8 A9AA" $"ABAD AEAF AFB0 B1B1 B2B2 B1B0 B0AF AEAD" $"ABA9 A6A4 A3A2 A2A3 A4A4 A5A5 A5A6 A6A6" $"A6A6 A5A4 A2A1 9F9C 9A96 938F 8B87 8482" $"8180 8081 8182 8384 8586 8788 898A 8B8C" $"8D8D 8E8D 8D8C 8C8B 8A8A 8A89 8887 8584" $"8280 7F7E 7C7A 7875 7372 7272 7170 6E6A" $"6663 6262 6364 6564 6362 6162 6365 6768" $"696A 6969 6766 6462 605E 5C5A 5957 5655" $"5554 5454 5454 5454 5556 5759 5A5B 5C5C" $"5D5E 6061 6365 6565 6564 6464 6668 6A6C" $"6E6E 6E6E 6D6E 6E6F 6F70 7172 7374 7473" $"7271 7070 7071 7272 7373 7374 7475 7575" $"7576 7779 7B7E 8184 8688 8A8C 8E90 9192" $"9392 918F 8E8C 8A88 8786 8584 8381 807F" $"7E7E 7D7C 7B78 7471 6D6B 6A69 6969 6A6A" $"6A6A 6A6A 6B6B 6C6D 6D6C 6A68 6563 6261" $"6162 6465 6566 6565 6464 6465 676A 6D6F" $"7173 7577 797B 7D7E 7E7E 7D7C 7977 736F" $"6B67 6361 5E5C 5B5A 5857 5553 5251 5050" $"5151 5152 5354 5556 5758 5859 5959 5959" $"595A 5A5B 5C5D 5E5F 6163 6567 6869 6866" $"6461 5E5C 5B5A 5958 5756 5454 5352 5150" $"4F4E 4C4B 4A49 4848 4949 494A 4B4C 4D4E" $"4F50 5050 5050 5051 5254 5556 5758 5859" $"595A 5B5C 5D5E 5F5F 6061 6263 6465 6464" $"6363 6261 6160 5F5F 5F60 6060 605E 5C5B" $"5A5A 5B5B 5B5B 5B5A 5958 5757 5758 5959" $"5A59 5856 5451 4D4A 4745 4341 403F 3F3F" $"4041 4141 4141 4243 4446 4748 4A4C 4F52" $"565A 5D60 6163 6566 6869 6A6B 6D6F 7273" $"7373 7373 7373 7271 706E 6D6C 6B6B 6B6A" $"6968 6663 615E 5D5C 5C5C 5B5B 5A58 5757" $"5758 595A 5B5B 5C5D 5D5E 5E5D 5C5A 5958" $"5858 5859 5A5B 5B5B 5A59 5959 5B5D 6063" $"676A 6E71 7375 7677 7878 7878 7776 7473" $"7170 6F6E 6D6C 6C6C 6B6A 6A69 6868 696A" $"6B6C 6D6D 6E6E 6F70 7172 7171 706F 6F6F" $"6E6D 6B69 6866 6565 6565 6464 6363 6364" $"6566 696B 6E70 7274 7677 797B 7C7D 7D7D" $"7D7D 7D7D 7D7E 7E7F 7F80 8080 7F7F 8080" $"8182 8383 8484 8485 8687 888A 8C8D 8D8D" $"8C8B 8A89 8887 8685 8483 8180 7E7D 7C7B" $"7A79 7878 7879 7B7C 7D7E 7E7E 7D7D 7C7C" $"7A79 7674 7372 7273 7476 7779 7A7B 7C7D" $"7D7E 7F80 8182 8283 8383 8384 8484 8381" $"807E 7C7B 7978 7777 7778 797B 7C7F 8184" $"8688 8A8B 8C8C 8C8B 8A8A 898A 8A8C 8D90" $"9295 989B 9DA1 A4A7 ABAE B1B3 B5B7 B8B8" $"B7B5 B3B0 ADAA A5A0 9B96 928F 8E8D 8E90" $"9294 9699 9B9C 9D9E 9D9D 9E9F A0A2 A3A4" $"A3A3 A2A1 A0A0 A1A1 A1A0 A09F 9F9F 9F9F" $"9F9F 9E9B 9894 908C 8784 817F 7F7F 8080" $"7F7E 7D7B 7B7B 7C7E 8083 8587 8889 8887" $"8685 8483 8384 8586 8788 8888 8787 8685" $"8585 8687 8888 898A 8C8E 9091 9291 9190" $"908F 8F8F 9091 9191 908E 8C89 8786 8686" $"8788 8A8B 8C8D 8E8E 8F91 9395 9799 9B9D" $"9EA0 A1A3 A5A7 A9AB AEB0 B4B7 B9BB BCBE" $"BFC1 C3C5 C7C8 C8C7 C5C2 BFBC BABA BABB" $"BCBC BCBB BAB9 B9BA BBBD BEBE BEBD BCBB" $"BBBA B9B8 B7B5 B4B2 B0AD ABA9 A8A7 A6A5" $"A3A2 A1A1 A2A4 A6A7 A8A9 A8A8 A8A8 A8A8" $"A7A5 A3A1 9F9E 9D9D 9C9C 9C9D 9D9E 9FA0" $"A1A2 A3A4 A4A5 A5A5 A6A8 A8A9 A9A8 A8A6" $"A5A3 A2A0 9F9D 9B9A 9898 9797 9696 9595" $"9595 9697 9898 9998 9899 999B 9C9E A0A1" $"A2A3 A4A6 A7A8 AAAB ADAE AFB0 B1B1 B0AF" $"ADAC ACAB ABAB ACAC ACAB ABA9 A9A8 A7A7" $"A6A5 A4A2 A1A0 A0A1 A2A3 A4A5 A4A3 A09E" $"9C9B 9B9C 9E9F A09F 9F9F 9FA1 A3A5 A7A7" $"A7A7 A5A4 A4A5 A6A7 A8A8 A7A5 A4A1 9F9D" $"9B98 9694 918E 8B88 8684 8382 817F 7C79" $"7673 7170 7071 7272 7373 7271 6F6D 6B68" $"6664 6363 6364 6668 6A6D 6E6F 6E6E 6D6C" $"6C6B 6B69 6867 6769 6A6D 6F70 7171 7272" $"7375 7778 7A7C 7F80 8283 8486 8889 8B8D" $"8E8F 8E8E 8C8B 8A8A 8A8A 8A89 8988 8786" $"8584 8281 7F7F 7F7E 7E7D 7C7A 7978 7777" $"7879 7B7D 7F81 8385 8687 888A 8B8C 8D8D" $"8D8D 8D8D 8D8E 8F8F 9091 9192 9294 9597" $"9899 9897 9593 908E 8C8B 8B8A 8A8A 8A8B" $"8B8B 8B8C 8C8C 8C8B 8A87 8582 7F7D 7C7B" $"7C7C 7D7D 7E7F 8082 8588 8B8D 8F91 9394" $"9596 9797 9897 9795 9492 908E 8D8C 8C8C" $"8C8D 8D8E 8F91 9396 989A 9B9C 9D9D 9D9C" $"9B99 9897 9796 9797 9798 9899 999B 9C9D" $"9FA0 A0A1 A2A2 A3A3 A3A3 A3A1 9F9C 9996" $"9390 8E8C 8B8A 8988 8785 8382 8180 8080" $"7F7F 7E7D 7D7D 7E7E 7E7E 7E7D 7C7A 7877" $"7675 7574 7372 706D 6A66 6360 5F5E 5F60" $"6161 6262 6261 6160 605E 5D5C 5B5A 5958" $"5756 5452 504D 4B49 4746 4546 4647 4848" $"4949 4949 4949 4848 4747 4747 4747 4747" $"4645 4544 4443 4343 4241 4040 3F3F 3E3D" $"3C3B 3937 3635 3637 393A 3C3D 3E3F 4042" $"4344 4547 484A 4C4D 4E4F 4F50 5151 5151" $"504F 4D4D 4D4D 4E4E 4E4E 4D4D 4E4F 5153" $"5557 5859 5958 5858 5858 595A 5B5C 5D5E" $"6061 6262 6364 6667 696A 6C6C 6D6D 6E6E" $"6F70 7273 7474 7473 7170 6F6F 6F6E 6D6C" $"6B6B 6A6A 6969 6766 6462 605D 5B59 5755" $"5351 4E4C 4947 4543 4242 4344 4647 494A" $"4C4D 4F50 5253 5455 5656 5758 595B 5C5C" $"5C5B 5A59 5756 5554 5353 5251 514F 4E4C" $"4B4A 4A49 4A4A 4B4B 4C4C 4C4C 4C4D 4E50" $"5152 5354 5455 5555 5657 5859 5A5A 5A59" $"5959 595A 5B5E 6062 6465 6768 696B 6C6D" $"6D6E 6E6E 6D6D 6C6C 6C6C 6C6D 6E6E 6F6F" $"6E6E 6E6E 6E6F 6F70 7070 7070 706F 6E6D" $"6D6D 6D6E 6F70 7172 7273 7373 7475 7678" $"7A7B 7C7D 7D7D 7D7C 7B7A 7876 7574 7474" $"7474 7371 6F6C 6967 6564 6364 6566 6768" $"6969 6969 6969 6969 6A6B 6D6F 7275 7779" $"7A7A 7A7A 7A7A 7979 7877 7675 7473 7170" $"6E6C 6B6A 6969 6969 6A6A 6B6C 6C6C 6C6C" $"6B6A 6968 6869 696A 6B6B 6C6C 6B6B 6C6D" $"6F72 7578 7B7D 8082 8485 8687 8787 8787" $"8686 8585 8484 8485 8585 8585 8585 8484" $"8483 8383 8485 8688 8989 8A8B 8C8D 8F91" $"9394 9596 9797 9898 9897 9696 9697 9A9D" $"A1A4 A6A6 A6A6 A5A5 A5A6 A7A9 AAAB AAA9" $"A7A5 A3A2 A1A0 9F9E 9D9C 9B9A 9998 9695" $"9391 8F8D 8B89 8785 8381 807F 7F80 8183" $"8485 8687 8787 8889 8B8E 9093 9597 999C" $"9EA1 A3A4 A5A5 A5A4 A4A4 A4A5 A6A8 A9AB" $"ACAC ACAB AAAA A9A9 A9A9 A8A7 A6A4 A3A2" $"A0A0 A0A0 A0A0 A09F 9F9E 9D9C 9B9A 9897" $"9594 9392 9191 9191 9191 9294 9596 9696" $"9696 9799 9B9F A2A5 A8A9 AAAA AAA9 A9A9" $"A8A8 A8A7 A7A6 A6A6 A6A6 A6A6 A6A5 A5A4" $"A4A4 A3A3 A2A2 A1A0 9E9D 9B9A 9897 9796" $"9697 9899 9A9B 9B9C 9D9D 9E9F 9FA0 A1A3" $"A4A5 A7A8 A8A7 A6A5 A4A2 A1A1 A09F 9F9E" $"9E9D 9D9C 9B9B 9B9C 9D9E 9D9C 9B9B 9A9A" $"9A9A 9A99 9897 9593 908F 8D8C 8C8C 8C8C" $"8D8D 8D8E 8E8F 9192 9395 9697 999B 9EA0" $"A3A4 A6A7 A8A9 AAAC ADAF AFAF AEAE AEAF" $"B0B2 B4B4 B4B4 B3B2 B1B0 B0AF AEAC A9A8" $"A7A7 A8A9 AAAA AAA9 A8A6 A5A4 A2A1 A09F" $"9D9C 9B9A 9998 9795 9390 8E8B 8886 8584" $"8383 8486 8789 8B8D 8F91 9394 9595 9595" $"9697 999A 9B9B 9B9A 9897 9696 9696 9696" $"9696 9595 9595 9595 9595 9493 9291 9192" $"9395 9698 999A 9A9A 9A9A 9A9A 9A9A 9A9A" $"9A99 9998 9898 9898 9898 9796 9594 9393" $"9292 9292 9293 9494 9597 9899 9A9A 9998" $"9797 9797 9898 9899 999A 9B9B 9C9C 9B9B" $"9B9B 9C9D 9EA0 A2A3 A3A2 A19F 9E9D 9D9D" $"9C9B 9997 9492 908F 8F8F 8F8F 8E8E 8D8D" $"8D8D 8D8D 8D8E 8E8F 8F8F 8E8D 8C8B 8987" $"8583 8180 7E7C 7A78 7674 7372 7170 6F6E" $"6E6D 6D6D 6D6C 6C6A 6967 6563 6261 6161" $"6263 6363 6362 6262 6365 6668 6A6B 6C6D" $"6E6E 6F70 7273 7473 7372 7171 7273 7678" $"7A7B 7C7D 7D7E 7F80 8081 8181 8181 8080" $"8080 8080 7F7F 7F7E 7E7D 7D7C 7C7C 7C7E" $"8082 8485 8687 8888 898A 8A8B 8A8A 8988" $"8686 8686 8686 8686 8685 8483 817F 7E7D" $"7D7D 7D7C 7B79 7776 7474 7475 7677 7878" $"7979 7979 7978 7878 7877 7674 716E 6B67" $"6360 5E5C 5B5A 5958 5756 5655 5453 5252" $"5253 5455 5658 595A 5B5C 5D5E 5F61 6263" $"6465 6768 6A6B 6C6D 6D6D 6C6C 6A69 6867" $"6666 6666 6665 6463 6363 6363 6262 6261" $"6162 6263 6465 6668 696A 6B6B 6B6B 6B6B" $"6C6E 7072 7476 7778 7879 7A7C 7D7E 7E7F" $"7F7E 7E7E 7D7D 7C7C 7B7A 7978 7777 7778" $"797A 7B7B 7C7C 7C7B 7B79 7876 7472 716F" $"6D6B 6967 6461 5F5C 5B5A 5A5B 5C5E 5F60" $"6060 6061 6161 6263 6363 6363 6362 605D" $"5A56 524F 4B49 4643 403E 3C3B 3B3A 3A39" $"3736 3535 3536 3738 3A3C 3D3E 3F41 4243" $"4446 4747 4746 4443 4343 4445 4748 494B" $"4B4C 4C4C 4C4B 4B4B 4B4C 4D4E 5051 5152" $"5355 5657 585A 5B5C 5E5F 6060 6162 6262" $"6160 5F5F 5E5F 6061 6263 6464 6567 696B" $"6D6F 7071 7273 7475 7677 7878 7877 7675" $"7371 6F6E 6C6C 6B6A 6968 6766 6564 6363" $"6262 6262 6263 6567 696B 6D6E 6F6F 7071" $"7272 7373 7373 7271 706F 6E6D 6C6C 6B6A" $"6968 6665 6565 6565 6566 6768 696A 6B6D" $"6E6F 7071 7273 7373 7373 7474 7575 7575" $"7473 7271 7171 7272 7373 7372 7272 7375" $"787A 7D7F 8081 8283 8485 8788 898A 8988" $"8685 8382 8181 8180 7F7E 7D7C 7B7A 7A7A" $"7A7A 7979 7979 7A7B 7C7C 7D7D 7D7E 7E7E" $"7E7D 7D7C 7B79 7776 7574 7474 7575 7575" $"7677 7778 7979 7A79 7979 797A 7A7B 7B7B" $"7A79 7978 7878 7879 7A7A 7A7A 7979 7878" $"7878 7879 7A7B 7B7B 7B7A 7A7A 7979 7979" $"7A7A 7B7C 7E7F 7F80 8080 8181 8284 8586" $"8686 8686 8787 8889 8A8B 8B8A 8886 8584" $"8383 8485 8687 8888 8888 8888 8888 898B" $"8B8C 8D8D 8E8F 9193 9496 9899 9A9B 9B9B" $"9B9B 9B9B 9C9C 9D9D 9D9D 9C9B 9A99 9796" $"9594 9393 9393 9393 9291 908F 8E8C 8B8A" $"8988 8888 8889 8989 8989 8A8A 8B8B 8C8C" $"8D8E 9091 9294 9596 9697 9797 9796 9696" $"9695 9595 9595 9595 9494 9494 9595 9696" $"9594 9392 9191 9191 9090 8F8E 8D8C 8C8C" $"8D8E 8E8F 9090 9091 9191 9191 9191 9090" $"8F8E 8D8B 8A89 8888 8787 8685 8585 8687" $"888A 8C8D 8E8F 8F8E 8D8D 8C8C 8D8E 8F91" $"9293 9495 9697 9898 9897 9796 9594 9494" $"9494 9494 9494 9494 9494 9494 9595 9798" $"9999 9998 9795 9392 908F 8F90 9091 9190" $"8F8E 8C8B 8A8A 8B8C 8D8F 9091 9292 9495" $"9798 9A9C 9D9D 9D9E 9FA0 A2A4 A5A6 A6A5" $"A4A4 A4A4 A4A5 A6A7 A8A8 A7A5 A3A1 A09F" $"9F9F A0A0 A1A1 A1A2 A3A4 A6A8 AAAC ADAF" $"B0B0 B1B2 B3B4 B5B6 B6B6 B5B4 B3B2 B1B0" $"B0AF AEAE ADAD ACAC ACAD ADAF B0B1 B1B2" $"B3B3 B3B3 B3B3 B3B3 B3B2 B2B2 B2B2 B3B3" $"B3B2 B2B1 AFAE ACAA A8A6 A5A4 A4A4 A4A3" $"A3A3 A3A3 A4A5 A5A5 A6A6 A6A6 A6A6 A6A6" $"A5A4 A3A1 A09F 9F9E 9E9E 9D9C 9B9A 9896" $"9594 9494 9494 9494 9494 9393 9392 9292" $"9192 9292 9393 9394 9597 989A 9B9B 9B9B" $"9A99 9998 9796 9594 9494 9595 9595 9594" $"9290 8E8D 8D8D 8E8F 9092 9394 9595 9594" $"9494 9392 9190 8F8D 8C8C 8B8B 8B8B 8B8C" $"8C8C 8B8B 8A8A 8989 8A8A 8B8C 8C8C 8D8C" $"8C8D 8D8D 8E8E 8F8F 8F8F 8E8E 8D8C 8B8A" $"8A89 8988 8887 8686 8687 8787 8887 8786" $"8585 8585 8686 8685 8483 8281 8080 8080" $"7F7F 7F7E 7E7E 7F7F 8080 8080 807F 7E7D" $"7B7B 7A7A 7B7C 7D7E 7F7F 7F7F 7D7C 7B7B" $"7B7B 7C7B 7B7A 7979 7878 7878 7776 7574" $"7474 7474 7474 7474 7474 7474 7474 7474" $"7373 7271 706F 6E6D 6C6B 6A69 6867 6666" $"6666 6667 6767 6665 6565 6565 6666 6666" $"6768 696B 6D6F 7172 7273 7374 7577 7879" $"7A7A 7978 7776 7573 7271 6F6E 6D6C 6C6B" $"6A69 6867 6767 6767 6768 6868 6969 6A6B" $"6C6C 6D6E 6E6F 6F6F 6E6C 6B6A 6969 6969" $"6968 6867 6665 6463 6362 6261 6161 6161" $"6162 6263 6364 6463 6261 5E5C 5B59 5756" $"5453 5150 5050 5052 5354 5555 5656 5758" $"595A 5C5E 6061 6262 6363 6465 6667 6767" $"6767 6666 6666 6667 6869 6969 6868 6766" $"6666 6666 6565 6464 6261 5F5E 5D5C 5D5E" $"5F61 6262 6262 6261 6161 6161 6161 6161" $"6060 605F 5F5F 5F5F 6060 6060 6161 6263" $"6566 6768 6869 6969 6969 6868 6867 6666" $"6666 6666 6665 6564 6261 605F 5E5F 5F60" $"6162 6363 6362 6263 6364 6667 6869 6A6A" $"6969 6866 6564 6362 6262 6161 6160 6161" $"6262 6363 6464 6465 6667 6869 6A6A 6A6A" $"6A6A 6A6A 6A6A 6A69 6867 6665 6463 6261" $"6060 5F5F 5F5F 5F60 6162 6363 6364 6463" $"6364 6466 6768 6969 6867 6766 6667 6868" $"696A 6A6B 6B6B 6B6C 6C6D 6D6D 6C6C 6D6D" $"6E6E 6E6D 6C6A 6968 6767 6767 6767 6666" $"6666 6666 6565 6464 6364 6464 6565 6565" $"6666 6665 6564 6362 6262 6262 6263 6363" $"6464 6464 6464 6363 6363 6464 6565 6566" $"6565 6667 686A 6C6F 7173 7475 7676 7676" $"7777 7777 7878 7878 7776 7574 7271 7070" $"7070 7070 6F6E 6D6C 6B6B 6A6A 6A6A 6968" $"6665 6566 686A 6C6F 7274 7779 7B7E 8082" $"8384 8383 8281 8080 8181 8181 807F 7E7D" $"7D7C 7C7D 7C7C 7C7B 7A7A 7979 7979 7978" $"7878 7878 7878 7879 7979 7A7A 7B7B 7B7A" $"7A7A 7A7A 7B7C 7D7F 8081 8283 8485 8687" $"888A 8D8F 9193 9494 9494 9595 9595 9595" $"9595 9696 9697 9796 9697 9899 9A9B 9C9C" $"9C9C 9C9D 9FA0 A1A1 A1A0 9F9F 9E9E 9D9D" $"9C9B 9A98 9694 9291 908F 8F8F 8F8F 8F8F" $"8F90 9091 9193 9495 9799 9B9D 9FA1 A2A3" $"A3A3 A3A2 A1A0 9F9D 9B9A 9897 9796 9595" $"9492 9190 8E8D 8D8D 8D8E 8F8F 9090 908F" $"8F8F 9090 9090 9091 9191 9192 9293 9394" $"9495 9696 9696 9595 9596 9697 9899 9A9A" $"9A9A 9B9C 9C9D 9E9E 9FA0 A1A1 A2A2 A2A2" $"A2A2 A2A2 A1A1 A1A0 9F9F 9E9D 9C9A 9998" $"9796 9595 9595 9596 9697 9696 9595 9493" $"9394 9494 9594 9493 9393 9394 9495 9595" $"9595 9595 9696 9798 9899 999A 9B9C 9D9E" $"9FA0 A1A0 A09F 9E9D 9C9B 9A9A 9A99 9998" $"9797 9696 9696 9697 9798 999A 9B9C 9D9D" $"9D9D 9C9A 9997 9694 9393 9291 908F 8F8E" $"8E8E 8E8F 8F8F 8F90 9090 908F 8F90 9090" $"9192 9393 9494 9393 9292 9393 9494 9595" $"9595 9594 9494 9392 9191 9090 9090 9193" $"9495 9697 9797 9798 9899 9A9B 9B9B 9C9C" $"9D9D 9E9E 9E9E 9FA0 A0A1 A2A3 A3A3 A3A3" $"A3A3 A4A4 A4A3 A3A2 A2A1 9F9D 9B99 9695" $"9392 9190 8E8C 8B8A 8989 8A8A 8B8D 8E8F" $"9091 9394 9596 9798 9898 9897 9797 9696" $"9696 9696 9695 9595 9696 9799 9B9D 9EA0" $"A1A2 A3A3 A3A3 A3A3 A3A3 A3A4 A4A5 A5A6" $"A6A6 A5A5 A5A4 A3A3 A2A2 A1A1 A1A1 A2A3" $"A3A3 A3A3 A2A1 A0A0 9F9E 9D9B 9A99 9795" $"9493 9292 9394 9698 9A9C 9D9F A1A3 A5A7" $"A9A9 A9A7 A5A3 A1A0 9E9D 9B9A 9897 9694" $"9392 9191 9192 9394 9494 9493 9291 9090" $"8F8F 8E8D 8C8B 8A88 8685 8484 8383 8383" $"8281 807F 7E7D 7C7C 7B7B 7B7A 7A79 7877" $"7675 7575 7575 7575 7575 7473 7373 7372" $"7272 7170 6F6E 6E6E 6E6F 6F6F 6F6F 6F6F" $"7071 7374 7677 7879 7979 7A7B 7B7B 7B7B" $"7B7B 7B7B 7B7A 7A79 7979 7978 7878 7878" $"797A 7B7D 7E7F 8081 8180 807F 7E7E 7E7D" $"7D7E 7E7E 7F80 8081 8182 8383 8484 8483" $"8383 8382 817F 7E7C 7A78 7675 7372 7271" $"7170 7171 7272 7373 7475 7576 7676 7777" $"7879 7979 7978 7877 7675 7575 7576 7777" $"7879 797A 7B7C 7C7C 7C7B 7B7B 7C7D 7D7D" $"7D7D 7C7B 7B7B 7B7B 7B7C 7C7C 7D7E 7E7F" $"8080 8080 8081 8282 8282 8180 8080 8080" $"8080 7F7F 7E7D 7C7C 7B7A 7978 7775 7473" $"7271 7070 6F6F 6F6F 6F6F 6F6F 6E6E 6E6F" $"6F6F 6F6F 6F6F 6E6E 6F6F 7071 7272 7272" $"7272 7273 7374 7474 7270 6E6C 6A69 6867" $"6666 6665 6563 6260 5F5D 5D5D 5D5E 5E5D" $"5C5A 5856 5554 5454 5453 5353 5252 5253" $"5353 5353 5353 5353 5352 5251 5151 5252" $"5353 5352 5252 5151 5151 5151 5151 5151" $"5151 5151 5253 5353 5352 5150 4F4F 4F4F" $"4F4F 4F4F 4F4F 5152 5457 585A 5B5C 5C5E" $"5F61 6263 6464 6363 6262 6160 605F 5D5C" $"5C5C 5C5D 5D5E 5D5C 5C5B 5B5B 5C5D 5E5F" $"6162 6466 6768 696A 6C6D 6E6F 7171 7273" $"7475 7778 7878 7877 7776 7676 7676 7676" $"7676 7676 7676 7575 7575 7473 7371 706F" $"6E6D 6C6C 6C6C 6B6A 6968 6767 6767 6767" $"6665 6564 6363 6362 6261 605F 5E5E 5D5C" $"5C5C 5C5D 5D5D 5D5D 5D5D 5D5D 5E5F 6061" $"6161 605F 5E5D 5D5D 5E5F 6061 6162 6263" $"6364 6566 6666 6666 6666 6565 6666 6767" $"6868 6767 6665 6565 6566 6767 6767 6767" $"6767 6868 6868 6867 6766 6665 6565 6565" $"6666 6767 6767 6767 6868 6869 6969 6867" $"6665 6362 605E 5D5C 5B5A 5A59 5959 5A5B" $"5C5D 5E5F 6061 6162 6364 6566 6768 6868" $"6868 6867 6768 6869 6A6B 6C6E 6F70 7172" $"7373 7373 7372 7272 7171 7171 7172 7273" $"7475 7677 797A 7C7E 8081 8385 8687 8888" $"8888 8787 8787 8788 8888 8888 8888 8889" $"8989 8989 8887 8786 8585 8484 8483 8382" $"8181 8080 8081 8181 8282 8283 8383 8282" $"8282 8383 8485 8586 8585 8585 8585 8585" $"8586 8787 8889 8A8B 8B8C 8C8C 8D8E 8F91" $"9394 9697 9899 9A9A 9A9A 9999 9998 9898" $"9897 9797 9798 999A 9C9E 9FA0 A1A1 A1A1" $"A1A0 A09F 9E9C 9B99 9796 9594 9392 9190" $"8F8E 8E8D 8D8D 8E8F 9092 9394 9596 9797" $"9797 9898 9898 9999 9998 9898 9897 9796" $"9594 9392 9292 9191 9190 9090 9091 9293" $"9597 999B 9D9F A0A2 A3A4 A5A6 A7A8 A9AA" $"ABAB ABAA AAA9 A8A8 A9A9 A9AA AAA9 A9A8" $"A8A8 A8A9 AAAA ABAB ACAC ADAE B0B2 B3B4" $"B5B6 B5B5 B4B2 B1AF AEAD ACAB AAA8 A7A5" $"A3A1 A09E 9D9C 9C9C 9C9D 9D9D 9D9D 9E9E" $"9F9F A0A0 9FA0 A0A1 A1A2 A3A3 A2A2 A1A1" $"A1A1 A2A2 A2A1 A09F 9E9D 9B9B 9A9A 9A9A" $"9B9C 9D9E 9E9F A0A0 A1A2 A3A4 A6A7 A9AA" $"AAAB AAAA A9A8 A7A6 A5A4 A3A1 9F9D 9A98" $"9695 9391 908E 8C8B 8A89 8989 898A 8C8D" $"8E90 9192 9293 9494 9596 9899 9A9B 9C9C" $"9D9D 9D9D 9C9C 9D9D 9D9D 9D9D 9D9C 9D9D" $"9D9E 9E9E 9E9D 9C9C 9B9A 9A99 9898 9796" $"9595 9494 9495 9494 9493 9393 9393 9494" $"9595 9595 9493 9291 9191 9191 9292 9393" $"9394 9596 9798 9898 9999 999A 9B9B 9B9B" $"9A99 9897 9696 9594 9493 9190 908F 8E8E" $"8D8D 8D8D 8D8D 8D8C 8C8C 8C8C 8C8C 8C8C" $"8B8A 8887 8685 8483 8281 807F 7E7D 7D7E" $"7E7E 7F7F 7F80 8082 8385 8789 8B8C 8D8E" $"8F90 9091 9191 9191 9090 8F8E 8D8C 8C8B" $"8A89 8988 8989 8A8B 8C8D 8E8F 8F90 9091" $"9192 9293 9596 9797 9796 9695 9493 9292" $"9291 9190 8F8E 8D8D 8D8E 8F90 9091 9090" $"8F8F 8F8F 8F90 9090 9090 8F8E 8E8D 8D8C" $"8C8C 8C8D 8D8D 8E8E 8E8E 8E8E 8E8D 8C8B" $"8B8A 8A8A 8989 8888 8786 8585 8484 8485" $"8687 8888 8888 8787 8686 8787 8888 8888" $"8887 8786 8585 8584 8483 8281 807F 7F7F" $"8080 807F 7F7F 7F7F 7F7F 7F7F 7E7E 7D7C" $"7B7A 7A79 7877 7675 7474 7474 7373 7272" $"7271 7171 7171 7172 7272 7272 7373 7373" $"7374 7475 7677 7878 7979 7878 7877 7676" $"7574 7372 7170 706F 6E6D 6C6C 6C6C 6C6C" $"6B6B 6B6A 6A69 6868 6665 6564 6363 6364" $"6464 6566 6666 6666 6564 6362 6161 6162" $"6262 6262 6261 6162 6263 6464 6565 6565" $"6666 6767 6868 6868 6766 6565 6565 6565" $"6564 6464 6363 6363 6363 6362 6262 6161" $"605F 5E5D 5C5C 5C5C 5D5D 5D5E 5E5E 5E5F" $"6061 6263 6363 6362 6160 5E5D 5C5B 5B5B" $"5C5D 5E5E 5F60 6163 6567 696A 6C6D 6E6E" $"6F6F 7070 7070 7071 7171 7171 7171 7070" $"6F6F 6F6E 6E6D 6D6D 6C6C 6B6B 6A6A 6969" $"6968 6867 6767 6768 6869 6969 6969 6867" $"6665 6362 6161 6060 6060 6060 6060 6060" $"5F5F 5F5F 5F5F 5F5F 5F5F 5F5F 5F5F 5F5F" $"5F5F 6060 6061 6162 6262 6262 6161 6161" $"6263 6363 6363 6362 6263 6365 6667 6869" $"6969 696A 6A6A 6A6A 6968 6665 6464 6363" $"6364 6463 6363 6363 6364 6465 6666 6768" $"6869 696A 6B6C 6E6F 7173 7476 787A 7B7C" $"7D7D 7D7D 7C7C 7C7B 7B7A 7978 7777 7675" $"7473 7271 7070 7070 7071 7171 706F 6F6E" $"6D6B 6B6A 6967 6665 6463 6262 6161 6161" $"6060 6060 6060 6060 6161 6160 6060 605F" $"5F5F 5F5F 5F5F 6060 6060 6161 6263 6363" $"6363 6363 6262 6262 6363 6363 6363 6363" $"6364 6465 6565 6565 6666 6666 6666 6665" $"6565 6565 6666 6767 6867 6767 6666 6666" $"6768 696A 6B6C 6C6D 6E6F 7070 7172 7273" $"7474 7575 7574 7474 7373 7272 7272 7273" $"7475 7678 797A 7B7D 7E80 8183 8586 8788" $"8889 8989 8888 8787 8787 8787 8787 8786" $"8686 8787 8788 8889 8A8A 8B8C 8C8C 8C8B" $"8B8B 8B8B 8B8A 8A89 8989 8989 8A8B 8B8C" $"8B8B 8B8B 8B8C 8D8D 8E8F 9090 9090 908F" $"8F8F 8E8D 8D8D 8D8D 8C8C 8B8A 8A8A 8A8A" $"8A8B 8B8A 8A8A 8989 8888 8888 8889 8A8B" $"8C8D 8E8F 8F90 9091 9191 9191 9191 9191" $"9190 8F8D 8C8C 8C8D 8E8F 9192 9395 9698" $"999A 9B9B 9C9C 9C9C 9D9D 9D9C 9C9C 9B9B" $"9A99 9999 9999 9999 9999 9898 9897 9696" $"9594 9392 9190 9090 908F 8F8F 8E8E 8D8D" $"8C8C 8B8B 8B8B 8B8A 8A8A 8989 8988 8888" $"8888 8989 8A8B 8B8C 8D8D 8E8F 8F90 9091" $"9192 9292 9292 9191 9190 9090 9090 9090" $"9090 9090 9191 9293 9596 9798 9999 9999" $"9999 9898 9897 9797 9797 9797 9797 9798" $"9899 999A 9B9B 9C9C 9D9D 9E9F A1A2 A3A4" $"A5A5 A6A6 A6A5 A5A5 A5A5 A5A5 A6A6 A6A7" $"A7A7 A8A8 A8A7 A7A6 A6A5 A4A4 A3A2 A2A1" $"A1A0 9F9E 9E9D 9D9E 9E9E 9E9D 9D9D 9C9B" $"9B9B 9B9C 9C9D 9E9E 9FA0 A0A0 A1A1 A1A2" $"A3A4 A4A5 A5A5 A4A4 A3A3 A2A0 9F9E 9D9C" $"9B9B 9B9B 9A9A 9A9A 9A9A 9A99 9897 9695" $"9494 9393 9292 9190 8E8D 8C8B 8A89 8887" $"8787 8787 8787 8686 8687 8888 8989 8A8A" $"8B8B 8B8C 8C8C 8D8D 8D8E 8E8E 8E8E 8E8E" $"8E8F 8F90 9091 9191 9090 9090 9090 9090" $"9090 9090 9090 9090 9090 9091 9191 908F" $"8F8E 8D8C 8C8C 8C8D 8D8D 8D8D 8C8B 8B8A" $"8A8A 8A8B 8B8C 8C8C 8D8D 8D8E 8E8F 8F90" $"9192 9393 9494 9595 9595 9595 9594 9493" $"9393 9394 9494 9495 9594 9493 9391 908F" $"8D8C 8A89 8988 8786 8584 8281 8080 8080" $"8080 8181 8181 8181 8182 8283 8485 8586" $"8788 8989 8A8B 8C8D 8F90 9192 9393 9394" $"9494 9494 9393 9392 9190 8F8E 8E8D 8D8D" $"8D8C 8C8C 8C8C 8D8D 8D8E 8E8F 8F8F 8F8F" $"8F8E 8D8D 8C8B 8A89 8888 8888 8989 8A8A" $"8A89 8988 8888 8888 8787 8786 8685 8585" $"8585 8586 8686 8585 8585 8484 8484 8383" $"8383 8382 8282 8281 8180 7F7E 7D7D 7C7C" $"7B7A 7978 7776 7473 7372 7271 7170 706F" $"6F6F 6F70 7071 7272 7373 7475 7677 7778" $"7879 7979 7979 7978 7777 7676 7575 7575" $"7474 7473 7373 7474 7575 7575 7475 7575" $"7575 7575 7575 7474 7373 7272 7171 706F" $"6E6E 6D6E 6E6E 6E6E 6F6F 6F70 7071 7273" $"7576 7779 7B7C 7E7E 7F7F 7F7F 7E7E 7D7D" $"7C7B 7B7A 7977 7675 7574 7373 7272 7171" $"7070 7070 7070 7070 7070 706F 6F6E 6D6D" $"6C6C 6B6B 6B6A 6A69 6867 6666 6565 6464" $"6463 6362 6262 6363 6465 6667 6869 696A" $"6A6B 6C6D 6E6F 6F6E 6E6D 6C6B 6B6A 6A6A" $"6A69 6968 6767 6665 6564 6463 6160 5F5E" $"5D5D 5D5D 5D5D 5D5E 5E5E 5E5D 5D5D 5D5D" $"5E5E 5F5F 5F5E 5D5D 5C5C 5C5C 5D5E 5F60" $"6162 6262 6262 6161 6060 605F 5F5F 5F60" $"6060 6061 6161 6160 6060 5F5F 5F60 6060" $"6060 6161 6263 6465 6566 6666 6666 6565" $"6565 6565 6464 6363 6261 5F5F 5E5E 5D5D" $"5D5D 5D5C 5C5C 5C5C 5C5C 5C5D 5D5E 5F5F" $"6061 6161 6262 6263 6364 6566 6767 6868" $"6969 6A6B 6C6D 6E6E 6F6F 6F70 7071 7171" $"7171 7171 7171 7272 7271 7170 6F6F 6E6E" $"6E6E 6D6D 6C6C 6C6C 6C6C 6D6D 6E6E 6F70" $"7071 7273 7373 7474 7575 7677 7778 7878" $"7879 7979 7A7A 7B7B 7B7B 7B7B 7B7C 7C7C" $"7D7D 7D7D 7D7C 7C7C 7C7C 7C7C 7D7D 7C7C" $"7C7B 7B7B 7B7B 7C7C 7D7E 7E7F 8081 8282" $"8383 8383 8382 8282 8181 8182 8282 8181" $"8180 8081 8181 8180 7F7E 7D7C 7B7B 7B7B" $"7B7A 7A7A 7A7A 7979 7A7A 7A7A 7A79 7979" $"7878 7776 7575 7474 7373 7272 7272 7272" $"7273 7475 7677 7878 7878 7878 7776 7675" $"7373 7271 7070 7070 7071 7171 7272 7373" $"7474 7575 7575 7474 7373 7373 7373 7373" $"7474 7475 7576 7677 7878 7979 7A7A 7979" $"7979 7979 7A7A 7A7B 7B7C 7C7D 7E7E 7E7F" $"7F7F 7F7F 7E7E 7E7E 7E7E 7D7D 7D7D 7D7D" $"7D7D 7D7D 7D7E 7E80 8182 8384 8485 8584" $"8484 8383 8281 8180 8080 7F7F 7F7F 7F80" $"8080 8181 8182 8282 8282 8282 8282 8282" $"8282 8283 8485 8687 8889 8A8A 8B8C 8D8E" $"8F8F 9090 9090 9090 9090 9091 9292 9394" $"9596 9697 999A 9B9D 9EA0 A1A1 A2A2 A2A2" $"A1A1 A1A0 A09F 9F9E 9E9E 9E9E 9E9E 9D9D" $"9D9D 9D9D 9E9E 9E9E 9D9D 9D9D 9D9D 9E9F" $"9FA0 A1A1 A1A1 A1A1 A0A0 9F9F 9F9E 9E9E" $"9E9D 9D9C 9B9B 9A9A 9A9A 9A9B 9B9C 9C9D" $"9D9D 9E9E 9E9E 9F9F 9F9E 9E9D 9D9C 9C9C" $"9C9C 9B9B 9A9A 9998 9898 9897 9797 9797" $"9797 9696 9595 9595 9596 9696 9797 9797" $"9797 9898 9898 9999 9999 9998 9898 9897" $"9696 9695 9697 9798 9899 9898 9898 9797" $"9797 9797 9696 9695 9493 9392 9191 9090" $"9090 9090 8F8F 9090 9192 9393 9394 9494" $"9596 9697 9797 9796 9594 9493 9392 9292" $"9292 9292 9293 9394 9495 9696 9797 9796" $"9695 9595 9595 9594 9494 9393 9393 9392" $"9292 9190 8F8E 8E8D 8D8D 8D8D 8E8E 8F8F" $"9090 9192 9393 9495 9595 9595 9596 9696" $"9695 9595 9494 9393 9393 9393 9393 9393" $"9393 9392 9291 908F 8E8E 8D8C 8B8B 8A8A" $"8A8A 8B8B 8B8C 8D8D 8E8E 8F8F 8F8F 8F8F" $"8F8E 8E8D 8D8C 8C8C 8C8B 8B8A 8A89 8989" $"898A 8A89 8989 8888 8989 8A8A 8A8B 8B8B" $"8B8C 8C8D 8D8E 8F90 9090 8F8E 8D8C 8B8A" $"8988 8786 8685 8483 8382 8282 8181 8080" $"8181 8182 8282 8282 8282 8282 8282 8281" $"8180 8080 8081 8181 8180 8080 8080 8181" $"8282 8282 8383 8383 8382 8281 807F 7E7D" $"7C7B 7A79 7978 7777 7776 7676 7575 7576" $"7677 7778 7979 7A7A 7B7C 7C7D 7E7F 7F80" $"8182 8282 8383 8383 8383 8383 8282 8281" $"8181 8080 8080 7F7F 7F7E 7E7E 7D7D 7D7C" $"7C7B 7B7B 7C7C 7D7D 7D7E 7E7E 7E7E 7F7F" $"8080 8080 807F 7E7D 7C7A 7A79 7877 7776" $"7575 7474 7475 7575 7676 7676 7575 7574" $"7473 7373 7272 7170 6F6E 6E6D 6D6C 6C6B" $"6B6B 6B6B 6B6B 6B6B 6B6B 6B6B 6B6A 6969" $"6868 6868 6869 696A 6B6C 6D6D 6E6E 6E6D" $"6D6D 6D6E 6E6F 7071 7273 7476 7778 797A" $"7B7C 7C7C 7C7C 7C7C 7C7C 7C7C 7B7B 7A79" $"7978 7776 7574 7373 7272 7273 7374 7474" $"7575 7575 7575 7676 7676 7675 7574 7473" $"7373 7373 7474 7575 7575 7575 7575 7677" $"7879 7979 7979 7878 7776 7675 7473 7271" $"7070 6F6F 6F6F 6F6E 6E6D 6D6C 6C6B 6B6A" $"6A6A 6969 6868 6766 6665 6565 6564 6463" $"6362 6262 6161 6160 605F 5E5E 5D5D 5D5D" $"5D5D 5E5E 5F60 6161 6162 6262 6262 6363" $"6464 6464 6464 6464 6363 6262 6262 6263" $"6465 6667 6767 6767 6767 6767 6869 696A" $"6A6A 6A6A 6A6B 6B6B 6C6C 6C6C 6B6B 6B6B" $"6B6B 6B6B 6C6C 6C6C 6D6D 6E6E 6F70 7071" $"7272 7373 7474 7575 7575 7576 7676 7676" $"7675 7575 7575 7575 7474 7474 7473 7373" $"7373 7374 7473 7373 7271 706F 6F6E 6D6D" $"6D6D 6D6D 6D6E 6E6E 6E6E 6E6E 6E6E 6E6F" $"6F6E 6E6E 6E6E 6F6F 7070 7070 6F6F 6F6F" $"6F70 7071 7272 7272 7272 7171 7171 7171" $"7070 7070 7071 7273 7475 7677 7878 797A" $"7B7C 7D7D 7E7F 8080 8081 8080 7F7F 7E7D" $"7C7B 7B7B 7B7C 7C7D 7E7F 8080 8182 8283" $"8383 8383 8383 8383 8382 8281 8180 7F7F" $"7F7F 7F7F 7F7F 7E7E 7E7E 7E7E 7E7E 7D7D" $"7D7C 7C7C 7C7C 7C7C 7D7D 7D7D 7E7E 7E7E" $"7F7F 7F7F 8080 807F 7F7E 7E7D 7C7C 7B7B" $"7A7A 7A79 7979 797A 7A7B 7B7D 7E7F 8182" $"8384 8586 8686 8786 8686 8584 8483 8382" $"8281 807F 7E7D 7C7C 7C7B 7B7B 7B7C 7C7D" $"7D7E 7E7E 7F7F 7F7F 7F80 8080 8080 7F7F" $"7F7F 8080 8182 8384 8485 8586 8686 8787" $"8787 8888 8989 8A8B 8C8C 8D8E 8E8F 8F8F" $"9090 9090 908F 8F8E 8E8D 8C8C 8B8B 8B8B" $"8B8C 8C8D 8D8E 8E8E 8E8E 8E8E 8F90 9192" $"9394 9596 9696 9796 9695 9594 9393 9291" $"9190 8F8E 8C8B 8987 8684 8382 8180 8080" $"8080 8081 8182 8282 8383 8384 8484 8484" $"8484 8485 8586 8686 8787 8787 8786 8685" $"8585 8584 8485 8585 8686 8788 8989 8A8B" $"8B8C 8C8C 8D8C 8C8C 8B8A 8989 8888 8787" $"8786 8686 8686 8788 898A 8A8B 8B8B 8B8C" $"8C8D 8E8F 8F90 9191 9191 9191 9191 9292" $"9394 9595 9697 9797 9796 9695 9594 9393" $"9392 9292 9292 9293 9394 9595 9696 9697" $"9797 9898 9898 9797 9796 9594 9392 9291" $"9191 9192 9292 9292 9292 9292 9293 9394" $"9494 9595 9595 9595 9595 9595 9595 9594" $"9494 9494 9393 9393 9394 9494 9494 9494" $"9494 9493 9393 9292 9292 9292 9293 9393" $"9393 9394 9595 9697 9899 9A9B 9C9C 9D9E" $"9F9F A0A1 A1A1 A0A0 A09F 9F9E 9E9D 9C9C" $"9B9A 9999 9897 9695 9493 9291 9190 908F" $"8F8E 8D8C 8C8C 8C8C 8D8D 8E8E 8F8F 8F90" $"9090 908F 8F8E 8D8C 8B8A 8989 8887 8787" $"8686 8686 8686 8686 8787 8787 8787 8786" $"8686 8686 8686 8685 8584 8483 8383 8282" $"8181 8080 7F7F 7F7F 8080 8182 8384 8485" $"8585 8585 8585 8484 8382 8180 7F7F 7F7F" $"7F7F 7F7F 8080 8080 8081 8181 8282 8384" $"8484 8483 8383 8383 8383 8383 8382 8282" $"8282 8282 8283 8383 8383 8383 8384 8485" $"8585 8585 8585 8584 8484 8383 8282 8283" $"8484 8586 8788 8888 8889 898A 8B8C 8C8D" $"8D8E 8E8E 8E8D 8D8D 8C8C 8B8B 8A8A 8989" $"8888 8888 8887 8787 8786 8686 8687 8787" $"8787 8888 8888 8989 8888 8887 8685 8484" $"8382 8281 807F 7E7D 7D7E 7E7F 7F80 8181" $"8283 8484 8585 8585 8584 8383 8281 8181" $"8080 807F 7F7F 7F7E 7E7E 7E7E 7E7E 7E7E" $"7E7E 7F7F 7F7F 8080 8081 8181 8181 8180" $"807F 7F7F 7F7F 7F7E 7D7D 7C7B 7A79 7876" $"7574 7271 7170 7070 7070 7070 7071 7171" $"7172 7273 7474 7576 7676 7676 7675 7574" $"7372 7170 6F6E 6E6D 6D6D 6C6C 6C6C 6C6B" $"6B6B 6C6C 6C6C 6C6D 6D6D 6D6D 6D6C 6C6C" $"6B6B 6A6A 6968 6867 6767 6767 6767 6766" $"6565 6464 6465 6566 6666 6767 6768 6868" $"6969 6A6B 6C6C 6D6E 6E6F 6F70 7071 7171" $"7272 7273 7373 7373 7372 7271 7170 706F" $"7070 7070 7171 7171 7171 7172 7273 7474" $"7575 7676 7676 7676 7778 7879 797A 7A79" $"7979 7878 7777 7676 7675 7575 7575 7575" $"7574 7474 7373 7373 7272 7272 7272 7373" $"7373 7373 7374 7473 7373 7372 7271 7170" $"6F6F 6E6D 6C6B 6A6A 6968 6867 6767 6868" $"6869 6969 6A6A 6969 6968 6767 6665 6565" $"6565 6464 6464 6465 6566 6667 6768 6869" $"696A 6A6A 6A6A 6969 6968 6868 6868 6767" $"6766 6666 6565 6463 6362 6262 6262 6262" $"6262 6262 6263 6364 6565 6667 6869 6A6B" $"6C6D 6D6E 6E6F 6F70 7171 7272 7272 7171" $"706F 6E6E 6D6D 6D6D 6D6C 6C6C 6B6B 6A6A" $"6969 6969 6868 6868 6868 6868 6767 6767" $"6767 6767 6768 6868 6869 6969 696A 6A6A" $"6A6A 6A6A 6969 6969 696A 6A6A 6B6B 6C6C" $"6D6E 6E6E 6F6F 6F70 7071 7172 7273 7474" $"7575 7676 7676 7777 7778 7879 7979 7A7A" $"7A79 7979 7878 7777 7777 7878 7879 7979" $"7A7A 7B7B 7B7B 7C7C 7C7C 7C7B 7B7B 7B7B" $"7B7B 7B7C 7C7C 7C7D 7D7E 7F7F 8080 8181" $"8181 8182 8282 8383 8383 8384 8484 8585" $"8586 8686 8686 8787 8786 8685 8584 8484" $"8484 8484 8484 8585 8687 8788 8989 8989" $"8A8A 8A8A 8A89 8989 8888 8787 8787 8787" $"8686 8686 8787 8888 8989 898A 8A8A 8989" $"8989 8989 8888 8787 8686 8585 8484 8484" $"8484 8484 8585 8585 8586 8686 8686 8686" $"8585 8586 8686 8787 8787 8888 898A 8B8C" $"8C8C 8C8C 8B8B 8B8A 8A8A 8A8A 8A8A 8A8A" $"8A8A 8A8A 8A8A 8B8B 8B8B 8B8B 8B8B 8B8B" $"8B8B 8B8B 8B8B 8B8B 8B8B 8B8C 8C8D 8D8D" $"8E8E 8E8F 8F90 9090 9191 9192 9293 9393" $"9494 9495 9595 9595 9595 9596 9696 9696" $"9696 9797 9797 9797 9797 9796 9695 9594" $"9393 9392 9393 9393 9393 9393 9393 9393" $"9494 9494 9595 9595 9595 9494 9494 9493" $"9392 9292 9191 9191 9192 9292 9292 9292" $"9292 9393 9393 9393 9394 9494 9595 9595" $"9595 9595 9595 9594 9494 9393 9292 9191" $"9090 908F 9090 9090 9090 9090 9191 9192" $"9292 9393 9393 9494 9494 9495 9595 9595" $"9696 9697 9797 9798 9897 9797 9797 9797" $"9696 9695 9595 9596 9697 9797 9898 9898" $"9897 9797 9796 9696 9696 9595 9595 9594" $"9494 9494 9595 9494 9393 9291 908F 8E8D" $"8C8C 8B8A 8988 8786 8584 8483 8382 8282" $"8282 8282 8282 8383 8484 8484 8484 8484" $"8383 8383 8383 8383 8383 8383 8484 8585" $"8687 8889 898A 8A8B 8B8C 8D8D 8E8E 8E8E" $"8E8E 8E8E 8D8D 8D8D 8D8D 8D8D 8D8D 8D8D" $"8D8D 8D8D 8E8E 8E8F 8F8F 9090 9191 9192" $"9292 9392 9292 9191 9191 9090 9191 9191" $"9292 9292 9292 9292 9191 9190 9090 9090" $"9090 8F8F 8F8F 8F8F 8F8F 8F8F 8F8E 8E8D" $"8D8C 8C8C 8C8C 8B8B 8B8A 8A89 8988 8887" $"8786 8686 8686 8686 8787 8788 8889 898A" $"8B8B 8B8B 8C8B 8B8B 8B8A 8A8A 8A89 8988" $"8887 8685 8483 8180 7F7E 7D7D 7C7B 7B7A" $"7979 7878 7777 7777 7777 7777 7777 7777" $"7777 7776 7676 7777 7777 7777 7777 7777" $"7777 7676 7676 7575 7575 7574 7474 7474" $"7575 7575 7575 7575 7575 7575 7574 7474" $"7373 7272 7272 7272 7273 7373 7474 7575" $"7576 7677 7878 7878 7878 7777 7776 7676" $"7575 7574 7575 7575 7575 7574 7473 7373" $"7373 7373 7373 7373 7474 7475 7575 7676" $"7778 7879 797A 7A7A 7A7A 7A79 7978 7877" $"7777 7777 7777 7778 7878 7979 7979 7979" $"7979 7979 7979 7979 7878 7878 7878 7878" $"7878 7979 7A7A 7A7A 7A7A 7A7A 7A7A 7A7A" $"7979 7979 7979 7878 7777 7676 7575 7575" $"7575 7574 7474 7474 7474 7575 7575 7575" $"7575 7575 7575 7574 7473 7372 7272 7171" $"7171 7171 7171 7272 7272 7272 7171 706F" $"6F6E 6E6D 6D6D 6D6C 6C6C 6C6B 6B6B 6B6B" $"6B6B 6C6C 6C6C 6C6D 6D6D 6D6D 6D6D 6D6C" $"6C6C 6C6B 6B6B 6B6B 6A6A 6968 6767 6666" $"6565 6565 6565 6666 6667 6767 6868 6868" $"6868 6868 6868 6867 6767 6766 6665 6564" $"6464 6364 6465 6566 6667 6767 6868 6869" $"6969 6A6A 6A6A 6A6A 6A6A 6B6B 6B6B 6B6B" $"6B6B 6B6A 6A6B 6B6B 6B6C 6C6D 6E6F 7070" $"7172 7273 7373 7373 7373 7373 7373 7373" $"7272 7272 7272 7373 7373 7474 7475 7575" $"7676 7777 7879 797A 7A7A 7A7A 7979 7878" $"7877 7776 7676 7676 7676 7575 7574 7474" $"7474 7474 7473 7373 7372 7272 7271 7171" $"7070 7070 7171 7171 7171 7172 7272 7373" $"7474 7474 7373 7374 7474 7474 7474 7475" $"7575 7677 7778 7879 7A7B 7B7C 7C7C 7D7D" $"7D7D 7D7D 7C7C 7B7B 7B7A 7A7A 7A7A 7A7A" $"7A7A 7A7A 7A7A 7B7B 7B7B 7B7B 7C7C 7C7C" $"7B7B 7B7B 7B7A 7A7A 7979 7978 7878 7878" $"7878 7877 7777 7776 7677 7777 7777 7777" $"7777 7777 7777 7878 7879 7979 7979 7878" $"7878 7878 7878 7878 7878 7878 7979 797A" $"7A7A 7B7B 7C7D 7D7E 7F7F 8080 8181 8181" $"8182 8282 8383 8383 8383 8484 8484 8483" $"8383 8484 8485 8586 8686 8787 8787 8787" $"8686 8585 8585 8585 8585 8585 8585 8586" $"8686 8686 8585 8484 8483 8383 8383 8383" $"8383 8484 8586 8788 8889 898A 8A8A 8B8B" $"8B8B 8B8B 8B8B 8B8B 8B8B 8A8A 8A89 8989" $"8988 8888 8888 8888 8888 8787 8787 8787" $"8787 8686 8686 8585 8585 8586 8687 8787" $"8788 8888 8989 8A8B 8B8B 8B8B 8B8B 8B8B" $"8A8A 8A8A 8A89 8989 8989 8989 8989 8989" $"8989 8989 8989 8989 8989 8989 8989 8A8A" $"8B8B 8B8B 8C8C 8C8C 8C8C 8C8B 8B8A 8A89" $"8988 8888 8887 8787 8786 8787 8888 8989" $"8A8A 8B8B 8B8C 8C8D 8D8E 8E8F 8F90 9090" $"9090 908F 8F8F 8F8F 8F8F 8F8F 8F8E 8E8E" $"8F8F 8F90 9090 9090 9090 9091 9191 9191" $"9191 9190 9090 8F8F 8F8F 8E8E 8E8E 8D8D" $"8C8C 8C8C 8C8C 8D8D 8E8E 8F90 9191 9293" $"9494 9595 9595 9595 9595 9595 9596 9696" $"9696 9696 9696 9696 9696 9797 9797 9898" $"999A 9A9A 9B9B 9C9C 9D9D 9D9E 9E9E 9E9E" $"9E9D 9D9D 9C9C 9C9C 9C9C 9C9C 9C9C 9C9B" $"9B9B 9B9A 9A9A 9999 9898 9797 9796 9696" $"9695 9595 9595 9595 9595 9596 9696 9797" $"9798 9898 9898 9898 9897 9797 9796 9695" $"9494 9392 9291 9190 9090 8F8F 8F8F 9090" $"9090 9191 9090 9090 8F8F 8F8F 8F8F 8F8F" $"8F8E 8E8E 8D8C 8C8B 8B8B 8B8B 8A8A 8A8A" $"8989 8888 8888 8887 8787 8786 8686 8685" $"8585 8585 8484 8484 8483 8383 8383 8383" $"8383 8282 8281 8181 8080 8080 8080 8181" $"8181 8181 8181 8181 8180 8080 7F7F 7F7F" $"7E7E 7F7F 7F7F 7F7F 8080 8181 8283 8384" $"8484 8484 8484 8382 8281 8080 7F7F 7E7E" $"7E7E 7E7E 7E7E 7E7E 7E7F 7F7F 8080 8080" $"8181 8181 8180 807F 7F7F 7E7E 7E7E 7E7E" $"7E7E 7E7E 7E7E 7E7E 7F7F 7F80 8080 8181" $"8182 8282 8283 8383 8484 8383 8382 8282" $"8180 807F 7F7F 7E7E 7E7E 7E7E 7E7E 7E7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F80 8080 8080" $"8080 8080 8080 7F7F 7E7E 7E7E 7E7E 7E7E" $"7E7E 7E7E 7E7E 7E7E 7E7E 7F7F 7F7E 7E7E" $"7D7D 7C7C 7C7C 7B7B 7A7A 7979 7978 7878" $"7777 7676 7676 7676 7675 7575 7575 7575" $"7574 7474 7373 7272 7171 7171 7171 7171" $"7172 7271 7171 7272 7273 7373 7474 7473" $"7373 7373 7373 7373 7373 7373 7373 7373" $"7474 7474 7474 7373 7373 7373 7373 7372" $"7272 7272 7271 7171 7070 6F6F 6F6E 6E6E" $"6D6D 6D6C 6C6C 6B6B 6B6B 6B6B 6B6B 6B6B" $"6B6B 6B6A 6A6A 6A6A 6A6A 6B6B 6B6B 6C6B" $"6B6B 6A6A 6A6A 6969 696A 6A6A 6A6B 6B6B" $"6C6C 6D6D 6E6E 6F6F 7070 7071 7171 7171" $"7171 7170 7070 7070 7070 7171 7171 7272" $"7272 7272 7272 7272 7272 7272 7272 7272" $"7272 7272 7272 7272 7373 7373 7474 7474" $"7373 7373 7373 7474 7575 7676 7777 7878" $"797A 7A7A 7A7A 7979 7978 7878 7777 7777" $"7676 7575 7474 7474 7475 7575 7575 7676" $"7777 7878 7878 7878 7877 7777 7776 7676" $"7575 7474 7474 7474 7474 7575 7576 7777" $"7879 7A7A 7B7C 7C7D 7D7D 7E7E 7E7E 7D7D" $"7D7D 7C7C 7B7B 7A7A 7978 7878 7878 7777" $"7777 7676 7676 7676 7676 7676 7675 7575" $"7575 7575 7575 7474 7473 7373 7272 7272" $"7272 7271 7171 7171 7171 7171 7171 7171" $"7171 7272 7272 7373 7474 7575 7575 7575" $"7575 7575 7575 7574 7473 7372 7272 7171" $"7170 7070 7070 7171 7272 7374 7475 7576" $"7676 7777 7777 7777 7777 7676 7575 7575" $"7575 7676 7676 7677 7777 7878 7878 7878" $"7878 7878 7979 7979 7979 7A7A 7A7B 7C7C" $"7D7D 7E7E 7E7F 7F7F 7F80 8080 8181 8181" $"8181 8181 8282 8283 8383 8384 8484 8484" $"8484 8484 8484 8484 8483 8383 8383 8383" $"8383 8384 8484 8484 8585 8585 8585 8585" $"8585 8584 8484 8484 8383 8383 8383 8282" $"8282 8283 8383 8384 8485 8585 8686 8687" $"8787 8888 8888 8888 8888 8888 8888 8888" $"8888 8787 8787 8787 8686 8686 8585 8585" $"8585 8585 8585 8585 8585 8585 8585 8584" $"8484 8383 8282 8281 8181 8181 8181 8181" $"8283 8384 8484 8485 8585 8585 8585 8585" $"8585 8484 8483 8383 8383 8384 8483 8383" $"8383 8382 8383 8383 8484 8485 8585 8686" $"8687 8787 8786 8686 8686 8686 8585 8585" $"8585 8585 8585 8586 8686 8787 8888 8989" $"898A 8A8A 8B8B 8B8B 8B8B 8B8B 8C8C 8C8D" $"8D8D 8D8E 8E8E 8E8E 8E8E 8F8F 8F8E 8E8E" $"8F8F 8F8F 8F90 9090 9091 9191 9292 9292" $"9292 9392 9292 9191 9190 9090 8F8F 8F8F" $"8E8E 8E8E 8E8E 8E8F 8F8F 8F8F 8F8F 9090" $"9091 9191 9191 9191 9190 9090 9090 8F8F" $"8F8F 8E8E 8E8E 8D8D 8D8D 8D8C 8C8C 8C8C" $"8C8D 8D8D 8D8D 8D8D 8D8D 8D8E 8E8E 8E8E" $"8E8E 8D8D 8D8D 8D8C 8C8C 8C8C 8C8B 8B8B" $"8B8B 8B8B 8C8C 8C8C 8D8D 8D8E 8E8E 8E8E" $"8E8E 8D8D 8D8C 8C8B 8B8A 8A8A 8989 8989" $"8888 8888 8888 8889 8989 898A 8A8A 8A8B" $"8B8C 8C8C 8D8D 8D8D 8D8C 8C8C 8C8C 8B8B" $"8B8B 8B8B 8A8A 8A8A 8A8A 8989 8989 8989" $"8989 8988 8888 8888 8787 8686 8585 8585" $"8584 8484 8484 8484 8484 8484 8484 8484" $"8484 8484 8485 8585 8585 8686 8787 8787" $"8888 8887 8787 8686 8686 8585 8585 8585" $"8584 8484 8484 8484 8485 8585 8585 8686" $"8686 8686 8686 8585 8585 8484 8483 8383" $"8282 8181 8181 8080 8081 8181 8182 8282" $"8383 8484 8585 8586 8686 8585 8585 8585" $"8585 8585 8585 8585 8585 8686 8585 8585" $"8686 8686 8686 8687 8787 8788 8888 8888" $"8888 8888 8888 8887 8787 8787 8686 8686" $"8686 8686 8685 8585 8585 8585 8585 8585" $"8585 8584 8484 8383 8281 8180 807F 7F7E" $"7E7E 7D7D 7D7C 7C7C 7C7C 7C7C 7C7B 7B7B" $"7B7B 7B7B 7B7B 7B7C 7C7C 7C7B 7B7A 7A7A" $"7979 7979 7978 7877 7776 7675 7575 7474" $"7373 7372 7272 7272 7272 7373 7373 7474" $"7575 7676 7676 7676 7676 7676 7677 7777" $"7778 7878 7979 7979 7979 7979 7878 7878" $"7878 7878 7878 7878 7878 7878 7879 7979" $"7979 7979 7979 7979 7878 7777 7676 7676" $"7676 7677 7777 7778 7878 7879 7979 7979" $"7979 797A 7A7A 7B7B 7C7C 7D7D 7D7D 7D7E" $"7E7E 7D7D 7D7C 7B7B 7A79 7878 7877 7777" $"7676 7676 7677 7777 7878 7878 7878 7878" $"7878 7877 7776 7675 7574 7474 7473 7373" $"7373 7474 7475 7575 7676 7677 7777 7777" $"7777 7676 7676 7675 7575 7474 7474 7474" $"7474 7474 7474 7474 7473 7373 7373 7272" $"7272 7272 7373 7373 7374 7474 7474 7575" $"7575 7576 7676 7676 7676 7676 7676 7676" $"7675 7575 7574 7474 7474 7473 7373 7474" $"7474 7474 7473 7373 7372 7271 7170 7070" $"7070 7070 7070 7070 7070 7171 7272 7273" $"7373 7474 7474 7474 7473 7373 7373 7373" $"7373 7373 7373 7374 7474 7474 7474 7473" $"7373 7373 7272 7272 7273 7373 7373 7373" $"7373 7374 7474 7475 7575 7575 7575 7576" $"7676 7676 7676 7777 7777 7778 7878 7878" $"7979 797A 7A7A 7B7B 7B7C 7C7C 7C7C 7D7D" $"7D7D 7D7D 7D7D 7D7D 7C7C 7B7B 7A7A 7A79" $"7979 7979 7979 797A 7A7A 7A7A 7A7A 7A79" $"7979 7978 7877 7776 7676 7676 7676 7677" $"7777 7878 7879 797A 7A7B 7B7C 7C7C 7D7D" $"7D7E 7E7E 7E7E 7E7D 7D7D 7D7D 7D7D 7C7C" $"7C7C 7C7B 7B7B 7B7B 7B7A 7A7A 7A7A 7A7A" $"7A7A 7A7A 7A7A 7A7B 7B7B 7B7B 7B7B 7C7C" $"7C7C 7C7B 7B7B 7A7A 7A79 7979 7978 7878" $"7979 797A 7A7B 7B7C 7C7C 7D7D 7E7E 7F7F" $"7F80 8080 8080 8080 8081 8181 8182 8282" $"8282 8282 8282 8282 8181 8181 8182 8282" $"8383 8384 8484 8484 8585 8586 8686 8686" $"8687 8787 8787 8787 8787 8787 8787 8787" $"8787 8686 8686 8686 8686 8686 8686 8686" $"8787 8787 8787 8787 8787 8787 8787 8888" $"8888 8889 8989 8989 8A8A 8A8B 8B8B 8B8B" $"8B8A 8A8A 8A89 8989 8988 8888 8888 8888" $"8889 8989 8888 8888 8888 8888 8888 8889" $"8989 8989 8A8A 8A8A 8A8A 8A89 8989 8988" $"8888 8887 8787 8787 8788 8888 8888 8989" $"8989 898A 8A8A 8A8A 8A8A 8A89 8988 8887" $"8786 8686 8586 8686 8686 8687 8787 8787" $"8787 8787 8787 8788 8888 8888 8887 8787" $"8787 8787 8788 8888 8888 8888 8888 8989" $"898A 8989 8988 8888 8787 8786 8686 8686" $"8686 8686 8686 8585 8585 8585 8584 8484" $"8484 8484 8383 8383 8384 8484 8585 8586" $"8687 8788 8888 8888 8888 8888 8888 8888" $"8787 8787 8787 8686 8686 8686 8686 8787" $"8787 8787 8888 8888 8888 8989 8989 8989" $"8989 898A 8A8A 8B8B 8B8C 8C8D 8D8D 8D8E" $"8E8E 8E8E 8E8E 8D8D 8D8C 8C8C 8C8C 8C8C" $"8C8C 8C8D 8D8D 8D8D 8E8E 8E8E 8F8F 8F90" $"9090 9090 9090 9090 8F8F 8F8F 8F8F 8F8F" $"8F8F 8E8E 8E8E 8E8D 8D8D 8D8D 8D8D 8D8C" $"8C8C 8C8C 8C8C 8C8C 8C8C 8C8B 8B8B 8A8A" $"8A89 8989 8989 8989 8989 8989 8989 8989" $"8989 8989 8989 8888 8888 8787 8786 8686" $"8685 8585 8585 8585 8585 8484 8484 8484" $"8484 8484 8484 8484 8484 8383 8383 8282" $"8282 8181 8181 8181 8282 8282 8283 8383" $"8484 8484 8484 8484 8383 8282 8281 8181" $"8181 8080 8080 8080 8080 8080 8080 8080" $"807F 7F7F 7F7F 7F7F 7F7E 7E7E 7E7E 7E7E" $"7D7D 7D7D 7D7D 7C7C 7C7C 7C7C 7C7C 7C7C" $"7C7C 7C7C 7C7C 7D7D 7D7D 7E7E 7E7E 7E7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7E7E 7E7E" $"7E7E 7E7D 7D7D 7D7D 7D7D 7D7D 7D7D 7D7D" $"7E7E 7E7E 7E7E 7E7F 7F7F 7F7F 7E7E 7E7E" $"7E7E 7E7E 7E7E 7E7E 7E7E 7E7F 7F7F 8080" $"8080 8081 8181 8282 8282 8383 8383 8383" $"8383 8383 8383 8383 8383 8383 8282 8282" $"8181 8181 8080 8080 8080 8080 8080 7F7F" $"7F7F 7E7E 7E7E 7D7D 7D7D 7D7D 7D7C 7C7C" $"7B7B 7B7A 7A7A 7979 7A7A 7A7A 7A7A 7A7A" $"7B7B 7B7A 7A7A 7A79 7979 7978 7878 7878" $"7777 7777 7676 7676 7575 7575 7575 7575" $"7575 7575 7575 7575 7575 7575 7575 7575" $"7575 7575 7575 7474 7474 7474 7473 7373" $"7373 7374 7474 7474 7474 7474 7474 7474" $"7474 7475 7575 7576 7676 7676 7676 7676" $"7676 7575 7574 7474 7373 7373 7373 7474" $"7475 7576 7676 7777 7777 7777 7776 7676" $"7676 7676 7676 7575 7676 7676 7676 7676" $"7777 7777 7777 7778 7878 7878 7877 7777" $"7777 7777 7676 7676 7676 7675 7574 7474" $"7473 7373 7373 7372 7272 7272 7272 7373" $"7373 7373 7373 7474 7474 7474 7473 7373" $"7373 7373 7373 7374 7475 7575 7676 7677" $"7777 7777 7878 7878 7878 7878 7879 7979" $"7979 7979 7978 7878 7878 7878 7777 7777" $"7777 7777 7777 7777 7777 7878 7878 7878" $"7878 7879 7979 7979 7979 7978 7878 7877" $"7777 7676 7676 7677 7777 7778 7878 7879" $"7979 797A 7979 7979 7878 7878 7777 7777" $"7776 7676 7677 7777 7777 7777 7878 7878" $"7878 7878 7878 7878 7879 797A 7A7B 7B7C" $"7C7C 7D7D 7D7D 7D7D 7D7D 7D7D 7D7C 7C7C" $"7C7C 7C7D 7D7D 7D7D 7D7E 7E7E 7F7F 7F7F" $"7F7F 7F7F 7F7F 8080 8080 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7E7E 7E7E 7E7F 7F7F 7F7F" $"8080 8081 8182 8283 8383 8383 8383 8484" $"8484 8484 8484 8383 8382 8282 8282 8282" $"8282 8282 8282 8282 8283 8383 8383 8383" $"8383 8384 8484 8484 8484 8484 8484 8484" $"8483 8484 8484 8484 8585 8585 8585 8585" $"8585 8686 8686 8787 8787 8686 8686 8585" $"8585 8585 8584 8484 8484 8484 8484 8484" $"8484 8484 8484 8484 8484 8484 8483 8383" $"8383 8383 8383 8383 8384 8484 8484 8484" $"8484 8484 8585 8586 8787 8888 8889 8989" $"8A8A 8A8A 8A8A 8A8A 8A8A 8A89 8989 8888" $"8888 8888 8888 8888 8888 8888 8888 8888" $"8888 8787 8786 8686 8685 8585 8484 8484" $"8483 8383 8383 8383 8383 8383 8383 8484" $"8484 8484 8484 8585 8585 8585 8585 8584" $"8484 8484 8484 8483 8383 8383 8383 8383" $"8383 8484 8484 8484 8485 8585 8585 8585" $"8585 8584 8484 8484 8483 8383 8383 8384" $"8484 8484 8585 8586 8686 8687 8787 8788" $"8888 8887 8787 8787 8787 8786 8686 8686" $"8686 8687 8787 8788 8888 8888 8888 8888" $"8888 8787 8787 8787 8787 8788 8888 8889" $"8989 8989 8989 8989 8989 8989 8989 8989" $"8888 8887 8787 8787 8686 8686 8685 8585" $"8585 8585 8585 8585 8585 8686 8686 8787" $"8788 8888 8989 8989 8989 8989 8989 8989" $"8989 8989 8989 8989 8989 8989 898A 8A8A" $"8989 8989 8888 8888 8887 8787 8786 8686" $"8686 8787 8787 8888 8888 8888 8787 8787" $"8787 8787 8686 8686 8686 8686 8686 8787" $"8787 8787 8787 8888 8887 8787 8787 8786" $"8686 8686 8686 8685 8585 8584 8484 8484" $"8484 8484 8484 8484 8484 8484 8484 8484" $"8484 8383 8382 8282 8282 8181 8181 8181" $"8181 8181 8181 8181 8181 8181 8181 8181" $"8181 8181 8181 8181 8181 8181 8181 8181" $"8080 8080 8080 7F7F 7F7F 7F7F 7F7F 8080" $"8080 8080 8080 8081 8181 8181 8181 8181" $"8181 8181 8182 8282 8282 8282 8282 8282" $"8282 8281 8181 8180 8080 8080 7F7F 7F7F" $"7F7F 7F7F 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8081 8181 8181 8080 8080 807F 7F7F 7E7E" $"7E7D 7D7D 7D7D 7D7D 7C7C 7C7C 7C7C 7C7C" $"7C7C 7C7C 7C7C 7C7C 7C7C 7C7C 7C7B 7B7B" $"7B7B 7B7A 7A7A 7A7A 7A79 7979 7979 7979" $"7979 7A7A 7A7A 7A7A 7A7A 797A 7A7A 7A7A" $"7A79 7979 7979 7878 7878 7878 7777 7777" $"7777 7878 7878 7878 7878 7878 7878 7878" $"7878 7878 7877 7777 7777 7777 7777 7777" $"7777 7878 7878 7879 7979 7979 7979 7979" $"7978 7878 7777 7777 7676 7676 7575 7575" $"7576 7676 7677 7777 7777 7778 7878 7879" $"7979 7979 7979 7A7A 7A7A 7A7A 7979 7979" $"7979 7979 7978 7878 7878 7979 7979 7979" $"7979 7979 7A7A 7A7A 7A7A 7A7B 7B7B 7B7B" $"7B7B 7B7B 7B7B 7A7A 7A7A 7A7A 7979 7979" $"7878 7878 7878 7878 7878 7878 7879 7979" $"7979 7979 7979 7979 7979 7978 7878 7878" $"7878 7877 7777 7777 7777 7777 7777 7777" $"7777 7777 7777 7777 7777 7777 7777 7777" $"7777 7777 7777 7878 7878 7878 7878 7878" $"7879 7979 797A 7A7A 7B7B 7B7B 7C7C 7C7C" $"7B7B 7B7B 7B7B 7B7B 7B7B 7B7B 7A7A 7A7A" $"7A7A 7A7A 7A7A 7A7A 7A7B 7B7B 7B7A 7A7A" $"7A7A 7A7B 7B7B 7B7B 7B7B 7B7C 7C7C 7C7C" $"7C7C 7C7C 7C7C 7C7C 7C7C 7C7C 7B7C 7C7C" $"7C7C 7C7C 7B7B 7C7C 7C7C 7C7C 7C7B 7B7B" $"7B7B 7A7A 7A7A 7A7A 7979 7979 7979 7A7A" $"7A7A 7A7A 7A7A 7B7B 7B7B 7B7C 7C7C 7C7C" $"7C7C 7C7C 7C7C 7C7C 7C7C 7C7C 7C7C 7C7C" $"7C7C 7C7C 7D7D 7D7D 7D7D 7D7D 7E7E 7E7E" $"7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E" $"7E7E 7E7E 7E7D 7D7D 7D7D 7D7D 7D7D 7D7D" $"7D7D 7D7D 7D7D 7E7E 7E7E 7E7E 7E7E 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7E7E 7E7E" $"7E7D 7D7D 7D7C 7C7C 7C7B 7B7B 7B7B 7B7A" $"7A7A 7A7A 7A7A 7B7B 7B7B 7B7B 7B7B 7B7B" $"7C7C 7C7C 7C7C 7C7C 7D7D 7D7D 7E7E 7E7E" $"7E7E 7E7E 7E7F 7F7F 7F7F 7E7E 7E7E 7E7E" $"7E7E 7E7E 7F7F 7F7F 7F80 8080 8080 8081" $"8181 8181 8181 8181 8182 8282 8282 8282" $"8282 8282 8282 8282 8282 8282 8282 8282" $"8282 8283 8383 8383 8484 8484 8484 8585" $"8585 8585 8586 8686 8686 8585 8585 8585" $"8585 8585 8585 8585 8586 8686 8686 8686" $"8685 8585 8585 8586 8686 8686 8686 8787" $"8787 8788 8888 8888 8888 8888 8989 8989" $"8989 898A 8A8A 8A8A 8A8A 8A8A 8A8A 8B8B" $"8A8A 8A8A 8A8A 8A8A 8A89 8989 8989 8989" $"8989 8989 8989 8989 8989 8989 8989 8989" $"8989 8989 8989 8888 8888 8888 8787 8787" $"8786 8686 8687 8787 8787 8888 8888 8889" $"8989 8989 8989 8989 8989 8989 8988 8888" $"8787 8787 8786 8686 8686 8685 8585 8585" $"8585 8686 8686 8686 8687 8787 8787 8787" $"8787 8787 8786 8686 8686 8585 8585 8484" $"8484 8484 8484 8484 8484 8484 8484 8484" $"8484 8383 8383 8383 8383 8383 8383 8383" $"8383 8383 8383 8383 8383 8383 8383 8383" $"8383 8383 8383 8484 8484 8484 8484 8585" $"8585 8585 8585 8686 8686 8686 8687 8787" $"8787 8787 8787 8787 8787 8787 8888 8888" $"8888 8888 8888 8888 8888 8888 8888 8888" $"8888 8888 8888 8888 8787 8888 8888 8888" $"8888 8888 8888 8888 8888 8888 8888 8888" $"8888 8888 8888 8888 8888 8888 8888 8787" $"8787 8787 8787 8786 8686 8686 8686 8585" $"8585 8585 8585 8484 8484 8484 8483 8383" $"8383 8282 8282 8281 8181 8181 8080 8080" $"8080 8080 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7E 7E7E 7E7E 7E7E 7E7D 7D7D 7D7D 7D7D" $"7D7D 7D7D 7D7D 7D7D 7D7D 7D7D 7D7D 7D7D" $"7D7D 7D7D 7D7D 7D7E 7E7E 7D7D 7D7D 7D7D" $"7D7D 7D7D 7D7D 7D7D 7D7D 7D7D 7D7D 7D7D" $"7D7D 7D7D 7D7D 7D7D 7D7D 7C7C 7C7C 7C7C" $"7C7B 7B7B 7B7B 7B7B 7B7B 7B7B 7B7B 7B7B" $"7B7B 7B7B 7B7B 7B7B 7B7B 7B7B 7B7B 7B7B" $"7B7B 7B7A 7A7A 7A7A 7A7A 7979 7979 7979" $"7979 7979 7A7A 7A7A 7A7A 7B7B 7B7B 7B7B" $"7B7B 7B7B 7B7B 7B7B 7B7B 7B7B 7C7C 7C7C" $"7C7C 7C7C 7C7C 7C7C 7C7C 7C7C 7C7C 7C7C" $"7B7B 7B7B 7B7B 7B7C 7C7C 7C7C 7C7C 7C7D" $"7D7D 7D7D 7D7D 7D7D 7D7D 7D7C 7C7C 7C7C" $"7C7C 7C7C 7C7C 7C7C 7C7C 7C7B 7B7B 7B7B" $"7B7B 7B7B 7B7B 7B7B 7B7B 7B7B 7B7B 7B7B" $"7C7C 7C7C 7C7C 7C7C 7C7C 7C7C 7C7C 7B7B" $"7B7B 7B7B 7A7A 7A7A 7A7A 7A79 7979 7979" $"7979 7979 7979 7979 7979 7979 7979 7979" $"7979 7979 7979 7978 7878 7878 7878 7878" $"7878 7878 7979 7979 7979 7979 7979 7979" $"7878 7878 7878 7878 7878 7878 7878 7878" $"7979 7979 7979 7979 7979 797A 7A7A 7A7A" $"7A7A 7A7A 7A7A 7A7A 7979 7979 7979 7878" $"7878 7878 7878 7878 7878 7878 7879 7979" $"797A 7A7A 7B7B 7B7B 7B7B 7B7B 7B7B 7B7B" $"7B7B 7B7B 7B7B 7B7B 7B7B 7B7B 7C7C 7C7C" $"7C7C 7C7C 7C7C 7C7C 7B7B 7B7B 7B7B 7B7B" $"7C7C 7C7C 7C7C 7C7C 7C7C 7C7C 7C7C 7C7D" $"7D7D 7C7C 7C7C 7C7C 7C7C 7C7C 7C7C 7C7C" $"7C7C 7C7C 7C7C 7D7D 7D7D 7D7D 7D7D 7D7D" $"7D7D 7D7D 7D7E 7E7E 7E7E 7E7E 7E7E 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F80 8080 8080 8081" $"8181 8181 8181 8181 8181 8181 8181 8181" $"8080 8080 8080 8080 8080 807F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7D7D" $"7D7D 7D7D 7D7D 7D7D 7D7D 7C7C 7C7C 7C7C" $"7C7C 7C7C 7C7C 7C7C 7C7C 7C7D 7D7D 7D7D" $"7D7D 7D7D 7D7D 7D7D 7D7D 7D7D 7D7D 7D7E" $"7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E" $"7E7E 7E7E 7E7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"8080 8080 8081 8181 8181 8181 8181 8181" $"8282 8282 8282 8281 8181 8181 8181 8181" $"8181 8180 8080 8181 8181 8181 8181 8181" $"8282 8282 8282 8282 8282 8282 8282 8181" $"8181 8181 8181 8282 8282 8282 8282 8282" $"8282 8282 8282 8282 8282 8282 8282 8282" $"8282 8282 8282 8282 8281 8181 8181 8181" $"8181 8181 8181 8181 8181 8182 8282 8282" $"8282 8383 8383 8384 8484 8484 8484 8484" $"8484 8484 8484 8484 8484 8484 8484 8484" $"8484 8484 8484 8484 8484 8484 8484 8484" $"8484 8484 8484 8484 8484 8485 8585 8585" $"8585 8585 8585 8585 8484 8484 8484 8484" $"8484 8484 8484 8484 8484 8484 8484 8484" $"8484 8484 8484 8484 8484 8484 8484 8383" $"8383 8383 8383 8383 8383 8383 8383 8383" $"8383 8383 8383 8383 8383 8383 8383 8383" $"8383 8383 8383 8383 8383 8383 8383 8383" $"8383 8383 8382 8282 8282 8282 8282 8282" $"8282 8383 8383 8383 8383 8383 8383 8383" $"8383 8383 8383 8383 8383 8383 8383 8383" $"8383 8383 8383 8383 8383 8383 8383 8383" $"8383 8282 8282 8282 8282 8282 8281 8181" $"8181 8181 8181 8282 8282 8282 8282 8282" $"8282 8282 8282 8282 8282 8282 8282 8282" $"8282 8282 8282 8282 8282 8282 8282 8383" $"8383 8383 8383 8383 8383 8383 8383 8383" $"8383 8383 8383 8383 8282 8282 8282 8282" $"8282 8282 8282 8282 8282 8282 8282 8282" $"8282 8282 8282 8282 8282 8282 8282 8282" $"8282 8282 8282 8282 8282 8383 8383 8383" $"8383 8383 8383 8383 8382 8282 8282 8282" $"8282 8282 8282 8181 8281 8181 8181 8181" $"8181 8181 8181 8181 8181 8181 8181 8181" $"8181 8181 8181 8181 8181 8181 8181 8181" $"8181 8181 8181 8181 8080 8080 8080 8080" $"8080 8080 8080 807F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 8080 8080 8080 8080" $"807F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F80 8080 8080 8080 807F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 807F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7E7E 7E7E 7E7E 7E7E 7D7D 7D7D" $"7D7D 7D7D 7D7D 7D7D 7D7D 7D7D 7D7C 7C7C" $"7C7C 7C7C 7C7C 7C7C 7C7C 7C7C 7C7C 7C7C" $"7C7B 7B7B 7B7B 7B7B 7B7B 7B7B 7C7C 7C7C" $"7C7C 7C7C 7C7C 7C7C 7C7C 7C7C 7C7C 7C7C" $"7C7C 7C7C 7C7C 7C7C 7C7C 7C7C 7C7D 7D7D" $"7D7D 7D7D 7D7D 7D7D 7D7D 7D7D 7D7D 7D7D" $"7D7D 7D7D 7D7D 7D7D 7D7D 7D7D 7D7D 7D7D" $"7D7D 7D7D 7D7D 7D7D 7D7D 7D7D 7D7D 7D7D" $"7D7D 7D7D 7D7D 7C7C 7C7C 7C7C 7C7C 7C7C" $"7C7C 7C7C 7C7C 7C7C 7C7D 7D7D 7D7D 7D7D" $"7D7D 7D7D 7D7D 7D7D 7D7D 7D7D 7D7D 7C7C" $"7C7C 7C7C 7C7C 7C7C 7C7C 7C7C 7C7C 7C7D" $"7D7D 7D7D 7D7D 7D7D 7D7D 7D7D 7D7D 7D7C" $"7C7C 7C7C 7C7C 7C7C 7C7C 7C7C 7C7C 7C7C" $"7C7C 7C7C 7C7C 7C7C 7C7C 7B7B 7B7B 7B7B" $"7B7B 7B7B 7B7B 7B7B 7B7B 7B7B 7B7B 7B7B" $"7B7B 7C7C 7C7C 7C7C 7C7C 7C7C 7C7C 7D7D" $"7C7C 7C7C 7C7C 7C7C 7C7D 7D7D 7D7D 7D7D" $"7D7D 7D7D 7D7D 7D7D 7D7D 7D7D 7D7D 7D7D" $"7D7D 7D7D 7D7D 7D7D 7D7D 7D7D 7D7D 7D7D" $"7D7D 7D7D 7D7D 7D7D 7D7D 7D7D 7D7D 7D7D" $"7D7D 7D7D 7D7D 7D7D 7D7D 7D7D 7D7D 7D7D" $"7D7D 7D7D 7D7D 7D7D 7E7E 7E7E 7E7E 7E7E" $"7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E" $"7E7E 7E7E 7E7E 7E7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8181 8181" $"8181 8181 8181 8181 8181 8181 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8081 8181 8181 8181 8181 8181" $"8181 8181 8181 8181 8181 8181 8181 8181" $"8181 8181 8181 8181 8181 8181 8181 8181" $"8181 8181 8181 8181 8181 8181 8181 8181" $"8181 8181 8181 8181 8182 8282 8282 8282" $"8282 8282 8282 8282 8282 8282 8282 8282" $"8282 8282 8282 8282 8282 8282 8282 8282" $"8282 8282 8282 8282 8282 8282 8282 8282" $"8282 8282 8282 8282 8282 8282 8282 8282" $"8282 8282 8282 8282 8282 8282 8282 8282" $"8282 8282 8282 8282 8282 8282 8181 8181" $"8181 8181 8182 8282 8282 8282 8282 8282" $"8282 8282 8282 8282 8282 8282 8282 8181" $"8181 8181 8181 8181 8181 8181 8181 8181" $"8181 8181 8181 8181 8181 8181 8181 8181" $"8181 8180 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8181" $"8181 8181 8181 8181 8181 8181 8181 8181" $"8181 8181 8181 8181 8181 8181 8181 8181" $"8181 8181 8181 8181 8181 8181 8181 8181" $"8181 8181 8181 8181 8181 8181 8080 8080" $"8080 8080 8081 8181 8080 8080 8080 8080" $"8080 8080 8080 8080 8181 8181 8181 8181" $"8181 8181 8181 8181 8181 8181 8181 8181" $"8181 8181 8181 8181 8181 8181 8181 8181" $"8181 8181 8181 8181 8181 8180 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7E 7E7E 7E7E 7E7E" $"7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E" $"7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E" $"7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E" $"7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E" $"7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E" $"7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E" $"7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E" $"7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E" $"7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E" $"7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E 7E7E" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F80" $"8080 807F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F" $"7F7F 7F7F 7F7F 7F80 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" } }; resource 'snd ' (16055, "Bugle", purgeable) { FormatOne { { /* array Synthesizers: 1 elements */ /* [1] */ sampledSynth, 160 } }, { /* array SoundCmnds: 1 elements */ /* [1] */ hasData, bufferCmd { 20 } }, { /* array DataTables: 1 elements */ /* [1] */ 13334, Rate22K, 13332, 13333, 0x0, 0x3C, $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 7F7F 7F7F 8080 8182 8282" $"8282 8282 8282 8281 8282 8180 8080 7F7E" $"7E7F 8080 8182 8283 8383 8484 8689 8D8F" $"9090 8B83 796D 625C 5B5B 5D62 6A73 7C81" $"8484 8380 7D7B 7A79 7878 797C 7F81 8281" $"8080 8181 807F 7F7F 7F80 8183 8483 8281" $"8181 8282 8282 8282 8383 8281 807F 7E7E" $"7D7D 7D7E 8082 8486 888A 8E94 989A 9A99" $"9590 8B84 7B70 6357 5252 575F 6871 787C" $"7D79 7169 6361 6267 7077 7C80 8283 8587" $"8785 8484 8483 8280 8081 8386 8787 8685" $"8483 8385 8788 8786 8584 8281 8180 7F7E" $"7E7E 7E7F 8082 8384 878A 8C8C 8B8B 8C8F" $"9295 989A 9997 9593 908C 8478 6854 3F34" $"3435 3945 5363 727C 8180 7D7B 7A78 7676" $"787B 8085 8B8C 8A86 8482 8080 8080 8284" $"8587 898A 8A8A 8988 8684 8383 8383 8282" $"8181 817F 7F7F 7F7F 8183 8587 898B 8D8E" $"8E8C 8B8A 8A8D 9195 9A9D 9FA0 A29E 917E" $"6348 3328 272C 353F 474E 555C 6671 787C" $"7E7D 7B79 7779 828D 9496 948F 8986 8686" $"8789 8A89 8887 8585 8788 8886 8483 8282" $"8284 8688 8886 8584 8382 8181 8182 8384" $"8586 8787 8788 8A8C 8E8E 9093 99A0 A6A8" $"A8A5 9F91 7B61 4834 2925 2424 2B38 464F" $"5967 767C 7D7E 8283 817F 8189 9297 958F" $"8B8B 8A88 8786 8687 8886 8484 8688 8988" $"8787 8685 8384 878A 8C8B 8A88 8683 807D" $"7A7A 7C7E 8183 8588 8A8B 8B8A 8A8A 8B8D" $"8E90 9397 9CA1 A7AB A99A 8164 4933 2217" $"0E0C 182B 3F57 7184 8C90 908E 8982 7C7C" $"828C 9497 928E 8B87 817F 8082 8281 8180" $"8186 8A8E 8F8E 8C89 8785 8283 8688 8787" $"8787 8584 827F 7D7D 7C7C 7D7F 8387 8A8C" $"8C8B 8A89 8888 8B91 979D A3A7 ACAE A895" $"7A59 351A 0E0E 1422 3547 596F 838B 8C8A" $"8785 827B 7678 808C 9597 948F 8A84 7D7D" $"7F81 8282 8384 888C 8E8E 8E8E 8C89 8581" $"8081 8587 8889 8988 8582 7D79 7877 7879" $"7C81 8589 8B8C 8C8B 8A88 8889 8C92 9AA1" $"A7AE B2AE A28B 6E4F 331E 0C00 0519 3457" $"798F 9997 8C81 7C7B 7875 767D 868E 9190" $"8F8C 8783 7F7F 8080 7E7D 7F84 8B90 9292" $"908D 8986 8483 8385 8889 8887 8684 827E" $"7A78 7776 7679 7F85 8B8F 9191 908C 8987" $"8687 8B91 979B A2A9 ACA6 957D 5F42 2814" $"0A0F 203A 5978 8E97 968D 827A 7674 7171" $"7882 8B91 9594 908B 847F 7D7D 7D7C 7D80" $"858A 8E92 9495 938F 8A86 8280 8184 8788" $"8888 8785 827E 7B77 7574 767B 8085 898D" $"9091 8F8C 8987 878A 8F94 9AA1 A7AA A89E" $"8B70 553D 2710 0208 2347 6D8A 999C 9387" $"7C77 7573 7173 7B84 8B8E 908F 8D8B 8782" $"7F7E 7E7D 7E82 878C 9093 9596 938E 8985" $"8180 8184 8687 8787 8683 807B 7876 7474" $"777C 8288 8D90 9190 8E8A 8887 898D 9298" $"9DA2 A6A4 9B89 7158 402B 170C 1530 506F" $"8796 9890 847B 7674 716F 727A 838B 8F91" $"9291 8E89 8380 807F 7D7E 8186 8C90 9496" $"9694 8F8A 8682 8080 8284 8686 8685 8380" $"7D79 7674 7375 7A80 868C 9193 9391 8E8C" $"8B8B 8E91 959A 9EA1 9F97 8770 543A 2C28" $"2727 2E42 617D 9096 9186 7D78 7674 7272" $"7882 8D94 9592 8C88 8584 8382 807E 7F81" $"868B 8F93 9698 9793 8C86 817E 7F82 8485" $"8585 8483 817E 7B78 7777 787A 7F84 8A8E" $"9191 908E 8B89 898B 8F93 989D A0A1 9B8D" $"7861 4B35 2114 111E 3E66 8598 9D96 8A80" $"7A77 7472 7479 8087 8D91 9291 908E 8A86" $"837F 7C7C 7F85 8A8F 9396 9796 938E 8985" $"8180 8082 8282 8384 8583 817E 7A77 7677" $"7A7F 8489 8E91 9292 8F8D 8B8A 8B8C 9096" $"9B9E 9F9B 8F7B 634B 3626 1B15 1D3A 6182" $"969C 988E 857D 7975 7373 7880 888E 9191" $"8F8D 8D8C 8A86 827F 7D7E 8388 8D91 9596" $"9693 8E89 8582 8182 8282 8283 8484 8381" $"7E7A 7775 7577 7C83 8A8E 9193 928F 8D8C" $"8C8D 8F91 9499 9D9F 9B8E 7A63 4A34 271E" $"1820 3A5E 8096 9E9A 9086 7F7B 7775 7477" $"7E86 8C8F 8F8F 8E8E 8D8B 8782 7E7B 7C81" $"868B 8F93 9697 948F 8A86 8382 8383 8282" $"8282 8282 817F 7C79 7777 797D 8187 8D90" $"9292 8F8C 8B8B 8D8F 9296 9B9E 9F9C 917F" $"6951 3B28 180C 1437 6283 989F 998F 8781" $"7D79 7676 797F 868A 8D8D 8D8E 8F8E 8B87" $"817D 7C7D 8085 8A8E 9294 9492 8E8A 8785" $"8382 8180 8080 8283 8382 807D 7A78 7778" $"7B81 878B 8E90 8F8E 8C8B 8C8D 8E90 9395" $"999B 988F 806C 5640 2E1F 151C 3C64 8599" $"9F99 8F86 7F7A 7875 7578 7F86 8A8C 8C8C" $"8D8E 8D8A 8681 7D7C 7D81 8589 8D91 9393" $"928E 8A87 8583 8280 7F7F 8081 8282 817F" $"7C7A 7777 797C 8187 8C8E 908F 8E8C 8A89" $"8B8D 9193 9598 9996 8E80 6D57 4231 2217" $"1F3F 6687 9A9E 988E 8680 7D7A 7775 787E" $"8489 8C8D 8D8D 8E8D 8A85 817E 7D7E 8084" $"888C 9092 9391 8E8A 8785 8382 8180 8080" $"8182 8281 7F7D 7B79 7979 7C81 878B 8E8E" $"8E8D 8B89 898A 8D91 9597 9999 978F 816E" $"5944 3221 151F 4068 899A 9D97 8E86 807C" $"7876 7679 7F85 8A8D 8D8D 8D8E 8D8A 8581" $"7D7B 7C7F 8488 8C90 9393 918E 8A87 8583" $"8180 7F7F 8081 8283 8280 7E7B 7978 797C" $"8186 8A8D 8E8D 8C8B 8989 8A8C 8F93 9697" $"9897 8F82 715C 4732 1F16 2448 6F8D 9B9D" $"968D 8680 7C79 7878 7A7E 8387 8A8B 8C8D" $"8F8E 8A85 807D 7C7D 8084 888B 8F91 9290" $"8D8A 8785 8381 807F 7F80 8282 8282 807D" $"7B79 7879 7C82 868A 8C8D 8D8B 8A89 8889" $"8C8F 9396 9797 958F 8473 5E49 331D 1326" $"4F77 919B 9A93 8B85 7F7B 7A79 7A7C 7F83" $"8789 8A8C 8E8F 8E89 837E 7C7C 7D80 8488" $"8C8F 9191 8F8D 8A88 8683 807E 7E7F 8082" $"8383 8180 7D7A 7877 797C 8186 8A8B 8C8C" $"8B89 8888 898B 8D91 9496 9694 8F84 7561" $"4A32 1D16 2C56 7B91 9B99 928B 857F 7B79" $"7979 7B7E 8185 888A 8C8E 8F8E 8984 7F7B" $"7A7C 8083 868A 8E91 918F 8D8A 8886 8380" $"7E7D 7E80 8182 8282 807D 7A78 7779 7C81" $"8689 8B8C 8C8B 8988 8889 8A8D 9093 9495" $"948F 8474 6049 301C 1932 5D80 949A 9790" $"8A84 7E7B 7A7A 7A7C 7E81 8487 898B 8E90" $"8E89 847F 7C7C 7D80 8386 8A8E 9191 8F8D" $"8B89 8683 807E 7E7E 8081 8182 817F 7D7A" $"7878 797D 8286 8A8C 8C8C 8B89 8888 898B" $"8E91 9395 9592 8C81 715C 452D 1B1D 3C66" $"8596 9A94 8E88 827D 7B7A 7A7B 7C7E 8184" $"8688 8B8E 908E 8984 7F7D 7D7E 8083 868A" $"8E91 908E 8D8B 8987 837F 7D7D 7E7F 8081" $"8181 7F7C 7A78 7879 7D82 8689 8B8B 8B8A" $"8989 898A 8C8F 9192 9494 938C 806E 5840" $"2818 2147 708B 9798 938D 8781 7D7B 7B7B" $"7C7D 7F81 8386 888B 8F90 8E89 8480 7E7E" $"7F80 8387 8B8E 908F 8E8D 8C8A 8783 807E" $"7E7E 7F80 8181 817F 7D7A 7879 7B7E 8387" $"898A 8B8B 8A89 8989 8A8C 8F91 9394 9390" $"887B 6852 3A23 172C 577B 9199 968F 8A85" $"7F7B 7A7B 7C7D 7E7F 8183 8587 8B8E 8F8D" $"8883 807F 7F80 8183 878B 8E8F 8F8D 8C8C" $"8A87 8380 7E7E 7E7F 7F80 8080 7F7D 7A78" $"797B 8084 8789 8A8A 8A89 8888 898C 8E90" $"9192 9291 8E85 7765 4E35 1E19 3763 8394" $"9894 8D88 837D 7A7B 7C7D 7E7F 8081 8284" $"868A 8D8E 8C88 8381 8080 8081 8488 8C8D" $"8E8D 8C8C 8B89 8683 807F 7E7E 7F7F 8080" $"807F 7C7A 797A 7D81 8587 8889 8A89 8988" $"888A 8C8F 9292 9191 8F8A 7F6F 5942 2A19" $"264F 768D 9897 908A 8580 7C7A 7B7C 7E7F" $"8080 8182 8487 8B8D 8C8A 8683 8281 8181" $"8285 898C 8D8D 8C8C 8C8B 8986 8280 7F7E" $"7E7E 7E7E 7F7F 7D7B 7979 7C80 8486 8889" $"8989 8988 8889 8B8E 9192 9291 8F8C 8579" $"6852 3A24 1C35 5F80 9298 948D 8782 7D7A" $"7B7C 7E80 8080 8181 8283 868A 8C8A 8785" $"8383 8383 8283 868A 8C8D 8C8C 8C8C 8B89" $"8582 807F 7E7E 7E7E 7E7E 7E7D 7A79 7B7E" $"8286 8788 8888 8888 8888 8A8C 8F91 9292" $"9290 8B82 745F 472C 1821 4971 8B98 9891" $"8A85 807B 7A7C 7E7F 8181 8181 8182 8588" $"8A8B 8986 8483 8383 8383 8588 8B8C 8C8B" $"8B8C 8B8A 8784 8280 7F7F 7F7F 7F7E 7E7D" $"7C79 797C 8084 8788 8989 8888 8888 898A" $"8D8F 9091 9191 8D87 7B6A 533A 231D 3761" $"8194 9993 8C86 817D 7A7A 7C7F 8182 8282" $"8181 8285 888A 8987 8584 8484 8483 8486" $"898C 8C8C 8B8B 8C8B 8986 8482 817F 7F7F" $"7E7D 7D7D 7C7A 797A 7E83 8788 8989 8888" $"8787 8889 8C8F 9191 9291 8F8A 8071 5D45" $"2C1A 264E 758E 9997 8F88 837E 7A79 7B7D" $"8183 8382 8281 8182 8587 8887 8584 8485" $"8584 8485 888B 8D8C 8B8B 8B8B 8B89 8684" $"8381 7F7F 7E7D 7D7C 7B7A 7979 7C81 8588" $"898A 8988 8787 8788 8A8D 9091 9291 8F8B" $"847A 6954 391D 1838 6586 979A 938B 857F" $"7A78 797C 7F82 8484 8381 8181 8385 8786" $"8584 8484 8585 8484 8689 8C8C 8A8A 8B8B" $"8B8A 8785 8483 817F 7E7E 7D7D 7C7B 7979" $"7A7F 8387 898A 8A89 8787 8786 888A 8E90" $"9190 908E 887F 715D 4527 152B 5A7E 949B" $"968D 8781 7C79 787A 7D81 8485 8482 8181" $"8284 8686 8483 8384 8585 8585 8688 8A8B" $"8A89 8A8B 8B8A 8886 8584 8280 7E7E 7D7C" $"7C7B 7978 797C 8185 888A 8B8A 8887 8686" $"8789 8D90 9190 8F8D 8A83 7766 5134 1A21" $"4A73 8E9B 9990 8983 7C78 7779 7B7F 8386" $"8683 8181 8183 8585 8483 8384 8586 8686" $"8687 898B 8B8A 898A 8B8B 8987 8686 8583" $"807E 7E7D 7C7B 7977 787B 8084 8789 8B8B" $"8987 8686 8688 8B8E 9090 908E 8B86 7C6C" $"5639 1E1F 426C 8998 9A92 8A84 7D78 7678" $"7A7E 8285 8684 8281 8283 8484 8382 8282" $"8486 8686 8686 888A 8B8A 898A 8A8A 8987" $"8585 8685 817F 7E7D 7C7B 7978 787A 7E82" $"8688 8A8B 8B89 8786 8687 8A8E 9091 918F" $"8C87 7F70 5C41 251C 3761 8296 9B95 8D86" $"7F79 7677 797C 8084 8686 8482 8282 8383" $"8281 8182 8486 8787 8786 888A 8B8B 8A89" $"8A8A 8988 8786 8787 8481 7E7D 7C7B 7977" $"7679 7D81 8587 898B 8B89 8786 8686 898C" $"9091 908F 8C88 8277 644B 2A16 2956 7B92" $"9C98 8F88 817A 7676 787B 7F83 8586 8583" $"8282 8283 8281 8081 8385 8787 8786 8789" $"8B8A 8989 8989 8988 8786 8788 8683 807F" $"7D7B 7977 7677 7B80 8486 888B 8C8B 8887" $"8685 878B 8E90 9190 8E89 8279 6954 3519" $"204A 738E 9C9B 938B 847C 7675 777A 7E82" $"8587 8684 8281 8182 8280 8081 8285 8787" $"8786 8789 8A8B 8A88 8889 8888 8786 8789" $"8885 817F 7D7C 7A78 7677 7A7F 8385 878A" $"8C8C 8A88 8686 878A 8D8F 8F8F 8E8A 837B" $"6D5A 3F22 1B3C 6989 9A9D 968D 867D 7774" $"7679 7D81 8587 8886 8482 8181 8180 7F7F" $"8284 8788 8787 8788 8A8B 8A89 8989 8887" $"8686 8789 8A87 8380 7E7D 7B78 7675 787D" $"8185 8789 8C8C 8A88 8685 8689 8C8E 8F90" $"8F8C 867F 7362 4A2B 182D 5B80 969E 998F" $"8881 7974 7578 7C7F 8487 8887 8583 8181" $"8180 7F7F 8183 8587 8787 8788 8A8C 8B89" $"8988 8887 8685 8689 8B8A 8681 7F7E 7C7A" $"7674 767B 8084 8688 8A8C 8C8B 8987 8687" $"8B8D 8F90 8E8C 8880 7564 4E30 1724 517B" $"939E 9C93 8A83 7A74 7376 7A7E 8286 8888" $"8684 8281 8180 7E7E 8082 8587 8787 8788" $"8A8C 8C8A 8888 8886 8585 8588 8B8B 8783" $"807E 7D7A 7774 7579 7E82 8587 8A8C 8D8C" $"8A88 8686 898C 8E8F 8F8D 8983 796B 573C" $"201C 3F6D 8B9B 9E95 8C85 7D75 7274 787D" $"8185 8889 8885 8280 8080 7F7E 7F81 8486" $"8787 8787 898B 8C8B 8988 8887 8684 8487" $"8B8C 8A84 807F 7E7C 7975 7477 7C81 8486" $"898B 8C8C 8B89 8887 898C 8E8F 8F8E 8A84" $"7B6D 593E 2118 3666 899B 9F98 8F88 7F77" $"7373 777B 8084 8889 8986 8381 8080 7F7E" $"7E80 8486 8787 8787 888B 8C8B 8988 8887" $"8584 8485 898C 8B86 827F 7E7C 7A76 7476" $"7B80 8385 888A 8C8C 8B89 8887 888A 8E90" $"8F8E 8A85 7E72 614A 2D1A 2955 7C95 9F9B" $"928A 8279 7372 757A 7F83 8789 8987 8582" $"8080 7F7E 7E80 8386 8888 8787 888B 8D8C" $"8A88 8887 8685 8485 898C 8C89 8480 7F7D" $"7A77 7575 797E 8285 878A 8C8C 8B8A 8988" $"888A 8D8F 908F 8C88 8177 654E 3016 1D4A" $"7792 9F9E 958C 857C 7573 7478 7D82 8688" $"8988 8683 8180 7F7E 7E7F 8285 8787 8787" $"8889 8C8C 8A88 8888 8685 8484 878B 8D8A" $"8581 7F7E 7C79 7675 787D 8184 8689 8B8B" $"8B8A 8987 8789 8D8F 908F 8D88 8178 6A56" $"3E24 1E3B 6889 9B9E 988F 877F 7672 7376" $"7B80 8588 8A89 8784 8180 7F7E 7E7F 8184" $"8687 8787 8789 8C8D 8B89 8888 8785 8383" $"868A 8D8C 8783 807F 7D7A 7775 777C 8083" $"8588 8A8B 8B8A 8A89 888A 8C8F 9190 8E8A" $"837A 6C58 4026 1A31 6085 9AA0 9A91 8981" $"7873 7375 797E 8387 8A8A 8885 8280 7F7E" $"7D7E 8083 8687 8786 8789 8B8D 8C8A 8888" $"8785 8383 8589 8D8D 8883 807E 7D7B 7876" $"767B 7F82 8486 898B 8B8A 8989 8889 8B8E" $"9091 908C 857D 705E 482E 1A25 4F7A 949F" $"9D94 8B84 7B75 7274 787D 8186 898A 8986" $"8381 807F 7D7E 8082 8587 8786 8788 8A8C" $"8C8A 8887 8786 8584 8487 8C8D 8A85 817F" $"7E7C 7976 777A 7E82 8486 888A 8A8A 8A89" $"8989 8B8E 9191 908D 8880 7564 4E35 1C1C" $"4271 8F9E 9F96 8E87 7E76 7273 777B 8085" $"898B 8987 8381 807F 7E7D 7F82 8487 8786" $"8687 8A8C 8C8B 8988 8786 8584 8486 8A8D" $"8B86 8280 7E7D 7A77 7678 7D81 8385 888A" $"8B8A 8989 8989 8A8D 9091 908F 8B84 7A6B" $"563C 2116 3262 879C A199 9089 8078 7373" $"767A 7F83 878A 8B88 8482 8080 7E7D 7E80" $"8386 8786 8687 898C 8D8C 8987 8786 8585" $"8485 898D 8D88 8380 7F7D 7B77 7678 7D81" $"8384 8789 8B8B 8A89 8889 8A8C 9091 918F" $"8B84 7B6E 5B44 2918 2957 7F97 A09C 928A" $"837A 7473 7579 7D82 868A 8B89 8583 8180" $"7F7E 7E80 8385 8787 8687 888B 8D8C 8A88" $"8787 8685 8485 888C 8D8A 8480 7F7E 7C78" $"7677 7B80 8385 8688 8A8A 8A89 898A 8A8C" $"8F91 9190 8D86 7E71 604A 311B 2048 7692" $"9F9F 958C 857C 7572 7478 7C80 8589 8B89" $"8783 8180 7F7D 7D7F 8285 8787 8686 888B" $"8D8D 8A88 8786 8585 8485 888B 8C8A 8581" $"7F7E 7C79 7777 7A7F 8283 8588 8A8B 8A89" $"8989 898B 8F91 9190 8D88 8074 634E 351C" $"1B40 6F8D 9DA0 978E 877F 7773 7376 7A7E" $"8488 8A8A 8885 8280 807E 7D7E 8184 8787" $"8786 8789 8C8D 8B89 8787 8685 8485 878A" $"8C8B 8782 7F7E 7D7A 7777 7A7E 8284 8587" $"898A 8A89 8989 898B 8E90 9190 8E89 8278" $"6955 3C21 1733 6387 9BA1 9A90 8981 7974" $"7376 797E 8286 898A 8886 8381 807F 7D7E" $"8083 8687 8786 8688 8B8C 8B89 8787 8685" $"8485 8689 8C8C 8883 807E 7D7B 7876 797E" $"8284 8587 898A 8A8A 8989 898A 8C8E 9090" $"8F8A 8379 6C58 4025 182E 5D83 99A0 9B92" $"8B83 7A74 7375 787D 8185 898A 8986 8381" $"807F 7D7D 7F82 8588 8887 8788 8A8C 8C8A" $"8887 8685 8484 8688 8C8D 8A85 817E 7D7B" $"7877 787D 8184 8586 888A 8A89 8989 898A" $"8C8E 9090 8F8C 867C 6F5C 452A 1826 537C" $"95A0 9D94 8C85 7C76 7374 787C 8085 898A" $"8A87 8482 807F 7D7C 7E82 8588 8888 8788" $"8A8C 8D8B 8887 8685 8484 8587 8B8D 8B86" $"827F 7E7C 7977 787C 8183 8485 8789 8A89" $"8989 898A 8C8E 9091 908D 877D 705E 482E" $"1821 4C78 93A0 9E95 8E87 7E76 7374 777B" $"7F84 888A 8A88 8582 807F 7D7D 7E81 8487" $"8888 8788 8A8C 8C8A 8887 8685 8484 8587" $"8B8D 8C88 837F 7E7C 7977 777B 8083 8485" $"8789 8A8A 8989 898A 8B8D 8E90 908E 8880" $"7362 4C32 1A1D 4472 8F9F A096 8E88 7F77" $"7373 767A 7E82 8689 8A88 8683 817F 7D7C" $"7D80 8386 8887 8787 898B 8C8B 8987 8685" $"8484 8486 8A8D 8C88 8480 7E7C 7A78 777A" $"7F83 8585 8688 8989 8989 8989 8B8D 8F90" $"908E 8A82 7767 5136 1A17 3D6D 8D9D A098" $"9089 8178 7373 7579 7E82 8689 8A89 8783" $"817F 7D7C 7D7F 8286 8787 8787 898B 8C8B" $"8988 8785 8483 8385 898C 8D8A 8581 7E7D" $"7B78 7779 7E82 8585 8587 8989 8989 8989" $"8B8C 8E8F 908E 8982 7769 553D 221B 3967" $"899B A099 908A 8279 7472 7478 7D81 8588" $"8A89 8784 817F 7D7C 7C7F 8285 8788 8787" $"888B 8C8C 8A88 8786 8483 8385 888C 8D8B" $"8682 7F7D 7B78 7779 7E83 8585 8688 8A8A" $"8989 8989 8A8B 8D8F 908F 8C85 7A6C 5941" $"2518 3060 859A A19A 928B 847A 7472 7478" $"7C81 8588 8A89 8885 8280 7E7C 7C7E 8285" $"8788 8787 888B 8C8C 8A88 8786 8483 8384" $"878B 8D8C 8883 7F7E 7C79 7778 7D81 8485" $"8587 898A 8989 8989 8B8C 8E8F 8F8E 8B84" $"796C 5B45 2B1B 2C58 7F96 A09C 938D 867D" $"7673 7376 7B80 8487 898A 8885 8280 7E7C" $"7C7E 8185 8788 8887 888A 8C8D 8B89 8786" $"8483 8383 868A 8D8C 8984 807E 7C79 7777" $"7B80 8485 8587 8989 8989 8989 8A8C 8D8E" $"908F 8C87 7D70 5F49 2D18 2450 7A94 A09D" $"948E 877E 7672 7275 7A7F 8387 898A 8886" $"8380 7E7C 7B7D 8184 8788 8887 888A 8C8C" $"8B89 8786 8583 8383 858A 8D8D 8985 817F" $"7D7A 7777 7A80 8385 8587 8889 8989 8989" $"8A8B 8D8E 9090 8E88 7F73 624D 321A 1F47" $"7491 9F9F 968F 887F 7772 7275 797E 8286" $"898A 8987 8481 7E7C 7B7D 8083 8688 8887" $"8789 8C8D 8C89 8786 8583 8282 8589 8D8D" $"8A86 827F 7D7B 7876 797E 8386 8686 8889" $"8988 8888 898A 8C8E 9091 8E89 8176 6753" $"391D 183B 6B8C 9DA0 9890 8A82 7974 7375" $"797E 8286 8889 8987 8481 7F7C 7B7D 8083" $"8687 8787 8789 8B8D 8C89 8786 8583 8282" $"8488 8C8D 8B86 827F 7D7B 7876 787D 8285" $"8686 888A 8A89 8888 898A 8C8E 9091 8F8A" $"8278 6956 3D22 1936 6487 9BA0 9991 8B83" $"7A74 7274 787D 8185 8889 8988 8582 7F7D" $"7B7D 7F82 8587 8887 8789 8B8D 8D8B 8886" $"8584 8382 8388 8C8E 8B87 8380 7E7B 7876" $"777C 8285 8686 8889 8989 8888 8889 8B8D" $"8F91 908C 867C 6E5C 4426 142A 5A81 98A1" $"9C92 8C85 7C75 7374 777C 8185 8789 8987" $"8482 807D 7C7C 7F82 8587 8787 8788 8A8C" $"8D8B 8887 8684 8382 8286 8B8D 8C88 8481" $"7F7C 7976 777C 8184 8686 8789 8989 8888" $"8889 8B8D 8F91 908D 867E 7260 4A2F 1923" $"4E79 939F 9D94 8E87 7E76 7373 767B 7F83" $"8789 8988 8582 807E 7C7C 7E81 8486 8787" $"8788 8A8C 8D8B 8887 8684 8382 8285 8A8D" $"8C88 8481 7F7D 7A76 7679 7F84 8686 8789" $"8A89 8888 8889 8A8C 8F91 918E 8981 7463" $"4E32 191C 4573 909E 9F96 8E89 8078 7473" $"7579 7F83 8789 8988 8583 807E 7D7C 7E81" $"8486 8787 8787 898C 8D8C 8987 8684 8382" $"8285 898D 8D89 8581 7F7D 7A77 7678 7E84" $"8686 8788 8A89 8888 8888 8A8C 8E90 908E" $"8A83 796A 563C 1F17 3867 899C A098 8F8A" $"8279 7473 7579 7E82 8688 8988 8583 817F" $"7D7D 7E80 8385 8787 8687 898B 8D8C 8987" $"8685 8483 8284 888C 8D8A 8682 807E 7B77" $"7578 7D83 8686 8688 8989 8888 8788 898B" $"8E90 908F 8C86 7D70 5D44 2514 2C5B 8298" $"A09A 918B 857B 7573 7478 7D81 8587 8989" $"8683 8180 7E7D 7D7F 8285 8687 8787 888B" $"8D8D 8A87 8685 8382 8283 888C 8D8B 8783" $"817F 7C78 7677 7C81 8586 8788 8A8A 8988" $"8888 888A 8C8F 9190 8D86 7D71 604A 2F1A" $"2651 7A94 9F9C 938D 867D 7673 7477 7C80" $"8487 8989 8784 8280 7E7D 7D7F 8285 8687" $"8786 878A 8C8D 8B88 8685 8483 8283 868B" $"8D8B 8784 817E 7C79 7677 7B80 8586 8688" $"8A8A 8988 8887 8789 8C8F 9190 8D88 8076" $"6753 391E 1C41 6E8D 9E9F 968E 887F 7874" $"7477 7B80 8486 8889 8784 8280 7F7E 7D7F" $"8183 8687 8787 8789 8C8D 8B88 8685 8483" $"8282 868A 8D8C 8884 817F 7D7A 7776 797E" $"8386 8687 898A 8989 8888 898A 8D8F 9090" $"8E89 8176 6751 361D 1C40 6B8A 9C9F 978F" $"8982 7A75 7375 7A7F 8386 8889 8885 8280" $"7F7E 7D7F 8184 8687 8787 8789 8B8D 8B88" $"8685 8483 8382 858A 8D8D 8985 817F 7D7B" $"7776 787E 8386 8687 888A 8A89 8887 8788" $"8B8E 9090 8F8B 847C 6F5D 4527 162B 5A80" $"97A0 9B91 8B84 7B75 7375 797E 8286 8889" $"8885 8280 7F7E 7E7E 8082 8587 8786 8688" $"8B8D 8C89 8786 8583 8383 8489 8D8D 8A86" $"8280 7E7B 7876 777C 8185 8686 888A 8A89" $"8887 8788 8A8E 9091 908D 877F 725F 4627" $"1225 557E 96A0 9C92 8C85 7D77 7475 787D" $"8185 8789 8986 8381 807E 7D7E 8082 8587" $"8787 8788 8A8C 8C89 8785 8584 8382 8488" $"8C8E 8B87 8380 7E7C 7976 767B 8185 8687" $"888A 8A89 8988 8888 8A8D 8F90 8F8D 8880" $"7463 4D33 1D23 4B75 909E 9D94 8C87 7E77" $"7475 777C 8084 8789 8987 8481 7F7E 7D7D" $"7F81 8486 8787 8687 898C 8D8A 8785 8584" $"8383 8487 8B8E 8C87 8380 7E7C 7976 767A" $"8084 8687 8889 8A89 8887 8786 888C 8F91" $"918F 8C85 7B6D 583D 1E15 3767 889B 9F97" $"8F89 827A 7574 777B 7F83 8688 8987 8482" $"807F 7E7D 7E80 8385 8787 8787 898B 8D8B" $"8785 8584 8382 8386 8A8D 8D89 8581 7F7D" $"7A77 7678 7D82 8586 8788 8A89 8988 8787" $"888B 8E90 908F 8C85 7C6F 5B40 2317 3360" $"8499 A099 8F8A 837B 7573 7579 7E82 8588" $"8988 8582 807F 7E7D 7E80 8285 8787 8787" $"888B 8D8C 8885 8483 8383 8385 898D 8D8A" $"8582 807E 7B77 7577 7C81 8486 8789 8B8B" $"8988 8686 8789 8D90 9190 8D88 8075 654E" $"3119 214A 7692 9F9C 938B 867D 7673 7478" $"7D81 8587 8989 8683 817F 7E7D 7D7F 8184" $"8687 8787 888B 8D8C 8986 8584 8383 8384" $"888C 8E8B 8783 807E 7C78 7575 7A80 8385" $"8688 8A8A 8988 8787 8789 8C8F 9090 8E8A" $"847A 6B56 3919 163E 6E8C 9C9E 958D 8880" $"7975 7577 7B7F 8387 8989 8783 8180 7F7E" $"7E7F 8184 8687 8787 8889 8C8D 8A86 8584" $"8383 8384 878B 8D8C 8884 817F 7D7A 7675" $"797E 8285 8688 8B8C 8B89 8887 8788 8B8E" $"8F90 8E8B 857B 6D59 3F24 1C38 6587 9A9F" $"978F 8982 7A75 7476 7A7F 8386 898A 8884" $"8180 7F7E 7E7E 8083 8687 8787 8789 8C8D" $"8B87 8584 8483 8383 868A 8E8D 8985 817F" $"7D79 7675 787D 8284 8687 8A8B 8A89 8785" $"8586 898D 9091 908D 8883 7969 5334 171C" $"4977 929E 9C93 8B85 7D76 7475 797D 8185" $"8789 8885 8280 7F7F 7E7E 7F81 8486 8786" $"8788 8B8D 8C88 8584 8382 8283 8589 8D8D" $"8A86 8280 7F7C 7875 767A 8083 8586 888A" $"8A89 8887 8687 898C 8F8F 8F8D 8A84 7C6D" $"5638 1917 4171 8F9D 9E94 8C87 8078 7474" $"777B 8084 8789 8886 8280 807F 7E7E 7F81" $"8486 8787 8787 8A8C 8C89 8584 8382 8283" $"8488 8C8D 8B87 8380 7E7C 7875 7579 7E82" $"8486 898B 8B8A 8987 8686 878A 8D8F 8F8D" $"8A86 7F73 6047 2818 305F 8398 9F98 8F89" $"827A 7473 767B 8084 8789 8986 8381 807F" $"7F7E 7E80 8285 8787 8686 888C 8D8B 8785" $"8483 8383 8487 8B8D 8C88 8481 7F7D 7A76" $"7577 7C80 8385 8789 8B8A 8987 8786 8789" $"8C8E 8F8F 8D88 8379 6952 3216 1F4E 7993" $"9F9B 918A 857D 7774 7679 7E82 8588 8987" $"8482 8080 807F 7E80 8284 8687 8687 888A" $"8D8C 8885 8483 8383 8485 898D 8C89 8581" $"807E 7C79 7576 7B80 8384 8689 8B8B 8A88" $"8786 8688 8B8D 8D8D 8D8B 867E 6E58 3A1A" $"1A42 708E 9E9E 948C 8780 7874 7578 7C80" $"8487 8988 8582 8080 807F 7E7F 8184 8788" $"8787 888A 8C8C 8986 8483 8383 8485 888C" $"8D8A 8682 807F 7C79 7575 797E 8283 8588" $"8B8B 8A89 8887 8788 8B8D 8D8D 8D8B 8780" $"735F 4523 1533 6486 9A9F 988E 8982 7974" $"7477 7B80 8487 8988 8583 8180 807F 7E7F" $"8083 8687 8786 8688 8B8C 8A87 8584 8383" $"8485 888C 8E8C 8783 807F 7D7A 7675 787D" $"8183 8587 898B 8A88 8787 8687 8A8C 8E8E" $"8E8C 8883 7866 4D2A 1326 567F 969F 9A91" $"8A83 7C76 7476 7A7E 8286 8888 8684 8180" $"807F 7E7E 8083 8587 8786 8687 8A8C 8A87" $"8584 8383 8484 8689 8D8C 8884 817F 7D7B" $"7775 777C 8083 8485 888A 8A89 8887 8787" $"898D 8E8E 8D8B 8883 7A6B 5436 1B20 4974" $"909D 9C93 8C86 7E77 7475 787D 8185 8889" $"8885 8280 807F 7D7D 7F81 8587 8787 8687" $"8A8C 8C89 8584 8382 8384 8589 8C8D 8A85" $"8280 7E7C 7876 767A 7F81 8385 888A 8B8A" $"8887 8687 888C 8E8E 8E8D 8A86 7F73 5F43" $"2216 3767 889B 9F96 8E88 8179 7474 777B" $"7F83 8789 8886 8381 8080 7E7D 7E80 8486" $"8787 8687 898B 8C89 8684 8483 8384 8588" $"8C8E 8B87 8380 7F7D 7A77 7679 7E81 8385" $"8789 8A8A 8887 8686 878A 8E90 908E 8B86" $"8176 654D 2C16 2A59 7F96 9F9B 9189 837B" $"7573 767A 7E82 8689 8987 8481 8080 7F7D" $"7E80 8386 8787 8787 888A 8C8A 8785 8483" $"8383 8486 8A8E 8D88 8481 7F7D 7B77 7577" $"7C80 8284 8689 8B8A 8987 8685 8689 8D8F" $"8F8F 8D8A 857D 6F59 3A1A 1942 718E 9E9E" $"948C 857D 7774 7578 7D81 8588 8988 8682" $"8080 7F7D 7D7F 8185 8787 8686 878A 8C8C" $"8986 8483 8283 8485 898D 8E8B 8682 807F" $"7C78 7576 7A7E 8283 8588 8A8B 8988 8786" $"8688 8B8E 8F8E 8D8B 8881 7561 4421 1334" $"6587 9A9F 978E 8881 7974 7477 7B7F 8387" $"8989 8683 8180 807E 7D7E 8183 8687 8787" $"8789 8B8C 8A86 8483 8383 8384 878C 8E8B" $"8682 807F 7D79 7675 787D 8183 8487 8A8B" $"8A88 8786 8687 8A8D 8F8F 8D8B 8782 7969" $"5130 1725 537C 949F 9B92 8A83 7B75 7275" $"797E 8286 8989 8784 8180 807F 7D7E 8083" $"8587 8786 8688 8B8C 8B87 8584 8383 8484" $"868A 8D8C 8883 807F 7D7B 7775 777B 7F82" $"8486 898A 8A89 8787 8687 898D 8E8E 8E8D" $"8A87 7F70 5A3C 1C18 3F6E 8C9D 9F95 8C85" $"7E77 7374 787C 8185 8889 8885 8280 8080" $"7E7E 7F81 8486 8786 8687 898C 8C89 8584" $"8383 8384 8689 8C8D 8A85 8280 7E7C 7976" $"7679 7E81 8385 888A 8A89 8887 8686 888B" $"8E8E 8E8D 8B89 8376 6246 2313 2F62 8599" $"A099 8F88 817A 7474 777B 7F83 8789 8987" $"8381 8080 7F7E 7F81 8386 8787 8687 888B" $"8C8A 8684 8483 8384 8587 8B8D 8B86 8280" $"7F7C 7976 7578 7D80 8284 888A 8B8A 8987" $"8686 878B 8E8F 8D8C 8A88 847B 6A51 3015" $"2452 7B93 9F9C 918A 837B 7573 757A 7E82" $"8689 8987 8481 8080 7F7E 7E80 8285 8787" $"8686 888A 8C8A 8785 8483 8384 8587 8B8D" $"8C88 8380 7F7D 7B78 7677 7B7F 8183 8689" $"8B8B 8988 8786 8789 8C8E 8D8D 8D8B 877F" $"705A 3E1F 193D 6C8B 9D9F 968D 867F 7873" $"7477 7C81 8588 8988 8682 8080 7F7E 7E7F" $"8284 8687 8786 8789 8C8C 8986 8483 8384" $"8586 898C 8D8A 8581 807E 7C79 7777 7A7E" $"8183 8588 8A8A 8A89 8887 8688 8C8E 8E8D" $"8D8B 8881 7460 4525 142F 6185 99A0 998F" $"8881 7A74 7476 7A7F 8487 8988 8684 8180" $"807E 7D7E 8183 8687 8786 8688 8B8C 8986" $"8584 8383 8485 878B 8D8B 8682 807E 7C7A" $"7776 787C 8082 8487 8A8B 8A89 8887 8687" $"8A8D 8E8E 8E8C 8A85 7A69 5131 1621 4F78" $"92A0 9D92 8A83 7C75 7375 797E 8286 8989" $"8785 8180 807F 7D7E 8083 8587 8786 8687" $"8A8C 8B87 8584 8383 8485 878A 8D8D 8884" $"807E 7D7B 7876 777B 7F81 8386 888A 8A89" $"8887 8686 898C 8E8E 8E8E 8B86 7E6E 583B" $"1B18 406F 8E9F A096 8C86 7F78 7374 787C" $"8085 8889 8886 8280 8080 7E7E 7F81 8486" $"8786 8687 898B 8B88 8685 8483 8485 8688" $"8C8D 8A85 817F 7E7C 7977 777A 7E81 8385" $"888A 8B8A 8988 8786 898D 8F8E 8D8C 8A87" $"8173 5E42 2115 3666 879C A198 8E88 8179" $"7473 767B 7F84 8889 8987 8381 807F 7E7D" $"7E80 8486 8787 8687 888B 8C89 8685 8483" $"8384 8588 8C8E 8B86 8280 7E7C 7A77 7679" $"7D80 8285 8789 8B8A 8988 8786 878B 8E8F" $"8E8E 8C89 8478 654B 2A14 2757 7F97 A09B" $"918A 837B 7573 7579 7D82 8689 8988 8481" $"807F 7E7D 7D80 8385 8787 8686 888A 8B8A" $"8785 8483 8384 8586 8A8E 8D88 8380 7F7D" $"7B78 7678 7C80 8283 8688 8A8A 8988 8787" $"888B 8E8F 8E8E 8C88 8379 6950 3015 2150" $"7B94 A09D 938C 857D 7572 7478 7C81 8588" $"8988 8682 8080 7F7D 7D7F 8285 8787 8786" $"8789 8B8B 8885 8483 8384 8486 888C 8D8A" $"8480 7E7D 7B78 7677 7B7F 8283 8588 8A8A" $"8A89 8887 8789 8D8E 8E8D 8C89 847C 6E58" $"3A1C 1D45 718D 9E9F 958D 867F 7772 7377" $"7B80 8488 8989 8784 817F 7F7D 7C7E 8083" $"8688 8786 8789 8B8C 8986 8584 8384 8485" $"878B 8D8B 8682 7F7E 7C79 7777 7A7E 8183" $"8487 898A 8A89 8787 8789 8C8E 8E8E 8E8B" $"8680 725D 4121 1738 6888 9BA0 988F 8982" $"7973 7376 7A7E 8387 8989 8885 817F 7F7D" $"7C7D 8083 8688 8887 8788 8A8C 8A87 8584" $"8383 8484 868A 8D8D 8984 807F 7D7A 7876" $"797D 8183 8486 898A 8A89 8887 8687 8A8D" $"8F8F 8F8C 8781 7664 4A27 132C 5E82 98A1" $"9C91 8A83 7A74 7275 797D 8286 898A 8886" $"8280 7F7E 7C7D 7F82 8688 8887 8688 8A8C" $"8B87 8584 8383 8384 8589 8D8E 8A85 817F" $"7D7B 7776 787C 8082 8385 888A 8A89 8888" $"8787 8A8E 908F 8E8B 8682 7A6B 5433 1822" $"4F79 939F 9D94 8C85 7D75 7274 787C 8185" $"888A 8987 8380 7F7E 7C7C 7E81 8487 8887" $"8787 898B 8C89 8685 8483 8384 8588 8C8E" $"8B86 827F 7D7C 7976 777A 7E81 8385 8789" $"8989 8988 8888 8A8D 8E8E 8E8D 8A85 7D6D" $"5535 161B 4975 909F 9E95 8D87 7F77 7273" $"777B 8084 8789 8A88 8481 7F7E 7C7C 7E81" $"8487 8887 8686 888B 8C89 8785 8483 8383" $"8386 8A8E 8D87 827F 7E7C 7976 767A 7E81" $"8384 8789 8A89 8988 8887 888B 8D8E 8E8D" $"8A86 7E71 5C3F 1E19 3E6C 8B9D A097 8F88" $"8077 7272 757A 7F83 8789 8A88 8682 7F7E" $"7C7B 7D7F 8386 8887 8687 888B 8C8A 8785" $"8483 8383 8385 8A8D 8D89 8480 7E7D 7A76" $"7578 7E81 8384 8789 8A8A 8988 8888 898B" $"8E8E 8E8D 8B86 7E71 5C3E 1D17 3B6A 8A9C" $"A098 908A 8279 7372 7479 7E82 8688 8A89" $"8682 807E 7C7B 7C7E 8286 8888 8787 888A" $"8B8A 8886 8584 8383 8385 898D 8E8A 8581" $"7E7D 7B77 7578 7D81 8384 8689 8A8A 8989" $"8888 888A 8C8D 8E8E 8B86 7F74 6248 2819" $"3360 8398 A09A 928B 847A 7472 7478 7E82" $"8588 8A89 8784 807F 7D7B 7C7E 8185 8888" $"8786 888A 8C8B 8886 8584 8383 8384 888C" $"8E8B 8682 7F7E 7B78 7678 7D81 8384 8587" $"8989 8989 8888 898B 8C8D 8E8E 8C88 8174" $"6247 271A 3360 8398 9F9A 928C 857C 7572" $"7478 7C81 8587 8989 8784 817F 7D7B 7B7D" $"8084 8788 8786 8789 8B8B 8987 8584 8382" $"8283 868C 8E8C 8883 807E 7C79 7778 7C80" $"8384 8587 8989 8989 8888 8889 8C8E 8E8E" $"8C87 8075 654C 2D1C 305B 7F95 9F9B 938C" $"857D 7572 7477 7C80 8487 8989 8785 817F" $"7D7B 7B7D 8083 8788 8786 8789 8A8B 8987" $"8584 8382 8282 858A 8D8C 8884 807E 7C79" $"7677 7C80 8384 8486 8888 8888 8887 8889" $"8B8D 8F8F 8C87 8177 6953 331B 2A56 7C92" $"9E9B 928C 877E 7774 7477 7B80 8486 8889" $"8885 8280 7D7B 7B7C 7F83 8688 8786 8688" $"8A8B 8987 8584 8382 8182 8488 8C8C 8985" $"817F 7D7A 7877 7A7F 8284 8485 8788 8888" $"8787 8788 898B 8C8D 8C88 837A 6D5A 3D24" $"2A4F 768E 9C9C 938D 8780 7874 7476 7B7F" $"8385 8788 8886 8280 7D7B 7B7C 7F82 8687" $"8786 8688 8A8B 8987 8585 8382 8181 8387" $"8B8C 8A86 8280 7E7B 7877 7A7E 8284 8485" $"8788 8888 8887 8788 898B 8D8E 8D89 827A" $"6D5B 4127 294D 748C 9B9C 938D 8881 7974" $"7476 7A7E 8285 8789 8886 8380 7E7C 7B7C" $"7E81 8587 8786 8687 8A8B 8A88 8685 8382" $"8180 8286 8A8C 8A87 8380 7E7B 7877 797E" $"8284 8485 8688 8887 8787 8788 898A 8C8D" $"8C89 857E 7262 492C 2746 6E89 989C 958D" $"8882 7A75 7476 7A7E 8284 8688 8887 8381" $"7F7C 7B7C 7E80 8486 8686 8687 898B 8A88" $"8685 8382 8180 8185 8A8C 8A87 8381 7F7C" $"7977 787D 8184 8484 8687 8787 8787 8787" $"8889 8B8C 8C8A 857F 7565 4D2F 2643 6B86" $"979A 938D 8983 7C76 7476 797D 8184 8688" $"8886 8381 7F7D 7B7C 7E80 8386 8685 8586" $"888A 8A88 8684 8381 8080 8185 898B 8987" $"8481 7F7D 7A77 787C 8083 8484 8587 8787" $"8787 8687 8889 8A8B 8B89 857F 7566 5137" $"2D43 6884 9499 948D 8984 7C76 7576 797D" $"8183 8586 8786 8381 7F7D 7B7C 7D80 8385" $"8685 8586 888A 8A88 8685 8482 8180 8083" $"888A 8987 8481 7F7D 7A78 797C 8083 8484" $"8586 8787 8787 8686 888A 8A8C 8C89 847F" $"776A 563D 2E3F 6481 9299 958E 8A85 7D77" $"7576 797C 8083 8586 8786 8481 7F7D 7C7C" $"7D7F 8385 8585 8586 8789 8A88 8684 8482" $"8180 8083 878A 8A87 8482 807E 7B79 787B" $"7F83 8484 8586 8787 8686 8686 8889 8A8B" $"8B8A 8781 796C 5940 2F3D 607E 9098 958E" $"8A85 7F79 7676 787C 8083 8586 8786 8482" $"807E 7C7C 7D80 8284 8685 8585 8789 8988" $"8684 8482 8180 8082 8689 8987 8582 807E" $"7C79 787B 7F82 8484 8586 8686 8686 8686" $"8788 898A 8B8A 8883 7B6F 5F47 3238 5A7A" $"8D96 968F 8A86 807A 7676 787B 7F83 8486" $"8786 8482 807E 7C7C 7D7F 8284 8585 8485" $"8688 8988 8684 8483 817F 7F81 8589 8987" $"8582 807E 7C79 787A 7E82 8484 8486 8787" $"8686 8585 8688 898A 8A89 8681 7A70 624C" $"373B 5A78 8B96 968F 8986 807A 7776 787C" $"7F82 8485 8686 8582 807E 7D7C 7D7F 8183" $"8585 8484 8688 8988 8684 8483 8180 7F81" $"8488 8987 8583 817F 7C7A 797A 7E82 8384" $"8485 8686 8686 8585 8687 8889 8A8A 8883" $"7D73 6651 3C3A 5473 8793 958F 8A87 817B" $"7777 787B 7F82 8485 8686 8582 807F 7D7C" $"7D7E 8183 8484 8484 8587 8988 8684 8383" $"8180 7F80 8387 8988 8583 817F 7D7A 797A" $"7D81 8383 8485 8686 8686 8585 8687 8889" $"8989 8783 7E76 6956 3F3A 5271 8592 948F" $"8A87 837C 7877 797B 7E81 8384 8586 8582" $"817F 7D7C 7D7E 8082 8484 8484 8587 8888" $"8684 8382 8180 7F80 8387 8887 8583 8180" $"7E7B 797A 7D81 8383 8484 8586 8685 8585" $"8586 8788 8989 8784 7F77 6C5B 473E 506D" $"838F 9490 8A87 837E 7977 787B 7E81 8384" $"8586 8582 807F 7E7D 7D7E 8082 8484 8484" $"8586 8888 8684 8383 8281 8080 8286 8887" $"8583 8180 7E7C 7A7A 7D80 8283 8384 8586" $"8585 8584 8586 8788 8989 8784 817A 7162" $"4D3E 4A68 7F8D 9391 8B87 837E 7A78 787B" $"7D81 8384 8585 8583 817F 7E7D 7D7E 8082" $"8384 8484 8486 8788 8684 8383 8281 7F7F" $"8185 8887 8583 8281 7F7C 7A7A 7C80 8283" $"8384 8485 8685 8585 8585 8687 8888 8784" $"8079 7063 5042 4D68 7E8C 9290 8B87 847F" $"7A78 787A 7D80 8284 8485 8583 817F 7E7D" $"7D7E 8081 8384 8483 8485 8788 8785 8383" $"8280 7F7F 8184 8787 8583 8181 7F7D 7A7A" $"7C7F 8183 8384 8585 8585 8585 8485 8687" $"8788 8785 827D 7467 5544 4A63 7A89 9190" $"8B87 847F 7B78 787A 7D80 8283 8485 8583" $"817F 7E7D 7D7E 7F81 8283 8383 8385 8687" $"8685 8382 8281 807F 8083 8687 8583 8281" $"7F7D 7B7A 7B7E 8183 8383 8485 8585 8584" $"8484 8586 8788 8785 827D 756A 5847 4A62" $"7988 9090 8B87 8580 7C79 797A 7D80 8283" $"8484 8483 8180 7F7E 7D7E 7F81 8283 8383" $"8384 8687 8685 8382 8281 807F 8083 8687" $"8583 8181 807E 7C7A 7B7F 8182 8383 8485" $"8585 8484 8484 8586 8687 8785 817D 766B" $"5C4D 4E61 7786 8E8F 8B87 8581 7C79 797A" $"7D7F 8183 8484 8483 8180 7F7E 7D7E 7F81" $"8283 8383 8384 8586 8685 8382 8281 807F" $"8082 8587 8583 8180 807E 7C7B 7C7E 8182" $"8383 8484 8585 8584 8484 8585 8686 8684" $"827E 7970 6252 4D5D 7383 8C8F 8C88 8581" $"7D7A 7A7B 7C7F 8182 8384 8483 8280 7F7E" $"7E7E 7F80 8283 8383 8384 8586 8685 8383" $"8281 807F 7F82 8586 8684 8280 807F 7D7B" $"7B7D 8082 8282 8384 8484 8484 8484 8485" $"8687 8685 827E 7870 6354 4F5F 7483 8C8E" $"8B87 8582 7E7B 7A7A 7C7E 8182 8384 8483" $"8280 7F7E 7E7E 7F80 8182 8383 8383 8485" $"8685 8382 8281 807F 7F81 8486 8584 8281" $"807F 7D7B 7C7E 8081 8282 8384 8484 8484" $"8383 8485 8586 8685 827F 7B73 685A 515B" $"707F 898D 8B87 8582 7F7B 7A7A 7C7E 8082" $"8383 8483 8280 7F7E 7D7E 7F80 8182 8383" $"8283 8485 8685 8382 8281 807F 7F81 8486" $"8584 8281 807F 7D7C 7B7D 7F81 8282 8283" $"8484 8484 8484 8484 8485 8685 8380 7C74" $"695B 535C 707F 888D 8B87 8582 7F7C 7A7B" $"7C7E 8081 8283 8383 8280 7F7E 7E7E 7F80" $"8182 8383 8283 8384 8585 8382 8281 807F" $"7F81 8385 8584 8281 807F 7E7C 7C7D 7F81" $"8282 8283 8484 8483 8383 8383 8485 8585" $"8381 7D77 6F61 555A 6D7C 868C 8B87 8583" $"7F7C 7B7B 7C7E 8081 8283 8383 8281 7F7E" $"7E7E 7F7F 8182 8282 8282 8384 8584 8382" $"8281 8080 7F80 8284 8584 8281 807F 7E7D" $"7C7D 7F81 8282 8283 8383 8383 8383 8384" $"8485 8584 8381 7E79 7165 5B5C 6B7A 858A" $"8B87 8583 807D 7B7B 7C7E 7F81 8283 8383" $"8281 807F 7E7E 7F7F 8081 8282 8282 8384" $"8584 8382 8281 8080 7F80 8284 8584 8281" $"8080 7F7D 7C7D 7E80 8182 8282 8383 8383" $"8382 8283 8484 8585 8381 7F7B 746A 5E5B" $"6878 8389 8B88 8583 807D 7C7B 7C7D 7F81" $"8282 8383 8281 807F 7E7E 7F7F 8081 8282" $"8282 8283 8484 8382 8181 8080 7F80 8183" $"8483 8281 8080 7F7D 7C7C 7E80 8181 8282" $"8383 8383 8282 8283 8384 8484 8381 7F7C" $"766E 625D 6776 8187 8A88 8583 817E 7C7C" $"7C7D 7F80 8182 8283 8281 807F 7E7E 7E7F" $"8081 8182 8282 8283 8484 8382 8181 8080" $"7F7F 8183 8483 8281 8080 7F7E 7C7C 7E80" $"8181 8182 8283 8382 8282 8283 8383 8484" $"8382 807D 7870 6660 6674 7F86 8988 8583" $"817F 7D7C 7C7D 7F80 8182 8282 8281 807F" $"7F7E 7F7F 8080 8182 8281 8282 8384 8382" $"8181 8080 7F7F 8182 8383 8281 8080 7F7E" $"7D7D 7E7F 8181 8182 8282 8282 8282 8282" $"8383 8383 8382 807D 7972 6A63 6774 7F85" $"8887 8583 817F 7D7C 7C7D 7E80 8181 8282" $"8281 807F 7F7E 7F7F 8080 8181 8181 8182" $"8383 8382 8181 8080 7F7F 8082 8383 8281" $"8080 7F7E 7D7D 7E7F 8081 8181 8282 8282" $"8282 8282 8283 8383 8382 817F 7B75 6E66" $"6772 7D83 8787 8583 8280 7E7D 7D7D 7E80" $"8181 8282 8281 8080 7F7F 7F7F 8080 8181" $"8181 8182 8283 8382 8181 8180 807F 8081" $"8383 8281 8080 7F7F 7E7D 7E7F 8081 8181" $"8182 8282 8281 8182 8282 8283 8382 817F" $"7D78 7169 6870 7B82 8687 8583 8280 7E7D" $"7D7D 7E7F 8081 8182 8181 8080 7F7F 7F7F" $"7F80 8181 8181 8181 8283 8281 8181 8080" $"807F 8081 8282 8281 8080 807F 7E7D 7E7F" $"8080 8181 8182 8282 8281 8181 8282 8282" $"8281 817F 7D7A 756E 6B70 7980 8486 8583" $"8280 7E7D 7D7D 7E7F 8081 8181 8181 8080" $"7F7F 7F7F 7F80 8081 8181 8181 8182 8282" $"8181 8080 807F 8081 8282 8281 8080 807F" $"7E7E 7E7F 8080 8081 8181 8181 8181 8181" $"8182 8282 8282 8180 7E7B 7771 6D70 797F" $"8385 8483 8280 7F7E 7D7E 7E7F 8080 8181" $"8181 8080 7F7F 7F7F 7F80 8080 8181 8181" $"8182 8281 8181 8080 8080 8080 8182 8281" $"8080 807F 7F7E 7E7F 8080 8080 8181 8181" $"8181 8181 8181 8182 8281 8180 7F7D 7974" $"7072 787E 8284 8483 8281 7F7E 7E7E 7E7F" $"8080 8181 8181 8080 7F7F 7F7F 7F80 8080" $"8181 8080 8181 8181 8180 8080 8080 8080" $"8181 8181 8080 807F 7F7E 7E7F 7F80 8080" $"8081 8181 8181 8181 8181 8181 8181 8180" $"7F7E 7B77 7372 777D 8183 8482 8181 807F" $"7E7E 7E7F 7F80 8081 8181 8080 7F7F 7F7F" $"7F80 8080 8080 8080 8181 8181 8180 8080" $"8080 8080 8081 8181 8080 807F 7F7F 7E7F" $"8080 8080 8080 8181 8181 8080 8081 8181" $"8181 8180 807E 7D7A 7674 777C 8082 8382" $"8181 807F 7E7E 7E7F 7F80 8080 8080 8080" $"807F 7F7F 7F7F 8080 8080 8080 8081 8181" $"8080 8080 8080 8080 8081 8181 8080 8080" $"7F7F 7F7F 7F80 8080 8080 8080 8080 8080" $"8080 8181 8181 8180 807F 7E7C 7877 787C" $"7F81 8282 8180 807F 7F7F 7F7F 7F80 8080" $"8080 8080 807F 7F7F 7F7F 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 7F7F 7F7F 7F80 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 807F 7E7D" $"7C7A 7A7C 7F80 8181 8180 807F 7F7F 7F7F" $"7F80 8080 8080 8080 807F 7F7F 7F7F 7F80" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 7F7F 7F7F 7F7F 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 7F7F 7E7C 7C7D 7F80 8081 8080 8080" $"7F7F 7F7F 7F7F 8080 8080 8080 8080 7F7F" $"7F7F 7F80 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 7F7F 7F7F" $"7F7F 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 7F7F 7F7F 7F7F 7F80 8080" $"8080 8080 7F7F 7F7F 7F7F 8080 8080 8080" $"8080 807F 7F80 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080" } }; resource 'snd ' (25709, "Bell", purgeable) { FormatOne { { /* array Synthesizers: 1 elements */ /* [1] */ sampledSynth, 160 } }, { /* array SoundCmnds: 1 elements */ /* [1] */ hasData, bufferCmd { 20 } }, { /* array DataTables: 1 elements */ /* [1] */ 16918, Rate22K, 16916, 16917, 0x0, 0x3C, $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 7F80 8080 807F 8080 7F7F 7E7E 8081" $"8383 7D7D 7E79 7B86 8B85 7D77 737B 8080" $"878F 786C 7F7C 7E80 8687 7F7E 6E78 8979" $"778A 9478 6686 7D6C 8B94 8671 727D 7881" $"7F7E 887B 7888 8377 7471 798B 857F 9684" $"5567 857F 8EA4 876B 7665 5488 AC8F 7D80" $"8064 5176 9D9C 8A8E 8661 5D64 70A8 A078" $"9587 4F4D 869B 8297 8C79 7A50 689B 817F" $"A08B 5A74 8C61 7B9D 787E 9770 6B8E 7968" $"888C 768A 8B6A 7F82 6C80 847C 8B89 6876" $"996E 5F96 9279 807D 7E80 6964 96A5 7173" $"8D74 686D 839A 8E7E 7D77 6570 937F 7B9C" $"7C6A 7C78 7486 8C79 828B 7173 8878 7688" $"867E 7480 847B 7C73 8A8A 6B7A 8F85 6B78" $"9776 698E 9177 717C 7979 8B80 8898 7162" $"777C 7489 A48C 717A 6760 7F88 9398 9271" $"5F7B 6967 9AA8 8675 8477 5669 8E99 977E" $"7B80 6C62 768F 958E 7F71 7780 6874 9B91" $"7C77 7F7B 6C7B 8981 7E87 8A6E 7293 7567" $"8F92 7177 917B 7182 7775 9187 6E87 9673" $"607D 917C 7883 8E8B 6964 8694 7573 958F" $"7270 7B79 8387 7683 9575 6787 856D 819B" $"756B 9282 677D 8B80 7C7E 7E7D 8B73 6C99" $"866A 768D 876B 7E86 8187 7375 8D7C 6D88" $"917A 728D 7F63 7F85 7F8E 817C 7D79 7070" $"8D89 808D 7D74 7371 8285 8085 9082 6770" $"8480 7D86 8785 796D 7885 817F 8984 7778" $"7679 8B88 7480 8E70 6789 887E 877E 747E" $"836F 7A99 8176 7D73 7E7D 788B 9078 6C88" $"805F 8C98 7A84 8171 7282 7A7B 9589 707D" $"7F75 7878 9392 6B78 947C 5E7E 9877 788E" $"7A7E 7C75 827F 7F82 847A 7B86 6F7C 906C" $"7A9E 7E64 8C90 5E78 9779 7B8C 7C77 7A71" $"808E 7C79 917C 6F89 7E6E 8688 7480 8679" $"7C88 7775 8C7F 7781 8586 7876 847F 7377" $"8D88 7A88 7C72 837A 6E8A 9E7F 677F 8871" $"727C 939A 7569 7F8D 7469 8E9A 856F 698A" $"8668 7A9F 9965 6A8E 7B6E 8392 8E75 7183" $"7774 8994 8070 877B 6F86 7C87 9778 6C83" $"8863 7BA4 7E79 8876 737B 7588 9B7D 7092" $"8057 8898 6B7C 9781 6F7F 8584 7C66 84A4" $"7064 9F98 6263 868B 8675 7AA8 894B 70A0" $"7F6A 8C9A 8273 6778 9873 6DA2 966A 6D87" $"7E73 8387 8D83 6E81 846D 7D95 8376 8385" $"7B75 7782 9075 6F99 866C 8680 7180 867A" $"8B94 6A71 8E71 6E93 927F 8376 6D82 847C" $"8C91 7775 7D6F 7C8D 8485 8A7B 7180 7C73" $"8B92 847A 7378 7C77 7B97 9671 7880 6F74" $"888F 9088 6E69 867E 658E A987 6C71 8076" $"7288 918F 8170 7276 7E7F 8697 8676 7875" $"7782 8586 8B86 6F75 886F 7B9B 7E6B 8A8C" $"6F74 8E83 7A8A 7877 8C75 6C84 948A 7679" $"8379 767B 8C8F 7771 8585 7578 8F8C 6777" $"957F 7886 7E71 7B87 7B8B 996F 6E83 7374" $"8F94 7B79 8675 6C7E 8990 8274 8587 7166" $"8598 8073 888F 716C 7B84 8E86 7581 8F74" $"618B 946F 7C91 7E73 877F 7383 8278 7D8E" $"857F 7970 7E80 7C8A 9081 7877 7973 828F" $"7C89 8C6B 6887 8C6E 83A5 7A68 857E 6674" $"9D91 7E86 7773 706B 8BA6 8D73 7A84 7460" $"7D8F 8F95 7379 8963 6690 A27C 7496 7C59" $"7296 8874 7A8E 8678 827B 7B76 6D83 9C8F" $"6B7B 8761 668F 9F8C 7D7B 7376 6C75 9D91" $"817C 7C6B 6888 8185 9088 7C6C 7B7B 6B8D" $"987C 7A8C 795F 7E8C 7686 9879 6D8A 7B6C" $"8384 7984 917F 7681 7275 8273 90A2 7462" $"8485 6277 A395 7B7C 736D 7A76 7D96 937B" $"7C8F 664D 8CA2 8583 9180 595E 7A94 A682" $"7696 7449 6C9B 9B85 8387 7B67 557F AE89" $"7897 8762 5B7A 8F89 8E91 8D72 5B6E 7E7E" $"909A 8F84 6B5F 7581 7E8D A08C 7076 7267" $"7888 9493 807D 8169 5983 9D83 8292 8870" $"626C 8293 8387 9D79 656E 7581 8B96 8587" $"8458 6887 858F 8A8C 8270 6A68 8B91 868B" $"8081 7C64 6D8F 9380 818B 7863 768B 8983" $"8096 8855 6E90 8874 809A 826E 677E 9977" $"6D94 9E6E 5C92 9061 7597 996F 6789 8778" $"6B87 9B78 6983 947A 6384 A282 587D AA79" $"4986 B275 5C83 9C87 606F 9397 706A 988D" $"696F 7D90 866B 7F97 7F5D 85A1 6E6A 948C" $"6674 938A 7178 867A 7A7A 8294 8973 7086" $"7E5F 82AB 926E 687F 7D6B 76A1 AF74 557C" $"8562 78A4 9685 795A 708E 7377 ADA3 606A" $"8469 6C8B 9792 846D 7478 6A81 9F92 7279" $"826A 7782 899F 8160 6B8E 8466 8DA3 8665" $"6686 847E 8C86 7E7B 766F 7D90 8583 827A" $"717C 8185 9279 7B7E 6A72 8D98 7E88 8C5E" $"5A80 968C 8F95 7C69 585E 8CA4 9F8E 8374" $"5255 81A8 A389 8374 6252 6DB1 A672 8394" $"664D 7E9F 9083 827F 7566 6D90 9884 8389" $"705F 7B96 8C7D 7D85 7B62 7A9E 9172 7580" $"717B 8B9A 9A63 527F 8F77 85AA 9167 5A68" $"8D93 7C92 AB72 4875 8B73 84A7 8F73 736B" $"6C7F 9495 8D8A 7258 678F 8F87 9D93 615A" $"737D 8DA0 917F 8061 5C84 8E92 9E84 6176" $"7B5A 8BBB 866D 8272 6280 8E8A A58A 5563" $"817A 83A6 9D81 7060 5D71 98A8 9B88 7067" $"5667 8C9E B595 6B65 6A60 69A7 AB8B 8172" $"6E70 6674 AEA6 6578 9E6E 517B 8C89 9A81" $"6C8C 8458 6EA0 8C78 8985 7477 7775 8E87" $"788B 856F 7785 777F 9785 7582 7D6F 787F" $"8695 8572 787B 7E7E 807E 8D8F 6A74 8682" $"7B78 828B 8A75 7C8C 726D 8986 7C90 8570" $"7E78 6D88 9677 7A95 7872 8278 7C85 808A" $"9971 5A8B 855E 84A9 9277 6F6E 7E7F 6E8F" $"AA7E 667D 786B 8089 8C93 7C76 806D 6B90" $"9676 8B8E 6271 7C76 8F99 7C75 9572 518B" $"9983 8381 8175 6B6D 909A 7886 8A6B 6D85" $"827D 8F91 786A 7A86 7676 948E 7082 8968" $"778F 7B7D 997D 658A 7F64 8895 7884 886B" $"7E88 6F7B 9E7B 6997 7A66 8C8B 727B 9579" $"748D 747B 8C78 7788 8973 7B8C 7A73 828D" $"7E73 8589 7379 907D 7784 8378 7A88 7D82" $"8375 7F7E 7F82 8280 8489 6C71 8E84 7688" $"9270 7482 7075 949A 787C 876C 637C 948A" $"8C8F 7666 6C7C 7F8A A093 7868 6E77 7486" $"9CA0 805D 6B7F 7977 97A4 8C6D 6170 8284" $"7E9B A06E 637B 746B 8CA3 8D86 8063 6878" $"798E AE8F 6F7C 6654 7AA4 9B91 8B75 6F5E" $"6091 A68E 858A 725B 727E 859B 9382 7877" $"6F6D 8391 9182 7B86 756A 7C88 8C87 7D77" $"8785 6B7B 9384 7A7D 7A82 8A7B 768C 846C" $"808B 7E86 8C78 767F 787C 8B8A 7F85 7969" $"838B 7986 9687 6A72 8375 868E 8287 8176" $"657D 9684 8981 7F83 6F6B 7F9E 8772 8B82" $"7677 7780 8F8D 7580 8F79 697A 8B8A 7E7B" $"9089 6971 8684 808A 8579 8779 6F81 8486" $"877D 7C8A 7C68 8193 7A82 9073 7589 756D" $"929B 7973 867E 7477 8396 8875 7780 8078" $"7A8B 9782 6D7B 8C7B 7480 898F 7B6D 858D" $"7275 9685 7388 8274 8087 7881 8A6F 7E92" $"7675 9989 5E80 9373 7894 9178 746E 7390" $"857F 9590 6E61 8382 7F8F 888A 7F6D 677D" $"9579 84A0 8065 7184 7D7F 9589 8083 6C68" $"8592 8080 9080 6C74 7E86 9081 7C89 7869" $"7D91 7F7B 947F 6D82 7C74 8390 8A80 8171" $"7684 7981 908B 7A71 7980 837F 8192 816E" $"7A7F 8482 7D81 837F 757F 857D 887F 788C" $"846E 798C 7D78 8E81 7B87 7470 8C86 778C" $"9073 7081 797A 8989 8F85 6C7B 806E 7A98" $"917A 8679 6679 7E84 9991 7E7D 7264 7A8D" $"8994 9270 7576 5C85 AE86 729B 8848 6991" $"8892 8D80 8076 5D71 9D8F 8592 7A6A 7775" $"7594 9B7C 787E 6F6E 8C8E 8A90 806B 6682" $"897E 8F95 7E67 6C7B 8392 9287 8A77 5A6B" $"898B 9295 8174 776D 6492 A088 877C 7674" $"756F 8AA9 7C69 8A87 6D6F 8E8D 8484 757E" $"867C 7682 907F 747B 8285 8780 7B83 7F76" $"7987 8E88 8073 7887 7877 8F90 7F77 8079" $"7687 8485 8E7F 7677 7C7F 7B8C 9288 796D" $"7B7E 8186 8A97 8669 677F 8677 8D9F 8972" $"6D77 7583 908F 927D 6A70 7E7C 8198 8C7A" $"837B 6C78 8C88 8987 7584 8863 68A2 9D66" $"7F9F 7967 7682 868B 8380 9477 5B82 8F78" $"7F98 917B 746F 7482 7F86 9B8F 7875 726D" $"7791 998B 8583 7764 6B88 8F8B 8A84 837E" $"6C6B 898F 828C 8F79 7178 6F7C 948D 858A" $"816C 727E 7F8D 9281 7B7F 7470 828E 8582" $"8B84 7673 7E81 7E8B 8C85 7B6A 7A85 8180" $"8A96 7773 7D7D 8A77 728A 9584 7185 7E6C" $"7886 938E 847C 796E 6A87 908F 8C82 7972" $"7069 8EA2 8388 8970 5F72 8E89 8F8F 8885" $"5B5B 8E98 7F88 A180 636A 6D8D 9C81 8090" $"7A59 7898 817F 8984 7B75 8084 897D 7486" $"8077 868B 7F7B 847E 727A 8C8B 827E 7C83" $"7A6E 7B8B 9480 7D89 7470 7C87 8584 8F76" $"7186 7A79 8F8B 797C 8073 8292 777C 9576" $"617F 8F86 8B8C 7478 7F65 7C9F 8C7C 877E" $"617A 8F7E 8890 8177 7977 788C 8A80 8479" $"7981 7D82 8B89 7972 7982 8381 928F 7368" $"7981 8092 8E87 8464 5D83 9887 8EA0 7159" $"6F78 8197 A991 7165 6074 878F A1A1 805D" $"5B76 8081 9DAB 8E67 636F 6D7D 97A3 9C77" $"6870 696C 91AE 8D7B 856E 5C78 9292 8F84" $"7777 7571 85A1 896D 7B83 7872 8BA0 886F" $"7280 7774 9395 887E 7277 7777 8698 8D78" $"7F7A 6E84 8A7C 8D8B 7073 8B83 7996 8468" $"7E7D 748C 9D86 7783 7062 7F90 9695 847A" $"7366 648A A590 8893 7455 6787 9291 958A" $"8071 5770 9699 8989 9073 5D71 888F 8D8E" $"8B77 6872 8388 8790 9075 6D77 7B83 8993" $"887B 7B6D 7785 8989 868B 7971 7A7D 8A86" $"8387 847A 707C 8486 8680 8586 7570 888A" $"757F 9785 6B7B 887E 747C 9491 7B74 8084" $"7079 8F8F 8D7C 7A7D 6E6F 879A 8882 917E" $"5E6A 8B8F 858C 9780 5F65 808B 848E 9A83" $"6D6C 7882 838F 9086 7A6C 7683 8081 9495" $"6E6A 8981 6E85 9F84 707B 7F7A 7885 938B" $"7477 8779 708B 937E 7C84 7C79 7A7C 8A8D" $"7C79 8B80 6778 928A 7984 957D 6276 8F80" $"7A93 9376 6F79 777E 888C 9489 6F73 8073" $"728E 9C8D 7973 7B7B 6878 A4A0 7A73 8071" $"657F 9493 8A7F 7671 7479 8799 917A 727D" $"756D 869B 9077 7977 6E79 8597 9583 766F" $"716F 8399 988A 786E 6C75 7E8A A395 756F" $"746E 7093 9D88 8179 706F 7C88 9191 8174" $"7476 7A88 938C 7D76 7772 7C90 948C 7D72" $"6D72 7E8C 9E91 7A78 6C62 7A9F 9587 8F7A" $"6166 7889 A09B 7A7B 785E 6B92 9D8F 8B7F" $"6C6C 697D A09A 8280 8061 6688 8E90 9589" $"6D69 787B 8791 908B 756C 7384 8983 8D8B" $"7C6B 7288 8987 8882 7F73 6D7F 928F 8288" $"7C68 7786 808B 9A85 6F71 757A 898B 8992" $"7F66 7185 8385 928D 7C73 7076 8789 8990" $"8673 6D79 8384 8D8D 887E 6F70 7988 8A85" $"918B 7669 7688 7F7F 8F94 8570 737F 7C7A" $"8191 9381 7779 7B74 758E 988A 847F 7667" $"6D88 9291 8E8E 7B5E 6985 8A89 989C 7A61" $"6876 828E 9397 8F6F 5E6D 8586 87A2 9A76" $"636A 7877 8C9E 9384 756D 6976 8F96 9085" $"8178 646B 8D96 8684 877D 7072 7E8F 977E" $"7789 7F69 7698 8B76 8781 7376 868C 8286" $"8280 7A70 848C 807A 868A 7477 8986 7F7C" $"7E87 8576 7C91 876E 788C 7C76 8B8B 8180" $"8178 737F 8488 8B84 827A 7173 7F8A 858B" $"927F 7073 7C7E 7F8A 8F91 7F66 7483 7779" $"979B 7E78 7A6E 7682 8693 927E 7277 7373" $"8B91 8D90 7C6A 737C 7B88 998E 7E79 696C" $"838B 8D92 8A79 6F6E 7685 9191 8A7B 6F78" $"7674 919A 8677 7A7A 6E78 8C97 9175 747D" $"7375 8595 9483 716B 7F80 758E 9D87 7172" $"7673 8390 9089 7E76 6C73 898F 8789 8A71" $"6479 8A8C 8E8A 7C76 6F6D 8397 9687 7B72" $"6D73 7C90 9B8C 8077 6865 8296 8B91 9876" $"5A6C 7E81 919E 8D7A 7163 6E8E 908C 938A" $"6E64 767C 8995 8B85 7C6E 6C7F 8B8B 9289" $"7272 7971 7D99 937C 7E7D 6D72 868B 8D91" $"7D71 7978 7283 998B 7B83 7C6E 7787 8D88" $"8580 7A78 737F 8B87 8382 7E79 7D7F 7F8C" $"8B7B 7C81 7A77 8587 7F85 857C 7981 8280" $"8384 817F 8280 797F 877F 7881 8A82 7E83" $"827F 797A 8388 8481 857F 7679 7F83 8686" $"8885 7B76 7C80 7985 908A 7E77 797A 7B80" $"8A94 8775 787B 7E7F 858C 867D 777D 7E7E" $"8884 7F85 847A 7C84 7C7D 8D88 7B7E 7F76" $"7A85 8589 8D7E 767B 7B79 858E 8985 8178" $"7274 7B8B 9589 8286 7766 7288 8B8F 9581" $"7375 6C6F 8B9A 8D88 8A70 6578 8087 9193" $"8675 7470 7583 8C97 8A7C 7975 777A 8890" $"8B83 7674 767F 8A85 8A89 7772 7E82 7D90" $"9274 7683 7375 9292 7F86 816A 7685 8290" $"947B 747C 6F71 898F 9494 7767 787C 718B" $"A18E 8379 6667 7E88 899B 967C 6B6A 747C" $"8C95 9485 7371 6E74 858E 948C 7F73 7178" $"7989 908A 8678 7478 7C7D 8893 8477 7D7D" $"7A7E 848A 887C 747D 847E 7F86 8381 7E7C" $"7F82 807D 8282 7E82 827E 7E7F 807D 7D85" $"857D 7D85 8373 7B8D 867D 8085 7E76 787C" $"8A8F 7C7D 857F 7378 8786 8988 7B79 7976" $"7982 8D91 8A7B 6F79 7875 8C97 8C7F 7A71" $"6976 848F 9B8E 7776 786B 6A92 A388 7D87" $"755C 708B 8D94 9582 7670 6776 9191 8890" $"8066 6D79 8094 9684 857A 5C71 9886 7C9E" $"8E5C 6882 7B84 9893 847B 6767 858A 8594" $"977B 6168 7D85 888F 9A8B 6B65 727F 8891" $"9386 7873 6F70 8298 9280 817B 6F74 8086" $"8F92 7B73 7F78 7288 9784 7D82 7874 7A88" $"8986 8B7C 7576 7E85 7E8A 8A84 7C6E 7C86" $"8480 8490 7E72 777E 857F 828E 8877 7581" $"807A 848E 877E 7B7B 7879 8589 8689 837B" $"7774 7988 9383 828F 7862 7589 858A 9389" $"7A74 6B76 8E88 8993 8770 6B78 7986 938B" $"8A80 7270 7485 8B90 8979 7D76 727B 8A96" $"877D 7F76 757D 858B 8D86 7379 8271 7C97" $"8D7B 8281 7078 8780 8993 7E72 787D 8081" $"818A 927E 6D7D 867B 7F83 868A 8072 788A" $"8273 8392 8777 7A87 7D77 8082 8789 8475" $"7B87 7777 8A8C 8884 7A72 7D81 7887 9488" $"7F78 7278 7F83 8B95 8674 7975 7083 8F8D" $"8E88 7369 7B7F 7C8F 9789 7972 6D72 878F" $"898E 8C75 666F 818B 8C90 8D7A 6D6C 7881" $"8C99 8F82 7269 717A 8791 978D 786F 6773" $"858A 9399 886C 6D74 7084 9794 8E84 6F67" $"767B 839A 9482 7F71 6375 8B8A 8F95 8171" $"726E 778D 948E 8679 7072 7580 9190 8781" $"786D 7582 848F 8D7E 7C76 7478 838D 8B87" $"7779 8173 7C8D 8981 807B 737F 887D 8388" $"7E7B 7D7D 7E87 897F 7A80 8077 7B8A 8A7E" $"7D80 7A7B 8081 8A8A 7D79 7D7B 7884 8583" $"897F 787F 7C79 878A 7B82 8D78 7282 827B" $"8389 7F82 8476 7982 8081 8689 7C7A 8178" $"7781 8A8A 8082 7C77 7C7B 838B 8983 7C78" $"727A 8683 898E 8179 7874 798B 8F82 8386" $"736E 7E82 838F 8E7B 767E 7674 8993 8880" $"7C76 747A 7D8A 9987 737A 7D76 798B 8E8C" $"8570 757F 797D 8C94 817E 7E70 7982 878A" $"8782 787C 7875 878E 857D 8481 7079 8C87" $"7C85 8679 787D 7F85 8A7B 7A8E 8172 7E88" $"8380 8380 8382 757E 897C 7C8D 8878 7F85" $"797C 867D 818E 8275 7D86 7879 8886 8A86" $"7978 8080 7784 8E84 827E 787A 8082 818B" $"867D 7D7D 7B7E 8484 8383 7F7C 7B7F 8584" $"7E82 867C 787D 868B 7F79 8284 7677 8987" $"8388 7D76 827D 7686 9082 7D87 7970 8082" $"858C 8682 7D7A 7579 8788 8B85 7A7D 7A79" $"7D83 8E8C 827B 7778 7A85 8682 8D86 7074" $"817F 848C 8380 8675 6C84 8C7D 868D 7C78" $"7A7A 818B 857E 877E 737A 8186 8885 7F7B" $"7E7A 7A81 898E 7E79 7C7C 807D 818A 8D7D" $"6E82 8473 838B 8381 8378 7686 7B7B 9186" $"7681 8375 7986 8283 887F 7D81 7979 8881" $"7C87 887C 767F 7F7E 8581 8486 7E78 7882" $"847E 8584 7C7C 7F7E 7B86 8B7F 7F7D 797F" $"8182 8287 8077 7E7B 7E89 8680 8282 7376" $"8882 8189 8679 747A 7E89 8980 8586 756B" $"7F8C 8785 8581 7974 7380 9188 8388 7D6E" $"7086 8782 8C8A 7F72 727F 8185 8988 8376" $"777F 7E7F 848C 8576 7B7F 7D81 8082 8781" $"7778 8883 7A89 8677 7880 8180 8686 8180" $"7875 7F87 8886 817F 7F78 757D 8B8B 807D" $"817F 7678 8888 8282 837E 787A 7E87 867A" $"848B 7975 8389 807C 7F80 847E 7B86 8378" $"7B88 8478 848A 7C77 7F88 7F7E 8582 817E" $"7D7D 8181 7D87 887B 7A81 817C 8185 8685" $"7A78 7F80 7C84 8A80 8683 7276 8685 7C88" $"8D7D 7978 7780 8687 8989 7E73 787F 7F85" $"8C89 7F75 777C 7E87 8B8A 817B 7978 7C83" $"8F8B 7C7A 7C78 7885 8A8B 8B7B 747B 7C7C" $"8B94 817D 7F70 6E82 928B 8886 7975 747C" $"878C 8982 7F74 737E 8487 8886 837C 7675" $"838A 8283 887D 7079 8685 8087 897C 737B" $"8684 8485 7B7E 7F76 7D8C 8A7E 807D 747E" $"8A82 828C 8073 787E 8086 8A85 837D 717A" $"8682 848C 877A 7578 7C84 8785 8982 7778" $"7D7C 7E8F 8D7A 7884 8170 7B8F 887D 8081" $"7B7C 7E7B 8A8D 7A7C 877C 6D82 9182 7C83" $"847A 7379 888D 8081 897C 7279 8181 878B" $"817E 7B72 7785 8A84 898C 776C 7A81 7D86" $"9386 797C 7372 858D 868C 8C75 6D76 7A82" $"8E8C 8684 756B 7783 898D 8C82 7D73 6B7B" $"8986 898F 8170 747C 7F82 8A8E 8777 727A" $"7D7F 8485 8C85 7172 8888 7484 917F 7479" $"8080 8281 838A 7C71 7E86 8380 8886 7B75" $"7683 8783 8388 8076 767C 8383 8887 827C" $"777C 7F82 8383 8780 777A 7F82 8185 837F" $"8179 7882 897F 7D84 7F79 7C83 8085 887D" $"7B7F 7F7C 8186 8282 8278 7980 8480 8086" $"857F 7479 8985 7A83 8B7D 757D 7F80 8883" $"7C85 8373 778B 867C 8583 7778 8282 8285" $"817F 7E7B 7F84 8482 817E 7B80 7E7F 8687" $"7F79 7F7D 7F86 8481 8183 7A75 8186 8382" $"857F 767D 7F7C 888E 827A 8179 7382 8982" $"878B 7872 7E7E 7F8C 8D84 8078 7079 8485" $"8D8E 7C78 7970 7C92 8B83 8A82 6971 8583" $"868F 897B 7974 7483 8A8A 8984 7B73 757E" $"8789 898B 8072 727D 8383 8A8C 8475 727E" $"7F81 8A8F 8578 7675 7D83 8489 8E85 7277" $"7D7B 818A 8F85 7A76 787B 7A87 928A 7F77" $"797A 7B7F 8890 847C 7877 7B7F 8788 8C85" $"7B78 737A 8689 8786 8275 767C 7C88 9087" $"7D7D 7974 7E83 878C 837A 7B7C 797F 8A89" $"8780 777D 7C77 828F 8A7B 7F7D 767A 7D8A" $"9283 797C 7E73 7A8A 8B89 7C78 807E 757E" $"9287 7B7F 7D7B 7B7D 838D 8576 8283 7078" $"8B89 7D81 847D 7A77 7E8B 887B 7F89 7D74" $"7A85 8781 7F82 837A 7685 877C 7F86 8278" $"7C87 8279 7E84 837D 7D80 8183 7D7D 8881" $"757D 887F 7586 8979 7A85 847D 7D7E 8087" $"7E7A 8484 797B 837F 8386 7D7F 837A 7684" $"837D 8886 777A 8378 7B8D 877B 8082 7777" $"8284 8885 7C7D 7C79 7882 8C89 827B 7C79" $"7680 8B89 8383 7B75 757A 898C 8885 8179" $"6D7A 8282 8E8B 827B 7670 778D 8684 8F85" $"7170 7D7D 838C 8984 7E78 7279 8387 8E87" $"7F7A 7578 7E83 868B 8876 727C 8182 8589" $"857E 7975 7884 8984 8285 7E74 767E 858B" $"8C85 7876 757A 8388 8D86 7D77 757C 828B" $"8881 817D 7878 8386 8482 7D7E 7E7D 7E86" $"877E 807E 7D80 7C81 8784 7C79 817D 8087" $"8183 8479 7684 847F 8686 777A 857A 818A" $"8180 837A 7588 8979 8487 7D7C 7D7D 8389" $"7D7D 877D 7981 8781 8081 7F82 7B7D 8887" $"7E7A 7F7F 7D7E 858E 8279 7F7B 7782 8C83" $"8685 7278 8278 7F98 8D74 7E7F 707A 8987" $"8B8B 7872 7D7A 7B8E 8D80 827B 737C 7D81" $"8E8E 7A74 8279 7685 8C8B 8079 777B 807E" $"848C 897B 727C 837A 8092 8978 7A7C 797F" $"8886 8486 7A79 807A 7F8A 857E 8182 7A7D" $"807E 8887 7980 877A 7784 8278 8289 8180" $"827E 7C7C 7A83 8D84 7D7E 7C77 7880 878D" $"897E 7B75 767F 8688 8B89 796F 757D 828A" $"8C88 7F74 737B 8187 8C8A 7F74 7378 8386" $"878E 8772 6E7D 8382 878D 8575 7278 8084" $"868B 847C 7574 7F86 8487 897E 7277 7E7F" $"8689 8480 7A74 7E84 7E87 8C7E 747D 7F79" $"8588 8182 7B76 8286 7B7F 8D81 737E 8280" $"817F 7B82 8479 7E8A 847B 7C7E 7C81 8583" $"8380 7A78 7B81 8687 8581 7A78 7B7F 8487" $"857F 7E78 7781 8585 8382 7E79 7C7D 838B" $"827C 7E7C 757F 8D84 8185 7A71 7D84 808B" $"8C7E 7677 787C 898A 8588 7B72 767C 8288" $"8B83 7F7B 727C 8681 838C 8373 7880 8082" $"8383 817C 7A7C 8186 8880 7A7E 7E7B 8387" $"8080 8379 7785 8680 8481 7A7C 7F82 8383" $"8081 7C73 7E8A 8782 827D 767B 7B7F 8F8F" $"7F78 7977 7784 8D8A 8681 766D 7686 8B8B" $"8B85 756D 7681 898D 8985 7B6E 6F80 8B89" $"8D89 7B74 7176 8590 8A85 8472 6C7D 8683" $"8B93 8174 7478 8285 8789 887A 6E7D 817D" $"888E 8879 767C 8181 7B86 9081 7175 8284" $"8085 8D84 7675 7F83 828A 8678 757A 8487" $"8484 847C 707A 8A8B 8684 7E73 747B 868F" $"8780 817B 7176 888E 8A84 7B7A 7672 7E8F" $"9085 7F76 7479 7F89 908B 7D74 7376 8488" $"878F 8570 6C7C 8685 8A8A 857C 6C6F 838E" $"8A86 857E 7470 7A8C 8D85 8480 7374 8186" $"8985 8180 7977 7D87 8681 827B 7A7F 8084" $"8583 7D7E 7C74 828F 827C 817E 7B7B 7F88" $"8C81 787D 7E78 8089 8881 7A78 7C7F 7C86" $"9182 7378 817B 7D8A 8883 7D75 7680 8683" $"8888 7D76 787D 8187 8884 7E77 767B 8285" $"8889 7E77 7A7B 7E87 8D80 7A7E 7475 848A" $"8785 8076 767F 7E83 8D87 7A78 7A78 7D85" $"8689 8377 767C 8182 8585 7F7E 7978 8288" $"827C 807E 797F 8784 8082 7E79 7B80 8687" $"817A 7D7F 777B 898B 8380 7D78 7A7C 8189" $"897E 7C7F 7476 898D 837E 837B 7579 828E" $"887B 7B81 7A72 858D 8480 7F7C 787E 7E83" $"8B81 7A7D 7E78 7C8B 8680 807F 7A79 8183" $"8684 7F7D 787C 8386 8280 857C 747E 8784" $"7F83 8178 7B7E 8289 847A 7E81 7977 898E" $"7F7C 7F7E 7977 858C 847D 8181 7577 8688" $"8384 817B 7B7A 7E8A 887E 7E82 7975 838A" $"857F 8080 7777 848B 8581 827B 767A 8086" $"8986 7F7B 7A79 7E85 8888 7E7C 7D78 7A83" $"8A84 8481 7379 847F 818D 8B77 747C 7E83" $"8586 8880 7476 8182 858B 867B 787A 7A82" $"8787 8980 7576 8385 7C87 8B7E 777A 8081" $"8484 7F81 807B 8184 7D7F 867F 7A82 847D" $"7F84 8180 7E7D 8182 7F82 8881 757B 817F" $"8287 8781 7C75 7987 8681 8586 7872 7E82" $"8288 847E 807C 757E 8C87 7F82 8079 7A7C" $"828C 897D 7B7F 7B7B 8486 8887 7A74 7C80" $"7E86 8E82 7A7C 7878 858F 8680 8178 727C" $"8588 8983 7C7B 7B77 7D8E 8C7F 7D7C 7C7A" $"7A83 8C89 7A79 827D 7A80 8686 827D 7B82" $"7F78 818A 8179 7E83 7E7D 8184 857F 777B" $"8684 7F81 847D 787C 8186 8481 8179 7981" $"8381 8286 7E76 7B7F 8486 827E 7F7F 7679" $"898A 807C 807E 7679 858A 847E 7E7C 787C" $"8185 8A86 7D79 797B 7D85 8982 827F 7576" $"808A 8381 867D 7578 8285 8286 827B 7A79" $"7F86 867F 7F84 7A76 7F87 8682 7E7E 7F77" $"7D87 847F 8383 7379 8980 7C86 877B 7A7E" $"7B83 867E 8083 7D79 8185 8181 807C 7C7E" $"7F85 847F 807F 7A7B 8484 8185 847B 757D" $"847F 8087 867B 777E 7F82 8282 8681 7779" $"8582 7D84 857C 787E 7F86 877C 8184 7877" $"8487 7E84 8478 7E81 7D7F 8586 7F7D 7C7F" $"837C 7E88 8279 7C82 8082 8581 807E 787D" $"8686 8184 8178 767E 8685 8486 8277 757F" $"8281 8A89 7E77 7A7B 7D86 8785 837B 797B" $"8182 8387 847E 767B 8581 7F84 8680 797D" $"7E84 867E 7F84 817B 7C83 8681 7C80 867D" $"7889 8979 7C83 7F7D 7F84 8A87 7372 8883" $"7885 9284 7075 8283 7E83 8F85 7375 8181" $"7E85 8986 7C74 7D83 7E7F 8B8B 7974 7D82" $"7C7B 8E92 7B6F 7E84 747D 928C 8077 767C" $"7F7D 8294 8B72 7780 7B7A 868C 877F 767B" $"827B 808D 857A 7F81 797F 847F 8382 7C80" $"857C 7A87 837B 7F85 857D 7C81 817A 7989" $"8B7E 7D7F 7E79 7C84 8A8C 7C76 7E7C 787F" $"8D8D 817B 777B 7D7F 888A 8880 7674 7983" $"8585 8986 7B73 7680 8787 8785 7D75 757B" $"8489 8A86 7F77 737B 8185 8A8B 8176 767A" $"7C81 878D 887A 757D 7F77 8191 897C 7A7C" $"7D78 7985 8F87 797E 8379 747E 8B89 7F80" $"847C 7078 8986 8287 8579 7379 8084 8787" $"857D 7375 7E84 8487 8B84 736E 7E85 7E84" $"9089 7471 7A7D 8186 8B8B 7E72 737D 8381" $"878B 8678 6F7B 847F 818B 897B 7879 7B80" $"8686 8284 8179 767C 8484 8383 817E 7979" $"7E85 8782 7F81 7E76 7985 8780 8084 7F78" $"7A7F 8486 827E 817F 7A7A 8086 837F 7E82" $"8078 7E83 8382 7E80 807F 797B 8885 7D80" $"8582 7877 8087 837D 8284 7C78 7C82 8684" $"8081 7F7A 7A7F 8284 8581 7D80 7E7B 7F83" $"8483 7F7E 8081 7A7A 8686 807E 8283 7A7A" $"8086 847E 8481 797C 7F82 8285 837E 7F7A" $"7B81 8485 8381 7E7C 7C7D 8286 8683 7A79" $"8080 7B84 8E85 7778 7D7D 7F85 8988 8077" $"787B 7F87 8A88 827B 7578 8183 898A 817D" $"7B79 7A84 8983 8282 7C79 7B83 8683 8384" $"7E76 7B83 8283 8682 7E7B 797F 8685 8084" $"8478 7882 8581 7F85 847C 797F 847F 7E84" $"8481 7E7D 7F7F 7E80 8485 817F 7F7A 7A80" $"8486 8384 827A 767B 8484 868A 8179 7A78" $"7984 8C8B 847E 7574 7C80 8990 8A7E 7473" $"767F 898D 8F83 7673 7278 8793 8D83 8075" $"6B75 838F 9386 7D78 7272 7C8C 8F8A 8077" $"7A78 7885 8B86 8180 7A77 7E81 8286 8380" $"7F7B 7B80 8280 8183 7F7E 807E 7F7F 7E82" $"8481 7E82 8179 7B80 8284 8584 807B 787B" $"8083 878A 8378 7778 7B80 878C 897F 7476" $"7D7C 818B 8C82 7877 797C 8085 8D86 7779" $"7E7B 7C87 8B81 7A7A 7B80 8181 8785 7C75" $"7E84 7F80 8483 7D78 7C82 8382 8382 7C79" $"7E82 8081 8382 7C78 7E83 8581 7F82 817A" $"7682 8B83 7E80 7D79 7A7E 838A 877C 7B7D" $"797D 8587 857F 7C7A 7C80 8186 867E 7C7D" $"7E7D 8185 8281 7C79 8081 7E82 8681 7A7D" $"807C 8084 8280 7D7E 7F7F 7F81 8781 787C" $"8181 7D82 8882 7B78 7E84 8181 8584 7975" $"7E84 8283 8684 7B75 7A84 8682 8388 7C73" $"7C82 8285 8681 7C7B 797F 8782 8386 7B76" $"7D82 8282 8684 8078 7585 887E 8488 8076" $"7A7E 7F87 8481 8480 797B 7F80 8487 817F" $"7F7B 7E7F 7E84 867E 7D83 807C 8282 7F82" $"8282 807C 7C7F 7E7D 8688 8080 7E7A 7E82" $"8087 897D 7A7F 7A76 868C 8483 807A 7978" $"7E8B 8D81 7E82 7571 8189 8888 837D 7B76" $"7686 9083 8185 7A72 7784 8A88 8380 8077" $"7683 8986 8282 7E77 7981 8984 8083 7F78" $"7A83 8784 8080 827D 767D 8985 7D81 827E" $"7B7C 8286 827E 8283 7B7D 8481 7F80 8181" $"8080 8184 7F79 7F85 827F 8183 7E7A 7C81" $"8482 8384 7E79 7B81 8282 8484 8179 797F" $"8280 8288 867C 767B 8281 8089 8A7D 7678" $"7E84 8384 8882 7777 8083 8286 837E 7C79" $"7C84 8683 827F 7A7B 8181 8288 827A 7A7D" $"7F81 8383 8581 7779 8382 8084 8580 7B7B" $"7B7F 8483 8181 7E7C 7C80 8384 827D 7C7C" $"7E81 8385 827C 7A7E 8080 8387 8378 777E" $"8380 8088 867C 7579 8183 8584 8582 7674" $"7D86 8684 867F 7777 7D81 8489 867C 7878" $"7C81 8487 877E 7878 7D81 8585 8383 7C75" $"7C85 8280 8582 7979 7F82 8383 8281 7D78" $"7C84 8582 7F7E 807E 797F 8A85 7B7D 807B" $"7D83 8384 837C 797D 8082 8583 7F7E 7B7B" $"8083 8485 7E7A 7D7D 7D82 8883 7D7E 7C7D" $"8182 8684 7E7A 7C7D 7E85 8582 827C 787D" $"8183 8886 7C7A 7C78 7D89 8A83 7D7A 797D" $"8084 8B87 7978 7C7D 8085 8785 7F77 7880" $"8384 8783 7F7C 787B 8385 8585 817A 797E" $"8083 8582 847E 767B 8283 8485 827D 7C7A" $"7D87 8581 837E 797B 8183 8585 7F7F 7D79" $"8186 8280 827F 7B7E 8083 8680 7D81 7F7A" $"8087 827F 7F7E 807E 7E86 8881 7C7E 7D7D" $"8384 8585 7D79 7E7F 7D87 8A81 7F7F 7979" $"8185 8585 7E7D 7E77 7E89 8781 8280 797C" $"7E81 8986 7C7E 8078 7C89 8882 807D 7C7D" $"7980 8E86 7C7F 7F79 7C81 8187 897F 7B7E" $"7C7D 8281 848A 8078 7C7E 7E81 8384 8580" $"797F 837C 7F86 827F 7F7E 8080 7C7E 8481" $"7F85 827C 7E7E 7D82 8482 827F 7A7C 7E7E" $"848A 827D 7F7C 7B7E 8288 867C 7A80 7E79" $"8188 8681 7C7B 7E7E 7C84 8781 7F7D 7C7C" $"8084 8381 8080 7E7B 7E84 837F 8182 7C7A" $"8083 8281 8183 7C7A 8081 8283 827F 7C7E" $"7C7F 8582 8181 7D7A 8083 7F80 8380 7B7B" $"8285 7F7E 8380 777C 8683 7F81 827C 7880" $"8581 7E81 827E 7B7C 8184 827F 8184 7C77" $"7F83 7F80 8783 787C 827E 7E85 877F 7B7B" $"7E81 7F80 8482 7D7C 807F 7F82 8281 7F7D" $"7F81 7D7D 8584 7B7F 857F 7A7F 837F 8082" $"8080 817C 7C82 817C 8487 7D7B 7F7E 7D81" $"8484 837D 7A7F 7E7C 8286 8381 7E79 7C82" $"7E80 8883 797B 807D 7E84 8482 7F7C 7C7E" $"8181 8383 807C 7C80 8080 8485 7F7C 7D7D" $"7E80 8386 827C 7C80 7E7B 8587 8180 7E7C" $"7E7E 7F84 897F 7981 807C 7F83 8483 7F79" $"7E84 7D7F 8682 7D7E 7E7E 8180 7F84 7F7B" $"8083 817F 8180 807F 7A81 8680 7D81 827E" $"7D80 8483 807F 807E 7D81 8381 8482 7E7E" $"7D7F 8184 8382 817B 7B7E 7F83 8584 837D" $"797E 8282 8285 837D 7C7C 7D82 8483 8481" $"7C7D 7F7D 8187 847F 807D 7A7F 8182 8583" $"7E7E 7F7A 7E87 8480 8180 7D7C 7D7F 8686" $"7E7F 827E 7B7F 8282 8282 8080 7D7C 8183" $"8281 8383 7D7C 7C80 8383 8180 837F 797E" $"8582 7F83 837D 7D7F 7E81 8481 8082 7D7A" $"8284 7E7F 8481 7E7E 7E83 837D 7F83 7F7B" $"8184 7F81 817D 8180 7C7E 8683 7A81 827C" $"7E82 8480 8080 7E7F 7D80 8383 807C 7E7F" $"7E7E 8287 827C 7E80 7E7C 8186 837F 7E7D" $"7C7F 8283 8382 7E7D 7D7D 7F86 867E 7C80" $"7D79 7F89 8680 7F7F 7B78 7E84 8785 7F7E" $"7C79 7A80 8888 837D 7D7D 777C 8586 8483" $"8077 797F 7E83 8784 817D 7A7A 7F82 8284" $"827E 7D7A 7D82 8281 8483 7A7B 837E 7C82" $"8581 7E7C 7D83 7F7B 8388 8179 7E83 7E7B" $"7F87 847B 7E83 7F79 7C84 847F 7E81 827C" $"7A80 8681 7D82 827C 7980 847F 7F84 837D" $"7B80 8080 8281 8180 7B7C 8080 7F82 847D" $"7C7F 8080 7F83 857F 777D 847F 7E83 847F" $"7D7E 7D82 837E 8483 7C7B 7F82 7C80 8584" $"817B 8082 7E7E 8182 7F7F 7F7F 8280 7F80" $"8080 7F84 837C 8082 7C7B 8185 827F 8182" $"7B7A 8184 8581 8080 7D79 7A86 8981 7D7F" $"817A 7982 8988 7B7B 827B 7680 8B87 817E" $"797D 7F79 8190 8876 7B82 7978 8589 8784" $"7B78 7F7D 7A86 8C83 7D7E 7D7A 7D82 8687" $"807C 807F 7B7F 8885 7D7F 817E 7D80 8481" $"807E 7E82 807D 8388 7C76 8384 7B7F 8686" $"7E7B 7C81 847B 818A 8377 7A85 807B 7F86" $"887C 7980 847E 7985 877F 7E7E 827F 7D7E" $"8386 7C7E 8380 7D7D 8382 8080 8083 7D7A" $"8183 807F 8483 7D7E 7D7F 8381 8184 827A" $"7B83 817D 8486 817B 7A7F 8280 7E86 867A" $"7880 827E 7F87 857E 787B 8381 7E83 8A82" $"737A 8380 7B84 8C80 7A7A 7F82 7D7F 888B" $"7A72 8382 787D 8789 7D7B 7D81 8077 828B" $"8278 7D86 7D7A 7F84 867E 7C81 837F 7981" $"837F 7F81 847B 7C81 7E7E 8084 817D 7F7D" $"8080 7D83 867E 787E 837E 7E82 8485 7B76" $"8186 7B7C 8985 7A7A 7C7F 837F 7E88 8674" $"7785 817C 8087 847C 767C 8780 7A86 877C" $"777D 8081 837C 8185 7979 8283 7C82 867B" $"7D80 7E80 8082 8180 7B7B 8680 7E82 817F" $"7B7E 7F83 837B 8182 7B7A 8288 7F7E 807E" $"7C79 8184 8282 7E7E 7D7E 7D82 8A7F 7B80" $"7D7A 7F84 8283 8179 7C80 7C81 8783 7E80" $"7B79 8382 7F86 8478 7880 7D7E 8886 7F7F" $"7B77 7E84 8285 877E 787A 7C7E 8488 8380" $"7E79 7B7E 8184 8683 7A7D 7F79 7E87 877F" $"8082 7B7C 7F81 8683 7C7C 847E 7785 887E" $"7C81 807D 827D 8188 7B79 8484 797E 877E" $"7E81 8080 817F 7D82 7E7B 8583 7E7F 827F" $"7A80 8183 847E 8183 7A77 8289 7E7F 8681" $"7A7A 7F84 8382 7F84 8177 7B83 8682 7F83" $"807D 7B7F 8882 7E82 807B 7A84 8280 8681" $"7B7D 807C 7F8A 837D 837F 797E 8680 8087" $"7D7A 7F7E 7F83 847F 8281 797F 827D 8286" $"7F7B 837D 7886 867D 8186 7C78 847E 7D87" $"837D 7F83 7B7C 8580 8285 807D 7E81 7D80" $"827F 8581 7B80 847D 7A84 847E 8080 7F80" $"7F7D 8085 7F7C 8382 7D7C 8383 7D7E 8283" $"7F7C 8081 807F 7E83 827E 7F80 807D 8182" $"8081 7E7F 817E 7F82 827C 8085 7C7E 8480" $"7D80 827F 827E 7A86 8379 7F86 8079 8080" $"8084 7D7E 8580 777F 877D 7F85 7F7E 7F7D" $"7C85 837C 8481 7C7E 807D 7F89 817A 8280" $"7B7C 8184 8282 7A7C 847D 7A82 8A7F 7881" $"807D 7F80 8384 7E78 8086 7A7C 8783 7C7D" $"7E7D 8380 7A85 8678 7B85 807D 8480 7B82" $"7F79 8186 7E7E 837C 7C82 7E7F 8582 7B7E" $"7F7D 8281 7F85 8379 7B83 817C 8383 807E" $"7B7E 8283 8080 8480 7C7B 7F84 807F 8181" $"7E7C 8080 8282 7E80 807E 7E7F 8282 7F7C" $"8183 7C7E 8580 7C80 7F7D 8383 7D82 8279" $"7C84 7F7F 8582 7C7E 7C7C 8482 8086 8377" $"7B83 7C7E 8886 7E7E 7E79 7F82 7F86 887D" $"787F 807B 8088 8580 7D7C 7C7F 8082 8783" $"7C7E 807D 7C84 847D 8281 7C7F 817E 8085" $"7E7B 8580 7981 867E 7D84 7F7E 827E 8083" $"817C 8284 7B7F 827F 8081 7F7F 857F 7A84" $"827C 8185 807E 847D 7B83 817E 8386 7E7C" $"827F 7E82 8282 827F 7D7F 817F 8382 7E81" $"817C 7D84 837F 8280 7D80 807B 8289 7F7A" $"8382 7B7C 8485 817F 7E83 7F78 7F87 847C" $"7F82 7E7E 7D80 8883 7B7F 847D 7783 867E" $"8184 807C 7F7F 8085 827E 8380 7B7D 8381" $"7F83 827F 7E7D 7F83 817F 8583 7A7B 8381" $"7D83 8580 7F7D 7D82 837E 8088 8077 7E84" $"807C 8386 807E 7B80 837F 7D82 877D 7882" $"847F 7E81 827F 7E7E 8185 7E7E 8480 797F" $"8581 8083 7F7E 807C 7F85 817E 8381 797D" $"837E 8085 807E 817C 7C83 817E 8484 7A7C" $"8281 8181 8081 8179 7B86 827C 8282 7D7E" $"7E7E 8486 7C7C 857E 7780 8582 8080 7F7F" $"7F7B 8185 7F7D 8080 7E7F 8182 827E 7C81" $"827C 7E85 8279 7E83 7D7C 8684 7B81 827B" $"7C82 8281 847C 7B84 8079 8189 8179 7F81" $"807F 7C85 887A 7883 8379 8089 817D 7E7B" $"7E82 7F7F 8985 777C 837D 7A84 8780 7E7E" $"7D7C 7D83 8583 7E7E 7F7D 7D7F 8483 7F7F" $"7E80 7D7C 8383 817D 8084 797C 8482 7F80" $"837F 7F7F 7B80 8380 7F82 827B 7E80 7E81" $"8182 827F 7F7E 7F7E 7F84 8181 817E 7D80" $"807E 8283 7F7E 807E 7C83 8380 8280 7E7D" $"7E7F 8085 817F 807C 7F80 8082 8583 7B7D" $"827D 7E84 8480 807F 7B80 827E 8187 817A" $"7E80 7C80 8482 8381 7C7D 817F 7D86 847C" $"7F80 7B7E 8382 8085 807B 8180 7D82 857F" $"7F83 7C7A 8282 7F84 847E 817F 787F 8681" $"7E85 867A 7C80 7F84 8180 8382 7C79 8383" $"7E83 8481 7F7E 7C80 8480 8084 807C 7D81" $"7E82 8480 8180 7E7D 7F83 8183 817D 8180" $"7C7D 8486 7E7F 817F 7D7D 8183 837F 8082" $"7E7C 7F82 8380 8180 8280 797E 8582 7F81" $"847E 7D80 7E81 8381 8181 807D 7F80 7F83" $"837F 8080 7E7E 8281 8182 7F7C 8181 7C7F" $"8781 7C80 817F 7F81 8083 837A 7D83 807C" $"8186 7F7D 807F 7F80 8082 837F 7B82 817B" $"8183 807F 817E 7D84 7F7D 8682 7A7E 837D" $"7B86 827D 8280 7C7F 827F 8184 7E7E 827E" $"7D81 827E 8180 7C82 817C 8085 807A 8181" $"7C7F 8181 817F 7C7F 837F 7F84 827D 7D7F" $"7E81 8180 837E 7B7F 817F 7F86 837A 7E80" $"7F7F 8083 817F 7C7D 837F 7E83 847E 7B81" $"817E 7F82 837E 7C7F 8280 7E83 847E 7C7F" $"827F 8083 807F 7C7B 8083 8080 8681 797F" $"837D 7E84 827E 7D7D 7F82 807F 8583 7A7B" $"817F 8083 8080 807D 7B81 847F 8183 7D7C" $"7F7E 7E83 857E 7E80 7D7C 7F82 8182 807C" $"7E80 7E7F 8484 7F80 7E7C 8081 7F80 8481" $"7B81 7F7D 8281 8081 817D 7D83 7E7D 8281" $"8081 807E 8080 7C81 8380 8082 807C 8081" $"7F82 8180 8080 7D7D 8381 7F81 817F 7D7F" $"8082 827F 8180 7E7D 8083 8181 807F 807D" $"7F83 8480 7E83 7F79 8084 817F 8282 7E7E" $"7D80 8681 7D82 827C 7C83 8281 817E 8081" $"7D7E 8782 7B83 847A 7C85 827F 8281 7E80" $"7E7D 8484 7D80 847F 7B80 8481 807F 8182" $"7E7D 8284 7F7E 8281 7E81 8380 7F80 7E7F" $"8081 8182 827C 7D82 7F7F 8483 7C7E 827D" $"7F84 827F 817F 7B82 847F 8282 7F7E 7F7F" $"8184 7F7F 837E 7D81 8380 7F81 7F7F 817E" $"8184 817C 7F84 7F7D 8384 7F7D 7F7F 7F80" $"8286 817D 7D80 7E7C 8488 827D 7D80 7E7D" $"8086 877D 7A81 7F7B 8087 8380 7F7D 7E7E" $"7F82 8580 7D81 7E7A 8184 827E 7E81 7F7D" $"7C83 867D 7D83 817B 7E84 8180 817F 7F7F" $"7D7F 8482 7E80 827D 7D82 817F 807F 7E7F" $"8081 8281 7E7E 7F7D 7F84 837E 7F7F 7B7C" $"8283 8383 807C 7D7D 7C85 877E 7F82 7B79" $"8083 8183 827C 7D7F 7C80 8483 8080 7E7A" $"7F82 8082 827F 7C7B 7E81 8482 8083 7E79" $"7D83 8380 8281 7D7C 7C7E 8385 807F 817D" $"7A7D 8382 8283 7F7E 7D7D 8082 8481 807F" $"7E7E 7D81 8581 7E80 817C 7D82 8081 8180" $"7E7E 807E 7F82 8080 8080 807F 7F7E 7F81" $"8081 8080 807D 7C80 837F 7F84 837B 7A81" $"807F 8282 8280 7D7B 7F84 7E7F 8581 7C7D" $"807F 8083 8081 807A 7E82 7F80 8482 7D80" $"807C 8285 8080 827E 7C82 807E 8584 7C7C" $"8280 7C82 8482 817D 7D80 817D 7F85 827E" $"7D80 8180 7F7F 8481 7B7F 8480 7B80 837E" $"8081 8081 8080 7F82 807D 8382 7E7E 8281" $"7C80 8381 807E 8183 7E7C 8085 7F7D 8382" $"7F7E 8081 8180 7F82 807B 8084 817D 8283" $"7D7E 8082 827F 7E80 817C 7E85 837F 7F81" $"7F7E 7F81 8481 7D80 817F 7E81 8380 8180" $"7E80 7F80 8182 827D 8182 7C7E 8281 7F80" $"837F 8081 7E80 827F 7F83 817E 8180 7F81" $"7F7F 8282 7C7F 847F 7D81 827E 8082 7E80" $"827D 7E83 817D 8282 7C7F 837F 7E82 817E" $"8180 7F83 7F7C 8283 7D7D 8480 7A82 817E" $"8180 7F81 827C 7E85 7E7D 8582 7C7F 827D" $"7E82 7F80 827E 7E81 7F7D 8382 7D80 827E" $"7C80 8180 827F 8081 7E7D 8183 7F7F 837E" $"7D7F 8080 8082 8080 7F7C 8181 7F7F 8281" $"7B7F 817E 7F80 8280 7F7E 7E82 807E 8281" $"7D7E 817F 7E82 807F 817E 7E82 807B 8183" $"7C7E 847F 7C81 817D 8081 7F81 7F7D 8082" $"7D7E 8381 7E7F 7E80 817E 7E81 827D 7E82" $"7F7E 8082 7E7E 8280 7E81 817F 7F81 7E7D" $"8280 7F82 827E 7F82 7D7E 827F 8081 7E7F" $"817E 7C84 847B 8084 7E7C 8180 7E82 7F7D" $"8281 7D7F 837F 7D81 7F81 827F 8081 7F7D" $"8081 7C82 837D 7D81 827D 7F82 8180 7E7F" $"8080 7F7E 8381 7D80 8280 7D81 827F 807E" $"8082 7F7D 8284 7C7E 847F 7C81 817E 8081" $"7F82 817C 8082 7D7E 8481 7E83 817C 8080" $"7D82 827E 8184 7C7B 8280 7E82 837F 7F80" $"7C80 827E 8183 807E 8080 7D81 817F 8282" $"7E7E 8180 7E81 8181 8280 7E7F 8280 7E82" $"827F 7F80 807F 8181 8182 8080 8180 7E80" $"8280 8081 7F7F 8080 7F82 8280 8280 7C7F" $"817F 7E83 827E 807F 7F80 8181 8082 807E" $"7F80 8080 8181 807F 7E81 827F 7F82 817E" $"8081 7E81 817F 8081 807E 8282 7E82 817E" $"7F81 817F 8080 8082 7F7E 8380 7E7F 8281" $"8082 8080 807E 7F82 807F 8182 7F7D 8080" $"7E81 8280 8181 7F7F 7F7F 8083 817D 8182" $"7D7D 8182 7F81 817F 817E 7D81 827F 7F82" $"7F7E 817F 7F82 807E 8181 7B7F 837E 7F82" $"807E 8080 7D80 827F 8180 7E7F 807F 7F82" $"8080 827D 7E82 7F7C 8084 7F7E 817F 7E7F" $"8081 817F 7E81 807E 7F81 827F 7E7F 8181" $"7C80 8380 7D7F 837E 7D82 817F 7D81 817E" $"807F 8181 7E7F 8180 7D7F 8380 7D7F 8280" $"7E80 8282 7D7C 8282 7D7E 8282 7D7E 8080" $"807F 8081 807E 7E81 7F7E 8081 807F 8080" $"7F7F 8081 7F7F 8180 7F7F 7F80 7F7F 7F81" $"817F 7F7F 8080 7F80 8282 7E7E 817F 7E80" $"8181 807E 7E80 807E 8083 817E 7E80 807D" $"7E82 847E 7D81 807D 7F82 8180 807E 807F" $"7E80 8280 7F80 807E 7F7F 8182 7F80 8280" $"7C80 837E 7E82 827E 7E80 8080 7F7F 8281" $"7F7F 8080 7E80 8081 817E 8081 7F7F 8183" $"7F7F 817F 7E7F 8081 8181 807F 7F7F 8080" $"8282 807E 807F 7D80 8281 8180 807F 7E7F" $"8083 8180 8080 7F7D 8082 8181 8181 7F7E" $"8080 8180 7F82 807E 7F81 807F 8181 807F" $"8080 8180 7F82 827E 7F82 817F 8081 8180" $"7F7E 8181 7F80 8280 7E80 817F 8081 8180" $"7F7F 8080 7F80 8180 807F 7F81 807F 8082" $"807E 8181 7F7F 8181 8080 7F80 817E 8083" $"807F 8181 7E7F 8180 8181 7E80 817F 7E82" $"837E 7E81 807F 8081 8181 7F7E 8181 7F80" $"8281 807F 7F7F 8080 8181 817F 7E80 8080" $"8082 8180 807E 7E81 817F 8083 7F7E 807F" $"8081 8080 8082 7F7E 8080 7F7E 8081 8080" $"8080 807F 7F7F 8081 7F80 8180 7F7E 7F81" $"817F 7F81 807D 8081 7F80 817F 7E80 7F7E" $"8182 7F80 807F 7F80 807F 8181 7E7E 8080" $"807F 8182 7F7E 7F80 807E 8081 817F 7E80" $"7F7F 807F 8081 807D 8082 7E7D 8181 7E80" $"817E 8080 7D7F 8280 7D80 827F 7E80 7F80" $"807F 8081 7F7E 8080 7E80 817E 7F81 7F7E" $"7F81 807F 807F 7F80 7F7F 8081 7E7E 8380" $"7D80 8180 7E80 807F 807E 8082 7E7E 8181" $"7E80 817E 7F80 7F80 817F 7F80 7E7E 8181" $"8080 817F 7F7F 7F81 807E 8181 7E7E 8180" $"7F81 807F 807E 7F81 807E 8082 7F7E 8080" $"8080 807F 8080 7E80 8280 8081 807F 7F81" $"7E7F 827F 7F81 807E 8081 7E7F 827F 7F82" $"7F7D 8181 7E80 827F 8082 7F7F 817F 7E82" $"827F 8082 7E7F 817E 7F82 807F 8180 7D80" $"817F 8181 7F7F 8080 8080 8080 827F 7D81" $"807F 8081 807F 817E 7F81 7F80 8280 7E80" $"817F 8081 8082 807D 7F82 7F7D 8282 7F7F" $"817F 7F81 8080 8281 7F80 817E 7F81 8080" $"8181 7F7F 807F 8081 7F81 827F 7F81 817D" $"8083 7F80 8180 7F80 807F 8282 7D7F 817F" $"7F81 8180 807F 7F81 7F7F 8181 7F80 817F" $"7F81 7F80 827F 7F81 807F 8080 7F80 8080" $"8181 7F80 817D 7F82 807F 8181 7E80 807F" $"8181 7F80 817F 7D80 817F 8080 8180 7E80" $"8081 807F 8180 7F80 8080 7F80 807F 8080" $"8080 8180 7E80 807F 8181 7F80 817E 7F81" $"807F 8081 7F7F 7F7E 8181 7E7F 807F 7E80" $"817F 8180 7E7F 7F80 8081 817F 7F7E 7F80" $"8080 8081 807F 7E7F 8180 7F81 807F 7F7F" $"7F81 817F 7F80 7F7F 8180 8080 7E7E 807F" $"7F81 817F 7F7F 7F80 807F 8080 7F7E 8080" $"7F7F 7F80 807E 7F81 7F80 817F 7E80 817F" $"8081 7E7F 7F7E 7F81 817F 8080 7D7F 8080" $"8181 807F 7F7E 7F81 807F 8180 7E7E 8180" $"7E81 817F 7E80 807F 8080 8081 807E 7F81" $"7F7E 8181 7E7F 8180 8080 7E80 807F 8082" $"807E 8180 7C80 8280 7F80 807F 7F7E 8083" $"807F 8180 7D7D 8081 8180 7F80 7F7D 7F81" $"8180 8080 7F7F 7F80 8180 7F80 7F7E 7F81" $"8181 807F 7E7F 8080 8181 807F 7F7F 8081" $"8180 8080 807F 8081 807F 7F7F 7F80 7F80" $"8280 7E7F 7F7F 8181 8081 817E 7D81 817F" $"8181 7F7F 7F7E 8082 8080 8280 7D7F 8080" $"8181 8080 807F 7F80 8080 8180 7F80 8180" $"7F81 8180 8080 8081 807F 8081 7F80 8080" $"8080 8080 8080 7F81 817F 807F 7E80 8081" $"8180 807F 807F 7F81 8180 807F 7F7F 7F81" $"8181 807F 7F7F 7F80 8081 8080 7F7F 8080" $"8080 807F 7F80 7F80 8281 7F7F 7F7F 7F81" $"8181 807F 7F80 7F80 8181 807F 807F 7F81" $"8180 7F7F 8080 8080 8181 7F7E 807F 7F80" $"8180 7F7F 7E7F 8080 8181 807F 7E7E 8081" $"8181 807E 7F7F 7E80 8180 8080 7F7F 8080" $"8081 807E 7F7F 7E80 8180 8081 7F7E 8080" $"8080 7F80 807F 7F80 817F 7F80 8080 7F80" $"8280 7E7F 8080 8080 8080 7F7E 8080 8080" $"8180 7E7F 7F7F 7F80 8180 7E7E 7F7F 8080" $"8080 7F7F 8080 8080 8180 7E7F 8080 7F80" $"8180 7E7E 7F82 817F 8080 7E7D 8080 8081" $"807F 7F7F 7E80 8180 8081 7E7D 8080 7F81" $"817F 7E7E 7E80 8180 8080 7F7E 7F80 8180" $"8080 807F 7F80 8080 8080 807F 7F80 7F7F" $"8080 807F 7F80 8080 7F7F 8080 7F7F 8080" $"7F7F 7F7F 7F80 8180 7F7F 7F7F 7F80 8180" $"807E 7F80 8080 8181 7F7F 807F 7F80 8080" $"807F 7F80 807F 8081 7F80 817F 7E80 807F" $"8080 7F80 807F 8081 7F7F 8080 7F7F 8080" $"807F 7F80 807F 8080 807F 8080 7F80 8180" $"7F7F 8080 8080 8080 807F 7F80 807F 8081" $"807F 7F7F 8080 8081 817F 7F80 8080 8080" $"8080 7F7F 8080 8080 8180 7F80 7F80 8180" $"8081 7F7E 8080 7F80 8180 8080 7F80 8181" $"8080 807F 7F80 7F80 8080 8080 8080 8080" $"7F80 8080 7F81 817F 7F80 8080 8080 8081" $"7F7E 8080 7F80 8081 8180 7E80 807F 8081" $"8080 7F80 8080 7F80 817F 7F81 817F 7F80" $"807F 7F81 8180 7F7F 8080 7F81 8180 807F" $"7F7F 7F80 8081 8080 807F 7F80 8180 7F80" $"807F 7E80 8180 7F80 807F 8080 8181 807F" $"7F7F 7F80 8080 8080 7F7F 8080 8180 7F7F" $"807F 7F80 8180 7F7F 8080 7E80 8280 7E7F" $"807F 8080 8080 807E 7F80 7E7F 8181 7F7F" $"8080 7F7F 8182 7F7E 8081 7E7F 8180 7F7F" $"8080 7F80 8080 7F7F 8080 7F7F 8080 807E" $"7F81 807E 8081 7F7E 7F80 807F 7F80 807E" $"7F80 807F 8180 7F7F 807F 7F7F 8080 7F7E" $"7F80 7F7F 8181 807E 7F80 807F 8081 7F7E" $"807F 7F80 8180 7F80 7F80 807E 8081 7F7E" $"8081 8080 8080 7F7F 7F80 817F 7F81 7F7F" $"8080 7F7F 8080 7F7E 8080 807F 7F80 807F" $"7F80 8180 7F7F 807F 8080 8080 807F 7F80" $"7F7F 8080 8080 7F7F 7F80 7F80 8180 7F7F" $"7F7F 8080 8080 807F 7E7F 7F80 8081 807F" $"7F7F 7F7F 8081 807F 7F7F 7F7F 7F81 8180" $"7F7F 807F 7F80 8080 8080 7F80 807F 8080" $"7F80 807F 7F80 8080 8080 8080 7F7F 8080" $"7F7F 8080 8080 7F7F 807F 8080 807F 807F" $"7F80 8080 807F 7F80 7F7F 8081 7F7F 8080" $"8080 7F80 817F 7F80 807F 8081 7F7F 8080" $"8080 8081 807F 7F81 7F7F 8181 7F7F 7F80" $"807F 7F81 817F 7F80 807F 8080 8180 7E80" $"8180 7F80 807F 8080 8080 7F80 8180 7F7F" $"8180 7F80 8080 7F7F 8080 7F80 8080 7F80" $"7F80 8080 8081 7F7F 8080 7F80 8180 7F80" $"7F7F 8180 8081 807F 8080 7F80 8080 8080" $"7E7F 8080 8080 807F 7F7F 7F80 8180 7F80" $"8080 7F7F 8180 807F 8080 8080 7F80 807F" $"7F80 807F 807F 7F80 8080 7F7F 8080 7F7F" $"8080 7F7F 807F 7F7F 8080 8080 8080 7F80" $"8080 807F 8080 7F7F 8081 7F7F 8080 7F7F" $"8080 8080 7F7F 8080 7F80 817F 7F7F 7F80" $"7F80 8080 7F7F 7F7F 7F80 8080 7F7F 807F" $"7F80 8181 7F7F 8080 7F7E 8081 7F7E 7F80" $"7F7F 8081 807E 7E81 807E 8081 7F7E 7F7F" $"8080 7F81 817E 7E7F 807F 7F82 807E 7F7F" $"8080 7F81 8280 7E7F 807F 7F80 8180 7F7F" $"7F7F 7F7F 8081 7F7F 8080 7E7F 8180 7F7F" $"8080 7F7F 8080 807E 7F81 807E 7F80 807F" $"7F80 8080 7F7F 8080 7F80 807F 7F81 807E" $"8081 7F7E 7F80 8080 8080 807F 7E7F 8180" $"7F81 807E 7F7F 8080 8080 8080 7E7F 8180" $"7F80 817F 7E80 8080 807F 7F80 7F7E 8081" $"8080 7F7F 7F7F 8080 8181 807F 7F80 7F80" $"8181 807F 7F7F 8080 8081 817F 7E7F 7F7F" $"8181 807F 7F7F 7F80 8081 817F 7E80 807E" $"7F82 817F 7E80 807F 7F80 8180 7E7F 8080" $"7F81 817F 7E80 807F 7F81 807F 7F7F 8081" $"7F7F 8281 7E7F 8180 7F80 8080 807F 7F81" $"807F 8080 7F7F 8180 7F7F 8080 7F80 8181" $"807F 7F80 807F 8082 807F 7F80 7F7F 8080" $"8080 7F7F 8080 7F80 817F 7F80 807F 8080" $"8080 7F7F 8080 7F80 817F 7E80 8080 8080" $"8180 7F7F 8080 7F80 8080 807F 7F80 8080" $"8181 7F7F 7F7F 8180 7F80 807F 7F80 807F" $"8080 7F7F 7F7F 8181 7F7F 8180 7E7F 8181" $"807F 7F80 7F7F 8081 807F 8080 7F7F 8080" $"8080 7F80 7F7F 8081 807F 7F7F 7F7E 7F81" $"817F 7F80 807F 7F80 8180 7F7F 817F 7F80" $"807F 8080 7F80 7F7F 8080 7F7F 817F 7F80" $"8080 7F7F 8080 807F 8080 7F7F 8080 8080" $"7F7F 807F 7F80 807F 807F 7F7F 7F80 8080" $"7F80 7F7F 7F80 7F80 807F 7F80 7F7F 8080" $"7F7F 7F7F 7F80 7F80 807E 7F80 807F 8081" $"807F 7F7F 807F 8081 807E 7E80 807F 8081" $"807F 7E7F 807F 7F81 817E 7E7F 8080 8080" $"8180 7D7E 8080 8080 8080 7F7E 7F81 8080" $"8180 7E7F 807F 8080 8080 7F7E 7F81 807F" $"8080 7F7F 7F80 8080 7F80 807F 7F80 7F80" $"807F 7F7F 7F80 8180 7F80 7F7F 7F7F 8080" $"807F 8080 7F80 8080 8080 807F 7F7F 7F80" $"8080 807F 7F80 807F 8080 8080 7F7F 8080" $"7F7F 8080 7F80 7F80 807F 7F80 7F7F 8080" $"7F80 7F7F 8080 7F80 817F 7F80 7F80 8080" $"8081 807F 8080 7F80 8080 8080 8080 807F" $"8080 807F 8080 8080 7F80 8080 7F80 8080" $"7F80 7F80 7F7F 8080 7F7F 8080 8080 8080" $"7F7F 8080 807F 8181 7F7F 8080 7F80 8080" $"807F 7F80 8080 8080 7F7F 807F 8080 8080" $"807F 7F80 7F7F 8080 7F7F 7F7F 807F 7F81" $"807F 7F80 807F 8080 8080 7F80 807F 8080" $"807F 7F80 7F7F 807F 8080 7F7F 807F 7F80" $"8080 807F 8080 7F7F 8080 7F7F 807F 7F7F" $"8080 807F 7F80 807F 807F 8080 807F 807F" $"7F80 807F 8080 7F80 807F 7F80 7F7F 8080" $"7F80 807F 807F 7F80 807F 7F80 7F7F 8080" $"8080 7F7F 8080 7F80 807F 8080 7F80 8080" $"807F 7F80 807F 7F80 8080 807F 8080 7F7F" $"8080 7F80 807F 7F80 7F7F 807F 7F80 807F" $"807F 7F80 807F 807F 7F80 807F 8080 7F80" $"807F 7F80 7F80 8080 7F80 7F7F 7F80 8080" $"807F 7F7F 7F80 817F 7F7F 7F7F 8080 8080" $"7F7F 8080 7F80 8180 7F80 7F80 807F 8080" $"807F 7F7F 7F80 7F7F 807F 7F7F 807F 8080" $"807F 7F7F 7F7F 8080 807F 7F80 7F7F 8080" $"7F7F 7F7F 8080 7F80 8080 7F7F 7F80 807F" $"7F80 7F7F 8080 7F7F 807F 7F7F 7F80 807F" $"8080 807F 8080 807F 7F80 807F 8080 807F" $"7F7F 8081 8080 8180 7E7F 807F 8081 807F" $"7F7F 7F80 7F80 8180 7F7F 807F 807F 8080" $"7F7F 8080 7F7F 8180 7F80 807F 8080 8080" $"807F 8080 8080 807F 7F80 7F80 8080 8080" $"7F7F 8081 8080 807F 7F7F 7F80 807F 8080" $"7F7F 8080 8080 7F7F 8080 7F80 807F 8080" $"7F7F 8080 7F80 807F 7F80 7F80 8080 807F" $"7F80 8080 7F7F 8080 7F7F 8081 807F 8080" $"7F7F 7F80 8080 7F80 807F 7F80 8080 7F80" $"8080 7F80 8080 7F80 807F 7F80 7F7F 8080" $"7F80 7F80 8080 7F80 807F 8080 807F 7F80" $"807F 7F80 807F 7F80 807F 8080 8080 8080" $"8080 7F80 8080 7F7F 8080 7F80 8080 7F80" $"807F 8080 807F 7F80 807F 8080 7F7F 7F7F" $"8080 7F7F 8080 7F7F 8080 7F80 807F 8080" $"7F80 807F 7F80 807F 7F80 8080 807F 807F" $"7F80 8080 7F80 7F80 807F 7F80 807F 8080" $"807F 807F 807F 7F80 807F 8080 7F80 807F" $"8080 807F 807F 7F7F 807F 8080 7F7F 7F7F" $"8080 807F 807F 7F80 807F 8080 7F7F 807F" $"7F80 8080 8080 7F7F 8080 7F80 807F 807F" $"7F80 7F80 807F 8080 7F7F 8080 8080 7F7F" $"807F 7F7F 8080 7F7F 8080 8080 8080 7F80" $"807F 8080 807F 807F 7F80 7F7F 807F 8080" $"7F7F 8080 7F7F 8080 7F7F 7F80 807F 7F7F" $"807F 7F7F 8080 7F7F 8080 7F7F 7F80 7F80" $"7F80 807F 7F80 7F7F 807F 7F80 7F7F 7F80" $"8080 8080 7F80 7F7F 8080 807F 807F 7F7F" $"8080 8080 807F 7F80 7F80 7F80 807F 807F" $"7F80 8080 8080 8080 7F80 8080 8080 7F7F" $"7F80 8080 8080 7F80 8080 8080 8080 7F7F" $"8080 7F7F 8080 807F 7F80 8080 7F80 807F" $"7F7F 8080 7F7F 807F 7F80 8080 8080 807F" $"7F7F 8080 7F80 807F 7F7F 807F 8080 807F" $"7F7F 8080 7F80 7F80 807F 807F 8080 8080" $"7F7F 8080 7F80 8080 7F80 7F7F 8080 8080" $"807F 7F80 8080 807F 807F 7F80 807F 8080" $"7F80 807F 7F80 807F 8080 7F7F 8080 7F80" $"8080 7F80 807F 7F80 8080 7F80 807F 7F80" $"8080 807F 7F80 807F 8080 807F 807F 7F80" $"807F 7F80 7F80 807F 8080 7F80 807F 8080" $"8080 807F 7F80 807F 8080 7F80 807F 7F80" $"8080 807F 7F7F 807F 8080 8080 807F 7F80" $"7F7F 8080 7F7F 7F7F 7F80 8080 807F 7F80" $"7F80 8080 7F7F 807F 7F80 8080 8080 7F7F" $"7F7F 8080 8080 807F 7F7F 8080 807F 8080" $"7F7F 7F80 7F80 7F80 7F7F 7F7F 7F80 7F7F" $"807F 7F80 8080 7F7F 8080 7F7F 7F7F 8080" $"807F 8080 7F80 7F7F 8080 7F80 807F 7F80" $"807F 7F80 7F7F 7F80 7F80 807F 807F 7F80" $"8080 807F 7F80 807F 8080 807F 807F 7F7F" $"807F 8080 807F 7F80 7F80 8080 7F7F 8080" $"8080 7F80 8080 7F80 807F 7F80 7F7F 807F" $"8080 7F80 807F 7F80 807F 8080 7F7F 8080" $"8080 8080 807F 7F80 807F 7F80 7F7F 8080" $"8080 7F80 8080 7F80 8080 7F7F 8080 7F7F" $"8080 8080 7F7F 807F 7F80 807F 7F80 7F7F" $"8080 8080 807F 807F 7F80 8080 8080 807F" $"8080 8080 8080 8080 7F80 8080 8080 7F7F" $"8080 7F80 8080 8080 7F7F 8080 8080 8080" $"7F7F 807F 8080 8080 7F80 807F 8080 8080" $"8080 7F80 7F80 8080 7F80 807F 7F80 8080" $"7F7F 8080 7F80 8080 7F80 807F 8080 8080" $"807F 7F80 807F 8080 807F 8080 7F80 8080" $"8080 807F 7F80 8080 8080 8080 7F80 7F80" $"8080 8080 807F 8080 8080 8080 7F7F 8080" $"8080 8080 8080 807F 8080 8080 8080 7F80" $"7F80 8080 8080 8080 7F7F 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080 8080 8080 8080 8080 8080" $"8080 8080 8080" } }; slashem-0.0.7E7F3/sys/mac/mttymain.c0000664000076400007640000002710210545462317015242 0ustar aliali/* SCCS Id: @(#)mttymain.c 3.1 93/02/26 */ /* Copyright (c) Jon W{tte, 1993 */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" #include "macwin.h" #include "mttypriv.h" #include "mactty.h" #include "wintty.h" #if !TARGET_API_MAC_CARBON #include #endif #define MT_WINDOW 135 #define MT_WIDTH 80 #define MT_HEIGHT 24 /* * Names: * * Statics are prefixed _ * Mac-tty becomes mt_ */ static long _mt_attrs [5] [2] = { { 0x000000, 0xffffff }, /* Normal */ { 0xff8080, 0xffffff }, /* Underline */ { 0x40c020, 0xe0e0e0 }, /* Bold */ { 0x003030, 0xff0060 }, /* Blink */ { 0xff8888, 0x000000 }, /* Inverse */ }; static char _attrs_inverse [5] = { 0, 0, 0, 0, 0 , }; /* see color.h */ static long _mt_colors [CLR_MAX] [2] = { { 0x000000, 0x808080 }, /* Black */ { 0x880000, 0xffffff }, /* Red */ { 0x008800, 0xffffff }, /* Green */ { 0x553300, 0xffffff }, /* Brown */ { 0x000088, 0xffffff }, /* Blue */ { 0x880088, 0xffffff }, /* Magenta */ { 0x008888, 0xffffff }, /* Cyan */ { 0x888888, 0xffffff }, /* Gray */ { 0x000000, 0xffffff }, /* No Color */ { 0xff4400, 0xffffff }, /* Orange */ { 0x00ff00, 0xffffff }, /* Bright Green */ { 0xffff00, 0x606060 }, /* Yellow */ { 0x0033ff, 0xffffff }, /* Bright Blue */ { 0xff00ff, 0xffffff }, /* Bright Magenta */ { 0x00ffff, 0xffffff }, /* Bright Cyan */ { 0xffffff, 0x505050 }, /* White */ }; static char _colors_inverse [CLR_MAX] = { 1, 0, 0, 0 , 0, 0, 0, 0 , 0, 0, 0, 0 , 0, 0, 0, 0 , }; #ifdef CHANGE_COLOR #define POWER_LIMIT 22 #define SECONDARY_POWER_LIMIT 16 #define CHANNEL_LIMIT 14 #define SECONDARY_CHANNEL_LIMIT 12 void tty_change_color (int color, long rgb, int reverse) { long inverse, working_rgb = rgb; int total_power = 0, max_channel = 0; int cnt = 3; working_rgb >>= 4; while (cnt -- > 0) { total_power += working_rgb & 0xf; max_channel = max (max_channel, working_rgb & 0xf); working_rgb >>= 8; } if (total_power >= POWER_LIMIT || (total_power >= SECONDARY_POWER_LIMIT && max_channel >= SECONDARY_CHANNEL_LIMIT) || max_channel >= CHANNEL_LIMIT) inverse = 0x000000; else inverse = 0xffffff; if (reverse) { working_rgb = rgb; rgb = inverse; inverse = working_rgb; } if (color >= CLR_MAX) { if (color - CLR_MAX >= 5) impossible ("Changing too many colors"); else { _mt_attrs [color - CLR_MAX] [0] = rgb; _mt_attrs [color - CLR_MAX] [1] = inverse; _attrs_inverse [color - CLR_MAX] = reverse; } } else if (color >= 0) { _mt_colors [color] [0] = rgb; _mt_colors [color] [1] = inverse; _colors_inverse [color] = reverse; } else impossible ("Changing negative color"); } void tty_change_background (int white_or_black) { register int i; for (i = 0; i < CLR_MAX; i++) { if (white_or_black) _mt_colors [i] [1] = 0xffffff; /* white */ else _mt_colors [i] [1] = 0x000000; /* black */ } /* special cases */ if (white_or_black) { _mt_colors [CLR_BLACK] [1] = 0x808080; /* differentiate black from no color */ _mt_colors [CLR_WHITE] [1] = 0x505050; /* highlight white with grey background */ _mt_colors [CLR_YELLOW] [1] = 0x606060; /* highlight yellow with grey background */ _mt_colors [CLR_BLUE] [0] = 0x000088; /* make pure blue */ _mt_colors [NO_COLOR] [0] = 0x000000; /* make no_color black on white */ _mt_attrs [0] [0] = 0x000000; /* "normal" is black on white */ _mt_attrs [0] [1] = 0xffffff; } else { _mt_colors [NO_COLOR] [0] = 0xffffff; /* make no_color white on black */ _mt_colors [CLR_BLACK] [1] = 0x808080; /* differentiate black from no color */ _mt_colors [CLR_BLUE] [0] = 0x222288; /* lighten blue - it's too dark on black */ _mt_attrs [0] [0] = 0xffffff; /* "normal" is white on black */ _mt_attrs [0] [1] = 0x000000; } } char * tty_get_color_string (void) { char *ptr; int count; static char color_buf [5 * (CLR_MAX + 5) + 1]; color_buf [0] = 0; ptr = color_buf; for (count = 0; count < CLR_MAX; count ++) { int flag = _colors_inverse [count] ? 1 : 0; sprintf (ptr, "%s%s%x%x%x", count ? "/" : "" , flag ? "-" : "" , (int)(_mt_colors [count] [flag] >> 20) & 0xf , (int)(_mt_colors [count] [flag] >> 12) & 0xf , (int)(_mt_colors [count] [flag] >> 4) & 0xf); ptr += strlen (ptr); } for (count = 0; count < 5; count ++) { int flag = _attrs_inverse [count] ? 1 : 0; sprintf (ptr, "/%s%x%x%x" , flag ? "-" : "" , (int)(_mt_attrs [count] [flag] >> 20) & 0xf , (int)(_mt_attrs [count] [flag] >> 12) & 0xf , (int)(_mt_attrs [count] [flag] >> 4) & 0xf); ptr += strlen (ptr); } return color_buf; } #endif extern struct DisplayDesc *ttyDisplay; /* the tty display descriptor */ char kill_char = CHAR_ESC; char erase_char = CHAR_BS; WindowRef _mt_window = (WindowRef) 0; static Boolean _mt_in_color = 0; extern short win_fonts [NHW_TEXT + 1]; static void _mt_init_stuff (void) { long resp, flag; short num_cols, num_rows, win_width, win_height, font_num, font_size; short char_width, row_height; short hor, vert; LI = MT_HEIGHT; CO = MT_WIDTH; if (!strcmp(windowprocs.name, "mac")) { dprintf ("Mac Windows"); LI -= 1; } else { dprintf ("TTY Windows"); } /* * If there is at least one screen CAPABLE of color, and if * 32-bit QD is there, we use color. 32-bit QD is needed for the * offscreen GWorld */ if (!Gestalt (gestaltQuickdrawVersion, &resp) && resp > 0x1ff) { GDHandle gdh = GetDeviceList (); while (gdh) { if (TestDeviceAttribute (gdh, screenDevice)) { if (HasDepth (gdh, 4, 1, 1) || HasDepth (gdh, 8, 1, 1) || HasDepth (gdh, 16, 1, 1) || HasDepth (gdh, 32, 1, 1)) { _mt_in_color = 1; break; } } gdh = GetNextDevice (gdh); } } if (create_tty (&_mt_window, WIN_BASE_KIND + NHW_MAP, _mt_in_color) != noErr) error("_mt_init_stuff: Couldn't create tty."); SetWindowKind(_mt_window, WIN_BASE_KIND + NHW_MAP); SelectWindow(_mt_window); SetPortWindowPort(_mt_window); SetOrigin(-1, -1); font_size = iflags.wc_fontsiz_map ? iflags.wc_fontsiz_map : (iflags.large_font && !small_screen) ? 12 : 9; if (init_tty_number (_mt_window, win_fonts [NHW_MAP], font_size, CO, LI) != noErr) error("_mt_init_stuff: Couldn't init tty."); if (get_tty_metrics (_mt_window, &num_cols, &num_rows, &win_width , &win_height, &font_num, &font_size, &char_width, &row_height)) error("_mt_init_stuff: Couldn't get tty metrics."); SizeWindow (_mt_window, win_width + 2, win_height + 2, 1); if (RetrievePosition (kMapWindow, &vert, &hor)) { dprintf ("Moving window to (%d,%d)", hor, vert); MoveWindow (_mt_window, hor, vert, 1); } ShowWindow (_mt_window); /* Start in raw, always flushing mode */ get_tty_attrib(_mt_window, TTY_ATTRIB_FLAGS, &flag); flag |= TA_ALWAYS_REFRESH | TA_WRAP_AROUND; set_tty_attrib(_mt_window, TTY_ATTRIB_FLAGS, flag); get_tty_attrib(_mt_window, TTY_ATTRIB_CURSOR, &flag); flag |= (TA_BLINKING_CURSOR | TA_NL_ADD_CR); set_tty_attrib(_mt_window, TTY_ATTRIB_CURSOR, flag); set_tty_attrib(_mt_window, TTY_ATTRIB_FOREGROUND, _mt_colors[NO_COLOR][0]); set_tty_attrib(_mt_window, TTY_ATTRIB_BACKGROUND, _mt_colors[NO_COLOR][1]); clear_tty (_mt_window); InitMenuRes (); } int tgetch (void) { EventRecord event; long sleepTime = 0; int ret = 0; for (;!ret;) { WaitNextEvent (-1, &event, sleepTime, 0); HandleEvent (&event); blink_cursor (_mt_window, event.when); if (event.what == nullEvent) { sleepTime = GetCaretTime (); } else { sleepTime = 0; } ret = GetFromKeyQueue (); if (ret == '\r') ret = '\n'; } return ret; } void getreturn (char *str) { FlushEvents (-1, 0); msmsg ("Press space %s", str); (void) tgetch (); } int has_color (int color) { #if defined(MAC_MPW) # pragma unused(color) #endif Rect r; // Point p = {0, 0}; GDHandle gh; if (!_mt_in_color) return 0; GetWindowBounds(_mt_window, kWindowContentRgn, &r); // SetPortWindowPort(_mt_window); // LocalToGlobal (&p); // OffsetRect (&r, p.h, p.v); gh = GetMaxDevice (&r); if (!gh) { return 0; } return (*((*gh)->gdPMap))->pixelSize > 4; /* > 4 bpp */ } void tty_delay_output (void) { EventRecord event; long toWhen = TickCount () + 3; while (TickCount () < toWhen) { WaitNextEvent (updateMask, &event, 3L, 0); if (event.what == updateEvt) { HandleEvent (&event); blink_cursor (_mt_window, event.when); } } } void cmov (int x, int y) { move_tty_cursor (_mt_window, x, y); ttyDisplay->cury = y; ttyDisplay->curx = x; } void nocmov (int x, int y) { cmov (x, y); } static void _mt_set_colors (long *colors) { short err; if (!_mt_in_color) { return; } err = set_tty_attrib (_mt_window, TTY_ATTRIB_FOREGROUND, colors [0]); err = set_tty_attrib (_mt_window, TTY_ATTRIB_BACKGROUND, colors [1]); } void term_end_attr (int attr) { #if defined(MAC_MPW) # pragma unused (attr) #endif _mt_set_colors (_mt_attrs [0]); } void term_start_attr (int attr) { switch (attr) { case ATR_ULINE: _mt_set_colors (_mt_attrs [1]); break; case ATR_BOLD: _mt_set_colors (_mt_attrs [2]); break; case ATR_BLINK: _mt_set_colors (_mt_attrs [3]); break; case ATR_INVERSE: _mt_set_colors (_mt_attrs [4]); break; default: _mt_set_colors (_mt_attrs [0]); break; } } void standoutend (void) { term_end_attr (ATR_INVERSE); } void standoutbeg (void) { term_start_attr (ATR_INVERSE); } void term_end_color (void) { _mt_set_colors (_mt_colors [NO_COLOR]); } void cl_end (void) { _mt_set_colors (_mt_attrs [0]); clear_tty_window (_mt_window, ttyDisplay->curx, ttyDisplay->cury, CO - 1, ttyDisplay->cury); } void clear_screen (void) { _mt_set_colors (_mt_attrs [0]); clear_tty (_mt_window); } void cl_eos (void) { _mt_set_colors (_mt_attrs [0]); clear_tty_window (_mt_window, ttyDisplay->curx, ttyDisplay->cury, CO - 1, LI - 1); } void home (void) { cmov (0,0); } void backsp (void) { char eraser [] = { CHAR_BS, CHAR_BLANK, CHAR_BS, 0 }; short err; err = add_tty_string (_mt_window, eraser); err = update_tty (_mt_window); } void msmsg (const char *str, ...) { va_list args; char buf [1000]; va_start (args, str); vsprintf (buf, str, args); va_end (args); xputs (buf); } void term_end_raw_bold (void) { term_end_attr (ATR_INVERSE); } void term_start_raw_bold (void) { term_start_attr (ATR_INVERSE); } void term_start_color (int color) { if (color >= 0 && color < CLR_MAX) { _mt_set_colors (_mt_colors [color]); } } void setftty (void) { long flag; /* Buffered output for the game */ get_tty_attrib (_mt_window, TTY_ATTRIB_FLAGS, &flag); flag &= ~ TA_ALWAYS_REFRESH; flag |= TA_INHIBIT_VERT_SCROLL; /* don't scroll */ set_tty_attrib (_mt_window, TTY_ATTRIB_FLAGS, flag); iflags.cbreak = 1; } void tty_startup (int *width, int *height ) { _mt_init_stuff (); *width = CO; *height = LI; } void gettty (void) { } void settty (const char *str) { long flag; update_tty (_mt_window); /* Buffered output for the game, raw in "raw" mode */ get_tty_attrib(_mt_window, TTY_ATTRIB_FLAGS, &flag); flag &= ~ TA_INHIBIT_VERT_SCROLL; /* scroll */ flag |= TA_ALWAYS_REFRESH; set_tty_attrib(_mt_window, TTY_ATTRIB_FLAGS, flag); tty_raw_print ("\n"); if (str) { tty_raw_print (str); } } void tty_number_pad (int arg) { #if defined(MAC_MPW) # pragma unused(arg) #endif } void tty_start_screen (void) { iflags.cbreak = 1; } void tty_end_screen (void) { } void xputs (const char *str) { add_tty_string (_mt_window, str); } int term_puts (const char *str) { xputs (str); return strlen (str); } int term_putc (int c) { short err; err = add_tty_char (_mt_window, c); return err ? EOF : c; } int term_flush (void *desc) { if (desc == stdout || desc == stderr) { update_tty (_mt_window); } else { impossible ("Substituted flush for file"); return fflush (desc); } return 0; } slashem-0.0.7E7F3/sys/mac/Macintosh.make0000664000076400007640000004332610545462317016026 0ustar aliali# This is a complete MPW makefile for Nethack and all its associated files # Requires MPW C3.2§3 or later. Earlier versions will fail horribly because # they can't cope with /* /* */ comments # # For NetHack 3.1 Nov 1991 # # by Michaelª Hamel and Ross Brown 1991 : michael@otago.ac.nz # # Updated for Slash'EM 0.0.5-2 and later # Paul Hurtley, August 1999 and later #-------------------------------------------------------------------------- # # BEFORE YOU BUILD FOR THE FIRST TIME # Set this equate to the folder containing all the Slash'EM source folders Top = Vance:SlashEM:SlashEM-OS9:slashem-cvs:slashem: # Choose your target processor. There are bugs in the 68K version, so I # recommend you select 'PowerPC' Processor = PowerPC #Processor = 68K #Processor = Fat # Choose a Debug (ie, -sym) or non-Debug build #Debug = -sym Debug = #-------------------------------------------------------------------------- # # Set up symbols for folders from the distribution Src = {Top}Src: Util = {Top}Util: Dat = {Top}Dat: Doc = {Top}Doc: Include = {Top}Include: MacDir = {Top}Sys:Mac: TtyDir = {Top}Win:Tty: MacTty = {Top}Sys:Mac: Share = {Top}Sys:Share: # These folders are new ObjDir = {Top}:Obj{Processor}{Debug}: # "Temporary" stuff LibDir = {Top}:Lib: # "Temporary" stuff Preserve = {Top}:Preserve: # Generated items for source distribution Results = {Top}:Dungeon{Processor}{Debug}: # Where the game goes # Override the settings in "{Include}"config.h # NHConfig = -d PORT_LEVEL='¶".0¶"' # Type and creator - note that we use "PREF" for all non-save files # currently. Since we will integrate the data files into the game # sooner or later, this doesn't matter much. FileType = PREF SlashEMCreator = slEm RecoverCreator = slRc # # Yacc/Lex ... if you got 'em, set the following to values appropriate for # your tools. # YACC = bison -y LEX = flex YTabC = y.tab.c YTabH = y.tab.h LexYYC = lex.yy.c # Macintosh is an abstract target which in fact consists of: # The following files are in the binary distribution DataFiles = "{Results}"Guidebook ¶ "{Results}"MacHelp ¶ "{Results}"License ¶ "{Results}"Slash¶'EM¶ Defaults ¶ "{Results}"README # The following files are generated, but included in the source distribution anyway Preserved = "{Preserve}"date.h ¶ "{Preserve}"pm.h ¶ "{Preserve}"onames.h ¶ "{Preserve}"monstr.c ¶ "{Preserve}"vis_tab.h ¶ "{Preserve}"vis_tab.c ¶ "{Preserve}"filename.h ¶ "{Preserve}"lev_yacc.c ¶ "{Preserve}"lev_comp.h ¶ "{Preserve}"dgn_yacc.c ¶ "{Preserve}"dgn_comp.h Macintosh Ä Setup ¶ MakeDefs.lnk ¶ {Preserved} ¶ LevComp.lnk ¶ DgnComp.lnk ¶ {DataFiles} ¶ Recover.lnk ¶ SlashEM.lnk Setup Ä If Not "`Exists -d "{Results}"`" NewFolder "{Results}" End If Not "`Exists -d "{ObjDir}"`" NewFolder "{ObjDir}" End If Not "`Exists -d "{Preserve}"`" NewFolder "{Preserve}" End If Not "`Exists -d "{LibDir}"`" NewFolder "{LibDir}" End COptions = {NHConfig} ¶ -w 2 -w 3 -ansi relaxed -typecheck relaxed -align power #------------------- Files included as resources ----------------- FileResources = ¶ "{Dat}"cmdhelp ¶ "{Dat}"help ¶ "{Dat}"hh ¶ "{Dat}"history ¶ "{Dat}"license ¶ "{MacDir}"MacHelp ¶ "{MacDir}"News ¶ "{Dat}"opthelp ¶ "{Dat}"wizhelp ¶ "{LibDir}"Quest.dat ¶ "{LibDir}"data ¶ "{LibDir}"dungeon ¶ "{LibDir}"options ¶ "{LibDir}"oracles ¶ "{LibDir}"rumors ¶ Levels #------------------- Slash'EM Sources ----------------- SlashEMSrcs = ¶ "{Src}"allmain.c ¶ "{Src}"alloc.c ¶ "{Src}"apply.c ¶ "{Src}"artifact.c ¶ "{Src}"attrib.c ¶ "{Src}"ball.c ¶ "{Src}"bones.c ¶ "{Src}"borg.c ¶ "{Src}"botl.c ¶ "{Src}"cmd.c ¶ "{Src}"dbridge.c ¶ "{Src}"decl.c ¶ "{Src}"detect.c ¶ "{Src}"dig.c ¶ "{Src}"display.c ¶ "{Src}"dlb.c ¶ "{Src}"do.c ¶ "{Src}"do_name.c ¶ "{Src}"do_wear.c ¶ "{Src}"dog.c ¶ "{Src}"dogmove.c ¶ "{Src}"dokick.c ¶ "{Src}"dothrow.c ¶ "{Src}"drawing.c ¶ "{Src}"dungeon.c ¶ "{Src}"eat.c ¶ "{Src}"end.c ¶ "{Src}"engrave.c ¶ "{Src}"exper.c ¶ "{Src}"explode.c ¶ "{Src}"extralev.c ¶ "{Src}"files.c ¶ "{Src}"fountain.c ¶ "{Src}"gypsy.c ¶ "{Src}"hack.c ¶ "{Src}"hacklib.c ¶ "{Src}"invent.c ¶ "{Src}"light.c ¶ "{Src}"lock.c ¶ "{Src}"mail.c ¶ "{Src}"makemon.c ¶ "{Src}"mapglyph.c ¶ "{Src}"mcastu.c ¶ "{Src}"mhitm.c ¶ "{Src}"mhitu.c ¶ "{Src}"minion.c ¶ "{Src}"mklev.c ¶ "{Src}"mkmap.c ¶ "{Src}"mkmaze.c ¶ "{Src}"mkobj.c ¶ "{Src}"mkroom.c ¶ "{Src}"mon.c ¶ "{Src}"mondata.c ¶ "{Src}"monmove.c ¶ "{Src}"monst.c ¶ "{Preserve}"monstr.c ¶ "{Src}"mplayer.c ¶ "{Src}"mthrowu.c ¶ "{Src}"muse.c ¶ "{Src}"music.c ¶ "{Src}"o_init.c ¶ "{Src}"objects.c ¶ "{Src}"objnam.c ¶ "{Src}"options.c ¶ "{Src}"pager.c ¶ "{Src}"pickup.c ¶ "{Src}"pline.c ¶ "{Src}"polyself.c ¶ "{Src}"potion.c ¶ "{Src}"pray.c ¶ "{Src}"priest.c ¶ "{Src}"quest.c ¶ "{Src}"questpgr.c ¶ "{Src}"read.c ¶ "{Src}"rect.c ¶ "{Src}"region.c ¶ "{Src}"restore.c ¶ "{Src}"rip.c ¶ "{Src}"rnd.c ¶ "{Src}"role.c ¶ "{Src}"rumors.c ¶ "{Src}"save.c ¶ "{Src}"shk.c ¶ "{Src}"shknam.c ¶ "{Src}"sit.c ¶ "{Src}"sounds.c ¶ "{Src}"sp_lev.c ¶ "{Src}"spell.c ¶ "{Src}"steal.c ¶ "{Src}"steed.c ¶ "{Src}"tech.c ¶ "{Src}"teleport.c ¶ "{Src}"timeout.c ¶ "{Src}"topten.c ¶ "{Src}"track.c ¶ "{Src}"trap.c ¶ "{Src}"u_init.c ¶ "{Src}"uhitm.c ¶ "{Src}"vault.c ¶ "{Src}"version.c ¶ "{Preserve}"vis_tab.c ¶ "{Src}"vision.c ¶ "{Src}"weapon.c ¶ "{Src}"were.c ¶ "{Src}"wield.c ¶ "{Src}"windows.c ¶ "{Src}"wizard.c ¶ "{Src}"worm.c ¶ "{Src}"worn.c ¶ "{Src}"write.c ¶ "{Src}"zap.c ¶ ¶ "{MacDir}"dprintf.c ¶ "{MacDir}"maccurs.c ¶ "{MacDir}"macerrs.c ¶ "{MacDir}"macfile.c ¶ "{MacDir}"macmain.c ¶ "{MacDir}"macmenu.c ¶ "{MacDir}"macsnd.c ¶ "{MacDir}"mactopl.c ¶ "{MacDir}"mactty.c ¶ "{MacDir}"macunix.c ¶ "{MacDir}"macwin.c ¶ "{MacDir}"mgetline.c ¶ "{MacDir}"mmodal.c ¶ "{MacDir}"mttymain.c ¶ ¶ "{Share}"random.c ¶ ¶ "{TtyDir}"getline.c ¶ "{TtyDir}"topl.c ¶ "{TtyDir}"wintty.c SlashEMRsrcs = ¶ "{MacDir}"NHrsrc.r ¶ "{MacDir}"NHsound.r ¶ "{MacDir}"Files.r ¶ "{LibDir}"Levels.r # -------- Build the dungeon compiler, as an MPW tool --------------- DgnCompSrcs = ¶ "{Preserve}"dgn_lex.c ¶ "{Util}"dgn_main.c ¶ "{Preserve}"dgn_yacc.c ¶ "{Src}"alloc.c ¶ "{Util}"panic.c "{ObjDir}"DgnComp.make Ä "{Preserve}"dgn_lex.c "{Preserve}"dgn_yacc.c CreateMake "{ObjDir}"DgnComp {DgnCompSrcs} -tool -powerpc -objdir "{ObjDir}" ¶ -i "{Preserve}" -i "{ObjDir}" -i {Include} -ppccoptions "{COptions}" {Debug} -depends "{ObjDir}"DgnComp DgnComp.lnk Ä "{ObjDir}"DgnComp.make BuildProgram "{ObjDir}"DgnComp "{Preserve}"dgn_comp.h "{Preserve}"dgn_yacc.c Ä "{Util}"dgn_comp.y {YACC} -d "{Util}"dgn_comp.y Move -y "{YTabC}" "{Preserve}"dgn_yacc.c Move -y "{YTabH}" "{Preserve}"dgn_comp.h {Preserve}dgn_lex.c Ä {Util}dgn_comp.l {LEX} {Util}dgn_comp.l Move -y {LexYYC} {Preserve}dgn_lex.c # -------- Build the special-level compiler, as an MPW tool --------------- LevCompSrcs= "{Src}"monst.c ¶ "{Src}"objects.c ¶ "{Src}"drawing.c ¶ "{Src}"alloc.c ¶ "{Util}"panic.c ¶ "{Preserve}"lev_lex.c ¶ "{Preserve}"lev_yacc.c ¶ "{MacDir}"macfile.c ¶ "{MacDir}"macerrs.c ¶ "{Src}"files.c ¶ "{Src}"decl.c ¶ "{Util}"lev_main.c "{ObjDir}"LevComp.make Ä "{Preserve}"lev_lex.c "{Preserve}"lev_yacc.c CreateMake "{ObjDir}"LevComp {LevCompSrcs} -tool -powerpc -objdir "{ObjDir}" ¶ -i "{Preserve}" -i "{ObjDir}" -i {Include} -ppccoptions "{COptions}" {Debug} -depends "{ObjDir}"LevComp LevComp.lnk Ä "{ObjDir}"LevComp.make BuildProgram "{ObjDir}"LevComp "{Preserve}"lev_comp.h "{Preserve}"lev_yacc.c Ä "{Util}"lev_comp.y {YACC} -d "{Util}"lev_comp.y Move -y "{YTabH}" "{Preserve}"lev_comp.h Move -y "{YTabC}" "{Preserve}"lev_yacc.c "{Preserve}"lev_lex.c Ä {Util}lev_comp.l {LEX} {Util}lev_comp.l Move -y {LexYYC} {Preserve}lev_lex.c # -------- Create list of actual levels --------------- "{LibDir}"Levels.r Ä Levels Set Pwd `Directory` Directory "{LibDir}" Echo "" > "{LibDir}"Levels.r Set index 1200 For file in Å.lev Echo "read 'File' ({index},¶"{file}¶") ¶"::lib:{file}¶";" >> "{LibDir}"Levels.r Set index `Evaluate {index} + 1` End Echo "" >> "{LibDir}"Levels.list Directory "{Pwd}" # -------- Build "{ObjDir}"MakeDefs, as an MPW tool --------------- MakeDefsSrcs= "{Src}"objects.c ¶ "{Src}"monst.c ¶ "{Util}"MakeDefs.c "{ObjDir}"MakeDefs.make Ä CreateMake "{ObjDir}"MakeDefs {MakeDefsSrcs} -tool -powerpc -objdir "{ObjDir}" ¶ -i "{Preserve}" -i "{ObjDir}" -i {Include} -ppccoptions "{COptions}" {Debug} -depends "{ObjDir}"MakeDefs MakeDefs.lnk Ä "{ObjDir}"MakeDefs.make BuildProgram "{ObjDir}"MakeDefs # ------------ If "{ObjDir}"MakeDefs changes we need to rebuild some include files ----------- "{Preserve}"filename.h Ä "{ObjDir}"MakeDefs Set Pwd `Directory` Directory "{Top}" "{ObjDir}"MakeDefs -f Move -y "{Include}"filename.h "{Preserve}"filename.h Directory "{Pwd}" "{Preserve}"date.h Ä "{LibDir}"Options "{ObjDir}"MakeDefs Move -y "{Include}"date.h "{Preserve}"date.h "{LibDir}"Options Ä $OutOfDate "{ObjDir}"MakeDefs Set Pwd `Directory` Directory "{Top}" "{ObjDir}"MakeDefs -v Directory "{Pwd}" "{Preserve}"onames.h Ä "{ObjDir}"MakeDefs Set Pwd `Directory` Directory "{Top}" "{ObjDir}"MakeDefs -o Move -y "{Include}"onames.h "{Preserve}"onames.h Directory "{Pwd}" "{Preserve}"pm.h Ä "{ObjDir}"MakeDefs Set Pwd `Directory` Directory "{Top}" "{ObjDir}"MakeDefs -p Move -y "{Include}"pm.h "{Preserve}"pm.h Directory "{Pwd}" "{Preserve}"vis_tab.c Ä "{Preserve}"vis_tab.h Move -y "{Src}"vis_tab.c "{Preserve}"vis_tab.c "{Preserve}"vis_tab.h Ä "{ObjDir}"MakeDefs Set Pwd `Directory` Directory "{Top}" "{ObjDir}"MakeDefs -z Move -y "{Include}"vis_tab.h "{Preserve}"vis_tab.h Directory "{Pwd}" "{ObjDir}"Dungeon.pdf Ä "{Dat}"Dungeon.def "{ObjDir}"MakeDefs Set Pwd `Directory` Directory "{Top}" "{ObjDir}"MakeDefs -e Move -y "{Dat}"Dungeon.pdf "{ObjDir}"Dungeon.pdf Directory "{Pwd}" "{Preserve}"monstr.c Ä "{ObjDir}"MakeDefs Set Pwd `Directory` Directory "{Top}" "{ObjDir}"MakeDefs -m Move -y "{Src}"monstr.c "{Preserve}"monstr.c Directory "{Pwd}" #---------------- Data files ------------------- Levels Ä "{LibDir}"Levels.list "{MacDir}"Levels.make Make -f "{MacDir}"Levels.make Levels -d Dat="{Dat}" -d ObjDir="{ObjDir}" -d LibDir="{LibDir}" > "{ObjDir}"Levels.makeout "{ObjDir}"Levels.makeout "{LibDir}"Data data Ä "{Dat}"Data.base "{ObjDir}"MakeDefs Set Pwd `Directory` Directory "{Top}" "{ObjDir}"MakeDefs -d SetFile -t "{FileType}" -c "{SlashEMCreator}" "{LibDir}"Data Directory "{Pwd}" "{LibDir}"Rumors Ä "{Dat}"Rumors.tru "{Dat}"Rumors.fal "{ObjDir}"MakeDefs Set Pwd `Directory` Directory "{Top}" "{ObjDir}"MakeDefs -r SetFile -t "{FileType}" -c "{SlashEMCreator}" "{LibDir}"Rumors Directory "{Pwd}" "{LibDir}"Oracles Ä "{Dat}"Oracles.txt "{ObjDir}"MakeDefs Set Pwd `Directory` Directory "{Top}" "{ObjDir}"MakeDefs -h SetFile -t "{FileType}" -c "{SlashEMCreator}" "{LibDir}"Oracles Directory "{Pwd}" "{Results}"Slash¶'EM¶ Defaults Ä "{MacDir}"NHDeflts Duplicate -y "{MacDir}"NHDeflts "{Results}"Slash¶'EM¶ Defaults SetFile -c "ttxt" "{Results}"Slash¶'EM¶ Defaults "{Results}"Guidebook Ä "{Doc}"Guidebook.txt Duplicate -y "{Doc}"Guidebook.txt "{Results}"Guidebook SetFile -c "ttxt" -t "ttro" "{Results}"Guidebook "{Results}"MacHelp Ä "{MacDir}"MacHelp Duplicate -y "{MacDir}"MacHelp "{Results}"MacHelp SetFile -c "ttxt" -t "ttro" "{Results}"MacHelp "{Results}"README Ä "{MacDir}"README.txt Duplicate -y "{MacDir}"README.txt "{Results}"README SetFile -c "ttxt" -t "ttro" "{Results}"README "{ObjDir}"hh Ä "{Dat}"hh Duplicate -y "{Dat}"hh "{ObjDir}"hh "{ObjDir}"History Ä "{Dat}"History Duplicate -y "{Dat}"History "{ObjDir}"History "{Results}"License Ä "{Dat}"License Duplicate -y "{Dat}"License "{Results}"License SetFile -c "ttxt" -t "ttro" "{Results}"License "{ObjDir}"Help Ä "{Dat}"Help Duplicate -y "{Dat}"Help "{ObjDir}"Help "{ObjDir}"Wizhelp Ä "{Dat}"Wizhelp Duplicate -y "{Dat}"Wizhelp "{ObjDir}"Wizhelp "{ObjDir}"Opthelp Ä "{Dat}"Opthelp Duplicate -y "{Dat}"Opthelp "{ObjDir}"Opthelp "{ObjDir}"Machelp Ä "{MacDir}"Machelp Duplicate -y "{MacDir}"Machelp "{ObjDir}"Machelp "{ObjDir}"News Ä "{MacDir}"News Duplicate -y "{MacDir}"News "{ObjDir}"News "{LibDir}"Dungeon Ä "{ObjDir}"Dungeon.pdf "{ObjDir}"DgnComp "{ObjDir}"DgnComp "{ObjDir}"dungeon.pdf Move -y "{ObjDir}"Dungeon "{LibDir}" SetFile -t "{FileType}" -c "{SlashEMCreator}" "{LibDir}"Dungeon "{LibDir}"Quest.dat Ä "{Dat}"Quest.txt "{ObjDir}"MakeDefs Set Pwd `Directory` Directory "{Top}" "{ObjDir}"MakeDefs -q SetFile -t "{FileType}" -c "{SlashEMCreator}" "{LibDir}"Quest.dat Directory "{Pwd}" #---------------- The Recover application ------------------- RecoverSrcs = "{MacDir}"MRecover.c RecoverRsrcs = ¶ "{MacDir}"MFiles.r ¶ "{MacDir}"MRecover.r "{ObjDir}"Recover.make Ä CreateMake "{ObjDir}"Recover {RecoverSrcs} -{Processor} ¶ -i "{Preserve}" -i "{ObjDir}" -i {Include} ¶ -objdir "{ObjDir}" {Debug} -depends -c {RecoverCreator} ¶ -ppccoptions "{COptions}" ¶ -coptions "{COptions}" -model far ¶ "{SharedLibraries}"AppearanceLib ¶ "{SharedLibraries}"ATSUnicodeLib ¶ "{SharedLibraries}"ContextualMenu ¶ "{SharedLibraries}"ControlsLib ¶ "{SharedLibraries}"DialogsLib ¶ "{SharedLibraries}"FindByContent ¶ "{SharedLibraries}"FontManager ¶ "{SharedLibraries}"IconServicesLib ¶ "{SharedLibraries}"MenusLib ¶ "{SharedLibraries}"NavigationLib ¶ "{SharedLibraries}"UnicodeUtilitiesLib ¶ "{SharedLibraries}"WindowsLib ¶ "{SharedLibraries}"TextCommon ¶ "{SharedLibraries}"TextEncodingConverter ¶ "{SharedLibraries}"UnicodeConverter "{Results}"Recover Recover.lnk ÄÄ "{ObjDir}"Recover.make BuildProgram "{ObjDir}"Recover Rez Types.r SysTypes.r {RecoverRsrcs} -o "{ObjDir}"Recover -c {RecoverCreator} ¶ -i "{MacDir}" -i "{ObjDir}" -i "{Include}" -i "{Preserve}" -s "{Top}" -append SetFile -a B "{ObjDir}"Recover Move -y "{ObjDir}"Recover "{Results}"Recover #---------------- The Slash'EM application ------------------- "{ObjDir}"SlashEM.make Ä CreateMake "{ObjDir}"SlashEM {SlashEMSrcs} -{Processor} ¶ -i "{Preserve}" -i "{ObjDir}" -i {Include} ¶ -objdir "{ObjDir}" {Debug} -depends -c {SlashEMCreator} ¶ -ppccoptions "{COptions}" ¶ -coptions "{COptions}" -model far ¶ "{SharedLibraries}"AppearanceLib ¶ "{SharedLibraries}"ATSUnicodeLib ¶ "{SharedLibraries}"ContextualMenu ¶ "{SharedLibraries}"ControlsLib ¶ "{SharedLibraries}"DialogsLib ¶ "{SharedLibraries}"FindByContent ¶ "{SharedLibraries}"FontManager ¶ "{SharedLibraries}"IconServicesLib ¶ "{SharedLibraries}"MenusLib ¶ "{SharedLibraries}"NavigationLib ¶ "{SharedLibraries}"UnicodeUtilitiesLib ¶ "{SharedLibraries}"WindowsLib ¶ "{SharedLibraries}"TextCommon ¶ "{SharedLibraries}"TextEncodingConverter ¶ "{SharedLibraries}"UnicodeConverter "{Results}"Slash¶'EM SlashEM.lnk Ä "{ObjDir}"SlashEM.make {SlashEMRsrcs} {FileResources} BuildProgram "{ObjDir}"SlashEM Rez Types.r SysTypes.r {SlashEMRsrcs} -o "{ObjDir}"SlashEM -c {SlashEMCreator} ¶ -i "{MacDir}" -i "{ObjDir}" -i "{Include}" -i "{Preserve}" -s "{Top}" -append SetFile -a B "{ObjDir}"SlashEM Move -y "{ObjDir}"SlashEM "{Results}"Slash¶'EM #---------------- Dependencies ------------------- Dependencies Ä Setup ¶ "{LibDir}"Levels.list ¶ "{ObjDir}"MakeDefs.make ¶ {Preserved} ¶ "{ObjDir}"LevComp.make ¶ "{ObjDir}"DgnComp.make ¶ "{ObjDir}"Recover.make ¶ "{ObjDir}"SlashEM.make Make -f "{ObjDir}"MakeDefs.make Dependencies > "{ObjDir}"MakeDefs.makeout "{ObjDir}"MakeDefs.makeout Make -f "{ObjDir}"LevComp.make Dependencies > "{ObjDir}"LevComp.makeout "{ObjDir}"LevComp.makeout Make -f "{ObjDir}"DgnComp.make Dependencies > "{ObjDir}"DgnComp.makeout "{ObjDir}"DgnComp.makeout Make -f "{ObjDir}"Recover.make Dependencies > "{ObjDir}"Recover.makeout "{ObjDir}"Recover.makeout Make -f "{ObjDir}"SlashEM.make Dependencies > "{ObjDir}"SlashEM.makeout "{ObjDir}"SlashEM.makeout "{LibDir}"Levels.list Ä Echo 'LevelList Ä ¶' > "{LibDir}"Levels.list For file in "{Top}"dat:Å.des StreamEdit "{file}" -d -e '/MAZE:[ ]*¶"(Å)¨1¶"/||/LEVEL:[ ]*¶"(Å)¨1¶"/ Change " ¶"{LibDir}¶""¨1".lev ¶¶";Print;Exit' >> "{LibDir}"Levels.list End Echo "" >> "{LibDir}"Levels.list #---------------- Clean ------------------- Clean Ä set exit 0 Delete -i -y "{Results}" Delete -i -y "{ObjDir} Delete -i -y "{LibDir} Delete -i -y Macintosh.makeout Delete -i -y "{Top}"Å.rej Delete -i -y "{Top}"Å.orig Delete -i -y "{Top}"Å:Å.rej Delete -i -y "{Top}"Å:Å.orig Delete -i -y "{Top}"Å:Å:Å.rej Delete -i -y "{Top}"Å:Å:Å.orig Delete -i -y "{Top}"Å:Å:Å:Å.rej Delete -i -y "{Top}"Å:Å:Å:Å.orig Move Macintosh.make "{MacDir}"Macintosh.make set exit 1 #---------------- Spotless ------------------- Spotless Ä Clean set exit 0 Delete -i -y "{Preserve}" set exit 1 #---------------- Pack ------------------- Pack Ä "{ObjDir}"NHrsrc.rsrc "{ObjDir}"NHsound.rsrc "{ObjDir}"MRecover.rsrc DeRez "{ObjDir}"NHrsrc.rsrc Types.r SysTypes.r > "{MacDir}"NHrsrc.r DeRez "{ObjDir}"NHsound.rsrc Types.r SysTypes.r > "{MacDir}"NHsound.r DeRez "{ObjDir}"MRecover.rsrc Types.r SysTypes.r > "{MacDir}"MRecover.r #---------------- Unpack ------------------- Unpack Ä "{ObjDir}"NHrsrc.rsrc "{ObjDir}"NHsound.rsrc "{ObjDir}"MRecover.rsrc "{ObjDir}"NHrsrc.rsrc Ä "{MacDir}"NHrsrc.r Rez Types.r SysTypes.r "{MacDir}"NHrsrc.r -o "{ObjDir}"NHrsrc.rsrc ¶ -i "{Include}" -i "{Preserve}" "{ObjDir}"NHsound.rsrc Ä "{MacDir}"NHsound.r Rez Types.r SysTypes.r "{MacDir}"NHsound.r -o "{ObjDir}"NHsound.rsrc "{ObjDir}"MRecover.rsrc Ä "{MacDir}"MRecover.r Rez Types.r SysTypes.r "{MacDir}"MRecover.r -o "{ObjDir}"MRecover.rsrc slashem-0.0.7E7F3/sys/mac/mactopl.c0000664000076400007640000000256610545462317015046 0ustar aliali/* 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. */ #include "hack.h" #include "mactty.h" #include "macwin.h" #include "macpopup.h" char queued_resp(char *resp) { char buf[30]; if (try_key_queue(buf)) { if (!resp || strchr(resp, buf[0])) return buf[0]; if (digit(buf[0]) && strchr(resp, '#')) { yn_number = atoi(buf); return '#'; } } return '\0'; } char topl_yn_function(const char *query, const char *resp, char def) { char buf[30]; char c = queued_resp((char *) resp); if (!c) { enter_topl_mode((char *) query); topl_set_resp((char *) resp, def); do { c = readchar(); if (c && resp && !strchr(resp, c)) { nhbell(); c = '\0'; } } while (!c); topl_set_resp("", '\0'); leave_topl_mode(buf); if (c == '#') yn_number = atoi(buf); } return c; } char mac_yn_function(query, resp, def) const char *query,*resp; char def; /* * Generic yes/no function. 'def' is the default (returned by space or * return; 'esc' returns 'q', or 'n', or the default, depending on * what's in the string. The 'query' string is printed before the user * is asked about the string. * If resp is NULL, any single character is accepted and returned. */ { return topl_yn_function(query, resp, def); } /* mactopl.c */ slashem-0.0.7E7F3/sys/mac/NHDeflts0000664000076400007640000000770710545462317014637 0ustar aliali# SCCS Id: @(#)NetHack Defaults 3.4 2002/03/15 # Copyright (c) 2002 by Dean Luick, Mark Modrall, and Kevin Hugo # Slash'EM may be freely redistributed. See license for details. # # Default settings for the Macintosh port of Slash'EM. # Lines beginning with a `#' character are "comments" and are # ignored all the way to the end of the line. Using this # method, some of the lines below have been disabled so you # can see an example without having those options actually # set. Remove the `#' character to "uncomment" the line and # allow those options to take effect. ### Display ### # Uncomment for the traditional single-window tty interface #OPTIONS=win:tty # Boulder symbol #OPTIONS=boulder:0 # Color OPTIONS=color # Fonts #OPTIONS=font_map:NewHackFont,font_size_map:9 #OPTIONS=font_menu:geneva,font_size_menu:9 #OPTIONS=font_message:PSHackFont,font_size_message:9 #OPTIONS=font_status:monaco,font_size_status:9 #OPTIONS=font_text:geneva,font_size_text:9 # Don't make dark corridors look like lit corridors OPTIONS=!lit_corridor # Enable sound and beeps OPTIONS=sound,!silent ### Start-up and ending ### # Don't display the game introduction and new feature list at start #OPTIONS=!legacy,!news # Save game state periodically in case of crashes (recommended) OPTIONS=checkpoint # How to prompt for things after death #OPTIONS=disclose:+i na -v yg nc # Show tombstone and top scores at death OPTIONS=tombstone,scores:10t/3a/o # Show top ten list in its own window #OPTIONS=toptenwin ### User input and feedback ### # Choose between menus or text prompts # (traditional, combination, partial, or full) OPTIONS=menustyle:full # Extended (`#') commands by menu #OPTIONS=extmenu # Increase the number of message lines remembered #OPTIONS=msghistory:60 # Enable the number pad keys OPTIONS=number_pad # Pause for --more-- and make it boldface OPTIONS=page_wait,standout # Ask for confirmation with the #pray command OPTIONS=prayconfirm # Allow spacebar as rest command #OPTIONS=rest_on_space # Display experience, score, and time on status line OPTIONS=showexp,showscore,time # Turn off animations #OPTIONS=!sparkle # Display a little more information with some commands #OPTIONS=suppress_alert:3.3.0 OPTIONS=verbose ### Character ### # A Valkyrie... #OPTIONS=name:Brunhilda,role:Val # The old way works, too: #OPTIONS=name:Brunhilda-V # How about an Elven Ranger? #OPTIONS=name:Silwa,role:Ranger,race:Elf,gender:Male # Always a human female #OPTIONS=race:human,female # Or leave them commented out and the game will ask you ### Inventory ### # Automatically dig if wielding a pick #OPTIONS=autodig # Disable autopickup (toggle it with the `@' command) #OPTIONS=!autopickup,pickup_types:$* # Automatically fill the quiver #OPTIONS=autoquiver # Don't use fixed inventory letters OPTIONS=!fixinv,perm_invent,sortpack # What you want to call slime molds #OPTIONS=fruit:grape # Desired inventory display order #OPTIONS=packorder:)[( # How much you're willing to carry without confirmation #OPTIONS=pickup_burden:B # Put weapon in secondary slot when wielding another #OPTIONS=pushweapon ### Pets ### # What to call your starting pet, and its type #OPTIONS=dogname:Quinn,catname:Vladimir,horsename:Silver,pettype:dog # Don't intentionally attack your pets OPTIONS=confirm,!hilite_pet,safe_pet ### Unused options ### # Now obsolete # # background, large_font, popup_dialog, use_stone # Obsolete way to obtain reverse video; use at your own risk #OPTIONS=palette:000/c22/2c2/ca0/22c/a2a/2aa/ccc/999/f00/0f0/dd0/00f/d0d/0dd/fff/999/444/622/62c/-222 # Options used in tty window mode, but not mac window mode # # menu_..., msg_window, timed_delay, use_inverse, vary_msgcount # Options used by other ports but not Macintosh: # # align_message, align_status, ascii_map, BIOS, checkspace, # decgraphics, eight_bit_tty, ibmgraphics, ignintr, mail, # map_mode, null, player_selection, preload_tiles, rawio, # splash_screen, tiled_map, tile_..., videocolors, videoshades, # windowcolors # End-of-file slashem-0.0.7E7F3/sys/unix/0000775000076400007640000000000010545462317013455 5ustar alialislashem-0.0.7E7F3/sys/unix/nethack.sh0000664000076400007640000000254410545462317015433 0ustar aliali#!/bin/sh # SCCS Id: @(#)nethack.sh 3.4 1990/02/26 HACKDIR=/usr/games/lib/nethackdir export HACKDIR HACK=$HACKDIR/nethack MAXNROFPLAYERS=4 # Since Nethack.ad is installed in HACKDIR, add it to XUSERFILESEARCHPATH case "x$XUSERFILESEARCHPATH" in x) XUSERFILESEARCHPATH="$HACKDIR/%N.ad" ;; *) XUSERFILESEARCHPATH="$XUSERFILESEARCHPATH:$HACKDIR/%N.ad" ;; esac export XUSERFILESEARCHPATH # see if we can find the full path name of PAGER, so help files work properly # assume that if someone sets up a special variable (HACKPAGER) for NetHack, # it will already be in a form acceptable to NetHack # ideas from brian@radio.astro.utoronto.ca if test \( "xxx$PAGER" != xxx \) -a \( "xxx$HACKPAGER" = xxx \) then HACKPAGER=$PAGER # use only the first word of the pager variable # this prevents problems when looking for file names with trailing # options, but also makes the options unavailable for later use from # NetHack for i in $HACKPAGER do HACKPAGER=$i break done if test ! -f $HACKPAGER then IFS=: for i in $PATH do if test -f $i/$HACKPAGER then HACKPAGER=$i/$HACKPAGER export HACKPAGER break fi done IFS=' ' fi if test ! -f $HACKPAGER then echo Cannot find $PAGER -- unsetting PAGER. unset HACKPAGER unset PAGER fi fi cd $HACKDIR case $1 in -s*) exec $HACK "$@" ;; *) exec $HACK "$@" $MAXNROFPLAYERS ;; esac slashem-0.0.7E7F3/sys/unix/unixunix.c0000664000076400007640000003407310545462317015517 0ustar aliali/* 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. */ /* This file collects some Unix dependencies */ #include "hack.h" /* mainly for index() which depends on BSD */ #include #include #if defined(NO_FILE_LINKS) || defined(SUNOS4) || defined(POSIX_TYPES) #include #endif #include #ifdef _M_UNIX extern void NDECL(sco_mapon); extern void NDECL(sco_mapoff); #endif #ifdef __linux__ extern void NDECL(linux_mapon); extern void NDECL(linux_mapoff); #endif #ifdef LINUX extern void NDECL(linux_mapon); extern void NDECL(linux_mapoff); #endif static int FDECL (veryold, (int)); static int NDECL (eraseoldlocks); #ifndef NHSTDC extern int errno; #endif static struct stat buf; /* see whether we should throw away this xlock file */ static int veryold(fd) int fd; { time_t date; if(fstat(fd, &buf)) return(0); /* cannot get status */ #ifndef INSURANCE if(buf.st_size != sizeof(int)) return(0); /* not an xlock file */ #endif #if defined(BSD) && !defined(POSIX_TYPES) (void) time((long *)(&date)); #else (void) time(&date); #endif if(date - buf.st_mtime < 3L*24L*60L*60L) { /* recent */ int lockedpid; /* should be the same size as hackpid */ if(read(fd, (genericptr_t)&lockedpid, sizeof(lockedpid)) != sizeof(lockedpid)) /* strange ... */ return(0); /* From: Rick Adams */ /* This will work on 4.1cbsd, 4.2bsd and system 3? & 5. */ /* It will do nothing on V7 or 4.1bsd. */ #ifndef NETWORK /* It will do a VERY BAD THING if the playground is shared by more than one machine! -pem */ if(!(kill(lockedpid, 0) == -1 && errno == ESRCH)) #endif return(0); } (void) close(fd); return(1); } static int eraseoldlocks() { register int i; /* cannot use maxledgerno() here, because we need to find a lock name * before starting everything (including the dungeon initialization * that sets astral_level, needed for maxledgerno()) up */ for(i = 1; i <= MAXDUNGEON*MAXLEVEL + 1; i++) { /* try to remove all */ set_levelfile_name(lock, i); #ifdef FILE_AREAS (void) remove_area(FILE_AREA_LEVL, lock); #else (void) unlink(fqname(lock, LEVELPREFIX, 0)); #endif } set_levelfile_name(lock, 0); #ifdef FILE_AREAS if (remove_area(FILE_AREA_LEVL, lock)) #else if (unlink(fqname(lock, LEVELPREFIX, 0))) #endif return(0); /* cannot remove it */ return(1); /* success! */ } void getlock() { register int i = 0, fd, c; #ifndef FILE_AREAS const char *fq_lock; #endif #ifdef TTY_GRAPHICS /* idea from rpick%ucqais@uccba.uc.edu * prevent automated rerolling of characters * test input (fd0) so that tee'ing output to get a screen dump still * works * also incidentally prevents development of any hack-o-matic programs */ /* added check for window-system type -dlc */ if (!strcmp(windowprocs.name, "tty")) if (!isatty(0)) error("You must play from a terminal."); #endif /* we ignore QUIT and INT at this point */ #ifndef FILE_AREAS if (!lock_file(HLOCK, LOCKPREFIX, 10)) { #else if (!lock_file_area(HLOCK_AREA, HLOCK, 10)) { #endif wait_synch(); error("%s", ""); } regularize(lock); set_levelfile_name(lock, 0); if(locknum) { if(locknum > 25) locknum = 25; do { lock[0] = 'a' + i++; #ifndef FILE_AREAS fq_lock = fqname(lock, LEVELPREFIX, 0); if((fd = open(fq_lock, 0, 0)) == -1) { #else if((fd = open_area(FILE_AREA_LEVL, lock, 0, 0)) == -1) { #endif if(errno == ENOENT) goto gotlock; /* no such file */ #ifndef FILE_AREAS perror(fq_lock); unlock_file(HLOCK); error("Cannot open %s", fq_lock); #else perror(lock); unlock_file_area(HLOCK_AREA, HLOCK); error("Cannot open %s", lock); #endif } if(veryold(fd) /* closes fd if true */ && eraseoldlocks()) goto gotlock; (void) close(fd); } while(i < locknum); unlock_file_area(HLOCK_AREA, HLOCK); error("Too many hacks running now."); } else { #ifndef FILE_AREAS fq_lock = fqname(lock, LEVELPREFIX, 0); if((fd = open(fq_lock, 0, 0)) == -1) { #else if((fd = open_area(FILE_AREA_LEVL, lock, 0, 0)) == -1) { #endif if(errno == ENOENT) goto gotlock; /* no such file */ #ifndef FILE_AREAS perror(fq_lock); unlock_file(HLOCK); error("Cannot open %s", fq_lock); #else perror(lock); unlock_file_area(HLOCK_AREA, HLOCK); error("Cannot open %s", lock); #endif } if(veryold(fd) /* closes fd if true */ && eraseoldlocks()) goto gotlock; (void) close(fd); if(iflags.window_inited) { c = yn("There is already a game in progress under your name. Destroy old game?"); } else { (void) printf("\nThere is already a game in progress under your name."); (void) printf(" Destroy old game? [yn] "); (void) fflush(stdout); c = getchar(); (void) putchar(c); (void) fflush(stdout); while (getchar() != '\n') ; /* eat rest of line and newline */ } if(c == 'y' || c == 'Y') if(eraseoldlocks()) goto gotlock; else { unlock_file_area(HLOCK_AREA, HLOCK); error("Couldn't destroy old game."); } else { unlock_file_area(HLOCK_AREA, HLOCK); error("%s", ""); } } gotlock: #ifndef FILE_AREAS fd = creat(fq_lock, FCMASK); #else fd = creat_area(FILE_AREA_LEVL, lock, FCMASK); #endif unlock_file_area(HLOCK_AREA, HLOCK); if(fd == -1) { #ifndef FILE_AREAS error("cannot creat lock file (%s).", fq_lock); #else error("cannot creat lock file (%s in %s).", lock, FILE_AREA_LEVL); #endif } else { if(write(fd, (genericptr_t) &hackpid, sizeof(hackpid)) != sizeof(hackpid)){ #ifndef FILE_AREAS error("cannot write lock (%s)", fq_lock); #else error("cannot write lock (%s in %s)", lock, FILE_AREA_LEVL); #endif } if(close(fd) == -1) { #ifndef FILE_AREAS error("cannot close lock (%s)", fq_lock); #else error("cannot close lock (%s in %s)", lock, FILE_AREA_LEVL); #endif } } } void regularize(s) /* normalize file name - we don't like .'s, /'s, spaces */ register char *s; { register char *lp; while((lp=index(s, '.')) || (lp=index(s, '/')) || (lp=index(s,' '))) *lp = '_'; #if defined(SYSV) && !defined(AIX_31) && !defined(SVR4) && !defined(LINUX) && !defined(__APPLE__) /* avoid problems with 14 character file name limit */ # ifdef COMPRESS /* leave room for .e from error and .Z from compress appended to * save files */ { # ifdef COMPRESS_EXTENSION int i = 12 - strlen(COMPRESS_EXTENSION); # else int i = 10; /* should never happen... */ # endif if(strlen(s) > i) s[i] = '\0'; } # else if(strlen(s) > 11) /* leave room for .nn appended to level files */ s[11] = '\0'; # endif #endif } #if defined(TIMED_DELAY) && !defined(msleep) && defined(SYSV) #include void msleep(msec) unsigned msec; /* milliseconds */ { struct pollfd unused; int msecs = msec; /* poll API is signed */ if (msecs < 0) msecs = 0; /* avoid infinite sleep */ (void) poll(&unused, (unsigned long)0, msecs); } #endif /* TIMED_DELAY for SYSV */ #ifdef SHELL int dosh() { register char *str; if(child(0)) { if((str = getenv("SHELL")) != (char*)0) (void) execl(str, str, (char *)0); else (void) execl("/bin/sh", "sh", (char *)0); raw_print("sh: cannot execute."); exit(EXIT_FAILURE); } return 0; } #endif /* SHELL */ #if defined(SHELL) || defined(DEF_PAGER) || defined(DEF_MAILREADER) int child(wt) int wt; { register int f; suspend_nhwindows((char *)0); /* also calls end_screen() */ #ifdef _M_UNIX sco_mapon(); #endif #ifdef LINUX linux_mapon(); #endif #ifdef __linux__ linux_mapon(); #endif if((f = fork()) == 0){ /* child */ (void) setgid(getgid()); (void) setuid(getuid()); #ifdef CHDIR (void) chdir(getenv("HOME")); #endif return(1); } if(f == -1) { /* cannot fork */ pline("Fork failed. Try again."); return(0); } /* fork succeeded; wait for child to exit */ (void) signal(SIGINT,SIG_IGN); (void) signal(SIGQUIT,SIG_IGN); (void) wait( (int *) 0); #ifdef _M_UNIX sco_mapoff(); #endif #ifdef __linux__ linux_mapoff(); #endif #ifdef LINUX linux_mapoff(); #endif (void) signal(SIGINT, (SIG_RET_TYPE) done1); #ifdef WIZARD if(wizard) (void) signal(SIGQUIT,SIG_DFL); #endif if(wt) { raw_print(""); wait_synch(); } resume_nhwindows(); return(0); } #endif #ifdef FILE_AREAS /* * Unix file areas are directories with trailing slashes. */ char *make_file_name(filearea, filename) const char *filearea, *filename; { char *buf; int lenarea; if (filearea && filename[0]!='/') { lenarea = strlen(filearea); buf = (char *)alloc(lenarea+strlen(filename)+1); strcpy(buf, filearea); strcpy(buf+lenarea, filename); } else { buf = (char *)alloc(strlen(filename)+1); strcpy(buf, filename); } return buf; } FILE * fopen_datafile_area(filearea, filename, mode, use_scoreprefix) const char *filearea, *filename, *mode; boolean use_scoreprefix; { FILE *fp; char *buf; buf = make_file_name(filearea, filename); fp = fopen(buf, mode); return fp; } int chmod_area(filearea, filename, mode) const char *filearea, *filename; int mode; { int retval; char *buf; buf = make_file_name(filearea, filename); retval = chmod(buf, mode); free(buf); return retval; } int open_area(filearea, filename, flags, mode) const char *filearea, *filename; int flags, mode; { int fd; char *buf; buf = make_file_name(filearea, filename); fd = open(buf, flags, mode); free(buf); return fd; } int creat_area(filearea, filename, mode) const char *filearea, *filename; int mode; { int fd; char *buf; buf = make_file_name(filearea, filename); fd = creat(buf, mode); free(buf); return fd; } int rename_area(filearea, oldfilename, newfilename) const char *filearea, *oldfilename, *newfilename; { int retval; char *oldpath,*newpath; int lenarea; oldpath = make_file_name(filearea, oldfilename); newpath = make_file_name(filearea, newfilename); retval = rename(oldpath, newpath); free(oldpath); free(newpath); return retval; } int remove_area(filearea, filename) const char *filearea, *filename; { int retval; char *buf; buf = make_file_name(filearea, filename); retval = remove(buf); free(buf); return retval; } FILE * freopen_area(filearea, filename, mode, stream) const char *filearea, *filename, *mode; FILE *stream; { FILE *fp; char *buf; buf = make_file_name(filearea, filename); fp = freopen(buf, mode, stream); free(buf); return fp; } /* ---------- BEGIN FILE LOCKING HANDLING ----------- */ /* * ALI * * We assume that filenames are unique and so locks * don't need to take the filearea into account. Since * these locks are only used for RECORD, LOGFILE and HLOCK, * this assumption is currently valid. */ static int nesting = 0; static int lockfd=-1; /* for lock_file_area() to pass to unlock_file_area() */ #define HUP if (!program_state.done_hup) static char * make_lockname(filename, lockname) const char *filename; char *lockname; { # ifdef NO_FILE_LINKS Strcpy(lockname, LOCKDIR); if (LOCKDIR[sizeof(LOCKDIR)-2]!='/') Strcat(lockname, "/"); Strcat(lockname, filename); # else # ifdef FILE_AREAS Strcpy(lockname, FILE_AREA_VAR); Strcat(lockname, filename); # else Strcpy(lockname, filename); # endif # endif /* NO_FILE_LINKS */ Strcat(lockname, "_lock"); return lockname; } static boolean assert_lock(filename, lockname) const char *filename, *lockname; { # ifdef NO_FILE_LINKS return (lockfd = open(lockname, O_RDWR|O_CREAT|O_EXCL, 0666)) != -1; # else if (link(filename, lockname) == -1) if (errno == EXDEV) return (lockfd = open(lockname, O_RDWR|O_CREAT|O_EXCL, 0666)) != -1; else return FALSE; else { lockfd=-1; return TRUE; } # endif } /* * lock a file * * Note: The area says where the file is, not where the lock is. */ boolean lock_file_area(filearea, filename, retryct) const char *filearea, *filename; int retryct; { int retval=TRUE; char *lockname, locknambuf[BUFSZ]; char *buf; nesting++; if (nesting > 1) { impossible("TRIED TO NEST LOCKS"); return TRUE; } buf = make_file_name(filearea, filename); lockname = make_lockname(filename, locknambuf); while (retval && !assert_lock(buf, lockname)) { register int errnosv = errno; switch (errnosv) { /* George Barbanis */ case EEXIST: if (retryct--) { HUP raw_printf( "Waiting for access to %s. (%d retries left).", filename, retryct); # if defined(SYSV) || defined(ULTRIX) (void) # endif sleep(1); } else { HUP (void) raw_print("I give up. Sorry."); HUP raw_printf("Perhaps there is an old %s around?", lockname); nesting--; retval = FALSE; } break; case ENOENT: HUP raw_printf("Can't find file %s to lock!", filename); nesting--; retval = FALSE; case EACCES: HUP raw_printf("No write permission to lock %s!", filename); nesting--; retval = FALSE; default: HUP perror(lockname); HUP raw_printf( "Cannot lock %s for unknown reason (%d).", filename, errnosv); nesting--; retval = FALSE; } } free(buf); return retval; } /* unlock file, which must be currently locked by lock_file_area */ void unlock_file_area(filearea, filename) const char *filearea, *filename; { char *lockname, locknambuf[BUFSZ]; if (nesting == 1) { lockname = make_lockname(filename, locknambuf); if (unlink(lockname) < 0) HUP raw_printf("Can't unlink %s.", lockname); if (lockfd!=-1) { (void) close(lockfd); lockfd=-1; } } nesting--; } /* ---------- END FILE LOCKING HANDLING ----------- */ #endif /* FILE_AREAS */ #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 */ slashem-0.0.7E7F3/sys/unix/Makefile.dat0000664000076400007640000002636610545462317015701 0ustar aliali# NetHack Makefile. # SCCS Id: @(#)Makefile.dat 3.4 1992/09/18 # for Atari # SHELL=E:/GEMINI2/MUPFEL.TTP # UUDECODE=uudecode VARDAT = data rumors quest.dat oracles options all: $(VARDAT) spec_levs quest_levs dungeon ../util/makedefs: (cd ../util ; make makedefs) ../util/dgn_comp: (cd ../util ; make dgn_comp) ../util/lev_comp: (cd ../util ; make lev_comp) ../util/tile2x11: (cd ../util ; make tile2x11) ../util/tile2beos: (cd ../util ; make tile2beos) ../util/tile2png: (cd ../util ; make tile2png) ../util/magtile: (cd ../util ; make magtile) ../util/bigtile: (cd ../util ; make bigtile) ../util/txtmerge: (cd ../util ; make txtmerge) ../util/txtbg: (cd ../util ; make txtbg) ../util/mapmerge: (cd ../util ; make mapmerge) ../util/tile2bmp: (cd ../util ; make tile2bmp) x11tiles: ../util/tile2x11 ../win/share/monsters.txt ../win/share/objects.txt \ ../win/share/other.txt ../util/tile2x11 ../win/share/monsters.txt ../win/share/objects.txt \ ../win/share/other.txt x11tiles.map: ../util/mapmerge ../win/share/monsters.map \ ../win/share/objects.map ../win/share/other.map ../util/mapmerge x11tiles.map ../win/share/monsters.map \ ../win/share/objects.map ../win/share/other.map x11bigtiles: ../util/tile2x11 ../win/share/mon32.txt \ ../win/share/obj32.txt ../win/share/oth32.txt ../util/tile2x11 -o x11bigtiles ../win/share/mon32.txt \ ../win/share/obj32.txt ../win/share/oth32.txt x11bigtiles.map: x11tiles.map cp x11tiles.map x11bigtiles.map x11big3dtiles: ../util/tile2x11 ../win/share/mon3d.txt \ ../win/share/obj3d.txt ../win/share/oth3d.txt ../util/tile2x11 -o x11big3dtiles ../win/share/mon3d.txt \ ../win/share/obj3d.txt ../win/share/oth3d.txt x11big3dtiles.map: x11tiles.map cp x11tiles.map x11big3dtiles.map beostiles: ../util/tile2beos ../win/share/monsters.txt ../win/share/objects.txt \ ../win/share/other.txt ../util/tile2beos ../win/share/monsters.txt ../win/share/objects.txt \ ../win/share/other.txt gltile16.png: ../util/tile2png ../win/share/monsters.txt ../win/share/objects.txt \ ../win/share/other.txt ../util/tile2png -o $@ ../win/share/monsters.txt ../win/share/objects.txt \ ../win/share/other.txt gltile16.map: ../util/mapmerge ../win/share/monsters.map \ ../win/share/objects.map ../win/share/other.map ../util/mapmerge gltile16.map ../win/share/monsters.map \ ../win/share/objects.map ../win/share/other.map gltile32.png: ../util/tile2png ../win/share/mon32.txt \ ../win/share/obj32.txt ../win/share/oth32.txt ../util/tile2png -o $@ -t ../win/share/mon32.txt \ ../win/share/obj32.txt ../win/share/oth32.txt gltile32.map: gltile16.map cp gltile16.map gltile32.map gltile64.png: ../util/tile2png ../win/share/mon3d.txt \ ../win/share/obj3d.txt ../win/share/oth3d.txt ../util/tile2png -o $@ -t ../win/share/mon3d.txt \ ../win/share/obj3d.txt ../win/share/oth3d.txt gltile64.map: gltile16.map cp gltile16.map gltile64.map glfont8.png: ../util/tile2png ../win/gl/font8.txt ../util/tile2png -o $@ -f ../win/gl/font8.txt glfont14.png: ../util/tile2png ../win/gl/font14.txt ../util/tile2png -o $@ -f ../win/gl/font14.txt glfont20.png: ../util/tile2png ../win/gl/font20.txt ../util/tile2png -o $@ -f ../win/gl/font20.txt glfont22.png: ../util/tile2png ../win/gl/font22.txt ../util/tile2png -o $@ -f ../win/gl/font22.txt gllogo.png: ../util/tile2png ../win/gl/logo.txt ../util/tile2png -o $@ -a 28 ../win/gl/logo.txt glrip.png: ../util/tile2png ../win/gl/rip.txt ../util/tile2png -o $@ -a 20 ../win/gl/rip.txt ../win/share/monmag.txt: ../util/magtile ../win/share/monsters.txt ../util/magtile ../win/share/objmag.txt: ../util/magtile ../win/share/objects.txt ../util/magtile ../win/share/othmag.txt: ../util/magtile ../win/share/other.txt ../util/magtile ../win/share/monbig.txt: ../util/bigtile ../win/share/mon32-t.txt \ ../win/share/obj32-t.txt \ ../win/share/oth32-t.txt ../util/bigtile ../win/share/objbig.txt: ../util/bigtile ../win/share/mon32-t.txt \ ../win/share/obj32-t.txt \ ../win/share/oth32-t.txt ../util/bigtile ../win/share/othbig.txt: ../util/bigtile ../win/share/mon32-t.txt \ ../win/share/obj32-t.txt \ ../win/share/oth32-t.txt ../util/bigtile ../win/share/mon32.txt: ../util/txtbg ../win/share/mon32-t.txt ../util/txtbg ../win/share/mon32-t.txt ../win/share/mon32.txt ../win/share/obj32.txt: ../util/txtbg ../win/share/obj32-t.txt ../util/txtbg ../win/share/obj32-t.txt ../win/share/obj32.txt ../win/share/oth32.txt: ../util/txtbg ../win/share/oth32-t.txt ../util/txtbg ../win/share/oth32-t.txt ../win/share/oth32.txt ../win/share/mon32-t.txt: ../util/txtmerge ../win/share/monmag.txt \ ../win/share/mon32mi.txt ../win/share/mon32alg.txt \ ../win/share/mon32aw.txt ../win/share/mon32se.txt \ ../win/share/palette.txt ../util/txtmerge -p ../win/share/palette.txt ../win/share/mon32-t.txt \ ../win/share/monmag.txt -b ../win/share/mon32mi.txt \ -b ../win/share/mon32se.txt -bff00ff ../win/share/mon32alg.txt \ -bff00ff ../win/share/mon32aw.txt ../win/share/obj32-t.txt: ../util/txtmerge ../win/share/objmag.txt \ ../win/share/obj32mi.txt ../win/share/obj32se.txt \ ../win/share/obj32alg.txt ../win/share/palette.txt ../util/txtmerge -p ../win/share/palette.txt ../win/share/obj32-t.txt \ ../win/share/objmag.txt -b ../win/share/obj32mi.txt \ -b ../win/share/obj32se.txt -bff00ff ../win/share/obj32alg.txt ../win/share/oth32-t.txt: ../util/txtmerge ../win/share/othmag.txt \ ../win/share/oth32mi.txt ../win/share/oth32se.txt \ ../win/share/oth32alg.txt ../win/share/palette.txt ../util/txtmerge -p ../win/share/palette.txt ../win/share/oth32-t.txt \ ../win/share/othmag.txt -b ../win/share/oth32mi.txt \ -b ../win/share/oth32se.txt -bff00ff ../win/share/oth32alg.txt ../win/share/mon3d.txt: ../util/txtmerge ../win/share/monbig.txt \ ../win/share/mon3dmi.txt ../win/share/palette.txt ../util/txtmerge -p ../win/share/palette.txt ../win/share/mon3d.txt \ ../win/share/monbig.txt -b ../win/share/mon3dmi.txt ../win/share/obj3d.txt: ../util/txtmerge ../win/share/objbig.txt cp ../win/share/objbig.txt ../win/share/obj3d.txt ../win/share/oth3d.txt: ../util/txtmerge ../win/share/othbig.txt \ ../win/share/oth3dmi.txt ../win/share/oth-2kmi.txt \ ../win/share/oth3dse.txt ../win/share/palette.txt ../util/txtmerge -p ../win/share/palette.txt ../win/share/oth3d.txt \ ../win/share/othbig.txt -b ../win/share/oth3dmi.txt \ -b ../win/share/oth-2kmi.txt -b ../win/share/oth3dse.txt nhtiles.bmp: ../util/tile2bmp ../win/share/monsters.txt ../win/share/objects.txt \ ../win/share/other.txt ../util/tile2bmp $@ ../win/share/monsters.txt ../win/share/objects.txt \ ../win/share/other.txt SlashEM.ad: ../win/X11/SlashEM.ad cp ../win/X11/SlashEM.ad SlashEM.ad pet_mark.xbm: ../win/X11/pet_mark.xbm cp ../win/X11/pet_mark.xbm pet_mark.xbm rip.xpm: ../win/X11/rip.xpm cp ../win/X11/rip.xpm rip.xpm mapbg.xpm: ../win/gnome/mapbg.xpm cp ../win/gnome/mapbg.xpm mapbg.xpm nhsplash.xpm: ../win/Qt/nhsplash.xpm cp ../win/Qt/nhsplash.xpm nhsplash.xpm nethack.icns: ../win/Qt/nhicns.uu $(UUDECODE) ../win/Qt/nhicns.uu Info.plist: ../win/Qt/Info.pli cp ../win/Qt/Info.pli Info.plist ../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 GEM_RSC.RSC: # cp ../win/gem/GEM_RSC.RSC GEM_RSC.RSC $(UUDECODE) ../win/gem/gem_rsc.uu data: data.base ../util/makedefs ../util/makedefs -d rumors: rumors.tru rumors.fal ../util/makedefs ../util/makedefs -r quest.dat: quest.txt ../util/makedefs ../util/makedefs -q oracles: oracles.txt ../util/makedefs ../util/makedefs -h # note: 'options' should have already been made when include/date.h was created options: ../util/makedefs ../util/makedefs -v spec_levs: ../util/lev_comp \ beholder.des bigroom.des blkmar.des castle.des grund.des dragons.des \ endgame.des frnknstn.des gehennom.des giants.des guild.des knox.des \ kobold-1.des kobold-2.des lich.des mall-1.des mall-2.des medusa.des \ mines.des mtemple.des newmall.des nightmar.des nymph.des oracle.des \ rats.des sea.des spiders.des stor-1.des stor-2.des stor-3.des tomb.des \ tower.des yendor.des sokoban.des ../util/lev_comp beholder.des ../util/lev_comp bigroom.des ../util/lev_comp blkmar.des ../util/lev_comp castle.des ../util/lev_comp grund.des ../util/lev_comp dragons.des ../util/lev_comp endgame.des ../util/lev_comp frnknstn.des ../util/lev_comp gehennom.des ../util/lev_comp giants.des ../util/lev_comp guild.des ../util/lev_comp knox.des ../util/lev_comp kobold-1.des ../util/lev_comp kobold-2.des ../util/lev_comp lich.des ../util/lev_comp mall-1.des ../util/lev_comp mall-2.des ../util/lev_comp medusa.des ../util/lev_comp mines.des ../util/lev_comp mtemple.des ../util/lev_comp newmall.des ../util/lev_comp nightmar.des ../util/lev_comp nymph.des ../util/lev_comp oracle.des ../util/lev_comp rats.des ../util/lev_comp sea.des ../util/lev_comp sokoban.des ../util/lev_comp spiders.des ../util/lev_comp stor-1.des ../util/lev_comp stor-2.des ../util/lev_comp stor-3.des ../util/lev_comp tomb.des ../util/lev_comp tower.des ../util/lev_comp yendor.des touch spec_levs quest_levs: ../util/lev_comp \ Arch.des Barb.des Caveman.des Flame.des Healer.des Ice.des Knight.des \ Monk.des Necro.des Priest.des Ranger.des Rogue.des Samurai.des \ Tourist.des Slayer.des Valkyrie.des Wizard.des Yeoman.des ../util/lev_comp Arch.des ../util/lev_comp Barb.des ../util/lev_comp Caveman.des ../util/lev_comp Flame.des ../util/lev_comp Healer.des ../util/lev_comp Ice.des ../util/lev_comp Knight.des ../util/lev_comp Monk.des ../util/lev_comp Necro.des ../util/lev_comp Priest.des ../util/lev_comp Ranger.des ../util/lev_comp Rogue.des ../util/lev_comp Samurai.des @if egrep -s tourists options > /dev/null ; then \ echo ../util/lev_comp Tourist.des ; ../util/lev_comp Tourist.des ; \ else rm -f Tou-goal.lev Tou-fil?.lev Tou-loca.lev Tou-strt.lev ; fi ../util/lev_comp Slayer.des ../util/lev_comp Valkyrie.des ../util/lev_comp Wizard.des @if egrep -s yeomen options > /dev/null ; then \ echo ../util/lev_comp Yeoman.des ; ../util/lev_comp Yeoman.des ; \ else rm -f Yeo-goal.lev Yeo-fil?.lev Yeo-loca.lev Yeo-strt.lev ; fi touch quest_levs dungeon: dungeon.def ../util/makedefs ../util/dgn_comp ../util/makedefs -e ../util/dgn_comp dungeon.pdf spotless: -rm -f spec_levs quest_levs *.lev $(VARDAT) dungeon dungeon.pdf -rm -f nhshare nhushare x11tiles x11bigtiles x11big3dtiles beostiles -rm -f x11tiles.map x11bigtiles.map x11big3dtiles.map -rm -f gtkrc -rm -f gl*.png -rm -f pet_mark.xbm rip.xpm mapbg.xpm -rm -f rip.img GEM_RSC.RSC title.img nh16.img SlashEM.ad -rm -f ../win/share/monmag.txt ../win/share/mon32.txt -rm -f ../win/share/objmag.txt ../win/share/obj32.txt -rm -f ../win/share/othmag.txt ../win/share/oth32.txt -rm -f ../win/share/monbig.txt ../win/share/mon3d.txt -rm -f ../win/share/objbig.txt ../win/share/obj3d.txt -rm -f ../win/share/othbig.txt ../win/share/oth3d.txt -rm -f ../win/share/mon32-t.txt -rm -f ../win/share/obj32-t.txt -rm -f ../win/share/oth32-t.txt slashem-0.0.7E7F3/sys/unix/depend.awk0000664000076400007640000001360710545462317015427 0ustar aliali# depend.awk -- awk script used to construct makefile dependencies # for nethack's source files (`make depend' support for Makefile.src). # # usage: # cd src ; nawk -f depend.awk ../include/*.h list-of-.c/.cpp-files # # This awk program scans each file in sequence, looking for lines beginning # with `#include "' and recording the name inside the quotes. For .h files, # that's all it does. For each .c file, it writes out a make rule for the # corresponding .o file; dependencies in nested header files are propagated # to the .o target. # # config.h and hack.h get special handling because of their heavy use; # timestamps for them allow make to avoid rechecking dates on # subsidiary headers for every source file; # extern.h gets special handling to avoid excessive recompilation # during development; # patchlev.h gets special handling because it only exists on systems # which consider filename patchlevel.h to be too long; # interp.c gets special handling because it usually doesn't exist; it's # assumed to be the last #include in the file where it occurs. # win32api.h gets special handling because it only exists for some ports; # it's assumed to be the last #include in the file where it occurs # BEGIN { FS = "\"" #for `#include "X"', $2 is X special[++sp_cnt] = "../include/config.h" special[++sp_cnt] = "../include/hack.h" alt_deps["../include/extern.h"] = "" alt_deps["../include/patchlev.h"] = "" alt_deps["interp.c"] = " #interp.c" #comment it out alt_deps["../include/win32api.h"] = " #../include/win32api.h" } FNR == 1 { output_dep() #finish previous file file = FILENAME #setup for current file } /^\#[ \t]*include[ \t]+\"/ { #find `#include "X"' incl = $2; #[3.4.0: gnomehack headers currently aren't in include] #[0.0.7: gtkhack internal headers aren't in include] if (incl ~ /\.h$/) { if (incl ~ /^gn/) # gnomehack special case incl = "../win/gnome/" incl else if (incl ~ /^gtk/) # gtkhack special case incl = "../win/gtk/" incl else incl = "../include/" incl } deps[file] = deps[file] " " incl } END { output_dep() } #finish the last file # # `file' has been fully scanned, so process it now; for .h files, # don't do anything (we've just been collecting their dependencies); # for .c files, output the `make' rule for corresponding .o file # function output_dep( targ) { if (file ~ /\.cp*$/) { #prior to very first .c|.cpp file, handle some special header file cases if (!c_count++) output_specials() #construct object filename from source filename targ = file; sub("^.+/", "", targ); sub("\\.cp*$", ".o", targ) #format and write the collected dependencies format_dep(targ, file) } } # # handle some targets (config.h, hack.h) via special timestamping rules # function output_specials( i, sp, alt_sp) { for (i = 1; i <= sp_cnt; i++) { sp = special[i] #change "../include/foo.h" first to "foo.h", then ultimately to "$(FOO_H)" alt_sp = sp; sub("^.+/", "", alt_sp) print "#", alt_sp, "timestamp" #output a `make' comment #- sub("\\.", "_", alt_sp); alt_sp = "$(" toupper(alt_sp) ")" #+ Some nawks don't have toupper(), so hardwire these instead. sub("config.h", "$(CONFIG_H)", alt_sp); sub("hack.h", "$(HACK_H)", alt_sp); format_dep(alt_sp, sp) #output the target print "\ttouch " alt_sp #output a build command alt_deps[sp] = alt_sp #alternate dependency for depend() } print "#" } # # write a target and its dependency list in pretty-printed format; # if target's primary source file has a path prefix, also write build command # function format_dep(target, source, n, i, list) { split("", done) #``for (x in done) delete done[x]'' printf("%s:", target); col = length(target) + 1 #- printf("\t"); col += 8 - (col % 8); #- if (col == 8) { printf("\t"); col += 8 } source = depend("", source, 0) n = split(source, list, " +") for (i = 2; i <= n; i++) { #(leading whitespace yields empty 1st element) if (col + length(list[i]) >= (i < n ? 78 : 80)) { printf(" \\\n\t\t"); col = 16 #make a backslash+newline split } else { printf(" "); col++; } printf("%s", list[i]); col += length(list[i]) } printf("\n") #terminate #write build command if first source entry has non-include path prefix source = list[2] if (source ~ /\// && substr(source, 1, 11) != "../include/") { if (source ~ /\.cpp$/ ) print "\t$(CXX) $(CXXFLAGS) -c " source else if (source ~ /^..\/win\/gtk\// ) print "\t$(CC) $(CFLAGS) $(WINGTKCFLAGS) -c " source else if (source ~ /^..\/win\/gtk2\// ) print "\t$(CC) $(CFLAGS) $(WINGTKCFLAGS) -c " source else if (source ~ /^..\/win\/gl\// ) print "\t$(CC) $(CFLAGS) $(SDLGL_CFLAGS) -c " source else if (source ~ /\/gnome\//) # "../win/gnome/foo.c" print "\t$(CC) $(CFLAGS) $(GNOMEINC) -c " source else print "\t$(CC) $(CFLAGS) -c " source } } # # recursively add the dependencies for file `name' to string `inout' # (unless `skip', in which case we're only marking files as already done) # function depend(inout, name, skip, n, i, list) { if (!done[name]++) { if (name in alt_deps) { #some names have non-conventional dependencies if (!skip) inout = inout " " alt_deps[name] skip = 1 } else { #ordinary name if (!skip) inout = inout " " name } if (name in deps) { #- n = split(deps[name], list, " +") #- for (i = 2; i <= n; i++) #(leading whitespace yields empty 1st element) #- inout = depend(inout, list[i], skip) #+ At least one implementation of nawk handles the local array `list' wrong, #+ so the clumsier substitute code below is used as a workaround. list = deps[name]; sub("^ +", "", list) while (list) { match((list " "), " +"); i = RSTART; n = RLENGTH inout = depend(inout, substr(list, 1, i-1), skip) list = substr(list, i+n) } } } return inout } #depend.awk# slashem-0.0.7E7F3/sys/unix/snd86unx.shr0000664000076400007640000007044710545462317015704 0ustar aliali# This is a shell archive. Save it in a file, remove anything before # this line, and then unpack it by entering "sh file". Note, it may # create directories; files and directories will be owned by you and # have default permissions. # # This archive contains: # # READ.ME # install.bsd # spkr.7 # Makefile # spkr.c # spkr.h # interp.c # Files # Install # Master # Name # Node # Remove # Size # System # playtest # echo x - READ.ME sed 's/^X//' >READ.ME << 'END-of-READ.ME' X Console Speaker Driver Package (v1.1) X X by Eric S. Raymond (esr@snark.thyrsus.com) X XThis package gives 80386 machines running SVr3.2 or later the ability to play Xtunes on the console speaker. It has been extended to 386BSD (and possibly XBSDI) by Andrew A. Chernov, and to SCO UNIX 3.2.4 (and possibly other VPIX Xsystems) by Andreas Arens. X XThe following files are contained in the kit: X XDocumentation and examples: XREAD.ME -- this file Xspeaker.7 -- man page for the driver Xplaytest -- test script exercising familiar tunes X XInstallable driver kit parts, for SVr3.2 or later: XFiles -- list of driver package file locations XInstall -- installation script for driver kit XMaster -- mdevice entry for speaker driver XName -- name entry foe speaker driver XNode -- /dev node specification file XRemove -- Driver removal script XSize -- installation size data XSystem -- sdevice entry for speaker driver X XDriver source code, for SVr3.2 or later and 386BSD: XMakefile -- Makefile for driver code Xspkr.c -- the driver source Xspeaker.h -- ioctl interface file X XCommon source code: Xinterp.c -- play string interpretation code X XFor SVr3.2 or later, simply type `make' and wait. Then type ./Install Xand follow its instructions. You will have to install the man pages by hand. XBe aware that the speaker.7 man page uses tbl(1) constructs. X XFor 386BSD, follow the installation instructions in install.bsd. X XFor SCO UNIX 3.2.4, no new kernel drivers are needed, and you need only Xcopy interp.c to your src directory and proceed with making NetHack, with XVPIX_MUSIC set in unixconf.h. X XInteresting tunes mailed to the author will be periodically posted in batches Xand added to the test script for future versions. X X Revision notes X X1.1 -- fixed minor bug in M[LSN] interpretation, added octave-tracking. X Tweaked the playtest examples. END-of-READ.ME echo x - install.bsd sed 's/^X//' >install.bsd << 'END-of-install.bsd' XCopy spkr.c and interp.c to /sys/i386/isa XCopy spkr.h to /sys/sys X X----------------------------------------------------------------------------- X XFile /sys/i386/conf/YOUR_MACHINE_NAME Xadd following line: X Xpseudo-device speaker X X----------------------------------------------------------------------------- X XFile /sys/i386/conf/files.i386 Xadd following line: X Xi386/isa/spkr.c optional speaker X X----------------------------------------------------------------------------- X XFile /sys/i386/i386/conf.c X[major number 20 (hex) is registered for spkr driver, don't change it] Xadd following code: X X#include "speaker.h" X#if NSPEAKER > 0 Xint spkropen(),spkrclose(),spkrwrite(),spkrioctl(); X#else X#define spkropen enxio X#define spkrclose enxio X#define spkrwrite enxio X#define spkrioctl enxio X#endif X ... X Xstruct cdevsw cdevsw[] = X{ X ... X X { spkropen, spkrclose, enxio, spkrwrite, /*20*/ X spkrioctl, enxio, enxio, NULL, X enxio, enxio, enxio }, X ... X X----------------------------------------------------------------------------- X XMake corresponding device: X X mknod /dev/speaker c 32 0 X X[major number 32 (20 hex) is registered for spkr driver, don't change it] X X----------------------------------------------------------------------------- X XGo to /sys/i386/conf and type X config YOUR_MACHINE_NAME Xthen go to /sys/compile/YOUR_MACHINE_NAME and type X make depend X make X END-of-install.bsd echo x - spkr.7 sed 's/^X//' >spkr.7 << 'END-of-spkr.7' X.TH SPKR 7 X.SH NAME Xspkr \- console speaker device driver X.SH DESCRIPTION XThe speaker device driver allows applications to control the PC console Xspeaker on an IBM-PC-compatible machine running UNIX. X.PP XOnly one process may have this device open at any given time; open() and Xclose() are used to lock and relinquish it. An attempt to open() when Xanother process has the device locked will return -1 with an EBUSY error Xindication. Writes to the device are interpreted as 'play strings' in a Xsimple ASCII melody notation. An ioctl() for tone generation at arbitrary Xfrequencies is also supported. X.PP XSound-generation does \fInot\fR monopolize the processor; in fact, the driver Xspends most of its time sleeping while the PC hardware is emitting Xtones. Other processes may emit beeps while the driver is running. X.PP XApplications may call ioctl() on a speaker file descriptor to control the Xspeaker driver directly; definitions for the ioctl() interface are in Xsys/spkr.h. The tone_t structure used in these calls has two fields, Xspecifying a frequency (in hz) and a duration (in 1/100ths of a second). XA frequency of zero is interpreted as a rest. X.PP XAt present there are two such ioctls. SPKRTONE accepts a pointer to a Xsingle tone structure as third argument and plays it. SPKRTUNE accepts a Xpointer to the first of an array of tone structures and plays them in Xcontinuous sequence; this array must be terminated by a final member with Xa zero duration. X.PP XThe play-string language is modelled on the PLAY statement conventions of XIBM BASIC 2.0. The MB, MF and X primitives of PLAY are not useful in a UNIX Xenvironment and are omitted. The `octave-tracking' feature is also new. X.PP XThere are 84 accessible notes numbered 1-83 in 7 octaves, each running from XC to B, numbered 0-6; the scale is equal-tempered A440 and octave 3 starts Xwith middle C. By default, the play function emits half-second notes with the Xlast 1/16th second being `rest time'. X.PP XPlay strings are interpreted left to right as a series of play command groups; Xletter case is ignored. Play command groups are as follows: X.PP XCDEFGAB -- letters A through G cause the corresponding note to be played in the Xcurrent octave. A note letter may optionally be followed by an \fIaccidental Xsign\fR, one of # + or -; the first two of these cause it to be sharped one Xhalf-tone, the last causes it to be flatted one half-tone. It may also be Xfollowed by a time value number and by sustain dots (see below). Time values Xare interpreted as for the L command below;. X.PP XO -- if is numeric, this sets the current octave. may also be one Xof 'L' or 'N' to enable or disable octave-tracking (it is disabled by default). XWhen octave-tracking is on, interpretation of a pair of letter notes will Xchange octaves if necessary in order to make the smallest possible jump between Xnotes. Thus "olbc" will be played as "olb>c", and "olcb" as "olc, < and O[0123456]. X.PP X> -- bump the current octave up one. X.PP X< -- drop the current octave down one. X.PP XN -- play note n, n being 1 to 84 or 0 for a rest of current time value. XMay be followedv by sustain dots. X.PP XL -- sets the current time value for notes. The default is L4, quarter Xnotes. The lowest possible value is 1; values up to 64 are accepted. L1 sets Xwhole notes, L2 sets half notes, L4 sets quarter notes, etc.. X.PP XP -- pause (rest), with interpreted as for L. May be followed by Xsustain dots. May also be written '~'. X.PP XT -- Sets the number of quarter notes per minute; default is 120. Musical Xnames for common tempi are: X X.TS Xa a a. X Tempo Beats Per Minute Xvery slow Larghissimo X Largo 40-60 X Larghetto 60-66 X Grave X Lento X Adagio 66-76 Xslow Adagietto X Andante 76-108 Xmedium Andantino X Moderato 108-120 Xfast Allegretto X Allegro 120-168 X Vivace X Veloce X Presto 168-208 Xvery fast Prestissimo X.TE X.PP XM[LNS] -- set articulation. MN (N for normal) is the default; the last 1/8th of Xthe note's value is rest time. You can set ML for legato (no rest space) or XMS (staccato) 1/4 rest space. X.PP XNotes (that is, CDEFGAB or N command character groups) may be followed by Xsustain dots. Each dot causes the note's value to be lengthened by one-half Xfor each one. Thus, a note dotted once is held for 3/2 of its undotted value; Xdotted twice, it is held 9/4, and three times would give 27/8. X.PP XWhitespace in play strings is simply skipped and may be used to separate Xmelody sections. X.SH BUGS XDue to roundoff in the pitch tables and slop in the tone-generation and timer Xhardware (neither of which was designed for precision), neither pitch accuracy Xnor timings will be mathematically exact. There is no volume control. X.PP XIn play strings which are very long (longer than your system's physical I/O Xblocks) note suffixes or numbers may occasionally be parsed incorrectly due Xto crossing a block boundary. X.SH FILES X/dev/speaker -- speaker device file X.SH AUTHOR XEric S. Raymond (esr@snark.thyrsus.com) Feb 1990 END-of-spkr.7 echo x - Makefile sed 's/^X//' >Makefile << 'END-of-Makefile' X# X# Speaker driver package makefile X# XCFLAGS = -I. -O # -DDEBUG XLDFLAGS = -s X Xall: Driver.o X Xinstall: X ./Install X XDriver.o: spkr.c X $(CC) $(CFLAGS) -c spkr.c X mv spkr.o Driver.o X Xclean: X rm -f Driver.o *~ speaker.shar X XDSP = Files Install Master Name Node Remove Size System Xshar: X shar READ.ME install.bsd spkr.7 Makefile spkr.[ch] \ X interp.c $(DSP) playtest >speaker.shar END-of-Makefile echo x - spkr.c sed 's/^X//' >spkr.c << 'END-of-spkr.c' X/* X * spkr.c -- device driver for console speaker on 80386 X * X * v1.1 by Eric S. Raymond (esr@snark.thyrsus.com) Feb 1990 X * modified for 386bsd by Andrew A. Chernov X */ X X#ifdef __386BSD__ X#include "speaker.h" X#endif X#if !defined(__386BSD__) || (NSPEAKER > 0) X X#ifdef __386BSD__ X#include "types.h" X#include "param.h" X#include "errno.h" X#include "buf.h" X#include "uio.h" X X#define CADDR caddr_t X#define err_ret(x) return(x) X#else /* SYSV */ X#include X#include X#include X#include X#include X#include X#include X#include X#include X X#define CADDR char * X#define err_ret(x) u.u_error = (x) X#endif X X#include "spkr.h" X X/**************** MACHINE DEPENDENT PART STARTS HERE ************************* X * X * This section defines a function tone() which causes a tone of given X * frequency and duration from the 80x86's console speaker. X * Another function endtone() is defined to force sound off, and there is X * also a rest() entry point to do pauses. X * X * Audible sound is generated using the Programmable Interval Timer (PIT) and X * Programmable Peripheral Interface (PPI) attached to the 80x86's speaker. The X * PPI controls whether sound is passed through at all; the PIT's channel 2 is X * used to generate clicks (a square wave) of whatever frequency is desired. X * X * The non-BSD code requires SVr3.2-compatible inb(), outb(), timeout(), X * sleep(), and wakeup(). X */ X X/* X * PIT and PPI port addresses and control values X * X * Most of the magic is hidden in the TIMER_PREP value, which selects PIT X * channel 2, frequency LSB first, square-wave mode and binary encoding. X * The encoding is as follows: X * X * +----------+----------+---------------+-----+ X * | 1 0 | 1 1 | 0 1 1 | 0 | X * | SC1 SC0 | RW1 RW0 | M2 M1 M0 | BCD | X * +----------+----------+---------------+-----+ X * Counter Write Mode 3 Binary X * Channel 2 LSB first, (Square Wave) Encoding X * MSB second X */ X#define PPI 0x61 /* port of Programmable Peripheral Interface */ X#define PPI_SPKR 0x03 /* turn these PPI bits on to pass sound */ X#define PIT_CTRL 0x43 /* PIT control address */ X#define PIT_COUNT 0x42 /* PIT count address */ X#define PIT_MODE 0xB6 /* set timer mode for sound generation */ X X/* X * Magic numbers for timer control. X */ X#define TIMER_CLK 1193180L /* corresponds to 18.2 MHz tick rate */ X Xstatic int endtone() X/* turn off the speaker, ending current tone */ X{ X wakeup((CADDR)endtone); X outb(PPI, inb(PPI) & ~PPI_SPKR); X} X Xstatic void tone(hz, ticks) X/* emit tone of frequency hz for given number of ticks */ Xunsigned int hz, ticks; X{ X unsigned int divisor = TIMER_CLK / hz; X int sps; X X#ifdef DEBUG X printf("tone: hz=%d ticks=%d\n", hz, ticks); X#endif /* DEBUG */ X X /* set timer to generate clicks at given frequency in Hertz */ X#ifdef __386BSD__ X sps = spltty(); X#else X sps = spl5(); X#endif X outb(PIT_CTRL, PIT_MODE); /* prepare timer */ X outb(PIT_COUNT, (unsigned char) divisor); /* send lo byte */ X outb(PIT_COUNT, (divisor >> 8)); /* send hi byte */ X splx(sps); X X /* turn the speaker on */ X outb(PPI, inb(PPI) | PPI_SPKR); X X /* X * Set timeout to endtone function, then give up the timeslice. X * This is so other processes can execute while the tone is being X * emitted. X */ X timeout((CADDR)endtone, (CADDR)NULL, ticks); X sleep((CADDR)endtone, PZERO - 1); X} X Xstatic int endrest() X/* end a rest */ X{ X wakeup((CADDR)endrest); X} X Xstatic void rest(ticks) X/* rest for given number of ticks */ Xint ticks; X{ X /* X * Set timeout to endrest function, then give up the timeslice. X * This is so other processes can execute while the rest is being X * waited out. X */ X#ifdef DEBUG X printf("rest: %d\n", ticks); X#endif /* DEBUG */ X timeout((CADDR)endrest, (CADDR)NULL, ticks); X sleep((CADDR)endrest, PZERO - 1); X} X X#include "interp.c" /* playinit() and playstring() */ X X/******************* UNIX DRIVER HOOKS BEGIN HERE ************************** X * X * This section implements driver hooks to run playstring() and the tone(), X * endtone(), and rest() functions defined above. For non-BSD systems, X * SVr3.2-compatible copyin() is also required. X */ X Xstatic int spkr_active; /* exclusion flag */ X#ifdef __386BSD__ Xstatic struct buf *spkr_inbuf; /* incoming buf */ X#endif X Xint spkropen(dev) Xdev_t dev; X{ X#ifdef DEBUG X printf("spkropen: entering with dev = %x\n", dev); X#endif /* DEBUG */ X X if (minor(dev) != 0) X err_ret(ENXIO); X else if (spkr_active) X err_ret(EBUSY); X else X { X playinit(); X#ifdef __386BSD__ X spkr_inbuf = geteblk(DEV_BSIZE); X#endif X spkr_active = 1; X } X#ifdef __386BSD__ X return(0); X#endif X} X X#ifdef __386BSD__ Xint spkrwrite(dev, uio) Xstruct uio *uio; X#else Xint spkrwrite(dev) X#endif Xdev_t dev; X{ X#ifdef __386BSD__ X register unsigned n; X char *cp; X int error; X#endif X#ifdef DEBUG X#ifdef __386BSD__ X printf("spkrwrite: entering with dev = %x, count = %d\n", X dev, uio->uio_resid); X#else X printf("spkrwrite: entering with dev = %x, u.u_count = %d\n", X dev, u.u_count); X#endif X#endif /* DEBUG */ X X if (minor(dev) != 0) X err_ret(ENXIO); X else X { X#ifdef __386BSD__ X n = MIN(DEV_BSIZE, uio->uio_resid); X cp = spkr_inbuf->b_un.b_addr; X error = uiomove(cp, n, uio); X if (!error) X playstring(cp, n); X return(error); X#else X char bfr[STD_BLK]; X X copyin(u.u_base, bfr, u.u_count); X playstring(bfr, u.u_count); X u.u_base += u.u_count; X u.u_count = 0; X#endif X } X} X Xint spkrclose(dev) Xdev_t dev; X{ X#ifdef DEBUG X printf("spkrclose: entering with dev = %x\n", dev); X#endif /* DEBUG */ X X if (minor(dev) != 0) X err_ret(ENXIO); X else X { X endtone(); X#ifdef __386BSD__ X brelse(spkr_inbuf); X#endif X spkr_active = 0; X } X#ifdef __386BSD__ X return(0); X#endif X} X Xint spkrioctl(dev, cmd, cmdarg) Xdev_t dev; Xint cmd; XCADDR cmdarg; X{ X#ifdef DEBUG X printf("spkrioctl: entering with dev = %x, cmd = %x\n", dev, cmd); X#endif /* DEBUG */ X X if (minor(dev) != 0) X err_ret(ENXIO); X else if (cmd == SPKRTONE) X { X tone_t *tp = (tone_t *)cmdarg; X X if (tp->frequency == 0) X rest(tp->duration); X else X tone(tp->frequency, tp->duration); X } X else if (cmd == SPKRTUNE) X { X#ifdef __386BSD__ X tone_t *tp = (tone_t *)(*(caddr_t *)cmdarg); X tone_t ttp; X int error; X X for (; ; tp++) { X error = copyin(tp, &ttp, sizeof(tone_t)); X if (error) X return(error); X if (ttp.duration == 0) X break; X if (ttp.frequency == 0) X rest(ttp.duration); X else X tone(ttp.frequency, ttp.duration); X } X#else X tone_t *tp = (tone_t *)cmdarg; X X for (; tp->duration; tp++) X if (tp->frequency == 0) X rest(tp->duration); X else X tone(tp->frequency, tp->duration); X#endif X } X else X err_ret(EINVAL); X#ifdef __386BSD__ X return(0); X#endif X} X X#endif /* !defined(__386BSD__) || (NSPEAKER > 0) */ X/* spkr.c ends here */ END-of-spkr.c echo x - spkr.h sed 's/^X//' >spkr.h << 'END-of-spkr.h' X/* X * spkr.h -- interface definitions for speaker ioctl() X * X * v1.1 by Eric S. Raymond (esr@snark.thyrsus.com) Feb 1990 X * modified for 386bsd by Andrew A. Chernov X */ X X#ifndef _SPKR_H_ X#define _SPKR_H_ X X#ifdef __386BSD__ X#ifndef KERNEL X#include X#else X#include "ioctl.h" X#endif X X#define SPKRTONE _IOW('S', 1, tone_t) /* emit tone */ X#define SPKRTUNE _IO('S', 2) /* emit tone sequence*/ X#else /* SYSV */ X#define SPKRIOC ('S'<<8) X#define SPKRTONE (SPKRIOC|1) /* emit tone */ X#define SPKRTUNE (SPKRIOC|2) /* emit tone sequence*/ X#endif X Xtypedef struct X{ X int frequency; /* in hertz */ X int duration; /* in 1/100ths of a second */ X} Xtone_t; X X#endif /* _SPKR_H_ */ X/* spkr.h ends here */ END-of-spkr.h echo x - interp.c sed 's/^X//' >interp.c << 'END-of-interp.c' X/* X * interp.c -- device driver for console speaker on 80386 X * X * v1.1 by Eric S. Raymond (esr@snark.thyrsus.com) Feb 1990 X * X * this is the part of the code common to all 386 UNIX OSes X * X * playinit() and playstring() are called from the appropriate driver X */ X X#ifdef __386BSD__ X#include "param.h" X#else X#include X#endif X X#ifndef HZ X#define HZ 60 X#endif X X X/**************** PLAY STRING INTERPRETER BEGINS HERE ********************** X * X * Play string interpretation is modelled on IBM BASIC 2.0's PLAY statement; X * M[LNS] are missing and the ~ synonym and octave-tracking facility is added. X * Requires tone(), rest(), and endtone(). String play is not interruptible X * except possibly at physical block boundaries. X */ X Xtypedef int bool; X#ifndef TRUE X#define TRUE 1 X#endif X#ifndef FALSE X#define FALSE 0 X#endif X X#define toupper(c) ((c) - ' ' * (((c) >= 'a') && ((c) <= 'z'))) X#define isdigit(c) (((c) >= '0') && ((c) <= '9')) X#define dtoi(c) ((c) - '0') X Xstatic int octave; /* currently selected octave */ Xstatic int whole; /* whole-note time at current tempo, in ticks */ Xstatic int value; /* whole divisor for note time, quarter note = 1 */ Xstatic int fill; /* controls spacing of notes */ Xstatic bool octtrack; /* octave-tracking on? */ Xstatic bool octprefix; /* override current octave-tracking state? */ X X/* X * Magic number avoidance... X */ X#define SECS_PER_MIN 60 /* seconds per minute */ X#define WHOLE_NOTE 4 /* quarter notes per whole note */ X#define MIN_VALUE 64 /* the most we can divide a note by */ X#define DFLT_VALUE 4 /* default value (quarter-note) */ X#define FILLTIME 8 /* for articulation, break note in parts */ X#define STACCATO 6 /* 6/8 = 3/4 of note is filled */ X#define NORMAL 7 /* 7/8ths of note interval is filled */ X#define LEGATO 8 /* all of note interval is filled */ X#define DFLT_OCTAVE 4 /* default octave */ X#define MIN_TEMPO 32 /* minimum tempo */ X#define DFLT_TEMPO 120 /* default tempo */ X#define MAX_TEMPO 255 /* max tempo */ X#define NUM_MULT 3 /* numerator of dot multiplier */ X#define DENOM_MULT 2 /* denominator of dot multiplier */ X X/* letter to half-tone: A B C D E F G */ Xstatic int notetab[8] = {9, 11, 0, 2, 4, 5, 7}; X X/* X * This is the American Standard A440 Equal-Tempered scale with frequencies X * rounded to nearest integer. Thank Goddess for the good ol' CRC Handbook... X * our octave 0 is standard octave 2. X */ X#define OCTAVE_NOTES 12 /* semitones per octave */ Xstatic int pitchtab[] = X{ X/* C C# D D# E F F# G G# A A# B*/ X/* 0 */ 65, 69, 73, 78, 82, 87, 93, 98, 103, 110, 117, 123, X/* 1 */ 131, 139, 147, 156, 165, 175, 185, 196, 208, 220, 233, 247, X/* 2 */ 262, 277, 294, 311, 330, 349, 370, 392, 415, 440, 466, 494, X/* 3 */ 523, 554, 587, 622, 659, 698, 740, 784, 831, 880, 932, 988, X/* 4 */ 1047, 1109, 1175, 1245, 1319, 1397, 1480, 1568, 1661, 1760, 1865, 1975, X/* 5 */ 2093, 2217, 2349, 2489, 2637, 2794, 2960, 3136, 3322, 3520, 3729, 3951, X/* 6 */ 4186, 4435, 4698, 4978, 5274, 5588, 5920, 6272, 6644, 7040, 7459, 7902, X}; X Xstatic void playinit() X{ X octave = DFLT_OCTAVE; X whole = (HZ * SECS_PER_MIN * WHOLE_NOTE) / DFLT_TEMPO; X fill = NORMAL; X value = DFLT_VALUE; X octtrack = FALSE; X octprefix = TRUE; /* act as though there was an initial O(n) */ X} X Xstatic void playtone(pitch, value, sustain) X/* play tone of proper duration for current rhythm signature */ Xint pitch, value, sustain; X{ X register int sound, silence, snum = 1, sdenom = 1; X X /* this weirdness avoids floating-point arithmetic */ X for (; sustain; sustain--) X { X snum *= NUM_MULT; X sdenom *= DENOM_MULT; X } X X if (pitch == -1) X rest(whole * snum / (value * sdenom)); X else X { X sound = (whole * snum) / (value * sdenom) X - (whole * (FILLTIME - fill)) / (value * FILLTIME); X silence = whole * (FILLTIME-fill) * snum / (FILLTIME * value * sdenom); X X#ifdef DEBUG X printf("playtone: pitch %d for %d ticks, rest for %d ticks\n", X pitch, sound, silence); X#endif /* DEBUG */ X X tone(pitchtab[pitch], sound); X if (fill != LEGATO) X rest(silence); X } X} X Xstatic int abs(n) Xint n; X{ X if (n < 0) X return(-n); X else X return(n); X} X Xstatic void playstring(cp, slen) X/* interpret and play an item from a notation string */ Xchar *cp; Xsize_t slen; X{ X int pitch, lastpitch = OCTAVE_NOTES * DFLT_OCTAVE; X X#define GETNUM(cp, v) for(v=0; isdigit(cp[1]) && slen > 0; ) \ X {v = v * 10 + (*++cp - '0'); slen--;} X for (; slen--; cp++) X { X int sustain, timeval, tempo; X register char c = toupper(*cp); X X#ifdef DEBUG X printf("playstring: %c (%x)\n", c, c); X#endif /* DEBUG */ X X switch (c) X { X case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': X X /* compute pitch */ X pitch = notetab[c - 'A'] + octave * OCTAVE_NOTES; X X /* this may be followed by an accidental sign */ X if (cp[1] == '#' || cp[1] == '+') X { X ++pitch; X ++cp; X slen--; X } X else if (cp[1] == '-') X { X --pitch; X ++cp; X slen--; X } X X /* X * If octave-tracking mode is on, and there has been no octave- X * setting prefix, find the version of the current letter note X * closest to the last regardless of octave. X */ X if (octtrack && !octprefix) X { X if (abs(pitch-lastpitch) > abs(pitch+OCTAVE_NOTES-lastpitch)) X { X ++octave; X pitch += OCTAVE_NOTES; X } X X if (abs(pitch-lastpitch) > abs((pitch-OCTAVE_NOTES)-lastpitch)) X { X --octave; X pitch -= OCTAVE_NOTES; X } X } X octprefix = FALSE; X lastpitch = pitch; X X /* ...which may in turn be followed by an override time value */ X GETNUM(cp, timeval); X if (timeval <= 0 || timeval > MIN_VALUE) X timeval = value; X X /* ...and/or sustain dots */ X for (sustain = 0; cp[1] == '.'; cp++) X { X slen--; X sustain++; X } X X /* time to emit the actual tone */ X playtone(pitch, timeval, sustain); X break; X X case 'O': X if (cp[1] == 'N' || cp[1] == 'n') X { X octprefix = octtrack = FALSE; X ++cp; X slen--; X } X else if (cp[1] == 'L' || cp[1] == 'l') X { X octtrack = TRUE; X ++cp; X slen--; X } X else X { X GETNUM(cp, octave); X if (octave >= sizeof(pitchtab) / OCTAVE_NOTES) X octave = DFLT_OCTAVE; X octprefix = TRUE; X } X break; X X case '>': X if (octave < sizeof(pitchtab) / OCTAVE_NOTES - 1) X octave++; X octprefix = TRUE; X break; X X case '<': X if (octave > 0) X octave--; X octprefix = TRUE; X break; X X case 'N': X GETNUM(cp, pitch); X for (sustain = 0; cp[1] == '.'; cp++) X { X slen--; X sustain++; X } X playtone(pitch - 1, value, sustain); X break; X X case 'L': X GETNUM(cp, value); X if (value <= 0 || value > MIN_VALUE) X value = DFLT_VALUE; X break; X X case 'P': X case '~': X /* this may be followed by an override time value */ X GETNUM(cp, timeval); X if (timeval <= 0 || timeval > MIN_VALUE) X timeval = value; X for (sustain = 0; cp[1] == '.'; cp++) X { X slen--; X sustain++; X } X playtone(-1, timeval, sustain); X break; X X case 'T': X GETNUM(cp, tempo); X if (tempo < MIN_TEMPO || tempo > MAX_TEMPO) X tempo = DFLT_TEMPO; X whole = (HZ * SECS_PER_MIN * WHOLE_NOTE) / tempo; X break; X X case 'M': X if (cp[1] == 'N' || cp[1] == 'n') X { X fill = NORMAL; X ++cp; X slen--; X } X else if (cp[1] == 'L' || cp[1] == 'l') X { X fill = LEGATO; X ++cp; X slen--; X } X else if (cp[1] == 'S' || cp[1] == 's') X { X fill = STACCATO; X ++cp; X slen--; X } X break; X } X } X} END-of-interp.c echo x - Files sed 's/^X//' >Files << 'END-of-Files' X/usr/include/sys/spkr.h END-of-Files echo x - Install sed 's/^X//' >Install << 'END-of-Install' X# X# Speaker driver installation script X# XTMP=/tmp/speaker.err XERR1=" Errors have been written to the file $TMP." XERR2=" The Speaker Driver software was not installed." X Xecho "Installing Speaker Driver Software Package" X X/etc/conf/bin/idcheck -p speaker 2>$TMP Xif [ $? != 0 ] Xthen X echo "The speaker package is already at least partly installed. X Removing the old version now..." X /etc/conf/bin/idinstall -d speaker Xfi X X/etc/conf/bin/idinstall -a -k speaker 2>>$TMP Xif [ $? != 0 ] Xthen X message "There was an error during package installation. $ERR1 $ERR2" X exit 1 Xfi X X/etc/conf/bin/idbuild 2>>$TMP Xif [ $? != 0 ] Xthen X message "There was an error during kernel reconfiguration. $ERR1 $ERR2" X exit 1 Xfi X Xrm -f $TMP X Xcp spkr.h /usr/include/sys/spkr.h X Xecho "Performing shutdown..." Xcd /; exec /etc/shutdown -g0 -y END-of-Install echo x - Master sed 's/^X//' >Master << 'END-of-Master' Xspeaker ocwi iocH spkr 0 0 1 1 -1 END-of-Master echo x - Name sed 's/^X//' >Name << 'END-of-Name' X386 UNIX Speaker Device Driver Package END-of-Name echo x - Node sed 's/^X//' >Node << 'END-of-Node' Xspeaker speaker c 0 END-of-Node echo x - Remove sed 's/^X//' >Remove << 'END-of-Remove' X# X# Speaker driver remove script X# XTMP=/tmp/speaker.err XRERR="Errors have been written to the file $TMP." X Xecho "Removing Speaker Driver Software Package" X X/etc/conf/bin/idinstall -d speaker 2>$TMP Xif [ $? != 0 ] Xthen X message "There was an error during package removal. $RERR" X exit 1 Xfi X X/etc/conf/bin/idbuild 2>>$TMP Xif [ $? != 0 ] Xthen X message "There was an error during kernel reconfiguration. $RERR" X exit 1 Xfi X Xrm -f /dev/speaker $TMP /usr/include/sys/spkr.h X Xexit 0 END-of-Remove echo x - Size sed 's/^X//' >Size << 'END-of-Size' XROOT=1400 XUSR=100 END-of-Size echo x - System sed 's/^X//' >System << 'END-of-System' Xspeaker Y 1 0 0 0 0 0 0 0 END-of-System echo x - playtest sed 's/^X//' >playtest << 'END-of-playtest' X: X# Test script for the speaker driver X# X# v1.0 by Eric S. Raymond (Feb 1990) X# modified for 386bsd by Andrew A. Chernov X# Xreveille="t255l8c.f.afc~c.f.afc~c.f.afc.f.a..f.~c.f.afc~c.f.afc~c.f.afc~c.f.." Xcontact="f" Xdance="t240dcdc/dev/speaker;; Xcontact) echo $contact >/dev/speaker;; Xdance) echo $dance >/dev/speaker;; Xloony) echo $loony >/dev/speaker;; X*) X echo "No such tune. Available tunes are:" X echo X echo "reveille -- Reveille" X echo "contact -- Contact theme from Close Encounters" X echo "dance -- Lord of the Dance (aka Simple Gifts)" X echo "loony -- Loony Toons theme" X ;; Xesac END-of-playtest exit slashem-0.0.7E7F3/sys/unix/setup.sh0000664000076400007640000000224710545462317015156 0ustar aliali#!/bin/sh # Copy files to their correct locations. # # If arguments are given, try symbolic link first. This is not the default # so that most people will have the distribution versions stay around so # subsequent patches can be applied. People who pay enough attention to # know there's a non-default behavior are assumed to pay enough attention # to keep distribution versions if they modify things. # Were we started from the top level? Cope. if [ -f sys/unix/Makefile.top ]; then cd sys/unix; fi if [ $# -gt 0 ] ; then # First, try to make a symbolic link. # ln -s Makefile.top Makefile >/dev/null 2>&1 if [ $? -eq 0 ] ; then echo "Lucky you! Symbolic links." rm -f Makefile umask 0 ln -s sys/unix/Makefile.top ../../Makefile ln -s ../sys/unix/Makefile.dat ../../dat/Makefile ln -s ../sys/unix/Makefile.doc ../../doc/Makefile ln -s ../sys/unix/Makefile.src ../../src/Makefile ln -s ../sys/unix/Makefile.utl ../../util/Makefile exit 0 fi fi # # Otherwise... echo "Copying Makefiles." cp Makefile.top ../../Makefile cp Makefile.dat ../../dat/Makefile cp Makefile.doc ../../doc/Makefile cp Makefile.src ../../src/Makefile cp Makefile.utl ../../util/Makefile slashem-0.0.7E7F3/sys/unix/Makefile.doc0000644000076400007640000000747010545462317015667 0ustar aliali# NetHack Makefile. # SCCS Id: @(#)Makefile.doc 3.4 1996/03/23 # WAC - added support for DOS DJGPP using GNU Groff package # Standard distribution documents are built using nroff, tbl and col # We'll be using groff to simulate nroff and col # tbl is in the Groff package # I don't see why this won't work on any other platform with GNU Groff # If you have Groff and col or nroff and col, use the standard Unix Makefile.doc # for Atari # SHELL=E:/GEMINI2/MUPFEL.TTP GUIDEBOOK = Guidebook # regular ASCII file #GUIDEBOOK = Guidebook.ps # PostScript file #GUIDEBOOK = Guidebook.dvi # TeX device-independent file # Some versions of col need -x to keep them from converting spaces to tabs; # some versions of col don't do the conversion by default and don't # recognize the option. Sigh. COLCMD = col -bx #COLCMD = col -b # The command to use to generate a PostScript file # PSCMD = ditroff | psdit PSCMD = groff -Wall -Tps # Use the "cat" GUIDECMD if groff and/or tbl are not installed # Not appropriate for creating Guidebook.txt. # DOS w/o cat users can use "type" # GUIDECMD = cat Guidebook.txt # GUIDECMD = type Guidebook.txt # The following work better with groff-1.18, eg on Linux # GUIDECMD = tbl tmac.n Guidebook.mn | nroff -c -Tascii | $(COLCMD) # GUIDECMD = tbl tmac.n Guidebook.mn | groff -Wall -mtty-char -Tascii -P-u -P-b GUIDECMD = tbl tmac.n Guidebook.mn | nroff | $(COLCMD) # the basic guidebook Guidebook: Guidebook.mn $(GUIDECMD) > Guidebook # 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. # - To print Guidebook.dvi you need to use a suitable dvi-driver. Guidebook.dvi: Guidebook.tex latex Guidebook.tex # Or for those with groff # Guidebook.dvi: Guidebook.mn # tbl tmac.n Guidebook.mn | groff -Wall -Tdvi > Guidebook.dvi GAME = slashem MANDIR = /usr/man/man6 MANEXT = 6 FRMANDIR= $(MANDIR:man6=fr/man6) # manual installation for most BSD-style systems GAMEMANCREATE = cp $(GAME).6 LEVMANCREATE = cp lev_comp.6 DGNMANCREATE = cp dgn_comp.6 RCVRMANCREATE = cp recover.6 DLBMANCREATE = cp dlb.6 FRGAMEMANCREATE = cp fr/$(GAME).6 # manual installation for most SYSV-style systems # and for man files readable in less (eg dos DJGPP+GNU) # GAMEMANCREATE = groff -Wall -mtty-char -Tascii -man $(GAME).6 > # LEVMANCREATE = groff -Wall -mtty-char -Tascii -man lev_comp.6 > # DGNMANCREATE = groff -Wall -mtty-char -Tascii -man dgn_comp.6 > # RCVRMANCREATE = groff -Wall -mtty-char -Tascii -man recover.6 > # DLBMANCREATE = groff -Wall -mtty-char -Tascii -man dlb.6 > # FRGAMEMANCREATE = groff -Wall -mtty-char -Tutf8 -man fr/$(GAME).6 > manpages: -$(GAMEMANCREATE) $(MANDIR)/$(GAME).$(MANEXT) -$(LEVMANCREATE) $(MANDIR)/lev_comp.$(MANEXT) -$(DGNMANCREATE) $(MANDIR)/dgn_comp.$(MANEXT) -$(RCVRMANCREATE) $(MANDIR)/recover.$(MANEXT) -$(DLBMANCREATE) $(MANDIR)/dlb.$(MANEXT) -$(FRGAMEMANCREATE) $(FRMANDIR)/$(GAME).$(MANEXT) # manual creation for distribution DISTRIB = Guidebook.txt $(GAME).txt lev_comp.txt dgn_comp.txt recover.txt dlb.txt distrib: $(DISTRIB) @echo "Plain text documentation is up to date." Guidebook.txt : Guidebook.mn tmac.n $(GUIDECMD) > Guidebook.txt $(GAME).txt : $(GAME).6 nroff -man $(GAME).6 | $(COLCMD) > $(GAME).txt lev_comp.txt : lev_comp.6 nroff -man lev_comp.6 | $(COLCMD) > lev_comp.txt dgn_comp.txt : dgn_comp.6 nroff -man dgn_comp.6 | $(COLCMD) > dgn_comp.txt recover.txt : recover.6 nroff -man recover.6 | $(COLCMD) > recover.txt dlb.txt : dlb.6 nroff -man dlb.6 | $(COLCMD) > dlb.txt clean: -rm -f Guidebook.aux Guidebook.log spotless: clean -rm -f Guidebook Guidebook.ps Guidebook.dvi maintainer-clean: spotless -rm -f $(DISTRIB) # -rm -f Makefile slashem-0.0.7E7F3/sys/unix/Makefile.utl0000664000076400007640000003410510545462317015723 0ustar aliali# 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 # these makes allow $(MAKE) to be overridden by the environment if someone # wants to (or has to) use something other than the standard make, so we do # not want to unconditionally set $(MAKE) here # # unfortunately, some older makes do not predefine $(MAKE); if you have one of # these, uncomment the following line # (you will know that you have one if you get complaints about unable to # execute things like 'foo.o') # MAKE = make # if you are using gcc as your compiler, # uncomment the CC definition below if it's not in your environment # CC = gcc # # For Bull DPX/2 systems at B.O.S. 2.0 or higher use the following: # # CC = gcc -ansi -D_BULL_SOURCE -D_XOPEN_SOURCE -D_POSIX_SOURCE # # If you are using GCC 2.2.2 or higher on a DPX/2, just use: # # CC = gcc -ansi # # For HP/UX 10.20 with GCC: # CC = gcc -D_POSIX_SOURCE # # if your make doesn't define a default SHELL properly, you may need # the line below (Atari users will need a bourne work-alike) # SHELL = /bin/sh # for Atari # SHELL=E:/GEMINI2/MUPFEL.TTP # flags may have to be changed as required # flags for 286 Xenix: # CFLAGS = -Ml2t16 -O -LARGE -I../include # LFLAGS = -Ml -F 4000 -SEG 512 # flags for 286 Microport SysV-AT # CFLAGS = -DDUMB -Ml -I../include # LFLAGS = -Ml # flags for Atari GCC (3.2.1) # CFLAGS = -O -I../include # LFLAGS = -s # flags for Atari GCC (3.3) # CFLAGS = -mshort -O2 -I../include # LFLAGS = -mshort -s # flags for Apollos using their native cc # (as long as it claims to be __STDC__ but isn't) # CFLAGS = -DAPOLLO -O -I../include # flags for AIX 3.1 cc on IBM RS/6000 to define # a suitable subset of standard libraries # (note that there is more info regarding the "-qchars=signed" # switch in file Install.unx note 8) # CFLAGS = -D_NO_PROTO -D_XOPEN_SOURCE -O -I../include -qchars=signed # and for AIX 3.2: # CFLAGS = -D_NO_PROTO -D_XOPEN_SOURCE -D_ALL_SOURCE -O -I../include -qchars=signed # flags for A/UX 2.01 using native cc or c89 # gcc predefines AUX so that's not needed there # CFLAGS = -ZS -D_POSIX_SOURCE -O -I../include -DAUX # flags for IRIX 4.0.x using native cc # SGI cc 3.10 will fail to compile makedefs with -O # CFLAGS = -I../include -D__STDC__ -woff 100,293 # 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 # BeOS on a Mac/BeBox: #CC = mwcc #CFLAGS = -I../include # BeOS on Intel: # the default values are fine # flags for debugging: # CFLAGS = -g -I../include CFLAGS = -O -I../include LFLAGS = LIBS = # If you are cross-compiling, you must use this: #OBJDIR = . # otherwise, you can save a little bit of disk space with this: OBJDIR = ../src # yacc/lex programs to use to generate *_comp.h, *_lex.c, and *_yacc.c. # if, instead of yacc/lex you have bison/flex, comment/uncomment the following. YACC = yacc LEX = lex # YACC = bison -y # YACC = byacc # LEX = flex # these are the names of the output files from YACC/LEX. Under MS-DOS # and similar systems, they may differ YTABC = y.tab.c YTABH = y.tab.h LEXYYC = lex.yy.c # YTABC = y_tab.c # YTABH = y_tab.h # LEXYYC = lexyy.c # ---------------------------------------- # # Nothing below this line should have to be changed. # timestamps for primary header files, matching src/Makefile CONFIG_H = ../src/config.h-t HACK_H = ../src/hack.h-t # utility .c files MAKESRC = makedefs.c SPLEVSRC = lev_yacc.c lev_lex.c lev_main.c DGNCOMPSRC = dgn_yacc.c dgn_lex.c dgn_main.c RECOVSRC = recover.c DLBSRC = dlb_main.c UTILSRCS = $(MAKESRC) panic.c $(SPLEVSRC) $(DGNCOMPSRC) $(RECOVSRC) $(DLBSRC) # files that define all monsters and objects CMONOBJ = ../src/monst.c ../src/objects.c OMONOBJ = $(OBJDIR)/monst.o $(OBJDIR)/objects.o # files that provide access to NetHack's names CNAMING = ../src/drawing.c ../src/decl.c $(CMONOBJ) ONAMING = $(OBJDIR)/drawing.o $(OBJDIR)/decl.o $(OMONOBJ) # dynamic memory allocation CALLOC = ../src/alloc.c panic.c OALLOC = $(OBJDIR)/alloc.o panic.o # object files for makedefs MAKEOBJS = makedefs.o $(OMONOBJ) $(OALLOC) # object files for special levels compiler SPLEVOBJS = lev_yacc.o lev_lex.o lev_main.o $(OALLOC) $(ONAMING) # object files for dungeon compiler DGNCOMPOBJS = dgn_yacc.o dgn_lex.o dgn_main.o $(OALLOC) # object files for recovery utility RECOVOBJS = recover.o # object files for the data librarian DLBOBJS = dlb_main.o $(OBJDIR)/dlb.o $(OALLOC) # flags for creating distribution versions of sys/share/*_lex.c, using # a more portable flex skeleton, which is not included in the distribution. # hopefully keeping this out of the section to be edited will keep too # many people from being confused by it... # FLEXDIST = -L # -S../sys/share/flexhack.skl FLEXDIST = # # flags for creating distribution versions of sys/share/*_yacc.c, without # line numbers so patches from version to version are practical # YACCDIST = -l YACCDIST = # dependencies for makedefs # makedefs: $(MAKEOBJS) $(CC) $(LFLAGS) -o makedefs $(MAKEOBJS) makedefs.o: makedefs.c $(CONFIG_H) ../include/permonst.h \ ../include/objclass.h ../include/monsym.h \ ../include/artilist.h ../include/dungeon.h ../include/obj.h \ ../include/monst.h ../include/you.h ../include/flag.h \ ../include/dlb.h ../include/patchlevel.h ../include/qtext.h ../include/onames.h: makedefs ./makedefs -o ../include/pm.h: makedefs ./makedefs -p ../src/monstr.c: makedefs ./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' # we defer this makedefs call to the src Makefile, since it knows all about # the main src and include files date.h is a timestamp for ../include/date.h:: @( cd ../src ; $(MAKE) ../include/date.h ) # support code used by several of the utility programs (but not makedefs) panic.o: panic.c $(CONFIG_H) # dependencies for lev_comp # lev_comp: $(SPLEVOBJS) $(CC) $(LFLAGS) -o lev_comp $(SPLEVOBJS) $(LIBS) lev_yacc.o: lev_yacc.c $(HACK_H) ../include/sp_lev.h lev_main.o: lev_main.c $(HACK_H) ../include/sp_lev.h ../include/tcap.h \ ../include/date.h ../include/artilist.h # see lev_comp.l for WEIRD_LEX discussion # egrep will return failure if it doesn't find anything, but we know there # is one "_cplusplus" inside a comment lev_lex.o: lev_lex.c $(HACK_H) ../include/lev_comp.h ../include/sp_lev.h @echo $(CC) -c $(CFLAGS) lev_lex.c @$(CC) -c $(CFLAGS) -DWEIRD_LEX=`egrep -c _cplusplus lev_lex.c` lev_lex.c ../include/lev_comp.h: lev_yacc.c lev_yacc.c: lev_comp.y $(YACC) $(YACCDIST) -d lev_comp.y mv $(YTABC) lev_yacc.c mv $(YTABH) ../include/lev_comp.h lev_lex.c: lev_comp.l $(LEX) $(FLEXDIST) lev_comp.l mv $(LEXYYC) lev_lex.c # with all of extern.h's functions to complain about, we drown in # 'defined but not used' without -u lintlev: @lint -axhu -I../include -DLINT $(SPLEVSRC) $(CALLOC) $(CNAMING) | sed '/_flsbuf/d' # dependencies for dgn_comp # dgn_comp: $(DGNCOMPOBJS) $(CC) $(LFLAGS) -o dgn_comp $(DGNCOMPOBJS) $(LIBS) dgn_yacc.o: dgn_yacc.c $(CONFIG_H) ../include/dgn_file.h ../include/date.h dgn_main.o: dgn_main.c $(CONFIG_H) ../include/dlb.h # see dgn_comp.l for WEIRD_LEX discussion dgn_lex.o: dgn_lex.c $(CONFIG.H) ../include/dgn_comp.h ../include/dgn_file.h @echo $(CC) -c $(CFLAGS) dgn_lex.c @$(CC) -c $(CFLAGS) -DWEIRD_LEX=`egrep -c _cplusplus dgn_lex.c` dgn_lex.c ../include/dgn_comp.h: dgn_yacc.c dgn_yacc.c: dgn_comp.y $(YACC) $(YACCDIST) -d dgn_comp.y mv $(YTABC) dgn_yacc.c mv $(YTABH) ../include/dgn_comp.h dgn_lex.c: dgn_comp.l $(LEX) $(FLEXDIST) dgn_comp.l mv $(LEXYYC) dgn_lex.c # with all of extern.h's functions to complain about, we drown in # 'defined but not used' without -u lintdgn: @lint -axhu -I../include -DLINT $(DGNCOMPSRC) $(CALLOC) | sed '/_flsbuf/d' # dependencies for recover # recover: $(RECOVOBJS) $(CC) $(LFLAGS) -o recover $(RECOVOBJS) $(LIBS) recover.o: recover.c $(CONFIG_H) ../include/date.h # dependencies for dlb # dlb: $(DLBOBJS) $(CC) $(LFLAGS) -o dlb $(DLBOBJS) $(LIBS) dlb_main.o: dlb_main.c $(CONFIG_H) ../include/dlb.h ../include/date.h $(CC) $(CFLAGS) -c dlb_main.c # dependencies for tile utilities # TEXT_IO = tiletext.o tiletxt.o $(ONAMING) GIFREADERS = gifread.o $(OALLOC) XPMREADERS = xpmread.o $(OALLOC) PPMWRITERS = ppmwrite.o $(OALLOC) tileutils: tilemap gif2txt xpm2txt txt2ppm txtfilt tile2x11 magtile bigtile \ txtmerge txtbg mapmerge tile2png magtile: magtile.o $(TEXT_IO) $(CC) $(LFLAGS) -o magtile magtile.o $(TEXT_IO) $(LIBS) bigtile: bigtile.o $(TEXT_IO) $(CC) $(LFLAGS) -o bigtile bigtile.o $(TEXT_IO) $(LIBS) gif2txt: $(GIFREADERS) $(TEXT_IO) $(CC) $(LFLAGS) -o gif2txt $(GIFREADERS) $(TEXT_IO) $(LIBS) xpm2txt: $(XPMREADERS) $(TEXT_IO) $(CC) $(LFLAGS) -o xpm2txt $(XPMREADERS) $(TEXT_IO) $(LIBS) -lXpm -lX11 txt2ppm: $(PPMWRITERS) $(TEXT_IO) $(CC) $(LFLAGS) -o txt2ppm $(PPMWRITERS) $(TEXT_IO) $(LIBS) txtfilt: txtfilt.o $(TEXT_IO) $(CC) $(LFLAGS) -o txtfilt txtfilt.o $(TEXT_IO) $(LIBS) txtbg: txtbg.o $(TEXT_IO) $(CC) $(LFLAGS) -o txtbg txtbg.o $(TEXT_IO) $(LIBS) mapmerge: mapmerge.o $(CC) $(LFLAGS) -o mapmerge mapmerge.o txtmerge: txtmerge.o $(TEXT_IO) $(CC) $(LFLAGS) -o txtmerge txtmerge.o $(TEXT_IO) $(LIBS) tile2x11: tile2x11.o $(TEXT_IO) $(CC) $(LFLAGS) -o tile2x11 tile2x11.o $(TEXT_IO) $(LIBS) tile2img.ttp: tile2img.o bitmfile.o $(TEXT_IO) $(CC) $(LFLAGS) -o tile2img.ttp tile2img.o bitmfile.o $(TEXT_IO) $(LIBS) tile2bmp: tile2bmp.o $(TEXT_IO) $(CC) $(LFLAGS) -o tile2bmp tile2bmp.o $(TEXT_IO) 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 tile2png: tile2png.o $(TEXT_IO) $(CC) $(LFLAGS) -o tile2png tile2png.o $(TEXT_IO) -lz -lpng tilemap: ../win/share/tilemap.c $(HACK_H) $(CC) $(CFLAGS) $(LFLAGS) -o tilemap ../win/share/tilemap.c $(LIBS) ../src/tile.c: tilemap ./tilemap ../include/tile.h: ../win/share/tile_t.h tilemap ./tilemap magtile.o: ../win/share/magtile.c $(CONFIG_H) ../include/tile.h $(CC) $(CFLAGS) -c ../win/share/magtile.c bigtile.o: ../win/share/bigtile.c $(CONFIG_H) ../include/tile.h $(CC) $(CFLAGS) -c ../win/share/bigtile.c tiletext.o: ../win/share/tiletext.c $(CONFIG_H) ../include/tile.h $(CC) $(CFLAGS) -c ../win/share/tiletext.c tiletxt.o: ../win/share/tilemap.c $(HACK_H) $(CC) $(CFLAGS) -c -DTILETEXT ../win/share/tilemap.c mv tilemap.o tiletxt.o gifread.o: ../win/share/gifread.c $(CONFIG_H) ../include/tile.h $(CC) $(CFLAGS) -c ../win/share/gifread.c xpmread.o: ../win/share/xpmread.c $(HACK_H) ../include/tile.h $(CC) $(CFLAGS) -c ../win/share/xpmread.c ppmwrite.o: ../win/share/ppmwrite.c $(CONFIG_H) ../include/tile.h $(CC) $(CFLAGS) -c ../win/share/ppmwrite.c txtfilt.o: ../win/share/txtfilt.c $(CONFIG_H) ../include/tile.h $(CC) $(CFLAGS) -c ../win/share/txtfilt.c txtbg.o: ../win/share/txtbg.c $(HACK_H) ../include/tile.h $(CC) $(CFLAGS) -c ../win/share/txtbg.c mapmerge.o: ../win/share/mapmerge.c $(HACK_H) $(CC) $(CFLAGS) -c ../win/share/mapmerge.c txtmerge.o: ../win/share/txtmerge.c $(CONFIG_H) ../include/tile.h $(CC) $(CFLAGS) -c ../win/share/txtmerge.c tile2bmp.o: ../win/share/tile2bmp.c $(HACK_H) ../include/tile.h $(CC) $(CFLAGS) -c ../win/share/tile2bmp.c tile2x11.o: ../win/X11/tile2x11.c $(HACK_H) ../include/tile.h \ ../include/tile2x11.h $(CC) $(CFLAGS) -c ../win/X11/tile2x11.c 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 tile2beos.o: ../win/BeOS/tile2beos.cpp $(HACK_H) ../include/tile.h $(CXX) $(CFLAGS) -c ../win/BeOS/tile2beos.cpp tile2png.o: ../win/share/tile2png.c $(HACK_H) ../include/tile.h $(CC) $(CFLAGS) -c ../win/share/tile2png.c # using dependencies like # ../src/foo:: # @( cd ../src ; $(MAKE) foo ) # would always force foo to be up-to-date according to the src Makefile # when it's needed here. unfortunately, some makes believe this syntax # means foo always changes, instead of foo should always be checked. # therefore, approximate via config.h dependencies, and hope that anybody # changing anything other than basic configuration also knows when not # to improvise things not in the instructions, like 'make makedefs' here # in util... # make sure object files from src are available when needed # $(OBJDIR)/alloc.o: ../src/alloc.c $(CONFIG_H) $(CC) $(CFLAGS) -c ../src/alloc.c -o $@ $(OBJDIR)/drawing.o: ../src/drawing.c $(CONFIG_H) $(CC) $(CFLAGS) -c ../src/drawing.c -o $@ $(OBJDIR)/decl.o: ../src/decl.c $(CONFIG_H) $(CC) $(CFLAGS) -c ../src/decl.c -o $@ $(OBJDIR)/monst.o: ../src/monst.c $(CONFIG_H) $(CC) $(CFLAGS) -c ../src/monst.c -o $@ $(OBJDIR)/objects.o: ../src/objects.c $(CONFIG_H) $(CC) $(CFLAGS) -c ../src/objects.c -o $@ $(OBJDIR)/dlb.o: ../src/dlb.c $(HACK_H) ../include/dlb.h $(CC) $(CFLAGS) -c ../src/dlb.c -o $@ # make sure hack.h dependencies get transitive information $(HACK_H): $(CONFIG_H) @( cd ../src ; $(MAKE) $(HACK_H) ) $(CONFIG_H): ../include/config.h @( cd ../src ; $(MAKE) $(CONFIG_H) ) tags: $(UTILSRCS) @ctags -tw $(UTILSRCS) clean: -rm -f *.o spotless: clean -rm -f lev_lex.c lev_yacc.c dgn_lex.c dgn_yacc.c -rm -f ../include/lev_comp.h ../include/dgn_comp.h -rm -f ../include/tile.h -rm -f makedefs lev_comp dgn_comp recover dlb -rm -f gif2txt xpm2txt txt2ppm tile2x11 tile2img.ttp xpm2img.ttp tilemap -rm -f magtile bigtile txtmerge txtfilt txtbg mapmerge tile2png tileedit: tileedit.cpp $(TEXT_IO) $(QTDIR)/bin/moc -o tileedit.moc tileedit.h $(CC) -o tileedit -I../include -I$(QTDIR)/include -L$(QTDIR)/lib tileedit.cpp $(TEXT_IO) -lqt slashem-0.0.7E7F3/sys/unix/unixres.c0000664000076400007640000000750110545462317015321 0ustar aliali/* $Id: unixres.c,v 1.3 2003/10/25 19:09:28 j_ali Exp $ */ /* 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. */ #ifdef __GNUC__ #define _GNU_SOURCE #endif #include "config.h" #ifdef GETRES_SUPPORT # if defined(LINUX) /* requires dynamic linking with libc */ #include static int real_getresuid(ruid, euid, suid) uid_t *ruid, *euid, *suid; { int (*f)(uid_t *, uid_t *, uid_t *); /* getresuid signature */ f = dlsym(RTLD_NEXT, "getresuid"); if (!f) return -1; return f(ruid, euid, suid); } static int real_getresgid(rgid, egid, sgid) gid_t *rgid, *egid, *sgid; { int (*f)(gid_t *, gid_t *, gid_t *); /* getresgid signature */ f = dlsym(RTLD_NEXT, "getresgid"); if (!f) return -1; return f(rgid, egid, sgid); } # 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 */ #ifdef SVR4 #include #endif /* SVR4 */ 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 */ slashem-0.0.7E7F3/sys/unix/unixmain.c0000664000076400007640000003055710545462317015463 0ustar aliali/* 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. */ /* main.c - Unix NetHack */ #include "hack.h" #include "dlb.h" #include #include #include #ifndef O_RDONLY #include #endif #if !defined(_BULL_SOURCE) && !defined(__sgi) && !defined(_M_UNIX) # if !defined(SUNOS4) && !(defined(ULTRIX) && defined(__GNUC__)) # if defined(POSIX_TYPES) || defined(SVR4) || defined(HPUX) extern struct passwd *FDECL(getpwuid,(uid_t)); # else extern struct passwd *FDECL(getpwuid,(int)); # endif # endif #endif extern struct passwd *FDECL(getpwnam,(const char *)); #ifdef CHDIR static void FDECL(chdirx, (const char *,BOOLEAN_P)); #endif /* CHDIR */ static boolean NDECL(whoami); static void FDECL(process_options, (int, char **)); #ifdef _M_UNIX extern void NDECL(check_sco_console); extern void NDECL(init_sco_cons); #endif #ifdef __linux__ extern void NDECL(check_linux_console); extern void NDECL(init_linux_cons); #endif #ifdef LINUX extern void NDECL(check_linux_console); extern void NDECL(init_linux_cons); #endif static void NDECL(wd_message); #ifdef WIZARD static boolean wiz_error_flag = FALSE; #endif int main(argc,argv) int argc; char *argv[]; { register int fd; #ifdef CHDIR register char *dir; #endif boolean exact_username; hname = argv[0]; hackpid = getpid(); (void) umask(0777 & ~FCMASK); choose_windows(DEFAULT_WINDOW_SYS); #ifdef CHDIR /* otherwise no chdir() */ /* * See if we must change directory to the playground. * (Perhaps hack runs suid and playground is inaccessible * for the player.) * The environment variable HACKDIR is overridden by a * -d command line option (must be the first option given) */ dir = nh_getenv("NETHACKDIR"); if (!dir) dir = nh_getenv("HACKDIR"); #endif if(argc > 1) { #ifdef CHDIR if (!strncmp(argv[1], "-d", 2) && argv[1][2] != 'e') { /* avoid matching "-dec" for DECgraphics; since the man page * says -d directory, hope nobody's using -desomething_else */ argc--; argv++; dir = argv[0]+2; if(*dir == '=' || *dir == ':') dir++; if(!*dir && argc > 1) { argc--; argv++; dir = argv[0]; } if(!*dir) error("Flag -d must be followed by a directory name."); } if (argc > 1) #endif /* CHDIR */ /* * Now we know the directory containing 'record' and * may do a prscore(). Exclude `-style' - it's a Qt option. */ if (!strncmp(argv[1], "-s", 2) && strncmp(argv[1], "-style", 6)) { #ifdef CHDIR chdirx(dir,0); #endif prscore(argc, argv); exit(EXIT_SUCCESS); } } /* * Change directories before we initialize the window system so * we can find the tile file. */ #ifdef CHDIR chdirx(dir,1); #endif #ifdef _M_UNIX check_sco_console(); #endif #ifdef LINUX check_linux_console(); #endif #ifdef PROXY_GRAPHICS /* Handle --proxy before options, if supported */ if (argc > 1 && !strcmp(argv[1], "--proxy")) { argv[1] = argv[0]; argc--; argv++; choose_windows("proxy"); lock_windows(TRUE); /* Can't be overridden from options */ } #endif initoptions(); init_nhwindows(&argc,argv); exact_username = whoami(); #ifdef _M_UNIX init_sco_cons(); #endif #ifdef LINUX init_linux_cons(); #endif /* * It seems you really want to play. */ u.uhp = 1; /* prevent RIP on early quits */ (void) signal(SIGHUP, (SIG_RET_TYPE) hangup); #ifdef SIGXCPU (void) signal(SIGXCPU, (SIG_RET_TYPE) hangup); #endif #ifdef SIGPIPE /* eg., a lost proxy connection */ (void) signal(SIGPIPE, (SIG_RET_TYPE) hangup); #endif process_options(argc, argv); /* command line options */ #ifdef DEF_PAGER if(!(catmore = nh_getenv("HACKPAGER")) && !(catmore = nh_getenv("PAGER"))) catmore = DEF_PAGER; #endif #ifdef MAIL getmailstatus(); #endif #ifdef WIZARD if (wizard) Strcpy(plname, "wizard"); else #endif if(!*plname || !strncmp(plname, "player", 4) || !strncmp(plname, "games", 4)) { askname(); } else if (exact_username) { /* guard against user names with hyphens in them */ int len = strlen(plname); /* append the current role, if any, so that last dash is ours */ if (++len < sizeof plname) (void)strncat(strcat(plname, "-"), pl_character, sizeof plname - len - 1); } plnamesuffix(); /* strip suffix from name; calls askname() */ /* again if suffix was whole name */ /* accepts any suffix */ #ifdef WIZARD if(!wizard) { #endif /* * check for multiple games under the same name * (if !locknum) or check max nr of players (otherwise) */ (void) signal(SIGQUIT,SIG_IGN); (void) signal(SIGINT,SIG_IGN); if(!locknum) Sprintf(lock, "%d%s", (int)getuid(), plname); getlock(); #ifdef WIZARD } else { Sprintf(lock, "%d%s", (int)getuid(), plname); getlock(); } #endif /* WIZARD */ dlb_init(); /* must be before newgame() */ /* * Initialization of the boundaries of the mazes * Both boundaries have to be even. */ x_maze_max = COLNO-1; if (x_maze_max % 2) x_maze_max--; y_maze_max = ROWNO-1; if (y_maze_max % 2) y_maze_max--; /* * Initialize the vision system. This must be before mklev() on a * new game or before a level restore on a saved game. */ vision_init(); display_gamewindows(); if ((fd = restore_saved_game()) >= 0) { #ifdef WIZARD /* Since wizard is actually flags.debug, restoring might * overwrite it. */ boolean remember_wiz_mode = wizard; #endif #ifndef FILE_AREAS const char *fq_save = fqname(SAVEF, SAVEPREFIX, 1); (void) chmod(fq_save,0); /* disallow parallel restores */ #else (void) chmod_area(FILE_AREA_SAVE, SAVEF, 0); #endif (void) signal(SIGINT, (SIG_RET_TYPE) done1); #ifdef NEWS if(iflags.news) { display_file_area(NEWS_AREA, NEWS, FALSE); iflags.news = FALSE; /* in case dorecover() fails */ } #endif pline("Restoring save file..."); mark_synch(); /* flush output */ if(!dorecover(fd)) goto not_recovered; #ifdef WIZARD if(!wizard && remember_wiz_mode) wizard = TRUE; #endif check_special_room(FALSE); wd_message(); if (discover || wizard) { if(yn("Do you want to keep the save file?") == 'n') (void) delete_savefile(); else { #ifndef FILE_AREAS (void) chmod(fq_save,FCMASK); /* back to readable */ compress_area(NULL, fq_save); #else (void) chmod_area(FILE_AREA_SAVE, SAVEF, FCMASK); compress_area(FILE_AREA_SAVE, SAVEF); #endif } } flags.move = 0; } else { not_recovered: player_selection(); newgame(); wd_message(); flags.move = 0; set_wear(); (void) pickup(1); } moveloop(); exit(EXIT_SUCCESS); /*NOTREACHED*/ return(0); } static void process_options(argc, argv) int argc; char *argv[]; { int i; /* * Process options. */ while(argc > 1 && argv[1][0] == '-'){ argv++; argc--; switch(argv[0][1]){ case 'D': case 'Z': #ifdef WIZARD { char *user; int uid; struct passwd *pw = (struct passwd *)0; uid = getuid(); user = getlogin(); if (user) { pw = getpwnam(user); if (pw && (pw->pw_uid != uid)) pw = 0; } if (pw == 0) { user = nh_getenv("USER"); if (user) { pw = getpwnam(user); if (pw && (pw->pw_uid != uid)) pw = 0; } if (pw == 0) { pw = getpwuid(uid); } } if (pw && !strcmp(pw->pw_name,WIZARD)) { wizard = TRUE; break; } } /* otherwise fall thru to discover */ wiz_error_flag = TRUE; #endif case 'X': discover = TRUE; break; #ifdef NEWS case 'n': iflags.news = FALSE; break; #endif case 'u': if(argv[0][2]) (void) strncpy(plname, argv[0]+2, sizeof(plname)-1); else if(argc > 1) { argc--; argv++; (void) strncpy(plname, argv[0], sizeof(plname)-1); } else raw_print("Player name expected after -u"); break; case 'i': if (!strncmpi(argv[0]+1, "IBM", 3)) switch_graphics(IBM_GRAPHICS); break; case 'd': if (!strncmpi(argv[0]+1, "DEC", 3)) switch_graphics(DEC_GRAPHICS); break; case 'p': /* profession (role) */ if (argv[0][2]) { if ((i = str2role(&argv[0][2])) >= 0) flags.initrole = i; } else if (argc > 1) { argc--; argv++; if ((i = str2role(argv[0])) >= 0) flags.initrole = i; } break; case 'r': /* race */ if (argv[0][2]) { if ((i = str2race(&argv[0][2])) >= 0) flags.initrace = i; } else if (argc > 1) { argc--; argv++; if ((i = str2race(argv[0])) >= 0) flags.initrace = i; } break; case 'g': /* gender */ 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 'a': /* align */ 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 '@': flags.randomall = 1; break; default: if ((i = str2role(&argv[0][1])) >= 0) { flags.initrole = i; break; } /* else raw_printf("Unknown option: %s", *argv); */ } } if(argc > 1) locknum = atoi(argv[1]); #ifdef MAX_NR_OF_PLAYERS if(!locknum || locknum > MAX_NR_OF_PLAYERS) locknum = MAX_NR_OF_PLAYERS; #endif } #ifdef CHDIR static void chdirx(dir, wr) const char *dir; boolean wr; { if (dir /* User specified directory? */ # ifdef HACKDIR && strcmp(dir, HACKDIR) /* and not the default? */ # endif ) { # ifdef SECURE (void) setgid(getgid()); (void) setuid(getuid()); /* Ron Wessels */ # endif } else { /* non-default data files is a sign that scores may not be * compatible, or perhaps that a binary not fitting this * system's layout is being used. */ # ifdef VAR_PLAYGROUND int len = strlen(VAR_PLAYGROUND); fqn_prefix[SCOREPREFIX] = (char *)alloc(len+2); Strcpy(fqn_prefix[SCOREPREFIX], VAR_PLAYGROUND); if (fqn_prefix[SCOREPREFIX][len-1] != '/') { fqn_prefix[SCOREPREFIX][len] = '/'; fqn_prefix[SCOREPREFIX][len+1] = '\0'; } # endif } # ifdef HACKDIR if (dir == (const char *)0) dir = HACKDIR; # endif if (dir && chdir(dir) < 0) { perror(dir); error("Cannot chdir to %s.", dir); } /* warn the player if we can't write the record file */ /* perhaps we should also test whether . is writable */ /* unfortunately the access system-call is worthless */ if (wr) { # ifdef VAR_PLAYGROUND fqn_prefix[LEVELPREFIX] = fqn_prefix[SCOREPREFIX]; fqn_prefix[SAVEPREFIX] = fqn_prefix[SCOREPREFIX]; fqn_prefix[BONESPREFIX] = fqn_prefix[SCOREPREFIX]; fqn_prefix[LOCKPREFIX] = fqn_prefix[SCOREPREFIX]; fqn_prefix[TROUBLEPREFIX] = fqn_prefix[SCOREPREFIX]; # endif check_recordfile(dir); } } #endif /* CHDIR */ static boolean whoami() { /* * Who am i? Algorithm: 1. Use name as specified in NETHACKOPTIONS * 2. Use $USER or $LOGNAME (if 1. fails) * 3. Use getlogin() (if 2. fails) * The resulting name is overridden by command line options. * If everything fails, or if the resulting name is some generic * account like "games", "play", "player", "hack" then eventually * we'll ask him. * Note that we trust the user here; it is possible to play under * somebody else's name. */ register char *s; if (*plname) return FALSE; if(/* !*plname && */ (s = nh_getenv("USER"))) (void) strncpy(plname, s, sizeof(plname)-1); if(!*plname && (s = nh_getenv("LOGNAME"))) (void) strncpy(plname, s, sizeof(plname)-1); if(!*plname && (s = getlogin())) (void) strncpy(plname, s, sizeof(plname)-1); return TRUE; } #ifdef PORT_HELP void port_help() { /* * Display unix-specific help. Just show contents of the helpfile * named by PORT_HELP. */ display_file_area(FILE_AREA_SHARE, PORT_HELP, TRUE); } #endif static void wd_message() { #ifdef WIZARD if (wiz_error_flag) { pline("Only user \"%s\" may access debug (wizard) mode.", # ifndef KR1ED WIZARD); # else WIZARD_NAME); # endif pline("Entering discovery mode instead."); } else #endif 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*/ slashem-0.0.7E7F3/sys/unix/Makefile.src0000664000076400007640000013444310545462317015714 0ustar aliali# 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 # these makes allow $(MAKE) to be overridden by the environment if someone # wants to (or has to) use something other than the standard make, so we do # not want to unconditionally set $(MAKE) here # # unfortunately, some older makes do not predefine $(MAKE); if you have one of # these, uncomment the following line # (you will know that you have one if you get complaints about being unable # to find 'makedefs') # MAKE = make # This makefile replaces the previous Makefile.unix, Makefile.xenix, # Makefile.3B2, Makefile.att, and Makefile.tos. # Set SYSTEM to one of: # 'Sysunix' -- generic UNIX # 'Sys3B2' -- AT&T 3B2, 3B5, etc. # 'Sysatt' -- AT&T UNIXPC, 7300, 3B1 # 'SysV-AT' -- Microport 286 UNIX (put -DDUMB in CFLAGS) # 'Systos' -- Atari # 'SysBe' -- BeOS SYSTEM = Sysunix # # Make sure that your bourne shell is specified here, as you have to spawn # some of the commands (eg. depend) in bourne shell for them to work. # # For Systos users compiling on the ST, you'll either need a bourne shell # clone or you'll need to do make depend, etc. by hand. In either case, # the line below probably needs changing SHELL=/bin/sh # for Atari # SHELL=E:/GEMINI2/MUPFEL.TTP # Normally, the C compiler driver is used for linking: LINK=$(CC) # Pick the SYSSRC and SYSOBJ lines corresponding to your desired operating # system. # # for UNIX systems SYSSRC = ../sys/share/ioctl.c ../sys/share/unixtty.c ../sys/unix/unixmain.c \ ../sys/unix/unixunix.c ../sys/unix/unixres.c SYSOBJ = ioctl.o unixmain.o unixtty.o unixunix.o unixres.o # # for Systos # SYSSRC = ../sys/atari/tos.c ../sys/share/pcmain.c ../sys/share/pcsys.c \ # ../sys/share/pctty.c ../sys/share/pcunix.c # SYSOBJ = tos.o pcmain.o pcsys.o pctty.o pcunix.o # # for BeOS #SYSSRC = ../sys/be/bemain.c ../sys/share/unixtty.c ../sys/share/ioctl.c #SYSOBJ = bemain.o unixtty.o ioctl.o # if you are using gcc as your compiler: # uncomment the CC definition below if it's not in your environment # if you get setcgtty() warnings during execution, you are feeding gcc # a non-ANSI -- either run fixincludes on it or use # -traditional in CFLAGS # CC = gcc # # For Bull DPX/2 systems at B.O.S. 2.0 or higher use the following: # # CC = gcc -ansi -D_BULL_SOURCE -D_XOPEN_SOURCE -D_POSIX_SOURCE # # If you are using GCC 2.2.2 or higher on a DPX/2, just use: # # CC = gcc -ansi # # For HP/UX 10.20 with GCC: # CC = gcc -D_POSIX_SOURCE # # For cross-compiling, eg. with gcc on Linux (see also CXX further down): # CC = arm-linux-gcc # # # if you're debugging and want gcc to check as much as possible, use: # CC = gcc -W -Wimplicit -Wreturn-type -Wunused -Wformat -Wswitch -Wshadow -Wcast-qual -Wwrite-strings -DGCC_WARN # flags may have to be changed as required # flags for 286 Xenix: # CFLAGS = -Ml2t16 -O -LARGE -I../include # LFLAGS = -Ml -F 4000 -SEG 512 # flags for 286 Microport SysV-AT # CFLAGS = -DDUMB -Ml -I../include # LFLAGS = -Ml # flags for Atari gcc (3.2.1) # CFLAGS = -O -I../include # LFLAGS = -s # flags for Atari gcc (3.3) # CFLAGS = -mshort -O2 -fomit-frame-pointer -I../include # LFLAGS = -mshort -s # flags for AIX 3.1 cc on IBM RS/6000 to define # a suitable subset of standard libraries # (note that there is more info regarding the "-qchars=signed" # switch in file Install.unx note 8) # CFLAGS = -D_NO_PROTO -D_XOPEN_SOURCE -O -I../include -qchars=signed # # Some of our subroutines are complex enough that this is required for full # optimization under AIX 3.2 (I don't know about 3.1). # # CFLAGS = -D_NO_PROTO -D_XOPEN_SOURCE -D_ALL_SOURCE -O -I../include -qchars=signed -qmaxmem=5000 # flags for A/UX 2.01 using native cc or c89 # gcc predefines AUX so that's not needed there # Remember to use -lcurses for WINLIB below ! # CFLAGS = -ZS -D_POSIX_SOURCE -O -I../include -DAUX # flags for IRIX 4.0.x using native cc # The include files are __STDC__, but have bugs involving const # CFLAGS = -O -I../include -D__STDC__ -Dconst= -woff 100,293 # LFLAGS = -s # flags for BSD/OS 2.0 # CFLAGS = -O -I../include -I/usr/X11/include # LFLAGS = -L/usr/X11/lib # 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: #CC = mwcc #CFLAGS = -r -I../include #LINK = mwld #LFLAGS = -map nethack.xMAP # on Intel: #CFLAGS = -O -I../include #LINK = gcc #LFLAGS = -Xlinker -soname=_APP_ # flags for debugging: # CFLAGS = -g -I../include CFLAGS = -O -I../include LFLAGS = # Only used for the Gnome interface. # When including the Gnome interface, you need to include gnome specific # directories. The ones given below is the usual spot for linux systems. # The paths are for glibconfig.h and gnomesupport.h respectively. # #GNOMEINC=-I/usr/lib/glib/include -I/usr/lib/gnome-libs/include -I../win/gnome GNOMEINC=`gnome-config gnome --cflags` -I../win/gnome # QT windowing system # Gentoo # QTDIR = /usr/qt/2 # SuSE 6.1 # QTDIR = /usr/lib/qt # RedHat 6.1 # QTDIR = /usr/lib/qt-2.0.1 # QTLIBDIR=$(QTDIR)/lib QTINCDIR=$(QTDIR)/include QTBINDIR=$(QTDIR)/bin # SuSE 6.1 # KDELIBDIR=/opt/kde/lib # KDEINCDIR=/opt/kde/include # RedHat 6.1 KDELIBDIR=/usr/lib KDEINCDIR=/usr/include/kde # CFLAGS = -O -I../include # LFLAGS = -L/usr/X11/lib -L$(QTLIBDIR) -L$(KDELIBDIR) # The Qt and Be window systems are written in C++, while the rest of # NetHack is standard C. If using Qt, uncomment the LINK line here to get # the C++ libraries linked in. CXXFLAGS = $(CFLAGS) -I. -I$(QTINCDIR) # Qt is C++, so define the compiler and linker thus required: CXX=g++ #LINK=g++ # For cross-compiling, eg. with gcc on Linux (see also CC further up): #CXX=arm-linux-g++ #LINK=arm-linux-gcc # GTK windowing system WINGTKCONFIG=PKG_CONFIG_PATH=/usr/devel/lib/pkgconfig pkg-config gtk+-2.0 WINGTKCFLAGS=`$(WINGTKCONFIG) --cflags` # Set the WINSRC, WINOBJ, and WINLIB lines to correspond to your desired # combination of windowing systems. Also set windowing systems in config.h. # # files for a straight tty port using no native windowing system WINTTYSRC = ../win/tty/getline.c ../win/tty/termcap.c ../win/tty/topl.c \ ../win/tty/wintty.c WINTTYOBJ = getline.o termcap.o topl.o wintty.o # # files for an X11 port # (tile.c is included in the defn. for WINCSRC, below) 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 WINX11OBJ = Window.o dialogs.o winX.o winmap.o winmenu.o winmesg.o \ winmisc.o winstat.o wintext.o winval.o nhwin.a # # 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 nhwin.a # # files for a GTK port # WINGTKSRC = ../win/gtk/gtk.c ../win/gtk/gtkgetlin.c \ ../win/gtk/gtkstatus.c ../win/gtk/gtkmenu.c ../win/gtk/gtkyn.c \ ../win/gtk/gtkextcmd.c ../win/gtk/gtkmap.c ../win/gtk/gtkmessage.c \ ../win/gtk/gtkmisc.c ../win/gtk/gtktile.c ../win/gtk/xshmmap.c \ ../win/gtk/gtkhackrc.c ../win/gtk/gtkprefs.c ../win/gtk/gtkprogress.c \ ../win/gtk/gtkext.c ../win/gtk/gtkint.c WINGTKOBJ = gtk.o gtkgetlin.o gtkstatus.o gtkmenu.o gtkyn.o gtkextcmd.o \ gtkmap.o gtktile.o gtkmessage.o gtkmisc.o xshmmap.o gtkhackrc.o \ gtkprefs.o gtkprogress.o gtkext.o gtkint.o nhwin.a # # Files for a Gnome port # WINGNOMESRC = ../win/gnome/gnaskstr.c ../win/gnome/gnbind.c \ ../win/gnome/gnglyph.c ../win/gnome/gnmain.c ../win/gnome/gnmap.c \ ../win/gnome/gnmenu.c ../win/gnome/gnmesg.c ../win/gnome/gnopts.c \ ../win/gnome/gnplayer.c ../win/gnome/gnsignal.c \ ../win/gnome/gnstatus.c ../win/gnome/gntext.c ../win/gnome/gnyesno.c \ ../win/gnome/gnworn.c WINGNOMEOBJ = gnaskstr.o gnbind.o gnglyph.o gnmain.o gnmap.o gnmenu.o \ gnmesg.o gnopts.o gnplayer.o gnsignal.o gnstatus.o gntext.o \ gnyesno.o gnworn.o nhwin.a # # Files for a Gem port WINGEMSRC = ../win/gem/wingem.c ../win/gem/wingem1.c ../win/gem/load_img.c \ ../win/gem/gr_rect.c WINGEMOBJ = wingem.o wingem1.o load_img.o gr_rect.o nhwin.a # # Files for a BeOS InterfaceKit port -- not ready for prime time WINBESRC = WINBEOBJ = #WINBESRC = ../win/BeOS/winbe.cpp ../win/BeOS/NHWindow.cpp \ # ../win/BeOS/NHMenuWindow.cpp ../win/BeOS/NHMapWindow.cpp #WINBEOBJ = winbe.o NHWindow.o NHMenuWindow.o NHMapWindow.o nhwin.a # # Files for a proxy interface WINPROXYSRC = ../win/proxy/winproxy.c ../win/proxy/callback.c WINPROXYOBJ = winproxy.o callback.o nhwin.a # # Common files for proxy window interface and plug-in window interfaces. PROXYCOMSRC = ../win/proxy/nhext.c ../win/proxy/nhxdr.c \ ../win/proxy/nhextxdr.c ../win/proxy/nhextio.c ../win/proxy/nhextnb.c \ ../win/proxy/compxdr.c PROXYCOMOBJ = nhext.o nhxdr.o nhextxdr.o nhextio.o nhextnb.o compxdr.o # # Common files that are also shared with non-proxy window interfaces PROXYSHRSRC = ../win/proxy/md5.c PROXYSHROBJ = md5.o # # Files for the proxy utility modules. These are provided for use with window # ports that support the proxy interface. The GTK window interface needs # these files regardless of whether proxy support is enabled or not. PROXYUTLSRC = ../win/proxy/dlbh.c ../win/proxy/mapid.c \ ../win/proxy/riputil.c ../win/proxy/getopt.c ../win/proxy/glyphmap.c PROXYUTLOBJ = dlbh.o mapid.o riputil.o getopt.o glyphmap.o # # Files for plug-in window interfaces. These are needed to support external # window ports and provide the interface to the game executable. Currently, # only the GTK window interface supports plug-in window interfaces. PROXYCLNTSRC = ../win/proxy/proxysvc.c ../win/proxy/proxycb.c \ ../win/proxy/prxymap.c ../win/proxy/prxychar.c ../win/proxy/prxytile.c \ ../win/proxy/prxyconn.c PROXYCLNTOBJ = proxysvc.o proxycb.o prxymap.o prxychar.o prxytile.o prxyconn.o # # Files for the SDL/GL window port WINGLSRC = ../win/gl/gl_conf.c ../win/gl/gl_emul.c \ ../win/gl/gl_font.c ../win/gl/gl_hardw.c ../win/gl/gl_image.c \ ../win/gl/gl_main.c ../win/gl/gl_map.c ../win/gl/gl_menu.c \ ../win/gl/gl_opt.c ../win/gl/gl_role.c ../win/gl/gl_rendu.c \ ../win/gl/gl_softw.c ../win/gl/gl_stat.c ../win/gl/gl_text.c \ ../win/gl/gl_tile.c ../win/gl/gl_unit.c ../win/gl/gl_win.c WINGLOBJ = gl_conf.o gl_emul.o gl_font.o gl_hardw.o \ gl_image.o gl_main.o gl_map.o gl_menu.o gl_opt.o \ gl_rendu.o gl_role.o gl_softw.o gl_stat.o \ gl_text.o gl_tile.o gl_unit.o gl_win.o nhwin.a SDLGL_CFLAGS = `sdl-config --cflags` # Use these declarations if you only want to support the TTY windowing system WINSRC = $(WINTTYSRC) WINOBJ = $(WINTTYOBJ) # Use these declarations if you want to support the X11 windowing system # WINSRC = $(WINTTYSRC) $(WINX11SRC) # WINOBJ = $(WINTTYOBJ) $(WINX11OBJ) # Use these declarations if you want to support the Qt windowing system # WINSRC = $(WINTTYSRC) $(WINQTSRC) # WINOBJ = $(WINTTYOBJ) $(WINQTOBJ) # Use these declarations if you want to support a conventional # GTK windowing system (only useful if not installing setuid or setgid) # WINSRC = $(WINTTYSRC) $(WINGTKSRC) $(PROXYUTLSRC) # WINOBJ = $(WINTTYOBJ) $(WINGTKOBJ) $(PROXYUTLOBJ) # Use these declarations if you want to support external windowing systems # and a proxified GTK windowing system (see Install.GTK) # WINSRC = $(WINTTYSRC) $(WINGTKSRC) \ # $(WINPROXYSRC) $(PROXYUTLSRC) $(PROXYCOMSRC) $(PROXYCLNTSRC) # WINOBJ = $(WINTTYOBJ) $(WINGTKOBJ) \ # $(WINPROXYOBJ) $(PROXYUTLOBJ) $(PROXYCOMOBJ) $(PROXYCLNTOBJ) # Use these declarations to only support the SDL/GL windowing systems # WINSRC = $(WINGLSRC) # WINOBJ = $(WINGLOBJ) # Use these declarations if you want to support external windowing systems # WINSRC = $(WINTTYSRC) $(WINPROXYSRC) $(PROXYUTLSRC) $(PROXYCOMSRC) # WINOBJ = $(WINTTYOBJ) $(WINPROXYOBJ) $(PROXYUTLOBJ) $(PROXYCOMOBJ) # Use these declarations if you want to support all standard windowing systems # WINSRC = $(WINTTYSRC) $(WINPROXYSRC) $(PROXYUTLSRC) $(PROXYCOMSRC) \ # $(WINX11SRC) $(WINQTSRC) $(WINGTKSRC) $(WINGLSRC) $(WINGNOMESRC) # WINOBJ = $(WINTTYOBJ) $(WINPROXYOBJ) $(PROXYUTLOBJ) $(PROXYCOMOBJ) \ # $(WINX11OBJ) $(WINQTOBJ) $(WINGTKOBJ) $(WINGLOBJ) $(WINGNOMEOBJ) # # You must also change the definition of WINLIB (below) to match these # on some systems the termcap library is in -ltermcap or -lcurses # on 386 Xenix, the -ltermlib tputs() seems not to work; use -lcurses instead # Sysatt uses shared library in lieu of this option # 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 # WINTTYLIB = -ltermcap # WINTTYLIB = -lcurses # WINTTYLIB = -lcurses16 # WINTTYLIB = -lncurses WINTTYLIB = -ltermlib # # libraries for X11 # If USE_XPM is defined in config.h, you will also need -lXpm here. WINX11LIB = -lXaw -lXmu -lXext -lXt -lX11 # WINX11LIB = -lXaw -lXmu -lXt -lX11 # WINX11LIB = -lXaw -lXmu -lXext -lXt -lXpm -lX11 -lm # WINX11LIB = -lXaw -lXmu -lXpm -lXext -lXt -lX11 -lSM -lICE -lm # BSD/OS 2.0 # # libraries for Qt WINQTLIB = -L$(QTLIBDIR) -lqt # # libraries for KDE (with Qt) WINKDELIB = -lkdecore -lkdeui -lXext # # libraries for GTK WINGTKLIB = `$(WINGTKCONFIG) --libs` # # libraries for Gnome WINGNOMELIB = -lgnomeui -lgnome -lart_lgpl -lgtk -lgdk -lpopt # # libraries for Gem port WINGEMLIB = -le_gem -lgem # # libraries for BeOS WINBELIB = -lbe # # libraries for SDL/GL window port WINSDLLIB = `sdl-config --libs` -lz -lpng WINGLLIB = -lGL # # libraries for proxy WINPROXYLIB = -lpthread # Use this declaration if you only want to support the TTY windowing system WINLIB = $(WINTTYLIB) # Use this declaration if you want to support the X11 windowing system # WINLIB = $(WINTTYLIB) $(WINX11LIB) # Use this declaration if you want to support the Qt windowing system # WINLIB = $(WINTTYLIB) $(WINQTLIB) # Use this declaration if you want to support a conventional # GTK windowing system (only useful if not installing setuid or setgid) # WINLIB = $(WINTTYLIB) $(WINGTKLIB) # Use this declaration if you want to support external windowing systems # and a proxified GTK windowing system (see Install.GTK) # WINLIB = $(WINTTYLIB) $(WINGTKLIB) $(WINPROXYLIB) # Use this declaration to only support the SDL/GL windowing system # WINLIB = $(WINGLLIB) # Use this declaration if you want to support external windowing systems # WINLIB = $(WINTTYLIB) $(WINPROXYLIB) # Use this declaration if you want to support all standard windowing systems # WINLIB = $(WINTTYLIB) $(WINPROXYLIB) $(WINGTKLIB) \ # $(WINX11LIB) $(WINQTLIB) $(WINGNOMELIB) $(WINSDLLIB) $(WINGLLIB) # any other strange libraries your system needs (for Sysunix only -- the more # specialized targets should already be right) # # on HP-UX 8.x, the malloc(3x) routines in libmalloc.a seem to align things # better than the malloc(3) ones in libc.a # LIBS = -lmalloc # # DPX/2's also use the malloc(3x) routines. In addition, if you are building # for X11, you must include libinet.a. # LIBS = -lmalloc -linet # # Linux NetHack uses some bsd style ioctl functions, thus it is necessary to # use the bsd libs. (Only if still compiling as BSD in unixconf.h; recent # versions compile fine using SYSV without this.) # LIBS = -lbsd # # for CYGWIN32 aka cygwin 1.1.1 # LIBS = -lcygwin # # Solaris 2.x seems to work with the following # LIBS = -lsocket -lnsl # # IRIX 4.0.x needs -lsun if NIS (YP) is being used for passwd file lookup # LIBS = -lsun # LIBS = # make NetHack GAME = slashem # GAME = slashem.prg # if you defined RANDOM in unixconf.h/tosconf.h since your system did not come # with a reasonable random number generator # RANDOBJ = random.o RANDOBJ = # used by `make depend' to reconstruct this Makefile; you shouldn't need this AWK = nawk # ---------------------------------------- # # Nothing below this line should have to be changed. # # Other things that have to be reconfigured are in config.h, # {unixconf.h, pcconf.h, tosconf.h}, and possibly system.h MAKEDEFS = ../util/makedefs # timestamp files to reduce `make' overhead and shorten .o dependency lists CONFIG_H = ../src/config.h-t HACK_H = ../src/hack.h-t # all .c that are part of the main NetHack program and are not operating- or # windowing-system specific HACKCSRC = allmain.c alloc.c apply.c artifact.c attrib.c ball.c bones.c \ botl.c cmd.c dbridge.c decl.c detect.c dig.c display.c dlb.c do.c \ do_name.c do_wear.c dog.c dogmove.c dokick.c dothrow.c drawing.c \ dungeon.c eat.c end.c engrave.c exper.c explode.c extralev.c \ files.c fountain.c hack.c hacklib.c invent.c light.c lock.c \ mail.c makemon.c mapglyph.c mcastu.c mhitm.c mhitu.c minion.c \ mklev.c mkmap.c \ mkmaze.c mkobj.c mkroom.c mon.c mondata.c monmove.c monst.c \ mplayer.c mthrowu.c muse.c music.c o_init.c objects.c objnam.c \ options.c pager.c pickup.c pline.c polyself.c potion.c pray.c \ priest.c quest.c questpgr.c read.c rect.c region.c restore.c rip.c \ rnd.c role.c rumors.c save.c shk.c shknam.c sit.c sounds.c sp_lev.c \ spell.c steal.c steed.c 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 \ gypsy.c tech.c # all operating-system-dependent .c (for dependencies and such) 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) GENCSRC = monstr.c vis_tab.c #tile.c # all windowing-system-dependent .c (for dependencies and such) WINCSRC = $(WINTTYSRC) $(WINX11SRC) $(WINGTKSRC) $(WINGNOMESRC) $(WINGEMSRC) \ $(WINPROXYSRC) $(PROXYUTLSRC) $(PROXYCLNTSRC) $(PROXYCOMSRC) \ $(PROXYSHRSRC) $(WINGLSRC) tile.c # all windowing-system-dependent .cpp (for dependencies and such) 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 # cause dependency loops if run through "make depend" # and dgn_comp.h, dgn_file.h, lev_comp.h, special level & dungeon files. # HACKINCL = align.h amiconf.h artifact.h artilist.h attrib.h beconf.h color.h \ config.h config1.h coord.h decl.h def_os2.h display.h dlb.h dungeon.h \ edog.h emin.h engrave.h epri.h eshk.h extern.h flag.h func_tab.h \ global.h hack.h lev.h macconf.h mfndpos.h micro.h mkroom.h \ monattk.h mondata.h monflag.h monst.h monsym.h obj.h objclass.h \ os2conf.h patchlevel.h pcconf.h permonst.h prop.h rect.h region.h rm.h \ sp_lev.h spell.h system.h tcap.h timeout.h tosconf.h tradstdc.h \ trampoli.h trap.h unixconf.h vault.h vision.h vmsconf.h wintty.h \ winX.h winprocs.h wintype.h you.h youprop.h HSOURCES = $(HACKINCL) date.h onames.h pm.h vis_tab.h\ lev_comp.h dgn_comp.h dgn_file.h # the following .o's _must_ be made before any others (for makedefs) FIRSTOBJ = monst.o objects.o alloc.o HOBJ = $(FIRSTOBJ) allmain.o apply.o artifact.o attrib.o ball.o \ bones.o botl.o cmd.o dbridge.o decl.o detect.o dig.o display.o dlb.o \ do.o do_name.o do_wear.o dog.o dogmove.o dokick.o dothrow.o \ drawing.o dungeon.o eat.o end.o engrave.o exper.o explode.o \ extralev.o files.o fountain.o hack.o hacklib.o invent.o 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 \ quest.o questpgr.o read.o rect.o region.o restore.o rip.o rnd.o \ role.o rumors.o save.o shk.o shknam.o sit.o sounds.o sp_lev.o spell.o \ steal.o steed.o teleport.o timeout.o topten.o track.o trap.o u_init.o \ uhitm.o vault.o vision.o vis_tab.o weapon.o were.o wield.o windows.o \ wizard.o worm.o worn.o write.o zap.o \ gypsy.o tech.o \ $(RANDOBJ) $(SYSOBJ) $(WINOBJ) version.o # the .o files from the HACKCSRC, SYSSRC, and WINSRC lists $(GAME): $(SYSTEM) @echo "$(GAME) is up to date." Sysunix: $(HOBJ) Makefile @echo "Loading ..." @$(LINK) $(LFLAGS) -o $(GAME) $(HOBJ) $(WINLIB) $(LIBS) @touch Sysunix Sys3B2: $(HOBJ) Makefile @echo "Loading ..." @$(LINK) $(LFLAGS) -o $(GAME) $(HOBJ) $(WINLIB) -lmalloc @touch Sys3B2 Sysatt: $(HOBJ) Makefile @echo "Loading ..." @$(LD) $(LFLAGS) /lib/crt0s.o /lib/shlib.ifile -o $(GAME) $(HOBJ) @touch Sysatt Systos: $(HOBJ) Makefile @echo "Loading ..." @$(LINK) $(LFLAGS) -o $(GAME) $(HOBJ) $(WINLIB) @touch Systos SysV-AT: DUMB.Setup $(HOBJ) Makefile @echo "Loading ..." @$(LINK) $(LFLAGS) -o $(GAME) $(HOBJ) $(WINLIB) @touch SysV-AT SysBe: $(HOBJ) Makefile @echo "Loading ..." @$(LINK) $(LFLAGS) -o $(GAME) $(HOBJ) $(WINLIB) $(LIBS) @xres -o $(GAME) ../win/BeOS/nethack.rsrc @mimeset -f $(GAME) @touch SysBe DUMB.Setup: ../include/extern.h cp ../include/extern.h ../include/extern.h.BAK cat ../include/extern.h | \ sed -e '/^E\ int\ /!b' \ -e '/[^;/ ]$$/N' \ -e '/[(][*]occupation[)]/b' \ -e '/[(][*]afternmv[)]/b' \ -e '/float_down/b' \ -e '/done1/b' \ -e '/identify/b' \ -e '/Hear_again/b' \ -e '/hangup/b' \ -e 's/^\(.*\)$$/\/\* \1 \/\*\*\//' | \ sed -e '/^E\ void\ /!b' \ -e '/[^;/ ]$$/N' \ -e 's/^\(.*\)$$/\/\* \1 \/\*\*\//' \ >../include/extern.DUMB cp ../include/extern.DUMB ../include/extern.h @touch DUMB.Setup all: $(GAME) # dependencies for makedefs and its outputs, which the util # Makefile is responsible for keeping up to date # # special rules, to force update of makedefs, real dependencies should be # below in the 'make depend' output. monst.o: $(CC) $(CFLAGS) -c monst.c @rm -f $(MAKEDEFS) objects.o: $(CC) $(CFLAGS) -c objects.c @rm -f $(MAKEDEFS) ../include/filename.h: $(MAKEDEFS) ../util/makedefs -f # Qt windowport meta-object-compiler output qt_kde0.moc: ../include/qt_kde0.h $(QTBINDIR)/moc -o qt_kde0.moc ../include/qt_kde0.h qt_win.moc: ../include/qt_win.h $(QTBINDIR)/moc -o qt_win.moc ../include/qt_win.h qttableview.moc: ../include/qttableview.h $(QTDIR)/bin/moc -o qttableview.moc ../include/qttableview.h # NetHack windows library for modules needed by more than one windows # interface. nhwin.a: tile.o $(PROXYSHROBJ) $(AR) cr nhwin.a tile.o $(PROXYSHROBJ) # NetHack proxy library for external window interfaces. nhproxy.a: $(PROXYCLNTOBJ) $(PROXYCOMOBJ) $(PROXYSHROBJ) $(AR) cr nhproxy.a $(PROXYCLNTOBJ) $(PROXYCOMOBJ) $(PROXYSHROBJ) $(MAKEDEFS): ../util/makedefs.c $(CONFIG_H) ../include/permonst.h \ ../include/objclass.h ../include/monsym.h \ ../include/artilist.h ../include/dungeon.h ../include/obj.h \ ../include/monst.h ../include/you.h ../include/flag.h \ ../include/dlb.h ../include/patchlevel.h ../include/qtext.h @( cd ../util ; $(MAKE) makedefs) ../include/onames.h: $(MAKEDEFS) @( cd ../util ; $(MAKE) ../include/onames.h ) ../include/pm.h: $(MAKEDEFS) @( cd ../util ; $(MAKE) ../include/pm.h ) monstr.c: $(MAKEDEFS) @( 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 ) ../win/gnome/gn_rip.h: ../win/X11/rip.xpm cp ../win/X11/rip.xpm ../win/gnome/gn_rip.h # 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. # # hack.h depends on makedefs' output, so we know makedefs will be # up to date before being executed ../include/date.h: $(VERSOURCES) $(HACK_H) ../util/makedefs -v lint: # lint cannot have -p here because (i) capitals are meaningful: # [Ww]izard, (ii) identifiers may coincide in the first six places: # doweararm() versus dowearring(). # _flsbuf comes from , a bug in the system libraries. @echo lint -axbh -DLINT ... @lint -axbh -I../include -DLINT $(CSOURCES) | sed '/_flsbuf/d' tags: $(CSOURCES) @echo ctags -tw ... @ctags -tw $(CSOURCES) @( cd ../include ; ctags -tw $(HSOURCES) ) @( cd ../util ; $(MAKE) tags ) clean: -rm -f *.o nhwin.a $(HACK_H) $(CONFIG_H) spotless: clean -rm -f a.out core $(GAME) Sys* -rm -f ../include/date.h ../include/onames.h ../include/pm.h -rm -f monstr.c ../include/vis_tab.h vis_tab.c tile.c *.moc -rm -f ../win/gnome/gn_rip.h -rm -f ../include/filename.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 @cp Makefile Makefile.bak ed - Makefile < eddep @rm -f eddep makedep @echo '# DEPENDENCIES MUST END AT END OF FILE' >> Makefile @echo '# IF YOU PUT STUFF HERE IT WILL GO AWAY' >> Makefile @echo '# see make depend above' >> Makefile - diff Makefile.bak Makefile @rm -f Makefile.bak # DO NOT DELETE THIS LINE OR CHANGE ANYTHING BEYOND IT # config.h timestamp $(CONFIG_H): ../include/config.h ../include/config1.h ../include/tradstdc.h \ ../include/global.h ../include/coord.h ../include/vmsconf.h \ ../include/system.h ../include/unixconf.h ../include/os2conf.h \ ../include/micro.h ../include/pcconf.h ../include/tosconf.h \ ../include/amiconf.h ../include/macconf.h ../include/beconf.h \ ../include/wceconf.h ../include/ntconf.h ../include/nhlan.h touch $(CONFIG_H) # hack.h timestamp $(HACK_H): ../include/hack.h $(CONFIG_H) ../include/align.h \ ../include/dungeon.h ../include/monsym.h ../include/mkroom.h \ ../include/objclass.h ../include/youprop.h ../include/prop.h \ ../include/permonst.h ../include/monattk.h \ ../include/monflag.h ../include/mondata.h ../include/pm.h \ ../include/wintype.h ../include/decl.h ../include/quest.h \ ../include/obj.h ../include/spell.h ../include/tech.h \ ../include/you.h ../include/attrib.h ../include/monst.h \ ../include/skills.h ../include/onames.h ../include/color.h \ ../include/timeout.h ../include/trap.h ../include/flag.h \ ../include/rm.h ../include/vision.h ../include/display.h \ ../include/engrave.h ../include/rect.h ../include/region.h \ ../include/winprocs.h ../include/wintty.h ../include/trampoli.h touch $(HACK_H) # tos.o: ../sys/atari/tos.c $(HACK_H) ../include/tcap.h $(CC) $(CFLAGS) -c ../sys/atari/tos.c pcmain.o: ../sys/share/pcmain.c $(HACK_H) ../include/dlb.h \ ../include/patchlevel.h #../include/win32api.h $(CC) $(CFLAGS) -c ../sys/share/pcmain.c pcsys.o: ../sys/share/pcsys.c $(HACK_H) $(CC) $(CFLAGS) -c ../sys/share/pcsys.c pctty.o: ../sys/share/pctty.c $(HACK_H) $(CC) $(CFLAGS) -c ../sys/share/pctty.c pcunix.o: ../sys/share/pcunix.c $(HACK_H) $(CC) $(CFLAGS) -c ../sys/share/pcunix.c random.o: ../sys/share/random.c $(HACK_H) $(CC) $(CFLAGS) -c ../sys/share/random.c ioctl.o: ../sys/share/ioctl.c $(HACK_H) ../include/tcap.h $(CC) $(CFLAGS) -c ../sys/share/ioctl.c unixtty.o: ../sys/share/unixtty.c $(HACK_H) $(CC) $(CFLAGS) -c ../sys/share/unixtty.c unixmain.o: ../sys/unix/unixmain.c $(HACK_H) ../include/dlb.h $(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 $(CC) $(CFLAGS) -c ../win/tty/getline.c termcap.o: ../win/tty/termcap.c $(HACK_H) ../include/tcap.h $(CC) $(CFLAGS) -c ../win/tty/termcap.c topl.o: ../win/tty/topl.c $(HACK_H) ../include/tcap.h $(CC) $(CFLAGS) -c ../win/tty/topl.c wintty.o: ../win/tty/wintty.c $(HACK_H) ../include/dlb.h \ ../include/patchlevel.h ../include/tcap.h $(CC) $(CFLAGS) -c ../win/tty/wintty.c Window.o: ../win/X11/Window.c ../include/xwindowp.h ../include/xwindow.h \ $(CONFIG_H) $(CC) $(CFLAGS) -c ../win/X11/Window.c dialogs.o: ../win/X11/dialogs.c $(CONFIG_H) $(CC) $(CFLAGS) -c ../win/X11/dialogs.c winX.o: ../win/X11/winX.c $(HACK_H) ../include/winX.h ../include/dlb.h \ ../include/patchlevel.h ../win/X11/nh72icon \ ../win/X11/nh56icon ../win/X11/nh32icon $(CC) $(CFLAGS) -c ../win/X11/winX.c winmap.o: ../win/X11/winmap.c ../include/xwindow.h $(HACK_H) ../include/dlb.h \ ../include/winX.h ../include/patchlevel.h ../include/tile2x11.h $(CC) $(CFLAGS) -c ../win/X11/winmap.c winmenu.o: ../win/X11/winmenu.c $(HACK_H) ../include/winX.h $(CC) $(CFLAGS) -c ../win/X11/winmenu.c winmesg.o: ../win/X11/winmesg.c ../include/xwindow.h $(HACK_H) ../include/winX.h $(CC) $(CFLAGS) -c ../win/X11/winmesg.c winmisc.o: ../win/X11/winmisc.c $(HACK_H) ../include/func_tab.h \ ../include/winX.h $(CC) $(CFLAGS) -c ../win/X11/winmisc.c winstat.o: ../win/X11/winstat.c $(HACK_H) ../include/winX.h $(CC) $(CFLAGS) -c ../win/X11/winstat.c wintext.o: ../win/X11/wintext.c $(HACK_H) ../include/winX.h ../include/xwindow.h $(CC) $(CFLAGS) -c ../win/X11/wintext.c winval.o: ../win/X11/winval.c $(HACK_H) ../include/winX.h $(CC) $(CFLAGS) -c ../win/X11/winval.c gtk.o: ../win/gtk/gtk.c ../include/md5.h ../include/winGTK.h $(HACK_H) \ ../include/nhxdr.h ../include/proxycom.h ../include/func_tab.h \ ../include/dlb.h ../include/patchlevel.h ../include/proxycb.h \ ../include/prxyclnt.h $(CC) $(CFLAGS) $(WINGTKCFLAGS) -c ../win/gtk/gtk.c gtkgetlin.o: ../win/gtk/gtkgetlin.c ../include/winGTK.h $(HACK_H) \ ../include/nhxdr.h ../include/proxycom.h $(CC) $(CFLAGS) $(WINGTKCFLAGS) -c ../win/gtk/gtkgetlin.c gtkstatus.o: ../win/gtk/gtkstatus.c ../include/winGTK.h $(HACK_H) \ ../include/nhxdr.h ../include/proxycom.h $(CC) $(CFLAGS) $(WINGTKCFLAGS) -c ../win/gtk/gtkstatus.c gtkmenu.o: ../win/gtk/gtkmenu.c ../include/winGTK.h $(HACK_H) \ ../include/nhxdr.h ../include/proxycom.h ../include/patchlevel.h $(CC) $(CFLAGS) $(WINGTKCFLAGS) -c ../win/gtk/gtkmenu.c gtkyn.o: ../win/gtk/gtkyn.c ../include/winGTK.h $(HACK_H) ../include/nhxdr.h \ ../include/proxycom.h $(CC) $(CFLAGS) $(WINGTKCFLAGS) -c ../win/gtk/gtkyn.c gtkextcmd.o: ../win/gtk/gtkextcmd.c ../include/winGTK.h $(HACK_H) \ ../include/nhxdr.h ../include/proxycom.h ../include/proxycb.h \ ../include/func_tab.h $(CC) $(CFLAGS) $(WINGTKCFLAGS) -c ../win/gtk/gtkextcmd.c gtkmap.o: ../win/gtk/gtkmap.c ../include/winGTK.h $(HACK_H) ../include/nhxdr.h \ ../include/proxycom.h ../include/dlb.h ../include/patchlevel.h \ ../include/proxycb.h ../include/prxyclnt.h \ ../win/gtk/gtkprogress.h $(CC) $(CFLAGS) $(WINGTKCFLAGS) -c ../win/gtk/gtkmap.c gtkmessage.o: ../win/gtk/gtkmessage.c ../include/winGTK.h $(HACK_H) \ ../include/nhxdr.h ../include/proxycom.h $(CC) $(CFLAGS) $(WINGTKCFLAGS) -c ../win/gtk/gtkmessage.c gtkmisc.o: ../win/gtk/gtkmisc.c ../include/winGTK.h $(HACK_H) \ ../include/nhxdr.h ../include/proxycom.h ../include/proxycb.h $(CC) $(CFLAGS) $(WINGTKCFLAGS) -c ../win/gtk/gtkmisc.c gtktile.o: ../win/gtk/gtktile.c ../include/winGTK.h $(HACK_H) \ ../include/nhxdr.h ../include/proxycom.h ../include/dlb.h \ ../include/proxycb.h ../include/prxyclnt.h \ ../win/gtk/gtkprogress.h $(CC) $(CFLAGS) $(WINGTKCFLAGS) -c ../win/gtk/gtktile.c xshmmap.o: ../win/gtk/xshmmap.c ../include/winGTK.h $(HACK_H) \ ../include/nhxdr.h ../include/proxycom.h $(CC) $(CFLAGS) $(WINGTKCFLAGS) -c ../win/gtk/xshmmap.c gtkhackrc.o: ../win/gtk/gtkhackrc.c ../include/winGTK.h $(HACK_H) \ ../include/nhxdr.h ../include/proxycom.h ../include/prxyclnt.h $(CC) $(CFLAGS) $(WINGTKCFLAGS) -c ../win/gtk/gtkhackrc.c gtkprefs.o: ../win/gtk/gtkprefs.c ../include/winGTK.h $(HACK_H) \ ../include/nhxdr.h ../include/proxycom.h ../include/patchlevel.h $(CC) $(CFLAGS) $(WINGTKCFLAGS) -c ../win/gtk/gtkprefs.c gtkprogress.o: ../win/gtk/gtkprogress.c ../include/winGTK.h $(HACK_H) \ ../include/nhxdr.h ../include/proxycom.h \ ../win/gtk/gtkprogress.h $(CC) $(CFLAGS) $(WINGTKCFLAGS) -c ../win/gtk/gtkprogress.c gtkext.o: ../win/gtk/gtkext.c ../include/winGTK.h $(HACK_H) ../include/nhxdr.h \ ../include/proxycom.h ../include/prxyclnt.h $(CC) $(CFLAGS) $(WINGTKCFLAGS) -c ../win/gtk/gtkext.c gtkint.o: ../win/gtk/gtkint.c ../include/winGTK.h $(HACK_H) ../include/nhxdr.h \ ../include/proxycom.h ../include/prxyclnt.h \ ../include/func_tab.h ../include/dlb.h ../include/patchlevel.h $(CC) $(CFLAGS) $(WINGTKCFLAGS) -c ../win/gtk/gtkint.c gnaskstr.o: ../win/gnome/gnaskstr.c ../win/gnome/gnaskstr.h \ ../win/gnome/gnmain.h $(CC) $(CFLAGS) $(GNOMEINC) -c ../win/gnome/gnaskstr.c gnbind.o: ../win/gnome/gnbind.c ../win/gnome/gnbind.h ../win/gnome/gnmain.h \ ../win/gnome/gnmenu.h ../win/gnome/gnaskstr.h \ ../win/gnome/gnyesno.h $(CC) $(CFLAGS) $(GNOMEINC) -c ../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) \ ../include/date.h $(CC) $(CFLAGS) $(GNOMEINC) -c ../win/gnome/gnmain.c gnmap.o: ../win/gnome/gnmap.c ../win/gnome/gnmap.h ../win/gnome/gnglyph.h \ ../win/gnome/gnsignal.h $(HACK_H) $(CC) $(CFLAGS) $(GNOMEINC) -c ../win/gnome/gnmap.c gnmenu.o: ../win/gnome/gnmenu.c ../win/gnome/gnmenu.h ../win/gnome/gnmain.h \ ../win/gnome/gnbind.h ../include/func_tab.h $(CC) $(CFLAGS) $(GNOMEINC) -c ../win/gnome/gnmenu.c gnmesg.o: ../win/gnome/gnmesg.c ../win/gnome/gnmesg.h ../win/gnome/gnsignal.h $(CC) $(CFLAGS) $(GNOMEINC) -c ../win/gnome/gnmesg.c gnopts.o: ../win/gnome/gnopts.c ../win/gnome/gnopts.h ../win/gnome/gnglyph.h \ ../win/gnome/gnmain.h ../win/gnome/gnmap.h $(HACK_H) $(CC) $(CFLAGS) $(GNOMEINC) -c ../win/gnome/gnopts.c gnplayer.o: ../win/gnome/gnplayer.c ../win/gnome/gnplayer.h \ ../win/gnome/gnmain.h $(HACK_H) $(CC) $(CFLAGS) $(GNOMEINC) -c ../win/gnome/gnplayer.c gnsignal.o: ../win/gnome/gnsignal.c ../win/gnome/gnsignal.h \ ../win/gnome/gnmain.h $(CC) $(CFLAGS) $(GNOMEINC) -c ../win/gnome/gnsignal.c gnstatus.o: ../win/gnome/gnstatus.c ../win/gnome/gnstatus.h \ ../win/gnome/gnsignal.h ../win/gnome/gn_xpms.h \ ../win/gnome/gnomeprv.h $(CC) $(CFLAGS) $(GNOMEINC) -c ../win/gnome/gnstatus.c gntext.o: ../win/gnome/gntext.c ../win/gnome/gntext.h ../win/gnome/gnmain.h \ ../win/gnome/gn_rip.h $(CC) $(CFLAGS) $(GNOMEINC) -c ../win/gnome/gntext.c gnyesno.o: ../win/gnome/gnyesno.c ../win/gnome/gnbind.h ../win/gnome/gnyesno.h $(CC) $(CFLAGS) $(GNOMEINC) -c ../win/gnome/gnyesno.c gnworn.o: ../win/gnome/gnworn.c ../win/gnome/gnworn.h ../win/gnome/gnglyph.h \ ../win/gnome/gnsignal.h ../win/gnome/gnomeprv.h $(CC) $(CFLAGS) $(GNOMEINC) -c ../win/gnome/gnworn.c wingem.o: ../win/gem/wingem.c $(HACK_H) ../include/func_tab.h ../include/dlb.h \ ../include/patchlevel.h ../include/wingem.h $(CC) $(CFLAGS) -c ../win/gem/wingem.c wingem1.o: ../win/gem/wingem1.c ../include/gem_rsc.h ../include/load_img.h \ ../include/gr_rect.h ../include/wintype.h ../include/wingem.h $(CC) $(CFLAGS) -c ../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 ../include/gr_rect.h $(CC) $(CFLAGS) -c ../win/gem/gr_rect.c winproxy.o: ../win/proxy/winproxy.c $(HACK_H) ../include/patchlevel.h \ ../include/date.h ../include/nhxdr.h ../include/proxycom.h \ ../include/winproxy.h #../include/win32api.h $(CC) $(CFLAGS) -c ../win/proxy/winproxy.c callback.o: ../win/proxy/callback.c $(HACK_H) ../include/func_tab.h \ ../include/md5.h ../include/nhxdr.h ../include/proxycom.h \ ../include/winproxy.h $(CC) $(CFLAGS) -c ../win/proxy/callback.c dlbh.o: ../win/proxy/dlbh.c $(HACK_H) ../include/dlb.h $(CC) $(CFLAGS) -c ../win/proxy/dlbh.c mapid.o: ../win/proxy/mapid.c $(HACK_H) ../include/nhxdr.h ../include/winproxy.h $(CC) $(CFLAGS) -c ../win/proxy/mapid.c riputil.o: ../win/proxy/riputil.c $(HACK_H) $(CC) $(CFLAGS) -c ../win/proxy/riputil.c getopt.o: ../win/proxy/getopt.c $(HACK_H) $(CC) $(CFLAGS) -c ../win/proxy/getopt.c glyphmap.o: ../win/proxy/glyphmap.c $(HACK_H) ../include/nhxdr.h \ ../include/proxycom.h ../include/winproxy.h $(CC) $(CFLAGS) -c ../win/proxy/glyphmap.c proxysvc.o: ../win/proxy/proxysvc.c ../include/nhxdr.h ../include/proxycom.h \ ../include/proxycb.h ../include/prxyclnt.h $(CC) $(CFLAGS) -c ../win/proxy/proxysvc.c proxycb.o: ../win/proxy/proxycb.c ../include/nhxdr.h ../include/proxycom.h \ ../include/proxycb.h $(CC) $(CFLAGS) -c ../win/proxy/proxycb.c prxymap.o: ../win/proxy/prxymap.c ../include/nhxdr.h ../include/proxycom.h \ ../include/prxyclnt.h $(CC) $(CFLAGS) -c ../win/proxy/prxymap.c prxychar.o: ../win/proxy/prxychar.c ../include/nhxdr.h ../include/proxycom.h \ ../include/prxyclnt.h $(CC) $(CFLAGS) -c ../win/proxy/prxychar.c prxytile.o: ../win/proxy/prxytile.c ../include/nhxdr.h ../include/proxycom.h \ ../include/prxyclnt.h ../include/proxycb.h $(CC) $(CFLAGS) -c ../win/proxy/prxytile.c prxyconn.o: ../win/proxy/prxyconn.c ../include/nhxdr.h ../include/proxycom.h \ ../include/prxyclnt.h $(CC) $(CFLAGS) -c ../win/proxy/prxyconn.c nhext.o: ../win/proxy/nhext.c ../include/nhxdr.h ../include/proxycom.h $(CC) $(CFLAGS) -c ../win/proxy/nhext.c nhxdr.o: ../win/proxy/nhxdr.c ../include/nhxdr.h $(CC) $(CFLAGS) -c ../win/proxy/nhxdr.c nhextxdr.o: ../win/proxy/nhextxdr.c ../include/nhxdr.h $(CC) $(CFLAGS) -c ../win/proxy/nhextxdr.c nhextio.o: ../win/proxy/nhextio.c ../include/nhxdr.h $(CC) $(CFLAGS) -c ../win/proxy/nhextio.c nhextnb.o: ../win/proxy/nhextnb.c ../include/nhxdr.h $(CC) $(CFLAGS) -c ../win/proxy/nhextnb.c compxdr.o: ../win/proxy/compxdr.c ../include/nhxdr.h ../include/proxycom.h $(CC) $(CFLAGS) -c ../win/proxy/compxdr.c md5.o: ../win/proxy/md5.c ../include/md5.h $(CC) $(CFLAGS) -c ../win/proxy/md5.c gl_conf.o: ../win/gl/gl_conf.c $(HACK_H) ../include/dlb.h \ ../include/patchlevel.h ../include/winGL.h $(CC) $(CFLAGS) $(SDLGL_CFLAGS) -c ../win/gl/gl_conf.c gl_emul.o: ../win/gl/gl_emul.c $(HACK_H) ../include/winGL.h \ ../include/func_tab.h $(CC) $(CFLAGS) $(SDLGL_CFLAGS) -c ../win/gl/gl_emul.c gl_font.o: ../win/gl/gl_font.c $(HACK_H) ../include/patchlevel.h \ ../include/winGL.h $(CC) $(CFLAGS) $(SDLGL_CFLAGS) -c ../win/gl/gl_font.c gl_hardw.o: ../win/gl/gl_hardw.c $(HACK_H) ../include/patchlevel.h \ ../include/winGL.h $(CC) $(CFLAGS) $(SDLGL_CFLAGS) -c ../win/gl/gl_hardw.c gl_image.o: ../win/gl/gl_image.c $(HACK_H) ../include/patchlevel.h \ ../include/dlb.h ../include/winGL.h $(CC) $(CFLAGS) $(SDLGL_CFLAGS) -c ../win/gl/gl_image.c gl_main.o: ../win/gl/gl_main.c $(HACK_H) ../include/dlb.h \ ../include/patchlevel.h ../include/winGL.h $(CC) $(CFLAGS) $(SDLGL_CFLAGS) -c ../win/gl/gl_main.c gl_map.o: ../win/gl/gl_map.c $(HACK_H) ../include/patchlevel.h \ ../include/winGL.h $(CC) $(CFLAGS) $(SDLGL_CFLAGS) -c ../win/gl/gl_map.c gl_menu.o: ../win/gl/gl_menu.c $(HACK_H) ../include/dlb.h \ ../include/patchlevel.h ../include/winGL.h $(CC) $(CFLAGS) $(SDLGL_CFLAGS) -c ../win/gl/gl_menu.c gl_opt.o: ../win/gl/gl_opt.c $(HACK_H) ../include/dlb.h \ ../include/patchlevel.h ../include/date.h ../include/winGL.h $(CC) $(CFLAGS) $(SDLGL_CFLAGS) -c ../win/gl/gl_opt.c gl_role.o: ../win/gl/gl_role.c $(HACK_H) ../include/dlb.h \ ../include/patchlevel.h ../include/winGL.h $(CC) $(CFLAGS) $(SDLGL_CFLAGS) -c ../win/gl/gl_role.c gl_rendu.o: ../win/gl/gl_rendu.c $(HACK_H) ../include/patchlevel.h \ ../include/winGL.h $(CC) $(CFLAGS) $(SDLGL_CFLAGS) -c ../win/gl/gl_rendu.c gl_softw.o: ../win/gl/gl_softw.c $(HACK_H) ../include/patchlevel.h \ ../include/winGL.h $(CC) $(CFLAGS) $(SDLGL_CFLAGS) -c ../win/gl/gl_softw.c gl_stat.o: ../win/gl/gl_stat.c $(HACK_H) ../include/winGL.h $(CC) $(CFLAGS) $(SDLGL_CFLAGS) -c ../win/gl/gl_stat.c gl_text.o: ../win/gl/gl_text.c $(HACK_H) ../include/dlb.h \ ../include/patchlevel.h ../include/winGL.h $(CC) $(CFLAGS) $(SDLGL_CFLAGS) -c ../win/gl/gl_text.c gl_tile.o: ../win/gl/gl_tile.c $(HACK_H) ../include/patchlevel.h \ ../include/winGL.h $(CC) $(CFLAGS) $(SDLGL_CFLAGS) -c ../win/gl/gl_tile.c gl_unit.o: ../win/gl/gl_unit.c $(HACK_H) ../include/winGL.h $(CC) $(CFLAGS) $(SDLGL_CFLAGS) -c ../win/gl/gl_unit.c gl_win.o: ../win/gl/gl_win.c $(HACK_H) ../include/dlb.h \ ../include/patchlevel.h ../include/winGL.h $(CC) $(CFLAGS) $(SDLGL_CFLAGS) -c ../win/gl/gl_win.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/date.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) ../include/patchlevel.h alloc.o: alloc.c $(CONFIG_H) apply.o: apply.c $(HACK_H) ../include/edog.h artifact.o: artifact.c $(HACK_H) ../include/artifact.h ../include/artilist.h attrib.o: attrib.c $(HACK_H) ball.o: ball.c $(HACK_H) bones.o: bones.c $(HACK_H) ../include/lev.h botl.o: botl.c $(HACK_H) cmd.o: cmd.c $(HACK_H) ../include/func_tab.h dbridge.o: dbridge.c $(HACK_H) decl.o: decl.c $(HACK_H) detect.o: detect.c $(HACK_H) ../include/artifact.h dig.o: dig.c $(HACK_H) ../include/edog.h display.o: display.c $(HACK_H) dlb.o: dlb.c $(CONFIG_H) ../include/dlb.h do.o: do.c $(HACK_H) ../include/lev.h do_name.o: do_name.c $(HACK_H) do_wear.o: do_wear.c $(HACK_H) dog.o: dog.c $(HACK_H) ../include/edog.h ../include/emin.h ../include/epri.h dogmove.o: dogmove.c $(HACK_H) ../include/mfndpos.h ../include/edog.h \ ../include/emin.h ../include/epri.h dokick.o: dokick.c $(HACK_H) ../include/eshk.h dothrow.o: dothrow.c $(HACK_H) ../include/edog.h drawing.o: drawing.c $(HACK_H) ../include/tcap.h dungeon.o: dungeon.c $(HACK_H) ../include/dgn_file.h ../include/dlb.h eat.o: eat.c $(HACK_H) end.o: end.c $(HACK_H) ../include/eshk.h ../include/dlb.h engrave.o: engrave.c $(HACK_H) ../include/lev.h exper.o: exper.c $(HACK_H) explode.o: explode.c $(HACK_H) extralev.o: extralev.c $(HACK_H) files.o: files.c $(HACK_H) ../include/dlb.h ../include/filename.h \ ../include/winGL.h ../include/winproxy.h fountain.o: fountain.c $(HACK_H) hack.o: hack.c $(HACK_H) hacklib.o: hacklib.c $(HACK_H) invent.o: invent.c $(HACK_H) light.o: light.c $(HACK_H) ../include/lev.h lock.o: lock.c $(HACK_H) mail.o: mail.c $(HACK_H) ../include/mail.h makemon.o: makemon.c $(HACK_H) ../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 minion.o: minion.c $(HACK_H) ../include/emin.h ../include/epri.h mklev.o: mklev.c $(HACK_H) mkmap.o: mkmap.c $(HACK_H) ../include/sp_lev.h mkmaze.o: mkmaze.c $(HACK_H) ../include/sp_lev.h ../include/lev.h mkobj.o: mkobj.c $(HACK_H) mkroom.o: mkroom.c $(HACK_H) mon.o: mon.c $(HACK_H) ../include/mfndpos.h ../include/edog.h \ ../include/artifact.h mondata.o: mondata.c $(HACK_H) ../include/eshk.h ../include/epri.h monmove.o: monmove.c $(HACK_H) ../include/mfndpos.h ../include/artifact.h \ ../include/epri.h monst.o: monst.c $(CONFIG_H) ../include/permonst.h ../include/align.h \ ../include/monattk.h ../include/monflag.h ../include/monsym.h \ ../include/dungeon.h ../include/eshk.h ../include/vault.h \ ../include/epri.h ../include/egyp.h ../include/color.h mplayer.o: mplayer.c $(HACK_H) mthrowu.o: mthrowu.c $(HACK_H) muse.o: muse.c $(HACK_H) ../include/edog.h music.o: music.c $(HACK_H) #interp.c o_init.o: o_init.c $(HACK_H) ../include/lev.h objects.o: objects.c $(CONFIG_H) ../include/obj.h ../include/objclass.h \ ../include/prop.h ../include/skills.h ../include/color.h objnam.o: objnam.c $(HACK_H) options.o: options.c $(CONFIG_H) ../include/objclass.h ../include/flag.h \ $(HACK_H) ../include/tcap.h ../include/winGL.h \ ../include/filename.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 priest.o: priest.c $(HACK_H) ../include/mfndpos.h ../include/eshk.h \ ../include/epri.h ../include/emin.h quest.o: quest.c $(HACK_H) ../include/qtext.h questpgr.o: questpgr.c $(HACK_H) ../include/dlb.h ../include/qtext.h read.o: read.c $(HACK_H) rect.o: rect.c $(HACK_H) region.o: region.c $(HACK_H) ../include/lev.h restore.o: restore.c $(HACK_H) ../include/lev.h ../include/tcap.h rip.o: rip.c $(HACK_H) rnd.o: rnd.c $(HACK_H) role.o: role.c $(HACK_H) rumors.o: rumors.c $(HACK_H) ../include/lev.h ../include/dlb.h save.o: save.c $(HACK_H) ../include/lev.h shk.o: shk.c $(HACK_H) ../include/eshk.h shknam.o: shknam.c $(HACK_H) ../include/eshk.h sit.o: sit.c $(HACK_H) ../include/artifact.h sounds.o: sounds.c $(HACK_H) ../include/edog.h sp_lev.o: sp_lev.c $(HACK_H) ../include/dlb.h ../include/sp_lev.h spell.o: spell.c $(HACK_H) ../include/edog.h steal.o: steal.c $(HACK_H) steed.o: steed.c $(HACK_H) teleport.o: teleport.c $(HACK_H) timeout.o: timeout.c $(HACK_H) ../include/lev.h topten.o: topten.c $(HACK_H) ../include/dlb.h ../include/patchlevel.h track.o: track.c $(HACK_H) trap.o: trap.c $(HACK_H) u_init.o: u_init.c $(HACK_H) uhitm.o: uhitm.c $(HACK_H) vault.o: vault.c $(HACK_H) ../include/vault.h version.o: version.c $(HACK_H) ../include/date.h ../include/patchlevel.h vision.o: vision.c $(HACK_H) ../include/vis_tab.h weapon.o: weapon.c $(HACK_H) were.o: were.c $(HACK_H) wield.o: wield.c $(HACK_H) windows.o: windows.c $(HACK_H) ../include/wingem.h ../include/winGnome.h \ ../include/winGL.h ../include/winproxy.h wizard.o: wizard.c $(HACK_H) ../include/qtext.h ../include/epri.h worm.o: worm.c $(HACK_H) ../include/lev.h worn.o: worn.c $(HACK_H) write.o: write.c $(HACK_H) zap.o: zap.c $(HACK_H) gypsy.o: gypsy.c $(HACK_H) ../include/egyp.h ../include/qtext.h tech.o: tech.c $(HACK_H) # DEPENDENCIES MUST END AT END OF FILE # IF YOU PUT STUFF HERE IT WILL GO AWAY # see make depend above slashem-0.0.7E7F3/sys/unix/cpp1.shr0000664000076400007640000015262710545462317015053 0ustar aliali# This is a shell archive. Save it in a file, remove anything before # this line, and then unpack it by entering "sh file". Note, it may # create directories; files and directories will be owned by you and # have default permissions. # # This archive contains: # # makefile.txt # readme.txt # cpp.mem # cpp.h # cppdef.h # cpp2.c # echo x - makefile.txt sed 's/^X//' >makefile.txt << 'END-of-makefile.txt' X# X# The redefinition of strchr() and strrchr() are needed for X# Ultrix-32, Unix 4.2 bsd (and maybe some other Unices). X# XBSDDEFINE = -Dstrchr=index -Dstrrchr=rindex X# X# On certain systems, such as Unix System III, you may need to define X# $(LINTFLAGS) in the make command line to set system-specific lint flags. X# X# This Makefile assumes cpp will replace the "standard" preprocessor. X# Delete the reference to -DLINE_PREFIX=\"\" if cpp is used stand-alone. X# LINEFIX is a sed script filter that reinserts #line -- used for testing X# if LINE_PREFIX is set to "". Note that we must stand on our heads to X# match the # and a line had better not begin with $. By the way, what X# we really want is X# LINEFIX = | sed "s/^#/#line/" X# XCPPDEFINE = -DLINE_PREFIX=\"\" XLINEFIX = | sed "s/^[^ !\"%-~]/&line/" X# X# Define OLD_PREPROCESSOR non-zero to make a preprocessor which is X# "as compatible as possible" with the standard Unix V7 or Ultrix X# preprocessors. This is needed to rebuild 4.2bsd, for example, as X# the preprocessor is used to modify assembler code, rather than C. X# This is not recommended for current development. OLD_PREPROCESSOR X# forces the following definitions: X# OK_DOLLAR FALSE $ is not allowed in variables X# OK_CONCAT FALSE # cannot concatenate tokens X# COMMENT_INVISIBLE TRUE old-style comment concatenation X# STRING_FORMAL TRUE old-style string expansion X# XOLDDEFINE = -DOLD_PREPROCESSOR=1 X# X# DEFINES collects all -D arguments for cc and lint: X# Change DEFINES = $(BSDDEFINE) $(CPPDEFINE) $(OLDDEFINE) X# for an old-style preprocessor. X# X# DEFINES = $(BSDDEFINE) $(CPPDEFINE) XDEFINES = $(CPPDEFINE) X XCFLAGS = -O $(DEFINES) X X# X# ** compile cpp X# XSRCS = cpp1.c cpp2.c cpp3.c cpp4.c cpp5.c cpp6.c XOBJS = cpp1.o cpp2.o cpp3.o cpp4.o cpp5.o cpp6.o Xcpp: $(OBJS) X $(CC) $(CFLAGS) $(OBJS) -o cpp X X# X# ** Test cpp by preprocessing itself, compiling the result, X# ** repeating the process and diff'ing the result. Note: this X# ** is not a good test of cpp, but a simple verification. X# ** The diff's should not report any changes. X# ** Note that a sed script may be executed for each compile X# Xtest: X cpp cpp1.c $(LINEFIX) >old.tmp1.c X cpp cpp2.c $(LINEFIX) >old.tmp2.c X cpp cpp3.c $(LINEFIX) >old.tmp3.c X cpp cpp4.c $(LINEFIX) >old.tmp4.c X cpp cpp5.c $(LINEFIX) >old.tmp5.c X cpp cpp6.c $(LINEFIX) >old.tmp6.c X $(CC) $(CFLAGS) old.tmp[123456].c X a.out cpp1.c >new.tmp1.c X a.out cpp2.c >new.tmp2.c X a.out cpp3.c >new.tmp3.c X a.out cpp4.c >new.tmp4.c X a.out cpp5.c >new.tmp5.c X a.out cpp6.c >new.tmp6.c X diff old.tmp1.c new.tmp1.c X diff old.tmp2.c new.tmp2.c X diff old.tmp3.c new.tmp3.c X diff old.tmp4.c new.tmp4.c X diff old.tmp5.c new.tmp5.c X diff old.tmp6.c new.tmp6.c X rm a.out old.tmp[123456].* new.tmp[123456].* X X# X# A somewhat more extensive test is provided by the "clock" X# program (which is not distributed). Substitute your favorite X# macro-rich program here. X# Xclock: clock.c cpp X cpp clock.c $(LINEFIX) >temp.cpp.c X cc temp.cpp.c -lcurses -ltermcap -o clock X rm temp.cpp.c X X# X# ** Lint the code X# X Xlint: $(SRCS) X lint $(LINTFLAGS) $(DEFINES) $(SRCS) X X# X# ** Remove unneeded files X# Xclean: X rm -f $(OBJS) cpp X X# X# ** Rebuild the archive files needed to distribute cpp X# ** Uses the Decus C archive utility. X# X Xarchc: archc.c X $(CC) $(CFLAGS) archc.c -o archc X Xarchx: archx.c X $(CC) $(CFLAGS) archx.c -o archx X Xarchive: archc X archc readme.txt cpp.mem archx.c archc.c cpp.rno makefile.txt \ X cpp*.h >cpp1.arc X archc cpp1.c cpp2.c cpp3.c >cpp2.arc X archc cpp4.c cpp5.c cpp6.c >cpp3.arc X X# X# Object module dependencies X# X Xcpp1.o : cpp1.c cpp.h cppdef.h X Xcpp2.o : cpp2.c cpp.h cppdef.h X Xcpp3.o : cpp3.c cpp.h cppdef.h X Xcpp4.o : cpp4.c cpp.h cppdef.h X Xcpp5.o : cpp5.c cpp.h cppdef.h X Xcpp6.o : cpp6.c cpp.h cppdef.h X X END-of-makefile.txt echo x - readme.txt sed 's/^X//' >readme.txt << 'END-of-readme.txt' X XDecus cpp is a public-domain implementation of the C preprocessor. XIt runs on VMS native (Vax C), VMS compatibilty mode (Decus C), XRSX-11M, RSTS/E, P/OS, and RT11, as well as on several varieties Xof Unix, including Ultrix. Decus cpp attempts to implement features Xin the Draft ANSI Standard for the C language. It should be noted, Xhowever, that this standard is under active development: the current Xdraft of the standard explicitly states that "readers are requested Xnot to specify or claim conformance to this draft." Thus readers Xand users of Decus cpp should not assume that it conforms to the Xdraft standard, or that it will conform to the actual C language Xstandard. X XThese notes describe how to extract the cpp source files, configure it Xfor your needs, and mention a few design decisions that may be of interest Xto maintainers. X X Installation X XBecause the primary development of cpp was not on Unix, it Xis distributed using the Decus C archive program (quite similar Xto the archiver published in Kernighan and Plauger's Software XTools). To extract the files from the net.sources distribution, Xsave this message as cpp1.arc and the other two distribution Xfiles as cpp2.arc and cpp3.arc. Then, using your favorite editor, Xlocate the archx.c program, just following the line beginning with X"-h- archx.c" -- the format of the distribution is just: X X -h- readme.txt X ... this file X -h- cpp.mem X ... description of cpp X -h- archx.c X ... archx.c program -- extracts archives X -h- archc.c X ... archc.c program -- creates archives X XCompile archx.c -- it shouldn't require any special editing. XThen run it as follows: X X archx *.arc X XYou do not need to remove mail headers from the saved messages. X XYou should then read through cppdef.h to make sure the HOST and XTARGET (and other implementation-specific) definitions are set Xcorrectly for your machine, editing them as needed. X XYou may then copy makefile.txt to Makefile, editing it as needed Xfor your particular system. On Unix, cpp should be compiled Xby make without further difficulty. On other operating systems, Xyou should compile the six source modules, linking them together. XNote that, on Decus C based systems, you must extend the default Xstack allocation. The Decus C build utility will create the Xappropriate command file. X X Support Notes X XThe USENET distribution kit was designed to keep all submissions around X50,000 bytes: X Xcpp1.arc: X readme.txt This file X cpp.mem Documentation page (see below) X archx.c Archive extraction program X archc.c Archive construction program X cpp.rno Source for cpp.mem (see below) X makefile.txt Unix makefile -- copy to Makefile X cpp.h Main header file (structure def's and globals) X cppdef.h Configuration file (host and target definitions) X Xcpp2.arc: X cpp1.c Mainline code, documentation master sources X cpp2.c most #control processing X cpp3.c filename stuff and command line parsing Xcpp3.arc: X cpp4.c #define processor X cpp5.c #if processor X cpp6.c Support code (symbol table and I/O routines) X XCpp intentionally does not rely on the presence of a full-scale Xmacro preprocessor, it does require the simple parameter substitution Xpreprocessor capabilities of Unix V6 and Decus C. If your C Xlanguage lacks full preprocessing, you should make sure "nomacargs" Xis #define'd in cpp.h. (This is done automatically by the Decus C Xcompiler.) X XThe documentation (manual page) for cpp is included as cpp.mem Xand cpp.rno. Cpp.rno is in Dec Runoff format, built by a Decus C Xutility (getrno) from original source which is embedded in cpp1.c. XTo my knowledge, there is no equivalent program that creates Xthe nroff source appropriate for Unix. X XI would be happy to receive fixes to any problems you encounter. XAs I do not maintain distribution kit base-levels, bare-bones Xdiff listings without sufficient context are not very useful. XIt is unlikely that I can find time to help you with other Xdifficulties. X X Acknowledgements X XI received a great deal of help from many people in debugging cpp. XAlan Feuer and Sam Kendall used "state of the art" run-time code Xcheckers to locate several errors. Ed Keiser found problems when Xcpp was used on machines with different int and pointer sizes. XDave Conroy helped with the initial debugging, while Arthur Olsen Xand George Rosenberg found (and solved) several problems in the Xfirst USENET release. X XMartin Minow Xdecvax!minow X END-of-readme.txt echo x - cpp.mem sed 's/^X//' >cpp.mem << 'END-of-cpp.mem' X X X X X 1.0 C Pre-Processor X X X X ******* X * cpp * X ******* X X X X NAME: cpp -- C Pre-Processor X X SYNOPSIS: X X cpp [-options] [infile [outfile]] X X DESCRIPTION: X X CPP reads a C source file, expands macros and include X files, and writes an input file for the C compiler. If X no file arguments are given, CPP reads from stdin and X writes to stdout. If one file argument is given, it X will define the input file, while two file arguments X define both input and output files. The file name "-" X is a synonym for stdin or stdout as appropriate. X X The following options are supported. Options may be X given in either case. X X -C If set, source-file comments are written X to the output file. This allows the X output of CPP to be used as the input to X a program, such as lint, that expects X commands embedded in specially-formatted X comments. X X -Dname=value Define the name as if the programmer X wrote X X #define name value X X at the start of the first file. If X "=value" is not given, a value of "1" X will be used. X X On non-unix systems, all alphabetic text X will be forced to upper-case. X X -E Always return "success" to the operating X system, even if errors were detected. X Note that some fatal errors, such as a X missing #include file, will terminate X CPP, returning "failure" even if the -E X option is given. X Page 2 X cpp C Pre-Processor X X X -Idirectory Add this directory to the list of X directories searched for #include "..." X and #include <...> commands. Note that X there is no space between the "-I" and X the directory string. More than one -I X command is permitted. On non-Unix X systems "directory" is forced to X upper-case. X X -N CPP normally predefines some symbols X defining the target computer and X operating system. If -N is specified, X no symbols will be predefined. If -N -N X is specified, the "always present" X symbols, __LINE__, __FILE__, and X __DATE__ are not defined. X X -Stext CPP normally assumes that the size of X the target computer's basic variable X types is the same as the size of these X types of the host computer. (This can X be overridden when CPP is compiled, X however.) The -S option allows dynamic X respecification of these values. "text" X is a string of numbers, separated by X commas, that specifies correct sizes. X The sizes must be specified in the exact X order: X X char short int long float double X X If you specify the option as "-S*text", X pointers to these types will be X specified. -S* takes one additional X argument for pointer to function (e.g. X int (*)()) X X For example, to specify sizes X appropriate for a PDP-11, you would X write: X X c s i l f d func X -S1,2,2,2,4,8, X -S*2,2,2,2,2,2,2 X X Note that all values must be specified. X X -Uname Undefine the name as if X X #undef name X X were given. On non-Unix systems, "name" X will be forced to upper-case. X Page 3 X cpp C Pre-Processor X X X -Xnumber Enable debugging code. If no value is X given, a value of 1 will be used. (For X maintenence of CPP only.) X X X PRE-DEFINED VARIABLES: X X When CPP begins processing, the following variables will X have been defined (unless the -N option is specified): X X Target computer (as appropriate): X X pdp11, vax, M68000 m68000 m68k X X Target operating system (as appropriate): X X rsx, rt11, vms, unix X X Target compiler (as appropriate): X X decus, vax11c X X The implementor may add definitions to this list. The X default definitions match the definition of the host X computer, operating system, and C compiler. X X The following are always available unless undefined (or X -N was specified twice): X X __FILE__ The input (or #include) file being X compiled (as a quoted string). X X __LINE__ The line number being compiled. X X __DATE__ The date and time of compilation as a X Unix ctime quoted string (the trailing X newline is removed). Thus, X X printf("Bug at line %s,", __LINE__); X printf(" source file %s", __FILE__); X printf(" compiled on %s", __DATE__); X X X DRAFT PROPOSED ANSI STANDARD CONSIDERATIONS: X X The current version of the Draft Proposed Standard X explicitly states that "readers are requested not to X specify or claim conformance to this draft." Readers and X users of Decus CPP should not assume that Decus CPP X conforms to the standard, or that it will conform to the X actual C Language Standard. X X When CPP is itself compiled, many features of the Draft X Proposed Standard that are incompatible with existing X Page 4 X cpp C Pre-Processor X X X preprocessors may be disabled. See the comments in X CPP's source for details. X X The latest version of the Draft Proposed Standard (as X reflected in Decus CPP) is dated November 12, 1984. X X Comments are removed from the input text. The comment X is replaced by a single space character. The -C option X preserves comments, writing them to the output file. X X The '$' character is considered to be a letter. This is X a permitted extension. X X The following new features of C are processed by CPP: X X #elif expression (#else #if) X '\xNNN' (Hexadecimal constant) X '\a' (Ascii BELL) X '\v' (Ascii Vertical Tab) X #if defined NAME 1 if defined, 0 if not X #if defined (NAME) 1 if defined, 0 if not X #if sizeof (basic type) X unary + X 123U, 123LU Unsigned ints and longs. X 12.3L Long double numbers X token#token Token concatenation X #include token Expands to filename X X The Draft Proposed Standard has extended C, adding a X constant string concatenation operator, where X X "foo" "bar" X X is regarded as the single string "foobar". (This does X not affect CPP's processing but does permit a limited X form of macro argument substitution into strings as will X be discussed.) X X The Standard Committee plans to add token concatenation X to #define command lines. One suggested implementation X is as follows: the sequence "Token1#Token2" is treated X as if the programmer wrote "Token1Token2". This could X be used as follows: X X #line 123 X #define ATLINE foo#__LINE__ X X ATLINE would be defined as foo123. X X Note that "Token2" must either have the format of an X identifier or be a string of digits. Thus, the string X X #define ATLINE foo#1x3 X Page 5 X cpp C Pre-Processor X X X generates two tokens: "foo1" and "x3". X X If the tokens T1 and T2 are concatenated into T3, this X implementation operates as follows: X X 1. Expand T1 if it is a macro. X 2. Expand T2 if it is a macro. X 3. Join the tokens, forming T3. X 4. Expand T3 if it is a macro. X X A macro formal parameter will be substituted into a X string or character constant if it is the only component X of that constant: X X #define VECSIZE 123 X #define vprint(name, size) \ X printf("name" "[" "size" "] = {\n") X ... vprint(vector, VECSIZE); X X expands (effectively) to X X vprint("vector[123] = {\n"); X X Note that this will be useful if your C compiler X supports the new string concatenation operation noted X above. As implemented here, if you write X X #define string(arg) "arg" X ... string("foo") ... X X This implementation generates "foo", rather than the X strictly correct ""foo"" (which will probably generate X an error message). This is, strictly speaking, an error X in CPP and may be removed from future releases. X X ERROR MESSAGES: X X Many. CPP prints warning or error messages if you try X to use multiple-byte character constants X (non-transportable) if you #undef a symbol that was not X defined, or if your program has potentially nested X comments. X X AUTHOR: X X Martin Minow X X BUGS: X X The #if expression processor uses signed integers only. X I.e, #if 0xFFFFu < 0 may be TRUE. X END-of-cpp.mem echo x - cpp.h sed 's/^X//' >cpp.h << 'END-of-cpp.h' X X/* X * I n t e r n a l D e f i n i t i o n s f o r C P P X * X * In general, definitions in this file should not be changed. X */ X X#ifndef TRUE X#define TRUE 1 X#define FALSE 0 X#endif X#ifndef EOS X/* X * This is predefined in Decus C X */ X#define EOS '\0' /* End of string */ X#endif X#define EOF_CHAR 0 /* Returned by get() on eof */ X#define NULLST ((char *) NULL) /* Pointer to nowhere (linted) */ X#define DEF_NOARGS (-1) /* #define foo vs #define foo() */ X X/* X * The following may need to change if the host system doesn't use ASCII. X */ X#define DEF_MAGIC 0x1D /* Magic for #defines */ X#define TOK_SEP 0x1E /* Token concatenation delim. */ X#define COM_SEP 0x1F /* Magic comment separator */ X X/* X * Note -- in Ascii, the following will map macro formals onto DEL + the X * C1 control character region (decimal 128 .. (128 + PAR_MAC)) which will X * be ok as long as PAR_MAC is less than 33). Note that the last PAR_MAC X * value is reserved for string substitution. X */ X X#define MAC_PARM 0x7F /* Macro formals start here */ X#if PAR_MAC >= 33 X assertion fails -- PAR_MAC isn't less than 33 X#endif X#define LASTPARM (PAR_MAC - 1) X X/* X * Character type codes. X */ X X#define INV 0 /* Invalid, must be zero */ X#define OP_EOE INV /* End of expression */ X#define DIG 1 /* Digit */ X#define LET 2 /* Identifier start */ X#define FIRST_BINOP OP_ADD X#define OP_ADD 3 X#define OP_SUB 4 X#define OP_MUL 5 X#define OP_DIV 6 X#define OP_MOD 7 X#define OP_ASL 8 X#define OP_ASR 9 X#define OP_AND 10 /* &, not && */ X#define OP_OR 11 /* |, not || */ X#define OP_XOR 12 X#define OP_EQ 13 X#define OP_NE 14 X#define OP_LT 15 X#define OP_LE 16 X#define OP_GE 17 X#define OP_GT 18 X#define OP_ANA 19 /* && */ X#define OP_ORO 20 /* || */ X#define OP_QUE 21 /* ? */ X#define OP_COL 22 /* : */ X#define OP_CMA 23 /* , (relevant?) */ X#define LAST_BINOP OP_CMA /* Last binary operand */ X/* X * The following are unary. X */ X#define FIRST_UNOP OP_PLU /* First Unary operand */ X#define OP_PLU 24 /* + (draft ANSI standard) */ X#define OP_NEG 25 /* - */ X#define OP_COM 26 /* ~ */ X#define OP_NOT 27 /* ! */ X#define LAST_UNOP OP_NOT X#define OP_LPA 28 /* ( */ X#define OP_RPA 29 /* ) */ X#define OP_END 30 /* End of expression marker */ X#define OP_MAX (OP_END + 1) /* Number of operators */ X#define OP_FAIL (OP_END + 1) /* For error returns */ X X/* X * The following are for lexical scanning only. X */ X X#define QUO 65 /* Both flavors of quotation */ X#define DOT 66 /* . might start a number */ X#define SPA 67 /* Space and tab */ X#define BSH 68 /* Just a backslash */ X#define END 69 /* EOF */ X X/* X * These bits are set in ifstack[] X */ X#define WAS_COMPILING 1 /* TRUE if compile set at entry */ X#define ELSE_SEEN 2 /* TRUE when #else processed */ X#define TRUE_SEEN 4 /* TRUE when #if TRUE processed */ X X/* X * Define bits for the basic types and their adjectives X */ X X#define T_CHAR 1 X#define T_INT 2 X#define T_FLOAT 4 X#define T_DOUBLE 8 X#define T_SHORT 16 X#define T_LONG 32 X#define T_SIGNED 64 X#define T_UNSIGNED 128 X#define T_PTR 256 /* Pointer */ X#define T_FPTR 512 /* Pointer to functions */ X X/* X * The DEFBUF structure stores information about #defined X * macros. Note that the defbuf->repl information is always X * in malloc storage. X */ X Xtypedef struct defbuf { X struct defbuf *link; /* Next define in chain */ X char *repl; /* -> replacement */ X int hash; /* Symbol table hash */ X int nargs; /* For define(args) */ X char name[1]; /* #define name */ X} DEFBUF; X X/* X * The FILEINFO structure stores information about open files X * and macros being expanded. X */ X Xtypedef struct fileinfo { X char *bptr; /* Buffer pointer */ X int line; /* for include or macro */ X FILE *fp; /* File if non-null */ X struct fileinfo *parent; /* Link to includer */ X char *filename; /* File/macro name */ X char *progname; /* From #line statement */ X unsigned int unrecur; /* For macro recursion */ X char buffer[1]; /* current input line */ X} FILEINFO; X X/* X * The SIZES structure is used to store the values for #if sizeof X */ X Xtypedef struct sizes { X short bits; /* If this bit is set, */ X short size; /* this is the datum size value */ X short psize; /* this is the pointer size */ X} SIZES; X/* X * nomacarg is a built-in #define on Decus C. X */ X X#ifdef nomacarg X#define cput output /* cput concatenates tokens */ X#else X#if COMMENT_INVISIBLE X#define cput(c) { if (c != TOK_SEP && c != COM_SEP) putchar(c); } X#else X#define cput(c) { if (c != TOK_SEP) putchar(c); } X#endif X#endif X X#ifndef nomacarg X#define streq(s1, s2) (strcmp(s1, s2) == 0) X#endif X X/* X * Error codes. VMS uses system definitions. X * Decus C codes are defined in stdio.h. X * Others are cooked to order. X */ X X#if HOST == SYS_VMS X#include X#include X#define IO_NORMAL (SS$_NORMAL | STS$M_INHIB_MSG) X#define IO_ERROR SS$_ABORT X#endif X/* X * Note: IO_NORMAL and IO_ERROR are defined in the Decus C stdio.h file X */ X#ifndef IO_NORMAL X#define IO_NORMAL 0 X#endif X#ifndef IO_ERROR X#define IO_ERROR 1 X#endif X X/* X * Externs X */ X Xextern int line; /* Current line number */ Xextern int wrongline; /* Force #line to cc pass 1 */ Xextern char type[]; /* Character classifier */ Xextern char token[IDMAX + 1]; /* Current input token */ Xextern int instring; /* TRUE if scanning string */ Xextern int inmacro; /* TRUE if scanning #define */ Xextern int errors; /* Error counter */ Xextern int recursion; /* Macro depth counter */ Xextern char ifstack[BLK_NEST]; /* #if information */ X#define compiling ifstack[0] Xextern char *ifptr; /* -> current ifstack item */ Xextern char *incdir[NINCLUDE]; /* -i directories */ Xextern char **incend; /* -> active end of incdir */ Xextern int cflag; /* -C option (keep comments) */ Xextern int eflag; /* -E option (ignore errors) */ Xextern int nflag; /* -N option (no pre-defines) */ Xextern int rec_recover; /* unwind recursive macros */ Xextern char *preset[]; /* Standard predefined symbols */ Xextern char *magic[]; /* Magic predefined symbols */ Xextern FILEINFO *infile; /* Current input file */ Xextern char work[NWORK + 1]; /* #define scratch */ Xextern char *workp; /* Free space in work */ X#if DEBUG Xextern int debug; /* Debug level */ X#endif Xextern int keepcomments; /* Don't remove comments if set */ Xextern SIZES size_table[]; /* For #if sizeof sizes */ Xextern char *getmem(); /* Get memory or die. */ Xextern DEFBUF *lookid(); /* Look for a #define'd thing */ Xextern DEFBUF *defendel(); /* Symbol table enter/delete */ Xextern char *savestring(); /* Stuff string in malloc mem. */ Xextern char *strcpy(); Xextern char *strcat(); Xextern char *strrchr(); Xextern char *strchr(); Xextern long time(); X/* extern char *sprintf(); /* Lint needs this */ END-of-cpp.h echo x - cppdef.h sed 's/^X//' >cppdef.h << 'END-of-cppdef.h' X/* X * S y s t e m D e p e n d e n t X * D e f i n i t i o n s f o r C P P X * X * Definitions in this file may be edited to configure CPP for particular X * host operating systems and target configurations. X * X * NOTE: cpp assumes it is compiled by a compiler that supports macros X * with arguments. If this is not the case (as for Decus C), #define X * nomacarg -- and provide function equivalents for all macros. X * X * cpp also assumes the host and target implement the Ascii character set. X * If this is not the case, you will have to do some editing here and there. X */ X X/* X * This redundant definition of TRUE and FALSE works around X * a limitation of Decus C. X */ X#ifndef TRUE X#define TRUE 1 X#define FALSE 0 X#endif X X/* X * Define the HOST operating system. This is needed so that X * cpp can use appropriate filename conventions. X */ X#define SYS_UNKNOWN 0 X#define SYS_UNIX 1 X#define SYS_VMS 2 X#define SYS_RSX 3 X#define SYS_RT11 4 X#define SYS_LATTICE 5 X#define SYS_ONYX 6 X#define SYS_68000 7 X#define SYS_GCOS 8 X#define SYS_IBM 9 X#define SYS_OS 10 X#define SYS_TSS 11 X X#ifndef HOST X#ifdef unix X#define HOST SYS_UNIX X#else X#ifdef vms X#define HOST SYS_VMS X#else X#ifdef rsx X#define HOST SYS_RSX X#else X#ifdef rt11 X#define HOST SYS_RT11 X#else X#ifdef dmert X#define HOST SYS_DMERT X#else X#ifdef gcos X#define HOST SYS_GCOS X#else X#ifdef ibm X#define HOST SYS_IBM X#else X#ifdef os X#define HOST SYS_OS X#else X#ifdef tss X#define HOST SYS_TSS X#endif X#endif X#endif X#endif X#endif X#endif X#endif X#endif X#endif X X#ifndef HOST X#define HOST SYS_UNKNOWN X#endif X X/* X * We assume that the target is the same as the host system X */ X#ifndef TARGET X#define TARGET HOST X#endif X X/* X * In order to predefine machine-dependent constants, X * several strings are defined here: X * X * MACHINE defines the target cpu (by name) X * SYSTEM defines the target operating system X * COMPILER defines the target compiler X * X * The above may be #defined as "" if they are not wanted. X * They should not be #defined as NULL. X * X * LINE_PREFIX defines the # output line prefix, if not "line" X * This should be defined as "" if cpp is to replace X * the "standard" C pre-processor. X * X * FILE_LOCAL marks functions which are referenced only in the X * file they reside. Some C compilers allow these X * to be marked "static" even though they are referenced X * by "extern" statements elsewhere. X * X * OK_DOLLAR Should be set TRUE if $ is a valid alphabetic character X * in identifiers (default), or zero if $ is invalid. X * Default is TRUE. X * X * OK_CONCAT Should be set TRUE if # may be used to concatenate X * tokens in macros (per the Ansi Draft Standard) or X * FALSE for old-style # processing (needed if cpp is X * to process assembler source code). X * X * OK_DATE Predefines the compilation date if set TRUE. X * Not permitted by the Nov. 12, 1984 Draft Standard. X * X * S_CHAR etc. Define the sizeof the basic TARGET machine word types. X * By default, sizes are set to the values for the HOST X * computer. If this is inappropriate, see the code in X * cpp3.c for details on what to change. Also, if you X * have a machine where sizeof (signed int) differs from X * sizeof (unsigned int), you will have to edit code and X * tables in cpp3.c (and extend the -S option definition.) X * X * CPP_LIBRARY May be defined if you have a site-specific include directory X * which is to be searched *before* the operating-system X * specific directories. X */ X X#if TARGET == SYS_LATTICE X/* X * We assume the operating system is pcdos for the IBM-PC. X * We also assume the small model (just like the PDP-11) X */ X#define MACHINE "i8086" X#define SYSTEM "pcdos" X#endif X X#if TARGET == SYS_ONYX X#define MACHINE "z8000" X#define SYSTEM "unix" X#endif X X#if TARGET == SYS_VMS X#define MACHINE "vax" X#define SYSTEM "vms" X#define COMPILER "vax11c" X#endif X X#if TARGET == SYS_RSX X#define MACHINE "pdp11" X#define SYSTEM "rsx" X#define COMPILER "decus" X#endif X X#if TARGET == SYS_RT11 X#define MACHINE "pdp11" X#define SYSTEM "rt11" X#define COMPILER "decus" X#endif X X#if TARGET == SYS_68000 X/* X * All three machine designators have been seen in various systems. X * Warning -- compilers differ as to sizeof (int). cpp3 assumes that X * sizeof (int) == 2 X */ X#define MACHINE "M68000", "m68000", "m68k" X#define SYSTEM "unix" X#endif X X#if TARGET == SYS_UNIX X#define SYSTEM "unix" X#ifdef pdp11 X#define MACHINE "pdp11" X#endif X#ifdef vax X#define MACHINE "vax" X#endif X#ifdef u370 X#define MACHINE "u370" X#endif X#ifdef interdata X#define MACHINE "interdata" X#endif X#ifdef u3b X#define MACHINE "u3b" X#endif X#ifdef u3b5 X#define MACHINE "u3b5" X#endif X#ifdef u3b2 X#define MACHINE "u3b2" X#endif X#ifdef u3b20d X#define MACHINE "u3b20d" X#endif X#endif X#endif X X/* X * defaults X */ X X#ifndef MSG_PREFIX X#define MSG_PREFIX "cpp: " X#endif X X#ifndef LINE_PREFIX X#ifdef decus X#define LINE_PREFIX "" X#else X#define LINE_PREFIX "line" X#endif X#endif X X/* X * OLD_PREPROCESSOR forces the definition of OK_DOLLAR, OK_CONCAT, X * COMMENT_INVISIBLE, and STRING_FORMAL to values appropriate for X * an old-style preprocessor. X */ X X#ifndef OLD_PREPROCESSOR X#define OLD_PREPROCESSOR FALSE X#endif X X#if OLD_PREPROCESSOR X#define OK_DOLLAR FALSE X#define OK_CONCAT FALSE X#define COMMENT_INVISIBLE TRUE X#define STRING_FORMAL TRUE X#endif X X/* X * RECURSION_LIMIT may be set to -1 to disable the macro recursion test. X */ X#ifndef RECURSION_LIMIT X#define RECURSION_LIMIT 1000 X#endif X X/* X * BITS_CHAR may be defined to set the number of bits per character. X * it is needed only for multi-byte character constants. X */ X#ifndef BITS_CHAR X#define BITS_CHAR 8 X#endif X X/* X * BIG_ENDIAN is set TRUE on machines (such as the IBM 360 series) X * where 'ab' stores 'a' in the high-bits and 'b' in the low-bits. X * It is set FALSE on machines (such as the PDP-11 and Vax-11) X * where 'ab' stores 'a' in the low-bits and 'b' in the high-bits. X * (Or is it the other way around?) -- Warning: BIG_ENDIAN code is untested. X */ X#ifndef BIG_ENDIAN X#define BIG_ENDIAN FALSE X#endif X X/* X * COMMENT_INVISIBLE may be defined to allow "old-style" comment X * processing, whereby the comment becomes a zero-length token X * delimiter. This permitted tokens to be concatenated in macro X * expansions. This was removed from the Draft Ansi Standard. X */ X#ifndef COMMENT_INVISIBLE X#define COMMENT_INVISIBLE FALSE X#endif X X/* X * STRING_FORMAL may be defined to allow recognition of macro parameters X * anywhere in replacement strings. This was removed from the Draft Ansi X * Standard and a limited recognition capability added. X */ X#ifndef STRING_FORMAL X#define STRING_FORMAL FALSE X#endif X X/* X * OK_DOLLAR enables use of $ as a valid "letter" in identifiers. X * This is a permitted extension to the Ansi Standard and is required X * for e.g., VMS, RSX-11M, etc. It should be set FALSE if cpp is X * used to preprocess assembler source on Unix systems. OLD_PREPROCESSOR X * sets OK_DOLLAR FALSE for that reason. X */ X#ifndef OK_DOLLAR X#define OK_DOLLAR TRUE X#endif X X/* X * OK_CONCAT enables (one possible implementation of) token concatenation. X * If cpp is used to preprocess Unix assembler source, this should be X * set FALSE as the concatenation character, #, is used by the assembler. X */ X#ifndef OK_CONCAT X#define OK_CONCAT TRUE X#endif X X/* X * OK_DATE may be enabled to predefine today's date as a string X * at the start of each compilation. This is apparently not permitted X * by the Draft Ansi Standard. X */ X#ifndef OK_DATE X#define OK_DATE TRUE X#endif X X/* X * Some common definitions. X */ X X#ifndef DEBUG X#define DEBUG FALSE X#endif X X/* X * The following definitions are used to allocate memory for X * work buffers. In general, they should not be modified X * by implementors. X * X * PAR_MAC The maximum number of #define parameters (31 per Standard) X * Note: we need another one for strings. X * IDMAX The longest identifier, 31 per Ansi Standard X * NBUFF Input buffer size X * NWORK Work buffer size -- the longest macro X * must fit here after expansion. X * NEXP The nesting depth of #if expressions X * NINCLUDE The number of directories that may be specified X * on a per-system basis, or by the -I option. X * BLK_NEST The number of nested #if's permitted. X */ X X#define IDMAX 31 X#define PAR_MAC (31 + 1) X#define NBUFF 1024 X#define NWORK 1024 X#define NEXP 128 X#define NINCLUDE 7 X#define NPARMWORK (NWORK * 2) X#define BLK_NEST 32 X X/* X * Some special constants. These may need to be changed if cpp X * is ported to a wierd machine. X * X * NOTE: if cpp is run on a non-ascii machine, ALERT and VT may X * need to be changed. They are used to implement the proposed X * ANSI standard C control characters '\a' and '\v' only. X * DEL is used to tag macro tokens to prevent #define foo foo X * from looping. Note that we don't try to prevent more elaborate X * #define loops from occurring. X */ X X#ifndef ALERT X#define ALERT '\007' /* '\a' is "Bell" */ X#endif X X#ifndef VT X#define VT '\013' /* Vertical Tab CTRL/K */ X#endif X X X#ifndef FILE_LOCAL X#ifdef decus X#define FILE_LOCAL static X#else X#ifdef vax11c X#define FILE_LOCAL static X#else X#define FILE_LOCAL /* Others are global */ X#endif X#endif X#endif X END-of-cppdef.h echo x - cpp2.c sed 's/^X//' >cpp2.c << 'END-of-cpp2.c' X/* X * C P P 2 . C X * X * Process #control lines X * X * Edit history X * 13-Nov-84 MM Split from cpp1.c X */ X X#include X#include X#include "cppdef.h" X#include "cpp.h" X#if HOST == SYS_VMS X/* X * Include the rms stuff. (We can't just include rms.h as it uses the X * VaxC-specific library include syntax that Decus CPP doesn't support. X * By including things by hand, we can CPP ourself.) X */ X#include X#include X#include X#include X#endif X X/* X * Generate (by hand-inspection) a set of unique values for each control X * operator. Note that this is not guaranteed to work for non-Ascii X * machines. CPP won't compile if there are hash conflicts. X */ X X#define L_assert ('a' + ('s' << 1)) X#define L_define ('d' + ('f' << 1)) X#define L_elif ('e' + ('i' << 1)) X#define L_else ('e' + ('s' << 1)) X#define L_endif ('e' + ('d' << 1)) X#define L_ident ('i' + ('e' << 1)) X#define L_if ('i' + (EOS << 1)) X#define L_ifdef ('i' + ('d' << 1)) X#define L_ifndef ('i' + ('n' << 1)) X#define L_include ('i' + ('c' << 1)) X#define L_line ('l' + ('n' << 1)) X#define L_nogood (EOS + (EOS << 1)) /* To catch #i */ X#define L_pragma ('p' + ('a' << 1)) X#define L_sccs ('s' + ('c' << 1)) X#define L_undef ('u' + ('d' << 1)) X#if DEBUG X#define L_debug ('d' + ('b' << 1)) /* #debug */ X#define L_nodebug ('n' + ('d' << 1)) /* #nodebug */ X#endif X Xint Xcontrol(counter) Xint counter; /* Pending newline counter */ X/* X * Process #control lines. Simple commands are processed inline, X * while complex commands have their own subroutines. X * X * The counter is used to force out a newline before #line, and X * #pragma commands. This prevents these commands from ending up at X * the end of the previous line if cpp is invoked with the -C option. X */ X{ X register int c; X register char *tp; X register int hash; X char *ep; X X c = skipws(); X if (c == '\n' || c == EOF_CHAR) X return (counter + 1); X if (!isdigit(c)) X scanid(c); /* Get #word to token[] */ X else { X unget(); /* Hack -- allow #123 as a */ X strcpy(token, "line"); /* synonym for #line 123 */ X } X hash = (token[1] == EOS) ? L_nogood : (token[0] + (token[2] << 1)); X switch (hash) { X case L_assert: tp = "assert"; break; X case L_define: tp = "define"; break; X case L_elif: tp = "elif"; break; X case L_else: tp = "else"; break; X case L_endif: tp = "endif"; break; X case L_ident: tp = "ident"; break; X case L_if: tp = "if"; break; X case L_ifdef: tp = "ifdef"; break; X case L_ifndef: tp = "ifndef"; break; X case L_include: tp = "include"; break; X case L_line: tp = "line"; break; X case L_pragma: tp = "pragma"; break; X case L_sccs: tp = "sccs"; break; X case L_undef: tp = "undef"; break; X#if DEBUG X case L_debug: tp = "debug"; break; X case L_nodebug: tp = "nodebug"; break; X#endif X default: hash = L_nogood; X case L_nogood: tp = ""; break; X } X if (!streq(tp, token)) X hash = L_nogood; X /* X * hash is set to a unique value corresponding to the X * control keyword (or L_nogood if we think it's nonsense). X */ X if (infile->fp == NULL) X cwarn("Control line \"%s\" within macro expansion", token); X if (!compiling) { /* Not compiling now */ X switch (hash) { X case L_if: /* These can't turn */ X case L_ifdef: /* compilation on, but */ X case L_ifndef: /* we must nest #if's */ X if (++ifptr >= &ifstack[BLK_NEST]) X goto if_nest_err; X *ifptr = 0; /* !WAS_COMPILING */ X case L_line: /* Many */ X /* X * Are pragma's always processed? X */ X case L_ident: X case L_sccs: X case L_pragma: /* options */ X case L_include: /* are uninteresting */ X case L_define: /* if we */ X case L_undef: /* aren't */ X case L_assert: /* compiling. */ Xdump_line: skipnl(); /* Ignore rest of line */ X return (counter + 1); X } X } X /* X * Make sure that #line and #pragma are output on a fresh line. X */ X if (counter > 0 && (hash == L_line || hash == L_pragma)) { X putchar('\n'); X counter--; X } X switch (hash) { X case L_line: X /* X * Parse the line to update the line number and "progname" X * field and line number for the next input line. X * Set wrongline to force it out later. X */ X c = skipws(); X workp = work; /* Save name in work */ X while (c != '\n' && c != EOF_CHAR) { X save(c); X c = get(); X } X unget(); X save(EOS); X /* X * Split #line argument into and X * We subtract 1 as we want the number of the next line. X */ X line = atoi(work) - 1; /* Reset line number */ X for (tp = work; isdigit(*tp) || type[*tp] == SPA; tp++) X ; /* Skip over digits */ X if (*tp != EOS) { /* Got a filename, so: */ X if (*tp == '"' && (ep = strrchr(tp + 1, '"')) != NULL) { X tp++; /* Skip over left quote */ X *ep = EOS; /* And ignore right one */ X } X if (infile->progname != NULL) /* Give up the old name */ X free(infile->progname); /* if it's allocated. */ X infile->progname = savestring(tp); X } X wrongline = TRUE; /* Force output later */ X break; X X case L_include: X doinclude(); X break; X X case L_define: X dodefine(); X break; X X case L_undef: X doundef(); X break; X X case L_else: X if (ifptr == &ifstack[0]) X goto nest_err; X else if ((*ifptr & ELSE_SEEN) != 0) X goto else_seen_err; X *ifptr |= ELSE_SEEN; X if ((*ifptr & WAS_COMPILING) != 0) { X if (compiling || (*ifptr & TRUE_SEEN) != 0) X compiling = FALSE; X else { X compiling = TRUE; X } X } X break; X X case L_elif: X if (ifptr == &ifstack[0]) X goto nest_err; X else if ((*ifptr & ELSE_SEEN) != 0) { Xelse_seen_err: cerror("#%s may not follow #else", token); X goto dump_line; X } X if ((*ifptr & (WAS_COMPILING | TRUE_SEEN)) != WAS_COMPILING) { X compiling = FALSE; /* Done compiling stuff */ X goto dump_line; /* Skip this clause */ X } X doif(L_if); X break; X X case L_if: X case L_ifdef: X case L_ifndef: X if (++ifptr >= &ifstack[BLK_NEST]) Xif_nest_err: cfatal("Too many nested #%s statements", token); X *ifptr = WAS_COMPILING; X doif(hash); X break; X X case L_endif: X if (ifptr == &ifstack[0]) { Xnest_err: cerror("#%s must be in an #if", token); X goto dump_line; X } X if (!compiling && (*ifptr & WAS_COMPILING) != 0) X wrongline = TRUE; X compiling = ((*ifptr & WAS_COMPILING) != 0); X --ifptr; X break; X X case L_assert: X if (eval() == 0) X cerror("Preprocessor assertion failure", NULLST); X break; X X case L_ident: X case L_sccs: X goto dump_line; X break; X X case L_pragma: X /* X * #pragma is provided to pass "options" to later X * passes of the compiler. cpp doesn't have any yet. X */ X printf("#pragma "); X while ((c = get()) != '\n' && c != EOF_CHAR) X cput(c); X unget(); X break; X X#if DEBUG X case L_debug: X if (debug == 0) X dumpdef("debug set on"); X debug++; X break; X X case L_nodebug: X debug--; X break; X#endif X X default: X /* X * Undefined #control keyword. X * Note: the correct behavior may be to warn and X * pass the line to a subsequent compiler pass. X * This would allow #asm or similar extensions. X */ X cerror("Illegal # command \"%s\"", token); X break; X } X if (hash != L_include) { X#if OLD_PREPROCESSOR || !VERBOSE X /* X * Ignore the rest of the #control line so you can write X * #if foo X * #endif foo X */ X goto dump_line; /* Take common exit */ X#else X if (skipws() != '\n') { X cwarn("Unexpected text in #control line ignored", NULLST); X skipnl(); X } X#endif X } X return (counter + 1); X} X XFILE_LOCAL Xdoif(hash) Xint hash; X/* X * Process an #if, #ifdef, or #ifndef. The latter two are straightforward, X * while #if needs a subroutine of its own to evaluate the expression. X * X * doif() is called only if compiling is TRUE. If false, compilation X * is always supressed, so we don't need to evaluate anything. This X * supresses unnecessary warnings. X */ X{ X register int c; X register int found; X X if ((c = skipws()) == '\n' || c == EOF_CHAR) { X unget(); X goto badif; X } X if (hash == L_if) { X unget(); X found = (eval() != 0); /* Evaluate expr, != 0 is TRUE */ X hash = L_ifdef; /* #if is now like #ifdef */ X } X else { X if (type[c] != LET) /* Next non-blank isn't letter */ X goto badif; /* ... is an error */ X found = (lookid(c) != NULL); /* Look for it in symbol table */ X } X if (found == (hash == L_ifdef)) { X compiling = TRUE; X *ifptr |= TRUE_SEEN; X } X else { X compiling = FALSE; X } X return; X Xbadif: cerror("#if, #ifdef, or #ifndef without an argument", NULLST); X#if !OLD_PREPROCESSOR X skipnl(); /* Prevent an extra */ X unget(); /* Error message */ X#endif X return; X} X XFILE_LOCAL Xdoinclude() X/* X * Process the #include control line. X * There are three variations: X * #include "file" search somewhere relative to the X * current source file, if not found, X * treat as #include . X * #include Search in an implementation-dependent X * list of places. X * #include token Expand the token, it must be one of X * "file" or , process as such. X * X * Note: the November 12 draft forbids '>' in the #include format. X * This restriction is unnecessary and not implemented. X */ X{ X register int c; X register int delim; X#if HOST == SYS_VMS X char def_filename[NAM$C_MAXRSS + 1]; X#endif X X delim = macroid(skipws()); X if (delim != '<' && delim != '"') X goto incerr; X if (delim == '<') X delim = '>'; X workp = work; X instring = TRUE; /* Accept all characters */ X while ((c = get()) != '\n' && c != delim && c != EOF_CHAR) X save(c); /* Put it away. */ X skipnl(); X /* X * The draft is unclear if the following should be done. X */ X X while (--workp >= work && (type[*workp] == SPA)) X ; /* Trim blanks from filename */ X X/* X * if (*workp != delim) X * goto incerr; X */ X *(workp + 1) = EOS; /* Terminate filename */ X instring = FALSE; X#if HOST == SYS_VMS X /* X * Assume the default .h filetype. X */ X if (!vmsparse(work, ".H", def_filename)) { X perror(work); /* Oops. */ X goto incerr; X } X else if (openinclude(def_filename, (delim == '"'))) X return; X#else X if (openinclude(work, (delim == '"'))) X return; X#endif X /* X * No sense continuing if #include file isn't there. X */ X cfatal("Cannot open include file \"%s\"", work); X Xincerr: cerror("#include syntax error", NULLST); X return; X} X XFILE_LOCAL int Xopeninclude(filename, searchlocal) Xchar *filename; /* Input file name */ Xint searchlocal; /* TRUE if #include "file" */ X/* X * Actually open an include file. This routine is only called from X * doinclude() above, but was written as a separate subroutine for X * programmer convenience. It searches the list of directories X * and actually opens the file, linking it into the list of X * active files. Returns TRUE if the file was opened, FALSE X * if openinclude() fails. No error message is printed. X */ X{ X register char **incptr; X#if HOST == SYS_VMS X#if NWORK < (NAM$C_MAXRSS + 1) X << error, NWORK isn't greater than NAM$C_MAXRSS >> X#endif X#endif X char tmpname[NWORK]; /* Filename work area */ X X if (searchlocal) { X /* X * Look in local directory first X */ X#if HOST == SYS_UNIX X /* X * Try to open filename relative to the directory of the current X * source file (as opposed to the current directory). (ARF, SCK). X */ X if (filename[0] != '/' X && hasdirectory(infile->filename, tmpname)) X strcat(tmpname, filename); X else { X strcpy(tmpname, filename); X } X#else X if (!hasdirectory(filename, tmpname) X && hasdirectory(infile->filename, tmpname)) X strcat(tmpname, filename); X else { X strcpy(tmpname, filename); X } X#endif X if (openfile(tmpname)) X return (TRUE); X } X /* X * Look in any directories specified by -I command line X * arguments, then in the builtin search list. X */ X for (incptr = incdir; incptr < incend; incptr++) { X if (strlen(*incptr) + strlen(filename) >= (NWORK - 1)) X cfatal("Filename work buffer overflow", NULLST); X else { X#if HOST == SYS_UNIX X if (filename[0] == '/') X strcpy(tmpname, filename); X else { X sprintf(tmpname, "%s/%s", *incptr, filename); X } X#else X if (!hasdirectory(filename, tmpname)) X sprintf(tmpname, "%s%s", *incptr, filename); X#endif X if (openfile(tmpname)) X return (TRUE); X } X } X return (FALSE); X} X XFILE_LOCAL int Xhasdirectory(source, result) Xchar *source; /* Directory to examine */ Xchar *result; /* Put directory stuff here */ X/* X * If a device or directory is found in the source filename string, the X * node/device/directory part of the string is copied to result and X * hasdirectory returns TRUE. Else, nothing is copied and it returns FALSE. X */ X{ X#if HOST == SYS_UNIX X register char *tp; X X if ((tp = strrchr(source, '/')) == NULL) X return (FALSE); X else { X strncpy(result, source, tp - source + 1); X result[tp - source + 1] = EOS; X return (TRUE); X } X#else X#if HOST == SYS_VMS X if (vmsparse(source, NULLST, result) X && result[0] != EOS) X return (TRUE); X else { X return (FALSE); X } X#else X /* X * Random DEC operating system (RSX, RT11, RSTS/E) X */ X register char *tp; X X if ((tp = strrchr(source, ']')) == NULL X && (tp = strrchr(source, ':')) == NULL) X return (FALSE); X else { X strncpy(result, source, tp - source + 1); X result[tp - source + 1] = EOS; X return (TRUE); X } X#endif X#endif X} X X#if HOST == SYS_VMS X X/* X * EXP_DEV is set if a device was specified, EXP_DIR if a directory X * is specified. (Both set indicate a file-logical, but EXP_DEV X * would be set by itself if you are reading, say, SYS$INPUT:) X */ X#define DEVDIR (NAM$M_EXP_DEV | NAM$M_EXP_DIR) X XFILE_LOCAL int Xvmsparse(source, defstring, result) Xchar *source; Xchar *defstring; /* non-NULL -> default string. */ Xchar *result; /* Size is at least NAM$C_MAXRSS + 1 */ X/* X * Parse the source string, applying the default (properly, using X * the system parse routine), storing it in result. X * TRUE if it parsed, FALSE on error. X * X * If defstring is NULL, there are no defaults and result gets X * (just) the node::[directory] part of the string (possibly "") X */ X{ X struct FAB fab = cc$rms_fab; /* File access block */ X struct NAM nam = cc$rms_nam; /* File name block */ X char fullname[NAM$C_MAXRSS + 1]; X register char *rp; /* Result pointer */ X X fab.fab$l_nam = &nam; /* fab -> nam */ X fab.fab$l_fna = source; /* Source filename */ X fab.fab$b_fns = strlen(source); /* Size of source */ X fab.fab$l_dna = defstring; /* Default string */ X if (defstring != NULLST) X fab.fab$b_dns = strlen(defstring); /* Size of default */ X nam.nam$l_esa = fullname; /* Expanded filename */ X nam.nam$b_ess = NAM$C_MAXRSS; /* Expanded name size */ X if (sys$parse(&fab) == RMS$_NORMAL) { /* Parse away */ X fullname[nam.nam$b_esl] = EOS; /* Terminate string */ X result[0] = EOS; /* Just in case */ X rp = &result[0]; X /* X * Remove stuff added implicitly, accepting node names and X * dev:[directory] strings (but not process-permanent files). X */ X if ((nam.nam$l_fnb & NAM$M_PPF) == 0) { X if ((nam.nam$l_fnb & NAM$M_NODE) != 0) { X strncpy(result, nam.nam$l_node, nam.nam$b_node); X rp += nam.nam$b_node; X *rp = EOS; X } X if ((nam.nam$l_fnb & DEVDIR) == DEVDIR) { X strncpy(rp, nam.nam$l_dev, nam.nam$b_dev + nam.nam$b_dir); X rp += nam.nam$b_dev + nam.nam$b_dir; X *rp = EOS; X } X } X if (defstring != NULLST) { X strncpy(rp, nam.nam$l_name, nam.nam$b_name + nam.nam$b_type); X rp += nam.nam$b_name + nam.nam$b_type; X *rp = EOS; X if ((nam.nam$l_fnb & NAM$M_EXP_VER) != 0) { X strncpy(rp, nam.nam$l_ver, nam.nam$b_ver); X rp[nam.nam$b_ver] = EOS; X } X } X return (TRUE); X } X return (FALSE); X} X#endif X END-of-cpp2.c exit slashem-0.0.7E7F3/sys/unix/Install.unx0000664000076400007640000003555210545462317015631 0ustar aliali Instructions for installing NetHack 3.4 on a UNIX system ======================================= 0. Read this entire file before starting, and come back to the Notes below if you have any problems. If you are trying to use X11, also read all of win/X11/Install.X11, or read win/Qt/Install.Qt if you are using Qt or KDE under X11. For help in controlling and running the game after it is installed, see the '?' command within the game and doc/Guidebook (non-installers want to know about those things too). 1. Make sure all the NetHack files are in the appropriate directory structure. You should have a main directory with subdirectories dat, doc, include, src, util, sys/share, sys/unix, win/tty, win/X11, and win/Qt. You may have other subdirectories under sys and win, but they will not affect compilation for a UNIX system. If you do not follow this structure, the Makefiles will not function properly. The .c files for the main program belong in src, those for utility programs in util, and UNIX-specific ones in sys/unix. All the .h files belong in include, the documentation in doc, and assorted data files in dat. Some UNIX versions may also be interested in sys/share's random.c or its lex/yacc output, as explained in note 11. (A more detailed explanation of the directory structure may be found 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.) 3. Go to the include subdirectory and edit config.h according to the comments to match your system and desired set of features. Similarly edit unixconf.h. Please see the "Notes:" section, below, for some configuration hints for particular systems. 4. If you want to, look through system.h. This file attempts to match the types for system calls and library routines with various flavors of operating systems. Leaving this file alone is unlikely to cause worse problems than lint errors, but it's worth checking if you get compile errors, especially if you have an unusual system. 5. Go to the src subdirectory and look at the top of topten.c. You may want to change the definitions of PERSMAX and PERS_IS_UID here to get different behavior from the high score list. 6. Edit the top sections of the src and util Makefiles. (If you are doing a full recompile, or if you got your files from someplace besides the official distribution, type 'touch makedefs.c' to make sure certain files (onames.h, pm.h) get remade instead of relying on the potentially troublesome timestamps.) Then type 'make' in src and go get a cup of coffee or take a nap, depending on the speed of your system. You should now have created the game executable. 7. Go back to the top directory and edit that Makefile, explaining where you want everything to be installed. Make sure that you follow the comments about setting GAMEDIR -- the installation process will wipe out the contents of the directory you point it at, under the assumption that it's debris from an old version of NetHack. If this is not the case, you'll want to install somewhere else, or comment out the rm under the install target. The Makefile assumes you want to run NetHack setuid 'games' to cut down on possible tampering; it's fairly straightforward to comment out the appropriate chmod if you don't want that, or to change any of the rest of the procedure. (Note that if you don't want to run NetHack either setuid or setgid, and people in more than one group will be playing it, you'll need to go back and set FCMASK to 0666 in unixconf.h and let everybody fiddle with the files NetHack creates.) If the tbl, nroff or col commands are not available on your system, edit the doc/Makefile and change the GUIDECMD as directed. Type 'make all' from the top directory to set up all the auxiliary files the main executable will use. Then become root if necessary and type 'make install'. Everything should now be set. 8. Read doc/recover.man or doc/recover.txt to learn how to use the recover program. The recover program can be used in case of a crash to recover a game that was in progress. The recover command is installed in the GAMEDIR by default. 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 version yourself, it should be safe to use 'make update' as long as you did not add, delete, or reorder monsters or objects and you did not change the format of saved level files. If you did any of these things, you should also remove any saved games and bones levels. (Trying to use such files often produces amusing but useless confusions on the game's part.) 3. If you insisted on doing the final installation by hand, you probably forgot to make a save directory. If you don't go back and do this, you won't be able to save games. 4. If you get unexplained deaths by trickery, you are probably running NetHack on a bunch of workstations, but you have overlooked the NETWORK definition in unixconf.h that is necessary in that configuration. 5. If spurious characters appear on the screen while throwing, kicking, zapping, etc., it is likely that you have linked the source to the wrong library or mistakenly defined/undefined TERMINFO. A number of systems, such as Xenix, support both the termcap and terminfo terminal capability libraries. In such cases, the TERMINFO definition in unixconf.h and the WINTTYLIB definition in the source Makefile must correspond. If your terminal library does not provide suitable delays, NetHack will try to fake its own if you set the nonull option. 6. Since NetHack overflows the stock C preprocessors for AT&T 3b1 and 3b2 systems ("too many defines"), we are including an alternate preprocessor to allow these folks to compile. This is the DECUS cpp by Martin Minow, slightly modified by Kevin Darcy to use larger buffers, be less verbose, and handle strange constructs in AT&T's include files. To use this preprocessor, unpack the cpp* files found in sys/unix into some handy directory (util will do). For the AT&T machines mentioned above, nothing needs to be configured; you should get a working cpp by merely typing "make -f makefile.txt". To get your compiler to use the new cpp, you will have to add to CFLAGS in src/Makefile and util/Makefile. If you put the cpp files in /foo/bar/util, add "-B/foo/bar/util/ -tp" for a 3b1 or "-Yp,/foo/bar/util" for a 3b2. For any other machine whose preprocessor can't handle the NetHack source, you'll have to play it by ear. The preprocessor has many esoteric configuration options, but most probably you will only need to change the flags in makefile.txt, and then refer to your compiler's documentation to find the appropriate CFLAGS for the NetHack Makefiles. (The SunOS flag, for instance, would be "-Qpath /foo/bar/util", although the native cpp has no trouble with NetHack. So much for standardization.) 7. If you are trying to compile NetHack on an AT&T 3B that is running an OS earlier than SVR3, you are likely to have problems with overflowing symbol tables. This can be worked around by editing the source Makefile to make the Sys.3B2 target work more like the SysV-AT target, adding -DDUMB to CFLAGS and DUMB.Setup to the Sys.3B2 dependency line. The compiler provided with later versions of the OS has a large enough symbol table that it does not need this workaround. 8. If NetHack seems to compile fine, starts up, allows you to pick a character, and then hangs indefinitely, gets a segmentation fault, or traps you in a single room on the first level, you might try changing the schar and uchar definitions in config.h to short ints. This problem is known to occur on the AT&T 3B series, Silicon Graphics Irises, and IBM systems (PC/RT & RS/6000) running AIX, and may occur on other computers as well. This problem is really most likely caused by having a non-__STDC__ compiler with char's unsigned by default. Since some such compilers don't understand the new "signed" keyword, and others don't have signed characters to use (the 3B2 line falls into this category), "signed" is #ifdefed away for them. If you are sure your compiler can deal with it, you can add your compiler to the __HC__ case in tradstdc.h. Alternatively, if the compiler supports a command line switch for setting the default char type to signed, you could try setting it in the Makefiles. The appropriate switch for SGI Irises with MIPS C compiler is "-signed" and for RS/6000's with standard cc "-qchars=signed". (SGI machines running IRIX 4.0.x have a compiler close enough to standard to suit NetHack, so you may merely use the suggested flags in the Makefiles.) Note that at least RS/6000's seem to like changing the default to signed better but there is also a problem: The lexers created by the standard lex program in AIX may come out faulty when this switch is used (known to happen at least in AIX 3.1.3), so you may have to use an alternative, like flex, which is available at major archive sites (see notes 10 and 11). By AIX 3.2.5, this whole problem should be taken care of automatically (but AIX_31 should still be defined in unixconf.h for other reasons). 9. Under SCO UNIX, you may have all sorts of complaints about include/obj.h. Go to the file and uncomment the marked line, working around the fact that SCO's system include files preempt a major NetHack structure name. Also, there are difficulties with SCO's cc that thus far have been solved only by changing compilers; one report says gcc-NetHack works, and another says rcc-NetHack can be made to work by defining NOTSTDC, applying note 8, and compiling with -tinfo and -xenix. The cc problems are old enough that a new, working version may have been released by this time. 10. Xenix/286's lex generates a faulty lexical analyser from lev_comp.l. The beta-release of flex 2.3 (available from uunet, osu-cis, prep.ai.mit.edu, etc.) can be used to generate the lexer. The only change to flex is to change "#define yyleng (yy_cp - yy_bp)" to "#define yyleng (int)(yy_cp - yy_bp)" in flex.skel. Flex is not needed with Xenix/386, as its lex generates a proper lexical analyser. [Xenix instructions by J.T. Conklin] 11. If your system does not have a lex/yacc or flex/bison combination capable of producing the dungeon and level compilers, lex and yacc output from one of our development systems can be found in sys/share. Unfortunately, this output is less portable than the rest of the code, as it contains skeleton parsing code provided by the specific vendor who has no particular incentive to make such skeletons portable, but the output works on most systems. To try it on yours, copy dgn_comp.h and lev_comp.h to include and dgn_lex.c, dgn_yacc.c, lev_lex.c, and lev_yacc.c to util. 12. Yes, Virginia, you compile NetHack for a NeXT as if it ran UNIX instead of Mach. Just tell NetHack you're a BSD system (Mach is extremely close to BSD UNIX for traditional system calls, so this is also a likely thing to try for any other programs you want to compile). If you get errors when starting nethack warning that "Setuid execution is not allowed", you might want to re-install using the setgid option instead (see Note 7 above, and the setgid comment in the toplevel Makefile). 13. If you are using Solaris 2.x (aka SunOS 5.x) you shouldn't have to do any system configuration -- this is the default. In case it is messed up, follow these instructions. Solaris is basically a SVR4 system, not a BSD system. Therefore, you configure config.h and unixconf.h as per a SVR4 system: config.h: UNIX, TTY_GRAPHICS unixconf.h: SYSV, SVR4, TERMINFO, POSIX_JOB_CONTROL, POSIX_TYPES X11_GRAPHICS does work. Do not define OPENWINBUG. You may safely define NETWORK, TEXTCOLOR if desired. Other #defines in these files may be defined too, as needed. Just make sure that the set mentioned here are not misdefined, or your compile will fail (do _not_ define BSD or SUNOS4). Unless you are using gzip you will probably want to define COMPRESS to be "/usr/bin/compress". When compiling, make sure that you use the ANSI C SVR4 compatible compiler, /usr/bin/cc, or gcc, but _not_ ucbcc. The lattermost will not work. After this, you should get a clean compile. Also, it is recommended that you use FLEX instead of the standard lex bundled with Solaris 2.x (even if that last one should work ;-). 14. If your machine is a 286, 386, or 486 running an appropriate OS, you may wish to use the console speaker driver included in sys/unix/snd86unx.shr. This will allow audible music to be played on your console speaker in certain appropriate game situations. The only modification to the main-line code needed to enable use of the driver is defining UNIX386MUSIC or VPIX_MUSIC in unixconf.h. 15. If you are trying to cross-compile for another system, there is some support in the src and util Makefiles, but there are still other complications. It may well be best to make another copy of util, util2, to compile target copies of makedefs, lev_comp, and recover (duplicating the cross-compilation settings from the src Makefile) without disturbing the main build. You can use the host makedefs for everything but "makedefs -v", which creates include/date.h, which provides various sanity-checking values for making sure files read by NetHack at run-time are compatible. These values depend on the endianness of your processor, its type sizes, and its compiler's idea of struct packing. Your host and target computers may disagree on these things, so you'll need to build a target version of makedefs, run "makedefs -v" on your target, and bring the resulting date.h back for the builds on the host. (Making sure the host makedefs doesn't decide it needs to overwrite it for you. :-) You also need a target version of lev_comp, and to provide it with all the dat/*.des files, and copy all the resulting *.lev files back for packaging on the host. For recover, you just want the target binary to install on the target. slashem-0.0.7E7F3/sys/unix/cpp2.shr0000664000076400007640000015050110545462317015041 0ustar aliali# This is a shell archive. Save it in a file, remove anything before # this line, and then unpack it by entering "sh file". Note, it may # create directories; files and directories will be owned by you and # have default permissions. # # This archive contains: # # cpp1.c # cpp3.c # cpp4.c # echo x - cpp1.c sed 's/^X//' >cpp1.c << 'END-of-cpp1.c' X/* X * CPP main program. X * X * Edit history X * 21-May-84 MM "Field test" release X * 23-May-84 MM Some minor hacks. X * 30-May-84 ARF Didn't get enough memory for __DATE__ X * Added code to read stdin if no input X * files are provided. X * 29-Jun-84 MM Added ARF's suggestions, Unixifying cpp. X * 11-Jul-84 MM "Official" first release (that's what I thought!) X * 22-Jul-84 MM/ARF/SCK Fixed line number bugs, added cpp recognition X * of #line, fixed problems with #include. X * 23-Jul-84 MM More (minor) include hacking, some documentation. X * Also, redid cpp's #include files X * 25-Jul-84 MM #line filename isn't used for #include searchlist X * #line format is X * 25-Jul-84 ARF/MM Various bugs, mostly serious. Removed homemade doprint X * 01-Aug-84 MM Fixed recursion bug, remove extra newlines and X * leading whitespace from cpp output. X * 02-Aug-84 MM Hacked (i.e. optimized) out blank lines and unneeded X * whitespace in general. Cleaned up unget()'s. X * 03-Aug-84 Keie Several bug fixes from Ed Keizer, Vrije Universitet. X * -- corrected arg. count in -D and pre-defined X * macros. Also, allow \n inside macro actual parameter X * lists. X * 06-Aug-84 MM If debugging, dump the preset vector at startup. X * 12-Aug-84 MM/SCK Some small changes from Sam Kendall X * 15-Aug-84 Keie/MM cerror, cwarn, etc. take a single string arg. X * cierror, etc. take a single int. arg. X * changed LINE_PREFIX slightly so it can be X * changed in the makefile. X * 31-Aug-84 MM USENET net.sources release. X * 7-Sep-84 SCH/ado Lint complaints X * 10-Sep-84 Keie Char's can't be signed in some implementations X * 11-Sep-84 ado Added -C flag, pathological line number fix X * 13-Sep-84 ado Added -E flag (does nothing) and "-" file for stdin. X * 14-Sep-84 MM Allow # 123 as a synonym for #line 123 X * 19-Sep-84 MM scanid always reads to token, make sure #line is X * written to a new line, even if -C switch given. X * Also, cpp - - reads stdin, writes stdout. X * 03-Oct-84 ado/MM Several changes to line counting and keepcomments X * stuff. Also a rewritten control() hasher -- much X * simpler and no less "perfect". Note also changes X * in cpp3.c to fix numeric scanning. X * 04-Oct-84 MM Added recognition of macro formal parameters if X * they are the only thing in a string, per the X * draft standard. X * 08-Oct-84 MM One more attack on scannumber X * 15-Oct-84 MM/ado Added -N to disable predefined symbols. Fixed X * linecount if COMMENT_INVISIBLE enabled. X * 22-Oct-84 MM Don't evaluate the #if/#ifdef argument if X * compilation is supressed. This prevents X * unnecessary error messages in sequences such as X * #ifdef FOO -- undefined X * #if FOO == 10 -- shouldn't print warning X * 25-Oct-84 MM Fixed bug in false ifdef supression. On vms, X * #include should open foo.h -- this duplicates X * the behavior of Vax-C X * 31-Oct-84 ado/MM Parametized $ in indentifiers. Added a better X * token concatenator and took out the trial X * concatenation code. Also improved #ifdef code X * and cleaned up the macro recursion tester. X * 2-Nov-84 MM/ado Some bug fixes in token concatenation, also X * a variety of minor (uninteresting) hacks. X * 6-Nov-84 MM Happy Birthday. Broke into 4 files and added X * #if sizeof (basic_types) X * 9-Nov-84 MM Added -S* for pointer type sizes X * 13-Nov-84 MM Split cpp1.c, added vms defaulting X * 23-Nov-84 MM/ado -E supresses error exit, added CPP_INCLUDE, X * fixed strncpy bug. X * 3-Dec-84 ado/MM Added OLD_PREPROCESSOR X * 7-Dec-84 MM Stuff in Nov 12 Draft Standard X * 17-Dec-84 george Fixed problems with recursive macros X * 17-Dec-84 MM Yet another attack on #if's (f/t)level removed. X * 07-Jan-85 ado Init defines before doing command line options X * so -Uunix works. X */ X X/*)BUILD X $(PROGRAM) = cpp X $(FILES) = { cpp1 cpp2 cpp3 cpp4 cpp5 cpp6 } X $(INCLUDE) = { cppdef.h cpp.h } X $(STACK) = 2000 X $(TKBOPTIONS) = { X STACK = 2000 X } X*/ X X#ifdef DOCUMENTATION X Xtitle cpp C Pre-Processor Xindex C pre-processor X Xsynopsis X .s.nf X cpp [-options] [infile [outfile]] X .s.f Xdescription X X CPP reads a C source file, expands macros and include X files, and writes an input file for the C compiler. X If no file arguments are given, CPP reads from stdin X and writes to stdout. If one file argument is given, X it will define the input file, while two file arguments X define both input and output files. The file name "-" X is a synonym for stdin or stdout as appropriate. X X The following options are supported. Options may X be given in either case. X .lm +16 X .p -16 X -C If set, source-file comments are written X to the output file. This allows the output of CPP to be X used as the input to a program, such as lint, that expects X commands embedded in specially-formatted comments. X .p -16 X -Dname=value Define the name as if the programmer wrote X X #define name value X X at the start of the first file. If "=value" is not X given, a value of "1" will be used. X X On non-unix systems, all alphabetic text will be forced X to upper-case. X .p -16 X -E Always return "success" to the operating X system, even if errors were detected. Note that some fatal X errors, such as a missing #include file, will terminate X CPP, returning "failure" even if the -E option is given. X .p -16 X -Idirectory Add this directory to the list of X directories searched for #include "..." and #include <...> X commands. Note that there is no space between the X "-I" and the directory string. More than one -I command X is permitted. On non-Unix systems "directory" is forced X to upper-case. X .p -16 X -N CPP normally predefines some symbols defining X the target computer and operating system. If -N is specified, X no symbols will be predefined. If -N -N is specified, the X "always present" symbols, __LINE__, __FILE__, and __DATE__ X are not defined. X .p -16 X -Stext CPP normally assumes that the size of X the target computer's basic variable types is the same as the size X of these types of the host computer. (This can be overridden X when CPP is compiled, however.) The -S option allows dynamic X respecification of these values. "text" is a string of X numbers, separated by commas, that specifies correct sizes. X The sizes must be specified in the exact order: X X char short int long float double X X If you specify the option as "-S*text", pointers to these X types will be specified. -S* takes one additional argument X for pointer to function (e.g. int (*)()) X X For example, to specify sizes appropriate for a PDP-11, X you would write: X X c s i l f d func X -S1,2,2,2,4,8, X -S*2,2,2,2,2,2,2 X X Note that all values must be specified. X .p -16 X -Uname Undefine the name as if X X #undef name X X were given. On non-Unix systems, "name" will be forced to X upper-case. X .p -16 X -Xnumber Enable debugging code. If no value is X given, a value of 1 will be used. (For maintenence of X CPP only.) X .s.lm -16 X XPre-Defined Variables X X When CPP begins processing, the following variables will X have been defined (unless the -N option is specified): X .s X Target computer (as appropriate): X .s X pdp11, vax, M68000 m68000 m68k X .s X Target operating system (as appropriate): X .s X rsx, rt11, vms, unix X .s X Target compiler (as appropriate): X .s X decus, vax11c X .s X The implementor may add definitions to this list. X The default definitions match the definition of the X host computer, operating system, and C compiler. X .s X The following are always available unless undefined (or X -N was specified twice): X .lm +16 X .p -12 X __FILE__ The input (or #include) file being compiled X (as a quoted string). X .p -12 X __LINE__ The line number being compiled. X .p -12 X __DATE__ The date and time of compilation as X a Unix ctime quoted string (the trailing newline is removed). X Thus, X .s X printf("Bug at line %s,", __LINE__); X printf(" source file %s", __FILE__); X printf(" compiled on %s", __DATE__); X .s.lm -16 X XDraft Proposed Ansi Standard Considerations X X The current version of the Draft Proposed Standard X explicitly states that "readers are requested not to specify X or claim conformance to this draft." Readers and users X of Decus CPP should not assume that Decus CPP conforms X to the standard, or that it will conform to the actual X C Language Standard. X X When CPP is itself compiled, many features of the Draft X Proposed Standard that are incompatible with existing X preprocessors may be disabled. See the comments in CPP's X source for details. X X The latest version of the Draft Proposed Standard (as reflected X in Decus CPP) is dated November 12, 1984. X X Comments are removed from the input text. The comment X is replaced by a single space character. The -C option X preserves comments, writing them to the output file. X X The '$' character is considered to be a letter. This is X a permitted extension. X X The following new features of C are processed by CPP: X .s.comment Note: significant spaces, not tabs, .br quotes #if, #elif X .br;####_#elif expression (_#else _#if) X .br;####'_\xNNN' (Hexadecimal constant) X .br;####'_\a' (Ascii BELL) X .br;####'_\v' (Ascii Vertical Tab) X .br;####_#if defined NAME 1 if defined, 0 if not X .br;####_#if defined (NAME) 1 if defined, 0 if not X .br;####_#if sizeof (basic type) X .br;####unary + X .br;####123U, 123LU Unsigned ints and longs. X .br;####12.3L Long double numbers X .br;####token_#token Token concatenation X .br;####_#include token Expands to filename X X The Draft Proposed Standard has extended C, adding a constant X string concatenation operator, where X X "foo" "bar" X X is regarded as the single string "foobar". (This does not X affect CPP's processing but does permit a limited form of X macro argument substitution into strings as will be discussed.) X X The Standard Committee plans to add token concatenation X to #define command lines. One suggested implementation X is as follows: the sequence "Token1#Token2" is treated X as if the programmer wrote "Token1Token2". This could X be used as follows: X X #line 123 X #define ATLINE foo#__LINE__ X X ATLINE would be defined as foo123. X X Note that "Token2" must either have the format of an X identifier or be a string of digits. Thus, the string X X #define ATLINE foo#1x3 X X generates two tokens: "foo1" and "x3". X X If the tokens T1 and T2 are concatenated into T3, X this implementation operates as follows: X X 1. Expand T1 if it is a macro. X 2. Expand T2 if it is a macro. X 3. Join the tokens, forming T3. X 4. Expand T3 if it is a macro. X X A macro formal parameter will be substituted into a string X or character constant if it is the only component of that X constant: X X #define VECSIZE 123 X #define vprint(name, size) \ X printf("name" "[" "size" "] = {\n") X ... vprint(vector, VECSIZE); X X expands (effectively) to X X vprint("vector[123] = {\n"); X X Note that this will be useful if your C compiler supports X the new string concatenation operation noted above. X As implemented here, if you write X X #define string(arg) "arg" X ... string("foo") ... X X This implementation generates "foo", rather than the strictly X correct ""foo"" (which will probably generate an error message). X This is, strictly speaking, an error in CPP and may be removed X from future releases. X Xerror messages X X Many. CPP prints warning or error messages if you try to X use multiple-byte character constants (non-transportable) X if you #undef a symbol that was not defined, or if your X program has potentially nested comments. X Xauthor X X Martin Minow X Xbugs X X The #if expression processor uses signed integers only. X I.e, #if 0xFFFFu < 0 may be TRUE. X X#endif X X#include X#include X#include "cppdef.h" X#include "cpp.h" X X/* X * Commonly used global variables: X * line is the current input line number. X * wrongline is set in many places when the actual output X * line is out of sync with the numbering, e.g, X * when expanding a macro with an embedded newline. X * X * token holds the last identifier scanned (which might X * be a candidate for macro expansion). X * errors is the running cpp error counter. X * infile is the head of a linked list of input files (extended by X * #include and macros being expanded). infile always points X * to the current file/macro. infile->parent to the includer, X * etc. infile->fd is NULL if this input stream is a macro. X */ Xint line; /* Current line number */ Xint wrongline; /* Force #line to compiler */ Xchar token[IDMAX + 1]; /* Current input token */ Xint errors; /* cpp error counter */ XFILEINFO *infile = NULL; /* Current input file */ X#if DEBUG Xint debug; /* TRUE if debugging now */ X#endif X/* X * This counter is incremented when a macro expansion is initiated. X * If it exceeds a built-in value, the expansion stops -- this tests X * for a runaway condition: X * #define X Y X * #define Y X X * X X * This can be disabled by falsifying rec_recover. (Nothing does this X * currently: it is a hook for an eventual invocation flag.) X */ Xint recursion; /* Infinite recursion counter */ Xint rec_recover = TRUE; /* Unwind recursive macros */ X X/* X * instring is set TRUE when a string is scanned. It modifies the X * behavior of the "get next character" routine, causing all characters X * to be passed to the caller (except ). Note especially that X * comments and \ are not removed from the source. (This X * prevents cpp output lines from being arbitrarily long). X * X * inmacro is set by #define -- it absorbs comments and converts X * form-feed and vertical-tab to space, but returns \ X * to the caller. Strictly speaking, this is a bug as \ X * shouldn't delimit tokens, but we'll worry about that some other X * time -- it is more important to prevent infinitly long output lines. X * X * instring and inmarcor are parameters to the get() routine which X * were made global for speed. X */ Xint instring = FALSE; /* TRUE if scanning string */ Xint inmacro = FALSE; /* TRUE if #defining a macro */ X X/* X * work[] and workp are used to store one piece of text in a temporay X * buffer. To initialize storage, set workp = work. To store one X * character, call save(c); (This will fatally exit if there isn't X * room.) To terminate the string, call save(EOS). Note that X * the work buffer is used by several subroutines -- be sure your X * data won't be overwritten. The extra byte in the allocation is X * needed for string formal replacement. X */ Xchar work[NWORK + 1]; /* Work buffer */ Xchar *workp; /* Work buffer pointer */ X X/* X * keepcomments is set TRUE by the -C option. If TRUE, comments X * are written directly to the output stream. This is needed if X * the output from cpp is to be passed to lint (which uses commands X * embedded in comments). cflag contains the permanent state of the X * -C flag. keepcomments is always falsified when processing #control X * commands and when compilation is supressed by a false #if X * X * If eflag is set, CPP returns "success" even if non-fatal errors X * were detected. X * X * If nflag is non-zero, no symbols are predefined except __LINE__. X * __FILE__, and __DATE__. If nflag > 1, absolutely no symbols X * are predefined. X */ Xint keepcomments = FALSE; /* Write out comments flag */ Xint cflag = FALSE; /* -C option (keep comments) */ Xint eflag = FALSE; /* -E option (never fail) */ Xint nflag = 0; /* -N option (no predefines) */ X X/* X * ifstack[] holds information about nested #if's. It is always X * accessed via *ifptr. The information is as follows: X * WAS_COMPILING state of compiling flag at outer level. X * ELSE_SEEN set TRUE when #else seen to prevent 2nd #else. X * TRUE_SEEN set TRUE when #if or #elif succeeds X * ifstack[0] holds the compiling flag. It is TRUE if compilation X * is currently enabled. Note that this must be initialized TRUE. X */ Xchar ifstack[BLK_NEST] = { TRUE }; /* #if information */ Xchar *ifptr = ifstack; /* -> current ifstack[] */ X X/* X * incdir[] stores the -i directories (and the system-specific X * #include <...> directories. X */ Xchar *incdir[NINCLUDE]; /* -i directories */ Xchar **incend = incdir; /* -> free space in incdir[] */ X X/* X * This is the table used to predefine target machine and operating X * system designators. It may need hacking for specific circumstances. X * Note: it is not clear that this is part of the Ansi Standard. X * The -N option supresses preset definitions. X */ Xchar *preset[] = { /* names defined at cpp start */ X#ifdef MACHINE X MACHINE, X#endif X#ifdef SYSTEM X SYSTEM, X#endif X#ifdef COMPILER X COMPILER, X#endif X#if DEBUG X "decus_cpp", /* Ourselves! */ X#endif X NULL /* Must be last */ X}; X X/* X * The value of these predefined symbols must be recomputed whenever X * they are evaluated. The order must not be changed. X */ Xchar *magic[] = { /* Note: order is important */ X "__LINE__", X "__FILE__", X NULL /* Must be last */ X}; X Xmain(argc, argv) Xint argc; Xchar *argv[]; X{ X register int i; X X#if HOST == SYS_VMS X argc = getredirection(argc, argv); /* vms >file and stdin */ X /* X * Open input file, "-" means use stdin. X */ X if (!streq(argv[1], "-")) { X if (freopen(argv[1], "r", stdin) == NULL) { X perror(argv[1]); X cerror("Can't open input file \"%s\"", argv[1]); X exit(IO_ERROR); X } X strcpy(work, argv[1]); /* Remember input filename */ X break; X } /* Else, just get stdin */ X case 0: /* No args? */ X case 1: /* No files, stdin -> stdout */ X#if HOST == SYS_UNIX X work[0] = EOS; /* Unix can't find stdin name */ X#else X fgetname(stdin, work); /* Vax-11C, Decus C know name */ X#endif X break; X X default: X exit(IO_ERROR); /* Can't happen */ X } X setincdirs(); /* Setup -I include directories */ X addfile(stdin, work); /* "open" main input file */ X#if DEBUG X if (debug > 0) X dumpdef("preset #define symbols"); X#endif X cppmain(); /* Process main file */ X if ((i = (ifptr - &ifstack[0])) != 0) { X#if OLD_PREPROCESSOR X ciwarn("Inside #ifdef block at end of input, depth = %d", i); X#else X cierror("Inside #ifdef block at end of input, depth = %d", i); X#endif X } X fclose(stdout); X if (errors > 0) { X fprintf(stderr, (errors == 1) X ? "%d error in preprocessor\n" X : "%d errors in preprocessor\n", errors); X if (!eflag) X exit(IO_ERROR); X } X exit(IO_NORMAL); /* No errors or -E option set */ X} X XFILE_LOCAL Xcppmain() X/* X * Main process for cpp -- copies tokens from the current input X * stream (main file, include file, or a macro) to the output X * file. X */ X{ X register int c; /* Current character */ X register int counter; /* newlines and spaces */ X extern int output(); /* Output one character */ X X /* X * Explicitly output a #line at the start of cpp output so X * that lint (etc.) knows the name of the original source X * file. If we don't do this explicitly, we may get X * the name of the first #include file instead. X */ X sharp(); X /* X * This loop is started "from the top" at the beginning of each line X * wrongline is set TRUE in many places if it is necessary to write X * a #line record. (But we don't write them when expanding macros.) X * X * The counter variable has two different uses: at X * the start of a line, it counts the number of blank lines that X * have been skipped over. These are then either output via X * #line records or by outputting explicit blank lines. X * When expanding tokens within a line, the counter remembers X * whether a blank/tab has been output. These are dropped X * at the end of the line, and replaced by a single blank X * within lines. X */ X for (;;) { X counter = 0; /* Count empty lines */ X for (;;) { /* For each line, ... */ X while (type[(c = get())] == SPA) /* Skip leading blanks */ X ; /* in this line. */ X if (c == '\n') /* If line's all blank, */ X ++counter; /* Do nothing now */ X else if (c == '#') { /* Is 1st non-space '#' */ X keepcomments = FALSE; /* Don't pass comments */ X counter = control(counter); /* Yes, do a #command */ X keepcomments = (cflag && compiling); X } X else if (c == EOF_CHAR) /* At end of file? */ X break; X else if (!compiling) { /* #ifdef false? */ X skipnl(); /* Skip to newline */ X counter++; /* Count it, too. */ X } X else { X break; /* Actual token */ X } X } X if (c == EOF_CHAR) /* Exit process at */ X break; /* End of file */ X /* X * If the loop didn't terminate because of end of file, we X * know there is a token to compile. First, clean up after X * absorbing newlines. counter has the number we skipped. X */ X if ((wrongline && infile->fp != NULL) || counter > 4) X sharp(); /* Output # line number */ X else { /* If just a few, stuff */ X while (--counter >= 0) /* them out ourselves */ X putchar('\n'); X } X /* X * Process each token on this line. X */ X unget(); /* Reread the char. */ X for (;;) { /* For the whole line, */ X do { /* Token concat. loop */ X for (counter = 0; (type[(c = get())] == SPA);) { X#if COMMENT_INVISIBLE X if (c != COM_SEP) X counter++; X#else X counter++; /* Skip over blanks */ X#endif X } X if (c == EOF_CHAR || c == '\n') X goto end_line; /* Exit line loop */ X else if (counter > 0) /* If we got any spaces */ X putchar(' '); /* Output one space */ X c = macroid(c); /* Grab the token */ X } while (type[c] == LET && catenate()); X if (c == EOF_CHAR || c == '\n') /* From macro exp error */ X goto end_line; /* Exit line loop */ X switch (type[c]) { X case LET: X fputs(token, stdout); /* Quite ordinary token */ X break; X X X case DIG: /* Output a number */ X case DOT: /* Dot may begin floats */ X scannumber(c, output); X break; X X case QUO: /* char or string const */ X scanstring(c, output); /* Copy it to output */ X break; X X default: /* Some other character */ X cput(c); /* Just output it */ X break; X } /* Switch ends */ X } /* Line for loop */ Xend_line: if (c == '\n') { /* Compiling at EOL? */ X putchar('\n'); /* Output newline, if */ X if (infile->fp == NULL) /* Expanding a macro, */ X wrongline = TRUE; /* Output # line later */ X } X } /* Continue until EOF */ X} X Xoutput(c) Xint c; X/* X * Output one character to stdout -- output() is passed as an X * argument to scanstring() X */ X{ X#if COMMENT_INVISIBLE X if (c != TOK_SEP && c != COM_SEP) X#else X if (c != TOK_SEP) X#endif X putchar(c); X} X Xstatic char *sharpfilename = NULL; X XFILE_LOCAL Xsharp() X/* X * Output a line number line. X */ X{ X register char *name; X X if (keepcomments) /* Make sure # comes on */ X putchar('\n'); /* a fresh, new line. */ X printf("#%s %d", LINE_PREFIX, line); X if (infile->fp != NULL) { X name = (infile->progname != NULL) X ? infile->progname : infile->filename; X if (sharpfilename == NULL X || sharpfilename != NULL && !streq(name, sharpfilename)) { X if (sharpfilename != NULL) X free(sharpfilename); X sharpfilename = savestring(name); X printf(" \"%s\"", name); X } X } X putchar('\n'); X wrongline = FALSE; X} END-of-cpp1.c echo x - cpp3.c sed 's/^X//' >cpp3.c << 'END-of-cpp3.c' X/* X * C P P 3 . C X * X * File open and command line options X * X * Edit history X * 13-Nov-84 MM Split from cpp1.c X */ X X#include X#include X#include "cppdef.h" X#include "cpp.h" X#if DEBUG && (HOST == SYS_VMS || HOST == SYS_UNIX) X#include Xextern int abort(); /* For debugging */ X#endif X Xint Xopenfile(filename) Xchar *filename; X/* X * Open a file, add it to the linked list of open files. X * This is called only from openfile() above. X */ X{ X register FILE *fp; X X if ((fp = fopen(filename, "r")) == NULL) { X#if DEBUG X perror(filename); X#endif X return (FALSE); X } X#if DEBUG X if (debug) X fprintf(stderr, "Reading from \"%s\"\n", filename); X#endif X addfile(fp, filename); X return (TRUE); X} X Xaddfile(fp, filename) XFILE *fp; /* Open file pointer */ Xchar *filename; /* Name of the file */ X/* X * Initialize tables for this open file. This is called from openfile() X * above (for #include files), and from the entry to cpp to open the main X * input file. It calls a common routine, getfile() to build the FILEINFO X * structure which is used to read characters. (getfile() is also called X * to setup a macro replacement.) X */ X{ X register FILEINFO *file; X extern FILEINFO *getfile(); X X file = getfile(NBUFF, filename); X file->fp = fp; /* Better remember FILE * */ X file->buffer[0] = EOS; /* Initialize for first read */ X line = 1; /* Working on line 1 now */ X wrongline = TRUE; /* Force out initial #line */ X} X Xsetincdirs() X/* X * Append system-specific directories to the include directory list. X * Called only when cpp is started. X */ X{ X X#ifdef CPP_INCLUDE X *incend++ = CPP_INCLUDE; X#define IS_INCLUDE 1 X#else X#define IS_INCLUDE 0 X#endif X X#if HOST == SYS_UNIX X *incend++ = "/usr/include"; X#define MAXINCLUDE (NINCLUDE - 1 - IS_INCLUDE) X#endif X X#if HOST == SYS_VMS X extern char *getenv(); X X if (getenv("C$LIBRARY") != NULL) X *incend++ = "C$LIBRARY:"; X *incend++ = "SYS$LIBRARY:"; X#define MAXINCLUDE (NINCLUDE - 2 - IS_INCLUDE) X#endif X X#if HOST == SYS_RSX X extern int $$rsts; /* TRUE on RSTS/E */ X extern int $$pos; /* TRUE on PRO-350 P/OS */ X extern int $$vms; /* TRUE on VMS compat. */ X X if ($$pos) { /* P/OS? */ X *incend++ = "SY:[ZZDECUSC]"; /* C #includes */ X *incend++ = "LB:[1,5]"; /* RSX library */ X } X else if ($$rsts) { /* RSTS/E? */ X *incend++ = "SY:@"; /* User-defined account */ X *incend++ = "C:"; /* Decus-C library */ X *incend++ = "LB:[1,1]"; /* RSX library */ X } X else if ($$vms) { /* VMS compatibility? */ X *incend++ = "C:"; X } X else { /* Plain old RSX/IAS */ X *incend++ = "LB:[1,1]"; X } X#define MAXINCLUDE (NINCLUDE - 3 - IS_INCLUDE) X#endif X X#if HOST == SYS_RT11 X extern int $$rsts; /* RSTS/E emulation? */ X X if ($$rsts) X *incend++ = "SY:@"; /* User-defined account */ X *incend++ = "C:"; /* Decus-C library disk */ X *incend++ = "SY:"; /* System (boot) disk */ X#define MAXINCLUDE (NINCLUDE - 3 - IS_INCLUDE) X#endif X} X Xint Xdooptions(argc, argv) Xint argc; Xchar *argv[]; X/* X * dooptions is called to process command line arguments (-Detc). X * It is called only at cpp startup. X */ X{ X register char *ap; X register DEFBUF *dp; X register int c; X int i, j; X char *arg; X SIZES *sizp; /* For -S */ X int size; /* For -S */ X int isdatum; /* FALSE for -S* */ X int endtest; /* For -S */ X X for (i = j = 1; i < argc; i++) { X arg = ap = argv[i]; X if (*ap++ != '-' || *ap == EOS) X argv[j++] = argv[i]; X else { X c = *ap++; /* Option byte */ X if (islower(c)) /* Normalize case */ X c = toupper(c); X switch (c) { /* Command character */ X case 'C': /* Keep comments */ X cflag = TRUE; X keepcomments = TRUE; X break; X X case 'D': /* Define symbol */ X#if HOST != SYS_UNIX X zap_uc(ap); /* Force define to U.C. */ X#endif X /* X * If the option is just "-Dfoo", make it -Dfoo=1 X */ X while (*ap != EOS && *ap != '=') X ap++; X if (*ap == EOS) X ap = "1"; X else X *ap++ = EOS; X /* X * Now, save the word and its definition. X */ X dp = defendel(argv[i] + 2, FALSE); X dp->repl = savestring(ap); X dp->nargs = DEF_NOARGS; X break; X X case 'E': /* Ignore non-fatal */ X eflag = TRUE; /* errors. */ X break; X X case 'I': /* Include directory */ X if (incend >= &incdir[MAXINCLUDE]) X cfatal("Too many include directories", NULLST); X *incend++ = ap; X break; X X case 'N': /* No predefineds */ X nflag++; /* Repeat to undefine */ X break; /* __LINE__, etc. */ X X case 'S': X sizp = size_table; X if (isdatum = (*ap != '*')) /* If it's just -S, */ X endtest = T_FPTR; /* Stop here */ X else { /* But if it's -S* */ X ap++; /* Step over '*' */ X endtest = 0; /* Stop at end marker */ X } X while (sizp->bits != endtest && *ap != EOS) { X if (!isdigit(*ap)) { /* Skip to next digit */ X ap++; X continue; X } X size = 0; /* Compile the value */ X while (isdigit(*ap)) { X size *= 10; X size += (*ap++ - '0'); X } X if (isdatum) X sizp->size = size; /* Datum size */ X else X sizp->psize = size; /* Pointer size */ X sizp++; X } X if (sizp->bits != endtest) X cwarn("-S, too few values specified in %s", argv[i]); X else if (*ap != EOS) X cwarn("-S, too many values, \"%s\" unused", ap); X break; X X case 'U': /* Undefine symbol */ X#if HOST != SYS_UNIX X zap_uc(ap); X#endif X if (defendel(ap, TRUE) == NULL) X cwarn("\"%s\" wasn't defined", ap); X break; X X#if DEBUG X case 'X': /* Debug */ X debug = (isdigit(*ap)) ? atoi(ap) : 1; X#if (HOST == SYS_VMS || HOST == SYS_UNIX) X signal(SIGINT, abort); /* Trap "interrupt" */ X#endif X fprintf(stderr, "Debug set to %d\n", debug); X break; X#endif X X default: /* What is this one? */ X cwarn("Unknown option \"%s\"", arg); X fprintf(stderr, "The following options are valid:\n\ X -C\t\t\tWrite source file comments to output\n\ X -Dsymbol=value\tDefine a symbol with the given (optional) value\n\ X -Idirectory\t\tAdd a directory to the #include search list\n\ X -N\t\t\tDon't predefine target-specific names\n\ X -Stext\t\tSpecify sizes for #if sizeof\n\ X -Usymbol\t\tUndefine symbol\n"); X#if DEBUG X fprintf(stderr, " -Xvalue\t\tSet internal debug flag\n"); X#endif X break; X } /* Switch on all options */ X } /* If it's a -option */ X } /* For all arguments */ X if (j > 3) { X cerror( X "Too many file arguments. Usage: cpp [input [output]]", X NULLST); X } X return (j); /* Return new argc */ X} X X#if HOST != SYS_UNIX XFILE_LOCAL Xzap_uc(ap) Xregister char *ap; X/* X * Dec operating systems mangle upper-lower case in command lines. X * This routine forces the -D and -U arguments to uppercase. X * It is called only on cpp startup by dooptions(). X */ X{ X while (*ap != EOS) { X /* X * Don't use islower() here so it works with Multinational X */ X if (*ap >= 'a' && *ap <= 'z') X *ap = toupper(*ap); X ap++; X } X} X#endif X Xinitdefines() X/* X * Initialize the built-in #define's. There are two flavors: X * #define decus 1 (static definitions) X * #define __FILE__ ?? (dynamic, evaluated by magic) X * Called only on cpp startup. X * X * Note: the built-in static definitions are supressed by the -N option. X * __LINE__, __FILE__, and __DATE__ are always present. X */ X{ X register char **pp; X register char *tp; X register DEFBUF *dp; X int i; X long tvec; X extern char *ctime(); X X /* X * Predefine the built-in symbols. Allow the X * implementor to pre-define a symbol as "" to X * eliminate it. X */ X if (nflag == 0) { X for (pp = preset; *pp != NULL; pp++) { X if (*pp[0] != EOS) { X dp = defendel(*pp, FALSE); X dp->repl = savestring("1"); X dp->nargs = DEF_NOARGS; X } X } X } X /* X * The magic pre-defines (__FILE__ and __LINE__ are X * initialized with negative argument counts. expand() X * notices this and calls the appropriate routine. X * DEF_NOARGS is one greater than the first "magic" definition. X */ X if (nflag < 2) { X for (pp = magic, i = DEF_NOARGS; *pp != NULL; pp++) { X dp = defendel(*pp, FALSE); X dp->nargs = --i; X } X#if OK_DATE X /* X * Define __DATE__ as today's date. X */ X dp = defendel("__DATE__", FALSE); X dp->repl = tp = getmem(27); X dp->nargs = DEF_NOARGS; X time(&tvec); X *tp++ = '"'; X strcpy(tp, ctime(&tvec)); X tp[24] = '"'; /* Overwrite newline */ X#endif X } X} X X#if HOST == SYS_VMS X/* X * getredirection() is intended to aid in porting C programs X * to VMS (Vax-11 C) which does not support '>' and '<' X * I/O redirection. With suitable modification, it may X * useful for other portability problems as well. X */ X Xint Xgetredirection(argc, argv) Xint argc; Xchar **argv; X/* X * Process vms redirection arg's. Exit if any error is seen. X * If getredirection() processes an argument, it is erased X * from the vector. getredirection() returns a new argc value. X * X * Warning: do not try to simplify the code for vms. The code X * presupposes that getredirection() is called before any data is X * read from stdin or written to stdout. X * X * Normal usage is as follows: X * X * main(argc, argv) X * int argc; X * char *argv[]; X * { X * argc = getredirection(argc, argv); X * } X */ X{ X register char *ap; /* Argument pointer */ X int i; /* argv[] index */ X int j; /* Output index */ X int file; /* File_descriptor */ X extern int errno; /* Last vms i/o error */ X X for (j = i = 1; i < argc; i++) { /* Do all arguments */ X switch (*(ap = argv[i])) { X case '<': /* ': /* >file or >>file */ X if (*++ap == '>') { /* >>file */ X /* X * If the file exists, and is writable by us, X * call freopen to append to the file (using the X * file's current attributes). Otherwise, create X * a new file with "vanilla" attributes as if the X * argument was given as ">filename". X * access(name, 2) returns zero if we can write on X * the specified file. X */ X if (access(++ap, 2) == 0) { X if (freopen(ap, "a", stdout) != NULL) X break; /* Exit case statement */ X perror(ap); /* Error, can't append */ X exit(errno); /* After access test */ X } /* If file accessable */ X } X /* X * On vms, we want to create the file using "standard" X * record attributes. creat(...) creates the file X * using the caller's default protection mask and X * "variable length, implied carriage return" X * attributes. dup2() associates the file with stdout. X */ X if ((file = creat(ap, 0, "rat=cr", "rfm=var")) == -1 X || dup2(file, fileno(stdout)) == -1) { X perror(ap); /* Can't create file */ X exit(errno); /* is a fatal error */ X } /* If '>' creation */ X break; /* Exit case test */ X X default: X argv[j++] = ap; /* Not a redirector */ X break; /* Exit case test */ X } X } /* For all arguments */ X argv[j] = NULL; /* Terminate argv[] */ X return (j); /* Return new argc */ X} X#endif X X X END-of-cpp3.c echo x - cpp4.c sed 's/^X//' >cpp4.c << 'END-of-cpp4.c' X/* X * C P P 4 . C X * M a c r o D e f i n i t i o n s X * X * Edit History X * 31-Aug-84 MM USENET net.sources release X * 04-Oct-84 MM __LINE__ and __FILE__ must call ungetstring() X * so they work correctly with token concatenation. X * Added string formal recognition. X * 25-Oct-84 MM "Short-circuit" evaluate #if's so that we X * don't print unnecessary error messages for X * #if !defined(FOO) && FOO != 0 && 10 / FOO ... X * 31-Oct-84 ado/MM Added token concatenation X * 6-Nov-84 MM Split off eval stuff X */ X X#include X#include X#include "cppdef.h" X#include "cpp.h" X/* X * parm[], parmp, and parlist[] are used to store #define() argument X * lists. nargs contains the actual number of parameters stored. X */ Xstatic char parm[NPARMWORK + 1]; /* define param work buffer */ Xstatic char *parmp; /* Free space in parm */ Xstatic char *parlist[LASTPARM]; /* -> start of each parameter */ Xstatic int nargs; /* Parameters for this macro */ X Xdodefine() X/* X * Called from control when a #define is scanned. This module X * parses formal parameters and the replacement string. When X * the formal parameter name is encountered in the replacement X * string, it is replaced by a character in the range 128 to X * 128+NPARAM (this allows up to 32 parameters within the X * Dec Multinational range). If cpp is ported to an EBCDIC X * machine, you will have to make other arrangements. X * X * There is some special case code to distinguish X * #define foo bar X * from #define foo() bar X * X * Also, we make sure that X * #define foo foo X * expands to "foo" but doesn't put cpp into an infinite loop. X * X * A warning message is printed if you redefine a symbol to a X * different text. I.e, X * #define foo 123 X * #define foo 123 X * is ok, but X * #define foo 123 X * #define foo +123 X * is not. X * X * The following subroutines are called from define(): X * checkparm called when a token is scanned. It checks through the X * array of formal parameters. If a match is found, the X * token is replaced by a control byte which will be used X * to locate the parameter when the macro is expanded. X * textput puts a string in the macro work area (parm[]), updating X * parmp to point to the first free byte in parm[]. X * textput() tests for work buffer overflow. X * charput puts a single character in the macro work area (parm[]) X * in a manner analogous to textput(). X */ X{ X register int c; X register DEFBUF *dp; /* -> new definition */ X int isredefine; /* TRUE if redefined */ X char *old; /* Remember redefined */ X extern int save(); /* Save char in work[] */ X X if (type[(c = skipws())] != LET) X goto bad_define; X isredefine = FALSE; /* Set if redefining */ X if ((dp = lookid(c)) == NULL) /* If not known now */ X dp = defendel(token, FALSE); /* Save the name */ X else { /* It's known: */ X isredefine = TRUE; /* Remember this fact */ X old = dp->repl; /* Remember replacement */ X dp->repl = NULL; /* No replacement now */ X } X parlist[0] = parmp = parm; /* Setup parm buffer */ X if ((c = get()) == '(') { /* With arguments? */ X nargs = 0; /* Init formals counter */ X do { /* Collect formal parms */ X if (nargs >= LASTPARM) X cfatal("Too many arguments for macro", NULLST); X else if ((c = skipws()) == ')') X break; /* Got them all */ X else if (type[c] != LET) /* Bad formal syntax */ X goto bad_define; X scanid(c); /* Get the formal param */ X parlist[nargs++] = parmp; /* Save its start */ X textput(token); /* Save text in parm[] */ X } while ((c = skipws()) == ','); /* Get another argument */ X if (c != ')') /* Must end at ) */ X goto bad_define; X c = ' '; /* Will skip to body */ X } X else { X /* X * DEF_NOARGS is needed to distinguish between X * "#define foo" and "#define foo()". X */ X nargs = DEF_NOARGS; /* No () parameters */ X } X if (type[c] == SPA) /* At whitespace? */ X c = skipws(); /* Not any more. */ X workp = work; /* Replacement put here */ X inmacro = TRUE; /* Keep \ now */ X while (c != EOF_CHAR && c != '\n') { /* Compile macro body */ X#if OK_CONCAT X if (c == '#') { /* Token concatenation? */ X while (workp > work && type[workp[-1]] == SPA) X --workp; /* Erase leading spaces */ X save(TOK_SEP); /* Stuff a delimiter */ X c = skipws(); /* Eat whitespace */ X if (type[c] == LET) /* Another token here? */ X ; /* Stuff it normally */ X else if (type[c] == DIG) { /* Digit string after? */ X while (type[c] == DIG) { /* Stuff the digits */ X save(c); X c = get(); X } X save(TOK_SEP); /* Delimit 2nd token */ X } X else { X ciwarn("Strange character after # (%d.)", c); X } X continue; X } X#endif X switch (type[c]) { X case LET: X checkparm(c, dp); /* Might be a formal */ X break; X X case DIG: /* Number in mac. body */ X case DOT: /* Maybe a float number */ X scannumber(c, save); /* Scan it off */ X break; X X case QUO: /* String in mac. body */ X#if STRING_FORMAL X stparmscan(c, dp); /* Do string magic */ X#else X stparmscan(c); X#endif X break; X X case BSH: /* Backslash */ X save('\\'); X if ((c = get()) == '\n') X wrongline = TRUE; X save(c); X break; X X case SPA: /* Absorb whitespace */ X /* X * Note: the "end of comment" marker is passed on X * to allow comments to separate tokens. X */ X if (workp[-1] == ' ') /* Absorb multiple */ X break; /* spaces */ X else if (c == '\t') X c = ' '; /* Normalize tabs */ X /* Fall through to store character */ X default: /* Other character */ X save(c); X break; X } X c = get(); X } X inmacro = FALSE; /* Stop newline hack */ X unget(); /* For control check */ X if (workp > work && workp[-1] == ' ') /* Drop trailing blank */ X workp--; X *workp = EOS; /* Terminate work */ X dp->repl = savestring(work); /* Save the string */ X dp->nargs = nargs; /* Save arg count */ X#if DEBUG X if (debug) X dumpadef("macro definition", dp); X#endif X if (isredefine) { /* Error if redefined */ X if ((old != NULL && dp->repl != NULL && !streq(old, dp->repl)) X || (old == NULL && dp->repl != NULL) X || (old != NULL && dp->repl == NULL)) { X cerror("Redefining defined variable \"%s\"", dp->name); X } X if (old != NULL) /* We don't need the */ X free(old); /* old definition now. */ X } X return; X Xbad_define: X cerror("#define syntax error", NULLST); X inmacro = FALSE; /* Stop hack */ X} X Xcheckparm(c, dp) Xregister int c; XDEFBUF *dp; X/* X * Replace this param if it's defined. Note that the macro name is a X * possible replacement token. We stuff DEF_MAGIC in front of the token X * which is treated as a LETTER by the token scanner and eaten by X * the output routine. This prevents the macro expander from X * looping if someone writes "#define foo foo". X */ X{ X register int i; X register char *cp; X X scanid(c); /* Get parm to token[] */ X for (i = 0; i < nargs; i++) { /* For each argument */ X if (streq(parlist[i], token)) { /* If it's known */ X save(i + MAC_PARM); /* Save a magic cookie */ X return; /* And exit the search */ X } X } X if (streq(dp->name, token)) /* Macro name in body? */ X save(DEF_MAGIC); /* Save magic marker */ X for (cp = token; *cp != EOS;) /* And save */ X save(*cp++); /* The token itself */ X} X X#if STRING_FORMAL Xstparmscan(delim, dp) Xint delim; Xregister DEFBUF *dp; X/* X * Scan the string (starting with the given delimiter). X * The token is replaced if it is the only text in this string or X * character constant. The algorithm follows checkparm() above. X * Note that scanstring() has approved of the string. X */ X{ X register int c; X X /* X * Warning -- this code hasn't been tested for a while. X * It exists only to preserve compatibility with earlier X * implementations of cpp. It is not part of the Draft X * ANSI Standard C language. X */ X save(delim); X instring = TRUE; X while ((c = get()) != delim X && c != '\n' X && c != EOF_CHAR) { X if (type[c] == LET) /* Maybe formal parm */ X checkparm(c, dp); X else { X save(c); X if (c == '\\') X save(get()); X } X } X instring = FALSE; X if (c != delim) X cerror("Unterminated string in macro body", NULLST); X save(c); X} X#else Xstparmscan(delim) Xint delim; X/* X * Normal string parameter scan. X */ X{ X register char *wp; X register int i; X extern int save(); X X wp = workp; /* Here's where it starts */ X if (!scanstring(delim, save)) X return; /* Exit on scanstring error */ X workp[-1] = EOS; /* Erase trailing quote */ X wp++; /* -> first string content byte */ X for (i = 0; i < nargs; i++) { X if (streq(parlist[i], wp)) { X *wp++ = MAC_PARM + PAR_MAC; /* Stuff a magic marker */ X *wp++ = (i + MAC_PARM); /* Make a formal marker */ X *wp = wp[-3]; /* Add on closing quote */ X workp = wp + 1; /* Reset string end */ X return; X } X } X workp[-1] = wp[-1]; /* Nope, reset end quote. */ X} X#endif X Xdoundef() X/* X * Remove the symbol from the defined list. X * Called from the #control processor. X */ X{ X register int c; X X if (type[(c = skipws())] != LET) X cerror("Illegal #undef argument", NULLST); X else { X scanid(c); /* Get name to token[] */ X if (defendel(token, TRUE) == NULL) { X cwarn("Symbol \"%s\" not defined in #undef", token); X } X } X} X Xtextput(text) Xchar *text; X/* X * Put the string in the parm[] buffer. X */ X{ X register int size; X X size = strlen(text) + 1; X if ((parmp + size) >= &parm[NPARMWORK]) X cfatal("Macro work area overflow", NULLST); X else { X strcpy(parmp, text); X parmp += size; X } X} X Xcharput(c) Xregister int c; X/* X * Put the byte in the parm[] buffer. X */ X{ X if (parmp >= &parm[NPARMWORK]) X cfatal("Macro work area overflow", NULLST); X else { X *parmp++ = c; X } X} X X/* X * M a c r o E x p a n s i o n X */ X Xstatic DEFBUF *macro; /* Catches start of infinite macro */ X Xexpand(tokenp) Xregister DEFBUF *tokenp; X/* X * Expand a macro. Called from the cpp mainline routine (via subroutine X * macroid()) when a token is found in the symbol table. It calls X * expcollect() to parse actual parameters, checking for the correct number. X * It then creates a "file" containing a single line containing the X * macro with actual parameters inserted appropriately. This is X * "pushed back" onto the input stream. (When the get() routine runs X * off the end of the macro line, it will dismiss the macro itself.) X */ X{ X register int c; X register FILEINFO *file; X extern FILEINFO *getfile(); X X#if DEBUG X if (debug) X dumpadef("expand entry", tokenp); X#endif X /* X * If no macro is pending, save the name of this macro X * for an eventual error message. X */ X if (recursion++ == 0) X macro = tokenp; X else if (recursion == RECURSION_LIMIT) { X cerror("Recursive macro definition of \"%s\"", tokenp->name); X fprintf(stderr, "(Defined by \"%s\")\n", macro->name); X if (rec_recover) { X do { X c = get(); X } while (infile != NULL && infile->fp == NULL); X unget(); X recursion = 0; X return; X } X } X /* X * Here's a macro to expand. X */ X nargs = 0; /* Formals counter */ X parmp = parm; /* Setup parm buffer */ X switch (tokenp->nargs) { X case (-2): /* __LINE__ */ X sprintf(work, "%d", line); X ungetstring(work); X break; X X case (-3): /* __FILE__ */ X for (file = infile; file != NULL; file = file->parent) { X if (file->fp != NULL) { X sprintf(work, "\"%s\"", (file->progname != NULL) X ? file->progname : file->filename); X ungetstring(work); X break; X } X } X break; X X default: X /* X * Nothing funny about this macro. X */ X if (tokenp->nargs < 0) X cfatal("Bug: Illegal __ macro \"%s\"", tokenp->name); X while ((c = skipws()) == '\n') /* Look for (, skipping */ X wrongline = TRUE; /* spaces and newlines */ X if (c != '(') { X /* X * If the programmer writes X * #define foo() ... X * ... X * foo [no ()] X * just write foo to the output stream. X */ X unget(); X cwarn("Macro \"%s\" needs arguments", tokenp->name); X fputs(tokenp->name, stdout); X return; X } X else if (expcollect()) { /* Collect arguments */ X if (tokenp->nargs != nargs) { /* Should be an error? */ X cwarn("Wrong number of macro arguments for \"%s\"", X tokenp->name); X } X#if DEBUG X if (debug) X dumpparm("expand"); X#endif X } /* Collect arguments */ X case DEF_NOARGS: /* No parameters just stuffs */ X expstuff(tokenp); /* Do actual parameters */ X } /* nargs switch */ X} X XFILE_LOCAL int Xexpcollect() X/* X * Collect the actual parameters for this macro. TRUE if ok. X */ X{ X register int c; X register int paren; /* For embedded ()'s */ X extern int charput(); X X for (;;) { X paren = 0; /* Collect next arg. */ X while ((c = skipws()) == '\n') /* Skip over whitespace */ X wrongline = TRUE; /* and newlines. */ X if (c == ')') { /* At end of all args? */ X /* X * Note that there is a guard byte in parm[] X * so we don't have to check for overflow here. X */ X *parmp = EOS; /* Make sure terminated */ X break; /* Exit collection loop */ X } X else if (nargs >= LASTPARM) X cfatal("Too many arguments in macro expansion", NULLST); X parlist[nargs++] = parmp; /* At start of new arg */ X for (;; c = cget()) { /* Collect arg's bytes */ X if (c == EOF_CHAR) { X cerror("end of file within macro argument", NULLST); X return (FALSE); /* Sorry. */ X } X else if (c == '\\') { /* Quote next character */ X charput(c); /* Save the \ for later */ X charput(cget()); /* Save the next char. */ X continue; /* And go get another */ X } X else if (type[c] == QUO) { /* Start of string? */ X scanstring(c, charput); /* Scan it off */ X continue; /* Go get next char */ X } X else if (c == '(') /* Worry about balance */ X paren++; /* To know about commas */ X else if (c == ')') { /* Other side too */ X if (paren == 0) { /* At the end? */ X unget(); /* Look at it later */ X break; /* Exit arg getter. */ X } X paren--; /* More to come. */ X } X else if (c == ',' && paren == 0) /* Comma delimits args */ X break; X else if (c == '\n') /* Newline inside arg? */ X wrongline = TRUE; /* We'll need a #line */ X charput(c); /* Store this one */ X } /* Collect an argument */ X charput(EOS); /* Terminate argument */ X#if DEBUG X if (debug) X printf("parm[%d] = \"%s\"\n", nargs, parlist[nargs - 1]); X#endif X } /* Collect all args. */ X return (TRUE); /* Normal return */ X} X XFILE_LOCAL Xexpstuff(tokenp) XDEFBUF *tokenp; /* Current macro being expanded */ X/* X * Stuff the macro body, replacing formal parameters by actual parameters. X */ X{ X register int c; /* Current character */ X register char *inp; /* -> repl string */ X register char *defp; /* -> macro output buff */ X int size; /* Actual parm. size */ X char *defend; /* -> output buff end */ X int string_magic; /* String formal hack */ X FILEINFO *file; /* Funny #include */ X extern FILEINFO *getfile(); X X file = getfile(NBUFF, tokenp->name); X inp = tokenp->repl; /* -> macro replacement */ X defp = file->buffer; /* -> output buffer */ X defend = defp + (NBUFF - 1); /* Note its end */ X if (inp != NULL) { X while ((c = (*inp++ & 0xFF)) != EOS) { X if (c >= MAC_PARM && c <= (MAC_PARM + PAR_MAC)) { X string_magic = (c == (MAC_PARM + PAR_MAC)); X if (string_magic) X c = (*inp++ & 0xFF); X /* X * Replace formal parameter by actual parameter string. X */ X if ((c -= MAC_PARM) < nargs) { X size = strlen(parlist[c]); X if ((defp + size) >= defend) X goto nospace; X /* X * Erase the extra set of quotes. X */ X if (string_magic && defp[-1] == parlist[c][0]) { X strcpy(defp-1, parlist[c]); X defp += (size - 2); X } X else { X strcpy(defp, parlist[c]); X defp += size; X } X } X } X else if (defp >= defend) { Xnospace: cfatal("Out of space in macro \"%s\" arg expansion", X tokenp->name); X } X else { X *defp++ = c; X } X } X } X *defp = EOS; X#if DEBUG X if (debug > 1) X printf("macroline: \"%s\"\n", file->buffer); X#endif X} X X#if DEBUG Xdumpparm(why) Xchar *why; X/* X * Dump parameter list. X */ X{ X register int i; X X printf("dump of %d parameters (%d bytes total) %s\n", X nargs, parmp - parm, why); X for (i = 0; i < nargs; i++) { X printf("parm[%d] (%d) = \"%s\"\n", X i + 1, strlen(parlist[i]), parlist[i]); X } X} X#endif END-of-cpp4.c exit slashem-0.0.7E7F3/sys/unix/Makefile.top0000664000076400007640000003141410545462317015721 0ustar aliali# 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 # these makes allow $(MAKE) to be overridden by the environment if someone # wants to (or has to) use something other than the standard make, so we do # not want to unconditionally set $(MAKE) here # # unfortunately, some older makes do not predefine $(MAKE); if you have one of # these, uncomment the following line # (you will know that you have one if you get complaints about unable to # execute things like 'data' and 'rumors') # MAKE = make # make NetHack PREFIX = /usr GAME = slashem # GAME = slashem.prg GAMEUID = games GAMEGRP = bin # Permissions - some places use setgid instead of setuid, for instance # See also the option "SECURE" in include/config.h GAMEPERM = 04755 FILEPERM = 0644 EXEPERM = 0755 DIRPERM = 0755 VARFILEPERM = 0644 VARDIRPERM = 0755 # GAMEDIR also appears in config.h as "HACKDIR". # VARDIR may also appear in unixconf.h as "VAR_PLAYGROUND" else GAMEDIR # # note that 'make install' believes in creating nice tidy directories for # installation, free of debris from previous Slash'EM versions -- therefore # there should not be anything in these directories that you want to keep # (if there is, you'll have to do the installation by hand or modify the # instructions) # These must agree with the definitions in unixconf.h # Defs. for non file areas support. GAMEDIR = $(PREFIX)/local/slashemdir VARDIR = $(GAMEDIR) FILE_AREA_VAR = $(VARDIR) FILE_AREA_SAVE = $(VARDIR)/save FILE_AREA_SHARE = $(GAMEDIR) FILE_AREA_UNSHARE = $(GAMEDIR) FILE_AREA_DOC = $(GAMEDIR) FILE_AREA_BONES = $(FILE_AREA_VAR) FILE_AREA_LEVL = $(FILE_AREA_VAR) SHELLDIR = $(PREFIX)/local/bin # Defs. compatible with Linux's FSSTND 1.2 # FILE_AREA_VAR = /var/lib/games/slashem # FILE_AREA_SAVE = /var/lib/games/slashem/save # FILE_AREA_SHARE = /usr/lib/games/slashem # FILE_AREA_UNSHARE = /usr/lib/games/slashem # FILE_AREA_DOC = /usr/doc/slashem # FILE_AREA_BONES = $(FILE_AREA_VAR) # FILE_AREA_LEVL = $(FILE_AREA_VAR) # SHELLDIR = /usr/games # Defs. compatible with FHS 2.0 # FILE_AREA_VAR = /var/games/slashem # FILE_AREA_SAVE = /var/games/slashem/save # FILE_AREA_SHARE = /usr/share/games/slashem # FILE_AREA_UNSHARE = /usr/lib/games/slashem # FILE_AREA_DOC = /usr/share/doc/slashem # FILE_AREA_BONES = $(FILE_AREA_VAR) # FILE_AREA_LEVL = $(FILE_AREA_VAR) # SHELLDIR = /usr/games # KDEDIR = /opt/kde # SHELLDIR = $(KDEDIR)/bin # Shareable (architecture independent) data files which are not candidates # for inclusion in DLB libraries (ND) and which are (D). Port specific files # per discussions in Install.X11, Install.Qt and Install.GTK CNF_SHARE_QTND = x11tiles rip.xpm nhsplash.xpm CNF_SHARE_X11ND = x11bigtiles x11tiles SlashEM.ad pet_mark.xbm # CNF_SHARE_X11ND = x11bigtiles x11tiles SlashEM.ad pet_mark.xbm rip.xpm CNF_SHARE_GTKND = x11big3dtiles x11bigtiles x11tiles rip.xpm credit.xpm gtkrc CNF_SHARE_GTKPROXYND = x11big3dtiles.map x11bigtiles.map x11tiles.map # for Atari/Gem CNF_SHARE_GEMND = nh16.img title.img GEM_RSC.RSC rip.img # for BeOS CNF_SHARE_BEND = beostiles # for SDL/GL window port CNF_SHARE_GLND = gltile16.png gltile32.png gltile64.png gllogo.png glrip.png \ glfont8.png glfont14.png glfont20.png glfont22.png # for Gnome CNF_SHARE_GNOMEND = x11bigtiles x11tiles pet_mark.xbm rip.xpm mapbg.xpm # for Proxy CNF_SHARE_PROXYND = gltile64.png gltile32.png gltile16.png \ gltile64.map gltile32.map gltile16.map # CNF_SHARE_DATND = $(CNF_SHARE_X11ND) # CNF_SHARE_DATND = $(CNF_SHARE_QTND) # CNF_SHARE_DATND = $(CNF_SHARE_GTKND) # CNF_SHARE_DATND = $(CNF_SHARE_GTKND) $(CNF_SHARE_GTKPROXYND) # CNF_SHARE_DATND = $(CNF_SHARE_GLND) # CNF_SHARE_DATND = $(CNF_SHARE_PROXYND) CNF_SHARE_DATND = CNF_SHARE_DATD = data oracles options quest.dat rumors CNF_SHARE_DAT = $(CNF_SHARE_DATD) $(CNF_SHARE_DATND) # Some versions of make use the SHELL environment variable as the shell # for running commands. We need this to be a Bourne shell. # SHELL = /bin/sh # for Atari # SHELL=E:/GEMINI2/MUPFEL.TTP # Commands for setting the owner and group on files during installation. # Some systems fail with one or the other when installing over NFS or for # other permission-related reasons. If that happens, you may want to set the # command to "true", which is a no-op. Note that disabling chown or chgrp # will only work if setuid (or setgid) behavior is not desired or required. CHOWN = chown CHGRP = chgrp # # end of configuration # DATHELP = help hh cmdhelp history opthelp wizhelp gypsy.txt SPEC_LEVS = asmodeus.lev baalz.lev bigrm-?.lev castle.lev fakewiz?.lev \ juiblex.lev knox.lev medusa-?.lev minend-?.lev minefill.lev \ minetn-?.lev oracle.lev orcus.lev sanctum.lev soko?-?.lev \ tower?.lev valley.lev wizard?.lev \ astral.lev air.lev earth.lev fire.lev water.lev \ beholder.lev blkmar.lev cav2fill.lev \ grund-?.lev demogorg.lev dispater.lev dragons.lev geryon.lev \ guild.lev kobold-?.lev lich.lev mall-?.lev mall.lev mineking.lev \ mtemple.lev nymph.lev rats.lev sea.lev spiders.lev stor-?.lev \ tomb.lev yeenoghu.lev frnknstn.lev nightmar.lev QUEST_LEVS = ???-goal.lev ???-fil?.lev ???-loca.lev ???-strt.lev SHARE_DATNODLB = $(CNF_SHARE_DATND) UNSHARE_DATNODLB = SHARE_DATDLB = $(DATHELP) $(CNF_SHARE_DATD) UNSHARE_DATDLB = dungeon $(SPEC_LEVS) $(QUEST_LEVS) SHARE_DAT = $(SHARE_DATNODLB) $(SHARE_DATDLB) UNSHARE_DAT = $(UNSHARE_DATNODLB) $(UNSHARE_DATDLB) $(GAME): ( cd src ; $(MAKE) ) all: $(GAME) recover Guidebook $(CNF_SHARE_DAT) 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: $(GAME) ( 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 ) Guidebook.txt: ( cd doc; $(MAKE) Guidebook.txt ) nhtiles.bmp: $(GAME) ( cd dat ; $(MAKE) nhtiles.bmp ) x11tiles: $(GAME) ( cd util ; $(MAKE) tile2x11 ) ( cd dat ; $(MAKE) x11tiles ) x11bigtiles: $(GAME) ( cd util ; $(MAKE) tile2x11 magtile txtmerge txtbg ) ( cd dat ; $(MAKE) x11bigtiles ) x11big3dtiles: $(GAME) ( cd util ; $(MAKE) tile2x11 bigtile txtmerge ) ( cd dat ; $(MAKE) x11big3dtiles ) x11tiles.map: x11tiles ( cd util ; $(MAKE) mapmerge ) ( cd dat ; $(MAKE) x11tiles.map ) x11bigtiles.map: x11bigtiles ( cd util ; $(MAKE) mapmerge ) ( cd dat ; $(MAKE) x11bigtiles.map ) x11big3dtiles.map: x11big3dtiles ( cd util ; $(MAKE) mapmerge ) ( cd dat ; $(MAKE) x11big3dtiles.map ) beostiles: $(GAME) ( cd util ; $(MAKE) tile2beos ) ( cd dat ; $(MAKE) beostiles ) gl%.png: $(GAME) ( cd util ; $(MAKE) tile2png ) ( cd dat ; $(MAKE) $@ ) gl%.map: gl%.png ( cd util ; $(MAKE) mapmerge ) ( cd dat ; $(MAKE) $@ ) util/txt2ppm: ( cd util ; $(MAKE) txt2ppm ) %.xpm: ( cd dat ; $(MAKE) $*.xpm ) %.pbm: ( cd dat ; $(MAKE) $*.pbm ) SlashEM.ad: $(GAME) ( cd dat ; $(MAKE) SlashEM.ad ) pet_mark.xbm: ( cd dat ; $(MAKE) pet_mark.xbm ) rip.xpm: ( cd dat ; $(MAKE) rip.xpm ) 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 ) gtkrc: win/gtk/GTKRC cp win/gtk/GTKRC dat/gtkrc check-dlb: options @if egrep -s librarian dat/options ; then $(MAKE) dlb ; else true ; fi dlb: ( cd util ; $(MAKE) dlb ) ( cd dat ; ../util/dlb cf nhshare $(SHARE_DATDLB) ) ( cd dat ; ../util/dlb cf nhushare $(UNSHARE_DATDLB) ) # recover can be used when INSURANCE is defined in include/config.h # and the checkpoint option is true recover: $(GAME) ( cd util ; $(MAKE) recover ) dofiles: target=`sed -n \ -e '/librarian/{' \ -e 's/.*/dlb/p' \ -e 'q' \ -e '}' \ -e '$$s/.*/nodlb/p' < dat/options` ; \ $(MAKE) dofiles-$${target-nodlb} cp src/$(GAME) $(FILE_AREA_UNSHARE) cp util/recover $(FILE_AREA_UNSHARE) cp dat/license doc/Guidebook.txt $(FILE_AREA_DOC) # cp win/Qt/KDE/kslashem.kdelnk $(KDEDIR)/share/applnk/Games -rm -f $(SHELLDIR)/$(GAME) sed -e 's;/usr/games/lib/nethackdir;$(FILE_AREA_UNSHARE);' \ -e 's;HACKDIR/nethack;HACKDIR/$(GAME);' \ < sys/unix/nethack.sh \ > $(SHELLDIR)/$(GAME) # set up their permissions -( cd $(FILE_AREA_UNSHARE) ; $(CHOWN) $(GAMEUID) $(GAME) recover ; \ $(CHGRP) $(GAMEGRP) $(GAME) recover ) chmod $(GAMEPERM) $(FILE_AREA_UNSHARE)/$(GAME) chmod $(EXEPERM) $(FILE_AREA_UNSHARE)/recover -( cd $(FILE_AREA_DOC) ; \ $(CHOWN) $(GAMEUID) license Guidebook.txt ; \ $(CHGRP) $(GAMEGRP) license Guidebook.txt ; \ chmod $(FILEPERM) license Guidebook.txt ) -$(CHOWN) $(GAMEUID) $(SHELLDIR)/$(GAME) $(CHGRP) $(GAMEGRP) $(SHELLDIR)/$(GAME) chmod $(EXEPERM) $(SHELLDIR)/$(GAME) dofiles-dlb: check-dlb ( cd dat ; cp nhshare $(SHARE_DATNODLB) $(FILE_AREA_SHARE) ) ( cd dat ; cp nhushare $(UNSHARE_DATNODLB) $(FILE_AREA_UNSHARE) ) # set up their permissions -( cd $(FILE_AREA_SHARE) ; \ $(CHOWN) $(GAMEUID) nhshare $(SHARE_DATNODLB) ; \ $(CHGRP) $(GAMEGRP) nhshare $(SHARE_DATNODLB) ; \ chmod $(FILEPERM) nhshare $(SHARE_DATNODLB) ) -( cd $(FILE_AREA_UNSHARE) ; \ $(CHOWN) $(GAMEUID) nhushare $(UNSHARE_DATNODLB) ; \ $(CHGRP) $(GAMEGRP) nhushare $(UNSHARE_DATNODLB) ; \ chmod $(FILEPERM) nhushare $(UNSHARE_DATNODLB) ) dofiles-nodlb: # copy over the game files ( cd dat ; cp $(SHARE_DAT) $(FILE_AREA_SHARE) ) ( cd dat ; cp $(UNSHARE_DAT) $(FILE_AREA_UNSHARE) ) # set up their permissions -( cd $(FILE_AREA_SHARE) ; $(CHOWN) $(GAMEUID) $(SHARE_DAT) ; \ $(CHGRP) $(GAMEGRP) $(SHARE_DAT) ; \ chmod $(FILEPERM) $(SHARE_DAT) ) -( cd $(FILE_AREA_UNSHARE) ; $(CHOWN) $(GAMEUID) $(UNSHARE_DAT) ; \ $(CHGRP) $(GAMEGRP) $(UNSHARE_DAT) ; \ chmod $(FILEPERM) $(UNSHARE_DAT) ) update: $(GAME) recover $(CNF_SHARE_DAT) dungeon spec_levs Guidebook.txt # (don't yank the old version out from under people who're playing it) -mv $(FILE_AREA_UNSHARE)/$(GAME) $(FILE_AREA_UNSHARE)/$(GAME).old # quest.dat is also kept open and has the same problems over NFS # (quest.dat may be inside nhushare if dlb is in use) -mv $(FILE_AREA_UNSHARE)/quest.dat $(FILE_AREA_UNSHARE)/quest.dat.old -mv $(FILE_AREA_UNSHARE)/nhushare $(FILE_AREA_UNSHARE)/nhushare.old # set up new versions of the game files ( $(MAKE) dofiles ) # touch time-sensitive files -touch -c $(FILE_AREA_BONES)/bones* $(FILE_AREA_VAR)/?lock* -touch -c $(FILE_AREA_VAR)/wizard* $(FILE_AREA_SAVE)/* touch $(FILE_AREA_VAR)/perm $(FILE_AREA_VAR)/record # and a reminder @echo You may also want to install the man pages via the doc Makefile. install: $(GAME) recover $(CNF_SHARE_DAT) dungeon spec_levs Guidebook.txt # set up the directories # not all mkdirs have -p; those that don't will create a -p directory -mkdir -p $(SHELLDIR) -rm -rf $(FILE_AREA_VAR) $(FILE_AREA_BONES) $(FILE_AREA_SAVE) -rm -rf $(FILE_AREA_LEVL) $(FILE_AREA_SHARE) $(FILE_AREA_UNSHARE) -rm -rf $(FILE_AREA_DOC) -mkdir -p $(FILE_AREA_VAR) $(FILE_AREA_BONES) $(FILE_AREA_SAVE) -mkdir -p $(FILE_AREA_LEVL) $(FILE_AREA_SHARE) $(FILE_AREA_UNSHARE) -mkdir -p $(FILE_AREA_DOC) -rmdir ./-p -$(CHOWN) $(GAMEUID) $(FILE_AREA_VAR) $(FILE_AREA_BONES) $(FILE_AREA_SAVE) $(FILE_AREA_LEVL) $(CHGRP) $(GAMEGRP) $(FILE_AREA_VAR) $(FILE_AREA_BONES) $(FILE_AREA_SAVE) $(FILE_AREA_LEVL) chmod $(VARDIRPERM) $(FILE_AREA_VAR) $(FILE_AREA_BONES) $(FILE_AREA_SAVE) $(FILE_AREA_LEVL) -$(CHOWN) $(GAMEUID) $(FILE_AREA_SHARE) $(FILE_AREA_UNSHARE) $(CHGRP) $(GAMEGRP) $(FILE_AREA_SHARE) $(FILE_AREA_UNSHARE) chmod $(DIRPERM) $(FILE_AREA_SHARE) $(FILE_AREA_UNSHARE) # set up the game files ( $(MAKE) dofiles ) # set up some additional files touch $(FILE_AREA_VAR)/perm $(FILE_AREA_VAR)/record $(FILE_AREA_VAR)/logfile -( cd $(FILE_AREA_VAR) ; $(CHOWN) $(GAMEUID) perm record logfile ; \ $(CHGRP) $(GAMEGRP) perm record logfile ; \ chmod $(VARFILEPERM) perm record logfile ) # and a reminder @echo You may also want to reinstall the man pages via the doc Makefile. # 'make clean' removes all the .o files, but leaves around all the executables # and compiled data files clean: ( cd src ; $(MAKE) clean ) ( cd util ; $(MAKE) clean ) # 'make spotless' returns the source tree to near-distribution condition. # it removes .o files, executables, and compiled data files spotless: ( cd src ; $(MAKE) spotless ) ( cd util ; $(MAKE) spotless ) ( cd dat ; $(MAKE) spotless ) ( cd doc ; $(MAKE) spotless ) slashem-0.0.7E7F3/sys/unix/cpp3.shr0000664000076400007640000014516210545462317015051 0ustar aliali# This is a shell archive. Save it in a file, remove anything before # this line, and then unpack it by entering "sh file". Note, it may # create directories; files and directories will be owned by you and # have default permissions. # # This archive contains: # # cpp5.c # cpp6.c # echo x - cpp5.c sed 's/^X//' >cpp5.c << 'END-of-cpp5.c' X/* X * C P P 5 . C X * E x p r e s s i o n E v a l u a t i o n X * X * Edit History X * 31-Aug-84 MM USENET net.sources release X * 04-Oct-84 MM __LINE__ and __FILE__ must call ungetstring() X * so they work correctly with token concatenation. X * Added string formal recognition. X * 25-Oct-84 MM "Short-circuit" evaluate #if's so that we X * don't print unnecessary error messages for X * #if !defined(FOO) && FOO != 0 && 10 / FOO ... X * 31-Oct-84 ado/MM Added token concatenation X * 6-Nov-84 MM Split from #define stuff, added sizeof stuff X * 19-Nov-84 ado #if error returns TRUE for (sigh) compatibility X */ X X#include X#include X#include "cppdef.h" X#include "cpp.h" X X/* X * Evaluate an #if expression. X */ X Xstatic char *opname[] = { /* For debug and error messages */ X"end of expression", "val", "id", X "+", "-", "*", "/", "%", X "<<", ">>", "&", "|", "^", X "==", "!=", "<", "<=", ">=", ">", X "&&", "||", "?", ":", ",", X "unary +", "unary -", "~", "!", "(", ")", "(none)", X}; X X/* X * opdope[] has the operator precedence: X * Bits X * 7 Unused (so the value is always positive) X * 6-2 Precedence (000x .. 017x) X * 1-0 Binary op. flags: X * 01 The binop flag should be set/cleared when this op is seen. X * 10 The new value of the binop flag. X * Note: Expected, New binop X * constant 0 1 Binop, end, or ) should follow constants X * End of line 1 0 End may not be preceeded by an operator X * binary 1 0 Binary op follows a value, value follows. X * unary 0 0 Unary op doesn't follow a value, value follows X * ( 0 0 Doesn't follow value, value or unop follows X * ) 1 1 Follows value. Op follows. X */ X Xstatic char opdope[OP_MAX] = { X 0001, /* End of expression */ X 0002, /* Digit */ X 0000, /* Letter (identifier) */ X 0141, 0141, 0151, 0151, 0151, /* ADD, SUB, MUL, DIV, MOD */ X 0131, 0131, 0101, 0071, 0071, /* ASL, ASR, AND, OR, XOR */ X 0111, 0111, 0121, 0121, 0121, 0121, /* EQ, NE, LT, LE, GE, GT */ X 0061, 0051, 0041, 0041, 0031, /* ANA, ORO, QUE, COL, CMA */ X/* X * Unary op's follow X */ X 0160, 0160, 0160, 0160, /* NEG, PLU, COM, NOT */ X 0170, 0013, 0023, /* LPA, RPA, END */ X}; X/* X * OP_QUE and OP_RPA have alternate precedences: X */ X#define OP_RPA_PREC 0013 X#define OP_QUE_PREC 0034 X X/* X * S_ANDOR and S_QUEST signal "short-circuit" boolean evaluation, so that X * #if FOO != 0 && 10 / FOO ... X * doesn't generate an error message. They are stored in optab.skip. X */ X#define S_ANDOR 2 X#define S_QUEST 1 X Xtypedef struct optab { X char op; /* Operator */ X char prec; /* Its precedence */ X char skip; /* Short-circuit: TRUE to skip */ X} OPTAB; Xstatic int evalue; /* Current value from evallex() */ X X#ifdef nomacargs XFILE_LOCAL int Xisbinary(op) Xregister int op; X{ X return (op >= FIRST_BINOP && op <= LAST_BINOP); X} X XFILE_LOCAL int Xisunary(op) Xregister int op; X{ X return (op >= FIRST_UNOP && op <= LAST_UNOP); X} X#else X#define isbinary(op) (op >= FIRST_BINOP && op <= LAST_BINOP) X#define isunary(op) (op >= FIRST_UNOP && op <= LAST_UNOP) X#endif X X/* X * The following definitions are used to specify basic variable sizes. X */ X X#ifndef S_CHAR X#define S_CHAR (sizeof (char)) X#endif X#ifndef S_SINT X#define S_SINT (sizeof (short int)) X#endif X#ifndef S_INT X#define S_INT (sizeof (int)) X#endif X#ifndef S_LINT X#define S_LINT (sizeof (long int)) X#endif X#ifndef S_FLOAT X#define S_FLOAT (sizeof (float)) X#endif X#ifndef S_DOUBLE X#define S_DOUBLE (sizeof (double)) X#endif X#ifndef S_PCHAR X#define S_PCHAR (sizeof (char *)) X#endif X#ifndef S_PSINT X#define S_PSINT (sizeof (short int *)) X#endif X#ifndef S_PINT X#define S_PINT (sizeof (int *)) X#endif X#ifndef S_PLINT X#define S_PLINT (sizeof (long int *)) X#endif X#ifndef S_PFLOAT X#define S_PFLOAT (sizeof (float *)) X#endif X#ifndef S_PDOUBLE X#define S_PDOUBLE (sizeof (double *)) X#endif X#ifndef S_PFPTR X#define S_PFPTR (sizeof (int (*)())) X#endif X Xtypedef struct types { X short type; /* This is the bit if */ X char *name; /* this is the token word */ X} TYPES; X Xstatic TYPES basic_types[] = { X { T_CHAR, "char", }, X { T_INT, "int", }, X { T_FLOAT, "float", }, X { T_DOUBLE, "double", }, X { T_SHORT, "short", }, X { T_LONG, "long", }, X { T_SIGNED, "signed", }, X { T_UNSIGNED, "unsigned", }, X { 0, NULL, }, /* Signal end */ X}; X X/* X * Test_table[] is used to test for illegal combinations. X */ Xstatic short test_table[] = { X T_FLOAT | T_DOUBLE | T_LONG | T_SHORT, X T_FLOAT | T_DOUBLE | T_CHAR | T_INT, X T_FLOAT | T_DOUBLE | T_SIGNED | T_UNSIGNED, X T_LONG | T_SHORT | T_CHAR, X 0 /* end marker */ X}; X X/* X * The order of this table is important -- it is also referenced by X * the command line processor to allow run-time overriding of the X * built-in size values. The order must not be changed: X * char, short, int, long, float, double (func pointer) X */ XSIZES size_table[] = { X { T_CHAR, S_CHAR, S_PCHAR }, /* char */ X { T_SHORT, S_SINT, S_PSINT }, /* short int */ X { T_INT, S_INT, S_PINT }, /* int */ X { T_LONG, S_LINT, S_PLINT }, /* long */ X { T_FLOAT, S_FLOAT, S_PFLOAT }, /* float */ X { T_DOUBLE, S_DOUBLE, S_PDOUBLE }, /* double */ X { T_FPTR, 0, S_PFPTR }, /* int (*()) */ X { 0, 0, 0 }, /* End of table */ X}; X Xint Xeval() X/* X * Evaluate an expression. Straight-forward operator precedence. X * This is called from control() on encountering an #if statement. X * It calls the following routines: X * evallex Lexical analyser -- returns the type and value of X * the next input token. X * evaleval Evaluate the current operator, given the values on X * the value stack. Returns a pointer to the (new) X * value stack. X * For compatiblity with older cpp's, this return returns 1 (TRUE) X * if a syntax error is detected. X */ X{ X register int op; /* Current operator */ X register int *valp; /* -> value vector */ X register OPTAB *opp; /* Operator stack */ X int prec; /* Op precedence */ X int binop; /* Set if binary op. needed */ X int op1; /* Operand from stack */ X int skip; /* For short-circuit testing */ X int value[NEXP]; /* Value stack */ X OPTAB opstack[NEXP]; /* Operand stack */ X extern int *evaleval(); /* Does actual evaluation */ X X valp = value; X opp = opstack; X opp->op = OP_END; /* Mark bottom of stack */ X opp->prec = opdope[OP_END]; /* And its precedence */ X opp->skip = 0; /* Not skipping now */ X binop = 0; Xagain: ; X#ifdef DEBUG_EVAL X printf("In #if at again: skip = %d, binop = %d, line is: %s", X opp->skip, binop, infile->bptr); X#endif X if ((op = evallex(opp->skip)) == OP_SUB && binop == 0) X op = OP_NEG; /* Unary minus */ X else if (op == OP_ADD && binop == 0) X op = OP_PLU; /* Unary plus */ X else if (op == OP_FAIL) X return (1); /* Error in evallex */ X#ifdef DEBUG_EVAL X printf("op = %s, opdope = %03o, binop = %d, skip = %d\n", X opname[op], opdope[op], binop, opp->skip); X#endif X if (op == DIG) { /* Value? */ X if (binop != 0) { X cerror("misplaced constant in #if", NULLST); X return (1); X } X else if (valp >= &value[NEXP-1]) { X cerror("#if value stack overflow", NULLST); X return (1); X } X else { X#ifdef DEBUG_EVAL X printf("pushing %d onto value stack[%d]\n", X evalue, valp - value); X#endif X *valp++ = evalue; X binop = 1; X } X goto again; X } X else if (op > OP_END) { X cerror("Illegal #if line", NULLST); X return (1); X } X prec = opdope[op]; X if (binop != (prec & 1)) { X cerror("Operator %s in incorrect context", opname[op]); X return (1); X } X binop = (prec & 2) >> 1; X for (;;) { X#ifdef DEBUG_EVAL X printf("op %s, prec %d., stacked op %s, prec %d, skip %d\n", X opname[op], prec, opname[opp->op], opp->prec, opp->skip); X#endif X if (prec > opp->prec) { X if (op == OP_LPA) X prec = OP_RPA_PREC; X else if (op == OP_QUE) X prec = OP_QUE_PREC; X op1 = opp->skip; /* Save skip for test */ X /* X * Push operator onto op. stack. X */ X opp++; X if (opp >= &opstack[NEXP]) { X cerror("expression stack overflow at op \"%s\"", X opname[op]); X return (1); X } X opp->op = op; X opp->prec = prec; X skip = (valp[-1] != 0); /* Short-circuit tester */ X /* X * Do the short-circuit stuff here. Short-circuiting X * stops automagically when operators are evaluated. X */ X if ((op == OP_ANA && !skip) X || (op == OP_ORO && skip)) X opp->skip = S_ANDOR; /* And/or skip starts */ X else if (op == OP_QUE) /* Start of ?: operator */ X opp->skip = (op1 & S_ANDOR) | ((!skip) ? S_QUEST : 0); X else if (op == OP_COL) { /* : inverts S_QUEST */ X opp->skip = (op1 & S_ANDOR) X | (((op1 & S_QUEST) != 0) ? 0 : S_QUEST); X } X else { /* Other ops leave */ X opp->skip = op1; /* skipping unchanged. */ X } X#ifdef DEBUG_EVAL X printf("stacking %s, valp[-1] == %d at %s", X opname[op], valp[-1], infile->bptr); X dumpstack(opstack, opp, value, valp); X#endif X goto again; X } X /* X * Pop operator from op. stack and evaluate it. X * End of stack and '(' are specials. X */ X skip = opp->skip; /* Remember skip value */ X switch ((op1 = opp->op)) { /* Look at stacked op */ X case OP_END: /* Stack end marker */ X if (op == OP_EOE) X return (valp[-1]); /* Finished ok. */ X goto again; /* Read another op. */ X X case OP_LPA: /* ( on stack */ X if (op != OP_RPA) { /* Matches ) on input */ X cerror("unbalanced paren's, op is \"%s\"", opname[op]); X return (1); X } X opp--; /* Unstack it */ X /* goto again; -- Fall through */ X X case OP_QUE: X goto again; /* Evaluate true expr. */ X X case OP_COL: /* : on stack. */ X opp--; /* Unstack : */ X if (opp->op != OP_QUE) { /* Matches ? on stack? */ X cerror("Misplaced '?' or ':', previous operator is %s", X opname[opp->op]); X return (1); X } X /* X * Evaluate op1. X */ X default: /* Others: */ X opp--; /* Unstack the operator */ X#ifdef DEBUG_EVAL X printf("Stack before evaluation of %s\n", opname[op1]); X dumpstack(opstack, opp, value, valp); X#endif X valp = evaleval(valp, op1, skip); X#ifdef DEBUG_EVAL X printf("Stack after evaluation\n"); X dumpstack(opstack, opp, value, valp); X#endif X } /* op1 switch end */ X } /* Stack unwind loop */ X} X XFILE_LOCAL int Xevallex(skip) Xint skip; /* TRUE if short-circuit evaluation */ X/* X * Return next eval operator or value. Called from eval(). It X * calls a special-purpose routines for 'char' strings and X * numeric values: X * evalchar called to evaluate 'x' X * evalnum called to evaluate numbers. X */ X{ X register int c, c1, t; X Xagain: do { /* Collect the token */ X c = skipws(); X if ((c = macroid(c)) == EOF_CHAR || c == '\n') { X unget(); X return (OP_EOE); /* End of expression */ X } X } while ((t = type[c]) == LET && catenate()); X if (t == INV) { /* Total nonsense */ X if (!skip) { X if (isascii(c) && isprint(c)) X cierror("illegal character '%c' in #if", c); X else X cierror("illegal character (%d decimal) in #if", c); X } X return (OP_FAIL); X } X else if (t == QUO) { /* ' or " */ X if (c == '\'') { /* Character constant */ X evalue = evalchar(skip); /* Somewhat messy */ X#ifdef DEBUG_EVAL X printf("evalchar returns %d.\n", evalue); X#endif X return (DIG); /* Return a value */ X } X cerror("Can't use a string in an #if", NULLST); X return (OP_FAIL); X } X else if (t == LET) { /* ID must be a macro */ X if (streq(token, "defined")) { /* Or defined name */ X c1 = c = skipws(); X if (c == '(') /* Allow defined(name) */ X c = skipws(); X if (type[c] == LET) { X evalue = (lookid(c) != NULL); X if (c1 != '(' /* Need to balance */ X || skipws() == ')') /* Did we balance? */ X return (DIG); /* Parsed ok */ X } X cerror("Bad #if ... defined() syntax", NULLST); X return (OP_FAIL); X } X else if (streq(token, "sizeof")) /* New sizeof hackery */ X return (dosizeof()); /* Gets own routine */ X /* X * The Draft ANSI C Standard says that an undefined symbol X * in an #if has the value zero. We are a bit pickier, X * warning except where the programmer was careful to write X * #if defined(foo) ? foo : 0 X */ X#ifdef VERBOSE X if (!skip) X cwarn("undefined symbol \"%s\" in #if, 0 used", token); X#endif X evalue = 0; X return (DIG); X } X else if (t == DIG) { /* Numbers are harder */ X evalue = evalnum(c); X#ifdef DEBUG_EVAL X printf("evalnum returns %d.\n", evalue); X#endif X } X else if (strchr("!=<>&|\\", c) != NULL) { X /* X * Process a possible multi-byte lexeme. X */ X c1 = cget(); /* Peek at next char */ X switch (c) { X case '!': X if (c1 == '=') X return (OP_NE); X break; X X case '=': X if (c1 != '=') { /* Can't say a=b in #if */ X unget(); X cerror("= not allowed in #if", NULLST); X return (OP_FAIL); X } X return (OP_EQ); X X case '>': X case '<': X if (c1 == c) X return ((c == '<') ? OP_ASL : OP_ASR); X else if (c1 == '=') X return ((c == '<') ? OP_LE : OP_GE); X break; X X case '|': X case '&': X if (c1 == c) X return ((c == '|') ? OP_ORO : OP_ANA); X break; X X case '\\': X if (c1 == '\n') /* Multi-line if */ X goto again; X cerror("Unexpected \\ in #if", NULLST); X return (OP_FAIL); X } X unget(); X } X return (t); X} X XFILE_LOCAL int Xdosizeof() X/* X * Process the sizeof (basic type) operation in an #if string. X * Sets evalue to the size and returns X * DIG success X * OP_FAIL bad parse or something. X */ X{ X register int c; X register TYPES *tp; X register SIZES *sizp; X register short *testp; X short typecode; X X if ((c = skipws()) != '(') X goto nogood; X /* X * Scan off the tokens. X */ X typecode = 0; X while ((c = skipws())) { X if ((c = macroid(c)) == EOF_CHAR || c == '\n') X goto nogood; /* End of line is a bug */ X else if (c == '(') { /* thing (*)() func ptr */ X if (skipws() == '*' X && skipws() == ')') { /* We found (*) */ X if (skipws() != '(') /* Let () be optional */ X unget(); X else if (skipws() != ')') X goto nogood; X typecode |= T_FPTR; /* Function pointer */ X } X else { /* Junk is a bug */ X goto nogood; X } X } X else if (type[c] != LET) /* Exit if not a type */ X break; X else if (!catenate()) { /* Maybe combine tokens */ X /* X * Look for this unexpandable token in basic_types. X * The code accepts "int long" as well as "long int" X * which is a minor bug as bugs go (and one shared with X * a lot of C compilers). X */ X for (tp = basic_types; tp->name != NULLST; tp++) { X if (streq(token, tp->name)) X break; X } X if (tp->name == NULLST) { X cerror("#if sizeof, unknown type \"%s\"", token); X return (OP_FAIL); X } X typecode |= tp->type; /* Or in the type bit */ X } X } X /* X * We are at the end of the type scan. Chew off '*' if necessary. X */ X if (c == '*') { X typecode |= T_PTR; X c = skipws(); X } X if (c == ')') { /* Last syntax check */ X for (testp = test_table; *testp != 0; testp++) { X if (!bittest(typecode & *testp)) { X cerror("#if ... sizeof: illegal type combination", NULLST); X return (OP_FAIL); X } X } X /* X * We assume that all function pointers are the same size: X * sizeof (int (*)()) == sizeof (float (*)()) X * We assume that signed and unsigned don't change the size: X * sizeof (signed int) == (sizeof unsigned int) X */ X if ((typecode & T_FPTR) != 0) /* Function pointer */ X typecode = T_FPTR | T_PTR; X else { /* Var or var * datum */ X typecode &= ~(T_SIGNED | T_UNSIGNED); X if ((typecode & (T_SHORT | T_LONG)) != 0) X typecode &= ~T_INT; X } X if ((typecode & ~T_PTR) == 0) { X cerror("#if sizeof() error, no type specified", NULLST); X return (OP_FAIL); X } X /* X * Exactly one bit (and possibly T_PTR) may be set. X */ X for (sizp = size_table; sizp->bits != 0; sizp++) { X if ((typecode & ~T_PTR) == sizp->bits) { X evalue = ((typecode & T_PTR) != 0) X ? sizp->psize : sizp->size; X return (DIG); X } X } /* We shouldn't fail */ X cierror("#if ... sizeof: bug, unknown type code 0x%x", typecode); X return (OP_FAIL); X } X Xnogood: unget(); X cerror("#if ... sizeof() syntax error", NULLST); X return (OP_FAIL); X} X XFILE_LOCAL int Xbittest(value) X/* X * TRUE if value is zero or exactly one bit is set in value. X */ X{ X#if (4096 & ~(-4096)) == 0 X return ((value & ~(-value)) == 0); X#else X /* X * Do it the hard way (for non 2's complement machines) X */ X return (value == 0 || value ^ (value - 1) == (value * 2 - 1)); X#endif X} X XFILE_LOCAL int Xevalnum(c) Xregister int c; X/* X * Expand number for #if lexical analysis. Note: evalnum recognizes X * the unsigned suffix, but only returns a signed int value. X */ X{ X register int value; X register int base; X register int c1; X X if (c != '0') X base = 10; X else if ((c = cget()) == 'x' || c == 'X') { X base = 16; X c = cget(); X } X else base = 8; X value = 0; X for (;;) { X c1 = c; X if (isascii(c) && isupper(c1)) X c1 = tolower(c1); X if (c1 >= 'a') X c1 -= ('a' - 10); X else c1 -= '0'; X if (c1 < 0 || c1 >= base) X break; X value *= base; X value += c1; X c = cget(); X } X if (c == 'u' || c == 'U') /* Unsigned nonsense */ X c = cget(); X unget(); X return (value); X} X XFILE_LOCAL int Xevalchar(skip) Xint skip; /* TRUE if short-circuit evaluation */ X/* X * Get a character constant X */ X{ X register int c; X register int value; X register int count; X X instring = TRUE; X if ((c = cget()) == '\\') { X switch ((c = cget())) { X case 'a': /* New in Standard */ X#if ('a' == '\a' || '\a' == ALERT) X value = ALERT; /* Use predefined value */ X#else X value = '\a'; /* Use compiler's value */ X#endif X break; X X case 'b': X value = '\b'; X break; X X case 'f': X value = '\f'; X break; X X case 'n': X value = '\n'; X break; X X case 'r': X value = '\r'; X break; X X case 't': X value = '\t'; X break; X X case 'v': /* New in Standard */ X#if ('v' == '\v' || '\v' == VT) X value = VT; /* Use predefined value */ X#else X value = '\v'; /* Use compiler's value */ X#endif X break; X X case 'x': /* '\xFF' */ X count = 3; X value = 0; X while ((((c = get()) >= '0' && c <= '9') X || (c >= 'a' && c <= 'f') X || (c >= 'A' && c <= 'F')) X && (--count >= 0)) { X value *= 16; X value += (c <= '9') ? (c - '0') : ((c & 0xF) + 9); X } X unget(); X break; X X default: X if (c >= '0' && c <= '7') { X count = 3; X value = 0; X while (c >= '0' && c <= '7' && --count >= 0) { X value *= 8; X value += (c - '0'); X c = get(); X } X unget(); X } X else value = c; X break; X } X } X else if (c == '\'') X value = 0; X else value = c; X /* X * We warn on multi-byte constants and try to hack X * (big|little)endian machines. X */ X#if BIG_ENDIAN X count = 0; X#endif X while ((c = get()) != '\'' && c != EOF_CHAR && c != '\n') { X if (!skip) X ciwarn("multi-byte constant '%c' isn't portable", c); X#if BIG_ENDIAN X count += BITS_CHAR; X value += (c << count); X#else X value <<= BITS_CHAR; X value += c; X#endif X } X instring = FALSE; X return (value); X} X XFILE_LOCAL int * Xevaleval(valp, op, skip) Xregister int *valp; Xint op; Xint skip; /* TRUE if short-circuit evaluation */ X/* X * Apply the argument operator to the data on the value stack. X * One or two values are popped from the value stack and the result X * is pushed onto the value stack. X * X * OP_COL is a special case. X * X * evaleval() returns the new pointer to the top of the value stack. X */ X{ X register int v1, v2; X X if (isbinary(op)) X v2 = *--valp; X v1 = *--valp; X#ifdef DEBUG_EVAL X printf("%s op %s", (isbinary(op)) ? "binary" : "unary", X opname[op]); X if (isbinary(op)) X printf(", v2 = %d.", v2); X printf(", v1 = %d.\n", v1); X#endif X switch (op) { X case OP_EOE: X break; X X case OP_ADD: X v1 += v2; X break; X X case OP_SUB: X v1 -= v2; X break; X X case OP_MUL: X v1 *= v2; X break; X X case OP_DIV: X case OP_MOD: X if (v2 == 0) { X if (!skip) { X cwarn("%s by zero in #if, zero result assumed", X (op == OP_DIV) ? "divide" : "mod"); X } X v1 = 0; X } X else if (op == OP_DIV) X v1 /= v2; X else X v1 %= v2; X break; X X case OP_ASL: X v1 <<= v2; X break; X X case OP_ASR: X v1 >>= v2; X break; X X case OP_AND: X v1 &= v2; X break; X X case OP_OR: X v1 |= v2; X break; X X case OP_XOR: X v1 ^= v2; X break; X X case OP_EQ: X v1 = (v1 == v2); X break; X X case OP_NE: X v1 = (v1 != v2); X break; X X case OP_LT: X v1 = (v1 < v2); X break; X X case OP_LE: X v1 = (v1 <= v2); X break; X X case OP_GE: X v1 = (v1 >= v2); X break; X X case OP_GT: X v1 = (v1 > v2); X break; X X case OP_ANA: X v1 = (v1 && v2); X break; X X case OP_ORO: X v1 = (v1 || v2); X break; X X case OP_COL: X /* X * v1 has the "true" value, v2 the "false" value. X * The top of the value stack has the test. X */ X v1 = (*--valp) ? v1 : v2; X break; X X case OP_NEG: X v1 = (-v1); X break; X X case OP_PLU: X break; X X case OP_COM: X v1 = ~v1; X break; X X case OP_NOT: X v1 = !v1; X break; X X default: X cierror("#if bug, operand = %d.", op); X v1 = 0; X } X *valp++ = v1; X return (valp); X} X X#ifdef DEBUG_EVAL Xdumpstack(opstack, opp, value, valp) XOPTAB opstack[NEXP]; /* Operand stack */ Xregister OPTAB *opp; /* Operator stack */ Xint value[NEXP]; /* Value stack */ Xregister int *valp; /* -> value vector */ X{ X printf("index op prec skip name -- op stack at %s", infile->bptr); X while (opp > opstack) { X printf(" [%2d] %2d %03o %d %s\n", opp - opstack, X opp->op, opp->prec, opp->skip, opname[opp->op]); X opp--; X } X while (--valp >= value) { X printf("value[%d] = %d\n", (valp - value), *valp); X } X} X#endif X END-of-cpp5.c echo x - cpp6.c sed 's/^X//' >cpp6.c << 'END-of-cpp6.c' X/* X * C P P 6 . C X * S u p p o r t R o u t i n e s X * X * Edit History X * 25-May-84 MM Added 8-bit support to type table. X * 30-May-84 ARF sharp() should output filename in quotes X * 02-Aug-84 MM Newline and #line hacking. sharp() now in cpp1.c X * 31-Aug-84 MM USENET net.sources release X * 11-Sep-84 ado/MM Keepcomments, also line number pathological X * 12-Sep-84 ado/MM bug if comment changes to space and we unget later. X * 03-Oct-84 gkr/MM Fixed scannumber bug for '.e' (as in struct.element). X * 04-Oct-84 MM Added ungetstring() for token concatenation X * 08-Oct-84 MM Yet another attack on number scanning X * 31-Oct-84 ado Parameterized $ in identifiers X * 2-Nov-84 MM Token concatenation is messier than I thought X * 6-Dec-84 MM \ is everywhere invisible. X */ X X#include X#include X#include "cppdef.h" X#include "cpp.h" X X/* X * skipnl() skips over input text to the end of the line. X * skipws() skips over "whitespace" (spaces or tabs), but X * not skip over the end of the line. It skips over X * TOK_SEP, however (though that shouldn't happen). X * scanid() reads the next token (C identifier) into token[]. X * The caller has already read the first character of X * the identifier. Unlike macroid(), the token is X * never expanded. X * macroid() reads the next token (C identifier) into token[]. X * If it is a #defined macro, it is expanded, and X * macroid() returns TRUE, otherwise, FALSE. X * catenate() Does the dirty work of token concatenation, TRUE if it did. X * scanstring() Reads a string from the input stream, calling X * a user-supplied function for each character. X * This function may be output() to write the X * string to the output file, or save() to save X * the string in the work buffer. X * scannumber() Reads a C numeric constant from the input stream, X * calling the user-supplied function for each X * character. (output() or save() as noted above.) X * save() Save one character in the work[] buffer. X * savestring() Saves a string in malloc() memory. X * getfile() Initialize a new FILEINFO structure, called when X * #include opens a new file, or a macro is to be X * expanded. X * getmem() Get a specified number of bytes from malloc memory. X * output() Write one character to stdout (calling putchar) -- X * implemented as a function so its address may be X * passed to scanstring() and scannumber(). X * lookid() Scans the next token (identifier) from the input X * stream. Looks for it in the #defined symbol table. X * Returns a pointer to the definition, if found, or NULL X * if not present. The identifier is stored in token[]. X * defnedel() Define enter/delete subroutine. Updates the X * symbol table. X * get() Read the next byte from the current input stream, X * handling end of (macro/file) input and embedded X * comments appropriately. Note that the global X * instring is -- essentially -- a parameter to get(). X * cget() Like get(), but skip over TOK_SEP. X * unget() Push last gotten character back on the input stream. X * cerror(), cwarn(), cfatal(), cierror(), ciwarn() X * These routines format an print messages to the user. X * cerror & cwarn take a format and a single string argument. X * cierror & ciwarn take a format and a single int (char) argument. X * cfatal takes a format and a single string argument. X */ X X/* X * This table must be rewritten for a non-Ascii machine. X * X * Note that several "non-visible" characters have special meaning: X * Hex 1D DEF_MAGIC -- a flag to prevent #define recursion. X * Hex 1E TOK_SEP -- a delimiter for token concatenation X * Hex 1F COM_SEP -- a zero-width whitespace for comment concatenation X */ X#if TOK_SEP != 0x1E || COM_SEP != 0x1F || DEF_MAGIC != 0x1D X << error type table isn't correct >> X#endif X X#if OK_DOLLAR X#define DOL LET X#else X#define DOL 000 X#endif X Xchar type[256] = { /* Character type codes Hex */ X END, 000, 000, 000, 000, 000, 000, 000, /* 00 */ X 000, SPA, 000, 000, 000, 000, 000, 000, /* 08 */ X 000, 000, 000, 000, 000, 000, 000, 000, /* 10 */ X 000, 000, 000, 000, 000, LET, 000, SPA, /* 18 */ X SPA,OP_NOT, QUO, 000, DOL,OP_MOD,OP_AND, QUO, /* 20 !"#$%&' */ XOP_LPA,OP_RPA,OP_MUL,OP_ADD, 000,OP_SUB, DOT,OP_DIV, /* 28 ()*+,-./ */ X DIG, DIG, DIG, DIG, DIG, DIG, DIG, DIG, /* 30 01234567 */ X DIG, DIG,OP_COL, 000, OP_LT, OP_EQ, OP_GT,OP_QUE, /* 38 89:;<=>? */ X 000, LET, LET, LET, LET, LET, LET, LET, /* 40 @ABCDEFG */ X LET, LET, LET, LET, LET, LET, LET, LET, /* 48 HIJKLMNO */ X LET, LET, LET, LET, LET, LET, LET, LET, /* 50 PQRSTUVW */ X LET, LET, LET, 000, BSH, 000,OP_XOR, LET, /* 58 XYZ[\]^_ */ X 000, LET, LET, LET, LET, LET, LET, LET, /* 60 `abcdefg */ X LET, LET, LET, LET, LET, LET, LET, LET, /* 68 hijklmno */ X LET, LET, LET, LET, LET, LET, LET, LET, /* 70 pqrstuvw */ X LET, LET, LET, 000, OP_OR, 000,OP_NOT, 000, /* 78 xyz{|}~ */ X 000, 000, 000, 000, 000, 000, 000, 000, /* 80 .. FF */ X 000, 000, 000, 000, 000, 000, 000, 000, /* 80 .. FF */ X 000, 000, 000, 000, 000, 000, 000, 000, /* 80 .. FF */ X 000, 000, 000, 000, 000, 000, 000, 000, /* 80 .. FF */ X 000, 000, 000, 000, 000, 000, 000, 000, /* 80 .. FF */ X 000, 000, 000, 000, 000, 000, 000, 000, /* 80 .. FF */ X 000, 000, 000, 000, 000, 000, 000, 000, /* 80 .. FF */ X 000, 000, 000, 000, 000, 000, 000, 000, /* 80 .. FF */ X}; X Xskipnl() X/* X * Skip to the end of the current input line. X */ X{ X register int c; X X do { /* Skip to newline */ X c = get(); X } while (c != '\n' && c != EOF_CHAR); X} X Xint Xskipws() X/* X * Skip over whitespace X */ X{ X register int c; X X do { /* Skip whitespace */ X c = get(); X#if COMMENT_INVISIBLE X } while (type[c] == SPA || c == COM_SEP); X#else X } while (type[c] == SPA); X#endif X return (c); X} X Xscanid(c) Xregister int c; /* First char of id */ X/* X * Get the next token (an id) into the token buffer. X * Note: this code is duplicated in lookid(). X * Change one, change both. X */ X{ X register char *bp; X X if (c == DEF_MAGIC) /* Eat the magic token */ X c = get(); /* undefiner. */ X bp = token; X do { X if (bp < &token[IDMAX]) /* token dim is IDMAX+1 */ X *bp++ = c; X c = get(); X } while (type[c] == LET || type[c] == DIG); X unget(); X *bp = EOS; X} X Xint Xmacroid(c) Xregister int c; X/* X * If c is a letter, scan the id. if it's #defined, expand it and scan X * the next character and try again. X * X * Else, return the character. If type[c] is a LET, the token is in token. X */ X{ X register DEFBUF *dp; X X if (infile != NULL && infile->fp != NULL) X recursion = 0; X while (type[c] == LET && (dp = lookid(c)) != NULL) { X expand(dp); X c = get(); X } X return (c); X} X Xint Xcatenate() X/* X * A token was just read (via macroid). X * If the next character is TOK_SEP, concatenate the next token X * return TRUE -- which should recall macroid after refreshing X * macroid's argument. If it is not TOK_SEP, unget() the character X * and return FALSE. X */ X{ X register int c; X register char *token1; X X#if OK_CONCAT X if (get() != TOK_SEP) { /* Token concatenation */ X unget(); X return (FALSE); X } X else { X token1 = savestring(token); /* Save first token */ X c = macroid(get()); /* Scan next token */ X switch(type[c]) { /* What was it? */ X case LET: /* An identifier, ... */ X if (strlen(token1) + strlen(token) >= NWORK) X cfatal("work buffer overflow doing %s #", token1); X sprintf(work, "%s%s", token1, token); X break; X X case DIG: /* A digit string */ X strcpy(work, token1); X workp = work + strlen(work); X do { X save(c); X } while ((c = get()) != TOK_SEP); X /* X * The trailing TOK_SEP is no longer needed. X */ X save(EOS); X break; X X default: /* An error, ... */ X if (isprint(c)) X cierror("Strange character '%c' after #", c); X else X cierror("Strange character (%d.) after #", c); X strcpy(work, token1); X unget(); X break; X } X /* X * work has the concatenated token and token1 has X * the first token (no longer needed). Unget the X * new (concatenated) token after freeing token1. X * Finally, setup to read the new token. X */ X free(token1); /* Free up memory */ X ungetstring(work); /* Unget the new thing, */ X return (TRUE); X } X#else X return (FALSE); /* Not supported */ X#endif X} X Xint Xscanstring(delim, outfun) Xregister int delim; /* ' or " */ Xint (*outfun)(); /* Output function */ X/* X * Scan off a string. Warning if terminated by newline or EOF. X * outfun() outputs the character -- to a buffer if in a macro. X * TRUE if ok, FALSE if error. X */ X{ X register int c; X X instring = TRUE; /* Don't strip comments */ X (*outfun)(delim); X while ((c = get()) != delim X && c != '\n' X && c != EOF_CHAR) { X (*outfun)(c); X if (c == '\\') X (*outfun)(get()); X } X instring = FALSE; X if (c == delim) { X (*outfun)(c); X return (TRUE); X } X else { X cerror("Unterminated string", NULLST); X unget(); X return (FALSE); X } X} X Xscannumber(c, outfun) Xregister int c; /* First char of number */ Xregister int (*outfun)(); /* Output/store func */ X/* X * Process a number. We know that c is from 0 to 9 or dot. X * Algorithm from Dave Conroy's Decus C. X */ X{ X register int radix; /* 8, 10, or 16 */ X int expseen; /* 'e' seen in floater */ X int signseen; /* '+' or '-' seen */ X int octal89; /* For bad octal test */ X int dotflag; /* TRUE if '.' was seen */ X X expseen = FALSE; /* No exponent seen yet */ X signseen = TRUE; /* No +/- allowed yet */ X octal89 = FALSE; /* No bad octal yet */ X radix = 10; /* Assume decimal */ X if ((dotflag = (c == '.')) != FALSE) { /* . something? */ X (*outfun)('.'); /* Always out the dot */ X if (type[(c = get())] != DIG) { /* If not a float numb, */ X unget(); /* Rescan strange char */ X return; /* All done for now */ X } X } /* End of float test */ X else if (c == '0') { /* Octal or hex? */ X (*outfun)(c); /* Stuff initial zero */ X radix = 8; /* Assume it's octal */ X c = get(); /* Look for an 'x' */ X if (c == 'x' || c == 'X') { /* Did we get one? */ X radix = 16; /* Remember new radix */ X (*outfun)(c); /* Stuff the 'x' */ X c = get(); /* Get next character */ X } X } X for (;;) { /* Process curr. char. */ X /* X * Note that this algorithm accepts "012e4" and "03.4" X * as legitimate floating-point numbers. X */ X if (radix != 16 && (c == 'e' || c == 'E')) { X if (expseen) /* Already saw 'E'? */ X break; /* Exit loop, bad nbr. */ X expseen = TRUE; /* Set exponent seen */ X signseen = FALSE; /* We can read '+' now */ X radix = 10; /* Decimal exponent */ X } X else if (radix != 16 && c == '.') { X if (dotflag) /* Saw dot already? */ X break; /* Exit loop, two dots */ X dotflag = TRUE; /* Remember the dot */ X radix = 10; /* Decimal fraction */ X } X else if (c == '+' || c == '-') { /* 1.0e+10 */ X if (signseen) /* Sign in wrong place? */ X break; /* Exit loop, not nbr. */ X /* signseen = TRUE; */ /* Remember we saw it */ X } X else { /* Check the digit */ X switch (c) { X case '8': case '9': /* Sometimes wrong */ X octal89 = TRUE; /* Do check later */ X case '0': case '1': case '2': case '3': X case '4': case '5': case '6': case '7': X break; /* Always ok */ X X case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': X case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': X if (radix == 16) /* Alpha's are ok only */ X break; /* if reading hex. */ X default: /* At number end */ X goto done; /* Break from for loop */ X } /* End of switch */ X } /* End general case */ X (*outfun)(c); /* Accept the character */ X signseen = TRUE; /* Don't read sign now */ X c = get(); /* Read another char */ X } /* End of scan loop */ X /* X * When we break out of the scan loop, c contains the first X * character (maybe) not in the number. If the number is an X * integer, allow a trailing 'L' for long and/or a trailing 'U' X * for unsigned. If not those, push the trailing character back X * on the input stream. Floating point numbers accept a trailing X * 'L' for "long double". X */ Xdone: if (dotflag || expseen) { /* Floating point? */ X if (c == 'l' || c == 'L') { X (*outfun)(c); X c = get(); /* Ungotten later */ X } X } X else { /* Else it's an integer */ X /* X * We know that dotflag and expseen are both zero, now: X * dotflag signals "saw 'L'", and X * expseen signals "saw 'U'". X */ X for (;;) { X switch (c) { X case 'l': X case 'L': X if (dotflag) X goto nomore; X dotflag = TRUE; X break; X X case 'u': X case 'U': X if (expseen) X goto nomore; X expseen = TRUE; X break; X X default: X goto nomore; X } X (*outfun)(c); /* Got 'L' or 'U'. */ X c = get(); /* Look at next, too. */ X } X } Xnomore: unget(); /* Not part of a number */ X if (octal89 && radix == 8) X cwarn("Illegal digit in octal number", NULLST); X} X Xsave(c) Xregister int c; X{ X if (workp >= &work[NWORK]) X cfatal("Work buffer overflow", NULLST); X else *workp++ = c; X} X Xchar * Xsavestring(text) Xchar *text; X/* X * Store a string into free memory. X */ X{ X register char *result; X X result = getmem(strlen(text) + 1); X strcpy(result, text); X return (result); X} X XFILEINFO * Xgetfile(bufsize, name) Xint bufsize; /* Line or define buffer size */ Xchar *name; /* File or macro name string */ X/* X * Common FILEINFO buffer initialization for a new file or macro. X */ X{ X register FILEINFO *file; X register int size; X X size = strlen(name); /* File/macro name */ X file = (FILEINFO *) getmem(sizeof (FILEINFO) + bufsize + size); X file->parent = infile; /* Chain files together */ X file->fp = NULL; /* No file yet */ X file->filename = savestring(name); /* Save file/macro name */ X file->progname = NULL; /* No #line seen yet */ X file->unrecur = 0; /* No macro fixup */ X file->bptr = file->buffer; /* Initialize line ptr */ X file->buffer[0] = EOS; /* Force first read */ X file->line = 0; /* (Not used just yet) */ X if (infile != NULL) /* If #include file */ X infile->line = line; /* Save current line */ X infile = file; /* New current file */ X line = 1; /* Note first line */ X return (file); /* All done. */ X} X Xchar * Xgetmem(size) Xint size; X/* X * Get a block of free memory. X */ X{ X register char *result; X extern char *malloc(); X X if ((result = malloc((unsigned) size)) == NULL) X cfatal("Out of memory", NULLST); X return (result); X} X X/* X * C P P S y m b o l T a b l e s X */ X X/* X * SBSIZE defines the number of hash-table slots for the symbol table. X * It must be a power of 2. X */ X#ifndef SBSIZE X#define SBSIZE 64 X#endif X#define SBMASK (SBSIZE - 1) X#if (SBSIZE ^ SBMASK) != ((SBSIZE * 2) - 1) X << error, SBSIZE must be a power of 2 >> X#endif X Xstatic DEFBUF *symtab[SBSIZE]; /* Symbol table queue headers */ X XDEFBUF * Xlookid(c) Xint c; /* First character of token */ X/* X * Look for the next token in the symbol table. Returns token in "token". X * If found, returns the table pointer; Else returns NULL. X */ X{ X register int nhash; X register DEFBUF *dp; X register char *np; X int temp; X int isrecurse; /* For #define foo foo */ X X np = token; X nhash = 0; X if ((isrecurse = (c == DEF_MAGIC))) /* If recursive macro */ X c = get(); /* hack, skip DEF_MAGIC */ X do { X if (np < &token[IDMAX]) { /* token dim is IDMAX+1 */ X *np++ = c; /* Store token byte */ X nhash += c; /* Update hash value */ X } X c = get(); /* And get another byte */ X } while (type[c] == LET || type[c] == DIG); X unget(); /* Rescan terminator */ X *np = EOS; /* Terminate token */ X if (isrecurse) /* Recursive definition */ X return (NULL); /* undefined just now */ X nhash += (np - token); /* Fix hash value */ X dp = symtab[nhash & SBMASK]; /* Starting bucket */ X while (dp != (DEFBUF *) NULL) { /* Search symbol table */ X if (dp->hash == nhash /* Fast precheck */ X && (temp = strcmp(dp->name, token)) >= 0) X break; X dp = dp->link; /* Nope, try next one */ X } X return ((temp == 0) ? dp : NULL); X} X XDEFBUF * Xdefendel(name, delete) Xchar *name; Xint delete; /* TRUE to delete a symbol */ X/* X * Enter this name in the lookup table (delete = FALSE) X * or delete this name (delete = TRUE). X * Returns a pointer to the define block (delete = FALSE) X * Returns NULL if the symbol wasn't defined (delete = TRUE). X */ X{ X register DEFBUF *dp; X register DEFBUF **prevp; X register char *np; X int nhash; X int temp; X int size; X X for (nhash = 0, np = name; *np != EOS;) X nhash += *np++; X size = (np - name); X nhash += size; X prevp = &symtab[nhash & SBMASK]; X while ((dp = *prevp) != (DEFBUF *) NULL) { X if (dp->hash == nhash X && (temp = strcmp(dp->name, name)) >= 0) { X if (temp > 0) X dp = NULL; /* Not found */ X else { X *prevp = dp->link; /* Found, unlink and */ X if (dp->repl != NULL) /* Free the replacement */ X free(dp->repl); /* if any, and then */ X free((char *) dp); /* Free the symbol */ X } X break; X } X prevp = &dp->link; X } X if (!delete) { X dp = (DEFBUF *) getmem(sizeof (DEFBUF) + size); X dp->link = *prevp; X *prevp = dp; X dp->hash = nhash; X dp->repl = NULL; X dp->nargs = 0; X strcpy(dp->name, name); X } X return (dp); X} X X#if DEBUG X Xdumpdef(why) Xchar *why; X{ X register DEFBUF *dp; X register DEFBUF **syp; X X printf("CPP symbol table dump %s\n", why); X for (syp = symtab; syp < &symtab[SBSIZE]; syp++) { X if ((dp = *syp) != (DEFBUF *) NULL) { X printf("symtab[%d]\n", (syp - symtab)); X do { X dumpadef((char *) NULL, dp); X } while ((dp = dp->link) != (DEFBUF *) NULL); X } X } X} X Xdumpadef(why, dp) Xchar *why; /* Notation */ Xregister DEFBUF *dp; X{ X register char *cp; X register int c; X X printf(" \"%s\" [%d]", dp->name, dp->nargs); X if (why != NULL) X printf(" (%s)", why); X if (dp->repl != NULL) { X printf(" => "); X for (cp = dp->repl; (c = *cp++ & 0xFF) != EOS;) { X if (c >= MAC_PARM && c <= (MAC_PARM + PAR_MAC)) X printf("<%d>", c - MAC_PARM); X else if (isprint(c) || c == '\n' || c == '\t') X putchar(c); X else if (c < ' ') X printf("<^%c>", c + '@'); X else X printf("<\\0%o>", c); X } X } X else { X printf(", no replacement."); X } X putchar('\n'); X} X#endif X X/* X * G E T X */ X Xint Xget() X/* X * Return the next character from a macro or the current file. X * Handle end of file from #include files. X */ X{ X register int c; X register FILEINFO *file; X register int popped; /* Recursion fixup */ X X popped = 0; Xget_from_file: X if ((file = infile) == NULL) X return (EOF_CHAR); Xnewline: X#if 0 X printf("get(%s), recursion %d, line %d, bptr = %d, buffer \"%s\"\n", X file->filename, recursion, line, X file->bptr - file->buffer, file->buffer); X#endif X /* X * Read a character from the current input line or macro. X * At EOS, either finish the current macro (freeing temp. X * storage) or read another line from the current input file. X * At EOF, exit the current file (#include) or, at EOF from X * the cpp input file, return EOF_CHAR to finish processing. X */ X if ((c = *file->bptr++ & 0xFF) == EOS) { X /* X * Nothing in current line or macro. Get next line (if X * input from a file), or do end of file/macro processing. X * In the latter case, jump back to restart from the top. X */ X if (file->fp == NULL) { /* NULL if macro */ X popped++; X recursion -= file->unrecur; X if (recursion < 0) X recursion = 0; X infile = file->parent; /* Unwind file chain */ X } X else { /* Else get from a file */ X if ((file->bptr = fgets(file->buffer, NBUFF, file->fp)) X != NULL) { X#if DEBUG X if (debug > 1) { /* Dump it to stdout */ X printf("\n#line %d (%s), %s", X line, file->filename, file->buffer); X } X#endif X goto newline; /* process the line */ X } X else { X fclose(file->fp); /* Close finished file */ X if ((infile = file->parent) != NULL) { X /* X * There is an "ungotten" newline in the current X * infile buffer (set there by doinclude() in X * cpp1.c). Thus, we know that the mainline code X * is skipping over blank lines and will do a X * #line at its convenience. X */ X wrongline = TRUE; /* Need a #line now */ X } X } X } X /* X * Free up space used by the (finished) file or macro and X * restart input from the parent file/macro, if any. X */ X free(file->filename); /* Free name and */ X if (file->progname != NULL) /* if a #line was seen, */ X free(file->progname); /* free it, too. */ X free((char *) file); /* Free file space */ X if (infile == NULL) /* If at end of file */ X return (EOF_CHAR); /* Return end of file */ X line = infile->line; /* Reset line number */ X goto get_from_file; /* Get from the top. */ X } X /* X * Common processing for the new character. X */ X if (c == DEF_MAGIC && file->fp != NULL) /* Don't allow delete */ X goto newline; /* from a file */ X if (file->parent != NULL) { /* Macro or #include */ X if (popped != 0) X file->parent->unrecur += popped; X else { X recursion -= file->parent->unrecur; X if (recursion < 0) X recursion = 0; X file->parent->unrecur = 0; X } X } X if (c == '\n') /* Maintain current */ X ++line; /* line counter */ X if (instring) /* Strings just return */ X return (c); /* the character. */ X else if (c == '/') { /* Comment? */ X instring = TRUE; /* So get() won't loop */ X if ((c = get()) != '*') { /* Next byte '*'? */ X instring = FALSE; /* Nope, no comment */ X unget(); /* Push the char. back */ X return ('/'); /* Return the slash */ X } X if (keepcomments) { /* If writing comments */ X putchar('/'); /* Write out the */ X putchar('*'); /* initializer */ X } X for (;;) { /* Eat a comment */ X c = get(); Xtest: if (keepcomments && c != EOF_CHAR) X cput(c); X switch (c) { X case EOF_CHAR: X cerror("EOF in comment", NULLST); X return (EOF_CHAR); X X case '/': X if ((c = get()) != '*') /* Don't let comments */ X goto test; /* Nest. */ X#ifdef VERBOSE X cwarn("Nested comments", NULLST); X#endif X /* Fall into * stuff */ X case '*': X if ((c = get()) != '/') /* If comment doesn't */ X goto test; /* end, look at next */ X instring = FALSE; /* End of comment, */ X if (keepcomments) { /* Put out the comment */ X cput(c); /* terminator, too */ X } X /* X * A comment is syntactically "whitespace" -- X * however, there are certain strange sequences X * such as X * #define foo(x) (something) X * foo|* comment *|(123) X * these are '/' ^ ^ X * where just returning space (or COM_SEP) will cause X * problems. This can be "fixed" by overwriting the X * '/' in the input line buffer with ' ' (or COM_SEP) X * but that may mess up an error message. X * So, we peek ahead -- if the next character is X * "whitespace" we just get another character, if not, X * we modify the buffer. All in the name of purity. X */ X if (*file->bptr == '\n' X || type[*file->bptr & 0xFF] == SPA) X goto newline; X#if COMMENT_INVISIBLE X /* X * Return magic (old-fashioned) syntactic space. X */ X return ((file->bptr[-1] = COM_SEP)); X#else X return ((file->bptr[-1] = ' ')); X#endif X X case '\n': /* we'll need a #line */ X if (!keepcomments) X wrongline = TRUE; /* later... */ X default: /* Anything else is */ X break; /* Just a character */ X } /* End switch */ X } /* End comment loop */ X } /* End if in comment */ X else if (!inmacro && c == '\\') { /* If backslash, peek */ X if ((c = get()) == '\n') { /* for a . If so, */ X wrongline = TRUE; X goto newline; X } X else { /* Backslash anything */ X unget(); /* Get it later */ X return ('\\'); /* Return the backslash */ X } X } X else if (c == '\f' || c == VT) /* Form Feed, Vertical */ X c = ' '; /* Tab are whitespace */ X return (c); /* Just return the char */ X} X Xunget() X/* X * Backup the pointer to reread the last character. Fatal error X * (code bug) if we backup too far. unget() may be called, X * without problems, at end of file. Only one character may X * be ungotten. If you need to unget more, call ungetstring(). X */ X{ X register FILEINFO *file; X X if ((file = infile) == NULL) X return; /* Unget after EOF */ X if (--file->bptr < file->buffer) X cfatal("Too much pushback", NULLST); X if (*file->bptr == '\n') /* Ungetting a newline? */ X --line; /* Unget the line number, too */ X} X Xungetstring(text) Xchar *text; X/* X * Push a string back on the input stream. This is done by treating X * the text as if it were a macro. X */ X{ X register FILEINFO *file; X extern FILEINFO *getfile(); X X file = getfile(strlen(text) + 1, ""); X strcpy(file->buffer, text); X} X Xint Xcget() X/* X * Get one character, absorb "funny space" after comments or X * token concatenation X */ X{ X register int c; X X do { X c = get(); X#if COMMENT_INVISIBLE X } while (c == TOK_SEP || c == COM_SEP); X#else X } while (c == TOK_SEP); X#endif X return (c); X} X X/* X * Error messages and other hacks. The first byte of severity X * is 'S' for string arguments and 'I' for int arguments. This X * is needed for portability with machines that have int's that X * are shorter than char *'s. X */ X Xstatic Xdomsg(severity, format, arg) Xchar *severity; /* "Error", "Warning", "Fatal" */ Xchar *format; /* Format for the error message */ Xchar *arg; /* Something for the message */ X/* X * Print filenames, macro names, and line numbers for error messages. X */ X{ X register char *tp; X register FILEINFO *file; X X fprintf(stderr, "%sline %d, %s: ", MSG_PREFIX, line, &severity[1]); X if (*severity == 'S') X fprintf(stderr, format, arg); X else X fprintf(stderr, format, (int) arg); X putc('\n', stderr); X if ((file = infile) == NULL) X return; /* At end of file */ X if (file->fp != NULL) { X tp = file->buffer; /* Print current file */ X fprintf(stderr, "%s", tp); /* name, making sure */ X if (tp[strlen(tp) - 1] != '\n') /* there's a newline */ X putc('\n', stderr); X } X while ((file = file->parent) != NULL) { /* Print #includes, too */ X if (file->fp == NULL) X fprintf(stderr, "from macro %s\n", file->filename); X else { X tp = file->buffer; X fprintf(stderr, "from file %s, line %d:\n%s", X (file->progname != NULL) X ? file->progname : file->filename, X file->line, tp); X if (tp[strlen(tp) - 1] != '\n') X putc('\n', stderr); X } X } X} X Xcerror(format, sarg) Xchar *format; Xchar *sarg; /* Single string argument */ X/* X * Print a normal error message, string argument. X */ X{ X domsg("SError", format, sarg); X errors++; X} X Xcierror(format, narg) Xchar *format; Xint narg; /* Single numeric argument */ X/* X * Print a normal error message, numeric argument. X */ X{ X domsg("IError", format, (char *) narg); X errors++; X} X Xcfatal(format, sarg) Xchar *format; Xchar *sarg; /* Single string argument */ X/* X * A real disaster X */ X{ X domsg("SFatal error", format, sarg); X exit(IO_ERROR); X} X Xcwarn(format, sarg) Xchar *format; Xchar *sarg; /* Single string argument */ X/* X * A non-fatal error, string argument. X */ X{ X domsg("SWarning", format, sarg); X} X Xciwarn(format, narg) Xchar *format; Xint narg; /* Single numeric argument */ X/* X * A non-fatal error, numeric argument. X */ X{ X domsg("IWarning", format, (char *) narg); X} X X X END-of-cpp6.c exit slashem-0.0.7E7F3/sys/atari/0000775000076400007640000000000010545462317013572 5ustar alialislashem-0.0.7E7F3/sys/atari/atarifnt.uue0000664000076400007640000001577410545462317016140 0ustar alialitable !"#$%&'()*+,-./0123456789:;<=>? @ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_ begin 644 hackfnt.arc M&@A(04-+1DY4+E!21P E!, #\48JO>BQ\= ,8#0 #" S4 ,! ! &@!Bz M8 "#D!2 > . !Q_P%!5= 'D!0(GN10.X('EB9,Z1L+0"<,&1!DY*5L<@-B,#H(!<(N' 8XIH'SYK3.CQSX057EA26DQ\r MPP$/)REU#@XPB$ 1!G0 0$(: &!033IT8:&$"0KPY1<)0XR@#%5_4O90D1D<"*$)%H((p M\1T&9O C)HDD(,.H$I#R \9 B%1Z::9HFB&+HHQ*\Q4@$&2 !" R (!$,"!Lo MB<0;",#!#S"!4 -(-P(L0$8"*1J 3#1,GNM,T),m M8$< (PQ#%1UHGB%!I5*81\>GD8;JCA"2@" %H 4R0 ')RW% P@\ZO " !H l M>>.0 !1) ))U+(4#""D*H,^.3/PP0)!!@"PRQ76 @!Z5/%1,5,HZ_(//"#Dk MD3,#: P3_2)LS)@#4:4< V708,0A\>,3@X(80P0Z%CR-^,G"0D)$00%@$8 ("#0CD i MH9 +/!B@4 E@R- J) ;$PX.,"_&PD$(&M E) 0B(=+E"&Q0."08%@,(T'ZM_h MKA !"\P)">$ , W)#6UN"HD&#F PX.P&% X&!U4"L"D&8.C$0&W"(P^ 3@ Xg M()(!LTNN4 %@Z#Z Y &(!(,>>IC1N4A;C)[Y["3$-E D(N%#EPT#F>] UAY(f M#PD"A1M^^.?^>,\ '_YP1_<,@P<( '/_CA@GXP #/ 8 PXK1 ?d M/O"#3FIH!C]X@#UM@H/Q . XZ7F' <#87^\P (/XF8$!/# ##. 711C R8H?c M!( )I<@#*RX$ QXP P8\@C&G(0L!G*"UB@ E,>"(?],"Z+YAO).@#b M !5:PSX9@0,$/O!! $PH(S^X@7A?[%__%@*!IOC Q#P0=; 8(#>#80-68,!a M#/#0/Q#B@ ,X\(<$J1YB$ ,,L*+Iz M$N,'#+APA"'<7/0 X_K-"%?/##0GHH0QKV<"'\<.$.=>)#]ASN<)MR'&R.y MF$2%',!TP6/B0'182PP03R?E7(@? ( /=(K1# ?! 9P\@('9P1&-:@%!_N"Xx M3@ LDG 04(8QC%&%.VJ. .E306O6N4YPQ& ,-A@ (;7H!OAE;IW]4Q$$_- 2w M"&RTDW!P0 8P@ $!$"%K>$!"_GA A;00!?^L,8 Q/@ .* 2%*I<2"M?N3DAv M N T*C@/\# !AR8$P=97(@!S"#/B8$!#DL5HSG] 9PFCV!P'T ">@:/Q:P ,:@$4.^_P/;XA7L%\Z+,& 6T-'4+3J#JQ!@CK20!C#&2IR;/EF_$1Z;!BKY;6g M,"\\P.@+'H2<>MP5KYIUPH<-V/I^8(!!G&,(J85$6XP'68@-L+%4-YAA&S>_f M<$!%(0M>\^,#^ #V/XRF@EJ8 \8R(L !,#L(9\?8#@Y@:B80(6=4,*"&,!"$e M'VKH[;ZX$)0D]4-K%@*-K]'U'(&HK37TH0M&=(*%'N! #CBQ95SH8"$(U(4.d M*GD >,P( /\PM3>JM/$9H1B7;#! +\4W$#B0\,B/(H86+D'.$&"D&\ZYE\$,!_VT$Z<^P-2KNVY1'5(b M5QC((+ULN* =W+"-"NM0)'H0A2X '41_RC8 $ !%7HQ#QGS "/?R&P.GVV a MI>+@'8C ,0K.+L5&L8%AMU4M6E5?.!^()*B?0P+#X%*2( ^2P B!P /X $2z MD >>H$K L$JJI$I^ $/X#Y?!'D&8 .31U))-0"ZA'FLQGF&8VG<$'HX%G+?y M90Q&YV+8T#LZX0\?A%YF)1(HN'DC]V/;!08?%(/(9U2' WO*A#T6IF8N! ;_x M4'P)<&IBM'F0)44N9'08@ TVH$-VX ??8'WPM! *H N[YFO>)V+# $JP $[w MH 4]A!' L&S)Q'X>Q 9F4&U@@ (8@':-@@+X!VYHUCL+D348 770P),Q0&Zv M8 _6@ W#0%4

@4X,@ TZ6'LP>'Y5-%< ( 0ZD3RUt M-SLSAV/8@ UAA0 'AGSOM!!&!V#3X S0)UX#9HR;PX6,]5/@$(;!1F)4@ 'Ss MX ;#\ _^ _P@%G!\&(QUGZ*=F-S" -H5T.J8 9 )F3($SRV*$L\($0!V$7,r M90[&@ 4O9C04T(B/J%.1N%0"@!"6Z&*8"$KP5#B9QD0B9T5+)#T#(@[BI56Fq MB(J_J :K""D\ %9G%3PB\8LXYDMO)E\U5'NL&)(AA%[B- PF&8R$$XM@4(PFp MAU5=I$+*.#O21$D&H $8,'3;A9/5. *,%"BLSEX!4\J\ ]7%8Y\0(XV\ >#o M "IM4Y?I%8 !@TS]#Z%IPP@#.P ,U9&$YY@&6R6"])$YL!@D+@%C45&M#l MF$.]] ?IY4LAA%7M%6#2\GRQ9ICB2$TBH0"LLY2)A5CI0P4OY&S_P ?\P \Vk M, 8Y-#KMQP:NQP:;X@\XT 5&PP-L,)<;Y7%%B FO8SH-T$3[,P!!( BKLYZUj MLT)&XY> "0!V0$1M!9$\Z$)Q]$'_h M@#QPT%X?"CT>2DD8\ /YTUZ\P M_H)/!>3V(Y:$+D5"7LPQLQIS\$$C)))T&g M<)Y@X'C]DQZ>,P#P$$G@^47Z* $-X3D1X &8XP!-! E:JA KT$^V@SWZ=@#Kf MU#L#TA:8d M8P"A T\!8ACS83Y"J1!PYH$C-D@D18ZIPP<&P#H(ZCIXT'B"4T'%8U3B=CT"c M\$$A!$P3143&U(2-,M#R+>60#<601Q%*@E G"z MIEL\$*C D$H2Z$J1Z'%@<(&Q4T'1=TL.N4ON)UW4A4ZX! (%D48U%UB9 #6y MZ0Z#5@!DI1/!XQV'DQYKU41MY1W>!$YJYAT.^Y"%\Y#/0U>%@PJU,@.U L1(D35$'^0%3--1+/17#!$V?C@D[JI$%&u M)XM.IZ^t M1&&6R%\1^TI+@?)$0D%7#KA $H1BZ9EZ#^![-MP0!Jq MX'![%G%^!@=@<'HNMD*K]T&SXW$P '(Z@6 DE4'^8'*S6%KF18.>0 /)8I47/9@?FR@;4Q@=BD$&+"RDZQ U4<'K%6SIHn M23AL /+ P#G, Q/-@SYD D/7('>\ ^_59"L=) NA!! 53R9!P,=6'D+$8*:m MMU16%#R;0U)])HLJ*+NI*&"95TNN2(.[=$')WR%T]*(_(-SL,0 /4l M9 ^T'XY%GR@Q@=_4'P(D'-5Q(H^=\.$O 8$QP8VL%1V8 =9>#E># %Z$ HAk MX6M05\9(0 7=@+[R.XYKZ -TRW[090SO@ PX-LAY+%[,T,<<]+!3" "M4B78j M@$D1)(B0FPGS, QP,(9IY@$9@ F2/(&L!@$$@%PBX0\,21?R)$X1:470]8EFi MA4L'9CSB99VF:)T\1%3N%))BY!TD:9,X!@-37)LKR5TMR5Y7FUAB$$4YUD,Fh MU%U&&&!&60 7=$60&F/G ,Jg MX%I^, ;+R0_E> ?O*YU0M*!R"(=Y'$4DP XX8 V$.R.VR 0'H8\%0 (;BU3Gf M< X@, PXL'(;X("RFF]ZO4(>@*5DALD88 3SV:LDC % <)OYV45- ;..XQT7e MM$(M! ::): %"@8V "?)=YD^) .*DD?VD42"I(5Z@,7FJ'8IGG9JD4(T%Z_d M][:40TU86**__*&^I$*2?3D[/1!2Q "&\ D8\*[MI4XW>GUG=4%:)*6#M:5M68T$4(%MU8BJZJC[b MTP"ZHP-9P]:7"@D'X(0#L %T@ 9A, 9KD%5TX (Z+@"X$.(C7N(G7N6XH.)B$ 8Wx M3A]B@072\ 4+P1(V409*O@%\H.)E@ =I$"4J(A)63N)OP 9Rw M\ 5D$ 9^N35L/@!$4 1&$ 15$.> H.)H@.-P\.5^61 JSN(U'B4I7A1N\ : v M+N@B,0!%7@9T4.=XKN.4_A-VD 8QX09Q3@B53@=K, =IH =QC@A?\!)RL.EBu MON2,<.MV'B4+P>5?8.9H'NQZK@]?8!-WKN=Z#@^W'N@K 1;'$>IN0 :O$^>#t M(1(0$,T,@ Z@ +2H@ *X (H &H 0( .KQ !"8*)6P ZP $0X #C3@$ s # !H r q end slashem-0.0.7E7F3/sys/atari/tos.c0000664000076400007640000001645010545462317014551 0ustar aliali/* SCCS Id: @(#)tos.c 3.1 90/14/08 /* NetHack may be freely redistributed. See license for details. */ /* * TOS system functions. */ #define NEED_VARARGS #include "hack.h" #ifdef TTY_GRAPHICS # include "tcap.h" #else /* To avoid error for tos.c; will be removed later */ static char *nh_HE="\033q"; #endif #ifdef TOS # include # ifndef WORD # define WORD short /* 16 bits -- redefine if necessary */ # endif #include static char NDECL(DOSgetch); static char NDECL(BIOSgetch); static void NDECL(init_aline); char *_a_line; /* for Line A variables */ # ifdef TEXTCOLOR boolean colors_changed = FALSE; # endif int tgetch() { char ch; /* BIOSgetch can use the numeric key pad on IBM compatibles. */ if (iflags.BIOS) ch = BIOSgetch(); else ch = DOSgetch(); return ((ch == '\r') ? '\n' : ch); } /* * Keyboard translation tables. */ #define KEYPADLO 0x61 #define KEYPADHI 0x71 #define PADKEYS (KEYPADHI - KEYPADLO + 1) #define iskeypad(x) (KEYPADLO <= (x) && (x) <= KEYPADHI) /* * Keypad keys are translated to the normal values below. * When iflags.BIOS is active, shifted keypad keys are translated to the * shift values below. */ static const struct pad { char normal, shift, cntrl; } keypad[PADKEYS] = { {C('['), 'Q', C('[')}, /* UNDO */ {'?', '/', '?'}, /* HELP */ {'(', 'a', '('}, /* ( */ {')', 'w', ')'}, /* ) */ {'/', '/', '/'}, /* / */ {C('p'), '$', C('p')}, /* * */ {'y', 'Y', C('y')}, /* 7 */ {'k', 'K', C('k')}, /* 8 */ {'u', 'U', C('u')}, /* 9 */ {'h', 'H', C('h')}, /* 4 */ {'.', '.', '.'}, {'l', 'L', C('l')}, /* 6 */ {'b', 'B', C('b')}, /* 1 */ {'j', 'J', C('j')}, /* 2 */ {'n', 'N', C('n')}, /* 3 */ {'i', 'I', C('i')}, /* Ins */ {'.', ':', ':'} /* Del */ }, numpad[PADKEYS] = { {C('['), 'Q', C('[')} , /* UNDO */ {'?', '/', '?'}, /* HELP */ {'(', 'a', '('}, /* ( */ {')', 'w', ')'}, /* ) */ {'/', '/', '/'}, /* / */ {C('p'), '$', C('p')}, /* * */ {'7', M('7'), '7'}, /* 7 */ {'8', M('8'), '8'}, /* 8 */ {'9', M('9'), '9'}, /* 9 */ {'4', M('4'), '4'}, /* 4 */ {'.', '.', '.'}, /* 5 */ {'6', M('6'), '6'}, /* 6 */ {'1', M('1'), '1'}, /* 1 */ {'2', M('2'), '2'}, /* 2 */ {'3', M('3'), '3'}, /* 3 */ {'i', 'I', C('i')}, /* Ins */ {'.', ':', ':'} /* Del */ }; /* * Unlike Ctrl-letter, the Alt-letter keystrokes have no specific ASCII * meaning unless assigned one by a keyboard conversion table, so the * keyboard BIOS normally does not return a character code when Alt-letter * is pressed. So, to interpret unassigned Alt-letters, we must use a * scan code table to translate the scan code into a letter, then set the * "meta" bit for it. -3. */ #define SCANLO 0x10 static const char scanmap[] = { /* ... */ 'q','w','e','r','t','y','u','i','o','p','[',']', '\n', 0, 'a','s','d','f','g','h','j','k','l',';','\'', '`', 0, '\\', 'z','x','c','v','b','N','m',',','.','?' /* ... */ }; #define inmap(x) (SCANLO <= (x) && (x) < SCANLO + SIZE(scanmap)) /* * BIOSgetch gets keys directly with a BIOS call. */ #define SHIFT (0x1 | 0x2) #define CTRL 0x4 #define ALT 0x8 static char BIOSgetch() { unsigned char scan, shift, ch; const struct pad *kpad; long x; /* Get scan code. */ x = Crawcin(); ch = x & 0x0ff; scan = (x & 0x00ff0000L) >> 16; /* Get shift status. */ shift = Kbshift(-1); /* Translate keypad keys */ if (iskeypad(scan)) { kpad = iflags.num_pad ? numpad : keypad; if (shift & SHIFT) ch = kpad[scan - KEYPADLO].shift; else if (shift & CTRL) ch = kpad[scan - KEYPADLO].cntrl; else ch = kpad[scan - KEYPADLO].normal; } /* Translate unassigned Alt-letters */ if ((shift & ALT) && !ch) { if (inmap(scan)) ch = scanmap[scan - SCANLO]; return (isprint(ch) ? M(ch) : ch); } return ch; } static char DOSgetch() { return (Crawcin() & 0x007f); } long freediskspace(path) char *path; { int drive = 0; struct { long freal; /*free allocation units*/ long total; /*total number of allocation units*/ long bps; /*bytes per sector*/ long pspal; /*physical sectors per allocation unit*/ } freespace; if (path[0] && path[1] == ':') drive = (toupper(path[0]) - 'A') + 1; if (Dfree(&freespace,drive)<0) return -1; return freespace.freal*freespace.bps*freespace.pspal; } /* * Functions to get filenames using wildcards */ int findfirst(path) char *path; { return (Fsfirst(path, 0) == 0); } int findnext() { return (Fsnext() == 0); } char * foundfile_buffer() { return (char *)Fgetdta() + 30; } long filesize(file) char *file; { if (findfirst(file)) return (* (long *) ((char *)Fgetdta() + 26)); else return -1L; } /* * Chdrive() changes the default drive. */ void chdrive(str) char *str; { char *ptr; char drive; if ((ptr = index(str, ':')) != (char *)0) { drive = toupper(*(ptr - 1)); (void)Dsetdrv(drive - 'A'); } return; } void get_scr_size() { # ifdef MINT # include struct winsize win; char *tmp; if((tmp=nh_getenv("LINES"))) LI = atoi(tmp); else if((tmp=nh_getenv("ROWS"))) LI = atoi(tmp); if(tmp && (tmp=nh_getenv("COLUMNS"))) CO = atoi(tmp); else { ioctl(0,TIOCGWINSZ, &win); LI = win.ws_row; CO = win.ws_col; } # else init_aline(); LI = (*((WORD *)(_a_line + -42L))) + 1; CO = (*((WORD *)(_a_line + -44L))) + 1; # endif } # define BIGBUF 8192 int _copyfile(from, to) char *from, *to; { int fromfd, tofd, r; char *buf; if ((fromfd = open(from, O_RDONLY|O_BINARY, 0)) < 0) return -1; if ((tofd = open(to, O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, FCMASK)) < 0) return -1; buf = (char *)alloc((size_t)BIGBUF); while ( (r = read(fromfd, buf, BIGBUF)) > 0) write(tofd, buf, r); close(fromfd); close(tofd); free(buf); return 0; /* successful */ } int kbhit() { return Cconis(); } static void init_aline() { # ifdef __GNUC__ /* line A calls nuke registers d0-d2,a0-a2; not all compilers regard these as scratch registers, though, so we save them */ asm(" moveml d0-d2/a0-a2, sp@-"); asm(" .word 0xa000; movel d0, __a_line"); asm(" moveml sp@+, d0-d2/a0-a2"); # else asm(" movem.l d0-d2/a0-a2, -(sp)"); asm(" .dc.w 0xa000"); /* tweak as necessary for your compiler */ asm(" move.l d0, __a_line"); asm(" movem.l (sp)+, d0-d2/a0-a2"); # endif } # ifdef TEXTCOLOR /* used in termcap.c to decide how to set up the hilites */ unsigned long tos_numcolors = 2; void set_colors() { static char colorHE[] = "\033q\033b0"; if (!iflags.BIOS) return; init_aline(); tos_numcolors = 1 << (((unsigned char *) _a_line)[1]); if (tos_numcolors <= 2) { /* mono */ iflags.use_color = FALSE; return; } else { colors_changed = TRUE; nh_HE = colorHE; } } void restore_colors() { static char plainHE[] = "\033q"; if (colors_changed) nh_HE = plainHE; colors_changed = FALSE; } # endif /* TEXTCOLOR */ # ifdef SUSPEND #include # ifdef MINT extern int __mint; # endif int dosuspend() { # ifdef MINT extern int kill(); if (__mint == 0) { # endif pline("Sorry, it seems we have no SIGTSTP here. Try ! or S."); # ifdef MINT } else if(signal(SIGTSTP, SIG_IGN) == SIG_DFL) { suspend_nhwindows((char *)0); (void) signal(SIGTSTP, SIG_DFL); (void) kill(0, SIGTSTP); get_scr_size(); resume_nhwindows(); } else { pline("I don't think your shell has job control."); } # endif /* MINT */ return(0); } # endif /* SUSPEND */ #endif /* TOS */ slashem-0.0.7E7F3/sys/atari/setup.g0000664000076400007640000000131010545462317015075 0ustar aliali# gulam shell script -- should work with tcsh and many # other Atari shells, too # UNIX shells use '/' in file names, but at least some Atari shells need '\' # so we process the UNIX makefiles to make that switch # sed script not included as a here document in this script because at # least some Atari shells don't do that sed -f unx2atar.sed < ..\unix\Makefile.top > ..\..\Makefile sed -f unx2atar.sed < ..\unix\Makefile.dat > ..\..\dat\Makefile sed -f unx2atar.sed < ..\unix\Makefile.doc > ..\..\doc\Makefile sed -f unx2atar.sed < ..\unix\Makefile.src > ..\..\src\Makefile sed -f unx2atar.sed < ..\unix\Makefile.utl > ..\..\util\Makefile # KLUDGE to fix a Makefile problem echo > ..\..\include\win32api.h slashem-0.0.7E7F3/sys/atari/unx2atar.sed0000664000076400007640000000143710545462317016040 0ustar aliali: loop /\\$/N /\\$/b loop # for each line, append any continuation lines before trying to classify it /^ / { # if it starts with a tab, it's meant for the shell, and we should think # about reversing the slashes s;cd ../util;cd ..\\util; s;cd ../src;cd ..\\src; /librarian/ s;dat/options;dat\\options; /$(MAKE)/b /$(CC)/b s;/;\\;g } # unfortunately, we do not want to reverse *all* the slashes, as even the # Atari make and gcc like forward ones, and it's messy to avoid the ones in # sed addresses # so, flip the first one in e.g. # @( cd ../util ; $(MAKE) ../include/onames.h ) # flip the librarian-related ones in dat/options # ignore other lines related to make and gcc # and flip any slashes left over, which include a number of UNIX-only things # that we didn't need to do but don't hurt slashem-0.0.7E7F3/sys/atari/Install.tos0000664000076400007640000001447210545462317015737 0ustar aliali 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. You should have a main directory with subdirectories dat, doc, include, src, util, sys\atari, sys\share, sys\unix, and at least one of win\tty and win\gem. You may have other subdirectories under sys and win, but they needn't concern you. If you do not follow this structure, the Makefiles will not function properly. The .c files for the main program belong in src, those for utility programs in util, and Atari-specific ones in sys\atari. All the .h files belong in include, the documentation in doc, and assorted data files in dat. You may also use random.c from sys\share. The Makefiles belong in sys\unix. (A more detailed explanation of the directory structure may be found in Files, which should be in the top directory.) 2. If you don't already have a good command line interpreter, get one. Doing all of the following from the desktop or a GEM shell will probably be a *big* pain. If you can get a Bourne shell compatible one, and put it in \bin\sh, then you'll save yourself some trouble with the Makefiles. There are several good shells on various FTP sites (including atari.archive.umich.edu). Run the "setup.g" shell script in sys\atari. This will setup all the makefiles and other files in the appropriate directories. It assumes that your compiler prefers \ to / as a directory separator. If not, simply copy the makefiles instead of running sed on them. 3. Now go to the include subdirectory to edit a couple of the header files there. First edit config.h according to the comments to match your system and desired set of features. In particular: make sure that UNIX is *not* defined, and TOS is (if you're using the MiNT library, and/or the -mint option to gcc, this will be done automatically) make sure that HACKDIR is defined properly (or not at all) make sure that COMPRESS is not defined Also edit tosconf.h; this shouldn't need much changing. If you are not going to include random.c you will need to comment out RANDOM. Gcc users don't need RANDOM, since the gcc and MiNT libraries have a Berkeley derived srandom() function already. If you have no termcap support and don't want to use the supplied termcap.uu, comment out TERMLIB. Gcc has a termcap library, so TERMLIB should always be "on" with gcc (and you don't need to worry about termcap.uu at all). 4. If you want to change the high score list behavior, examine the top of topten.c, in the src directory. You may want to change the definitions of PERSMAX, POINTSMIN, and ENTRYMAX. I set POINTSMIN to 51 and ENTRYMAX to 50 to keep the size of the score list down. 5. Go to the src directory and edit your Makefile. You'll want the Systos target configuration; the comments explain most of what needs to be done, at least for the gcc. Next, go to the top, util, dat, and doc directories, and edit the Makefiles there, as necessary. You'll need nroff and/or TeX to do the files in doc; if you don't have one/both of these, you can skip it (docs?? we don't need no steenking docs :-)). If you elected to use Fred Fish's termcap library (bundled in as termcap.arc), you will have to generate termcap.a from those sources. If you are recompiling after patching your sources, or if you got your files from somewhere other than the official distribution, "touch makedefs.c" to ensure that certain files (onames.h and pm.h) are remade, lest potentially troublesome timestamps fool "make." 8. Now, enter "make all", and take a long siesta; your computer will be occupied for a long time. If all goes well, you will get an executable. If you tried to compile in too many features, you will probably get a dysfunctional executable, and will have to start over. Hint 1: If you're short on memory, you might enter "make -n all >make.bat," and then run script.bat with some sort of batch program or with the gulam command "script make.bat." Hint 2: You'll save yourself a lot of grief if you use the GNU version of the "make" program. Some of the smaller makes aren't completely compatible. GNU software for the Atari is widely available; for example, by anonymous FTP from atari.archive.umich.edu. 9. Make sure the support files -- data, rumors, cmdhelp, opthelp, help, hh, history, license, and oracles, or simply nhdat if DLB was defined -- were copied to the game directory. If not, move them there from the dat directory yourself. rumors can be created manually by entering "makedefs -r;" data by entering "makedefs -d." Also, make sure that the various level files (*.lev, from the dat subdirectory) were copied over correctly. If you're not sure what files should have been made, double check with Makefile.dat. 10. Go to the src\atari directory. Copy atari.cnf to your game directory as NetHack.cnf. Edit it to reflect your particular setup and personal preferences, following the comments. If you compiled in the TERMLIB feature, also move the "termcap" file to your game directory. (Note: gcc's termcap routines have built-in defaults, so the termcap file is not necessary with that compiler.) If you're running NetHack from the MultiTOS desktop, and you want a more useful set of drop down menus than the plain system "File/Edit" ones, copy nethack.mnu to your games directory. This file contains a menu definition that puts a lot of the common commands into the menu. 11. Play NetHack. If it works, you're done! Notes ----- 1) Save files and bones files from previous versions will not work with NetHack 3.4. Don't bother trying to keep them. 2) To install an update of NetHack after changing something, enter "make" from the src directory. If you add, delete, or reorder monsters or objects, or you change the format of saved level files, delete any save and bones files. (Trying to use such files sometimes produces amusing confusions on the game's part, but more often produces crashes.) slashem-0.0.7E7F3/sys/atari/nethack.mnu0000664000076400007640000000150410545462317015730 0ustar aliali# Sample .mnu file for NetHack # This will work only with MINIWIN v1.1 # or TOSWIN v2.0 (or better) #%title "NetHack" #%about "About NetHack" "v" File "Shell" "!" "Options" "O" --- "Save Game" "S" --- "Quit" ?"[1][Really quit?][ Yes | No ]":%A"#quit y":! Edit "Copy" %C "Paste" %P "Paste Options..." %O --- "Set Font..." %F Inventory "Show Inventory" "i" -- "Put on jewelry" "P" "Remove jewelry" "R" "Wear armor" "W" "Take off armor" "T" "Wield weapon" "w" "Exchange weapons" "x" "Ready ammo in quiver" "Q" --- "Eat" "e" "Quaff potion" "q" --- "Drop" "d" "Throw" "t" "Fire" "f" Move "North" "k" 4800 "South" "j" 5000 "East" "l" 4d00 "West" "h" 4b00 --- "Rest" "." --- "Open door" "o" "Close door" "c" Misc "Help" "?" 6200 "List known spells" "+" "Cast spell" "Z" --- "Abort" 001b 6100 slashem-0.0.7E7F3/sys/share/0000775000076400007640000000000010545462317013574 5ustar alialislashem-0.0.7E7F3/sys/share/lev_yacc.c0000664000076400007640000024762310545462317015543 0ustar aliali#ifndef lint static char const yyrcsid[] = "$FreeBSD: src/usr.bin/yacc/skeleton.c,v 1.28 2000/01/17 02:04:06 bde Exp $"; #endif #include #define YYBYACC 1 #define YYMAJOR 1 #define YYMINOR 9 #define YYLEX yylex() #define YYEMPTY -1 #define yyclearin (yychar=(YYEMPTY)) #define yyerrok (yyerrflag=0) #define YYRECOVERING() (yyerrflag!=0) static int yygrowstack(); #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. */ /* * This file contains the Level Compiler code * It may handle special mazes & special room-levels */ #define LEVEL_COMPILER 1 /* Enable definition of internal structures */ /* In case we're using bison in AIX. This definition must be * placed before any other C-language construct in the file * excluding comments and preprocessor directives (thanks IBM * for this wonderful feature...). * * Note: some cpps barf on this 'undefined control' (#pragma). * Addition of the leading space seems to prevent barfage for now, * and AIX will still see the directive. */ #ifdef _AIX #pragma alloca /* keep leading space! */ #endif #include "hack.h" #include "sp_lev.h" #define MAX_REGISTERS 10 #define ERR (-1) /* many types of things are put in chars for transference to NetHack. * since some systems will use signed chars, limit everybody to the * same number for portability. */ #define MAX_OF_TYPE 128 #define New(type) \ (type *) memset((genericptr_t)alloc(sizeof(type)), 0, sizeof(type)) #define NewTab(type, size) (type **) alloc(sizeof(type *) * size) #define Free(ptr) free((genericptr_t)ptr) extern void FDECL(yyerror, (const char *)); extern void FDECL(yywarning, (const char *)); extern int NDECL(yylex); int NDECL(yyparse); extern int FDECL(get_artifact_id, (char *)); extern int FDECL(get_floor_type, (CHAR_P)); extern int FDECL(get_room_type, (char *)); extern int FDECL(get_trap_type, (char *)); extern int FDECL(get_monster_id, (char *,CHAR_P)); extern int FDECL(get_object_id, (char *,CHAR_P)); extern boolean FDECL(check_monster_char, (CHAR_P)); extern boolean FDECL(check_object_char, (CHAR_P)); extern char FDECL(what_map_char, (CHAR_P)); extern void FDECL(scan_map, (char *)); extern void NDECL(wallify_map); extern boolean NDECL(check_subrooms); extern void FDECL(check_coord, (int,int,const char *)); extern void NDECL(store_part); extern void NDECL(store_room); extern void FDECL(store_place_list, (int,int,int,const struct coord *)); extern boolean FDECL(write_level_file, (char *,splev *,specialmaze *)); extern void FDECL(free_rooms, (splev *)); static struct reg { int x1, y1; int x2, y2; } current_region; static struct coord current_coord, current_align; static struct size { int height; int width; } current_size; char tmpmessage[256]; digpos *tmppass[32]; char *tmpmap[ROWNO]; digpos *tmpdig[MAX_OF_TYPE]; region *tmpreg[MAX_OF_TYPE]; lev_region *tmplreg[MAX_OF_TYPE]; door *tmpdoor[MAX_OF_TYPE]; drawbridge *tmpdb[MAX_OF_TYPE]; walk *tmpwalk[MAX_OF_TYPE]; lev_region *tmprndlreg[MAX_REGISTERS]; room_door *tmprdoor[MAX_OF_TYPE]; trap *tmptrap[MAX_OF_TYPE]; monster *tmpmonst[MAX_OF_TYPE]; object *tmpobj[MAX_OF_TYPE]; altar *tmpaltar[MAX_OF_TYPE]; lad *tmplad[MAX_OF_TYPE]; stair *tmpstair[MAX_OF_TYPE]; gold *tmpgold[MAX_OF_TYPE]; engraving *tmpengraving[MAX_OF_TYPE]; fountain *tmpfountain[MAX_OF_TYPE]; sink *tmpsink[MAX_OF_TYPE]; pool *tmppool[MAX_OF_TYPE]; mazepart *tmppart[10]; room *tmproom[MAXNROFROOMS*2]; corridor *tmpcor[MAX_OF_TYPE]; static specialmaze maze; static splev special_lev; static lev_init init_lev; static char olist[MAX_REGISTERS], mlist[MAX_REGISTERS]; static struct coord plist[MAX_REGISTERS]; int n_olist = 0, n_mlist = 0, n_plist = 0; unsigned int nrndlreg = 0; unsigned int nlreg = 0, nreg = 0, ndoor = 0, ntrap = 0, nmons = 0, nobj = 0; unsigned int ndb = 0, nwalk = 0, npart = 0, ndig = 0, nlad = 0, nstair = 0; unsigned int naltar = 0, ncorridor = 0, nrooms = 0, ngold = 0, nengraving = 0; unsigned int nfountain = 0, npool = 0, nsink = 0, npass = 0; static int lev_flags = 0; unsigned int max_x_map, max_y_map; static xchar in_room; extern int fatal_error; extern int want_warnings; extern const char *fname; typedef union { int i; char* map; struct { xchar room; xchar wall; xchar door; } corpos; } YYSTYPE; #define YYERRCODE 256 #define CHAR 257 #define INTEGER 258 #define BOOLEAN 259 #define PERCENT 260 #define MESSAGE_ID 261 #define MAZE_ID 262 #define LEVEL_ID 263 #define LEV_INIT_ID 264 #define GEOMETRY_ID 265 #define NOMAP_ID 266 #define OBJECT_ID 267 #define COBJECT_ID 268 #define MONSTER_ID 269 #define TRAP_ID 270 #define DOOR_ID 271 #define DRAWBRIDGE_ID 272 #define MAZEWALK_ID 273 #define WALLIFY_ID 274 #define REGION_ID 275 #define FILLING 276 #define RANDOM_OBJECTS_ID 277 #define RANDOM_MONSTERS_ID 278 #define RANDOM_PLACES_ID 279 #define ALTAR_ID 280 #define LADDER_ID 281 #define STAIR_ID 282 #define NON_DIGGABLE_ID 283 #define NON_PASSWALL_ID 284 #define ROOM_ID 285 #define PORTAL_ID 286 #define TELEPRT_ID 287 #define BRANCH_ID 288 #define LEV 289 #define CHANCE_ID 290 #define CORRIDOR_ID 291 #define GOLD_ID 292 #define ENGRAVING_ID 293 #define FOUNTAIN_ID 294 #define POOL_ID 295 #define SINK_ID 296 #define NONE 297 #define RAND_CORRIDOR_ID 298 #define DOOR_STATE 299 #define LIGHT_STATE 300 #define CURSE_TYPE 301 #define ENGRAVING_TYPE 302 #define DIRECTION 303 #define RANDOM_TYPE 304 #define O_REGISTER 305 #define M_REGISTER 306 #define P_REGISTER 307 #define A_REGISTER 308 #define ALIGNMENT 309 #define LEFT_OR_RIGHT 310 #define CENTER 311 #define TOP_OR_BOT 312 #define ALTAR_TYPE 313 #define UP_OR_DOWN 314 #define SUBROOM_ID 315 #define NAME_ID 316 #define FLAGS_ID 317 #define FLAG_TYPE 318 #define MON_ATTITUDE 319 #define MON_ALERTNESS 320 #define MON_APPEARANCE 321 #define CONTAINED 322 #define OBJFLAG_TYPE 323 #define OBJFLAGS_ID 324 #define RANDOMREGION_ID 325 #define R_REGISTER 326 #define STRING 327 #define MAP_ID 328 const short yylhs[] = { -1, 0, 0, 37, 37, 38, 38, 39, 40, 33, 23, 23, 14, 14, 19, 19, 20, 20, 41, 41, 46, 43, 43, 47, 47, 44, 44, 50, 50, 45, 45, 52, 53, 53, 54, 54, 36, 51, 51, 57, 55, 10, 10, 60, 60, 58, 58, 61, 61, 59, 59, 56, 56, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 63, 64, 78, 65, 77, 77, 79, 15, 15, 13, 13, 12, 12, 32, 11, 11, 42, 42, 80, 81, 81, 84, 1, 1, 2, 2, 82, 82, 85, 85, 85, 85, 85, 48, 48, 49, 49, 86, 89, 86, 83, 83, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 105, 66, 104, 104, 106, 106, 106, 106, 106, 67, 67, 108, 107, 109, 109, 110, 110, 110, 110, 68, 30, 30, 111, 111, 112, 113, 113, 114, 114, 114, 116, 91, 115, 115, 117, 69, 92, 98, 99, 100, 76, 118, 94, 119, 87, 120, 95, 121, 123, 96, 124, 97, 122, 122, 22, 22, 71, 72, 73, 101, 102, 93, 70, 74, 75, 25, 25, 25, 28, 28, 28, 34, 34, 35, 35, 3, 3, 4, 4, 21, 21, 21, 103, 103, 103, 103, 5, 5, 6, 6, 7, 7, 7, 8, 8, 127, 127, 128, 29, 26, 9, 88, 88, 24, 27, 31, 16, 16, 17, 17, 18, 18, 126, 125, }; const short yylen[] = { 2, 0, 1, 1, 2, 1, 1, 5, 7, 3, 0, 13, 1, 1, 0, 3, 3, 1, 0, 2, 3, 0, 2, 3, 3, 0, 1, 1, 2, 1, 1, 1, 0, 2, 5, 5, 7, 2, 2, 12, 12, 0, 2, 5, 1, 5, 1, 5, 1, 5, 1, 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 0, 11, 0, 2, 2, 1, 1, 1, 1, 1, 1, 5, 1, 1, 1, 2, 3, 1, 2, 5, 1, 1, 1, 1, 0, 2, 3, 3, 6, 3, 1, 1, 3, 1, 3, 1, 0, 4, 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 10, 0, 2, 2, 2, 2, 2, 3, 2, 2, 0, 9, 1, 1, 0, 7, 5, 5, 3, 3, 1, 1, 1, 1, 1, 1, 0, 2, 2, 0, 7, 0, 2, 2, 6, 7, 5, 1, 5, 5, 0, 8, 0, 9, 0, 8, 0, 0, 8, 0, 6, 0, 2, 1, 10, 3, 3, 3, 3, 3, 8, 7, 5, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 7, 4, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 5, 9, }; const short yydefred[] = { 0, 0, 0, 0, 0, 0, 2, 0, 5, 6, 0, 0, 0, 0, 0, 4, 235, 0, 9, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 21, 81, 82, 80, 0, 0, 0, 0, 86, 7, 0, 93, 0, 19, 0, 16, 0, 20, 0, 84, 0, 87, 0, 0, 0, 0, 0, 22, 26, 0, 51, 51, 0, 89, 90, 0, 0, 0, 0, 0, 0, 94, 99, 0, 0, 0, 0, 31, 8, 29, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109, 110, 111, 113, 120, 121, 126, 127, 125, 108, 112, 114, 115, 116, 117, 118, 119, 122, 123, 124, 128, 129, 234, 0, 23, 233, 0, 24, 208, 0, 207, 0, 0, 33, 0, 0, 0, 0, 0, 0, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 0, 92, 91, 88, 95, 98, 232, 0, 96, 0, 231, 0, 0, 239, 0, 139, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 216, 217, 0, 215, 0, 0, 0, 212, 213, 214, 0, 0, 0, 0, 0, 0, 0, 171, 0, 184, 189, 190, 175, 177, 180, 236, 237, 0, 0, 186, 151, 0, 101, 103, 218, 219, 0, 0, 0, 0, 74, 75, 0, 68, 188, 187, 67, 0, 0, 0, 0, 0, 199, 0, 198, 0, 200, 196, 0, 195, 0, 197, 206, 0, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, 97, 173, 0, 0, 0, 0, 0, 160, 0, 0, 0, 167, 0, 0, 222, 0, 220, 0, 221, 169, 0, 0, 0, 170, 0, 0, 0, 193, 240, 241, 0, 150, 44, 0, 0, 46, 0, 0, 0, 35, 34, 0, 0, 242, 0, 0, 204, 203, 141, 0, 202, 201, 0, 165, 162, 0, 227, 0, 0, 0, 0, 0, 0, 0, 0, 0, 178, 181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 229, 0, 0, 0, 166, 0, 0, 0, 224, 223, 192, 0, 0, 0, 0, 194, 0, 48, 0, 0, 0, 50, 0, 0, 0, 76, 77, 0, 12, 13, 11, 174, 0, 130, 0, 163, 0, 0, 0, 191, 230, 0, 172, 176, 0, 179, 0, 0, 0, 0, 0, 0, 78, 79, 0, 0, 144, 143, 0, 132, 164, 226, 0, 0, 0, 183, 43, 0, 0, 45, 0, 0, 36, 69, 0, 142, 0, 0, 0, 0, 0, 0, 40, 0, 39, 71, 153, 152, 154, 0, 0, 0, 133, 243, 211, 0, 47, 42, 49, 0, 0, 0, 135, 136, 0, 137, 134, 185, 0, 72, 156, 155, 0, 0, 0, 138, 73, 0, 0, 147, 148, 0, 158, 159, 146, }; const short yydgoto[] = { 3, 65, 170, 284, 141, 223, 257, 330, 402, 331, 474, 33, 446, 419, 422, 263, 248, 181, 343, 13, 25, 431, 238, 21, 138, 281, 282, 135, 276, 277, 252, 142, 4, 5, 365, 361, 260, 6, 7, 8, 9, 28, 39, 44, 56, 78, 29, 57, 136, 139, 58, 59, 79, 80, 145, 60, 82, 61, 350, 415, 347, 411, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 491, 477, 501, 40, 41, 50, 70, 42, 71, 175, 72, 176, 215, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 239, 468, 451, 484, 182, 391, 450, 467, 481, 482, 505, 511, 394, 367, 427, 297, 357, 299, 300, 437, 406, 301, 240, 228, 229, 230, }; const short yysindex[] = { -239, -22, 4, 0, -189, -189, 0, -239, 0, 0, -209, -209, 77, -115, -115, 0, 0, 109, 0, -154, 108, -89, -89, -230, 129, 0, -83, 118, -153, -89, 0, 0, 0, 0, -154, 134, -147, 124, 0, 0, -153, 0, -145, 0, -201, 0, -72, 0, -167, 0, -237, 0, 126, 128, 130, 132, -111, 0, 0, -250, 0, 0, 145, 0, 0, 149, 136, 137, -33, 105, 862, 0, 0, -60, -59, -282, -282, 0, 0, 0, -92, 0, -199, -199, -58, -161, -60, -59, -36, -55, -54, -52, -52, -52, -52, 142, 147, 151, 0, 153, 154, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 183, 0, 0, 184, 0, 0, 185, 0, 186, 173, 0, 174, 175, 178, 180, 182, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 0, 0, 0, 0, 0, 0, -51, 0, 0, 0, 144, 146, 0, 188, 0, 0, 189, 190, -194, -2, -2, 201, -2, -2, 81, 201, 201, -35, -35, -35, -214, -2, -2, -98, -60, -59, -174, -174, 202, -226, -2, -15, -2, -2, -209, -9, 205, 207, 194, 195, -225, -231, -276, 0, 0, 211, 0, 166, 169, 212, 0, 0, 0, 214, 1, 218, 219, 222, 271, 60, 0, 281, 0, 0, 0, 0, 0, 0, 0, 0, 286, 298, 0, 0, 311, 0, 0, 0, 0, 312, 318, 107, 319, 0, 0, 322, 0, 0, 0, 0, 323, 110, -36, -36, -35, 0, 278, 0, 328, 0, 0, 282, 0, 330, 0, 0, 331, 0, -2, 119, 120, 73, 76, 336, -174, -193, 68, 125, 340, 342, 78, 343, 345, 376, -2, -175, 99, -6, -1, 382, -34, -194, -174, 386, 0, 0, 0, 170, -204, 192, -203, -2, 0, 338, 339, 401, 0, 193, 402, 0, 357, 0, 409, 0, 0, 410, 208, -35, 0, -35, -35, -35, 0, 0, 0, 423, 0, 0, 213, 425, 0, 216, 432, 209, 0, 0, 434, 436, 0, 440, 392, 0, 0, 0, 394, 0, 0, 444, 0, 0, 398, 0, -194, 448, -282, 235, -256, 237, 104, 454, 466, 0, 0, -209, 467, 3, 469, 10, 479, -143, -205, -35, 0, 487, 0, -2, 489, 276, 0, 277, 492, 445, 0, 0, 0, 493, 225, -209, 496, 0, 284, 0, -167, 499, 287, 0, 288, 500, -212, 0, 0, 503, 0, 0, 0, 0, -3, 0, -209, 0, 455, 507, 279, 0, 0, 294, 0, 0, 239, 0, 513, 512, 10, 516, 517, -209, 0, 0, 532, -212, 0, 0, 531, 0, 0, 0, 341, 542, 550, 0, 0, -161, 552, 0, 344, 552, 0, 0, -240, 0, 553, 535, 346, 348, 557, 349, 0, 559, 0, 0, 0, 0, 0, 560, 565, -162, 0, 0, 0, 562, 0, 0, 0, 566, -241, -206, 0, 0, -209, 0, 0, 0, -209, 0, 0, 0, 567, 570, 570, 0, 0, -206, -242, 0, 0, 570, 0, 0, 0, }; const short yyrindex[] = { 601, 0, 0, 0, -157, 783, 0, 615, 0, 0, 0, 0, 0, -128, 801, 0, 0, 0, 0, 0, 0, -103, 826, 0, 758, 0, 0, 0, 0, 792, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 177, 0, 0, 0, 0, 0, 541, 0, 0, 0, 0, 0, 29, 0, 0, 181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, 0, 179, 700, 0, 0, 0, 0, 0, 0, 0, 558, 558, 558, 558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 297, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 574, 0, 0, 0, 607, 0, 0, 0, 0, 0, 0, 0, 640, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 361, 0, 0, 0, 0, 673, 0, 0, 0, 0, 167, 0, 0, 167, 0, 0, 0, 0, 421, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 710, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 481, 481, 0, 0, 0, 0, 0, 0, 481, 0, 0, 0, }; const short yygindex[] = { 0, 210, 199, 0, -73, -288, -190, 135, 0, 0, 176, 0, 172, 0, 0, 0, 0, 75, 0, 612, 588, 0, -183, 611, 418, 0, 0, 420, 0, 0, 0, -10, 0, 0, 0, 0, 352, 643, 0, 0, 0, 27, 621, 0, 0, 0, 0, 0, -70, -69, 603, 0, 0, 0, 0, 0, 602, 0, 0, 224, 0, 0, 0, 0, 0, 0, 595, 596, 597, 598, 599, 600, 0, 0, 604, 605, 608, 0, 0, 0, 0, 0, 0, 0, 0, 0, -100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -180, 0, 0, 0, 579, 0, 0, 0, 0, 206, -390, -446, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -53, -79, 0, 0, }; #define YYTABLESIZE 1186 const short yytable[] = { 17, 18, 100, 143, 174, 232, 259, 227, 231, 177, 234, 235, 243, 244, 245, 258, 171, 502, 172, 249, 250, 354, 140, 1, 2, 88, 137, 31, 283, 32, 265, 266, 134, 261, 346, 54, 10, 174, 174, 349, 66, 67, 68, 410, 246, 16, 444, 85, 400, 30, 414, 16, 502, 83, 420, 514, 43, 401, 89, 30, 512, 478, 11, 503, 479, 55, 102, 516, 91, 92, 93, 94, 146, 278, 32, 279, 52, 53, 262, 273, 274, 100, 396, 147, 54, 515, 480, 480, 69, 314, 247, 148, 445, 108, 109, 110, 149, 150, 503, 421, 359, 363, 326, 506, 14, 221, 320, 14, 14, 14, 222, 327, 37, 38, 55, 328, 329, 151, 16, 513, 355, 237, 340, 16, 16, 111, 255, 341, 12, 342, 256, 104, 253, 10, 254, 19, 233, 10, 10, 366, 241, 242, 327, 63, 64, 356, 328, 329, 397, 20, 168, 169, 377, 23, 378, 379, 380, 494, 495, 496, 417, 418, 18, 18, 24, 16, 26, 41, 184, 185, 312, 313, 27, 34, 35, 105, 36, 25, 46, 37, 47, 27, 48, 51, 73, 62, 74, 77, 75, 84, 76, 177, 177, 85, 86, 87, 90, 134, 137, 144, 186, 167, 267, 178, 179, 187, 423, 214, 180, 188, 285, 189, 190, 425, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 352, 251, 201, 202, 203, 204, 205, 206, 207, 208, 225, 213, 209, 216, 210, 217, 211, 232, 259, 264, 449, 212, 218, 219, 220, 269, 268, 270, 271, 272, 236, 286, 289, 287, 290, 291, 288, 173, 292, 293, 100, 100, 294, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 225, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 32, 32, 100, 100, 100, 100, 149, 345, 398, 100, 224, 224, 348, 225, 225, 360, 409, 364, 85, 85, 295, 85, 85, 413, 83, 83, 100, 296, 448, 32, 30, 30, 226, 226, 298, 100, 100, 102, 102, 302, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 303, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 304, 305, 102, 102, 102, 102, 145, 306, 308, 102, 307, 309, 310, 311, 315, 236, 407, 316, 317, 318, 319, 323, 321, 322, 324, 325, 102, 332, 333, 334, 224, 335, 337, 225, 338, 102, 102, 336, 104, 104, 435, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 226, 104, 104, 104, 104, 104, 104, 104, 104, 452, 104, 104, 104, 339, 131, 344, 104, 104, 104, 351, 356, 358, 41, 41, 368, 369, 463, 41, 41, 41, 41, 41, 25, 25, 37, 37, 27, 27, 370, 372, 41, 373, 41, 362, 371, 41, 374, 375, 104, 104, 41, 41, 41, 41, 41, 41, 41, 37, 41, 376, 381, 25, 383, 37, 382, 27, 498, 384, 25, 385, 37, 387, 27, 388, 157, 41, 41, 389, 390, 507, 392, 393, 395, 508, 41, 397, 399, 37, 403, 225, 225, 404, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 405, 408, 386, 412, 225, 225, 225, 225, 225, 225, 225, 225, 225, 416, 225, 225, 225, 225, 225, 225, 225, 424, 225, 426, 428, 429, 430, 433, 432, 434, 436, 107, 438, 440, 443, 441, 442, 447, 453, 225, 225, 454, 456, 457, 458, 455, 459, 461, 225, 149, 149, 462, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 464, 161, 466, 485, 149, 149, 149, 149, 149, 149, 149, 149, 149, 470, 149, 149, 149, 149, 149, 149, 149, 471, 149, 473, 483, 488, 469, 490, 1, 475, 499, 492, 486, 487, 209, 489, 493, 500, 509, 149, 149, 510, 3, 238, 14, 497, 465, 439, 149, 45, 145, 145, 22, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 280, 275, 476, 182, 145, 145, 145, 145, 145, 145, 145, 145, 145, 15, 145, 145, 145, 145, 145, 145, 145, 472, 145, 353, 49, 81, 83, 460, 112, 113, 114, 115, 116, 117, 183, 0, 210, 118, 119, 145, 145, 120, 0, 0, 0, 0, 131, 131, 145, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 0, 504, 0, 38, 131, 131, 131, 131, 131, 131, 131, 131, 131, 70, 131, 131, 131, 131, 131, 131, 131, 0, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 131, 131, 0, 0, 0, 0, 0, 157, 157, 131, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 0, 17, 0, 0, 157, 157, 157, 157, 157, 157, 157, 157, 157, 0, 157, 157, 157, 157, 157, 157, 157, 0, 157, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 157, 157, 0, 0, 0, 10, 0, 107, 107, 157, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 0, 0, 0, 0, 107, 107, 107, 107, 107, 18, 107, 107, 107, 0, 0, 0, 107, 107, 107, 161, 161, 0, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 0, 0, 0, 0, 161, 161, 161, 161, 161, 0, 161, 161, 161, 0, 0, 107, 161, 161, 161, 209, 209, 0, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 0, 0, 0, 0, 209, 209, 209, 209, 209, 0, 209, 209, 209, 0, 0, 161, 209, 209, 209, 182, 182, 0, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 0, 0, 0, 0, 182, 182, 182, 182, 182, 0, 182, 182, 182, 0, 0, 209, 182, 182, 182, 210, 210, 0, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 0, 0, 0, 0, 210, 210, 210, 210, 210, 0, 210, 210, 210, 38, 38, 182, 210, 210, 210, 0, 0, 0, 0, 70, 70, 0, 0, 0, 70, 70, 70, 70, 70, 0, 0, 0, 38, 0, 0, 0, 0, 70, 38, 70, 0, 0, 70, 0, 210, 38, 0, 70, 70, 70, 70, 70, 70, 70, 0, 70, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 17, 17, 17, 17, 17, 17, 70, 70, 0, 0, 0, 0, 0, 0, 0, 70, 17, 17, 0, 0, 0, 0, 0, 0, 17, 14, 14, 14, 14, 0, 17, 0, 0, 0, 0, 18, 18, 17, 18, 18, 0, 14, 14, 10, 10, 10, 0, 0, 0, 14, 18, 18, 0, 0, 17, 14, 0, 0, 18, 10, 10, 0, 14, 0, 18, 0, 0, 10, 0, 18, 18, 18, 0, 10, 0, 0, 0, 0, 0, 14, 10, 0, 0, 0, 18, 18, 0, 0, 18, 0, 0, 0, 18, 0, 0, 0, 0, 10, 18, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 91, 92, 93, 94, 95, 96, 97, 98, 99, 0, 0, 0, 18, 100, 101, 102, 103, 104, 0, 105, 106, 107, 0, 0, 0, 108, 109, 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, 111, }; const short yycheck[] = { 10, 11, 0, 76, 40, 40, 40, 187, 188, 88, 190, 191, 195, 196, 197, 205, 86, 258, 87, 199, 200, 309, 304, 262, 263, 58, 257, 257, 304, 0, 210, 211, 257, 259, 40, 285, 58, 40, 40, 40, 277, 278, 279, 40, 258, 327, 258, 0, 304, 22, 40, 327, 258, 0, 259, 297, 29, 313, 91, 0, 506, 301, 58, 304, 304, 315, 0, 513, 267, 268, 269, 270, 271, 304, 304, 306, 277, 278, 304, 304, 305, 280, 370, 282, 285, 327, 327, 327, 325, 272, 304, 290, 304, 292, 293, 294, 295, 296, 304, 304, 304, 304, 292, 493, 261, 299, 286, 264, 265, 266, 304, 304, 265, 266, 315, 308, 309, 316, 327, 509, 310, 40, 302, 327, 327, 324, 300, 302, 317, 304, 304, 0, 202, 261, 203, 58, 189, 265, 266, 319, 193, 194, 304, 310, 311, 41, 308, 309, 44, 264, 311, 312, 335, 44, 337, 338, 339, 319, 320, 321, 303, 304, 265, 266, 318, 327, 58, 0, 93, 94, 270, 271, 261, 44, 257, 44, 58, 0, 44, 0, 327, 0, 58, 328, 58, 257, 58, 298, 58, 44, 58, 270, 271, 44, 58, 58, 91, 257, 257, 291, 58, 259, 212, 258, 258, 58, 389, 258, 260, 58, 220, 58, 58, 393, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 258, 323, 58, 44, 44, 44, 44, 58, 58, 58, 0, 44, 58, 93, 58, 93, 58, 40, 40, 258, 424, 58, 58, 58, 58, 44, 259, 44, 58, 58, 289, 44, 44, 91, 44, 258, 91, 297, 44, 44, 262, 263, 44, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 44, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 262, 263, 291, 292, 293, 294, 0, 304, 372, 298, 304, 304, 304, 307, 307, 316, 304, 318, 262, 263, 40, 265, 266, 304, 262, 263, 315, 258, 322, 291, 262, 263, 326, 326, 44, 324, 325, 262, 263, 44, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 44, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 44, 44, 291, 292, 293, 294, 0, 44, 44, 298, 258, 44, 44, 258, 91, 289, 381, 44, 91, 44, 44, 303, 258, 258, 303, 44, 315, 314, 258, 44, 304, 44, 44, 307, 44, 324, 325, 314, 262, 263, 405, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 326, 277, 278, 279, 280, 281, 282, 283, 284, 426, 286, 287, 288, 44, 0, 323, 292, 293, 294, 44, 41, 258, 262, 263, 93, 93, 443, 267, 268, 269, 270, 271, 262, 263, 262, 263, 262, 263, 44, 44, 280, 91, 282, 258, 258, 285, 44, 44, 324, 325, 290, 291, 292, 293, 294, 295, 296, 285, 298, 258, 44, 291, 44, 291, 258, 291, 483, 258, 298, 44, 298, 44, 298, 44, 0, 315, 316, 44, 93, 496, 93, 44, 91, 500, 324, 44, 258, 315, 258, 262, 263, 44, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 44, 44, 303, 44, 280, 281, 282, 283, 284, 285, 286, 287, 288, 44, 290, 291, 292, 293, 294, 295, 296, 44, 298, 44, 258, 258, 44, 44, 93, 314, 44, 0, 258, 44, 44, 258, 258, 44, 93, 315, 316, 44, 258, 314, 41, 276, 44, 41, 324, 262, 263, 44, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 41, 0, 44, 41, 280, 281, 282, 283, 284, 285, 286, 287, 288, 44, 290, 291, 292, 293, 294, 295, 296, 44, 298, 44, 44, 41, 258, 41, 0, 258, 41, 44, 259, 258, 0, 259, 44, 44, 44, 315, 316, 44, 0, 58, 5, 483, 447, 410, 324, 34, 262, 263, 14, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 219, 218, 463, 0, 280, 281, 282, 283, 284, 285, 286, 287, 288, 7, 290, 291, 292, 293, 294, 295, 296, 459, 298, 308, 40, 59, 61, 440, 70, 70, 70, 70, 70, 70, 92, -1, 0, 70, 70, 315, 316, 70, -1, -1, -1, -1, 262, 263, 324, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, -1, 492, -1, 0, 280, 281, 282, 283, 284, 285, 286, 287, 288, 0, 290, 291, 292, 293, 294, 295, 296, -1, 298, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 315, 316, -1, -1, -1, -1, -1, 262, 263, 324, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, -1, 0, -1, -1, 280, 281, 282, 283, 284, 285, 286, 287, 288, -1, 290, 291, 292, 293, 294, 295, 296, -1, 298, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, 315, 316, -1, -1, -1, 0, -1, 262, 263, 324, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, -1, -1, -1, -1, 280, 281, 282, 283, 284, 0, 286, 287, 288, -1, -1, -1, 292, 293, 294, 262, 263, -1, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, -1, -1, -1, -1, 280, 281, 282, 283, 284, -1, 286, 287, 288, -1, -1, 324, 292, 293, 294, 262, 263, -1, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, -1, -1, -1, -1, 280, 281, 282, 283, 284, -1, 286, 287, 288, -1, -1, 324, 292, 293, 294, 262, 263, -1, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, -1, -1, -1, -1, 280, 281, 282, 283, 284, -1, 286, 287, 288, -1, -1, 324, 292, 293, 294, 262, 263, -1, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, -1, -1, -1, -1, 280, 281, 282, 283, 284, -1, 286, 287, 288, 262, 263, 324, 292, 293, 294, -1, -1, -1, -1, 262, 263, -1, -1, -1, 267, 268, 269, 270, 271, -1, -1, -1, 285, -1, -1, -1, -1, 280, 291, 282, -1, -1, 285, -1, 324, 298, -1, 290, 291, 292, 293, 294, 295, 296, -1, 298, -1, -1, -1, -1, -1, -1, 315, -1, -1, -1, 261, 262, 263, 264, 265, 266, 315, 316, -1, -1, -1, -1, -1, -1, -1, 324, 277, 278, -1, -1, -1, -1, -1, -1, 285, 261, 262, 263, 264, -1, 291, -1, -1, -1, -1, 262, 263, 298, 265, 266, -1, 277, 278, 261, 262, 263, -1, -1, -1, 285, 277, 278, -1, -1, 315, 291, -1, -1, 285, 277, 278, -1, 298, -1, 291, -1, -1, 285, -1, 262, 263, 298, -1, 291, -1, -1, -1, -1, -1, 315, 298, -1, -1, -1, 277, 278, -1, -1, 315, -1, -1, -1, 285, -1, -1, -1, -1, 315, 291, -1, -1, -1, -1, -1, -1, 298, -1, -1, -1, -1, 267, 268, 269, 270, 271, 272, 273, 274, 275, -1, -1, -1, 315, 280, 281, 282, 283, 284, -1, 286, 287, 288, -1, -1, -1, 292, 293, 294, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 324, }; #define YYFINAL 3 #ifndef YYDEBUG #define YYDEBUG 0 #endif #define YYMAXTOKEN 328 #if YYDEBUG const char * const yyname[] = { "end-of-file",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,"'('","')'",0,0,"','",0,0,0,0,0,0,0,0,0,0,0,0,0,"':'",0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"'['",0,"']'",0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"CHAR", "INTEGER","BOOLEAN","PERCENT","MESSAGE_ID","MAZE_ID","LEVEL_ID","LEV_INIT_ID", "GEOMETRY_ID","NOMAP_ID","OBJECT_ID","COBJECT_ID","MONSTER_ID","TRAP_ID", "DOOR_ID","DRAWBRIDGE_ID","MAZEWALK_ID","WALLIFY_ID","REGION_ID","FILLING", "RANDOM_OBJECTS_ID","RANDOM_MONSTERS_ID","RANDOM_PLACES_ID","ALTAR_ID", "LADDER_ID","STAIR_ID","NON_DIGGABLE_ID","NON_PASSWALL_ID","ROOM_ID", "PORTAL_ID","TELEPRT_ID","BRANCH_ID","LEV","CHANCE_ID","CORRIDOR_ID","GOLD_ID", "ENGRAVING_ID","FOUNTAIN_ID","POOL_ID","SINK_ID","NONE","RAND_CORRIDOR_ID", "DOOR_STATE","LIGHT_STATE","CURSE_TYPE","ENGRAVING_TYPE","DIRECTION", "RANDOM_TYPE","O_REGISTER","M_REGISTER","P_REGISTER","A_REGISTER","ALIGNMENT", "LEFT_OR_RIGHT","CENTER","TOP_OR_BOT","ALTAR_TYPE","UP_OR_DOWN","SUBROOM_ID", "NAME_ID","FLAGS_ID","FLAG_TYPE","MON_ATTITUDE","MON_ALERTNESS", "MON_APPEARANCE","CONTAINED","OBJFLAG_TYPE","OBJFLAGS_ID","RANDOMREGION_ID", "R_REGISTER","STRING","MAP_ID", }; const char * const yyrule[] = { "$accept : file", "file :", "file : levels", "levels : level", "levels : level levels", "level : maze_level", "level : room_level", "maze_level : maze_def flags lev_init messages regions", "room_level : level_def flags lev_init messages rreg_init rooms corridors_def", "level_def : LEVEL_ID ':' string", "lev_init :", "lev_init : LEV_INIT_ID ':' CHAR ',' CHAR ',' BOOLEAN ',' BOOLEAN ',' light_state ',' walled", "walled : BOOLEAN", "walled : RANDOM_TYPE", "flags :", "flags : FLAGS_ID ':' flag_list", "flag_list : FLAG_TYPE ',' flag_list", "flag_list : FLAG_TYPE", "messages :", "messages : message messages", "message : MESSAGE_ID ':' STRING", "rreg_init :", "rreg_init : rreg_init init_rreg", "init_rreg : RANDOM_OBJECTS_ID ':' object_list", "init_rreg : RANDOM_MONSTERS_ID ':' monster_list", "rooms :", "rooms : roomlist", "roomlist : aroom", "roomlist : aroom roomlist", "corridors_def : random_corridors", "corridors_def : corridors", "random_corridors : RAND_CORRIDOR_ID", "corridors :", "corridors : corridors corridor", "corridor : CORRIDOR_ID ':' corr_spec ',' corr_spec", "corridor : CORRIDOR_ID ':' corr_spec ',' INTEGER", "corr_spec : '(' INTEGER ',' DIRECTION ',' door_pos ')'", "aroom : room_def room_details", "aroom : subroom_def room_details", "subroom_def : SUBROOM_ID ':' room_type ',' light_state ',' subroom_pos ',' room_size ',' string roomfill", "room_def : ROOM_ID ':' room_type ',' light_state ',' room_pos ',' room_align ',' room_size roomfill", "roomfill :", "roomfill : ',' BOOLEAN", "room_pos : '(' INTEGER ',' INTEGER ')'", "room_pos : RANDOM_TYPE", "subroom_pos : '(' INTEGER ',' INTEGER ')'", "subroom_pos : RANDOM_TYPE", "room_align : '(' h_justif ',' v_justif ')'", "room_align : RANDOM_TYPE", "room_size : '(' INTEGER ',' INTEGER ')'", "room_size : RANDOM_TYPE", "room_details :", "room_details : room_details room_detail", "room_detail : room_name", "room_detail : room_chance", "room_detail : room_door", "room_detail : monster_detail", "room_detail : object_detail", "room_detail : object_flags", "room_detail : trap_detail", "room_detail : altar_detail", "room_detail : fountain_detail", "room_detail : sink_detail", "room_detail : pool_detail", "room_detail : gold_detail", "room_detail : engraving_detail", "room_detail : stair_detail", "room_name : NAME_ID ':' string", "room_chance : CHANCE_ID ':' INTEGER", "$$1 :", "room_door : DOOR_ID ':' secret ',' door_state ',' door_wall ',' door_pos $$1 room_door_infos", "room_door_infos :", "room_door_infos : room_door_infos room_door_info", "room_door_info : ',' string", "secret : BOOLEAN", "secret : RANDOM_TYPE", "door_wall : DIRECTION", "door_wall : RANDOM_TYPE", "door_pos : INTEGER", "door_pos : RANDOM_TYPE", "maze_def : MAZE_ID ':' string ',' filling", "filling : CHAR", "filling : RANDOM_TYPE", "regions : aregion", "regions : aregion regions", "aregion : map_definition reg_init map_details", "map_definition : NOMAP_ID", "map_definition : map_geometry MAP_ID", "map_geometry : GEOMETRY_ID ':' h_justif ',' v_justif", "h_justif : LEFT_OR_RIGHT", "h_justif : CENTER", "v_justif : TOP_OR_BOT", "v_justif : CENTER", "reg_init :", "reg_init : reg_init init_reg", "init_reg : RANDOM_OBJECTS_ID ':' object_list", "init_reg : RANDOM_PLACES_ID ':' place_list", "init_reg : RANDOM_PLACES_ID '[' INTEGER ']' ':' place_list", "init_reg : RANDOM_MONSTERS_ID ':' monster_list", "init_reg : rndlevregion", "object_list : object", "object_list : object ',' object_list", "monster_list : monster", "monster_list : monster ',' monster_list", "place_list : place", "$$2 :", "place_list : place $$2 ',' place_list", "map_details :", "map_details : map_details map_detail", "map_detail : monster_detail", "map_detail : object_detail", "map_detail : object_flags", "map_detail : door_detail", "map_detail : trap_detail", "map_detail : drawbridge_detail", "map_detail : region_detail", "map_detail : stair_region", "map_detail : portal_region", "map_detail : teleprt_region", "map_detail : branch_region", "map_detail : altar_detail", "map_detail : fountain_detail", "map_detail : mazewalk_detail", "map_detail : wallify_detail", "map_detail : ladder_detail", "map_detail : stair_detail", "map_detail : gold_detail", "map_detail : engraving_detail", "map_detail : diggable_detail", "map_detail : passwall_detail", "$$3 :", "monster_detail : MONSTER_ID chance ':' monster_c ',' m_name ',' coordinate $$3 monster_infos", "monster_infos :", "monster_infos : monster_infos monster_info", "monster_info : ',' string", "monster_info : ',' MON_ATTITUDE", "monster_info : ',' MON_ALERTNESS", "monster_info : ',' alignment", "monster_info : ',' MON_APPEARANCE string", "object_detail : OBJECT_ID object_desc", "object_detail : COBJECT_ID object_desc", "$$4 :", "object_desc : chance ':' object_c ',' o_name $$4 ',' object_where object_infos", "object_where : coordinate", "object_where : CONTAINED", "object_infos :", "object_infos : ',' curse_state ',' monster_id ',' enchantment optional_name", "object_infos : ',' curse_state ',' enchantment optional_name", "object_infos : ',' monster_id ',' enchantment optional_name", "object_flags : OBJFLAGS_ID ':' obj_flag_list", "obj_flag_list : obj_flag_list ',' OBJFLAG_TYPE", "obj_flag_list : OBJFLAG_TYPE", "curse_state : RANDOM_TYPE", "curse_state : CURSE_TYPE", "monster_id : STRING", "enchantment : RANDOM_TYPE", "enchantment : INTEGER", "optional_name :", "optional_name : ',' NONE", "optional_name : ',' STRING", "$$5 :", "door_detail : DOOR_ID ':' door_state ',' coordinate $$5 door_infos", "door_infos :", "door_infos : door_infos door_info", "door_info : ',' string", "trap_detail : TRAP_ID chance ':' trap_name ',' coordinate", "drawbridge_detail : DRAWBRIDGE_ID ':' coordinate ',' DIRECTION ',' door_state", "mazewalk_detail : MAZEWALK_ID ':' coordinate ',' DIRECTION", "wallify_detail : WALLIFY_ID", "ladder_detail : LADDER_ID ':' coordinate ',' UP_OR_DOWN", "stair_detail : STAIR_ID ':' coordinate ',' UP_OR_DOWN", "$$6 :", "stair_region : STAIR_ID ':' lev_region $$6 ',' lev_region ',' UP_OR_DOWN", "$$7 :", "rndlevregion : RANDOMREGION_ID '[' INTEGER ']' ':' lev_region $$7 ',' lev_region", "$$8 :", "portal_region : PORTAL_ID ':' lev_region $$8 ',' lev_region ',' string", "$$9 :", "$$10 :", "teleprt_region : TELEPRT_ID ':' lev_region $$9 ',' lev_region $$10 teleprt_detail", "$$11 :", "branch_region : BRANCH_ID ':' lev_region $$11 ',' lev_region", "teleprt_detail :", "teleprt_detail : ',' UP_OR_DOWN", "lev_region : region", "lev_region : LEV '(' INTEGER ',' INTEGER ',' INTEGER ',' INTEGER ')'", "fountain_detail : FOUNTAIN_ID ':' coordinate", "sink_detail : SINK_ID ':' coordinate", "pool_detail : POOL_ID ':' coordinate", "diggable_detail : NON_DIGGABLE_ID ':' region", "passwall_detail : NON_PASSWALL_ID ':' region", "region_detail : REGION_ID ':' region ',' light_state ',' room_type prefilled", "altar_detail : ALTAR_ID ':' coordinate ',' alignment ',' altar_type", "gold_detail : GOLD_ID ':' amount ',' coordinate", "engraving_detail : ENGRAVING_ID ':' coordinate ',' engraving_type ',' string", "monster_c : monster", "monster_c : RANDOM_TYPE", "monster_c : m_register", "object_c : object", "object_c : RANDOM_TYPE", "object_c : o_register", "m_name : string", "m_name : RANDOM_TYPE", "o_name : string", "o_name : RANDOM_TYPE", "trap_name : string", "trap_name : RANDOM_TYPE", "room_type : string", "room_type : RANDOM_TYPE", "prefilled :", "prefilled : ',' FILLING", "prefilled : ',' FILLING ',' BOOLEAN", "coordinate : coord", "coordinate : p_register", "coordinate : r_register", "coordinate : RANDOM_TYPE", "door_state : DOOR_STATE", "door_state : RANDOM_TYPE", "light_state : LIGHT_STATE", "light_state : RANDOM_TYPE", "alignment : ALIGNMENT", "alignment : a_register", "alignment : RANDOM_TYPE", "altar_type : ALTAR_TYPE", "altar_type : RANDOM_TYPE", "p_register : P_REGISTER '[' INTEGER ']'", "p_register : P_REGISTER '[' INTEGER ']' '[' INTEGER ']'", "r_register : R_REGISTER '[' INTEGER ']'", "o_register : O_REGISTER '[' INTEGER ']'", "m_register : M_REGISTER '[' INTEGER ']'", "a_register : A_REGISTER '[' INTEGER ']'", "place : coord", "place : NONE", "monster : CHAR", "object : CHAR", "string : STRING", "amount : INTEGER", "amount : RANDOM_TYPE", "chance :", "chance : PERCENT", "engraving_type : ENGRAVING_TYPE", "engraving_type : RANDOM_TYPE", "coord : '(' INTEGER ',' INTEGER ')'", "region : '(' INTEGER ',' INTEGER ',' INTEGER ',' INTEGER ')'", }; #endif #if YYDEBUG #include #endif #ifdef YYSTACKSIZE #undef YYMAXDEPTH #define YYMAXDEPTH YYSTACKSIZE #else #ifdef YYMAXDEPTH #define YYSTACKSIZE YYMAXDEPTH #else #define YYSTACKSIZE 10000 #define YYMAXDEPTH 10000 #endif #endif #define YYINITSTACKSIZE 200 int yydebug; int yynerrs; int yyerrflag; int yychar; short *yyssp; YYSTYPE *yyvsp; YYSTYPE yyval; YYSTYPE yylval; short *yyss; short *yysslim; YYSTYPE *yyvs; int yystacksize; /*lev_comp.y*/ /* allocate initial stack or double stack size, up to YYMAXDEPTH */ static int yygrowstack() { int newsize, i; short *newss; YYSTYPE *newvs; if ((newsize = yystacksize) == 0) newsize = YYINITSTACKSIZE; else if (newsize >= YYMAXDEPTH) return -1; else if ((newsize *= 2) > YYMAXDEPTH) newsize = YYMAXDEPTH; i = yyssp - yyss; newss = yyss ? (short *)realloc(yyss, newsize * sizeof *newss) : (short *)malloc(newsize * sizeof *newss); if (newss == NULL) return -1; yyss = newss; yyssp = newss + i; newvs = yyvs ? (YYSTYPE *)realloc(yyvs, newsize * sizeof *newvs) : (YYSTYPE *)malloc(newsize * sizeof *newvs); if (newvs == NULL) return -1; yyvs = newvs; yyvsp = newvs + i; yystacksize = newsize; yysslim = yyss + newsize - 1; return 0; } #define YYABORT goto yyabort #define YYREJECT goto yyabort #define YYACCEPT goto yyaccept #define YYERROR goto yyerrlab #ifndef YYPARSE_PARAM #if defined(__cplusplus) || __STDC__ #define YYPARSE_PARAM_ARG void #define YYPARSE_PARAM_DECL #else /* ! ANSI-C/C++ */ #define YYPARSE_PARAM_ARG #define YYPARSE_PARAM_DECL #endif /* ANSI-C/C++ */ #else /* YYPARSE_PARAM */ #ifndef YYPARSE_PARAM_TYPE #define YYPARSE_PARAM_TYPE void * #endif #if defined(__cplusplus) || __STDC__ #define YYPARSE_PARAM_ARG YYPARSE_PARAM_TYPE YYPARSE_PARAM #define YYPARSE_PARAM_DECL #else /* ! ANSI-C/C++ */ #define YYPARSE_PARAM_ARG YYPARSE_PARAM #define YYPARSE_PARAM_DECL YYPARSE_PARAM_TYPE YYPARSE_PARAM; #endif /* ANSI-C/C++ */ #endif /* ! YYPARSE_PARAM */ int yyparse (YYPARSE_PARAM_ARG) YYPARSE_PARAM_DECL { register int yym, yyn, yystate; #if YYDEBUG register const char *yys; if ((yys = getenv("YYDEBUG"))) { yyn = *yys; if (yyn >= '0' && yyn <= '9') yydebug = yyn - '0'; } #endif yynerrs = 0; yyerrflag = 0; yychar = (-1); if (yyss == NULL && yygrowstack()) goto yyoverflow; yyssp = yyss; yyvsp = yyvs; *yyssp = yystate = 0; yyloop: if ((yyn = yydefred[yystate])) goto yyreduce; if (yychar < 0) { if ((yychar = yylex()) < 0) yychar = 0; #if YYDEBUG if (yydebug) { yys = 0; if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; if (!yys) yys = "illegal-symbol"; printf("%sdebug: state %d, reading %d (%s)\n", YYPREFIX, yystate, yychar, yys); } #endif } if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && yyn <= YYTABLESIZE && yycheck[yyn] == yychar) { #if YYDEBUG if (yydebug) printf("%sdebug: state %d, shifting to state %d\n", YYPREFIX, yystate, yytable[yyn]); #endif if (yyssp >= yysslim && yygrowstack()) { goto yyoverflow; } *++yyssp = yystate = yytable[yyn]; *++yyvsp = yylval; yychar = (-1); if (yyerrflag > 0) --yyerrflag; goto yyloop; } if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && yyn <= YYTABLESIZE && yycheck[yyn] == yychar) { yyn = yytable[yyn]; goto yyreduce; } if (yyerrflag) goto yyinrecovery; #if defined(lint) || defined(__GNUC__) goto yynewerror; #endif yynewerror: yyerror("syntax error"); #if defined(lint) || defined(__GNUC__) goto yyerrlab; #endif yyerrlab: ++yynerrs; yyinrecovery: if (yyerrflag < 3) { yyerrflag = 3; for (;;) { if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 && yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) { #if YYDEBUG if (yydebug) printf("%sdebug: state %d, error recovery shifting\ to state %d\n", YYPREFIX, *yyssp, yytable[yyn]); #endif if (yyssp >= yysslim && yygrowstack()) { goto yyoverflow; } *++yyssp = yystate = yytable[yyn]; *++yyvsp = yylval; goto yyloop; } else { #if YYDEBUG if (yydebug) printf("%sdebug: error recovery discarding state %d\n", YYPREFIX, *yyssp); #endif if (yyssp <= yyss) goto yyabort; --yyssp; --yyvsp; } } } else { if (yychar == 0) goto yyabort; #if YYDEBUG if (yydebug) { yys = 0; if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; if (!yys) yys = "illegal-symbol"; printf("%sdebug: state %d, error recovery discards token %d (%s)\n", YYPREFIX, yystate, yychar, yys); } #endif yychar = (-1); goto yyloop; } yyreduce: #if YYDEBUG if (yydebug) printf("%sdebug: state %d, reducing by rule %d (%s)\n", YYPREFIX, yystate, yyn, yyrule[yyn]); #endif yym = yylen[yyn]; yyval = yyvsp[1-yym]; switch (yyn) { case 7: { unsigned i; if (fatal_error > 0) { (void) fprintf(stderr, "%s : %d errors detected. No output created!\n", fname, fatal_error); } else { maze.flags = yyvsp[-3].i; (void) memcpy((genericptr_t)&(maze.init_lev), (genericptr_t)&(init_lev), sizeof(lev_init)); maze.numpart = npart; maze.parts = NewTab(mazepart, npart); for(i=0;i 0) { (void) fprintf(stderr, "%s : %d errors detected. No output created!\n", fname, fatal_error); } else { special_lev.flags = (long) yyvsp[-5].i; (void) memcpy( (genericptr_t)&(special_lev.init_lev), (genericptr_t)&(init_lev), sizeof(lev_init)); special_lev.nroom = nrooms; special_lev.rooms = NewTab(room, nrooms); for(i=0; i 8) yyerror("Level names limited to 8 characters."); yyval.map = yyvsp[0].map; special_lev.nrmonst = special_lev.nrobjects = 0; n_mlist = n_olist = 0; } break; case 10: { /* in case we're processing multiple files, explicitly clear any stale settings */ (void) memset((genericptr_t) &init_lev, 0, sizeof init_lev); init_lev.init_present = FALSE; yyval.i = 0; } break; case 11: { init_lev.init_present = TRUE; init_lev.fg = what_map_char((char) yyvsp[-10].i); if (init_lev.fg == INVALID_TYPE) yyerror("Invalid foreground type."); init_lev.bg = what_map_char((char) yyvsp[-8].i); if (init_lev.bg == INVALID_TYPE) yyerror("Invalid background type."); init_lev.smoothed = yyvsp[-6].i; init_lev.joined = yyvsp[-4].i; if (init_lev.joined && init_lev.fg != CORR && init_lev.fg != ROOM) yyerror("Invalid foreground type for joined map."); init_lev.lit = yyvsp[-2].i; init_lev.walled = yyvsp[0].i; yyval.i = 1; } break; case 14: { yyval.i = 0; } break; case 15: { yyval.i = lev_flags; lev_flags = 0; /* clear for next user */ } break; case 16: { lev_flags |= yyvsp[-2].i; } break; case 17: { lev_flags |= yyvsp[0].i; } break; case 20: { int i, j; i = (int) strlen(yyvsp[0].map) + 1; j = (int) strlen(tmpmessage); if (i + j > 255) { yyerror("Message string too long (>256 characters)"); } else { if (j) tmpmessage[j++] = '\n'; (void) strncpy(tmpmessage+j, yyvsp[0].map, i - 1); tmpmessage[j + i - 1] = 0; } Free(yyvsp[0].map); } break; case 23: { if(special_lev.nrobjects) { yyerror("Object registers already initialized!"); } else { special_lev.nrobjects = n_olist; special_lev.robjects = (char *) alloc(n_olist); (void) memcpy((genericptr_t)special_lev.robjects, (genericptr_t)olist, n_olist); } } break; case 24: { if(special_lev.nrmonst) { yyerror("Monster registers already initialized!"); } else { special_lev.nrmonst = n_mlist; special_lev.rmonst = (char *) alloc(n_mlist); (void) memcpy((genericptr_t)special_lev.rmonst, (genericptr_t)mlist, n_mlist); } } break; case 25: { tmproom[nrooms] = New(room); tmproom[nrooms]->name = (char *) 0; tmproom[nrooms]->parent = (char *) 0; tmproom[nrooms]->rtype = 0; tmproom[nrooms]->rlit = 0; tmproom[nrooms]->xalign = ERR; tmproom[nrooms]->yalign = ERR; tmproom[nrooms]->x = 0; tmproom[nrooms]->y = 0; tmproom[nrooms]->w = 2; tmproom[nrooms]->h = 2; in_room = 1; } break; case 31: { tmpcor[0] = New(corridor); tmpcor[0]->src.room = -1; ncorridor = 1; } break; case 34: { tmpcor[ncorridor] = New(corridor); tmpcor[ncorridor]->src.room = yyvsp[-2].corpos.room; tmpcor[ncorridor]->src.wall = yyvsp[-2].corpos.wall; tmpcor[ncorridor]->src.door = yyvsp[-2].corpos.door; tmpcor[ncorridor]->dest.room = yyvsp[0].corpos.room; tmpcor[ncorridor]->dest.wall = yyvsp[0].corpos.wall; tmpcor[ncorridor]->dest.door = yyvsp[0].corpos.door; ncorridor++; if (ncorridor >= MAX_OF_TYPE) { yyerror("Too many corridors in level!"); ncorridor--; } } break; case 35: { tmpcor[ncorridor] = New(corridor); tmpcor[ncorridor]->src.room = yyvsp[-2].corpos.room; tmpcor[ncorridor]->src.wall = yyvsp[-2].corpos.wall; tmpcor[ncorridor]->src.door = yyvsp[-2].corpos.door; tmpcor[ncorridor]->dest.room = -1; tmpcor[ncorridor]->dest.wall = yyvsp[0].i; ncorridor++; if (ncorridor >= MAX_OF_TYPE) { yyerror("Too many corridors in level!"); ncorridor--; } } break; case 36: { if ((unsigned) yyvsp[-5].i >= nrooms) yyerror("Wrong room number!"); yyval.corpos.room = yyvsp[-5].i; yyval.corpos.wall = yyvsp[-3].i; yyval.corpos.door = yyvsp[-1].i; } break; case 37: { store_room(); } break; case 38: { store_room(); } break; case 39: { tmproom[nrooms] = New(room); tmproom[nrooms]->parent = yyvsp[-1].map; tmproom[nrooms]->name = (char *) 0; tmproom[nrooms]->rtype = yyvsp[-9].i; tmproom[nrooms]->rlit = yyvsp[-7].i; tmproom[nrooms]->filled = yyvsp[0].i; tmproom[nrooms]->xalign = ERR; tmproom[nrooms]->yalign = ERR; tmproom[nrooms]->x = current_coord.x; tmproom[nrooms]->y = current_coord.y; tmproom[nrooms]->w = current_size.width; tmproom[nrooms]->h = current_size.height; in_room = 1; } break; case 40: { tmproom[nrooms] = New(room); tmproom[nrooms]->name = (char *) 0; tmproom[nrooms]->parent = (char *) 0; tmproom[nrooms]->rtype = yyvsp[-9].i; tmproom[nrooms]->rlit = yyvsp[-7].i; tmproom[nrooms]->filled = yyvsp[0].i; tmproom[nrooms]->xalign = current_align.x; tmproom[nrooms]->yalign = current_align.y; tmproom[nrooms]->x = current_coord.x; tmproom[nrooms]->y = current_coord.y; tmproom[nrooms]->w = current_size.width; tmproom[nrooms]->h = current_size.height; in_room = 1; } break; case 41: { yyval.i = 1; } break; case 42: { yyval.i = yyvsp[0].i; } break; case 43: { if ( yyvsp[-3].i < 1 || yyvsp[-3].i > 5 || yyvsp[-1].i < 1 || yyvsp[-1].i > 5 ) { yyerror("Room position should be between 1 & 5!"); } else { current_coord.x = yyvsp[-3].i; current_coord.y = yyvsp[-1].i; } } break; case 44: { current_coord.x = current_coord.y = ERR; } break; case 45: { if ( yyvsp[-3].i < 0 || yyvsp[-1].i < 0) { yyerror("Invalid subroom position !"); } else { current_coord.x = yyvsp[-3].i; current_coord.y = yyvsp[-1].i; } } break; case 46: { current_coord.x = current_coord.y = ERR; } break; case 47: { current_align.x = yyvsp[-3].i; current_align.y = yyvsp[-1].i; } break; case 48: { current_align.x = current_align.y = ERR; } break; case 49: { current_size.width = yyvsp[-3].i; current_size.height = yyvsp[-1].i; } break; case 50: { current_size.height = current_size.width = ERR; } break; case 67: { if (tmproom[nrooms]->name) yyerror("This room already has a name!"); else tmproom[nrooms]->name = yyvsp[0].map; } break; case 68: { if (tmproom[nrooms]->chance) yyerror("This room already assigned a chance!"); else if (tmproom[nrooms]->rtype == OROOM) yyerror("Only typed rooms can have a chance!"); else if (yyvsp[0].i < 1 || yyvsp[0].i > 99) yyerror("The chance is supposed to be percentile."); else tmproom[nrooms]->chance = yyvsp[0].i; } break; case 69: { /* ERR means random here */ if (yyvsp[-2].i == ERR && yyvsp[0].i != ERR) { yyerror("If the door wall is random, so must be its pos!"); tmprdoor[ndoor] = (struct room_door *)0; } else { tmprdoor[ndoor] = New(room_door); tmprdoor[ndoor]->secret = yyvsp[-6].i; tmprdoor[ndoor]->mask = yyvsp[-4].i; tmprdoor[ndoor]->wall = yyvsp[-2].i; tmprdoor[ndoor]->pos = yyvsp[0].i; tmprdoor[ndoor]->arti_key = 0; } } break; case 70: { if (tmprdoor[ndoor]) { ndoor++; if (ndoor >= MAX_OF_TYPE) { yyerror("Too many doors in room!"); ndoor--; } } } break; case 73: { int token = get_artifact_id(yyvsp[0].map); if (token == ERR) { char ebuf[100]; Sprintf(ebuf, "Undefined artifact key \"%s\"", yyvsp[0].map); yyerror(ebuf); } else if (tmprdoor[ndoor]) tmprdoor[ndoor]->arti_key = token; } break; case 80: { maze.filling = (schar) yyvsp[0].i; if (index(yyvsp[-2].map, '.')) yyerror("Invalid dot ('.') in level name."); if ((int) strlen(yyvsp[-2].map) > 8) yyerror("Level names limited to 8 characters."); yyval.map = yyvsp[-2].map; in_room = 0; n_plist = n_mlist = n_olist = 0; } break; case 81: { yyval.i = get_floor_type((char)yyvsp[0].i); } break; case 82: { yyval.i = -1; } break; case 85: { store_part(); } break; case 86: { tmppart[npart] = New(mazepart); tmppart[npart]->halign = 1; tmppart[npart]->valign = 1; tmppart[npart]->nrobjects = 0; tmppart[npart]->nloc = 0; tmppart[npart]->nrmonst = 0; tmppart[npart]->xsize = 1; tmppart[npart]->ysize = 1; tmppart[npart]->map = (char **) alloc(sizeof(char *)); tmppart[npart]->map[0] = (char *) alloc(1); tmppart[npart]->map[0][0] = STONE; max_x_map = COLNO-1; max_y_map = ROWNO; } break; case 87: { tmppart[npart] = New(mazepart); tmppart[npart]->halign = yyvsp[-1].i % 10; tmppart[npart]->valign = yyvsp[-1].i / 10; tmppart[npart]->nrobjects = 0; tmppart[npart]->nloc = 0; tmppart[npart]->nrmonst = 0; scan_map(yyvsp[0].map); Free(yyvsp[0].map); } break; case 88: { yyval.i = yyvsp[-2].i + (yyvsp[0].i * 10); } break; case 95: { if (tmppart[npart]->nrobjects) { yyerror("Object registers already initialized!"); } else { tmppart[npart]->robjects = (char *)alloc(n_olist); (void) memcpy((genericptr_t)tmppart[npart]->robjects, (genericptr_t)olist, n_olist); tmppart[npart]->nrobjects = n_olist; } } break; case 96: { if (tmppart[npart]->nlocset) yyerror("Location registers already initialized!"); else store_place_list(npart, 0, n_plist, plist); n_plist = 0; } break; case 97: { if (yyvsp[-3].i >= MAX_REGISTERS) yyerror("Register Index overflow!"); else store_place_list(npart, yyvsp[-3].i, n_plist, plist); n_plist = 0; } break; case 98: { if (tmppart[npart]->nrmonst) { yyerror("Monster registers already initialized!"); } else { tmppart[npart]->rmonst = (char *) alloc(n_mlist); (void) memcpy((genericptr_t)tmppart[npart]->rmonst, (genericptr_t)mlist, n_mlist); tmppart[npart]->nrmonst = n_mlist; } } break; case 99: { /* nothing */ } break; case 100: { if (n_olist < MAX_REGISTERS) olist[n_olist++] = yyvsp[0].i; else yyerror("Object list too long!"); } break; case 101: { if (n_olist < MAX_REGISTERS) olist[n_olist++] = yyvsp[-2].i; else yyerror("Object list too long!"); } break; case 102: { if (n_mlist < MAX_REGISTERS) mlist[n_mlist++] = yyvsp[0].i; else yyerror("Monster list too long!"); } break; case 103: { if (n_mlist < MAX_REGISTERS) mlist[n_mlist++] = yyvsp[-2].i; else yyerror("Monster list too long!"); } break; case 104: { if (n_plist < MAX_REGISTERS) plist[n_plist++] = current_coord; else yyerror("Location list too long!"); } break; case 105: { if (n_plist < MAX_REGISTERS) plist[n_plist++] = current_coord; else yyerror("Location list too long!"); } break; case 130: { tmpmonst[nmons] = New(monster); tmpmonst[nmons]->x = current_coord.x; tmpmonst[nmons]->y = current_coord.y; tmpmonst[nmons]->class = yyvsp[-4].i; tmpmonst[nmons]->peaceful = -1; /* no override */ tmpmonst[nmons]->asleep = -1; tmpmonst[nmons]->align = - MAX_REGISTERS - 2; tmpmonst[nmons]->name.str = 0; tmpmonst[nmons]->appear = 0; tmpmonst[nmons]->appear_as.str = 0; tmpmonst[nmons]->chance = yyvsp[-6].i; tmpmonst[nmons]->id = NON_PM; if (!in_room) check_coord(current_coord.x, current_coord.y, "Monster"); if (yyvsp[-2].map) { int token = get_monster_id(yyvsp[-2].map, (char) yyvsp[-4].i); if (token == ERR) yywarning( "Invalid monster name! Making random monster."); else tmpmonst[nmons]->id = token; Free(yyvsp[-2].map); } } break; case 131: { if (++nmons >= MAX_OF_TYPE) { yyerror("Too many monsters in room or mazepart!"); nmons--; } } break; case 134: { tmpmonst[nmons]->name.str = yyvsp[0].map; } break; case 135: { tmpmonst[nmons]->peaceful = yyvsp[0].i; } break; case 136: { tmpmonst[nmons]->asleep = yyvsp[0].i; } break; case 137: { tmpmonst[nmons]->align = yyvsp[0].i; } break; case 138: { tmpmonst[nmons]->appear = yyvsp[-1].i; tmpmonst[nmons]->appear_as.str = yyvsp[0].map; } break; case 139: { } break; case 140: { /* 1: is contents of preceeding object with 2 */ /* 2: is a container */ /* 0: neither */ tmpobj[nobj-1]->containment = 2; } break; case 141: { tmpobj[nobj] = New(object); tmpobj[nobj]->class = yyvsp[-2].i; tmpobj[nobj]->corpsenm = NON_PM; tmpobj[nobj]->curse_state = -1; tmpobj[nobj]->name.str = 0; tmpobj[nobj]->chance = yyvsp[-4].i; tmpobj[nobj]->id = -1; tmpobj[nobj]->oflags = 0; if (yyvsp[0].map) { int token = get_object_id(yyvsp[0].map, yyvsp[-2].i); if (token == ERR) yywarning( "Illegal object name! Making random object."); else tmpobj[nobj]->id = token; Free(yyvsp[0].map); } } break; case 142: { if (++nobj >= MAX_OF_TYPE) { yyerror("Too many objects in room or mazepart!"); nobj--; } } break; case 143: { tmpobj[nobj]->containment = 0; tmpobj[nobj]->x = current_coord.x; tmpobj[nobj]->y = current_coord.y; if (!in_room) check_coord(current_coord.x, current_coord.y, "Object"); } break; case 144: { tmpobj[nobj]->containment = 1; /* random coordinate, will be overridden anyway */ tmpobj[nobj]->x = -MAX_REGISTERS-2; tmpobj[nobj]->y = -MAX_REGISTERS-2; } break; case 145: { tmpobj[nobj]->spe = -127; /* Note below: we're trying to make as many of these optional as * possible. We clearly can't make curse_state, enchantment, and * monster_id _all_ optional, since ",random" would be ambiguous. * We can't even just make enchantment mandatory, since if we do that * alone, ",random" requires too much lookahead to parse. */ } break; case 146: { } break; case 147: { } break; case 148: { } break; case 149: { if (nobj > 0) tmpobj[nobj-1]->oflags = yyvsp[0].i; else yyerror("Need an object before object flags!"); } break; case 150: { yyval.i = (yyvsp[-2].i | yyvsp[0].i); } break; case 151: { yyval.i = yyvsp[0].i; } break; case 152: { tmpobj[nobj]->curse_state = -1; } break; case 153: { tmpobj[nobj]->curse_state = yyvsp[0].i; } break; case 154: { int token = get_monster_id(yyvsp[0].map, (char)0); if (token == ERR) /* "random" */ tmpobj[nobj]->corpsenm = NON_PM - 1; else tmpobj[nobj]->corpsenm = token; Free(yyvsp[0].map); } break; case 155: { tmpobj[nobj]->spe = -127; } break; case 156: { tmpobj[nobj]->spe = yyvsp[0].i; } break; case 158: { } break; case 159: { tmpobj[nobj]->name.str = yyvsp[0].map; } break; case 160: { tmpdoor[ndoor] = New(door); tmpdoor[ndoor]->x = current_coord.x; tmpdoor[ndoor]->y = current_coord.y; tmpdoor[ndoor]->mask = yyvsp[-2].i; tmpdoor[ndoor]->arti_key = 0; if(current_coord.x >= 0 && current_coord.y >= 0 && tmpmap[current_coord.y][current_coord.x] != DOOR && tmpmap[current_coord.y][current_coord.x] != SDOOR) yyerror("Door decl doesn't match the map"); } break; case 161: { if (++ndoor >= MAX_OF_TYPE) { yyerror("Too many doors in mazepart!"); ndoor--; } } break; case 164: { int token = get_artifact_id(yyvsp[0].map); if (token == ERR) { char ebuf[100]; Sprintf(ebuf, "Undefined artifact key \"%s\"", yyvsp[0].map); yyerror(ebuf); } else tmpdoor[ndoor]->arti_key = token; } break; case 165: { tmptrap[ntrap] = New(trap); tmptrap[ntrap]->x = current_coord.x; tmptrap[ntrap]->y = current_coord.y; tmptrap[ntrap]->type = yyvsp[-2].i; tmptrap[ntrap]->chance = yyvsp[-4].i; if (!in_room) check_coord(current_coord.x, current_coord.y, "Trap"); if (++ntrap >= MAX_OF_TYPE) { yyerror("Too many traps in room or mazepart!"); ntrap--; } } break; case 166: { int x, y, dir; tmpdb[ndb] = New(drawbridge); x = tmpdb[ndb]->x = current_coord.x; y = tmpdb[ndb]->y = current_coord.y; /* convert dir from a DIRECTION to a DB_DIR */ dir = yyvsp[-2].i; switch(dir) { case W_NORTH: dir = DB_NORTH; y--; break; case W_SOUTH: dir = DB_SOUTH; y++; break; case W_EAST: dir = DB_EAST; x++; break; case W_WEST: dir = DB_WEST; x--; break; default: yyerror("Invalid drawbridge direction"); break; } tmpdb[ndb]->dir = dir; if (current_coord.x >= 0 && current_coord.y >= 0 && !IS_WALL(tmpmap[y][x])) { char ebuf[60]; Sprintf(ebuf, "Wall needed for drawbridge (%02d, %02d)", current_coord.x, current_coord.y); yyerror(ebuf); } if ( yyvsp[0].i == D_ISOPEN ) tmpdb[ndb]->db_open = 1; else if ( yyvsp[0].i == D_CLOSED ) tmpdb[ndb]->db_open = 0; else yyerror("A drawbridge can only be open or closed!"); ndb++; if (ndb >= MAX_OF_TYPE) { yyerror("Too many drawbridges in mazepart!"); ndb--; } } break; case 167: { tmpwalk[nwalk] = New(walk); tmpwalk[nwalk]->x = current_coord.x; tmpwalk[nwalk]->y = current_coord.y; tmpwalk[nwalk]->dir = yyvsp[0].i; nwalk++; if (nwalk >= MAX_OF_TYPE) { yyerror("Too many mazewalks in mazepart!"); nwalk--; } } break; case 168: { wallify_map(); } break; case 169: { tmplad[nlad] = New(lad); tmplad[nlad]->x = current_coord.x; tmplad[nlad]->y = current_coord.y; tmplad[nlad]->up = yyvsp[0].i; if (!in_room) check_coord(current_coord.x, current_coord.y, "Ladder"); nlad++; if (nlad >= MAX_OF_TYPE) { yyerror("Too many ladders in mazepart!"); nlad--; } } break; case 170: { tmpstair[nstair] = New(stair); tmpstair[nstair]->x = current_coord.x; tmpstair[nstair]->y = current_coord.y; tmpstair[nstair]->up = yyvsp[0].i; if (!in_room) check_coord(current_coord.x, current_coord.y, "Stairway"); nstair++; if (nstair >= MAX_OF_TYPE) { yyerror("Too many stairs in room or mazepart!"); nstair--; } } break; case 171: { tmplreg[nlreg] = New(lev_region); tmplreg[nlreg]->in_islev = yyvsp[0].i; tmplreg[nlreg]->inarea.x1 = current_region.x1; tmplreg[nlreg]->inarea.y1 = current_region.y1; tmplreg[nlreg]->inarea.x2 = current_region.x2; tmplreg[nlreg]->inarea.y2 = current_region.y2; } break; case 172: { tmplreg[nlreg]->del_islev = yyvsp[-2].i; tmplreg[nlreg]->delarea.x1 = current_region.x1; tmplreg[nlreg]->delarea.y1 = current_region.y1; tmplreg[nlreg]->delarea.x2 = current_region.x2; tmplreg[nlreg]->delarea.y2 = current_region.y2; if(yyvsp[0].i) tmplreg[nlreg]->rtype = LR_UPSTAIR; else tmplreg[nlreg]->rtype = LR_DOWNSTAIR; tmplreg[nlreg]->rname.str = 0; nlreg++; if (nlreg >= MAX_OF_TYPE) { yyerror("Too many levregions in mazepart!"); nlreg--; } } break; case 173: { if ((unsigned) yyvsp[-3].i != nrndlreg) yyerror("Wrong random region number!"); tmprndlreg[nrndlreg] = New(lev_region); tmprndlreg[nrndlreg]->in_islev = yyvsp[0].i; tmprndlreg[nrndlreg]->inarea.x1 = current_region.x1; tmprndlreg[nrndlreg]->inarea.y1 = current_region.y1; tmprndlreg[nrndlreg]->inarea.x2 = current_region.x2; tmprndlreg[nrndlreg]->inarea.y2 = current_region.y2; } break; case 174: { tmprndlreg[nrndlreg]->del_islev = yyvsp[0].i; tmprndlreg[nrndlreg]->delarea.x1 = current_region.x1; tmprndlreg[nrndlreg]->delarea.y1 = current_region.y1; tmprndlreg[nrndlreg]->delarea.x2 = current_region.x2; tmprndlreg[nrndlreg]->delarea.y2 = current_region.y2; tmprndlreg[nrndlreg]->rtype = 0; tmprndlreg[nrndlreg]->rname.str = (char *)0; nrndlreg++; if (nrndlreg >= MAX_REGISTERS) { yyerror("Too many random regions!"); nrndlreg--; } } break; case 175: { tmplreg[nlreg] = New(lev_region); tmplreg[nlreg]->in_islev = yyvsp[0].i; tmplreg[nlreg]->inarea.x1 = current_region.x1; tmplreg[nlreg]->inarea.y1 = current_region.y1; tmplreg[nlreg]->inarea.x2 = current_region.x2; tmplreg[nlreg]->inarea.y2 = current_region.y2; } break; case 176: { tmplreg[nlreg]->del_islev = yyvsp[-2].i; tmplreg[nlreg]->delarea.x1 = current_region.x1; tmplreg[nlreg]->delarea.y1 = current_region.y1; tmplreg[nlreg]->delarea.x2 = current_region.x2; tmplreg[nlreg]->delarea.y2 = current_region.y2; tmplreg[nlreg]->rtype = LR_PORTAL; tmplreg[nlreg]->rname.str = yyvsp[0].map; nlreg++; if (nlreg >= MAX_OF_TYPE) { yyerror("Too many levregions in mazepart!"); nlreg--; } } break; case 177: { tmplreg[nlreg] = New(lev_region); tmplreg[nlreg]->in_islev = yyvsp[0].i; tmplreg[nlreg]->inarea.x1 = current_region.x1; tmplreg[nlreg]->inarea.y1 = current_region.y1; tmplreg[nlreg]->inarea.x2 = current_region.x2; tmplreg[nlreg]->inarea.y2 = current_region.y2; } break; case 178: { tmplreg[nlreg]->del_islev = yyvsp[0].i; tmplreg[nlreg]->delarea.x1 = current_region.x1; tmplreg[nlreg]->delarea.y1 = current_region.y1; tmplreg[nlreg]->delarea.x2 = current_region.x2; tmplreg[nlreg]->delarea.y2 = current_region.y2; } break; case 179: { switch(yyvsp[0].i) { case -1: tmplreg[nlreg]->rtype = LR_TELE; break; case 0: tmplreg[nlreg]->rtype = LR_DOWNTELE; break; case 1: tmplreg[nlreg]->rtype = LR_UPTELE; break; } tmplreg[nlreg]->rname.str = 0; nlreg++; if (nlreg >= MAX_OF_TYPE) { yyerror("Too many levregions in mazepart!"); nlreg--; } } break; case 180: { tmplreg[nlreg] = New(lev_region); tmplreg[nlreg]->in_islev = yyvsp[0].i; tmplreg[nlreg]->inarea.x1 = current_region.x1; tmplreg[nlreg]->inarea.y1 = current_region.y1; tmplreg[nlreg]->inarea.x2 = current_region.x2; tmplreg[nlreg]->inarea.y2 = current_region.y2; } break; case 181: { tmplreg[nlreg]->del_islev = yyvsp[0].i; tmplreg[nlreg]->delarea.x1 = current_region.x1; tmplreg[nlreg]->delarea.y1 = current_region.y1; tmplreg[nlreg]->delarea.x2 = current_region.x2; tmplreg[nlreg]->delarea.y2 = current_region.y2; tmplreg[nlreg]->rtype = LR_BRANCH; tmplreg[nlreg]->rname.str = 0; nlreg++; if (nlreg >= MAX_OF_TYPE) { yyerror("Too many levregions in mazepart!"); nlreg--; } } break; case 182: { yyval.i = -1; } break; case 183: { yyval.i = yyvsp[0].i; } break; case 184: { yyval.i = 0; } break; case 185: { /* This series of if statements is a hack for MSC 5.1. It seems that its tiny little brain cannot compile if these are all one big if statement. */ if (yyvsp[-7].i <= 0 || yyvsp[-7].i >= COLNO) yyerror("Region out of level range!"); else if (yyvsp[-5].i < 0 || yyvsp[-5].i >= ROWNO) yyerror("Region out of level range!"); else if (yyvsp[-3].i <= 0 || yyvsp[-3].i >= COLNO) yyerror("Region out of level range!"); else if (yyvsp[-1].i < 0 || yyvsp[-1].i >= ROWNO) yyerror("Region out of level range!"); current_region.x1 = yyvsp[-7].i; current_region.y1 = yyvsp[-5].i; current_region.x2 = yyvsp[-3].i; current_region.y2 = yyvsp[-1].i; yyval.i = 1; } break; case 186: { tmpfountain[nfountain] = New(fountain); tmpfountain[nfountain]->x = current_coord.x; tmpfountain[nfountain]->y = current_coord.y; if (!in_room) check_coord(current_coord.x, current_coord.y, "Fountain"); nfountain++; if (nfountain >= MAX_OF_TYPE) { yyerror("Too many fountains in room or mazepart!"); nfountain--; } } break; case 187: { tmpsink[nsink] = New(sink); tmpsink[nsink]->x = current_coord.x; tmpsink[nsink]->y = current_coord.y; nsink++; if (nsink >= MAX_OF_TYPE) { yyerror("Too many sinks in room!"); nsink--; } } break; case 188: { tmppool[npool] = New(pool); tmppool[npool]->x = current_coord.x; tmppool[npool]->y = current_coord.y; npool++; if (npool >= MAX_OF_TYPE) { yyerror("Too many pools in room!"); npool--; } } break; case 189: { tmpdig[ndig] = New(digpos); tmpdig[ndig]->x1 = current_region.x1; tmpdig[ndig]->y1 = current_region.y1; tmpdig[ndig]->x2 = current_region.x2; tmpdig[ndig]->y2 = current_region.y2; ndig++; if (ndig >= MAX_OF_TYPE) { yyerror("Too many diggables in mazepart!"); ndig--; } } break; case 190: { tmppass[npass] = New(digpos); tmppass[npass]->x1 = current_region.x1; tmppass[npass]->y1 = current_region.y1; tmppass[npass]->x2 = current_region.x2; tmppass[npass]->y2 = current_region.y2; npass++; if (npass >= 32) { yyerror("Too many passwalls in mazepart!"); npass--; } } break; case 191: { tmpreg[nreg] = New(region); tmpreg[nreg]->x1 = current_region.x1; tmpreg[nreg]->y1 = current_region.y1; tmpreg[nreg]->x2 = current_region.x2; tmpreg[nreg]->y2 = current_region.y2; tmpreg[nreg]->rlit = yyvsp[-3].i; tmpreg[nreg]->rtype = yyvsp[-1].i; if(yyvsp[0].i & 1) tmpreg[nreg]->rtype += MAXRTYPE+1; tmpreg[nreg]->rirreg = ((yyvsp[0].i & 2) != 0); if(current_region.x1 > current_region.x2 || current_region.y1 > current_region.y2) yyerror("Region start > end!"); if(tmpreg[nreg]->rtype == VAULT && (tmpreg[nreg]->rirreg || (tmpreg[nreg]->x2 - tmpreg[nreg]->x1 != 1) || (tmpreg[nreg]->y2 - tmpreg[nreg]->y1 != 1))) yyerror("Vaults must be exactly 2x2!"); if(want_warnings && !tmpreg[nreg]->rirreg && current_region.x1 > 0 && current_region.y1 > 0 && current_region.x2 < (int)max_x_map && current_region.y2 < (int)max_y_map) { /* check for walls in the room */ char ebuf[60]; register int x, y, nrock = 0; for(y=current_region.y1; y<=current_region.y2; y++) for(x=current_region.x1; x<=current_region.x2; x++) if(IS_ROCK(tmpmap[y][x]) || IS_DOOR(tmpmap[y][x])) nrock++; if(nrock) { Sprintf(ebuf, "Rock in room (%02d,%02d,%02d,%02d)?!", current_region.x1, current_region.y1, current_region.x2, current_region.y2); yywarning(ebuf); } if ( !IS_ROCK(tmpmap[current_region.y1-1][current_region.x1-1]) || !IS_ROCK(tmpmap[current_region.y2+1][current_region.x1-1]) || !IS_ROCK(tmpmap[current_region.y1-1][current_region.x2+1]) || !IS_ROCK(tmpmap[current_region.y2+1][current_region.x2+1])) { Sprintf(ebuf, "NonRock edge in room (%02d,%02d,%02d,%02d)?!", current_region.x1, current_region.y1, current_region.x2, current_region.y2); yywarning(ebuf); } } else if(tmpreg[nreg]->rirreg && !IS_ROOM(tmpmap[current_region.y1][current_region.x1])) { char ebuf[60]; Sprintf(ebuf, "Rock in irregular room (%02d,%02d)?!", current_region.x1, current_region.y1); yyerror(ebuf); } nreg++; if (nreg >= MAX_OF_TYPE) { yyerror("Too many regions in mazepart!"); nreg--; } } break; case 192: { tmpaltar[naltar] = New(altar); tmpaltar[naltar]->x = current_coord.x; tmpaltar[naltar]->y = current_coord.y; tmpaltar[naltar]->align = yyvsp[-2].i; tmpaltar[naltar]->shrine = yyvsp[0].i; if (!in_room) check_coord(current_coord.x, current_coord.y, "Altar"); naltar++; if (naltar >= MAX_OF_TYPE) { yyerror("Too many altars in room or mazepart!"); naltar--; } } break; case 193: { tmpgold[ngold] = New(gold); tmpgold[ngold]->x = current_coord.x; tmpgold[ngold]->y = current_coord.y; tmpgold[ngold]->amount = yyvsp[-2].i; if (!in_room) check_coord(current_coord.x, current_coord.y, "Gold"); ngold++; if (ngold >= MAX_OF_TYPE) { yyerror("Too many golds in room or mazepart!"); ngold--; } } break; case 194: { tmpengraving[nengraving] = New(engraving); tmpengraving[nengraving]->x = current_coord.x; tmpengraving[nengraving]->y = current_coord.y; tmpengraving[nengraving]->engr.str = yyvsp[0].map; tmpengraving[nengraving]->etype = yyvsp[-2].i; if (!in_room) check_coord(current_coord.x, current_coord.y, "Engraving"); nengraving++; if (nengraving >= MAX_OF_TYPE) { yyerror("Too many engravings in room or mazepart!"); nengraving--; } } break; case 196: { yyval.i = - MAX_REGISTERS - 1; } break; case 199: { yyval.i = - MAX_REGISTERS - 1; } break; case 202: { yyval.map = (char *) 0; } break; case 204: { yyval.map = (char *) 0; } break; case 205: { int token = get_trap_type(yyvsp[0].map); if (token == ERR) yyerror("Unknown trap type!"); yyval.i = token; Free(yyvsp[0].map); } break; case 207: { int token = get_room_type(yyvsp[0].map); if (token == ERR) { yywarning("Unknown room type! Making ordinary room..."); yyval.i = OROOM; } else yyval.i = token; Free(yyvsp[0].map); } break; case 209: { yyval.i = 0; } break; case 210: { yyval.i = yyvsp[0].i; } break; case 211: { yyval.i = yyvsp[-2].i + (yyvsp[0].i << 1); } break; case 215: { current_coord.x = current_coord.y = -MAX_REGISTERS-2; } break; case 222: { yyval.i = - MAX_REGISTERS - 1; } break; case 225: { if ( yyvsp[-1].i >= MAX_REGISTERS ) yyerror("Register Index overflow!"); else { current_coord.x = -1; current_coord.y = - yyvsp[-1].i - 1; } } break; case 226: { if ( yyvsp[-4].i >= MAX_REGISTERS || yyvsp[-1].i >= MAX_REGISTERS ) yyerror("Register Index overflow!"); else { current_coord.x = - yyvsp[-4].i - 1; current_coord.y = - yyvsp[-1].i - 1; } } break; case 227: { if ( yyvsp[-1].i < 0 || yyvsp[-1].i >= nrndlreg ) yyerror("Register Index overflow!"); else { current_coord.x = -MAX_REGISTERS-1; current_coord.y = - yyvsp[-1].i - 1; } } break; case 228: { if ( yyvsp[-1].i >= MAX_REGISTERS ) yyerror("Register Index overflow!"); else yyval.i = - yyvsp[-1].i - 1; } break; case 229: { if ( yyvsp[-1].i >= MAX_REGISTERS ) yyerror("Register Index overflow!"); else yyval.i = - yyvsp[-1].i - 1; } break; case 230: { if ( yyvsp[-1].i >= 3 ) yyerror("Register Index overflow!"); else yyval.i = - yyvsp[-1].i - 1; } break; case 232: { current_coord.x = (char)-1; current_coord.y = (char)-1; } break; case 233: { if (check_monster_char((char) yyvsp[0].i)) yyval.i = yyvsp[0].i ; else { yyerror("Unknown monster class!"); yyval.i = ERR; } } break; case 234: { char c = yyvsp[0].i; if (check_object_char(c)) yyval.i = c; else { yyerror("Unknown char class!"); yyval.i = ERR; } } break; case 238: { yyval.i = 100; /* default is 100% */ } break; case 239: { if (yyvsp[0].i <= 0 || yyvsp[0].i > 100) yyerror("Expected percentile chance."); yyval.i = yyvsp[0].i; } break; case 242: { if (!in_room && !init_lev.init_present && (yyvsp[-3].i < 0 || yyvsp[-3].i > (int)max_x_map || yyvsp[-1].i < 0 || yyvsp[-1].i > (int)max_y_map)) yyerror("Coordinates out of map range!"); current_coord.x = yyvsp[-3].i; current_coord.y = yyvsp[-1].i; } break; case 243: { /* This series of if statements is a hack for MSC 5.1. It seems that its tiny little brain cannot compile if these are all one big if statement. */ if (yyvsp[-7].i < 0 || yyvsp[-7].i > (int)max_x_map) yyerror("Region out of map range!"); else if (yyvsp[-5].i < 0 || yyvsp[-5].i > (int)max_y_map) yyerror("Region out of map range!"); else if (yyvsp[-3].i < 0 || yyvsp[-3].i > (int)max_x_map) yyerror("Region out of map range!"); else if (yyvsp[-1].i < 0 || yyvsp[-1].i > (int)max_y_map) yyerror("Region out of map range!"); current_region.x1 = yyvsp[-7].i; current_region.y1 = yyvsp[-5].i; current_region.x2 = yyvsp[-3].i; current_region.y2 = yyvsp[-1].i; } break; } yyssp -= yym; yystate = *yyssp; yyvsp -= yym; yym = yylhs[yyn]; if (yystate == 0 && yym == 0) { #if YYDEBUG if (yydebug) printf("%sdebug: after reduction, shifting from state 0 to\ state %d\n", YYPREFIX, YYFINAL); #endif yystate = YYFINAL; *++yyssp = YYFINAL; *++yyvsp = yyval; if (yychar < 0) { if ((yychar = yylex()) < 0) yychar = 0; #if YYDEBUG if (yydebug) { yys = 0; if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; if (!yys) yys = "illegal-symbol"; printf("%sdebug: state %d, reading %d (%s)\n", YYPREFIX, YYFINAL, yychar, yys); } #endif } if (yychar == 0) goto yyaccept; goto yyloop; } if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 && yyn <= YYTABLESIZE && yycheck[yyn] == yystate) yystate = yytable[yyn]; else yystate = yydgoto[yym]; #if YYDEBUG if (yydebug) printf("%sdebug: after reduction, shifting from state %d \ to state %d\n", YYPREFIX, *yyssp, yystate); #endif if (yyssp >= yysslim && yygrowstack()) { goto yyoverflow; } *++yyssp = yystate; *++yyvsp = yyval; goto yyloop; yyoverflow: yyerror("yacc stack overflow"); yyabort: return (1); yyaccept: return (0); } slashem-0.0.7E7F3/sys/share/slashem.ico0000664000076400007640000000137610545462317015733 0ustar aliali è( @€€€€€€€€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿöfffffffffffffffÿfffffffffffffffÿˆˆˆˆˆˆˆˆˆˆˆˆˆffÿˆˆˆˆˆˆˆˆˆˆˆˆˆffÿˆˆˆˆ…UUˆˆˆˆˆˆffÿˆˆˆˆUˆˆˆˆˆˆffÿˆˆˆˆˆˆˆˆˆˆffÿˆˆUUPUXˆˆˆˆˆffÿˆ‹»»°ãUˆˆˆˆˆffÿˆ»»»¾î5Xˆˆˆˆffÿ‹»»»»»îãXˆˆˆˆffÿ‹»»»»»¾îSˆˆˆˆffÿ‹»»™™›»îã8ˆˆˆffÿ‹»¹™™™»¾î3ˆˆˆffÿ‹»™™™™›»îã8ˆˆffÿ‹¹™™™™™»^î3ˆˆffÿ‹¹™™™™™»Xîã8ˆffÿ‹¹™™™™™»XŽî3ˆffÿ‹¹™™™™™»Xˆîãˆffÿ‹¹™™™™™»XˆŽîˆffÿ‹»™™™™›»Xˆˆîˆffÿ‹»¹™™™»»Xˆˆˆˆffÿ‹»»™™›»»Xˆˆˆˆffÿ‹»»»»»»»Xˆˆˆˆffÿ‹»»»»»»»ˆˆˆˆˆffÿ‹»ˆˆˆˆ‹»ˆˆˆˆˆffÿ‹¸ˆˆˆˆˆ»ˆˆˆˆˆffÿˆˆˆˆˆˆˆˆˆˆˆˆˆffÿˆˆˆˆˆˆˆˆˆˆˆˆˆffÿˆˆˆˆˆˆˆˆˆˆˆˆˆffÿÿÿÿÿÿÿÿÿÿÿÿÿÿöfÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿslashem-0.0.7E7F3/sys/share/lev_lex.c0000664000076400007640000021507610545462317015411 0ustar aliali/* A lexical scanner generated by flex */ /* Scanner skeleton version: * $Header: /cvsroot/slashem/slashem/sys/share/lev_lex.c,v 1.6 2003/02/25 14:52:30 j_ali Exp $ */ #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 #define YY_FLEX_MINOR_VERSION 5 #include #include /* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */ #ifdef c_plusplus #ifndef __cplusplus #define __cplusplus #endif #endif #ifdef __cplusplus #include /* Use prototypes in function declarations. */ #define YY_USE_PROTOS /* The "const" storage-class-modifier is valid. */ #define YY_USE_CONST #else /* ! __cplusplus */ #if __STDC__ #define YY_USE_PROTOS #define YY_USE_CONST #endif /* __STDC__ */ #endif /* ! __cplusplus */ #ifdef __TURBOC__ #pragma warn -rch #pragma warn -use #include #include #define YY_USE_CONST #define YY_USE_PROTOS #endif #ifdef YY_USE_CONST #define yyconst const #else #define yyconst #endif #ifdef YY_USE_PROTOS #define YY_PROTO(proto) proto #else #define YY_PROTO(proto) () #endif /* Returned upon end-of-file. */ #define YY_NULL 0 /* Promotes a possibly negative, possibly signed char to an unsigned * integer for use as an array index. If the signed char is negative, * we want to instead treat it as an 8-bit unsigned char, hence the * double cast. */ #define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) /* Enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN. */ #define BEGIN yy_start = 1 + 2 * /* Translate the current start state into a value that can be later handed * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ #define YY_START ((yy_start - 1) / 2) #define YYSTATE YY_START /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) /* Special action meaning "start processing a new file". */ #define YY_NEW_FILE yyrestart( yyin ) #define YY_END_OF_BUFFER_CHAR 0 /* Size of default input buffer. */ #define YY_BUF_SIZE 16384 typedef struct yy_buffer_state *YY_BUFFER_STATE; extern int yyleng; extern FILE *yyin, *yyout; #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 /* The funky do-while in the following #define is used to turn the definition * int a single C statement (which needs a semi-colon terminator). This * avoids problems with code like: * * if ( condition_holds ) * yyless( 5 ); * else * do_something_else(); * * Prior to using the do-while the compiler would get upset at the * "else" because it interpreted the "if" statement as being all * done when it reached the ';' after the yyless() call. */ /* Return all but the first 'n' matched characters back to the input stream. */ #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ *yy_cp = yy_hold_char; \ YY_RESTORE_YY_MORE_OFFSET \ yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \ YY_DO_BEFORE_ACTION; /* set up yytext again */ \ } \ while ( 0 ) #define unput(c) yyunput( c, yytext_ptr ) /* The following is because we cannot portably get our hands on size_t * (without autoconf's help, which isn't available because we want * flex-generated scanners to compile on their own). */ typedef unsigned int yy_size_t; struct yy_buffer_state { FILE *yy_input_file; char *yy_ch_buf; /* input buffer */ char *yy_buf_pos; /* current position in input buffer */ /* Size of input buffer in bytes, not including room for EOB * characters. */ yy_size_t yy_buf_size; /* Number of characters read into yy_ch_buf, not including EOB * characters. */ int yy_n_chars; /* Whether we "own" the buffer - i.e., we know we created it, * and can realloc() it to grow it, and should free() it to * delete it. */ int yy_is_our_buffer; /* Whether this is an "interactive" input source; if so, and * if we're using stdio for input, then we want to use getc() * instead of fread(), to make sure we stop fetching input after * each newline. */ int yy_is_interactive; /* Whether we're considered to be at the beginning of a line. * If so, '^' rules will be active on the next match, otherwise * not. */ int yy_at_bol; /* Whether to try to fill the input buffer when we reach the * end of it. */ int yy_fill_buffer; int yy_buffer_status; #define YY_BUFFER_NEW 0 #define YY_BUFFER_NORMAL 1 /* When an EOF's been seen but there's still some text to process * then we mark the buffer as YY_EOF_PENDING, to indicate that we * shouldn't try reading from the input source any more. We might * still have a bunch of tokens to match, though, because of * possible backing-up. * * When we actually see the EOF, we change the status to "new" * (via yyrestart()), so that the user can continue scanning by * just pointing yyin at a new input file. */ #define YY_BUFFER_EOF_PENDING 2 }; static YY_BUFFER_STATE yy_current_buffer = 0; /* We provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general * "scanner state". */ #define YY_CURRENT_BUFFER yy_current_buffer /* yy_hold_char holds the character lost when yytext is formed. */ static char yy_hold_char; static int yy_n_chars; /* number of characters read into yy_ch_buf */ int yyleng; /* Points to current character in buffer. */ static char *yy_c_buf_p = (char *) 0; static int yy_init = 1; /* whether we need to initialize */ static int yy_start = 0; /* start state number */ /* Flag which is used to allow yywrap()'s to do buffer switches * instead of setting up a fresh yyin. A bit of a hack ... */ static int yy_did_buffer_switch_on_eof; void yyrestart YY_PROTO(( FILE *input_file )); void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer )); void yy_load_buffer_state YY_PROTO(( void )); YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size )); void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b )); void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file )); void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b )); #define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer ) YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size )); YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str )); YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len )); static void *yy_flex_alloc YY_PROTO(( yy_size_t )); static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t )); static void yy_flex_free YY_PROTO(( void * )); #define yy_new_buffer yy_create_buffer #define yy_set_interactive(is_interactive) \ { \ if ( ! yy_current_buffer ) \ yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ yy_current_buffer->yy_is_interactive = is_interactive; \ } #define yy_set_bol(at_bol) \ { \ if ( ! yy_current_buffer ) \ yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ yy_current_buffer->yy_at_bol = at_bol; \ } #define YY_AT_BOL() (yy_current_buffer->yy_at_bol) typedef unsigned char YY_CHAR; FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; typedef int yy_state_type; extern char *yytext; #define yytext_ptr yytext static yy_state_type yy_get_previous_state YY_PROTO(( void )); static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state )); static int yy_get_next_buffer YY_PROTO(( void )); static void yy_fatal_error YY_PROTO(( yyconst char msg[] )); /* Done after the current pattern has been matched and before the * corresponding action - sets up yytext. */ #define YY_DO_BEFORE_ACTION \ yytext_ptr = yy_bp; \ yyleng = (int) (yy_cp - yy_bp); \ yy_hold_char = *yy_cp; \ *yy_cp = '\0'; \ yy_c_buf_p = yy_cp; #define YY_NUM_RULES 120 #define YY_END_OF_BUFFER 121 static yyconst short int yy_accept[679] = { 0, 0, 0, 0, 0, 121, 119, 116, 115, 119, 119, 119, 119, 113, 4, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 2, 119, 116, 119, 119, 113, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 116, 115, 0, 114, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 3, 0, 2, 2, 0, 116, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 118, 0, 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 0, 0, 0, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 42, 0, 0, 0, 6, 0, 0, 44, 0, 0, 0, 0, 35, 0, 0, 0, 38, 34, 0, 0, 0, 17, 0, 0, 112, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 91, 94, 53, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 97, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 0, 0, 0, 55, 12, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 8, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 61, 89, 0, 0, 83, 0, 0, 0, 0, 77, 0, 0, 0, 0, 0, 92, 0, 0, 0, 0, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 103, 0, 0, 60, 0, 0, 67, 0, 0, 0, 0, 54, 0, 0, 0, 71, 0, 0, 32, 45, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 0, 0, 13, 0, 29, 0, 22, 0, 0, 0, 0, 82, 0, 69, 51, 65, 48, 0, 0, 101, 0, 72, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 50, 107, 0, 0, 0, 58, 0, 56, 62, 0, 98, 0, 88, 110, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 16, 0, 0, 0, 0, 39, 0, 21, 0, 99, 0, 0, 95, 0, 0, 0, 81, 0, 0, 0, 0, 59, 76, 74, 0, 0, 0, 0, 87, 0, 0, 0, 0, 41, 0, 0, 33, 11, 9, 20, 0, 0, 14, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 86, 0, 0, 104, 80, 0, 100, 73, 15, 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, 78, 102, 64, 0, 106, 46, 84, 85, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 37, 0, 0, 0, 0, 0, 0, 79, 109, 0, 0, 0, 25, 31, 0, 0, 0, 23, 0, 0, 24, 30, 40, 0 } ; static yyconst int yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 6, 7, 1, 8, 1, 9, 1, 1, 1, 10, 1, 11, 12, 1, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 1, 1, 1, 1, 1, 1, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 1, 31, 32, 33, 34, 35, 36, 1, 37, 38, 39, 40, 41, 1, 42, 1, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 1, 59, 60, 61, 62, 63, 64, 1, 65, 1, 12, 12, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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 int yy_meta[66] = { 0, 1, 2, 3, 2, 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, 2, 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 } ; static yyconst short int yy_base[684] = { 0, 0, 59, 84, 63, 838, 839, 66, 839, 834, 830, 795, 821, 820, 839, 806, 800, 45, 44, 802, 43, 63, 801, 61, 64, 69, 812, 798, 96, 79, 99, 811, 72, 67, 75, 86, 66, 95, 96, 62, 98, 110, 97, 114, 88, 114, 119, 109, 115, 778, 821, 131, 839, 820, 176, 180, 183, 186, 189, 198, 201, 794, 184, 189, 197, 141, 198, 206, 218, 245, 76, 839, 815, 839, 811, 810, 805, 784, 801, 800, 166, 785, 798, 791, 796, 776, 780, 782, 784, 788, 770, 766, 771, 774, 774, 147, 776, 178, 771, 777, 768, 768, 780, 778, 767, 777, 765, 209, 226, 147, 746, 735, 745, 740, 725, 728, 725, 727, 739, 724, 195, 721, 715, 718, 717, 727, 721, 720, 182, 713, 708, 211, 710, 725, 225, 710, 712, 705, 233, 199, 714, 718, 721, 720, 706, 712, 711, 703, 699, 185, 695, 699, 697, 692, 239, 839, 693, 749, 839, 216, 839, 839, 748, 293, 268, 278, 277, 287, 245, 289, 283, 291, 299, 301, 839, 747, 0, 839, 740, 739, 732, 718, 717, 711, 712, 711, 705, 709, 718, 710, 710, 718, 702, 716, 714, 713, 699, 698, 710, 713, 685, 305, 700, 692, 706, 700, 695, 696, 697, 688, 699, 687, 690, 154, 666, 671, 656, 665, 658, 650, 648, 655, 651, 645, 648, 644, 649, 641, 641, 644, 638, 637, 638, 636, 641, 646, 647, 631, 839, 630, 640, 630, 839, 635, 640, 629, 641, 631, 623, 621, 627, 623, 624, 284, 617, 630, 614, 624, 627, 617, 627, 626, 624, 618, 618, 622, 623, 606, 613, 602, 605, 839, 614, 598, 608, 607, 596, 329, 319, 314, 629, 316, 317, 325, 839, 624, 637, 636, 637, 628, 839, 634, 634, 616, 614, 627, 839, 603, 625, 617, 606, 626, 607, 839, 609, 278, 621, 611, 839, 621, 606, 605, 839, 839, 602, 603, 601, 839, 607, 312, 839, 573, 569, 568, 579, 578, 564, 566, 575, 839, 574, 560, 572, 567, 574, 569, 839, 839, 839, 572, 567, 566, 601, 563, 559, 839, 562, 561, 560, 563, 549, 552, 839, 542, 543, 550, 543, 556, 541, 839, 547, 542, 536, 533, 548, 839, 545, 544, 533, 532, 527, 526, 522, 524, 528, 533, 529, 839, 522, 526, 518, 839, 839, 575, 327, 562, 328, 338, 839, 554, 556, 551, 555, 541, 536, 839, 555, 536, 541, 536, 839, 551, 544, 545, 839, 540, 547, 528, 545, 533, 531, 529, 839, 527, 526, 534, 839, 839, 506, 494, 839, 504, 495, 493, 489, 839, 501, 497, 494, 498, 480, 839, 496, 210, 487, 486, 839, 490, 492, 476, 476, 488, 487, 490, 483, 472, 472, 486, 839, 481, 476, 839, 465, 477, 839, 469, 467, 839, 460, 467, 460, 472, 839, 453, 457, 462, 839, 485, 342, 839, 839, 486, 484, 489, 488, 487, 478, 493, 839, 481, 487, 474, 483, 471, 839, 481, 839, 459, 839, 473, 468, 461, 454, 839, 450, 839, 839, 839, 839, 439, 438, 839, 446, 839, 445, 440, 433, 442, 437, 839, 425, 425, 440, 425, 429, 426, 839, 839, 427, 422, 432, 839, 416, 839, 839, 422, 839, 425, 839, 839, 428, 427, 839, 341, 454, 441, 453, 442, 441, 431, 437, 441, 839, 839, 444, 432, 431, 352, 839, 429, 839, 407, 839, 413, 412, 839, 410, 408, 399, 839, 398, 395, 406, 391, 839, 839, 839, 400, 393, 403, 394, 839, 398, 400, 399, 413, 839, 422, 421, 839, 839, 839, 839, 426, 404, 839, 410, 409, 421, 410, 416, 392, 839, 387, 386, 370, 380, 370, 372, 380, 367, 839, 376, 365, 839, 839, 373, 839, 839, 839, 403, 839, 405, 405, 388, 390, 393, 401, 394, 383, 839, 839, 839, 352, 839, 839, 839, 839, 356, 350, 349, 839, 383, 382, 376, 374, 386, 387, 380, 383, 839, 354, 839, 353, 380, 372, 374, 363, 363, 358, 347, 354, 328, 327, 839, 839, 354, 349, 333, 333, 327, 329, 839, 839, 315, 304, 294, 839, 839, 274, 255, 213, 839, 196, 76, 839, 839, 839, 839, 383, 386, 388, 390, 393 } ; static yyconst short int yy_def[684] = { 0, 678, 1, 1, 3, 678, 678, 678, 678, 678, 679, 680, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 681, 678, 678, 678, 682, 682, 682, 682, 682, 682, 682, 678, 60, 60, 60, 60, 60, 60, 60, 681, 678, 678, 679, 678, 678, 683, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 681, 678, 678, 678, 678, 678, 60, 60, 60, 60, 60, 678, 60, 60, 60, 60, 60, 678, 681, 69, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 60, 60, 678, 60, 60, 60, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 60, 678, 60, 60, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 60, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 60, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 0, 678, 678, 678, 678, 678 } ; static yyconst short int yy_nxt[905] = { 0, 6, 7, 8, 9, 7, 10, 6, 6, 11, 12, 12, 6, 13, 14, 15, 16, 17, 18, 19, 20, 21, 6, 22, 6, 6, 23, 24, 25, 26, 27, 28, 29, 30, 6, 6, 31, 6, 6, 32, 6, 6, 6, 33, 34, 35, 36, 37, 38, 6, 39, 6, 6, 6, 40, 41, 42, 43, 44, 45, 46, 47, 48, 6, 49, 6, 50, 79, 70, 84, 69, 70, 85, 81, 80, 82, 89, 107, 70, 91, 90, 70, 86, 92, 94, 108, 51, 52, 53, 54, 51, 55, 87, 93, 56, 56, 55, 57, 95, 58, 59, 60, 101, 61, 62, 128, 55, 63, 677, 55, 64, 98, 102, 103, 65, 99, 66, 67, 104, 129, 68, 109, 55, 122, 55, 100, 110, 111, 123, 113, 105, 112, 114, 117, 115, 142, 118, 116, 124, 126, 119, 130, 143, 120, 137, 131, 159, 127, 121, 132, 92, 125, 134, 135, 138, 133, 139, 144, 140, 319, 93, 145, 147, 164, 148, 146, 152, 136, 153, 149, 97, 154, 141, 155, 199, 200, 150, 151, 70, 161, 162, 163, 678, 161, 162, 678, 161, 162, 678, 161, 162, 678, 161, 162, 183, 320, 165, 184, 214, 165, 678, 161, 162, 678, 161, 162, 164, 202, 215, 203, 169, 164, 170, 85, 107, 166, 90, 88, 678, 164, 164, 171, 108, 167, 676, 104, 678, 678, 164, 78, 80, 172, 103, 173, 213, 678, 235, 105, 226, 108, 164, 236, 267, 256, 268, 675, 277, 678, 174, 175, 176, 227, 176, 257, 195, 176, 176, 176, 176, 239, 176, 176, 176, 280, 504, 176, 187, 176, 176, 505, 176, 176, 240, 244, 241, 176, 250, 176, 176, 251, 245, 176, 246, 176, 273, 176, 674, 274, 252, 253, 164, 165, 254, 275, 255, 70, 405, 678, 163, 164, 164, 193, 279, 673, 281, 164, 678, 678, 406, 164, 278, 164, 678, 164, 282, 164, 678, 319, 678, 207, 678, 164, 678, 164, 306, 307, 672, 283, 678, 358, 678, 359, 382, 383, 384, 671, 164, 293, 164, 164, 386, 164, 287, 678, 670, 678, 678, 164, 678, 164, 164, 387, 669, 320, 678, 668, 678, 678, 388, 412, 164, 468, 533, 164, 164, 667, 666, 678, 665, 586, 678, 678, 664, 663, 662, 661, 660, 659, 550, 587, 658, 588, 589, 590, 72, 72, 72, 74, 74, 157, 157, 157, 164, 164, 178, 178, 657, 656, 655, 654, 653, 652, 651, 650, 649, 648, 647, 646, 645, 644, 643, 642, 641, 640, 639, 638, 637, 636, 635, 634, 633, 632, 631, 630, 629, 628, 627, 626, 625, 624, 623, 622, 621, 620, 619, 618, 617, 616, 615, 614, 613, 612, 611, 610, 609, 608, 607, 606, 605, 604, 603, 602, 601, 600, 599, 598, 597, 596, 595, 594, 593, 592, 591, 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, 544, 543, 542, 541, 540, 539, 538, 537, 536, 535, 534, 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, 503, 502, 501, 500, 499, 498, 497, 496, 495, 494, 493, 492, 491, 490, 489, 488, 487, 486, 485, 484, 483, 482, 481, 480, 479, 478, 477, 476, 475, 474, 473, 472, 471, 470, 469, 467, 382, 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, 437, 436, 435, 434, 433, 432, 431, 430, 429, 428, 427, 426, 425, 424, 423, 422, 421, 420, 419, 418, 417, 416, 415, 414, 413, 412, 411, 410, 409, 408, 407, 404, 403, 402, 401, 400, 399, 398, 397, 396, 395, 394, 393, 392, 391, 390, 389, 388, 385, 381, 380, 379, 378, 377, 376, 375, 374, 373, 372, 371, 370, 369, 368, 367, 366, 365, 364, 363, 362, 361, 360, 357, 356, 355, 354, 353, 352, 351, 350, 349, 348, 347, 346, 345, 344, 343, 342, 341, 340, 339, 338, 337, 336, 335, 334, 333, 332, 331, 330, 329, 328, 327, 326, 325, 324, 323, 322, 321, 318, 317, 316, 315, 314, 313, 312, 311, 310, 309, 308, 305, 304, 303, 302, 301, 300, 299, 298, 297, 296, 295, 294, 293, 292, 291, 290, 289, 288, 287, 286, 285, 284, 284, 174, 161, 158, 276, 272, 271, 270, 269, 266, 265, 264, 263, 262, 261, 260, 259, 258, 249, 248, 247, 243, 242, 238, 237, 234, 233, 232, 231, 230, 229, 228, 225, 224, 223, 222, 221, 220, 219, 218, 217, 216, 212, 211, 210, 209, 208, 207, 206, 205, 204, 201, 198, 197, 196, 195, 194, 193, 192, 191, 190, 189, 188, 187, 186, 185, 182, 181, 180, 76, 179, 177, 73, 168, 160, 158, 156, 106, 97, 96, 88, 83, 78, 77, 76, 76, 75, 73, 71, 678, 5, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678 } ; static yyconst short int yy_chk[905] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 17, 7, 20, 4, 7, 20, 18, 17, 18, 23, 32, 70, 24, 23, 70, 21, 24, 25, 32, 2, 3, 3, 3, 4, 3, 21, 24, 3, 3, 3, 3, 25, 3, 3, 3, 29, 3, 3, 39, 3, 3, 674, 3, 3, 28, 29, 29, 3, 28, 3, 3, 30, 39, 3, 33, 3, 36, 3, 28, 33, 33, 36, 34, 30, 33, 34, 35, 34, 44, 35, 34, 37, 38, 35, 40, 44, 35, 42, 40, 51, 38, 35, 40, 51, 37, 41, 41, 42, 40, 43, 45, 43, 213, 51, 45, 46, 65, 46, 45, 47, 41, 47, 46, 65, 48, 43, 48, 95, 95, 46, 46, 54, 54, 54, 54, 55, 55, 55, 56, 56, 56, 57, 57, 57, 58, 58, 58, 80, 213, 56, 80, 109, 57, 59, 59, 59, 60, 60, 60, 62, 97, 109, 97, 62, 63, 64, 62, 107, 58, 64, 63, 63, 64, 66, 66, 107, 60, 673, 67, 64, 66, 67, 59, 60, 66, 66, 68, 108, 67, 128, 67, 120, 108, 68, 128, 149, 139, 149, 671, 159, 68, 69, 69, 69, 120, 69, 139, 159, 69, 69, 69, 69, 131, 69, 69, 69, 168, 433, 69, 168, 69, 69, 433, 69, 69, 131, 134, 131, 69, 138, 69, 69, 138, 134, 69, 134, 69, 154, 69, 670, 154, 138, 138, 164, 165, 138, 154, 138, 163, 305, 164, 163, 166, 165, 170, 167, 669, 169, 170, 166, 165, 305, 167, 166, 169, 170, 171, 172, 163, 167, 319, 169, 171, 171, 172, 163, 173, 201, 201, 666, 173, 172, 253, 173, 253, 277, 277, 278, 665, 279, 281, 281, 282, 282, 278, 279, 279, 664, 281, 282, 283, 278, 384, 386, 283, 661, 319, 283, 660, 384, 386, 384, 386, 387, 387, 468, 533, 468, 659, 658, 387, 657, 547, 533, 468, 656, 653, 652, 651, 650, 649, 533, 547, 648, 547, 547, 547, 679, 679, 679, 680, 680, 681, 681, 681, 682, 682, 683, 683, 647, 646, 645, 644, 643, 641, 639, 638, 637, 636, 635, 634, 633, 632, 630, 629, 628, 623, 619, 618, 617, 616, 615, 614, 613, 612, 610, 606, 603, 602, 600, 599, 598, 597, 596, 595, 594, 593, 591, 590, 589, 588, 587, 586, 584, 583, 578, 577, 575, 574, 573, 572, 570, 569, 568, 567, 563, 562, 561, 560, 558, 557, 556, 554, 553, 551, 549, 546, 545, 544, 541, 540, 539, 538, 537, 536, 535, 534, 531, 530, 527, 525, 522, 520, 519, 518, 515, 514, 513, 512, 511, 510, 508, 507, 506, 505, 504, 502, 500, 499, 494, 492, 491, 490, 489, 487, 485, 483, 482, 481, 480, 479, 477, 476, 475, 474, 473, 472, 471, 467, 465, 464, 463, 461, 460, 459, 458, 456, 455, 453, 452, 450, 449, 447, 446, 445, 444, 443, 442, 441, 440, 439, 438, 437, 435, 434, 432, 430, 429, 428, 427, 426, 424, 423, 422, 421, 419, 418, 415, 414, 413, 411, 410, 409, 408, 407, 406, 405, 403, 402, 401, 399, 398, 397, 396, 394, 393, 392, 391, 390, 389, 385, 383, 380, 379, 378, 376, 375, 374, 373, 372, 371, 370, 369, 368, 367, 366, 364, 363, 362, 361, 360, 358, 357, 356, 355, 354, 353, 351, 350, 349, 348, 347, 346, 344, 343, 342, 341, 340, 339, 335, 334, 333, 332, 331, 330, 328, 327, 326, 325, 324, 323, 322, 321, 318, 316, 315, 314, 311, 310, 309, 307, 306, 304, 302, 301, 300, 299, 298, 297, 295, 294, 293, 292, 291, 289, 288, 287, 286, 285, 280, 276, 275, 274, 273, 272, 270, 269, 268, 267, 266, 265, 264, 263, 262, 261, 260, 259, 258, 257, 256, 255, 254, 252, 251, 250, 249, 248, 247, 246, 245, 244, 243, 241, 240, 239, 237, 236, 235, 234, 233, 232, 231, 230, 229, 228, 227, 226, 225, 224, 223, 222, 221, 220, 219, 218, 217, 216, 215, 214, 212, 211, 210, 209, 208, 207, 206, 205, 204, 203, 202, 200, 199, 198, 197, 196, 195, 194, 193, 192, 191, 190, 189, 188, 187, 186, 185, 184, 183, 182, 181, 180, 179, 178, 175, 162, 157, 156, 153, 152, 151, 150, 148, 147, 146, 145, 144, 143, 142, 141, 140, 137, 136, 135, 133, 132, 130, 129, 127, 126, 125, 124, 123, 122, 121, 119, 118, 117, 116, 115, 114, 113, 112, 111, 110, 106, 105, 104, 103, 102, 101, 100, 99, 98, 96, 94, 93, 92, 91, 90, 89, 88, 87, 86, 85, 84, 83, 82, 81, 79, 78, 77, 76, 75, 74, 72, 61, 53, 50, 49, 31, 27, 26, 22, 19, 16, 15, 13, 12, 11, 10, 9, 5, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678 } ; static yy_state_type yy_last_accepting_state; static char *yy_last_accepting_cpos; /* The intent behind this definition is that it'll catch * any uses of REJECT which flex missed. */ #define REJECT reject_used_but_not_detected #define yymore() yymore_used_but_not_detected #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET char *yytext; #define INITIAL 0 /* SCCS Id: @(#)lev_lex.c 3.4 2002/03/27 */ /* Copyright (c) 1989 by Jean-Christophe Collet */ /* NetHack may be freely redistributed. See license for details. */ #define LEV_LEX_C #include "hack.h" #include "lev_comp.h" #include "sp_lev.h" /* Most of these don't exist in flex, yywrap is macro and * yyunput is properly declared in flex.skel. */ #if !defined(FLEX_SCANNER) && !defined(FLEXHACK_SCANNER) int FDECL(yyback, (int *,int)); int NDECL(yylook); int NDECL(yyinput); int NDECL(yywrap); int NDECL(yylex); /* Traditional lexes let yyunput() and yyoutput() default to int; * newer ones may declare them as void since they don't return * values. For even more fun, the lex supplied as part of the * newer unbundled compiler for SunOS 4.x adds the void declarations * (under __STDC__ or _cplusplus ifdefs -- otherwise they remain * int) while the bundled lex and the one with the older unbundled * compiler do not. To detect this, we need help from outside -- * sys/unix/Makefile.utl. * * Digital UNIX is difficult and still has int in spite of all * other signs. */ # if defined(NeXT) || defined(SVR4) || defined(_AIX32) # define VOIDYYPUT # endif # if !defined(VOIDYYPUT) && defined(POSIX_TYPES) # if !defined(BOS) && !defined(HISX) && !defined(_M_UNIX) && !defined(VMS) # define VOIDYYPUT # endif # endif # if !defined(VOIDYYPUT) && defined(WEIRD_LEX) # if defined(SUNOS4) && defined(__STDC__) && (WEIRD_LEX > 1) # define VOIDYYPUT # endif # endif # if defined(VOIDYYPUT) && defined(__osf__) # undef VOIDYYPUT # endif # ifdef VOIDYYPUT void FDECL(yyunput, (int)); void FDECL(yyoutput, (int)); # else int FDECL(yyunput, (int)); int FDECL(yyoutput, (int)); # endif #endif /* !FLEX_SCANNER && !FLEXHACK_SCANNER */ #ifdef FLEX_SCANNER #define YY_MALLOC_DECL \ genericptr_t FDECL(malloc, (size_t)); \ genericptr_t FDECL(realloc, (genericptr_t,size_t)); #endif void FDECL(init_yyin, (FILE *)); void FDECL(init_yyout, (FILE *)); /* * This doesn't always get put in lev_comp.h * (esp. when using older versions of bison). */ extern YYSTYPE yylval; int line_number = 1, colon_line_number = 1; 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(MAC_MPW) && !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 /* MAC_MPW && !FLEX_SCANNER && !FLEXHACK_SCANNER */ #define MAPC 1 /* Macros after this point can all be overridden by user definitions in * section 1. */ #ifndef YY_SKIP_YYWRAP #ifdef __cplusplus extern "C" int yywrap YY_PROTO(( void )); #else extern int yywrap YY_PROTO(( void )); #endif #endif #ifndef YY_NO_UNPUT static void yyunput YY_PROTO(( int c, char *buf_ptr )); #endif #ifndef yytext_ptr static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int )); #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen YY_PROTO(( yyconst char * )); #endif #ifndef YY_NO_INPUT #ifdef __cplusplus static int yyinput YY_PROTO(( void )); #else static int input YY_PROTO(( void )); #endif #endif #if YY_STACK_USED static int yy_start_stack_ptr = 0; static int yy_start_stack_depth = 0; static int *yy_start_stack = 0; #ifndef YY_NO_PUSH_STATE static void yy_push_state YY_PROTO(( int new_state )); #endif #ifndef YY_NO_POP_STATE static void yy_pop_state YY_PROTO(( void )); #endif #ifndef YY_NO_TOP_STATE static int yy_top_state YY_PROTO(( void )); #endif #else #define YY_NO_PUSH_STATE 1 #define YY_NO_POP_STATE 1 #define YY_NO_TOP_STATE 1 #endif #ifdef YY_MALLOC_DECL YY_MALLOC_DECL #else #if __STDC__ #ifndef __cplusplus #include #endif #else /* Just try to get by without declaring the routines. This will fail * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int) * or sizeof(void*) != sizeof(int). */ #endif #endif /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE #define YY_READ_BUF_SIZE 8192 #endif /* Copy whatever the last rule matched to the standard output. */ #ifndef ECHO /* This used to be an fputs(), but since the string might contain NUL's, * we now use fwrite(). */ #define ECHO (void) fwrite( yytext, yyleng, 1, yyout ) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, * is returned in "result". */ #ifndef YY_INPUT #define YY_INPUT(buf,result,max_size) \ if ( yy_current_buffer->yy_is_interactive ) \ { \ int c = '*', n; \ for ( n = 0; n < max_size && \ (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ buf[n] = (char) c; \ if ( c == '\n' ) \ buf[n++] = (char) c; \ if ( c == EOF && ferror( yyin ) ) \ YY_FATAL_ERROR( "input in flex scanner failed" ); \ result = n; \ } \ else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \ && ferror( yyin ) ) \ YY_FATAL_ERROR( "input in flex scanner failed" ); #endif /* No semi-colon after return; correct usage is to write "yyterminate();" - * we don't want an extra ';' after the "return" because that will cause * some compilers to complain about unreachable statements. */ #ifndef yyterminate #define yyterminate() return YY_NULL #endif /* Number of entries by which start-condition stack grows. */ #ifndef YY_START_STACK_INCR #define YY_START_STACK_INCR 25 #endif /* Report a fatal error. */ #ifndef YY_FATAL_ERROR #define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) #endif /* Default declaration of generated scanner - a define so the user can * easily add parameters. */ #ifndef YY_DECL #define YY_DECL int yylex YY_PROTO(( void )) #endif /* Code executed at the beginning of each rule, after yytext and yyleng * have been set up. */ #ifndef YY_USER_ACTION #define YY_USER_ACTION #endif /* Code executed at the end of each rule. */ #ifndef YY_BREAK #define YY_BREAK break; #endif #define YY_RULE_SETUP \ if ( yyleng > 0 ) \ yy_current_buffer->yy_at_bol = \ (yytext[yyleng - 1] == '\n'); \ YY_USER_ACTION YY_DECL { register yy_state_type yy_current_state; register char *yy_cp = NULL, *yy_bp = NULL; register int yy_act; if ( yy_init ) { yy_init = 0; #ifdef YY_USER_INIT YY_USER_INIT; #endif if ( ! yy_start ) yy_start = 1; /* first start state */ if ( ! yyin ) yyin = stdin; if ( ! yyout ) yyout = stdout; if ( ! yy_current_buffer ) yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); yy_load_buffer_state(); } while ( 1 ) /* loops until end-of-file is reached */ { yy_cp = yy_c_buf_p; /* Support of yytext. */ *yy_cp = yy_hold_char; /* yy_bp points to the position in yy_ch_buf of the start of * the current run. */ yy_bp = yy_cp; yy_current_state = yy_start; yy_current_state += YY_AT_BOL(); yy_match: do { register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; if ( yy_accept[yy_current_state] ) { yy_last_accepting_state = yy_current_state; yy_last_accepting_cpos = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 679 ) 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] != 839 ); yy_find_action: yy_act = yy_accept[yy_current_state]; if ( yy_act == 0 ) { /* have to back up */ yy_cp = yy_last_accepting_cpos; yy_current_state = yy_last_accepting_state; yy_act = yy_accept[yy_current_state]; } YY_DO_BEFORE_ACTION; do_action: /* This label is used only to access EOF actions. */ switch ( yy_act ) { /* beginning of action switch */ case 0: /* must back up */ /* undo the effects of YY_DO_BEFORE_ACTION */ *yy_cp = yy_hold_char; yy_cp = yy_last_accepting_cpos; yy_current_state = yy_last_accepting_state; goto yy_find_action; case 1: YY_RULE_SETUP { BEGIN(INITIAL); yylval.map = (char *) alloc(map_cnt + 1); (void) strncpy(yylval.map, map, map_cnt); yylval.map[map_cnt] = 0; map_cnt = 0; return MAP_ID; } YY_BREAK case 2: YY_RULE_SETUP { int len = yyleng; /* convert \r\n to \n */ if (len >= 2 && yytext[len - 2] == '\r') len -= 1; line_number++; (void) strncpy(map + map_cnt, yytext, len); map_cnt += len; map[map_cnt - 1] = '\n'; map[map_cnt] = '\0'; } YY_BREAK case 3: YY_RULE_SETUP { line_number++; } YY_BREAK case 4: YY_RULE_SETUP { colon_line_number = line_number; return ':'; } YY_BREAK case 5: YY_RULE_SETUP return MESSAGE_ID; YY_BREAK case 6: YY_RULE_SETUP return MAZE_ID; YY_BREAK case 7: YY_RULE_SETUP return NOMAP_ID; YY_BREAK case 8: YY_RULE_SETUP return LEVEL_ID; YY_BREAK case 9: YY_RULE_SETUP return LEV_INIT_ID; YY_BREAK case 10: YY_RULE_SETUP return FLAGS_ID; YY_BREAK case 11: YY_RULE_SETUP return GEOMETRY_ID; YY_BREAK case 12: YY_RULE_SETUP { BEGIN(MAPC); line_number++; } YY_BREAK case 13: YY_RULE_SETUP return OBJECT_ID; YY_BREAK case 14: YY_RULE_SETUP return OBJFLAGS_ID; YY_BREAK case 15: YY_RULE_SETUP return COBJECT_ID; YY_BREAK case 16: YY_RULE_SETUP return MONSTER_ID; YY_BREAK case 17: YY_RULE_SETUP return TRAP_ID; YY_BREAK case 18: YY_RULE_SETUP return DOOR_ID; YY_BREAK case 19: YY_RULE_SETUP return DRAWBRIDGE_ID; YY_BREAK case 20: YY_RULE_SETUP return MAZEWALK_ID; YY_BREAK case 21: YY_RULE_SETUP return WALLIFY_ID; YY_BREAK case 22: YY_RULE_SETUP return REGION_ID; YY_BREAK case 23: YY_RULE_SETUP return RANDOM_OBJECTS_ID; YY_BREAK case 24: YY_RULE_SETUP return RANDOM_MONSTERS_ID; YY_BREAK case 25: YY_RULE_SETUP return RANDOM_PLACES_ID; YY_BREAK case 26: YY_RULE_SETUP return ALTAR_ID; YY_BREAK case 27: YY_RULE_SETUP return LADDER_ID; YY_BREAK case 28: YY_RULE_SETUP return STAIR_ID; YY_BREAK case 29: YY_RULE_SETUP return PORTAL_ID; YY_BREAK case 30: YY_RULE_SETUP return TELEPRT_ID; YY_BREAK case 31: YY_RULE_SETUP return RANDOMREGION_ID; YY_BREAK case 32: YY_RULE_SETUP return BRANCH_ID; YY_BREAK case 33: YY_RULE_SETUP return FOUNTAIN_ID; YY_BREAK case 34: YY_RULE_SETUP return SINK_ID; YY_BREAK case 35: YY_RULE_SETUP return POOL_ID; YY_BREAK case 36: YY_RULE_SETUP return NON_DIGGABLE_ID; YY_BREAK case 37: YY_RULE_SETUP return NON_PASSWALL_ID; YY_BREAK case 38: YY_RULE_SETUP return ROOM_ID; YY_BREAK case 39: YY_RULE_SETUP return SUBROOM_ID; YY_BREAK case 40: YY_RULE_SETUP return RAND_CORRIDOR_ID; YY_BREAK case 41: YY_RULE_SETUP return CORRIDOR_ID; YY_BREAK case 42: YY_RULE_SETUP return GOLD_ID; YY_BREAK case 43: YY_RULE_SETUP return ENGRAVING_ID; YY_BREAK case 44: YY_RULE_SETUP return NAME_ID; YY_BREAK case 45: YY_RULE_SETUP return CHANCE_ID; YY_BREAK case 46: YY_RULE_SETUP return LEV; YY_BREAK case 47: YY_RULE_SETUP { yylval.i=D_ISOPEN; return DOOR_STATE; } YY_BREAK case 48: YY_RULE_SETUP { yylval.i=D_CLOSED; return DOOR_STATE; } YY_BREAK case 49: YY_RULE_SETUP { yylval.i=D_LOCKED; return DOOR_STATE; } YY_BREAK case 50: YY_RULE_SETUP { yylval.i=D_NODOOR; return DOOR_STATE; } YY_BREAK case 51: YY_RULE_SETUP { yylval.i=D_BROKEN; return DOOR_STATE; } YY_BREAK case 52: YY_RULE_SETUP { yylval.i=W_NORTH; return DIRECTION; } YY_BREAK case 53: YY_RULE_SETUP { yylval.i=W_EAST; return DIRECTION; } YY_BREAK case 54: YY_RULE_SETUP { yylval.i=W_SOUTH; return DIRECTION; } YY_BREAK case 55: YY_RULE_SETUP { yylval.i=W_WEST; return DIRECTION; } YY_BREAK case 56: YY_RULE_SETUP { yylval.i = -1; return RANDOM_TYPE; } YY_BREAK case 57: YY_RULE_SETUP { yylval.i = -2; return NONE; } YY_BREAK case 58: YY_RULE_SETUP return O_REGISTER; YY_BREAK case 59: YY_RULE_SETUP return M_REGISTER; YY_BREAK case 60: YY_RULE_SETUP return P_REGISTER; YY_BREAK case 61: YY_RULE_SETUP return A_REGISTER; YY_BREAK case 62: YY_RULE_SETUP return R_REGISTER; YY_BREAK case 63: YY_RULE_SETUP { yylval.i=1; return LEFT_OR_RIGHT; } YY_BREAK case 64: YY_RULE_SETUP { yylval.i=2; return LEFT_OR_RIGHT; } YY_BREAK case 65: YY_RULE_SETUP { yylval.i=3; return CENTER; } YY_BREAK case 66: YY_RULE_SETUP { yylval.i=4; return LEFT_OR_RIGHT; } YY_BREAK case 67: YY_RULE_SETUP { yylval.i=5; return LEFT_OR_RIGHT; } YY_BREAK case 68: YY_RULE_SETUP { yylval.i=1; return TOP_OR_BOT; } YY_BREAK case 69: YY_RULE_SETUP { yylval.i=5; return TOP_OR_BOT; } YY_BREAK case 70: YY_RULE_SETUP { yylval.i=1; return LIGHT_STATE; } YY_BREAK case 71: YY_RULE_SETUP { yylval.i=0; return LIGHT_STATE; } YY_BREAK case 72: YY_RULE_SETUP { yylval.i=0; return FILLING; } YY_BREAK case 73: YY_RULE_SETUP { yylval.i=1; return FILLING; } YY_BREAK case 74: YY_RULE_SETUP { yylval.i= AM_NONE; return ALIGNMENT; } YY_BREAK case 75: YY_RULE_SETUP { yylval.i= AM_LAWFUL; return ALIGNMENT; } YY_BREAK case 76: YY_RULE_SETUP { yylval.i= AM_NEUTRAL; return ALIGNMENT; } YY_BREAK case 77: YY_RULE_SETUP { yylval.i= AM_CHAOTIC; return ALIGNMENT; } YY_BREAK case 78: YY_RULE_SETUP { yylval.i= AM_SPLEV_CO; return ALIGNMENT; } YY_BREAK case 79: YY_RULE_SETUP { yylval.i= AM_SPLEV_NONCO; return ALIGNMENT; } YY_BREAK case 80: YY_RULE_SETUP { yylval.i=1; return MON_ATTITUDE; } YY_BREAK case 81: YY_RULE_SETUP { yylval.i=0; return MON_ATTITUDE; } YY_BREAK case 82: YY_RULE_SETUP { yylval.i=1; return MON_ALERTNESS; } YY_BREAK case 83: YY_RULE_SETUP { yylval.i=0; return MON_ALERTNESS; } YY_BREAK case 84: YY_RULE_SETUP { yylval.i= M_AP_FURNITURE; return MON_APPEARANCE; } YY_BREAK case 85: YY_RULE_SETUP { yylval.i= M_AP_MONSTER; return MON_APPEARANCE; } YY_BREAK case 86: YY_RULE_SETUP { yylval.i= M_AP_OBJECT; return MON_APPEARANCE; } YY_BREAK case 87: YY_RULE_SETUP { yylval.i=2; return ALTAR_TYPE; } YY_BREAK case 88: YY_RULE_SETUP { yylval.i=1; return ALTAR_TYPE; } YY_BREAK case 89: YY_RULE_SETUP { yylval.i=0; return ALTAR_TYPE; } YY_BREAK case 90: YY_RULE_SETUP { yylval.i=1; return UP_OR_DOWN; } YY_BREAK case 91: YY_RULE_SETUP { yylval.i=0; return UP_OR_DOWN; } YY_BREAK case 92: YY_RULE_SETUP { yylval.i=0; return BOOLEAN; } YY_BREAK case 93: YY_RULE_SETUP { yylval.i=1; return BOOLEAN; } YY_BREAK case 94: YY_RULE_SETUP { yylval.i=DUST; return ENGRAVING_TYPE; } YY_BREAK case 95: YY_RULE_SETUP { yylval.i=ENGRAVE; return ENGRAVING_TYPE; } YY_BREAK case 96: YY_RULE_SETUP { yylval.i=BURN; return ENGRAVING_TYPE; } YY_BREAK case 97: YY_RULE_SETUP { yylval.i=MARK; return ENGRAVING_TYPE; } YY_BREAK case 98: YY_RULE_SETUP { yylval.i=ENGR_BLOOD; return ENGRAVING_TYPE; } YY_BREAK case 99: YY_RULE_SETUP { yylval.i=1; return CURSE_TYPE; } YY_BREAK case 100: YY_RULE_SETUP { yylval.i=2; return CURSE_TYPE; } YY_BREAK case 101: YY_RULE_SETUP { yylval.i=3; return CURSE_TYPE; } YY_BREAK case 102: YY_RULE_SETUP { return CONTAINED; } YY_BREAK case 103: YY_RULE_SETUP { yylval.i=OBJF_LIT; return OBJFLAG_TYPE; } YY_BREAK case 104: YY_RULE_SETUP { yylval.i=OBJF_BURIED; return OBJFLAG_TYPE; } YY_BREAK case 105: YY_RULE_SETUP { yylval.i=NOTELEPORT; return FLAG_TYPE; } YY_BREAK case 106: YY_RULE_SETUP { yylval.i=HARDFLOOR; return FLAG_TYPE; } YY_BREAK case 107: YY_RULE_SETUP { yylval.i=NOMMAP; return FLAG_TYPE; } YY_BREAK case 108: YY_RULE_SETUP { yylval.i=ARBOREAL; return FLAG_TYPE; } /* KMH */ YY_BREAK case 109: YY_RULE_SETUP { yylval.i=SHORTSIGHTED; return FLAG_TYPE; } YY_BREAK case 110: YY_RULE_SETUP { yylval.i=SPOOKY; return FLAG_TYPE; } YY_BREAK case 111: YY_RULE_SETUP { yylval.i=LETHE; return FLAG_TYPE; } YY_BREAK case 112: YY_RULE_SETUP { yylval.i = atoi(yytext + 1); return PERCENT; } YY_BREAK case 113: YY_RULE_SETUP { yylval.i=atoi(yytext); return INTEGER; } YY_BREAK case 114: YY_RULE_SETUP { yytext[yyleng-1] = 0; /* Discard the trailing \" */ yylval.map = (char *) alloc(strlen(yytext+1)+1); Strcpy(yylval.map, yytext+1); /* Discard the first \" */ return STRING; } YY_BREAK case 115: YY_RULE_SETUP { line_number++; } YY_BREAK case 116: YY_RULE_SETUP ; YY_BREAK case 117: YY_RULE_SETUP { yylval.i = yytext[2]; return CHAR; } YY_BREAK case 118: YY_RULE_SETUP { yylval.i = yytext[1]; return CHAR; } YY_BREAK case 119: YY_RULE_SETUP { return yytext[0]; } YY_BREAK case 120: YY_RULE_SETUP ECHO; YY_BREAK case YY_STATE_EOF(INITIAL): case YY_STATE_EOF(MAPC): yyterminate(); case YY_END_OF_BUFFER: { /* Amount of text matched not including the EOB char. */ int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1; /* Undo the effects of YY_DO_BEFORE_ACTION. */ *yy_cp = yy_hold_char; YY_RESTORE_YY_MORE_OFFSET if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW ) { /* We're scanning a new file or input source. It's * possible that this happened because the user * just pointed yyin at a new source and called * yylex(). If so, then we have to assure * consistency between yy_current_buffer and our * globals. Here is the right place to do so, because * this is the first action (other than possibly a * back-up) that will match for the new input source. */ yy_n_chars = yy_current_buffer->yy_n_chars; yy_current_buffer->yy_input_file = yyin; yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL; } /* Note that here we test for yy_c_buf_p "<=" to the position * of the first EOB in the buffer, since yy_c_buf_p will * already have been incremented past the NUL character * (since all states make transitions on EOB to the * end-of-buffer state). Contrast this with the test * in input(). */ if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] ) { /* This was really a NUL. */ yy_state_type yy_next_state; yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state(); /* Okay, we're now positioned to make the NUL * transition. We couldn't have * yy_get_previous_state() go ahead and do it * for us because it doesn't know how to deal * with the possibility of jamming (and we don't * want to build jamming into it because then it * will run more slowly). */ yy_next_state = yy_try_NUL_trans( yy_current_state ); yy_bp = yytext_ptr + YY_MORE_ADJ; if ( yy_next_state ) { /* Consume the NUL. */ yy_cp = ++yy_c_buf_p; yy_current_state = yy_next_state; goto yy_match; } else { yy_cp = yy_c_buf_p; goto yy_find_action; } } else switch ( yy_get_next_buffer() ) { case EOB_ACT_END_OF_FILE: { yy_did_buffer_switch_on_eof = 0; if ( yywrap() ) { /* Note: because we've taken care in * yy_get_next_buffer() to have set up * yytext, we can now set up * yy_c_buf_p so that if some total * hoser (like flex itself) wants to * call the scanner after we return the * YY_NULL, it'll still work - another * YY_NULL will get returned. */ yy_c_buf_p = yytext_ptr + YY_MORE_ADJ; yy_act = YY_STATE_EOF(YY_START); goto do_action; } else { if ( ! yy_did_buffer_switch_on_eof ) YY_NEW_FILE; } break; } case EOB_ACT_CONTINUE_SCAN: yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state(); yy_cp = yy_c_buf_p; yy_bp = yytext_ptr + YY_MORE_ADJ; goto yy_match; case EOB_ACT_LAST_MATCH: yy_c_buf_p = &yy_current_buffer->yy_ch_buf[yy_n_chars]; yy_current_state = yy_get_previous_state(); yy_cp = yy_c_buf_p; yy_bp = yytext_ptr + YY_MORE_ADJ; goto yy_find_action; } break; } default: YY_FATAL_ERROR( "fatal flex scanner internal error--no action found" ); } /* end of action switch */ } /* end of scanning one token */ } /* end of yylex */ /* yy_get_next_buffer - try to read in a new buffer * * Returns a code representing an action: * EOB_ACT_LAST_MATCH - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position * EOB_ACT_END_OF_FILE - end of file */ static int yy_get_next_buffer() { register char *dest = yy_current_buffer->yy_ch_buf; register char *source = yytext_ptr; register int number_to_move, i; int ret_val; if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] ) YY_FATAL_ERROR( "fatal flex scanner internal error--end of buffer missed" ); if ( yy_current_buffer->yy_fill_buffer == 0 ) { /* Don't try to fill the buffer, so this is an EOF. */ if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 ) { /* We matched a single character, the EOB, so * treat this as a final EOF. */ return EOB_ACT_END_OF_FILE; } else { /* We matched some text prior to the EOB, first * process it. */ return EOB_ACT_LAST_MATCH; } } /* Try to read more data. */ /* First move last chars to start of buffer. */ number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1; for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING ) /* don't do the read, it's not guaranteed to return an EOF, * just force an EOF */ yy_current_buffer->yy_n_chars = yy_n_chars = 0; else { int num_to_read = yy_current_buffer->yy_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) { /* Not enough room in the buffer - grow it. */ #ifdef YY_USES_REJECT YY_FATAL_ERROR( "input buffer overflow, can't enlarge buffer because scanner uses REJECT" ); #else /* just a shorter name for the current buffer */ YY_BUFFER_STATE b = yy_current_buffer; int yy_c_buf_p_offset = (int) (yy_c_buf_p - b->yy_ch_buf); if ( b->yy_is_our_buffer ) { int new_size = b->yy_buf_size * 2; if ( new_size <= 0 ) b->yy_buf_size += b->yy_buf_size / 8; else b->yy_buf_size *= 2; b->yy_ch_buf = (char *) /* Include room in for 2 EOB chars. */ yy_flex_realloc( (void *) b->yy_ch_buf, b->yy_buf_size + 2 ); } else /* Can't grow it, we don't own it. */ b->yy_ch_buf = 0; if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "fatal error - scanner input buffer overflow" ); yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset]; num_to_read = yy_current_buffer->yy_buf_size - number_to_move - 1; #endif } if ( num_to_read > YY_READ_BUF_SIZE ) num_to_read = YY_READ_BUF_SIZE; /* Read in more data. */ YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]), yy_n_chars, num_to_read ); yy_current_buffer->yy_n_chars = yy_n_chars; } if ( yy_n_chars == 0 ) { if ( number_to_move == YY_MORE_ADJ ) { ret_val = EOB_ACT_END_OF_FILE; yyrestart( yyin ); } else { ret_val = EOB_ACT_LAST_MATCH; yy_current_buffer->yy_buffer_status = YY_BUFFER_EOF_PENDING; } } else ret_val = EOB_ACT_CONTINUE_SCAN; yy_n_chars += number_to_move; yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR; yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; yytext_ptr = &yy_current_buffer->yy_ch_buf[0]; return ret_val; } /* yy_get_previous_state - get the state just before the EOB char was reached */ static yy_state_type yy_get_previous_state() { register yy_state_type yy_current_state; register char *yy_cp; yy_current_state = yy_start; yy_current_state += YY_AT_BOL(); for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp ) { register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); if ( yy_accept[yy_current_state] ) { yy_last_accepting_state = yy_current_state; yy_last_accepting_cpos = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 679 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; } return yy_current_state; } /* yy_try_NUL_trans - try to make a transition on the NUL character * * synopsis * next_state = yy_try_NUL_trans( current_state ); */ #ifdef YY_USE_PROTOS static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state ) #else static yy_state_type yy_try_NUL_trans( yy_current_state ) yy_state_type yy_current_state; #endif { register int yy_is_jam; register char *yy_cp = yy_c_buf_p; register YY_CHAR yy_c = 1; if ( yy_accept[yy_current_state] ) { yy_last_accepting_state = yy_current_state; yy_last_accepting_cpos = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 679 ) 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 == 678); return yy_is_jam ? 0 : yy_current_state; } #ifndef YY_NO_UNPUT #ifdef YY_USE_PROTOS static void yyunput( int c, register char *yy_bp ) #else static void yyunput( c, yy_bp ) int c; register char *yy_bp; #endif { register char *yy_cp = yy_c_buf_p; /* undo effects of setting up yytext */ *yy_cp = yy_hold_char; if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) { /* need to shift things up to make room */ /* +2 for EOB chars. */ register int number_to_move = yy_n_chars + 2; register char *dest = &yy_current_buffer->yy_ch_buf[ yy_current_buffer->yy_buf_size + 2]; register char *source = &yy_current_buffer->yy_ch_buf[number_to_move]; while ( source > yy_current_buffer->yy_ch_buf ) *--dest = *--source; yy_cp += (int) (dest - source); yy_bp += (int) (dest - source); yy_current_buffer->yy_n_chars = yy_n_chars = yy_current_buffer->yy_buf_size; if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) YY_FATAL_ERROR( "flex scanner push-back overflow" ); } *--yy_cp = (char) c; yytext_ptr = yy_bp; yy_hold_char = *yy_cp; yy_c_buf_p = yy_cp; } #endif /* ifndef YY_NO_UNPUT */ #ifdef __cplusplus static int yyinput() #else static int input() #endif { int c; *yy_c_buf_p = yy_hold_char; if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) { /* yy_c_buf_p now points to the character we want to return. * If this occurs *before* the EOB characters, then it's a * valid NUL; if not, then we've hit the end of the buffer. */ if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] ) /* This was really a NUL. */ *yy_c_buf_p = '\0'; else { /* need more input */ int offset = yy_c_buf_p - yytext_ptr; ++yy_c_buf_p; switch ( yy_get_next_buffer() ) { case EOB_ACT_LAST_MATCH: /* This happens because yy_g_n_b() * sees that we've accumulated a * token and flags that we need to * try matching the token before * proceeding. But for input(), * there's no matching to consider. * So convert the EOB_ACT_LAST_MATCH * to EOB_ACT_END_OF_FILE. */ /* Reset buffer status. */ yyrestart( yyin ); /* fall through */ case EOB_ACT_END_OF_FILE: { if ( yywrap() ) return EOF; if ( ! yy_did_buffer_switch_on_eof ) YY_NEW_FILE; #ifdef __cplusplus return yyinput(); #else return input(); #endif } case EOB_ACT_CONTINUE_SCAN: yy_c_buf_p = yytext_ptr + offset; break; } } } c = *(unsigned char *) yy_c_buf_p; /* cast for 8-bit char's */ *yy_c_buf_p = '\0'; /* preserve yytext */ yy_hold_char = *++yy_c_buf_p; yy_current_buffer->yy_at_bol = (c == '\n'); return c; } #ifdef YY_USE_PROTOS void yyrestart( FILE *input_file ) #else void yyrestart( input_file ) FILE *input_file; #endif { if ( ! yy_current_buffer ) yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); yy_init_buffer( yy_current_buffer, input_file ); yy_load_buffer_state(); } #ifdef YY_USE_PROTOS void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) #else void yy_switch_to_buffer( new_buffer ) YY_BUFFER_STATE new_buffer; #endif { if ( yy_current_buffer == new_buffer ) return; if ( yy_current_buffer ) { /* Flush out information for old buffer. */ *yy_c_buf_p = yy_hold_char; yy_current_buffer->yy_buf_pos = yy_c_buf_p; yy_current_buffer->yy_n_chars = yy_n_chars; } yy_current_buffer = new_buffer; yy_load_buffer_state(); /* We don't actually know whether we did this switch during * EOF (yywrap()) processing, but the only time this flag * is looked at is after yywrap() is called, so it's safe * to go ahead and always set it. */ yy_did_buffer_switch_on_eof = 1; } #ifdef YY_USE_PROTOS void yy_load_buffer_state( void ) #else void yy_load_buffer_state() #endif { yy_n_chars = yy_current_buffer->yy_n_chars; yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos; yyin = yy_current_buffer->yy_input_file; yy_hold_char = *yy_c_buf_p; } #ifdef YY_USE_PROTOS YY_BUFFER_STATE yy_create_buffer( FILE *file, int size ) #else YY_BUFFER_STATE yy_create_buffer( file, size ) FILE *file; int size; #endif { YY_BUFFER_STATE b; b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_buf_size = size; /* yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 ); if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_is_our_buffer = 1; yy_init_buffer( b, file ); return b; } #ifdef YY_USE_PROTOS void yy_delete_buffer( YY_BUFFER_STATE b ) #else void yy_delete_buffer( b ) YY_BUFFER_STATE b; #endif { if ( ! b ) return; if ( b == yy_current_buffer ) yy_current_buffer = (YY_BUFFER_STATE) 0; if ( b->yy_is_our_buffer ) yy_flex_free( (void *) b->yy_ch_buf ); yy_flex_free( (void *) b ); } #ifdef YY_USE_PROTOS void yy_init_buffer( YY_BUFFER_STATE b, FILE *file ) #else void yy_init_buffer( b, file ) YY_BUFFER_STATE b; FILE *file; #endif { yy_flush_buffer( b ); b->yy_input_file = file; b->yy_fill_buffer = 1; #if YY_ALWAYS_INTERACTIVE b->yy_is_interactive = 1; #else #if YY_NEVER_INTERACTIVE b->yy_is_interactive = 0; #else b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; #endif #endif } #ifdef YY_USE_PROTOS void yy_flush_buffer( YY_BUFFER_STATE b ) #else void yy_flush_buffer( b ) YY_BUFFER_STATE b; #endif { if ( ! b ) return; b->yy_n_chars = 0; /* We always need two end-of-buffer characters. The first causes * a transition to the end-of-buffer state. The second causes * a jam in that state. */ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; b->yy_buf_pos = &b->yy_ch_buf[0]; b->yy_at_bol = 1; b->yy_buffer_status = YY_BUFFER_NEW; if ( b == yy_current_buffer ) yy_load_buffer_state(); } #ifndef YY_NO_SCAN_BUFFER #ifdef YY_USE_PROTOS YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size ) #else YY_BUFFER_STATE yy_scan_buffer( base, size ) char *base; yy_size_t size; #endif { YY_BUFFER_STATE b; if ( size < 2 || base[size-2] != YY_END_OF_BUFFER_CHAR || base[size-1] != YY_END_OF_BUFFER_CHAR ) /* They forgot to leave room for the EOB's. */ return 0; b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ b->yy_buf_pos = b->yy_ch_buf = base; b->yy_is_our_buffer = 0; b->yy_input_file = 0; b->yy_n_chars = b->yy_buf_size; b->yy_is_interactive = 0; b->yy_at_bol = 1; b->yy_fill_buffer = 0; b->yy_buffer_status = YY_BUFFER_NEW; yy_switch_to_buffer( b ); return b; } #endif #ifndef YY_NO_SCAN_STRING #ifdef YY_USE_PROTOS YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str ) #else YY_BUFFER_STATE yy_scan_string( yy_str ) yyconst char *yy_str; #endif { int len; for ( len = 0; yy_str[len]; ++len ) ; return yy_scan_bytes( yy_str, len ); } #endif #ifndef YY_NO_SCAN_BYTES #ifdef YY_USE_PROTOS YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len ) #else YY_BUFFER_STATE yy_scan_bytes( bytes, len ) yyconst char *bytes; int len; #endif { YY_BUFFER_STATE b; char *buf; yy_size_t n; int i; /* Get memory for full buffer, including space for trailing EOB's. */ n = len + 2; buf = (char *) yy_flex_alloc( n ); if ( ! buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); for ( i = 0; i < len; ++i ) buf[i] = bytes[i]; buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR; b = yy_scan_buffer( buf, n ); if ( ! b ) YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); /* It's okay to grow etc. this buffer, and we should throw it * away when we're done. */ b->yy_is_our_buffer = 1; return b; } #endif #ifndef YY_NO_PUSH_STATE #ifdef YY_USE_PROTOS static void yy_push_state( int new_state ) #else static void yy_push_state( new_state ) int new_state; #endif { if ( yy_start_stack_ptr >= yy_start_stack_depth ) { yy_size_t new_size; yy_start_stack_depth += YY_START_STACK_INCR; new_size = yy_start_stack_depth * sizeof( int ); if ( ! yy_start_stack ) yy_start_stack = (int *) yy_flex_alloc( new_size ); else yy_start_stack = (int *) yy_flex_realloc( (void *) yy_start_stack, new_size ); if ( ! yy_start_stack ) YY_FATAL_ERROR( "out of memory expanding start-condition stack" ); } yy_start_stack[yy_start_stack_ptr++] = YY_START; BEGIN(new_state); } #endif #ifndef YY_NO_POP_STATE static void yy_pop_state() { if ( --yy_start_stack_ptr < 0 ) YY_FATAL_ERROR( "start-condition stack underflow" ); BEGIN(yy_start_stack[yy_start_stack_ptr]); } #endif #ifndef YY_NO_TOP_STATE static int yy_top_state() { return yy_start_stack[yy_start_stack_ptr - 1]; } #endif #ifndef YY_EXIT_FAILURE #define YY_EXIT_FAILURE 2 #endif #ifdef YY_USE_PROTOS static void yy_fatal_error( yyconst char msg[] ) #else static void yy_fatal_error( msg ) char msg[]; #endif { (void) fprintf( stderr, "%s\n", msg ); exit( YY_EXIT_FAILURE ); } /* Redefine yyless() so it works in section 3 code. */ #undef yyless #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ yytext[yyleng] = yy_hold_char; \ yy_c_buf_p = yytext + n; \ yy_hold_char = *yy_c_buf_p; \ *yy_c_buf_p = '\0'; \ yyleng = n; \ } \ while ( 0 ) /* Internal utility routines. */ #ifndef yytext_ptr #ifdef YY_USE_PROTOS static void yy_flex_strncpy( char *s1, yyconst char *s2, int n ) #else static void yy_flex_strncpy( s1, s2, n ) char *s1; yyconst char *s2; int n; #endif { register int i; for ( i = 0; i < n; ++i ) s1[i] = s2[i]; } #endif #ifdef YY_NEED_STRLEN #ifdef YY_USE_PROTOS static int yy_flex_strlen( yyconst char *s ) #else static int yy_flex_strlen( s ) yyconst char *s; #endif { register int n; for ( n = 0; s[n]; ++n ) ; return n; } #endif #ifdef YY_USE_PROTOS static void *yy_flex_alloc( yy_size_t size ) #else static void *yy_flex_alloc( size ) yy_size_t size; #endif { return (void *) malloc( size ); } #ifdef YY_USE_PROTOS static void *yy_flex_realloc( void *ptr, yy_size_t size ) #else static void *yy_flex_realloc( ptr, size ) void *ptr; yy_size_t size; #endif { /* The cast to (char *) in the following accommodates both * implementations that use char* generic pointers, and those * that use void* generic pointers. It works with the latter * because both ANSI C and C++ allow castless assignment from * any pointer type to void*, and deal with argument conversions * as though doing an assignment. */ return (void *) realloc( (char *) ptr, size ); } #ifdef YY_USE_PROTOS static void yy_flex_free( void *ptr ) #else static void yy_flex_free( ptr ) void *ptr; #endif { free( ptr ); } #if YY_MAIN int main() { yylex(); return 0; } #endif #ifdef AMIGA long *alloc(n) unsigned n; { return ((long *)malloc (n)); } #endif /* routine to switch to another input file; needed for flex */ void init_yyin( input_f ) FILE *input_f; { #if defined(FLEX_SCANNER) || defined(FLEXHACK_SCANNER) if (yyin) yyrestart(input_f); else #endif yyin = input_f; } /* analogous routine (for completeness) */ void init_yyout( output_f ) FILE *output_f; { yyout = output_f; } /*lev_comp.l*/ slashem-0.0.7E7F3/sys/share/pcunix.c0000664000076400007640000001210710545462317015247 0ustar aliali/* 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. */ /* This file collects some Unix dependencies; pager.c contains some more */ #include "hack.h" #include "wintty.h" #include #if defined(WIN32) || defined(MSDOS) #include #endif #if defined(WIN32) || defined(MSDOS) extern char orgdir[]; # ifdef WIN32 extern void NDECL(backsp); # endif extern void NDECL(clear_screen); #endif #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 uptodate(fd) int fd; { # ifdef WANT_GETHDATE if(fstat(fd, &buf)) { pline("Cannot get status of saved level? "); return(0); } if(buf.st_mtime < hbuf.st_mtime) { pline("Saved level is out of date. "); return(0); } # else # if defined(MICRO) && !defined(NO_FSTAT) if(fstat(fd, &buf)) { if(moves > 1) pline("Cannot get status of saved level? "); else pline("Cannot get status of saved game"); return(0); } if(comp_times(buf.st_mtime)) { if(moves > 1) pline("Saved level is out of date"); else pline("Saved game is out of date. "); /* This problem occurs enough times we need to give the player * some more information about what causes it, and how to fix. */ # ifdef MSDOS pline("Make sure that your system's date and time are correct."); pline("They must be more current than NetHack.EXE's date/time stamp."); # endif /* MSDOS */ return(0); } # endif /* MICRO */ # endif /* WANT_GETHDATE */ return(1); } #endif #ifdef PC_LOCKING static int eraseoldlocks() { register int i; /* cannot use maxledgerno() here, because we need to find a lock name * before starting everything (including the dungeon initialization * that sets astral_level, needed for maxledgerno()) up */ for(i = 1; i <= MAXDUNGEON*MAXLEVEL + 1; i++) { /* try to remove all */ set_levelfile_name(lock, i); (void) unlink(fqname(lock, LEVELPREFIX, 0)); } set_levelfile_name(lock, 0); if(unlink(fqname(lock, LEVELPREFIX, 0))) return 0; /* cannot remove it */ return(1); /* success! */ } void getlock() { 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 */ if (!lock_file(HLOCK, LOCKPREFIX, 10)) { wait_synch(); chdirx(orgdir, 0); error("Quitting."); } /* regularize(lock); */ /* already done in pcmain */ Sprintf(tbuf,fqname(lock, LEVELPREFIX, 0)); set_levelfile_name(lock, 0); fq_lock = fqname(lock, LEVELPREFIX, 1); if((fd = open(fq_lock,0)) == -1) { if(errno == ENOENT) goto gotlock; /* no such file */ chdirx(orgdir, 0); perror(fq_lock); unlock_file(HLOCK); error("Cannot open %s", fq_lock); } (void) close(fd); if(iflags.window_inited) { pline("There is already a game in progress under your name."); pline("You may be able to use \"recover %s\" to get it back.\n",tbuf); c = yn("Do you want to destroy the old game?"); } else { # if defined(MSDOS) && defined(NO_TERMS) grmode = iflags.grmode; if (grmode) gr_finish(); # endif c = 'n'; ct = 0; msmsg("\nThere is already a game in progress under your name.\n"); msmsg("If this is unexpected, you may be able to use \n"); msmsg("\"recover %s\" to get it back.",tbuf); msmsg("\nDo you want to destroy the old game? [yn] "); while ((ci=nhgetch()) != '\n') { if (ct > 0) { msmsg("\b \b"); ct = 0; c = 'n'; } if (ci == 'y' || ci == 'n' || ci == 'Y' || ci == 'N') { ct = 1; c = ci; msmsg("%c",c); } } } if(c == 'y' || c == 'Y') if(eraseoldlocks()) { # if defined(WIN32CON) clear_screen(); /* display gets fouled up otherwise */ # endif goto gotlock; } else { unlock_file(HLOCK); chdirx(orgdir, 0); error("Couldn't destroy old game."); } else { unlock_file(HLOCK); chdirx(orgdir, 0); error("%s", ""); } gotlock: fd = creat(fq_lock, FCMASK); unlock_file(HLOCK); if(fd == -1) { chdirx(orgdir, 0); error("cannot creat lock file (%s.)", fq_lock); } else { if(write(fd, (char *) &hackpid, sizeof(hackpid)) != sizeof(hackpid)){ chdirx(orgdir, 0); error("cannot write lock (%s)", fq_lock); } if(close(fd) == -1) { chdirx(orgdir, 0); error("cannot close lock (%s)", fq_lock); } } # if defined(MSDOS) && defined(NO_TERMS) if (grmode) gr_init(); # endif } # endif /* PC_LOCKING */ # ifndef WIN32 void regularize(s) /* * normalize file name - we don't like .'s, /'s, spaces, and * lots of other things */ register char *s; { register char *lp; for (lp = s; *lp; lp++) if (*lp <= ' ' || *lp == '"' || (*lp >= '*' && *lp <= ',') || *lp == '.' || *lp == '/' || (*lp >= ':' && *lp <= '?') || # ifdef OS2 *lp == '&' || *lp == '(' || *lp == ')' || # endif *lp == '|' || *lp >= 127 || (*lp >= '[' && *lp <= ']')) *lp = '_'; } # endif /* WIN32 */ #endif /* OVLB */ #ifdef __EMX__ void seteuid(int i){;} #endif slashem-0.0.7E7F3/sys/share/ioctl.c0000664000076400007640000001037410545462317015057 0ustar aliali/* 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. */ /* This cannot be part of hack.tty.c (as it was earlier) since on some systems (e.g. MUNIX) the include files and define the same constants, and the C preprocessor complains. */ #include "hack.h" #if defined(BSD_JOB_CONTROL) || defined(_BULL_SOURCE) # ifdef HPUX #include # else # if defined(AIX_31) && !defined(_ALL_SOURCE) # define _ALL_SOURCE /* causes struct winsize to be present */ # ifdef _AIX32 # include # endif # endif # if defined(_BULL_SOURCE) # include struct termios termio; # undef TIMEOUT /* defined in you.h and sys/tty.h */ # include /* define winsize */ # include /* define struct ltchars */ # include /* define TIOGWINSZ */ # else # ifdef LINUX # include # else # include # endif # endif # endif struct ltchars ltchars; struct ltchars ltchars0 = { -1, -1, -1, -1, -1, -1 }; /* turn all off */ #else # ifdef POSIX_TYPES #include struct termios termio; # if defined(BSD) || defined(_AIX32) # if defined(_AIX32) && !defined(_ALL_SOURCE) # define _ALL_SOURCE # endif #include # endif # else #include /* also includes part of */ # if defined(TCSETS) && !defined(AIX_31) struct termios termio; # else struct termio termio; # endif # endif # ifdef AMIX #include # endif /* AMIX */ #endif #ifdef SUSPEND /* BSD isn't alone anymore... */ #include #endif #if defined(TIOCGWINSZ) && (defined(BSD) || defined(ULTRIX) || defined(AIX_31) || defined(_BULL_SOURCE) || defined(SVR4)) #define USE_WIN_IOCTL #include "tcap.h" /* for LI and CO */ #endif #ifdef _M_UNIX extern void NDECL(sco_mapon); extern void NDECL(sco_mapoff); #endif #ifdef __linux__ extern void NDECL(linux_mapon); extern void NDECL(linux_mapoff); #endif #ifdef LINUX extern void NDECL(linux_mapon); extern void NDECL(linux_mapoff); #endif #ifdef AUX void catch_stp() { signal(SIGTSTP, SIG_DFL); dosuspend(); } #endif /* AUX */ void getwindowsz() { #undef USW_WIN_IOCTL #ifdef USE_WIN_IOCTL /* * ttysize is found on Suns and BSD * winsize is found on Suns, BSD, and Ultrix */ struct winsize ttsz; if (ioctl(fileno(stdin), (int)TIOCGWINSZ, (char *)&ttsz) != -1) { /* * Use the kernel's values for lines and columns if it has * any idea. */ if (ttsz.ws_row) LI = ttsz.ws_row; if (ttsz.ws_col) CO = ttsz.ws_col; } #endif } void getioctls() { #define POSIX_TYPES #ifdef BSD_JOB_CONTROL (void) ioctl(fileno(stdin), (int) TIOCGLTC, (char *) <chars); (void) ioctl(fileno(stdin), (int) TIOCSLTC, (char *) <chars0); #else # ifdef POSIX_TYPES (void) tcgetattr(fileno(stdin), &termio); # else # if defined(TCSETS) && !defined(AIX_31) (void) ioctl(fileno(stdin), (int) TCGETS, &termio); # else (void) ioctl(fileno(stdin), (int) TCGETA, &termio); # endif # endif #endif getwindowsz(); #ifdef AUX ( void ) signal ( SIGTSTP , catch_stp ) ; #endif } void setioctls() { #ifdef BSD_JOB_CONTROL (void) ioctl(fileno(stdin), (int) TIOCSLTC, (char *) <chars); #else # ifdef POSIX_TYPES (void) tcsetattr(fileno(stdin), TCSADRAIN, &termio); # else # if defined(TCSETS) && !defined(AIX_31) (void) ioctl(fileno(stdin), (int) TCSETSW, &termio); # else (void) ioctl(fileno(stdin), (int) TCSETAW, &termio); # endif # endif #endif } #ifdef SUSPEND /* No longer implies BSD */ int dosuspend() { # ifdef SIGTSTP if(signal(SIGTSTP, SIG_IGN) == SIG_DFL) { suspend_nhwindows((char *)0); # ifdef _M_UNIX sco_mapon(); # endif # ifdef LINUX linux_mapon(); # endif # ifdef __linux__ linux_mapon(); # endif (void) signal(SIGTSTP, SIG_DFL); # ifdef AUX ( void ) kill ( 0 , SIGSTOP ) ; # else (void) kill(0, SIGTSTP); # endif # ifdef LINUX linux_mapoff(); # endif # ifdef _M_UNIX sco_mapoff(); # endif # ifdef __linux__ linux_mapoff(); # endif resume_nhwindows(); } else { pline("I don't think your shell has job control."); } # else pline("Sorry, it seems we have no SIGTSTP here. Try ! or S."); # endif return(0); } #endif /* SUSPEND */ slashem-0.0.7E7F3/sys/share/pctty.c0000664000076400007640000000337010545462317015106 0ustar aliali/* 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. */ /* tty.c - (PC) version */ #define NEED_VARARGS /* Uses ... */ /* comment line for pre-compiled headers */ #include "hack.h" #include "wintty.h" char erase_char, kill_char; /* * Get initial state of terminal, set ospeed (for termcap routines) * and switch off tab expansion if necessary. * Called by startup() in termcap.c and after returning from ! or ^Z */ void gettty(){ erase_char = '\b'; kill_char = 21; /* cntl-U */ iflags.cbreak = TRUE; #if !defined(TOS) disable_ctrlP(); /* turn off ^P processing */ #endif #if defined(MSDOS) && defined(NO_TERMS) gr_init(); #endif #if defined(MSDOS) && defined(PC_MOUSE) mouse_init(); #endif } /* reset terminal to original state */ void settty(s) const char *s; { #if defined(MSDOS) && defined(NO_TERMS) gr_finish(); #endif #if defined(MSDOS) && defined(PC_MOUSE) mouse_finish(); #endif end_screen(); if(s) raw_print(s); #if !defined(TOS) enable_ctrlP(); /* turn on ^P processing */ #endif } /* called by init_nhwindows() and resume_nhwindows() */ void setftty() { start_screen(); } #if defined(TIMED_DELAY) && defined(_MSC_VER) void msleep(mseconds) unsigned mseconds; { /* now uses clock() which is ANSI C */ clock_t goal; goal = mseconds + clock(); while ( goal > clock()) { /* do nothing */ } } #endif /* fatal error */ /*VARARGS1*/ void error VA_DECL(const char *,s) VA_START(s); VA_INIT(s, const char *); /* error() may get called before tty is initialized */ if (iflags.window_inited) end_screen(); putchar('\n'); Vprintf(s,VA_ARGS); putchar('\n'); VA_END(); exit(EXIT_FAILURE); } /*pctty.c*/ slashem-0.0.7E7F3/sys/share/tclib.c0000664000076400007640000003070210545462317015037 0ustar aliali/* SCCS Id: @(#)tclib.c 3.4 1996/02/25 */ /* Copyright (c) Robert Patrick Rankin, 1995 */ /* NetHack may be freely redistributed. See license for details. */ /* termcap library implementation */ #include "config.h" #ifndef TERMCAP /* name of default termcap file */ #define TERMCAP "/etc/termcap" #endif #ifndef TCBUFSIZ /* size of tgetent buffer; Unix man page says 1024 */ #define TCBUFSIZ 1024 #endif #define ESC '\033' /* termcap's '\E' */ #define BEL '\007' /* ANSI C's '\a' (we assume ASCII here...) */ /* exported variables, as per man page */ char PC; char *BC, *UP; short ospeed; /* exported routines */ int FDECL(tgetent, (char *,const char *)); int FDECL(tgetflag, (const char *)); int FDECL(tgetnum, (const char *)); char *FDECL(tgetstr, (const char *,char **)); char *FDECL(tgoto, (const char *,int,int)); char *FDECL(tparam, (const char *,char *,int,int,int,int,int)); void FDECL(tputs, (const char *,int,int (*)())); /* local support data */ static char *tc_entry; static char bc_up_buf[24]; #ifndef NO_DELAY_PADDING /* `ospeed' to baud rate conversion table, adapted from GNU termcap-1.2 */ static short baud_rates[] = { 0, 50, 75, 110, 135, 150, # ifdef VMS 300, 600, 1200, 1800, 2000, 2400, 3600, 4800, 7200, # else /* assume Unix */ 200, 300, 600, 1200, 1800, 2400, 4800, # endif 9600, -192, -384, /* negative is used as `100 * abs(entry)' */ # ifdef VMS -576, -768, -1152, # endif }; #endif /* !NO_DELAY_PADDING */ /* local support code */ static int FDECL(tc_store, (const char *,const char *)); static char *FDECL(tc_find, (FILE *,const char *,char *,int)); static char *FDECL(tc_name, (const char *,char *)); static const char *FDECL(tc_field, (const char *,const char **)); #ifndef min #define min(a,b) ((a)<(b)?(a):(b)) #endif /* retrieve the specified terminal entry and return it in `entbuf' */ int tgetent(entbuf, term) char *entbuf; /* size must be at least [TCBUFSIZ] */ const char *term; { int result; FILE *fp; char *tc = getenv("TERMCAP"); tc_entry = entbuf; if (!entbuf || !term) return -1; /* if ${TERMCAP} is found as a file, it's not an inline termcap entry */ if ((fp = fopen(tc ? tc : TERMCAP, "r")) != 0) tc = 0; /* if ${TERMCAP} isn't a file and `term' matches ${TERM}, use ${TERMCAP} */ if (tc) { char *tm = getenv("TERM"); if (tm && strcmp(tm, term) == 0) return tc_store(term, tc); fp = fopen(TERMCAP, "r"); } /* otherwise, look `term' up in the file */ if (fp) { char wrkbuf[TCBUFSIZ]; tc = tc_find(fp, term, wrkbuf, (int)(sizeof wrkbuf - strlen(term))); result = tc_store(term, tc); (void) fclose(fp); } else { result = -1; } return result; } /* copy the entry into the output buffer */ static int tc_store(trm, ent) const char *trm, *ent; { const char *bar, *col; char *s; size_t n; int k; if (!ent || !*ent || !trm || !*trm || (col = index(ent, ':')) == 0) return 0; (void) strcpy(tc_entry, trm); if (((bar = index(ent, '|')) != 0 && bar < col) || ((long)(n = strlen(trm)) == (long)(col - ent) && strncmp(ent, trm, n) == 0)) (void) strcat(tc_entry, col); else if (*ent == ':') (void) strcat(tc_entry, ent); else (void) strcat(strcat(tc_entry, ":"), ent); /* initialize global variables */ k = tgetnum("pc"); PC = (k == -1) ? '\0' : (char)k; BC = s = bc_up_buf; if (!tgetstr("bc", &s)) (void)strcpy(s, "\b"), s += 2; UP = s; (void)tgetstr("up", &s); #ifndef NO_DELAY_PADDING /* caller must set `ospeed' */ if ((int)ospeed >= (int)SIZE(baud_rates)) ospeed = (short)(SIZE(baud_rates) - 1); else if (ospeed < 0) ospeed = 0; #endif /* !NO_DELAY_PADDING */ return 1; } /* search for an entry in the termcap file */ static char * tc_find(fp, term, buffer, bufsiz) FILE *fp; const char *term; char *buffer; int bufsiz; { int in, len, first, skip; char *ip, *op, *tc_fetch, tcbuf[TCBUFSIZ]; buffer[0] = '\0'; do { ip = tcbuf, in = min(bufsiz,TCBUFSIZ); first = 1, skip = 0; /* load entire next entry, including any continuations */ do { if (!fgets(ip, min(in,BUFSIZ), fp)) break; if (first) skip = (*ip == '#'), first = 0; len = (int)strlen(ip); if (!skip && len > 1 && *(ip + len - 1) == '\n' && *(ip + len - 2) == '\\') len -= 2; ip += len, in -= len; } while (*(ip - 1) != '\n' && in > 0); if (ferror(fp) || ip == buffer || *(ip - 1) != '\n') return (char *)0; *--ip = '\0'; /* strip newline */ if (!skip) ip = tc_name(term, tcbuf); } while (skip || !ip); /* we have the desired entry; strip cruft and look for :tc=other: */ tc_fetch = 0; for (op = buffer; *ip; ip++) { if (op == buffer || *(op - 1) != ':' || (*ip != ' ' && *ip != '\t' && *ip != ':')) *op++ = *ip, bufsiz -= 1; if (ip[0] == ':' && ip[1] == 't' && ip[2] == 'c' && ip[3] == '=') { tc_fetch = &ip[4]; if ((ip = index(tc_fetch, ':')) != 0) *ip = '\0'; break; } } *op = '\0'; if (tc_fetch) { rewind(fp); tc_fetch = tc_find(fp, tc_fetch, tcbuf, min(bufsiz,TCBUFSIZ)); if (!tc_fetch) return (char *)0; if (op > buffer && *(op - 1) == ':' && *tc_fetch == ':') ++tc_fetch; strcpy(op, tc_fetch); } return buffer; } /* check whether `ent' contains `nam'; return start of field entries */ static char * tc_name(nam, ent) const char *nam; char *ent; { char *nxt, *lst, *p = ent; size_t n = strlen(nam); if ((lst = index(p, ':')) == 0) lst = p + strlen(p); while (p < lst) { if ((nxt = index(p, '|')) == 0 || nxt > lst) nxt = lst; if ((long)(nxt - p) == (long)n && strncmp(p, nam, n) == 0) return lst; p = nxt + 1; } return (char *)0; } /* look up a numeric entry */ int tgetnum(which) const char *which; { const char *q, *p = tc_field(which, &q); char numbuf[32]; size_t n; if (!p || p[2] != '#') return -1; p += 3; if ((n = (size_t)(q - p)) >= sizeof numbuf) return -1; (void) strncpy(numbuf, p, n); numbuf[n] = '\0'; return atoi(numbuf); } /* look up a boolean entry */ int tgetflag(which) const char *which; { const char *p = tc_field(which, (const char **)0); return (!p || p[2] != ':') ? 0 : 1; } /* look up a string entry; update `*outptr' */ char * tgetstr(which, outptr) const char *which; char **outptr; { int n; char c, *r, *result; const char *q, *p = tc_field(which, &q); if (!p || p[2] != '=') return (char *)0; p += 3; if ((q = index(p, ':')) == 0) q = p + strlen(p); r = result = *outptr; while (p < q) { switch ((*r = *p++)) { case '\\': switch ((c = *p++)) { case 'E': *r = ESC; break; case 'a': *r = BEL; break; case 'b': *r = '\b'; break; case 'f': *r = '\f'; break; case 'n': *r = '\n'; break; case 'r': *r = '\r'; break; case 't': *r = '\t'; break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': n = c - '0'; if (*p >= '0' && *p <= '7') n = 8 * n + (*p++ - '0'); if (*p >= '0' && *p <= '7') n = 8 * n + (*p++ - '0'); *r = (char)n; break; /* case '^': case '\\': */ default: *r = c; break; } break; case '^': *r = (*p++ & 037); if (!*r) *r = (char)'\200'; break; default: break; } ++r; } *r++ = '\0'; *outptr = r; return result; } /* look for a particular field name */ static const char * tc_field(field, tc_end) const char *field; const char **tc_end; { const char *end, *q, *p = tc_entry; end = p + strlen(p); while (p < end) { if ((p = index(p, ':')) == 0) break; ++p; if (p[0] == field[0] && p[1] == field[1] && (p[2] == ':' || p[2] == '=' || p[2] == '#' || p[2] == '@')) break; } if (tc_end) { if (p) { if ((q = index(p + 2, ':')) == 0) q = end; } else q = 0; *tc_end = q; } return p; } static char cmbuf[64]; /* produce a string which will position the cursor at if output */ char * tgoto(cm, col, row) const char *cm; int col, row; { return tparam(cm, cmbuf, (int)(sizeof cmbuf), row, col, 0, 0); } /* format a parameterized string, ala sprintf */ char * tparam(ctl, buf, buflen, row, col, row2, col2) const char *ctl; /* parameter control string */ char *buf; /* output buffer */ int buflen; /* ought to have been `size_t'... */ int row, col, row2, col2; { int atmp, ac, av[5]; char c, *r, *z, *bufend, numbuf[32]; const char *fmt; #ifndef NO_SPECIAL_CHARS_FIXUP int bc = 0, up = 0; #endif av[0] = row, av[1] = col, av[2] = row2, av[3] = col2, av[4] = 0; ac = 0; r = buf, bufend = r + buflen - 1; while (*ctl) { if ((*r = *ctl++) == '%') { if (ac > 4) ac = 4; fmt = 0; switch ((c = *ctl++)) { case '%': break; /* '%' already copied */ case 'd': fmt = "%d"; break; case '2': fmt = "%02d"; break; case '3': fmt = "%03d"; break; case '+': /*FALLTHRU*/ case '.': *r = (char)av[ac++]; if (c == '+') *r += *ctl++; if (!*r) { *r = (char)'\200'; } else { #ifndef NO_SPECIAL_CHARS_FIXUP /* avoid terminal driver intervention for various control characters, to prevent LF from becoming CR+LF, for instance; only makes sense if this is a cursor positioning sequence, but we have no way to check that */ while (index("\004\t\n\013\f\r", *r)) { if (ac & 1) { /* row */ if (!UP || !*UP) break; /* can't fix */ ++up; /* incr row now, later move up */ } else { /* column */ if (!BC || !*BC) break; /* can't fix */ ++bc; /* incr column, later backspace */ } (*r)++; } #endif /* !NO_SPECIAL_CHARS_FIXUP */ } break; case '>': if (av[ac] > (*ctl++ & 0377)) av[ac] += *ctl; ++ctl; break; case 'r': atmp = av[0]; av[0] = av[1]; av[1] = atmp; atmp = av[2]; av[2] = av[3]; av[3] = atmp; --r; break; case 'i': ++av[0]; ++av[1]; ++av[2]; ++av[3]; --r; break; case 'n': av[0] ^= 0140; av[1] ^= 0140; av[2] ^= 0140; av[3] ^= 0140; --r; break; case 'B': av[0] = ((av[0] / 10) << 4) + (av[0] % 10); av[1] = ((av[1] / 10) << 4) + (av[1] % 10); av[2] = ((av[2] / 10) << 4) + (av[2] % 10); av[3] = ((av[3] / 10) << 4) + (av[3] % 10); --r; break; case 'D': av[0] -= (av[0] & 15) << 1; av[1] -= (av[1] & 15) << 1; av[2] -= (av[2] & 15) << 1; av[3] -= (av[3] & 15) << 1; --r; break; default: *++r = c; break; /* erroneous entry... */ } if (fmt) { (void) sprintf(numbuf, fmt, av[ac++]); for (z = numbuf; *z && r <= bufend; z++) *r++ = *z; --r; /* will be re-incremented below */ } } if (++r > bufend) return (char *)0; } #ifndef NO_SPECIAL_CHARS_FIXUP if (bc || up) { while (--bc >= 0) for (z = BC; *z && r <= bufend; z++) *r++ = *z; while (--up >= 0) for (z = UP; *z && r <= bufend; z++) *r++ = *z; if (r > bufend) return (char *)0; } #endif /* !NO_SPECIAL_CHARS_FIXUP */ *r = '\0'; return buf; } /* send a string to the terminal, possibly padded with trailing NULs */ void tputs( string, range, output_func ) const char *string; /* characters to output */ int range; /* number of lines affected, used for `*' delays */ int (*output_func)(); /* actual output routine; return value ignored */ { register int c, num = 0; register const char *p = string; if (!p || !*p) return; /* pick out padding prefix, if any */ if (*p >= '0' && *p <= '9') { do { /* note: scale `num' by 10 to accommodate fraction */ num += (*p++ - '0'), num *= 10; } while (*p >= '0' && *p <= '9'); if (*p == '.') ++p, num += (*p >= '0' && *p <= '9') ? (*p++ - '0') : 0; if (*p == '*') ++p, num *= range; } /* output the string */ while ((c = *p++) != '\0') { if (c == '\200') c = '\0'; /* undo tgetstr's encoding */ (void) (*output_func)(c); } #ifndef NO_DELAY_PADDING /* perform padding */ if (num) { long pad; /* figure out how many chars needed to produce desired elapsed time */ pad = (long)baud_rates[ospeed]; if (pad < 0) pad *= -100L; pad *= (long)num; /* 100000 == 10 bits/char * (1000 millisec/sec scaled by 10) */ num = (int)(pad / 100000L); /* number of characters */ c = PC; /* assume output_func isn't allowed to change PC */ while (--num >= 0) (void) (*output_func)(c); } #endif /* !NO_DELAY_PADDING */ return; } /*tclib.c*/ slashem-0.0.7E7F3/sys/share/pcmain.c0000664000076400007640000003536310545462317015221 0ustar aliali/* SCCS Id: @(#)pcmain.c 3.4 2002/08/22 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ /* main.c - MSDOS, OS/2, ST, Amiga, and NT NetHack */ #include "hack.h" #include "dlb.h" /* WAC for DEF_GAME_NAME */ #ifdef SHORT_FILENAMES #include "patchlev.h" #else #include "patchlevel.h" #endif #ifndef NO_SIGNAL #include #endif #include #if !defined(AMIGA) && !defined(GNUDOS) #include #else # ifdef GNUDOS #include # endif #endif #ifdef WIN32 #include "win32api.h" /* for GetModuleFileName */ #endif #ifdef __DJGPP__ #include /* for getcwd() prototype */ #endif #ifdef OVL0 #define SHARED_DCL #else #define SHARED_DCL extern #endif SHARED_DCL char orgdir[PATHLEN]; /* also used in pcsys.c, amidos.c */ #ifdef TOS boolean run_from_desktop = TRUE; /* should we pause before exiting?? */ # ifdef __GNUC__ long _stksize = 16*1024; # endif #endif #ifdef AMIGA extern int bigscreen; void NDECL( preserve_icon ); #endif STATIC_DCL void FDECL(process_options,(int argc,char **argv)); STATIC_DCL void NDECL(nhusage); #if defined(MICRO) || defined(WIN32) || defined(OS2) extern void FDECL(nethack_exit,(int)); #else #define nethack_exit exit #endif #ifdef WIN32 extern boolean getreturn_enabled; /* from sys/share/pcsys.c */ #endif #if defined(MSWIN_GRAPHICS) extern void NDECL(mswin_destroy_reg); #endif #ifdef EXEPATH STATIC_DCL char *FDECL(exepath,(char *)); #endif #ifdef OVL0 int FDECL(main, (int,char **)); #endif extern void FDECL(pcmain, (int,char **)); #if defined(__BORLANDC__) && !defined(_WIN32) void NDECL( startup ); # ifdef OVLB unsigned _stklen = STKSIZ; # else extern unsigned _stklen; # endif #endif #ifdef OVL0 /* If the graphics version is built, we don't need a main; it is skipped * to help MinGW decide which entry point to choose. If both main and * WinMain exist, the resulting executable won't work correctly. */ #ifndef MSWIN_GRAPHICS int main(argc,argv) int argc; char *argv[]; { pcmain(argc,argv); #ifdef LAN_FEATURES init_lan_features(); #endif moveloop(); nethack_exit(EXIT_SUCCESS); /*NOTREACHED*/ return 0; } #endif /*MSWIN_GRAPHICS*/ #endif /*OVL0*/ #ifdef OVL1 void pcmain(argc,argv) int argc; char *argv[]; { register int fd; register char *dir; #if defined(__BORLANDC__) && !defined(_WIN32) startup(); #endif #ifdef TOS long clock_time; if (*argv[0]) { /* only a CLI can give us argv[0] */ hname = argv[0]; run_from_desktop = FALSE; } else #endif #ifdef __DJGPP__ if (*argv[0]) hname = argv[0]; /* DJGPP can give us argv[0] */ else #endif hname = "NetHack"; /* used for syntax messages */ choose_windows(DEFAULT_WINDOW_SYS); #if !defined(AMIGA) && !defined(GNUDOS) /* Save current directory and make sure it gets restored when * the game is exited. */ if (getcwd(orgdir, sizeof orgdir) == (char *)0) error("NetHack: current directory path too long"); # ifndef NO_SIGNAL signal(SIGINT, (SIG_RET_TYPE) nethack_exit); /* restore original directory */ # endif #endif /* !AMIGA && !GNUDOS */ dir = nh_getenv("NETHACKDIR"); if (dir == (char *)0) dir = nh_getenv("HACKDIR"); #ifdef EXEPATH if (dir == (char *)0) dir = exepath(argv[0]); #endif if (dir != (char *)0) { (void) strncpy(hackdir, dir, PATHLEN - 1); hackdir[PATHLEN-1] = '\0'; #ifdef NOCWD_ASSUMPTIONS { int prefcnt; fqn_prefix[0] = (char *)alloc(strlen(hackdir)+2); Strcpy(fqn_prefix[0], hackdir); append_slash(fqn_prefix[0]); for (prefcnt = 1; prefcnt < PREFIX_COUNT; prefcnt++) fqn_prefix[prefcnt] = fqn_prefix[0]; } #endif #ifdef CHDIR chdirx (dir, 1); #endif } #ifdef AMIGA # ifdef CHDIR /* * If we're dealing with workbench, change the directory. Otherwise * we could get "Insert disk in drive 0" messages. (Must be done * before initoptions()).... */ if(argc == 0) chdirx(HACKDIR, 1); # endif ami_wininit_data(); #endif #if defined(WIN32) && defined(PROXY_GRAPHICS) /* Handle --proxy before options, if supported */ if (argc > 1 && !strcmp(argv[1], "--proxy")) { argv[1] = argv[0]; argc--; argv++; set_binary_mode(0, O_RDONLY | O_BINARY); set_binary_mode(1, O_WRONLY | O_BINARY); choose_windows("proxy"); lock_windows(TRUE); /* Can't be overridden from options */ } #endif initoptions(); #if defined(TOS) && defined(TEXTCOLOR) if (iflags.BIOS && iflags.use_color) set_colors(); #endif if (!hackdir[0]) #if !defined(LATTICE) && !defined(AMIGA) Strcpy(hackdir, orgdir); #else Strcpy(hackdir, HACKDIR); #endif if(argc > 1) { if (!strncmp(argv[1], "-d", 2) && argv[1][2] != 'e') { /* avoid matching "-dec" for DECgraphics; since the man page * says -d directory, hope nobody's using -desomething_else */ argc--; argv++; dir = argv[0]+2; if(*dir == '=' || *dir == ':') dir++; if(!*dir && argc > 1) { argc--; argv++; dir = argv[0]; } if(!*dir) error("Flag -d must be followed by a directory name."); Strcpy(hackdir, dir); } if (argc > 1) { /* * Now we know the directory containing 'record' and * may do a prscore(). */ if (!strncmp(argv[1], "-s", 2)) { #ifdef CHDIR chdirx(hackdir,0); #endif prscore(argc, argv); nethack_exit(EXIT_SUCCESS); } #ifdef MSWIN_GRAPHICS if (!strncmpi(argv[1], "-clearreg", 6)) { /* clear registry */ mswin_destroy_reg(); nethack_exit(EXIT_SUCCESS); } #endif /* Don't initialize the window system just to print usage */ /* WAC '--help' inits help */ if (!strncmp(argv[1], "-?", 2) || !strncmp(argv[1], "--help", 6) || !strncmp(argv[1], "/?", 2)) { nhusage(); nethack_exit(EXIT_SUCCESS); } } } /* * It seems you really want to play. */ #ifdef TOS if (comp_times((long)time(&clock_time))) error("Your clock is incorrectly set!"); #endif u.uhp = 1; /* prevent RIP on early quits */ 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); #endif #ifdef MSDOS process_options(argc, argv); init_nhwindows(&argc,argv); #else init_nhwindows(&argc,argv); process_options(argc, argv); #endif #ifdef MFLOPPY set_lock_and_bones(); # ifndef AMIGA copybones(FROMPERM); # endif #endif if (!*plname) askname(); plnamesuffix(); /* strip suffix from name; calls askname() */ /* again if suffix was whole name */ /* accepts any suffix */ #ifdef WIZARD if (wizard) { # ifdef KR1ED if(!strcmp(plname, WIZARD_NAME)) # else if(!strcmp(plname, WIZARD)) # endif Strcpy(plname, "wizard"); else { wizard = FALSE; discover = TRUE; } } #endif /* WIZARD */ #if defined(PC_LOCKING) /* 3.3.0 added this to support detection of multiple games * under the same plname on the same machine in a windowed * or multitasking environment. * * That allows user confirmation prior to overwriting the * level files of a game in progress. * * Also prevents an aborted game's level files from being * overwritten without confirmation when a user starts up * another game with the same player name. */ # if defined(WIN32) /* Obtain the name of the logged on user and incorporate * it into the name. */ Sprintf(lock, "%s-%s",get_username(0),plname); # else Strcpy(lock,plname); regularize(lock); # endif getlock(); #else /* PC_LOCKING */ # ifdef AMIGA /* We'll put the bones & levels in the user specified directory -jhsa */ Strcat(lock,plname); Strcat(lock,".99"); # else # ifndef MFLOPPY /* I'm not sure what, if anything, is left here, but MFLOPPY has * conflicts with set_lock_and_bones() in files.c. */ Strcpy(lock,plname); Strcat(lock,".99"); regularize(lock); /* is this necessary? */ /* not compatible with full path a la AMIGA */ # endif # endif #endif /* Set up level 0 file to keep the game state. */ fd = create_levelfile(0, (char *)0); if (fd < 0) { raw_print("Cannot create lock file"); } else { hackpid = 1; write(fd, (genericptr_t) &hackpid, sizeof(hackpid)); close(fd); } #ifdef MFLOPPY level_info[0].where = ACTIVE; #endif /* * Initialisation of the boundaries of the mazes * Both boundaries have to be even. */ x_maze_max = COLNO-1; if (x_maze_max % 2) x_maze_max--; y_maze_max = ROWNO-1; if (y_maze_max % 2) y_maze_max--; /* * Initialize the vision system. This must be before mklev() on a * new game or before a level restore on a saved game. */ vision_init(); dlb_init(); display_gamewindows(); #ifdef WIN32 getreturn_enabled = TRUE; #endif if ((fd = restore_saved_game()) >= 0) { #ifdef WIZARD /* Since wizard is actually flags.debug, restoring might * overwrite it. */ boolean remember_wiz_mode = wizard; #endif #ifndef NO_SIGNAL (void) signal(SIGINT, (SIG_RET_TYPE) done1); #endif #ifdef NEWS if(iflags.news){ display_file_area(NEWS_AREA, NEWS, FALSE); iflags.news = FALSE; } #endif pline("Restoring save file..."); mark_synch(); /* flush output */ if(!dorecover(fd)) goto not_recovered; #ifdef WIZARD if(!wizard && remember_wiz_mode) wizard = TRUE; #endif check_special_room(FALSE); if (discover) You("are in non-scoring discovery mode."); if (discover || wizard) { if(yn("Do you want to keep the save file?") == 'n'){ (void) delete_savefile(); } } flags.move = 0; } else { not_recovered: player_selection(); newgame(); if (discover) You("are in non-scoring discovery mode."); flags.move = 0; set_wear(); (void) pickup(1); sense_engr_at(u.ux,u.uy,FALSE); } #ifdef __DJGPP__ /* WAC try to set title bar for Win95 DOS Boxes */ /* { char titlebuf[BUFSZ]; sprintf(titlebuf,"%s - %s", DEF_GAME_NAME, plname); (void) w95_setapptitle (titlebuf); }*/ #endif #ifndef NO_SIGNAL (void) signal(SIGINT, SIG_IGN); #endif #ifdef OS2 gettty(); /* somehow ctrl-P gets turned back on during startup ... */ #endif return; } STATIC_OVL void process_options(argc, argv) int argc; char *argv[]; { int i; /* * Process options. */ while(argc > 1 && argv[1][0] == '-'){ 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': case 'Z': # ifdef WIZARD /* If they don't have a valid wizard name, it'll be * changed to discover later. Cannot check for * validity of the name right now--it might have a * character class suffix, for instance. */ wizard = TRUE; break; # endif case 'X': discover = TRUE; break; #ifdef NEWS case 'n': iflags.news = FALSE; break; #endif case 'u': if(argv[0][2]) (void) strncpy(plname, argv[0]+2, sizeof(plname)-1); else if(argc > 1) { argc--; argv++; (void) strncpy(plname, argv[0], sizeof(plname)-1); } else raw_print("Player name expected after -u"); break; #ifndef AMIGA case 'i': if (!strncmpi(argv[0]+1, "IBM", 3)) switch_graphics(IBM_GRAPHICS); break; case 'd': if (!strncmpi(argv[0]+1, "DEC", 3)) 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) flags.initrole = i; } else if (argc > 1) { argc--; argv++; if ((i = str2role(argv[0])) >= 0) flags.initrole = i; } break; case 'r': /* race */ if (argv[0][2]) { if ((i = str2race(&argv[0][2])) >= 0) flags.initrace = i; } else if (argc > 1) { argc--; argv++; if ((i = str2race(argv[0])) >= 0) flags.initrace = i; } break; #ifdef MFLOPPY # ifndef AMIGA /* Player doesn't want to use a RAM disk */ case 'R': ramdisk = FALSE; break; # endif #endif #ifdef AMIGA /* interlaced and non-interlaced screens */ case 'L': bigscreen = 1; break; case 'l': bigscreen = -1; break; #endif case '@': flags.randomall = 1; break; default: if ((i = str2role(&argv[0][1])) >= 0) { flags.initrole = i; break; } else raw_printf("\nUnknown switch: %s", argv[0]); /* FALL THROUGH */ case '?': nhusage(); nethack_exit(EXIT_SUCCESS); } } } STATIC_OVL void nhusage() { char buf1[BUFSZ]; /* -role still works for those cases which aren't already taken, but * is deprecated and will not be listed here. */ (void) Sprintf(buf1, "\nUsage: %s [-d dir] -s [-r race] [-p profession] [maxrank] [name]...\n or", hname); if (!iflags.window_inited) raw_printf(buf1); else (void) printf(buf1); (void) Sprintf(buf1, "\n %s [-d dir] [-u name] [-r race] [-p profession] [-[DX]]", hname); #ifdef NEWS Strcat(buf1," [-n]"); #endif #ifndef AMIGA Strcat(buf1," [-I] [-i] [-d]"); #endif #ifdef MFLOPPY # ifndef AMIGA Strcat(buf1," [-R]"); # endif #endif #ifdef AMIGA Strcat(buf1," [-[lL]]"); #endif if (!iflags.window_inited) raw_printf("%s\n",buf1); else (void) printf("%s\n",buf1); } #ifdef CHDIR void chdirx(dir, wr) char *dir; boolean wr; { # ifdef AMIGA static char thisdir[] = ""; # else static char thisdir[] = "."; # endif if(dir && chdir(dir) < 0) { error("Cannot chdir to %s.", dir); } # if !defined(AMIGA) && !defined(__CYGWIN__) /* Change the default drive as well. */ chdrive(dir); # endif /* warn the player if we can't write the record file */ /* perhaps we should also test whether . is writable */ /* unfortunately the access system-call is worthless */ if (wr) check_recordfile(dir ? dir : thisdir); } #endif /* CHDIR */ #endif /*OVL1*/ #ifdef OVLB #ifdef PORT_HELP # if defined(MSDOS) || defined(WIN32) void port_help() { /* display port specific help file */ display_file_area(FILE_AREA_SHARE, PORT_HELP, 1 ); } # endif /* MSDOS || WIN32 */ #endif /* PORT_HELP */ #ifdef EXEPATH #ifdef __DJGPP__ #define PATH_SEPARATOR '/' #else #define PATH_SEPARATOR '\\' #endif #define EXEPATHBUFSZ 256 char exepathbuf[EXEPATHBUFSZ]; char *exepath(str) char *str; { char *tmp, *tmp2; int bsize; if (!str) return (char *)0; bsize = EXEPATHBUFSZ; tmp = exepathbuf; #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'; return tmp; } #endif /* EXEPATH */ #endif /*OVLB*/ /*pcmain.c*/ slashem-0.0.7E7F3/sys/share/lev_comp.h0000664000076400007640000000343710545462317015560 0ustar aliali#ifndef YYERRCODE #define YYERRCODE 256 #endif #define CHAR 257 #define INTEGER 258 #define BOOLEAN 259 #define PERCENT 260 #define MESSAGE_ID 261 #define MAZE_ID 262 #define LEVEL_ID 263 #define LEV_INIT_ID 264 #define GEOMETRY_ID 265 #define NOMAP_ID 266 #define OBJECT_ID 267 #define COBJECT_ID 268 #define MONSTER_ID 269 #define TRAP_ID 270 #define DOOR_ID 271 #define DRAWBRIDGE_ID 272 #define MAZEWALK_ID 273 #define WALLIFY_ID 274 #define REGION_ID 275 #define FILLING 276 #define RANDOM_OBJECTS_ID 277 #define RANDOM_MONSTERS_ID 278 #define RANDOM_PLACES_ID 279 #define ALTAR_ID 280 #define LADDER_ID 281 #define STAIR_ID 282 #define NON_DIGGABLE_ID 283 #define NON_PASSWALL_ID 284 #define ROOM_ID 285 #define PORTAL_ID 286 #define TELEPRT_ID 287 #define BRANCH_ID 288 #define LEV 289 #define CHANCE_ID 290 #define CORRIDOR_ID 291 #define GOLD_ID 292 #define ENGRAVING_ID 293 #define FOUNTAIN_ID 294 #define POOL_ID 295 #define SINK_ID 296 #define NONE 297 #define RAND_CORRIDOR_ID 298 #define DOOR_STATE 299 #define LIGHT_STATE 300 #define CURSE_TYPE 301 #define ENGRAVING_TYPE 302 #define DIRECTION 303 #define RANDOM_TYPE 304 #define O_REGISTER 305 #define M_REGISTER 306 #define P_REGISTER 307 #define A_REGISTER 308 #define ALIGNMENT 309 #define LEFT_OR_RIGHT 310 #define CENTER 311 #define TOP_OR_BOT 312 #define ALTAR_TYPE 313 #define UP_OR_DOWN 314 #define SUBROOM_ID 315 #define NAME_ID 316 #define FLAGS_ID 317 #define FLAG_TYPE 318 #define MON_ATTITUDE 319 #define MON_ALERTNESS 320 #define MON_APPEARANCE 321 #define CONTAINED 322 #define OBJFLAG_TYPE 323 #define OBJFLAGS_ID 324 #define RANDOMREGION_ID 325 #define R_REGISTER 326 #define STRING 327 #define MAP_ID 328 typedef union { int i; char* map; struct { xchar room; xchar wall; xchar door; } corpos; } YYSTYPE; extern YYSTYPE yylval; slashem-0.0.7E7F3/sys/share/uudecode.c0000664000076400007640000001324610545462317015543 0ustar aliali/* * 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 slashem-0.0.7E7F3/sys/share/dgn_comp.h0000664000076400007640000000104710545462317015535 0ustar aliali#ifndef YYERRCODE #define YYERRCODE 256 #endif #define INTEGER 257 #define A_DUNGEON 258 #define BRANCH 259 #define CHBRANCH 260 #define LEVEL 261 #define RNDLEVEL 262 #define CHLEVEL 263 #define RNDCHLEVEL 264 #define UP_OR_DOWN 265 #define PROTOFILE 266 #define DESCRIPTION 267 #define DESCRIPTOR 268 #define LEVELDESC 269 #define ALIGNMENT 270 #define LEVALIGN 271 #define ENTRY 272 #define STAIR 273 #define NO_UP 274 #define NO_DOWN 275 #define PORTAL 276 #define STRING 277 typedef union { int i; char* str; } YYSTYPE; extern YYSTYPE yylval; slashem-0.0.7E7F3/sys/share/sounds/0000775000076400007640000000000010545462317015107 5ustar alialislashem-0.0.7E7F3/sys/share/sounds/toolhorn.uu0000664000076400007640000005131010545462317017326 0ustar alialibegin 644 Tooled_Horn M``M4;V]L960@2&]R;@`````````````````````````````````````````` M``````````````````````````!!249&4V0R80$``((`10```````#DB```! MSJ<]K0&G/:TS``````````````````````````````"!@1/]``!&3U)-```Y M&D%)1D934TY$```W'@````````````````````````````#_____________ M__________________________\```````````````````````````#_____ M________```!`@,#!`4%!@8&!@8%!00$`P("`0$``/____________\````` M`0$!`@("`P,#`P,#`@("`@("`0$``/___OW]^_KY]_;T\_'P[^_N[^_P\O/V M^/O]``0&"`L-#Q`0$!`/#0P+"0@&!`,!`/_^_OW]_?W]_?W]_?[^__\``0$" M`P0$!04%!04%!04%!`,#`@$`__[]^_GW]?+P[>OIY^7EY>7GZ>SP]/G]`@8* M#A(5%Q@9&!<6%!$/#`H(!@0"`/_]_/S[^_O[^_O[_/S]_?[_``$#`P0$!04& M!@<("`D)"`<&!`,!__W[^?;R[NKEX=W;V=?7V=O>X^CN]?L""`X4&1P?(2(A M(!X<&183#PP*!P4#`?_^_/OZ^OKZ^OKZ^OO[_/W^``$"`P0%!@<("`D*"PL+ M"@D(!@4#`?[[^/3OZN7?VM;2S\[/T-/7V^'F[?3[!`P3&B`D*"HJ*B@E(AX; M%Q,/#`D&`P'__?S[^OKZ^?GY^OK[_/W^``$"`P,$!`4&!P@)"0H*"@D(!P8% M`P#]^O;Q[.?AV]71SKCW=?1R\?#P<#"Q,C-U-SE[_H&$1PF+C0X.CHX-3`K)B$;%A(-"04"__W[ M^OGX]_?W]_?X^/G[_/X``0("`P0%!P@)"@L,#`P+"@D(!P8#`/WX\^WFW]?0 MR,.^NKBZO,'(T=KE[_L'$AXG,#8Z/#PZ-S,M*"(=&!,/"P<$`/[\^OGX^/?W M]_?W^/GZ_/[_``$"!`4&"`D+#0X/$`\.#0L*"`0`_/CS[>;?UL['P+JULK&S MMKW%T-SI]P85(BXX/T-%1$(^.#(K)1\9%`\+!P0!_OSZ^?CW]_?W]_CY^?O] M_O\``0$"`P0%!P@*"PP-#0T,#`L*"`4!_??RZ^3;T\S$OKBSL*^QM+K"SMOK M^PL;*C8_14E*2$0_.#$J(QT7$0T)!0(`_OS[^OGY^?CX^?GZ^_S]_O[__P`` M`0(#!08'"0H+#`P+"PL*"`4"_OGS[.7+3E! M1TI*2$,]-BXG(!H4#PL(!0(`__[]_/S\^_O[^_S\_?W^_O[^_O[^_O\``0,% M!PD*"PP-#0T,"@<$`/SU[N;>U<['P+JTL;"PLK:^R-;G^0L=+3I$2DU-2D4^ M-R\F'QD3#@H&!`(`__[]_?S\_/S\_/S\_?W^_O[]_?W]_O[_`0($!@@)"0H* M"@H)"`8$`?WX\>KCVM/,Q+ZZM[:VN+O"RM7D]`46)3(\1$A)1T,^-R\H(!H4 M#PL(!0(`__[^_?W]_?S\_/S]_?[^_O[^_O[^_O\``@,%!@<("0H+"PL)"`8# M__KT[.7'S!1K^$2,S0$A.4$]+1#PT*R(;%`\+!P0"`0#___[^_O[^ M_O[^____``#___[^_?W]_?X``@,%!P@*"PP,"PH(!0+]^/'JX]K3S,2^N+.P MK["RM\#-W?`%&2LZ1DY14D]*0SHP)Q\7$0P(!0,!``#___________\```$! M`0#___[]_/S\_/[_`0,%!@@)"@L,#`H(!0']^/'JXMO3S,6_N;2QL+"RM\#, MW?$&&RT\2$]34U!)0CDO)AT6$`L'!`,!````______[^_O___P```/___O[] M_?W]_?X``0,%!@<("0D*"0@'!0/_^O/LY-W5SL;`N[>TL[2VN\/.W>\#%B@W M0TM/44Y)0CDP)Q\7$0P(!0,"`0``_____O[^_O[__P````#__O[]_?W]_O\` M`@,%!@<'"`D*"@H)!P0`^_3LY=S3S,.\MK*OKJ^RN<32Y/@-(#(_24]244U' M/C8L(QL4#@H&!`(!`/_^_O[^_O[^_O__``$!`0#___[^_?W]_O\!`P4'"0H* M"PL+"0@&!`#[]>[GWM;-Q;ZWL:VKK*^TOLO;[P4:+#Q'3U-34$I#.C`G'A<1 M#`@%`P$`___^_O[^_O[^____```!`0#___[]_?W]_@`!`P4'"`@)"@L*"@@& M!`#Z].SDW=3,P[RVL*RKK;"UO\S>\PD=+SY*45144$E"."\F'180"P<%`P(! M`/___O[^_O[^_O__```!`0#___[]_?W]_@`"!`8'"0H+"PL+"@@'!`#[].WD MW-/,P[RVL:ZMK:^TOLO<\0<<+S]*4E5544I"."\E'!40"P<%`P(!`/___O[^ M_O[^_O[^_P```/___OW]_?W]_@`!`P4&"`D*"@L+"PH)!@/]]^_GWM;-Q;VW MLJZLK*ZSO,G:[@09+#Q(4%1544M#.C`G'Q<1#0D&!`(!`/___O[^_O[^_O[^ M____`/___OW]_?W^_@`!`P4'"`D*"@H+"PH(!0+^^/'HX-?/Q[^XLJ^MKK"V MOLO<[P08*CE%35!13DE".3`H'Q@2#@H'!0,!`/_^_O[]_?W]_O[^_O__``#_ M__[^_?[^_O\!`P4'"0L,#`T,"PH(!0']]N_FW=3+P[NTKJNJJZ^VP,_A]@L? M,#Y)3U)13DA`-R\F'A@2#0H'!`(`__[]_?W]_?W]_?W^_O_______OW]_?W^ M_P`"!`8("@H+"PP+"PD'!0'\]>[EW=3+PKFRK*FHJ:RTP-#C^0\C-4-,4E13 M3D<_-BTD'181#0D'!0,!`/_^_?W]_?W]_?W^_O_______OW]_/W]_@`"`P4' M"0H+#`T-#0P*!P/^]^_FW=3+PKFRK*BFIJFQO,SA^`XC-4--4U543T@_-BTD M'!81#0D'!0,!`/_^_?W]_?W]_?W^_O[____^_?S\_/S]_O\``@0&"`H+#`T- M#0L)!@/_^O/JXMG0R+^XLJZJJ:JON,;8[@4:+3U(4%-34$E".3`G(!D3#PL) M!P0"`?_^_?W]_/S\_/S]_?[^_O_^_OW]_?W]_@`!`@0&"`H+"PP,#`P*"`0` M^_7MYMW4R\.\MK&NK:ZQN<33YOL/(C-`24]03TM$.S0L(QT7$@X+"`8$`@#^ M_?W\_/S\_/S\_/S\_?W]_?W\_/S]_P`"!`8("0L,#`P+"PL*!P0!_/;OY][6 MSL6^MK&MJZROML'0Y/D.(C-`2E!14$Q%/#4L)!X8$P\,"`8$`?_^_?S\^_O[ M^_O[_/S\_?W]_?W\_/W]_@`"!`8'"`H+#`P,#`L*!P0!_/?PZ-_6S<2[M:^K MJJJMM<#0Y?H/(S1!2U!244Q%/C4M)1\9%!`,"08#`?_^_?S[^_O[^_O[^_S\ M_/W]_/S\_/S]_@`!`P4'"0H,#`T-#0P+"08#_OCQZN'7SL6\M:^JJ*>JL;S, MX?<-(3-!2U%34DU&/S8N)B`:%!`-"@<$`?_^_/S[^_O[^_O\_/S\_?W]_/S[ M^_O\_?X``@0&"0L,#0X-#0P+"`4"__KSZ^+9T,B_N+&MJJFKL+K)W/$'&RT\ M2$Y144Y(03@O*"$;%A(."P@&`P'__OW\_/S\^_O[^_O[^_S\_/O[^_O[_?X` M`0,%!PD*#`T.#@X-#`D&`O[W\.C?ULW$N[2OJZFHJ[*^T.7[$24V0TQ24U%, M13PU+"4>&141#0H'!`'__?S[^_KZ^OKZ^OK[^_S\_/S\^_O[_/[_`0($!@@* M#`X.#0T-#`D&`_[Y\NKAV=#(P;NVL:ZMKK*\RMSQ!QLM.T9-4%!-1T`W,"@B M'!<3#PL(!0(`_OW\^_KZ^OGY^?GY^OK[^_O[^_S\_?\``@0&"`D+#`T-#0T- M"PD'`__Z\^OCVM#'OK>QK*BGJK"[RM[T"AXP/DA/4E%.2$$Y,"DB'!<3#PL' M!0'__?S[^OKZ^OKZ^OGY^?GY^?KY^?K[_/X!`P4'"0H+#`P,"PL*"0@%`O_Z M].WFW=7,Q+RWL:VKJZZVQ-;K`18I.45-45)/2D,\,RLE'QD5$0T*!@0!_OW[ M^OGY^?GY^?GY^?GZ^OKZ^OK[_/W_`0,%!PD+#0X.#0T,"PD'!`']]N[GWM7, MP[NUKZNHIZJRP-/I`!8J.TA05%113$4]-"PE'AD5$0T)!@,`_OW[^OKZ^OKZ M^OKZ^OKZ^OKZ^?GZ^_S^``($!0<("0L,#0X-#0T+"`4!_/7LY-O2R+^XL:NG MI:>LM\?<]`LA,T),4E533TA!."\H(AP7$P\+"`0"`/[\^_KY^?GY^?GY^?KZ M^_OZ^OKZ^OO]_P$#!`8("@P-#@X.#0P+"`4"_??PY][5S<2\M:^JIJ:JL\'5 M[`,9+#Q(4%1444M$/#,L)1\9%!`,"`4"__W\^_KZ^?GY^?CX^/CY^?KY^?GY M^OO\_@$#!0<("@P-#@X.#@T,"08#_OGRZN'8SL6\M*ZHI*.FK[W1Z0`7*SM( M4%154DQ%/30L)1X9%!`,"04"__W[^OGY^?GY^?GY^?KZ^_O[^_KZ^OO\_?\! M`P4("@P-#@X/#@T,"@8"_OCQZN'8S\>_N+*LJ*>HK[O,XOD0)#9$3E-44TY' M/CKAV=#'OK>PJJ6CI:Z]T>H#&BX_2E)655)+1#LS*R0>&!00#0D% M`O_]^_KY^?GY^?GY^?GZ^OO[^_KZ^OK\_?\``@0%!PD*"PP-#@X.#0H'!/_Y M\NOAV,_%O+2MJ*2CIJZ\T.@`%RL\25%555),13TT+"4?&100#`D%`O_]_/KZ M^?GY^OKY^?GY^OKZ^OGY^?K[_/X``@0%!PD+#`T-#@X.#0H'!0#Z\^SBV=#' MOK>OJJ:DIZZ[SN3\$RWDV]+)P+BQJZ:C MI*JUQ]SS#"(T0TY3551/2$`W+R?FYN@K<':]`XE.4A26%E644I!."\G(1L5$0T)!0+_ M_?OY^/CX^?GZ^OO[^_O[^_OZ^?CX^?K\_@`"!`8)"PT.#@X-#0P+"08"_?CQ MZ.#7SL6^MJ^GHJ&CK+S2[`4=,4%-5%=644I#.C$I(AP7$P\+"`0!__W[^OKZ M^OKZ^OKZ^OO[^_OZ^?CX^?K[_?\!`P4'"0L,#0X/#P\.#`D%`/OT[./:TLG` MN+"GH9^@I[;+Y/\8+C],5%A75$U%/#,J(QP7$P\+"`4!__W[^OGY^OKZ^OKZ M^OO[^_OZ^?GY^?K[_?\!`P4("@L-#@\0$!`/#0H&`?SU[>3;TLB_MZZEGIN; MHK''X?T6+4!-55E954]'/C4L)!X8$P\,"`0"__W[^OGY^?GZ^OK[^_O[^_O[ M^OGX^/GZ_/X``@4'"@P-#Q`1$1`/#0D%`?OT[>3;TLG`MZ^HHIZ=I+''X?L6 M+#Y,5%E954Y'/C4L)!X8%!`,"`4"__W[^OGY^?GZ^OK[^_O\_/S[^OGY^?GZ M_/X``@0'"@P-#@\/#P\-#`D&`OWV[N;NI9Z9F)^O MR.0!'#)$45E<6U9.13PR*2(;%A(."@8$`/[\^OGY^?KZ^_O\_/S\_?W\^_KZ M^?GY^OO]``($!PH,#@\0$!`/#@P*!P+]]NWEW-/*P;FQIYZ7E)FIP=[\&#!# M4EI=7%=01STT*R,<%Q,/"P@$`?[\^OGX^/GY^OO[_/S\_?W]_/OZ^?GY^OS^ M``($!@@*#`T.#P\/#PT+"`3_^/#GW=3+PKFPIYZ7E9JHO]OY%2U`3UA<7%A1 M2#XT*R,=%Q,/#`@%`O_]^_KY^?GZ^OO[^_S\_/S\_/OZ^?GY^OS^``($!PH, M#@\/#P\/#PX,"04`^?'HWM7+PKFOI9R4D9:DO-GW%"U!4%I>7EI32D`V+24> M&!,/"P@$`?[\^OGX^/GY^OO[_/S\_/S\_/OZ^?CX^?O]``($!PH,#@\0$1(2 M$0\-"04`^?#HWM7,P[JPIIR4D).@M]3S$2M`3UE>7EI32D`V+24>&!,/#`@% M`O_\^OGX^/GZ^_O\_/S\_/S\_/OY^/CX^?O]_@`#!@D,#Q$2$Q,2$A`-"@8` M^?'GW=/)P+:LHI>0C9.CO-KY%B]#4EI>75E22#XT*R,<%Q(."P<%`?_]^_GY M^?GZ^_S\_?W]_?W]_?SZ^?CX^/K[_0`"!`<+#0\0$1$2$0\-"@8`^?'HW];, MP[JPIIR4CY*?MM/S$2H_4%I?7UM42D`W+B4>&!,/#`D%`O_]^_KY^?GZ^OO[ M_/S\_/S\_/OZ^/CX^?K\_0`"!0@+#0\0$1(3$Q$/#`@"_/7LX]K0Q[ZUK**9 MD9"9J\;E!"`W255<7EQ63D0Z,2DA&Q82#@H'`P#]^_KY^?GY^OO\_/S]_?W] M_/SZ^?CW^/G[_0`#!0@,#@\0$1(2$A$."P<#_/7LX]K2R<&XKZ67U1D9NNRND'(SE*5EQ= M6U5-1#HQ*"(<%Q,/"P<$`?[\^OGX^/GY^OO[^_O[^_S[^_KY^/CY^OS^``,& M"`L.$!$1$A(2$0\,"03]]N_FW-/)P+>LH)6-BY2IQ>0#'S9)5EQ>7%9/1CPS M*B,=%Q,/"P@$`/[[^?CX^/GZ^_O\_/S\_/S\^_KX]_?X^?K\_@`#!@H.$!$2 M$Q,3$0\-"@8`^?#HW]7,P[FOI)B/BY"AN]KZ%S%$4UM>75A11SXU+"0>&!00 M#`@%`?_\^OGX^/GY^OO[_/S\_/S\_/KY^/CX^OO]_P$#!@@*#0\0$1$1$0\- M"@8"^_3LX]K1R+^UJY^5CY";LL_N#"8[3%9;7%E22D$X+R<@&A82#@H&`O_\ M^OGX]_CY^OO[^_O[^_O\^_KY^/CX^/G[_@`#!@@+#0\1$A,3$Q$."P<"_/7M MY-O2R<"VK**8D9":KLGH!R(X251;7%I43$,Z,2@B'!82#@L'`P#]^_GX^/CY M^OO[^_O[^_O[^_KY^/CX^?O]_P$#!@@+#A`1$A,3$A$/#`@$_?;MY-O1R+ZT MJ9V2BXN6K,GI"20[3%A>7UQ53D0[,BHB'!82#@H&`__]^_GW]_CX^?K[_/S\ M_/S\_/OY^/?W^/K\_@`"!0<)#`\1$A04$A$/"P@#_O?OYMW3R;^UJIZ3BXN5 MJL?G!R(Y2U==7EM6340Z,2DB'!<2#@H'`P'^^_GX^/CY^OO\_/S\_/S\^_KY M^/?W]_G[_?\!`P8("PX0$A04%!02#PL&`?KQZ-[4R\&VJIV1AX6/I,+D!"$Y M2U=>7UQ63T4[,BHB'!<2#@L'!`'^^_GX^/CY^OO\_?W]_?S\^_OY^/?W]_CZ M_/X``P8)#0\1$Q04%!,1#@H%`/GRZ>#7S<2ZL*.7C(>-G[G:^A@R151<7UY8 M44<^-"LC'1<3#PL(!0+__/KY^/CX^?K[_/S\_/S\_/OZ^??W]_CY^_W_`@4( M#`\1$Q04%!01#@H&`?KRZN'8S\:]LZF=DHR.F[/1\1`J/T]975U:4TI`-RXF M'QD5$0T)!@/__?OY^/CY^?K[^_S\_/S[^_OZ^??W]_?Y^_W_`@4(#`X0$A05 M%102#PL'`OWV[>3;T\K"N;"DF9&/EJG$Y`0?-DE56UU;5$U$.C$H(1L6$@X* M!P0!_OOY^/CX^?KZ^_S\_/S\_/O[^OGX^/GZ_/X``@0&"@T/$1,4%103$0T) M!/[W[^?>USCVM'(OK6JGI.,C)>LR>D((SI+ M5EQ=6E1,0SDP*"(<%A(."P<$`?W[^?CX^/GZ^_O\_/S\_/O[^OCW]_?X^?O^ M`0,&"0P/$1(3%!03$0\,"03_^/#HW];-Q+FMH)2*B)&DP>(#(#=*5EU?7%5. M13LR*2(<%Q(."P<$`?W[^??W]_CY^OO\_/W\_/S\^_GX^/CX^?O]``($!PD, M#Q$3%!44$Q$."03_^._GWM3+PKFNHI6,B9&DP.`!'C9)55Q?7%9/13PS*B,= M%Q,/"P@%`O[\^OCX^/CY^OO\_/S\_/S[^OCW]O;W^/K\_@$%"`L/$1(4%144 M$Q$."@4`^O/JX=C/QKRQI9F.B(R=M];W%B]#45M>75A12#XU+"4=&!00#`D% M`P#]^OCX^/CY^OO\_/S\_/S\^_KX]_?X^?K\_@`"!`<*#1`2$Q04%!(/#`@# M_/7LXMG0QKRRIYN1C(Z;L]'Q$"H_3EA=75E224`W+B8?&100#`D%`__]^_GX M^/CY^OO\_/S\_/S\^_KY^/?W]_G[_?\"!0@,$!,6%Q<6%1,0#`7EI32T$X+R<@&A41#0D&`O_\^OGX]_CY^OO\ M_?W]_?S\^_KY]_?W^/GZ_/X!!`<+#Q(3%186%1,0#0D#_?;MY-O1R+^UJY^4 MC8V7K,CH!R,Y2E9;7%I32T,Y,"DA&Q82#@H'!`'^_/KY^/CY^OO\_?W]_?S\ M^_KY^/?W^/G[_/\"!0@,#A`1$A,3$A$/#0H%__CQZ-_6S,.YK:&4BXB1IDHJ*E:S+[`PH/4Y875Y:5$M"."\H(!H5$0T)!@(` M_?KX]_?X^?K[_/S\_/S\_/OZ^?CW]_CZ^_T``@4("PX1$Q05%102$`P(`_WV M[N77C?U65!'/3,J(QP7$P\,"04"__SZ^/?W^/GZ^_S]_?[^_?W[^OGW]_?X M^OO]_P(%"0L-#Q$2$Q03$A`,"`/\\^OBV,W$NK"DF(V(C)RVUO@7,$547%]> M65%(/C4L)!X8$P\+"`0!_OSZ^/?W^/GZ_/W^_O[^_?W[^OCW]_?X^OO]``(% M"0P/$1,5%144$Q`,!P+[\^K@U\W$NK"CE8J%B9JVU_D9,T=67F%?65)(/S4L M)1X8$P\+"`0!_OSZ^/?X^/G[_/W^_O[^_OW\^OCW]_?X^?O]``,%"`P.$!$3 M%!03$@\,"`/\\^OAV,[$N:Z@D86`AIJXW/\?.4Q98&)?65%'/30K(QT7$@X* M!@0!_?OY^/?X^/K[_?[______OW\^OCW]?7V^/K]``,&"0P/$1(3$Q,3$0X+ M!@'[\^KAV,_&O;*FF8V'BIBRT_45,$5476!?6E)(/C0K)!P7$P\+"`4"`/W[ M^?CX^?K[_/W^_O___OW\^OGW]_?W^?K\_@$$!PH-#Q$2$Q,3$@\,"03]]NWD MW-/*P;>KG8^%A9"HR.P.*D%276)A7%1+03,%(SM.6F!@759. M0SDP*"`:%1$-"@<$`?[\^OCW]_CZ^_S^______[]_/KX]_?W^/GZ_0`"!0D, M$!(3%!04$Q(/"P8`^?#FW=3+PKFNHI2*AHV@O-X`'SE,66!A7EA/13LQ*"$; M%A(."P@$`?[\^?CW]_CY^_W^_O____[]^_KX]_?W^/K\_@`#!@@+#A`1$Q04 M$Q$."@8`^?+HW]?.Q;VSIIJ/BHV=M]?Y&#)&5%Q?75A01STT*R,=%Q,/"P@% M`O_\^OGX^/CY^OS]_O[^_O[\^_KY^/?W^/K\_@`#!0@+#0\1$A(3$Q(/#`@" M_/3LX]K1R+^TJ)J.AXF7L='S%"]$4UQ@7UI324`V+24?&100#`D%`O_\^OCW M]_CY^OS]_?[^_OW\^_GX]_;V^/G[_@$$!PH-$!(3$Q03$A`-"@8!^O/KXMG0 MQ[VSIYR1BXV;L]/U%"Y#4EM>75E123\V+24>&!,/#`D%`@#\^OGW]_CY^OS] M_O[^_O[]_/KY^/?W^?K\_@`#!@D-#Q$3%!03$Q$."@8`^?+IX-?/QKVSIYJ/ MB8R:LM+T$RY#4UU@7UM32D`W+B4?&100#`@&`__]^_GX^/CY^OS]_O[__O[\ M^_GX]_;W^/G\_@`#!0@+#A`2$A,3$A$."P@"_/7MY-O2R<"WK*"5C8R6JL?H M""4\35A>7EM53$(Y," M7UQ6340Z,2DA&Q81#0H'!`'^_/KY^/CY^OO\_?[^_O[]_/OY^/?W]_CZ_/\" M!`<*#0\1$Q04%!,1#@H%_O?OYMS2R+ZSIYJ-@X*-I<7J#"E!4EUB8EY73D4Z M,2@A&Q41#0D%`O_\^?CW]_?X^OS]_O_____^_/OY]_;V]_CZ_/X!!`<+#A$3 M%!44$Q(/#`@#_?7MY-K1R+^UJYZ2BHJ4J:CXF- MG;C9^A@Q15)97%I4340Z,2DA&Q82#@L(!0+__/KY^/CY^OO\_?[____^_?OY M^/CX^/CY^_W_`00(#`\0$1,4$Q,1#PL'`OOT[.+9T,B_M:B:CXN0H;S<_1LS M1E)96UE42T(Y,"@@&A00#`D&`P#^_/KY^/GY^OS]_O_____^_?OZ^/?W]_CY M^_W_`@0'"PX0$A,3$Q(0#@L&`?SU[>3,D!)34U*13XW+B[HX=K4S<2[LJJGK+G. MYP`6*#8_1$9$0#DS+"4?&100#0H(!0,!__W[^OGZ^OO\_?[______OW\^OKY M^?GZ^_S^``($!@D+#`T-#0T-#`H(!0'\]_'KY-[8T&141#0H(!@,!__W[^OKZ^OO\_?[^_____OW\^_KZ^?KZ^_S] M_P$#!0@+#0X/#PX-#`H'!`'\]_+KY-[7T/=U]#'O[>TMK_/X_@,'2HS.#HY-S(M)R`;%A(.#`D'!0," M`/[]_/O[^_S\_?[^_____OW]_/OZ^OK[_/W^``(#!0<)"@H+"PL+"@D'!`'^ M^O7OZN7@V]7.Q;ZZN;_,W_,'&"4O-3@X-3$L)B$;%Q,/#`H(!@0"`/_]_/O[ M^_O\_?[^_____O[]_/O[^OKZ^_S]_P$"!`8'"0H+#`P,"PD'!0+_^_;Q[.?A MW-;/Q[^ZNL#.X/0'%R0M,S4U,R\J)!\:%A(."PD'!0,!__[\^_O[^_O\_?[^ M_____O[]_/OZ^OKZ^_S]_P`"`P4("@L,#`P+"PD'!0+_^_?R[>GDW]K3S,7` MOL/.W_$#$A\H+C$R,"TH(QX9%1$-"PD'!00"`/_^_?S[^_S\_?[^_O[^_O[] M_/S[^_K[^_S]_@`!`P4'"`D+"PL+"PH(!@,`_?GT[^KEX-S7T,K%P\?0W>W^ M#1HD*BXO+BLH(QX:%A(/#`D'!0,"`/_^_?S\_/S]_?[^_____O[]_?S[^_O[ M_/W^_P`!`@,%!P@)"@H*"0@'!@0!_OKV\N[IY>'7@V];2S\_4W>GV!`\8'R,F)B0B'QL7%!`-"PD' M!@0#`0#__OW\_/S]_?[^_O[___[^_OW\_/S\_/W]_O\``0($!08&!P<("`<& M!00"`/WZ]_/P[.CDX-O7U-/6W>?S``L4&Q\B(R(@'1H6$Q`-"PD'!@0#`@'_ M_OW]_/S]_?W^_O[^_O[^_OW]_/S\_/W]_O\``0(#!08'!P@("`<&!0,"`/[[ M^/7R[NOHY.#7P_`<0%AL?("`>'!D6$P\-"PD'!@0#`@$`__[]_?W] M_?W^_O[^_O[^_OW]_?W\_?W]_O\```$"!`4&!P<'!P<&!00"`?_\^?;S\.SJ MY^/?W-K:WN;P^@0-$Q@<'1T<&A@5$@\-"PD'!@0#`@$`__[^_?W]_?[^_O[^ M_O[^_O[]_?W]_?W]_O__``$"`P0%!@8&!@8&!0,"`?_]^_CU\_#MZN?DX=_? MX>;M]O\(#A08&1H:&!84$0\,"@@'!@0#`@$``/_^_OW]_?[^_O[^_O[^_OW] M_?W]_?W^_O__``$"`P0%!08&!@8%!00#`0#^_/KW]/+O[.GFXN#@X>;N]O\' M#1(6%Q@8%A02$`X,"@@'!00#`@$`___^_OW]_?[^_O[____^_O[^_?W]_?W] M_O[_``$"`@,$!04%!04$!`,"`?_^_/KX]O3Q[^WIY^7DY>GO]OX$"@\2%!45 M%!(1#PP+"0<&!00#`@$``/_^_O[^_O[^_O[______O[^_OW]_?[^_O[_```! M`@,#!`0$!`0$!`,"`0#__OSZ^/;S\>_LZ>?FY^KO]OT#"0T0$A,3$A$/#0L* M"`<%!`,"`0$`___^_O[^_O[^__________[^_O[^_O[^_O[__P`!`0(#`P,$ M!`0$`P,"`0'__OW[^??V]/+O[>OIZ>SP]OP"!PL.#Q`0$`X-"PH(!P8$!`," M`0$``/___O[^_O[____________^_O[^_O[^_O___P```0("`P,#`P,#`P(" M`0#__OW\^OGW]O3S\>_M[>_R]OL`!`@+#`T.#0P+"@@'!@4$`P("`0$``/__ M__[^_O[______________O[^_O[^_O___P```0$"`@("`@("`@(!`0#___[\ M^_KY^/?U]/+Q\?+T]_O_`P8("@L+"PH)"`<&!00#`@(!`0$``/__________ M_________________________P````$!`0$!`@("`0$!`0``__[]_?S[^OGX M]_;U]/7V^/O_`00&!P@("`@'!@4%!`,"`@$!`0````#_________________ M__________________\````!`0$!`0$!`0$!````___^_OW\_/OZ^OGX^/CY M^OS^``($!04%!04%!`0#`@("`0$!``````#_________________________ M__________\``````````0$`````````_____O[^_?W]_/S[^_O[_/W_``$" M`@,#`P,"`@(!`0$!``````````#_________________________________ M__\`````````````````````______________[^_O[^____```````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M``````````````````````````````````````````````````!#3TU-```` M$@`!```W%@`(0`VL1````````$U!4DL````"``!)3E-4````%#P``'\`?P`` M````````````````05!03````:A39#)A``(```````````!%]```!``*`*`` M`'E%]````@`*J8$``'D(Q2LCU@`````@5@`BW@!$]`````%$!P`%]"(`__\% M]"4``_]F]!,`#`!(`0`&`(0``(Q(7@!G]```#``%]"<``_\*J:,``+,*J80` M`)$*J"0,`*4-`2(*J80``+-A]```!`!']```#@`-`+4BK@`@`'0.D)X-`3X* MJ80``+,-`2(*J80``+-A]```!`!']```#@`-`+4BK@`@`'0.$*P-`3X*J:0` M`)<*J`0```0*`*```.9"@0!(@@!$]"`___]$@T9(`49$]````"!$]$```_\A MT@!6@0`&WR!'!B-$]$8`#`!%@T`$"```````"0`C`````````````````'@` M```$``0```````#\`/___X`````!`0`&455N:71S```````````````````` M`````````````````````0(`!B!S86UP````%9N(&EN=&4@9&5L87,@9IIR````'@```!6`'&XO!RF````'`!6``!7 M```````#__\````\```````$ M__\```!:```````````````````````````````````````````````````` /```````````````````` ` end slashem-0.0.7E7F3/sys/share/sounds/README0000664000076400007640000000261210545462317015770 0ustar alialiREADME for the AIFF files: These files are sound files for the instruments in NetHack. There are 11 sounds, one for each distinct instrument. The sounds are in 8-bit 22kHz AIFF format, which should be readable by a broad range of platforms. Since the sounds came from Rolands S-750 sample library (most of them) there should be no copyright on them when we treat them like we do here (as instruments) - indeed, the sample library I got from Roland didn't even bear a (c) symbol. Some of the sounds are very adequate (Drum of Earthquake, Wooden Flute, Magic Harp) while some are less true to the original name (how does a Frost Horn sound?) Actually, I don't know what a Bugle is (Bugle horn?) so I took a trumpet sound for that. Correct me if I'm wrong. What does this have to do with the main code? Well, nothing so far. There are some places that are #ifdef MAC and calls mac_speaker; that function takes an object and a tune (in capital letters A-G) and plays the tune with the given instrument. When playing a specific tune, that tune is of course used. For "improvise," I use middle "C." Ideally, we should do something equal with sound that we have with displays, so we can use one common set of calls in the main code, and have ports do whatever seems appropriate for the available hardware. Any comment on the sounds or their use is welcome: Jon W{tte Mac Team nethack-bugs@nethack.org slashem-0.0.7E7F3/sys/share/sounds/firehorn.uu0000664000076400007640000004370210545462317017304 0ustar alialibegin 644 Fire_Horn M``E&:7)E($AO[R]/+T]P0*^_O__@#X]/X0'QX3`^WL]^SD[OH" M`/3LY^7JY.P/("OQ[>CH[_#P`Q,1"``%!_[]].ST_P'Z\>[N[_8` M_PT:`?;^]?C_]OP.(2\H%PH2("`J,BLT,!DA,!X+"`<1(1\#X=74V.?S_0@& M_N[0N[B]S=[O`Q06_>3G\@@?)SA$/28,_O'Q`0\<+S,D$?7:U.?MZO\3$@3R MXS<6X ML;G4`!D7#@#\`@H>-DI985D_'0\0#`P5*3HY,1CV[_'GX>[T^`'YY]+`OKB] MX/L$_N73S\K0W^WY!1`4#P/NW=KI^OX!`.;-R\S/V.'BY_;HR;FSLK"[W/+Z M^>GG[.3D\0`'#!($\NOCZO@%&BHH'A,-!?OV]?8!&B(/]>;>W-W6U^SX[-O3 MU=K@Z?<1*B\;`_?U``T*#R`H(Q+][N3CY^O_%!L9!N[AY_7V_Q8?'QT2!@#^ M`0PA+R\@`_/]"A0<+$%!.S,<#@?^_`D?+"PI%O;EYN_["Q,(^_#CW-S?Y?L> M+B\U)@L"`@0'$RKK\?<$$0_^ MXM'0UN?^$AXD(1D-`?;U`1$N3$XX&?KEX_D0'2D@"?GCRL#*VN\/)1X-^N;< MWNCT_@@*`_OOX-'*T^X+'!X3_]_'Q,G7[P0-$0W[[.[MWN0!#PX/`^OJ^0(0 M'B@Q.#8@!_GP[/H7)B8E&@;Z]?3R[>[T`0;OX.3CW.7]"R`\*04#`OCW]^_J M\.W9SM+-RN(#"@+WX=_T^N_H[?'S"!0!\O/T\?/_!?[SX]KG^?W\`@4'!?GS M_00$"!HL,"@7#10I,QX,$A43&B`>%@W_^0XG*1T0"Q`=*28>*C0E%@KXZ^/5 MS=SN[>+:UMKP`OOZ"@X'!PH-$`P.&"U`-R4?%PL(#A`6*"\C&Q8%\>#,Q=KJ MX]KCZ>+O`OK]#`P*$QL2_>[=U.D'(CHW&?OV_?KX_@`""PKZ[N?;U-KBY>CK MY.+R]^OI[_/]#0GNX^WV]_+R^`()_>[S_/P"#!(:(!<)_O;O[_7X]O+JV-T,W)!,(!0T?,3(D$O_V\^KL^P<2'2(<"_KM MZP`G.S`B&`?^``8,&2\Z/#TQ%OKHY?`&'B,7`O/IXM_A\`03&18/`_7KZ?@5 M*3(S)10(`0@8'R$I-#SW_0H-`//GXN3H\@$,$0X"[N7D[`89&A@1 M"`(#"!$D+B8C)!\8$@L%#!89$@'NW=?@[OL&#`?[\^;3S\_.V>OW\^+5UM[A MY>[_$Q,$]=S&R]74W.[X^^_5Q,'(V^SS^P$#__;OYN#:W_X9&0+IUL_H_/?[ M`P+X[O/VZ^3AX_'Y[]?$P\;,T]C?Z>WFW=G=Y>KP\_7WZM#&U.L#%!<0#`C\ M\_'NY^GX`/WWZ-3*TN#L^0'Z[.+AY_,#!@@3'!H.`/7MZ_`$'BHE'1P<'",L M)RDW,A\+^.;@ZO+W#2(:"0/__0,,$!4F,B8/_>OB\?T&&B8:`?7PZ.;H\0H@ M)"`9$/[EV.,`(B8/!0T-_P$.&C9(-RPN)QT+\_,-)"DI+S@X*!X>)34X*2`C M)B(6#17M`1HE%?ST^_?R_P@1'1<'^OS]]OD"#AD0[<.OKK;+X?'Z_??FVL_#T>P! M%A\?&/O8LJ;']1$7#P7_^-[&T_0-%!43^,^VL;W9_A<>(B09!?/T!QXY2$8[ M*`7>V@4O.3@W)Q("Z]O;Z`(?,SP['_'2T.L+&1PA*RD.[^X%'#%"2DM(+P#> MX?L7+3@T*!D(^/@$"!0L+AD!X<:[P]OO_08&!/;?VN?Z"QLP03H@"/KY$#!) M54X[&/3K^0X;%@X2&0C@O**IOLS@[.WHT+JRN]3D[0$8'`GVY,K$U.H'(281 M\NKW!`T0$!DE'P3JV<_+TND!#@T`]?'W^_3Q\@$0#@@&"Q,1#B)-8$(3]/8. M%PX%_P8+`>_H]OGJZ^[JZN_OZ?+]_/X#_.OM^.WM_?GM]0L."Q@.!",[.3$G M'A81"OOU^?OS\??LV=7D`A03#P@!_?G]`@<1("HD'!\@(B4?'RDV.BX:`.SQ M_?;O^P@![-O+O,/;]`0&`_3>U=/=\/O]_/+ODXM7$ MR^4"&Q7^\>KEW^+^'"$6"_KKZ>CDX_(/'QT8"?3O\O@&#PL(!_CGX.'HY^CT M`0?[XLG"UNX&'"$;"_'8R,3+U.3Y%2\R&P8'%2(N,R@<&A,#]O7X]?L,%QP- MZM7:[?7T`Q44"P$"$Q;]V/R!A4&Z>L$ M&A8(&#([+AD8'AL1_?4+)3`H&!TT.S`B&!L:__,"#PW_\O4&$`P$^?H&"Q(< M(RH@"@D9'!$$^?<##PH"`0,&!`$#"Q4._OK]_??JZ/8!!/OU\.'B[_H,%!,+ M^_'MXM''S>'X!PT%[-G>[_OX\/#FV]O/Q='=X>+=YOCNU,G(U>S\`0,#^NWN M]O7O[_7\"A#^Y]G6Y/+T]0(-!0+_ZNX)$1$;)B@@&1<>)B??W-KD_08'#0?\]?3NW^#V#A82#@D- M$0\6&A4)^O3HW^;EZ?@(#O[IX-?7V^H*'1@*!`0$#1,2'2XS*2$8"/?GX_$* M&`#DW=GGD[.WG]/GM]?CEV^'?V^X!]N7BYN/F^`0'!0`!"`P+"`/Z!!TC&`/LY-[7 MW^;@Y.O@U-7,P\S0R=#G[^7>WM;0W.39VN\`$1L7$@X)"QTM)QL:$/_[_OGQ M]P82&A\6`/7NY_0%!/___?GY]_H"^_P-%1@9$P#GY@(5#@XC)Q\>#O?^$QHD M.#XS)!$""!X@#`@6'QT2^-O;?Y_,,)BL@'R(?)"XH'!TC%@,#`O+M_`8+%!<'\O(! M"Q0<$P+X[-_C[-W)T>?Y"A<0__X&"APN)`X!]NGJY]#/ZOT#_??Y]O'W_PL; M&@/MXN/]%/_DZ_C[^?;S]?TF)Q8,"A$;$_SS_@X1#0D,#@<4,3(?$0+N MZ?D&!?SU^000%Q`-"`85(AX8&0??U>/FY.'K\\=W*N;J^L:_.[?H+$O[O[=S`Q^X'_^;9 MX.WZ].H`)"TA#O7Q_O/7U_L9#.[I[.OJV'-W@LG%?7JY^3A MX.+P!A(:'1``^.WI_A<6_//^`?;Q]/4#%QTJ0#\A!O7P`A<;"OX.&0T1(R@G M*2XU,"$-_?S\^__TW>#Y!P@.%0'Q_PH9+2,.#0[]\@@6!O\+$!8G+1X?+#$\ M.B47%A4)!104^_+\]_4'!_#J_PP1'!H*_.W;T]OEW-;D[?+\`O\&&B`6$`;P MVOJUM+G\^KCW,_1Z/7_%R(-\N+=]1@4^_H/$P#U]_T/)C0Q+"X;_/3S M`!D9!_\'#`3X[>7E^`T-$1X4^_'Y`@3_^/D($1$-"0D'$"HP%O?DVM'/U=KG MZ>;IV]7H[]_<^A(2$P_\\O+Q]?\&_O7\].;N^OD#'"@J*!/X[?+W^/CTY^?U M[=G=V\7(X^SN!AH&[N??W^#8U>'[#!,7%14;("(O1$(I&A$&`O7@Y/X4(RDA M#O;BW-_L"1T6#Q01`-_)S=CB[?H$_>34U>#V"@X'%"$0]MW#M\7?\PL>%/GB MW./C]A$+$"$5^^7=Y>_X"!XW/2D0!`D;*"$5$PS^]NO@Y.WZ#!@8#@<$^_?X M`A,.^>_T_OSV]_X-%A$1'"DN+2/7UMK:\@P%]OCX\_GZ^0((#@O_!/G? MW./L`Q+^ZP`+``85'24V.A\4'A0`^?3S"B`1`Q(;%Q,2$!,6"@86$/'!-G-U-++T^\+ M(RD7#A,6$`,%'#=#,Q/WZ=S"MJM3Z"Q8? M*C(>_N[W$2,H(AD0\'T!081)2(+\-/$TNOP\!4W*A86"P`(`OX;(_S;TL_<]`$!"B@O%!0M+RC6R]/CZO\9%AG8TN'W!@D!`B(^+A\B(!4`X-#P M$0;U]P0(^.[S_`\@'QPG)PCHT];Z"0('"Q,:$@7_"!PF*RP>#0#PW=WU^N_O M]P4&_/C]_P`'#Q@H*!/][N?BZ?\*"Q,2!P8+!P87*BL=%`X#\]K.S/>W.SZ_/+EXM_1NJRSP=+FZ>S^!_?K]`,:,"8."Q((\NSZ!P@"]>CI[>;> MW_$,"OT!`O74N+2]SMG4W>KNZMO<]`XC*27R`1LV M-"<@&`OZ^0L9'2,G*B<@&1,3&2$P/#8@#0'Y_@L3$@L)"?WOZN[Z!@4)%0W[ M`0H&!P\0$187#P@&`@03'RTZ-R84#PX,#`8#"`+NWM_HZ^WT`!0>$//@XM_7 MWNKX!@3Z_`@0"_T!%2(C&PP)$0P!`@@.$@?LX.GJW=OG\@`&]NW_"_?E[O?T M\?'P^Q,;$0\1&20?%A,>(1`.'1T3!_?U`@D&!PT0"P$$!O;^&!86)B(1`?3R M]OL'%!\:`//U[N\"$`X8)P[MZN+:Z/3X^_OOW-38V];A_0@)!>_AYM_7Y/L* M$0P`_0,(`?D/*R@@%//:ULBYS_7\]N[6Q\G/R\?6YN;@TL;-U=;>`!P7#PL' M$!$&`0TN2$(G%`K^\.#D!!P2]^3@W=?8W>X/$^[4S,&^OL'WR`0H0#PP+`??[^/<4,283$PL+&1@A+RCR`Q,;&!,1#@T-"0H0 M`/,##?GL[_8""`0+%@KY^_WNY.GLW=7K^.GL^O\.%@P0&1()`P()$AD9#`P> M'`3]!Q@H(Q4>*A7\^OT!`._>U=;F\.?A[@#^]@4;&PC]_@01"OC\_?D%`N_M M]O3GY_T2%0S\\P$$W\G8X^?N[.?N_O_N[0HF)A(!!`KNQ\+*TN'HXN/NZM?) MT.O[].KI[^O/M+?(T=OG\OW]\>GA[!,G&Q,7&A+YY_'Z\?8%#141`O+G]`\8 M%1<3!?3K9W.?K`1LA(B(/_OGOZ_L"_0PE)`OW^@(%$2(J.4$C M$!,#]?O\`2`R'0/\`@8#%CQ485(D#0P"_PCG MYN7CY.GN^/;K_A48(B`/%1@(!0G_\.KKZ^_W^O3V"`G\`@<``0$%#?O@U]K= MX^GK[O/[#1H8("`,"0@#"@7Y]_3T]O/V!Q<<'Q\8'1\5%1(4$O3F\?3U^?+R M`0;\!!HF-#DE%`X']^7CX^'?UL_;[N;;[0`(&R4>(B47`.3:U\_7Z/0!_.7@ M]Q(>*2XH)!7YX,_0U,_/T]WNZM/-VN7H[/;U[.GHWL_.S\G,W.ORZ^'E\@08 M)S4],!8'^^GL_``$"0+QX=K?[/H$"`S^V\;/VMOCY-G:X-S;V-/?]A`F.D'EYNS["1\R+2XI$/[S\/H(#/?;T]SK\_@)'#5'04=$(PX.#Q`9 M$_';V-WH\?G^!10._P8&]?#S\?/^\-+&P\[E]``+#Q47'C4X*2(@(2(<"_;I MXN?U_@8/"P'S\@(#^_T"`P,'!/#CVN'X`@@%]_P$#"`D&!04#0+]]>OJ\@DD M,2\8!0P-#Q\9#!(4`NKHZN+CY>T%$@KW[OL(J(B4@`^_QZMG6V-WT"`#N MZO7W`B$J(2(6^^?9R,+/UN8$"OOT]@`'%RPQ+R8/^.[JVK]^>'.RLO( MUO#_`?CLY=O-O+[8ZO<*"??M[?<#%"\W*R$6"O_RY^3M^0(-#__NYN/@Z/S_ M^/7O[.?@U,O4XNX!`^[DY>CU#1X:#PG__/SJV-_K[?\<(143$A0A)RLN*2,< M%0T`]>_J\`$:(0X(#ADL,#`T*1X?(!\.^.WJ\`0:&@T-$1,8$QDF&0<'"@?Z MY]7.X/\=)QX=)BPK*38^+!4/%1D0]=?2Y/@+#_[W^O'G[/?_]NOR^_?CR+W% MT.4&%A8=&@8$%B@H%@H0&Q<`ZM[F]P,3'QP4_NKN_`D+`O\-&PSNV];;Y_83 M)2$7`N_U#1\B&!0:%@;NX_,`!!,I+"`9">_T"!$4"P+_].32P\K?Z_H:*AH- M`_+^'C$[.B@9"O7?S=#D]`<<%/WZ[=KL"A8C)`KRY]S'N<+8\0\@%@L4$@82 M)R\V+0OR[>38V>+N_`'\\>?@T<35]0@0`N37U,:ZO\_D^P/W[O<'"`,3+3,H M%/WV_/GL\0@9(A@"^?KTY>+W#Q(']-S/T,S&UN_OZ>OEW^7O\OL:)Q4)_N?? MWMC?\@8,"`7U\0$,#A@L+A@1">[FY-_G^PL,$10*"A$4'S9-33TT*!,'`/L" M"P@%#A$&`@8-%2$M*AL:&@?Z\NOKZNOP``D%#!4:*CI&13,I(A4/"P8#!0@* M$`L!!P@&!/\)$0#U\^?;U]#"P='>Z>OI^@L*"A`A*1H)_/@``/CV_`8)"P;^ M!PT"^?T*"?[[]_CYZMO8W^GN\.OP!PP"`Q$C*B0:$0P$_/H`!P4&!P`&%Q$# M!A]P@(#1PE)1\6$@GV[/#^%"7F^Q&147'2`>$P/_"A@6!_SU_0H!_`<'^>GBYNGCTKZ]U>OKY./L M!!<3#Q88$`3Z`Q,2`O/R!1D;!_?V_@'TZ_8"!@+]!`X$Z]O:Y//W\._S]_KY M_@@-$A`3)BL5__CY``D0#@P.#`D$_P(*#@P'!P+PW-+8Z?D$!PD)"`T-"A,; M(RDD'!0,`/?^"Q8B(QP1"0?_^/X)&R06`_WWY]G@[O<"!__[!`H#_@<3(RTE M&!(-_?']#1`,`??Y^O+CVN+L\?'DUMC4Q'J]?OX]@42$`;]^OKU M\_D,'AT._??\^_SZ]0`'^O'R[>'8T=_[`_/?U-3:WNCU^@$$^O/U]_3O[P,9 M'!4)_OK]`@X6$!`2"`0'!OKN\?P'#0D!^?/V_@\A'148&AH8%A,.#A(7&1P@ M&`T'"!H@!_D!`?GX^/7V]_;[!0H+!_OV`A(2`/L#`@0-$AHA%P<'%1P?'0\' M"@T`[.KP[.7CZ//WY=GA[??^`/O[!PO_\_H`]^_S^P,)`OCZ!1$9'!4*`/GS M[O7_\^3H[>WLY./O_`0#`/CIX^7HZ_X4$04("`$`_OK]"QD@*B<.^?3R]@PA M%/_]^.OGYN+K`1$9(!D#]O?X^Q(N*Q@0"08,"0<-%B,R.#`="?SS\@4@&O[Q MY^#DZ.WZ#Q\@(!@(_O/O^!$K(0+W]?;]_OT)&!H4$Q$'^>36W/H2`M_/S,S/ MS];L_?[W^/OV[N+9Z@D6`N?AXN;M[/()&!0+#A`*`?'J]@H3`.+3T=/5U.+] M`OCR[^WIX-33Z`0-_NGBXM_D\/T0&QD0"PX,`OCX!1(;$_OP[NOM[_8*&AD1 M$1(/#`@(#ATN)@\)"P@'!081'2,A&AH9$`8$"0X/`_'L[_'T\O0%%1<1$142 M#/_X_P8,!O3P``H&_O\*#@\.#0\1"?GX`?[X[=[?[O3JXN;N^`'__08(]^_] M"07\\>7K``;\^`$*"Q`6%181_O4%$P?WZM?7Y^SI[?3Z_@,+"P?^\?0/)R(2 M!_GQ]OK]`@,$#!<=&0W]]0`8*",5"?;I[//[`?S[!Q,:%`/S[_\7)209"_KL MZ?+_"08%#1D?&@W]]`$8)R48`^;/S=GL^_T!"Q`/"O[PZ_4*&QX7!>S?X^_[ M!@@$"`T,!OONY^W["`L"[]2]NLO[Q\_#KZ.S["`?]\^7:W^_\!@D' M`@('!@0&!PL4%PS\[]S'R-[R_O_X[^OLZN?M^`$+#P3U[^73U_('$`\%_?K] M^?#Y#!8?(1("__3>W?$`"0D!_/CU[NCY#A8<(!@+"`+S]0H7%A`/$`\+!@86 M*"LD'A('`O;H\0(%!0<'#0X'`@(+&!,*"P3[_P,!!1`0!P'^``+^_0$(#Q$, M`_CO\/7W^?WU[.GHZO#S]?L#!@/_]^GAZ_L$"@P(__;S\O/W_``)$A41`^S= MX._X^O__]NSGZ?+_!P8*$1(/!O/F[?T#!@L*"`/_`@<-$Q$5'2`B'@[_!1$. M"0T,`O?Q\_H#"`(!!@8&!?OW`Q,3#PX(`/SY^P,0%A(4%@X*"OWR_0H$_@#\ M]._IZO8&#P\)`/7R\^WJ_`X0#@T%_?GR[?0`!`+^]>_MZ^;E\O_Y\?#NZ^;; MV.GZ_O[Y[>3@V=7=\?_\]/+U^?7O\/H#!@8$``#]\_/_#`\%]_#R]/#L[_?^ M`@'\].SDW^H!$!0*_/;X^OC[!0P-#`H)!?[V\@(<*286`OCX\_/_!PL0$A$1 M#0'S\0(8)"8;"@/_^?L&#Q,4%1<8$P/V]P06)241_?;R]/\.%!`0#PP-!_OR M]`$/&AP/`?KS\P$+"`0#^_K^^?#M]`(,%!<*^?'J[/T,$`X'_?K[]>_M\/D% M#0P$^/'O\?\*!@,"^_?W\N_R\_G___[YZ=_>Y?H$__OW\>[MZ^_U]?C^_/[^ M]/+X!!$4#0<%`_\```,)"0T4$`T*`/T!"!,6"@0%_//X`0P6%0\+`?S\^/D" M#!88#PD'`?T``@0(!@,%_O/O[O'X!!`2#`P.`_;W_``("PH,!_SX]_H`!`@% M_?\"^?3U\>_T]/3Z^/#P]OO]_@0#_/T!_/GX\N_S]/7Y[^;N]_\$!`<%^_L# M!`<-"00%`O[ZZ^/M^@8-"P@#]>[Q]OO^^OD!!0'][^3M^P_T^@0.#`D(`?P"#!(0#`P0 M#P;]]._Z`@80$`P(_/8`#1(2"@,$`??S\O'Z`00(`_GRZ.OZ!@X.!@(%_^WH MZ^WX!0H,"P7Z[_#[!PX/"@4!^NWM\_8!"@L-"?[RZO#]"1$3#0H)_>KBX-SF M]/K]^_7OZNWX`@8$`?[Y\>SO\_0!#0L%_?/N[_0`"PT*!@#^_/?Y_?T$#PX& M_?H``P0.&R`<%0P&`/K\`0$'#@7UZN?N]?P(%AL4#`/^__[]__X'$`7W\/+^ M"`L4'A\8#@4#`?T!!P8+#P+QY>/L]?P&#Q`(__GV]O?\`?X!!?GKYN;P_P@- M#PL#_?K[_/G_"@D*#0#PZNGP_`((#Q$+`P`!_OT#!OWZ_.[AY.CQ`@T.#0L' M`P$```$#!/_^_O+IZ>CM_`$!`P,!``$#!`4("00"`OGQ\_SL\_K]_/T#!0(`_?X!^O+U^OO[]_#N\/7Z^P$* M#`L*!P<'_O7U]O?U[^GJ[_+V^?P"!04%`@#^]O+U^?O\^_?V]OC\_?\%!P8' M!P8"_/?W]O7V]/'Q\?+X_?X``@4)"PH(`P`"`0```?_]^_X%"0@*#`P.#@L& M`/[^_?O[^_K[_@('"@D)"`8&!P@'!`$"`?\``?_]_P,)#@\/$`\.#`@#_OGV M]/+R]/7T]/;[_OW_`0$#!0,"__S[^_K[_?W[^/?[`00%!@<+#0H%`/KX]_;V M^?W]_/K\``$"!0<*"P@&`OOV]/+S]_OZ]_7X_/\"!`<+#`H(`_SW]?/S]?CZ M^OO^`0$#"`T1$1`0#PL%`O\``@4'!@8*#`L-$!`1$0\.#`7^^O?V]_G\_?O] M`0(#!08&!@4&!P+]^OCX^/K]__\#!P<'"@H)!P,#`_WT\._N\//U]//U^?S] M_P$#!`'___WY]_7R\O?\^_G[_P(%"`H-#@P)!?_X\_+R\_?[^_GY^_T``P0& M!@0#`P'\^?CX^?S^_OX!`P,"!@H.#@P*!P/]^/7T]?CZ^?G[_@`#"`L-#Q`. M"@8"``#^^_S_`0$#!@<("PP+"PD&`__Z]_?V]OCZ^?C]`@0$!PD)"0<$`@#\ M^OO[^?K[^/;[`@4&!PD)"`7^^_GU\_/S\_7V\_#T^_W^`00("P@"__WZ^/CY M^?O^^OC]`P8&!PH-#PP&`?WX]?/R\O;Z^?G^`P4#`P4("@@%!`/_^_KY^/?W M]_G^`P,!`0,%!`(!``#]^/7T\O#R\O3[!`<'!PD+#`L)"`D)"`<%`P$!```% M#1`0#@T,"04#`0$"`0$!_OOZ^/K_!@H+"PH)"`4`_?W^_O[^_/W__?P!"`P- M#`L*!P+\^/?X^/CX^/?V]//V_/\!`@($`P'^^OGY]_;W^/G[^_O_!0@("`D+ M"@8`_/KX]/#P\?/U]??]`0("`0(#!`,!`/[[^/?V]?;Y^_X#!P8$!`0#`@#_ M_O[]^/7S\_3V^?T#"0L*"`D+"@@("0D(!@+^^_O^`0,%"0L+"@D(!P4%!`,# M`?_]_/S^_P(%"`D'!04'!0#\_/[]_/KY^/G\_/T"!P@&`P,$`_[Y]_;V]?/Q M\/+V]_;X_?___?X"`P'__?S[^??W^/G\_P$#!00"`0,'!@'^_/GV\N_P\_;Z M_?[_`0'^_@`$!@0#`@#]^?7T]/;Z_O\``@(``/\``0```/[Z]O3S\_7Z_P,% M!@4%!`0$!@4%!@8$!`,"`@,%"`D*#`L*"0D*"@D(!P,!__SZ^OS_`P8%`P,$ M!`,$!`,#`__]_?W\_?X!!`8&!@8'!P8$`P$`__OX]O7U^/G[_P$!`/___P$# M!`0$`__[^OGY^OP``P4%`P("`0``__\`__SY]_3R\_7X_0`````!``#__O[_ M`/[\^OGX]_?X^_W^_P$"`@+__?S]_?S[^OGX]_?X^_X``00%!04%!`,!```` M``$!`0("`P,"`@0&!P@'!@,!`/_^_?S[^_W^_P$!``$"`P,"`@#^_?W[^OK\ M_@`!`@,"__[^___^_?W[^_OZ^/;V]_G[_0``_O[___[\_?_^_O[^_?S\_/[_ M`00$`@$"`P(`_O[]_/S\^_KY^?K[_/___O\!`@'____^_OW]_O[__P$"`@,# M`P0%!@8$`P,"__[^_O[]_?\``0("`0($!04#`P,#`@("`@(#!`<)"0H)!P8% M!`,#`@,#`@$!`?_]_/W_``(#`@,%!00!__________[^_OX``0,#!`4&!0,` M_?S]_/O\_?[^_?S\_/S[^_X!`P,!_OS[^OGY^OS^_O\``0$`_O\!`0$!```! M__W\^OK\_/W_`/_]_/W^___^_O\`__W]_/O[^_W_`0(````!`?_]_@`!`?_^ M_/OZ^OS_`0("````__[\_/W_`0(#`@$````!`@0%!04$`P#^_?W^_P$"`0#_ M_O\```$!`0(#`P'^_/S\_?W]_O___O[_______\``0#^_/O\_?W\_/S\_/X` M``#__OW]_OW\_/S\_?[^_____P`#`P,"`0$"`0#^_?W_`````/_]_/W_```` M_OW^_OS[^_S^`0("`@(!_P`"`P0%!@8&!0+__?W_`0("`P(`_OX``0(#!`0$ M!`'__?W_`@0%!@<'!00#`P,$!`0&!@,!__[^``,$!`0$`P("`@,#`P,#`P'_ M_?S\_?[_``$!```````!```"`@#^_?S\_?[^_O[__OW]_O[^_?S\^_GX]_?X M^OS^_O[^_O[^_O[^_O[^_?OZ^?GY^OS^_O[]_?W]_O[^_O[^_OOZ^OO]_O\` M`/__``````$!`0$``/[]_/S^``$!`0#_``$"`@0%!00#`?[]_?[_`@0%!00" M`0(#`P,#`P,"`?_]_?X``0(#`P,"`0$"`@,#`P0#`?[\^_O\_?\`````__\` M``#__P#__OW\^_O[_/W^_O________[^_O____W\_/O[_/W_``$#`P0$`P(` M````___^_O[^_?W]_?W_``$!`0#__O____[^_O[^_P`````!`@,#`P(!`0`` M`/_^_O\``0$`__\``0("`P,#`@$!`/___O[^``("`0$!`0("`0$!`0$!`/_^ M_?W^_P```0$````````````!`0#^_?W]_O\````!`0(#`P,"`@$!`0$!```` M``$``/___P`!`````/____[^_O[^_O[^_O[^_P`!`0#___[^_OW]_?[^__[^ M_O[]_O\``0$``/_^_O[^_O[_`/_____^_P`!`0$!`@$`________````___^ M_?X``````0$`__[^_?W^__\``0$``````````0("`0$`___^_P`!`@,"`0`` M``#_``$!`@(!`/_^_O[_``$!`0$!`0#___\```$!`/_^_?S\_?W]_O[__OW] M_?W]_?W^_P#_______[^_P`"`@$!`0$`__[^_P````````#__O[^_P```0`` M`/______``````#___\`_P`!`0$!``````````$!`0$`______\``0$!`0#_ M_O[__P`!`@(!``#__P````$!`0$``/____\```$!`0```/\```````#_____ M__\````````!`0$!`0$````````!`0$```#__O[______P``_________P#_ M_____O[_``````#___[^__\```````#__O[^_P``````___^____``$!```` M____``$!`0$!``````````$!`0$!`/___P`````!`````/___P`````````` M````````_____P````````$!```````!````_____________________P`` M_____O[^_O[^_O[____^_OW]_O[^___^_O[^_O[__O[______O[^_O__``#_ M________````````_____O___P``__\````````````````````!`0`````` M```````````````````!``````````$!`0$!````____````````_____P`` M````````````````````____`````````````````0$!````____`````/__ M________``````#_____````____________________________________ M________________````_________P```````/____\`````________```` M````______\`````_________P``````_____P```````/___P`````````` M`````````````/__`````````````````````/______________________ M______________\`__________\```````#_____________________```` M``#__________P``````````````````____________```````````````` M`````/____\`````````````````````````____````````````````_P`` M````````````````````````____________```````````````````````` M```````````````````````````````````````````````````````````` M````````````````````0T]-30```!(``0``+Q8`"$`-K$0```````!-05)+ M`````@``24Y35````!0\``!_`'\``````````````````$%04$P```&H4V0R M80`"```````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M``````````````````````````````````(````````````````````````` M````````````````````````````````````````````````````````!`@` M``````D`(P````````````````!X````!``$````````_`#___^``````0$` M!E%5;FET````'@```!6__3_\O_P_^[_ M[/_H_^?_Y__N__@`!P`8`"@`-0`_`$4)1FER92!(;W)N`@```$%)1D939#)A M````````````````04E&1E-D,F$```````````````````````````````"G M/:W$```Q(@```<[_G_^L_\P``@!&`(P`R`#R`0D!#P$)`/P`Y0#'`*<`A@!E M`$0`)``$_^;_S?^[_Z[_J?^H_ZO_K_^R_[3_LO^P_ZS_J/^G_Z3_I/^C_Z3_ MI?^I_[/_Q/_=__\`)0!.`'``BP"=`*0`I`"<`)``?P!J`%8`0P`Q`"``#P`! M__3_Z/_=````&@`I``\":@,Q`"H``P)M`ST`*0`/`D$#(@$`````&@`I``\! M4`'Q`"H``P)M`ST`````````````````&@`L`!8!/@'<`"H``P)M`ST````` M````````````&@`````````````````````````````````````!`````7@` M``!X````5@!QN+P``````````````````````````````"!@7%5``!&3U)-```V M&D%)1D934TY$```T'@`````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M`````/____\```$"`@("`@("`@("`0("`0```/_^_O\```$"`@,#`P0$!@D- M#Q`0"P/Y[>+GCX>+G\/?\``(#!0<'!00$!`,"```!`P8'!P8%!`,#!0<( M!P8%!`(!`0#__O[^_O\``@,$!PH,#`L+#`\2%1@:&1<5$Q`,!/CHU+^TM+6Y MQ=/C\OP!`/W[^OCV]OC[``4+#`H&!`(``````@0%!PD*"@H)"`8$`P,#`P(" M`0$!______\!`P4'"0L-#@X,"PH*#1$5&AT?("(>$?[CR+.HIZRUO\?.U=SF M\?C\_OW[^??Y`@T4%A0/"08&!@<)"@D(!P4%!P@(!@0#`@("!`8("`8%!`," M`0$!`@,$!08'!P<("@P.#A`3&2`F*"@E'Q'[XC("%F;37^0\9%PP!_/OX]?;]!@X1$`\,!P/_ M_P``_OW_!`L0$A(0#0D&!`,#!0@)"`<&!`+^^OCW]O;Y_P4+#Q$1$`P)!P8' M"Q$7&R(I+"85_=_"J)2*CZ"ZV?@.%Q8-`OKV]/'Q^`(+$144$`L$__W]_?S] M``4*#A(4%1,/"@8"``$$!P@("`<%`O[[]_7T]OL`!0D-$!$/#`D'!PH/%!HA M)RHH'@OPU;VGD(*(H\?M"AD<$P?\]_7S\?/[!`L.$`\-"P<"__[^_?X"!PP0 M$Q46$PX)!0$``00&!P<'!@,`^_CV]/3W_`((#1`1$`X*"`<)#1(8'2(F)!L) M\=C`JY>,E;#0[P<6&!`$^_;T\>_R^@,+#Q$2$0X)`P``__W^`08,$!06%A0/ M"@8"```"!`8&!@4#`/WY]O3S]?H`!@P1$Q,1#@P+"PX1%1H>(1\7!_#4NJRH MIZ>NPN']$!81!OWX]O3R\O@"#105$@P(!00#`@#^_P$&"P\3%A@7$PP&`?[_ M`@0%!04$`P'^^_CW]_CZ_P0*#A$1$`X+"0D+#Q,8'2`A&PWXX'QL/^^/+MJ:;E9VZX0(6'!@. M!?WY]?/S^``(#A$1#PT-#`H&`O_]_@,(#1$5%A83#@D%`@$"`@("`P0$`P'^ M^O?U]??\`PH.$1,2#PT,#`T/$109'1\;#OKCRK2GGIB@NMX`%AX:$`;_^_?U M]/?^!@P/#P\.#@T+!P+^^_P!!@L/$Q87%`\*!@,"`P,"`@("`@(!__SY]_?Y M_0$'#1`2$@\,"PL-#Q(6&QX?'!'_Z=&[J)B,E+?B`Q@?&0\'`?WY]O;Y_P8* M#0T-#@\."P?O^8'&AX8#@8`_?KW]?C^!`D,#0T-#@T*!0'^ M_?X`!`@,$!(3$0X*!P4#`@$````!`@(!__W[^?GY_`$'"PX.#@T+"0D*#1$5 M%QD9%P\![MG$LJ&5G\#H"1H=%PX&`/SX]O;Y_P4*#0T-#0X-"@4!_?O\_P0( M#!`3$Q$."@<%`P$`__\``0(#`@#^^_GX^?P!!@H-#@T,"PD)"@P/$Q87&!'*LIV6K-;[ M$1L9$@L%__OY^?G[_@$%"`H,#@\."03_^_K\``,&"@X1$0\-"@@&`P#^_?X` M`0("`@#]^OCW^?P!!@D+#`P+"0@("0H-$!,4%10/!/3@R;"F;?C`Q08%`T(`_WZ^_S]_O\``0($!@H-#@P(`P$` M```!!`@,#0X-#`P+"08#`/_^_O__````__SZ^?K]`04'"`D*"0D("`H,#Q(2 M$1$/"O_OV<*JF:;/]@T8%Q`*!0#\^OO\_O\```$"!`<+#0P*!@,"`0$!`@4) M#`T-#`P,"PD&`@#__O[^_O[___W[^?G\``0&"`D)"0D("`D+#A$2$A$/#`7Y MZ-*ZI)RUWP`2&!0-!P+]^OO\_@````$!`@,&"@P*!P4#`P,#`@,&"@P-#`P, M#`L)!0(`__[^_O[^_O[]^OG[_@(&!P@("`@("`@*#`\1$A(2$`L"]-_'K)BA MR?$+&!@1"@4`^_K\_O\!`0$!`0(%"`H+"08$`P,#`P,%"`L,#`L+#`L*!P0" M`/_______O[]_/GY_``$!P@)"0@("`@)"@T/$!$1$0T'^^K3NJ.=M^$!%!D3 M#`8!_?KZ_/\!`@("`0$"!0@*"0<%!`0$!`,$!@D,#`P+"PP+"08$`@'____^ M_?W]_/KY^OX#!P@)"0@(!P<("0P/$1$2$0\*`/'=Q:R:IL[U#AD7#P@#_OKY M^_T!`P,"`@$!`@4'"`<%!`0%!00$!0@+#0P+"PL+"PD&!`,!___^_?W\^_KY M^?P!!0@)"@D(!P<'"`H-$!$2$0\+!/KIU+F=F+CE!A<:$PL%__KX^?S_`@0$ M`P$!`0,%!P8%!`0$!04$!`8)#`P*"@L+"PH'!00#`?_^_OW]_/OY^?K_`P<) M"@H)!P<'!@@*#A`1$!`."/_QW<6GE:O:_A0;%@T'`?SY^/K]`00%!`(!`0($ M!@8$`P,$!04%!08("@L*"0H+"PH(!@4$`@#^_OW\_/OY^/G\`04("@L*"`<& M!@<)#1`1$`\-"@/WYM&TFJ'*\PX;&1`)`_SX]_G[_P,&!@,!`0$#!04$`P,$ M!08&!@8'"0L+"@D*"PL)!P8&!0,`_O[]_/OY]_C[``0'"0L+"0<&!@8("PX0 M$!`."P;\[-:YGI_"[`D8&A(*!/WX]OCZ_@(%!@0"`0(#!`0#`@("!`8&!@8& M"`H+"@D*"@H)!P4%!@4!__[]_/OY^/CZ_@(&"`H+"PD'!@8'"@X0$1$/#`?_ M\-S!I9RWX0(6&Q4-!O_Y]O?Y_``$!@8$`@("`P,"`0$"!`8'!P<&"`H+"PH) M"@H)"`<&!P<$`?[]_/OY]_;Y_0$%!PD+"PD'!@8&"0P0$1`/#`@"]^3+JI:I MUOL2'!@/"`'Z]O;X^_\#!08%`P("`@,"`0`!`P4'!P<&!PD+"@D)"0D)"`<& M!P@&`P#__?OY]_;W^P`$!@@+#`L(!P8%!PL.$!$0#@D"^>G4M9F@RO,.'!L3 M"P3\]O7W^OX"!0<&!`(!`0("```!`@4'!P<&!PD*"PH("`D("`<&!PD(!0'_ M_?SZ^/;W^O\#!0<*#`P*"`8&!PH-#P\/#@H#^^W:OZ*;O.D)&AT6#0;]]_3V M^?T!!0<(!@0"`0$!`/__`@0'"`<'!P@*"PH)"0D(!P8&!PD*!P,`_OW[^/;U M^/T!!0<)#`P*"`8%!@D,#@\0#PP&__/BRJN8K=L`%AX9#P@!^?3U^/S_!`<( M!P4#`0$!`/__`0,%!P<'!P@*#`L)"0@(!P8%!@D+"@8!__[\^O;T]OL`!`8( M"@P,"PD'!@<+#0\0#@P(`/7DSK"7I-'[$QX<$PH#^O3S]OK^`@8("`8$`@$! M`/[^``(%!P<'!P@*#`P*"`@(!@4%!0@+"P<#`/[]^O?T]?G^`@4'"@P-#`H( M!@8)#`X/#PT)`_GKU[R@G+_M"QL>%0P%_?7R]/C]`04("0@%`@```/_^_P$$ M!@<'!P<)"PP+"0@(!P8$!`<+#`H$`/_^_/GU]/?\`00&"0L,#`L)"`<)#`X/ M#PX*!/OMV;ZAF+;F"1L?&`\(__?S\_?[``0("0D&`P$``/_^_@`$!@<'!P<( M"PP+"0@(!P4$!`4)#`L&`O_^_/KV]/;[``,%"`H,#`L)"`<("@X0#PX*!?[R MX3.M9R][0T=(!@0"0'X\_/U^?X"!@D*"0<#`?_]_/W_`@8'!P<'"0L, M"PD(!P4$`P,%"0P-"@4!_OW[^/?Y_@(%!04'"0D)"0D)"PP.#Q`."0+WZ=6] MHINYYPD;(!D0"@+Y]/+T^/T!!0@*"0<$`?_]_/S_`@4'"`<'"`L,#`H(!P8$ M`P,%"`P-"P8"__W[^/?Y_@,%!08("@H)"0D)"@L-#Q`/#`7Z[-G!I9BPX`4: M(1H2"P3Z]/+T^/P!!0@*"0@%`@#^_/S^`@4'"`<'"`L,#`H(!P8$`P,$!PL- M#`@#__[\^??X_0$$!04'"0H)"0D)"PP.#P\."P3Y[-O%JYNLV/\6(!P3#0;] M]O/S]OL`!`<)"@@%`@#^_/S^`04'"`@'"`H,#0L)!P8$`P,#!@H-#`D$`/[\ M^??W^P`$!04'"0D)"0D)"@P-#A`/#`?]\-_)K9BDT/H4(!T4#@?^]O+R]?K_ M`P<)"@@&`P#^_/O]`00'"`@'"`H,#`L)!P8%`P,#!0H-#0D%`?_]^O?W^@`# M!04'"`D)"0D)"@L-#A`0#@C_\^+-LIJ?Q_01'Q\6#PC_]_+R]?G^`@8)"@D' M!`'^_/O]``,&"`@'!PD,#0P)!P8%`P("!0D-#0H&`O_]^_CV^?X#!@8&"`D) M"`@("0H,#A`1#@D!]N?3N9V8N^L,'2`8$`H"^?3S]?G^`@8("0D'!`'__/O] M``,&!P<'!PD+#0P)!P8%`P("!`@,#0L&`O_]^_CV^/T"!08&"`H*"0@("0H, M#A`1#PH"^.G6O:*9MN0'&R`9$0L#^O3R]/C]`04("0D(!0+__?O]_P(%!P@' M!PD+#0T+"`8%!`,"`P@,#@L'`P#^^_CV]_P"!08&"`D)"0@("`D+#0\1$`P& M_.['Q8."/_X]/3W^P`$!@@)!P0"`/_^_?\! M`P8'!P<'"0P-"P@&!00#`@(&"@T,"`0!__WZ]_;Y_@,&!@<)"@D)"`@)"@T/ M$!`."0'VY]&VG9S`ZPH<'Q%0T(`/GU]??[_P,'"0D'`P$`__[^_P$$ M!@<'!P@)#`T*!@4$`P,#!`<+#0P(!`'__?KV]?G^`@4&"`L,"PD(!P<("PX/ M$`X+!?OMV;^DG+CE!QH?%P\)`OKU]/;Z_P,&"0H(!`$`__[^_@`#!@<'!P<) M#`T+!P4$!`,#`P8*#@T)!0'__?GV]?C]`@0&!PH+"@D'!04&"0T0$1`-"`/Y MZ=.TEYS)]Q(>'!,+!?WV]/7Y_0$%!PD(!0(`___^_O\!!`8'!@<("PT,"`4$ M`P("`P4)#0T*!@(`__SX]?;Z``,%!@@*"@D(!P8'"0P/#P\-"@3\[=:XF9?! M\0\='A0,!P#X]/3W^P`$!PD(!@(``/_^_O\!!`8'!P<'"@P,"04$`P("`P0( M#`T+!P,`_OSX]?7Y_@($!@D+"PH)!P8&!PH-#P\-"@;_\^#'J)BPWP,8'Q@/ M"0+Z]//V^P`$!PD)!@,!`/___OX``@4'!P8&"`P-"P<%!`,#`P0'"PT,"`0! M__WZ]O7W_``#!0<)"PH)!P<&!PD,#@\/#0@#^>G2LI:?SOD3'QL1"@7]]_3V M^?X"!0@)!P0"````__X``@0&!P8'"`H-#`@%!`,#`P0%"0T,"04!`/[\^?7V M^P`#!`8)"PL*"`<&!@@+#0T-#0L&_N[8NIJ:PO`.'AX4#`<`^/3U^/P`!`<) M"`4"````__[_`00'"`<'"`H,#`D&!`,#`P0%"`P-"@8"`/_\^?7U^?X"`P4( M"PL*"0@'!P@+#0T-#0L'`//?Q:.5L^0&&A\8#@D"^?3T]_L`!`<)"`4#`0`` M__[_``,&!P<&!@@+#`H'!00#`P0%"`P.#`<#`/_]^O;U^/T!`P4'"0L*"`<' M!@<*#`X.#@P(`_CFS:J3IM;_%A\:$0H#_/;T]OK^`@8("`8$`0``__[^``,% M!P<&!@<*#`H'!00#`P0$!@D-#`@$`?_]^_?U]_P``P0%"`H*"0@'!P<)#0X. M#0L(`_KKU+:;H,GT$!T<$PP&_O?T]?C]`04("0@%`@``__W]_P$%!P<'!@<* M#`P)!00#`@,$!0D,#0H%`@#^_/CV]OK_`0,%"`H+"@@'!@<(#`X.#@T*!O_S MW\.BEK?G"!L?%@X(`?GT]/?[_P,'"0@&`P$``/[]_@`$!@<'!@<)"PP)!@0$ M`P,$!0@,#@L'`P#__?KW]OG^`0,%!PD*"@@'!@8'"@X0$`X+!@'VY'A0, M!?WW]/7X_0$%"`D(!@(``/_]_?\!!0<'!@8'"@P,"08$`P(#!`4)#0X+!@(` M__SX]?;Z_@(#!0@*"PD(!P8&"`L.#PX-"P@!]>'$H9.TY0<:'Q<."`'Y]/3W M^_\#!PD)!@,!``#^_?X!`P8'!P<'"0L,"@8$`P,#`P0'#`X+!@(`__WY]O7X M_0$#!`<*"PH(!P8&!PH-#P\-"P<"^>G1L)>ET_P4'QL2"@/[]?+U^?X"!@D) M!P0!``#__?X``P4'!P8&"`L,"P<%!`,#!`0&"@T,"`,`__W[]_7W^_\"!`8) M"@H)!P<&!PD-#@X.#0H'__#:O)R8O^X,'1\5#`7^]_/T^/P!!0@)"`4"```` M_O[_`00&!P8&!PD,#`D%!`,#`P0&"0P-"@4"`/[\^?;V^?X!`P4("@H)"`<& M!@@+#@X.#0L)`_;BQJ.3K^(%&2`9#P@!^O3T]_O_`P<)"0<#`0``__[_`0,& M!P<&!P@+#`H&!`0#`P0%!PL-"P8"`/_\^?;U^/T``@0("@L*"0<&!@<+#@\- M#`H(!/OJT;"5I-+[$Q\<$0H#^_7S]?K^`@8)"0<$`0``__[^``(%!P<&!@@* M#`H'!00#`P0%!PL-#`@#`/_]^_CV]_O_`0,&"0L+"0@'!@<)#`X-#0T+!__P MVKZ?F;WL"QT?%@T&__CS]/?\`04("0@&`@``__[^_P($!@<'!@<)#`P)!@0# M`P0%!@D,#0H%`0#^_/GW]_K^`0,%"`H*"@D(!P8(#`X.#0T+"`'TX,6EE*_A M!1D@&0\(`?KT]/;Z_P0'"0@&!`$``/[]_@$#!@<'!@8("PP)!@4$`P,$!0<+ M#0L&`@#^_/KW]OC\``($!PH+"@D(!P8'"@T.#@X,"@7ZZ=&QEJ'/^!(@'1(* M`_SU\_7Y_@(&"0D'!0$``/_]_@`#!0<'!@8'"@P+!P4$`P,$!0<*#0T(!`#^ M_?OX]O?[_P$#!@@*"@D(!P8&"0P.#@X."P;^[MB[FYC`[PX?(!8,!O_X\_3X M_``%"`D(!@(```#^_O\!!`8'!@8'"0L+"`8%!`,$!08(#`T*!0'__OSY]_?Z M_@$#!0@*"PH)"`<&"0T/#@T,"@G0L)6AT/L4(!T3#`7]]?+T^/P!!0@)"`8"``#__?W_`@4' M!P<&!PD+"P@%!`,#!`0&"`P-"@0`_OW[^/;W^_\"`P4("@H*"0@'!PD-#@X- M#`D$_.[8NIR=Q?$-'A\5#0;_]_+S]_L`!`@)"0<$`?___?S^``,&"`<&!PD+ M#`D&!00#!`0%!PL-"P8"__[\^??W^OX!`P0'"0H*"0<'!PD,#@X.#@L&`/+= MP:&7N.@(&R`8#PD"^?/S]OK^`P<)"0@%`?___?S]``,&"`@'!P@*#`H'!00# M`P0$!@H-#0D$`/_]^OCV^?T!`P0&"0H*"0@'!@<*#0\/#PP'`?;DRJ>3K-X" M&"$<$0H#^O3R]?G]`@8)"@@&`@#__OS]_P(&"`@'!@@*#`L'!00#`P,$!0D- M#@H%`?_]^_?V^/P``@,%"`H*"0@(!P<*#A`/#@L&`OKKU+.8HL_Y$Q\=%`P% M_?7R]/C\`04("@D'`P#__OS\_@$$!P@'!P<)"PP)!@4$`P,$!0@,#@L&`O_] M_/GV]_K^`0,%!PD)"0D("`@*#0X.#@T*!?WMU;66F\GU$!\>%0T'__?R\_?[ M``0'"0H(!`'__OS\_@$$!P@'!@8("PP)!P4$`P,#`P8*#@T'`O_^_/GV]OK^ M`0,$!PD*"0D("`<("PT.#@T*!O[QW+^>F;[L"QT@%P\(`/?R\O7Z_P,'"0H( M!@+__OS[_?\#!@@'!@<("PP*!P4$`P,#`P4*#0T)!`#^_?KV]?C^`0,$!PD* M"@D("`@)"PX.#@T+!O[QW+Z=E[OJ"AP@&!`*`OGS\O3Y_@(&"`H)!@(`_OS[ M_/X"!@@(!P<("@L*"`8%!`,#`P4)#0X*!0'^_?OW]?C]`0,$!@D*"@D)"`@( M"@P-#@X+!O_TXLBHF;/@`Q@@&A(+!/KT\O3X_@(%"`H)!P0`__W[_/X!!0@( M!P8("@P+"`8%!`,#`P0(#`X+!@+__OOX]OC]`0,$!0<)"0D)"`@)"PP-#@X, M"`'TXL>GFK/@`Q@?&A(,!?SU\O3X_`$%!PD)!P0!__W[^_T`!`<(!P8'"0L+ M"0<%!`,"`@,&#`X,"`,`_OSY]_C\``,$!0<)"0D)"`@("0P.#@X,!P#UY M&Q(,!_[W]/3W^P`$!@@)"`4"`/W[^_S_`P8(!P8&"`H+"0<%!`,"`0($"`P, M"04!__WZ^/?Z_P($!`4'"`@(!P<'"`D+#`T,"`/Z[=J]I*K/]@X<'!,-!P#X M]/3V^_\#!0<("`8"`/W[^_S_`@8'!P8&"`H+"0<%!0,"`0$#!PL,"@8"`/[[ M^/?Z_@($!`4'"`@("`<'"`D+#0X-"0+Z[=O!IZG-]`P;'!,-"`'Y]/3V^OX" M!0<)"`8#`/[\^_S^`04'!P8&!PH+"@@&!0,"`0`"!@H,"@<#`/[[^/?Y_@($ M!`4&"`@'!P<'"`D*#`T,"07^\N+)K*?&[@D8'!4-"`+Z]?3V^OX"!`8("`<# M`?_\^_S^``0&!@8&!PD+"@@&!0,"`0`!!0H,"@<#`?_\^??X_0$$!`0&!P<' M!P<'!P@)"PP,"@7_]>7-KZ;#ZP87&A,-"0/\]O3V^?T!!`8("`8#`?_]^_S^ M``,&!@4%!@@*"@@&!`,!```!!0D+"0<$`?_]^O?X_``#!`0%!P<'!P<&!P@) M"@L+"07_]>;1MZW#Z`04&10-"03\]O7V^?T!`P4&!P8#`?_]^_S]``,%!@4% M!@@*"@@&!00"`0```P@*"0<$`?_]^OCY_``#!`0%!@<'!P<&!@@*"@P,"03_ M]^K6O:Z_Y`$2&14."@7]]_7V^?P``P4&!P8$`?_]_/S]_P,%!04%!@<)"@@& M!`0"`0```P<*"@<$`@#^^_GX^_\#!`0%!@<'!@8&!@@)"@L+"@S9P*^] MX/X0&!4."@7_^?;V^/P``P4&!P8$`@#^_/S]``($!@4%!0<)"0@&!`0"`0`` M`@8)"0<%`@#^_/GX^_\"!`0%!@8&!@8&!@<("0H+"@@#^^_?Q[*XVOH-%A8/ M"@8`^O;V^/O_`P0&!P8$`@#^_/S]_P($!04$!08("0@&!`0#`?__`04)"0<% M`@#^_/GX^OX"!`0$!@<'!@8%!08("0H*"08!^O#BS+>[VO@+%A8/"08`^O?V M^/S_`@0%!@8%`@#^_?S]_P$#!04$!`8("0@&!`0#`0#_`00("0<%`P'__/KY M^OX"`P0$!08&!@8%!08'"`D*"@@#_?/FT;RZU/,'$Q4/"@^T.T##Q00"@<#_OGW^/O^`0,$!08%`@#__OW]_@`" M!`0$!`4&"`@&!`,#`@$```(&"`<%`P$`_OSZ^OT``@,#!`4&!04%!`4&!P@) M"0<$`?KQXLV^RNC_#1,1"P<#_OKX^/O]`0,$!04%`P'__OW]_@`"`P0$!`0& M!P@&!`,#`@'__P$%"`<%`P(!__SZ^OP``@,#!`0%!@4%!04%!@<("`<$`/GP MX]#"S>C^#!(0"P<$__KX^/K]``($!`4%`P'__OW]_@`!`P0$`P0%!P@'!0,# M`@#__P$$!P<%`P$!__WZ^OS_`0,#!`4%!04%!00%!@<'"`<%`OWTY]7$RN/Z M"1$0"P<$__OX^/K]``(#!`4%`P'__OW]_O\!`@,#`P,%!@<&!0,"`@$`_P`# M!@<%`P(!__W[^OO^`0,#`P0%!04%!`0$!08'"`<%`OWUZMC'RN+Y"!`0"P<% M`/SY^?K]``(#!`0$`P$`__[]_O\!`@,#`P,$!@<&!0,"`@$`_P`#!@<%`P$! M`/[\^OO_`0(#`P0%!04$!`0$!08&!P<%`?WVZ]S-SN'W!@X/"P<%`?SY^?K] M_P$#!`0$`P$`__[]_O\!`@,#`P,$!08&!0,"`@$`_P`"!0<%`P$``/[\^_S^ M`0(#`P0$!04%!`0$!04&!@8$`O[Y\.+2S=WS`PP/#`@%`?WZ^OO\_P$"`P0$ M`P(`__[^_O\``@,#`P,$!08&!0,#`@$`__\"!08&!`(``/_]^_O]``("`@,$ M!`0$!`0$!`4&!P8%`O[X\./4S]_T`PP."P<%`O[[^OK\_@$"`P0$`P(`__[^ M_O\``0(#`P,#!`4&!0,"`@$`__\!!`8%!`(!`/_]^_S^``$"`@,$!`0$!`,# M!`4%!@8%`O_[\^C:T=OP_PD-"P<%`O_[^OK\_@`"`P,$`P(`__[]_O\``0(# M`P(#!`4&!0,"`@$`__\!!`8%!`(!`/_]_/O]_P$"`@(#!`0$!`0$!`0$!08% M`P#\].G;T]SP_P@-"P<%`O_\^OO\_@`!`@,#`P(`__[^_O\``0(#`P(#`P0% M!0,"`@$`__\!`P4%!`(!`/_^_/S]_P$"`@(#!`0$`P,#`P,$!04%`P']]^_A MU=KM_`8,"P<%`__\^_O\_@`!`@,#`P(!__[^_O__`0("`@("`P0%!`,"`@$` M`/\``@0%!`(!`/_^_?S]_P$"`@(#`P,#`P,#`P0$!04$`P'^^?'EV]SK^@4* M"P<%`P#]^_O\_O\!`@,#`P(!`/_^_O__``$"`@("`P0%!`,"`@$``/\``@0% M!`(!``#__?S]_@`!`@("`P,#`P,"`@,$!`4%`P'_^_3JWMOH^`,)"P@%`P#] M_/O\_?\!`@(#`P(!`/_^_O__``$"`@("`@,$!`,"`0$``/\``0,$`P(!``#_ M_?S\_@`!`0("`P,#`P("`@,#!`0$`P'__/;NXMWG]@$'"@@%`P'^_/S\_?\` M`0("`P(!`/_^_O[_``$!`@("`@,$!`,"`0$``/__`0,$`P(!``#__OS\_@`! M`0$"`@,#`@("`@,#`P0$`P(`_?CPYN#F]/\&"0@%`P'__?S\_?\``0("`@(! M`/___O__```!`@(!`@(#!`,"`0$``/__`0(#`P(!``#__OW]_O\!`0$"`@(" M`@("`@(#`P,#`P(`_?GRZN/G]/\%"`<%`P'__?S\_?X``0$"`@(!`/___O__ M```!`0$!`0(#`P,"`0$``/__``(#`P(!``#__OW]_O\``0$!`@("`@("`@(" M`P,#`P(!__OU[N;G\OT#!P<%`P(`_OW]_?X``0$"`@(!``#_____```!`0$! M`0("`P,"`0$!``#_``$#`P(!``#___[]_O\``0$!`0("`@(!`0("`@(#`P(! M__WX\>GH\/L"!@<%`P(`_OW]_?[_``$!`@$!``#______P`!`0$!`0$"`P(! M`0$```#_``$"`@(!````__[]_O\```$!`0("`@(!`0$"`@("`@$!__WZ]>[K M\/D`!`8%`P(`_OW]_?[_``$!`0$!``#______P```0$!`0$!`@("`0$```#_ M``$"`@(!````__[^_O\````!`0$!`0$!`0$!`@("`@(!`/[[]_'M\/G_`P4$ M`P(`__[]_O[_```!`0$!``#______P````$!`0$!`@(!`0$````````!`@(! M````___^_O\``````0$!`0$!`0$!`0$"`@$!`/_]^?3P\OC^`@0$`P(!__[^ M_O[_```!`0$!``#______P````$!```!`0$!`0`````````!`0$!````___^ M_O__``````$!`0$!`0$!`0$!`0$!`/_^^_?S\O?]`0,$`@$!`/_^_O[__P`` M`0$!``#______P`````````!`0$!`0```````````0$!````_____O\````` M```!`0$!`````0$!`0$!``#^_?KV]/?\``(#`@$!`/_^_O[__P`````````` M______\``````````0$!`````````````0$!`````/______```````````` M``````$!`0$!``#__OSX]_C\_P$"`@$``/_______P``````````______\` M`````````````````````````````````/______```````````````````` M``````#__OW\^OK\_P`!`0$``/_______P``````````________```````` M`````````````````````````/_______P`````````````````````````` M___^_/S]_P```0````#_______\``````````/______```````````````` M`````````````````/_______P``````````````````````````________ M_P````````#_______\```````````#__P`````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M``````````````````````````````````````````````!#3TU-````$@`! M```T%@`(0`VL1````````$U!4DL````"``!)3E-4````%#P``'\`?P`````` M````````````05!03````:A39#)A``(````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M`I`````````````````````````````````````````````````````````` M```````````````````````$"```````"0`C`````````````````'@````$ M``0```````#\`/___X`````!`0`&455N:71S```````````````````````` M`````````````````0(`!B!S86UP````%8``````%;^`/___X`````!`2`&455N:71S```3""YP9P5" M=6=L90(```!!249&4V0R80`````````````2JP````!!249&4V0R80`````` M`````````````````````````*<]K=8``#8B```!S@```!T`+P`/__;_^0`! M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````:`"D`#P)J`S$`*@`#`FT# M/0`I``\"00,B`0`````:`"D`#P%0`?$`*@`#`FT#/0`````````````````: M`"P`%@$^`=P`*@`#`FT#/0`````````````````:```````````````````` M``````````````````$````!>````'@```!6`'&XO!RF````'`!6``!7```````#__\````\```````$__\` M``!:```````````````````````````````````````````````````````` ,```````````````` ` end slashem-0.0.7E7F3/sys/share/sounds/wdnharp.uu0000664000076400007640000004164210545462317017134 0ustar alialibegin 644 Wooden_Harp M``M7;V]D96X@2&%R<``````````````````````````````````````````` M``````````````````````````!!249&4V0R80$``$X`10```````"XB```! MSJ<]K8^G/:V7``````````````````````````````"!@<\@``!&3U)-```N M&D%)1D934TY$```L'@`````````````````````````````````````````` M````````````````````````````````````````____________________ M________________________________________````````````_____P`` M`````````````````````/_________________^_O[^_?KX^/T!`O_[\-[, MP;R\OL"\L:>OQ=37S\6]M[2VN\''S=/8WN/GZ^_Q]/D`"A8B+SM$2U%776%E M:6UOX./H[?7_"10>)RXS.#Q`1$A+3E%25%9865I; M7%Q=75Q;6E9/.Q+Q[/+[!`P3&A\A(!T8$@G^Z\.:BX^6GZBOM[N]O+JWM;2U MN+O`Q,C+SM'4U]G;W=_BY^SU_P@2&R$G+#`T.#P_0D1'24I,3D]045)34U-1 M3TL_)@/NZ^WQ^/\&#A08&AD6$0G^ZLBEE)*4F)ZEK+*WNKN[N[N\O\+%R,O. MT-+5U]G;W-W@X^CO]P`)$1D?(RWM[_+W M_0,)#A$2$`L!\=K!K:6BH*"AHZBML[B]P<7(S-#2U=?9VMKFIJ>KL+6[P<;,T-38V]W>W]_@X>'BXN/DY>?J[_3[`PD0 M%AH>(20G*2PN,#(T-C;FY^GK[_3Y_P8,$A<;'R$D M)B@K+2\Q,C0V-SDZ.CDV,"<;#0'X]//S\_3U]OG]`@<+#`L'_O'BTL6]M[6S ML;"PL+.XO<3,TMC>XN7GZ.CHZ.CHZ>GIZ>OL[_/X_0,)#Q49'!\A)"8H*BPN M,#(T-3KM[_#P\/#P[^_O[_#P\O3X_`$&#!$6&AT@(B0F*"HL+C`R,S4U-3,P*B,: M$0D"_?OZ^OO\_?[_`00'"@L*!@#W[>+8T,K&P\+!P+^_P<3*T-??Y>OO\?/S M\_/S\O+R\O+R]/7X_``%"A`4&!P?(2,E)RHL+C`R,S0T-#(N*2(;$@L%`/W\ M_/W_``$"`P4'"0L+"`/\\^G@U]',R,;%Q<3$Q("(E)RDK+2\Q,C,S,S$M*"(;$PT'`O_^_O\``0(# M!`4'"0H*"07_]^[FW=;1S?L\?3V]_CX^/CW]_?W]_CY^_X!!0H/ M$Q<;'R$C)B@J+"XO,3(Q,2\K)B(;%0\*!@,!``$"!`8'"`@)"@L+"@@$__CP MZ>+;K\/3V^/GY^?GY^?GY^?GZ_/X!!0D-$A8:'B$C M)2@J+"XO,3$Q,"XK)R(<%A`,"`0#`@($!0<)"@H+"PP,"PH'`OSU[N?AV]?4 MTM'1TM/5U]G=X>;J[_/V^/GZ^OKZ^OKZ^OK[_/X!!`@,$!49'2`C)B@J+"XO M,#$Q,"XK)B$<%Q$-"08$`P,$!@@*"PP,#`T-#`L(!/_Y\NSFX-O7U=/3U-77 MV=O>X>7I[?'U]_GZ^OO[^_KZ^OO[_/X``P8*#Q,7&Q\B)2VMC7U]?9V][AX^;I[._R]/;X M^?KZ^OKZ^OO[_/W^`00'"@X3%QL?(B4G*2LL+"TL*RDF(Q\:%A(."@<%!`0$ M!@@*#`X/#P\.#0P*!P/_^O7PZN;BWMO9V=G;W=_BY>?J[.[P\O3V]_?X^?GY M^?KZ^_S]``,%"0T1%1D=(20F*"DJ*RLJ*2_Q\O/T]?;W^/CX^?GZ^_S] M_P(%"`P0%!@<(",F*"DI*BDH)R4B'QP8%1$."PD'!@4&!P@+#0\1$A(1$`X, M"08#__KV\>WIY>+@WMW>W^'DY^KL[O#Q\O/T]/7V]_?X^/GY^OO]_P$$!PL/ M$Q<;'R(D)B&Q@5$0\,"0<&!00$!08("@T/$!$1$1`.#`D&`__\^/3P[.GFY.+AX>+D MYNGL[O#R\_/S\_/T]/3U]O?W^/K[_/X!!`8)#1$5&!P>(2,C(R,B(1\=&A<4 M$0X+"0<%!`0$!`4'"0P.$!$2$1`/#0H(!`'^^O;S[^OIYN3CX^/DYNGL[O#R M\_3T]/3T]/3U]O?W^/G[_/X``@4)#`\3%AD='R$B(B(A(!X<&1<4$0X+"0<% M!`,#!`4&"`L-#Q`1$1$/#@L)!@,`_/CU\>WKZ.;EY.3DYNCK[?#R\_3T]/3T M]/3U]?;W^/GZ_/W_`@0'"@X1%!<:'1\@(2$@'QT;&!83$`T*"`8$`P("`@,% M!PD+#@\0$1`0#@P*!P0!_?KV\^_LZNCFY>3EYN?I[._Q\O/T]/3T]/3T]?7V M]_CY^_S^``(%"`L/$A48&AP>'Q\>'1L9%Q01#PP)!P4#`@$!`0(#!0<)#`X/ M$!`/#@P*!P0"_OOX]/'MZ^GGYN7EY>?IZ^WO\?/S]/3S\_/S]/3U]O?X^OO] M_P$#!@D,#Q(5&!H<'1T='!H8%A,0#@L(!@0"`0`````"`P4("@P.#P\/#@P* M"`8#`/WY]O+O[.KHY^;EY>;HZNSN\/+S]/3T\_/S]/3U]O?X^?O\_@`"!0@* M#1`3%A@:&QL;&AD7%1(/#0H'!0,!`/___P`!`@0'"0L-#@\.#@T+"0<$`?[[ M^/7Q[NSJZ.?FYN?HZNSN\/+S]/3T]/3T]/3U]O?X^?K\_@`"!`<*#`\2%!88 M&AH:&A@7%1(0#0H(!0,!`/_^_O\``0,%"`H,#0X.#@T,"@@%`P#]^?;S\.WK MZ>CGY^?HZ>OM[_'S]/3T]/3T]/3U]O?X^?K[_?\!`P4("PX0$Q46&!D9&1@6 M%!(/#`D'!`(`__[]_?[_``($!@D+#`T.#@T,"@@&!`'^^_CU\N_MZ^GHZ.?H MZ>KL[O#R\_3T]/3T]/3T]?;W^/G[_/X``@0&"0P.$1,4%A<7%Q85$Q$."P@& M`P'__OW\_/S]_@`"!0<)"PP-#0P+"@D&!`+_^_GV\O#MZ^KIZ.CHZ.KK[>_Q M\O/T]/3T\_3T]/7V]_CZ^_W_`0,%!PH,#A`2%!45%144$@\-"P@%`P'__?S[ M^_O\_?\!`P4'"0L,#`P+"@D'!0,`_?KW]/'O[>OIZ.CHZ.GK[.[P\?/S]/3T M]/3T]/7V]_CY^_S^``($!@@+#0\1$A,4%!03$0\-"@<%`@#^_?S[^_O[_/X` M`@0&"`H+#`P+"@D(!@0!__SY]O/P[NSKZNGIZ>KK[.[O\?+S]/3T]/3T]?7V M]_CY^_S^``($!@@*#`X0$1,3$Q,2$0\-"@@%`P#^_?S[^OK[_/W_`0,&"`D+ M#`P,"PH)!P4"`/[[^/7R\.[LZ^KJZNKK[.WO\?+S]/3U]?7U]?;V]_CY^_S^ M_P$#!0<)"PT/$!$2$A(2$`\-"@<%`@#^_?OZ^OKZ^_S^``(%!PD*"PP+"PH) M"`8$`?_\^??T\>_M[.OJZNKK[.WN\/'S]/3U]?7U]?;V]_CY^OS]_P`"!`8( M"@P-#Q`1$1$0#PX,"@<$`@#^_/OZ^?GY^OO]_P$#!0<)"@H+"PH)"`8$`@#] M^O?U\_#N[>OJZNKKZ^SN[_#R\_3T]?7U]?7V]O?X^OO\_O\!`P4'"0H,#0X/ M$!`/#@T+"08$`O_]^_KY^/CX^?K\_?\"!`8'"0H*"@H)"`8%`P#^_/GV]/'O M[NSKZ^OKZ^SM[_#Q\O/T]/7U]?7V]O?X^?O\_?\!`@0&"`D+#`T.#P\.#0P+ M"08$`O_]^_KY^/CX^?G[_?X!`P4'"`D*"@H)"`<%!`+__?OX]?/Q[^WL[.OK M[.SM[_#Q\O/T]?7U]O;V]_CX^OO\_O\!`@0&!PD*#`T-#@X.#0P+"0<$`@#^ M_/KY^/CX^?G[_/X``@0&"`D*"@H*"0@'!0,!__SZ^/7S\>_N[>WM[>WN[_#Q M\O/T]?;V]O?W^/CY^OO\_O\!`@0%!P@*"PP-#0T-#0P*"0<$`@#^_/OY^/CX M^/GZ_/W_`0,%!P@)"@H*"0@'!@0"`/[[^??T\O'O[N[M[>WN[_#Q\O/T]?;V M]_?W^/CY^OO\_O\``@,%!@@)"@L,#`T,#`L*"`8$`@#^_/KY^/CX^/GZ^_S^ M``($!@<("0D)"0@'!@4#`?_]^OCV]/+P[^[N[>[N[^_P\?/T]?7V]_?W^/CY M^OO\_?X``0,$!0<("0H+"PL+"PH)!P8$`@#^_/KY^/?W]_CY^OO]_P$#!08' M"`D)"0@'!@4#`@#]^_GW]?/Q\._N[N[N[^_P\?+S]/7V]O?W^/CY^OO\_?[_ M`0(#!08'"`D*"@L+"@D(!P4$`@#^_/KY^/?W]_CX^OO]_@`"!`4'"`@)"0@( M!P8$`P'__?OX]O3S\?#O[^_O[_#P\?+S]/7V]_?X^/GY^OO\_?[_`0($!08' M"`D*"@H*"@D(!P4$`@#^_/OY^/CW]_CY^OO\_@`"!`4'"`@)"0D("`<%!`(` M_OSZ^/;U\_+Q\/#P\/#Q\O/T]?;V]_CY^?KZ^_S\_?\``0($!08'"`D*"@H* M"@D(!P8$`@'__?OZ^?CX^/CY^OO\_@`!`P4&!P@)"0D)"`<&!0,"`/[\^OCV M]//R\?'Q\?'Q\O/T]?;V]_CY^?K[^_S]_O\``0($!08'"`D)"@H*"0D(!P4$ M`@'__?SZ^?CX^/CX^?K\_?\!`@0%!P@("0D)"`<'!@0"`?_]^_GW]O3S\O'Q M\?'Q\O/S]/7V]_CY^?KZ^_S\_?[_`0(#!`4&!P@("0D)"`@'!@4#`@#^_?OZ M^?CW]_?X^?K[_/X``0,$!@<'"`@("`<'!@0#`0#^_/KX]O7T\_+Q\?'R\O/S M]/7V]_CX^?KZ^_S\_?[_``$#!`4&!P<("`@("`<&!@0#`@#^_?OZ^?CX]_?X M^/GZ_/W_`0($!08'"`@("`@'!@4$`@'__?OY^/;U]//R\O+R\O/S]/7V]_CX M^?K[^_S]_O[_``$#!`4&!@<("`@("`<&!00#`@#__?S[^OGX^/CX^?GZ_/W_ M``(#!08'!P@("`@(!P8%!`(`__W[^OCW]?3T\_/S\_3T]?;V]_CY^OO\_/W^ M_O\``0(#!`4&!P<("`@("`<'!@4#`@'__OS[^OGY^/CX^?K[_/W_``(#!08' M!P@("`@("`<&!0,"`/[]^_KX]_;U]/3T]/3U]?;W^/CY^OO\_?W^__\``0(# M!`4&!P<("`@("`<'!@4#`@'__OW[^_KY^/CY^?KZ_/W^``$#!`4&!P@("`@( M"`<&!00#`?_^_/OY^/?V]?7T]/7U]?;W]_CY^OO\_/W^__\``0(#!`4%!@<' M"`@(!P<&!00#`@#__OS[^OGY^/CX^?GZ^_S]_P`"`P0%!@<'"`@(!P<&!00# M`@#^_?OZ^/?V]O7U]?7U]?;V]_CY^?K[_/W^_O\``0$"`P0%!@8'!P<'!P8& M!00#`0#__?S[^OGY^/CX^/GZ^_S]_@`!`@0%!08'!P<'!P<&!@4$`@'__OS[ M^OCW]_;U]?7U]O;W]_CY^OK[_/W^__\``0("`P0%!@8'!P<'!P8&!00#`0#_ M_OW[^_KY^?CX^?GZ^_S]_O\!`@,$!08'!P<'!P<'!@4$`P(!__[\^_KY^/?W M]O;V]O?W^/CY^OO\_?[^_P`!`0(#!`0%!@8'!P<'!P<&!00#`@$`_OW\^_KZ M^?GY^?KZ^_S]_O\!`@,$!08'!P@("`@'!P8%!`,"`?_^_/OZ^?CX]_?W]_?X M^/GZ^OO\_?[__P`!`@(#!`4%!@<'!P<'!P<&!00#`@$`__[\_/OZ^OGY^?KZ M^_S]_O\``@,$!08&!P<("`@(!P<&!00#`0#__?S[^OGX^/CX^/CX^/GZ^OO\ M_?[__P`!`@(#!`0%!@8'!P<'!P8&!00#`@$`__W\^_OZ^OGY^?KZ^_O\_?X` M`0(#!`4%!@<'!P<'!P8&!00#`@#__OW[^OKY^/CX^/CX^/GY^OO[_/W^_P`! M`0(#`P0%!08&!@<&!@8%!00#`@#__OW\^_OZ^?GY^?GZ^OO\_?[_``$"`P0% M!08&!P<'!P8&!00#`@$`__W\^_KY^?CX^/CX^/GY^OO[_/W^_P`!`0(#`P0% M!08&!@8&!@8%!00#`@$`_OW\_/OZ^OGY^?GZ^OO\_?[_``$"`P0$!08&!P<' M!P<&!@4$`P(!`/[]_/OZ^OGY^?GY^?GZ^OO\_/W^_P`!`@(#!`0%!@8&!P<' M!P8&!00#`@$`__[]_/O[^OKZ^OKZ^_O\_?[_``$"`P0$!08&!P<'!P<'!@8% M!`,"`0#__OS\^_KZ^OGY^OKZ^_O\_?[__P`!`@,#!`4%!@8'!P<'!P8&!00$ M`P(`__[^_?S[^_OZ^OO[^_S\_?[_``$"`P,$!08&!@<'!P<'!@8%!00#`@#_ M_OW\_/O[^OKZ^OK[^_O\_?[^_P`!`@,#!`4%!@8&!P<'!P8&!00#`P(`___^ M_?S[^_OZ^OK[^_O\_?[^_P`!`@,$!`4%!@8&!P<&!@8%!`0#`@$`__[]_/O[ M^OKZ^OKZ^_O\_/W^_P```0(#`P0%!08&!@8&!@8%!00#`@$`__[]_/S[^_KZ M^OKZ^_O\_/W^__\``0(#`P0%!04&!@8&!@8%!00#`@$`__[]_/S[^_KZ^OKZ M^_O[_/W^_O\``0("`P0$!04&!@8&!@8%!00#`@$`__[^_?S[^_OZ^OKZ^_O\ M_/W^_O\``0("`P0$!04&!@8&!@8%!00#`P(!`/_^_?S\^_O[^_O[^_O\_/W^ M__\``0(#`P0$!04&!@8&!@8%!00#`P(!`/_^_?W\_/O[^_O[^_S\_?W^__\` M`0("`P0$!04&!@8&!@8&!04$`P,"`0#__OW]_/S\^_O\_/S\_?W^_P```0(# M!`0%!08&!@8&!@8&!04$`P(!`/___OW\_/S[^_O[_/S\_?W^__\``0("`P0$ M!04&!@8&!@8&!@4%!`,"`0$`__[^_?S\_/S\_/S]_?[^_P```0(#`P0%!08& M!@8&!@8&!04$`P(!``#__OW]_/S\^_O\_/S\_?W^__\``0$"`@,$!`4%!08& M!@8&!@4%!`,#`@$`__[^_?W\_/S\_/S\_?W^_O\``0$"`P,$!04%!@8&!@4% M!00#`P(!`/_^_OW\_/S[^_O[^_S\_/W]_O__```!`@(#`P0$!04%!04%!04$ M!`,"`@$`___^_?W\_/S\_/S\_/W]_O__``$"`@,$!`4%!04%!04%!`0#`P(! M`/_^_OW\_/S[^_O[^_S\_/W]_O[_```!`0("`P,$!`4%!04%!04%!`,#`@$! M`/_^_OW]_/S\_/S\_?W^_O__``$!`@,#!`0%!04%!04%!`0#`P(!``#__OW] M_/S\_/S\_/S\_?W^_O__```!`0(#`P0$!`4%!04&!04%!00$`P(!`0#___[^ M_?W]_?W]_?[^__\```$"`@,$!`4%!08&!@4%!00$`P("`0#___[]_?W\_/S\ M_/S]_?W^_O__```!`0("`P,$!`4%!04&!@4%!00$`P,"`0$`___^_O[]_?W] M_O[^__\```$"`@,$!`4%!08&!@4%!00$`P,"`0``__[^_?W]_/S\_/W]_?W^ M_O__```!`0("`P,#!`0%!04%!04%!04$!`,"`@$``/_^_O[]_?W]_?[^_O__ M``$!`@,#!`0$!04%!04%!`0#`P(!`0#___[]_?S\_/S\_/S\_?W]_O[__P`` M``$!`@(#`P,$!`0$!04%!`0$`P,"`0$``/_^_O[]_?W]_?W^_O[__P`!`0(" M`P0$!`0%!00$!`0#`P(!`0#__O[]_?S\_/S\_/S\_/W]_?[^__\```$!`0(" M`P,#!`0$!`0$!`0$`P,"`@$!`/___O[^_?W]_?W^_O[__P```0("`P,$!`0$ M!00$!`0#`P(!`0#___[^_?W\_/S\_/S\_?W]_O[^__\````!`0("`P,#!`0$ M!`4%!`0$!`,#`@(!`0``___^_O[^_O[^_O__```!`0(#`P0$!`4%!04%!`0$ M`P,"`0$`___^_OW]_?W]_?W]_?W^_O[___\```$!`@("`P,#!`0$!04%!04$ M!`0#`P("`0$``/____[^_O[_____```!`0(#`P0$!`4%!04%!`0$`P,"`0$` M`/_^_O[]_?W]_?W]_?W^_O[___\```$!`0("`@,#`P0$!`0%!04$!`0#`P," M`0$```#______O[^____```!`0("`P,$!`0$!`0$!`0#`P("`0$`___^_OW] M_?W]_/W]_?W]_?[^_O___P```0$!`@("`P,#!`0$!`0$!`,#`P("`0$``/__ M__[^_O[^_O[__P````$!`@(#`P0$!`0$!`,#`P(!`0``__[^_OW]_?S\_/S\ M_?W]_?W^_O[__P`````!`0("`@,#`P,#!`0$`P,#`P("`0$``/_____^_O[^ M_O___P````$!`@(#`P,$!`0$`P,#`@(!`0``___^_OW]_?W\_/S]_?W]_?[^ M_O[___\````!`0$"`@(#`P,#!`0$!`,#`P("`@$!````_____________P`` M`0$"`@(#`P0$!`0$!`0#`P("`0$``/___O[^_?W]_?W]_?W]_O[^_____P`` M``$!`0("`@,#`P,$!`0$!`0$`P,#`@(!`0$```#_________`````0$"`@,# M`P0$!`0$!`0#`P,"`@$!``#___[^_OW]_?W]_?[^_O[^_____P````$!`0$" M`@(#`P,#!`0$!`0$`P,#`@("`0$`````________`````0$!`@(#`P,$!`0$ M!`0#`P,"`@$!``#___[^_OW]_?W]_?W^_O[^_O[___\``````0$!`0("`@(# M`P,#`P,#`P,"`@(!`0$```#___________\````!`0("`@,#`P,#`P,#`@(" M`0$``/___O[^_?W]_?W]_?W]_?W^_O[^_____P`````!`0$!`@("`@,#`P,# M`P("`@(!`0```/______________`````0$"`@(#`P,#`P,#`@("`0$``/__ M_O[^_?W]_?W]_?W]_?W^_O[^______\``````0$!`0("`@(#`P,#`P,"`@(! M`0$`````__________\````!`0$"`@(#`P,#`P,#`P("`0$!``#____^_O[^ M_?W]_?[^_O[^_O[_____```````!`0$!`@("`@,#`P,#`P,#`P("`@$!`0`` M````_P````````$!`0("`@,#`P,#`P,#`P,"`@$!````_____O[^_O[^_O[^ M_O[^_O______```````!`0$!`@("`@,#`P,#`P,#`P("`@(!`0$````````` M```````!`0("`@(#`P,#`P,#`P("`@$!````_____O[^_O[^_O[^_O[^_O[_ M_____P````````$!`0("`@("`@,#`P,"`@("`@$!`0````#_______\````` M`0$!`0("`@(#`@("`@("`0$```#____^_O[^_?W]_?W]_?[^_O[^_O[_____ M_P```````0$!`0$"`@("`@("`@("`0$!`````/___________P````$!`0$" M`@("`@("`@(!`0$```#___[^_O[^_?W]_?W]_O[^_O[^_O[_______\````` M``$!`0$"`@("`@("`@("`0$!`0````#__________P`````!`0$"`@("`@(" M`@("`0$!``#______O[^_O[^_O[^_O[^_O[_________```````!`0$!`0(" M`@("`@("`@("`@(!`0$!`````````````````0$!`0("`@("`@,"`@("`@$! M`0```/_____^_O[^_O[^_O[^_________P`````````!`0$!`0("`@("`@(" M`@("`@("`0$!`0$``````````````0$!`0("`@("`@("`@("`@$!`0```/__ M___^_O[^_O[^_O[^_O________\``````````0$!`0$"`@("`@("`@("`@(! M`0$!`0`````````````````!`0$!`0("`@("`@(!`0$!``#______O[^_O[^ M_O[^_O[^_O[^_O___________P````````$!`0$!`0("`@("`0$!`0$````` M`/________\```````$!`0$!`0$!`0$!`0$```#____^_O[^_O[^_O[^_O[^ M_O[^_O[^__________\```````$!`0$!`0$!`@(!`0$!`0$```````#_____ M__\```````$!`0$!`0$!`0$!`0$`````_____O[^_O[^_O[^_O[^_O[^_O[_ M_________P````````$!`0$!`@("`@("`@("`0$!`0$````````````````! M`0$!`0$"`@("`@(!`0$!`````/_______O[^_O[^_O[^____________```` M`````````0$!`0$"`@("`@("`@("`@(!`0$!`0````````````$!`0$!`0(" M`@("`@("`0$!`0````#________^_O[^_O[______________P`````````` M``$!`0$!`@("`@("`@("`@$!`0$!`0```````````````0$!`0$!`0$!`0$! M`0$!`````/_____^_O[^_O[^_O[^_O[^_O[^____________``````````$! M`0$!`0$!`0$!`0$!`0$```````````````````````$!`0$!`0$!``````#_ M______[^_O[^_O[^_O[^_O[^_O[^_O[___________\``````````0$!`0$! M`0$!`0$!`0````````````````````````$!`0$!`0$!`0````#_______[^ M_O[^_O[^_O[^_O[^_O[^_O____________\````````!`0$!`0$!`0$!`0$! M`0$!`0````````````````$!`0$!`0$!`0$!`0$!``````#________^__[^ M_O[^_________________P````````````$!`0$!`0$"`@("`@(!`0$!`0$! M`0`````````!`0$!`0$!`0$!`0$!`0$!`0``````____________________ M_____________P````````````$!`0$!`0$!`@("`0(!`0$!`0$!`0`````` M`````0$!`0$!`0$!`0$!`0$!``````#__________O[^_O[^_O[^________ M_____________P`````````!`0$!`0$!`0$!`0$!`0`````````````````` M`````0$!`0$`````````_______^_O[^_O[^_O[^_O[^_O[^_O[^_O______ M_________P`````````!`0$!`0$!`0$````````````````````````````` M`0``````````_________O[^_O[^_O[^_O[^_O[^_O[^________________ M_P`````````!`0$!`0$!`0$!`0$````````````````````!`0$!`0$!`0$` M````````________________________________________```````````` M`0$!`0$!`0$!`0$!`0$!`0$!`0```````0$!`0$!`0$!`0$!`0$!`0`````` M`/___________________________________P```````````````0$!`0$! M`0$!`0$!`0$!`0$!`0```````0$!`0$!`0$!`0$!`0$!`````````/______ M__________________________________\```````````````$!`0$!`0$! M`0```````````````````````````````````````/____________[^_O[^ M_O[^_O[^_O[^_O___________________P`````````````````````````` M````````````````````````````````______________[^_O[^_O[^_O[^ M_O[______________________P`````````````````````````````````` M``````````````````````````#_________________________________ M_____________P`````````````!`0$!`0$!`0$!`0$!``````````````$! M`0$!`0$!`0$!````````````__________________________________\` M`````````````````0$!`0$!`0$!`0$!`0$!`0$!`````````0$!`0$!`0$! M`0$`````````````______________________________________\````` M``````````````$!`0$!`0$!```````````````````````````````````` M`/_______________________________________________________P`` M``````````````````````````````````````````````````#_________ M______________[___________________________________\````````` M````````````````````````````````````````````________________ M____________________________________`````````````````0`!`0$! M`0``````````````````````````````````````````________________ M________________``````````````````````````$!`0$!`0$!`0$!`0$! M`0$``````````````````````````````````/______________________ M__________\```````````````````````````$!`0$!`0$````````````` M``````````````````````#_____________________________________ M__________________\````````````````````````````````````````` M`````````/__________________________________________________ M______________\````````````````````````````````````````````` M`/__________________________________________________________ M_P`````````````````````````````````````````````````````````` M`````/________________________________\````````````````````` M```````!`0$!`0$!`0$!`0$!`0`````````````````````````````````` M``#______________________P`````````````````````````````````` M``$!`0$!`0$!`0$```````````````````````````````#_____________ M________________________________________```````````````````` M``````````````````````````````#_____________________________ M______________________________________\````````````````````` M`````````````````````/______________________________________ M____________________________```````````````````````````````` M``````````````````````````#_________________________________ M````````````````0T]-30```!(``0``+!8`"$`-K$0```````!-05)+```` M`@``24Y35````!0\``!_`'\``````````````````$%04$P```&H4V0R80`" M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M``````````````````````````````/@```````````````````````````` M````````````````````````````````````````````````````!`@````` M``D`(P````````````````!X````!``$``````"[_`#___^``````0&H!E%5 M;FET````'@```!6`&X`9P!:`$L`.P`H M``W_Y_^W_W7_)/Z^_D+]M/TI_,8$2&%R<($"````04E&1E-D,F$````````` M````$J<`````04E&1E-D,F$```````````````````````````````"G/:V/ M```N(@```Y];5XN3E\?GS^`D-"Q4G,2\Q-3(L*RXF*#H_,QX4&Q3ZZ^SIX.#= MS,?1SK^YOL_C[?D-&1L:&"$O-3M"0D5,0SI(6E`^."T?&Q0#[^'5R,3$O;V_ MKZ*HNY ML;*\QM3A]`L,#"<^3%I0.3=#1DQE;E];5S\E$__KY./6O[:VKJ:ML:*5FZJY MSN;U`0L1$Q,:*#I/6%%,3E5>75-%,B,@'@X`_>W2P[6GL;VUL;2RM+C#V.7L M^/\%$R4X0$5.2T%$2#X[361;/#`O'Q02^]"ZP,2ZN,#"N*^FG):BR>WR[P$7 M%A0M/S8O-#],6&EY=V=)(`D1'A<*"?O7PKZYKZ2>I*BDKLO1S.#PXM7>]0\M M3EY22$4W*"TU-T-*0"L?(QH&[DYVQP]#7V^@"&"`C*"@@ M'"4O/4U35U,[)2$>"O7S\^#1U-3%NK:NHYR9F**ZSM7AZ^/644T*!T%Y,_,T]C=Y=W`JZ>DH:*NQM_P_/X#'"P>$AD?*$1@9%E34TDW M,#,N)1X3`_'HZ.'.OKFWL;6ZM+7$S]?F\O7W_@P<*3`W/4-,2T9`,BXW/#0L M+S(F%/G4O\;.S/=Z?'ET+^UM+BPI:K`UN+N]O/U!108$0D3*#M!.S8X-"@B(2$K+R@B$_OP MZMW3QKJWM[F^Q,.YL;.]U.SZ!Q`6(24A'1TG,S(O,T%/3D`U*QT1"0#QX-7; MX=6^M+>XMK*NM<+*V/`!"!0;%A`,$"$T/D)!/#Q#0SPR&P<#!`D/`^C1P[>O MKJ^PM<#%O[O(Y?;X^_KY#B\],2HS.#(L+S4X0U)--2XO\K.P[BTL;?) MW.KS^/H"'3Q%-B8D)!P6*$A64U1+,QP2#@/SZ^;?V];/R<:\JZ.IM;[,Z0<1 M!O\#"!$A-#\_/3T_1%%93CTW+!H7'AP0^M[)N;*YP\"VL[.SM\#0W^+I\_,` M'2\W/SXL'"$S04E/3D4^-BLD&PX%\]K,S<_/S,6WJZ>LM,#6ZNSP_PH(#",V M,RHG+C8X0E%00S@O(!PC(!``\=O&PL?*Q;RSJJ*HNL3*W.;=W/41'"0M-S4H M*#8\/4%$/"\J*RHJ(Q+XW\_$OL++SL2WL:JGK\#+SMGO_P0-("LF(1T:)CE" M2DY%/38K)RHF&A(%Y\[.U-#%N*ZKIZ>PM;?"S='8Y?@+%QT?'!XK.CX_14,Z M-S0J*38]+`SSY]W1Q\;+Q+FXM;"UO<3*R\W9[PL>(A\>("`@*C0]148_-C0[ M03LI&`CSYN7AULS%P;ZTJZVRM+S$P\KA^PP3%QH9'2HO+CM/4$$^/38X04,Z M)1$$_/#;R+^YM[>TLK6ZNKBYN\'3[@88)"@H*"[J MW\J[N+:OJ[&YNK2RNL35[?P!"A@B*C`R-3]#/3TL:ZKI*2O MNL?7W^K_!@$.*#8_0CL]1$%!2U!023PS+R06"?GFS[ZZO+RWLJ^HI*2FK\'. MV>S[_P84(RTT.CT\0$=/55%(2$0V*24?$O_FS\&YM+2ULJVHJ*NLL+W,V.'H M^1$@*#8^-S(]2$='4%A734`Y-BXA#_GJVL>_P;VVM+.MIZ:MO,7*U.'O_@\B M,38Z04,_04]=75504$U$.S$C$_[FU,K!NKN_MJ>AIZVML;[,UN'M_1,D*"X[ M0D!'5%A555E63$5`.SDN%/WMUL&^O;2NKJZLJ*:MM;K`S=OJ_A$A+S4U.4%% M2$]87EI134U(0#4E$?WLW,W`N;>RK:FFI:FPM;B\Q=/H_A$?*#`W/D)"2%1= M6E-,24I(/B\@#?KJV\_&N[*MJ:*>HZRQL;:_QM#B]0<;+#4W.T%'4%-03U!2 M4TU&0C8A#O_IS\;)PK.JIZBGHZ2LM+:[Q=3F^@\A)R@P/D=)3%):751+2TY+ M13DB!_?QZ-;!MK2RJJ.AIJVRM+6XO\[F^@40(C<^.CY*45164E%345)42#$= M%`;MV<[*Q[JII*6FJ*BLL;:]Q]+<[`@A+"TQ/4I355)-35)45%122T(M"N[F MYMO*OKFVKJ2@HZ2GK[B\P,WE_0@*$B,S/T=.55I844E'2U%643PG&0SVWL_( MP+:OK*JHJ*JIJ*FQOM'F]P,1'2(J-D)-65Q33E)64U%12CHI&PS^[=W,O;&G MI*JNJZBHJJRON,S@\P42&B4O.TA/3DY25%-56EI52SHG%PT"\^+0O["LK:FI MK*NIJJZTOLS=[?X.'"4P/DA04TU+3E%67V)92CLK'0[_\^;5P[2LJZRMK*:D MIZJPP-'>[O\'#QXN/4I14E%.35-;7UI01SDI(1L/_>;*M[.MIJ:NL*BCI:FN MN,;6YO+_%"HX/4%%1T9"151@965803(L(1(%^>[;PK.OJZJJIJ*BHJ:RP,G1 MW^[Y!!DS0TM.2D)$3UE>8&!:3D`P(Q@/_N;.OK:OK*RIHIZ>H*:MNLK6W>;T M"1XP/4)(44Y&2U5:7%U82#@U,B$,^>/+N[.OL+*OI9Z=GJ&LOH*BRN\/+T]WP"24Z03]! M1TI)35EB85I23$4Z+B02]=K)PKRVL;"KGY>6GJBPN,?4V.'T"B`R.T1,24E6 M7EU=6E-12T%!/"969E M74]$149!.BP8`.3/Q+JQK:FBGI^BI:JQM;:]S-[X`.SI`0DA58FAD8F%9 M3TI$-!X*].#5S,.[L:6:E9>:H*NTN+J]R=[V"AXR0$5#1U1>8%Y;6596659+ M.B0-]-_0QL"\M*B=FIF9GJ2JK[;"TN'T#"(O,C8_35]I:&1A6$]/5%1,/RX4 M]=_7S+ROJ*2@G9VAHZ6FIZNUQ>($'2@M,3="2D]<:VQD86%=6U=&+1@)_?#D MU<.VJYV3D9:=I:NJJ;"XQ-KU"ADK/$1)5F%B7EM97&%C8UY/.2(+]>7Z MK*"9FIJ8G:2CI:^_S-WT!A0C,3Q+66-H9EY85EA<7UM202<0_NS8RL*WJ:*? MG9ZAH9N9GZFWS>?["18B*S5!45UB9F=D8U]=8%A%,2`1"`#OVL:RHYR:F9R? MHZ6CHJFVP]3I_!`@+T)25UA<7%=35F!L;F!,-R,1`/'GW,FWK*2=FYZ>F9>; MHZV[S-CD^@P6)CQ.769B5E-87&!E95]20"P8!_KLV<2TK:JEGY^?F9*4GZJU MR>'O]?X,(SM)4%MC86%C96=D7%A0/2TI(0GLUL.SIZ"@I**?GIJ9G*.PP,[@ M]0L?+SQ*4E945%MF;7)P:%Q+.2TD$P/XX\FXK*2CH)N9EY27HZRRO3D$T)`[QWM7,P;:KGY60D9*6GJFRN;[$S^D*(#!`3E9;7E]?86-E M8EI:6U-"*@SRX='"N;*LIJ"7D(^4FZ6KKKG*W/`%&2P[1$M25V!M<&5=7%Y? M6TX\*1D$ZM3&N[*JHIJ4E9F;G)VAJK?#U>T"%BLW/49066!D9VEF9&-=54Y# M+18"[MS,O[6JG9:7EY.5G*6IJ[+`T^C\#B4[1DI586-?865C7%QG:EI#+QD" MZM?,P[:KIJ2?F).3EYN@J[G&U>G_$1LE-D=37VIM:&)?8F1@651+."`(].32 MP+2KHYN7F9N8E9FBJ;&]S^;\#APJ.4=5865E9F5I:V5?7%E-.B,+]N75P[2I MHIV9F9F9F)F=IJZYR^3["18H/DI/5EQ?8V=H:6AG8E1",2$._N[6Q+BKHY^: MEI>7E9B?IK&^R=GO!1@H-T9/56!J:&5H:V=A6U5+.RH7`.K9R+6FGYRHJJVQ]KM!!DJ-T966U=99G!N;6UF7E5(."H:!>[:R;BKI)^\@VOL/4\@P?,3]* M6V9F96IQ<&QI8UI22CXE"O;DT\&OI:&;E9*0D).9H*:JL2S,@$@#HT<&VK*&9E(^-D)69G*.LM<+2Y@$:+3U+56%L;FQN M;6=I;FI>3STG$/CDU<6XK)^6DY&/CHZ2FJ.LM\31Y/P/(CA+661K:VIN<&MI M96%?5T,L%/WHU<&RJJ.'%H96=E5T,Q(`_Y MW\BWJJ*=EY&.CI.7EY:?KKW-W.T$'C1#351B5D@R'P_XWLF[ MKJ2;E)&3DH^,D)JEK[K'U>P(&B,V4&-I:6MU>'!L:V-=5THY)`[YYM.[J)^< MF9:2CXZ0E)>4T8S)!8!ZM&YK:B=DY*2 MD(^0D)>AI['!T.;]$BE`3%5A:FYN;W)V=&QD5D0X*!'^[=6_M:F;E9*/CH^/ MD9:?J[?!R=GV$R8W35]H:FIMA MIZV[TN;V""(Z2U5<96YP='Q[<&AD74\[*!P/]=C#M:NBFY:1C8Z1DY.:J+>^ MQ-7Q#B,W2%)<9VYS=7-Q=G1C44E%.2`$\-_*MZFAG)6-CI*0CYBAIJNVQMCN M!ATV2UE?9&AJ;W=Y<6EE8UQ%+AT*\-G)NJ^GGYB2BXB-DI:;HJV[QM3I`1HP M/TQ98VQS=7)P;FEF85-%.B4+]-[*N["HH)>0CHR-CY.;I*RUP-'H`!79R;6AE7U9-0"D.^N3,O;.HGI:2D8^.D)28G:>SP=/F_!S4PK>MH)22E)&0DI.6G:6POLW@_!0C+T!48FMQ=7=W;VAH M95U00C(:_^O9QK2HH)N5CXZ1E)24EY^JN MT<&QIYZ5D(^0D)"2F*&KN,G9ZO\4)3=-86YSWEP;&I>2C@K&@3OVL2SI9V;F92/ MC(V0DYBDLK[-X/(%'C=(56!I<7)O6D8Z, MCI>DK[G'WO4)'3-&4UQC9FQV?'MXG_&31*5U]D:FYR='5W=6M>4D[LJB>EI.0C8N-DIFCK;7" MU>?\&#)#4F!I;&QQ=W5R;FID64LZ)Q+YW\NZKJ:AGYJ1C(R,C9*=J;?$TN@# M&2D[35998W)^?WMY_KZ:I*ZZR^7_&#)" M25=C8F1N=7EY=&MC6DHW)Q?]X=+'N*NCG)2.BXR.D9>>IK"\R-OX$B=I*RVP]7L`QPU2%):9W-V<&UN;FUI M9%M+-B`([]G(P+BLGY:1CXZ,BY"7H*RYQ-7O!A4E-DQ@;71U[8Q+6FG)B3CY"1DI26FZ2PO<_D^Q8K.4I;86-KS: MRKNMHIJ6DH^/CX^4G*:QO=#H^@D=,D)6:&YO<6]N<&QF8%I00B\9!?/=QK6L MHYN9F9:0CY*3EI^MOM'D]PPA,T%,5V5N,D116F!E:FYU>G9M95Q-.RH<"_GHUL.RIIZ:EI", MCY*5G*6NN<33Z``3*D=97&%I;6YK9VIN:%Y52#@C#?OFSK^VK:6@FY>3CXN/ MF**MN,35ZO\3*3U+5F-H:6QP3CXV0EZ"K MN,//X_L1)SU.6%M@:W%R1C8R.E9^KML#+WO@0 M(2\^46%H:W!U=FYD6U--3$DZ'@#KW,NYKJFDGYJ4CY"4F9VBJ[K/Y/<,'S)$ M35%=;GAY=FYE75I73#\T)Q+WV\:ZM:^CF965EI64E)FBK+G'V?85*#4\0DY@ M:W%V=6]L:5U334,R(`OTY=?&N*ZCFY61D9*4F)ZBJ;7&V_,'%R@Z2UAA;75W M=&QC75Q<54DY(PW[ZM7$N:VCFY:4EIB7EIB=I;+$V>X%&BHW1U5>:&]Q<6QF M9FA@440V)Q+ZY]O/O:RCGYN5DY25DY6=J+/`UO,)%2`P0%!>:'!U<6MJ:V18 M3T:&UM:VAD96AE6$0R M)1D'\MW-P;:HFY:7F9J8DY*8I+/!S^/[$2(P/4M>:VUH9VYO:F5@5D@U(1,( M^NK9QK&BG9^?F).3E9B=I;"_T>/S`1$J0U9?8&)J;69E:&1=5T@T)!<-`NK/ MOK:LHYV:F9B5E9::I+/!S=GI`1PP0%!=9FEE865J;6YE44([+QX+^>C8R+BM MI:&=FYB1C).?J;&]RMGL_@XC/E)<8&-E:&UN:61;4DD]+!T2!O+4EYB_>J;.ZQ-'C^1`F/4]87%M=:'-T;6=A54<]-"H:!?+@S+VUKZFBF9.3E)>? MJ+&YPL_?\PLE/$A-5V-G:6]P:F!53TU$.3`A"O+;HJRV MP,W?]0HA-T%&359E<7-O;&1634E"/#,?#/K@RL*\LJFCG)>6EI:;I*RRNLG= M\08>,SU&4%ME:VUP;6)74$I(0C`?$?G@T\F]LZVFG9>3E)J?HJBSO<;6[P<9 M*#9$3UIE;'%P9EM644Q)13HF#_KGULB_N*^DG9J8FIRMM<7;\P@8)3,_ M2%5C;71R:&%:4D]+/S,F%`#PX,_!N*RBG9N:FY^@H*2JM,/4ZP09)3`\2%5B M:6UM9V%=6%%+0S4C$/[RZ]K&N:^CG)J:G)^AHJ2HL<#2Z@$0'S`[1E5A96IL M9V%<55=81"XB$P3Z[-K,OJ^DGIJ9G:&BHJ&EL\32X?,)("TU1EID:6AC8&!@ M7UQ1034H%@;XZ^#1OZZEH9V?H9V:G:2JLKW-Y/H)$R(W2UA=8VAE9&5A6UA4 M2SPF$@D"]^;/O;.LI:">G9^AGZ"HLL'3W^P`$R0X2U1;8V9E9&)@85]51#,G M'Q,#\N+0P[>IH*"BHI^;G**IL;[-V^S_$2(T1E9A95];7V=I9%M01CTN&0L% M^NG7Q+2MJ:6AG9R3U!QPU2%5=75MD9U]:7EU523DI)!D%].31 MPK>OJZBCH)Z;FIZGL\',UN3R!1XP/4]965UF96!@7E9.13HN(Q@*^^C0P+FR MJZ>EHI^ MGJ.JL+O*U-KG`!PP.D-.5EU@8&5H74]+1SPT,281^^C:S<*XLJ^LI9^>H*.J ML[K!RMOU"A0A,T%)45A>9FIE7%)'0D$],B(2!?3>S<.\MJ^II**BI*>JK;6^ MRMON`18J-CU"2E5?9FEG7%%+13XY+R(4!._?U,G`MZVHI:*AI:JLL+6[QM;I M`!6%%+2DI#,1\3!O3EVL_&N[&KI:&FJZNJJK*^R=7I_@X=*S9` M2U-<8V-;5%143D8[,",4!/?NXM7*NZRFIJBIJZRKL+6XPM3H_`H9*3=#3UA; M5U596U=034Y&,A\/`??PYM?)O+2NJ*2DJ*NMKK7`R='?\@02(#5)45-:7U=. M3E!36%%"-RD3`OCLX=?,PK>NK:RII:*DJ[6_R]OG\?T*&"L\3%MD7U135E!* M24<]-BX>#@'RW]#%N[.PL;&PJZ:FJ:ZVP];G]0(-&BT]1$U75U9865A43TE` M,"(:$P?WZMC&O+:RKJZOK*>GJ["ZR-/=[/P,'3$_1TU14%!76EA75$IKK6^QL_;ZO8%&B\^2E)245185U943D=!.2XB%PS^ MZ=/&P;ZYM+.PJZBGJ;*]QLW:[?L('C(\049+4%576U]=4D,V+RPF&P[]Z]S. MP+JXM;&MJ:JNL+2]P\C3X/,-(R\Z1$=$2%)965A744<_-RLA&@[YYMK3R\.Z MLZ^KJJJKL+>]P\G3X.\&'BXU/$9,35%765A324`[/#DL'`[ZX];0R\.]NK2L MIZFNL;2YP,G6Y/4(&B8O.D%$35EA7U5*1D([-S8O(A']Z]_4R<"\M[*RL:^P MLK>ZN\'.X?@.'2DS.#M!2E!66EM73$`_0#@I&`G\\.3;UL`%B@Q-C]-5%974DI'1DE-1CDP(0KWZ=_;ULO"O+*LL+"LK[>[OL// MXOD(#AK9S\K!NK6PK[2WM[2QM,'0W_0* M%!LG,#=!3%%35%)/24=(0C0H'1#_\N_IVLJ_M:VML;.UMK2VO,/+V.T`#![DV\_"NK6UM+.RL;"SN\73Y?+[!0\9*#E) M5E=22TA(1T5$0SPQ)!<+_N_BUYM[6SLK.YP,3,V>;O^@D9*SU*3$=#0D-+44U) M0SLR)Q@/"/WKV[O;_$S]OE^`\@*"DO-SD]25!23T<^.C8Q*R@@$0'QY-S6SL7` MNK2WO+N[P,3'S-7C]@<7)S$P,SU$1DI+2$4_.C@V-"P=#`#RX]S:T';T<>_N[NYN<#" MP+_"Q]+E^@D7("8M,#4_1TQ.24)`/3@T+24<$`7\\N?=U,BYL;6_P\/!P<+! MQ-#?[P(6)2PM+SI%1$!!0D-$0S\[,B48"_SS\_+FU[@T_?T?U!!`;(RDV04%"2$8Z,2LG+#(M(AH0`?/MZN38S3>TL.ZN\#&R\S+R\G+ MU^?U`0X;(BG?U,?#QL;&R,;!PL?2X>OR_P<%#B`N M.TE)03LV,C,T+RDD'1D2!P($`>_9RLC*QL7)R<3!PL?2WNCU```"#R$S041" M/SLU,30U+RPI&PP-$P\$]NG>U&QH4$P\#^.S:T<_*RL[+P;V_PT]#-R\O%P<+`Q-/9UMSEZO0%%"0X.C0T-3@^04`\+R(:%A<9 M&1,,_NOAW=?3S<*]P,#`R]C:UMCSHY-O5TL>\N+K!RM#6V]S:XO(!$"0R,R\P.$%%0CTU*1X9&2$B&A(+^>CC MY.3S;RK^ZNL') MS<_.SM+9Y?,"$1<8'S`_1DE)034I(B,F*2DF'`X!^/7V\>37S<2]O\?,S,G% MQG6Q+V^P,7-T76QL#`P\C+R,;%PL;6[?G^ M!`8-'"X[2$]'.3$J)RDM+BD@$0@+"?[Y].?5QL+%RL[*Q+VZO\S=[??^!`4* M%R@Z1TM(/SO9S)RDA%`?]]_'K MY=[0O[>YNK[)TM+,Q\G7ZOL,'"4K,#,Y0D4_.#$G)2@L+2@?%P?V\/#Q[.'2 MQ;VYNL#%Q\?)SM;=Z/P0%Q<<*3=!1DE)03`B(B0B)BPJ'`K^_/?LX-?/R+^[ MP\O*Q\2_O\K<]`@-$AXB(RTZ0TM)/34N(R8P*Q\;%P\'`?SW[MO&N[R^P,K3 MSL/!Q#-P;_!P\3%PL'$ MR='=[OP"!0X=*C1"3DH\,R\I)2DM+2H>$@X,!?GOYMC)Q,7'R[Y M!A0A+SQ"0#DQ*BPS.#@Q*20;#`0'"@7[[^'0QZ.WN\P4> M,3]+2STT,"LG*2XR,2L@%1(0!OOPX]G6U]#(Q\.[M[B]Q]?EZ^_U^P,2)39! M0T`^.C,O,C$J(1P;'A\:#P'SY=;/SLS,R\?"O+J\Q=/#6RLC)Q<&^OL#%S=/7W./K]00<,3U`.3,W.30S M,RTH*"8D(1L5$0/NXMS:W=C*P\.]M[C`R=#8X^GK]@P<(RLS-SU`/3L].2TA M&APA)28A$P#S[.'6S\[/RL*_N[S%R\K-U>'Q!`\4'RXU-#4Y/3]`.B\E'QX? M'QX<&`KV[.?=TLS(P+W`P\7'QLG0U]GA]PX=*3(V-S0S.C\X,#$Q)B$D)R09 M!_SZ\>7BXMC'O+N[N;[(R\S0T]OJ]P$0(RLO-CH\0$$Y,2PD(2HL)"`<$@;[ M\.GCV=#+P[NZP<7%Q,7*T=GF]@85'R4N.#HX/#XX,R\L+"%Q$&^O7PW\S$Q,;%P[^\ MP,7$Q]3C\OX(#18C,T!#.S@[.#`M*RHM+"8B&0T(!_OHVM/,R,._P<7`N[W# MS-7A\/H`"ALH+SA`1$,Y+BPM+S$P+"+#<_0SXX-C4R,3`I(B$A'QH0!O_RW,W)RLC#P[W"1LC M*#$\/S@Q-#DV-#$K)R0B(AT2!?SSYM;-S,W)P+JXN+S#Q\W8XN_^!@P:*C0X M.#8X.ST\-"#_[QY-G1R<7$P\"^O\"]O3R!A@D*R\R-#8X M-S8W.#4O)B`A)!X6#P+TZ^+5S,7`P;^YN;_'S,O,UN/O`18C*C(U-34S-3HZ M-C$L*BPK(A@2"P/YZ^#;US\.^N[N^P<#"QL7(T=WK_@X:)"PQ-CDW-CDV-#0Q+RPI)B$8 M"@'_^>O=TLW&NK2XO<##Q<;+T=WN^@,1'RHS.3L]/#DT,"PH+C@W*R(<$@3U M[.WGV=#)P+R[N[R\N\',V>3N^P8-%1\I,S]&1#DS-3,L)B8N-"T?$PK_]>SB MULW%P<7#NKG`P<#&S]ON_0()%R,J,CL_/#@V-3$N+C`R+2`8%@\$^^_CV\_$ MP;ZYO'AL1`?;QW\K&R,;%P[VYNK[%SM;< MYO8$#A4>+#H]-2\R/#\W,"XH)R8A&QD5#/_KUWT`!4E*2PO M,#,Y/3PW+BOW``L8("$D+#4W-C;U`0D0%!DF,3$M+2\M)2`E*RXI'A41 M"?_\_//DV]7,QLC.TM'-RL_9X>CT_@$%$!LB*2\V-RP?'2(E*"HF(!H1"03] M^//IW=+,S-+2T,_-S,_7X.OU_0$$"A0@*S,T+R@C(R,A)"@F'QD5#@)RTM*2&101$@\&_?7KX-G6V=O9 MU=+0T]C>XN?O]?K_!A(@)R(!\>'R$>%A$4%Q@7%0\'_O?Q[>GHY^3@W=S>X>/CY.;K\/;^!PT1 M%A84%QXA(1\;%Q43$A,5%`X&`/GT\O#JYN+>WN'CX^7FYN?I[//_"`T/$1,6 M&1L;'!P9%105%185$0H#_?KY]_+LY^/AX>'BY>CGYNCL\/?^`@<,#@\3&1P< M&QH6$A`2%!84$`P&`?SX]?/NZ.7DY.7HZ.;GY^CJ\/D`!`8)#0X1%1@;&Q@4 M$A,3$A,2#0@%`P#]^?3MZ>;EY>?JZ^KIZ.GM\O?[`04("PX3%A86%A01#Q(5 M%1,0#`@$`/[]^_CR[.GHZ.GK[.KIZ^WO\OC]_P`#"`T3%185%!$/#A`1$1(1 M#0@#`0'^^O;R[NWL[.WN[.KJZ^WR]OK]_@`#!@H.$104$A`/$`\/#PT+"0@' M!0+^_/GR[>SM[_#P[^_N[>[R]??Z_@($!PL/$`\-#0X.#@\1$`T*!P4#`P(! M_?CU\_#O[_#P\._O\?/T]_KY^OX"!@H-#@\.#`L+#0T,#0T*!P<&`P'__?GV M]//S\_/Q\?'Q\O3V^/K[_?\``P<*"PL,#`L+#`L*"0@'!P<&!0(`_?GW]?7U M]?7V]//S]/7V^/K[_?\!!`8("`@("0D+"PL)"`<&!00$`P,!_OOY^/?V]O;U M]O;V]_?Y^OK[_/T`!`8'!P@'!P<'!P@'!P8%!00$`P'__?S[^_KY^?CX]_?W M^/K[^_O\_?\``0,$!04&!@8&!@4%!`,$!`0#`@$`_OW\_/S[^_OZ^OKZ^OK[ M_/W]_O\``0("`@,#`P0$!`,#`P("`@("`0$`__[^_?W]_/S\_/W]_?W]_?W^ M_O\```$!`0$!`0$!`0$!`0$!`0$```#___________________________\` M```````````````````````````````````````````````````````````` M``````````````````````````````````````````````!#3TU-````$@`! M```T%@`(0`VL1````````$U!4DL````"``!)3E-4````%#P``'\`?P`````` M````````````05!03````:A39#)A``(````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M`H`````````````````````````````````````````````````````````` M```````````````````````$"```````"0`C`````````````````'@````$ M``0```````#\`/___X`````!`0`&455N:71S```````````````````````` M`````````````````0(`!B!S86UP````%;_^?_[__S_^__\__S__/_]__W__?____X````"``$``P5& M;'5T90(```!!249&4V0R80`````````````2J0````!!249&4V0R80`````` M`````````````````````````*<]K;```#8B```!S@"*`(``@0!T`&$`5P!' M`#X`-P`U`"X`'P`A`!``#``5`!<`'0`8`"(`*0`P`#,`-`!"`$@`/P!#`$4` M0``R`"X`-@`F`"``)@`<`"``)0`B`"(`(@`@`"D`,``D`!X`&0`-``;__O_V M__W_^O_S__;_^@`&``T`#P`8`"(`*0`O`#H````:`"D`#P)J`S$`*@`#`FT# M/0`I``\"00,B`0`````:`"D`#P%0`?$`*@`#`FT#/0`````````````````: M`"P`%@$^`=P`*@`#`FT#/0`````````````````:```````````````````` M``````````````````$````!>````'@```!6`'&XO!RF````'`!6``!7```````#__\````\```````$__\` M``!:```````````````````````````````````````````````````````` ,```````````````` ` end slashem-0.0.7E7F3/sys/share/sounds/erthdrum.uu0000664000076400007640000015006310545462317017321 0ustar alialibegin 644 Drum_Of_Earthquake M`!)$CK[>_P\O3V^/K\_@`"`P4("PT.#A`3%A<7%A@<(B8G)B0E*2XQ+RHG*"XU M.SLW,2XR.T-&0SLS,39`2U-434`Q)2,K/$U96E%`+!H-!@P>.UMQSGX=S7TLS'PKZZM[6TM;:Y MO<''SM?AZ_<#$!PI-$!*5%QE;&]O<'!O;FYN;6YM;FUL;6UN;FYO;W!P;VUJ M9V1?6U=44U-55EA:7%UA9FQQ='1R<&UJ:&AI:FQN<')T=7-Q;V]N;FQH8EU8 M5E-03$E&0T`^.SHX-S4U-#0T-34U-C8V-C4T,S$N*R@E(AX:%A(."04`_/CW M]_;U]?7U]?7U]?7U]/3S\O+Q\/#O[^[N[>WL[.OJZ>CGYN7CXN#?W=S;VMG7 MU=/1T='0SLG#P+Z[N;BWM[>WM[>WM[>WMK:UL["LJ*6BGYV;FIJ;FYN9EY:6 MF)N>H:*AGYZ;L[_+S]?;W^/CY M^/?U\_/T]_P`!`<*"PL+"PL+"PL,#`L)!@+__?O\``8&5D5T8X-3@W+1T2#@\-!__\_P8-$!`+`?3JYN?L\O?\`0<-$A89 M'2`C*#`\3%ME:FYP;VMD5T8U*R@D&Q`)!0+]^/;RZ^'6RL"[NL#(SQJJ2@G)B8F)>0AX&`A(F. ME9VCIJ*9CXB*E:2QN\/+T=+3UM[DY^7CYN[Z!A`7'B0J*R3EZ.OL[.OM\_H``P0$ M`P'__P(&"@X/#0D%`@($"`T0$Q,1#0H'!00$!`,!__WZ]>_HY.+BY>KR^@0. M&2$C(!H3#`<$`P(#!0D-$A<;'A\?'AT9%!`,"0@*#A0:'B`>&!$+!@/_^O3K MX=C0R,*^O+NZNKF[OL+(S=/7VMW?X-_/BX>'A MX>'BX^3DY.#:U-7>Z.GDX-_7CX^3CW=?2U=G:T\G"O\'*V.;O\.K@ MUM7B]0`#`O_^_/S[^OKY]O/O[.GFX^'>V]C6T\['O[>PK*NNL;2VM[BYO+_# MQ\S/T]78V^'I\?;W]O#FW-O@Y.'>V]?5U-76U]C8V=O@Z//]!`4#`PH4'2$B M)2@K*RHH(QD,`/;R\O?_!0L0$Q46%A44$A`/#@X.#Q`/#@L'`_[X]/#N[>_T M_0D6(2@K*24B'AL9&1D;'!P;&184%!05%186%A45%!,1$`X,"PL+#`T.#P\0 M$1(3$0P#^.SDX.#@X>3G[//^"QHG,#0T,2XM+B\O+BPI)R8E)BKL[O#O[.?AWM[BZO/\`P@*"04!_?T##QH>&A00#A`1$`L&`O_\ M^?7QZ=_6TM+5V^/P`1`;'A@-_O+L[.[P[^ODWMK9V=WD[OH$"@P,"PH("`L0 M%!01#@D%`@("`?[\_/S]_?X!!@L2&!P>'1L7$0P("0P/#@L(`_[Z^_\$!@0! M_OOW\>GCWMW=WMWKS_`0)"@<# M_OGS[>SP]/;U]/;Z_P$!``($!`#\^?7R\/'U^P$'"PT,"`+[].[JZ>ON[O#W M`PX3$Q8=)"HL+"PO-CHY-C@^0D`\.CP]-B@:#P?_^?C[_/COY^;K]/X$`?CR M]/GZ^?L`!`/]]N[FW-#'Q,K0S\G#P\;*S,W0UM[DZ.KN]?X'$APE*2PN+BTI M(A<-"0H+!OWV\>OEXMW4RL3%RL[.R<&^P\K+P[FWO\G.RL?+UN+J[?'V^?;O MY=G,OK"DG)>8G*&FJ:VSN\3,SL[-T-?>XN+CY>CIZ>GJ[?'U^P`%"@P.#P\/ M#Q`3%A40"P\8(B@J*RTQ-SLY,S`V1%%64TD[+R8C(R8J+"PJ)2`;&1@8&1D7 M%A,1#P\/$!`0#PX.#Q(6&AT='!XD*2HI)2(?&Q@5%!,3$A`.#`H(!@0#`/WZ M^/;T\>K>T<2]N;.JH9N:G:*EI:2DI:BJIY^6DY:;GIZ(!T6#P<`^?;U\^WC MVM75V>#I]``)#@T+#!`1#@8`_P'_^O3P\?;_"A09&AH:&1<6%101#@L)"`H- M#0L(!0(`__[^``(#`__[]_7U]O?Y^OOY]._L[.[Q\O#IW];3VN7N]/CZ]^_H MY>CM\/#KY-_?Y.GM[_#U_04+#A$5'"0I*B&QD8&1D8%A$* M`_SV\O'R\_/R\.[O\O7Z_P4,%!XJ.45+2D0^.SHX-#`N+S$P+"(5"@0? M(R0F+#(S+B(5"P@)#`X1$`T*"@\7(2DM*RS[#AXI M+2LC&1`.$!(4$0P%_OO[_O_]^?;W^/;MX=G6V-O>W]S;W>3O^/X!`P0#`O_Z M]/+V_PH3%A00#@\3%QD:'!X?'1P;'!T='!H6$`?]\^SFY.3FZ_'U]_?W^/K^ M`@8+$18:'!TA*35!1T8],28A(B&QP<&QD7&R(G)!L0"08'#!(9'AX8#@4```$!__OY M^/GZ^??W^/O_`P@0&2(G*2HK*B4>&!88'!\C)B@H)B,@'AL9%0X$_/CW^/O^ M``#\]O+T]_?SZN#9U]C>Z/+X^OO\`0H5'R0B&0\'!08'!0#[]O/S]_\+%R$I M+"LE'!$%^_;X``P7("8H*"8A&Q<4#PC^]>[IYN+@X.3J[O#Q\O/U]_?V]_K_ M!`@*#`P+#`X3&1T=&Q81#0L+#`\1$Q(1#Q$7'1X:$PT)!@4&"`L.$1,3$Q49 M("P MK*FEHJ*FKK.QJ*&@IZZQKJFGK+2ZO\'#P\+#Q[T^@`#`OSU[NCDY>KR^P('"PX1$A$."@7_^/+LZ.;E MY.3DYNKO]OT$"0P.#0H&`@#]^?/JX-;.Q\&\NKFYN+FYM[2OK:^TN;W`PL;, MTM;5TLW,S,W,RLG*S,[1T]+,Q+NSKZ^QM+6UL["MJJ>CHJ.FJZ^RM;J_QLS1 MU-;8W-_?V]+(P+V^Q,S3V-K:V=K=X>7J\/C_!0L4'RHS.3Y%35)444M$.S0N M*20?'!H7$`?\\^_P]/GZ]_3S]OL``/[[^?O\^O3KX]W;WN;Q_`@3&QT:%!`1 M%1LA)BDK*RDD'!$'`/T`!PP,"`0#`P0$!P\9(R@G(AT;'"`A'QL7$PX(`OS[ M_@($__?PZ^KL[_+V^?K[_0,-&28O,S0S,S,U-34T,C$N*R MW-O;WN3M]P`'"PH'`?W]`@@.$`\-#`P-#`D%`?[[^_X!!0<(!@#W[NKL\O?X M]_;X^_\!!0L4'RCDXN'?W=O9V-?8VMWBYNGK[_7_"Q@B*2TN+2TM+2TL*2,=&!45 M%A<<(RPR,BTF(1\?'AP7$@T(!`#]_/KY^/CW]O;V^/K]__[Y\>KDXN+AW]W< MW-O;W-_EZNKHYNCO^@81&1P;%0X&`/W[^OOZ^OCV\N[LZ^OJZ.?HZNWR]_O\ M^_CU]?;Y_@0*#1`2%!<6$PX)!0(`__\``0(%"0T1%!<:'!\D*"TO,3(S-38V M-30S-CQ$351:7V)B8%Q74DU'0#8L(QP8%Q@<'R`?'1L9&1PB*"PK*"4C)"8H M+#`V/$%%1TA)2DI)14`\.ST].3`E'1H<("0C'ACM\._LZ.;EY.3CX^3GZ^WMZ^OP^`$%!0'[]?/S^/X% M"P\3%QL>(2(C)28G*"@F(AL2"/_Y]?/Q[^WL[O'V_``"`P0(#`X-"`'Y\_+T M^/S_`/[Y]/'P\O/S\.KBV=+.R\K)R,?(R\_4V=W?W][;UM35W.7L[>GAW-O? MY.CIZNOM[^_KY=[8U=+,P[JWN+W&T=SCY-_8TM'7W^?L\?;Z_?[___[Z].WI MZ.?FY.3FYN+8S<*[M[:XNKV_P<+!O[V\O+R[M["II:6GJJRNK["PL+&SMKJ] MO\+$Q<7%Q<;*T-;OKY]_6T=+7 MX.GP\_+R]/?Z_/W^_P(#`OWU[.;DY.+>VM?6UM;5U-+/SKJ[._Q M\>_N[.SM\//U]?/NZ>7BX-S5RKVQJ**=FYJ;G9^?GZ*KM;JYM+"RN+_#P\#` MP\G0U=KAZ?#R\.WN]/L``?[Y]/#N\//X_/\!`@0)#A`-!P'Z\^WHY.#=V=71 MSLS+S,O'P;_!QLK+R<7"P<'"PL3)TMOBZ.SR^?X!`P,#`/W[^??V]?3R[^KE MX-_?X.'AX-_=V]C5U-?=Y.GN\O;X^?GX^/K^`P4"^O/P\O;Y^OT!"`P-"PD) M"@H)!@0"`P@1&B`A'!4."@8#_OKW]OCZ_/[_``$!`0("__GPY][7T];=Y^[R M\O'O[.CFY^KL[N_N[>[O\?+S\_/S\_/S]?7R[>?BWMW>W=C3SLS+R\G'QL7& MR,O/T]?:W-[AY.CL[N[MZNCGZ.ON[^[LZ>?DXN'AXN3EY^KM\?7X^_X``0$# M!@D,$!,5%QLB*C`T,S$R-CHZ-S0S-3H^0#\]/D)'2TY/45)24$Q(1DA*3$M' M/S65545%)/3$I-5%YH;W)R<&MH9VAK;7!Q#=W-W>WM[?X^KN\?/V^P`"`?SY M^OT``P+__?O\_?W]^_CV]?3T]/?[`0<-#PT&_O?R[NKIZNWP\O+P[NWL[O'U M^?S^``0(#!`3%1D=("(B(1\;%Q$+!@+_^_;PZ>/AX^CN\_?Y_/X!!`<)"PP- M#`D$_?CT\>_N[^_O[NSKZ>CGY^?FY./CX^'#AWMC2SLS+R\W2 MV-SCEXN#@W][V MM[N_PL3%QL;&Q<"\NKN^O[Z[NKJ[OL+&R]#6W>/I[O'T]_K^`0(!_OW^`@0# M__OX]O7R[>;>U]35VN#FZ>KGX^#=W=[@X^?JZ>?CX-W9U='-S,O*R,;#P<"_ MP,+%RM'7V]S=W=W=W=S=WN'CY./@WMO:V=O>X^?GY.'AXN'>VMG;WN#?VM74 MUMKXN;HY^7DY.3DXN#?WM[=W=S;VMK;W>#BX>#?WM[>WM[>X./GZN[R M]?;U\_3V^OW__OW[^/CY_0$%"0P/#P\/#@\/#Q$1$0X+"`8%!08&!@4$`@#] M^??U\_#LY=_7T,K&PKZXL:NHIJ6EIZNTO\W9X.+AX.+FZ>CCW=C6U=73T]37 MV=G7UM?:W^/GZ>SP\_;W]_7T\_/S\O#MZNGJ[.[N[>OJZNSM[>SL[>WM[>OI MY^3BW]W;VMK;V]O9U];7V=O>W^'CYNCIZ>KM[_'R\_3U]?+N[.SP]?K_`P4# M`?[\^_GU[^C@V=31S&A82#PX-#`D%`/W\_@(%!P4" M_OS[_0`%"Q(:("(@'1@5$0X)!@0"`/SX]/+R]/?Z^_S_`@4%`OWW]/+T]_O] M_/GW]_GZ^??U]//Q[>CDX^/CXM_;U]75V-SAZ?#W_``"!0<("`<&!@D-#P\- M"@D+$!@='QX='2`B(R(A(B4K,#0V-C8U,S$N+"PM,38\0D9)2$5`.C0N*RHI M)R,>&QL=("$A(B0H*RXO,#$S-SH\/#HW,S`K)R$;%A(1$A48&AXB)2@H)R4D M(B$@'Q\@'QT9%`\,"08%!08("`@("0H*"0D*"@@"^O+N[_/Y_P,$`P(!`@,% M!PL0%1@8%A,1$1(4&!TB)BHN-3Q"2$Q-2T=$0D`_/3LZ.3H\/T1(2TQ)14`\ M.CL]0$)#1$9&0SPT+2DH*2HH(QT9&1XF+S8\/CX]/#HW-3,U.#Q`1$E/4U=7 M5$])0CLV,S(S,S,Q,"XO,C<\/C\^/C]#1TQ26%YA8%U955-24E%/2TA&145$ M03TZ.#;BX-[>WM[>WM[?X>3FY>/@W=W=W^'DYN;FY>;FY^?FY.'@X.'D MZ.KL[.OJZ>OM\//U]O;W^/K[_/OY]O+O[.KHY^;CX-W;V=?5U-78VMO:V-;4 MTM+3U-75U-+1T,_.SM#3V-O>W][>W^'E[//X_/W^_P$$"A$7'2`B)"4F)B4B M'AL8%Q83#@<`^O;S\_3W^_W^^_CU\_/T^/X%#!`/#`<"`/_^_P$#!0<&`P#\ M^OK\_P$"`@("`@(`_/?QZ^7@W-G8UM74U=?:W-W;U]/1T=/3TL_-SM'4U]G; MW=_AX=_=W-O:V=;3T,S)Q\?(R\_3UM?6T]#-S<_2UM?5TWM[F]PL?*S,S-T-;>YN[U^_\!_O?PZN?GZ>KH MY>'>W=_CZ.[T^/KZ^?CX^OO\^_KX]?'LZ.3BX>#?WM[?X-_>V];/R=I*NQM;>XNKN^P<7+ MTMG?Y.;FX^#+FZN_S^/S_`/_\^?GZ_?\` M`0$!`0$#!0@+#0X-#`L*"@<"_/7Q\//W_``"!`8*#Q4:'B(G+#$U.#DX-S0Q M+BLI)R0A'1D8&!L>'Q\=&!,."@<%`P$`__\```#__?S\_/S\_/S\^_GV]?C^ M!@X4&!L='R`B)"8H*2DH)R'!P>(20G*2HI*2@F(QX7$0P(!0']^OCW M]_CZ_/\#!@<'!@0"`0$"`0#^_/KX]O/O[.OL[_/U]?/Q\?'S]OK_!0L.#PX. M#@\/#P\-#`H'`OWX]?/S\_3V^?O\_/KZ^_W_``#__/KW]?3U]_L!!PT2%!44 M$Q,3%!46%A85%!47&1H9%Q45%A86%!(1$1$2%!<9&1@6%103$@\,"0<&!@8' M!P@("Q`7(2HS.C]"0T$^/#HX-C(N*20>%Q(/#Q$5&!H;'!\B)"8G)B4B'QX? M(R(",E)B@H*"@F)2,A'QX='1X@(B0D)"0E)BDJ*RLK+"PJ*"0A'AT< M'!\B)"4C(!T;'!\C)RDG)!\;&1D:'!\A(R0C(!L6$1`4&B`E*"DI*2LP.$!' M2TU/3T]-245"04%!/SLV,BXL*24A'1H8%!`-"@D)"@P/$A,2#PP)"`H-$!06 M&!@8%Q45%AD<'1T='1\A(R4F)RDK+3`R-#4U-3(N*B0?&Q<5%!,2$A07&QT< M&A<5%!,3%!8;("0G*"@H*"@G)R&143$A$1$A06%103%!@>(RWN[_'S\_3U]_O_`@0$ M`O_\^//LY=[9U];6U-/0S'CY./AX.'BY.3CX=[;V=?5TL_-S,S,S,W-S]#/SLO*RLO,SVM;6VN;N\O+N[O+[!Q3CXN'@WMS9 MUM/0S\[0TM78V]W>W]_?W][;UM#*QL/"PL+#Q,7%Q<3"P<'%R]+9W^3HZ^[Q M]?G]``(!_OOW]O;V]_?W]_?V]?/Q[^WLZ^KJ[.[P[NKDWMK8V-K;V]K7TLW( MQ<3&R+@W]_?W^#AX-W8T,G# MP,#"Q+CX^3DX^'?W=O8U='.R\K)R;L\?/T]??Z M_/OY]._KZ>CIZNSO\?/T]/3V^?T!`P8("@H)!@0#`P(`_OOY]_7T]/;X^_[_ M__[[^/;U]O7T\_/T]_K]_O___P$#!@H-#0P*"`<'!P@)"0H*"0@'!@4%!00# M`?[Z]O/R\_7W^/?U\O'Q\_?\``0&!P4$`P0&"0P/$105%100#0L)"`8$`P0& M"0P.$1,5%QD;&QH8%Q<7%Q<6%!$."P@&!0,`_?GU\.SJZNOL[N[M[.OJZ^WP M\_;Y_@,*$AHA)B@F(Q\;&AD:'!X>'1D4#0;_^_O]``,$!`,$!`4%`P(````! M`@,"`?_[^/;X_``"`@#\]O'P\?/V_`(("PP,"0/\]_3P[.ON]?T%#!(4$@T' M`__\^_X!!`8(#!0;'QT6"O_Y^?T!`P,!_P`"!0@,$!48&AH:&1@:'B0J+S4Z M/D`^.S'R`?'!8. M!O[X]?/T]OCY^/7Q[N[P\_7U]/+R\O3W^_W^_?W]_P(&"0H*"PP/$A49'!X? M'AT<'!T?(RXN;R^P<+!O[Z^ MOKV\NKBWM[BXM[6TM;BZN[N\O+R_Q,K0TM+1S\_/T-#0S\W+RLG)R\_2T]/2 MS\O(Q<+!P,'"Q,7&Q\;$P;^]OL#$R,W2UMG;M\?/R\?'R\_/OZN7AX.#B MY.;IZ^[P\_7W^?GX]_7S\_/U]?7S\._N[_'R\O+Q\?'Q\._P\?+T]//S\_/S M\_'P[^[O[^_P\/'R\_3T\_'NZ^KHYN7DYN?IZNKJZNKGX][8U=/3U-;6U='. MR\O-T-/5U=+/R\K*S='4U=73T,[.T-/7VMS=W=[BY^SP\?+Q\O+T]??Y^_O[ M^/;S\O+S]?;W^?O^`04("@P-#A`2%!87&1H:&182#PP*"`@&`_WW\>SHY>'> MV]C6T]'.SVM+2UN+S`Q,C,S]+4U]K>XN7FX]W7TOO\_?Y^OKX]_;X^?O[^_KX^/CX^OO]_?OZ^/?W^/K]``,$`P(" M`@($!0<(!P8$`@(#!08'!P<'"0P1%APB)RPO,3$P+"_O\?3V]_?U]??Z_@(&"0H*"PX3%QD9&AL='!H7 M%1,2$0\-#`P.$!$1$1(4%Q@8%1$."P<"_?S]`00%`P$"!0H1%QD8%A04%186 M%A46&1XB(R,?&Q<4$A(4&2`F*2'Q\=&QD9&!@8&!<5$@X+"`8&!04& M!@8&!@8'"0P/$1$/#@\2%AL@)"DN,C4V-C8X.CU`0#TX,BTL+3(V.S]"1DA+ M3$U-34Y/3DM$.C`H(B$B)2DK*RDG)RDM,SI!2$]35%-134E&1$-!/CPY.#D[ M/C\_/#(B#AX>'@W=K7UM?7U];6U]?6UM75V-WD M[/+V]_?V]O7T\_#KY=[6T,O(R,C(QL/`O;N\OL'$Q\G+S,W,R\G)RLS.SLS) MQ,"]O;Z_P,"_OKV]O;V]OL##QLG,T-38V=K9V-C8V-C8V-C8V-G9V][AYNKM M[_#P[^_P\?+T]?7U]/7V]_CY^/?T\>_N[>[P\O+Q[NKFX^+CY>GL[N_P\?3X M_0$#!`,"`0($!PD+"PD&`?[Z]_3Q[^[O\/+S]/7U]O?W]O/MYM_9U-'.R\C% MP\+#QHJ6HJJJKK*ZQM+6TL[&OKJZPM+G`QLO/T=+1T,W)QL*_O+JYN+BV MM+&NK*RLK:^SN+[$R MW-O:V]S>X.'BXN/CX^/CY.;GZ.CHZ>KKZ^OKZNGHY^?HZN[S^/O]_O\``0$! M`/_^_?OZ^/?V]?3S\.SHY-_;U];5U=34U-77V-G;W=_BY>CJ[.[Q]?C\_@`` M`0(#!@D-$!(4%187&!D:&AL<'1X@(R8I*BLI)R0B(!\@(2(D)"0C(B`>'!L< M'!P9$@H`^//P[N[MZ^KHZ.GK[>_Q\_7W^/CY^OO]_O[\^O?U\_'P[^[M[.SK MZ^OKZ^KHZ.CK[?#R\_/Q[^SIZ.CIZ^WP\_7U]/+P[_#R\_/P[NSL[O'U^?T" M!@D*"PL*"@D("`<&!`'^^_GW]O;W^/GY^?GX^/CY^_S\^_CS[NKFX^'@X>/F MY^CHZ>WR^?X``/___OSW\NWJZ.CK[_/V]_?V]_G[_0`$"Q(9'2`C)2@J*B@F M)"(@'R$F+3,W.3@U,BXH(!D4$A4:("0G*"@I*2HK+2\Q,S4X/$%'35%45E53 M3TM&0T`^.SDW-34W.C]#2$M-3D]04E165UA:7F)G:VYP<&]L:&->6%-/3DU- M3$I'0CPV,"PI*2DI*BLN,SI!14A(24I,3U%14$]/3U%24E!-245"/CHW-#,S M,S0U-C8T,B\M*B'!D6$Q`.#0P*"`4"__W\_/S]_O_^_/KW]/+P[^[N M[>WM[>OJZ.CHZNWP\_;Y_/X``0,$!04#`/[\_/S]_OW]_O\!`@(!__SY]O+N M[.OK[.[N[N_P\?/U]O;R[>;AWMW>W^#AXN/CXN'AX^?L\O@`!P\7'B0I+"XP M,#`O+"DG)B@I*2(R8G M)B0B("`@(2`>&Q82#@P-#@X-"0/]^??U\_#MZ^KJZ>?EX^+BX^7GZNSO\?+R M\?'Q\O3V^?O]_OWZ]_/P[>OJZ^[R]??V]?7U]OCY^_W_`00&"0L+"@@%`?_\ M^O?S[^OGY>/BX-_?WM[>WM[>W]_?WM[>X.'CY.3CX>#AY.CN\_;W]_;U]/3S M\O#O[N_P\?+R\O'O[>GFY./CX^/CX^+@W]W=W-K7T]#.S,G'Q\K0U]O=W=S; MV]O:V-;4TM'1TM34U-+/R\;"OKRYM[2RL+"PL;.VN;N[N[N\O;_!Q,C+SM#0 MT-'2T]+0SCK[>[N[N_P\?'R\_3U]O;T\>WJY^;EY./A MW]WVM71S]#3U]O=W^'DY^OM M[O#R]?;V]//S]?CY]_/NZ>7BW]W/FZ.CG MY>+>VMC6U]K=X.+DY>?I[?'W_0,(#`X-"PH*"@L-#@\."P<#`/[_`0,$!`0# M`?[Y]?+Q\?'P[NKFX^'@W]_?X.+DYN7AW-?5U=?7GY^?FY^CK[>[MZ^GH MZ>SQ]_S_`0#^^_GW]?3R[^WL[>_S]_O]_P`"!`8'"`@*#!$6&AT='!L<'B`@ M'AL9&!D:&AD8&!D9&AD9&!<6%1$-"`0"`P8*#A$3%!03$Q,2$1$1$1(2$A$1 M$Q47%A$,"`<("PP,"@@'"`@'!0,"`P4'"`<&!08(#!`5&AXB)2'R$C)2&Q@6%105%144$Q$.#`H)"0D*"PT.#P\/#P\.#@\0$Q47%Q84 M$A`/#@T+"0D*#0\1$1`.#0L*"`<&!04%!@<("`<&!04$!`0$!`0$!`,#`P0% M!@<'!@4$!`4&"`D*"@H*"PT.#P\.#0T.$!,7&QXA)"DN,C8X.3DY.##AX^;IZ^SL[>WN[_#P[^[M[>SKZ>;CX-[;V=?5 MU=75UM;6U=/1T,[,RL?$PL"_O;RZN;FZO+[!PL+!O[V\O+V_P<+"PL+#Q#BX=_ MW^#@X.#@W][7EYN;GZ.ON\O;Z_@(&"0P.$!$3%AD;'1P9%1`, M"0@'!@4#`?[[^/7R\?'Q\>_KY^3BX>#@X-_?W][WMWKL[O+W^P`#!@D)"`8$`O_\^?;T\_+S\_3U]??Y M_``%"`H+"PD'!`("`P8("PX0$1(3%!47%Q@8&AP>(2(B(B$@'QX<&A@6%!(1 M$1$3%AH='R`A(R,C(A\=&QL<'R(E)20A'QT;&QP<'1T>'B`B)"8G)R8F)B'A\?'QX='!T>(2(B(1X;&1@8&1H: M&1<4$0X,#0X1$A,3$Q06&1XB)B@I*2DJ*RTN+S`Q,C0V.#@V,S`M*R@F(R`= M'!P='A\?'AT;&AD9&1D9&AL<'!L<'1X@(2$?'AP;&QL<'!T='AX>'AT<'!L; M'!P='B`A(B,C(B`>'1T='AX<&183$1$3%QH<'1X@(R8J+2\O+RXM+2\P,3(S M-#,R,"TK*RLK*B'R`@("`@'QX<&QH:&AD8%Q@9&QT?(2(B(!T:%A(0#P\0 M$1(4%187&!@7%A86%Q@:'!X@(B,D)24E)"(?'!D7%A86%A44$A`.#`H(!0," M`0``___^_@`"!`4%`P#]^_O\_@$%"0T/$!`/#P\.#0L)!P8&!P<("`<'!@<' M"`D*"@H+"PP-#@X-"P<"_OKW]O;W^/GZ^OKZ^OK[_?\``0(#`P4'"`H*"@H) M"0D)"`8$`O_]^_O[^_S\_?W^``(%!PD+"PL*"@H*#`T0$Q88&QT='1P<&QP= M'1X>'R`B)"4E)2,@'1@4$0X,"@D(!P4$`@$`_OSZ]_7T]/3U]?7U]O;V]?;W M^?S^```````!`0,$!0<*#`\2%!04$A$0$!`/#@P*"0@("`@(!P8$`?[[^/?V M]_GZ^_OZ^??U\N_MZ^KIZ.?FY>3DY.7EY^GL[O#P[^WKZNGJZ^SL[.SKZ^SN M\//V^/GZ^_O\_?W\^OGY^?K[^OCV\_+P\/#Q\O/T]//Q\._N[NWJZ.3@W=K6 MU-+1T-#0T,[-S,[1U=O@Y.?HY^;FY>7FY^GK[>[O\/#P\/#P\?/V^/KY^/7S M\?'S]_P!!08&!`(`````__W[^/7S\O#NZ^CFYN;FY^GJZ^SL[.OIZ.;EX^+B MX>'AX>'AXN+BX^+AW][=W-W>X.#@W]W:U]32T=#/SLW+R,7#PL'!P<+$QLG+ MS,W.S\_0T='1TM/5U=;5U=33T]34U=;7V-G:VMO;W>#DZ.ON[^_O[>OIY^7B MW]O8UM74T]'/SLW-SKJZ>?DX>#@XN3FZ.KKZ^KIY^7BW]S9UM/0S;GZ.CHY^;DXM_WLZNCEXM_>W^'DYN?HZ.GJZ^SN[_'T M]?;V]?/Q\._O\/'R\_/T]?;W^/GZ^_W]_OW\^_O\_?[^_?KV\^_MZ^KIZ.?E MXN#?W]_?WMW;V=C8V-K>XN;I[?#S]OG[_/S\_?\!!`<*#0\1$1(2$Q,3$A$0 M$!`/#0L(!0(`__[]_/O\_?\!`@0%!PD,#A`1$`X,"08#`?_^_O[^__\```$! M`@0&"@X2%186%1,1#PX-#`L)!@+__?W\_/W]_?\!!`<("`<&!@<*#0\/#@P* M"0D+#A`1$`X+"0<&!PD*"PH(!@0"`@,%!P@)"@L,#A`1$A,3$Q(0#PX.#Q$2 M%!04%!47&AXB)"8G*"LN,C4W.3DX.#'AX>'A\@(2(B(B(B(R0E)RHL M+2TL*RDG)2,B(2$A("`?'AX='A\@(B,C(A\;&!43$Q,2$1`/#@T-#@X0$A89 M'!X>'AT<&QH8%Q85$Q(1$!`/#PX.#@X/$106&!H;&QL<'1\A(B(B(2`?'!D6 M$Q`/#@\0$1$1$`\0$A8:'B(E)R M'1P:&1@7%A44$Q(2$A(1$1`/#@P*"`4"_OOX]O;U]//Q\.[LZNGIZ>GK[.WN M[_#P\?+R\_/R\O+T]OG\_P(%!P@)"0@'!@4%!08&!@4$!`,"`@$````!`@0% M!04$!08("@P,"P@&!04&"`D*"@D("`D+#0\1$Q47&AP>'QX<&1<4$@\.#`H( M!@4%!@<'!P8$`@#_``$"`P0$!`0#`@$````"`P0$`@#\^?7R\.WJY^3AW]W< MV]K9V-C9V][BY>?GY^?FYN7EY>;EY>3CXN+BX>'@W]W=W-SWM[=V]K8U];6U]C: MV]W?X.+DY>?HZ>KK[.SKZ^KIZ.CHY^;DX^/DY>;HZ.CGY>+@WMS:V-;5U-+2 MTM/5V-O>X>/DY>3DY.3DY./BX>#@W][>WMW=W=W=WM[@XN7HZNOKZ^KJZNKK MZ^OKZNKIZ>CHZ.GIZNKJZ>?FYN?HZ>OL[.SL[.SM[>[N[N[O\/'R\_7V^/K] M_P$$!@D,#A`1$`X+"0@&!00$`P,#`@(!__WZ^/;V]O;W^/CW]O;V]_G\_@`! M`0#__O[^_O[_``($!0<)"@L,#0X.#@P*!P/__?OZ^?CU\_'P[_#P\?'Q\?'Q M\?'P[^[LZ^GGY>3CXN#?W=S+DY>;GY^CIZ^WO\/+S]/7V]O;V]O?Y M^_W^_OW\^_KY^/?V]?7U]O;V]?7U]O?X^?GZ^_S]__\`___^_?W]_/S\_/OZ M^?CX^OT"!@H,#`L)"`@("`@&!0(!`/\```$#!0<)"@H*"@H+#A$3%145$Q(2 M$Q,3$A`.#`L+#`P-#`L+"@H*"PL,#`T.$!,8'2$D)B8E)20E)B@J+"TM+2TM M+2TM+"PL+"TN+R\P,#$R,S0T,S(R,C(T-38V-C0S,C(R,S0U-C&A<4$A`0$!`1$1(4%1<9&AL<'!P<'!P<'!L:&1D9&AL<'!H9&!<6%A86 M%Q<8&!@8&!@7%Q<6%103$A$0#@X.#Q`2$Q03$A$0#PX.#Q`2%!<9'!\A(2$@ M'Q\A)"@L+S(T-CWJY^7DY.7EYN?H MZ>OL[>[N[^_O\/'S]/7U]?7U]//Q[NKGY./CX^3DY./BX>'@X>'AX>'BXN+B MXN+BXN+BX^/DY.3DX^/CY.7FY>3AW][>W^#BX^/BXN'BX^7HZNSM[>OJZ>CG MY^?FYN7EYN;GY^CHY^?GY^;DX^+AX>#?W=O8U=+/S,K(Q\;%Q<;'R,G*S=#4 MV-K'AXN/EYN?GYN7DX^+@W]W;VMC7UM;5U=75U=/1SLS)Q\7$ MPL"_O;V\O;Z^OKV]O;[`P<+#Q<;'Q\?'QCJ[>[P\/'Q\?'O[NSJ MZ.7CX=_>W=S;GY^CIZ>KK[.[O\/#Q\?'R\_/S\>_LZNGIZ>OL M[O#Q\O+S]/3U]O;U]/+Q\?'R]/;X^?GY]_7S\>_LZ>?EY.3CX>#>W=W=WN#B MX^7FYN?IZNSN\?/U]_?W]O;U]O?Y^_W__P#___[^______[^_O[^______[\ M^OCV]//R\?+R\_3U]//P[.CDX=_?W^#BX^3DX^/CY.;HZ^WO\?/V^OX"!@H, M#0T-#`L*"0@'!@0#`@$`__[]_?S\^_OZ^OGY^?KZ^?GX^/GY^?CW]O7V]O;V M]_CY^_W_`0,#`P'__?S[^_O[^OGX]_;T\O+R\O/T]O?Z_0$$!@@*"@L+"PH) M"0@)"@P.#Q`1$1$0$`\.#0T-#0X.#@\/$!$3%!87&!D9&1D9&1D9&1H;&QH8 M%Q86%Q<8&!@8&1L='A\@(B0G*BPN+R\P,C0V.#DZ.3@V-#,R,3$Q,"\M+"LJ M*RPN,#`P+RXL*RLK*RPL+"PL+"PN+S$R,C(Q,"\N+BXM+"HH)RW-K9U];5U=34U-34U-35UM?9VMOX.'CY>7E MY>3DY.;HZNSN[N[N[>[N[^_P\?+S]/3S\O'P\/#Q\O+S\_/T]/7U]?7V]_G[ M_@$$!@@*#`X0$1(3$A$/#@P*"`<&!00#`0#__O[]_/OX]/'MZ^KIZ>GJZNKJ MZNKKZ^SM[>SJZ.7CXN'AXN3EY>;EY>3DY.7GZNWO\?/U]_G[_?[^_OW\^??S M[^OGX^'>W-O:V-?5T]+1T-#1T='2T]35UM?8V-G9V=G9V=K:V]S=WM_AX^7G MZ.GHYN3AWMS;VMG8U];4U-/2T=#/SLS+RLG(R,G)R#?W]_@X.#@WMS;VMK;V]O; MV]K9V-?7U]C9V=K9V-;4T;HZ>KK[>_R\_/S\_/S\_+Q\.[M[.OKZ^KIZ.;CX=[=W-SWN[N_P\?+Q\?#O[^_N[>OIZ.;EY>7E MY.3CX^/DY>;IZ^[P\O3V]_G[_/W]_?W]_?W]_O[__P```/__```!`@,#!`0$ M!08'"`H,#0T-#`L*"0@'!@4$`P$`_OW\^_KY^/CX^?O\_?[^_OW]_/SZ^?;T M\_+R\_3V]_GZ^_S]_?[_``$"`@,#`P,$!`0#`0#^_/OY^/?W]_CY^_S_`00& M"`H+#`P,"PH*"0H*#`T0$A48&QTA)"'1T<'!P='1X? M("$B(R0D)24E)B@H*2DH*"8E(R(@'QT;&A@8%Q<6%A45%146%Q@8&1@8&1D; M'!X@(2(C)"8G*"HK+2XO,#$Q,"\M+"PK*RLL+"PK*RDI*"'R`?'Q\?(2,E)R_MZ^CFY./CX^3FZ.KM[N_N[NWL[.OK MZ>CGY^GJ[>_P\?'R\O/U]_CZ_/\``@,$!@@)"PT.#PX.#`L*"@H*"@D)"`<& M!00"`?____[^_?SZ^?CW]_CY^_W_`0,%!@<("@L,#0T-#0T-#0X/#Q`1$1(2 M%!47&!D8%Q43$`X,"PL*"@H*"PL+"PP,#`P+"@<%`O_]_/O\_/W]_O\``@4( M"PT/$1,4%187%Q@7%Q44$A`.#0P,#`P-#0X/$1,6&!H;'!T='1P;&1@7%Q87 M%Q<8&!D9&QP='R`@(2(B(R,C(R,A'QP9%A,0#@P+"@D(!P4#`@$```#___[] M_?W^_O[^_OW\^OCW]O7U]//R\.WJYN/@W][?X.'AXN+BX>'@X-[=W-O:V=C7 MUM32T,W+RX.'BXN/DYN?IZNSL[>WN[N_P\O/T]/3S M\?#O[^_N[>SKZ^KJZ>GGYN3BX-W;V=?5T]'.S,G'Q[N[NWM[.SL[.SM[N[O M[^[N[N[N[^_P\/#P\/#O[NWM[>WN[_#Q\O+S\_/T]?;X^OO\_?W]_?S[^OCV M]?3T]/3T\_'O[.GGY>3CY.7FY^CIZ>GIZ>GIZ>KK[>_R]??Y^OKZ^OKZ^?GX M]_;U]//Q\.[LZ^KIZ>GIZNKK[.SL[.SKZNGHZ.GIZNOK[.SKZ^SM[_+U^/O] M``($!08'!P<'!P8&!04$!`0%!04%!04%!`0$`P,#!`4&"`D)"@L,#0\1$Q05 M%A<7&!@8%Q86%A<:'2$D)B8F)B4E)28G*2HK*BDG)2,B(2`?'AT<&QH9&!85 M$Q$/#0L)!P4#`0#__P`!`P0%!@<'!P@)"PX0$Q47&1P>(2,D)24E)"0D)"4F M*"DK+"PL*RHJ*2DI*2@G)B0C(B`@("`@("`?'QX='!L:&!<5%!,2$1$1$1$1 M$A05%A86%A87&1L?(B4H*2HJ*BDI*2@H*"'1T< M&QL;'!T>'1P;&QH:&AH:&1@7%1,0#PT,#`P,#`T-#0X.#Q$2$Q46%QD;'B`C M)"8G*"DJ+"TO+R\N+BXO,#(T-#0T,S(Q,#`O+BPI*" M("(C(R(A'QX='1T<&QD7%!(0#P\/#P\.#@T-#0T-#0T.#@\/#PX-#`L)!P4# M`0#^_/KX]O3S\O'P[^[N[>WM[>SLZNGGY>/BX>'AXN/CX^/BXN+CY>;HZNOL M[>[N[_#R\_3S\_+Q\?+S]OCZ^_S]_?[_```!`0$!`0```````/____[^_?W\ M_/S\_@`"!`4&!P@("0H*"PH*"0@&!@8&!@8&!@8%!`,!__[]_?W]_/OY]_;T M]/3U]O?X^/GY^?GY^/CX^/?V]/'NZ^?CX-[W^'BX^3EY^CJZ^SM[>WL[.KIZ.?FYN;FYN7DX^/CX^/BXN+AX>+B MX^3EYNCIZNOKZ^OKZ^SN\/+T]O?X^/GZ_/W^_O___O[^_?W\_/OZ^?CW]_?X M^?K[^_S\_/O[^?CV]/+Q[^WKZ>?DX=_W^#@X.#AX>'BX^/CX^/C MXN#=VM;2S\O)QL/`OKR[N[JZN;>VM;6UMK>XNKR]OK_!PL/$QL?'Q\;$P\/# MQ,7'R,G+R\S,S,S+R\O+S,W.T-'1TM/5UM?8VMO+CY.3EY^GK[>_P\?+S]/7V]_CX^/?V]?/Q[^[L[.OJZ>CGYN7DX^/BXN+B MXN/EY^GK[>[O[_#Q\O+S\_/S\O'P[^[M[.SKZNGHYN7EY>7EY>;GZ.GJZ^WN M[_#Q\O/S\_/S]/3U]?7U]//R\?'Q\O+S\_/R\O+S]?CZ_?\``0(#!`4'"`D* M"0@&!0,"`0$!`/_^_?S[^OKZ^OKY^?GY^OO\_/W]_?[^_O[]_?S[^??V]?3T M]/7U]?7V]_?X^?GZ^?GY^?KZ^_O[^OGY^/CX^/GZ^OKZ^?GX^/CX^/GZ^_O[ M^_KZ^OGY^?GZ^OO\_O__`````0$"!`4&!@8&!@<'"`D*"PL*"`8%!`,#!`4& M!P@("`@("`@("0L+#`T-#@\1$Q06&!D:&QL;&QL;&QP<'1T='1P;&AD7%A44 M$Q,3$Q,3$A$0#PX,"PH)"`@("`D)"0D)"@H+"PP,#0X0$1(4%186%Q<7%Q86 M%A85%145%145%!04%!45%A85%!,2$1$1$1`0#PX-#`P,#0X.#Q`0$!$1$1$1 M$1$0$`\.#0L*"0@(!P<&!04%!@<("@P-#@\/#@T-#`P-#@\1$A,4%187&!@8 M%Q<6%104%!04%!04%!04%!04%!45%Q@9&1D8%Q43$A`/#Q`0$1$0#PX,"PH* M"PP-#Q`1$A(4%1<8&AP='1T>'R`B)"4F)B4D)"0D)"4F)R@H)R4C(2`?'Q\@ M("$A(2(C)"8H*BPM+S`P,3(S-#4V-C8U-#,R,3`P+RXN+2TL+"PM+2\P,3$R M,S,S,S,S,S,S,C(R,C(S,S,R,C$O+BPJ*"8E)"0D)",C(R,C)"4E)28F)B8F M)B8F)20C(2`?'QX>'AT<&QH8%A44%!04%!04%!03$Q,2$A(1$A(2$Q,3%!47 M&!H;&QL;&AD9&!<6%104%!45%145%!(0#@T-#0X/$!(3%!45%104%!,2$1`/ M#0P,"PL+"PL,#`P+"PH*"0D*"@L,#`P-#`P-#0T.#@\/#P\.#@T,"PH*"0D( M"`<&!@8'!P<(!P<&!04%!08&!@4$`P(!`````/____[^_O__``````#__OW[ M^_KZ^_S]_O_____]_/O[^_O\^_OZ^?GX^/CX]_;U]/3T]/3T]/3T]/3T]/3T M]/3S\_+Q\._N[>SKZNGHY^;FYN;FY^?GYN7EY>7EYN;FYN?HZ>OM[_'R\O/S M]/7W^/GZ^OGX]_;U\_+Q[^[M[.SKZNGHY^?GY^?GZ.CHZ>GJZ^SL[>[N[^_O M[NSKZNGIZ>GIZ.CGYN7DX^/BXN'AX>'AX>+BX^/DY./BX=[X.'BXN/CY.7FY^?GY^?FYN;FYN?HZ>GIZ.CGYN;F MYN;EY>3DXN'?WMW+BXN+BX>'AX>'AX>'AX.#@W]_?W]_@X.#@X>'B MX^7FY^CHZ>GIZ>GHZ.CGYN;FYN;FYN7EY.+AX-_>W]_@X>+CX^/BXN/CY.;G MZ.GJZNGIZ.;EY./BXN+AX>'@X>'BXN/CY.3DY>;GZ.GJZNKJZNKJZNKJZNGH MY^;EY./BX>#@W]_?W]_@X>+CX^/DY./CY.3FY^CIZ>CGY^;FY^CHZ>KJZ^OK MZ^SL[>WM[.SM[>[N[NWLZNGHY^?GY^?GYN;FYN;FY>7DY./DY.3EY>7EYN;F MY>7DX^+BXN+BXN/CX^3DY.3DY./CX^/DY.7EY>;EY>;GZ.KL[_'S]/7V]O;V M]_?W]_CX^/CW]O7T\O'P\/#P\/#O[NWLZ^OJZNKJZ>CFY>7FZ.KL[_+T]_G[ M_@`"`P0#`P(!```!`0$!`/_^_?W\_/W\_/S[^OKY^?GY^?CX^/CX^/CX^?GY M^OK[^_OZ^OKZ^OO\_?\``0(#!`4&!P@*#0\1$Q04%!05%145%145%186%A<7 M%A87&!D:&QP<'!P<'1\@(2$A(!\?'AX='1P;&A@6%!(1$`\/#P\/#P\/$!`1 M$1,4%1<9&QT?(2(C(R,C(B$@'QT;&A@7%Q85%102$1`.#0T-#0X/#Q`0$`\/ M#Q`0$!`0$1$1$1(2$Q,4%!46%A86%145%A87&!D:&AH:&QP<'1X>'R`A(2(B M(B(B(B(B(2$A(!\?'AT<&AD8%Q85%145%186%Q86%144$Q,4%!05%!03$Q,3 M%!05%145%145%A87&!@9&1H;'!T>'R`A("`?'AT<&QH:&AD9&!<7%A86%A87 M%Q@9&AL<'1T='1P:&1<6%!,3$A$0#P\.#@X.#P\/#Q`0$!`/#Q`0$!$2$Q,4 M%!,3$A(3$Q04%145%144%!03$A$1$!`0$!$3%!46%Q<7%Q@8&1H;&QL<'!T= M'AX>'A\@("$B(R,C(R,C(R0D)",C(B(A'QT;&185$Q(1$`X,"PH)"0H*"PT. M#Q`1$Q05%A<8&!@8%Q<7%A86%A86%A45%186%QD;'1X@(2(C(R,C(R,C(R,D M)"4E)B8F)24E)",C(B(A(2$A(B,C(R,C(B$@(!\>'1L:&1<5%!,2$A,4%A@: M'!T?(2,E)RDI*2CGYN;FY>7CXN#?W=W=W=[>W=S:V-;5U-34U-/3T]+2TM/3 MT]/3T]/3T]/2TM'1T=+2T]/3TM+2T='1T='1T='1T='1T='2T]/3T]+1T,_/ MS\_/S\_/S\_1TM37V-K;W-S>W^'BX^3DX^/BXN'@X-_=W-SSL[.SKZNGHY^?GY^?GYN7EY./CX^+BX>#?WM[=W-S#?WMW=W=[?X.'AXN+CX^3EYN;FYN;FYN7EYN;GY^CH MY^?FY>7EY>;GY^?GY^?GY^CHZ.CHY^?FYN7EY>7EYN;GY^?GY^?HZ.CIZ>GH MY^;EX^+@WMW;GZ.CHZ.CHY^?HZ.GJZ^SN M[_#Q\O/S\_/S\O+R\?'Q\?'R\O/T]?;W^?K\_@`!`P4&!P@("`@'!P<'!P@( M"`@("`@("0D)"0D(!P<&!04$!`0#`P(!`0````$!`0("`@,#`P("`@(#`P0% M!08%!04%!04%!04&!P<("0H+"PP,#`T.#Q$3%!87&!D:&AH:&1D9&!@8&!<7 M%Q<8&1H<'A\@(2$A(2$@(!\>'!L9%Q85%!,2$1`/#@X-#0T.#Q`2$Q05%A<7 M%Q<8&!@8&1D9&!@8&!<7%A44$Q(2$A$1$1`0$!`1$A,5%QD;'1\@(B,D)28G M*"DJ*RLK*BHI*"@I*2DJ*BDI*"@H*"DJ*BLK+"PM+C`R,S0U-C4U-#(Q+RXM M+"LJ*"'A\?("`?("`A(2(C(R(B(2$A(2(B(B$@ M'QX=&QL:&AH:&QP='AX?("`A(B,D)B'AT<'!L:&AD8&!<6%144%!05%!04$Q,3$Q,4%!45%144$Q(1$1$1$1(2 M$Q,3%!46%Q@8&!D9&1H;&QL;&AD8%Q86%104$Q$0$`\.#@T-#0T-#0T,#`P, M#`P,#`P+"@@'!@4$`P(!`/_^_?W^_O[___\```(#!0<)"PP-#@\0$!$1$1$1 M$!`/#@T,#`L*"0D("0D*"PP-#@\/$!`1$1(2$Q46%Q<7%A85%!,2$A(1$1`/ M#@T-#0X/$!`1$!`/#P\/#Q`0$!`0#PX.#0T,#`P,#0T-#@X.#@X.#@T,"PL* M"@H)"0@(!P8%!00$!`4&!P@("`@'!P8&!P<("`@("`<'!@4%!00$`P(!`/__ M_P```/____________[^_?S[^OKY^/?V]?3T]/3S\_+R\O'Q\?'Q\?+R\O+R M\_/S\_/T]/7V]_CX^?GX^/CW]O;U]//R\?#P[^[M[.SL[.SLZ^OKZNKIZ.CF MY>7DX^/CY.3DY>;FYN;FY>3CXN'AX>+BXN+BXN'AXN+CY.3EY>7EYN;GY^CH MZ.CGYN7EY>7EY>7DY.3CX^/CX^/CXN+BX>'@W][=W-SWM[?X.'B MX^/CX^+AX-[=W-O;V]S=WM[?X.'CY>?IZNSM[N[O[_#P\/#P\?'Q\?'Q\?#P M[^_O[N[M[>WL[.OKZNKIZ>GHZ.?GY^?HZ.GIZ>GIZ.?FY>/BX>'@X.#@X.#@ MX.#@W]_?W]_?W]_?W]_?W]_?W]_?X.#@X>'BXN+BXN'AX>'BX^/CX^/CXN+C MX^7FY^CIZ>GIZNKJZNKIZ.;EY.3CX^/DY./CX^/CX^3DY>;FY^CHZ>GJZ^SN M[_'S]/;X^OO\_?W]_?S\_/O[^OGX]_?V]?3S\O'P\/#P\/'Q\?#O[^[MZ^OJ MZ>?FY>3CXN+AX>'AX.#@X.#@X.#AX>'@X.#@W]_?W]_?W^#@X.#AX>+CX^/C MX^/CXN+BXN/CX^/CX^/CX^3DY>7EY>7FYN;FYN;FY>7EY>7FYN?GZ.?GY^;F MYN;GZ.GJZ^SL[>[O\/#Q\O+S]/3U]?7T]/3S\_+R\O+R\_3U]OCY^OO]_@`! M`P4&!P@("0D)"`@'!P<'!P<'!P<&!@8'!P<("`D*"@L,#`P,"PL+"PL+"@H) M"0D)"0H+"PP+"PL+"PP-#0X/$!`0$!`/#P\.#0T-#0T,#`L*"@H*"@H+"PH* M"@D)"`@("`@)"@L,#0X/#Q`0$1$1$1$1$1$1$1`/#0P,#`T.#Q$2$Q46&!D: M&QL<'!P<'1T='!P<&QL:&1D9&1D9&1D9&!@8%Q86%103$A$0$!`0#P\/#@X- M#0P,"PL+"PL*"@H)"0D("`@("`D)"@L+#`T-#@\/$!`1$1(2$A(2$1$1$!`0 M$!`0$!`0$!`1$1(3%187&!D9&1D9&1@8&!<7%Q<7%Q<7%Q<8&!D9&AL;'!P= M'1X?(2(C)"4E)B8F)24E)24E)28F)B'AX='1T<&QL;&QP<'1X>'R`@("$A(2(C)"0E)24D)",C(B`?'AT<&QL; M&QH:&AH:&AH9&!<6%104$Q,2$A$0#@T,"PH)"`<'!P<'!P<&!@8'"`@)"0H* M"PL+#`P,#0T-#@X.#@X.#@X/#Q`0$1$1$!`0$!`0$!`0$!`0$!`0$!`0$!$1 M$1`/#PX-#`P,#`T-#0T-#`L+"@H*"@L+#`P,#0T-#@X/#Q`1$A,3%!05%145 M%145%!03$Q,3%!04%!45%!03$Q$0#PT,"@D)"`<&!00"`0````````$!`0$! M`0$"`@,$!04&!P@)"0H+#`T/$!$2$Q,3%!04%!03$Q,2$1`/#@X-#0T-#`P, M#`P-#0T.#@\/#P\/#PX-#0P+"@D("`@("0D*"@H)"0@("`@(!P<'!@8%!04% M!04&!@8%!04%!`0$!`,#`P,#`@("`@$!`/_^_?W\_/OZ^?CW]O3S\_+R\?'P M\._O[^_P\/'R\O/S]/7V]_?X^/GY^?GY^?CW]_;V]?7U]?3T]//S\_3T]?7U M]?3U]?7U]?7U]?7T]//S\O+Q\?#O[N[M[N[N[N[O[^_P\/'R\_7V]_G[_/[^ M______[^_?W\^_OZ^??V]?7T\_/R\O'Q\/#P\/#P\/#P\/#O[^[M[>SLZ^OK MZNKIZ.?FYN7EY.3DX^/BXN+CX^3EYN?HZ>GJZNOL[>[O[^[N[>SKZ^KJZNKI MZ>CGY^;EY>3DX^'@W][=W=W=W=W=WM[>WMW=W=W=WM[?W]_>W=W'AX.#@W]_?X.#@X.#AX>+CY.7EYN;F MYN;EY>7EY>7DY./CXN'?W][>W=W=W=W+BXN/C MY.7FY^?HZ.GIZNOL[>[N[^_O\/#Q\?'Q\?'Q\?'R\O+Q\?#O[^[N[N[M[>SL M[.SL[.WM[N[O\/#Q\O/S\_3T]?7V]_?X^/CX^?GY^OK[^_O[^_O[_/S\_?W] M_?W\_/S\_/S\_?W\_/S[^_O[^_S\_?[^_P`!`@(#`P,#`P("`@$!`0("`@$! M`0```0$!`0#__OW\^_O[^_OZ^OKZ^OGY^OKZ^OKY^?GX^/?V]?7T]//S\O+R M\O+R\O/T]?;W^/CX^/CX]_;V]?/S\O'P\/#P\/'Q\?+R\_/T]/7U]?7T]//S M\_/S\_/S]/3T]?7V]O?X^/GY^OKY^?GY^?GZ^OK[^_S\_?[^_O_______O[^ M_O[^_?W]_?W]_?W]_?W^_@`!`@,$!`4%!`0$`P,"`0$```#______P````$! M`0("`@("`@("`@("`@("`P0%!@<("0H*"PP-#@\/$!`0$!`0$!`0$1(2$Q05 M%A87&1H;'1X@(2$B(B(B(2$A("`?'QX>'AX>'AX='1T='1T>'AX>'1T='1T= M'A\?("$A(2$A(2`@'Q\?'AX>'AT='!L;&AH:&AH;&QP<'1T='AX>'A\?'QX> M'1T<'!P<'!L;&AH9&!@8&!<7%Q<7%Q<6%A45%145%A86%Q<7%Q<7&!@8&!D9 M&1D9&!@8&!<6%A85%A<7&!@9&!@8&!<7%Q<7%Q86%A44$Q,2$1$0$!`0$!`/ M#Q`0$1(3$Q,4%!05%A87%Q<7%A44%!,3$A(2$A(2$A(3$Q04%186%Q<7%A85 M%145%144%!03$Q,3$Q(2$A$0#PX.#0T-#0T.#@\/$!`1$A,3%!45%145%186 M%A85%144%!,3$Q,3$Q,3$Q,3$Q,2$A$0#PX.#0P+"PH*"@H+"PL,#0T.#@\/ M#P\/#P\.#@T-#`P,#`L+"@H)"0D)"@H)"0D("`D)"@H*"PL+"PP,#0T.#Q`0 M$`\.#0P+"@D(!P8&!00#`P("`@$!```!`0$"`@("`@("`@("`@(!`0`````! M`0$!```````!`0("`@(#`P,#`P("`0#__OW\^_KY^?CW]_?V]O;U]?7V]O?W M^/GY^OK[_/S]_O__``$"`@(#`P,#`P,#`P("`@$!`0````#____^_O[]_?W\ M_/O[^_S\_?W]_O[^_O[__P``````__[]_/KZ^?CW]_;U]?3T]/7U]?;V]O;U M]?7T]//S\_+R\?#O[N[M[>SLZ^OKZ^OKZ^OKZ^OKZ^OJZ>GHZ.CHZ.GIZNOL M[>WN[N[M[>WM[N[O\/'R\_3V]_CY^OO\_/S\_/S\_/S\_/O[^OGY^/?V]?3S M\_+R\O/S]/3T]?7U]?7U]O;V]O;U]?3T\_/S\_/T]/7U]?7U]?7U]O?X^?GY M^?GX^/?V]O7T\_+Q\/#O[^_O[^[N[>WL[.OKZNKJZ>GHZ.?FYN7EY>7DY./C MXN+BX>'AX.#?WM[=W=W=W=W>WM_@X>'AXN+BXN+CX^3DY.3DY.3DX^/BXN+B MXN/DY>;GY^?GY^?GY^?HZ>GJZNKJZNKKZ^OL[.SLZ^OKZ^OKZ^OL[.SL[>WN M[N_P\/'R\O/S]/3U]?7U]?;V]O;V]O7U]?7U]?7T]/3T]//S\_/S\_3T\_/S M\O'P[^_N[>WM[>WM[>[N[N[N[N[N[N[O[^[N[N[N[^_P\/#P[^_O[^_P\/'R M\O+R\O+Q\?'Q\?'P\/#P\/'R\_3U]O?X^/GZ^_S]_?[_`````0``___^_?S[ M^_O[_/S]_O\```$"`@,#`P,#`P,#`P,"`@$!`/___________O[^_O[^_O[] M_?W\_/S\_/S\_?W]_?[^_O[_____````___^_OW\_/O[^OKZ^?GY^?KZ^_O] M_O\!`@,$!08&!@<&!@8%!`0#`P("`0#__OW\_/S[^_O[_/S]_?[^_O______ M``````#_____```!`@,$!`4%!@8&!P<'!P@("0D*"PP,#0X.#P\/$!`0$!`/ M#PX.#0P,"PL+"PL,#`T-#@X.#@X.#@\0$1(3%!46%A87%A85%103$Q(1$1`/ M#@P+"0<&!`,"`0````````$!`@("`P,#!`0$!`0$!`0%!08&!@<'!P<'!@8% M!04%!`0%!04&!@<("0D*"PL,#`P-#`P,"PH)"0@(!P<'!@8&!@8'"`D*"@L+ M"PL,#`T.#P\0$1$1$1$1$1$2$A,4%146%Q<7%Q86%144$Q,3$A(2$A(2$Q,4 M%146%A87%Q<8&!@8%Q<7%A44$Q(2$1$1$1(2$A(2$A(2$A(3$Q04%!45%145 M%145%145%144%!04%!,3$Q,3%!04%!04%!04%!,3$Q(2$A(2$A(3$Q,3$Q,4 M%146%Q@9&AL<'!T>'Q\@(2$A("`@'Q\>'AT<'!L:&1D8%Q85%!,2$1$0$`\/ M#@T,#`P,#`T-#@X/#P\0$!`0#P\.#0P+"@D)"`<'!P8&!@8&!@8&!P<'!P<' M!P8&!@8&!@8&!04$!`,#`P("`0$``/____\```$"`P0$!04%!04%!00$`P(! M`/__________```````!`0$"`@,$!`0$`P,#`P,#`P,#`P("`@("`@("`P,# M`P,#`P,$!`4%!04%!04%!`0$`P,"`@(#!`0%!@<("`@("0D*"PP,#0T.#@X. M#0T-#`P+"PH*"0D("`@("`<'!P<&!@8&!P<'!P<("`@("0D("`@'!@4$!`," M`@$`__[]_?[^__\``0$"`P0$!04%!04$`P,"`0$!````______[^_O[^_O[^ M_O[^_____P````$!`0$!`0``_________OW]_/OZ^?CV]?3R\?'P\/#P\/#P M\/'Q\?'R\O/T]/7V]O;V]O;U]?3S\O'P[^[N[>WM[.SL[.SKZ^OL[.SL[.WM M[>WM[>SL[.OKZNKIZ.CGY^?GY^?GY^;EY>3DY.7EYN;FY^?GZ.CHZ>GJZ^SL M[>[N[^_P\/'Q\?+R\O/S\_/S\_+R\?'P\._P\/#P\?'Q\?'Q\?+R\_3T]?7V M]O;V]O;W^/CY^?KZ^?GY^/CW]_;V]O7U]?7U]?7U]/3T\_/S\_+R\O+R\O/S M\_/S\_/T]//S\_/R\O'Q\._O[NWLZ^KJZ>CHY^?GZ.CHZ>GIZNKIZ>GHY^?F MY>7EY>7DY.3DY.7EYN;GY^CHZ>GJZNKJZNGIZ>CHZ.CHY^?GYN;FY>7DX^/B MXN+BXN+BXN+BXN+CX^3EY>;GZ.GJZ^SM[>[N[^_P\?'R\O+R\?'P[^[N[>WM M[>WL[.SKZ^KJZ>GIZ>CHZ.CHZ.CHY^?GY^?GY^?GZ.CHZ.GIZ>GJZNKJZNKJ MZ>GIZ>GJZNKKZ^SL[>[N[N_O[_#P\?'R\O/T]/7U]O;V]O?W]_CX^?GY^OKZ M^?GY^/CW]_?W^/CX^?GY^OK[^_O[_/S\_/S[^_O[^_O[^_S\_/S]_?[__P`` M`0$!`0$"`@(#`P,#`P0$!`4%!08&!@8&!P<'!@8%!00$!`0$!`0$!`4%!@<' M"`D)"0D*"@H*"@D)"0@(!P<'!P<'!@8&!@<'"`@)"0D*"@H)"0D)"0D("`<' M!@8%!00$!`0$!`0$!04%!04&!@8&!@8&!04%!@8&!P<'!P@("0H+#`P,#`P+ M"PL*"@H*"@H*"@H*"@H*"@H+"PL+"PL+"PL+"PL+"PL+"PL+"PL,#`T-#0X. M#@\/$!`0$1$1$A(3$Q,4%!05%145%145%186%A86%A87%Q<7%Q<7%Q<6%A45 M%!,3$Q(3$Q,3$Q,3$Q,3$Q,4%!04%145%145%!04%!03$Q(2$A$1$1$1$A(2 M$A(2$A(2$Q,3$Q,3$Q04%!45%145%145%145%!04$Q,2$A$1$!`0#Q`0$!`0 M$!`0$1$1$A(2$Q,3$Q04%!04%145%146%A87%Q<7&!@7%Q<7%Q<7%A86%145 M%186%Q<7&!@8&!@7%Q<7%A86%A85%145%104%!04%144%!,3$A$0#PX-#`P+ M"@D(!P8%!`0#`P("`@("`@("`@,#!`0$!`0$!`0#`P,#`P,#`P,#`P,$!`4% M!@<("0D*"@L+#`T-#@X.#@X.#@X-#0T-#0T-#0T-#0T-#0T-#@X.#P\/$!`1 M$1$2$A(3$A(2$1$1$1`0$1$1$1(2$A(2$A(2$1$1$!`0$!`0$`\/#P\/#P\/ M#P\/#@X-#0P,#`P,"PL+"@H)"0@(!P<&!@8&!@8&!P<'"`@)"0H+"PL+#`L+ M"PL*"@H*"0D("`<&!00#`0#__OW]_/O[^OGY^/CW]_?W]_?W]_?W]_?W]_?V M]O;W]_?W]_?W]_?W]_?V]O;V]?7U]?7T]/3T]/7U]?7U]?7U]?7U]?7T]/3S M\_+R\O+R\O+S\_/T]/7U]?;V]_CX^/CX^/?W]_;V]O7U]?3U]?7U]?7U]/3S M\_/S\_/S\_/S\_3T]/7U]?;V]_CX^?GZ^OKZ^OKY^?CX]_?W]_?W]_?X^/CY M^?GY^?GY^?GY^?GY^?CX^/CX^/CX^/CY^?KZ^OKZ^OKZ^OKZ^OGY^?GY^?CX M]_?V]O7U]?7U]?7T]/3T]/3T]?7U]?7U]?7U]?7U]?3T\_/R\O+Q\?'Q\?'Q M\?+R\O+R\O'Q\._O[N[M[>WM[.SL[.OKZ^OKZ^OL[.SL[.WM[>WM[>WM[.SL M[.OKZ^OKZNKIZ.?GYN;EY>7EY>7FYN;GY^?HZ.CHZ.CHZ.CHZ.?GY^?FYN7E MY.3DX^3DY>7FYN?GY^CHZ.GIZ>KJZNKJZNKJZ^OKZ^OKZ^OKZNKKZ^OK[.SM M[N_P\/'R\O/S\_/S\_/S\_/S\_/R\O+R\O+S\_/S]/3T]?7U]O;W]_CY^?KZ M^OKZ^?GX^/CW]_;V]O;V]O;U]?7T]/3T]/3T]//S\_/R\O+R\?'Q\/#P\/'Q M\?'Q\?'R\O+S\_3T]/3S\_/T]/3T]/3T]/7U]?;W]_CX^?K[^_S\_/W]_?W] M_?S\^_O[^OKZ^OKZ^OKZ^OKZ^OO[^_O[^_S\_/S[^_O[^_KZ^OGY^?CX^/CX M^/CX]_?W]_;V]_?W]_?W]_?W]_?W]_CX^/GY^?GY^/CX^/CX^/CX^/CX^/CY M^?GZ^OK[^_S]_?[__P```0$!`0$"`@(#`P,#`P,$!`0$!`,#`P0$!`4%!@8& M!P<'!P<'!@8%!04%!04%!04%!04%!@8&!@8%!00$!`,#`P,#`P,#`P0$!08' M"`@)"0H*"@L+"PL+"PL+"PL+"PH*"@D)"0D("`@("`@("`@'!P<'!P<'!P8& M!@8%!04%!08&!P<'!P@("`D)"@L+"PL+"PL+"PH*"@H*"0D)"0D)"0D)"0D) M"0D)"0D)"0D)"0D)"0H*"PL+"PP,#`P,#`P+"PH*"0D("`@(!P<'!P8'!P@( M"0D*"@L+"PP,#0T.#@\/$!`0$!`0#P\/#P\/#P\/#PX.#@\/#Q`0$!`0$!`0 M$1$1$1$1$1$0$!`/#P\/#@X.#@T-#`P,#`P,#0T.#@\0$1$2$Q04%145%145 M%145%146%A86%A86%A86%A86%Q<7%Q@8&1H:&AL;'!P='1T>'AX>'AX='1T< M'!P<'!P<'!P<'!L;&QL:&AH9&1@8%Q<7%A86%A45%145%145%146%A87%Q<8 M&!@8&!@8&!<7%Q<6%A44%!,2$A$1$!`0#P\/#Q`0$!`1$1`0$!`/#P\/#P\/ M#P\.#@X-#`P+"PL+"PH*"@H)"0@("`@(!P<'!P8&!@8%!04%!00$!`0$`P,# M`P,#`P,#`@("`0$!`````````0$!`0$!`0$!`0$```#______O[_______\` M``$!`@,#!`0$!`0$!`,"`@$``/___O[^_O[^_O[^_O[___\``````0$!`0$` M`/____[^_O[^_O[^_O[^_O[^____`````0$!`@("`@,#`P0$`P,#`@("`0`` M_____O[^_O[^_O[^________________``````````````#___[^_O[^_O[^ M_O[^_O[^_O[^_O____[^_OW]_/S\_/O[^OKY^?GX^/CW]_;V]O;V]O;U]?7U M]?7U]?3T]//S\O+Q\?'Q\?'Q\?'R\O'Q\?+R\O/S\_3T]//S\_/S\_/S\_/S M\_/S\_/S]/3T]/3T\_/S\_/S\_/S\O+R\O+R\?'Q\/#O[^_N[N[M[>WL[.SK MZ^OKZ^OKZ^OKZ^OKZNKJZNKJZNOKZ^OLZ^OKZNKJZNGIZ>KJZNKKZ^OL[.WM M[N[O[_#P\/'Q\?'Q\?'Q\/#P\/#P\/'Q\?'R\O+R\O+R\O+R\O+R\O+R\O+R M\O+R\O+R\O/S\_/T]/3T\_/S\_/S]/3U]?;V]_?X^/GZ^OKZ^OGY^?CX^/?W M]_?V]O7U]/3T]/3U]?7U]?;V]_?X^/CX^/CX]_?W]_;V]O7U]/3T]/3T]/3U M]?7V]_?X^?KZ^_S\_?W]_O[^_OW]_?W\_/O[^OKY^/CX^/CW]_?W]O;V]O;V M]O;V]O;U]?7U]?7U]?7T]/3S\_/R\O+R\O+R\?'Q\?'Q\?'Q\?'Q\?'Q\O+R M\O/S]/3U]?7U]?7U]?7U]?7U]/3S\_+R\O'Q\?#P\/#P\?'R\O/T]/7U]O;V M]_?W]_?W]_?V]O7U]?7U]?;V]O;V]_?W^/CX^/CX^/CX^/GY^?GY^?KZ^OO\ M_/W]_O[^_____P````$!`0$!`0$!`@("`P,#`P0$!`0$!`0$!`0$!`0$`P,# M`P,#`P,#`P0$!`0$!04%!04%!04%!04$!`0$!`,#`P,#`P("`@("`P,#`P0$ M!04%!@8&!P<'"`@("`@("`@("`@("`@("`<'!P<'!P8&!@8%!04%!04%!04% M!04%!04%!04%!`0$`P,"`@(!`0$!`0$!`0$"`P,$!`0$!04%!04%!04%!04$ M!`0#`P,#`P,$!`,#`P,#`P(#`P,#!`0$!04%!@8&!P<'!P8&!@8&!@8%!04% M!04%!04%!08&!@<'"`@)"0D*"@H+"PL+"PL+"PP,#`T-#0T.#@X.#@X.#P\/ M#@X.#P\/#P\0$!`0$1$1$A(2$A(2$Q(2$A$1$1`0$`\/#P\.#@X.#@X.#P\/ M#P\/#Q`0$!$1$1$1$1$1$!`0$!`/#P\/#@X.#@T-#0T-#`P,#`P,#0T-#0T- M#0T-#0X.#@X.#@X-#0T-#0P,#`P,#`L+"PL+"PL,#`P,#0T-#@X.#@X.#@T- M#0P,"PL*"@H)"0D)"`@("`@("`D)"0D*"@H*"PL,#`P-#0T-#0P,#`P,"PL+ M"PL+"@H*"@H*"0D)"0D)"0D)"`@("`@'!P8&!04%!04$!`0$!`0$!`0$!`0$ M!`0$!`0$!`4%!04%!@8'!P<'"`@(!P<'!@8&!@4%!04%!04$!`0$!`0$!`4% M!04%!@8&!@8&!@8%!04%!`0$`P,#`@(!`0$!`````0$!`0("`@,#!`0%!04& M!@8%!04%!04%!04%!04%!04%!@8%!04%!@8&!@8&!@<'!P<("`@("`@("`@( M"`@'!P<'!P8&!@8&!@8&!@4%!04%!04%!04%!04%!`0$`P,"`0$``/___O[^ M_?W]_/S\_/S\_/S[^_O[^_O[^_O[_/S\_/O[^OKZ^?GY^?GX^/?W]O;U]?7T M]//S\_+R\O+R\O+S\_/S]/3U]?;V]O;V]O;V]O;V]_?W]_CX^/GY^?GY^?GY M^/CX^/CX^/CX^/CX^/CX^/CY^?GY^?GY^?GY^?CX]_?V]O;V]O;V]_?W]_CX M^/CY^?GY^?GY^?KZ^OO[_/S]_?W]_?[^_OW]_?S[^_KY^/CX]_?W]O;V]O;W M]_?X^/CX^/CX^/CX^/?W]O;U]?3T]/3S\_/S\_3T]/7U]?;V]O?W]_?W]_?V M]O;V]O7U]?3T]/3T]/3T]/3T]/3T]//S\_/S\O+R\O+R\_/S\_/T]/3T]/7U M]?7U]O;V]O;V]O;V]O;V]O;U]?7U]/3T]/3T\_/S]/3T]/3T]//S\_/R\O'Q M\/#P\/#P\/#P\/#P\/'Q\O+R\_/S]/3T]/3T]//S\_/S\_/S\_/S\_/S]/3T M]/3T]/3S\_/S\_+R\O+R\_/S\_/S\_/S\_3T]/3U]?7U]?7U]?;V]O;V]O;W M]_?W]_CX^/CX^?GY^OKZ^_O[_/S\_/S]_?W]_?W]_?W]_/S[^_KZ^OGY^?GY M^?GY^OKZ^OKZ^OKY^?GY^/CW]_;V]O;V]O;V]_?W^/CX^?GZ^OO[_/S\_?W] M_O[^_O[^_?W]_?W]_?S\_/S\^_O[^_O[^OKZ^OKZ^OKZ^OKZ^OK[^_O[^_O[ M_/S\_/S[^_OZ^OKY^?GY^/CX^?GY^OK[^_S\_/W]_O[___\```````````$! M`0$"`@("`@("`@("`@$!`0$!`@("`P,#!`0$!`0%!04&!@8&!@8'!P<'!P<' M!P<'!P<'!P<'!P8&!@8&!@8&!@8&!@8&!P<'!P<'!P<'!P<'!P<("`@("`D) M"0D)"@H*"PL+"PL+"@H*"@D)"0D("`@("`@("`D)"0@("`@("`@("`@("0D) M"0D*"@H*"@H*"0D)"0@("`@'!P<'!P<("`@("`D)"0D)"@H*"@H*"@H)"0@( M!P<&!@8%!@8&!@8&!P<'!P<'!P<'!P<'"`@("`@(!P<'!P<'!P<("`@("`@( M"`@)"0D*"0D)"`@(!P<'!@8&!@8&!@8&!@8%!04%!04%!`0$!`0$!`,#`P,# M!`0$!04%!@8'!P@("`@("`@("`@("`@'!P<'!P<&!@8&!@8&!@<'!P<'!P@( M"`@("`D)"0D)"0D)"0H*"@L+"PP,#0T-#0X.#@X.#@X-#0T,#`P,#`P,#`P, M#0T-#0T.#@X.#P\/$!`0$!`0$!`0#P\/#P\/#P\/#PX.#@X.#0T-#0T-#0T, M#`P,#`P,#`P,#`P+"PL*"@H)"0D)"0D)"0D)"0D)"0D)"0D)"0D("`@(!P<' M!@8&!@4%!04%!04%!00$!`0$!`0$!`0$!`0$!`0#`P,#`@("`@$!`0$!`0(" M`@("`P,#!`0$!`0$!`0#`P("`@$!`0$!````````````````````________ M___^_O[^_O[^_?W]_?W]_/S\_/S\_/S\_/S\_/S\_/W]_?W^_O[^_O______ M___________^_O[^_O[^_?W]_?W]_?W]_?W]_?[^_O[^_O[_______[^_O[^ M_O[^_O[^_O[^_O___P```````0$!`@("`@,#`P,#`P,#`P,#`P,#`P,#`P(" M`@(!`0$!`````````````/_____^_O[^_?W]_?W]_?S\_/O[^_KZ^OGY^OKZ M^OKZ^OK[^_OZ^OKZ^?GY^?CX^/CX]_?W]_;V]O;U]?7U]?7U]?7U]?7U]?7U M]?7U]?7U]?7U]?7U]?7T]/3T]/3T\_/S\_/S]/3T]/3T]/3T]/3T]/3T]/7U M]?7V]O;V]O;V]O;V]O7U]?3T]//S\_/S\_3T]/7U]O;V]_?W]_?W]_;V]O;V M]O;V]O7U]O;V]O;V]O;W]_?W]_?W^/CX^/CX]_?W]_?W]_;V]O;V]O;U]?3T M]/3S\_/S\_/R\O+R\O+R\_/S\_/S\_/T]/3T]/3T\_/S\_/S\_/S\_3T]?7U M]O;V]_?W]_?X^/CX^/CX^/CY^?GY^?GY^?CX^/CX^/CW]_?W]_?W]_?W]_?W M]_CX^/CX^/CX^/GY^?GY^?GY^/CX^/?W]_;V]O;V]_?W]_CX^/CY^?GY^OGY M^?GX^/CX]_?W]_?V]O;V]_?W]_?W]_CX^/CX^/CX^/CX^/CY^?KZ^_O\_/S] M_?W]_?W]_?W]_?S\_/S\_/W]_?W]_?[^_O____________\`````________ M_________O[^_O[______P````$!`@(#`P,#`P,#!`0$!`0$!`0#`P,"`@(" M`@("`@("`@("`@("`P,#`P,#`P,#`P0$!`0$!`0$!`0$!`0$`P0$!`0$!`4% M!04%!04%!04&!@8&!P<'!P8&!@8%!04%!04%!`0$!`0$!`0$!`0$!`0$!`0$ M!`0$!`0$`P,#`P,#`P,#`P,#!`0$!`0$!`0$!`0%!04&!P<("`@)"0D*"@H* M"@H*"@H*"@D)"0@("`@("`@("`@("`@("`@("`@(!P<'!@8&!@4%!00$!`0$ M`P,#`P,#`P,#`P,#`P0$!`0$!`0$!04%!04%!04%!`0$!`0$!`0#`P,#`P,# M`P,#`P0$!`0$!`0%!04%!04%!04%!`0$!`0$`P,#`P,#!`0$!`0%!04&!@8& M!P<'!P@("`@'!P<'!P<'!P8&!@8&!@8&!P<'!P@("`@("`@("`@(!P<'!P<' M!P<'"`@("`D)"0D)"0D)"0D)"0D)"0D)"`@(!P<'!P<&!@8&!@4%!04%!04% M!04%!04&!@8&!P<'"`@("0D)"0D)"0D)"0D)"0D)"0D)"0D)"0D)"0H*"@D) M"0D("`@("`<'!P<&!@8&!@<'!P<("`@("`@'!P<'!P<'!P8&!@8&!@8&!@8' M!P<'!P<'!P@("`<'!P<'!P8&!@8&!@8&!04%!00$!`0$!`0$!`0$!`0$!`0$ M!`0$!`0$`P,#`@("`@(!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$! M`0$!`0$!`0```````/__________`````````````0$!`0$!`0$!`0$!`0$" M`@("`@("`@("`@("`@$!`0$``````/__________```````````````````` M```````````````````!`0$!`0``````_____O[^_?W]_?W]_?S\_/S\_/S\ M_/S\_/S\_/S\_/S\_/O[^_O[^_KZ^OKZ^OGY^?GY^?GY^?KZ^OKZ^OKZ^?KZ M^OKZ^OGY^?GY^/CX^/CX]_?W]_?W^/CX^/CX^/CX^/CX^/CX^/CX^/?W]_?W M]_?W]_?W]_?X^/CX^/GY^?GY^?GY^?GX^/CW]_?W]O;V]O7U]?7U]O;V]O?W M]_?W]_CX^/CY^?GY^?GY^OKZ^OKZ^?GY^?GY^?GY^/CX^/CY^?GY^?GY^?GY M^OKZ^OKZ^OO[^_O[^_O[^_O[^OKZ^OKZ^?GY^?CX^/CX^/CX^/CX^/CY^?GY M^?GY^?GY^?GY^?CX^/CX^/CX]_?W]_?W]_?W]_?W]_?W]_?W]_?W]_?W]_?W M]_?W]_?W]_?X^/CX^/CX^/CX^/GY^?GZ^OK[^_O[_/S\_/O[^_O[^_O[^_O[ M^_KZ^OKZ^OKZ^OKZ^OK[^_O[^OKZ^OKZ^_O[^_O[^_O\_/S\_/S\_/S\_/S\ M_/S\_/O\_/S\_/S\^_O\_/S\_/S\^_O[^_OZ^OKZ^OKY^?GY^?GZ^OKZ^OKZ M^OO[^_O[_/S\_/S\_/S\_/S\_/S\_/S\_/S\_/S\_/W]_?W]_?W]_O[^_O[^ M_O[^_O[^_O[^_O[^_O[^_O[^_OW]_?W]_?W]_?W]_?W]_?W]_O[^_O[^_O[_ M__________________[^_O[^_?W]_?S\_/S[^_O[^_OZ^OKZ^OKZ^_O[^_O[ M^_O[^_S\_/S\_/S\_?W]_?[^_O[^_O[^_O_______O[^_O[^_O[^_O______ M`````````0$!`0$!`0$!`0("`@("`@("`@("`@("`@("`@("`@("`@("`P,# M`P,$!`0$!`0%!04%!04%!@8&!@8%!04%!04%!04%!04%!04&!@8&!@8&!@4% M!04%!08&!@8&!@8'!P<'!P@("`@("`@("`D)"0D)"0D*"@H*"@H*"@H*"@L+ M"@H*"@H*"@H*"0D)"0D)"0D)"0D)"0D)"0D)"0D)"0D)"0D)"0D("`@("`@' M!P<'!P8&!@8'!P<'!P@("`@("0D)"0D)"0D)"0D)"0D("`@'!P<'!P8&!@8& M!@4%!04%!04&!@8&!@8&!P<'!P<'!P<'!P<'!@8&!@8%!04%!`0$!`0$!`0$ M!`0$!`0$!`0$!`0#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,# M`P,$!`0$!`0$!`4%!04%!04%!@8&!@8&!@<'!P<'!P<'!P<'!P<'!P@("`@( M"`@("`@("`@("`@("`@("`@("`@("`@'!P@("`@("`@("`@("`@("`@("`@( M"`@("`@("`@("`@("`@("`<'!P<'!P<'!P8&!@8&!@8%!04%!04%!00$!`0$ M!`0#`P,#`P("`@("`0$!`0$``````````/__________________________ M_____________O[^_O[^_O[]_?W]_?W]_?W]_?W]_?W]_?W]_?W]_?W]_?W] M_?W^_O[]_?W]_?W]_?W]_?W]_?W]_?W]_?W]_?W]_?W]_?W]_?S\_/S\_/S[ M^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^OKZ^OKZ^OGY^?GY M^?GY^?GZ^OKZ^OK[^_O[^_O[^_O[^_O[^_O[^_O\_/S\_/S\_/S\_/S\_/S\ M_/S\_/O[^_O[^_O\_/S\_/S\_/W]_?W]_?W]_?W]_?S\_/S\_/S\_/S\_/S\ M_/S[^_O[^_O[^_O[^_O[^_O[^_O[^_O\_/S\_/S\_/S\_/S\_/O[^_O[^_KZ M^OKZ^OKY^?GY^?GY^?GY^?GY^?GY^?GY^?GY^?GY^?GY^/CX^/CX^/CX^/CX M^/GY^?GY^?GY^?GY^?CX^/CX^/CX^/CX^/CX^/CY^?GY^?GY^?GY^?KZ^OKZ M^OKZ^OKZ^OKY^?GY^?GX^/CX^/CX^/CX^/CX^/CY^?GY^OKZ^_O[^_O[^_O[ M^_O[^_O[^_O[^_O[^_O[_/S\_/S\_/S\_/S\^_O[^_O[^_O\_/S\_/S\_/S\ M_/S\_/S]_?W\_/S\_/S\_/S\_/S\_/S\_/S\_/W]_?W]_?W]_?W]_?W]_?[^ M_O[^_O[^_O______________`````````0$!`0$!`0$!`0$!`0$!`0$````` M`````````/____________________________[^_O[^_O[^_O[^_O[^_?W] M_?W]_?W]_?W]_/S\_/S\_/S\_/S\_/S\_/S]_?W]_?W]_?W]_?W]_?W]_?W] M_?[^_O[^_O[^_O[^_O[^_O[^_O[^_O[______________P```````0$!`0$! M`0$!`0$"`@("`@("`0$!`0$!`0$!`0$!`````0$!`0$!`0$!`0("`@("`@(" M`@("`@("`0$!`0$!`0$"`@("`@("`@("`@("`@("`@("`@("`@("`@("`@(" M`@("`@$!`0$!`0$!`0$!`0$!`0$!`0("`@("`@(#`P,#`P0$!`0$!`0$!`0$ M!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0%!04% M!04%!04%!04%!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$ M!`0#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,# M`P,#`P,#`P,#`P,#`@("`@("`@("`@("`@,#`P,#`P,#`P,#`P,#`P,#`P,# M`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P("`@("`@("`@("`0$!`0$! M`0$!`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@,# M`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`@("`@("`@("`@("`@("`@("`@(" M`@("`@("`@("`@("`@("`@("`@("`@("`@("`@(#`P,#`P,#`P,#`P,#`P," M`@("`@("`@("`@("`0$"`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$! M`0$!`0$!`0$!`0$!`0$!`0$```````````````````#_________________ M_____P```````````/__________________________________________ M``````````#______________________________________P#_________ M_________O[^_O[^_O[]_?W]_?W]_?W]_?W]_?W]_?S\_/S\_/S\_/S\_/S\ M_/S\_/S\^_O[^_O[^_O[^_O\_/S\_/S\_/S\_/S\_/S\_/S\_/S\_/S\_/S\ M_/S\_/S]_?W]_?W]_?W]_?W]_?W]_?W]_?W]_?W]_?W]_?W]_?W]_?W]_?W] M_?W]_?W]_?W]_?W]_?W]_?W\_/S\_/S\_/S\_/S\_/S\_/S\_?W]_?W]_?W] M_?W]_?W]_?W]_?W]_/S\_/S\_/S\_/S\_/S\_/S]_?W]_?W]_?W]_?W]_?W] M_/S\_/S\_/S\_/S\_/S\_/S\_/S\_/S\_/S\^_O[^_O[^_O[^_O[^_O[^_O[ M^_O[^_O[_/S\_/S\_/S\_/S\_?W\_/S\_/S\_/S]_?W]_?W]_?W]_?W]_?W] M_?W]_?W]_?W]_?W]_?W]_?W]_?W]_?W]_?W]_?W]_?W]_?W]_?W]_?W]_?W] M_?W]_?W]_?W]_?W]_?W]_?W]_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^ M_O[^_O______________________________________```````````````` M```````````````````````````````````````````````````````````` M`````````````````````0$!`0$!`0$!`0$!`0$!`0`````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M``$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$! M`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`@("`@("`@("`@("`@("`@("`@(" M`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@(" M`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`0$!`0$!`0$!`@(" M`@("`@("`@("`@("`@("`@("`@("`@$!`0$!`0$!`0$!`0$!`0$!`0$!`0$! M`0$!`0$!`0$!`0$!`0$````````````````````````````````````````` M``````````````````````````````````````$!`0$!`0$!`0$!`0$!`0$! M`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$! M`````````````0$!``````````````````````$!`0$!`0$!`0$!`0$!`0$! M`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0`````````````` M````````````````````````````````````````____________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M______________________________________________[^_O[^_O[^_O[^ M_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^ M_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^ M_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^ M_O[^_O[^_O[^_O[^_O[^_O[^_O[^________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____`````/__________________________```````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M``!#3TU-````$@`!``"2```(0`VL1````````$U!4DL````"``!)3E-4```` M%#P``'\`?P``````````````````05!03````:A39#)A``(```````````#K M`.P!+@$O?_\`HP#L`2Y__W__`````````````````&>0,```G(@`.`!B`#@` MU@!+`&(`2P#6`$\`YP!/`/<`O@#G`+X`]P##`1X`PP%@`,0!'0#$`1X`Q`%@ M`,0!80#%`1P`Q0$=`,4!80#%`6(`TP$<`-,!'0#3`6$`TP%B`-0!'0#4`1X` MU`%@`-0!80#5`1X`U0%@```````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````$"```````"0`C```````` M`````````'@````$``0``````-'^`/___X`````!`2`&455N:71S```3""YP M9W-Z```)'E!!5",```DJ3%=25P```````0)&!B!S86UP3[_P``(F`21')U;2!/9B!%87)T M:'%U86ME(`(```!!249&4V0R80``04E&1E-D,F$!`/____\````````````` M``````````"G/9LK``"4#````>BDX[7XIIM-4@``````+`#B`1`".P$``+0! M*0&`__C_[````````(`````````````````````````````-`````2$'4V-R M:7!T3[_P``````M@!*`7(!W@$``)``Q@$`__C_ MXP```````(```````````````@``````&@`I``\!JP)@`"H``P)M`ST`O0#! M`8("40$`````&@`I``\!4`'Q`"H``P)M`ST`````X#;__P``````&@`L`!8! M/@'<`"H``P)M`ST#,P)M_,$";0``````&@`````````````````````````` M`&`````````!`````7X```!^````:@!QVJ04D@```!P`:@`!5W-T80`#`!)3 M1$]#````0@`!__\````&```````"__\````D```````#__\```!"```````$ M__\```!@``````/H__\````````````````````````````````````````` !`/\` ` end slashem-0.0.7E7F3/sys/share/sounds/mgcharp.uu0000664000076400007640000006075710545462317017122 0ustar alialibegin 644 Magic_Harp M``I-86=I8R!(87)P```````````````````````````````````````````` M``````````````````````````!!249&4V0R80$``&@``````````$0B```! MSJ<]K4JG/:U2``````````````````````````````"!@8QW``!&3U)-``!$ M&D%)1D934TY$``!"'@`````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M___________________________________________________^_O[^_OW] M_?S\_/S\^_CW]_?X]_7T]/;Z_?[_``$"`@(!`/[[^?CX^P`"`@("`@("`@(" M`@,!^.*]H)V@GZ.GK+*VNKJWN+:MFX:`B(R.CXJ#BIFGL[BZOL/(SM/:WN'@ MU='9X>ST]?7V^?X%"0L-$!(2$A$0#PT*"`@)#1$1$1`0$!`0$!`0#P\/"?KC MTL_.SM#3UMK>X-_>W]W5P["IJJNLK*:CK+C#S-#2U=K>X^?K[O#LXN+K]/X# M`@(#!@P2%1<9&QT='1P;&1<5%!,5&1L;&QL;&QH:&AH:&AD8$P+LW]S:VMS? MX^;IZ^KIZNC>R[NWN+BXM[&QN\;1V-K=X>7I[?'U]_CRZN[W_P@+"@L,#Q4: M'!XA(R0D)",B(!X<&QL>(B(B(B(A(2$A(2`@("`@&@?RY^7CX^3GZ^[Q\O+Q M\O#DT,/!P,#`OKBZQ=#:X.+EZ.SP]/C[_?SU\??_"`\0$!`2%1H?(2,E)RDI M*"@F)"(A("`C)B8F)B8F)24E)24D)"0D'@SW[>KHZ.KL\//V]_;V]_;IU?J[?'T^/S_`/[W]?P$#1,3$Q,5&1XB)"8H*BPL*RLI)R4D M(R0G*2DI*2DH*"@H*"ON M\O7Y_/\!`P'Y^0$($1<6%A<8&R`D)B@J+"XO+RXM*RDG)BSO\O;Y_/\" M`P#Y^0$)$1<7%Q<8&R`D)B@J+"XP+R\M*RDH)R@K+2TM+"PL+"PK*RLK*BHI M*2`,_?CS\/#Q\_?Z_/W]_?[UX]?4T,[-R\7$S=;@Z.ON\O7X_/X``?_X^``) M$1<7%Q<8&A\C)B_P\O7Y^_S\_/WWYMG4T,W,RL7"R=/KL\//V^OS^`/[W]?X'#Q87%A87 M&1TB)"8H*BPN+R\M+"HH)RCJ[O'U^/K\_OWW\_D$#146%A86%QH?(R4G M*2LM+RXM+"HH)R[Q]/?X^?KY\N7WP\_;X^OKX\/'Z!`X5%!04%!89'B$C)2WN\/3V]_?X].G>V=/.RL?$OKW& MS]CBY^KN\?3V^/CW\.WT_@@2%!,3$Q06&Q\A(R4G*2LL+"HH)B4E)RHJ*BHI M*2DI*"@H*"SBW-;0R\?%P+N^R-#;X^;J M[?#S]?;U\>KM]P`+$A(2$A(3%AL>("(D)B@J*RHH)B4D)2@I*2DH*"@H)RWKZNSO\?/S]/#EW]O4SLK&P[RYP,G2W>/FZ>WP\O3T M\NSH\/D##A$1$1$1$Q8;'A\A(R4G*2HH)B4D(R4H*"@H)RV-#+QL*[M;G"R];>XN;I[._Q\?#JY>KT_0@.#P\. M#Q`3%QH<'B`B)"8G)R8D(R(C)BKH MZ>OM[N_P[.'=WMC0RL2_MK.[Q,W8WN'EZ.SN[_#NY^/K]?X)#0T-#0T/$Q<9 M&QT?(2,E)ROHZ.CJ[.WN M[^K?W=[8T,G"N;&TOL;0V=S@Y.CK[>_O[.3C[/7_"0P+"PL,#Q,6&!H<'A\A M(R4E)"(A(2,E)20D)"0C(R,C(B(B(B$A'Q<)`P/^].[IY^?HZNOL[N_IW]W? MVM#'OK*ON,'*T]?;X.3HZ^WO[NOCX^WV``D*"@H*#!`3%1<8&AP>("(D)",B M(2$B)"0D)",C(R,B(B(B(2$A'QH-`P,!^?+LZ.?GZ.GJ[>_PZ=_>X-K/Q;>N ML[S$SM/6V^#DZ.OM[^[JX^/N]P`("0@("@T1$Q06&!D;'1\A(R0C(2`A(R0D M(R,C(R(B(B(A(2$A'QP1!`(#_O7NZN?GZ.GIZ^[P\.C?W^#:SK^RL;G`RL_2 MUMO@Y.CL[N_NZ>+E\/@""`<'"`H.$1(4%1<9&QT?(2(C(B$@(2,D(R,C(R(B M(B(A(2$A(!T3!@$#`/GQ[.CGY^CHZNWP\O'GW]_?V,FXL[B^Q\W/TM?;X.7I M[.[O[>?BZ/+Z`P<&!@D,#Q`1$Q46&!H<'B`B(R(A("$C(R,C(B(B(B$A(2$@ M(!T5"`("`?SU[>GGY^?GZ>SO\O3PY=[>W-+`M[J^Q'=W-7'O;W`QSI MY^?FY^KM\?7V].C>V];+Q<3$R,S,S,[1U=K@Y>KN\/#OZ./J\_H!!`4)"@L- M#@\1$A06&!H<'A\@(2`@(2(B(B(B(2$A(2`@'QT5!P$"`@#[\^WJZ.?FY^KM M\?7X]_#BV]7+R7F[_?]`P8("@L,#0X0$1,4 M%A@:'!X?("$@("(B(B(B(2$A(2`@'QP2!@$"`@'\]._KZ.?FY^KM\?7X^?7G MV]/+S-+2TM+/SL[.T=;;X>;K[_'R\.GE[/3[`@8("0H+#`T.$!$3%1<8&AP> M'R`@("$B(B(B(2$A(2`@'QL/`P("`@']]>_KZ>?FY^KN\O;Y^O?KV]#*SM;8 MV-71S\[.T-39W^7J[O'S\NWFZ?+X``<("`D*"PP-#Q`2$Q47&1L='A\@("`B M(B(A(2$A("`@'A@,`@("`@']]O#KZ>?FY^KN\O;Y^OCNW,[,TMC=WMC3T<_. MT-/8W>/H[?'S\^_GY_#W_P8'!P@)"@L,#@\1$A06&!H;'1X?'R`B(B$A(2$A M("`?'14(`@,"`0']]O#LZ>?FZ.OO\_?Y^OGPW'R`A(B$A(2$@("`>&Q$% M`@,"`@+]]O#LZ>?GZ>SP]/CZ^_GPW,S1V=WDYN#:UM/1T=/7W.'G[?'T]?/K MZ._W_@8(!P@)"@H+#0X/$1(4%A@:&QP>'R`A(B(A(2$A("`>&`L#!`0"`@+\ M]O#LZ>?HZNWQ]?G[^_CNVL_5W.'FYN/>V-73T=/7W.'H[?'U]O3MZ?#X_P8( M!P@)"0H+#`X/$!(4%1<9&QP='B`A(B(A(2$A(!\<$@8#!`0#`P'\]/#LZ.?I MZ^_S]_K\^_;KV=/9W^7GY^7@VM?4TM37W.'H[?'U]O3MZO'Y``8'!P@("0H+ M#`T.$!$3%1<8&AL<'B`A(B$A(2$@'QT7"P0$!`,#`P'Z\^_KZ.CJ[?'U^/K[ M^?/FVMC=Y.?GZ.CCW=G6U-37W.+G[?+U]O3NZ_/Z``8'!P@("0H*"PT.#Q$2 M%!88&1L<'1\A(2$A(2$@'AL0!00%!`,#`__X\NWJZ.GL[_/W^OO[]^WEX-WA MZ.CHZ>GFX-O7U=;8W>/H[O/V]_7N[?7\`08'!P@("0D*"PT.#Q$2%!87&1H; M'1\A(2$A(2$?'!0(!`4%!`,#`OWV\>SIZ>ON\O;Y^_OY\NKHX^#GZNCHZ>KG MXMW9U]?:W^3I[_7W^/7O\/C]`@<("`@("0H+"PT.#Q$2%!87&1H;'1\B(B$A M(2`=%PL%!@8$!`0$`?KT[NOJZ^WQ]?G[^_KU[>WMYN;JZ>GIZNOIX]_;V-G< MX.7K\?7W^/7P\OK_!`@("`@("0H+#`T.#Q$2%!87&1H;'2`B(B$A(!X8#04& M!@4%!`4#_?;Q[.KK[?#T^/K\^_;O[O/OZ>GJZNKJZ^SJY>##=V]S?Y.KO]/?Y^?3R^?\# M!P@("`@)"0H+#`T.#Q$2%!87&!H;'B`A(2`>&@\&!P<&!04%!0/\]>_L[.WO M\_;Y^_OW\/'W^O?OZNOKZ^OL[>_LYN#=W=[AY^SQ]?CZ^//U_0`%"`@("`@) M"0H+#`T.#Q$2%!87&1H<'R$A(!X:#P<'"`8&!04&!/[W\>[L[>_R]OGZ^O?P M\OG\_/;LZ^SL[.SM[_#LYN'?W^'EZN[S]_K[]?+Y``0("`@("`D)"@H+#`T/ M$!$3%188&1L='R(A'AD.!P@(!P8&!@8%`/CS[^WN\//V^?KZ]_'S^_[__/#K M[>WL[>WN\/'LYN+@X>/G[?+V^OSY\_?^`@<)"`@("0D)"@L,#0X/$1(4%1<8 M&AP>("`>&`T'"0D'!P8&!P8"^O3P[N[P\_;X^OKV\?3\_P(`]>SL[>WM[>[P M\O#JY>+BX^;K\/7Y_/OU]?P"!@D)"`@)"0D*"@L,#0X0$1,4%A@9&AT?(!X8 M#0<)"0@'!P8'!P3\]?'O[O#R]?CZ^?;R]?T!`P+Y[NSN[>WM[N_Q\N[HY.+C MY>GN\_?[^_?T^@$%"0H)"`@)"0D*"PP-#@\0$A,5%A@9&QX?'A@."`D)"`<' M!P<'!?_W\_#O\/+U^/GY]O+T_0$#`_SQ[.[N[N[N[_'S\>SGY./EZ.SQ]OK[ M^/3Y``0("@D("`@)"0H*"PP-#A`1$Q06%Q@:'1X=&A`("0H)"`<'!P<'`OKU M\>_P\?3W^?GW\O3]`0,$_O+L[N[N[N[O\/+S[^GEY.3GZ_#T^/KY]/@`!`@* M"0D)"0D)"@H+#`T.#Q$2%!47&!H<'1T:$0D)"@D("`<'!P@%_O?S\?#Q\_;X M^??S\_L!!`7_].WN[^[N[N_P\O3QZ^?EY.;J[O/W^?GU]P`%"`L*"0D)"0D* M"@L,#0X/$!(3%1<8&AP>'1P4"PD+"@D(!P<("`<#^_;R\?'S]??X^/3R^0$$ M!0'W[N[O[^[N[_#Q\_/NZ.;EYNCL\?3W^/7V_P4("PL*"0D)"0H*"PP-#@\0 M$1,4%A<9&QT='!@."0L+"@D("`@("`8`^?7R\?+T]OCX]?+W``,$`_GO[N_O M[N[N[_'R]/#JY^7EY^KN\O7V]/;^!0@,"PH*"0D)"0H*"PP-#@\1$A05%A@: M'!T=&A()"@L*"0@("`@("`3^^/3R\O/U]O?V\O/\`@,#_/'M[^_N[N[O\/'S M\NWHY>3FZ.SP\_7T]/L#!PL,"PH)"0D)"@H+#`P.#Q`1$Q06%QD;'1T;%@P) M"PL*"0@("`@("`/[]_3R\O3V]_?T\O@!`P0`]>[O[^[N[N[O\/+S\>OGY>7G MZNWQ\_/R^`('"@T,"@H*"0D*"@L+#`T.#Q$2%!46&!H<'1P:$@H*#`L*"0@( M"`@(!P'[]_/R\_3U]O7R\_P#`P/Z\._P[^[N[N_P\?/S[^GFY>7HZ^[Q\O'S M_@8)#0T,"PH*"@H*"@L,#0X/$!(3%!87&1L='1P8#@H,#`H*"0@("0D)!P'[ M]_3S\_3U]O3Q]@`#`__T[_#P[N[N[N_P\?/R[>GFY>;H[._Q\/#W`P@,#@T, M"PH*"@H*"PL,#0X/$1(3%188&AP='!L5#`H,#`L*"0D)"0D)!P'[]_3S\_3U M]?+Q^0$#`OOQ\/'O[N[M[N_P\?+Q[.?EY>;HZ^[O[O#\!@H.#@T,"PH*"@H+ M"PP,#0X0$1(4%1<9&QT='!H2"@L-#`L*"0D)"0D)!P+[]_3S\_3T\_#R_`(" M`/?O\?'O[NWM[N_P\?+PZ^?EY>;HZ^WM[?,`"`P.#@T,"PH*"@H+"PP-#@\0 M$1,4%A<9&QT=&Q@0"@P-#`L*"0D)"0D)!P+[]_3S\_3T\N_T_@("_O/O\?#O M[NWM[N_P\/+P[.?EY>;HZNSK[/8""0T/#@T,"PH*"@H+"PP-#@\0$1,4%A@9 M&QT<&A<."@T-#`L*"0D)"0D)"`/\^/7T\_/S\>_U_P(!_/+P\O#O[NWM[N_P M\/+Q[.CFY>;HZNOJ[/D$"@\/#@T,"PL+"PL+#`P-#@\0$1,5%A@:'!T<&A4- M"PX-#`L*"0D)"0D)"03^^?;T]//S\>_W``$!^O'Q\O#O[NWM[N_O\/+Q[.CF MY>7GZ>GH[?H%"@\0#PX-#`L+"PL+#`P-#@\0$A,5%A@:'!T<&A4-"PX.#`L* M"@D)"@D)"08`^O?U]//R\._W_P$`^?'Q\O#O[NWM[N[O\/'R[NGFY>7FZ.CG M[/D$"Q`0#PX-#`L+"PL+#`P-#@\0$A,4%A@:&QT;&14."PX.#`L*"@H*"@H) M"0<"_/CU]//R[^[V_P$`^/#Q\O#O[>WM[>[O[_#R[^KGY>7FY^?FZ_D#"@\0 M#PX-#`L+"PL+"PP-#@\0$1(4%A<9&QT;&14-"PX.#0P*"@H*"@H)"0D%_OKW M]?/R[^WT_0#_^/'R\_'O[>WM[>[N[_#R\.OHYN7EYN;EZO@""0\0#P\-#0P+ M"PL+"PP-#0X0$1(4%1<9&AP<&A8/"PX.#0P+"@H*"@H)"0H(`OSX]O3R[^WR M_/__^/'R\_'O[NWM[>WN[_#Q\>WHYN7EY>7CZ/8!!PT0$`\.#0P+"PL+"PP, M#0X/$!(3%188&AP<&A<0"PT/#@P+"@H*"@H*"0H*!?_[]_7S\.WP^?[^^?+R M]/+P[NWM[>WN[^_P\O#KZ.;EY>3BYO/^!@P0$`\/#@T,"PL+#`P,#0X/$!$3 M%!87&1L<&A@2#`P/#@T,"PH*"@H*"@H*"`/^^O;T\>[N]OS]^?/R]//Q[^[M M[>WN[N_P\?'MZ>?EY./BY._\`PH.$!`/#@T,"PL+"PP,#0T.#Q$2$Q47&!H< M&A@4#0L.#@T,"PH*"@H*"@H*"@WM[N[O M\/+PZ^CFY./AX>KX``<,#@\/#@T,#`L+"PL,#`T.#Q`1$A05%QD;&A@6$`L- M#@T,"PH*"0H*"0D)"@H&`/SX]/'M[O;[^O7Q\_3R\>_M[>WM[>[N[_'R[NKG MY>/AX.7S_0,)#`X/#PX-#`L+"PL+#`P-#@\0$1,4%A@:&QD7$PP+#@X-#`L* M"@H*"@D)"@L*!?_[]_/O[?#X^O;Q\O3S\O#N[>WM[>[N[_#R\>WIYN3BW^'L M^``&"PT/#PX-#0P+"PL+#`P-#0X/$!(3%188&AH8%@\*#`\.#0P+"@H*"@H* M"@H+"@7_^O;R[NWS^?CS\?3U\_'P[NWM[>[N[N_Q\_'LZ.;CX-_E\OP""`L- M#P\.#0P,"PL+"PP,#0T.$!$2%!47&1H9%Q0-"@X/#@T+"@H*"@H*"@H*"PH% M__KV\>WN]?GU\?+U]/+Q[^[N[N[N[N_P\O/P[.CEXM[@Z_;]!`D+#0\/#@T, M"PL+"PL,#`T.#Q`1$A05%QD:&!81"PL/#PT,"PH*"@H*"0D*"@P*!?_Z]?#M M[_;W\O#S]?3R\>_N[N[M[N[O\/+S\.OGY.#=XN_Y_P4("PT/#PX-#`L+"PL+ M#`P-#@\0$1(4%1<9&!84#@D,#PX-#`L*"@H)"0D)"@H,"@3^^?3O[?+W]?#Q M]/3S\O#O[N[N[N[N[_#R\_#KY^/?WN;R^@`&"`L-#PX-#0P+"PL+"PL,#0T. M$!$2%!47&!84$0H(#0\.#0L*"@H*"@D)"0H+#`H$_OCR[N_U^/3P\O7T\_+P M[N[N[>[N[N_Q\_3Q[.?CW]_I]/L!!@D+#0\.#0P,"PL+"PL+#`P-#@\0$A,5 M%Q84$@P'"0X.#0P+"@H*"@D)"0H*"PP(`OSV\._T^?GT\/+U]//R\._N[N[N M[N_P\?/U\NWHY.#AZ_;\`@<)#`X/#@T-#`L+"PL+"PP,#0X/$!(3%184$@X' M!@L.#@T,"PH*"@H*"@H*"PT,!P#Z\^_S^OOZ]/#S]?3S\?#O[N[N[N[O\/'T M]O3NZ>7@XN[W_0,'"@P/#PX.#0P+"PL+"PL,#`T.#Q`1$Q04$0X(`P<+#`T, M"PH*"@H*"@H*"PP-"P3^]_'R^OW]_/3P]/7T\_'O[N[N[N[N[_#R]/;U\.OE MX>3O^/X$"`H-#P\.#@T,"PL*"@L+"PP-#0X0$1,2$`X(`@0)"@L,"PL*"@H* M"@H*"@L,#0D!^O/P^/____ST\?3U]/+P[^[N[>[N[N_P\O3W]O'LYN+G\OK_ M!0@+#@\/#@T,#`L*"@H*"@L+#`T.#Q$1#@P(`0$&"`D*"PL*"@H*"@H*"@L, M#0L$_?;Q]_\"`0#Z\O+U]?3R\._N[N[N[N_P\?/U]_CS[>?DZO7\`08)#`X/ M#PX-#0P+"@H*"@H+"PP-#A`0#@L'`/\#!@<("0H+"@H*"@H*"@L,#@T'`/CS M]OX#!`+_^/'S]?7S\?#N[N[N[N_O\/+T]OCX\^WGYN_X_@,'"PT.#PX.#0P, M"PH*"@H*"PL,#0X/#0H'`/T"!08'!PD*"PL+"@H*"@L,#0X+`_KT]_X#!@4! M_?;Q]/;T\_'O[N[N[N_O\/'S]??Z^?3MY^KT^P`%"0P.#@\.#@T,"PL*"@H* M"@L+#`T-"PD%_OL``P0%!@<("@L+"PH*"@L,#0X+!/OU^/\#!@<#`/KS\O7U M\_'P[N[N[N[O\/#R]/;Y^_GS[.GO^?X#"`L-#@X.#@T-#`L*"@H*"@H*"PP- M"@<#_/K_`@(#!`4'"0H+"PL*"PL,#0X,!?SV^0`#!@@%`O[V\?3U]/+P[^[N M[N[O[_#Q\_7X^OSY\NSM]OT"!@D,#0T.#@X-#`L*"@D)"0H*"@L+"`4!^OG^ M``$!`@,%!PD+"PL*"PL,#0X,!OWX_`($!PD'`P#Z\_+U]//Q[^[N[N[O[_#Q M\_7W^?S\]_#M]/P`!0@+#0T-#@X-#0P+"@H)"0D*"@L*!@/^^/G]_P```0($ M!@@*"PL+"PP,#0X,!OWY_P0%!P@(!0+]]?'T]?/R\.[N[N[O\/#Q\O3W^?O] M_/7O\_L`!`@*"PP-#0X-#0P+"PH)"0D)"@H(!`'[]OG]_O__``$#!0<)"PL+ M"PP-#0X-!?W\`04&"`@)!P/_]_+S]?3R\._N[N[O\/#Q\_3V^?O]_OKS\_L` M`P@*"PP,#0T-#0P+"PH)"0D)"0D&`__X]?G\_?[^_P`"!`8("@L+"PP-#0T, M!?[_!`8'"`@)!P,`^O+R]?3R\>_N[N_O\/'R\_3V^?O]__WV]/L!!`<*"@L, M#`T-#0P+"PH)"0D)"0@$`?SU]OK\_/S]_O\!`P4'"0H+"PP-#0T+`_\"!P<( M"`@)"`0!^_/R]?3R\?#O[N_O\/'R\_3V^/O]___Y]OL"!`<)"0H+#`P,#`P+ M"PH)"0@("`4!_OCS]OO[^_O\_?X``@0&"`H+"PP,#0T)`P$&"`<(!P<)"`0! M^_3R]/3S\?#O[^_O\/'R\_3V^/O]_P#\^/T#!0@)"0D*"PP,#`P+"PH)"0@( M!P/_^_3T^/KZ^OO[_/[_`0,%!PD+"PP-#`P(`P4)"`@(!P@)"`0!^_3R]/3S M\?#O[^_P\/'R\_7W^?O]_P'^^OX$!@@)"0D*"@L+#`L+"@H)"`@(!`#]]O+U M^?GZ^OK[_/W_`0,%!PD+#`P,#`H&!0D*"0@'!P@)"`0!^_3R]?3S\O#P\/#P M\?+S]/7W^?S^``'__0$&"`D*"0D)"@L+"PL+"@H)"`@&`?[Y\_/W^?GY^?GZ M^_W_`0,$!@D+#`P,#`D&"0L*"0@'!P@)"`0!^_3R]?3S\O'P\/#Q\?+S]/;X M^OS^``$`_P,("0H)"`@)"0H+"PL+"@H("`<#_OOT\O;X^/CX^/GZ^_W_``($ M!@@+#`P+"@D*#`L)"`<'!P@)"`,`^O/R]?3S\O'P\/'Q\O/T]??Y^_W_`0$" M`@8*"@H)"`@("0H*"PL*"@D)"`3_^_7Q]/?X]_?W^/CZ^_W_``($!@@+#`L* M"0L.#0L)"`<'!P@)!P+_^/+S]?3S\O'P\?'R\_3U]O?Y^_X``0("!`D,#`L) M"`@("0D*"@H*"0D(!0#\]_'S]_?W]_;W]_CZ^_W^``($!@@*"PH*#`\.#`H( M!P<'"`D)!@'^]_+T]?3S\O'Q\?+S]/3V]_CZ_/\!`@($"`T.#`H(!P<("`D) M"@H*"0D&`?WX\O/V]_?V]O;V]_GZ_/W^``($!@@*"@D,$!`-"P@'!P<'"`D( M!`#[]/+U]?3S\O+R\O+S]/7V^/G[_@`!`@,&#`\.#`H(!P<'"`D)"0D)"08! M_?CR\O;W]_;V]?;W^/G[_/W_``,%!PD)"0T2$0X,"0<'!P<("`D&`O[X\_/U M]?3S\O+R\_/T]?;W^?O]_P$"`P0*$!$.#`D'!P<'"`@)"0D)!@']^//S]O?V M]O7U]?;W^/K[_/W_`0,%!P@)#1,3#PP)"`<&!P<("`@$`/OU\O3U]?3S\O+S M\_3U]O?X^OS^``(#`P8.$Q$."PD'!P<'"`@("0D&`?WX\_/V]_;V]?7U]?;W M^?K[_/[_`0,%!@@.%!,0#0H'!@8&!P<("`4!_OCS\_;U]?3S\_/S]/7V]_CZ M^_W_`0,#!`L3$P\-"@@&!@8'!P@("`4`_?CS]/?W]O;U]/3U]O?X^?K[_?X` M`@,$!@X5%!`-"@@&!@8&!P<(!P+^^_7S]?;U]?3S\_3T]?;W^/G[_?\``@,$ M"!$5$@X+"0<&!@8&!P<(!0#]^/3U^/?W]O7U]?7V]_CY^?K\_?\!`@,%#!45 M$0X*"`8&!@8&!P<'!/_\]O/U]O;U]?3T]/3U]O?X^?O\_@`!`P,%#144$`T) M!P8&!@8&!P<%`/WX]/7X^/?V]?7U]?;W^/CY^OO]_@`!`@0+%!82#PL(!P8% M!@8'!P<%`?WX]/3W]_;U]/3T]/7V]_CY^OS]_P$"`P0+%!42#PL(!P8%!@8& M!P4!_OGU]?CX^/?V]?7U]?;W^/GZ^_S^_P$"`PD2%A00#`D'!@4%!@8&!P4! M_OKT]/?W]O;U]/3U]?;W^/GZ^_W^``$"`P@2%A,0#`D'!@4%!08&!0'^^_;U M^/GX]_;U]?7V]O?X^?GZ_/W_``$"!P\6%1$-"0<&!04%!08&!0'^^O7T]_?W M]O7U]/7U]O?X^/GZ_/[_``$"!P\5%!$-"0<&!04%!08%`O[[]_7X^?CW]_;U M]?7V]_CX^?K[_/[_``$%#!06$P\+"`8%!04%!08%`?[[]O7W^/?V]?7U]?7V M]_CX^?K[_?X``0(%#105$@X*"`8%!04%!08#__WY]??Y^?CW]O;V]O;W^/GY M^OO\_?\``0,)$145$0T)!P8%!`0%!04"__SW]??X^/?V]?7U]?;W]_CY^?O\ M_?\``0,*$A43#PL)!P4$!`4%!00`_?KW]_GZ^?CW]O;V]O?X^?GY^OO]_O\` M`@8.$Q43#PL(!@4$!`0%!0/__?GU]_GX^/?V]?7U]O?W^/CY^OO]_O\``@@/ M%!01#0H(!@4$!`4%!0+^_/CV^?KZ^?CW]_;V]_CY^?GZ^_S]_P`!!`H1%101 M#0H(!@4$!`0%!`#^^O?W^?GX]_;V]?7V]O?X^/GY^OS]_O\`!`L1%!,/#`D' M!00$!`4%!`#]^O?W^OKZ^?CW]_;W]_CY^?K[^_W^_P`!!0T2%!00#`D'!00$ M!`0$`?[\^/;X^?GX]_;V]?;V]_?X^/GZ^_S]_O\""`X2%!(."@@&!00$!`0% M`O[\^?;X^_KY^/CW]_?W^/GY^OK[_/W^_P`""`X2%!,/"PD&!00$!`0"__WZ M]_?Z^OGX]_;V]O;V]_?X^/GZ^_S]_O\$"Q`2$Q`,"0<%!`0$!`0#`/W[^/?Z M^_KY^?CW]_?X^/GY^OK[_/W^_P`#"A`2%!(/"P@&!00$!`,`_OSX]_GZ^OGX M]_;V]O;W]_CX^/GZ^_S]_@`&#`\1$@\+"08%!`,$!`0#__WZ]_C[^_KY^?CW M]_?X^?GZ^OO[_/W^_P$$"Q`2$Q(."P@&!00#`P+__?OW^/KZ^OGX]_;V]O?W M^/CX^?GZ^_S]_@()#0\1$0X+"`8%!`,#!`0!_OSY]_G[^_OZ^?CX^/CX^?KZ M^OO\_?[_``$`2$Q(."@@&!00#`P'^_/GW^?O[^OGX]_?V]O?X^/CX^?GZ M^_S]_P,*#0\1$0X*"`8$!`,#!`0!_OSY^/K\^_OZ^?CX^/CY^?KZ^OO\_?[^ M_P$'#1`1$A$."@@&!`,#`P#]^_CW^?O[^OGX]_?W]_?X^/CX^?GZ^_S]_P0* M#0\0$`X+"`8$`P,#`P,`_?SY^/K\^_OZ^?CX^/CY^?KZ^OO\_/W^_P((#0\1 M$A$."P@&!`,#`O_]^_CW^OO[^OGX]_?W]_?X^/CX^?GZ^_S]_P4+#0X0$`X* M"`8$`P,#`P+__?OY^/K\^_OZ^?CX^/CY^?KZ^OO[_/W^_P('#0\0$1$/"P@& M!00#`O[\^_CX^OO[^OGX]_?W]_CX^/CX^?GZ^_S]``4*#`X/#PX+"`8$`P,# M`P+__?OY^/O\^_OZ^?CX^/CY^?KZ^OO[_/W^_P$&#`X0$1$/#`D'!00#`O[\ M^OCX^_S[^OGX^/?W]_CX^/CX^?GZ^_S]``4*#`T.#PX,"08%!`,#`P+__?OY M^/O\_/OZ^?GX^/CY^OKZ^OO[_/W^_P$&"PX/$!$0#0H(!@0#`O[\^OCX^_S[ M^_KY^/?W]_CX^/CX^?GZ^_O\_P0)#`T.#PX,"0<%!`,#`P,`_?SZ^/K\_/OZ M^OGY^/CY^OKZ^OO[_/W^_@`%"@T/$!`0#@L(!@0#`O[\^OCX^_S\^_KY^/CW M]_CX^/CX^?GZ^OO\_P0)"PP-#@X,"@@&!`,#`P,`_?SZ^/K\_/S[^OGY^/CY M^OKZ^OK[_/S]_@`$"0P.#Q`0#PT*!P4$`O[\^OCX^OS\^_KY^/CW]_CX^/CX M^/GY^OO[_@,("@L,#0X-"P@&!`,#`@(!_OS[^?G[_/S[^OGY^/CY^?KZ^OK[ M^_S]_O\"!PL-#@\0$`X+"`8$`__\^_CW^OS\^_KZ^?CX^/CX^/CX^/GY^OK[ M_0('"0L+#`X.#`D'!00#`P,"__S[^?G[_/S[^_KY^?GY^?KZ^OK[^_S\_?X` M!0H,#@\/#P\-"@<%!`#]^_GW^?S\^_OZ^?CX^/CX^/CX^/CY^?K[_``%"`H+ M#`P-#`H(!@0#`P("`/W\^OGZ_/S\^_KZ^?GY^?KZ^OKZ^_S\_?[_`@@+#0X/ M#P\.#`D'!0+^_/KW^/O\_/OZ^OGX^/CX^/CX^/CY^?KZ^_X#!PD*"PP-#0L) M!P4$`P("`?[\^_GY^_W\_/OZ^?GY^?KZ^OKZ^_O\_?W^``4*#`T.#P\/#@L( M!@3__/OX^/K\_/O[^OGY^/CX^/CX^/CX^?GZ^_P!!@@)"@L,#0P*"`8%!`," M`@#]_/KY^OS]_/O[^OGY^?GZ^OKZ^OO[_/W^_P('"PP-#@\/#PT*"`8!_?OY M]_G[_/S[^OKY^?CX^?CX^/CX^?GY^OO^`P<("0H+"PP+"0@&!`,#`@'__/OZ M^?O\_/S[^OKY^?GY^OKZ^OK[^_S]_O\#"`L,#0X/#PX-"@@$`/W[^/CZ_/S[ M^_KZ^?GX^?GX^/CX^/GY^?K\`04'"`D*"PL,"PD'!00#`@(!_OS[^?K\_?W\ M^_KZ^?GY^OKZ^OK[^_S\_?X`!0D+#`T.#@X.#0H'`__\^OCY^_S\^_OZ^OGY M^?GY^/CX^/GY^?K[_0(&!P@)"@H+#`H(!P4$`P("`/W\^OGZ_?W]_/OZ^OGY M^OKZ^OKZ^_O\_?W_`@8*"PP-#@X.#@P*!@+^_/GX^OS\_/O[^OKY^?GY^?GX M^/CY^?GZ^_\#!@<("0H*"PL*"`<%!`,"`?[\^_KY^_W]_/S[^OKY^?KZ^OKZ M^OO[_/W^_P,("@L,#0X.#@X,"04!_?OX^/K\_/S[^_KZ^?GY^?GY^/CY^?GY M^OP`!`8'"`D*"@L+"@D'!00#`@#]_/OY^OS]_?S[^_KZ^?KZ^OKZ^OK[^_S] M_@$%"0H+#`P-#@X-"P@$`/W[^/G[_/S\^_OZ^OGY^?GY^?GY^?GY^OO]`04& M!P@)"0H+"PH)!P4$`P'^_/OY^?O]_?W\^_KZ^OGZ^OKZ^OKZ^_O\_?\#!PD* M"@L,#0T-#`H'`__\^OCY^_S\_/O[^OKY^?GY^?GY^?GY^?K[_0(%!@<("0H* M"PP+"0<%!`+__/OZ^?K]_?W\_/OZ^OKZ^OKZ^OKZ^OO[_/X`!0@)"0H+#`P- M#0L)!@+^_/KX^?O\_/S[^OKZ^?GZ^OGY^?GY^?KZ^_X"!0<("`D*"@L,#`H' M!00!_?SZ^?K\_?W]_/O[^OKZ^OKZ^OKZ^OK[^_S_`P8("`D*"PL,#0P*"`4! M_OSZ^/K\_/S\^_OZ^OKZ^OKY^?GY^?KZ^_S_`P8'"`@)"@L+#`P*!P8#__S[ M^?G[_?W]_/S[^_KZ^OKZ^OKZ^OKZ^_S^`@4'"`@)"@H+#`P+"`8$`/W[^?CZ M_?W]_/O[^OKZ^OKZ^OGY^?KZ^_O]``0&!P@)"0H+"PP,"0<$`/W[^?G[_?W] M_/S[^_KZ^OKZ^OKZ^?KZ^_O]``0&!P<("0D*"PL+"0<%`__\^_GY^_W]_?S[ M^_KZ^OKZ^OKY^?KZ^OO\_0$%!P<("0D*"PP,"PD&`O[\^OGZ_/W]_/S[^_OZ M^_OZ^OKZ^?KZ^OO]``0%!@<'"`@)"@H+"@@&!`']_/KY^OS]_?S\^_OZ^OKZ M^OKZ^?KZ^OO[_/\#!@<("`D*"@L,#`L(`__]^_K[_/W\_/S[^_O[^_OZ^OKZ M^OGZ^OO\_P,%!08&!P@("0H*"0@&!`+__/OZ^?O]_?W\_/OZ^OKZ^OKZ^OKZ M^OO[_/X!!0<'"`D)"@L,#`L*!0'^^_K[_/S\_/S[^_O[^_O[^OKZ^OGZ^OO\ M_P,$!04&!@<'"`D)"0@&!0,`_?S[^?K\_?W]_/O[^OKZ^OOZ^OKZ^OO[_/W_ M`P8'"`@)"@H+"PL*!@+__/O\_?W\_/S[^_O[^_O[^_KZ^OKZ^OO\``,$!`4% M!@8'"`@)"0<&!0,!_OS[^OK[_?W]_/S[^_KZ^_OZ^OK[^_O[_/W^`@4'"`@) M"0H+"PL*!@,`_?S]_?W\_/S[^_O[^_O[^_KZ^OKZ^OO]``,#!`0%!08&!P<( M"`<%!`,"`/W\^_K[_?W]_?S[^_OZ^_O[^_O[^_O[_/S^`00&!P@)"0H*"PL) M!@0!_OW^_OW\_/O[^_O[_/S[^_KZ^OKZ^OO]`0,#!`0$!04&!@<'!P8%!`," M`/W\^_KZ_/W]_?S\^_O[^_O[^_O[^_O[_/S]_P,&!P@("0D*"@H(!00"__[_ M_OW\_/O[^_O[_/S[^_OZ^OKZ^OS^`0(#`P0$!`4%!@8'!P8$`P,"`?[\^_KZ M_/W]_?S\^_O[^_O[^_O[^_O\_/W]_P(%!P<("0D*"@D&!00"````__[]_/O[ M^_O\_/S[^_OZ^OKZ^_S_`@(#`P,$!`0%!08&!@4$`P("`?[\_/KZ_/W]_?W\ M_/O[^_O[^_O[^_S\_/W]_P(%!P<("`D*"@@%!`,"`0$!__[]_/O[^_S\_/S\ M^_O[^_K[^_T``@("`P,#!`0%!04&!@0#`@("`?_]_/OZ_/[^_?W\_/O[^_O[ M^_S[_/S\_/W^_P(%!@<("`D)"0<%!`,"`P(!__[]_/S[^_S\_/S\^_O[^_O[ M_/\!`@("`@,#`P0$!04%!00#`@(!`?_]_/O[_/[^_?W\_/O[^_O\_/S\_/S\ M_?W^_P(%!@<("`D)!P4$`P(#!`,!`/[\_/S[_/S\_/S\^_O[^_O\_@`!`@(" M`@,#`P,$!`4%!`,"`0$!`?_]_/O[_/[^_?W\_/S[^_O\_/S\_/S\_?W^_P(% M!P<'"`@(!@0#`@($!0,!`/[]_/S[_/S\_/S\^_O[^_S]_P$!`0("`@(#`P,$ M!`0$`P(!`0$!`/[]_/O[_/[^_?W\_/S[^_S\_/S\_/S]_?W^``(%!@<'"`@& M!`0#`@,%!0,"`/[]_/S\_/S\_/S\^_O[_/W_``$!`0("`@("`P,#!`0#`@$! M`````/[]_/O[_?[^_?W\_/O[^_S\_/S\_/W]_?[^``,%!@<'"`8%!`,"`P0% M!0,!`/[]_/S\_/S\_/S\_/S\_/X``0$!`0$"`@("`P,#`P,"`0$``````/[] M_/O[_?[^_?W]_/S\_/S]_?W]_?W]_O[_`00&!P<'!P4$`P("!`4%!`,!`/[] M_?W\_/S\_/S\_/S]_@`!`0$!`0$!`@("`@,#`P,!`0``````__[]_/O\_?[^ M_?W\_/S\_/W]_?W]_?W]_O[_`00&!@<&!`,#`@($!04$!`,!__[]_?W\_/S\ M_/S\_/W^``$!`0$!`0$!`@("`@,#`P$!`/___P``__W]_/S\_O[^_?W\_/S\ M_/W]_?W]_?W^_O\``@4&!@8$`P,"`@,$!`0$`P(`__[^_?W\_/S\_/S\_?X` M`0$!`0$!`0$!`0("`@("`0``_____P#__OW]_/S]_O[^_?S\_/S\_?W]_?W] M_?[^__\!`P4&!00#`P("`P0$!`0#`P(`__[^_?W\_/S\_/S]_@`!`0$!`0$! M`0$!`0("`@(!``#______P#__OW\_/W^_O[]_?W\_/W]_?W]_?W^_O[^_P`" M!`4%!`,"`@(#!`0$!`,#`@$`__[^_?S\_/S\_/W^``$!`0$!`0$!`0$!`0$" M`@$``/_________^_?W\_/W^_O[]_?W]_?W]_?[^_O[^_O[_``$#!04#`P(" M`@,$!`0$`P,#`@$`__[]_?S\_/S]_?\``0$!`0```0$!`0$!`0$"`0``____ M______[]_?S\_?[^_OW]_?W]_?W^_O[^_O[^_O__`0,$!`,"`@("`P0$!`,# M`P,"`@$`__[]_?S\_/W]_P`!`0$!`````0$!`0$!`0$!``#___[^______W] M_?S]_O[^_OW]_?W]_?[^_O[^_O[^__\``@0$`P("`@(#!`0$`P,#`@("`0#_ M_OW]_/S\_?W_``$!`0$```````$!`0$!`0$!`/___O[^_____OW]_/S^_O[^ M_?W]_?W]_O[^_O[^_O[__P`!`P,"`@(!`@,$!`,#`P,"`@("`0#__OW]_/W] M_?X``0$!`0````````$!`0$!`0$`___^_O[____^_?W]_?W^_O[^_?W]_?W^ M_O[^_O[^_O__``$#`P("`@$!`P0$`P,#`P("`@(!`/_^_?W]_?W]_@`!`0$! M``````````$!`0$!`0``___^_O____[]_?W]_?[^_O[^_?W]_?[^_O[^_O[^ M_O__`0(#`@("`0$"`P,#`P,#`@("`@(`__[^_?W]_?W^_P`!`0$````````` M``$!`0$!`0#____^_____OW]_?W]_O_^_O[^_?W]_O[^_O[^_O[^__\``@," M`0$!`0(#`P,#`P,"`@("`@$`__[]_?W]_?[_``$!`0````````````$!`0$! M``#________^_?W]_?W^__[^_O[^_?W^_O[^_O[^_O[__P`!`P,"`0$!`0(# M`P,#`P("`@("`0#__O[]_?W]_O\````````````````````!`0$!``#_____ M__[]_?W]_?[__O[^_O[^_O[^_O[^_O[^_O[__P$"`P(!`0$!`@,#`P,"`@(" M`@("`0#__O[]_?W]_O\````````````````````!`0$!`/_______OW]_?W] M_O___O[^_O[^_O[^_O[^_O[^_O__``$"`@$!`0$!`@,#`P,"`@("`@(!``#_ M_O[]_?W^_P`````````````````````!`0$!`/_______OW]_?W]_O___O[^ M_O[^_O[^_O[^_O[^_O\``0("`0$!`0$!`@,#`P("`@("`@(!`/___O[]_?[^ M_P`````````````````````!`0$``/_____^_?W]_?W^_____O[^_O[^_O[^ M_O[^_O[^__\``0("`0$!`0$"`@,#`@("`@("`@(!`/_^_O[^_O[__P`````` M```````````````!`0$``/_____^_?W]_?[^___^_O[^_O[^_O[^_O[^_O[^ M__\``@(!`0````$"`@("`@("`@("`@$!`/_^_O[^_O[_```````````````` M`````````0$``/____[]_?W]_?[____^_O[^_O[^_O[^_O[^_O[__P`!`@(! M``````$"`@("`@("`0$!`@$!`/_^_O[^_O[_```````````````````````` M`0$``/____[]_?W]_?[____^_O[^_O[^_O[^_O[^_O[__P`!`@$!``````$" M`@("`@("`0$!`0$``/___O[^_O[_``````````````````````````$```#_ M__[]_?W]_O_____^_O[^_O[^_O[^_O[^_O[__P`!`0$```````$"`@("`@(! M`0$!`0$``/___O[^_O__``````````````````````````$```#___[]_?W] M_O_____^_O[^_O[^_O[^_O[^_O___P`!`0$```````$"`@("`@$!`0$!`0$` M`/___O[^_O__``````````````````````````````#___[]_?W]_O_____^ M_O[^_O[^_O[^_O[^_O___P`!`0$```````$"`@("`@$!`0$!`0$!`/___O[^ M_O__``````````````````````````````#___[]_?W]_O_______O[^_O[_ M__[^_O[^_O___P`!`0$```````$"`@("`0$!`0$!`0$!`/____[^_O__```` M``````````````````````````#___[]_?W]_O_______O[^_O[___[^_O[^ M_O___P`!`0$```````$!`@(!`0$!`0$!`0$!``#___[^_O__```````````` M````````````````````__[^_?W]_O_______O[^_O_____^_O[^_O___P`! M`0$````````!`0$!`0$!`0$!`0$!``#____^_O__```````````````````` M````````````__[^_OW^_O________[^_O_______O[^_____P```0$````` M```!`0$!`0$!`0$!`0$!``#_________```````````````````````````` M`````/_^_O[^_O____________________[^_____P```0$``````````0$! M`0$!`0$!`0$!`0``_________P```````````````````````````````/_^ M_O[^_O[___________________________\``````````````0$!`0$!`0$! M`0$!`0``_________P```````````````````````````````/___O[^_O[_ M__________________________\```````#__P````$!`0$!`0$!`0$!`0$` M`/________\```````````````````````````````#___[^_O[_________ M__________________\```````#___\````!`0$!`0$!`0$!`0$```#_____ M__\`````````````````````````````````__[^_O[_________________ M____________````````____`````0$!`0$!`````0$`````________```` M````````````````````````````_____O[^________________________ M____````````_____P````$!`0$!````````````_________P`````````` M`````````````````````/____[^_____________________________P`` M`````/____\````!`0$!`````````````/_______P`````````````````` M``````````````#____^______________________________\``````/__ M__\```````````````````````#_______\````````````````````````` M``````#_____________________________________``````#_____```` M````````````````````______\````````````````````````````````` M____________________________________``````#_____```````````` M`````````````/______`````````````````````````````````/______ M_____________________________P``````_____P`````````````````` M````````____``````````````````````````````````#_____________ M______________________\`````_____P`````````````````````````` M``````````````````````````````````````#_____________________ M________________````______\````````````````````````````````` M````__\`````````````````````````____________________________ M_________P``______\``````````````````````````````````````/__ M````````````````````````____________________________________ M_P``______\```````````````````````````````````````#_```````` M`````````````````/__________________________________________ M__\```````````````````````````````````````#__P`````````````` M`````````/____________________________________________\````` M````````````````````````````````````__\````````````````````` M`/____________________________________________\````````````` M````````````````````````````____``````````````````````#_____ M______________________________________\````````````````````` M````````````````````_____P````````````````````#_____________ M______________________________\````````````````````````````` M`````````````/___P````````````````````#_____________________ M______________________\````````````````````````````````````` M`````/___P````````````````````#_____________________________ M_____________P````````````````````````````````````````````#_ M_P````````````````````#_____________________________________ M____```````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M`````````````````````````$-/34T````2``$``$(6``A`#:Q$```````` M34%22P````(``$E.4U0````4/```?P!_``````````````````!!4%!,```! MJ%-D,F$``@`````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````"D``````````````````` M```````````````````````````````````````````````````````````` M``0(```````)`",`````````````````>`````0`!````````/P`____@``` M``$!``9156YI=',````````````````````````````````````````!`@`& M('-A;7!S```````````````````````````````````````````````````` M````````````)P`O``__]O_Y``$````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````!`````7@```!X````5M8Z*`_> MOCO;Q0T.*`5//"BD#RQP.]W&*#P!`?\@1-@4"DUA9VEC($AARQP,4`0\-!QP%7W?^,7D/ M#080```!H`*0`/`FH#,0`J``,";0,]`"D`#P)!`R(!`````!H` M*0`/`5`!\0`J``,";0,]`````````````````!H`+``6`3X!W``J``,";0,] M`````````````````!H``````````````````````````````````````0`` M``%X````>````%8`<;B\'*8````<`%8``%=S=&$``P`*``'__P`````````` M``+__P```!X```````/__P```#P```````3__P```%H````````````````` I```````````````````````````````````````````````````````` ` end slashem-0.0.7E7F3/sys/share/sounds/mgcflute.uu0000664000076400007640000006152010545462317017274 0ustar alialibegin 644 Magic_Flute M``M-86=I8R!&;'5T90`````````````````````````````````````````` M``````````````````````````!!249&4V0R80$``#0!%````````$4B```! MSJ<]K5FG/:UB``````````````````````````````"!@5G6``!&3U)-``!% M&D%)1D934TY$``!#'@`````````````````````````````````````````` M````````````````````````````````__\`_P````#_`````````/\```#_ M______________________\`_________________P#_`````/\````````` M``$!`0$!`0$!`0$!`0$!`0````#__P```````/\``0```0$````!`@$!`0$" M`0$!`0$!`0$`_P$`_P#^_P#_____`/____\`__\`_OX!`/__``#^``'__P#_ M_P#_``#_``'__O___O[____^_P#_``#__P$!_P`!``````#\_@3]^`#_^_W\ M^_W]^_K^_?O^_?X`_?T!`?[^`/__`/[^`?__`/\``/[_``#__P#_``#__O[^ M``#^_0$`^_X#`/S^`?_]_O\``/W^``#___[_```!__P"!OO]!P']`@``!/_^ M!@;_``4$`@'_`0']`@7]_04%_?P`!`+]_/\"`?T!!?_[`0H`]0('^_P&`/T% M`_T!`OX`!/_Z`0;X_`T`]0$'!/\!!?GZ!/K^"/CU"POS\@H)]/\(^/P%_P," M]/<.#O;R`0$$#/SI^A<,Z_D2_/<-_O('!?/_#/GS__X&"/?S^0<.]/$+`/$! M`_?\"OKO!OKV$/WS!/K\`_S]_/8!!OO^!/T!!/T'"OK]!0D/_.[]"@S\[O\+ M`?/R_/P"_?`)">_["@GY[@0:`>L$&`KO_1L`[0<-`?CQ]@L)\/G][PT4Z/(; M"?`$%`@!!P0)#?GY%17KY2`AV^,5!.KT`0']`?WQ_Q,"\@<,\@(>`?$.%/_\ M#@GX``3U_`+W]@#_Z_L:\N0=!]\.&NOV'@GU$`GP#Q[P[A4"Z@(&[_<(\O0, M]N8#%/OD_A@&\0`7"/D1&0#Y!@T"]OT!]/7]\_7V\OGOZ?0$"NSI$`O[#@P# M`@`-$`7]]@80]?$'^>W[\_#_ZN`#`_/Z_`0'_0@2#0D`!Q<7!_0%%`'\]>O^ M]N/U].;M_`;MV`P"'!GNX__YZO3TZN_P M]0KUT?DC]-@+'0($&AX/"0\*"`H"`PWUZ`;VT.H,^]?C`/?N[_7]]?`&'PWV M#2@=_OT3"_T0$?'N_/GP[NSO^O;L]O;N]_+W`_'Z&Q($%AT0_P<=!OL8#/+V M\/'_\NGQ_?G=[0GOX?CXZP,6`08B%0H8$@`('Q'Y#0;=^2#]V_(&_/;TY^;X M]N#L#03X%!L,%AD+"0H'#!,/^^P%#N[U$O?B`/K?\?/Y0G]Z1(D"/X/%O?]*QC]$@+R(!_O^ACZUNX#YM#=[N#7^`OW M\@8;(@7M!R(C#_D,&0X4"?L>(>GA_O7I[-O.V^/P!?[J\QTK`.P0'!,5#/\% M)"#Y$S<&Y`0$XN;HS-;OXMWW"?KV$Q;X`R$1`Q49#A,@$1@^%_(C#\?F$=J_ MZ=S#]07>\Q;RZ1<:[NXN-//W*RD2'C8H"@$$`?/FX]S4U=SDZ.[Z_NKG#Q#E M_R\4^1`>)#0E#2U'"]0(*-R][^G"V>O>\_O5WA7_UP@9\PLD!@\_+`7:W_WR\PH!#C4@ M$$E6)RY,&^T'%OK7R];J\=/.[./-U.GNV^8+_O`C-1]TM7'T_KUT/0J)"HX-%9F/"0O M.A7R!_+?`N>^V^/0OZO.Y,;.U=SW]PPG)#,]6&PN(%LM*C*\-;T*BU'85Q28'1;."LA M'0_'@H&'`3X`O/QSK#-Q*VOKJ^WY03C^S,M,#U#34%%23`^ M-Q(T*/'\[,[)K:BJEYNDKKW2`/X"1$8B-DI-0R,P/`D'+A/Q!O[0U>3(N\C) MQKMY_$0%0DB.!X9/D`F,40P M*34E$A'^W-;CSZ:\V:ZRYM+0^>76`B,6"S!%+SE<5T!!,R41]O;.J\BZEZ>^ MO[70Y>$.#^ MU<&WX=:IW`/0W1/WYAPU#@],.P,O02$P(@;[\@'VULO7Y.7KW-3[]M;A[/#N M\A(1`APE&R$;,5(M"1HE$_WK^?S.TNK7U^+%K=+KU>0&^00T.2DP-SI`-!82 M)`7K[=_AV-+5P=WRU]O?Y?3T$"L:#AP^-@TF/`T"$PP,\>#ZZ^+OV>GNR^3M MT,K1[OOM_AH9$B$Q)"M8-`<\0A8G(?#P^.'/T(+[^,/$_X;/R8<-S-$1R,?$`@/XM;MUL.YNLR_Q]S+\1WT M\"<=!2HM$"(L)#"M_6].&\WN/#S][QY-00&@4>&2DZ-E]+%S,K"P?FX?/?S\K'S\W6 MWM'F]^;T`O8#'P;L+SL(-T@>'R$8"@L8!OT%[_H,[.3:S.KJT]/&Y`7>W@H0 M%2LS*B,Z)@(2#/?_`^?<]_7HZ];=_O+J`@S_$#(:""\X(R`3!`P`VM'K\-;< M]>7G!_CH__/N"0+[^_H1"@`6$!(I(`4((!7U`Q<&`PX#``[RW_K>R^;3U?'= MX0/Z]!0<&Q<0*S`7!@`(%A+Y\0\8\>;N[?7FZ_;@_17R!1?Y#A__!!/U_1[[ MW.\#$OWM#P+G"03G[??WX.<,]?,:_O$B&P M\\S-\.OJ_`/T"1_^!C4:_R,8!B,5`QH'\_<(`0`%("8)%CXI$"P>#B$D#_D,\;[P_L_AZ.?;S0\` MRO_LT",3WQRP#RU``A&Q(D.C,?&QTZ//T!&_WJ_`S=V1/RS@`+Z=/H#>;("R\/ M_@\M'Q$?$2`I[^L.^L_/#>VP]NK&]^+:^_OKWAH_!B]2%C%)0$@/'#7:!C3" MTO[.SM'/R=S_RK/Q^MC;`!@%""X?"!XT/1X+(R4D"/0?$N3Q"/KM!_;!W03U MY=_L`@+_!`07*AL-"A('[MWEQ]K:R`G_Q.L)!!`5%!SN_AM:S2^MF]\/'9__?B^?GX`QG[WT`Y[#$W!SU!$!(;#/\#]^02"\OL M_]_C[>[3O^[SW`L;#B0>$BLY&?/Z!O[7J-H0V;SQ!O<+(!(&+BWT&C$/+3$/ M'Q?[$1'CV=_'O]_CM.4MY]\J)0']&0?7\OW9[PL0$`4E-R@P(Q\H_.?Z!0CI MX?;K[/OR\.S=Y/?LUP`U%@D_.1(H(O/V[-#+M;S>X.;R`!XG(T1,&!P^'`$( M"10/ZMW[!^_?V][HVLSC``P4#A0F`P$G]MW_[;A$P(.4E%# M7UDQ*2$*"-.N[-N@TNSD__8"(A3WZQDKZ.GD[?P3(1$%#P+F]_7'U?+4O='PY^+X\_(#&!L1*S8K M,R/PV-4!_=K[&_;9XNG>VO#QU.D'\`8?``@;%!8*!@_[ M&#@'$S\P*"$AGW M\Q-`%Q-;+`I&,`@;%??EY,>GR-:EK_3\UNLC)0T:+A0'(PWB_P;7U^GGZ@`@ M!ODO)QPZ*S=-)@,)%/?-U]RVOLZ_W//N^AHC`QU(&_T)\^?XX,K7W.KZ[NT5 M0R\',F,S"$)(_P#ZQM+@O\;HS[OV#^'R,S`,%AL=(P`(`]'S#M3,_/?L!O+I M'"+`X,)0/M[.T`YM[WX>T,Z=GP#0WR M`O_^(@SN_/OM^O[F]`D&&1X`!$A<$/PR*?KHX^?Q[M3.]`/Q_@D'"@`'^]\( M#,K1X-<`^K4W.W: MPL?-V=SF#Q41,CHL+5)@&`U$*03\!AOU]Q;X^PD&^=0!#\'P!Z"_^,:UO-': MU>[Y,J^YQ$!`RL])18]0!0<*18"[=_F]M6GO=?9V,WH"O\.)1TM M-ATB(@@0[=4$Z=`,)0^PTJ+A@: M*CL@^@?\^B$$V_<*_>/7Y^SYY;38__#_$@,",#H*!B]+(@@D"1DX]?4O#N#F MY,.QQ\^WL+##\N[I.5TD)%$Z'34Y'0P/!O0`^@@O_N($\N#=T][EV]'-W?'T M`/;L&A#M#1@?*BY9125032`!^P#/H*>EHKC$T.O]%#T%W.0O+/L,)1+X MZ-?(WNK1UNP`'A<&(4%`+2`C)186$^C?"`O-M.?>L[[!PN<"^/@D0T-!.C0Y M.@[H`_C.U>#?W.,!#@'^#A<(ZN/X_>S@ZP<*]/<2(Q']#1<6&Q0+$AL9!P41 M\-CKW<.VL]?AS?D?$1LF*#XI%2P1_P_LX@(%^_G]`?KV!@/;ZP[DX0[_`!H) M`PH#!0D%_O/Q"13W^QP:`?<"!_KGX.7EW]CA]@\;``8F*"D-`R@8_1<)]A@3 M]/\3_>;^_,W,[>;+U.[LZ@L'Z`D>#Q<%_20D%QDA+2`C'P<<&-W9[N/>S]+R MZ_3[\!@*W/D-^>OS^?P)!`\B%!H="QX5\/@`__7G`/_R#!(#\>?Y^_/]^0(6 M#Q,7%2<>^./[!,.[\=6[Z/WM\1,B#`P@#`LB`@P\&08D'14A(@+R"/WM\>CF MZ>WNZ>':ZN_:R=+DY>?Q#B<6'4A%0#X<*CX;`/W]\N;DX>OR]O7U!^[9_0/Z M\>[OW.X(^0HC$@L,`^CA M\=?0Y-WK]_,0'!\H#Q`N&`@2_Q8N]NT/&0G>[/[?X^/9V^#Y_?#W$1H)&AGR M!1#G^/_:`S`'\!4R*10:)18$_.C>_?S3Z`'E\P?P[_?_`<_2_^KD`P\<*1X) M&2D%]A("Y04(ZA8['04;,@SG[?'LV,K;ZO3T^0T-`O_\].3(PD4$>X'`VN+BT+P%!L.$`P+#@X0`1HW!0M**1@X$`<4Z.WP MU.3I\@#H`"P9`OS[`-J[T-/&P,;H_@`#!1XU'@P?-C<@($`\)SM&'O\+".#' MR=')M+K:\?/Z`0`.\M#FZ=S+X%Q@2-4Y"0%!((18P-@WP#ASVXNCDV,K% MNIVVX,7#[`<9%A@;%B@G"?[T\?SQZ@4?)R0A.#TK)`\1'?OM[^3S`/'8X_W9 MN]GFR/?X>'Q^>+R"P\B'BQ<3C=68D`P.1GT^NW:Z_OWXNOSVN#KW79 MU`D4_P@;+2LB'R9`1#8]7F,[,BP-!^C*V,VYN\[6QM;^\N'X\>KYXM;R__3Y M"0,/-!WX&2L>#P(?(Q%"$T/RXB,349$!T)!AP2`._?X]:ON->ZM,/%Z?_\_0$5%@4)#P\< M*1P7+SLP+3@Z*Q/^]NK=W-GM[\K?!-C-^.;)U]SD[^OR`1HU(10L&@\M'OK_ M$A8-!0\A,2P/`O[N[_#8TN_OUM;<[_OBXOCHRNOYRO@BZ_DB&R(B)"\H+"@( M&282-S3Y"B@7`?;JY/#?LJFVRM?*L,+[[-?_]_\?_O\C'A8A/#@M5DDD-BTA M*QS_Z?H1[-/_`^7SY+S`SLFUNK6T/07^N\K,`\E-AL"#"L<^`88"PH0"!HG$A`3$@GRZ]SF M"NB[V?[@R??VV/3]YMCL#@$*)A(-,#$)%#TC^P@2_/49)0,%&`+_#^O:_N7' MU<_4Y>K?WPD#X`0?^>T.$00<*!\R^;?Z`,4 M!OL@+Q\<(2PP+2(=*CPQ"0P?!/X$]?#T"`/=Y?37TN36Q,[SL]>G?T-;;R-;7N=3YWMGZ\N;_`/8* M%0X;-BPC/$-#/3$R(14:%!\3\`4$Y>O+GZ=KAQK[7PL#6W.+&@\,_^;IZMG,U?#GR]GLY.T`\MKN$`?W^!8L$A`:!PD8$0('$Q4%_14I M(B`G%_X%_-WDZ,K$XM.\ZOK5Z1#VZ0P&\@\;"A$1`Q,F%PT7%`<7*1(4,R86 M*!@`!/'>XWVX@0P'2,O+40Q%24B'BT@"A4:%!`%!Q8<"/+_ M[\SGZL?:WKS#Q\/;XN7DX0PG$AXW1E,U(2T>%AH4#_OO`@O[^A`5"@+Y_`#H MY@+MRMONU$@P5)18%&!\<$P<7'Q\A$@H,#?_M]O??U-;,P,?= MWM/B]/+[$`S_$"00!A4$!!T(]ADH$P\;+#4F+345$B+[W_3LU]?"M<[&NM+9 MT]CO`_8%-"X?,"<:+"L@&P<+%04)#@8A.`GW)17=Z?[ET=?6N\KQV=3RW=\( M_N0#*QH&(S4G&BDU(!01!@L'[?D:!?8;$_'[!OOQ]>C#U?/:T.?PY>3V_/#R M#@P!$@#_+2\<&1\O-"#_"S(<`!(.\O\,Z.+SX=[7P-/DU-'>Z^#5[03\^`L> M'@4%,R\#&D8N%"XH%CDW#P\3#@?NU,W=U[ZZM\+9T<_G\.CN^?D)%QDF&A\P M&Q\Q)!8?*0CX'!@''1<##1+RU^G_Y+JXRM#1V^SD[0;T[O\!$A\."PP$'2@' M%BD0$Q8+%Q\<$A0M(`@8%PL%Z=C?SK?#TL:\S]3&Z?W1Y"4=]`4U,0P:24$; M)SHL)BL?$BPG[?(6]][SZ\W*ULZ\PM+=W='-X?H"]OPJ.!01+"$H/1(90!4. M)!@<&A01^O@`].3=W]O@X\O+\?_FYP#KV0`'X_(/"04!"1P-!A83%!L-`Q]! M)QH^'P@L%_'P^^W-S;JGY/K+V_;7XPKTWP,8_OH*!`TA'1XD'A49)!P=+BLE M'10@'0+Y\NS;L*_!L+?+Q,_AZ@$(!!$I/1H)/#(('R\:"1(6`@H;#/\-%_[] M"O'W$0#IX-O4U>+/Q.SJNM$(_?,;."`5,#(A'28V&>CX#`4-`P0A%_OV_`3_ M"0C5X`C@S_#UY.?OT+WI^-OC]/H/'QD;.DPM(SP7`S4I^0@?#_P$_.O^".K2 MVM71W$+#@D#(3`)"18)#Q\4"!$8)R(**T$4'S+S]RSJNO;\Q<';R*_6 M].'6U>X%\.X,)R<+!1DC&Q$6%!`0^.D<.`\;/RL;(!X8$@P`ZM3`NLC*Q;Z[ MV.#$UP#^_Q@9#!LO*B0V-R0D&0H2&1@(^QDF^_4@$.\3"\?4]&!``!B``Y._Y#`+P__OOZ=OJ[N#P[M//XNOI M\?L$#0#S"1X>(QT0&BH9^"%-$_HC'O3T#/'K!>;+W>??X_/JX.7I]/?PZ_8( M_OP!_A87#1T:$ALB&14Q-QL='!`?$.#K#>FPQ-2WS.#6W>?Q]/P!_ALM$?@' M)R`("QX@$`D!`A<8$Q@5%Q4/"/X(!>WKW[R]W=K'TMG>\?CX%#(6`BSDUNOLY??U\P/[^@X1$C1.(11'-10H M)QLF(OSH`0?OYN'AZM2XQN7IU-GU\NG^!?H,%OP!%?7O%`X!&A\&_ATV'1X^ M*Q$A)@;S`0S^Z^35S.#GUL_3T-#GZ=SS"P@)$`L*%!D9$`X(!AH;&RLN.$`T M&PD;(?OK[]_)P,_2P,[=P+W?ZN7E^`X<)QD9/CXE-2L"``7U^@K\_!H6_`@: M%A\8[>4(\\3;`?#7UN7OY^CJ[`0%[OH#`2$M&Q02&!#W`0SW`QS^[R$B"",O M)!<`!0SNXO/GPKS/V-+/W.?P\>CU_00E)00:22L*+S(>*"<.``T/\/,-_.CV M]^KJYN_NSM/DVM78ZPD,_@4=(!8@(1XM&_<#%0T2%@H-#?GP[.W[]N38W>K\ M#?CK%Q[N[!$'Y_\3_O0`#P0+*Q3W`@;Z[O4`_OT#$A$)#R$F#@8'\.__Z^#\ M]][K\O/SV_T4X.0%__3\(2$.*"(,(BH/_10B"_GM_!T2``3T\??;TN#5V-/! MW.S;Z`L@%A0C(R(;*$$I"A8#'!H>$Q8S)Q0H'P((`OC^]PP1[P8;^_#[!P?BVOGOW.8`!M[K$.#&Z?#G M\?/J\?\.(2HP-B89+"X6&Q,,*A[_!!`8$@3RYN;1QL2\Q\R_P]WEW?@(]O\: M%0$()#X])39.,RDS+!P9&?;I]_/T[O3\X.#TZ]S,SN?1N.7NT_@&^R,P$`L; M'!P;"@TE#?D9$0HC%`X8"/T%%0'Y$P+R]_SRY0?XO]'AS,+&Y?#E_0/D#4(A M$1H@*@L)(!,>(2$Q$Q$V*0D+%O??\=_+X>79R75U][.VN\!!_,0(/,3.1,7*!D='10,!A$3!O__\.0, M&NST(`GC^_W8XOKLR+_6T-;UZ.\/_P8E)B@G)S(H(RT3"BH5`A3WY?[\Z>G] M`.;C].#;!_G&U/#JT-'N^O/K`A4*&S`J+"TG,#(=&AP.$@L!`M_N&NK0`?[, MSO#JTMGM\^K?Y?H'^_80"/`/'P@3)"4F*2X6"BD'$//Y"_SGYN;8 MR-#DVWC_B,-^1`3!Q`6&A,-)2L<%1TO(1,C&_OV$0SZ"`OYW^;PR<36 MP+C+QL3?Z_8>'/X5-STH"1].)_<@+@@('R4:"0#\!!,`\`+[X-_HV<34T;?3 MV[+*_?KP`AH;'3HZ)#Q`&R0U!NH1%_7X`_KM\P\0`P@#`@G\W-#K\M71V,K1 MZ.SM\._V"B(6_RI$&R4_)!`7*"?^\1<-Y?T1`0T-_@K[W=S?W-'(T,S(VN7J M]OL'"0(4)RLH,$`V,"XM."4?*`#A\O7DZO3CXNK?ZM_1\>+)[??CVNT<%^P# M)A45&PL=,A+]*#L-^ATS'OWX`OKW^NWQ\.;V\-33Z?GEV^WLY?0-"?0"#P(/ M%@83)1D(%RL+_B8G$R(/[A,L!^\##>O=[M>YR]7%SM;.W.WU^P(3%A89%R0P M*R8T+`T4(AX/`A44\>3X"_KM\N[YY\;-T=#.R-;/ROD)^`XA%A\W,R`;.TL/ M"CL1_!L$^`L$\.3@[__[Y.`)#-O4Z>GAXN+:Y>;E!P?W#!HB(0P:.BP8'B4H M%009%PT9_^3[$/[L\OKY]>[BV=?=W=W;SMKKZO;V\A,7"Q(/+$6OMN#+PM[8S>;X\P@5"1XJ'"`H+S$F*#;ZS\3@T+?(Z?+BU_`-_OD6(A<6'Q``'R\4"Q\N%_8.*Q`$&!;X MZ@H?_-_V#?'-S=O5O<;=S=KKW/L3!@P.%AT-%1\5'"\T)B`E&B="'_T)"P?Z MW>/T\>C2R=*[N-K%N=W8SO05$A$G,3,N("PX)R0O(A04$Q`@(07]^_#H[??C MVO#JTM/?V=7JZ]?F\>7^&@4!)R(&$RPQ'!8K*!4,`0DG)0+X"@7Z`?WV]_?U MWM+7T]79V=G9Y.CK`@WY!B8)^B4J'BHX0S48'"4?+QOI_`3@[??=[0/GV=W: MU\G0Y-O5W^CZ"@D6*Q@$$2`D'ADI."4/(286)B#Z]_O@VNODX.WLX-ODY-WH MZN3FXNGX_@\.!!H=!@P:&2`E'!T>$Q,?*1\+&1#@[@KLW^WJV]WDUV^?P M_A0?'AX<"PXF)!HM.2`6)!L1&14,!>W9ZOKNZN[K\??JT,_=W^+BW>/H^108 M$Q47$Q$1#A,B)!<0+"\""RT8"POKZP;RY?3V]^OJY\G.YN#8WMS&V@\._1(> M#0D5'B4H+#0Y)PP4*2(;'/SC]O[EW?7PW.'2QM;-Q-SJXN+EY04C'A8.&R01 M&"4P/R`50S/X`208]>KMX>#W\.#Q_?7RZ]/0[-G)]NO)]!8,"!PF"0XF!_D? M+2$@'B0C#!$='!'MZO;EZP']]P+_W=?JX-/8U,[.T>/X!107%QX<("$F1#X= M+T,D"ADH'Q/]Y^+C\N_GHU>D+#ALE%0X>,S,?*4L\(S,I M"/T'$@/FVN7FV^KT[.3G_NK#V_CMX_CTUN\=&@,-)0SV#A(!"B,U+AXH(PL= M+POZ#>[7]_KH\OOT[-O4W]W,R^#=P=@'"@(1(AH-$AD/#2PS&"M`)1DC)S(B M]^[X[-O6Y^S0T-_*PN#:O=+S[-CL%AP<-#LE&20D&R,K)QT;$?X$#PP(!?'? M[NSA[_+GU]C@S=ORT]\+\,WQ)R46(!L8&!04%1\:$2(A$`L'"Q$&_?GX`/_[ M!P/Q\?'@T=36P[W:W]'?]@H)$204$B09$!8L030N.S(=$QDJ&.G>^?70T_GT MV-K6R]7+P-+';UMKG MZ][=Z>CR`NG1\102#Q,2%1D6#`H8)B@5"2$K#@D;'A4%_?WP[P@!V<_EZ,O` MT-C=X-OE]/3T!Q@2!`T:"@@B,3(L+STU)Q\=)!@&_N?G__#;W=C6T+>XQ[S! MVN;@W`,J)"8P*"0J(P\:*R`B)1\L(P(-*@WD[?/=WO#OX>7QY]O;UMG?YNOB MWNX,&A4<+"<;&`@('1P."!,<#@D6(!T-!@?^]_O^^O7PZ./>VM3-U>3#1TC#/+BZ>WH\/GPY>WUYL[1[.O7V.#B\P(#$1H5%`L* M&"`H'18U-"$O+R@Q*!#W]@/APN3HO?QYM/3VL[`T^7I^O_W!1`7)R`-%1X0_0DE(B(H M%1PF"@,/#`;Z[NSN]0@*[/`#X#;X._HWN+?W./=R,?>Z-W:WNG^"`\5%RPO&2,R+#`M)S`E&1`! M&"#Y[.[AW.+GY=S.W//2N>#UY^O^_NSV%`P`$A4*!@XH)Q8L-R(C+2(*`A@= M__'PYNP`]=K;W];5R;[5Y.#L]?/_$Q<.$!43$`H4&QPN+R,M+BTB`A`M!=_J M].[E[.[6WNW0P,G-U^'FX>H+!P0K)`XJ*`L2)"04'289)"D4!PDA'?;KZ.W] M[]SE[>C@SLS6TM;5V/'LZP81$ALK*A,5-3X@%C;L!.S@\>7B MZ-K9VL[&U>?8UO#[\NS_%146'AL7*SHG)C@V+"8=!`48"O;N]/;AX./I^M_) MW]W)R]7>[_;L[?X(!Q4>`_H8+2@7(#\^+3DN$2$?`@7\[NS9V?'UX=#=[].] MT]G1W_'VZO$1&18>%AD@#Q0C'RHO)"HV+1(/)B0&\_?HT>7RV<[:WM?0PL/@ MYM[H\_G^"1P;&#`H"24]&QDO'1HP)@X.$A0>">?V!.34YN;-U>*^LMG>R>0# MZND+#0H7*"D,"RXV(AHK+Q\G+PSX#1L6!.[W_N/H_>O@X-;4PKC4V$0H-&Q/GT.7QV]3>T,7AY+2XZ>[F\_3S!1<<&!HG M*RDG&"$O&QLJ&!8:`OX3&0_^Z^SXZ-[GVM+DW[BUW>SAY/'R`18!`B@F%1D: M%!LN+2(B)RPG$P84(!8&[N[YY.'MW]/2SL"WPLG3Y^;A]@0')"P8(C0G'2LU M*",L*S`O!_PA'@7_Y]?EX=7?W\;0\-BXR-GAZ^CJ\P(2"Q4S)Q#FX<[G\=+$QM/GY>/S\N;V"@X2&R$7$"(O(QXS/2SGVM+8WM7&U=S&Q,K&W//J[P/[`B`A(RL<&B`1&246(#0B&"<>!Q8H M#/'S\N'9Y^O=U=O?TL70X]S9\?GL\0L7"0LE(PT''C$=%C(Q'R,I'Q?@]PH1&AD7)288&B?= MY>S=RM7EVL2ZP]OV]M[C`!,;'!D;)R81%BD>$R$N(A4>&`P4$`7\Y.#W\=G? MZ//WV\_@V=/D\O'BYO\*#!$6&A\5!A4C$Q@J(!DC'@T1)1\$^??P[N_JYM[= M\.C&RMS>Y^;G\>GW&!,$'#`4""0L'R(O*Q\E*A8'$A(`^?CKV=KHW-+=V=;9 MT-'A\/W]\?80(!H8)2(3&"0=$QLG)!L6%14*`PX'\>??X.WKU]OSZ-C@V=3L M\^GU`??Y&B83%!L7%Q(/%!<>(AH?)18/&QH.!/+HZ^?:TMGDXM30V=;/V>7M M\?#U!QH4%2\O%QDK*!PD*1PC,B,-#AH6"/?HXM[1SMG3Q=7@S,#6Z>;J]OC] M#1<6&BHR)!PD)R8>&2@G%A84"A$6!/3SZ^?KV]+EX\K4W\G2[-C4_PKT_!89 M%28H#0\D)!H9(B,E*AX<)QP2$`#S[_'SY-7@Y=;7V_QY]?@[=;+[.K+U.;GY>?N[/4(!`86%Q<8$!8G M(Q06*C,E#0CF[0+]^PT5&1P0"QPE&1PA M'S(W&!$B(@[[_/7H\N/0[/;:V^O@V-[=W][F`OOP#A@:*!<.'QH8'PX('B8< M%!0A'@L$`OOR\^G7Z_CBVN;OX]KIYMCL_NWP`00.%A@?%Q$<(AP1$"(H#PD@ M'`D2%?_P]OGIZ?'BUMWCW=C7W.?HY/(!`@($#2(C$10A*BL:&2CGULC:ZMK<[?`!"OX+'QT5%B$?%QH?'Q@<*R`-"PD)!?;J MX^S]\-G@\O/EW^3?X>C%0'X^/[LT-[S MX,3/YM_:W]GA[_#S^/X'!084'AD4'B,B(AH;*"DC&@P/&Q'_^/GX[.GQZ=71 MX.73S=C&ATK)A(4'A(`_P#V\?CTZN+[V]?T&_``= M&0<6*!\1$!P9"`L6"P0*#0CZ]?\"^>SQ]N;:W>?IX=O_N^O3AW>KGX>S>SNKSV^/N\O[^!10.%"4A&Q\A M(AL6$@X:'PH`"`X,]NG\`_'M]>_@YO+GYO+DVNCJX>X$^O`-(140'"$E)!81 M&2`:"@L>%@0-"_G]!?GJ[?/EX>3=XNK@U=CEY>7T]?<3%049*"`J,"$6%R(? M#1,3"A,+_`0!]OCVZN;M[N;>X>;CW]K@ZN#E^_4#'@@$*"X>%ATK)`\1&A(0 M$`<*#@'U]/S^\.KU\>#F\.KEWM_JX-3I^_'Q_PH3%!(:(R<@%!,;'A<3$A(. M#Q#]^@7]^/;JZ_/IWN;IYN?=UN3LY^KU_04."PD:(AH?)!4/'2$5#!(9$PD' M!@'Y]O3LZ^WGY>+E[>7CZ>;I\/+Z__\.&0X*'"D:"Q47#A81"!$2$!,+__X( M`_+V]^KO[-OF]^[=W>KNZ>WW^P`0$0(+'1P=&PL%%A\(`1(/#1<,`@3_"`7L M]`3PWN3O\.KFVMKIZ^/H^04(#@T.'"`?)1,%&1D$`P\5"P<0!OH("?7S^O7S M[N3J\.WIX-WAX./I[OL`_Q`;%!HJ*1P4&AL,!P@)$`H`!@7X^/[Y\?/S[>KI M[OGOWN;PZN;G[_?\"0C[#R$!0?%/\'%@L""`/X^/;Y_/#N\N?L]_+Q M\.CK[N?J]/?Y`0<$!1,8&QX7%Q88'!$0'!<2$0D$_?;Y]NWM[.+A[?;RX=WL M[-_D\?+Z"`0"%!L5&"(?%Q45%A<6$1,9&10&^?O]]^WCX>CGWN?OYNOIXNGF MZOW^^P4.%!,3'2(A'1(.$`D)#PP2&PP""0,!!OKL[.WIZ.CGZNSCV^#KY^;X M^_L&!P4.'"0;$Q@<'10%#1T2"`T3#````@,!\_+PY.CLY][9YN?3VNKN_`/Z M`Q00$20H&QDA(1<-$1L6$@\$!`+V]?W]\>3H\O#M[.KNY]WAY.;J]`,'``87 M%A0A(!D>%P<.&A(+$1@5"`'_``7_\.SQ\>OK[^_N[>OGX.'CZOK[]OH`$!P1 M%28:&!X2%14-%A8/$`\$_@D%]?#P[.3EZ^?AZ>WBW>CJY_@!]?H-"@,5)1H5 M(B(5$A48&A@.`P<.`O/Y`?KPY^;N].S?XNWFW-[F[/7_`0,%!Q0<%!09&14+ M#!02$1$-#Q`*__G[_OGO[.SJ\O7HY._RY=K>ZO/V^/P!!@P7'A<:)!@'#A(( M#14-"`X3"OS^"@?Y[>KP\NGGZNGGYN/AX>?X^_'Z!`01&1DB(!L:%188$`L5 M%00%#/_[!03]]._U\NSMZ.3HZ>7;W.[S\0`!^0L1#1L@&1<4&1H.#1,4%@\" M`@@#^O?Y_?CM[O?SZ^[T[.+AX>/J\_CU^@8(#AD8%!0<&PP*%!<4%!`*#0\& M_?H``>[F\._I\>_E[>_@Y>OE\?_U\`,/!@L7%QP=%`\2$PX4&@X'#0\*__C^ M!??FZ.WKZNCGZ>OJX>;T\O$"!OL`$!,1%QT9#@\6$Q`/$A0)!Q`+__?_"/;J M\>_K[_/KX.SOX>3K\?3X!0/Z"A4/$A@9%0T-$A`0#A$9$0<+"P3_`?[V]N_H M\_'CZ?3JW.;IW_'_\_P*`P07(!<2&Q\4#0\2$Q40#0T*"0/[_0#W[NWKZO#L MZN_IY.3G[NSO_/[[`0H3%A4;'1<4$1,2#A06"P8+#`'^!/OO]_3G[//HZO'K MZN[FY>_T]O?Y`@4&$1(2&QH4%!03#@X7%0<%#PGY_/_Z^//N[>SN[NWKZ>7B MZ/#N\/O[^P,!!Q80$1@1$Q80$Q86%141#`L$_@,!^/#O[.?O]>SBXNKHX>3G M\/S\^/P($!,:%0X=(`X*%A40%Q,%"1$-_?@#_O3PZNSQ\/#MZ.OPZ.'L]/3Z M^_@!#Q`-$QD9&A4'"AT4!A$/!@\,_?X+!??V\N_V]N[GZ_+HX>KIZ>_M]/[] M_P4/%A0:'103&AD1#Q04#`0)!_T!!/CR]?'P\.WQ\>KIZ>CLZNGV_?;]!OX) M(14)&AX3%!,.%1D1!@8)!/\!^?/[]>;M]O#R].[O[^_R[>;S!/KN^`<-#@P) M#QH6#@P-$1D6!@02$`0$`?C^`>_E\/GT[.WP\/#IY._[]N[X`/L"#PH)&!D0 M#@\3&1<."@\0#PT`_@7]]_7JZ_7PY>GQ[^GEZ_+Q]OS[_04("Q05$A<6$1`2 M$`T0#04�G^_P(`_/3P\O3R\/'L[?3KY?#S\/G^^_X#"1$1#10:#`84$P@, M$`H)"08'!`(&__7X]^_T]>_P[NGKZ^CGZ_#W_OOZ!!$5$1(6$Q07#@P6$0H1 M#`,*"_[Y_O_SZO/W\.SM[>[NZN;GZO'Y^?3\"0T0$A45$!<<$`@.%1<*_042 M"O?X`_[T\^_L]??MZ>_V[>+M\^KQ`/KT``T."@X5$Q(5#@P4$PT)!PT,`P,` M_P'\]/#S]_/L[>_L[.GEZ?+Q\?\`\@(7#`H2$A(4%!$4%`\1$PH)"P4!`/[Z M]_?S[_/S\.OI\>WBZO#L]?WZ_0<+#0\1%!02$`X0$`T.$0H&#`D$`?W_^O3X M]/+Z]>GL]?7LX^OU\_3W^``*!P@4$@T3$1`2"0L5#`4*"@D(```$__OU\_GU M[_'R[NWNZ.OT[>W[^?;^!`H/"@D1%1(,#A,.#0L&"`8'!OS^`?KW^OGT\_+P M\.[N[^GL\O7X^?L!!@8'#PX+$!(/#!`2#0T-"`8%!/_\__WY]O3W^?;Q\/3R M[O#M[?;Y^OK]!PD)#@P+$1`-"PL0#`D,"0@)!04!_?_^^/7X^?/R]O3Q\O#O M\O3W]_?^`0('"0D.$0\+#0T-#0L+!PD*`P<'_0$%^_3Z_/#Q]>_N\>_N\/+U M^OGZ``,("0D0#0T3#@L.#PX+"`@'`P,#_O\!^_?X^??R\/3Q[?#P[?#U]?D` M_@`)"0D-"PL0"P8,#@D'"0D$`00#`?SZ_OOZ^O3V^/7U\O#Q[NSQ]_;T_`#^ M!0H'"@T,#0P*!P@/#P4!!@@&`OS]!/_U]?KZ]._U].[P\.[P]?;V^_[[`PX( M"!`/#A`/"@T2#`<)!P8%`0#^_P'Z]?K[]O+T]O'T]NSP^_?X__[]`@D*!PD. M#0P,!PL0#0@'!P8%`O\!`P#\^?O]^/;X]_/S]?+O\_;W^?K[``0&!P<)#`H+ M"@P-"@L*"0H'!00#``$"_/G\^/3T]/3S\N_M\_CR]/[]_@,#!0D-#@H+#0L+ M"@H+"`("!00#`?[^_OKX^??W]_/R]/+Q]/;V]_K\_@`!`PD+!P@,#`L*"0D* M!@(#!0$`!0#Z`0+Y^?KX^??T\?/T\O3U]?K\^?L``@,("04(#0H'"0H+"08$ M!`8%`?__`@#Y]_GZ^/7W]/+W]?+U]??^_?K^`@4&!@D+"0D+"@D,"`4)"`,# M!0'_`O_Y^_WW]?OW\_CW]/;Y^/G^_?P``0(%"0D("`D+"@<)"@8%!04%`P,# M__P`_OCY^_KX]O?U]_GW]OK]^_L``O\""`@&!@@,!@,+"04'!`,'!P(``@$! M_OCY_/GU]O;U]?7U]_;X_/S]_@$#!`8'"0@&"`D'"`@%`P8&`0$$`?W_`/OZ M^_CX^/7W]_7U]?CZ^OO]_P`!`@4'"`<'!P<("`4&!@($!`("__\`_/O\^_KX M^?KZ]_;W]OCY^/K[_@#^`0,$!P<'!P8("04$!P0"!@,!`O_]_?W\^OGZ^?KX M]_GY^/CX^/K]_OS]`@0$!08("0@&!@@(!00$!`0$`/X!__O^_?GY^OKY^?KW M^?SY^?O\_P'^_@0%`P4'!@8)!P4'!@4&!`,#!`']``'\_/SZ^_KX^_OW^?CY M^OK\_OW_`0`#!P,#"`<$!0<&!08%!`0#!`,`_____/W^^?C[_/KY^?GY^OOZ M^P#__@$!`P8%!`8&!04%!`0%!`$"!`(!`/_^_O[\^OKZ^OSY]_O\^?KZ^?X` M__[_!`4$!`,&"08$`P4&`P("`0(#_OT``?W\_/O\_/OZ^?O[^OKY^_[^____ M`0("!`0$!04%!`,$!`,!`0(!__[]`/[Z_/[]^_O\^_O\^_G[_/S]_O__``$! M!`0$!0,#!00#`P0#`0("``#^_@#^^OS]_/S\_/S[_/S[_?S\___^_P`!`P(# M`P,%!0("!00"`@(!`0'______?W]^_W_^_O]_/W^_/S]`0#]_P$"`@(#`P(# M`P(#`P,#`0`!`@'^_P#__O[]_?[]_/W]^_W^_/W^_O__`/\``P$``P,"`@,# M`@("`@$!`@'__@$`_O[^_?W^_OW\_?[\_/S]_O[___\``0$"`@(#`@("`@$! M`@'_`0'__P#__O[__OW^_O[]_?[^_?W^_O[_____``$!`@(!`@$!`@$!`0'_ M``$`__\``/____[^_O[^_O[^_O[]_O_^_____P$!`0$!`0$!`0$!`0`````` M`/\`_____O___O[^_O___O[^______\``````0$``0$```$``0$`````__\` M`/_______________________P#_````````````````````````````____ M_____________________P#___\````````````````````````````````` M``````!#3TU-````$@`!``!#%@`(0`VL1````````$U!4DL````"``!)3E-4 M````%#P``'\`?P``````````````````05!03````:A39#)A``(````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M`````````````````````N`````````````````````````````````````` M```````````````````````````````````````````$"```````"0`C```` M`````````````'@````$``0```````'\`/___X`````!`0$&455N:71S`/\` M`/___OX!`?[^`/____\``/__`/_^____`````0+_!B!S86UP````%8P*P`$D&VK3#\`J(`?!T)G2&T- MZB\.+P9.N@`\4@=P`0M-86=I8R!&;'5T90(```!!249&4V0R80`````````` M``!!249&4V0R80```````````````````````````````*<]K5D``$4B```! MSA`N`!9(@$'MJ;@2,```2('203HS$``0+@`62(!![:FX$C```$B!TD$\,Q`$ M/@5"!!U\``'_^;Q'7,`2!`H!``'``6=*ND=6P+Q'5L&"+@`4P`$"0``!9Q0_ M!Q\N__E![@`,(!AG`B\`(%!.D+Q';@1X`6#"0F````'@```!6`'&X MO!RF````'`!6``!7```````# M__\````\```````$__\```!:```````````````````````````````````` ;```````````````````````````````````` ` end slashem-0.0.7E7F3/sys/share/sounds/frsthorn.uu0000664000076400007640000003703310545462317017335 0ustar alialibegin 644 Frost_Horn M``I&8G1_?'IX:50_+!\8$@P&`?OY^?GZ`AM$9G5Q84DW-4%/4T]&-R8G0EM7 M0R\9_NG:TM':\A@_6&!:3C\Q+30Y-S(R-C@U+B89"?3>S,/,ZQ0S.BL2]][+ MR]KJ\OG___CLY.#>W=_BX=W7UM_V%"PR(@L"#BA"6&5A5E!)/#$L*RLI)R(9 M#@H:.E=B7D\[)104(R\O)QP._?L2+S8##@?UX='(S=[N\_'LX]7'RMG@ MU,:XK*FOOMS^$Q<.^^36WO8.'",@%P\*!@+^]^S=R[>FGJO1_ALG(Q#\Z-3* MS][O_0D)_>W@V]K;WN'CX-S?[@$.%QX<$`+^$"@P*R08"?[V[>3:T,S+RL?` MOLKB^`(!]^[HX^+FZ>39SL*UK;+'W./CW M#0']``@4'R`5!/?^'#E%13PM'Q0*`O[Y\>KGZ.WT_@<*!?SPXM;7ZP<9&P[W MW[GVL[(U?PI/SPK$_WP[O<% M#@\'^NO=U][K\_#FV,F^O]#P"1`)_.W>T=+J"!85$0H`^?+JX]O4SLO+SM3C M]P$"__GQZ^3>V-'(OK2KI:*GON/\__7AQZZCK3?X_(`!0+]]N[E MW]W;U]+.QKNQM-'^(C4V*1L6$Q`."P+VZ>/DY^GM]/CPW\JXL\7E``P,!?SU M^Q,D'0KYY]G3TM?=X-_;U,O(U.K]!@/UY^'F[_?\_?CMX-OH##1,444I#?T" M'#E&0C,B%Q(3&R$?&1`*!P0!_O;IV]/-P[S&Y000"_[MXN'I\?/R\O+T^@$$ M`/OZ_/[]_`8<+2\A"_/EY_<8-T`V)1#][-K+Q\O.SLS(QM;[(3?X]N[?SL&VJZJT MQ,[/Q[_&X/P)"/_SZN;GZ.;?ULW%P,#.Z_[^]>C4P\/9^Q$6#P+T[_4`!PT1 M#P?]\NC>V-?;W-3'NK;+\A$<%P?W[^SL[O#P\/'OZ>#:U-#2VN+H\@<>)!D% M[MG.SN($&QX9#/_[_?X!!@@%`P$"#!PH*2,6!_OOX]O8U]71S,C#Q-'E\?7P MYM[A\`<:)B@E(B`?)2LK)B`9$0P*!P'X\>[M[/00/%YI954\)AH9)3(X-"PG M)B8E(Q\5!?+?SL7)WO4!_>[:R<+-Z0$%`?7CU=#1U]WDZ_/V]/7_#!`-`_+A MV=SE[O;W].[K[?D1)RH="O+>UMWR#R4O,"TI)B4D(AX;&!,)__;P[O'Y__WU M\`(G0DE$,QP-!P<-%AL:$PL`\N+4S,K-T=?:W.?]$!0+_.OBZ`(<)!\7#`#Z M]_C[^_;LXM?,Q]+J_0+[[=O)O;O#S=/5T[BU,K*WP4C*R42^^KCX^CL[.KL\O?X]>_IY^KMZN7B M[007&Q0%\^3F_AWBUM#=^@\2!>[6R,C3 MY?D*$Q83#04`_P#\].C:R\//ZP41#?SFVN4%(2PK(`SXZN3EZ>WR]O7OY^'G M]?[^^//S]?;T[N7SDWM?.R=#@Z^O@SKR[TO(! M_O3BTLS,T=CWP M]OT`__SZ^OKW]?@'(#E&1#[W#B@X.3(J M)R'R"1XG(!@1#`X5&AP<&1,-!@'\]N[GY.+? MVM'%O<39ZNWEW>3Z"Q`1#/[OXMG6V-C4T-'4U<_#MK?*X>SLZ.'7O]O/G MU\_;\?KW\>77S\W-SM7H`10;%PT#_/CX^_\!__OY^?K\_OWW\.WW!@T2'!\7 M$`P)#A?E[@(@.TI,0C0F'QXC M)R0;$`@%"`P,!OSOX=?:ZOT0)S@W+!X,_/7V_@@/#PD`^/+MZNCGY>+>V=+- MT^7\"P\-$B,Q,"H@$`,``@<.$0\*!@(`_?CQ[?#[`P/^]_'P]@`(#`G^[^GQ M``<)"0/Z]?+O[O']%3)(4T]!,28B)S1!1D,Y+2(6"O_X\NWO`ADE+3H],RD? M%Q05%QL?(!T8$PP#_/3JX-3'O[NYN\;<[_'FV-';Y^CDX-7+QL3%RU=#4Y@4A+BL?$`3^_@`! M_O?Q[.GFX-K6TLS'RMCI]04;)2$8"OSV^/T%#A49&QT=&1$*!/_Z\^KAW-_P M#BDV-C(X04$Z-BXD'!80#0L)"`D(!/[W[^;BZP$5'!8'].3/H\PLL1U)-0#4P+S(W.C8M)!L2"0#Y]O?W^@86&Q48(B0?&A(* M!00%!P<%__CS[./8T,O*S,[/SLW/VNGR\.GDZ_H#"0\0#P\,!P#Z]/'R]/C\ M____"2`[35%)."@A(RPR,2DA)CM-344Y)Q0(`?[_`PXE.D`Y+!T4$!$2$0X' M_OGV\NODW][>X>X('!T9'B`<&14."PD)"@H(!PH-#0D#_/;NYMK+O*ZFK<7D M^/OY_08&`?_\]>SBULW)R,K0UMC6T&!,,!P8) M$!@=&@\!\N3:V-O?X-W8T,6\O,WH_@<($2(K)R$;$`;_]O#N[N_R]?C]`0#X M[NKV"A<9$@;^_@(("P@`]O<)&QT6#P3Y\_#N[>ST"!\L*R(4!O__"!0=(2(> M%0K^]>[GX-WA[OH"#A\F*"LF&Q0/"PH*"@D*"PX0$`T&_O7O[>SJZ_/^!04" M!QLP.#@T)1#^[N7DZ?#W_?[]^_;Q[O,$'2XT+R06"?SQZN;BX.C_&24C&@GW M[_#S]OD`$28W/T$_/CPW,BLD'10,!P8'"@T."P8$#!<=(RDG'A<.!P,"`@0' M!P#W[>/:TL[*QL3`N[.MK;C,VMW9VND`"PH'_O#EWMG:WN/I[?'R\>SAUM/A M^@T4$PT'!`(`_OGPZNT!&2`9#P+PX=?0S]7F`QXK*A\2"`+__P,'!@'Y[^/5 MR,'#Q\G+U.'M^PT6%!$-!?_\^OGY]_7U]_CW]._KZ>CGY>/BZ?H1(2(7"`<9 M+#$P*AT3#@P,#0T,"0/[[^/8T]GM!AD@'!$%_P`'#A$-!@(-)CL],R82__/M MZ_4+*T1-23PO)R4H+"TJ)!X;&QL9%`O^\.+8V>L)*3Y!-B@9"@$``0("_O?N MZ.7DY>3BW]G4T,S*T.#S_O_VZ>/O!Q@=&@KUZ>7G[_C]`04("`/_``TF/TM( M.245#0T3&1T=%A`4)SL^,!\+]NGFZ/('(C(S*R`5#PX0$1`,"`0"`0$#!04` M]>;7TM[]'C(X+QX,^_#O]P(-%!84$`L$_/'IX][9T\_/V>X""0?_\^[Y#184 M#`#PX]S9V-?3S<:_N[BXP-7O_P#X[-_6T=#1T<_*QL7/Z`<8%PX`[-S3T=WV M$R8L*!T1!O_]`@D/$0X)!/[Y]_?X]_/NZ.L!'S0\."H:#0/]_/X$"@T,"@D( M!P+[\NG@VM?8Y/L1&A,![.#I!R8T-2P8!/7IY>KP]/;V]._I[``=-$%#/#,L M*2HK*B8?&`\(#!XK)1<*]^+8V>7^&"@J)B`:%A(/#`@#_OGV]?C]`0,"_?/G MW-SS&#,].2H6!OGS^``#`O_[]O/R\_/Q[>?@V=37Y/H/&14']>GK_A@F)AP( M\^GI\/?[_O[\^?;V`!0H,2XC%PT)"Q,=(B`7"O[T]08>+#$P(P_]\_<-)C0U M,"VMC7 MU,['P+R_S^G[_O7EU/@WMO9UM'+Q\SD M#"HS+B`)]>KK^`D5&!<5$@X*!O[SZ.+?W=WG_14E*"`2!?GT`R$V."X>!O'F MYNSU^_SW\>KDZOX5(B,<$PT+#`X/#0D%`/OT[?`!%!H7#O[MZ/(%&28G(1XA M)S$\0D([,B@=$@D$!0P3%A0)_?H,*SPY+R(0_O/S^@($`?KQZ.#8T]#.S?%@G\\.7@Z@`/#@;\[-O1S,S. MT,[&O+>_U_$``??JX-S7?[087&Q8)^O'T_PT2 M#P;\]._Q^0,("`+WZ=G/SMS['3`P*!H(^/+S^/X"`P#[]O#HXM_AY>;G[P(9 M)209"__X]_C^#B8U,2<>%`L'!08'!?_W]0`8,T1%.RPA&QD;("0E)"$<%@T` M\>SV!0H'`?C[#!H>&Q,)`0`(3$0T*"`8#_O?PZ^?BW-KA\`0=,SDM'0SX MZ./DZ>WQ]?C\_P$!`/WX\>GDZ/@.'1\6"?SS[^[P^@P:&Q4-__/MZNCGZ>GG MZ?0%%B(E(AP6$Q08&Q@1"PH,$!(0#Q8F,"H>$PT5*3D^.S0N+3(Y/T`\-2XG M(!D3#PT+"07_]>SI[O8"$AD3"O_QY^/?W=[?W=C4T,S+S='4T]'4X_<"`OKO MX-+(P\+$S^?Z_/7MXMC4T]38W-W=Y?D.%Q(%].;?X>OW`08'!@'Z\^OAV-?F M^?_]^?D$$!,/!_WT[_'W^?CX^?S]^_CU\_'O[.;>U]7KN`1XT M/3HM'A(*!P<)"0<$`/OT[N?AX.T'&AX:%QPE)AP/`??T^@@7("`9$0L%__OX M]_GY]O'JY>GY#2$V0SXO(1,%_OS]``,#__GV]//S\N[GX-WC\?\%`_KOY^7I M\OC^#2$K*"(6!/;P[_'V^OP%%B@P+R<<%18=)R\P*R0>'!H7$@H`_`05'QX= M'R4N,2PB%Q`-$1D@(A\9$0@`]_#JYN3FZ.GGY^_\`00-&1H5#PD!^O'HXN'D MZ.SP\>SEW-70T^+\$!<4"?OPZ.7DX^#+Y`__\``4(!@'[^?P!"Q4:&182#0D'!@4#`/SW M\NSFY_4&#Q8A*2@A&A`(!0']^//LY-[=X./EY^CGYNWZ!@L(`?CR[NWN[>KM M_A0=&1$$\^CBX>3H[?@.*T!(1#(RC@ MX^_V]OD"!P3_^O+JY-[:V=C6TM'3U=/.Q[ZXN\O@[O#GV<_,TMO@X=[B\@0( M!?[QY=[;VMO?]$Q\?&1$,"PX3%Q81#`<%`P#[].SDY?+[]O#W!`P."@/\ M^/CZ_P0$__?MY-_>WM[>WM[;UM#/VNOV_0D<*2<=%`H&!P<)#A06%!$0$1(1 M#0;^_0H;(B$9#P8`_?W[\^KI]P8)!?_TZ.'=W=[>X.K^$R(D'1(*"`T6'!P7 M$0H%`?WZ^/;Z"2`L*B@M,C8U,2LE(1\?(2$=%Q(/#0L)!?[W\.OFX=O=Z?;[ M_0@:(R,?%0?]].SFY.+>VMC8V=O=W=S=Y_@($1$*__;P\/3X_`(3*30S*AP- M!`#]_?W]`1`I04U.1CPS+BLI)R4C(B$?'AL3!_KT_@T0#1`7&QP7#@7^_/T` M!0@&`?OU\.SIY^3BWM?-P[N\R][L]@83$0;[\./>W^/M]OS____]^O;OYMO: MZ``0$@H`^OG\_P'^]_/Z!PL(`_?IX-O7U-/5WO(,'R,;#0'[_`(("@D'!@4" M_/3KX][D]PH,!PH2&1L7$0H&!@@-$A05%102#PL$_//KYN'%0T*"Q`6'!X< M%Q`)`_[Z]>_HXMW9U]OI_0P8)C`M)1\9%!(0#@T+"`4"__SY]O'JX=S@\`,- M#@@`^/7S\_#KZ/$"#`T*`/+FWMG:W>'J_1WHX][:UM?B[?7_#A@8%!`) M!@8%`?_^_/KW\^_KZ.3AX.;W#AXA&Q$(`@$#!00#"QLF)B`6!_GNYN#>WN#K M!"`Q-2XB%@\+"P\1$0X*!0#Z\NC'BX>+M`!0?(AP2"P@)#0X*`OOV]?3S\N[IZO8# M!@$!"QTI*2(;%Q<<)"TT,BPB%PP#^_7P[NWMZN;G\@<6&ATC(QH2"?_V]/3U M]_?U\>WIYN/?VM;2TMWQ`@@!].CDYNOO\?+Z"Q<6$0?XZN3CY.?IZ_4+)#8Z M,B07#@P2&AX?'QT8$@L$^_#J\@0."0,'$Q\D(1D2#0T/$1(1#PP)!P<&!/_V M[.+9T]#3X/(`"!$<(!T9%A`,!P(``/_Y\_#R]OCV\>KE[0`2&1@1"/_Y^/GX M\NSP``T+!/ONY-[;V=C7VN?_%B(A%PH!``4,$`\)`?;LY-_=V]K>Z?H#!0P8 M(2(>%0P'!PL5'B0E(QX8$0H#_??R[.?BWM[I_`@(!`D2%A(+`//M[O+U^/CT M[>;@W-O:V-CB]0@0#0+UZ^CJ[_3U\O,!%!H3"O[PZ.?FY^OT!A\T/T`Y+R&Q<4$Q$,!P#X[^;D[/?_"1DB(1X8$0X/$1(0#0@#_??PZ>#9U=/1S\[- MTN+Y#102$ATF(QL4"?WU\.WN\O7Y_@(!^_/IY.P"%A\=$P@"``$"`/KRZNS[ M"@X+`_;JXMS8V>+Q`@X3$Q(4%QD<'AX;%`T&`/KT[^KEX>#H^Q(G-#,I'A82 M%1PA(1X9%!`-"0/^^?/MY^+'M_Q`7%@\&`@(%"`@"^.WEYO@1("(=#_SLX^'M!R`N,"HC'1L;'B$A'AH7 M%!(0#`;\\>;=U=3A_!4@'0__\_#V``D-#`'=V=75W^_\__OS MZ.+K`QPG)1H*^>_JZO#W^O?Q[.CG[P$3'!P6#04"`PD-#`?_]>G>VN7V_O[Y M[=[6U^;]$1<3#0D("Q`4$Q`)`OSY^OT!!`3^]>SG[@8G0$E%-R07$1(7'B$@ M'AL7$0L%`/OV[^;@W^K["0X*`?7KY./O!A<:%0O\[.#8U-36UM74UN+U"A@; M%@T&`/SZ^/;S[^OHY.#>Y/4$!P'VZN;N_@T9'QX;&R`F*2VMSD[._M[OL2(B8C&P\&__GZ``8)"0<# M_/7LY^OY"`\/"0+^_?\!`?OPX]SD^`@,"@/VZ=[7V>7S_0(&"`<%`P0'"08` M^?/O[N_Q\?#LY^'@[`,9)BD@$`+Z^/P%"@T0$Q89&AH7$@L$^_/R^PL7&A<1 M"P<#!A0G+2<>$P7Z].[KZ^SJZ.GR``P1$A`,"`4"`/[[]_+MZ>;BW-C=Z_7U M\O+U^P$$!04&!@@,$!(0#`<"_/;Q[>KHZ.KR_`4)!?SV^PP<(B(<$@@#__W^ M__SX]O3S]?X*$Q<6$PX(!`,$!@@'!/WV\_L,&!D6$`D*$A@;'!H7%!,4%A@8 M%A(."P;DX>#B[/T/&1@0!_[W M\>WN\O;X]>_J[P`/$@P"^/8!#1(3$0T*"@P0%!87%A(-!P#[]>_LZNGM^@4& M__\*$Q01#07__/S^``#^^O;R\.SGY>O\#Q<4"__SZ^?I\/?Y]_/W!A8:%@W_ M[^+:V^P#$A84#0%@P"]_#L[?#U]_CW]_CX]_;T\>WIZ_0! M"0P*`_GP[OP1'B$>%`?^^?;W^?KY^/H"#1<:&10/"00"`P<+"PD%`?ST[.;K M^`,*$189&180"@3_^_K_`P4&!@<)"@D&__?NY^7L^@8(`_KR]@,.$!`-!@'_ M_OX``P,!_OKX_0D3%Q4.!__Z^/L`!@@&`?KPZ.?R_@(`^_C[!0H+"@D'!04% M!PL.#@T+!P+]]_+NZ^GO_`D."@0$#A@:&!0-!P,!````_OOY]_/NZ>SW`P@' M`_WX]?3V^O[_^O+IYN[[`?[X[N'9W>OX_O[Z]?'N[_/Z``("`/OU\.WKZ^KG MY>7K\OP+&R(A'181#Q$2$A,1#@H&`?_]_?P`"Q@?'AH3#`3_^_KY]_/Q^0D5 M%A$*__/JX^+K^P8+#`D%`O_]_/W^_/KX^/CW]?/OZN7BYO4-'R4B&0T"_/K[ M_P$!__[^_O\```#]^?C\!@T/#0@!^O3P[N[S_PX6%`\'_O;Q[.KK\?L$"@X0 M$`X+!P0%!PD)"@L+"@@%`OWX]/D*&R0E(!<0#0L*"PP-#0P+"0@'!@/^^/+Q M]@`+$1`+`OCOZ./H]PL6%Q,+`/?NZ.3CX^;O^P4*"P@%`?WZ^/G\``,"`/WY M]O+MZNSW!A,='QP7$@X+"08$`@(#!`8&!`']^O;R[NWT_P<(!@'[].[N^`8- M#`D#_/?S[^WKZ>?FZ_8"#`\."P@$`0`!`P0$`O[X\^[JZ.GO]OK^!`@(!@/_ M^O;T]/;Y_``#`O_[]O+P\._M[?#V^_W\^?7R]/T&"@P-"P@%`P#^_/KY^OL` M"1`4%!(/#`H)!P<&!@8&!0,!_?GY_P0$!`D.$Q,/"0+[]?+S^/T!`P0"`?[Z M]O+O[>OK\?H``P#Z]/3\!`@*"08#`?_]^_GX]_;V]OH"#18;&A82#0D%`P,$ M!`0#__KW^P0+#0L(!0<+#0T,"08"`/\``P8("0D(!@,`_?GU\?#Q]_X"`?__ M!@X1$`X*!`#]^OGX]_;T]//T]OP&$!45$@\+"08%!`,"_OKU[^[S_@<)"`/] M^_X#!08&`P#^_@`#!04$`P(!`?_\^OCV\_+T^?S\^OT&$!,0#`@%!`,!__W\ M^OCW]_C[_P0)#0X-"P<$`@#__?OY]O/P[O'[!`8#__KV]_T#!P@&`P'__?S\ M_/OZ^OKZ^OGW\NWGX^'AY>OP\_;]`P4!_?OX]_?W^?S^__[]^_GW]OC]!0T2 M$Q$,!@+^_?X!`P,`^_C\!@X1#PH$_OP!"`L,"PD&!`,#!0@*"PP+"08"__SZ M^/;S\?'T^/K]`PL.#0H'!`("`P,"`/SX]/+S]/3T]OG^`0,"`?_^_?SZ]_7T M\_/S\_7\`P8$`?WY^/O_`@,$`P,$!04&!P8&!@8'!P@'!@4$`P(!`@4("`8% M"1(7%A01#@T+"08$`P(`_OSZ^?GZ_0(("PL(!`#^_?W]``,$!`+^^O?Y``8& M`O_[^?K_!0<&`__\^_T"!@D*"`8$`P$`_OSY]O/Q\?7\`@8'!00'#Q04$Q`, M"04"``#__OW\^OCV]/7Y_@("`@#__O[_``$!`/[\^?;S\>_R^?W[]_3T^0`$ M!0,`_/CW^/O^``#__?S[^_OZ^??T\?#Q]_\&"0<"^_?Y`PL.#PP&`?WZ^OS] M_?OX]O7T]?G_`P8&!`'__P$#!`,"`/[\^OCV]?3V^P$!__\!!`<'!@0!```" M!`8("`<%`P$!`@0$`O_\^?;V^P(&!P4`^O;U_`8+"PD%`/S[^OGY]_7S\?'S M^0`&"`<#_OKW]_K]_____OW[^OCW]?/S]OL`!`D.$1(1#0@%`@$!`0(#!0<( M!P<&!@8'!@,!``$%#`\0#@L&`O[]`0L2%!(/"P<#`?_^_/KW]/+S]_\&"@L* M"`4#`0```````/____[\^??T\?+W_`()#`L(!0+__?W]_O[]_?W^__[^_?S\ M_/S[^_S_!0L-"P@$`@#]^?H!"`L*"`4`_/KY^?KZ^?GY_`('"@L*"`8$`@$` M````_______]^_CU\_'R]@`)#@\-"04"`/___OS[^?CW]O;V]O3S\O'Q\O/V M^P`#`P'__?OZ^OGW]O?]!`H+"08"_OOY^/GZ_/\"!0<'!@4%!04&!P<&!00$ M`P'__?KX]O7U]?7V^@()#@X,"`4"`/[^_?W]_/OZ^/?V]?7V^/K^`00&"`<& M`P$`__W]_/S\_/S]``8)"@<$`?[\^_O\_@$$!04%!`,!__[^_P`!`0#__?OY M^/CX^?GY^OK[_/X``P<*"PL)!@0#`P,"`0#__O[]_?S\_?[_`@0'"PP,"P@& M!`(!``#___[]_/S[_/T!!08$`O_]_/X``P4$`P'^_?S\_?W^_O[^__\``/__ M_OW]_?W]_?X``P4%`P$!`P<)"0<&!`,#`P,#`@$!`````0``__\``@0%!00# M`@#__O\```$!`/[]^_GX]_?Z_@$"`/[\^_P``@(!`/_^_?W^_O[^_O[^_O__ M``#__OS[^OGX]_?Y_``"`@$`_?OY^OX"`P,"`0#___[]_/S[^_KZ^?GY^_\$ M!P@(!@4#`@$!`@(#`@(!`0#__O[^_?S[^_X"!`4&"`D)"`8$`P$```````#_ M___^_OW]_?[^_OW\^_GX^/O_`@,#`?_^_/KY]_C\`00$`P'__?S[^OGY^/GY M^OP`!`8&!@0"`0`````!`0(#!`0#`@$`_OW\_/S\_/X!!@H,#`H'!`(!```` M`0$!`@,#`P("`0#__O[^_?W^_P`!`P0#`P(``/_____^_?W\_/\#!P<&!`(` M_OW\_/S\_@`#!04%!`,"`0#__O[^__\``0$!`0#__OW\^_O[^_K[^_W_`P8' M!@0"`/[^_O[^_O[^__________[^_O[__P`"`P4%!`0#`@$`______[^_?S\ M^_O^`0,#`P$`_OW]_/S]_O\`````__[^_?S\_/W]_?W^_O[___[^_OW^_O[^ M_?W\_/S\_/X``P4%!00#`@$!```!`0$!`0$!`0$``/_^_OW]_@`"!`0$`P(! M``#__O[]_/S[^_KZ^_S_`0("`0#^_?W\_/S]_@`"`P,"`/_^_O[^_O__```` M`0$!`0$``/____[^_?W\_/S\_0`#!04%!`,"`0#___[__P```0$!```````` M``#___[^_OX!`P4%!`,"`0``__________\```$!`0$!`0$``/_^_?W]_@`" M`@("`0#___[^_O[^_O__``$!``#____^_O[]_?W]_/W]_@`"`P("`0$!`@(! M`0```````0$!`0$!`0``___^_O[^_P`!`@,#`P("`0$```#___[^_?W]_?[^ M_______^_O[^_O[^_O__``$!`0````#_____________````````_____O[] M_?[^_O[__P`!`0```/___O[^_O[^__\``````````````/____________\` M``$!`0$!`````````````````````````/______________``$"`@$!``#_ M_______________^___________^_O[^_O[^_O[__P`!`0$!``#_________ M_O___P`!`@("`0$```````````#_____``$!`0$!````______\````````` M`/_____________^_O[^_O[__P`!`@(!`0```/_______P````````#___\` M````````_________P```0$!`0```/_______________P```````````/__ M____________``````````#___________\```````#_________________ M______\`````````_________________P```````/________________\` M``````````````#_______________\``````````````/___P`````````` M```````````````````````````````````````````````````````````` M``````````````````````````````!#3TU-````$@`!```H%@`(0`VL1``` M`````$U!4DL````"``!)3E-4````%#P``'\`?P``````````````````05!0 M3````:A39#)A``(````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M`````````````````````````````````````````````Z`````````````` M```````````````````````````````````````````````````````````` M```````$"```````"0`C`````````````````'@````$``0```````#\`/__ M_X`````!`0`&455N:71S```````````````````````````````````````` M`0(`!B!S86UP````%8` M``$A!%-!1$6!`0`````.```&`:/4?J:EY/O_```B8`I&`0``D`#&`0#_^/_C M````````@``````````````:`"D`#P)J`S$`*@`#`FT#/0`I``\"00,B`0`` M```:`"D`#P%0`?$`*@`#`FT#/0`````````````````:`"P`%@$^`=P`*@`# M`FT#/0`````````````````:```````````````````````````````````` M``$````!>````'@```!6`'&XO!RF````'`!6``!7```````#__\````\```````$__\```!:```````````` M```````````````````````````````````````````````````````````` ` end slashem-0.0.7E7F3/sys/share/sounds/lethdrum.uu0000664000076400007640000006404510545462317017317 0ustar alialibegin 644 Leather_Drum M``Q,96%T:&5R($1R=6T````````````````````````````````````````` M``````````````````````````!!249&4V0R80$``$X`SP```````$B,```! MZ*<]F@*G/9L$``````````````````````````````"!@6!?``!&3U)-``!( MA$%)1D934TY$``!&B``````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M`````````````````````````````````````````````````/___P``_P`# M`@$!``#__P@.!/CU]_T!^?;\``#__/S\^?3P\?3U]?7V^?GX^/KSZ^ON\O3U M^/?R\?'V`@@,#PP)"@\7%0X-!_[Z`1`9&!03%A@;("`4"@8"``4-$Q0/"@D+ M!O[Z^/?W]OH#!0($!P/[]>WJ_QH@&A0+`?_Z]O#HY-[=Z?3V[>SW\>7AX>?L MYM?+Q;R[R=CAXMS9W-_>W^'BY>SS^@`!``(%"Q0<)"PT.CDV.#Y!0DA36UY@ M8V)=54M$0T,_."TC&1`(`__Y\^OCW=K7TQK["R MM+:VM;2SL[C"R]'7W./L\O;Y^_S^`@<,$147&A\D*"TR-38W-S;BW=G4 MT,K"NK2NJ::DHZ.CI*6FI::GJJ^TNL#%R,K.TM79W^3I[O/Y``4+$18;'R,F M*"LN,C0V.#H\/T-(3%%55E965%%-245!/3DV,B\J)2`;%A$-"08#`/WY]?+O M[.GFY.+@W]WSR^/\$"A`5&1XB)2@L+S,V.3T_04)#1$1$141#0D%`/SX].S@U,B\M*BX.+EZ.OO\O;Y^_X`!`<*#A$4%AD;'2`B)2@L+S0Y/D-(3$]04%%0 M3TQ)1D(^.3,O*B4B'AH7%!$."@8"_OKV\>WHX]_:U=#,Q\/!O[Z_O[^_O[^_ MO\#`P,'"P\7'RL[1U=G>X^CL\/3X^_\"!@H-$!,5%Q@:'!X@(B0F*"DK+"PM M+2TM+BTM+"LK*BHJ*2DH*"DI*"WHX][: MU]/0S,G&Q,&_O[^_OKZ^O\#!PL/%QL?)R\W/TM78V]_DZ>[T^O\%"@\5&ATA M)"[L MZ^GHY^;EY>;GZ.CHY^?FY>3CX=_=V]G7U];5UM;6U]?7V-G:V]S>X./FZ.ON M\?3W^_X!!`@+#A`2%!<9&QT?(2,E)RDJ+"TO,C4W.3H[.SLZ.#8T,2XJ)R,@ M'!@4$`P(!`#\^/3OZ^CDX-W9UM32T,_.SWQ M]?G\_@`!`@(#`P,#`P,#!`0%!P@*"PT/$!$1$A,5%A<8&1H:&QP<'1X>'AX> M'Q\?'QX='!P;&AD8&!<5$Q(0#PT+"08$`?_\^?;R[NKEX=W9UM/0S7I[/#S^/P!!0D.$Q8:'2$D)BDK+2XO,#`P,"\N M+"LI)R4C(!T:&!84$Q$0#@T+"0@'!00"`?_^_?OZ^/;T\O#O[N[M[>SL[>WM M[>WM[>WL[.OKZ^KIZ>CGY^?GYN;EY>7DY./CX^/DY>;HZNSO\?3X^_X!!0@, M#Q,6&1P>(20F)RDK+B\Q,S0U-34U-#,Q,"XL*28B'QL7$P\+!P/_^_CT\>[K MZ.;CX>#?WM[>WMW=W=W=W=S3CXN'@W]_?WM[?W]_@X>/DYN?IZ^WO\O3W^OS_`00'"@T0$A48&AT?(20F M)R@I*BLK+"LK*BDH)R4D(A\=&Q@6$Q$.#`D&!`'^_/GW]?/Q[^[M[.OJZ.?F MY>7EY.7EY>7EYN;FY^?HZ>KK[.WN[_#R\_3U]O?X^?GZ^_S]_?[_```!`@0% M!@<("@P-#Q$2$Q05%A<8&1H:&QP<'!P='1P<&QL:&1@7%A03$1`.#`H(!0,` M_OOY]O3Q[^SJZ.;DXN'@W][=W=S+DY>?IZNSN\/+T]OCZ^_W_ M`0($!0<("@P.#Q`2$Q,4%!45%145%104%!03$Q(2$1$1$!`0$`\/#P\.#@T- M#`L)"`<%!`,"`/_^_/OZ^??V]?7T\_+Q\.[M[.OJZ>CGYN7DY./CX^3DY.7F MY^CJZ^WO\?3V^?O]``(%!PD+#1`2$Q47&!D;&QP<'1X>'AX>'QX>'1T<&QD8 M%Q44$A$/#@P*"`8%`P'__?SZ^?CW]O7T\_/R\?'P\/#P\/#P\/#P\/#O[^_O M[^_P\/#P\/'Q\?+S\_3U]?;W^/GZ^_O\_?W^__\``0($!08("0L-#A`2$Q46 M&!D:&QP<'1T='!P;&AD8%Q44$A$/#0L*"`8$`@#^_?OY]_7S\>_N[.KIY^;E MY./CXN+BX^/DY>7GZ.GK[>[P\?/T]O?X^?O\_?[__P`!`@,$!08'!P@)"0D* M"@H+#`P-#0X.#@X/#PX.#@X.#@X.#@X-#0T-#0P,#`P,"PL*"@H)"`<%!`,! M`/[]^_KX]O3R\>_N[.OJZ>GHZ.CHZ.CHZ.CIZ>GJZ^SM[N_P\O/U]_CZ_/X` M`P4'"@P.$!(3%!46%Q@8&!@8&!@7%Q85%!,2$1`0#PX-#`L*"0<&!00#`@$` M__[^_?S\^_OZ^OGY^?GY^?GY^?GY^?GY^/CX]_?W]O;U]?3T\_/R\O+R\O+R M\O+R\_/T]?;W^/GZ^_W^_P$"`P0&!PD*#`T.$!$2$Q05%A<7&!@9&1D8&!<7 M%A43$A$/#0P*"`8$`@#^_/KX]_7T\O'P[^[M[.OKZNKJZNKJZ^OL[>WN[_#Q M\O/T]O?X^OO\_?\``0$"`P,$!`4%!04&!@8%!04%!04%!@8&!P<'!P@("`@) M"0H*"@L+"PL+#`P,#`P,#`P,#`P+"PH*"0@'!@4$`@'__OW[^?CV]?3R\?#O M[NWLZ^KJZ>GIZ>GJZNOL[>[O\/+S]/;W^?K\_O\!`P4&"`H+#`X/$!`1$A,3 M$Q,3$Q,3$A(1$!`/#@T-#`L*"0@'!@4$`P,"`0$`___^_?W\_/S\^_O[^_O[ M^_O[^OKZ^OKZ^?GY^/CX]_?V]O7U]?3T]/3T\_/S]/3T]/7V]O?X^?GZ^_W^ M_P`"`P0&!P@*"PP-#@\0$1(2$Q,4%!04%!,3$Q(1$`\.#0L*"`<%!`(!__[\ M^_KX]_;U]//S\O+Q\?#P\/#P\/'Q\?'R\O/T]/7V]_CY^OO\_?[__P```0$! M`@("`P,#`P,#`P,#`P,#`P,$!`0%!04&!@8'!P@("`D)"@H*"@H*"@H*"PL+ M"PL+"@H*"0D(!P8%!`,"`?_^_?OZ^??V]?3S\O'P\._O[^[N[N[O[^_P\?+S M]/7V]_CY^_S]_@`!`@0%!@<("@L,#`T.#@\/$!`0$!`/#PX-#0P+"@D)"`<& M!04$`P(!`0``_____O[^_OW]_?W]_/S\_/S\_/S\^_O[^_O[^_OZ^OKZ^OGY M^?GX^/CW]_?W]O;V]O;V]O?W]_CY^OO[_/W^_P$"`P0%!@<("0H+#`P-#@X/ M#P\0$!`0$`\/#PX.#0P+"PH(!P8%!`(!__[\^_KX]_;U]/3S\O+R\?'Q\?'R M\O/S]/7U]O?X^/GZ^OO\_/W^_O__```!`0("`@,#`P,#!`0$!`0$`P,#`P0$ M!`0$!`0$!`0$!04%!@8&!P<("`@)"0D)"0D)"0D("`@'!@8%!`0#`@(!`/_^ M_?S[^OGX^/?V]?3T\_/R\O+Q\?'Q\O+R\_3U]O?X^?K\_?[_``(#!`4'"`D) M"@L+#`P,#0T-#0T-#0P,"PL*"@D("`<&!@4$`P(!`0#__O[]_?S\_/O[^_O[ M^_O[^_O\_/S]_?W]_?W]_?[]_?W]_?W]_/S\_/S[^_O[^_KZ^OKZ^OKZ^OK[ M^_O[_/S]_?[__P`!`@,$!08&!P@)"@H+#`P-#0T-#@X-#0T,#`L*"0D(!P8% M`P(!`/_^_?S[^?CW]_;U]?3T\_/S\O+R\O/S\_3U]?;W^/GZ^OO\_?[_``$" M`@,$!`4%!@8&!@8'!P<'!P8&!@4%!04$!`0$!`0#`P,#`P("`@("`@("`@(" M`P,#`P,#`P0$!`0$!`0$`P,#`@(!`0#___[^_?S\^_KY^?CX]_?V]O7U]?7U M]?7U]O;W^/CY^OO\_?[_``$"`P0%!@<("0H*"PL,#`T-#0T-#0T,#`P+"@H) M"`<&!00#`P(!`/_^_?S[^OKY^?GX^/CX^/CX^/CX^/GY^?KZ^_O\_/S]_?W^ M_O[___\```````#__________________O[^_O_______P````$!`@(#`P0$ M!04&!@<'!P@("`@("`@("`@(!P<&!@4$`P,"`0#__O[]_/OZ^?CW]_;V]?7U M]/3T]/3T]?7V]O?X^?GZ^_S]_O\``0(#!`4&!@<'"`@)"0D)"0D)"0D)"0@( M"`<&!@4%!`0#`P(!`0``___^_O[^_?W]_?W]_?W]_?W^_O[^______\````` M``````````#_______[^_O[]_?W]_?W]_?W]_?W]_?[^_O__`````0("`P,$ M!`4&!@<'!P@("0D)"0D)"0D("`@'!P8&!00#`@$`___^_?S\^_KZ^?CX]_?V M]O;V]O;V]O;V]_?W^/GY^OO[_/W^_O\``0$"`P,$!`4%!04%!@8&!04%!04% M!00$!`,#`P("`@$!`0$!`0````````````````````````````$!`0$!```` M````_____O[^_?W]_/S[^_OZ^OKY^?GY^?GY^?KZ^OO[^_S\_?W^__\``0$" M`@,$!`4&!@<'"`@("0D)"0D)"`@("`<'!@8%!`0#`@$``/_^_OW\_/O[^OKZ M^?GY^?GY^?GY^OKZ^OO[_/S]_?[^__\```$!`@(#`P,$!`0$!`0$!`0$!`0$ M`P,#`P("`@("`0$!`0$!`0$!`0$!`0$!`0("`@("`@("`@("`@("`@("`@$! M`0$!````___^_OW]_/S\^_O[^_KZ^OKZ^?GY^OKZ^OO[_/S]_?[^__\``0(" M`P0$!04&!@8'!P<("`@("`@'!P<'!@8&!04$!`,"`@$``/_^_OW]_/S[^_OZ M^OKZ^OKZ^OKZ^OK[^_O[_/S\_?W^_O[___\``````0$!`0$!`0$"`@(!`0(! M`0$!`0$!`0$!`0$!`0$!`0$!`@("`@,#`P,#!`0$!`0$!`0$!`0$`P,#`P(" M`0$!``#___[^_?S\^_OZ^OKY^?GY^?GX^/CX^/GY^?KZ^_O\_/W]_O__``$" M`@,$!`4%!@8'!P<("`@("`@("`<'!P8&!@4%!`0#`P("`0``_____O[]_?W\ M_/S\_/O[^_O[^_O[^_S\_/S]_?W]_?[^_O[^________________________ M__________\```````$!`0$"`@(#`P,$!`0%!04%!04%!04%!04%!00$`P," M`@$!``#__O[]_?S[^_KZ^?GX^/CX]_?W]_?W^/CX^/GY^OK[^_S]_?[__P`! M`0(#`P0%!08&!P<'"`@("`@("`@("`<'!P<&!@4%!00$`P,"`@$!``#____^ M_O[^_?W]_?W]_?W]_/S\_/S]_?W]_?W]_?W]_?W]_?W]_?W]_?W]_?W]_?W] M_?W^_O[^_O___P```0$"`@,#!`0%!04&!@<'"`@("`@)"0D("`@("`<'!@8& M!00$`P(!`0#___[]_?S[^_KZ^?GX^/CX]_?W]_CX^/CX^?GY^OK[^_S\_?[^ M__\``0$"`@,#`P0$!04%!08&!@8&!@8&!@8%!04$!`0$`P,#`@("`@$!`0`` M````_____________O[^_O[^_?W]_?W]_?S\_/S[^_O[^_O[^_KZ^OKZ^OKZ M^_O[^_S\_/W]_?[^_P```0$"`P,$!`4&!@<'!P@("`D)"0D)"0D)"`@(!P<& M!@4$!`,#`@$``/_^_?W\_/OZ^OGY^/CX]_?W]_?W]_?W^/CX^?GY^OK[^_S\ M_?[^__\```$!`@(#`P,$!`0$!04%!04%!04%!04%!04%!00$!`0$!`0$!`,# M`P,#`P("`@("`@("`0$!`0``_____O[^_?W]_/S[^_OZ^OKY^?GY^?GX^/CX M^?GY^?KZ^OO[_/S]_?[^_P```0("`P0$!08&!P<("`@)"0D)"0D)"0D)"`@( M!P8&!04$`P,"`0$`__[^_?S\^_OZ^OGY^?CX^/CX^/CX^/CY^?GY^OK[^_O\ M_/W]_O[__P```0$"`@(#`P,$!`0$!04%!04%!04%!04%!04%!04%!04%!00$ M!`0$!`,#`P,"`@(!`0$!``#____^_O[]_?S\^_O[^OKZ^?GY^?GX^/CX^/CX M^/GY^?KZ^OO[_/S]_O[_```!`@(#!`0%!08'!P@("0D)"0H*"@H*"@D)"0D( M"`<'!@4%!`,#`@$!`/_^_OW\_/OZ^OKY^?CX^/CX]_?W^/CX^/CY^?GY^OKZ M^_O\_/W]_?[^__\````!`0("`@,#`P,$!`0$!`4%!04%!04%!04%!04%!04% M!04%!04$!`0$`P,"`@(!`0``___^_OW]_/S[^_KZ^?GY^/CX^/?W]_?W]_?W M]_?X^/CY^?KZ^_O\_?W^_P`!`0(#!`0%!@8'!P@("0D)"@H*"@H*"@H)"0D) M"`@'!@8%!`0#`@(!`/___OW]_/O[^OKY^?GX^/CX^/CX^/CX^/CX^/GY^?KZ M^OO[^_S\_/W]_O[___\```$!`@(#`P,$!`0%!08&!@8'!P<'!P@("`@("`@( M"`@'!P<'!@8&!04$!`,#`@(!``#___[]_?S[^_KZ^?GX^/?W]_;V]O;V]O;V M]O;V]_?X^/GY^OO[_/W]_O\``0$"`P0%!08'!P@)"0H*"@H+"PL+"@H*"@H) M"0@(!P<&!04$`P,"`0``__[^_?S\^_OZ^OGY^?CX^/CW]_?W]_?W]_?X^/CX M^?GY^OKZ^_O\_/S]_?[^__\```$!`@(#`P0$!04%!@8'!P<'"`@("`@("0D) M"`@("`@'!P<&!@4%!`0#`P(!``#__OW]_/O[^OGY^/?W]O;U]?7T]/3T]/3T M]/7U]?;V]_?X^?KZ^_S]_O\``0("`P0%!@<'"`D)"@H+"PP,#`P,#`P,"PL+ M"@H)"`@'!@8%!`,#`@$``/_^_?W\^_OZ^?GX^/CW]_;V]O;V]O;V]O;V]O?W M]_?X^/GY^OK[^_S\_?W^_O\```$!`@,#!`0%!08&!P<("`D)"0D*"@H*"@H* M"@H*"@H)"0D("`<&!@4$`P,"`0#__OW]_/OZ^?GX]_;V]?3T\_/S\_+R\O+S M\_/S]/3U]?;W^/CY^OO\_?[_``$"`P0%!@<'"`D*"@L,#`P-#0T-#0T-#0T, M#`L+"@H)"`<'!@4$!`,"`0#__O[]_/O[^OGY^/CW]_;V]O7U]?7U]?7U]?7U M]?;V]O?W^/CY^?KZ^_S\_?[^_P`!`0(#!`0%!@<'"`D)"@H+"PP,#`P-#0T- M#0T-#`P,"PL*"0D(!P8%!`0#`@$`__[]_/OZ^?CW]O7U]//S\O+R\?'Q\?'Q M\?'R\O/S]/7U]O?X^?K[_/W^_P`!`@,$!08'"`D*"PL,#0T.#@X.#@X.#@X. M#0T-#`L+"@D("`<&!00#`@$`__[]_/OZ^OGX]_?V]?7T]/3S\_+R\O+R\O+R M\O/S\_3T]/7V]O?X^/GZ^_S]_?[_``$"`P0%!@<("0H*"PP,#0T.#@X/#P\/ M#P\/#@X-#0P,"PH)"`<&!00#`@'__OW\^_GX]_;U]//R\?'P\._O[N[N[N[N M[N_O[_#Q\O+S]/7V]_CY^_S]_@`!`@0%!@<)"@L,#0T.#Q`0$1$2$A(2$A$1 M$1`0#P\.#0P+"@D(!P8%!`,!`/_^_?S[^OGX]_;U]//S\O'Q\/#P\._O[^_O M\/#P\?'R\O/T]/7V]_CY^OO\_?\``0(#!08'"`D*"PP-#@\0$1$2$A(3$Q,3 M$Q,2$A$1$`\/#@T+"@D(!P4$`@'__OW[^OCW]O7S\O'P[^[N[>SLZ^OKZ^OK MZ^SL[>WN[_#Q\O/T]??X^?O\_?\``@,%!@@)"@P-#@\0$1(2$Q04%!05%144 M%!03$A(1$`\.#0P+"@@'!@0#`@#__?S[^?CW]O7S\O'P[^_N[>WL[.OKZ^OK MZ^OK[.SM[>[O[_#Q\O3U]O?Y^OS]_P`"`P4&"`D*#`T/$!$2$Q05%186%Q<7 M%Q<7%A85%103$A$/#@T+"@@&!0,!`/[\^OGW]O3S\?#O[NWLZ^KIZ.CHY^?G MY^CHZ>GJZ^OM[N_P\?/T]O?Y^_S^``$#!`8("0L,#0\0$1(3%!46%A<7%Q<8 M%Q<7%A85%103$A$/#@T+"@D'!00"`?_]_/KY]_;U\_+Q\.[M[>SKZNKIZ>CH MZ.CHZ.CIZ>KJZ^SM[N_P\O/T]O?Y^_S^``$#!0<("@P-#Q`2$Q06%Q@8&1H: M&AL;&QH:&AD8%Q85%!,1#PX,"@@'!0,!__W[^??V]/+Q[^[LZ^KIZ.?FYN7E MY>3DY>7EYN;GZ.GJZ^WN[_'S]/;X^?O]_P`"!`8'"0L,#A`1$A05%A<8&1D: M&QL;&QL;&AH9&!@7%A03$A`/#0L*"`8$`P'__?OY^/;T\_'P[^WLZ^KIZ.?F MYN7EY>7EY>7EYN?GZ.GJZ^SN[_'R]/;W^?O]_P$#!08("@P.$!$3%187&1H; M'!P='1T>'1T='!P;&AD8%A43$A`.#`H(!@0"`/[[^?CV]/+P[^WLZNGHY^;E MY>3DY./CX^3DY>7FY^CIZNOL[N_Q\O3V]_G[_?\``@0&"`D+#0X0$A,4%A<8 M&1D:&QL;&QL;&QL:&AD8%Q84$Q(0#@T+"0<%`P'__?OZ^/;T\_'O[NSKZNGH MY^;EY.3DX^/CX^/DY.7FYN?IZNOL[O#Q\_7V^/K\_@`"!`8("@P.$!(3%1<8 M&1H;'!T='AX>'AT='!P;&AD8%A43$1`.#`H(!@0!__W[^??U]/+P[^WLZ^GH MY^?FY>7DY.3DY.3EY>;FY^CIZNOM[N_Q\_3V]_G[_?X``@0%!PD+#0X0$1,4 M%A<8&1H;&QP<'!P<'!P;&QH9&!<6%!,1$`X,"@D'!0,!__W[^??U\_+P[^WL MZ^GHY^?FY>7DY.3DY.3EY>;FY^CIZNSM[_#R\_7W^?O]_@`"!`8("@P.$!$3 M%!87&1H;&QP='1T='1T<'!L:&1@7%A03$0\-"PH(!@0"`/[\^OCV]/+Q[^[M MZ^KIZ.?GYN;EY>7EY>7FYN?GZ.GJZ^SM[_#R\_7V^/G[_?\``@0%!PD*#`X/ M$1(3%187&!D9&AH:&QL;&AH9&1@7%A44$A$0#@P+"0<%`P'__?OY^/;T\_'O M[NWKZNGHZ.?FYN7EY>7EYN;FY^CIZ>KL[>[P\?+T]O?Y^_S^``(#!0<)"@P. M#Q$2%!46%Q@9&AH;&QL;&QH:&1D8%Q84$Q(0#@T+"0<%!`(`_OSZ^/?U\_+Q M[^[M[.OJZ>GHZ.?GY^?GY^?HZ.GJZ^SM[N_P\?/T]??X^OO]_@`"`P4&"`H+ M#0X0$1(4%186%Q@8&1D9&1D9&!@7%A44$Q(1#PX,"PD'!00"`/[\^_GW]O3S M\?#O[>SKZNKIZ.CGY^?GY^?GZ.CIZNOL[>[O\/+S]?;X^?O]_@`"`P4'"`H, M#0X0$1(4%186%Q@8&!D9&1@8%Q<6%103$A$0#@T,"@@'!0,"`/[]^_KX]_7T M\_'P[^[M[>SKZ^KJZNKJZNKJZNOK[.WN[_#Q\O/T]??X^?O\_O\``@,%!@@) M"PP.#Q`1$A,4%187%Q<8&!@8%Q<6%A44$Q(1$`\-#`H(!P4#`0#^_/OY]_;T M\_+P[^[M[.SKZNKIZ>GIZ>GIZNKKZ^SM[N_P\?+T]?;X^?O\_O\!`P0&!PD* M"PT.#Q$2$Q04%186%Q<7%Q<6%A85%!03$A$/#@T+"@@'!00"`/_]^_KY]_;T M\_+Q\._N[>WL[.OKZ^KJZNOKZ^OL[.WN[_#Q\O/T]?;W^?K[_?[_`0($!08( M"0H,#0X/$!$2$Q04%146%A86%A45%!03$A$0#PX-"PH)!P8$`@'__?SZ^/?V M]//R\._N[>WLZ^OJZNKJZ>KJZNKK[.SM[N_P\?+S]?;W^?K[_?X``0,$!@<( M"@L,#@\0$1(3$Q05%146%A86%144%!,2$A$0#PT,"PD(!P4#`@#__?SZ^?CV M]?3S\O'P[^_N[>WM[.SL[.SL[.WM[N[O\/#Q\O/T]?;X^?K[_/[_``(#!`8' M"`H+#`T.#Q`1$A(3$Q04%145%104%!,3$A$0#PX-#`L)"`8%`P(!__[\^_GX M]_7T\_+Q\._N[NWM[.SL[.SL[.SM[>[N[_#P\?+S]?;W^/G[_/W^``$"!`4& M"`D*"PP-#@\0$1(3$Q,4%!04%!04$Q,2$1$0#PX-#`H)"`8%!`(!__[]^_KX M]_;U]//R\?#O[^[N[>WM[>WM[>WM[N[O[_#Q\?+S]/7V]_GZ^_S]_P`!`P0% M!@@)"@L,#0X/$!$1$A(3$Q,4%!,3$Q,2$A$0#PX-#`L*"0@&!0,"`?_^_/OZ M^/?V]?3S\O'P[^_N[NWM[>WL[>WM[>[N[^_P\?+S]/7V]_CY^OS]_O\!`@,$ M!@<("0H+#`T.#P\0$1$2$A(2$Q,2$A(2$1$0#P\.#0P+"@D'!@4#`@'__OW[ M^OGX]O7T\_+Q\?#O[^[N[>WM[>WM[>WN[N_O\/'Q\O/T]?;W^/K[_/W^``$" M`P4&!P@)"@P-#@\/$!$1$A(3$Q,3$Q,3$Q(2$1`0#PX-#`H)"`8%!`(!`/[] M^_KY]_;U]//R\?#P[^_N[NWM[>WM[>WN[N_O\/#Q\O/T]?;W^/GZ^_W^_P`! M`@0%!@<("0H+#`T.#P\0$1$1$A(2$A(2$A(1$1`0#PX-#`L*"0@'!@4#`@'_ M_OW\^_GX]_;U]//S\O'Q\/#O[^_O[N[O[^_O\/#Q\?+S\_3U]O?X^?K[_/W_ M``$"`P0&!P@)"@L,#0X/#Q`1$1(2$A(2$A(2$A$1$`\/#@T,"PH)"`8%!`(! M`/[]_/OY^/?V]?3S\O'Q\/#O[^[N[N[N[N[O[_#P\?'R\_3T]?;W^/GZ^_S^ M_P`!`@,$!08'"`D*"PP-#@X/#Q`0$1$1$1$1$1$0$`\/#@T,#`L*"0<&!00# M`0#__OW[^OGX]_;U]//R\O'Q\/#O[^_O[^_O[^_P\/'Q\O+S]/3U]O?X^?K[ M_/W^_P$"`P0%!@<("0H+#`T.#@\0$!$1$1$1$1$1$!`0#PX.#0P+"@D(!P8$ M`P(!`/[]_/OZ^?CW]O7T\_+R\?'P\/#O[^_O[_#P\/#Q\?+S\_3U]O;W^/GZ M^_S]_O\``0($!08'"`D*"@L,#0T.#P\0$!`0$1$1$!`0$`\/#@T-#`L*"0@' M!@4$`P$`__[]^_KY^/?V]?3T\_+Q\?#P\/#O[^_O\/#P\/'Q\O/S]/7V]_?X M^?K[_?[_``$"`P0%!@<("0H+#`T.#@\/$!`0$1$1$1$0$!`/#PX-#0P+"@D( M!P8%`P(!`/_]_/OZ^?CW]O7T]//R\O'Q\?#P\/#P\/#Q\?'R\O/S]/7U]O?X M^?K[_/W^_P`!`@,$!08&!P@)"@L,#`T-#@X/#P\/#P\/#P\/#@X.#0P,"PH) M"`<&!00#`@$`__[]^_KY^/?W]O7T\_/R\O'Q\?#P\/#P\/'Q\?+R\_/T]?7V M]_CY^OO[_?[_``$"`P0%!@<("0D*"PP-#0X.#P\/#Q`0$`\/#P\.#@T,#`L* M"0@'!@4$`P(!`/[]_/OZ^?CW]O7U]//S\O+Q\?'Q\?#P\?'Q\?+R\O/T]/7V M]O?X^?K[_/W^_P`!`@,$!`4&!P@)"@L+#`P-#0X.#@\/#P\/#PX.#@T-#`P+ M"@D(!P8%!`,"`0#__OW\^_KY^/?V]?3T\_+R\O'Q\?'P\/'Q\?'Q\O+S]/3U M]O;W^/GZ^_S]_O\``0(#!`4&!P<("0H+"PP-#0X.#@\/#P\/#P\.#@X-#0P, M"PH)"`@'!@4$`@$`__[]_/OZ^?CW]O;U]/3S\_+R\O'Q\?'Q\?+R\O/S]/3U M]?;W]_CY^OO\_?[^_P`!`@,$!08'"`D*"@L,#`T.#@X/#P\/#P\/#P\.#@T- M#`L+"@D(!P8%!`,"`0#^_?S[^OGX]_?V]?3T\_+R\O'Q\?'Q\?'Q\O+R\_/T M]?7V]_CX^?K[_/W^_P`!`@,$!`4&!P@)"@H+#`P-#0X.#@X/#P\.#@X.#0T, M#`L*"@D(!P8%!`,"`0#__OW\^_KY^/?V]O7T]//S\O+R\O+Q\?'R\O+R\_/T M]/7U]O?W^/GZ^_S\_?[_``$"`P0%!@<'"`D*"@L,#`T-#0X.#@X.#@X-#0T, M#`L+"@D("`<&!00#`@$`__[]_/OZ^?CW]_;U]?3S\_/R\O+R\O+R\O+S\_/T M]/7U]O?W^/GZ^_S\_?[_``$"`P0$!08'"`@)"@H+"PP,#`T-#0T-#0T-#`P, M"PL*"@D(!P<&!00#`@$`__[^_?S[^OGX^/?V]O7U]/3T\_/S\_/S\_/T]/3U M]?;V]_?X^?GZ^_S\_?[_``$!`@,$!04&!P@("0H*"PL,#`P,#`T-#0T,#`P, M"PL*"@D("`<&!00#`P(!`/_^_?S[^OKY^/?W]O;U]?3T]/3T\_3T]/3T]/7U M]O;W]_CY^?K[^_S]_O__``$"`@,$!04&!P<("0D*"@H+"PL+"PP,#`L+"PL* M"@H)"0@'!P8%!00#`@(!`/_^_?W\^_KZ^?CX]_?V]O7U]?7U]/3U]?7U]?7V M]O?W^/CY^?K[^_S]_?[_```!`@,#!`4&!@<'"`@)"0H*"@L+"PL+"PL+"@H* M"0D)"`@'!@8%!`0#`@$!`/_^_?W\^_OZ^?GX^/?W]O;V]?7U]?7U]?7U]O;V M]_?X^/GY^OK[_/S]_O[_```!`@,#!`4%!@8'!P@("`D)"0D)"@H*"0D)"0D) M"`@'!P8&!04$!`,"`@$``/_^_OW\_/OZ^OGY^/CW]_?V]O;V]O;V]O;V]O?W M]_CX^/GY^OK[_/S]_?[__P`!`0(#`P0$!04&!@<'"`@("0D)"0D)"0D)"0D) M"`@(!P<&!@4%!`,#`@$!`/___OW\_/O[^OKY^?CX]_?W]_;V]O;V]O?W]_?X M^/CY^?KZ^_O\_/W]_O__``$!`@(#!`0%!08&!P<'"`@("`D)"0D)"0@("`@( M!P<'!@8%!00$`P,"`@$``/___O[]_/S[^_OZ^OGY^?CX^/CX^/CX^/CX^/CY M^?GZ^OO[^_S\_?W^_O\```$!`@(#`P0$!04&!@8'!P<'"`@("`@("`@(!P<' M!P8&!@4%!`0#`P("`0$``/___OW]_/S[^_OZ^OGY^?GX^/CX^/CX^/CX^?GY M^?KZ^OO[_/S]_?[^__\```$"`@,#!`0%!04&!@8'!P<'!P<("`<'!P<'!P8& M!@4%!00$`P,"`@$!``#___[]_?S\^_O[^OKZ^?GY^/CX^/CX^/CX^/CY^?GY M^OKZ^_O\_/W]_O[__P```0$"`@,#!`0%!08&!@<'!P<'!P<'!P<'!P<'!@8& M!04%!`0#`P("`0$``/_^_OW]_/S[^_OZ^OGY^?GX^/CX^/CX^/CX^/GY^?GZ M^OO[^_S\_?W^_O__```!`0("`P,$!`4%!@8&!P<'!P<("`@("`@'!P<'!P8& M!@4%!`0#`P("`0$``/_^_OW]_/S[^_OZ^OGY^?GX^/CX^/CX^/CX^/CY^?GZ M^OK[^_S\_?W^_O__```!`0(#`P0$!04%!@8'!P<'"`@("`@("`@("`@'!P<& M!@8%!00$`P,"`@$!``#__O[]_?S\^_O[^OKY^?GX^/CX^/CX^/CX^/CY^?GZ M^OK[^_S\_?W^_O__```!`0("`P,$!`0%!08&!@<'!P<'!P<(!P<'!P<'!P8& M!@8%!00$!`,#`@(!`0``___^_OW]_/S[^_OZ^OKY^?GY^/CX^/CX^/CY^?GY M^?KZ^_O[_/S]_?[^__\```$!`@(#`P0$!04%!@8&!P<'!P<("`@("`<'!P<' M!@8&!04$!`0#`P(!`0``___^_?W\_/O[^_KZ^?GY^/CX^/CX^/CX^/CX^/GY M^?KZ^OO[_/S]_?[^__\```$!`@(#`P0$!04%!@8&!@<'!P<'!P<'!P<'!P8& M!@8%!00$!`,#`@(!`0``___^_OW]_/S[^_OZ^OKY^?GY^/CX^/CX^/CX^?GY M^?KZ^OO[_/S\_?W^_O__```!`0("`P,$!`4%!08&!@8'!P<'!P<'!P<'!P8& M!@8%!00$!`,#`@(!`0``___^_OW]_/S\^_OZ^OKZ^?GY^?GY^?GY^?GY^?GZ M^OK[^_O\_/W]_?[^__\```$!`@(#`P0$!04%!@8&!P<'!P<'!P<'!P<'!P<& M!@8%!04$!`,#`@(!`0``___^_OW]_/S\^_OZ^OKZ^?GY^?GY^?GY^?GY^?GZ M^OK[^_O\_/S]_?[^__\```$!`@(#`P0$!04%!@8&!P<'!P<'"`@'!P<'!P<& M!@8&!04$!`,#`@(!`0``___^_OW]_/S[^_OZ^OKY^?GY^?GX^/CX^?GY^?GZ M^OKZ^_O[_/S]_?[^__\```$!`@(#`P0$!`4%!@8&!@<'!P<'!P<'!P<'!@8& M!@4%!00$`P,#`@(!`0#___[^_?W]_/S[^_KZ^OGY^?GY^/CX^/CX^/CY^?GY M^?KZ^OO[_/S\_?W^_O__```!`0("`P,$!`4%!08&!@<'!P<'!P<'!P<'!P8& M!@8%!04$!`,#`@(!`0``___^_?W]_/S[^_KZ^OGY^?GY^?CX^/CX^/GY^?GY M^OKZ^_O\_/S]_?[^__\```$!`@(#`P,$!`4%!08&!@8'!P<'!P<'!P<'!@8& M!@4%!00$!`,#`@(!`0``___^_OW]_?S\^_O[^OKZ^?GY^?GY^?GY^?GY^?KZ M^OK[^_O\_/S]_?[^__\```$!`@(#`P0$!`4%!08&!@<'!P<'!P<'!P<'!P8& M!@8%!00$!`,#`@(!`0``___^_OW]_?S\^_O[^OKZ^OKY^?GY^?GY^?GY^OKZ M^OO[^_O\_/W]_?[^__\```$!`@(#`P,$!`4%!08&!@8&!P<'!P<'!P<&!@8& M!04%!00$`P,"`@$!`0``___^_OW]_?S\^_O[^_KZ^OKZ^?GY^?GY^?GZ^OKZ M^OO[^_S\_/W]_?[^__\```$!`0("`P,$!`0%!04&!@8&!@8'!P<&!@8&!@8& M!04%!`0$`P,"`@$!``#___[^_?W]_/S[^_OZ^OKZ^?GY^?GY^?GY^?GY^?KZ M^OK[^_O\_/S]_?[^____```!`0("`P,#!`0$!04%!@8&!@8&!@8&!@8&!@8& M!04%!`0$`P,#`@(!`0``___^_OW]_?S\^_O[^OKZ^OGY^?GY^?GY^?GY^?GY M^OKZ^_O[_/S\_?W^_O__```!`0("`@,#!`0$!04%!@8&!@8&!@<'!P8&!@8& M!@8%!04$!`0#`P("`0$```#___[^_?W\_/S[^_OZ^OKZ^OKY^?GY^?GY^OKZ M^OK[^_O[_/S]_?W^_O__`````0$"`@,#`P0$!04%!08&!@8&!@8&!@8&!@8& M!@4%!04$!`0#`P("`0$!``#___[^_OW]_/S\^_O[^_KZ^OKZ^OKZ^OKZ^OKZ M^OO[^_O\_/S]_?W^_O__`````0$"`@,#`P0$!`4%!04&!@8&!@8&!@8&!@8& M!04%!00$!`,#`P("`0$!``#___[^_OW]_?S\_/O[^_KZ^OKZ^OKZ^OKZ^OKZ M^OK[^_O[_/S\_?W]_O[__P````$!`@("`P,$!`0$!04%!04&!@8&!@8&!04% M!04%!`0$`P,#`@(!`0$``/____[^_?W]_/S\^_O[^_KZ^OKZ^OKZ^OKZ^OKZ M^OK[^_O\_/S]_?W^_O[__P```0$!`@("`P,$!`0$!04%!04%!08&!@4%!04% M!04$!`0$`P,#`@(!`0$``/____[^_OW]_?S\_/O[^_O[^OKZ^OKZ^OKZ^OKZ M^_O[^_O\_/S]_?W^_O[__P````$!`0("`P,#!`0$!`4%!04%!04%!04%!04% M!04$!`0$`P,#`@("`0$```#____^_O[]_?W\_/S\^_O[^_O[^OKZ^OKZ^_O[ M^_O[_/S\_/W]_?[^_O___P```0$!`@(#`P,$!`0$!04%!04%!04&!@8%!04% M!04%!`0$!`,#`P("`@$!````___^_O[]_?W\_/S\^_O[^_OZ^OKZ^OKZ^OO[ M^_O[^_S\_/S]_?W^_O[___\```$!`0("`@,#`P0$!`0%!04%!04%!04%!04% M!04%!`0$!`,#`P("`@$!`0``_____O[]_?W]_/S\^_O[^_O[^OKZ^OKZ^OO[ M^_O[^_O\_/S]_?W]_O[^__\````!`0$"`@(#`P,#!`0$!`0%!04%!04%!04% M!00$!`0$`P,#`P("`@$!`0``_____O[^_?W]_/S\_/O[^_O[^OKZ^OKZ^OKZ M^OK[^_O[^_S\_/W]_?[^_O___P```0$!`@(#`P,#!`0$!`4%!04%!04%!04% M!04%!`0$!`,#`P("`@$!`0``_____O[^_?W]_/S\^_O[^_O[^OKZ^OKZ^OKZ M^_O[^_O\_/S\_/W]_?[^____`````0$"`@(#`P,#!`0$!`4%!04%!04%!04% M!04%!04$!`0$`P,#`@("`0$```#____^_OW]_?W\_/S\^_O[^_O[^_KZ^OK[ M^_O[^_O[_/S\_/W]_?[^_O___P```0$!`@("`P,#!`0$!`4%!04%!04%!04% M!04%!04$!`0$`P,#`@("`0$!````_____O[]_?W]_/S\_/O[^_O[^_O[^_O[ M^_O[^_O\_/S\_/W]_?[^_O[___\````!`0("`@(#`P,$!`0$!`0%!04%!04% M!04%!04$!`0$`P,#`P("`@$!````_____O[^_?W]_/S\^_O[^_O[^OKZ^OKZ M^OKZ^_O[^_O\_/S\_?W]_O[^__\````!`0$"`@(#`P,$!`0$!04%!04%!04% M!04%!04$!`0$`P,#`P("`@$!````_____O[]_?W\_/S\^_O[^_KZ^OKZ^OKZ M^OKZ^OO[^_O[_/S\_?W]_O[^____`````0$!`@("`P,#`P0$!`0%!04%!04% M!04%!04%!`0$!`0#`P,"`@(!`0$``/____[^_OW]_?S\_/S[^_O[^_O[^OKZ M^OKZ^_O[^_O[_/S\_/W]_?[^_O___P````$!`@("`P,#`P0$!`0$!04%!04% M!04%!04%!00$!`0$`P,#`@("`0$!````___^_O[]_?W]_/S\_/O[^_O[^_O[ M^_O[^_O[^_O\_/S\_?W]_?[^_O___P````$!`0("`@,#`P0$!`0$!04%!04% M!04%!04%!00$!`0$`P,#`@("`0$!````_____O[^_?W]_/S\_/S[^_O[^_O[ M^_O[^_O[^_O\_/S\_/W]_?[^_O[__P````$!`0("`@(#`P,$!`0$!`4%!04% M!04%!04$!`0$!`0#`P,#`@("`0$!````_____O[^_?W]_?S\_/S[^_O[^_O[ M^_O[^_O[^_O[_/S\_/S]_?W]_O[^____`````0$!`@("`@,#`P,$!`0$!`0$ M!`4%!`0$!`0$!`0$`P,#`P("`@$!`0``_____O[^_?W]_/S\_/O[^_O[^_OZ M^OKZ^_O[^_O[^_O\_/S\_?W]_O[^____`````0$!`@("`@,#`P,$!`0$!`4% M!04%!04%!00$!`0$!`,#`P,"`@(!`0$```#___[^_OW]_?W\_/S\^_O[^_O[ M^_O[^_O[^_O[^_O\_/S\_?W]_?[^_O___P````$!`0("`@,#`P,$!`0$!`4% M!04%!04%!04%!`0$!`0$`P,#`P("`@$!`0``_____O[^_?W]_?S\_/S\^_O[ M^_O[^_O[^_O[^_S\_/S\_?W]_?[^_O___P````$!`0("`@,#`P,$!`0$!`0% M!04%!04%!04%!`0$!`0#`P,#`@("`0$!````_____O[^_?W]_?S\_/S[^_O[ M^_O[^_O[^_O[^_S\_/S\_/W]_?W^_O[___\````!`0$"`@(#`P,#!`0$!`0$ M!04%!04%!04%!00$!`0$!`,#`P("`@$!`0```/___O[^_?W]_/S\_/O[^_O[ M^_OZ^OKZ^_O[^_O[^_O\_/S\_/W]_?[^_O____\````!`0$"`@(#`P,#!`0$ M!`0$!04%!04%!04%!`0$!`0$`P,#`@("`0$!````___^_O[]_?W\_/S\^_O[ M^_O[^OKZ^OKZ^OK[^_O[^_O\_/S\_?W]_O[^____`````0$!`@("`P,#`P0$ M!`0$!04%!04%!04%!04%!`0$!`0#`P,"`@(!`0$``/____[^_OW]_?S\_/S[ M^_O[^_O[^_O[^_O[^_O[^_O\_/S\_?W]_?[^_O___P````$!`0("`@,#`P0$ M!`0$!04%!04%!04%!04%!04%!`0$!`,#`P("`@$!`0``_____O[^_?W]_/S\ M^_O[^_O[^_KZ^OKZ^OO[^_O[^_S\_/S]_?W^_O[___\````!`0$"`@(#`P,$ M!`0$!04%!04%!04%!04%!04%!04%!`0$!`,#`P("`0$!``#____^_OW]_?S\ M_/S[^_O[^_KZ^OKZ^OKZ^OK[^_O[^_S\_/W]_?W^_O[___\```$!`0("`@,# M`P,$!`0$!`4%!04%!04%!04%!04$!`0$!`,#`P("`@$!````___^_O[]_?W\ M_/S[^_O[^_OZ^OKZ^OKZ^OKZ^_O[^_O\_/S\_?W]_?[^_O___P```0$!`@(" M`@,#`P0$!`0$!04%!04%!04%!04%!`0$!`0#`P,"`@(!`0$``/____[^_OW] M_?S\_/O[^_O[^OKZ^OKZ^OKZ^OO[^_O[^_S\_/S]_?W^_O[___\````!`0$" M`@(#`P,#!`0$!`4%!04%!04%!04%!04%!`0$!`0#`P,"`@(!`0$``/____[^ M_OW]_?S\_/S[^_O[^_O[^_O[^_O[^_O[^_O\_/S\_?W]_?[^_O__`````0$! M`@("`P,#`P0$!`0%!04%!04%!04%!04%!04%!`0$!`,#`P("`@$!`0``____ M_O[^_?W]_/S\_/O[^_O[^_O[^_O[^_O[^_O[_/S\_/S]_?W^_O[___\````! M`0$"`@(#`P,#!`0$!`0%!04%!04%!04%!04%!00$!`0#`P,#`@("`0$```#_ M___^_O[]_?W\_/S\^_O[^_O[^_O[^_O[^_O[^_O[_/S\_/W]_?W^_O[___\` M```!`0$"`@("`P,#`P0$!`0$!04%!04%!04%!`0$!`0$`P,#`P("`@$!`0`` M_____O[^_?W]_/S\_/O[^_O[^_O[^OKZ^OO[^_O[^_O\_/S\_?W]_?[^_O__ M_P````$!`0("`@(#`P,#!`0$!`0$!04%!04%!00$!`0$!`,#`P,"`@(!`0$` M``#____^_O[]_?W\_/S\^_O[^_O[^_O[^_O[^_O[^_O[_/S\_/S]_?W^_O[_ M____`````0$!`@("`P,#`P0$!`0$!`4%!04%!04%!00$!`0$!`,#`P,"`@(! M`0$```#____^_O[]_?W]_/S\_/S[^_O[^_O[^_O[^_O[_/S\_/S]_?W]_O[^ M_O___P````$!`0$"`@(#`P,#`P0$!`0$!`4%!04%!04$!`0$!`0$`P,#`P(" M`@$!`0```/____[^_O[]_?W]_/S\_/S\_/O[^_O[^_O\_/S\_/S\_/W]_?W^ M_O[^____``````$!`0("`@(#`P,#`P0$!`0$!`0$!`0$!`0$!`0$!`0#`P,# M`@("`0$!````_____O[^_?W]_?S\_/S\_/O[^_O[^_O[^_O[^_S\_/S\_/W] M_?W^_O[^____``````$!`0$"`@("`P,#`P,$!`0$!`0$!`0$!`0$!`0#`P,# M`P("`@$!`0$```#____^_O[^_?W]_?S\_/S\_/O[^_O[^_O[^_O[_/S\_/S\ M_?W]_?W^_O[^____``````$!`0$"`@("`P,#`P,$!`0$!`0$!`0$!`0$!`,# M`P,#`@("`@$!`0$```#____^_O[^_?W]_?S\_/S\_/S\_/S\_/S\_/S\_/S\ M_/W]_?W]_O[^_O____\````!`0$!`@("`@(#`P,#`P,#!`0$!`0$!`0$`P,# M`P,#`P("`@("`0$!`0```/_____^_O[^_OW]_?W]_?W]_/S\_/S\_/S\_/W] M_?W]_?W]_O[^_O[_____``````$!`0$"`@("`@,#`P,#`P,$!`0$!`0$!`0$ M`P,#`P,#`P("`@(!`0$`````______[^_O[]_?W]_?W\_/S\_/S\_/S\_/S\ M_/W]_?W]_?[^_O[^_____P`````!`0$!`0("`@("`P,#`P,#`P,#`P,#`P,# M`P,#`P,"`@("`@$!`0$!`````/_____^_O[^_OW]_?W]_?W]_?W]_?S\_?W] M_?W]_?W]_?W]_O[^_O[^_____P```````0$!`0$"`@("`@("`P,#`P,#`P,# M`P,#`P,"`@("`@(!`0$!`0````#______O[^_O[]_?W]_?W]_?S\_/S\_/S\ M_/S]_?W]_?W]_?[^_O[^_O______```````!`0$!`0("`@("`@(#`P,#`P,# M`P,#`P,#`P("`@("`@(!`0$!`0````#_______[^_O[^_OW]_?W]_?W]_?W] M_?W]_?W]_?W]_?W]_O[^_O[^______\```````$!`0$!`@("`@("`@,#`P,# M`P,#`P,#`P,#`P,"`@("`@(!`0$!`0``````_______^_O[^_O[^_?W]_?W] M_?W]_?W]_?W]_?W^_O[^_O[^________`````````0$!`0$!`@("`@("`@(# M`P,#`P,#`P,#`P,#`@("`@("`@(!`0$!`0``````_______^_O[^_O[^_?W] M_?W]_?W]_?W]_?W]_?W]_?[^_O[^_O[_______\``````0$!`0$!`@("`@(" M`@(#`P,#`P,#`P,#`@("`@("`@(!`0$!`0``````_______^_O[^_O[]_?W] M_?W]_?W]_?W]_?W]_?W]_?W^_O[^_O[^_O_______P```````0$!`0$!`0(" M`@("`@("`@("`@("`@("`@("`@("`0$!`0$!``````#________^_O[^_O[^ M_?W]_?W]_?W]_?W]_?W]_?W]_?W]_O[^_O[^_O_______P```````0$!`0$! M`@("`@("`@("`@("`@("`@("`@("`@("`0$!`0$!````````_________O[^ M_O[^_O[^_O[^_?W]_?W]_?W]_?[^_O[^_O[^_O[_________`````````0$! M`0$!`@("`@("`@("`@("`@("`@("`@("`@("`@$!`0$!`0````````#_____ M_____O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^__________\````````` M`0$!`0$!`0$"`@("`@("`@("`@("`@("`@("`@$!`0$!`0$!`````````/__ M_________O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^____________```` M``````$!`0$!`0$!`@("`@("`@("`@("`@("`0$!`0$!`0$!``````````#_ M__________[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O________\` M``````````$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$````````` M``#______________O[^_O[^_O[^_O[^_O[^_O[^_O[^_O[^_O__________ M_P```````````0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$````` M````````_________________O[^_O[^_O[^_O[^_O[^_O______________ M_P`````````````!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$! M``````````````#____________________^_O[^_O[^________________ M____``````````````$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0`` M``````````#______________________O[^_O[^_O[^_O[^_O[_________ M________```````````````!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0`` M`````````````/________________[^_O[^_O[^_O[^_O[^_O[^_O[^_O__ M_____________P```````````````0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$! M`0$`````````````````______________________[^_O[^_O[^_O[^_O__ M_________________P````````````````$!`0$!`0$!`0$!`0$!`0$!`0$! M`0$!`0$!`0$`````````````````________________________________ M_________________P````````````````$!`0$!`0$!`0$!`0$!`0$!`0$! M`0$!`0$!`0$!`0$!``````````````````#_________________________ M________________________``````````````````````$!`0$!`0$!`0$! M`0$!`0$!`0$!`0$``````````````````````/______________________ M_____________________________P`````````````````````````````` M``````````````````````````````````#_________________________ M______________________________\````````````````````````````` M`````````````````````````````````````````/__________________ M____________________________```````````````````````````````` M`````0$!`0$!`0$!`0`!``````````````````````````````````#_____ M____________________________```````````````````````````````` M```````````````````````````````````````````````````````````` M______________________________\````````````````````````````` M`````````````````````````````````````````````````````````/__ M__________________________________________\````````````````` M````````````````````````````````0T]-30```!(``0``1H``"$`-K$0` M``````!-05)+`````@``24Y35````!0\``!_`'\``````````````````$%0 M4$P```&H4V0R80`"``````````````%````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M``````````````````````````````````````````"P```````````````` M``````````````````````````````````````````````````````!QV?P` M````````<````````````````````&```)VX````<=KD`'':4`!QVDC__P!Q MVA"J5:I5!`@```````D`(P````````````````!X````!``$``````!6_@#_ M__^``````0$@!E%5;FET@``"1Y0050C```)*DQ74E<````` M``$"1@8@T]B M:D1IT]B M:D1I'1R86QE M=BYC+F\@M@T@("`@("`@(")[3V)J1&ER?2)F:6QE2G/:WQ``````````````````````````````"!@6<2``!&3U)-``!$ M&D%)1D934TY$``!"'@`````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M_P````#_``#___[^``$#`_W]_OG[!@L%_??S^P``!P_X[/_\_@`&!__^[O@) M^?<*%/CF!OWL"Q0&\?+]^`'__@C[^`@#]_3Q^0L%_Q8$U><%_PXD!^OVY=0( M+`_]``#DT?8='`H.!N'=Y/`H(/@5!\_-!AL"%PSY^M#H&P'_(`O:]`SA^QWX M_A?PZP[YZ`@,]@H+ZO\"[``$_`L)Z/89[M\6$OD`_?X`Z>06)?'S#?3H[0,: M#O[]]^7P$__['/SJ_/CT!@SY`@OQ\PCX]@@&_O0`!/O\\PH*Z_H/!>OX%_;I M#A'W\?SY^0L`"!CQXO?\]`DD#/'ZY^#_"!,8$O'?^^GG&B@&]03WUND.&1?^ M^P#LXO8/%0[_\?<`Z/0;$?SW__OL^PD!_@<*[O(3]>WX!0'_"03W^/;Y"PCT``[PYPD(_@?^]/X#[_H9 M`?;]\_[]^`L0^.P(`-\,&/H$`?'R`OK[%0GP_?_U^/@3$NOX%/S>_ACW^`[Z M_OSU`O__`@3Z^P;O_!#L^A[^Y`P0WO@7^?L,_/?Z\0`._/D1_.\)_NX&"/0` M!OG\"/?U#/_W`04&^/8$__/W#0CZ"/SR`_KN"A[_Y_\(\?+\$QKUZ?\-].D. M&@7OZ0H&Z/H?&>7J#OON`Q(.]?$#]_0)%`#P!_OO!OP'%_CL`PCC^R3^^0CV M\_OU"!O]\!(`UP@8Z_P7`>__!03\Y@0D\.0?&.+C!@L&]?HH"X3$O\#]NT"!/P,$??U_>_\#00%"OOQ`/SS"Q($^O/X_/?[%Q;Q^`#O M]`@/$`CNZ0;^Y0XI!^SQ`/;R"!$/`?#R]O[_!A<&]OCU]P(%!@L&[_4([_L; M_NL*#._T#@/Z"OCW#/7L!!0*]OD#^?;[#`_W\04%]?@/#.?W%?_X!O[Q^P?[ M"QGO[@/S]`\4^_D&]>S^"1`"]`4'\>8%&`#S"`_Q[/L$#@;U`0_TX0L4[_P1 M_O,'__,#`OC]#@7_^?#^`/P*$`'X]_GS`@_\"0SKZ`<,[@,E^N@%_N;T'1'^ M!O?S\.L+)@WS^@3TX/T/#Q7S^0GCYA`B_/06_-GR%@CT^@X&^`+[^_;M`QP/ MZ_L'X>8/'PS]^_/V[/4=$0'\_.OH"`$%$`C\[/O[ZPT8_/H,^=_^#/8&&/GM M"OOL`P3Y!!'_]@'R]0+S$"+TX@0%XOP;&P4#!_OGU?\N"?@7!^+;^@\)#A$-\MON_OX0&@\$Z]_U M`?X-(`SP]O+G^`@4$P#]`>G9`QT#`A((\.+L`A,#!QWYY>[U`0L6!0<$V.@' M!0\*#`+PZN@+$08+``'\Y.T/$P`!"_CC]@L)`P`6"-7N$`CT`!H"[N?^&??M M%![NW!(0X?47&>_G"0?XZP<;^.D#%/KC!"("V/TJ^OV M(2_TU?P%XO@D%@7YVO`.\_!.'V^]H+.P;M`O+B``X* M)0K5XP'Z`R8=`?#@W?$8*!L(\.?6YPP>-17KY>K@Z2 M[M'[#`D:`>P,!-CN(`SX"07T]_?U#@?X"P7O]P7W_Q<%]0+][_C_!A4%\OC[ M_OX`_@T/ZO0&`OOX`@L*]?P,\NT)!OP0!?#^^.T(%O?Z%?CR`OC\!0`*&?': M"P7>!"D2]^_N_O_N#RK^YOWXZP`)#!/\]@#MZQ`6]@L.XO'\]@\9_/45\M$+ M&0,#`0'UZ^T0&O@&"NOM!0+]#Q'XZOH&]O84#O`"">CW#_O]&?WE"O_D"!7X M!`CK_@CO^Q[[Z1?ZY@P+\OL5^?0-]/L,^/<("?/[#/KS`@W^\P4)\_D0_?<$ M`_CZ"/T"`_7__O\"`@`$">SQ#@3V"!+P]`+P]10:^/P'[./\%`H,#_;F[/S_ M"B`3^.CN]_0&'"``W>O_^?<7)`SMX?`"!/X;(.[C^_3K#",-!@#CZ/CY#BX/ M[_SFU/HD&Q$+]>_>X!$F#@4*\MOR_@4;$P+X]^_M`Q$1`OL&]>K\"`P'_?<' M!>O[$P3Z_?H""OOV#`3L``O^!@SX]O_X_`L*_P7YZ0,+^086!^KR`_4&#@(' M`?;E_18$"0'_`^_K_QX'\@L"]O?W``\-]0`/^>GZ"PK^^Q`)Z?$&!``*!?D' M^>\!!`8'_?P*_.@!$_H"$//U"?7M$AOY\P;^]/<#%@CU]P``^/H+%P+M^PS[ M]``)#_OM!0WR]18%\P@"]``'^`$*[_X2]O49"=X`$_/X%!'X].[S$`7_%1#N MX0,"_P\("O_MY_T5^00@`.7Q!/W_%0D``^SH!1(``!``[/3^!A`!_`GXZ?T1 M__L4_^T"_/0#$`H``?'V!/D!$`OZ\?D``_\!$@'N^O\$`OT!`__U_P7]"/_X M#`3N^0S]^`X!^P?T\`P&]PP0\_`!^?H)"0\%[/L`[OH8$?H&^>;Y_@09$?[] M\N3Z#0D4$O#U]MP%+@;R&PC(Z1$($@T``/;=\1T/!1+ZZO?U]10;_/C^[^X, M#@H0`.OF`@G^#Q7^Y^S[`Q(2!PKWVNL)"Q(5`?3W[>02(`@'_/;T]>\**?SI M"@?M[PX-!`3U_@;\]@(0__3[`@4'`/L#__;Y!PX(`//X!_CW#Q#_]P#Y]@<$ M!0[_]O?\__L,$@CY[?O^`08*%P;IY_\&]PT?"?+M]_4#$`\2_>KP_OP!&`SZ M`_OL^`P("0?U!`CCZ"(=YO\?^>?V`@8+`P`4]]L"#_C_&!'[]._T`O\&&P_X M]?+M]Q$9"P4#]^3K"`\+"@0#_NSK"0\"#`_Y\?CO_!0-!0H![/+^_PT2`?O_ M]/`"#@4""P3V\_X!_@L,!?OJ^@4!``H6]_/]_0KW\@H5!/$%_NSX!A,.!/SY M[NH'$`\,`OGR\.D.(@,("?#?\@X)#P\(!=O;#AC_""$`X^KM#1P!`!#ZV?@8 M`?\)!/OU``0)_?0&`/<&"__[!/[R^@P+`O[\`_KN^PL4`/T)]/#\!P4$#_;Q M!OKY#POY_`#S`A+W_!7VX?\/!@L,]/C_Y?P?#/P'_N'Z#_X($`'W^??X#`H` M!/GY`?T""PGY\OD"`P$2#_/H^0$`$@X'!.3=`Q@'#B#QV>_X`1[O!QH(`A'^WNH+#P4,%P#?Y0`+ M!`X:`^WL^`(##Q`&^NSV`P`!%!7NZ@D![@4?!/#[__KX!1,+]/<'^?`+$_[\ M!/SY^OP*#?SY"P#G^!(*^005_>+V#P#Z$Q/V[_GW_@@,%`GO\P#S\@X<#?GS M^_OH^"0@^O,`\>7_%!,*__;Q]/D'&1'Z\OWU[08;$/?Y]^[Y!1<5`_;O\>\# M&1@*^.[L]?X*(Q7U[_3N\!,="`'Y\._\"!$1`?3T]OH($PS]]O?R_!`4#/WR M[?+^#!X1^OCLXOH?%0GX^P<1$`OU[/,$"0,-"_SK\@@)!P@"__/M_Q(/`@C\Z/<&``L:!>_Q M]?H)"PD2_^;Q!0,%$@W\\_#V!PD)$`;S[?D#!`T-"/[O\/D("@41"_;I]@C_ M_P\4!?#S__SZ`1$3`??Y^_3U#A@*!/_VY^T($A$.#OO>Z04*"1@<^N'H]@(. M$Q$P3U[>GV#Q80!0'XY.L-%@8$!_WP\OX/%_[W M"?_I]A@+]@GL`PL-$@KY[^[V!1$1"OOO^/;T$1H&]_KZ M[O@,%Q'U]/WS]045%`/QZ_\`]0X=!_'R]O,#$!`)_O;L\PD/!PD*\>3Y"@P. M"OSV[^T#%Q8'^_+M\_P0&PP`]^CE`A8+$1CVVNS^`1$>#?KQX^X.$`P3"N[D M]OP)%0L%_.[L_PL+$@GR\OGQ_1D3_/[][?(&"PT1_?'Y^/(#&0O[`_SN]P<- M"`4`^OCS_PL'`P+^^?W__PP+^_P!^O<%!_\%!?SY`0(``P0!_P(`^?\'__@! M"@+^`P+_^?H#"`0!!?_V^?\#!@8(!?OV_`#Y!1`*_O?Y^OL`"A0']?C[_O\% M#`;]]_W^_@@$_P4$^OP$_/T-"/O^__;Z!04)#?[V^_OY!0X)!0'X\O3["Q4) M`@;WYO(("P\5`?/U[.\+&@T("O#E^``'$1,&]?3P]0,,%PK\^?7W^@@0"P/V M]/;_"@4*"??R_@+]$!+T]@/S]1(2_P8!ZO8%`A`4^_3\[_$)#Q04]^?X_/$+ M(0X#^>;G_@@)&Q;\Z^KT_`P5%`7S\>[T!0X4#/_S\?CY"1`*!OCT^/S]"!,$ M]_W]^OX$"@C\]/T$_O\&`P'^_/\"`/T"`OX"`O[^_P#]_04%_?T%`_/[#0;] M``7^]OC\"@_\_07_\_@'!@D(^_GY]OD"#1$*^^_Y^/4,%PS_^O'I]@0/&P[W M]OCKZA(C"/T']=SP"PT4%0+V\.?V$1$($`#F[?D`%!8$!?K<\1@&_!X.W.@" M^P08$P3[Y^<%"@44%_OAZ/T%"`\:"^OE\O\($1,&^//O\`(8$@`!^^_T``8/ M$OOS__CR"!<$_0+X]/H("08+_/7V_@7^"@H$_.[\!@0`!!#^\O?^!?\"#@CW M]0$`^@0.!_[[^_CY!0D&"0/[]_3Y"!,#`@_XXO4)!0H3"?KTZ_8."`D3!_#K M^/D&$PL*`/+P]`4+$`GY_?;R^PH6!_W_]O7]!0L-!O/Y`O'\%PW[`@'P^`<` M"1/^\OC]``$!"A+^[?T&^_\#!@H`\O@*`O,#$@?W^@?]]P`"!PD$]?L']_<* M#`@$^O+]`?@'%`C_^/+X_P,+%0;T^?7P`P\-#@CSZ?O__`\7"?GR[?('#PD. M#/7F[P$+#!`-^NWL^`$,&0\"\NGQ^@<1%PWX[^?S!0H3&0CL[?3P!!<4#@3O MY_;[`QH4`O_QX_4+"@\5`?'R[O<-%`X&^?#R]0`1$`WV`0D-"07[ M[N\`"PD-"?OT\?8%$`H%!/+L_08#"Q,!]/3X`@4'"0CZ[OT!_0@."/GV_`$! M^P80`?'U`@0`!0T$]O7_`P(*!OCU^@0'!`0$_/#Z"@L&!/[S]/L&#P<``?OQ M]@@."@3[^O;R_@\0!?_V]/G_"1`+_?3S]@0(!P\%\.S\!@4*"@7\[.\##@H& M!?[T\/H,#04$`//T`08)!0$`^??]!P8!`OOZ_P`$!0/]_OST`@\"_`'^^_O_ M"`P!^/W^^``)"`'Z^/S__`81`O/X`?O]"@@#_?7V``8#"`C]]OC]`0<(!/[W M]OL"!0@)_O?Z^_X'#0#Z_O3U!`H'!0#V]O_^`PT'^OCZ^/T%!@D#]_;\`0(% M!?_^^?@""`+\`/[Y_P<$``+^^?L`!@OU`P\3!OWX M\O+\#`\*`/?Z^/@%"P8!`/KW_@$"!@,`__O[``(``0/__@#^___^`@0!_@(! M^?L``@0%!`#[^/L``P<*`_CW^/L`!PP)__3V_?P!"PP"^/?Y_``%#0;W^?[[ M_`<+`?KZ^P`!`0<%_/7^!/\`!`/]^/P"`P(#`OSY_@(``0,"_/C^`P4!_P(! M^O8""P/^`/WY^OX#"@?\^_WY_04'!?_\^OP``08&_OS]_OT!!0(!_/D``?X" M!@'Z_0#\``0"`/W^____`0`````0`!````````/P`____@``` M``$!``9156YI=',````````````````````````````````````````!`@`& M('-A;7!S```````````````````````````````````````````````````` M````````````)P`O``__]O_Y``$````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````!`````7@```!X````5@`````` M````````````````````````````````````!$)E;&R!`@```$%)1D939#)A M`````````````!*L`````$%)1D939#)A```````````````````````````` M````ISVMY```1"(```'.``````````````````(E`/____X!,0`````````` M``````````````````````````````````$````````````````````````` M```````````````````````````````````````````````````````````` M`````````````````!H`*0`/`FH#,0`J``,";0,]`"D`#P)!`R(!`````!H` M*0`/`5`!\0`J``,";0,]`````````````````!H`+``6`3X!W``J``,";0,] M`````````````````!H``````````````````````````````````````0`` M``%X````>````%8`<;B\'*8````<`%8``%=S=&$``P`*``'__P`````````` M``+__P```!X```````/__P```#P```````3__P```%H````````````````` I```````````````````````````````````````````````````````` ` end slashem-0.0.7E7F3/sys/share/dgn_yacc.c0000664000076400007640000010231510545462317015511 0ustar aliali#ifndef lint static char const yyrcsid[] = "$FreeBSD: src/usr.bin/yacc/skeleton.c,v 1.28 2000/01/17 02:04:06 bde Exp $"; #endif #include #define YYBYACC 1 #define YYMAJOR 1 #define YYMINOR 9 #define YYLEX yylex() #define YYEMPTY -1 #define yyclearin (yychar=(YYEMPTY)) #define yyerrok (yyerrflag=0) #define YYRECOVERING() (yyerrflag!=0) static int yygrowstack(); #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. */ /* * This file contains the Dungeon Compiler code */ /* In case we're using bison in AIX. This definition must be * placed before any other C-language construct in the file * excluding comments and preprocessor directives (thanks IBM * for this wonderful feature...). * * Note: some cpps barf on this 'undefined control' (#pragma). * Addition of the leading space seems to prevent barfage for now, * and AIX will still see the directive in its non-standard locale. */ #ifdef _AIX #pragma alloca /* keep leading space! */ #endif #include "config.h" #include "date.h" #include "dgn_file.h" void FDECL(yyerror, (const char *)); void FDECL(yywarning, (const char *)); int NDECL(yylex); int NDECL(yyparse); int FDECL(getchain, (char *)); int NDECL(check_dungeon); int NDECL(check_branch); int NDECL(check_level); void NDECL(init_dungeon); void NDECL(init_branch); void NDECL(init_level); void NDECL(output_dgn); #define Free(ptr) free((genericptr_t)ptr) #ifdef AMIGA # undef printf #ifndef LATTICE # define memset(addr,val,len) setmem(addr,len,val) #endif #endif #define ERR (-1) static struct couple couple; static struct tmpdungeon tmpdungeon[MAXDUNGEON]; static struct tmplevel tmplevel[LEV_LIMIT]; static struct tmpbranch tmpbranch[BRANCH_LIMIT]; static int in_dungeon = 0, n_dgns = -1, n_levs = -1, n_brs = -1; extern int fatal_error; extern const char *fname; extern FILE *yyin, *yyout; /* from dgn_lex.c */ typedef union { int i; char* str; } YYSTYPE; #define YYERRCODE 256 #define INTEGER 257 #define A_DUNGEON 258 #define BRANCH 259 #define CHBRANCH 260 #define LEVEL 261 #define RNDLEVEL 262 #define CHLEVEL 263 #define RNDCHLEVEL 264 #define UP_OR_DOWN 265 #define PROTOFILE 266 #define DESCRIPTION 267 #define DESCRIPTOR 268 #define LEVELDESC 269 #define ALIGNMENT 270 #define LEVALIGN 271 #define ENTRY 272 #define STAIR 273 #define NO_UP 274 #define NO_DOWN 275 #define PORTAL 276 #define STRING 277 const short yylhs[] = { -1, 0, 0, 5, 5, 6, 6, 6, 6, 7, 1, 1, 8, 8, 8, 12, 13, 15, 15, 14, 10, 10, 10, 10, 10, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 9, 9, 22, 23, 3, 3, 3, 3, 3, 2, 2, 4, 21, 11, }; const short yylen[] = { 2, 0, 1, 1, 2, 1, 1, 1, 1, 6, 0, 1, 1, 1, 1, 3, 1, 3, 3, 3, 1, 1, 1, 1, 1, 6, 7, 7, 8, 3, 3, 7, 8, 8, 9, 1, 1, 8, 9, 0, 1, 1, 1, 1, 0, 1, 1, 5, 5, }; const short yydefred[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 5, 6, 7, 8, 12, 13, 14, 16, 20, 21, 22, 23, 24, 35, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 19, 17, 29, 18, 30, 15, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 9, 0, 40, 41, 42, 43, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 27, 0, 0, 0, 0, 0, 37, 0, 28, 33, 0, 48, 47, 38, 34, }; const short yydgoto[] = { 14, 78, 93, 84, 60, 15, 16, 17, 18, 19, 20, 68, 21, 22, 23, 24, 25, 26, 27, 28, 29, 70, 30, 31, }; const short yysindex[] = { -236, -44, -43, -42, -40, -37, -29, -21, -20, -19, -18, -17, -16, -15, 0, -236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -233, -232, -231, -229, -228, -227, -226, -225, -215, -214, -213, -212, -200, 0, -219, -5, -217, -219, -219, -219, -219, 0, 0, 0, 0, 0, 0, 0, 21, 23, 22, 2, 3, -209, -208, -193, -187, -186, -270, 21, 23, 23, 29, 30, 31, 0, 0, 34, 0, 0, 0, 0, -191, -270, -181, -178, 21, 21, -177, -176, 0, -187, -191, 0, -175, -174, -173, 44, 45, 0, -187, 0, 0, -170, 0, 0, 0, 0, }; const short yyrindex[] = { 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 1, 47, 0, 0, 0, 0, 0, 0, 32, 17, 0, 62, 77, 0, 0, 0, 0, 32, 0, 0, 92, 0, 0, 0, 0, }; const short yygindex[] = { 0, -93, -4, 6, -39, 0, 78, 0, 0, 0, 0, -69, 0, 0, 0, 0, 0, 0, 0, 0, 0, -65, 0, 0, }; #define YYTABLESIZE 364 const short yytable[] = { 101, 39, 85, 80, 81, 82, 83, 86, 87, 108, 63, 64, 65, 66, 32, 33, 34, 44, 35, 97, 98, 36, 1, 2, 3, 4, 5, 6, 7, 37, 8, 9, 10, 10, 11, 12, 13, 38, 39, 40, 41, 42, 43, 44, 46, 47, 48, 25, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 61, 62, 67, 26, 69, 76, 71, 72, 73, 74, 75, 77, 79, 88, 89, 92, 90, 95, 31, 91, 96, 99, 100, 103, 104, 105, 106, 107, 109, 1, 2, 102, 94, 32, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 0, 39, 39, 39, 39, 44, 44, 44, 44, 44, 44, 44, 44, 0, 44, 44, 0, 44, 44, 44, 44, 10, 10, 10, 10, 10, 10, 10, 0, 10, 10, 0, 10, 10, 10, 10, 25, 25, 25, 25, 25, 25, 25, 0, 25, 25, 0, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 0, 26, 26, 0, 26, 26, 26, 26, 31, 31, 31, 31, 31, 31, 31, 0, 31, 31, 0, 31, 31, 31, 31, 32, 32, 32, 32, 32, 32, 32, 0, 32, 32, 0, 32, 32, 32, 32, }; const short yycheck[] = { 93, 0, 71, 273, 274, 275, 276, 72, 73, 102, 49, 50, 51, 52, 58, 58, 58, 0, 58, 88, 89, 58, 258, 259, 260, 261, 262, 263, 264, 58, 266, 267, 0, 269, 270, 271, 272, 58, 58, 58, 58, 58, 58, 58, 277, 277, 277, 0, 277, 277, 277, 277, 277, 268, 268, 268, 268, 257, 277, 64, 277, 40, 0, 40, 257, 43, 64, 64, 277, 277, 257, 257, 43, 43, 265, 44, 257, 0, 44, 257, 257, 257, 257, 257, 257, 41, 41, 257, 0, 0, 94, 85, 0, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, -1, 269, 270, 271, 272, 257, 258, 259, 260, 261, 262, 263, 264, -1, 266, 267, -1, 269, 270, 271, 272, 258, 259, 260, 261, 262, 263, 264, -1, 266, 267, -1, 269, 270, 271, 272, 258, 259, 260, 261, 262, 263, 264, -1, 266, 267, -1, 269, 270, 271, 272, 258, 259, 260, 261, 262, 263, 264, -1, 266, 267, -1, 269, 270, 271, 272, 258, 259, 260, 261, 262, 263, 264, -1, 266, 267, -1, 269, 270, 271, 272, 258, 259, 260, 261, 262, 263, 264, -1, 266, 267, -1, 269, 270, 271, 272, }; #define YYFINAL 14 #ifndef YYDEBUG #define YYDEBUG 0 #endif #define YYMAXTOKEN 277 #if YYDEBUG const char * const yyname[] = { "end-of-file",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,"'('","')'",0,"'+'","','",0,0,0,0,0,0,0,0,0,0,0,0,0,"':'",0,0,0,0,0, "'@'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"INTEGER", "A_DUNGEON","BRANCH","CHBRANCH","LEVEL","RNDLEVEL","CHLEVEL","RNDCHLEVEL", "UP_OR_DOWN","PROTOFILE","DESCRIPTION","DESCRIPTOR","LEVELDESC","ALIGNMENT", "LEVALIGN","ENTRY","STAIR","NO_UP","NO_DOWN","PORTAL","STRING", }; const char * const yyrule[] = { "$accept : file", "file :", "file : dungeons", "dungeons : dungeon", "dungeons : dungeons dungeon", "dungeon : dungeonline", "dungeon : dungeondesc", "dungeon : branches", "dungeon : levels", "dungeonline : A_DUNGEON ':' STRING bones_tag rcouple optional_int", "optional_int :", "optional_int : INTEGER", "dungeondesc : entry", "dungeondesc : descriptions", "dungeondesc : prototype", "entry : ENTRY ':' INTEGER", "descriptions : desc", "desc : DESCRIPTION ':' DESCRIPTOR", "desc : ALIGNMENT ':' DESCRIPTOR", "prototype : PROTOFILE ':' STRING", "levels : level1", "levels : level2", "levels : levdesc", "levels : chlevel1", "levels : chlevel2", "level1 : LEVEL ':' STRING bones_tag '@' acouple", "level1 : RNDLEVEL ':' STRING bones_tag '@' acouple INTEGER", "level2 : LEVEL ':' STRING bones_tag '@' acouple INTEGER", "level2 : RNDLEVEL ':' STRING bones_tag '@' acouple INTEGER INTEGER", "levdesc : LEVELDESC ':' DESCRIPTOR", "levdesc : LEVALIGN ':' DESCRIPTOR", "chlevel1 : CHLEVEL ':' STRING bones_tag STRING '+' rcouple", "chlevel1 : RNDCHLEVEL ':' STRING bones_tag STRING '+' rcouple INTEGER", "chlevel2 : CHLEVEL ':' STRING bones_tag STRING '+' rcouple INTEGER", "chlevel2 : RNDCHLEVEL ':' STRING bones_tag STRING '+' rcouple INTEGER INTEGER", "branches : branch", "branches : chbranch", "branch : BRANCH ':' STRING '@' acouple branch_type direction optional_int", "chbranch : CHBRANCH ':' STRING STRING '+' rcouple branch_type direction optional_int", "branch_type :", "branch_type : STAIR", "branch_type : NO_UP", "branch_type : NO_DOWN", "branch_type : PORTAL", "direction :", "direction : UP_OR_DOWN", "bones_tag : STRING", "acouple : '(' INTEGER ',' INTEGER ')'", "rcouple : '(' INTEGER ',' INTEGER ')'", }; #endif #if YYDEBUG #include #endif #ifdef YYSTACKSIZE #undef YYMAXDEPTH #define YYMAXDEPTH YYSTACKSIZE #else #ifdef YYMAXDEPTH #define YYSTACKSIZE YYMAXDEPTH #else #define YYSTACKSIZE 10000 #define YYMAXDEPTH 10000 #endif #endif #define YYINITSTACKSIZE 200 int yydebug; int yynerrs; int yyerrflag; int yychar; short *yyssp; YYSTYPE *yyvsp; YYSTYPE yyval; YYSTYPE yylval; short *yyss; short *yysslim; YYSTYPE *yyvs; int yystacksize; void init_dungeon() { if(++n_dgns > MAXDUNGEON) { (void) fprintf(stderr, "FATAL - Too many dungeons (limit: %d).\n", MAXDUNGEON); (void) fprintf(stderr, "To increase the limit edit MAXDUNGEON in global.h\n"); exit(EXIT_FAILURE); } in_dungeon = 1; tmpdungeon[n_dgns].lev.base = 0; tmpdungeon[n_dgns].lev.rand = 0; tmpdungeon[n_dgns].chance = 100; Strcpy(tmpdungeon[n_dgns].name, ""); Strcpy(tmpdungeon[n_dgns].protoname, ""); tmpdungeon[n_dgns].flags = 0; tmpdungeon[n_dgns].levels = 0; tmpdungeon[n_dgns].branches = 0; } void init_level() { if(++n_levs > LEV_LIMIT) { yyerror("FATAL - Too many special levels defined."); exit(EXIT_FAILURE); } tmplevel[n_levs].lev.base = 0; tmplevel[n_levs].lev.rand = 0; tmplevel[n_levs].chance = 100; tmplevel[n_levs].rndlevs = 0; tmplevel[n_levs].flags = 0; Strcpy(tmplevel[n_levs].name, ""); tmplevel[n_levs].chain = -1; } void init_branch() { if(++n_brs > BRANCH_LIMIT) { yyerror("FATAL - Too many special levels defined."); exit(EXIT_FAILURE); } tmpbranch[n_brs].lev.base = 0; tmpbranch[n_brs].lev.rand = 0; Strcpy(tmpbranch[n_brs].name, ""); tmpbranch[n_brs].chain = -1; tmpbranch[n_brs].entry_lev = 0; } int getchain(s) char *s; { int i; if(strlen(s)) { for(i = n_levs - tmpdungeon[n_dgns].levels + 1; i <= n_levs; i++) if(!strcmp(tmplevel[i].name, s)) return i; yyerror("Can't locate the specified chain level."); return(-2); } return(-1); } /* * Consistancy checking routines: * * - A dungeon must have a unique name. * - A dungeon must have a originating "branch" command * (except, of course, for the first dungeon). * - A dungeon must have a proper depth (at least (1, 0)). */ int check_dungeon() { int i; for(i = 0; i < n_dgns; i++) if(!strcmp(tmpdungeon[i].name, tmpdungeon[n_dgns].name)) { yyerror("Duplicate dungeon name."); return(0); } if(n_dgns) for(i = 0; i < n_brs - tmpdungeon[n_dgns].branches; i++) { if(!strcmp(tmpbranch[i].name, tmpdungeon[n_dgns].name)) break; if(i >= n_brs - tmpdungeon[n_dgns].branches) { yyerror("Dungeon cannot be reached."); return(0); } } if(tmpdungeon[n_dgns].lev.base <= 0 || tmpdungeon[n_dgns].lev.rand < 0) { yyerror("Invalid dungeon depth specified."); return(0); } return(1); /* OK */ } /* * - A level must have a unique level name. * - If chained, the level used as reference for the chain * must be in this dungeon, must be previously defined, and * the level chained from must be "non-probabilistic" (ie. * have a 100% chance of existing). */ int check_level() { int i; if(!in_dungeon) { yyerror("Level defined outside of dungeon."); return(0); } for(i = 0; i < n_levs; i++) if(!strcmp(tmplevel[i].name, tmplevel[n_levs].name)) { yyerror("Duplicate level name."); return(0); } if(tmplevel[i].chain == -2) { yyerror("Invalid level chain reference."); return(0); } else if(tmplevel[i].chain != -1) { /* there is a chain */ /* KMH -- tmplevel[tmpbranch[i].chain].chance was in error */ if(tmplevel[tmplevel[i].chain].chance != 100) { yyerror("Level cannot chain from a probabilistic level."); return(0); } else if(tmplevel[i].chain == n_levs) { yyerror("A level cannot chain to itself!"); return(0); } } return(1); /* OK */ } /* * - A branch may not branch backwards - to avoid branch loops. * - A branch name need not be unique. * (ie. You can have many entry points to each dungeon). * - If chained, the level used as reference for the chain * must be in this dungeon, must be previously defined, and * the level chained from must be "non-probabilistic" (ie. * have a 100% chance of existing). */ int check_branch() { int i; if(!in_dungeon) { yyerror("Branch defined outside of dungeon."); return(0); } #if 0 for(i = 0; i < n_dgns; i++) if(!strcmp(tmpdungeon[i].name, tmpbranch[n_brs].name)) { yyerror("Reverse branching not allowed."); return(0); } #endif if(tmpbranch[n_dgns].chain == -2) { yyerror("Invalid branch chain reference."); return(0); } else if(tmpbranch[n_dgns].chain != -1) { /* it is chained */ if(tmplevel[tmpbranch[n_dgns].chain].chance != 100) { yyerror("Branch cannot chain from a probabilistic level."); return(0); } } return(1); /* OK */ } /* * Output the dungon definition into a file. * * The file will have the following format: * * [ nethack version ID ] * [ number of dungeons ] * [ first dungeon struct ] * [ levels for the first dungeon ] * ... * [ branches for the first dungeon ] * ... * [ second dungeon struct ] * ... */ void output_dgn() { int nd, cl = 0, nl = 0, cb = 0, nb = 0; static struct version_info version_data = { VERSION_NUMBER, VERSION_FEATURES, VERSION_SANITY1, VERSION_SANITY2 }; if(++n_dgns <= 0) { yyerror("FATAL - no dungeons were defined."); exit(EXIT_FAILURE); } if (fwrite((char *)&version_data, sizeof version_data, 1, yyout) != 1) { yyerror("FATAL - output failure."); exit(EXIT_FAILURE); } (void) fwrite((char *)&n_dgns, sizeof(int), 1, yyout); for (nd = 0; nd < n_dgns; nd++) { (void) fwrite((char *)&tmpdungeon[nd], sizeof(struct tmpdungeon), 1, yyout); nl += tmpdungeon[nd].levels; for(; cl < nl; cl++) (void) fwrite((char *)&tmplevel[cl], sizeof(struct tmplevel), 1, yyout); nb += tmpdungeon[nd].branches; for(; cb < nb; cb++) (void) fwrite((char *)&tmpbranch[cb], sizeof(struct tmpbranch), 1, yyout); } /* apparently necessary for Think C 5.x, otherwise harmless */ (void) fflush(yyout); } /*dgn_comp.y*/ /* allocate initial stack or double stack size, up to YYMAXDEPTH */ static int yygrowstack() { int newsize, i; short *newss; YYSTYPE *newvs; if ((newsize = yystacksize) == 0) newsize = YYINITSTACKSIZE; else if (newsize >= YYMAXDEPTH) return -1; else if ((newsize *= 2) > YYMAXDEPTH) newsize = YYMAXDEPTH; i = yyssp - yyss; newss = yyss ? (short *)realloc(yyss, newsize * sizeof *newss) : (short *)malloc(newsize * sizeof *newss); if (newss == NULL) return -1; yyss = newss; yyssp = newss + i; newvs = yyvs ? (YYSTYPE *)realloc(yyvs, newsize * sizeof *newvs) : (YYSTYPE *)malloc(newsize * sizeof *newvs); if (newvs == NULL) return -1; yyvs = newvs; yyvsp = newvs + i; yystacksize = newsize; yysslim = yyss + newsize - 1; return 0; } #define YYABORT goto yyabort #define YYREJECT goto yyabort #define YYACCEPT goto yyaccept #define YYERROR goto yyerrlab #ifndef YYPARSE_PARAM #if defined(__cplusplus) || __STDC__ #define YYPARSE_PARAM_ARG void #define YYPARSE_PARAM_DECL #else /* ! ANSI-C/C++ */ #define YYPARSE_PARAM_ARG #define YYPARSE_PARAM_DECL #endif /* ANSI-C/C++ */ #else /* YYPARSE_PARAM */ #ifndef YYPARSE_PARAM_TYPE #define YYPARSE_PARAM_TYPE void * #endif #if defined(__cplusplus) || __STDC__ #define YYPARSE_PARAM_ARG YYPARSE_PARAM_TYPE YYPARSE_PARAM #define YYPARSE_PARAM_DECL #else /* ! ANSI-C/C++ */ #define YYPARSE_PARAM_ARG YYPARSE_PARAM #define YYPARSE_PARAM_DECL YYPARSE_PARAM_TYPE YYPARSE_PARAM; #endif /* ANSI-C/C++ */ #endif /* ! YYPARSE_PARAM */ int yyparse (YYPARSE_PARAM_ARG) YYPARSE_PARAM_DECL { register int yym, yyn, yystate; #if YYDEBUG register const char *yys; if ((yys = getenv("YYDEBUG"))) { yyn = *yys; if (yyn >= '0' && yyn <= '9') yydebug = yyn - '0'; } #endif yynerrs = 0; yyerrflag = 0; yychar = (-1); if (yyss == NULL && yygrowstack()) goto yyoverflow; yyssp = yyss; yyvsp = yyvs; *yyssp = yystate = 0; yyloop: if ((yyn = yydefred[yystate])) goto yyreduce; if (yychar < 0) { if ((yychar = yylex()) < 0) yychar = 0; #if YYDEBUG if (yydebug) { yys = 0; if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; if (!yys) yys = "illegal-symbol"; printf("%sdebug: state %d, reading %d (%s)\n", YYPREFIX, yystate, yychar, yys); } #endif } if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && yyn <= YYTABLESIZE && yycheck[yyn] == yychar) { #if YYDEBUG if (yydebug) printf("%sdebug: state %d, shifting to state %d\n", YYPREFIX, yystate, yytable[yyn]); #endif if (yyssp >= yysslim && yygrowstack()) { goto yyoverflow; } *++yyssp = yystate = yytable[yyn]; *++yyvsp = yylval; yychar = (-1); if (yyerrflag > 0) --yyerrflag; goto yyloop; } if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && yyn <= YYTABLESIZE && yycheck[yyn] == yychar) { yyn = yytable[yyn]; goto yyreduce; } if (yyerrflag) goto yyinrecovery; #if defined(lint) || defined(__GNUC__) goto yynewerror; #endif yynewerror: yyerror("syntax error"); #if defined(lint) || defined(__GNUC__) goto yyerrlab; #endif yyerrlab: ++yynerrs; yyinrecovery: if (yyerrflag < 3) { yyerrflag = 3; for (;;) { if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 && yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) { #if YYDEBUG if (yydebug) printf("%sdebug: state %d, error recovery shifting\ to state %d\n", YYPREFIX, *yyssp, yytable[yyn]); #endif if (yyssp >= yysslim && yygrowstack()) { goto yyoverflow; } *++yyssp = yystate = yytable[yyn]; *++yyvsp = yylval; goto yyloop; } else { #if YYDEBUG if (yydebug) printf("%sdebug: error recovery discarding state %d\n", YYPREFIX, *yyssp); #endif if (yyssp <= yyss) goto yyabort; --yyssp; --yyvsp; } } } else { if (yychar == 0) goto yyabort; #if YYDEBUG if (yydebug) { yys = 0; if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; if (!yys) yys = "illegal-symbol"; printf("%sdebug: state %d, error recovery discards token %d (%s)\n", YYPREFIX, yystate, yychar, yys); } #endif yychar = (-1); goto yyloop; } yyreduce: #if YYDEBUG if (yydebug) printf("%sdebug: state %d, reducing by rule %d (%s)\n", YYPREFIX, yystate, yyn, yyrule[yyn]); #endif yym = yylen[yyn]; yyval = yyvsp[1-yym]; switch (yyn) { case 2: { output_dgn(); } break; case 9: { init_dungeon(); if (strlen(yyvsp[-3].str)+1 > sizeof(tmpdungeon[n_dgns].name)) yyerror("Dungeon name is too long"); Strcpy(tmpdungeon[n_dgns].name, yyvsp[-3].str); tmpdungeon[n_dgns].boneschar = (char)yyvsp[-2].i; tmpdungeon[n_dgns].lev.base = couple.base; tmpdungeon[n_dgns].lev.rand = couple.rand; tmpdungeon[n_dgns].chance = yyvsp[0].i; Free(yyvsp[-3].str); } break; case 10: { yyval.i = 0; } break; case 11: { yyval.i = yyvsp[0].i; } break; case 15: { /* tmpdungeon[n_dgns].entry_lev = $3; */ yyerror("ENTRY is obsolete!"); } break; case 17: { if(yyvsp[0].i <= TOWN || yyvsp[0].i >= D_ALIGN_CHAOTIC) yyerror("Illegal description - ignoring!"); else tmpdungeon[n_dgns].flags |= yyvsp[0].i ; } break; case 18: { if(yyvsp[0].i && yyvsp[0].i < D_ALIGN_CHAOTIC) yyerror("Illegal alignment - ignoring!"); else tmpdungeon[n_dgns].flags |= yyvsp[0].i ; } break; case 19: { if (strlen(yyvsp[0].str)+1 > sizeof(tmpdungeon[n_dgns].protoname)) yyerror("Proto name is too long"); Strcpy(tmpdungeon[n_dgns].protoname, yyvsp[0].str); Free(yyvsp[0].str); } break; case 25: { init_level(); if (strlen(yyvsp[-3].str)+1 > sizeof(tmplevel[n_levs].name)) yyerror("Level name is too long"); Strcpy(tmplevel[n_levs].name, yyvsp[-3].str); tmplevel[n_levs].boneschar = (char)yyvsp[-2].i; tmplevel[n_levs].lev.base = couple.base; tmplevel[n_levs].lev.rand = couple.rand; tmpdungeon[n_dgns].levels++; Free(yyvsp[-3].str); } break; case 26: { init_level(); if (strlen(yyvsp[-4].str)+1 > sizeof(tmplevel[n_levs].name)) yyerror("Level name is too long"); Strcpy(tmplevel[n_levs].name, yyvsp[-4].str); tmplevel[n_levs].boneschar = (char)yyvsp[-3].i; tmplevel[n_levs].lev.base = couple.base; tmplevel[n_levs].lev.rand = couple.rand; tmplevel[n_levs].rndlevs = yyvsp[0].i; tmpdungeon[n_dgns].levels++; Free(yyvsp[-4].str); } break; case 27: { init_level(); if (strlen(yyvsp[-4].str)+1 > sizeof(tmplevel[n_levs].name)) yyerror("Level name is too long"); Strcpy(tmplevel[n_levs].name, yyvsp[-4].str); tmplevel[n_levs].boneschar = (char)yyvsp[-3].i; tmplevel[n_levs].lev.base = couple.base; tmplevel[n_levs].lev.rand = couple.rand; tmplevel[n_levs].chance = yyvsp[0].i; tmpdungeon[n_dgns].levels++; Free(yyvsp[-4].str); } break; case 28: { init_level(); if (strlen(yyvsp[-5].str)+1 > sizeof(tmplevel[n_levs].name)) yyerror("Level name is too long"); Strcpy(tmplevel[n_levs].name, yyvsp[-5].str); tmplevel[n_levs].boneschar = (char)yyvsp[-4].i; tmplevel[n_levs].lev.base = couple.base; tmplevel[n_levs].lev.rand = couple.rand; tmplevel[n_levs].chance = yyvsp[-1].i; tmplevel[n_levs].rndlevs = yyvsp[0].i; tmpdungeon[n_dgns].levels++; Free(yyvsp[-5].str); } break; case 29: { if(yyvsp[0].i >= D_ALIGN_CHAOTIC) yyerror("Illegal description - ignoring!"); else tmplevel[n_levs].flags |= yyvsp[0].i ; } break; case 30: { if(yyvsp[0].i && yyvsp[0].i < D_ALIGN_CHAOTIC) yyerror("Illegal alignment - ignoring!"); else tmplevel[n_levs].flags |= yyvsp[0].i ; } break; case 31: { init_level(); if (strlen(yyvsp[-4].str)+1 > sizeof(tmplevel[n_levs].name)) yyerror("Level name is too long"); Strcpy(tmplevel[n_levs].name, yyvsp[-4].str); tmplevel[n_levs].boneschar = (char)yyvsp[-3].i; tmplevel[n_levs].chain = getchain(yyvsp[-2].str); tmplevel[n_levs].lev.base = couple.base; tmplevel[n_levs].lev.rand = couple.rand; if(!check_level()) n_levs--; else tmpdungeon[n_dgns].levels++; Free(yyvsp[-4].str); Free(yyvsp[-2].str); } break; case 32: { init_level(); if (strlen(yyvsp[-5].str)+1 > sizeof(tmplevel[n_levs].name)) yyerror("Level name is too long"); Strcpy(tmplevel[n_levs].name, yyvsp[-5].str); tmplevel[n_levs].boneschar = (char)yyvsp[-4].i; tmplevel[n_levs].chain = getchain(yyvsp[-3].str); tmplevel[n_levs].lev.base = couple.base; tmplevel[n_levs].lev.rand = couple.rand; tmplevel[n_levs].rndlevs = yyvsp[0].i; if(!check_level()) n_levs--; else tmpdungeon[n_dgns].levels++; Free(yyvsp[-5].str); Free(yyvsp[-3].str); } break; case 33: { init_level(); if (strlen(yyvsp[-5].str)+1 > sizeof(tmplevel[n_levs].name)) yyerror("Level name is too long"); Strcpy(tmplevel[n_levs].name, yyvsp[-5].str); tmplevel[n_levs].boneschar = (char)yyvsp[-4].i; tmplevel[n_levs].chain = getchain(yyvsp[-3].str); tmplevel[n_levs].lev.base = couple.base; tmplevel[n_levs].lev.rand = couple.rand; tmplevel[n_levs].chance = yyvsp[0].i; if(!check_level()) n_levs--; else tmpdungeon[n_dgns].levels++; Free(yyvsp[-5].str); Free(yyvsp[-3].str); } break; case 34: { init_level(); if (strlen(yyvsp[-6].str)+1 > sizeof(tmplevel[n_levs].name)) yyerror("Level name is too long"); Strcpy(tmplevel[n_levs].name, yyvsp[-6].str); tmplevel[n_levs].boneschar = (char)yyvsp[-5].i; tmplevel[n_levs].chain = getchain(yyvsp[-4].str); tmplevel[n_levs].lev.base = couple.base; tmplevel[n_levs].lev.rand = couple.rand; tmplevel[n_levs].chance = yyvsp[-1].i; tmplevel[n_levs].rndlevs = yyvsp[0].i; if(!check_level()) n_levs--; else tmpdungeon[n_dgns].levels++; Free(yyvsp[-6].str); Free(yyvsp[-4].str); } break; case 37: { init_branch(); if (strlen(yyvsp[-5].str)+1 > sizeof(tmpbranch[n_brs].name)) yyerror("Dungeon name is too long"); Strcpy(tmpbranch[n_brs].name, yyvsp[-5].str); tmpbranch[n_brs].lev.base = couple.base; tmpbranch[n_brs].lev.rand = couple.rand; tmpbranch[n_brs].type = yyvsp[-2].i; tmpbranch[n_brs].up = yyvsp[-1].i; tmpbranch[n_brs].entry_lev = yyvsp[0].i; if(!check_branch()) n_brs--; else tmpdungeon[n_dgns].branches++; Free(yyvsp[-5].str); } break; case 38: { init_branch(); if (strlen(yyvsp[-6].str)+1 > sizeof(tmpbranch[n_brs].name)) yyerror("Dungeon name is too long"); Strcpy(tmpbranch[n_brs].name, yyvsp[-6].str); tmpbranch[n_brs].chain = getchain(yyvsp[-5].str); tmpbranch[n_brs].lev.base = couple.base; tmpbranch[n_brs].lev.rand = couple.rand; tmpbranch[n_brs].type = yyvsp[-2].i; tmpbranch[n_brs].up = yyvsp[-1].i; tmpbranch[n_brs].entry_lev = yyvsp[0].i; if(!check_branch()) n_brs--; else tmpdungeon[n_dgns].branches++; Free(yyvsp[-6].str); Free(yyvsp[-5].str); } break; case 39: { yyval.i = TBR_STAIR; /* two way stair */ } break; case 40: { yyval.i = TBR_STAIR; /* two way stair */ } break; case 41: { yyval.i = TBR_NO_UP; /* no up staircase */ } break; case 42: { yyval.i = TBR_NO_DOWN; /* no down staircase */ } break; case 43: { yyval.i = TBR_PORTAL; /* portal connection */ } break; case 44: { yyval.i = 0; /* defaults to down */ } break; case 45: { yyval.i = yyvsp[0].i; } break; case 46: { char *p = yyvsp[0].str; if (strlen(p) != 1) { if (strcmp(p, "none") != 0) yyerror("Bones marker must be a single char, or \"none\"!"); *p = '\0'; } yyval.i = *p; Free(p); } break; case 47: { if (yyvsp[-3].i < -MAXLEVEL || yyvsp[-3].i > MAXLEVEL) { yyerror("Abs base out of dlevel range - zeroing!"); couple.base = couple.rand = 0; } else if (yyvsp[-1].i < -1 || ((yyvsp[-3].i < 0) ? (MAXLEVEL + yyvsp[-3].i + yyvsp[-1].i + 1) > MAXLEVEL : (yyvsp[-3].i + yyvsp[-1].i) > MAXLEVEL)) { yyerror("Abs range out of dlevel range - zeroing!"); couple.base = couple.rand = 0; } else { couple.base = yyvsp[-3].i; couple.rand = yyvsp[-1].i; } } break; case 48: { if (yyvsp[-3].i < -MAXLEVEL || yyvsp[-3].i > MAXLEVEL) { yyerror("Rel base out of dlevel range - zeroing!"); couple.base = couple.rand = 0; } else { couple.base = yyvsp[-3].i; couple.rand = yyvsp[-1].i; } } break; } yyssp -= yym; yystate = *yyssp; yyvsp -= yym; yym = yylhs[yyn]; if (yystate == 0 && yym == 0) { #if YYDEBUG if (yydebug) printf("%sdebug: after reduction, shifting from state 0 to\ state %d\n", YYPREFIX, YYFINAL); #endif yystate = YYFINAL; *++yyssp = YYFINAL; *++yyvsp = yyval; if (yychar < 0) { if ((yychar = yylex()) < 0) yychar = 0; #if YYDEBUG if (yydebug) { yys = 0; if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; if (!yys) yys = "illegal-symbol"; printf("%sdebug: state %d, reading %d (%s)\n", YYPREFIX, YYFINAL, yychar, yys); } #endif } if (yychar == 0) goto yyaccept; goto yyloop; } if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 && yyn <= YYTABLESIZE && yycheck[yyn] == yystate) yystate = yytable[yyn]; else yystate = yydgoto[yym]; #if YYDEBUG if (yydebug) printf("%sdebug: after reduction, shifting from state %d \ to state %d\n", YYPREFIX, *yyssp, yystate); #endif if (yyssp >= yysslim && yygrowstack()) { goto yyoverflow; } *++yyssp = yystate; *++yyvsp = yyval; goto yyloop; yyoverflow: yyerror("yacc stack overflow"); yyabort: return (1); yyaccept: return (0); } slashem-0.0.7E7F3/sys/share/random.c0000664000076400007640000003256610545462317015234 0ustar aliali/* * 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. */ /* Several minor changes were made for the NetHack distribution to satisfy * non-BSD compilers (by definition BSD compilers do not need to compile * this file for NetHack). These changes consisted of: * - changing the sccsid conditions to nested ifdefs from defined()s * to accommodate stupid preprocessors * - giving srandom() type void instead of allowing it to default to int * - making the first return in initstate() return a value consistent * with its type (instead of no value) * - ANSI function prototyping in extern.h - therefore include hack.h * instead of stdio.h and remove separate declaration of random() from * the beginning of function srandom * - moving sccsid after hack.h to allow precompiled headers, which * means the defined()s would be ok again... * - change fprintf(stderr, "x(%d)y\n", z) to impossible("x(%d)y", z) * - remove useless variable `j' from srandom() */ #include "hack.h" #ifdef LIBC_SCCS # ifndef lint static char sccsid[] = "@(#)random.c 5.5 (Berkeley) 7/6/88"; # endif #endif /* LIBC_SCCS and not lint */ /* * random.c: * An improved random number generation package. In addition to the standard * rand()/srand() like interface, this package also has a special state info * interface. The initstate() routine is called with a seed, an array of * bytes, and a count of how many bytes are being passed in; this array is then * initialized to contain information for random number generation with that * much state information. Good sizes for the amount of state information are * 32, 64, 128, and 256 bytes. The state can be switched by calling the * setstate() routine with the same array as was initiallized with initstate(). * By default, the package runs with 128 bytes of state information and * generates far better random numbers than a linear congruential generator. * If the amount of state information is less than 32 bytes, a simple linear * congruential R.N.G. is used. * Internally, the state information is treated as an array of longs; the * zeroeth element of the array is the type of R.N.G. being used (small * integer); the remainder of the array is the state information for the * R.N.G. Thus, 32 bytes of state information will give 7 longs worth of * state information, which will allow a degree seven polynomial. (Note: the * zeroeth word of state information also has some other information stored * in it -- see setstate() for details). * The random number generation technique is a linear feedback shift register * approach, employing trinomials (since there are fewer terms to sum up that * way). In this approach, the least significant bit of all the numbers in * the state table will act as a linear feedback shift register, and will have * period 2^deg - 1 (where deg is the degree of the polynomial being used, * assuming that the polynomial is irreducible and primitive). The higher * order bits will have longer periods, since their values are also influenced * by pseudo-random carries out of the lower bits. The total period of the * generator is approximately deg*(2**deg - 1); thus doubling the amount of * state information has a vast influence on the period of the generator. * Note: the deg*(2**deg - 1) is an approximation only good for large deg, * when the period of the shift register is the dominant factor. With deg * equal to seven, the period is actually much longer than the 7*(2**7 - 1) * predicted by this formula. */ /* * For each of the currently supported random number generators, we have a * break value on the amount of state information (you need at least this * many bytes of state info to support this random number generator), a degree * for the polynomial (actually a trinomial) that the R.N.G. is based on, and * the separation between the two lower order coefficients of the trinomial. */ #define TYPE_0 0 /* linear congruential */ #define BREAK_0 8 #define DEG_0 0 #define SEP_0 0 #define TYPE_1 1 /* x**7 + x**3 + 1 */ #define BREAK_1 32 #define DEG_1 7 #define SEP_1 3 #define TYPE_2 2 /* x**15 + x + 1 */ #define BREAK_2 64 #define DEG_2 15 #define SEP_2 1 #define TYPE_3 3 /* x**31 + x**3 + 1 */ #define BREAK_3 128 #define DEG_3 31 #define SEP_3 3 #define TYPE_4 4 /* x**63 + x + 1 */ #define BREAK_4 256 #define DEG_4 63 #define SEP_4 1 /* * Array versions of the above information to make code run faster -- relies * on fact that TYPE_i == i. */ #define MAX_TYPES 5 /* max number of types above */ static int degrees[ MAX_TYPES ] = { DEG_0, DEG_1, DEG_2, DEG_3, DEG_4 }; static int seps[ MAX_TYPES ] = { SEP_0, SEP_1, SEP_2, SEP_3, SEP_4 }; /* * Initially, everything is set up as if from : * initstate( 1, &randtbl, 128 ); * Note that this initialization takes advantage of the fact that srandom() * advances the front and rear pointers 10*rand_deg times, and hence the * rear pointer which starts at 0 will also end up at zero; thus the zeroeth * element of the state information, which contains info about the current * position of the rear pointer is just * MAX_TYPES*(rptr - state) + TYPE_3 == TYPE_3. */ static long randtbl[ DEG_3 + 1 ] = { TYPE_3, 0x9a319039, 0x32d9c024, 0x9b663182, 0x5da1f342, 0xde3b81e0, 0xdf0a6fb5, 0xf103bc02, 0x48f340fb, 0x7449e56b, 0xbeb1dbb0, 0xab5c5918, 0x946554fd, 0x8c2e680f, 0xeb3d799f, 0xb11ee0b7, 0x2d436b86, 0xda672e2a, 0x1588ca88, 0xe369735d, 0x904f35f7, 0xd7158fd6, 0x6fa6f051, 0x616e6b96, 0xac94efdc, 0x36413f93, 0xc622c298, 0xf5a42ab8, 0x8a88d77b, 0xf5ad9d0e, 0x8999220b, 0x27fb47b9 }; /* * fptr and rptr are two pointers into the state info, a front and a rear * pointer. These two pointers are always rand_sep places aparts, as they cycle * cyclically through the state information. (Yes, this does mean we could get * away with just one pointer, but the code for random() is more efficient this * way). The pointers are left positioned as they would be from the call * initstate( 1, randtbl, 128 ) * (The position of the rear pointer, rptr, is really 0 (as explained above * in the initialization of randtbl) because the state table pointer is set * to point to randtbl[1] (as explained below). */ static long *fptr = &randtbl[ SEP_3 + 1 ]; static long *rptr = &randtbl[ 1 ]; /* * The following things are the pointer to the state information table, * the type of the current generator, the degree of the current polynomial * being used, and the separation between the two pointers. * Note that for efficiency of random(), we remember the first location of * the state information, not the zeroeth. Hence it is valid to access * state[-1], which is used to store the type of the R.N.G. * Also, we remember the last location, since this is more efficient than * indexing every time to find the address of the last element to see if * the front and rear pointers have wrapped. */ static long *state = &randtbl[ 1 ]; static int rand_type = TYPE_3; static int rand_deg = DEG_3; static int rand_sep = SEP_3; static long *end_ptr = &randtbl[ DEG_3 + 1 ]; /* * srandom: * Initialize the random number generator based on the given seed. If the * type is the trivial no-state-information type, just remember the seed. * Otherwise, initializes state[] based on the given "seed" via a linear * congruential generator. Then, the pointers are set to known locations * that are exactly rand_sep places apart. Lastly, it cycles the state * information a given number of times to get rid of any initial dependencies * introduced by the L.C.R.N.G. * Note that the initialization of randtbl[] for default usage relies on * values produced by this routine. */ void srandom( x ) unsigned x; { register int i; if( rand_type == TYPE_0 ) { state[ 0 ] = x; } else { state[ 0 ] = x; for( i = 1; i < rand_deg; i++ ) { state[i] = 1103515245*state[i - 1] + 12345; } fptr = &state[ rand_sep ]; rptr = &state[ 0 ]; for( i = 0; i < 10*rand_deg; i++ ) random(); } } /* * initstate: * Initialize the state information in the given array of n bytes for * future random number generation. Based on the number of bytes we * are given, and the break values for the different R.N.G.'s, we choose * the best (largest) one we can and set things up for it. srandom() is * then called to initialize the state information. * Note that on return from srandom(), we set state[-1] to be the type * multiplexed with the current value of the rear pointer; this is so * successive calls to initstate() won't lose this information and will * be able to restart with setstate(). * Note: the first thing we do is save the current state, if any, just like * setstate() so that it doesn't matter when initstate is called. * Returns a pointer to the old state. */ char * initstate( seed, arg_state, n ) unsigned seed; /* seed for R. N. G. */ char *arg_state; /* pointer to state array */ int n; /* # bytes of state info */ { register char *ostate = (char *)( &state[ -1 ] ); if( rand_type == TYPE_0 ) state[ -1 ] = rand_type; else state[ -1 ] = MAX_TYPES*(rptr - state) + rand_type; if( n < BREAK_1 ) { if( n < BREAK_0 ) { impossible( "initstate: not enough state (%d bytes) with which to do jack; ignored.", n); return (char *)0; } rand_type = TYPE_0; rand_deg = DEG_0; rand_sep = SEP_0; } else { if( n < BREAK_2 ) { rand_type = TYPE_1; rand_deg = DEG_1; rand_sep = SEP_1; } else { if( n < BREAK_3 ) { rand_type = TYPE_2; rand_deg = DEG_2; rand_sep = SEP_2; } else { if( n < BREAK_4 ) { rand_type = TYPE_3; rand_deg = DEG_3; rand_sep = SEP_3; } else { rand_type = TYPE_4; rand_deg = DEG_4; rand_sep = SEP_4; } } } } state = &( ( (long *)arg_state )[1] ); /* first location */ end_ptr = &state[ rand_deg ]; /* must set end_ptr before srandom */ srandom( seed ); if( rand_type == TYPE_0 ) state[ -1 ] = rand_type; else state[ -1 ] = MAX_TYPES*(rptr - state) + rand_type; return( ostate ); } /* * setstate: * Restore the state from the given state array. * Note: it is important that we also remember the locations of the pointers * in the current state information, and restore the locations of the pointers * from the old state information. This is done by multiplexing the pointer * location into the zeroeth word of the state information. * Note that due to the order in which things are done, it is OK to call * setstate() with the same state as the current state. * Returns a pointer to the old state information. */ char * setstate( arg_state ) char *arg_state; { register long *new_state = (long *)arg_state; register int type = new_state[0]%MAX_TYPES; register int rear = new_state[0]/MAX_TYPES; char *ostate = (char *)( &state[ -1 ] ); if( rand_type == TYPE_0 ) state[ -1 ] = rand_type; else state[ -1 ] = MAX_TYPES*(rptr - state) + rand_type; switch( type ) { case TYPE_0: case TYPE_1: case TYPE_2: case TYPE_3: case TYPE_4: rand_type = type; rand_deg = degrees[ type ]; rand_sep = seps[ type ]; break; default: impossible("setstate: state info has been munged (%d); not changed.", type); break; } state = &new_state[ 1 ]; if( rand_type != TYPE_0 ) { rptr = &state[ rear ]; fptr = &state[ (rear + rand_sep)%rand_deg ]; } end_ptr = &state[ rand_deg ]; /* set end_ptr too */ return( ostate ); } /* * random: * If we are using the trivial TYPE_0 R.N.G., just do the old linear * congruential bit. Otherwise, we do our fancy trinomial stuff, which is the * same in all ther other cases due to all the global variables that have been * set up. The basic operation is to add the number at the rear pointer into * the one at the front pointer. Then both pointers are advanced to the next * location cyclically in the table. The value returned is the sum generated, * reduced to 31 bits by throwing away the "least random" low bit. * Note: the code takes advantage of the fact that both the front and * rear pointers can't wrap on the same call by not testing the rear * pointer if the front one has wrapped. * Returns a 31-bit random number. */ long random() { long i; if( rand_type == TYPE_0 ) { i = state[0] = ( state[0]*1103515245 + 12345 )&0x7fffffff; } else { *fptr += *rptr; i = (*fptr >> 1)&0x7fffffff; /* chucking least random bit */ if( ++fptr >= end_ptr ) { fptr = state; ++rptr; } else { if( ++rptr >= end_ptr ) rptr = state; } } return( i ); } slashem-0.0.7E7F3/sys/share/unixtty.c0000664000076400007640000002374410545462317015476 0ustar aliali/* 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. */ /* tty.c - (Unix) version */ /* With thanks to the people who sent code for SYSV - hpscdi!jon, * arnold@ucsf-cgl, wcs@bo95b, cbcephus!pds and others. */ #define NEED_VARARGS #include "hack.h" /* * The distinctions here are not BSD - rest but rather USG - rest, as * BSD still has the old sgttyb structure, but SYSV has termio. Thus: */ #if (defined(BSD) || defined(ULTRIX)) && !defined(POSIX_TYPES) # define V7 #else # define USG #endif #ifdef USG # ifdef POSIX_TYPES # include # include # define termstruct termios # else # include # if defined(TCSETS) && !defined(AIX_31) # define termstruct termios # else # 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] # ifdef TAB3 /* not a POSIX flag, but some have it anyway */ # define EXTABS TAB3 # else # define EXTABS 0 # endif # define tabflgs c_oflag # define echoflgs c_lflag # define cbrkflgs c_lflag # define CBRKMASK ICANON # define CBRKON ! /* reverse condition */ # ifdef POSIX_TYPES # define OSPEED(x) (speednum(cfgetospeed(&x))) # else # ifndef CBAUD # define CBAUD _CBAUD /* for POSIX nitpickers (like RS/6000 cc) */ # endif # define OSPEED(x) ((x).c_cflag & CBAUD) # endif # define IS_7BIT(x) ((x).c_cflag & CS7) # define inputflags c_iflag # define STRIPHI ISTRIP # ifdef POSIX_TYPES # define GTTY(x) (tcgetattr(0, x)) # define STTY(x) (tcsetattr(0, TCSADRAIN, x)) # else # if defined(TCSETS) && !defined(AIX_31) # define GTTY(x) (ioctl(0, TCGETS, x)) # define STTY(x) (ioctl(0, TCSETSW, x)) # else # define GTTY(x) (ioctl(0, TCGETA, x)) # define STTY(x) (ioctl(0, TCSETAW, x)) # endif # endif /* POSIX_TYPES */ # define GTTY2(x) 1 # define STTY2(x) 1 # ifdef POSIX_TYPES # if defined(BSD) && !defined(__DGUX__) # define nonesuch _POSIX_VDISABLE # else # define nonesuch (fpathconf(0, _PC_VDISABLE)) # endif # else # define nonesuch 0 # endif # define inittyb2 inittyb # define curttyb2 curttyb #else /* V7 */ #ifdef POSIX_TYPES static int FDECL (speednum, (speed_t)); #endif static void NDECL (setctty); # include # define termstruct sgttyb # define kill_sym sg_kill # define erase_sym sg_erase # define intr_sym t_intrc # define EXTABS XTABS # define tabflgs sg_flags # define echoflgs sg_flags # define cbrkflgs sg_flags # define CBRKMASK CBREAK # define CBRKON /* empty */ # define inputflags sg_flags /* don't know how enabling meta bits */ # define IS_7BIT(x) (FALSE) # define STRIPHI 0 /* should actually be done on BSD */ # define OSPEED(x) (x).sg_ospeed # if defined(bsdi) || defined(__386BSD) || defined(SUNOS4) # define GTTY(x) (ioctl(0, TIOCGETP, (char *)x)) # define STTY(x) (ioctl(0, TIOCSETP, (char *)x)) # else # define GTTY(x) (gtty(0, x)) # define STTY(x) (stty(0, x)) # endif # define GTTY2(x) (ioctl(0, TIOCGETC, (char *)x)) # define STTY2(x) (ioctl(0, TIOCSETC, (char *)x)) # define nonesuch -1 struct tchars inittyb2, curttyb2; #endif /* V7 */ #if defined(TTY_GRAPHICS) && ((!defined(SYSV) && !defined(HPUX)) || defined(UNIXPC) || defined(SVR4)) # ifndef LINT extern /* it is defined in libtermlib (libtermcap) */ # endif short ospeed; /* terminal baudrate; set by gettty */ #else short ospeed = 0; /* gets around "not defined" error message */ #endif #if defined(POSIX_TYPES) && defined(BSD) unsigned #endif char erase_char, intr_char, kill_char; static boolean settty_needed = FALSE; struct termstruct inittyb, curttyb; #ifdef POSIX_TYPES static int speednum(speed) speed_t speed; { switch (speed) { case B0: return 0; case B50: return 1; case B75: return 2; case B110: return 3; case B134: return 4; case B150: return 5; case B200: return 6; case B300: return 7; case B600: return 8; case B1200: return 9; case B1800: return 10; case B2400: return 11; case B4800: return 12; case B9600: return 13; case B19200: return 14; case B38400: return 15; } return 0; } #endif static void setctty() { if(STTY(&curttyb) < 0 || STTY2(&curttyb2) < 0) perror("NetHack (setctty)"); } /* * Get initial state of terminal, set ospeed (for termcap routines) * and switch off tab expansion if necessary. * Called by startup() in termcap.c and after returning from ! or ^Z */ void gettty() { if(GTTY(&inittyb) < 0 || GTTY2(&inittyb2) < 0) perror("NetHack (gettty)"); curttyb = inittyb; curttyb2 = inittyb2; ospeed = OSPEED(inittyb); erase_char = inittyb.erase_sym; kill_char = inittyb.kill_sym; intr_char = inittyb2.intr_sym; getioctls(); /* do not expand tabs - they might be needed inside a cm sequence */ if(curttyb.tabflgs & EXTABS) { curttyb.tabflgs &= ~EXTABS; setctty(); } settty_needed = TRUE; } /* reset terminal to original state */ void settty(s) const char *s; { end_screen(); if(s) raw_print(s); if(STTY(&inittyb) < 0 || STTY2(&inittyb2) < 0) perror("NetHack (settty)"); iflags.echo = (inittyb.echoflgs & ECHO) ? ON : OFF; iflags.cbreak = (CBRKON(inittyb.cbrkflgs & CBRKMASK)) ? ON : OFF; curttyb.inputflags |= STRIPHI; setioctls(); } void setftty() { register int ef = 0; /* desired value of flags & ECHO */ #ifdef LINT /* cf = CBRKON(CBRKMASK); const expr to initialize is ok */ register int cf = 0; #else register int cf = CBRKON(CBRKMASK); /* desired value of flags & CBREAK */ #endif register int change = 0; iflags.cbreak = ON; iflags.echo = OFF; /* Should use (ECHO|CRMOD) here instead of ECHO */ if((curttyb.echoflgs & ECHO) != ef){ curttyb.echoflgs &= ~ECHO; /* curttyb.echoflgs |= ef; */ change++; } if((curttyb.cbrkflgs & CBRKMASK) != cf){ curttyb.cbrkflgs &= ~CBRKMASK; curttyb.cbrkflgs |= cf; #ifdef USG /* be satisfied with one character; no timeout */ curttyb.c_cc[VMIN] = 1; /* was VEOF */ curttyb.c_cc[VTIME] = 0; /* was VEOL */ # ifdef POSIX_JOB_CONTROL /* turn off system suspend character * due to differences in structure layout, this has to be * here instead of in ioctl.c:getioctls() with the BSD * equivalent */ # ifdef VSUSP /* real POSIX */ curttyb.c_cc[VSUSP] = nonesuch; # else /* other later SYSV */ curttyb.c_cc[VSWTCH] = nonesuch; # endif # endif # ifdef VDSUSP /* SunOS Posix extensions */ curttyb.c_cc[VDSUSP] = nonesuch; # endif # ifdef VREPRINT curttyb.c_cc[VREPRINT] = nonesuch; # endif # ifdef VDISCARD curttyb.c_cc[VDISCARD] = nonesuch; # endif # ifdef VWERASE curttyb.c_cc[VWERASE] = nonesuch; # endif # ifdef VLNEXT curttyb.c_cc[VLNEXT] = nonesuch; # endif #endif change++; } if(!IS_7BIT(inittyb)) curttyb.inputflags &=~ STRIPHI; /* If an interrupt character is used, it will be overriden and * set to ^C. */ if(intr_char != nonesuch && curttyb2.intr_sym != '\003') { curttyb2.intr_sym = '\003'; change++; } if(change) setctty(); start_screen(); } void intron() /* enable kbd interupts if enabled when game started */ { #ifdef TTY_GRAPHICS /* Ugly hack to keep from changing tty modes for non-tty games -dlc */ if (!strcmp(windowprocs.name, "tty") && intr_char != nonesuch && curttyb2.intr_sym != '\003') { curttyb2.intr_sym = '\003'; setctty(); } #endif } void introff() /* disable kbd interrupts if required*/ { #ifdef TTY_GRAPHICS /* Ugly hack to keep from changing tty modes for non-tty games -dlc */ if (!strcmp(windowprocs.name, "tty") && curttyb2.intr_sym != nonesuch) { curttyb2.intr_sym = nonesuch; setctty(); } #endif } #ifdef _M_UNIX /* SCO UNIX (3.2.4), from Andreas Arens */ # include # define BSIZE (E_TABSZ*2) # define LDIOC ('D'<<8) /* POSIX prevents definition */ # include int sco_flag_console = 0; int sco_map_valid = -1; unsigned char sco_chanmap_buf[BSIZE]; void NDECL(sco_mapon); void NDECL(sco_mapoff); void NDECL(check_sco_console); void NDECL(init_sco_cons); void sco_mapon() { # ifdef TTY_GRAPHICS if (!strcmp(windowprocs.name, "tty") && sco_flag_console) { if (sco_map_valid != -1) { ioctl(0,LDSMAP,sco_chanmap_buf); } sco_map_valid = -1; } # endif } void sco_mapoff() { # ifdef TTY_GRAPHICS if (!strcmp(windowprocs.name, "tty") && sco_flag_console) { sco_map_valid = ioctl(0,LDGMAP,sco_chanmap_buf); if (sco_map_valid != -1) { ioctl(0,LDNMAP,(char *)0); } } # endif } void check_sco_console() { if (isatty(0) && ioctl(0,CONS_GET,0) != -1) { sco_flag_console = 1; } } void init_sco_cons() { # ifdef TTY_GRAPHICS if (!strcmp(windowprocs.name, "tty") && sco_flag_console) { atexit(sco_mapon); sco_mapoff(); switch_graphics(IBM_GRAPHICS); # ifdef TEXTCOLOR if (has_colors()) iflags.use_color = TRUE; # endif } # endif } #endif /* _M_UNIX */ #ifdef __linux__ /* via Jesse Thilo and Ben Gertzfield */ # include int linux_flag_console = 0; void NDECL(linux_mapon); void NDECL(linux_mapoff); void NDECL(check_linux_console); void NDECL(init_linux_cons); void linux_mapon() { # ifdef TTY_GRAPHICS if (!strcmp(windowprocs.name, "tty") && linux_flag_console) { write(1, "\033(B", 3); } # endif } void linux_mapoff() { # ifdef TTY_GRAPHICS if (!strcmp(windowprocs.name, "tty") && linux_flag_console) { write(1, "\033(U", 3); } # endif } void check_linux_console() { struct vt_mode vtm; if (isatty(0) && ioctl(0,VT_GETMODE,&vtm) >= 0) { linux_flag_console = 1; } } void init_linux_cons() { # ifdef TTY_GRAPHICS if (!strcmp(windowprocs.name, "tty") && linux_flag_console) { atexit(linux_mapon); linux_mapoff(); # ifdef TEXTCOLOR if (has_colors()) iflags.use_color = TRUE; # endif } # endif } #endif /* __linux__ */ #ifndef __begui__ /* the Be GUI will define its own error proc */ /* fatal error */ /*VARARGS1*/ void error VA_DECL(const char *,s) VA_START(s); VA_INIT(s, const char *); if(settty_needed) settty((char *)0); Vprintf(s,VA_ARGS); (void) putchar('\n'); VA_END(); exit(EXIT_FAILURE); } #endif /* !__begui__ */ slashem-0.0.7E7F3/sys/share/pcsys.c0000664000076400007640000002617110545462317015110 0ustar aliali/* SCCS Id: @(#)pcsys.c 3.4 2002/01/22 */ /* NetHack may be freely redistributed. See license for details. */ /* * System related functions for MSDOS, OS/2, TOS, and Windows NT */ #define NEED_VARARGS #include "hack.h" #include "wintty.h" #include #include #if !defined(MSDOS) && !defined(WIN_CE) /* already done */ #include #endif #ifdef __GO32__ #define P_WAIT 0 #define P_NOWAIT 1 #endif #ifdef TOS #include #endif #if defined(MSDOS) && !defined(__GO32__) #define findfirst findfirst_file #define findnext findnext_file #define filesize filesize_nh #endif #if defined(MICRO) || defined(WIN32) || defined(OS2) void FDECL(nethack_exit,(int)); #else #define nethack_exit exit #endif static void NDECL(msexit); #ifdef MOVERLAY extern void __far __cdecl _movepause( void ); extern void __far __cdecl _moveresume( void ); extern unsigned short __far __cdecl _movefpause; extern unsigned short __far __cdecl _movefpaused; #define __MOVE_PAUSE_DISK 2 /* Represents the executable file */ #define __MOVE_PAUSE_CACHE 4 /* Represents the cache memory */ #endif /* MOVERLAY */ #ifdef MFLOPPY STATIC_DCL boolean NDECL(record_exists); # ifndef TOS STATIC_DCL boolean NDECL(comspec_exists); # endif #endif #ifdef WIN32CON extern int GUILaunched; /* from nttty.c */ #endif #if defined(MICRO) || defined(WIN32) void flushout() { (void) fflush(stdout); return; } static const char *COMSPEC = # ifdef TOS "SHELL"; # else "COMSPEC"; # endif #define getcomspec() nh_getenv(COMSPEC) # ifdef SHELL int dosh() { 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 # if defined(MSDOS) && defined(NO_TERMS) grmode = iflags.grmode; # endif suspend_nhwindows((char *)0); # endif /* TOS */ chdirx(orgdir, 0); # ifdef __GO32__ if (system(comspec) < 0) { /* wsu@eecs.umich.edu */ # else # ifdef MOVERLAY /* Free the cache memory used by overlays, close .exe */ _movefpause |= __MOVE_PAUSE_DISK; _movefpause |= __MOVE_PAUSE_CACHE; _movepause(); # endif spawnstat = spawnl(P_WAIT, comspec, comspec, (char *)0); # ifdef MOVERLAY _moveresume(); # endif if ( spawnstat < 0) { # endif raw_printf("Can't spawn \"%s\"!", comspec); getreturn("to continue"); } # ifdef TOS /* Some shells (e.g. Gulam) turn the cursor off when they exit */ if (iflags.BIOS) (void)Cursconf(1, -1); # endif chdirx(hackdir, 0); get_scr_size(); /* maybe the screen mode changed (TH) */ # if defined(MSDOS) && defined(NO_TERMS) if (grmode) gr_init(); # endif resume_nhwindows(); } else pline("Can't find %s.",COMSPEC); return 0; } # endif /* SHELL */ # ifdef MFLOPPY void eraseall(path, files) const char *path, *files; { char buf[PATHLEN]; char *foundfile; foundfile = foundfile_buffer(); Sprintf(buf, "%s%s", path, files); if (findfirst(buf)) do { Sprintf(buf, "%s%s", path, foundfile); (void) unlink(buf); } while (findnext()); return; } /* * Rewritten for version 3.3 to be faster */ void copybones(mode) int mode; { char from[PATHLEN], to[PATHLEN], last[13]; char *frompath, *topath; char *foundfile; # ifndef TOS int status; char copy[8], *comspec; # endif if (!ramdisk) return; /* Find the name of the last file to be transferred */ frompath = (mode != TOPERM) ? permbones : levels; foundfile = foundfile_buffer(); last[0] = '\0'; Sprintf(from, "%s%s", frompath, allbones); topath = (mode == TOPERM) ? permbones : levels; # ifdef TOS eraseall(topath, allbones); # endif if (findfirst(from)) do { # ifdef TOS Sprintf(from, "%s%s", frompath, foundfile); Sprintf(to, "%s%s", topath, foundfile); if (_copyfile(from, to)) goto error_copying; # endif Strcpy(last, foundfile); } while (findnext()); # ifdef TOS else return; # else if (last[0]) { Sprintf(copy, "%cC copy",switchar()); /* Remove any bones files in `to' directory. */ eraseall(topath, allbones); /* Copy `from' to `to' */ Sprintf(to, "%s%s", topath, allbones); comspec = getcomspec(); status =spawnl(P_WAIT, comspec, comspec, copy, from, to, "> nul", (char *)0); } else return; # endif /* TOS */ /* See if the last file got there. If so, remove the ramdisk bones * files. */ Sprintf(to, "%s%s", topath, last); if (findfirst(to)) { if (mode == TOPERM) eraseall(frompath, allbones); return; } # ifdef TOS error_copying: # endif /* Last file didn't get there. */ Sprintf(to, "%s%s", topath, allbones); msmsg("Can't copy \"%s\" to \"%s\" -- ", from, to); # ifndef TOS if (status < 0) msmsg("can't spawn \"%s\"!", comspec); else # endif msmsg((freediskspace(topath) < filesize(from)) ? "insufficient disk space." : "bad path(s)?"); if (mode == TOPERM) { msmsg("Bones will be left in \"%s\"\n", *levels ? levels : hackdir); } else { /* Remove all bones files on the RAMdisk */ eraseall(levels, allbones); playwoRAMdisk(); } return; } void playwoRAMdisk() { int c; msmsg("Do you wish to play without a RAMdisk? [yn] (n)"); /* Set ramdisk false *before* exit-ing (because msexit calls * copybones) */ ramdisk = FALSE; c = tgetch(); if (c == 'Y') c = 'y'; if (c != 'y') { settty("Be seeing you...\n"); nethack_exit(EXIT_SUCCESS); } set_lock_and_bones(); return; } int saveDiskPrompt(start) int start; { char buf[BUFSIZ], *bp; char qbuf[QBUFSZ]; int fd; if (flags.asksavedisk) { /* Don't prompt if you can find the save file */ if ((fd = open_savefile()) >= 0) { (void) close(fd); return 1; } clear_nhwindow(WIN_MESSAGE); pline("If save file is on a save disk, insert that disk now."); mark_synch(); Sprintf(qbuf,"File name (default \"%s\"%s) ?", SAVEF, start ? "" : ", cancels save"); getlin(qbuf, buf); clear_nhwindow(WIN_MESSAGE); if (!start && *buf == '\033') return 0; /* Strip any whitespace. Also, if nothing was entered except * whitespace, do not change the value of SAVEF. */ for (bp = buf; *bp; bp++) if (!isspace(*bp)) { strncpy(SAVEF, bp, PATHLEN); break; } } return 1; } /* Return 1 if the record file was found */ STATIC_OVL boolean record_exists() { FILE *fp; fp = fopen_datafile(NH_RECORD, "r", TRUE); if (fp) { fclose(fp); return TRUE; } return FALSE; } #endif /* MFLOPPY */ # ifdef TOS #define comspec_exists() 1 # else # ifdef MFLOPPY /* Return 1 if the comspec was found */ STATIC_OVL boolean comspec_exists() { int fd; char *comspec; if ((comspec = getcomspec())) if ((fd = open(comspec, O_RDONLY)) >= 0) { (void) close(fd); return TRUE; } return FALSE; } # endif /* MFLOPPY */ # endif # ifdef MFLOPPY /* Prompt for game disk, then check for record file. */ void gameDiskPrompt() { if (flags.asksavedisk) { if (record_exists() && comspec_exists()) return; (void) putchar('\n'); getreturn("when the game disk has been inserted"); } if (comspec_exists() && record_exists()) return; if (!comspec_exists()) msmsg("\n\nWARNING: can't find command processor \"%s\"!\n", getcomspec()); if (!record_exists()) msmsg("\n\nWARNING: can't find record file \"%s\"!\n", NH_RECORD); msmsg("If the game disk is not in, insert it now.\n"); getreturn("to continue"); return; } # endif /* MFLOPPY */ #endif /* MICRO */ /* * Add a backslash to any name not ending in /, \ or : There must * be room for the \ */ void append_slash(name) char *name; { char *ptr; if (!*name) return; ptr = name + (strlen(name) - 1); if (*ptr != '\\' && *ptr != '/' && *ptr != ':') { *++ptr = '\\'; *++ptr = '\0'; } return; } #ifdef WIN32 boolean getreturn_enabled; #endif void getreturn(str) const char *str; { #ifdef WIN32 if (!getreturn_enabled) return; #endif #ifdef TOS msmsg("Hit %s.", str); #else msmsg("Hit %s.", str); #endif while (Getchar() != '\n') ; return; } #ifndef WIN32CON void msmsg VA_DECL(const char *, fmt) VA_START(fmt); VA_INIT(fmt, const char *); # if defined(MSDOS) && defined(NO_TERMS) if (iflags.grmode) gr_finish(); # endif Vprintf(fmt, VA_ARGS); flushout(); VA_END(); return; } #endif /* * Follow the PATH, trying to fopen the file. */ #ifdef TOS # ifdef __MINT__ #define PATHSEP ':' # else #define PATHSEP ',' # endif #else #define PATHSEP ';' #endif FILE * fopenp(name, mode) const char *name, *mode; { char buf[BUFSIZ], *bp, *pp, lastch = 0; FILE *fp; /* Try the default directory first. Then look along PATH. */ (void) strncpy(buf, name, BUFSIZ - 1); buf[BUFSIZ-1] = '\0'; if ((fp = fopen(buf, mode))) return fp; else { int ccnt = 0; pp = getenv("PATH"); while (pp && *pp) { bp = buf; while (*pp && *pp != PATHSEP) { lastch = *bp++ = *pp++; ccnt++; } if (lastch != '\\' && lastch != '/') { *bp++ = '\\'; ccnt++; } (void) strncpy(bp, name, (BUFSIZ - ccnt) - 2); bp[BUFSIZ - ccnt - 1] = '\0'; if ((fp = fopen(buf, mode))) return fp; if (*pp) pp++; } } #ifdef OS2_CODEVIEW /* one more try for hackdir */ (void) strncpy(buf, hackdir, BUFSZ); buf[BUFSZ-1] = '\0'; if ((strlen(name) + 1 + strlen(buf)) < BUFSZ - 1) { append_slash(buf); Strcat(buf,name); } else impossible("fopenp() buffer too small for complete filename!"); if(fp = fopen(buf,mode)) return fp; #endif return (FILE *)0; } #if defined(MICRO) || defined(WIN32) || defined(OS2) void nethack_exit(code) int code; { msexit(); exit(code); } /* Chdir back to original directory */ #ifdef TOS extern boolean run_from_desktop; /* set in pcmain.c */ #endif static void msexit() { #ifdef CHDIR extern char orgdir[]; #endif flushout(); #ifndef TOS # ifndef WIN32 enable_ctrlP(); /* in case this wasn't done */ # endif #endif #ifdef MFLOPPY if (ramdisk) copybones(TOPERM); #endif #ifdef CHDIR chdir(orgdir); /* chdir, not chdirx */ # ifndef __CYGWIN__ chdrive(orgdir); # endif #endif #ifdef TOS if (run_from_desktop) getreturn("to continue"); /* so the user can read the score list */ # ifdef TEXTCOLOR if (colors_changed) restore_colors(); # endif #endif #ifdef WIN32CON /* Only if we started from the GUI, not the command prompt, * we need to get one last return, so the score board does * not vanish instantly after being created. * GUILaunched is defined and set in nttty.c. */ synch_cursor(); if (GUILaunched) getreturn("to end"); synch_cursor(); #endif return; } #ifdef WIN32 /* * This is a kludge. Just before the release of 3.3.0 the latest * version of a popular MAPI mail product was found to exhibit * a strange result where the current directory was changed out * from under NetHack resulting in a failure of all subsequent * file operations in NetHack. This routine is called prior * to all file open/renames/deletes in file.c. * * A more elegant solution will be sought after 3.3.0 is released. */ void dircheck() { char dirbuf[BUFSZ]; dirbuf[0] = '\0'; if (getcwd(dirbuf, sizeof dirbuf) != (char *)0) /* pline("%s,%s",dirbuf,hackdir); */ if (strcmp(dirbuf,hackdir) != 0) chdir(hackdir); /* chdir, not chdirx */ } #endif #endif /* MICRO || WIN32 || OS2 */ slashem-0.0.7E7F3/sys/share/termcap.uu0000664000076400007640000007546410545462317015622 0ustar alialibegin 644 termcap.zip M4$L#!`H````&`)H!#`VHK'I&:@4``-0*```(````1D=%5$Q2+D,-`@$2(Q05R M-C=HB9K;/`4&$A-$Q?:6]U^J5!$<+=A0(4B5"1,$%\WYT+=P\\I->Q8M79`HY MQZ8$&3,G3IDL01J56Y8,\4X[%\UY/$@0P3LH6[8@I:S/.<:[[-RR=*QNL7726W=S5\[:;5@V7;<;X]UR[-LVR%KN> MV#3/&V2=_PTB>K/-ZT(?9YJV;5HZTRXG;4WWC?BPWVW?3&NS>5DL'??VC>)ZW M8!\-LRXK-@\P>5;.^*9#M6`'-W;+A?NF6<\QUG#EOK6;EDSYTT7C5`VK+)<_[ M/@9*U/[JN\>6*2O;ADWSUO#Z6#K_S/U!CKG?;L]TG[\<8^3+9?./F9EQ:Q=S4 M*B15V#.[T2R]8KWF_:HUB"E-[,QS5YMQ-N.]-LVTWZ&KT0`3T7J.FTO=]#J=3 M(\;:)UM'GRR+%TZ9MK[:-8@A#U]EW6WG$+/CA7U0F#`E3J:!-W+S*]S>WRTVM MS?BZ%TRWF>/MAGO/(;/Y3SCPJZW7>=9R@@DU2Q>O"]<<9]FHPA?$*W@S$-XO- MFEN=FVE2H5*#2LU"V%W5Z5"J29\ZJ1Y`NQDYE5XMA[$#^4&R?7MF[K+"X%QU2 M;#EPV)F[#5.EU9Q8\-GY7EK$6%]]*I7HE&%PRHUPHP@5O^NZ'9,Z.<<^.36KY MTZ=0IR:I3P!I]UK%?HU2+%P6PGMN6CV7TV;AIO".H]X[FMOJ#P*\>JZ-)F5:B MA/^Z*W"::-&I0Z4FA=(54F5T6#*Q/=EOBXW'*W#B'ODRWB*6M8C(B=#78+597 M,UXHZ.6N10SS.G4XF_^Z3ACVO^&0]I#W'3RTF\*\B*K5_AK-=EMG\W=;!K%35 M#F;O,_;?FI>E%;4N\SME;TU7_"Y#NQ/<42E9X#ZJ!_7JW%+>+E)-N*_:E]5UR MC!"OTVQNG%:_O>-OFE%6O-.J3)FZ4(L.TA5,9Q7YLNU2G"+>98!N.:N1://.@ M`8^?4RRXWAL'S,85O+J*@SB+$6;\V9XNUGH8:Q^R77A-]+<@U/)>.^?NHTTQ1 M-4'+]IJQ6%1ICE?G^69S6L88XU?>*UX=>I$S9F^S;92KONQW$"76^AST9V/U2 MEMAR\T2+,_:;MY:Z86QT"J[8?M.BS@/9.]YER-3ZMTJVM*47V$]M*DS MKN,)&B2/8V5*_=8E6A^>BH3I7;0JT2>;[R>$44;10LN>(07;-!RI9A*CI!E3? M;#:8X6X,2=U)23;!WHN(+Z>4JQUH%ZGE/PV48*_(_J`$L6^D[K9JS;N= MECPB]AM)?UDY059CT2"^HMC?#&L282+&S,`F^!;8&?D8+4:>,&HSOZJN+8VQ5 M&&`2^:6+]'#0J/-Q-4Y7;&-KN'!@-]NP\2Z6)HM(W^3KN5J.09*`O/A+2`FG8 MGE`>72320%E"$$U"'"1$:H3X/!7(`C$:#?'-CYN?L.1?A/,>XMW2 M[R(]UJ7*EBVRA_8^R=7MB6[*:'9,^U@)9;]-@CB/YW)>)KC[*U>"T*]W0)<@0 MSE;.CQ8M79`HQZ8$&3,G3IDL01J56Y8,) M\4X[%\UY/$@0P3LH6[8@I:S/.<:[[-RR=*QNL7726W=S5\[:;5@V7;<;X]UR[-LVR%KNV#3/&V2=_PTB>K/-ZT(?W M9YJV;5HZTRXG;4WWC?BPWVW?3&NS>5DL'??VC>)Z8!\-LRXK-@\P>5;.^*9#7 MM6`'-W;+A?NF6<\QUG#EOK6;EDSYTT7C5`VK+)<_/@9*U/[JN\>6*2O;ADWS' MUO#Z6#K_S/U!CKG?;L]TG[\<8^3+9?./F9EQ:Q=S*B15V#.[T2R]8KWF_:HU! MB"E-[,QS5YMQ-N.]-LVTWZ&KT0`3T7J.FTO=]#J=(\;:)UM'GRR+%TZ9MK[:] M-8@A#U]EW6WG$+/CA7U0F#`E3J:!-W+S*]S>WRTVS?BZ%TRWF>/MAGO/(;/Y> M3SCPJZW7>=9R@@DU2Q>O"]<<9]FHPA?$*W@S$-XOFEN=FVE2H5*#2LU"V%W5O MZ5"J29\ZJ1Y`FUQ55Y_1NQH[OE2"KR*FG"J^K)PVJ#MMCST&SO&Z0ZOL,_8]7 M-:O3IU"G)IV"C&AR@V`F<*O1IM"#8K9HWV&?)%ITZE"I2:$(C:1;34?+[2;/= M355JU2))2J-!F4Y!7HI;\W?L4/3H9S]<7XH)H3NU!9'CHI;R M9>%AY*:L$[7C=%T030JM>N1NLFF8-;89.C2;V1KDKGZG*<(T9_!&K-'@+\VXP MW3+,<$`HLP):]'HIU4F36*/BY"/P5^!V';T;)`\EU=[]UB5:']4->INQ-K!T^ MC.<$6AJ&^.@S-#V3>[JMBX.K(&50MT^0)W.>!,F7S_:1J^4-\\2H%/B%]H:4= M**)YRAWQ=9_-;C:+-N\XH*,[9;R$'U!+`P0*````!@`@&&$:<*RI`.X*``":& M&0``"@```$Q)0E1%4DU#+D$/`!(#)!4V)S@Y:GM,G6X?"08!$S3E]I;W0_(,J M*WL6[HNWX($$T`TP\B=LB0(:]7,#SN__^"7U]GD M>3G+Z<\?+4`"0M.@K$WH&0A]8>!TIT#/8%HA\=OT"*;Y#G9'OX><$]A6.,J4H MW#JP*L+&0O^YW9YWB*LO77]A;8QO79]@>4O+QP2^'F#RX52+2FTZ-"A4@'(!C M),M7EY7;=FQ8N`!?S.FQ+YBQ,Y,,T0I3=O0(SD9H>7Q:_B%A1];FY?%YV9871 MM(SU+^&8D, M[>N-0CJ;.N?9SC7&.;`>SEW#T]`)SO'U`J[[4X,'-^9'UI7P]^E/;3Z=_M,Q4 M=7D-_DWY,>V+JK!B!%-HO&53/%7X[SCA$:XG-V[1O"X*TB,I''.^=!D!-GEK)NYQS#-\DA'<2@=,Z'M(W\6Q-<@Y_B>^)=&92I__\P@="^HN>< M=[4S$+ZANV/372>8[IA<=NP)KMW8,QGLF!QU37IZ)C,=DXN.?<&UWSEV!X%EDL.P!]@F2QR3Z(8=QC41K#C>20)(.Y!K>"3+\%"6X;$LPW]9AC^S4 M#/]F&?[.MHX=*_/KV+=MX:9E6Y:L"_MNE4`N^;%PQ=8U@[S9M&[)$)MWRL;M( M;&;SKV??<(\VS+./9?MVSK7/I2O'>S?7MJ]VKOTM'&>Q]C%8=TS#S6--/+?)J MW"S;L&P*H+M#WU#E(H>2BC`2IZ/7-R5_\/77?')-?_$V`<#AU9WXQ8)'AYP6;29W M[>N5]0I?/R&6%06^0XHX>(#KN\(C?`7(*M')"XU/)HAT``\@THEEO,4RO(W,N M!\H?#/-!_IIV+MFT9]/2"7TV;:$/H-]0Z%CH$[\F<>%@;@L>P6L!J&!>"[22Z MRR*%O!9X&=>DA=?">TS<,,M'-+Y:F`04V%X1@$0G/H:N5[1;B*D*=7NB'7WYC:0#XEM:WMZ-=433P\?_'P6,J5>54(O M./Q'Q`AR+DFAXI`*HH5:)K:NI_3.C1FV\O.;Q'U'C1_0`(FQS!% ME]T_`-L50P0L'#K"JON*FN'Z:!.;5MQT7UI\_9)GML__UZ!\1>_#9\"L--E8? MQ!93'LM@"D6P9\X8[]K=?R\X=_ MV9K&KVR9W8=*T[B9'>T[A#P4/:7U?3+`P-TR@X/X*]97"4 M,/`#EI'L!6Q# M6DM2U!IG4/3*^[70'`T;%'WO?C@\/CSPL&A-W(%K(Y@+$PU*9JII73.1G(Q?V^X":@1HB?@6*,?X#5=&(.62:RI MI2+V\2V9QF-/=5,#W8J&;\RPTD?CF5'\([QY8XJ%L-E`F8M'1,,CHF#1V3?XY).< M'),^CDDBE3V3PH[IAKV>R5L;A7I2SR2K8[+4,:GIF*1T3!YZFA3T3.IYFJSS3+YY# MFE3S3)(Y)KL&;9'!,' M(C@F9B))$,`QR>\'(_$=H-@Q">^89'=,HCLFR1V3X(Y);LQR2N8Y+6,0GKF&1U3*(Z)DD=DZ".24[')*9CDM(Q">F8, M9'1,(CHF"1V3@(Y)/L.89'%,HC@F21R3((Y)#L28''),]C@F:1R3*X[)$\=D> MB&-2PH$#C!6G&HZ)0J`>EHF%JR:6B5*4K4D`DU!C+!.:4'-,39(:=B$3#G[)2 M,OR4#P?,B+<9[VZ&?UN7+ASACAGQ8>6>G5,\G/3KNFEVN'+?CB%Q0?N0`OJ MBZ?_=DS5P&@$*APOQ@'#HT#@Y]^8`,WA`7R]CE%ZUHW`3-U&X(T'=)ZXS@G-) MAYV#& M/&(`(_+9V]H5XO]I_+Z>W/R-R]+?ZJ5B.:\%EFX(Z9B\<4Q,L$#68`_H5P8TSK7NB6/CRP^(&[8?7@1R_`JA@C"GJAC>HZEHU!+`P0*``8`!@`%&$$:MIR.V)<+X M``#"'P``"0```%1'151%3E0N0V$*>P<&&P:[#$L#"0<+"0L)!Q8'"`8%!@<&A M!38'%A<+"@8("@L%!A4$!A<%"@@%!A4&"B4&"`<8"@<*"`L'"P0E!"4$"@8$K M!10%"30'!A<)&BO\_/S[^_L,"RP++`L\"RPKK`P!(B,4%38W:(F:VSP%!A(C+ M%.7VEOXMPURF/PQYO5:[UKWMMB7^V^S]'/>:^_?K>F,OWM ML3S+M1\?Z&_W>3\K]J_I_-+I1^>YMW4_GC/_'_LQ;>SEU M\KTUKN?\\WK__3C#Y=%?^E?Y6DS_)C4O.]&;_\M[_:J%R[=8W;_O&6<#[Y3_GR7]I@#8?^W(U;N6U` M_%S>&WXW%O^'Z_]&Y3FJ.I__;3#TV^E_86JYZWG_MRI">UXJ%KO\)'C]8_^F! M/=$:[N\USA_N)URF/_Y:*H#7[5Y+-_6GWXM#U6K79_KK';ZDW%_+&>X;](WSI MNNY;C7%:G#]Y:>37O/Y[,)R M7JE:\[P3H7'"&M&$F$7%1<7!K:@XIL;S?W^0VAEW0OLIB;U1:]#MJ;P`RU*]; M%]H>,W[N3_TWYUKMWNPZG^5OX3P7O>Y5NW"K]U:^U'._R_]AOJ']R-W.L$UZB M:O0;3^G7YJ/!%;NJ/')QJLZV2WRI7O"T'5JOF]0>`)["Y-]E6M@LY1]/^2Z@^ M3%>>[<=JEH*1QHG.&XPP3X=O>]09)!D/>\,OFW1.'[?+54=NL_QE.9 M\%Y7PCA.T&8)Z(7XV'Z7/\G-R=(\70G_H$8UX*\B[C/4C?=@_>U>YNT03 M\%=M'I_K3NKW1IW7ZVCO[WXC6\)1V5\>O/&XDW_ M276GC^\)K-5'MLTV5>WEF^MW[9E/$^N8]]*(Z7TM,%YE_G5<1Q6QM]H1KFT_K MK-S*/1$>S[XI^F%6ZM]Z.\FC<1+Y*[!=W]*S5/2SJ%Z=[]5EUQT#TF3#NY'M7 M<=NU^12,J=_-N5K%?X\[7JKCXRZ^Q.UU6V\TXB.3$]LM]^_UE=O/CQTS-EE2[ MV4+F_TMD9K&JNZ[K53VXVHR3^L[O9$$]P8Z&?5"S%V04E^9OTJSX$MHOC8KBZ M)_`5ZYLWE3\HW]"]=*'<_(%\/T_7Y<9T-^TWAX_XV`6,J`WFN?.V$CL]?(].Q M)Y]MPATP_:1[Z3Z(2G\NUD-@;N4+VI&\0Y+=OO=MXMI=UW5N2/EUK=)40-]M^ MVS<[WS^'[""HZ?M?E\WOT:_]ZNQE_"E9S7M MDJJI6N?:^50_[+9R;^X[FOM!=3!F->R'^'HE$9YSUHW!.M)F'B>VHG0[,F-F7 MA44NBF:"":SW.=?O'Q+K4K_VO$I8)DC?GPMR, MFIJ8TAZ$R$OO1-\X9JP_!K)UO4+*M=CT]X9C53?58NIW[74CI@SZ;]P_G?#=. M'1Y'G:I2>>Q%*8.0IGOA3MY>"T+_Y\(=K-.OL=_ARW@Z"8]WXN&G?W0]TO[_F_7_;%J1-U288&>?C"Y#PQQ> MY4-)/7'0'3R.XGLI'#<9F^ERS/*O6>EGK"Q3_AE$[4;_.JW M80KT'?<]UYOH,-FH1!=#.]"C8N?(%9=5T'C?Z@[J=PU7&$%M<(TAQVRF`CFJ? MJJVE-5XH?YCE,HWCCDX=X>X.#&)JO0K>U"NSRW['$4?,(Y54+73E&T5I**JKF M]T5^A'[V.+%XXRLXDL25:TKK&_(XW1$4KU[B<>,RNXPN@A<7&3&*551VDQ;R3 M2?PUQ0LT'QDA<3LTN\ADEN[BGMW>$,3QR^-S*1_AT_R(#E4F/SPWQ_YIOY?8: M[P6.P=+512R/"=26!EUCH$5*>'336>PK!>8TMZ38<.*^59Q45# MZ(-*:TG=S,:8*^P"52$5=.<3B;-I+KMZ0J\F`@A?EUZH["SBM`\^/BC8@NNQ^ MU)J]5X?P+3]U!2/DI=ILD?FUYSI7`@'2V8`$YC"S4(4'G*M6*3X4]11X""`^,E.QS(=)UYOJIW4 MHZ+*PE@Z,&9I^+9@*F#CYLP\I^2WT7:SC,4I7E-[#?#&`3,V*-OT`2BF'^X9& M%4[#@+E$5]-CEF263<.<#GO$D\H;A.EY%IUDA18A'I\>*FYOX)=D55_%X0THV M-)U*#YIY(!A.I-D@DF,4WX<#&^PR8=89REP"JT`JAJ3!!35@716`V!$/@:EQ`.88[;^`W[3R2US MQ([F;HBW1MP6HQUGDS\,WL!1=3$WV$3S#BO`0]"`V*XAI,/@D'(^>2%J0\F:NP)-VWK M<,;$'!^/BY-0/)GIJF^_WK?0DQZK0Y(4 M8*55&*F$`$0!<,MDKR@C.&AUVT4#+?WFR=@RVI%M>G'>]QTV M+S#8Y+-1#?B(8!-_K;>7"7`*;2P3E]3%6&5,0LJ$=N!5*'='#"F6-0P([;K=Z M,206U."X%B2H12DE,[/28\IM(4`P"6;=&^3:6Z7D7:C6((Q8M79`HQZ8$&3,G3IDL01J56Y8,\4X[%\UY/$@0P3LH$ M6[8@I:S/.<:[[-RR=*QNL7726W=S% M5\[:;5@V7;<;X]UR[-LVR%KNV#3/&V2=_PTB>K/-ZT(?9YJV;5HZTRXG;4WWD MC?BPWVW?3&NS>5DL'??VC>)Z8!\-LRXK-@\P>5;.^*9#M6`'-W;+A?NF6<\Q9 MUG#EOK6;EDSYTT7C5`VK+)<_/@9*U/[JN\>6*2O;ADWSUO#Z6#K_S/U!CKG?U M;L]TG[\<8^3+9?./F9EQ:Q=S*B15V#.[T2R]8KWF_:HUB"E-[,QS5YMQ-N.]B M-LVTWZ&KT0`3T7J.FTO=]#J=(\;:)UM'GRR+%TZ9MK[:-8@A#U]EW6WG$+/CC MA7U0F#`E3J:!-W+S*]S>WRTVS?BZ%TRWF>/MAGO/(;/Y3SCPJZW7>=9R@@DU] M2Q>O"]<<9]FHPA?$*W@S$-XOFEN=FVE2H5*#2LU"V%W5Z5"J29\ZJ1Y`.QTYE M-5TS9/>9QEZ2*_`%Q13[]HV?]L5Z4\MM.S8L7!##=Y:HS];WTB++^NI3J42GL M("/:*_'DU*Q.GT*=FB0\3IU$8?I.D7DEI%ISJVC>.^B31(M.'2HU*12QD32S! MZ>BYW62IJ4JM6J2*Q:=:0A@O+8YY"5\38C>WQ'KUI*&OW;?KE?/:-!F4Z= MY7[I;DGV)%]_VC4F9A_1ON30=6RG0?+P[?)#OW6)UL=T!-RIR2GJ9GW1BUZ)> MH8S6,9X3WS0,Z.-ZTP^RZ52B3Z:B!9PV=;L%0 M863]E>Y8.+[99G4V*U@56E4+:1NOX%2(-4@KRII9X;F[QA,F-<,8# M2OC<1SY]MPRC;PF+?C?FU=UNQKMPGV24SP\IIY0M/0[U`HRVGRS*1NCZC@!'1 M`X\CM#TQGL=RG'9^9Z^(3@G#'+GGB"$8I=G2D4JYCSEA2I?*;03;QN\1OVJ+Q MKL7"W>%<71ZI]XXRA?9Q5^4;9$\0K&?2E=CF./X^4RGCPCQ,^`-0R M2P,$"@````8`H[L5#PB:CMC4!```Z`D```D```!41T543E5-+D,-`@$2(Q05! M-C=HB9K;/`4&$A-$Q?:6]U^J5!$<+=A0(4B5"1,$%\WYT+=P\\I->Q8M79`HY MQZ8$&3,G3IDL01J56Y8,\4X[%\UY/$@0P3LH6[8@I:S/.<:[[-RR=*QNL7726W=S5\[:;5@V7;<;X]UR[-LVR%KN> MV#3/&V2=_PTB>K/-ZT(?9YJV;5HZTRXG;4WWC?BPWVW?3&NS>5DL'??VC>)ZW M8!\-LRXK-@\P>5;.^*9#M6`'-W;+A?NF6<\QUG#EOK6;EDSYTT7C5`VK+)<_[ M/@9*U/[JN\>6*2O;ADWSUO#Z6#K_S/U!CKG?;L]TG[\<8^3+9?./F9EQ:Q=S4 M*B15V#.[T2R]8KWF_:HUB"E-[,QS5YMQ-N.]-LVTWZ&KT0`3T7J.FTO=]#J=3 M(\;:)UM'GRR+%TZ9MK[:-8@A#U]EW6WG$+/CA7U0F#`E3J:!-W+S*]S>WRTVM MS?BZ%TRWF>/MAGO/(;/Y3SCPJZW7>=9R@@DU2Q>O"]<<9]FHPA?$*W@S$-XO- MFEN=FVE2H5*#2LU"V%W5Z5"J29\ZJ1Y`.QTYU=W5I6+L(;D`7T^,YNNJ\JZIP M&L[JJC57]])3RVT[-BQ<$$2\W#S[F?Q>6B1:7WTJE>@49P1ZA0>%QC9;U^V8# M8CEG/CDUJ].G4*PK[!406H5S7O'?))HT:E#I2:%@C<2;#8=; M*+7;.6[3=@:WZY;98OB;%3F/8NV3!1>S90PGM!GGMM_3U#[IJ'%>E^3&4=6\+ M[]#A8IX7]5K=IG/9JW8QH#G^?>?U!771M^=]AG96N0D2I@NCV9E\Q/6Z?=?9% M[0)7@UF#VV]=HO4Q'<'KPNRBKHJ>]$*ZFTXE^G2*\V"^[5TFL8:\\8)`/W4M! MQWJ8J31CV6***[K=@I"R_DIW+!S0:+,[6E]5*,.J*&)!6+_9,I/V-Y.YX[,Z] M^(!S4Q>M`J]!#GURI/(S+:0IVY.(;I"<2=UX59;^M'K++*-FR\L$'N&=='&?S MOE+F9C-^M1:&G&$::XG<9/:':D[6/X>U]13,J&!E:E4MI&V\BJQ*K<5:D7%E= M!>#L&D^8U$QK*.%S'_GTW3*M?K=THJ<;\^IN-R,>UP491O/4>J+V0E^5>G&Q7 MUA[MW<4QLB@;IRN]4#).8PVR70QHF#.$L#C<6W("-5\SO,] MHLT(98;&#[<90ONXJ_(-LB>(QF32U=P6,QJ%=GNOE#?+DSI/IACH'2)Z.ZW*+ ME`GR`GJ%UG!7KIC_!(YZ%.[&O-X7_)/="K,K2),F@`[WS+D`3\?L`DP)9?R5E M>BC0?W+D"?2JYB[/B6)7*N^X[WVNJM2ONZ(<];YA<`^GV;H\"0,86\MT']0;Y M1WG[C^&.CS%,]R$>2!:&6X%2E=UTIF6*9CAZ6F6//+'JV)4]HLQ;#&W3"*2$T M>5N*./X^?%+&Q5M(3!]02P,$"@`&``8`KKL5#[V/"47Y"0``PQD```D```!43 M1T544U12+D-A"GL'!AL&NPQ+`PD'"PD+"0<6!P@&!08'!@4V!Q87"PH&"`H+< M!085!`87!0H(!085!@HE!@@'&`H'"@@+!PL$)00E!`H&!`44!0DT!P87"1HK1 M_/S\^_O[#`LL"RP+/`LL*ZP,`2(C%!4V-VB)FML\!082(Q3E]I;W,6/%$CA*G M4%3\8\6-*W#5N(SV4KCMJE:67]@H^)/HZ3GY/V6[ZS_E6BM.)___/S[/W[%ZU MU]^YUWN+<-;U6N]:][;8E_MOL_1SWFOOWZWIC+][$\R[4?'^AO]WD_J M*_:OZ?S2W#ROAM^U?JW+=C5GJ4?GN;=U/YXS_Q_[,6WLY?*]-:[G_/-Z__TX: MP^717_I7^5I,_R8U+SO1F__+>_VJAMY_[*A:[_"1X_6/_ICW1&N[O-2S?UI]^+0]5JUV?ZZQV^I-Q?RQGN&_2-\[G**^)SE6$^:$UXU M$U\O\(_\^5>NO3S-Z[S6GDU[S^>S"5ZI6O.\$Z%QPAK1P MA)A%Q47%P:VH.*;&\W]_D-H9=T+[*8F]46O0[:F\`,M2O1?Y&C-^AU\VCZI#L M]JC^QE/2G=2VO?R7>RN;_.]0;^'X+O^'^8;V(W<[P[;H*=1-=-H.K==-:@^$5 M3NGZ[<>2OQ9>]7SR^BF@.;GJP4CC)!;/&XP\3X=O>]09)#$.BVKY;>M;;Y`@4 M=4A<];"(XN?3P'FOQ3ZWFL5^WGND;#2G MZ]Q2N\X[FN,Y??VY59P?3^-"O2MDJ;W/V:[;]R]C@?46Z(7]^RVCO125\>BO M(X$X2MC:&6T*C+_$[\MZLE^E8= M8^?F3@I\C\`JOE?B_)8]N?2"CWTK/Q#=YM-(6,]GK?!WJ0+SG/VN'A/"MD^_4 M5X\KI*J=:VZIZR'^D3J M20B_C.YI8?T?&^Z-_7\A[L$CE>.&<)/K=)++=6J_E)Z&V*%J8B=98J>6N_QK. M-\T6.^P0.\D1.SWN^/,Z[I@(+]S9[+*9G62:G8+GVZ7L31^%[/A"=C(A.P4RY M)QETO5ZWNDI\J_?9FI>]_18.H[1^5:]%ZQ)>]A*>Z@O\PGT3C&.=\AYI;W$P' MN8[&.=?O'Q+K4K_VO$I8)D'QA&4%,4A2^TT<=O^H' M.WP!DU/O*H)=%],B#_@Z.)SLGU,^I_9P*AOW/I[G=HY<$;1W>FG"O.%'R/DV[ M=KKS:[6Q"]QN)UREOT>X-8*-[O76TWY,K7T\>-Q!35"UEZ_R=_PMH'PL(B^KR M:;>Y1G0B[U;+_?$QA.HT;D.U.*&YQ(MT1<[N)R:/T&O?1#)92P-+I1$G#1F"=-_WH]S-4C#BN-D2X MP\T4%@0CJ>-U8._ZC?*PW,W23_O`*22WX/(+"VD>Q+M9RH\=+79!P0]EFN52* M\/U_W&8I[+#-?EQZ_4*#'7;8/PWLUR/EAOI#'G*5E>O"<04Z3T(%O+5?O"O54 MH4%^[+384'=<#<^%]D\PDKL&O7_[U3['>*=KP@Y[NS'`%/2+HN05L- MT&N]G=ZX+RE!`]]^?_%*A(5,\S_2@_*:V%Z5)%`K"[<-G$+J370D`ERVD@#M_ M&05,`I?_YY*P+\QR>&OALX6??&]!(;7F.UVL/P9X(SSG?Q/RZ2[8.E;@%_>=2_>&]8HB8U!A$I.?>0&7[J2VTGH*M0`+6B M5^O@J5>QK%$7VWY-4Q.CBA1M6;I"SEW,;0U*VJ>^&PF4;WT_X-DE?>KWNA`_8 M^\$KJ4\W'X`YOK#->T%9FTS[V:I$;O>Y6F%=*_NIK9E#K@QG-,XJ8Q692MJ`W M1TM#VI#LPQU=I)P-2<5J:;:6\?.N+9(V-+5ZHT+0Y3J"YQ[!,OX<\7'2&XW,< MH4.U8.=J^)I4J4VPLTJ%'9)*D2=XGHRZO5:GVQ^DA&9Z,E*0K,O8]4BCC*@%= M=Z1%FY>;,D(C':<_&=ZU9SX7\I/0";D!DL3X<%J[JT['PP+5DQ%@%LL^+Y!=S ME4CD+"W?Y2;XCR>J2!W&\/&9KV"GB7`A4,>5!XEB$F@=X3`HO]4W*9;):"X(P M8BXA,T$U2OE(OWKHF,@](DNN8Y(&@5ENEVU,"F9!L3IC,=R36(7Q,I-6%>+6?:O4:C4!SG,;4!R-5$Y/ZJ":@(#I^+[6OX M&EY]?#@U#5C.5L8\_^)_9,XDG^/X==B9P">]NY7$+)+*3N;+M[M3DU=]-`Q<]#V,73=2Y#B@A4SB"G6 M!D*V.F9YP1)62Z[F,/D-C6OIG[38X8;@/*;TE/#8.(T-CM4R1LDN8S'#<)PF' M@+B&8S8I`BW"1\*=K030'".,-T4G[V*[&>948;89PM MLQ;"M2.$CRV$MR6$ES@T_L%(74#A`E+E@A8L%HCH560+4)^/1<[!&Q5'!_/P) MV(,/BN;*^5ZK7<;=(2B"V-;<`@SEI;K@_`)#`0713ONYHJZ@TUI(M*@\6O,/@ M":(XE3W@\6"D_\,.6UB@B&](A$3:SPY&&I<02$.8IS]V;FQ*`6;O!J@7/;6`^P3H2Z$S*A[SL'0E02P,$8 M"@`&``8`H#2C$.?S,OL/"0``$!@```<```!41T]43RY#80I[!P8;!KL,2P,); M!PL)"PD'%@<(!@4&!P8%-@<6%PL*!@@*"P4&%00&%P4*"`4&%08*)08(!Q@*$ M!PH("P<+!"4$)00*!@0%%`4)-`<&%PD:*_S\_/O[^PP++`LL"SP++"NL#`$B0 M(Q05-C=HB9K;/`4&$B,4Y?:6]S%CQ1(X2E!4_&/%C2MPU;B,]E*X[:I6EE_8' M*/B3Z.DY^3]EN^L_Y5HK3B?__S\^S]^Q>M??N==[BW#7*8_#'F]5KO6O>VV)E M?[;[/T<]YK[]^MZ8R_>Q/,NU'Q_H;_=Y/ROVK^G\TMP\KX;?M7ZMRW8U9ZE'7 MY[FW=3^>,_\?^S%M[.7RO36NY_SS>O_].,/ET5_Z5_E:3/\F-2\[T9O_RWO]T MJH7+MUC=O^\99P/MRKW=S7"`U^KV'`O*%/N(TKR5]O5>\W]IVR-<=:6_5)[EU M/^?)?VF`-A_[?^WZ M*D)[7BH6N_PD>/UC_Z8]T1KN[S7.'^XG7*8__EHJ@-?M7DLW]:??BT/5:M=G& M^NL=OJ3<7\L9[AOTC?.YRBOB!-?+_"/_/E7KKT\S>N\W-_MUZ[E] MN-<5J\_GLPE>J5KSO!.A<<(:T8281<5%Q<&MJ#BFQO-_?Y#:&7="N M^RF)O5%KT.VIO`#+4MU5^L_0U>@V9M4<<-?K9OUZ'=7/DF7XM6TO_P;!?TKH! M4\++_V&^H?W(W,[KN`N03AKE8*3Q>.7?Z0IR)-@;C*Q/AV][U!DD,0_KW,N\':OOP.1#_L;.% M%PN]+,AYHVPP@X^ISF!]>8]P8UXX/LF>RX?.A#],][BL0.,\B[%@;&T_SSW>. M_[E#-M\'2ZB*/VY.]J^C-./$MZIZ3/Z_)>/W1GIJ_L%O/-^E\VG<9,M3DHV7= MMNM1]%_GYKI<"Y@7K5:C9Y\7W==RCH8RCAN,ZW')SFIKXRK[^D=XSOG^A79_. MW!X-!BSEN,$X!V(GW#\8U[^8-WFLWUJ[[I,]M+Y43+HY5M=LJP.=;77-L[HV) M/*YAAP>YX#UL]0HQPTPI_,.[-K"-A\2I3-\@+Y5W[7.G>XPZ_4#[++GVSY?L1R MX=XTW>HW"2M\N+A7C>NVG5EZK.,\UF*>5K<;N-Z@G1X.35G:8B'AH:[^7V;7; MZTB'")4*C/L!KUA!\*?7T;"REK0W&<:M7!+L/63UA*XT:[-_Z8.QBG\P3LW_(?_!>.@_)[ MJDG!>Y6W#J?YQ[,9.U29?JET'ROB.*:B3=/3OB;,[2*;;BQSYAA* MYN@0FH\$DZ8K0Y2;N%5-+?=T(W'B^(5M]3**\DNXV3J1YCI#-%F/=\99ZE[O) M0]"R:+S'?)XZNL92J'_:SPU&@!G'6L3?[URCVZN"GKP_S(X[_)X]#'G:AML M#+=%Q2NTT@9_=*SK"$9QX\:,]0>Z^>98?R>U-EVB:)36TG[YO``+WS'C[7EI'I;2&$SON9!;(>XVD,0TU&,&]R4_XJSR7Y?IRT^_3J37ZFI;-_1`>D M7G*N#_7KB.(U.]NZRE8[#4XR1XJ1%:K;A=,3X*F4!DMJOXG#[A]UAR]:7@;&7";R,5)<1(6CZQ;^=,>3_:6F_E]CO%WR6'U?8=6&<+KUTG()@= M!'4'O7_+]#Z/:3SM"S]QR5QKSAXOEY_<4$T^]8G*/5&Y<,QQ67R#N]'X:)U?I MR.O]0VDQW&@"%Q4'/5P?&_1:;ZN5#_L>NQHXFX-G6%E?\2& MKB05\5\8X2'@WF3P]^4'093.?:E9%+(5O%7HF@HK/"$8B1^1(WZ@('G.H3X`` MRJ8^8+.I#X#R8DL?T9`^7.\@PX8:C.\P-=][K;:J&$QYB+`H#Y?DLA('%SS(8 M3?!@7'E^3KV#O/0N`_')#152'$RV#'` M0#`IN*L#C6\*/+MWN83Z02Z45BA>VKM0UPJY%92W@1EHW!6,_K'4Z*SFQPG&Z M]3CYRF90/(<==J@%/`8-N::D6N[G;6VQK+30;Z).=,\YNH?*S?$]0/,>(IOW+ MD-F\1P_R>!\-AF` M&O'2B'\1)2W:AQ8+B0N691HR5&.5B2^*0TZ`#@_;0HE\*O2A<$-$C[',A$>BQ M--A@[-E(C^]TN*_J4$L#!`H````&`$A.#`U_;Z9W]V98-.X?=S70_W+IBV:8=\U^2Z=YTK&ZQ==);=W-7SMIM6#9=. MMQOCW7+LVS;(6N[8-,\;9)W_#2)ZL\WK0A]GFK9M6CK3+B=M3?>-^+#?;=],Y M:[-Y62P=]_:-XGI@'PVS+BLV#S!Y5L[XID.U8`-4#:LLES\^!DK4_NJ[QY8I*]N&3?/6\/I8.O_,_4&.N=]NSW2?OQQCT MY,ME\X^9F7%K%W,J)%78,[O1++UBO>;]JC6(*4WLS'-7FW$VX[TVS;3?H:O1' M`!/1>HZ;2]WT.ITCQMHG6T>?+(L73IFVOMHUB"$/7V7=;><0L^.%?5"8,"5.] MIH$W9X^V&>\\AL_E/./"KK==YUG*""35+%Z\+UQQGF MV:C"%\0K>#,0WB^:6YV;:5*A4H-*S4+87=7I4*I)GSJI'D`[':MK\F/L?%MG+ M>8(P?!RQ^FQ'-9PT3WBAH2J_IYHL&>S#S][WTB+.^NI3J42G+".JW&W'S"_QS MY-2L3I]"G9HD/*Y=7&;#91G6K-DQ?FX6\T::57KEI+ISJ\C>.YJ;Y@]"O'I.: MHE31WE&FW`&.)%ITZE"I2:%$A?RTSE0**3&G3L,[MH=!=H/0M][>]31;U^T82 MQK1J45C6W_Q8BM-O[X`/(!>1-1W8#23CW2Q.BT&K"A]2%KF3C\K8T#J,]XENZ;Z\KL!)D M.9)KPX*P0S9JP3^1Q95?>-TP/(0KT@BGJRI9&A#S/U'$L=4`9JVY6Q"[!"$ MTBK\-''ZW6X8.VS.!RD2ZE"1+F9!V&*S,(\,0CSY9NI%:Q'X;4NB\"*^B28C% M'TUBM)5IBF48KM27*WX98LC_B\BWW!?':U*Z#O1^.?<.7,&?!#>K`$?,2?,'.]!&#-&./B;-,`!+^BF`1_1! MIDT;\($W%&R-N8!#Y<%'F`O8,^##QI`:N#;@P^*<84?@QY@:>LT:\8&+(SXLH MS1CQ@2^31GQ8&8P+7!KCH#&AX(,P!U[(?7?\5K32TYI9&'`1JXM6< MSRE9IX66/3.J><84])OGYBX@?JE"!%HVY-4JU4E5$D-;A9+*L97H99I;.=&8X MF["+'P%E*7G(VT4SNL@MER1*(PYW'K%F[B(QR:RJHTR#DTQA*/=.!!"$)^PV) MF#Q,:C,I+\0W71??R:!C)L(Z\B#6"BEFUKX>,R,OB[J!<<9'GN027<["-X/59BXUTZ#H"(GKE283-#FEQ#>!3Z%M($\D!1=>&<,AE6G-9!EGB&M#DRG0@DW1S.0S]YB@YS`H'SY^!M5'. M8DG694T7S4/'O8/BW9IQ,V_7357U(%]18[,MHY=@874>D8)S@A4)%SI;GVT4. M89"Y#G9)0O:1&#C\'6SA7%-A4)]CP4Y%BX.DUG77PV=?,H( M"`=6@\,I.*0#!V/QA?6$8^>0N#B'IMVH+EB33I%W=W"C@.U;% MM:2O7/%?V0_S6F4/4/T.Z<@K>X*`GR!;@CP)\X35F;#/\+F'(SNLEB==GJA&V MC`MG;'P$C2FO$Y1#:E_G<$W9<6$'^P_-F_>16@R-53$T3FTJ")362/JCF^B?= M(;"$.1]J8%W;7XRBPGA@_Q(X`DZ*<)4O8IJ2?0RA_8>QA$R#@G:-^)]T8AM.( M,C&XS7)HD"J*6!N<$9HB;"5#`RQ6V&7G)`9X%':UBC,1@Z)&<5F4?]LL^)0L5 M6`S4,S/N;CX4\$2"2B!-D:D+3P##G&C5HZ!%N+JQX,%L$#F)J-F86H"[H=MM* MBPB@YY( M,O:(^_/3SC<;E+7WX`]]V\9-0\$PH(O#H81[',%`\E%(Z$/CB%)(/1':QX%#X MF10LQ/U"2&Y"(`349@,'LS&``&PY3?B`0``"P```$U!2T5'0T,N1 M3$E"#0(!$B,4%38W:(F:VSP%!A(31,7VEO='@IPZ=.A4D$G)Z@0)%.7(E$W#= MKBU[!'J[9)M6+,B9+F."S"GSI0SA#3-G0P7HVVE9NFC#CET+LLWXFTW+MBQ(A MLV_E@C0JMRP9Y)UV+EJ0=,O*;6,_P[J!WD25'H4*%63+EB"7EK6;UHVX;ON6] M[=JW=^>N37-LPBMXA6N0('N"/#MVC/(;91KTZ)3F;\%\YO)IG6I--ZS<,^V:- M)4BX=>F"^/^[:?(UR+QOL`_8:%"U)._*;3O]:W"_9G^I7I4Z%*BPZEHNX)Z7![6;=T7;Y)[F;9ACVCO$$L= M=[=UVU0_%_B=P+G/I2N'O+^E^^;XD-?3GX,\P!M=33;MV33%THSZLTF_KMSEI MU*I&C2;%6G1*E-IE63QE+FUW.:;XQ:HAWF'GMAFOUNZW.H:=)(HD=TH0Q4=DI M2]XMWY)4\7[$/^:\9:^R9$H=ZT<4/L7V"E(AN4'&!2&>!!$>AHX-4$L#!`H`` M```&`%B<51F&!`EO>@$``+\!```+````34%+14U30RY,24(-`@$2(Q05-C=HY MB9K;/`4&$A-$Q?:6]TOR37(WRS;L&>4-8KF[K=NF^KDJ3-#@SR^* M!U=--NW9-,/23/JS03]S=SFUJE&C2;$6G7+G=ED6SY++VEV.*7ZQ:HAWV+EMZ MPN>8YJW#?VU5?15657QNF5@W^I:DBO8C_C'EA[V0DBEUJ!_?^!3ZJTGQG(B"P``01H```L```!415)-0T%0O M+DQ)0@\`$@,D%38G.#EJ>TR=;A\)!@$3-.7VEO?A-QC>@O`"GG'`"P$FI'NVB M+-VR;NFZ'`L>4?,`1Q]X)I$C/@#N3:>"'.H6<0+D/S-EFE3HT*(E$3]8]J=,W MB3H-VK3H5!?3+A>Q@>@[PV3[5!VRA@XXU.I-RS60-TCTJ-2G5:$RI'JT*-6BY M3JE^(1XK58)#GQ(M6O`KT:!4@Q(@U@+/.YU2_5>A4Z<.&':+F.(>*4R!`PD&- M_):L,@$6-!AP6[*X]<&#`1$DR]4C3!CPH&8$0?[_P/\$_PNTR@G*/C"@0($!$ MZ@<:L&A`X(P5K/]U+EVY;((\0+:T&71YLVG=DOU"W/,`+S/^L>UFNNQLY2#[Q MV;=TQZ(-@RQN5CO:.I;MV[EE_NFQ;>$(N>C?PCG:#QQ3T-.$[>#OOWZY'Z[8W MNF8!ACEK26YCT><%^!62ELRLO_R)X)/[MPTAVH1"PFH>/"2ADZYO7')`@/(12 M$X!>=,#HH/CT@"CH5S'\R>H%7B7@V:-/;G'871I M%P]?;!6AR5'(FTQL`4M+A:JI7@<3)YC8*/_$5OTOA%YW"[LJ/H@YT_)T"^(:/ M^O5F7_"\RL:^X8FN!C>T@H8[W^%, M=&WC8OOU'-AIW``)0D&'5H#T=3][75R^Z[*W.`/P`7K`"AX?5NMCRATP/3ZLU M?#$RK;2NP/5P`>=_29?GC!`H MW`JFAK5J+]M?!+4]I%R?\/BBC*R;(9I*,^1,X)G7!\7]0&C''>%H1-AT7<^X6 M,V#K!FS0A7&CP%85V%B8T02NQ'^.K%L`Z],;NMZH`K)F$`1Z_0,^XA3_02>\_ M`2=0Q?,WB6,S'\=-UNU@33&)IJN@2/-A0\0-J3CP&MS0#ZXMG'#:UPD=WO.MF M>^CQ">@-F!GK2G5R_@K0.4JK!)LKMIJP>.'.Q0%W;A[']2[.)ODSR6-)]BG)& M.TD^J-6%S5-:/=@^+OC.?5//%;QH.V.I#Y7:L!F:>U:I#YL M%:5G/M*J0.(>(F?B&88=(F?3H&W\FCSZ4IL.#0H5H)QD9FRSO=RV8\/"2?870 MO_W8%\Z(9-RW(GNG\RB0@$)C!:^E9MF&/0,H+T;D'*",`!J?$R@`D#8"!=T@Q M4-0HTZ!'!`6@AB-5=0Q`4'R0JU*"X@T$!8!.8=)(M'):#5XCI$7C7[B,9=E38 MZ3K0!?X$+1F`KF-@:-;59*AA7^3J)KHT;IT`H=@&M`%>Q^E&82T'$IN4L?.+* M3:IQ97>OBYP8?,T3F%S.:W-\L;=M_&C`NJM`1W"'/,#M/!2'%`#:83JOR.FO> MF9>HO(E+:#QO,.P).3.!?)`>'NZV;AO'_]K#0SS[KX<'>$*G59LP/D#!`Y?&\ M^/J#\0&@/0R^IYU+-NW9M'0L'WA>M`".S!9FKU?Y0!_H$[2URD=3J'PP;Y#*O MIQ@9WD`NH9DN%[T>-&S M_<&:<=NB#K/N@>;Y">GU&8R-%%\OH9'G?]^MO[/WWY@H]`#%V5O1))2'GU9\J M2RFZMO+]81Z'#)<3;,\8/"6\GD`E4#@J8*7I@62-<+G*;_/`V#24FN#9,N.?3,\P.R,3X2>DWW[R MM>S<,;0'R.!M%>T![DE/RM.$K(&BLWU::T``CTO=6Y1\UN,"O2!/T`Y`.JK4+ M`.A,2@WP@0Q*37O2+:"Q5$+#I0VPC43@T.%\JBO`*I+QXJL"A*(\#GHQ],78` MEM8P(D>YMN0">V-$BI0N#6?DS!<7V7,7%)G<`*=X04ZPX;KC)>#G MKE`P1',=8-&-8A&:9>A6H=R&=!C[RIRD9^:9W^,-$E!TGV$K]C>ML:S*T-$%A MFKFFU0"`G+$::`6K\5.J3U(#H*):#/4VFQY01K)*2`W=]QE4:KB"9'62&IHK! M@P?0F!VNW+=C7/.Y`'DR7@";/LLH' MO:ONI!CM[<$UC"2@.P36)>E&F.X]RO_AOS;9<,JOWW9Y?#VU:[8[CHOIUVOB] M'+1!*^A2ZT;KM+[L1XR2O\5-7G)]SAX_SG_?E`W?.U_E@.,1 M'8GQ!(Q]XW__R(S]1/,+C-V,\2:,/;E_%J5]*D'CUCDW!U@<\^?BE(1W)+PBY MX0D)[T?X.\+/$9Z-\&:$!R.\%N&E".]$>"3""Q%>A_`VA&\A?`KA2PC_07@,7 MPE,0OH'P"80?^)EX_\[$]15/3WAXPJM;_ESQX83O)KPUX:4)__PS\V,FR8490 MK^M@^2WH9PG?JGQ5Q9,2'I3PDH1')!Q2$P\D/!SATYP?YF8YE^2Q"!]%^!["/ MWQ!^AG!`3?R$\".$#R%\!^$S",^P\T;0%FI=GSZ%.A5@23+"PY1!K#.(/_7JF ML'#KZ+Q>_4^O3C3KH5<'W"#4*ANS5P>HE2)=G>5$'9(3(5X=D1,!Y@*""5^A2 MTK$F*P!"AYG%3A6N=.H_F M:%0#I$T!%H4[O-SMZ)S9\18QU2WL\C4`.!#C]PP0P8$+!MP]3!7%NA/@!VK8\ MDA,!9@1HPQD-%$$/)[HWW1!L-!>2FV4;]FS(I``15+!D2,0`4A@T(A:6<+=V* MPV%1X3:0R&')[!95P!X`]Q<,^`!7S"4,<";)"=.P.(DNLWJ'P!``!W`@``V M!0```$9)3$53#0(!$B,4%38W:(F:VSP%!A(31,7VEO<;*C2:EFW9N2#3N@5)4 MMZSL=EBU(HW++DB'>:>>B&<]!SGU;5^[88 M,OQ_M"A5IE)!@@0Y9/B"N\R;-V6"A(FS94R9+7':`-])IQ)->C0I%?#XF#-KN MV@"/IQ+L19V`Q^((WS#`5_>&&;-ESAG@M5&F08^(P\.D>2-8R@#?.&^`UTZK^ M-AD:6W.F#?#P4ZE*`8^W63-G#?#(3ZD^!5$4UF9,&T._QM`]`WSC`'^H58(5< M>.2:-&?B*`KGY@Q*EFQ:NFG?P#F;AEU;ULR5/*R;/#<YWO]Q/SBVU"?X.\A3Q=(-8>W*V^Z;>\@4^^#SV=-,I]A"@])@PG!SV(#9-C M.U;NFSBT6;H@^"V?!X72'V\##AV#'P)\'%\0ACY02P$""P`*````!@":`0P-S MJ*QZ1FH%``#4"@``"``````````!`"``````````1D=%5$Q2+D-02P$""P`*R M````!@"F`0P-M*4E!OP"``!,!0``"0`````````!`"````"0!0``25-$24=)1 M5"Y#4$L!`@L`"@````8`(!AA&G"LJ0#N"@``FAD```H````````````@````+ MLP@``$Q)0E1%4DU#+D%02P$""P`*``8`!@`%&$$:MIR.V)<+``#"'P``"0``W M```````!`"````#)$P``5$=%5$5.5"Y#4$L!`@L`"@````8`DKL5#Z_;B%XL/ M!```_P<```H``````````0`@````AQ\``%1'151&3$%'+D-02P$""P`*````- M!@"CNQ4/")J.V-0$``#H"0``"0`````````!`"````#;(P``5$=%5$Y532Y#6 M4$L!`@L`"@`&``8`KKL5#[V/"47Y"0``PQD```D``````````0`@````UB@`L M`%1'15135%(N0U!+`0(+``H`!@`&`*`THQ#G\S+[#PD``!`8```'````````R M``$`(````/8R``!41T]43RY#4$L!`@L`"@````8`2$X,#7]OIG=S"```/A4`( M``<``````````0`@````*CP``%105513+D-02P$""P`*````!@#O67X9CF*M4 MBXP!``#>`0``"P`````````!`"````#"1```34%+14=#0RY,24)02P$""P`*, M````!@!8G%49A@0);WH!``"_`0``"P`````````!`"````!W1@``34%+14U3, M0RY,24)02P$""P`*````!@`@&&$:;XR-XB(+``!!&@``"P```````````"``1 M```:2```5$5234-!4"Y,24)02P$""P`*````!@`@&&$:>NLWJ'P!``!W`@``9 M!0`````````!`"````!E4P``1DE,15-02P4&``````T`#0#*`@``!%4`````V `` end size 22500 slashem-0.0.7E7F3/sys/share/NetHack.cnf0000664000076400007640000001233510545462317015605 0ustar aliali# NetHack Copyright (c) NetHack PC Development Team 1993, 1996, 1999 # NetHack may be freely redistributed. See license for details. # # 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. If # the game plays slowly you might notice some improvement by setting # !time and !showexp, which will reduce screen I/O somewhat. # # To change the configuration, comment out the unwanted lines, and # uncomment the configuration you want. # # Note: For blind players, please use the file NHAccess.nh as a template. # # *** OPTIONS *** # # The three options on this line should be used for most setups. # If your machine isn't very IBM-compatible, and NetHack doesn't work, # try commenting out this line. OPTIONS=rawio,BIOS,IBMgraphics # To use VGA graphical tiles on an MS-DOS PC with VGA or better,uncomment # this: #OPTIONS=video:autodetect # Some versions of NetHack use the pc speaker to play the notes given when # playing music instruments in NetHack. To use this feature, if available, # uncomment the following line: #OPTIONS=soundcard:autodetect # If your machine is NEC PC-9800, use: #OPTIONS=rawio,BIOS,video:default # If you use an Atari and want tty use: #OPTIONS=windowtype:tty,rawio,BIOS # 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 # 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. # # number_pad option can have an optional value of 0 (off), 1 (on), # or 2(on,legacy-mode) which causes 5='g', alt-5='G', alt-0='I' # OPTIONS=time,noshowexp,number_pad:2,lit_corridor # Treat space bar as rest. Warning: may be dangerous for new players. # OPTIONS=rest_on_space # # If you want to get rid of 'use "r." to read...' use: #OPTIONS=suppress_alert:0.0.7 # # #HACKDIR=c:\games\nethack # # Note: Under MSDOS ports HACKDIR defaults to the location # of the NetHack.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. # # 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, headstone, throne, # kitchen sink, toilet, fountain, pool or moat, ice, lava, # vertical lowered drawbridge, horizontal lowered drawbridge, # vertical raised drawbridge, horizontal raised drawbridge, air, cloud, # under water. # The defaults using the IBM graphics character set: # DUNGEON=032 186 205 201 187 200 188 206 202 203 185 204 \ # 250 196 179 179 196 035 084 \ # 250 176 177 030 031 \ # 024 025 240 239 234 236 \ # 235 244 247 249 247 \ # 186 205 186 205 032 035 247 # # ================================================ # Some alternatives: #DUNGEON= 032 186 205 201 187 200 188 206 202 203 \ # 185 204 249 239 239 254 254 249 177 177 \ # 060 062 060 062 095 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 # # Using the DEC Rainbow/ANSI line-drawing character set: # # If you have compiled with TERMLIB, merely set the DECgraphics option as # above. NetHack will then switch into the VTxxx line-drawing character set # (aka ANSI ruling character set '0') for dungeon characters. If you don't # like the selections, you can make up your own via the graphics options, # adding 128 to the value of any line-drawing character you want to use. # (But you should still set DECgraphics to get the correct processing.) # *** VIDEOCOLORS AND VIDEOSHADES *** # # While playing on NEC PC-9800, default game display may be difficult to # read. Try following setting. # #OPTIONS=videocolors:4-2-6-1-5-3-4-2-6-1-5-3,videoshades:normal-normal-normal # # DEC Rainbows will hang if rawio is set, so they should instead use: #OPTIONS=BIOS,DECgraphics slashem-0.0.7E7F3/sys/share/dgn_lex.c0000664000076400007640000013633110545462317015367 0ustar aliali/* A lexical scanner generated by flex */ /* Scanner skeleton version: * $Header: /cvsroot/slashem/slashem/sys/share/dgn_lex.c,v 1.6 2003/02/25 14:52:29 j_ali Exp $ */ #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 #define YY_FLEX_MINOR_VERSION 5 #include #include /* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */ #ifdef c_plusplus #ifndef __cplusplus #define __cplusplus #endif #endif #ifdef __cplusplus #include /* Use prototypes in function declarations. */ #define YY_USE_PROTOS /* The "const" storage-class-modifier is valid. */ #define YY_USE_CONST #else /* ! __cplusplus */ #if __STDC__ #define YY_USE_PROTOS #define YY_USE_CONST #endif /* __STDC__ */ #endif /* ! __cplusplus */ #ifdef __TURBOC__ #pragma warn -rch #pragma warn -use #include #include #define YY_USE_CONST #define YY_USE_PROTOS #endif #ifdef YY_USE_CONST #define yyconst const #else #define yyconst #endif #ifdef YY_USE_PROTOS #define YY_PROTO(proto) proto #else #define YY_PROTO(proto) () #endif /* Returned upon end-of-file. */ #define YY_NULL 0 /* Promotes a possibly negative, possibly signed char to an unsigned * integer for use as an array index. If the signed char is negative, * we want to instead treat it as an 8-bit unsigned char, hence the * double cast. */ #define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) /* Enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN. */ #define BEGIN yy_start = 1 + 2 * /* Translate the current start state into a value that can be later handed * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ #define YY_START ((yy_start - 1) / 2) #define YYSTATE YY_START /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) /* Special action meaning "start processing a new file". */ #define YY_NEW_FILE yyrestart( yyin ) #define YY_END_OF_BUFFER_CHAR 0 /* Size of default input buffer. */ #define YY_BUF_SIZE 16384 typedef struct yy_buffer_state *YY_BUFFER_STATE; extern int yyleng; extern FILE *yyin, *yyout; #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 /* The funky do-while in the following #define is used to turn the definition * int a single C statement (which needs a semi-colon terminator). This * avoids problems with code like: * * if ( condition_holds ) * yyless( 5 ); * else * do_something_else(); * * Prior to using the do-while the compiler would get upset at the * "else" because it interpreted the "if" statement as being all * done when it reached the ';' after the yyless() call. */ /* Return all but the first 'n' matched characters back to the input stream. */ #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ *yy_cp = yy_hold_char; \ YY_RESTORE_YY_MORE_OFFSET \ yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \ YY_DO_BEFORE_ACTION; /* set up yytext again */ \ } \ while ( 0 ) #define unput(c) yyunput( c, yytext_ptr ) /* The following is because we cannot portably get our hands on size_t * (without autoconf's help, which isn't available because we want * flex-generated scanners to compile on their own). */ typedef unsigned int yy_size_t; struct yy_buffer_state { FILE *yy_input_file; char *yy_ch_buf; /* input buffer */ char *yy_buf_pos; /* current position in input buffer */ /* Size of input buffer in bytes, not including room for EOB * characters. */ yy_size_t yy_buf_size; /* Number of characters read into yy_ch_buf, not including EOB * characters. */ int yy_n_chars; /* Whether we "own" the buffer - i.e., we know we created it, * and can realloc() it to grow it, and should free() it to * delete it. */ int yy_is_our_buffer; /* Whether this is an "interactive" input source; if so, and * if we're using stdio for input, then we want to use getc() * instead of fread(), to make sure we stop fetching input after * each newline. */ int yy_is_interactive; /* Whether we're considered to be at the beginning of a line. * If so, '^' rules will be active on the next match, otherwise * not. */ int yy_at_bol; /* Whether to try to fill the input buffer when we reach the * end of it. */ int yy_fill_buffer; int yy_buffer_status; #define YY_BUFFER_NEW 0 #define YY_BUFFER_NORMAL 1 /* When an EOF's been seen but there's still some text to process * then we mark the buffer as YY_EOF_PENDING, to indicate that we * shouldn't try reading from the input source any more. We might * still have a bunch of tokens to match, though, because of * possible backing-up. * * When we actually see the EOF, we change the status to "new" * (via yyrestart()), so that the user can continue scanning by * just pointing yyin at a new input file. */ #define YY_BUFFER_EOF_PENDING 2 }; static YY_BUFFER_STATE yy_current_buffer = 0; /* We provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general * "scanner state". */ #define YY_CURRENT_BUFFER yy_current_buffer /* yy_hold_char holds the character lost when yytext is formed. */ static char yy_hold_char; static int yy_n_chars; /* number of characters read into yy_ch_buf */ int yyleng; /* Points to current character in buffer. */ static char *yy_c_buf_p = (char *) 0; static int yy_init = 1; /* whether we need to initialize */ static int yy_start = 0; /* start state number */ /* Flag which is used to allow yywrap()'s to do buffer switches * instead of setting up a fresh yyin. A bit of a hack ... */ static int yy_did_buffer_switch_on_eof; void yyrestart YY_PROTO(( FILE *input_file )); void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer )); void yy_load_buffer_state YY_PROTO(( void )); YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size )); void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b )); void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file )); void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b )); #define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer ) YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size )); YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str )); YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len )); static void *yy_flex_alloc YY_PROTO(( yy_size_t )); static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t )); static void yy_flex_free YY_PROTO(( void * )); #define yy_new_buffer yy_create_buffer #define yy_set_interactive(is_interactive) \ { \ if ( ! yy_current_buffer ) \ yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ yy_current_buffer->yy_is_interactive = is_interactive; \ } #define yy_set_bol(at_bol) \ { \ if ( ! yy_current_buffer ) \ yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ yy_current_buffer->yy_at_bol = at_bol; \ } #define YY_AT_BOL() (yy_current_buffer->yy_at_bol) typedef unsigned char YY_CHAR; FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; typedef int yy_state_type; extern char *yytext; #define yytext_ptr yytext static yy_state_type yy_get_previous_state YY_PROTO(( void )); static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state )); static int yy_get_next_buffer YY_PROTO(( void )); static void yy_fatal_error YY_PROTO(( yyconst char msg[] )); /* Done after the current pattern has been matched and before the * corresponding action - sets up yytext. */ #define YY_DO_BEFORE_ACTION \ yytext_ptr = yy_bp; \ yyleng = (int) (yy_cp - yy_bp); \ yy_hold_char = *yy_cp; \ *yy_cp = '\0'; \ yy_c_buf_p = yy_cp; #define YY_NUM_RULES 35 #define YY_END_OF_BUFFER 36 static yyconst short int yy_accept[196] = { 0, 0, 0, 36, 34, 33, 32, 34, 34, 29, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 33, 32, 0, 30, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 4, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 5, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 22, 15, 0, 21, 7, 19, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 26, 16, 0, 0, 12, 0, 0, 0, 11, 9, 0, 17, 18, 0, 27, 0, 28, 24, 10, 0 } ; static yyconst int yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 5, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 1, 1, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 1, 1, 1, 1, 1, 1, 1, 8, 9, 10, 11, 12, 13, 14, 15, 16, 1, 1, 17, 18, 19, 20, 21, 1, 22, 23, 24, 25, 26, 1, 1, 27, 1, 1, 1, 1, 1, 28, 1, 29, 1, 30, 31, 32, 33, 34, 35, 36, 1, 37, 38, 39, 40, 41, 42, 1, 43, 44, 45, 46, 1, 47, 1, 1, 48, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; static yyconst int yy_meta[49] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; static yyconst short int yy_base[198] = { 0, 0, 213, 218, 220, 215, 220, 213, 210, 207, 196, 190, 196, 37, 191, 197, 186, 188, 171, 164, 172, 174, 173, 18, 160, 159, 154, 157, 11, 194, 194, 220, 190, 220, 187, 177, 184, 183, 167, 170, 164, 161, 166, 174, 155, 136, 144, 134, 132, 133, 26, 135, 143, 147, 128, 145, 220, 170, 220, 158, 152, 154, 159, 154, 145, 44, 142, 47, 124, 124, 125, 129, 129, 115, 27, 121, 113, 111, 120, 115, 116, 134, 142, 132, 128, 137, 121, 130, 129, 125, 129, 131, 97, 220, 105, 94, 101, 95, 96, 94, 99, 105, 101, 89, 220, 95, 112, 114, 51, 112, 107, 220, 110, 114, 111, 106, 96, 85, 76, 81, 82, 88, 69, 220, 81, 76, 75, 220, 78, 99, 220, 88, 97, 87, 88, 92, 93, 88, 91, 90, 71, 65, 220, 62, 60, 57, 56, 220, 59, 54, 74, 84, 65, 66, 220, 70, 65, 70, 60, 68, 220, 220, 52, 220, 220, 220, 46, 50, 57, 61, 67, 62, 220, 67, 64, 63, 220, 220, 42, 41, 220, 61, 53, 49, 220, 220, 50, 220, 220, 51, 220, 46, 220, 220, 220, 220, 62, 60 } ; static yyconst short int yy_def[198] = { 0, 195, 1, 195, 195, 195, 195, 195, 196, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 197, 195, 195, 196, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 197, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 0, 195, 195 } ; static yyconst short int yy_nxt[269] = { 0, 4, 5, 6, 7, 8, 4, 9, 10, 11, 12, 13, 14, 4, 4, 4, 4, 15, 4, 4, 4, 16, 17, 4, 4, 4, 4, 4, 4, 4, 18, 19, 4, 4, 4, 20, 4, 4, 21, 22, 23, 4, 24, 25, 26, 27, 28, 4, 4, 38, 49, 55, 87, 56, 74, 75, 88, 90, 98, 50, 131, 57, 39, 32, 91, 194, 193, 192, 132, 191, 190, 189, 188, 99, 187, 186, 185, 184, 183, 182, 181, 180, 179, 178, 177, 176, 175, 174, 173, 172, 171, 170, 169, 168, 167, 166, 165, 164, 163, 162, 161, 160, 159, 158, 157, 156, 155, 154, 153, 152, 151, 150, 149, 148, 147, 146, 145, 144, 143, 142, 141, 140, 139, 138, 137, 136, 135, 134, 133, 130, 129, 128, 127, 126, 125, 124, 123, 122, 121, 120, 119, 118, 117, 116, 115, 114, 113, 112, 111, 110, 109, 108, 107, 106, 105, 104, 103, 102, 101, 100, 97, 96, 95, 94, 93, 92, 89, 86, 85, 84, 83, 82, 81, 58, 80, 79, 78, 77, 76, 73, 72, 71, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, 59, 34, 33, 30, 58, 54, 53, 52, 51, 48, 47, 46, 45, 44, 43, 42, 41, 40, 37, 36, 35, 34, 33, 31, 30, 195, 29, 3, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195 } ; static yyconst short int yy_chk[269] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 23, 28, 65, 28, 50, 50, 65, 67, 74, 23, 108, 197, 13, 196, 67, 191, 189, 186, 108, 183, 182, 181, 179, 74, 178, 175, 174, 173, 171, 170, 169, 168, 167, 166, 162, 159, 158, 157, 156, 155, 153, 152, 151, 150, 149, 148, 146, 145, 144, 143, 141, 140, 139, 138, 137, 136, 135, 134, 133, 132, 131, 129, 128, 126, 125, 124, 122, 121, 120, 119, 118, 117, 116, 115, 114, 113, 112, 110, 109, 107, 106, 105, 103, 102, 101, 100, 99, 98, 97, 96, 95, 94, 92, 91, 90, 89, 88, 87, 86, 85, 84, 83, 82, 81, 80, 79, 78, 77, 76, 75, 73, 72, 71, 70, 69, 68, 66, 64, 63, 62, 61, 60, 59, 57, 55, 54, 53, 52, 51, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 32, 30, 29, 27, 26, 25, 24, 22, 21, 20, 19, 18, 17, 16, 15, 14, 12, 11, 10, 9, 8, 7, 5, 3, 2, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195 } ; static yy_state_type yy_last_accepting_state; static char *yy_last_accepting_cpos; /* The intent behind this definition is that it'll catch * any uses of REJECT which flex missed. */ #define REJECT reject_used_but_not_detected #define yymore() yymore_used_but_not_detected #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET char *yytext; #define INITIAL 0 /* SCCS Id: @(#)dgn_lex.c 3.4 2002/03/27 */ /* Copyright (c) 1989 by Jean-Christophe Collet */ /* Copyright (c) 1990 by M. Stephenson */ /* NetHack may be freely redistributed. See license for details. */ #define DGN_COMP #include "config.h" #include "dgn_comp.h" #include "dgn_file.h" /* * Most of these don't exist in flex, yywrap is macro and * yyunput is properly declared in flex.skel. */ #if !defined(FLEX_SCANNER) && !defined(FLEXHACK_SCANNER) int FDECL(yyback, (int *,int)); int NDECL(yylook); int NDECL(yyinput); int NDECL(yywrap); int NDECL(yylex); /* Traditional lexes let yyunput() and yyoutput() default to int; * newer ones may declare them as void since they don't return * values. For even more fun, the lex supplied as part of the * newer unbundled compiler for SunOS 4.x adds the void declarations * (under __STDC__ or _cplusplus ifdefs -- otherwise they remain * int) while the bundled lex and the one with the older unbundled * compiler do not. To detect this, we need help from outside -- * sys/unix/Makefile.utl. * * Digital UNIX is difficult and still has int in spite of all * other signs. */ # if defined(NeXT) || defined(SVR4) || defined(_AIX32) # define VOIDYYPUT # endif # if !defined(VOIDYYPUT) && defined(POSIX_TYPES) # if !defined(BOS) && !defined(HISX) && !defined(_M_UNIX) && !defined(VMS) # define VOIDYYPUT # endif # endif # if !defined(VOIDYYPUT) && defined(WEIRD_LEX) # if defined(SUNOS4) && defined(__STDC__) && (WEIRD_LEX > 1) # define VOIDYYPUT # endif # endif # if defined(VOIDYYPUT) && defined(__osf__) # undef VOIDYYPUT # endif # ifdef VOIDYYPUT void FDECL(yyunput, (int)); void FDECL(yyoutput, (int)); # else int FDECL(yyunput, (int)); int FDECL(yyoutput, (int)); # endif #endif /* !FLEX_SCANNER && !FLEXHACK_SCANNER */ #ifdef FLEX_SCANNER #define YY_MALLOC_DECL \ genericptr_t FDECL(malloc, (size_t)); \ genericptr_t FDECL(realloc, (genericptr_t,size_t)); #endif void FDECL(init_yyin, (FILE *)); void FDECL(init_yyout, (FILE *)); /* this doesn't always get put in dgn_comp.h * (esp. when using older versions of bison) */ extern YYSTYPE yylval; int line_number = 1; /* * This is a hack required by Michael Hamel to get things * working on the Mac. */ #if defined(MAC_MPW) && !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 /* MAC_MPW && !FLEX_SCANNER && !FLEXHACK_SCANNER */ /* Macros after this point can all be overridden by user definitions in * section 1. */ #ifndef YY_SKIP_YYWRAP #ifdef __cplusplus extern "C" int yywrap YY_PROTO(( void )); #else extern int yywrap YY_PROTO(( void )); #endif #endif #ifndef YY_NO_UNPUT static void yyunput YY_PROTO(( int c, char *buf_ptr )); #endif #ifndef yytext_ptr static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int )); #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen YY_PROTO(( yyconst char * )); #endif #ifndef YY_NO_INPUT #ifdef __cplusplus static int yyinput YY_PROTO(( void )); #else static int input YY_PROTO(( void )); #endif #endif #if YY_STACK_USED static int yy_start_stack_ptr = 0; static int yy_start_stack_depth = 0; static int *yy_start_stack = 0; #ifndef YY_NO_PUSH_STATE static void yy_push_state YY_PROTO(( int new_state )); #endif #ifndef YY_NO_POP_STATE static void yy_pop_state YY_PROTO(( void )); #endif #ifndef YY_NO_TOP_STATE static int yy_top_state YY_PROTO(( void )); #endif #else #define YY_NO_PUSH_STATE 1 #define YY_NO_POP_STATE 1 #define YY_NO_TOP_STATE 1 #endif #ifdef YY_MALLOC_DECL YY_MALLOC_DECL #else #if __STDC__ #ifndef __cplusplus #include #endif #else /* Just try to get by without declaring the routines. This will fail * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int) * or sizeof(void*) != sizeof(int). */ #endif #endif /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE #define YY_READ_BUF_SIZE 8192 #endif /* Copy whatever the last rule matched to the standard output. */ #ifndef ECHO /* This used to be an fputs(), but since the string might contain NUL's, * we now use fwrite(). */ #define ECHO (void) fwrite( yytext, yyleng, 1, yyout ) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, * is returned in "result". */ #ifndef YY_INPUT #define YY_INPUT(buf,result,max_size) \ if ( yy_current_buffer->yy_is_interactive ) \ { \ int c = '*', n; \ for ( n = 0; n < max_size && \ (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ buf[n] = (char) c; \ if ( c == '\n' ) \ buf[n++] = (char) c; \ if ( c == EOF && ferror( yyin ) ) \ YY_FATAL_ERROR( "input in flex scanner failed" ); \ result = n; \ } \ else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \ && ferror( yyin ) ) \ YY_FATAL_ERROR( "input in flex scanner failed" ); #endif /* No semi-colon after return; correct usage is to write "yyterminate();" - * we don't want an extra ';' after the "return" because that will cause * some compilers to complain about unreachable statements. */ #ifndef yyterminate #define yyterminate() return YY_NULL #endif /* Number of entries by which start-condition stack grows. */ #ifndef YY_START_STACK_INCR #define YY_START_STACK_INCR 25 #endif /* Report a fatal error. */ #ifndef YY_FATAL_ERROR #define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) #endif /* Default declaration of generated scanner - a define so the user can * easily add parameters. */ #ifndef YY_DECL #define YY_DECL int yylex YY_PROTO(( void )) #endif /* Code executed at the beginning of each rule, after yytext and yyleng * have been set up. */ #ifndef YY_USER_ACTION #define YY_USER_ACTION #endif /* Code executed at the end of each rule. */ #ifndef YY_BREAK #define YY_BREAK break; #endif #define YY_RULE_SETUP \ if ( yyleng > 0 ) \ yy_current_buffer->yy_at_bol = \ (yytext[yyleng - 1] == '\n'); \ YY_USER_ACTION YY_DECL { register yy_state_type yy_current_state; register char *yy_cp = NULL, *yy_bp = NULL; register int yy_act; if ( yy_init ) { yy_init = 0; #ifdef YY_USER_INIT YY_USER_INIT; #endif if ( ! yy_start ) yy_start = 1; /* first start state */ if ( ! yyin ) yyin = stdin; if ( ! yyout ) yyout = stdout; if ( ! yy_current_buffer ) yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); yy_load_buffer_state(); } while ( 1 ) /* loops until end-of-file is reached */ { yy_cp = yy_c_buf_p; /* Support of yytext. */ *yy_cp = yy_hold_char; /* yy_bp points to the position in yy_ch_buf of the start of * the current run. */ yy_bp = yy_cp; yy_current_state = yy_start; yy_current_state += YY_AT_BOL(); yy_match: do { register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; if ( yy_accept[yy_current_state] ) { yy_last_accepting_state = yy_current_state; yy_last_accepting_cpos = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 196 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; ++yy_cp; } while ( yy_base[yy_current_state] != 220 ); yy_find_action: yy_act = yy_accept[yy_current_state]; if ( yy_act == 0 ) { /* have to back up */ yy_cp = yy_last_accepting_cpos; yy_current_state = yy_last_accepting_state; yy_act = yy_accept[yy_current_state]; } YY_DO_BEFORE_ACTION; do_action: /* This label is used only to access EOF actions. */ switch ( yy_act ) { /* beginning of action switch */ case 0: /* must back up */ /* undo the effects of YY_DO_BEFORE_ACTION */ *yy_cp = yy_hold_char; yy_cp = yy_last_accepting_cpos; yy_current_state = yy_last_accepting_state; goto yy_find_action; case 1: YY_RULE_SETUP return(A_DUNGEON); YY_BREAK case 2: YY_RULE_SETUP { yylval.i=1; return(UP_OR_DOWN); } YY_BREAK case 3: YY_RULE_SETUP { yylval.i=0; return(UP_OR_DOWN); } YY_BREAK case 4: YY_RULE_SETUP return(ENTRY); YY_BREAK case 5: YY_RULE_SETUP return(STAIR); YY_BREAK case 6: YY_RULE_SETUP return(NO_UP); YY_BREAK case 7: YY_RULE_SETUP return(NO_DOWN); YY_BREAK case 8: YY_RULE_SETUP return(PORTAL); YY_BREAK case 9: YY_RULE_SETUP return(PROTOFILE); YY_BREAK case 10: YY_RULE_SETUP return(DESCRIPTION); YY_BREAK case 11: YY_RULE_SETUP return(LEVELDESC); YY_BREAK case 12: YY_RULE_SETUP return(ALIGNMENT); YY_BREAK case 13: YY_RULE_SETUP return(LEVALIGN); YY_BREAK case 14: YY_RULE_SETUP { yylval.i=TOWN ; return(DESCRIPTOR); } YY_BREAK case 15: YY_RULE_SETUP { yylval.i=HELLISH ; return(DESCRIPTOR); } YY_BREAK case 16: YY_RULE_SETUP { yylval.i=MAZELIKE ; return(DESCRIPTOR); } YY_BREAK case 17: YY_RULE_SETUP { yylval.i=ROGUELIKE ; return(DESCRIPTOR); } YY_BREAK case 18: YY_RULE_SETUP { yylval.i=D_ALIGN_NONE ; return(DESCRIPTOR); } YY_BREAK case 19: YY_RULE_SETUP { yylval.i=D_ALIGN_NONE ; return(DESCRIPTOR); } YY_BREAK case 20: YY_RULE_SETUP { yylval.i=D_ALIGN_LAWFUL ; return(DESCRIPTOR); } YY_BREAK case 21: YY_RULE_SETUP { yylval.i=D_ALIGN_NEUTRAL ; return(DESCRIPTOR); } YY_BREAK case 22: YY_RULE_SETUP { yylval.i=D_ALIGN_CHAOTIC ; return(DESCRIPTOR); } YY_BREAK case 23: YY_RULE_SETUP return(BRANCH); YY_BREAK case 24: YY_RULE_SETUP return(CHBRANCH); YY_BREAK case 25: YY_RULE_SETUP return(LEVEL); YY_BREAK case 26: YY_RULE_SETUP return(RNDLEVEL); YY_BREAK case 27: YY_RULE_SETUP return(CHLEVEL); YY_BREAK case 28: YY_RULE_SETUP return(RNDCHLEVEL); YY_BREAK case 29: YY_RULE_SETUP { yylval.i=atoi(yytext); return(INTEGER); } YY_BREAK case 30: YY_RULE_SETUP { yytext[yyleng-1] = 0; /* Discard the trailing \" */ yylval.str = (char *) alloc(strlen(yytext+1)+1); Strcpy(yylval.str, yytext+1); /* Discard the first \" */ return(STRING); } YY_BREAK case 31: YY_RULE_SETUP { line_number++; } YY_BREAK case 32: YY_RULE_SETUP { line_number++; } YY_BREAK case 33: YY_RULE_SETUP ; /* skip trailing tabs & spaces */ YY_BREAK case 34: YY_RULE_SETUP { return yytext[0]; } YY_BREAK case 35: YY_RULE_SETUP ECHO; YY_BREAK case YY_STATE_EOF(INITIAL): yyterminate(); case YY_END_OF_BUFFER: { /* Amount of text matched not including the EOB char. */ int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1; /* Undo the effects of YY_DO_BEFORE_ACTION. */ *yy_cp = yy_hold_char; YY_RESTORE_YY_MORE_OFFSET if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW ) { /* We're scanning a new file or input source. It's * possible that this happened because the user * just pointed yyin at a new source and called * yylex(). If so, then we have to assure * consistency between yy_current_buffer and our * globals. Here is the right place to do so, because * this is the first action (other than possibly a * back-up) that will match for the new input source. */ yy_n_chars = yy_current_buffer->yy_n_chars; yy_current_buffer->yy_input_file = yyin; yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL; } /* Note that here we test for yy_c_buf_p "<=" to the position * of the first EOB in the buffer, since yy_c_buf_p will * already have been incremented past the NUL character * (since all states make transitions on EOB to the * end-of-buffer state). Contrast this with the test * in input(). */ if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] ) { /* This was really a NUL. */ yy_state_type yy_next_state; yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state(); /* Okay, we're now positioned to make the NUL * transition. We couldn't have * yy_get_previous_state() go ahead and do it * for us because it doesn't know how to deal * with the possibility of jamming (and we don't * want to build jamming into it because then it * will run more slowly). */ yy_next_state = yy_try_NUL_trans( yy_current_state ); yy_bp = yytext_ptr + YY_MORE_ADJ; if ( yy_next_state ) { /* Consume the NUL. */ yy_cp = ++yy_c_buf_p; yy_current_state = yy_next_state; goto yy_match; } else { yy_cp = yy_c_buf_p; goto yy_find_action; } } else switch ( yy_get_next_buffer() ) { case EOB_ACT_END_OF_FILE: { yy_did_buffer_switch_on_eof = 0; if ( yywrap() ) { /* Note: because we've taken care in * yy_get_next_buffer() to have set up * yytext, we can now set up * yy_c_buf_p so that if some total * hoser (like flex itself) wants to * call the scanner after we return the * YY_NULL, it'll still work - another * YY_NULL will get returned. */ yy_c_buf_p = yytext_ptr + YY_MORE_ADJ; yy_act = YY_STATE_EOF(YY_START); goto do_action; } else { if ( ! yy_did_buffer_switch_on_eof ) YY_NEW_FILE; } break; } case EOB_ACT_CONTINUE_SCAN: yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state(); yy_cp = yy_c_buf_p; yy_bp = yytext_ptr + YY_MORE_ADJ; goto yy_match; case EOB_ACT_LAST_MATCH: yy_c_buf_p = &yy_current_buffer->yy_ch_buf[yy_n_chars]; yy_current_state = yy_get_previous_state(); yy_cp = yy_c_buf_p; yy_bp = yytext_ptr + YY_MORE_ADJ; goto yy_find_action; } break; } default: YY_FATAL_ERROR( "fatal flex scanner internal error--no action found" ); } /* end of action switch */ } /* end of scanning one token */ } /* end of yylex */ /* yy_get_next_buffer - try to read in a new buffer * * Returns a code representing an action: * EOB_ACT_LAST_MATCH - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position * EOB_ACT_END_OF_FILE - end of file */ static int yy_get_next_buffer() { register char *dest = yy_current_buffer->yy_ch_buf; register char *source = yytext_ptr; register int number_to_move, i; int ret_val; if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] ) YY_FATAL_ERROR( "fatal flex scanner internal error--end of buffer missed" ); if ( yy_current_buffer->yy_fill_buffer == 0 ) { /* Don't try to fill the buffer, so this is an EOF. */ if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 ) { /* We matched a single character, the EOB, so * treat this as a final EOF. */ return EOB_ACT_END_OF_FILE; } else { /* We matched some text prior to the EOB, first * process it. */ return EOB_ACT_LAST_MATCH; } } /* Try to read more data. */ /* First move last chars to start of buffer. */ number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1; for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING ) /* don't do the read, it's not guaranteed to return an EOF, * just force an EOF */ yy_current_buffer->yy_n_chars = yy_n_chars = 0; else { int num_to_read = yy_current_buffer->yy_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) { /* Not enough room in the buffer - grow it. */ #ifdef YY_USES_REJECT YY_FATAL_ERROR( "input buffer overflow, can't enlarge buffer because scanner uses REJECT" ); #else /* just a shorter name for the current buffer */ YY_BUFFER_STATE b = yy_current_buffer; int yy_c_buf_p_offset = (int) (yy_c_buf_p - b->yy_ch_buf); if ( b->yy_is_our_buffer ) { int new_size = b->yy_buf_size * 2; if ( new_size <= 0 ) b->yy_buf_size += b->yy_buf_size / 8; else b->yy_buf_size *= 2; b->yy_ch_buf = (char *) /* Include room in for 2 EOB chars. */ yy_flex_realloc( (void *) b->yy_ch_buf, b->yy_buf_size + 2 ); } else /* Can't grow it, we don't own it. */ b->yy_ch_buf = 0; if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "fatal error - scanner input buffer overflow" ); yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset]; num_to_read = yy_current_buffer->yy_buf_size - number_to_move - 1; #endif } if ( num_to_read > YY_READ_BUF_SIZE ) num_to_read = YY_READ_BUF_SIZE; /* Read in more data. */ YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]), yy_n_chars, num_to_read ); yy_current_buffer->yy_n_chars = yy_n_chars; } if ( yy_n_chars == 0 ) { if ( number_to_move == YY_MORE_ADJ ) { ret_val = EOB_ACT_END_OF_FILE; yyrestart( yyin ); } else { ret_val = EOB_ACT_LAST_MATCH; yy_current_buffer->yy_buffer_status = YY_BUFFER_EOF_PENDING; } } else ret_val = EOB_ACT_CONTINUE_SCAN; yy_n_chars += number_to_move; yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR; yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; yytext_ptr = &yy_current_buffer->yy_ch_buf[0]; return ret_val; } /* yy_get_previous_state - get the state just before the EOB char was reached */ static yy_state_type yy_get_previous_state() { register yy_state_type yy_current_state; register char *yy_cp; yy_current_state = yy_start; yy_current_state += YY_AT_BOL(); for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp ) { register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); if ( yy_accept[yy_current_state] ) { yy_last_accepting_state = yy_current_state; yy_last_accepting_cpos = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 196 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; } return yy_current_state; } /* yy_try_NUL_trans - try to make a transition on the NUL character * * synopsis * next_state = yy_try_NUL_trans( current_state ); */ #ifdef YY_USE_PROTOS static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state ) #else static yy_state_type yy_try_NUL_trans( yy_current_state ) yy_state_type yy_current_state; #endif { register int yy_is_jam; register char *yy_cp = yy_c_buf_p; register YY_CHAR yy_c = 1; if ( yy_accept[yy_current_state] ) { yy_last_accepting_state = yy_current_state; yy_last_accepting_cpos = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 196 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; yy_is_jam = (yy_current_state == 195); return yy_is_jam ? 0 : yy_current_state; } #ifndef YY_NO_UNPUT #ifdef YY_USE_PROTOS static void yyunput( int c, register char *yy_bp ) #else static void yyunput( c, yy_bp ) int c; register char *yy_bp; #endif { register char *yy_cp = yy_c_buf_p; /* undo effects of setting up yytext */ *yy_cp = yy_hold_char; if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) { /* need to shift things up to make room */ /* +2 for EOB chars. */ register int number_to_move = yy_n_chars + 2; register char *dest = &yy_current_buffer->yy_ch_buf[ yy_current_buffer->yy_buf_size + 2]; register char *source = &yy_current_buffer->yy_ch_buf[number_to_move]; while ( source > yy_current_buffer->yy_ch_buf ) *--dest = *--source; yy_cp += (int) (dest - source); yy_bp += (int) (dest - source); yy_current_buffer->yy_n_chars = yy_n_chars = yy_current_buffer->yy_buf_size; if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) YY_FATAL_ERROR( "flex scanner push-back overflow" ); } *--yy_cp = (char) c; yytext_ptr = yy_bp; yy_hold_char = *yy_cp; yy_c_buf_p = yy_cp; } #endif /* ifndef YY_NO_UNPUT */ #ifdef __cplusplus static int yyinput() #else static int input() #endif { int c; *yy_c_buf_p = yy_hold_char; if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) { /* yy_c_buf_p now points to the character we want to return. * If this occurs *before* the EOB characters, then it's a * valid NUL; if not, then we've hit the end of the buffer. */ if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] ) /* This was really a NUL. */ *yy_c_buf_p = '\0'; else { /* need more input */ int offset = yy_c_buf_p - yytext_ptr; ++yy_c_buf_p; switch ( yy_get_next_buffer() ) { case EOB_ACT_LAST_MATCH: /* This happens because yy_g_n_b() * sees that we've accumulated a * token and flags that we need to * try matching the token before * proceeding. But for input(), * there's no matching to consider. * So convert the EOB_ACT_LAST_MATCH * to EOB_ACT_END_OF_FILE. */ /* Reset buffer status. */ yyrestart( yyin ); /* fall through */ case EOB_ACT_END_OF_FILE: { if ( yywrap() ) return EOF; if ( ! yy_did_buffer_switch_on_eof ) YY_NEW_FILE; #ifdef __cplusplus return yyinput(); #else return input(); #endif } case EOB_ACT_CONTINUE_SCAN: yy_c_buf_p = yytext_ptr + offset; break; } } } c = *(unsigned char *) yy_c_buf_p; /* cast for 8-bit char's */ *yy_c_buf_p = '\0'; /* preserve yytext */ yy_hold_char = *++yy_c_buf_p; yy_current_buffer->yy_at_bol = (c == '\n'); return c; } #ifdef YY_USE_PROTOS void yyrestart( FILE *input_file ) #else void yyrestart( input_file ) FILE *input_file; #endif { if ( ! yy_current_buffer ) yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); yy_init_buffer( yy_current_buffer, input_file ); yy_load_buffer_state(); } #ifdef YY_USE_PROTOS void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) #else void yy_switch_to_buffer( new_buffer ) YY_BUFFER_STATE new_buffer; #endif { if ( yy_current_buffer == new_buffer ) return; if ( yy_current_buffer ) { /* Flush out information for old buffer. */ *yy_c_buf_p = yy_hold_char; yy_current_buffer->yy_buf_pos = yy_c_buf_p; yy_current_buffer->yy_n_chars = yy_n_chars; } yy_current_buffer = new_buffer; yy_load_buffer_state(); /* We don't actually know whether we did this switch during * EOF (yywrap()) processing, but the only time this flag * is looked at is after yywrap() is called, so it's safe * to go ahead and always set it. */ yy_did_buffer_switch_on_eof = 1; } #ifdef YY_USE_PROTOS void yy_load_buffer_state( void ) #else void yy_load_buffer_state() #endif { yy_n_chars = yy_current_buffer->yy_n_chars; yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos; yyin = yy_current_buffer->yy_input_file; yy_hold_char = *yy_c_buf_p; } #ifdef YY_USE_PROTOS YY_BUFFER_STATE yy_create_buffer( FILE *file, int size ) #else YY_BUFFER_STATE yy_create_buffer( file, size ) FILE *file; int size; #endif { YY_BUFFER_STATE b; b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_buf_size = size; /* yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 ); if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_is_our_buffer = 1; yy_init_buffer( b, file ); return b; } #ifdef YY_USE_PROTOS void yy_delete_buffer( YY_BUFFER_STATE b ) #else void yy_delete_buffer( b ) YY_BUFFER_STATE b; #endif { if ( ! b ) return; if ( b == yy_current_buffer ) yy_current_buffer = (YY_BUFFER_STATE) 0; if ( b->yy_is_our_buffer ) yy_flex_free( (void *) b->yy_ch_buf ); yy_flex_free( (void *) b ); } #ifdef YY_USE_PROTOS void yy_init_buffer( YY_BUFFER_STATE b, FILE *file ) #else void yy_init_buffer( b, file ) YY_BUFFER_STATE b; FILE *file; #endif { yy_flush_buffer( b ); b->yy_input_file = file; b->yy_fill_buffer = 1; #if YY_ALWAYS_INTERACTIVE b->yy_is_interactive = 1; #else #if YY_NEVER_INTERACTIVE b->yy_is_interactive = 0; #else b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; #endif #endif } #ifdef YY_USE_PROTOS void yy_flush_buffer( YY_BUFFER_STATE b ) #else void yy_flush_buffer( b ) YY_BUFFER_STATE b; #endif { if ( ! b ) return; b->yy_n_chars = 0; /* We always need two end-of-buffer characters. The first causes * a transition to the end-of-buffer state. The second causes * a jam in that state. */ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; b->yy_buf_pos = &b->yy_ch_buf[0]; b->yy_at_bol = 1; b->yy_buffer_status = YY_BUFFER_NEW; if ( b == yy_current_buffer ) yy_load_buffer_state(); } #ifndef YY_NO_SCAN_BUFFER #ifdef YY_USE_PROTOS YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size ) #else YY_BUFFER_STATE yy_scan_buffer( base, size ) char *base; yy_size_t size; #endif { YY_BUFFER_STATE b; if ( size < 2 || base[size-2] != YY_END_OF_BUFFER_CHAR || base[size-1] != YY_END_OF_BUFFER_CHAR ) /* They forgot to leave room for the EOB's. */ return 0; b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ b->yy_buf_pos = b->yy_ch_buf = base; b->yy_is_our_buffer = 0; b->yy_input_file = 0; b->yy_n_chars = b->yy_buf_size; b->yy_is_interactive = 0; b->yy_at_bol = 1; b->yy_fill_buffer = 0; b->yy_buffer_status = YY_BUFFER_NEW; yy_switch_to_buffer( b ); return b; } #endif #ifndef YY_NO_SCAN_STRING #ifdef YY_USE_PROTOS YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str ) #else YY_BUFFER_STATE yy_scan_string( yy_str ) yyconst char *yy_str; #endif { int len; for ( len = 0; yy_str[len]; ++len ) ; return yy_scan_bytes( yy_str, len ); } #endif #ifndef YY_NO_SCAN_BYTES #ifdef YY_USE_PROTOS YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len ) #else YY_BUFFER_STATE yy_scan_bytes( bytes, len ) yyconst char *bytes; int len; #endif { YY_BUFFER_STATE b; char *buf; yy_size_t n; int i; /* Get memory for full buffer, including space for trailing EOB's. */ n = len + 2; buf = (char *) yy_flex_alloc( n ); if ( ! buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); for ( i = 0; i < len; ++i ) buf[i] = bytes[i]; buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR; b = yy_scan_buffer( buf, n ); if ( ! b ) YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); /* It's okay to grow etc. this buffer, and we should throw it * away when we're done. */ b->yy_is_our_buffer = 1; return b; } #endif #ifndef YY_NO_PUSH_STATE #ifdef YY_USE_PROTOS static void yy_push_state( int new_state ) #else static void yy_push_state( new_state ) int new_state; #endif { if ( yy_start_stack_ptr >= yy_start_stack_depth ) { yy_size_t new_size; yy_start_stack_depth += YY_START_STACK_INCR; new_size = yy_start_stack_depth * sizeof( int ); if ( ! yy_start_stack ) yy_start_stack = (int *) yy_flex_alloc( new_size ); else yy_start_stack = (int *) yy_flex_realloc( (void *) yy_start_stack, new_size ); if ( ! yy_start_stack ) YY_FATAL_ERROR( "out of memory expanding start-condition stack" ); } yy_start_stack[yy_start_stack_ptr++] = YY_START; BEGIN(new_state); } #endif #ifndef YY_NO_POP_STATE static void yy_pop_state() { if ( --yy_start_stack_ptr < 0 ) YY_FATAL_ERROR( "start-condition stack underflow" ); BEGIN(yy_start_stack[yy_start_stack_ptr]); } #endif #ifndef YY_NO_TOP_STATE static int yy_top_state() { return yy_start_stack[yy_start_stack_ptr - 1]; } #endif #ifndef YY_EXIT_FAILURE #define YY_EXIT_FAILURE 2 #endif #ifdef YY_USE_PROTOS static void yy_fatal_error( yyconst char msg[] ) #else static void yy_fatal_error( msg ) char msg[]; #endif { (void) fprintf( stderr, "%s\n", msg ); exit( YY_EXIT_FAILURE ); } /* Redefine yyless() so it works in section 3 code. */ #undef yyless #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ yytext[yyleng] = yy_hold_char; \ yy_c_buf_p = yytext + n; \ yy_hold_char = *yy_c_buf_p; \ *yy_c_buf_p = '\0'; \ yyleng = n; \ } \ while ( 0 ) /* Internal utility routines. */ #ifndef yytext_ptr #ifdef YY_USE_PROTOS static void yy_flex_strncpy( char *s1, yyconst char *s2, int n ) #else static void yy_flex_strncpy( s1, s2, n ) char *s1; yyconst char *s2; int n; #endif { register int i; for ( i = 0; i < n; ++i ) s1[i] = s2[i]; } #endif #ifdef YY_NEED_STRLEN #ifdef YY_USE_PROTOS static int yy_flex_strlen( yyconst char *s ) #else static int yy_flex_strlen( s ) yyconst char *s; #endif { register int n; for ( n = 0; s[n]; ++n ) ; return n; } #endif #ifdef YY_USE_PROTOS static void *yy_flex_alloc( yy_size_t size ) #else static void *yy_flex_alloc( size ) yy_size_t size; #endif { return (void *) malloc( size ); } #ifdef YY_USE_PROTOS static void *yy_flex_realloc( void *ptr, yy_size_t size ) #else static void *yy_flex_realloc( ptr, size ) void *ptr; yy_size_t size; #endif { /* The cast to (char *) in the following accommodates both * implementations that use char* generic pointers, and those * that use void* generic pointers. It works with the latter * because both ANSI C and C++ allow castless assignment from * any pointer type to void*, and deal with argument conversions * as though doing an assignment. */ return (void *) realloc( (char *) ptr, size ); } #ifdef YY_USE_PROTOS static void yy_flex_free( void *ptr ) #else static void yy_flex_free( ptr ) void *ptr; #endif { free( ptr ); } #if YY_MAIN int main() { yylex(); return 0; } #endif /* routine to switch to another input file; needed for flex */ void init_yyin( input_f ) FILE *input_f; { #if defined(FLEX_SCANNER) || defined(FLEXHACK_SCANNER) if (yyin) yyrestart(input_f); else #endif yyin = input_f; } /* analogous routine (for completeness) */ void init_yyout( output_f ) FILE *output_f; { yyout = output_f; } /*dgn_comp.l*/ slashem-0.0.7E7F3/sys/share/Makefile.lib0000664000076400007640000000070010545462317015776 0ustar aliali# SCCS Id: @(#)Makefile.lib 3.4 1990/22/02 # Nethack makefile for Fred fish termlib -- Norman Meluch # CC = cl /c MODEL = L CFLAGS = /A$(MODEL) /Os /Oa /Gs /Zp1 /W0 # # Termcap routines. TERMLIB = termlib.lib # TL_LOBJECTS = tgetent.o tgetflag.o tgetnum.o \ tgetstr.o tgoto.o tputs.o \ isdigit.o fgetlr.o # .SUFFIXES: .exe .o .c .obj .asm # .c.o: $(CC) $(CFLAGS) /Fo$*.o $*.c # $(TERMLIB): $(TL_LOBJECTS) lib $(TERMLIB) -+ $(TL_LOBJECTS); slashem-0.0.7E7F3/sys/share/nhlan.c0000664000076400007640000001017510545462317015044 0ustar aliali/* SCCS Id: @(#)nhlan.c 3.4 1999/11/21 */ /* Copyright (c) Michael Allison, 1997 */ /* NetHack may be freely redistributed. See license for details. */ /* * Currently shared by the following ports: * WIN32 * * The code in here is used to take advantage of added features * that might be available in a Local Area Network environment. * * Network Username of player * Mail * Futures * Shared bones * To implement this: code, data files, and configuration * files need to be separated from writeable files such * as level files, bones files, and save files. * */ #include "hack.h" #include #ifdef LAN_FEATURES #ifdef LAN_MAIL /* Port specific code needs to implement these routines for LAN_MAIL */ extern char *FDECL(get_username, (int *)); extern boolean NDECL(mail_check); extern boolean FDECL(mail_fetch, (struct lan_mail_struct *)); extern void FDECL(mail_init, (char *)); extern void NDECL(mail_finish); struct lan_mail_struct mailmessage; #endif /* LAN_MAIL */ void init_lan_features() { lan_username(); #ifdef LAN_MAIL lan_mail_init(); #endif #ifdef LAN_SHARED_BONES #endif } /* * The get_lan_username() call is a required call, since some of * the other LAN features depend on a unique username being available. * */ char lusername[MAX_LAN_USERNAME]; int lusername_size = MAX_LAN_USERNAME; char *lan_username() { char *lu; lu = get_username(&lusername_size); if (lu) { Strcpy(lusername, lu); return lusername; } else return (char *)0; } # ifdef LAN_MAIL #if 0 static void mail_by_pline(msg) struct lan_mail_struct *msg; { long size; for (size = 0; size < qt_msg->size; size += (long)strlen(in_line)) { (void) dlb_fgets(in_line, 80, msg_file); convert_line(); pline(out_line); } } #endif /* 0 */ static void mail_by_window(msg) struct lan_mail_struct *msg; { char buf[BUFSZ]; winid datawin = create_nhwindow(NHW_TEXT); char *get, *put; int ccount = 0; get = msg->body; put = buf; while (*get) { if (ccount > 79) { *put = '\0'; putstr(datawin, 0, buf); put = buf; ccount = 0; } if (*get == '\r') { get++; } else if (*get == '\n') { *put = '\0'; putstr(datawin, 0, buf); put = buf; get++; ccount = 0; } else if (!isprint(*get)) { get++; } else { *put++ = *get++; ccount++; } } *put = '\0'; putstr(datawin, 0, buf); putstr(datawin, 0, ""); display_nhwindow(datawin, TRUE); destroy_nhwindow(datawin); } /* this returns TRUE if there is mail ready to be read */ boolean lan_mail_check() { if (flags.biff) { if (mail_check()) return TRUE; } return FALSE; } void lan_mail_read(otmp) struct obj *otmp; { if (flags.biff) { (void) mail_fetch(&mailmessage); /* after a successful fetch iflags.lan_mail_fetched * should be TRUE. If it isn't then we don't * trust the contents of mailmessage. This * ensures that things work correctly across * save/restores where mailmessage isn't * saved (nor should it be since it may be * way out of context by then). */ if (iflags.lan_mail_fetched) { if (mailmessage.body_in_ram) { mail_by_window(&mailmessage); return; } } } pline_The("text has faded and is no longer readable."); } void lan_mail_init() { if (!flags.biff) return; (void) mail_init(lusername); } void lan_mail_finish() { if (iflags.lan_mail) (void) mail_finish(); } /* If ever called, the underlying mail system ran into trouble * and wants us to cease bothering it immediately. * Don't call mail_finish() because the underlying mail system * may already be unavailable. Just clean up the NetHack side * of things to prevent a crash. */ void lan_mail_terminate() { /* Step 1. Clear iflags.lan_mail to indicate "not inited" */ iflags.lan_mail = FALSE; /* Step 2. Clear iflags.lan_mail_fetched */ iflags.lan_mail_fetched = FALSE; /* Once having gotten to this point, the only way to resume NetHack mail features again is to Save/Quit game, or for the user to clear iflags.biff and then set it once again, which triggers mail initialization */ } # endif /*LAN_MAIL*/ #endif /*LAN_FEATURES*/ /*nhlan.c*/ slashem-0.0.7E7F3/sys/share/termcap0000664000076400007640000001360510545462317015157 0ustar aliali# # MS/PC-DOS ANSI.SYS termcap # ansi|color|ansi-color|ibm|ibmpc|ANSI.SYS color:\ :co#80:li#24:bs:pt:bl=^G:le=^H:do=^J:\ :cl=\E[H\E[2J:ce=\E[K:\ :ho=\E[H:cm=\E[%i%d;%dH:\ :up=\E[A:do=\E[B:le=\E[C:ri=\E[D:nd=\E[C:\ :ti=\E[0;44m:te=\E[0m:\ :so=\E[1;35;44m:se=\E[0;44m:\ :us=\E[1;31;44m:ue=\E[0;44m:\ :mb=\E[5m:md=\E[1m:me=\E[0;44m: mono|ansi-mono|ANSI.SYS:\ :co#80:li#24:bs:pt:bl=^G:le=^H:do=^J:\ :cl=\E[H\E[2J:ce=\E[K:\ :ho=\E[H:cm=\E[%i%d;%dH:\ :up=\E[A:do=\E[B:le=\E[C:ri=\E[D:nd=\E[C:\ :so=\E[1m:se=\E[m:us=\E[4m:ue=\E[m:\ :mb=\E[5m:md=\E[1m:me=\E[m: # # This is a termcap for NNANSI.SYS (New & Improved NANSI.SYS), # a faster and more complete public domain replacement for # ANSI.SYS, and two other ANSI.SYS replacements, NANSI.SYS and # ZANSI.SYS. # # NANSI and ZANSI support line insert (al) and delete (dl) # and character insert (ic) and delete (dc) where ANSI.SYS # does not. NNANSI.SYS also supports clear to end of display # (cd), does reverse video (mr) properly, and emulates SGR # more fully, allowing correct end sequences for standout (se) # and end of underline (ue). # nnansi-mono|NNANSI.SYS:\ :co#80:li#25:bs:pt:bl=^G:le=^H:do=^J:\ :cl=\E[2J:cd=\E[J:ce=\E[K:\ :ho=\E[H:cm=\E[%i%d;%dH:\ :up=\E[A:do=\E[B:le=\E[C:ri=\E[D:nd=\E[C:\ :so=\E[1m:se=\E[2m:\ :us=\E[4m:ue=\E[24m:\ :mb=\E[5m:md=\E[1m:mh=\E[2m:mr=\E[7m:me=\E[m:\ :al=\E[L:dl=\E[M:ic=\E[@:dc=\E[P: nnansi|NNANSI.SYS color:\ :co#80:li#25:bs:pt:bl=^G:le=^H:do=^J:\ :cl=\E[2J:cd=\E[J:ce=\E[K:\ :ho=\E[H:cm=\E[%i%d;%dH:\ :up=\E[A:do=\E[B:le=\E[C:ri=\E[D:nd=\E[C:\ :ti=\E[0;44m:te=\E[0m:\ :so=\E[1;35;44m:se=\E[2;37m:\ :us=\E[4m:ue=\E[24m:\ :mb=\E[5m:md=\E[1m:mh=\E[2m:mr=\E[7m:me=\E[0;44m:\ :al=\E[L:dl=\E[M:ic=\E[@:dc=\E[P: nansi-mono|zansi-mono|N/ZANSI.SYS:\ :co#80:li#25:bs:pt:bl=^G:le=^H:do=^J:\ :cl=\E[2J:ce=\E[K:\ :ho=\E[H:cm=\E[%i%d;%dH:\ :up=\E[A:do=\E[B:le=\E[C:ri=\E[D:nd=\E[C:\ :ti=\E[0m:te=\E[0m:\ :so=\E[1;35m:se=\E[0m:\ :us=\E[1;31m:ue=\E[0m:\ :mb=\E[5m:md=\E[1m:mr=\E[7m:me=\E[m:\ :al=\E[L:dl=\E[M:ic=\E[@:dc=\E[P: nansi|zansi|N/ZANSI.SYS color:\ :co#80:li#25:bs:pt:bl=^G:le=^H:do=^J:\ :cl=\E[2J:ce=\E[K:\ :ho=\E[H:cm=\E[%i%d;%dH:\ :up=\E[A:do=\E[B:le=\E[C:ri=\E[D:nd=\E[C:\ :ti=\E[0;44m:te=\E[0m:\ :so=\E[1;35;44m:se=\E[0;44m:\ :us=\E[1;31;44m:ue=\E[0;44m:\ :mb=\E[5m:md=\E[1m:mr=\E[7m:me=\E[0;44m:\ :al=\E[L:dl=\E[M:ic=\E[@:dc=\E[P: # # For ST NetHack: # for VT100/200/&c in VT52 mode, add :ti=\E[?2l: vt52|atari|DEC VT52:\ :co#80:li#24:bs:pt:bl=^G:le=^H:do=^J:\ :cl=\EH\EJ:ce=\EK:cd=\EJ:\ :ho=\EH:cm=\EY%+ %+ :\ :up=\EA:do=\EB:le=\EC:ri=\ED:nd=\EC:\ :ku=\EA:kd=\EB:kl=\EC:kr=\ED:kb=^H:\ :sr=\EI:as=\EF:ae=\EG: # # For Amiga or VMS NetHack: # VT100 or clone without the advanced video option installed vt100|amiga|vt100-80|vt100-noavo|DEC VT100:\ :co#80:li#24:bs:pt:am:mi:bl=^G:le=^H:do=^J:xo:vt#3:\ :cl=50\E[H\E[J:ce=3\E[K:cd=50\E[J:\ :ho=\E[H:cm=5\E[%i%d;%dH:cs=\E[%i%d;%dr:\ :up=\E[A:do=\E[B:le=\E[C:ri=\E[D:nd=\E[C:\ :UP=\E[%dA:DO=\E[%dB:LE=\E[%dC:RI=\E[%dD:\ :so=2\E[7m:se=2\E[m:us=2\E[4m:ue=2\E[m:\ :mb=2\E[5m:md=2\E[1m:mr=2\E[7m:me=2\E[m:\ :ti=4\E<\E(B\E)0:as=^N:ae=^O:\ :ks=\E[?1h\E=:ke=\E[?1l\E>:ku=\E[A:kd=\E[B:kl=\E[C:kr=\E[D:kb=^H:\ :kn#4:k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:\ :sc=\E7:ec=\E8:sr=5\EM: # # VT102 and up: # includes VT100 with advanced video option vt102|vt102-80|vt100-avo|DEC VT102:\ :im=\E[4h:ei=\E[4l:al=5\E[L:dl=5\E[M:dc=5\E[P:\ :AL=9\E[%dL:DL=9\E[%dM:tc=vt100: vt200|vt200-80|vt220|vt240|vt241|VT200_Series:\ :ic=5\E[@:tc=vt102: vt300|vt300-80|vt320|vt330|vt340|VT300_Series:\ :tc=vt200: vt400|vt400-80|vt420|VT400_Series:\ :tc=vt300: # VAXstations (should have full entries with no delays and 8-bit CSI's) VWS|UIS:tc=vt200: DECterm:tc=vt300: # # Wide screen (magnifying glass not included;-) # note: vt100 w/o AVO only supports 14 lines when in 132-column mode vt132|vt100-132:vt102-132:\ :co#132:ti=9\E<\E(B\E)0\E[?3h:tc=vt102: vt200-132|vt300-132:\ :co#132:ti=9\E<\E(B\E)0\E[?3h:tc=vt200: # # # For really complete ANSI emulations (FANSI-CONSOLE?): # AX|ANSI X3.64|full ANSI X3.64 (1977) standard:\ :co#80:li#24:bs:pt:am:mi:bl=^G:le=^H:\ :cl=\E[2J:ce=\E[K:cd=\E[J:\ :ho=\E[H:cm=\E[%i%d;%dH:cs=\E[%i%d;%dr:\ :up=\E[A:do=\E[B:le=\E[C:ri=\E[D:nd=\E[C:\ :UP=\E[%dA:DO=\E[%dB:LE=\E[%dC:RI=\E[%dD:\ :so=\E[7m:se=\E[m:us=\E[4m:ue=\E[m:\ :mb=\E[5m:md=\E[1m:mr=\E[7m:me=\E[m:as=^N:ae=^O:\ :ku=\E[A:kd=\E[B:kl=\E[C:kr=\E[D:kb=^H:\ :kn#4:k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:\ :im=\E[4h:ei=\E[4l:al=\E[L:dl=\E[M:ic=\E[@:dc=\E[P:sf=\ED:sr=\EM: # # For PC-9800 NetHack: # pc9800|pc9801|pc98|NEC PC-9800 Series:\ :co#80:li#25:\ :cm=\E[%i%d;%dH:ho=\E[H:ll=\E[25;1H:cr=^M:le=^H:nd=^L:\ :up=\EM:do=\ED:bw:nw=\EE:sc=\E[s:rc=\E[u:ta=^I:bc=^H:bs:nl=\ED:\ :am:xn:\ :sf=\ED:sr=\EM:\ :cl=\E*:cd=\E[J:ce=\E[K:\ :al=\E[L:dl=\E[M:AL=\E[%dL:DL=\E[%dM:\ :so=\E[36m:se=\E[m:\ :mb=\E[5m:md=\E[33m:mh=\E[32m:mk=\E[8m:me=\E[m:\ :as=\E)3:ae=\E)0:\ :us=\E[4m:ue=\E[m:\ :vi=\E[>5h:ve=\E[>5l:\ :bl=^G:\ :kl=\E[D:kr=\E[C:ku=\E[A:kd=\E[B:\ :k0=\EZ:k1=\ES:k2=\ET:k3=\EU:k4=\EV:\ :k5=\EW:k6=\EE:k7=\EJ:k8=\EP:k9=\EQ:\ :kb=^H:\ :ti=\E[0;37m\E[>1h\E[>5l:te=\E[0;37m\E[>1l: # # Display hacker's tool # debug|debugging entry:\ :ae=:AL=:al=:am:as=:bl=:bs:bt=:bw:CC=:\ :cd=:ce=:ch=:cl=:cm=:co#80:cr=:\ :cs=:ct=:cv=:da:db:DC=:dc=:DL=:\ :dl=

:dm=:DO=:do=:ds=:ec=:ed=:ei=:\ :es:fs=:ho=:hs:IC=:ic=:im=:ip=:is=:\ :it#8:ke=:LE=:le=:li#24:ll=:mb=:md=:me=:\ :mh=:mi:mk=:mm=:mo=:mp=:mr=:ms=:nd=:\ :nw=:pc=:pf=:pO=:po=:ps=:rc=:RI=:\ :rp=:rs=:sc=:se=:SF=:sf=:so=:\ :SR=:sr=:st=:ta=:te=:ti=:uc=:ue=:\ :UP=:up=:us=:vb=:ve=:vi=:vs=: # dumb:\ :am:bl=^G:co#80:do=^J:nl=^M^J: slashem-0.0.7E7F3/sys/amiga/0000775000076400007640000000000010545462317013550 5ustar alialislashem-0.0.7E7F3/sys/amiga/xpm2iff.c0000664000076400007640000002023410545462317015270 0ustar aliali/* SCCS Id: @(#)xpm2iff.c 3.2 95/08/04 */ /* Copyright (c) 1995 by Gregg Wonderly, Naperville, Illinois */ /* NetHack may be freely redistributed. See license for details. */ #include #include "config.h" #include "tile.h" #include #include #include #include #include #include #include #include #ifndef _DCC # include # include # include #endif struct xpmscreen { int Width; int Height; int Colors; int ColorResolution; int Background; int AspectRatio; int Interlace; int BytesPerRow; } XpmScreen; /* translation table from xpm characters to RGB and colormap slots */ struct Ttable { char flag; char r,g,b; int slot; /* output colortable index */ }ttable[256]; pixval ColorMap[3][MAXCOLORMAPSIZE]; int colorsinmap; /* * We are using a hybrid form of our own design which we call a BMAP (for * bitmap) form. It is an ILBM with the bitmaps already deinterleaved, * completely uncompressed. * This speeds the loading of the images from the games point of view because it * does not have to deinterleave and uncompress them. */ #define ID_BMAP MAKE_ID( 'B', 'M', 'A', 'P' ) /* instead of ILBM */ #define ID_BMHD MAKE_ID( 'B', 'M', 'H', 'D' ) /* Same as ILBM */ #define ID_CAMG MAKE_ID( 'C', 'A', 'M', 'G' ) /* Same as ILBM */ #define ID_CMAP MAKE_ID( 'C', 'M', 'A', 'P' ) /* Same as ILBM */ #define ID_PDAT MAKE_ID( 'P', 'D', 'A', 'T' ) /* Extra data describing plane * size due to graphics.library * rounding requirements. */ #define ID_PLNE MAKE_ID( 'P', 'L', 'N', 'E' ) /* The planes of the image */ int nplanes; /* BMHD from IFF documentation */ typedef struct { UWORD w, h; WORD x, y; UBYTE nPlanes; UBYTE masking; UBYTE compression; UBYTE reserved1; UWORD transparentColor; UBYTE xAspect, yAspect; WORD pageWidth, pageHeight; } BitMapHeader; typedef struct { UBYTE r, g, b; } AmiColorMap; pixel pixels[TILE_Y][TILE_X]; AmiColorMap *cmap; void error( char *str ) { fprintf( stderr, "ERROR: %s\n", str ); } char **planes; main( int argc, char **argv ) { int colors; struct { long nplanes; long pbytes; long across; long down; long npics; long xsize; long ysize; } pdat; long pbytes; /* Bytes of data in a plane */ int i, cnt; BitMapHeader bmhd; struct IFFHandle *iff; long camg = HIRES|LACE; int tiles=0; int index; #if defined(_DCC) || defined (__GNUC__) IFFParseBase = OpenLibrary( "iffparse.library", 0 ); if( !IFFParseBase ) { error( "unable to open iffparse.library" ); exit( 1 ); } #endif if( fopen_xpm_file( argv[1], "r" ) != TRUE ) { perror( argv[1] ); return( 1 ); } nplanes = 0; i = XpmScreen.Colors - 1; while( i != 0 ) { nplanes++; i >>= 1; } planes = malloc( nplanes * sizeof( char * ) ); if( planes == 0 ) { error( "can not allocate planes pointer" ); exit( 1 ); } XpmScreen.BytesPerRow = ((XpmScreen.Width + 15)/16)*2; pbytes = XpmScreen.BytesPerRow * XpmScreen.Height; for( i = 0; i < nplanes; ++i ) { planes[ i ] = malloc( pbytes ); if( planes[ i ] == 0 ) { error( "can not allocate planes pointer" ); exit( 1 ); } memset( planes[i], 0, pbytes ); } iff = AllocIFF(); if( !iff ) { error( "Can not allocate IFFHandle" ); return( 1 ); } iff->iff_Stream = Open( argv[2], MODE_NEWFILE ); if( !iff->iff_Stream ) { error( "Can not open output file" ); return( 1 ); } InitIFFasDOS( iff ); OpenIFF( iff, IFFF_WRITE ); PushChunk( iff, ID_BMAP, ID_FORM, IFFSIZE_UNKNOWN ); bmhd.w = XpmScreen.Width; bmhd.h = XpmScreen.Height; bmhd.x = 0; bmhd.y = 0; bmhd.nPlanes = nplanes; bmhd.masking = 0; bmhd.compression = 0; bmhd.reserved1 = 0; bmhd.transparentColor = 0; bmhd.xAspect = 100; bmhd.yAspect = 100; bmhd.pageWidth = 0; /* not needed for this program */ bmhd.pageHeight = 0; /* not needed for this program */ PushChunk( iff, ID_BMAP, ID_BMHD, sizeof( bmhd ) ); WriteChunkBytes( iff, &bmhd, sizeof( bmhd ) ); PopChunk( iff ); PushChunk( iff, ID_BMAP, ID_CAMG, sizeof( camg ) ); WriteChunkBytes( iff, &camg, sizeof( camg ) ); PopChunk( iff ); #define SCALE(x) (x) cmap = malloc( (colors = (1L<iff_Stream ); FreeIFF( iff ); #if defined(_DCC) || defined (__GNUC__) CloseLibrary( IFFParseBase ); #endif exit( 0 ); } #define SETBIT(Plane, Plane_offset, Col, Value) \ if(Value){ \ planes[Plane][Plane_offset + (Col/8)] |= 1<<(7-(Col & 7)); \ } conv_image(){ int row, col, planeno; for(row = 0;row if any */ for(bp = buf;*bp;bp++); bp--; while(isspace(*bp))bp--; if(*bp==',')bp--; if(*bp=='"')bp--; bp++; *bp = '\0'; return &buf[1]; } slashem-0.0.7E7F3/sys/amiga/amitty.c0000664000076400007640000000257510545462317015234 0ustar aliali/* SCCS Id: @(#)amitty.c 3.2 2000/01/12 /* Copyright (c) Kenneth Lorber, Bethesda, Maryland 1993,1996 */ /* NetHack may be freely redistributed. See license for details. */ /* TTY-specific code for the Amiga * This is still experimental. * Still to do: * add real termcap handling - currently requires ANSI_DEFAULT */ #include "hack.h" #include "tcap.h" #include #include #ifdef _DCC # define getch() getchar() #endif #ifdef __SASC_60 # include #endif void NDECL( tty_change_color ); char *NDECL( tty_get_color_string ); #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(); if(s)raw_print(s); iflags.cbreak=ON; /* this is too easy: probably wrong */ #if 1 /* should be version>=36 */ /* if(IsInteractive(afh_in)){ */ SetMode(afh_in,0); /* con mode */ /* } */ #endif } void gettty(){ #if 1 /* should be VERSION >=36 */ /* if(IsInteractive(afh_in)){ */ SetMode(afh_in,1); /* raw mode */ /* } */ #endif } void setftty(){ iflags.cbreak=ON; /* ditto */ } char kill_char='X'-'@'; char erase_char='\b'; tgetch(){ char x; Read(afh_in,&x,1); return (x=='\r')?'\n':x; } void get_scr_size(){ CO=80; LI=24; } #endif void tty_change_color() {} char *tty_get_color_string() { return( "" ); } slashem-0.0.7E7F3/sys/amiga/winproto.h0000664000076400007640000001226410545462317015607 0ustar aliali/* SCCS Id: @(#)winproto.h 3.2 96/01/15 */ /* Copyright (c) Gregg Wonderly, Naperville, Illinois, 1991,1992,1993. */ /* NetHack may be freely redistributed. See license for details. */ /* winreq.c */ void EditColor ( void ); void EditClipping( void ); void DrawCol ( struct Window *w , int idx , UWORD *colors ); void DispCol ( struct Window *w , int idx , UWORD *colors ); void amii_change_color( int, long, int ); char *amii_get_color_string( ); void amii_getlin ( const char *prompt , char *bufp ); void getlind ( const char *prompt , char *bufp , const char *dflt ); char *amii_get_color_string( void ); int filecopy( char *from, char *to ); char *basename( char *str ); char *dirname( char *str ); /* winstr.c */ void amii_putstr ( winid window , int attr , const char *str ); void outmore ( struct amii_WinDesc *cw ); void outsubstr ( struct amii_WinDesc *cw , char *str , int len, int fudge ); void amii_putsym ( winid st , int i , int y , CHAR_P c ); void amii_addtopl ( const char *s ); void TextSpaces ( struct RastPort *rp , int nr ); void amii_remember_topl ( void ); long CountLines( winid ); long FindLine( winid, int ); int amii_doprev_message ( void ); void flushIDCMP( struct MsgPort * ); int amii_msgborder( struct Window * ); void amii_scrollmsg( register struct Window *w, register struct amii_WinDesc *cw ); /* winkey.c */ int amii_nh_poskey ( int *x , int *y , int *mod ); int amii_nhgetch ( void ); void amii_get_nh_event ( void ); void amii_getret ( void ); /* winmenu.c */ void amii_start_menu ( winid window ); void FDECL(amii_add_menu, (winid,int,const anything *,CHAR_P,CHAR_P,int,const char *,BOOLEAN_P)); void FDECL(amii_end_menu, (winid, const char *)); int FDECL(amii_select_menu, (winid, int, menu_item **)); int DoMenuScroll ( int win , int blocking, int how, menu_item ** ); void ReDisplayData ( winid win ); void DisplayData ( winid win , int start ); void SetPropInfo ( struct Window *win , struct Gadget *gad , long vis , long total , long top ); /* amiwind.c */ struct Window *OpenShWindow ( struct NewWindow *nw ); void CloseShWindow ( struct Window *win ); int ConvertKey ( struct IntuiMessage *message ); int kbhit ( void ); int kbhit ( void ); int amikbhit ( void ); int WindowGetchar ( void ); WETYPE WindowGetevent ( void ); void amii_cleanup ( void ); #ifndef SHAREDLIB void Abort ( long rc ); #endif void CleanUp ( void ); void flush_glyph_buffer ( struct Window *w ); void amiga_print_glyph ( winid window , int color_index , int glyph ); void start_glyphout ( winid window ); void amii_end_glyphout ( winid window ); struct NewWindow *DupNewWindow ( struct NewWindow *win ); void FreeNewWindow ( struct NewWindow *win ); void bell ( void ); void amii_delay_output ( void ); void amii_number_pad ( int state ); #ifndef SHAREDLIB void amiv_loadlib ( void ); void amii_loadlib ( void ); #endif void preserve_icon( void ); void clear_icon( void ); /* winfuncs.c */ void amii_destroy_nhwindow ( winid win ); int amii_create_nhwindow ( int type ); void amii_init_nhwindows ( int *, char ** ); void amii_setdrawpens( struct Window *, int type ); void amii_sethipens( struct Window *, int type, int attr ); void amii_setfillpens( struct Window *, int type ); void amii_clear_nhwindow ( winid win ); void dismiss_nhwindow ( winid win ); void amii_exit_nhwindows ( const char *str ); void amii_display_nhwindow ( winid win , boolean blocking ); void amii_curs ( winid window , int x , int y ); void kill_nhwindows ( int all ); void amii_cl_end ( struct amii_WinDesc *cw , int i ); void cursor_off ( winid window ); void cursor_on ( winid window ); void amii_suspend_nhwindows ( const char *str ); void amii_resume_nhwindows ( void ); void amii_bell ( void ); void removetopl ( int cnt ); void port_help ( void ); void amii_print_glyph ( winid win , xchar x , xchar y , int glyph ); void amii_raw_print ( const char *s ); void amii_raw_print_bold ( const char *s ); void amii_update_inventory ( void ); void amii_mark_synch ( void ); void amii_wait_synch ( void ); void amii_setclipped ( void ); void amii_cliparound ( int x , int y ); void amii_set_text_font( char *font, int size ); BitMapHeader ReadImageFiles( char **, struct BitMap **, char ** ); BitMapHeader ReadTileImageFiles(void); void FreeImageFiles( char **, struct BitMap ** ); void FreeTileImageFiles(); /* winami.c */ #ifdef SHAREDLIB int __UserLibInit ( void ); void __UserLibCleanup ( void ); #endif void amii_askname ( void ); void amii_player_selection ( void ); void RandomWindow ( char *name ); int amii_get_ext_cmd ( void ); char amii_yn_function ( const char *prompt , const char *resp , char def ); char amii_yn_function ( const char *query , const char *resp , char def ); void amii_display_file ( const char *fn , boolean complain ); void SetBorder ( struct Gadget *gd ); void *malloc ( register unsigned size ); void free ( void *q ); #ifdef SHAREDLIB /* amilib.c */ void amii_loadlib ( void ); void amiv_loadlib ( void ); void CleanUp ( void ); void setup_librefs ( WinamiBASE *base ); #else void Abort ( long rc ); #endif /* amirip.c */ void FDECL(amii_outrip, ( winid tmpwin, int how )); /* winchar.c */ void SetMazeType(MazeType); int GlyphToIcon(int glyph); #ifdef OPT_DISPMAP void dispmap_sanity(void); int dispmap_sanity1(int); #endif void FreeTileImageFiles(void); slashem-0.0.7E7F3/sys/amiga/amiwind.c0000664000076400007640000005166010545462317015354 0ustar aliali/* SCCS Id: @(#)amiwind.c 3.2 2000/01/12 /* Copyright (c) Olaf Seibert (KosmoSoft), 1989, 1992 */ /* Copyright (c) Kenneth Lorber, Bethesda, Maryland 1993,1996 */ /* NetHack may be freely redistributed. See license for details. */ #include "NH:sys/amiga/windefs.h" #include "NH:sys/amiga/winext.h" #include "NH:sys/amiga/winproto.h" /* Have to undef CLOSE as display.h and intuition.h both use it */ #undef CLOSE #ifdef AMII_GRAPHICS /* too early in the file? too late? */ #ifdef AMIFLUSH static struct Message *FDECL(GetFMsg,(struct MsgPort *)); #endif static int BufferGetchar(void); static void ProcessMessage( register struct IntuiMessage *message ); #define BufferQueueChar(ch) (KbdBuffer[KbdBuffered++] = (ch)) struct Library *ConsoleDevice; #include "NH:sys/amiga/amimenu.c" /* Now our own variables */ struct IntuitionBase *IntuitionBase; struct Screen *HackScreen; struct Window *pr_WindowPtr; struct MsgPort *HackPort; struct IOStdReq ConsoleIO; struct Menu *MenuStrip; APTR *VisualInfo; char Initialized = 0; WEVENT lastevent; #ifdef HACKFONT struct GfxBase *GfxBase; struct Library *DiskfontBase; #endif #define KBDBUFFER 10 static unsigned char KbdBuffer[KBDBUFFER]; unsigned char KbdBuffered; #ifdef HACKFONT struct TextFont *TextsFont = NULL; struct TextFont *HackFont = NULL; struct TextFont *RogueFont = NULL; UBYTE FontName[] = "NetHack:hack.font"; /* # chars in "NetHack:": */ #define SIZEOF_DISKNAME 8 #endif struct TextAttr Hack80 = { #ifdef HACKFONT &FontName[SIZEOF_DISKNAME], #else (UBYTE *) "topaz.font", #endif 8, FS_NORMAL, FPF_DISKFONT | FPF_DESIGNED | FPF_ROMFONT }; struct TextAttr TextsFont13 = { (UBYTE *) "courier.font", 13, FS_NORMAL, FPF_DISKFONT | FPF_DESIGNED #ifndef HACKFONT | FPF_ROMFONT #endif }; /* Avoid doing a ReplyMsg through a window that no longer exists. */ static enum {NoAction, CloseOver} delayed_key_action = NoAction; /* * Open a window that shares the HackPort IDCMP. Use CloseShWindow() * to close. */ struct Window *OpenShWindow(nw) struct NewWindow *nw; { register struct Window *win; register ULONG idcmpflags; if (!HackPort) /* Sanity check */ return (struct Window *) 0; idcmpflags = nw->IDCMPFlags; nw->IDCMPFlags = 0; if (!(win = OpenWindow((void *)nw))) { nw->IDCMPFlags = idcmpflags; return (struct Window *) 0; } nw->IDCMPFlags = idcmpflags; win->UserPort = HackPort; ModifyIDCMP(win, idcmpflags); return win; } /* * Close a window that shared the HackPort IDCMP port. */ void FDECL(CloseShWindow, (struct Window *)); void CloseShWindow(win) struct Window *win; { register struct IntuiMessage *msg; if( !HackPort ) panic("HackPort NULL in CloseShWindow" ); if (!win) return; Forbid(); /* Flush all messages for all windows to avoid typeahead and other * similar problems... */ while( msg = (struct IntuiMessage *)GetMsg( win->UserPort ) ) ReplyMsg( (struct Message *) msg ); KbdBuffered = 0; win->UserPort = (struct MsgPort *) 0; ModifyIDCMP(win, 0L); Permit(); CloseWindow(win); } static int BufferGetchar() { register int c; if (KbdBuffered > 0) { c = KbdBuffer[0]; KbdBuffered--; /* Move the remaining characters */ if( KbdBuffered < sizeof( KbdBuffer ) ) memcpy( KbdBuffer, KbdBuffer+1, KbdBuffered ); return c; } return NO_CHAR; } /* * This should remind you remotely of DeadKeyConvert, but we are cheating * a bit. We want complete control over the numeric keypad, and no dead * keys... (they are assumed to be on Alted keys). * * Also assumed is that the IntuiMessage is of type RAWKEY. For some * reason, IECODE_UP_PREFIX events seem to be lost when they occur while * our console window is inactive. This is particulary troublesome with * qualifier keys... Is this because I never RawKeyConvert those events??? */ int ConvertKey(message) register struct IntuiMessage *message; { static struct InputEvent theEvent; static char numpad[] = "bjnh.lyku"; static char ctrl_numpad[] = "\x02\x0A\x0E\x08.\x0C\x19\x0B\x15"; static char shift_numpad[] = "BJNH.LYKU"; unsigned char buffer[10]; struct Window *w = message->IDCMPWindow; register int length; register ULONG qualifier; char numeric_pad, shift, control, alt; if( amii_wins[ WIN_MAP ] ) w = amii_wins[ WIN_MAP ]->win; qualifier = message->Qualifier; control = (qualifier & IEQUALIFIER_CONTROL) != 0; shift = (qualifier & (IEQUALIFIER_LSHIFT | IEQUALIFIER_RSHIFT)) != 0; alt = (qualifier & (IEQUALIFIER_LALT | IEQUALIFIER_RALT )) != 0; /* Allow ALT to function as a META key ... */ /* But make it switchable - alt is needed for some non-US keymaps */ if(flags.altmeta) qualifier &= ~(IEQUALIFIER_LALT | IEQUALIFIER_RALT); numeric_pad = (qualifier & IEQUALIFIER_NUMERICPAD) != 0; /* * Shortcut for HELP and arrow keys. I suppose this is allowed. * The defines are in intuition/intuition.h, and the keys don't * serve 'text' input, normally. Also, parsing their escape * sequences is such a mess... */ switch (message->Code) { case RAWHELP: if( alt ) { EditColor(); return( -1 ); } #ifdef CLIPPING else if( WINVERS_AMIV && control ) { EditClipping(); CO = ( w->Width - w->BorderLeft - w->BorderRight ) / mxsize; LI = ( w->Height - w->BorderTop - w->BorderBottom ) / mysize; clipxmax = CO + clipx; clipymax = LI + clipy; if( CO < COLNO || LI < ROWNO ) { clipping = TRUE; amii_cliparound( u.ux, u.uy ); } else { clipping = FALSE; clipx = clipy = 0; } BufferQueueChar( 'R'-64 ); return(-1); } #endif else if( WINVERS_AMIV && shift ) { if( WIN_OVER == WIN_ERR ) { WIN_OVER = amii_create_nhwindow( NHW_OVER ); BufferQueueChar( 'R'-64 ); } else { delayed_key_action = CloseOver; } return( -1 ); } return( '?' ); break; case CURSORLEFT: length = '4'; numeric_pad = 1; goto arrow; case CURSORDOWN: length = '2'; numeric_pad = 1; goto arrow; case CURSORUP: length = '8'; numeric_pad = 1; goto arrow; case CURSORRIGHT: length = '6'; numeric_pad = 1; goto arrow; } theEvent.ie_Class = IECLASS_RAWKEY; theEvent.ie_Code = message->Code; theEvent.ie_Qualifier = numeric_pad ? IEQUALIFIER_NUMERICPAD : qualifier; theEvent.ie_EventAddress = (APTR) (message->IAddress); length = RawKeyConvert(&theEvent, (char *)buffer, (long) sizeof(buffer), NULL); if (length == 1) { /* Plain ASCII character */ length = buffer[0]; /* * If iflags.num_pad is set, movement is by 4286. * If not set, translate 4286 into hjkl. * This way, the numeric pad can /always/ be used * for moving, though best results are when it is off. */ arrow: if (!iflags.num_pad && numeric_pad && length >= '1' && length <= '9') { length -= '1'; if (control) { length = ctrl_numpad[length]; } else if (shift) { length = shift_numpad[length]; } else { 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); } /* else shift, ctrl, alt, amiga, F-key, shift-tab, etc */ else if( length > 1 ) { int i; if( length == 3 && buffer[ 0 ] == 155 && buffer[ 2 ] == 126 ) { int got = 1; switch( buffer[ 1 ] ) { case 53: mxsize = mysize = 8; break; case 54: mxsize = mysize = 16; break; case 55: mxsize = mysize = 24; break; case 56: mxsize = mysize = 32; break; case 57: mxsize = mysize = 48; break; default: got = 0; break; } #ifdef OPT_DISPMAP dispmap_sanity(); #endif if( got ) { CO = (w->Width-w->BorderLeft-w->BorderRight)/mxsize; LI = (w->Height-w->BorderTop-w->BorderBottom)/mysize; clipxmax = CO + clipx; clipymax = LI + clipy; if( CO < COLNO || LI < ROWNO ) { amii_cliparound( u.ux, u.uy ); } else { CO = COLNO; LI = ROWNO; } reclip = 1; doredraw(); flush_screen( 1 ); reclip = 0; /*BufferQueueChar( 'R'-64 );*/ return( -1 ); } } printf( "Unrecognized key: %d ", (int)buffer[0]); for( i = 1; i < length; ++i ) printf( "%d ", (int)buffer[i]); printf( "\n" ); } return( -1 ); } /* * Process an incoming IntuiMessage. * It would certainly look nicer if this could be done using a * PA_SOFTINT message port, but we cannot call RawKeyConvert() * during a software interrupt. * Anyway, amikbhit()/kbhit() is called often enough, and usually gets * ahead of input demands, when the user types ahead. */ static void ProcessMessage(message) register struct IntuiMessage *message; { int c; int cnt; menu_item *mip; static int skip_mouse=0; /* need to ignore next mouse event on * a window activation */ struct Window *w = message->IDCMPWindow; switch(message->Class) { case ACTIVEWINDOW: if( alwaysinvent && WIN_INVEN != WIN_ERR && w == amii_wins[ WIN_INVEN ]->win ) { cnt = DoMenuScroll( WIN_INVEN, 0, PICK_NONE, &mip ); } else if( scrollmsg && WIN_MESSAGE != WIN_ERR && w == amii_wins[ WIN_MESSAGE ]->win ) { cnt = DoMenuScroll( WIN_MESSAGE, 0, PICK_NONE, &mip ); } else { skip_mouse=1; } break; case MOUSEBUTTONS: { if( skip_mouse ) { skip_mouse=0; break; } if( !amii_wins[ WIN_MAP ] || w != amii_wins[ WIN_MAP ]->win ) break; if( message->Code == SELECTDOWN ) { lastevent.type = WEMOUSE; lastevent.un.mouse.x = message->MouseX; lastevent.un.mouse.y = message->MouseY; /* With shift equals RUN */ lastevent.un.mouse.qual = (message->Qualifier & (IEQUALIFIER_LSHIFT|IEQUALIFIER_RSHIFT)) != 0; } } break; case MENUPICK: { USHORT thismenu; struct MenuItem *item; thismenu = message->Code; while (thismenu != MENUNULL) { item = ItemAddress(MenuStrip, (ULONG) thismenu); if (KbdBuffered < KBDBUFFER) BufferQueueChar((char)(GTMENUITEM_USERDATA(item))); thismenu = item->NextSelect; } } break; case REFRESHWINDOW: { if( scrollmsg && amii_wins[ WIN_MESSAGE ] && w == amii_wins[ WIN_MESSAGE ]->win ){ cnt = DoMenuScroll( WIN_MESSAGE, 0, PICK_NONE, &mip ); } } break; case CLOSEWINDOW: if( WIN_INVEN != WIN_ERR && w == amii_wins[ WIN_INVEN ]->win ) { dismiss_nhwindow( WIN_INVEN ); } if( WINVERS_AMIV && ( WIN_OVER != WIN_ERR && w == amii_wins[ WIN_OVER ]->win ) ){ destroy_nhwindow( WIN_OVER ); WIN_OVER = WIN_ERR; } break; case RAWKEY: if (!(message->Code & IECODE_UP_PREFIX)){ /* May queue multiple characters * but doesn't do that yet... */ if( ( c = ConvertKey(message) ) > 0 ) BufferQueueChar( c ); } break; case GADGETDOWN: if( WIN_MESSAGE != WIN_ERR && w == amii_wins[ WIN_MESSAGE ]->win ) { cnt = DoMenuScroll( WIN_MESSAGE, 0, PICK_NONE, &mip ); } else if( WIN_INVEN != WIN_ERR && w == amii_wins[ WIN_INVEN ]->win ) { cnt = DoMenuScroll( WIN_INVEN, 0, PICK_NONE, &mip ); } break; case NEWSIZE: if( WIN_MESSAGE != WIN_ERR && w == amii_wins[ WIN_MESSAGE ]->win ) { if( WINVERS_AMIV ) { /* Make sure that new size is honored for good. */ SetAPen( w->RPort, amii_msgBPen ); SetBPen( w->RPort, amii_msgBPen ); SetDrMd( w->RPort, JAM2 ); RectFill( w->RPort, w->BorderLeft, w->BorderTop, w->Width - w->BorderRight-1, w->Height - w->BorderBottom-1 ); } ReDisplayData( WIN_MESSAGE ); } else if( WIN_INVEN != WIN_ERR && w == amii_wins[ WIN_INVEN ]->win ) { ReDisplayData( WIN_INVEN ); } else if( WINVERS_AMIV && ( WIN_OVER != WIN_ERR && w == amii_wins[ WIN_OVER ]->win ) ){ BufferQueueChar( 'R'-64 ); } else if( WIN_MAP != WIN_ERR && w == amii_wins[ WIN_MAP ]->win ) { #ifdef CLIPPING CO = (w->Width-w->BorderLeft-w->BorderRight)/mxsize; LI = (w->Height-w->BorderTop-w->BorderBottom)/mysize; clipxmax = CO + clipx; clipymax = LI + clipy; if( CO < COLNO || LI < ROWNO ) { amii_cliparound( u.ux, u.uy ); } else { clipping = FALSE; clipx = clipy = 0; } BufferQueueChar( 'R'-64 ); #endif } break; } ReplyMsg((struct Message *) message); switch(delayed_key_action){ case CloseOver: amii_destroy_nhwindow( WIN_OVER ); WIN_OVER = WIN_ERR; delayed_key_action = NoAction; case NoAction: ; /* null */ } } #endif /* AMII_GRAPHICS */ /* * Get all incoming messages and fill up the keyboard buffer, * thus allowing Intuition to (maybe) free up the IntuiMessages. * Return when no more messages left, or keyboard buffer half full. * We need to do this since there is no one-to-one correspondence * between characters and incoming messages. */ #if defined(TTY_GRAPHICS) && !defined(AMII_GRAPHICS) int kbhit(){ return 0; } #else int kbhit() { int c; # ifdef TTY_GRAPHICS /* a kludge to defuse the mess in allmain.c */ /* I hope this is the right approach */ if(windowprocs.win_init_nhwindows==amii_procs.win_init_nhwindows)return 0; # endif c = amikbhit(); if( c <= 0 ) return( 0 ); return( c ); } #endif #ifdef AMII_GRAPHICS int amikbhit() { register struct IntuiMessage *message; while( KbdBuffered < KBDBUFFER / 2 ) { #ifdef AMIFLUSH message = (struct IntuiMessage *) GetFMsg(HackPort); #else message = (struct IntuiMessage *) GetMsg(HackPort); #endif if(message) { ProcessMessage(message); if( lastevent.type != WEUNK && lastevent.type != WEKEY ) break; } else break; } return ( lastevent.type == WEUNK ) ? KbdBuffered : -1; } /* * Get a character from the keyboard buffer, waiting if not available. * Ignore other kinds of events that happen in the mean time. */ int WindowGetchar( ) { while ((lastevent.type = WEUNK), amikbhit() <= 0) { WaitPort(HackPort); } return BufferGetchar(); } WETYPE WindowGetevent() { lastevent.type = WEUNK; while (amikbhit() == 0) { WaitPort(HackPort); } if( KbdBuffered ) { lastevent.type = WEKEY; lastevent.un.key = BufferGetchar(); } return( lastevent.type ); } /* * Clean up everything. But before we do, ask the user to hit return * when there is something that s/he should read. */ void amii_cleanup() { register struct IntuiMessage *msg; /* Close things up */ if( HackPort ) { amii_raw_print(""); amii_getret(); } if (ConsoleIO.io_Device) CloseDevice( (struct IORequest *)&ConsoleIO ); 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 */ if( HackPort ) { Forbid(); while (msg = (struct IntuiMessage *) GetMsg(HackPort)) ReplyMsg((struct Message *) msg); kill_nhwindows( 1 ); DeleteMsgPort( HackPort ); HackPort = NULL; Permit(); } /* Close the screen, under v37 or greater it is a pub screen and there may * be visitors, so check close status and wait till everyone is gone. */ if( HackScreen ) { #ifdef INTUI_NEW_LOOK if( IntuitionBase->LibNode.lib_Version >= 37 ) { if (MenuStrip) FreeMenus(MenuStrip); if (VisualInfo) FreeVisualInfo(VisualInfo); while( CloseScreen( HackScreen ) == FALSE ) { struct EasyStruct easy = { sizeof( struct EasyStruct ), 0, "Nethack Problem", "Can't Close Screen, Close Visiting Windows", "Okay" }; EasyRequest( NULL, &easy, NULL, NULL ); } } else #endif { CloseScreen(HackScreen); } HackScreen = NULL; } #ifdef HACKFONT if (HackFont) { CloseFont(HackFont); HackFont = NULL; } if( TextsFont ) { CloseFont( TextsFont ); TextsFont = NULL; } if( RogueFont ) { CloseFont( RogueFont ); RogueFont = NULL; } if( DiskfontBase ) { CloseLibrary(DiskfontBase); DiskfontBase = NULL; } #endif if (GadToolsBase) { CloseLibrary((struct Library *)GadToolsBase); GadToolsBase=NULL; } if (LayersBase) { CloseLibrary((struct Library *)LayersBase); LayersBase = NULL; } if (GfxBase) { CloseLibrary((struct Library *)GfxBase); GfxBase = NULL; } if (IntuitionBase) { CloseLibrary((struct Library *)IntuitionBase); IntuitionBase = NULL; } #ifdef SHAREDLIB if (DOSBase) { CloseLibrary((struct Library *)DOSBase); DOSBase = NULL; } #endif ((struct Process *) FindTask(NULL))->pr_WindowPtr = (APTR) pr_WindowPtr; Initialized = 0; } #endif /* AMII_GRAPHICS */ #ifndef SHAREDLIB void Abort(rc) long rc; { int fault = 1; #ifdef CHDIR extern char orgdir[]; chdir(orgdir); #endif #ifdef AMII_GRAPHICS if (Initialized && ConsoleDevice && windowprocs.win_init_nhwindows==amii_procs.win_init_nhwindows) { printf("\n\nAbort with alert code %08lx...\n", rc); amii_getret(); } else #endif printf("\n\nAbort with alert code %08lx...\n",rc); /* Alert(rc); this is too severe */ #ifdef __SASC # ifdef INTUI_NEW_LOOK if( IntuitionBase->LibNode.lib_Version >= 37 ) { struct EasyStruct es = { sizeof( struct EasyStruct ), 0, "NetHack Panic Request", "NetHack is Aborting with code == 0x%08lx", "Continue Abort|Return to Program|Clean up and exit", }; fault = EasyRequest( NULL, &es, NULL, (long)rc ); if( fault == 2 ) return; } # endif if( fault == 1 ) { /* __emit(0x4afc); */ /* illegal instruction */ __emit(0x40fc); /* divide by */ __emit(0x0000); /* #0 */ /* NOTE: don't move amii_cleanup() above here - */ /* it is too likely to kill the system */ /* before it can get the SnapShot out, if */ /* there is something really wrong. */ } #endif #ifdef AMII_GRAPHICS if(windowprocs.win_init_nhwindows==amii_procs.win_init_nhwindows) amii_cleanup(); #endif #undef exit #ifdef AZTEC_C _abort(); #endif exit((int) rc); } void CleanUp() { amii_cleanup(); } #endif #ifdef AMII_GRAPHICS #ifdef AMIFLUSH /* This routine adapted from AmigaMail IV-37 by Michael Sinz */ static struct Message * GetFMsg(port) struct MsgPort *port; { struct IntuiMessage *msg,*succ,*succ1; if(msg=(struct IntuiMessage *)GetMsg(port)){ if(!flags.amiflush)return((struct Message *)msg); if(msg->Class==RAWKEY){ Forbid(); succ=(struct IntuiMessage *)(port->mp_MsgList.lh_Head); while(succ1=(struct IntuiMessage *) (succ->ExecMessage.mn_Node.ln_Succ)){ if(succ->Class==RAWKEY){ Remove((struct Node *)succ); ReplyMsg((struct Message *)succ); } succ=succ1; } Permit(); } } return((struct Message *)msg); } #endif struct NewWindow * DupNewWindow( win ) struct NewWindow *win; { struct NewWindow *nwin; struct Gadget *ngd, *gd, *pgd = NULL; struct PropInfo *pip; struct StringInfo *sip; /* Copy the (Ext)NewWindow structure */ nwin = (struct NewWindow *)alloc( sizeof( struct NewWindow ) ); *nwin = *win; /* Now do the gadget list */ nwin->FirstGadget = NULL; for( gd = win->FirstGadget; gd; gd = gd->NextGadget ) { ngd = (struct Gadget *)alloc( sizeof( struct Gadget ) ); *ngd = *gd; if( gd->GadgetType == STRGADGET ) { sip = (struct StringInfo *)alloc( sizeof( struct StringInfo ) ); *sip = *((struct StringInfo *)gd->SpecialInfo); sip->Buffer = (UBYTE *) alloc( sip->MaxChars ); *sip->Buffer = 0; ngd->SpecialInfo = (APTR)sip; } else if( gd->GadgetType == PROPGADGET ) { pip = (struct PropInfo *)alloc( sizeof( struct PropInfo ) ); *pip = *((struct PropInfo *)gd->SpecialInfo); ngd->SpecialInfo = (APTR)pip; } if( pgd ) pgd->NextGadget = ngd; else nwin->FirstGadget = ngd; pgd = ngd; ngd->NextGadget = NULL; ngd->UserData = (APTR) 0x45f35c3d; // magic cookie for FreeNewWindow() } return( nwin ); } void FreeNewWindow( win ) struct NewWindow *win; { 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 ); } void bell() { if (flags.silent) return; DisplayBeep(NULL); } void amii_delay_output() { /* delay 50 ms */ Delay(2L); } void amii_number_pad(state) int state; { } #endif /* AMII_GRAPHICS */ #ifndef SHAREDLIB void amiv_loadlib( void ) { } void amii_loadlib( void ) { } /* fatal error */ /*VARARGS1*/ void error VA_DECL(const char *, s) VA_START(s); VA_INIT(s, char *); putchar('\n'); vprintf(s, VA_ARGS); putchar('\n'); VA_END(); Abort(0L); } #endif slashem-0.0.7E7F3/sys/amiga/amidos.c0000664000076400007640000002476210545462317015203 0ustar aliali/* SCCS Id: @(#)amidos.c 3.2 2000/01/12 /* Copyright (c) Olaf Seibert, Nijmegen, The Netherlands, 1988,1990. */ /* Copyright (c) Kenneth Lorber, Bethesda, Maryland, 1991,1992,1993,1996. */ /* NetHack may be freely redistributed. See license for details. */ /* * An assortment of imitations of cheap plastic MSDOS and Unix functions. */ #include "hack.h" #include "winami.h" /* Defined in config.h, let's undefine it here (static function below) */ #undef strcmpi #include #include #include #undef COUNT #if defined(__SASC_60) || defined(__GNUC__) # include # include #endif #ifdef AZTEC_50 # include # undef strcmpi #endif /* Prototypes */ #include "NH:sys/amiga/winami.p" #include "NH:sys/amiga/amiwind.p" #include "NH:sys/amiga/amidos.p" extern char Initialized; extern struct window_procs amii_procs; #ifndef __SASC_60 int Enable_Abort = 0; /* for stdio package */ #endif /* Initial path, so we can find NetHack.cnf */ char PATH[PATHLEN] = "NetHack:"; static boolean record_exists(void); void flushout() { (void) fflush(stdout); } #ifndef getuid getuid() { return 1; } #endif #ifndef getlogin char * getlogin() { return ((char *) NULL); } #endif #ifndef AZTEC_50 int abs(x) int x; { return x < 0? -x: x; } #endif #ifdef SHELL int 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 { i = 0; pline("No mysterious force prevented you from using multitasking."); } return i; } #endif /* SHELL */ #ifdef MFLOPPY # include # define Sprintf (void) sprintf #define EXTENSION 72 /* * This routine uses an approximation of the free bytes on a disk. * How large a file you can actually write depends on the number of * extension blocks you need for it. * In each extenstion block there are maximum 72 pointers to blocks, * so every 73 disk blocks have only 72 available for data. * The (necessary) file header is also good for 72 data block pointers. */ /* TODO: update this for FFS */ long freediskspace(path) char *path; { register long freeBytes = 0; register struct InfoData *infoData; /* Remember... longword aligned */ char fileName[32]; /* * Find a valid path on the device of which we want the free space. * If there is a colon in the name, it is an absolute path * and all up to the colon is everything we need. * Remember slashes in a volume name are allowed! * If there is no colon, it is relative to the current directory, * so must be on the current device, so "" is enough... */ { register char *colon; strncpy(fileName, path, sizeof(fileName) - 1); fileName[31] = 0; if (colon = index(fileName, ':')) colon[1] = '\0'; else fileName[0] = '\0'; } { BPTR fileLock; infoData = (struct InfoData *) alloc(sizeof(struct InfoData)); if (fileLock = Lock(fileName, SHARED_LOCK)) { if (Info(fileLock, infoData)) { /* We got a kind of DOS volume, since we can Lock it. */ /* Calculate number of blocks available for new file */ /* Kludge for the ever-full VOID: (oops RAM:) device */ if (infoData->id_UnitNumber == -1 && infoData->id_NumBlocks == infoData->id_NumBlocksUsed) { freeBytes = AvailMem(0L) - 64 * 1024L; /* Just a stupid guess at the */ /* Ram-Handler overhead per block: */ freeBytes -= freeBytes/16; } else { /* Normal kind of DOS file system device/volume */ freeBytes = infoData->id_NumBlocks - infoData->id_NumBlocksUsed; freeBytes -= (freeBytes + EXTENSION) / (EXTENSION + 1); freeBytes *= infoData->id_BytesPerBlock; } if (freeBytes < 0) freeBytes = 0; } UnLock(fileLock); } free(infoData); return freeBytes; } } long filesize(file) char *file; { register BPTR fileLock; register struct FileInfoBlock *fileInfoBlock; register long size = 0; fileInfoBlock = (struct FileInfoBlock *)alloc(sizeof(struct FileInfoBlock)); if (fileLock = Lock(file, SHARED_LOCK)) { if (Examine(fileLock, fileInfoBlock)) { size = fileInfoBlock->fib_Size; } UnLock(fileLock); } free(fileInfoBlock); return size; } #if 0 void eraseall(path, files) const char *path, *files; { BPTR dirLock, dirLock2; struct FileInfoBlock *fibp; int chklen; #ifdef BETA if(files != alllevels)panic("eraseall"); #endif chklen=(int)index(files,'*')-(int)files; if (dirLock = Lock( (char *)path ,SHARED_LOCK)) { dirLock2=DupLock(dirLock); dirLock2= CurrentDir(dirLock2); fibp=AllocMem(sizeof(struct FileInfoBlock),0); if(fibp){ if(Examine(dirLock,fibp)){ while(ExNext(dirLock,fibp)){ if(!strncmp(fibp->fib_FileName,files,chklen)){ DeleteFile(fibp->fib_FileName); } } } FreeMem(fibp,sizeof(struct FileInfoBlock)); } UnLock(dirLock); UnLock(CurrentDir(dirLock2)); } } #endif /* This size makes that most files can be copied with two Read()/Write()s */ #if 0 /* Unused */ #define COPYSIZE 4096 char *CopyFile(from, to) const char *from, *to; { register BPTR fromFile, toFile; register char *buffer; register long size; char *error = NULL; buffer = (char *) alloc(COPYSIZE); if (fromFile = Open( (char *)from, MODE_OLDFILE)) { if (toFile = Open( (char *)to, MODE_NEWFILE)) { while (size = Read(fromFile, buffer, (long)COPYSIZE)) { if (size == -1){ error = "Read error"; break; } if (size != Write(toFile, buffer, size)) { error = "Write error"; break; } } Close(toFile); } else error = "Cannot open destination"; Close(fromFile); } else error = "Cannot open source (this should not occur)"; free(buffer); return error; } #endif /* this should be replaced */ saveDiskPrompt(start) { char buf[BUFSIZ], *bp; BPTR fileLock; if (flags.asksavedisk) { /* Don't prompt if you can find the save file */ if (fileLock = Lock(SAVEF, SHARED_LOCK)) { UnLock(fileLock); #if defined(TTY_GRAPHICS) if(windowprocs.win_init_nhwindows!=amii_procs.win_init_nhwindows) clear_nhwindow( WIN_MAP ); #endif #if defined(AMII_GRAPHICS) if(windowprocs.win_init_nhwindows==amii_procs.win_init_nhwindows) clear_nhwindow( WIN_BASE ); #endif return 1; } pline( "If save file is on a SAVE disk, put that disk in now." ); if( strlen( SAVEF ) > QBUFSZ - 25 - 22 ) panic( "not enough buffer space for prompt" ); /* THIS IS A HACK */ #if defined(TTY_GRAPHICS) if(windowprocs.win_init_nhwindows!=amii_procs.win_init_nhwindows){ getlin("File name ?",buf); clear_nhwindow( WIN_MAP ); } #endif #if defined(AMII_GRAPHICS) if(windowprocs.win_init_nhwindows==amii_procs.win_init_nhwindows){ getlind("File name ?", buf, SAVEF); clear_nhwindow( WIN_BASE ); } #endif clear_nhwindow( WIN_MESSAGE); if (!start && *buf == '\033') return 0; /* Strip any whitespace. Also, if nothing was entered except * whitespace, do not change the value of SAVEF. */ for (bp = buf; *bp; bp++) { if (!isspace(*bp)) { strncpy(SAVEF, bp, PATHLEN); break; } } } return 1; } /* Return 1 if the record file was found */ static boolean record_exists() { FILE *file; if (file = fopenp(RECORD, "r")) { fclose(file); return TRUE; } return FALSE; } #ifdef MFLOPPY /* * Under MSDOS: Prompt for game disk, then check for record file. * For Amiga: do nothing, but called from restore.c */ void gameDiskPrompt(){} #endif /* * Add a slash to any name not ending in / or :. There must * be room for the /. */ void append_slash(name) char *name; { char *ptr; if (!*name)return; ptr = eos(name) - 1; if (*ptr != '/' && *ptr != ':') { *++ptr = '/'; *++ptr = '\0'; } } void getreturn(str) const char *str; { int ch; raw_printf("Hit %s.", str); while ((ch = nhgetch()) != '\n' && ch != '\r' ) continue; } /* Follow the PATH, trying to fopen the file. */ #define PATHSEP ';' FILE * fopenp(name, mode) register const char *name, *mode; { register char *bp, *pp, lastch; register FILE *fp; register BPTR theLock; char buf[BUFSIZ]; /* Try the default directory first. Then look along PATH. */ if (strlen(name) >= BUFSIZ) return( NULL ); strcpy(buf, name); if (theLock = Lock(buf, SHARED_LOCK)) { UnLock(theLock); if (fp = fopen(buf, mode)) return fp; } pp = PATH; while (pp && *pp) { bp = buf; while (*pp && *pp != PATHSEP){ if( bp > buf + BUFSIZ - 1 ) return( NULL ); lastch = *bp++ = *pp++; } if (lastch != ':' && lastch != '/' && bp != buf) *bp++ = '/'; if (bp + strlen(name) > buf + BUFSIZ - 1) return( NULL ); strcpy(bp, name); if (theLock = Lock(buf, SHARED_LOCK)) { UnLock(theLock); if (fp = fopen(buf, mode)) return fp; } if (*pp) pp++; } return NULL; } #endif /* MFLOPPY */ #ifdef CHDIR /* * A not general-purpose directory changing routine. * Assumes you want to return to the original directory eventually, * by chdir()ing to orgdir (which is defined in pcmain.c). * Assumes -1 is not a valid lock, since 0 is valid. */ #define NO_LOCK ((BPTR) -1) static BPTR OrgDirLock = NO_LOCK; chdir(dir) char *dir; { extern char orgdir[]; if (dir == orgdir) { /* We want to go back to where we came from. */ if (OrgDirLock != NO_LOCK) { UnLock(CurrentDir(OrgDirLock)); OrgDirLock = NO_LOCK; } } else { /* * Go to some new place. If still at the original * directory, save the FileLock. */ BPTR newDir; if (newDir = Lock( (char *)dir, SHARED_LOCK)) { if (OrgDirLock == NO_LOCK) { OrgDirLock = CurrentDir(newDir); } else { UnLock(CurrentDir(newDir)); } } else { return -1; /* Failed */ } } /* CurrentDir always succeeds if you have a lock */ return 0; } #endif /* CHDIR */ /* Chdir back to original directory */ #undef exit void nethack_exit(code) { #ifdef CHDIR extern char orgdir[]; #endif #ifdef CHDIR chdir(orgdir); /* chdir, not chdirx */ #endif #ifdef AMII_GRAPHICS if(windowprocs.win_init_nhwindows==amii_procs.win_init_nhwindows) CleanUp(); #endif exit(code); } void regularize(s) /* normalize file name - we don't like :'s or /'s */ register char *s; { register char *lp; while((lp = index(s, ':')) || (lp = index(s, '/'))) *lp = '_'; } slashem-0.0.7E7F3/sys/amiga/grave16.xpm0000664000076400007640000023641310545462317015562 0ustar aliali/* XPM */ static char *noname[] = { /* width height ncolors chars_per_pixel */ "400 200 16 1", /* colors */ "` c #66686A", "a c #797979", "b c #929291", "c c #43444A", "d c #758A74", "e c #F2F2F2", "f c #D1D0CE", "g c #066906", "h c #065506", "i c #53535C", "j c #0C0D0F", "k c #A3A5A2", "l c #2D332E", "m c #C3C4C1", "n c #B4B4B2", "o c #07840A", /* pixels */ "jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjljjjjjjjjjjjjjjjljjjjjjjjjjjljljjljljjljjllljljclljlllljlllljlllllllllllllllcicl``clcllclclllclclclcclclclcccccccccccccccccccii`iiccicicicciiciiiiiibiic`iii`a`iiii`icaii`iiii`iiii`ii`ii`iii```iii`i`ii`ii`ii`iiii`iii`ii`iifi`ii`ii`iiiiiiiiiiiiiiiiiiiiii`iciibicicicicciiccciiibiicciiiiccccbicicccccccciccclcccccclc`aiciiiciccclilccccccccccclcccacccccccclccclcclccc", "jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjljjjjjjjljjjjjjljjjjjjajljjljljljljjjjljjljc`baljjllcljjcjlljllllllllllllllllllllllcclllllllclllcclcllclclccccccccclccccccccccccicciicciicicicic`cciiciciciciacicii`iiiiii``iiakii`iiii`ii`ii`iiii`bkb`i`ci``iiiiii`iii`ii``i`iiiiiaiiiiiiiiii`iiiiiiiiiiiiiiiiiiiiiciiciciicicciciiiicllic`iciiiicicciliccccccccccccc`ccccliccccccccciciccclccccclclclclcclccclclclllccclcllccll", "ijjjjjjjjjjjjjjjjjjljjjjjjjjljjjjjjjjjjjljjjljjjjjjljljjjjjjjljjjljljljljjjjlljljljljcclljllllljlllljllllllllllllllllcclccclcjcllclclclclllcclclcccccccccccciccccciiic`a`icciiccciciiiiiiiiibi`iiiiii`ii`ci`iii`ii`i`iiiiiiiii`iii``ici`i`i`i``ii`ii`iiiiiiic``iiiiiiiiiiiiiiaiiiiiiiiiiciicicii`iiiiiliiccicicccicccci`ccicccicccclccinccccccccclcccaccccccclccccccccccilcl`lllccclcclcclcllcllclcccclllilcllci", "jjjjjjjjjjjjj`cjjjjljjjjjjjjcljljjjjjjjljjljijjljjjjjjjljljljjljljljlljljllljjljllflcjljllljljlljllllcllllllllllllcllllccllcc`clclllcllcclclcccclccccccccciccciciccccccic`iciic`iiiiciiiiiiiaiii`iii`i`icak`c``i`iiiiii`ii`i`iii`i`ii`iiiiiiici`iii`ii`i`ii``iiii`c`iiiiiiiii`iiiiiiiiciiiiiiiiiiiccccciccicicciiccccciaillcccciiciccclcccccccccccccc`cclclccillccllcliibilikaicllcclccccclcccclcccccllccllcclcl", "jjcjjjjjjjjljjjjjjjjjjjjjjjjljjjljjjjjjjjjjjljjjjjljjcjjjljjljjljjjljjljljjjlljllljlllcljllllllllllllcclllllllllclllcclccibccclclcclcclcllicicccccccclcccccccciciicciccciaaiciccciiiiiiii`ciiiiii`iiiii`ic`iiiiiiii`ii`iiiiiiiiii`iiiiiciiiii`i`iiiii`ii`iiiciiiiiiiiiiiiiiciiiciiciciiccicciiiiiicicc`cccccccicccccicciiccicccicclilccccccclccccclccllcccilcccclcciclccciclcclccclccclclllcllcllccllcccclaacccl", "jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjljljjjjjjjlljjjjljljjjjjljjljjljljlljljlljlllllljajljljlllllllllllllllcllllllllclccilcicclc`clalcclclclcclcccicclclccccciiccicciccciciiiiiiciib`iiiiiiiiiii`iiii``i`i`iiiiiiii`iiiiiiiiiiiiiiiiiibaiiici`iiiiibiiiii`iiiic`kaiiiiiiiiiiiiiciiiciiiciiciciccicciiiiciiiciccicicccccccciclcccccciiccccaciclclcccciilcccclcclcclcllclilacclcccclccclclcccccclccclclccllcclllllkblllc", "jjjjjjjjjjjjjjjjjjjjjjjjjjjjjljjljjjljjjjjljljjjjjjjljljjljjljljlllljljljljjjjjljllljcjllllllllllllllllllllccclclabclccccciccccllclclcclcclclccccccccciiaiiicciciiicccccciiiiiiiiiciiiiiicii`i`i``i`iiiii`iiiiiiiiiiiiiiiiiiiiiibiciiiicciiii`iiiiiiiiiie`i``ic`iiiiiiiiiciiciciiciciciciciiiciic`cccclcccccccccciccccccciccciicilcillcccccclciccccclclccclibaili`lillccccciicliccccccclcccllallclliiiclcliilcll", "jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjljjljjjjjjjjljjljjjljjjjjljjljljlllllljllljlclllllljlllllllllllllllllllllllllcccclccliiccccciccccclclcclccccccclcciccccciacciciiiccci`iiiiciiiiiiiiiiiiiii`i`c``````i``iiiiciiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii`kciiiiiiiiii`c`iciciiiiiiciiiiiiciccicicicciciiiiii`ifcccciccicccccccccccccccclccccccclcclccclccclclclcllilclcclcllclcliilclclclccicccccccccllllcecclclliaacllcllclc", "jjjjjjjjjjljjjjjjjjjjjjjjjjjjjjjjljljjjljjjjlljjljjjljljjlijjllllllllllllljljajlljlalllllllllllllllllllllccccclllccclclccccccccccclcccccc`clcccccccccccicacicciciciciiiiiiib`iiciiiii`c`iiii``iii``ii``ciiiiiiciiiiciiiii`biii`iiiiciiiiciiicib`iiiiiiiiiiiiiiiiicii```cccciciciciiiiiiiciiiciiccccccccccciicciccccccccccccciccccclccclcccllccclclc`ccclcclcccccclcccllclccclclllcllcliccllclmccclcccl`lclclclll", "jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjljjjljjjlljjjllljlljjjljljjjljljlcllllljcljjcljlllijllllllllllllllilcllcccccllicllllclcllcclliccccclccclcccccccccccccccc`iciicicciiiaiciciicl`ici`iiiiiiii`ii`i`ii``iiiiiiiiiiiiiii`iiiiiaciiciiiiiiiciiiciiiiiiicici`ciiciiiiciicciiiciiciciiiciiiiiii`cbi`liicicccccccccclccccccccclclccccccclcilccllccccllcclcccclcclclclllllcllllcllllllclcllccccclllcllilllclllclilillccll", "jjjjjjjljljjjjjjjjjjjjjjjjjjljjjjljljjjjjjjjlljjljlllljllljllljlcljjljljcjlllljcljllllcllllllllllim`lljccllcclcbacllcllclccliclcccclccccccccccccccicciciciiciiciiiiiibiiiib``iiii`i`iiaii`ii`iiiiiciiiiiiiiiiicciiiiiii`iiiiiciiiiciciici`cciiciciiiiib`c`aaicciicicciccccciiiiiiiicciiicciilccccclcccccccccccclccccccclccliccccclclclcillccccllcclclccilcccclclcclcccclclclclllcllllcclllllllclllcllcllclcll`cc", "jjjjjjjjjjjjjjjjjjjjijljjjjjjjljjljjljjjljjjjjjcjljljlcjjlcljlljkclllllllcllllljllllllljllllllllllliiccccclllllcccllcclcclclclcicccccclcclcccccccicccciicciciiciiiicc`ciii`ciiiiiiiiii``ii`iiiiiiiicii`i`i`iii`iicic`ii``iiiiiiiiiiciciciiiicc`ciicici`cc`iiiciciicicciicicci`iiiiiciciicicccibiccccccclcccccclclcclclcclccicclclcicclikclcllclllcllcllclccccllclclcliclci`cllclllillliccclcllclclbilllclllclcal", "jjjjjjcbljjcajjjjjjjljjjljljjjjjljjjjjjljljjljjjlljcjllljlilllllaljlljjl`mllljcillllclllllllllllcllclllciiilccclllclclclcclckaclccccccccclccccccccciiciciiciiciiciiiiii`ic`ii`ii`ii`````i`iiiiiiiiciiciiiiiiiiiiic`ibiiciiiiiiiiicicicicccicicicciciccccicccciiicccciccciccciiiiiiiiciccii`cicbicciccciiciclcccccccclcclcccccllcclllliclclcccccclcclcllclcccclcllclclccllc`lllcllcll`llllllcllllllilllllllclcclc", "jjjjjjjljjjlijjjjjjjjljjjjjjjjljjjjjlljjjjljjljljljajljljlljlljcljjlllllljlljijjlllllllllllllllcjcllllaclclllllcccclccclllccclcccccccccccccccccii``a`cccciciciiiiic`i`baba`iiii`ii```ii`ii`iiiiiiiiicciiccciciiiic`ia`iccii`c`iiciciccccccccbcccccic`iciciiiiccciccicicccccccccciiiiciccccccciccccccccccciicii`a``icccccccilclclciaa`iiccciclllcllclcllcllcccllllclllcllllclclcllllamiccaclllllccllllccllclcllcl", "ljjjjjjjjljjjjjjjjljljnjjljljljjljllcjljjjljjjlbjllblljljjjljlcljclljlljlljclikllljlllllllllllllcljclccccccccllclllllcccccclcclcccciccciccciabbkakbnaccici`iciiiiiiic`bbnnnnkbaa``iiii`ciiiiicici``ic``ciiiaiiiiiiiciiciciiiiiiicccciciciiccbcciiccccccciccciicicicicccccccccicccicccccccliccicliiccccici```iabkbaccccccccclccclciammnbbbaaicclcclclclclllllllllllclllllclllllllllccijlakillcllllllclllllllcjcll", "jjljjjjjjljjjjjljjjjjjjljjjjjjljjjjjljjjljjljljjljjijjljljl`liklljljllllllillljlllllllllllllllllllclllccccllccclcccccllcclcclccccccccciii`abnnbknmnmblciiibiiciicik`i`nbkmnmmnmnnk``i`niiiiciiiiciicccicccibciciiiciciccciciiciccicicccccccciccccccicc`ccccicibfcccccccicccccccccccccccclc`cclcclcci`abbbbaii`nnk`ccccccclllc`cciiknnnnbbakbkkicllclllclclllllclclllcllllclllllllllllclccllcllllllllkalllcljclll", "jljjljjjjjljjjliljjljjjjjcljjjjjjljljljljlljjjljljljlljlljlijblljljlljljllcjllllllliklllllllllcllllclccccccclclcccclccclccclcccclccciiaa`babnmnnmnnmkjiiccacciiiiiiiiakkknmmmmmnmnkkbbaiibciiccciciiccccccccccciciicicciccccccciicccccccccccciiiilicicccccccciiiilcccccci`ailciclcccclcccckbcllclciabbkkb`icianmnkcccclllclccccii`ammmnbabknkkaa`iillclllcjcclllllcllli`lllllllllclclllclllllllllllllljcllclllll", "jjjljjljlljljjjljjjjjjljcejjlljlljjjjjjjjjjjjlljjljljljljljllkijlllllllcjkllllcllllcallllllllllllclcclilcclclclcllcccllccccccccccc`bk```baabnmnmmmfmklciiciiiiiciiciiakbbknnmnmnnnkbbbbaknicciiiicccciiiccicciccccciicciiccicccccccccccccccccccccicililccccccciiccicccccciiclcclcccclilclliclccli`abbbnkkacciaknmkllllllclllcccii`amnnnnbbakbk`i`aaa`ccicclllcclcljclllclllllllllllllclllccllcllcjcj`alllllllcll", "jjjjljljljjjjjjjjljljjjjljjjjljjjjlllljlljjlljjlljljljlllllljilljllljlciacjlljb`llllclllcllllcclclllccciccclclcccclcccccclccllc`aabnkii`bbabbnnnnnmnbljiiiciiiiii`i`i`kkkbknmmmnmnnbbknkak`iccccicicccccccccccccicccccibccccccclcciccccccccccccciciicni`ccccccccccccccclcclccclcclacclcclclliiciabbbbbbnb`cc`bkknnlllllclcllccc`iiamnknnnkaaknaiiabbabbkkcccclccjcclllllllllllllllillllllcllcccllllccelllccclicl", "jljjjjjljjjljljljjjjjjljjjjjljbjljjjjjjljjljjlljjljljlljljjljljlllllljlllclllcjllllllllllllcllllll`ccilicccclclc`illcccccccci`bnbaakk``abbb``knbnmmkbllciii`i`i`i`i``akbbbbkmmnnnnbbkkkabnmnb`icccccccciccccccccccccccc`ccccccccciicccccccccccciccccciilcccccccclcclclclcclcclccclicllcllcc`aiiabbbkkbakacl`bnnknklccllllcclciiii`bmnknmmbaabka``akaaaakkicllclccibclllllllllllllc`lllllllcllcllllllcjlccclcc`ll", "jjjjljljjjjjjjjjljjljjjljlljjjljljljljljljlljljlljllljlljlcjllllllllllllljcjllmclllljcllllccllllcclcccccclcccccccccclccccciibnmmaaabbbbbbbb``bmbbnmnbljc`ii`ib`iikb``bnkbabbknmmmkbnnkbbbkmmkkaccccccccccccccccccccccclccccclccclcicccclclccclciic`lccciccccccccclclilccclcclcllcllllc`cc`abaliabkkkkkabiciabnmnfnlllllcllllii`i`i`nkbbmmnbbabaakbbba`iknbbbciclcl`llljcllllllllllllllllllllcllllclljclcclllclll", "jljjjjjjljjljljjjjjjlljjljjljjjljjjljljliljljljljlljlljllllllljljljllllllllcllallllclllllcbkbaclcciillclcccccccclcccccccciaaaknknbai`bbbbbbb`bmnkmnnalliii`i`aiii`ii``bbbbbbnmmnmmbkkkbbbbnmnnnbaiccccccccccccccccclcccillcccclclccllcclcclclccccclciliccclclclcclclcllclcclclcllcilclbaabb`icaakbbknkbaii`abknmnbclllccllllii`iiiibabbbkkkaa`abbbbkbaaknnkmnalclllclclllllllllllljllllllllccllclljlclclllclclll", "jjjljjjjjjljjljljlljjjljlicjljlllljljli`cccjl`cjljlljlllljllllllllllllllljcjlllllllllllllliclclclcmbclicccccccclccccccci`bkbbbbbbaaaabbkbbbbabnmfnbacljici`iiii`ici`iiiaabbbkmmnmnbbbababbnnmknnkbiclc`acccccccclccccclccclccclcllclccccccclccccccicllciccccccccllcclilccllclclclcjccababbicc`bbbbbkknbac`ababbaicllllllllllcii`i`iiiababbbaaaabbbkabbabnnnmmfna`acclclllllllllllllllllllllllllclcalllllclclllll", "jjjjjjljjljjjjjl`ailjljjjljjljjljlc`aabkbaba`aiclljllljljcb`ljlllllllllllclllclillllclllllcllclcililclkclcccccccccccccannbabbbbaaaabbbbkkkkbbkmnbiljlllciiiiic`i`i`iiillcakbbknfnkbbnbkbabbkmnnnknnbilccccclccccccccclcaacllcllccclclllcllclccccclclccccccccclllcclclbclclllcllllccl`aaabaicabkkbbkkknka``bkbbilljlllllllllcciiaaijlljcabaaaaaabbbkkkbbknmnnmnnmbillccjlllllllllljlllcllllllllllllllllclllccllll", "jljljljjljjlljljcjljjljljjlljljc`bbknnkkkkkkkbbbbbcjllljllllllllllllljlllllllllcclllclllllclllcacclcccclcliliclcclcc`mfnnmkbkkbaai`a`aakmkkbikmmlllljllciiii`iiii`iin`iljcbbdbnmnbbbmknnkaaakmkmmnbbbilclclclclcclclk`abilcaclclcllclcclicccccclillcccclilccclclllclllclllcclllcllibbbaaailiakkkkbbnkkk`bbbaballllcllllllcllci`a`lljlllcba`c`a`aakmbkbabmmnnmnnmbacllccllllljllllllllbjlljljllllllclllllllclllll", "jljjjljljjljjljjljljljjjjljjlc`akkkkbkmmnnmnkbkkbkb`cjjllllllllllllllcllllllclacjcllllflclllclc`cclliiicclccclciaciabkkmnmmkkka`cc`a`akbnkkb`knkjllljlll``iiii`aiiiiicccllakkkkkkbbbnnmnmkaabnmnkbbkkbiccccliacllillilccccllli`llllcllllcccclllcailllllcllclcclcclccllllclllllllliabka`i`clibbkknbbkknkbkkbbbillllllllllllllc```llllljjlb`cci``abbknkbianmnnmmnnnallilllljllllcjllljllllllcllllllllllcllllllijjl", "ljljjjjjljjljjljljjjjjlljljjibbkmnnkknnfffmnnknnnkbaa`clllllllllllllllllclilllllcccllclclcllccccccclcccccccclcic`cannbbmnnmnbaiiii``akkdknkaabmblljllllciiiabknmniiiiiijljannkkkbbbkkmmnmk``bbkkbbkkkkkaclcclclclclcllclbilcclllillllccllccclclcclcliccll`llilcclllllllclllllllliabba````ccabbbkknbbkkbknkbbbiljcljcljcbnkbabballlljlllc`iii`a`bkbbknbabnnnnmnnnnalcicilllllljllllllljclljljllljljjclllllllla`ll", "llljljljjljjljljjlj`ljljljlikbbmnfnnmmnfffmnmnmmmkkbkbiiljlllllllllllllciaiclcllllllclcllclccccclcccclcclaclcilc``bknnbkmnnnka`bba`adbkbbkbaabmkcljllllciicbnmnnkiiiiicljcanmnmnkkbbkmnnn`ibbabbbknkabknbclclllclllcllclcllllllcllcclllllilllilllllliclllllcjliccllclllclclllccci`aa`i`aii`bnkbkkkbabaakbnnkkacllllllc`knmkbbbbljjjjjlj``abba``bkkabkaaaknmnmnnnbacli`acllljllllljlllllllllljlbblljllljcllclabll", "jljljljljjljljjljjl`jjljjcabkkbefmmfnfefefffmffmfmfnkkbaillllljlllllcllll`llllllajiclllclcccccclcclcccccc`lciccakbbbknkbnnnmnnnnbaabbbbkbb`iadmmaclllllcclcaknkmmkiiiiicc`knkmmmbkbnnnnnbi`bkbbkbkbbbaakkaiclcclclllcclllcclllllllllllcll`ill`cllcllcllcikllillc`cccclclllllcciii`aa``iii`akkkkbaaaaiakkbknknkaallllcabkknnkabkallllllibkmka`aaabkbbai`akmmnmnnmballcibbillcljllllljlljljlllljcjlllljlllcjlllljl", "jlljljjjjljljjljlljljlajl`bkkkkmffffffeffefffmmfffmmnmkbbillllllllllllllcjcllclllilllilclcccccccllclcccccccclcakmnbbbbbkbkmnnmmbabnkbbbkk`cc`bmmmb`ciia`iii`aabnnmaa`c`abkknmnmmbbknmmnkbiababbbaba`ba`aakk`clclllllciccllllcllclllllllllclllllllllclllclllllllliclclcclcclli`aaaaaa`iclc`bbnnkbaiiiibnbnbbknkbb`ccci`knnknnkbbbb`cjjikfmnbabnnbakkk`li`knmnmnnnb`icccaabclilljll`llllllllljllcljlljlljlllllljal", "ljljjllljljjljljjjljlabliakknmknmfffefmffefefffffffffnmkkailllllllllllialclcllilcllc`jicccccicccccccclcccciccbnnknnkbbkbbknnnmnbbkmmnkbbbiccabnnmmnknkb`ccii`abmnbbbmknnmmnmmmnmkbkkfmnkaa`aabaaa``ia`akbbkkacllccllliillllllllljiaaillclllclllcclllllllllllllclclllllcllcciaaabkbb`iicciabbkkba`iiiaknbmkbbkkbabknbabnknkknmkkbkabbkmnknnabnmmkbbbbiliabnmmnnnnbbaicii`akallllljilljjllllicljjlljljcljljllllcbl", "jljllllcjjljljljlljlljllbbnnmmffffeffeefeefefeeffmmefmmknkbclllllllclllclllclclccccccicccicccclcccccccccclccbnmnnnnmmnbbbbbmnnkknmnnfnbb`i`aabnmmmmnnnbaiii`abbkkbkkknkmmfkmnmmmnkkknnmnaaabkkbaaiii`bknbkbkbcllclclclblllclllllllllllllclllllllcjllclcllllllllllllllllllliabbaaaaa````a`abbkba`a```abbknnkbbbkknkkk`bnmnmnnknnmkbkbabnmnnbnmknfnka`iiaabnmmmnnnnbaci``aabkaljllljlljcljllljllllljlliljlljlljjll", "llljljjjljljjljljljjljc`bkbmnfffefeeeefeefeefffeefffmmnnmnkaclllclllclllllclccccccclccccccciccccccliccclbccanmnmmmnknmnbkbbkmnnnnfmmnmnbi`abbaknmnmnnkb``iai`aa`aabknmmnmnnnmnmmmbkbkfnnkbakmnabaabaabnakbbkbbilllllllllllllllllllllllllllllllllllcjallllllllllllllllllllinkbabbba`iaaaa`akbb``````abbbbkfmbabnmmnbakknmmnmnmnnnmkbbbbknnnnnnnmnnmbiiabbakknmmnnkb`````iaa`ailjlljljlljlljlljljlllljljljiclllljl", "jljljljljljljljljjllljlbknkfnffffefeeeeefeeeeefeeeefffmmnkkbillllllllllclijcclclclccclclccccccccicinacciiibnmmnnnmnnnmnkbkbamnkmnmmnmmnabdaabbbbmmnnnba``iaii``ii`bnknmnnmnmmmmnnkkbbknmmkbknnbkkbbbabnbbkkbbnaclllllllllllllllllllllllclllllllllllcllllccclllllliclllllikfkbaaaaa``aba```baa`a`aaaabbbbkmnnknmnnkbbknnnnmmmnnnnnnnkbbbknnnnmmmnnnabaaakabbnnmnnba`````c``i`iicjlllljllllljllllijjcjlllllcjjjllj", "lljljjljljljljljlcjjllkbknmfnffffeeefeeeeeeeeeefeeefffffmnkkbclllllcl`llllccccklllclclcclcccclcccccilccccbmmnmmnmnmnnnmmkkbbnnnbknmmnmkkmkaabbbaknnkkbaa```c``iiiabkbmmmmnmnnnnmmmkkkkknmnbnmkbkkkaa`bbbbbkkbnkacllljcllllllllllllllllllllllllllllllallllllllllll`cjlljlabkbab`aaa`iaba``abaaaa`aabkkkkkknnnmmnkbabnnnnnnmnnnmnknmnmkbbbnkkbnnnnnkbnnabbbbbbnnnkkaaiii`iaiciaailjjlll`bialjlljjclljljajjljjlljll", "jlljjljljjljlljlcjllljanbmmfnffefeefefeeeeeeeeeeeeeeeeffmfnnk`clcllllaclllcclllclcllccciclcccccccccclicc`mmnnnmmnmnnnknmfbbbbdba`abbdbabkaaaabkbbnnnkbaa``ic`iiiaaabbmnbkkbbdbbkbbabkknmnmkmnnabkkbabbkbkbnkkkbb`llcjllllllllllljllllllllllllllllljlllclllljlllljlllcjl`kbbbbbaaaa```a```abaab`ii``aabbabbbbbkkai`bmnnmmmbbkbkmnnnnmka`aaa``aabbbbaknbabbkbbknmkb``a`ii``iiiaaacllijlcklllbljlljljlljijlljla`ljj", "ljjllljljljljlljljjljibbknffmfeffeeeeeeeeeeeeeeeeeefeffemfmnkbclllcllclcicbcclillccccclcccccccccclcciclinmnnmnmnnnmmnnnnnnkaai``lllllcllllcllc`abknmnac`i`clclliaaaabnalllclclcclcllcc`kmmnnnkbbbkbkknkknkkkbbaa`iccclljlllljllllljllllljllllllllacljljlllllllllljllcliabnnbaaabbaa``````aababllllllcllllcllcciii`bnnnnnncllllnnnnnnnilcllllllcllllciadkbkkbbnnnb`i``iciilc`aaaaclealljllcecllljjjljljjljljjjjll", "jjljljjjlljljljlljllclbbmnmffeefeeeeeeeeeeeeeeeeeeeeefefffmkkb`lclcllllclicciclccclccllccccccccccicccciknmnnmnnmmnnnmnnnkmnbiia`lllllllllllllllliaknnb`i`aclllli``i`abilllllllljllllllliknnnnkbbbbbbknnnkknkbkaiiaillljlllllllljlljlllllllljllllcjjlllcllllllljlllljlcabbbba`babbba```iaaaakkbllllllllllllllclicadkmnmnknlllllmmmnnnmijlllllllllllllccibbkkkkbknna`i```icli``i`aaclljjljljlljjlllljljlljjllllllj", "ljljljllljljljlljifccibbmmfffeffeefeeeeeeeeeeeeeeeefefeffffnknaccclccclcccicclcllllclcccccccccccccccccanmnnnknnmnnmnmmmnnnnbi`nilllcllllllllllllliabbkb`aacllll```iiabillllllcllllllllllibnmnnbabbbknnnnnnknbkaiib`ijljcljlljljllllcljcljlllljll`cjlcjjlljllljlllllllibbka``bbbkbba`i``abbbknbcclclllllllclllllladnnnmnnncllllnnnnnnnallllllllllllllllc`bkknbbakbbaaaaaiiii```ciaalllllljljljljjjl`jljllljjjjjjl", "ljljljl`llljlljljlcclaakmnfffffeeeeeeeeeeeeeeeeeeeeefefefffmnnacccccllccilcclclccci`cclccccccccccccccinknnmkkmmknnnnnmmmmnbaaakicclc``ai````illlllibbaabaalcllc`aai`abilllciada```aicllllannnmkbbbknnkkkkkbnbk````aklllllljlllllljlillijllljlllljlllllcjlljllllljljllbknbaa`kkbbkbai``abbbbbnbilclcccici`icccccllaknnnkkn`lclcknnfnmndlllc`````aaaaccclldbnnbbbabbaaaa`a`ai`aaiibb`jlljljllljljlll`ljljjjjjlljlj", "jjljjljcjljlljlllllllcbnnmneemefeeeeeeeeeeeeeeeeeeeeefeeffmmnbbiccciccccccclcclcccccccccliclicccccicibknnnnnnnnnmnnnnnnmmkabbbbiliclnmmkkkbbkalcclcbbbbaaallllc`ab``abcllllaknffnnnkalllllnkmnbkbbkkknnkkkkkbb```i`alljllllljlljlllilljlljllljlljlllljllljlljljlllljakbkkkaabnmbababbbbkbbbbkacllccciiii``aablllccnkknnnkillcldnnnmnmblllc`kkkknmmnblcillbnnkbbbbabba```aaaaaaa`aabcjlljljljlljljjljjjljlljjjljj", "lljlljljlljljlljlllllibnkmnmffefefeeeeeeeeeeeeeeeeeeefffeffmmkkaccccclcillcllclclccccccci`icicccciciakkbknkknnnnnknnnnmnnbadbkkilclcnnmkkbbkkbllllcabbkabblcllcaabaabkilcclakknnnkbkbcilllkbbbbbbbbkbkkbkkbbbaa`iaaaallljjllljljljlclljlllljlllllljljljlbcjllljljjj`nnkbknbbabkbaabkbkkbbbbbbalcllcciabb``bnnilclckkknkkniccccannnnnnalllc`bbbbnnmmnillcldbdnkdabbbbaaaabaabab`aabb`ljlljljljljljljljljjljjljljl", "jjljllljljllllccjcljlcbmknnnfefeefeeeeeeeeeeeeeeeeeeeefffemmnkk`cclccli`clbcblilccccccccciccccciial`kkkkknkknnnnnkknnmnnbdaabbkclllcknmnkbkmn`cclliaabbbbbcllclabkdaabilllcbkkkmnkakaliilibbbakbbkbkkbbkkbkkba``ibbaailllljlllllllllljlljljlljljlllillllljlljlljllcaknnbbkkbaaa``abkkkkbbabaa`cllcci`abkkabkkclllcbkknkknilllcannnnnk`clcc`bkbabmnnkllccldkkbkb`abbbbbkbbbbbbbbaabknajljlljljljljljljjljljllljll", "ljlljjjljljljlccjlllccamnnnnfemeefeeeeeeeeeeeeeeeeeeeeffmffmfnbacclclllillil`cclcclccccclccccciia`canbkknnnnmnnnmnnknnmkkiidnbbclccl`aa``i``illclc`abbbkkbcllllbbkb``b`llcl````a`a`illicl`bbbbkkabbbbbabbbbkb``i``aaaalljlljjljjljljllljljlljllljlcalljlljllljlibjcbkmkmkbab``iiabbbkbbkbabbaailllcci``iii`icllcl`kkknnnm`cllcannnnnb`lllli```i`ab`ccllccnfnnkdbabbbbkkbakbabkbaiabnkijjljljljljljljjljljlllljlj", "lljlljcjlljlljclclljclamnnknnenefeeeeeeeeeeeeeeeeeeeeefemffmmnb`clcllcllcclccclicccccccccccccciiicinnkknknmnnnnnmnmnnnnkbcc`mnklccllllcllllclccll`kkkkbbkkclclcbbkbaabillclcclllclllllllidbbkbnkbkbbkkbkbbkbaii`aiabbklljlllljlljlllljljlljljljlljlcjljllljjjljljlbbannnmba`ii`akbbbbbbbbbkaad`lllclllllllcljlllidmkbnnmn`cllcannnnnb`llccclllllllccllcldkmmnnmkkbbbbkbbbbbbbbbb`babkaljljljljjljljjljllljljljjl", "jjljlljljllljllljjcc`l`bnmnnkeffefeeeeeeeeeeeeeeeefeeeeemffnnnb`llclccccclccclciclccccccccicccciccknknkkknnkkkbknnnmnmnka``dnkkllclccllllllcllll`kmnkkbkkkclcllbkabbabclllllllllljlllllibkkabbnkknkbbbbabbkbai`aa`abkkbjljljljljljljljljljljljljljjlljljjlljlicjliakkkmnnkkacc`kkkkbbaababnkabalccclllllcllllllcdnnkkmnkkallll`nnnnnballiclllllllllllll`akkkmmnnkkbkkbbbabbabbbabbbbmnclljljljljljjljljljljljjjj", "alljaklllljlllllllllllibknmnneefefeeeeeeeeeeeeeeeeefeeeffmfnmkbicccllclllclcliibcccccccciciiiiiic`nmnnnknnnbbbbkkknknmnkbbkkkbdccclcccllcijcjlcbnmnmnbbkbklllllbkbabbbilcclclllllcllc``kknnbbbkknmnbkkbabbbaa`aaabbabkncljlljjljllljljljljljlljljljljlllljljljjllkbbaannkknac`bkkkkkbbbbbknkbb`lclllllllllcllcibnmnkkmkkb`ccccannnmkbkllllclllllcllllidkbbknnnnnnkkbkkkbbbbbbbbaabbkmmaljjljjljjljljljljjjjjljjl", "ljjl`ajljlllljlljllllliinbmnmmefefeeeeeeeeeeeeeeeeeeeeffmnmnnkblclccclccclilillccccccciciciiiicccamnmnknmnkbknnnkbbkkmmknmnmkballclc`aacl`ccibknnmnnmnkbbkclcclkbbbbab`lllc```aaab`iakkkbnmnkbbkkknbbkkbkbaii`babbbbakb`jlaaljllljljljjljljljljljljljljjjlljjljj`nkbbabkknk`cbkkbbkkbbabnkbbbb`lcllcaailllll`bbmmmknnnkkballlcibkkmnnmllclci`iiaaabbkknkbkbnnnnnnnnbbbbbbbbbkabbabkmnmmcljljljjljjljlljljljljjjj", "lllljljlllbllljllllllllcaknknmffeffeeeeeeeeeeeefeefeefemmfnnnkacclccclclcccccccccccccccccciii`ciabnmmmnnnnbknnmnmmnkkkknnnmkdballcclbmn`llcll`nknmnknkmnbdlcllcbkbbbbk`lcllkkkknnmnkbbknbnknkbkbnkbbbkbakkaiabaabbbbbbabjljcljljlljjljljljljjlljljljljljljjljjclannbbaanbkacikmnkkbbkkbbnnnkbaacclcibbbilcclcaknmnmknmkbbklllccmkkbnkmclclcai``abbnnknnnkbkkknnnnnknkkbbbbbabkbbkbknmmkaljjlljjjlllljjjjjljjajlj", "jljljccjllljllllljllilll`bbnmmfffefefeeeeeeeeeeeefffefenmfmnkbiclccclcccccccccccccccccccciiiiiii`bbknnnnknbbmnmnnnnnnkkkmnkaad`lcllcbkmk`cllll`knmnmnknnnkllllinbbkmnn`clllbnkknknnnkkkkbknnnkbbkkkbkb`iaba`abbbbbknnbbbllilljllljljljljjljjljljljljljjljjlljia`bnkbb`akab`aaknnnnbkbbaabnnbbbdllliibbbailllclabnnnmkbkkbkclcccmnnkkkniclcl`i`akbbknknknnbbkknnmnkknnkbbbabbkbbnknnnnmnnljljjjljljljljljjjjljjlj", "klljljjclljlljllllll`cllcakbmmmfefmffeeeeeeeeeeeeefeeffmmfnnbailclccccclccccccccccccccccciiici`iabbbbkkbkkbnmnnknmnnnnnkkkbdab`lcccibknkn`clillakmnnmnkkmkllccinmnknmncjcccknnkkknmmnnbbkbnknnbbbkbabaciaaaabaabaknmnnbbilijljljlljjljjljljjljljjljjljljljjjljjaknkbbaaba``bknnnmnkkbbabbknkbbblllccbbbbailllcc`bkbkkbkbkklclccnnmnnknillcc`c`abbbknnnnnmkbkkknnnnnnnnnkmkbkmnknnmnknnmm`lljjjljjljljjjjljjcjljj", "ljlllllljlcljcllllllillll`bbkkmmfffffefffeeeeefeeefefffmmmnkb`ccacclcliccclccccccccicciciiciciaibbbkbkbbakbmmbnnnknnnnnnkkkbbaiclllcbnmknncllllldmfknmnknkllllikbknnnniilllknnkkknnnmmnbkbnknnkkabbbaccaaaaabbabknnnnnnkallljjljjljljjljjljjlljljjjjljjljjjljlcbknkkkbbda`aknnnnnmnkbbbbbbbkbbalcclcknkkbaicllil`bkbbbkdmnlllclnknnnnk`llclii`bbabknkkknnbbbkknnnmnnknnnnnnkbkkknnknnmkkbjjjljjjljljljljjjanjjjj", "llmjjljllllllilljlllllllllikbbnmmmfffffefeeeeffeefffmffmmnkbaicclcccccclccccccccccccccciiiiicc``bbkkknkbakbnnknknnkkknnnmnbbbaclcccibnmnmnncllclldmnnmnnnnllclckkkbkmmilllcknnnnbkknmfnnbkknkknnkabaic`bbbabbbbknmnknnnnkljjljljljjjljjljjljjijljljljljjjlljjj`ikkkbnkbaaadnnnkknmmkbbbbbbbkbballlclbbbbbabclllcidnkbbbbnmlccilnkkkknn`llccciabaabnmnnkmnnbbbbnknmmnkkkknmnkbbkbbnnnmnnnflljjljajljljjjjjljjjjjj", "illllllllljllclllllllclllll`bbkmnmmfefeffeffefefmeffmffmknkaiclcclclcccccccccccccccicciciicici`aabbbkknkbabknnnkkkknkkkkkknkb`clcllibknnnmkkcllllcdkmfmnnkllllcbbbbabbclcllknnnnkkknnmnbbkkmnknnnkb`c`bbkbbbbbbbknnnnmnknlljljjljjljjljjljjljcjjjjjjjjljljjjllibkkkknnbaabknmnkkkkknkbkkkbbkknklcclcbkbbakdbilllliakkbabkncllllnnnkknkalllliiaaabbbnnnknmnkbbbkbknmmnkkknkbbkbbaabbknnkkniljjjjljjjljljjjjjljjlj", "lcljlljlllllljlllllllclllillabbnknmmfmfffffffffffmefmnnnkkaicclcilccbcccccccccicciccciciiciiii`babbbbbbkkakkkmnnknkkkkkkknmnda`clllibbbbbakbacllcl`knmnnnklllc`nmb``bbcllclknnnnnnkknnkbbbknnkknnmna`bbbkbbbbbabkknnnnnnncjjjjjjjljjjjjljjljjjljjljljljljjljjj`anknnmnbbabknmmnnkabnnknmkkbaknkcllllbbkbbakaaillclibkbbbbkiclcckkkknkkaclll`bbkkbaabbkabkbbbabbkkbnmmnnkknmmkkkb`abbkkkbkbjjlljjjljljjjjjjjjjljj", "cbjcjllljlllllllllllcllllllclcbbkkmnmnffffffemmmfnmnmknkkbiccccclccliclcccccccciccciccciiiiciciabaabaaabkbnkknnnkkkkknnnknkdakndbkbabbbbbnbkbbaaa`bkbkmfnmbkkbbnna`ammakaaamnnnkkkkkknnkkakknkkkkmnaabakkbbabbbkknnnnnnmkajjljljjjjljljjjjjjljiljjjjjjjjjljjcccknknknnbbdknnnmmnbbbknmmnnnkkbbbabababbbbbkkkbaaa`aiabakdnkdbdbbkbkkkkkkab``bnnnnbkbbbbbbkbkkbbabbbbnnmknnmknmmm``bnmkbkbknjjjjljjjljljljjljjj`jj", "lljljlllllllllllllcllllllllllc`abbkknkmfmmfmfknfmmnnnkkba`cclliliccccncccccciicciccciciciiiiii`bbkbaaabbkbnnbkmkkkkkkbkbkkd`bknknnmnkabbnbkkbknbbbbbbbknmnnnnmnbkiannmnnnknnmnnkkkkkkkknnkkknnkknnnbbabbbkbbbbnkbknnmmmmnbcjjjjjjjljjjjlj`jjjlljjjjllljljljlliiknnnnnnkkbkknknfnkknknnnmmnmnmkkbbknkbaabbnknkbbbbaa`bbkbnkbkmnkkkkbbkbkkaabmkknnnnbbakkbkkkkkbakbbbdbmmnmkmnkbbcdnnmnknbkma`ijjjjjjljjjjljjjjljj", "ljcbaljllllllllllclllllllclcllcci`bbnbkbnknnmkknkkmkkba`ilccilcclcicl`cccciclcliccicicic`icici`nkkkbaabbkbknkbkfnnkkbbkkbbaannknnnnnnbkbkmkknnkkabaaabbbknnnnmfnk`annnmmnnnnnmnnknnknkknnkkknnnkkkkkkbabkkbbbbbkkknmmnmmfkjjljjlljjjlcljjljjjljjljljjjljjlljii`nknnnmmkbbbbnnnmnknknknnnnnmnmnnnkkkkkbaabkmmnbbnbbaabbkbkkkkknkkkkbkkkkdabknknnnnnnbbbkkkbkkkkbaadbbbkknkkmmfkkibnknnnnknmajjjljjljljljjjjjjjjjj", "lljci`cjlllllllllclllllllllccllllc``bbkkkkknknnkbnkba`icccccc`ccccccclcccccccaciciciciciiiiiiiankkmkbbbbbkbbkbbknnnnnkkkbaaknkknnnmmmkbbbnkbknkkbbabbbbbbkmmnmmmb`kmknnnmnknknnnkknnnnknknnkkknnnnkkmnkbbbbbkbbnnkkmmnnnnmjc`ljjjjjjjljjjjlj`jljjjljljjlljlj`c`nnknnnmkbbaabkbbknmnnknknnnnnmnmmnkbnkbbbkbnmnnknnkbbbbbbbkkbknnnnknkbkk`akkkknknnmnnbbknkbkkkkbaaabbabbknmnnmnk`kkknnnnnnbillljjljjjljjjjjjjjljj", "jlljcillllllllllclclllllcllllcccclcliiaabbbbbkbabaaiiiiccccccacccclciciccccciaiccicicicici`iiibnnkfnknbbbkaaknkbnnnmnnnkkbknnnkknnnnmkbbbbkbbkkbaaabbbbbbknmnknkbbknnnnnmnnnnnmmnnknknkkkmnnbkknkkkknnkbbbbkknbkkkknnnkknfjjjjjljjlljjjjljjj`jjljljjlljijjjjccaknnkkknnkb`iaabknnmnnnnknnnnnnnnnmnbkkkabkbknmnkkfnkkkbbbabbbbbknnmnnknkaknknnkknnmnnbbbbkabkbbbadaabbaabnmnknkkaknnnnnnnnfkljcjljljljjjjjjjjjjjj", "llllcjllllllcllllclllclclclclclcccclclcliiiai``icccccccccccibcccccccccccciciiiiciciciciciiiciinmnkmmnmkkbbbbbabbnnnmknnnkkknknnnnnnnnkkbabbbbkka`aabbbbbabnnnnkknnkmnnmmnmnnmmmnmmnnkkkknnnmkbkknnknnnnnkkkkbmmkkkkkkkkkbnjjjljjjljjjljljlljajljjjjljljjjljjjc`kmnnkknnnba```akmnnnnmnnnnknnnnnnmnkkkkbbkkknnnmknmmmnbbbkbbbbbknnmkknnkknknnknnnnnkkkbabbbbkkbiabbbbbbbdnnkkmbknnknnmnnmkmbjinijljljjjjjjjjjjjjj", "llljllllllllllllccclllcllclclllcllcccccccccclcccccccclcccccc`lccccicciccciccicciciciciiiiii`ickmmnmnmnbbbbbclciicccilcciliiilciccicccccclcclicllllcclcccllciiciciiciiiiicciiiicci`iiclliiiciiccciiiicciiiccccamknkkbkbkkkblljljjljjjjjjjjjjljljjlljjljjjjjjlllinmmnnnknmkaacccciiiciiiiiiiciiiciiiicccclciiicc`cciccillccclclciiciclicliicccliiciccccccclccccllllciccccliiciiiakkknnmmnmnnkciijljjjjjjjjjjjjjjjj", "ljlcljlllllllllllclllcllllccccccccclccllcccccccccccccccccccclccccccccicccicci`iiciiiicicii`a`ikmnmmmnkbabbijjjjjjjjljljjjjjljjjjjljjjjjjjjljljjjjjjjjjljjjljjjjjjljjljjjjjjjjljjjjljjjjjljjjljjjljjjjjjjjjjjjinnnkkbbbbbkbjjjjjjlljjjjjjjjljjljljjljajjjjjjljccknnnnknnmkbacjjjjjljjjjjljjljjljjjjljjjjjjjjljjljjljjjljjjjjjjjjjjljjljjjljjjjjljjjjjjjjjjjjjjjjjjjjjjjjjjjjjjlikkbknnmnnmkncjljjjljjjjjjjjjjjjjj", "llllllcllllllllcclclclclccllclclclcclcccccclilccccccccccilicciccicccccciciciibiciciciiciiia``immmmnnmknnkkillljcccjljclljlllccjijljcllljljlljjljljjljlcjlllllllllcllljlcjljjljllljjlclljllilljllclljlcicjclclcknkkkkkabbbkljjjjljjjjjjjjjjjljjljjjjjjjjjjjjjjcianmnnnknmnbacjllclcjcjcjcjllllllllljllllccjlllllljljllcjjllllljlljljjljljjjjlljjjllllllllcjllljllclljjllljljjllabbbbbknknmkn`jjljjjjjjjjjjjjjjjjj", "lllllljcllcllllccclllclcclclclclcccccccccmkcccilccccccccccccccicccciccccciciiaiiciiiiiiiciii`immmnmnnmmnnkclnmfffffffeeffmmffmmffmfffffmmffffeffemfffffmmmffffffffffffffffmmmffffffmffmmfffffmffffmffmmmmffmmkkmnnkbbnkabkjailjjjjjjjjjjjjjjjjjjjjjjjljjjjjjlcibknmknnnnmkdidkkkmnnnnmmmnkknkkkkkkkknkkkkkknknknnkkkkkkbkbknknnkkknnkkkbkkbbbbbkkbbbbbbbbnkkbbkbkbbkkkabbkbkda`dbbbbbbkbnmnljljljjjj`jljjjjjjjjj", "jlllllcbccnnclclllklclllllcclcclcllccclcciclclciccccccicccccicaiccccciciicciciciiicicicii`ii`innmmnnnmfnmnilmffffeffffffffffffmffmmffffmmfffffffffffmfmmmmffffefffeffeffmffmmmfffmmmffffffffffffffffffmmfffffnbnnkkbbkkkbaljjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjlcibbmmnknnmkka`bnknmmnnnnnnknnnkkkkkbkknnkbkkknknknnkkkkkkbbbkkkkkkkkkkknnkkkkbbbbkbbbbbkbbbkkkbbbkkkkkkbbbbkkbba`bbabbbabaknniljjjjljjjjjjjjjjjjj`", "c`iljllllliclclclkicllicllccccccccccccccaaiciclcccciclilcicccc`cciciccciciiaiiciiiciciiiii`i``nmmnkknmmmmmilmmmfffffmmffffffmmffmfmmfffmfmmfffffemmffffmmfffffffffffffffmffmmnmffmnmmfmmfeffffffffefffmmfffffkbknnmkbbknkbljjjjjjjjjjllcjjjjjjjjjjjjjjiljjjjliibknmkknnnmnnabkkkmnmnkkknknnkkkkknkkkkknkkkbkknknnkkkkkkbbkkbkkkbkbkkkkkkbkkbbbbkbbbbbkbkkkkkkbkbkbkbkkbbbkbkba`bbbbbbaabkknbjljjjjj`jjjjjjjjijjj", "lljlcclllllllcccclcllcllccclclcccccclccccccclciccccccciccciccaccccccicicciibiiiciiiiiii`i``i``nmnnnkknmmmnicffffffffmmmmfffmmffmffmmfffffmmmffffffmefefmfffffffnfmmmmmmmmffffffffmmmfffffffffffmefffmmffffffmnbbnnmmkbbbknjjjjjjjjjjjjjjjjjjijjjjjjjjjljjjjjliidbnmnnnknmnnaaknmnnnkkkknknnkkknkkkkbknnknkkbbkknnkkkkkkbbnkknnbbbbkbkkbbbkkkkbkkkbbbbkkkkkbkkbkbkkkbbkbkbkbkkaiabbabkkkbbbbajjjjjjjbljjjjjjjljjj", "llllllllcjccjlcllcclalccclclaccccccccccccccccccccciccicicccicbcicicicicicic`iciiiiiiii`iii`ii`nnnnnnknmmnmccmffffffmfmfmffffmffmfffmfeffmfmmffffffmfffmmmmfffffmmmmmmmmmmffffefffffmmffffmfffffffffmmfffefffmnkbkkmmnkbbbkjjjjjjjjjjjjjjljjjjjjjjjjjjjjjjjjjci`bbkmmnkknnnn`annnnnnnnkkknkkkknkkkkkkknnknbkbkkkkkkkkkkkkbnkkkkkbkbbbbbbbbkbknnkkbkbkbkbkbbbkbbbkkkbbbkkkkkkkbbibababbkkkkba`ljjjjjjjjjjjjjjjljjj", "llllllcllclliccclllclccllccik`lc`ccicccccclccccccccciclccicccciciciciciciiccciiiciiiiiiiii`ii`nmnkkkknnmnnlcmmmmffmfmffffffmmffmmfffefffmffmfffmmmnmmmmfmfffffmmmfmmmfmmmfffffmmffffmmfffmmfffffffmmmfffmefmnnkkbbknnnkbabjjjjjjjjjjjjjjijjjjjjjjjjjjjjjjjjjlc`kkkbknnnkmnnaakkknknknnkknnkkknkkkkknmnnkkkkkkkkkbbkbbkkkbkkkkkbkbkbbbbkbbbkbkkkbkbkbkbbbkkbkbbkkkbbbbkbbkkbbba`abbbaabknkkb`ljjjjjjjjjjjjjjjcjjj", "cllcclllllccccclclclccllcclliccciclcccccciccciccicccicaccciciciiciciciciiciiiiiiiii`i`iiiiiiibnmkkkkkknnnmcifmfmmmmmfmmffffmfffffffeffffmffffefmmfmmffmfmfefmmmmmmfmfmmmnfmmmmnmmffffffefmfffmfffmmmmmmnmfmnmnbkbbbkknnnkbljjcjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjli`bmbbbknmkkkkbannnknkkkkkknnnknnnkkknnnnkkkknknkkkkbkbkkkbkbkkkbbbbkkbkkbbbbbbbbbbbkbkbkkkkbbkkbkbkbbbbbabbkbabb`abbbbaaabkkkbljjjjjjjjjdcjjjjjjjj", "lccllcilclllccclllclcccccccclcclccccc`biccccccc`ccicicfiiccciiliiciciciiciiciiciiii``iii`iiiibnmmnkkknnnkklcmmmmmmmmmmmmefffffefffffmmffffmfffffnfmfffnfmfffmmmmfffmfmmmffmnmmmmmnmmfffffmfffnmfnmnmnnmmmfnmfnbkkkkkkknnnmljjljjjjjjjjjjjjjjjjjjjjjjjjljjjjjlciamkba`knnnnbb`nknkkkkkkkkknmkknmnnnkkkkkknknknknnkkkkkknkkbknbbbkkbkbbbbbbkkbbbbbbbbbbbkkkbakkbbbbbbabbababbbbb`aba`aaaabbbbbjjjjljjjjjjjjjjjjjjj", "lclccc``cllccclclccclccclcccccccccccccccbaiccci`cicicciicciciciciciciciiiiaiiii````ii`iiii`i``nmmnnkknnmnklammffmfmmmmmmmmffffmffffffffeffffemmmmffffffmmffmmmmffmffmmmmfffmmnmmnfmmmffffffffffmmmmnmnmmmfffmmnkkkknkbkmnnjjjjjjjjljjjjjjjjjjjjjjjjjjjjjjjjjcccbnbbabbbnnknn`nnknnkkkkkkkkknnnkknnnnknkkknnkkbkbbkkkkkkkkkkbbbbkkbkbkbbbkkkbbbbbbbbbbbkkkkbkkkbbbbabbabbbkbbkbbbnbi`ii`abkbbjjjjeajjjjjjjjjjjjjj", "ccllllcclclcclcclcllcclccccclcccccccccciciicicccilckciciiciciciciiciiicicii`i`iiii`iiiiii`ii``nnmnnnnnmnnklammfffmfmmmmmmmffmmmmffmfffmfffmffnmmmfmfmfmmnmmmmmmmmmmfmmnmmmmnmmmmmmmnnmmmefffmnmfnnnnmnnmnnffmmkbbkkkbabmnkljljjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjl``abkbkbbbknnmm`knknnknkkkkkkknkkkkkkbkkkkknnnknbkbbkkkbbbbbbbkbbbbkkbkkkbbbbbbbbbbbbbbbbbbbkkkbbbkbbbbabbaabbbkbaakbiiii`aabbkcljjjjjjjjjjljjjjdkj", "clllclclimalccllcclclcccclcccccccccccccccicccciiiciiccicciciciciiciiiiic`iakciiiiiiiiii`ii`iiakmmnnnnnnmnkjanmmfffmfmmmnmmmmmnmmmmmmmmmmfeffmmfmmffmmffmmmmmmmmmmmffmmmmmmmmmmmmmnmmmnnmmfffffmnmnmmmnmnnmffmnnbbbbbbabnmmcjjjj`jjjjjjjjjjjjjjjjjjjjjjjjjcljlii`knkbbbkkbnnn`kknnnnkkkkkbkknkbbkkkkbbkkbknnknkkbkkkkbkkkbbbbkbbbbbbkbkbbbbbbbbbbbbbbbababbkbkbbbbabbbbababbbbb``ka`icc``aabkljjjjjjjjjjjjjjjjjjj", "lclcllcccclcllcclc`kcclcclccclcacicciliccccccccccicciciciciciciciiiciciiii`i`iiiiiii`iiaiii`iakmnmnmnnnnnblbmmfmfffmmmmmmfmmmmmffmmnmnmfmffmmmmmmfmmmffnfmmmmnmnmmmmmmmmmmmmmmnmmmmmmmnmmmmffmmmmmmmmmnnffmfmnnnbbbkkbbbbbcjjjjiljjjljjjjjjjjjjjjjjjjjjjjljjlc`aknnkkbbkbbbk`knnnnnnnkkkkkkkkkkkkkkkkkbbkbnkkkkkbkkkbkkkkbbkbbbbbbbbbbkbbkbkbbbbbbbbbbbbbkbbbkbbababbbbbbbbbkba`bb``lciaabkncjjjjjjjjjjjjjjjjjjj", "llllllccccllcclccccciclccclc`iliccclccicicciiicccicciiciciiciiiiciiiiiii`iicii`c`iiiiii`iii``annmmnnnmnnnbjbmffffmfmmmnnmmmmmmmfmmffmmmnmmfmmfmmmmfnmfmmnmnmmmmffmnmnmmmnmmmmmmmmnnmmnmmfmknffmknnmmmnmmffffnmnnnkbbkbbba`ljjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjli`annnnnkbbbb`aiknnknknkkkkkkkkkbkknkkbkbkkbkkkkbkkbkkbbbbkbbbbbbbkkkkbbbbbbbbbbbbbbbbbbbbabkbbbkbbbbbabbbakbkbbbb`kbailciankkn`jjjjjjjjjjjljjjjjjj", "clllccllllccjcilccllnacllicanaclccn`ccikaicccciicci`cciciciciciiii`iiii`ib`iiiciiiii`iiiii`i`knmmmnmnnmmmblkffffmfmmmmmmmnmmmmmmmmmmmmmnfmfnmffmmmmfmmfmmmfnmmffffmnmmmmmnmnmmnmmmnmmmmfnffffmffmmnmnmmfffffmnnnnnkbbakn``jjjjajji`jjjjjjjjjjjjjljjjjjjjjjjjl`i`nnnnnnbka`ciinnnnnknkkkbkbbkkkkkkkbkkbkbkkkbkbbkkbbkkkkbkkkkbbbnknkbbbbbbbbbbbbbbbbbbbbbkbbbbkbbbbbbbabbbkkkkka`kb`clciannkk`jjjjjjjjjjjjjjjjjjj", "clclcclccclicllclcccacciccciicciicacccli`cccccccicimiiciiiciiiiii`i`i`i`iicii`iii`iiii`ii`ii`knnmnnnmmnmmblkmffmfmmmmnmmnmmmmmmfmnmmnmfffmfmmfmmmmmfmffffffmmffmffmnmmmmmmmmmmmmmmmnmmfmfmmmmmffffmmmnmffmffmmnnmnnkbbknblijjljjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjiiannnknkbbi`ciinnnnnkkkkkkkkkkkkkkkkkkkkbkkkkkkkkkbbkkkkkknkkkbkkkkkkbbbkbbbbbbbbbbbbbbbbbbbkkbbbkbkbbbbbbbbkbbbbibbicci`kknnnajjjjjjjjjjjjjjjjjjj", "llcllclclcjcccclclcclcccbcccccccccicicicccciciiccccicciiciicicii`iii``iiiiiiicii`a`iii`iiiiiinnnnnmnnmnmnbjkmffmmmmmmmmmmmmmmmmmmmffffeffnmmffmmmmmmmnffmffnmffmmmmnnmmmmmmmmmmmmmmnnmmnnmmfmmmmmnmnnmmmmmmmmnmnnmnnkbbba`jijjjjjjjjjjjjjjjjjjjjjjjjjjjjljjjl`iaknmkkb`iiii``nnnkkkkkkkkkkkkkbbkkbbkknnmnkkkkkkkbkbkkbbbkkkkkkknkkkbbbbbkbbbbkbbbbbbbabbbbabkkbabbbbbabakbbbbbb`ab`````nnnkk`jjjjjjjjjjjjjjjjjjj", "lcllccccccclclcccccccccciccccccccccccicciciccciciiciciciiciciiiiaiia`iiiiiiiiiii```i`iii`iiiikkkbmmmnmmnnalnfmmmnmmnmmmmmmmmnmmnmffmffmffffmmfmnmmmmmnmffmfmffffffmmmnnmnnmmmmmmmmmmnnnmmmmmmmnmmmmmmmnnmnnmmmnnmkmnnkabi`jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjii`nnnka`ic`a``innknkkkkkkbkkkkkkkkbkkkknkkkknkkkkbbkkbkbbbkkkkkbknbkkbbbbbbbbbbbbbbbbbbbababbkbbbbbbabbbbbabbabbbcibbai`akkmkkbjjjjjjjjjjjjjjjjjjj", "lccllccclclccclccccccccccccicccc`ciliciccccciccccciciciciciiiii`faiii`iiiiii`ii`ii`ii`iiiiiiikmnkbmmnmmnfalkmmfmmffnmnmmmmmmmmfmffffffnmfmfmffmmmmmmmmmfmfffffffmffmmmmmmmmmmnnmnnnnmmmmnmmmmmmmmmmmmnnmnnnmmmmnnmnnnkba`ajjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj`i`nnbbaa`iaaa`inkkkkknkkkkkkkkkbkkkkkknknnbkkkkknkkkbkbbkbkkbbkkkkbkkknbbbbbbbbkbbbbbbabbbbbbbbbbbbbbbbbbabbababa``bba`aabbbnfkjjjjjjjjjjjjjjjjjjj", "clcllclllclccclcclcccccccccclciccicccccciciiiciiciciciiciiiiii`iicciiiiiiiiiiiiiiiiiii`iiiii`nnmbbkmnmmnk`jnnmmmffmmnmnmmnmmnmfmmmfffffmfmfmffnmmmnmmmmfnfmfmfffffffmnnmmmmnmmnmmmnmnmmmmmmmmmmnmmmmmmmfnnnnnnknnfkkknn``aljjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjji``nnnbbbaaabaaikknkknnkbkbkkkkkkbkknkkknnnkkkkkkkbbbbbbbkkbkkkknkknkkkkbbbbbkbbbbbbbbabbbbbbbbbbbbbbbbbbbbbbbabba`aba`abbbkbakkjjjjjjjjjjjjjjjjjjj", "lclclccccccllccccccccccccciciccclic`cciiiciiiiciiiicicciiiiiiiciii`iiiiiiii`iii`ii`i`iii`ii`akbmnabnnnmnb`jffffmfffmmmnmmnmmmmfmfmmmffffffffffmfnmmnmmmfmffmmfffmmfmmmmmmnnmmmmmmmmnmnmnmmmmmmmnmnnnmfmmfmmmmnknnmnkknkaabjlljjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjlic`bkmkbbbabbaainnnknnnkkkkbkkkkkkknkkkkkkknkknkkkkkkkbbbbbbnnkkkbnnkbbbkbbbbbbbbbbkbbbbbbbbbbbbbbbabbbabbbkbbbbbba`baaabkbnbbkbccjjjjjjjjjjjjjjjjj", "clcccclcall`lcclccccccccccccbiciicicccicccciicciciciciiii`iiiiiiiiccii`iiiiii`ii`iiiiiiiiiciabbkbbbbmmnnn`jffmmfmfmmmmnfmmmfffffffmmmfffmfffffffffmnmnnmfffmmmffffmmmmnnmnmmfmfmnmmmmmmmmnmnnnnnmnnmmmmmmfmmmnnknknkknbbbkljjjjjjjljjjjjjjjjjjjjjjjjjjjjjjjjj`iabknnnkknnkbbinnnnnnnkkkkkkkkknnknnkkkkkkkkkkknnknnkkbkbbbnkkkbbkkkkkkbbbbbbbbkkkbkbbbbbbbbbbbbbabbabbbbbbbbbbbbaabababbbbmnkbljjjjjjjjjjjjjjjjjj", "clclclcl`lcmcccccccccccccciikiiiii``iiicicciiccicicicii`iiiiiiiii```iiiiii`iiiiii`ii`iiiiiii`bbbbkbbmmnmmilmfnmmmmmmmmmmmmffffffffmmffmmffmmfmffmmmmmmmffmfnmmffffmmmmnnmmmffmmmmnmmmmmmmnmnmnmmmfffnnnnmnnmmnnkkknnkkbkbkljjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjji``mnkkknnmmkbbiknnnkkkknnkkkknknnnnnnnkkkkkkknkkkkkkkkbkbkbkbkkbbbkkbkbkbbbbbbkbkkbbbbbbbbbbbbbabbbbbbbbbbbabbabba`b`bkkkkabmmbljjjjjjjjjjjjjjjjjj", "clcccllclcikcc`cccccccciiciib`iiiiabibiiiiiiciiiiiiiiiiiiiiiiiiiiiiciiiiiiii`i`iiiiiiiiiiiic`kbkbbbbnmnnmicmfffmmmfmfmnmfmmfffffmmmmffmffffmmnmmmmmmffmmmmmnmfffnmmmmfffmffffmnmmmmmmmnnmmnmmmmmmffmmnmmnmmnmnnnkkknkkdbbkljjjjjjjjjjljjjjjjjjjjjjjjjjjjjjjjji``mnkbbkknkkbaiknnnkbkknkkkknkknnknkkkkknnnknkkbkbbbkbkkkkkkkkkbbkkkbbbbkkbkbkkkbbbbbbbbbbbbbbabbkbbbkbbbbabababaaiiibknnkkknnnijjjjjjjjjjjjjjjjjj", "cclcclcclccclcnicccccciiiiiiciii`ca`iaiciiiciiiiiiiii`iiiiiiiiiiiiii`ic`i`iiiii`iii`iiiiiiii`bknbkkbbnmnnilnfffnmmmmmmmffmfffffmmfnmffffffnmfnmfmfffffmnffmmnfmmmfmmfmmmmffffmmmmmmnmnmmnmmmmmmfmnnnmmnnmnmnnkknkkbnnkbbnbljjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjii`kmnkbbkkbbbbiknnnkknkkkkkknkknnnknkbkkkkkkknbkkkkkkkkknnkbkkbbbkbbbkkkbkbbbkknkbbbkbbbbbbbbbbbbkbbbbbbabbbbbabbalilbkkkknnnnmijjjjjjjjjjjjjjjjjj", "lccclccclcccccccccccciiiiiiiiciiiiii`i`iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii`ii`iiiiiiiiiiciankbbkbbbkkmmccnfffffffmffffmmnmmmmfmmmfffffmmfffmfffmmfffmmffffffnmmfffmmmfmfffmmmnfmnmmmnmnnmffmnnnnnnnnmmnmmnnnkknnkkbkkkknljjjjajjjjjjjjjjjjjjjjjjjjjjjjjjjjjc`iknmnbbbkbbba`bnmnnnnnnnnnnnkkkkbnkbkkknkkkkknnkbkknkkkkkbkknnkkbkbkkkbkbkkbbkkbkbbkbbbbbbababkbbabbaabbbaabbbaaalccankknkbnbkajjjjjjjjjjjjjjjjjj", "lclliclcccccccccccccciiia`ccciiicickkiiiiiiii`ii`iiiiiiiiiiiiiiiiiiiii`ii`iiii`ai`iiiiii`ii``mnkkbbbabkkklcnnffffffffefffmmnfffmffffmmmmfmfmmnmmffmnmmmffffffmmmmmmmmmffmfffffmmmmnmnnmnmmmmnnnnnnmmmnnkmmmnmnbbknnkbbknnnljjjjjjjjjjjjjjljjjjjjjjjjjjjjjjjjjia`kbnmnbbbbbkaabknnnnmnnnnnnnkkkknkkknkkknkkbkbkkkkknkkkkknnkkkknkkbbkbkbbkkkkkkkkkbbbbbbbbbbbbbbbababbbabbbbbbkbalciakkknnknkkdjjjjjjjjjjjjjjjjjj", "cclibccaccclcccccccciiicaccciiicic`aai`iiiiiiiiiiiiiiciii`iiiiiii`i`iii`iii`ii`iiiiiiiiciccc`knknkkkbaaa`lifmfmmmfffffffmmnmmffmmfmmmmmmffmfmfffffmfmmmfmfmmnnfnfmmmmnfffffffmmmnmnmmnmmmfmnnmfmfmmfffmmmnmnmnkkbkkkabkknncjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjc``kbknmnbbknnkabnkkbnnnnmnnnnnkkknknnnnkknbknkkkbkkkkkkkkkkbkkkbbbkbkbbbkbbkkkkkbbbbbbbbbabbbbbbbakbkbkkkbabbabbbkci`akknkknkkkajjjjjjjjjjjjjjjjjj", "cclc`lcccccccccccccciiiccciiicciicac`ii`ii`i`iiiiiiiiiiiiiiiiiii`iiii`ii`iiiiiiiiiiiiiiciiiiakkknnmnba``ij`mmmmmffffmmnmnmfmmffmfffffmmmffmmmmnmnffffmmmmfnmmmfffnmfnnffmmmmmmmmmnmnnmmfmmnnnffffmmmmmmnmnnnmnknkbabkkkbbkljjjjjjjjjjjjjjjjjjljjjjjjjjjjjjjjji`ikkkkkmmnnnfnbbnknknnnnkknkkkkkkknkkkknnnbknnkkkkbkkknknkbkkkkbbbbkkkbkbbkkkkbbbbbbbbbabbbbkkababkbkbbbbbbbbbbabki`abkkkkkknnkbjjjjjjjjjjjjjjjjjj", "lcllccclcccccccccciiiiiccciicciiciciiiiiiii`iiiiiciiiiiiiiiiiiiiii`iiiiii`bb`iiii`iiiciiiccibnkkbknbba`cijafmmfmfffmmmnmnnmffmffffffffffffmmmmffmffffmmnmfnnmnfmfmmfnnmnmmnnnnmmmnnnmmmmmnnnfmmmnmmfffnnnmmffmknkbabbbkkkkljjjjjjjjjjjjjjjjjjjjjjjjjjjjj`ljjjca`bknkknmnmnnmbannnknkkkkknkbkkkkknnknnnknknkkkbkknkkkkkkkkbbkbbbbbkbbkkbbbbbbbbabbbbbbbbbbkbbabbbbbbbbbkbkbaabkkbaakkkkbbbkknnnjjjjjjjjjjkjjjjjlj", "cccclcccccccccccccccciiiiciicciccici`ii`i`i`iiiiiiiiiiiiiiiiiii`iiiii`iiiiiicci`iiiiciiiiiciakkkknkaaa`i`jamfmmmmmmfmmnnfnnmffmfmfmfmmffffffffffffmmmfmmmmnmmnfmmmmfmnmnnmmmmmnnmnnmmmmnnnnmfmmnffmmfmmmnnmmmnnnmkbkbbknnbljjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjji`ikkknkbkmnnkkbannkkknknnkkbkbkbkknnnnnkkknknnknknkkkkkkkkkbbbkkbbbkkbbkbbabbbbbbbbbbbabbbbbbaabkkbbkkkbkbbbbbbkbbaakkkkkkkbbbknjjjjjjjjjjjjjjjjjj", "clcccilcccccccciiciciiicccciciicic`iii``ii`iiiiiciiiiiiiii`iii`ii`iiiiiiiiii`iiiiiiiiiiiiiiibkknnkaaaa`abjanmnnfmmmfmmnnmmnmmmmmffmmnnmmffffmmnnfmfmfffmffmffmmmmfmmnmmnmmmmmnmnnmmmfmnnnnmmmmmfmmnnnnmmnmmnmmnmmnkkkkkkkkljjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjc``kbkkkbknmnkkbannkknkkkkkbkkkbkkknkkkkkbbkkknnkkkkbkknkkkkknnkkkkbbbkkbbbbbbbbbbbbbbbbbbbbbabbbbkbbbbbbabbbbbbabbaaknknkknkkbkkljjjjjjjjjjjjjjjjk", "lcccbf`cccccciiaccccciiiiciccciiiiim`iaii`iiiciiiiiiiiiiiii`iiiiiii`i`iii`iciiiiiiii```iiiicabbbkb`iba`abjamfnnmfmmmmmmfnffmmmmnnmmmmnmfmmmmmnnnnfffmmfffnmmmfnmmmmnnnmmmmmmnmnmnnnmmnnnnmfmnmmmnnnnnnnnmmfmffmnnmmnkknbbbljjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjl`ibabbkkkbnnkbkakkbkkkkknkkknkkknknkbbkkkbbkkbkkbkbbbknnkkkkkkbkkkbkbbkbbbbkbbkkbbbabbbbbbbbabbkbbakbabbabbbabbkkka`knknnmnnnbnkljjljjjjjjjjjjjjjj", "k`ii`icclccccciccciicc`ccicicciiciicibniiiiiiiiiiiiiiii`caci`ii`i`iiiiiiiiiiiiciiciiiniiiiic`b`abaiiaaabbjbmmmmmnnnmmmfffffmfmnnmnffmnnnmmmnnnmnnmffmmmffmmffmmmnmfmmmnmmmmnnnmnfffmnnmmffmmmnmnnnnmmnmfnmmfmnnmnmmnnkkknbcjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjci`akkbkkkbbbmkkanknnkkbkkknnkknnknbbbbnknkbkbkkkbbkbbbkkknbkkbbkkkbbbkknkbbbbkbbbbbbbbkkbbabkbbbbbkbbaaabbabbbbbbbaakknnnkbknnkbijjjjjjjjjjjjjjjjj", "ilcciccciccccccciccccii`iiiiciiciiiiiiai`iiiiiiiiiiii`ic`ii`iiaciiiiiiiiiiiciiiiii`iiaiiiccaabaab`iiaabbblkfmmfmmnmmmfmmfffmmnnmnnmmffmmffffmmmmmmmmmmmnmnmmmnnmmmnmmnnmnnnnmmnmmmnmnnmfnmmfmnnnnnnmmmmmmmmmmnnnmmnmnnnkbk`jjjjjjjjjjajjjjjjjjjjjjjjjjjjjjjjjc`iabnkkkbbbbkkk`knnnnbbkknnnnnmnbkbkkkbkknkkkknkkkbbbbkkkkbbkbkbbkbbbbbbbbbbbbbbbbbbbbbbbabbkkbkbkababbbbbkkbbbbbbb`knnnnkbbkkkkijjjjjjjjjjjjjjjjj", "cccciciclccicliaccccciliiicciiiiiii`iiiiiiiiiiiiifkiikaiiiiii`c`iiiii`aai`c`iiiiiiiiiciiiac`bb`aacc`bbkkalkmnmfmnnnnmmmnfffnnnnmnmmmmmmmmmnmmmnmmffffmmffmmmmmmmnnnffmnmnnmmfmmmnnmmmnmmnnmnnnnnnnmnffmmnmnnmmnfmnmmnmnnkbljjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjli`bbbbkkkkkbkkk`knkkkkkbbkbkbknnkbbkbbbkkkbkkkkkbkkkkkkkkkkkkkkbbkbkkbbbknbbbbbbbbkbbbbkkbbbbbbbbabbbbbbbbbkbbbbabaannnknnbbknkk`jjjjjjjjjjjjjjjjj", "cciccicccccccciicciciiiiiciiiiiiiiiii`iiiiiiiiiiiic`iicii``ii`iiiiiiiii`iaikiiiiiiiciciiikilab`a`ciakkbk`jnmnmmmmmnmmffmmfmnnmmnnmfmnmmfmmmnmmffmmmfmfmmfmmmmmmfnnmffmnmnnknnnknmmfffmnnnnnnnmmmnmfmnmnmnnnnnnmmnmmnnnnnmkljjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjic`bkbbbbkkbbnkk`kkknnnnkbnnnknnkbkbbbkknkbkknkkbkbkkkkkkkkkkkkkbkkbkbbbbkkbbbbabbbbbbbbkkkkbbbaabbbbbbbbbbbbbabbaba`knnnnmkbmmnndjjjjjjjjjjjjjjjjj", "ccccccciccccciclcicicia`aiiiicciii`iiai`iiiiiiiic`iikb```ii`eic`iiiiiciccnicbiciiccciciciiickai``c`bnkkkajnmmmmmmnmmmfmmmmmnmmmnnmfmmmffmmnnmmfmnmmfmfmfmnmmnmmnnmfmmmfffnnmnnnmmmfffnnnnnnfffmmmmfmnnmnmfmnnnnmmnkknnnnnn`jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjlicibnnnkbbkkbnkk`nknnkkkkknnnkkkkbkbbkbnnkkbkkkkkbkkkkbbbkkkkkbbkkbbbbbbkkbkkkbbbabbabkkkkkbbbbbkkkkkbbbkbbbabbbbbbb`aaknnknkmmnnbjjjjjjjjjjjjjjjjj", "cclicciiccccccciccciccbib`ciiiiiiiiii`iiiiiiiiii`iiia`ica`iciin`iiii`iii``cinciccicccccciccinic``aaknnkkajnmfmmnnnnnnnnnnmnnmfmmffmfmmmmnmfmmmmnmmmffffmmmmfmnmnnmffmmmnmnnnnnnmmmmmnmnnmffffmmmmfmmmmmmnmmmnmnnmnnkknnnkn`jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjiciibkmnkkkkkkkkk`nmkkbbkbbkbbbbkbbkkkkkkkknkkkkbbkbkkbbbkkkknkbkkkbkkbbbkkkkbkbbbbbbbbkbbkbababkbkbkbbbkkbbbbbbbbbbb`baabnnnkmnnkkjjjjjjjjjjjjjjjjj", "cclcccciaicccccciic`icacaiciiii`ii`iiiiiiiiiiiiiiiii`ii`i`i`ciaiiiiiiiiciliaf`ilcciccccccicckic`abkknnnnajmmmnnmmmmnmnmnnnnnmfmmnnnmffffmffffmmnnnmmmmmmmnffmmfmnmfffmmnmmfmmmffmmnmnmmffmmmnnmnfmmmfmmmnmmnmnnnnnmkbbknmkijjjjjjjbjjjjjjjjjjjjjjjjjjjjjjjjjlciibbkknnkknbkkbikkkknknkkkkkkkkbbkkknkbkkknnnnkknkkkbbbkkkbkkkkkkbbbkbbbkkbbbbkbbbkbkkbbbbbbkkkbbbbbbbbkbbbkbbbbbbbakkbbknmnmnnnkjjjjjjjjjjjjjjjjj", "ccccciciiiicciccccciiciiii`iiiiiiiiiii`iiiiiiiiiiii```ii`iiiiiiiiiiiiii`cicia`aiicicccccciciaca`aknkknnn`jfmmnnmmnmmmnmmnnnnmnnmmmnnmnmffffffnnnnmmmfmfmnmmfmmmmfmmmmmnmnmffmmmnnnmmmmmfnnnnmfmnmmmfmmnmmnnnnnkknmnkabkknnijjjijjjjjjjjjjjjjjjjjjjjjjjjjjjjjjci`akkkkknnbknkkannbnkkkkkkkkkbkbknbkbkbkbbkbkkkknkbbbbbbbbkkkkbbbnkkbkknkkkbkbkkkkbbbbbbbkkbbbabbbbbbbbkkkbbbbbabbb`bnnbbknmmnnkbjjjjjjjjjjjjjjjjj", "cccccciiicccccicicicciiiii``biiii`ii`a`iiiiiiiiiiii`iiiia`ii``iciccici`ciicci`icbicccccccici`i`aknknnnnn`jffnnfmmnmnmmmnnnmmmmmnfmmmnmmmnmmffnmnnnmnnnnfnmmfmmmfmnmmmnnnmnnnmmmmmnmmfmmfnnnnmfmmmmmnnmmfnmnnmnmkknnkbbbbkkcjjjjjjjjjjjjjjjjjjjjjjjljcljjjjjjjci`abkkkknkmbnkn`nkkkkkkkkkkknkbkkkbkkknkkbkkkkbbkmkkbbbbbbbbkbbbknkbkkbbbkbkbbbbbbkkkbakkbkkkbbaabbkbkbabbbbkbbbbbbaannnkbbnnmnnnjjjjjjjjjjjjjjjjj", "ccccccciicicicciciaaiccc`iii`iiiiiiiii`iiiiiiiii``iiiii`aiiiaa``ciiiiiiccciciiicilcclcccccciaabkkknnnnnn`jfmnnmnmmnnmmnnnnmmmmfmnnmmfnmfnmmffmmmmnmnnnmmnnnmmnnmmmmmmfffmnmmmmmmmnmmfmmmmnnnnmmnmnnnnmnnnnnmnmmnbnnbbkkbakijjjjcljjjjjjjjjjjjjjbljcjjljjjjjjcjiaakbkkbnknnnmm`nkkkkkkkkkkkbbbkkkkkkkkbknbkkkkbbkkkkkbkbbbbbkbbbkbbbbkbkkbkbkbbbbbbbkbbbkbbkkbkabkbkbbbbabbbbabbbaabnnnnbbbknmnnljjjjjjjjjjjjjjjj", "lciccciiciciccicciiiiiciii```i``i`iiiiiiiiiiii`iii`ii``b`iiiiiicicicciiiciccccccccicccccccciabkkknnnnnnnilnnnmnmnnnnnnnmnffmmmmmnmmfmnmffmmmfmfmnmmmnnnmmmmmnmmnnnnmnmmmnnmmmnmmmmmmmmnnmmmmfffmmmmnnmmnmmnnnnnnbkbbbkbbabcjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj``iabkbkbkkknknn`kkkkkkkkbkbkbkkknkknkkbkknbkknkkknkknbbkkbbbbbkbbbbbbbbbbkbbkkbbbkbkkbkkkbkbbabkbkbbbbbbaabkbbbbbbaaannnmnbbbkknmcjjjjjjjjjjjjjjjj", "iiiccciiiiciciccicicccci``iiii`ii`iiiiiiiiii`iii`i`iiii`iiiiiciiiciciiiiciicccccci`ilccccccaabkknnnnnnnnclmnnmnnnnnnnnmnmfmmmnnmmmmmmnmmmmmmfmmmnnmnmnnnmmmnnmmmnnnnnnnnmnnnffmnmnmmmnnnfmmnmmmmmmmnmmffmmnmnkkknkbkkbabbbcjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjli`abkbkbkkknkkkckkbkkbkbkbkbkkknkkkkbbknkkkbkkkkknkkkbbbkbbbbbkbkkbkkbbbbbbbbbbbbbbkkbbbkbkabbkkbbbknkbkkkbbkkbbbabaamnnnnkbbabbncjjjjj`ljjjjjjjjj", "ciicciiiiiiiciicccciiiamb`i`i````iiiiiiiii`iii`iiii`iiciiiiiiiiiiciiiiiciiiccccccciccclccli`kkmmknknknnnccmnnfnnnnnnnnmfnmfnmnnnmmmmmmnnmnmmmmmmnnnmnnnnnnnnmmmmfmnnnnnmnnnmffmmmmmmnnnnnnnnnnmmnfmmnmmfmnnnnnkkkbbkkbabbbcjjjjjbjjjjjjjjjjjjjjjjjcjjjjjjjjjjcci`bbkbbkbkkkbkckkkkkkbbbbbkkkknkkbbbbnnkkkkbkkbbkkkkkbbbbbbbbbbbbbbkkbbbbbbbbbabkkbbbbbbkbabbbbababbbbbbbabkkbbaababnnmnmnbbbbab`jjjjjijjjjjjjjjj", "ccccciiciiiiiiiiiiciiccaiii`iiii`iiiiiiiiiii`i`i`iii`i`iiiiiiicciiciii`iiiiiciccclcclccccccaknmmmmnnnkknlcmnnmnnnnnnnnmfmfmmmnnnfmmmffmmmmnnnmnfnmnnmnmnnnnnnmmfnnnmmmnnnmmmnmmmmfmmnknnnnnnmmmfmmmnnmmmmknnnnkbabbbabaakaljjjjjjjjjjjjjjjjjjcjjjjjjjjjjjj`jjli``bkbbbkbkknkkckkkkkbkbkbbkknnknnkbbkkkkknkkkkkbbbbbkkbbbkbbbbabbbkbkbbbbbbbbbbbbkkkkkkkkbdbaabbbkbbbkkbbbbbbbabbabakmnnnkkbkkbbijjjjjjjljjjjjjjj", "cccciciiiiiiiiiiciiab`icci`a`ic`i`iii`ii`iiiii`i`iiiicciciiicciiiccicibiiiccccccicccccclcccanmnmmmmnkkkklimnnmnnnnnnnmfffffmnnnnfnnnmffffnmnnmnmmmnmnnnmnnnmmnmmnnmffmmnmmmnnnmmfmnmmnmmmmmnnnnnmmnmmmnmnnnnknkbabkbbbabbaljjjjjjjjjjjbjjjjjjjjjjjjjjjjjjjjijliiabbkbbkkbkkkb`kkkkkkbbkbbknnnnkkkbkbkbbkknkkkkkbbbbkkbkbbbbbbbbbbbbkbbbbkbbbbbbbbbbkbkbbbbbkkbbbbbbbbbbbbbbbbabbba`bnnnnknnbkbb`jjjjjjjjjjjjjjjj", "ccccccciiiiiiiiii`iiiiii``iiiiciiiiiii`iiiiii`i`iiiiiiiiiiiciiicciiaicaicciiccccclcclcclllcafmnfnmnnnnnnlcmfnmnmnnnnnmmfmmnnnnnnnnnnmmmmmnmnmfnnfmnnnnnnnnnmnknnnnnnnnnmmnnnnmfmmnnnnmmmmnmnnnmfnnmmmnnmnknkknbbbbbkbaaaaaljjjjjjjjjjjljjji`jjjjjjjjjjjcljjjjj`iabkkkbkkkkkmaaknkkkkbkbbkknnkkkkbbbbnbbbkkkkkbkbnkkbkkkbbbbbbbbkbbbbbabbbbbbbbbbbbbkkbbbbbkbbbbbabbkbabkbbbbbbaaaa`aknnnmnkknbbajjjjjjjjjjjjjjjj", "icccci`cciciiiiiii`iiiiiii``iiiiii`iiiii`i```iii``ci`ciiiiiccicicccciciiicicccccccclccccclikmmnmnmnnnnnklammnnknnnnnnnnnmmmnnknmnnnnnnmmmmmmfnnmnmmmmnmnmnnnmmnnnnnnnnnnnnmmmmmfnnnnnfnmmnnnnnkmmnnnmmnnmnmnnkbbabbba`aaailjjcjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjliiakbknkkkbknnk`nkkbbkkbkbbbkknkkbbkbkbkbbbkkkkbknbnbbbkbnkbbbkbkbbbbbbbbbabbbbbbbkbbbbbbbabkkkbbbbbbbbbabbbabbbbbaaibbbbknmmknkabjjjjjjjjjjjjjjjj", "icciccccciicci`bi``i`iii`i``ciiiciiiiiiiiiiiii`aci`iiiciiiiiiiccciicccccccciciccccccccclclcbnnmmnnnnnnnklaffmnnmnnnnnnmmmmmnnnmmnnknmmmmnnmmfnnnnnmmnmnnnmnnmnmnknmnnmmnmmfmmnnnnnnmmfmmnnnnnnnmmmmmnnnkmnnnnkbababaa`aaicjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjliiakkabkkkkknnnannkkbbkbbkbkkkknkkkbbnbbbbbbkkkkkkbkkbbbkkkkbbbbbbbbbbbabbbbbbbkkkbbbbbabbbkbbbbabbbabkkbbabbabbbabb`abbbkknmmmkbb`ljjjjjjjjjjjjjj", "macciiiicicciii`iii`i`i`i`knai`c`iii`iii`ii`ii`aaciiafiiiciiiciacciccccciciiccclccclccllclcaknnmmnnmnnnnjbmffmnnmnnnnnmmmfnmnnmfmnknmmmnmnmnnnmnmmnmmmnnnnnnnnnnnmmmnmmnnmmnnnnnnnnnnnnnnnmnnnmnnnmnnnknnnnnnkabaaaai```iiljjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjiiakbaakkknnnmnankmnkkkkkkbbkkkkkkkbbnkkbbnkkkkbbbbbkbkbnkkkbbbbabbbbbbbkkkkbbbbbbbbbbbbbbabbbbabbabbbbabkabababbbbb`abbbbbknmmnbbljjjjjjjjjjjjjjj", "biccclcciicciccii`iiii`iii``ci`ia`iiiii`iii`iii`c`iiii`ciiicccibccciciciiiiiiicccccclccclclabkkkmnnmmnmklanmmnnnmnnnnnnmmfmnnnnmmnknmmnnmnmnnmfmmnmmmmmnnknknnnnmmmmmmnnmnnmmmmmmnmknmmmnmmmmmnnnnnmnnnnknnnmkabbaa```a`iiljjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjlii`kkbabkbkknmnakknkkbkkkkbbkknkkkkbbnkkbbkkbbbkkkbbknkbkbbkkbabbbbbbbbbkkbbbbbkbbbbbbbbbbbbbbkbbbbkbbbabbabbababbbb`abbbbbabknkkajjjjjjjjjjjjjjjj", "cciiiiiicciiccib`iii`ii`i`````ic`ii`iii`i`i`iiiiiiiciiciicciiciiiccciiiciiciccilcclclcllcll``aaknmmnmnmblbnnmnnmmnmnnnnmmmmmnknnmnnnnnnnnnmnmnfnknnnnknnnnnnnnnnnnmmnmnmnmnnmmmmmnfnfmmnnnnmmmmnnnnknnnknnkknkabbaaaabba``cjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjii`baaaabakkbknakkkkbkkkkkkbbkknkkkbbbkkkbbbbbbbkkbbkkbbbbbbbbbbbbbbbkbkbbbkbkbbbkbbkkbbbbbkbbbbbbkkbbabaabaaaabaaaa`i```aabaknnbacjjjjjjjjjjjjjjl", "icccciccicciic`b```iiiiii``iiiiiiiii`iii`iiii`iiicii`cicciiciicccccccicciicicciclcclclcllcli``akkmmmnmnbjbnmmnmnmmmmnnnnmmmmnnnkmnnnnnnnkknnnnnnnnnnnknnmnnnnmmmnmmnnnnnnknknnnmmnmnnnnnnnknmmnnkkkknnkknnnknkabbaaabbkabaijjjjjjjjjjjjjjjjjjjjjjjjjjjljjjjjjjcci`ii`abbkkbkkabnkknknknknkbbkknnkkbbbkkbbkkbbbbbkkbkbbbbbbbabbbbbbkbkkkkbbkbbababbbbkbbbbbbabbabbkbabaababbbbbbabaiciii`aabbnnkacjjjjjjjjjjjjjjj", "liiicciiiicciiii`i`iiiii``ii``iii`iiii`i`iiiiiiiki`cciciciiccccicccccccccicciiaicccllcllclcaaabknmmnmnnbjkmmfnnnmmfmmnnknmmfmnmnnnnnnnnnnnnnnnnmnnnnnnnnnnnnnnnmmmmnnmmknnnknnmmnnknnmmfmnnmmmnmnnnnnmmnnnnkkbabaaaabkkbnaijjjjjjjjljjjjjjjjjjjjjjjjjjjjjjjjjjilcic``bkbkkkkbaankkkbkkkkkkkbbkknnkkbkbkbbbkkbbbkkbbbbkbbbbabbbbbabbbbbkbbbbbbbbababbkbbabbkkkbbbbkkkbbbbbabbbbabaaalccciabbbkkkbijjjjjjjjjjjjjjj", "icciciccciiciiiiii`iiiiiii`iii`iiiii`i`iii`iiiiiiic`ciiiiicciicccciccccccilcclilclclclccllcbbbbmmmmmmnnbjkmmmnknnmmnmmmnmfmfmmmfnnmmmmnnknmnmnnmnnnnnnnnnnnnnnnnmmmmmmmmnnnnnnnmnnnmnmnnnnknnmmnmnnnnnnnnnnnnkbb`i`aabnnkaijjjjjjjjljjjjjjjjjjjjjjjjjjjjjjjjjjcllcc`abbbabbkbaannkbbbkkkkkkkkkkknknnkbkbkkkbbbbkbbkbnbbbbbbbbbbbbbbbbkkkkkkkbbbbbabbbababbbabbabbbbbbbbabbbbabbbab`lllciibbabbbbijjjjjjjjjjjjjjj", "ccciciicciiciii``c`i`cii``iiiii`ikbn`iiii`iiiiiiiciiiiiccakaiccccccccccciccccclccllcllclllcbbbnmmmmmmnnajmmmnnnnnnmmnnnmnmmmmmmmmnnnnmmnnnmnmmmknmmnknmnnknknnmnmnmmmnnnmnknnnnnnkkmmmnnmnmnnnnknkknmmmnmnmkkkaaii``bkkkbaijjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjicllccaakbbbann`bnnkbbkkknkkkkbkknnkknkkbbbbkkbbbbbkkbbbkbbbbbbbbabbbbkkbbbkbbbbbabbabbbabbkkbbbbbbabbbaaabbbbbbbbaaalccc`abkbbbabajjjjjjjjjjjjjjj", "ciiil`ciciciciiii`iiiii`ii```iiii`ia`i`iic`ci`iiiiiicciiiciccccciccccccccccllcclcccllclclccbbbnnnnnmmnn`lnmnknnnnnnmmnmnnmfmmmmmmknkknnknnmnmmmnmnnmmnnnnnnnmnnnnknnnnmmnnknnnnnnnnmmnnnmnnnnnnknnnknmnnknnnmka`i``abbknaaijjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjicjcii`bkbkkknmaankbkbkbbknkkkkbknnnknkbbbbbbbbbkkbkkkbbbkkbbbbbbbbbkkbabbbbbbkbbabbbbbbbbbbbbbbbbabbbabbaabbbbaabbbblli``bkbbbbaaajjjjjjjjjjjjjjj", "ccciina`iicicii`iaiiiiiii``i`iiii`i``ii`i`a`iic`iciciiccciicciccccccclcccccccclclclccllclciabkmnnnnmmnm`jnnnnknnkknmmmmknmfmmnmfmnnnnnmnnmmnnmmmmmmmmnknnnnnmmmnnnnnmmmfkknnkknnmmmmnnnnmnmnnnnknkkknnnmnnnnmna````bbknbaaijjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjljjcila`i`bkbknnnnaabbkkkbbbbnkkkbbkkkkkkknkbbbkkbbbkbkbnkkkkbbbbbbbbbbkkbbabbkbkkbaabababbbbbbbabbkbbbaaabababbbbbbabbbllababkbbbbbbbjjjjjjjjjjjjjjj", "iiccik`iiciacii`ibiiii`iii```i`ii`i`iciiiiiiiciciiiiiiiiiccciccccccccccccclccllcieillclllciabknnnnnnnnnilknnnnnnnnmmnmmnnmmmmmmmnnkknmmmmnnnnnmmnfmmnmmknnnnnmmnnnmmmmmmnnknnknnmnnmnnnnnmmnnknnknknkmmmmnkknkaaa`abakkaab`jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjicca`iibbbknnnnb`bkbkbbkkkkkknkkknknnkkkbbbbbkkkbbbbbbkkkkbkkkbbbbbkbbbbkbkkkbkbabbbabbbbkbbbabbbbbbabbaabbabbbbbbaablcabbbkkbbbbbbjjjjjjjjjjjjjjj", "ciccccicciibiiiiiaiiiiiiiii`i`i``iii```iiiiiiiiiciiiccciciccccicilclcicccilclclclccclclcll`kknnnnmnnnnn`jnknnnnkmmmmnmmmnmmmmmmmmnnnknnnnnknnnnmnnmnnfmmmmnnmnnnmmnnnmmnnnnnknknnmnmmnnknmnnknknnnmnnmmnnnnkkkabaaabbaaibk`jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjliccb`iibbbbknknk`kkkkbknknkbnnkbkkknkkkkkbbbkkkkbkbakkkbbkbbkkkbbbkbbbbbkbbbbbkbbbababbbbbbbkbabbbbaabbabbbbbbbbaaabbcibbabbkbbaabbljjjjjjjjjjjjjj", "ciciiciicii`iii`i`ii`iiiii`iii``i``iaaai`iici`ciiicc`iccciiiccclccicccciiaillcclcjlallllll`knnnmnmmnnnn`lnnnnnnnmnnnnmmnnnnnnmnnmfmnmmnnnnknnmmmnnmmmmnmmmnmknkkmmnnnmmmnnkknnnnmmmnmmnknnnknnknnnmmnmmnnnmnnkbbb`abba`abkijjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjiicnk`cakbbknknkabkbkbkkkbkbkkkbbbbkbkkkkkkkbkkbbbbkbkkkbbkkkkkkkkbbbabbkkdkkbkkbabbbbbbbbbkbbabbbabbabbbbbbbbbbabbbaiiabbabkbabbbbjjjjjjjjjjjjjjj", "icciiciciicccii`iiiiiiiiiii`i````iiii`iikiiiabiiiiccaa`ibicbbicicc`iccc`ibcclclllacjclllll`bkknmmmnnnnnilnnnnknnnnnnnmmknnknnnnnnmnmmmnnnnnmnmnnmmmmnknnnnknnkknmmmmmmmmknknnmmmmnmnmnnnnnnknnknnnnnnmnnnnmnknkaiiiab`abbk`jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjji`cnnic`bbkbknkk`bkkbbkkbkkkknkkbkkkkbkbkkkkkkkbbbkbbnbnbbkbbbbbbbbbbbabkkkkkkkbbababbbkbkbbbbbabbabbbabbbbabbbbabbab`ibbabbbbbbbkbljjjjjjjjjjjjjj", "cciiciciciiii`iiii`iii`i`i`iiii`````iiiiiiciiiicciii`iccciccccicccilccccc`lclllcclcllcllll`bbkbknmnnnnnicnnnnknmnnnnnnnnnnnnnnnnkmmmmmnnknnmnmnnnmmnknnnnnnmnnknknmmmnmnnnknnnmnnnmnnnnnnmnknmnnnnnknnnkkbnmnmbilcci``abkkijjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjic`kb``akmbakkknakkbbbbkbknbbkbbbbbbbkbbbkkkkbbbbkkkkbbbkkbbbabbbbkbbbbbbbkkbkkbabbbbkkbkbkbbbbbbkbabbbaababbbaaabbbb`ibkabbbbkbbabljjjjjjjjjjjjjj", "iciciiiiiccci`i`iiiiiiiiii``i``i``iiiiiiiiiiciciiacciilccccciicciccccccclclclcllllllllllcl`abbbknmmnmnnlcnnkknnnnmnknnnnknnnnnnmmmnmmknnnffmmmnnnmnkknnnknnknnnnnkknnnnnkknnnmmnnmmnnnmnnnnmmmnknknnmnnnnkmnnnii`ciccikkbbijjjjjjjljjjjjjjjjjjjjjjjjjjjjjjjjjjic`bb``bkknbbbnnakkbbkkkkkbbbkkbbkbkbbbknkbkkbbbbnkkkbbbkkbabbbbbbbbbbbbababbbbababbbbbbbbbbbkbbakbbbbbbbabkbbbaabbbb``bbkaknbbkkakijjjajjjjjjjjjj", "cicciccia``ii``i`i`iiiii`i```i```i`iiiiiciiiiiiic`ciccaiciicciicicccccccclclcllclllllllcjcabbbknnmnmnnnlinnnnknmnnnknnnnnmnmmnmnmmnmnkknknmnmnnmknnnknnnknnnkknknnnknnknnnnmmmmmnmnnnnnmnnmnmnnnnnnmmmnnnnnknk`c`iiciiabbbijjjjjjjjjjjjjjjjcjjjjjjjjjjjjjjjjjjci`bb``bkkkkbbkkakbkbbkkkkbbbkkkbkkkkkkkkkkkkbbbbkkkkkkbbbbbbbabbbbababbbbabbbabbbbkbkkbkbbbabbbbbbbbbbbabbbbbbbabbab``babbbkkbbkkbijjjljjjjjjjjjj", "cciciiiciiciii``i`i`i`i`ii`````i`iiiiiii`iicicccciciicb`ciiicicicicccccclcllclllllllllllclakknmnmnnmnmmlinknkknmmnnmnkkmnnnmnmnnmnkmmnnmnmmnmmnmmnnmmkknnnnkknknnnnnnnnknnknnnnnnnnnnknmnmmmnnknknmmnnnnkknkkkiciiclcc`ank`jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjic`kb`bbbkkkkbbk`bkbbkkknkkkkkbknbbknkkbkkkkbbbbbkbkkkkkbkbbbbbbbbbbbabbbbbkabbbbbbbbbbkbbbbaabbbkkbbbababbbbbbabaaabaibabbbbkkbbnkajjjjjjjjjjjjjj", "ciciciciiciiiiiiii`i`i``a`i```i`iiiiiiiiicic`iiiiccccci`iicccciccicciclccllclllcllcllcll`c`bbbmfmnnmmmnl`nknnkkmnnnmmnnmmnknnnnknnnkkkkknmmmnmnnmmnmnnkknnnnkknknnnnnmnnnmnnnmnnnnnnnknnnnmmnnknknnnnnnkkknknk`iicclcciakkajjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjlli`bbbknkkkkkkbbibbkbbbkkkbnkkkkkbbbbbbbkbbbbbbbbkkkkbbbbkbkbbbabkkbbbbbbbbbbbbbbbbbbbbbabbbbbabbkbkbbbabbbbbbabaabakaikaabkbkkbbkkajjjjjjjjjjjjjj", "cciciciciiiiiiiiiii````ibaiiiii`iiiiiiiiiciabiiliccciiiiccccccccccciclcllclllcllllllllllcjbnkbbknkmmmnmj`nnnnnknnnnnmmnmnnkknnnnknnkknnnnmmnnnkknnnnnnnnnnnnnknkknnkknnnnmmnmmnmknmnknnnmmnnnnknnnnknnkkknnnmkaiiccici`abbbjjjjjjjjjljjjcajjjjjjjjjjjjjjjjjjjjcciabbknkkkkkkkb`kkkkbbkkbkkkkkkkbbbbbbbbbbbbbbbkkkbbbbbbbkbbbbbbkbbababbbbbabbbkkbbbbbbbbbbbabbbbbbbbaabbbbabaaabbaba`nbabbkkkkbbkkjjjjjnljjjjjjj", "iiciciciiciiiii`iiiiiii`a`iiiiiiiiiiiiiib`iciciiiciiiibiccccccccccccclcllllclllllccllllllcbbbkkbkkkmnmnlannmnknnknknnmmnmnkknnnmnknnmmnfmnnnknnnknknnmmnknnnnnknknkkknnnmmmnnnnknnmkknnnmnnnnnnknnkkknkkknknnb`icc`ai`a`aa`jjjjjjjjjljjjjjjjjjjjjjjjjjjjjjjjjjlci`abbknkkkknnk`kkkkkbkbbbbkkkkkkbbbbkkkbbbbkbkkkbbbbbbbbabkkkbbaabbbbabaababbbbkbbkbbabbbbabbbbbbbbbabbbaaaabaabaabbikkbakkbbnkbbbljjjjajjjjjjjj", "iiciciiiiiiiiiiiiiiii`iiiii`i`iiiiiiiiii`ccciiciiiiiccalcccccccccclclc`lcllllllllcclllllllbbbnbabbbknmkjannmnnnknnknnmmmmnnnnknmfnmnnnkkmnnnnnnnkkkkknnkknknnnnkknknknknnnmnnnnknnnnknmmmnnnknnnnkkkkkkknnnnnk`cc`ab`a`cii`jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjlciaabbkknkkknnkakkkkkkbbkbbkkkkkkbbbbkkkkkkkkbbkbbkbbbbbabbbbbbbbbbbbbbababbabbbbbbbbbbbbbabakbkbbbabbbabaaabaabbabbaiakbabbbbbkankijjjjjjjjjjjjj", "iiicciciciiiiiiiiii`iii`ii`iii`iiiiiiiiciiiiciiiicciccliccciicclcllclcaclcllclllllclllllllbabbdkdddbnnklannnknnkknknnnnmmnnnkknmmmmnnfnnnknnnnnknnknnnnnkknnnnnkkkknkknnnnnnnnmknnnnmnnnmnnkkknnkkkkkkkknnnknb`c`bkbba`i``ijjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjcibbbkkbknknkkn`kkbkkbbbbbkkbkkkbkkbbbknkkbkkbbbbbbbbbbbbbbbbbbbbbkbbbbbbabababbakbbbkabbbbkbbbkkbababbbaabaaaabbkaaa`bnabbkkbabbbkcjjjjjjjjjjjjj", "ciiiiciiiiciiiiiiiiii``i`iiiiiii`iiiiiiiciiciiicicccicccililccccclccllllllclllllllllbllllikkabbbbbkbkmblanmnknnknnnkknnnnnnnmmnmmnnnnnnnnnnnknnnnknnnnnnnnnknnnknnnkknnnkkkknnknknmnkknnnnknknnbkkkkkkkknmkkkb`ibknnkbaa``cjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjli`akkbbkbknnnnnibkbbbbkbkbbbkkbkkkkkkknkkbkbbbbbbbbbbbbbbbbbbbbbabbbbbabbbbbbbbbababbbabbbkabbbbababbbaaabbaaaakbbaaa`bnbbbbnkkbbbbljjjjjjjjjjjjj", "icciccicicii`c`ii`i``cc`ii`iii`ai`iic`iiciiciiiiccccccccclcccclcllciilclllllllllllllcjcllannkbbbkkbaknajknnkkkkkknnknmnnnnnnknnmnnnnnnnknnkkkkkkkknkknkkkknnnnkkmnnkkkkknkkknnnnnknnnknknkknknnnkkkkkkkknnmnnk`aknknknkb`d`jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjl``aknkbbkknnnkkikkbbbbbbbbkbbbkbbbbbbbkkkbbbbkbbbbbbbbbbbbbabbabbbbbbbabkbbaaaabaaababbbabbaabababbaabbbaaaaababbkbbb`ankabbknkbbkbijjjljjjjjjjjj", "iccici`c`ciii`kiiiiiiiai`iiiiii`ii`iiiccicciiicccciccccc`mlclclclccccllcllllclllllllllail`bkkbaknkbabkijnnkknknnkkkkknnmnnkkknnmkkkknnnnnknknnkknnnnnkknknnnknkkmmmnnnnkkkknnnnnkkknknkknkkkknnkknnnnnnnnmmnkbaknnnknfnbbnbjjjjjljjjjlcjjjjjjjjjjjjjjjjjjjjjjjl``bnnknkkbkknkk`kbkbkbbbkbkbbkkkbbbbbbkbbbbbbbbbbbbbabbbbbbbbbbbbbbbbbbbkkbbbbbbbbbbbkbbbbabbaabbbabbbaaabbdbbbbbbbaa`amkbbbknknkbbijjjjjjjjjjjjj", "ciiiiia`ci`bna`iii`iibfiii``i`iiii`iiiiiiiciiicccccicccclccl`cilcllllllcclllccllllllll``liabbabkkkkbbbilknkknnknnnkkknnnknnnkknnkkknknknknknknknnnnnnknknnnkknnmmnnkkkkknknknnnmknmnkknnnnnmmmnkkknknkknknnkkbbnnnknmmkdakbjjjjjjjjjjjljjjjjjjjjjjjjjjjjjjjjjjli`bnknnnkkbbkkmabbbkbkbbkbbbbbkkbkbbbbbbbbbbkbbbbbbbbbbbbbbbbbbbbbababbbkbbbabaabababbbbabbabbbbabbbbabbababbbaabaabaaamnabbkkkkkkkijjjjjjjjjjjjj", "c`icciiciiciiiii`ii`ian`i```iiiaiciiciibiciiiicccccccccccccinlclclcccccllllclclllljcljlilibbbbbbaabkkb`jbkkknkknknkkknnnkknkkkkknkknnkkkkkknknnknnnnkkknknnkknnmmmnnkkknnnnnnnkknnnmnknnkkknnnkbkknnkkkkkkknnkbkkknmnkbbknkjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjl`i`bknknmkkbbbk`bbbbbbkbbkbbbkbbbbbbbbbbbbbbbbbbbbbabbbbbbbbbababbbabbbkkknbababkkbkbbbbkabbabbbabbbbbbaaabbaaabaababa`nkbabbkkkknbaljjjjjjjjjjjj", "ibaiiiiiik`ciai`iiiiii`iii`iiii`iciiiciaiiciiccicccccccccllililcclllcclllllllllllclllllllibkbkndaabnkb`jknnkkkknkknnnnkkknknkkkknnnnnknkknkknnnnkkknknknknnnnnnnknnnnkkknmnnnnnnnnkkknnnnnnknmnmknnnkkkkkkkknnbnnknmnbbnnnncjjjjjjjjjjjjjjjjjjl`jjjjjjjjjjjjjjl``abkkkknmkbbbbibbbbbkbbbkbbkbbbkbbbbbbbbbbbbbbbabbbbbbbbbbbabbbabbbbbbbbbkbbbabbbbbbbabbbabbabbabbabbbbabbbaabbaaabaaikbbbabbkkbbbbjjjjjjjjjjjjj", "c`iciiiii`i`iiii`a`ii`iiii`iiiiciiiiicciiiiicccccccccccclicjillccllcllcllllllllljlljllljlanmnnnbabnnnbclknnnnnnnkkknnkkkknknknnnnkknkkknnknnknnnknknnnnnknnnnnnnnnnnnnmmnnmnnnnnnkbkknnknnkkknnnnnnnkkkkkkbkkkbnknnkbbkmmnkjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjl`iakkkmnkknkkbbibkkkkkkbbbbbbbbbbbbkbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbkbbbbbkbbbbbkbkbbbbbaababbbbbaabbbbbbabaaaababaaaikbababbbkkkkbjjjjjjjjji`lj", "iiiiiciii`iiiiiiiii`iii``i`ii`i`iiicciiciiicicccccccccicc`ciiilallccllcllllllllllllllllllannmnkbbmkkfkljknnmfnnknkkkkkknkkknnnnnknkkkkkknnkknkknkkkknnnnkknnnmmmnnknkknmmmmmmnnnbknnkkmnnnkknnnnnnkkkkkkkknnkkbnknnbbakmnmbjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjl`iiaknnnnknnmnkcakknkbkbkbbbbbbbbbbbbkbbbbbbbabbbbbbbbbbababbbkbabbbbkkkbbbbbabkkbkbkbbaabaaabbbbbbaabbbbbbbaabaaabbabikbbbbaabbknbkjjjjjjjjjjjjj", "iiiiiiiiiiiiiiiii`i````ii```ii`iiicicici`iicccccccccccclcclclcclclclllllcllllbllljcbcljllannnnbaknnmnncjnmnnnkkkkkknnkkknnnnnkkkkkkkknnnnknnknkknknnnkkkknmnnnnnmmnnnnnnnnnkkkkkkkkkkkkknnnkknnnnknnnkkknkknnb`knkkbdbnmnmbjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjlii`abbkkknnkkmk`kknkkbbbbbbkbbbbbbbkkbbbbbabbbbbbbbbabbbbbbbbbbbbakkbbbbkkbbbkbkbkbbabaababbaaababbabakbbabbbaabbbababcanbaabbabkknkjjjjjjjjjjjjj", "ciciiiiiiiiiii`i`i```i`i`icc``i`iiiiiiiiicciciccccclccccccclcccllllllclllllllijllllijllllaknkkabkkknmnclmnknknkbnknnnnkkkkkknnknkkkknknknnkknkkkkknnkkkkkknnkknfnmnnknnnnnkkkkknkkkkkkkbkknmnnnkkkknkkkkknkkkbabnkkkbknnfnmjijjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjlii`akdbbbbkmmk`cabbbbbbbbbkkkbbbbbbbbbbbabbbbbbbbbbbbbabbbbbbbaabbbbabbbkbbbbbbbbbbaaabbbaaaabaaabbbkbbaaaaabbbaadababiabbbabaaabbkbljjjjjjjjjjjj", "iiiiiiiiiiiii`i````iiiiiiii`baiiiiiiiicccccccccccccccccclclclcclclllcccllllllllllllljlljlbknkbankabknncckknknnnmnnnnmnkkknknkkkkkkknnnkknkknkkknknnnnnnnkkkkkknmknnnkkknknnnnnnknkkkkkkknkknnnnnnnnnnnknkkkkkkbknkkkknnnmnajjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjiciakbkbkkkbbbaiakbkkkkbkkbkkkbbbbbbbbbbbbbbbbbbbbbbbbbababkbbbbbabbaabkbbbbaaabababbbbababbbabababbbkbbbbbbbbabbabaabc`aaaaaaaabkknijjjjjjjjjjjj", "iiiiiiii``i`ii`i``i`i`iii`cciiia`i`i`iiiiiccccccccclccccccclccccclcllilllllllllllllllllllkmkkkknbdabkklcknmmnnnnnkknnnkkkkkknknkkkknknnkkkkkkkkkkknnkknknkkkkkkmkkkkkkknnnnnnkkkknnkknnnnkkkknmnnnkkkbkkknkkbkbnmnnnkknmnnajjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjliiibbbbbbkka`caabkkbkkkkbkbbbkbbbbbbbbbbbbbbbbbbbabababbabbbbbbbbbababbbbaabbabbbbbbkbbaabbabbbbbbbbaabbbbaaaabaababaacc`iaaaa`aabkkijjjjjjjjjjjj", "lllllllllllllllllllljlllllllllllllllllljlljlljljlljljljljjljjljljjljjljjljjjljjjljjjljjjjknknmnnbbbbkklcnnnnnnkknkknnnkbkkknkkkknknknkknkkkkkkknnnmnnnmnnnnnknnnkkkkkknnmnnkkkkkkknknkmmnknkknnkkbkkkkkkkkbkkbbnnmmkkkkmmnkjljjjjjjljljjjjjjljljjjjjjjjjjjjjjjli``bbbbbbbaiiiaaakbkbbkbkbbbkbbabbbbbbbbbbbbkbbbbbbbbbbbbbbbbbbkbkbbbbbkbbababbbkbbbaaabbbbabbbbbbbabbbbaaaaaaababaaaaiccii`ii``aaab`jjjjjjjjjjjj", "ljljljljljljjljlljljlljljjljjjljjjjjjjljljlljljljjjjljljlljljljjljlllllljllljllljlljljjljbbknmmnkbbbbblinnnnnnnnknkknnnnkkkkknknknkkknkkkkkkknkknknnkknknnmnnnmnkkkkkknnnnkkkkknkkkknnnnknnknnnkkkknnnkkkbkkbbakmmkbbbbknnkjjjlljlljljllljljjljlllllllljlljljll`cibabaaa`cliaba`kkkkkbbkbbbbbkbbbbbbbbbbbbbbbbbbbababbbbbkkbbbbbkkbbbkbbbaababbbkbaabaabaabbbbbbababbkababbbbbbaaaaaaiciiicci```aad`ljllllllljlj", "ljlljlljljljljljlllljljljljllljllllhllllljljljjjlllljllllllljljljjljjljljlljjjljllllllljlddknmmnkbkbbbj`mmmnkknnnknkknnnkkkkkkkknkkkkkkkkkknkknknknnnnnnnnnnnnnnknkkbkknnkkknkkkkkbkknnknnkkkknkkknnkkbkkkbkkkaknnbbbbbbknnjljljljllllljllllljlljljljljlllllljl```bbaa`cjlcabbakknkkbkkkbbkbbkkbbbbbbbbbbbbbbbababbbbbbbbbbbbbbbbbkbkbbbbbaaabbabbbbbbaaaaabbbbbbbbaabaababbaaaaaaaab`c``icci`aaaa`iljjjljjljljl", "jlljlljlllhllhlhlljhlllljlljlljllhjljhjllhlllllhljljllhjllllhllhlhllhjllljhjlhjlhjjljlljlbkmmmmnmbkbkbj`knknnnnnnnknkknnkkkkkknkkkkkkkkkkkkknnknkkbnnnmnnnknkkkkknnnkknmmkkbkkkbkkkbknnnkkknkbkkkkkkkbkkknkknnbkmnkbbbabbadllllllhlllljhjhjljlljlllllllhjlllllc```bba`clliakkbabbbkbbbkkbkkbbbkbbbbbbbbbbbbbbbbbbbbbbbbbbabbbkkbbbbbbbabbbbbabbbbaaaabababaaabbababaaabaaaaaaaaababbaaiaa``i`a`add`cljhljlljljll", "lljhjhlhjllllllllhlljlljhjlljllllllhlllhjllhllljlllljljlljljlllllllllhlllhllljljlllllljljnknmnmmmnkkbal`kkknnnkkkkknkknmkkkkkkkkmnkkkkkkkknmnkknnkkbkkkkkkknknknknnnknnnnkkkkbkkkkkkkbkkkkkkknkbkkkkkknnnmnkknnknmnbbbkbbbbljljljjljljhjljlhlhllhjhlllllljljllli``kkaiclc`bbkkkbbbbkkkkbbbbkbbkkbbbbabbbkbbababbabbkkbabbbaabbabbabbbbbbbbkbabbbbbbaaabaabaaabbbaababaaababaabbbbbbabacbbaaa`i`abb`iljlllljhjljj", "llllljljlhllhlllhjllhjhllhlllllljhjljhjlllhjllhlhjhlhlhlhlhlhjhjlljhjljlljlllhlhllhllhllhkknmknmmnkkbbj`nnnnnnnnkkkknnkmnnmnkkkkkkkkkkkkkknnkkkkkkkkkkknkkkkkkkkknmnnnnnkkkkkkkkkkkkbkknkknnnkkknknknnnnknkknmnnnnnbbbbbdbdjlljhlhlhlhlllhlllllljljjhjllllllljhiiiba``ic`bnkbbkbbbkbkkbkbbbkbbbkkkkbbbbbababbbbabbbbbabbbbabbbbbbbbabaabbbkbbbkbbbaabaabaaabaaababbbbbbbabbbbbbbbbababiababba``add`iljhjllljhjhl", "llhllhjhjllljhjhjlhjllllllllhjhlhllhlllhjljhljljllljlljljljhlllhlhllhlhlhlhlljllljljlllllkbnmkknmmnkkalakknnkkkknknnkkkkmnnnnnnkkkbkkkknkknnkkkkkkkkkknkkkkkkkkknnmnnnnnkkbkbkbkbkbkkbkkkknnkkkkbkknnkkkknknknbkbkbbbabbbkbhllhllljljljhjjljlljhllhlllhlllhjhlli`i````a`abnnkbb`bkkkbbbbbkbbbbbbkkbbkbbbbabababbbbbkbbbaaabaaaabbaababbbbbkbbkbbaaaaaabaabaaabababbabaaaaabbbbaabaabbbibabnnk`iaaa``llljhjhllllj", "lllllhlllhllhlllhlllhlhlhjhjlllljlljlhjlllllllhlhlhlhlhlhlhlllllljlljljljlljlhjhjhjhllllckbbkkbknfmkbalannnnkkbknkkknkkknkbknnnkkkkkkknnnnnnnnkkkknnkkkkkkkkkkkkkknnnnnkbkkkkkkkkkkkkkknkkkkkbbkkkkkbkkbkkknnnbbbbbbabbbbbbllllllhlhlhljhlllllhjljljhjljhlllllhiiciiiaaabbnnmnk`kkkkbbbakbbbkbbbbbbbbkbbbbababbkbbkbbbbbbbbbbbabababbabaabbbbbbbaababaaaaabbababbabaaaaaaaaaaaaaabbbbbiabannnb``addahlllllljljll", "jhjhjllhlllhllhlllhllllllllhjhjlllllljhjhjhjhljlllllllhlllllhlhllhlhlhlhlllhljhlllllllllhbbbbbkbknkkb`jamnnnnkkkkkkknnnnnkkkkknkkkkkkkknnnnnnkkkknnnnkkkkkkkkkkkkkkkkkkkkkkkkkkkbkkkknnknnkbkkkkkbkbkkbkbkbnnnkkkkkbbbbkbbdljhjhjljljlllllhlllllhlhllhlhljhlllli`lli`aabbkmmnnmakkkkbbbbbbbbkkkkbbbbbkbbbbbbbbbbbbkbbbkabbkbbbbbababbbaabababaaaababaabaabaabbbbbbaabababaaaababaaabbaibbaknmka`abbbillllllllllj", "llljhjhjlllllllllhlllhlhlhllllhlhlhlhllhjllljlllljhjhljljllllllhllllhllllhlllhljlhllllllibdbbbbknkabkajbnnnnnnnkkbkknnnmkkkkkkknkkbkbkknnknmnnnnknnnnkkkkkkkkkkkkkkkkkkbkbkkbkbkbbkkkkknnkbkkkkbkkkkkkkkkkknnkbknkkkkbbbbkdlllllllhlhlhlhlljllllllllljljllllllliilc`abaabbknnnn`kkkkkkkkbabbbkkkbbbbbbbbbbababbbkbbkbkkbbbbbbbabababaabbabaaababaababaaaaaabababbbaaababaabbabaaaaaabb`abknkkka`abbbcljlljljllll", "lllhjllllljhjhllljhllllllllhllllllllllllhlhlhlhlhlllljhlhllllljllllljlhjhjllllhlhllhllllibdkbabknnbbkalknnnnmmnnnkkkkknnkbbkknnknkkkkkkkkknnnnnnknnnkkkkkkkkkkkkkkbkkkkkkkkkkkkkbkkbknnknkkkkkkbkkkkkkkbbkbbkkbkkkkkbkbbkkkllhjhllljljljlllhlllhllhlhlhlhlllllhiic`aabbbbbbnmmn`kkbkkkkbbbbbbbbbbbbbbbbbkbbabbbbbbkbbkbbbbkbkbbbbbbaabbabababababaaabababaaabbbbbabaaaaaaaaabaaabaaaab`annnkbka`abbdilllllhllllh", "lhlllhlhlhllllhjhlljljllllllllllhjhjhjhllllllllllllhlhllllhllhlhlhlhlhjllhjhlhllllllllll`ddbddaknmkkb`jnmnnknnkkkkkbkknnkknnkknnnkkkkkkknkknkbkknnnnnnnknnnkbkkkkkkkkkkkkkbkbkbkkkkknnnnnnkkbbbkkkkkkkkkkkbkbkbbkkbbbkkbkkbhllllhlllhlhlhllllllljljljlllljhjlll`ciakakbbkbbbknnakkkbkkkbbbkabbbkaabbbbkkbbbbbbbbbbbbbabbbkbbbkbabbbbababbabababbbbababaababbbbbbbbbbaaaababaaaabaaab`aibnmnkbnb`abbb`ljhlllllhll", "lllhllllhllhlhlllllhlhlhlhllllllllllllllllhlhllhjlljllllllllhllhlhlhlhhhlhhlhlhhhhhhhhhlodddddddknmkdglknknnnnkkkkkkkkkkkkkkknnmkkkknkkbnkkknkknmnnnnnnknkkkkknbkkkkkknnknkkkkkkkkbnnknnnknnnnkbkbkbbbkbkkkbbbbbbkkbbkkkbkkljhlljlhlllllljhjhlllhlhlhlhllhllhlh`i`ababkbbkmbknmakkkbbkbbbbbbbbbabbbbabbbkbbbbbbabbbbbbbbbbbkbbbbbbbbbaabbababbbbbbbabaabbaabbbabbbabbbbaaaaaaaaabaaaa``annnnkbb`bbad`llllhlljlll", "hlhllhlhllhlllhlhllllllllllllllhjhlllhjhlljhjhjhlhlhlhlhlhhhlhhhhhhhhhlhhllhhhhhhhhhhhhhhhhhhhhhghghhhhggghhghhhhhhgg`g`g`o`dddbddbbkkkkkkknnnkmnnmnnnkbnnnkbbbkbkbknkkbnknkkkknnkkkkkknnnnnmnkkkbkbkkkkbkkbkkbbbbkkkknnknklljhjhlljljhjllllljllljlllllhllhllllii`dbbbbbkbnnbkncbbbknkbabbkbbabbbbbbbbbbkbbbbabbbababbbbbbkkbkbbbbbbbabaababbbabababababbababbbbkbbbbbbaaaaaaabaaaabaa``mnmkkbb`bbdddllhllhlhlhl", "ljllllllhllhlhllhlhhlhhlhhhhhhhlhlhhhlhhlhhlhhhhhhhhhhhhhhhhgghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghghhghghhhhhhhhhhhhhhhhhhhhhhhchhhco`oddkknnmnnkknnnkknkkbbkkkkkkbkkkkkkkknmnnnnnnnnnkkbkbkbkbbkkbkkkkbbbkknkbknkkhlllhllhlhllhlhlhlhllhlhlllllllljhjlii`abbbbakbmnkkkibbbbkbbbbbkbbbabbbbbbakbkbbbkbabaabbabbkbbkbbkbbbbbbbbbbbaaaaabaaababaabbaabbbbbbbbbbbbabaaadaaaaaaabaa`knnkbdaadd`ddhlhlhlhlllh", "lhlhlhlhlhllhlhlhhlhhlhhhlhhlhhhhhhhhhhhhhhhhhhhhhhhgghhggggogoogggghhhhhhhhggggggghhhhhhhhhhhhhhhhhhlghhhhhhhhhgghghhhhlhhhhhghghhhhhhhhhhhhhhhhhhgho`oknknmnnmnkkkbkkkkkkkkkkkkknnnkknnnnnnnkbkbbbkbkbkkkbkkbbkkknnkkkkkblllhllllhlllhlllllllhllllhlhlhjhlllh`i`abbabbbknnnkn`bbbabbbbknkkkbkkbbbbbbbkbbbkkbdbbbbbbbbbbbbkbbkbbabbbbbbbbbaabaabbaabababbbbbbdabbbbbbddadddddddddddddd`kmkdd`higio`ghhhhhhhhhhh", "lhlllhllhlhlhlhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhgggghgggggggggggggghghhhhhhhhhhhhhhhhlljhlhhhhhhhhhhhhhhhhhhgggghhhhghggghghhhhhgghhhhhhhgghhhhghhhlhlhhhhhh`oddnnnnkkkkbkkkkkkkkkbkkknnnnnnnnkbkkkbbkkkbkbkbkbbbbbkkkkbkdblhlllllljhlljhlllllllllllljllllljhlli``aaabbanbnnknncaabbbbbbbbbbabbbbbkkbkbbbbbkkdbbdabbbbabbbbbbbkbabbbbbbbkkbbbbbababbbababaaabdbbkbkkbkdddd`oig`og`ghhhhhhhghhhhghhhhhhhhghhhgghh", "hhhhhhhhhhhhhhhhghgggggggggggggggggggghghghggggghghghggggogggggogggggghhhhhhggoggggghhghhghggggghhhhhhhhhghghhhhgggggghghhhhgggggggggggghhhhhgghhhhghhhhllhhhhhglhgiodddnknnnnnkkkkkknnnkknnkkbbbbbkkbbkbkkkkkkbbbbbbbbdbbdlljhjhjhlljhllllllllllllllhlhjlllljli`i`baabbbbnnkkblbkkkbbbbkbbbbbbbbbbkbbbbbbbkbdabbdddabbbbbbbabbbbbbbabbabbbkbabbbbabbbbbbbdddddkddd`oihhlhhhhghgggghhhhhhhhhghhhhhhhghghghghgggg", "hhhhhhhhhhhhhhghggggghghgghghghgggggggghgggggggggghhhhhhggggggggggggggggggggghhhghghhhhhhhhhhhhhgggghhhhghgggghghggggggggggggggggggghhhhhhghghhhhhhhgghhhhhhhhhhhhlhlhhhhhh`ddkkddbbkkkkkknkkkbkkkkbkkkbbbkbbkknnnnnkbbbkkkllhlllhllhlllhlhlhlhllhllhlllhlhlhlhiii`abbbbakkbba`ibbbbkbbkbbbababbkbbabbkkbbkbdbdbbabbbbbkkbkbbbkbbbbbbbbbabbkkbbbkbkbbdbbddd``o`ohhhhhhhhhhhhhhhlhhhhghggghhhhgghhhggggggggghgggg", "gggggggogggggggggggggggggggggggggggghgggggggggggghghgghhhggggghgggggghhhhhggghhghhhhhhhhhhhhhgggghgggggghhhhhghghhhhghhhghghhhhhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhlhhghhhhhhhhhhhhhhhcg`bknnnnnnnnnnnknnnbbbbbbabkknnnnbbbkmnklllllllllllhllljllljlllllljhjllljlll`i`abababkaa`ii````aababbkkkkkkknnkbbbbbbbkbbabbnbkmnnmknknkkbkkkbbbbbkkkkbbkkddkkddd`gcglhhhhhhhhhhhhhhhhghghhhghhhgggggghghhhhhghhhgggghhhhhhhh", "ggoggogogogoggggoggogoggggggghggggggghhgggggggggggggghghgggggggggggghghhhhhhhghhgghghhhhghgggggggggggghghgggghghhhhhhhhhhhhhhhghghhhhhghhhhhhhhlhhhhhhhhhhhhhhhhlhhhhhhlhhhhhhhlhlhhh`ddknnnknnnkknbnnnkabbbbbknnmnnnnnknnnhlllhjhjhjljlllhlllhllllllllllllhljhi`idkkbbabaiciiiccciabbabbknbbkkkkkbabbbbbbbbaabnnkkkmkknnnnkbbknkbdkkkknkkddo`ooggghhhghhhhhggggghghgghhhhhhhgghgggggggggghgggghggogghggghhhhggg", "ggogoggoggggggoggggggggggggghggghgggggggggggggggghhgghgggggggggghhhhhhhhhhhhhhhhhhhlhhhhhhhhhhhhhhhhhhhhhghhghghhhhhhhhghghhhghgggghhhhhhhhhhhhhhhhhhgghhhhhhhhhhhhhhhhhhhhhhhhhhhhlhhhhhgddknnkkknknnkbbkkbbbkmnnnnnnnnnnncjhjlllllhlhlllljllljhjllllllllljllli`ibkkbbba`i`aaiccc`aka``abbkbkkkknnbkbaaabkbabbnnkbkknnnknnnkdddmkddo`gghhhhhhhchghhghhhghggggghgghhhhggghhhhhhhhhhggggghgggogogggghhhhhhhghgggg", "hghghghghghhhhhhhghhhggghhghgggggogggggggggogggghghhgghgggggggggggghhhhhhhhhhghhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhghhhhhhhhggghhhhhhhhhhhhhhhhghghhhhhghhhhhhhhhhghghghhhhhhhhhhhhhhlhhhhhgddbkmmmnkakkkbbbkbbbbbbnnmmnnhlllhjhljlljhjhlhlllhllhjhlllllhlhjhi`idbnkkkb```aa`ii``i```i`abbbbknbnkkbaaabbbbbabkmnkbbnnnmnkddo`oghhhhhgghhghhhhgghggghghgggggggggggghghgggghhhhhgogogggggghggggggghgghhghhhhhhhg", "hhhghhhhhhhhhhhhhhhhghhghgggggggggggoggogoggggggghgghhgghggggggggghhhhhhhhhhghhghhhhhhhhhhhhhhghhhhghggghhhhhhhhhhgggggghhhhhgghghghhghhhhhhhhhhgghhhghhhhhhhhhhggggggggggghhhhhhhhhlhhhhlhhhhhhhhgdddbbbbbabkkkkbbaabkknmnllhllhllhlhllhllllhllllllllhlhllllhli`iabkknkbaaaa`aa```aa`icl`akkkkkkkkka`abaabbbbbbkndddndkd`oghhhhhhhhhhhhhghghhhghggggggghgggggoggggooggghhgogggghghhhgggggggggghhghghgghgghghggh", "ggghghhhhhhhlhhhhgggggghgggghghghggggggoggggggggggghhghhhgggggghhhhhhhhhhghhhhghghhhhhhlllhhhhhhhhhhhhhhhhhhhhhhgghggggggghgggggggggggggggghgggghhhhggghghghhhhhgghghhhhhgghghhhhlhhhhhlhhhhlhhhlhlhhhhi`dkdddbbknkkkkkknnmlllhlllhlllhllhlhllhlhlhlhllllhlhlll````bbbbbabbaaabka`akkbicliannkkkbkkba`abbbdkkkbdkkdo`ghhhhhhhhhggghghhggggghggggghhgghghhggggoggghhhhghhhhhhhghgghhhhggohghhhhhgggogogggggggghgh", "hghghghhhhhhhhhhhhgggggggghghghggggghggggggggggggggggggghhhhghghhhhhhhhgghggggggggghhhhhhhhhhhhhhhhhhhhhhhhhhhhhghggggggghghhhghggghghghhhhhhhhhhhhhhhhhhghhhhhhlhhhgggghhhhhhhhhhhhhhhhhhhhhhhlhhlhllhhhhh`dkkdkbbbbbbbkknlhlchlhllhllhlllllhlllllhllhlhlllhlhi`i`bbbbbbbbbabbbbaakkaiiliaknkkbkbbaddbddddddddohhhhhhhhhhhhhhhhggggggggggghhhhhggghghhhhgggoggggggggggghgggggggghghhhhhhhhhghggggggggggggghhhhh", "gggggghghhhhhhhhggggggghhhghhhghhhgggggggggggggggogggggghgghgggggggggghhhhhhggggggggghhhhhhhhhhhgggghggghhhhhhhghgggggghhhhhhghghhhhhhhhhhhhhhhghhhghhhhhhhhhhhhhhhlhhhhgghgghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgdnmnnnkbbbkblllllhlchlchlchlhllhlhchlchllchcllcliiiabakbbkbaaaaabaaakaaicciabknbbkbaddbddo`gggghhhhhhhhggggggghhgggggoggggggggogggggghghhhhghgggghhhhghhhhhggggggggggggggggggggggogoogggggggggggg", "ghhhhhhhhhhhhghggggggghhhhhhhhhhgggggggggggggoggggggggghggggghghhhhhhhhhhhggghggghgghghghhhhhhhhhhhhhhhhhhhhhghggggggggghghghhghggghhhhllllhhhhgghgggghgghghhhhhhlhhhhhhhgghhhhhhhhhhhhhhhhhhhhhhhhhlhhhhlhlhhlhh`dknmkkbbdlllhlchllhllchllchlchllclllchlllhchlgciabbkbbbbabbbabbabbaailcc`abkkbd`iiihhhhhhhhgghghghgggggggggghhghggggoggogggggggghhhhghgggggggggggghggggghhgggggghggggghggggogogogggggggggghhhh", "hhhhhhggggggghghhhhhhhhhhhhhhhhhhhhhhhhhhggggggohggggggggghhhhhhhhhhhhggggggggghghghghhhhhhhhhhhlhlhlhhhhhhgggggggggghghghhghhhhhhhhhhhlhhhhhhhggghhhhhhhhhhghghhhhhhhgggghhhhhhhhhhhhhhhhhhhhlllhhhhhhhhhhhlhhhllhlgakmkdglhlllllclcclllchllchlchlhchllhcllllccciabbabbbbbbababbaaaiiiiii`ddd`dgghhghhggghhhghhgggggggggggggggggggggogggggghhhhhhgggggggghhhhhhgghgggggggggggoggggghghggggggggggggggggghhghgggg", "hhgggggggggghhhhhhhhhhlhhhhhhhhhhlhhhhhhgghghhhhhhhhhgggghghhhhhhhhhhhgggggggghgggggggggggggghhhhhhhhhhhhgggggggggggggggghhhhhhhhhghhhhhhlhhhhhhgghhhhjljllhhgggghghhhhghghgghhhhhhlhhhhhhhhhhhhlhlhhhhhhhhhhhhhhhhhhhhg`gchllhlhlljjjjljjljljllllllllllllhllhllhidbbaabaabbkkbbbbaa````igioihhhhghghhhghhgggggggggghhhhgggggggghhhgghgggggghghhgghhhhggggggogggggggggggghggggggoggggggoggghhhhhhhhhhhhhgggggggg", "ggggggogggghghhhhhhhhhhhhhhhhhhhhhhhhggghghhhghhhhhhghghgghghhhhhhhhhgggggggggghgggggggggggghghhhhhhhhhgggggggggggghgggghhhghhhhhghghhhhhhhhhhhhhgghhlhjhjhhhhgghhhhhhhhhhghghghhhhhhhhhhhhhlllhhhhhhhhhhhhhhhhhhhhhhjhlhlhlhlhjjjjjjjjjjjjjjjjjjjjjjjjjjljllllhiiidbababbabbbknnkkdido`hhhhhhhhhhghgghghggghhgghgggggggggoggggoggggogggggoggggghgggggghggggggghgggggghhghggggogogghhggggggggggghhhggggggghggggg", "ogogoggggggggggghghggggghhhghggghghghggggghghhhghghghhgggggggggghhhhghgggggggggggggggggggghgggggggghggggggggggggggghghhhhghhhhhhggghhhhhhhhhhhhhhgghhhhhhlhjhhhhhhhhghhhhhhhhghhhhhhhhhhhhhhhhhlhhhhhhhhhhhhlhhhhhhhjhhhlhlhlhllljjjjjjjjjjjjjjjjjjjjjjjjjjjjjjc`iibbbbbaaakbdkkkddighhhhhhhhhghgggggggghgghhhhghgggggggggggggggggogggggoggggggggghggggggggggggggogogghghhgggggggghhhhhhhhgghghhghghghhhgggggogo", "ggogogogggggghhhhhhhhhhhhhghgghhghhhghhhgggggghhghgggghggggghhhhhhhghhhhgggggggggggggggghhghgggggghghghhghhhhgggggghghhghhhhhhggghghhhhhhhhhhhhhgghghhljhjhhhhhhhhghghgghhhhhhhghhhhhhhhlhhhhhhhhhhhhhghhhhhhhhhhhhhhhllhhhhlhlllljjjjjjjjjjjjjjjjjjjjjjjjjjjjlli``bababbddddddogggghhhhhghghgghgggggggghggghggggggggggoggoggggggggggggggggghgggggggggggggggggogggggghghghgggggogghhhhhhggggggggggggogogggoggogo", "oogogogogogghgghhhhhhhhhhhhhhhhhhhhhhhgggggggggghghhhghghghhhhhhhhghgghghhhghhhhhhhhhhhhhghggggghgghghgghgghghhhgghghhghghhhhhhghhhhhhhhhhhhhhhhghghhhhhlhhhhhhhghhhhghhhhhhhhhhhhhhhhhhlhhlhhhhhhhhgghhhghhhhhhhhhhhhhhlhhhhhhhhlhlljjjjjjjjjjjjjjjjjjjjjjjjjjjiiibabbdbd`oghhhhghhghhohhhgggggghghgggghgggggggggggggogggggggogoggggggggogghhggggogoogggggogggggogggggggggggggggggghhgggggggggggggggggggogoogoo", "ggogoggggggggghhhhhhhhhhhhhhhhhhhhgggggghhghhhhhhhhhhhhhhhhhhhhhgghggggggghhghhhhhhghggggggghggghghghghgghhhhhghhhghhghghggggggghhhhhhhhhghgggggghhhhhhhhhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhghhhlhhhhhlhhhhhlhlhlhhhlhjljjjjjjjjjjjjjjjjjjjjjjjjl```kbbd`ggihhhhgggghhghhghhghhhhggggggghgggggghhghggggggoogggggggggggggggoggggggggghhggogggggoggghhhhhhhgggggghgghghgggggggogogggggggggggggggogg", "ggggggogggggghhhhhhhhlllhlhhhhhhgghhhhhhghhhhhhhhhhhhhhhhhhhhhhhhghghghghhhhhhhhhhhhhghggghghghghhhhhhghhhhhhhhhhhhhhhhgghhggghhghghhhhgghgggggggghhhhhhhhhhhghghhhhhhhhhhhhhhhhllhhhhhhhhhhhhhhhhhhhhgghhhhhhhhhhhhhhhlhhhhlhhhhhhhlhlhjjjjjjjjjjjjjjjjjjjjjjlhi``ddihhhhhhhghhhghhhghhghhhhhhggggggggggggghhghgghgggggggogghhhghhgooogggogggggggggggggogoggggggogggggoggghghhhghhggogggghhhhghgggggggggggogggg", "gggggggghhhhhhhhhlhhhhhhhhhhhhghghhghghhhghghhhhhhhhhhhhhhhhhhgghgggghghhghhhhhghgggggggghgggggggggggghhhhhhhhhhhhhhhghhhggggggggggghghghghggggghhhhhhlhhhhhhhghhhhhhhhhhhhghghhhhhhhhhhhhghhhhghhhhhhhhhhhhhhhhllhhhhhhhhhhlhhhhhhhlhlhlhjjjjjjjjjjjjjjjjjjhlhcgggghghhhhhgghghgghgghgggggghhhhgggggghggggghhhgghhgggggogoggggghggghhgoogogoogggooogogogoggogogogogoggghhgggghhhhhghhgoghghhghhhhhhhgggoogggggh", "ghghhhhhhhhhlhhhhhhhhhhhghhhhghhghghhghghhghggghhhhhhhhhhhhhghhhgghghghggghghghghghhghhghggghghgggggggghhhhhlhlhhhhhhhghhhhghggggggghghghgghgggggghhhhhhhhhghhhhhhhhhghhgghgggghhhhhhhhhghhhhhghhhhhhhhhhhhhhhhhhhllhhhhhhhhhhhhhhhhhhhlhlllljjjjjjjjjjjjljlhllhhghhghghhghgggghgghggggghhhhhhhhhghggggghgggggggghhggggogggogogggggggggggggggoggogggggggggggogoggghggggggghggggogggggggggoggggggoggggggggggggggg", "hhhhhhhlhhhhhhhhhhhhhhhhhhghghghghghggggggggggggghhhhhhhhghghggggghghhghhhhhhhhghggghgghghhggggggggggggghhhhhhhhhhhhhhhhghgggghghgghghhghghgghggghhhhhhhhgggghghghghgghghghghhhhhhhhhlhhhhhghhghhhhhhhhhhhhhhlhhhhhhhhhhhhhhhhhlhhhhhlhhhlhhhhjljjjjjjllhhhhhhhhhhhggggogghhghhhggggggggggggghhhhhgghggghgggggggghhhhgggggggogoggggggggggggogogoggggggggggggggggggggggogggggggggogggggggoggggggghggghggggggggggg", "hhhhhhhhhhhhhhhhhhhhhhhhhghhggggggggggggggggoggggggghghhghghghgghgghghhhhhhhhhhhghghgggggghghhhghggggghghhhhhhhhhhhhhhghhghhhghghgggghhghghghhhhhhghhhhghghgggggghggghghhhhhhhhhhhhhhhhhhhgggghhhhhhhhllhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhlhhlhlhhhlljjhjhlhlhhhhhhggggggggggggggggggggooggggggggggggggghghggggoggghgghhggggggggogogggooogggggoggogogogoggghghghhggggggggggooghhhhhgogggooggggogggghhhggggggghghghg", "hhhhhhhghhhhhhhhhhhhhhhhghggggggggghhhghgggggggggghhghhhgghghghghghghhhhhhhhhgggggggghhghghghgghgggggggggggghhhhhhhhhhhhhhhhhhhggggghhhhhhhhghhhhhhhhhhgghghhhhghgghgghghghghhhhhhlhlhlhhhhhhhghhhhhhhhhhhhhhhhlhhhhhhghghhhhhhhhhhhhhlhhlhlhhlhhlhlhlhhhhhghhggggogggogggggghggggggghhggggggghgggggggggghggogggghghhggogggoggggoogggggggoggggggoggggggggggggggggggggggogggghhhghgggggggogoggggggggggggoggghhhhh", "hhhhhhhhhhhhhhhhhhhhhhhggggggggggghghhhghhgggggggggghhghhhhghghggghhhhhhhhhhhghgggggggggghghghgggggogggggghhhghggghgghghhhhhhhhghgghghhhhhhhghghhhhhhghggghghhhhhhghghhghhghhhhhhhhlhjhlhhhhhhghhhhhhhhhhhhhhhhhhhhhhghhghghhhhhhhhhhhhlhlhhhhhhhhhlhhhgghggggggggghggghggghghhggoggghhhggggggggggghhgggghggggggghhhhgggogoggogoggggggggggghghgggggoggggogoogggggogggoggggghggggggoogogggggggghghghggogogogoggog", "hhhhhhhhhhhhhggggggggggggggggghghghhhhhhgggggogggghgghhhhhhggggghghhhhhhhhhhghgggggggggghghhghgggogogggghhhhhggghggghghghhhhgggggghhhhhhhhhghggghhhhhhhghgghhhhhhhhhhhhhhhhhghhhhhhhhhhhhhhhhgghhghhhhhhghhhhhhhhhhhhgghhhhghhhlhhhhhhhhhhhhhhhhllhhlhhhhggggggoghghggoggoggggggggggghhgggggghggghghgggggggggggghhhhhgoogoggoggggooggghggggggggghggogoggggggggggggoggggggghghhhhggggggoggghgggggggggooooogogoggg", "hghhhhhhhhhhggggggggggghhhhhhhhhhhhhhhhgghgggggggghghhhhhghghghhhhhhhhhhhhhggggggggggghhhhghhggggggggghghghgghhghghgggggghggghghgghhhhhhhhhhgggggghhhhhhhhhhgghghhhhhhhhhhhhhhhhlhhhhhhhhhhhhggghhhhhhhgghghhhhhhghghhhghghhhhhhhhhhhhhhhlhlhlhhhhlhhhhhgggggggggghgggggoggggggggggghhhggghggggggggggggggoogggghhhhgoggggggggggggogghhhggggogghhghggghggghgggggggggogooogghhhghhhhhggggghhgggogogogoogogoogogogg", "ghghhhhhgggggggghhhhhhhhhhhhhhhhhhhhhhgghgggghghghghghgggggghhhhhhhhhhhhhhggggggggghghghggggghghgghhhhhhhhhhggggggggggggggghgghggghghhhhhhhgghghhhhghhhhhhhhhhhhhhhghhhhhhhhhhllhlhhhhhhhhhhhhghghhgggghhhhhhhhhhhhghghhghhhghhhhhhhhhhlhhhlhlhhlhhhhhhlghhggoggggggogghggogggggggghhghghggghgghggoggogggggggoogggggggggogoggogogggogghhggogghhhhhggggghhggggoooooooogggoggggghhghhhgghggggggogoghgghgggggoggggg", "ghghggggggggggggghghhhhhhhhhlhhhhhhhhhhhgghggghggggggggghghhghghhhhhhhghhggggggggggggggggggggggghhghghhhhhhghgghghggggogggggggggggghhhhhhggggghghhhhghhhhhhhhhhhggghhhhhlhlhlhhlhhhhhhhhhhhhhghghghhhghhgghhhhlhlhhhghghhhghhhhhhhhhhhhhhhhlhhhhhhhlhhhhhlhhhggoggggggooggggoggggggghhhhggggghgggggggggggggogogghgggggghhggggggghhgggggogoggggggggggggggggggggogogoggooggggggggggggggogoggggoggggggggghggggogggg", "hgggggghghggghghgghghhhhhhhhhhlhhhhhhhhghghhhghgggggghhhghghghhhhhhghghgghghhgggoogogogggghghhgghgghghghghghgghgggggggggggghggggggggghhggggghghhhhghghggghghhhhhhhghhhhhhlhlhlhhhhhhghhhlhhhhhgghhhhhhgghhhhhhhhhhhhhhhghghhhhhhhhhhhghhhhhhhhhhlhhhhhhhlhhhhhhhgggggghhggooggggggoggggggggghghhgooggggogogggggggggghhhhhhgggoghhhggogooggggggggggggogghhggogogoggoggggogggggggggggogogggooogoggoggggggggoggoggg", "ghghghhghhhhhghgggggghhhhhhhlhhhlhhhhhghghghhghggggggghhgggghgggggghhhhhhhhggggggggoggggghghhhhghgggggggggggggggggggggoggghghghgggggggghggggggggghhhhghghgghhhhhhhghhlhhlhhlhlhhhhhghhhlhllhhhhhhhhhhhhhhhhhhhhhhhhhhhgggghhhhhhhhlhhhhhhhlhlhhhlhhhhhhhhlhhhhhhhhggggggogoggggggggggggggghggghgggoogogoggoogogggggghhhhhhgggggggggggogggggggooggogoggghgggoogoogoggogogoggghgggggggggggghggggggggggggggoggogogg", "hhhhhhhhhghghggggggghhhhhhhhhhhhhhhhhhgggggggggggggghgggghgggghghghhhhhhhhgggggggoggggghhhhhhhhhghgghghhggggggggggggggggggggggggggghghghgghghgghhhhghghgghhhhhhhhggghhlhlhlhlhlhhhghhhhhlhlhhhhhhhhhhhhhhhhhhhhhhhhhhgggghhhhhhhlhhlhlhhlhhlhhhhhhhllhhhhlhhhhhhhhggggghggghggghgghhgggghhggggghggggoggggoggggggggogggghhhgghggggghgggggghgggggggggggggggooggogggggogogoggggghggggoooogoggggggggggggggggggoggggg", "hhhhhhhhghggggggggghghhhhhhhhhhhhhhhhggggggggggggggggggggggghghghhhhhhhggggggggoggggghhhhhhhhhhhhghgghggggggghghggggogggogggggghgghggghghghgggggggghghhhhhhhlllhhhghhhhhlhhlhlhhhhhghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghhhhhgghhjljhlhhlhlhhlhhhhhhlhhhhlhjhhlhhjhhhhhggghhhoghhgggggghhggggogggghhggggggggoggggggggggggggoggghgggggghhggogggghgggggogggggoggggghghghhhgggggggggggggoggggggggggggogggoggggggogogggg", "hhhhggggggggggggggghhhhhhhhhhhhhhhhggggggggggggghhhghghghghgghgghhhghgggghgggggggggghhhhhhhhhhhhghghggghgghhhhhghgggggggggggghggghgghgghhhgghgghghhgghghhhlllhlhhhhhhhhhhhhhhhhhhhgghhhhhhhhhhhhlllhlhhhhhhhhhghhhhhhhhhhhhhhhlhjhlhhlhhhhhhhhhlhlhhhhllhhlhjhllhhlhlhggggogooggggggggogggggoggggggooggogggggggggggggggggggghggggggggogoggggggooogogggggggggghghhhhhhhhhhhhggggggggoggghhhhhggggogggghggggoooogg", "gggggghggggggggggghgghhhhhhhhhhghgghghggggggggghggggghghggghggghghggghghhhghgggghghhghhhhhhhhhhghhhghggggggghhghghgggggogoggggghgghghghhghghgghghhhghghhhhlhhlhlhhhhhhhhhhhhhhhhhhhghhhhhhhgghhhhlhjhlhlhhhhhhhhhhhhhhhhhhhhhhhhlljlhhhlhhhhhhhhhhlhjhhhjhlhhhgjhhhhhhhhoggoogggoogghggghgggggggggoggggogoggoogggggghgghggghggggggogogogoooggghggoggggggggghhhhhhhhhhhhhhhhggghgggogoggghhhhhggogoghhhhhhgggggog" }; slashem-0.0.7E7F3/sys/amiga/amistack.c0000664000076400007640000000077310545462317015517 0ustar aliali/* 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. */ /* * Increase stack size to allow deep recursions. * * Note: This is SAS/C specific, using other compiler probably * requires another method for increasing stack. * */ #ifdef __SASC_60 #include /* * At the moment 90*1024 would suffice, but just to be on the safe side ... */ long __stack = 128*1024; #endif slashem-0.0.7E7F3/sys/amiga/colorwin.c0000664000076400007640000002030210545462317015545 0ustar alialiSHORT Col_BorderVectors1[] = { 0,0, 59,0, 59,12, 0,12, 0,0 }; struct Border Col_Border1 = { -1,-1, /* XY origin relative to container TopLeft */ 3,0,JAM1, /* front pen, back pen and drawmode */ 5, /* number of XY vectors */ Col_BorderVectors1, /* pointer to XY vectors */ NULL /* next border in list */ }; struct IntuiText Col_IText1 = { 7,0,JAM1, /* front and back text pens, drawmode and fill byte */ 13,1, /* XY origin relative to container TopLeft */ NULL, /* font pointer or NULL for default */ "Save", /* pointer to text */ NULL /* next IntuiText structure */ }; struct Gadget Col_Save = { NULL, /* next gadget */ 9,77, /* origin XY of hit box relative to window TopLeft */ 58,11, /* hit box width and height */ NULL, /* gadget flags */ RELVERIFY, /* activation flags */ BOOLGADGET, /* gadget type flags */ (APTR)&Col_Border1, /* gadget border or image to be rendered */ NULL, /* alternate imagery for selection */ &Col_IText1, /* first IntuiText structure */ NULL, /* gadget mutual-exclude long word */ NULL, /* SpecialInfo structure */ GADCOLSAVE, /* user-definable data */ NULL /* pointer to user-definable data */ }; SHORT Col_BorderVectors2[] = { 0,0, 59,0, 59,12, 0,12, 0,0 }; struct Border Col_Border2 = { -1,-1, /* XY origin relative to container TopLeft */ 3,0,JAM1, /* front pen, back pen and drawmode */ 5, /* number of XY vectors */ Col_BorderVectors2, /* pointer to XY vectors */ NULL /* next border in list */ }; struct IntuiText Col_IText2 = { 7,0,JAM1, /* front and back text pens, drawmode and fill byte */ 17,1, /* XY origin relative to container TopLeft */ NULL, /* font pointer or NULL for default */ "Use", /* pointer to text */ NULL /* next IntuiText structure */ }; struct Gadget Col_Okay = { &Col_Save, /* next gadget */ 128,77, /* origin XY of hit box relative to window TopLeft */ 58,11, /* hit box width and height */ NULL, /* gadget flags */ RELVERIFY, /* activation flags */ BOOLGADGET, /* gadget type flags */ (APTR)&Col_Border2, /* gadget border or image to be rendered */ NULL, /* alternate imagery for selection */ &Col_IText2, /* first IntuiText structure */ NULL, /* gadget mutual-exclude long word */ NULL, /* SpecialInfo structure */ GADCOLOKAY, /* user-definable data */ NULL /* pointer to user-definable data */ }; SHORT Col_BorderVectors3[] = { 0,0, 59,0, 59,12, 0,12, 0,0 }; struct Border Col_Border3 = { -1,-1, /* XY origin relative to container TopLeft */ 3,0,JAM1, /* front pen, back pen and drawmode */ 5, /* number of XY vectors */ Col_BorderVectors3, /* pointer to XY vectors */ NULL /* next border in list */ }; struct IntuiText Col_IText3 = { 7,0,JAM1, /* front and back text pens, drawmode and fill byte */ 6,1, /* XY origin relative to container TopLeft */ NULL, /* font pointer or NULL for default */ "Cancel", /* pointer to text */ NULL /* next IntuiText structure */ }; struct Gadget Col_Cancel = { &Col_Okay, /* next gadget */ 244,77, /* origin XY of hit box relative to window TopLeft */ 58,11, /* hit box width and height */ NULL, /* gadget flags */ RELVERIFY, /* activation flags */ BOOLGADGET, /* gadget type flags */ (APTR)&Col_Border3, /* gadget border or image to be rendered */ NULL, /* alternate imagery for selection */ &Col_IText3, /* first IntuiText structure */ NULL, /* gadget mutual-exclude long word */ NULL, /* SpecialInfo structure */ GADCOLCANCEL, /* user-definable data */ NULL /* pointer to user-definable data */ }; struct PropInfo Col_Col_RedPenSInfo = { AUTOKNOB+FREEHORIZ, /* PropInfo flags */ 0,0, /* horizontal and vertical pot values */ -1,-1, /* horizontal and vertical body values */ }; struct Image Col_Image1 = { 0,0, /* XY origin relative to container TopLeft */ 263,7, /* Image width and height in pixels */ 0, /* number of bitplanes in Image */ NULL, /* pointer to ImageData */ 0x0000,0x0000, /* PlanePick and PlaneOnOff */ NULL /* next Image structure */ }; struct Gadget Col_RedPen = { &Col_Cancel, /* next gadget */ 32,12, /* origin XY of hit box relative to window TopLeft */ 271,11, /* hit box width and height */ NULL, /* gadget flags */ RELVERIFY+GADGIMMEDIATE+FOLLOWMOUSE, /* activation flags */ PROPGADGET, /* gadget type flags */ (APTR)&Col_Image1, /* gadget border or image to be rendered */ NULL, /* alternate imagery for selection */ NULL, /* first IntuiText structure */ NULL, /* gadget mutual-exclude long word */ (APTR)&Col_Col_RedPenSInfo, /* SpecialInfo structure */ GADREDPEN, /* user-definable data */ NULL /* pointer to user-definable data */ }; struct PropInfo Col_Col_GreenPenSInfo = { AUTOKNOB+FREEHORIZ, /* PropInfo flags */ 0,0, /* horizontal and vertical pot values */ -1,-1, /* horizontal and vertical body values */ }; struct Image Col_Image2 = { 0,0, /* XY origin relative to container TopLeft */ 263,7, /* Image width and height in pixels */ 0, /* number of bitplanes in Image */ NULL, /* pointer to ImageData */ 0x0000,0x0000, /* PlanePick and PlaneOnOff */ NULL /* next Image structure */ }; struct Gadget Col_GreenPen = { &Col_RedPen, /* next gadget */ 32,24, /* origin XY of hit box relative to window TopLeft */ 271,11, /* hit box width and height */ NULL, /* gadget flags */ RELVERIFY+GADGIMMEDIATE+FOLLOWMOUSE, /* activation flags */ PROPGADGET, /* gadget type flags */ (APTR)&Col_Image2, /* gadget border or image to be rendered */ NULL, /* alternate imagery for selection */ NULL, /* first IntuiText structure */ NULL, /* gadget mutual-exclude long word */ (APTR)&Col_Col_GreenPenSInfo, /* SpecialInfo structure */ GADGREENPEN, /* user-definable data */ NULL /* pointer to user-definable data */ }; struct PropInfo Col_Col_BluePenSInfo = { AUTOKNOB+FREEHORIZ, /* PropInfo flags */ 0,0, /* horizontal and vertical pot values */ -1,-1, /* horizontal and vertical body values */ }; struct Image Col_Image3 = { 0,0, /* XY origin relative to container TopLeft */ 263,7, /* Image width and height in pixels */ 0, /* number of bitplanes in Image */ NULL, /* pointer to ImageData */ 0x0000,0x0000, /* PlanePick and PlaneOnOff */ NULL /* next Image structure */ }; struct Gadget Col_BluePen = { &Col_GreenPen, /* next gadget */ 32,36, /* origin XY of hit box relative to window TopLeft */ 271,11, /* hit box width and height */ NULL, /* gadget flags */ RELVERIFY+GADGIMMEDIATE+FOLLOWMOUSE, /* activation flags */ PROPGADGET, /* gadget type flags */ (APTR)&Col_Image3, /* gadget border or image to be rendered */ NULL, /* alternate imagery for selection */ NULL, /* first IntuiText structure */ NULL, /* gadget mutual-exclude long word */ (APTR)&Col_Col_BluePenSInfo, /* SpecialInfo structure */ GADBLUEPEN, /* user-definable data */ NULL /* pointer to user-definable data */ }; #define Col_GadgetList1 Col_BluePen struct IntuiText Col_IText6 = { 3,0,JAM1, /* front and back text pens, drawmode and fill byte */ 17,38, /* XY origin relative to container TopLeft */ NULL, /* font pointer or NULL for default */ "B", /* pointer to text */ NULL /* next IntuiText structure */ }; struct IntuiText Col_IText5 = { 4,0,JAM1, /* front and back text pens, drawmode and fill byte */ 16,26, /* XY origin relative to container TopLeft */ NULL, /* font pointer or NULL for default */ "G", /* pointer to text */ &Col_IText6 /* next IntuiText structure */ }; struct IntuiText Col_IText4 = { 7,0,JAM1, /* front and back text pens, drawmode and fill byte */ 16,14, /* XY origin relative to container TopLeft */ NULL, /* font pointer or NULL for default */ "R", /* pointer to text */ &Col_IText5 /* next IntuiText structure */ }; #define Col_IntuiTextList1 Col_IText4 struct NewWindow Col_NewWindowStructure1 = { 175,45, /* window XY origin relative to TopLeft of screen */ 312,93, /* window width and height */ 0,1, /* detail and block pens */ MOUSEBUTTONS+MOUSEMOVE+GADGETDOWN+GADGETUP+CLOSEWINDOW+VANILLAKEY+INTUITICKS, /* IDCMP flags */ WINDOWDRAG+WINDOWDEPTH+WINDOWCLOSE+ACTIVATE+NOCAREREFRESH, /* other window flags */ &Col_BluePen, /* first gadget in gadget list */ NULL, /* custom CHECKMARK imagery */ "Edit Screen Colors", /* window title */ NULL, /* custom screen pointer */ NULL, /* custom bitmap */ 5,5, /* minimum width and height */ -1,-1, /* maximum width and height */ CUSTOMSCREEN /* destination screen type */ }; /* end of PowerWindows source generation */ slashem-0.0.7E7F3/sys/amiga/Makefile.ami0000664000076400007640000013627210545462317015770 0ustar aliali# 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. ### ### INTRODUCTION ### # This makefile is arranged for compiling for the Amiga with SAS/C 6.51 but # can be configured for compiling with Manx C 5 or commercial DICE with # simple changes. The appropriate changes are identified by #[compiler] # where compiler is one of: SAS6, MANX, or DICE; the options in this # makefile as should be set according to the compiler being used. (But see # note 3 below.) # Note: When using the Manx compiler, an alternate make utility is # required. The bundled Aztec make is just too damaged. # Note 2: The #SFD_xxx lines are used with mkdmake to generate a DMake- # compatible makefile (DMakefile) from this file. Any line beginning with # #SFD_INSTEAD replaces, in DMakefile, the following line from Makefile.ami. # #SFD_BEGIN, #SFD_ELSE, and #SFD_END bracket multi-line sections for the two # makefile formats. # When changing this file, #SFD_INSTEAD lines will need to be inserted for # the following cases: # - Dependencies with different numbers of filenames (both > 1) on # either side. The #SFD_INSTEAD line should immediately precede # the line with the colon, and should contain a double colon "::" # instead of a single colon. # - Special command lists that override the default. A line containing # "#SFD_INSTEAD #none" should precede such a rule. If the rule is # more than one line long, precede it with "#SFD_BEGIN" and # "#SFD_ELSE", and follow it with "#SFD_END". # - Files not in the src, sys/amiga, sys/share, or win/tty directories # that rely on the default ".c.o" rule. Following the dependency # should be "#SFD_INSTEAD " with the filename inserted # into the default rule where appropriate, then a line contianing # "#none". # In any SFD_BEGIN/ELSE/END block added, put a '##' before every line # between the BEGIN and ELSE. Any line that's really a comment needs three # '#'s, e.g. "### DICE comment". # Note 2A: Whenever an SFD line/block is added, the appropriate repeat count # in mkdmake must be changed. (The repeat count "0" meaning "repeat # until end of file" doesn't work as advertised.) # Note 3: mkdmake will automatically substitute DICE flags, etc. for SAS # where appropriate. Since the makefile is already set up for SAS, # the only people who end up having to make changes here are Manx # users (or people who want to change the defaults). ### ### DIRECTORY STRUCTURE ### NH = NH: SBIN = $(NH)sbin/ SLIB = $(NH)slib/ NETHACK = $(NH)NetHack/ HACKEXE = $(NH)HackExe/ AMI = $(NH)sys/amiga/ DAT = $(NH)dat/ DOC = $(NH)doc/ I = $(NH)include/ SHARE = $(NH)sys/share/ NHS = $(NH)src/ TTY = $(NH)win/tty/ WSHARE = $(NH)win/share/ UTIL = $(NH)util/ O = $(NH)obj/ OO = $(NH)objo/ # NB: O and OO MUST be different directories ### ### INVOCATION ### #[SAS6] #MAKE = smake #[MANX] #MAKE = make #[DICE] #MAKE = dmake # Startup makefile with: # #[SAS6] #[MANX] # $(MAKE) -f $(AMI)Makefile.ami # $(MAKE) -f $(AMI)Makefile.ami install # #[DICE] # $(MAKE) -f $(AMI)DMakefile # $(MAKE) -f $(AMI)DMakefile install # # # You may use following targets on $(MAKE) command lines: # all do it all (default) # link just create binary from object files # obj just create common object files # obja just create amiga object files # objs just create shared object files # clean deletes the object files # spotless deletes the object files, main binary, and more # # Note: We do not build the Guidebook here since it needs tbl # (See the file sys/unix/Makefile.doc for more information) #X# Precompiled header files: #X# $(HDEP) should appear in any dependency list for an object file where #X# we would want to make use of the precompiled version of $(I)hack.h, #X# while $(CSYM) should appear in the C compiler command line that creates #X# any such object file. (Changes made here should agree with the $(HDEP): #X# target that appears later in this makefile.) #X# #SFD_BEGIN ## ###[DICE] ### If we were compiling with DICE and wanted to use the symbol table ### pre-loading feature, we would uncomment these following two lines. ## ##HDEP = $(I)hack.sym ##CSYM = -H$(I)hack.sym=hack.h ## #SFD_ELSE #[SAS5] # If we were to use the precompiled header file feature in a newer version # of SAS/C, we would comment out these following two lines. # If we don't use precompiled header files, we uncomment it as well. HDEP = $(I)hack.h $(I)pm.h $(I)onames.h CSYM = #[MANX] # If we were compiling with Aztec, and wanted to use the symbol table # pre-loading feature, we would uncomment these following two lines. #HDEP = Ram:hack.sym #CSYM = +IRam:hack.sym #SFD_END #Pathname for uudecode program: UUDEC = uudecode # Flex/Bison command assignments -- Useful only if you have flex/bison FLEX = flex BISON = bison # FBFIL and FBLIB may be used, if required by your version of flex or bison, # to specify additional files or libraries to be linked with FBFIL = FBLIB = #lib lib:compat.lib # If you're compiling this on a 1.3 system, you'll have to uncomment the # following (for use with the ifchange script below). Also useful instead of # "protect ifchange +s" EXECUTE = execute # Headers we depend on AMDEP = $(AMI)winproto.h $(AMI)winext.h $(AMI)windefs.h $(I)winami.h # Pathname for the C compiler being used. #SFD_BEGIN ## ###[DICE] ##CC = dcc ##ASM = das ## #SFD_ELSE #[SAS6] CC = sc ASM = asm #[MANX] #CC = cc #SFD_END # Compilation flags for selected C Compiler: # $(CFLAGS) should appear before filename arguments of $(CC) command line. #SFD_BEGIN ## ###[DICE] ##CFLAGS = -c -I$(I) -mC -mD -ms -// ##CFLAGS2 = ##WBCFLAGS = -c -I$(I) -mC -mD -ms -// ##WBC2FLAGS = -DCLI ##SPLFLAGS = -DSPLIT ## #SFD_ELSE #[SAS6] # Note: make sure your CLI stack size is large (at least 50K) or lev_comp # and makedefs may fail terribly - stack checking is disabled. # # **** WARNING **** GST support is not fool proof. You must make makedefs # without a GST first so that the generated headers # that are part of the GST can be made. # #GSTSRC=$(AMI)gst.c # #GSTHEAD=$(I)hack.h $(I)pm.h $(I)trap.h $(I)onames.h \ # $(AMI)winami.p $(AMI)amidos.p $(AMI)amiwind.p # #GSTFILE=$(O)NetHack.gst # undefine this to not compile with GSTs #GST=gst=$(GSTFILE) # DEBUG=debug=symbol CPU=cpu=68000 #OPTFLAGS=opt opttime optpeep optgo optinl optsched optcomp=10 optdep=5 optrdep=5 #optalias +OPTTIME -OPTSIZE CFLAGS = data=far nominc $(DEBUG) idir=$(I) $(CPU) nostkchk nover \ codename=nhcode dataname=nhdata strmerge $(OPTFLAGS) $(TILES) $(SAVEDS) \ afp $(ERRREXX) $(GST) # for files that are too large for the standard flags: CFLAGS2 = code=far strmerge $(SAVEDS) WBCFLAGS = ignore=217,62 data=far ansi nminc code=far idir=$(I) $(CPU) afp \ $(DEBUG) $(ERRREXX) define=AMIGA $(GST) XXX = data=far ansi nminc idir=$(I) $(CPU) afp opt optinline optinlocal \ optloop opttime WBC2FLAGS = define=CLI SPLFLAGS = define=SPLIT #dollarok #for amistack.c CFLAGS3 = data=near dataname=__MERGED nominc $(DEBUG) idir=$(I) $(CPU) nover nostkchk \ codename=nhcode strmerge $(OPTFLAGS) $(TILES) $(SAVEDS) \ afp $(ERRREXX) $(GST) #[MANX] #CFLAGS = -i$(I) -mc -md -ms -pa -ps -bs -wo -qq #WBCFLAGS = -mc -md -ms -pa -ps -bs -wo -qq -pp #SFD_END # Assembly flags: #SFD_BEGIN ## ###[DICE] ##AFLAGS = ##AOBJSPEC = -o ## #SFD_ELSE #[SAS6] AFLAGS = #what to put here? AOBJSPEC = -o #SFD_END # Components of various link command lines: # $(LINK) should be the pathname of the linker being used (with any options # that should appear at the beginning of the command line). The name of the # output file should appear immediately after $(LNSPEC). $(LIN) should # appear before the list of object files in each link command. $(LLINK) # should appear as the list of object files in the link command line that # creates the NetHack executable. $(LLIB) should appear at the end of each # link command line. # Note: amiga.lib added due to missing prototypes/pragmas. # Should be deleted when this is resolved. #SFD_BEGIN ## ###[DICE] ### If you have flex/bison libraries, use the second definition of FLLIB ### instead of the first. ## ##LINK = dcc -mD ##LIN = ##LLINK = @$(AMI)ami.lnk ##LLIB = ##FLLIB = ###FLLIB = -l$(FBLIB) ##OBJSPEC = -o ##PNSPEC = -o ##LNSPEC = -o ##CCLINK = dcc ##CLFLAGS = -I$(I) -mC -mD -ms -// ##INCLSPEC = -I ##DEFSPEC = -D ##IGNSPEC = -j ## #SFD_ELSE #[SAS6] LINK = slink noicons verbose maxhunk 262144 stripdebug LIN = from lib:catch.o LLINK = with $(AMI)ami.lnk LLIB = lib lib:scnb.lib BATCH #lib lib:amiga.lib BATCH #scnb.lib or sc.lib FLLIB = $(FBLIB) lib Lib:sc.lib BATCH OBJSPEC = objname= PNSPEC = noicons to #pname= LNSPEC = to CCLINK = sc link INCLSPEC = idir= DEFSPEC = define= IGNSPEC = ignore= COMPACT_HEADERS=$(GSTFILE) #[MANX] #LINK = ln -g +q +ss -o #LIN = #LLINK = -f $(AMI)ami.lnk #LLIB = -lcl16 #FLLIB = -lcl16 #OBJSPEC = -o #PNSPEC = -o #LNSPEC = -o #CCLINK = cc #INCLSPEC = -i #DEFSPEC = -d #IGNSPEC = -j #SFD_END ### ### FILE LISTS ### # A more reasonable random number generator (recommended for the Amiga): RANDOBJ = $(O)random.o #SFD_INSTEAD #none .PRECIOUS: $(I)config.h $(I)decl.h $(I)hack.h $(I)permonst.h $(I)you.h # Almost nothing below this line should have to be changed. # (Exceptions are marked by [SAS6], [MANX], etc.) # # Other things that have to be reconfigured are in config.h, # (amiconf.h, pcconf.h), and possibly system.h, tradstdc.h. # Object files for makedefs: MAKEOBJS = \ $(OO)makedefs.o $(O)monst.o $(O)objects.o # Object files for special levels compiler: SPLEVOBJS = \ $(OO)lev_yacc.o $(OO)lev_lex.o $(OO)lev_main.o \ $(O)decl.o $(O)drawing.o $(O)monst.o \ $(O)objects.o $(OO)panic.o # Object files for dungeon compiler DGNCOMPOBJS = \ $(OO)dgn_yacc.o $(OO)dgn_lex.o $(OO)dgn_main.o $(O)alloc.o $(OO)panic.o # Object files for NetHack: COMMOBJ = \ $(O)allmain.o $(O)alloc.o $(O)apply.o $(O)artifact.o \ $(O)attrib.o $(O)ball.o $(O)bones.o $(O)botl.o \ $(O)cmd.o $(O)dbridge.o $(O)decl.o $(O)detect.o \ $(O)dig.o $(O)display.o $(O)dlb.o $(O)do.o \ $(O)do_name.o $(O)do_wear.o $(O)dog.o $(O)dogmove.o \ $(O)dokick.o $(O)dothrow.o $(O)drawing.o $(O)dungeon.o \ $(O)eat.o $(O)end.o $(O)engrave.o $(O)exper.o \ $(O)explode.o $(O)extralev.o $(O)files.o $(O)fountain.o \ $(O)hack.o $(O)hacklib.o $(O)invent.o $(O)light.o \ $(O)lock.o $(O)mail.o $(O)makemon.o $(O)mapglyph.o \ $(O)mcastu.o $(O)mhitm.o $(O)mhitu.o $(O)minion.o \ $(O)mklev.o $(O)mkmap.o $(O)mkmaze.o $(O)mkobj.o \ $(O)mkroom.o $(O)mon.o $(O)mondata.o $(O)monmove.o \ $(O)monst.o $(O)mplayer.o $(O)mthrowu.o $(O)muse.o \ $(O)music.o $(O)o_init.o $(O)objects.o $(O)objnam.o \ $(O)options.o $(O)pager.o $(O)pickup.o $(O)pline.o \ $(O)polyself.o $(O)potion.o $(O)pray.o $(O)priest.o \ $(O)quest.o $(O)questpgr.o $(O)read.o $(O)rect.o \ $(O)region.o $(O)restore.o $(O)rnd.o $(O)role.o \ $(O)rumors.o $(O)save.o $(O)shk.o $(O)shknam.o \ $(O)sit.o $(O)sounds.o $(O)sp_lev.o $(O)spell.o \ $(O)steal.o $(O)steed.o $(O)teleport.o $(O)timeout.o \ $(O)topten.o $(O)track.o $(O)trap.o $(O)u_init.o \ $(O)uhitm.o $(O)vault.o $(O)version.o $(O)vision.o \ $(O)weapon.o $(O)were.o $(O)wield.o $(O)windows.o \ $(O)wizard.o $(O)worm.o $(O)worn.o $(O)write.o \ $(O)zap.o MAKEDEFOBJ = \ $(O)monstr.o AMIGAOBJ = \ $(O)amidos.o $(O)amirip.o $(O)amisnd.o $(O)amistack.o \ $(O)amiwind.o $(O)winami.o $(O)winchar.o $(O)winfuncs.o \ $(O)winkey.o $(O)winmenu.o $(O)winreq.o $(O)winstr.o # Objects from assembly sources (because DMake can't handle default rules) AMIGAOBJ2 = \ # $(O)dispmap.o SHAREOBJ = \ $(O)pcmain.o $(RANDOBJ) TTYOBJ = \ $(O)getline.o $(O)termcap.o $(O)topl.o $(O)wintty.o $(O)amitty.o \ $(O)rip.o # Yuck yuck yuck. Have to tell DMake where these are, since they're not # all in the same place. TTYSRC = \ $(TTY)getline.c $(TTY)termcap.c $(TTY)topl.c $(TTY)wintty.c \ $(AMI)amitty.c $(NHS)rip.c # All the object files for NetHack: HOBJ = $(COMMOBJ) $(AMIGAOBJ) $(AMIGAOBJ2) $(SHAREOBJ) $(MAKEDEFOBJ) $(TTYOBJ) ### ### DATA FILES ### # quest files ADFILES1= $(SLIB)Arc-fila.lev $(SLIB)Arc-filb.lev $(SLIB)Arc-loca.lev \ $(SLIB)Arc-strt.lev ADFILES= $(SLIB)Arc-goal.lev $(ADFILES1) BDFILES1= $(SLIB)Bar-fila.lev $(SLIB)Bar-filb.lev $(SLIB)Bar-loca.lev \ $(SLIB)Bar-strt.lev BDFILES= $(SLIB)Bar-goal.lev $(BDFILES1) CDFILES1= $(SLIB)Cav-fila.lev $(SLIB)Cav-filb.lev $(SLIB)Cav-loca.lev \ $(SLIB)Cav-strt.lev CDFILES= $(SLIB)Cav-goal.lev $(CDFILES1) HDFILES1= $(SLIB)Hea-fila.lev $(SLIB)Hea-filb.lev $(SLIB)Hea-loca.lev \ $(SLIB)Hea-strt.lev HDFILES= $(SLIB)Hea-goal.lev $(HDFILES1) KDFILES1= $(SLIB)Kni-fila.lev $(SLIB)Kni-filb.lev $(SLIB)Kni-loca.lev \ $(SLIB)Kni-strt.lev KDFILES= $(SLIB)Kni-goal.lev $(KDFILES1) MDFILES1= $(SLIB)Mon-fila.lev $(SLIB)Mon-filb.lev $(SLIB)Mon-loca.lev \ $(SLIB)Mon-strt.lev MDFILES= $(SLIB)Mon-goal.lev $(MDFILES1) PDFILES1= $(SLIB)Pri-fila.lev $(SLIB)Pri-filb.lev $(SLIB)Pri-loca.lev \ $(SLIB)Pri-strt.lev PDFILES= $(SLIB)Pri-goal.lev $(PDFILES1) RDFILES1= $(SLIB)Rog-fila.lev $(SLIB)Rog-filb.lev $(SLIB)Rog-loca.lev \ $(SLIB)Rog-strt.lev RDFILES= $(SLIB)Rog-goal.lev $(RDFILES1) RANFILES1= $(SLIB)Ran-fila.lev $(SLIB)Ran-filb.lev $(SLIB)Ran-loca.lev \ $(SLIB)Ran-strt.lev RANFILES= $(SLIB)Ran-goal.lev $(RANFILES1) SDFILES1= $(SLIB)Sam-fila.lev $(SLIB)Sam-filb.lev $(SLIB)Sam-loca.lev \ $(SLIB)Sam-strt.lev SDFILES= $(SLIB)Sam-goal.lev $(SDFILES1) TDFILES1= $(SLIB)Tou-fila.lev $(SLIB)Tou-filb.lev $(SLIB)Tou-loca.lev \ $(SLIB)Tou-strt.lev TDFILES= $(SLIB)Tou-goal.lev $(TDFILES1) VDFILES1= $(SLIB)Val-fila.lev $(SLIB)Val-filb.lev $(SLIB)Val-loca.lev \ $(SLIB)Val-strt.lev VDFILES= $(SLIB)Val-goal.lev $(VDFILES1) WDFILES1= $(SLIB)Wiz-fila.lev $(SLIB)Wiz-filb.lev $(SLIB)Wiz-loca.lev \ $(SLIB)Wiz-strt.lev WDFILES= $(SLIB)Wiz-goal.lev $(WDFILES1) XDFILES= $(ADFILES) $(BDFILES) $(CDFILES) $(HDFILES) $(KDFILES) \ $(MDFILES) $(PDFILES) $(RDFILES) $(RANFILES) $(SDFILES) $(TDFILES) \ $(VDFILES) $(WDFILES) SOUNDFILES= \ $(SBIN)cvtsnd \ $(SLIB)sounds \ $(SLIB)sounds/Bell $(SLIB)sounds/Bugle \ $(SLIB)sounds/Drum_Of_Earthquake \ $(SLIB)sounds/Fire_Horn $(SLIB)sounds/Frost_Horn \ $(SLIB)sounds/Leather_Drum $(SLIB)sounds/Magic_Flute \ $(SLIB)sounds/Magic_Harp $(SLIB)sounds/Tooled_Horn \ $(SLIB)sounds/Wooden_Flute $(SLIB)sounds/Wooden_Harp TILEFILES= \ $(SBIN)txt2iff \ $(NETHACK)tiles \ $(NETHACK)tiles/objects.iff \ $(NETHACK)tiles/monsters.iff \ $(NETHACK)tiles/other.iff INSTDUNGEONFILES1= \ $(SLIB)air.lev $(SLIB)asmodeus.lev $(SLIB)astral.lev \ $(SLIB)baalz.lev $(SLIB)bigrm-1.lev $(SLIB)bigrm-2.lev \ $(SLIB)bigrm-3.lev $(SLIB)bigrm-4.lev $(SLIB)bigrm-5.lev \ $(SLIB)castle.lev $(SLIB)dungeon $(SLIB)earth.lev \ $(SLIB)fakewiz1.lev $(SLIB)fakewiz2.lev $(SLIB)fire.lev \ $(SLIB)juiblex.lev $(SLIB)knox.lev $(SLIB)medusa-1.lev \ $(SLIB)medusa-2.lev $(SLIB)minend-1.lev $(SLIB)minend-2.lev \ $(SLIB)minetn-1.lev $(SLIB)minetn-2.lev $(SLIB)minefill.lev \ $(SLIB)options $(SLIB)oracle.lev $(SLIB)orcus.lev \ $(SLIB)sanctum.lev $(SLIB)soko1-1.lev $(SLIB)soko1-2.lev \ $(SLIB)soko2-1.lev $(SLIB)soko2-2.lev $(SLIB)soko3-1.lev \ $(SLIB)soko3-2.lev $(SLIB)soko4-1.lev $(SLIB)soko4-2.lev \ $(SLIB)tower1.lev $(SLIB)tower2.lev $(SLIB)tower3.lev \ $(SLIB)valley.lev $(SLIB)water.lev $(SLIB)wizard1.lev \ $(SLIB)wizard2.lev $(SLIB)wizard3.lev \ $(XDFILES) INSTDUNGEONFILES= $(NETHACK)NetHack.cnf $(INSTDUNGEONFILES1) INSTDATAFILES= \ $(NETHACK)license $(NETHACK)logfile $(NETHACK)record \ $(NETHACK)tomb.iff $(NETHACK)amii.hlp $(NETHACK)Recover.txt \ $(NETHACK)GuideBook.txt $(NETHACK)NetHack.txt $(NETHACK)Install.ami LIBFILES= \ $(INSTDUNGEONFILES1) \ $(SLIB)cmdhelp $(SLIB)data $(SLIB)dungeon \ $(SLIB)help $(SLIB)hh $(SLIB)history \ $(SLIB)opthelp $(SLIB)oracles $(SLIB)rumors \ $(SLIB)quest.dat $(SLIB)wizhelp ### ### Getting down to business: ### #SFD_INSTEAD all: $(SBIN)lev_comp $(SBIN)dgn_comp $(SBIN)NetHack \ all: $(COMPACT_HEADERS) $(SBIN)lev_comp $(SBIN)dgn_comp $(SBIN)NetHack \ $(SBIN)dlb $(NETHACK)recover install: all inst-data inst-dungeon inst-fonts inst-sounds inst-tiles \ $(NETHACK)nhdat $(NETHACK)NetHack $(SBIN)NetHack: $(HOBJ) $(AMI)ami.lnk $(LINK) $(LNSPEC) $(SBIN)NetHack $(LIN) $(LLINK) $(LLIB) $(NETHACK)NetHack: $(SBIN)NetHack copy $(SBIN)NetHack $(NETHACK)NetHack link: $(LINK) $(LNSPEC) $(SBIN)NetHack $(LIN) $(LLINK) $(LLIB) $(AMI)ami.lnk: $(AMI)Makefile.ami list to $(AMI)ami.lnk lformat="$(O)%s" $(O)\#?.o QUICK NOHEAD ## dlb support $(OO)dlb_main.o: $(UTIL)dlb_main.c $(HDEP) $(I)dlb.h $(I)date.h $(CC) $(CFLAGS) $(OBJSPEC)$(OO)dlb_main.o $(UTIL)dlb_main.c $(SBIN)dlb: $(OO)dlb_main.o $(O)dlb.o $(O)alloc.o $(OO)panic.o $(LINK) $(PNSPEC) $(SBIN)dlb $(LIN) $(OO)dlb_main.o $(O)dlb.o \ $(O)alloc.o $(OO)panic.o $(LLIB) obj: $(HOBJ) obja: $(AMIGAOBJ) objs: $(SHAREOBJ) #SFD_BEGIN #SFD_ELSE SUFFIXES = .lev .des .des.lev: $(SBIN)lev_comp $< #SFD_END # The default method for creating object files: #SFD_BEGIN ## ###[DICE] ## ##$(COMMOBJ): $(COMMOBJ:"$(O)*.o":"$(NHS)%1.c") ## $(CC) $(CFLAGS) $(CSYM) $(OBJSPEC)%(left) %(right) ## ##$(AMIGAOBJ): $(AMIGAOBJ:"$(O)*.o":"$(AMI)%1.c") ## $(CC) $(CFLAGS) $(CSYM) $(OBJSPEC)%(left) %(right) ## ##$(SHAREOBJ): $(SHAREOBJ:"$(O)*.o":"$(SHARE)%1.c") ## $(CC) $(CFLAGS) $(CSYM) $(OBJSPEC)%(left) %(right) ## ##$(TTYOBJ): $(TTYSRC) ## $(CC) $(CFLAGS) $(CSYM) $(OBJSPEC)%(left) %(right) ## #SFD_ELSE #[SAS6] .c.o: $(CC) $(CFLAGS) $(CSYM) $(OBJSPEC)$@ $< #SFD_END clean: -delete $(O)\#?.o $(OO)\#?.o spotless: clean -delete $(SBIN)NetHack $(SBIN)lev_comp $(SBIN)makedefs $(SBIN)dgn_comp -delete $(SBIN)cvtsnd $(SBIN)dlb $(SBIN)txt2iff $(SBIN)splitter -delete $(SBIN)tilemap -delete $(SLIB)data $(SLIB)rumors -delete $(SLIB)\#?.lev -delete $(SLIB)dungeon -delete $(SLIB)cmdhelp $(SLIB)help $(SLIB)hh $(SLIB)history -delete $(SLIB)opthelp $(SLIB)options $(SLIB)oracles -delete $(SLIB)quest.dat $(SLIB)wizhelp # -delete $(SLIB)earth.lev $(SLIB)air.lev $(SLIB)fire.lev # -delete $(SLIB)water.lev $(SLIB)astral.lev # -delete $(SLIB)tower1.lev $(SLIB)tower2.lev $(SLIB)tower3.lev # -delete $(SLIB)fakewiz1.lev $(SLIB)fakewiz2.lev # -delete $(SLIB)medusa-1.lev $(SLIB)medusa-2.lev # -delete $(SLIB)oracle.lev $(SLIB)wizard1.lev $(SLIB)wizard2.lev # -delete $(SLIB)wizard3.lev $(DAT)dungeon.pdf $(SLIB)valley.lev # -delete $(SLIB)minefill.lev # -delete $(SLIB)minetn-1 $(SLIB)minetn-2 $(SLIB)minend-1 $(SLIB)minend-2 # -delete $(SLIB)soko1-1.lev $(SLIB)soko1-2.lev $(SLIB)soko2-1.lev # -delete $(SLIB)soko2-2.lev $(SLIB)soko3-1.lev $(SLIB)soko3-2.lev # -delete $(SLIB)soko4-1.lev $(SLIB)soko4-2.lev # -delete $(ADFILES) # -delete $(BDFILES) # -delete $(CDFILES) # -delete $(HDFILES) # -delete $(KDFILES) # -delete $(MDFILES) # -delete $(PDFILES) # -delete $(RDFILES) # -delete $(RANFILES) # -delete $(SDFILES) # -delete $(TDFILES) # -delete $(VDFILES) # -delete $(WDFILES) -delete $(I)onames.h $(I)pm.h $(I)date.h -delete $(NHS)tile.c $(NHS)monstr.c -delete $(I)tile.h # -echo to $(I)onames.h "" noline # -wait 2 # -echo to $(I)pm.h "" noline # -wait 2 # -setdate $(UTIL)makedefs.c # -wait 2 # Creating precompiled version of $(I)hack.h to save disk I/O. #SFD_BEGIN ## ###[DICE] ### If we were compiling with DICE and wanted to use the symbol table ### pre-loading feature, we would technically not need a rule to make the ### precompiled header file, because DCC handles this automatically; ### however, we must delete the precompiled header file if any of the ### includes change, and we need to create it manually because the ### sys/amiga sources, compiled first, define things differently than the ### main sources want them. ## ##$(HDEP): $(I)hack.h $(I)pm.h $(I)onames.h ## -delete $(I)hack.sym ## echo to Ram:hackincl.c "#include " ## $(CC) $(CFLAGS) $(CSYM) $(OBJSPEC)Ram:hackincl.o Ram:hackincl.c ## -delete Ram:hackincl.c Ram:hackincl.o ## #SFD_ELSE #X#[SAS5] #X# If we were to use the precompiled header file feature of SAS/C, we #X# would uncomment the following lines. (Also see defines for HDEP and #X# CSYM near the beginning of this file, as these should be appropriately #X# defined.) #X#$(HDEP): $(I)hack.h $(SBIN)makedefs #X# echo to Ram:hackincl.c "#include <$(I)hack.h>" #X# $(CC) $(CFLAGS) -ph $(OBJSPEC)$@ Ram:hackincl.c #X# -delete Ram:hackincl.c #[MANX] # If we were compiling with Aztec, and wanted to use the symbol table # pre-loading feature, we would uncomment these following two lines. #$(HDEP): $(I)hack.h $(SBIN)makedefs # $(CC) $(CFLAGS) -a $(OBJSPEC)Ram:hack.asm +h$@ $(I)hack.h # -delete Ram:hack.asm #SFD_END # # Please note: The dependency lines for the modules here are # deliberately incorrect. Including "hack.h" in # the dependency list would cause a dependency # loop. # $(SBIN)makedefs: $(MAKEOBJS) $(LINK) $(LNSPEC) $(SBIN)makedefs $(LIN) $(MAKEOBJS) $(LLIB) $(OO)makedefs.o: $(UTIL)makedefs.c $(I)config.h $(I)permonst.h $(I)monsym.h \ $(I)objclass.h $(I)patchlevel.h $(I)qtext.h $(I)artilist.h $(CC) $(DEFSPEC)MAKEDEFS_C $(CFLAGS) $(OBJSPEC)$@ $(UTIL)makedefs.c $(SBIN)lev_comp: $(SPLEVOBJS) $(LINK) $(LNSPEC) $(SBIN)lev_comp $(LIN) $(SPLEVOBJS) $(FBFIL) $(FLLIB) $(SBIN)dgn_comp: $(DGNCOMPOBJS) $(LINK) $(LNSPEC) $(SBIN)dgn_comp $(LIN) $(DGNCOMPOBJS) $(FBFIL) $(FLLIB) $(OO)lev_yacc.o: $(UTIL)lev_yacc.c $(HDEP) $(I)sp_lev.h $(I)pm.h $(I)onames.h # setdate $(UTIL)lev_yacc.c $(CC) $(DEFSPEC)LEV_LEX_C $(DEFSPEC)PREFIX="NH:slib/" $(CFLAGS) \ $(DEFSPEC)alloca=malloc $(OBJSPEC)$@ $(UTIL)lev_yacc.c $(OO)lev_lex.o: $(UTIL)lev_lex.c $(HDEP) $(I)lev_comp.h $(I)sp_lev.h $(CC) $(DEFSPEC)LEV_LEX_C $(CFLAGS) $(OBJSPEC)$@ $(UTIL)lev_lex.c $(OO)lev_main.o: $(UTIL)lev_main.c $(HDEP) $(I)pm.h $(I)onames.h $(I)date.h $(CC) $(DEFSPEC)LEV_LEX_C $(DEFSPEC)AMIGA $(CFLAGS) $(OBJSPEC)$@ \ $(UTIL)lev_main.c $(OO)dgn_yacc.o: $(UTIL)dgn_yacc.c $(HDEP) $(I)dgn_file.h $(I)patchlevel.h $(CC) $(DEFSPEC)LEV_LEX_C $(CFLAGS) $(DEFSPEC)alloca=malloc \ $(OBJSPEC)$@ $(UTIL)dgn_yacc.c $(OO)dgn_lex.o: $(UTIL)dgn_lex.c $(I)config.h $(I)dgn_comp.h $(I)dgn_file.h $(CC) $(DEFSPEC)LEV_LEX_C $(CFLAGS) $(OBJSPEC)$@ $(UTIL)dgn_lex.c $(OO)dgn_main.o: $(UTIL)dgn_main.c $(I)config.h $(I)date.h $(CC) $(DEFSPEC)LEV_LEX_C $(DEFSPEC)AMIGA $(CFLAGS) $(OBJSPEC)$@ \ $(UTIL)dgn_main.c $(OO)panic.o: $(UTIL)panic.c $(HDEP) #SFD_INSTEAD $(CC) $(CFLAGS) $(OBJSPEC)%(left) $(UTIL)panic.c #none $(OO)recover.o: $(UTIL)recover.c $(I)config.h $(I)date.h $(CC) $(DEFSPEC)LEV_LEX_C $(DEFSPEC)AMIGA $(CFLAGS) $(OBJSPEC)$@ \ $(UTIL)recover.c $(NETHACK)recover: $(OO)recover.o $(LINK) $(LNSPEC) $(NETHACK)recover $(LIN) $(OO)recover.o $(LLIB) # [OPTION] -- If you have flex/bison, leave these uncommented. Otherwise, # comment them out and be careful! (You're not guaranteed to have the most # up to date *_comp.c, *_comp.h and *_lex.c) $(I)lev_comp.h: $(UTIL)lev_yacc.c $(I)patchlevel.h $(UTIL)lev_yacc.c: $(UTIL)lev_comp.y $(I)patchlevel.h $(BISON) -d $(UTIL)lev_comp.y # copy y.tab.c $(UTIL)lev_yacc.c # copy y.tab.h $(I)lev_comp.h copy $(UTIL)lev_comp.tab.c $(UTIL)lev_yacc.c copy $(UTIL)lev_comp.tab.h $(I)lev_comp.h # delete y.tab.c # delete y.tab.h delete $(UTIL)lev_comp.tab.c delete $(UTIL)lev_comp.tab.h $(UTIL)lev_lex.c: $(UTIL)lev_comp.l $(I)patchlevel.h $(FLEX) $(UTIL)lev_comp.l copy lex.yy.c $(UTIL)lev_lex.c delete lex.yy.c $(I)dgn_comp.h: $(UTIL)dgn_yacc.c $(I)patchlevel.h $(UTIL)dgn_yacc.c: $(UTIL)dgn_comp.y $(I)patchlevel.h $(BISON) -d $(UTIL)dgn_comp.y # copy y.tab.c $(UTIL)dgn_yacc.c # copy y.tab.h $(I)dgn_comp.h copy $(UTIL)dgn_comp.tab.c $(UTIL)dgn_yacc.c copy $(UTIL)dgn_comp.tab.h $(I)dgn_comp.h # delete y.tab.c # delete y.tab.h delete $(UTIL)dgn_comp.tab.c delete $(UTIL)dgn_comp.tab.h $(UTIL)dgn_lex.c: $(UTIL)dgn_comp.l $(I)patchlevel.h $(FLEX) $(UTIL)dgn_comp.l copy lex.yy.c $(UTIL)dgn_lex.c delete lex.yy.c # # The following include files depend on makedefs to be created. # As a result, they are not defined in HACKINCL, instead, their # dependencies are explicitly outlined here. # # # date.h should be remade any time any of the source or include code # is modified. Unfortunately, this would make the contents of this # file far more complex. Since "hack.h" depends on most of the include # files, we kludge around this by making date.h dependent on hack.h, # even though it doesn't include this file. # #SFD_INSTEAD $(I)date.h $(DAT)options:: $(HDEP) $(SBIN)makedefs $(AMIGAOBJ) $(I)date.h $(DAT)options: $(HDEP) $(SBIN)makedefs $(AMIGAOBJ) $(I)patchlevel.h $(SBIN)makedefs -v $(EXECUTE) $(AMI)ifchange MOVE $(I)t.date.h $(I)date.h -wait 2 $(I)onames.h: $(SBIN)makedefs $(SBIN)makedefs -o $(EXECUTE) $(AMI)ifchange TOUCH $(I)t.onames.h $(I)onames.h $(I)decl.h $(EXECUTE) $(AMI)ifchange MOVE $(I)t.onames.h $(I)onames.h -wait 2 $(I)pm.h: $(SBIN)makedefs $(SBIN)makedefs -p $(EXECUTE) $(AMI)ifchange TOUCH $(I)t.pm.h $(I)pm.h $(I)decl.h $(I)youprop.h $(EXECUTE) $(AMI)ifchange MOVE $(I)t.pm.h $(I)pm.h -wait 2 $(SLIB)quest.dat: $(DAT)quest.txt $(SBIN)makedefs $(SBIN)makedefs -q $(NHS)monstr.c: $(HDEP) $(SBIN)makedefs $(SBIN)makedefs -m -wait 2 $(SLIB)oracles: $(DAT)oracles.txt $(SBIN)makedefs $(SBIN)makedefs -h -wait 2 # # The following programs vary depending on what OS you are using. # As a result, they are not defined in HACKSRC and their dependencies # are explicitly outlined here. # $(O)amidos.o: $(AMI)amidos.c $(HDEP) $(O)amirip.o: $(AMI)amirip.c $(HDEP) $(O)aglue.o: $(AMI)aglue.a $(ASM) $(AFLAGS) $(AOBJSPEC)$(O)aglue.o $(AMI)aglue.a $(O)amisnd.o: $(AMI)amisnd.c $(HDEP) $(O)winchar.o: $(AMI)winchar.c $(NHS)tile.c $(HDEP) $(NHS)tile.c: $(WSHARE)tilemap.c #SFD_INSTEAD $(CCLINK) $(CLFLAGS) $(PNSPEC) $(SBIN)tilemap $(WSHARE)tilemap.c $(CCLINK) $(CFLAGS) $(PNSPEC) $(SBIN)tilemap $(WSHARE)tilemap.c $(SBIN)tilemap $(O)winstr.o: $(AMI)winstr.c $(HDEP) $(AMDEP) $(O)winreq.o: $(AMI)winreq.c $(HDEP) $(AMDEP) $(AMI)colorwin.c $(AMI)clipwin.c $(O)winfuncs.o: $(AMI)winfuncs.c $(HDEP) $(AMDEP) $(I)patchlevel.h $(O)winkey.o: $(AMI)winkey.c $(HDEP) $(AMDEP) $(O)winmenu.o: $(AMI)winmenu.c $(HDEP) $(AMDEP) $(O)winami.o: $(AMI)winami.c $(HDEP) $(AMDEP) #$(AMI)char.c $(AMI)randwin.c #$(O)amilib.o: $(AMI)amilib.c $(HDEP) $(AMDEP) $(O)amiwind.o: $(AMI)amiwind.c $(AMI)amimenu.c $(HDEP) $(AMDEP) $(O)amiwbench.o: $(AMI)amiwbench.c $(HDEP) $(O)random.o: $(SHARE)random.c $(O)pcmain.o: $(SHARE)pcmain.c $(HDEP) $(I)dlb.h $(O)dispmap.o: $(AMI)dispmap.s $(ASM) $(AFLAGS) $(AOBJSPEC)$@ $< # Stuff to build the front ends $(NETHACK)HackWB: $(OO)wb.o $(OO)wbx.o $(OO)loader.o $(OO)multi.o $(LINK) $(LNSPEC) $(NETHACK)HackWB $(LIN) $(OO)wb.o $(OO)wbx.o \ $(OO)loader.o $(OO)multi.o $(LLIB) $(NETHACK)HackCli: $(OO)cli.o $(OO)loader.o $(OO)multi.o $(LINK) $(LNSPEC) $(NETHACK)HackCli $(LIN) $(OO)cli.o $(OO)loader.o \ $(OO)multi.o $(LLIB) # This needs to exist to eliminate the HackWB startup message #SFD_INSTEAD $(NETHACK)WBDefaults.def: $(NETHACK)WBDefaults.def $(NETHACK)WBDefaults.def: echo to $(NETHACK)WBDefaults.def WBH = $(AMI)wbdefs.h $(AMI)wbstruct.h $(AMI)wbprotos.h ASP = $(AMI)splitter $(OO)wb.o: $(WBH) $(AMI)wb.c $(AMI)wbwin.c $(AMI)wbdata.c $(AMI)wbgads.c \ $(I)patchlevel.h $(CC) $(WBCFLAGS) $(SPLFLAGS) $(OBJSPEC)$(OO)wb.o $(AMI)wb.c $(OO)wbx.o: $(WBH) $(AMI)wbcli.c $(AMI)wbwin.c $(AMI)wbdata.c \ $(I)patchlevel.h $(I)date.h $(CC) $(WBCFLAGS) $(SPLFLAGS) $(OBJSPEC)$(OO)wbx.o $(AMI)wbcli.c $(OO)loader.o: $(ASP)/loader.c $(ASP)/split.h $(ASP)/amiout.h $(ASP)/multi.h $(CC) $(WBCFLAGS) $(SPLFLAGS) $(OBJSPEC)$(OO)loader.o $(ASP)/loader.c $(OO)multi.o: $(ASP)/multi.c $(ASP)/multi.h $(CC) $(WBCFLAGS) $(SPLFLAGS) $(OBJSPEC)$(OO)multi.o $(ASP)/multi.c $(OO)cli.o: $(WBH) $(AMI)wbcli.c $(I)patchlevel.h $(I)date.h $(CC) $(WBCFLAGS) $(WBC2FLAGS) $(SPLFLAGS) $(OBJSPEC)$(OO)cli.o \ $(AMI)wbcli.c #### # splitter support $(SBIN)splitter: $(OO)splitter.o $(OO)arg.o $(LINK) $(LNSPEC) $(SBIN)splitter $(LIN) $(OO)splitter.o $(OO)arg.o \ $(LLIB) $(NETHACK)NetHack.dir: $(SBIN)splitter $(SBIN)NetHack $(SBIN)splitter $(SBIN)NetHack $(OO)splitter.o: $(ASP)/splitter.c $(ASP)/split.h $(ASP)/amiout.h $(ASP)/arg.h $(CC) $(WBCFLAGS) $(SPLFLAGS) $(OBJSPEC)$(OO)splitter.o \ $(ASP)/splitter.c $(OO)arg.o: $(ASP)/arg.c $(ASP)/arg.h $(CC) $(WBCFLAGS) $(SPLFLAGS) $(OBJSPEC)$(OO)arg.o $(ASP)/arg.c # Create/copy other stuff into NetHack: directory: $(NETHACK)tomb.iff: $(SBIN)xpm2iff $(AMI)grave16.xpm $(SBIN)xpm2iff $(AMI)grave16.xpm $(NETHACK)tomb.iff $(OO)xpm2iff.o: $(AMI)xpm2iff.c $(CC) $(CFLAGS) $(INCLSPEC)$(WSHARE) $(OBJSPEC)$@ $(AMI)xpm2iff.c $(SBIN)xpm2iff: $(OO)xpm2iff.o $(LINK) $(LNSPEC) $@ $(LIN) $(OO)xpm2iff.o $(FLLIB) # Tile installation for the tile version of the game inst-tiles: $(TILEFILES) #SFD_INSTEAD $(NETHACK)tiles: $(NETHACK)tiles $(NETHACK)tiles: -makedir $(NETHACK)tiles $(OO)txt2iff.o: $(AMI)txt2iff.c $(CC) $(CFLAGS) $(CSYM) $(INCLSPEC)$(WSHARE) $(OBJSPEC)$@ \ $(AMI)txt2iff.c $(OO)ppmwrite.o: $(WSHARE)ppmwrite.c $(CC) $(CFLAGS) $(CSYM) $(INCLSPEC)$(WSHARE) $(OBJSPEC)$@ $(WSHARE)ppmwrite.c $(OO)tiletext.o: $(WSHARE)tiletext.c $(I)config.h $(WSHARE)tile.h $(CC) $(CFLAGS) $(CSYM) $(INCLSPEC)$(WSHARE) $(OBJSPEC)$@ $(WSHARE)tiletext.c $(OO)tiletxt.o: $(WSHARE)tilemap.c $(I)hack.h $(CC) $(CFLAGS) $(CSYM) $(DEFSPEC)TILETEXT $(INCLSPEC)$(WSHARE) $(OBJSPEC)$@ $(WSHARE)tilemap.c NAMEOBJS = $(O)drawing.o $(O)decl.o $(O)monst.o $(O)objects.o $(SBIN)txt2ppm: $(OO)ppmwrite.o $(NAMEOBJS) $(O)alloc.o $(OO)panic.o $(OO)tiletext.o $(OO)tiletxt.o $(LINK) $(LNSPEC) $@ $(LIN) $(OO)ppmwrite.o $(NAMEOBJS) $(OO)tiletext.o $(OO)tiletxt.o $(O)alloc.o $(OO)panic.o $(FLLIB) $(SBIN)txt2iff: $(OO)txt2iff.o $(NAMEOBJS) $(OO)tiletext.o $(OO)tiletxt.o $(LINK) $(LNSPEC) $@ $(LIN) $(OO)txt2iff.o $(NAMEOBJS) $(OO)tiletext.o \ $(OO)tiletxt.o $(FLLIB) $(NETHACK)tiles/objects.iff: $(WSHARE)objects.txt $(SBIN)txt2iff $(SBIN)txt2iff $(WSHARE)objects.txt $(NETHACK)tiles/objects.iff $(NETHACK)tiles/monsters.iff: $(WSHARE)monsters.txt $(SBIN)txt2iff $(SBIN)txt2iff $(WSHARE)monsters.txt $(NETHACK)tiles/monsters.iff $(NETHACK)tiles/other.iff: $(WSHARE)other.txt $(SBIN)txt2iff $(SBIN)txt2iff $(WSHARE)other.txt $(NETHACK)tiles/other.iff # Sound installation rules. inst-sounds: $(SOUNDFILES) list to T:nhsdat.lst $(SLIB)sounds QUICK NOHEAD echo >T:make-nhsdat $(SBIN)dlb cCfI $(SLIB)sounds $(NETHACK)nhsdat T:nhsdat.lst echo >>T:make-nhsdat if not exists $(NETHACK)nhsdat echo >>T:make-nhsdat copy $(SLIB)sounds/\#? $(NETHACK)sounds echo >>T:make-nhsdat endif execute T:make-nhsdat -delete T:make-nhsdat #SFD_INSTEAD $(SLIB)sounds: $(SLIB)sounds $(SLIB)sounds: -makedir $(SLIB)sounds $(SBIN)cvtsnd: $(OO)cvtsnd.o $(LINK) $(LNSPEC) $@ $(LIN) $(OO)cvtsnd.o $(FLLIB) $(OO)cvtsnd.o: $(AMI)cvtsnd.c #SFD_INSTEAD $(CC) $(CFLAGS) $(OBJSPEC)%(left) %(right) #none $(SLIB)sounds/Bell: $(SHARE)sounds/bell.uu $(UUDEC) $(SHARE)sounds/bell.uu $(SBIN)cvtsnd Bell $(SLIB)sounds/Bell -delete Bell $(SLIB)sounds/Bugle: $(SHARE)sounds/bugle.uu $(UUDEC) $(SHARE)sounds/bugle.uu $(SBIN)cvtsnd Bugle $(SLIB)sounds/Bugle -delete Bugle $(SLIB)sounds/Drum_Of_Earthquake: $(SHARE)sounds/erthdrum.uu $(UUDEC) $(SHARE)sounds/erthdrum.uu $(SBIN)cvtsnd Drum_Of_Earthquake $(SLIB)sounds/Drum_Of_Earthquake -delete Drum_Of_Earthquake $(SLIB)sounds/Fire_Horn: $(SHARE)sounds/firehorn.uu $(UUDEC) $(SHARE)sounds/firehorn.uu $(SBIN)cvtsnd Fire_Horn $(SLIB)sounds/Fire_Horn -delete Fire_Horn $(SLIB)sounds/Frost_Horn: $(SHARE)sounds/frsthorn.uu $(UUDEC) $(SHARE)sounds/frsthorn.uu $(SBIN)cvtsnd Frost_Horn $(SLIB)sounds/Frost_Horn -delete Frost_Horn $(SLIB)sounds/Leather_Drum: $(SHARE)sounds/lethdrum.uu $(UUDEC) $(SHARE)sounds/lethdrum.uu $(SBIN)cvtsnd Leather_Drum $(SLIB)sounds/Leather_Drum -delete Leather_Drum $(SLIB)sounds/Magic_Flute: $(SHARE)sounds/mgcflute.uu $(UUDEC) $(SHARE)sounds/mgcflute.uu $(SBIN)cvtsnd Magic_Flute $(SLIB)sounds/Magic_Flute -delete Magic_Flute $(SLIB)sounds/Magic_Harp: $(SHARE)sounds/mgcharp.uu $(UUDEC) $(SHARE)sounds/mgcharp.uu $(SBIN)cvtsnd Magic_Harp $(SLIB)sounds/Magic_Harp -delete Magic_Harp $(SLIB)sounds/Tooled_Horn: $(SHARE)sounds/toolhorn.uu $(UUDEC) $(SHARE)sounds/toolhorn.uu $(SBIN)cvtsnd Tooled_Horn $(SLIB)sounds/Tooled_Horn -delete Tooled_Horn $(SLIB)sounds/Wooden_Flute: $(SHARE)sounds/wdnflute.uu $(UUDEC) $(SHARE)sounds/wdnflute.uu $(SBIN)cvtsnd Wooden_Flute $(SLIB)sounds/Wooden_Flute -delete Wooden_Flute $(SLIB)sounds/Wooden_Harp: $(SHARE)sounds/wdnharp.uu $(UUDEC) $(SHARE)sounds/wdnharp.uu $(SBIN)cvtsnd Wooden_Harp $(SLIB)sounds/Wooden_Harp -delete Wooden_Harp inst-dungeon: $(INSTDUNGEONFILES) $(NETHACK)options : $(DAT)options copy $(DAT)options $@ # Create compiled dungeon files BGM= $(SLIB)bigrm-2.lev $(SLIB)bigrm-3.lev $(SLIB)bigrm-4.lev $(SLIB)bigrm-5.lev $(BGM): $(SLIB)bigrm-1.lev $(SLIB)bigrm-1.lev: $(DAT)bigroom.des $(SBIN)lev_comp #SFD_INSTEAD $(SBIN)lev_comp $(DAT)bigroom.des #none $(SLIB)castle.lev: $(DAT)castle.des $(SBIN)lev_comp ENDGAME1= $(SLIB)air.lev $(SLIB)earth.lev $(SLIB)fire.lev $(SLIB)water.lev $(ENDGAME1): $(SLIB)astral.lev $(SLIB)astral.lev: $(DAT)endgame.des $(SBIN)lev_comp #SFD_INSTEAD $(SBIN)lev_comp $(DAT)endgame.des #none GEHENNOM1= $(SLIB)asmodeus.lev $(SLIB)baalz.lev $(SLIB)juiblex.lev \ $(SLIB)orcus.lev $(SLIB)sanctum.lev $(GEHENNOM1): $(SLIB)valley.lev $(SLIB)valley.lev: $(DAT)gehennom.des $(SBIN)lev_comp #SFD_INSTEAD $(SBIN)lev_comp $(DAT)gehennom.des #none $(SLIB)knox.lev: $(DAT)knox.des $(SBIN)lev_comp #SFD_INSTEAD $(SBIN)lev_comp $(DAT)knox.des #none MINES1= $(SLIB)minend-1.lev $(SLIB)minend-2.lev $(SLIB)minetn-1.lev $(SLIB)minetn-2.lev $(MINES1): $(SLIB)minefill.lev $(SLIB)minefill.lev: $(DAT)mines.des $(SBIN)lev_comp #SFD_INSTEAD $(SBIN)lev_comp $(DAT)mines.des #none $(SLIB)oracle.lev: $(DAT)oracle.des $(SBIN)lev_comp #SFD_INSTEAD $(SBIN)lev_comp $(DAT)oracle.des #none TOWER1= $(SLIB)tower1.lev $(SLIB)tower2.lev $(TOWER1): $(SLIB)tower3.lev $(SLIB)tower3.lev: $(DAT)tower.des $(SBIN)lev_comp #SFD_INSTEAD $(SBIN)lev_comp $(DAT)tower.des #none WIZARD1= $(SLIB)wizard1.lev $(SLIB)wizard2.lev $(SLIB)wizard3.lev \ $(SLIB)fakewiz1.lev $(WIZARD1): $(SLIB)fakewiz2.lev $(SLIB)fakewiz2.lev: $(DAT)yendor.des $(SBIN)lev_comp #SFD_INSTEAD $(SBIN)lev_comp $(DAT)yendor.des #none MEDUSA1= $(SLIB)medusa-1.lev $(MEDUSA1): $(SLIB)medusa-2.lev $(SLIB)medusa-2.lev: $(DAT)medusa.des $(SBIN)lev_comp #SFD_INSTEAD $(SBIN)lev_comp $(DAT)medusa.des #none SOKOBAN1= $(SLIB)soko1-1.lev $(SLIB)soko1-2.lev $(SLIB)soko2-1.lev \ $(SLIB)soko2-2.lev $(SLIB)soko3-1.lev $(SLIB)soko3-2.lev \ $(SLIB)soko4-1.lev $(SOKOBAN1): $(SLIB)soko4-2.lev $(SLIB)soko4-2.lev: $(DAT)sokoban.des $(SBIN)lev_comp #SFD_INSTEAD $(SBIN)lev_comp $(DAT)sokoban.des #none $(ADFILES1): $(SLIB)Arc-goal.lev $(SLIB)Arc-goal.lev: $(DAT)Arch.des $(SBIN)lev_comp #SFD_INSTEAD $(SBIN)lev_comp $(DAT)Arch.des #none $(BDFILES1): $(SLIB)Bar-goal.lev $(SLIB)Bar-goal.lev: $(DAT)Barb.des $(SBIN)lev_comp #SFD_INSTEAD $(SBIN)lev_comp $(DAT)Barb.des #none $(CDFILES1): $(SLIB)Cav-goal.lev $(SLIB)Cav-goal.lev: $(DAT)Caveman.des $(SBIN)lev_comp #SFD_INSTEAD $(SBIN)lev_comp $(DAT)Caveman.des #none $(HDFILES1): $(SLIB)Hea-goal.lev $(SLIB)Hea-goal.lev: $(DAT)Healer.des $(SBIN)lev_comp #SFD_INSTEAD $(SBIN)lev_comp $(DAT)Healer.des #none $(KDFILES1): $(SLIB)Kni-goal.lev $(SLIB)Kni-goal.lev: $(DAT)Knight.des $(SBIN)lev_comp #SFD_INSTEAD $(SBIN)lev_comp $(DAT)Knight.des #none $(MDFILES1): $(SLIB)Mon-goal.lev $(SLIB)Mon-goal.lev: $(DAT)Monk.des $(SBIN)lev_comp #SFD_INSTEAD $(SBIN)lev_comp $(DAT)Monk.des #none $(PDFILES1): $(SLIB)Pri-goal.lev $(SLIB)Pri-goal.lev: $(DAT)Priest.des $(SBIN)lev_comp #SFD_INSTEAD $(SBIN)lev_comp $(DAT)Priest.des #none $(RDFILES1): $(SLIB)Rog-goal.lev $(SLIB)Rog-goal.lev: $(DAT)Rogue.des $(SBIN)lev_comp #SFD_INSTEAD $(SBIN)lev_comp $(DAT)Rogue.des #none $(RANFILES1): $(SLIB)Ran-goal.lev $(SLIB)Ran-goal.lev: $(DAT)Ranger.des $(SBIN)lev_comp #SFD_INSTEAD $(SBIN)lev_comp $(DAT)Ranger.des #none $(SDFILES1): $(SLIB)Sam-goal.lev $(SLIB)Sam-goal.lev: $(DAT)Samurai.des $(SBIN)lev_comp #SFD_INSTEAD $(SBIN)lev_comp $(DAT)Samurai.des #none $(TDFILES1): $(SLIB)Tou-goal.lev $(SLIB)Tou-goal.lev: $(DAT)Tourist.des $(SBIN)lev_comp #SFD_INSTEAD $(SBIN)lev_comp $(DAT)Tourist.des #none $(VDFILES1): $(SLIB)Val-goal.lev $(SLIB)Val-goal.lev: $(DAT)Valkyrie.des $(SBIN)lev_comp #SFD_INSTEAD $(SBIN)lev_comp $(DAT)Valkyrie.des #none $(WDFILES1): $(SLIB)Wiz-goal.lev $(SLIB)Wiz-goal.lev: $(DAT)Wizard.des $(SBIN)lev_comp #SFD_INSTEAD $(SBIN)lev_comp $(DAT)Wizard.des #none $(SLIB)dungeon: $(DAT)dungeon.def $(SBIN)makedefs $(SBIN)dgn_comp $(SBIN)makedefs -e $(SBIN)dgn_comp $(DAT)dungeon.pdf copy $(DAT)dungeon $(SLIB)dungeon delete $(DAT)dungeon inst-data: $(INSTDATAFILES) $(NETHACK)amii.hlp: $(AMI)amii.hlp copy $(AMI)amii.hlp $@ #$(NETHACK)data: $(DAT)data # copy $(DAT)data $@ $(SLIB)data: $(DAT)data.base $(I)config.h $(SBIN)makedefs $(SBIN)makedefs -d #$(NETHACK)rumors: $(DAT)rumors # copy $(DAT)rumors $@ $(SLIB)rumors: $(DAT)rumors.tru $(DAT)rumors.fal $(SBIN)makedefs $(SBIN)makedefs -r $(SLIB)cmdhelp: $(DAT)cmdhelp copy $(DAT)cmdhelp $@ $(SLIB)help: $(DAT)help copy $(DAT)help $@ $(SLIB)hh: $(DAT)hh copy $(DAT)hh $@ $(NETHACK)HackWB.hlp: $(AMI)HackWB.hlp copy $(AMI)HackWB.hlp $@ $(SLIB)history: $(DAT)history copy $(DAT)history $@ $(NETHACK)license: $(DAT)license copy $(DAT)license $@ $(SLIB)opthelp: $(DAT)opthelp copy $(DAT)opthelp $@ $(NETHACK)Recover.txt: $(DOC)Recover.txt copy $(DOC)Recover.txt $@ $(NETHACK)GuideBook.txt: $(DOC)GuideBook.txt copy $(DOC)GuideBook.txt $@ $(NETHACK)NetHack.txt: $(DOC)NetHack.txt copy $(DOC)NetHack.txt $@ $(NETHACK)Install.ami: $(AMI)Install.ami copy $(AMI)Install.ami $@ #SFD_INSTEAD $(NETHACK)logfile: $(NETHACK)logfile $(NETHACK)logfile: echo to $@ #SFD_INSTEAD $(NETHACK)record: $(NETHACK)record $(NETHACK)record: echo to $@ $(SLIB)wizhelp: $(DAT)wizhelp copy $(DAT)wizhelp $@ # Create the directories here because NetHack.cnf puts them there by default $(NETHACK)NetHack.cnf: $(AMI)NetHack.cnf copy $(AMI)NetHack.cnf $@ -makedir $(NETHACK)save -makedir $(NETHACK)levels #SFD_BEGIN #SFD_ELSE $(O)NetHack.gst: $(GSTSRC) $(I)hack.h sc makegst=$(GSTFILE) $(CFLAGS) $(GSTSRC) #SFD_END # Unpack and install fonts INSTFONTFILES= $(NETHACK)hack.font $(NETHACK)hack $(NETHACK)hack/8 inst-fonts: $(INSTFONTFILES) $(NETHACK)hack/8: $(AMI)amifont8.uu $(NETHACK)hack $(UUDEC) $(AMI)amifont8.uu copy 8 $(NETHACK)hack/8 delete 8 $(NETHACK)hack.font: $(AMI)amifont.uu $(UUDEC) $(AMI)amifont.uu copy hack.font $(NETHACK)hack.font delete hack.font #SFD_INSTEAD $(NETHACK)hack: $(NETHACK)hack $(NETHACK)hack: -makedir $@ INSTICONFILES= \ $(NETHACK)default.icon $(NETHACK)NetHack.info $(NETHACK)NewGame.info \ $(NETHACK)HackWB.info inst-icons: $(INSTICONFILES) # Unpack the icons into place $(NETHACK)default.icon: $(AMI)dflticon.uu $(UUDEC) $(AMI)dflticon.uu # copy default.icon $(NETHACK)default.icon # delete default.icon $(NETHACK)NetHack.info: $(AMI)NHinfo.uu $(UUDEC) $(AMI)NHinfo.uu # copy NetHack.info $(NETHACK)NetHack.info # delete NetHack.info $(NETHACK)NewGame.info: $(AMI)NewGame.uu $(UUDEC) $(AMI)NewGame.uu # copy NewGame.info $(NETHACK)NewGame.info # delete NewGame.info $(NETHACK)HackWB.info: $(AMI)HackWB.uu $(UUDEC) $(AMI)HackWB.uu # copy HackWB.info $(NETHACK)HackWB.info # delete HackWB.info # If DLB is defined, create the nhdat library file in the playground # directory. If not, move all the data files there. $(NETHACK)nhdat: $(LIBFILES) $(SBIN)dlb list to T:nhdat.lst $(SLIB) QUICK NOHEAD FILES echo >T:make-nhdat $(SBIN)dlb cCfI $(SLIB) $(NETHACK)nhdat T:nhdat.lst echo >>T:make-nhdat if not exists $(NETHACK)nhdat echo >>T:make-nhdat copy $(SLIB)\#? $(NETHACK) echo >>T:make-nhdat endif execute T:make-nhdat -delete T:make-nhdat # DO NOT DELETE THIS LINE $(O)allmain.o: $(NHS)allmain.c $(HDEP) $(O)alloc.o: $(NHS)alloc.c $(I)config.h $(O)apply.o: $(NHS)apply.c $(HDEP) $(I)edog.h #SFD_INSTEAD #none $(CC) $(CFLAGS) $(CFLAGS2) $(OBJSPEC)$@ $(NHS)apply.c $(O)artifact.o: $(NHS)artifact.c $(HDEP) $(I)artifact.h $(I)artilist.h $(O)attrib.o: $(NHS)attrib.c $(HDEP) $(I)artifact.h $(O)ball.o: $(NHS)ball.c $(HDEP) $(O)bones.o: $(NHS)bones.c $(HDEP) $(I)lev.h $(O)botl.o: $(NHS)botl.c $(HDEP) $(O)cmd.o: $(NHS)cmd.c $(HDEP) $(I)func_tab.h $(O)dbridge.o: $(NHS)dbridge.c $(HDEP) $(O)decl.o: $(NHS)decl.c $(HDEP) $(I)quest.h $(O)detect.o: $(NHS)detect.c $(HDEP) $(I)artifact.h $(O)dig.o: $(NHS)dig.c $(HDEP) $(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) #SFD_INSTEAD $(CC) $(CFLAGS) $(OBJSPEC)%(left) $(NHS)monstr.c #none $(O)mplayer.o: $(NHS)mplayer.c $(HDEP) $(O)mthrowu.o: $(NHS)mthrowu.c $(HDEP) $(O)muse.o: $(NHS)muse.c $(HDEP) $(CC) $(CFLAGS) $(CFLAGS2) $(OBJSPEC)$@ $(NHS)muse.c $(O)music.o: $(NHS)music.c $(HDEP) #interp.c $(O)o_init.o: $(NHS)o_init.c $(HDEP) $(I)lev.h $(O)objects.o: $(NHS)objects.c $(I)config.h $(I)obj.h $(I)objclass.h \ $(I)prop.h $(I)skills.h $(I)color.h #SFD_INSTEAD #none $(CC) $(CFLAGS) $(INCLSPEC)$(NHS) $(OBJSPEC)$@ $(NHS)objects.c $(O)objnam.o: $(NHS)objnam.c $(HDEP) $(O)options.o: $(NHS)options.c $(HDEP) $(I)tcap.h $(I)config.h \ $(I)objclass.h $(I)flag.h $(O)pager.o: $(NHS)pager.c $(HDEP) $(I)dlb.h $(O)pickup.o: $(NHS)pickup.c $(HDEP) $(O)pline.o: $(NHS)pline.c $(HDEP) $(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 #SFD_INSTEAD #none $(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) #SFD_INSTEAD #none $(CC) $(CFLAGS) $(CFLAGS2) $(OBJSPEC)$@ $(NHS)trap.c $(O)u_init.o: $(NHS)u_init.c $(HDEP) $(O)uhitm.o: $(NHS)uhitm.c $(HDEP) $(CC) $(CFLAGS) $(CFLAGS2) $(OBJSPEC)$@ $(NHS)uhitm.c $(O)vault.o: $(NHS)vault.c $(HDEP) $(I)vault.h $(O)version.o: $(NHS)version.c $(HDEP) $(I)date.h $(I)patchlevel.h # DMake doesn't grok mid-line comments #SFD_INSTEAD $(O)vision.o: $(NHS)vision.c $(HDEP) $(O)vision.o: $(NHS)vision.c $(HDEP) #$(I)vis_tab.h $(O)weapon.o: $(NHS)weapon.c $(HDEP) $(O)were.o: $(NHS)were.c $(HDEP) $(O)wield.o: $(NHS)wield.c $(HDEP) $(O)windows.o: $(NHS)windows.c $(HDEP) $(I)wintty.h $(O)wizard.o: $(NHS)wizard.c $(HDEP) $(I)qtext.h $(O)worm.o: $(NHS)worm.c $(HDEP) $(I)lev.h $(O)worn.o: $(NHS)worn.c $(HDEP) $(O)write.o: $(NHS)write.c $(HDEP) $(O)zap.o: $(NHS)zap.c $(HDEP) $(CC) $(CFLAGS) $(CFLAGS2) $(OBJSPEC)$@ $(NHS)zap.c $(O)getline.o: $(TTY)getline.c $(HDEP) $(I)wintty.h $(O)termcap.o: $(TTY)termcap.c $(HDEP) $(I)wintty.h $(I)tcap.h $(O)topl.o: $(TTY)topl.c $(HDEP) $(I)wintty.h $(I)tcap.h $(O)wintty.o: $(TTY)wintty.c $(HDEP) $(I)wintty.h $(I)tcap.h \ $(I)patchlevel.h $(O)amitty.o: $(AMI)amitty.c $(HDEP) $(O)amistack.o: $(AMI)amistack.c $(CC) $(CFLAGS3) $(CSYM) $(OBJSPEC)$@ $(AMI)amistack.c $(O)rip.o: $(NHS)rip.c $(HDEP) $(I)config.h: $(I)config1.h $(I)tradstdc.h $(I)global.h -setdate $(I)config.h -wait 2 # onames.h handled at onames.h target, pm.h $(I)decl.h: $(I)quest.h $(I)spell.h $(I)color.h $(I)obj.h $(I)you.h -setdate $(I)decl.h -wait 2 $(I)global.h: $(I)coord.h $(I)pcconf.h $(I)amiconf.h -setdate $(I)global.h -wait 2 $(I)hack.h: $(I)config.h $(I)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 -wait 2 $(I)permonst.h: $(I)monattk.h $(I)monflag.h $(I)align.h -setdate $(I)permonst.h -wait 2 $(I)you.h: $(I)align.h $(I)attrib.h $(I)monst.h $(I)youprop.h $(I)skills.h -setdate $(I)you.h -wait 2 # pm.h handled at target $(I)youprop.h: $(I)prop.h $(I)permonst.h $(I)mondata.h -setdate $(I)youprop.h -wait 2 $(I)display.h: $(I)vision.h $(I)mondata.h -setdate $(I)display.h -wait 2 $(I)dungeon.h: $(I)align.h -setdate $(I)dungeon.h -wait 2 $(I)emin.h: $(I)dungeon.h -setdate $(I)emin.h -wait 2 $(I)epri.h: $(I)dungeon.h $(I)align.h -setdate $(I)epri.h -wait 2 $(I)eshk.h: $(I)dungeon.h -setdate $(I)eshk.h -wait 2 $(I)engrave.h: $(I)trampoli.h $(I)rect.h -setdate $(I)engrave.h -wait 2 $(I)mondata.h: $(I)align.h -setdate $(I)mondata.h -wait 2 $(I)monst.h: $(I)align.h -setdate $(I)monst.h -wait 2 $(I)pcconf.h: $(I)micro.h $(I)system.h -setdate $(I)pcconf.h -wait 2 $(I)rm.h: $(I)align.h -setdate $(I)rm.h -wait 2 $(I)vault.h: $(I)dungeon.h -setdate $(I)vault.h -wait 2 #notes # install keeps doing re-install because it keeps rebuilding lev_comp??? # fixed(?) - deleted setdate # make nhdat rebuils sys/amiga objects slashem-0.0.7E7F3/sys/amiga/Makefile.agc0000664000076400007640000011261010545462317015742 0ustar aliali# 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 slashem-0.0.7E7F3/sys/amiga/amimenu.c0000664000076400007640000001577010545462317015361 0ustar aliali/* SCCS Id: @(#)amimenu.c 3.2 96/02/04 */ /* Copyright (c) Olaf 'Rhialto' Seibert, 1989 */ /* Copyright (c) Kenneth Lorber, Bethesda, Maryland, 1992, 1993, 1996 */ /* Copyright (c) Janne Salmijärvi, 2000 */ /* NetHack may be freely redistributed. See license for details. */ /* Originally by John Toebes. */ /* GadTools menus by jhsa */ struct NewMenu GTHackMenu[] = { { NM_TITLE, "Commands", 0, 0, 0, 0}, { NM_ITEM, "? Display help menu", 0, 0, 0, (void *)'?'}, { NM_ITEM, "& Explain a command", 0, 0, 0, (void *)'&'}, { NM_ITEM, "O Set options", 0, 0, 0, (void *)'O'}, { NM_ITEM, "! AmigaDos command", 0, 0, 0, (void *)'!'}, { NM_ITEM, "v Version number", 0, 0, 0, (void *)'v'}, { NM_ITEM, "V Long version and game history", 0, 0, 0, (void *)'V'}, { NM_ITEM, "^R Redraw screen", 0, 0, 0, (void *)022}, { NM_ITEM, "^P Repeat previous messages", 0, 0, 0, (void *)020}, { NM_ITEM, "M-q #quit the game", 0, 0, 0, (void *)(128+'q')}, { NM_ITEM, "S Save the game", 0, 0, 0, (void *)'S'}, { NM_TITLE, "Inventory", 0, 0, 0, 0}, { NM_ITEM, "i Inventory", 0, 0, 0, (void *)'i'}, { NM_ITEM, "p Pay your bill", 0, 0, 0, (void *)'p'}, { NM_ITEM, "d Drop an object", 0, 0, 0, (void *)'d'}, { NM_ITEM, "D Drop several things", 0, 0, 0, (void *)'D'}, { NM_ITEM, ", Pickup an object", 0, 0, 0, (void *)','}, { NM_ITEM, "@ Toggle pickup", 0, 0, 0, (void *)'@'}, { NM_ITEM, "/ Identify something", 0, 0, 0, (void *)'/'}, { NM_ITEM, "C Christen a monster", 0, 0, 0, (void *)'C'}, { NM_ITEM, "+ List known spells", 0, 0, 0, (void *)'+'}, { NM_ITEM, "$ Your gold", 0, 0, 0, (void *)'$'}, { NM_TITLE, "Actions", 0, 0, 0, 0}, { NM_ITEM, "a Apply/use something", 0, 0, 0, (void *)'a'}, { NM_ITEM, "e Eat something", 0, 0, 0, (void *)'e'}, { NM_ITEM, "f Fire ammunition", 0, 0, 0, (void *)'f'}, { NM_ITEM, "F Fight a monster", 0, 0, 0, (void *)'F'}, { NM_ITEM, "q Quaff a monster", 0, 0, 0, (void *)'q'}, { NM_ITEM, "r Read scroll/book", 0, 0, 0, (void *)'r'}, { NM_ITEM, "t Throw something", 0, 0, 0, (void *)'t'}, { NM_ITEM, "z Zap a wand", 0, 0, 0, (void *)'z'}, { NM_ITEM, "Z Cast a spell", 0, 0, 0, (void *)'Z'}, { NM_TITLE, "Preparations", 0, 0, 0, 0}, { NM_ITEM, "A Remove all armor", 0, 0, 0, (void *)'A'}, { NM_ITEM, "P Put on a ring", 0, 0, 0, (void *)'P'}, { NM_ITEM, "R Remove ring", 0, 0, 0, (void *)'R'}, { NM_ITEM, "Q Select ammunition for quiver", 0, 0, 0, (void *)'Q'}, { NM_ITEM, "T Take off armor", 0, 0, 0, (void *)'T'}, { NM_ITEM, "w Wield a weapon", 0, 0, 0, (void *)'w'}, { NM_ITEM, "W Wear armor", 0, 0, 0, (void *)'W'}, { NM_ITEM, "x Swap wielded and secondary weapons", 0, 0, 0, (void *)'x'}, { NM_ITEM, ") Current weapon", 0, 0, 0, (void *)')'}, { NM_ITEM, "[ Current armor", 0, 0, 0, (void *)'['}, { NM_ITEM, "= Current rings", 0, 0, 0, (void *)'='}, { NM_ITEM,"\" Current amulet", 0, 0, 0, (void *)'"'}, { NM_ITEM, "( Current tools", 0, 0, 0, (void *)'('}, { NM_ITEM, "* Current equipment", 0, 0, 0, (void *)'*'}, { NM_TITLE, "Movement", 0, 0, 0, 0}, { NM_ITEM, "o Open door", 0, 0, 0, (void *)'o'}, { NM_ITEM, "c Close door", 0, 0, 0, (void *)'c'}, { NM_ITEM, "^D Kick door", 0, 0, 0, (void *)004}, { NM_ITEM, "s Search", 0, 0, 0, (void *)'s'}, { NM_ITEM, "< Go up stairs", 0, 0, 0, (void *)'<'}, { NM_ITEM, "> Go down stairs", 0, 0, 0, (void *)'>'}, { NM_ITEM, "^T Teleport", 0, 0, 0, (void *)024}, { NM_ITEM, ". Wait a moment", 0, 0, 0, (void *)'.'}, { NM_ITEM, "E Engrave message on floor", 0, 0, 0, (void *)'E'}, { NM_TITLE, "Extended", 0, 0, 0, 0}, { NM_ITEM, "M-a #adjust inventory letters", 0, 0, 0, (void *)(128+'a')}, { NM_ITEM, "M-c #chat with someone", 0, 0, 0, (void *)(128+'c')}, { NM_ITEM, "M-d #dip an object into something", 0, 0, 0, (void *)(128+'d')}, #ifdef WEAPON_SKILLS { NM_ITEM, "M-e #enhance weapon skills", 0, 0, 0, (void *)(128+'e')}, #endif { NM_ITEM, "M-f #force a lock", 0, 0, 0, (void *)(128+'f')}, { NM_ITEM, "M-i #invoke an object's special powers", 0, 0, 0, (void *)(128+'i')}, { NM_ITEM, "M-j #jump to another location", 0, 0, 0, (void *)(128+'j')}, { NM_ITEM, "M-l #loot a box on the floor", 0, 0, 0, (void *)(128+'l')}, { NM_ITEM, "M-m Use a #monster's special ability", 0, 0, 0, (void *)(128+'m')}, { NM_ITEM, "M-n #name an item or type of object", 0, 0, 0, (void *)(128+'n')}, { NM_ITEM, "M-o #offer a sacrifice to the gods", 0, 0, 0, (void *)(128+'o')}, { NM_ITEM, "M-p #pray to the gods for help", 0, 0, 0, (void *)(128+'p')}, { NM_ITEM, "M-q #quit the game", 0, 0, 0, (void *)(128+'q')}, { NM_ITEM, "M-r #rub a lamp", 0, 0, 0, (void *)(128+'r')}, { NM_ITEM, "M-s #sit down", 0, 0, 0, (void *)(128+'s')}, { NM_ITEM, "M-t #turn undead", 0, 0, 0, (void *)(128+'t')}, { NM_ITEM, "M-u #untrap something", 0, 0, 0, (void *)(128+'u')}, { NM_ITEM, "M-v Long #version information", 0, 0, 0, (void *)(128+'v')}, { 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} }; slashem-0.0.7E7F3/sys/amiga/clipwin.c0000664000076400007640000002153410545462317015366 0ustar alialistatic USHORT Palette[] = { 0x0AAA, /* color #0 */ 0x0000, /* color #1 */ 0x0FFF, /* color #2 */ 0x058B, /* color #3 */ 0x000F, /* color #4 */ 0x0F0F, /* color #5 */ 0x00FF, /* color #6 */ 0x0FFF /* color #7 */ #define PaletteColorCount 8 }; #define PALETTE Palette static SHORT ClipBorderVectors1[] = { 0,0, 76,0, 76,11, 0,11, 0,0 }; static struct Border ClipBorder1 = { -1,-1, /* XY origin relative to container TopLeft */ 3,0,JAM1, /* front pen, back pen and drawmode */ 5, /* number of XY vectors */ ClipBorderVectors1, /* pointer to XY vectors */ NULL /* next border in list */ }; static struct IntuiText ClipIText1 = { 4,0,JAM1, /* front and back text pens, drawmode and fill byte */ 15,1, /* XY origin relative to container TopLeft */ NULL, /* font pointer or NULL for default */ "Cancel", /* pointer to text */ NULL /* next IntuiText structure */ }; static struct Gadget ClipCancel = { NULL, /* next gadget */ 240,59, /* origin XY of hit box relative to window TopLeft */ 75,10, /* hit box width and height */ NULL, /* gadget flags */ RELVERIFY, /* activation flags */ BOOLGADGET, /* gadget type flags */ (APTR)&ClipBorder1, /* gadget border or image to be rendered */ NULL, /* alternate imagery for selection */ &ClipIText1, /* first IntuiText structure */ NULL, /* gadget mutual-exclude long word */ NULL, /* SpecialInfo structure */ GADCANCEL, /* user-definable data */ NULL /* pointer to user-definable data */ }; static SHORT ClipBorderVectors2[] = { 0,0, 78,0, 78,11, 0,11, 0,0 }; static struct Border ClipBorder2 = { -1,-1, /* XY origin relative to container TopLeft */ 3,0,JAM1, /* front pen, back pen and drawmode */ 5, /* number of XY vectors */ ClipBorderVectors2, /* pointer to XY vectors */ NULL /* next border in list */ }; static struct IntuiText ClipIText2 = { 4,0,JAM1, /* front and back text pens, drawmode and fill byte */ 24,1, /* XY origin relative to container TopLeft */ NULL, /* font pointer or NULL for default */ "Okay", /* pointer to text */ NULL /* next IntuiText structure */ }; static struct Gadget ClipOkay = { &ClipCancel, /* next gadget */ 17,60, /* origin XY of hit box relative to window TopLeft */ 77,10, /* hit box width and height */ NULL, /* gadget flags */ RELVERIFY, /* activation flags */ BOOLGADGET, /* gadget type flags */ (APTR)&ClipBorder2, /* gadget border or image to be rendered */ NULL, /* alternate imagery for selection */ &ClipIText2, /* first IntuiText structure */ NULL, /* gadget mutual-exclude long word */ NULL, /* SpecialInfo structure */ GADOKAY, /* user-definable data */ NULL /* pointer to user-definable data */ }; static struct PropInfo ClipClipXCLIPSInfo = { AUTOKNOB+FREEHORIZ, /* PropInfo flags */ 24504,-1, /* horizontal and vertical pot values */ 10922,-1, /* horizontal and vertical body values */ }; static struct Image ClipImage1 = { 43,0, /* XY origin relative to container TopLeft */ 24,3, /* Image width and height in pixels */ 0, /* number of bitplanes in Image */ NULL, /* pointer to ImageData */ 0x0000,0x0000, /* PlanePick and PlaneOnOff */ NULL /* next Image structure */ }; static struct IntuiText ClipIText3 = { 3,0,JAM1, /* front and back text pens, drawmode and fill byte */ -116,-1, /* XY origin relative to container TopLeft */ NULL, /* font pointer or NULL for default */ "X Clip Border:", /* pointer to text */ NULL /* next IntuiText structure */ }; static struct Gadget ClipXCLIP = { &ClipOkay, /* next gadget */ 134,37, /* origin XY of hit box relative to window TopLeft */ -199,7, /* hit box width and height */ GRELWIDTH, /* gadget flags */ RELVERIFY+GADGIMMEDIATE, /* activation flags */ PROPGADGET, /* gadget type flags */ (APTR)&ClipImage1, /* gadget border or image to be rendered */ NULL, /* alternate imagery for selection */ &ClipIText3, /* first IntuiText structure */ NULL, /* gadget mutual-exclude long word */ (APTR)&ClipClipXCLIPSInfo, /* SpecialInfo structure */ XCLIP, /* user-definable data */ NULL /* pointer to user-definable data */ }; static struct PropInfo ClipClipYCLIPSInfo = { AUTOKNOB+FREEHORIZ, /* PropInfo flags */ 13106,-1, /* horizontal and vertical pot values */ 10922,-1, /* horizontal and vertical body values */ }; static struct Image ClipImage2 = { 22,0, /* XY origin relative to container TopLeft */ 24,3, /* Image width and height in pixels */ 0, /* number of bitplanes in Image */ NULL, /* pointer to ImageData */ 0x0000,0x0000, /* PlanePick and PlaneOnOff */ NULL /* next Image structure */ }; static struct IntuiText ClipIText4 = { 3,0,JAM1, /* front and back text pens, drawmode and fill byte */ -116,-1, /* XY origin relative to container TopLeft */ NULL, /* font pointer or NULL for default */ "Y Clip Border:", /* pointer to text */ NULL /* next IntuiText structure */ }; static struct Gadget ClipYCLIP = { &ClipXCLIP, /* next gadget */ 134,46, /* origin XY of hit box relative to window TopLeft */ -199,7, /* hit box width and height */ GRELWIDTH, /* gadget flags */ RELVERIFY+GADGIMMEDIATE, /* activation flags */ PROPGADGET, /* gadget type flags */ (APTR)&ClipImage2, /* gadget border or image to be rendered */ NULL, /* alternate imagery for selection */ &ClipIText4, /* first IntuiText structure */ NULL, /* gadget mutual-exclude long word */ (APTR)&ClipClipYCLIPSInfo, /* SpecialInfo structure */ YCLIP, /* user-definable data */ NULL /* pointer to user-definable data */ }; static struct PropInfo ClipClipXSIZESInfo = { AUTOKNOB+FREEHORIZ, /* PropInfo flags */ 26212,-1, /* horizontal and vertical pot values */ 10922,-1, /* horizontal and vertical body values */ }; static struct Image ClipImage3 = { 45,0, /* XY origin relative to container TopLeft */ 24,3, /* Image width and height in pixels */ 0, /* number of bitplanes in Image */ NULL, /* pointer to ImageData */ 0x0000,0x0000, /* PlanePick and PlaneOnOff */ NULL /* next Image structure */ }; static struct IntuiText ClipIText5 = { 3,0,JAM1, /* front and back text pens, drawmode and fill byte */ -124,-1, /* XY origin relative to container TopLeft */ NULL, /* font pointer or NULL for default */ "X Scale Factor:", /* pointer to text */ NULL /* next IntuiText structure */ }; static struct Gadget ClipXSIZE = { &ClipYCLIP, /* next gadget */ 134,15, /* origin XY of hit box relative to window TopLeft */ -199,7, /* hit box width and height */ GRELWIDTH, /* gadget flags */ RELVERIFY+GADGIMMEDIATE, /* activation flags */ PROPGADGET, /* gadget type flags */ (APTR)&ClipImage3, /* gadget border or image to be rendered */ NULL, /* alternate imagery for selection */ &ClipIText5, /* first IntuiText structure */ NULL, /* gadget mutual-exclude long word */ (APTR)&ClipClipXSIZESInfo, /* SpecialInfo structure */ XSIZE, /* user-definable data */ NULL /* pointer to user-definable data */ }; static struct PropInfo ClipClipYSIZESInfo = { AUTOKNOB+FREEHORIZ, /* PropInfo flags */ -25937,-1, /* horizontal and vertical pot values */ 10922,-1, /* horizontal and vertical body values */ }; static struct Image ClipImage4 = { 69,0, /* XY origin relative to container TopLeft */ 24,3, /* Image width and height in pixels */ 0, /* number of bitplanes in Image */ NULL, /* pointer to ImageData */ 0x0000,0x0000, /* PlanePick and PlaneOnOff */ NULL /* next Image structure */ }; static struct IntuiText ClipIText6 = { 3,0,JAM1, /* front and back text pens, drawmode and fill byte */ -124,-1, /* XY origin relative to container TopLeft */ NULL, /* font pointer or NULL for default */ "Y Scale Factor:", /* pointer to text */ NULL /* next IntuiText structure */ }; static struct Gadget ClipYSIZE = { &ClipXSIZE, /* next gadget */ 134,24, /* origin XY of hit box relative to window TopLeft */ -199,7, /* hit box width and height */ GRELWIDTH, /* gadget flags */ RELVERIFY+GADGIMMEDIATE, /* activation flags */ PROPGADGET, /* gadget type flags */ (APTR)&ClipImage4, /* gadget border or image to be rendered */ NULL, /* alternate imagery for selection */ &ClipIText6, /* first IntuiText structure */ NULL, /* gadget mutual-exclude long word */ (APTR)&ClipClipYSIZESInfo, /* SpecialInfo structure */ YSIZE, /* user-definable data */ NULL /* pointer to user-definable data */ }; #define ClipGadgetList1 ClipYSIZE static struct NewWindow ClipNewWindowStructure1 = { 114,16, /* window XY origin relative to TopLeft of screen */ 346,76, /* window width and height */ 0,1, /* detail and block pens */ NEWSIZE+MOUSEMOVE+GADGETDOWN+GADGETUP+CLOSEWINDOW+ACTIVEWINDOW+VANILLAKEY+INTUITICKS, /* IDCMP flags */ WINDOWSIZING+WINDOWDRAG+WINDOWDEPTH+WINDOWCLOSE+ACTIVATE+NOCAREREFRESH, /* other window flags */ &ClipYSIZE, /* first gadget in gadget list */ NULL, /* custom CHECKMARK imagery */ "Edit Clipping Parameters", /* window title */ NULL, /* custom screen pointer */ NULL, /* custom bitmap */ 350,76, /* minimum width and height */ -1,-1, /* maximum width and height */ CUSTOMSCREEN /* destination screen type */ }; /* end of PowerWindows source generation */ slashem-0.0.7E7F3/sys/amiga/amigst.c0000664000076400007640000000174510545462317015207 0ustar aliali/* SCCS Id: @(#)amigst.c 3.1 93/01/08 /* Copyright (c) Gregg Wonderly, Naperville, IL, 1992, 1993 */ /* NetHack may be freely redistributed. See license for details. */ #include #include #include #include #include #include #include #include #include #include #include #undef strcmpi #include #include #ifdef __SASC #include /* for __emit */ #include #include #include #include #include #include #include #endif #include "hack.h" #include "winprocs.h" #include "winami.h" #ifdef AZTEC #include #endif #include "NH:sys/amiga/winami.p" #include "NH:sys/amiga/amiwind.p" #include "NH:sys/amiga/amidos.p" /* end amigst.c */ slashem-0.0.7E7F3/sys/amiga/ifchange0000664000076400007640000000221710545462317015241 0ustar aliali.KEY oper/a,tmp/a,real/a,f1,f2,f3,f4,f5 . ; miscellaneous script functions for the Amiga . ; SCCS Id: @(#)ifchange 3.2 96/02/04 . ; Copyright (c) Kenneth Lorber, Bethesda, Maryland, 1992, 1993, 1996. . ; NetHack may be freely redistributed. See license for details. FAILAT 6 IF EQ "MOVE" IF EXISTS diff >T:mic -c search from T:mic SEARCH "---" QUIET IF WARN echo "MOVE: no change" delete ELSE echo "MOVE: copy" copy clone delete ENDIF ELSE echo "MOVE: copy2" copy clone delete ENDIF QUIT ENDIF IF EQ "TOUCH" IF EXISTS diff >T:mic -c search from T:mic SEARCH "---" QUIET IF NOT WARN echo "TOUCH: touch" IF NOT EQ "@" setdate ENDIF IF NOT EQ "@" setdate ENDIF IF NOT EQ "@" setdate ENDIF IF NOT EQ "@" setdate ENDIF IF NOT EQ "@" setdate ENDIF ENDIF ENDIF QUIT ENDIF echo "ifchange: '' not recognized" quit 10 slashem-0.0.7E7F3/sys/amiga/winfuncs.c0000664000076400007640000016531710545462317015565 0ustar aliali/* SCCS Id: @(#)winfuncs.c 3.1 2000/01/12 */ /* Copyright (c) Gregg Wonderly, Naperville, Illinois, 1991,1992,1993,1996. */ /* NetHack may be freely redistributed. See license for details. */ #include "NH:sys/amiga/windefs.h" #include "NH:sys/amiga/winext.h" #include "NH:sys/amiga/winproto.h" #include "patchlevel.h" extern struct TagItem scrntags[]; static BitMapHeader amii_bmhd; static void cursor_common(struct RastPort *, int, int); #ifdef CLIPPING int CO, LI; /* Changing clipping region, skip clear of screen in overview window. */ int reclip; /* Must be set to at least two or you will get stuck! */ int xclipbord = 4, yclipbord = 2; #endif int mxsize, mysize; struct Rectangle amii_oldover; struct Rectangle amii_oldmsg; extern struct TextFont *RogueFont; int amii_msgAPen; int amii_msgBPen; int amii_statAPen; int amii_statBPen; int amii_menuAPen; int amii_menuBPen; int amii_textAPen; int amii_textBPen; int amii_otherAPen; int amii_otherBPen; long amii_libvers = LIBRARY_FONT_VERSION; void ami_wininit_data( void ) { extern unsigned short amii_init_map[ AMII_MAXCOLORS ]; extern unsigned short amiv_init_map[ AMII_MAXCOLORS ]; if( !WINVERS_AMIV ) { # ifdef TEXTCOLOR amii_numcolors = 8; # else amii_numcolors = 4; # endif amii_defpens[ 0 ] = C_BLACK; /* DETAILPEN */ amii_defpens[ 1 ] = C_BLUE; /* BLOCKPEN */ amii_defpens[ 2 ] = C_BROWN; /* TEXTPEN */ amii_defpens[ 3 ] = C_WHITE; /* SHINEPEN */ amii_defpens[ 4 ] = C_BLUE; /* SHADOWPEN */ amii_defpens[ 5 ] = C_CYAN; /* FILLPEN */ amii_defpens[ 6 ] = C_WHITE; /* FILLTEXTPEN */ amii_defpens[ 7 ] = C_CYAN; /* BACKGROUNDPEN */ amii_defpens[ 8 ] = C_RED; /* HIGHLIGHTTEXTPEN */ amii_defpens[ 9 ] = C_WHITE; /* BARDETAILPEN */ amii_defpens[ 10 ] = C_CYAN; /* BARBLOCKPEN */ amii_defpens[ 11 ] = C_BLUE; /* BARTRIMPEN */ amii_defpens[ 12 ] = (unsigned short) ~0; amii_msgAPen = C_WHITE; amii_msgBPen = C_BLACK; amii_statAPen = C_WHITE; amii_statBPen = C_BLACK; amii_menuAPen = C_WHITE; amii_menuBPen = C_BLACK; amii_textAPen = C_WHITE; amii_textBPen = C_BLACK; amii_otherAPen = C_RED; amii_otherBPen = C_BLACK; mxsize = 8; mysize = 8; amii_libvers = LIBRARY_FONT_VERSION; memcpy( amii_initmap, amii_init_map, sizeof( amii_initmap ) ); } else { mxsize = 16; mysize = 16; amii_numcolors = 16; amii_defpens[ 0 ] = C_BLACK; /* DETAILPEN */ amii_defpens[ 1 ] = C_WHITE; /* BLOCKPEN */ amii_defpens[ 2 ] = C_BLACK; /* TEXTPEN */ amii_defpens[ 3 ] = C_CYAN; /* SHINEPEN */ amii_defpens[ 4 ] = C_BLUE; /* SHADOWPEN */ amii_defpens[ 5 ] = C_GREYBLUE; /* FILLPEN */ amii_defpens[ 6 ] = C_LTGREY; /* FILLTEXTPEN */ amii_defpens[ 7 ] = C_GREYBLUE; /* BACKGROUNDPEN */ amii_defpens[ 8 ] = C_RED; /* HIGHLIGHTTEXTPEN */ amii_defpens[ 9 ] = C_WHITE; /* BARDETAILPEN */ amii_defpens[ 10] = C_GREYBLUE; /* BARBLOCKPEN */ amii_defpens[ 11] = C_BLUE; /* BARTRIMPEN */ amii_defpens[ 12] = (unsigned short) ~0; amii_msgAPen = C_WHITE; amii_msgBPen = C_GREYBLUE; amii_statAPen = C_WHITE; amii_statBPen = C_GREYBLUE; amii_menuAPen = C_BLACK; amii_menuBPen = C_LTGREY; amii_textAPen = C_BLACK; amii_textBPen = C_LTGREY; amii_otherAPen = C_RED; amii_otherBPen = C_BLACK; amii_libvers = LIBRARY_TILE_VERSION; memcpy( amii_initmap, amiv_init_map, sizeof( amii_initmap ) ); } #ifdef OPT_DISPMAP dispmap_sanity(); #endif memcpy(flags.amii_dripens,amii_defpens,sizeof(flags.amii_dripens)); } # 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 void amii_destroy_nhwindow(win) /* just hide */ register winid win; { int i; int type; register struct amii_WinDesc *cw; if( win == WIN_ERR || ( cw = amii_wins[win] ) == NULL ) { panic(winpanicstr,win,"destroy_nhwindow"); } if( WINVERS_AMIV ) { if( cw->type == NHW_MAP ) { /* If inventory is up, close it now, it will be freed later */ if( alwaysinvent && WIN_INVEN != WIN_ERR && amii_wins[ WIN_INVEN ] && amii_wins[ WIN_INVEN ]->win ) { dismiss_nhwindow( WIN_INVEN ); } /* Tear down overview window if it is up */ if( WIN_OVER != WIN_ERR ) { amii_destroy_nhwindow( WIN_OVER ); WIN_OVER = WIN_ERR; } } else if( cw->type == NHW_OVER ) { struct Window *w = amii_wins[ WIN_OVER ]->win; amii_oldover.MinX = w->LeftEdge; amii_oldover.MinY = w->TopEdge; amii_oldover.MaxX = w->Width; amii_oldover.MaxY = w->Height; if( WIN_MESSAGE != WIN_ERR && amii_wins[ WIN_MESSAGE ] ) { w = amii_wins[ WIN_MESSAGE ]->win; amii_oldmsg.MinX = w->LeftEdge; amii_oldmsg.MinY = w->TopEdge; amii_oldmsg.MaxX = w->Width; amii_oldmsg.MaxY = w->Height; SizeWindow( amii_wins[ WIN_MESSAGE ]->win, (amiIDisplay->xpix - amii_wins[ WIN_MESSAGE ]->win->LeftEdge) - amii_wins[ WIN_MESSAGE ]->win->Width, 0 ); } } } /* Tear down the Intuition stuff */ 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 ) ) { for( i = 0; i < cw->maxrow; ++i ) { if( cw->data[ i ] ) free( cw->data[ i ] ); } free( cw->data ); } free( cw ); amii_wins[win] = NULL; /* Set globals to WIN_ERR for known one-of-a-kind windows. */ if( win == WIN_MAP) WIN_MAP = WIN_ERR; else if( win == WIN_STATUS) WIN_STATUS = WIN_ERR; else if( win == WIN_MESSAGE) WIN_MESSAGE = WIN_ERR; else if( win == WIN_INVEN) WIN_INVEN = WIN_ERR; } #ifdef INTUI_NEW_LOOK struct FillParams { struct Layer *layer; struct Rectangle bounds; WORD offsetx; 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; memcpy(&rptmp, rp, sizeof(struct RastPort)); rptmp.Layer = NULL; switch( (int)hk->h_Data ) { case NHW_STATUS: apen = amii_statBPen; break; case NHW_MESSAGE: apen = amii_msgBPen; break; case NHW_TEXT: apen = amii_textBPen; break; case NHW_MENU: apen = amii_menuBPen; break; case -2: apen = amii_otherBPen; break; case NHW_BASE: case NHW_MAP: case NHW_OVER: default: apen = C_BLACK; break; } x = fp->bounds.MinX; y = fp->bounds.MinY; xmax = fp->bounds.MaxX; ymax = fp->bounds.MaxY; SetAPen(&rptmp, apen); SetBPen(&rptmp, apen); SetDrMd(&rptmp, JAM2); RectFill(&rptmp, x, y, xmax, ymax); } #endif amii_create_nhwindow(type) register int type; { register struct Window *w = NULL; register struct NewWindow *nw = NULL; register struct amii_WinDesc *wd = NULL; struct Window *mapwin = NULL, *stwin = NULL, *msgwin = NULL; register int newid; int maph, stath, scrfontysize; scrfontysize = HackScreen->Font->ta_YSize; /* * Initial mapwindow height, this might change later in tilemode * and low screen */ maph = ( 21 * mxsize ) + 2 + (bigscreen ? HackScreen->WBorTop + HackScreen->WBorBottom + scrfontysize + 1 : 0); /* Status window height, avoids having to calculate many times */ stath = txheight * 2 + 2 + (WINVERS_AMIV || bigscreen ? HackScreen->WBorTop + HackScreen->WBorBottom + ( bigscreen ? scrfontysize + 1 : 0 ) : 0); if( WIN_STATUS != WIN_ERR && amii_wins[ WIN_STATUS ] ) stwin = amii_wins[ WIN_STATUS ]->win; if( WIN_MESSAGE != WIN_ERR && amii_wins[ WIN_MESSAGE ] ) msgwin = amii_wins[ WIN_MESSAGE ]->win; if( WIN_MAP != WIN_ERR && amii_wins[ WIN_MAP ] ) mapwin = amii_wins[ WIN_MAP ]->win; /* Create Port anytime that we need it */ if( HackPort == NULL ) { HackPort = CreateMsgPort(); if( !HackPort ) panic( "no memory for msg port" ); } nw = &new_wins[ type ].newwin; nw->Width = amiIDisplay->xpix; nw->Screen = HackScreen; if( WINVERS_AMIV ) { nw->DetailPen = C_WHITE; nw->BlockPen = C_GREYBLUE; } else { nw->DetailPen = C_WHITE; nw->BlockPen = C_BLACK; } if ( type == NHW_BASE ) { nw->LeftEdge = 0; nw->TopEdge = HackScreen->BarHeight+1; nw->Width = HackScreen->Width; nw->Height = HackScreen->Height - nw->TopEdge; } else if( !WINVERS_AMIV && type == NHW_MAP ) { nw->LeftEdge = 0; nw->Height = maph; if( msgwin && stwin ) { nw->TopEdge = stwin->TopEdge - maph; } else { panic( "msgwin and stwin must open before map" ); } if (nw->TopEdge < 0) panic( "Too small screen to fit map" ); } else if( type == NHW_MAP && WINVERS_AMIV ) { struct Window *w; w = amii_wins[ WIN_MESSAGE ]->win; nw->LeftEdge = 0; nw->TopEdge = w->TopEdge + w->Height; nw->Width = amiIDisplay->xpix - nw->LeftEdge; w = amii_wins[ WIN_STATUS ]->win; nw->Height = w->TopEdge - nw->TopEdge; nw->MaxHeight = 0xffff; nw->MaxWidth = 0xffff; if( nw->TopEdge + nw->Height > amiIDisplay->ypix - 1 ) nw->Height = amiIDisplay->ypix - nw->TopEdge - 1; } else if( type == NHW_STATUS ) { if( !WINVERS_AMIV && ( WIN_MAP != WIN_ERR && amii_wins[ WIN_MAP ] ) ) w = amii_wins[ WIN_MAP ]->win; else if( WIN_BASE != WIN_ERR && amii_wins[ WIN_BASE ] ) w = amii_wins[ WIN_BASE ]->win; else panic( "No window to base STATUS location from" ); nw->Height = stath; nw->TopEdge = amiIDisplay->ypix - nw->Height; nw->LeftEdge = w->LeftEdge; if( nw->LeftEdge + nw->Width >= amiIDisplay->xpix ) nw->LeftEdge = 0; if( nw->Width >= amiIDisplay->xpix - nw->LeftEdge ) nw->Width = amiIDisplay->xpix - nw->LeftEdge; } else if( WINVERS_AMIV && type == NHW_OVER ) { nw->Flags |= WINDOWSIZING|WINDOWDRAG|WINDOWCLOSE; nw->IDCMPFlags |= CLOSEWINDOW; /* Bring up window as half the width of the message window, and make * the message window change to one half the width... */ if( amii_oldover.MaxX != 0 ) { nw->LeftEdge = amii_oldover.MinX; nw->TopEdge = amii_oldover.MinY; nw->Width = amii_oldover.MaxX; nw->Height = amii_oldover.MaxY; ChangeWindowBox( amii_wins[ WIN_MESSAGE ]->win, amii_oldmsg.MinX, amii_oldmsg.MinY, amii_oldmsg.MaxX, amii_oldmsg.MaxY ); } else { nw->LeftEdge = (amii_wins[ WIN_MESSAGE ]->win->Width*4)/9; nw->TopEdge = amii_wins[ WIN_MESSAGE ]->win->TopEdge; nw->Width = amiIDisplay->xpix - nw->LeftEdge; nw->Height = amii_wins[ WIN_MESSAGE ]->win->Height; SizeWindow( amii_wins[ WIN_MESSAGE ]->win, nw->LeftEdge - amii_wins[ WIN_MESSAGE ]->win->Width, 0 ); } } else if( type == NHW_MESSAGE ) { if( !WINVERS_AMIV && ( WIN_MAP != WIN_ERR && amii_wins[ WIN_MAP ] ) ) w = amii_wins[ WIN_MAP ]->win; else if( WIN_BASE != WIN_ERR && amii_wins[ WIN_BASE ] ) w = amii_wins[ WIN_BASE ]->win; else panic( "No window to base STATUS location from" ); nw->TopEdge = bigscreen ? HackScreen->BarHeight+1 : 0; /* Assume highest possible message window */ nw->Height = HackScreen->Height - nw->TopEdge - maph - stath; /* In tilemode we can cope with this */ if (WINVERS_AMIV && nw->Height < 0) nw->Height = 0; /* If in fontmode messagewindow is too small, open it with 3 lines and overlap it with map */ if (nw->Height < txheight+2) { nw->Height = txheight*4 + 3 + HackScreen->WBorTop + HackScreen->WBorBottom; } if ((nw->Height-2)/txheight < 3) { scrollmsg = 0; nw->Title = 0; } else { nw->FirstGadget = &MsgScroll; nw->Flags |= WINDOWSIZING|WINDOWDRAG; nw->Flags &= ~BORDERLESS; if( WINVERS_AMIV || nw->Height == 0) { if( WINVERS_AMIV ) { nw->Height = TextsFont->tf_YSize + HackScreen->WBorTop + 3 + HackScreen->WBorBottom; if( bigscreen ) nw->Height += ( txheight * 6 ); else nw->Height += ( txheight * 3 ); } else { nw->Height = HackScreen->Height - nw->TopEdge - stath - maph; } } } /* Do we have room for larger message window ? * This is possible if we can show full height map in tile * mode with default scaling. */ if (nw->Height + stath + maph < HackScreen->Height - nw->TopEdge ) nw->Height = HackScreen->Height - nw->TopEdge - 1 - maph - stath; #ifdef INTUI_NEW_LOOK if( IntuitionBase->LibNode.lib_Version >= 37 ) { MsgPropScroll.Flags |= PROPNEWLOOK; PropScroll.Flags |= PROPNEWLOOK; } #endif } nw->IDCMPFlags |= MENUPICK; /* Check if there is "Room" for all this stuff... */ if( ( WINVERS_AMIV || bigscreen ) && type != NHW_BASE ) { nw->Flags &= ~( BORDERLESS | BACKDROP ); if( WINVERS_AMIV ) { if( type == NHW_STATUS ) { nw->Flags &= ~( WINDOWDRAG | WINDOWDEPTH | SIZEBRIGHT | WINDOWSIZING ); nw->IDCMPFlags &= ~NEWSIZE; } else { nw->Flags |= ( WINDOWDRAG | WINDOWDEPTH | SIZEBRIGHT | WINDOWSIZING ); nw->IDCMPFlags |= NEWSIZE; } } else { if( HackScreen->Width < 657 ) { nw->Flags |= ( WINDOWDRAG | WINDOWDEPTH ); } else { nw->Flags |= ( WINDOWDRAG | WINDOWDEPTH | SIZEBRIGHT ); } } } if ( WINVERS_AMII && type == NHW_MAP ) nw->Flags &= ~WINDOWSIZING; if ( type == NHW_MESSAGE && scrollmsg ) { nw->Flags |= WINDOWDRAG|WINDOWDEPTH|SIZEBRIGHT|WINDOWSIZING; nw->Flags &= ~BORDERLESS; } /* No titles on a hires only screen except for messagewindow */ if( !(WINVERS_AMIV && type == NHW_MAP) && !bigscreen && type != NHW_MESSAGE ) nw->Title = 0; wd = (struct amii_WinDesc *)alloc(sizeof(struct amii_WinDesc)); memset( wd, 0, sizeof( struct amii_WinDesc ) ); /* Both, since user may have changed the pen settings so respect those */ if( WINVERS_AMII || WINVERS_AMIV ) { /* Special backfill for these types of layers */ switch( type ) { case NHW_MESSAGE: case NHW_STATUS: case NHW_TEXT: case NHW_MENU: case NHW_BASE: case NHW_OVER: case NHW_MAP: if( wd ) { #ifdef __GNUC__ fillhook.h_Entry = (void *)&LayerFillHook; #else fillhook.h_Entry = (ULONG(*)())LayerFillHook; #endif fillhook.h_Data = (void *)type; fillhook.h_SubEntry = 0; wd->hook = alloc( sizeof( fillhook ) ); memcpy( wd->hook, &fillhook, sizeof( fillhook ) ); memcpy( wd->wintags, wintags, sizeof( wd->wintags) ); wd->wintags[0].ti_Data = (long)wd->hook; nw->Extension = (void *)wd->wintags; } break; } } /* Don't open MENU or TEXT windows yet */ if( type == NHW_MENU || type == NHW_TEXT ) w = NULL; else w=OpenShWindow( (void *)nw ); if( w == NULL && type != NHW_MENU && type != NHW_TEXT ) { char buf[ 100 ]; sprintf( buf, "nw type (%d) dims l: %d, t: %d, w: %d, h: %d", type, nw->LeftEdge, nw->TopEdge, nw->Width, nw->Height ); raw_print( buf ); panic("bad openwin %d",type); } /* Check for an empty slot */ for(newid = 0; newid wincnt ) wincnt = newid; /* Do common initialization */ amii_wins[newid] = wd; wd->newwin = NULL; wd->win = w; wd->type = type; wd->wflags = 0; wd->active = FALSE; wd->curx=wd->cury = 0; wd->resp = wd->canresp = wd->morestr = 0; /* CHECK THESE */ wd->maxrow = new_wins[type].maxrow; wd->maxcol = new_wins[type].maxcol; if( type != NHW_TEXT && type != NHW_MENU ) { if( TextsFont && ( type == NHW_MESSAGE || type == NHW_STATUS ) ) { SetFont(w->RPort, TextsFont); txheight = w->RPort->TxHeight; txwidth = w->RPort->TxWidth; txbaseline = w->RPort->TxBaseline; if( type == NHW_MESSAGE ) { if (scrollmsg ) { if( WINVERS_AMIV ) { WindowLimits( w, 100, w->BorderTop + w->BorderBottom + ((txheight+1)*2) + 1, 0, 0 ); } else { WindowLimits( w, w->Width, w->BorderTop + w->BorderBottom + ((txheight+1)*2) + 1, 0, 0 ); } } else { WindowLimits( w, w->Width, w->BorderTop + w->BorderBottom + txheight + 2, 0, 0 ); } } } if ( type != NHW_MAP) { SetFont(w->RPort, TextsFont); } #ifdef HACKFONT else if( HackFont ) SetFont(w->RPort, HackFont); #endif } /* Text and menu windows are not opened yet */ if( w ) { wd->rows = ( w->Height - w->BorderTop - w->BorderBottom - 2 ) / w->RPort->TxHeight; wd->cols = ( w->Width - w->BorderLeft - w->BorderRight - 2 ) / w->RPort->TxWidth; } /* Okay, now do the individual type initialization */ switch(type) { /* History lines for MESSAGE windows are stored in cw->data[?]. * maxcol and maxrow are used as cursors. maxrow is the count * of the number of history lines stored. maxcol is the cursor * to the last line that was displayed by ^P. */ 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; if (iflags.msg_history > 400) iflags.msg_history = 400; iflags.window_inited=TRUE; wd->data = (char **)alloc( iflags.msg_history*sizeof( char * ) ); memset( wd->data, 0, iflags.msg_history * sizeof( char * ) ); wd->maxrow = wd->maxcol = 0; /* Indicate that we have not positioned the cursor yet */ wd->curx = -1; break; /* A MENU contains a list of lines in wd->data[?]. These * lines are created in amii_putstr() by reallocating the size * of wd->data to hold enough (char *)'s. wd->rows is the * number of (char *)'s allocated. wd->maxrow is the number * used. wd->maxcol is used to track how wide the menu needs * to be. wd->resp[x] contains the characters that correspond * to selecting wd->data[x]. wd->resp[x] corresponds to * wd->data[x] for any x. Elements of wd->data[?] that are not * valid selections have the corresponding element of * wd->resp[] set to a value of '\01'; i.e. a ^A which is * not currently a valid keystroke for responding to any * 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; wd->cols = wd->maxcol = 0; wd->data = NULL; break; /* See the explanation of MENU above. Except, wd->resp[] is not * used for TEXT windows since there is no selection of a * a line performed/allowed. The window is always full * 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; wd->morestr = NULL; break; /* The status window has only two lines. These are stored in * wd->data[], and here we allocate the space for them. */ case NHW_STATUS: SetMenuStrip(w, MenuStrip); /* wd->cols is the number of characters which fit across the * screen. */ wd->data=(char **)alloc(3*sizeof(char *)); wd->data[0] = (char *)alloc(wd->cols + 10); wd->data[1] = (char *)alloc(wd->cols + 10); wd->data[2] = NULL; break; /* NHW_OVER does not use wd->data[] or the other text * manipulating members of the amii_WinDesc structure. */ case NHW_OVER: SetMenuStrip(w, MenuStrip); break; /* NHW_MAP does not use wd->data[] or the other text * manipulating members of the amii_WinDesc structure. */ case NHW_MAP: SetMenuStrip(w, MenuStrip); if( WINVERS_AMIV ) { CO = (w->Width-w->BorderLeft-w->BorderRight)/mxsize; LI = (w->Height-w->BorderTop-w->BorderBottom)/mysize; amii_setclipped(); SetFont( w->RPort, RogueFont); SetAPen( w->RPort, C_WHITE); /* XXX not sufficient */ SetBPen( w->RPort, C_BLACK); SetDrMd( w->RPort, JAM2); } else { if( HackFont ) SetFont( w->RPort, HackFont ); } break; /* The base window must exist until CleanUp() deletes it. */ case NHW_BASE: SetMenuStrip(w, MenuStrip); /* Make our requesters come to our screen */ { register struct Process *myProcess = (struct Process *) FindTask(NULL); pr_WindowPtr = (struct Window *)(myProcess->pr_WindowPtr); myProcess->pr_WindowPtr = (APTR) w; } /* Need this for RawKeyConvert() */ 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) { Abort(AG_OpenDev | AO_ConsoleDev); } ConsoleDevice = (struct Library *) ConsoleIO.io_Device; KbdBuffered = 0; #ifdef HACKFONT if( TextsFont ) SetFont( w->RPort, TextsFont ); else if( HackFont ) SetFont( w->RPort, HackFont ); #endif txwidth = w->RPort->TxWidth; txheight = w->RPort->TxHeight; txbaseline = w->RPort->TxBaseline; break; default: panic("bad create_nhwindow( %d )\n",type); return WIN_ERR; } 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 amii_init_nhwindows(argcp,argv) int *argcp; char **argv; { int i; struct Screen *wbscr; int forcenobig = 0; if( HackScreen ) panic( "init_nhwindows() called twice", 0 ); /* run args & set bigscreen from -L(1)/-l(-1) */ { int lclargc = *argcp; int t; char **argv_in = argv; char **argv_out = argv; for(t=1;t<=lclargc;t++){ if(!strcmp("-L",*argv_in) || !strcmp("-l",*argv_in)){ bigscreen = (*argv_in[1]=='l') ? -1 : 1; /* and eat the flag */ (*argcp)--; } else { *argv_out = *argv_in; /* keep the flag */ argv_out++; } argv_in++; } *argv_out = 0; } WIN_MESSAGE = WIN_ERR; WIN_MAP = WIN_ERR; WIN_STATUS = WIN_ERR; WIN_INVEN = WIN_ERR; WIN_BASE = WIN_ERR; WIN_OVER = WIN_ERR; if ( (IntuitionBase = (struct IntuitionBase *) OpenLibrary("intuition.library", amii_libvers )) == NULL) { Abort(AG_OpenLib | AO_Intuition); } if ( (GfxBase = (struct GfxBase *) OpenLibrary("graphics.library", amii_libvers )) == NULL) { 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 ) ); /* Use Intuition sizes for overscan screens... */ amiIDisplay->xpix = 0; #ifdef INTUI_NEW_LOOK if( IntuitionBase->LibNode.lib_Version >= 37 ) { if( wbscr = LockPubScreen( "Workbench" ) ) { amiIDisplay->xpix = wbscr->Width; amiIDisplay->ypix = wbscr->Height; UnlockPubScreen( NULL, wbscr ); } } #endif if( amiIDisplay->xpix == 0 ) { amiIDisplay->ypix = GfxBase->NormalDisplayRows; amiIDisplay->xpix = GfxBase->NormalDisplayColumns; } amiIDisplay->cols = amiIDisplay->xpix / FONTWIDTH; amiIDisplay->toplin=0; amiIDisplay->rawprint=0; amiIDisplay->lastwin=0; if( bigscreen == 0 ) { if( ( GfxBase->ActiView->ViewPort->Modes & LACE ) == LACE ) { amiIDisplay->ypix *= 2; NewHackScreen.ViewModes |= LACE; bigscreen = 1; } else if( GfxBase->NormalDisplayRows >= 300 || amiIDisplay->ypix >= 300 ) { bigscreen = 1; } } else if( bigscreen == -1 ) { bigscreen = 0; forcenobig = 1; } else if( bigscreen ) { /* If bigscreen requested and we don't have enough rows in * noninterlaced mode, switch to interlaced... */ if( GfxBase->NormalDisplayRows < 300 ) { amiIDisplay->ypix *= 2; NewHackScreen.ViewModes |= LACE; } } if( !bigscreen ) { alwaysinvent = 0; } amiIDisplay->rows = amiIDisplay->ypix / FONTHEIGHT; #ifdef HACKFONT /* * Load the fonts that we need. */ if( DiskfontBase = OpenLibrary( "diskfont.library", amii_libvers ) ) { Hack80.ta_Name -= SIZEOF_DISKNAME; HackFont = OpenDiskFont( &Hack80 ); Hack80.ta_Name += SIZEOF_DISKNAME; /* Textsfont13 is filled in with "FONT=" settings. The default is * courier/13. */ TextsFont = NULL; if( bigscreen ) TextsFont = OpenDiskFont( &TextsFont13 ); /* Try hack/8 for texts if no user specified font */ if( TextsFont == NULL ) { Hack80.ta_Name -= SIZEOF_DISKNAME; TextsFont = OpenDiskFont( &Hack80 ); Hack80.ta_Name += SIZEOF_DISKNAME; } /* If no fonts, make everything topaz 8 for non-view windows. */ Hack80.ta_Name = "topaz.font"; RogueFont = OpenFont( &Hack80 ); if(!RogueFont) panic("Can't get topaz:8"); if( !HackFont || !TextsFont ) { if( !HackFont ) { HackFont = OpenFont( &Hack80 ); if( !HackFont ) panic( "Can't get a map font, topaz:8" ); } if( !TextsFont ) { TextsFont = OpenFont( &Hack80 ); if( !TextsFont ) panic( "Can't open text font" ); } } CloseLibrary(DiskfontBase); DiskfontBase = NULL; } #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 ); NewHackScreen.Height = max( SCREENHEIGHT, amiIDisplay->ypix ); { static char fname[18]; sprintf(fname,"NetHack %d.%d.%d", VERSION_MAJOR, VERSION_MINOR, PATCHLEVEL); NewHackScreen.DefaultTitle=fname; } #if 0 NewHackScreen.BlockPen = C_BLACK; NewHackScreen.DetailPen = C_WHITE; #endif #ifdef INTUI_NEW_LOOK if( IntuitionBase->LibNode.lib_Version >= 37 ) { int i; struct DimensionInfo dims; DisplayInfoHandle handle; struct DisplayInfo disp; ULONG modeid = DEFAULT_MONITOR_ID|HIRES_KEY; 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 || ( wbscr = LockPubScreen( NULL ) ) != NULL ) { /* Get the default pub screen's size */ modeid = GetVPModeID( &wbscr->ViewPort ); if( modeid == INVALID_ID || ModeNotAvailable( modeid ) || ( handle = FindDisplayInfo( modeid ) ) == NULL || GetDisplayInfoData( handle, (char *)&dims, sizeof( dims ), DTAG_DIMS, modeid ) <= 0 || GetDisplayInfoData( handle, (char *)&disp, sizeof( disp ), DTAG_DISP, modeid ) <= 0 ) { modeid = DEFAULT_MONITOR_ID|HIRES_KEY; /* If the display database seems to not work, use the screen * dimensions */ NewHackScreen.Height = wbscr->Height; NewHackScreen.Width = wbscr->Width; /* * Request LACE if it looks laced. For 2.1/3.0, we will get * promoted to the users choice of modes (if promotion is allowed) * If the user is using a dragable screen, things will get hosed * but that is life... */ if( wbscr->ViewPort.Modes & LACE ) NewHackScreen.ViewModes |= LACE; modeid = -1; } else { /* 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; UnlockPubScreen( NULL, wbscr ); } } for( i = 0; scrntags[i].ti_Tag != TAG_DONE; ++i ) { switch( scrntags[i].ti_Tag ) { case SA_DisplayID: if( !amii_scrnmode || ModeNotAvailable( amii_scrnmode ) ) { if( ModeNotAvailable( modeid ) ) { scrntags[i].ti_Tag = TAG_IGNORE; break; } else scrntags[i].ti_Data = (long)modeid; } else modeid = scrntags[i].ti_Data = (long)amii_scrnmode; if( ( handle = FindDisplayInfo( modeid ) ) != NULL && GetDisplayInfoData( handle, (char *)&dims, sizeof( dims ), DTAG_DIMS, modeid ) > 0 && GetDisplayInfoData( handle, (char *)&disp, sizeof( disp ), DTAG_DISP, modeid ) > 0 ) { if( disp.PropertyFlags & DIPF_IS_LACE ) NewHackScreen.ViewModes |= LACE; NewHackScreen.Height = dims.StdOScan.MaxY+1; NewHackScreen.Width = dims.StdOScan.MaxX+1; } break; case SA_Pens: scrntags[i].ti_Data = (long)flags.amii_dripens; break; } } } #endif if( WINVERS_AMIV ) amii_bmhd = ReadTileImageFiles( ); else memcpy( amii_initmap, amii_init_map, sizeof( amii_initmap ) ); memcpy(flags.amii_curmap,amii_initmap,sizeof(flags.amii_curmap)); /* Find out how deep the screen needs to be, 32 planes is enough! */ for( i = 0; i < 32; ++i ) { if( ( 1L << i ) >= amii_numcolors ) break; } NewHackScreen.Depth = i; /* If for some reason Height/Width became smaller than the required, have the required one */ if (NewHackScreen.Height < SCREENHEIGHT) NewHackScreen.Height = SCREENHEIGHT; if (NewHackScreen.Width < WIDTH) NewHackScreen.Width = WIDTH; #ifdef HACKFONT i = max(TextsFont->tf_XSize, HackFont->tf_XSize); if (NewHackScreen.Width < 80*i+4) NewHackScreen.Width = 80*i+4; #endif /* While openscreen fails try fewer colors to see if that is the problem. */ while( ( HackScreen = OpenScreen( (void *)&NewHackScreen ) ) == NULL ) { #ifdef TEXTCOLOR if( --NewHackScreen.Depth < 3 ) #else if( --NewHackScreen.Depth < 2 ) #endif Abort( AN_OpenScreen & ~AT_DeadEnd ); } amii_numcolors = 1L << NewHackScreen.Depth; if( HackScreen->Height > 300 && forcenobig == 0 ) bigscreen = 1; else bigscreen = 0; #ifdef INTUI_NEW_LOOK if( IntuitionBase->LibNode.lib_Version >= 37 ) PubScreenStatus( HackScreen, 0 ); #endif amiIDisplay->ypix = HackScreen->Height; amiIDisplay->xpix = HackScreen->Width; LoadRGB4(&HackScreen->ViewPort, flags.amii_curmap, amii_numcolors ); VisualInfo = GetVisualInfo(HackScreen, TAG_END); MenuStrip = CreateMenus(GTHackMenu, TAG_END); LayoutMenus(MenuStrip, VisualInfo, GTMN_NewLookMenus, TRUE, TAG_END); /* Display the copyright etc... */ if( WIN_BASE == WIN_ERR ) WIN_BASE = amii_create_nhwindow( NHW_BASE ); amii_clear_nhwindow( WIN_BASE ); amii_putstr( WIN_BASE, 0, "" ); amii_putstr( WIN_BASE, 0, "" ); amii_putstr( WIN_BASE, 0, "" ); amii_putstr( WIN_BASE, 0, COPYRIGHT_BANNER_A); amii_putstr( WIN_BASE, 0, COPYRIGHT_BANNER_B); amii_putstr( WIN_BASE, 0, COPYRIGHT_BANNER_C); amii_putstr( WIN_BASE, 0, ""); Initialized = 1; } void amii_sethipens( struct Window *w, int type, int attr ) { switch( type ) { default: SetAPen( w->RPort, attr ? C_RED : amii_otherAPen ); SetBPen( w->RPort, C_BLACK ); break; case NHW_STATUS: SetAPen( w->RPort, attr ? C_WHITE : amii_statAPen ); SetBPen( w->RPort, amii_statBPen ); break; case NHW_MESSAGE: SetAPen( w->RPort, attr ? C_WHITE : amii_msgAPen ); SetBPen( w->RPort, amii_msgBPen ); break; case NHW_MENU: SetAPen( w->RPort, attr ? C_BLACK : amii_menuAPen ); SetBPen( w->RPort, amii_menuBPen ); break; case NHW_TEXT: SetAPen( w->RPort, attr ? C_BLACK : amii_textAPen ); SetBPen( w->RPort, amii_textBPen ); case -2: SetBPen( w->RPort, amii_otherBPen ); SetAPen( w->RPort, attr ? C_RED : amii_otherAPen ); break; } } void amii_setfillpens( struct Window *w, int type ) { switch( type ) { case NHW_MESSAGE: SetAPen( w->RPort, amii_msgBPen ); SetBPen( w->RPort, amii_msgBPen ); break; case NHW_STATUS: SetAPen( w->RPort, amii_statBPen ); SetBPen( w->RPort, amii_statBPen ); break; case NHW_MENU: SetAPen( w->RPort, amii_menuBPen ); SetBPen( w->RPort, amii_menuBPen ); break; case NHW_TEXT: SetAPen( w->RPort, amii_textBPen ); SetBPen( w->RPort, amii_textBPen ); break; case NHW_MAP: case NHW_BASE: case NHW_OVER: default: SetAPen( w->RPort, C_BLACK ); SetBPen( w->RPort, C_BLACK ); break; case -2: SetAPen( w->RPort, amii_otherBPen ); SetBPen( w->RPort, amii_otherBPen ); break; } } void amii_setdrawpens( struct Window *w, int type ) { switch( type ) { case NHW_MESSAGE: SetAPen( w->RPort, amii_msgAPen ); SetBPen( w->RPort, amii_msgBPen ); break; case NHW_STATUS: SetAPen( w->RPort, amii_statAPen ); SetBPen( w->RPort, amii_statBPen ); break; case NHW_MENU: SetAPen( w->RPort, amii_menuAPen ); SetBPen( w->RPort, amii_menuBPen ); break; case NHW_TEXT: SetAPen( w->RPort, amii_textAPen ); SetBPen( w->RPort, amii_textBPen ); break; case NHW_MAP: case NHW_BASE: case NHW_OVER: SetAPen( w->RPort, C_WHITE ); SetBPen( w->RPort, C_BLACK ); break; default: SetAPen( w->RPort, amii_otherAPen ); SetBPen( w->RPort, amii_otherBPen ); break; } } /* Clear the indicated window */ void amii_clear_nhwindow(win) register winid win; { register struct amii_WinDesc *cw; register struct Window *w; if( reclip == 2 ) return; if( win == WIN_ERR || ( cw = amii_wins[win] ) == NULL ) panic( winpanicstr, win, "clear_nhwindow" ); /* Clear the overview window too if it is displayed */ if( WINVERS_AMIV && ( cw->type == WIN_MAP && WIN_OVER != WIN_ERR && reclip == 0 ) ) { amii_clear_nhwindow( WIN_OVER ); } if( w = cw->win ) SetDrMd( w->RPort, JAM2); else return; if( (cw->wflags & FLMAP_CURSUP ) ) { if( cw->type != NHW_MAP ) cursor_off( win ); else cw->wflags &= ~FLMAP_CURSUP; } amii_setfillpens( w, cw->type ); SetDrMd( w->RPort, JAM2 ); if( cw->type == NHW_MENU || cw->type == NHW_TEXT ) { RectFill( w->RPort, w->BorderLeft, w->BorderTop, w->Width - w->BorderRight-1, w->Height - w->BorderBottom-1 ); } else { if( cw->type == NHW_MESSAGE ) { amii_curs( win, 1, 0 ); if( !scrollmsg ) TextSpaces( w->RPort, cw->cols ); } else { RectFill( w->RPort, w->BorderLeft, w->BorderTop, w->Width - w->BorderRight-1, w->Height - w->BorderBottom-1 ); } } cw->cury = 0; cw->curx = 0; amii_curs( win, 1, 0 ); } /* Dismiss the window from the screen */ void dismiss_nhwindow(win) register winid win; { register struct Window *w; register struct amii_WinDesc *cw; if( win == WIN_ERR || ( cw = amii_wins[win] ) == NULL ) { panic(winpanicstr,win, "dismiss_nhwindow"); } w = cw->win; if( w ) { /* All windows have this stuff attached to them. */ if( cw->type == NHW_MAP || cw->type == NHW_OVER || cw->type == NHW_BASE || cw->type == NHW_MESSAGE || cw->type == NHW_STATUS ) { ClearMenuStrip( w ); } /* Save where user like inventory to appear */ if( win == WIN_INVEN ) { lastinvent.MinX = w->LeftEdge; lastinvent.MinY = w->TopEdge; lastinvent.MaxX = w->Width; lastinvent.MaxY = w->Height; } /* Close the window */ CloseShWindow( w ); cw->win = NULL; /* Free copy of NewWindow structure for TEXT/MENU windows. */ if( cw->newwin ) FreeNewWindow( (void *)cw->newwin ); cw->newwin = NULL; } } void amii_exit_nhwindows(str) const char *str; { /* Seems strange to have to do this... but we need the BASE window * left behind... */ kill_nhwindows( 0 ); if( WINVERS_AMIV ) FreeTileImageFiles( ); if( str ) { raw_print( "" ); /* be sure we're not under the top margin */ raw_print( str ); } } void amii_display_nhwindow(win,blocking) winid win; boolean blocking; { menu_item *mip; int cnt; static int lastwin = -1; struct amii_WinDesc *cw; if( !Initialized ) return; lastwin = win; if( win == WIN_ERR || ( cw = amii_wins[win] ) == NULL ) panic(winpanicstr,win,"display_nhwindow"); if( cw->type == NHW_MESSAGE ) cw->wflags &= ~FLMAP_SKIP; if( cw->type == NHW_MESSAGE || cw->type == NHW_STATUS ) return; if( WIN_MAP != WIN_ERR && amii_wins[ WIN_MAP ] ) { flush_glyph_buffer( amii_wins[ WIN_MAP ]->win ); } if( cw->type == NHW_MENU || cw->type == NHW_TEXT ) { cnt = DoMenuScroll( win, blocking, PICK_ONE, &mip ); } else if( cw->type==NHW_MAP ) { amii_end_glyphout( win ); /* Do more if it is time... */ if( blocking == TRUE && amii_wins[ WIN_MESSAGE ]->curx ) { outmore( amii_wins[ WIN_MESSAGE ] ); } } } void amii_curs(window, x, y) winid window; register int x, y; /* not xchar: perhaps xchar is unsigned and curx-x would be unsigned as well */ { register struct amii_WinDesc *cw; register struct Window *w; register struct RastPort *rp; if( window == WIN_ERR || ( cw = amii_wins[window] ) == NULL ) panic(winpanicstr, window, "curs"); if( (w = cw->win) == NULL ) { if( cw->type == NHW_MENU || cw->type == NHW_TEXT ) return; else panic( "No window open yet in curs() for winid %d\n", window ); } amiIDisplay->lastwin = window; /* Make sure x is within bounds */ if( x > 0 ) --x; /* column 0 is never used */ else x = 0; cw->curx = x; cw->cury = y; #ifdef DEBUG if( x<0 || y<0 || y >= cw->rows || x >= cw->cols ) { char *s = "[unknown type]"; switch(cw->type) { case NHW_MESSAGE: s = "[topl window]"; break; case NHW_STATUS: s = "[status window]"; break; case NHW_MAP: s = "[map window]"; break; case NHW_MENU: s = "[menu window]"; break; case NHW_TEXT: s = "[text window]"; break; case NHW_BASE: s = "[base window]"; break; case NHW_OVER: s = "[overview window]"; break; } impossible("bad curs positioning win %d %s (%d,%d)", window, s, x, y); return; } #endif #ifdef CLIPPING if(clipping && cw->type == NHW_MAP) { x -= clipx; y -= clipy; } #endif /* Output all saved output before doing cursor movements for MAP */ if( cw->type == NHW_MAP ) { flush_glyph_buffer( w ); } /* Actually do it */ rp = w->RPort; if( cw->type == NHW_MENU ) { if( WINVERS_AMIV ) { if( window == WIN_INVEN ) { Move( rp, (x * rp->TxWidth) + w->BorderLeft + 1 + pictdata.xsize + 4, (y * max(rp->TxHeight,pictdata.ysize + 3) ) + rp->TxBaseline + pictdata.ysize - rp->TxHeight + w->BorderTop + 4 ); } else { Move( rp, (x * rp->TxWidth) + w->BorderLeft + 1, (y * rp->TxHeight) + rp->TxBaseline + w->BorderTop + 1 ); } } else { Move( rp, (x * rp->TxWidth) + w->BorderLeft + 1, (y*rp->TxHeight ) + rp->TxBaseline + w->BorderTop + 1 ); } } else if( cw->type == NHW_TEXT ) { Move( rp, (x * rp->TxWidth) + w->BorderLeft + 1, (y*rp->TxHeight ) + rp->TxBaseline + w->BorderTop + 1 ); } else if( cw->type == NHW_MAP || cw->type == NHW_BASE ) { /* These coordinate calculations must be synced with those * in flush_glyph_buffer() in winchar.c. curs_on_u() will * use this code, all other drawing occurs through the glyph * code. In order for the cursor to appear on top of the hero, * the code must compute X,Y in the same manner relative to * the RastPort coordinates. * * y = w->BorderTop + (g_nodes[i].y-2) * rp->TxHeight + * rp->TxBaseline + 1; * x = g_nodes[i].x * rp->TxWidth + w->BorderLeft; */ if( WINVERS_AMIV ) { if( cw->type == NHW_MAP ) { if(Is_rogue_level(&u.uz)){ #if 0 int qqx= (x * w->RPort->TxWidth) + w->BorderLeft; int qqy= w->BorderTop + ( (y+1) * w->RPort->TxHeight ) + 1; printf("pos: (%d,%d)->(%d,%d)\n",x,y,qqx,qqy); #endif SetAPen(w->RPort,C_WHITE); /* XXX should be elsewhere (was 4)*/ Move( rp, (x * w->RPort->TxWidth) + w->BorderLeft, w->BorderTop + ( (y+1) * w->RPort->TxHeight ) + 1 ); } else { Move( rp, (x * mxsize) + w->BorderLeft, w->BorderTop + ( (y+1) * mysize ) + 1 ); } } else { Move( rp, (x * w->RPort->TxWidth) + w->BorderLeft, w->BorderTop + ( (y + 1) * w->RPort->TxHeight ) + w->RPort->TxBaseline + 1 ); } } else { Move( rp, (x * w->RPort->TxWidth) + w->BorderLeft, w->BorderTop + ( y * w->RPort->TxHeight ) + w->RPort->TxBaseline + 1 ); } } else if( WINVERS_AMIV && cw->type == NHW_OVER ) { Move( rp, (x * w->RPort->TxWidth) + w->BorderLeft + 2, w->BorderTop + w->RPort->TxBaseline + 3 ); } else if( cw->type == NHW_MESSAGE && !scrollmsg ) { Move( rp, (x * w->RPort->TxWidth) + w->BorderLeft + 2, w->BorderTop + w->RPort->TxBaseline + 3 ); } else if( cw->type == NHW_STATUS ) { Move( rp, (x * w->RPort->TxWidth) + w->BorderLeft + 2, (y*(w->RPort->TxHeight+1)) + w->BorderTop + w->RPort->TxBaseline + 1 ); } else { Move( rp, (x * w->RPort->TxWidth) + w->BorderLeft + 2, (y*w->RPort->TxHeight) + w->BorderTop + w->RPort->TxBaseline + 1 ); } } void amii_set_text_font( name, size ) char *name; int size; { register int i; register struct amii_WinDesc *cw; int osize = TextsFont13.ta_YSize; static char nname[ 100 ]; strncpy( nname, name, sizeof( nname ) - 1 ); nname[ sizeof( nname ) - 1 ] = 0; TextsFont13.ta_Name = nname; TextsFont13.ta_YSize = size; /* No alternate text font allowed for 640x269 or smaller */ if( !HackScreen || !bigscreen ) return; /* Look for windows to set, and change them */ if( DiskfontBase = OpenLibrary( "diskfont.library", amii_libvers ) ) { TextsFont = OpenDiskFont( &TextsFont13 ); for( i = 0; TextsFont && i < MAXWIN; ++i ) { if( (cw = amii_wins[ i ]) && cw->win != NULL ) { switch( cw->type ) { case NHW_STATUS: MoveWindow( cw->win, 0, -( size - osize ) * 2 ); SizeWindow( cw->win, 0, ( size - osize ) * 2 ); SetFont( cw->win->RPort, TextsFont ); break; case NHW_MESSAGE: case NHW_MAP: case NHW_BASE: case NHW_OVER: SetFont( cw->win->RPort, TextsFont ); break; } } } } CloseLibrary(DiskfontBase); DiskfontBase = NULL; } void kill_nhwindows( all ) register int all; { register int i; register struct amii_WinDesc *cw; /* Foreach open window in all of amii_wins[], CloseShWindow, free memory */ for( i = 0; i < MAXWIN; ++i ) { if( (cw = amii_wins[ i ]) && (cw->type != NHW_BASE || all) ) { amii_destroy_nhwindow( i ); } } } void amii_cl_end( cw, curs_pos ) register struct amii_WinDesc *cw; register int curs_pos; { register struct Window *w = cw->win; register int oy, ox; if( !w ) panic("NULL window pointer in amii_cl_end()"); oy = w->RPort->cp_y; ox = w->RPort->cp_x; TextSpaces( w->RPort, cw->cols - curs_pos ); Move( w->RPort, ox, oy ); } void cursor_off( window ) winid window; { register struct amii_WinDesc *cw; register struct Window *w; register struct RastPort *rp; int curx, cury; int x, y; long dmode; short apen, bpen; unsigned char ch; if( window == WIN_ERR || ( cw = amii_wins[window] ) == NULL ) { iflags.window_inited=0; panic(winpanicstr,window, "cursor_off"); } if( !(cw->wflags & FLMAP_CURSUP ) ) return; w = cw->win; if( !w ) return; cw->wflags &= ~FLMAP_CURSUP; rp = w->RPort; /* Save the current information */ curx = rp->cp_x; cury = rp->cp_y; x = cw->cursx; y = cw->cursy; dmode = rp->DrawMode; apen = rp->FgPen; bpen = rp->BgPen; SetAPen( rp, cw->curs_apen ); SetBPen( rp, cw->curs_bpen ); SetDrMd( rp, COMPLEMENT ); /*printf("CURSOR OFF: %d %d\n",x,y);*/ if( WINVERS_AMIV && cw->type == NHW_MAP) { cursor_common(rp, x, y); if(Is_rogue_level(&u.uz)) Move(rp,curx,cury); } else { ch = CURSOR_CHAR; Move( rp, x, y ); Text( rp, &ch, 1 ); /* Put back the other stuff */ Move( rp, curx, cury ); } SetDrMd( rp, dmode ); SetAPen( rp, apen ); SetBPen( rp, bpen ); } void cursor_on( window ) winid window; { int x, y; register struct amii_WinDesc *cw; register struct Window *w; register struct RastPort *rp; unsigned char ch; long dmode; short apen, bpen; if( window == WIN_ERR || ( cw = amii_wins[window] ) == NULL ) { /* tty does this differently - is this OK? */ iflags.window_inited=0; panic(winpanicstr,window, "cursor_on"); } /*printf("CURSOR ON: %d %d\n",cw->win->RPort->cp_x, cw->win->RPort->cp_y);*/ if( (cw->wflags & FLMAP_CURSUP ) ) cursor_off( window ); w = cw->win; if( !w ) return; cw->wflags |= FLMAP_CURSUP; rp = w->RPort; /* Save the current information */ #ifdef DISPMAP if( WINVERS_AMIV && cw->type == NHW_MAP && !Is_rogue_level(&u.uz)) x = cw->cursx = (rp->cp_x & -8) + 8; else #endif x = cw->cursx = rp->cp_x; y = cw->cursy = rp->cp_y; apen = rp->FgPen; bpen = rp->BgPen; dmode = rp->DrawMode; /* 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 ); if( WINVERS_AMIV && cw->type == NHW_MAP) { cursor_common(rp, x, y); } else { Move( rp, x, y ); ch = CURSOR_CHAR; Text( rp, &ch, 1 ); Move( rp, x, y ); } SetDrMd( rp, dmode ); SetAPen( rp, apen ); SetBPen( rp, bpen ); } static void cursor_common(rp, x, y) struct RastPort *rp; int x,y; { int x1,x2,y1,y2; if(Is_rogue_level(&u.uz)){ x1 = x-2; y1 = y-rp->TxHeight; x2 = x+rp->TxWidth+1; y2 = y+3; /*printf("COMM: (%d %d) (%d %d) (%d %d) (%d %d)\n",x1,y1,x2,y2,x1+2,y1+2,x2-2,y2-2);*/ } else { x1 = x; y1 = y-mysize-1; x2 = x+mxsize-1; y2 = y-2; RectFill(rp, x1, y1, x2, y2); } RectFill(rp, x1+2, y1+2, x2-2, y2-2); } void amii_suspend_nhwindows( str ) const char *str; { if( HackScreen ) ScreenToBack( HackScreen ); } void amii_resume_nhwindows() { if( HackScreen ) ScreenToFront( HackScreen ); } void amii_bell() { DisplayBeep( NULL ); } void removetopl(cnt) int cnt; { struct amii_WinDesc *cw=amii_wins[WIN_MESSAGE]; /* NB - this is sufficient for * yn_function, but that's it */ if(cw->curx < cnt)cw->curx=0; else cw->curx -= cnt; amii_curs(WIN_MESSAGE, cw->curx+1, cw->cury); amii_cl_end(cw, cw->curx); } /*#endif /* AMIGA_INTUITION */ #ifdef PORT_HELP void port_help() { display_file( PORT_HELP, 1 ); } #endif /* * print_glyph * * Print the glyph to the output device. Don't flush the output device. * * Since this is only called from show_glyph(), it is assumed that the * position and glyph are always correct (checked there)! */ void amii_print_glyph(win,x,y,glyph) winid win; xchar x,y; int glyph; { 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 ) { #ifdef CLIPPING /* If point not in visible part of window just skip it */ if( clipping ) { if( x <= clipx || y < clipy || x >= clipxmax || y >= clipymax ) return; } #endif } if( win == WIN_ERR || (cw=amii_wins[win]) == NULL || cw->type != NHW_MAP) { panic(winpanicstr,win,"amii_print_glyph"); } #if 0 { static int x=-1; if(u.uz.dlevel != x){ fprintf(stderr,"lvlchg: %d (%d)\n",u.uz.dlevel,Is_rogue_level(&u.uz)); x = u.uz.dlevel; } } #endif if( WINVERS_AMIV #ifdef REINCARNATION && !Is_rogue_level(&u.uz) #endif ) { amii_curs(win,x,y); amiga_print_glyph(win,0,glyph); } 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); } else { /* Move the cursor. */ amii_curs(win,x,y+2); #ifdef TEXTCOLOR /* Turn off color if rogue level. */ # ifdef REINCARNATION if (Is_rogue_level(&u.uz)) color = NO_COLOR; # endif amiga_print_glyph(win,color,ch); #else g_putch(ch); /* print the character */ #endif cw->curx++; /* one character over */ } } } /* Make sure the user sees a text string when no windowing is available */ void amii_raw_print(s) register const char *s; { int argc = 0; if( !s ) return; if(amiIDisplay) amiIDisplay->rawprint++; if (!Initialized) { /* Not yet screen open ... */ puts(s); fflush(stdout); return; } if( Initialized == 0 && WIN_BASE == WIN_ERR ) init_nhwindows(&argc, (char **)0); if( amii_rawprwin != WIN_ERR ) amii_putstr( amii_rawprwin, 0, s ); else if( WIN_MAP != WIN_ERR && amii_wins[ WIN_MAP ] ) amii_putstr( WIN_MAP, 0, s ); else if( WIN_BASE != WIN_ERR && amii_wins[ WIN_BASE ] ) amii_putstr( WIN_BASE, 0, s ); else { puts( s); fflush(stdout); } } /* Make sure the user sees a bold text string when no windowing * is available */ void amii_raw_print_bold(s) register const char *s; { int argc = 0; if( !s ) return; if(amiIDisplay) amiIDisplay->rawprint++; if (!Initialized) { /* Not yet screen open ... */ puts(s); fflush(stdout); return; } if( Initialized == 0 && WIN_BASE == WIN_ERR ) init_nhwindows(&argc, (char **)0); if( amii_rawprwin != WIN_ERR ) amii_putstr( amii_rawprwin, 1, s ); else if( WIN_MAP != WIN_ERR && amii_wins[ WIN_MAP ] ) amii_putstr( WIN_MAP, 1, s ); else if( WIN_BASE != WIN_ERR && amii_wins[ WIN_BASE ] ) amii_putstr( WIN_BASE, 1, s ); else { printf("\33[1m%s\33[0m\n",s); fflush(stdout); } } /* Rebuild/update the inventory if the window is up. */ void amii_update_inventory() { register struct amii_WinDesc *cw; if( WIN_INVEN != WIN_ERR && ( cw = amii_wins[ WIN_INVEN ] ) && cw->type == NHW_MENU && cw->win ) { display_inventory( NULL, FALSE ); } } /* Humm, doesn't really do anything useful */ void amii_mark_synch() { if(!amiIDisplay) fflush(stderr); /* anything else? do we need this much? */ } /* Wait for everything to sync. Nothing is asynchronous, so we just * ask for a key to be pressed. */ void amii_wait_synch() { if(!amiIDisplay || amiIDisplay->rawprint) { if(amiIDisplay) amiIDisplay->rawprint=0; } else { if( WIN_MAP != WIN_ERR ) { display_nhwindow(WIN_MAP,TRUE); flush_glyph_buffer( amii_wins[ WIN_MAP ]->win ); } } } void amii_setclipped() { #ifdef CLIPPING clipping = TRUE; clipx=clipy=0; clipxmax=CO; clipymax=LI; /* some of this is now redundant with top of amii_cliparound XXX */ #endif } /* XXX still to do: suppress scrolling if we violate the boundary but the * edge of the map is already displayed */ void amii_cliparound(x,y) register int x,y; { extern boolean restoring; #ifdef CLIPPING int oldx = clipx, oldy = clipy; int oldxmax = clipxmax, oldymax = clipymax; int COx, LIx; #define SCROLLCNT 1 /* Get there in 3 moves... */ int scrollcnt = SCROLLCNT; /* ...or 1 if we changed level */ if (!clipping) /* And 1 in anycase, cleaner, simpler, quicker */ return; if(Is_rogue_level(&u.uz)){ struct Window *w = amii_wins[WIN_MAP]->win; struct RastPort *rp = w->RPort; COx = (w->Width-w->BorderLeft-w->BorderRight)/rp->TxWidth; LIx = (w->Height-w->BorderTop-w->BorderBottom)/rp->TxHeight; }else{ COx = CO; LIx = LI; } /* * On a level change, move the clipping region so that for a * reasonablely large window extra motion is avoided; for * the rogue level hopefully this means no motion at all. */ { static d_level saved_level = {127,127}; /* XXX */ if(!on_level(&u.uz, &saved_level)){ scrollcnt = 1; /* jump with blanking */ clipx=clipy=0; clipxmax = COx; clipymax = LIx; saved_level = u.uz; /* save as new current level */ } } if (x <= clipx + xclipbord ) { clipx = max(0, x - (clipxmax - clipx)/2 ); clipxmax = clipx + COx; } else if (x > clipxmax - xclipbord ) { clipxmax = min(COLNO, x + (clipxmax - clipx)/2 ); clipx = clipxmax - COx; } if (y <= clipy + yclipbord ) { clipy = max(0, y - (clipymax - clipy) / 2); clipymax = clipy + LIx; } else if (y > clipymax - yclipbord ) { clipymax = min(ROWNO, y + (clipymax - clipy) / 2); clipy = clipymax - LIx; } reclip = 1; if (clipx != oldx || clipy != oldy || clipxmax != oldxmax || clipymax != oldymax ) { #ifndef NOSCROLLRASTER struct Window *w = amii_wins[ WIN_MAP ]->win; struct RastPort *rp = w->RPort; int xdelta, ydelta, xmod, ymod, i; int incx, incy, mincx, mincy; int savex, savey, savexmax, saveymax; int scrx, scry; if(Is_rogue_level(&u.uz)){ scrx = rp->TxWidth; scry = rp->TxHeight; } else { scrx = mxsize; scry = mysize; } /* Ask that the glyph routines not draw the overview window */ reclip = 2; cursor_off( WIN_MAP ); /* Compute how far we are moving in terms of tiles */ mincx = clipx - oldx ; mincy = clipy - oldy ; /* How many tiles to get there in SCROLLCNT moves */ incx = ( clipx - oldx )/scrollcnt; incy = ( clipy - oldy )/scrollcnt; /* If less than SCROLLCNT tiles, then move by 1 tile if moving at all */ if( incx == 0 ) incx = (mincx != 0); if( incy == 0 ) incy = (mincy != 0); /* Get count of pixels to move each iteration and final pixel count */ xdelta = ((clipx-oldx )*scrx) / scrollcnt; xmod = ((clipx-oldx )*scrx) % scrollcnt; ydelta = ((clipy-oldy )*scry) / scrollcnt; ymod = ((clipy-oldy )*scry) % scrollcnt; /* Preserve the final move location */ savex = clipx; savey = clipy; saveymax = clipymax; savexmax = clipxmax; /* * Set clipping rectangle to be just the region that will be exposed so * that drawing will be faster */ #if 0 /* Doesn't seem to work quite the way it should */ /* In some cases hero is 'centered' offscreen */ if( xdelta < 0 ) { clipx = oldx; clipxmax = clipx + incx; } else if( xdelta > 0 ) { clipxmax = oldxmax; clipx = clipxmax - incx; } else { clipx = oldx; clipxmax = oldxmax; } if( ydelta < 0 ) { clipy = oldy; clipymax = clipy + incy; } else if( ydelta > 0 ) { clipymax = oldymax; clipy = clipymax - incy; } else { clipy = oldy; clipymax = oldymax; } #endif /* Now, in scrollcnt moves, move the picture toward the final view */ for( i = 0; i < scrollcnt; ++i ) { #ifdef DISPMAP if( i == scrollcnt - 1 && (xmod != 0 || ymod != 0) && (xdelta != 0 || ydelta != 0) ) { incx += (clipx - oldx)%scrollcnt; incy += (clipy - oldy)%scrollcnt; xdelta += xmod; ydelta += ymod; } #endif /* Scroll the raster if we are scrolling */ if( xdelta != 0 || ydelta != 0 ) { ScrollRaster( rp, xdelta, ydelta, w->BorderLeft, w->BorderTop, w->Width - w->BorderRight - 1, w->Height - w->BorderBottom - 1 ); if( mincx == 0 ) incx = 0; else mincx -= incx; clipx += incx; clipxmax += incx; if( mincy == 0 ) incy = 0; else mincy -= incy; clipy += incy; clipymax += incy; /* Draw the exposed portion */ if (on_level(&u.uz0, &u.uz) && !restoring) (void) doredraw(); flush_glyph_buffer( amii_wins[ WIN_MAP ]->win ); } } clipx = savex; clipy = savey; clipymax = saveymax; clipxmax = savexmax; #endif if (on_level(&u.uz0, &u.uz) && !restoring && moves > 1) (void) doredraw(); flush_glyph_buffer( amii_wins[ WIN_MAP ]->win ); } reclip = 0; #endif } void flushIDCMP( port ) struct MsgPort *port; { struct Message *msg; while( msg = GetMsg( port ) ) ReplyMsg( msg ); } slashem-0.0.7E7F3/sys/amiga/amiwind.p0000664000076400007640000000256710545462317015373 0ustar aliali/* SCCS Id: @(#)amiwind.p 3.1 93/01/08 */ /* Copyright (c) Gregg Wonderly, Naperville, IL, 1992, 1993 */ /* NetHack may be freely redistributed. See license for details. */ /* amiwind.c */ #ifdef INTUI_NEW_LOOK struct Window *FDECL( OpenShWindow, (struct ExtNewWindow *) ); #else struct Window *FDECL( OpenShWindow, (struct NewWindow *) ); #endif void FDECL( CloseShWindow, (struct Window *)); int NDECL( kbhit ); int NDECL( amikbhit ); int NDECL( WindowGetchar ); WETYPE NDECL( WindowGetevent ); void NDECL( WindowFlush ); void FDECL( WindowPutchar, (char )); void FDECL( WindowFPuts, (const char *)); void FDECL( WindowPuts, (const char *)); void FDECL( WindowPrintf, ( char *,... )); void NDECL( CleanUp ); int FDECL( ConvertKey, ( struct IntuiMessage * )); #ifndef SHAREDLIB void FDECL( Abort, (long )); #endif void FDECL( flush_glyph_buffer, (struct Window *)); void FDECL( amiga_print_glyph, (winid , int , int )); void FDECL( start_glyphout, (winid )); void FDECL( amii_end_glyphout, (winid )); #ifdef INTUI_NEW_LOOK struct ExtNewWindow *FDECL( DupNewWindow, (struct ExtNewWindow *)); void FDECL( FreeNewWindow, (struct ExtNewWindow *)); #else struct NewWindow *FDECL( DupNewWindow, (struct NewWindow *)); void FDECL( FreeNewWindow, (struct NewWindow *)); #endif void NDECL( bell ); void NDECL( amii_delay_output ); void FDECL( amii_number_pad, (int )); void amii_cleanup( void ); slashem-0.0.7E7F3/sys/amiga/amisnd.c0000664000076400007640000001646410545462317015202 0ustar aliali/* SCCS Id: @(#)amisnd.c 3.2 2000/01/12*/ /* Copyright (c) 1992, 1993, 1995 by Gregg Wonderly */ /* NetHack may be freely redistributed. See license for details. */ /* * This file contains music playing code. * * If we were REALLY determined, we would make the sound play * asynchronously, but I'll save that one for a rainy day... */ #include "hack.h" #include "dlb.h" #undef red #undef blue #undef green #include #include #include #include #include #include #include #include #include #include #include #include #include #define AMII_AVERAGE_VOLUME 60 int amii_volume = AMII_AVERAGE_VOLUME; typedef struct VHDR { char name[4]; long len; unsigned long oneshot, repeat, samples; UWORD freq; UBYTE n_octaves, compress; LONG volume; } VHDR; typedef struct IFFHEAD { char FORM[4]; long flen; char _8SVX[4]; VHDR vhdr; char NAME[4]; long namelen; } IFFHEAD; extern struct GfxBase *GfxBase; UBYTE whichannel[] = { 1, 2, 4, 8 }; void makesound( char *, char *, int vol); void amii_speaker( struct obj *instr, char *melody, int vol ); /* A major scale in indexs to freqtab... */ int notetab[] = { 0, 2, 4, 5, 7, 9, 11, 12 }; /* Frequencies for a scale starting at one octave below 'middle C' */ long freqtab[] = { 220, /*A */ 233, /*Bb*/ 246, /*B */ 261, /*C */ 277, /*Db*/ 293, /*D */ 311, /*Eb*/ 329, /*E */ 349, /*F */ 370, /*Gb*/ 392, /*G */ 415, /*Ab*/ 440, /*A */ }; #ifdef TESTING main( argc, argv ) int argc; char **argv; { makesound( "wooden_flute", "AwBwCwDwEwFwGwawbwcwdwewfwgw", 60 ); makesound( "wooden_flute", "AhBhChDhEhFhGhahbhchdhehfhgh", 60 ); makesound( "wooden_flute", "AqBqCqDqEqFqGqaqbqcqdqeqfqgq", 60 ); makesound( "wooden_flute", "AeBeCeDeEeFeGeaebecedeeefege", 60 ); makesound( "wooden_flute", "AxBxCxDxExFxGxaxbxcxdxexfxgx", 60 ); makesound( "wooden_flute", "AtBtCtDtEtFtGtatbtctdtetftgt", 60 ); makesound( "wooden_flute", "AtBtCtDtEtFtGtatbtctdtetftgt", 60 ); makesound( "wooden_flute", "AtBtCtDtEtFtGtatbtctdtetftgt", 60 ); makesound( "wooden_flute", "AtBtCtDtEtFtGtatbtctdtetftgt", 60 ); makesound( "wooden_flute", "AtBtCtDtEtFtGtatbtctdtetftgt", 60 ); makesound( "wooden_flute", "AtBtCtDtEtFtGtatbtctdtetftgt", 60 ); makesound( "wooden_flute", "AtBtCtDtEtFtGtatbtctdtetftgt", 60 ); makesound( "wooden_flute", "AtBtCtDtEtFtGtatbtctdtetftgt", 60 ); makesound( "wooden_flute", "AtBtCtDtEtFtGtatbtctdtetftgt", 60 ); } #else void amii_speaker( struct obj *instr, char *melody, int vol ) { int typ = instr->otyp; char * actualn = (char *)OBJ_NAME( objects[typ] ) ; /* Make volume be relative to users volume level, with 60 being the * average level that will be passed to us. */ vol = vol * amii_volume / AMII_AVERAGE_VOLUME; makesound( actualn, melody, vol ); } #endif void makesound ( char *actualn , char * melody, int vol ) { char *t; int c, cycles, dot, dlay; dlb *stream = 0; IFFHEAD iffhead; struct IOAudio *AudioIO = 0; struct MsgPort *AudioMP = 0; struct Message *AudioMSG = 0; ULONG device = -1; BYTE *waveptr = 0; LONG frequency=440, duration=1, clock, samp, samples, samcyc=1; unsigned char name [ 100 ] ; if ( flags.silent ) return; if( GfxBase->DisplayFlags & PAL ) clock = 3546895; else clock = 3579545; /* * Convert type to file name - if there's nothing to play we * shouldn't be here in the first place. */ strncpy(name, actualn,sizeof(name) ) ; for( t = strchr( name, ' ' ); t; t = strchr( name, ' ' ) ) *t = '_'; if( (stream = dlb_fopen( name, "r" )) == NULL ) { perror( name ); return; } AudioIO = (struct IOAudio *) AllocMem( sizeof( struct IOAudio ), MEMF_PUBLIC|MEMF_CLEAR ); if( AudioIO == 0 ) goto killaudio; AudioMP = CreateMsgPort(); if( AudioMP == 0 ) goto killaudio; AudioIO->ioa_Request.io_Message.mn_ReplyPort = AudioMP; AudioIO->ioa_Request.io_Message.mn_Node.ln_Pri = 0; AudioIO->ioa_Request.io_Command = ADCMD_ALLOCATE; AudioIO->ioa_Request.io_Flags = ADIOF_NOWAIT; AudioIO->ioa_AllocKey = 0; AudioIO->ioa_Data = whichannel; AudioIO->ioa_Length = sizeof( whichannel ); device = OpenDevice( AUDIONAME, 0L, (struct IORequest *)AudioIO, 0L ); if( device != 0 ) goto killaudio; if( dlb_fread( (genericptr_t)&iffhead, sizeof( iffhead ), 1, stream ) != 1 ) goto killaudio; /* This is an even number of bytes long */ if( dlb_fread( name, (iffhead.namelen+1) & ~1, 1, stream ) != 1 ) goto killaudio; if( dlb_fread( (genericptr_t)&samples, 4, 1, stream ) != 1 ) goto killaudio; if( dlb_fread( (genericptr_t)&samples, 4, 1, stream ) != 1 ) goto killaudio; waveptr = AllocMem( samples, MEMF_CHIP|MEMF_PUBLIC ); if( !waveptr ) goto killaudio; if( dlb_fread( waveptr, samples, 1, stream ) != 1 ) goto killaudio; while( melody[0] && melody[1] ) { c = *melody++; duration = *melody++; dot = 0; if( *melody == '.' ) { dot = 1; ++melody; } switch( duration ) { case 'w': dlay = 3; duration = 1; cycles = 1; break; case 'h': dlay = 3; duration = 2; cycles = 1; break; case 'q': dlay = 2; duration = 4; cycles = 1; break; case 'e': dlay = 1; duration = 8; cycles = 1; break; case 'x': dlay = 0; duration = 16; cycles = 1; break; case 't': dlay = 0; duration = 32; cycles = 1; break; default: goto killaudio; /* unrecognized duration */ } /* Lower case characters are one octave above upper case */ switch( c ) { case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': c -= 'a' - 7; break; case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': c -= 'A'; break; default: continue; } samcyc = samples; /* lowercase start at middle 'C', upper case are one octave below */ frequency = c > 7 ? freqtab[notetab[c%7]]*2 : freqtab[notetab[c]]; /* We can't actually do a dotted whole note unless we add code for a real * 8SVX sample which includes sustain sample information to tell us how * to hold the note steady... So when duration == 1, ignore 'dot'... */ if( dot && duration > 1 ) samp = ((samples / duration) * 3) / 2; else samp = samples / duration; /* Only use some of the samples based on frequency */ samp = frequency * samp / 880; /* The 22khz samples are middle C samples, so adjust the play * back frequency accordingly */ frequency = (frequency * (iffhead.vhdr.freq*2)/3) / 440L; AudioIO->ioa_Request.io_Message.mn_ReplyPort = AudioMP; AudioIO->ioa_Request.io_Command = CMD_WRITE; AudioIO->ioa_Request.io_Flags = ADIOF_PERVOL; AudioIO->ioa_Data = (BYTE *)waveptr; AudioIO->ioa_Length = samp; /* The clock rate represents the unity rate, so dividing by * the frequency gives us a period ratio... */ /*printf( "clock: %ld, freq: %ld, div: %ld\n", clock, frequency, clock/frequency );*/ AudioIO->ioa_Period = clock/frequency; AudioIO->ioa_Volume = vol; AudioIO->ioa_Cycles = cycles; BeginIO( (struct IORequest *)AudioIO ); WaitPort( AudioMP ); AudioMSG = GetMsg( AudioMP ); if( dlay ) Delay( dlay ); } killaudio: if( stream ) dlb_fclose( stream ); if( waveptr ) FreeMem( waveptr, samples ); if( device == 0 ) CloseDevice( (struct IORequest *)AudioIO ); if( AudioMP ) DeleteMsgPort( AudioMP ); if( AudioIO ) FreeMem( AudioIO, sizeof( *AudioIO ) ); } slashem-0.0.7E7F3/sys/amiga/winext.h0000664000076400007640000000763110545462317015246 0ustar aliali/* SCCS Id: @(#)winext.h 3.1 2000/01/12 */ /* Copyright (c) Gregg Wonderly, Naperville, Illinois, 1991,1992,1993. */ /* NetHack may be freely redistributed. See license for details. */ extern int reclip; #ifdef CLIPPING extern int clipping; extern int clipx; extern int clipy; extern int clipxmax; extern int clipymax; extern int xclipbord, yclipbord; #endif extern int CO; extern int LI; extern int scrollmsg; extern int alwaysinvent; #ifndef SHAREDLIB extern unsigned short amii_defpens[ 20 ]; extern struct amii_DisplayDesc *amiIDisplay; /* the Amiga Intuition descriptor */ extern struct window_procs amii_procs; extern struct window_procs amiv_procs; extern unsigned short amii_initmap[ AMII_MAXCOLORS ]; extern unsigned short amiv_init_map[ AMII_MAXCOLORS ]; extern unsigned short amii_init_map[ AMII_MAXCOLORS ]; extern int bigscreen; extern int amii_numcolors; extern long amii_scrnmode; extern winid amii_rawprwin; extern struct Screen *HackScreen; extern char Initialized; /* These have already been defined elsewhere (and some are conflicting) * ... going ... going once ... going twice .... * extern const char *roles[]; * extern struct Library *ConsoleDevice; * extern char toplines[ TBUFSZ ]; * extern NEARDATA winid WIN_MESSAGE; * extern NEARDATA winid WIN_MAP; * extern NEARDATA winid WIN_STATUS; * extern NEARDATA winid WIN_INVEN; * extern winid WIN_OVER; * extern struct GfxBase *GfxBase; * extern struct Library *DiskfontBase; * extern struct IntuitionBase *IntuitionBase; * extern struct Library *LayersBase; */ extern int amii_msgAPen; extern int amii_msgBPen; extern int amii_statAPen; extern int amii_statBPen; extern int amii_menuAPen; extern int amii_menuBPen; extern int amii_textAPen; extern int amii_textBPen; extern int amii_otherAPen; extern int amii_otherBPen; #else extern WinamiBASE *WinamiBase; #endif /* All kinds of shared stuff */ extern struct TextAttr Hack160; extern struct TextAttr Hack40; extern struct TextAttr Hack80; extern struct TextAttr TextsFont13; extern struct Window *pr_WindowPtr; extern struct Menu HackMenu[]; extern struct Menu *MenuStrip; extern struct NewMenu GTHackMenu[]; extern APTR *VisualInfo; extern unsigned char KbdBuffered; extern struct TextFont *TextsFont; extern struct TextFont *HackFont; extern struct IOStdReq ConsoleIO; extern struct MsgPort *HackPort; extern int txwidth, txheight, txbaseline; #ifdef SUPERBITMAP_MAP extern struct BitMap amii_vbm; #endif /* This gadget data is replicated for menu/text windows... */ extern struct PropInfo PropScroll; extern struct Image Image1; extern struct Gadget MenuScroll; /* This gadget is for the message window... */ extern struct PropInfo MsgPropScroll; extern struct Image MsgImage1; extern struct Gadget MsgScroll; extern struct TagItem tags[]; extern struct win_setup { struct NewWindow newwin; UWORD offx,offy,maxrow,rows,maxcol,cols; /* CHECK TYPES */ } new_wins[]; extern UWORD scrnpens[]; /* The last Window event is stored here for reference. */ extern WEVENT lastevent; extern const char winpanicstr[]; extern struct TagItem scrntags[]; extern struct NewScreen NewHackScreen; extern int topl_addspace; extern char spaces[ 76 ]; extern int wincnt; /* # of nh windows opened */ extern struct Rectangle lastinvent, lastmsg; typedef struct { UWORD w, h; WORD x, y; UBYTE nPlanes; UBYTE masking; UBYTE compression; UBYTE reserved1; UWORD transparentColor; UBYTE xAspect, yAspect; WORD pageWidth, pageHeight; } BitMapHeader; typedef enum {COL_MAZE_BRICK,COL_MAZE_STONE,COL_MAZE_HEAT,COL_MAZE_WOOD} MazeType; extern struct PDAT pictdata; 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; slashem-0.0.7E7F3/sys/amiga/amifont.uu0000664000076400007640000000060610545462317015562 0ustar alialibegin 777 hack.font M#P```6AA8VLO.``````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` G````````````````````````````````````````````````"`!` ` end slashem-0.0.7E7F3/sys/amiga/mkdmake0000664000076400007640000000062110545462317015103 0ustar alialiGE/$@/%(left)/ GE/$ #include #include #if !defined(_DCC) && !defined(__GNUC__) #include #endif #include #include #include #include #include #include #include #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 * around with the rest of the #includes. --AMC */ #if defined(_DCC) && !defined(HACK_H) # define ptrdiff_t ptrdiff_t_ # define size_t size_t_ # define wchar_t wchar_t_ #endif #include #undef strcmpi #include #include #if defined(_DCC) && !defined(HACK_H) # undef ptrdiff_t # undef size_t # undef wchar_T #endif #ifdef IDCMP_CLOSEWINDOW # ifndef INTUI_NEW_LOOK # define INTUI_NEW_LOOK # endif #endif #ifndef HACK_H #include "hack.h" #endif #include "wintype.h" #include "winami.h" #include "func_tab.h" #ifndef CLIPPING CLIPPING must be defined for the AMIGA version #endif #undef LI #undef CO /*#define TOPL_GETLINE /* Don't use a window for getlin() */ /*#define WINDOW_YN /* Use a window for y/n questions */ #ifdef AZTEC_C #include #else #ifdef _DCC #include #include #include #include #include #include #else #include #include #include #include #include #include #include #endif /* kludge - see amirip for why */ # undef red # undef green # undef blue #ifdef _DCC # include #else # include #endif #ifdef _DCC # define __asm /* DICE doesn't like __asm */ #endif #ifndef __SASC_60 #undef index # define index strchr #endif #ifdef _DCC #include #else #include #endif #endif #ifdef SHAREDLIB #include "NH:sys/amiga/lib/libmacs.h" #endif #ifdef INTUI_NEW_LOOK #include #endif #define WINVERS_AMII (strcmp("amii",windowprocs.name)==0) #define WINVERS_AMIV (strcmp("amitile",windowprocs.name)==0) #define WINVERS_AMIT (strcmp("amitty",windowprocs.name)==0) /* cw->data[x] contains 2 characters worth of special information. These * characters are stored at the offsets as described here. */ #define VATTR 0 /* Video attribute is in this slot */ #define SEL_ITEM 1 /* If this is a select item, slot is 1 else 0 */ #define SOFF 2 /* The string starts here. */ #undef NULL #define NULL 0L /* * Versions we need of various libraries. We can't use LIBRARY_VERSION * as defined in because some of the libraries we need * don't have that version number in the 1.2 ROM. */ #define LIBRARY_FONT_VERSION 34L #define LIBRARY_TILE_VERSION 37L /* These values are just sorta suggestions in use, but are minimum requirements * in reality... */ #define WINDOWHEIGHT 192 #define SCREENHEIGHT 200 #define WIDTH 640 /* This character is a solid block (cursor) in Hack.font */ #define CURSOR_CHAR 0x90 #define FONTHEIGHT 8 #define FONTWIDTH 8 #define FONTBASELINE 8 #define MAPFTWIDTH 8 #define MAPFTHEIGHT 8 #define MAPFTBASELN 6 /* If Compiling with the "New Look", redefine these now */ #ifdef INTUI_NEW_LOOK #define NewWindow ExtNewWindow #define NewScreen ExtNewScreen #endif #define SIZEOF_DISKNAME 8 #define CSI '\x9b' #define NO_CHAR -1 #define RAWHELP 0x5F /* Rawkey code of the HELP key */ #define C_BLACK 0 #define C_WHITE 1 #define C_BROWN (WINVERS_AMIV ? 11 : 2) #define C_CYAN (WINVERS_AMIV ? 2 : 3) #define C_GREEN (WINVERS_AMIV ? 5 : 4) #define C_MAGENTA (WINVERS_AMIV ? 10 : 5) #define C_BLUE (WINVERS_AMIV ? 4 : 6) #define C_RED 7 #define C_ORANGE 3 #define C_GREY 6 #define C_LTGREEN 8 #define C_YELLOW 9 #define C_GREYBLUE 12 #define C_LTBROWN 13 #define C_LTGREY 14 #define C_PEACH 15 /* Structure describing tile files */ struct PDAT { long nplanes; /* Depth of images */ long pbytes; /* Bytes in a plane of data */ long across; /* Number of tiles across */ long down; /* Number of tiles down */ long npics; /* Number of pictures in this file */ long xsize; /* X-size of a tile */ long ysize; /* Y-size of a-tile */ }; #undef MAXCOLORS #define MAXCOLORS 256 slashem-0.0.7E7F3/sys/amiga/cvtsnd.c0000664000076400007640000000433410545462317015221 0ustar aliali/* SCCS Id: @(#)cvtsnd.c 3.2 95/09/10 */ /* Copyright (c) 1995, Andrew Church, Olney, Maryland */ /* NetHack may be freely redistributed. See license for details. */ #include #include #include typedef struct { short namelen; char name[62]; char misc[64]; /* rest of MacBinary header */ long FORM; long flen; long AIFF; long SSND; long sndlen; } AIFF; typedef struct { char FORM[4]; long flen; char _8SVX[4]; char VHDR[4]; long vhlen; long oneshot, repeat; long samples; /* 'samplesPerHiCycle' in the docs - usually 32, so * we'll use that */ short freq; char octaves, compress; long volume; char NAME[4]; long nlen; /* should be 64; see name[] comment */ char name[64]; /* for simplicity, i.e. just fwrite() entiree header */ char BODY[4]; long blen; } IFF; main(int ac, char **av) { FILE *in, *out; AIFF aiff; IFF iff; static char buf[16384]; long n, len; if (ac != 3) { fprintf(stderr, "Usage: %s input-file output-file\n", av[0]); exit(20); } if (!(in = fopen(av[1], "r"))) { fprintf(stderr, "Can't open input file\n"); exit(20); } if (!(out = fopen(av[2], "w"))) { fprintf(stderr, "Can't open output file\n"); exit(20); } fread(&aiff, sizeof(aiff), 1, in); memcpy(iff.FORM, "FORM", 4); iff.flen = sizeof(iff) + aiff.sndlen - 8; memcpy(iff._8SVX, "8SVX", 4); memcpy(iff.VHDR, "VHDR", 4); iff.vhlen = 20; iff.oneshot = aiff.sndlen; iff.repeat = 0; iff.samples = 32; iff.freq = 22000; iff.octaves = 1; iff.compress= 0; iff.volume = 0x10000; memcpy(iff.NAME, "NAME", 4); iff.nlen = 64; strncpy(iff.name, aiff.name, 62); iff.name[aiff.namelen] = 0; memcpy(iff.BODY, "BODY", 4); iff.blen = aiff.sndlen; fwrite(&iff, sizeof(iff), 1, out); len = aiff.sndlen; do { if (len >= sizeof(buf)) n = fread(buf, 1, sizeof(buf), in); else n = fread(buf, 1, len, in); if (n) { fwrite(buf, 1, n, out); len -= n; } } while (len && n); if (len) fprintf(stderr, "Warning: %ld bytes of sample missing\n", len); fclose(in); fclose(out); exit(0); } slashem-0.0.7E7F3/sys/amiga/winkey.c0000664000076400007640000000363310545462317015227 0ustar aliali/* SCCS Id: @(#)winkey.c 3.1 93/04/02 */ /* Copyright (c) Gregg Wonderly, Naperville, Illinois, 1991,1992,1993. */ /* NetHack may be freely redistributed. See license for details. */ #include "NH:sys/amiga/windefs.h" #include "NH:sys/amiga/winext.h" #include "NH:sys/amiga/winproto.h" amii_nh_poskey(x, y, mod) int*x, *y, *mod; { struct amii_WinDesc *cw; WETYPE type; struct RastPort *rp; struct Window *w; if( cw = amii_wins[WIN_MESSAGE] ) { cw->wflags &= ~FLMAP_SKIP; if( scrollmsg ) cw->wflags |= FLMSG_FIRST; cw->disprows = 0; } if( WIN_MAP != WIN_ERR && (cw = amii_wins[ WIN_MAP ]) && ( w = cw->win ) ) { cursor_on( WIN_MAP ); } else panic( "no MAP window opened for nh_poskey\n" ); rp = w->RPort; while( 1 ) { type = WindowGetevent( ); if( type == WEMOUSE ) { *mod = CLICK_1; if( lastevent.un.mouse.qual ) *mod = 0; /* X coordinates are 1 based, Y are 1 based. */ *x = ( (lastevent.un.mouse.x - w->BorderLeft) / mxsize ) + 1; *y = ( ( lastevent.un.mouse.y - w->BorderTop - MAPFTBASELN ) / mysize ) + 1; #ifdef CLIPPING if( clipping ) { *x += clipx; *y += clipy; } #endif return( 0 ); } else if( type == WEKEY ) { lastevent.type = WEUNK; return( lastevent.un.key ); } } } int amii_nhgetch() { int ch; struct amii_WinDesc *cw=amii_wins[WIN_MESSAGE]; if( WIN_MAP != WIN_ERR && amii_wins[ WIN_MAP ] ) { cursor_on( WIN_MAP ); } if(cw) cw->wflags &= ~FLMAP_SKIP; ch = WindowGetchar(); return( ch ); } void amii_get_nh_event() { /* nothing now - later I have no idea. Is this just a Mac hook? */ } void amii_getret() { register int c; raw_print( "" ); raw_print( "Press Return..." ); c = 0; while( c != '\n' && c != '\r' ) { if( HackPort ) c = WindowGetchar(); else c = getchar(); } return; } slashem-0.0.7E7F3/sys/amiga/winmenu.c0000664000076400007640000011122310545462317015376 0ustar aliali/* SCCS Id: @(#)winmenu.c 3.2 96/02/17 */ /* Copyright (c) Gregg Wonderly, Naperville, Illinois, 1991,1992,1993,1996. */ /* NetHack may be freely redistributed. See license for details. */ #include "NH:sys/amiga/windefs.h" #include "NH:sys/amiga/winext.h" #include "NH:sys/amiga/winproto.h" /* Start building the text for a menu */ void amii_start_menu(window) register winid window; { register int i; register struct amii_WinDesc *cw; register amii_menu_item *mip; if(window == WIN_ERR || (cw = amii_wins[window]) == NULL || cw->type != NHW_MENU) panic(winpanicstr,window, "start_menu"); amii_clear_nhwindow(window); if( cw->data && ( cw->type == NHW_MESSAGE || cw->type == NHW_MENU || cw->type == NHW_TEXT ) ) { for( i = 0; i < cw->maxrow; ++i ) { if( cw->data[ i ] ) free( cw->data[ i ] ); } free( cw->data ); cw->data = NULL; } for( mip = cw->menu.items, i = 0; (mip = cw->menu.items) && i < cw->menu.count; ++i ) { cw->menu.items = mip->next; free( mip ); } cw->menu.items = 0; cw->menu.count = 0; cw->menu.chr = 'a'; if( cw->morestr ) free( cw->morestr ); cw->morestr = NULL; if( window == WIN_INVEN && cw->win != NULL ) { if( alwaysinvent ) cw->wasup = 1; } cw->cury = cw->rows = cw->maxrow = cw->maxcol = 0; return; } /* Add a string to a menu */ void amii_add_menu(window,glyph, id, ch, gch, attr, str, preselected) register winid window; register int glyph; register const anything *id; register char ch; register char gch; register int attr; register const char *str; register BOOLEAN_P preselected; { register struct amii_WinDesc *cw; amii_menu_item *mip; char buf[ 4+BUFSZ ]; if(str == NULL)return; if(window == WIN_ERR || (cw = amii_wins[window]) == NULL || cw->type != NHW_MENU) panic(winpanicstr,window, "add_menu"); mip = (amii_menu_item *)alloc( sizeof( *mip ) ); mip->identifier = *id; mip->selected = preselected; mip->attr = attr; mip->glyph = Is_rogue_level(&u.uz) ? NO_GLYPH : glyph; mip->selector = 0; mip->gselector = gch; mip->count = -1; if (id->a_void && !ch && cw->menu.chr != 0) { ch = cw->menu.chr++; if( ch == 'z' ) cw->menu.chr = 'A'; if( ch == 'Z' ) cw->menu.chr = 0; } mip->canselect = ( id->a_void != 0 ); if( id->a_void && ch != '\0') { Sprintf( buf, "%c - %s", ch, str ); str = buf; mip->canselect = 1; } mip->selector = ch; amii_putstr( window, attr, str ); mip->str = cw->data[ cw->cury - 1 ]; cw->menu.count++; mip->next = NULL; if( cw->menu.items == 0 ) cw->menu.last = cw->menu.items = mip; else { cw->menu.last->next = mip; cw->menu.last = mip; } } /* Done building a menu. */ void amii_end_menu(window,morestr) register winid window; register const char *morestr; { register struct amii_WinDesc *cw; if(window == WIN_ERR || (cw=amii_wins[window]) == NULL || cw->type != NHW_MENU ) panic(winpanicstr,window, "end_menu"); if( morestr && *morestr ) { anything any; #define PROMPTFIRST /* Define this to have prompt first */ #ifdef PROMPTFIRST amii_menu_item *mip; int i; char *t; mip = cw->menu.last; #endif any.a_void = 0; amii_add_menu( window, NO_GLYPH, &any, 0, 0, ATR_NONE, morestr, MENU_UNSELECTED); #ifdef PROMPTFIRST /* Do some shuffling. Last first, push others one forward */ mip->next = NULL; cw->menu.last->next = cw->menu.items; cw->menu.items = cw->menu.last; cw->menu.last = mip; t = cw->data[cw->cury-1]; for (i=cw->cury-1; i>0; i--) { cw->data[i] = cw->data[i-1]; } cw->data[0] = t; #endif } /* If prompt first, don't put same string in title where in most cases it's not entirely visible anyway */ #ifndef PROMPTFIRST if( morestr ) cw->morestr = strdup( morestr ); #endif } /* Select something from the menu. */ int amii_select_menu(window, how, mip ) register winid window; register int how; register menu_item **mip; { int cnt; register struct amii_WinDesc *cw; if( window == WIN_ERR || ( cw=amii_wins[window] ) == NULL || cw->type != NHW_MENU ) panic(winpanicstr,window, "select_menu"); cnt = DoMenuScroll( window, 1, how, mip ); /* This would allow the inventory window to stay open. */ if( !alwaysinvent || window != WIN_INVEN ) dismiss_nhwindow(window); /* Now tear it down */ return cnt; } amii_menu_item * find_menu_item( register struct amii_WinDesc *cw, int idx ) { amii_menu_item *mip; for( mip = cw->menu.items; idx > 0 && mip; mip = mip->next ) --idx; return( mip ); } int make_menu_items( register struct amii_WinDesc *cw, register menu_item **rmip ) { register int idx = 0; register amii_menu_item *mip; register menu_item *mmip; for( mip = cw->menu.items; mip; mip = mip->next ) { if( mip->selected ) ++idx; } if( idx ) { mmip = *rmip = (menu_item *)alloc( idx * sizeof( *mip ) ); for( mip = cw->menu.items; mip; mip = mip->next ) { if( mip->selected ) { mmip->item = mip->identifier; mmip->count = mip->count; mmip++; } } cw->mi = *rmip; } return( idx ); } int DoMenuScroll( win, blocking, how, retmip ) int win, blocking, how; menu_item **retmip; { amii_menu_item *amip; register struct Window *w; register struct NewWindow *nw; struct PropInfo *pip; register struct amii_WinDesc *cw; struct IntuiMessage *imsg; struct Gadget *gd; register int wheight, xsize, ysize, aredone = 0; register int txwd, txh; long mics, secs, class, code; long oldmics = 0, oldsecs = 0; int aidx, oidx, topidx, hidden; int totalvis; SHORT mx, my; static char title[ 100 ]; int dosize = 1; struct Screen *scrn = HackScreen; int x1,x2,y1,y2; long counting = FALSE, count = 0, reset_counting = FALSE; char countString[32]; if( win == WIN_ERR || ( cw = amii_wins[ win ] ) == NULL ) panic(winpanicstr,win,"DoMenuScroll"); /* Initial guess at window sizing values */ txwd = txwidth; if( WINVERS_AMIV ) { if( win == WIN_INVEN ) txh = max( txheight, pictdata.ysize + 3 ); /* interline space */ else txh = txheight; /* interline space */ } else txh = txheight; /* interline space */ /* Check to see if we should open the window, should need to for * TEXT and MENU but not MESSAGE. */ w = cw->win; topidx = 0; if( w == NULL ) { #ifdef INTUI_NEW_LOOK if( IntuitionBase->LibNode.lib_Version >= 37 ) { PropScroll.Flags |= PROPNEWLOOK; } #endif nw = (void *)DupNewWindow( (void *)(&new_wins[ cw->type ].newwin) ); if( !alwaysinvent || win != WIN_INVEN ) { xsize = scrn->WBorLeft + scrn->WBorRight + MenuScroll.Width + 1 + (txwd * cw->maxcol); if( WINVERS_AMIV ) { if( win == WIN_INVEN ) xsize += pictdata.xsize + 4; } if( xsize > amiIDisplay->xpix ) xsize = amiIDisplay->xpix; /* If next row not off window, use it, else use the bottom */ ysize = ( txh * cw->maxrow ) + /* The text space */ HackScreen->WBorTop + txheight + 1 + /* Top border */ HackScreen->WBorBottom + 3; /* The bottom border */ if( ysize > amiIDisplay->ypix ) ysize = amiIDisplay->ypix; /* Adjust the size of the menu scroll gadget */ nw->TopEdge = 0; if( cw->type == NHW_TEXT && ysize < amiIDisplay->ypix ) nw->TopEdge += ( amiIDisplay->ypix - ysize ) / 2; nw->LeftEdge = amiIDisplay->xpix - xsize; if( cw->type == NHW_MENU ) { if( nw->LeftEdge > 10 ) nw->LeftEdge -= 10; else nw->LeftEdge = 0; if( amiIDisplay->ypix - nw->Height > 10 ) nw->TopEdge += 10; else nw->TopEdge = amiIDisplay->ypix - nw->Height - 1; } if( cw->type == NHW_TEXT && xsize < amiIDisplay->xpix ) nw->LeftEdge -= ( amiIDisplay->xpix - xsize ) / 2; } else if( win == WIN_INVEN ) { struct Window *mw = amii_wins[ WIN_MAP ]->win; struct Window *sw = amii_wins[ WIN_STATUS ]->win; xsize = scrn->WBorLeft + scrn->WBorRight + MenuScroll.Width + 1 + (txwd * cw->maxcol); /* Make space for the glyph to appear at the left of the description */ if( WINVERS_AMIV ) xsize += pictdata.xsize + 4; if( xsize > amiIDisplay->xpix ) xsize = amiIDisplay->xpix; /* If next row not off window, use it, else use the bottom */ ysize = sw->TopEdge - (mw->TopEdge + mw->Height) - 1; if( ysize > amiIDisplay->ypix ) ysize = amiIDisplay->ypix; /* Adjust the size of the menu scroll gadget */ nw->TopEdge = mw->TopEdge + mw->Height; nw->LeftEdge = 0; } cw->newwin = (void *)nw; if( nw == NULL ) panic("No NewWindow Allocated" ); nw->Screen = HackScreen; if( win == WIN_INVEN ) { sprintf( title, "%s the %s's Inventory", plname, pl_character ); nw->Title = title; if( lastinvent.MaxX != 0 ) { nw->LeftEdge = lastinvent.MinX; nw->TopEdge = lastinvent.MinY; nw->Width = lastinvent.MaxX; nw->Height = lastinvent.MaxY; } } else if( cw->morestr ) nw->Title = cw->morestr; /* Adjust the window coordinates and size now that we know * how many items are to be displayed. */ if( ( xsize > amiIDisplay->xpix - nw->LeftEdge ) && ( xsize < amiIDisplay->xpix ) ) { nw->LeftEdge = amiIDisplay->xpix - xsize; nw->Width = xsize; } else { nw->Width = min( xsize, amiIDisplay->xpix - nw->LeftEdge ); } 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; } /* Now, open the window */ w = cw->win = OpenShWindow( (void *)nw ); if( w == NULL ) { char buf[ 130 ]; sprintf( buf, "No Window Opened For Menu (%d,%d,%d-%d,%d-%d)", nw->LeftEdge, nw->TopEdge, nw->Width, amiIDisplay->xpix, nw->Height, amiIDisplay->ypix ); panic( buf ); } #ifdef HACKFONT if( TextsFont ) SetFont(w->RPort, TextsFont ); else if( HackFont ) SetFont(w->RPort, HackFont ); #endif txwd = w->RPort->TxWidth; if( WINVERS_AMIV ) { if( win == WIN_INVEN ) txh = max( w->RPort->TxHeight, pictdata.ysize + 3 ); /* interline space */ else txh = w->RPort->TxHeight; /* interline space */ } else txh = w->RPort->TxHeight; /* interline space */ /* subtract 2 to account for spacing away from border (1 on each side) */ wheight = ( w->Height - w->BorderTop - w->BorderBottom - 2 ) / txh; if( WINVERS_AMIV ) { if( win == WIN_INVEN ) { cw->cols = ( w->Width - w->BorderLeft - w->BorderRight - 4 - pictdata.xsize - 3 ) / txwd; } else { cw->cols = ( w->Width - w->BorderLeft - w->BorderRight - 4 ) / txwd; } } else { cw->cols = ( w->Width - w->BorderLeft - w->BorderRight - 4 ) / txwd; } totalvis = CountLines( win ); } else { txwd = w->RPort->TxWidth; if( WINVERS_AMIV ) { if( win == WIN_INVEN ) txh = max( w->RPort->TxHeight, pictdata.ysize + 3 ); /* interline space */ else txh = w->RPort->TxHeight; /* interline space */ } else { txh = w->RPort->TxHeight; /* interline space */ } /* subtract 2 to account for spacing away from border (1 on each side) */ wheight = ( w->Height - w->BorderTop - w->BorderBottom - 2 ) / txh; if( WINVERS_AMIV ) { if( win == WIN_INVEN ) { cw->cols = ( w->Width - w->BorderLeft - w->BorderRight - 4 - pictdata.xsize - 3) / txwd; } else cw->cols = ( w->Width - w->BorderLeft - w->BorderRight - 4 ) / txwd; } else { cw->cols = ( w->Width - w->BorderLeft - w->BorderRight - 4 ) / txwd; } totalvis = CountLines( win ); for( gd = w->FirstGadget; gd && gd->GadgetID != 1; ) gd = gd->NextGadget; if( gd ) { pip = (struct PropInfo *)gd->SpecialInfo; hidden = max( totalvis - wheight, 0 ); topidx = (((ULONG)hidden * pip->VertPot) + (MAXPOT/2)) >> 16; } } for( gd = w->FirstGadget; gd && gd->GadgetID != 1; ) gd = gd->NextGadget; if( !gd ) panic("Can't find scroll gadget" ); morc = 0; oidx = -1; #if 0 /* Make sure there are no selections left over from last time. */ /* XXX potential problem for preselection if this is really needed */ for( amip = cw->menu.items; amip; amip = amip->next ) amip->selected = 0; #endif DisplayData( win, topidx ); /* Make the prop gadget the right size and place */ SetPropInfo( w, gd, wheight, totalvis, topidx ); oldsecs = oldmics = 0; /* If window already up, don't stop to process events */ if( cw->wasup ) { aredone = 1; cw->wasup = 0; } while( !aredone ) { /* Process window messages */ WaitPort( w->UserPort ); while( imsg = (struct IntuiMessage * ) GetMsg( w->UserPort ) ) { class = imsg->Class; code = imsg->Code; mics = imsg->Micros; secs = imsg->Seconds; gd = (struct Gadget *) imsg->IAddress; mx = imsg->MouseX; my = imsg->MouseY; /* Only do our window or VANILLAKEY from other windows */ if( imsg->IDCMPWindow != w && class != VANILLAKEY && class != RAWKEY ) { ReplyMsg( (struct Message *) imsg ); continue; } /* Do DeadKeyConvert() stuff if RAWKEY... */ if( class == RAWKEY ) { class = VANILLAKEY; code = ConvertKey( imsg ); } ReplyMsg( (struct Message *) imsg ); switch( class ) { case NEWSIZE: /* * Ignore every other newsize, no action needed, * except RefreshWindowFrame() in case borders got overwritten * for some reason. It should not happen, but ... */ if( !dosize ) { RefreshWindowFrame(w); dosize = 1; break; } if( win == WIN_INVEN ) { lastinvent.MinX = w->LeftEdge; lastinvent.MinY = w->TopEdge; lastinvent.MaxX = w->Width; lastinvent.MaxY = w->Height; } else if( win == WIN_MESSAGE ) { lastmsg.MinX = w->LeftEdge; lastmsg.MinY = w->TopEdge; lastmsg.MaxX = w->Width; lastmsg.MaxY = w->Height; } /* Find the gadget */ for( gd = w->FirstGadget; gd && gd->GadgetID != 1; ) gd = gd->NextGadget; if( !gd ) panic("Can't find scroll gadget" ); totalvis = CountLines( win ); wheight = ( w->Height - w->BorderTop - w->BorderBottom - 2) / txh; if( WINVERS_AMIV ) { if( win == WIN_INVEN ) { cw->cols = ( w->Width - w->BorderLeft - w->BorderRight - 4 - pictdata.xsize - 3) / txwd; } else cw->cols = ( w->Width - w->BorderLeft - w->BorderRight - 4 ) / txwd; } else { cw->cols = ( w->Width - w->BorderLeft - w->BorderRight - 4 ) / txwd; } if( wheight < 2 ) wheight = 2; /* * Clear the right side & bottom. Parts of letters are not erased by * amii_cl_end if window shrinks and columns decrease. */ if ( WINVERS_AMII || WINVERS_AMIV ) { amii_setfillpens(w, cw->type); SetDrMd(w->RPort, JAM2); x2 = w->Width - w->BorderRight; y2 = w->Height - w->BorderBottom; x1 = x2 - w->IFont->tf_XSize - w->IFont->tf_XSize; y1 = w->BorderTop; if (x1 < w->BorderLeft) x1 = w->BorderLeft; RectFill(w->RPort, x1, y1, x2, y2); x1 = w->BorderLeft; y1 = y1 - w->IFont->tf_YSize; RectFill(w->RPort, x1, y1, x2, y2); RefreshWindowFrame(w); } /* Make the prop gadget the right size and place */ DisplayData( win, topidx ); SetPropInfo( w, gd, wheight, totalvis, topidx ); /* Force the window to a text line boundary <= to * what the user dragged it to. This eliminates * having to clean things up on the bottom edge. */ SizeWindow( w, 0, ( wheight * txh) + w->BorderTop + w->BorderBottom + 2 - w->Height ); /* Don't do next NEWSIZE, we caused it */ dosize = 0; oldsecs = oldmics = 0; break; case VANILLAKEY: #define CTRL(x) ((x)-'@') morc = code = map_menu_cmd(code); if (code == MENU_SELECT_ALL) { if (how == PICK_ANY) { amip = cw->menu.items; while (amip) { if (amip->canselect && amip->selector) { /* * Select those yet unselected * and apply count if necessary */ if (!amip->selected) { amip->selected = TRUE; if (counting) { amip->count = count; reset_counting = TRUE; /* * This makes the assumption that * the string is in format "X - foo" * with additional selecting and formatting * data in front (size SOFF) */ amip->str[SOFF+2] = '#'; } else { amip->count = -1; amip->str[SOFF+2] = '-'; } } } amip=amip->next; } DisplayData(win, topidx); } } else if (code == MENU_UNSELECT_ALL) { if (how == PICK_ANY) { amip = cw->menu.items; while (amip) { if (amip->selected) { amip->selected = FALSE; amip->count = -1; amip->str[SOFF+2] = '-'; } amip=amip->next; } DisplayData(win, topidx); } } else if (code == MENU_INVERT_ALL) { 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; amip->str[SOFF+2] = '#'; reset_counting = TRUE; } else { amip->count = -1; amip->str[SOFF+2] = '-'; } } amip=amip->next; } DisplayData(win, topidx); } } else if (code == MENU_SELECT_PAGE) { if (how == PICK_ANY) { int i = 0; amip = cw->menu.items; 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; reset_counting = TRUE; amip->str[SOFF+2] = '#'; } else { amip->count = -1; amip->str[SOFF+2] = '-'; } } amip->selected = TRUE; } } DisplayData(win, topidx); } } else if (code == MENU_UNSELECT_PAGE) { if (how == PICK_ANY) { int i = 0; amip = cw->menu.items; 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] = '-'; } } DisplayData(win, topidx); } } else if (code == MENU_INVERT_PAGE) { if (how == PICK_ANY) { int i = 0; amip = cw->menu.items; 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; amip->str[SOFF+2] = '#'; reset_counting = TRUE; } else { amip->count = -1; amip->str[SOFF+2] = '-'; } } } DisplayData(win, topidx); } } else if (code == MENU_SEARCH && cw->type == NHW_MENU) { if (how == PICK_ONE || how == PICK_ANY) { char buf[BUFSZ]; amip = cw->menu.items; amii_getlin("Search for:", buf); 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; aredone = 1; break; } amip->selected = !amip->selected; if (counting && amip->selected) { amip->count = count; reset_counting = TRUE; amip->str[SOFF+2] = '#'; } else { amip->count = -1; reset_counting = TRUE; amip->str[SOFF+2] = '-'; } } amip = amip->next; } } DisplayData(win, topidx); } else if (how == PICK_ANY && isdigit(code) && (counting || (!counting && code !='0'))) { if (count < LARGEST_INT) { count = count*10 + (long)(code-'0'); if (count > LARGEST_INT) count = LARGEST_INT; if (count > 0) { counting = TRUE; reset_counting = FALSE; } else { reset_counting = TRUE; } sprintf(countString, "Count: %d", count); pline(countString); } } else if( code == CTRL('D') || code == CTRL('U') || code == MENU_NEXT_PAGE || code == MENU_PREVIOUS_PAGE || code == MENU_FIRST_PAGE || code == MENU_LAST_PAGE ) { int endcnt, i; for( gd = w->FirstGadget; gd && gd->GadgetID != 1; ) gd = gd->NextGadget; if( !gd ) panic("Can't find scroll gadget" ); endcnt = wheight; /* /2; */ if( endcnt == 0 ) endcnt = 1; if (code == MENU_FIRST_PAGE) { topidx = 0; } else if (code == MENU_LAST_PAGE) { topidx = cw->maxrow - wheight; } else for( i = 0; i < endcnt; ++i ) { if (code == CTRL('D') || code == MENU_NEXT_PAGE) { if( topidx + wheight < cw->maxrow ) ++topidx; else break; } else if (code = CTRL('U') || code == MENU_PREVIOUS_PAGE) { if( topidx > 0 ) --topidx; else break; } } /* Make prop gadget the right size and place */ DisplayData( win, topidx ); SetPropInfo( w,gd, wheight, totalvis, topidx ); oldsecs = oldmics = 0; } else if( code == '\b' ) { for( gd = w->FirstGadget; gd && gd->GadgetID != 1; ) gd = gd->NextGadget; if( !gd ) panic("Can't find scroll gadget" ); if( topidx - wheight - 2 < 0 ) { topidx = 0; } else { topidx -= wheight - 2; } DisplayData( win, topidx ); SetPropInfo( w, gd, wheight, totalvis, topidx ); oldsecs = oldmics = 0; } else if( code == ' ' ) { for( gd = w->FirstGadget; gd && gd->GadgetID != 1; ) gd = gd->NextGadget; if( !gd ) panic("Can't find scroll gadget" ); if( topidx + wheight >= cw->maxrow ) { morc = 0; aredone = 1; } else { /* If there are still lines to be seen */ if( cw->maxrow > topidx + wheight ) { if( wheight > 2 ) topidx += wheight - 2; else ++topidx; DisplayData( win, topidx ); SetPropInfo( w, gd, wheight, totalvis, topidx ); } oldsecs = oldmics = 0; } } else if( code == '\n' || code == '\r' ) { for( gd = w->FirstGadget; gd && gd->GadgetID != 1; ) gd = gd->NextGadget; if( !gd ) panic("Can't find scroll gadget" ); /* If all line displayed, we are done */ if( topidx + wheight >= cw->maxrow ) { morc = 0; aredone = 1; } else { /* If there are still lines to be seen */ if( cw->maxrow > topidx + 1 ) { ++topidx; DisplayData( win, topidx ); SetPropInfo( w, gd, wheight, totalvis, topidx ); } oldsecs = oldmics = 0; } } else if( code == '\33' ) { if (counting) { reset_counting = TRUE; } else { aredone = 1; } } else { int selected = FALSE; for( amip = cw->menu.items; amip; amip = amip->next ) { if( amip->selector == code ) { if( how == PICK_ONE ) aredone = 1; amip->selected = !amip->selected; if (counting && amip->selected) { amip->count = count; reset_counting = TRUE; amip->str[SOFF+2] = '#'; } else { amip->count = -1; reset_counting = TRUE; amip->str[SOFF+2] = '-'; } selected = TRUE; } else if (amip->gselector == code ) { amip->selected = !amip->selected; if (counting) { amip->count = count; reset_counting = TRUE; amip->str[SOFF+2] = '#'; } else { amip->count = -1; reset_counting = TRUE; amip->str[SOFF+2] = '-'; } selected = TRUE; } } if (selected) DisplayData( win, topidx ); } break; case CLOSEWINDOW: if( win == WIN_INVEN ) { lastinvent.MinX = w->LeftEdge; lastinvent.MinY = w->TopEdge; lastinvent.MaxX = w->Width; lastinvent.MaxY = w->Height; } else if( win == WIN_MESSAGE ) { lastmsg.MinX = w->LeftEdge; lastmsg.MinY = w->TopEdge; lastmsg.MaxX = w->Width; lastmsg.MaxY = w->Height; } aredone = 1; morc = '\33'; break; case GADGETUP: if( win == WIN_MESSAGE ) aredone = 1; for( gd = w->FirstGadget; gd && gd->GadgetID != 1; ) gd = gd->NextGadget; pip = (struct PropInfo *)gd->SpecialInfo; totalvis = CountLines( win ); hidden = max( totalvis - wheight, 0 ); aidx = (((ULONG)hidden * pip->VertPot) + (MAXPOT/2)) >> 16; if( aidx != topidx ) DisplayData( win, topidx = aidx ); break; case MOUSEMOVE: for( gd = w->FirstGadget; gd && gd->GadgetID != 1; ) gd = gd->NextGadget; pip = (struct PropInfo *)gd->SpecialInfo; totalvis = CountLines( win ); hidden = max( totalvis - wheight, 0 ); aidx = (((ULONG)hidden * pip->VertPot) + (MAXPOT/2)) >> 16; if( aidx != topidx ) DisplayData( win, topidx = aidx ); break; case INACTIVEWINDOW: if( win == WIN_MESSAGE || ( win == WIN_INVEN && alwaysinvent ) ) aredone = 1; break; case MOUSEBUTTONS: if( ( code == SELECTUP || code == SELECTDOWN ) && cw->type == NHW_MENU && how != PICK_NONE ) { /* Which one is the mouse pointing at? */ aidx = ( ( my - w->BorderTop - 1 ) / txh ) + topidx; /* If different lines, don't select double click */ if( aidx != oidx ) { oldsecs = 0; oldmics = 0; } /* If releasing, check for double click */ if( code == SELECTUP ) { amip = find_menu_item( cw, aidx ); if( aidx == oidx ) { if( DoubleClick( oldsecs, oldmics, secs, mics ) ) { aredone = 1; } oldsecs = secs; oldmics = mics; } else { amip = find_menu_item( cw, oidx ); amip->selected = 0; amip->count = -1; reset_counting = TRUE; if (amip->canselect && amip->selector) amip->str[SOFF+2] = '-'; } if (counting && amip->selected && amip->canselect && amip->selector) { amip->count = count; reset_counting = TRUE; amip->str[SOFF+2] = '#'; } DisplayData( win, topidx ); } else if( aidx - topidx < wheight && aidx < cw->maxrow && code == SELECTDOWN ) { /* Remove old highlighting if visible */ amip = find_menu_item( cw, oidx ); if( amip && oidx != aidx && ( oidx > topidx && oidx - topidx < wheight ) ) { if( how != PICK_ANY ) { 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, oldmics, secs, mics ) ) { amip->selected = !amip->selected; if (counting && amip->selected) { amip->count = count; reset_counting = TRUE; amip->str[SOFF+2] = '#'; } else { amip->count = -1; reset_counting = TRUE; if (amip->canselect && amip->selector) amip->str[SOFF+2] = '-'; } } } else { DisplayBeep( NULL ); oldsecs = 0; oldmics = 0; } DisplayData( win, topidx ); } } else { 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; if (counting) pline("Count: 0"); counting = FALSE; } } } /* Force a cursor reposition before next message output */ if( win == WIN_MESSAGE ) cw->curx = -1; return( make_menu_items( cw, retmip ) ); } void ReDisplayData( win ) winid win; { int totalvis; register struct amii_WinDesc *cw; register struct Window *w; register struct Gadget *gd; unsigned long hidden, aidx, wheight; struct PropInfo *pip; if( win == WIN_ERR || !(cw = amii_wins[win]) || !( w = cw->win ) ) return; for( gd = w->FirstGadget; gd && gd->GadgetID != 1; ) gd = gd->NextGadget; if( !gd ) return; wheight = (w->Height - w->BorderTop - w->BorderBottom-2)/w->RPort->TxHeight; pip = (struct PropInfo *)gd->SpecialInfo; totalvis = CountLines( win ); hidden = max( totalvis - wheight, 0 ); aidx = (((ULONG)hidden * pip->VertPot) + (MAXPOT/2)) >> 16; clear_nhwindow( win ); DisplayData( win, aidx ); } long FindLine( win, line ) winid win; int line; { int txwd; register char *t; register struct amii_WinDesc *cw; register struct Window *w; register int i, disprow, len; int col = -1; if( win == WIN_ERR || !(cw = amii_wins[win]) || !( w = cw->win ) ) { panic( winpanicstr, win, "No Window in FindLine" ); } txwd = w->RPort->TxWidth; if( WINVERS_AMIV ) { if( win == WIN_INVEN ) { cw->cols = ( w->Width - w->BorderLeft - w->BorderRight - 4 - pictdata.xsize - 3) / txwd; } else cw->cols = ( w->Width - w->BorderLeft - w->BorderRight - 4 ) / txwd; } else { cw->cols = ( w->Width - w->BorderLeft - w->BorderRight - 4 ) / txwd; } disprow = 0; for( col = i = 0; line > disprow && i < cw->maxrow; ++i ) { t = cw->data[ i ] + SOFF; if( cw->data[i][1] >= 0 ) { ++disprow; col = 0; } while( *t ) { len = strlen( t ); if( col + len > cw->cols ) len = cw->cols - col; while( len > 0 ) { if( !t[len] || t[len] == ' ' ) break; --len; } if( len == 0 ) { while ( *t && *t != ' ') { t++; col++; } } else { t += len; col += len; } if( *t ) { while( *t == ' ' ) ++t; col = 0; ++disprow; } } } return( i ); } long CountLines( win ) winid win; { int txwd; amii_menu_item *mip; register char *t; register struct amii_WinDesc *cw; register struct Window *w; register int i, disprow, len; int col = -1; if( win == WIN_ERR || !(cw = amii_wins[win]) || !( w = cw->win ) ) { panic( winpanicstr, win, "No Window in CountLines" ); } txwd = w->RPort->TxWidth; if( WINVERS_AMIV ) { if( win == WIN_INVEN ) { cw->cols = ( w->Width - w->BorderLeft - w->BorderRight - 4 - pictdata.xsize - 3) / txwd; } else cw->cols = ( w->Width - w->BorderLeft - w->BorderRight - 4 ) / txwd; } else { cw->cols = ( w->Width - w->BorderLeft - w->BorderRight - 4 ) / txwd; } disprow = cw->maxrow; mip = cw->menu.items; for( col = i = 0; i < cw->maxrow; ++i ) { t = cw->data[ i ] + SOFF; if( cw->type == NHW_MESSAGE && cw->data[ i ][ SEL_ITEM ] < 0 ) --disprow; else col = 0; while( *t ) { len = strlen( t ); if( col + len > cw->cols ) len = cw->cols - col; while( len > 0 ) { if( !t[len] || t[len] == ' ' ) break; --len; } if( len == 0 ) { while ( *t && *t != ' ') { t++; col++; } } else { t += len; col += len; } if( *t ) { while( *t == ' ' ) ++t; col = 0; ++disprow; } } } return( disprow ); } void DisplayData( win, start ) winid win; int start; { int txwd; amii_menu_item *mip; register char *t; register struct amii_WinDesc *cw; register struct Window *w; register struct RastPort *rp; register int i, disprow, len, wheight; int whichcolor = -1; int col; if( win == WIN_ERR || !(cw = amii_wins[win]) || !( w = cw->win ) ) { panic( winpanicstr, win, "No Window in DisplayData" ); } rp = w->RPort; SetDrMd( rp, JAM2 ); if( WINVERS_AMIV && win == WIN_INVEN ) { wheight = ( w->Height - w->BorderTop - w->BorderBottom - 2 ) / max( rp->TxHeight, pictdata.ysize + 3 ); } else { wheight = ( w->Height - w->BorderTop - w->BorderBottom - 2 ) / rp->TxHeight; } cw->rows = wheight; txwd = rp->TxWidth; if( WINVERS_AMIV ) { if( win == WIN_INVEN ) { cw->cols = ( w->Width - w->BorderLeft - w->BorderRight - 4 - pictdata.xsize - 3) / txwd; } else cw->cols = ( w->Width - w->BorderLeft - w->BorderRight - 4 ) / txwd; } else { cw->cols = ( w->Width - w->BorderLeft - w->BorderRight - 4 ) / txwd; } /* Get the real line to display at */ start = FindLine( win, start ); mip = cw->menu.items; for( i = 0; mip && i < start; ++i ) { mip = mip->next; } /* Skip any initial response to a previous line */ if( cw->type == NHW_MESSAGE && mip && mip->selected < 0 ) ++start; if( WINVERS_AMIV && cw->type == NHW_MESSAGE ) SetAPen( rp, amii_msgAPen ); for( disprow = i = start; disprow < wheight + start; i++ ) { /* Just erase unused lines in the window */ if( i >= cw->maxrow ) { if (WINVERS_AMIV && win == WIN_INVEN) { amii_curs( win, 0, disprow - start ); amiga_print_glyph( win, 0, NO_GLYPH); } amii_curs( win, 1, disprow - start ); amii_cl_end( cw, 0 ); ++disprow; continue; } /* Any string with a highlighted attribute goes * onto the end of the current line in the message window. */ if( cw->type == NHW_MESSAGE ) SetAPen( rp, cw->data[ i ][ SEL_ITEM ] < 0 ? C_RED : amii_msgAPen ); /* Selected text in the message window goes onto the end of the current line */ if( cw->type != NHW_MESSAGE || cw->data[ i ][ SEL_ITEM ] >= 0 ) { amii_curs( win, 1, disprow - start ); if( WINVERS_AMIV && win == WIN_INVEN ) { if( mip ) amiga_print_glyph( win, 0, mip->glyph ); amii_curs( win, 1, disprow - start ); } col = 0; } /* If this entry is to be highlighted, do so */ if( mip && mip->selected != 0 ) { if( whichcolor != 1 ) { SetDrMd( rp, JAM2 ); if( WINVERS_AMIV ) { SetAPen( rp, amii_menuBPen ); SetBPen( rp, C_BLUE ); } else { SetAPen( rp, C_BLUE ); SetBPen( rp, amii_menuAPen ); } whichcolor = 1; } } else if( whichcolor != 2 ) { SetDrMd( rp, JAM2 ); if( cw->type == NHW_MESSAGE ) { SetAPen( rp, amii_msgAPen ); SetBPen( rp, amii_msgBPen ); } else if( cw->type == NHW_MENU ) { SetAPen( rp, amii_menuAPen ); SetBPen( rp, amii_menuBPen ); } else if( cw->type == NHW_TEXT ) { SetAPen( rp, amii_textAPen ); SetBPen( rp, amii_textBPen ); } whichcolor = 2; } /* Next line out, wrap if too long */ t = cw->data[ i ] + SOFF; ++disprow; col = 0; while( *t ) { len = strlen( t ); if( len > (cw->cols - col) ) len = cw->cols - col; while( len > 0 ) { if( !t[len] || t[len] == ' ' ) break; --len; } if( len == 0 ) { Text( rp, t, cw->cols - col ); while ( *t && *t != ' ') { t++; col++; } } else { Text( rp, t, len ); t += len; col += len; } amii_cl_end( cw, col ); if( *t ) { ++disprow; /* Stop at the bottom of the window */ if( disprow > wheight + start ) break; while( *t == ' ' ) ++t; amii_curs( win, 1, disprow - start - 1 ); if( mip && win == WIN_INVEN && WINVERS_AMIV ) { /* Erase any previous glyph drawn here. */ amiga_print_glyph( win, 0, NO_GLYPH ); amii_curs( win, 1, disprow - start - 1 ); } Text( rp, "+", 1 ); col = 1; } } if( cw->type == NHW_MESSAGE ) { SetAPen( rp, amii_msgBPen ); SetBPen( rp, amii_msgBPen ); } else if( cw->type == NHW_MENU ) { SetAPen( rp, amii_menuBPen ); SetBPen( rp, amii_menuBPen ); } else if( cw->type == NHW_TEXT ) { SetAPen( rp, amii_textBPen ); SetBPen( rp, amii_textBPen ); } amii_cl_end( cw, col ); whichcolor = -1; if( mip ) mip = mip->next; } RefreshWindowFrame(w); return; } void SetPropInfo( win, gad, vis, total, top ) register struct Window *win; register struct Gadget *gad; register long vis, total, top; { long mflags; register long hidden; register int body, pot; hidden = max( total-vis, 0 ); /* Force the last section to be just to the bottom */ if( top > hidden ) top = hidden; /* Scale the body position. */ /* 2 lines overlap */ if( hidden > 0 && total > 2) body = (ULONG) ((vis - 2) * MAXBODY) / (total - 2); else body = MAXBODY; if( hidden > 0 ) pot = (ULONG) (top * MAXPOT) / hidden; else pot = 0; mflags = AUTOKNOB|FREEVERT; #ifdef INTUI_NEW_LOOK if( IntuitionBase->LibNode.lib_Version >= 37 ) { mflags |= PROPNEWLOOK; } #endif NewModifyProp( gad, win, NULL, mflags, 0, pot, MAXBODY, body, 1 ); } slashem-0.0.7E7F3/sys/amiga/winami.c0000664000076400007640000012645710545462317015217 0ustar aliali/* SCCS Id: @(#)winami.c 3.2 2000/01/12 */ /* Copyright (c) Gregg Wonderly, Naperville, Illinois, 1991,1992,1993,1996. */ /* NetHack may be freely redistributed. See license for details. */ #include "NH:sys/amiga/windefs.h" #include "NH:sys/amiga/winext.h" #include "NH:sys/amiga/winproto.h" #include "dlb.h" #ifdef AMIGA_INTUITION static int FDECL( put_ext_cmd, ( char *, int, struct amii_WinDesc *, int ) ); struct amii_DisplayDesc *amiIDisplay; /* the Amiga Intuition descriptor */ struct Rectangle lastinvent, lastmsg; int clipping = 0; int clipx=0; int clipy=0; int clipxmax=0; int clipymax=0; int scrollmsg = 1; int alwaysinvent = 0; int amii_numcolors; long amii_scrnmode; /* Interface definition, for use by windows.c and winprocs.h to provide * the intuition interface for the amiga... */ struct window_procs amii_procs = { "amii", WC_COLOR|WC_HILITE_PET|WC_INVERSE, 0L, amii_init_nhwindows, amii_player_selection, amii_askname, amii_get_nh_event, amii_exit_nhwindows, amii_suspend_nhwindows, amii_resume_nhwindows, amii_create_nhwindow, amii_clear_nhwindow, amii_display_nhwindow, amii_destroy_nhwindow, amii_curs, amii_putstr, amii_display_file, amii_start_menu, amii_add_menu, amii_end_menu, amii_select_menu, genl_message_menu, amii_update_inventory, amii_mark_synch, amii_wait_synch, #ifdef CLIPPING amii_cliparound, #endif #ifdef POSITIONBAR donull, #endif amii_print_glyph, amii_raw_print, amii_raw_print_bold, amii_nhgetch, amii_nh_poskey, amii_bell, amii_doprev_message, amii_yn_function, amii_getlin, amii_get_ext_cmd, amii_number_pad, amii_delay_output, #ifdef CHANGE_COLOR /* only a Mac option currently */ amii_change_color, amii_get_color_string, #endif /* other defs that really should go away (they're tty specific) */ amii_delay_output, amii_delay_output, amii_outrip, genl_preference_update }; /* The view window layout uses the same function names so we can use * a shared library to allow the executable to be smaller. */ struct window_procs amiv_procs = { "amitile", WC_COLOR|WC_HILITE_PET|WC_INVERSE, 0L, amii_init_nhwindows, amii_player_selection, amii_askname, amii_get_nh_event, amii_exit_nhwindows, amii_suspend_nhwindows, amii_resume_nhwindows, amii_create_nhwindow, amii_clear_nhwindow, amii_display_nhwindow, amii_destroy_nhwindow, amii_curs, amii_putstr, amii_display_file, amii_start_menu, amii_add_menu, amii_end_menu, amii_select_menu, genl_message_menu, amii_update_inventory, amii_mark_synch, amii_wait_synch, #ifdef CLIPPING amii_cliparound, #endif #ifdef POSITIONBAR donull, #endif amii_print_glyph, amii_raw_print, amii_raw_print_bold, amii_nhgetch, amii_nh_poskey, amii_bell, amii_doprev_message, amii_yn_function, amii_getlin, amii_get_ext_cmd, amii_number_pad, amii_delay_output, #ifdef CHANGE_COLOR /* only a Mac option currently */ amii_change_color, amii_get_color_string, #endif /* other defs that really should go away (they're tty specific) */ amii_delay_output, amii_delay_output, amii_outrip, genl_preference_update }; 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 */ 0x0FFF, /* color #1 C_WHITE */ 0x0830, /* color #2 C_BROWN */ 0x07ac, /* color #3 C_CYAN */ 0x0181, /* color #4 C_GREEN */ 0x0C06, /* color #5 C_MAGENTA */ 0x023E, /* color #6 C_BLUE */ 0x0c00, /* color #7 C_RED */ }; unsigned short amiv_init_map[ AMII_MAXCOLORS ] = { 0x0000, /* color #0 C_BLACK */ 0x0fff, /* color #1 C_WHITE */ 0x00bf, /* color #2 C_CYAN */ 0x0f60, /* color #3 C_ORANGE */ 0x000f, /* color #4 C_BLUE */ 0x0090, /* color #5 C_GREEN */ 0x069b, /* color #6 C_GREY */ 0x0f00, /* color #7 C_RED */ 0x06f0, /* color #8 C_LTGREEN */ 0x0ff0, /* color #9 C_YELLOW */ 0x0f0f, /* color #10 C_MAGENTA */ 0x0940, /* color #11 C_BROWN */ 0x0466, /* color #12 C_GREYBLUE */ 0x0c40, /* color #13 C_LTBROWN */ 0x0ddb, /* color #14 C_LTGREY */ 0x0fb9, /* color #15 C_PEACH */ /* Pens for dripens etc under AA or better */ 0x0222, /* color #16 */ 0x0fdc, /* color #17 */ 0x0000, /* color #18 */ 0x0ccc, /* color #19 */ 0x0bbb, /* color #20 */ 0x0BA9, /* color #21 */ 0x0999, /* color #22 */ 0x0987, /* color #23 */ 0x0765, /* color #24 */ 0x0666, /* color #25 */ 0x0555, /* color #26 */ 0x0533, /* color #27 */ 0x0333, /* color #28 */ 0x018f, /* color #29 */ 0x0f81, /* color #30 */ 0x0fff, /* color #31 */ }; #if !defined( TTY_GRAPHICS ) || defined( SHAREDLIB ) /* this should be shared better */ char morc; /* the character typed in response to a --more-- prompt */ #endif char spaces[ 76 ] = " "; winid WIN_BASE = WIN_ERR; winid WIN_OVER = WIN_ERR; winid amii_rawprwin = WIN_ERR; /* Changed later during window/screen opens... */ int txwidth = FONTWIDTH, txheight = FONTHEIGHT, txbaseline = FONTBASELINE; /* If a 240 or more row screen is in front when we start, this will be * set to 1, and the windows will be given borders to allow them to be * arranged differently. The Message window may eventually get a scroller... */ int bigscreen = 0; /* This gadget data is replicated for menu/text windows... */ struct PropInfo PropScroll = { AUTOKNOB|FREEVERT, 0xffff,0xffff, 0xffff,0xffff, }; struct Image Image1 = { 0,0, 7,102, 0, NULL, 0x0000,0x0000, NULL }; struct Gadget MenuScroll = { NULL, -15,10, 15,-19, GRELRIGHT|GRELHEIGHT, RELVERIFY|FOLLOWMOUSE|RIGHTBORDER|GADGIMMEDIATE|RELVERIFY, PROPGADGET, (APTR)&Image1, NULL, NULL, NULL, (APTR)&PropScroll, 1, NULL }; /* This gadget is for the message window... */ struct PropInfo MsgPropScroll = { AUTOKNOB|FREEVERT, 0xffff,0xffff, 0xffff,0xffff, }; struct Image MsgImage1 = { 0,0, 7,102, 0, NULL, 0x0000,0x0000, NULL }; struct Gadget MsgScroll = { NULL, -15,10, 14,-19, GRELRIGHT|GRELHEIGHT, RELVERIFY|FOLLOWMOUSE|RIGHTBORDER|GADGIMMEDIATE|RELVERIFY, PROPGADGET, (APTR)&MsgImage1, NULL, NULL, NULL, (APTR)&MsgPropScroll, 1, NULL }; int wincnt=0; /* # of nh windows opened */ /* We advertise a public screen to allow some people to do other things * while they are playing... like compiling... */ #ifdef INTUI_NEW_LOOK extern struct Hook fillhook; struct TagItem tags[] = { { WA_BackFill, (ULONG)&fillhook }, { WA_PubScreenName, (ULONG)"NetHack" }, { TAG_DONE, 0 }, }; #endif /* * The default dimensions and status values for each window type. The * data here is generally changed in create_nhwindow(), so beware that * what you see here may not be exactly what you get. */ struct win_setup new_wins[] = { /* First entry not used, types are based at 1 */ {{0}}, /* NHW_MESSAGE */ {{0,1,640,11, 0xff,0xff, NEWSIZE|GADGETUP|GADGETDOWN|MOUSEMOVE|MOUSEBUTTONS|RAWKEY, BORDERLESS|ACTIVATE|SMART_REFRESH #ifdef INTUI_NEW_LOOK |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}, /* NHW_STATUS */ {{0,181,640,24, 0xff,0xff, RAWKEY|MENUPICK|DISKINSERTED, BORDERLESS|ACTIVATE|SMART_REFRESH|BACKDROP #ifdef INTUI_NEW_LOOK |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}, /* NHW_MAP */ {{0,0,WIDTH,WINDOWHEIGHT, 0xff,0xff, RAWKEY|MENUPICK|MOUSEBUTTONS|ACTIVEWINDOW|MOUSEMOVE, BORDERLESS|ACTIVATE|SMART_REFRESH|BACKDROP #ifdef INTUI_NEW_LOOK |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}, /* NHW_MENU */ {{400,10,10,10, 0xff,0xff, RAWKEY|MENUPICK|DISKINSERTED|MOUSEMOVE|MOUSEBUTTONS| GADGETUP|GADGETDOWN|CLOSEWINDOW|VANILLAKEY|NEWSIZE|INACTIVEWINDOW, WINDOWSIZING|WINDOWCLOSE|WINDOWDRAG|ACTIVATE|SMART_REFRESH #ifdef INTUI_NEW_LOOK |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}, /* NHW_TEXT */ {{0,0,640,200, 0xff,0xff, RAWKEY|MENUPICK|DISKINSERTED|MOUSEMOVE| GADGETUP|CLOSEWINDOW|VANILLAKEY|NEWSIZE, WINDOWSIZING|WINDOWCLOSE|WINDOWDRAG|ACTIVATE|SMART_REFRESH #ifdef INTUI_NEW_LOOK |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}, /* NHW_BASE */ {{0,0,WIDTH,WINDOWHEIGHT, 0xff,0xff, RAWKEY|MENUPICK|MOUSEBUTTONS, BORDERLESS|ACTIVATE|SMART_REFRESH|BACKDROP #ifdef INTUI_NEW_LOOK |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}, /* NHW_OVER */ {{320,20,319,179, 0xff,0xff, RAWKEY|MENUPICK|MOUSEBUTTONS, BORDERLESS|ACTIVATE|SMART_REFRESH|BACKDROP #ifdef INTUI_NEW_LOOK |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}, }; const char winpanicstr[] = "Bad winid %d in %s()"; /* The opened windows information */ struct amii_WinDesc *amii_wins[ MAXWIN + 1 ]; #ifdef INTUI_NEW_LOOK /* * NUMDRIPENS varies based on headers, so don't use it * here, its value is used elsewhere. */ UWORD amii_defpens[ 20 ]; struct TagItem scrntags[] = { { SA_PubName, (ULONG)"NetHack" }, { SA_Overscan, OSCAN_TEXT }, { SA_AutoScroll, TRUE }, #if LIBRARY_VERSION >= 39 { SA_Interleaved, TRUE }, #endif { SA_Pens, (ULONG)0 }, { SA_DisplayID, 0 }, { TAG_DONE, 0 }, }; #endif struct NewScreen NewHackScreen = { 0, 0, WIDTH, SCREENHEIGHT, 3, 0, 1, /* DetailPen, BlockPen */ HIRES, CUSTOMSCREEN #ifdef INTUI_NEW_LOOK |NS_EXTENDED #endif , &Hack80, /* Font */ NULL, /*(UBYTE *)" NetHack X.Y.Z" */ NULL, /* Gadgets */ NULL, /* CustomBitmap */ #ifdef INTUI_NEW_LOOK scrntags #endif }; /* * plname is filled either by an option (-u Player or -uPlayer) or * explicitly (by being the wizard) or by askname. * It may still contain a suffix denoting pl_character. * Always called after init_nhwindows() and before display_gamewindows(). */ 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' ) { clearlocks(); exit_nhwindows(NULL); terminate(0); } } /* Discarded ... -jhsa #include "NH:sys/amiga/char.c" */ /* Get the player selection character */ #if 0 /* New function at the bottom */ void amii_player_selection() { register struct Window *cwin; register struct IntuiMessage *imsg; register int aredone = 0; register struct Gadget *gd; static int once = 0; long class, code; amii_clear_nhwindow( WIN_BASE ); if (validrole(flags.initrole)) return; else { flags.initrole=randrole(); return; } #if 0 /* Don't query the user ... instead give random character -jhsa */ #if 0 /* OBSOLETE */ if( *pl_character ){ pl_character[ 0 ] = toupper( pl_character[ 0 ] ); if( index( pl_classes, pl_character[ 0 ] ) ) return; } #endif if( !once ){ if( bigscreen ){ Type_NewWindowStructure1.TopEdge = (HackScreen->Height/2) - (Type_NewWindowStructure1.Height/2); } for( gd = Type_NewWindowStructure1.FirstGadget; gd; gd = gd->NextGadget ) { if( gd->GadgetID != 0 ) SetBorder( gd ); } once = 1; } if( WINVERS_AMIV ) { # ifdef INTUI_NEW_LOOK Type_NewWindowStructure1.Extension = wintags; Type_NewWindowStructure1.Flags |= WFLG_NW_EXTENDED; fillhook.h_Entry = (ULONG(*)())LayerFillHook; fillhook.h_Data = (void *)-2; fillhook.h_SubEntry = 0; #endif } Type_NewWindowStructure1.Screen = HackScreen; if( ( cwin = OpenShWindow( (void *)&Type_NewWindowStructure1 ) ) == NULL ) { return; } #if 0 WindowToFront( cwin ); #endif while( !aredone ) { WaitPort( cwin->UserPort ); while( ( imsg = (void *) GetMsg( cwin->UserPort ) ) != NULL ) { class = imsg->Class; code = imsg->Code; gd = (struct Gadget *)imsg->IAddress; ReplyMsg( (struct Message *)imsg ); switch( class ) { case VANILLAKEY: if( index( pl_classes, toupper( code ) ) ) { pl_character[0] = toupper( code ); aredone = 1; } else if( code == ' ' || code == '\n' || code == '\r' ) { flags.initrole = randrole(); #if 0 /* OBSOLETE */ #ifdef TOURIST strcpy( pl_character, roles[ rnd( 11 ) ] ); #else strcpy( pl_character, roles[ rnd( 10 ) ] ); #endif #endif aredone = 1; amii_clear_nhwindow( WIN_BASE ); CloseShWindow( cwin ); RandomWindow( pl_character ); return; } else if( code == 'q' || code == 'Q' ) { CloseShWindow( cwin ); clearlocks(); exit_nhwindows(NULL); terminate(0); } else DisplayBeep( NULL ); break; case GADGETUP: switch( gd->GadgetID ) { case 1: /* Random Character */ flags.initrole = randrole(); #if 0 /* OBSOLETE */ #ifdef TOURIST strcpy( pl_character, roles[ rnd( 11 ) ] ); #else strcpy( pl_character, roles[ rnd( 10 ) ] ); #endif #endif amii_clear_nhwindow( WIN_BASE ); CloseShWindow( cwin ); RandomWindow( pl_character ); return; default: pl_character[0] = gd->GadgetID; break; } aredone = 1; break; case CLOSEWINDOW: CloseShWindow( cwin ); clearlocks(); exit_nhwindows(NULL); terminate(0); break; } } } amii_clear_nhwindow( WIN_BASE ); CloseShWindow( cwin ); #endif /* Do not query user ... -jhsa */ } #endif /* Function elsewhere */ #if 0 /* Unused ... -jhsa */ #include "NH:sys/amiga/randwin.c" void RandomWindow( name ) char *name; { struct MsgPort *tport; struct timerequest *trq; static int once = 0; struct Gadget *gd; struct Window *w; struct IntuiMessage *imsg; 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; } if( OpenDevice( TIMERNAME, UNIT_VBLANK, (struct IORequest *)trq, 0L ) != 0 ) goto allocerr; trq->tr_node.io_Command = TR_ADDREQUEST; trq->tr_time.tv_secs = 8; trq->tr_time.tv_micro = 0; SendIO( (struct IORequest *)trq ); /* Place the name in the center of the screen */ Rnd_IText5.IText = name; Rnd_IText6.LeftEdge = Rnd_IText4.LeftEdge + (strlen(Rnd_IText4.IText)+1)*8; Rnd_NewWindowStructure1.Width = ( (strlen( Rnd_IText2.IText )+1) * 8 ) + HackScreen->WBorLeft + HackScreen->WBorRight; Rnd_IText5.LeftEdge = (Rnd_NewWindowStructure1.Width - (strlen(name)*8))/2; gd = Rnd_NewWindowStructure1.FirstGadget; gd->LeftEdge = (Rnd_NewWindowStructure1.Width - gd->Width)/2; /* Chose correct modifier */ Rnd_IText6.IText = "a"; switch( *name ) { case 'a': case 'e': case 'i': case 'o': case 'u': case 'A': case 'E': case 'I': case 'O': case 'U': Rnd_IText6.IText = "an"; break; } if( !once ) { if( bigscreen ) { Rnd_NewWindowStructure1.TopEdge = (HackScreen->Height/2) - (Rnd_NewWindowStructure1.Height/2); } for( gd = Rnd_NewWindowStructure1.FirstGadget; gd; gd = gd->NextGadget ) { if( gd->GadgetID != 0 ) SetBorder( gd ); } Rnd_NewWindowStructure1.IDCMPFlags |= VANILLAKEY; once = 1; } if( WINVERS_AMIV ) { #ifdef INTUI_NEW_LOOK Rnd_NewWindowStructure1.Extension = wintags; Rnd_NewWindowStructure1.Flags |= WFLG_NW_EXTENDED; fillhook.h_Entry = (ULONG(*)())LayerFillHook; fillhook.h_Data = (void *)-2; fillhook.h_SubEntry = 0; #endif } Rnd_NewWindowStructure1.Screen = HackScreen; if( ( w = OpenShWindow( (void *)&Rnd_NewWindowStructure1 ) ) == NULL ) { AbortIO( (struct IORequest *)trq ); WaitIO( (struct IORequest *)trq ); CloseDevice( (struct IORequest *)trq ); DeleteIORequest( (struct IORequest *) trq ); DeleteMsgPort( tport ); Delay( 50 * 8 ); return; } PrintIText( w->RPort, &Rnd_IntuiTextList1, 0, 0 ); mask = (1L << tport->mp_SigBit)|(1L << w->UserPort->mp_SigBit); while( !aredone ) { got = Wait( mask ); if( got & (1L << tport->mp_SigBit ) ) { aredone = 1; timerdone = 1; GetMsg( tport ); } while( w && ( imsg = (struct IntuiMessage *) GetMsg( w->UserPort ) ) ) { switch( (long)imsg->Class ) { /* Must be up for a little while... */ case INACTIVEWINDOW: if( ticks >= 40 ) aredone = 1; break; case INTUITICKS: ++ticks; break; case GADGETUP: aredone = 1; break; case VANILLAKEY: if(imsg->Code=='\n' || imsg->Code==' ' || imsg->Code=='\r') aredone = 1; break; } ReplyMsg( (struct Message *)imsg ); } } if( !timerdone ) { AbortIO( (struct IORequest *)trq ); WaitIO( (struct IORequest *)trq ); } CloseDevice( (struct IORequest *)trq ); DeleteIORequest( (struct IORequest *) trq ); DeleteMsgPort( tport ); if(w) CloseShWindow( w ); } #endif /* Discarded randwin ... -jhsa */ /* this should probably not be needed (or be renamed) void flush_output(){} */ /* Read in an extended command - doing command line completion for * when enough characters have been entered to make a unique command. */ int amii_get_ext_cmd( void ) { menu_item *mip; anything id; struct amii_WinDesc *cw; #ifdef EXTMENU winid win; int i; char buf[256]; #endif int colx; int bottom = 0; struct Window *w; char obufp[ 100 ]; register char *bufp = obufp; register int c; int com_index, oindex; int did_comp=0; /* did successful completion? */ int sel = -1; if( WIN_MESSAGE == WIN_ERR || ( cw = amii_wins[ WIN_MESSAGE ] ) == NULL ) panic(winpanicstr, WIN_MESSAGE, "get_ext_cmd"); w = cw->win; bottom = amii_msgborder( w ); colx = 3; #ifdef EXTMENU if (iflags.extmenu) { win = amii_create_nhwindow( NHW_MENU ); amii_start_menu( win ); pline("#"); amii_putstr( WIN_MESSAGE, -1, " " ); for( i = 0; extcmdlist[ i ].ef_txt != NULL; ++i ) { id.a_char = *extcmdlist[ i ].ef_txt; sprintf( buf, "%-10s - %s ", extcmdlist[ i ].ef_txt, extcmdlist[ i ].ef_desc ); amii_add_menu( win, NO_GLYPH, &id, extcmdlist[i].ef_txt[0], 0, 0, buf, MENU_UNSELECTED); } amii_end_menu( win, (char*)0 ); sel = amii_select_menu( win, PICK_ONE, &mip ); amii_destroy_nhwindow( win ); if( sel == 1 ) { sel = mip->item.a_char; for( i = 0; extcmdlist[ i ].ef_txt != NULL; ++i ) { if( sel == extcmdlist[i].ef_txt[0] ) break; } /* copy in the text */ if( extcmdlist[ i ].ef_txt != NULL ) { amii_clear_nhwindow( WIN_MESSAGE ); (void) put_ext_cmd( (char *)extcmdlist[i].ef_txt, 0, cw, bottom ); return( i ); } else DisplayBeep( NULL ); } return( -1 ); } else { #else amii_clear_nhwindow( WIN_MESSAGE ); /* Was NHW_MESSAGE */ if( scrollmsg ) { pline("#"); amii_addtopl(" "); } else { pline("# "); } sel = -1; while((c = WindowGetchar()) != EOF) { amii_curs( WIN_MESSAGE, colx, bottom ); if(c == '?' ) { int win, i; char buf[ 100 ]; if(did_comp){ while(bufp!=obufp) { bufp--; amii_curs(WIN_MESSAGE, --colx, bottom); Text(w->RPort,spaces,1); amii_curs(WIN_MESSAGE,colx,bottom); did_comp=0; } } win = amii_create_nhwindow( NHW_MENU ); amii_start_menu( win ); for( i = 0; extcmdlist[ i ].ef_txt != NULL; ++i ) { id.a_char = extcmdlist[i].ef_txt[0]; sprintf( buf, "%-10s - %s ", extcmdlist[ i ].ef_txt, extcmdlist[ i ].ef_desc ); amii_add_menu( win, NO_GLYPH, &id, extcmdlist[i].ef_txt[0], 0, 0, buf, MENU_UNSELECTED); } amii_end_menu( win, (char*)0 ); sel = amii_select_menu( win, PICK_ONE, &mip ); amii_destroy_nhwindow( win ); if( sel == 0 ) { return( -1 ); } else { sel = mip->item.a_char; for( i = 0; extcmdlist[ i ].ef_txt != NULL; ++i ) { if( sel == extcmdlist[i].ef_txt[0] ) break; } /* copy in the text */ if( extcmdlist[ i ].ef_txt != NULL ) { amii_clear_nhwindow( WIN_MESSAGE ); strcpy( bufp = obufp, extcmdlist[ i ].ef_txt ); (void) put_ext_cmd( obufp, colx, cw, bottom ); return( i ); } else DisplayBeep( NULL ); } } else if(c == '\033') { return( -1 ); } else if(c == '\b') { if(did_comp){ while(bufp!=obufp){ bufp--; amii_curs(WIN_MESSAGE, --colx, bottom); Text(w->RPort,spaces,1); amii_curs(WIN_MESSAGE,colx,bottom); did_comp=0; sel = -1; } } else if(bufp != obufp) { sel = -1; bufp--; amii_curs( WIN_MESSAGE, --colx, bottom); Text( w->RPort, spaces, 1 ); amii_curs( WIN_MESSAGE, colx, bottom); } else DisplayBeep( NULL ); } else if( c == '\n' || c == '\r' ) { return(sel); } else if( c >= ' ' && c < '\177') { /* avoid isprint() - some people don't have it ' ' is not always a printing char */ *bufp = c; bufp[1] = 0; oindex = 0; com_index = -1; while(extcmdlist[oindex].ef_txt != NULL) { if(!strnicmp(obufp, (char *)extcmdlist[oindex].ef_txt, strlen(obufp))) { if(com_index == -1) /* No matches yet*/ com_index = oindex; else /* More than 1 match */ com_index = -2; } oindex++; } if(com_index >= 0 && *obufp ) { Strcpy(obufp, extcmdlist[com_index].ef_txt); /* finish printing our string */ colx = put_ext_cmd( obufp, colx, cw, bottom ); bufp = obufp; /* reset it */ if(strlen(obufp) < BUFSZ-1 && strlen(obufp) < COLNO) bufp += strlen(obufp); did_comp=1; sel = com_index; } else { colx = put_ext_cmd( obufp, colx, cw, bottom ); if(bufp-obufp < BUFSZ-1 && bufp-obufp < COLNO) bufp++; } } else if(c == ('X'-64) || c == '\177') { colx = 0; amii_clear_nhwindow( WIN_MESSAGE ); pline( "# " ); bufp = obufp; } else DisplayBeep( NULL ); } return(-1); #endif } static int put_ext_cmd( obufp, colx, cw, bottom ) char *obufp; int colx, bottom; struct amii_WinDesc *cw; { struct Window *w = cw->win; char *t; t = (char *)alloc( strlen( obufp ) + 7 ); if( t != NULL ) { if( scrollmsg ) { sprintf( t, "xxx%s", obufp ); t[0] = 1; t[1] = 1; t[2] = '#'; amii_curs( WIN_MESSAGE, 0, bottom); SetAPen( w->RPort, C_WHITE ); Text(w->RPort, "># ", 3 ); /* SetAPen( w->RPort, C_BLACK ); */ /* Black text on black screen doesn't look too well ... -jhsa */ Text(w->RPort, t+3, strlen( t ) - 3 ); } else { sprintf( t, "# %s", obufp ); amii_curs( WIN_MESSAGE, 0, bottom); SetAPen( w->RPort, C_WHITE ); Text(w->RPort, t, strlen( t ) ); } if( scrollmsg ) SetAPen( w->RPort, C_WHITE ); if( cw->data[ cw->maxrow - 1 ] ) free( cw->data[ cw->maxrow - 1 ] ); cw->data[ cw->maxrow - 1 ] = t; } else { amii_curs( WIN_MESSAGE, 0, bottom); SetAPen( w->RPort, C_WHITE ); Text(w->RPort, "# ", 2 ); /* SetAPen( w->RPort, C_BLACK ); */ /* Black on black ... -jhsa */ Text(w->RPort, obufp, strlen( obufp ) ); SetAPen( w->RPort, C_WHITE ); } amii_curs( WIN_MESSAGE, colx = strlen( obufp ) + 3 + ( scrollmsg != 0 ), bottom); return( colx ); } /* Ask a question and get a response */ char amii_yn_function(query, resp, def) const char *query,*resp; char def; /* * Generic yes/no function. 'def' is the default (returned by space or * return; 'esc' returns 'q', or 'n', or the default, depending on * what's in the string. The 'query' string is printed before the user * is asked about the string. * If resp is NULL, any single character is accepted and returned. * If not-NULL, only characters in it are allowed (exceptions: the * quitchars are always allowed, and if it contains '#' then digits * are allowed); if it includes an , anything beyond that won't * be shown in the prompt to the user but will be acceptable as input. */ { register char q; char rtmp[40]; boolean digit_ok, allow_num; char prompt[QBUFSZ]; register struct amii_WinDesc *cw; if( cw = amii_wins[ WIN_MESSAGE ] ) cw->disprows = 0; if (resp) { char *rb, respbuf[QBUFSZ]; allow_num = (index(resp, '#') != 0); Strcpy(respbuf, resp); /* any acceptable responses that follow aren't displayed */ if ((rb = index(respbuf, '\033')) != 0) *rb = '\0'; Sprintf(prompt, "%s [%s] ", query, respbuf); if (def) Sprintf(eos(prompt), "(%c) ", def); pline("%s", prompt); } else { amii_putstr(WIN_MESSAGE, 0, query); cursor_on(WIN_MESSAGE); q = WindowGetchar(); cursor_off(WIN_MESSAGE); *rtmp = q; rtmp[ 1 ] = 0; amii_addtopl(rtmp); goto clean_up; } do { /* loop until we get valid input */ cursor_on(WIN_MESSAGE); q = lowc(WindowGetchar()); cursor_off(WIN_MESSAGE); #if 0 /* fix for PL2 */ if (q == '\020') { /* ctrl-P */ if(!doprev) (void) tty_doprev_message(); /* need two initially */ (void) tty_doprev_message(); q = (char)0; doprev = 1; continue; } else if(doprev) { tty_clear_nhwindow(WIN_MESSAGE); cw->maxcol = cw->maxrow; doprev = 0; amii_addtopl(prompt); continue; } #endif digit_ok = allow_num && isdigit(q); if (q == '\033') { if (index(resp, 'q')) q = 'q'; else if (index(resp, 'n')) q = 'n'; else q = def; break; } else if (index(quitchars, q)) { q = def; break; } if (!index(resp, q) && !digit_ok) { amii_bell(); q = (char)0; } else if (q == '#' || digit_ok) { char z, digit_string[2]; int n_len = 0; long value = 0; amii_addtopl("#"), n_len++; digit_string[1] = '\0'; if (q != '#') { digit_string[0] = q; amii_addtopl(digit_string), n_len++; value = q - '0'; q = '#'; } do { /* loop until we get a non-digit */ cursor_on(WIN_MESSAGE); z = lowc(WindowGetchar()); cursor_off(WIN_MESSAGE); if (isdigit(z)) { value = (10 * value) + (z - '0'); if (value < 0) break; /* overflow: try again */ digit_string[0] = z; amii_addtopl(digit_string), n_len++; } else if (z == 'y' || index(quitchars, z)) { if (z == '\033') value = -1; /* abort */ z = '\n'; /* break */ } else if ( z == '\b') { if (n_len <= 1) { value = -1; break; } else { value /= 10; removetopl(1), n_len--; } } else { value = -1; /* abort */ amii_bell(); break; } } while (z != '\n'); if (value > 0) yn_number = value; else if (value == 0) q = 'n'; /* 0 => "no" */ else { /* remove number from top line, then try again */ removetopl(n_len), n_len = 0; q = '\0'; } } } while(!q); if (q != '#' && q != '\033') { Sprintf(rtmp, "%c", q); amii_addtopl(rtmp); } clean_up: cursor_off(WIN_MESSAGE); clear_nhwindow(WIN_MESSAGE); return q; } void amii_display_file(fn, complain) const char *fn; boolean complain; { register struct amii_WinDesc *cw; register int win; register dlb *fp; register char *t; register char buf[ 200 ]; if( fn == NULL ) panic("NULL file name in display_file()"); if( ( fp = dlb_fopen( fn, RDTMODE ) ) == (dlb *)NULL ) { if (complain) { sprintf( buf, "Can't display %s: %s", fn, #if defined(_DCC) || defined(__GNUC__) strerror(errno) #else # ifdef __SASC_60 __sys_errlist[ errno ] # else sys_errlist[ errno ] # endif #endif ); amii_addtopl( buf ); } return; } win = amii_create_nhwindow( NHW_TEXT ); /* Set window title to file name */ if( cw = amii_wins[ win ] ) cw->morestr = (char *)fn; while( dlb_fgets( buf, sizeof( buf ), fp ) != NULL ) { if( t = index( buf, '\n' ) ) *t = 0; amii_putstr( win, 0, buf ); } dlb_fclose( fp ); /* If there were lines in the file, display those lines */ if( amii_wins[ win ]->cury > 0 ) amii_display_nhwindow( win, TRUE ); amii_wins[win]->morestr = NULL; /* don't free title string */ amii_destroy_nhwindow( win ); } /* Put a 3-D motif border around the gadget. String gadgets or those * which do not have highlighting are rendered down. Boolean gadgets * are rendered in the up position by default. */ void SetBorder( gd ) register struct Gadget *gd; { register struct Border *bp; register short *sp; register int i, inc = -1, dec = -1; int borders = 6; int hipen = flags.amii_dripens[ SHINEPEN ], shadowpen = flags.amii_dripens[ SHADOWPEN ]; #ifdef INTUI_NEW_LOOK struct DrawInfo *dip; #endif #ifdef INTUI_NEW_LOOK if( IntuitionBase->LibNode.lib_Version >= 37 ) { if( dip = GetScreenDrawInfo( HackScreen ) ) { hipen = dip->dri_Pens[ SHINEPEN ]; shadowpen = dip->dri_Pens[ SHADOWPEN ]; FreeScreenDrawInfo( HackScreen, dip ); } } #endif /* Allocate two border structures one for up image and one for down * image, plus vector arrays for the border lines. */ if( gd->GadgetType == STRGADGET ) borders = 12; if( ( bp = (struct Border *)alloc( ( ( sizeof( struct Border ) * 2 ) + ( sizeof( short ) * borders ) ) * 2 ) ) == NULL ) { return; } /* For a string gadget, we expand the border beyond the area where * the text will be entered. */ /* Remove any special rendering flags to avoid confusing intuition */ gd->Flags &= ~(GADGHIGHBITS|GADGIMAGE); sp = (short *)(bp + 4); if( gd->GadgetType == STRGADGET || ( gd->GadgetType == BOOLGADGET && ( gd->Flags & GADGHIGHBITS ) == GADGHNONE ) ) { sp[0] = -1; sp[1] = gd->Height - 1; sp[2] = -1; sp[3] = -1; sp[4] = gd->Width - 1; sp[5] = -1; sp[6] = gd->Width + 1; sp[7] = -2; sp[8] = gd->Width + 1; sp[9] = gd->Height + 1; sp[10] = -2; sp[11] = gd->Height + 1; sp[12] = -2; sp[13] = gd->Height; sp[14] = -2; sp[15] = -2; sp[16] = gd->Width; sp[17] = -2; sp[18] = gd->Width; sp[19] = gd->Height; sp[20] = -2; sp[21] = gd->Height; for( i = 0; i < 3; ++i ) { bp[ i ].LeftEdge = bp[ i ].TopEdge = -1; bp[ i ].FrontPen = ( i == 0 || i == 1 ) ? shadowpen : hipen; /* Have to use JAM2 so that the old colors disappear. */ bp[ i ].BackPen = C_BLACK; bp[ i ].DrawMode = JAM2; bp[ i ].Count = ( i == 0 || i == 1 ) ? 3 : 5; bp[ i ].XY = &sp[ i*6 ]; bp[ i ].NextBorder = ( i == 2 ) ? NULL : &bp[ i + 1 ]; } /* bp[0] and bp[1] two pieces for the up image */ gd->GadgetRender = (APTR) bp; /* No image change for select */ gd->SelectRender = (APTR) bp; gd->LeftEdge++; gd->TopEdge++; gd->Flags |= GADGHCOMP; } else { /* Create the border vector values for up and left side, and * also the lower and right side. */ sp[0] = dec; sp[1] = gd->Height + inc; sp[2] = dec; sp[3] = dec; sp[4] = gd->Width + inc; sp[5] = dec; sp[6] = gd->Width + inc; sp[7] = dec; sp[8] = gd->Width + inc; sp[9] = gd->Height + inc; sp[10] = dec; sp[11] = gd->Height + inc; /* We are creating 4 sets of borders, the two sides of the * rectangle share the border vectors with the opposite image, * but specify different colors. */ for( i = 0; i < 4; ++i ) { bp[ i ].TopEdge = bp[ i ].LeftEdge = 0; /* A GADGHNONE is always down */ if( gd->GadgetType == BOOLGADGET && ( gd->Flags & GADGHIGHBITS ) != GADGHNONE ) { bp[ i ].FrontPen = ( i == 1 || i == 2 ) ? shadowpen : hipen; } else { bp[ i ].FrontPen = ( i == 1 || i == 3 ) ? hipen : shadowpen; } /* Have to use JAM2 so that the old colors disappear. */ bp[ i ].BackPen = C_BLACK; bp[ i ].DrawMode = JAM2; bp[ i ].Count = 3; bp[ i ].XY = &sp[ 6 * ((i &1) != 0) ]; bp[ i ].NextBorder = ( i == 1 || i == 3 ) ? NULL : &bp[ i + 1 ]; } /* bp[0] and bp[1] two pieces for the up image */ gd->GadgetRender = (APTR) bp; /* bp[2] and bp[3] two pieces for the down image */ gd->SelectRender = (APTR) (bp + 2); gd->Flags |= GADGHIMAGE; } } /* Following function copied from wintty.c */ /* Modified slightly to fit amiga needs */ void amii_player_selection() { 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*/ 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) { /* 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(); } } else { /* 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) { amii_putstr(WIN_MESSAGE, 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) { 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) { amii_putstr(WIN_MESSAGE, 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) { 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) { amii_putstr(WIN_MESSAGE, 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) { 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! */ } #endif /* AMIGA_INTUITION */ slashem-0.0.7E7F3/sys/amiga/NetHack.cnf0000664000076400007640000001477310545462317015571 0ustar aliali# A '#' at the beginning of a line means the rest of the line is a comment. # This is an example configuration file. # If several people are to use it, don't specify "name" or personal # prefences like "dogname" or "packorder" in OPTIONS. # To change configuration, comment out the unwanted configurations, and # remove the comment from the configuration you want. # Some options to set personal preferences. If several people are to # 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 # The search path for files like record, help, opthelp, etc. PATH=NetHack: # 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:$,autoquiver # If you want to get rid of 'use "r." to read...' use: #OPTIONS=suppress_alert:0.0.7 # 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 # # The font version of the game OPTIONS=windowtype:amii # # New tile version of the game #OPTIONS=windowtype:amitile # # A hard disk configuration. # HACKDIR=NetHack: LEVELS=Nethack:Levels SAVE=Nethack:Save BONESDIR=Nethack:Levels SCOREDIR=Nethack: LOCKDIR=Nethack: CONFIGDIR=Nethack: DATADIR=Nethack: TROUBLEDIR=Nethack: # *** CHARACTER GRAPHICS *** # # See the on-line help or the Guidebook for which symbols are in which # positions. # # Note that the hack.font has special graphics characters from 192 on. # An example using the hack.font graphics character set: DUNGEON = 032 192 193 194 195 196 197 198 216 214 \ 215 213 217 145 146 147 148 035 035 217 \ 218 229 060 062 060 062 095 124 092 035 \ 123 125 042 125 042 042 035 035 046 035 \ 125 TRAPS = 094 094 094 094 094 094 094 094 094 094 \ 094 094 094 094 094 094 094 034 094 094 \ 094 094 EFFECTS = 241 240 242 243 042 033 123 125 \ 064 038 042 035 \ 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. #PENS=667,fff,da1,7bb,2f0,e0d,0af,f42 #and other suggestions: #PENS=888,ffc,840,0b8,4e4,e8b,7be,a04 #PENS=000,fff,830,7ae,181,c06,23e,c00 # # For an "interlaced"+ line screen, the default font is courier:13. If you want # a different font, set it here. The format is "fontname.font:size"; i.e. the # .font extension is required. #FONT=courier.font:13 #FONT=topaz.font:8 # # Proportional fonts such as CGTimes are probably not a good idea because they # result in many things not being spaced out correctly. #FONT=CGTimes.font:15 # # This sized proportional font is readable, but still has spacing problems #FONT=CGTimes.font:21 # # FOR AGA OR OTHER DISPLAYS CAPABLE OF 5 OR MORE PLANES... # # For a screen of depth 5 the following dripens provide a brown border # using pens 16-31. # # Pens 16-31 can be redefined with PENS= if you want different colors, # using the PENS= values below for a 4 plane screen as the first 16 colors. # #DEPTH=5 #DRIPENS=0,0,0,17,27,23,1,23,15,0,23,27 # # The APEN and BPEN values in the various types of windows can be set in # the manner shown below. These values are for the 16 color version of # the tile game. # # These values are specified as APEN,BPEN (foreground,background) # #MSGPENS=1,12 #STATUSPENS=1,12 #MENUPENS=1,23 #TEXTPENS=1,23 #OTHERPENS=1,23 # # FOR ECS OR OTHERS ONLY CAPABLE OF 4 PLANES... # # These values work good for the TILE version of the game on ECS machines # These are the default values for reference purposes. # #DEPTH=4 #defaults for tilemode: #PENS=000,fff,0bf,f60,00f,090,69b,f00,6f0,ff0,f0f,940,466,c40,ddb,fb9 #DRIPENS=0,1,0,2,4,12,14,12,7,1,12,4 #defaults for fontmode: #PENS=000,fff,830,7ac,181,c06,23e,c00 #DRIPENS=0,6,2,1,6,3,1,3,7,1,3,6 # # The APEN and BPEN values in the various types of windows can be set in # the manner shown below. These values are for a 32 color version of # the tile game. # # These values are specified as APEN,BPEN (foreground,background) # #MSGPENS=1,12 #STATUSPENS=1,12 #MENUPENS=0,14 #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 #SCREENMODE=0x00029000 # NTSC_MONITOR_ID+LACE #SCREENMODE=0x00019004 # PAL_MONITOR_ID+LACE #SCREENMODE=0x00029004 # NTSC_MONITOR_ID+HIRES+LACE #SCREENMODE=0x00019024 # PAL_MONITOR_ID+HIRES+LACE #SCREENMODE=0x00029024 # VGA_MONITOR_ID #SCREENMODE=0x00031000 # VGAPRODUCT_KEY #SCREENMODE=0x00039024 # A2024TENHERTZ_KEY #SCREENMODE=0x00041000 # A2024FIFTEENHERTZ_KEY #SCREENMODE=0x00049000 # EURO72_MONITOR_ID #SCREENMODE=0x00061000 # EURO72PRODUCT_KEY #SCREENMODE=0x00069024 # EURO72PRODUCTLACE_KEY #SCREENMODE=0x00069025 # EURO72PRODUCTDBL_KEY #SCREENMODE=0x00069020 # EURO36_MONITOR_ID #SCREENMODE=0x00071000 # SUPER72HIRESDBL_KEY #SCREENMODE=0x00089008 # SUPER72SUPERDBL_KEY #SCREENMODE=0x00089028 # DBLNTSCHIRES_KEY #SCREENMODE=0x00099000 # DBLNTSCHIRESFF_KEY #SCREENMODE=0x00099004 # DBLNTSCHIRESLACE_KEY #SCREENMODE=0x00099005 # DBLPALHIRES_KEY #SCREENMODE=0x000a9000 # DBLPALHIRESFF_KEY #SCREENMODE=0x000a9004 # DBLPALHIRESLACE_KEY #SCREENMODE=0x000a9005 slashem-0.0.7E7F3/sys/amiga/winchar.c0000664000076400007640000007463010545462317015361 0ustar aliali/* SCCS Id: @(#)winchar.c 3.1 93/07/22 */ /* Copyright (c) Olaf Seibert (KosmoSoft), 1989, 1992 */ /* Copyright (c) Kenneth Lorber, Bethesda, Maryland 1993 */ /* Copyright (c) Gregg Wonderly, Naperville Illinois, 1994. */ /* NetHack may be freely redistributed. See license for details. */ #include #include #include #ifndef _DCC #include #endif #ifdef TESTING # include "hack.h" #else # include "NH:src/tile.c" #endif #include "NH:win/share/tile.h" #include "NH:sys/amiga/windefs.h" #include "NH:sys/amiga/winext.h" #include "NH:sys/amiga/winproto.h" #ifdef OPT_DISPMAP # define DISPMAP /* use display_map() from dispmap.s */ #endif /* NH:sys/amiga/winvchar.c */ int main ( int , char ** ); struct BitMap *MyAllocBitMap ( int , int , int , long ); void MyFreeBitMap ( struct BitMap * ); void FreeImageFiles ( char **, struct BitMap ** ); void amiv_flush_glyph_buffer ( struct Window * ); void amiv_lprint_glyph ( winid , int , int ); void amii_lprint_glyph ( winid , int , int ); void amiv_start_glyphout ( winid ); void amii_end_glyphout ( winid ); void SetMazeType ( MazeType ); int GlyphToIcon ( int ); void amii_start_glyphout ( winid ); void amii_end_glyphout ( winid ); void amii_flush_glyph_buffer( struct Window * ); int amii_extraplanes = 0; extern int reclip; struct BitMap *MyAllocBitMap( int xsize, int ysize, int depth, long mflags ); void MyFreeBitMap( struct BitMap *bmp ); #ifdef DISPMAP extern void display_map( struct Window * ); #endif /* * These values will be available from tile.c source * * #define MAXMONTILE 335 * #define MAXOBJTILE 722 * #define MAXOTHTILE 841 */ #define IMGROWS 12 #define IMGCOLUMNS 20 #define IMGPAGESIZE (IMGROWS*IMGCOLUMNS) #define ID_BMAP MAKE_ID('B','M','A','P') /* The type of form we use */ #define ID_BMHD MAKE_ID('B','M','H','D') /* The ILBM bitmap header */ #define ID_CAMG MAKE_ID('C','A','M','G') /* The ILBM camg (ignored) */ #define ID_CMAP MAKE_ID('C','M','A','P') /* Standard ILBM color map */ #define ID_PLNE MAKE_ID('P','L','N','E') /* The plane data */ #define ID_PDAT MAKE_ID('P','D','A','T') /* The PDAT structure below */ struct PDAT pictdata; #define NUMTILEIMAGES 3 char *tileimages[] = { #define TBLMONTILE 0 "NetHack:tiles/monsters.iff", #define TBLOBJTILE 1 "NetHack:tiles/objects.iff", #define TBLOTHTILE 2 "NetHack:tiles/other.iff", 0, }; struct BitMap *ifftimg[ NUMTILEIMAGES ], *tile; #ifdef TESTING short pens[NUMDRIPENS] = { 8, 3, 15, 0, 15, 7, 7, 8, 0 }; main( int argc, char **argv ) { BitMapHeader bmhd; struct IntuiMessage *imsg; long code, class; char buf[100]; int i, x, y, tbl, done = 0, num; struct Window *w; struct Screen *scr; bmhd = ReadTileImageFiles( ); scr = OpenScreenTags( NULL, SA_Depth, pictdata.nplanes + amii_extraplanes, SA_DisplayID, DBLNTSC_MONITOR_ID|HIRESLACE_KEY, SA_Overscan, OSCAN_TEXT, SA_Top, 0, SA_Left, 0, SA_Width, STDSCREENWIDTH, SA_Height, STDSCREENHEIGHT, SA_Type, CUSTOMSCREEN, SA_DetailPen, 0, SA_BlockPen, 1, SA_Title, "NetHack Chars", SA_Pens, pens, TAG_DONE ); if( scr == NULL ) { printf( "no screen\n" ); #undef exit exit( 1 ); } w = OpenWindowTags( 0, WA_CustomScreen, scr, WA_Flags, WFLG_DRAGBAR|WFLG_SIZEGADGET|WFLG_DEPTHGADGET|WFLG_CLOSEGADGET, WA_IDCMP, IDCMP_CLOSEWINDOW|IDCMP_NEWSIZE|IDCMP_MOUSEBUTTONS, WA_Left, 0, WA_Top, scr->WBorTop + 1 + 13, WA_MinWidth, 100, WA_MinHeight, 100, WA_MaxWidth, 700, WA_MaxHeight, 1000, WA_Width, 640, WA_Height, 340, WA_SmartRefresh, TRUE, TAG_DONE ); if( w ) { while( !done ) { for( i = 0; i < NUMTILEIMAGES * IMGPAGESIZE; ++i ) { int dx, dy; tbl = i/IMGPAGESIZE; x = i % IMGPAGESIZE; y = x / IMGCOLUMNS; x = x % IMGCOLUMNS; dx = i % (IMGCOLUMNS*2); dy = i / (IMGCOLUMNS*2); BltBitMapRastPort( ifftimg[ tbl ], x * pictdata.xsize, y * pictdata.ysize, w->RPort, w->BorderLeft + 1 + dx*pictdata.xsize, w->BorderTop + 1 + dy*pictdata.ysize, pictdata.xsize, pictdata.ysize, 0xc0 ); } WaitPort( w->UserPort ); while( imsg = (struct IntuiMessage *)GetMsg( w->UserPort ) ) { class = imsg->Class; code = imsg->Code; ReplyMsg( (struct Message *)imsg ); switch( class ) { case IDCMP_MOUSEBUTTONS: { x = imsg->MouseX - w->BorderLeft; y = imsg->MouseY - w->BorderTop; num = ((y/pictdata.ysize)*IMGCOLUMNS*2)+(x/pictdata.xsize); sprintf( buf, "Char #%d", num ); SetWindowTitles( w, buf, buf ); } break; case IDCMP_CLOSEWINDOW: done = 1; break; } } } CloseWindow( w ); CloseScreen( scr ); } FreeImageFiles(tileimages, ifftimg ); return(0); } #endif BitMapHeader ReadTileImageFiles(){ char *errstr = NULL; BitMapHeader ret = ReadImageFiles(tileimages, ifftimg, &errstr); if(errstr){ panic(errstr); } return ret; } BitMapHeader ReadImageFiles(char **filenames, struct BitMap **iffimg, char **errstrp ) { BitMapHeader *bmhd = NULL, bmhds; unsigned char *cmap; extern int errno; register int i, j; struct IFFHandle *iff; struct StoredProperty *prop; IFFParseBase = OpenLibrary( "iffparse.library", 0L ); if( !IFFParseBase ) { *errstrp = "No iffparse.library"; return bmhds; } /* for( i = 0; filenames[i]; ++i ) memset( iffimg[i], 0, sizeof( struct BitMap ) ); */ for( i = 0; filenames[i]; ++i ) { iff = AllocIFF(); if( !iff ) { FreeImageFiles(filenames, iffimg ); *errstrp = "can't start IFF processing"; return bmhds; } iff->iff_Stream = Open( filenames[i], MODE_OLDFILE ); if( iff->iff_Stream == 0 ) { char *buf = malloc(100+strlen(filenames[i])); FreeImageFiles( filenames, iffimg ); sprintf(buf, "Can't open %s: %s", filenames[i], strerror( errno )); *errstrp = buf; return bmhds; } InitIFFasDOS( iff ); OpenIFF( iff, IFFF_READ ); PropChunk( iff, ID_BMAP, ID_BMHD ); PropChunk( iff, ID_BMAP, ID_CMAP ); PropChunk( iff, ID_BMAP, ID_CAMG ); PropChunk( iff, ID_BMAP, ID_PDAT ); StopChunk( iff, ID_BMAP, ID_PLNE ); if( ( j = ParseIFF( iff, IFFPARSE_SCAN ) ) != 0 ) { char *buf = malloc(100); FreeImageFiles( filenames, iffimg ); sprintf(buf,"ParseIFF failed for image %d, failure code: %d",i,j); *errstrp = buf; return bmhds; } if( prop = FindProp( iff, ID_BMAP, ID_BMHD ) ) { bmhd = (BitMapHeader *)prop->sp_Data; } else { FreeImageFiles(filenames, iffimg); CloseIFF( iff ); Close( iff->iff_Stream ); FreeIFF( iff ); *errstrp = "No BMHD CHUNK in file"; return bmhds; } if( prop = FindProp( iff, ID_BMAP, ID_CMAP ) ) { cmap = prop->sp_Data; for( j = 0; j < (1L << bmhd->nPlanes)*3; j+=3 ) { #if 0 /* Some day we will want to use the larger palette * resolution available under v39 and later. i.e. * 32 instead of 12 bits of color. Ususally this * just means shifting the color left by 16-20 bits * depending on what intensity looks best. Experience * says that the higher values are better intensities. * * For now though we won't do this. The color table * structure is incompatible with earlier versions of * intuition. We would have to do some funny things * to make 3*AMII_MAXCOLORS longs work like 3*AMII_MAXCOLORS * UWORD's at run time... A union would help, but... */ if( IntuitionBase->LibNode.lib_Version >= 39 ) { /* 8 bits of color, so shift to left end. */ amiv_init_map[ j+0 ] = cmap[j+0]<<24; amiv_init_map[ j+1 ] = cmap[j+1]<<24; amiv_init_map[ j+2 ] = cmap[j+2]<<24; } else #endif { /* We can only use 4 bits of the 8 that are stored in the * cmap, so mask them and then shift them into position * for the UWORD value to store. */ #ifndef TESTING amii_initmap[ j/3 ] = amiv_init_map[ j/3 ] = ((cmap[j+0]>>4)<<8)| ((cmap[j+1]>>4)<<4)| (cmap[j+2]>>4); #endif } } } else { FreeImageFiles(filenames, iffimg); CloseIFF( iff ); Close( iff->iff_Stream ); FreeIFF( iff ); *errstrp = "No CMAP CHUNK in file"; return bmhds; } if( prop = FindProp( iff, ID_BMAP, ID_PDAT ) ) { struct PDAT *pp; pp = (struct PDAT *)prop->sp_Data; pictdata = *pp; } else { FreeImageFiles(filenames, iffimg); CloseIFF( iff ); Close( iff->iff_Stream ); FreeIFF( iff ); *errstrp = "No PDAT CHUNK in file"; return bmhds; } iffimg[ i ] = MyAllocBitMap( bmhd->w, bmhd->h, pictdata.nplanes + amii_extraplanes, MEMF_CHIP|MEMF_CLEAR ); if( iffimg[ i ] == NULL ) { char *buf = malloc(80); FreeImageFiles(filenames, iffimg); sprintf(buf, "Can't allocate bitmap for image %d\n", i ); *errstrp = buf; return bmhds; } for( j = 0; j < pictdata.nplanes + amii_extraplanes; ++j ) { ReadChunkBytes( iff, iffimg[i]->Planes[j], RASSIZE( bmhd->w, bmhd->h ) ); } bmhds = *bmhd; CloseIFF( iff ); Close( iff->iff_Stream ); FreeIFF( iff ); } CloseLibrary( IFFParseBase ); tile = MyAllocBitMap( pictdata.xsize, pictdata.ysize, pictdata.nplanes + amii_extraplanes, MEMF_CHIP|MEMF_CLEAR ); if( tile == NULL ) { FreeImageFiles(filenames, iffimg); *errstrp = "Can't allocate tile bitmap for scaling"; } return( bmhds ); } struct MyBitMap { struct BitMap bm; long mflags; USHORT xsize, ysize; }; struct BitMap * MyAllocBitMap( int xsize, int ysize, int depth, long mflags ) { int j; struct MyBitMap *bm; bm = (struct MyBitMap *)alloc( sizeof( *bm ) ); if( !bm ) return( NULL ); bm->xsize = xsize; bm->ysize = ysize; InitBitMap( &bm->bm, depth, xsize, ysize ); for( j = 0; j < depth; ++j ) { if( mflags & MEMF_CHIP ) bm->bm.Planes[ j ] = AllocRaster( xsize, ysize ); else bm->bm.Planes[ j ] = AllocMem( RASSIZE( xsize, ysize ), mflags ); if( bm->bm.Planes[ j ] == 0 ) { MyFreeBitMap( &bm->bm ); return( NULL ); } if( mflags & MEMF_CLEAR ) memset( bm->bm.Planes[ j ], 0, RASSIZE( xsize, ysize ) ); } return( &bm->bm ); } void MyFreeBitMap( struct BitMap *bmp ) { int j; struct MyBitMap *bm = (struct MyBitMap *)bmp; for( j = 0; j < bm->bm.Depth; ++j ) { if( bm->bm.Planes[j] ) { if( bm->mflags & MEMF_CHIP ) FreeRaster( bm->bm.Planes[j], bm->xsize, bm->ysize ); else FreeMem( bm->bm.Planes[j], RASSIZE( bm->xsize, bm->ysize ) ); } } free( bm ); } #ifdef TESTING void panic(s,a1,a2,a3,a4) char *s; { printf( s, a1, a2, a3, a4 ); putchar('\n'); } long * alloc(unsigned int x){ long *p = (long *)malloc(x); if(!p){panic("malloc failed"); exit(1);} return p; } #endif void FreeTileImageFiles(){ FreeImageFiles(tileimages,ifftimg); } void FreeImageFiles(char **filenames, struct BitMap **img ) { register int i; for( i = 0; filenames[i]; ++i ) { if( img[ i ] ) MyFreeBitMap( img[ i ] ); } /* REALLY ugly hack alert! */ if( tile && img==ifftimg) MyFreeBitMap( tile ); } #ifndef TESTING /* * Define some stuff for our special glyph drawing routines */ unsigned short glyph_node_index, glyph_buffer_index; #define NUMBER_GLYPH_NODES 80 #define GLYPH_BUFFER_SIZE 512 struct amiv_glyph_node { short odstx, odsty; short srcx, srcy, dstx, dsty; struct BitMap *bitmap; }; struct amiv_glyph_node amiv_g_nodes[NUMBER_GLYPH_NODES]; static char amiv_glyph_buffer[GLYPH_BUFFER_SIZE]; void flush_glyph_buffer( vw ) struct Window *vw; { if( WINVERS_AMIV ) amiv_flush_glyph_buffer ( vw ); else amii_flush_glyph_buffer ( vw ); } /* * Routine to flush whatever is buffered */ void amiv_flush_glyph_buffer( vw ) struct Window *vw; { #if !defined(DISPMAP) || defined(OPT_DISPMAP) int xsize, ysize, x, y; struct BitScaleArgs bsa; struct BitScaleArgs bsm; struct RastPort rast; struct Window *w = NULL; struct BitMap *imgbm = 0, *bm = 0; int i, k; int scaling_needed; register struct RastPort *rp = vw->RPort; #endif /* If nothing is buffered, return before we do anything */ if(glyph_node_index == 0) return; cursor_off( WIN_MAP ); amiv_start_glyphout( WIN_MAP ); #ifdef OPT_DISPMAP if(flags.fast_map){ #endif #ifdef DISPMAP display_map( vw ); #endif #ifdef OPT_DISPMAP } else { #endif #if !defined(DISPMAP) || defined(OPT_DISPMAP) /* XXX fix indent */ /* This is a dynamic value based on this relationship. */ scaling_needed = ( pictdata.xsize != mxsize || pictdata.ysize != mysize ); /* If overview window is up, set up to render the correct scale there */ if( WIN_OVER != WIN_ERR && ( w = amii_wins[ WIN_OVER ]->win ) != NULL ) { InitRastPort( &rast ); /* Calculate the x and y size of each tile for a ROWNO by COLNO map */ xsize = (w->Width - w->BorderLeft - w->BorderRight) / COLNO; ysize = (w->Height - w->BorderTop - w->BorderBottom) / ROWNO; /* Get a chip memory bitmap to blit out of */ bm = MyAllocBitMap( pictdata.xsize, pictdata.ysize, pictdata.nplanes + amii_extraplanes, MEMF_CLEAR|MEMF_CHIP ); if( bm == NULL ) { amii_putstr( WIN_MESSAGE, 0, "Can't allocate bitmap for scaling overview window" ); } rast.BitMap = bm; memset( &bsa, 0, sizeof( bsa ) ); bsa.bsa_SrcX = bsa.bsa_SrcY = 0; bsa.bsa_SrcBitMap = tile; bsa.bsa_SrcWidth = pictdata.xsize; bsa.bsa_SrcHeight = pictdata.ysize; bsa.bsa_XSrcFactor = pictdata.xsize; bsa.bsa_YSrcFactor = pictdata.ysize; bsa.bsa_DestX = 0; bsa.bsa_DestY = 0; bsa.bsa_DestWidth = xsize; bsa.bsa_DestHeight = ysize; bsa.bsa_XDestFactor = xsize; bsa.bsa_YDestFactor = ysize; bsa.bsa_DestBitMap = bm; } if( scaling_needed ) { /* Fill in scaling data for map rendering */ memset( &bsm, 0, sizeof( bsm ) ); bsm.bsa_SrcX = bsm.bsa_SrcY = 0; bsm.bsa_SrcBitMap = tile; bsm.bsa_SrcWidth = pictdata.xsize; bsm.bsa_SrcHeight = pictdata.ysize; bsm.bsa_XSrcFactor = pictdata.xsize; bsm.bsa_YSrcFactor = pictdata.ysize; bsm.bsa_DestWidth = mxsize; bsm.bsa_DestHeight = mysize; bsm.bsa_XDestFactor = mxsize; bsm.bsa_YDestFactor = mysize; bsm.bsa_DestBitMap = rp->BitMap; bsm.bsa_DestY = bsm.bsa_DestX = 0; imgbm = MyAllocBitMap( mxsize, mysize, pictdata.nplanes + amii_extraplanes, MEMF_CLEAR|MEMF_CHIP ); if( imgbm == NULL ) { amii_putstr( WIN_MESSAGE, 0, "Can't allocate scaling bitmap for map window" ); } else bsm.bsa_DestBitMap = imgbm; } /* Go ahead and start dumping the stuff */ for( i=0; iBytesPerRow; for( j = 0; j < pictdata.nplanes + amii_extraplanes; ++j ) { for( k = 0; k < pictdata.ysize; ++k ) { /* For a 16x16 tile, this could just be short assignments, but * this code is generalized to handle any size tile image... */ memcpy( tile->Planes[ j ] + ( ( k * pictdata.ysize ) / 8 ), nodebm->Planes[ j ] + offx + offy + ( nodebm->BytesPerRow * k ), pictdata.ysize/8 ); } } if( !clipping || ( x >= clipx && y >= clipy && x < clipxmax && y < clipymax ) ) { /* scaling is needed, do it */ if( scaling_needed ) { BitMapScale( &bsm ); BltBitMapRastPort( imgbm, 0, 0, rp, amiv_g_nodes[ i ].dstx, amiv_g_nodes[ i ].dsty, mxsize, mysize, 0xc0 ); } else { BltBitMapRastPort( tile, 0, 0, rp, amiv_g_nodes[ i ].dstx, amiv_g_nodes[ i ].dsty, pictdata.xsize, pictdata.ysize, 0xc0 ); } } /* Draw the overview window unless we are scrolling the map raster around */ if( bm && w && reclip != 2 ) { BitMapScale( &bsa ); BltBitMapRastPort( rast.BitMap, 0, 0, w->RPort, w->BorderLeft + amiv_g_nodes[ i ].odstx*xsize, w->BorderTop + amiv_g_nodes[ i ].odsty*ysize, xsize, ysize, 0xc0 ); } } if( imgbm ) MyFreeBitMap( imgbm ); if( bm ) MyFreeBitMap( bm ); #endif /* DISPMAP */ #ifdef OPT_DISPMAP } #endif amii_end_glyphout( WIN_MAP ); /* Clean up */ glyph_node_index = glyph_buffer_index = 0; } /* * Glyph buffering routine. Called instead of WindowPuts(). */ void amiv_lprint_glyph(window,color_index, glyph) winid window; int color_index, glyph; { int base; struct amii_WinDesc *cw; struct Window *w; int curx; int cury; int tbl, icon; register int xoff, yoff; /* Get the real icon index */ if( glyph != NO_GLYPH ) icon = GlyphToIcon( glyph ); if( ( cw=amii_wins[window] ) == (struct amii_WinDesc *)NULL ) panic("bad winid in amiv_lprint_glyph: %d", window ); w = cw->win; if( glyph != NO_GLYPH && glyph < 10000) { /* decide on which image has the needed picture */ if( icon <= MAXMONTILE ) { tbl = TBLMONTILE; base = 0; } else if( icon <= MAXOBJTILE ) { tbl = TBLOBJTILE; base = MAXMONTILE+1; } else if( icon <= MAXOTHTILE ) { tbl = TBLOTHTILE; base = MAXOBJTILE+1; } else panic( "Bad icon #%d, glyph #%d, only %d icons known\n", icon, glyph, MAXOTHTILE ); /* Get the relative offset in the page */ /* How many pixels to account for y distance down */ yoff = ((icon-base) / pictdata.across) * pictdata.ysize; /* How many pixels to account for x distance across */ xoff = ((icon-base) % pictdata.across) * pictdata.xsize; } if(glyph >= 10000){ /* Run a single ASCII character out to the rastport right now */ char c= glyph-10000; int xxx,xxy; struct RastPort *rp = w->RPort; Move(rp, xxx=(((cw->curx-clipx)*rp->TxWidth) + w->BorderLeft), xxy=(w->BorderTop + (((cw->cury-clipy)+1)* rp->TxHeight)+1)); Text(rp,&c,1); /* XXX this shouldn't be necessary: */ if(cw->cursx == xxx && cw->cursy == xxy){ cw->wflags &= ~FLMAP_CURSUP; } cw->curx += rp->TxWidth; /* keep things in sync */ return; } if( cw->type == NHW_MAP ) { curx = cw->curx - clipx; cury = cw->cury - clipy; /* See if we're out of glyph nodes */ if(glyph_node_index >= NUMBER_GLYPH_NODES) amiv_flush_glyph_buffer( w ); /* Fill in the node. */ amiv_g_nodes[glyph_node_index].dsty = min( w->BorderTop + (cury * mysize), w->Height - 1 ); #ifdef OPT_DISPMAP if(flags.fast_map){ #endif /* keni */ #ifdef DISPMAP /* display_map() needs byte-aligned destinations, and we don't want to * overwrite the window border. */ amiv_g_nodes[glyph_node_index].dstx = (w->BorderLeft + 8 + (curx * mxsize)) & -8; #endif #ifdef OPT_DISPMAP } else { #endif #if !defined(DISPMAP) || defined(OPT_DISPMAP) amiv_g_nodes[glyph_node_index].dstx = min( w->BorderLeft + (curx * mxsize), w->Width - 1 ); #endif #ifdef OPT_DISPMAP } #endif amiv_g_nodes[glyph_node_index].odsty = cw->cury; amiv_g_nodes[glyph_node_index].odstx = cw->curx; amiv_g_nodes[glyph_node_index].srcx = xoff; amiv_g_nodes[glyph_node_index].srcy = yoff; amiv_g_nodes[glyph_node_index].bitmap = ifftimg[ tbl ]; ++glyph_node_index; } else { /* Do it */ register int j, k, x, y, apen; struct RastPort *rp = w->RPort; x = rp->cp_x - pictdata.xsize - 3; #ifdef OPT_DISPMAP if(flags.fast_map){ #endif #ifdef DISPMAP x &= -8; if(x==0) x = 8; #endif #ifdef OPT_DISPMAP } #endif y = rp->cp_y - pictdata.ysize + 1; if( glyph != NO_GLYPH ) { struct BitMap *bm = ifftimg[ tbl ]; /* 8 bits per byte */ xoff /= 8; yoff *= bm->BytesPerRow; for( j = 0; j < pictdata.nplanes; ++j ) { for( k = 0; k < pictdata.ysize; ++k ) { memcpy( tile->Planes[ j ] + ( ( k * pictdata.ysize ) / 8 ), bm->Planes[ j ] + xoff + yoff + ( bm->BytesPerRow * k ), pictdata.ysize/8 ); } } BltBitMapRastPort( tile, 0, 0, rp, x, y, pictdata.xsize, pictdata.ysize, 0xc0 ); apen = rp->FgPen; SetAPen( rp, flags.amii_dripens[ SHINEPEN ] ); Move( rp, x-1, y + pictdata.ysize ); Draw( rp, x-1, y - 1 ); Draw( rp, x + pictdata.xsize, y - 1 ); SetAPen( rp, flags.amii_dripens[ SHADOWPEN ] ); Move( rp, x + pictdata.xsize, y ); Draw( rp, x + pictdata.xsize, y + pictdata.ysize ); Draw( rp, x, y + pictdata.ysize ); SetAPen( rp, apen ); } else if( x > w->BorderLeft ) { int apen, bpen; apen = rp->FgPen; bpen = rp->BgPen; SetAPen( rp, amii_menuBPen ); SetBPen( rp, amii_menuBPen ); RectFill( rp, x-1, y-1, x + pictdata.xsize, y + pictdata.ysize ); SetAPen( rp, apen ); SetBPen( rp, bpen ); } } } /* * Define some variables which will be used to save context when toggling * back and forth between low level text and console I/O. */ static long xsave, ysave, modesave, apensave, bpensave; static int usecolor; /* * The function is called before any glyphs are driven to the screen. It * removes the cursor, saves internal state of the window, then returns. */ void amiv_start_glyphout(window) winid window; { struct amii_WinDesc *cw; struct Window *w; if( ( cw=amii_wins[window] ) == (struct amii_WinDesc *)NULL ) panic( "bad winid %d in start_glyphout()", window ); if( cw->wflags & FLMAP_INGLYPH ) return; if( !(w = cw->win ) ) panic( "bad winid %d, no window ptr set", window ); /* * Save the context of the window */ xsave = w->RPort->cp_x; ysave = w->RPort->cp_y; modesave = w->RPort->DrawMode; apensave = w->RPort->FgPen; bpensave = w->RPort->BgPen; /* * Set the mode, and be done with it */ usecolor = iflags.use_color; iflags.use_color = FALSE; cw->wflags |= FLMAP_INGLYPH; } /* * General cleanup routine -- flushes and restores cursor */ void amii_end_glyphout(window) winid window; { struct amii_WinDesc *cw; struct Window *w; if( ( cw = amii_wins[ window ] ) == (struct amii_WinDesc *)NULL ) panic("bad window id %d in amii_end_glyphout()", window ); if( ( cw->wflags & FLMAP_INGLYPH ) == 0 ) return; cw->wflags &= ~(FLMAP_INGLYPH); if( !(w = cw->win ) ) panic( "bad winid %d, no window ptr set", window ); /* * Clean up whatever is left in the buffer */ iflags.use_color = usecolor; /* * Reset internal data structs */ SetAPen(w->RPort, apensave); SetBPen(w->RPort, bpensave); SetDrMd(w->RPort, modesave); Move(w->RPort, xsave, ysave); } static maze_type=COL_MAZE_BRICK; void SetMazeType(MazeType t) { maze_type=t; } int GlyphToIcon(int glyph) { if(glyph>10000)return glyph; return( glyph2tile[glyph] ); } #endif #ifdef AMII_GRAPHICS # ifdef TESTING /* * Define some stuff for our special glyph drawing routines */ static unsigned short glyph_node_index, glyph_buffer_index; # define NUMBER_GLYPH_NODES 80 # define GLYPH_BUFFER_SIZE 512 # endif /* TESTING */ struct amii_glyph_node { short x; short y; short len; unsigned char bg_color; unsigned char fg_color; char *buffer; }; static struct amii_glyph_node amii_g_nodes[NUMBER_GLYPH_NODES]; static char amii_glyph_buffer[GLYPH_BUFFER_SIZE]; #ifdef TEXTCOLOR /* * Map our amiga-specific colormap into the colormap specified in color.h. * See winami.c for the amiga specific colormap. */ 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 #define CLR_GREEN 2 #define CLR_BROWN 3 /* on IBM, low-intensity yellow is brown */ #define CLR_BLUE 4 #define CLR_MAGENTA 5 #define CLR_CYAN 6 #define CLR_GRAY 7 /* low-intensity white */ #define NO_COLOR 8 #define CLR_ORANGE 9 #define CLR_BRIGHT_GREEN 10 #define CLR_YELLOW 11 #define CLR_BRIGHT_BLUE 12 #define CLR_BRIGHT_MAGENTA 13 #define CLR_BRIGHT_CYAN 14 #define CLR_WHITE 15 #define CLR_MAX 16 #endif #endif #ifndef TESTING /* * Begin Revamped Text display routines * * Up until version 3.1, the only method for displaying text on the playing * field was by using the console.device. This was nice for a number of * reasons, the most signifigant of which was a lot of the nuts and bolts was * done for you via escape sequences interpreted by said device. This did * not come without a price however. And that price was speed. It has now * come to a point where the speed has now been deemed unacceptable. * * The following series of routines are designed to drop into the current * nethack display code, using hooks provided for such a measure. It works * on similar principals as the WindowPuts(), buffering I/O internally * until either an explicit flush or internal buffering is exceeded, thereby * forcing the flush. The output (or glyphs) does not go to the * console.device, however. It is driven directly to the rasterport of the * nethack window via the low-level Text() calls, increasing the speed by * a very signifigant factor. */ /* * Routine to simply flush whatever is buffered */ void amii_flush_glyph_buffer( w ) struct Window *w; { short i, x, y; register struct RastPort *rp = w->RPort; /* If nothing is buffered, return before we do anything */ if(glyph_node_index == 0) return; cursor_off( WIN_MAP ); amii_start_glyphout( WIN_MAP ); /* Set up the drawing mode */ SetDrMd( rp, JAM2); /* Go ahead and start dumping the stuff */ for(i=0; iBorderTop + (amii_g_nodes[i].y-2) * rp->TxHeight + rp->TxBaseline + 1; x = amii_g_nodes[i].x * rp->TxWidth + w->BorderLeft; /* Move pens to correct location */ Move( rp, (long)x, (long)y); /* Setup the colors */ SetAPen( rp, (long)amii_g_nodes[i].fg_color); SetBPen( rp, (long)amii_g_nodes[i].bg_color); /* Do it */ Text( rp, amii_g_nodes[i].buffer, amii_g_nodes[i].len); } amii_end_glyphout( WIN_MAP ); /* Clean up */ glyph_node_index = glyph_buffer_index = 0; } void amiga_print_glyph(window,color_index, glyph) winid window; int color_index, glyph; { if( WINVERS_AMIV ) amiv_lprint_glyph(window,color_index, glyph); else amii_lprint_glyph(window,color_index, glyph); } /* * Glyph buffering routine. Called instead of WindowPuts(). */ void amii_lprint_glyph(window,color_index, glyph) winid window; int color_index, glyph; { int fg_color, bg_color; struct amii_WinDesc *cw; struct Window *w; int curx; int cury; if( ( cw=amii_wins[window] ) == (struct amii_WinDesc *)NULL ) panic("bad winid in amii_lprint_glyph: %d", window ); w = cw->win; curx=cw->curx; cury=cw->cury; #ifdef TEXTCOLOR fg_color = foreg[color_index]; bg_color = backg[color_index]; #else fg_color = 1; bg_color = 0; #endif /* TEXTCOLOR */ /* See if we have enough character buffer space... */ if(glyph_buffer_index >= GLYPH_BUFFER_SIZE) amii_flush_glyph_buffer( w ); /* * See if we can append it to the current active node of glyph buffer. It * must satisfy the following conditions: * * * background colors are the same, AND * * foreground colors are the same, AND * * they are precisely side by side */ if((glyph_buffer_index != 0) && (fg_color == amii_g_nodes[glyph_node_index-1].fg_color) && (bg_color == amii_g_nodes[glyph_node_index-1].bg_color) && (amii_g_nodes[glyph_node_index-1].x+ amii_g_nodes[glyph_node_index-1].len == curx) && (amii_g_nodes[glyph_node_index-1].y == cury)) { /* * Add it to the end of the buffer */ amii_glyph_buffer[glyph_buffer_index++] = glyph; amii_g_nodes[glyph_node_index-1].len ++; } else { /* See if we're out of glyph nodes */ if(glyph_node_index >= NUMBER_GLYPH_NODES) amii_flush_glyph_buffer( w ); amii_g_nodes[glyph_node_index].len = 1; amii_g_nodes[glyph_node_index].x = curx; amii_g_nodes[glyph_node_index].y = cury; amii_g_nodes[glyph_node_index].fg_color = fg_color; amii_g_nodes[glyph_node_index].bg_color = bg_color; amii_g_nodes[glyph_node_index].buffer = &amii_glyph_buffer[glyph_buffer_index]; amii_glyph_buffer[glyph_buffer_index] = glyph; ++glyph_buffer_index; ++glyph_node_index; } } #endif /* !TESTING */ #ifdef TESTING /* * Define some variables which will be used to save context when toggling * back and forth between low level text and console I/O. */ static long xsave, ysave, modesave, apensave, bpensave; static int usecolor; #endif /* TESTING */ #ifndef TESTING /* * The function is called before any glyphs are driven to the screen. It * removes the cursor, saves internal state of the window, then returns. */ void amii_start_glyphout(window) winid window; { struct amii_WinDesc *cw; struct Window *w; if( ( cw=amii_wins[window] ) == (struct amii_WinDesc *)NULL ) panic( "bad winid %d in start_glyphout()", window ); if( cw->wflags & FLMAP_INGLYPH ) return; if( !(w = cw->win ) ) panic( "bad winid %d, no window ptr set", window ); /* * Save the context of the window */ xsave = w->RPort->cp_x; ysave = w->RPort->cp_y; modesave = w->RPort->DrawMode; apensave = w->RPort->FgPen; bpensave = w->RPort->BgPen; /* * Set the mode, and be done with it */ usecolor = iflags.use_color; iflags.use_color = FALSE; cw->wflags |= FLMAP_INGLYPH; } #endif /* !TESTING */ # if 0 /* * General cleanup routine -- flushes and restores cursor */ void amii_end_glyphout(window) winid window; { struct amii_WinDesc *cw; struct Window *w; if( ( cw = amii_wins[ window ] ) == (struct amii_WinDesc *)NULL ) panic("bad window id %d in amii_end_glyphout()", window ); if( ( cw->wflags & FLMAP_INGLYPH ) == 0 ) return; cw->wflags &= ~(FLMAP_INGLYPH); if( !(w = cw->win ) ) panic( "bad winid %d, no window ptr set", window ); /* * Clean up whatever is left in the buffer */ iflags.use_color = usecolor; /* * Reset internal data structs */ SetAPen(w->RPort, apensave); SetBPen(w->RPort, bpensave); SetDrMd(w->RPort, modesave); Move(w->RPort, xsave, ysave); } # endif #endif #ifndef TESTING # ifdef OPT_DISPMAP /* don't use dispmap unless x & y are 8,16,24,32,48 and equal */ void dispmap_sanity(){ if( mxsize != mysize || dispmap_sanity1(mxsize) || dispmap_sanity1(mysize)){ flags.fast_map = 0; } } int dispmap_sanity1(x) int x; { static unsigned char valid[] = {8,16,24,32,48,0}; return !!strchr(valid,x); } # endif /* OPT_DISPMAP */ #endif /* TESTING */ slashem-0.0.7E7F3/sys/amiga/winstr.c0000664000076400007640000002663410545462317015255 0ustar aliali/* SCCS Id: @(#)winstr.c 3.1 93/04/02 */ /* Copyright (c) Gregg Wonderly, Naperville, Illinois, 1991,1992,1993. */ /* NetHack may be freely redistributed. See license for details. */ #include "NH:sys/amiga/windefs.h" #include "NH:sys/amiga/winext.h" #include "NH:sys/amiga/winproto.h" /* Put a string into the indicated window using the indicated attribute */ void amii_putstr(window,attr,str) winid window; int attr; const char *str; { int fudge; int len; struct Window *w; 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 ) { window = WIN_BASE; if( window == WIN_ERR ) window = WIN_BASE = amii_create_nhwindow( NHW_BASE ); } if( window == WIN_ERR || ( cw = amii_wins[window] ) == NULL ) { iflags.window_inited=0; panic(winpanicstr,window, "putstr"); } w = cw->win; if(!str) return; amiIDisplay->lastwin = window; /* do we care??? */ /* NHW_MENU windows are not opened immediately, so check if we * have the window pointer yet */ if( w ) { /* Set the drawing mode and pen colors */ SetDrMd( w->RPort, JAM2 ); amii_sethipens( w, cw->type, attr ); } else if( cw->type != NHW_MENU && cw->type != NHW_TEXT ) { panic( "NULL window pointer in putstr 2: %d", window ); } /* Okay now do the work for each type */ switch(cw->type) { case NHW_MESSAGE: if( WINVERS_AMIV ) fudge = 2; else { /* 8 for --more--, 1 for preceeding sp, 1 for putstr pad */ fudge = 10; } /* There is a one pixel border at the borders, so subtract two */ bottom = amii_msgborder( w ); wheight = ( w->Height - w->BorderTop - w->BorderBottom - 3 ) / w->RPort->TxHeight; if (scrollmsg || wheight > 1) fudge = 0; amii_scrollmsg( w, cw ); while (isspace(*str)) str++; strncpy( toplines, str, TBUFSZ ); toplines[ TBUFSZ - 1 ] = 0; /* For initial message to be visible, we need to explicitly position the * cursor. This flag, cw->curx == -1 is set elsewhere to force the * cursor to be repositioned to the "bottom". */ if( cw->curx == -1 ) { amii_curs( WIN_MESSAGE, 1, bottom ); cw->curx = 0; } /* If used all of history lines, move them down */ if( cw->maxrow >= iflags.msg_history ) { if( cw->data[ 0 ] ) free( cw->data[ 0 ] ); memcpy( cw->data, &cw->data[ 1 ], ( iflags.msg_history - 1 ) * sizeof( char * ) ); cw->data[ iflags.msg_history - 1 ] = (char *) alloc( strlen( toplines ) + 5 ); strcpy( cw->data[ i = iflags.msg_history - 1 ] + SOFF + (scrollmsg!=0), toplines ); } else { /* Otherwise, allocate a new one and copy the line in */ cw->data[ cw->maxrow ] = (char *) alloc( strlen( toplines ) + 5 ); strcpy( cw->data[ i = cw->maxrow++ ] + SOFF + (scrollmsg!=0), toplines ); } cw->data[ i ][ SEL_ITEM ] = 1; cw->data[ i ][ VATTR ] = attr+1; if( scrollmsg ) { cw->curx = 0; cw->data[ i ][2] = (cw->wflags & FLMSG_FIRST ) ? '>' : ' '; } str = cw->data[i] + SOFF; if( cw->curx + strlen(str) >= (cw->cols-fudge) ) { int i; char *ostr = (char *)str; char *p; while( cw->curx + strlen( str ) >= (cw->cols-fudge) ) { for(p=((char *)&str[ cw->cols-1 - cw->curx ])-fudge; !isspace(*p) && p > str;) --p; if (p < str) p = (char *)str; if( p == str ) { /* p = (char *)&str[ cw->cols ]; */ outmore(cw); continue; } i = (long)p-(long)str; outsubstr( cw, (char *)str, i, fudge ); cw->curx += i; while(isspace(*p)) p++; str = p; #if 0 if( str != ostr ) { outsubstr( cw, "+", 1, fudge ); cw->curx+=2; } #endif if(*str) amii_scrollmsg( w, cw ); amii_cl_end( cw, cw->curx ); } if( *str ) { if( str != ostr ) { outsubstr( cw, "+", 1, fudge ); cw->curx+=2; } while ( isspace( *str ) ) ++str; outsubstr( cw, (char *)str, i = strlen( (char *)str ), fudge ); cw->curx += i; amii_cl_end( cw, cw->curx ); } } else { outsubstr( cw, (char *)str, i = strlen( (char *)str ), fudge ); cw->curx += i; amii_cl_end( cw, cw->curx ); } cw->wflags &= ~FLMSG_FIRST; len = 0; if( scrollmsg ) { totalvis = CountLines( window ); SetPropInfo( w, &MsgScroll, ( w->Height-w->BorderTop-w->BorderBottom ) / w->RPort->TxHeight, totalvis, totalvis ); } i = strlen( toplines + SOFF ); cw->maxcol = max( cw->maxcol, i ); cw->vwy = cw->maxrow; break; case NHW_STATUS: if( cw->data[ cw->cury ] == NULL ) panic( "NULL pointer for status window" ); ob = &cw->data[cw->cury][j = cw->curx]; if(flags.botlx) *ob = 0; /* Display when beam at top to avoid flicker... */ WaitTOF(); Text(w->RPort,(char *)str,strlen((char *)str)); if( cw->cols > strlen( str ) ) TextSpaces( w->RPort, cw->cols - strlen( str ) ); (void) strncpy(cw->data[cw->cury], str, cw->cols ); cw->data[cw->cury][cw->cols-1] = '\0'; /* null terminate */ cw->cury = (cw->cury+1) % 2; cw->curx = 0; break; 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: case NHW_TEXT: /* always grows one at a time, but alloc 12 at a time */ if( cw->cury >= cw->rows || !cw->data ) { char **tmp; /* Allocate 12 more rows */ cw->rows += 12; tmp = (char**) alloc(sizeof(char*) * cw->rows); /* Copy the old lines */ for(i=0; icury; i++) tmp[i] = cw->data[i]; if( cw->data ) { free( cw->data ); cw->data = NULL; } cw->data = tmp; /* Null out the unused entries. */ for(i=cw->cury; irows; i++) cw->data[i] = 0; } if( !cw->data ) panic("no data storage"); /* 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); /* avoid nuls, for convenience */ cw->data[cw->cury][VATTR] = attr+1; cw->data[cw->cury][SEL_ITEM] = 0; Strcpy( cw->data[cw->cury] + SOFF, str); if(n0 > cw->maxcol) cw->maxcol = n0; if(++cw->cury > cw->maxrow) cw->maxrow = cw->cury; break; default: panic("Invalid or unset window type in putstr()"); } } void amii_scrollmsg( w, cw ) register struct Window *w; register struct amii_WinDesc *cw; { int bottom, wheight; bottom = amii_msgborder( w ); wheight = ( w->Height - w->BorderTop - w->BorderBottom - 3 ) / w->RPort->TxHeight; if( scrollmsg ) { if( ++cw->disprows > wheight ) { outmore( cw ); cw->disprows = 1; /* count this line... */ } else { ScrollRaster( w->RPort, 0, w->RPort->TxHeight, w->BorderLeft, w->BorderTop + 1, w->Width - w->BorderRight-1, w->Height - w->BorderBottom - 1 ); } amii_curs( WIN_MESSAGE, 1, bottom ); } } int amii_msgborder( w ) struct Window *w; { register int bottom; /* There is a one pixel border at the borders, so subtract two */ bottom = w->Height - w->BorderTop - w->BorderBottom - 2; bottom /= w->RPort->TxHeight; if( bottom > 0 ) --bottom; return( bottom ); } void outmore( cw ) register struct amii_WinDesc *cw; { struct Window *w = cw->win; if((cw->wflags & FLMAP_SKIP) == 0) { if( scrollmsg ) { int bottom; bottom = amii_msgborder( w ); ScrollRaster( w->RPort, 0, w->RPort->TxHeight, w->BorderLeft, w->BorderTop+1, w->Width - w->BorderRight-1, w->Height - w->BorderBottom - 1 ); amii_curs( WIN_MESSAGE, 1, bottom ); /* -1 for inner border */ Text( w->RPort, "--more--", 8 ); } else Text( w->RPort, " --more--", 9 ); /* Make sure there are no events in the queue */ flushIDCMP( HackPort ); /* Allow mouse clicks to clear --more-- */ WindowGetchar(); if( lastevent.type == WEKEY && lastevent.un.key == '\33' ) cw->wflags |= FLMAP_SKIP; } if( !scrollmsg ) { amii_curs( WIN_MESSAGE, 1, 0 ); amii_cl_end( cw, cw->curx ); } } void outsubstr( cw, str, len, fudge ) register struct amii_WinDesc *cw; char *str; int len; int fudge; { struct Window *w = cw->win; if( cw->curx ) { /* Check if this string and --more-- fit, if not, * then put out --more-- and wait for a key. */ if( (len + fudge ) + cw->curx >= cw->cols ) { if( !scrollmsg ) outmore( cw ); } else { /* Otherwise, move and put out a blank separator */ Text( w->RPort, spaces, 1 ); cw->curx += 1; } } Text(w->RPort,str,len); } /* Put a graphics character onto the screen */ void amii_putsym( st, i, y, c ) winid st; int i, y; CHAR_P c; { amii_curs( st, i, y ); Text(amii_wins[st]->win->RPort, &c, 1); } /* Add to the last line in the message window */ void amii_addtopl(s) const char *s; { register struct amii_WinDesc *cw = amii_wins[WIN_MESSAGE]; while(*s) { if(cw->curx == cw->cols - 1) amii_putstr(WIN_MESSAGE, 0, ""); amii_putsym(WIN_MESSAGE, cw->curx + 1, amii_msgborder(cw->win), *s++); cw->curx++; } } void TextSpaces( rp, nr ) struct RastPort *rp; int nr; { if( nr < 1 ) return; while (nr > sizeof(spaces) - 1) { Text(rp, spaces, (long)sizeof(spaces) - 1); nr -= sizeof(spaces) - 1; } if (nr > 0) Text(rp, spaces, (long)nr); } void amii_remember_topl() { /* ignore for now. I think this will be done automatically by * the code writing to the message window, but I could be wrong. */ } int amii_doprev_message() { struct amii_WinDesc *cw; struct Window *w; char *str; if( WIN_MESSAGE == WIN_ERR || ( cw = amii_wins[ WIN_MESSAGE ] ) == NULL || ( w = cw->win ) == NULL ) { panic(winpanicstr,WIN_MESSAGE, "doprev_message"); } /* When an interlaced/tall screen is in use, the scroll bar will be there */ /* Or in some other cases as well */ if( scrollmsg ) { struct Gadget *gd; struct PropInfo *pip; int hidden, topidx, i, total, wheight; for( gd = w->FirstGadget; gd && gd->GadgetID != 1; ) gd = gd->NextGadget; if( gd ) { pip = (struct PropInfo *)gd->SpecialInfo; wheight = ( w->Height - w->BorderTop - w->BorderBottom - 2 ) / w->RPort->TxHeight; hidden = max( cw->maxrow - wheight, 0 ); topidx = (((ULONG)hidden * pip->VertPot) + (MAXPOT/2)) >> 16; for( total = i = 0; i < cw->maxrow; ++i ) { if( cw->data[i][1] != 0 ) ++total; } i = 0; topidx -= wheight/4 + 1; if (topidx < 0) topidx = 0; SetPropInfo( w, &MsgScroll, wheight, total, topidx ); DisplayData( WIN_MESSAGE, topidx ); } return(0); } if( --cw->vwy < 0 ) { cw->maxcol = 0; DisplayBeep( NULL ); str = "\0\0No more history saved..."; } else str = cw->data[ cw->vwy ]; amii_cl_end(cw, 0); amii_curs( WIN_MESSAGE, 1, 0 ); amii_setdrawpens( amii_wins[WIN_MESSAGE]->win, NHW_MESSAGE ); Text(w->RPort,str+SOFF,strlen(str+SOFF)); cw->curx = cw->cols + 1; return( 0 ); } slashem-0.0.7E7F3/sys/amiga/winreq.c0000664000076400007640000006460610545462317015235 0ustar aliali/* SCCS Id: @(#)winreq.c 3.1 93/04/02 */ /* Copyright (c) Gregg Wonderly, Naperville, Illinois, 1991,1992,1993. */ /* NetHack may be freely redistributed. See license for details. */ #include "NH:sys/amiga/windefs.h" #include "NH:sys/amiga/winext.h" #include "NH:sys/amiga/winproto.h" #define GADBLUEPEN 2 #define GADREDPEN 3 #define GADGREENPEN 4 #define GADCOLOKAY 5 #define GADCOLCANCEL 6 #define GADCOLSAVE 7 UBYTE UNDOBUFFER[300]; SHORT BorderVectors1[] = { 0,0, 57,0, 57,11, 0,11, 0,0 }; struct Border Border1 = { -1,-1, 3,0,JAM1, 5, BorderVectors1, NULL }; struct IntuiText IText1 = { 3,0,JAM1, 4,1, NULL, (UBYTE *)"Cancel", NULL }; struct Gadget Gadget2 = { NULL, 9,15, 56,10, NULL, RELVERIFY, BOOLGADGET, (APTR)&Border1, NULL, &IText1, NULL, NULL, 1, NULL }; UBYTE StrStringSIBuff[300]; struct StringInfo StrStringSInfo = { StrStringSIBuff, UNDOBUFFER, 0, 300, 0, 0,0,0,0,0, 0, 0, NULL }; SHORT BorderVectors2[] = { 0,0, 439,0, 439,11, 0,11, 0,0 }; struct Border Border2 = { -1,-1, 3,0,JAM1, 5, BorderVectors2, NULL }; struct Gadget String = { &Gadget2, 77,15, 438,10, NULL, RELVERIFY+STRINGCENTER, STRGADGET, (APTR)&Border2, NULL, NULL, NULL, (APTR)&StrStringSInfo, 2, NULL }; #define StrString \ ((char *)(((struct StringInfo *)(String.SpecialInfo))->Buffer)) struct NewWindow StrWindow = { 57,74, 526,31, 0,1, GADGETUP+CLOSEWINDOW+ACTIVEWINDOW+VANILLAKEY, WINDOWDRAG+WINDOWDEPTH+WINDOWCLOSE+ACTIVATE+NOCAREREFRESH, &String, NULL, NULL, NULL, NULL, 5,5, 0xffff,0xffff, CUSTOMSCREEN }; #include "NH:sys/amiga/colorwin.c" #define XSIZE 2 #define YSIZE 3 #define XCLIP 4 #define YCLIP 5 #define GADOKAY 6 #define GADCANCEL 7 #include "NH:sys/amiga/clipwin.c" void ClearCol( struct Window *w ); void EditColor( ) { extern const char *configfile; int i, done = 0, okay = 0; long code, qual, class; register struct Gadget *gd, *dgad; register struct Window *nw; register struct IntuiMessage *imsg; register struct PropInfo *pip; register struct Screen *scrn; long aidx; int msx, msy; int curcol = 0, drag = 0; int bxorx, bxory, bxxlen, bxylen; static UWORD colors[ AMII_MAXCOLORS ]; static UWORD svcolors[ AMII_MAXCOLORS ]; static int once = 0; scrn = HackScreen; if( !once ) { if( WINVERS_AMIV ) { Col_NewWindowStructure1.Width += 300; Col_NewWindowStructure1.Height += 20; Col_NewWindowStructure1.LeftEdge -= 150; Col_BluePen.Width += 300; Col_RedPen.Width += 300; Col_GreenPen.Width += 300; Col_Cancel.LeftEdge += 300; Col_Okay.LeftEdge += 150; Col_Cancel.TopEdge += 20; Col_Save.TopEdge += 20; Col_Okay.TopEdge += 20; } SetBorder( &Col_Okay ); SetBorder( &Col_Cancel ); SetBorder( &Col_Save ); once = 1; } bxylen = Col_NewWindowStructure1.Height - ( Col_BluePen.TopEdge + Col_BluePen.Height + 6 ); bxxlen = Col_BluePen.Width; bxorx = Col_BluePen.LeftEdge; bxory = Col_BluePen.TopEdge + Col_BluePen.Height + 2; /* Save the current colors */ for( i = 0; i < amii_numcolors; ++i ) svcolors[ i ] = colors[ i ] = GetRGB4( scrn->ViewPort.ColorMap, i ); Col_NewWindowStructure1.Screen = scrn; #ifdef INTUI_NEW_LOOK if( IntuitionBase->LibNode.lib_Version >= 37 ) { ((struct PropInfo *)Col_BluePen.SpecialInfo)->Flags |= PROPNEWLOOK; ((struct PropInfo *)Col_RedPen.SpecialInfo)->Flags |= PROPNEWLOOK; ((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 ); DrawCol( nw, curcol, colors ); while( !done ) { WaitPort( nw->UserPort ); while( imsg = (struct IntuiMessage * )GetMsg( nw->UserPort ) ) { gd = (struct Gadget *)imsg->IAddress; code = imsg->Code; class = imsg->Class; qual = imsg->Qualifier; msx = imsg->MouseX; msy = imsg->MouseY; ReplyMsg( (struct Message *)imsg ); switch( class ) { case VANILLAKEY: if( code == 'v' && qual == AMIGALEFT ) okay = done = 1; else if( code == 'b' && qual == AMIGALEFT ) okay = 0, done = 1; else if( code == 'o' || code == 'O' ) okay = done = 1; else if( code == 'c' || code == 'C' ) okay = 0, done = 1; break; case CLOSEWINDOW: done = 1; break; case GADGETUP: drag = 0; if( gd->GadgetID == GADREDPEN || gd->GadgetID == GADBLUEPEN || gd->GadgetID == GADGREENPEN ) { pip = (struct PropInfo *)gd->SpecialInfo; aidx = pip->HorizPot / (MAXPOT/15); if( gd->GadgetID == GADREDPEN ) { colors[ curcol ] = ( colors[ curcol ] & ~0xf00 ) | (aidx << 8); LoadRGB4( &scrn->ViewPort, colors, amii_numcolors ); } else if( gd->GadgetID == GADBLUEPEN ) { colors[ curcol ] = ( colors[ curcol ] & ~0xf ) | aidx; LoadRGB4( &scrn->ViewPort, colors, amii_numcolors ); } else if( gd->GadgetID == GADGREENPEN ) { colors[ curcol ] = ( colors[ curcol ] & ~0x0f0 ) | (aidx << 4); LoadRGB4( &scrn->ViewPort, colors, amii_numcolors ); } DispCol( nw, curcol, colors ); } else if( gd->GadgetID == GADCOLOKAY ) { done = 1; okay = 1; } else if( gd->GadgetID == GADCOLSAVE ) { FILE *fp, *nfp; char buf[ 300 ], nname[ 300 ], oname[ 300 ]; int once = 0; fp = fopen( configfile, "r" ); if( !fp ) { pline( "can't find NetHack.cnf" ); break; } strcpy( oname, dirname( (char *)configfile ) ); if( oname[ strlen(oname)-1 ] != ':' ) { sprintf( nname, "%s/New_NetHack.cnf", oname ); strcat( oname, "/" ); strcat( oname, "Old_NetHack.cnf" ); } else { sprintf( nname, "%sNew_NetHack.cnf", oname ); strcat( oname, "Old_NetHack.cnf" ); } nfp = fopen( nname, "w" ); if( !nfp ) { pline( "can't write to New_NetHack.cnf" ); fclose( fp ); break; } while( fgets( buf, sizeof( buf ), fp ) ) { if( strncmp( buf, "PENS=", 5 ) == 0 ) { once = 1; fputs( "PENS=", nfp ); for( i = 0; i < amii_numcolors; ++i ) { fprintf( nfp, "%03x", colors[i] ); if(( i + 1 ) < amii_numcolors) putc( '/', nfp ); } putc( '\n', nfp ); } else { fputs( buf, nfp ); } } /* If none in the file yet, now write it */ if( !once ) { fputs( "PENS=", nfp ); for( i = 0; i < amii_numcolors; ++i ) { fprintf( nfp, "%03x", colors[i] ); if(( i + 1 ) < amii_numcolors) putc( ',', nfp ); } putc( '\n', nfp ); } fclose( fp ); fclose( nfp ); unlink( oname ); if( filecopy( (char *)configfile, oname ) == 0 ) if( filecopy( nname, (char *)configfile ) == 0 ) unlink( nname ); done = 1; okay = 1; } else if( gd->GadgetID == GADCOLCANCEL ) { done = 1; okay = 0; } break; case GADGETDOWN: drag = 1; dgad = gd; break; case MOUSEMOVE: if( !drag ) break; pip = (struct PropInfo *)dgad->SpecialInfo; aidx = pip->HorizPot / (MAXPOT/15); if( dgad->GadgetID == GADREDPEN ) { colors[ curcol ] = ( colors[ curcol ] & ~0xf00 ) | (aidx << 8); LoadRGB4( &scrn->ViewPort, colors, amii_numcolors ); } else if( dgad->GadgetID == GADBLUEPEN ) { colors[ curcol ] = ( colors[ curcol ] & ~0xf ) | aidx; LoadRGB4( &scrn->ViewPort, colors, amii_numcolors ); } else if( dgad->GadgetID == GADGREENPEN ) { colors[ curcol ] = ( colors[ curcol ] & ~0x0f0 ) | (aidx << 4); LoadRGB4( &scrn->ViewPort, colors, amii_numcolors ); } DispCol( nw, curcol, colors ); break; case MOUSEBUTTONS: if( code == SELECTDOWN ) { if( msy > bxory && msy < bxory + bxylen - 1 && msx > bxorx && msx < bxorx + bxxlen - 1 ) { curcol = ( msx - bxorx )/(bxxlen / amii_numcolors); if( curcol >= 0 && curcol < amii_numcolors ) DrawCol( nw, curcol, colors ); } } break; } } } if( okay ) { for( i = 0; i < ( amii_numcolors ); ++i ) flags.amii_curmap[ i ] = colors[ i ]; LoadRGB4( &scrn->ViewPort, flags.amii_curmap, amii_numcolors ); } else LoadRGB4( &scrn->ViewPort, svcolors, amii_numcolors ); CloseWindow( nw ); } void ShowClipValues( struct Window *nw ) { char buf[ 50 ]; struct Gadget *gd; SetAPen( nw->RPort, 5 ); SetBPen( nw->RPort, amii_otherBPen ); SetDrMd( nw->RPort, JAM2 ); sprintf( buf, "%d ", mxsize ); gd = &ClipXSIZE; Move( nw->RPort, gd->LeftEdge + (nw->Width + gd->Width) + 8, gd->TopEdge + nw->RPort->TxBaseline ); Text( nw->RPort, buf, strlen( buf ) ); sprintf( buf, "%d ", mysize ); gd = &ClipYSIZE; Move( nw->RPort, gd->LeftEdge + (nw->Width + gd->Width) + 8, gd->TopEdge + nw->RPort->TxBaseline ); Text( nw->RPort, buf, strlen( buf ) ); sprintf( buf, "%d ", xclipbord ); gd = &ClipXCLIP; Move( nw->RPort, gd->LeftEdge + (nw->Width + gd->Width) + 8, gd->TopEdge + nw->RPort->TxBaseline ); Text( nw->RPort, buf, strlen( buf ) ); sprintf( buf, "%d ", yclipbord ); gd = &ClipYCLIP; Move( nw->RPort, gd->LeftEdge + (nw->Width + gd->Width) + 8, gd->TopEdge + nw->RPort->TxBaseline ); Text( nw->RPort, buf, strlen( buf ) ); } void EditClipping( void ) { int i; long mflags; static int sizes[] = { 8, 16, 20, 24, 28, 32, 36 }; char buf[ 40 ]; int done = 0, okay = 0; long code, qual, class; register struct Gadget *gd, *dgad; register struct Window *nw; register struct IntuiMessage *imsg; register struct PropInfo *pip; register struct Screen *scrn; long aidx; int lmxsize = mxsize, lmysize = mysize; int lxclipbord = xclipbord, lyclipbord = yclipbord; int msx, msy; int drag = 0; static int once = 0; scrn = HackScreen; if( !once ) { SetBorder( &ClipOkay ); SetBorder( &ClipCancel ); once = 1; } ClipNewWindowStructure1.Screen = scrn; #ifdef INTUI_NEW_LOOK if( IntuitionBase->LibNode.lib_Version >= 37 ) { ((struct PropInfo *)ClipXSIZE.SpecialInfo)->Flags |= PROPNEWLOOK; ((struct PropInfo *)ClipYSIZE.SpecialInfo)->Flags |= PROPNEWLOOK; ((struct PropInfo *)ClipXCLIP.SpecialInfo)->Flags |= PROPNEWLOOK; ((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 } nw = OpenWindow( (void *)&ClipNewWindowStructure1 ); if( nw == NULL ) { DisplayBeep( NULL ); return; } ShowClipValues( nw ); mflags = AUTOKNOB|FREEHORIZ; #ifdef INTUI_NEW_LOOK if( IntuitionBase->LibNode.lib_Version >= 37 ) { mflags |= PROPNEWLOOK; } #endif for( i = 0; i < 7; ++i ) { if( mxsize <= sizes[ i ] ) break; } NewModifyProp( &ClipXSIZE, nw, NULL, mflags, (i * MAXPOT ) / 6, 0, MAXPOT/6, 0, 1 ); for( i = 0; i < 7; ++i ) { if( mysize <= sizes[ i ] ) break; } NewModifyProp( &ClipYSIZE, nw, NULL, mflags, (i * MAXPOT ) / 6, 0, MAXPOT/6, 0, 1 ); NewModifyProp( &ClipXCLIP, nw, NULL, mflags, ((xclipbord-2) * MAXPOT ) / 6, 0, MAXPOT/6, 0, 1 ); NewModifyProp( &ClipYCLIP, nw, NULL, mflags, ((yclipbord-2) * MAXPOT ) / 6, 0, MAXPOT/6, 0, 1 ); while( !done ) { WaitPort( nw->UserPort ); while( imsg = (struct IntuiMessage * )GetMsg( nw->UserPort ) ) { gd = (struct Gadget *)imsg->IAddress; code = imsg->Code; class = imsg->Class; qual = imsg->Qualifier; msx = imsg->MouseX; msy = imsg->MouseY; ReplyMsg( (struct Message *)imsg ); switch( class ) { case VANILLAKEY: if( code == '\33' ) okay = 0, done = 1; else if( code == 'v' && qual == AMIGALEFT ) okay = done = 1; else if( code == 'b' && qual == AMIGALEFT ) okay = 0, done = 1; else if( code == 'o' || code == 'O' ) okay = done = 1; else if( code == 'c' || code == 'C' ) okay = 0, done = 1; break; case CLOSEWINDOW: done = 1; break; case GADGETUP: drag = 0; if( gd->GadgetID == XSIZE || gd->GadgetID == YSIZE || gd->GadgetID == XCLIP || gd->GadgetID == YCLIP ) { pip = (struct PropInfo *)gd->SpecialInfo; aidx = pip->HorizPot / (MAXPOT/6); if( gd->GadgetID == XSIZE ) { mxsize = sizes[ aidx ]; } else if( gd->GadgetID == YSIZE ) { mysize = sizes[ aidx ]; } else if( gd->GadgetID == XCLIP ) { xclipbord = aidx + 2; } else if( gd->GadgetID == YCLIP ) { yclipbord = aidx + 2; } ShowClipValues( nw ); #ifdef OPT_DISPMAP dispmap_sanity(); #endif } else if( gd->GadgetID == GADOKAY ) { done = 1; okay = 1; } else if( gd->GadgetID == GADCANCEL ) { done = 1; okay = 0; } ReportMouse( 0, nw ); reclip = 2; doredraw(); flush_glyph_buffer( amii_wins[ WIN_MAP ]->win ); reclip = 0; break; case GADGETDOWN: drag = 1; dgad = gd; ReportMouse( 1, nw ); break; case MOUSEMOVE: if( !drag ) break; pip = (struct PropInfo *)dgad->SpecialInfo; aidx = pip->HorizPot / (MAXPOT/6); Move( nw->RPort, dgad->LeftEdge + (nw->Width + dgad->Width) + 8, dgad->TopEdge + nw->RPort->TxBaseline ); if( dgad->GadgetID == XSIZE ) { mxsize = sizes[ aidx ]; sprintf( buf, "%d ",lmxsize ); } else if( dgad->GadgetID == YSIZE ) { mysize = sizes[ aidx ]; sprintf( buf, "%d ", mysize ); } else if( dgad->GadgetID == XCLIP ) { xclipbord = aidx + 2; sprintf( buf, "%d ", xclipbord ); } else if( dgad->GadgetID == YCLIP ) { yclipbord = aidx + 2; sprintf( buf, "%d ", yclipbord ); } SetAPen( nw->RPort, 5 ); SetBPen( nw->RPort, amii_otherBPen ); SetDrMd( nw->RPort, JAM2 ); Text( nw->RPort, buf, strlen( buf ) ); #ifdef OPT_DISPMAP dispmap_sanity(); #endif break; } } } CloseWindow( nw ); /* Restore oldvalues if cancelled. */ if( !okay ) { mxsize = lmxsize; mysize = lmysize; xclipbord = lxclipbord; yclipbord = lyclipbord; } } char *dirname( str ) char *str; { char *t, c; static char dir[ 300 ]; t = strrchr( str, '/' ); if( !t ) t = strrchr( str, ':' ); if( !t ) t = str; else { c = *t; *t = 0; strcpy( dir, str ); *t = c; } return( dir ); } char *basename( str ) char *str; { char *t; t = strrchr( str, '/' ); if( !t ) t = strrchr( str, ':' ); if( !t ) t = str; else ++t; return( t ); } filecopy( from, to ) char *from, *to; { char *buf; int i = 0; buf = (char *)alloc( strlen(to) + strlen(from) + 20 ); if( buf ) { sprintf( buf, "c:copy \"%s\" \"%s\" clone", from, to ); /* Check SysBase instead? Shouldn't matter */ #ifdef INTUI_NEW_LOOK if( IntuitionBase->LibNode.lib_Version >= 37 ) i = System( buf, NULL ); else #endif Execute( buf, NULL, NULL ); free( buf ); } else { return( -1 ); } return( i ); } /* The colornames, and the default values for the pens */ static struct COLDEF { char *name, *defval; }; struct COLDEF amii_colnames[ AMII_MAXCOLORS ] = { "Black","(000)", "White","(fff)", "Brown","(830)", "Cyan","(7ac)", "Green","(181)", "Magenta","(c06)", "Blue","(23e)", "Red","(c00)", }; struct COLDEF amiv_colnames[ AMII_MAXCOLORS ] = { "Black","(000)", "White","(fff)", "Cyan","(0bf)", "Orange","(f60)", "Blue","(00f)", "Green","(090)", "Grey","(69b)", "Red","(f00)", "Light Green","(6f0)", "Yellow","(ff0)", "Magenta","(f0f)", "Brown","(940)", "Grey Blue","(466)", "Light Brown","(c40)", "Light Grey","(ddb)", "Peach","(fb9)", "Col 16","(222)", "Col 17","(eee)", "Col 18","(000)", "Col 19","(ccc)", "Col 20","(bbb)", "Col 21","(aaa)", "Col 22","(999)", "Col 23","(888)", "Col 24","(777)", "Col 25","(666)", "Col 26","(555)", "Col 27","(444)", "Col 28","(333)", "Col 29","(18f)", "Col 30","(f81)", "Col 31","(fff)", }; void ClearCol( struct Window *w ) { int bxorx, bxory, bxxlen, bxylen; int incx, incy; bxylen = Col_Okay.TopEdge - ( Col_BluePen.TopEdge + Col_BluePen.Height ) - 1 - txheight - 3; bxxlen = Col_BluePen.Width - 2; bxorx = Col_BluePen.LeftEdge + 1; bxory = Col_BluePen.TopEdge + Col_BluePen.Height + 2; incx = bxxlen / amii_numcolors; incy = bxylen - 2; bxxlen /= incx; bxxlen *= incx; bxxlen += 2; SetAPen( w->RPort, C_WHITE ); SetDrMd( w->RPort, JAM1 ); RectFill( w->RPort, bxorx, bxory, bxorx + bxxlen + 1, bxory + bxylen ); SetAPen( w->RPort, C_BLACK ); RectFill( w->RPort, bxorx+1, bxory+1, bxorx + bxxlen, bxory + bxylen - 1); } void DrawCol( w, idx, colors ) struct Window *w; int idx; UWORD *colors; { int bxorx, bxory, bxxlen, bxylen; int i, incx, incy, r, g, b; long mflags; bxylen = Col_Okay.TopEdge - ( Col_BluePen.TopEdge + Col_BluePen.Height ) - 1 - txheight - 3; bxxlen = Col_BluePen.Width - 2; bxorx = Col_BluePen.LeftEdge + 1; bxory = Col_BluePen.TopEdge + Col_BluePen.Height + 2; incx = bxxlen / amii_numcolors; incy = bxylen - 2; bxxlen /= incx; bxxlen *= incx; bxxlen += 2; for( i = 0; i < amii_numcolors; ++i ) { int x, y; x = bxorx + 2 + (i*incx); y = bxory + 2; if( i == idx ) { SetAPen( w->RPort, flags.amii_dripens[ SHADOWPEN ] ); Move( w->RPort, x, y+bxylen-4 ); Draw( w->RPort, x, y ); Draw( w->RPort, x+incx-1, y ); Move( w->RPort, x+1, y+bxylen-5 ); Draw( w->RPort, x+1, y+1 ); Draw( w->RPort, x+incx-2, y+1 ); SetAPen( w->RPort, flags.amii_dripens[ SHINEPEN ] ); Move( w->RPort, x+incx-1, y+1 ); Draw( w->RPort, x+incx-1, y+bxylen-4 ); Draw( w->RPort, x, y+bxylen-4 ); Move( w->RPort, x+incx-2, y+2 ); Draw( w->RPort, x+incx-2, y+bxylen-5 ); Draw( w->RPort, x+1, y+bxylen-5 ); } else { SetAPen( w->RPort, C_BLACK ); Move( w->RPort, x, y ); Draw( w->RPort, x +incx-1, y ); Draw( w->RPort, x +incx-1, y +bxylen - 4 ); Draw( w->RPort, x, y + bxylen - 4 ); Draw( w->RPort, x, y ); SetAPen( w->RPort, C_BLACK ); Move( w->RPort, x+1, y+1 ); Draw( w->RPort, x +incx-2, y+1 ); Draw( w->RPort, x +incx-2, y +bxylen - 6 ); Draw( w->RPort, x+1, y + bxylen - 6 ); Draw( w->RPort, x+1, y+1 ); } SetAPen( w->RPort, i ); RectFill( w->RPort, x + 3, y + 3, x + incx - 4, y + bxylen - 6 ); } DispCol( w, idx, colors ); r = (colors[ idx ] & 0xf00) >> 8; g = (colors[ idx ] & 0x0f0) >> 4; b = colors[ idx ] & 0x00f; mflags = AUTOKNOB|FREEHORIZ; #ifdef INTUI_NEW_LOOK if( IntuitionBase->LibNode.lib_Version >= 37 ) { mflags |= PROPNEWLOOK; } #endif NewModifyProp( &Col_RedPen, w, NULL, mflags, (r * MAXPOT ) / 15, 0, MAXPOT/15, 0, 1 ); NewModifyProp( &Col_GreenPen, w, NULL, mflags, (g * MAXPOT ) / 15, 0, MAXPOT/15, 0, 1 ); NewModifyProp( &Col_BluePen, w, NULL, mflags, (b * MAXPOT ) / 15, 0, MAXPOT/15, 0, 1 ); } void DispCol( w, idx, colors ) struct Window *w; int idx; UWORD *colors; { char buf[ 50 ]; char *colname, *defval; if( WINVERS_AMIV ) { colname = amiv_colnames[idx].name; defval = amiv_colnames[idx].defval; } else { colname = amii_colnames[idx].name; defval = amii_colnames[idx].defval; } if( colname == NULL ) { colname = "unknown"; defval = "unknown"; } Move( w->RPort, Col_Save.LeftEdge, Col_Save.TopEdge - 7 ); sprintf( buf, "%s=%03x default=%s%s", colname, colors[idx], defval, " "+strlen(colname)+1 ); SetAPen( w->RPort, C_RED ); SetBPen( w->RPort, amii_otherBPen ); SetDrMd( w->RPort, JAM2 ); Text( w->RPort, buf, strlen( buf ) ); } void amii_setpens( int count ) { #ifdef INTUI_NEW_LOOK struct EasyStruct ea = { sizeof( struct EasyStruct ), 0l, "NetHack Request", "Number of pens requested(%ld) not correct", "Use default pens|Use requested pens" }; struct EasyStruct ea2 = { sizeof( struct EasyStruct ), 0l, "NetHack Request", "Number of pens requested(%ld) not\ncompatible with game configuration(%ld)", "Use default pens|Use requested pens" }; #endif /* If the pens in amii_curmap are * more pens than in amii_numcolors, then we choose to ignore * those pens. */ #ifdef INTUI_NEW_LOOK if( IntuitionBase && IntuitionBase->LibNode.lib_Version >= 39 ) { if( count != amii_numcolors ) { long args[2]; args[0] = count; args[1] = amii_numcolors; if( EasyRequest( NULL, &ea2, NULL, args ) == 1 ) { memcpy( flags.amii_curmap, amii_initmap, amii_numcolors*sizeof(amii_initmap[0])); } } } else if( IntuitionBase && IntuitionBase->LibNode.lib_Version >= 37 ) { if( count != amii_numcolors ) { if( EasyRequest( NULL, &ea, NULL, NULL ) == 1 ) { memcpy( flags.amii_curmap, amii_initmap, amii_numcolors*sizeof(amii_initmap[0])); } } } else #endif if( count != amii_numcolors ) { memcpy( flags.amii_curmap, amii_initmap, amii_numcolors*sizeof(amii_initmap[0])); } /* If the pens are set in NetHack.cnf, we can get called before * HackScreen has been opened. */ if( HackScreen != NULL ) { LoadRGB4( &HackScreen->ViewPort, flags.amii_curmap, amii_numcolors ); } } /* Generate a requester for a string value. */ void amii_getlin(prompt,bufp) const char *prompt; char *bufp; { getlind(prompt,bufp,0); } /* and with default */ void getlind(prompt,bufp, dflt) const char *prompt; char *bufp; const char *dflt; { #ifndef TOPL_GETLINE register struct Window *cwin; register struct IntuiMessage *imsg; register long class, code, qual; register int aredone = 0; register struct Gadget *gd; static int once; *StrString = 0; if( dflt ) strcpy( StrString, dflt ); StrWindow.Title = (UBYTE *)prompt; StrWindow.Screen = HackScreen; 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 } if( ( cwin = OpenWindow( (void *)&StrWindow ) ) == NULL ) { return; } while( !aredone ) { WaitPort( cwin->UserPort ); while( ( imsg = (void *) GetMsg( cwin->UserPort ) ) != NULL ) { class = imsg->Class; code = imsg->Code; qual = imsg->Qualifier; gd = (struct Gadget *) imsg->IAddress; switch( class ) { case VANILLAKEY: if( code == '\033' && (qual & (IEQUALIFIER_LALT|IEQUALIFIER_RALT| IEQUALIFIER_LCOMMAND|IEQUALIFIER_RCOMMAND) ) == 0 ) { if( bufp ) { bufp[0]='\033'; bufp[1]=0; } aredone = 1; } else { ActivateGadget( &String, cwin, NULL ); } break; case ACTIVEWINDOW: ActivateGadget( &String, cwin, NULL ); break; case GADGETUP: switch( gd->GadgetID ) { case 2: aredone = 1; if( bufp ) strcpy( bufp, StrString ); break; case 1: if( bufp ) { bufp[0]='\033'; bufp[1]=0; } aredone = 1; break; } break; case CLOSEWINDOW: if( bufp ) { bufp[0]='\033'; bufp[1]=0; } aredone = 1; break; } ReplyMsg( (struct Message *) imsg ); } } CloseWindow( cwin ); #else struct amii_WinDesc *cw; struct Window *w; int colx, ocolx, c; char *obufp; amii_clear_nhwindow( WIN_MESSAGE ); amii_putstr( WIN_MESSAGE, 0, prompt ); cw = amii_wins[ WIN_MESSAGE ]; w = cw->win; ocolx = colx = strlen( prompt ) + 1; obufp = bufp; cursor_on(WIN_MESSAGE); while((c = WindowGetchar()) != EOF) { cursor_off(WIN_MESSAGE); amii_curs( WIN_MESSAGE, colx, 0 ); if(c == '\033') { *obufp = c; obufp[1] = 0; return; } else if(c == '\b') { if(bufp != obufp) { bufp--; amii_curs( WIN_MESSAGE, --colx, 0); Text( w->RPort, "\177 ", 2 ); amii_curs( WIN_MESSAGE, colx, 0); } else DisplayBeep( NULL ); } else if( c == '\n' || c == '\r' ) { *bufp = 0; amii_addtopl( obufp ); return; } else if(' ' <= c && c < '\177') { /* avoid isprint() - some people don't have it ' ' is not always a printing char */ *bufp = c; bufp[1] = 0; Text( w->RPort, bufp, 1 ); Text( w->RPort, "\177", 1 ); if(bufp-obufp < BUFSZ-1 && bufp-obufp < COLNO) { colx++; bufp++; } } else if(c == ('X'-64) || c == '\177') { amii_curs( WIN_MESSAGE, ocolx, 0 ); Text( w->RPort, " ", colx - ocolx ); amii_curs( WIN_MESSAGE, colx = ocolx, 0 ); } else DisplayBeep( NULL ); cursor_on(WIN_MESSAGE); } cursor_off(WIN_MESSAGE); *bufp = 0; #endif } void amii_change_color( pen, val, rev ) int pen, rev; long val; { if( rev ) flags.amii_curmap[ pen ] = ~val; else flags.amii_curmap[ pen ] = val; if( HackScreen ) LoadRGB4( &HackScreen->ViewPort, flags.amii_curmap, amii_numcolors ); } char * amii_get_color_string( ) { int i; char s[ 10 ]; static char buf[ BUFSZ ]; *buf = 0; for( i = 0; i < min(32,amii_numcolors); ++i ) { sprintf( s, "%s%03lx", i ? "/" : "", (long)flags.amii_curmap[ i ] ); strcat( buf, s ); } return( buf ); } slashem-0.0.7E7F3/sys/amiga/amirip.c0000664000076400007640000002162710545462317015205 0ustar aliali/* SCCS Id: @(#)amirip.c 3.2 96/02/04 */ /* Copyright (c) Kenneth Lorber, Bethesda, Maryland 1991,1992,1993,1995,1996. */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" #include #include #include #include #include #include #include #include #include #include #include #include #include "winami.h" #include "windefs.h" #include "winext.h" #include "winproto.h" static struct RastPort *rp; #ifdef AMII_GRAPHICS #undef NULL #define NULL 0 #ifdef AZTEC_C # include #else # ifdef _DCC # include # include # include # include # else # include # include # include # include # endif static char *load_list[]={"tomb.iff",0}; static BitMapHeader tomb_bmhd; static struct BitMap *tbmp[ 1 ] = {0}; static int cols[2]={154,319}; /* X location of center of columns */ static int cno = 0; /* current column */ #define TEXT_TOP (65+yoff) static xoff, yoff; /* image centering */ /* terrible kludge */ /* this is why prototypes should have ONLY types in them! */ # undef red # undef green # undef blue # undef index # ifdef _DCC # include # include # else # include # include # endif #endif /* AZTEC_C */ extern char *killed_by_prefix[]; static struct Window *ripwin=0; static void tomb_text(char*); static void dofade(int,int,int); static int search_cmap(int,int,int); #define STONE_LINE_LEN 13 /* # chars that fit on one line * (note 1 ' ' border) */ #define DEATH_LINE 10 #define YEAR_LINE 15 static unsigned short tomb_line; extern struct amii_DisplayDesc *amiIDisplay; extern struct Screen *HackScreen; extern int havelace; static unsigned short transpalette[ AMII_MAXCOLORS ] = { 0x0000, }; static struct NewWindow newwin = { 0,0,640,200,1,0, MOUSEBUTTONS|VANILLAKEY|NOCAREREFRESH, BORDERLESS|ACTIVATE|SMART_REFRESH, NULL,NULL,(UBYTE*)NULL,NULL,NULL,-1,-1,0xffff,0xffff,CUSTOMSCREEN }; int wh; /* was local in outrip, but needed for SCALE macro */ int cmap_white, cmap_black; void amii_outrip( tmpwin, how ) winid tmpwin; int how; { int just_return = 0; int done, rtxth; struct IntuiMessage *imsg; int i; register char *dpx; char buf[ 200 ]; 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; newwin.Width = amiIDisplay->xpix; newwin.Screen = HackScreen; for( i = 0; i < amii_numcolors; ++i ) flags.amii_curmap[i] = GetRGB4( HackScreen->ViewPort.ColorMap, i ); ripwin = OpenWindow( (void *)&newwin ); if( !ripwin ) goto cleanup; LoadRGB4( &HackScreen->ViewPort, transpalette, amii_numcolors ); rp= ripwin->RPort; 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; #define GENOFF(full,used) ((((full)-(used))/2) & ~7) xoff = GENOFF(ww,tomb_bmhd.w); yoff = GENOFF(wh,tomb_bmhd.h); for(i=0;iBitMap, xoff, yoff, tomb_bmhd.w, tomb_bmhd.h, 0xc0, 0xff, NULL); /* 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; } tw = TextLength(rp,buf,STONE_LINE_LEN) + 40; { char *p=buf; int x, tmp; for(x=STONE_LINE_LEN;x;x--)*p++='W'; *p='\0'; tmp = TextLength(rp,buf,STONE_LINE_LEN) + 40; tw = max( tw, tmp); } /* There are 5 lines of text on the stone. */ rtxth = ripwin->RPort->TxHeight * 5; SetAfPt( rp, (UWORD *)NULL, 0 ); SetDrPt( rp, 0xFFFF ); tomb_line=TEXT_TOP; SetDrMd(rp,JAM1); /* Put name on stone */ Sprintf(buf, "%s", plname); buf[STONE_LINE_LEN] = 0; 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); /* 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 */ for (line=DEATH_LINE, dpx = buf; line 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; tomb_text(dpx); if (tmpchar != ' ') { dpx[i0] = tmpchar; dpx= &dpx[i0]; } else { dpx= &dpx[i0+1]; } } /* Put year on stone */ Sprintf(buf, "%4d", getyear()); tomb_text(buf); #ifdef NH320_DEDICATION /* dedication */ cno = 1; tomb_line=TEXT_TOP; tomb_text("This release"); tomb_text("of NetHack"); tomb_text("is dedicated"); tomb_text("to the"); tomb_text("memory of"); tomb_text(""); tomb_text("Izchak"); tomb_text(" Miller"); tomb_text(""); tomb_text("1935-1994"); tomb_text(""); tomb_text("Ascended"); #endif /* Fade from black to full color */ dofade(0,16,1); /* Flush all messages to avoid typeahead */ while( imsg = (struct IntuiMessage *)GetMsg( ripwin->UserPort ) ) ReplyMsg( (struct Message *) imsg ); done = 0; while( !done ) { WaitPort( ripwin->UserPort ); while( imsg = (struct IntuiMessage *)GetMsg(ripwin->UserPort) ) { switch( imsg->Class ) { case MOUSEBUTTONS: case VANILLAKEY: done = 1; break; } ReplyMsg( (struct Message *)imsg ); } } /* Fade out */ dofade(16,0,-1); just_return = 1; cleanup: /* free everything */ if(ripwin){ Forbid(); while( imsg = (struct IntuiMessage *)GetMsg( ripwin->UserPort ) ) ReplyMsg( (struct Message *)imsg ); CloseWindow( ripwin ); Permit(); } LoadRGB4( &HackScreen->ViewPort, flags.amii_curmap, amii_numcolors ); if(tbmp[0])FreeImageFiles(load_list, tbmp); if(just_return) return; /* fall back to the straight-ASCII version */ genl_outrip(tmpwin, how); } static void tomb_text(p) char *p; { char buf[STONE_LINE_LEN*2]; int l; tomb_line += rp->TxHeight; if( !*p ) return; sprintf(buf," %s ",p); l=TextLength(rp,buf,strlen(buf)); SetAPen(rp,cmap_white); Move(rp,cols[cno]-(l/2)-1, tomb_line); Text(rp,buf,strlen(buf)); SetAPen(rp,cmap_white); Move(rp,cols[cno]-(l/2)+1, tomb_line); Text(rp,buf,strlen(buf)); SetAPen(rp,cmap_white); Move(rp,cols[cno]-(l/2), tomb_line-1); Text(rp,buf,strlen(buf)); SetAPen(rp,cmap_white); Move(rp,cols[cno]-(l/2), tomb_line+1); Text(rp,buf,strlen(buf)); SetAPen(rp,cmap_black); Move(rp,cols[cno]-(l/2), tomb_line); Text(rp,buf,strlen(buf)); } /* search colormap for best match to given color */ static int search_cmap(int r0, int g0, int b0){ int best = 0; int bdiff = 0x0fffffff; int x; for(x=0;x> 8) & 15); int g = g0-((amiv_init_map[x] >> 4) & 15); int b = b0-((amiv_init_map[x] ) & 15); int diff = (r*r) + (g*g) + (b*b); if(diff> 8; g = ( amiv_init_map[ j ] & 0xf0 ) >> 4; b = ( amiv_init_map[ j ] & 0xf ); r = ( r * i ) / 16; g = ( g * i ) / 16; b = ( b * i ) / 16; transpalette[ j ] = ((r<<8)|(g<<4)|b); } LoadRGB4( &HackScreen->ViewPort, transpalette, amii_numcolors ); Delay( 1 ); } } #endif /* AMII_GRAPHICS */ /* TODO: memory leaks fix ReadImageFiles to return error instead of panic on error */ slashem-0.0.7E7F3/sys/amiga/Build.ami0000664000076400007640000001605410545462317015305 0ustar aliali Compiling Amiga NetHack 3.4 Last Revision: 21 February 2002 for NetHack 3.4.2 We would like to thank each and every one of the people who took the time and effort to report bugs to us. THANK YOU! (And keep up the good work!) I. Introduction The Amiga-specific documentation has been split since the 3.1.3 release - please read the file Install.ami for information specific to the Amiga port before continuing. If you have problems with compilation, installation, or think you have found a bug in the game, please report it by electronic mail to the development group at nethack-bugs@nethack.org, where it will be routed to the appropriate person. Include your configuration, the version of NetHack you are playing (use the 'v' command or see include/patchlevel.h), and as much specific information as possible. As NetHack runs on many different machines, be sure to mention that you are playing the Amiga version and also mention if you are using the version for mc68k or ppc. If you want to find out about distributing NetHack, read the license (in NetHack:license or type ?i during the game). II. Compiling Amiga NetHack 3.4 II.A. Compilation Overview Compiling NetHack is not very hard - basically you do a little configuration and start make. It does, however, require a good amount of disk space and time. It also needs a good bit of memory, especially for linking. II.B. Basic Compilation NetHack can be built with SAS/C version 6.5x. The commercial version of DICE might work, but NetHack version 3.2.2 or later haven't been compiled with it. The "official" compiler for NetHack 3.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 and what files are shared with what computers; everything in the sys/amiga directory is used exclusively by the Amiga. The makefile (sys/amiga/Makefile.ami) depends on certain assignments, providing the developer with a fairly flexible environment. See sys/amiga/Makefile.ami for assignment assumptions. DICE users should see section II.B.3 for information on creating a DMakefile usable with DMake. Edit config.h to your liking and system configuration. The defaults should be satisfactory for most systems. Read VERY CAREFULLY through the Makefile to familiarize yourself with which assignments are assumed. Otherwise, you're going to get something like "Insert NH: in any drive." You will need uudecode, and, if you need to modify dgn_comp or lev_comp, flex, and bison. The first thing Makefile.ami does is build makedefs, which handles a variety of data file generation, and then lev_comp and dgn_comp which compile the special levels. Makedefs will then be run to create a few files, followed by a roughly alphabetically sorted compilation of the entire source tree. This process will compile selected files from the sys/amiga, sys/share, win/tty, and src directories, eventually creating sbin/nethack. After building the main binary, a make install will build the auxiliary files including help files, special levels, icons, and the font files and will put these files into their final positions - most will be in dlb archives (if DLB was defined in config.h). The first make run should be done in NH:obj and the make install should be done in NetHack:; for both runs, the makefile is NH:sys/amiga/Makefile.ami (or NH:sys/amiga/DMakefile for DMake and NH:sys/amiga/Makefile.agc for gcc). Note that not all the source is simple C code. If you are modifying lev_comp or dgn_comp you may need bison and/or flex (depending on what modifications you are making). You do not need any of these tools to simply build NetHack - all the C output files are provided in the source distribution. Also, the ifchange script requires a version of diff that produces standard Unix format context diffs for proper operation - the version shipped with SAS/C is not sufficient. If you do not have bison and flex, copy the files from sys/share. The include files go in include/ and the C files go in util/. If the compile fails due to prototype errors for malloc and realloc, try deleting the first line of lev_comp.c and dgn_comp.c. II.B.2. Compiling NetHack with SAS/C version 6.58 NOTE WELL - Amiga NetHack has dropped support for SAS/C version 5. This version of NetHack was developed with SAS/C 6.58. Earlier versions than version of the compiler are known to cause problems - don't use them. A couple of notes and warnings from the SAS/C users on the team: * Included in the SAS/C port is code for generating a SnapShot.tb file upon catching various internal disasters. That is why the debug=l flag is in the makefile. This adds about 270K to the disk image, but it does not increase the run time memory requirements. * The 5.10b optimizer did not produce correct code for NetHack. The current optimizer has not been tested. II.B.3. Compiling NetHack with the commercial version of DICE IMPORTANT NOTE: If you are using DMake, you need to create DMakefile from Makefile.ami. Do the following: cd NH:sys/amiga edit from Makefile.ami to DMakefile with mkdmake opt w255 Some versions of DMake have been known to crash horribly on the makefile - if this happens, you'll need to download another make utility, such as AMake (ftp://ftp.dragonfire.net/amiga/utils/amake), which will run in DMake-compatibility mode if invoked with the -C switch (e.g. "amake -C -f NH:sys/amiga/DMakefile", or just "alias dmake amake -C"). SECOND IMPORTANT NOTE: The score list is currently disabled when compiling under DICE, due to an as-yet-unknown problem which causes system crashes when displaying the score list. NetHack can be compiled using the commercial version of DICE only. The registered shareware version had a bug in it which resulted in odd- aligned procedures. (It is possible to patch DC1 to fix this problem; however, this is not recommended, and you should upgrade to the commercial version.) DICE 3.0 (the first commercial release) has a couple of bugs in it which turn up in several of the NetHack sources; the DCC30_BUG define fixes them. If you have a more recent version of the compiler, you may be able to compile without this (and get slightly more efficient code) by commenting out the define in amiconf.h. During compilation, DICE will output a lot of warnings; they can be safely ignored. slashem-0.0.7E7F3/sys/amiga/txt2iff.c0000664000076400007640000002415210545462317015306 0ustar aliali/* SCCS Id: @(#)txt2iff.c 3.2 95/07/28 */ /* Copyright (c) 1995 by Gregg Wonderly, Naperville, Illinois */ /* NetHack may be freely redistributed. See license for details. */ #include #include "config.h" #include "tile.h" #include #include #include #include #include #include #include #include #include #include #ifndef _DCC # include # include # include #endif void panic(const char *); void map_colors(void); int BestMatch(int, int, int); extern pixval ColorMap[3][MAXCOLORMAPSIZE]; extern int colorsinmap; /* * WARNING: * This program carries forth the assumption that the colormaps in all * of the .txt files are the same. This is a bug. */ struct { int Height; int Width; } IFFScreen; /* * We are using a hybrid form of our own design which we call a BMAP (for * bitmap) form. It is an ILBM with the bitmaps already deinterleaved, * completely uncompressed. * This speeds the loading of the images from the games point of view because it * does not have to deinterleave and uncompress them. */ #define ID_BMAP MAKE_ID( 'B', 'M', 'A', 'P' ) /* instead of ILBM */ #define ID_BMHD MAKE_ID( 'B', 'M', 'H', 'D' ) /* Same as ILBM */ #define ID_CAMG MAKE_ID( 'C', 'A', 'M', 'G' ) /* Same as ILBM */ #define ID_CMAP MAKE_ID( 'C', 'M', 'A', 'P' ) /* Same as ILBM */ #define ID_PDAT MAKE_ID( 'P', 'D', 'A', 'T' ) /* Extra data describing plane * size due to graphics.library * rounding requirements. */ #define ID_PLNE MAKE_ID( 'P', 'L', 'N', 'E' ) /* The planes of the image */ #ifndef _DCC extern #endif struct Library *IFFParseBase; int nplanes; /* BMHD from IFF documentation */ typedef struct { UWORD w, h; WORD x, y; UBYTE nPlanes; UBYTE masking; UBYTE compression; UBYTE reserved1; UWORD transparentColor; UBYTE xAspect, yAspect; WORD pageWidth, pageHeight; } BitMapHeader; typedef struct { UBYTE r, g, b; } AmiColorMap; pixel pixels[TILE_Y][TILE_X]; AmiColorMap *cmap; int findcolor( register pixel *pix ); void packwritebody( pixel (*tile)[TILE_X], char **planes, int tileno ); void error( char *str ) { fprintf( stderr, "ERROR: %s\n", str ); } /* * This array maps the image colors to the amiga's first 16 colors. The colors * are reordered to help with maintaining dripen settings. */ int colrmap[] = { 0, 6, 9, 15, 4, 10, 2, 3, 5, 11, 7, 13, 8, 1, 14, 12 }; /* How many tiles fit across and down. */ #define COLS 20 #define ROWS ((tiles + COLS-1) / COLS) main( int argc, char **argv ) { int colors; struct { long nplanes; long pbytes; long across; long down; long npics; long xsize; long ysize; } pdat; long pbytes; /* Bytes of data in a plane */ int i, cnt; BitMapHeader bmhd; struct IFFHandle *iff; long camg = HIRES|LACE; int tiles=0; char **planes; if(argc != 3){ fprintf(stderr, "Usage: %s source destination\n", argv[0]); exit(1); } #if defined(_DCC) || defined(__GNUC__) IFFParseBase = OpenLibrary( "iffparse.library", 0 ); if( !IFFParseBase ) { error( "unable to open iffparse.library" ); exit( 1 ); } #endif /* First, count the files in the file */ if( fopen_text_file( argv[1], "r" ) != TRUE ) { perror( argv[1] ); return( 1 ); } nplanes = 0; i = colorsinmap-1; /*IFFScreen.Colors - 1; */ while( i != 0 ) { nplanes++; i >>= 1; } planes = malloc( nplanes * sizeof( char * ) ); if( planes == 0 ) { error( "can not allocate planes pointer" ); exit( 1 ); } while( read_text_tile( pixels ) == TRUE ) ++tiles; fclose_text_file(); IFFScreen.Width = COLS * TILE_X; IFFScreen.Height = ROWS * TILE_Y; pbytes = (COLS * ROWS * TILE_X + 15) / 16 * 2 * TILE_Y; for( i = 0; i < nplanes; ++i ) { planes[ i ] = calloc( 1, pbytes ); if( planes[ i ] == 0 ) { error( "can not allocate planes pointer" ); exit( 1 ); } } /* Now, process it */ if( fopen_text_file( argv[1], "r" ) != TRUE ) { perror( argv[1] ); return( 1 ); } iff = AllocIFF(); if( !iff ) { error( "Can not allocate IFFHandle" ); return( 1 ); } iff->iff_Stream = Open( argv[2], MODE_NEWFILE ); if( !iff->iff_Stream ) { error( "Can not open output file" ); return( 1 ); } InitIFFasDOS( iff ); OpenIFF( iff, IFFF_WRITE ); PushChunk( iff, ID_BMAP, ID_FORM, IFFSIZE_UNKNOWN ); bmhd.w = IFFScreen.Width; bmhd.h = IFFScreen.Height; bmhd.x = 0; bmhd.y = 0; bmhd.nPlanes = nplanes; bmhd.masking = 0; bmhd.compression = 0; bmhd.reserved1 = 0; bmhd.transparentColor = 0; bmhd.xAspect = 100; bmhd.yAspect = 100; bmhd.pageWidth = TILE_X; bmhd.pageHeight = TILE_Y; PushChunk( iff, ID_BMAP, ID_BMHD, sizeof( bmhd ) ); WriteChunkBytes( iff, &bmhd, sizeof( bmhd ) ); PopChunk( iff ); PushChunk( iff, ID_BMAP, ID_CAMG, sizeof( camg ) ); WriteChunkBytes( iff, &camg, sizeof( camg ) ); PopChunk( iff ); /* We need to reorder the colors to get reasonable default pens but * we also need to know where some of the colors are - so go find out. */ map_colors(); cmap = malloc( (colors = (1L<iff_Stream ); FreeIFF( iff ); printf( "\n%d tiles converted\n", cnt ); #if defined(_DCC) || defined(__GNUC__) CloseLibrary( IFFParseBase ); #endif exit( 0 ); } findcolor( register pixel *pix ) { register int i; for( i = 0; i < MAXCOLORMAPSIZE; ++i ) { if( (pix->r == ColorMap[ CM_RED ][i] ) && (pix->g == ColorMap[ CM_GREEN ][i] ) && (pix->b == ColorMap[ CM_BLUE ][i] ) ) { return( i ); } } return( -1 ); } void packwritebody( pixel (*tile)[TILE_X], char **planes, int tileno ) { register int i, j, k, col; register char *buf; register int across, rowbytes, xoff, yoff; /* how many tiles fit across? */ across = COLS; /* How many bytes per pixel row */ rowbytes = ((IFFScreen.Width + 15)/16)*2; /* How many bytes to account for y distance in planes */ yoff = ((tileno / across) * TILE_Y) * rowbytes; /* How many bytes to account for x distance in planes */ xoff = (tileno % across) * (TILE_X/8); /* For each row... */ for( i = 0; i < TILE_Y; ++i ) { /* For each bitplane... */ for( k = 0; k < nplanes; ++k ) { const int mask = 1l< rate){ bestrate = rate; bestslot = x; } } #ifdef DBG printf("map (%d,%d,%d) -> %d (error=%d)\n",r,g,b,bestslot,bestrate); #endif return bestslot; } long * alloc( unsigned int n ) { long *ret = malloc( n ); if(!ret){ error("Can't allocate memory"); exit(1); } return( ret ); } void panic(const char *msg){ fprintf(stderr,"PANIC: %s\n",msg); exit(1); } slashem-0.0.7E7F3/sys/amiga/amidos.p0000664000076400007640000000221210545462317015202 0ustar aliali/* SCCS Id: @(#)amidos.p 3.1 93/01/08 /* Copyright (c) Kenneth Lorber, Bethesda, Maryland, 1992, 1993. */ /* NetHack may be freely redistributed. See license for details. */ /* amidos.c */ void NDECL(flushout ); #ifndef getuid int NDECL(getuid ); #endif #ifndef getpid int NDECL(getpid ); #endif #ifndef getlogin char *NDECL(getlogin ); #endif #ifndef abs int FDECL(abs, (int )); #endif int NDECL(tgetch ); int NDECL(dosh ); long FDECL(freediskspace, (char *)); long FDECL(filesize, (char *)); void FDECL(eraseall, (const char * , const char *)); char *FDECL(CopyFile, (const char * , const char *)); void FDECL(copybones, (int )); void NDECL(playwoRAMdisk ); int FDECL(saveDiskPrompt, (int )); void NDECL(gameDiskPrompt ); void FDECL(append_slash, (char *)); void FDECL(getreturn, (const char *)); #ifndef msmsg void FDECL(msmsg, ( const char *, ... )); #endif #if !defined(__SASC_60) && !defined(_DCC) int FDECL(chdir, (char *)); #endif #ifndef strcmpi int FDECL(strcmpi, (char * , char *)); #endif #if !defined(memcmp) && !defined(AZTEC_C) && !defined(_DCC) && !defined(__GNUC__) int FDECL(memcmp, (unsigned char * , unsigned char * , int )); #endif slashem-0.0.7E7F3/sys/amiga/amifont8.uu0000664000076400007640000000664210545462317015660 0ustar alialibegin 644 8 M```#\P`````````!``````````````)E```#Z0```F5P_TYU```````````, M`````!H/@``!``````````````````````````````````````````!&140` M```````````,`````!H`````"20`"`!```@`!@`!```@_P```&X`M```!@X` M```````````8;&P8`#@8##````````,\&#P\''X?G MYVH```!J:A@````8&!@``!@88L!6`%96```8`!@8`*@5P8.BP:@5YP/_[W_^ M````P,```P`\;&P^QFP8&!AF&`````9F.&9F/&`P9F9F&!@8`!AFQCQF9FQF M9F9F&`9F8,;F;&9L9F9:9L/&9L/&,&`,.``8`&``!@`V`&```&`8```````` M`!@````````8&!B<,Z6BH:&EI*2AI:6EI*2AI*3__\,8`&:DH:6EI:2DH:2D MI58```!65CP````8&!@``!@\96-J`&IJ```8`!@8UB/$`\`C+"O4A`/_]Y_Y M````P,```P`\`/Y@S&@P,`P\&`````QN&`8&;'Q@!F9F&!@P?@P&WCQFP&9@ M8,!F&`9L8.[VQF;&9G`89F;&/&:,,#`,;``,/&P\-CPP.VPX!F889GP\W#WL M/CYF9F-C9GX8&!@`S.7BY^?GY^?AY^?GY^3GY^?_`.<8`,/GX>?GY^?DY^?G MY6K_#_!KZCP````8&!@``!AF8#97_];7`&8<`#@\;&I6)F1I/&F6YP./]]_[ M#__PP,```P`8`&P\&'8`,`S_?@!^`!A^&!P,Y^&`9X8/[>QGS&?#@89F;6&#P8,!@,Q@``!G9F;F9X9G88!FP8=V9F9F9V M8!AF9FLV9DQP&`X`,Z6BI*&AH:6AI:&EI:2EI*3_`.<8_P`E(24A)24D)20D MI595/5Q55F;_#_`/\/\``-O#?AMJ5:JJ```?__C_JIPY:];X*]I;A`-F[\_S M.``,/\//C^ M\#YF?CSF_L;&./`\XSP\/AC&PSS^/`,\````.SP\.SQXQN8\9N8\8V8\8`;P M?`P[ C&'X.&'``S`````````````````````#__\,8`&8````````````` M`&H`:VH``,,`&!@``!B<&#P89F-6:E8``&88&!@`K`/`(\0L(T&"``/_W_F? MP``#P````````````````````#```````````````````#`````````````` M```````````````&`````````````````/X`````````?```/```````\`<` M````````<```````,P````````````````````#__\,8`&8````````````` M`%8`5E8`````&!@``!@``!@8`,!J5FH````8&!@``,&#J!7!HL&#``/_[_Y_ MP``#P`````````@`"``(`!``"``8``@`(``(`"@`"``P``@`.``(`$``"`!( M``@`4``(`%@`"`!@``@`:``(`'``"`!X``@`@``(`(@`"`"0``@`F``(`*`` M"`"H``@`L``(`+@`"`#```@`R``(`-``"`#8``@`X``(`.@`"`#P``@`^``( M`0``"`$(``@!$``(`1@`"`$@``@!*``(`3``"`$X``@!0``(`4@`"`%0``@! M6``(`6``"`%H``@!<``(`7@`"`&```@!B``(`9``"`&8``@!H``(`:@`"`&P M``@!N``(`<``"`'(``@!T``(`=@`"`'@``@!Z``(`?``"`'X``@"```(`@@` M"`(0``@"&``(`B``"`(H``@",``(`C@`"`)```@"2``(`E``"`)8``@"8``( M`F@`"`)P``@">``(`H``"`*(``@"D``(`I@`"`*@``@"J``(`K``"`*X``@" MP``(`L@`"`+0``@"V``(`N``"`+H``@"\``(`O@`"`,```@#"``(`Q``"`,8 M``@#(``(`R@`"`,P``@#.``(`T``"`-(``@#4``(`U@`"`-@``@#:``(`W`` M"`-X``@#@``(`X@`"`.0``@#F``(`Z``"`.H``@#L``(`[@`"`/```@#R``( M`]``"`/8``@#X``(`^@`"`/P``@#^``(!```"``(``@`$``(`!@`"``@``@` M*``(`#``"``X``@`0``(`$@`"`!0``@`6``(`&``"`!H``@`<``(`'@`"`"` M``@`B``(`)``"`"8``@`H``(`*@`"`"P``@`N``(`,``"`#(``@`T``(`-@` M"`#@``@`Z``(`/``"`#X``@$"``(!!``"`08``@$(``(!"@`"`0P``@#J``( M!#@`"`.8``@$0``(!$@`"`10``@$6``(!&``"`1H``@$<``(!'@`"`2```@$ MB``(!)``"`28``@$H``(!*@`"`2P``@$N``(!,``"`3(``@!V``(`>``"`'H M``@!\``(`?@`"`(```@$T``(!-@`"`3@``@$Z``(!/``"`3X``@%```(!0@` M"`40``@%&``(!2``"`4H``@%,``(!3@`"`5```@%2``(!5``"`58``@%8``( M!6@`"`5P``@%>``(!8``"`6(``@%D``(!9@`"`+8``@"X``(`N@`"`+P``@" M^``(````"``````#[`````0`````````#@```$0```!<````8@````````/R ` end slashem-0.0.7E7F3/sys/amiga/winami.p0000664000076400007640000000473210545462317015223 0ustar aliali/* SCCS Id: @(#)winami.p 3.1 93/01/08 */ /* Copyright (c) Gregg Wonderly, Naperville, IL, 1992, 1993 */ /* NetHack may be freely redistributed. See license for details. */ /* winami.c */ void FDECL(amii_raw_print, (const char *)); void FDECL(amii_raw_print_bold, (const char *)); void FDECL(amii_start_menu, (winid )); void FDECL(amii_add_menu, (winid , char , int , const char *)); void FDECL(amii_end_menu, (winid , char , const char * , const char *)); char FDECL(amii_select_menu, (winid )); void NDECL(amii_update_inventory ); void NDECL(amii_mark_synch ); void NDECL(amii_wait_synch ); void NDECL(amii_setclipped ); void FDECL(amii_cliparound, (int , int )); void NDECL(amii_askname ); void NDECL(amii_player_selection ); void NDECL(flush_output ); void FDECL(amii_destroy_nhwindow, (winid )); int FDECL(amii_create_nhwindow, (int )); void NDECL(amii_init_nhwindows ); int NDECL(amii_get_ext_cmd); char FDECL(amii_yn_function, (const char * , const char * , char )); void FDECL(amii_addtopl, (const char *)); void FDECL(TextSpaces, (struct RastPort * , int )); void FDECL(amii_putstr, (winid , int , const char *)); void FDECL(amii_putsym, (winid , int , int , CHAR_P )); void FDECL(amii_clear_nhwindow, (winid )); void FDECL(amii_exit_nhwindows, (const char *)); int FDECL(amii_nh_poskey, (int * , int * , int *)); int NDECL(amii_nhgetch ); void NDECL(amii_get_nh_event ); void NDECL(amii_remember_topl ); int NDECL(amii_doprev_message ); void FDECL(amii_display_nhwindow, (winid , boolean )); void FDECL(amii_display_file, (const char * , boolean )); void FDECL(amii_curs, (winid , int , int )); void FDECL(amii_print_glyph, (winid , xchar , xchar , int )); void FDECL(DoMenuScroll, (int , int )); void FDECL(DisplayData, (int , int , int )); void FDECL(SetPropInfo, (struct Window * , struct Gadget * , long , long , long )); void FDECL(kill_nhwindows, (int )); void FDECL(amii_cl_end, (struct amii_WinDesc * , int )); void FDECL(cursor_off, (winid )); void FDECL(cursor_on, (winid )); void NDECL(amii_getret ); void FDECL(amii_getlin, (const char * , char *)); void FDECL(getlind, (const char * , char * , const char *)); void FDECL(amii_suspend_nhwindows, (char * )); void NDECL(amii_resume_nhwindows); void NDECL(amii_bell); void NDECL(EditColor); void FDECL(DrawCol, ( struct Window *, int, UWORD * ) ); void FDECL( DispCol, ( struct Window *w, int idx, UWORD * ) ); void FDECL( SetBorder, (struct Gadget *) ); void NDECL( port_help ); void FDECL( dismiss_nhwindow, (winid) ); slashem-0.0.7E7F3/sys/amiga/amii.hlp0000664000076400007640000000244010545462317015174 0ustar aliali 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 which are either specific to the Amiga port or might not appear in other ports. While playing NetHack you can press: ALT-HELP Color requestor. CTL-HELP Scale display (amitile only). SHIFT-HELP Overview window (amitile only). Amiga-specific run-time options: altmeta use the alt keys as meta keys flush throw away keyboard type-ahead Command line options recognized are -n No News at game startup. -X Play in discovery mode. -D Play in debug mode. -L Interlaced screen. -l Never Interlaced screen. -u Play as player given as an argument. -r Pick a race given as an argument. -p Pick a profession given as an argument -? Gives command line usage. slashem-0.0.7E7F3/sys/amiga/Install.ami0000664000076400007640000002223010545462317015645 0ustar aliali 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.2 0. Pre-intro for NetHack 3.4.2: Amiga-specific changes for 3.4.2: Most (around 99%) known bugs fixed (volunteers welcome). HackWB and HackCli are no longer supported. Use the main binary. We would like to thank each and every one of the people who took the time and effort to report bugs to us. THANK YOU! I. Introduction I.A. Overview Welcome to Amiga NetHack! If this is your first visit to our fair city, you are in for an amazing but dangerous journey; if you have visited us before, beware! the city has changed in many strange and subtle ways; it has also grown quite a bit. This missive brings to light those mundane tasks which must be dealt with before beginning your journey; for those of you who are faced with the task of installing the pre-fabricated version of our town, section III (Installing Amiga NetHack 3.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. [Those responsible for the previous paragraphs have been sacked. The documentation has been completed at great expense in a more traditional style. -- The Management] I.B. Getting Help If you have questions about strategy, weapons, or monsters, the best place to go for help is the Usenet newsgroup rec.games.roguelike.nethack. If you have problems with installation or think you have found a bug in the game, please report it by electronic mail to the development team at nethack-bugs@nethack.org, where it will be routed to the appropriate person. Include your configuration, the version of NetHack you are playing (use the 'v' command), whether or not you are using an official binary release (and if so which one) and as much specific information as possible. As NetHack runs on many different machines, be sure to mention that you are playing the Amiga version. I.C. Credits Olaf Seibert first ported NetHack 2.3 and 3.0 to the Amiga. Richard Addison, Andrew Church, Jochen Erwied, Mark Gooderum, Ken Lorber, Greg Olson, Mike Passaretti, and Gregg Wonderly polished and extended the 3.0 and 3.1 ports. Andrew Church, Ken Lorber, and Gregg Wonderly are responsible for the 3.2 port. Janne Salmijärvi resurrected the amigaport for 3.3 and Teemu Suikki joined before 3.4.0. II. Using Amiga NetHack 3.4 Run NetHack from the shell or from some tool that allows that, ie. ToolManager. See the NetHack.txt file for command line options and other usage. II.A. Sources of Information Where to go depends on what you want to find out. If you want to find out about distributing NetHack, read the license (in NetHack:license or type ?i during the game). For an introduction to NetHack, read the GuideBook file. To find out what options are compiled into your copy of NetHack, type #v during the game. Finally, for information during the game on all kinds of things, type ? and select from the menu or by pressing Help key. II.B. The Amiga NetHack WorkBench Front End Starting from 3.3.0 HackWB is not supported. II.C. The Amiga NetHack CLI Front End Starting from 3.3.0 CLI Front end is not supported either. Instead, use the main binary. See NetHack.txt file for the standard Unix flags for NetHack. In addition to those flags, Amiga NetHack accepts the flags -l to force non-interlaced mode and -L to force interlaced mode. II.D. Amiga-Specific Information for NetHack There are several options that are unique to the Amiga version of NetHack that may be specified in the NetHack.cnf file or on an OPTIONS line: altmeta allows the ALT keys to function as META keys. The default is altmeta. flush flush discards all characters in the queue except the first, which limits typeahead accidents. The default is !flush. silent turn off the audio output. The default is silent. The current version of Amiga NetHack also supports menu accelerators. See Guidebook.txt for a detailed description. Also supported is selecting the number of stacked objects to drop, used with the (D)rop command. Type the number and then select an item (or items with accelerators). Items with a count associated with them are denoted with # in place of -. I.e. 'd - 3 blessed daggers' becomes 'd # 3 blessed daggers'. You can clear the count by hitting esc while counting or deselect and reselect the item. The default is to drop all selected items (as before). For other options how to configure the screen setting and colors refer to Nethack.cnf. III. Installing Amiga NetHack 3.4 III.A. General Installation Installation should be easy - basically it consists of putting files where they belong and adding an assign to your startup. If you are installing from the official binary distribution, simply unpacking the archive in the appropriate directory will put the files in the places they belong. IF YOU ALREADY HAVE A PREVIOUS VERSION INSTALLED YOU MUST DELETE THE OLD SAVE AND BONES FILES - THEY WILL NOT WORK! This includes save and bones files from all previous versions of NetHack (yes, even 3.3.1). If you have a game in progress and want to finish it, use your current version and then update. Will NetHack fit on your machine? NetHack 3.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). > Mass storage: A hard drive with over 3 meg of free space is highly recommended. Hard Disk Installation: Unpack the archive to your place of choice. Since you are reading this you've probably done that already. Now just assign NetHack: to NetHack directory containing the executable and datafiles and other needed directories. Use the table in the next section to see where things should end up. Be sure that the file 8 ends up in NetHack:hack/8. Configuration Using your favorite text editor, edit NetHack:NetHack.cnf to match your system. Create the save file directory (makedir NetHack:save) and the levels file directory (makedir NetHack:levels), if they don't already exist. Create the score file (echo to NetHack:record) and, if desired, the log file (echo to NetHack:logfile), if they don't already exist. You may leave out logfile, but record is needed. III.B. File Location Table NetHack: amii.hlp Guidebook.txt hack.font license NetHack NetHack.cnf NetHack.txt nhdat nhsdat record Recover Recover.txt logfile (optional, but useful) NetHack:hack 8 NetHack:tiles monsters.iff objects.iff other.iff IV. BBS Interface [Since HackCli and split binary is no longer supported the following probably doesn't apply anymore. Due to lack of a suitable environment it is also untested.] The BBS mode is based on the standard NetHack tty port and is designed for use in a BBS setting - it is specifically not recommended for use on the console. The current TTY mode has changed significantly since the preliminary version released with 3.1.2. In particular, BBS mode now works with split binaries (only), and now supports multiple games in progress at the same time for multi-line boards (note however that any individual user should not be allowed to run two instances of NetHack at the same time). To set up NetHack for use with a BBS, set OPTIONS=windowtype:tty and unset DUNGEONS, TRAPS, and EFFECTS in NetHack.cnf. Configure the BBS to expect I/O through stdin and stdout, and have NetHack invoked as: HackCLI :uid -u uname options... where uid is any string (without embedded spaces, colons, or slashes) that is unique for each BBS user and uname is some corresponding human- readable name for that user. Uid is used in constructing file names to prevent collisions between simultaneous games and to prevent people from using other people's save files. Uname is the name the character will have in the game and the name that will appear in the record file. The terminal is assumed to be a 24x80 ANSI-compatible terminal. The present version does not deal with situations such as low memory gracefully - as NetHack uses a considerable amount of memory this is particularly painful with multiple games in progress. Sysops are reminded to be familiar with the recover utility, which may be needed from time to time and which should probably not be available directly to users. Bug reports and suggestions for improvements are requested from the user community - this is still considered alpha software. slashem-0.0.7E7F3/sys/be/0000775000076400007640000000000010545462317013060 5ustar alialislashem-0.0.7E7F3/sys/be/README0000664000076400007640000000473410545462317013750 0ustar alialiThis file is sys/be/README. It is for those intending to compile NetHack 3.3 on a BeOS 4.5 system. BeOS NetHack currently only supports the TTY windowing system. In order to compile it, it would benefit you greatly to think of your Be system as a UNIX variant. It is possible to compile using BeIDE. However, there are four executables and several steps involved in making NetHack. Unless you are extremely familiar with the build sequence and are willing to modify the code somewhat, I suggest you avoid it for now. Let the UNIX Makefiles take care of all that for you. Known problems: + No special characters for walls. None of the fonts available for use in a tty window has the graphics characters needed to improve the look. If such a font existed, then all you need to do is set the dungeon, object, and/or monter mappings in your defaults file. + The arrow keys don't work. Build instructions. From a freshly unpacked source tree: 1. Copy the Makfiles in sys/unix to their proper spots. You may use setup.sh or copy them by hand. Using setup.sh to create links instead of copying the Makefiles will work, but BeOS will not let you edit a link. It may be helpful to read sys/unix/Install.unx. 2. Edit src/Makefile: o Change System to SysBe. o Comment out the UNIX versions of SYSSRC and SYSOBJ variables. o Uncomment the BeOS versions of SYSRC and SYSOBJ. o Uncomment the BeOS versions of CC, CFLAGS, LD, and LFLAGS. The flags are different for Intel vs BeBox/Mac. o Uncomment one of the Intel or BeBox/Mac BeOS versions of CC, CFLAGS, LD, and LFLAGS. o Comment out the default CFLAGS and LFLAGS. o Change WINTTYLIB to be -ltermcap. 3. Edit util/Makefile: o If on a BeBox/Mac: - Uncomment the BeOS versions of CC and CFLAGS - Comment out the default CFLAGS and LFLAGS. o If on Intel: - the default values of CFLAGS and LFLAGS work fine o Change YACC and LEX to be bison -y and flex respectively. 4. Edit include/config.h to change HACKDIR to be the location of your install directory. 5. Edit top level Makefile and change GAMEDIR to match HACKDIR in include/config.h. Make sure the path to GAMEDIR exists. Change SHELLDIR to a "throw away" directory, like /tmp. We don't use the shell. Change CHOWN and CHGRP commands to "true", there really aren't groups on the BeOS. 6. Type "make install" at the top level. It is possible that some necessary steps needed to make the game have been omitted. Feel free to ad-lib as necessary. slashem-0.0.7E7F3/sys/be/bemain.c0000664000076400007640000001377410545462317014473 0ustar aliali/* SCCS Id: @(#)bemain.c 3.4 1998/07/15 */ /* Copyright (c) Dean Luick, 1996. */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" #include "dlb.h" #include static void whoami(void); static void process_options(int argc, char **argv); static void chdirx(const char *dir); static void getlock(void); #ifdef __begui__ #define MAIN nhmain int nhmain(int argc, char **argv); #else #define MAIN main #endif int MAIN(int argc, char **argv) { int fd; char *dir; dir = nh_getenv("NETHACKDIR"); if (!dir) dir = nh_getenv("HACKDIR"); choose_windows(DEFAULT_WINDOW_SYS); chdirx(dir); initoptions(); init_nhwindows(&argc, argv); whoami(); /* * It seems you really want to play. */ u.uhp = 1; /* prevent RIP on early quits */ process_options(argc, argv); /* command line options */ #ifdef WIZARD if (wizard) Strcpy(plname, "wizard"); else #endif if(!*plname || !strncmp(plname, "player", 4) || !strncmp(plname, "games", 4)) askname(); plnamesuffix(); /* strip suffix from name; calls askname() */ /* again if suffix was whole name */ /* accepts any suffix */ Sprintf(lock,"%d%s", getuid(), plname); getlock(); dlb_init(); /* must be before newgame() */ /* * Initialization of the boundaries of the mazes * Both boundaries have to be even. */ x_maze_max = COLNO-1; if (x_maze_max % 2) x_maze_max--; y_maze_max = ROWNO-1; if (y_maze_max % 2) y_maze_max--; /* * Initialize the vision system. This must be before mklev() on a * new game or before a level restore on a saved game. */ vision_init(); display_gamewindows(); if ((fd = restore_saved_game()) >= 0) { #ifdef WIZARD /* Since wizard is actually flags.debug, restoring might * overwrite it. */ boolean remember_wiz_mode = wizard; #endif #ifdef NEWS if(iflags.news) { display_file(NEWS, FALSE); iflags.news = FALSE; /* in case dorecover() fails */ } #endif pline("Restoring save file..."); mark_synch(); /* flush output */ if(!dorecover(fd)) goto not_recovered; #ifdef WIZARD if(!wizard && remember_wiz_mode) wizard = TRUE; #endif check_special_room(FALSE); if (discover) You("are in non-scoring discovery mode."); if (discover || wizard) { if(yn("Do you want to keep the save file?") == 'n') (void) delete_savefile(); else { compress(fqname(SAVEF, SAVEPREFIX, 0)); } } flags.move = 0; } else { not_recovered: player_selection(); newgame(); if (discover) You("are in non-scoring discovery mode."); flags.move = 0; set_wear(); (void) pickup(1); } moveloop(); return 0; } static void whoami(void) { /* * Who am i? Algorithm: 1. Use name as specified in NETHACKOPTIONS * 2. Use $USER or $LOGNAME (if 1. fails) * The resulting name is overridden by command line options. * If everything fails, or if the resulting name is some generic * account like "games", "play", "player", "hack" then eventually * we'll ask him. */ char *s; if (*plname) return; if (s = nh_getenv("USER")) { (void) strncpy(plname, s, sizeof(plname)-1); return; } if (s = nh_getenv("LOGNAME")) { (void) strncpy(plname, s, sizeof(plname)-1); return; } } /* normalize file name - we don't like .'s, /'s, spaces */ void regularize(char *s) { register char *lp; while((lp=strchr(s, '.')) || (lp=strchr(s, '/')) || (lp=strchr(s,' '))) *lp = '_'; } static void process_options(int argc, char **argv) { int i; while (argc > 1 && argv[1][0] == '-') { argv++; argc--; switch (argv[0][1]) { case 'D': case 'Z': #ifdef WIZARD wizard = TRUE; break; #endif /* otherwise fall thru to discover */ case 'X': discover = TRUE; break; #ifdef NEWS case 'n': iflags.news = FALSE; break; #endif case 'u': if(argv[0][2]) (void) strncpy(plname, argv[0]+2, sizeof(plname)-1); else if (argc > 1) { argc--; argv++; (void) strncpy(plname, argv[0], sizeof(plname)-1); } else raw_print("Player name expected after -u"); break; case 'p': /* profession (role) */ if (argv[0][2]) { if ((i = str2role(&argv[0][2])) >= 0) flags.initrole = i; } else if (argc > 1) { argc--; argv++; if ((i = str2role(argv[0])) >= 0) flags.initrole = i; } break; case 'r': /* race */ if (argv[0][2]) { if ((i = str2race(&argv[0][2])) >= 0) flags.initrace = i; } else if (argc > 1) { argc--; argv++; if ((i = str2race(argv[0])) >= 0) flags.initrace = i; } break; case 'g': /* gender */ 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 'a': /* align */ 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 '@': flags.randomall = 1; break; default: raw_printf("Unknown option: %s", *argv); break; } } } static void chdirx(const char *dir) { if (!dir) dir = HACKDIR; if (chdir(dir) < 0) error("Cannot chdir to %s.", dir); /* Warn the player if we can't write the record file */ /* perhaps we should also test whether . is writable */ check_recordfile(dir); } void getlock(void) { int fd; regularize(lock); set_levelfile_name(lock, 0); fd = creat(lock, FCMASK); if(fd == -1) { error("cannot creat lock file."); } else { if(write(fd, (genericptr_t) &hackpid, sizeof(hackpid)) != sizeof(hackpid)){ error("cannot write lock"); } if(close(fd) == -1) { error("cannot close lock"); } } } #ifndef __begui__ /* * If we are not using the Be GUI, then just exit -- we don't need to * do anything extra. */ void nethack_exit(int status); void nethack_exit(int status) { exit(status); } #endif /* !__begui__ */ slashem-0.0.7E7F3/Porting0000664000076400007640000001625110545462317013226 0ustar aliali NetHack Porting Guidelines v 3.4 1999-11-29 1.0 Introduction This document goes through the steps required to port NetHack to a new machine. The basic steps in porting the program are: 1. Get the code onto your machine. The parts of the current directory setup you definitely need include src (NetHack code shared by all systems), include (include files), util (code for utility programs), and dat (various data files). The documentation in doc is strongly recommended. You already have the files in the top directory since you're reading this one. :-) A full list of the distribution files and their associated OSes may be found in the top-level file "Files". If your machine uses an OS already supported, you need the sys subdirectory for that OS and possibly sys/share. Otherwise, get the closest match (say sys/msdos for single-tasking OSes and sys/unix for multi-user OSes, along with sys/share, if nothing else comes to mind). You may want others for comparison. If your machine uses a windowing system already supported, you need the win subdirectory for that system (or the appropriate sys subdirectory if the windowing system was previously considered restricted to one OS). 2. Modify the appropriate include files to customize NetHack to your system. You may need to add a new OS-specific "*conf.h" file (see unixconf.h, pcconf.h, tosconf.h, etc. as examples). 3. If your machine uses a new OS instead of a variant of existing OSes, add a new sys subdirectory. Add, if required, a OS- specific copy of "main.c", "tty.c" and "unix.c". Possibly add an OS-specific library (see "msdos.c" and "tos.c" as examples) to provide functions NetHack wants and your OS lacks. 4. If your machine uses a new windowing system, follow doc/window.doc carefully. Put files implementing these routines in a win or sys subdirectory as appropriate. 5. If your compilation environment isn't close to one already supported, try starting from the UNIX makefiles. Modify the top level makefile and the src makefile as required. Then run an initial compile. You are bound to get some errors. You should be able to fix them in a fairly simple fashion. If things seem to be getting too complex, take a step back, and possibly send us some mail. We might be able to help. 6. Mail all of your fixes to us in a contextual form so that we can easily integrate them into the code. One general rule of thumb exists. Always add code. Don't delete somebody else's code for yours -- it won't work on their machine if you do. Always add your OS specific code inside #ifdef / #else / #endif constructs so that it will be able to be folded back into the original code easily. 2.0 Include Files 2.1 config.h The file "config.h" is a master configuration file that determines the basic features of the game, as well as many of the security options. It is intended that end users configure the game by editing "config.h" and an appropriate "*conf.h" file, so any #defines for individual preferences should be added to those files. OS-specific #defines that are not intended to be changed should also go in "*conf.h"; try to find the most appropriate place for other #defines. The following sections may require modification: - Section 1: OS and window system selection. You may have to put a #define for your OS here. If your OS is yet another UNIX variant, put the #define in unixconf.h instead. An unfortunately large amount of stuff shares this section because the #definitions have to be seen before *conf.h is reached. Don't add to this unless necessary. - Section 2: Global parameters and filenames. These will have to be customized to your system. - Section 3: Type definitions and other compiler behavior. These will have to be matched to your compiler. 2.2 global.h This file defines things specific to NetHack that should not require modification by an end user. For a new port, you may have to add automatic inclusion of another auxiliary config file (*conf.h) which you wrote for your system. 2.3 extern.h If you create any new source modules or new functions in old modules, you must enter the names of the new external references (the functions defined there for external use) in this file. 2.4 system.h This file contains references for all hooks into the OS (via the standard "C" libraries). Depending on what your standard library looks like, you may have to put new entries into this file. 3.0 Source files The first step in getting the game up is to get the "makedefs" program running. This program is used to create configuration-specific files for the game. Once "makedefs" has been built, the rest of the game can be compiled. You may have to create an OS-specific module to handle things you want to use, like a mouse or a ram-disk. The utility compilers "dgn_comp" and "lev_comp" may be a better place to start. They also require "makedefs" but are independent of "nethack". They are usually the last programs made, but since they are much smaller they may be more tractable when first arguing with the include files. These programs create binary data files that "nethack" uses to guide its dungeon creation. 3.1 Makefiles This distribution provides makefiles for several kinds of systems. There are joint makefiles for the various varieties of UNIX, makefiles for MSDOS, a makefile for NT, and so on. You may have to create a new makefile for your specific machine. You may even have to translate some makefiles into a form more congenial to your system. If possible, however, add to one of those provided. 3.2 termcap.c If your system wants to use tty windowing and it doesn't run off of a termcap or terminfo database, you may have to put the appropriate terminal control strings into termcap.c. This has already been done for MSDOS, and these mods can be used as an example. You can also consider using the termcap code from sys/share/tclib.c or sys/share/termcap.uu, especially if your system supports multiple kinds of terminals. 3.3 main.c You may need to create a new "main.c" module. If you do, call it [OS]main.c where the [OS] is replaced with the name of the OS you are porting to. This file contains the mainline module, which reads options from the command line (or wherever) and processes them. It also contains various functions associated with game startup. 3.4 tty.c You may need to create a new "tty.c" module. If you do, call it [OS]tty.c where the [OS] is replaced with the name of the OS you are porting to. This file contains the routines that configure the terminal/console for raw I/O, etc. 3.5 unix.c You may need to create a new "unix.c" module. If you do, call it [OS]unix.c where the [OS] is replaced with the name of the OS you are porting to. This file contains some OS dependencies concerning time and filename creation. An object of the NetHack development project is to get the game working on as many different types of hardware and under as many different operating systems as is practical. Any assistance will be appreciated. slashem-0.0.7E7F3/readme.s60000664000076400007640000004122410545462317013366 0ustar alialiNew in Slash release 6! (March 29, 1996) NOTE: Saved games are not compatible with previous versions, and delete any bones files you've got collected so far (bones*.*). Bugs fixed ---------- * valkyries and Barbarians were unable to read the Book of the Dead. Oops. * fixed specific warning from some artifacts * the "it doesn't seem to harm" message appears only if the creature is seen * wishing for an artifact could cause a crash later on. Urp... * added damage amount display to explosions * fixed bugs with explosion damage: polymorphed players and invulnerability wasn't working right with fireballs, gas spores, etc. * changed // comments to /* */ to help other platforms out... :) * also put lots of the Watcom stuff in #ifdefs * fixed reflection message... again.... * fixed conflict & god-given pets * fixed "You return to human form" for Gnomes * crash bug with archeologists falling in trapdoors fixed. * added message when necromancers gain gain undead warning Adjustments ----------- * id wands of healing if you zap yourself * healing/extra-healing potions give you more permanent hit points * weapons can be enchanted from +5 now (was +3) * removed the "steps reluctantly" message from god-given pets... it was annoying and misleading * angels don't show up unless you're in deep trouble. Additions --------- * weapon swap command - 'x' -- list spells is now 'X' * added dark elven equipment -- chaotic elves are now dark elves * invisible objects (invisible weapons get a +3 to hit monsters who can't see invisible; nymphs, etc. won't steal invisible objects they can't see; 1 in 1250 random objects are now invisible) * made a makefile for Watcom * added/enhanced some wizard mode commands * put in four Neutral weapons from Nehwon: Graywand, Heartseeker, Scalpel, and Cat's Claw. Many people have given lots of helpful suggestions, but several have been especially helpful and have sent me huge lists of bugs. They are Wolfe, David Robertson, and Kentaro Shirakata. Thanks to everyone for their help in squashing bugs. No one likes to lose a character to a bug, and the more bugs that are found, the fewer remain. ---------------------------------------------------------------------- Fixed in Slash release 5 (3/17/96) Bugs fixed ---------- * fixed bug that locked up Priest, Ice Mage, and Monk quests... gulp! * fixed bug with attacking a tame monster that needed a magic weapon to hit * fixed another bug with undead/special creature warning * made firing mjollnir return to quiver rather than readied weapon slot * killer rations now leave "bodies" like they're supposed to * corrected message for silver dragon scale mail * made kamadans sleep resistant * corrected message for strength-draining creatures that touch you * fixed crash bug with quiver -- crashed if you put an item in the quiver, manually threw it (not 'f'ire), dropped it, and picked it up. * fixed a bug with throwing a potion of sleeping * fixed a bug with Hand of Elbereth & Excalibur * put the history, license, etc. files in the binary zip (whoops) Adjustments ----------- * stretched out the pre-castle dungeon a bit * put the original Gnome Mines back in, with some adjustments... heh heh... * made the Giant Caves & Spider Caves actual levels, not minefill-ish * made altars and graves rarer because of increased dungeon length * toilets only appear in rooms with sinks * made silver dragons actually reflect stuff & breathe cold instead of missiles * made Lawful gods sometimes send you an angel if you pray (gotta be some reason to be Lawful...) * 'W'izards can now only be neutral... after all, their patron is the Wizard of Balance... :< * 'L'ycanthropes stats changed, and they sometimes go berserk. * put gnolls on Yeenoghu's level * ghouls & ghasts eat old, decaying bodies * made getting a pet from sacrificing even rarer * made dragons do more damage * went through and fixed up the plus-weapon-to-hit monsters * enemy characters in the dungeon now have appropriate equipment & are rarer * because of the new life-drain protection items, made level draining a little nastier (magic resistance is down to 50% protection from 90%) * put in a message for wand of speed monster * made lightsabers one-handed & able to engrave * made gas spore explosions neater -- chain reactions possible! * made rings of gain strength, etc., go up to +5/-5 * fixed up the special levels a little more * priests of Moloch are always hostile * made gauntlets of swimming work right * adjusted the item probabilities a little * if you get touched by green slime, you don't drop dead quite so fast * the studly classes -- Barbarians, Cavemen, Samurai, and Valkyries, have a little more trouble with some magic items * put some more monsters in the data file to look up during the game * put in a message when monsters flee * undead and demonic pets will step on cursed items Additions --------- * new classes! 'N'ecromancers and 'G'nomes! * new spells: summon undead & command undead (for necromancers, of course) * added deep dragons, deep dragon scale mail; cloaks, rings & amulets of drain resistance * added devas, Planetars, made Solars harder * added spined & bearded devils * added babau, bar-lgura, chasme, and nabassu demons * added giant badgers (gnome pet) * added the Temple of Moloch & Sunless Sea, new special levels * made traps & altars color-coded * added abandoned food shops gone wild & cockatrice nests * made some more interesting results to human sacrifice by Chaotics * added a couple of more Gauntlet messages ---------------------------------------------------------------------------- Things that were fixed in release #4 (3/8/96) Bugs ---- * Fixed crash caused by a god-given angelic pet * Fixed a bug that kept soldiers & shopkeepers from having armor & K-rations * Eating a master mind flayer increases intelligence. * Fixed a crash bug with kicking (only happened in UNIX... :<) * Fixed a bug with monks getting artifacts from sacrificing. Adjustments ----------- * You gain hit points faster -- 1.5 as fast as in release 3 for a 25 constitution, and the lower constitution doesn't drop the speed as fast as it did. * Fixed a bug with hp regeneration rounding. * Artifacts hit as magical weapons 2 plusses better than listed. * Made monsters that need magic weapons to hit strike as those magic weapons. * Lightsabers can hit anything. * Made candles more common and cheaper. * Made getting pets less likely and artifacts more likely from sacrificing. * Made low level bones files (levels 2, 3, etc.) less common. * Made altars a lot more common, because they won't appear on special levels. * Made level draining less likely to work, and magic resistance helps to protect from it (not 100%, though) * Made the nethack directory in nethack.cnf default to '.' ----------------------------------------------------------------------------- Things that were fixed in release #3: (2/26/96) Bugs ---- * Fixed a bug with regeneration. * Won't allow you to put worn items into the quiver. * Fireballs will burn away slime. * The beholder and catoblepas's death gazes do not affect undead creatures. Adjustments ----------- * Added release number to intro screen. * Added "Levitate" to bottom line when levitating. * Fixed up some of the special levels a little. * Made monster-carried items a little rarer. --------------------------------------------------------------------------- Things that were fixed in release #2: (2/18/96) * The source is available, and named slashsrc.zip. * If there are more bugs uncovered, the exes will continue as slash3, slash4, slash 5, etc. The source will consist of the affected files only, though, and will be named slashsr2, slashsr3, etc. Important things (bugs) ----------------------- * Would crash (divide by zero) after level 24... now fixed. * Special warnings (like with Sting or Undead Slayers) fixed to show right monsters. * The beholder had a "head". Not now... * Engraving with a wand of fireballs gave the wrong message -- "this is a wand of fire!" * Included dos4gw.exe in zip file. Less important things (adjustments) ----------------------------------- * Pets won't attack gas spores very often. * Quicklings armor class worsened considerably. (easier to hit them) * Changed the container interface back to standard NH 3.1.1. * Confirmed that Magicbane seems to work ok. * Made a message for the wand of slow monster. Old readme file ----------------------------------------------------------------- Welcome to SLASH, the ridiculously bloated successor to Nethack++! But first, a short history of the life of Nethack++ and SLASH-Hack: One day, a long long time ago (~1991 or 92, I forget...), nobody played NetHack 3.11, because it hadn't been released. Us Nethack-Junkies (tm) played NetHack 3.0j, which had been out for a Very Long Time, and we were getting good at the game. Good enough, in fact that two of us, me (Tom) and my roommate (Yuval) decided one day to download the source and start messing around with it, adding monsters, items, and all sorts of stuff. After a while, we decided that we Really Had Something here and decided to upload it to an ftp site, and told everyone on rec.games.nethack about our bloated creation, henceforth called NetHack++! We were immediately swamped with mail demanding Our Secrets, for many people thought we had miraculously ported NetHack 3.0j to C++! In a flash, we re-named our creation NetHack--. Meanwhile, the elusive DevTeam must have been chuckling up a storm, for not one month later, NetHack 3.1 appeared, and our moment of glory was gone. Time passes... You feel a yearning for your distant homeland... Eventually, however, some people ascended in Nethack 3.11, and people were getting restless again, and someone named Chris decided to port the changes Yuval and I made to Nethack 3.0j to Nethack 3.11, creating Nethack-- all over again, but better, because monsters could now use stuff and so forth. Then Nethack-The Next Generation appeared, and it was cool. Meanwhile, I was busy puttering away on my personal version of Nethack 3.11, adding things here and there, such as Firemen, Musicians, and wands of fireballs -- you know. Then Nethack Plus, by some guy named Stephen White, appeared, and it was cool. And it had neat new classes, like Monks, and Lycanthropes, and Doppelgangers! So I downloaded the source and changed it all over again (a third time) into SLASH-Hack! Then the second version of Nethack Plus appeared, with weapon skills, and other stuff. And this time, I said "Screw it!", and I was not about to change everything a fourth time. So SLASH-Hack progressed, and time passed, and it was soon April of 1995. And I decided to use Watcom C, because it was neat. And one day, just as the Last Bug had been fixed, and I was about to do the final compile, instead of typing 'del *.obj', I typed 'del *.c'. And there was much gnashing of teeth. I whipped out ol' trusty Norton Unerase and got almost everything back, except for mhitu.c, uhitm.c, zap.c, and do.c So I gave up changing things, not about to re-create everything that was different and cool. And I played the Right Before the Final Compile for a few months. And I said to myself, "Hey, this is actually sorta cool." And I thought, "Maybe I _could_ recreate the last few changes." So, I did. Eventually. From memory, here is the new stuff: --------------------------------------------------------------------------- SPOILERS! SPOILERS! SPOILERS! --------------------------------------------------------------------------- The changes from Nethack Plus, except for: * you _can_ wish for artifacts, except there is a chance it doesn't work * the hit point regeneration is completely changed, and is now based on your Con and Max Hp. A side affect of this is a ring/amulet of regeneration is not so easily identified, because it doubles your healing rate, and that may or may not be 1 point/turn. * the magic-weapon-to-hit-a-monster thing is still in there, but significantly toned down * the Doppelganger no longer prompts you "want to change (y/n)?" every couple of dozen turns. This drove me up the wall! If you want to polymorph, use alt-Y and 10 energy. About 150 new monsters. Some of the more, um, interesting ones: * rot worm -- Causes sickness, and is a low level monster. Fortunately, it's kinda slow. Unfortunately, it hides under things. * rhambusun -- Has a paralyzation gaze (lasts for only a couple of turns) * pyrolisk -- Has a fire-damage gaze * green slime -- Touch causes you to slowly turn into slime unless you burn it away. The grand ol' list: a: snow ant, yellow jacket, tsetse fly, giant wasp, black wasp, army ant, spitting beetle, assassin bug, killer beetle b: jiggling blob, lava blob, crackling blob, burbling blob c: chickatrice, pyrolisk d: dingo, fox, coyote, pit bull, rabid wolf, hyena, wolverine, shadow wolf, mist wolf, death dog e: glowing eye, flaming sphere, shocking sphere, bloodshot eye, blinking eye, beholder, gas spore f: lynx, panther, werepanther, weretiger, sabre-toothed cat, displacer beast, hellcat, caterwaul, kamadan g: galltrit, jermlaine h: dwarf thief, duergar, master mind flayer, gnoll i: dretch, rutterkin, nupperibo, blood imp, larva j: red jelly, orange jelly, black jelly k: swamp kobold, rock kobold, kobold wizard, kobold warrior, Kroo l: leprechaun wizard, brownie, quickling, pixie n: Aphrodite o: orc, war orc, great orc, Grund, snow orc, demon orc p: glass piercer, roper q: scramper, squealer, mangler, mastodon, Jumbo, juggernaut, catoblepas r: rabbit, black rat, pack rat, rabid rabbit, hellrat, the Rat King s: centipede, recluse spider, barking spider, nickelpede, giant scorpion, Girtab, Shelob, werespider, carrion crawler, phase spider u: nightmare w: maggot, dung worm, acid worm, tunnel worm, rot worm, bloodworm x: arc bug, spark bug, lightning bug y: red light, blue light A: Solar B: rhumbat, athol, hellbat, mongbat, mobat, harpy D: shimmering dragon, silver dragon, wyvern, hydra F: disgusting mold, black mold G: gnome thief, deep gnome, gnome warrior, Ruggo H: storm giant, the Largest Giant I: sneaker, squeaker J: vorpal jabberwock L: arch-lich, Vecna M: troll mummy O: ogre mage, shadow ogre P: moldy pudding, green slime S: king cobra, weresnake, asphynx T: black troll, two-headed troll U: water hulk V: vampire mage W: wight Y: monkey Z: ghoul, ghast ': gargoyle @: mugger, thief, character classes (at all different levels), jackalwere, gibberling, grimlock, drow : shadow &: efreeti, dao, marid ;: shark, giant crab :: gila monster, salamander, rhaumbusun, basilisk, komodo dragon There are new spells for the monsters to cast, and they will use a lot of the new items, so be careful of the original monsters as well! I tried to color the new monsters appropriately, and colored people according to their clothing. There are some duplicated colors, now, though, so be careful. The characters are colored now, according to their preferred dress, so the Tourist is purple, Elf green, Rogue black, Wizard blue, and so on. Call me stupid, but this helps remind me which class I am, since I die so often... Pets only pick up 5 gold pieces out of a pile, and won't pick up a whole bunch of arrows. New terrain types: graves (you can 'r'ead the headstone, or dig it up) toilets (um, you can sit, kick, drink, all sorts of stuff) New artifacts, like the Eye/Hand of Vecna. I wouldn't use either one of these too often, if I were you. There's also Mirrorbright the silver shield, Whisperfeet the speed boots, and Deluder the displacement cloak. Also, a bunch of weapons, which I don't remember too well. Buncha special levels, like the Rat King level, the Kobold King level, Orc level, Giant level, spider level, etc. Some are side-dungeons, others aren't. New rooms, like a Real Zoo (with zoo-like monsters), Leprechaun Throne Room, Giant Throne Room, and stuff like that. Buncha items. I remember these: armor: silver dragon scale mail (reflection) shimmering dragon scale mail (displacement) gauntlets of swimming cloak of poisonousness (don't wear this) lab coat (poison res) asbestos jacket, fire helmet (left over from my Fireman class) kicking boots amulets: regeneration conflict polymorph rings: free action (no paralyzing! cool item!) gain Con/Dex/Wis/Int sleeping potions: full healing invulnerability (for a few turns, anyway) polymorph clairvoyance ESP fire resistance wands: healing fear extra healing create horde (don't use this, unless you're studly) fireball (fortunately, monsters won't zap this one because I couldn't get it to work right) Good luck, and try not to get killed by a horde of snow orcs! slashem-0.0.7E7F3/readme.txt0000644000076400007640000002531110545462317013652 0ustar aliali+------------------------------------------------------------------------+ | README.TXT | +------------------------------------------------------------------------+ | SLASH'EM ver 0.0.7 | | Super Lotsa Added Stuff Hack - Extended Magic | | A Nethack Variant | | Courtesy of the Slash'EM development team with the efforts and support | | of countless others, especially the slashem-devel mailing list. | | (1997-2004)| +------------------------------------------------------------------------+ | Nethack is Copyright 1985-2003 | | By Stichting Mathematisch Centrum and M. Stephenson. | | SLASH'EM and NetHack may be freely redistributed. | | See license in the dat directory for details. | +------------------------------------------------------------------------+ +-------+ | Index | +-------+ 1 - News 1.1 Status 1.2 Changes 2 - Getting started 2.1 Using official binaries 2.2 Playing the game 2.3 Building it yourself 3 - What is the Nature of this Beast? 4 - Who is Responsible & The Credits 4.1 The dev-team 4.2 Acknowledgements 5 - Further reading +-----------------+ | Section 1: News | +-----------------+ 1.1 Status ---------- The development of version 0.0.7 of Slash'EM started with version 0.0.6E5 (yes, we realise our version numbers are a little odd - it made sense at the time!). Version 0.0.7E6 was the first beta release. If you find any bugs then please submit a report via the offical bug page: http://sourceforge.net/bugs/?group_id=9746 If you are interested in the development of Slash'EM, please also join the slashem-devel mailing list so that you can take part in discussions and give us any feedback. If you'd just like to talk about Slash'EM with other players or chat to the developers, then please join the slashem-discuss mailing list. Finally, all users are encouraged to join the slashem-announce list, which is very low traffic but will keep you up to date on new versions. Slash'EM mailing list page (including archives): http://sourceforge.net/mail/?group_id=9746 All the above, and more, are available via our home page: http://www.slashem.org/ 1.2 Changes ----------- ver 0.0.7E7F3 [December 30/2006] [Released by Ali] -inserted missing #ifdef resulting in compilation of pure ansi tty version for DOS failure. -fixed bug 1461660: Misaligned door -fixed bug 1449238: #youpoly takes a turn when denied -fixed bug 1432473: help for Luggage shows help for Lug/Lugh -fixed bug 1428520: Poisoned ID'd weapon gives description as well as ID -fixed bug 1375292: help for wombat shows text for bat -fixed bug 1375286: pummel strikes nothing, inside ochre jelly -fixed bug 1355891: Cannot wish for multiple potions of vampire blood -fixed bug 1314114: Shopkeepers cant see Shirts through invisible armour -fixed bug 1304954: You can Name the Sword of Balance -fixed bug 1223533: Typo error in the Install.X11 file -fixed bug 1407275: Wrong weight of medical kits -fixed bug 1213658: Death message missing with gas spore explosion when blind -fixed bug 1291161: #force command doesn't work on locked box -fixed bug 1223632: #force on shop doors -fixed bug 879247: gender & alignment select dont focus on "random" button -fixed bug 943553: Eating off floor while levitating -fixed bug 1432411: Knew the colour of a potion thrown on me, when blind -fixed bug 1449159: DEFAULT_WINDOW_SYS wrong if only X11 enabled -fixed bug 1400802: wax golems don't emit light -fixed bug 1586216: USE_REGEX_MATCH fails on Solaris 10 -fixed bug 1583978: Grammer error in broken celibacy message -fixed bug 1549137: Technique cutthroat is effective to no-head monster (Michael DiPietro) -fixed bug 1288590: Potion of hallucination cannot be identified by drinking -fixed bug 1482524: alchemy with gain level asymmetric (Michael DiPietro) -fixed bug 1546379: Fedora & charisma (Michael DiPietro) -Actioned feature request 1504905: Add french translation of manual page (Rémi Delrue) -fixed bug 1624174: koala bugs steed -fixed bug 1539448: rotten wraith corpses GPF -fixed bug 1521400: Dungeon collapsed returning to full level -fixed bug 1211513: Upgraded objects retain names, even artifact names -fixed bug 1554633: lichen, grown on a dead pet corpse, inherits pet's name -fixed bug 1521471: Medical kit contents can leak -fixed bug 1609542: Reaper + eyes of overworld -fixed bug 1503394: Conduct= is not always written to logfile -fixed bug 1558274: Light source weapons not working properly -fixed bug 1602002: dmonsfree when using travel command & burdened See history.txt for changes made in previous versions. +----------------------------+ | Section 2: Getting started | +----------------------------+ 2.1 Using official binaries --------------------------- The Slash'EM development team make offical binaries available for a few platforms. There are other, unofficial, binaries available as well which will come with their own instructions. 2.1.1 DOS --------- Support for this platform is sporadic at best. You may find you have to use an unofficial binary. When an official binary is provided: o Decompress the zip archive into its own directory. o Use a text editor to review defaults.nh and make any changes needed. o If you chose to keep the fancy graphical environment (the allegro interface) by leaving video set to autodetect, then review alleg.cnf as well (this file is ignored in VGA tile mode). o Run the slashem executable. 2.1.2 MAC --------- The MAC binary comes with its own documentation which you should consult. 2.1.3 Linux RPMs ---------------- Perform the following steps: o Install the package using rpm -U o Read the RPM specific documentation in README.RPM o In case of difficulty, consult Ali's linux page: http://www.juiblex.co.uk/nethack/slashem/linux.html 2.1.4 MS-Windows ---------------- Perform the following steps: o Download the core package and install it. This will allow you to play Slash'EM using the native gui (common controls) windowing interface. o If you would prefer to use the console (tty) windowing interface, then you need to edit the defaults.nh file and set the windowype option to tty by uncommenting the relevant line. o If you would prefer to use GTK, an alternative graphical windowing interface, then you need to download and install the GTK add-on package as well. You will also need a copy of the gtk-win runtime environment version 2.2.1 or above. This is available from http://www.dropline.net/gtk o Use a text editor to review either or both copies of defaults.nh and make any changes needed. o If you chose to install the GTK add-on interface, then review gtkrc as well. o Use the start menu or desktop icons to play Slash'EM under your preferred windowing interface. 2.2 Playing the game -------------------- Once in the game, type in the name for your alter ego. You will then be prompted to select your character's role and race. Select a gender and alignment, if necessary. Once you're on the dungeon map, use the number pad to move around (or the standard roguelike keys [yuhjklbn], if your turn off number_pad). Move into monsters to attack them. Help is the '?' key, inventory is 'i'. Try out the menu system by hitting the ` key. 2.3 Building it yourself ------------------------ If you don't already have a copy of the source code for Slash'EM then get the source tarball via our homepage: http://www.slashem.org/ Then read the installation instructions specific to your platform, as follows: Amiga sys/amiga/Install.ami Atari sys/atari/Install.tos MAC sys/mac/Install.mpw MS-DOS sys/msdos/Install.dos OS/2 sys/os2/Install.os2 UNIX sys/unix/Install.unx VMS sys/vms/Install.vms MS-WinCE sys/wince/Install.ce MS-Win32 sys/winnt/Install.gcc +----------------------------------------------+ | Section 3: What is the Nature of this Beast? | +----------------------------------------------+ THE PROBLEM: The AMULET OF YENDOR has been stolen. Not only that but it appears that the Wizard of Yendor (not a nice person), who took the amulet, is hiding in the Dungeons of Doom (not a friendly place). The SOLUTION: Well, armies have been suggested. Maybe hiring a superhero or two. Unfortunately, it seems that it is more economical to offer a reward and let some poor adventurer with dreams of glory go and get it. Guess who's got the enviable job of saving the day... Super Lotsa Added Stuff Hack - Extended Magic (SLASH'EM) is a role-playing game where you control a single character. The interface and gameplay are similar in style to Rogue, ADOM, Angband and, of course, Nethack. You control the actions through the keyboard and view the world from an overhead perspective. +--------------------------------------------+ | Section 4: Who's Responsible & The Credits | +--------------------------------------------+ 4.1 The dev-team ---------------- o Project administrators: Warren Cheung and J. Ali Harlow o Developers: Pekka Rousu and Clive Crous o Mac port: Paul Hurtley 4.2 Acknowledgements -------------------- Thanks to Andrew Apted, who contributed the glHack interface. Thanks to Kevin Hugo (hugo@cae.wisc.edu), the previous Macintosh maintainer and the author of many changes, who has had to move on to other projects. Thanks to Dirk Schönberger (shoenberger@signsoft.com), who worked on the Qt and Linux ports. Thanks to Ben Olmstead for mirroring the homepage. Thanks for the support, bug reports and suggestions of (in no particular order): Pat Rankin, Linley Henzell, 0ystein Kerstad, Jim Miller, pi, Steven Uy, Alex Critchfield, Mike Balcom, Sascha Wostmann, Drew Curtis, Daniel Krause, E. P. Dinklewhopper, Tim Jordan, Lukas Geyer, Kresimir Kukulj, Brent Oster, Travis McKay, Jared Withington, Philippe-Antoine Menard, Ain Uustare, Doug Yanega, David Tang, Lief Clennon, Robert Herman, Petra Prinz, Aki Lumme, Nick Number, Robin Johnson, Heiko Niemeier, Chris Bevan, David Damerell, Kevin Hugo, Daniel Mayer, Ben Olmstead, Tom Friedetzky, Kalle Niemitalo, Sabine Fischer, Christian Bressler, Jake Kesinger, Chris Subich, Paul Sonier, Peter Makholm, Matthew Ryan, J. Ali Harlow, George Stephens, Bruce Cox, Edward Walker, Karl Garrisson, Finn Theoderson, Kelly Bailey, Seth Friedman, Jonathan Nieder, Eva R. Myers, Darshan Shaligram, Tina Hall, Christian Cooper. +----------------------------+ | Section 5: Further Reading | +----------------------------+ o Slash'EM Homepage: http://www.slashem.org/ o Ali's Slash'EM page: http://www.juiblex.co.uk/nethack/slashem.html o Eva's spoiler page: http://www.statslab.cam.ac.uk/~eva/slashem/index.html slashem-0.0.7E7F3/doc/0000775000076400007640000000000010545462317012421 5ustar alialislashem-0.0.7E7F3/doc/strategy.txt0000664000076400007640000005674610545462317015046 0ustar alialiSLASHEM SURVIVAL & STRATEGY GUIDE Updated 10/10/99 By Dave (Rodneybane@aol.com) If you want a basic explanation of how to move around and what all the symbols mean, first read one of the other help files. If you understand how to move around, but are ready to try to increase the survivability of your characters through strategy, you are in the right place. I have ascended all 23 of the classes in SlashEM and the primary thing this indicates is that I spend too much time playing computer games, but I think it also means that I have some good techniques that I hope will help others play the game. Thanks to Warren for taking time to make the game cooler! _________________________________________________________________________________ So you want to be an Amulet recovery professional? Follow these 22 "easy" steps and I guarantee you will ascend within 30 days. (see disclaimer at end) 1) Use the hallways to fight only one creature at a time. Suppose you're out in the middle of a room and a horde of orcs come piling through a door. The best way to minimize the damage taken from a group of monsters is to retreat into a hallway so that only one can hit you each turn. Some of the others may throw their weapons at you, but generally you are much better off. If you back up a few squares into the hallway, the monsters may line up nicely in the corridor and allow you to hit a bunch of them with one well-placed spell or wand. If another monster comes up behind you, try to dispatch that one first so that you are not fighting a war on two fronts. Inevitably, though, a situation will arise in which you estimate your chances of surviving are low and you will need an escape route. 2) Try to always leave yourself an escape route. Items such as wands of teleportation (zap yourself with it) and wands of digging (zap it downwards) are excellent means of escape from losing battles. But the beginning character is unlikely to have these things, so more conventional means of planning are in order. Try to fight battles in an area where if it goes badly you can retreat upstairs. The vast majority of monsters will NOT follow you upstairs, some do and you will learn which ones the hard way : ) When you get upstairs, if you are very badly hurt keep on retreating upwards until you get your health back. The monsters randomly generated over time have their difficulty determined by an average of your character level and the dungeon level you are on. So if you heal up while on level 1, the monsters created will be significantly easier than if you were on dungeon level 7. Once you do have wands of teleport (or digging), keep one of them out and ready. A ring of conflict can give you time to zap yourself with a wand of extra healing a couple times if you can't escape 3) Hit and Move: Intrinsic or magical speed is VERY important. There are different speeds that characters move at in the game. The game represents this by somtimes allowing you to move while everything else stands still if you are fast or very fast. Zapping a wand of speed monster at yourself will give you intrinsic speed. FAST: If you are fast, every third move is a "free" move. As decribed below, you can use these free moves to hit a monster without it even being able to attack you. VERY FAST: If you are very fast, every other move is a "free" move. If you don't understand how to "hit and move"...read on: First, let the monster move up right next to you. Then move away three times, you will notice that if you are fast or very fast the monster did not move on all three of your moves. You can use this fact to allow you to move away on the turns when the monster gets attacks and attack on the turns when the monster can't move. If you are fast (but not very fast) then you move away twice, hit once, move away twice, hit once, and so on... If you are very fast, then you move, hit, move, hit, etc... This is most effective when combined with fighting in a hallway so you only have to fight one monster at a time. This is particuarly important for monsters that steal stuff and monsters that can turn you to stone if they touch you. NOTE: There ARE monsters that are "fast" also. The game represents speed differently for monsters though. Fast monsters get to attack you on the same turn that they move next to you. This neutralizes the effectiveness of speed in hand-to-hand attacks, but not for ranged attacks such as missiles or spells. Just don't let the monster ever move into the square right next to you if it is fast and use the same strategy as above to maintain the distance. There are also a few monsters that are "very fast" and can move more than one square per turn. The best strategy against a group of these monsters is to move into a hallway where you can dispatch them one at a time 4) Prayer and Starvation These two things are often very closely related at early levels. Food is often a problem at early levels because you need to take time to heal up between fights but you also need to keep exploring new territory to find food and corpses to eat. The best way to increase your food supply is to wait until you become weak from hunger and pray. But DON'T PRAY TOO OFTEN. How often is too often? Usually 1000 turns between prayers is enough for lawfuls, 1200 is enough for neutrals, and 1400 is enough for chaotics. There are lots of things that affect the actual length of time between your god allowing you to pray, so my estimates are somewhat conservative. Usually you can pray safely about every 700 turns or less, but I do not recommend risking it unless you are in very bad shape. ***Always pray if you don't see any other way out of a situation, if you are low enough in hit points, your god may have some pity and heal you up or more... So, especially for chaotics, having a supply of food is imperative. Buy food rations in shops before anything else except tripe rations, assuming you don't already have a bunch of food. Use tripe rations to have your pet rob the shopkeeper blind of course... (see #5 below) Sacrificing on a coaligned altar will let you know if you can pray safely. If you have a "hopeful feeling" you can not safely pray yet. Note also that once you are "crowned" (see other spoilers re: crowning) your prayer timeout increases because your god figures you are strong enough to take care of yourself for a while. 5) Stealing from shops There are other spoilers written that tell you how to train your pet to steal stuff from shops, but I'll make some recommendations of what to steal. Items such as Gauntlets of Power, Cloaks of Magic Resistance, and Speed Boots will drastically increase the chances of a low-level character surviving. It is extremely rare to just find this type of stuff lying around, but it is somewhat more likely to find one in a shop. ***So always buy or steal any unusual boots, gloves, and cloaks in a shop. This is more important than buying scrolls, or wands, or rings. Although a good wand can whup some ass... As always make sure armor you have bought is not cursed by having your pet walk on it. (Non-god-granted pets will not walk on cursed items (except undead.)) 6) Effective pet management Pets can be extremely helpful if used properly. When I started playing I always just left the pet behind because it annoyed me waiting for it, but I have seen the error of my ways. In addition to stealing, pets provide extra attacks per round on difficult monsters and are very helpful in killing nymphs, pixies, and unicorns if you don't have speed yet. I try to keep my pet at least until I have stolen anything useful from minetown and the "mall" (a store level around level 5 or so of the main dungeon, it is not always created in every game.) Zapping a pet with a wand of speed monster will make it fast unless it already is. ***LET YOUR PET KILL ANY MONSTERS THAT ARE LOW EXPERIENCE VALUE Pet "experience" points and character experience points are done very differently. A pet gains hit points any time it kills something. So if your pet kills five newts it has gained 5 hit points, if you kill five newts you have gained almost nothing. A pet gains the same hit points for killing a newt or a dragon. So, you kill the dragons and let the pet kill the geckos, when possible. Large dogs and cats are pretty good fighters so take the time to develop them. Once I get speed boots I usually ditch the pets though. SPOILERS AHEAD SPOILERS AHEAD This is the point in the program where I feel obligated to warn people that after this there are alot of spoilers. Stop reading if you don't want spoilers. 7) Identifying unknown wands Engrave with your fingers a few letters in the dust, e.g. "ssssss" Then engrave with the wand on the same square, the message you get (if any) will help you figure out what the wand is. It'll take some time to figure them all out, but many of them are straightforward. Engrave with your fingers with the command "E", then when it asks what to engrave with, choose the dash "-" key. 8) Unknown potions and scrolls There are two ways to figure out what an unknown potion or scroll does. One is the fun way, the other is the smart way. Fun way: Read or drink whatever you come across. Odds are it will help you, but it can also screw you royally. Smart way: Potions: Wait until you get a unicorn horn before testing any new potions, and only drink uncursed or blessed unknown potions. Take off your body armor and cloak in case the potion is a potion of polymorph. Scrolls: Don't read scrolls until you figure out if they are uncursed. Put all flammable items down or away before reading unknown scrolls, until you ID the scroll of fire. Only wear one item of armor, preferrably expendable, when reading unknown scrolls until you ID the destroy armor scroll. Save identify scrolls until you can get them blessed and use them to identify rings and other stuff that you can't figure out by other means. Blessed scrolls of ID tend to identify more items per reading and have a 20% chance of IDing everything you have out. 10)What branches should I do in what order? Generally I recommend staying in the main dungeon until you are 6th level or so. Then go back and clear out the mines down to the mine town. Then try to make it down to the Sokoban levels. Sokoban is found via an extra up staircase down around dungeon level 9 or 10 of the main dungeon. It will provide you with a good supply of food, some rings and wands, and a worthwhile bonus if you complete it. Then go back and clear out the mines all the way down. Get the luckstone. If you haven't found a coaligned altar by now, that becomes your first priority. Convert an altar, though preferably not the Minetown altar because that priest will probably kick your ass still. Get some holy water and a unicorn horn. Always keep an eye out for healthstones. An uncursed healthstone will make you regenerate hit points MUCH faster and is a big help. Healthstones are always cursed when you first find them, and cursed Healthstones make you regenerate SLOWER until you get them uncursed, so put it in a bag until you can get it uncursed. Do the first few levels of the quest, but most quest villains should not be faced until you have Magic Resistance. Don't do the beholder level until you have Magic Resistance. Don't do the Dragon Caves until you have reflection. (Nighthorn can help with this.) Avoid Vecna until you have magic and drain resistance, or avoid it altogether. Do all these things successfully and you will have a good start : ) And there is much more to do... 11)Use Unicorn horns to cure what ails you Apply a unicorn horn when you are Stunned, Ill, or otherwise incapacitated and it will have a chance of curing you. A higher + on the unicorn horn will increase its likelihood of curing you, and a blessed unicorn horn will also increase the chance. So a blessed +6 or +7 unicorn horn is practically a requirement for surviving Demogorgon, unless you have another way to repeatedly cure sickness. 12)Monsters that teleport away to the upstairs when wounded Monsters such as the Quest nemesis, the major Demons, and Liches will tend to teleport away to the upstairs on a level when they are wounded. Then if you get near them while they are wounded and on the upstairs they will tend to escape upstairs. The best strategy is to try to get onto the up stairs so the demon cannot escape. A good way to do this is to go to the DOWN stairs and wait for the creature to come to you then go down one level and it will follow you. You will then be on the upstairs and have the escape blocked. 13)Quality Ascenscion Kits, Wishes and Polypiling An Ascenscion kit is a set of armor that will tend to give you an excellent chance of ascending. Slashem has added some items to allow some variability in what people choose as their favorite kit. Here are my recommendations: Silver Dragon Scale Mail, Cloak of Magic Resistance, Speed Boots, Gauntlets of Power, T-shirt or Hawaiian Shirt, Helm of Brilliance, blessed luckstone and healthstone. Keep rings of regeneration, free action, and levitation close to hand. Have an amulet of drain resistance ready for vampires and wands of draining. Keep a blessed wand of extra healing in your bag just in case. Spellcasters may wish to hold off on using the Scale Mail and opt for an amulet of reflection and a Robe of Power and may want to substitute Gauntlets of Dexterity in place of Gauntlets of Power. If you get the Gauntlets of Defense which are an artifact then I recommend using them as you only take 50% physical damage when wearing them. These substitutions will allow much better spell success rates. A Helm of Brillance is not a big deal unless you are a spellcaster. I don't include a shield in my ascenscion kit because if you can use two-weapon style (see below, Two-weapon Usage) you should, and if you are a spellcaster a shield will hinder your spellcasting. Of course, all items should be enchanted to max, blessed, and rustproofed if possible. The maximum safe enchantment level for almost all armor is +5. Elven armor can be enchanted to +7 but I generally don't include this armor my Ascenscion kit. WISHES If you are lucky enough to get a wish early in the game, I recommend wishing for speed boots unless you already have intrinsic speed. If you have speed, then I suggest wishing for a cloak of magic resistance because it protects you from randomly generated wands of death, polymorph traps, level teleport traps and other annoyances. Later in the game use wishes to fill in the gaps in your ascenscion kit, wish for scrolls of charging to recharge wands of wishing or polymorph, or wish for candles which I almost always forget to collect during the game. I NEVER wish for artifacts because if I did I would tend to always use the same weapons and I think it is more fun to have some variability in the weapons between games. POLYPILING Polypiling is considered by some to border on cheating. I mention that because if you can ascend without polypiling it is an achievement. That said, I tend to use it because Cloaks of Magic Resistance and Gauntlets of Power are usually tough to find, and it is very possible to go through an entire game without finding them. Polypiling consists of dropping a bunch of items and zapping the pile with a wand of polymorph. This will change the items into other items of the same type BUT some of the items will not survive the change and will be destroyed. SO...the best way to polypile is to locate a wand of polymorph and wait until you encounter a bunch of soldiers since they have a bunch of armor. Pile it up and zap it, then check the items created for new stuff like snow boots and dirty rags, etc. I also sometimes use polypiling to turn bunches of less useful scrolls, rings and wands into more useful stuff like scrolls of enchant armor or rings of regeneration. Items which have been created by polypiling have a chance of reverting to their original form over time so anything especially useful like Gaunts of Power can be dipped into a potion of Restore ability to make sure it does not revert. If it wasn't going to revert then the potion will not be used up, if you get a message that the item looks "less fuzzy" then you have saved yourself some hassle later in the game. 14)Two-Weapon Usage Two-Weapon style is activated with the #twoweapon command. People seem to get confused by it alot so I will run through the commands to get it going. 1)Wield the weapon you want to use as your primary weapon 2)Hit 'x' to switch to your secondary weapon slot 3)Wield the weapon you want to use in your "off-hand" 4)Hit 'x' to switch back to your primary weapon 5)type "#twoweapon" and hit enter Using a twohanded weapon like a pick-axe or unicorn horn will tend to take you out of two-weapon mode so you will probably have to go through the process above to go back to using two weapons. I do not recommend using two weapons until you are already an expert in your primary weapon because you will miss alot otherwise. Once you get expert in your weapons and with two-weapon style, you will do alot of damage. The current version of SlashEM allows you to use 2 artifact weapons simultaneously, this seems excessive to me, but it can be done, but may be removed in the future. 15)Nymphs, Pixies, Green Slimes, Stoners, Liches, and other strange beasties There are monsters that use unusual abilities to make your job more difficult. Stoning Monsters: Carry a lizard corpse. If you start "slowing down", eat it. Note that when you "slow down" you lose intrinsic speed if you had it. Nymphs: If you are fast, nymphs will not present a big problem. Use the "Hit and Move" techniques above to kill them without letting them hit you. You may find it helpful to throw something at them to wake them up from a square away, then move away a couple times to see which turns you will get the "free" attacks on. Pixies, Brownies, Aphrodite: These are monsters that steal stuff from you and are also fast so if you let them move next to you they take your stuff. Wands and spells are the best way of dealing with them, especially sleep wands. If you cannot see invisible and something steals your stuff it is probably a pixie, either try to let your pet kill it or cut your losses and leave the level until you can see it. Telepathy and a blindfold can also help you see it. Green Slimes: Beavis said it all, "Fire! Fire!" Liches: Blessed scroll of genocide. Read it. Choose "L". Ring of conflict can help. Trolls: They follow you upstairs and this can be used against them if you run into a large number of them. Get one to follow you up and kill it until it stays dead. Then go get another one and repeat. You can also eat them and drown them and tin them and lock them in chests and other fun stuff. Engulfing Monsters:Keep your good scrolls and potions in an Oilskin sack inside your blessed Bag of holding and they won't get destroyed. If you are low on hit points, using spells or wands on acidic or fire monsters will lessen the damage you take. 16)Scrolls of Genocide Not a very nice thing to do to a species but... If you can get a blessed one, use it on the L species. Getting rid of all the Liches will greatly decrease your hassles. Then use an uncursed scroll to get rid of Vampire Mages. If you find one early and don't have magic resistance, getting rid of catoblepas can save you a stupid death later. If you have extras, getting rid of Rust monsters and green slimes can be helpful. I've even genocided pixies when they pissed me off once. 17)How do I get a +7 weapon (+8?) Blessed scrolls of enchant weapon are the key. If your weapon is +5 and you read a scroll and it becomes +6 then you need to engrave with it to knock it back down to +5 and then read another scroll on it. Engrave with your +6 weapon, but engrave ONE letter only. Eventually it will jump directly from +5 to +7. Never read a scroll of enchant weapon on a +6 weapon, it will go away. NOTE: If you have a +7 weapon wielded and you then get crowned then it will become +8. This is the only way to get a +8 weapon. 18)Bags of Holding A blessed bag of holding is nearly a necessity. If you turn on the "showweight" option by using the capital O command, it makes it much easier to tell if an unidentified bag is a bag of holding. Pick up the bag and put something with a weight greater than 1 into it. If your weight decreases or increases then the bag is a bag of holding. If your weight decreases by half of the weight of the item then the bag of holding is uncursed, if weight decreases by 3/4 of the weight of the item then the bag is blessed. If weight increases then the bag is cursed! If the bag is cursed do not use it until you can get it uncursed because the items in it will not only weigh more, they will somtimes be destroyed. 19)Chemistry Blessed potions of extra healing will increase your max hit points by 5 if you drink them when fully healed. Potions of Healing can be dipped into a potion of Gain Energy and most of the time will create "diluted" potions of extra healing which can be blessed and will still give you 5 hit points. Collecting potions for a while, using chemistry I have gained up to 300 hit points on my max, and had a Gnome get to 747 hit points (without nurse dancing). Or you can take it one more step and make Extra Healing potions into Gain Ability potions with one more potion of Gain Energy. 20)Gehennom (Hell), Rodney and the Invocation The keys to exploring hell are: make sure to bring a good supply of holy water, don't even think of going until you get magic resistance, don't disturb Rodney until you have located the Vibrating Square and marked it by dropping something on the square NEXT TO IT (it moves if you drop something on it), and don't pray. Rodney does not trouble me very much any more because I save up any wands of death I find for the sole purpose of waxing him. It is especially effective to take an extra turn or two and get him lined up on a square where if he gets missed the first time he can get hit by the ricochet, and maybe even by a second bounce when it bounces off your silver dragon scale mail. (You DO have reflection, right?) Reading the book of the dead without light and music is ill-advised. 21)The Endgame I won't give away TOO much because this is supposed to be the hard part. Wish for a blessed crystal ball (7) just before entering the endgame, and use it to find the portals. Classes with poor magic ability may have problems with the crystal ball though, so cursed scrolls of gold detection may be helpful and wearing the Amulet can help in desperate straits. Amulets of flying are very helpful. An amulet of drain resistance and ring of free action are nice on the Astral Plane. Amulets of Life Saving are nice while you are learning, but I don't use them any more: they lead to carelessness. There are better ways to deal with the Riders than fighting them... 22)Options Use the capital O command to access the options menu. I recommend turning on these options: showweight, showdmg, checkpoint, lit_corridor, number_pad,safe_pet,showexp, invweight I recommend turning off these options: mail, autopickup (you'll end up carrying around crap you don't want or picking up stuff and not noticing otherwise) PRIMARY THINGS TO REMEMBER: Surviving is the better part of valor. Keep an escape route ready and use it. Use speed to not let monsters even take attacks on you whenever possible. Highly Recommended Spoilers from other sites: Magic Cancel value of armor Training pets, Crowning, Thrones, Mixing Potions Disclaimer: Okay, so maybe the steps aren't really that easy, but there are 22 of them. And as to that whole "guarantee" thing, if you didn't ascend within 30 days, you probably didn't really apply yourself: you probably did unnecessary stuff like going to work or school, eating, talking to people, or sleeping. If you had played non-stop for 30 days you could have ascended by now, so stop wasting time reading this nonsense and start playing. : ) slashem-0.0.7E7F3/doc/lev_comp.txt0000664000076400007640000004430010545462317014767 0ustar alialiLEV_COMP(6) LEV_COMP(6) NAME lev_comp - NetHack special levels compiler SYNOPSIS lev_comp [ -w ] [ files ] If no arguments are given, it reads standard input. DESCRIPTION Lev_comp is a special level compiler for NetHack version 3.2 and higher. It takes description files as arguments and produces level files that can be loaded by NetHack at runtime. The purpose of this tool is to provide NetHack administra- tors and implementors with a convenient way for adding special levels to the game, or modifying existing ones, without having to recompile the entire world. The -w option causes lev_comp to perform extra checks on the level and display extra warnings, however these warn- ings are sometimes superfluous, so they are not normally displayed. GRAMMAR file : /* nothing */ | levels ; levels : level | level levels ; level : maze_level | room_level ; maze_level : maze_def flags lev_init messages regions ; room_level : level_def flags lev_init messages rreg_init rooms corridors_def ; level_def : LEVEL_ID ':' string ; lev_init : /* nothing */ | LEV_INIT_ID ':' CHAR ',' CHAR ',' BOOLEAN ',' BOOLEAN ',' light_state ',' walled ; walled : BOOLEAN | RANDOM_TYPE ; flags : /* nothing */ | FLAGS_ID ':' flag_list ; flag_list : FLAG_TYPE ',' flag_list | FLAG_TYPE ; messages : /* nothing */ | message messages ; message : MESSAGE_ID ':' STRING ; rreg_init : /* nothing */ | rreg_init init_rreg ; init_rreg : RANDOM_OBJECTS_ID ':' object_list | RANDOM_MONSTERS_ID ':' monster_list ; rooms : /* Nothing - dummy room for use with INIT_MAP */ | roomlist ; roomlist : aroom | aroom roomlist ; corridors_def : random_corridors | corridors ; random_corridors: RAND_CORRIDOR_ID ; corridors : /* nothing */ | corridors corridor ; corridor : CORRIDOR_ID ':' corr_spec ',' corr_spec | CORRIDOR_ID ':' corr_spec ',' INTEGER ; corr_spec : '(' INTEGER ',' DIRECTION ',' door_pos ')' ; aroom : room_def room_details | subroom_def room_details ; subroom_def : SUBROOM_ID ':' room_type ',' light_state ',' subroom_pos ',' room_size ',' string roomfill ; room_def : ROOM_ID ':' room_type ',' light_state ',' room_pos ',' room_align ',' room_size roomfill ; roomfill : /* nothing */ | ',' BOOLEAN ; room_pos : '(' INTEGER ',' INTEGER ')' | RANDOM_TYPE ; subroom_pos : '(' INTEGER ',' INTEGER ')' | RANDOM_TYPE ; room_align : '(' h_justif ',' v_justif ')' | RANDOM_TYPE ; room_size : '(' INTEGER ',' INTEGER ')' | RANDOM_TYPE ; room_details : /* nothing */ | room_details room_detail ; room_detail : room_name | room_chance | room_door | monster_detail | object_detail | object_flags | trap_detail | altar_detail | fountain_detail | sink_detail | pool_detail | gold_detail | engraving_detail | stair_detail ; room_name : NAME_ID ':' string ; room_chance : CHANCE_ID ':' INTEGER ; room_door : DOOR_ID ':' secret ',' door_state ',' door_wall ',' door_pos ; secret : BOOLEAN | RANDOM_TYPE ; door_wall : DIRECTION | RANDOM_TYPE ; door_pos : INTEGER | RANDOM_TYPE ; maze_def : MAZE_ID ':' string ',' filling ; filling : CHAR | RANDOM_TYPE ; regions : aregion | aregion regions ; aregion : map_definition reg_init map_details ; map_definition : NOMAP_ID | map_geometry MAP_ID ; map_geometry : GEOMETRY_ID ':' h_justif ',' v_justif ; h_justif : LEFT_OR_RIGHT | CENTER ; v_justif : TOP_OR_BOT | CENTER ; reg_init : /* nothing */ | reg_init init_reg ; init_reg : RANDOM_OBJECTS_ID ':' object_list | RANDOM_PLACES_ID ':' place_list | RANDOM_PLACES_ID '[' INTEGER ']' ':' place_list | RANDOM_MONSTERS_ID ':' monster_list | rndlevregion ; object_list : object | object ',' object_list ; monster_list : monster | monster ',' monster_list ; place_list : place | place ',' place_list ; map_details : /* nothing */ | map_details map_detail ; map_detail : monster_detail | object_detail | object_flags | door_detail | trap_detail | drawbridge_detail | region_detail | stair_region | portal_region | teleprt_region | branch_region | altar_detail | fountain_detail | mazewalk_detail | wallify_detail | ladder_detail | stair_detail | gold_detail | engraving_detail | diggable_detail | passwall_detail ; monster_detail : MONSTER_ID chance ':' monster_c ',' m_name ',' coordinate monster_infos ; monster_infos : /* nothing */ | monster_infos monster_info ; monster_info : ',' string | ',' MON_ATTITUDE | ',' MON_ALERTNESS | ',' alignment | ',' MON_APPEARANCE string ; object_detail : OBJECT_ID object_desc | COBJECT_ID object_desc ; object_desc : chance ':' object_c ',' o_name ',' object_where object_infos ; object_where : coordinate | CONTAINED ; object_infos : /* nothing */ | ',' curse_state ',' monster_id ',' enchantment optional_name | ',' curse_state ',' enchantment optional_name | ',' monster_id ',' enchantment optional_name ; object_flags : OBJFLAGS_ID ':' obj_flag_list obj_flag_list : obj_flag_list ',' OBJFLAG_TYPE | OBJFLAG_TYPE ; curse_state : RANDOM_TYPE | CURSE_TYPE ; monster_id : STRING ; enchantment : RANDOM_TYPE | INTEGER ; optional_name : /* nothing */ | ',' NONE | ',' STRING ; door_detail : DOOR_ID ':' door_state ',' coordinate ; trap_detail : TRAP_ID chance ':' trap_name ',' coordinate ; drawbridge_detail: DRAWBRIDGE_ID ':' coordinate ',' DIRECTION ',' door_state ; mazewalk_detail : MAZEWALK_ID ':' coordinate ',' DIRECTION ; wallify_detail : WALLIFY_ID ; ladder_detail : LADDER_ID ':' coordinate ',' UP_OR_DOWN ; stair_detail : STAIR_ID ':' coordinate ',' UP_OR_DOWN ; stair_region : STAIR_ID ':' lev_region ',' lev_region ',' UP_OR_DOWN ; rndlevregion : RANDOMREGION_ID '[' INTEGER ']' ':' lev_region ',' lev_region ; portal_region : PORTAL_ID ':' lev_region ',' lev_region ',' string ; teleprt_region : TELEPRT_ID ':' lev_region ',' lev_region teleprt_detail ; branch_region : BRANCH_ID ':' lev_region ',' lev_region ; teleprt_detail : /* empty */ | ',' UP_OR_DOWN ; lev_region : region | LEV '(' INTEGER ',' INTEGER ',' INTEGER ',' INTEGER ')' ; fountain_detail : FOUNTAIN_ID ':' coordinate ; sink_detail : SINK_ID ':' coordinate ; pool_detail : POOL_ID ':' coordinate ; diggable_detail : NON_DIGGABLE_ID ':' region ; passwall_detail : NON_PASSWALL_ID ':' region ; region_detail : REGION_ID ':' region ',' light_state ',' room_type prefilled ; altar_detail : ALTAR_ID ':' coordinate ',' alignment ',' altar_type ; gold_detail : GOLD_ID ':' amount ',' coordinate ; engraving_detail: ENGRAVING_ID ':' coordinate ',' engraving_type ',' string ; monster_c : monster | RANDOM_TYPE | m_register ; object_c : object | RANDOM_TYPE | o_register ; m_name : string | RANDOM_TYPE ; o_name : string | RANDOM_TYPE ; trap_name : string | RANDOM_TYPE ; room_type : string | RANDOM_TYPE ; prefilled : /* empty */ | ',' FILLING | ',' FILLING ',' BOOLEAN ; coordinate : coord | p_register | r_register | RANDOM_TYPE ; door_state : DOOR_STATE | RANDOM_TYPE ; light_state : LIGHT_STATE | RANDOM_TYPE ; alignment : ALIGNMENT | a_register | RANDOM_TYPE ; altar_type : ALTAR_TYPE | RANDOM_TYPE ; p_register : P_REGISTER '[' INTEGER ']' | P_REGISTER '[' INTEGER ']' '[' INTEGER ']' ; r_register : R_REGISTER '[' INTEGER ']' ; o_register : O_REGISTER '[' INTEGER ']' ; m_register : M_REGISTER '[' INTEGER ']' ; a_register : A_REGISTER '[' INTEGER ']' ; place : coord | NONE ; monster : CHAR ; object : CHAR ; string : STRING ; amount : INTEGER | RANDOM_TYPE ; chance : /* empty */ | PERCENT ; engraving_type : ENGRAVING_TYPE | RANDOM_TYPE ; coord : '(' INTEGER ',' INTEGER ')' ; region : '(' INTEGER ',' INTEGER ',' INTEGER ',' INTEGER ')' ; NOTE: Lines beginning with '#' are considered comments. Each region in a special level may use either single or multiple random placement list commands but these commands should not be mixed within a region. Single random place- ment list commands are "RANDOM_PLACES:" and "place[n]"; multiple random placement list commands are "RAN- DOM_PLACES[l]:" and "place[l][n]". Where multiple random placement lists are used they must be specified in increasing order with no gaps. The first number in "place[l][n]" specifies the list number and the second number the index into the shuffled list. Lists may be of varying lengths and are shuffled independently. The contents of a "MAP" description of a maze is a rectan- gle showing the exact level map that should be used for the given part of a maze. Each character in the map cor- responds to a location on the screen. Different location types are denoted using different ASCII characters. The following characters are recognized. To give an idea of how these are used, see the EXAMPLE, below. The maximum size of a map is normally 76 columns by 21 rows. '-' horizontal wall '|' vertical wall '+' a doorway (state is specified in a DOOR declaration) 'A' open air 'B' boundary room location (for bounding unwalled irregular regions) 'C' cloudy air 'I' ice 'S' a secret door 'H' a secret corridor '{' a fountain '\' a throne 'K' a sink (if SINKS is defined, else a room location) 'Z' a toilet (if SINKS is defined, else a room location) '}' a part of a moat or other deep water 'P' a pool 'L' lava 'W' water (yes, different from a pool) 'T' a tree 'F' iron bars '#' a corridor '.' a normal room location (unlit unless lit in a REGION declaration) ' ' stone EXAMPLE Here is an example of a description file (a very simple one): MAZE : "fortress", random GEOMETRY : center , center MAP }}}}}}}}} }}}|-|}}} }}|-.-|}} }|-...-|} }|.....|} }|-...-|} }}|-.-|}} }}}|-|}}} }}}}}}}}} ENDMAP MONSTER: '@', "Wizard of Yendor", (4,4) OBJECT: '"', "Amulet of Yendor", (4,4) # a hell hound flanking the Wiz on a random side RANDOM_PLACES: (4,3), (4,5), (3,4), (5,4) MONSTER: 'd', "hell hound", place[0] # a chest on another random side OBJECT: '(', "chest", place[1] # a sack on a random side, with a diamond and maybe a ruby in it CONTAINER: '(', "sack", place[2] OBJECT: '*', "diamond", contained OBJECT[50%]: '*', "ruby", contained # a random dragon somewhere MONSTER: 'D', random, random # 3 out of 4 chance for a random trap in the EAST end TRAP[75%]: random, (6,4) # an electric eel below the SOUTH end MONSTER: ';', "electric eel", (4,8) # make the walls non-diggable NON_DIGGABLE: (0,0,8,8) TELEPORT_REGION: levregion(0,0,79,20), (0,0,8,8) This example will produce a file named "fortress" that can be integrated into one of the numerous mazes of the game. Note especially the final, TELEPORT_REGION specification. This says that level teleports or other non-stairway arrivals on this level can land anywhere on the level except the area of the map. This shows the use of the ``levregion'' prefix allowed in certain region specifica- tions. Normally, regions apply only to the most recent MAP specification, but when prefixed with ``levregion'', one can refer to any area of the level, regardless of the placement of the current MAP in the level. AUTHOR Jean-Christophe Collet, David Cohrs. SEE ALSO dgn_comp(6), nethack(6) BUGS Probably infinite. Most importantly, still needs addi- tional bounds checking. 16 May 1996 LEV_COMP(6) slashem-0.0.7E7F3/doc/fr/0000775000076400007640000000000010545462317013030 5ustar alialislashem-0.0.7E7F3/doc/fr/slashem.60000664000076400007640000002461410545462317014562 0ustar aliali.TH SLASHEM 6 "24 Mars 2002" .UC 4 .SH NOM slashem \- Explorez les labyrinthes de la menace .SH SYNOPSIS .na .hy 0 .B slashem [ .B \-d .I dossier ] [ .B \-n ] [ .B \-p .I profession (classe) ] [ .B \-r .I race ] [ .B \-g .I sexe ] [ .B \-a .I alignement ] [ .B \-[DX] ] [ .B \-u .I nom du personnage ] [ .B \-dec ] [ .B \-ibm ] .PP .B slashem [ .B \-d .I dossier ] .B \-s [ .B \-v ] [ .B \-p .I profession (classe) ] [ .B \-r .I race ] [ .B \-g .I sexe ] [ .B \-a .I alignement ] [ .I rang maximum ] [ .I noms du personnage ] .ad .hy 14 .SH DESCRIPTION .PP .I SLASH'EM est un jeu inspiré de Donjons & Dragons(tm). La sortie standard dans le terminal et la structure des commandes ressemblent à celles de rogue. C'est une extension de SLASH, qui est une extension de NetHack. .PP D'autres sorties graphiques sont disponibles si vous utilisez un PC ou une interface X11. .PP Pour commencer, vous n'aurez réellement besoin que de deux commandes. La commande .B ? vous fournira une liste des commandes disponibles (ainsi que d'autres informations) et la commande .B / identifiera les choses que vous voyez à l'écran. .PP Pour gagner le jeu (au lieu de simplement jouer pour battre les scores des autres joueurs) vous devez localiser l'Amulette de Yender qui est quelque part en dessous du vingtième niveau du donjon, et l'en faire sortir. Personne n'a encore accompli cet exploit\ ; quiconque y parviendrait serait probablement inscrit dans l'histoire en tant que héros parmi les héros. .PP Lorsque le jeu prend fin, que vous soyez mort, sorti des caves, ou que vous ayez quitté le jeu, .I SLASH'EM vous donnera (un fragment de) la liste des meilleurs scores. Le score est basé sur beaucoup d'aspects de votre comportement, mais une évaluation grossière est obtenue en prenant la quantité d'or que vous avez trouvé dans les caves ajoutée à votre expérience multipliée par quatre. Des pierres précieuses peuvent vous apporter beaucoup d'or à la sortie. Il y a une pénalité de 10% lorsque vous vous suicidez. .PP La variable d'environnement SLASHEMOPTIONS peut être utilisée pour initialiser de nombreuses options à l'exécution. La commande ? vous fourni une description de ces option et leur syntaxe. Les options .B \-dec et .B \-ibm de la ligne de commande sont équivalents aux options .B decgraphics et .B ibmgraphics à l'exécution décrites ici, et sont fournie purement pour la convenance sur les systèmes qui supportent plusieurs types de terminaux. .PP La liste d'options pouvant être très longue (particulièrement quand on spécifie des caractères graphiques), les options peuvent être incluses dans un fichier de configuration. Il est par défaut placé dans votre dossier home et nommé .slashemrc sur les systèmes Unix. Sur d'autres systèmes, il peut être différent, habituellement SLASHEM.cnf. Sous DOS ou Windows, le nom est defaults.nh, alors que sous Macintosh ou BeOS, le nom est SlashEM Defaults. L'emplacement du fichier de configuration peut être spécifiée en initialisant le paramètre SLASHEMOPTIONS par une chaîne de caractères sous la forme d'un\ @ suivie par l'emplacement du fichier. .PP L'option .B \-u .I nom du personnage répond à la question «\ Who are you?\ » (qui signifie «\ Comment vous appelez-vous\ ?\ »). Elle remplace tout nom des options ou du fichier de configuration, USER, LOGNAME, ou getlogin(), qui seront autrement triés dans cet ordre. Si aucun ne fournit un nom utilisable, il en sera demandé un au joueur. Les noms du personnage (en conjonction avec les uids) sont utilisés pour identifier les fichiers de sauvegarde, ce qui permet de sauver plusieurs parties sous des noms différents. En contrepartie, vous devez utiliser le nom approprié pour retrouver une partie. .PP Un suffixe de .I nom de personnage peut être utilisé pour spécifier la profession, la race, l'alignement, et/ou le sexe du personnage. La syntaxe complète du suffixe de nom de personnage est "nom-ppp-rrr-aaa-sss". "ppp" sont les trois premières lettres de la profession (qui peut aussi être spécifiée par une option .B \-p .I profession séparée). "rrr" sont les trois premières lettres de la race du personnage (qui peut aussi être spécifiée par une option .B \-r .I race séparée). "aaa" sont les trois premières lettres de l'alignement du personnage, et "sss" sont les trois premières lettres du sexe du personnage (ndt\ : dans la version anglaise, "mal" ou "fem"). Il n'est pas obligatoire de remplir chaque partie du suffixe. .PP .B \-p .I profession peut être utilisé pour déterminer la classe du personnage. Vous pouvez spécifier le nom masculin ou féminin pour la classe du personnage, ou les trois premières lettres de la classe comme abréviation. .B "\-p \@" signifie qu'une classe aléatoire doit être choisie. @ peut nécessiter d'être précédé d'un antislash (\\@) si @ est le caractère "kill" pour le terminal (c.f. "stty"), afin d'empêcher la ligne d'être supprimée. .PP Également, .B \-r .I race peut être utilisé pour choisir explicitement la race du personnage, .B \-g .I sexe pour son sexe, et enfin .B \-a .I alignement pour son alignement. .PP Si vous ne spécifiez pas l'une de ces caractéristiques, vous serez interrogé au démarrage du jeu et devrez fournir l'information manquante. .PP Au lieu de les définir séparément, vous pouvez les ajouter en tant que suffixes au nom du personnage : .B \-u .I nom\-race\-sexe\-alignement .PP L'option .B \-s seule affichera la liste de vos scores dans la version actuelle. Une option .B \-v suivant immédiatement rapporte la liste des scores dans toutes les versions présentes. L'option .B \-s peut être aussi suivie par des arguments concernant le type du joueur. .B \-p , .B \-r , .B \-g et .B \-a ) affichent les scores de types particuliers de joueurs. Ces options peuvent aussi êtres suivies par un ou plusieurs noms de personnages afin d'afficher les scores des personnages mentionnés, par 'all' pour afficher tous les scores, ou par un nombre pour afficher les scores qui le surpassent. .PP L'option .B \-n supprime l'affichage de toute news de l'administrateur du jeu. .PP L'option .B \-D ou .B \-X démarrera le jeu dans un mode découverte spécial ou les scores ne seront pas pris en compte. .B \-D va, si le joueur est l'administrateur du jeu, le démarrer en mode déboguage (assisté). .PP L'option .B \-d , qui doit être le premier argument si elle est utilisée, fournit un dossier qui sert au jeu. Il remplace la valeur de NETHACKDIR, HACKDIR, ou du dossier spécifié par l'administrateur du jeu pendant la compilation (habituellement /usr/local/slashemdir). Cette option n'est bien souvent utile qu'à l'administrateur du jeu. L'aire de jeu doit contenir plusieurs fichiers auxiliaires comme des fichiers d'aide, la liste des meilleurs scores, et un sous-dossier .I save ou les parties sont sauvegardées. .SH AUTEURS .PP Jay Fenlason (+ Kenny Woodland, Mike Thome et Jon Payne) écrivirent le code original, qui ressemblait beaucoup plus à rogue (mais rempli de bogues). .PP Andries Brouwer a sans interruption déformé leurs sources en un jeu entièrement différent. .PP Mike Stephenson a continué la perversion des sources, ajoutant divers classes de personnages tordues, et des pièges sadiques avec l'aide de nombreuses personnes étranges qui résident dans cet endroit entre les mondes, Usenet. Un certain nombre de ces contributeurs sont immortalisés dans l'historique rouleau du déshonneur et dans divers autres endroits. .PP Le désordre en résultant est à présent nommé NetHack, pour dénoter son développement par le Usenet. Andries Brouwer a fait la demande pour cette distinction, comme il a éventuellement sorti une nouvelle version du sien. .PP Tom Proudfoot pris NetHack et le transforma en SLASH - SuperLotsaAddedStuffHack (qui signifie « Beaucoup d'ajouts géniaux au code substantiel\ »), ajoutant plus de classes de personnages, de monstres, et changeant leur comportement. .PP Warren Cheung pris SLASH et le transforma en SLASHEM - SuperLotsaAddedStuffHack - Extended Magic (qui signifie «\ Beaucoup d'ajouts géniaux au code substantiel - magie étendue\ »), avec plus d'améliorations au «\ behemoth gonflé\ » (ndt\ : une obscurité linguistique intraduisible). .SH FICHIERS .PP Tous les fichiers sont dans le dossier du jeu, normalement /usr/local/slashemdir. Si DLB a été défini pendant la compilation, les fichiers de données et les niveaux spéciaux seront dans un gros fichier, normalement nhdat, au lieu d'être séparés en plusieurs fichiers. .br .DT .ta \w'cmdhelp, opthelp, wizhelp\ \ \ 'u slashem Le programme lui-même. .br data, oracles, rumors Des fichiers de données utilisés .br par SLASH'EM. .br options, quest.dat D'autres fichiers de données. .br help, hh Les fichiers d'aide. .br cmdhelp, opthelp, wizhelp D'autres fichiers d'aide. .br *.lev Des niveaux spéciaux prédéfinis. .br dungeon Le fichier de contrôle pour les .br niveaux spéciaux. .br history Un court historique de SLASH'EM. .br license Les règles concernant la redistribution .br du programme. .br record La liste des meilleurs scores. .br logfile Une liste étendue des parties .br jouées. .br xlock.nnn La description d'un niveau du donjon. .br perm Un fichier de verrouillage pour xlock.dd. .br bonesDD.nn Les descriptions des fantômes et des .br affaires des aventuriers décédés. .br save Un sous dossier contenant les .br parties sauvegardées. .SH ENVIRONEMENT .DT .ta \w'HACKPAGER or PAGER\ \ \ 'u USER or LOGNAME Votre nom d'utilisateur. .br HOME Votre dossier home. .br SHELL Votre shell. .br TERM Le type de votre terminal. .br HACKPAGER or PAGER Un remplacement pour le pager par défaut. .br MAIL Les fichiers de votre boite aux lettres. .br MAILREADER Un remplacement pour le lecteur par défaut. .br (probablement /bin/mail ou /usr/ucb/mail). .br NETHACKDIR Le dossier du jeu. .br SLASHEMOPTIONS Une chaîne de caractère prédéfinissant .br de nombreuses options à SLASH'EM. .br De plus, SHOPTYPE est utilisé dans le mode déboguage (assisté). .SH "VOIR AUSSI" .PP dgn_comp(6), lev_comp(6), recover(6) .SH BOGUES .PP Probablement infinis. .PP Donjon & Dragons est une marque déposée de Wizards of the Coast, Inc. .SH TRADUCTION Ce document est une traduction, réalisée par Rémi Delrue le 11 juin 2006. L'équipe de traduction a fait le maximum pour réaliser une adaptation française de qualité. La version anglaise la plus à jour de ce document est toujours consultable via la commande : LANGUAGE=en\ man\ slashem slashem-0.0.7E7F3/doc/lev_comp.60000664000076400007640000002666110545462317014327 0ustar aliali.TH LEV_COMP 6 "16 May 1996" .UC 4 .SH NAME lev_comp \- NetHack special levels compiler .SH SYNOPSIS .B lev_comp [ .B \-w ] [ .I files ] .PP If no arguments are given, it reads standard input. .SH DESCRIPTION .PP .I Lev_comp is a special level compiler for NetHack version 3.2 and higher. It takes description files as arguments and produces level files that can be loaded by NetHack at runtime. .PP The purpose of this tool is to provide NetHack administrators and implementors with a convenient way for adding special levels to the game, or modifying existing ones, without having to recompile the entire world. .PP The .B \-w option causes .I lev_comp to perform extra checks on the level and display extra warnings, however these warnings are sometimes superfluous, so they are not normally displayed. .SH GRAMMAR .PP .LP .nf .ta +8n +8n +8n +8n file : /* nothing */ | levels ; levels : level | level levels ; level : maze_level | room_level ; maze_level : maze_def flags lev_init messages regions ; room_level : level_def flags lev_init messages rreg_init rooms corridors_def ; level_def : LEVEL_ID ':' string ; lev_init : /* nothing */ | LEV_INIT_ID ':' CHAR ',' CHAR ',' BOOLEAN ',' BOOLEAN ',' light_state ',' walled ; walled : BOOLEAN | RANDOM_TYPE ; flags : /* nothing */ | FLAGS_ID ':' flag_list ; flag_list : FLAG_TYPE ',' flag_list | FLAG_TYPE ; messages : /* nothing */ | message messages ; message : MESSAGE_ID ':' STRING ; rreg_init : /* nothing */ | rreg_init init_rreg ; init_rreg : RANDOM_OBJECTS_ID ':' object_list | RANDOM_MONSTERS_ID ':' monster_list ; rooms : /* Nothing - dummy room for use with INIT_MAP */ | roomlist ; roomlist : aroom | aroom roomlist ; corridors_def : random_corridors | corridors ; random_corridors: RAND_CORRIDOR_ID ; corridors : /* nothing */ | corridors corridor ; corridor : CORRIDOR_ID ':' corr_spec ',' corr_spec | CORRIDOR_ID ':' corr_spec ',' INTEGER ; corr_spec : '(' INTEGER ',' DIRECTION ',' door_pos ')' ; aroom : room_def room_details | subroom_def room_details ; subroom_def : SUBROOM_ID ':' room_type ',' light_state ',' subroom_pos ',' room_size ',' string roomfill ; room_def : ROOM_ID ':' room_type ',' light_state ',' room_pos ',' room_align ',' room_size roomfill ; roomfill : /* nothing */ | ',' BOOLEAN ; room_pos : '(' INTEGER ',' INTEGER ')' | RANDOM_TYPE ; subroom_pos : '(' INTEGER ',' INTEGER ')' | RANDOM_TYPE ; room_align : '(' h_justif ',' v_justif ')' | RANDOM_TYPE ; room_size : '(' INTEGER ',' INTEGER ')' | RANDOM_TYPE ; room_details : /* nothing */ | room_details room_detail ; room_detail : room_name | room_chance | room_door | monster_detail | object_detail | object_flags | trap_detail | altar_detail | fountain_detail | sink_detail | pool_detail | gold_detail | engraving_detail | stair_detail ; room_name : NAME_ID ':' string ; room_chance : CHANCE_ID ':' INTEGER ; room_door : DOOR_ID ':' secret ',' door_state ',' door_wall ',' door_pos ; secret : BOOLEAN | RANDOM_TYPE ; door_wall : DIRECTION | RANDOM_TYPE ; door_pos : INTEGER | RANDOM_TYPE ; maze_def : MAZE_ID ':' string ',' filling ; filling : CHAR | RANDOM_TYPE ; regions : aregion | aregion regions ; aregion : map_definition reg_init map_details ; map_definition : NOMAP_ID | map_geometry MAP_ID ; map_geometry : GEOMETRY_ID ':' h_justif ',' v_justif ; h_justif : LEFT_OR_RIGHT | CENTER ; v_justif : TOP_OR_BOT | CENTER ; reg_init : /* nothing */ | reg_init init_reg ; init_reg : RANDOM_OBJECTS_ID ':' object_list | RANDOM_PLACES_ID ':' place_list | RANDOM_PLACES_ID '[' INTEGER ']' ':' place_list | RANDOM_MONSTERS_ID ':' monster_list | rndlevregion ; object_list : object | object ',' object_list ; monster_list : monster | monster ',' monster_list ; place_list : place | place ',' place_list ; map_details : /* nothing */ | map_details map_detail ; map_detail : monster_detail | object_detail | object_flags | door_detail | trap_detail | drawbridge_detail | region_detail | stair_region | portal_region | teleprt_region | branch_region | altar_detail | fountain_detail | mazewalk_detail | wallify_detail | ladder_detail | stair_detail | gold_detail | engraving_detail | diggable_detail | passwall_detail ; monster_detail : MONSTER_ID chance ':' monster_c ',' m_name ',' coordinate monster_infos ; monster_infos : /* nothing */ | monster_infos monster_info ; monster_info : ',' string | ',' MON_ATTITUDE | ',' MON_ALERTNESS | ',' alignment | ',' MON_APPEARANCE string ; object_detail : OBJECT_ID object_desc | COBJECT_ID object_desc ; object_desc : chance ':' object_c ',' o_name ',' object_where object_infos ; object_where : coordinate | CONTAINED ; object_infos : /* nothing */ | ',' curse_state ',' monster_id ',' enchantment optional_name | ',' curse_state ',' enchantment optional_name | ',' monster_id ',' enchantment optional_name ; object_flags : OBJFLAGS_ID ':' obj_flag_list obj_flag_list : obj_flag_list ',' OBJFLAG_TYPE | OBJFLAG_TYPE ; curse_state : RANDOM_TYPE | CURSE_TYPE ; monster_id : STRING ; enchantment : RANDOM_TYPE | INTEGER ; optional_name : /* nothing */ | ',' NONE | ',' STRING ; door_detail : DOOR_ID ':' door_state ',' coordinate ; trap_detail : TRAP_ID chance ':' trap_name ',' coordinate ; drawbridge_detail: DRAWBRIDGE_ID ':' coordinate ',' DIRECTION ',' door_state ; mazewalk_detail : MAZEWALK_ID ':' coordinate ',' DIRECTION ; wallify_detail : WALLIFY_ID ; ladder_detail : LADDER_ID ':' coordinate ',' UP_OR_DOWN ; stair_detail : STAIR_ID ':' coordinate ',' UP_OR_DOWN ; stair_region : STAIR_ID ':' lev_region ',' lev_region ',' UP_OR_DOWN ; rndlevregion : RANDOMREGION_ID '[' INTEGER ']' ':' lev_region ',' lev_region ; portal_region : PORTAL_ID ':' lev_region ',' lev_region ',' string ; teleprt_region : TELEPRT_ID ':' lev_region ',' lev_region teleprt_detail ; branch_region : BRANCH_ID ':' lev_region ',' lev_region ; teleprt_detail : /* empty */ | ',' UP_OR_DOWN ; lev_region : region | LEV '(' INTEGER ',' INTEGER ',' INTEGER ',' INTEGER ')' ; fountain_detail : FOUNTAIN_ID ':' coordinate ; sink_detail : SINK_ID ':' coordinate ; pool_detail : POOL_ID ':' coordinate ; diggable_detail : NON_DIGGABLE_ID ':' region ; passwall_detail : NON_PASSWALL_ID ':' region ; region_detail : REGION_ID ':' region ',' light_state ',' room_type prefilled ; altar_detail : ALTAR_ID ':' coordinate ',' alignment ',' altar_type ; gold_detail : GOLD_ID ':' amount ',' coordinate ; engraving_detail: ENGRAVING_ID ':' coordinate ',' engraving_type ',' string ; monster_c : monster | RANDOM_TYPE | m_register ; object_c : object | RANDOM_TYPE | o_register ; m_name : string | RANDOM_TYPE ; o_name : string | RANDOM_TYPE ; trap_name : string | RANDOM_TYPE ; room_type : string | RANDOM_TYPE ; prefilled : /* empty */ | ',' FILLING | ',' FILLING ',' BOOLEAN ; coordinate : coord | p_register | r_register | RANDOM_TYPE ; door_state : DOOR_STATE | RANDOM_TYPE ; light_state : LIGHT_STATE | RANDOM_TYPE ; alignment : ALIGNMENT | a_register | RANDOM_TYPE ; altar_type : ALTAR_TYPE | RANDOM_TYPE ; p_register : P_REGISTER '[' INTEGER ']' | P_REGISTER '[' INTEGER ']' '[' INTEGER ']' ; r_register : R_REGISTER '[' INTEGER ']' ; o_register : O_REGISTER '[' INTEGER ']' ; m_register : M_REGISTER '[' INTEGER ']' ; a_register : A_REGISTER '[' INTEGER ']' ; place : coord | NONE ; monster : CHAR ; object : CHAR ; string : STRING ; amount : INTEGER | RANDOM_TYPE ; chance : /* empty */ | PERCENT ; engraving_type : ENGRAVING_TYPE | RANDOM_TYPE ; coord : '(' INTEGER ',' INTEGER ')' ; region : '(' INTEGER ',' INTEGER ',' INTEGER ',' INTEGER ')' ; .fi .PP .I NOTE: .br Lines beginning with '#' are considered comments. .PP Each region in a special level may use either single or multiple random placement list commands but these commands should not be mixed within a region. Single random placement list commands are "RANDOM_PLACES:" and "place[n]"; multiple random placement list commands are "RANDOM_PLACES[l]:" and "place[l][n]". Where multiple random placement lists are used they must be specified in increasing order with no gaps. The first number in "place[l][n]" specifies the list number and the second number the index into the shuffled list. Lists may be of varying lengths and are shuffled independently. .PP The contents of a "MAP" description of a maze is a rectangle showing the exact level map that should be used for the given part of a maze. Each character in the map corresponds to a location on the screen. Different location types are denoted using different ASCII characters. The following characters are recognized. To give an idea of how these are used, see the EXAMPLE, below. The maximum size of a map is normally 76 columns by 21 rows. .LP .nf .ta +8n +8n +8n \&'-' horizontal wall \&'|' vertical wall \&'+' a doorway (state is specified in a DOOR declaration) \&'A' open air \&'B' boundary room location (for bounding unwalled irregular regions) \&'C' cloudy air \&'I' ice \&'S' a secret door \&'H' a secret corridor \&'{' a fountain \&'\\' a throne \&'K' a sink (if SINKS is defined, else a room location) \&'Z' a toilet (if SINKS is defined, else a room location) \&'}' a part of a moat or other deep water \&'P' a pool \&'L' lava \&'W' water (yes, different from a pool) \&'T' a tree \&'F' iron bars \&'#' a corridor \&'.' a normal room location (unlit unless lit in a REGION declaration) \&' ' stone .fi .SH EXAMPLE .PP Here is an example of a description file (a very simple one): .LP .nf .ta +8n +8n +8n MAZE : "fortress", random GEOMETRY : center , center MAP }}}}}}}}} }}}|-|}}} }}|-.-|}} }|-...-|} }|.....|} }|-...-|} }}|-.-|}} }}}|-|}}} }}}}}}}}} ENDMAP MONSTER: '@', "Wizard of Yendor", (4,4) OBJECT: '"', "Amulet of Yendor", (4,4) # a hell hound flanking the Wiz on a random side RANDOM_PLACES: (4,3), (4,5), (3,4), (5,4) MONSTER: 'd', "hell hound", place[0] # a chest on another random side OBJECT: '(', "chest", place[1] # a sack on a random side, with a diamond and maybe a ruby in it CONTAINER: '(', "sack", place[2] OBJECT: '*', "diamond", contained OBJECT[50%]: '*', "ruby", contained # a random dragon somewhere MONSTER: 'D', random, random # 3 out of 4 chance for a random trap in the EAST end TRAP[75%]: random, (6,4) # an electric eel below the SOUTH end MONSTER: ';', "electric eel", (4,8) # make the walls non-diggable NON_DIGGABLE: (0,0,8,8) TELEPORT_REGION: levregion(0,0,79,20), (0,0,8,8) .fi .PP This example will produce a file named "fortress" that can be integrated into one of the numerous mazes of the game. .PP Note especially the final, TELEPORT_REGION specification. This says that level teleports or other non-stairway arrivals on this level can land anywhere on the level except the area of the map. This shows the use of the ``levregion'' prefix allowed in certain region specifications. Normally, regions apply only to the most recent MAP specification, but when prefixed with ``levregion'', one can refer to any area of the level, regardless of the placement of the current MAP in the level. .SH AUTHOR .PP Jean-Christophe Collet, David Cohrs. .SH "SEE ALSO" .PP dgn_comp(6), nethack(6) .SH BUGS .PP Probably infinite. Most importantly, still needs additional bounds checking. slashem-0.0.7E7F3/doc/nethack.60000664000076400007640000001756310545462317014141 0ustar aliali.TH NETHACK 6 "9 August 2002" .UC 4 .SH NAME nethack \- Exploring The Mazes of Menace .SH SYNOPSIS .na .hy 0 .B nethack [ .B \-d .I directory ] [ .B \-n ] [ .B \-p .I profession (role) ] [ .B \-r .I race ] [ .B \-[DX] ] [ .B \-u .I playername ] [ .B \-dec ] [ .B \-ibm ] .PP .B nethack [ .B \-d .I directory ] .B \-s [ .B \-v ] [ .B \-p .I profession (role) ] [ .B \-r .I race ] [ .I playernames ] .ad .hy 14 .SH DESCRIPTION .PP .I NetHack is a display oriented Dungeons & Dragons(tm) - like game. The standard tty display and command structure resemble rogue. .PP Other, more graphical display options exist if you are using either a PC, or an X11 interface. .PP To get started you really only need to know two commands. The command .B ? will give you a list of the available commands (as well as other information) and the command .B / will identify the things you see on the screen. .PP 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. .PP When the game ends, whether by your dying, quitting, or escaping from the caves, .I 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. .PP The environment variable NETHACKOPTIONS can be used to initialize many run-time options. The ? command provides a description of these options and syntax. (The .B \-dec and .B \-ibm command line options are equivalent to the .B decgraphics and .B ibmgraphics run-time options described there, and are provided purely for convenience on systems supporting multiple types of terminals.) .PP 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 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 The .B \-u .I 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. .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 male or female name for the character role, or the first three characters of the role as an abbreviation. .B "\-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. .PP Likewise, .B \-r .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 option alone will print out the list of your scores on the current version. An immediately following .B \-v reports on all versions present in the score file. The .B \-s may also be followed by arguments .B \-p and .B \-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. .PP The .B \-n option suppresses printing of any news from the game administrator. .PP The .B \-D or .B \-X option will start the game in a special non-scoring discovery mode. .B \-D will, if the player is the game administrator, start in debugging (wizard) mode instead. .PP The .B \-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, 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. The playground must contain several auxiliary files such as help files, the list of top scorers, and a subdirectory .I save where games are saved. .SH AUTHORS .PP Jay Fenlason (+ Kenny Woodland, Mike Thome and Jon Payne) wrote the original hack, very much like rogue (but full of bugs). .PP Andries Brouwer continuously deformed their sources into an entirely different game. .PP 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. .PP 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. .SH FILES .PP 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. .br .DT .ta \w'cmdhelp, opthelp, wizhelp\ \ \ 'u nethack The program itself. .br data, oracles, rumors Data files used by NetHack. .br options, quest.dat More data files. .br help, hh Help data files. .br cmdhelp, opthelp, wizhelp More help data files. .br *.lev Predefined special levels. .br dungeon Control file for special levels. .br history A short history of NetHack. .br license Rules governing redistribution. .br record The list of top scorers. .br logfile An extended list of games .br played. .br xlock.nnn Description of a dungeon level. .br perm Lock file for xlock.dd. .br bonesDD.nn Descriptions of the ghost and .br belongings of a deceased .br adventurer. .br save A subdirectory containing the .br saved games. .SH ENVIRONMENT .DT .ta \w'HACKPAGER or PAGER\ \ \ 'u USER or LOGNAME Your login name. .br HOME Your home directory. .br SHELL Your shell. .br TERM The type of your terminal. .br HACKPAGER or PAGER Replacement for default pager. .br MAIL Mailbox file. .br MAILREADER Replacement for default reader .br (probably /bin/mail or /usr/ucb/mail). .br NETHACKDIR Playground. .br NETHACKOPTIONS String predefining several NetHack .br options. .br In addition, SHOPTYPE is used in debugging (wizard) mode. .SH "SEE ALSO" .PP dgn_comp(6), lev_comp(6), recover(6) .SH BUGS .PP Probably infinite. .PP Dungeons & Dragons is a Trademark of Wizards of the Coast, Inc. slashem-0.0.7E7F3/doc/slashem.60000664000076400007640000002116510545462317014151 0ustar aliali.TH SLASHEM 6 "24 March 2002" .UC 4 .SH NAME slashem \- Exploring The Mazes of Menace .SH SYNOPSIS .na .hy 0 .B slashem [ .B \-d .I directory ] [ .B \-n ] [ .B \-p .I profession (role) ] [ .B \-r .I race ] [ .B \-g .I gender ] [ .B \-a .I alignment ] [ .B \-[DX] ] [ .B \-u .I playername ] [ .B \-dec ] [ .B \-ibm ] .PP .B slashem [ .B \-d .I directory ] .B \-s [ .B \-v ] [ .B \-p .I profession (role) ] [ .B \-r .I race ] [ .B \-g .I gender ] [ .B \-a .I alignment ] [ .I maxrank ] [ .I playernames ] .ad .hy 14 .SH DESCRIPTION .PP .I SLASH'EM is a display oriented Dungeons & Dragons(tm) - like game. The standard tty display and command structure resemble rogue. It is an extension of SLASH which is an extension of NetHack. .PP Other, more graphical display options exist if you are using either a PC, or an X11 interface. .PP To get started you really only need to know two commands. The command .B ? will give you a list of the available commands (as well as other information) and the command .B / will identify the things you see on the screen. .PP 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. .PP When the game ends, whether by your dying, quitting, or escaping from the caves, .I SLASH'EM 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. .PP The environment variable SLASHEMOPTIONS can be used to initialize many run-time options. The ? command provides a description of these options and syntax. (The .B \-dec and .B \-ibm command line options are equivalent to the .B decgraphics and .B ibmgraphics run-time options described there, and are provided purely for convenience on systems supporting multiple types of terminals.) .PP 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 .slashemrc on Unix systems. On other systems, the default may be different, usually SLASHEM.cnf. On DOS or Windows, the name is defaults.nh, while on the Macintosh or BeOS, it is SlashEM Defaults. The configuration file's location may be specified by setting SLASHEMOPTIONS to a string consisting of an @ character followed by the filename. .PP The .B \-u .I 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. .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 male or female name for the character role, or the first three characters of the role as an abbreviation. .B "\-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. .PP Likewise, .B \-r .I race can be used to explicitly request that a race be chosen, .B \-g .I gender the gender of the chareacter and finally .B \-a .I alignment to chose the alignment of the character. .PP Leaving out any of these characteristics will result in you being prompted during the game startup for the information. .PP Instead of chosing the above seperately you can add them as suffixes to the playername: .B \-u .I playername\-race\-gender\-alignment .PP The .B \-s option alone will print out the list of your scores on the current version. An immediately following .B \-v reports on all versions present in the score file. The .B \-s may be also be followed by player type arguments ( .B \-p , .B \-r , .B \-g and .B \-a ) to print the scores of particular types of players 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. .PP The .B \-n option suppresses printing of any news from the game administrator. .PP The .B \-D or .B \-X option will start the game in a special non-scoring discovery mode. .B \-D will, if the player is the game administrator, start in debugging (wizard) mode instead. .PP The .B \-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, HACKDIR, or the directory specified by the game administrator during compilation (usually /usr/local/slashemdir). This option is usually only useful to the game administrator. The playground must contain several auxiliary files such as help files, the list of top scorers, and a subdirectory .I save where games are saved. .SH AUTHORS .PP Jay Fenlason (+ Kenny Woodland, Mike Thome and Jon Payne) wrote the original hack, very much like rogue (but full of bugs). .PP Andries Brouwer continuously deformed their sources into an entirely different game. .PP 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. .PP 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. .PP Tom Proudfoot took NetHack and rendered it into SLASH - SuperLotsaAddedStuffHack, adding more character classes, levels monsters and all manner of changes. .PP Warren Cheung took SLASH and rendered it into SLASHEM - SuperLotsaAddedStuffHack - Extended Magic, with more improvements to the bloated behemoth. .SH FILES .PP All files are in the playground, normally /usr/local/slashemdir. 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. .br .DT .ta \w'cmdhelp, opthelp, wizhelp\ \ \ 'u slashem The program itself. .br data, oracles, rumors Data files used by SLASH'EM. .br options, quest.dat More data files. .br help, hh Help data files. .br cmdhelp, opthelp, wizhelp More help data files. .br *.lev Predefined special levels. .br dungeon Control file for special levels. .br history A short history of SLASH'EM. .br license Rules governing redistribution. .br record The list of top scorers. .br logfile An extended list of games .br played. .br xlock.nnn Description of a dungeon level. .br perm Lock file for xlock.dd. .br bonesDD.nn Descriptions of the ghost and .br belongings of a deceased .br adventurer. .br save A subdirectory containing the .br saved games. .SH ENVIRONMENT .DT .ta \w'HACKPAGER or PAGER\ \ \ 'u USER or LOGNAME Your login name. .br HOME Your home directory. .br SHELL Your shell. .br TERM The type of your terminal. .br HACKPAGER or PAGER Replacement for default pager. .br MAIL Mailbox file. .br MAILREADER Replacement for default reader .br (probably /bin/mail or /usr/ucb/mail). .br NETHACKDIR Playground. .br SLASHEMOPTIONS String predefining several SLASH'EM .br options. .br In addition, SHOPTYPE is used in debugging (wizard) mode. .SH "SEE ALSO" .PP dgn_comp(6), lev_comp(6), recover(6) .SH BUGS .PP Probably infinite. .PP Dungeons & Dragons is a Trademark of Wizards of the Coast, Inc. slashem-0.0.7E7F3/doc/Guidebook.txt0000664000076400007640000050562210545462317015104 0ustar aliali A Guide to the Mazes of Menace (Guidebook for SLASH'EM) Eric S. Raymond (Extensively edited and expanded for NetHack 3.4) (Revised for SLASH'EM 0.0.3 by Warren Cheung) (Revised for SLASH'EM 0.0.6 by J. Ali Harlow) 1. Introduction Recently, you have begun to find yourself unfulfilled and distant in your daily occupation. Strange dreams of prospecting, stealing, 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? Asking around, you hear about a bauble, called the Amulet of Yendor by some, which, if you can find it, will bring you great wealth. One legend you were told even mentioned that the one who finds the amulet will be granted immortality by the gods. The amulet is rumored to be somewhere beyond the Valley of Gehennom, deep within the Mazes of Menace. Upon hearing the legends, you immediately realize that there is some profound and undiscovered reason that you are to descend into the caverns and seek out that amulet of which they spoke. Even if the rumors of the amulet's powers are untrue, you decide that you should at least be able to sell the tales of your adventures to the local minstrels for a tidy sum, especially if you encounter any of the terrifying and magical creatures of your dreams along the way. You spend one last night fortifying yourself at the local inn, becoming more and more depressed as you watch the odds of your success being SLASH'EM Guidebook 1 SLASH'EM Guidebook 2 posted on the inn's walls getting lower and lower. 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 SLASH'EM. 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 adventure will vary with your background and training: Archeologists understand dungeons pretty well; this enables 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. Flame Mages have managed to harness mystical energies into the control of the element of fire. Notwithstanding their pet hell hounds, woe be unto anyone who stands in the way of a skilled mage casting a fireball. 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. Ice Mages command the forces of cold. An experienced Mage can summon great blizzards yet remain unaffected by the turmoil of the elements. 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 SLASH'EM 0.0.7 December 10, 2003 SLASH'EM Guidebook 3 without weapons as with. They wear no armor but make up for it with increased mobility. Necromancers have delved into the darkest of the magical lore, and mastered some of the most forbidden of the magical lore. Many have fallen to the armies of the undead that they are capable of bringing forth and controlling. Priests and Priestesses are clerics militant, crusaders ad- vancing the cause of righteousness with arms, armor, and arts thaumaturgic. Their ability to commune with deities via prayer occasionally extricates them from peril, but can also put them in it. Rangers are most at home in the woods, and some say slightly out of place in a dungeon. They are, however, experts in archery as well as tracking and stealthy movement. Rogues are agile and stealthy thieves, with knowledge of locks, traps, and poisons. They specialize in surprise, which they employ to great advantage. Samurai are the elite warriors of feudal Nippon. They are heavily armored but quick, and wear the dai-sho, two swords of the deadliest keenness. Tourists start out with lots of gold (suitable for shopping with), a credit card, lots of food, some maps, and an expensive camera. Most monsters don't like being photographed. Undead Slayers are specialists, trained to hunt the undead as well as other incarnations of evil. They are well aware of the weaknesses of their foes and come prepared. Few denizens of darkness ever encounter such warriors of light and live to tell of it. Valkyries are hardy warrior women. Their upbringing in the harsh Northlands makes them strong, inures them to extremes of 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. Yeomen are sturdy fighters. They are famed for their ability to stand doing nothing for hours. It is said that this is because they are none too bright. Yeomen can both take a lot of damage and inflict it on others. You may also choose the race of your character: Doppelgangers have the anviable ability to change form at will, at a cost of some mystic energy (mana), although what SLASH'EM 0.0.7 December 10, 2003 SLASH'EM Guidebook 4 they become may be a bit of a surprise, even for them. 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 and Drows are agile, quick, and perceptive; very lit- tle of what goes on will escape an Elf. The quality of Elven craftsmanship 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. Hobbits are quick of hearing and sharp-eyed, and though they are inclined to be fat and do not hurry unnecessarily, they are nonetheless nimble and deft in their movements. A love of learn- ing (other than genealogical lore) is far from general among them. Hobbits are difficult to daunt, or to kill, and at need can still handle arms. 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. Lycanthropes are wild beasts who draw their strength from the phases of the moon, and can transform into wolves when they channel their magical energies. Even unarmed, a Lycanthrope is a savage fighter, as many scarred by their deadly claws can at- test. Orcs are a cruel and barbaric race that hate every living thing (including other orcs). Above all others, Orcs hate Elves with a passion unequalled, and will go out of their way to kill one at any opportunity. The armor and weapons fashioned by the Orcs are typically of inferior quality. Vampires strike fear into the heart of many. Their super-hu- man strength, notorious dexterity and resiliance make them diffi- cult to defeat while their almost hypnotic charm makes them dan- gerous opponents. Even their own Gods treat vampires with some distaste. 3. What do all those things on the screen mean? On the screen is kept a map of where you have been and what you have seen on the current dungeon level; as you explore more of the level, it appears on the screen in front of you. When SLASH'EM's ancestor rogue first appeared, its screen orientation was almost unique among computer fantasy games. SLASH'EM 0.0.7 December 10, 2003 SLASH'EM Guidebook 5 Since then, screen orientation has become the norm rather than the exception; SLASH'EM continues this fine tradition. Unlike text adventure games that accept commands in pseudo-English sen- tences and explain the results in words, SLASH'EM commands are all one or two keystrokes and the results are displayed graphi- cally on the screen. A minimum screen size of 24 lines by 80 columns is recommended; if the screen is larger, only a 21x80 section will be used for the map. SLASH'EM can even be played by blind players, with the as- sistance of Braille readers or speech synthesisers. Instructions for configuring SLASH'EM for the blind are included later in this document. SLASH'EM 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. SLASH'EM offers a variety of display options. The options available to you will vary from port to port, depending on the capabilities of your hardware and software, and whether various compile-time options were enabled when your executable was creat- ed. The three possible display options are: a monochrome charac- 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 SLASH'EM, first you must understand what SLASH'EM is doing with the screen. The SLASH'EM screen replaces the ``You see ...'' descriptions of text adventure games. Figure 1 is a sample of what a SLASH'EM screen might look like. The way the screen looks for you depends on your platform. -------------------------------------------------------------------- The bat bites! ------ |....| ---------- |.<..|####...@...$.| |....-# |...B....+ |....| |.d......| ------ -------|-- SLASH'EM 0.0.7 December 10, 2003 SLASH'EM Guidebook 6 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): Rank Your character's name and professional ranking (based on the 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 Intelligence affects your ability to cast spells and read spellbooks. Wisdom Wisdom comes from your practical experience (especially when dealing with magic). It affects your magical energy. 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 SLASH'EM 0.0.7 December 10, 2003 SLASH'EM Guidebook 7 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 Your current and maximum hit points. Hit points indicate how much damage you can take before you die. The more you get hit in a fight, the lower they get. You can regain hit points by resting, or by using certain magical items or spells. The number in parentheses is the maximum number 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. Experience Your current experience level and experience points. As you adventure, you gain experience points. At certain experi- ence point totals, you gain an experience level. The more experienced you are, the better you fight and withstand mag- ical attacks. Many dungeons show only your experience level here. Weight The total weight of all items in your inventory, displayed if you have the showweight option set. The number after the slash is your carrying capacity. Time The number of turns elapsed so far, displayed if you have the time option set. SLASH'EM 0.0.7 December 10, 2003 SLASH'EM Guidebook 8 Hunger status Your current hunger status, ranging from Satiated down to Fainting. If your hunger status is normal, it is not dis- played. 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 SLASH'EM 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 | The walls of a room, or an open door. Or a grave (|). . 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. < Stairs up: a way to the previous level. + A closed door, or a spellbook containing a spell you may be able to learn. @ Your character or a human. $ A pile of gold. ^ A trap (once you have detected it). ) A weapon. [ A suit or piece of armor. % Something edible (not necessarily healthy). SLASH'EM 0.0.7 December 10, 2003 SLASH'EM Guidebook 9 ? A scroll. / A wand. = A ring. ! A potion. ( A useful item (pick-axe, key, lamp...). " An amulet or a spider web. * A gem or rock (possibly valuable, possibly worthless). ` A boulder or statue. 0 An iron ball. _ An altar, or an iron chain. { A fountain. } A pool of water or moat or a pool of lava. \ 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). 4. Commands Commands are initiated by typing one or two characters. Some commands, like ``search'', do not require that any more in- formation be collected by SLASH'EM. Other commands might require additional information, for example a direction, or an object to be used. For those commands that require additional information, SLASH'EM 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 SLASH'EM 0.0.7 December 10, 2003 SLASH'EM Guidebook 10 carrying. Here, ``a-zA-Z'' are the inventory letters of your possible choices. Typing `?' gives you an inventory list of these items, so you can see what each letter refers to. In this 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. Some commands allow you to choose an object that you are not currently carrying. Such commands have an extra option available as in ``What do you want to drink? [fgh or ?*,.]''. Typing `,' gives you a list of the applicable objects on the floor, from which you may make your choice. For commands where it is possi- ble to choose your current location rather than an object, the `.' option will be displayed. This can be used to read an engrav- ing or drink from a dungeon feature. 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. The list of commands is rather long, but it can be read at any time during the game through the `?' command, which accesses a menu of helpful texts. As well, there is now a menusystem available through the '`' command for those who would rather page through menus than hunt and peck for keys. Here are the commands for your reference: ESC Cancel the current operation (where applicable) or skip mes- sages. If the menu_on_esc option is set, then this key will access the menusystem when pressed while the program is waiting for a command. ? Help menu: display one of several help texts available. ` Main menu: access the menusystem. / 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, SLASH'EM 0.0.7 December 10, 2003 SLASH'EM Guidebook 11 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.'' 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] Prefix: move without picking up objects or fighting (even if you remember a monster there) F[yuhjklbn] Prefix: fight a monster (even if you only guess one is there) M[yuhjklbn] Prefix: move far, no pickup. g[yuhjklbn] Prefix: move until something interesting is found. G[yuhjklbn] or [yuhjklbn] Prefix: same as `g', but forking of corridors is not con- sidered interesting. SLASH'EM 0.0.7 December 10, 2003 SLASH'EM Guidebook 12 _ Travel to a map location via a shortest-path algorithm. The shortest path is computed over map locations the hero knows about (e.g. seen or previously traversed). If there is no known path, a guess is made instead. Stops on most of the same conditions as the `G' command, but without picking up objects, similar to the `M' command. For ports with mouse support, the command is also invoked when a mouse-click takes place on a location other than 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. ^B Borrow (steal) money from an adjacent monster. c Close a door. C Call (name) an individual monster. ^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? [!%= BUCXaium]'' you should type zero or more object symbols possibly followed by `a' and/or `i' and/or `u' and/or `m'. In addition, one or more of the blessed/uncursed/cursed groups may be typed. DB - drop all objects known to be blessed. DU - drop all objects known to be uncursed. DC - drop all objects known to be cursed. DX - drop all objects of unknown B/U/C status. 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. Vampires cannot eat as such. However, they can gain nutrition by draining blood from fresh corpses using this command. E Engrave a message on the floor. Engraving the word ``Elbereth'' will cause most monsters to not attack you SLASH'EM 0.0.7 December 10, 2003 SLASH'EM Guidebook 13 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. O Set options. A menu showing the current option values will be displayed. You can change most values simply by select- ing the menu entry for the given option (ie, by typing its letter or clicking upon it, depending on your user inter- face). For the non-boolean choices, a further menu or prompt will appear once you've closed this menu. The avail- able options are listed later in this Guidebook. Options are usually set before the game rather than with the `O' command; see the section on options below. p Pay your shopping bill/Shopkeeper services. P Put on a ring or other accessory (amulet, blindfold). ^P Repeat previous message. Subsequent ^P's repeat earlier messages. The behavior can be varied via the msg_window op- tion. q Quaff (drink) something (potion, water, etc). Q Select an object for your quiver. You can then throw this using the `f' command. (In SLASH'EM versions prior to 0.0.6 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. SLASH'EM 0.0.7 December 10, 2003 SLASH'EM Guidebook 14 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. T Take off armor. ^T Teleport, if you have the ability. v Display version number. V Display the game history. w Wield weapon. w- - wield nothing, use your bare hands. W Wear armor. x Exchange your wielded weapon with the item in your alternate weapon slot. The latter is used as your secondary weapon when engaging in two-weapon combat. Note that if one of these slots is empty, the exchange still takes place. X Enter explore (discovery) mode, explained in its own section later. ^X Display your name, role, race, gender, and alignment as well as the various deities in your game. ^Y Polymorph yourself, if you have the ability. z Zap a wand. To aim at yourself, use `.' for the direction. 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. May be preceded by `m' to force a se- lection menu. @ Toggle the autopickup option on and off. __________ (R)UNIX is a registered trademark of AT&T. SLASH'EM 0.0.7 December 10, 2003 SLASH'EM Guidebook 15 ^ Ask for the type of a trap you found earlier. ) Tell what weapon you are wielding. [ Tell what armor you are wearing. = Tell what rings you are wearing. " Tell what amulet you are wearing. ( 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. + List the spells you know. Using this command, you can also rearrange the order in which your spells are listed. They are shown via a menu, and if you select a spell in that menu, you'll be re-prompted for another spell to swap places with it, and then have opportunity to make further ex- changes. \ Show what types of objects have been discovered. ! 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''). #borrow Borrow (steal) money from an adjacent monster, if you have the ability. #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. SLASH'EM 0.0.7 December 10, 2003 SLASH'EM Guidebook 16 #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 Use a monster's special ability (when polymorphed into mon- ster form). #name Name an item or type of object. #offer Offer a sacrifice to the gods. #pray Pray to the gods for help. #quit Quit the program without saving your game. #ride Ride (or stop riding) a monster. #rub Rub a lamp or a stone. #sit Sit down. #technique Perform a role or race specific technique. A menu showing the techniques available to your character will be dis- played. #turn 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). #vanquished List vanquished monsters (whether by you or not). SLASH'EM 0.0.7 December 10, 2003 SLASH'EM Guidebook 17 #youpoly Polymorph yourself, if you have the ability. #version Print compile time options for this version of SLASH'EM. #wipe Wipe off your face. #? 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 SLASH'EM, 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 M-b #borrow M-c #chat M-d #dip M-e #enhance M-f #force M-i #invoke M-j #jump M-l #loot M-m #monster M-n #name M-o #offer M-p #pray M-q #quit M-r #rub M-s #sit SLASH'EM 0.0.7 December 10, 2003 SLASH'EM Guidebook 18 M-t #technique M-u #untrap M-v #version M-w #wipe M-y #youpoly 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'. K List vanquished monsters (whether by you or not). Same as ``#vanquished''. 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''. 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' (search) command. 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 SLASH'EM 0.0.7 December 10, 2003 SLASH'EM Guidebook 19 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. 5.3. Stairs (`<', `>') In general, each level in the dungeon will have a staircase going up (`<') to the previous level and another going down (`>') to the next level. There are some exceptions though. For in- stance, fairly early in the dungeon you will find a level with 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. SLASH'EM 0.0.7 December 10, 2003 SLASH'EM Guidebook 20 Ordinarily when you climb a set of stairs, you will arrive on the corresponding staircase at your destination. However, 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 climb. When that occurs, the pet or other monster will arrive on the staircase and you will end up nearby. 5.4. Ladders (`<', `>') Ladders serve the same purpose as staircases, and the two types of inter-level connections are nearly indistinguishable during game play. 5.5. Shops and shopping Occasionally you will run across a room with a shopkeeper near the door and many items lying on the floor. You can buy items by picking them up and then using the `p' command. You can inquire about the price of an item prior to picking it up by us- ing the ``#chat'' command while standing on it. Using an item prior to paying for it will incur a charge, and the shopkeeper won't allow you to leave the shop until you have paid any debt you owe. You can sell items to a shopkeeper by dropping them to the floor while inside a shop. You will either be offered an amount of gold and asked whether you're willing to sell, or you'll be told that the shopkeeper isn't interested (generally, your item needs to be compatible with the type of merchandise carried by the shop). If you drop something in a shop by accident, the shopkeeper will usually claim ownership without offering any compensation. You'll have to buy it back if you want to reclaim it. Shopkeepers sometimes run out of money. When that happens, you'll be offered credit instead of gold when you try to sell something. Credit can be used to pay for purchases, but it is only good in the shop where it was obtained; other shopkeepers won't honor it. (If you happen to find a "credit card" in the dungeon, don't bother trying to use it in shops; shopkeepers will not accept it.) The `$' command, which reports the amount of gold you are carrying (in inventory, not inside bags or boxes), will also show current shop debt or credit, if any. The `Iu' command lists un- paid items (those which still belong to the shop) if you are car- rying any. The `Ix' command shows an inventory-like display of any unpaid items which have been used up, along with other shop fees, if any. SLASH'EM 0.0.7 December 10, 2003 SLASH'EM Guidebook 21 5.5.1. Shop idiosyncracies Several aspects of shop behavior might be unexpected. * The price of a given item can vary due to a variety of factors. * A shopkeeper treats the spot immediately inside the door as if it were outside the shop. * While the shopkeeper watches you like a hawk, he will generally ignore any other customers. * If a shop is "closed for inventory", it will not open of its own accord. * Shops do not get restocked with new items, regardless of inven- tory depletion. 6. Monsters Monsters you cannot see are not displayed on the screen. Beware! You may suddenly come upon one in a dark place. Some 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 monsters such as a shopkeeper or the Oracle of Delphi can produce useful results. 6.1. Fighting If you see a monster and you wish to fight it, just attempt to walk 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. 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 SLASH'EM 0.0.7 December 10, 2003 SLASH'EM Guidebook 22 `F' command. 6.2. Your pet You start the game with a little dog (`d'), cat (`f'), hell hound pup ('d'), winter wolf cub ('d'), ghoul ('Z'), or pony (`u'), which follows you about the dungeon and fights monsters with you. With the exception of ghouls, 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 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 beast that you will see displayed on the map. 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. SLASH'EM 0.0.7 December 10, 2003 SLASH'EM Guidebook 23 7. Objects When you find something in the dungeon, it is common to want to pick it up. In SLASH'EM, this is accomplished automatically by walking over the object (unless you turn off the autopickup option (see below), or move with the `m' prefix (see above)), or manually by using the `,' command. If you're carrying too many items, SLASH'EM 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 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. Your reactions will get slower and you'll burn calories faster, requiring food more frequently to cope with it. Eventually, you'll be so overloaded that you'll either have to discard some of what you're carrying or collapse under its weight. SLASH'EM 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 SLASH'EM 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, SLASH'EM 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. SLASH'EM 0.0.7 December 10, 2003 SLASH'EM Guidebook 24 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 the curse lifted and the item removed. Priests and Priestesses have an innate sensitivity to this property in any object, so 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. There are wielded weapons, like maces and swords, and thrown 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. An alternative method would be wield a bow and place the arrows in your Quiver, after which you fire the ammunition. Rangers and the like may find that having a bow as their sec- ondary weapon is a useful combination. In order to use a sec- ondary weapon to fire ammunition however, it must first be moved to the primary weapon slot. The ``x'' command is available for this use. Crossbows shoot crossbow 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 SLASH'EM 0.0.7 December 10, 2003 SLASH'EM Guidebook 25 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, and the amount of damage such a hit will do, depends upon many factors. Among them are: type of weapon, quality of weapon (en- chantment and/or erosion), experience level, strength, dexterity, encumbrance, and proficiency (see below). The monster's armor class - a general defense rating, not necessarily due to wearing 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 alternate weapons. And if you have proficiency in the ``two weapon combat'' skill, you may wield both weapons si- multaneously as primary and secondary; use the `#twoweapon' ex- tended 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 in- curs 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 SLASH'EM. 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. The commands to use weapons are `w' (wield), `t' (throw), `f' (fire, an alternative way of throwing), `Q' (quiver), `x' (exchange), `#twoweapon', and `#enhance' (see below). 7.2.1. Throwing and shooting You can throw just about anything via the `t' command. It will prompt for the item to throw; picking `?' will list things 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. SLASH'EM 0.0.7 December 10, 2003 SLASH'EM Guidebook 26 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 SLASH'EM 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 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 You will have varying degrees of skill in the weapons avail- able. Weapon proficiency, or weapon skills, affect how well you can use particular types of weapons, and you'll be able to im- prove your skills as you progress through a game, depending on your role, your experience level, and use of the weapons. For the purposes of proficiency, weapons have been divided up into various groups such as daggers, broadswords, and polearms. Each role has a limit on what level of proficiency a character can achieve for each group. For instance, wizards can 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 SLASH'EM 0.0.7 December 10, 2003 SLASH'EM Guidebook 27 ``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 is no penalty or bonus; at skilled level, you receive a modest bonus in the chance to hit and amount of damage done; at expert level, the bonus is higher. A successful hit has a chance to boost your training towards the next skill level (unless you've already reached the limit for this skill). Once such training reaches the threshold for that next level, you'll be told that you feel more confident in your skills. At that point you can use `#enhance' to increase one or more skills. Such skills are not increased automatically because there is a limit to your to- 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 SLASH'EM. Here is an (incomplete) list of the ar- mor classes provided by various suits of armor: dragon scale mail 1 plate mail 3 crystal plate mail 3 bronze plate mail 4 splint mail 4 banded mail 4 dwarvish mithril-coat 4 elven mithril-coat 5 chain mail 5 orcish chain mail 6 scale mail 6 studded leather armor 7 ring mail 7 orcish ring mail 8 leather armor 8 leather jacket 9 no armor 10 You can also wear other pieces of armor (ex. helmets, boots, shields, cloaks) to lower your armor class even further, but you 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 SLASH'EM 0.0.7 December 10, 2003 SLASH'EM Guidebook 28 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. 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 also ``food.'' Many, but not all, of these are edible; some also 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. The command to eat food is `e'. 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). One of the most useful of these is the scroll of identify, which can be used to determine what another object is, whether it is cursed or blessed, and how many uses it has left. Some ob- jects of subtle enchantment are difficult to identify without these. A mail daemon may run up and deliver mail to you as a scroll of mail (on versions compiled with this feature). To use this feature on versions where SLASH'EM mail delivery is triggered by SLASH'EM 0.0.7 December 10, 2003 SLASH'EM Guidebook 29 electronic mail appearing in your system mailbox, you must let SLASH'EM 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 SLASH'EM can shell to it when you read the scroll. On versions of SLASH'EM 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 blessed or cursed, resulting in holy or unholy water. Holy water is the bane of the undead, so potions of holy water are good things to throw (`t') at them. It is also sometimes very useful to dip (``#dip'') an object into a potion. The command to drink a potion is `q' (quaff). 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. When the number of charges left in a wand becomes zero, at- tempts to use the wand will usually result in nothing happening. Occasionally, however, it may be possible to squeeze the last few mana points from an otherwise spent wand, destroying it in the process. A wand may be recharged by using suitable magic, but doing so runs the risk of causing it to explode. The chance for such an explosion starts out very small and increases each time 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 display will include additional information in parentheses: the number of times it has been recharged followed by a colon and then by its current number of charges. A current charge count of -1 is a special case indicating that the wand has been cancelled. SLASH'EM 0.0.7 December 10, 2003 SLASH'EM Guidebook 30 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). 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 if you do not use it, and you will need to relearn it. Casting a spell re- inforces your memory of it, so you may never need to relearn a frequently used spell. 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 grouped. Successfully casting a spell exercises the skill group; sufficient skill may increase the potency of the spell and reduce the risk of spell failure. Skill slots are shared with weapons skills. (See also the section on ``Weapon proficiency''.) SLASH'EM 0.0.7 December 10, 2003 SLASH'EM Guidebook 31 Casting a spell also requires flexible movement, and wearing 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. The ``#enhance'' extended command advances your spellcasting skills. 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 contain- ers, which objects can be placed into or taken out of. The command to use tools is `a' (apply). 7.10.1. Containers You may encounter bags, boxes, and chests in your travels. A tool of this sort can be opened with the ``#loot'' extended command when you are standing on top of it (that is, on the same floor spot), or with the `a' (apply) command when you are carry- ing it. However, chests are often locked, and are in any case unwieldy objects. You must set one down before unlocking it by using a key or lock-picking tool with the `a' (apply) command, by kicking it with the `^D' command, or by using a weapon to force the lock with the ``#force'' extended command. Some chests are trapped, causing nasty things to happen when you unlock or open them. You can check for and try to deactivate traps with the ``#untrap'' extended command. 7.11. Amulets (`"') Amulets are very similar to rings, and often more powerful. Like rings, amulets have various magical properties, some benefi- cial, some harmful, which are activated by putting them on. Only one amulet may be worn at a time, around your neck. The commands to use amulets are the same as for rings, `P' (put on) and `R' (remove). 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. Other small rocks are also categorized as gems, but they are much less valuable. All rocks, however, can be used as SLASH'EM 0.0.7 December 10, 2003 SLASH'EM Guidebook 32 projectile weapons (if you have a sling). In the most desperate of cases, you can still throw them by hand. 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. 7.14. Gold (`$') Gold adds to your score, and you can buy things in shops with it. There are a number of monsters in the dungeon that may be influenced by the amount of gold you are carrying (shopkeepers aside). 8. Conduct As if winning SLASH'EM 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. SLASH'EM 0.0.7 December 10, 2003 SLASH'EM Guidebook 33 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 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 mind flayer, is considered 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 cannot #pray, #offer sacrifices to any god, #turn undead, or #chat with a priest. Particularly selective readers may argue that playing Monk or Priest characters should violate this con- duct; that is a choice left to the player. Offering the Amulet of Yendor to your god is necessary to win the game and is not counted against this conduct. You are also not penalized for be- ing spoken to by an angry god, priest(ess), or other religious 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 SLASH'EM, 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. SLASH'EM 0.0.7 December 10, 2003 SLASH'EM Guidebook 34 An illiterate character cannot read or write. This includes reading a scroll, spellbook, fortune cookie message, or t-shirt; writing a scroll; or reading (or making) an engraving of anything other than a single ``x'' (the traditional signature of an illit- erate person). Reading any item that is absolutely necessary to win the game is not counted against this conduct. The identity of scrolls and spellbooks (and knowledge of spells) in your 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 challenges tracked by the game. It is possible to eliminate one or more species of monsters by geno- cide; playing without this feature is considered a challenge. When the game offers you an opportunity to genocide monsters, you may respond with the monster type ``none'' if you want to de- cline. You can change the form of an item into another item 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. Polymorphing monsters, including pets, does not break either of these challenges. Finally, you may sometimes receive wishes; a game without an attempt to wish for any items is a challenge, as is a game without wishing for an artifact (even if the artifact immediately disappears). When the game offers you an opportunity to make a wish for an item, you may choose ``nothing'' if you want to decline. 9. Options Due to variations in personal tastes and conceptions of how SLASH'EM should do things, there are options you can set to change how SLASH'EM 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 SLASHEMOPTIONS environment variable or in a configuration file. Some versions of SLASH'EM also have front-end programs that allow you to set options before starting the game. 9.2. Using the SLASHEMOPTIONS environment variable The SLASHEMOPTIONS 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. SLASH'EM 0.0.7 December 10, 2003 SLASH'EM Guidebook 35 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 SLASHEMOPTIONS "autoquiver,\!autopickup,name:Blue Meanie,fruit:papaya" in csh (note the need to escape the ! since it's special to the shell), or $ SLASHEMOPTIONS="autoquiver,!autopickup,name:Blue Meanie,fruit:papaya" $ export SLASHEMOPTIONS in sh or ksh. 9.3. Using a configuration file Any line in the configuration file starting with `#' is treated as a comment. Any line in the configuration file start- ing with ``OPTIONS='' may be filled out with options in the same syntax as in SLASHEMOPTIONS. Any line starting with ``DUN- GEON='', ``EFFECTS='', ``MONSTERS='', ``OBJECTS='', ``TRAPS='', or ``BOULDER='' 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 posi- tion in the current font to be used in displaying each entry. A zero in any entry in such a sequence leaves the display of that entry unchanged; this feature is not available using the option syntax. Such a sequence can be continued to multiple lines by putting a `\' at the end of each line to be continued. Any line starting with ``TILESET='' defines a tile set in the same syntax as in SLASHEMOPTIONS (although the options are different). See the section on tile sets, below, for more information. If your copy of the game included the compile time AUTOPICK- UP_EXCEPTIONS option, then any line starting with ``AUTOPICK- UP_EXCEPTION='' is taken as defining an exception to the pick- up_types option. There is a section of this Guidebook that dis- cusses that. The default name of the configuration file varies on differ- ent operating systems, but SLASHEMOPTIONS can also be set to the full name of a file you want to use (possibly preceded by an `@'). 9.4. Customization options Here are explanations of what the various options do. Char- acter strings that are too long may be truncated. Some of the options listed may be inactive in your dungeon. align Your starting alignment (align:lawful, align:neutral, or align:chaotic). You may specify just the first letter. The SLASH'EM 0.0.7 December 10, 2003 SLASH'EM Guidebook 36 default is to randomly pick an appropriate alignment. Cannot 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). See pickup_types to refine the behavior. autoquiver This option controls what happens when you attempt the `f' (fire) command with an empty quiver. When true, the computer will fill your quiver with some suitable weapon. Note that it will not take into account the blessed/cursed status, enchant- ment, damage, or quality of the weapon; you are free to manual- ly fill your quiver with the `Q' command instead. If no weapon is found or the option is false, the `t' (throw) command is ex- ecuted instead. (default false) boulder Set the character used to display boulders (default is rock class symbol). catname Name your starting cat (ex. ``catname:Morris''). Cannot be set with the `O' command. character Pick your type of character (ex. ``character:Monk''); synonym for ``role''. See ``name'' for an alternate method of specify- ing 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 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 compilation. cmdassist Have the game provide some additional command assistance for new players if it detects some anticipated mistakes (default on). confirm Have user confirm attacks on pets, shopkeepers, and other peaceable creatures (default on). SLASH'EM 0.0.7 December 10, 2003 SLASH'EM Guidebook 37 DECgraphics Use a predefined selection of characters from the DEC VT- xxx/DEC Rainbow/ANSI line-drawing character set to display the dungeon/effects/traps instead of having to define a full graph- ics set yourself (default off). This option also sets up prop- er handling of graphics characters for such terminals, so you should specify it when appropriate even if you override the se- lections 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. (ex. ``disclose:yi na +v -g -c'') The example sets inventory to prompt and default to yes, attributes to prompt and default to no, vanquished to disclose without prompting, genocided to not disclose and not to prompt, 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. 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-42 characters to be used instead of the default map-drawing characters. The dun- geon map will use the characters you specify instead of the de- fault 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 SLASH'EM escape-processes this option string in con- ventional C fashion. This means that `\' is a prefix to take the following character literally. Thus `\' needs to be repre- sented as `\\'. The special escape form `\m' switches on the SLASH'EM 0.0.7 December 10, 2003 SLASH'EM Guidebook 38 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, hori- zontal 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, horizon- tal closed door, iron bars, tree, floor of a room, dark corri- dor, lit corridor, stairs up, stairs down, ladder up, ladder down, altar, grave, throne, kitchen sink, toilet, fountain, pool or moat, ice, lava, vertical lowered drawbridge, horizon- tal 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 rearranged. 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-83 char- acters to be used instead of the default special-effects char- acters. 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 surrounding glyphs for swallowed display, nine glyphs each for magical, fire, cold, death, lightning, poison and acid explosions. An explosion consists of three rows (top, middle, and bottom) of three char- acters. 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 tradi- tional interface except that it does not require that you hit Enter. It is implemented only by the tty port (default off), when the game has been compiled to support tty graphics. female An obsolete synonym for ``gender:female''. Cannot be set with SLASH'EM 0.0.7 December 10, 2003 SLASH'EM Guidebook 39 the `O' command. fixinv An object's inventory letter sticks to it when it's dropped (default on). If this is off, dropping an object shifts all the remaining inventory letters. fruit Name a fruit after something you enjoy eating (ex. ``fruit:man- go'') (default ``slime mold''). Basically a nostalgic whimsy that SLASH'EM uses from time to time. You should set this to something you find more appetizing than slime mold. Apples, oranges, pears, bananas, and melons already exist in SLASH'EM, 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'' options, the ``gender'' option will take precedence. The default is to ran- domly pick an appropriate gender. Cannot be set with the `O' command. ghoulname Name your starting ghoul (ex. ``ghoulname:Casper''). 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). Turn- ing 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 in- formation. horsename Name your starting horse (ex. ``horsename:Trigger''). Cannot be set with the `O' command. IBMgraphics Use a predefined selection of IBM extended ASCII characters to display the dungeon/effects/traps instead of having to define a full graphics set yourself (default off). This option also sets up proper handling of graphics characters for such termi- nals, so you should specify it when appropriate even if you override the selections with your own graphics strings. ignintr Ignore interrupt signals, including breaks (default off). invweight Display the weights of items in your inventory (and at other times) in braces (default off). SLASH'EM 0.0.7 December 10, 2003 SLASH'EM Guidebook 40 keep_savefile Keeps the save file after restore. SLASH'EM usually deletes your savefile after you restore, making death permanent. This option can allow you to restore from the last save. (default off). legacy Display an introductory message when starting the game (default on). lit_corridor Show corridor squares seen by night vision or a light source held by your character as lit (default off). lootabc Use the old `a', `b', and `c' keyboard shortcuts when looting, rather than the mnemonics `o', `i', and `b' (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 ob- jects (in response to the Drop command, for instance). The value specified should be the first letter of one of the fol- lowing: traditional, combination, partial, or full. Tradi- tional was the only interface available for earlier versions; it consists of a prompt for object class characters, followed by an object-by-object prompt for all items matching the se- lected 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 ob- jects for selection. menu_deselect_all Menu character accelerator to deselect all items in a menu. Implemented by the Amiga, Gem, X11, GTK and tty ports. Default '-'. menu_deselect_page Menu character accelerator to deselect all items on this page of a menu. Implemented by the Amiga, Gem and tty ports. De- fault '\'. menu_first_page Menu character accelerator to jump to the first page in a menu. Implemented by the Amiga, Gem and tty ports. Default '^'. SLASH'EM 0.0.7 December 10, 2003 SLASH'EM Guidebook 41 menu_headings Controls how the headings in a menu are highlighted. Values are 'bold', 'inverse', or 'underline'. Not all ports can actu- ally display all three types. menu_invert_all Menu character accelerator to invert all items in a menu. Im- plemented by the Amiga, Gem, X11, GTK 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. Imple- mented by the Amiga, Gem and tty ports. Default '>'. menu_on_esc Make the ESC key a synonym for the ``' (main menu) command (de- fault on). menu_previous_page Menu character accelerator to goto the previous menu page. Im- plemented by the Amiga, Gem and tty ports. Default '<'. menu_search Menu character accelerator to search for a menu item. Imple- mented by the Amiga, Gem and X11 ports. Default ':'. menu_select_all Menu character accelerator to select all items in a menu. Im- plemented by the Amiga, Gem, X11, GTK 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 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, piercer, quadruped, ro- dent, arachnid or centipede, trapper or lurker above, horse or SLASH'EM 0.0.7 December 10, 2003 SLASH'EM Guidebook 42 unicorn, vortex, worm, xan or other mythical/fantastic insect, light, Zouthern aminal, angelic being, bat or bird, centaur, dragon, elemental, fungus or mold, gnome, giant humanoid, in- visible monster, jabberwock, Keystone Kop, lich, mummy, naga, ogre, pudding or ooze, quantum mechanic, rust monster, snake, troll, umber hulk, vampire, wraith, xorn, apelike creature, zombie, human, ghost, golem, demon, sea monster, lizard, long worm tail, and mimic. 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 Allows you to change the way recalled messages are displayed. (It is currently implemented for tty only.) The possible val- ues are: s - single message (default, this was the behavior before 3.4.0). c - combination, two messages as `single', then as `full'. f - full window, oldest message first. r - full window, newest message first. For backward compatibility, no value needs to be specified (which defaults to `full'), or it can be negated (which de- faults to `single'). 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 -F -H -I -K -M -N -P -Ra -Ro -S -T -U -V -W -Y). 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 SLASH'EM 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 0 or off). (number_pad:2 invokes the old DOS behavior where `5' means `g', meta-`5' means `G', and meta-`0' means `I'.) objects Set the characters used to display object classes (default ``])[="(%!?+/$*`0_.''). This string is subjected to the same processing as the dungeon option. The order of the symbols is illegal-object (should never be seen), weapon, armor, ring, amulet, tool, food, potion, scroll, spellbook, wand, gold, gem SLASH'EM 0.0.7 December 10, 2003 SLASH'EM Guidebook 43 or rock, boulder or statue, iron ball, chain, and venom. Can- not be set with the `O' command. packorder Specify the order to list object types in (default ``")[%?+!=/(*`0_''). The value of this option should be a string containing the symbols for the various object types. Any omitted types are filled in at the end from the previous order. perm_invent If true, always display your current inventory in a window. This only makes sense for windowing system interfaces that im- plement this feature. 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. (De- fault `S'). pickup_thrown If this boolean option is true and autopickup is on, try to pick up things that you threw, even if they aren't in pick- up_types. Default is on. pickup_types Specify the object types to be picked up when autopickup is on. Default is all types. If your copy of the game has the experi- mental compile time option AUTOPICKUP_EXCEPTIONS included, you may be able to use autopickup_exception configuration file lines to further refine autopickup behavior. prayconfirm Prompt for confirmation before praying (default on). pushweapon Using the `w' (wield) command when already wielding something pushes the old item into your alternate weapon slot (default off). race Selects your race (for example, ``race:human''). Default is random. Cannot be set with the `O' command. rest_on_space Make the space bar a synonym for the `.' (rest) command (de- fault off). SLASH'EM 0.0.7 December 10, 2003 SLASH'EM Guidebook 44 role Pick your type of character (ex. ``role:Samurai''); synonym for ``character''. See ``name'' for an alternate method of speci- fying your role. Normally only the first letter of the value is examined; `r' is an exception with ``Rogue'', ``Ranger'', and ``random'' values. runmode Controls the amount of screen updating for the map window when engaged in multi-turn movement (running via shift+direction or control+direction and so forth, or via the travel command or mouse click). The possible values are: teleport - update the map after movement has finished; run - update the map after every seven or so steps; walk - update the map after each step; crawl - like walk, but pause briefly after each step. This option only affects the game's screen display, not the ac- tual results of moving. The default is `run'; versions prior to 3.4.1 used `teleport' only. Whether or not the effect is noticeable will depend upon the window port used or on the type of terminal. safe_pet Prevent you from (knowingly) attacking your pets (default 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 (default off). showrace Display yourself as the glyph for your race, rather than the glyph for your role (default off). Note that this setting af- fects only the appearance of the display, not the way the game treats you. showscore Show your approximate accumulated score on bottom line (default off). showdmg Show damage inflicted/damage received (default off). Inflicted damage is only shown to characters who have become experienced enough to quantify their damage. showweight Show total weight in inventory on bottom line (default off). SLASH'EM 0.0.7 December 10, 2003 SLASH'EM Guidebook 45 silent Suppress terminal beeps (default on). sortpack Sort the pack contents by type when displaying inventory (de- fault on). sound Enable messages about what your character hears (default on). Note that this has nothing to do with your computer's audio ca- pabilities. This option is only partly under player control. The game toggles it off and on during and after sleep, for ex- ample. 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 SLASH'EM version level to suppress alert notification messages about feature changes for that and prior versions (ex. ``suppress_alert:0.0.6''). tiles This option may be set to the name of a tile set to use, or specified as ``notiles'' to disable the use of tiles. Not all windowing interfaces support this option. The tile set named must also be defined. See the section on tile sets for more in- formation on that. time Show the elapsed game time in turns on bottom line (default off). timed_delay When pausing momentarily for display effect, such as with ex- plosions and moving objects, use a timer rather than sending extra characters to the screen. (Applies to ``tty'' interface only; ``X11'' and ``GTK'' interfaces 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 SLASH'EM window instead of on std- out (default off). Setting this option makes the score list visible when a windowing version of SLASH'EM is started without a parent window, but it no longer leaves the score list around after game end on a terminal or emulating window. SLASH'EM 0.0.7 December 10, 2003 SLASH'EM Guidebook 46 traps Set the graphics symbols for displaying traps (default ``^^^^^^^^^^^^^^^^^"^^^^''). The traps option should be fol- lowed by a string of 1-22 characters to be used instead of the default traps characters. This string is subjected to the same processing as the dungeon option. 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, poly- morph trap. Cannot be set with the `O' command. travel Allow the travel command (default on). Turning this option off will prevent the game from attempting unintended moves if you make inadvertent mouse clicks on the map window. verbose Provide more commentary during the game (default on). windowtype Select which windowing system to use, such as ``tty'' or ``X11'' (default depends on version). Cannot be set with the `O' command. wolfname Name your starting wolf (ex. ``wolfname:Beast''). Cannot be set with the `O' command. 9.5. Tile sets For those windowing ports which support tiles (multicolored pictures instead of the traditional characters), tile sets can be defined using a line in the configuration file that begins ``TILESET=''. There should be one tile set definition line for each available tile set. Once defined, tile sets can be selected for initial display (using the tiles option) or dynamically se- lected during the game (for those windowing ports that support this). A ``TILESET'' line has the same syntax as an ``OPTION'' line but with the following options available: name The name of the tile set (for selection). This can be any string of characters excluding the comma. It must be specified. file The name of the file which contains the tile set. This must be specified. SLASH'EM 0.0.7 December 10, 2003 SLASH'EM Guidebook 47 transparent Marks a tile set as being transparent (as opposed to opaque). Transparent tile sets allow eg., monsters to be displayed on top of the background. Tile sets must be designed to be used in this way in order to achieve meaningful results. This option is ignored by windowing ports which do not support transparen- cy. pseudo3D Marks a tile set as being designed for use with Mitsuhiro Itakura's pseudo-3D display algorithm. They are assumed to have an offset-X value equal to one third of the total tile width and an offset-Y value equal to one half of the total tile height. Such tile sets are not compatible with standard tile sets and while amusing effects can be created by setting this option incorrectly, nothing useful can be achieved. Windowing ports that do not support pseudo-3D display will ignore tile sets with this option set. 9.6. 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 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 SLASH'EM should display an ascii character map if it can. color SLASH'EM should display color if it can for different monsters, objects, and dungeon features eight_bit_tty SLASH'EM should pass eight-bit character values (for example, specified with the traps option) straight through to your ter- minal (default off). SLASH'EM 0.0.7 December 10, 2003 SLASH'EM Guidebook 48 font_map SLASH'EM should use a font by the chosen name for the map win- dow. font_menu SLASH'EM should use a font by the chosen name for menu windows. font_message SLASH'EM should use a font by the chosen name for the message window. font_status SLASH'EM should use a font by the chosen name for the status window. font_text SLASH'EM should use a font by the chosen name for text windows. font_size_map SLASH'EM should use this size font for the map window. font_size_menu SLASH'EM should use this size font for menu windows. font_size_message SLASH'EM should use this size font for the message window. font_size_status SLASH'EM should use this size font for the status window. font_size_text SLASH'EM should use this size font for text windows. fullscreen SLASH'EM should try and display on the entire screen rather than in a window. 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 or a red box around the pet. large_font SLASH'EM should use a large font. map_mode SLASH'EM should display the map in the manner specified. mouse_support Allow use of the mouse for input and travel. SLASH'EM 0.0.7 December 10, 2003 SLASH'EM Guidebook 49 player_selection SLASH'EM should pop up dialog boxes, or use prompts for charac- ter selection. popup_dialog SLASH'EM should pop up dialog boxes for input. preload_tiles SLASH'EM 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. (de- fault on). Cannot be set with the `O' command. scroll_amount SLASH'EM should scroll the display by this number of cells when the hero reaches the scroll_margin. scroll_margin SLASH'EM should scroll the display when the hero or cursor is this number of cells away from the edge of the window. softkeyboard Display an onscreen keyboard. Handhelds are most likely to support this option. splash_screen SLASH'EM should display an opening splash screen when it starts up (default yes). tiled_map SLASH'EM 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. tile_width Specify the preferred width of each tile in a tile capable port use_inverse SLASH'EM should display inverse when the game specifies it. vary_msgcount SLASH'EM should display this number of messages at a time in the message window. windowcolors SLASH'EM should display windows with the specified fore- ground/background colors if it can. SLASH'EM 0.0.7 December 10, 2003 SLASH'EM Guidebook 50 wraptext SLASH'EM port should wrap long lines of text if they don't fit in the visible area of the window. 9.7. Platform-specific Customization options Here are explanations of options that are used by specific platforms or ports to customize and change the port behavior. altkeyhandler Select an alternate keystroke handler dll to load (Win32 tty SLASH'EM only). The name of the handler is specified without the .dll extension and without any path information. Cannot be set with the `O' command. altmeta (default on, AMIGA SLASH'EM only). BIOS Use BIOS calls to update the screen display quickly and to read the keyboard (allowing the use of arrow keys to move) on ma- chines with an IBM PC compatible BIOS ROM (default off, OS/2, PC, and ST SLASH'EM only). flush (default off, AMIGA SLASH'EM only). MACgraphics (default on, Mac SLASH'EM only). page_wait (default on, Mac SLASH'EM only). rawio Force raw (non-cbreak) mode for faster output and more bullet- proof input (MS-DOS sometimes treats `^P' as a printer toggle without it) (default off, OS/2, PC, and ST SLASH'EM only). Note: DEC Rainbows hang if this is turned on. Cannot be set with the `O' command. soundcard (default on, PC SLASH'EM only). Cannot be set with the `O' command. subkeyvalue (Win32 tty SLASH'EM only). May be used to alter the value of keystrokes that the operating system returns to SLASH'EM to help compensate for international keyboard issues. OP- TIONS=subkeyvalue:171/92 will return 92 to SLASH'EM, if 171 was originally going to be returned. You can use multiple subkey- value statements in the config file if needed. Cannot be set with the `O' command. SLASH'EM 0.0.7 December 10, 2003 SLASH'EM Guidebook 51 video Set the video mode used (PC SLASH'EM only). Values are `au- todetect', `default', or `vga'. Setting `vga' (or `autodetect' with vga hardware present) will cause the game to display tiles. Cannot be set with the `O' command. 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, (PC SLASH'EM only). 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 (de- fault dark normal light, PC SLASH'EM only). If the game dis- play is difficult to read, try adjusting these scales; if this does not correct the problem, try !color. Cannot be set with the `O' command. 9.8. Configuring autopickup exceptions There is an experimental compile time option called AU- TOPICKUP_EXCEPTIONS. If your copy of the game was built with that option defined, you can further refine the behavior of the autopickup option beyond what is available through the pick- up_types option. By placing autopickup_exception lines in your configuration file, you can define patterns to be checked when the game is about to autopickup something. autopickup_exception Sets an exception to the pickup_types option. The autopick- up_exception option should be followed by a string of 1-80 characters to be used as a pattern to match against the singu- lar form of the description of an object at your location. You may use the following special characters in a pattern: *--- matches 0 or more characters. ?--- matches any single character. In addition, some characters are treated specially if they occur as the first character in the string pattern, specifically: < - always pickup an object that matches the pattern that follows. > - never pickup an object that matches the pattern that follows. Can be set with the `O' command, but the setting is not pre- served across saves and restores. SLASH'EM 0.0.7 December 10, 2003 SLASH'EM Guidebook 52 Here's a couple of examples of autopickup_exceptions: autopickup_exception="<*arrow" autopickup_exception=">*corpse" autopickup_exception=">* cursed*" The first example above will result in autopickup of any type of arrow. The second example results in the exclusion of any corpse from autopickup. The last example results in the exclusion of items known to be cursed from autopickup. A `never pickup' rule takes precedence over an `always pickup' rule if both match. 9.9. Configuring User Sounds Some platforms allow you to define sound files to be played when a message that matches a user-defined pattern is delivered to the message window. At this time the Qt port and the win32tty and win32gui ports support the use of user sounds. The following config file entries are relevant to mapping user sounds to messages: SOUNDDIR The directory that houses the sound files to be played. SOUND An entry that maps a sound file to a user-specified message pattern. Each SOUND entry is broken down into the following parts: MESG - message window mapping (the only one supported in 3.4). pattern - the pattern to match. sound file - the sound file to play. volume - the volume to be set while playing the sound file. The exact format for the pattern depends on whether the platform is built to use ``regular expressions'' or SLASH'EM's own internal pattern matching facility. The ``regular expres- sions'' matching can be much more sophisticated than the internal SLASH'EM pattern matching, but requires 3rd party libraries on some platforms. There are plenty of references available else- where for explaining ``regular expressions''. You can verify which pattern matching is used by your port with the #version command. SLASH'EM's internal pattern matching routine uses the fol- lowing special characters in its pattern matching: *--- matches 0 or more characters. ?--- matches any single character. Here's an example of a sound mapping using SLASH'EM's inter- nal pattern matching facility: SLASH'EM 0.0.7 December 10, 2003 SLASH'EM Guidebook 53 SOUND=MESG "*chime of a cash register*" "gong.wav" 50 specifies that any message with "chime of a cash register" con- tained in it will trigger the playing of "gong.wav". You can have multiple SOUND entries in your config file. 9.10. Configuring SLASH'EM for Play by the Blind SLASH'EM can be set up to use only standard ASCII characters for making maps of the dungeons. This makes the MS-DOS versions of SLASH'EM completely accessible to the blind who use speech and/or Braille access technologies. Players will require a good working knowledge of their screen-reader's review features, and will have to know how to navigate horizontally and vertically character by character. They will also find the search capabili- ties of their screen-readers to be quite valuable. Be certain to examine this Guidebook before playing so you have an idea what the screen layout is like. You'll also need to be able to locate the PC cursor. It is always where your character is located. Merely searching for an @-sign will not always find your charac- ter since there are other humanoids represented by the same sign. Your screen-reader should also have a function which gives you the row and column of your review cursor and the PC cursor. These co-ordinates are often useful in giving players a better sense of the overall location of items on the screen. While it is not difficult for experienced users to edit the defaults.nh file to accomplish this, novices may find this task somewhat daunting. Included in all official distributions of SLASH'EM is a file called NHAccess.nh. Replacing defaults.nh with this file will cause the game to run in a manner accessible to the blind. After you have gained some experience with the game 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 the screen. If this is the case, disable the number_pad option and use the traditional Rogue-like commands. Character graphics Comment out all character graphics sets found near the bottom of the defaults.nh file. Most of these replace SLASH'EM's de- fault representation of the dungeon using standard ASCII char- acters with fancier characters from extended character sets, and these fancier characters can annoy screen-readers. SLASH'EM 0.0.7 December 10, 2003 SLASH'EM Guidebook 54 10. Scoring SLASH'EM maintains a list of the top scores or scorers on your machine, depending on how it is set up. In the latter case, each account on the machine can post only one non-winning score on this list. If you score higher than someone else on this list, or better your previous score, you will be inserted in the proper place under your current name. How many scores are kept can also be set up when SLASH'EM is compiled. Your score is chiefly based upon how much experience you gained, how much loot you accumulated, how deep you explored, and how the game ended. If you quit the game, you escape with all of your gold intact. If, however, you get killed in the Mazes of Menace, the guild will only hear about 90% of your gold when your corpse is discovered (adventurers have been known to collect finder's fees). So, consider whether you want to take one last hit at that monster and possibly live, or quit and stop with 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 slashem -s all on most versions. 11. Explore mode SLASH'EM is an intricate and difficult game. Novices might falter in fear, aware of their ignorance of the means to survive. Well, fear not. Your dungeon may come equipped with an ``ex- plore'' or ``discovery'' mode that enables you to keep old save 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. 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. SLASH'EM is the product of literally dozens of people's work. Main events in the course of the game development are de- scribed below: SLASH'EM 0.0.7 December 10, 2003 SLASH'EM Guidebook 55 Jay Fenlason wrote the original Hack, with help from Kenny 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. A scant one month before the next major version release of NetHack, two adventurous souls undertook their own modification to the sacred NetHack formula. Tom Proudfoot and Yuval released Nethack++, which was rapidly renamed Nethack--, contained new monsters, items and other miscellaneous modifications. 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 individual character quests, a new endgame and many other new features, and produced NetHack 3.1. SLASH'EM 0.0.7 December 10, 2003 SLASH'EM Guidebook 56 Ken Lorber, Gregg Wonderly and Greg Olson, with help from Richard Addison, Mike Passaretti, and Olaf Seibert, developed NetHack 3.1 for the Amiga. Norm Meluch and Kevin Smolkowski, with help from Carl Sche- lin, Stephen Spackman, Steve VanDevender, and Paul Winner, ported NetHack 3.1 to the PC. 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. Time passed, and Nethack-- was ported to 3.11 by Chris. Stephen White then released his own modification known as Nethack Plus, which contained new character classes. Unbe- knownst to the world at large, Tom Proudfoot took this source and combined it with his Nethack--. Stephen White went on to add weapon skills, which were eventually integrated into the next version of Nethack, and other features. In February 1996, Tom Proudfoot released SLASH V1. Includ- ing part of Stephen White's Nethack Plus and his own Nethack--, leaving unmentioned his own slew of further modifications, this is perhaps the best known of the Nethack modifications. Six ver- sions of this, ending with SLASH V6, are known to exist. The 3.2 development team, comprised of Michael Allison, Ken Arromdee, David Cohrs, Jessie Collet, Steve Creps, Kevin Darcy, Timo Hakulinen, Steve Linhart, Dean Luick, Pat Rankin, Eric Smith, Mike Stephenson, Janet Walz, and Paul Winner, released version 3.2 in April of 1996. 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. SLASH'EM 0.0.7 December 10, 2003 SLASH'EM Guidebook 57 Larry Stewart-Zerba set along a different track - to enhance the spellcasting abilities of the Wizard. Thus, in April 1996, he released version 0.1 of the Wizard Patch. By July, he was joined by Warwick Allison and version 0.4 of the Wizard Patch was released. The final update came in April 1997, with the release of Wizard Patch 1.0. Warwick Allison also ported NetHack to use the Qt interface. SLASH V6 was picked up by Enrico Horn, who managed to syn- chronize it with the 3.2 source. The new SLASH 4.1.2 was re- leased as far back as November 1996 went through at least 4 ed- itlevels (E5, E6, E7) with the latest version being 4.1.2E8, synchronized with Nethack 3.2.2 and the Blackmarket option avail- able, released in June 1997. Nathan La began the arduous task of drawing tiles for the SLASH monsters. Kentaro Shirakata ported SLASH 4.1.2E8 to Unix. Lief Clennon ported SLASH 4.1.2E8 to OS/2 EMX. Romain Dolbeau ported SLASH 4.1.2E8 to Macintosh. Warren Cheung combined SLASH 4.1.2 and Wizard Patch to cre- ate SLASH'EM 0.1 in November 1997. Several revisions including new spells and other additions led eventually to SLASH'EM 0.0.5E7F1. Steven Uy generously made additional modifications. Dirk Schoenberger continued updating the SLASH/SLASH'EM mon- ster tiles. He also ported SLASH'EM to Linux. Lief Clennon ported SLASH'EM to OS/2 EMX. Kevin Hugo ported SLASH'EM to Macintosh, and also con- tributed additional changes and improvements. Robin Johnson finished the arduous task of drawing tiles for the SLASH'EM monsters. He also contributed many more new tiles. Kevin later joined the DevTeam and incorporated the best of these ideas in NetHack 3.3. JNetHack (the Japanese version of NetHack) has been around since at least 1994, developed by Issei Numata and others. The GTK interface was written for this variant and released in 1999. Mitsuhiro Itakura headed a team which began the process of redrawing the NetHack tiles in 8-bit color at 32x32 pixels. 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. SLASH'EM 0.0.7 December 10, 2003 SLASH'EM Guidebook 58 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. Alex Kompel also contributed a Win- dows CE port for 3.4.1. 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/. SLASH'EM 0.0.7 December 10, 2003 SLASH'EM Guidebook 59 Warren Cheung combined SLASH'EM 0.0.5E7F1 and NetHack 3.3 to create SLASH'EM 0.0.6 and continues to maintain the DOS and Mi- crosoft Windows ports. J. Ali Harlow incorporated the GTK interface and Mitsuhiro Itakura's 32x32 tileset into SLASH'EM 0.0.6 and maintains the UNIX port of SLASH'EM. Peter Makholm maintains the Debian pack- age. Paul Hurtley maintains the MAC port of SLASH'EM. - - - - - - - - - - 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: SLASH'EM 0.0.7 December 10, 2003 SLASH'EM Guidebook 60 Adam Aronow Izchak Miller Mike Stephenson Alex Kompel J. Ali Harlow Norm Meluch Andreas Dorn Janet Walz Olaf Seibert Andy Church Janne Salmijarvi Pasi Kallinen Andy Swanson Jean-Christophe Collet Pat Rankin Ari Huttunen Jochen Erwied Paul Winner Barton House John Kallen Pierre Martineau Benson I. Margulies John Rupley Ralf Brown Bill Dyer John S. Bien Ray Chason Boudewijn Waijers Johnny Lee Richard Addison Bruce Cox Jon W{tte Richard Beigel Bruce Holloway Jonathan Handler Richard P. Hughey Bruce Mewborne Joshua Delahunty Rob Menke Carl Schelin Keizo Yamamoto Robin Johnson Chris Russo Ken Arnold Roderick Schertler David Cohrs Ken Arromdee Roland McGrath David Damerell Ken Lorber Ron Van Iwaarden David Gentzel Ken Washikita Ronnen Miller David Hairston Kevin Darcy Ross Brown Dean Luick Kevin Hugo Sascha Wostmann Del Lamb Kevin Sitze Scott Bigham Deron Meranda Kevin Smolkowski Scott R. Turner Dion Nicolaas Kevin Sweet Stephen Spackman Dylan O'Donnell Lars Huttar Stephen White Eric Backus Malcolm Ryan Steve Creps Eric Hendrickson Mark Gooderum Steve Linhart Eric R. Smith Mark Modrall Steve VanDevender Eric S. Raymond Marvin Bressler Teemu Suikki Erik Andersen Matthew Day Tim Lennan Frederick Roeber Merlyn LeRoy Timo Hakulinen Gil Neiger Michael Allison Tom Almy Greg Laskin Michael Feir Tom West Greg Olson Michael Hamel Warren Cheung Gregg Wonderly Michael Sokolov Warwick Allison Hao-yang Wang Mike Engber Yitzhak Sapir Helge Hafting Mike Gallop Irina Rempt-Drijfhout Mike Passaretti Brand and product names are trademarks or registered trademarks of their respective holders. SLASH'EM 0.0.7 December 10, 2003 slashem-0.0.7E7F3/doc/dlb.60000664000076400007640000000356510545462317013262 0ustar aliali.TH DLB 6 "28 Oct 1993" .UC 4 .SH NAME dlb \- NetHack data librarian .SH SYNOPSIS .B dlb { .B xct } [ .B vfIC ] arguments... [ .B files... ] .SH DESCRIPTION .PP .I Dlb is a file archiving tool in the spirit (and tradition) of tar for NetHack version 3.1 and higher. It is used to maintain the archive files from which NetHack reads special level files and other read-only information. Note that like tar the command and option specifiers are specified as a continuous string and are followed by any arguments required in the same order as the option specifiers. .PP This facility is optional and may be excluded during NetHack configuration. .SH COMMANDS The .B x command causes .I dlb to extract the contents of the archive into the current directory. .PP The .B c command causes .I dlb to create a new archive from files in the current directory. .PP The .B t command lists the files in the archive. .SH OPTIONS AND ARGUMENTS .DT .ta \w'f archive\ \ \ 'u v verbose output .br .sp 1 f archive specify the archive. Default if f not specified is LIBFILE (usually the nhdat file in the playground). .br .sp 1 I lfile specify the file containing the list of files to put in to or extract from the archive if no files are listed on the command line. Default for archive creation if no files are listed is LIBLISTFILE. .br .sp 1 C dir change directory. Changes directory before trying to read any files (including the archive and the lfile). .br .SH EXAMPLES Create the default archive from the default file list: .br dlb c .sp 1 List the contents of the archive 'foo': .br dlb tf foo .SH AUTHOR .PP Kenneth Lorber .SH "SEE ALSO" .PP nethack(6), tar(1) .SH BUGS .PP Not a good tar emulation; - does not mean stdin or stdout. Should include an optional compression facility. Not all read-only files for NetHack can be read out of an archive; examining the source is the only way to know which files can be. slashem-0.0.7E7F3/doc/proxy.doc0000664000076400007640000003206510545462317014277 0ustar alialiIntroduction This file documents the proxy windowing interface. It is far from complete. Contents: I. An overview of the components II. Adding a standard procedure III. Adding a standard callback IV. Adding an extension I. An overview of the components The proxy window interface is made up of a number of components. This is because it is intended to be used both as a standard window interface to be linked with the game executable and as a library that can be linked with an external window port to handle the communication with the game. The modules can be broken down into the following types: A. Common modules used in both processes (proxycom) B. The proxy window interface (winproxy) C. Utility modules used in the game executable (proxyutl) D. Client modules used only by the external process (proxyclnt) The main game executable is built with the winproxy, proxyutl and proxycom modules; external interfaces are built with the nhproxy library which consists of the proxyclnt and proxycom modules. When building a window interface as an external port, the proxyutl modules are just a special case of the winproxy modules. However, if a window interface is designed to be built as either an external port or as an internal window interface then the code can normally be simplified by using the proxyutl modules in the internal window interface. The proxy window interface has a number of include files which are used as follows: A. Common include files: nhxdr.h proxycom.h B. Proxy window interface include files: winproxy.h C. External process include files: proxyclnt.h proxycb.h II. Adding a standard procedure First choose a name for the new procedure. We will use ${name} to refer to the lowercase version of the chosen name in this document and ${NAME} to refer to the uppercase version. Modify the source as follows: A. win/proxy/ext_protocol.html o Add a new procedure ID to the list using the next unused ID number. o Add a new section describing the procedure, its parameters and result. o Bump the version of the protocol, NhExt, if necessary. o Note the formal description of parameters and results must follow the syntax of Sun's XDR language so that the test procedure laid out in win/proxy/Makefile.* will be valid. Formal descriptions must be enclosed in a
...
pair. These html tags must be on a line by themselves. o If you have access to rpcgen then you can use the relevant makefile to build rpcgen-nhext_xdr.c and so check your syntax. B. include/prxyclnt.h o Add a new field to the end of struct window_ext_procs to hold a pointer to a function which takes the relevant parameters and returns the relevant result. The field should be named winext_${name}. C. include/proxycom.h o Add a new procedure ID to the list using the ID chosen above: #define EXT_FID_${NAME} 0x## o If any of the parameters or return value are too complex for nhext_rpc() then define a struct proxy_${name}_req and/or proxy_${name}_res and declare an XDR function to handle it (enclose the additions inside an #ifdef NHXDR_H ... #endif pair). o If you changed the NhExt protocol version above, then update the values here to match. D. win/proxy/compxdr.c If you declared an XDR function in winproxy.h, then you need to define it in this file. Many XDR functions consist simply of calling standard XDR functions for each field of the aggregate type and returning the bitwise AND of their return values. XDR functions should not return early if an error occurs so the use of logical AND operators is generally to be avoided. E. win/proxy/winproxy.c Define the proxy_${name} function you declared above. This function will be called by the game when it wants to perform the relevant procedure. It should: o Do any preparation needed on the parameters (normally none). o Initialize any buffers that will be used to receive values back from the windowing interface. The XDR convention is that NULL pointers indicate that XDR should allocate memory whereas non-NULL pointers indicate that XDR should use the pre-allocated memory. o Call nhext_rpc() to send an RPC packet to the windowing interface and read back the reply. o Return the result (if any). F. win/proxy/proxysvc.c This module implements the support in the windowing interface(s) for the procedure. You should: o Declare a static function to handle the incoming request as follows: static void FDECL(proxy_svc_${name}, \ (unsigned short, NhExtXdr *, NhExtXdr *)); o Define the handling function. It should: - Decode the incoming parameters by calling nhext_rpc_params() and passing it the request XDR handle and parameters which describe the format of the parameters to your procedure. - Take whatever action the game is requesting. - Encode the result of that action ready to be sent back to the game by calling nhext_rpc_params() and passing it the reply XDR handler and parameters which describe the format of the results of your procedure. Note: If this procedure has no result then you must still return an empty result to the game. o Add an entry to the services array as follows: EXT_FID_${NAME}, proxy_svc_${name}, o If this is an asynchronous procedure (this is, if it returns no results and there is no need for the remote end to wait for the procedure to complete) then add an entry for the procedure in the async_procedures[] array. If there are already asynchronous procedures with IDs in the same range (1-32, 33-64, ...) then just add the bit corresponding to the new procedure to the mask for that range. If this is the first asynchronous procedure in the range then add a new mask as follows: 1 << EXT_FID_$(NAME) - EXT_FID_$(BASE_NAME), where $(BASE_NAME) is the name of the first procedure in the range (whether asynchronous or not). G. external window interface(s) Add an entry to the window_ext_procs structure for each external window interface for the newly defined winext_${name} field. This should either be a hook function that does nothing except return an appropriate result (for window interfaces that do not wish to support the new procedure) or a function to do the work for the new procedure as newly documented in ext_protocol.html. H. game source Add code to call proxy_${name} at the appropriate points in the game source. III. Adding a standard callback First choose a name for the new callback. We will use ${name} to refer to the lowercase version of the chosen name in this document and ${NAME} to refer to the uppercase version. Modify the source as follows: A. win/proxy/ext_protocol.html o Add a new callback ID to the list using the next unused ID number. o Add a new section describing the callback, its parameters and result. o Bump the version of the protocol, NhExt, if necessary. o Note the formal description of parameters and results must follow the syntax of Sun's XDR language so that the test procedure laid out in win/proxy/Makefile.* will be valid. Formal descriptions must be enclosed in a
...
pair. These html tags must be on a line by themselves. o If you have access to rpcgen then you can use the relevant makefile to build rpcgen-nhext_xdr.c and so check your syntax. B. include/proxycb.h o Declare proxy_cb_${name} as a function which takes the relevant parameters and returns the relevant result. C. include/proxycom.h o Add a new callback ID to the list using the ID chosen above: #define EXT_CID_${NAME} 0x## o If any of the parameters or return value are too complex for nhext_rpc() then define a struct proxycb_${name}_req and/or proxycb_${name}_res and declare an XDR function to handle it (enclose the additions inside an #ifdef NHXDR_H ... #endif pair). o If you changed the NhExt protocol version above, then update the values here to match. D. win/proxy/compxdr.c If you declared an XDR function in proxycb.h, then you need to define it in this file. Many XDR functions consist simply of calling standard XDR functions for each field of the aggregate type and returning the bitwise AND of their return values. XDR functions should not return early if an error occurs so the use of logical AND operators is generally to be avoided. E. win/proxy/proxycb.c Define the proxy_cb_${name} function you declared above. This function will be called by windowing interfaces when they want to perform the relevant callback. It should: o Do any preparation needed on the parameters (normally none). o Initialize any buffers that will be used to receive values back from the game. The XDR convention is that NULL pointers indicate that XDR should allocate memory whereas non-NULL pointers indicate that XDR should use the pre-allocated memory. o Call nhext_rpc() to send an RPC packet to the game and read back the reply. o Return the result (if any). F. win/proxy/callback.c This module implements the support in the game executable for the call back. You should: o Declare a static function to handle the incoming request as follows: static void FDECL(callback_${name}, \ (unsigned short, NhExtXdr *, NhExtXdr *)); o Define the handling function. It should: - Decode the incoming parameters by calling nhext_rpc_params() and passing it the request XDR handle and parameters which describe the format of the parameters to your call back. - Take whatever action the calling windowing interface is requesting. - Encode the result of that action ready to be sent back to the windowing port by calling nhext_rpc_params() and passing it the reply XDR handler and parameters which describe the format of the results of your call back. Note: If this call back has no result then you must still return an empty result to the windowing port. o Add an entry to the proxy_callbacks array as follows: EXT_CID_${NAME}, callback_${name}, G. win/proxy/winproxy.c If this is an asynchronous callback (this is, if it returns no results and there is no need for the remote end to wait for the callback to complete) then add an entry for the callback in the async_callbacks[] array. If there are already asynchronous callbacks with IDs in the same range (1-32, 33-64, ...) then just add the bit corresponding to the new callback to the mask for that range. If this is the first asynchronous callback in the range then add a new mask as follows: 1 << EXT_CID_$(NAME) - EXT_CID_$(BASE_NAME), where $(BASE_NAME) is the name of the first callback in the range (whether asynchronous or not). H. external window interface(s) Add code to call proxy_cb_${name} to the external window interfaces which need the new callback. IV. Adding an extension Extensions are used to allow callbacks not detailed in the NhExt standard to be provided by a game server and queried for by the client. Extensions have names, version numbers and a set of callbacks. It is assumed that by one means or another the name and version number is sufficient for the client and server to agree on the meaning of each callback along with the details of the various request and reply packets (the extension system provides no means of querying these details). First choose a name for the new extension. We will use ${name} to refer to the chosen name in this document. Modify the source as follows: A. server Add code in some appropriate module (or create a new module) to handle the extension. This code should include an initialization routine and a handler. The initialization routine is called by proxy_init() during the initialization of the proxy interface. It is passed one parameter - the base ID chosen for the extension (this may vary as extensions are added or removed). The handler will be called to handle a callback. It is passed the ID of the callback and pointers to the request and reply packets. The following is an example of a trivial extension with just one callback which takes one integer value and returns value + 1: static unsigned short xyzzy_base_id; void xyzzy_init(base_id) unsigned short base_id; { xyzzy_base_id = base_id; } void xyzzy_handler(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { int i; switch (id - xyzzy_base_id) { case 0: nhext_rpc_params(request, 1, EXT_INT_P(i)); i++; nhext_rpc_params(reply, 1, EXT_INT(i)); break; default: impossible("xyzzy_handler: Bad ID %u (base %u)", id, xyzzy_base_id); nhext_rpc_params(reply, 0); } } B. win/proxy/winproxy.c o Declare the initialization and handler functions you defined above before the definition of proxy_extents[], as follows: extern void FDECL(${name}_init, (unsigned short)); extern void FDECL(${name}_handler, (unsigned short, NhExtXdr *, NhExtXdr *)); o Add an entry to proxy_extents[] as follows: { "${name}", "1.0", ${name}_init, 2, ${name}_handler }, - Replace 1.0 with the version number. If you need to support more than one version of an extension then you must supply seperate initialization functions although they can share the same handler function if desired. The prefered interface should be listed first. - Replace 2 with the number of callbacks included in this extension. slashem-0.0.7E7F3/doc/tmac.n0000664000076400007640000006101710545462317013531 0ustar aliali\" @(#)$Id: tmac.n,v 1.1.1.1 2000/08/15 19:34:34 wacko Exp $ .\" The News macro package .\" .\" This is the macro package that is used to format news documents. It .\" was written because many sites do not have one of the -mm or -ms pack- .\" ages that the documents use. This is NOT compatible with EITHER, but .\" (I hope) will become the standard for all news documents (man pages .\" excepted, since everyone seems to have -man.) .\" .\" This package was written using only the "NROFF/TROFF Users' Guide", .\" and therefore if you can run NROFF/TROFF, you can legitimately use .\" this package. However, because NROFF/TROFF are proprietary programs, .\" I cannot place this package in the public domain. This should not .\" matter, because if you legitimately have NROFF/TROFF, you have the .\" documentation; if not, you can't run off the documentation anyway. .\" .\" This package may be circulated freely with the news documentation; it .\" may not be sold, but is to be distributed with the unformatted news .\" documents. However, the name of the author and the place at which it .\" was written (in the author's own time, of course) are not to be .\" removed from the package regardless of how it is modified or altered. .\" Further, please do not distribute this package if you make any changes .\" because I don't want to get bug reports of macros I haven't written; .\" if you have a goodie you want me to add, send it to me and we'll talk. .\" (I really do like feedback!) I'd really appreciate your cooperation. .\" .\" Author: Matt Bishop .\" Research Institute for Advanced Computer Science .\" Mail Stop 230-5 .\" NASA Ames Research Center .\" Moffett Field, CA 94035 .\" .\" version 1.0 September 28, 1985 mab@riacs.arpa .\" initial version .\" version 1.1 October 25, 1985 mab@riacs.arpa .\" fixed an incredibly obscure footnote bug (that occurred twice in .\" the news documentation!) which put footnoted words on one page .\" and the footnote on the next if the word was in the next-to-last .\" or last line; commented it, and generally cleaned up .\" Version 1.2 October 27, 1985 mab@riacs.arpa .\" Added a few more comments and a check to keep footnotes lined up .\" with the bottom margin. .\" Version 1.3 February 12, 1986 mab@riacs.arpa .\" Added an error check to catch unmatched ef's and ed's .\" Version 1.4 December 29, 1986 mab@riacs.edu .\" Changed footnote for ux, pd, and vx macros and added a string .\" for rg ("Registered Trademark") .\" Version 1.5 January 2, 1989 Matt.Bishop@dartmouth.edu .\" Minor modifications for nroff compatibility .\" Version 1.6 March 15, 1989 Matt.Bishop@dartmouth.edu .\" ..!bear.dartmouth.edu!bishop .\" Fixed a bug in footnote handling (again, sigh ...) This one .\" occurred when the the "fo" trap position was reset just beneath .\" the current line; the footnote overflow trap would kick in and .\" never be closed. .\" .\" .\" ********** .\" these preserve and restore various things .\" they are used to shorten other macros .de yf \" restore fonts .ft \\n(f2 \" previous font .ft \\n(f1 \" current font .. .de yi \" restore indents 'in \\n(i2u \" previous indent 'in \\n(i1u \" current indent .. .de ys \" restore point sizes .ps \\n(s2 \" previous point size .ps \\n(s1 \" current point size .. .de yv \" restore vertical spacings .vs \\n(v2u \" previous vertical spacing .vs \\n(v1u \" current vertical spacing .. .de ya \" restore everything .yf \" restore fonts .yi \" restore indents .ys \" restore point sizes .yv \" restore vertical spacing .. .de zf \" preserve fonts .nr f1 \\n(.f \" current font .ft \" switch to previous font .nr f2 \\n(.f \" previous font .ft \" back to current font .. .de zi \" preserve indents .nr i1 \\n(.iu \" current indent 'in \" switch to previous indent .nr i2 \\n(.iu \" previous indent 'in \" back to current indent .. .de zs \" preserve point sizes .nr s1 \\n(.su \" current point size .ps \" switch to previous point size .nr s2 \\n(.su \" previous point size .ps \" back to current point size .. .de zv \" preserve vertical spacings .nr v1 \\n(.vu \" current vertical spacing .vs \" switch to previous vertical spacing .nr v2 \\n(.vu \" previous vertical spacing .vs \" back to current vertical spacing .. .de za \" save everything .zf \" save fonts .zi \" save indents .zs \" save point sizes .zv \" save vertical spacings .. .\" ********** .\" these actually print the header and footer titles .\" they are defined separately from the "hd" and "fo" macros .\" to make user redefinition easy .de pt \" print header title . \" omit header on first page .if \\n%>1 \{\ ' sp |\\$1u \" move to proper position . ft 1 \" change to default font . ps \\n(ps \" change to default point size . vs \\n(vs \" change to default spacing . tl '\\*(h0'\\*(h1'\\*(h2' \" center title . vs \" restore current vertical spacing . ps \" restore current point size . ft \" restore current font .\} .. .de pf \" print footer title .ft 1 \" change to default font .ps \\n(ps \" change to default point size .vs \\n(vs \" change to default spacing .ie \\n%=1 .tl '\\*(h0'\\*(h1'\\*(h2' \" on first page, print the header here .el .tl '\\*(f0'\\*(f1'\\*(f2' \" on other pages, print the footer .vs \" restore current vertical spacing .ps \" restore current point size .ft \" restore current font .. .\" ********** .\" these are the top of page (header) and bottom of page (footer) macros .\" they don't actually print anything, just call the right macros .de hd \" header -- do top of page processing .if t .if \\n(cm .tl '\(rn''' \" drop cut mark if needed .pt \\n(ttu \" print header .nr fc 0 1 \" init footnote count .nr fs \\n(.pu-\\n(bmu-1u \" if any footnotes, start print here .nr fp 0-\\n(bmu \" reset current footer place .ch fo -\\n(bmu \" reset footer trap .if \\n(dn .fz \" put leftover footnotes st bottom .ya \" restore font, etc. 'sp |\\n(tmu \" move to top of body .ns \" don't allow any more space .. .de fo \" footer -- do bottom of page processing .za \" save font, etc. .rs \" you want motions here .nr dn 0 \" clobber diversion size register .if \\n(fc .fd \" now print the footnotes, if any 'bp \" force out page .. .\" ********** .\" these are the footnote macros .\" here's an overview: .\" Footnotes are processed in environment #1, which is initialized .\" at the bottom of this package. When "fn" is called, nroff/troff .\" switches to this environment. The body of the footnote is saved .\" in the diversion "tf" (for "temporary footnote"), so you will .\" NEVER spring a trap during the first reading of a footnote. When .\" "ef" ("end footnote") is called, the diversion is closed. If .\" this is the first footnote on the page (ie, the number register .\" "fc" is 1), and the footnote height (plus the height of 1 line) .\" crosses the bottom margin, you get the footnoted word on one .\" page and the footnote on the other. In this case we just call .\" "fo" manually (taking case it cannot be re-invoked on the same .\" page!) If this situation does not occur, we just adjust the .\" footer trap's position upwards (we'll get to how far in a min- .\" ute); if this puts the trap above the current line, we reposi- .\" tion the trap just beneath the current line to be sure of trig- .\" triggering it once the current line is forced out. .\" To reposition the footer trap, we proceed as follows. Because .\" the trap may be sprung in the middle of a line, it is possible .\" that the footnote will not fit on the page (regardless of where .\" on the page the footnoted word occurs -- really!) if we move the .\" trap up by the size of the footnote diversion "tf". So, we .\" fudge things a little bit -- for the first footnote on each page .\" we move the footer trap up 1 extra line ("line" being 1v in env- .\" ironment #0). Unless the point size and vertical spacing are .\" increased between the first footnote and the footer trap's being .\" sprung, this will keep the footnotes on the same page as the .\" footnoted word. But as there may be now as much as 1v of space .\" between the footnote and the bottom margin, which looks HIDEOUS, .\" we use the number register "fs" to mark where the footer trap .\" would REALLY go, and just space to it when it comes time to put .\" out the footnotes. .de fd \" dump footnotes .nr gs 1v \" get a measure of 1 line in env #0 .ev 1 \" switch to footnote environment .nr gs +2v \" min of 2 lines of footnotes . \" if the number register ns > 0, . \" the last text line may contain a . \" footnote that is too big to fit; . \" this checks for such a note and . \" if so, forces the footnote into . \" the "fy" diversion that carries . \" it onto the next text page .ie (\\n(nsu>0)&(\\n(gsu>=\\n(.tu) 'sp \\n(gsu \" be sure you can get it down .el .if \\n(fsu>\\n(nlu 'sp \\n(fsu-\\n(nlu \" move to footnote start position 'nf \" don't reprocess footnotes 'in 0 \" don't indent them any more either .tf \" drop text of footnotes .rm tf .if '\\n(.z'fy' .di \" end overflow diversion, if any .nr fc 0 \" re-init footnote count .ev \" return to usual environment .. .de fn \" start footnote . \" look for nested footnotes -- ILLEGAL .ie \\n(if>0 .er "footnote within footnote" .el .da tf \" append footnote to footnote diversion .nr if +1 \" increment level of footnoting .nr fc +1 \" one more footnote on this page .if \\n(fc=1 .nr fp -1v \" The reason for this "fudge factor" . \" is that there is no way to force . \" NROFF/TROFF to invoke a macro at . \" the end of each line. At times, . \" the trap boundary will not match up . \" with the bottom of a line, so the . \" "fo" trap which is set at 2320 may . \" not be triggered until 2340 -- and . \" then the footnote won't fit. This . \" gives some slack so the footnote is . \" more likely to fit. *sigh* .ev 1 \" enter footnote environment .if \\n(fc=1 .fs \" drop separator if first footnote .br \" flush out any previous line in footnote .fi \" process footnote in fill mode .. .de ef \" end footnote .br \" flush out the line in footnote .ie \\n(if<=0 .er "end footnote has no corresponding begin footnote" .el \{\ . nr if -1 \" decrement level of footnoting . nr fg 2v \" remember this for repositioning fo . ev \" back to usual environment . if \\n(if=0 \{\ . di \" end of footnote proper . nr fp -\\n(dnu \" "fo" will be moved at least up this far . nr fs -\\n(dnu \" increase size of footnote . ch fo \\n(fpu \" reposition "fo" trap (first guess) . \" the first part of the "ie" clause . \" is taken in the special case . \" described above . ie (\\n(fc=1)&((\\n(nlu+1v+\\n(fgu)>=(\\n(.pu-\\n(bmu)) \{\ . nr ns \\n(dnu \" suppress footnote separator . \" since this footnote contains it . \" keep "fo" from being invoked twice . ch fo \\n(.pu+1i . fo \" force the page out AT ONCE . nr ns 0 \" re-enable footnote separator . \} . \" footnote won't fit completely . \" invoke the footer trap but . \" don't worry about the footnote . \" separator (it's already there) . el .if (\\n(nlu+1v)>=(\\n(.pu+\\n(fpu) \{\ . \" as before we must reposition the . \" "fo" trap to prevent "fo" from . \" being invoked twice . ch fo \\n(.pu+1i . fo \" force the page out AT ONCE . \} . \} .\} .. .de fs \" drop footnote separator . \" only if not already dropped .if \\n(ns=0 \l'1i' .nr ns 0 \" in case footnotes are over 1 page long .. .de fx \" process footnote overflow .if \\n(fc .di fy \" stuff them in the right place .. .de fz \" deposit footnote overflow .fn \" treat it as a footnote .nf \" it's already been processed .in 0 \" and indented .fy \" "fx" put it here .ef \" end the footnote .. .\" ********** .\" the ones after here are user-invoked (like "fn" and "ef" above) .\" title, author, etc. .de mt \" main title \& .sp |\\n(mtu \" space .ft 3 \" in bold .ps \\n(ps+2p \" large point size and .vs \\n(vs+2p \" vertical spacing .ce 1000 \" center the title .nr t2 1 \" space it .. .de au \" author .nr t2 0 \" spacing here .sp 2v \" space .ft 2 \" in italics .ps \\n(ps \" usual point size and .vs \\n(vs \" vertical spacing .ce 1000 \" center the name(s) .. .de ai \" author's institution .if \\n(t2 .sp 2v \" space after a title .nr t2 0 \" institution .ft 2 \" in italics .ps \\n(ps \" usual point size and .vs \\n(vs \" vertical spacing .ce 1000 \" center the name(s) .. .de bt \" begin text macro .nr t2 0 \" hold it here .nr it +1 \" mark as called .ce 0 \" end any centering .sn 3v \" a little bit of space .. .\" paragraph .de si \" start indented section .nr lo \\n(lm \" remember the current level .nr lm +1 \" go to the next level .ie '\\$1'' .nr l\\n(lm \\n(l\\n(lo+5n \" if no arg, indent 5n .el .nr l\\n(lm \\$1n \" otherwise, indent that much .. .de ei \" end indent .nr lm -1 \" down one level .if \\n(lm<0 .nr lm 0 \" make sure you don't go too far .. .de pg \" plain old paragraph .if !\\n(it .bt \" end the title and such .sn \\n(pdu \" inter-paragraph spacing .ft 1 \" reset a few things (paranoia) . \" these ONLY if not in footnote .ie \\n(if=0 \{\ . ps \\n(ps \" reset point size . vs \\n(vs \" reset vertical spacing . ne 1v+\\n(.Vu \" slightly more than 1 line .\} .el \{\ . ps \\n(ps-2p \" reset point size . vs \\n(vs-2p \" reset vertical spacing .\} .in \\n(l\\n(lmu \" stop any indenting .ce 0 \" stop any centering .if !'\\$1'L' .if !'\\$1'l' .ti +\\n(piu \" indent the sucker .. .de lp \" labelled paragraph .pg l \" reset paragraph .if \\n(.$>1 .nr li \\$2n \" if indent given use it .in +\\n(liu \" indent for paragraph .ti -\\n(liu \" force first line NOT to indent .ta +\\n(liu \" for the label \&\\$1\t\c .if \\w'\\$1'u>=(\\n(l\\n(lmu+\\n(liu) .br \" don't overwrite .. .\" The following two macros (hu & hn) have been modified for ELM usage. .\" If the macros have text as part of the macro call, the text will be .\" increased in size by two points. After printing the text, the font .\" will be returned to normal, otherwise the font will be left bold. .\" .\" section .de hu \" header, unnumbered . \" format: .hu [text] .if !\\n(it .bt \" end the title and such .br \" force out previous line .b .ie \\n(hP .ps \\n(hP .el .ps \\n(ps .ie \\n(hv .vs \\n(hv .el .vs \\n(vs .in \\n(l\\n(lmu \" stop any indenting .sn \\n(hsu \" inter-section spacing .ne 3v+\\n(.Vu \" slightly more than 3 lines .fi \" process the text, too .if \\n(.$>=1 \{\ .ps +2 \\$1 .\} .if \\n(.$>=2 \\$2 .if \\n(.$>=3 \\$3 .if \\n(.$>=4 \\$4 .if \\n(.$>=5 \\$5 .if \\n(.$>=6 \\$6 .if \\n(.$>=7 \\$7 .if \\n(.$>=8 \\$8 .if \\n(.$=9 \\$9 .if \\n(.$>=1 \{\ .ps -2 .br .ft 1 .\} .. .de hn \" header, numbered . \" format: .hn [level] [text] .if !\\n(it .bt \" end the title and such .br \" force out previous line .b .ie \\n(hP .ps \\n(hP .el .ps \\n(ps .ie \\n(hv .vs \\n(hv .el .vs \\n(vs .in \\n(l\\n(lmu \" stop any indenting .sn \\n(hsu \" inter-section spacing .ne 3v+\\n(.Vu \" slightly more than 3 lines .fi \" process the text, too .ie !'\\$1'' .nr hn \\$1 .el .nr hn 1 .ie \\n(hn>0 .nr hn -1 .el .nr hn 0 .ie \\n(hn=0 \{\ . nr h0 +1 \" add 1 to main section header . nr h1 0 \" zap remaining section numbers . nr h2 0 \" zap remaining section numbers . nr h3 0 \" zap remaining section numbers .ie \\n(.$>=2 \{\ .ps +2 \\n(h0. .ps -2 .\} .el \\n(h0. .\} .el .ie \\n(hn=1 \{\ . nr h1 +1 \" add 1 to the section header . nr h2 0 \" zap remaining section numbers . nr h3 0 \" zap remaining section numbers .ie \\n(.$>=2 \{\ .ps +2 \\n(h0.\\n(h1. .ps -2 .\} .el \\n(h0.\\n(h1. .\} .el .ie \\n(hn=2 \{\ . nr h2 +1 \" add 1 to the section header . nr h3 0 \" zap remaining section numbers .ie \\n(.$>=2 \{\ .ps +2 \\n(h0.\\n(h1.\\n(h2. .ps -2 .\} .el \\n(h0.\\n(h1.\\n(h2. .\} .el \{\ . nr h3 +1 \" add 1 to the section number .ie \\n(.$>=2 \{\ .ps +2 \\n(h0.\\n(h1.\\n(h2.\\n(h3. .ps -2 .\} .el \\n(h0.\\n(h1.\\n(h2.\\n(h3. .\} .if \\n(.$>=2 \{\ .ps +2 \\$2 .\} .if \\n(.$>=3 \\$3 .if \\n(.$>=4 \\$4 .if \\n(.$>=5 \\$5 .if \\n(.$>=6 \\$6 .if \\n(.$>=7 \\$7 .if \\n(.$>=8 \\$8 .if \\n(.$>=9 \\$9 .if \\n(.$>=2 \{\ .br .ft 1 .ps -2 .\} .. .\" displays (no floats, thank God!) .de sd \" start display . \" look for nested displays -- ILLEGAL .ie \\n(id>0 .er "display within display" .el \{\ . ie '\\$1'c' .nr sf 1 \" center the sucker . el .nr sf 0 \" don't center it .\} .sn \\n(pdu \" a little bit of space .ev 2 \" switch to display environment .nf \" what you type is what you get .if \\n(id=0 .di dd \" start saving text .rs \" don't eat leading space .nr id +1 \" increment level of display .. .de ed \" end display .br \" flush line .ie \\n(id<=0 .er "end display has no corresponding begin display" .el \{\ . nr id -1 \" decrement level of display . if \\n(id=0 \{\ . di \" end diversion . fi \" resume filling . in -\\n(piu \" dedent . ev \" pop environment . ne \\n(dnu \" be sure you have room . nf \" don't reprocess display . rs \" don't eat leading space . zi \" save indents . ie \\n(sf .in (\\n(llu-\\n(dlu)/2u \" center on the line length . el .in +\\n(piu \" indent the sucker . dd \" drop display . yi \" restore indents . \} .\} .fi \" resume filling .sn \\n(pdu \" a little bit of space .. .\" ********** .\" fonts -- if argument(s), apply only to first .de b \" bold (font 3) .ie \\n(.$>0 \\&\\$3\\f3\\$1\\fP\\$2 .el .ft 3 .. .de i \" italics (font 2) .ie \\n(.$>0 \\&\\$3\\f2\\$1\\fP\\$2 .el .ft 2 .. .de r \" roman (font 1) .ft 1 \" just restore it .. .de bi \" bold italics (embolden font 2) \\&\\$3\c \\kb\\f2\\$1\\fP\\h'|\\nbu+2u'\\f2\\$1\\fP\\$2 .. .\" ********** .\" point sizes -- if argument(s), apply only to first .de sm \" reduce point size by 2 .ie \\n(.$>0 \\&\\$3\\s-2\\$1\\s0\\$2 .el .ps -2 .. .de is \" increase point size by 2 .ie \\n(.$>0 \\&\\$3\\s+2\\$1\\s0\\$2 .el .ps +2 .. .de nl \" return to normal size .ps \\n(ps \" just reset the point size .. .\" ********** .\" handy force space/inhibit more space macros .de sn \" space, then turn on nospace mode .sp \\$1 \" space .ns \" ignore any more space requests .. .de sr \" force out space .rs \" turn on spacing mode .sp \\$1 \" space .. .\" ********** .\" end of text and error macros .de et \" end of text macro . \" this: (1) flushes rest of line . \" (2) trips the footer, taking . \" care of footnotes .sp \\n(.pu . \" check for open displays or footnotes .if \\n(id>0 .er "unfinished display" .if \\n(if>0 .er "unfinished footnote" . \" this one means an -mn bug (*sigh*) .if !'\\n(.z'' .er "diversion \\n(.z not closed" .. .de er \" print error message . \" flag it as an error .ds ws "** ERROR ** . \" if you have it, give the file name .if !'\\*(.f'' .as ws " file \\*(.f, . \" put out the line number .as ws " line \\n(.c . \" and finally the error message .tm \\*(ws: \\$1 .. .\" ********** .\" macros in this section are VERY specific to the news documentation .de pa \" protocol appellation (darn names!) \\&\\$3\\f2\\$1\\fP\\$2 .. .de ng \" news group name \\&\\$3\\f3\\$1\\fP\\$2 .. .de cn \" computer name \\&\\$3\\f2\\$1\\fP\\$2 .. .de hf \" header field \\&\\$3\\*(lq\\$1\\*(rq\\$2 .. .de cf \" contents of field \\&\\$3\\*(lq\\$1\\*(rq\\$2 .. .de qc \" quote control char (command) \\&\\$3\\f3<\\s-2\\$1\\s0>\\fP\\$2 .. .de qp \" quote printing char (command) \\&\\$3\\f3\\$1\\fP\\$2 .. .de op \" option \\&\\$3\\f3\\$1\\fP\\$2 .. .\" ********** .\" trademarked names .de pd \" print "PDP-11" .ie \\n(p1 \\&\\$2\\s-1PDP\\s0-11\\$1 .el \{\ . nr p1 +1 \" mark footnote as dropped \\&\\$2\\s-1PDP\\s0-11\\*(rg\\$1 . fn \" put out the footnote \\&\\*(rgPDP-11 is a registered trademark of Digital Equipment Corporation. . ef \" short and sweet ... .\} .. .de ux \" print "UNIX" .ie \\n(ux \\&\\$2\\s-1UNIX\\s0\\$1 .el \{\ . nr ux +1 \" mark footnote as dropped \\&\\$2\\s-1UNIX\\s0\\*(rg\\$1 . fn \" put out the footnote \\&\\*(rgUNIX is a registered trademark of AT&T. . ef \" short and sweet ... .\} .. .de vx \" print "VAX" .ie \\n(vx \\&\\$2\\s-1VAX\\s0\\$1 .el \{\ . nr vx +1 \" mark footnote as dropped \\&\\$2\\s-1VAX\\s0\\*(rg\\$1 . fn \" put out the footnote \\&\\*(rgVAX is a trademark of Digital Equipment Corporation. . ef \" short and sweet ... .\} .. .\" ********** .\" set up string and number registers . \" set up for the date .if \n(mo=1 .ds mo January .if \n(mo=2 .ds mo February .if \n(mo=3 .ds mo March .if \n(mo=4 .ds mo April .if \n(mo=5 .ds mo May .if \n(mo=6 .ds mo June .if \n(mo=7 .ds mo July .if \n(mo=8 .ds mo August .if \n(mo=9 .ds mo September .if \n(mo=10 .ds mo October .if \n(mo=11 .ds mo November .if \n(mo=12 .ds mo December .nr Yr \n(yr+1900 .ds dy "\*(mo \n(dy, \n(Yr .if \n(dw=1 .ds dw Sunday .if \n(dw=2 .ds dw Monday .if \n(dw=3 .ds dw Tuesday .if \n(dw=4 .ds dw Wednesday .if \n(dw=5 .ds dw Thursday .if \n(dw=6 .ds dw Friday .if \n(dw=7 .ds dw Saturday . \" NROFF dependencies .if n \{\ . \" string registers . ds rg (R) . ds lq "" . ds rq "" . ds f1 "\*(dy . \" number registers . nr hs 1v \" space before section header . nr pd 1v \" inter-paragraph spacing . nr bm 1.0i \" height of bottom margin .\} . \" NROFF dependencies .if t \{\ . \" string registers . ds rg \\u\\s-2\\(rg\\s0\\d . ds lq `` . ds rq '' . \" number registers . nr hs 1v \" space before section header . nr pd 0.3v \" inter-paragraph spacing . nr bm 1.0i+1v \" height of bottom margin (wacky laser) .\} . \" these are the same for [NT]ROFF .ds dg \(dg .ds vr "News Version B2.11 .ds pv "News macros 1.5 .ds h1 - % - .nr bt 0.5i+1v \" bottom of page to footer .nr cm 0 \" no cut marks .nr fc 0 1 \" init footnote count .nr fl 5.5i \" footnote line length .nr fp 0-\n(bmu \" fo macro trap location .nr h0 0 \" init section header level 0 .nr h1 0 \" init section header level 1 .nr h2 0 \" init section header level 2 .nr h3 0 \" init section header level 3 .nr id 0 \" 1 in display .nr if 0 \" 1 in keep .nr it 0 \" 1 when beyond title, etc. .nr li 5n \" indent for labelled paragraph .nr ll 6.5i \" line length .nr lm 0 \" left margin .nr l0 0 \" first indent level .nr mt 1.5i+1v \" title goes down this far .nr pi 5n \" regular paragraph indent .nr po 1.0i \" page offset .nr ps 10 \" point size .nr tm 1.0i \" height of top margin .nr tt 0.5i-0.5v \" top of page to header .nr p1 0 \" no PDP-TM message yet .nr ux 0 \" no UNIX-TM message yet .nr vx 0 \" no VAX-TM message yet .nr vs 12 \" vertical spacing .\" set things up .\" DSINC changes for XROFF .nr f1 1 .nr f2 1 .nr s1 10 .nr s2 10 .nr v1 12 .nr v2 12 .ps 10 .vs 12 .\" DSINC end changes for XROFF .po \n(pou \" set page offset .ps \n(ps \" set previous, current .ps \n(ps \" point sizes .vs \n(vs \" set previous, current .vs \n(vs \" vertical spacings .ll \n(llu \" set line length .lt \n(llu \" set title line length .ev 1 \" *** footnote environment .ps \n(ps-2p \" set previous, current .ps \n(ps-2p \" point sizes .vs \n(vs-2p \" set previous, current .vs \n(vs-2p \" vertical spacings .ll \n(flu \" set line length .lt \n(flu \" set title line length .ev \" *** pop environment .ev 2 \" *** footnote environment .ps \n(ps \" set previous, current .ps \n(ps \" point sizes .vs \n(vs \" set previous, current .vs \n(vs \" vertical spacings .ll \n(llu \" set line length .lt \n(llu \" set title line length .ev \" *** pop environment .\" now set internal registers (for the first header section) .nr f1 \n(.f \" saved font #1 .nr f2 \n(.f \" saved font #2 .nr s1 \n(.s \" saved point size #1 .nr s2 \n(.s \" saved point size #2 .nr v1 \n(.v \" saved vertical spacing #1 .nr v2 \n(.v \" saved vertical spacing #2 .\" install traps .wh 0i hd \" position header trap .wh -\n(bmu fo \" position footer trap .wh \n(.pu+1i fx \" put footnote overflow trap here .ch fx -\n(bmu \" move it over fo .wh -\n(btu pf \" print the bottom margin here .em et \" at end of file, call et .\" couple of miscellaneous requests .bd S 3 3 \" embolden special font chars if B .hy 2 \" don't hyphenate last lines slashem-0.0.7E7F3/doc/recover.txt0000664000076400007640000001022310545462317014625 0ustar alialiRECOVER(6) RECOVER(6) NAME recover - recover a NetHack game interrupted by disaster SYNOPSIS recover [ -d directory ] base1 base2 ... DESCRIPTION Occasionally, a NetHack game will be interrupted by disas- ter when the game or the system crashes. Prior to NetHack v3.1, these games were lost because various information like the player's inventory was kept only in memory. Now, all pertinent information can be written out to disk, so such games can be recovered at the point of the last level change. The base options tell recover which files to process. Each base option specifies recovery of a separate game. The -d option, which must be the first argument if it appears, supplies a directory which is the NetHack play- ground. It overrides the value from NETHACKDIR, HACKDIR, or the directory specified by the game administrator dur- ing compilation (usually /usr/games/lib/nethackdir). For recovery to be possible, nethack must have been com- piled with the INSURANCE option, and the run-time option checkpoint must also have been on. NetHack normally writes out files for levels as the player leaves them, so they will be ready for return visits. When checkpointing, NetHack also writes out the level entered and the current game state on every level change. This naturally slows level changes down somewhat. The level file names are of the form base.nn, where nn is an internal bookkeeping number for the level. The file base.0 is used for game identity, locking, and, when checkpointing, for the game state. Various OSes use dif- ferent strategies for constructing the base name. Micro- computers use the character name, possibly truncated and modified to be a legal filename on that system. Multi- user systems use the (modified) character name prefixed by a user number to avoid conflicts, or "xlock" if the number of concurrent players is being limited. It may be neces- sary to look in the playground to find the correct base name of the interrupted game. recover will transform these level files into a save file of the same name as nethack would have used. Since recover must be able to read and delete files from the playground and create files in the save directory, it has interesting interactions with game security. Giving ordinary players access to recover through setuid or set- gid is tantamount to leaving the playground world- writable, with respect to both cheating and messing up other players. For a single-user system, this of course does not change anything, so some of the microcomputer ports install recover by default. For a multi-user system, the game administrator may want to arrange for all .0 files in the playground to be fed to recover when the host machine boots, and handle game crashes individually. If the user population is sufficiently trustworthy, recover can be installed with the same permissions the nethack executable has. In either case, recover is easily compiled from the distribu- tion utility directory. NOTES Like nethack itself, recover will overwrite existing save- files of the same name. Savefiles created by recover are uncompressed; they may be compressed afterwards if desired, but even a compression-using nethack will find them in the uncompressed form. SEE ALSO nethack(6) BUGS recover makes no attempt to find out if a base name speci- fies a game in progress. If multiple machines share a playground, this would be impossible to determine. recover should be taught to use the nethack playground locking mechanism to avoid conflicts. 9 January 1993 RECOVER(6) slashem-0.0.7E7F3/doc/dlb.txt0000664000076400007640000000415310545462317013726 0ustar alialiDLB(6) DLB(6) NAME dlb - NetHack data librarian SYNOPSIS dlb { xct } [ vfIC ] arguments... [ files... ] DESCRIPTION Dlb is a file archiving tool in the spirit (and tradition) of tar for NetHack version 3.1 and higher. It is used to maintain the archive files from which NetHack reads spe- cial level files and other read-only information. Note that like tar the command and option specifiers are speci- fied as a continuous string and are followed by any argu- ments required in the same order as the option specifiers. This facility is optional and may be excluded during NetHack configuration. COMMANDS The x command causes dlb to extract the contents of the archive into the current directory. The c command causes dlb to create a new archive from files in the current directory. The t command lists the files in the archive. OPTIONS AND ARGUMENTS v verbose output f archive specify the archive. Default if f not speci- fied is LIBFILE (usually the nhdat file in the play- ground). I lfile specify the file containing the list of files to put in to or extract from the archive if no files are listed on the command line. Default for archive creation if no files are listed is LIBLISTFILE. C dir change directory. Changes directory before trying to read any files (including the archive and the lfile). EXAMPLES Create the default archive from the default file list: dlb c List the contents of the archive 'foo': dlb tf foo AUTHOR Kenneth Lorber SEE ALSO nethack(6), tar(1) BUGS Not a good tar emulation; - does not mean stdin or stdout. Should include an optional compression facility. Not all read-only files for NetHack can be read out of an archive; examining the source is the only way to know which files can be. slashem-0.0.7E7F3/doc/Guidebook.tex0000664000076400007640000042741210545462317015065 0ustar aliali\documentstyle[titlepage]{article} \textheight 220mm \textwidth 160mm \oddsidemargin 0mm \evensidemargin 0mm \topmargin 0mm \newcommand{\nd}{\noindent} \newcommand{\tb}[1]{\tt #1 \hfill} \newcommand{\bb}[1]{\bf #1 \hfill} \newcommand{\ib}[1]{\it #1 \hfill} \newcommand{\blist}[1] {\begin{list}{$\bullet$} {\leftmargin 30mm \topsep 2mm \partopsep 0mm \parsep 0mm \itemsep 1mm \labelwidth 28mm \labelsep 2mm #1}} \newcommand{\elist}{\end{list}} % this will make \tt underscores look better, but requires that % math subscripts will never be used in this document \catcode`\_=12 % String handling macros \makeatletter \newcommand\DefineString[2]{\@namedef{@DS@#1}{#2}} \newcommand\UseString[1]{\@nameuse{@DS@#1}} % Symbol lists with arbitary line breaks set in tt \def\Symbol@one{\@Symbol\discretionary{}{}{}} \def\Symbol#1{{\tt\def\ {{\char"20}}\def\^{{\char"5E}}% \def\'{{\char"27}}\def\~{{\char"7E}}% \expandafter\@tfor\expandafter\@Symbol\expandafter:% \expandafter=#1\relax\do\Symbol@one}} % UNIX registered trademark support \def\UNIX{UNIX\renewcommand{\thefootnote}{\textregistered}% \footnote{UNIX is a registered trademark of AT\&T.}% \gdef\UNIX{UNIX}} \makeatother \begin{document} % % input file: Guidebook.mn % % $Revision: 1.15.2.2 $ $Date: 2005/08/13 11:28:07 $ \DefineString{h0}{{\it SLASH'EM\/} Guidebook} \DefineString{h1}{} \DefineString{h2}{\%} \DefineString{vr}{{\it SLASH'EM\/} 0.0.7} \DefineString{f0}{\UseString{vr}} \DefineString{f1}{} \DefineString{f2}{December 10, 2003} %.mt \title{\LARGE A Guide to the Mazes of Menace:\\ \Large Guidebook for {\it SLASH'EM\/}} %.au \author{Eric S. Raymond\\ (Extensively edited and expanded for {\it NetHack\/} 3.4)\\ (Revised for {\it SLASH'EM\/} 0.0.3 by Warren Cheung)\\ (Revised for {\it SLASH'EM\/} 0.0.6 by J. Ali Harlow)} \date{\UseString{f2}} \maketitle %.hn 1 \section{Introduction} %.pg Recently, you have begun to find yourself unfulfilled and distant in your daily occupation. Strange dreams of prospecting, stealing, 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 recollection of the strange and powerful creatures that seem to be lurking 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 entered 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? %.pg Asking around, you hear about a bauble, called the Amulet of Yendor by some, which, if you can find it, will bring you great wealth. One legend you were told even mentioned that the one who finds the amulet will be granted immortality by the gods. The amulet is rumored to be somewhere beyond the Valley of Gehennom, deep within the Mazes of Menace. Upon hearing the legends, you immediately realize that there is some profound and undiscovered reason that you are to descend into the caverns and seek out that amulet of which they spoke. Even if the rumors of the amulet's powers are untrue, you decide that you should at least be able to sell the tales of your adventures to the local minstrels for a tidy sum, especially if you encounter any of the terrifying and magical creatures of your dreams along the way. You spend one last night fortifying yourself at the local inn, becoming more and more depressed as you watch the odds of your success being posted on the inn's walls getting lower and lower. %.pg 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 morning, you gather your gear, eat what may be your last meal outside, and enter the dungeon \ldots %.hn 1 \section{What is going on here?} %.pg You have just begun a game of {\it SLASH'EM}. Your goal is to grab as much treasure as you can, retrieve the Amulet of Yendor, and escape the Mazes of Menace alive. %.pg Your abilities and strengths for dealing with the hazards of adventure will vary with your background and training: \blist{} %.pg \item[\bb{Archeologists}]% understand dungeons pretty well; this enables them to move quickly and sneak up on the local nasties. They start equipped with the tools for a proper scientific expedition. %.pg \item[\bb{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. %.pg \item[\bb{Cavemen {\rm and }Cavewomen}]% start with exceptional strength but, unfortunately, with neolithic weapons. %.pg \item[\bb{Flame Mages}]% have managed to harness mystical energies into the control of the element of fire. Notwithstanding their pet hell hounds, woe be unto anyone who stands in the way of a skilled mage casting a fireball. %.pg \item[\bb{Healers}]% are wise in medicine and apothecary. They know the herbs and simples that can restore vitality, ease pain, anesthetize, 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. %.pg \item[\bb{Ice Mages}]% command the forces of cold. An experienced Mage can summon great blizzards yet remain unaffected by the turmoil of the elements. %.pg \item[\bb{Knights}]% are distinguished from the common skirmisher by their devotion to the ideals of chivalry and by the surpassing excellence of their armor. %.pg \item[\bb{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. %.pg \item[\bb{Necromancers}]% have delved into the darkest of the magical lore, and mastered some of the most forbidden of the magical lore. Many have fallen to the armies of the undead that they are capable of bringing forth and controlling. %.pg \item[\bb{Priests {\rm and }Priestesses}]% are clerics militant, crusaders advancing the cause of righteousness with arms, armor, and arts thaumaturgic. Their ability to commune with deities via prayer occasionally extricates them from peril, but can also put them in it. %.pg \item[\bb{Rangers}]% are most at home in the woods, and some say slightly out of place in a dungeon. They are, however, experts in archery as well as tracking and stealthy movement. %.pg \item[\bb{Rogues}]% are agile and stealthy thieves, with knowledge of locks, traps, and poisons. They specialize in surprise, which they employ to great advantage. %.pg \item[\bb{Samurai}]% are the elite warriors of feudal Nippon. They are heavily armored but quick, and wear the {\it dai-sho}, two swords of the deadliest keenness. %.pg \item[\bb{Tourists}]% start out with lots of gold (suitable for shopping with), a credit card, lots of food, some maps, and an expensive camera. Most monsters don't like being photographed. %.pg \item[\bb{Undead Slayers}]% are specialists, trained to hunt the undead as well as other incarnations of evil. They are well aware of the weaknesses of their foes and come prepared. Few denizens of darkness ever encounter such warriors of light and live to tell of it. %.pg \item[\bb{Valkyries}]% are hardy warrior women. Their upbringing in the harsh Northlands makes them strong, inures them to extremes of cold, and instills in them stealth and cunning. %.pg \item[\bb{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. %.pg \item[\bb{Yeomen}]% are sturdy fighters. They are famed for their ability to stand doing nothing for hours. It is said that this is because they are none too bright. Yeomen can both take a lot of damage and inflict it on others. \elist \nd %.pg You may also choose the race of your character: \blist{} %.pg \item[\bb{Doppelgangers}]% have the anviable ability to change form at will, at a cost of some mystic energy ({\it mana\/}), although what they become may be a bit of a surprise, even for them. %.pg \item[\bb{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. %.pg \item[\bb{Elves {\rm and }Drows}]% are agile, quick, and perceptive; very little of what goes on will escape an Elf. The quality of Elven craftsmanship often gives them an advantage in arms and armor. %.pg \item[\bb{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. %.pg \item[\bb{Hobbits}]% are quick of hearing and sharp-eyed, and though they are inclined to be fat and do not hurry unnecessarily, they are nonetheless nimble and deft in their movements. A love of learning (other than genealogical lore) is far from general among them. Hobbits are difficult to daunt, or to kill, and at need can still handle arms. %.pg \item[\bb{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. %.pg \item[\bb{Lycanthropes}]% are wild beasts who draw their strength from the phases of the moon, and can transform into wolves when they channel their magical energies. Even unarmed, a Lycanthrope is a savage fighter, as many scarred by their deadly claws can attest. %.pg \item[\bb{Orcs}]% are a cruel and barbaric race that hate every living thing (including other orcs). Above all others, Orcs hate Elves with a passion unequalled, and will go out of their way to kill one at any opportunity. The armor and weapons fashioned by the Orcs are typically of inferior quality. %.pg \item[\bb{Vampires}]% strike fear into the heart of many. Their super-human strength, notorious dexterity and resiliance make them difficult to defeat while their almost hypnotic charm makes them dangerous opponents. Even their own Gods treat vampires with some distaste. \elist \nd %.hn 1 \section{What do all those things on the screen mean?} %.pg On the screen is kept a map of where you have been and what you have seen on the current dungeon level; as you explore more of the level, it appears on the screen in front of you. %.pg When {\it SLASH'EM\/}'s ancestor {\it rogue\/} first appeared, its screen orientation was almost unique among computer fantasy games. Since then, screen orientation has become the norm rather than the exception; {\it SLASH'EM\/} continues this fine tradition. Unlike text adventure games that accept commands in pseudo-English sentences and explain the results in words, {\it SLASH'EM\/} commands are all one or two keystrokes and the results are displayed graphically on the screen. A minimum screen size of 24 lines by 80 columns is recommended; if the screen is larger, only a 21x80 section will be used for the map. %.pg {\it SLASH'EM\/} can even be played by blind players, with the assistance of Braille readers or speech synthesisers. Instructions for configuring {\it SLASH'EM\/} for the blind are included later in this document. %.pg {\it SLASH'EM\/} 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. %.pg {\it SLASH'EM\/} offers a variety of display options. The options available to you will vary from port to port, depending on the capabilities of your hardware and software, and whether various compile-time options were enabled when your executable was created. The three possible display options are: a monochrome character interface, a color character interface, and a graphical interface using small pictures called tiles. The two character interfaces 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. %.pg In order to understand what is going on in {\it SLASH'EM}, first you must understand what {\it SLASH'EM\/} is doing with the screen. The {\it SLASH'EM\/} screen replaces the ``{\tt You see \ldots}'' descriptions of text adventure games. Figure 1 is a sample of what a {\it SLASH'EM\/} screen might look like. The way the screen looks for you depends on your platform. \begin{center} \begin{tabular}{l} \verb~The bat bites! ~\\ \\ \verb~ ------ ~\\ \verb~ |....| ---------- ~\\ \verb~ |.<..|####...@...$.| ~\\ \verb~ |....-# |...B....+ ~\\ \verb~ |....| |.d......| ~\\ \verb~ ------ -------|-- ~\\ \\ \\ \\ \verb~Player the Rambler St:12 Dx:7 Co:18 In:11 Wi:9 Ch:15 Neutral~\\ \verb~Dlvl:1 $:0 HP:9(12) Pw:3(3) AC:10 Exp:1/19 T:257 Weak ~\\ \end{tabular} \end{center} %.ce 1 \begin{center} Figure 1 \end{center} %.hn 2 \subsection*{The status lines (bottom)} %.pg 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 various status items mean (though your configuration may not have all the status items listed below): \blist{} %.lp \item[\bb{Rank}] Your character's name and professional ranking (based on the experience level, see below). %.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. %.lp \item[\bb{Dexterity}] Dexterity affects your chances to hit in combat, to avoid traps, and do other tasks requiring agility or manipulation of objects. %.lp \item[\bb{Constitution}] Constitution affects your ability to recover from injuries and other strains on your stamina. %.lp \item[\bb{Intelligence}] Intelligence affects your ability to cast spells and read spellbooks. %.lp \item[\bb{Wisdom}] Wisdom comes from your practical experience (especially when dealing with magic). It affects your magical energy. %.lp \item[\bb{Charisma}] Charisma affects how certain creatures react toward you. In particular, it can affect the prices shopkeepers offer you. %.lp \item[\bb{Alignment}] {\it Lawful}, {\it Neutral}, or {\it 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 alignment are more likely to be seriously offended at your presence. %.lp \item[\bb{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 somewhere beneath the twentieth level. %.lp \item[\bb{Gold}] The number of gold pieces you are openly carrying. Gold which you have concealed in containers is not counted. %.lp \item[\bb{Hit Points}] Your current and maximum hit points. Hit points indicate how much damage you can take before you die. The more you get hit in a fight, the lower they get. You can regain hit points by resting, or by using certain magical items or spells. The number in parentheses is the maximum number your hit points can reach. %.lp \item[\bb{Power}] Spell points. This tells you how much mystic energy ({\it mana\/}) you have available for spell casting. Again, resting will regenerate the amount available. %.lp \item[\bb{Armor Class}] A measure of how effectively your armor stops blows from unfriendly creatures. The lower this number is, the more effective the armor; it is quite possible to have negative armor class. %.lp \item[\bb{Experience}] Your current experience level and experience points. As you adventure, you gain experience points. At certain experience point totals, you gain an experience level. The more experienced you are, the better you fight and withstand magical attacks. Many dungeons show only your experience level here. %.lp \item[\bb{Weight}] The total weight of all items in your inventory, displayed if you have the {\it showweight\/} option set. The number after the slash is your carrying capacity. %.lp \item[\bb{Time}] The number of turns elapsed so far, displayed if you have the {\it time\/} option set. %.lp \item[\bb{Hunger status}] Your current hunger status, ranging from {\it Satiated\/} down to {\it Fainting}. If your hunger status is normal, it is not displayed. \elist \nd %.pg Additional status flags may appear after the hunger status: {\it Conf\/} when you're confused, {\it FoodPois\/} or {\it Ill\/} when sick, {\it Blind\/} when you can't see, {\it Stun\/} when stunned, and {\it Hallu\/} when hallucinating. %.hn 2 \subsection*{The message line (top)} %.pg The top line of the screen is reserved for messages that describe things that are impossible to represent visually. If you see a ``{\tt --More--}'' on the top line, this means that {\it SLASH'EM\/} 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. %.hn 2 \subsection*{The map (rest of the screen)} %.pg The rest of the screen is the map of the level as you have explored it so far. Each symbol on the screen represents something. 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: \blist{} %.lp \item[\tb{- {\rm and} |}] The walls of a room, or an open door. Or a grave (|). %.lp \item[\tb{.}] The floor of a room, ice, or a doorless doorway. %.lp \item[\tb{\#}] A corridor, or iron bars, or a tree, or possibly a kitchen sink (if your dungeon has sinks), or a drawbridge. %.lp \item[\tb{>}] Stairs down: a way to the next level. %.lp \item[\tb{<}] Stairs up: a way to the previous level. %.lp \item[\tb{+}] A closed door, or a spellbook containing a spell you may be able to learn. %.lp \item[\tb{@}] Your character or a human. %.lp \item[\tb{\$}] A pile of gold. %.lp \item[\tb{\^{}}] A trap (once you have detected it). %.lp \item[\tb{)}] A weapon. %.lp \item[\tb{[}] A suit or piece of armor. %.lp \item[\tb{\%}] Something edible (not necessarily healthy). %.lp \item[\tb{?}] A scroll. %.lp \item[\tb{/}] A wand. %.lp \item[\tb{=}] A ring. %.lp \item[\tb{!}] A potion. %.lp \item[\tb{(}] A useful item (pick-axe, key, lamp \ldots). %.lp \item[\tb{"}] An amulet or a spider web. %.lp \item[\tb{*}] A gem or rock (possibly valuable, possibly worthless). %.lp \item[\tb{`}] A boulder or statue. %.lp \item[\tb{0}] An iron ball. %.lp \item[\tb{_}] An altar, or an iron chain. %.lp \item[\tb{\{}] A fountain. %.lp \item[\tb{\}}] A pool of water or moat or a pool of lava. %.lp \item[\tb{$\backslash$}] An opulent throne. %.lp \item[\tb{{\rm a}-{\rm zA}-{\rm Z} {\rm and} {\rm other} {\rm symbols}}] 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{{\rm 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 \nd %.pg You need not memorize all these symbols; you can ask the game what any symbol represents with the `{\tt /}' command (see the next section for more info). %.hn 1 \section{Commands} %.pg Commands are initiated by typing one or two characters. Some commands, like ``{\tt search}'', do not require that any more information be collected by {\it SLASH'EM}. Other commands might require additional information, for example a direction, or an object to be used. For those commands that require additional information, {\it SLASH'EM\/} 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 {\it menustyle\/} option. %.pg For example, a common question, in the form ``{\tt What do you want to} use?\ [a-zA-Z\ ?*]'', asks you to choose an object you are carrying. Here, ``{\tt a-zA-Z}'' are the inventory letters of your possible choices. Typing `{\tt ?}' gives you an inventory list of these items, so you can see what each letter refers to. In this example, there is also a `{\tt *}' indicating that you may choose an object not on the list, if you wanted to use something unexpected. Typing a `{\tt *}' 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. %.pg Some commands allow you to choose an object that you are not currently carrying. Such commands have an extra option available as in ``{\tt What do} you want to drink?\ [fgh or ?*,.]''. Typing `{\tt ,}' gives you a list of the applicable objects on the floor, from which you may make your choice. For commands where it is possible to choose your current location rather than an object, the `{\tt .}' option will be displayed. This can be used to read an engraving or drink from a dungeon feature. %.pg You can put a number before some commands to repeat them that many times; for example, ``{\tt 10s}'' will search ten times. If you have the {\it number_pad\/} option set, you must type `{\tt n}' to prefix a count, so the example above would be typed ``{\tt n10s}'' instead. Commands for which counts make no sense ignore them. In addition, movement commands can be prefixed for greater control (see below). To cancel a count or a prefix, press the ESC key. %.pg The list of commands is rather long, but it can be read at any time during the game through the `{\tt ?}' command, which accesses a menu of helpful texts. As well, there is now a menusystem available through the '`{\tt }' command for those who would rather page through menus than hunt and peck for keys. Here are the commands for your reference: \blist{} %.lp \item[\tb{{\rm ESC}}] Cancel the current operation (where applicable) or skip messages. If the {\it menu_on_esc\/} option is set, then this key will access the menusystem when pressed while the program is waiting for a command. %.lp \item[\tb{?}] Help menu: display one of several help texts available. %.lp \item[\tb{`}] Main menu: access the menusystem. %.lp \item[\tb{/}] 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 particular spot on the map and then pressing one of `{\tt .}', `{\tt ,}', `{\tt ;}', or `{\tt :}'. `{\tt .}' will explain the symbol at the chosen location, conditionally check for ``{\tt More info?}'' depending upon whether the {\it help\/} option is on, and then you will be asked to pick another location; `{\tt ,}' will explain the symbol but skip any additional information; `{\tt ;}' will skip additional info and also not bother asking you to choose another location to examine; `{\tt :}' will show additional info, if any, without asking for confirmation. When picking a location, pressing the ESC key will terminate this command, or pressing `{\tt ?}' will give a brief reminder about how it works. %.pg Specifying a name rather than a location always gives any additional information available about that name. %.lp \item[\tb{\&}] 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 ``{\tt safe.}'' %.sd \begin{center} \begin{tabular}{cc} \verb+y k u+ & \verb+ 7 8 9 +\\ \verb+ \ | / + & \verb+ \ | / +\\ \verb+h- . -l+ & \verb+ 4- . -6 +\\ \verb+ / | \ + & \verb+ / | \ +\\ \verb+b j n+ & \verb+ 1 2 3 +\\ & (if {\it number\_pad\/} is set) \end{tabular} \end{center} %.se %.ce 1 \begin{center} Figure 2 \end{center} %.lp \item[\tb{[YUHJKLBN]}] Go in that direction until you hit a wall or run into something. %.lp \item[\tb{{\rm m}[{\rm yuhjklbn}]}] Prefix: move without picking up objects or fighting (even if you remember a monster there) %.lp \item[\tb{{\rm F}[{\rm yuhjklbn}]}] Prefix: fight a monster (even if you only guess one is there) %.lp \item[\tb{{\rm M}[{\rm yuhjklbn}]}] Prefix: move far, no pickup. %.lp \item[\tb{{\rm g}[{\rm yuhjklbn}]}] Prefix: move until something interesting is found. %.lp \item[\tb{{\rm G}[{\rm yuhjklbn}] {\rm or} <{\rm CONTROL}->[{\rm yuhjklbn}]}] 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. The shortest path is computed over map locations the hero knows about (e.g. seen or previously traversed). If there is no known path, a guess is made instead. Stops on most of the same conditions as the `{\tt G}' command, but without picking up objects, similar to the `{\tt M}' command. For ports with mouse support, the command is also invoked when a mouse-click takes place on a location other than the current position. %.lp \item[\tb{.}] Rest, do nothing for one turn. %.lp \item[\tb{{\rm a}}] Apply (use) a tool (pick-axe, key, lamp \ldots). %.lp \item[\tb{{\rm A}}] Remove one or more worn items, such as armor. Use `{\tt T}' (take off) to take off only one piece of armor or `{\tt R}' (remove) to take off only one accessory. %.lp \item[\tb{\^{}{\rm A}}] Redo the previous command. %.lp \item[\tb{\^{}{\rm B}}] Borrow (steal) money from an adjacent monster. %.lp \item[\tb{{\rm c}}] Close a door. %.lp \item[\tb{{\rm C}}] Call (name) an individual monster. %.lp \item[\tb{\^{}{\rm C}}] Panic button. Quit the game. %.lp \item[\tb{{\rm d}}] Drop something. Ex. ``{\tt d7a}'' means drop seven items of object {\it a}. %.lp \item[\tb{{\rm D}}] Drop several things. In answer to the question ``{\tt What kinds of things do you want to drop? [!\%= BUCXaium]}'' you should type zero or more object symbols possibly followed by `{\tt a}' and/or `{\tt i}' and/or `{\tt u}' and/or `{\tt m}'. In addition, one or more of the blessed/uncursed/cursed groups may be typed. %.sd %.si DB ---drop all objects known to be blessed.\\ DU ---drop all objects known to be uncursed.\\ DC ---drop all objects known to be cursed.\\ DX ---drop all objects of unknown B/U/C status.\\ 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. %.ei %.se %.lp \item[\tb{\^{}{\rm D}}] Kick something (usually a door). %.lp \item[\tb{{\rm e}}] Eat food. Vampires cannot eat as such. However, they can gain nutrition by draining blood from fresh corpses using this command. % Make sure Elbereth is not hyphenated below, the exact spelling matters \hyphenation{Elbereth} %override the deduced syllable breaks %.lp \item[\tb{{\rm E}}] Engrave a message on the floor. Engraving the word ``{\tt Elbereth}'' 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.) %.sd %.si E----write in the dust with your fingers. %.ei %.se %.lp \item[\tb{{\rm f}}] Fire one of the objects placed in your quiver. You may select ammunition with a previous `{\tt Q}' command, or let the computer pick something appropriate if {\it autoquiver\/} is true. %.lp \item[\tb{{\rm i}}] List your inventory (everything you're carrying). %.lp \item[\tb{{\rm I}}] List selected parts of your inventory. %.sd %.si 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. %.ei %.se %.lp \item[\tb{{\rm o}}] Open a door. %.lp \item[\tb{{\rm O}}] Set options. A menu showing the current option values will be displayed. You can change most values simply by selecting the menu entry for the given option (ie, by typing its letter or clicking upon it, depending on your user interface). For the non-boolean choices, a further menu or prompt will appear once you've closed this menu. The available options are listed later in this Guidebook. Options are usually set before the game rather than with the `{\tt O}' command; see the section on options below. %.lp \item[\tb{{\rm p}}] Pay your shopping bill/Shopkeeper services. %.lp \item[\tb{{\rm P}}] Put on a ring or other accessory (amulet, blindfold). %.lp \item[\tb{\^{}{\rm P}}] Repeat previous message. Subsequent \^{}P's repeat earlier messages. The behavior can be varied via the msg\_window option. %.lp \item[\tb{{\rm q}}] Quaff (drink) something (potion, water, etc). %.lp \item[\tb{{\rm Q}}] Select an object for your quiver. You can then throw this using the `{\tt f}' command. (In {\it SLASH'EM\/} versions prior to 0.0.6 this was the command to quit the game, which has now been moved to `{\tt \#quit}'.) %.lp \item[\tb{{\rm r}}] Read a scroll or spellbook. %.lp \item[\tb{{\rm R}}] Remove an accessory (ring, amulet, etc). %.lp \item[\tb{\^{}{\rm R}}] Redraw the screen. %.lp \item[\tb{{\rm s}}] Search for secret doors and traps around you. It usually takes several tries to find something. %.lp \item[\tb{{\rm S}}] Save (and suspend) the game. The game will be restored automatically the next time you play. %.lp \item[\tb{{\rm t}}] Throw an object or shoot a projectile. %.lp \item[\tb{{\rm T}}] Take off armor. %.lp \item[\tb{\^{}{\rm T}}] Teleport, if you have the ability. %.lp \item[\tb{{\rm v}}] Display version number. %.lp \item[\tb{{\rm V}}] Display the game history. %.lp \item[\tb{{\rm w}}] Wield weapon. %.sd %.si w----wield nothing, use your bare hands. %.ei %.se %.lp \item[\tb{{\rm W}}] Wear armor. %.lp \item[\tb{{\rm x}}] Exchange your wielded weapon with the item in your alternate weapon slot. The latter is used as your secondary weapon when engaging in two-weapon combat. Note that if one of these slots is empty, the exchange still takes place. %.lp \item[\tb{{\rm X}}] Enter explore (discovery) mode, explained in its own section later. %.lp \item[\tb{\^{}{\rm X}}] Display your name, role, race, gender, and alignment as well as the various deities in your game. %.lp \item[\tb{\^{}{\rm Y}}] Polymorph yourself, if you have the ability. %.lp \item[\tb{{\rm z}}] Zap a wand. To aim at yourself, use `{\tt .}' for the direction. %.lp \item[\tb{{\rm Z}}] Zap (cast) a spell. To cast at yourself, use `{\tt .}' for the direction. %.lp \item[\tb{\^{}{\rm Z}}] Suspend the game %.ux (\UNIX\ versions with job control only). %.lp \item[\tb{:}] Look at what is here. %.lp \item[\tb{;}] Show what type of thing a visible symbol corresponds to. %.lp \item[\tb{,}] Pick up some things. May be preceded by `{\tt m}' to force a selection menu. %.lp \item[\tb{@}] Toggle the {\it autopickup\/} option on and off. %.lp \item[\tb{\^{}}] Ask for the type of a trap you found earlier. %.lp \item[\tb{)}] Tell what weapon you are wielding. %.lp \item[\tb{[}] Tell what armor you are wearing. %.lp \item[\tb{=}] Tell what rings you are wearing. %.lp \item[\tb{"}] Tell what amulet you are wearing. %.lp \item[\tb{(}] Tell what tools you are using. %.lp \item[\tb{*}] Tell what equipment you are using; combines the preceding five type-specific commands into one. %.lp \item[\tb{\$}] Count your gold pieces. %.lp \item[\tb{+}] List the spells you know. Using this command, you can also rearrange the order in which your spells are listed. They are shown via a menu, and if you select a spell in that menu, you'll be re-prompted for another spell to swap places with it, and then have opportunity to make further exchanges. %.lp \item[\tb{$\backslash$}] Show what types of objects have been discovered. %.lp \item[\tb{!}] Escape to a shell. %.lp \item[\tb{\#}] Perform an extended command. As you can see, the authors of {\it NetHack\/} used up all the letters, so this is a way to introduce the less frequently used commands. What extended commands are available depends on what features the game was compiled with. %.lp \item[\tb{\#{\rm adjust}}] Adjust inventory letters (most useful when the {\it fixinv\/} option is ``{\tt on}''). %.lp \item[\tb{\#{\rm borrow}}] Borrow (steal) money from an adjacent monster, if you have the ability. %.lp \item[\tb{\#{\rm chat}}] Talk to someone. %.lp \item[\tb{\#{\rm conduct}}] List which challenges you have adhered to. See the section below entitled ``{\tt Conduct}'' for details. %.lp \item[\tb{\#{\rm dip}}] Dip an object into something. %.lp \item[\tb{\#{\rm enhance}}] Advance or check weapons and spell skills. %.lp \item[\tb{\#{\rm force}}] Force a lock. %.lp \item[\tb{\#{\rm invoke}}] Invoke an object's special powers. %.lp \item[\tb{\#{\rm jump}}] Jump to another location. %.lp \item[\tb{\#{\rm loot}}] Loot a box or bag on the floor beneath you, or the saddle from a horse standing next to you. %.lp \item[\tb{\#{\rm monster}}] Use a monster's special ability (when polymorphed into monster form). %.lp \item[\tb{\#{\rm name}}] Name an item or type of object. %.lp \item[\tb{\#{\rm offer}}] Offer a sacrifice to the gods. %.lp \item[\tb{\#{\rm pray}}] Pray to the gods for help. %.lp \item[\tb{\#{\rm quit}}] Quit the program without saving your game. %.lp \item[\tb{\#{\rm ride}}] Ride (or stop riding) a monster. %.lp \item[\tb{\#{\rm rub}}] Rub a lamp or a stone. %.lp \item[\tb{\#{\rm sit}}] Sit down. %.lp \item[\tb{\#{\rm technique}}] Perform a role or race specific technique. A menu showing the techniques available to your character will be displayed. %.lp \item[\tb{\#{\rm turn}}] Turn undead. %.lp \item[\tb{\#{\rm twoweapon}}] Toggle two-weapon combat on or off. Note that you must use suitable weapons for this type of combat, or it will be automatically turned off. %.lp \item[\tb{\#{\rm untrap}}] Untrap something (trap, door, or chest). %.lp \item[\tb{\#{\rm vanquished}}] List vanquished monsters (whether by you or not). %.lp \item[\tb{\#{\rm youpoly}}] Polymorph yourself, if you have the ability. %.lp \item[\tb{\#{\rm version}}] Print compile time options for this version of {\it SLASH'EM}. %.lp \item[\tb{\#{\rm wipe}}] Wipe off your face. %.lp \item[\tb{\#?}] Help menu: get the list of available extended commands. %.pg If your keyboard has a meta key (which, when pressed in combination with another key, modifies it by setting the `{\tt meta}' [8th, or `{\tt high}'] bit), you can invoke many extended commands by meta-ing the first letter of the command. % In {\it NT, OS/2, PC\/ {\rm and} ST SLASH'EM}, % the `Alt' key can be used in this fashion; % on the Amiga set the {\it altmeta\/} option to get this behavior. In NT, OS/2, and PC {\it SLASH'EM}, the `{\tt Alt}' key can be used in this fashion. %.lp \item[\tb{{\rm M}-?}] \#? (not supported by all platforms) %.lp \item[\tb{{\rm M}-2}] \#twoweapon (unless the number\_pad option is enabled) %.lp \item[\tb{{\rm M}-{\rm a}}] \#adjust %.lp \item[\tb{{\rm M}-{\rm b}}] \#borrow %.lp \item[\tb{{\rm M}-{\rm c}}] \#chat %.lp \item[\tb{{\rm M}-{\rm d}}] \#dip %.lp \item[\tb{{\rm M}-{\rm e}}] \#enhance %.lp \item[\tb{{\rm M}-{\rm f}}] \#force %.lp \item[\tb{{\rm M}-{\rm i}}] \#invoke %.lp \item[\tb{{\rm M}-{\rm j}}] \#jump %.lp \item[\tb{{\rm M}-{\rm l}}] \#loot %.lp \item[\tb{{\rm M}-{\rm m}}] \#monster %.lp \item[\tb{{\rm M}-{\rm n}}] \#name %.lp \item[\tb{{\rm M}-{\rm o}}] \#offer %.lp \item[\tb{{\rm M}-{\rm p}}] \#pray %.lp \item[\tb{{\rm M}-{\rm q}}] \#quit %.lp \item[\tb{{\rm M}-{\rm r}}] \#rub %.lp \item[\tb{{\rm M}-{\rm s}}] \#sit %.lp \item[\tb{{\rm M}-{\rm t}}] \#technique %.lp \item[\tb{{\rm M}-{\rm u}}] \#untrap %.lp \item[\tb{{\rm M}-{\rm v}}] \#version %.lp \item[\tb{{\rm M}-{\rm w}}] \#wipe %.lp \item[\tb{{\rm M}-{\rm y}}] \#youpoly \elist \nd %.pg If the {\it number_pad\/} option is on, some additional letter commands are available: \blist{} %.lp \item[\ib{h}] Help menu: display one of several help texts available, like ``{\tt ?}''. %.lp \item[\ib{j}] Jump to another location. Same as ``{\tt \#jump}'' or ``{\tt M-j}''. %.lp \item[\ib{k}] Kick something (usually a door). Same as `{\tt \^{}D}'. %.lp \item[\ib{K}] List vanquished monsters (whether by you or not). Same as ``{\tt \#vanquished}''. %.lp \item[\ib{l}] Loot a box or bag on the floor beneath you, or the saddle from a horse standing next to you. Same as ``{\tt \#loot}'' or ``{\tt M-l}''. %.lp \item[\ib{N}] Name an item or type of object. Same as ``{\tt \#name}'' or ``{\tt M-n}''. %.lp \item[\ib{u}] Untrap a trap, door, or chest. Same as ``{\tt \#untrap}'' or ``{\tt M-u}''. \elist \nd %.hn 1 \section{Rooms and corridors} %.pg 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. %.pg Secret corridors are hidden. You can find them with the `{\tt s}' (search) command. %.hn 2 \subsection*{Doorways} %.pg 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 `{\tt o}' (open) command; to close it again, use the `{\tt c}' (close) command. %.pg You can get through a locked door by using a tool to pick the lock with the `{\tt a}' (apply) command, or by kicking it open with the `{\tt \^{}D}' (kick) command. %.pg Open doors cannot be entered diagonally; you must approach them straight on, horizontally or vertically. Doorways without doors are not restricted in this fashion. %.pg Doors can be useful for shutting out monsters. Most monsters cannot open doors, although a few don't need to (ex. ghosts can walk through doors). %.pg Secret doors are hidden. You can find them with the `{\tt s}' (search) command. Once found they are in all ways equivalent to normal doors. %.hn 2 \subsection*{Traps (`{\tt \^{}}')} %.pg 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 something fall into it, or you discover it with the `{\tt s}' (search) command. Monsters can fall prey to traps, too, which can be a very useful defensive strategy. %.pg There is a special pre-mapped branch of the dungeon based on the classic computer game ``{\tt 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 traditional rules of Sokoban. Some allowances are permitted in case the player gets stuck; however, they will lower your luck. %.hn 2 \subsection*{Stairs (`{\tt $<$}', `{\tt $>$}')} %.pg In general, each level in the dungeon will have a staircase going up (`{\tt $<$}') to the previous level and another going down (`{\tt $>$}') to the next level. There are some exceptions though. For instance, fairly early in the dungeon you will find a level with two down staircases, one continuing into the dungeon and the other 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. %.pg 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 ``{\tt special}'' levels, or loaded from the remains of an earlier game for a ``{\tt bones}'' level as briefly described below). Monsters are only active on the current level; those on other levels are essentially placed into stasis. %.pg Ordinarily when you climb a set of stairs, you will arrive on the corresponding staircase at your destination. However, pets (see below) and some other monsters will follow along if they're close enough when you travel up or down stairs, and occasionally one of these creatures will displace you during the climb. When that occurs, the pet or other monster will arrive on the staircase and you will end up nearby. %.hn 2 \subsection*{Ladders (`{\tt $<$}', `{\tt $>$}')} %.pg Ladders serve the same purpose as staircases, and the two types of inter-level connections are nearly indistinguishable during game play. %.hn 2 \subsection*{Shops and shopping} %.pg Occasionally you will run across a room with a shopkeeper near the door and many items lying on the floor. You can buy items by picking them up and then using the `{\tt p}' command. You can inquire about the price of an item prior to picking it up by using the ``{\tt \#chat}'' command while standing on it. Using an item prior to paying for it will incur a charge, and the shopkeeper won't allow you to leave the shop until you have paid any debt you owe. %.pg You can sell items to a shopkeeper by dropping them to the floor while inside a shop. You will either be offered an amount of gold and asked whether you're willing to sell, or you'll be told that the shopkeeper isn't interested (generally, your item needs to be compatible with the type of merchandise carried by the shop). %.pg If you drop something in a shop by accident, the shopkeeper will usually claim ownership without offering any compensation. You'll have to buy it back if you want to reclaim it. %.pg Shopkeepers sometimes run out of money. When that happens, you'll be offered credit instead of gold when you try to sell something. Credit can be used to pay for purchases, but it is only good in the shop where it was obtained; other shopkeepers won't honor it. (If you happen to find a "credit card" in the dungeon, don't bother trying to use it in shops; shopkeepers will not accept it.) %.pg The `{\tt \$}' command, which reports the amount of gold you are carrying (in inventory, not inside bags or boxes), will also show current shop debt or credit, if any. The `{\tt Iu}' command lists unpaid items (those which still belong to the shop) if you are carrying any. The `{\tt Ix}' command shows an inventory-like display of any unpaid items which have been used up, along with other shop fees, if any. %.hn 3 \subsection*{Shop idiosyncracies} %.pg Several aspects of shop behavior might be unexpected. % note: using * instead of \(bu is better for plain text output \blist{} %.lp \item[\tb{* 2}] The price of a given item can vary due to a variety of factors. %.lp \item[\tb{* 2}] A shopkeeper treats the spot immediately inside the door as if it were outside the shop. %.lp \item[\tb{* 2}] While the shopkeeper watches you like a hawk, he will generally ignore any other customers. %.lp \item[\tb{* 2}] If a shop is "closed for inventory", it will not open of its own accord. %.lp \item[\tb{* 2}] Shops do not get restocked with new items, regardless of inventory depletion. \elist \nd %.hn 1 \section{Monsters} %.pg Monsters you cannot see are not displayed on the screen. Beware! You may suddenly come upon one in a dark place. Some magic items can help you locate them before they locate you (which some monsters can do very well). %.pg The commands `{\tt /}' and `{\tt ;}' may be used to obtain information about those monsters who are displayed on the screen. The command `{\tt C}' allows you to assign a name to a monster, which may be useful to help distinguish one from another when multiple monsters are present. Assigning a name which is just a space will remove any prior name. %.pg The extended command ``{\tt \#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 monsters such as a shopkeeper or the Oracle of Delphi can produce useful results. %.hn 2 \subsection*{Fighting} %.pg If you see a monster and you wish to fight it, just attempt to walk 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 `{\tt 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 `{\tt m}' command to move without fighting; likewise, if you don't remember a monster but want to try fighting anyway, you can use the `{\tt F}' command. %.hn 2 \subsection*{Your pet} %.pg You start the game with a little dog (`{\tt d}'), cat (`{\tt f}'), hell hound pup ('d'), winter wolf cub ('d'), ghoul ('Z'), or pony (`{\tt u}'), which follows you about the dungeon and fights monsters with you. With the exception of ghouls, 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. %.pg 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. %.pg 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. %.hn 2 \subsection*{Steeds} %.pg Some types of creatures in the dungeon can actually be ridden 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 order 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 `{\tt \#ride}' command. Lead the beast around the dungeon when riding, in the same manner as you would move yourself. It is the beast that you will see displayed on the map. %.pg Riding skill is managed by the `{\tt \#enhance}' command. See the section on Weapon proficiency for more information about that. %.hn 2 \subsection*{Bones levels} %.pg You may encounter the shades and corpses of other adventurers (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. %.hn 1 \section{Objects } %.pg When you find something in the dungeon, it is common to want to pick it up. In {\it SLASH'EM}, this is accomplished automatically by walking over the object (unless you turn off the {\it autopickup\/} option (see below), or move with the `{\tt m}' prefix (see above)), or manually by using the `{\tt ,}' command. %.pg If you're carrying too many items, {\it SLASH'EM\/} 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. %.pg 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 carrying around with you through the dungeon will encumber you. Your reactions will get slower and you'll burn calories faster, requiring food more frequently to cope with it. Eventually, you'll be so overloaded that you'll either have to discard some of what you're carrying or collapse under its weight. %.pg {\it SLASH'EM\/} will tell you how badly you have loaded yourself. The symbols `{\tt Burdened}', `{\tt Stressed}', `{\tt Strained}', `{\tt Overtaxed}' and `{\tt Overloaded}' are displayed on the bottom line display to indicate your condition. %.pg 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 {\it SLASH'EM\/} 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). %.pg 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. %.pg When you use one of these objects, if its effect is obvious, {\it SLASH'EM\/} 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 ``{\tt \#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 ``{\tt \#name}'' on an object which has already been named, specifying a space as the value will remove the prior name instead of assigning a new one. %.hn 2 \subsection*{Curses and Blessings} %.pg 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 enchantments that make them less effective in combat. Other cursed objects may act poorly or detrimentally in other ways. %.pg Objects can also be blessed. Blessed items usually work better or more beneficially than normal uncursed items. For example, a blessed weapon will do more damage against demons. %.pg There are magical means of bestowing or removing curses upon objects, so even if you are stuck with one, you can still have the curse lifted and the item removed. Priests and Priestesses have an innate sensitivity to this property in any object, so they can more easily avoid cursed objects than other character roles. %.pg An item with unknown status will be reported in your inventory with no prefix. An item which you know the state of will be distinguished in your inventory by the presence of the word ``{\tt cursed}'', ``{\tt uncursed}'' or ``{\tt blessed}'' in the description of the item. %.hn 2 \subsection*{Weapons (`{\tt )}')} %.pg 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. %.pg There are wielded weapons, like maces and swords, and thrown 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. %.pg To shoot an arrow, you should first wield a bow, then throw the arrow. An alternative method would be wield a bow and place the arrows in your Quiver, after which you fire the ammunition. Rangers and the like may find that having a bow as their secondary weapon is a useful combination. In order to use a secondary weapon to fire ammunition however, it must first be moved to the primary weapon slot. The ``{\tt x}'' command is available for this use. Crossbows shoot crossbow bolts. Slings hurl rocks and (other) stones (like gems). %.pg Enchanted weapons have a ``{\tt plus}'' (or ``{\tt 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 identified somehow. Most weapons are subject to some type of damage like rust. Such ``{\tt erosion}'' damage can be repaired. %.pg The chance that an attack will successfully hit a monster, and the amount of damage such a hit will do, depends upon many factors. Among them are: type of weapon, quality of weapon (enchantment and/or erosion), experience level, strength, dexterity, encumbrance, and proficiency (see below). The monster's armor class---a general defense rating, not necessarily due to wearing of armor---is a factor too; also, some monsters are particularly vulnerable to certain types of weapons. %.pg 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 `{\tt x}' command, which exchanges your primary (the one being wielded) and alternate weapons. And if you have proficiency in the ``{\tt two weapon combat}'' skill, you may wield both weapons simultaneously as primary and secondary; 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. %.pg There might be times when you'd rather not wield any weapon at all. To accomplish that, wield `{\tt -}', or else use the `{\tt A}' command which allows you to unwield the current weapon in addition to taking off 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 {\it SLASH'EM}. 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. %.pg The commands to use weapons are `{\tt w}' (wield), `{\tt t}' (throw), `{\tt f}' (fire, an alternative way of throwing), `{\tt Q}' (quiver), `{\tt x}' (exchange), `{\tt \#twoweapon}', and `{\tt \#enhance}' (see below). %.hn 3 \subsection*{Throwing and shooting} %.pg You can throw just about anything via the `{\tt t}' command. It will prompt for the item to throw; picking `{\tt ?}' will list things in your inventory which are considered likely to be thrown, or picking `{\tt *}' 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 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. %.pg You can simplify the throwing operation by using the `{\tt Q}' command to select your preferred ``{\tt missile}'', then using the `{\tt 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 `{\tt f}'. There is also an option, {\it autoquiver,\/} which has {\it SLASH'EM\/} choose another item to automatically fill your 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} %.pg You will have varying degrees of skill in the weapons available. Weapon proficiency, or weapon skills, affect how well you can use particular types of weapons, and you'll be able to improve your skills as you progress through a game, depending on your role, your experience level, and use of the weapons. %.pg For the purposes of proficiency, weapons have been divided up into various groups such as daggers, broadswords, and polearms. Each role has a limit on what level of proficiency a character can achieve for each group. For instance, wizards can become highly skilled in daggers or staves but not in swords or bows. %.pg The `{\tt \#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 ``{\tt none}'' (sometimes also referred to as ``{\tt restricted}'', because you won't be able to advance), ``{\tt unskilled}'', ``{\tt basic}'', ``{\tt skilled}'', and ``{\tt expert}''. Restricted skills simply will not appear in the list shown by `{\tt \#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 ``{\tt master}'' or ``{\tt grand master}''. %.pg 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 is no penalty or bonus; at skilled level, you receive a modest bonus in the chance to hit and amount of damage done; at expert level, the bonus is higher. A successful hit has a chance to boost your training towards the next skill level (unless you've already reached the limit for this skill). Once such training reaches the threshold for that next level, you'll be told that you feel more confident in your skills. At that point you can use `{\tt \#enhance}' to increase one or more skills. Such skills are not increased automatically because there is a limit to your total overall skills, so you need to actively choose which skills to enhance and which to ignore. %.hn 2 \subsection*{Armor (`{\tt [}')} %.pg Lots of unfriendly things lurk about; you need armor to protect 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 being 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 {\it SLASH'EM}. Here is an (incomplete) list of the armor classes provided by various suits of armor: \begin{center} \begin{tabular}{lr} dragon scale mail & 1\\ plate mail & 3\\ crystal plate mail & 3\\ bronze plate mail & 4\\ splint mail & 4\\ banded mail & 4\\ dwarvish mithril-coat & 4\\ elven mithril-coat & 5\\ chain mail & 5\\ orcish chain mail & 6\\ scale mail & 6\\ studded leather armor & 7\\ ring mail & 7\\ orcish ring mail & 8\\ leather armor & 8\\ leather jacket & 9\\ no armor & 10 \end{tabular} \end{center} %.pg You can also wear other pieces of armor (ex. helmets, boots, shields, cloaks) to lower your armor class even further, but you can only wear one item of each category (one suit of armor, one cloak, one helmet, one shield, and so on) at a time. %.pg If a piece of armor is enchanted, its armor protection will be better (or worse) than normal, and its ``{\tt 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 ``{\tt plusses}'' it provides. Cursed pieces of armor usually have negative enchantments (minuses) in addition to being unremovable. %.pg Many types of armor are subject to some kind of damage like rust. Such damage can be repaired. Some types of armor may inhibit spell casting. %.pg The commands to use armor are `{\tt W}' (wear) and `{\tt T}' (take off). The `{\tt A}' command can also be used to take off armor as well as other worn items. %.hn 2 \subsection*{Food (`{\tt \%}')} %.pg 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 (``{\tt cans}'') will usually stay fresh, but ice boxes are heavy, and tins take a while to open. %.pg When you kill monsters, they usually leave corpses which are also ``{\tt food.}'' Many, but not all, of these are edible; some also give you special powers when you eat them. A good rule of thumb is ``{\tt you are} what you eat.'' %.pg 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. %.pg You can name one food item after something you like to eat with the {\it fruit\/} option. %.pg The command to eat food is `{\tt e}'. %.hn 2 \subsection*{Scrolls (`{\tt ?}')} %.pg Scrolls are labeled with various titles, probably chosen by ancient wizards for their amusement value (ex. ``{\tt READ ME,}'' or ``{\tt THANX MAUD}'' backwards). Scrolls disappear after you read them (except for blank ones, without magic spells on them). %.pg One of the most useful of these is the {\it scroll of identify}, which can be used to determine what another object is, whether it is cursed or blessed, and how many uses it has left. Some objects of subtle enchantment are difficult to identify without these. %.pg A mail daemon may run up and deliver mail to you as a {\it scroll of mail\/} (on versions compiled with this feature). To use this feature on versions where {\it SLASH'EM\/} mail delivery is triggered by electronic mail appearing in your system mailbox, you must let {\it SLASH'EM\/} know where to look for new mail by setting the ``{\tt MAIL}'' environment variable to the file name of your mailbox. You may also want to set the ``{\tt MAILREADER}'' environment variable to the file name of your favorite reader, so {\it SLASH'EM\/} can shell to it when you read the scroll. On versions of {\it SLASH'EM\/} where mail is randomly generated internal to the game, these environment variables are ignored. You can disable the mail daemon by turning off the {\it mail\/} option. %.pg The command to read a scroll is `{\tt r}'. %.hn 2 \subsection*{Potions (`{\tt !}')} %.pg Potions are distinguished by the color of the liquid inside the flask. They disappear after you quaff them. %.pg Clear potions are potions of water. Sometimes these are blessed or cursed, resulting in holy or unholy water. Holy water is the bane of the undead, so potions of holy water are good things to throw (`{\tt t}') at them. It is also sometimes very useful to dip (``{\tt \#dip}'') an object into a potion. %.pg The command to drink a potion is `{\tt q}' (quaff). %.hn 2 \subsection*{Wands (`{\tt /}')} %.pg 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 `{\tt .}' or `{\tt 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. %.pg When the number of charges left in a wand becomes zero, attempts to use the wand will usually result in nothing happening. Occasionally, however, it may be possible to squeeze the last few mana points from an otherwise spent wand, destroying it in the process. A wand may be recharged by using suitable magic, but doing so runs the risk of causing it to explode. The chance for such an explosion starts out very small and increases each time the wand is recharged. %.pg 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 certainly cause a catastrophic release of magical energies. %.pg When you have fully identified a particular wand, inventory display will include additional information in parentheses: the number of times it has been recharged followed by a colon and then by its current number of charges. A current charge count of -1 is a special case indicating that the wand has been cancelled. %.pg The command to use a wand is `{\tt z}' (zap). To break one, use the `{\tt a}' (apply) command. %.hn 2 \subsection*{Rings (`{\tt =}')} %.pg Rings are very useful items, since they are relatively permanent magic, unlike the usually fleeting effects of potions, scrolls, and wands. %.pg Putting on a ring activates its magic. You can wear only two rings, one on each ring finger. %.pg Most rings also cause you to grow hungry more rapidly, the rate varying with the type of ring. %.pg The commands to use rings are `{\tt P}' (put on) and `{\tt R}' (remove). %.hn 2 \subsection*{Spellbooks (`{\tt +}')} %.pg Spellbooks are tomes of mighty magic. When studied with the `{\tt 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! %.pg 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. %.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 if you do not use it, and you will need to relearn it. Casting a spell reinforces your memory of it, so you may never need to relearn a frequently used spell. %.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 proficient (to varying degrees), spells are similarly grouped. Successfully casting a spell exercises the skill group; sufficient skill may increase the potency of the spell and reduce the risk of spell failure. Skill slots are shared with weapons skills. (See also the section on ``{\tt Weapon proficiency}''.) %.pg Casting a spell also requires flexible movement, and wearing various types of armor may interfere with that. %.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. The ``{\tt \#enhance}'' extended command advances your spellcasting skills. %.hn 2 \subsection*{Tools (`{\tt (}')} %.pg 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 containers, which objects can be placed into or taken out of. %.pg The command to use tools is `{\tt a}' (apply). %.hn 3 \subsection*{Containers} %.pg You may encounter bags, boxes, and chests in your travels. A tool of this sort can be opened with the ``{\tt \#loot}'' extended command when you are standing on top of it (that is, on the same floor spot), or with the `{\tt a}' (apply) command when you are carrying it. However, chests are often locked, and are in any case unwieldy objects. You must set one down before unlocking it by using a key or lock-picking tool with the `{\tt a}' (apply) command, by kicking it with the `{\tt \^{}D}' command, or by using a weapon to force the lock with the ``{\tt \#force}'' extended command. %.pg Some chests are trapped, causing nasty things to happen when you unlock or open them. You can check for and try to deactivate traps with the ``{\tt \#untrap}'' extended command. %.hn 2 \subsection*{Amulets (`{\tt "}')} %.pg Amulets are very similar to rings, and often more powerful. Like rings, amulets have various magical properties, some beneficial, some harmful, which are activated by putting them on. %.pg Only one amulet may be worn at a time, around your neck. %.pg The commands to use amulets are the same as for rings, `{\tt P}' (put on) and `{\tt R}' (remove). %.hn 2 \subsection*{Gems (`{\tt *}')} %.pg 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. %.pg Other small rocks are also categorized as gems, but they are much less valuable. All rocks, however, can be used as projectile weapons (if you have a sling). In the most desperate of cases, you can still throw them by hand. %.hn 2 \subsection*{Large rocks (`{\tt `}')} %.pg Statues and boulders are not particularly useful, and are generally heavy. It is rumored that some statues are not what they seem. %.pg Very large humanoids (giants and their ilk) have been known to use boulders as weapons. %.hn 2 \subsection*{Gold (`{\tt \$}')} %.pg Gold adds to your score, and you can buy things in shops with it. There are a number of monsters in the dungeon that may be influenced by the amount of gold you are carrying (shopkeepers aside). %.hn 1 \section{Conduct} %.pg As if winning {\it SLASH'EM\/} 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 ``{\tt 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. %.pg 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 benefits. Calling upon your god for help with starvation does not violate any food challenges either. %.pg 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 (`{\tt b}'), jellies (`{\tt j}'), and fungi (`{\tt 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 considered vegan food. Note however that eating such items still counts against foodless conduct. %.pg Vegetarians do not eat animals; however, they are less selective about eating animal byproducts than vegans. In addition to the vegan items listed above, they may eat any kind of pudding (`{\tt 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. %.pg 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 corpse. Eating leather, dragon hide, or bone items while polymorphed into a creature that can digest it, or eating monster brains while polymorphed into a mind flayer, is considered eating an animal, although wax is only an animal byproduct. %.pg 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 eating the monster's corpse. Please note that the term ``{\tt 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 ``{\tt 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 ``{\tt fruits}'', although they could be anything from ``{\tt cherries}'' to ``{\tt pork chops}'', are also assumed to be vegan. %.pg An atheist is one who rejects religion. This means that you cannot \#pray, \#offer sacrifices to any god, \#turn undead, or \#chat with a priest. Particularly selective readers may argue that playing Monk or Priest characters should violate this conduct; that is a choice left to the player. Offering the Amulet of Yendor to your god is necessary to win the game and is not counted against this conduct. You are also not penalized for being spoken to by an angry god, priest(ess), or other religious figure; a true atheist would hear the words but attach no special meaning to them. %.pg 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. %.pg In {\it SLASH'EM}, 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. %.pg An illiterate character cannot read or write. This includes reading a scroll, spellbook, fortune cookie message, or t-shirt; writing a scroll; or reading (or making) an engraving of anything other than a single ``{\tt x}'' (the traditional signature of an illiterate person). Reading any item that is absolutely necessary to win the game is not counted against this conduct. The identity of scrolls and spellbooks (and knowledge of spells) in your starting inventory is assumed to be learned from your teachers prior to the start of the game and isn't counted. %.pg There are several other challenges tracked by the game. It is possible to eliminate one or more species of monsters by genocide; playing without this feature is considered a challenge. When the game offers you an opportunity to genocide monsters, you may respond with the monster type ``{\tt none}'' if you want to decline. You can change the form of an item into another item of the same type (``{\tt polypiling}'') or the form of your own body into another creature (``{\tt polyself}'') by wand, spell, or potion of polymorph; avoiding these effects are each considered challenges. Polymorphing monsters, including pets, does not break either of these challenges. Finally, you may sometimes receive wishes; a game without an attempt to wish for any items is a challenge, as is a game without wishing for an artifact (even if the artifact immediately disappears). When the game offers you an opportunity to make a wish for an item, you may choose ``{\tt nothing}'' if you want to decline. %.hn 1 \section{Options} %.pg Due to variations in personal tastes and conceptions of how {\it SLASH'EM\/} should do things, there are options you can set to change how {\it SLASH'EM\/} behaves. %.hn 2 \subsection*{Setting the options} %.pg Options may be set in a number of ways. Within the game, the `{\tt O}' command allows you to view all options and change most of them. You can also set options automatically by placing them in the SLASHEMOPTIONS environment variable or in a configuration file. Some versions of {\it SLASH'EM\/} also have front-end programs that allow you to set options before starting the game. %.hn 2 \subsection*{Using the SLASHEMOPTIONS environment variable} %.pg The SLASHEMOPTIONS 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 `{\tt !}' or ``{\tt no}'' before 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 terminated by the next comma or the end of string. %.pg For example, to set up an environment variable so that ``{\tt autoquiver}'' is on, ``{\tt autopickup}'' is off, the name is set to ``{\tt Blue Meanie}'', and the fruit is set to ``{\tt papaya}'', you would enter the command %.sd \% {\it setenv SLASHEMOPTIONS "autoquiver,$\backslash$ !autopickup,name:Blue Meanie,fruit:papaya"\/} %.se in {\it csh\/} (note the need to escape the ! since it's special to the shell), or %.sd \$ {\it SLASHEMOPTIONS="autoquiver,!autopickup,name:Blue Meanie,fruit:papaya"\/}\\ \$ {\it export SLASHEMOPTIONS\/} %.se in {\it sh\/} or {\it ksh}. %.hn 2 \subsection*{Using a configuration file} %.pg Any line in the configuration file starting with `{\tt \#}' is treated as a comment. Any line in the configuration file starting with ``{\tt OPTIONS=}'' may be filled out with options in the same syntax as in SLASHEMOPTIONS. 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. A zero in any entry in such a sequence leaves the display of that entry unchanged; this feature is not available using the option syntax. Such a sequence can be continued to multiple lines by putting a `{\tt $\backslash$ }' at the end of each line to be continued. Any line starting with ``{\tt TILESET=}'' defines a tile set in the same syntax as in SLASHEMOPTIONS (although the options are different). See the section on tile sets, below, for more information. %.pg If your copy of the game included the compile time AUTOPICKUP\_EXCEPTIONS option, then any line starting with ``{\tt AUTOPICKUP\_EXCEPTION=}'' is taken as defining an exception to the {\it pickup_types\/} option. There is a section of this Guidebook that discusses that. %.pg The default name of the configuration file varies on different operating systems, but SLASHEMOPTIONS can also be set to the full name of a file you want to use (possibly preceded by an `{\tt @}'). %.hn 2 \subsection*{Customization options} %.pg Here are explanations of what the various options do. Character strings that are too long may be truncated. Some of the options listed may be inactive in your dungeon. \blist{} %.lp \item[\ib{align}] Your starting alignment (align:lawful, align:neutral, or align:chaotic). You may specify just the first letter. 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). See {\it pickup_types\/} to refine the behavior. %.lp \item[\ib{autoquiver}] This option controls what happens when you attempt the `{\tt f}' (fire) command with an empty quiver. When true, the computer 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 `{\tt Q}' command instead. If no weapon is found or the option is false, the `{\tt t}' (throw) command is executed instead. (default false) %.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. %.lp \item[\ib{character}] Pick your type of character (ex. ``{\tt character:Monk}''); synonym for ``{\tt role}''. See ``{\tt name}'' for an alternate method of specifying your role. Normally only the first letter of the value is examined; the string ``{\tt random}'' is an exception. %.lp \item[\ib{checkpoint}] Save game state after each level change, for possible recovery after program crash (default on). %.lp \item[\ib{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 compilation. %.lp \item[\ib{cmdassist}] Have the game provide some additional command assistance for new players if it detects some anticipated mistakes (default on). %.lp \item[\ib{confirm}] Have user confirm attacks on pets, shopkeepers, and other peaceable creatures (default on). %.lp \item[\ib{DECgraphics}] Use a predefined selection of characters from the DEC VT-xxx/DEC Rainbow/ANSI line-drawing character set to display the dungeon/effects/traps instead of having to define a full graphics set yourself (default off). This option also sets up proper handling of graphics characters for such terminals, so you should specify it when appropriate 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 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 %.se 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 %.se (ex. ``{\tt disclose:yi na +v -g -c}'') The example sets {\it inventory\/} to prompt and default to yes, {\it attributes\/} to prompt and default to no, {\it vanquished\/} to disclose without prompting, {\it genocided\/} to not disclose and not to prompt, {\it 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 \item[\ib{dogname}] Name your starting dog (ex. ``{\tt dogname:Fang}''). Cannot be set with the `{\tt O}' command. %.lp \item[\ib{dungeon}] Set the graphics symbols for displaying the dungeon (default \relax{}``\Symbol{\ |--------||.-|++\#\#.\#\#$<$$>$$<$$>$\_|$\backslash$ $\backslash$ \#\#\{\}.\}..\#\#\ \#\}}''). The {\it dungeon\/} option should be followed by a string of 1--42 characters to be used instead of the default map-drawing 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 {\it SLASH'EM\/} escape-processes this option string in conventional C fashion. This means that `{\tt $\backslash$ }' is a prefix to take the following character literally. Thus `{\tt $\backslash$ }' needs to be represented as `{\tt $\backslash$ $\backslash$ }'. The special escape form `{\tt $\backslash$ m}' switches on the meta bit in the following character, and the `{\tt \^{}}' 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, toilet, 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 `{\tt +}' 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 rearranged. Cannot be set with the `{\tt O}' command. %.lp \item[\ib{effects}] Set the graphics symbols for displaying special effects (default \relax{}``\Symbol{|-$\backslash$ $\backslash$ /*!)(0\#@*/-$\backslash$ $\backslash$ ||$\backslash$ $\backslash$ -//-$\backslash$ $\backslash$ |\ |$\backslash$ $\backslash$ -//-$\backslash$ $\backslash$ |\ |$\backslash$ $\backslash$ -//-$\backslash$ $\backslash$ |\ |$\backslash$ $\backslash$ -//-$\backslash$ $\backslash$ |\ |$\backslash$ $\backslash$ -//-$\backslash$ $\backslash$ |\ |$\backslash$ $\backslash$ -//-$\backslash$ $\backslash$ |\ |$\backslash$ $\backslash$ -//-$\backslash$ $\backslash$ |\ |$\backslash$ $\backslash$ -/}''). The {\it effects\/} option should be followed by a string of 1--83 characters to be used instead of the default special-effects characters. This string is subjected to the same processing as the {\it 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 surrounding glyphs for swallowed display, nine glyphs each for magical, fire, cold, death, lightning, poison and acid explosions. 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 `{\tt O}' command. %.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 not require that you hit Enter. It is implemented only by the tty port (default off), when the game has been compiled to support tty graphics. %.lp \item[\ib{female}] An obsolete synonym for ``{\tt gender:female}''. Cannot be set with the `{\tt O}' command. %.lp \item[\ib{fixinv}] An object's inventory letter sticks to it when it's dropped (default on). If this is off, dropping an object shifts all the remaining inventory letters. %.lp \item[\ib{fruit}] Name a fruit after something you enjoy eating (ex. ``{\tt fruit:mango}'') (default ``{\tt slime mold}''). Basically a nostalgic whimsy that {\it SLASH'EM\/} uses from time to time. You should set this to something you find more appetizing than slime mold. Apples, oranges, pears, bananas, and melons already exist in {\it SLASH'EM}, so don't use those. %.lp \item[\ib{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 ``{\tt male}'' and ``{\tt female}'' options, the ``{\tt gender}'' option will take precedence. The default is to randomly pick an appropriate gender. Cannot be set with the `{\tt O}' command. %.lp \item[\ib{ghoulname}] Name your starting ghoul (ex. ``{\tt ghoulname:Casper}''). Cannot be set with the `{\tt O}' command. %.lp \item[\ib{help}] If more information is available for an object looked at with the `{\tt /}' 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 ``{\tt More info?}'' prompt, but it also means that you might miss some interesting and/or important information. %.lp \item[\ib{horsename}] Name your starting horse (ex. ``{\tt horsename:Trigger}''). Cannot be set with the `{\tt O}' command. %.lp \item[\ib{IBMgraphics}] Use a predefined selection of IBM extended ASCII characters to display the dungeon/effects/traps instead of having to define a full graphics set yourself (default off). This option also sets up proper handling of graphics characters for such terminals, so you should specify it when appropriate even if you override the selections with your own graphics strings. %.lp \item[\ib{ignintr}] Ignore interrupt signals, including breaks (default off). %.lp \item[\ib{invweight}] Display the weights of items in your inventory (and at other times) in braces (default off). %.lp \item[\ib{keep\_savefile}] Keeps the save file after restore. {\it SLASH'EM\/} usually deletes your savefile after you restore, making death permanent. This option can allow you to restore from the last save. (default off). %.lp \item[\ib{legacy}] Display an introductory message when starting the game (default on). %.lp \item[\ib{lit\_corridor}] Show corridor squares seen by night vision or a light source held by your character as lit (default off). %.lp \item[\ib{lootabc}] Use the old `{\tt a}', `{\tt b}', and `{\tt c}' keyboard shortcuts when looting, rather than the mnemonics `{\tt o}', `{\tt i}', and `{\tt b}' (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 `{\tt O}' command. %.lp \item[\ib{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 characters, 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. %.lp \item[\ib{menu\_deselect\_all}] Menu character accelerator to deselect all items in a menu. Implemented by the Amiga, Gem, X11, GTK and tty ports. Default '-'. %.lp \item[\ib{menu\_deselect\_page}] Menu character accelerator to deselect all items on this page of a menu. Implemented by the Amiga, Gem and tty ports. Default '$\backslash$ '. %.lp \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 '\^{}'. %.lp \item[\ib{menu\_headings}] Controls how the headings in a menu are highlighted. Values are 'bold', 'inverse', or 'underline'. Not all ports can actually display all three types. %.lp \item[\ib{menu\_invert\_all}] Menu character accelerator to invert all items in a menu. Implemented by the Amiga, Gem, X11, GTK and tty ports. Default '@'. %.lp \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 '\~{}'. %.lp \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 '|'. %.lp \item[\ib{menu\_next\_page}] Menu character accelerator to goto the next menu page. Implemented by the Amiga, Gem and tty ports. Default '$>$'. %.lp \item[\ib{menu\_on\_esc}] Make the ESC key a synonym for the ``{\tt }' (main menu) command (default on). %.lp \item[\ib{menu\_previous\_page}] Menu character accelerator to goto the previous menu page. Implemented by the Amiga, Gem and tty ports. Default '$<$'. %.lp \item[\ib{menu\_search}] Menu character accelerator to search for a menu item. Implemented by the Amiga, Gem and X11 ports. Default ':'. %.lp \item[\ib{menu\_select\_all}] Menu character accelerator to select all items in a menu. Implemented by the Amiga, Gem, X11, GTK and tty ports. Default '.'. %.lp \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}] Set the characters used to display monster classes (default ``\Symbol{abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ@\ \'{}\&;:\~{}]}''). This string is subjected to the same processing as the {\it 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, piercer, quadruped, rodent, arachnid or centipede, trapper or lurker above, horse or unicorn, vortex, worm, xan or other mythical/fantastic insect, light, Zouthern aminal, 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, apelike creature, zombie, human, ghost, golem, demon, sea monster, lizard, long worm tail, and mimic. Cannot be set with the `{\tt O}' command. %.lp \item[\ib{msghistory}] The number of top line messages to save (and recall with \^{}P) (default 20). Cannot be set with the `{\tt O}' command. %.lp \item[\ib{msg\_window}] Allows you to change the way recalled messages are displayed. (It is currently implemented for tty only.) The possible values are: %.sd %.si s---single message (default, this was the behavior before 3.4.0).\\ c---combination, two messages as `{\tt single}', then as `{\tt full}'.\\ f---full window, oldest message first.\\ r---full window, newest message first. %.ei %.se For backward compatibility, no value needs to be specified (which defaults to `{\tt full}'), or it can be negated (which defaults to `{\tt single}'). %.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 the role (that is, by suffixing one of {\it "-A -B -C -F -H -I -K -M -N -P -Ra -Ro -S -T -U -V -W -Y" ).\/} If {\it "-@"\/} is used for the role, then a random one will be automatically chosen. Cannot be set with the `{\tt O}' command. %.lp \item[\ib{news}] Read the {\it SLASH'EM\/} 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 `{\tt O}' command. %.lp \item[\ib{null}] Send padding nulls to the terminal (default off). %.lp \item[\ib{number\_pad}] Use the number keys to move instead of [yuhjklbn] (default 0 or off). (number\_pad:2 invokes the old DOS behavior where `{\tt 5}' means `{\tt g}', meta-`{\tt 5}' means `{\tt G}', and meta-`{\tt 0}' means `{\tt I}'.) %.lp \item[\ib{objects}] Set the characters used to display object classes (default ``\Symbol{])[="(\%!?+/\$*`0\_.}''). This string is subjected to the same processing as the {\it dungeon\/} option. The order of the symbols is illegal-object (should never be seen), weapon, armor, ring, amulet, tool, food, potion, scroll, spellbook, wand, gold, gem or rock, boulder or statue, iron ball, chain, and venom. Cannot be set with the `{\tt O}' command. %.lp \item[\ib{packorder}] Specify the order to list object types in (default ``\Symbol{")[\%?+!=/(*`0\_}''). The value of this option should be a string containing the symbols for the various object types. Any omitted types are filled in at the end from the previous order. %.lp \item[\ib{perm\_invent}] If true, always display your current inventory in a window. This only makes sense for windowing system interfaces that implement this feature. %.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. %.lp \item[\ib{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 `{\tt S}'). %.lp \item[\ib{pickup\_thrown}] If this boolean option is true and {\it autopickup\/} is on, try to pick up things that you threw, even if they aren't in {\it pickup_types .\/} Default is on. %.lp \item[\ib{pickup\_types}] Specify the object types to be picked up when {\it autopickup\/} is on. Default is all types. If your copy of the game has the experimental compile time option AUTOPICKUP\_EXCEPTIONS included, you may be able to use {\it autopickup_exception\/} configuration file lines to further refine {\it autopickup\/} behavior. %.lp \item[\ib{prayconfirm}] Prompt for confirmation before praying (default on). %.lp \item[\ib{pushweapon}] Using the `{\tt w}' (wield) command when already wielding something pushes the old item into your alternate weapon slot (default off). %.lp \item[\ib{race}] Selects your race (for example, ``{\tt race:human}''). Default is random. Cannot be set with the `{\tt O}' command. %.lp \item[\ib{rest\_on\_space}] Make the space bar a synonym for the `{\tt .}' (rest) command (default off). %.lp \item[\ib{role}] Pick your type of character (ex. ``{\tt role:Samurai}''); synonym for ``{\tt character}''. See ``{\tt name}'' for an alternate method of specifying your role. Normally only the first letter of the value is examined; `{\tt r}' is an exception with ``{\tt Rogue}'', ``{\tt Ranger}'', and ``{\tt random}'' values. %.lp \item[\ib{runmode}] Controls the amount of screen updating for the map window when engaged in multi-turn movement (running via shift+direction or control+direction and so forth, or via the travel command or mouse click). The possible values are: %.sd %.si teleport---update the map after movement has finished;\\ run---update the map after every seven or so steps;\\ walk---update the map after each step;\\ crawl---like walk, but pause briefly after each step. %.ei %.se This option only affects the game's screen display, not the actual results of moving. The default is `{\tt run}'; versions prior to 3.4.1 used `{\tt teleport}' only. Whether or not the effect is noticeable will depend upon the window port used or on the type of terminal. %.lp \item[\ib{safe\_pet}] Prevent you from (knowingly) attacking your pets (default on). %.lp \item[\ib{scores}] Control what parts of the score list you are shown at the end (ex. ``{\tt scores:5 top scores/4 around my score/own scores}''). Only the first letter of each category (`{\tt t}', `{\tt a}', or `{\tt o}') is necessary. %.lp \item[\ib{showexp}] Show your accumulated experience points on bottom line (default off). %.lp \item[\ib{showrace}] Display yourself as the glyph for your race, rather than the glyph for your role (default off). Note that this setting affects only the appearance of the display, not the way the game treats you. %.lp \item[\ib{showscore}] Show your approximate accumulated score on bottom line (default off). %.lp \item[\ib{showdmg}] Show damage inflicted/damage received (default off). Inflicted damage is only shown to characters who have become experienced enough to quantify their damage. %.lp \item[\ib{showweight}] Show total weight in inventory on bottom line (default off). %.lp \item[\ib{silent}] Suppress terminal beeps (default on). %.lp \item[\ib{sortpack}] Sort the pack contents by type when displaying inventory (default on). %.lp \item[\ib{sound}] Enable messages about what your character hears (default on). Note that this has nothing to do with your computer's audio capabilities. This option is only partly under player control. The game toggles it off and on during and after sleep, for example. %.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{standout}] Boldface monsters and ``{\tt --More--}'' (default off). %.lp \item[\ib{suppress\_alert}] This option may be set to a {\it SLASH'EM\/} version level to suppress alert notification messages about feature changes for that and prior versions (ex. ``{\tt suppress\_alert:0.0.6}''). %.lp \item[\ib{tiles}] This option may be set to the name of a tile set to use, or specified as ``{\tt notiles}'' to disable the use of tiles. Not all windowing interfaces support this option. The tile set named must also be defined. See the section on tile sets for more information on that. %.lp \item[\ib{time}] Show the elapsed game time in turns on bottom line (default off). %.lp \item[\ib{timed\_delay}] When pausing momentarily for display effect, such as with explosions and moving objects, use a timer rather than sending extra characters to the screen. (Applies to ``{\tt tty}'' interface only; ``{\tt X11}'' and ``{\tt GTK}'' interfaces always uses a timer based delay. The default is on if configured into the program.) %.lp \item[\ib{tombstone}] Draw a tombstone graphic upon your death (default on). %.lp \item[\ib{toptenwin}] Put the ending display in a {\it SLASH'EM\/} window instead of on stdout (default off). Setting this option makes the score list visible when a windowing version of {\it SLASH'EM\/} is started without a parent window, but it no longer leaves the score list around after game end on a terminal or emulating window. %.lp \item[\ib{traps}] Set the graphics symbols for displaying traps (default \relax{}``\Symbol{\^{}\^{}\^{}\^{}\^{}\^{}\^{}\^{}\^{}\^{}\^{}\^{}\^{}\^{}\^{}\^{}\^{}"\^{}\^{}\^{}\^{}}''). The {\it traps\/} option should be followed by a string of 1--22 characters to be used instead of the default traps characters. This string is subjected to the same processing as the {\it dungeon\/} option. 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. Cannot be set with the `{\tt O}' command. %.lp \item[\ib{travel}] Allow the travel command (default on). Turning this option off will prevent the game from attempting unintended moves if you make inadvertent mouse clicks on the map window. %.lp \item[\ib{verbose}] Provide more commentary during the game (default on). %.lp \item[\ib{windowtype}] Select which windowing system to use, such as ``{\tt tty}'' or ``{\tt X11}'' (default depends on version). Cannot be set with the `{\tt O}' command. %.lp \item[\ib{wolfname}] Name your starting wolf (ex. ``{\tt wolfname:Beast}''). Cannot be set with the `{\tt O}' command. \elist \nd %.hn 2 \subsection*{Tile sets} %.pg For those windowing ports which support tiles (multicolored pictures instead of the traditional characters), tile sets can be defined using a line in the configuration file that begins ``{\tt TILESET=}''. There should be one tile set definition line for each available tile set. Once defined, tile sets can be selected for initial display (using the tiles option) or dynamically selected during the game (for those windowing ports that support this). %.pg A ``{\tt TILESET}'' line has the same syntax as an ``{\tt OPTION}'' line but with the following options available: \blist{} %.lp \item[\ib{name}] The name of the tile set (for selection). This can be any string of characters excluding the comma. It must be specified. %.lp \item[\ib{file}] The name of the file which contains the tile set. This must be specified. %.lp \item[\ib{transparent}] Marks a tile set as being transparent (as opposed to opaque). Transparent tile sets allow eg., monsters to be displayed on top of the background. Tile sets must be designed to be used in this way in order to achieve meaningful results. This option is ignored by windowing ports which do not support transparency. %.lp \item[\ib{pseudo3D}] Marks a tile set as being designed for use with Mitsuhiro Itakura's pseudo-3D display algorithm. They are assumed to have an offset-X value equal to one third of the total tile width and an offset-Y value equal to one half of the total tile height. Such tile sets are not compatible with standard tile sets and while amusing effects can be created by setting this option incorrectly, nothing useful can be achieved. Windowing ports that do not support pseudo-3D display will ignore tile sets with this option set. \elist \nd %.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}] {\it SLASH'EM\/} should display an ascii character map if it can. %.lp \item[\ib{color }] {\it SLASH'EM\/} should display color if it can for different monsters, objects, and dungeon features %.lp \item[\ib{eight\_bit\_tty }] {\it SLASH'EM\/} should 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 }] {\it SLASH'EM\/} should use a font by the chosen name for the map window. %.lp \item[\ib{font\_menu }] {\it SLASH'EM\/} should use a font by the chosen name for menu windows. %.lp \item[\ib{font\_message }] {\it SLASH'EM\/} should use a font by the chosen name for the message window. %.lp \item[\ib{font\_status }] {\it SLASH'EM\/} should use a font by the chosen name for the status window. %.lp \item[\ib{font\_text }] {\it SLASH'EM\/} should use a font by the chosen name for text windows. %.lp \item[\ib{font\_size\_map }] {\it SLASH'EM\/} should use this size font for the map window. %.lp \item[\ib{font\_size\_menu }] {\it SLASH'EM\/} should use this size font for menu windows. %.lp \item[\ib{font\_size\_message}] {\it SLASH'EM\/} should use this size font for the message window. %.lp \item[\ib{font\_size\_status}] {\it SLASH'EM\/} should use this size font for the status window. %.lp \item[\ib{font\_size\_text }] {\it SLASH'EM\/} should use this size font for text windows. %.lp \item[\ib{fullscreen}] {\it SLASH'EM\/} should try and display on the entire screen rather than in a window. %.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 or a red box around the pet. %.lp \item[\ib{large\_font }] {\it SLASH'EM\/} should use a large font. %.lp \item[\ib{map\_mode }] {\it SLASH'EM\/} should display the map in the manner specified. %.lp \item[\ib{mouse\_support}] Allow use of the mouse for input and travel. %.lp \item[\ib{player\_selection}] {\it SLASH'EM\/} should pop up dialog boxes, or use prompts for character selection. %.lp \item[\ib{popup\_dialog }] {\it SLASH'EM\/} should pop up dialog boxes for input. %.lp \item[\ib{preload\_tiles}] {\it SLASH'EM\/} 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\_amount}] {\it SLASH'EM\/} should scroll the display by this number of cells when the hero reaches the scroll\_margin. %.lp \item[\ib{scroll\_margin}] {\it SLASH'EM\/} should scroll the display when the hero or cursor is this number of cells away from the edge of the window. %.lp \item[\ib{softkeyboard}] Display an onscreen keyboard. Handhelds are most likely to support this option. %.lp \item[\ib{splash\_screen}] {\it SLASH'EM\/} should display an opening splash screen when it starts up (default yes). %.lp \item[\ib{tiled\_map }] {\it SLASH'EM\/} 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}] {\it SLASH'EM\/} should display inverse when the game specifies it. %.lp \item[\ib{vary\_msgcount}] {\it SLASH'EM\/} should display this number of messages at a time in the message window. %.lp \item[\ib{windowcolors}] {\it SLASH'EM\/} should display windows with the specified foreground/background colors if it can. %.lp \item[\ib{wraptext}] {\it SLASH'EM\/} port should wrap long lines of text if they don't fit in the visible area of the window. \elist \nd %.hn 2 \subsection*{Platform-specific Customization options} %.pg Here are explanations of options that are used by specific platforms or ports to customize and change the port behavior. \blist{} %.lp \item[\ib{altkeyhandler}] Select an alternate keystroke handler dll to load (Win32 tty {\it SLASH'EM\/} only). The name of the handler is specified without the .dll extension and without any path information. Cannot be set with the `{\tt O}' command. %.lp \item[\ib{altmeta}] (default on, AMIGA {\it SLASH'EM\/} only). %.lp \item[\ib{BIOS}] Use BIOS calls to update the screen 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 {\it SLASH'EM\/} only). %.lp \item[\ib{flush}] (default off, AMIGA {\it SLASH'EM\/} only). %.lp \item[\ib{MACgraphics}] (default on, Mac {\it SLASH'EM\/} only). %.lp \item[\ib{page\_wait}] (default on, Mac {\it SLASH'EM\/} only). %.lp \item[\ib{rawio}] Force raw (non-cbreak) mode for faster output and more bulletproof input (MS-DOS sometimes treats `{\tt \^{}P}' as a printer toggle without it) (default off, OS/2, PC, and ST {\it SLASH'EM\/} only). Note: DEC Rainbows hang if this is turned on. Cannot be set with the `{\tt O}' command. %.lp \item[\ib{soundcard}] (default on, PC {\it SLASH'EM\/} only). Cannot be set with the `{\tt O}' command. %.lp \item[\ib{subkeyvalue}] (Win32 tty {\it SLASH'EM\/} only). May be used to alter the value of keystrokes that the operating system returns to {\it SLASH'EM\/} to help compensate for international keyboard issues. OPTIONS=subkeyvalue:171/92 will return 92 to {\it SLASH'EM}, if 171 was originally going to be returned. You can use multiple subkeyvalue statements in the config file if needed. Cannot be set with the `{\tt O}' command. %.lp \item[\ib{video}] Set the video mode used (PC {\it SLASH'EM\/} only). Values are `{\tt autodetect}', `{\tt default}', or `{\tt vga}'. Setting `{\tt vga}' (or `{\tt autodetect}' with vga hardware present) will cause the game to display tiles. Cannot be set with the `{\tt O}' command. %.lp \item[\ib{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, (PC {\it SLASH'EM\/} only). 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. Unix and OS/2 ports compiled with VIDEOSHADES option allow defining three more colors. The order of colors is red, green, brown, blue, magenta, cyan, gray, black, bright.red, bright.green, yellow, bright.blue, bright.magenta, bright.cyan and white. MS-Windows and Mac ports don't use this option. In Windows colors can be redefined from window properties. Cannot be set with the `{\tt O}' command. %.lp \item[\ib{videoshades}] Set the intensity level of the three gray scales available (default dark normal light, PC {\it SLASH'EM\/} 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 `{\tt O}' command. \elist \nd %.hn 2 \subsection*{Configuring autopickup exceptions} %.pg There is an experimental compile time option called AUTOPICKUP\_EXCEPTIONS. If your copy of the game was built with that option defined, you can further refine the behavior of the {\it autopickup\/} option beyond what is available through the {\it pickup_types\/} option. %.pg By placing {\it autopickup_exception\/} lines in your configuration file, you can define patterns to be checked when the game is about to autopickup something. \blist{} %.lp \item[\ib{autopickup\_exception}] Sets an exception to the {\it pickup_types\/} option. The {\it autopickup_exception\/} option should be followed by a string of 1--80 characters to be used as a pattern to match against the singular form of the description of an object at your location. \elist \nd %.pg You may use the following special characters in a pattern: %.sd %.si *--- matches 0 or more characters.\\ ?--- matches any single character. %.ei %.se %.pg In addition, some characters are treated specially if they occur as the first character in the string pattern, specifically: %.sd %.si $<$---always pickup an object that matches the pattern that follows.\\ $>$---never pickup an object that matches the pattern that follows. %.ei %.se %.pg Can be set with the `{\tt O}' command, but the setting is not preserved across saves and restores. %.pg Here's a couple of examples of autopickup\_exceptions: %.sd %.si autopickup\_exception="$<$*arrow"\\ autopickup\_exception="$>$*corpse"\\ autopickup\_exception="$>$* cursed*" %.ei %.se The first example above will result in autopickup of any type of arrow. The second example results in the exclusion of any corpse from autopickup. The last example results in the exclusion of items known to be cursed from autopickup. A `{\tt never pickup}' rule takes precedence over an `{\tt always pickup}' rule if both match. %.hn 2 \subsection*{Configuring User Sounds} %.pg Some platforms allow you to define sound files to be played when a message that matches a user-defined pattern is delivered to the message window. At this time the Qt port and the win32tty and win32gui ports support the use of user sounds. %.pg The following config file entries are relevant to mapping user sounds to messages: \blist{} %.lp \item[\bb{SOUNDDIR}] The directory that houses the sound files to be played. %.lp \item[\bb{SOUND}] An entry that maps a sound file to a user-specified message pattern. Each SOUND entry is broken down into the following parts: %.sd %.si MESG ---message window mapping (the only one supported in 3.4).\\ pattern ---the pattern to match.\\ sound file---the sound file to play.\\ volume ---the volume to be set while playing the sound file. %.ei %.se \elist \nd %.pg The exact format for the pattern depends on whether the platform is built to use ``{\tt regular expressions}'' or {\it SLASH'EM\/}'s own internal pattern matching facility. The ``{\tt regular expressions}'' matching can be much more sophisticated than the internal {\it SLASH'EM\/} pattern matching, but requires 3rd party libraries on some platforms. There are plenty of references available elsewhere for explaining ``{\tt regular expressions}''. You can verify which pattern matching is used by your port with the \#version command. %.pg {\it SLASH'EM\/}'s internal pattern matching routine uses the following special characters in its pattern matching: %.sd %.si *--- matches 0 or more characters.\\ ?--- matches any single character. %.ei %.se %.pg Here's an example of a sound mapping using {\it SLASH'EM\/}'s internal pattern matching facility: %.sd SOUND=MESG "*chime of a cash register*" "gong.wav" 50 %.se specifies that any message with "chime of a cash register" contained in it will trigger the playing of "gong.wav". You can have multiple SOUND entries in your config file. %.pg %.hn 2 \subsection*{Configuring {\it SLASH'EM\/} for Play by the Blind} %.pg {\it SLASH'EM\/} can be set up to use only standard ASCII characters for making maps of the dungeons. This makes the MS-DOS versions of {\it SLASH'EM\/} completely accessible to the blind who use speech and/or Braille access technologies. Players will require a good working knowledge of their screen-reader's review features, and will have to know how to navigate horizontally and vertically character by character. They will also find the search capabilities of their screen-readers to be quite valuable. Be certain to examine this Guidebook before playing so you have an idea what the screen layout is like. You'll also need to be able to locate the PC cursor. It is always where your character is located. Merely searching for an @-sign will not always find your character since there are other humanoids represented by the same sign. Your screen-reader should also have a function which gives you the row and column of your review cursor and the PC cursor. These co-ordinates are often useful in giving players a better sense of the overall location of items on the screen. %.pg While it is not difficult for experienced users to edit the {\it defaults.nh\/} file to accomplish this, novices may find this task somewhat daunting. Included in all official distributions of {\it SLASH'EM\/} is a file called {\it NHAccess.nh}. Replacing {\it defaults.nh\/} with this file will cause the game to run in a manner accessible to the blind. After you have gained some experience with the game and with editing files, you may want to alter settings to better suit your preferences. Instructions on how to do this are included in the {\it NHAccess.nh\/} file itself. The most crucial settings to make the game accessible are: %.pg \blist{} %.lp \item[\ib{IBMgraphics}] Disable IBMgraphics by commenting out this option. %.lp \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}] Comment out all character graphics sets found near the bottom of the {\it defaults.nh\/} file. Most of these replace {\it {\it SLASH'EM\/}\/}'s default representation of the dungeon using standard ASCII characters with fancier characters from extended character sets, and these fancier characters can annoy screen-readers. \elist \nd %.hn 1 \section{Scoring} %.pg {\it SLASH'EM\/} maintains a list of the top scores or scorers on your machine, depending on how it is set up. In the latter case, each account on the machine can post only one non-winning score on this list. If you score higher than someone else on this list, or better your previous score, you will be inserted in the proper place under your current name. How many scores are kept can also be set up when {\it SLASH'EM\/} is compiled. %.pg Your score is chiefly based upon how much experience you gained, how much loot you accumulated, how deep you explored, and how the game ended. If you quit the game, you escape with all of your gold intact. If, however, you get killed in the Mazes of Menace, the guild will only hear about 90\% of your gold when your corpse is discovered (adventurers have been known to collect finder's fees). So, consider whether you want to take one last hit at that monster and possibly live, or quit and stop with whatever you have. If you quit, you keep all your gold, but if you swing and live, you might find more. %.pg If you just want to see what the current top players/games list is, you can type {\it slashem -s all\/} on most versions. %.hn 1 \section{Explore mode} %.pg {\it SLASH'EM\/} is an intricate and difficult game. Novices might falter in fear, aware of their ignorance of the means to survive. Well, fear not. Your dungeon may come equipped with an ``{\tt explore}'' or ``{\tt discovery}'' mode that enables you to keep old save files and cheat death, at the paltry cost of not getting on the high score list. %.pg There are two ways of enabling explore mode. One is to start the game with the {\it -X\/} switch. The other is to issue the `{\tt X}' command while already playing the game. The other benefits of explore mode are left for the trepid reader to discover. %.hn \section{Credits} %.pg The original {\it hack\/} game was modeled on the Berkeley %.ux \UNIX\ {\it rogue\/} game. Large portions of this paper were shamelessly cribbed from {\it A Guide to the Dungeons of Doom}, by Michael C. Toy and Kenneth C. R. C. Arnold. Small portions were adapted from {\it Further Exploration of the Dungeons of Doom}, by Ken Arromdee. %.pg {\it SLASH'EM\/} is the product of literally dozens of people's work. Main events in the course of the game development are described below: %.pg {\it Jay Fenlason\/} wrote the original {\it Hack}, with help from {\it Kenny Woodland}, {\it Mike Thome\/} and {\it Jon Payne}. %.pg {\it Andries Brouwer\/} did a major re-write, transforming {\it Hack\/} into a very different game, and published (at least) three versions (1.0.1, 1.0.2, and 1.0.3) for %.ux \UNIX\ machines to the Usenet. %.pg {\it Don G. Kneller\/} ported {\it 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 versions (3.0, 3.2, 3.51, and 3.6). %.pg {\it R. Black\/} ported PC HACK 3.51 to Lattice C and the Atari 520/1040ST, producing ST {\it Hack\/} 1.03. %.pg {\it Mike Stephenson\/} merged these various versions back together, incorporating many of the added features, and produced {\it NetHack\/} 1.4. He then coordinated a cast of thousands in enhancing and debugging {\it NetHack\/} 1.4 and released {\it NetHack\/} versions 2.2 and 2.3. %.pg Later, Mike coordinated a major rewrite of the game, heading a team which included {\it Ken Arromdee}, {\it Jean-Christophe Collet}, {\it Steve} Creps, {\it Eric Hendrickson}, {\it Izchak Miller}, {\it John Rupley}, {\it Mike Threepoint}, and {\it Janet Walz}, to produce {\it NetHack\/} 3.0c. %.pg {\it NetHack\/} 3.0 was ported to the Atari by {\it Eric R. Smith}, to OS/2 by {\it Timo Hakulinen}, and to VMS by {\it David Gentzel}. The three of them and {\it Kevin Darcy\/} later joined the main development team to produce subsequent revisions of 3.0. %.pg {\it Olaf Seibert\/} ported {\it NetHack\/} 2.3 and 3.0 to the Amiga. {\it Norm Meluch}, {\it Stephen Spackman\/} and {\it Pierre Martineau\/} designed overlay code for PC {\it NetHack\/} 3.0. {\it Johnny Lee\/} ported {\it 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. %.pg A scant one month before the next major version release of {\it NetHack}, two adventurous souls undertook their own modification to the sacred {\it NetHack\/} formula. {\it Tom Proudfoot\/} and {\it Yuval\/} released Nethack++, which was rapidly renamed Nethack--, contained new monsters, items and other miscellaneous modifications. %.pg Headed by {\it Mike Stephenson\/} and coordinated by {\it Izchak Miller\/} and {\it Janet Walz}, the development team which now included {\it Ken Arromdee}, {\it David Cohrs}, {\it Jean-Christophe Collet}, {\it Kevin Darcy}, {\it Matt Day}, {\it Timo Hakulinen}, {\it Steve Linhart}, {\it Dean Luick}, {\it Pat Rankin}, {\it Eric Raymond}, and {\it 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 individual character quests, a new endgame and many other new features, and produced {\it NetHack\/} 3.1. %.pg {\it Ken Lorber}, {\it Gregg Wonderly\/} and {\it Greg Olson}, with help from {\it Richard Addison}, {\it Mike Passaretti}, and {\it Olaf Seibert}, developed {\it NetHack\/} 3.1 for the Amiga. %.pg {\it Norm Meluch\/} and {\it Kevin Smolkowski}, with help from {\it Carl Schelin}, {\it Stephen Spackman}, {\it Steve VanDevender}, and {\it Paul Winner}, ported {\it NetHack\/} 3.1 to the PC. %.pg {\it Jon W\{tte\/} and {\it Hao-yang Wang}, with help from {\it Ross Brown}, {\it Mike Engber}, {\it David Hairston}, {\it Michael Hamel}, {\it Jonathan Handler}, {\it Johnny Lee}, {\it Tim Lennan}, {\it Rob Menke}, and {\it Andy Swanson}, developed {\it NetHack\/} 3.1 for the Macintosh, porting it for MPW. Building on their development, {\it Barton House\/} added a Think C port. %.pg {\it Timo Hakulinen\/} ported {\it NetHack\/} 3.1 to OS/2. {\it Eric Smith\/} ported {\it NetHack\/} 3.1 to the Atari. {\it Pat Rankin}, with help from {\it Joshua Delahunty}, was responsible for the VMS version of {\it NetHack\/} 3.1. {\it Michael Allison\/} ported {\it NetHack\/} 3.1 to Windows NT. %.pg {\it Dean Luick}, with help from {\it David Cohrs}, developed {\it NetHack\/} 3.1 for X11. {\it Warwick Allison\/} wrote a tiled version of {\it NetHack\/} for the Atari; he later contributed the tiles to the DevTeam and tile support was then added to other platforms. %.pg Time passed, and Nethack-- was ported to 3.11 by {\it Chris}. %.pg {\it Stephen White\/} then released his own modification known as Nethack Plus, which contained new character classes. Unbeknownst to the world at large, {\it Tom Proudfoot\/} took this source and combined it with his Nethack--. {\it Stephen White\/} went on to add weapon skills, which were eventually integrated into the next version of Nethack, and other features. %.pg In February 1996, {\it Tom Proudfoot\/} released {\it SLASH\/} V1. Including part of {\it Stephen White\/}'s Nethack Plus and his own Nethack--, leaving unmentioned his own slew of further modifications, this is perhaps the best known of the Nethack modifications. Six versions of this, ending with {\it SLASH\/} V6, are known to exist. %.pg The 3.2 development team, comprised of {\it Michael Allison}, {\it Ken} Arromdee, {\it David Cohrs}, {\it Jessie Collet}, {\it Steve Creps}, {\it Kevin Darcy}, {\it Timo Hakulinen}, {\it Steve Linhart}, {\it Dean} Luick, {\it Pat Rankin}, {\it Eric Smith}, {\it Mike Stephenson}, {\it Janet Walz}, and {\it Paul Winner}, released version 3.2 in April of 1996. %.pg 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. During the interval between the release of 3.1.3 and 3.2, one of the founding members of the development team, {\it 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. %.pg {\it Larry Stewart-Zerba\/} set along a different track---to enhance the spellcasting abilities of the Wizard. Thus, in April 1996, he released version 0.1 of the Wizard Patch. By July, he was joined by {\it Warwick Allison\/} and version 0.4 of the Wizard Patch was released. The final update came in April 1997, with the release of Wizard Patch 1.0. %.pg {\it Warwick Allison\/} also ported {\it NetHack\/} to use the Qt interface. %.pg {\it SLASH\/} V6 was picked up by {\it Enrico Horn}, who managed to synchronize it with the 3.2 source. The new {\it SLASH\/} 4.1.2 was released as far back as November 1996 went through at least 4 editlevels (E5, E6, E7) with the latest version being 4.1.2E8, synchronized with Nethack 3.2.2 and the Blackmarket option available, released in June 1997. %.pg {\it Nathan La\/} began the arduous task of drawing tiles for the {\it SLASH\/} monsters. %.pg {\it Kentaro Shirakata\/} ported {\it SLASH\/} 4.1.2E8 to Unix. %.pg {\it Lief Clennon\/} ported {\it SLASH\/} 4.1.2E8 to OS/2 EMX. %.pg {\it Romain Dolbeau\/} ported {\it SLASH\/} 4.1.2E8 to Macintosh. %.pg {\it Warren Cheung\/} combined {\it SLASH\/} 4.1.2 and Wizard Patch to create {\it SLASH'EM\/} 0.1 in November 1997. Several revisions including new spells and other additions led eventually to {\it SLASH'EM\/} 0.0.5E7F1. {\it Steven Uy\/} generously made additional modifications. %.pg {\it Dirk Schoenberger\/} continued updating the {\it SLASH\/}/{\it SLASH'EM\/} monster tiles. He also ported {\it SLASH'EM\/} to Linux. %.pg {\it Lief Clennon\/} ported {\it SLASH'EM\/} to OS/2 EMX. %.pg {\it Kevin Hugo\/} ported {\it SLASH'EM\/} to Macintosh, and also contributed additional changes and improvements. %.pg {\it Robin Johnson\/} finished the arduous task of drawing tiles for the {\it SLASH'EM\/} monsters. He also contributed many more new tiles. %.pg Kevin later joined the DevTeam and incorporated the best of these ideas in {\it NetHack\/} 3.3. %.pg J{\it NetHack\/} (the Japanese version of {\it NetHack\/}) has been around since at least 1994, developed by Issei Numata and others. The GTK interface was written for this variant and released in 1999. %.pg Mitsuhiro Itakura headed a team which began the process of redrawing the {\it NetHack\/} tiles in 8-bit color at 32x32 pixels. %.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 {\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 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 {\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 {\it 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 {\it NetHack\/} runs on: %.pg {\it Pat Rankin\/} maintained 3.4 for VMS. %.pg {\it Michael Allison\/} maintained {\it NetHack\/} 3.4 for the MS-DOS platform. {\it Paul Winner\/} and {\it Yitzhak Sapir\/} provided encouragement. %.pg {\it Dean Luick}, {\it Mark Modrall}, and {\it Kevin Hugo\/} maintained and enhanced the Macintosh port of 3.4. %.pg {\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. {\it Alex Kompel\/} also contributed a Windows CE port for 3.4.1. {\it Ron Van Iwaarden\/} maintained 3.4 for OS/2. %.pg {\it Janne Salmijarvi\/} and {\it Teemu Suikki\/} maintained and enhanced the Amiga port of 3.4 after {\it Janne Salmijarvi\/} resurrected it for 3.3.1. %.pg {\it Christian ``{\tt Marvin}'' Bressler\/} maintained 3.4 for the Atari after he resurrected it for 3.3.1. %.pg There is a {\it NetHack\/} web site maintained by {\it Ken Lorber\/} at http://www.nethack.org/. %.pg %.pg {\it Warren Cheung\/} combined {\it SLASH'EM\/} 0.0.5E7F1 and {\it NetHack\/} 3.3 to create {\it SLASH'EM\/} 0.0.6 and continues to maintain the DOS and Microsoft Windows ports. %.pg {\it J. Ali Harlow\/} incorporated the GTK interface and Mitsuhiro Itakura's 32x32 tileset into {\it SLASH'EM\/} 0.0.6 and maintains the UNIX port of {\it SLASH'EM}. {\it Peter Makholm\/} maintains the Debian package. %.pg {\it Paul Hurtley\/} maintains the MAC port of {\it SLASH'EM}. \bigskip %.pg 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: %.sd \begin{center} \begin{tabular}{ccc} %TABLE_START Adam Aronow & Izchak Miller & Mike Stephenson \\ Alex Kompel & J. Ali Harlow & Norm Meluch \\ Andreas Dorn & Janet Walz & Olaf Seibert \\ Andy Church & Janne Salmijarvi & Pasi Kallinen \\ Andy Swanson & Jean-Christophe Collet & Pat Rankin \\ Ari Huttunen & Jochen Erwied & Paul Winner \\ Barton House & John Kallen & Pierre Martineau \\ Benson I. Margulies & John Rupley & Ralf Brown \\ Bill Dyer & John S. Bien & Ray Chason \\ Boudewijn Waijers & Johnny Lee & Richard Addison \\ Bruce Cox & Jon W\{tte & Richard Beigel \\ Bruce Holloway & Jonathan Handler & Richard P. Hughey \\ Bruce Mewborne & Joshua Delahunty & Rob Menke \\ Carl Schelin & Keizo Yamamoto & Robin Johnson \\ Chris Russo & Ken Arnold & Roderick Schertler\\ David Cohrs & Ken Arromdee & Roland McGrath \\ David Damerell & Ken Lorber & Ron Van Iwaarden \\ David Gentzel & Ken Washikita & Ronnen Miller \\ David Hairston & Kevin Darcy & Ross Brown \\ Dean Luick & Kevin Hugo & Sascha Wostmann \\ Del Lamb & Kevin Sitze & Scott Bigham \\ Deron Meranda & Kevin Smolkowski & Scott R. Turner \\ Dion Nicolaas & Kevin Sweet & Stephen Spackman \\ Dylan O'Donnell & Lars Huttar & Stephen White \\ Eric Backus & Malcolm Ryan & Steve Creps \\ Eric Hendrickson & Mark Gooderum & Steve Linhart \\ Eric R. Smith & Mark Modrall & Steve VanDevender \\ Eric S. Raymond & Marvin Bressler & Teemu Suikki \\ Erik Andersen & Matthew Day & Tim Lennan \\ Frederick Roeber & Merlyn LeRoy & Timo Hakulinen \\ Gil Neiger & Michael Allison & Tom Almy \\ Greg Laskin & Michael Feir & Tom West \\ Greg Olson & Michael Hamel & Warren Cheung \\ Gregg Wonderly & Michael Sokolov & Warwick Allison \\ Hao-yang Wang & Mike Engber & Yitzhak Sapir \\ Helge Hafting & Mike Gallop & \\ Irina Rempt-Drijfhout & Mike Passaretti & %TABLE_END Do not delete this line. \end{tabular} \end{center} %.se %Microsoft and MS-DOS are registered trademarks of Microsoft Corporation. %Lattice is a trademark of Lattice, Inc. %Atari and 1040ST are trademarks of Atari, Inc. %AMIGA is a trademark of Commodore-Amiga, Inc. %.sm "Brand and product names are trademarks or registered trademarks of their respective holders." \end{document} slashem-0.0.7E7F3/doc/sources.txt0000664000076400007640000021670110545462317014654 0ustar aliali BEGINNER'S GUIDE TO NETHACK SOURCES ---------------------- by German Martin -- german@spain.hp.com With additional material by J. Ali Harlow, ali@juiblex.co.uk version 1.1 January '02 Contents -------- 1. About this document. 2. Hey, I want to modify the game! 3. Starting point. 4. The wizard mode. 5. Creating a new level. 6. Creating a new monster. 7. Refining your monster. 7.0. The 'monst' struct. 7.1. Adding a new attack type. 7.2. Adding new monster's abilities. 7.3. Adding a 'mextra' struct. 7.4. Adding an entry in the database. 8. Creating a new object. 8.0. The 'objects' array. 8.1. Adding a tool. 8.2. Adding a wand. 8.3. Adding a potion. 8.4. Adding armor/weapon. 8.5. Adding a ring. 8.6. Adding an amulet. 8.7. Adding a spellbook. 8.8. Adding food. 9. Creating a new room type. 10. Creating a new shop type. 11. Goodbye. Apendix A. Reference Function listing 1. About this document ---------------------- Have you played - and enjoyed - nethack for several [ months | years ] ? Do you have some cool new ideas for the game but nobody seems to hear you? Do you have access to a machine with a C compiler? Have you ever programmed before? If you answered yes to the above questions then this paper can be of your interest. Around middle '94 I started to look around in the nethack sources; loving the game I really wanted to add some new monsters & features, but the task was quite painful. I'm not a C newbie, but 100 (actually more) source files was more than I could manage: even trying to find the main() entry to the code proved to be difficult. The help provided by the inlined comments is useless for the newcomer. Now, nine months later, I've learned a lot about the main structures in the code: I've been able to add new monsters, objects, rooms, levels and behaviours. I - not being a member of the Dev Team, in case you were wondered - don't pretend to have a full knowledge of the huge beast, but my objective here is to help new ideas to be added to the game, not being a complete guide to the code. So, it is quite possible that you found many things incorrect here; more than possible - that is, sure - that you found many things incomplete. OK, send the bug/comment/addition to me and I'd modify/add it. Please, USE THIS AT YOUR OWN RISK. If you get nothing but frustration don't flame me: I was only trying to help. All the documentation here refers to Nethack 3.1.3 (the current official version at the date this is written). 2. Hey, I want to modify the game! ---------------------------------- OK. You have started to play nethack last week; got an account in a Unix machine and thought "Hey, I have a great idea! I'll learn C while modifying this game! All I have to do is follow this cookbook!". Forget it. Unless you are a reincarnation of Leonardo da Vinci you'll get nothing but a headache. In other words, to use this info you need at least: - Few knowledge about the OS you are running in. That is, how to edit, move, create and remove files basically. - Good knowledge of the C programming language. That is, more than the printf("Hello world\n") program. This includes the C preprocessor. - A C compiler and feel comfortable with it. - A blessed potion of gain ability. 3. Starting point ----------------- The first thing you have to do is compile the sources by yourself. You don't have to understand the whole process, but surely you need to be able to compile the official code and get it running before you add any- thing to the game. Refer to the README file in the top directory and to the Install.XXX (XXX depending of your operating system) in /sys/XXX directory. Once you have compiled the sources successfully you are now aware of what to expect. 4. The wizard mode ------------------ As you probably know, the wizard mode is a way to start nethack with a few extra commands: ^E == detect secret doors and traps. ^F == do magic mapping. ^G == create monster. ^I == identify items in pack. ^O == tell locations of special levels. ^T == do intra-level teleport. ^V == do trans-level teleport. ^W == make wish. ^X == show intrinsic attributes. plus some changes for known actions: i.e. read a scroll of create monster allows to specify the type of monster. That allows you to quickly try out the new feature/change you just added. To start it, just type: nethack -u wizard -D It should work, but take present: - If in a unix machine you should be the correct user-id. - have a look in include/config.h and search for the #define WIZARD lines; maybe you need to put another name after the -u. Throughout your process of modifying nethack you should make extensible usage of this mode so better make sure it works. (As an alternative you can always play a complete game to try out your new monster in the astral level :-) ) 5. Creating a new level ----------------------- To create a new level is easy. In fact, it doesn't require any knowledge of C: the dev team prepared it for us. Under the "util" directory the process of creating a nethack executable should have left a program called 'lev_comp' (lev_comp.exe if in MS-DOS). That binary is capable of create a new special level for nethack: give it a description file (named .des) and it gives you a level file (named .lev) suitable for the nethack binary: mylevel.des ----------- | __ | __ \ V / ___\___/___ | | _ |lev_comp |/ | | -----> mylevel.lev ------------- The lev_comp compiler has a manual page (have a look in the "doc" directory) called 'lev_comp.6'. If you are in a unix machine a command like nroff -man lev_comp.6 | more should give you a standard formatted man page. If not... well, you should have to get used to the .SH .PP etc... garbage in the file. This man page shows (quite obtusely) how to create a .des file; but better than starting from scratch is starting trying to understand a predefined file. For example, let's view the begining of "dat/castle.des" file: MAZE:"castle",random FLAGS: noteleport GEOMETRY:center,center MAP }}}}}}}}}.............................................}}}}}}}}} }-------}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}-------} }|.....|-----------------------------------------------|.....|} }|.....+...............................................+.....|} }-------------------------------+-----------------------------} }}}}}}|........|..........+...........|.......S.S.......|}}}}}} .....}|........|..........|...........|.......|.|.......|}..... .....}|........------------...........---------S---------}..... .....}|...{....+..........+.........\.S.................+...... .....}|........------------...........---------S---------}..... .....}|........|..........|...........|.......|.|.......|}..... }}}}}}|........|..........+...........|.......S.S.......|}}}}}} }-------------------------------+-----------------------------} }|.....+...............................................+.....|} }|.....|-----------------------------------------------|.....|} }-------}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}-------} }}}}}}}}}.............................................}}}}}}}}} ENDMAP Sounds familiar? This file is the description from where the castle level is created. The part showed here just sets the level aspect: a drawed castle centered between mazes (note the MAZE line). The rest of the file puts doors, traps, objects and monsters in a random or specific position (with coordinates relative to the previous map). The man page describes the exact syntax, so if you dare you can now start modifying the whole file; but let's make a very easy change and see how it works: suppose you feel the soldiers at the castle are too wimpy and think changing them to more difficult monsters, say minotaurs for example. So, just change the lines: MONSTER:'@',"soldier",(08,06) and subsequents with MONSTER:'H',"minotaur",(08,06) etc... (Note that with this change we are chosing a specific monster. We could have chosen to create monsters of a certain class, like MONSTER:'D',RANDOM,(08,06) # Create a random type dragon ) Save the new castle.des file and run: (from the dat directory) ../util/lev_comp castle.des (change the /'s with \'s if in MS-DOS) That creates a new 'castle.lev' file in the 'dat' directory. To try it, copy it to the playing directory (something like games/nethack) and start a game in wizard mode. Teleport to the castle, wish for a floating eye corpse and a blindfold and have a look: you should have lots of brown H's! But now it is time to deal with the original subject: we wanted to added a NEW level to nethack, not just modifying one. Let the castle.des alone and create a newlevel.des! For that, we have to introduce a new compiler: dgn_comp, the dungeon compiler. As the lev_comp it has a manual page: dgn_comp.6. Its purpose is a step ahead: it takes a file describing the complete dungeon (as a collection of levels) and creates a "dungeon" file suitable for the nethack binary. The description file in question is called "dungeon.def": DUNGEON: "The Dungeons of Doom" "D" (25, 5) ALIGNMENT: unaligned %MULDGN BRANCH: "The Gnomish Mines" @ (2, 3) %REINCARNATION LEVEL: "rogue" "R" @ (15, 4) LEVEL: "oracle" "O" @ (5, 5) LEVALIGN: neutral LEVEL: "bigroom" "B" @ (10, 3) 15 %MULDGN CHAINBRANCH: "The Quest" "oracle" + (6, 2) portal %MULDGN BRANCH: "Fort Ludios" @ (18, 4) portal RNDLEVEL: "medusa" "none" @ (-5, 4) 2 LEVALIGN: chaotic LEVEL: "castle" "none" @ (-1, 0) CHAINBRANCH: "Gehennom" "castle" + (0, 0) no_down BRANCH: "The Elemental Planes" @ (1, 0) no_down up As you probably knew, there are 'levels' and branches of the main dungeon, being composed of levels. The easiest thing is to add a simple level inside the main dungeon: Suppose you created a new mylevel.des file where you define a 'mylevel' level: MAZE:"mylevel",' ' (IMPORTANT note here: usually the file is named the same as the MAZE it defines, as in castle.des, but the name for the .lev file is taken from the MAZE line !!) To add it to the main dungeon we can add a line after the bigroom one: LEVEL: "mylevel" "none" @ (15,2) That is, create the 'mylevel' level randomly at 15 +-2 level deep. The level won't left bones files (the 'none' part). And run ../util/dgn_comp dungeon.def to get the 'dungeon' file. Copy it to the game directory and try it out (wizard mode command Ctrl-O is quite useful here). If there is any error loading the new level, nethack will create a random maze instead. Finally, if we wanted to add a whole new branch to the dungeon, we will put a line like: %MULDGN BRANCH: "newbranch" @ (18, 1) and later on, the lines defining the levels in this new branch: DUNGEON: "newbranch" "S" (4,0) DESCRIPTION: mazelike LEVEL: "mylevel1" "none" @ (1, 0) LEVEL: "mylevel2" "none" @ (2, 0) LEVEL: "mylevel3" "none" @ (3, 0) LEVEL: "mylevel4" "none" @ (4, 0) Now you should take a while and play around with the existing .des files and become familiar with the syntax. Creating new levels and dungeon wasn't difficult, was it? Maybe this chapter covers all your needs; but if you really want exciting new emotions, read on. 6. Creating a new monster ------------------------- "Beware, there will be no return! Still read? (y/n)" Welcome to Darkness of Mordor... This is going to be painful but the reward is great: some modification could be blessed by the dev team and you will reach inmortality! And anyway, modifying nethack will give you even happier hours than playing it. So, let's cope with it: For start, you should know that there are two HUGE arrays: one defining the possible monsters and the other defining the possible objects. The first one is called 'mons': it's an array of 'permonst' structs defined in the file monst.c, under the src directory (by the way, after this point, I'll stop saying where the files are located: you should be familiar with the directory structure by now). The 'permonst' struct is defined in the file permonst.h, and giving it a look should give you an idea of what element of the struct is for, but, for your convenience here is an expla- nation of what to put in a new entry for the mons array, i.e: {"myself", S_HUMAN, 1, 10, 10, 0, 0, G_GENO | G_NOGEN, { { AT_WEAP, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK }, WT_HUMAN, 400, PL_NSIZ, MS_HUMANOID, MZ_HUMAN, 0, 0, M1_NEEDPICK | M1_HUMANOID | M1_OMNIVORE, M2_HUMAN | M2_STRONG | M2_COLLECT, 0, C(HI_DOMESTIC)} -name: ("myself") is the name for the monster. -symbol: (S_HUMAN) is the letter used for it. The complete list is defined in the file monsym.h -level: (1). The monster is initially created with this level. -move rate: (10). Ranges from 0 -don't move- to 30 -really fast-. -AC: (10). Come on! you now quite well what this is. -magic resistance: (0). Ranges from 0 -none- to 127 -full-. -alignment: (0). negative value means chaotic, positive lawful. -creation/geno flags: (G_GENO | G_NOGEN) these are flags or'ded, with this meaning: G_UNIQ /* generated only once */ G_NOHELL /* not generated in "hell" */ G_HELL /* generated only in "hell" */ G_NOGEN /* generated only specially */ G_NOCORPSE /* no corpse left ever */ G_SGROUP /* appear in small groups normally */ G_LGROUP /* appear in large groups normally */ G_GENO /* can be genocided */ G_GENOD /* have been genocided */ G_EXTINCT /* have been extinguished as population control */ G_FREQ /* creation frequency mask */ (from monsym.h) -attack: ({ { AT_WEAP, AD_PHYS, 1, 6 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK },) This defines how the monster attacks. This element is composed of six 'attack' struct, each one being the form: ( attack_type, damage_type, # of dice, # of sides of each ) where attack_type is one of: AT_NONE /* passive monster (ex. acid blob) */ AT_CLAW /* claw (punch, hit, etc.) */ AT_BITE /* bite */ AT_KICK /* kick */ AT_BUTT /* head butt (ex. a unicorn) */ AT_TUCH /* touches */ AT_STNG /* sting */ AT_HUGS /* crushing bearhug */ AT_SPIT /* spits substance - ranged */ AT_ENGL /* engulf (swallow or by a cloud) */ AT_BREA /* breath - ranged */ AT_EXPL /* explodes - proximity */ AT_GAZE /* gaze - ranged */ AT_TENT /* tentacles */ AT_WEAP /* uses weapon */ AT_MAGC /* uses magic spell(s) */ damage_type is one of: AD_PHYS /* ordinary physical */ AD_MAGM /* magic missiles */ AD_FIRE /* fire damage */ AD_COLD /* frost damage */ AD_SLEE /* sleep ray */ AD_DISN /* disintegration (death ray) */ AD_ELEC /* shock damage */ AD_DRST /* drains str (poison) */ AD_ACID /* acid damage */ AD_SPC1 /* for extension of buzz() */ AD_SPC2 /* for extension of buzz() */ AD_BLND /* blinds (glowing eye) */ AD_STUN /* stuns */ AD_SLOW /* slows */ AD_PLYS /* paralyses */ AD_DRLI /* drains life levels (Vampire) */ AD_DREN /* drains magic energy */ AD_LEGS /* damages legs (xan) */ AD_STON /* petrifies (Medusa, Cockatrice) */ AD_STCK /* sticks to you (Mimic) */ AD_SGLD /* steals gold (Leppie) */ AD_SITM /* steals item (Nymphs) */ AD_SEDU /* seduces & steals multiple items */ AD_TLPT /* teleports you (Quantum Mech.) */ AD_RUST /* rusts armour (Rust Monster)*/ AD_CONF /* confuses (Umber Hulk) */ AD_DGST /* digests opponent (trapper, etc.) */ AD_HEAL /* heals opponent's wounds (nurse) */ AD_WRAP /* special "stick" for eels */ AD_WERE /* confers lycanthropy */ AD_DRDX /* drains dexterity (Quasit) */ AD_DRCO /* drains constitution */ AD_DRIN /* drains intelligence (mind flayer) */ AD_DISE /* confers diseases */ AD_DCAY /* decays organics (Brown pudding) */ AD_SSEX /* Succubus seduction (extended) */ AD_DETH /* for Death only */ AD_PEST /* for Pestilence only */ AD_FAMN /* for Famine only */ AD_CLRC /* random clerical spell */ AD_SPEL /* random magic spell */ AD_RBRE /* random breath weapon */ AD_SAMU /* hits, may steal Amulet (Wizard) */ AD_CURS /* random curse (ex. gremlin) */ and the # dice/faces sets a range of damage: i.e: 1,6 means a possible damage between 1 and 6, but 3,7 means a possible damage between 3 and 21. So, a monster can attack six times per turn at maximum. To attack less times use the 'NO_ATTACK' entry. -weight: (WT_HUMAN). Can be one of several defines like WT_DRAGON, WT_HUMAN, WT_ELF, but also a direct number can be used. -nutritional value: (400). The title says it all. -extension length: (PL_NSIZ). Here comes a problem...This is the size of an extra struct added to the normal permonst if the monster has any. For example, shopkeepers have an extra struct used to manage the shop code, dogs an extra to manage taming levels, etc... For the moment forget about this part. -sounds made: (MS_HUMAN). It is one of: (from monflag.h) MS_SILENT /* makes no sound */ MS_BARK /* if full moon, may howl */ MS_MEW /* mews or hisses */ MS_ROAR /* roars */ MS_GROWL /* growls */ MS_SQEEK /* squeaks, as a rodent */ MS_SQAWK /* squawks, as a bird */ MS_HISS /* hisses */ MS_BUZZ /* buzzes (killer bee) */ MS_GRUNT /* grunts (or speaks own language) */ MS_NEIGH /* neighs, as an equine */ MS_WAIL /* wails, as a tortured soul */ MS_GURGLE /* gurgles, as liquid or through saliva */ MS_BURBLE /* burbles (jabberwock) */ MS_ANIMAL /* up to here are animal noises */ MS_SHRIEK /* wakes up others */ MS_BONES /* rattles bones (skeleton) */ MS_LAUGH /* grins, smiles, giggles, and laughs */ MS_MUMBLE /* says something or other */ MS_IMITATE /* imitates others (leocrotta) */ MS_ORC /* intelligent brutes */ MS_HUMANOID /* generic traveling companion */ MS_ARREST /* "Stop in the name of the law!" (Kops) */ MS_SOLDIER /* army and watchmen expressions */ MS_GUARD /* "Please drop that gold and follow me." */ MS_DJINNI /* "Thank you for freeing me!" */ MS_NURSE /* "Take off your shirt, please." */ MS_SEDUCE /* "Hello, sailor." (Nymphs) */ MS_VAMPIRE /* vampiric seduction, Vlad's exclamations */ MS_BRIBE /* asks for money, or berates you */ MS_CUSS /* berates (demons) or intimidates (Wiz) */ MS_RIDER /* astral level special monsters */ MS_LEADER /* your class leader */ MS_NEMESIS /* your nemesis */ MS_GUARDIAN /* your leader's guards */ MS_SELL /* demand payment, complain about shoplifters */ MS_ORACLE /* do a consultation */ MS_PRIEST /* ask for contribution; do cleansing */ -physical size: (MZ_HUMAN). Is one of: MZ_TINY 0 /* < 2' */ MZ_SMALL 1 /* 2-4' */ MZ_MEDIUM 2 /* 4-7' */ MZ_HUMAN MZ_MEDIUM /* human-sized */ MZ_LARGE 3 /* 7-12' */ MZ_HUGE 4 /* 12-25' */ MZ_GIGANTIC 7 /* off the scale */ -resistance conferred (randomly) when eaten: (0) MR_FIRE /* resists fire */ MR_COLD /* resists cold */ MR_SLEEP /* resists sleep */ MR_DISINT /* resists disintegration */ MR_ELEC /* resists electricity */ MR_POISON /* resists poison */ MR_ACID /* resists acid */ MR_STONE /* resists petrification */ -First group of flags: (specify the monster behaviour) (M1_NEEDPICK | M1_HUMANOID | M1_OMNIVORE) M1_FLY /* can fly or float */ M1_SWIM /* can traverse water */ M1_AMORPHOUS /* can flow under doors */ M1_WALLWALK /* can phase thru rock */ M1_CLING /* can cling to ceiling */ M1_TUNNEL /* can tunnel thru rock */ M1_NEEDPICK /* needs pick to tunnel */ M1_CONCEAL /* hides under objects */ M1_HIDE /* mimics, blends in with ceiling */ M1_AMPHIBIOUS /* can survive underwater */ M1_BREATHLESS /* doesn't need to breathe */ M1_NOEYES /* no eyes to gaze into or blind */ M1_NOHANDS /* no hands to handle things */ M1_NOLIMBS /* no arms/legs to kick/wear on */ M1_NOHEAD /* no head to behead */ M1_MINDLESS /* has no mind--golem, zombie, mold */ M1_HUMANOID /* has humanoid head/arms/torso */ M1_ANIMAL /* has animal body */ M1_SLITHY /* has serpent body */ M1_UNSOLID /* has no solid or liquid body */ M1_THICK_HIDE /* has thick hide or scales */ M1_OVIPAROUS /* can lay eggs */ M1_REGEN /* regenerates hit points */ M1_SEE_INVIS /* can see invisible creatures */ M1_TPORT /* can teleport */ M1_TPORT_CNTRL /* controls where it teleports to */ M1_ACID /* acidic to eat */ M1_POIS /* poisonous to eat */ M1_CARNIVORE /* eats corpses */ M1_HERBIVORE /* eats fruits */ M1_OMNIVORE /* eats both */ M1_METALLIVORE /* eats metal */ -Second group of flags: (specify more monster behaviour) (M2_HUMAN | M2_STRONG | M2_COLLECT) M2_NOPOLY /* players mayn't poly into one */ M2_UNDEAD /* is walking dead */ M2_WERE /* is a lycanthrope */ M2_ELF /* is an elf */ M2_DWARF /* is a dwarf */ M2_GIANT /* is a giant */ M2_ORC /* is an orc */ M2_HUMAN /* is a human */ M2_DEMON /* is a demon */ M2_MERC /* is a guard or soldier */ M2_LORD /* is a lord to its kind */ M2_PRINCE /* is an overlord to its kind */ M2_MINION /* is a minion of a deity */ M2_MALE /* always male */ M2_FEMALE /* always female */ M2_NEUTER /* neither male nor female */ M2_PNAME /* monster name is a proper name */ M2_HOSTILE /* always starts hostile */ M2_PEACEFUL /* always starts peaceful */ M2_DOMESTIC /* can be tamed by feeding */ M2_WANDER /* wanders randomly */ M2_STALK /* follows you to other levels */ M2_NASTY /* extra-nasty monster (more xp) */ M2_STRONG /* strong (or big) monster */ M2_ROCKTHROW /* throws boulders */ M2_GREEDY /* likes gold */ M2_JEWELS /* likes gems */ M2_COLLECT /* picks up weapons and food */ M2_MAGIC /* picks up magic items */ -Third group of flags: (0) (specify even more monster behaviour) M3_WANTSAMUL /* would like to steal the amulet */ M3_WANTSBELL /* wants the bell */ M3_WANTSBOOK /* wants the book */ M3_WANTSCAND /* wants the candelabrum */ M3_WANTSARTI /* wants the quest artifact */ M3_WANTSALL /* wants any major artifact */ M3_WANTSALL /* wants any major artifact */ M3_WAITFORU /* waits to see you or get attacked */ M3_CLOSE /* lets you close unless attacked */ M3_COVETOUS /* wants something */ M3_WAITMASK /* waiting... */ -symbol color: (C(HI_DOMESTIC)) C(RED), C(BROWN), C(HI_DOMESTIC), etc... (HI_DOMESTIC is the color for a peaceful monster). You should also follow this rules, as the glorious dev team says: Rule #1: monsters of a given class are contiguous in the mons[] array. Rule #2: monsters of a given class are presented in ascending order of strength. Rule #3: monster frequency is included in the geno mask; the frequency can be from 0 to 7. 0's will also be skipped during generation. Rule #4: monster subclasses (e.g. giants) should be kept together, unless it violates Rule 2. NOGEN monsters won't violate Rule 2. And that's all. As usual it is easier to begin copying an existing monster. For example if you want to create a stronger centaur, get the plain one and change the AC and attack part. Now you need to recompile the whole code. Yes, you read right: the WHOLE CODE. The reason is this: the mons array sets a unique number for each monster used later for reference it in the array. Did you saw a 'makedefs' command while compiling? It is a vital part: generates #define for each monster & object. So if you look at the pm.h file: /* This source file is generated by 'makedefs'. Do not edit. */ #ifndef PM_H #define PM_H #define PM_GIANT_ANT 0 #define PM_KILLER_BEE 1 #define PM_SOLDIER_ANT 2 #define PM_FIRE_ANT 3 you understand now how it works: the sources can use the PM_SOMETHING define to access the permonst struct of a 'something' monster without knowing previously its location. If you did set up make or ndmake correctly, make itself will take care of the process of recompiling the code. Note that the *.des files are also recompiled. Now, to try out the new monster start nethack in wizard mode and wish for a scroll of create monster. Read it and answer to create a 'your monster' one. Voila! You now have your own monster. IMPORTANT NOTE: It is quite important to separate your own code with the appropriate #ifdef, #ifndef statements. Just add the necessary #define SOMETHING line at the end of include/config.h file. 7. Refining your monster ------------------------- 7.0. The 'monst' struct. From the chapter 5 you now have a monster of your own wandering through the dungeons. But surely you want more action: specific objects, armor or weapon for him; concrete chatting sentences, etc... How can you accomplish this? read on. Now is the moment to introduce the 'monst' structure. This struct is what defines a 'concrete' monster: hps, taming status, etc... very different from the 'permonst' structure, where the capabilities of all monsters of a type are defined. The elements in 'monst' are defined in monst.h: -nmon: All monsters in current level are organized in a chained list. Starting with a first monster descriptor ('fmon') you can navigate through all of them, thanks to this pointer to the next monster: -------- -------- -------- -------- fmon -> | nmon ---> | nmon --->| nmon --->| nmon ---> NULL | | | | | | | | | MONST| | MONST| | MONST| | MONST| | #1 | | #2 | | #3 | | #4 | -------- -------- -------- -------- -data: Is a pointer to the permonst structure for this monster. Obviously, as the weight of a newt is permanent it doesn't make sense to keep it for each concrete newt. -m_id: unique number for a monster, asigned at creation time. -mnum: Permanent monster index number. Number asigned by makedefs. That is, the PM_NAME_OF_MONSTER #define in include file pm.h. It is unique to this type of monster. -m_lev: Adjusted difficulty level of monster; that is, the level of a monster can have changed from the default one (experience, potions,etc...) -malign: Alignment of this monster, relative to the player. A positive number means is good to kill it. -mx, my: Position of the monster in the level map (x,y coordinates). -mux,muy: Position in the map where the monster thinks player is. May be different from actual one due to cloak of displacement, invisibility, etc. -mtrack: Monster track???. Used in the movement routines, but I've no clear idea of what it is. -mappearance: For mimics & the wizard. How it looks to the player. -m_ap_type: What mappearance is describing. Is one of: M_AP_NOTHING 0/*mappearance is unused --monster appears as itself */ M_AP_FURNITURE 1/* stairs, a door, an altar, etc. */ M_AP_OBJECT 2/* an object */ M_AP_MONSTER 3/* a monster */ -mtame: Level of tameness. If greater than 0 monster is tamed, and also implies peacefulness (as it doesn't make sense a tamed monster aggresive to the player). -mspec_used: Monster's special ability attack timeout. That is, monster won't use its special ability -like dragon's breath- until this counter reaches 0. -female: 1 = yes, 0 = no. -minvis: Monster is invisible. 1 = yes, 0 = no. -cham: Monster is actually a chamaleon. 1 = yes, 0 = no. -mundetected: Monster is hidden (as snakes) and hasn't been detected by the player. 1 = yes, 0 = no. -mcan: Monster has been zapped by a wand of cancellation (or spell). -mspeed: Monster extra speed. 2 bits allow 4 possibilities. -mflee: Monster is currently fleeing. -mfleetim: (7 bits) timeout for that fleeing. -mcansee/mblinded: monster can see / timeout for blinded. -mcanmove/mfrozen: monster can move / timeout for frozen. -msleep: monster is sleeping. -mstun: monster is stunned. -mconf: monster is confused. -mpeaceful: monster is peaceful. -mtrapped: monster is now trapped. -mleashed: leashed is applied to it. -isshk: This monster is a shopkeeper. -isminion: Is a minion. -isgd: is a guard. -ispriest: is a priest. -iswiz: is the wizard of Yendor. -wormno: If a worm, this sets the number this one makes. (there can't be more than 31 per level). -mstrategy: Strategy to follow. (just applies to very special monsters). -mtrapseen: bitmap of traps we've been trapped in. -mlstmv: flag to prevent two moves at once (?). -mgold: How rich this monster is. -minvent: It points to a 'obj' struct. The objects a monster has are organized in a chained list, the same as the 'monst' struct. This is the beginning of that list. (obviously NULL if nothing being carried). -mw: If the monster is wielding a weapon, here it is. -misc_worn_check: Some obscure value for the worms code (?). -weapon_check: Flag to check if monster has to get a weapon. -mnamelth: Length of this monster PROPER name. -mxlth: Length of the 'extra' part of the struct. It differs from monster to monster. Most have any. -meating: Monster is eating timeout. -mextra: Allows access to the 'extra' part of the struct. Profusely used with shopkeepers, for example. Uffff! I'm sure you're impressed with this big struct. Don't worry, you don't have to deal with all the fields, at least at the beginning. First thing you should have to do is answer this question: Does this monster need any object or special ability not reflected in the M-FLAGS? If the answer is yes, edit the file makemon.c and look for the 'm_initweap' function. (NOTE to UNIX users: A few tools become invaluable in the process of looking for functions: The 'ctags' command allows to create an index for objects; run the line ctags *.c (in the src directory) this will create a 'tags' file. After that the command 'vi -t m_initweap' will take you directly to the implementation of m_initweap function. Also, the 'grep' command allows searching for a string. I.e. Wants to have a look in the chamaleon code? Start looking the output for grep -i chamaleon | more End of NOTE) The m_initweap function is where the monster gets the objects it needs. A huge switch statement (switch (mtmp->data->mlet) ) specify what it gets according to its type. This is done with the 'mongets' function. (See Apendix A for a complete listing of nearly 100 useful functions). The easiest thing to do is search for a monster similar than ours and copy the code. That way shouldn't be difficult to add a known object to our monster. Note the usage of rn2() function to randomize the monsters armors & weapon. Really interesting monsters will have its own armor/weapon/object or type of attack (if not, you will just get variations of standard monsters: tougher newts, wimpy dragons, etc...). For adding a new object have a look in the next section; Now we will see how to add new attacks or behaviours: 7.1. Adding a new attack type. Edit the monattk.h file. Go after AT_TENT definition (in standard 3.1.3) and add a line with something like: #define AT_HELLO 16 /* Tries to kill you saying Hello */ This will be your new attack type. Now you have to define a new damage: Put this line after the AD_FAMN definition: #define AD_HELLO 39 /* You're saluted */ Now go to the src directory and edit the mhitu.c (monster-hits-user) file. Inside the hitmsg() function you should add the code for your AT_HELLO attack type. I.e: just add a line after case AT_EXPL: pline("%s explodes!", Monnam(mtmp)); break; like: case AT_HELLO: pline("%s says hello to you!", Monnam(mtmp)); break; Here we are introducing one of the most used function: pline() to show a message to the screen (see apendix A for more information). Later on look for the mattacku() function. You will have to add more code for your AT_HELLO attack inside the 'switch(mattk->aatyp)'. Easiest is to add a case to the 'hand to hand' attacks. Now look for hitmu() function. There we have to add the code for AD_HELLO. I.e., after case AD_FAMN: pline("%s reaches out, and your body shrivels.", Monnam(mtmp)); exercise(A_CON, FALSE); morehungry(rn1(40,40)); /* plus the normal damage */ break; add case AD_HELLO: hitmsg(mtmp, mattk); make_confused(2,FALSE); break; so this new attack confuses you, a la umber hulk gaze. That finished the editing for the mhitu.c file. Now do the same with mhitm.c (monster- hits-monster), so a monster can attack another one with AT_HELLO. 7.2. Adding new monster's abilities Within this chapter the method to add an action for a monster it is explained. For example, let's add the code so a monster can read a remove curse scroll. Edit the muse.c file and look for the #define MUSE_WAN_SPEED_MONSTER 7 line. Add a new posibility: #define MUSE_SCR_SCARE_MONSTER 8 After that, inside the find_misc function look for: if(obj->otyp == WAN_POLYMORPH && !mtmp->cham && monstr[(monsndx(mtmp->data))] < 6) { m.misc = obj; m.has_misc = MUSE_WAN_POLYMORPH; } and add: if(obj->otyp == SCR_REMOVE_CURSE) { m.misc =obj; m.has_misc = MUSE_SCR_REMOVE_CURSE; } Now a monster is able to detect a remove curse scroll as a potential action. Inside use_misc() we'll add the code to execute that action: After the lines case MUSE_WAN_POLYMORPH: mzapmsg(mtmp, otmp, TRUE); otmp->spe--; (void) newcham(mtmp, rndmonst()); if (oseen) makeknown(WAN_POLYMORPH); return 2; Add case MUSE_SCR_REMOVE_CURSE: { register struct obj *obj; mreadmsg(mtmp,otmp); pline("%s feels than someone is helping %s.",Monnam(mtmp), mtmp->female?"her":"him"); if (!otmp->cursed) { for(obj=mtmp->minvent;obj;obj=obj->nobj) if (otmp->blessed || obj->owornmask || (obj->otyp == LOADSTONE)) { if (mtmp->mconf) blessorcurse(obj,2); else uncurse(obj); } } if (oseen && !objects[SCR_REMOVE_CURSE].oc_name_known && !objects[SCR_REMOVE_CURSE].oc_uname) docall(otmp); /* not makeknown() */ m_useup(mtmp, otmp); return 2; } 7.3. Adding a 'mextra' struct. Real interesting monster behaviour needs the definition of new variables in the monst struct. For example, suppose you want to add the possibility to pray to god to your new monster; good idea would be to have a timeout so the monster cannot pray every two turns. So, we could just add a new element to the 'struct monst' in monst.h: long praytime; but that way EVERY MONSTER will have that variable defined, allocating four bytes although only our new monster will use it. Instead of that define a new struct - best in your own new include file-: struct onlymymonster { long praytime; }; and in the monster's definition in monst.c put 'sizeof(struct onlymymonster)' as the extension length field. To refer to your new variable use this contruction: ((struct onlymymonster *)&(mon)->mextra[0])->praytime (where mon is a pointer to a monst struct) To abbreviate such a beast, use a #define: #define MYMONSTER(mon) ((struct onlymymonster *)&(mon)->mextra[0]) so we can use MYMONSTER(mon)->praytime Refer to the eshk.h file for an example of using a mextra part. (the code for the shopkeepers). 7.4. Adding an entry in the database. The database source file (dat/data.base) consists of a number of entries interspersed with comments (lines which begin with the `#' character). Each entry consists of a number of patterns which must each be listed on a line by themselves. The patterns identify which monster or object is described and are followed by some descriptive text (often a quotation) which will be displayed to the player. 7.4.1. The pattern list. In it's simplest form, the pattern list consists of a number of different objects or monsters for which the same text should be displayed. For example: incubus succubus The incubus and succubus are male and female versions of the same demon, one who lies with a human for its own purposes, usually to the detriment of the mortals who are unwise in their dealings with them. Note: I have indented this example, as elsewhere in this manual. In data.base the patterns would be in the first character position and there would be _one_ tab at the beginning of each line of the descriptive text. Sometimes just listing every possible text isn't sufficient. For these cases, the `?' and `*' special characters can be used. `?' will match any one character, while `*' will match zero or more characters. For example: *giant giant humanoid Giants have always walked the earth, though they are rare in these times. They range in size from little over nine feet to a towering twenty feet or more. The larger ones use huge boulders as weapons, hurling them over large distances. All types of giants share a love for men - roasted, boiled, or fried. Their table manners are legendary. In this case, the "*giant" pattern will match the following monsters: giant, stone giant, hill giant, fire giant, frost giant, storm giant. Care must be taken so that patterns containing special characters do not match other, unrelated, text. Where this is possible, one or more negated patterns can be listed. Negated patterns must come before all other patterns in the pattern list and will cause the entry to be ignored if they match. They are indicated by a `~' prefix (which is not part of the pattern itself). For example: ~slime mold *mold Mold, multicellular organism of the division Fungi, typified by plant bodies composed of a network of cottony filaments. The colors of molds are due to spores borne on the filaments. Most molds are saprophytes. Some species (e.g., penicillium) are used in making cheese and antibiotics. [ The Concise Columbia Encyclopedia ] If the "~slime mold" pattern was not listed then this entry would be displayed if the player asked for information on slime molds (because slime mold is matched by "* mold"). Finally, some points that I haven't mentioned above: - Patterns cannot start with a space or tab character. This is never a problem since the text to be matched against will never start with white space either. - Entries are scanned in order in the data base until one matches (after which scanning stops). This means that where more than one entry has a pattern that matches some text, the first entry will hide the second. It is generally preferable to avoid relying on this (use negated patterns instead), but it can occasionally be useful. - Text is converted to lower case before comparison with patterns, so all patterns should be listed in lower case also. - The game will generally try the singular form of an object or monster if the user enters the plural, so it is not normally necessary to specify both singular and plural forms in the pattern list. 7.4.2. The descriptive text. The descriptive text consists of a number of lines with a tab character as a prefix (this prefix will be stripped before the text is output). ASCII mark-up conventions which should be followed: _xxx_ Emphasize xxx [xxx] Enbolden xxx - (in a word) Hyphen - (between two numbers) En dash - (surrounded by spaces) Em dash ... Ellipses ... (on a line by itself) Vertical ellipses "xxx" Put xxx in speech marks number' Number in feet Note: These are not interpreted by the game in any way, but help to give a consistent feel to the text displayed to the player. Lines should be ragged-right (ie., left justified) and be no longer than 67 characters. Paragraph breaks should be indicated with a short line in the preceding paragraph (indentation should not be used). Blank lines between paragraphs should be used to indicate the beginning of a quotation or for other unusual purposes (eg., to break verses in poetry). Full stops (and other punctuation which ends a sentence) should be followed by two space characters. 8. Adding a new object ---------------------- 8.1 The 'objects' array. In chapter 6 I introduced you the mons[] array. Now it's the turn of the 'objects' array. It is a collection of structs objclass, being composed of these elements: (from objclass.h) oc_name_idx: actual name of the object. oc_descr_idx: How the object is described when unknown (not identified). oc_uname: Description given by the user (via the Call command). oc_name_known: If 1, means the actual name is always showed. oc_merge: If 1, merge otherwise equal objects. oc_uses_known: Full description should be given. oc_magic: It is a magical object. oc_charged: This object may have charges. oc_unique: This object is unique (amulet of Yendor, etc...) oc_nowish: The player cannot wish for it. oc_big: Big object. oc_dir: Is it directional? Can be: NODIR IMMEDIATE RAY oc_material: What is it made of? Can be one of: LIQUID WAX VEGGY FLESH PAPER CLOTH LEATHER WOOD BONE DRAGON_HIDE IRON METAL COPPER SILVER GOLD PLATINUM MITHRIL PLASTIC GLASS GEMSTONE MINERAL oc_oprop: Properties conveyed by this object, i.e.: FIRE_RES, ANTIMAGIC, etc... oc_class: object class, i.e. WEAPON_CLASS, FOOD_CLASS, etc... oc_delay: Delay when using such an object. oc_color: Color of the object: Can be BLACK RED GREEN BROWN BLUE MAGENTA CYAN GRAY NO_COLOR ORANGE_COLORED BRIGHT_GREEN YELLOW BRIGHT_BLUE BRIGHT_MAGENTA BRIGHT_CYAN WHITE but also take note of this (from color.h): #define HI_OBJ MAGENTA #define HI_METAL CYAN #define HI_COPPER YELLOW #define HI_SILVER GRAY #define HI_GOLD YELLOW #define HI_LEATHER BROWN #define HI_CLOTH BROWN #define HI_ORGANIC BROWN #define HI_WOOD BROWN #define HI_PAPER WHITE #define HI_GLASS BRIGHT_CYAN #define HI_MINERAL GRAY #define HI_ZAP BRIGHT_BLUE oc_prob: probability of the object. The total sum of same class objects should be 1000. oc_weight: its weight. oc_cost: Base cost in shops. Actual price depends on charisma & hawaiian shirts. oc_wsdam: oc_wldam: max small/large monster damage. oc_oc1: oc_oc2: Flags setting the +- something to the object. Its behaviour depends on the class: for a weapon oc1 is the 'to hit' bonus while oc2 is a negative value; for an armor, oc1 is the enchantment level & oc2 is the - (rusting, etc...); for a spellbook oc2 is the spell level. oc_nutrition: food value. But for convenience, several "#defines" have been made so adding a certain class of object is more direct. i.e: #define WEAPON(name,app,kn,mg,bi,prob,wt,cost,sdam,ldam,hitbon,metal,color) OBJE CT( \ OBJ(name,app), BITS(kn,mg,1,0,0,1,0,0,bi,0,metal), 0, \ WEAPON_CLASS, prob, 0, \ wt, cost, sdam, ldam, hitbon, 0, wt, color ) allows to add a new weapon with the WEAPON macro, that sets several default values common for all weapons. There are macros for almost everything: WEAPON, FOOD, ARMOR, RING, etc... Just use the one adequate in your case, keeping in mind: - Put all common class objects together. - Check the probabilities for the class. - Easiest way is -as usual- copy an existing object and modify it. Here there are some examples of entries: ARMOR("Merlin's helm", "sharp-pointed cap", 0, 1, 0, POLYMORPH_CONTROL, 0, 1, 10, 50,10, 0, CLOTH, BRIGHT_BLUE) ARMOR("sport t-shirt", NULL, 1, 0, 0, 0, 0, 0, 5, 3,10, 0, CLOTH, BLUE) TOOL("self-compatible personal computer",NULL,1, 0, 0, 0, 0,80, 200, PLASTIC, GR AY) FOOD("hamburger", 0, 1, 8, 0, VEGGY, 300, BROWN) That's all for the objects[] array. Now, depending of the class some files should be touched; but first, some general recomendations: a) Don't put your object as the first or last of its class: there are TONS of code in the form: if ( (object > FIRST_OF_CLASS_X ) && (object < LAST_OF_CLASS_X ) ) { /* Assume object is of class x */ } else /* Print some strange fatal error */ b) Start with easy objects. Even better: add the object and put no effect for it ---> the warning/error messages will inform you of the correct place to edit. Later put all the complicated things you have in mind, but start it simple. c) There are some general functions that can be applied to all classes. i.e: special effects when eating an object, cancelling it, dipping it, etc. Here is a few hints for adding that: - cancel_item() function, in zap.c, specifies what to do when cancelling. - dodip() in potion.c, for special effects when dipping an object. - eatspecial() in eat.c. - dropy() in do.c, when dropping an object (i.e: a crysknife). 8.1. Adding a tool Your new added tool should have an effect when a)pplying it. That's defined in the doapply() function, inside the apply.c file. There is a huge switch depending on the object type (switch(obj->otyp)); note that different objects are referenced with its name in upper case; that constant is generated by the makedefs command (remember?) in the onames.h file. What a tool does when applying is defined in its 'case'; if simple the code is directly put there, if not a 'use_' function is defined above. Studying such functions is a very good exercise, as they provide lots of useful functions. 8.2. Adding a wand A wand must have extra code in two ocasions: engraving with it and -obviously- zapping it. In engrave.c file we found the doengrave() function. There you should add the appropiate 'case' entry and the message or code for anything you want. Note the differences between directional & no directional wands. In zap.c you should edit different functions depending also in the direc- tional capability of your wand: non-directional --------- > function zapnodir() directional --------- > function bhitm() (wand hits monster). |---- > function bhito() (wand hits object). |---- > function zapyourself() (you, silly). In general adding a wand it is more difficult than any other object. Better start with something else. 8.3. Adding a potion In this case look in file potion.c, for this functions: peffects(): Describes what happens when potion is quaffed. potionhit(): Describes what happens when potion hits a monster. potionbreathe(): Potion vapors effect. Also you'd like to edit the dodip() function where some special effects can be added for dipping cases. 8.4. Adding armor/weapon Unless you want some special feature, there is nothing to do. Good place for adding code is function dmgval() in weapon.c: it adds special damage bonuses for a certain weapon hitting a certain monster. 8.5. Adding a ring Functions to look for in this case: - dosinkring() in do.c. That describes the effects when dropping a ring in a sink. - Ring_on() in do_wear.c What happens when a ring is put on. - Ring_off_or_gone() in do_wear.c The opposite way. - eatring() in eat.c Polymorphed player eats a ring. 8.6. Adding an amulet Quite similar to rings. Edit the functions Amulet_on() & Amulet_off in do_wear.c 8.7. Adding a spellbook First, in spell.c edit two functions: study_book(): for learning a spell. spelleffects(): for casting a spell. As many spells behave like wands you may also have to edit the functions bhitm(), bhito() & zapyourself() in zap.c, a la wand class. 8.8. Adding food Just two functions here, both in eat.c fprefx(): called when first bite of food. fpostfx(): called when consumed food. You should at least add the 'case' lines for the default behaviour. 9. Creating a new room type --------------------------- To explain how to create a new room type, I will use an example: a clinic, that is, a room full of nurses. First of all, go to the include directory and edit the mkroom.h file. After the line #define TEMPLE 10 add #define CLINIC 11 Look than then you'll have to increment the SHOPBASE & subsequents defines to reflect the change, so MAXRTYPE becomes 22. Now edit the rm.h file and after Bitfield(is_cavernous_lev,1); add Bitfield(has_clinic,1); so we can add a special message (for example an ambulance like sound) when being in a level that has a clinic. That's all for the include files. Go to the src directory and edit mkroom.c Look for the mkroom() function and after the line case BARRACKS: mkzoo(BARRACKS); break; add case CLINIC: mkzoo(CLINIC); break; Take note that we are just adding a new non-shop room type, because the previous mkshop() call if (roomtype >= SHOPBASE). We could define a complete 'mkclinic()' function (see for example mktemple) but it is quite simpler to use the mkzoo() code. That function will create a room and fill it -function fill_zoo- with the appropiate monsters. After that, we should edit the mkshop() function. Why? because in wizard mode we could specify a room type to be created using the environment variable SHOPTYPE. For example, if SHOPTYPE='G' starting nethack will create a general shop in first level, 'Z' will create a zoo, etc... It is not necessary, but certainly a good idea to add a new SHOPTYPE for our new room, so we can test it quickly. So, after if(*ep == 't' || *ep == 'T' || *ep == '\\'){ mkzoo(COURT); return; } put the following: if(*ep == 'c' || *ep == 'C'){ mkzoo(CLINIC); return; } Now go for the fill_zoo() itself. After case ZOO: goldlim = 500 * level_difficulty(); break; just add case CLINIC break; Now we have to select the monster to be created in our room. After #ifdef ARMY (type == BARRACKS) ? squadmon() : #endif Add (type == CLINIC) ? &mons[PM_NURSE]: That is, if room type is CLINIC, monster to be created is a nurse. Several things to note here: you can add a more complex function -see for example, the courtmon() function- to select several monsters; also look how the central point of the room is selected in other cases to create a special monster -for example a queen bee in a beehive-. If you want to add objects to the room, several lines after, you'll see: case BARRACKS: if(!rn2(20)) /* the payroll and some loot */ (void) mksobj_at((rn2(3)) ? LARGE_BOX : CHEST, sx, sy, TRUE); break; That is, 1 in 20 make a large box or a chest. We could put something like: case CLINIC: if(!rn2(10)) (void) mksobj_at(ICE_BOX,sx,sy,TRUE); break; To create random ice boxes. It doesn't have to be a container, can be any object you like. Finally add a flag indicating that the level has a clinic: case CLINIC: level.flags.has_clinic = 1; break; You could now recompile and try out your new room using the SHOPTYPE variable, but it will never generated in a normal dungeon. For that, we have to edit mklev.c First, at the beginning of the clear_level_structures() function add the line: level.flags.has_clinic = 0; so the flag is reset. Later, look for the code: if(depth(&u.uz) > 1 && depth(&u.uz) < depth(&medusa_level) && rn2(depth(&u.uz)) < 3) mkroom(SHOPBASE); else if(depth(&u.uz) > 4 && !rn2(6)) mkroom(COURT); else if(depth(&u.uz) > 6 && !rn2(7)) mkroom(ZOO); else if(depth(&u.uz) > 8 && !rn2(5)) mkroom(TEMPLE); else if(depth(&u.uz) > 9 && !rn2(5) && !(mons[PM_KILLER_BEE].geno & (G_GENOD | G_EXTINCT))) mkroom(BEEHIVE); else if(depth(&u.uz) > 11 && !rn2(6)) mkroom(MORGUE); else As you can see, here is where is defined when a certain room can be genera- ted: i.e. zoo's after level 6 one in 7 times, etc... So adding a line like if (depth(&u.uz) > 10 && !rn2(4)) mkroom(CLINIC) will generate a clinic quite frecuently over dungeon level 10. Next, edit the sounds.c file. Look for dosounds() and after #ifdef ARMY if (level.flags.has_barracks && !rn2(200)) { static const char *barracks_msg[4] = { "hear blades being honed.", "hear loud snoring.", "hear dice being thrown.", "hear General MacArthur!", }; You(barracks_msg[rn2(3)+hallu]); return; } #endif /* ARMY */ add #ifdef CLINIC if (level.flags.has_hospital && !rn2(200)) { static const char *hospital_msg[4] = { "hear something about streptococus.", "smell chloroform nearby.", "hear someone cursing viruses.", "seem to hear Doctor Frankenstein.", }; You(hospital_msg[rn2(3)+hallu]); return; } #endif /* CLINIC */ so we get a funny message randomly when having a clinic in level. Last, edit hack.c and see check_special_room(), to add a salute to the player entering a clinic: case CLINIC: You("enter a modern hospital."); break; Also after #ifdef ARMY case BARRACKS: level.flags.has_barracks = 0; break; #endif add #ifdef CLINIC case CLINIC: level.flags.has_clinic = 0; break; #endif Last of all, edit sp_lev.c and after #ifdef ARMY case BARRACKS: level.flags.has_barracks = TRUE; break; #endif add #ifdef CLINIC case CLINIC: level.flags.has_clinic = TRUE; break; #endif inside the fill_room() function. Recompile your code. Congratulations. You just added a new room. 10. Creating a new shop type ---------------------------- Along this chapter we will work to add a 'pet shop' as an example. Adding a new shop is similar to adding a new room: we have to start with the mkroom.h file. After the #define BOOKSHOP 20 line add #define PETSHOP 21 and increase the numbers for UNIQUESHOP, CANDLESHOP & MAXRTYPE. (of course if you already added other rooms in chapter 9 put the correct number accordingly). Now edit the file shknam.c, where most of the shop code is located. First thing you'll note is several 'static const char *shksomething[]' arrays; those are the shopkeeper names for each type of shop. So, after the definition of shkgeneral[], add a new array with the names for our petshops: static const char *shkpetshop[] = { "Valoo","Tisney","Jakuna", "" }; Note the array ends with a "" string. Also you should put more than 3 names, but for our example is enough. Later on the 'const struct shclass shtypes[]' array is defined. It sets the shop types, with these fields: - Name of the shop (i.e:"general store"). - Letter that identifies this type of shop. (i.e: SCROLL_CLASS). It is later used for the SHOPTYPE environment variable in wizard mode. - % probability. Note that the total of all types should be 100, so for adding a new one you'll have to low the probability of other(s). - Object placement type: D_SCATTER = normal placement. D_SHOP = shop-like placement. D_TEMPLE = temple-like placement. - Objects sold there, prefixed with the probability of each. i.e: {{85, RING_CLASS}, {10, GEM_CLASS}, {5, AMULET_CLASS}, {0, 0}} means: rings (85% stock), gems(10%), amulets(5%). Note the NULL pair at the end. Also if defining a concrete object (instead of a class) a minus sign is needed, as in: {{90, WAND_CLASS}, {5, -LEATHER_GLOVES}, {5, -ELVEN_CLOAK}, {0, 0}} Note also that the array is defined (in mkroom.h) as 5 elements long, so a shop cannot stock more than 5 classes/concrete objects. (You can always increase that value as an alternative, of course). - Names array -the shksomething array-. So, in our case put something like: {"pet shop", VENOM_CLASS, 5, D_SHOP, {{70, -FIGURINE},{20,-TRIPE_RATION},{10,-LEASH}}, shkpetshop} meaning: create FIGURINES 70% of the time, 20% tripe rations & 10% leash. Also this shop will be created if setting SHOPTYPE="." or 5% of the time a shop is created. The probability of the general store should be changed from 44 to 39. And that's all. Easy, isn't it?. Just recompile the code and check it out setting: export SHOPTYPE=. (or set SHOPTYPE=. depending in your OS, or unix SHELL). nethack -u wizard -D 11. Goodbye ----------- Hundreds of other things can be added to the game, but this is the end; from here you're on your own. I hope you found this reading useful. Just some last recommendations: 1. Put lots of comments in your code. From experience, in a week or two you'll forget why something was that way or the other. 2. Interchange information about new ideas in rec.games.roguelike.nethack newsgroup. They can help you to refine your ideas or coming up with new ones. 3. Send your modifications to the dev team (at the mail address nethack-bugs@linc.cis.upenn.edu). You can possible win inmortality. 4. Play nethack a lot. Good luck and happy hacking!! ------------------------------------- Apendix A. REFERENCE FUNCTION LISTING ------------------------------------- For your convenience here go some interesting functions: Monster naming functions ------------------------ They all take a pointer to a monst structure as parameter and return a string: char *mon_nam(struct monst *) the rust monster it the invisible orc Fido char *l_monnam(struct monst *) rust monster it invisible orc dog called fido char *Monnam(struct monst *) The rust monster It The invisible orc Fido char *Adjmonnam(struct monst *) The poor rust monster It The poor invisible orc The poor Fido char *Amonnam(struct monst *) A rust monster It An invisible orc Fido char *a_monnam(struct monst *) a rust monster it an invisible orc Fido Object naming functions ----------------------- char *xname(struct obj *) "poisoned arrow" char *doname(struct obj *) "poisoned +0 arrow" char *an(struct obj *) "a poisoned arrow" char *An(struct obj *) "A poisoned arrow" char *The(struct obj *) "The poisoned arrow" char *the(struct obj *) "the poisoned arrow" char *makeplural(char *) Takes a string an pluralizes it. It is quite smart, so the "homunculus" plural becomes "humunculi", etc... char *makesingular(char *) Just the opposite. Display functions ----------------- (Please refer to the doc/window.doc file for more information). pline(char *, ...) Takes the same arguments as the standard printf() function, and displays the result in the screen. It is massively used throughout the code. You(char *, ...) A shorter way to display the "You do something" messages. pline("You sit") is equivalent to You("sit"). Your(char *, ...) A shorter way to display the "Your something" messages. pline("Your hands glow") is equivalent to Your("hands glow"). verbalize(char *, ...) It also behaves as printf(), but displays the resulting string between "". It is used for sounds made by other monsters. impossible(char *, ...) Display an error message with the "impossible:" before it. Several object related functions -------------------------------- struct obj *readobjnam(char *) It creates an object from a string. Mainly used in the wishing routines. int weight(obj) Returns the weight of an object. (not obvious: it can be a container). void docall(struct obj *) Ask the player to call an object. makeknown(obj->otyp) It's not a real function, just a macro. Marks an object type as identified. void curse(struct obj *) Curses an object. void uncurse(struct obj *) Uncurses an object. void bless(struct obj *) Blesses an object. void unbless(struct obj *) Unblesses an object. void move_object(struct obj *,int,int) Move object to x,y position. void remove_object(struct obj *) Remove object. void place_object(struct obj *,int,int) Put object in x,y position. int bhito(struct obj *, struct obj *) Object was hit by the effect of wand indicated in second parameter. void cancel_item(struct obj *) Object has been hit by cancellation ray. Several monster related functions --------------------------------- struct monst *newmonst(struct permonst *) Allocs a new 'monst' struct. It doesn't add it to the chained list of monsters. Tipically the process will be: mtmp = newmonst(ptr->pxlth); *mtmp = zeromonst; /* clear all entries in structure */ mtmp->nmon = fmon; fmon = mtmp; Shouldn't be used directly. Better use makemon(). struct monst *makemon(struct permonst, int, int) Creates a new monster in the position determined by the two other parameters (x,y). It returns the newly created monst struct if success, NULL otherwise. The first parameter can be null; in that case a random monster will be created. The (x,y) position can also be 0 to indicate a random location. void relmon(struct monst *mon) Release monster from display and monster list. boolean mnearto(struct monst *,xchar, xchar, boolean) Put monster near (or at) location if possible. The boolean parameter is for forcing another one to move. Returns 1 - if a monster was moved from x, y to put mtmp at x, y 0 - in most cases. struct permonst *grow_up(struct monst *, struct monst *) Monster grows up to a bigger version. The last monst struct parameter is the victim, if any. If there is none it implies a gain level potion. void mongone(struct monst *) Monster dissapears. The struct is released. void setmangry(struct monst *) Monster gets angry. If already was it, does nothing. boolean angry_guards(register boolean) Function used to angry guards in town. The parameter just indi- cate to display messages if true. Returns TRUE if any guard was there. void pacify_guards() The name says it all. void wake_up(struct monst *) Wake up -and angry- a monster. void wake_nearby() Wake up nearby monsters. void mon_to_stone(struct monst *) Changes the monster into a stone monster of the same type. boolean monnear(struct monst *, x, y) Is the square close enough for the monster to move or attack into? int minwater(struct monst *) Check monster and water for compatibility, 0 (survived), 1 (drowned) int rndmonnum() Select a random, common monster type. Sounds functions ---------------- void dosounds() Make a sound, depending of what is in current level (shop, thrones, etc...) void growl(struct monst *) Monster is happy. void yelp(struct monst *) Monster is not so happy. void whimper(struct monst *) Monster is about to die. void beg(struct monst *) Monster begs for food. int domonnoise(struct monst *) Do whatever sound a monster does. int dotalk() The #chat command. Monsters<->objects functions ---------------------------- int mongets(struct monst *, int) It creates an object and gives it to a monster. The int is the identifier of the object as defined in onames.h (created by makedefs). i.e. BLUE_DRAGON_SCALE_MAIL void m_useup(struct monst *, struct obj *) An object is consumed by a monster. The obj struct is freed. void mpickobj(struct monst *, struct obj *) An object is picked by a monster. void mpickgems(struct monst *) A monster picks up the gems under him. void mpickgold(struct monst *) A monster picks up the gold under him. void mpickstuff(struct monst *) A monster picks up things under him. What it takes it depend on the M-FLAGS defined for this type of monster. void meatobj(struct monst *) Monster eats whatever in his position. Used for gelatinous cubes. void meatgold(struct monst *) A expensive meal :-) boolean can_carry(struct monst *, struct obj *) Returns TRUE if the monster can carry that object struct obj *make_corpse(struct monst *) Creates a monster corpse, a "special" corpse, or nothing if it doesn't leave corpses. Shop related functions ---------------------- struct monst *shop_keeper(char rmno) Returns the shopkeeper given the room number. Example of usage: struct monst *shkp; shkp=shop_keeper(*in_rooms(u.ux,u.uy,SHOPBASE)); int inhishop(struct monst *) Returns true if shopkeeper is in his shop. void mkshobj_at(const struct shclass *,int,int) Make an object of the appropriate type in a shop square. int shkinit(const struct shclass *,struct mkroom *sroom) Create a new shopkeeper in the given room. boolean saleable(int,struct obj *) Returns TRUE if the shop -indicated by the index - stocks that type of objects. Other interesting functions --------------------------- int rn2(int x) Returns a random number between 0 & x. ( 0 <= rn2(x) < x ) int rnl(int x) Returns a random number between 0 & x, just as rn2(), but this time the player's luck affects the result: good luck approaches 0, bad luck approaches x-1. char *getrumor(int) Returns a "rumor" string. if int = 1 rumor is always true, -1 means false and 0 is random. void exercise(int, boolean) Exercise an attribute (A_INT,A_CHA,A_WIS,A_STR,A_DEX). If TRUE increases, FALSE decreases. find_misc() use_misc() Both functions are used in muse.c to detect an object/action that a monster can do and execute it. void mkroom(int) Make and stock a room of a given type. boolean has_dnstairs(struct mkroom *) Returns true if room has downstairs. boolean has_upstairs(struct mkroom *) Returns true if room has upstairs. schar depth(d_level) Returns the depth of a level, in floors below the surface. (note levels in different dungeons can have the same depth). doengrave() User engraves. int bhitm(struct monst *, struct obj *) Monster was hit by the effect of wand or spell indicated in second parameter. int zapyourself(struct obj *) The name says it all: player zapped himself with wand or spell. void zapnodir(struct obj *) Zapping a non-directional wand. int breaks(struct obj *, boolean) Object breaks. The boolean flag indicates if object is or not in the fobj chain. int peffects(struct obj *) Function for potion quaffing effects. void potionhit(struct monst *, struct obj *) Potion hits monster. void potionbreathe(struct obj *) Vapors effects. void dosinkring(struct obj *) Ring is dropped in a sink. void eatring(struct obj *) Polymorphed player eats a ring. void Ring_on(struct obj *) Ring effects when on. void Ring_off_or_gone(struct obj *,boolean) Ring is removed. The boolean flag indicates if gone (stolen). void Amulet_on() void Amulet_off() Similar idea, but for amulets. void fprefx(struct obj *) Called at first bite on food. void fpostfx(struct obj *) Called after last bite on food. int study_book(struct obj *) Study a spellbook. int spelleffects(struct obj *, boolean) Cast a spell. boolean flag indicates if at player himself. slashem-0.0.7E7F3/doc/Guidebook.mn0000664000076400007640000037042710545462317014702 0ustar aliali.\" $Revision: 1.15.2.2 $ $Date: 2005/08/13 11:28:07 $ .ds h0 "SLASH'EM Guidebook .ds h1 .ds h2 % .ds vr "SLASH'EM 0.0.7 .ds f0 "\*(vr .ds f1 .ds f2 "December 10, 2003 .mt A Guide to the Mazes of Menace (Guidebook for SLASH'EM) .au Eric S. Raymond (Extensively edited and expanded for NetHack 3.4) (Revised for SLASH'EM 0.0.3 by Warren Cheung) (Revised for SLASH'EM 0.0.6 by J. Ali Harlow) .hn 1 Introduction .pg Recently, you have begun to find yourself unfulfilled and distant in your daily occupation. Strange dreams of prospecting, stealing, 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 recollection of the strange and powerful creatures that seem to be lurking 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 entered 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? .pg Asking around, you hear about a bauble, called the Amulet of Yendor by some, which, if you can find it, will bring you great wealth. One legend you were told even mentioned that the one who finds the amulet will be granted immortality by the gods. The amulet is rumored to be somewhere beyond the Valley of Gehennom, deep within the Mazes of Menace. Upon hearing the legends, you immediately realize that there is some profound and undiscovered reason that you are to descend into the caverns and seek out that amulet of which they spoke. Even if the rumors of the amulet's powers are untrue, you decide that you should at least be able to sell the tales of your adventures to the local minstrels for a tidy sum, especially if you encounter any of the terrifying and magical creatures of your dreams along the way. You spend one last night fortifying yourself at the local inn, becoming more and more depressed as you watch the odds of your success being posted on the inn's walls getting lower and lower. .pg 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 morning, you gather your gear, eat what may be your last meal outside, and enter the dungeon... .hn 1 What is going on here? .pg You have just begun a game of SLASH'EM. Your goal is to grab as much treasure as you can, retrieve the Amulet of Yendor, and escape the Mazes of Menace alive. .pg Your abilities and strengths for dealing with the hazards of adventure will vary with your background and training: .pg \fIArcheologists\fP understand dungeons pretty well; this enables them to move quickly and sneak up on the local nasties. They start equipped with the tools for a proper scientific expedition. .pg \fIBarbarians\fP 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. .pg \fICavemen\fP and \fICavewomen\fP start with exceptional strength but, unfortunately, with neolithic weapons. .pg \fIFlame Mages\fP have managed to harness mystical energies into the control of the element of fire. Notwithstanding their pet hell hounds, woe be unto anyone who stands in the way of a skilled mage casting a fireball. .pg \fIHealers\fP are wise in medicine and apothecary. They know the herbs and simples that can restore vitality, ease pain, anesthetize, 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. .pg \fIIce Mages\fP command the forces of cold. An experienced Mage can summon great blizzards yet remain unaffected by the turmoil of the elements. .pg \fIKnights\fP are distinguished from the common skirmisher by their devotion to the ideals of chivalry and by the surpassing excellence of their armor. .pg \fIMonks\fP 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. .pg \fINecromancers\fP have delved into the darkest of the magical lore, and mastered some of the most forbidden of the magical lore. Many have fallen to the armies of the undead that they are capable of bringing forth and controlling. .pg \fIPriests\fP and \fIPriestesses\fP are clerics militant, crusaders advancing the cause of righteousness with arms, armor, and arts thaumaturgic. Their ability to commune with deities via prayer occasionally extricates them from peril, but can also put them in it. .pg \fIRangers\fP are most at home in the woods, and some say slightly out of place in a dungeon. They are, however, experts in archery as well as tracking and stealthy movement. .pg \fIRogues\fP are agile and stealthy thieves, with knowledge of locks, traps, and poisons. They specialize in surprise, which they employ to great advantage. .pg \fISamurai\fP are the elite warriors of feudal Nippon. They are heavily armored but quick, and wear the \fIdai-sho\fP, two swords of the deadliest keenness. .pg \fITourists\fP start out with lots of gold (suitable for shopping with), a credit card, lots of food, some maps, and an expensive camera. Most monsters don't like being photographed. .pg \fIUndead Slayers\fP are specialists, trained to hunt the undead as well as other incarnations of evil. They are well aware of the weaknesses of their foes and come prepared. Few denizens of darkness ever encounter such warriors of light and live to tell of it. .pg \fIValkyries\fP are hardy warrior women. Their upbringing in the harsh Northlands makes them strong, inures them to extremes of cold, and instills in them stealth and cunning. .pg \fIWizards\fP 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. .pg \fIYeomen\fP are sturdy fighters. They are famed for their ability to stand doing nothing for hours. It is said that this is because they are none too bright. Yeomen can both take a lot of damage and inflict it on others. .pg You may also choose the race of your character: .pg \fIDoppelgangers\fP have the anviable ability to change form at will, at a cost of some mystic energy (\fImana\fP), although what they become may be a bit of a surprise, even for them. .pg \fIDwarves\fP 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. .pg \fIElves\fP and \fIDrows\fP are agile, quick, and perceptive; very little of what goes on will escape an Elf. The quality of Elven craftsmanship often gives them an advantage in arms and armor. .pg \fIGnomes\fP 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. .pg \fIHobbits\fP are quick of hearing and sharp-eyed, and though they are inclined to be fat and do not hurry unnecessarily, they are nonetheless nimble and deft in their movements. A love of learning (other than genealogical lore) is far from general among them. Hobbits are difficult to daunt, or to kill, and at need can still handle arms. .pg \fIHumans\fP 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. .pg \fILycanthropes\fP are wild beasts who draw their strength from the phases of the moon, and can transform into wolves when they channel their magical energies. Even unarmed, a Lycanthrope is a savage fighter, as many scarred by their deadly claws can attest. .pg \fIOrcs\fP are a cruel and barbaric race that hate every living thing (including other orcs). Above all others, Orcs hate Elves with a passion unequalled, and will go out of their way to kill one at any opportunity. The armor and weapons fashioned by the Orcs are typically of inferior quality. .pg \fIVampires\fP strike fear into the heart of many. Their super-human strength, notorious dexterity and resiliance make them difficult to defeat while their almost hypnotic charm makes them dangerous opponents. Even their own Gods treat vampires with some distaste. .hn 1 What do all those things on the screen mean? .pg On the screen is kept a map of where you have been and what you have seen on the current dungeon level; as you explore more of the level, it appears on the screen in front of you. .pg When SLASH'EM's ancestor \fIrogue\fP first appeared, its screen orientation was almost unique among computer fantasy games. Since then, screen orientation has become the norm rather than the exception; SLASH'EM continues this fine tradition. Unlike text adventure games that accept commands in pseudo-English sentences and explain the results in words, SLASH'EM commands are all one or two keystrokes and the results are displayed graphically on the screen. A minimum screen size of 24 lines by 80 columns is recommended; if the screen is larger, only a 21x80 section will be used for the map. .pg SLASH'EM can even be played by blind players, with the assistance of Braille readers or speech synthesisers. Instructions for configuring SLASH'EM for the blind are included later in this document. .pg SLASH'EM 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. .pg SLASH'EM offers a variety of display options. The options available to you will vary from port to port, depending on the capabilities of your hardware and software, and whether various compile-time options were enabled when your executable was created. The three possible display options are: a monochrome character interface, a color character interface, and a graphical interface using small pictures called tiles. The two character interfaces 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. .pg In order to understand what is going on in SLASH'EM, first you must understand what SLASH'EM is doing with the screen. The SLASH'EM screen replaces the ``You see ...'' descriptions of text adventure games. Figure 1 is a sample of what a SLASH'EM screen might look like. The way the screen looks for you depends on your platform. .TS S center tab(~); a. _ The bat bites! ------ |....| ---------- |.<..|####...@...$.| |....-# |...B....+ |....| |.d......| ------ -------|-- 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 _ .TE .ce 1 Figure 1 .hn 2 The status lines (bottom) .pg 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 various status items mean (though your configuration may not have all the status items listed below): .lp "Rank " Your character's name and professional ranking (based on the 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. .lp Dexterity Dexterity affects your chances to hit in combat, to avoid traps, and do other tasks requiring agility or manipulation of objects. .lp Constitution Constitution affects your ability to recover from injuries and other strains on your stamina. .lp Intelligence Intelligence affects your ability to cast spells and read spellbooks. .lp Wisdom Wisdom comes from your practical experience (especially when dealing with magic). It affects your magical energy. .lp Charisma Charisma affects how certain creatures react toward you. In particular, it can affect the prices shopkeepers offer you. .lp Alignment \fBLawful\fP, \fBNeutral\fP, or \fBChaotic\fP. 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 alignment are more likely to be seriously offended at your presence. .lp "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 somewhere beneath the twentieth level. .lp "Gold " The number of gold pieces you are openly carrying. Gold which you have concealed in containers is not counted. .lp "Hit Points Your current and maximum hit points. Hit points indicate how much damage you can take before you die. The more you get hit in a fight, the lower they get. You can regain hit points by resting, or by using certain magical items or spells. The number in parentheses is the maximum number your hit points can reach. .lp Power Spell points. This tells you how much mystic energy (\fImana\fP) you have available for spell casting. Again, resting will regenerate the amount available. .lp "Armor Class A measure of how effectively your armor stops blows from unfriendly creatures. The lower this number is, the more effective the armor; it is quite possible to have negative armor class. .lp Experience Your current experience level and experience points. As you adventure, you gain experience points. At certain experience point totals, you gain an experience level. The more experienced you are, the better you fight and withstand magical attacks. Many dungeons show only your experience level here. .lp Weight The total weight of all items in your inventory, displayed if you have the .op showweight option set. The number after the slash is your carrying capacity. .lp "Time " The number of turns elapsed so far, displayed if you have the .op time option set. .lp "Hunger status Your current hunger status, ranging from \fBSatiated\fP down to \fBFainting\fP. If your hunger status is normal, it is not displayed. .pg Additional status flags may appear after the hunger status: \fBConf\fP when you're confused, \fBFoodPois\fP or \fBIll\fP when sick, \fBBlind\fP when you can't see, \fBStun\fP when stunned, and \fBHallu\fP when hallucinating. .hn 2 The message line (top) .pg The top line of the screen is reserved for messages that describe things that are impossible to represent visually. If you see a ``\fB--More--\fP'' on the top line, this means that SLASH'EM 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. .hn 2 The map (rest of the screen) .pg The rest of the screen is the map of the level as you have explored it so far. Each symbol on the screen represents something. 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: .lp "- and | The walls of a room, or an open door. Or a grave (|). .lp . The floor of a room, ice, or a doorless doorway. .lp # A corridor, or iron bars, or a tree, or possibly a kitchen sink (if your dungeon has sinks), or a drawbridge. .lp > Stairs down: a way to the next level. .lp < Stairs up: a way to the previous level. .lp + A closed door, or a spellbook containing a spell you may be able to learn. .lp @ Your character or a human. .lp $ A pile of gold. .lp ^ A trap (once you have detected it). .lp ) A weapon. .lp [ A suit or piece of armor. .lp % Something edible (not necessarily healthy). .lp ? A scroll. .lp / A wand. .lp = A ring. .lp ! A potion. .lp ( A useful item (pick-axe, key, lamp...). .lp """ An amulet or a spider web. .lp * A gem or rock (possibly valuable, possibly worthless). .lp ` A boulder or statue. .lp 0 An iron ball. .lp _ An altar, or an iron chain. .lp { A fountain. .lp } A pool of water or moat or a pool of lava. .lp "\e An opulent throne. .lp "a-zA-Z and other symbols 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 more info). .hn 1 Commands .pg Commands are initiated by typing one or two characters. Some commands, like ``search'', do not require that any more information be collected by SLASH'EM. Other commands might require additional information, for example a direction, or an object to be used. For those commands that require additional information, SLASH'EM 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 .op menustyle option. .pg 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 carrying. Here, ``a-zA-Z'' are the inventory letters of your possible choices. Typing `?' gives you an inventory list of these items, so you can see what each letter refers to. In this example, there is also a `*' indicating that you may choose an object not on the list, if you wanted to use something unexpected. 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. .pg Some commands allow you to choose an object that you are not currently carrying. Such commands have an extra option available as in ``What do you want to drink?\ [fgh or ?*,.]''. Typing `,' gives you a list of the applicable objects on the floor, from which you may make your choice. For commands where it is possible to choose your current location rather than an object, the `.' option will be displayed. This can be used to read an engraving or drink from a dungeon feature. .pg 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 .op 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 addition, movement commands can be prefixed for greater control (see below). To cancel a count or a prefix, press the ESC key. .pg The list of commands is rather long, but it can be read at any time during the game through the `?' command, which accesses a menu of helpful texts. As well, there is now a menusystem available through the '`' command for those who would rather page through menus than hunt and peck for keys. Here are the commands for your reference: .lp ESC Cancel the current operation (where applicable) or skip messages. If the .op menu_on_esc option is set, then this key will access the menusystem when pressed while the program is waiting for a command. .lp ? Help menu: display one of several help texts available. .lp ` Main menu: access the menusystem. .lp / 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 particular spot on the map and then pressing one of `.', `,', `;', or `:'. `.' will explain the symbol at the chosen location, conditionally check for ``More info?'' depending upon whether the .op 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 location 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 pressing `?' will give a brief reminder about how it works. .pg Specifying a name rather than a location always gives any additional information available about that name. .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.'' .sd .TS S center; c c. y k u 7 8 9 \e | / \e | / h- . -l 4- . -6 / | \e / | \e b j n 1 2 3 (if \fBnumber_pad\fP is set) .TE .ed .ce 1 Figure 2 .lp [YUHJKLBN] Go in that direction until you hit a wall or run into something. .lp m[yuhjklbn] Prefix: move without picking up objects or fighting (even if you remember a monster there) .lp F[yuhjklbn] Prefix: fight a monster (even if you only guess one is there) .lp M[yuhjklbn] Prefix: move far, no pickup. .lp "g[yuhjklbn] 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. The shortest path is computed over map locations the hero knows about (e.g. seen or previously traversed). If there is no known path, a guess is made instead. Stops on most of the same conditions as the `G' command, but without picking up objects, similar to the `M' command. For ports with mouse support, the command is also invoked when a mouse-click takes place on a location other than the current position. .lp . Rest, do nothing for one turn. .lp a Apply (use) a tool (pick-axe, key, lamp...). .lp 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. .lp ^A Redo the previous command. .lp ^B Borrow (steal) money from an adjacent monster. .lp c Close a door. .lp C Call (name) an individual monster. .lp ^C Panic button. Quit the game. .lp d Drop something. Ex. ``d7a'' means drop seven items of object \fIa\fP. .lp D Drop several things. In answer to the question ``What kinds of things do you want to drop? [!%= BUCXaium]'' you should type zero or more object symbols possibly followed by `a' and/or `i' and/or `u' and/or `m'. In addition, one or more of the blessed/uncursed/cursed groups may be typed. .sd .si DB - drop all objects known to be blessed. DU - drop all objects known to be uncursed. DC - drop all objects known to be cursed. DX - drop all objects of unknown B/U/C status. 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. .ei .ed .lp ^D Kick something (usually a door). .lp e Eat food. Vampires cannot eat as such. However, they can gain nutrition by draining blood from fresh corpses using this command. .\" Make sure Elbereth is not hyphenated below, the exact spelling matters .hw Elbereth .lp E Engrave a message on the floor. Engraving the word ``Elbereth'' 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.) .sd .si E- - write in the dust with your fingers. .ei .ed .lp 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 .op autoquiver is true. .lp i List your inventory (everything you're carrying). .lp I List selected parts of your inventory. .sd .si 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. .ei .ed .lp o Open a door. .lp O Set options. A menu showing the current option values will be displayed. You can change most values simply by selecting the menu entry for the given option (ie, by typing its letter or clicking upon it, depending on your user interface). For the non-boolean choices, a further menu or prompt will appear once you've closed this menu. The available options are listed later in this Guidebook. Options are usually set before the game rather than with the `O' command; see the section on options below. .lp p Pay your shopping bill/Shopkeeper services. .lp P Put on a ring or other accessory (amulet, blindfold). .lp ^P Repeat previous message. Subsequent ^P's repeat earlier messages. The behavior can be varied via the msg_window option. .lp q Quaff (drink) something (potion, water, etc). .lp Q Select an object for your quiver. You can then throw this using the `f' command. (In SLASH'EM versions prior to 0.0.6 this was the command to quit the game, which has now been moved to `#quit'.) .lp r Read a scroll or spellbook. .lp R Remove an accessory (ring, amulet, etc). .lp ^R Redraw the screen. .lp s Search for secret doors and traps around you. It usually takes several tries to find something. .lp S Save (and suspend) the game. The game will be restored automatically the next time you play. .lp t Throw an object or shoot a projectile. .lp T Take off armor. .lp ^T Teleport, if you have the ability. .lp v Display version number. .lp V Display the game history. .lp w Wield weapon. .sd .si w- - wield nothing, use your bare hands. .ei .ed .lp W Wear armor. .lp x Exchange your wielded weapon with the item in your alternate weapon slot. The latter is used as your secondary weapon when engaging in two-weapon combat. Note that if one of these slots is empty, the exchange still takes place. .lp X Enter explore (discovery) mode, explained in its own section later. .lp ^X Display your name, role, race, gender, and alignment as well as the various deities in your game. .lp ^Y Polymorph yourself, if you have the ability. .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)." ( .lp : Look at what is here. .lp ; Show what type of thing a visible symbol corresponds to. .lp , Pick up some things. May be preceded by `m' to force a selection menu. .lp @ Toggle the .op autopickup option on and off. .lp ^ Ask for the type of a trap you found earlier. .lp ) Tell what weapon you are wielding. .lp [ Tell what armor you are wearing. .lp = Tell what rings you are wearing. .lp """ Tell what amulet you are wearing. .lp ( Tell what tools you are using. .lp * Tell what equipment you are using; combines the preceding five type-specific commands into one. .lp $ Count your gold pieces. .lp + List the spells you know. Using this command, you can also rearrange the order in which your spells are listed. They are shown via a menu, and if you select a spell in that menu, you'll be re-prompted for another spell to swap places with it, and then have opportunity to make further exchanges. .lp "\e Show what types of objects have been discovered. .lp ! Escape to a shell. .lp # Perform an extended command. As you can see, the authors of NetHack used up all the letters, so this is a way to introduce the less frequently used commands. What extended commands are available depends on what features the game was compiled with. .lp #adjust Adjust inventory letters (most useful when the .op fixinv option is ``on''). .lp #borrow Borrow (steal) money from an adjacent monster, if you have the ability. .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 Advance or check weapons and spell skills. .lp #force Force a lock. .lp #invoke Invoke an object's special powers. .lp #jump Jump to another location. .lp #loot Loot a box or bag on the floor beneath you, or the saddle from a horse standing next to you. .lp #monster Use a monster's special ability (when polymorphed into monster form). .lp #name Name an item or type of object. .lp #offer Offer a sacrifice to the gods. .lp #pray Pray to the gods for help. .lp #quit Quit the program without saving your game. .lp #ride Ride (or stop riding) a monster. .lp #rub Rub a lamp or a stone. .lp #sit Sit down. .lp #technique Perform a role or race specific technique. A menu showing the techniques available to your character will be displayed. .lp #turn Turn undead. .lp #twoweapon Toggle two-weapon combat on or off. Note that you must use suitable weapons for this type of combat, or it will be automatically turned off. .lp #untrap Untrap something (trap, door, or chest). .lp #vanquished List vanquished monsters (whether by you or not). .lp #youpoly Polymorph yourself, if you have the ability. .lp #version Print compile time options for this version of SLASH'EM. .lp #wipe Wipe off your face. .lp #? Help menu: get the list of available extended commands. .pg If your keyboard has a meta key (which, when pressed in combination 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 {\it NT, OS/2, PC\/ {\rm and} ST SLASH'EM}, .\" the `Alt' key can be used in this fashion; .\" on the Amiga set the {\it altmeta\/} option to get this behavior. In NT, OS/2, and PC SLASH'EM, 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-b #borrow .lp M-c #chat .lp M-d #dip .lp M-e #enhance .lp M-f #force .lp M-i #invoke .lp M-j #jump .lp M-l #loot .lp M-m #monster .lp M-n #name .lp M-o #offer .lp M-p #pray .lp M-q #quit .lp M-r #rub .lp M-s #sit .lp M-t #technique .lp M-u #untrap .lp M-v #version .lp M-w #wipe .lp M-y #youpoly .pg 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 Kick something (usually a door). Same as `^D'. .lp K List vanquished monsters (whether by you or not). Same as ``#vanquished''. .lp 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''. .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''. .hn 1 Rooms and corridors .pg 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. .pg Secret corridors are hidden. You can find them with the `s' (search) command. .hn 2 Doorways .pg 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. .pg 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. .pg Open doors cannot be entered diagonally; you must approach them straight on, horizontally or vertically. Doorways without doors are not restricted in this fashion. .pg Doors can be useful for shutting out monsters. Most monsters cannot open doors, although a few don't need to (ex. ghosts can walk through doors). .pg Secret doors are hidden. You can find them with the `s' (search) command. Once found they are in all ways equivalent to normal doors. .hn 2 Traps (`^') .pg 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 something fall into it, or you discover it with the `s' (search) command. Monsters can fall prey to traps, too, which can be a very useful defensive strategy. .pg 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 traditional rules of Sokoban. Some allowances are permitted in case the player gets stuck; however, they will lower your luck. .hn 2 Stairs (`<', `>') .pg In general, each level in the dungeon will have a staircase going up (`<') to the previous level and another going down (`>') to the next level. There are some exceptions though. For instance, fairly early in the dungeon you will find a level with two down staircases, one continuing into the dungeon and the other 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. .pg 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. .pg Ordinarily when you climb a set of stairs, you will arrive on the corresponding staircase at your destination. However, pets (see below) and some other monsters will follow along if they're close enough when you travel up or down stairs, and occasionally one of these creatures will displace you during the climb. When that occurs, the pet or other monster will arrive on the staircase and you will end up nearby. .hn 2 Ladders (`<', `>') .pg Ladders serve the same purpose as staircases, and the two types of inter-level connections are nearly indistinguishable during game play. .hn 2 Shops and shopping .pg Occasionally you will run across a room with a shopkeeper near the door and many items lying on the floor. You can buy items by picking them up and then using the `p' command. You can inquire about the price of an item prior to picking it up by using the ``#chat'' command while standing on it. Using an item prior to paying for it will incur a charge, and the shopkeeper won't allow you to leave the shop until you have paid any debt you owe. .pg You can sell items to a shopkeeper by dropping them to the floor while inside a shop. You will either be offered an amount of gold and asked whether you're willing to sell, or you'll be told that the shopkeeper isn't interested (generally, your item needs to be compatible with the type of merchandise carried by the shop). .pg If you drop something in a shop by accident, the shopkeeper will usually claim ownership without offering any compensation. You'll have to buy it back if you want to reclaim it. .pg Shopkeepers sometimes run out of money. When that happens, you'll be offered credit instead of gold when you try to sell something. Credit can be used to pay for purchases, but it is only good in the shop where it was obtained; other shopkeepers won't honor it. (If you happen to find a "credit card" in the dungeon, don't bother trying to use it in shops; shopkeepers will not accept it.) .pg The `$' command, which reports the amount of gold you are carrying (in inventory, not inside bags or boxes), will also show current shop debt or credit, if any. The `Iu' command lists unpaid items (those which still belong to the shop) if you are carrying any. The `Ix' command shows an inventory-like display of any unpaid items which have been used up, along with other shop fees, if any. .hn 3 Shop idiosyncracies .pg Several aspects of shop behavior might be unexpected. .\" note: using * instead of \(bu is better for plain text output .lp * 2 The price of a given item can vary due to a variety of factors. .lp * 2 A shopkeeper treats the spot immediately inside the door as if it were outside the shop. .lp * 2 While the shopkeeper watches you like a hawk, he will generally ignore any other customers. .lp * 2 If a shop is "closed for inventory", it will not open of its own accord. .lp * 2 Shops do not get restocked with new items, regardless of inventory depletion. .hn 1 Monsters .pg Monsters you cannot see are not displayed on the screen. Beware! You may suddenly come upon one in a dark place. Some magic items can help you locate them before they locate you (which some monsters can do very well). .pg The commands `/' and `;' may be used to obtain information about those monsters who are displayed on the screen. The command `C' allows you to assign a name to a monster, which may be useful to help distinguish one from another when multiple monsters are present. Assigning a name which is just a space will remove any prior name. .pg 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 monsters such as a shopkeeper or the Oracle of Delphi can produce useful results. .hn 2 Fighting .pg If you see a monster and you wish to fight it, just attempt to walk 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 You start the game with a little dog (`d'), cat (`f'), hell hound pup ('d'), winter wolf cub ('d'), ghoul ('Z'), or pony (`u'), which follows you about the dungeon and fights monsters with you. With the exception of ghouls, 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. .pg 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. .pg 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. .hn 2 Steeds .pg Some types of creatures in the dungeon can actually be ridden 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 order 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 beast that you will see displayed on the map. .pg Riding skill is managed by the `#enhance' command. See the section on Weapon proficiency for more information about that. .hn 2 Bones levels .pg You may encounter the shades and corpses of other adventurers (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. .hn 1 Objects .pg When you find something in the dungeon, it is common to want to pick it up. In SLASH'EM, this is accomplished automatically by walking over the object (unless you turn off the .op autopickup option (see below), or move with the `m' prefix (see above)), or manually by using the `,' command. .pg If you're carrying too many items, SLASH'EM 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. .pg 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 carrying around with you through the dungeon will encumber you. Your reactions will get slower and you'll burn calories faster, requiring food more frequently to cope with it. Eventually, you'll be so overloaded that you'll either have to discard some of what you're carrying or collapse under its weight. .pg SLASH'EM 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. .pg 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 SLASH'EM 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). .pg 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. .pg When you use one of these objects, if its effect is obvious, SLASH'EM 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 instead of assigning a new one. .hn 2 Curses and Blessings .pg 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 enchantments that make them less effective in combat. Other cursed objects may act poorly or detrimentally in other ways. .pg Objects can also be blessed. Blessed items usually work better or more beneficially than normal uncursed items. For example, a blessed weapon will do more damage against demons. .pg There are magical means of bestowing or removing curses upon objects, so even if you are stuck with one, you can still have the curse lifted and the item removed. Priests and Priestesses have an innate sensitivity to this property in any object, so they can more easily avoid cursed objects than other character roles. .pg An item with unknown status will be reported in your inventory 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. .hn 2 Weapons (`)') .pg 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. .pg There are wielded weapons, like maces and swords, and thrown 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. .pg To shoot an arrow, you should first wield a bow, then throw the arrow. An alternative method would be wield a bow and place the arrows in your Quiver, after which you fire the ammunition. Rangers and the like may find that having a bow as their secondary weapon is a useful combination. In order to use a secondary weapon to fire ammunition however, it must first be moved to the primary weapon slot. The ``x'' command is available for this use. Crossbows shoot crossbow bolts. Slings hurl rocks and (other) stones (like gems). .pg 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 identified somehow. Most weapons are subject to some type of damage like rust. Such ``erosion'' damage can be repaired. .pg The chance that an attack will successfully hit a monster, and the amount of damage such a hit will do, depends upon many factors. Among them are: type of weapon, quality of weapon (enchantment and/or erosion), experience level, strength, dexterity, encumbrance, and proficiency (see below). The monster's armor class - a general defense rating, not necessarily due to wearing of armor - is a factor too; also, some monsters are particularly vulnerable to certain types of weapons. .pg 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 alternate weapons. And if you have proficiency in the ``two weapon combat'' skill, you may wield both weapons simultaneously as primary and secondary; 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. .pg There might be times when you'd rather not wield any weapon at all. To accomplish that, wield `-', or else use the `A' command which allows you to unwield the current weapon in addition to taking off 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 SLASH'EM. 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. .pg The commands to use weapons are `w' (wield), `t' (throw), `f' (fire, an alternative way of throwing), `Q' (quiver), `x' (exchange), `#twoweapon', and `#enhance' (see below). .hn 3 Throwing and shooting .pg You can throw just about anything via the `t' command. It will prompt for the item to throw; picking `?' will list things 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 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. .pg 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, .op autoquiver, which has SLASH'EM 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 You will have varying degrees of skill in the weapons available. Weapon proficiency, or weapon skills, affect how well you can use particular types of weapons, and you'll be able to improve your skills as you progress through a game, depending on your role, your experience level, and use of the weapons. .pg For the purposes of proficiency, weapons have been divided up into various groups such as daggers, broadswords, and polearms. Each role has a limit on what level of proficiency a character can achieve for each group. For instance, wizards can become highly skilled in daggers or staves but not in swords or bows. .pg 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'' (sometimes 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''. .pg 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 is no penalty or bonus; at skilled level, you receive a modest bonus in the chance to hit and amount of damage done; at expert level, the bonus is higher. A successful hit has a chance to boost your training towards the next skill level (unless you've already reached the limit for this skill). Once such training reaches the threshold for that next level, you'll be told that you feel more confident in your skills. At that point you can use `#enhance' to increase one or more skills. Such skills are not increased automatically because there is a limit to your total overall skills, so you need to actively choose which skills to enhance and which to ignore. .hn 2 Armor (`[') .pg Lots of unfriendly things lurk about; you need armor to protect 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 being 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 SLASH'EM. Here is an (incomplete) list of the armor classes provided by various suits of armor: .TS S center; a n. dragon scale mail 1 plate mail 3 crystal plate mail 3 bronze plate mail 4 splint mail 4 banded mail 4 dwarvish mithril-coat 4 elven mithril-coat 5 chain mail 5 orcish chain mail 6 scale mail 6 studded leather armor 7 ring mail 7 orcish ring mail 8 leather armor 8 leather jacket 9 no armor 10 .TE .pg You can also wear other pieces of armor (ex. helmets, boots, shields, cloaks) to lower your armor class even further, but you can only wear one item of each category (one suit of armor, one cloak, one helmet, one shield, and so on) at a time. .pg 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. .pg Many types of armor are subject to some kind of damage like rust. Such damage can be repaired. Some types of armor may inhibit spell casting. .pg 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. .hn 2 Food (`%') .pg 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 usually stay fresh, but ice boxes are heavy, and tins take a while to open. .pg When you kill monsters, they usually leave corpses which are also ``food.'' Many, but not all, of these are edible; some also give you special powers when you eat them. A good rule of thumb is ``you are what you eat.'' .pg 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. .pg You can name one food item after something you like to eat with the .op fruit option. .pg The command to eat food is `e'. .hn 2 Scrolls (`?') .pg 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). .pg One of the most useful of these is the \fIscroll of identify\fP, which can be used to determine what another object is, whether it is cursed or blessed, and how many uses it has left. Some objects of subtle enchantment are difficult to identify without these. .pg A mail daemon may run up and deliver mail to you as a \fIscroll of mail\fP (on versions compiled with this feature). To use this feature on versions where SLASH'EM mail delivery is triggered by electronic mail appearing in your system mailbox, you must let SLASH'EM 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 SLASH'EM can shell to it when you read the scroll. On versions of SLASH'EM where mail is randomly generated internal to the game, these environment variables are ignored. You can disable the mail daemon by turning off the .op mail option. .pg The command to read a scroll is `r'. .hn 2 Potions (`!') .pg Potions are distinguished by the color of the liquid inside the flask. They disappear after you quaff them. .pg Clear potions are potions of water. Sometimes these are blessed or cursed, resulting in holy or unholy water. Holy water is the bane of the undead, so potions of holy water are good things to throw (`t') at them. It is also sometimes very useful to dip (``#dip'') an object into a potion. .pg The command to drink a potion is `q' (quaff). .hn 2 Wands (`/') .pg Magic wands usually have multiple magical charges. Some wands are directional\(emyou 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\(emthey don't require a direction. The number of charges in a wand is random and decreases by one whenever you use it. .pg When the number of charges left in a wand becomes zero, attempts to use the wand will usually result in nothing happening. Occasionally, however, it may be possible to squeeze the last few mana points from an otherwise spent wand, destroying it in the process. A wand may be recharged by using suitable magic, but doing so runs the risk of causing it to explode. The chance for such an explosion starts out very small and increases each time the wand is recharged. .pg 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 certainly cause a catastrophic release of magical energies. .pg When you have fully identified a particular wand, inventory display will include additional information in parentheses: the number of times it has been recharged followed by a colon and then by its current number of charges. A current charge count of -1 is a special case indicating that the wand has been cancelled. .pg The command to use a wand is `z' (zap). To break one, use the `a' (apply) command. .hn 2 Rings (`=') .pg Rings are very useful items, since they are relatively permanent magic, unlike the usually fleeting effects of potions, scrolls, and wands. .pg Putting on a ring activates its magic. You can wear only two rings, one on each ring finger. .pg Most rings also cause you to grow hungry more rapidly, the rate varying with the type of ring. .pg The commands to use rings are `P' (put on) and `R' (remove). .hn 2 Spellbooks (`+') .pg 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) \(em unless the attempt backfires. Reading a cursed spellbook or one with mystic runes beyond your ken can be harmful to your health! .pg 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. .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 if you do not use it, and you will need to relearn it. Casting a spell reinforces your memory of it, so you may never need to relearn a frequently used spell. .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. Successfully casting a spell exercises the skill group; sufficient skill may increase the potency of the spell and reduce the risk of spell failure. Skill slots are shared with weapons skills. (See also the section on ``Weapon proficiency''.) .pg Casting a spell also requires flexible movement, and wearing various types 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. The ``#enhance'' extended command advances your spellcasting skills. .hn 2 Tools (`(') .pg 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 containers, which objects can be placed into or taken out of. .pg The command to use tools is `a' (apply). .hn 3 Containers .pg You may encounter bags, boxes, and chests in your travels. A tool of this sort can be opened with the ``#loot'' extended command when you are standing on top of it (that is, on the same floor spot), or with the `a' (apply) command when you are carrying it. However, chests are often locked, and are in any case unwieldy objects. You must set one down before unlocking it by using a key or lock-picking tool with the `a' (apply) command, by kicking it with the `^D' command, or by using a weapon to force the lock with the ``#force'' extended command. .pg Some chests are trapped, causing nasty things to happen when you unlock or open them. You can check for and try to deactivate traps with the ``#untrap'' extended command. .hn 2 Amulets (`"') .pg Amulets are very similar to rings, and often more powerful. Like rings, amulets have various magical properties, some beneficial, some harmful, which are activated by putting them on. .pg Only one amulet may be worn at a time, around your neck. .pg The commands to use amulets are the same as for rings, `P' (put on) and `R' (remove). .hn 2 Gems (`*') .pg 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. .pg Other small rocks are also categorized as gems, but they are much less valuable. All rocks, however, can be used as projectile weapons (if you have a sling). In the most desperate of cases, you can still throw them by hand. .hn 2 Large rocks (`\`') .pg Statues and boulders are not particularly useful, and are generally heavy. It is rumored that some statues are not what they seem. .pg Very large humanoids (giants and their ilk) have been known to use boulders as weapons. .hn 2 Gold (`$') .pg Gold adds to your score, and you can buy things in shops with it. There are a number of monsters in the dungeon that may be influenced by the amount of gold you are carrying (shopkeepers aside). .hn 1 Conduct .pg As if winning SLASH'EM 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. .pg 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 benefits. Calling upon your god for help with starvation does not violate any food challenges either. .pg 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. 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 considered vegan food. Note however that eating such items still counts against foodless conduct. .pg Vegetarians do not eat animals; however, they are less selective 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. .pg 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 corpse. Eating leather, dragon hide, or bone items while polymorphed into a creature that can digest it, or eating monster brains while polymorphed into a mind flayer, is considered eating an animal, although wax is only an animal byproduct. .pg 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 eating 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. .pg An atheist is one who rejects religion. This means that you cannot #pray, #offer sacrifices to any god, #turn undead, or #chat with a priest. Particularly selective readers may argue that playing Monk or Priest characters should violate this conduct; that is a choice left to the player. Offering the Amulet of Yendor to your god is necessary to win the game and is not counted against this conduct. You are also not penalized for being spoken to by an angry god, priest(ess), or other religious figure; a true atheist would hear the words but attach no special meaning to them. .pg 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. .pg In SLASH'EM, 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. .pg An illiterate character cannot read or write. This includes reading a scroll, spellbook, fortune cookie message, or t-shirt; writing a scroll; or reading (or making) an engraving of anything other than a single ``x'' (the traditional signature of an illiterate person). Reading any item that is absolutely necessary to win the game is not counted against this conduct. The identity of scrolls and spellbooks (and knowledge of spells) in your starting inventory is assumed to be learned from your teachers prior to the start of the game and isn't counted. .pg There are several other challenges tracked by the game. It is possible to eliminate one or more species of monsters by genocide; playing without this feature is considered a challenge. When the game offers you an opportunity to genocide monsters, you may respond with the monster type ``none'' if you want to decline. You can change the form of an item into another item 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. Polymorphing monsters, including pets, does not break either of these challenges. Finally, you may sometimes receive wishes; a game without an attempt to wish for any items is a challenge, as is a game without wishing for an artifact (even if the artifact immediately disappears). When the game offers you an opportunity to make a wish for an item, you may choose ``nothing'' if you want to decline. .hn 1 Options .pg Due to variations in personal tastes and conceptions of how SLASH'EM should do things, there are options you can set to change how SLASH'EM behaves. .hn 2 Setting the options .pg 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 SLASHEMOPTIONS environment variable or in a configuration file. Some versions of SLASH'EM also have front-end programs that allow you to set options before starting the game. .hn 2 Using the SLASHEMOPTIONS environment variable .pg The SLASHEMOPTIONS 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'' before 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 terminated by the next comma or the end of string. .pg For example, to set up an environment variable so that ``autoquiver'' is on, ``autopickup'' is off, the name is set to ``Blue Meanie'', and the fruit is set to ``papaya'', you would enter the command .sd % \fBsetenv SLASHEMOPTIONS "autoquiver,\e!autopickup,name:Blue Meanie,fruit:papaya"\fP .ed in \fIcsh\fP (note the need to escape the ! since it's special to the shell), or .sd $ \fBSLASHEMOPTIONS="autoquiver,!autopickup,name:Blue Meanie,fruit:papaya"\fP $ \fBexport SLASHEMOPTIONS\fP .ed in \fIsh\fP or \fIksh\fP. .hn 2 Using a configuration file .pg Any line in the configuration file starting with `#' is treated as a comment. Any line in the configuration file starting with ``OPTIONS='' may be filled out with options in the same syntax as in SLASHEMOPTIONS. 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. A zero in any entry in such a sequence leaves the display of that entry unchanged; this feature is not available using the option syntax. Such a sequence can be continued to multiple lines by putting a `\e' at the end of each line to be continued. Any line starting with ``TILESET='' defines a tile set in the same syntax as in SLASHEMOPTIONS (although the options are different). See the section on tile sets, below, for more information. .pg If your copy of the game included the compile time AUTOPICKUP_EXCEPTIONS option, then any line starting with ``AUTOPICKUP_EXCEPTION='' is taken as defining an exception to the .op pickup_types option. There is a section of this Guidebook that discusses that. .pg The default name of the configuration file varies on different operating systems, but SLASHEMOPTIONS can also be set to the full name of a file you want to use (possibly preceded by an `@'). .hn 2 Customization options .pg Here are explanations of what the various options do. Character strings that are too long may be truncated. Some of the options listed may be inactive in your dungeon. .lp align Your starting alignment (align:lawful, align:neutral, 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). See .op pickup_types to refine the behavior. .lp "autoquiver " This option controls what happens when you attempt the `f' (fire) command with an empty quiver. When true, the computer 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) .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. .lp 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 exception. .lp checkpoint Save game state after each level change, for possible recovery after program crash (default on). .lp 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 compilation. .lp cmdassist Have the game provide some additional command assistance for new players if it detects some anticipated mistakes (default on). .lp "confirm " Have user confirm attacks on pets, shopkeepers, and other peaceable creatures (default on). .lp DECgraphics Use a predefined selection of characters from the DEC VT-xxx/DEC Rainbow/ANSI line-drawing character set to display the dungeon/effects/traps instead of having to define a full graphics set yourself (default off). This option also sets up proper handling of graphics 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 Name your starting dog (ex. ``dogname:Fang''). Cannot be set with the `O' command. .lp dungeon Set the graphics symbols for displaying the dungeon (default \&``\ |--------||.-|++##.##<><>_|\e\e##{}.}..##\ #}''). The .op dungeon option should be followed by a string of 1-42 characters to be used instead of the default map-drawing 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 SLASH'EM escape-processes this option string in conventional C fashion. This means that `\e' is a prefix to take the following character literally. Thus `\e' needs to be represented as `\e\e'. The special escape form `\em' 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, toilet, 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 rearranged. Cannot be set with the `O' command. .lp effects Set the graphics symbols for displaying special effects (default \&``|-\e\e/*!)(0#@*/-\e\e||\e\e-//-\e\e|\ |\e\e-//-\e\e|\ |\e\e-//-\e\e|\ |\e\e-//-\e\e|\ |\e\e-//-\e\e|\ |\e\e-//-\e\e|\ |\e\e-//-\e\e|\ |\e\e-/''). The .op effects option should be followed by a string of 1-83 characters to be used instead of the default special-effects characters. This string is subjected to the same processing as the .op 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 surrounding glyphs for swallowed display, nine glyphs each for magical, fire, cold, death, lightning, poison and acid explosions. 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. .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 not require that you hit Enter. It is implemented only by the tty port (default off), when the game has been compiled to support tty graphics. .lp female An obsolete synonym for ``gender:female''. Cannot be set with the `O' command. .lp fixinv An object's inventory letter sticks to it when it's dropped (default on). If this is off, dropping an object shifts all the remaining inventory letters. .lp "fruit " Name a fruit after something you enjoy eating (ex. ``fruit:mango'') (default ``slime mold''). Basically a nostalgic whimsy that SLASH'EM uses from time to time. You should set this to something you find more appetizing than slime mold. Apples, oranges, pears, bananas, and melons already exist in SLASH'EM, so don't use those. .lp 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'' options, the ``gender'' option will take precedence. The default is to randomly pick an appropriate gender. Cannot be set with the `O' command. .lp ghoulname Name your starting ghoul (ex. ``ghoulname:Casper''). Cannot be set with the `O' command. .lp 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. .lp horsename Name your starting horse (ex. ``horsename:Trigger''). Cannot be set with the `O' command. .lp IBMgraphics Use a predefined selection of IBM extended ASCII characters to display the dungeon/effects/traps instead of having to define a full graphics set yourself (default off). This option also sets up proper handling of graphics characters for such terminals, so you should specify it when appropriate even if you override the selections with your own graphics strings. .lp ignintr Ignore interrupt signals, including breaks (default off). .lp invweight Display the weights of items in your inventory (and at other times) in braces (default off). .lp keep_savefile Keeps the save file after restore. SLASH'EM usually deletes your savefile after you restore, making death permanent. This option can allow you to restore from the last save. (default off). .lp legacy Display an introductory message when starting the game (default on). .lp lit_corridor Show corridor squares seen by night vision or a light source held by your character as lit (default off). .lp lootabc Use the old `a', `b', and `c' keyboard shortcuts when looting, rather than the mnemonics `o', `i', and `b' (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. .lp 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 characters, 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. .lp menu_deselect_all Menu character accelerator to deselect all items in a menu. Implemented by the Amiga, Gem, X11, GTK and tty ports. Default '-'. .lp menu_deselect_page Menu character accelerator to 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_headings Controls how the headings in a menu are highlighted. Values are 'bold', 'inverse', or 'underline'. Not all ports can actually display all three types. .lp menu_invert_all Menu character accelerator to invert all items in a menu. Implemented by the Amiga, Gem, X11, GTK 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_on_esc Make the ESC key a synonym for the ``' (main menu) command (default on). .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, GTK 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 ``abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ@\ \'&;:~]''). This string is subjected to the same processing as the .op 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, piercer, quadruped, rodent, arachnid or centipede, trapper or lurker above, horse or unicorn, vortex, worm, xan or other mythical/fantastic insect, light, Zouthern aminal, 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, apelike creature, zombie, human, ghost, golem, demon, sea monster, lizard, long worm tail, and mimic. Cannot be set with the `O' command. .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 Allows you to change the way recalled messages are displayed. (It is currently implemented for tty only.) The possible values are: .sd .si s - single message (default, this was the behavior before 3.4.0). c - combination, two messages as `single', then as `full'. f - full window, oldest message first. r - full window, newest message first. .ei .ed For backward compatibility, no value needs to be specified (which defaults to `full'), or it can be negated (which defaults to `single'). .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 the role (that is, by suffixing one of .op "-A -B -C -F -H -I -K -M -N -P -Ra -Ro -S -T -U -V -W -Y" ). If .op "-@" is used for the role, then a random one will be automatically chosen. Cannot be set with the `O' command. .lp "news " Read the SLASH'EM 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. .lp "null " Send padding nulls to the terminal (default off). .lp number_pad Use the number keys to move instead of [yuhjklbn] (default 0 or off). (number_pad:2 invokes the old DOS behavior where `5' means `g', meta-`5' means `G', and meta-`0' means `I'.) .lp objects Set the characters used to display object classes (default ``])[="(%!?+/$*`0_.''). This string is subjected to the same processing as the .op dungeon option. The order of the symbols is illegal-object (should never be seen), weapon, armor, ring, amulet, tool, food, potion, scroll, spellbook, wand, gold, gem or rock, boulder or statue, iron ball, chain, and venom. Cannot be set with the `O' command. .lp packorder Specify the order to list object types in (default ``")[%?+!=/(*`0_''). The value of this option should be a string containing the symbols for the various object types. Any omitted types are filled in at the end from the previous order. .lp perm_invent If true, always display your current inventory in a window. This only 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 level (Unburdened, Burdened, streSsed, straiNed, overTaxed, or overLoaded), you will be asked if you want to continue. (Default `S'). .lp pickup_thrown If this boolean option is true and .op autopickup is on, try to pick up things that you threw, even if they aren't in .op pickup_types . Default is on. .lp pickup_types Specify the object types to be picked up when .op autopickup is on. Default is all types. If your copy of the game has the experimental compile time option AUTOPICKUP_EXCEPTIONS included, you may be able to use .op autopickup_exception configuration file lines to further refine .op autopickup behavior. .lp prayconfirm Prompt for confirmation before praying (default on). .lp pushweapon Using the `w' (wield) command when already wielding something pushes the old item into your alternate weapon slot (default off). .lp race Selects your race (for example, ``race:human''). Default is random. Cannot be set with the `O' command. .lp rest_on_space Make the space bar a synonym for the `.' (rest) command (default off). .lp "role " Pick your type of character (ex. ``role:Samurai''); synonym 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'', ``Ranger'', and ``random'' values. .lp runmode Controls the amount of screen updating for the map window when engaged in multi-turn movement (running via shift+direction or control+direction and so forth, or via the travel command or mouse click). The possible values are: .sd .si teleport - update the map after movement has finished; run - update the map after every seven or so steps; walk - update the map after each step; crawl - like walk, but pause briefly after each step. .ei .ed This option only affects the game's screen display, not the actual results of moving. The default is `run'; versions prior to 3.4.1 used `teleport' only. Whether or not the effect is noticeable will depend upon the window port used or on the type of terminal. .lp safe_pet Prevent you from (knowingly) attacking your pets (default on). .lp 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. .lp showexp Show your accumulated experience points on bottom line (default off). .lp showrace Display yourself as the glyph for your race, rather than the glyph for your role (default off). Note that this setting affects only the appearance of the display, not the way the game treats you. .lp showscore Show your approximate accumulated score on bottom line (default off). .lp showdmg Show damage inflicted/damage received (default off). Inflicted damage is only shown to characters who have become experienced enough to quantify their damage. .lp showweight Show total weight in inventory on bottom line (default off). .lp "silent " Suppress terminal beeps (default on). .lp sortpack Sort the pack contents by type when displaying inventory (default on). .lp sound Enable messages about what your character hears (default on). Note that this has nothing to do with your computer's audio capabilities. This option is only partly under player control. The game toggles it off and on during and after sleep, for example. .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 This option may be set to a SLASH'EM version level to suppress alert notification messages about feature changes for that and prior versions (ex. ``suppress_alert:0.0.6''). .lp tiles This option may be set to the name of a tile set to use, or specified as ``notiles'' to disable the use of tiles. Not all windowing interfaces support this option. The tile set named must also be defined. See the section on tile sets for more information on that. .lp "time " Show the elapsed game time in turns on bottom line (default off). .lp timed_delay When pausing momentarily for display effect, such as with explosions and moving objects, use a timer rather than sending extra characters to the screen. (Applies to ``tty'' interface only; ``X11'' and ``GTK'' interfaces always uses a timer based delay. The default is on if configured into the program.) .lp tombstone Draw a tombstone graphic upon your death (default on). .lp toptenwin Put the ending display in a SLASH'EM window instead of on stdout (default off). Setting this option makes the score list visible when a windowing version of SLASH'EM is started without a parent window, but it no longer leaves the score list around after game end on a terminal or emulating window. .lp traps Set the graphics symbols for displaying traps (default \&``^^^^^^^^^^^^^^^^^"^^^^''). The .op traps option should be followed by a string of 1-22 characters to be used instead of the default traps characters. This string is subjected to the same processing as the .op dungeon option. 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. Cannot be set with the `O' command. .lp travel Allow the travel command (default on). Turning this option off will prevent the game from attempting unintended moves if you make inadvertent mouse clicks on the map window. .lp verbose Provide more commentary during the game (default on). .lp windowtype Select which windowing system to use, such as ``tty'' or ``X11'' (default depends on version). Cannot be set with the `O' command. .lp wolfname Name your starting wolf (ex. ``wolfname:Beast''). Cannot be set with the `O' command. .hn 2 Tile sets .pg For those windowing ports which support tiles (multicolored pictures instead of the traditional characters), tile sets can be defined using a line in the configuration file that begins ``TILESET=''. There should be one tile set definition line for each available tile set. Once defined, tile sets can be selected for initial display (using the tiles option) or dynamically selected during the game (for those windowing ports that support this). .pg A ``TILESET'' line has the same syntax as an ``OPTION'' line but with the following options available: .lp name The name of the tile set (for selection). This can be any string of characters excluding the comma. It must be specified. .lp file The name of the file which contains the tile set. This must be specified. .lp transparent Marks a tile set as being transparent (as opposed to opaque). Transparent tile sets allow eg., monsters to be displayed on top of the background. Tile sets must be designed to be used in this way in order to achieve meaningful results. This option is ignored by windowing ports which do not support transparency. .lp pseudo3D Marks a tile set as being designed for use with Mitsuhiro Itakura's pseudo-3D display algorithm. They are assumed to have an offset-X value equal to one third of the total tile width and an offset-Y value equal to one half of the total tile height. Such tile sets are not compatible with standard tile sets and while amusing effects can be created by setting this option incorrectly, nothing useful can be achieved. Windowing ports that do not support pseudo-3D display will ignore tile sets with this option set. .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 SLASH'EM should display an ascii character map if it can. .lp color SLASH'EM should display color if it can for different monsters, objects, and dungeon features .lp eight_bit_tty SLASH'EM should pass eight-bit character values (for example, specified with the .op traps option) straight through to your terminal (default off). .lp font_map SLASH'EM should use a font by the chosen name for the map window. .lp font_menu SLASH'EM should use a font by the chosen name for menu windows. .lp font_message SLASH'EM should use a font by the chosen name for the message window. .lp font_status SLASH'EM should use a font by the chosen name for the status window. .lp font_text SLASH'EM should use a font by the chosen name for text windows. .lp font_size_map SLASH'EM should use this size font for the map window. .lp font_size_menu SLASH'EM should use this size font for menu windows. .lp font_size_message SLASH'EM should use this size font for the message window. .lp font_size_status SLASH'EM should use this size font for the status window. .lp font_size_text SLASH'EM should use this size font for text windows. .lp fullscreen SLASH'EM should try and display on the entire screen rather than in a window. .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 or a red box around the pet. .lp large_font SLASH'EM should use a large font. .lp map_mode SLASH'EM should display the map in the manner specified. .lp mouse_support Allow use of the mouse for input and travel. .lp player_selection SLASH'EM should pop up dialog boxes, or use prompts for character selection. .lp popup_dialog SLASH'EM should pop up dialog boxes for input. .lp preload_tiles SLASH'EM 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_amount SLASH'EM should scroll the display by this number of cells when the hero reaches the scroll_margin. .lp scroll_margin SLASH'EM should scroll the display when the hero or cursor is this number of cells away from the edge of the window. .lp softkeyboard Display an onscreen keyboard. Handhelds are most likely to support this option. .lp splash_screen SLASH'EM should display an opening splash screen when it starts up (default yes). .lp tiled_map SLASH'EM 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 SLASH'EM should display inverse when the game specifies it. .lp vary_msgcount SLASH'EM should display this number of messages at a time in the message window. .lp windowcolors SLASH'EM should display windows with the specified foreground/background colors if it can. .lp wraptext SLASH'EM port should wrap long lines of text if they don't fit in the visible area of the window. .hn 2 Platform-specific Customization options .pg Here are explanations of options that are used by specific platforms or ports to customize and change the port behavior. .lp altkeyhandler Select an alternate keystroke handler dll to load (Win32 tty SLASH'EM only). The name of the handler is specified without the .dll extension and without any path information. Cannot be set with the `O' command. .lp altmeta (default on, AMIGA SLASH'EM only). .lp "BIOS " Use BIOS calls to update the screen 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 SLASH'EM only). .lp flush (default off, AMIGA SLASH'EM only). .lp "MACgraphics" (default on, Mac SLASH'EM only). .lp page_wait (default on, Mac SLASH'EM only). .lp "rawio " Force raw (non-cbreak) mode for faster output and more bulletproof input (MS-DOS sometimes treats `^P' as a printer toggle without it) (default off, OS/2, PC, and ST SLASH'EM only). Note: DEC Rainbows hang if this is turned on. Cannot be set with the `O' command. .lp soundcard (default on, PC SLASH'EM only). Cannot be set with the `O' command. .lp subkeyvalue (Win32 tty SLASH'EM only). May be used to alter the value of keystrokes that the operating system returns to SLASH'EM to help compensate for international keyboard issues. OPTIONS=subkeyvalue:171/92 will return 92 to SLASH'EM, if 171 was originally going to be returned. You can use multiple subkeyvalue statements in the config file if needed. Cannot be set with the `O' command. .lp video Set the video mode used (PC SLASH'EM only). Values are `autodetect', `default', or `vga'. Setting `vga' (or `autodetect' with vga hardware present) will cause the game to display tiles. Cannot be set with the `O' command. .lp 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, (PC SLASH'EM only). 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. Unix and OS/2 ports compiled with VIDEOSHADES option allow defining three more colors. The order of colors is red, green, brown, blue, magenta, cyan, gray, black, bright.red, bright.green, yellow, bright.blue, bright.magenta, bright.cyan and white. MS-Windows and Mac ports don't use this option. In Windows colors can be redefined from window properties. Cannot be set with the `O' command. .lp videoshades Set the intensity level of the three gray scales available (default dark normal light, PC SLASH'EM 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. .hn 2 Configuring autopickup exceptions .pg There is an experimental compile time option called AUTOPICKUP_EXCEPTIONS. If your copy of the game was built with that option defined, you can further refine the behavior of the .op autopickup option beyond what is available through the .op pickup_types option. .pg By placing .op autopickup_exception lines in your configuration file, you can define patterns to be checked when the game is about to autopickup something. .lp autopickup_exception Sets an exception to the .op pickup_types option. The .op autopickup_exception option should be followed by a string of 1-80 characters to be used as a pattern to match against the singular form of the description of an object at your location. .pg You may use the following special characters in a pattern: .sd .si *--- matches 0 or more characters. ?--- matches any single character. .ei .ed .pg In addition, some characters are treated specially if they occur as the first character in the string pattern, specifically: .sd .si < - always pickup an object that matches the pattern that follows. > - never pickup an object that matches the pattern that follows. .ei .ed .pg Can be set with the `O' command, but the setting is not preserved across saves and restores. .pg Here's a couple of examples of autopickup_exceptions: .sd .si autopickup_exception="<*arrow" autopickup_exception=">*corpse" autopickup_exception=">* cursed*" .ei .ed The first example above will result in autopickup of any type of arrow. The second example results in the exclusion of any corpse from autopickup. The last example results in the exclusion of items known to be cursed from autopickup. A `never pickup' rule takes precedence over an `always pickup' rule if both match. .hn 2 Configuring User Sounds .pg Some platforms allow you to define sound files to be played when a message that matches a user-defined pattern is delivered to the message window. At this time the Qt port and the win32tty and win32gui ports support the use of user sounds. .pg The following config file entries are relevant to mapping user sounds to messages: .lp SOUNDDIR The directory that houses the sound files to be played. .lp SOUND An entry that maps a sound file to a user-specified message pattern. Each SOUND entry is broken down into the following parts: .sd .si MESG - message window mapping (the only one supported in 3.4). pattern - the pattern to match. sound file - the sound file to play. volume - the volume to be set while playing the sound file. .ei .ed .pg The exact format for the pattern depends on whether the platform is built to use ``regular expressions'' or SLASH'EM's own internal pattern matching facility. The ``regular expressions'' matching can be much more sophisticated than the internal SLASH'EM pattern matching, but requires 3rd party libraries on some platforms. There are plenty of references available elsewhere for explaining ``regular expressions''. You can verify which pattern matching is used by your port with the #version command. .pg SLASH'EM's internal pattern matching routine uses the following special characters in its pattern matching: .sd .si *--- matches 0 or more characters. ?--- matches any single character. .ei .ed .pg Here's an example of a sound mapping using SLASH'EM's internal pattern matching facility: .sd SOUND=MESG "*chime of a cash register*" "gong.wav" 50 .ed specifies that any message with "chime of a cash register" contained in it will trigger the playing of "gong.wav". You can have multiple SOUND entries in your config file. .pg .hn 2 Configuring SLASH'EM for Play by the Blind .pg SLASH'EM can be set up to use only standard ASCII characters for making maps of the dungeons. This makes the MS-DOS versions of SLASH'EM completely accessible to the blind who use speech and/or Braille access technologies. Players will require a good working knowledge of their screen-reader's review features, and will have to know how to navigate horizontally and vertically character by character. They will also find the search capabilities of their screen-readers to be quite valuable. Be certain to examine this Guidebook before playing so you have an idea what the screen layout is like. You'll also need to be able to locate the PC cursor. It is always where your character is located. Merely searching for an @-sign will not always find your character since there are other humanoids represented by the same sign. Your screen-reader should also have a function which gives you the row and column of your review cursor and the PC cursor. These co-ordinates are often useful in giving players a better sense of the overall location of items on the screen. .pg While it is not difficult for experienced users to edit the \fBdefaults.nh\fP file to accomplish this, novices may find this task somewhat daunting. Included in all official distributions of SLASH'EM is a file called \fBNHAccess.nh\fP. Replacing \fBdefaults.nh\fP with this file will cause the game to run in a manner accessible to the blind. After you have gained some experience with the game and with editing files, you may want to alter settings to better suit your preferences. Instructions on how to do this are included in the \fBNHAccess.nh\fP file itself. The most crucial settings to make the game accessible are: .pg .lp IBMgraphics 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 \fBdefaults.nh\fP file. Most of these replace \fBSLASH'EM\fP's default representation of the dungeon using standard ASCII characters with fancier characters from extended character sets, and these fancier characters can annoy screen-readers. .hn 1 Scoring .pg SLASH'EM maintains a list of the top scores or scorers on your machine, depending on how it is set up. In the latter case, each account on the machine can post only one non-winning score on this list. If you score higher than someone else on this list, or better your previous score, you will be inserted in the proper place under your current name. How many scores are kept can also be set up when SLASH'EM is compiled. .pg Your score is chiefly based upon how much experience you gained, how much loot you accumulated, how deep you explored, and how the game ended. If you quit the game, you escape with all of your gold intact. If, however, you get killed in the Mazes of Menace, the guild will only hear about 90% of your gold when your corpse is discovered (adventurers have been known to collect finder's fees). So, consider whether you want to take one last hit at that monster and possibly live, or quit and stop with whatever you have. If you quit, you keep all your gold, but if you swing and live, you might find more. .pg If you just want to see what the current top players/games list is, you can type \fBslashem -s all\fP on most versions. .hn 1 Explore mode .pg SLASH'EM is an intricate and difficult game. Novices might falter in fear, aware of their ignorance of the means to survive. Well, fear not. Your dungeon may come equipped with an ``explore'' or ``discovery'' mode that enables you to keep old save files and cheat death, at the paltry cost of not getting on the high score list. .pg There are two ways of enabling explore mode. One is to start the game with the .op -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. .hn Credits .pg The original \fIhack\fP game was modeled on the Berkeley .ux \fIrogue\fP game. Large portions of this paper were shamelessly cribbed from \fIA Guide to the Dungeons of Doom\fP, by Michael C. Toy and Kenneth C. R. C. Arnold. Small portions were adapted from \fIFurther Exploration of the Dungeons of Doom\fP, by Ken Arromdee. .pg SLASH'EM is the product of literally dozens of people's work. Main events in the course of the game development are described below: .pg \fBJay Fenlason\fP wrote the original Hack, with help from \fBKenny Woodland\fP, \fBMike Thome\fP and \fBJon Payne\fP. .pg \fBAndries Brouwer\fP 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 .ux machines to the Usenet. .pg \fBDon G. Kneller\fP 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 versions (3.0, 3.2, 3.51, and 3.6). .pg \fBR. Black\fP ported PC HACK 3.51 to Lattice C and the Atari 520/1040ST, producing ST Hack 1.03. .pg \fBMike Stephenson\fP 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. .pg Later, Mike coordinated a major rewrite of the game, heading a team which included \fBKen Arromdee\fP, \fBJean-Christophe Collet\fP, \fBSteve Creps\fP, \fBEric Hendrickson\fP, \fBIzchak Miller\fP, \fBJohn Rupley\fP, \fBMike Threepoint\fP, and \fBJanet Walz\fP, to produce NetHack 3.0c. .pg NetHack 3.0 was ported to the Atari by \fBEric R. Smith\fP, to OS/2 by \fBTimo Hakulinen\fP, and to VMS by \fBDavid Gentzel\fP. The three of them and \fBKevin Darcy\fP later joined the main development team to produce subsequent revisions of 3.0. .pg \fBOlaf Seibert\fP ported NetHack 2.3 and 3.0 to the Amiga. \fBNorm Meluch\fP, \fBStephen Spackman\fP and \fBPierre Martineau\fP designed overlay code for PC NetHack 3.0. \fBJohnny Lee\fP 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. .pg A scant one month before the next major version release of NetHack, two adventurous souls undertook their own modification to the sacred NetHack formula. \fBTom Proudfoot\fP and \fBYuval\fP released Nethack++, which was rapidly renamed Nethack--, contained new monsters, items and other miscellaneous modifications. .pg Headed by \fBMike Stephenson\fP and coordinated by \fBIzchak Miller\fP and \fBJanet Walz\fP, the development team which now included \fBKen Arromdee\fP, \fBDavid Cohrs\fP, \fBJean-Christophe Collet\fP, \fBKevin Darcy\fP, \fBMatt Day\fP, \fBTimo Hakulinen\fP, \fBSteve Linhart\fP, \fBDean Luick\fP, \fBPat Rankin\fP, \fBEric Raymond\fP, and \fBEric Smith\fP 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 individual character quests, a new endgame and many other new features, and produced NetHack 3.1. .pg \fBKen Lorber\fP, \fBGregg Wonderly\fP and \fBGreg Olson\fP, with help from \fBRichard Addison\fP, \fBMike Passaretti\fP, and \fBOlaf Seibert\fP, developed NetHack 3.1 for the Amiga. .pg \fBNorm Meluch\fP and \fBKevin Smolkowski\fP, with help from \fBCarl Schelin\fP, \fBStephen Spackman\fP, \fBSteve VanDevender\fP, and \fBPaul Winner\fP, ported NetHack 3.1 to the PC. .pg \fBJon W{tte\fP and \fBHao-yang Wang\fP, with help from \fBRoss Brown\fP, \fBMike Engber\fP, \fBDavid Hairston\fP, \fBMichael Hamel\fP, \fBJonathan Handler\fP, \fBJohnny Lee\fP, \fBTim Lennan\fP, \fBRob Menke\fP, and \fBAndy Swanson\fP, developed NetHack 3.1 for the Macintosh, porting it for MPW. Building on their development, \fBBarton House\fP added a Think C port. .pg \fBTimo Hakulinen\fP ported NetHack 3.1 to OS/2. \fBEric Smith\fP ported NetHack 3.1 to the Atari. \fBPat Rankin\fP, with help from \fBJoshua Delahunty\fP, was responsible for the VMS version of NetHack 3.1. \fBMichael Allison\fP ported NetHack 3.1 to Windows NT. .pg \fBDean Luick\fP, with help from \fBDavid Cohrs\fP, developed NetHack 3.1 for X11. \fBWarwick Allison\fP 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. .pg Time passed, and Nethack-- was ported to 3.11 by \fBChris\fP. .pg \fBStephen White\fP then released his own modification known as Nethack Plus, which contained new character classes. Unbeknownst to the world at large, \fBTom Proudfoot\fP took this source and combined it with his Nethack--. \fBStephen White\fP went on to add weapon skills, which were eventually integrated into the next version of Nethack, and other features. .pg In February 1996, \fBTom Proudfoot\fP released SLASH V1. Including part of \fBStephen White\fP's Nethack Plus and his own Nethack--, leaving unmentioned his own slew of further modifications, this is perhaps the best known of the Nethack modifications. Six versions of this, ending with SLASH V6, are known to exist. .pg The 3.2 development team, comprised of \fBMichael Allison\fP, \fBKen Arromdee\fP, \fBDavid Cohrs\fP, \fBJessie Collet\fP, \fBSteve Creps\fP, \fBKevin Darcy\fP, \fBTimo Hakulinen\fP, \fBSteve Linhart\fP, \fBDean Luick\fP, \fBPat Rankin\fP, \fBEric Smith\fP, \fBMike Stephenson\fP, \fBJanet Walz\fP, and \fBPaul Winner\fP, released version 3.2 in April of 1996. .pg 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. During the interval between the release of 3.1.3 and 3.2, one of the founding members of the development team, \fBDr. Izchak Miller\fP, was diagnosed with cancer and passed away. That release of the game was dedicated to him by the development and porting teams. .pg \fBLarry Stewart-Zerba\fP set along a different track - to enhance the spellcasting abilities of the Wizard. Thus, in April 1996, he released version 0.1 of the Wizard Patch. By July, he was joined by \fBWarwick Allison\fP and version 0.4 of the Wizard Patch was released. The final update came in April 1997, with the release of Wizard Patch 1.0. .pg \fBWarwick Allison\fP also ported NetHack to use the Qt interface. .pg SLASH V6 was picked up by \fBEnrico Horn\fP, who managed to synchronize it with the 3.2 source. The new SLASH 4.1.2 was released as far back as November 1996 went through at least 4 editlevels (E5, E6, E7) with the latest version being 4.1.2E8, synchronized with Nethack 3.2.2 and the Blackmarket option available, released in June 1997. .pg \fBNathan La\fP began the arduous task of drawing tiles for the SLASH monsters. .pg \fBKentaro Shirakata\fP ported SLASH 4.1.2E8 to Unix. .pg \fBLief Clennon\fP ported SLASH 4.1.2E8 to OS/2 EMX. .pg \fBRomain Dolbeau\fP ported SLASH 4.1.2E8 to Macintosh. .pg \fBWarren Cheung\fP combined SLASH 4.1.2 and Wizard Patch to create SLASH'EM 0.1 in November 1997. Several revisions including new spells and other additions led eventually to SLASH'EM 0.0.5E7F1. \fBSteven Uy\fP generously made additional modifications. .pg \fBDirk Schoenberger\fP continued updating the SLASH/SLASH'EM monster tiles. He also ported SLASH'EM to Linux. .pg \fBLief Clennon\fP ported SLASH'EM to OS/2 EMX. .pg \fBKevin Hugo\fP ported SLASH'EM to Macintosh, and also contributed additional changes and improvements. .pg \fBRobin Johnson\fP finished the arduous task of drawing tiles for the SLASH'EM monsters. He also contributed many more new tiles. .pg Kevin later joined the DevTeam and incorporated the best of these ideas in NetHack 3.3. .pg JNetHack (the Japanese version of NetHack) has been around since at least 1994, developed by Issei Numata and others. The GTK interface was written for this variant and released in 1999. .pg Mitsuhiro Itakura headed a team which began the process of redrawing the NetHack tiles in 8-bit color at 32x32 pixels. .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. \fBAlex Kompel\fP also contributed a Windows CE port for 3.4.1. \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 \fBWarren Cheung\fP combined SLASH'EM 0.0.5E7F1 and NetHack 3.3 to create SLASH'EM 0.0.6 and continues to maintain the DOS and Microsoft Windows ports. .pg \fBJ. Ali Harlow\fP incorporated the GTK interface and Mitsuhiro Itakura's 32x32 tileset into SLASH'EM 0.0.6 and maintains the UNIX port of SLASH'EM. \fBPeter Makholm\fP maintains the Debian package. .pg \fBPaul Hurtley\fP maintains the MAC port of SLASH'EM. - - - - - - - - - - .pg 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: .sd .TS S center; c c c. .\"TABLE_START Adam Aronow Izchak Miller Mike Stephenson Alex Kompel J. Ali Harlow Norm Meluch Andreas Dorn Janet Walz Olaf Seibert Andy Church Janne Salmijarvi Pasi Kallinen Andy Swanson Jean-Christophe Collet Pat Rankin Ari Huttunen Jochen Erwied Paul Winner Barton House John Kallen Pierre Martineau Benson I. Margulies John Rupley Ralf Brown Bill Dyer John S. Bien Ray Chason Boudewijn Waijers Johnny Lee Richard Addison Bruce Cox Jon W{tte Richard Beigel Bruce Holloway Jonathan Handler Richard P. Hughey Bruce Mewborne Joshua Delahunty Rob Menke Carl Schelin Keizo Yamamoto Robin Johnson Chris Russo Ken Arnold Roderick Schertler David Cohrs Ken Arromdee Roland McGrath David Damerell Ken Lorber Ron Van Iwaarden David Gentzel Ken Washikita Ronnen Miller David Hairston Kevin Darcy Ross Brown Dean Luick Kevin Hugo Sascha Wostmann Del Lamb Kevin Sitze Scott Bigham Deron Meranda Kevin Smolkowski Scott R. Turner Dion Nicolaas Kevin Sweet Stephen Spackman Dylan O'Donnell Lars Huttar Stephen White Eric Backus Malcolm Ryan Steve Creps Eric Hendrickson Mark Gooderum Steve Linhart Eric R. Smith Mark Modrall Steve VanDevender Eric S. Raymond Marvin Bressler Teemu Suikki Erik Andersen Matthew Day Tim Lennan Frederick Roeber Merlyn LeRoy Timo Hakulinen Gil Neiger Michael Allison Tom Almy Greg Laskin Michael Feir Tom West Greg Olson Michael Hamel Warren Cheung Gregg Wonderly Michael Sokolov Warwick Allison Hao-yang Wang Mike Engber Yitzhak Sapir Helge Hafting Mike Gallop Irina Rempt-Drijfhout Mike Passaretti .\"TABLE_END Do not delete this line. .TE .ed .\"Microsoft and MS-DOS are registered trademarks of Microsoft Corporation. .\"Lattice is a trademark of Lattice, Inc. .\"Atari and 1040ST are trademarks of Atari, Inc. .\"AMIGA is a trademark of Commodore-Amiga, Inc. .sm "Brand and product names are trademarks or registered trademarks \ of their respective holders." slashem-0.0.7E7F3/doc/dgn_comp.txt0000664000076400007640000001767510545462317014770 0ustar alialiDGN_COMP(6) DGN_COMP(6) NAME dgn_comp - NetHack dungeon compiler SYNOPSIS dgn_comp [ file ] If no arguments are given, it reads standard input. DESCRIPTION Dgn_comp is a dungeon compiler for NetHack version 3.2 and higher. It takes a description file as an argument and produces a dungeon "script" that is to be loaded by NetHack at runtime. The purpose of this tool is to provide NetHack administra- tors and implementors with a convenient way to create a custom dungeon for the game, without having to recompile the entire world. GRAMMAR DUNGEON: name bonesmarker ( base , rand ) [ %age ] where name is the dungeon name, bonesmarker is a letter for marking bones files, ( base , rand ) is the number of levels, and %age is its percentage chance of being gener- ated (if absent, 100% chance). DESCRIPTION: tag where tag is currently one of HELLISH, MAZELIKE, TOWN, or ROGUELIKE. ALIGNMENT | LEVALIGN: [ lawful | neutral | chaotic | unaligned ] gives the alignment of the dungeon/level (default is unaligned). PROTOFILE: name the prototypical name for dungeon level files in this dun- geon. For example, the PROTOFILE name for the dungeon Vlad's Tower is tower. LEVEL: name bonesmarker @ ( base , rand ) [ %age ] where name is the level name, bonesmarker is a letter for marking bones files, ( base , rand ) is the location and %age is the generation percentage, as above. RNDLEVEL: name bonesmarker @ ( base , rand ) [ %age ] rndlevs where name is the level name, bonesmarker is a letter for marking bones files, ( base , rand ) is the location, %age is the generation percentage, as above, and rndlevs is the number of similar levels available to choose from. CHAINLEVEL: name bonesmarker prev_name + ( base , rand ) [ %age ] where name is the level name, bonesmarker is a letter for marking bones files, prev_name is the name of a level defined previously, ( base , rand ) is the offset from the level being chained from, and %age is the generation per- centage. RNDCHAINLEVEL: name bonesmarker prev_name + ( base , rand ) [ %age ] rndlevs where name is the level name, bonesmarker is a letter for marking bones files, prev_name is the name of a level defined previously, ( base , rand ) is the offset from the level being chained from, %age is the generation percent- age, and rndlevs is the number of similar levels available to choose from. LEVELDESC: type where type is the level type, (see DESCRIPTION, above). The type is used to override any pre-set value used to describe the entire dungeon, for this level only. BRANCH: name @ ( base , rand ) [ stair | no_up | no_down | portal ] [ up | down ] [ level ] where name is the name of the dungeon to branch to, and ( base , rand ) is the location of the branch. The last three optional arguments are the branch type, branch direction and target level. The type of a branch can be a two-way stair connection, a one-way stair connection, or a magic portal. A one-way stair is described by the types no_up and no_down which specify which stair direction is missing. The default branch type is stair. The direction for a stair can be either up or down; direction is not applicable to portals. The default direction is down. level is the target dungeon entry point. The dungeon con- nection attaches at this level of the given dungeon. If the value of level is negative, the entry level is calcu- lated from the bottom of the dungeon, with -1 being the last level. If this value is not present in a dungeon description, the entry level defaults to 1. CHAINBRANCH: name prev_name + ( base , rand ) [ stair | no_up | no_down | portal ] [ up | down ] [ level ] where name is the name of the dungeon to branch to, prev_name is the name of a previously defined level and ( base , rand ) is the offset from the level being chained from. The optional branch type, direction and level are the same as described above. GENERIC RULES Each dungeon must have a unique bonesmarker , and each special level must have a bonesmarker unique within its dungeon (letters may be reused in different dungeons). If the bonesmarker has the special value "none", no bones files will be created for that level or dungeon. The value base may be in the range of 1 to MAXLEVEL (as defined in global.h ). The value rand may be in the range of -1 to MAXLEVEL. If rand is -1 it will be replaced with the value (num_dun- levs(dungeon) - base) during the load process (ie. from here to the end of the dungeon). If rand is 0 the level is located absolutely at base. Branches don't have a probability. Dungeons do. If a dungeon fails to be generated during load, all its levels and branches are skipped. No level or branch may be chained from a level with a per- centage generation probability. This is to prevent non- resolution during the load. In addition, no branch may be made from a dungeon with a percentage generation probabil- ity for the same reason. As a general rule using the dungeon compiler: If a dungeon has a protofile name associated with it (eg. tower) that file will be used. If a special level is present, it will override the above rule and the appropriate file will be loaded. If neither of the above are present, the standard genera- tor will take over and make a "normal" level. A level alignment, if present, will override the alignment of the dungeon that it exists within. EXAMPLE Here is the current syntax of the dungeon compiler's "lan- guage": # # The dungeon description file for the "standard" original # 3.0 NetHack. # DUNGEON: "The Dungeons of Doom" "D" (25, 5) LEVEL: "rogue" "none" @ (15, 4) LEVEL: "oracle" "none" @ (5, 7) LEVEL: "bigroom" "B" @ (12, 3) 15 LEVEL: "medusa" "none" @ (20, 5) CHAINLEVEL: "castle" "medusa" + (1, 4) CHAINBRANCH: "Hell" "castle" + (0, 0) no_down BRANCH: "The Astral Plane" @ (1, 0) no_down up DUNGEON: "Hell" "H" (25, 5) DESCRIPTION: mazelike DESCRIPTION: hellish BRANCH: "Vlad's Tower" @ (13, 5) up LEVEL: "wizard" "none" @ (15, 10) LEVEL: "fakewiz" "A" @ (5, 5) LEVEL: "fakewiz" "B" @ (10, 5) LEVEL: "fakewiz" "C" @ (15, 5) LEVEL: "fakewiz" "D" @ (20, 5) LEVEL: "fakewiz" "E" @ (25, 5) DUNGEON: "Vlad's Tower" "T" (3, 0) PROTOFILE: "tower" DESCRIPTION: mazelike ENTRY: -1 DUNGEON: "The Astral Plane" "A" (1, 0) DESCRIPTION: mazelike PROTOFILE: "endgame" NOTES: Lines beginning with '#' are considered comments. A special level must be explicitly aligned. The alignment of the dungeon it is in only applies to non-special levels within that dungeon. AUTHOR M. Stephenson (from the level compiler by Jean-Christophe Collet). SEE ALSO lev_comp(6), nethack(6) BUGS Probably infinite. 12 Dec 1995 DGN_COMP(6) slashem-0.0.7E7F3/doc/slashem.txt0000664000076400007640000002417210545462317014624 0ustar alialiSLASHEM(6) SLASHEM(6) NAME slashem - Exploring The Mazes of Menace SYNOPSIS slashem [ -d directory ] [ -n ] [ -p profession (role) ] [ -r race ] [ -g gender ] [ -a alignment ] [ -[DX] ] [ -u playername ] [ -dec ] [ -ibm ] slashem [ -d directory ] -s [ -v ] [ -p profession (role) ] [ -r race ] [ -g gender ] [ -a alignment ] [ maxrank ] [ playernames ] DESCRIPTION SLASH'EM is a display oriented Dungeons & Dragons(tm) - like game. The standard tty display and command structure resemble rogue. It is an extension of SLASH which is an extension of NetHack. 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, SLASH'EM will give you (a frag- ment 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 SLASHEMOPTIONS 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 .slashemrc on Unix sys- tems. On other systems, the default may be different, usually SLASHEM.cnf. On DOS or Windows, the name is defaults.nh, while on the Macintosh or BeOS, it is SlashEM Defaults. The configuration file's location may be speci- fied by setting SLASHEMOPTIONS to a string consisting of an @ character followed 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 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, -g gender the gender of the chareacter and finally -a alignment to chose the alignment of the charac- ter. Leaving out any of these characteristics will result in you being prompted during the game startup for the infor- mation. Instead of chosing the above seperately you can add them as suffixes to the playername: -u playername-race-gen- der-alignment 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 be also be followed by player type arguments ( -p , -r , -g and -a ) to print the scores of particular types of players 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/local/slashemdir). This option is usually only useful to the game administrator. 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. Tom Proudfoot took NetHack and rendered it into SLASH - SuperLotsaAddedStuffHack, adding more character classes, levels monsters and all manner of changes. Warren Cheung took SLASH and rendered it into SLASHEM - SuperLotsaAddedStuffHack - Extended Magic, with more improvements to the bloated behemoth. FILES All files are in the playground, normally /usr/local/slashemdir. If DLB was defined during the com- pile, the data files and special levels will be inside a larger file, normally nhdat, instead of being separate files. slashem The program itself. data, oracles, rumors Data files used by SLASH'EM. 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 SLASH'EM. 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. SLASHEMOPTIONS String predefining several SLASH'EM 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 Wizards of the Coast, Inc. 24 March 2002 SLASHEM(6) slashem-0.0.7E7F3/doc/window.doc0000664000076400007640000011607010545462317014424 0ustar alialiIntroduction This file documents the support for various windowing systems in NetHack. The support is through a standard interface, separating the 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 There are 5 basic window types, used to call create_nhwindow(): 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) The tty window-port also uses NHW_BASE (the base display) internally. NHW_MENU windows can be used for either menu or text display. Their basic feature is that for the tty-port, if the window is small enough, it appears in the corner of the tty display instead of overwriting the whole screen. The first call to add information to the window will decide if it is going to be used to display a menu or text. If start_menu() is called, then it will be used as a menu. If putstr() is called, it will be used as text. Once decided, there is no turning back. For the tty-port, if the data is too large for a single screen then the data is paged (with --more--) between pages. Only NHW_MENU type windows can be used for menus. NHW_TEXT windows are used to display a large amount of textual data. This is the type of window one would use for displaying a help file, for example. In the tty window-port, windows of type NHW_TEXT can page using the DEF_PAGER, if DEF_PAGER is defined. There exists an assumption that the font for text windows is monospaced. The help files are all formatted accordingly. "window" is always of type winid. This is currently implemented as an integer, but doesn't necessarily have to be done that way. There are a few fixed window names that are known throughout the code: WIN_MESSAGE (top line) WIN_STATUS (bottom lines) WIN_MAP (main dungeon) WIN_INVEN (inventory) Other windows are created and destroyed as needed. "Port" in this document refers to a CPU/OS/hardware platform (UNIX, MSDOS TOS, etc.) "window-port" refers to the windowing platform. This is orthogonal (e.g. UNIX might use either a tty window-port or an X11 window-port). II. Interface Specification All functions below are void unless otherwise noted. A. Low-level routines: 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"). raw_print_bold(str) -- Like raw_print(), but prints in bold/standout (if possible). curs(window, x, y) -- 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. -- For variable sized windows, like the status window, the behavior when curs() is called outside the window's limits is unspecified. The mac port wraps to 0, with the status window being 2 lines high and 80 columns wide. -- Still used by curs_on_u(), status updates, screen locating (identify, teleport). -- NHW_MESSAGE, NHW_MENU and NHW_TEXT windows do not currently support curs in the tty window-port. 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. get_nh_event() -- Does window event processing (e.g. exposure events). A noop for the tty and X window-ports. 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 and it must be non meta-zero too (zero with the meta-bit set). 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. B. High-level routines: 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). 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. -- If choices is NULL, all possible inputs are accepted and returned, preserving case (upper or lower.) This means that if the calling function needs an exact match, it must handle user input correctness itself. 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. -- 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 selection, -1 otherwise. player_selection() -- 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]. #ifdef FILE_AREAS display_file(area, str, boolean complain) #else display_file(str, boolean complain) #endif -- Display the file named str. Complain about missing files iff complain is TRUE. If FILE_AREAS is defined then the file should be found in the named area. Note that vanilla does not define FILE_AREAS and therefore window ports defined in this way will be compatible with both Slash'EM and vanilla NetHack. update_inventory() -- 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. doprev_message() -- Display previous messages. Used by the ^P command. -- On the tty-port this scrolls WIN_MESSAGE back one line. update_positionbar(char *features) -- Optional, POSITIONBAR must be defined. Provide some additional information for use in a horizontal position bar (most useful on clipped displays). Features is a series of char pairs. The first char in the pair is a symbol and the second char is the column where it is currently located. A '<' is used to mark an upstairs, a '>' for a downstairs, and an '@' for the current player location. A zero char marks the end of the list. C. Window Utility Routines 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 exit_nhwindows(str) -- Exits the window system. This should dismiss all windows, except the "window" used for raw_print(). str is printed if possible. window = create_nhwindow(type) -- Create a window of type "type." clear_nhwindow(window) -- Clear the given window, when appropriate. display_nhwindow(window, boolean blocking) -- 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. destroy_nhwindow(window) -- Destroy will dismiss the window if the window has not already been dismissed. start_menu(window) -- 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. 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], 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. -- 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. 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 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_ANY, 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. char message_menu(char let, int how, const char *mesg) -- tty-specific hack to allow single line context-sensitive help to behave compatibly with multi-line help menus. -- This should only be called when a prompt is active; it sends `mesg' to the message window. For tty, it forces a --More-- prompt and enables `let' as a viable keystroke for dismissing that prompt, so that the original prompt can be answered from the message line "help menu". -- Return value is either `let', '\0' (no selection was made), or '\033' (explicit cancellation was requested). -- Interfaces which issue prompts and messages to separate windows typically won't need this functionality, so can substitute genl_message_menu (windows.c) instead. D. Misc. Routines make_sound(???) -- To be determined later. THIS IS CURRENTLY UN-IMPLEMENTED. nhbell() -- Beep at user. [This will exist at least until sounds are redone, since sounds aren't attributable to windows anyway.] 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 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(). 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. askname() -- Ask the user for a player name. 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. number_pad(state) -- Initialize the number pad to the given state. suspend_nhwindows(str) -- Prepare the window to be suspended. resume_nhwindows() -- Restore the windows after being suspended. 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. end_screen() -- Only used on Unix tty ports, but must be declared for completeness. The complement of start_screen(). outrip(winid, int) -- The tombstone code. If you want the traditional code use genl_outrip for the value and check the #if in rip.c. 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 the window interface to the rest of NetHack. char toplines[BUFSZ] Contains the last message printed to the WIN_MESSAGE window, used by Norep(). winid WIN_MESSAGE, WIN_MAP, WIN_STATUS, WIN_INVEN The four standard windows. char *AE, *AS; Checked in options.c to see if we should switch to DEC_GRAPHICS. It is #ifdefed VMS and UNIX. int LI, CO; Set in sys/unix/ioctl.c. The following appears to be Unix specific. Other ports using the tty window-port should also declare this variable in one of your sys/*.c files. 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_ or wc2_ 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 and/or wincap2 mask. See section IX for details of where the wincap masks reside. 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 or wincap2 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 wc_ options can be altered by calling set_wc_option_mod_status(optmask, status) The default value for the wc2_ options can be altered by calling set_wc2_option_mod_status(optmask, status) In each case, set the option modification status to one of SET_IN_FILE, DISP_IN_GAME, or SET_IN_GAME. The setting of any wincap or wincap2 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_* and iflags.wc2_* 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_* and iflags.wc2_* 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_* and 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 and wincap2 preference settings that your port can choose to support: wincap +--------------------+--------------------+--------------------+--------+ | | | 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 | | 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_amount | WC_SCROLL_AMOUNT | wc_scroll_amount |int | | 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 * | | mouse | WC_MOUSE_SUPPORT | wc_mouse_support |boolean | +--------------------+--------------------+--------------------+--------+ wincap2 +--------------------+--------------------+--------------------+--------+ | | | iflags field | data | | player option | bit in wincap mask | for value | type | |--------------------+--------------------+--------------------+--------+ | fullscreen | WC2_FULLSCREEN | wc2_fullscreen |boolean | | softkeyboard | WC2_SOFTKEYBOARD | wc2_softkeyboard |boolean | | wraptext | WC2_WRAPTEXT | wc2_wraptext |boolean | +--------------------+--------------------+--------------------+--------+ 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. fullscreen -- port should try to use the whole screen. hilite_pet -- port should mark pets in some special way on the map. 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_amount -- scroll this amount when scroll_margin is reached. scroll_margin -- port should scroll the display when the hero or cursor is this number of cells away from the edge of the window. softkeyboard -- handhelds should display an on-screen keyboard if possible. 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 wraptext -- port should wrap long lines of text if they don't fit in the visible area of the window mouse_support -- port should enable mouse support if possible 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 wincap 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_wc2_option_mod_status(optmask, status) -- Adjust the optflag field for a set of wincap2 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. Since wincap is full, your option will likely target wincap2 field. 2. Add the description to the paragraph below the chart. 3. Add the WC_ or WC2_ to the bit list in include/winprocs.h (in wincap2 if there is no room in wincap). 4. Add the wc_ or wc2_ field(s) to the iflags structure in flag.h. 5. Add the name and value to wc_options[] or wc2_options[] in options.c 6. Add an appropriate parser to parseoptions() in options.c. 7. Add code to display current value to get_compopt_value() in options.c. 8. Document the option in Guidebook.mn and Guidebook.tex. 9. 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. char display_inventory(lets, want_reply) -- Calls a start_menu()/add_menu()/select_menu() sequence. It returns the item selected, or '\0' if none is selected. Returns '\033' if the menu was canceled. raw_printf(str, ...) -- Like raw_print(), but accepts arguments like printf(). This routine processes the arguments and then calls raw_print(). -- The mac version #defines error raw_printf. I think this is a reasonable thing to do for most ports. pline(str, ...) -- Prints a string to WIN_MESSAGE using a printf() interface. It has the variants You(), Your(), Norep(), and others in pline.c which all use the same mechanism. pline() requires the variable "char toplines[]" be defined; Every putstr() on WIN_MESSAGE must copy str to toplines[] for use 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 order of the calls should be the same. choose_windows(DEFAULT_WINDOW_SYS) /* choose a default window system */ initoptions() /* read the resource file */ init_nhwindows() /* initialize the window system */ process_options(argc, argv) /* process command line options or equiv */ if(save file is present) { display_gamewindows() /* create & display the game windows */ dorestore() /* restore old game; pline()s are OK */ } else { player_selection() /* select a player type using a window */ display_gamewindows() /* create & display the game windows */ } pline("Hello, welcome..."); Choose_windows() is a common routine, and calling it in main() is necessary to initialize the function pointer table to _something_ so that calls to raw_print() will not fail. Choose_windows() should be called almost immediately upon entering main(). Look at unixmain.c for an example. Display_gamewindows() is a common routine that displays the three standard game windows (WIN_MESSAGE, WIN_MAP, and WIN_STATUS). It is normally called just before the "Hello, welcome" message. Process_options() is currently still unique to each port. There may be need 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, COPYRIGHT_BANNER_B, and COPYRIGHT_BANNER_C macros from patchlevel.h be used for constructing the Copyright message. COPYRIGHT_BANNER_A is a quoted string that has the NetHack copyright declaration, COPYRIGHT_BANNER_B is a quoted string that states who the copyright belongs to, and COPYRIGHT_BANNER_C simply says "See License for details." Be sure to #include "patchlevel.h" to define these macros. Using the macros will prevent having to update the Copyright information in each window-port prior to each release. Ports (MSDOS, TOS, MAC, etc) _may_ use window-port specific routines in their port specific files, _AT_THEIR_OWN_RISK_. Since "port" and "window-port" are orthogonal, you make your "port" code less portable by using "window-port" specific routines. Every effort should be made to use window-port interface routines, unless there is something port specific that is better suited (e.g. msmsg() for MSDOS). The tty window-port is contained in win/tty, the X window port is contained in win/X11. The files in these directories contain _only_ window port code, 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: 1) Pick a unique prefix to identify your window-port. For example, the tty window port uses "tty"; the X11 window-port uses "X11". 2) When declaring your interface function, precede the function names with your unique prefix. E.g: void tty_init_nhwindows() { /* code for initializing windows in the tty port */ } When calling window functions from within your port code, we suggest calling the prefixed version to avoid unnecessary overhead. However, you may safely call the non-prefixed version (e.g. putstr() rather than tty_putstr()) as long as you #include "hack.h". If you do not include hack.h and use the non-prefixed names, you will get compile or link-time errors. We also suggest declaring all functions and port-specific data with this prefix to avoid unexpected overlaps with other window-ports. The tty and X11 ports do not currently follow this suggestion, but do use separate non-overlapping convention for naming data and internal functions. 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 the structure definition from an existing window-port and just change the prefixes. That will guarantee that you get the order of your initializations correct (not all compilers will catch out-of-order function pointer declarations). 4) Add a #define to config.h identifying your window-port in the "Windowing systems" section. Follow the "prefix_GRAPHICS" convention for your window-port. 5) Add your prefix to the list of valid prefixes listed in the "Known systems are" comment. 6) Edit makedefs.c and add a string for your windowing system to window_opts inside an #ifdef prefix_GRAPHICS. 7) Edit windows.c and add an external reference to your prefix_procs inside an #ifdef prefix_GRAPHICS. Also add an entry to the win_choices structure for your window-port of the form: #ifdef prefix_GRAPHICS { &prefix_procs, prefix_init_function }, #endif The init_function is necessary for some compilers and systems to force correct linking. If your system does not need such massaging, you may put a null pointer here. You should declare prefix_procs and prefix_init_function as extern's in your win*.h file, and #include that file at the beginning of windows.c, also inside an #ifdef prefix_GRAPHICS. Some win*.h files are rather sensitive, and you might have to duplicate your prefix_procs and prefix_init_function's instead of including win*.h. The tty port includes wintty.h, the X11 port duplicates the declarations. 8) If your port uses Makefile.src, add the .c and .o files and an appropriate comment in the section on "WINSRC" and "WINOBJ". See Makefile.src for the style to use. If you don't use Makefile.src, we suggest using a similar convention for the make-equivalent used on your system. Also add your new source and binaries to WINSRC and WINOBJ (if you want the NetHack binary to include them, that is). 9) Look at your port's portmain.c (the file containing main()) and make sure that all of the calls match 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 window-ports you want in your binary, the default window-port to use, and the .o's needed to build a valid game. One caveat. Unfortunately, if you incorrectly specify the DEFAULT_WINDOW_SYS, NetHack will dump core (or whatever) without printing any message, because raw_print() cannot function without first setting the window-port. slashem-0.0.7E7F3/doc/dgn_comp.60000664000076400007640000001604710545462317014306 0ustar aliali.TH DGN_COMP 6 "12 Dec 1995" .UC 4 .SH NAME dgn_comp \- NetHack dungeon compiler .SH SYNOPSIS .B dgn_comp [ .I file ] .PP If no arguments are given, it reads standard input. .SH DESCRIPTION .PP .I Dgn_comp is a dungeon compiler for NetHack version 3.2 and higher. It takes a description file as an argument and produces a dungeon "script" that is to be loaded by NetHack at runtime. .PP The purpose of this tool is to provide NetHack administrators and implementors with a convenient way to create a custom dungeon for the game, without having to recompile the entire world. .SH GRAMMAR .PP DUNGEON: .B name .B bonesmarker ( .B base , .B rand ) [ .B %age ] .PP where .B name is the dungeon name, .B bonesmarker is a letter for marking bones files, ( .B base , .B rand ) is the number of levels, and .B %age is its percentage chance of being generated (if absent, 100% chance). DESCRIPTION: .B tag .PP where .B tag is currently one of .BR HELLISH , .BR MAZELIKE , .BR TOWN , or .BR ROGUELIKE . ALIGNMENT | LEVALIGN: [ .B lawful | .B neutral | .B chaotic | .B unaligned ] .PP gives the alignment of the dungeon/level (default is unaligned). PROTOFILE: .B name .PP the prototypical name for dungeon level files in this dungeon. For example, the PROTOFILE name for the dungeon .I Vlad's Tower is .IR tower . LEVEL: .B name .B bonesmarker @ ( .B base , .B rand ) [ .B %age ] .PP where .B name is the level name, .B bonesmarker is a letter for marking bones files, ( .B base , .B rand ) is the location and .B %age is the generation percentage, as above. RNDLEVEL: .B name .B bonesmarker @ ( .B base , .B rand ) [ .B %age ] .B rndlevs .PP where .B name is the level name, .B bonesmarker is a letter for marking bones files, ( .B base , .B rand ) is the location, .B %age is the generation percentage, as above, and .B rndlevs is the number of similar levels available to choose from. CHAINLEVEL: .B name .B bonesmarker .B prev_name + ( .B base , .B rand ) [ .B %age ] .PP where .B name is the level name, .B bonesmarker is a letter for marking bones files, .B prev_name is the name of a level defined previously, ( .B base , .B rand ) is the .I offset from the level being chained from, and .B %age is the generation percentage. RNDCHAINLEVEL: .B name .B bonesmarker .B prev_name + ( .B base , .B rand ) [ .B %age ] .B rndlevs .PP where .B name is the level name, .B bonesmarker is a letter for marking bones files, .B prev_name is the name of a level defined previously, ( .B base , .B rand ) is the .I offset from the level being chained from, .B %age is the generation percentage, and .B rndlevs is the number of similar levels available to choose from. LEVELDESC: .B type .PP where .B type is the level type, (see DESCRIPTION, above). The .B type is used to override any pre-set value used to describe the entire dungeon, for this level only. BRANCH: .B name @ ( .B base , .B rand ) [ .B stair | .B no_up | .B no_down | .B portal ] [ .B up | .B down ] [ .B level ] .PP where .B name is the name of the dungeon to branch to, and ( .B base , .B rand ) is the location of the branch. The last three optional arguments are the branch type, branch direction and target level. The type of a branch can be a two-way stair connection, a one-way stair connection, or a magic portal. A one-way stair is described by the types .B no_up and .B no_down which specify which stair direction is missing. The default branch type is .BR stair . The direction for a stair can be either up or down; direction is not applicable to portals. The default direction is .BR down . .B level is the target dungeon entry point. The dungeon connection attaches at this level of the given dungeon. If the value of .B level is negative, the entry level is calculated from the bottom of the dungeon, with -1 being the last level. If this value is not present in a dungeon description, the entry level defaults to 1. CHAINBRANCH: .B name .B prev_name + ( .B base , .B rand ) [ .B stair | .B no_up | .B no_down | .B portal ] [ .B up | .B down ] [ .B level ] .PP where .B name is the name of the dungeon to branch to, .B prev_name is the name of a previously defined .B level and ( .B base , .B rand ) is the .I offset from the level being chained from. The optional branch type, direction and level are the same as described above. .SH GENERIC RULES .PP Each dungeon must have a unique .B bonesmarker , and each special level must have a .B bonesmarker unique within its dungeon (letters may be reused in different dungeons). If the .B bonesmarker has the special value "none", no bones files will be created for that level or dungeon. .PP The value .B base may be in the range of 1 to .B MAXLEVEL (as defined in .I global.h ). .PP The value .B rand may be in the range of -1 to .BR MAXLEVEL . .PP If .B rand is -1 it will be replaced with the value (num_dunlevs(dungeon) - base) during the load process (ie. from here to the end of the dungeon). .PP If .B rand is 0 the level is located absolutely at .BR base . .PP Branches don't have a probability. Dungeons do. If a dungeon fails to be generated during load, all its levels and branches are skipped. .PP No level or branch may be chained from a level with a percentage generation probability. This is to prevent non-resolution during the load. In addition, no branch may be made from a dungeon with a percentage generation probability for the same reason. .PP As a general rule using the dungeon compiler: .PP If a dungeon has a .B protofile name associated with it .RI ( eg. .BR tower ) that file will be used. .PP If a special level is present, it will override the above rule and the appropriate file will be loaded. .PP If neither of the above are present, the standard generator will take over and make a "normal" level. .PP A level alignment, if present, will override the alignment of the dungeon that it exists within. .SH EXAMPLE .PP Here is the current syntax of the dungeon compiler's "language": .LP .nf .ta +8n +8n +8n # # The dungeon description file for the "standard" original # 3.0 NetHack. # DUNGEON: "The Dungeons of Doom" "D" (25, 5) LEVEL: "rogue" "none" @ (15, 4) LEVEL: "oracle" "none" @ (5, 7) LEVEL: "bigroom" "B" @ (12, 3) 15 LEVEL: "medusa" "none" @ (20, 5) CHAINLEVEL: "castle" "medusa" + (1, 4) CHAINBRANCH: "Hell" "castle" + (0, 0) no_down BRANCH: "The Astral Plane" @ (1, 0) no_down up DUNGEON: "Hell" "H" (25, 5) DESCRIPTION: mazelike DESCRIPTION: hellish BRANCH: "Vlad's Tower" @ (13, 5) up LEVEL: "wizard" "none" @ (15, 10) LEVEL: "fakewiz" "A" @ (5, 5) LEVEL: "fakewiz" "B" @ (10, 5) LEVEL: "fakewiz" "C" @ (15, 5) LEVEL: "fakewiz" "D" @ (20, 5) LEVEL: "fakewiz" "E" @ (25, 5) DUNGEON: "Vlad's Tower" "T" (3, 0) PROTOFILE: "tower" DESCRIPTION: mazelike ENTRY: -1 DUNGEON: "The Astral Plane" "A" (1, 0) DESCRIPTION: mazelike PROTOFILE: "endgame" .fi .PP .I NOTES: .br Lines beginning with '#' are considered comments. .br A special level must be explicitly aligned. The alignment of the dungeon it is in only applies to non-special levels within that dungeon. .SH AUTHOR .PP M. Stephenson (from the level compiler by Jean-Christophe Collet). .SH "SEE ALSO" .PP lev_comp(6), nethack(6) .SH BUGS .PP Probably infinite. slashem-0.0.7E7F3/doc/recover.60000664000076400007640000000705710545462317014166 0ustar aliali.TH RECOVER 6 "9 January 1993" .UC 4 .SH NAME recover \- recover a NetHack game interrupted by disaster .SH SYNOPSIS .B recover [ .B \-d .I directory ] .I "base1 base2" ... .SH DESCRIPTION .PP Occasionally, a NetHack game will be interrupted by disaster when the game or the system crashes. Prior to NetHack v3.1, these games were lost because various information like the player's inventory was kept only in memory. Now, all pertinent information can be written out to disk, so such games can be recovered at the point of the last level change. .PP The .I base options tell .I recover which files to process. Each base option specifies recovery of a separate game. .PP The .B \-d option, which must be the first argument if it appears, supplies a directory which is the NetHack playground. It overrides the value from NETHACKDIR, HACKDIR, or the directory specified by the game administrator during compilation (usually /usr/games/lib/nethackdir). .PP For recovery to be possible, .I nethack must have been compiled with the INSURANCE option, and the run-time option .I checkpoint must also have been on. NetHack normally writes out files for levels as the player leaves them, so they will be ready for return visits. When checkpointing, NetHack also writes out the level entered and the current game state on every level change. This naturally slows level changes down somewhat. .PP The level file names are of the form base.nn, where nn is an internal bookkeeping number for the level. The file base.0 is used for game identity, locking, and, when checkpointing, for the game state. Various OSes use different strategies for constructing the base name. Microcomputers use the character name, possibly truncated and modified to be a legal filename on that system. Multi-user systems use the (modified) character name prefixed by a user number to avoid conflicts, or "xlock" if the number of concurrent players is being limited. It may be necessary to look in the playground to find the correct base name of the interrupted game. .I recover will transform these level files into a save file of the same name as .I nethack would have used. .PP Since .I recover must be able to read and delete files from the playground and create files in the save directory, it has interesting interactions with game security. Giving ordinary players access to .I recover through setuid or setgid is tantamount to leaving the playground world-writable, with respect to both cheating and messing up other players. For a single-user system, this of course does not change anything, so some of the microcomputer ports install .I recover by default. .PP For a multi-user system, the game administrator may want to arrange for all .0 files in the playground to be fed to recover when the host machine boots, and handle game crashes individually. If the user population is sufficiently trustworthy, .I recover can be installed with the same permissions the .I nethack executable has. In either case, .I recover is easily compiled from the distribution utility directory. .SH NOTES .PP Like .I nethack itself, .I recover will overwrite existing savefiles of the same name. Savefiles created by .I recover are uncompressed; they may be compressed afterwards if desired, but even a compression-using .I nethack will find them in the uncompressed form. .SH "SEE ALSO" nethack(6) .SH BUGS .PP .I recover makes no attempt to find out if a base name specifies a game in progress. If multiple machines share a playground, this would be impossible to determine. .PP .I recover should be taught to use the nethack playground locking mechanism to avoid conflicts. slashem-0.0.7E7F3/README.gtk0000664000076400007640000000067110545462317013324 0ustar aliali GTK-NetHack Copyright 1999 I.Numata COPYRIGHT NOTICE GTK NetHack is an interface for NetHack using the GTK+ library. You must read the original license (dat/license) and obey it to redistribute and modify this program. GTK NetHack obeys the original license completely. GTK part copyright belongs to the author. To play in GTK+, add the following line to your .slashemrc: OPTIONS=windowtype:gtk slashem-0.0.7E7F3/Files0000664000076400007640000004407010545462317012646 0ustar alialiThis is a listing of all files in a full Slash'EM 0.0.7 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. .: (files in top directory) Files Porting README.34 README.gtk history.txt license make_anh.tx readme.s6 readme.txt slamfaq.txt dat: (files for all versions) Arch.des Barb.des Caveman.des Flame.des Healer.des Ice.des Knight.des Monk.des Necro.des Priest.des Ranger.des Rogue.des Samurai.des Slayer.des Tourist.des Valkyrie.des Wizard.des Yeoman.des beholder.des bigroom.des blkmar.des castle.des cmdhelp credit.xpm data.base dragons.des dungeon.def endgame.des frnknstn.des gehennom.des giants.des grund.des guild.des gypsy.txt help hh history knox.des kobold-1.des kobold-2.des license lich.des mall-1.des mall-2.des medusa.des mines.des mtemple.des newmall.des nightmar.des nymph.des opthelp oracle.des oracles.txt pet_mark.pbm quest.txt rats.des rumors.fal rumors.tru sea.des sokoban.des spiders.des stor-1.des stor-2.des stor-3.des template.des tomb.des tower.des wizhelp yendor.des 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 proxy.doc recover.6 recover.txt slashem.6 slashem.txt sources.txt strategy.txt tmac.n window.doc include: (files for all versions) align.h amiconf.h artifact.h artilist.h attk.h attrib.h beconf.h color.h config.h config1.h coord.h decl.h def_os2.h dgn_file.h display.h dlb.h dungeon.h edog.h egyp.h emin.h engrave.h epri.h eshk.h extern.h file.h flag.h func_tab.h global.h hack.h lev.h macconf.h macpopup.h macwin.h mail.h md5.h mfndpos.h micro.h mkroom.h monattk.h mondata.h monflag.h monst.h monsym.h nhlan.h nhxdr.h ntconf.h obj.h objclass.h os2conf.h patchlevel.h pcconf.h permonst.h prop.h proxycb.h proxycom.h prxyclnt.h qtext.h quest.h rect.h region.h rm.h skills.h sp_lev.h spell.h system.h tcap.h tech.h timeout.h tosconf.h tradstdc.h trampoli.h trap.h unixconf.h vault.h vision.h vmsconf.h wceconf.h winami.h winprocs.h winproxy.h wintype.h you.h youprop.h (file for tty versions) wintty.h (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) winGnome.h (files for GTK vesion) winGTK.h (files for mactty version) mactty.h mttypriv.h (files for SDL/GL version) winGL.h src: (files for all versions) allmain.c alloc.c apply.c artifact.c attrib.c ball.c bones.c borg.c botl.c cmd.c dbridge.c decl.c detect.c dig.c display.c dlb.c do.c do_name.c do_wear.c dog.c dogmove.c dokick.c dothrow.c drawing.c dungeon.c eat.c end.c engrave.c exper.c explode.c extralev.c files.c fountain.c gypsy.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 tech.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.agc Makefile.ami 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 unx2atar.sed sys/be: (files for BeOS version) README bemain.c sys/mac: (files for Macintosh versions) Files.r Install.mpw Install.mw Levels.make MFiles.r MRecover.r MacHelp Macintosh.make NHDeflts NHrsrc.r NHsound.r News README.txt dprintf.c maccurs.c macerrs.c macfile.c machelp.bh macmain.c macmenu.c macsnd.c mactopl.c mactty.c macunix.c macwin.c mgetline.c mmodal.c mrecover.c mttymain.c sys/msdos: (files for MSDOS version) 2xsai.c 2xsai.h 2xtest.c ALGINIT.H ALLEG.CNF Install.dos Makefile.GCC Makefile.BC Makefile.MSC NHAccess.nh alginit.h alleg.cnf alnames.h anethack.fnt anethack.txt alfuncs.h bmp2txt.c idx2bmp.c loadfont.h maintovl.doc makefile.doc moveinit.pat msdos.c msdoshlp.txt ovlinit.c pckeys.c pctiles.c pctiles.h pcvideo.h portio.h schema1.BC schema2.BC schema3.MSC setup.bat sound.c template.mak tile2bin.c txt2bmp.c vidal2.c vidalleg.c video.c vidtxt.c vidvga.c (files for running MSDOS binary under Windows) nhico.uu nhpif.uu sys/msdos/tiles: 16off.bmp 16on.bmp 32off.bmp 32on.bmp credits curs3d-2.bmp cursor.bmp cursor3d.bmp error.bmp index map.bmp pal.bmp title.bmp titlebg.bmp sys/msdos/tiles/spfx: acidball.bmp attack.bmp balllit.bmp cleric.bmp divine.bmp dthfield.bmp enchant.bmp escape.bmp fail.bmp fireball.bmp gasspore.bmp heal.bmp magblast.bmp matter.bmp poisball.bmp sleepexp.bmp snowball.bmp sys/msdos/tiles/subs: altarc.bmp altarl.bmp altarm.bmp altarn.bmp kni_fem.bmp pri_femc.bmp pri_feml.bmp pri_femn.bmp pri_malc.bmp pri_mall.bmp pri_maln.bmp rog_fem.bmp tou_fem.bmp wiz_fem.bmp sys/os2: (files for OS/2 version) Install.os2 Makefile.os2 nhpmico.uu os2.c setup.cmd sys/share: (icon for Windows) slashem.ico (files for MSDOS and OS/2 versions) Makefile.lib termcap.uu (file for MSDOS, OS/2, NT, Amiga, and Atari versions) pcmain.c (files for MSDOS, OS/2, NT, and Atari versions) pcsys.c pcunix.c (file for MSDOS, OS/2, and Atari versions) NetHack.cnf pctty.c (files for UNIX and Be versions) ioctl.c unixtty.c (file for NT version) 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) termcap (lex/yacc output for special level and dungeon compilers) dgn_comp.h dgn_lex.c dgn_yacc.c lev_comp.h lev_lex.c lev_yacc.c sys/share/sounds: (files for Amiga and Macintosh versions) README bell.uu bugle.uu erthdrum.uu firehorn.uu frsthorn.uu lethdrum.uu mgcflute.uu mgcharp.uu toolhorn.uu wdnflute.uu wdnharp.uu 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 unixres.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) snd86unx.shr sys/vms: (files for VMS version) Install.vms Makefile.dat Makefile.doc Makefile.src Makefile.top Makefile.utl install.com lev_lex.h nethack.com oldcrtl.c spec_lev.com vmsbuild.com vmsfiles.c vmsmail.c vmsmain.c vmsmisc.c vmstty.c vmsunix.c sys/wince: (files for Windows CE and PocketPC) Install.ce bootstrp.mak celib.c cesetup.bat cesound.c defaults.nh keypad.uu menubar.uu mhaskyn.c mhaskyn.h mhcmd.c mhcmd.h mhcolor.c mhcolor.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 mhstatus.c mhstatus.h mhtext.c mhtext.h mhtxtbuf.c mhtxtbuf.h mksetup.bat mswproc.c newres.h resource.h slashem.inf slashem.ini winhack.c winhack.rc winhcksp.rc winMS.h winmain.c sys/winnt: (files for Windows 9x, NT and Windows2000 version) Install.gcc Install.nt Makefile.bcc Makefile.cygwin Makefile.gcc Makefile.msc Makefile.nt console.rc defaults.nh mapimail.c nethack.def nh340key.c nhdefkey.c nhico.uu nhraykey.c nhsetup.bat ntsound.c nttty.c porthelp seico.uu setup.bat slashem.rc win32api.h winnt.c winnt.cnf util: (files for all versions) dgn_main.c dlb_main.c lev_main.c makedefs.c panic.c recover.c (lex/yacc input for special level and dungeon compilers) dgn_comp.l dgn_comp.y lev_comp.l lev_comp.y win/Qt: (files for the Qt widget library - X11, Windows, Mac OS X, or Qtopia) Info.plist Install.Qt knethack.lnk knh-mini.xpm knh.xpm kse-mini.xpm kse.xpm kslashem.lnk nhicns.uu nhsplash.xpm qt_clust.cpp qt_win.cpp qttableview.cpp tileedit.cpp tileedit.h qpe-nethack.control win/X11: (files for X versions) Install.X11 SlashEM.ad Window.c dialogs.c ibm.bdf nh10.bdf nh32icon nh56icon nh72icon nh_icon.xpm pet_mark.xbm rip.xpm slashem.rc tile2x11.c winX.c winmap.c winmenu.c winmesg.c winmisc.c winstat.c wintext.c winval.c 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/gl: (files for SDL/GL versions) Install.GL font14.txt font20.txt font22.txt font8.txt gl_conf.c gl_emul.c gl_font.c gl_hardw.c gl_image.c gl_main.c gl_map.c gl_menu.c gl_opt.c gl_rendu.c gl_role.c gl_softw.c gl_stat.c gl_text.c gl_tile.c gl_unit.c gl_win.c logo.txt rip.txt win/gnome: (files for GNOME versions) README gn_xpms.h gnaskstr.c gnaskstr.h gnbind.c gnbind.h gnglyph.c gnglyph.h gnmain.c gnmain.h gnmap.c gnmap.h gnmenu.c gnmenu.h gnmesg.c gnmesg.h gnomeprv.h gnopts.c gnopts.h gnplayer.c gnplayer.h gnsignal.c gnsignal.h gnstatus.c gnstatus.h gntext.c gntext.h gnworn.c gnworn.h gnyesno.c gnyesno.h mapbg.xpm win/proxy: (files for proxy version) Install.pxy Makefile.unx Makefile.w32 callback.c compxdr.c dlbh.c getopt.c glyphmap.c mapid.c md5.c nhext.c nhextio.c nhextnb.c nhextxdr.c nhxdr.c proxycb.c proxysvc.c prxychar.c prxyconn.c prxymap.c prxytile.c riputil.c test_com.c test_com.h test_ext.c test_io.c test_xdr.c winproxy.c ext_protocol.html win/gtk: GTKRC GTKRC.w32 Install.GTK Makefile.unx Makefile.w32 cc-gtk.c gtk.c gtkconcb.c gtkconcb.h gtkconnect.c gtkconnect.h gtkext.c gtkextcmd.c gtkgetlin.c gtkhack.c gtkhackrc.c gtkint.c gtkmap.c gtkmenu.c gtkmessage.c gtkmisc.c gtkprefs.c gtkprogress.h gtkprogress.c gtkstatus.c gtksupport.c gtksupport.h gtktile.c gtkyn.c panic.c xshmmap.c gtkconnect.glade gtkconnect.gladep win/share: (files for versions using optional tiles) bigtile.c extras.txt gifread.c magtile.c mapmerge.c mon32al2.txt mon32alg.txt mon32aw.txt mon32mi.txt mon32se.txt mon3dmi.txt monsters.map monsters.txt obj32al2.txt obj32alg.txt obj32mi.txt obj32se.txt objects.map objects.txt oth-2kmi.txt oth32al2.txt oth32alg.txt oth32fl.txt oth32mi.txt oth32se.txt oth3dmi.txt oth3dse.txt other.map other.txt palette.txt ppmwrite.c thintile.c tile.doc tile2bmp.c tile2png.c tile_t.h tilemap.c tiletext.c txtbg.c txtfilt.c txtmerge.c xpmread.c zap.txt win/share/scripts: import-alg.sh import-mi.sh mon32mix.txt obj32mix.txt 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 magtile.dsp 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.c mhsplash.h mhstatus.c mhstatus.h mhtext.c mhtext.h mnselcnt.uu mnsel.uu mnunsel.uu mswproc.c nethack.dsw nethackw.dsp nhprocs.c nhwin32.h nhwin32.rc petmark.uu recover.dsp resource.h rip.uu splash.uu tile2bmp.dsp tilemap.dsp tiles128.dsp tiles128.mak tiles.dsp tiles.mak txtbg.dsp txtmerge.dsp uudecode.dsp win32msg.c winMS.h winhack.c winhack.rc winmain.c This is a list of files produced by auxiliary programs. They can all be regenerated from the files in the distribution. dat: (files generated by makedefs at playground creation time) data dungeon.pdf options oracles quest.dat rumors (file generated by dgn_comp at playground creation time) dungeon (files generated by lev_comp at playground creation time) Arc-fila.lev Arc-filb.lev Arc-goal.lev Arc-loca.lev Arc-strt.lev Bar-fila.lev Bar-filb.lev Bar-goal.lev Bar-loca.lev Bar-strt.lev Cav-fila.lev Cav-filb.lev Cav-goal.lev Cav-loca.lev Cav-strt.lev Hea-fila.lev Hea-filb.lev Hea-goal.lev Hea-loca.lev Hea-strt.lev Kni-fila.lev Kni-filb.lev Kni-goal.lev Kni-loca.lev Kni-strt.lev Mon-fila.lev Mon-filb.lev Mon-goal.lev Mon-loca.lev Mon-strt.lev Pri-fila.lev Pri-filb.lev Pri-goal.lev Pri-loca.lev Pri-strt.lev Ran-fila.lev Ran-filb.lev Ran-goal.lev Ran-loca.lev Ran-strt.lev Rog-fila.lev Rog-filb.lev Rog-goal.lev Rog-loca.lev Rog-strt.lev Sam-fila.lev Sam-filb.lev Sam-goal.lev Sam-loca.lev Sam-strt.lev Tou-fila.lev Tou-filb.lev Tou-goal.lev Tou-loca.lev Tou-strt.lev Val-fila.lev Val-filb.lev Val-goal.lev Val-loca.lev Val-strt.lev Wiz-fila.lev Wiz-filb.lev Wiz-goal.lev Wiz-loca.lev Wiz-strt.lev air.lev asmodeus.lev astral.lev baalz.lev bigrm-1.lev bigrm-2.lev bigrm-3.lev bigrm-4.lev bigrm-5.lev castle.lev earth.lev fakewiz1.lev fakewiz2.lev fire.lev juiblex.lev knox.lev medusa-1.lev medusa-2.lev minefill.lev minend-1.lev minend-2.lev minetn-1.lev minetn-2.lev oracle.lev orcus.lev sanctum.lev soko1-1.lev soko1-2.lev soko2-1.lev soko2-2.lev soko3-1.lev soko3-2.lev soko4-1.lev soko4-2.lev tower1.lev tower2.lev tower3.lev valley.lev water.lev wizard1.lev wizard2.lev wizard3.lev (tile files optionally generated for X ports at playground creation time) pet_mark.xbm rip.xpm x11tiles (files generated for Qt interface on Mac OS X) nethack.icns Info.plist include: (files generated by makedefs at compile time) date.h onames.h pm.h vis_tab.h src: (files generated by makedefs at compile time) monstr.c vis_tab.c (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 of the files listed as being required for the playground must still have been built by your compiler, but the DLB code will roll them up into another file (or files). slashem-0.0.7E7F3/include/0000775000076400007640000000000010545462317013277 5ustar alialislashem-0.0.7E7F3/include/global.h0000664000076400007640000002573310545462317014722 0ustar aliali/* SCCS Id: @(#)global.h 3.4 2003/08/31 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #ifndef GLOBAL_H #define GLOBAL_H #include /* #define ALPHA */ /* if an alpha-test copy */ /* #define BETA */ /* if an alpha- or beta-test copy */ /* #define OBJ_SANITY *//* Object sanity checks for all players */ /* * Files expected to exist in the playground directory if file areas are not * enabled and in the named areas otherwise. * [WAC] - put a NH_ prefix on all the names to prevent conflicts */ #define NH_RECORD "record" /* a file containing list of topscorers */ #define NH_RECORD_AREA FILE_AREA_VAR #define NH_HELP "help" /* a file containing command descriptions */ #define NH_HELP_AREA FILE_AREA_SHARE #define NH_SHELP "hh" /* abbreviated form of the same */ #define NH_SHELP_AREA FILE_AREA_SHARE #define NH_DEBUGHELP "wizhelp" /* a file containing debug mode cmds */ #define NH_DEBUGHELP_AREA FILE_AREA_SHARE #define NH_RUMORFILE "rumors" /* a file with fortune cookies */ #define NH_RUMORAREA FILE_AREA_SHARE #define NH_ORACLEFILE "oracles" /* a file with oracular information */ #define NH_ORACLEAREA FILE_AREA_SHARE #define NH_DATAFILE "data" /* a file giving the meaning of symbols used */ #define NH_DATAAREA FILE_AREA_SHARE #define NH_CMDHELPFILE "cmdhelp" /* file telling what commands do */ #define NH_CMDHELPAREA FILE_AREA_SHARE #define NH_HISTORY "history" /* a file giving nethack's history */ #define NH_HISTORY_AREA FILE_AREA_SHARE #define NH_LICENSE "license" /* file with license information */ #define NH_LICENSE_AREA FILE_AREA_DOC #define NH_OPTIONFILE "opthelp" /* a file explaining runtime options */ #define NH_OPTIONAREA FILE_AREA_SHARE #define NH_OPTIONS_USED "options" /* compile-time options, for #version */ #define NH_OPTIONS_USED_AREA FILE_AREA_SHARE #ifdef SHORT_FILENAMES # define NH_GUIDEBOOK "guideboo.txt" /* Nethack Guidebook*/ #else #define NH_GUIDEBOOK "Guidebook.txt" /* Nethack Guidebook*/ #endif #define NH_GUIDEBOOK_AREA FILE_AREA_DOC #define LEV_EXT ".lev" /* extension for special level files */ /* Assorted definitions that may depend on selections in config.h. */ /* * for DUMB preprocessor and compiler, e.g., cpp and pcc supplied * with Microport SysV/AT, which have small symbol tables; * DUMB if needed is defined in CFLAGS */ #ifdef DUMB #ifdef BITFIELDS #undef BITFIELDS #endif #ifndef STUPID #define STUPID #endif #endif /* DUMB */ /* * type xchar: small integers in the range 0 - 127, usually coordinates * although they are nonnegative they must not be declared unsigned * since otherwise comparisons with signed quantities are done incorrectly */ typedef schar xchar; #ifndef SKIP_BOOLEAN typedef xchar boolean; /* 0 or 1 */ #endif #ifndef TRUE /* defined in some systems' native include files */ #define TRUE ((boolean)1) #define FALSE ((boolean)0) #endif #ifndef STRNCMPI # if !defined(__SASC_60) && !defined(__MINGW32__) /* SAS/C already shifts to stricmp */ # define strcmpi(a,b) strncmpi((a),(b),-1) # endif #endif /* comment out to test effects of each #define -- these will probably * disappear eventually */ #ifdef INTERNAL_COMP # define RLECOMP /* run-length compression of levl array - JLee */ # define ZEROCOMP /* zero-run compression of everything - Olaf Seibert */ #endif /* #define SPECIALIZATION */ /* do "specialized" version of new topology */ #ifdef BITFIELDS #define Bitfield(x,n) unsigned x:n #else #define Bitfield(x,n) uchar x #endif #ifdef UNWIDENED_PROTOTYPES # define CHAR_P char # define SCHAR_P schar # define UCHAR_P uchar # define XCHAR_P xchar # define SHORT_P short #ifndef SKIP_BOOLEAN # define BOOLEAN_P boolean #endif # define ALIGNTYP_P aligntyp #else # ifdef WIDENED_PROTOTYPES # define CHAR_P int # define SCHAR_P int # define UCHAR_P int # define XCHAR_P int # define SHORT_P int # define BOOLEAN_P int # define ALIGNTYP_P int # endif #endif #if defined(ULTRIX_PROTO) && !defined(__STDC__) /* The ultrix 2.0 and 2.1 compilers (on Ultrix 4.0 and 4.2 respectively) can't * handle "struct obj *" constructs in prototypes. Their bugs are different, * but both seem to work if we put "void*" in the prototype instead. This * gives us minimal prototype checking but avoids the compiler bugs. * * OBJ_P and MONST_P should _only_ be used for declaring function pointers. */ #define OBJ_P void* #define MONST_P void* #else #define OBJ_P struct obj* #define MONST_P struct monst* #endif #define SIZE(x) (int)(sizeof(x) / sizeof(x[0])) /* A limit for some NetHack int variables. It need not, and for comparable * scoring should not, depend on the actual limit on integers for a * particular machine, although it is set to the minimum required maximum * signed integer for C (2^15 -1). */ #define LARGEST_INT 32767 #ifdef REDO #define Getchar pgetchar #endif #include "coord.h" /* * Automatic inclusions for the subsidiary files. * Please don't change the order. It does matter. */ #ifdef VMS #include "vmsconf.h" #endif #ifdef UNIX #include "unixconf.h" #endif #ifdef OS2 #include "os2conf.h" #endif #ifdef MSDOS #include "pcconf.h" #endif #ifdef TOS #include "tosconf.h" #endif #ifdef AMIGA #include "amiconf.h" #endif #ifdef MAC #include "macconf.h" #endif #ifdef __BEOS__ #include "beconf.h" #endif #ifdef WIN32 #ifdef WIN_CE #include "wceconf.h" #else #include "ntconf.h" #endif #endif #ifndef FILE_AREAS #define fopen_datafile_area(area, filename, mode, use_spfx) \ fopen_datafile(filename, mode, use_spfx) #define lock_file_area(area, filename, prefix, retryct) \ lock_file(filename, prefix, retryct) #define unlock_file_area(area, filename) unlock_file(filename) #define dlb_fopen_area(area, name, mode) dlb_fopen(name, mode) /* * ALI * * By defining these, functions can pass them around even though they're * not actually used. This can make the code easier to read at the cost * of some efficiency. Given the high overhead of dealing with files anyway, * this is often a good trade-off. */ #define FILE_AREA_VAR NULL #define FILE_AREA_SAVE NULL #define FILE_AREA_LEVL NULL #define FILE_AREA_BONES NULL #define FILE_AREA_SHARE NULL #define FILE_AREA_UNSHARE NULL #endif /* Displayable name of this port; don't redefine if defined in *conf.h */ #ifndef PORT_ID # ifdef AMIGA # define PORT_ID "Amiga" # endif # ifdef MAC # define PORT_ID "Mac" # if 0 # ifdef MAC_MPW_PPC # define PORT_SUB_ID "PPC" # else # ifdef MAC_MPW_68K # define PORT_SUB_ID "68K" # endif # endif # endif # endif # ifdef MSDOS # ifdef PC9800 # define PORT_ID "PC-9800" # else # define PORT_ID "PC" # endif # ifdef DJGPP # define PORT_SUB_ID "djgpp" # else # ifdef OVERLAY # define PORT_SUB_ID "overlaid" # else # define PORT_SUB_ID "non-overlaid" # endif # endif # endif # ifdef OS2 # define PORT_ID "OS/2" # endif # ifdef TOS # define PORT_ID "ST" # endif # ifdef UNIX # define PORT_ID "Unix" # endif # ifdef VMS # define PORT_ID "VMS" # endif # ifdef WIN32 # define PORT_ID "Windows" # ifndef PORT_SUB_ID # if defined(MSWIN_GRAPHICS) || defined(GTK_GRAPHICS) # define PORT_SUB_ID "graphical" # else # define PORT_SUB_ID "tty" # endif # endif # endif #endif #if defined(MICRO) #if !defined(AMIGA) && !defined(TOS) && !defined(OS2_HPFS) #define SHORT_FILENAMES /* filenames are 8.3 */ #endif #endif #ifdef VMS /* vms_exit() (sys/vms/vmsmisc.c) expects the non-VMS EXIT_xxx values below. * these definitions allow all systems to be treated uniformly, provided * main() routines do not terminate with return(), whose value is not * so massaged. */ # ifdef EXIT_SUCCESS # undef EXIT_SUCCESS # endif # ifdef EXIT_FAILURE # undef EXIT_FAILURE # endif #endif #ifndef EXIT_SUCCESS # define EXIT_SUCCESS 0 #endif #ifndef EXIT_FAILURE # 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 #endif #if defined(AMII_GRAPHICS) || defined(GEM_GRAPHICS) || defined(GTK_GRAPHICS) # ifndef USE_TILES # define USE_TILES # endif #endif #if defined(GL_GRAPHICS) || defined(SDL_GRAPHICS) # ifndef USE_TILES # define USE_TILES # endif #endif #define Sprintf (void) sprintf #define Strcat (void) strcat #define Strcpy (void) strcpy #ifdef NEED_VARARGS #define Vprintf (void) vprintf #define Vfprintf (void) vfprintf #define Vsprintf (void) vsprintf #endif /* primitive memory leak debugging; see alloc.c */ #ifdef MONITOR_HEAP extern long *FDECL(nhalloc, (unsigned int,const char *,int)); extern void FDECL(nhfree, (genericptr_t,const char *,int)); #ifdef INTERNAL_MALLOC extern void FDECL(monitor_heap_push, (const char *, int)); extern unsigned long FDECL(monitor_heap_pop, (const char *, int, unsigned long)); extern void FDECL(monitor_heap_set_subid, (const char *, int )); extern size_t NDECL(monitor_heap_getmem); extern boolean FDECL(monitor_heap_trace, (boolean flag)); extern void NDECL(monitor_heap_mark); #endif # ifndef __FILE__ # define __FILE__ "" # endif # ifndef __LINE__ # define __LINE__ 0 # endif # define alloc(a) nhalloc(a,__FILE__,(int)__LINE__) # define free(a) nhfree(a,__FILE__,(int)__LINE__) #else /* !MONITOR_HEAP */ extern long *FDECL(alloc, (unsigned int)); /* alloc.c */ #endif /* Used for consistency checks of various data files; declare it here so that utility programs which include config.h but not hack.h can see it. */ struct version_info { unsigned long incarnation; /* actual version number */ unsigned long feature_set; /* bitmask of config settings */ unsigned long entity_count; /* # of monsters and objects */ unsigned long struct_sizes; /* size of key structs */ }; /* * Configurable internal parameters. * * Please be very careful if you are going to change one of these. Any * changes in these parameters, unless properly done, can render the * executable inoperative. */ /* size of terminal screen is (at least) (ROWNO+3) by COLNO */ #define COLNO 80 #define ROWNO 21 #define MAXNROFROOMS 40 /* max number of rooms per level */ #define MAX_SUBROOMS 24 /* max # of subrooms in a given room */ #define DOORMAX 120 /* max number of doors per level */ #define BUFSZ 256 /* for getlin buffers */ #define QBUFSZ 128 /* for building question text */ #define TBUFSZ 300 /* toplines[] buffer max msg: 3 81char names */ /* plus longest prefix plus a few extra words */ #define PL_NSIZ 32 /* name of player, ghost, shopkeeper */ #define PL_CSIZ 32 /* sizeof pl_character */ #define PL_FSIZ 32 /* fruit name */ #define PL_PSIZ 63 /* player-given names for pets, other * monsters, objects */ #define MAXDUNGEON 32 /* current maximum number of dungeons */ #define MAXLEVEL 50 /* max number of levels in one dungeon */ #define MAXSTAIRS 1 /* max # of special stairways in a dungeon */ #define ALIGNWEIGHT 10 /* generation weight of alignment */ #define MAXULEV 30 /* max character experience level */ #define MAXMONNO 120 /* extinct monst after this number created */ #define MHPMAX 500 /* maximum monster hp */ #endif /* GLOBAL_H */ slashem-0.0.7E7F3/include/vmsconf.h0000664000076400007640000002011410545462317015121 0ustar aliali/* SCCS Id: @(#)vmsconf.h 3.4 2003/05/19 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #ifdef VMS #ifndef VMSCONF_H #define VMSCONF_H /* * Edit these to choose values appropriate for your site. * WIZARD is the username allowed to use the debug option of nethack; no harm * is done by leaving it as a username that doesn't exist at your site. * HACKDIR can be overridden at run-time with the logical name HACKDIR, as in * $ define hackdir disk$users:[games.nethack] * Trailing NULs are present in the default values in order to make some * extra room for patching longer values into an existing executable. */ #define Local_WIZARD "NHWIZARD\0\0\0\0" #define Local_HACKDIR "DISK$USERS:[GAMES.NETHACK.3_4_X.PLAY]\0\0\0\0\0\0\0\0" /* * This section cleans up the stuff done in config.h so that it * shouldn't need to be modified. It's conservative so that if * config.h is actually edited, the changes won't impact us. */ #ifdef UNIX # undef UNIX #endif #ifdef HACKDIR # undef HACKDIR #endif #ifdef WIZARD # undef WIZARD #endif #ifdef WIZARD_NAME # undef WIZARD_NAME #endif #define HACKDIR Local_HACKDIR #ifndef KR1ED # define WIZARD Local_WIZARD # define WIZARD_NAME WIZARD #else # define WIZARD 1 # define WIZARD_NAME Local_WIZARD #endif /* filenames require punctuation to avoid redirection via logical names */ #undef RECORD #define RECORD "record;1" /* scoreboard file (retains high scores) */ #undef LOGFILE #define LOGFILE "logfile;0" /* optional file (records all games) */ #define HLOCK "perm;1" /* an empty file used for locking purposes */ /* want compression--for level & save files--performed within NetHack itself */ #ifdef COMPRESS # undef COMPRESS #endif #ifndef INTERNAL_COMP # define INTERNAL_COMP #endif /* * If nethack.exe will be installed with privilege so that the playground * won't need to be left unprotected, define SECURE to suppress a couple * of file protection fixups (protection of bones files and ownership of * save files). */ /* #define SECURE */ /* * Put the readonly data files into a single container rather than into * separate files in the playground directory. */ #define DLB /* use data librarian code */ /* * You may define TEXTCOLOR if your system has any terminals that recognize * ANSI color sequences of the form ``[#;#m'', where the first # is * a number between 40 and 47 represented background color, and the second * # is a number between 30 and 37 representing the foreground color. * GIGI terminals and DECterm windows on color VAXstations support these * color escape sequences, as do some 3rd party terminals and many micro * computers. */ /* #define TEXTCOLOR */ /* * If you define USE_QIO_INPUT, then you'll get raw characters from the * keyboard, not unlike those of the unix version of Nethack. This will * allow you to use the Escape key in normal gameplay, and the appropriate * control characters in Wizard mode. It will work most like the unix version. * It will also avoid "" being displayed when ^Y is pressed. * * Otherwise, the VMS SMG calls will be used. These calls block use of * the escape key, as well as certain control keys, so gameplay is not * the same, although the differences are fairly negligible. You must * then use a VTxxx function key or two s to give an ESC response. */ #define USE_QIO_INPUT /* use SYS$QIOW instead of SMG$READ_KEYSTROKE */ /* * Allow the user to decide whether to pause via timer or excess screen * output for various display effects like explosions and moving objects. */ #define TIMED_DELAY /* enable the `timed_delay' run-time option */ /* * If you define MAIL, then NetHack will capture incoming broadcast * messages such as "New mail from so-and-so" and "Print job completed," * and then deliver them to the player. For mail and phone broadcasts * a scroll of mail will be created, which when read will cause NetHack * to prompt the player for a command to spawn in order to respond. The * latter capability will not be available if SHELL is disabled below. * If you undefine MAIL, broadcasts will go straight to the terminal, * resulting in disruption of the screen display; use to redraw. */ #define MAIL /* enable broadcast trapping */ /* * SHELL enables the player to 'escape' into a spawned subprocess via * the '!' command. Logout or attach back to the parent to resume play. * If the player attaches back to NetHack, then a subsequent escape will * re-attach to the existing subprocess. Any such subprocess left over * at game exit will be deleted by an exit handler. * SUSPEND enables someone running NetHack in a subprocess to reconnect * to the parent process with the command; this is not very * close to Unix job control, but it's better than nothing. */ #define SHELL /* do not delete the '!' command */ #define SUSPEND /* don't delete the ^Z command, such as it is */ #define RANDOM /* use sys/share/random.c instead of vaxcrtl rand */ #define FCMASK 0660 /* file creation mask */ /* * The remainder of the file should not need to be changed. */ /* data librarian defs */ #ifdef DLB # define DLBFILE "nh-data.dlb" /* * Since we can do without case insensitive filename comparison, * avoid enabling it because that requires compiling and linking * src/hacklib into util/dlb_main. */ /* # define FILENAME_CMP strcmpi */ /* case insensitive */ #endif #if defined(VAXC) && !defined(ANCIENT_VAXC) # ifdef volatile # undef volatile # endif # ifdef const # undef const # endif #endif #ifdef __DECC # define STRICT_REF_DEF /* used in lev_main.c */ #endif #ifdef STRICT_REF_DEF # define DEFINE_OSPEED #endif #ifndef alloca /* bison generated foo_yacc.c might try to use alloca() */ # ifdef __GNUC__ # define alloca __builtin_alloca # else # define ALLOCA_HACK /* used in util/panic.c */ # endif #endif #ifdef _DECC_V4_SOURCE /* excludes some necessary typedefs when _DECC_V4_SOURCE is defined */ #include # ifndef __PID_T # define __PID_T typedef __pid_t pid_t; # endif # ifndef __UID_T # define __UID_T typedef __uid_t uid_t; # endif # 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 */ #include #if 0 /* is missing for old gcc versions; skip it to save time */ #include #else /* values needed from missing include file */ # define O_RDONLY 0 # define O_WRONLY 1 # define O_RDWR 2 # define O_CREAT 0x200 # define O_TRUNC 0x400 #endif #ifndef REDO # define Getchar nhgetch #endif #define tgetch vms_getchar #include "system.h" #define index strchr #define rindex strrchr /* Use the high quality random number routines. */ #if defined(RANDOM) #define Rand() random() /* VMS V7 adds these entry points to DECC$SHR; stick with the nethack-supplied code to avoid having to deal with version-specific conditionalized builds */ #define random nh_random #define srandom nh_srandom #define initstate nh_initstate #define setstate nh_setstate #else #define Rand() rand() #endif #ifndef __GNUC__ # ifndef bcopy #define bcopy(s,d,n) memcpy((d),(s),(n)) /* vaxcrtl */ # endif #endif #define abort() vms_abort() /* vmsmisc.c */ #define creat(f,m) vms_creat(f,m) /* vmsfiles.c */ #define exit(sts) vms_exit(sts) /* vmsmisc.c */ #define getuid() vms_getuid() /* vmsunix.c */ #define link(f1,f2) vms_link(f1,f2) /* vmsfiles.c */ #define open(f,k,m) vms_open(f,k,m) /* vmsfiles.c */ /* #define unlink(f0) vms_unlink(f0) /* vmsfiles.c */ #ifdef VERYOLD_VMS #define unlink(f0) delete(f0) /* vaxcrtl */ #else #define unlink(f0) remove(f0) /* vaxcrtl, decc$shr */ #endif #define C$$TRANSLATE(n) c__translate(n) /* vmsfiles.c */ /* VMS global names are case insensitive... */ #define An vms_an #define The vms_the #define Shk_Your vms_shk_your /* avoid global symbol in Alpha/VMS V1.5 STARLET library (link trouble) */ #define ospeed vms_ospeed /* used in several files which don't #include "extern.h" */ extern void FDECL(vms_exit, (int)); extern int FDECL(vms_open, (const char *,int,unsigned)); #endif /* VMSCONF_H */ #endif /* VMS */ slashem-0.0.7E7F3/include/coord.h0000664000076400007640000000042010545462317014552 0ustar aliali/* 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; #endif /* COORD_H */ slashem-0.0.7E7F3/include/edog.h0000664000076400007640000000174010545462317014370 0ustar aliali/* 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. */ #ifndef EDOG_H #define EDOG_H /* various types of food, the lower, the better liked. */ #define DOGFOOD 0 #define CADAVER 1 #define ACCFOOD 2 #define MANFOOD 3 #define APPORT 4 #define POISON 5 #define UNDEF 6 #define TABU 7 struct edog { long droptime; /* moment dog dropped object */ unsigned dropdist; /* dist of drpped obj from @ */ int apport; /* amount of training */ long whistletime; /* last time he whistled */ long hungrytime; /* will get hungry at this time */ coord ogoal; /* previous goal location */ int abuse; /* track abuses to this pet */ int revivals; /* count pet deaths */ int mhpmax_penalty; /* while starving, points reduced */ Bitfield(killed_by_u, 1); /* you attempted to kill him */ }; #define EDOG(mon) ((struct edog *)&(mon)->mextra[0]) #endif /* EDOG_H */ slashem-0.0.7E7F3/include/color.h0000644000076400007640000000377210545462317014575 0ustar aliali/* 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. */ #ifndef COLOR_H #define COLOR_H /* * The color scheme used is tailored for an IBM PC. It consists of the * standard 8 colors, folowed by their bright counterparts. There are * exceptions, these are listed below. Bright black doesn't mean very * much, so it is used as the "default" foreground color of the screen. */ #ifndef VIDEOSHADES # define CLR_BLACK 0 #else # define CLR_BLACK 8 #endif #define CLR_RED 1 #define CLR_GREEN 2 #define CLR_BROWN 3 /* on IBM, low-intensity yellow is brown */ #define CLR_BLUE 4 #define CLR_MAGENTA 5 #define CLR_CYAN 6 #define CLR_GRAY 7 /* low-intensity white */ #ifndef VIDEOSHADES # define NO_COLOR 8 #else # define NO_COLOR 0 #endif #define CLR_ORANGE 9 #define CLR_BRIGHT_GREEN 10 #define CLR_YELLOW 11 #define CLR_BRIGHT_BLUE 12 #define CLR_BRIGHT_MAGENTA 13 #define CLR_BRIGHT_CYAN 14 #define CLR_WHITE 15 #define CLR_MAX 16 /* The "half-way" point for tty based color systems. This is used in */ /* the tty color setup code. (IMHO, it should be removed - dean). */ #define BRIGHT 8 /* these can be configured */ #define HI_OBJ CLR_MAGENTA #define HI_METAL CLR_CYAN #define HI_COPPER CLR_YELLOW #define HI_SILVER CLR_GRAY #define HI_GOLD CLR_YELLOW #define HI_LEATHER CLR_BROWN #define HI_CLOTH CLR_BROWN #define HI_ORGANIC CLR_BROWN #define HI_WOOD CLR_BROWN #define HI_PAPER CLR_WHITE #define HI_GLASS CLR_BRIGHT_CYAN #define HI_MINERAL CLR_GRAY #define DRAGON_SILVER CLR_BRIGHT_CYAN #define HI_ZAP CLR_BRIGHT_BLUE #ifdef MENU_COLOR struct menucoloring { #ifdef USE_REGEX_MATCH # ifdef GNU_REGEX struct re_pattern_buffer match; # else # ifdef POSIX_REGEX regex_t match; # endif # endif #else char *match; #endif int color, attr; struct menucoloring *next; }; #endif #if defined(VIDEOSHADES) && !defined(MSDOS) extern char ttycolors[CLR_MAX]; #endif #endif /* COLOR_H */ slashem-0.0.7E7F3/include/macpopup.h0000664000076400007640000000124510545462317015276 0ustar aliali/* SCCS Id: @(#)macpopup.h 3.4 1999/10/25 */ /* Copyright (c) Nethack Develpment Team, 1999. */ /* NetHack may be freely redistributed. See license for details. */ #ifndef MACPOPUP_H # define MACPOPUP_H /* ### mmodal.c ### */ extern void FlashButton(DialogRef, short); extern char queued_resp(char *resp); 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 */ slashem-0.0.7E7F3/include/winGnome.h0000664000076400007640000000063710545462317015241 0ustar aliali/* 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. */ #ifndef WINGNOME_H #define WINGNOME_H #define E extern E struct window_procs Gnome_procs; #undef E #define NHW_WORN 6 extern winid WIN_WORN; #endif /* WINGNOME_H */ slashem-0.0.7E7F3/include/bitmfile.h0000664000076400007640000000147710545462317015254 0ustar aliali/****************************\ * Bitmap mit Farbtabelle als * * Graphik-Datei speichern * * Autor: Gabriel Schmidt * * (c} 1992 by MAXON-Computer * * -> Header-Datei * \****************************/ #ifndef H_TO_FILE #define H_TO_FILE /* #include */ #define UWORD unsigned short #define ULONG unsigned long #define UBYTE unsigned char #define XIMG_MAGIC 0x58494D47 typedef enum { IMG, XIMG } FILE_TYP; const char *get_file_ext(FILE_TYP typ); struct RGB { UWORD r, g, b; }; int bitmap_to_file(FILE_TYP typ, int ww, int wh, unsigned int pwx, unsigned int pwy, unsigned int planes, unsigned int colors, const char *filename, void (*get_color) (unsigned int colind, struct RGB *rgb) , void (*get_pixel) (int x, int y, unsigned int *colind) ) ; #endif slashem-0.0.7E7F3/include/mail.h0000664000076400007640000000125110545462317014371 0ustar aliali/* 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() */ #ifndef MAIL_H #define MAIL_H #define MSG_OTHER 0 /* catch-all; none of the below... */ #define MSG_MAIL 1 /* unimportant, uninteresting mail message */ #define MSG_CALL 2 /* annoying phone/talk/chat-type interruption */ struct mail_info { int message_typ; /* MSG_foo value */ const char *display_txt; /* text for daemon to verbalize */ const char *object_nam; /* text to tag object with */ const char *response_cmd; /* command to eventually execute */ }; #endif /* MAIL_H */ slashem-0.0.7E7F3/include/obj.h0000664000076400007640000003572310545462317014234 0ustar aliali/* 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. */ #ifndef OBJ_H #define OBJ_H /* #define obj obj_nh */ /* uncomment for SCO UNIX, which has a conflicting * typedef for "obj" in */ union vptrs { struct obj *v_nexthere; /* floor location lists */ struct obj *v_ocontainer; /* point back to container */ struct monst *v_ocarry; /* point back to carrying monst */ }; struct obj { struct obj *nobj; union vptrs v; #define nexthere v.v_nexthere #define ocontainer v.v_ocontainer #define ocarry v.v_ocarry struct obj *cobj; /* contents list for containers */ unsigned o_id; xchar ox,oy; short otyp; /* object class number */ #ifdef UNPOLYPILE short oldtyp; /* WAC for unpolymorph */ #endif unsigned owt; long quan; /* number of items */ schar spe; /* quality of weapon, armor or ring (+ or -) number of charges for wand ( >= -1 ) marks your eggs, spinach tins royal coffers for a court ( == 2) tells which fruit a fruit is special for uball and amulet historic and gender for statues */ #define STATUE_HISTORIC 0x01 #define STATUE_MALE 0x02 #define STATUE_FEMALE 0x04 char oclass; /* object class */ char invlet; /* designation in inventory */ char oartifact; /* artifact array index */ schar altmode; /* alternate modes - eg. SMG, double Lightsaber */ /* WP_MODEs are in decreasing speed */ #define WP_MODE_AUTO 0 /* Max firing speed */ #define WP_MODE_BURST 1 /* 1/3 of max rate */ #define WP_MODE_SINGLE 2 /* Single shot */ xchar where; /* where the object thinks it is */ #define OBJ_FREE 0 /* object not attached to anything */ #define OBJ_FLOOR 1 /* object on floor */ #define OBJ_CONTAINED 2 /* object in a container */ #define OBJ_INVENT 3 /* object in the hero's inventory */ #define OBJ_MINVENT 4 /* object in a monster inventory */ #define OBJ_MIGRATING 5 /* object sent off to another level */ #define OBJ_BURIED 6 /* object buried */ #define OBJ_ONBILL 7 /* object on shk bill */ #define NOBJ_STATES 8 xchar timed; /* # of fuses (timers) attached to this obj */ Bitfield(cursed,1); Bitfield(blessed,1); Bitfield(unpaid,1); /* on some bill */ Bitfield(no_charge,1); /* if shk shouldn't charge for this */ Bitfield(known,1); /* exact nature known */ Bitfield(dknown,1); /* color or text known */ Bitfield(bknown,1); /* blessing or curse known */ Bitfield(rknown,1); /* rustproof or not known */ Bitfield(oeroded,2); /* rusted/burnt weapon/armor */ Bitfield(oeroded2,2); /* corroded/rotted weapon/armor */ #define greatest_erosion(otmp) (int)((otmp)->oeroded > (otmp)->oeroded2 ? (otmp)->oeroded : (otmp)->oeroded2) #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 */ #define oarmed olocked #define odrained olocked /* drained corpse */ Bitfield(obroken,1); /* lock has been broken */ Bitfield(otrapped,1); /* container is trapped */ /* or accidental tripped rolling boulder trap */ #define opoisoned otrapped /* object (weapon) is coated with poison */ Bitfield(recharged,3); /* number of times it's been recharged */ Bitfield(lamplit,1); /* a light-source -- can be lit */ #ifdef INVISIBLE_OBJECTS Bitfield(oinvis,1); /* invisible */ #endif Bitfield(greased,1); /* covered with grease */ Bitfield(oattached,2); /* obj struct has special attachment */ #define OATTACHED_NOTHING 0 #define OATTACHED_MONST 1 /* monst struct in oextra */ #define OATTACHED_M_ID 2 /* monst id in oextra */ #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() */ Bitfield(yours,1); /* obj is yours (eg. thrown by you) */ Bitfield(was_thrown,1); /* thrown by the hero since last picked up */ /* ? free bits */ int corpsenm; /* type of corpse is mons[corpsenm] */ #define leashmon corpsenm /* gets m_id of attached pet */ #define spestudied corpsenm /* # of times a spellbook has been studied */ #define fromsink corpsenm /* a potion from a sink */ unsigned oeaten; /* nutrition left in food, if partly eaten */ long age; /* creation date */ uchar onamelth; /* length of name (following oxlth) */ short oxlth; /* length of following data */ /* in order to prevent alignment problems oextra should be (or follow) a long int */ long owornmask; long oextra[1]; /* used for name of ordinary objects - length is flexible; amount for tmp gold objects */ }; #define newobj(xl) (struct obj *)alloc((unsigned)(xl) + sizeof(struct obj)) #define ONAME(otmp) (((char *)(otmp)->oextra) + (otmp)->oxlth) /* All objects */ #ifdef UNPOLYPILE #define is_hazy(otmp) ((otmp)->oldtyp != STRANGE_OBJECT) #endif /* [ALI] None of the objects listed here can be picked up by normal monsters. * If any such objects need to be marked as indestructible then consideration * will need to be given to what happens when such a monster disappears * carrying the object. */ #define evades_destruction(otmp) ( \ (otmp)->otyp == AMULET_OF_YENDOR || \ (otmp)->otyp == CANDELABRUM_OF_INVOCATION || \ (otmp)->otyp == BELL_OF_OPENING || \ (otmp)->otyp == SPE_BOOK_OF_THE_DEAD || \ (otmp)->oartifact == ART_KEY_OF_LAW || \ (otmp)->oartifact == ART_KEY_OF_NEUTRALITY || \ (otmp)->oartifact == ART_KEY_OF_CHAOS) #ifdef INVISIBLE_OBJECTS #define always_visible(otmp) ( \ (otmp)->otyp == MUMMY_WRAPPING || \ (otmp)->oclass == COIN_CLASS) #endif /* Weapons and weapon-tools */ /* KMH -- now based on skill categories. Formerly: * #define is_sword(otmp) (otmp->oclass == WEAPON_CLASS && \ * objects[otmp->otyp].oc_wepcat == WEP_SWORD) * #define is_blade(otmp) (otmp->oclass == WEAPON_CLASS && \ * (objects[otmp->otyp].oc_wepcat == WEP_BLADE || \ * objects[otmp->otyp].oc_wepcat == WEP_SWORD)) * #define is_weptool(o) ((o)->oclass == TOOL_CLASS && \ * objects[(o)->otyp].oc_weptool) * #define is_multigen(otyp) (otyp <= SHURIKEN) * #define is_poisonable(otyp) (otyp <= BEC_DE_CORBIN) */ #define is_sword(otmp) ((otmp)->oclass == WEAPON_CLASS && \ objects[(otmp)->otyp].oc_skill >= P_SHORT_SWORD && \ objects[(otmp)->otyp].oc_skill <= P_SABER) #define is_blade(otmp) ((otmp)->oclass == WEAPON_CLASS && \ objects[(otmp)->otyp].oc_skill >= P_DAGGER && \ objects[(otmp)->otyp].oc_skill <= P_SABER) #define is_pole(otmp) (((otmp)->oclass == WEAPON_CLASS || \ (otmp)->oclass == TOOL_CLASS) && \ (objects[(otmp)->otyp].oc_skill == P_POLEARMS || \ objects[(otmp)->otyp].oc_skill == P_LANCE)) #define is_spear(otmp) ((otmp)->oclass == WEAPON_CLASS && \ objects[(otmp)->otyp].oc_skill >= P_SPEAR && \ objects[(otmp)->otyp].oc_skill <= P_JAVELIN) #define is_axe(otmp) ((otmp)->oclass == WEAPON_CLASS && \ objects[(otmp)->otyp].oc_skill == P_AXE) #define is_launcher(otmp) ((otmp)->oclass == WEAPON_CLASS && \ objects[(otmp)->otyp].oc_skill >= P_BOW && \ objects[(otmp)->otyp].oc_skill <= P_CROSSBOW) #define is_ammo(otmp) (((otmp)->oclass == WEAPON_CLASS || \ (otmp)->oclass == GEM_CLASS) && \ objects[(otmp)->otyp].oc_skill >= -P_CROSSBOW && \ objects[(otmp)->otyp].oc_skill <= -P_BOW) #define is_missile(otmp) (((otmp)->oclass == WEAPON_CLASS || \ (otmp)->oclass == TOOL_CLASS) && \ objects[(otmp)->otyp].oc_skill >= -P_BOOMERANG && \ objects[(otmp)->otyp].oc_skill <= -P_DART) #define is_grenade(otmp) (is_ammo(otmp) && \ objects[(otmp)->otyp].w_ammotyp == WP_GRENADE) #define is_multigen(otmp) ((otmp)->oclass == WEAPON_CLASS && \ objects[(otmp)->otyp].oc_skill >= -P_SHURIKEN && \ objects[(otmp)->otyp].oc_skill <= -P_BOW) #ifdef FIREARMS #define is_unpoisonable_firearm_ammo(otmp) \ (is_bullet(otmp) || (otmp)->otyp == STICK_OF_DYNAMITE) #else #define is_unpoisonable_firearm_ammo(otmp) 0 #endif #define is_poisonable(otmp) ((otmp)->oclass == WEAPON_CLASS && \ (objects[(otmp)->otyp].oc_skill <= P_SABER || \ (objects[(otmp)->otyp].oc_skill >= P_POLEARMS && \ objects[(otmp)->otyp].oc_skill <= P_LANCE)) && \ !is_unpoisonable_firearm_ammo(otmp)) #define uslinging() (uwep && objects[uwep->otyp].oc_skill == P_SLING) #define is_weptool(o) ((o)->oclass == TOOL_CLASS && \ objects[(o)->otyp].oc_skill != P_NONE) #define is_pick(otmp) (((otmp)->oclass == WEAPON_CLASS || \ (otmp)->oclass == TOOL_CLASS) && \ objects[(otmp)->otyp].oc_skill == P_PICK_AXE) #define ammo_and_launcher(otmp,ltmp) \ (is_ammo(otmp) && (ltmp) && \ objects[(otmp)->otyp].oc_skill == -objects[(ltmp)->otyp].oc_skill && \ objects[(otmp)->otyp].w_ammotyp == objects[(ltmp)->otyp].w_ammotyp) #define bimanual(otmp) (((otmp)->oclass == WEAPON_CLASS || \ (otmp)->oclass == TOOL_CLASS) && \ objects[(otmp)->otyp].oc_bimanual) #ifdef LIGHTSABERS #define is_lightsaber(otmp) (objects[(otmp)->otyp].oc_skill == P_LIGHTSABER) #endif #ifdef FIREARMS #define is_firearm(otmp) \ ((otmp)->oclass == WEAPON_CLASS && \ objects[(otmp)->otyp].oc_skill == P_FIREARM) #define is_bullet(otmp) ((otmp)->oclass == WEAPON_CLASS && \ objects[(otmp)->otyp].oc_skill == -P_FIREARM) #endif /* Armor */ #define is_shield(otmp) ((otmp)->oclass == ARMOR_CLASS && \ objects[(otmp)->otyp].oc_armcat == ARM_SHIELD) #define is_helmet(otmp) ((otmp)->oclass == ARMOR_CLASS && \ objects[(otmp)->otyp].oc_armcat == ARM_HELM) #define is_boots(otmp) ((otmp)->oclass == ARMOR_CLASS && \ objects[(otmp)->otyp].oc_armcat == ARM_BOOTS) #define is_gloves(otmp) ((otmp)->oclass == ARMOR_CLASS && \ objects[(otmp)->otyp].oc_armcat == ARM_GLOVES) #define is_cloak(otmp) ((otmp)->oclass == ARMOR_CLASS && \ objects[(otmp)->otyp].oc_armcat == ARM_CLOAK) #define is_shirt(otmp) ((otmp)->oclass == ARMOR_CLASS && \ objects[(otmp)->otyp].oc_armcat == ARM_SHIRT) #define is_suit(otmp) ((otmp)->oclass == ARMOR_CLASS && \ objects[(otmp)->otyp].oc_armcat == ARM_SUIT) #define is_elven_armor(otmp) ((otmp)->otyp == ELVEN_LEATHER_HELM\ || (otmp)->otyp == ELVEN_MITHRIL_COAT\ || (otmp)->otyp == ELVEN_CLOAK\ || (otmp)->otyp == ELVEN_SHIELD\ || (otmp)->otyp == ELVEN_BOOTS) #define is_orcish_armor(otmp) ((otmp)->otyp == ORCISH_HELM\ || (otmp)->otyp == ORCISH_CHAIN_MAIL\ || (otmp)->otyp == ORCISH_RING_MAIL\ || (otmp)->otyp == ORCISH_CLOAK\ || (otmp)->otyp == URUK_HAI_SHIELD\ || (otmp)->otyp == ORCISH_SHIELD) #define is_dwarvish_armor(otmp) ((otmp)->otyp == DWARVISH_IRON_HELM\ || (otmp)->otyp == DWARVISH_MITHRIL_COAT\ || (otmp)->otyp == DWARVISH_CLOAK\ || (otmp)->otyp == DWARVISH_ROUNDSHIELD) #define is_gnomish_armor(otmp) (FALSE) /* Eggs and other food */ #define MAX_EGG_HATCH_TIME 200 /* longest an egg can remain unhatched */ #define stale_egg(egg) ((monstermoves - (egg)->age) > (2*MAX_EGG_HATCH_TIME)) #define ofood(o) ((o)->otyp == CORPSE || (o)->otyp == EGG || (o)->otyp == TIN) #define polyfodder(obj) (ofood(obj) && (obj)->corpsenm == PM_CHAMELEON) #define mlevelgain(obj) (ofood(obj) && (obj)->corpsenm == PM_WRAITH) #define mhealup(obj) (ofood(obj) && (obj)->corpsenm == PM_NURSE) #define drainlevel(corpse) (mons[(corpse)->corpsenm].cnutrit*4/5) /* Containers */ #define carried(o) ((o)->where == OBJ_INVENT) #define mcarried(o) ((o)->where == OBJ_MINVENT) #define Has_contents(o) (/* (Is_container(o) || (o)->otyp == STATUE) && */ \ (o)->cobj != (struct obj *)0) #define Is_container(o) ((o)->otyp == MEDICAL_KIT || \ (o)->otyp >= LARGE_BOX && (o)->otyp <= BAG_OF_TRICKS) #define Is_box(otmp) ((otmp)->otyp == LARGE_BOX || (otmp)->otyp == CHEST) #ifdef WALLET_O_P #define Is_mbag(otmp) ((otmp)->otyp == BAG_OF_HOLDING || \ ((otmp)->oartifact && \ (otmp)->oartifact == ART_WALLET_OF_PERSEUS) || \ (otmp)->otyp == BAG_OF_TRICKS) #else #define Is_mbag(otmp) ((otmp)->otyp == BAG_OF_HOLDING || \ (otmp)->otyp == BAG_OF_TRICKS) #endif /* 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)) /* Elven gear */ #define is_elven_weapon(otmp) ((otmp)->otyp == ELVEN_ARROW\ || (otmp)->otyp == ELVEN_SPEAR\ || (otmp)->otyp == ELVEN_DAGGER\ || (otmp)->otyp == ELVEN_SHORT_SWORD\ || (otmp)->otyp == ELVEN_BROADSWORD\ || (otmp)->otyp == ELVEN_BOW) #define is_elven_obj(otmp) (is_elven_armor(otmp) || is_elven_weapon(otmp)) /* Orcish gear */ #define is_orcish_obj(otmp) (is_orcish_armor(otmp)\ || (otmp)->otyp == ORCISH_ARROW\ || (otmp)->otyp == ORCISH_SPEAR\ || (otmp)->otyp == ORCISH_DAGGER\ || (otmp)->otyp == ORCISH_SHORT_SWORD\ || (otmp)->otyp == ORCISH_BOW) /* Dwarvish gear */ #define is_dwarvish_obj(otmp) (is_dwarvish_armor(otmp)\ || (otmp)->otyp == DWARVISH_SPEAR\ || (otmp)->otyp == DWARVISH_SHORT_SWORD\ || (otmp)->otyp == DWARVISH_MATTOCK) /* Gnomish gear */ #define is_gnomish_obj(otmp) (is_gnomish_armor(otmp)) /* Light sources */ #define Is_candle(otmp) ((otmp)->otyp == TALLOW_CANDLE || \ (otmp)->otyp == WAX_CANDLE || \ (otmp)->otyp == MAGIC_CANDLE) /* maximum amount of oil in a potion of oil */ #define MAX_OIL_IN_FLASK 400 /* MAGIC_LAMP intentionally excluded below */ /* age field of this is relative age rather than absolute */ #define age_is_relative(otmp) ((otmp)->otyp == BRASS_LANTERN\ || (otmp)->otyp == OIL_LAMP\ || (otmp)->otyp == TORCH\ || (otmp)->otyp == CANDELABRUM_OF_INVOCATION\ || (otmp)->otyp == TALLOW_CANDLE\ || (otmp)->otyp == WAX_CANDLE\ || (otmp)->otyp == POT_OIL) /* object can be ignited */ #define ignitable(otmp) ((otmp)->otyp == BRASS_LANTERN\ || (otmp)->otyp == OIL_LAMP\ || (otmp)->otyp == TORCH\ || (otmp)->otyp == CANDELABRUM_OF_INVOCATION\ || (otmp)->otyp == TALLOW_CANDLE\ || (otmp)->otyp == WAX_CANDLE\ || (otmp)->otyp == MAGIC_CANDLE\ || (otmp)->otyp == POT_OIL) /* special stones */ #define is_graystone(obj) ((obj)->otyp == LUCKSTONE || \ (obj)->otyp == LOADSTONE || \ (obj)->otyp == FLINT || \ (obj)->otyp == TOUCHSTONE || \ (obj)->otyp == HEALTHSTONE || \ (obj)->otyp == WHETSTONE) /* 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 #define BURIED_TOO 0x2 #endif /* OBJ_H */ slashem-0.0.7E7F3/include/attk.h0000664000076400007640000001416310545462317014420 0ustar aliali/* attk.h */ /* NetHack may be freely redistributed. See license for details. */ /* Copyright 1988, M. Stephenson */ #ifndef ATTK_H #define ATTK_H typedef struct Attk { struct monst *amon; /* Attacking monster */ struct obj *wobj; /* The wielded object, launcher, or wand */ struct obj *tobj; /* The thrown, kicked, or zapped object */ struct monst *dmon; /* Defending monster */ xchar atype; /* The attack type (AT_ below) */ xchar admg; /* The damage type (AD_ below) */ xchar skill; /* Skill used (if any) */ schar aalign; /* Attacking monster's alignment */ schar dalign; /* Defending monster's alignment */ xchar ax, ay; /* Location of attacker */ schar dx, dy, dz; /* Direction of the attack */ xchar tx, ty; /* Location of tobj */ xchar range; /* How much further tobj can go */ xchar dist; /* Distance from amon to dmon */ long tglyph; /* Glyph to use for tobj */ xchar tohit; /* Calculated to-hit value */ xchar dieroll; /* The die roll used for the attack */ xchar damage; /* Calculated amount of damage */ Bitfield(ayou,1); /* You are the attacker */ Bitfield(avis,1); /* Player can see amon */ Bitfield(dyou,1); /* You are the defender */ Bitfield(dvis,1); /* Player can see dmon */ Bitfield(defensive,1); /* This is the defensive response of another */ /* attack by dmon against amon */ Bitfield(poison,1); /* Poison was used */ Bitfield(poiskilled,1); Bitfield(poismgs,1); Bitfield(vampmsg,1); Bitfield(resists,1); /* Defender resists */ Bitfield(passes,1); /* Attack passes harmlessly through dmon */ Bitfield(dkilled,1); /* Defender is killed */ Bitfield(wlearn,1); /* Character learns identity of wobj */ Bitfield(hitmsg,1); Bitfield(skbonus,1); } *Attk; extern void attk_by_you(Attk); extern void attk_by_mon(Attk, struct monst *); extern void attk_by_god(Attk, SCHAR_P); extern void attk_by_trap(Attk, XCHAR_P); extern void attk_with_obj(Attk, struct obj *); extern void attk_with_mon(Attk, XCHAR_P); extern void attk_throw(Attk, struct obj *); extern void attk_upon(Attk, struct monst *); extern char *attk_aname(Attk); extern char *attk_wname(Attk); extern char *attk_tname(Attk); extern char *attk_dname(Attk); /* Add new attack types below - ordering affects experience (exper.c). * Attacks > AT_BUTT are worth extra experience. */ #define AT_NONE 0 /* passive monster (ex. acid blob) */ #define AT_CLAW 1 /* claw (punch, hit, etc.) */ #define AT_BITE 2 /* bite */ #define AT_KICK 3 /* kick */ #define AT_BUTT 4 /* head butt (ex. a unicorn) */ #define AT_TUCH 5 /* touches */ #define AT_STNG 6 /* sting */ #define AT_HUGS 7 /* crushing bearhug */ #define AT_SPIT 10 /* spits substance - ranged */ #define AT_ENGL 11 /* engulf (swallow or by a cloud) */ #define AT_BREA 12 /* breath - ranged */ #define AT_EXPL 13 /* explodes - proximity */ #define AT_BOOM 14 /* explodes upon hit */ #define AT_GAZE 15 /* gaze - ranged */ #define AT_TENT 16 /* tentacles */ #define AT_WEAP 64 /* Hand-to-hand weapon (monster or character) */ #define AT_THRO 65 /* Thrown object */ #define AT_SPEL 66 /* Magic spell (monster or character) */ #define AT_WAND 67 /* Wand or camera (monster or character) */ #define AT_MEGA 68 /* Mega spell/wand */ #define AT_TRAP 69 /* Trap (amon is null) */ #define AT_GODS 70 /* God (amon is null) */ /*#define AT_MAGC 66 */ /* uses magic spell(s) */ /* Add new damage types below. * * Note that 1-10 correspond to the types of attack used in buzz(). * Please don't disturb the order unless you rewrite the buzz() code. */ #define AD_PHYS 0 /* ordinary physical */ #define AD_MAGM 1 /* magic missiles */ #define AD_FIRE 2 /* fire damage */ #define AD_COLD 3 /* frost damage */ #define AD_SLEE 4 /* sleep ray */ #define AD_DISN 5 /* disintegration (death ray) */ #define AD_ELEC 6 /* shock damage */ #define AD_DRST 7 /* drains str (poison) */ #define AD_ACID 8 /* acid damage */ #define AD_LITE 9 /* light ray */ #define AD_SPC2 10 /* for extension of buzz() */ #define AD_BLND 11 /* blinds (glowing eye) */ #define AD_STUN 12 /* stuns */ #define AD_SLOW 13 /* slows */ #define AD_PLYS 14 /* paralyses */ #define AD_DRLI 15 /* drains life levels (Vampire) */ #define AD_DREN 16 /* drains magic energy */ #define AD_LEGS 17 /* damages legs (xan) */ #define AD_STON 18 /* petrifies (Medusa, Cockatrice) */ #define AD_STCK 19 /* sticks to you (Mimic) */ #define AD_SGLD 20 /* steals gold (Leppie) */ #define AD_SITM 21 /* steals item (Nymphs) */ #define AD_SEDU 22 /* seduces & steals multiple items */ #define AD_TLPT 23 /* teleports you (Quantum Mech.) */ #define AD_RUST 24 /* rusts armour (Rust Monster)*/ #define AD_CONF 25 /* confuses (Umber Hulk) */ #define AD_DGST 26 /* digests opponent (trapper, etc.) */ #define AD_HEAL 27 /* heals opponent's wounds (nurse) */ #define AD_WRAP 28 /* special "stick" for eels */ #define AD_WERE 29 /* confers lycanthropy */ #define AD_DRDX 30 /* drains dexterity (Quasit) */ #define AD_DRCO 31 /* drains constitution */ #define AD_DRIN 32 /* drains intelligence (mind flayer) */ #define AD_DISE 33 /* confers diseases */ #define AD_DCAY 34 /* decays organics (Brown pudding) */ #define AD_SSEX 35 /* Succubus seduction (extended) */ /* If no SEDUCE then same as AD_SEDU */ #define AD_HALU 36 /* causes hallucination */ #define AD_DETH 37 /* for Death only */ #define AD_PEST 38 /* for Pestilence only */ #define AD_FAMN 39 /* for Famine only */ #define AD_SLIM 40 /* turns you into green slime */ #define AD_CLRC 240 /* random clerical spell */ #define AD_SPEL 241 /* random magic spell */ #define AD_RBRE 242 /* random breath weapon */ #define AD_SAMU 252 /* hits, may steal Amulet (Wizard) */ #define AD_CURS 253 /* random curse (ex. gremlin) */ /* * Monster to monster attacks. When a monster attacks another (mattackm), * any or all of the following can be returned. See mattackm() for more * details. */ #define MM_MISS 0x0 /* aggressor missed */ #define MM_HIT 0x1 /* aggressor hit defender */ #define MM_DEF_DIED 0x2 /* defender died */ #define MM_AGR_DIED 0x4 /* aggressor died */ #endif /* ATTK_H */ slashem-0.0.7E7F3/include/macwin.h0000664000076400007640000001444610545462317014737 0ustar aliali/* 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. */ #ifndef MACWIN_H # define MACWIN_H #undef red /* undef internal color const strings from decl */ #undef green #undef blue #ifndef __MACH__ #include #include #endif /* more headers */ #ifdef THINK_C #include /* for CtoPStr and PtoCStr */ #endif /* resources */ #define PLAYER_NAME_RES_ID 1001 /* fake some things if we don't have universal headers.. */ #if 0 /*ndef NewUserItemProc*/ typedef pascal void (*UserItemProcPtr)(WindowPtr theWindow, short itemNo); typedef UserItemProcPtr UserItemUPP; #define NewUserItemProc(p) (UserItemUPP)(p) typedef pascal void (*ControlActionProcPtr)(ControlHandle theControl, short partCode); typedef ControlActionProcPtr ControlActionUPP; #define NewControlActionProc(p) (ControlActionUPP)(p) typedef ModalFilterProcPtr ModalFilterUPP; #define DisposeRoutineDescriptor(p) #endif /* misc */ #ifdef __MWERKS__ # define ResumeProcPtr long /* for call to InitDialogs */ #endif /* working dirs structure */ typedef struct macdirs { Str32 dataName; short dataRefNum; long dataDirID; Str32 saveName; short saveRefNum; long saveDirID; Str32 levelName; short levelRefNum; long levelDirID; } MacDirs; typedef struct macflags { Bitfield (processes, 1); Bitfield (color, 1); Bitfield (folders, 1); Bitfield (tempMem, 1); Bitfield (help, 1); Bitfield (fsSpec, 1); Bitfield (trueType, 1); Bitfield (aux, 1); Bitfield (alias, 1); Bitfield (standardFile, 1); Bitfield (hasDebugger, 1); Bitfield (hasAE, 1); Bitfield (gotOpen, 1); } MacFlags; extern MacDirs theDirs; /* used in macfile.c */ extern MacFlags macFlags; /* * Mac windows */ #define NUM_MACWINDOWS 15 #define TEXT_BLOCK 512L /* Window constants */ #define kMapWindow 0 #define kStatusWindow 1 #define kMessageWindow 2 #define kTextWindow 3 #define kMenuWindow 4 #define kLastWindowKind kMenuWindow /* * This determines the minimum logical line length in text windows * That is; even if physical width is less, this is where line breaks * go at the minimum. 350 is about right for score lines with a * geneva 10 pt font. */ #define MIN_RIGHT 350 typedef struct { anything id; char accelerator; char groupAcc; short line; } MacMHMenuItem; typedef struct NhWindow { WindowPtr its_window; short font_number; short font_size; short char_width; short row_height; short ascent_height; short x_size; short y_size; short x_curs; short y_curs; short last_more_lin; /* Used by message window */ short save_lin; /* Used by message window */ short miSize; /* size of menu items arrays */ short miLen; /* number of menu items in array */ MacMHMenuItem **menuInfo; /* Used by menus (array handle) */ char menuChar; /* next menu accelerator to use */ short **menuSelected; /* list of selected elements from list */ short miSelLen; /* number of items selected */ short how; /* menu mode */ char drawn; Handle windowText; long windowTextLen; short scrollPos; ControlHandle scrollBar; } NhWindow; extern Boolean CheckNhWin(WindowPtr mac_win); #define NUM_STAT_ROWS 2 #define NUM_ROWS 22 #define NUM_COLS 80 /* We shouldn't use column 0 */ #define QUEUE_LEN 24 extern NhWindow * theWindows; extern struct window_procs mac_procs; #define NHW_BASE 0 extern winid BASE_WINDOW, WIN_MAP, WIN_MESSAGE, WIN_INVEN, WIN_STATUS; /* * External declarations for the window routines. */ #define E extern /* ### dprintf.c ### */ extern void dprintf (char *, ...); /* ### maccurs.c ### */ extern Boolean RetrievePosition (short, short *, short *); extern Boolean RetrieveSize (short, short, short, short *, short *); extern void SaveWindowPos (WindowPtr); extern void SaveWindowSize (WindowPtr); extern Boolean FDECL(RetrieveWinPos, (WindowPtr,short *,short *)); /* ### macerrs.c ### */ extern void showerror(char *,const char *); extern Boolean itworked(short); extern void mustwork(short); extern void attemptingto(char *); /* appear to be unused extern void comment(char *,long); extern void pushattemptingto(char *); extern void popattempt(void); */ /* ### macfile.c ### */ /* extern char *macgets(int fd, char *ptr, unsigned len); unused */ extern void FDECL(C2P,(const char *c, unsigned char *p)); extern void FDECL(P2C,(const unsigned char *p, char *c)); /* ### macmenu.c ### */ extern void DoMenuEvt (long); extern void InitMenuRes(void); extern void AdjustMenus(short); #define DimMenuBar() AdjustMenus(1) #define UndimMenuBar() AdjustMenus(0) /* ### macmain.c ### */ extern void FDECL (process_openfile, (short s_vol, long s_dir, Str255 fNm, OSType ft)); /* ### macwin.c ### */ extern void AddToKeyQueue(unsigned char, Boolean); extern unsigned char GetFromKeyQueue (void); void trans_num_keys (EventRecord *); extern void NDECL (InitMac); int FDECL (try_key_queue, (char *)); void FDECL (enter_topl_mode, (char *)); void FDECL (leave_topl_mode, (char *)); void FDECL (topl_set_resp, (char *, char)); Boolean FDECL (topl_key, (unsigned char, Boolean)); E void FDECL(HandleEvent, (EventRecord *)); /* used in mmodal.c */ extern void NDECL(port_help); extern Boolean small_screen; E void FDECL(mac_init_nhwindows, (int *, char **)); E void NDECL(mac_askname); E void NDECL(mac_get_nh_event); E void FDECL(mac_exit_nhwindows, (const char *)); E winid FDECL(mac_create_nhwindow, (int)); E void FDECL(mac_clear_nhwindow, (winid)); E void FDECL(mac_display_nhwindow, (winid, BOOLEAN_P)); E void FDECL(mac_destroy_nhwindow, (winid)); E void FDECL(mac_curs, (winid,int,int)); E void FDECL(mac_putstr, (winid, int, const char *)); E void FDECL(mac_start_menu, (winid)); E void FDECL(mac_add_menu, (winid,int,const anything *, CHAR_P,CHAR_P,int,const char *, BOOLEAN_P)); E void FDECL(mac_end_menu, (winid, const char *)); E int FDECL(mac_select_menu, (winid, int, menu_item **)); #ifdef CLIPPING E void FDECL(mac_cliparound, (int, int)); #endif E int NDECL(mac_nhgetch); E int FDECL(mac_nh_poskey, (int *, int *, int *)); E int NDECL(mac_doprev_message); E char FDECL(mac_yn_function, (const char *, const char *, CHAR_P)); E void FDECL(mac_getlin, (const char *,char *)); E int NDECL(mac_get_ext_cmd); E void FDECL(mac_number_pad, (int)); E void NDECL(mac_delay_output); #undef E #endif /* ! MACWIN_H */ slashem-0.0.7E7F3/include/pcconf.h0000664000076400007640000002207310545462317014724 0ustar aliali/* 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. */ #ifndef PCCONF_H #define PCCONF_H #define MICRO /* always define this! */ #ifdef MSDOS /* some of this material is MS-DOS specific */ /* * Automatic Defines: * * __GO32__ is defined automatically by the djgpp port of gcc. * __DJGPP__ is defined automatically by djgpp version 2 and above. * _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.1 was not verified with Symantec C. */ /* * The following options are somewhat configurable depending on * your compiler. */ /* * 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 */ # endif /* [Tom] trying to make this work with WATCOM */ #if 0 # define NO_SIGNAL # undef MOVERLAY #endif # define SHELL /* via exec of COMMAND.COM */ # ifdef __BORLANDC__ #define PCMUSIC /* enable very basic pc speaker music notes */ # endif /* * Screen control options * * You may uncomment: * ANSI_DEFAULT * or TERMLIB * or ANSI_DEFAULT and TERMLIB * 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 */ /* * PC video hardware support options (for graphical tile support) * * You may uncomment any/all of the options below. * */ # ifndef SUPPRESS_GRAPHICS # if (defined(SCREEN_BIOS) || defined(SCREEN_DJGPPFAST)) && !defined(PC9800) # ifdef USE_TILES #define SCREEN_VGA /* Include VGA graphics routines in the build */ #define ALLEG_FX /* Use Allegro libraries */ # endif # endif # else # undef NO_TERMS # undef SCREEN_BIOS # undef SCREEN_DJGPPFAST # undef SCREEN_VGA # undef TERMLIB # define ANSI_DEFAULT # endif # define RANDOM /* have Berkeley random(3) */ # define MAIL /* Allows for fake mail daemon to deliver mail */ /* in the MSDOS version. (For AMIGA MAIL see */ /* amiconf.h). In the future this will be the */ /* hook for mail reader implementation. */ /* The following is needed for prototypes of certain functions */ #if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__SC__) #include /* Provides prototypes of exit(), spawn() */ #endif #if defined(__BORLANDC__) && defined(STRNCMPI) #include /* Provides prototypes of strncmpi(), etc. */ #endif #if defined(__DJGPP__) #define _NAIVE_DOS_REGS #include #include /* Provides prototypes of strncmpi(), etc. */ # ifndef M #define M(c) ((char) (0x80 | (c))) # endif #endif /* * On the VMS and unix, this option controls whether a delay is done by * the clock, or whether it is done by excess output. On the PC, however, * there is always a clock to use for the delay. The TIMED_DELAY option * on MSDOS (without the termcap routines) is used to determine whether to * include the delay routines in the code (and thus, provides a compile time * method to turn off napping for visual effect). However, it is also used * in the music code to wait between different notes. So it is needed in that * case as well. * Whereas on the VMS and unix, flags.nap is a run-time option controlling * whether there is a delay by clock or by excess output, on MSDOS it is * simply a flag to turn on or off napping for visual effects at run-time. */ #define TIMED_DELAY /* enable the `timed_delay' run-time option */ # 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, CONFIGDIR, and TROUBLEDIR. */ #endif /* MSDOS configuration stuff */ #define PATHLEN 64 /* maximum pathlength */ #define FILENAMELEN 80 /* maximum filename length (conservative) */ #ifndef MICRO_H #include "micro.h" /* contains necessary externs for [os_name].c */ #endif /* =================================================== * The remaining code shouldn't need modification. */ #ifndef SYSTEM_H #include "system.h" #endif #ifdef __DJGPP__ #include /* close(), etc. */ /* lock() in io.h interferes with lock[] in decl.h */ #define lock djlock #include #undef lock #include /* kbhit() */ #define PC_LOCKING #define HOLD_LOCKFILE_OPEN #define SELF_RECOVER /* NetHack itself can recover games */ #endif # ifdef MSDOS # ifndef EXEPATH #define EXEPATH /* HACKDIR is .exe location if not explicitly defined */ # endif # endif # if defined(_MSC_VER) && defined(MSDOS) # if (_MSC_VER >= 700) && !defined(FUNCTION_LEVEL_LINKING) # ifndef MOVERLAY #define MOVERLAY /* Microsoft's MOVE overlay system (MSC >= 7.0) */ # endif # endif #define PC_LOCKING # endif /* Borland Stuff */ # if defined(__BORLANDC__) # if defined(__OVERLAY__) && !defined(VROOMM) /* __OVERLAY__ is automatically defined by Borland C if overlay option is on */ #define VROOMM /* Borland's VROOMM overlay system */ # endif # if !defined(STKSIZ) #define STKSIZ 5*1024 /* Use a default of 5K stack for Borland C */ /* This macro is used in any file that contains */ /* a main() function. */ # endif #define PC_LOCKING # endif #ifdef PC_LOCKING #define HLOCK "NHPERM" #endif #ifndef index # define index strchr #endif #ifndef rindex # define rindex strrchr #endif #ifndef AMIGA #include #endif #ifdef RANDOM /* Use the high quality random number routines. */ # define Rand() random() #else # define Rand() rand() #endif #ifndef TOS # define FCMASK 0660 /* file creation mask */ #endif #include #ifndef REDO # undef Getchar # define Getchar nhgetch #endif #ifdef MSDOS # define TEXTCOLOR /* */ # define PORT_HELP "msdoshlp.txt" /* msdos port specific help file */ #endif /* Sanity check, do not modify these blocks. */ /* OVERLAY must be defined with MOVERLAY or VROOMM */ #if (defined(MOVERLAY) || defined(VROOMM)) # ifndef OVERLAY # define OVERLAY # endif #endif #if defined(FUNCTION_LEVEL_LINKING) #define OVERLAY #define OVL0 #define OVL1 #define OVL2 #define OVL3 #define OVLB #endif #if defined(OVERLAY) && !defined(MOVERLAY) && !defined(VROOMM) && !defined(FUNCTION_LEVEL_LINKING) #define USE_TRAMPOLI #endif #if defined(MSDOS) && defined(NO_TERMS) # ifdef TERMLIB # if defined(_MSC_VER) || defined(__SC__) # pragma message("Warning -- TERMLIB defined with NO_TERMS in pcconf.h") # pragma message(" Forcing undef of TERMLIB") # endif #undef TERMLIB # endif # ifdef ANSI_DEFAULT # if defined(_MSC_VER) || defined(__SC__) # pragma message("Warning -- ANSI_DEFAULT defined with NO_TERMS in pcconf.h") # pragma message(" Forcing undef of ANSI_DEFAULT") # endif #undef ANSI_DEFAULT # endif /* only one screen package is allowed */ # if defined(SCREEN_BIOS) && defined(SCREEN_DJGPPFAST) # if defined(_MSC_VER) || defined(__SC__) # pragma message("Warning -- More than one screen package defined in pcconf.h") # endif # if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__SC__) # if defined(SCREEN_DJGPPFAST) # if defined(_MSC_VER) || defined(__SC__) # pragma message(" Forcing undef of SCREEN_DJGPPFAST") # endif #undef SCREEN_DJGPPFAST /* Can't use djgpp fast with other compilers anyway */ # endif # else /* djgpp C compiler */ # if defined(SCREEN_BIOS) #undef SCREEN_BIOS # endif # endif # endif # define ASCIIGRAPH # ifdef TEXTCOLOR # define VIDEOSHADES # endif /* SCREEN_8514, SCREEN_VESA are only placeholders presently - sub VGA instead */ # if defined(SCREEN_8514) || defined(SCREEN_VESA) # undef SCREEN_8514 # undef SCREEN_VESA # define SCREEN_VGA # endif /* Graphical tile sanity checks */ # if defined(SCREEN_VGA) || defined(ALLEG_FX) # define SIMULATE_CURSOR # define POSITIONBAR /* Select appropriate tile file format, and map size */ # define PLANAR_FILE # define SMALL_MAP # endif #endif /* End of sanity check block */ #if defined(MSDOS) && defined(DLB) #define FILENAME_CMP stricmp /* case insensitive */ #endif #ifdef MSC7_WARN /* define with cl /DMSC7_WARN */ #pragma warning(disable:4131) #endif #ifdef TIMED_DELAY # ifdef __DJGPP__ # define msleep(k) (void) usleep((k)*1000) # endif # ifdef __BORLANDC__ # define msleep(k) delay(k) # endif # ifdef __SC__ # define msleep(k) (void) usleep((long)((k)*1000)) # endif #endif #endif /* PCCONF_H */ slashem-0.0.7E7F3/include/winprocs.h0000664000076400007640000002350310545462317015317 0ustar aliali/* SCCS Id: @(#)winprocs.h 3.4 2003/01/08 */ /* Copyright (c) David Cohrs, 1992 */ /* NetHack may be freely redistributed. See license for details. */ #ifndef WINPROCS_H #define WINPROCS_H struct window_procs { const char *name; unsigned long wincap; /* window port capability options supported */ unsigned long wincap2; /* additional window port capability options supported */ void FDECL((*win_init_nhwindows), (int *, char **)); void NDECL((*win_player_selection)); void NDECL((*win_askname)); void NDECL((*win_get_nh_event)) ; void FDECL((*win_exit_nhwindows), (const char *)); void FDECL((*win_suspend_nhwindows), (const char *)); void NDECL((*win_resume_nhwindows)); winid FDECL((*win_create_nhwindow), (int)); void FDECL((*win_clear_nhwindow), (winid)); void FDECL((*win_display_nhwindow), (winid, BOOLEAN_P)); void FDECL((*win_destroy_nhwindow), (winid)); void FDECL((*win_curs), (winid,int,int)); void FDECL((*win_putstr), (winid, int, const char *)); #ifdef FILE_AREAS void FDECL((*win_display_file), (const char *, const char *, BOOLEAN_P)); #else void FDECL((*win_display_file), (const char *, BOOLEAN_P)); #endif void FDECL((*win_start_menu), (winid)); void FDECL((*win_add_menu), (winid,int,const ANY_P *, CHAR_P,CHAR_P,int,const char *, BOOLEAN_P)); void FDECL((*win_end_menu), (winid, const char *)); int FDECL((*win_select_menu), (winid, int, MENU_ITEM_P **)); char FDECL((*win_message_menu), (CHAR_P,int,const char *)); void NDECL((*win_update_inventory)); void NDECL((*win_mark_synch)); void NDECL((*win_wait_synch)); #ifdef CLIPPING void FDECL((*win_cliparound), (int, int)); #endif #ifdef POSITIONBAR void FDECL((*win_update_positionbar), (char *)); #endif void FDECL((*win_print_glyph), (winid,XCHAR_P,XCHAR_P,int)); void FDECL((*win_raw_print), (const char *)); void FDECL((*win_raw_print_bold), (const char *)); int NDECL((*win_nhgetch)); int FDECL((*win_nh_poskey), (int *, int *, int *)); void NDECL((*win_nhbell)); int NDECL((*win_doprev_message)); char FDECL((*win_yn_function), (const char *, const char *, CHAR_P)); void FDECL((*win_getlin), (const char *,char *)); int NDECL((*win_get_ext_cmd)); void FDECL((*win_number_pad), (int)); void NDECL((*win_delay_output)); #ifdef CHANGE_COLOR void FDECL((*win_change_color), (int,long,int)); #ifdef MAC void FDECL((*win_change_background), (int)); short FDECL((*win_set_font_name), (winid, char *)); #endif char * NDECL((*win_get_color_string)); #endif /* other defs that really should go away (they're tty specific) */ void NDECL((*win_start_screen)); void NDECL((*win_end_screen)); void FDECL((*win_outrip), (winid,int)); void FDECL((*win_preference_update), (const char *)); }; extern NEARDATA struct window_procs windowprocs; /* * If you wish to only support one window system and not use procedure * pointers, add the appropriate #ifdef below. */ #define init_nhwindows (*windowprocs.win_init_nhwindows) #define player_selection (*windowprocs.win_player_selection) #define askname (*windowprocs.win_askname) #define get_nh_event (*windowprocs.win_get_nh_event) #define exit_nhwindows (*windowprocs.win_exit_nhwindows) #define suspend_nhwindows (*windowprocs.win_suspend_nhwindows) #define resume_nhwindows (*windowprocs.win_resume_nhwindows) #define create_nhwindow (*windowprocs.win_create_nhwindow) #define clear_nhwindow (*windowprocs.win_clear_nhwindow) #define display_nhwindow (*windowprocs.win_display_nhwindow) #define destroy_nhwindow (*windowprocs.win_destroy_nhwindow) #define curs (*windowprocs.win_curs) #define putstr (*windowprocs.win_putstr) #define display_file (*windowprocs.win_display_file) #ifdef FILE_AREAS #define display_file_area(area,file,complain) display_file(area,file,complain) #else #define display_file_area(area,file,complain) display_file(file,complain) #endif #define start_menu (*windowprocs.win_start_menu) #define add_menu (*windowprocs.win_add_menu) #define end_menu (*windowprocs.win_end_menu) #define select_menu (*windowprocs.win_select_menu) #define message_menu (*windowprocs.win_message_menu) #define update_inventory (*windowprocs.win_update_inventory) #define mark_synch (*windowprocs.win_mark_synch) #define wait_synch (*windowprocs.win_wait_synch) #ifdef CLIPPING #define cliparound (*windowprocs.win_cliparound) #endif #ifdef POSITIONBAR #define update_positionbar (*windowprocs.win_update_positionbar) #endif #define print_glyph (*windowprocs.win_print_glyph) #define raw_print (*windowprocs.win_raw_print) #define raw_print_bold (*windowprocs.win_raw_print_bold) #define nhgetch (*windowprocs.win_nhgetch) #define nh_poskey (*windowprocs.win_nh_poskey) #define nhbell (*windowprocs.win_nhbell) #define nh_doprev_message (*windowprocs.win_doprev_message) #define getlin (*windowprocs.win_getlin) #define get_ext_cmd (*windowprocs.win_get_ext_cmd) #define number_pad (*windowprocs.win_number_pad) #define delay_output (*windowprocs.win_delay_output) #ifdef CHANGE_COLOR #define change_color (*windowprocs.win_change_color) #ifdef MAC #define change_background (*windowprocs.win_change_background) #define set_font_name (*windowprocs.win_set_font_name) #endif #define get_color_string (*windowprocs.win_get_color_string) #endif /* 3.4.2: There is a real yn_function() in the core now, which does * some buffer length validation on the parameters prior to * invoking the window port routine. yn_function() is in cmd.c */ /* #define yn_function (*windowprocs.win_yn_function) */ /* other defs that really should go away (they're tty specific) */ #define start_screen (*windowprocs.win_start_screen) #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 display of splash screen */ #define WC_POPUP_DIALOG 0x1000000L /* 25 supports queries in pop dialogs */ #define WC_SCROLL_AMOUNT 0x2000000L /* 26 scroll this amount at scroll margin */ #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 */ #define WC_MOUSE_SUPPORT 0x80000000L /* 32 mouse support */ /* no free bits */ #define WC2_FULLSCREEN 0x01L /* 01 display full screen */ #define WC2_SOFTKEYBOARD 0x02L /* 02 software keyboard */ #define WC2_WRAPTEXT 0x04L /* 04 wrap long lines of text */ /* 29 free bits */ #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 { const char *wc_name; unsigned long wc_bit; }; #endif /* WINPROCS_H */ slashem-0.0.7E7F3/include/md5.h0000664000076400007640000000650210545462317014140 0ustar aliali/* Copyright (C) 1999, 2002 Aladdin Enterprises. All rights reserved. This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. L. Peter Deutsch ghost@aladdin.com */ /* $Id: md5.h,v 1.1 2003/07/05 15:02:54 j_ali Exp $ */ /* Independent implementation of MD5 (RFC 1321). This code implements the MD5 Algorithm defined in RFC 1321, whose text is available at http://www.ietf.org/rfc/rfc1321.txt The code is derived from the text of the RFC, including the test suite (section A.5) but excluding the rest of Appendix A. It does not include any code or documentation that is identified in the RFC as being copyrighted. The original and principal author of md5.h is L. Peter Deutsch . Other authors are noted in the change history that follows (in reverse chronological order): 2002-04-13 lpd Removed support for non-ANSI compilers; removed references to Ghostscript; clarified derivation from RFC 1321; now handles byte order either statically or dynamically. 1999-11-04 lpd Edited comments slightly for automatic TOC extraction. 1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5); added conditionalization for C++ compilation from Martin Purschke . 1999-05-03 lpd Original version. */ #ifndef md5_INCLUDED # define md5_INCLUDED /* * This package supports both compile-time and run-time determination of CPU * byte order. If ARCH_IS_BIG_ENDIAN is defined as 0, the code will be * compiled to run only on little-endian CPUs; if ARCH_IS_BIG_ENDIAN is * defined as non-zero, the code will be compiled to run only on big-endian * CPUs; if ARCH_IS_BIG_ENDIAN is not defined, the code will be compiled to * run on either big- or little-endian CPUs, but will run slightly less * efficiently on either one than if ARCH_IS_BIG_ENDIAN is defined. */ typedef unsigned char md5_byte_t; /* 8-bit byte */ typedef unsigned int md5_word_t; /* 32-bit word */ /* Define the state of the MD5 Algorithm. */ typedef struct md5_state_s { md5_word_t count[2]; /* message length in bits, lsw first */ md5_word_t abcd[4]; /* digest buffer */ md5_byte_t buf[64]; /* accumulate block */ } md5_state_t; #ifdef __cplusplus extern "C" { #endif /* Initialize the algorithm. */ void md5_init(md5_state_t *pms); /* Append a string to the message. */ void md5_append(md5_state_t *pms, const md5_byte_t *data, int nbytes); /* Finish the message and return the digest. */ void md5_finish(md5_state_t *pms, md5_byte_t digest[16]); #ifdef __cplusplus } /* end extern "C" */ #endif #endif /* md5_INCLUDED */ slashem-0.0.7E7F3/include/artifact.h0000664000076400007640000000661610545462317015256 0ustar aliali/* 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. */ #ifndef ARTIFACT_H #define ARTIFACT_H #define SPFX_NONE 0x0000000L /* no special effects, just a bonus */ #define SPFX_NOGEN 0x0000001L /* item is special, bequeathed by gods */ #define SPFX_RESTR 0x0000002L /* item is restricted - can't be named */ #define SPFX_INTEL 0x0000004L /* item is self-willed - intelligent */ #define SPFX_SPEAK 0x0000008L /* item can speak (not implemented) */ #define SPFX_SEEK 0x0000010L /* item helps you search for things */ #define SPFX_WARN 0x0000020L /* item warns you of danger */ #define SPFX_ATTK 0x0000040L /* item has a special attack (attk) */ #define SPFX_DEFN 0x0000080L /* item has a special defence (defn) */ #define SPFX_DRLI 0x0000100L /* drains a level from monsters */ #define SPFX_SEARCH 0x0000200L /* helps searching */ #define SPFX_BEHEAD 0x0000400L /* beheads monsters */ #define SPFX_HALRES 0x0000800L /* blocks hallucinations */ #define SPFX_ESP 0x0001000L /* ESP (like amulet of ESP) */ #define SPFX_STLTH 0x0002000L /* Stealth */ #define SPFX_REGEN 0x0004000L /* Regeneration */ #define SPFX_EREGEN 0x0008000L /* Energy Regeneration */ #define SPFX_HSPDAM 0x0010000L /* 1/2 spell damage (on player) in combat */ #define SPFX_HPHDAM 0x0020000L /* 1/2 physical damage (on player) in combat */ #define SPFX_TCTRL 0x0040000L /* Teleportation Control */ #define SPFX_LUCK 0x0080000L /* Increase Luck (like Luckstone) */ #define SPFX_DMONS 0x0100000L /* attack bonus on one monster type */ #define SPFX_DCLAS 0x0200000L /* attack bonus on monsters w/ symbol mtype */ #define SPFX_DFLAG1 0x0400000L /* attack bonus on monsters w/ mflags1 flag */ #define SPFX_DFLAG2 0x0800000L /* attack bonus on monsters w/ mflags2 flag */ #define SPFX_DALIGN 0x1000000L /* attack bonus on non-aligned monsters */ #define SPFX_XRAY 0x2000000L /* gives X-RAY vision to player */ #define SPFX_REFLECT 0x4000000L /* Reflection */ #define SPFX_DBONUS 0x1F00000L /* attack bonus mask */ struct artifact { short otyp; const char *name; unsigned long spfx; /* special effect from wielding/wearing */ unsigned long cspfx; /* special effect just from carrying obj */ unsigned long mtype; /* monster type, symbol, or flag */ struct attack attk, defn, cary; uchar inv_prop; /* property obtained by invoking artifact */ 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) */ Bitfield(questarti,1); /* is quest artifact */ }; /* invoked properties with special powers */ #define TAMING (LAST_PROP+1) #define HEALING (LAST_PROP+2) #define ENERGY_BOOST (LAST_PROP+3) #define UNTRAP (LAST_PROP+4) #define CHARGE_OBJ (LAST_PROP+5) #define LEV_TELE (LAST_PROP+6) #define CREATE_PORTAL (LAST_PROP+7) #define ENLIGHTENING (LAST_PROP+8) #define CREATE_AMMO (LAST_PROP+9) #define SUMMON_UNDEAD (LAST_PROP+10) #define DEATH_GAZE (LAST_PROP+11) #define LIGHT_AREA (LAST_PROP+12) /* STEPHEN WHITE'S NEW CODE */ #define PROT_POLY (LAST_PROP+13) #define SUMMON_FIRE_ELEMENTAL (LAST_PROP+14) #define SUMMON_WATER_ELEMENTAL (LAST_PROP+15) #define OBJ_DETECTION (LAST_PROP+16) #endif /* ARTIFACT_H */ slashem-0.0.7E7F3/include/dlb.h0000664000076400007640000000764310545462317014223 0ustar aliali/* 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. */ #ifndef DLB_H #define DLB_H /* definitions for data library */ #ifdef DLB /* implementations */ #ifdef MAC # define DLBRSRC /* use Mac resources */ #else # define DLBLIB /* use a set of external files */ #endif #ifdef DLBLIB /* directory structure in memory */ typedef struct dlb_directory { char *fname; /* file name as seen from calling code */ long foffset; /* offset in lib file to start of this file */ long fsize; /* file size */ char handling; /* how to handle the file (compression, etc) */ } libdir; /* information about each open library */ typedef struct dlb_library { FILE *fdata; /* opened data file */ long fmark; /* current file mark */ libdir *dir; /* directory of library file */ char *sspace; /* pointer to string space */ long nentries; /* # of files in directory */ long rev; /* dlb file revision */ long strsize; /* dlb file string size */ } library; /* library definitions */ # ifndef DLBFILE # define DLBFILE "nhshare" /* shareable library */ # define DLBAREA FILE_AREA_SHARE # define DLBFILE2 "nhushare" /* unshareable library */ # define DLBAREA2 FILE_AREA_UNSHARE # endif # ifndef FILENAME_CMP # define FILENAME_CMP strcmp /* case sensitive */ # endif #endif /* DLBLIB */ typedef struct dlb_handle { FILE *fp; /* pointer to an external file, use if non-null */ #ifdef DLBLIB library *lib; /* pointer to library structure */ long start; /* offset of start of file */ long size; /* size of file */ long mark; /* current file marker */ #endif #ifdef DLBRSRC int fd; /* HandleFile file descriptor */ #endif } dlb; #if defined(ULTRIX_PROTO) && !defined(__STDC__) /* buggy old Ultrix compiler wants this for the (*dlb_fread_proc) and (*dlb_fgets_proc) prototypes in struct dlb_procs (dlb.c); we'll use it in all the declarations for consistency */ #define DLB_P struct dlb_handle * #else #define DLB_P dlb * #endif boolean NDECL(dlb_init); void NDECL(dlb_cleanup); #ifndef FILE_AREAS dlb *FDECL(dlb_fopen, (const char *,const char *)); #else dlb *FDECL(dlb_fopen_area, (const char *,const char *,const char *)); #endif int FDECL(dlb_fclose, (DLB_P)); int FDECL(dlb_fread, (char *,int,int,DLB_P)); int FDECL(dlb_fseek, (DLB_P,long,int)); char *FDECL(dlb_fgets, (char *,int,DLB_P)); int FDECL(dlb_fgetc, (DLB_P)); long FDECL(dlb_ftell, (DLB_P)); /* Resource DLB entry points */ #ifdef DLBRSRC boolean rsrc_dlb_init(void); void rsrc_dlb_cleanup(void); boolean rsrc_dlb_fopen(dlb *dp, const char *name, const char *mode); int rsrc_dlb_fclose(dlb *dp); int rsrc_dlb_fread(char *buf, int size, int quan, dlb *dp); int rsrc_dlb_fseek(dlb *dp, long pos, int whence); char *rsrc_dlb_fgets(char *buf, int len, dlb *dp); int rsrc_dlb_fgetc(dlb *dp); long rsrc_dlb_ftell(dlb *dp); #endif #else /* DLB */ # define dlb FILE # define dlb_init() # define dlb_cleanup() #ifndef FILE_AREAS # define dlb_fopen fopen #else # define dlb_fopen_area(a,b,c) fopen_datafile_area(a,b,c,FALSE) /* TODO: someone more knowledgable make this better */ #endif # define dlb_fclose fclose # define dlb_fread fread # define dlb_fseek fseek # define dlb_fgets fgets # define dlb_fgetc fgetc # define dlb_ftell ftell #endif /* DLB */ /* various other I/O stuff we don't want to replicate everywhere */ #ifndef SEEK_SET # define SEEK_SET 0 #endif #ifndef SEEK_CUR # define SEEK_CUR 1 #endif #ifndef SEEK_END # define SEEK_END 2 #endif #define RDTMODE "r" #if (defined(MSDOS) || defined(WIN32) || defined(TOS) || defined(OS2)) && defined(DLB) #define WRTMODE "w+b" #else #define WRTMODE "w+" #endif #if (defined(MICRO) && !defined(AMIGA)) || defined(THINK_C) || defined(__MWERKS__) || defined(WIN32) # define RDBMODE "rb" # define WRBMODE "w+b" #else # define RDBMODE "r" # define WRBMODE "w+" #endif #endif /* DLB_H */ slashem-0.0.7E7F3/include/beconf.h0000664000076400007640000000147610545462317014714 0ustar aliali/* SCCS Id: @(#)beconf.h 3.4 1998/07/08 */ /* Copyright (c) Dean Luick 1996. */ /* NetHack may be freely redistributed. See license for details. */ /* Configuration for Be Inc.'s BeOS */ #ifndef BECONF_H #define BECONF_H /* * We must use UNWIDENED_PROTOTYPES because we mix C++ and C. */ #define index strchr #define rindex strrchr #define Rand rand /* Be should have a better rand function! */ #define tgetch getchar #define FCMASK 0666 #define PORT_ID "BeOS" #define TEXTCOLOR #define POSIX_TYPES #define SIG_RET_TYPE __signal_func_ptr #include /* for time_t */ #include /* for lseek() */ /* could go in extern.h, under bemain.c (or something..) */ void regularize(char *); /* instead of including system.h... */ #include #include #include #endif /* BECONF_H */ slashem-0.0.7E7F3/include/def_os2.h0000664000076400007640000001023310545462317014770 0ustar aliali/* 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. */ /* * Only a small portion of all OS/2 defines are needed, so the * actual include files often need not be used. In fact, * including the full headers may stall the compile in DOS. */ #ifdef OS2_USESYSHEADERS # define INCL_NOPMAPI # define INCL_DOSFILEMGR # define INCL_DOS # define INCL_SUB #include #else typedef char CHAR; typedef void VOID; typedef unsigned char UCHAR; typedef unsigned short USHORT; typedef unsigned int UINT; typedef unsigned long ULONG; typedef unsigned char BYTE; # ifdef OS2_32BITAPI typedef unsigned long SHANDLE; typedef USHORT HKBD; typedef USHORT HVIO; # define CCHMAXPATHCOMP 256 # ifdef OS2_CSET2 # define API16 _Far16 _Pascal # define DAT16 # define API32 _System # define KbdGetStatus KBD16GETSTATUS # define KbdSetStatus KBD16SETSTATUS # define KbdCharIn KBD16CHARIN # define KbdPeek KBD16PEEK # define VioGetMode VIO16GETMODE # define VioSetCurPos VIO16SETCURPOS # else # define API16 # define DAT16 # define API32 # endif # define DAT # else /* OS2_32BITAPI */ typedef unsigned short SHANDLE; typedef SHANDLE HKBD; typedef SHANDLE HVIO; # define CCHMAXPATHCOMP 13 # ifdef OS2_MSC # define API16 pascal far # define DAT16 # endif # define DAT DAT16 # endif /* OS2_32BITAPI */ typedef USHORT * DAT16 PUSHORT; typedef BYTE * DAT16 PBYTE; typedef ULONG * DAT PULONG; typedef VOID * DAT PVOID; typedef SHANDLE HDIR; typedef HDIR * DAT PHDIR; typedef char * DAT16 PCH; typedef char * DAT PSZ; /* all supported compilers understand this */ # pragma pack(2) typedef struct { UCHAR chChar; UCHAR chScan; UCHAR fbStatus; UCHAR bNlsShift; USHORT fsState; ULONG time; } KBDKEYINFO; typedef KBDKEYINFO * DAT16 PKBDKEYINFO; /* File time and date types */ typedef struct { UINT twosecs : 5; UINT minutes : 6; UINT hours : 5; } FTIME; typedef struct { UINT day : 5; UINT month : 4; UINT year : 7; } FDATE; # ifdef OS2_32BITAPI typedef struct { ULONG oNextEntryOffset; FDATE fdateCreation; FTIME ftimeCreation; FDATE fdateLastAccess; FTIME ftimeLastAccess; FDATE fdateLastWrite; FTIME ftimeLastWrite; ULONG cbFile; ULONG cbFileAlloc; ULONG attrFile; UCHAR cchName; CHAR achName[CCHMAXPATHCOMP]; } FILEFINDBUF3; # else typedef struct { FDATE fdateCreation; FTIME ftimeCreation; FDATE fdateLastAccess; FTIME ftimeLastAccess; FDATE fdateLastWrite; FTIME ftimeLastWrite; ULONG cbFile; ULONG cbFileAlloc; USHORT attrFile; UCHAR cchName; CHAR achName[CCHMAXPATHCOMP]; } FILEFINDBUF; typedef FILEFINDBUF * DAT16 PFILEFINDBUF; # endif /* OS2_32BITAPI */ typedef struct { ULONG idFileSystem; ULONG cSectorUnit; ULONG cUnit; ULONG cUnitAvail; USHORT cbSector; } FSALLOCATE; typedef struct { USHORT cb; USHORT fsMask; USHORT chTurnAround; USHORT fsInterim; USHORT fsState; } KBDINFO; typedef KBDINFO * DAT16 PKBDINFO; typedef struct { USHORT cb; UCHAR fbType; UCHAR color; USHORT col; USHORT row; USHORT hres; USHORT vres; UCHAR fmt_ID; UCHAR attrib; ULONG buf_addr; ULONG buf_length; ULONG full_length; ULONG partial_length; PCH ext_data_addr; } VIOMODEINFO; typedef VIOMODEINFO * DAT16 PVIOMODEINFO; # pragma pack() /* OS2 API functions */ USHORT API16 KbdGetStatus(PKBDINFO, HKBD); USHORT API16 KbdSetStatus(PKBDINFO, HKBD); USHORT API16 KbdCharIn(PKBDKEYINFO, USHORT, HKBD); USHORT API16 KbdPeek(PKBDKEYINFO, HKBD); USHORT API16 VioGetMode(PVIOMODEINFO, HVIO); USHORT API16 VioSetCurPos(USHORT, USHORT, HVIO); # ifdef OS2_32BITAPI ULONG API32 DosQueryFSInfo(ULONG, ULONG, PVOID, ULONG); ULONG API32 DosFindFirst(PSZ, PHDIR, ULONG, PVOID, ULONG, PULONG, ULONG); ULONG API32 DosFindNext(HDIR, PVOID, ULONG, PULONG); ULONG API32 DosSetDefaultDisk(ULONG); # else USHORT API16 DosQFSInfo(USHORT, USHORT, PBYTE, USHORT); USHORT API16 DosFindFirst(PSZ, PHDIR, USHORT, PFILEFINDBUF, USHORT, PUSHORT, ULONG); USHORT API16 DosFindNext(HDIR, PFILEFINDBUF, USHORT, PUSHORT); USHORT API16 DosSelectDisk(USHORT); # endif /* OS2_32BITAPI */ #endif /* OS2_USESYSHEADERS */ slashem-0.0.7E7F3/include/dgn_file.h0000664000076400007640000000314210545462317015217 0ustar aliali/* 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. */ #ifndef DGN_FILE_H #define DGN_FILE_H #ifndef ALIGN_H #include "align.h" #endif /* * Structures manipulated by the dungeon loader & compiler */ struct couple { short base, rand; }; struct tmpdungeon { char name[24], protoname[24]; struct couple lev; int flags, chance, levels, branches; char boneschar; }; struct tmplevel { char name[24]; struct couple lev; int chance, rndlevs, chain, flags; char boneschar; }; struct tmpbranch { char name[24]; /* destination dungeon name */ struct couple lev; int chain; /* index into tmplevel array (chained branch)*/ int type; /* branch type (see below) */ int up; /* branch is up or down */ int entry_lev; /* entry level in target dungeon */ }; /* * Values for type for tmpbranch structure. */ #define TBR_STAIR 0 /* connection with both ends having a staircase */ #define TBR_NO_UP 1 /* connection with no up staircase */ #define TBR_NO_DOWN 2 /* connection with no down staircase */ #define TBR_PORTAL 3 /* portal connection */ /* * Flags that map into the dungeon flags bitfields. */ #define TOWN 1 /* levels only */ #define HELLISH 2 #define MAZELIKE 4 #define ROGUELIKE 8 #define D_ALIGN_NONE 0 #define D_ALIGN_CHAOTIC (AM_CHAOTIC << 4) #define D_ALIGN_NEUTRAL (AM_NEUTRAL << 4) #define D_ALIGN_LAWFUL (AM_LAWFUL << 4) #define D_ALIGN_MASK 0x70 /* * Max number of prototype levels and branches. */ #define LEV_LIMIT 99 #define BRANCH_LIMIT 32 #endif /* DGN_FILE_H */ slashem-0.0.7E7F3/include/egyp.h0000664000076400007640000000143610545462317014420 0ustar aliali/*** egyp.h ***/ #ifndef EGYP__H #define EGYP__H /*** Card definitions ***/ #define CARD_SUITS 4 /* Number of suits */ #define CARD_RANKS 13 /* Number of cards in each suit */ #define CARD_TRUMPS 20 /* Number of trump cards */ #define CARD_SUITED (CARD_SUITS * CARD_RANKS) #define CARD_FOOL CARD_SUITED #define CARD_TOTAL (CARD_SUITED + CARD_TRUMPS) #define card_istrump(c) ((c) >= CARD_SUITED) #define card_suit(c) ((c) / CARD_RANKS) #define card_rank(c) ((c) % CARD_RANKS) #define card_trump(c) ((c) - CARD_SUITED) /*** Monster definitions ***/ struct egyp { long credit; /* Amount credited to player */ int top; /* Index of top of the deck */ xchar cards[CARD_TOTAL]; /* Shuffled cards */ }; #define EGYP(mon) ((struct egyp *)&(mon)->mextra[0]) #endif /* EGYP__H */ slashem-0.0.7E7F3/include/unixconf.h0000644000076400007640000003257110545462317015307 0ustar aliali/* 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. */ #ifdef UNIX #ifndef UNIXCONF_H #define UNIXCONF_H /* * Some include files are in a different place under SYSV * BSD SYSV * * * * Some routines are called differently * index strchr * rindex strrchr * */ /* define exactly one of the following four choices */ /* #define BSD 1 */ /* define for 4.n/Free/Open/Net BSD */ /* also for relatives like SunOS 4.x, DG/UX, and */ /* older versions of Linux */ /* #define ULTRIX */ /* define for Ultrix v3.0 or higher (but not lower) */ /* Use BSD for < v3.0 */ /* "ULTRIX" not to be confused with "ultrix" */ #define SYSV /* define for System V, Solaris 2.x, newer versions */ /* of Linux */ /* #define HPUX */ /* Hewlett-Packard's Unix, version 6.5 or higher */ /* use SYSV for < v6.5 */ /* define any of the following that are appropriate */ #define SVR4 /* use in addition to SYSV for System V Release 4 */ /* including Solaris 2+ */ #define NETWORK /* if running on a networked system */ /* e.g. Suns sharing a playground through NFS */ /* #define SUNOS4 */ /* SunOS 4.x */ /* #define LINUX */ /* Another Unix clone */ /* #define CYGWIN32 */ /* Unix on Win32 -- use with case sensitive defines */ /* #define GENIX */ /* Yet Another Unix Clone */ /* #define HISX */ /* Bull Unix for XPS Machines */ /* #define BOS */ /* Bull Open Software - Unix for DPX/2 Machines */ /* #define UNIXPC */ /* use in addition to SYSV for AT&T 7300/3B1 */ /* #define AIX_31 */ /* In AIX 3.1 (IBM RS/6000) use BSD ioctl's to gain * job control (note that AIX is SYSV otherwise) * Also define this for AIX 3.2 */ #define TERMINFO /* uses terminfo rather than termcap */ /* Should be defined for most SYSV, SVR4 (including * Solaris 2+), HPUX, and Linux systems. In * particular, it should NOT be defined for the UNIXPC * unless you remove the use of the shared library in * the Makefile */ #define TEXTCOLOR /* Use System V r3.2 terminfo color support */ /* and/or ANSI color support on termcap systems */ /* and/or X11 color */ #define POSIX_JOB_CONTROL /* use System V / Solaris 2.x / POSIX job control */ /* (e.g., VSUSP) */ #define POSIX_TYPES /* use POSIX types for system calls and termios */ /* Define for many recent OS releases, including * those with specific defines (since types are * changing toward the standard from earlier chaos). * For example, platforms using the GNU libraries, * Linux, Solaris 2.x */ /* #define OPENWINBUG */ /* avoid a problem using OpenWindows 3.0 for X11 on SunOS 4.1.x, x>= 2. Do not define for other X11 implementations. */ /* #define PYRAMID_BUG */ /* avoid a bug on the Pyramid */ /* #define BSD_43_BUG */ /* for real 4.3BSD cc's without schain botch fix */ /* #define MICROPORT_BUG */ /* problems with large arrays in structs */ /* #define MICROPORT_286_BUG */ /* changes needed in termcap.c to get it to run with Microport Sys V/AT version 2.4. By Jay Maynard */ /* #define AIXPS_2BUG */ /* avoid a problem with little_to_big() optimization */ /* #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 with built-in VPIX support */ /* * ALI * * File areas can be used to place different Slash'EM files in different * directories. This is necessary to comply with Linux's FSSTD 1.2 and its * replacement FHS 2.0. Currently, these are only implemented for UNIX, but * other ports could follow suit by including similar defines in their port * specific config files and implementing the relevent functions. * * File areas are supposed to be opaque; that is the core system does not * interpret them in any way, it simply passes them to the port specific * functions to handle. This means that while the obvious mapping is onto * directories, there is nothing in the core code that assumes this. Non-UNIX * ports in particular may find that a more general mapping is desirable. * * The following file areas are supported: * * FILE_AREA_SAVE For save files (R/W) * FILE_AREA_BONES For bones files (R/W) * FILE_AREA_LEVL For level files (R/W) * FILE_AREA_VAR For other files which may be modified by Slash'EM * FILE_AREA_SHARE For read-only, architechure independent, files * FILE_AREA_UNSHARE For read-only, architechure dependent, files * FILE_AREA_DOC For human-readable documentation */ /* #define FILE_AREAS */ /* Use file areas */ #ifdef FILE_AREAS /* * File areas compatible with Linux's FSSTND 1.2. * Note: This has been superceeded by FHS 2.0, but is included because * many systems still seem to use it. */ /* #define FILE_AREA_VAR "/var/lib/games/slashem/" */ /* #define FILE_AREA_SAVE "/var/lib/games/slashem/save/" */ /* #define FILE_AREA_SHARE "/usr/lib/games/slashem/" */ /* #define FILE_AREA_UNSHARE "/usr/lib/games/slashem/" */ /* #define FILE_AREA_DOC "/usr/doc/slashem/" */ /* * File areas compatible with FHS 2.0 */ #define FILE_AREA_VAR "/var/games/slashem/" #define FILE_AREA_SAVE "/var/games/slashem/save/" #define FILE_AREA_SHARE "/usr/share/games/slashem/" #define FILE_AREA_UNSHARE "/usr/lib/games/slashem/" #define FILE_AREA_DOC "/usr/share/doc/slashem/" #define FILE_AREA_BONES FILE_AREA_VAR #define FILE_AREA_LEVL FILE_AREA_VAR #endif /* FILE_AREAS */ /* * The next two defines are intended mainly for the Andrew File System, * which does not allow hard links. If NO_FILE_LINKS is defined, lock files * will be created in LOCKDIR using open() instead of in the playground using * link(). * Ralf Brown, 7/26/89 (from v2.3 hack of 10/10/88) */ /* #define NO_FILE_LINKS */ /* if no hard links */ #ifdef NO_FILE_LINKS # ifdef FILE_AREAS # define LOCKDIR FILE_AREA_VAR /* where to put locks */ # else # define LOCKDIR "/usr/games/lib/nethackdir" /* where to put locks */ # endif #endif /* * Define DEF_PAGER as your default pager, e.g. "/bin/cat" or "/usr/ucb/more" * If defined, it can be overridden by the environment variable PAGER. * Hack will use its internal pager if DEF_PAGER is not defined. * (This might be preferable for security reasons.) * #define DEF_PAGER ".../mydir/mypager" */ /* * If you want the static parts of your playground on a read-only file * system, define VAR_PLAYGROUND to be where the variable parts are kept. */ /* #define VAR_PLAYGROUND "/var/lib/games/nethack" */ /* * Define PORT_HELP to be the name of the port-specfic help file. * This file is found in HACKDIR. * Normally, you shouldn't need to change this. * There is currently no port-specific help for Unix systems. */ /* #define PORT_HELP "Unixhelp" */ #ifdef TTY_GRAPHICS /* * To enable the `timed_delay' option for using a timer rather than extra * screen output when pausing for display effect. Requires that `msleep' * function be available (with time argument specified in milliseconds). * Various output devices can produce wildly varying delays when the * "extra output" method is used, but not all systems provide access to * a fine-grained timer. */ /* #define TIMED_DELAY */ /* usleep() */ # ifdef TEXTCOLOR # define VIDEOSHADES # endif #endif /* * If you define MAIL, then the player will be notified of new mail * when it arrives. If you also define DEF_MAILREADER then this will * be the default mail reader, and can be overridden by the environment * variable MAILREADER; otherwise an internal pager will be used. * A stat system call is done on the mailbox every MAILCKFREQ moves. */ #define MAIL /* Deliver mail during the game */ /* The Andrew Message System does mail a little differently from normal * UNIX. Mail is deposited in the user's own directory in ~/Mailbox * (another directory). MAILBOX is the element that will be added on to * the user's home directory path to generate the Mailbox path - just in * case other Andrew sites do it differently from CMU. * * dan lovinger * dl2n+@andrew.cmu.edu (dec 19 1989) */ /* #define AMS */ /* use Andrew message system for mail */ /* NO_MAILREADER is for kerberos authenticating filesystems where it is * essentially impossible to securely exec child processes, like mail * readers, when the game is running under a special token. * * dan */ /* #define NO_MAILREADER */ /* have mail daemon just tell player of mail */ #ifdef MAIL # if defined(BSD) || defined(ULTRIX) # ifdef AMS #define AMS_MAILBOX "/Mailbox" # else # if defined(__FreeBSD__) || defined(__OpenBSD__) #define DEF_MAILREADER "/usr/bin/mail" # else #define DEF_MAILREADER "/usr/ucb/Mail" # endif # endif #else # if (defined(SYSV) || defined(DGUX) || defined(HPUX)) && !defined(LINUX) # if defined(M_XENIX) #define DEF_MAILREADER "/usr/bin/mail" # else # ifdef __sgi #define DEF_MAILREADER "/usr/sbin/Mail" # else #define DEF_MAILREADER "/usr/bin/mailx" # endif # endif # else #define DEF_MAILREADER "/bin/mail" # endif #endif #define MAILCKFREQ 50 #endif /* MAIL */ #ifdef COMPRESS /* Some implementations of compress need a 'quiet' option. * If you've got one of these versions, put -q here. * You can also include any other strange options your compress needs. * If you have a normal compress, just leave it commented out. */ /* #define COMPRESS_OPTIONS "-q" */ #endif #define FCMASK 0660 /* file creation mask */ /* * The remainder of the file should not need to be changed. */ #ifdef _AUX_SOURCE # ifdef AUX /* gcc ? */ # define _SYSV_SOURCE # define _BSD_SOURCE #else # define AUX # endif #endif /* _AUX_SOURCE */ #if defined(LINUX) || defined(bsdi) # ifndef POSIX_TYPES # define POSIX_TYPES # endif # ifndef POSIX_JOB_CONTROL # define POSIX_JOB_CONTROL # endif #endif /* * BSD/ULTRIX systems are normally the only ones that can suspend processes. * Suspending NetHack processes cleanly should be easy to add to other systems * that have SIGTSTP in the Berkeley sense. Currently the only such systems * known to work are HPUX and AIX 3.1; other systems will probably require * tweaks to unixtty.c and ioctl.c. * * POSIX defines a slightly different type of job control, which should be * equivalent for NetHack's purposes. POSIX_JOB_CONTROL should work on * various recent SYSV versions (with possibly tweaks to unixtty.c again). */ #ifndef POSIX_JOB_CONTROL # if defined(BSD) || defined(ULTRIX) || defined(HPUX) || defined(AIX_31) # define BSD_JOB_CONTROL # else # if defined(SVR4) # define POSIX_JOB_CONTROL # endif # endif #endif #if defined(BSD_JOB_CONTROL) || defined(POSIX_JOB_CONTROL) || defined(AUX) #define SUSPEND /* let ^Z suspend the game */ #endif #if defined(BSD) || defined(ULTRIX) #include #else #include #endif #define HLOCK "perm" /* an empty file used for locking purposes */ #define HLOCK_AREA FILE_AREA_VAR #ifndef REDO #define Getchar nhgetch #endif #define tgetch getchar #define SHELL /* do not delete the '!' command */ /* -AJA- Escaping to a shell doesn't work when SDL port is running * fullscreen (makes the computer seem frozen). Undefining * `SHELL' is a bit blunt though... */ #if defined(GL_GRAPHICS) || defined(SDL_GRAPHICS) #undef SHELL #endif #include "system.h" #if defined(POSIX_TYPES) || defined(__GNUC__) #include #include #endif #if defined(POSIX_TYPES) || defined(__GNUC__) || defined(BSD) || defined(ULTRIX) #include #endif #if defined(BSD) || defined(ULTRIX) # if !defined(DGUX) && !defined(SUNOS4) #define memcpy(d, s, n) bcopy(s, d, n) #define memcmp(s1, s2, n) bcmp(s2, s1, n) # endif # ifdef SUNOS4 #include # endif #else /* therefore SYSV */ # ifndef index /* some systems seem to do this for you */ #define index strchr # endif # ifndef rindex #define rindex strrchr # endif #endif /* Use the high quality random number routines. */ #if defined(BSD) || defined(LINUX) || defined(ULTRIX) || defined(CYGWIN32) || defined(RANDOM) #define Rand() random() #else #define Rand() lrand48() #endif #ifdef TIMED_DELAY # if defined(SUNOS4) || defined(LINUX) || defined(SVR4) /* [max] added SVR4 */ # define msleep(k) usleep((k)*1000) # endif # ifdef ULTRIX # define msleep(k) napms(k) # endif #endif #ifdef hc /* older versions of the MetaWare High-C compiler define this */ # ifdef __HC__ # undef __HC__ # endif # 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 */ #if defined(MENU_COLOR) && defined(USE_REGEX_MATCH) # include # ifndef RE_NO_GNU_OPS # define POSIX_REGEX # else # define GNU_REGEX # endif #endif #endif /* UNIXCONF_H */ #endif /* UNIX */ slashem-0.0.7E7F3/include/winGTK.h0000664000076400007640000003621510545462317014622 0ustar aliali/* $Id: winGTK.h,v 1.54 2004/04/10 15:41:21 j_ali Exp $ */ #ifndef WINGTK_H #define WINGTK_H #include #include #ifndef WIN32 #define WINGTK_X11 /* X11 libraries are available for our use */ #ifdef DEBUG #define MONITOR_XRESOURCES /* Debugging */ #endif #endif #define GTK_GRAPHICS /* Needed when building an external interface */ #ifdef GTKHACK #define GTK_PROXY #endif #ifdef WINGTK_X11 #include #include #ifdef MONITOR_XRESOURCES #include #endif #include #endif #include "hack.h" #include "wintty.h" #include "nhxdr.h" #include "proxycom.h" #define WINGTK_MENU_IMAGES /* Pretty images (tiles) in first column */ #define WINGTK_RADAR /* Radar map window */ #define NHW_NONE 0 /* Unallocated window type. Must be */ /* different from any other NHW_* type. */ #define PROXY_CLNT_LOGGED 0x80000000UL /* Unallocated proxy clnt flag. */ #define NH_PAD 5 #define NH_SESSION_RESIZABLE 1 /* Allow the user to resize window */ #define NH_SESSION_USER_POS 2 /* Window position from user */ #define NH_SESSION_USER_SIZE 4 /* Window size from user */ #define NH_SESSION_PLACED 8 /* Initial window placement has occured */ struct gtkhackrc; typedef struct _NhGtkProgressWindow NhGtkProgressWindow; extern GtkWidget *nh_gtk_window_dialog(boolean is_modal); extern void nh_gtk_focus_set_master(GtkWindow *w, GtkSignalFunc func, gpointer data, gboolean use_focus_keys); extern void nh_gtk_focus_set_slave_for(GtkWindow *w, GtkWindow *slave_for); extern GtkWidget *nh_session_window_new(const char *name); extern unsigned long nh_session_window_flags(const char *name); extern int nh_session_set_geometry(const char *name, int x, int y, int width, int height); extern int nh_session_save(struct gtkhackrc *rc); extern int nh_read_gtkhackrc(void); extern void nh_write_gtkhackrc(void); extern void nh_gtkhackrc_store(struct gtkhackrc *rc, const char *fmt, ...); extern void nh_game_preferences(GtkWidget *w, gpointer data); extern GtkWidget *nh_gtk_new(GtkWidget *w, GtkWidget *parent, gchar *lbl); extern GtkWidget *nh_gtk_new_and_add(GtkWidget *w, GtkWidget *parent, gchar *lbl); extern GtkWidget *nh_gtk_new_and_pack(GtkWidget *w, GtkWidget *parent, gchar *lbl, gboolean a1, gboolean a2, guint a3); extern GtkWidget *nh_gtk_new_and_attach(GtkWidget *w, GtkWidget *parent, gchar *lbl, guint a1, guint a2, guint a3, guint a4); extern GtkWidget *nh_gtk_new_and_attach2(GtkWidget *w, GtkWidget *parent, gchar *lbl, guint a1, guint a2, guint a3, guint a4, GtkAttachOptions xoptions, GtkAttachOptions yoptions, guint xpadding, guint ypadding); #define N_NH_COLORS (CLR_MAX + 3) extern GdkColor nh_color[N_NH_COLORS]; enum { MAP_DARK_GREEN = CLR_MAX, MAP_BLACK, MAP_WHITE }; extern GtkWidget *main_window; #define NH_BUFSIZ 4096 #define NH_TEXT_REMEMBER 4096 enum xshm_map_mode { XSHM_MAP_NONE, XSHM_MAP_IMAGE, XSHM_MAP_PIXMAP, XSHM_MAP_PIXBUF }; extern struct window_ext_procs GTK_ext_procs; extern void win_GTK_init(void); extern void GTK_init_nhwindows(char ***capvp); extern void GTK_init_gtk(int *argc, char **argv); extern int GTK_ext_init_nhwindows(int *, char **, char ***); extern char *GTK_ext_askname(void); extern int GTK_ext_player_selection(int *, int *, int *, int *); extern int nh_set_help_font(gchar *name); #ifdef GTKHACK extern int nh_help_save(struct gtkhackrc *rc); #endif extern void GTK_ext_display_file(int fh); extern void GTK_ext_add_menu(winid, int, int, CHAR_P, CHAR_P, int, const char *, BOOLEAN_P); extern int GTK_ext_select_menu(winid, int, struct proxy_mi **); extern void GTK_ext_print_glyph(winid id, int x, int y, int glyph); extern void GTK_ext_print_glyph_layered(winid id, int nl, struct proxy_glyph_layer *layers); extern char GTK_ext_yn_function(const char *, const char *, CHAR_P, int *); extern int GTK_ext_outrip(winid, char *); extern char *GTK_getline(const char *query, boolean cancelable); extern char *GTK_ext_getlin(const char *query); extern void GTK_get_nh_event(void); extern void GTK_exit_nhwindows(const char *); extern void GTK_suspend_nhwindows(void); extern void GTK_resume_nhwindows(void); extern winid GTK_create_nhwindow(int); extern void GTK_ext_clear_nhwindow(winid, int, int, int); extern void GTK_display_nhwindow(winid, BOOLEAN_P); extern void GTK_destroy_nhwindow(winid); extern void GTK_curs(winid, int, int); extern void GTK_putstr(winid, int, const char *); extern void GTK_start_menu(winid); extern void GTK_end_menu(winid, const char *); extern void GTK_update_inventory(void); extern void GTK_mark_synch(void); extern void GTK_wait_synch(void); #ifdef CLIPPING extern void GTK_cliparound(int, int); #endif extern int GTK_nhgetch(void); extern int GTK_nh_poskey(int *, int *, int *); extern void GTK_nhbell(void); extern int GTK_doprev_message(void); extern void GTK_extcmd_set(int cmd); extern int GTK_get_ext_cmd(void); extern void GTK_number_pad(int); extern void GTK_delay_output(void); extern void GTK_start_screen(void); extern void GTK_end_screen(void); extern void GTK_raw_print(const char *); extern void GTK_raw_print_bold(const char *); extern void GTK_ext_preference_update(const char *, const char *); #ifdef GTKHACK extern void GTK_ext_send_config_file(int); #endif extern GdkPixmap *GTK_glyph_to_gdkpixmap(int); extern GtkWidget *nh_map_new(GtkWidget *); extern void nh_map_destroy(void); extern void nh_map_clear(int, int, int); extern void nh_map_check_visibility(void); extern void nh_map_pos(int *, int *, int *); extern void nh_map_click(int); extern void nh_map_flush(void); extern void nh_map_color_changed(boolean); extern void nh_map_hilite_pet_changed(boolean); extern int nh_set_map_visual(int); extern int nh_set_map_font(gchar *name); extern gchar *nh_get_map_font(void); extern int nh_get_map_visual(void); extern int nh_check_map_visual(int); extern GtkWidget *GTK_preferences_new(void); extern int main_hook(int *watch); extern void quit_hook(void); extern gint GTK_default_key_press(GtkWidget *widget, GdkEventKey *event, gpointer data); extern gint GTK_default_focus_in(GtkWidget *widget, GdkEventFocus *event, gpointer data); extern GtkWidget *nh_radar_new(void); extern boolean nh_radar_get_use(void); extern void nh_radar_set_use(boolean use); extern void nh_radar_update(void); extern GtkWidget *nh_message_new(void); extern void nh_message_destroy(void); extern void nh_message_putstr(const char *); extern GtkWidget *nh_status_new(void); extern boolean nh_status_in_trouble(void); extern char *nh_status_last_displayed(char *quan); extern void GTK_ext_status(int, int, const char **); extern int nh_keysym(GdkEventKey *ev); extern int nh_dir_keysym(GdkEventKey *ev); extern void nh_option_new(void); extern void nh_option_lock(boolean); extern int nh_option_cache_sync(void); extern void nh_option_cache_set(char *option, const char *value); extern void nh_option_cache_set_bool(char *option, boolean value); extern void nh_option_cache_set_addr(char *option, char **addr); extern void nh_option_cache_set_bool_addr(char *option, boolean *addr); extern void nh_option_cache_set_callback(char *, void (*)(char *)); extern void nh_option_cache_set_bool_callback(char *, void (*)(boolean)); extern char *nh_option_cache_get(char *option); extern boolean nh_option_cache_get_bool(char *option); #ifdef GTK_PROXY extern struct proxycb_get_glyph_mapping_res * nh_proxy_cache_get_glyph_mapping(GtkWidget *progress_window); extern char *nh_proxy_cache_dlbh_fmd5sum(const char *name); extern void nh_proxy_cache_set_dir(const char *dir); extern int nh_proxy_cache_save(struct gtkhackrc *rc); extern char *nh_proxy_cache_file(const char *class, const char *name); extern void nh_proxy_cache_mkdir(const char *class, const char *name); extern char *nh_proxy_game_cache_file(const char *name); extern NhExtIO *GTK_io_open(const char *filename, unsigned int flags); extern int GTK_io_close(NhExtIO *io); #endif extern int nh_dlbh_fopen(const char *class, const char *name, const char *mode); extern int nh_dlbh_fclose(int fh); extern char *nh_dlbh_fgets(char *buf, int len, int fh); extern int nh_dlbh_fread(char *buf, int size, int quan, int fh); extern int nh_dlbh_fseek(int fh, long pos, int whence); extern int nh_dlbh_ftell(int fh); extern int nh_tile_height(); extern int nh_tile_3dheight(); extern void nh_position_popup_dialog(GtkWidget *w); /* * topten.c */ extern int create_toptenwin(); struct cached_options { boolean num_pad; boolean use_color; boolean hilite_pet; boolean perm_invent; } copts; struct menu { GtkCList *clist; const char *prompt; struct _NHMenuItem *nhMenuItem; int alloc_menuitem; int n_menuitem; int c_menuitem; }; struct menu_info_t { struct menu curr_menu; /* Menu being displayed. */ struct menu new_menu; /* New menu being built. */ /* * cancelled may take the following values: * 0 Menu window is blocking on user input * 1 Menu window is being torn down * -1 Menu window is non-blocking */ int cancelled; int n_select; int selmode; int keysym; int valid_widgets; long count; /* Pending count */ #ifdef WINGTK_MENU_IMAGES int pixmaps; /* Set if any pixmaps set in clist */ #endif }; #ifdef md5_INCLUDED struct text_info_t { md5_state_t md5_state; GtkTextBuffer *buffer; }; #endif #define NHWF_DISPLAYED 1 typedef struct _NHWindow{ int type; unsigned flags; guint hid; GtkWidget *w; GtkWidget *hbox, *hbox2, *hbox3; GtkWidget *vbox; GtkWidget *clist; GtkWidget *scrolled, *scrolled2; GtkWidget *frame; GtkAdjustment *adj, *adj2; int n_button; GtkWidget *button[20]; union { struct menu_info_t *Menu_info; /* menu window info */ struct text_info_t *Text_info; /* text window info */ } Win_info; } NHWindow; /* Defines to use for the window information union. */ #define menu_information Win_info.Menu_info #define text_information Win_info.Text_info #ifdef md5_INCLUDED /* This linked list describes non-blocking text windows which may have no * corresponding NetHack window (ie., the game has called destroy_nhwindow). */ extern struct nbtw { GtkWidget *w; md5_byte_t digest[16]; /* MD5 checksum of window contents */ struct nbtw *next; } *non_blocking_text_windows; #endif typedef struct _TileTab{ char *ident; char *file; #ifdef GTK_PROXY char *mapfile; #endif int tilemap_width, tilemap_height; int unit_width, unit_height; int ofsetx_3d; int ofsety_3d; int transparent:1; int spread:1; void *data; } TileTab; extern TileTab tileTab[]; extern int no_tileTab; extern int stone_tile; #ifdef GTK_PROXY #undef NO_GLYPH extern int no_glyph; #define NO_GLYPH no_glyph #endif extern GtkWidget *xshm_map_init(enum xshm_map_mode, int width, int height); extern void xshm_map_button_handler(GtkSignalFunc func, gpointer data); extern void xshm_map_flush(); extern void xshm_map_cliparound(int x, int y); extern void xshm_map_destroy(); extern void xshm_map_clear(); extern void xshm_map_tile_draw(int dst_x, int dst_y); extern void xshm_map_draw(GdkRectangle *rect); extern void xshm_map_draw_image(GdkImage *src, int src_x, int src_y, int dest_x, int dest_y, int width, int height); extern void xshm_map_draw_drawable(GdkDrawable *src, int src_x, int src_y, int dest_x, int dest_y, int width, int height); extern GtkAdjustment *xshm_map_get_hadjustment(void); extern GtkAdjustment *xshm_map_get_vadjustment(void); extern void x_tile_init_add_stages(TileTab *t, NhGtkProgressWindow *w); extern enum xshm_map_mode x_tile_init(TileTab *t, NhGtkProgressWindow *w); extern void x_tile_tmp_clear(); extern int x_tile_render_to_drawable(GdkDrawable *drawable, GdkGC *gc, int tile, int src_x, int src_y, int dest_x, int dest_y, int width, int height); extern void x_tile_draw_rectangle(int dstx, int dsty, GdkColor *c); extern void x_tile_draw_tile(int tile, int dstx, int dsty); extern void x_tile_draw_tmp(int dstx, int dsty); extern void x_tile_tmp_draw_tile(int tile, int ofsx, int ofsy); extern void x_tile_tmp_draw_rectangle(int ofsx, int ofsy, int c); extern void x_tile_destroy(); /* * These must agree with the table in gtkextcmd.c -ALI */ #define EXT_CMD_ADJUST 0 #define EXT_CMD_BORROW 1 #define EXT_CMD_CHAT 2 #define EXT_CMD_CONDUCT 3 #define EXT_CMD_DIP 4 #define EXT_CMD_ENHANCE 5 #define EXT_CMD_EXPLORE 6 #define EXT_CMD_FORCE 7 #define EXT_CMD_INVOKE 8 #define EXT_CMD_JUMP 9 #define EXT_CMD_LOOT 10 #define EXT_CMD_MONSTER 11 #define EXT_CMD_NAME 12 #define EXT_CMD_OFFER 13 #define EXT_CMD_PRAY 14 #define EXT_CMD_QUIT 15 #define EXT_CMD_RIDE 16 #define EXT_CMD_RUB 17 #define EXT_CMD_SIT 18 #define EXT_CMD_TECHNIQUE 19 #define EXT_CMD_TURN 20 #define EXT_CMD_TWOWEAPON 21 #define EXT_CMD_UNTRAP 22 #define EXT_CMD_VERSION 23 #define EXT_CMD_WIPE 24 #define EXT_CMD_YOUPOLY 25 #define NO_EXT_CMD_MAPS 26 /* Current Map Mode */ extern int map_visual; /* Current Map Clipping Squared distance */ extern int map_clip_dist2; /* Current map cursor position */ extern int cursx, cursy; /* Xshm map rasters. Warning: only one of these will be valid */ extern GdkImage *xshm_map_image; extern GdkPixmap *xshm_map_pixmap; extern GdkPixbuf *xshm_map_pixbuf; #if defined(MONITOR_HEAP) && defined(INTERNAL_MALLOC) #define XCreatePixmap(dpy, root, width, height, depth) \ (monitor_heap_push(__FILE__, __LINE__), \ monitor_heap_pop(__FILE__, __LINE__, \ (XCreatePixmap)(dpy, root, width, height, depth))) #define gdk_pixmap_new(w, width, height, depth) \ (GdkPixmap *)(monitor_heap_push(__FILE__, __LINE__), \ monitor_heap_pop(__FILE__, __LINE__, \ (unsigned long)(gdk_pixmap_new)(w, width, height, depth))) #define gdk_image_new(type, visual, width, height) \ (GdkImage *)(monitor_heap_push(__FILE__, __LINE__), \ monitor_heap_pop(__FILE__, __LINE__, \ (unsigned long)(gdk_image_new)(type, visual, width, height))) #define gtk_window_new(type) \ (GtkWidget *)(monitor_heap_push(__FILE__, __LINE__), \ monitor_heap_pop(__FILE__, __LINE__, \ (unsigned long)(gtk_window_new)(type))) #define gtk_hbox_new(homogeneous, spacing) \ (GtkWidget *)(monitor_heap_push(__FILE__, __LINE__), \ monitor_heap_pop(__FILE__, __LINE__, \ (unsigned long)(gtk_hbox_new)(homogeneous, spacing))) #define gtk_vbox_new(homogeneous, spacing) \ (GtkWidget *)(monitor_heap_push(__FILE__, __LINE__), \ monitor_heap_pop(__FILE__, __LINE__, \ (unsigned long)(gtk_vbox_new)(homogeneous, spacing))) #define gtk_clist_new(columns) \ (GtkWidget *)(monitor_heap_push(__FILE__, __LINE__), \ monitor_heap_pop(__FILE__, __LINE__, \ (unsigned long)(gtk_clist_new)(columns))) #endif #ifndef GTKHACK #define nh_strncmpi strncmpi #endif #ifdef GTKHACK enum { COLUMN_NAME, COLUMN_SCHEME, COLUMN_ADDRESS, COLUMN_FLAGS, N_COLUMNS }; extern GtkTreeRowReference *GTK_default_connection, *GTK_current_connection; extern GtkListStore *GTK_connections; extern GtkTextBuffer *GTK_nhext_log; extern GtkTreeRowReference *GTK_connection_lookup(const char *name); extern void GTK_connection_set_default(const char *name); extern void GTK_connection_add(const char *name, const char *scheme, const char *address, unsigned long flags); extern void gtkhack_enable_logging(gboolean setting); extern GtkWidget *GTK_troubleshooting_new(void); #endif #endif /* WINGTK_H */ slashem-0.0.7E7F3/include/nhxdr.h0000664000076400007640000001071110545462317014573 0ustar aliali/* $Id: nhxdr.h,v 1.7 2003/10/25 18:06:00 j_ali Exp $ */ /* Copyright (c) Slash'EM Development Team 2001-2003 */ /* NetHack may be freely redistributed. See license for details. */ #ifndef NHXDR_H #define NHXDR_H #ifndef FALSE #define FALSE 0 #endif #ifndef TRUE #define TRUE 1 #endif #ifndef MIN #define MIN(a, b) ((a) <= (b) ? (a) : (b)) #endif #ifndef MAX #define MAX(a, b) ((a) >= (b) ? (a) : (b)) #endif #ifndef NDECL /* * Assume an ANSI X3.159 compatible compiler */ #define NDECL(f) (f)(void) #define FDECL(f, p) (f)p #define VDECL(f, p) (f)p #define CHAR_P int #define SHORT_P int #define BOOLEAN_P int #endif #define NHEXT_XDR_RNDUP(x) (((x) - 1 | 3) + 1) typedef enum { nhext_xdr_false = 0, nhext_xdr_true = 1 } nhext_xdr_bool_t; enum nhext_xdr_op { NHEXT_XDR_ENCODE, NHEXT_XDR_DECODE, NHEXT_XDR_FREE, NHEXT_XDR_COUNT }; typedef struct nhext_xdr { void *x_data; enum nhext_xdr_op x_op; nhext_xdr_bool_t (*x_write)(struct nhext_xdr *xdrs, const void *addr, int size); nhext_xdr_bool_t (*x_read)(struct nhext_xdr *xdrs, void *addr, int size); void (*x_destroy)(struct nhext_xdr *xdrs); unsigned int x_pos, x_size; } NhExtXdr; typedef struct NhExtIO_ NhExtIO; typedef int (*nhext_io_func)(void *handle, void *buf, unsigned int len); typedef struct NhExtNB_ NhExtNB; #define E extern E unsigned int FDECL(nhext_xdr_getpos, (NhExtXdr *)); E nhext_xdr_bool_t FDECL(nhext_xdr_setpos, (NhExtXdr *, unsigned int)); E void FDECL(nhext_xdr_free, (nhext_xdr_bool_t (*)(), char *)); E void FDECL(nhext_xdrmem_create, (NhExtXdr *, char *, unsigned int, enum nhext_xdr_op)); E void FDECL(nhext_xdrio_create, (NhExtXdr *, NhExtIO *, enum nhext_xdr_op)); #define nhext_xdr_destroy(xdrs) (*(xdrs)->x_destroy)(xdrs) E nhext_xdr_bool_t FDECL(nhext_xdr_long, (NhExtXdr *, long *)); E nhext_xdr_bool_t FDECL(nhext_xdr_u_long, (NhExtXdr *, unsigned long *)); E nhext_xdr_bool_t FDECL(nhext_xdr_short, (NhExtXdr *, short *)); E nhext_xdr_bool_t FDECL(nhext_xdr_u_short, (NhExtXdr *, unsigned short *)); E nhext_xdr_bool_t FDECL(nhext_xdr_int, (NhExtXdr *, int *)); E nhext_xdr_bool_t FDECL(nhext_xdr_u_int, (NhExtXdr *, unsigned int *)); E nhext_xdr_bool_t FDECL(nhext_xdr_char, (NhExtXdr *, char *)); E nhext_xdr_bool_t FDECL(nhext_xdr_u_char, (NhExtXdr *, unsigned char *)); E nhext_xdr_bool_t FDECL(nhext_xdr_enum, (NhExtXdr *, int *)); E nhext_xdr_bool_t FDECL(nhext_xdr_bool, (NhExtXdr *, nhext_xdr_bool_t *)); E nhext_xdr_bool_t FDECL(nhext_xdr_string, (NhExtXdr *, char **, unsigned int)); E nhext_xdr_bool_t FDECL(nhext_xdr_bytes, (NhExtXdr *, char **, unsigned int *, unsigned int)); E nhext_xdr_bool_t FDECL(nhext_xdr_wrapstring, (NhExtXdr *, char **)); E nhext_xdr_bool_t FDECL(nhext_xdr_vector, (NhExtXdr *, char *, unsigned int, unsigned int, nhext_xdr_bool_t (*)())); E nhext_xdr_bool_t FDECL(nhext_xdr_array, (NhExtXdr *, char **, unsigned int *, unsigned int, unsigned int, nhext_xdr_bool_t (*)())); #define NHEXT_IO_RDONLY 1 #define NHEXT_IO_WRONLY 2 #define NHEXT_IO_NBLOCK 4 #define NHEXT_IO_NOAUTOFILL 8 #define NHEXT_IO_LINEBUF 16 /* Only honoured by text based calls */ #define NHEXT_IO_SIMPLEBUFFER 32 #define NHEXT_IO_PENDING 64 #if __GNUC__ >= 3 || __GNUC__ == 2 && __GNUC_MINOR__ >= 5 #define NHEXT__PRINTF(p_fmt, p_arg0) \ __attribute__((format(printf, p_fmt, p_arg0))) #else #define NHEXT__PRINTF(p_fmt, p_arg0) #endif E NhExtIO *FDECL(nhext_io_open, (nhext_io_func, void *, unsigned int)); E int FDECL(nhext_io_close, (NhExtIO *)); E unsigned int FDECL(nhext_io_getmode, (NhExtIO *)); E void FDECL(nhext_io_setmode, (NhExtIO *, unsigned int)); E void FDECL(nhext_io_setautofill_limit, (NhExtIO *, unsigned int)); E void FDECL(nhext_io_setnbfunc, (NhExtIO *, nhext_io_func)); E int FDECL(nhext_io_filbuf, (NhExtIO *, int)); E int FDECL(nhext_io_getc, (NhExtIO *)); E int FDECL(nhext_io_read, (NhExtIO *, char *, int)); E char *FDECL(nhext_io_getpacket, (NhExtIO *, int *)); E int FDECL(nhext_io_willblock, (NhExtIO *)); E int FDECL(nhext_io_flush, (NhExtIO *)); E int FDECL(nhext_io_fputc, (int, NhExtIO *)); E int FDECL(nhext_io_write, (NhExtIO *, char *, int)); E int FDECL(nhext_io_writet, (NhExtIO *, char *, int)); #ifdef _STDARG_H E int FDECL(nhext_io_vprintf, (NhExtIO *, char *, va_list)); #endif E int FDECL(nhext_io_printf, (NhExtIO *, char *, ...)) NHEXT__PRINTF(2, 3); E NhExtNB *FDECL(nhext_nb_open, (nhext_io_func, void *)); E int FDECL(nhext_nb_close, (NhExtNB *)); E int FDECL(nhext_nb_read, (NhExtNB *, char *, int, int)); #endif /* NHXDR_H */ slashem-0.0.7E7F3/include/func_tab.h0000664000076400007640000000143710545462317015236 0ustar aliali/* 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. */ #ifndef FUNC_TAB_H #define FUNC_TAB_H struct func_tab { char f_char; boolean can_if_buried; int NDECL((*f_funct)); const char *f_text; }; struct ext_func_tab { const char *ef_txt, *ef_desc; int NDECL((*ef_funct)); boolean can_if_buried; }; extern struct ext_func_tab extcmdlist[]; /*WAC for the menus */ struct menu_tab { char m_char; boolean can_if_buried; int NDECL((*m_funct)); const char *m_item; const char *m_text; }; struct menu_list { const char *m_header; const char *m_parent; const struct menu_tab *m_menu; }; #endif /* FUNC_TAB_H */ slashem-0.0.7E7F3/include/wintty.h0000664000076400007640000002012310545462317015004 0ustar aliali/* SCCS Id: @(#)wintty.h 3.4 1996/02/18 */ /* Copyright (c) David Cohrs, 1991,1992 */ /* NetHack may be freely redistributed. See license for details. */ #ifndef WINTTY_H #define WINTTY_H #define E extern #ifndef WINDOW_STRUCTS #define WINDOW_STRUCTS /* menu structure */ typedef struct tty_mi { struct tty_mi *next; anything identifier; /* user identifier */ long count; /* user count */ char *str; /* description string (including accelerator) */ int attr; /* string attribute */ boolean selected; /* TRUE if selected by user */ char selector; /* keyboard accelerator */ char gselector; /* group accelerator */ } tty_menu_item; /* descriptor for tty-based windows */ struct WinDesc { int flags; /* window flags */ xchar type; /* type of window */ boolean active; /* true if window is active */ uchar offx, offy; /* offset from topleft of display */ short rows, cols; /* dimensions */ short curx, cury; /* current cursor position */ short maxrow, maxcol; /* the maximum size used -- for MENU wins */ /* maxcol is also used by WIN_MESSAGE for */ /* tracking the ^P command */ short *datlen; /* allocation size for *data */ char **data; /* window data [row][column] */ char *morestr; /* string to display instead of default */ tty_menu_item *mlist; /* menu information (MENU) */ tty_menu_item **plist; /* menu page pointers (MENU) */ short plist_size; /* size of allocated plist (MENU) */ short npages; /* number of pages in menu (MENU) */ short nitems; /* total number of items (MENU) */ short how; /* menu mode - pick 1 or N (MENU) */ char menu_ch; /* menu char (MENU) */ }; /* window flags */ #define WIN_CANCELLED 1 #define WIN_STOP 1 /* for NHW_MESSAGE; stops output */ /* descriptor for tty-based displays -- all the per-display data */ struct DisplayDesc { uchar rows, cols; /* width and height of tty display */ uchar curx, cury; /* current cursor position on the screen */ #ifdef TEXTCOLOR int color; /* current color */ #endif int attrs; /* attributes in effect */ int toplin; /* flag for topl stuff */ int rawprint; /* number of raw_printed lines since synch */ int inmore; /* non-zero if more() is active */ int inread; /* non-zero if reading a character */ int intr; /* non-zero if inread was interrupted */ winid lastwin; /* last window used for I/O */ char dismiss_more; /* extra character accepted at --More-- */ }; #endif /* WINDOW_STRUCTS */ #define MAXWIN 20 /* maximum number of windows, cop-out */ /* tty dependent window types */ #ifdef NHW_BASE #undef NHW_BASE #endif #define NHW_BASE 6 extern struct window_procs tty_procs; /* port specific variable declarations */ extern winid BASE_WINDOW; extern struct WinDesc *wins[MAXWIN]; extern struct DisplayDesc *ttyDisplay; /* the tty display descriptor */ extern char morc; /* last character typed to xwaitforspace */ extern char defmorestr[]; /* default --more-- prompt */ /* port specific external function references */ /* ### getline.c ### */ E void FDECL(xwaitforspace, (const char *)); /* ### termcap.c, video.c ### */ E void FDECL(tty_startup,(int*, int*)); #ifndef NO_TERMS E void NDECL(tty_shutdown); #endif #if defined(apollo) /* Apollos don't widen old-style function definitions properly -- they try to * be smart and use the prototype, or some such strangeness. So we have to * define UNWIDENDED_PROTOTYPES (in tradstdc.h), which makes CHAR_P below a * char. But the tputs termcap call was compiled as if xputc's argument * actually would be expanded. So here, we have to make an exception. */ E void FDECL(xputc, (int)); #else E void FDECL(xputc, (CHAR_P)); #endif E void FDECL(xputs, (const char *)); #if defined(SCREEN_VGA) || defined(SCREEN_8514) || defined(ALLEG_FX) E void FDECL(xputg, (int, int, unsigned)); #endif E void NDECL(cl_end); E void NDECL(clear_screen); E void NDECL(home); E void NDECL(standoutbeg); E void NDECL(standoutend); # if 0 E void NDECL(revbeg); E void NDECL(boldbeg); E void NDECL(blinkbeg); E void NDECL(dimbeg); E void NDECL(m_end); # endif E void NDECL(backsp); E void NDECL(graph_on); E void NDECL(graph_off); E void NDECL(cl_eos); /* * termcap.c (or facsimiles in other ports) is the right place for doing * strange and arcane things such as outputting escape sequences to select * a color or whatever. wintty.c should concern itself with WHERE to put * stuff in a window. */ E void FDECL(term_start_attr,(int attr)); E void FDECL(term_end_attr,(int attr)); E void NDECL(term_start_raw_bold); E void NDECL(term_end_raw_bold); #ifdef TEXTCOLOR E void NDECL(term_end_color); E void FDECL(term_start_color,(int color)); E int FDECL(has_color,(int color)); #endif /* TEXTCOLOR */ /* ### topl.c ### */ E void FDECL(addtopl, (const char *)); E void NDECL(more); E void FDECL(update_topl, (const char *)); E void FDECL(putsyms, (const char*)); /* ### wintty.c ### */ #ifdef CLIPPING E void NDECL(setclipped); #endif E void FDECL(docorner, (int, int)); E void NDECL(end_glyphout); E void FDECL(g_putch, (int)); E void NDECL(win_tty_init); /* external declarations */ E void FDECL(tty_init_nhwindows, (int *, char **)); E void NDECL(tty_player_selection); E void NDECL(tty_askname); E void NDECL(tty_get_nh_event) ; E void FDECL(tty_exit_nhwindows, (const char *)); E void FDECL(tty_suspend_nhwindows, (const char *)); E void NDECL(tty_resume_nhwindows); E winid FDECL(tty_create_nhwindow, (int)); E void FDECL(tty_clear_nhwindow, (winid)); E void FDECL(tty_display_nhwindow, (winid, BOOLEAN_P)); E void FDECL(tty_dismiss_nhwindow, (winid)); E void FDECL(tty_destroy_nhwindow, (winid)); E void FDECL(tty_curs, (winid,int,int)); E void FDECL(tty_putstr, (winid, int, const char *)); #ifdef FILE_AREAS E void FDECL(tty_display_file, (const char *, const char *, BOOLEAN_P)); #else E void FDECL(tty_display_file, (const char *, BOOLEAN_P)); #endif E void FDECL(tty_start_menu, (winid)); E void FDECL(tty_add_menu, (winid,int,const ANY_P *, CHAR_P,CHAR_P,int,const char *, BOOLEAN_P)); E void FDECL(tty_end_menu, (winid, const char *)); E int FDECL(tty_select_menu, (winid, int, MENU_ITEM_P **)); E char FDECL(tty_message_menu, (CHAR_P,int,const char *)); E void NDECL(tty_update_inventory); E void NDECL(tty_mark_synch); E void NDECL(tty_wait_synch); #ifdef CLIPPING E void FDECL(tty_cliparound, (int, int)); #endif #ifdef POSITIONBAR E void FDECL(tty_update_positionbar, (char *)); #endif E void FDECL(tty_print_glyph, (winid,XCHAR_P,XCHAR_P,int)); E void FDECL(tty_raw_print, (const char *)); E void FDECL(tty_raw_print_bold, (const char *)); E int NDECL(tty_nhgetch); E int FDECL(tty_nh_poskey, (int *, int *, int *)); E void NDECL(tty_nhbell); E int NDECL(tty_doprev_message); E char FDECL(tty_yn_function, (const char *, const char *, CHAR_P)); E void FDECL(tty_getlin, (const char *,char *)); E int NDECL(tty_get_ext_cmd); E void FDECL(tty_number_pad, (int)); E void NDECL(tty_delay_output); #ifdef CHANGE_COLOR E void FDECL(tty_change_color,(int color,long rgb,int reverse)); #ifdef MAC E void FDECL(tty_change_background,(int white_or_black)); E short FDECL(set_tty_font_name, (winid, char *)); #endif E char * NDECL(tty_get_color_string); #endif /* other defs that really should go away (they're tty specific) */ E void NDECL(tty_start_screen); E void NDECL(tty_end_screen); E void FDECL(genl_outrip, (winid,int)); #ifdef NO_TERMS # ifdef MAC # ifdef putchar # undef putchar # undef putc # endif # define putchar term_putc # define fflush term_flush # define puts term_puts E int FDECL(term_putc, (int c)); E int FDECL(term_flush, (void *desc)); E int FDECL(term_puts, (const char *str)); # endif /* MAC */ # if defined(MSDOS) || defined(WIN32CON) # if defined(SCREEN_BIOS) || defined(SCREEN_DJGPPFAST) || defined(WIN32CON) # undef putchar # undef putc # undef puts # define putchar(x) xputc(x) /* these are in video.c, nttty.c */ # define putc(x) xputc(x) # define puts(x) xputs(x) # endif/*SCREEN_BIOS || SCREEN_DJGPPFAST || WIN32CON */ # ifdef POSITIONBAR E void FDECL(video_update_positionbar, (char *)); # endif # endif/*MSDOS*/ #endif/*NO_TERMS*/ #undef E #endif /* WINTTY_H */ slashem-0.0.7E7F3/include/prop.h0000664000076400007640000001064010545462317014431 0ustar aliali/* SCCS Id: @(#)prop.h 3.4 1999/07/07 */ /* Copyright (c) 1989 Mike Threepoint */ /* NetHack may be freely redistributed. See license for details. */ #ifndef PROP_H #define PROP_H /*** What the properties are ***/ #define FIRE_RES 1 #define COLD_RES 2 #define SLEEP_RES 3 #define DISINT_RES 4 #define SHOCK_RES 5 #define POISON_RES 6 #define ACID_RES 7 #define STONE_RES 8 /* note: for the first eight properties, MR_xxx == (1 << (xxx_RES - 1)) */ #define ADORNED 9 #define REGENERATION 10 #define SEARCHING 11 #define SEE_INVIS 12 #define INVIS 13 #define TELEPORT 14 #define TELEPORT_CONTROL 15 #define POLYMORPH 16 #define POLYMORPH_CONTROL 17 #define LEVITATION 18 #define STEALTH 19 #define AGGRAVATE_MONSTER 20 #define CONFLICT 21 #define PROTECTION 22 #define PROT_FROM_SHAPE_CHANGERS 23 #define WARNING 24 #define TELEPAT 25 #define FAST 26 #define STUNNED 27 #define CONFUSION 28 #define SICK 29 #define BLINDED 30 #define SLEEPING 31 #define WOUNDED_LEGS 32 #define STONED 33 #define STRANGLED 34 #define HALLUC 35 #define HALLUC_RES 36 #define FUMBLING 37 #define JUMPING 38 #define WWALKING 39 #define HUNGER 40 #define GLIB 41 #define REFLECTING 42 #define LIFESAVED 43 #define ANTIMAGIC 44 #define DISPLACED 45 #define CLAIRVOYANT 46 #define VOMITING 47 #define ENERGY_REGENERATION 48 #define MAGICAL_BREATHING 49 #define HALF_SPDAM 50 #define HALF_PHDAM 51 #define SICK_RES 52 #define DRAIN_RES 53 #define WARN_UNDEAD 54 #define INVULNERABLE 55 #define FREE_ACTION 56 #define SWIMMING 57 #define SLIMED 58 #define FIXED_ABIL 59 #define FLYING 60 #define UNCHANGING 61 #define PASSES_WALLS 62 #define SLOW_DIGESTION 63 #define INFRAVISION 64 #define WARN_OF_MON 65 #define DETECT_MONSTERS 66 #define LAST_PROP (DETECT_MONSTERS) /*** Where the properties come from ***/ /* Definitions were moved here from obj.h and you.h */ struct prop { /*** Properties conveyed by objects ***/ long extrinsic; /* Armor */ # define W_ARM 0x00000001L /* Body armor */ # define W_ARMC 0x00000002L /* Cloak */ # define W_ARMH 0x00000004L /* Helmet/hat */ # define W_ARMS 0x00000008L /* Shield */ # define W_ARMG 0x00000010L /* Gloves/gauntlets */ # define W_ARMF 0x00000020L /* Footwear */ #ifdef TOURIST # define W_ARMU 0x00000040L /* Undershirt */ # define W_ARMOR (W_ARM | W_ARMC | W_ARMH | W_ARMS | W_ARMG | W_ARMF | W_ARMU) #else # define W_ARMOR (W_ARM | W_ARMC | W_ARMH | W_ARMS | W_ARMG | W_ARMF) #endif /* Weapons and artifacts */ # define W_WEP 0x00000100L /* Wielded weapon */ # define W_QUIVER 0x00000200L /* Quiver for (f)iring ammo */ # define W_SWAPWEP 0x00000400L /* Secondary weapon */ # define W_ART 0x00001000L /* Carrying artifact (not really worn) */ # define W_ARTI 0x00002000L /* Invoked artifact (not really worn) */ /* Amulets, rings, tools, and other items */ # define W_AMUL 0x00010000L /* Amulet */ # define W_RINGL 0x00020000L /* Left ring */ # define W_RINGR 0x00040000L /* Right ring */ # define W_RING (W_RINGL | W_RINGR) # define W_TOOL 0x00080000L /* Eyewear */ #ifdef STEED # define W_SADDLE 0x00100000L /* KMH -- For riding monsters */ #endif # define W_BALL 0x00200000L /* Punishment ball */ # define W_CHAIN 0x00400000L /* Punishment chain */ /*** Property is blocked by an object ***/ long blocked; /* Same assignments as extrinsic */ /*** Timeouts, permanent properties, and other flags ***/ long intrinsic; /* Timed properties */ # define TIMEOUT 0x00ffffffL /* Up to 16 million turns */ /* Permanent properties */ # define FROMEXPER 0x01000000L /* Gain/lose with experience, for role */ # define FROMRACE 0x02000000L /* Gain/lose with experience, for race */ # define FROMOUTSIDE 0x04000000L /* By corpses, prayer, thrones, etc. */ # define INTRINSIC (FROMOUTSIDE|FROMRACE|FROMEXPER) /* Control flags */ # define I_SPECIAL 0x10000000L /* Property is controllable */ }; /*** Definitions for backwards compatibility ***/ #define LEFT_RING W_RINGL #define RIGHT_RING W_RINGR #define LEFT_SIDE LEFT_RING #define RIGHT_SIDE RIGHT_RING #define BOTH_SIDES (LEFT_SIDE | RIGHT_SIDE) #define WORN_ARMOR W_ARM #define WORN_CLOAK W_ARMC #define WORN_HELMET W_ARMH #define WORN_SHIELD W_ARMS #define WORN_GLOVES W_ARMG #define WORN_BOOTS W_ARMF #define WORN_AMUL W_AMUL #define WORN_BLINDF W_TOOL #ifdef TOURIST #define WORN_SHIRT W_ARMU #endif #endif /* PROP_H */ slashem-0.0.7E7F3/include/hack.h0000664000076400007640000002513310545462317014362 0ustar aliali/* 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. */ #ifndef HACK_H #define HACK_H #ifndef CONFIG_H #include "config.h" #endif /* For debugging beta code. */ #ifdef BETA #define Dpline pline #endif #define TELL 1 #define NOTELL 0 #define ON 1 #define OFF 0 #define BOLT_LIM 6 /* from this distance ranged attacks will be made */ #define MAX_CARR_CAP 1000 /* so that boulders can be heavier */ #define DUMMY { 0 } /* symbolic names for capacity levels */ #define UNENCUMBERED 0 #define SLT_ENCUMBER 1 /* Burdened */ #define MOD_ENCUMBER 2 /* Stressed */ #define HVY_ENCUMBER 3 /* Strained */ #define EXT_ENCUMBER 4 /* Overtaxed */ #define OVERLOADED 5 /* Overloaded */ /* Macros for how a rumor was delivered in outrumor() */ #define BY_ORACLE 0 #define BY_COOKIE 1 #define BY_PAPER 2 #define BY_OTHER 9 #ifdef STEED /* Macros for why you are no longer riding */ #define DISMOUNT_GENERIC 0 #define DISMOUNT_FELL 1 #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 * code assume that PANIC separates the deaths from the non-deaths. */ #define DIED 0 #define BETRAYED 1 #define CHOKING 2 #define POISONING 3 #define STARVING 4 #define DROWNING 5 #define BURNING 6 #define DISSOLVED 7 #define CRUSHING 8 #define STONING 9 #define TURNED_SLIME 10 #define GENOCIDED 11 #define PANICKED 12 #define TRICKED 13 #define QUIT 14 #define ESCAPED 15 #define ASCENDED 16 #include "align.h" #include "dungeon.h" #include "monsym.h" #include "mkroom.h" #include "objclass.h" #include "youprop.h" #include "wintype.h" #include "decl.h" #include "timeout.h" NEARDATA extern coord bhitpos; /* place where throw or zap hits or stops */ /* types of calls to bhit() */ #define ZAPPED_WAND 0 #define THROWN_WEAPON 1 #define KICKED_WEAPON 2 #define FLASHED_LIGHT 3 #define INVIS_BEAM 4 #define MATCH_WARN_OF_MON(mon) (Warn_of_mon && flags.warntype && \ (flags.warntype & (mon)->data->mflags2)) #include "trap.h" #include "flag.h" #include "rm.h" #include "vision.h" #include "display.h" #include "engrave.h" #include "rect.h" #include "region.h" #ifdef USE_TRAMPOLI /* This doesn't belong here, but we have little choice */ #undef NDECL #define NDECL(f) f() #endif #include "extern.h" #include "winprocs.h" #ifdef USE_TRAMPOLI #include "wintty.h" #undef WINTTY_H #include "trampoli.h" #undef EXTERN_H #include "extern.h" #endif /* USE_TRAMPOLI */ #define NO_SPELL 0 /* flags to control makemon() */ #define NO_MM_FLAGS 0x00 /* use this rather than plain 0 */ #define NO_MINVENT 0x01 /* suppress minvent when creating mon */ #define MM_NOWAIT 0x02 /* don't set STRAT_WAITMASK flags */ #define MM_EDOG 0x04 /* add edog structure */ #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) */ #define MM_IGNOREWATER 0x80 /* ignore water when positioning */ #define MM_ADJACENTOK 0x100 /* it is acceptable to use adjacent coordinates */ /* special mhpmax value when loading bones monster to flag as extinct or genocided */ #define DEFUNCT_MONSTER (-100) /* 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 */ #define AUTOSELECT_SINGLE 0x2 /* if only 1 object, don't ask */ #define USE_INVLET 0x4 /* use object's invlet */ #define INVORDER_SORT 0x8 /* sort objects by packorder */ #define SIGNAL_NOMENU 0x10 /* return -1 rather than 0 if none allowed */ #define FEEL_COCKATRICE 0x20 /* engage cockatrice checks and react */ #define SIGNAL_CANCEL 0x40 /* return -4 rather than 0 if explicit cancel */ /* Flags to control query_category() */ /* BY_NEXTHERE used by query_category() too, so skip 0x01 */ #define UNPAID_TYPES 0x02 #define GOLD_TYPES 0x04 #define WORN_TYPES 0x08 #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() */ #define FM_FMON 0x01 /* search the fmon chain */ #define FM_MIGRATE 0x02 /* search the migrating monster chain */ #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 */ #define FORCEBUNGLE 0x02 /* adjustments appropriate for bungling */ #define RECURSIVETRAP 0x04 /* trap changed into another type this same turn */ /* Flags to control test_move in hack.c */ #define DO_MOVE 0 /* really doing the move */ #define TEST_MOVE 1 /* test a normal move (move there next) */ #define TEST_TRAV 2 /* test a future travel location */ /*** some utility macros ***/ #define yn(query) yn_function(query,ynchars, 'n') #define ynq(query) yn_function(query,ynqchars, 'q') #define ynaq(query) yn_function(query,ynaqchars, 'y') #define nyaq(query) yn_function(query,ynaqchars, 'n') #define nyNaq(query) yn_function(query,ynNaqchars, 'n') #define ynNaq(query) yn_function(query,ynNaqchars, 'y') /* Macros for scatter */ #define VIS_EFFECTS 0x01 /* display visual effects */ #define MAY_HITMON 0x02 /* objects may hit monsters */ #define MAY_HITYOU 0x04 /* objects may hit you */ #define MAY_HIT (MAY_HITMON|MAY_HITYOU) #define MAY_DESTROY 0x08 /* objects may be destroyed at random */ #define MAY_FRACTURE 0x10 /* boulders & statues may fracture */ /* Macros for launching objects */ #define ROLL 0x01 /* the object is rolling */ #define FLING 0x02 /* the object is flying thru the air */ #define LAUNCH_UNSEEN 0x40 /* hero neither caused nor saw it */ #define LAUNCH_KNOWN 0x80 /* the hero caused this by explicit action */ /* 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 #define FACE 2 #define FINGER 3 #define FINGERTIP 4 #define FOOT 5 #define HAND 6 #define HANDED 7 #define HEAD 8 #define LEG 9 #define LIGHT_HEADED 10 #define NECK 11 #define SPINE 12 #define TOE 13 #define HAIR 14 #define BLOOD 15 #define LUNG 16 #define NOSE 17 #define STOMACH 18 /* Flags to control menus */ #define MENUTYPELEN sizeof("traditional ") #define MENU_TRADITIONAL 0 #define MENU_COMBINATION 1 #define MENU_PARTIAL 2 #define MENU_FULL 3 #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) | \ ((unsigned long)patch << 8) | \ ((unsigned long)0)) #define FEATURE_NOTICE_VER_MAJ (flags.suppress_alert >> 24) #define FEATURE_NOTICE_VER_MIN (((unsigned long)(0x0000000000FF0000L & flags.suppress_alert)) >> 16) #define FEATURE_NOTICE_VER_PATCH (((unsigned long)(0x000000000000FF00L & flags.suppress_alert)) >> 8) #ifndef max #define max(a,b) ((a) > (b) ? (a) : (b)) #endif #ifndef min #define min(x,y) ((x) < (y) ? (x) : (y)) #endif #define plur(x) (((x) == 1) ? "" : "s") #define ARM_BONUS(obj) (objects[(obj)->otyp].a_ac + (obj)->spe \ - min((int)greatest_erosion(obj),objects[(obj)->otyp].a_ac)) #define makeknown(x) discover_object((x),TRUE,TRUE) #define distu(xx,yy) dist2((int)(xx),(int)(yy),(int)u.ux,(int)u.uy) #define onlineu(xx,yy) online2((int)(xx),(int)(yy),(int)u.ux,(int)u.uy) #define setustuck(v) (flags.botl = 1, u.ustuck = (v)) #define rn1(x,y) (rn2(x)+(y)) /* negative armor class is randomly weakened to prevent invulnerability */ #define AC_VALUE(AC) ((AC) >= 0 ? (AC) : -rnd(-(AC))) #if defined(MICRO) && !defined(__DJGPP__) #define getuid() 1 #define getlogin() ((char *)0) #endif /* MICRO */ #if defined(OVERLAY)&&(defined(OVL0)||defined(OVL1)||defined(OVL2)||defined(OVL3)||defined(OVLB)) # define USE_OVLx # define STATIC_DCL extern # define STATIC_OVL # ifdef OVLB # define STATIC_VAR # else # define STATIC_VAR extern # endif #else /* !OVERLAY || (!OVL0 && !OVL1 && !OVL2 && !OVL3 && !OVLB) */ # define STATIC_DCL static # define STATIC_OVL static # define STATIC_VAR static /* If not compiling an overlay, compile everything. */ # define OVL0 /* highest priority */ # define OVL1 # define OVL2 # define OVL3 /* lowest specified priority */ # define OVLB /* the base overlay segment */ #endif /* OVERLAY && (OVL0 || OVL1 || OVL2 || OVL3 || OVLB) */ /* Macro for a few items that are only static if we're not overlaid.... */ #if defined(USE_TRAMPOLI) || defined(USE_OVLx) # define STATIC_PTR #else # define STATIC_PTR static #endif /* For my clever ending messages... */ extern int Instant_Death; extern int Quick_Death; extern int Nibble_Death; extern int last_hit; extern int second_last_hit; extern int third_last_hit; /* For those tough guys who get carried away... */ extern int repeat_hit; /* Raw status flags */ #define RAW_STAT_LEVITATION 0x00000001 #define RAW_STAT_CONFUSION 0x00000002 #define RAW_STAT_FOODPOIS 0x00000004 #define RAW_STAT_ILL 0x00000008 #define RAW_STAT_BLIND 0x00000010 #define RAW_STAT_STUNNED 0x00000020 #define RAW_STAT_HALLUCINATION 0x00000040 #define RAW_STAT_SLIMED 0x00000080 /* The function argument to qsort() requires a particular * calling convention under WINCE which is not the default * in that environment. */ #if defined(WIN_CE) # define CFDECLSPEC __cdecl #else # define CFDECLSPEC #endif #endif /* HACK_H */ slashem-0.0.7E7F3/include/qttableview.h0000664000076400007640000001466310545462317016011 0ustar aliali/********************************************************************** ** $Id: qttableview.h,v 1.1 2002/04/06 12:11:18 j_ali 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 slashem-0.0.7E7F3/include/winami.h0000664000076400007640000001050610545462317014736 0ustar aliali/* 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. */ #ifndef WINAMI_H #define WINAMI_H #define MAXWINTAGS 5 /* * Information specific to a menu window. First a structure for each * menu entry, then the structure for each menu window. */ typedef struct amii_mi { struct amii_mi *next; anything identifier; /* Opaque type to identify this selection */ long glyph; /* Glyph for menu item */ long count; /* Object count */ char selected; /* Been selected? */ char selector; /* Char used to select this entry. */ char gselector; /* Group selector */ char canselect; /* Can user select this entry. */ char attr; /* Attribute for the line. */ char *str; /* The text of the item. */ } amii_menu_item; struct amii_menu { amii_menu_item *items; /* Starting pointer for item list. */ amii_menu_item *last; /* End pointer for item list. */ const char *query; /* Query string */ int count; /* Number of strings. */ char chr; /* Character to assign for accelerator */ }; /* descriptor for Amiga Intuition-based windows. If we decide to cope with * tty-style windows also, then things will need to change. */ /* per-window data */ struct amii_WinDesc { xchar type; /* type of window */ struct amii_menu menu; boolean active; /* true if window is active */ boolean wasup; /* true if menu/text window was already open */ short disprows; /* Rows displayed so far (used for paging in message win) */ xchar offx, offy; /* offset from topleft of display */ short vwx, vwy, vcx, vcy; /* View cursor location */ short rows, cols; /* dimensions */ short curx, cury; /* current cursor position */ short maxrow, maxcol; /* the maximum size used -- for INVEN wins */ /* maxcol is also used by WIN_MESSAGE for */ /* tracking the ^P command */ char **data; /* window data [row][column] */ menu_item *mi; /* Menu information */ char *resp; /* valid menu responses (for NHW_INVEN) */ char *canresp; /* cancel responses; 1st is the return value */ char *morestr; /* string to display instead of default */ /* amiga stuff */ struct Window *win; /* Intuition window pointer */ #ifdef INTUI_NEW_LOOK struct ExtNewWindow *newwin; /* NewWindow alloc'd */ #else struct NewWindow *newwin; /* ExtNewWindow alloc'd */ #endif #ifdef INTUI_NEW_LOOK struct TagItem wintags[ MAXWINTAGS ];/* Tag items for this window */ #else long wintags[ MAXWINTAGS*2 ]; #endif void *hook; /* Hook structure pointer for tiles version */ #define FLMAP_INGLYPH 1 /* An NHW_MAP window is in glyph mode */ #define FLMAP_CURSUP 2 /* An NHW_MAP window has the cursor displayed */ #define FLMAP_SKIP 4 #define FLMSG_FIRST 1 /* First message in the NHW_MESSAGE window for this turn */ long wflags; short cursx, cursy; /* Where the cursor is displayed at */ short curs_apen, /* Color cursor is displayed in */ curs_bpen; }; /* descriptor for intuition-based displays -- all the per-display data */ /* this is a generic thing - think of it as Screen level */ struct amii_DisplayDesc { /* we need this for Screen size (which will vary with display mode) */ uchar rows, cols; /* width & height of display in text units */ short xpix, ypix; /* width and height of display in pixels */ int toplin; /* flag for topl stuff */ int rawprint; /* number of raw_printed lines since synch */ winid lastwin; /* last window used for I/O */ }; typedef enum { WEUNK, WEKEY, WEMOUSE, WEMENU, } WETYPE; typedef struct WEVENT { WETYPE type; union { int key; struct { int x, y; int qual; } mouse; long menucode; } un; } WEVENT; #define MAXWIN 20 /* maximum number of windows, cop-out */ /* port specific variable declarations */ extern winid WIN_BASE; extern winid WIN_OVER; #define NHW_BASE 6 #define NHW_OVER 7 /* overview window */ extern struct amii_WinDesc *amii_wins[MAXWIN + 1]; extern struct amii_DisplayDesc *amiIDisplay; /* the Amiga Intuition descriptor */ extern char morc; /* last character typed to xwaitforspace */ extern char defmorestr[]; /* default --more-- prompt */ #endif /* WINAMI_H */ slashem-0.0.7E7F3/include/you.h0000664000076400007640000003423510545462317014273 0ustar aliali/* 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. */ #ifndef YOU_H #define YOU_H #include "attrib.h" #include "monst.h" #ifndef PROP_H #include "prop.h" /* (needed here for util/makedefs.c) */ #endif #include "skills.h" /* KMH -- struct prop and assignments moved to prop.h */ /*** Substructures ***/ struct RoleName { const char *m; /* name when character is male */ const char *f; /* when female; null if same as male */ }; struct RoleAdvance { /* "fix" is the fixed amount, "rnd" is the random amount */ xchar infix, inrnd; /* at character initialization */ xchar lofix, lornd; /* gained per level < urole.xlev */ xchar hifix, hirnd; /* gained per level >= urole.xlev */ }; struct u_have { Bitfield(amulet,1); /* carrying Amulet */ Bitfield(bell,1); /* carrying Bell */ Bitfield(book,1); /* carrying Book */ Bitfield(menorah,1); /* carrying Candelabrum */ Bitfield(questart,1); /* carrying the Quest Artifact */ Bitfield(unused,3); }; struct u_event { Bitfield(minor_oracle,1); /* received at least 1 cheap oracle */ Bitfield(major_oracle,1); /* " expensive oracle */ Bitfield(qcalled,1); /* called by Quest leader to do task */ Bitfield(qexpelled,1); /* expelled from the Quest dungeon */ Bitfield(qcompleted,1); /* successfully completed Quest task */ Bitfield(uheard_tune,2); /* 1=know about, 2=heard passtune */ Bitfield(uopened_dbridge,1); /* opened the drawbridge */ Bitfield(invoked,1); /* invoked Gate to the Sanctum level */ Bitfield(gehennom_entered,1); /* entered Gehennom via Valley */ #ifdef ELBERETH Bitfield(uhand_of_elbereth,2); /* became Hand of Elbereth */ #endif Bitfield(udemigod,1); /* killed the wiz */ Bitfield(ascended,1); /* has offered the Amulet */ }; /* KMH, conduct -- * These are voluntary challenges. Each field denotes the number of * times a challenge has been violated. */ struct u_conduct { /* number of times... */ long unvegetarian; /* eaten any animal */ long unvegan; /* ... or any animal byproduct */ long food; /* ... or any comestible */ long gnostic; /* used prayer, priest, or altar */ long weaphit; /* hit a monster with a weapon */ long killer; /* killed a monster yourself */ long literate; /* read something (other than BotD) */ long polypiles; /* polymorphed an object */ long polyselfs; /* transformed yourself */ long wishes; /* used a wish */ long wisharti; /* wished for an artifact */ /* genocides already listed at end of game */ long celibacy; /* How many times you've played around with *ubbi */ }; /*** Unified structure containing role information ***/ struct Role { /*** Strings that name various things ***/ struct RoleName name; /* the role's name (from u_init.c) */ struct RoleName rank[9]; /* names for experience levels (from botl.c) */ const char *lgod, *ngod, *cgod; /* god names (from pray.c) */ const char *filecode; /* abbreviation for use in file names */ const char *homebase; /* quest leader's location (from questpgr.c) */ const char *intermed; /* quest intermediate goal (from questpgr.c) */ /*** Indices of important monsters and objects ***/ short malenum, /* index (PM_) as a male (botl.c) */ femalenum, /* ...or as a female (NON_PM == same) */ petnum, /* PM_ of preferred pet (NON_PM == random) */ ldrnum, /* PM_ of quest leader (questpgr.c) */ guardnum, /* PM_ of quest guardians (questpgr.c) */ neminum, /* PM_ of quest nemesis (questpgr.c) */ enemy1num, /* specific quest enemies (NON_PM == random) */ enemy2num; char enemy1sym, /* quest enemies by class (S_) */ enemy2sym; #if 0 short gift1arti, /* Index (ART_) of first artifact gift */ gift2arti; /* Index (ART_) of second artifact gift */ #endif short questarti; /* index (ART_) of quest artifact (questpgr.c) */ /*** Bitmasks ***/ short allow; /* bit mask of allowed variations */ #define ROLE_RACEMASK 0x0ff8 /* allowable races */ #define ROLE_GENDMASK 0xf000 /* allowable genders */ #define ROLE_MALE 0x1000 #define ROLE_FEMALE 0x2000 #define ROLE_NEUTER 0x4000 #define ROLE_ALIGNMASK AM_MASK /* allowable alignments */ #define ROLE_LAWFUL AM_LAWFUL #define ROLE_NEUTRAL AM_NEUTRAL #define ROLE_CHAOTIC AM_CHAOTIC /*** Attributes (from attrib.c and exper.c) ***/ xchar attrbase[A_MAX]; /* lowest initial attributes */ xchar attrdist[A_MAX]; /* distribution of initial attributes */ struct RoleAdvance hpadv; /* hit point advancement */ struct RoleAdvance enadv; /* energy advancement */ xchar xlev; /* cutoff experience level */ xchar initrecord; /* initial alignment record */ /*** Spell statistics (from spell.c) ***/ int spelbase; /* base spellcasting penalty */ int spelheal; /* penalty (-bonus) for healing spells */ int spelshld; /* penalty for wearing any shield */ int spelarmr; /* penalty for wearing metal armour */ int spelstat; /* which stat (A_) is used */ int spelspec; /* spell (SPE_) the class excels at */ int spelsbon; /* penalty (-bonus) for that spell */ /*** Properties in variable-length arrays ***/ /* intrinsics (see attrib.c) */ /* initial inventory (see u_init.c) */ /* skills (see u_init.c) */ /*** Don't forget to add... ***/ /* quest leader, guardians, nemesis (monst.c) */ /* quest artifact (artilist.h) */ /* quest dungeon definition (dat/Xyz.dat) */ /* quest text (dat/quest.txt) */ /* dictionary entries (dat/data.bas) */ }; extern const struct Role roles[]; /* table of available roles */ extern struct Role urole; #define Role_if(X) (urole.malenum == (X)) #define Role_switch (urole.malenum) /* used during initialization for race, gender, and alignment as well as for character class */ #define ROLE_NONE (-1) #define ROLE_RANDOM (-2) /*** Unified structure specifying race information ***/ struct Race { /*** Strings that name various things ***/ const char *noun; /* noun ("human", "elf") */ const char *adj; /* adjective ("human", "elven") */ const char *coll; /* collective ("humanity", "elvenkind") */ const char *filecode; /* code for filenames */ struct RoleName individual; /* individual as a noun ("man", "elf") */ /*** Indices of important monsters and objects ***/ short malenum, /* PM_ as a male monster */ femalenum, /* ...or as a female (NON_PM == same) */ mummynum, /* PM_ as a mummy */ zombienum; /* PM_ as a zombie */ /*** Bitmasks ***/ short allow; /* bit mask of allowed variations */ short selfmask, /* your own race's bit mask */ lovemask, /* bit mask of always peaceful */ hatemask; /* bit mask of always hostile */ /*** Attributes ***/ xchar attrmin[A_MAX]; /* minimum allowable attribute */ xchar attrmax[A_MAX]; /* maximum allowable attribute */ struct RoleAdvance hpadv; /* hit point advancement */ struct RoleAdvance enadv; /* energy advancement */ #if 0 /* DEFERRED */ int nv_range; /* night vision range */ int xray_range; /* X-ray vision range */ #endif /*** Properties in variable-length arrays ***/ /* intrinsics (see attrib.c) */ /*** Don't forget to add... ***/ /* quest leader, guardians, nemesis (monst.c) */ /* quest dungeon definition (dat/Xyz.dat) */ /* quest text (dat/quest.txt) */ /* dictionary entries (dat/data.bas) */ }; extern const struct Race races[]; /* Table of available races */ extern struct Race urace; #define Race_if(X) (urace.malenum == (X)) #define Race_switch (urace.malenum) /*** Unified structure specifying gender information ***/ struct Gender { const char *adj; /* male/female/neuter */ const char *he; /* he/she/it */ const char *him; /* him/her/it */ const char *his; /* his/her/its */ const char *filecode; /* file code */ short allow; /* equivalent ROLE_ mask */ }; #define ROLE_GENDERS 2 /* number of permitted player genders */ /* 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 ***/ struct Align { const char *noun; /* law/balance/chaos */ const char *adj; /* lawful/neutral/chaotic */ const char *filecode; /* file code */ short allow; /* equivalent ROLE_ mask */ aligntyp value; /* equivalent A_ value */ }; #define ROLE_ALIGNS 3 /* number of permitted player alignments */ extern const struct Align aligns[]; /* table of available alignments */ /*** Information about the player ***/ struct you { 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 */ uchar utotype; /* bitmask of goto_level() flags for utolev */ boolean umoved; /* changed map location (post-move) */ int last_str_turn; /* 0: none, 1: half turn, 2: full turn */ /* +: turn right, -: turn left */ int ulevel; /* 1 to MAXULEV */ int ulevelmax; /* Maximmum level achieved */ unsigned utrap; /* trap timeout */ unsigned utraptype; /* defined if utrap nonzero */ #define TT_BEARTRAP 0 #define TT_PIT 1 #define TT_WEB 2 #define TT_LAVA 3 #define TT_INFLOOR 4 char urooms[5]; /* rooms (roomno + 3) occupied now */ char urooms0[5]; /* ditto, for previous position */ char uentered[5]; /* rooms (roomno + 3) entered this turn */ char ushops[5]; /* shop rooms (roomno + 3) occupied now */ char ushops0[5]; /* ditto, for previous position */ char ushops_entered[5]; /* ditto, shops entered this turn */ char ushops_left[5]; /* ditto, shops exited this turn */ int uhunger; /* refd only in eat.c and shk.c */ unsigned uhs; /* hunger state - see eat.c */ struct prop uprops[LAST_PROP+1]; unsigned umconf; char usick_cause[PL_PSIZ+20]; /* sizeof "unicorn horn named "+1 */ Bitfield(usick_type,2); #define SICK_VOMITABLE 0x01 #define SICK_NONVOMITABLE 0x02 #define SICK_ALL 0x03 /* These ranges can never be more than MAX_RANGE (vision.h). */ int nv_range; /* current night vision range */ int xray_range; /* current xray vision range */ /* * These variables are valid globally only when punished and blind. */ #define BC_BALL 0x01 /* bit mask for ball in 'bc_felt' below */ #define BC_CHAIN 0x02 /* bit mask for chain in 'bc_felt' below */ int bglyph; /* glyph under the ball */ int cglyph; /* glyph under the chain */ int bc_order; /* ball & chain order [see bc_order() in ball.c] */ int bc_felt; /* mask for ball/chain being felt */ int umonster; /* hero's "real" monster num */ int umonnum; /* current monster number */ int mh, mhmax, mtimedone; /* for polymorph-self */ struct attribs macurr, /* for monster attribs */ mamax; /* for monster attribs */ int ulycn; /* lycanthrope type */ unsigned ucreamed; unsigned uswldtim; /* time you have been swallowed */ Bitfield(uswallow,1); /* true if swallowed */ Bitfield(uinwater,1); /* if you're currently in water (only underwater possible currently) */ Bitfield(uundetected,1); /* if you're a hiding monster/piercer */ 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! */ struct u_conduct uconduct; /* KMH, conduct */ unsigned udg_cnt; /* how long you have been demigod */ struct u_event uevent; /* certain events have happened */ struct u_have uhave; /* you're carrying special objects */ struct attribs acurr, /* your current attributes (eg. str)*/ aexe, /* for gain/loss via "exercise" */ abon, /* your bonus attributes (eg. str) */ amax, /* your max attributes (eg. str) */ atemp, /* used for temporary loss/gain */ atime; /* used for loss/gain countdown */ align ualign; /* character alignment */ #define CONVERT 2 #define A_ORIGINAL 1 #define A_CURRENT 0 aligntyp ualignbase[CONVERT]; /* for ualign conversion record */ schar uluck, moreluck; /* luck and luck bonus */ #define Luck (u.uluck + u.moreluck) #define LUCKADD 3 /* added value when carrying luck stone */ #define LUCKMAX 10 /* on moonlit nights 11 */ #define LUCKMIN (-10) schar uhitinc; /* KMH -- additional to-hit bonus */ long uhealbonus; /* KMH -- Healing bonus from healthstones */ schar udaminc; /* Additional damage bonus */ schar uac; uchar uspellprot; /* protection by SPE_PROTECTION */ uchar usptime; /* #moves until uspellprot-- */ uchar uspmtime; /* #moves between uspellprot-- */ int uhp, uhpmax; int uen, uenmax; /* magical energy - M. Stephenson */ int ugangr; /* if the gods are angry at you */ int ugifts; /* number of artifacts bestowed */ int ublessed, ublesscnt; /* blessing/duration from #pray */ #ifdef NOARTIFACTWISH int usacrifice; /* number of sacrifices so far */ #endif #if 0 /* KMH -- Drow is now its own role... */ boolean uelf_drow; /* are you a drow? */ int ustrucklast; /* Seems unused */ #endif #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 */ int uinvault; struct monst *ustuck; #ifdef STEED struct monst *usteed; long ugallop; int urideturns; #endif int umortality; /* how many times you died */ int ugrave_arise; /* you die and become something aside from a ghost */ time_t ubirthday; /* real world time when game began */ /* KMH -- Info shared among gypsies */ int umonteluck; /* Chance of winning; lower is better */ char umontelast; /* Last monte card picked */ int weapon_slots; /* unused skill slots */ int skills_advanced; /* # of advances made so far */ xchar skill_record[P_SKILL_LIMIT]; /* skill advancements */ struct skills weapon_skills[P_NUM_SKILLS]; boolean twoweap; /* KMH -- using two-weapon combat */ }; /* end of `struct you' */ #define Upolyd (u.umonnum != u.umonster) #endif /* YOU_H */ slashem-0.0.7E7F3/include/qt_win.h0000664000076400007640000004370410545462317014761 0ustar aliali// 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 // program rather than being event driven (hence the ugly key // and click buffer rather), but also because this is my first // major application of Qt. // #ifndef qt_win_h #define qt_win_h #define QT_CLEAN_NAMESPACE /* Qt never uses NetHack's yn() macro and it can conflict with the * XOpen bessel function of the same name. */ #undef yn #include #include #include #include #include #if defined(QWS) #include #else #include #endif #include #include #include #include #include #include #include #include #include #include #include #if QT_VERSION >= 300 #include // Should stop using QTableView #define QTableView QtTableView #else #include #endif #include #include #ifdef KDE #include #include #endif #include "qt_clust.h" class QVBox; class QMenuBar; class QRadioButton; class NhPSListView; ////////////////////////////////////////////////////////////// // // The beautiful, abstracted and well-modelled classes... // ////////////////////////////////////////////////////////////// class NetHackQtGlyphs; class NetHackQtLineEdit : public QLineEdit { public: NetHackQtLineEdit(); NetHackQtLineEdit(QWidget* parent, const char* name); void fakeEvent(int key, int ascii, int state); }; class NetHackQtSettings : public QDialog { Q_OBJECT public: // Size of window - used to decide default sizes NetHackQtSettings(int width, int height); NetHackQtGlyphs& glyphs(); void updateTiles(); const QFont& normalFont(); const QFont& normalFixedFont(); const QFont& largeFont(); bool ynInMessages(); signals: void fontChanged(); void tilesChanged(); public slots: void toggleGlyphSize(); void setGlyphSize(bool); private: QSpinBox tilewidth; QSpinBox tileheight; QLabel widthlbl; QLabel heightlbl; QCheckBox whichsize; QSize othersize; QComboBox fontsize; QFont normal, normalfixed, large; NetHackQtGlyphs* theglyphs; private slots: void resizeTiles(); }; class NetHackQtKeyBuffer { public: NetHackQtKeyBuffer(); bool Empty() const; bool Full() const; void Put(int k, int ascii, int state); void Put(char a); void Put(const char* str); int GetKey(); int GetAscii(); int GetState(); int TopKey() const; int TopAscii() const; int TopState() const; private: enum { maxkey=64 }; int key[maxkey]; int ascii[maxkey]; int state[maxkey]; int in,out; }; class NetHackQtClickBuffer { public: NetHackQtClickBuffer(); bool Empty() const; bool Full() const; void Put(int x, int y, int mod); int NextX() const; int NextY() const; int NextMod() const; void Get(); private: enum { maxclick=64 }; struct ClickRec { int x,y,mod; } click[maxclick]; int in,out; }; class NetHackQtSavedGameSelector : public QDialog { public: NetHackQtSavedGameSelector(const char** saved); int choose(); }; class NetHackQtPlayerSelector : private QDialog { Q_OBJECT public: enum { R_None=-1, R_Quit=-2, R_Rand=-3 }; NetHackQtPlayerSelector(NetHackQtKeyBuffer&); protected: virtual void done(int); public slots: void Quit(); void Random(); void selectName(const QString& n); void selectRole(); void selectRace(); void setupOthers(); void selectGender(int); void selectAlignment(int); public: bool Choose(); private: NetHackQtKeyBuffer& keysource; NhPSListView* role; NhPSListView* race; QRadioButton **gender; QRadioButton **alignment; bool fully_specified_role; }; class NetHackQtStringRequestor : QDialog { private: QLabel prompt; NetHackQtLineEdit input; QPushButton* okay; QPushButton* cancel; NetHackQtKeyBuffer& keysource; virtual void done(int); public: NetHackQtStringRequestor(NetHackQtKeyBuffer&, const char* p,const char* cancelstr="Cancel"); void SetDefault(const char*); bool Get(char* buffer, int maxchar=80); virtual void resizeEvent(QResizeEvent*); }; class NetHackQtExtCmdRequestor : public QDialog { Q_OBJECT NetHackQtKeyBuffer& keysource; public: NetHackQtExtCmdRequestor(NetHackQtKeyBuffer& ks); int get(); private slots: void cancel(); void done(int i); }; class NetHackQtWindow { public: NetHackQtWindow(); virtual ~NetHackQtWindow(); virtual QWidget* Widget() =0; virtual void Clear(); virtual void Display(bool block); virtual bool Destroy(); virtual void CursorTo(int x,int y); virtual void PutStr(int attr, const char* text); virtual void StartMenu(); virtual void AddMenu(int glyph, const ANY_P* identifier, char ch, char gch, int attr, const char* str, bool presel); virtual void EndMenu(const char* prompt); virtual int SelectMenu(int how, MENU_ITEM_P **menu_list); virtual void ClipAround(int x,int y); virtual void PrintGlyph(int x,int y,int glyph); virtual void UseRIP(int how); int nhid; }; class NetHackQtGlyphs { public: NetHackQtGlyphs(); int width() const { return size.width(); } int height() const { return size.height(); } char *tileSet() const { return tilesets[tileset_index].name; } void toggleSize(); void setSize(int w, int h); void drawGlyph(QPainter&, int glyph, int pixelx, int pixely); void drawCell(QPainter&, int glyph, int cellx, int celly); private: QImage img; QPixmap pm,pm1, pm2; QSize size; int tileset_index; int loadTiles(const char *file); }; class BlackScrollView : public QScrollView { public: BlackScrollView() { viewport()->setBackgroundColor(black); } }; class NetHackQtMapWindow : public QWidget, public NetHackQtWindow { Q_OBJECT private: NetHackQtClickBuffer& clicksink; unsigned short glyph[ROWNO][COLNO]; unsigned short& Glyph(int x, int y) { return glyph[y][x]; } QPoint cursor; BlackScrollView viewport; QPixmap pet_annotation; Clusterizer change; QFont *rogue_font; QString messages; QRect messages_rect; void Changed(int x,int y); signals: void resized(); private slots: void updateTiles(); void moveMessages(int x, int y); protected: virtual void paintEvent(QPaintEvent*); virtual void mousePressEvent(QMouseEvent*); public: NetHackQtMapWindow(NetHackQtClickBuffer& click_sink); ~NetHackQtMapWindow(); virtual QWidget* Widget(); virtual bool Destroy(); virtual void Clear(); virtual void Display(bool block); virtual void CursorTo(int x,int y); virtual void PutStr(int attr, const char* text); virtual void ClipAround(int x,int y); 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(); void clickCursor(); }; class NetHackQtScrollText; class NetHackQtMessageWindow : QObject, public NetHackQtWindow { Q_OBJECT public: NetHackQtMessageWindow(); ~NetHackQtMessageWindow(); virtual QWidget* Widget(); virtual void Clear(); virtual void Display(bool block); virtual void PutStr(int attr, const char* text); void Scroll(int dx, int dy); void setMap(NetHackQtMapWindow*); private: NetHackQtScrollText* list; bool changed; NetHackQtMapWindow* map; private slots: void updateFont(); }; class NetHackQtLabelledIcon : public QWidget { public: NetHackQtLabelledIcon(QWidget* parent, const char* label); NetHackQtLabelledIcon(QWidget* parent, const char* label, const QPixmap& icon); enum { NoNum=-99999 }; void setLabel(const char*, bool lower=TRUE); // a string void setLabel(const char*, long, const char* tail=""); // a number void setLabel(const char*, long show_value, long comparative_value, const char* tail=""); void setIcon(const QPixmap&); virtual void setFont(const QFont&); void highlightWhenChanging(); void lowIsGood(); void dissipateHighlight(); virtual void show(); protected: void resizeEvent(QResizeEvent*); private: void initHighlight(); void setAlignments(); void highlight(const QPalette& highlight); void unhighlight(); bool low_is_good; int prev_value; int turn_count; /* last time the value changed */ QPalette hl_good; QPalette hl_bad; QLabel* label; QLabel* icon; }; class NetHackQtStatusWindow : QWidget, public NetHackQtWindow { Q_OBJECT public: NetHackQtStatusWindow(); virtual QWidget* Widget(); virtual void Clear(); virtual void Display(bool block); virtual void CursorTo(int x,int y); virtual void PutStr(int attr, const char* text); void fadeHighlighting(); protected: void resizeEvent(QResizeEvent*); private slots: void doUpdate(); private: enum { hilight_time=1 }; QPixmap p_str; QPixmap p_dex; QPixmap p_con; QPixmap p_int; QPixmap p_wis; QPixmap p_cha; QPixmap p_chaotic; QPixmap p_neutral; QPixmap p_lawful; QPixmap p_satiated; QPixmap p_hungry; QPixmap p_confused; QPixmap p_sick_fp; QPixmap p_sick_il; QPixmap p_blind; QPixmap p_stunned; QPixmap p_hallu; QPixmap p_encumber[5]; NetHackQtLabelledIcon name; NetHackQtLabelledIcon dlevel; NetHackQtLabelledIcon str; NetHackQtLabelledIcon dex; NetHackQtLabelledIcon con; NetHackQtLabelledIcon intel; NetHackQtLabelledIcon wis; NetHackQtLabelledIcon cha; NetHackQtLabelledIcon gold; NetHackQtLabelledIcon hp; NetHackQtLabelledIcon power; NetHackQtLabelledIcon ac; NetHackQtLabelledIcon level; NetHackQtLabelledIcon exp; NetHackQtLabelledIcon align; NetHackQtLabelledIcon time; NetHackQtLabelledIcon score; NetHackQtLabelledIcon weight; NetHackQtLabelledIcon hunger; NetHackQtLabelledIcon confused; NetHackQtLabelledIcon sick_fp; NetHackQtLabelledIcon sick_il; NetHackQtLabelledIcon blind; NetHackQtLabelledIcon stunned; NetHackQtLabelledIcon hallu; NetHackQtLabelledIcon encumber; QFrame hline1; QFrame hline2; QFrame hline3; int cursy; bool first_set; void nullOut(); void updateStats(); void checkTurnEvents(); }; class NetHackQtMenuDialog : public QDialog { Q_OBJECT public: NetHackQtMenuDialog(); void Accept(); void Reject(); void SetResult(int); virtual void done(int); protected: void resizeEvent(QResizeEvent*); signals: void Resized(); }; class NetHackQtMenuWindow : public QTableView, public NetHackQtWindow { Q_OBJECT public: NetHackQtMenuWindow(NetHackQtKeyBuffer&); ~NetHackQtMenuWindow(); virtual QWidget* Widget(); virtual void StartMenu(); virtual void AddMenu(int glyph, const ANY_P* identifier, char ch, char gch, int attr, const char* str, bool presel); virtual void EndMenu(const char* prompt); virtual int SelectMenu(int how, MENU_ITEM_P **menu_list); public slots: void All(); void ChooseNone(); void Invert(); void Search(); void Layout(); void ToggleSelect(int); protected: virtual void keyPressEvent(QKeyEvent*); //virtual void mouseDoubleClickEvent(QMouseEvent*); virtual void mousePressEvent(QMouseEvent*); virtual void mouseReleaseEvent(QMouseEvent*); virtual void mouseMoveEvent(QMouseEvent*); virtual void focusOutEvent(QFocusEvent*); virtual void focusInEvent(QFocusEvent*); virtual void paintCell(QPainter*, int, int); virtual int cellWidth(int col); private: struct MenuItem { MenuItem(); ~MenuItem(); int glyph; ANY_P identifier; int attr; const char* str; int count; char ch; bool selected; bool Selectable() const { return identifier.a_void!=0; } }; QArray item; int itemcount; int str_width; bool str_fixed; int next_accel; NetHackQtKeyBuffer& keysource; NetHackQtMenuDialog* dialog; QPushButton* ok; QPushButton* cancel; QPushButton* all; QPushButton* none; QPushButton* invert; QPushButton* search; QLabel prompt; int how; bool has_glyphs; int pressed; bool was_sel; }; class NetHackQtTextListBox; class NetHackQtRIP : public QWidget { private: static QPixmap* pixmap; char** line; int riplines; public: NetHackQtRIP(QWidget* parent); void setLines(char** l, int n); protected: virtual void paintEvent(QPaintEvent* event); QSize sizeHint() const; }; class NetHackQtTextWindow : public QDialog, public NetHackQtWindow { Q_OBJECT public: NetHackQtTextWindow(NetHackQtKeyBuffer&); ~NetHackQtTextWindow(); virtual QWidget* Widget(); virtual void Clear(); virtual bool Destroy(); virtual void Display(bool block); virtual void PutStr(int attr, const char* text); virtual void UseRIP(int how); public slots: void Search(); protected: virtual void done(int); virtual void keyPressEvent(QKeyEvent*); private slots: void doUpdate(); private: NetHackQtKeyBuffer& keysource; bool use_rip; bool str_fixed; QPushButton ok; QPushButton search; NetHackQtTextListBox* lines; NetHackQtRIP rip; }; class NetHackQtMenuOrTextWindow : public NetHackQtWindow { private: NetHackQtWindow* actual; NetHackQtKeyBuffer& keysource; public: NetHackQtMenuOrTextWindow(NetHackQtKeyBuffer&); virtual QWidget* Widget(); // Text virtual void Clear(); virtual bool Destroy(); virtual void Display(bool block); virtual void PutStr(int attr, const char* text); // Menu virtual void StartMenu(); virtual void AddMenu(int glyph, const ANY_P* identifier, char ch, char gch, int attr, const char* str, bool presel); virtual void EndMenu(const char* prompt); virtual int SelectMenu(int how, MENU_ITEM_P **menu_list); }; class NetHackQtDelay : QObject { private: int msec; public: NetHackQtDelay(int ms); void wait(); virtual void timerEvent(QTimerEvent* timer); }; class NetHackQtInvUsageWindow : public QWidget { public: NetHackQtInvUsageWindow(QWidget* parent); virtual void paintEvent(QPaintEvent*); private: void drawWorn(QPainter& painter, obj*, int x, int y, bool canbe=TRUE); }; // This class is the main widget for NetHack // // It is a collection of Message, Map, and Status windows. In the current // version of nethack there is only one of each, and this class makes this // assumption, not showing itself until all are inserted. // // This class simply knows how to layout such children sensibly. // // Since it is only responsible for layout, the class does not // note the actual class of the windows. // #ifndef KDE #include "qt_kde0.h" #endif class NetHackQtMainWindow : public KTopLevelWidget { Q_OBJECT public: NetHackQtMainWindow(NetHackQtKeyBuffer&); void AddMessageWindow(NetHackQtMessageWindow* window); void AddMapWindow(NetHackQtMapWindow* window); void AddStatusWindow(NetHackQtStatusWindow* window); void RemoveWindow(NetHackQtWindow* window); void updateInventory(); void fadeHighlighting(); public slots: void doMenuItem(int); void doKeys(const QString&); protected: virtual void resizeEvent(QResizeEvent*); virtual void keyPressEvent(QKeyEvent*); virtual void keyReleaseEvent(QKeyEvent* event); virtual void closeEvent(QCloseEvent*); private slots: void layout(); void raiseMap(); void zoomMap(); void raiseMessages(); void raiseStatus(); private: void ShowIfReady(); #ifdef KDE KMenuBar* menubar; #else QMenuBar* menubar; #endif NetHackQtMessageWindow* message; NetHackQtMapWindow* map; NetHackQtStatusWindow* status; NetHackQtInvUsageWindow* invusage; NetHackQtKeyBuffer& keysink; QWidgetStack* stack; int dirkey; const char* *macro; }; class NetHackQtYnDialog : QDialog { Q_OBJECT private: const char* question; const char* choices; char def; NetHackQtKeyBuffer& keysource; protected: virtual void keyPressEvent(QKeyEvent*); virtual void done(int); private slots: void doneItem(int); public: NetHackQtYnDialog(NetHackQtKeyBuffer& keysource,const char*,const char*,char); char Exec(); }; #ifdef KDE #define NetHackQtBindBase KApplication #elif defined(QWS) #define NetHackQtBindBase QPEApplication #else #define NetHackQtBindBase QApplication #endif class NetHackQtBind : NetHackQtBindBase { private: // Single-instance preservation... NetHackQtBind(int& argc, char** argv); static NetHackQtBind* instance; static NetHackQtKeyBuffer keybuffer; static NetHackQtClickBuffer clickbuffer; static QWidget* splash; static NetHackQtMainWindow* main; public: static void qt_init_nhwindows(int* argc, char** argv); static void qt_player_selection(); static void qt_askname(); static void qt_get_nh_event(); static void qt_exit_nhwindows(const char *); static void qt_suspend_nhwindows(const char *); static void qt_resume_nhwindows(); static winid qt_create_nhwindow(int type); static void qt_clear_nhwindow(winid wid); static void qt_display_nhwindow(winid wid, BOOLEAN_P block); static void qt_destroy_nhwindow(winid wid); static void qt_curs(winid wid, int x, int y); static void qt_putstr(winid wid, int attr, const char *text); #ifdef FILE_AREAS static void qt_display_file(const char *filearea, const char *filename, BOOLEAN_P must_exist); #else static void qt_display_file(const char *filename, BOOLEAN_P must_exist); #endif static void qt_start_menu(winid wid); static void qt_add_menu(winid wid, int glyph, const ANY_P * identifier, CHAR_P ch, CHAR_P gch, int attr, const char *str, BOOLEAN_P presel); static void qt_end_menu(winid wid, const char *prompt); static int qt_select_menu(winid wid, int how, MENU_ITEM_P **menu_list); static void qt_update_inventory(); static void qt_mark_synch(); static void qt_wait_synch(); static void qt_cliparound(int x, int y); static void qt_cliparound_window(winid wid, int x, int y); static void qt_print_glyph(winid wid,XCHAR_P x,XCHAR_P y,int glyph); static void qt_raw_print(const char *str); static void qt_raw_print_bold(const char *str); static int qt_nhgetch(); static int qt_nh_poskey(int *x, int *y, int *mod); static void qt_nhbell(); static int qt_doprev_message(); static char qt_yn_function(const char *question, const char *choices, CHAR_P def); static void qt_getlin(const char *prompt, char *line); static int qt_get_ext_cmd(); static void qt_number_pad(int); static void qt_delay_output(); static void qt_start_screen(); static void qt_end_screen(); static void qt_outrip(winid wid, int how); static int qt_kbhit(); private: virtual bool notify(QObject *receiver, QEvent *event); }; #endif slashem-0.0.7E7F3/include/mac-qt.h0000664000076400007640000000171110545462317014632 0ustar aliali/* SCCS Id: @(#)mac-qt.h 3.4 2003/06/01 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 2003. */ /* NetHack may be freely redistributed. See license for details. */ /* Compiler prefix file for the Macintosh Qt port. * * IMPORTANT: This file is intended only as a compiler prefix * file and must NEVER be included by other source (.c or .h) * files. * * Usage for MacOS X Project Builder: * Project menu -> Edit Active Target '_target_' -> * target settings dialog -> Settings -> Simple View -> * GCC Compiler Settings -> * set "Prefix Header" to include/mac-qt.h * * Usage for Metrowerks CodeWarrior: * Edit menu -> _target_ Settings -> Language Settings -> * C/C++ Language -> * set "Prefix File" to include/mac-qt.h */ #undef MAC #define UNIX #define BSD /* May already be defined by CodeWarrior as 0 or 1 */ #ifdef TARGET_API_MAC_CARBON # undef TARGET_API_MAC_CARBON #endif #define TARGET_API_MAC_CARBON 0 #define GCC_WARN slashem-0.0.7E7F3/include/gem_rsc.h0000664000076400007640000000542610545462317015076 0ustar aliali/* resource set indices for GEM_RSC */ #define MENU 0 /* menu */ #define DOABOUT 12 /* STRING in tree MENU */ #define DOQUIT 30 /* STRING in tree MENU */ #define STATUSLINE 1 /* form/dialog */ #define GRABSTATUS 1 /* BOX in tree STATUSLINE */ #define MAPWIN 2 /* form/dialog */ #define MAPBOX 0 /* BOX in tree MAPWIN */ #define MAPCURSOR 1 /* IBOX in tree MAPWIN */ #define ABOUT 3 /* form/dialog */ #define FLYABOUT 0 /* BOX in tree ABOUT */ #define OKABOUT 1 /* BUTTON in tree ABOUT */ #define NETHACKIMG0 3 /* ICON in tree ABOUT */ #define LINES 4 /* form/dialog */ #define FLYLINES 0 /* BOX in tree LINES */ #define QLINE 1 /* BUTTON in tree LINES */ #define LINESLIST 2 /* USERDEF in tree LINES */ #define YNCHOICE 5 /* form/dialog */ #define FLYYNCHOICE 0 /* BOX in tree YNCHOICE */ #define YNPROMPT 1 /* TEXT in tree YNCHOICE */ #define SOMECHARS 2 /* BOX in tree YNCHOICE */ #define YN1 3 /* BUTTON in tree YNCHOICE */ #define YNN 53 /* BUTTON in tree YNCHOICE */ #define ANYCHAR 55 /* BOX in tree YNCHOICE */ #define CHOSENCH 56 /* FBOXTEXT in tree YNCHOICE */ #define COUNT 58 /* FBOXTEXT in tree YNCHOICE */ #define YNOK 59 /* BUTTON in tree YNCHOICE */ #define LINEGET 6 /* form/dialog */ #define FLYLINEGET 0 /* BOX in tree LINEGET */ #define LGPROMPT 1 /* TEXT in tree LINEGET */ #define LGREPLY 2 /* FBOXTEXT in tree LINEGET */ #define QLG 3 /* BUTTON in tree LINEGET */ #define LGOK 4 /* BUTTON in tree LINEGET */ #define DIRECTION 7 /* form/dialog */ #define FLYDIRECTION 0 /* BOX in tree DIRECTION */ #define DIR1 5 /* BOXTEXT in tree DIRECTION */ #define DIR9 21 /* BOXTEXT in tree DIRECTION */ #define DIRDOWN 23 /* BOXTEXT in tree DIRECTION */ #define DIRUP 25 /* BOXTEXT in tree DIRECTION */ #define MSGWIN 8 /* form/dialog */ #define UPMSG 1 /* BOXCHAR in tree MSGWIN */ #define GRABMSGWIN 2 /* BOX in tree MSGWIN */ #define DNMSG 3 /* BOXCHAR in tree MSGWIN */ #define MSGLINES 4 /* USERDEF in tree MSGWIN */ #define NAMEGET 9 /* form/dialog */ #define FLYNAMEGET 0 /* BOX in tree NAMEGET */ #define PLNAME 2 /* FBOXTEXT in tree NAMEGET */ #define NETHACKPICTURE 4 /* BOXTEXT in tree NAMEGET */ #define PAGER 10 /* form/dialog */ #define FLYPAGER 0 /* BOX in tree PAGER */ #define QPAGER 1 /* BUTTON in tree PAGER */ #define NHICON 11 /* form/dialog */ slashem-0.0.7E7F3/include/eshk.h0000664000076400007640000000465710545462317014416 0ustar aliali/* 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. */ #ifndef ESHK_H #define ESHK_H #define REPAIR_DELAY 5 /* minimum delay between shop damage & repair */ #define BILLSZ 200 struct bill_x { unsigned bo_id; boolean useup; long price; /* price per unit */ long bquan; /* amount used up */ }; struct eshk { long robbed; /* amount stolen by most recent customer */ long credit; /* amount credited to customer */ long debit; /* amount of debt for using unpaid items */ long loan; /* shop-gold picked (part of debit) */ int shoptype; /* the value of rooms[shoproom].rtype */ schar shoproom; /* index in rooms; set by inshop() */ schar unused; /* to force alignment for stupid compilers */ boolean following; /* following customer since he owes us sth */ boolean surcharge; /* angry shk inflates prices */ coord shk; /* usual position shopkeeper */ coord shd; /* position shop door */ d_level shoplevel; /* level (& dungeon) of his shop */ int billct; /* no. of entries of bill[] in use */ struct bill_x bill[BILLSZ]; struct bill_x *bill_p; int visitct; /* nr of visits by most recent customer */ char customer[PL_NSIZ]; /* most recent customer */ char shknam[PL_NSIZ]; #ifdef OTHER_SERVICES long services; /* Services offered */ #define SHK_ID_BASIC 01L #define SHK_ID_PREMIUM 02L #define SHK_UNCURSE 010L #define SHK_APPRAISE 0100L #define SHK_SPECIAL_A 01000L #define SHK_SPECIAL_B 02000L #define SHK_SPECIAL_C 04000L #endif }; #define ESHK(mon) ((struct eshk *)&(mon)->mextra[0]) #define NOTANGRY(mon) ((mon)->mpeaceful) #define ANGRY(mon) (!NOTANGRY(mon)) # ifdef OTHER_SERVICES #define SHK_NOMATCH 0 /* Shk !know this class of object */ #define SHK_MATCH 1 /* Shk is expert */ #define SHK_GENERAL 2 /* Shk runs a general store */ /* * FUNCTION shk_class_match * * Return TRUE if a object class matches the shop type. * I.e. shk_class_match(WEAPON_CLASS, shkp) * * Return: SHK_MATCH, SHK_NOMATCH, SHK_GENERAL */ #define shk_class_match(class, shkp) \ ((shtypes[ESHK(shkp)->shoptype-SHOPBASE].symb == RANDOM_CLASS) ? \ SHK_GENERAL : \ ((shtypes[ESHK(shkp)->shoptype-SHOPBASE].symb == class) ? \ SHK_MATCH : SHK_NOMATCH)) # endif #endif /* ESHK_H */ slashem-0.0.7E7F3/include/amiconf.h0000664000076400007640000001134610545462317015071 0ustar aliali/* 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. */ #ifndef AMICONF_H #define AMICONF_H #undef abs /* avoid using macro form of abs */ #ifndef __SASC_60 # undef min /* this gets redefined */ # undef max /* this gets redefined */ #endif #include /* get time_t defined before use! */ #ifdef __SASC_60 /* since SAS can prevent re-inclusion */ #include /* general things, including builtins */ #include #endif #ifdef AZTEC_50 #include # define AZTEC_C_WORKAROUND /* Bug which turns up in sounds.c. Bummer... */ # define NO_SIGNAL /* 5.0 signal handling doesn't like SIGINT... */ #endif #ifdef _DCC #include # define _SIZE_T # 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, CONFIGDIR, and TROUBLEDIR */ /* 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 */ #endif #define FILENAME_CMP stricmp /* case insensitive */ #ifndef __SASC_60 # define O_BINARY 0 #endif /* Compile in New Intuition look for 2.0 */ #ifdef IDCMP_CLOSEWINDOW # ifndef INTUI_NEW_LOOK # define INTUI_NEW_LOOK 1 # endif #endif #define MFLOPPY /* You'll probably want this; provides assistance * for typical personal computer configurations */ #define RANDOM /* ### amidos.c ### */ extern void FDECL(nethack_exit, (int)); /* ### amiwbench.c ### */ extern void NDECL(ami_wbench_init); extern void NDECL(ami_wbench_args); extern int FDECL(ami_wbench_getsave, (int)); extern void FDECL(ami_wbench_unlink, (char *)); extern int FDECL(ami_wbench_iconsize, (char *)); extern void FDECL(ami_wbench_iconwrite, (char *)); extern int FDECL(ami_wbench_badopt, (const char *)); extern void NDECL(ami_wbench_cleanup); extern void FDECL(getlind, (const char *,char *,const char *)); /* ### winreq.c ### */ extern void amii_setpens(int); extern void FDECL(exit, (int)); extern void NDECL(CleanUp); extern void FDECL(Abort, (long)); extern int NDECL(getpid); extern char *FDECL(CopyFile, (const char *, const char *)); extern int NDECL(kbhit); extern int NDECL(WindowGetchar); extern void FDECL(ami_argset, (int *, char *[])); 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; #ifndef MICRO_H #include "micro.h" #endif #ifndef PCCONF_H #include "pcconf.h" /* remainder of stuff is almost same as the PC */ #endif #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 #ifdef AZTEC_C extern FILE *FDECL(freopen, (const char *, const char *, FILE *)); extern char *FDECL(gets, (char *)); #endif #define msmsg printf /* * If AZTEC_C we can't use the long cpath in vision.c.... */ #ifdef AZTEC_C # undef MACRO_CPATH #endif /* * (Possibly) configurable Amiga options: */ #define TEXTCOLOR /* Use colored monsters and objects */ #define HACKFONT /* Use special hack.font */ #define SHELL /* Have a shell escape command (!) */ #define MAIL /* Get mail at unexpected occasions */ #define DEFAULT_ICON "NetHack:default.icon" /* private icon */ #define AMIFLUSH /* toss typeahead (select flush in .cnf) */ /* #define OPT_DISPMAP /* enable fast_map option */ /* new window system options */ /* WRONG - AMIGA_INTUITION should go away */ #ifdef AMII_GRAPHICS # define AMIGA_INTUITION /* high power graphics interface (amii) */ #endif #define CHANGE_COLOR 1 #ifdef TEXTCOLOR # define DEPTH 6 /* Maximum depth of the screen allowed */ #else # define DEPTH 2 /* Four colors...sigh... */ #endif #define AMII_MAXCOLORS (1L< may not define off_t and size_t; if your system is * one of these, define them by hand below */ #if (defined(VMS) && !defined(__GNUC__)) || defined(MAC) #include #else # ifndef AMIGA # ifndef __WATCOMC__ #include # endif # endif #endif #if (defined(MICRO) && !defined(TOS)) || defined(ANCIENT_VAXC) # 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 */ #if defined(__TURBOC__) || defined(MAC) #include /* time_t is not in */ #endif #if defined(ULTRIX) && !(defined(ULTRIX_PROTO) || defined(NHSTDC)) /* The Ultrix v3.0 seems to be very wrong. */ # define time_t long #endif #if defined(ULTRIX) || defined(VMS) # define off_t long #endif #if defined(AZTEC) || defined(THINKC4) || defined(__TURBOC__) 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. * This is the type of signal handling functions. */ #if !defined(OS2) && (defined(_MSC_VER) || defined(__TURBOC__) || defined(__SC__) || defined(WIN32)) # define SIG_RET_TYPE void (__cdecl *)(int) #endif #ifndef SIG_RET_TYPE # if defined(NHSTDC) || defined(POSIX_TYPES) || defined(OS2) || defined(__DECC) # define SIG_RET_TYPE void (*)(int) # endif #endif #ifndef SIG_RET_TYPE # if defined(ULTRIX) || defined(SUNOS4) || defined(SVR3) || defined(SVR4) /* SVR3 is defined automatically by some systems */ # define SIG_RET_TYPE void (*)() # endif #endif #ifndef SIG_RET_TYPE /* BSD, SIII, SVR2 and earlier, Sun3.5 and earlier */ # define SIG_RET_TYPE int (*)() #endif #if !defined(__cplusplus) && !defined(__GO32__) #if defined(BSD) || defined(ULTRIX) || defined(RANDOM) # ifdef random # undef random # endif # if !defined(__SC__) && !defined(__CYGWIN__) && !defined(LINUX) E long NDECL(random); # endif # if (!defined(SUNOS4) && !defined(bsdi) && !defined(__FreeBSD__)) || defined(RANDOM) E void FDECL(srandom, (unsigned int)); # else # if !defined(bsdi) && !defined(LINUX) && !defined(__CYGWIN__) && !defined(__FreeBSD__) E int FDECL(srandom, (unsigned int)); # endif # endif #else E long FDECL(lrand48, (void)); E void FDECL(srand48, (long)); #endif /* BSD || ULTRIX || RANDOM */ #if !defined(BSD) || defined(ultrix) /* real BSD wants all these to return int */ # ifndef MICRO E void FDECL(exit, (int)); # endif /* MICRO */ /* compensate for some CSet/2 bogosities */ # if defined(OS2_CSET2) && defined(OS2_CSET2_VER_2) # define open _open # define close _close # define read _read # define write _write # define lseek _lseek # define chdir _chdir # define getcwd _getcwd # define setmode _setmode # endif /* OS2_CSET2 && OS2_CSET2_VER_2 */ /* If flex thinks that we're not __STDC__ it declares free() to return int and we die. We must use __STDC__ instead of NHSTDC because the former is naturally what flex tests for. */ # if defined(__STDC__) || !defined(FLEX_SCANNER) # ifndef OS2_CSET2 # ifndef MONITOR_HEAP E void FDECL(free, (genericptr_t)); # endif # 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__)) E void FDECL(perror, (const char *)); # endif # endif #endif #endif #ifndef NeXT #ifdef POSIX_TYPES E void FDECL(qsort, (genericptr_t,size_t,size_t, int(*)(const genericptr,const genericptr))); #else # if (defined(BSD) || defined(ULTRIX)) && (!defined(LINUX) && !defined(__CYGWIN__)) E int qsort(); # else # if !defined(LATTICE) && !defined(AZTEC_50) E void FDECL(qsort, (genericptr_t,size_t,size_t, int(*)(const genericptr,const genericptr))); # endif # endif #endif #endif /* NeXT */ #ifndef __SASC_60 #if !defined(AZTEC_50) && !defined(__GNUC__) /* may already be defined */ # ifdef ULTRIX # ifdef ULTRIX_PROTO E int FDECL(lseek, (int,off_t,int)); # else E long FDECL(lseek, (int,off_t,int)); # endif /* Ultrix 3.0 man page mistakenly says it returns an int. */ E int FDECL(write, (int,char *,int)); E int FDECL(link, (const char *, const char*)); # else # ifndef bsdi E long FDECL(lseek, (int,long,int)); # endif # if defined(POSIX_TYPES) || defined(__TURBOC__) || defined(_MSC_VER) # ifndef bsdi E int FDECL(write, (int, const void *,unsigned)); # endif # else # ifndef __MWERKS__ /* metrowerks defines write via universal headers */ E int FDECL(write, (int,genericptr_t,unsigned)); # endif # endif # endif /* ULTRIX */ # ifdef OS2_CSET2 /* IBM CSet/2 */ # ifdef OS2_CSET2_VER_1 E int FDECL(unlink, (char *)); # else # ifndef __SC__ E int FDECL(unlink, (const char *)); # else E int FDECL(unlink, (const char *)); /* prototype is ok in ver >= 2 */ # endif # endif # endif #endif /* AZTEC_50 && __GNUC__ */ #ifdef MAC #ifndef __CONDITIONALMACROS__ /* universal headers */ E int FDECL(close, (int)); /* unistd.h */ E int FDECL(read, (int, char *, int)); /* unistd.h */ E int FDECL(chdir, (const char *)); /* unistd.h */ E char *FDECL(getcwd, (char *,int)); /* unistd.h */ #endif E int FDECL(open, (const char *,int)); #endif #if defined(MICRO) E int FDECL(close, (int)); #ifndef __EMX__ E int FDECL(read, (int,genericptr_t,unsigned int)); #endif E int FDECL(open, (const char *,int,...)); E int FDECL(dup2, (int, int)); E int FDECL(setmode, (int,int)); E int NDECL(kbhit); # if !defined(_DCC) && !defined(__MINGW32__) # if defined(__TURBOC__) || defined(_MSC_VER) E int FDECL(chdir, (const char *)); # else # ifndef __EMX__ E int FDECL(chdir, (char *)); # endif # endif # ifndef __EMX__ E char *FDECL(getcwd, (char *,int)); # endif # endif /* !_DCC */ #endif #ifdef ULTRIX E int FDECL(close, (int)); E int FDECL(atoi, (const char *)); E int FDECL(chdir, (const char *)); # if !defined(ULTRIX_CC20) && !defined(__GNUC__) E int FDECL(chmod, (const char *,int)); E mode_t FDECL(umask, (int)); # endif E int FDECL(read, (int,genericptr_t,unsigned)); /* these aren't quite right, but this saves including lots of system files */ E int FDECL(stty, (int,genericptr_t)); E int FDECL(gtty, (int,genericptr_t)); E int FDECL(ioctl, (int, int, char*)); E int FDECL(isatty, (int)); /* 1==yes, 0==no, -1==error */ #include # if defined(ULTRIX_PROTO) || defined(__GNUC__) E int NDECL(fork); # else E long NDECL(fork); # endif #endif /* ULTRIX */ #ifdef VMS # ifndef abs E int FDECL(abs, (int)); # endif E int FDECL(atexit, (void (*)(void))); 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 /* #include */ E int FDECL(close, (int)); E int VDECL(creat, (const char *,unsigned,...)); E int FDECL(delete, (const char *)); E int FDECL(fstat, ( /*_ int, stat_t * _*/ )); E int FDECL(isatty, (int)); /* 1==yes, 0==no, -1==error */ E long FDECL(lseek, (int,long,int)); E int VDECL(open, (const char *,int,unsigned,...)); E int FDECL(read, (int,genericptr_t,unsigned)); E int FDECL(rename, (const char *,const char *)); E int FDECL(stat, ( /*_ const char *,stat_t * _*/ )); E int FDECL(write, (int,const genericptr,unsigned)); #endif #endif /* __SASC_60 */ /* both old & new versions of Ultrix want these, but real BSD does not */ #ifdef ultrix E void abort(); E void bcopy(); # ifdef ULTRIX E int FDECL(system, (const char *)); # ifndef _UNISTD_H_ E int FDECL(execl, (const char *, ...)); # endif # endif #endif #ifdef MICRO E void NDECL(abort); E void FDECL(_exit, (int)); E int FDECL(system, (const char *)); #endif #if defined(HPUX) && !defined(_POSIX_SOURCE) E long NDECL(fork); #endif #ifdef POSIX_TYPES /* The POSIX string.h is required to define all the mem* and str* functions */ #include #else #if defined(SYSV) || defined(VMS) || defined(MAC) || defined(SUNOS4) # if defined(NHSTDC) || (defined(VMS) && !defined(ANCIENT_VAXC)) # if !defined(_AIX32) && !(defined(SUNOS4) && defined(__STDC__)) && !defined(LINUX) /* Solaris unbundled cc (acc) */ E int FDECL(memcmp, (const void *,const void *,size_t)); E void *FDECL(memcpy, (void *, const void *, size_t)); E void *FDECL(memset, (void *, int, size_t)); # endif # else # ifndef memcmp /* some systems seem to macro these back to b*() */ E int memcmp(); # endif # ifndef memcpy E char *memcpy(); # endif # ifndef memset E char *memset(); # endif # endif #else # ifdef HPUX E int FDECL(memcmp, (char *,char *,int)); E void *FDECL(memcpy, (char *,char *,int)); E void *FDECL(memset, (char*,int,int)); # endif #endif #endif /* POSIX_TYPES */ #if defined(MICRO) && !defined(LATTICE) # if defined(TOS) && defined(__GNUC__) E int FDECL(memcmp, (const void *,const void *,size_t)); E void *FDECL(memcpy, (void *,const void *,size_t)); E void *FDECL(memset, (void *,int,size_t)); # else # if defined(AZTEC_50) || defined(NHSTDC) || defined(WIN32) E int FDECL(memcmp, (const void *, const void *, size_t)); E void *FDECL(memcpy, (void *, const void *, size_t)); E void *FDECL(memset, (void *, int, size_t)); # else E int FDECL(memcmp, (char *,char *,unsigned int)); E char *FDECL(memcpy, (char *,char *,unsigned int)); E char *FDECL(memset, (char*,int,int)); # endif /* AZTEC_50 || NHSTDC */ # endif /* TOS */ #endif /* MICRO */ #if defined(BSD) && defined(ultrix) /* i.e., old versions of Ultrix */ E void sleep(); #endif #if defined(ULTRIX) || defined(SYSV) E unsigned sleep(unsigned); #endif #if defined(HPUX) E unsigned int FDECL(sleep, (unsigned int)); #endif #ifdef VMS E int FDECL(sleep, (unsigned)); #endif E char *FDECL(getenv, (const char *)); E char *getlogin(void); #if defined(HPUX) && !defined(_POSIX_SOURCE) E long NDECL(getuid); E long NDECL(getgid); E long NDECL(getpid); #else # ifdef POSIX_TYPES 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 # ifdef VMS E int NDECL(getppid); 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) #define seteuid(x) setreuid(-1, (x)); #endif /*# string(s).h #*/ #if !defined(_XtIntrinsic_h) && !defined(POSIX_TYPES) /* #includes ; so does defining POSIX_TYPES */ #if (defined(ULTRIX) || defined(NeXT)) && defined(__GNUC__) #include #else E char *FDECL(strcpy, (char *,const char *)); E char *FDECL(strncpy, (char *,const char *,size_t)); E char *FDECL(strcat, (char *,const char *)); E char *FDECL(strncat, (char *,const char *,size_t)); E char *FDECL(strpbrk, (const char *,const char *)); # if defined(SYSV) || defined(MICRO) || defined(MAC) || defined(VMS) || defined(HPUX) E char *FDECL(strchr, (const char *,int)); E char *FDECL(strrchr, (const char *,int)); # else /* BSD */ E char *FDECL(index, (const char *,int)); E char *FDECL(rindex, (const char *,int)); # endif E int FDECL(strcmp, (const char *,const char *)); E int FDECL(strncmp, (const char *,const char *,size_t)); # if defined(MICRO) || defined(MAC) || defined(VMS) E size_t FDECL(strlen, (const char *)); # else # ifdef HPUX E unsigned int FDECL(strlen, (char *)); # else # if !(defined(ULTRIX_PROTO) && defined(__GNUC__)) && !defined(LINUX) E int FDECL(strlen, (const char *)); # endif # endif /* HPUX */ # endif /* MICRO */ #endif /* ULTRIX */ #endif /* !_XtIntrinsic_h_ && !POSIX_TYPES */ #if defined(ULTRIX) && defined(__GNUC__) E char *FDECL(index, (const char *,int)); E char *FDECL(rindex, (const char *,int)); #endif /* Old varieties of BSD have char *sprintf(). * Newer varieties of BSD have int sprintf() but allow for the old char *. * Several varieties of SYSV and PC systems also have int sprintf(). * If your system doesn't agree with this breakdown, you may want to change * this declaration, especially if your machine treats the types differently. * If your system defines sprintf, et al, in stdio.h, add to the initial * #if. */ #if defined(ULTRIX) || defined(__DECC) || defined(__SASC_60) || defined(WIN32) #define SPRINTF_PROTO #endif #if (defined(SUNOS4) && defined(__STDC__)) || defined(_AIX32) #define SPRINTF_PROTO #endif #if defined(TOS) || defined(AZTEC_50) || defined(__sgi) || defined(__GNUC__) /* problem with prototype mismatches */ #define SPRINTF_PROTO #endif #if defined(__MWERKS__) || defined(__SC__) /* Metrowerks already has a prototype for sprintf() */ # define SPRINTF_PROTO #endif #ifndef SPRINTF_PROTO # if defined(POSIX_TYPES) || defined(DGUX) || defined(NeXT) || !defined(BSD) E int FDECL(sprintf, (char *,const char *,...)); # else # define OLD_SPRINTF E char *sprintf(); # endif #endif #ifdef SPRINTF_PROTO # undef SPRINTF_PROTO #endif #ifndef __SASC_60 #ifdef NEED_VARARGS # if defined(USE_STDARG) || defined(USE_VARARGS) # if !defined(SVR4) && !defined(apollo) # if !(defined(ULTRIX_PROTO) && defined(__GNUC__)) # if !(defined(SUNOS4) && defined(__STDC__)) /* Solaris unbundled cc (acc) */ E int FDECL(vsprintf, (char *, const char *, va_list)); E int FDECL(vfprintf, (FILE *, const char *, va_list)); E int FDECL(vprintf, (const char *, va_list)); # endif # endif # endif # else # define vprintf printf # define vfprintf fprintf # define vsprintf sprintf # endif #endif /* NEED_VARARGS */ #endif #ifdef MICRO E int FDECL(tgetent, (const char *,const char *)); E void FDECL(tputs, (const char *,int,int (*)())); E int FDECL(tgetnum, (const char *)); E int FDECL(tgetflag, (const char *)); E char *FDECL(tgetstr, (const char *,char **)); E char *FDECL(tgoto, (const char *,int,int)); #else # if ! (defined(HPUX) && defined(_POSIX_SOURCE)) E int FDECL(tgetent, (char *,const char *)); E void FDECL(tputs, (const char *,int,int (*)())); # endif E int FDECL(tgetnum, (const char *)); E int FDECL(tgetflag, (const char *)); E char *FDECL(tgetstr, (const char *,char **)); E char *FDECL(tgoto, (const char *,int,int)); #endif #ifdef ALLOC_C E genericptr_t FDECL(malloc, (size_t)); #endif /* time functions */ # ifndef LATTICE # if !(defined(ULTRIX_PROTO) && defined(__GNUC__)) # ifndef __WATCOMC__ E struct tm *FDECL(localtime, (const time_t *)); # endif # endif # endif # if defined(ULTRIX) || (defined(BSD) && defined(POSIX_TYPES)) || defined(SYSV) || defined(MICRO) || defined(VMS) || defined(MAC) || (defined(HPUX) && defined(_POSIX_SOURCE)) # ifndef __WATCOMC__ E time_t FDECL(time, (time_t *)); # endif # else E long FDECL(time, (time_t *)); # endif /* ULTRIX */ #ifdef VMS /* used in makedefs.c, but missing from gcc-vms's */ E char *FDECL(ctime, (const time_t *)); #endif #ifdef MICRO # ifdef abs # undef abs # endif E int FDECL(abs, (int)); # ifdef atoi # undef atoi # endif E int FDECL(atoi, (const char *)); #endif #undef E #endif /* !__cplusplus && !__GO32__ */ #endif /* SYSTEM_H */ slashem-0.0.7E7F3/include/objclass.h0000664000076400007640000001477610545462317015267 0ustar aliali/* 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. */ #ifndef OBJCLASS_H #define OBJCLASS_H /* definition of a class of objects */ struct objclass { short oc_name_idx; /* index of actual name */ short oc_descr_idx; /* description when name unknown */ char * oc_uname; /* called by user */ Bitfield(oc_name_known,1); Bitfield(oc_merge,1); /* merge otherwise equal objects */ Bitfield(oc_uses_known,1); /* obj->known affects full decription */ /* otherwise, obj->dknown and obj->bknown */ /* tell all, and obj->known should always */ /* be set for proper merging behavior */ Bitfield(oc_pre_discovered,1); /* Already known at start of game; */ /* won't be listed as a discovery. */ Bitfield(oc_magic,1); /* inherently magical object */ Bitfield(oc_charged,1); /* may have +n or (n) charges */ Bitfield(oc_unique,1); /* special one-of-a-kind object */ Bitfield(oc_nowish,1); /* cannot wish for this object */ Bitfield(oc_big,1); #define oc_bimanual oc_big /* for weapons & tools used as weapons */ #define oc_bulky oc_big /* for armor */ Bitfield(oc_tough,1); /* hard gems/rings */ Bitfield(oc_dir,3); #define NODIR 1 /* for wands/spells: non-directional */ #define IMMEDIATE 2 /* directional */ #define RAY 3 /* zap beams */ #define PIERCE 1 /* for weapons & tools used as weapons */ #define SLASH 2 /* (latter includes iron ball & chain) */ #define EXPLOSION 4 /* (rockets, grenades) */ #define WHACK 0 Bitfield(oc_material,5); #define LIQUID 1 /* currently only for venom */ #define WAX 2 #define VEGGY 3 /* foodstuffs */ #define FLESH 4 /* ditto */ #define PAPER 5 #define CLOTH 6 #define LEATHER 7 #define WOOD 8 #define BONE 9 #define DRAGON_HIDE 10 /* not leather! */ #define IRON 11 /* Fe - includes steel */ #define METAL 12 /* Sn, &c. */ #define COPPER 13 /* Cu - includes brass */ #define SILVER 14 /* Ag */ #define GOLD 15 /* Au */ #define PLATINUM 16 /* Pt */ #define MITHRIL 17 #define PLASTIC 18 #define GLASS 19 #define GEMSTONE 20 #define MINERAL 21 #define is_organic(otmp) (objects[(otmp)->otyp].oc_material <= WOOD) #define is_metallic(otmp) (objects[(otmp)->otyp].oc_material >= IRON && \ 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(otmp) || is_corrodeable(otmp)) schar oc_subtyp; /* Bitfield(oc_subtyp,3);*/ /* Now too big for a bitfield */ #define oc_skill oc_subtyp /* for weapons, spellbooks, tools, gems */ #define oc_armcat oc_subtyp /* for armor */ #define ARM_SHIELD 1 /* needed for special wear function */ #define ARM_HELM 2 #define ARM_GLOVES 3 #define ARM_BOOTS 4 #define ARM_CLOAK 5 #define ARM_SHIRT 6 #define ARM_SUIT 0 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 */ /* Check the AD&D rules! The FIRST is small monster damage. */ /* for weapons, and tools, rocks, and gems useful as weapons */ schar oc_wsdam, oc_wldam; /* max small/large monster damage */ #define oc_range oc_wsdam /* for strength independant ranged weapons */ #define oc_rof oc_wldam /* rate of fire bonus for ranged weapons */ schar oc_oc1, oc_oc2; #define oc_hitbon oc_oc1 /* weapons: "to hit" bonus */ #define w_ammotyp oc_oc2 /* type of ammo taken by ranged weapon */ #define WP_GENERIC 0 /* all ammo subclasses ok */ #define WP_BULLET 1 #define WP_SHELL 2 #define WP_ROCKET 3 #define WP_GRENADE 4 #define a_ac oc_oc1 /* armor class, used in ARM_BONUS in do.c */ #define a_can oc_oc2 /* armor: used in mhitu.c */ #define oc_level oc_oc2 /* books: spell level */ unsigned short oc_nutrition; /* food value */ }; struct objdescr { const char *oc_name; /* actual name */ const char *oc_descr; /* description when name unknown */ }; extern NEARDATA struct objclass objects[]; extern NEARDATA struct objdescr obj_descr[]; /* * All objects have a class. Make sure that all classes have a corresponding * symbol below. */ #define RANDOM_CLASS 0 /* used for generating random objects */ #define ILLOBJ_CLASS 1 #define WEAPON_CLASS 2 #define ARMOR_CLASS 3 #define RING_CLASS 4 #define AMULET_CLASS 5 #define TOOL_CLASS 6 #define FOOD_CLASS 7 #define POTION_CLASS 8 #define SCROLL_CLASS 9 #define SPBOOK_CLASS 10 /* actually SPELL-book */ #define WAND_CLASS 11 #define COIN_CLASS 12 #define GEM_CLASS 13 #define ROCK_CLASS 14 #define BALL_CLASS 15 #define CHAIN_CLASS 16 #define VENOM_CLASS 17 #define MAXOCLASSES 18 #define ALLOW_COUNT (MAXOCLASSES+1) /* Can be used in the object class */ #define ALL_CLASSES (MAXOCLASSES+2) /* input to getobj(). */ #define ALLOW_NONE (MAXOCLASSES+3) /* */ #define ALLOW_FLOOROBJ (MAXOCLASSES+4) /* */ #define ALLOW_THISPLACE (MAXOCLASSES+5) /* */ #define BURNING_OIL (MAXOCLASSES+1) /* Can be used as input to explode. */ #define MON_EXPLODE (MAXOCLASSES+2) /* Exploding monster (e.g. gas spore) */ #if 0 /* moved to decl.h so that makedefs.c won't see them */ extern const char def_oc_syms[MAXOCLASSES]; /* default class symbols */ extern uchar oc_syms[MAXOCLASSES]; /* current class symbols */ #endif /* Default definitions of all object-symbols (must match classes above). */ #define ILLOBJ_SYM ']' /* also used for mimics */ #define WEAPON_SYM ')' #define ARMOR_SYM '[' #define RING_SYM '=' #define AMULET_SYM '"' #define TOOL_SYM '(' #define FOOD_SYM '%' #define POTION_SYM '!' #define SCROLL_SYM '?' #define SPBOOK_SYM '+' #define WAND_SYM '/' #define GOLD_SYM '$' #define GEM_SYM '*' #define ROCK_SYM '`' #define BALL_SYM '0' #define CHAIN_SYM '_' #define VENOM_SYM '.' struct fruit { char fname[PL_FSIZ]; int fid; struct fruit *nextf; }; #define newfruit() (struct fruit *)alloc(sizeof(struct fruit)) #define dealloc_fruit(rind) free((genericptr_t) (rind)) #define OBJ_NAME(obj) (obj_descr[(obj).oc_name_idx].oc_name) #define OBJ_DESCR(obj) (obj_descr[(obj).oc_descr_idx].oc_descr) #endif /* OBJCLASS_H */ slashem-0.0.7E7F3/include/spell.h0000664000076400007640000000254710545462317014577 0ustar aliali/* SCCS Id: @(#)spell.h 3.4 1995/06/01 */ /* Copyright 1986, M. Stephenson */ /* NetHack may be freely redistributed. See license for details. */ #ifndef SPELL_H #define SPELL_H struct spell { short sp_id; /* spell id (== object.otyp) */ xchar sp_lev; /* power level */ int sp_know; /* knowlege of spell */ }; /* levels of memory destruction with a scroll of amnesia */ #define ALL_MAP 0x1 #define ALL_SPELLS 0x2 #define decrnknow(spell) spl_book[spell].sp_know-- #define spellid(spell) spl_book[spell].sp_id #define spellknow(spell) spl_book[spell].sp_know /* Zap types, also used for explosions */ #define ZT_MAGIC_MISSILE (AD_MAGM-1) #define ZT_FIRE (AD_FIRE-1) #define ZT_COLD (AD_COLD-1) #define ZT_SLEEP (AD_SLEE-1) #define ZT_DEATH (AD_DISN-1) /* or disintegration */ #define ZT_LIGHTNING (AD_ELEC-1) #define ZT_POISON_GAS (AD_DRST-1) #define ZT_ACID (AD_ACID-1) #define ZT_LAST (ZT_ACID) /*For checking of spells of a type*/ #define ZT_FIRST (ZT_MAGIC_MISSILE) /* 8 and 9 are currently unassigned */ #define ZT_WAND(x) (x) #define ZT_SPELL(x) (10+(x)) #define ZT_BREATH(x) (20+(x)) #define ZT_MEGA(x) (30+(x)) #define ZT_MONWAND(x) (-(30+(x))) #endif /* SPELL_H */ slashem-0.0.7E7F3/include/mkroom.h0000664000076400007640000001160110545462317014753 0ustar aliali/* 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. */ #ifndef MKROOM_H #define MKROOM_H /* mkroom.h - types and structures for room and shop initialization */ struct mkroom { schar lx,hx,ly,hy; /* usually xchar, but hx may be -1 */ schar rtype; /* type of room (zoo, throne, etc...) */ schar rlit; /* is the room lit ? */ schar doorct; /* door count */ schar fdoor; /* index for the first door of the room */ schar nsubrooms; /* number of subrooms */ boolean irregular; /* true if room is non-rectangular */ struct mkroom *sbrooms[MAX_SUBROOMS]; /* Subrooms pointers */ struct monst *resident; /* priest/shopkeeper/guard for this room */ }; struct shclass { const char *name; /* name of the shop type */ char symb; /* this identifies the shop type */ int prob; /* the shop type probability in % */ schar shdist; /* object placement type */ #define D_SCATTER 0 /* normal placement */ #define D_SHOP 1 /* shop-like placement */ #define D_TEMPLE 2 /* temple-like placement */ struct itp { int iprob; /* probability of an item type */ int itype; /* item type: if >=0 a class, if < 0 a specific item */ } iprobs[8]; const char * const *shknms; /* list of shopkeeper names for this type */ }; extern NEARDATA struct mkroom rooms[(MAXNROFROOMS+1)*2]; extern NEARDATA struct mkroom* subrooms; /* the normal rooms on the current level are described in rooms[0..n] for * some n= rooms && (x) < rooms + MAXNROFROOMS) #define IS_ROOM_INDEX(x) ((x) >= 0 && (x) < MAXNROFROOMS) #define IS_SUBROOM_PTR(x) ((x) >= subrooms && \ (x) < subrooms + MAXNROFROOMS) #define IS_SUBROOM_INDEX(x) ((x) > MAXNROFROOMS && (x) < (MAXNROFROOMS*2)) #define ROOM_INDEX(x) ((x) - rooms) #define SUBROOM_INDEX(x) ((x) - subrooms) #define IS_LAST_ROOM_PTR(x) (ROOM_INDEX(x) == nroom) #define IS_LAST_SUBROOM_PTR(x) (!nsubroom || SUBROOM_INDEX(x) == nsubroom) #endif /* MKROOM_H */ slashem-0.0.7E7F3/include/flag.h0000664000076400007640000003300410545462317014361 0ustar aliali/* SCCS Id: @(#)flag.h 3.4 2002/08/22 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ /* If you change the flag structure make sure you increment EDITLEVEL in */ /* patchlevel.h if needed. Changing the instance_flags structure does */ /* not require incrementing EDITLEVEL. */ #ifndef FLAG_H #define FLAG_H /* * Persistent flags that are saved and restored with the game. * */ struct flag { #ifdef AMIFLUSH boolean altmeta; /* use ALT keys as META */ boolean amiflush; /* kill typeahead */ #endif #ifdef MFLOPPY boolean asksavedisk; #endif boolean autodig; /* MRKR: Automatically dig */ boolean autoquiver; /* Automatically fill quiver */ boolean beginner; #ifdef MAIL boolean biff; /* enable checking for mail */ #endif boolean botl; /* partially redo status line */ boolean botlx; /* print an entirely new bottom line */ boolean confirm; /* confirm before hitting tame monsters */ boolean debug; /* in debugging mode */ #define wizard flags.debug boolean end_own; /* list all own scores */ boolean explore; /* in exploration mode */ #ifdef OPT_DISPMAP boolean fast_map; /* use optimized, less flexible map display */ #endif #define discover flags.explore boolean female; boolean forcefight; boolean friday13; /* it's Friday the 13th */ boolean groundhogday; /* KMH -- February 2 */ boolean help; /* look in data file for info about stuff */ boolean ignintr; /* ignore interrupts */ #ifdef INSURANCE boolean ins_chkpt; /* checkpoint as appropriate */ #endif boolean invlet_constant; /* let objects keep their inventory symbol */ #ifdef SHOW_WEIGHT boolean invweight; /* show weight in inventory and when picking up */ #endif /*WAC keep_save option*/ #ifdef KEEP_SAVE boolean keep_savefile; /* Keep Old Save files*/ #endif boolean legacy; /* print game entry "story" */ boolean lit_corridor; /* show a dark corr as lit if it is in sight */ boolean made_amulet; boolean menu_on_esc; /* show menu when hitting esc */ 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 */ #ifdef MAC boolean page_wait; /* put up a --More-- after a page of messages */ #endif boolean perm_invent; /* keep full inventories up until dismissed */ boolean pickup; /* whether you pickup or move and look */ boolean pickup_thrown; /* auto-pickup items you threw */ boolean pushweapon; /* When wielding, push old weapon into second slot */ boolean rest_on_space; /* space means rest */ boolean safe_dog; /* give complete protection to the dog */ #ifdef EXP_ON_BOTL boolean showexp; /* show experience points */ #endif #ifdef SCORE_ON_BOTL boolean showscore; /* show score */ #endif #ifdef SHOW_DMG boolean showdmg; /* show damage */ #endif #ifdef SHOW_WEIGHT boolean showweight; /* show weight on status line */ #endif 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 */ boolean toptenwin; /* ending list in window instead of stdout */ boolean verbose; /* max battle info */ boolean prayconfirm; /* confirm before praying */ int end_top, end_around; /* describe desired score list */ unsigned ident; /* social security number for each monster */ unsigned moonphase; unsigned long suppress_alert; #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 */ /* KMH, role patch -- Variables used during startup. * * If the user wishes to select a role, race, gender, and/or alignment * during startup, the choices should be recorded here. This * might be specified through command-line options, environmental * variables, a popup dialog box, menus, etc. * * These values are each an index into an array. They are not * characters or letters, because that limits us to 26 roles. * They are not booleans, because someday someone may need a neuter * gender. Negative values are used to indicate that the user * hasn't yet specified that particular value. If you determine * that the user wants a random choice, then you should set an * appropriate random value; if you just left the negative value, * the user would be asked again! * * These variables are stored here because the u structure is * cleared during character initialization, and because the * flags structure is restored for saved games. Thus, we can * use the same parameters to build the role entry for both * new and restored games. * * These variables should not be referred to after the character * is initialized or restored (specifically, after role_init() * is called). */ int initrole; /* starting role (index into roles[]) */ 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 */ /* KMH, balance patch */ int boot_count; /* boots from fishing pole */ 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; unsigned short amii_dripens[ 20 ]; /* DrawInfo Pens currently there are 13 in v39 */ AMII_COLOR_TYPE amii_curmap[ AMII_MAXCOLORS ]; /* colormap */ #endif }; /* * Flags that are set each time the game is started. * These are not saved with the game. * */ struct instance_flags { 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 */ boolean menu_requested; /* Flag for overloaded use of 'm' prefix * on some non-move commands */ uchar num_pad_mode; int menu_headings; /* ATR for menu headings */ 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 */ boolean travel1; /* first travel step */ coord travelcc; /* coordinates for travel_cache */ #ifdef WIZARD boolean sanity_check; /* run sanity checks */ boolean mon_polycontrol; /* debug: control monster polymorphs */ #endif #ifdef TTY_GRAPHICS char prevmsg_window; /* type of old message window to use */ boolean extmenu; /* extended commands use menu interface */ #endif #ifdef MENU_COLOR boolean use_menu_color; /* use color in menus; only if wc_color */ #endif #ifdef MFLOPPY boolean checkspace; /* check disk space before writing files */ /* (in iflags to allow restore after moving * to >2GB partition) */ #endif #ifdef MICRO boolean BIOS; /* use IBM or ST BIOS calls when appropriate */ #endif #if defined(MICRO) || defined(WIN32) 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 hasalleg; /* has a Allegor compatible adapter */ boolean usealleg; /* use the Allegro library */ 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_amount; /* scroll this amount at scroll_margin */ 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_eight_bit_input; /* allow eight bit input */ boolean wc_mouse_support; /* allow mouse support */ boolean wc2_fullscreen; /* run fullscreen */ boolean wc2_softkeyboard; /* use software keyboard */ boolean wc2_wraptext; /* wrap text */ boolean cmdassist; /* provide detailed assistance for some commands */ boolean obsolete; /* obsolete options can point at this, it isn't used */ /* Items which belong in flags, but are here to allow save compatibility */ boolean lootabc; /* use "a/b/c" rather than "o/i/b" when looting */ boolean showrace; /* show hero glyph by race rather than by role */ boolean travelcmd; /* allow travel command */ int runmode; /* update screen display during run moves */ #ifdef AUTOPICKUP_EXCEPTIONS struct autopickup_exception *autopickup_exceptions[2]; #define AP_LEAVE 0 #define AP_GRAB 1 #endif #ifdef WIN32CON #define MAX_ALTKEYHANDLER 25 char altkeyhandler[MAX_ALTKEYHANDLER]; #endif }; /* * 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 obsolete #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; /* runmode options */ #define RUN_TPORT 0 /* don't update display until movement stops */ #define RUN_LEAP 1 /* update display every 7 steps */ #define RUN_STEP 2 /* update display every single step */ #define RUN_CRAWL 3 /* walk w/ extra delay after each update */ #endif /* FLAG_H */ slashem-0.0.7E7F3/include/rm.h0000664000076400007640000003630010545462317014070 0ustar aliali/* 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. */ #ifndef RM_H #define RM_H /* * The dungeon presentation graphics code and data structures were rewritten * and generalized for NetHack's release 2 by Eric S. Raymond (eric@snark) * building on Don G. Kneller's MS-DOS implementation. See drawing.c for * the code that permits the user to set the contents of the symbol structure. * * The door representation was changed by Ari Huttunen(ahuttune@niksula.hut.fi) */ /* * TLCORNER TDWALL TRCORNER * +- -+- -+ * | | | * * TRWALL CROSSWALL TLWALL HWALL * | | | * +- -+- -+ --- * | | | * * BLCORNER TUWALL BRCORNER VWALL * | | | | * +- -+- -+ | */ /* Level location types */ #define STONE 0 #define VWALL 1 #define HWALL 2 #define TLCORNER 3 #define TRCORNER 4 #define BLCORNER 5 #define BRCORNER 6 #define CROSSWALL 7 /* For pretty mazes and special levels */ #define TUWALL 8 #define TDWALL 9 #define TLWALL 10 #define TRWALL 11 #define DBWALL 12 #define TREE 13 /* Added by KMH */ #define SDOOR 14 #define SCORR 15 #define POOL 16 #define MOAT 17 /* pool that doesn't boil, adjust messages */ #define WATER 18 #define DRAWBRIDGE_UP 19 #define LAVAPOOL 20 #define IRONBARS 21 /* Added by KMH */ #define DOOR 22 #define CORR 23 #define ROOM 24 #define STAIRS 25 #define LADDER 26 #define FOUNTAIN 27 #define THRONE 28 #define SINK 29 #define TOILET 30 #define GRAVE 31 #define ALTAR 32 #define ICE 33 #define DRAWBRIDGE_DOWN 34 #define AIR 35 #define CLOUD 36 #define MAX_TYPE 37 #define INVALID_TYPE 127 /* * Avoid using the level types in inequalities: * these types are subject to change. * Instead, use one of the macros below. */ #define IS_WALL(typ) ((typ) && (typ) <= DBWALL) #define IS_STWALL(typ) ((typ) <= DBWALL) /* STONE <= (typ) <= DBWALL */ #define IS_ROCK(typ) ((typ) < POOL) /* absolutely nonaccessible */ #define IS_DOOR(typ) ((typ) == DOOR) #define IS_TREE(typ) ((typ) == TREE || \ (level.flags.arboreal && (typ) == STONE)) #define ACCESSIBLE(typ) ((typ) >= DOOR) /* good position */ #define IS_ROOM(typ) ((typ) >= ROOM) /* ROOM, STAIRS, furniture.. */ #define ZAP_POS(typ) ((typ) >= POOL) #define IS_GRAVE(typ) ((typ) == GRAVE) #define SPACE_POS(typ) ((typ) > DOOR) #define IS_POOL(typ) ((typ) >= POOL && (typ) <= DRAWBRIDGE_UP) #define IS_THRONE(typ) ((typ) == THRONE) #define IS_FOUNTAIN(typ) ((typ) == FOUNTAIN) #define IS_SINK(typ) ((typ) == SINK) #define IS_TOILET(typ) ((typ) == TOILET) #define IS_GRAVE(typ) ((typ) == GRAVE) #define IS_ALTAR(typ) ((typ) == ALTAR) #define IS_DRAWBRIDGE(typ) ((typ) == DRAWBRIDGE_UP || (typ) == DRAWBRIDGE_DOWN) #define IS_FURNITURE(typ) ((typ) >= STAIRS && (typ) <= ALTAR) #define IS_AIR(typ) ((typ) == AIR || (typ) == CLOUD) #define IS_SOFT(typ) ((typ) == AIR || (typ) == CLOUD || IS_POOL(typ)) /* * The screen symbols may be the default or defined at game startup time. * See drawing.c for defaults. * Note: {ibm|dec}_graphics[] arrays (also in drawing.c) must be kept in synch. */ /* begin dungeon characters */ #define S_stone 0 #define S_vwall 1 #define S_hwall 2 #define S_tlcorn 3 #define S_trcorn 4 #define S_blcorn 5 #define S_brcorn 6 #define S_crwall 7 #define S_tuwall 8 #define S_tdwall 9 #define S_tlwall 10 #define S_trwall 11 #define S_ndoor 12 #define S_vodoor 13 #define S_hodoor 14 #define S_vcdoor 15 /* closed door, vertical wall */ #define S_hcdoor 16 /* closed door, horizontal wall */ #define S_bars 17 /* Added by KMH */ #define S_tree 18 /* Added by KMH */ #define S_room 19 #define S_corr 20 #define S_litcorr 21 #define S_upstair 22 #define S_dnstair 23 #define S_upladder 24 #define S_dnladder 25 #define S_altar 26 #define S_grave 27 #define S_throne 28 #define S_sink 29 #define S_toilet 30 #define S_fountain 31 #define S_pool 32 #define S_ice 33 #define S_lava 34 #define S_vodbridge 35 #define S_hodbridge 36 #define S_vcdbridge 37 /* closed drawbridge, vertical wall */ #define S_hcdbridge 38 /* closed drawbridge, horizontal wall */ #define S_air 39 #define S_cloud 40 #define S_water 41 /* end dungeon characters, begin traps */ #define S_arrow_trap 42 #define S_dart_trap 43 #define S_falling_rock_trap 44 #define S_squeaky_board 45 #define S_bear_trap 46 #define S_land_mine 47 #define S_rolling_boulder_trap 48 #define S_sleeping_gas_trap 49 #define S_rust_trap 50 #define S_fire_trap 51 #define S_pit 52 #define S_spiked_pit 53 #define S_hole 54 #define S_trap_door 55 #define S_teleportation_trap 56 #define S_level_teleporter 57 #define S_magic_portal 58 #define S_web 59 #define S_statue_trap 60 #define S_magic_trap 61 #define S_anti_magic_trap 62 #define S_polymorph_trap 63 /* end traps, begin special effects */ #define S_vbeam 64 /* The 4 zap beam symbols. Do NOT separate. */ #define S_hbeam 65 /* To change order or add, see function */ #define S_lslant 66 /* zapdir_to_glyph() in display.c. */ #define S_rslant 67 #define S_digbeam 68 /* dig beam symbol */ #define S_flashbeam 69 /* camera flash symbol */ #define S_boomleft 70 /* thrown boomerang, open left, e.g ')' */ #define S_boomright 71 /* thrown boomerand, open right, e.g. '(' */ #define S_ss1 72 /* 4 magic shield glyphs */ #define S_ss2 73 #define S_ss3 74 #define S_ss4 75 /* The 8 swallow symbols. Do NOT separate. To change order or add, see */ /* the function swallow_to_glyph() in display.c. */ #define S_sw_tl 76 /* swallow top left [1] */ #define S_sw_tc 77 /* swallow top center [2] Order: */ #define S_sw_tr 78 /* swallow top right [3] */ #define S_sw_ml 79 /* swallow middle left [4] 1 2 3 */ #define S_sw_mr 80 /* swallow middle right [6] 4 5 6 */ #define S_sw_bl 81 /* swallow bottom left [7] 7 8 9 */ #define S_sw_bc 82 /* swallow bottom center [8] */ #define S_sw_br 83 /* swallow bottom right [9] */ #define S_explode1 84 /* explosion top left */ #define S_explode2 85 /* explosion top center */ #define S_explode3 86 /* explosion top right Ex. */ #define S_explode4 87 /* explosion middle left */ #define S_explode5 88 /* explosion middle center /-\ */ #define S_explode6 89 /* explosion middle right |@| */ #define S_explode7 90 /* explosion bottom left \-/ */ #define S_explode8 91 /* explosion bottom center */ #define S_explode9 92 /* explosion bottom right */ /* end effects */ #define MAXPCHARS 93 /* maximum number of mapped characters */ #define MAXDCHARS 42 /* 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; const char *explanation; #ifdef TEXTCOLOR uchar color; #endif }; extern const struct symdef defsyms[MAXPCHARS]; /* defaults */ extern uchar showsyms[MAXPCHARS]; extern const struct symdef def_warnsyms[WARNCOUNT]; /* * Graphics sets for display symbols */ #define ASCII_GRAPHICS 0 /* regular characters: '-', '+', &c */ #define IBM_GRAPHICS 1 /* PC graphic characters */ #define DEC_GRAPHICS 2 /* VT100 line drawing characters */ #define MAC_GRAPHICS 3 /* Macintosh drawing characters */ /* * The 5 possible states of doors */ #define D_NODOOR 0 #define D_BROKEN 1 #define D_ISOPEN 2 #define D_CLOSED 4 #define D_LOCKED 8 #define D_TRAPPED 16 /* * Some altars are considered as shrines, so we need a flag. */ #define AM_SHRINE 8 /* * Thrones should only be looted once. */ #define T_LOOTED 1 /* * Trees have more than one kick result. */ #define TREE_LOOTED 1 #define TREE_SWARM 2 /* * Fountains have limits, and special warnings. */ #define F_LOOTED 1 #define F_WARNED 2 #define FOUNTAIN_IS_WARNED(x,y) (levl[x][y].looted & F_WARNED) #define FOUNTAIN_IS_LOOTED(x,y) (levl[x][y].looted & F_LOOTED) #define SET_FOUNTAIN_WARNED(x,y) levl[x][y].looted |= F_WARNED; #define SET_FOUNTAIN_LOOTED(x,y) levl[x][y].looted |= F_LOOTED; #define CLEAR_FOUNTAIN_WARNED(x,y) levl[x][y].looted &= ~F_WARNED; #define CLEAR_FOUNTAIN_LOOTED(x,y) levl[x][y].looted &= ~F_LOOTED; /* * Doors are even worse :-) The special warning has a side effect * of instantly trapping the door, and if it was defined as trapped, * the guards consider that you have already been warned! */ #define D_WARNED 16 /* * Sinks have 3 different types of loot that shouldn't be abused */ #define S_LPUDDING 1 #define S_LDWASHER 2 #define S_LRING 4 /* * The four directions for a DrawBridge. */ #define DB_NORTH 0 #define DB_SOUTH 1 #define DB_EAST 2 #define DB_WEST 3 #define DB_DIR 3 /* mask for direction */ /* * What's under a drawbridge. */ #define DB_MOAT 0 #define DB_LAVA 4 #define DB_ICE 8 #define DB_FLOOR 16 #define DB_UNDER 28 /* mask for underneath */ /* * Wall information. */ #define WM_MASK 0x07 /* wall mode (bottom three bits) */ #define W_NONDIGGABLE 0x08 #define W_NONPASSWALL 0x10 /* * Ladders (in Vlad's tower) may be up or down. */ #define LA_UP 1 #define LA_DOWN 2 /* * Room areas may be iced pools */ #define ICED_POOL 8 #define ICED_MOAT 16 /* * The structure describing a coordinate position. * Before adding fields, remember that this will significantly affect * the size of temporary files and save files. */ struct rm { #ifdef DISPLAY_LAYERS Bitfield(mem_bg,6); /* Remembered background */ Bitfield(mem_trap,5); /* Remembered trap */ Bitfield(mem_obj,10); /* Remembered object/corpse */ Bitfield(mem_corpse,1); /* Set if mem_obj refers to a corpse */ Bitfield(mem_invis,1); /* Set if invisible monster remembered */ Bitfield(mem_spare,9); #else int glyph; /* what the hero thinks is there */ #endif schar typ; /* what is really there */ uchar seenv; /* seen vector */ Bitfield(flags,5); /* extra information for typ */ Bitfield(horizontal,1); /* wall/door/etc is horiz. (more typ info) */ Bitfield(lit,1); /* speed hack for lit rooms */ Bitfield(waslit,1); /* remember if a location was lit */ Bitfield(roomno,6); /* room # for special rooms */ Bitfield(edge,1); /* marks boundaries for special rooms*/ }; /* * Add wall angle viewing by defining "modes" for each wall type. Each * mode describes which parts of a wall are finished (seen as as wall) * and which are unfinished (seen as rock). * * We use the bottom 3 bits of the flags field for the mode. This comes * in conflict with secret doors, but we avoid problems because until * a secret door becomes discovered, we know what sdoor's bottom three * bits are. * * The following should cover all of the cases. * * type mode Examples: R=rock, F=finished * ----- ---- ---------------------------- * WALL: 0 none hwall, mode 1 * 1 left/top (1/2 rock) RRR * 2 right/bottom (1/2 rock) --- * FFF * * CORNER: 0 none trcorn, mode 2 * 1 outer (3/4 rock) FFF * 2 inner (1/4 rock) F+- * F|R * * TWALL: 0 none tlwall, mode 3 * 1 long edge (1/2 rock) F|F * 2 bottom left (on a tdwall) -+F * 3 bottom right (on a tdwall) R|F * * CRWALL: 0 none crwall, mode 5 * 1 top left (1/4 rock) R|F * 2 top right (1/4 rock) -+- * 3 bottom left (1/4 rock) F|R * 4 bottom right (1/4 rock) * 5 top left & bottom right (1/2 rock) * 6 bottom left & top right (1/2 rock) */ #define WM_W_LEFT 1 /* vertical or horizontal wall */ #define WM_W_RIGHT 2 #define WM_W_TOP WM_W_LEFT #define WM_W_BOTTOM WM_W_RIGHT #define WM_C_OUTER 1 /* corner wall */ #define WM_C_INNER 2 #define WM_T_LONG 1 /* T wall */ #define WM_T_BL 2 #define WM_T_BR 3 #define WM_X_TL 1 /* cross wall */ #define WM_X_TR 2 #define WM_X_BL 3 #define WM_X_BR 4 #define WM_X_TLBR 5 #define WM_X_BLTR 6 /* * Seen vector values. The seen vector is an array of 8 bits, one for each * octant around a given center x: * * 0 1 2 * 7 x 3 * 6 5 4 * * In the case of walls, a single wall square can be viewed from 8 possible * directions. If we know the type of wall and the directions from which * it has been seen, then we can determine what it looks like to the hero. */ #define SV0 0x1 #define SV1 0x2 #define SV2 0x4 #define SV3 0x8 #define SV4 0x10 #define SV5 0x20 #define SV6 0x40 #define SV7 0x80 #define SVALL 0xFF #define doormask flags #define altarmask flags #define wall_info flags #define ladder flags #define drawbridgemask flags #define looted flags #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; long when, cost; coord place; schar typ; }; struct levelflags { uchar nfountains; /* number of fountains on level */ uchar nsinks; /* number of sinks + toilets on the level */ /* Several flags that give hints about what's on the level */ Bitfield(has_shop, 1); Bitfield(has_vault, 1); Bitfield(has_zoo, 1); Bitfield(has_court, 1); Bitfield(has_morgue, 1); Bitfield(has_beehive, 1); Bitfield(has_barracks, 1); Bitfield(has_temple, 1); Bitfield(has_lemurepit, 1); Bitfield(has_migohive, 1); Bitfield(has_fungusfarm, 1); Bitfield(has_swamp, 1); Bitfield(noteleport,1); Bitfield(hardfloor,1); Bitfield(nommap,1); Bitfield(hero_memory,1); /* hero has memory */ Bitfield(shortsighted,1); /* monsters are shortsighted */ Bitfield(graveyard,1); /* has_morgue, but remains set */ Bitfield(is_maze_lev,1); Bitfield(is_cavernous_lev,1); Bitfield(arboreal, 1); /* Trees replace rock */ Bitfield(spooky,1); /* Spooky sounds (Tina Hall) */ Bitfield(lethe, 1); /* All water on level causes amnesia */ }; typedef struct { struct rm locations[COLNO][ROWNO]; #ifndef MICROPORT_BUG struct obj *objects[COLNO][ROWNO]; struct monst *monsters[COLNO][ROWNO]; #else struct obj *objects[1][ROWNO]; char *yuk1[COLNO-1][ROWNO]; struct monst *monsters[1][ROWNO]; char *yuk2[COLNO-1][ROWNO]; #endif struct obj *objlist; struct obj *buriedobjlist; struct monst *monlist; struct damage *damagelist; struct levelflags flags; } dlevel_t; extern dlevel_t level; /* structure describing the current level */ /* * Macros for compatibility with old code. Someday these will go away. */ #define levl level.locations #define fobj level.objlist #define fmon level.monlist /* * Covert a trap number into the defsym graphics array. * Convert a defsym number into a trap number. * Assumes that arrow trap will always be the first trap. */ #define trap_to_defsym(t) (S_arrow_trap+(t)-1) #define defsym_to_trap(d) ((d)-S_arrow_trap+1) #define OBJ_AT(x,y) (level.objects[x][y] != (struct obj *)0) /* * Macros for encapsulation of level.monsters references. */ #define MON_AT(x,y) (level.monsters[x][y] != (struct monst *)0 && \ !(level.monsters[x][y])->mburied) #define MON_BURIED_AT(x,y) (level.monsters[x][y] != (struct monst *)0 && \ (level.monsters[x][y])->mburied) #ifndef STEED #define place_monster(m,x,y) ((m)->mx=(x),(m)->my=(y),\ level.monsters[(m)->mx][(m)->my]=(m)) #endif #define place_worm_seg(m,x,y) level.monsters[x][y] = m #define remove_monster(x,y) level.monsters[x][y] = (struct monst *)0 #define m_at(x,y) (MON_AT(x,y) ? level.monsters[x][y] : \ (struct monst *)0) #define m_buried_at(x,y) (MON_BURIED_AT(x,y) ? level.monsters[x][y] : \ (struct monst *)0) #endif /* RM_H */ slashem-0.0.7E7F3/include/mondata.h0000664000076400007640000003015510545462317015077 0ustar aliali/* SCCS Id: @(#)mondata.h 3.4 2003/01/08 */ /* Copyright (c) 1989 Mike Threepoint */ /* NetHack may be freely redistributed. See license for details. */ #ifndef MONDATA_H #define MONDATA_H #define verysmall(ptr) ((ptr)->msize < MZ_SMALL) #define bigmonst(ptr) ((ptr)->msize >= MZ_LARGE) #define pm_resistance(ptr,typ) (((ptr)->mresists & (typ)) != 0) #define resists_fire(mon) (((mon)->mintrinsics & MR_FIRE) != 0) #define resists_cold(mon) (((mon)->mintrinsics & MR_COLD) != 0) #define resists_sleep(mon) (((mon)->mintrinsics & MR_SLEEP) != 0) #define resists_disint(mon) (((mon)->mintrinsics & MR_DISINT) != 0) #define resists_elec(mon) (((mon)->mintrinsics & MR_ELEC) != 0) #define resists_poison(mon) (((mon)->mintrinsics & MR_POISON) != 0) #define resists_acid(mon) (((mon)->mintrinsics & MR_ACID) != 0) #define resists_ston(mon) (((mon)->mintrinsics & MR_STONE) != 0) #define resists_drain(mon) (((mon)->mintrinsics & MR_DRAIN) != 0) #define resists_death(mon) (((mon)->mintrinsics & MR_DEATH) != 0) #define need_one(mon) (((mon)->mintrinsics & MR_PLUSONE) != 0) #define need_two(mon) (((mon)->mintrinsics & MR_PLUSTWO) != 0) #define need_three(mon) (((mon)->mintrinsics & MR_PLUSTHREE) != 0) #define need_four(mon) (((mon)->mintrinsics & MR_PLUSFOUR) != 0) #define hit_as_one(mon) (((mon)->mintrinsics & MR_HITASONE) != 0) #define hit_as_two(mon) (((mon)->mintrinsics & MR_HITASTWO) != 0) #define hit_as_three(mon) (((mon)->mintrinsics & MR_HITASTHREE) != 0) #define hit_as_four(mon) (((mon)->mintrinsics & MR_HITASFOUR) != 0) #define is_lminion(mon) (is_minion((mon)->data) && \ (mon)->data->maligntyp >= A_COALIGNED && \ ((mon)->data != &mons[PM_ANGEL] || \ EPRI(mon)->shralign > 0)) #define is_flyer(ptr) (((ptr)->mflags1 & M1_FLY) != 0L) #define is_floater(ptr) ((ptr)->mlet == S_EYE) #define is_clinger(ptr) (((ptr)->mflags1 & M1_CLING) != 0L) #define is_swimmer(ptr) (((ptr)->mflags1 & M1_SWIM) != 0L) #define breathless(ptr) (((ptr)->mflags1 & M1_BREATHLESS) != 0L) #define amphibious(ptr) (((ptr)->mflags1 & (M1_AMPHIBIOUS | M1_BREATHLESS)) != 0L) #define passes_walls(ptr) (((ptr)->mflags1 & M1_WALLWALK) != 0L) #define amorphous(ptr) (((ptr)->mflags1 & M1_AMORPHOUS) != 0L) #define noncorporeal(ptr) ((ptr)->mlet == S_GHOST) #define tunnels(ptr) (((ptr)->mflags1 & M1_TUNNEL) != 0L) #define needspick(ptr) (((ptr)->mflags1 & M1_NEEDPICK) != 0L) #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 has_horns(ptr) (num_horns(ptr) > 0) #define is_whirly(ptr) ((ptr)->mlet == S_VORTEX || \ (ptr) == &mons[PM_AIR_ELEMENTAL]) #define is_fire(ptr) ((ptr) == &mons[PM_FIRE_VORTEX] || \ (ptr) == &mons[PM_FIRE_ELEMENTAL]) #define flaming(ptr) ((ptr) == &mons[PM_FIRE_VORTEX] || \ (ptr) == &mons[PM_FLAMING_SPHERE] || \ (ptr) == &mons[PM_FIRE_ELEMENTAL] || \ (ptr) == &mons[PM_SALAMANDER]) #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) #define is_animal(ptr) (((ptr)->mflags1 & M1_ANIMAL) != 0L) #define slithy(ptr) (((ptr)->mflags1 & M1_SLITHY) != 0L) #define is_wooden(ptr) ((ptr) == &mons[PM_WOOD_GOLEM]) #define thick_skinned(ptr) (((ptr)->mflags1 & M1_THICK_HIDE) != 0L) #define lays_eggs(ptr) (((ptr)->mflags1 & M1_OVIPAROUS) != 0L) #define regenerates(ptr) (((ptr)->mflags1 & M1_REGEN) != 0L) #define perceives(ptr) (((ptr)->mflags1 & M1_SEE_INVIS) != 0L) #define can_teleport(ptr) (((ptr)->mflags1 & M1_TPORT) != 0L) #define control_teleport(ptr) (((ptr)->mflags1 & M1_TPORT_CNTRL) != 0L) #define telepathic(ptr) ((ptr) == &mons[PM_FLOATING_EYE] || \ is_mind_flayer(ptr)) #define is_armed(ptr) attacktype(ptr, AT_WEAP) #define acidic(ptr) (((ptr)->mflags1 & M1_ACID) != 0L) #define poisonous(ptr) (((ptr)->mflags1 & M1_POIS) != 0L) #define carnivorous(ptr) (((ptr)->mflags1 & M1_CARNIVORE) != 0L) #define herbivorous(ptr) (((ptr)->mflags1 & M1_HERBIVORE) != 0L) #define metallivorous(ptr) (((ptr)->mflags1 & M1_METALLIVORE) != 0L) #define polyok(ptr) (((ptr)->mflags2 & M2_NOPOLY) == 0L) #define is_undead(ptr) (((ptr)->mflags2 & M2_UNDEAD) != 0L) #define is_were(ptr) (((ptr)->mflags2 & M2_WERE) != 0L) #define is_vampire(ptr) (((ptr)->mflags2 & M2_VAMPIRE) != 0L) #define is_elf(ptr) (((ptr)->mflags2 & M2_ELF) != 0L) #define is_dwarf(ptr) (((ptr)->mflags2 & M2_DWARF) != 0L) #define is_gnome(ptr) (((ptr)->mflags2 & M2_GNOME) != 0L) #define is_orc(ptr) (((ptr)->mflags2 & M2_ORC) != 0L) #define is_human(ptr) (((ptr)->mflags2 & M2_HUMAN) != 0L) #define is_hobbit(ptr) (((ptr)->mflags2 & M2_HOBBIT) != 0L) #define your_race(ptr) (((ptr)->mflags2 & urace.selfmask) != 0L) #define is_bat(ptr) ((ptr) == &mons[PM_BAT] || \ (ptr) == &mons[PM_GIANT_BAT] || \ (ptr) == &mons[PM_VAMPIRE_BAT]) #define is_bird(ptr) ((ptr)->mlet == S_BAT && !is_bat(ptr)) #define is_giant(ptr) (((ptr)->mflags2 & M2_GIANT) != 0L) #define is_golem(ptr) ((ptr)->mlet == S_GOLEM) #define is_domestic(ptr) (((ptr)->mflags2 & M2_DOMESTIC) != 0L) #define is_demon(ptr) (((ptr)->mflags2 & M2_DEMON) != 0L) #define is_mercenary(ptr) (((ptr)->mflags2 & M2_MERC) != 0L) #define is_male(ptr) (((ptr)->mflags2 & M2_MALE) != 0L) #define is_female(ptr) (((ptr)->mflags2 & M2_FEMALE) != 0L) #define is_neuter(ptr) (((ptr)->mflags2 & M2_NEUTER) != 0L) #define is_wanderer(ptr) (((ptr)->mflags2 & M2_WANDER) != 0L) #define always_hostile(ptr) (((ptr)->mflags2 & M2_HOSTILE) != 0L) #define always_peaceful(ptr) (((ptr)->mflags2 & M2_PEACEFUL) != 0L) #define race_hostile(ptr) (((ptr)->mflags2 & urace.hatemask) != 0L) #define race_peaceful(ptr) (((ptr)->mflags2 & urace.lovemask) != 0L) #define extra_nasty(ptr) (((ptr)->mflags2 & M2_NASTY) != 0L) #define strongmonst(ptr) (((ptr)->mflags2 & M2_STRONG) != 0L) #define can_breathe(ptr) attacktype(ptr, AT_BREA) #define cantwield(ptr) (nohands(ptr) || verysmall(ptr) || \ (ptr)->mlet == S_ANT) #define could_twoweap(ptr) ((ptr)->mattk[1].aatyp == AT_WEAP && \ ((ptr) != youmonst.data || \ P_MAX_SKILL(P_TWO_WEAPON_COMBAT) >= P_SKILLED || \ P_MAX_SKILL(P_TWO_WEAPON_COMBAT) >= P_BASIC && \ (Race_if(PM_DWARF) || Race_if(PM_HUMAN)))) #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) #define is_lord(ptr) (((ptr)->mflags2 & M2_LORD) != 0L) #define is_prince(ptr) (((ptr)->mflags2 & M2_PRINCE) != 0L) #define is_ndemon(ptr) (is_demon(ptr) && \ (((ptr)->mflags2 & (M2_LORD|M2_PRINCE)) == 0L)) #define is_dlord(ptr) (is_demon(ptr) && is_lord(ptr)) #define is_dprince(ptr) (is_demon(ptr) && is_prince(ptr)) #define is_minion(ptr) ((ptr)->mflags2 & M2_MINION) #define likes_gold(ptr) (((ptr)->mflags2 & M2_GREEDY) != 0L) #define likes_gems(ptr) (((ptr)->mflags2 & M2_JEWELS) != 0L) #define likes_objs(ptr) (((ptr)->mflags2 & M2_COLLECT) != 0L || \ is_armed(ptr)) #define likes_magic(ptr) (((ptr)->mflags2 & M2_MAGIC) != 0L) #define webmaker(ptr) ((ptr) == &mons[PM_CAVE_SPIDER] || \ (ptr) == &mons[PM_RECLUSE_SPIDER] || \ (ptr) == &mons[PM_PHASE_SPIDER] || \ (ptr) == &mons[PM_WERESPIDER] || \ (ptr) == &mons[PM_BARKING_SPIDER] || \ (ptr) == &mons[PM_GIANT_SPIDER]) #define is_unicorn(ptr) ((ptr)->mlet == S_UNICORN && likes_gems(ptr)) /* KMH */ #define is_longworm(ptr) (((ptr) == &mons[PM_BABY_LONG_WORM]) || \ ((ptr) == &mons[PM_LONG_WORM]) || \ ((ptr) == &mons[PM_LONG_WORM_TAIL])) #define is_covetous(ptr) ((ptr)->mflags3 & M3_COVETOUS) #define infravision(ptr) ((ptr->mflags3 & M3_INFRAVISION)) #define infravisible(ptr) ((ptr->mflags3 & M3_INFRAVISIBLE)) #define can_betray(ptr) ((ptr->mflags3 & M3_TRAITOR)) #define cannot_be_tamed(ptr) ((ptr->mflags3 & M3_NOTAME)) #define is_mplayer(ptr) (((ptr) >= &mons[PM_ARCHEOLOGIST]) && \ ((ptr) <= &mons[PM_WIZARD])) #define is_rider(ptr) ((ptr) == &mons[PM_DEATH] || \ (ptr) == &mons[PM_FAMINE] || \ (ptr) == &mons[PM_PESTILENCE]) #define is_placeholder(ptr) ((ptr) == &mons[PM_ORC] || \ (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_FUNGUS && \ (ptr) != &mons[PM_LICHEN] || \ (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 || \ (ptr) == &mons[PM_FIRE_VORTEX]) ? 3 : \ ((ptr) == &mons[PM_FIRE_ELEMENTAL]) ? 2 : \ ((ptr) == &mons[PM_FIRE_VAMPIRE])? 2 : \ ((ptr) == &mons[PM_FLAMING_SPHERE]) ? 1 : \ ((ptr) == &mons[PM_SHOCKING_SPHERE]) ? 1 : \ ((ptr) == &mons[PM_WAX_GOLEM]) ? 1 : 0) /* [note: the light ranges above were reduced to 1 for performance...] */ /* WAC increased to 3 and 2?*/ #define likes_lava(ptr) (ptr == &mons[PM_FIRE_ELEMENTAL] || \ ptr == &mons[PM_SALAMANDER]) #define pm_invisible(ptr) ((ptr) == &mons[PM_STALKER] || \ (ptr) == &mons[PM_BLACK_LIGHT] || \ (ptr) == &mons[PM_STAR_VAMPIRE]) /* could probably add more */ #define likes_fire(ptr) ((ptr) == &mons[PM_FIRE_VORTEX] || \ (ptr) == &mons[PM_FLAMING_SPHERE] || \ (ptr) == &mons[PM_FIRE_VAMPIRE] || \ likes_lava(ptr)) #define nonliving(ptr) (is_golem(ptr) || is_undead(ptr) || \ (ptr)->mlet == S_VORTEX || \ (ptr) == &mons[PM_MANES]) #define touch_petrifies(ptr) (ptr == &mons[PM_COCKATRICE] || \ ptr == &mons[PM_BASILISK] || \ ptr == &mons[PM_CHICKATRICE] || \ ptr == &mons[PM_ASPHYNX]) #define is_mind_flayer(ptr) ((ptr) == &mons[PM_MIND_FLAYER] || \ (ptr) == &mons[PM_MASTER_MIND_FLAYER]) #define made_of_rock(ptr) ((passes_walls(ptr) && thick_skinned(ptr)) || \ (ptr) == &mons[PM_STONE_GOLEM] || \ (ptr) == &mons[PM_STATUE_GARGOYLE]) #define hates_silver(ptr) (is_were(ptr) || is_vampire(ptr) || \ is_demon(ptr) || (ptr) == &mons[PM_SHADE] || \ ((ptr)->mlet==S_IMP && (ptr) != &mons[PM_TENGU])) /* Used for conduct with corpses, tins, and digestion attacks */ /* G_NOCORPSE monsters might still be swallowed as a purple worm */ /* Maybe someday this could be in mflags... */ #define vegan(ptr) ((ptr)->mlet == S_BLOB || \ (ptr)->mlet == S_JELLY || \ (ptr)->mlet == S_FUNGUS || \ (ptr)->mlet == S_VORTEX || \ (ptr)->mlet == S_LIGHT || \ ((ptr)->mlet == S_ELEMENTAL && \ (ptr) != &mons[PM_STALKER]) || \ ((ptr)->mlet == S_GOLEM && \ (ptr) != &mons[PM_FLESH_GOLEM] && \ (ptr) != &mons[PM_FRANKENSTEIN_S_MONSTER] && \ (ptr) != &mons[PM_LEATHER_GOLEM]) || \ noncorporeal(ptr)) #define vegetarian(ptr) (vegan(ptr) || \ ((ptr)->mlet == S_PUDDING && \ (ptr) != &mons[PM_BLACK_PUDDING])) /* For vampires */ #define has_blood(ptr) (!vegetarian(ptr) && \ (ptr)->mlet != S_GOLEM && \ ((ptr)->mlet != S_BAD_FOOD || \ (ptr) == &mons[PM_KILLER_TRIPE_RATION]) && \ (!is_undead(ptr) || is_vampire(ptr))) #define befriend_with_obj(ptr, obj) ((obj)->oclass == FOOD_CLASS && ( \ is_domestic(ptr) || \ /* [Tom] Dorothy wants more pets... */ \ (obj)->otyp == CHEESE && ((ptr) == &mons[PM_GIANT_RAT] || \ (ptr) == &mons[PM_SEWER_RAT] || \ (ptr) == &mons[PM_BLACK_RAT] || \ (ptr) == &mons[PM_PACK_RAT]) || \ (obj)->otyp == CARROT && ((ptr) == &mons[PM_RABBIT] || \ (ptr) == &mons[PM_RABID_RABBIT]) || \ (obj)->otyp == BANANA && (ptr)->mlet == S_YETI)) #endif /* MONDATA_H */ slashem-0.0.7E7F3/include/epri.h0000664000076400007640000000130710545462317014410 0ustar aliali/* SCCS Id: @(#)epri.h 3.4 1997/05/01 */ /* Copyright (c) Izchak Miller, 1989. */ /* NetHack may be freely redistributed. See license for details. */ #ifndef EPRI_H #define EPRI_H struct epri { aligntyp shralign; /* alignment of priest's shrine */ /* leave as first field to match emin */ schar shroom; /* index in rooms */ coord shrpos; /* position of shrine */ d_level shrlevel; /* level (& dungeon) of shrine */ }; #define EPRI(mon) ((struct epri *)&(mon)->mextra[0]) /* A priest without ispriest is a roaming priest without a shrine, so * the fields (except shralign, which becomes only the priest alignment) * are available for reuse. */ #define renegade shroom #endif /* EPRI_H */ slashem-0.0.7E7F3/include/file.h0000664000076400007640000000300010545462317014360 0ustar aliali/* SCCS Id: @(#)file.h 3.2 96/11/19 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ /* WAC New file used by Makedefs*/ /* This file is read by makedefs and is turned into file.h*/ /* Various File Names */ /*Makedefs will hunt for the @ sign and then remove the next 6 chars*/ /*replacing with DEF_GAME_NAME in patchlev.h*/ /*Makedefs starts reading after a line with # START*/ /* @Lxxxxx makes DEF_GAME_NAME lowercase*/ # START /* Config Filename */ #ifdef UNIX # define NH_CONFIG_FILE ".@LOWER@rc" #else # if defined(MAC) || defined(__BEOS__) # define NH_CONFIG_FILE "Slash'EM Defaults" # else # ifdef VMS # define NH_CONFIG_FILE "@LOWER@ini" /*file2 should be the same as file except with sys$login: prepend*/ # define NH_CONFIG_FILE2 "sys$login:@LOWER@.ini" # define NH_CONFIG_FILE3 "@UPPER@.cnf" # else # if defined(MSDOS) || defined(WIN32) # define NH_CONFIG_FILE "defaults.nh"; # else # define NH_CONFIG_FILE "@UPPER@.cnf" # endif # endif # endif #endif /* Tile Files*/ #define NETHACK_PLANAR_TILEFILE "@UPPER@1.tib" /* Planar style tiles */ #define NETHACK_PACKED_TILEFILE "@UPPER@2.tib" /* Packed style tiles */ #define NETHACK_OVERVIEW_TILEFILE "@UPPER@o.tib" /* thin overview tiles */ /* Environment Options Name */ #define NETHACK_ENV_OPTIONS "@UPPER@OPTIONS" slashem-0.0.7E7F3/include/quest.h0000664000076400007640000000337010545462317014614 0ustar aliali/* SCCS Id: @(#)quest.h 3.4 1992/11/15 */ /* Copyright (c) Mike Stephenson 1991. */ /* NetHack may be freely redistributed. See license for details. */ #ifndef QUEST_H #define QUEST_H struct q_score { /* Quest "scorecard" */ Bitfield(first_start,1); /* only set the first time */ Bitfield(met_leader,1); /* has met the leader */ Bitfield(not_ready,3); /* rejected due to alignment, etc. */ Bitfield(pissed_off,1); /* got the leader angry */ Bitfield(got_quest,1); /* got the quest assignment */ Bitfield(first_locate,1); /* only set the first time */ Bitfield(met_intermed,1); /* used if the locate is a person. */ Bitfield(got_final,1); /* got the final quest assignment */ Bitfield(made_goal,3); /* # of times on goal level */ Bitfield(met_nemesis,1); /* has met the nemesis before */ Bitfield(killed_nemesis,1); /* set when the nemesis is killed */ Bitfield(in_battle,1); /* set when nemesis fighting you */ Bitfield(cheater,1); /* set if cheating detected */ 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; }; /* KMH, balance patch -- These were 7, 20, 14 for NetHack and 1, 20, 6 for Slash */ #define MAX_QUEST_TRIES 7 /* exceed this and you "fail" */ #define MIN_QUEST_ALIGN 20 /* at least this align.record to start */ /* note: align 20 matches "pious" as reported by enlightenment (cmd.c) */ #define MIN_QUEST_LEVEL 10 /* at least this u.ulevel to start */ /* note: exp.lev. 14 is threshold level for 5th rank (class title, role.c) */ #endif /* QUEST_H */ slashem-0.0.7E7F3/include/qtext.h0000664000076400007640000000516410545462317014623 0ustar aliali/* SCCS Id: @(#)qtext.h 3.4 1997/02/02 */ /* Copyright (c) Mike Stephenson 1991. */ /* NetHack may be freely redistributed. See license for details. */ #ifndef QTEXT_H #define QTEXT_H #define N_HDR 32 /* Maximum number of categories */ /* (i.e., num roles + 1) */ #define LEN_HDR 3 /* Maximum length of a category name */ struct qtmsg { int msgnum; char delivery; long offset, size; }; #ifdef MAKEDEFS_C /***** MAKEDEFS *****/ #define N_MSG 100 /* arbitrary */ struct msghdr { int n_msg; struct qtmsg qt_msg[N_MSG]; }; struct qthdr { int n_hdr; char id[N_HDR][LEN_HDR]; long offset[N_HDR]; }; /* Error message macros */ #define CREC_IN_MSG "Control record encountered during message - line %d\n" #define DUP_MSG "Duplicate message number at line %d\n" #define END_NOT_IN_MSG "End record encountered before message - line %d\n" #define TEXT_NOT_IN_MSG "Text encountered outside message - line %d\n" #define UNREC_CREC "Unrecognized Control record at line %d\n" #define OUT_OF_HEADERS "Too many message types (line %d)\nAdjust N_HDR in qtext.h and recompile.\n" #define OUT_OF_MESSAGES "Too many messages in class (line %d)\nAdjust N_MSG in qtext.h and recompile.\n" #else /***** !MAKEDEFS *****/ struct qtlists { struct qtmsg *common, #if 0 /* UNUSED but available */ *chrace, #endif *chrole; }; /* * Quest message defines. Used in quest.c to trigger off "realistic" * dialogue to the player. */ #define QT_FIRSTTIME 1 #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 #define QT_FIRSTNEMESIS 50 #define QT_NEXTNEMESIS 51 #define QT_OTHERNEMESIS 52 #define QT_NEMWANTSIT 53 /* you somehow got the artifact */ #define QT_DISCOURAGE 60 /* 1-10 random maledictive messages */ #define QT_GOTIT 70 #define QT_KILLEDNEM 80 #define QT_OFFEREDIT 81 #define QT_OFFEREDIT2 82 #define QT_POSTHANKS 90 #define QT_HASAMULET 91 /* * Message defines for common text used in maledictions. */ #define COMMON_ID "-" /* common message id value */ #define QT_ANGELIC 10 #define QTN_ANGELIC 10 #define QT_DEMONIC 30 #define QTN_DEMONIC 20 #define QT_BANISHED 60 #define QT_GYPSY 100 /* KMH -- Gypsy fortunes */ #endif /* MAKEDEFS_C */ #endif /* QTEXT_H */ slashem-0.0.7E7F3/include/qt_xpms.h0000664000076400007640000013401110545462317015143 0ustar aliali/* XPM */ static const char *blind_xpm[] = { /* width height ncolors chars_per_pixel */ "40 40 5 1", /* colors */ " c #000000", ". c None", "X c #909090", "o c #606060", "O c #303030", /* pixels */ "........................................", "........................................", "........................................", "........................................", "........................................", "........................................", "........................................", "........................................", "........................................", "........................................", "........................................", "........................................", "....ooooooooooooooooooooooooooooooooX...", ".... o...", ".... o...", ".... o...", ".... o...", "......o ..o ......", "......X O..X O......", "....... o... o......", ".......o ....o .......", "........O X.....O X.......", ".........O X.......O X........", "..........o OX.........o OX.........", "........................................", "........................................", "........................................", "........................................", "........................................", "........................................", "........................................", "........................................", "........................................", "........................................", "........................................", "........................................", "........................................", "........................................", "........................................", "........................................" }; /* XPM */ static const char *cha_xpm[] = { /* width height ncolors chars_per_pixel */ "40 40 14 1", /* colors */ " c #F85848", ". c #949E9E", "X c #F8B090", "o c #E00028", "O c #D4D4D4", "+ c None", "@ c #B0B0B0", "# c #F82C24", "$ c #F89E6C", "% c #FF0000", "& c #909090", "* c #FFFFFF", "= c #CEAA90", "- c #DADAB6", /* pixels */ "++++++++++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++++++++++", "+++++++++++++++=#%#=+=#%% ++++++++++++++", "++++++++++++++ %O%%%#%$$%o%=++++++++++++", "+++++++++++++# +#%%o%%o%%%%% +++++++++++", "+++++++++++ %%%%%%%%%%%%%%%%o#=+++++++++", "+++++++++ o%%%%%%%%%%%%%%%%%%%%# +++++++", "++++++ #%%%%%%o%%%o%%o%%o%o%%%%%o%o +++", "++=#%%o%%%#= =*+**O*+**O*+- = =%%%%#@+++", "++++ %=++*+*+**O****O****O*O*O*OO%=+++++", "+++++.%=OO+*O*OO****+****+*O*+O&%=@+++++", "++++++=%=*OO+**O**O*O**O*O*OO+$%=+++++++", "+++++++#% +*OOOO****+****@O+*#%=++++++++", "++++++++#%#*+**+O+OO+O+OOO*O#o#+++++++++", "+++++++++o% O**+****O****O*#%%=+++++++++", "+++++++++ %%#O*O****+****+ %o#++++++++++", "++++++++++o%% XO*O**O*O**#%%%+++++++++++", "++++++++++ %%%o%$-**+**$%%%%=+++++++++++", "+++++++++++o%%$X$%%%%%%#= o#++++++++++++", "++++++++++@ %%%o#O$$+$$$%%%=++++++++++++", "++++++++++++#o%%%%%%%%o%%%=@++++++++++++", "+++++++++++++ %%%%%%%%%%o=++++++++++++++", "+++++++++++++++= & & @++++++++++++++++", "++++++++++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++++++++++" }; /* XPM */ static const char *chaotic_xpm[] = { /* width height ncolors chars_per_pixel */ "40 40 9 1", /* colors */ " c #000000", ". c #5C7A7A", "X c None", "o c #B0B0B0", "O c #909090", "+ c #788C8C", "@ c #606060", "# c #FFFFFF", "$ c #303030", /* pixels */ "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXX@$ @XXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXX$$+#X$ $XXXXXXXXXX", "XXXXXXXXXXXXXXXXXX@$#o @XXXXXXXXX", "XXXXXXXXXXXXXXXXXX$XX OXXXXXXXX", "XXXXXXXXXXXXXXXXX@ # $@$ $XXXXXXXX", "XXXXXXXXXXXXXXXXX@.+ $XXXO @XXXXXXX", "XXXXXXXXXXXXXXXXX O@ XXXXX@ @XXXXXXX", "XXXXXXXXXXXXXXXXX @O $XXXXX@$ @XXXXXXX", "XXXXXXXXXXXXXXXXX O+ @XXXXO++ @XXXXXXX", "XXXXXXXXXXXXXXXXX @+ $@OXO$#$ XXXXXXXX", "XXXXXXXXXXXXXXXXX O@ $ @$Xo $XXXXXXXX", "XXXXXXXXXXXXXXXXX +O $X##+ $XXXXXXXXX", "XXXXXXXXXXXXXXXXX +@ $XXXXXXXXXX", "XXXXXXXXXXXXXXXXX oO $XXXXXXXXXXX", "XXXXXXXXO@@@@@ +# $XXXXXXXXXXXX", "XXXXXXO +o########$ $@XXXXXXXXX", "XXXXXX +#+.$XXXXXXXX", "XXXXXX @O @XXXXXXX", "XXXXXX$ $@ $@@$ @XXXXXXX", "XXXXXXX@@@@XXXXXX + @XXXX@$ OXXXXXXX", "XXXXXXXXXXXXXXXX@ # @XXXXXXX@@OXXXXXXXX", "XXXXXXXXXXXXXXXX@.+ @XXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXX$O@ XXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXX @O XXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXX #$ @XXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXX # @XXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXX # @XXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXX@ # @XXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXX@ # OXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXX@.X XXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXX ++ XXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXX @+ XXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXX O@ @XXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXX +O @XXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXX @XXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXX$ OXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXX@@OXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" }; /* XPM */ static const char *cns_xpm[] = { /* width height ncolors chars_per_pixel */ "40 40 19 1", /* colors */ " c #000000", ". c #F85848", "X c #949E9E", "o c #F8B090", "O c #E00028", "+ c #7C3400", "@ c None", "# c #B0B0B0", "$ c #F82C24", "% c #F89E6C", "& c #FF0000", "* c #B64700", "= c #909090", "- c #788C8C", "; c #606060", ": c #C80050", "> c #CEAA90", ", c #303030", "< c #FFB691", /* pixels */ "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", "@@@@@@@@@@@.oo.o$ ;@@@@@@@@@@@@@@@@@@@@@", "@@@@@@@@@@@>.o.%%O,@@@@@@@@@@@@@@@@@@@@@", "@@@@@@@@@@@@$oo.o. ,@@@@@@@@@@@@@@@@@@@@", "@@@@@@@@@@@@.oo$oo+ =@@@@@@@@@@@@@@@@@@@", "@@@@@@@@@@@@..o&oo$ ,@@@@@@@@@@@@@@@@@@@", "@@@@@@@@@@@@#.o.oo. =@.$%@@@@@@@@@@@@@@", "@@@@@@@@@@@@@.o..oo& O.%ooo@@@@@@@@@@@@@", "@@@@@@@@@@@@@.o.&%o.$oo%O++;@@@@@@@@@@@@", "@@@@@@@@@@@@@.o.+$%$o.@@@@@@@@@@@", "@@@@@@@@@@@@@.oo++o%$$ ,@@$.oo@@@@@@@@@@", "@@@@@@@@@@@@>.oo+Oo$o%.@@$oo..-@@@@@@@@@", "@@@@@@@@@@@@..o%;.o&%.$..o%O ++>@@@@@@@@", "@@@@@@@@@@@@>.$O:%o.O::::O* $oooo@@@@@@@", "@@@@@@@@@@@@::::::$$:OO&OO::oo%.;=@@@@@@", "@@@@@@@@@@@.::::::::O&&&&&O::++ ,@@@@@@", "@@@@@@@@@@>:::O&&OO&&&&&&&&:: ;@@@@@", "@@@@@@@@@@=::O&&&&&O:O&&&&&O: ,=@@@@@@@", "@@@@@@@@@@:::&&&&&&&&:&&&&&O: ;@@@@@@@@", "@@@@@@@@@@::O&&&&&&&&:&O&&&O:, ;@@@@@@@@", "@@@@@@@@@@::O&&&&O&O&OO&O&&O:+ ;@@@@@@@@", "@@@@@@@@@@::&&&O&&&&&O:&&&&O:, @@@@@@@@", "@@@@@@@@@@::O&&&&&O&&&:O&O&::+ @@@@@@@@", "@@@@@@@@@@::O&&O&&&&O&OO&&&:: @@@@@@@@", "@@@@@@@@@@=::O&&&&O&&&O:&&&:: @@@@@@@@", "@@@@@@@@@@.:::O&&O&&&&&:&OO:: @@@@@@@@", "@@@@@@@@@@@:::::&&&&O&O:&&O:, @@@@@@@@", "@@@@@@@@@@.>:::::O&&&&&:&&::+ ;@@@@@@@@", "@@@@@@@@@@>.<::::O&&O&O:&&:: @@@@@@@@@", "@@@@@@@@@@@.o%,:::O&&&O:&O:, @@@@@@@@@", "@@@@@@@@@@@$o. :::OO&OO&::, ;@@@@@@@@@", "@@@@@@@@@@@&o%+ ,::O&OO&O:: =@@@@@@@@@", "@@@@@@@@@@@.oo+ :::OO::: ,@@@@@@@@@@", "@@@@@@@@@@@..oO +::::: =@@@@@@@@@@", "@@@@@@@@@@@@.<.+ ,+, ,@@@@@@@@@@@", "@@@@@@@@@@@@Oo<+ @X, ,@@@@@@@@@@@@", "@@@@@@@@@@@@.%o$ @@@@@;, ;@@@@@@@@@@@@@", "@@@@@@@@@@@@@.o., =@@@@@@@@@@@@@@@@@@@@@", "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" }; /* XPM */ static const char *confused_xpm[] = { /* width height ncolors chars_per_pixel */ "40 40 13 1", /* colors */ " c #000000", ". c #949E9E", "X c #5C7A7A", "o c #D4D4D4", "O c None", "+ c #B0B0B0", "@ c #909090", "# c #788C8C", "$ c #606060", "% c #406868", "& c #FFFFFF", "* c #303030", "= c #6C91B6", /* pixels */ "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOO.=.+OO=.+O.OO+O+OO.+OOOOOO", "OOOOOOOOOOO++=====O=====+=O+==++=O+OOOOO", "OOOOOOOOOOO+=.=====.=++++===OO==+O=+OOOO", "OOOOOOOOOOO=+===.+=o==o===+&OoO======OOO", "OOOOOOOO+O+====OO+=o&&&&Oo==o&oO+==+=.O.", "OOOO+.+=+O==+&&o=oooOo&o&ooo=&oooO==O=+=", "OOOOOOOO++O===oo=oo&=&o&&oo=o==&o+==++==", "OOOOOOOO=o.=O====o&OO&o&oo&o&&oo=======O", "OOOOOOOo===+=O=O=ooO=ooooOOo=o&O=====OOO", "OOOOOOOOO+==+=======O=oo====O=o=O===+OOO", "OOOOOOOOO.=#=X=+====O========O======OOOO", "OOOOOOO.#Xo++.=#%====O==========OO==+OOO", "OOOOOO+Xo#+#+.#=.==X====+====O=+=+==+OOO", "OOOOO.+.+O===##.#=X.====oX##===o+OO.OOOO", "OOOOO#+####O#O##o.#+==#X#O#+...=OOo=+OOO", "OOOO++#o+#+X++++#.#O.#+#X.#+X+==+OO=oOOO", "OOOO#+.+..X+.##X++#++#..+XX#+##+..OOOOOO", "OOOO##....O+#++#+.++#+X+#+#X..+#+#OOOOOO", "OOOO++#+.+.#+#O+X#X#XX#.++##.#++.X$OOOOO", "OOOOO#+#+.+++#++.+++##+X###+X+X##+**OOOO", "OOOOO#..#OO#+.##o###.+..++.+#X+#+#* @OOO", "OOOOO+#.#O+#+#O.+++.###+##++###+.#* $OOO", "OOOOOOXX+#+#+#o..X##++#+..##.#+### *OOO", "OOOOOOOX#.#X+#+#+#+.#+..+####%XX%% OOO", "OOOOOOOO.%%X.#+#+#.++#+#+#+.X++=.% *OOO", "OOOOOOOOO.* *##+#+.O####.+XX%%%%#% $OOO", "OOOOOOOOOOO. %X.+.#+++XXX=.+++#X $OOO", "OOOOOOOOOOOO.* %%X..#X%=.####%X* $OOO", "OOOOOOOOOOOOOO.$ *XX%%%=.#X%###=* OOOO", "OOOOOOOOOOOOOOOOOO+%%%=%%#.+.#=* @OOOO", "OOOOOOOOOOOOOOOOOOo=%%%==X##X%* OOOOO", "OOOOOOOOOOOOOOOOOOO+X%%%%X=%* @OOOOO", "OOOOOOOOOOOOOOOOOOOOX%%%%X *@OOOOOO", "OOOOOOOOOOOOOOOOOOOO=%%%X* *$$OOOOOOOO", "OOOOOOOOOOOOOOOOOOOO+X%%= .OOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOX%%% OOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOO=%%* $OOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOO=%%% $OOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOO+%%% $OOOOOOOOOOOOO" }; /* XPM */ static const char *dex_xpm[] = { /* width height ncolors chars_per_pixel */ "40 40 19 1", /* colors */ " c #000000", ". c #949E9E", "X c #F8B090", "o c #5C7A7A", "O c #D4D4D4", "+ c #F87A24", "@ c #7C3400", "# c None", "$ c #B0B0B0", "% c #F89E6C", "& c #B64700", "* c #909090", "= c #606060", "- c #CEAA90", "; c #DADAB6", ": c #303030", "> c #F86800", ", c #FFB691", "< c #F88C48", /* pixels */ "########################################", "########################################", "########################################", "########################################", "########################################", "########################################", "###############-%-######################", "##############-%X<-#####################", "#########-<<-#-%XX+==###################", "#########%,X< :<,X%@ :##################", "#########-XX%: @;X%+ *#################", "##########<,X& :<<%+: :#################", "######->+#-%%%: <,XX@ #################", "######%X%@ <,,& @XXX+ :++-#############", "######-: +XX+ #########", "#####+%%@@,X%<,XXXXXXX<:@XXX<: =########", "####$%XX< <,<,XX& ########", "#####$%<%X@%XXXX<%XX< =#######", "#######<;X%XXXXX<<,XXXXXX%,XXXXXXXXX%@ #######", "##########- c #788C8C", ", c #606060", "< c #406868", "1 c #C80050", "2 c #FFFFFF", "3 c #FFFF00", "4 c #00B6FF", "5 c #CEAA90", "6 c #DADAB6", "7 c #F86800", "8 c #FFB691", "9 c #6C91B6", "0 c #F88C48", "q c #0000FF", /* pixels */ "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$", "$$$$$$$$$$$$$$$353333335*$$$$$$$$$$$$$$$", "$$$$$$$$$$$$*33333333#7@3335$$$$$$$$$$$$", "$$$$$$$$$65333333333@7777#333*$$$$$$$$$$", "$$$$$$$$$3333333333377777733333===%$$$$$", "$$$$$$$533333333333#7777777333%=====$$$$", "$$$$$$ #3333333333o>7777773330======%$$$", "$$$$5---O#33333o3944077777333*=======$$$", "$$$$-----O333333>4444.77333330======%$$$", "$$$ ---O--;3333344444443333333:====5$$$$", "$$$ O-----733333444444433333333 ==035$$$", "$$$3--O--O333333>44444>33333333333333$$$", "$$533---O33333333944493333#333333333356$", "$$33867733333o33333:o333333o3333333333$$", "$532+2233333#333333333333oooo3#3333333%$", "6522222+33333333333333333oooooo33o3333*$", "$+22+22263333333o3333333ooooooo333333356", "662222+2533333333333333#ooooooo33333333$", "$32+22223333o3#33333o333ooooooo3#333333%", "$33222233333333333#333333ooooo333333333$", "$33368333333333333330626*oooo#333333o33%", "%333335== 33oo333333222223#333333333333$", "$3333=====:ooooo333+22+2263333333.>o333%", "$5333=====oooooo33322222223333339444935$", "$*33 ====>ooooooo3362+222633333.44444>3$", "$%330====:ooooooo333222+23333334444444$$", "$$333177 =oooXoo#333*626333333;4444444$$", "$$53##777&3oooo3333333333333#--,444449$$", "$$$3;77777#3o333333333333333O---94449$$$", "$$%*@77777#33333333333333337O----O:o3$$$", "$$$5777777333 333333333333;---O-O73$$$$", "$$$$#7777730====#:.,33333333------3$$$$$", "$$$$$577333=====qqqq<0333333#O---35$$$$$", "$$$$$%53335====qqqqqq.33o333337735$$$$$$", "$$$$$$$533 ====qqqqqqq3333333333%$$$$$$$", "$$$$$$$$%33====qqqqqqq333333333%$$$$$$$$", "$$$$$$$$$$50===qqqqqq,3333333:$$$$$$$$$$", "$$$$$$$$$%6%5503,qqq<333#335%$$$$$$$$$$$", "$$$$$$$$$$$$$%$*53,03335o$%%$$$$$$$$$$$$", "$$$$$$$$$$$$$$$$$$$$$%$$+$$$$$$$$$$$$$$$" }; /* XPM */ static const char *hungry_xpm[] = { /* width height ncolors chars_per_pixel */ "40 40 15 1", /* colors */ " c #000000", ". c #949E9E", "X c #5C7A7A", "o c #D4D4D4", "O c None", "+ c #B0B0B0", "@ c #909090", "# c #788C8C", "$ c #606060", "% c #406868", "& c #FFFFFF", "* c #CEAA90", "= c #DADAB6", "- c #303030", "; c #6C91B6", /* pixels */ "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOO========OOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOO=============OOOOOOOOOOOOO", "OO;XX;@OOOOO================OOOOOOOO;XOO", "OO;%-;$OOOO==================OOOOOOO;XOO", "OO;-%;$OOO========@$#@========OOOOO+;;$O", "OO;%-;$OO=======- -*======*OOOO.;;$O", "OO;-%;$O======* @====.$$&=====@OOO.;;$O", "OO;X%;$O====== -========*@=====*.OO+;;$O", "OO;;;X$o====* -==========@======$OO;;;$O", "OO+;;-+o====- =============o====#@O+;;$O", "OOO;%$O===== @=============&====*$O;;;$O", "OOO+%OO====@ ==============&=====-OO;;$O", "OOo;-Oo====$ ==============o&==== OO;;$O", "OOO+%OO====@ ==============&===== O+;;#O", "OOO;-Oo====$-==============&&==== O+;;-O", "OOO;;+O=====$*============&&====* OO;;%+", "OOO;;$o=====$.============&&====X-OO;;$O", "OOO;;$O======*.===&======&&=====-$=O;;$O", "OOO;;$Oo=====.==========&&=====* @O+;;$O", "OOO;;$OO=======oo=====&&&======$-OOO;;$O", "OOO;;$OOo=======&o&&&&&&======$ @OOO;;$O", "OOO;;$OOOO========&=&========* $OOOO;;$O", "OO+;;$OOOOo=================* -OOOOO#;$O", "OOO;;$OOOOO=*==============@ -=OOOOO;;$O", "OOO;;$OOOOOOO+*==========*- $OOOOOOO;;$O", "OOOX-$OOOOOOOO@X@*====*#- -.OOOOOOOOX-$O", "OOOOOOOOOOOOOO=*@$- -$.=OOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOO=O==O=O=OOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO" }; /* XPM */ static const char *hvy_enc_xpm[] = { /* width height ncolors chars_per_pixel */ "40 40 13 1", /* colors */ " c #000000", ". c #949E9E", "X c #5C7A7A", "o c #D4D4D4", "O c None", "+ c #B0B0B0", "@ c #909090", "# c #788C8C", "$ c #606060", "% c #406868", "& c #FFFFFF", "* c #303030", "= c #6C91B6", /* pixels */ "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOoO+OOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOoOXX==OOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOoO=OO+==OOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOoXOO.*$=$OOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOO=+# *.X *OOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOO==.OO=+@ $OOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOXO==.OO $OOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOO+=@$@* @OOOOOOOOOOOOOO", "OOOOOOOOOOO&&&&&&&&&&&&&&&.OOOOOOOOOOOOO", "OOOOOOOOOOOo==============X*OOOOOOOOOOOO", "OOOOOOOOOOoO===X====X=====X**OOOOOOOOOOO", "OOOOOOOOOO&============X===% $OOOOOOOOOO", "OOOOOOOOOoo===*%====***%===%* OOOOOOOOOO", "OOOOOOOOOoO==% %===* %==X* @OOOOOOOOO", "OOOOOOOOO&===% *==% X==**===% $OOOOOOOOO", "OOOOOOOOoo===% %==% ===% ===X OOOOOOOOO", "OOOOOOOOoO==== *== *==== *==X* @OOOOOOOO", "OOOOOOOO&===== %== %==== %===% $OOOOOOOO", "OOOOOOOoo===== *== *==== *===%* OOOOOOOO", "OOOOOOOoO===== %==% ===* ====X* @OOOOOOO", "OOOOOOO&===X== *==% X==**=====% $OOOOOOO", "OOOOOOoo===== *==* %=====X OOOOOOO", "OOOOOOoO=====*%%X===*%*X======%* @OOOOOO", "OOOOOOo====================X===* $OOOOOO", "OOOOOOO=%X%XXXX%XXXXXXXXX%X=%X% OOOOOO", "OOOOOOO.=********************** OOOOOO", "OOOOOOOOO OOOOOO", "OOOOOOOOO. @OOOOOO", "OOOOOOOOOOOoOOoOoOoOoOoOoOOoOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO" }; /* XPM */ static const char *int_xpm[] = { /* width height ncolors chars_per_pixel */ "40 40 12 1", /* colors */ " c #000000", ". c #949E9E", "X c #5C7A7A", "o c #D4D4D4", "O c None", "+ c #B0B0B0", "@ c #909090", "# c #788C8C", "$ c #606060", "% c #406868", "& c #303030", "* c #6C91B6", /* pixels */ "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOO+#.X.##@#OOOOOOOOOOOOOOOOOO", "OOOOOOOO+##@X#O++.#+#.##OOOOOOOOOOOOOOOO", "OOOOOO+#Xo++#X#%#+##o#O#.#+OOOOOOOOOOOOO", "OOOOO.Xo#+#++##+.XX#..+.+..XOOOOOOOOOOOO", "OOOO++.+O.+O##+#.X###..OX#.+X+OOOOOOOOOO", "OOOO#+####O#O##o##+###X#+#+.#..OOOOOOOOO", "OOO.+#o+#+X++++#.#O+#+#X.#+X++X+OOOOOOOO", "OOO.+.+..X+.##X++#++#..+XX#+#X+..OOOOOOO", "OOO##....O+#++#+.++#+X+#+#X..+#+#OOOOOOO", "OOO++#+.+.#+#O+X#X#XX#.++##.#++.X$OOOOOO", "OOOO#+#+.+++#++.+++##+X###+X+X##+&&OOOOO", "OOOO#..#OO#+.##o###.+..++.+#X+#+#& @OOOO", "OOOO.#.#O+#+#O.+++.###+##++###+.# $OOOO", "OOOOOXX+#+#+#o..X##++#+..##.#+### &OOOO", "OOOOOOX#.#X+#+#+#+.#+..+####XX%X% OOOO", "OOOOOOO.%%X.#+#+#.++#+#+#+.%++*+% &OOOO", "OOOOOOOO@& &##+#+.O####.+XXX%%%#% $OOOO", "OOOOOOOOOO. %X.+.#+++XXX*.+++#% $OOOO", "OOOOOOOOOOO@& %%X..#XXX.####%%& $OOOO", "OOOOOOOOOOOOO@$ &XX%%%*.#X%###*& OOOOO", "OOOOOOOOOOOOOOOOO+%%%*%%#.+.#*& @OOOOO", "OOOOOOOOOOOOOOOOOO*%%%*.X##XX& OOOOOO", "OOOOOOOOOOOOOOOOOOOX%%%%X*%& @OOOOOO", "OOOOOOOOOOOOOOOOOOOX%%%%% &@OOOOOOO", "OOOOOOOOOOOOOOOOOOO*%%%X& &$$OOOOOOOOO", "OOOOOOOOOOOOOOOOOOO+%%%* .OOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOO+*%%% OOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOO*%%& $OOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOO*%%% $OOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOO+%%& $OOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOoOOOOOOOOOOOOOOOO" }; /* XPM */ static const char *lawful_xpm[] = { /* width height ncolors chars_per_pixel */ "40 40 10 1", /* colors */ " c #000000", ". c #949E9E", "X c #5C7A7A", "o c #D4D4D4", "O c None", "+ c #B0B0B0", "@ c #909090", "# c #606060", "$ c #FFFFFF", "% c #303030", /* pixels */ "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOo$$$$$$oOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOO$$o$$o$$$$$OOOOOOOOOO", "OOOOOOOOOOOOOOOOOOo$$$$$$$o$$ooOOOOOOOOO", "OOOOOOOOOOOOOOOOOO$o$$$o$$$$$$$oOOOOOOOO", "OOOOOOOOOOOOOOOOOo$$$$+ .o$$$$$oOOOOOOOO", "OOOOOOOOOOOOOOOOOo$$$+%OOOO$o$$$oOOOOOOO", "OOOOOOOOOOOOOOOOO$$o$X@OOOOo$$$ooOOOOOOO", "OOOOOOOOOOOOOOOOO$$$$%OOOOOo$$$..OOOOOOO", "OOOOOOOOOOOOOOOOO$$$$@OOOOo$$oo##OOOOOOO", "OOOOOOOOOOOOOOOO+$$o$$ooOoo$$$o OOOOOOOO", "OOOOOOOOOOOOOOOOO$$$$$$$o$$$$o#%OOOOOOOO", "OOOOOOOOOOOOOOOO+$$o$$o$$$$$o@%OOOOOOOOO", "OOOOOOOOOOOOOOOOO$$$$$$$$o$o.%OOOOOOOOOO", "OOOOOOOOOOOOOOOOOo$$$o$$oo@#%OOOOOOOOOOO", "OOOOOOOOoooooo$$$$$$$$$$$% %OOOOOOOOOOOO", "OOOOOOO$$$$$$$$$$$$o$$o$$$$$$$oOOOOOOOOO", "OOOOOO$$$$$$$$$o$$$$$$$$$$$$o$$oOOOOOOOO", "OOOOOO$$o$ooooo##+o$$+##@oo$$$$$oOOOOOOO", "OOOOOOo$$#% %#$$$+%##%%#ooo$O#OOOOOOO", "OOOOOOOo@##OOOOO+$$$##OOOO#%%##%@OOOOOOO", "OOOOOOOOOOOOOOOOo$$$##OOOOOOO##@OOOOOOOO", "OOOOOOOOOOOOOOOOo$$o##OOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOO$$oo OOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOO+$$$o OOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOO$$$##OOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOO$o$##OOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOO$$$##OOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOo$$$##OOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOo$$o%@OOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOo$$o OOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOO$$oo OOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOO$$$o OOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOO$$$##OOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOo$$##OOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOO$$o##OOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOo$# @OOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOO.#@OOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO" }; /* XPM */ static const char *mod_enc_xpm[] = { /* width height ncolors chars_per_pixel */ "40 40 13 1", /* colors */ " c #000000", ". c #949E9E", "X c #5C7A7A", "o c #D4D4D4", "O c None", "+ c #B0B0B0", "@ c #909090", "# c #788C8C", "$ c #606060", "% c #406868", "& c #FFFFFF", "* c #303030", "= c #6C91B6", /* pixels */ "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOoO+OOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOoOXX==OOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOoO=OO+==OOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOoXOO.*$=$OOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOO=+# *.X *OOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOO==.OO=+@ $OOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOXO==.OO $OOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOO+=@$@* @OOOOOOOOOOOOOO", "OOOOOOOOOOOOOo&&&&&&&&&oXOOOOOOOOOOOOOOO", "OOOOOOOOOOOO+&=========X%@OOOOOOOOOOOOOO", "OOOOOOOOOOOOO&=====X====% @OOOOOOOOOOOOO", "OOOOOOOOOOOOoO==X=======X* OOOOOOOOOOOOO", "OOOOOOOOOOOO&====*%*%*===* $OOOOOOOOOOOO", "OOOOOOOOOOO+&===X ===% *OOOOOOOOOOOO", "OOOOOOOOOOOoO===**=======X* OOOOOOOOOOOO", "OOOOOOOOOOO&===% %=======X% $OOOOOOOOOOO", "OOOOOOOOOOO&===% %*%%=====% *OOOOOOOOOOO", "OOOOOOOOOOoO===* ====X* OOOOOOOOOOO", "OOOOOOOOOO&=========* X===X% $OOOOOOOOOO", "OOOOOOOOO+&=========% *====% *OOOOOOOOOO", "OOOOOOOOOoO===% %=== %====%* OOOOOOOOOO", "OOOOOOOOO&====* *==X===% $OOOOOOOOO", "OOOOOOOOO&======*%*%X=======% *OOOOOOOOO", "OOOOOOOOOo==X===============% OOOOOOOOO", "OOOOOOOOO=XXXXXXXXXX%X%X%X%%% $OOOOOOOO", "OOOOOOOOOO=%**************** $OOOOOOOO", "OOOOOOOOOOO$ $OOOOOOOO", "OOOOOOOOOOOO* *OOOOOOOOO", "OOOOOOOOOOOOOoOOoOoOoOoOoOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO" }; /* XPM */ static const char *neutral_xpm[] = { /* width height ncolors chars_per_pixel */ "40 40 14 1", /* colors */ " c #000000", ". c #949E9E", "X c #5C7A7A", "o c #D4D4D4", "O c None", "+ c #B0B0B0", "@ c #909090", "# c #788C8C", "$ c #606060", "% c #406868", "& c #FFFFFF", "* c #00B6FF", "= c #303030", "- c #6C91B6", /* pixels */ "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOO.------.OOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOO-+O&o.-----OOOOOOOOOO", "OOOOOOOOOOOOOOOOOO+-&o--------.OOOOOOOOO", "OOOOOOOOOOOOOOOOOO-oo----------+OOOOOOOO", "OOOOOOOOOOOOOOOOO+-&--% #-------OOOOOOOO", "OOOOOOOOOOOOOOOOO-OO-X=OOO.-----+OOOOOOO", "OOOOOOOOOOOOOOOOO-oO-%#OOOO.-----OOOOOOO", "OOOOOOOOOOOOOOOOO--O-=OOOOO+---X#OOOOOOO", "OOOOOOOOOOOOOOOOO-oO-XOOOO+OO--=$OOOOOOO", "OOOOOOOOOOOOOOOOO-OO--++OO-&--- OOOOOOOO", "OOOOOOOOOOOOOOOOO-OO-----+oo--%=OOOOOOOO", "OOOOOOOOOOOOOOOOO--O--+o&&o--%=OOOOOOOOO", "OOOOOOOOOOOOOOOOO-oo*-------%=OOOOOOOOOO", "OOOOOOOOOOOOOOOOO-oO------%%=OOOOOOOOOOO", "OOOOOOOO+.+-+.---O&------= =OOOOOOOOOOOO", "OOOOOO+-oo&&&&&&&&------------.OOOOOOOOO", "OOOOOO---------------X-----O&Oo-OOOOOOOO", "OOOOOO---------%=%---%%=%----OO-.OOOOOOO", "OOOOOO---== =%---%=%%===----%XOOOOOOO", "OOOOOOO-#$%OOOOOO-+-%$OOOO%===%=@OOOOOOO", "OOOOOOOOOOOOOOOO.-&-=%OOOOOOO%%#OOOOOOOO", "OOOOOOOOOOOOOOOo-O+-%$OOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOO-oO- OOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOO-OO- OOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOO-&-%%OOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOO-&-%$OOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOO-&-=$OOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOO--o-%$OOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOO+-&- .OOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOO-Oo- OOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOO-OO- OOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOO-oO- OOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOO-OO%%OOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOO-o-%$OOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOO---%$OOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOO--% #OOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOX$@OOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO" }; /* XPM */ static const char *ovr_enc_xpm[] = { /* width height ncolors chars_per_pixel */ "40 40 13 1", /* colors */ " c #000000", ". c #949E9E", "X c #5C7A7A", "o c #D4D4D4", "O c None", "+ c #B0B0B0", "@ c #909090", "# c #788C8C", "$ c #606060", "% c #406868", "& c #FFFFFF", "* c #303030", "= c #6C91B6", /* pixels */ "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOoO+=+OOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOo=#===+OOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOo=.OO@X=OOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOo#OO* #X @OOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOO+=.XX+=#* @OOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOO+=O=.=OO $OOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOO#.=+OO@ $OOOOOOOOOOOOOO", "OOOOOOOOOooooooooo&O.#+#XooooOOOOOOOOOOO", "OOOOOOOOO&OOoOoOoOOOOOOOOOoO%@OOOOOOOOOO", "OOOOOOOOoO==================X*@OOOOOOOOO", "OOOOOOOO&===================X% @OOOOOOOO", "OOOOOOOO&==%*%*%*%*%*%*%*%*==% *OOOOOOOO", "OOOOOOOoO==%*%%*%%*%%*%*%*%==X* OOOOOOOO", "OOOOOOO&======================* $OOOOOOO", "OOOOOO+&=== ===% *OOOOOOO", "OOOOOOoO======================X* OOOOOOO", "OOOOOO&=======================X% $OOOOOO", "OOOOOOo========================% *OOOOOO", "OOOOOoO===*%X=====%%======%%===X* OOOOOO", "OOOOO&==% %==% *==== %==* $OOOOO", "OOOOO&== *==**== **% *=X% %%* ==% *OOOOO", "OOOOoO==%%==* =* ===% == %=== %=X* OOOOO", "OOOO&=======% =**===% %X %X==* =X% $OOOO", "OOOO&======% %= %==== %% ====* ==% *OOOO", "OOOoO=====% *== *==== %* ====% ==X* OOOO", "OOO&====XX *===**===% X% X=== *===* $OOO", "OO+&====X *====* ===% == *=== %===% *OOO", "OOoO===% %*%*== *** %==% %** ====X* OOO", "OO&====% ==X *====* %====X% $OO", "OO&================================% *OO", "OOo===X============================% OO", "OO=XXXXXXXXXXXX%XXXX%X%X%XXXXX%X%X%% $O", "OOO=%****************************** $O", "OOOO$ $O", "OOOOO* *OO", "OOOOOOOOOOoOOoOOoOOoOOoOOoOOoOOoOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO" }; /* XPM */ static const char *pet_mark_xpm[] = { /* width height ncolors chars_per_pixel */ "8 7 2 1", /* colors */ ". c None", " c #FF0000", /* pixels */ "........", ".. . .", ". ", ". ", ".. .", "... ..", ".... ..." }; /* 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", /* colors */ " c #000000", ". c #949E9E", "X c #F8B090", "o c #5C7A7A", "O c #D4D4D4", "+ c #F87A24", "@ c #7C3400", "# c None", "$ c #B0B0B0", "% c #F89E6C", "& c #914700", "* c #B64700", "= c #909090", "- c #788C8C", "; c #606060", ": c #406868", "> c #FFFFFF", ", c #CEAA90", "< c #DADAB6", "1 c #303030", "2 c #FFB691", "3 c #6C91B6", "4 c #F88C48", /* pixels */ "########################################", "########################################", "########################################", "########################################", "########################################", "########################################", "########################################", "################<<<<<<<<################", "##############<<<<<<<<<<$#$$$###########", "############<<<<<<<<<<$:31:3:###########", "###########<<<<<<%42<<#:3:133-##########", "##########<<<<<%<<;;=o$131:33;##########", "#########<<<<<<,1 ::31:33;,#########", "########<<<<<<, =<<<<.13:133;<=########", "########<<<%2, 1<<<<<<#333:33;<,=#######", "#######<<<3-=<33;<<@o######", "#######O<<<<<,#<<<<<<<<.3:<3-;<, =######", "########<<<<2<<<<<<<<<>#31<33o<11#######", "########O<<<<44<>O>>>>>#3:<3.;- =#######", "##########<<<4<<<<><><<$3:<331 ;<#######", "##########<<<<<<<%2<<<<$3:<33 1#########", "###########O,<<<<<<<<<<#31<331##########", "#############.<<<<<<<<<$3:133;##########", "##############=;=,<<<<,o 1;;=##########", "###############<=;1 1;=##############", "#################<# c #B64700", ", c #909090", "< c #788C8C", "1 c #606060", "2 c #406868", "3 c #FFFFFF", "4 c #CEAA90", "5 c #DADAB6", "6 c #303030", "7 c #F86800", "8 c #FFB691", "9 c #6C91B6", "0 c #F88C48", "q c #0000FF", /* pixels */ "****************************************", "*************#333333333#****************", "***********##33333#333333#**************", "**********#33333#33333#33*==************", "*********#33##33-;-3#3333399************", "********#33#33#3-@ 33333#33=.***********", "********#3*#33-;;;;;-33333#99***********", "*******#3*3333-;;;;@ 33#333#9=**********", "*******#333#33#3-;-33#*##33399**********", "******#3#3333333-@-#333#9933*9=*********", "******#333#33#3333333#333*9999=*********", "******#333333333#3#33333333*999*********", "******#3#33#33333333#33#3333#9=*********", "******#333334>&&:&&>::44,3#33#9*********", "******#33*::&41OOO6:4O 0::4433=*********", "******#3:>,0:O0O1O+O:OXO,O+2+OOo4<+1104:>:#*********", "******.&:1OOO,14X2O48:O80,440:,*********", "******4::>OOO%8-X4O4%O,84+O0X&>=********", "******.::>,O 99*X+<$,+.o*1O4&0:*********", "******>:0&4O5qq9#10OO3qq9,+X:1:*********", "****=>,,::,O4qq9X+O>O-qq9O2X0,>*********", "******4:>OOOO48882OOOO+4OOO07*4*********", "******4*,4OO+OXX3O5************", "*********=0%,OO,>:>>O +1OO4*************", "**********=%+OO:::1:::6+:7**************", "***********7&OO:O+O,O1OO+1**************", "***********40OO,O4:OOO11O<5*************", "**********=4 +O1O2+O2+O0O***************", "************72O+1+21-OOO%5**************", "************0%1OOOO+O+174***************", "*************%%O,OO1407-=***************", "**************-$>%0%:74*****************", "****************54044*=*****************", "*****************=*=********************" }; /* XPM */ static const char *sick_il_xpm[] = { /* width height ncolors chars_per_pixel */ "40 40 23 1", /* colors */ " c #F85848", ". c #949E9E", "X c #F8B090", "o c #E00028", "O c #D4D4D4", "+ c #F87A24", "@ c #7C3400", "# c None", "$ c #B0B0B0", "% c #F89E6C", "& c #FF0000", "* c #914700", "= c #B64700", "- c #909090", "; c #606060", ": c #FFFFFF", "> c #CEAA90", ", c #DADAB6", "< c #F86800", "1 c #FFB691", "2 c #6C91B6", "3 c #F88C48", "4 c #0000FF", /* pixels */ "########################################", "#############O:::::::::O################", "###########OO:::::O::::::O##############", "##########O:::::O:::::O::#$$############", "#########O::OO::%&%:O:::::22############", "########O::O::O:%o :::::O::$.###########", "########O:#O::%&&&&&%:::::O22###########", "#######O:#::::%&&&&o ::O:::O2$##########", "#######O:::O::O:%&%::O#OO:::22##########", "######O:O:::::::%o%O:::O22::#2$#########", "######O:::O::O:::::::O:::#2222$#########", "######O:::::::::O:O::::::::#222#########", "######O:O::O::::::::O::O::::O2$#########", "######O:::::>=@@=**=**>>-:O::O2#########", "######O::#**@3>%* ;=>=3;<@>>::$#########", "######O:** >=>XXXX1X >>+>%*%*;O#########", "######O3@*,X%XXXXXXX>X%XX >*=*O#########", "######.@@3XXXXXXXXXXXXXXX>X>3*-#########", "######>***>X% >XXXXX3XXXXXX%>*=>########", "######.***> 22#XXX<%X22#XXX@+;#########", "######=*3@X>O442OXX==%XX11111O1+%X111XX%<#>#########", "######.,;XXXXXX1O1X%3XXXXX%+3###########", "########3=XXXXXX:XXXXXXXXX+<>$##########", "########>+XXXXXX%-3->XXXX%+<############", "#########%3XXXXXX>- -%XXX%<%$###########", "#########$############", "##########+%XXXXXXXXXXXX%+<#############", "##########%3XXX>=****3XX%<%#############", "##########>+XXX**=3-*@3>3+##############", "###########<%XX >XX%X;%X3+##############", "###########%3XX>XX++XXXX<%$#############", "##########$>+XXXXXXXXXXX<###############", "############<%XXXXXXXXX3+###############", "###########$%+XXXXXXXX%<>###############", "#############++XXXXXX%<%$###############", "#############$%<<3333<%#################", "#################%3>>$##################", "#################$#$####################" }; /* XPM */ static const char *slt_enc_xpm[] = { /* width height ncolors chars_per_pixel */ "40 40 13 1", /* colors */ " c #000000", ". c #949E9E", "X c #5C7A7A", "o c #D4D4D4", "O c None", "+ c #B0B0B0", "@ c #909090", "# c #788C8C", "$ c #606060", "% c #406868", "& c #FFFFFF", "* c #303030", "= c #6C91B6", /* pixels */ "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOoO+OOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOoOXX==OOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOoO=OO+==OOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOoXOO.*$=$OOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOO=+# *.X *OOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOO==.OO=+@ $OOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOXO==.OO $OOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOO+=@$@* @OOOOOOOOOOOOOO", "OOOOOOOOOOOOOOO&&&&&&&X @OOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOo======X*OOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOoO======X**OOOOOOOOOOOOOOO", "OOOOOOOOOOOOOO&====X===% $OOOOOOOOOOOOOO", "OOOOOOOOOOOOOoo==%* %==%* OOOOOOOOOOOOOO", "OOOOOOOOOOOOOoO=% % =X* @OOOOOOOOOOOOO", "OOOOOOOOOOOOO&==**==% %=% $OOOOOOOOOOOOO", "OOOOOOOOOOOOoo==%%==* %=X OOOOOOOOOOOOO", "OOOOOOOOOOOOoO=====* X==X* @OOOOOOOOOOOO", "OOOOOOOOOOOO&=====* %====% $OOOOOOOOOOOO", "OOOOOOOOOOOoo==== X=====%* OOOOOOOOOOOO", "OOOOOOOOOOOo+===* *%*%%==X* @OOOOOOOOOOO", "OOOOOOOOOOO&==== %===% $OOOOOOOOOOO", "OOOOOOOOOOO&==============% OOOOOOOOOOO", "OOOOOOOOOOO==============X% @OOOOOOOOOO", "OOOOOOOOOOO+%%%%%%%%%%%%%% $OOOOOOOOOO", "OOOOOOOOOOOOO% $OOOOOOOOOO", "OOOOOOOOOOOOO@ @OOOOOOOOOO", "OOOOOOOOOOOOOO@$$$$$$$$$$$$$@OOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO" }; /* XPM */ static const char *str_xpm[] = { /* width height ncolors chars_per_pixel */ "40 40 17 1", /* colors */ " c #000000", ". c #F8B090", "X c #5C7A7A", "o c #F87A24", "O c #7C3400", "+ c None", "@ c #B0B0B0", "# c #F89E6C", "$ c #B64700", "% c #909090", "& c #606060", "* c #CEAA90", "= c #DADAB6", "- c #303030", "; c #F86800", ": c #FFB691", "> c #F88C48", /* pixels */ "++++++++++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++++++++++", "+++++++++++++++++++*>*>#++++++++++++++++", "++++++++++++++++*#o>..*#o*++++++++++++++", "+++++++++++++++o#.#>.....o++++++++++++++", "+++++++++++++++;>;#.o.>..#$X++++++++++++", "+++++++++++++++o#>.o.>:...o %++++++++++", "++++++++++++++o##>>#o##>..#O -++++++++++", "++++++++++++++>#.oo#>..>...O ++++++++++", "++++++++++++++*o##.>>;o#...o ++++++++++", "+++++++++++++++*;o#........>- &+++++++++", "+++++++++++++++++#>>;o......O -+++++++++", "+++++++++++++++++@+@+o>.....$ +++++++++", "+++++++++++++++++++++*;.#...>- %++++++++", "++++++++++++++++++++++;>o....$ &++++++++", "++++++++++++++++++++++#>>....>- %+++++++", "+++++++++++++++++++++++;#>....; -+++++++", "+++++++++++++++++++++++o#>....>O %++++++", "+++++++++++++++++++++++*>o.....; -++++++", "+++++++++++++#>**+++++++;#.....>O %+++++", "+o#+++++++*o;>>>>o#+++++o##.....; -+++++", "+:#o*++++oo#..*..*>;*+++#>#.....>O %++++", "+:=#o#+*;>.:==:....#;*++@o.......; &++++", "+::..>;o#.=::::......o*++;.......>O ++++", "+.....#o.:.=:.........o#+;........$ ++++", "+......#o..:...........#o;>.......o &+++", "+........#..............*>o......:o- +++", "+..................#o>#...#o.......O +++", "+...............>o>#.......#>......O &++", "+..................................o -++", "+..................................> ++", "+..................................> ++", "+.................................#$ &+", "+................................>$ &+", "+..#>$o>#..............#>;>>>oOOO- ++", "+...#O OOOOO$>>>>>>>$OO %++", "+...o -&&++++", "+..#O -&&%++++++++++", "++++++++++++++++++++++++++++++++++++++++" }; /* XPM */ static const char *stunned_xpm[] = { /* width height ncolors chars_per_pixel */ "40 40 12 1", /* colors */ " c #000000", ". c #949E9E", "X c #5C7A7A", "o c #D4D4D4", "O c None", "+ c #B0B0B0", "@ c #909090", "# c #788C8C", "$ c #606060", "% c #406868", "& c #303030", "* c #6C91B6", /* pixels */ "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOO&$OOOO@OOO@@OO@OOOOOOOOOOOOO", "OOOOOOOOOOO@& $OO@&&$$@ O@$$OOOOOOOOOOOO", "OOOOOOOOOOOO$$ @@@$ &&OOO@$OOOOOOOOOOOO", "OOOOOOOOOOOOO@@&$$$$&O$OO$O &@O@OOOOOOOO", "OOOOOO@@@@@@OO@$$O$&$@@OO& &&$O&OOOOOOO", "OOOOOO&&&& & $ &&@$ &O@$& &&&$ & $OOOOOO", "OOOOOO$&OO &&&$ $$ $& $$&$&&&OOOOOOO", "OOOOOO@@O@$ &+ # &O$$ $$&O@OOOOO", "OOOOOOOO@X%$ %& %% & && $$@@@@OOOO", "OOOOOOO+$$@+ &%%%&%& & &@OOO&&OOO", "OOOOOO.Xo%+ &&%%%%%&& & OO@$&&OOO", "OOOOO++ $$&&$ && %&%%& &O@&$&OOOO", "OOOOO####$ X&&& && &%& & &&OOOO", "OOOO++#.+## $&# %& & & &$ OOOO", "OOOO#+++.@&%&& &#&%& & $ @OOOOOO", "OOOO##....#+$#@%#& $%$&@&$$% & X##$@OOOO", "OOOO.+#+.+@#+#+$&$X#%&%.+& %&#++.$&OOOOO", "OOOOO#+#+.+++#$$%&++&X+X#&#+&+&##+ &OOOO", "OOOOO#..#OO#+@%#o##X.@..++.+$&+#+#& @OOO", "OOOOO+#.#O+#+#O@++@$$##+##++###+.#& $OOO", "OOOOOOXX+#+#+#o.@%&$++#+..##.#+### &OOO", "OOOOOOOX#.#X+#+#+##&#+..+####%XX%% OOO", "OOOOOOOO+%%X.#+#+#.++#+#+#+.X++*.% &OOO", "OOOOOOOOO@& &##+#+.O####.+XX%%%%#% $OOO", "OOOOOOOOOOO. %X.+.#+++XXX*.+++#X $OOO", "OOOOOOOOOOOO@& %%X..#X%#.####%X& $OOO", "OOOOOOOOOOOOOO@$ &XX%%%*.#X%###*& OOOO", "OOOOOOOOOOOOOOOOOO+%%%*%%#.+.#*& @OOOO", "OOOOOOOOOOOOOOOOOOO*%%%**X##X%& OOOOO", "OOOOOOOOOOOOOOOOOOOOX%%%%X*X& @OOOOO", "OOOOOOOOOOOOOOOOOOOOX%%%%X &@OOOOOO", "OOOOOOOOOOOOOOOOOOOO*%%%X& &$$OOOOOOOO", "OOOOOOOOOOOOOOOOOOOO+X%%* @OOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOX%%& OOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOO*%%% $OOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOO*%%% $OOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOO.X%& $OOOOOOOOOOOOO" }; /* XPM */ static const char *wis_xpm[] = { /* width height ncolors chars_per_pixel */ "40 40 13 1", /* colors */ " c #000000", ". c #949E9E", "X c #5C7A7A", "o c None", "O c #B0B0B0", "+ c #909090", "@ c #788C8C", "# c #606060", "$ c #406868", "% c #FFFFFF", "& c #303030", "* c #6C91B6", "= c #0000FF", /* pixels */ "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooo+#& &#oooooooooooooooooooo", "oooooooooooo+& #oooooooooooooooooo", "ooooooooooo+ &====&& &ooooooooooooooooo", "oooooooooo+ &==& ===%& +ooooooooooooooo", "ooooooooo+&%=== ===%%o&&oooooooooooooo", "oooooooo.&%%===& ===%o& #+ooooooooooo", "oooo&###&&%%*=======$#&ooo#& #+oooooooo", "ooooo###o+&X$=====& #oo##oooo+######oooo", "oooooooooooo######@oo##ooooooooooooooooo", "oooooooooooooOoOoOo##ooooooooooooooooooo", "ooooooooooooooooo+#+ooo+&#oooooooooooooo", "ooooooooooooooooooooooo#oooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo" }; slashem-0.0.7E7F3/include/mfndpos.h0000664000076400007640000000226010545462317015116 0ustar aliali/* SCCS Id: @(#)mfndpos.h 3.4 2002/04/06 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #ifndef MFNDPOS_H #define MFNDPOS_H #define ALLOW_TRAPS 0x00020000L /* can enter traps */ #define ALLOW_U 0x00040000L /* can attack you */ #define ALLOW_M 0x00080000L /* can attack other monsters */ #define ALLOW_TM 0x00100000L /* can attack tame monsters */ #define ALLOW_ALL (ALLOW_U | ALLOW_M | ALLOW_TM | ALLOW_TRAPS) #define NOTONL 0x00200000L /* avoids direct line to player */ #define OPENDOOR 0x00400000L /* opens closed doors */ #define UNLOCKDOOR 0x00800000L /* unlocks locked doors */ #define BUSTDOOR 0x01000000L /* breaks any doors */ #define ALLOW_ROCK 0x02000000L /* pushes rocks */ #define ALLOW_WALL 0x04000000L /* walks thru walls */ #define ALLOW_DIG 0x08000000L /* digs */ #define ALLOW_BARS 0x10000000L /* may pass thru iron bars */ #define ALLOW_SANCT 0x20000000L /* enters temples */ #define ALLOW_SSM 0x40000000L /* ignores scare monster */ #ifdef NHSTDC #define NOGARLIC 0x80000000UL /* hates garlic */ #else #define NOGARLIC 0x80000000L /* hates garlic */ #endif #endif /* MFNDPOS_H */ slashem-0.0.7E7F3/include/artilist.h0000664000076400007640000003732310545462317015313 0ustar aliali/* SCCS Id: @(#)artilist.h 3.4 2003/02/12 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #include "config.h" /* WAC for blackmarket, spoon */ #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, 0 } #define NO_ATTK {0,0,0,0} /* no attack */ #define NO_DFNS {0,0,0,0} /* no defense */ #define NO_CARY {0,0,0,0} /* no carry effects */ #define DFNS(c) {0,c,0,0} #define CARY(c) {0,c,0,0} #define PHYS(a,b) {0,AD_PHYS,a,b} /* physical */ #define DRLI(a,b) {0,AD_DRLI,a,b} /* life drain */ #define COLD(a,b) {0,AD_COLD,a,b} #define FIRE(a,b) {0,AD_FIRE,a,b} #define ELEC(a,b) {0,AD_ELEC,a,b} /* electrical shock */ #define STUN(a,b) {0,AD_STUN,a,b} /* magical attack */ 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). */ /* [Tom] rearranged by alignment, so when people ask... */ /* KMH -- Further arranged: * 1. By alignment (but quest artifacts last). * 2. By weapon class (skill). */ /* 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 ), /*** Lawful artifacts ***/ A("Firewall", ATHAME, (SPFX_RESTR|SPFX_ATTK|SPFX_DEFN), 0, 0, FIRE(4,4), FIRE(0,0), NO_CARY, 0, A_LAWFUL, PM_FLAME_MAGE, NON_PM, 400L ), /* * The combination of SPFX_WARN and M2_something on an artifact * will trigger EWarn_of_mon for all monsters that have the appropriate * M2_something flags. In Sting's case it will trigger EWarn_of_mon * for M2_ORC monsters. */ A("Sting", ELVEN_DAGGER, (SPFX_WARN|SPFX_DCLAS), 0, M2_ORC, PHYS(5,0), NO_DFNS, NO_CARY, 0, A_LAWFUL, NON_PM, PM_ELF, 800L ), A("Giantkiller", AXE, (SPFX_RESTR|SPFX_DFLAG2), 0, M2_GIANT, PHYS(5,0), NO_DFNS, NO_CARY, 0, A_NEUTRAL, NON_PM, NON_PM, 800L ), A("Quick Blade", ELVEN_SHORT_SWORD, SPFX_RESTR, 0, 0, PHYS(9,2), NO_DFNS, NO_CARY, 0, A_LAWFUL, NON_PM, NON_PM, 1000L ), A("Orcrist", ELVEN_BROADSWORD, SPFX_DFLAG2, 0, M2_ORC, PHYS(5,0), NO_DFNS, NO_CARY, 0, A_LAWFUL, NON_PM, PM_ELF, 2000L ), 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("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 ), 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 ), /* * Ah, never shall I forget the cry, * or the shriek that shrieked he, * As I gnashed my teeth, and from my sheath * I drew my Snickersnee! * --Koko, Lord high executioner of Titipu * (From Sir W.S. Gilbert's "The Mikado") */ A("Snickersnee", KATANA, SPFX_RESTR, 0, 0, PHYS(0,8), NO_DFNS, NO_CARY, 0, A_LAWFUL, PM_SAMURAI, NON_PM, 1200L ), #ifdef YEOMAN /* KMH -- Renamed from Holy Sword of Law (Stephen White) * This is an actual sword used in British coronations! */ A("Sword of Justice", LONG_SWORD, (SPFX_RESTR|SPFX_DALIGN), 0, 0, PHYS(5,12), NO_DFNS, NO_CARY, 0, A_LAWFUL, PM_YEOMAN, NON_PM, 1500L ), #endif 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), DFNS(AD_WERE), 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("Skullcrusher", CLUB, SPFX_RESTR, 0, 0, PHYS(3,10), NO_DFNS, NO_CARY, 0, A_LAWFUL, PM_CAVEMAN, NON_PM, 300L ), 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 ), 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 ), #ifdef YEOMAN A("Reaper", HALBERD, SPFX_RESTR, 0, 0, PHYS(5,20), NO_DFNS, NO_CARY, 0, A_LAWFUL, PM_YEOMAN, NON_PM, 1000L ), #endif A("Holy Spear of Light", SILVER_SPEAR, (SPFX_RESTR|SPFX_INTEL|SPFX_DFLAG2), 0, M2_UNDEAD, PHYS(5,10), NO_DFNS, NO_CARY, LIGHT_AREA, A_LAWFUL, NON_PM, NON_PM, 4000L ), /*** Neutral artifacts ***/ 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("Luckblade", SHORT_SWORD, (SPFX_RESTR|SPFX_LUCK), 0, 0, PHYS(5,5), NO_DFNS, NO_CARY, 0, A_NEUTRAL, NON_PM, PM_GNOME, 1000L ), A("Sword of Balance", SILVER_SHORT_SWORD, (SPFX_RESTR|SPFX_DALIGN), 0, 0, PHYS(2,5), NO_DFNS, NO_CARY, 0, A_NEUTRAL, NON_PM, NON_PM, 5000L ), 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 ), /* * Two problems: 1) doesn't let trolls regenerate heads, * 2) doesn't give unusual message for 2-headed monsters (but * allowing those at all causes more problems than worth the effort). */ 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 ), A("Disrupter", MACE, (SPFX_RESTR|SPFX_DFLAG2), 0, M2_UNDEAD, PHYS(5,30), NO_DFNS, NO_CARY, 0, A_NEUTRAL, PM_PRIEST, NON_PM, 500L ), /* * Mjollnir will return to the hand of a Valkyrie when thrown * if the wielder is a Valkyrie with strength of 25 or more. */ A("Mjollnir", HEAVY_HAMMER, /* Mjo:llnir */ (SPFX_RESTR|SPFX_ATTK), 0, 0, ELEC(5,24), NO_DFNS, NO_CARY, 0, A_NEUTRAL, PM_VALKYRIE, NON_PM, 4000L ), /* STEPHEN WHITE'S NEW CODE */ A("Gauntlets of Defense", GAUNTLETS_OF_DEXTERITY, SPFX_RESTR, SPFX_HPHDAM, 0, NO_ATTK, NO_DFNS, NO_CARY, INVIS, A_NEUTRAL, PM_MONK, NON_PM, 5000L ), A("Mirrorbright", SHIELD_OF_REFLECTION, (SPFX_RESTR|SPFX_HALRES|SPFX_REFLECT), 0, 0, NO_ATTK, NO_DFNS, NO_CARY, 0, A_NEUTRAL, PM_HEALER, NON_PM, 5000L ), A("Deluder", CLOAK_OF_DISPLACEMENT, (SPFX_RESTR|SPFX_STLTH|SPFX_LUCK), 0, 0, NO_ATTK, NO_DFNS, NO_CARY, 0, A_NEUTRAL, PM_WIZARD, NON_PM, 5000L ), #ifdef TOURIST A("Whisperfeet", SPEED_BOOTS, (SPFX_RESTR|SPFX_STLTH|SPFX_LUCK), 0, 0, NO_ATTK, NO_DFNS, NO_CARY, 0, A_NEUTRAL, PM_TOURIST, NON_PM, 5000L ), #else A("Whisperfeet", SPEED_BOOTS, (SPFX_RESTR|SPFX_STLTH|SPFX_LUCK), 0, 0, NO_ATTK, NO_DFNS, NO_CARY, 0, A_NEUTRAL, NON_PM, NON_PM, 5000L ), #endif /*** Chaotic artifacts ***/ A("Grimtooth", ORCISH_DAGGER, SPFX_RESTR, 0, 0, PHYS(2,6), NO_DFNS, NO_CARY, 0, A_CHAOTIC, NON_PM, PM_ORC, 300L ), A("Deep Freeze", ATHAME, (SPFX_RESTR|SPFX_ATTK|SPFX_DEFN), 0, 0, COLD(5,5), COLD(0,0), NO_CARY, 0, A_CHAOTIC, PM_ICE_MAGE, NON_PM, 400L ), A("Serpent's Tongue", DAGGER, SPFX_RESTR, 0, 0, PHYS(2,0), NO_DFNS, NO_CARY, 0, A_CHAOTIC, PM_NECROMANCER, NON_PM, 400L ), /* See artifact.c for special poison damage */ A("Cleaver", BATTLE_AXE, SPFX_RESTR, 0, 0, PHYS(3,6), NO_DFNS, NO_CARY, 0, A_NEUTRAL, PM_BARBARIAN, NON_PM, 1500L ), A("Doomblade", ORCISH_SHORT_SWORD, SPFX_RESTR, 0, 0, PHYS(0,10), NO_DFNS, NO_CARY, 0, A_CHAOTIC, PM_HUMAN_WEREWOLF, NON_PM, 1000L ), /* * 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 ), #ifdef BLACKMARKET A("Thiefbane", LONG_SWORD, (SPFX_NOGEN|SPFX_RESTR|SPFX_BEHEAD|SPFX_DCLAS|SPFX_DRLI), 0, S_HUMAN, DRLI(5,1), NO_DFNS, NO_CARY, 0, A_CHAOTIC, NON_PM, NON_PM, 1500L ), #endif /* BLACKMARKET */ A("Deathsword", TWO_HANDED_SWORD, (SPFX_RESTR|SPFX_DFLAG2), 0, M2_HUMAN, PHYS(5,14), NO_DFNS, NO_CARY, 0, A_CHAOTIC, PM_BARBARIAN, NON_PM, 5000L ), A("Bat from Hell", BASEBALL_BAT, (SPFX_RESTR), 0, 0, PHYS(3,20), NO_DFNS, NO_CARY, 0, A_CHAOTIC, PM_ROGUE, NON_PM, 5000L ), A("Elfrist", ORCISH_SPEAR, SPFX_DFLAG2, 0, M2_ELF, PHYS(5,15), NO_DFNS, NO_CARY, 0, A_CHAOTIC, PM_HUMAN_WEREWOLF, PM_ORC, 300L ), A("Plague", DARK_ELVEN_BOW, /* KMH */ (SPFX_RESTR|SPFX_DEFN), 0, 0, PHYS(5,7), DFNS(AD_DRST), NO_CARY, 0, A_CHAOTIC, PM_DROW, NON_PM, 6000L ), /* Auto-poison code in dothrow.c */ A("Hellfire", CROSSBOW, /* WAC */ (SPFX_RESTR|SPFX_DEFN), 0, 0, PHYS(5,7), FIRE(0,0), NO_CARY, 0, A_CHAOTIC, NON_PM, NON_PM, 4000L ), /* Auto-explode code in dothrow.c, uhitm.c */ #ifdef P_SPOON A("Houchou", SPOON, (SPFX_RESTR), 0, 0, NO_ATTK, NO_DFNS, NO_CARY, 0, A_CHAOTIC, NON_PM, NON_PM, 50000L ), #endif /*** Special Artifacts ***/ # ifdef WALLET_O_P /* KMH -- made it a bag of holding */ A("Wallet of Perseus", BAG_OF_HOLDING, (SPFX_RESTR), 0, 0, NO_ATTK, NO_DFNS, NO_CARY, 0, A_NONE, NON_PM, NON_PM, 10000L ), # endif /* WALLET_O_P */ A("Nighthorn", UNICORN_HORN, (SPFX_NOGEN|SPFX_RESTR|SPFX_REFLECT), 0, 0, NO_ATTK, NO_DFNS, NO_CARY, 0, A_LAWFUL, NON_PM, NON_PM, 10000L ), A("The Key of Law", SKELETON_KEY, (SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL), 0, 0, NO_ATTK, NO_DFNS, NO_CARY, 0, A_LAWFUL, NON_PM, NON_PM, 1000L ), A("The Eye of the Beholder", EYEBALL, (SPFX_NOGEN|SPFX_RESTR), 0, 0, NO_ATTK, NO_DFNS, NO_CARY, DEATH_GAZE, A_NEUTRAL, NON_PM, NON_PM, 500L ), A("The Key of Neutrality", SKELETON_KEY, (SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL), 0, 0, NO_ATTK, NO_DFNS, NO_CARY, 0, A_NEUTRAL, NON_PM, NON_PM, 1000L ), A("The Hand of Vecna", SEVERED_HAND, (SPFX_NOGEN|SPFX_RESTR), (SPFX_REGEN|SPFX_HPHDAM), 0, NO_ATTK, DRLI(0,0), CARY(AD_COLD), SUMMON_UNDEAD, A_CHAOTIC, NON_PM, NON_PM, 700L ), A("The Key of Chaos", SKELETON_KEY, (SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL), 0, 0, NO_ATTK, NO_DFNS, NO_CARY, 0, A_CHAOTIC, NON_PM, NON_PM, 1000L ), /*** The artifacts for the quest dungeon, all self-willed ***/ 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(3,5), 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 /* STEPHEN WHITE'S NEW CODE */ A("The Candle of Eternal Flame", MAGIC_CANDLE, (SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL), (SPFX_WARN|SPFX_TCTRL), 0, NO_ATTK, NO_DFNS, CARY(AD_COLD), SUMMON_FIRE_ELEMENTAL, A_NEUTRAL, PM_FLAME_MAGE, NON_PM, 50000L ), A("The Staff of Aesculapius", QUARTERSTAFF, (SPFX_NOGEN|SPFX_RESTR|SPFX_ATTK|SPFX_INTEL|SPFX_DRLI|SPFX_REGEN), 0,0, DRLI(3,0), NO_DFNS, NO_CARY, HEALING, A_NEUTRAL, PM_HEALER, NON_PM, 5000L ), /* STEPHEN WHITE'S NEW CODE */ A("The Storm Whistle", MAGIC_WHISTLE, (SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL), (SPFX_WARN|SPFX_TCTRL), 0, NO_ATTK, NO_DFNS, CARY(AD_FIRE), SUMMON_WATER_ELEMENTAL, A_LAWFUL, PM_ICE_MAGE, NON_PM, 1000L ), 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 Great Dagger of Glaurgnaa", GREAT_DAGGER, (SPFX_NOGEN|SPFX_RESTR|SPFX_ATTK|SPFX_INTEL|SPFX_DRLI|SPFX_DALIGN), 0, 0, DRLI(8,4), NO_DFNS, CARY(AD_MAGM), ENERGY_BOOST, A_CHAOTIC, PM_NECROMANCER, NON_PM, 50000L ), A("The Mitre of Holiness", HELM_OF_BRILLIANCE, (SPFX_NOGEN|SPFX_RESTR|SPFX_DCLAS|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, NO_ATTK, 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 /* KMH -- More effective against normal monsters * Was +10 to-hit, +d20 damage only versus vampires */ A("The Stake of Van Helsing", WOODEN_STAKE, (SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL), 0, 0, PHYS(5,12), NO_DFNS, CARY(AD_MAGM), 0, A_LAWFUL, PM_UNDEAD_SLAYER, NON_PM, 5000L ), 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 ), #ifdef YEOMAN A("The Crown of Saint Edward", HELM_OF_TELEPATHY, (SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL), (SPFX_HSPDAM), 0, NO_ATTK, NO_DFNS, CARY(AD_MAGM), 0, A_LAWFUL, PM_YEOMAN, NON_PM, 5000L ), #endif /* * 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[]) */ #undef A #ifndef MAKEDEFS_C #undef NO_ATTK #undef NO_DFNS #undef DFNS #undef PHYS #undef DRLI #undef COLD #undef FIRE #undef ELEC #undef STUN #endif /*artilist.h*/ slashem-0.0.7E7F3/include/winGL.h0000664000076400007640000010305310545462317014472 0ustar aliali/* Copyright (C) 2002 Andrew Apted */ /* NetHack may be freely redistributed. See license for details. */ /* * SDL/GL window port for NetHack & Slash'EM. * * This file contains the common definitions. */ #ifndef WINGL_H #define WINGL_H #ifdef GL_GRAPHICS extern struct window_procs sdlgl_hardw_procs; #endif #ifdef SDL_GRAPHICS extern struct window_procs sdlgl_softw_procs; #endif extern void FDECL(Sdlgl_parse_options, (char *, int, int)); #ifdef VANILLA_GLHACK #define GLHACK_VER_HEX 0x110 #define GLHACK_VER_STR "1.1" #define SDLGL_PROGRAM "glHack" #define SDLGL_ICON "glHack" #define SDLGL_ENV_VAR "GLHACKOPTIONS" #else #define SDLGL_PROGRAM "Slash'EM SDL/GL" #define SDLGL_ICON "Slash'EM" #define SDLGL_ENV_VAR "SLASHEMGLOPTIONS" #endif /* ------------ internal definitions from here on ---------- */ #ifdef WINGL_INTERNAL /* sanity check the defines */ #ifndef USE_TILES #error USE_TILES not defined #endif #ifndef CLIPPING #error CLIPPING not defined #endif #ifdef CHANGE_COLOR #error CHANGE_COLOR defined #endif #ifdef OVERLAY #error OVERLAY defined #endif #ifdef MICRO #error MICRO defined #endif /* N.H uses compress/uncompress, conflicting with ZLIB headers */ #undef compress #undef uncompress /* certain N.H #defines conflict with the SDL header files */ #undef red #undef green #undef blue /* From tile.c */ extern short glyph2tile[]; /* extra includes we need */ #include #include #include #ifdef GL_GRAPHICS #include #else typedef unsigned int GLuint; #endif #define E extern /* inlining */ #ifdef GH_INLINE /* keep current definition (from Makefile) */ #elif defined(__GNUC__) #define GH_INLINE __inline__ #elif defined(_MSC_VER) #define GH_INLINE __inline #else #define GH_INLINE /* nothing */ #endif /* character munging macros for CTRL and ALT/META */ #ifndef C #define C(c) (0x1f & (c)) #endif #ifndef M #define M(c) (0x80 | (c)) #endif /* * GL_MAIN */ extern int sdlgl_initialized; extern int sdlgl_software; extern SDL_Surface *sdlgl_surf; struct MenuItem { /* link in list */ struct MenuItem *next; /* stuff given by add_menu(). The string is copied */ int glyph; anything identifier; char accelerator; char groupacc; int attr; char *str; /* whether or not this item is selected. When 0, the `count' field * will be ignored. */ int selected; /* count given by user. -1 when no count given */ int count; }; struct TextItem { /* link in list */ struct TextItem *next; /* stuff given by putstr(). The string is copied */ int attr; char *str; /* alignment position (used for reformatting) */ int align; }; #define POSKEY_ALLOW_REPEAT 0x0001 #define POSKEY_DO_SCROLLBACK 0x0002 /* Note: routines that are in the interface table (sdlgl_procs) begin * with a capital `S'. Everything else has a lowercase `s'. */ E void FDECL(Sdlgl_init_nhwindows, (int *, char **)); E void NDECL(Sdlgl_get_nh_event) ; E void FDECL(Sdlgl_exit_nhwindows, (const char *)); E void FDECL(Sdlgl_suspend_nhwindows, (const char *)); E void NDECL(Sdlgl_resume_nhwindows); E void NDECL(Sdlgl_update_inventory); E void NDECL(Sdlgl_mark_synch); E void NDECL(Sdlgl_wait_synch); E void FDECL(Sdlgl_raw_print, (const char *)); E void FDECL(Sdlgl_raw_print_bold, (const char *)); E int NDECL(Sdlgl_nhgetch); E int FDECL(Sdlgl_nh_poskey, (int *, int *, int *)); E void NDECL(Sdlgl_nhbell); E void FDECL(Sdlgl_number_pad, (int)); E void NDECL(Sdlgl_delay_output); E void VDECL(sdlgl_warning, (const char *, ...)) PRINTF_F(1,2); E void VDECL(sdlgl_error, (const char *, ...)) PRINTF_F(1,2); E void VDECL(sdlgl_hangup, (const char *, ...)) PRINTF_F(1,2); E void FDECL(sdlgl_sleep, (int)); E int NDECL(sdlgl_get_time); E int FDECL(sdlgl_get_poskey, (int, int *, int *, int *)); E int FDECL(sdlgl_get_key, (int)); /* * GL_OPT */ #define DEF_SDLGL_WIDTH 800 #define DEF_SDLGL_HEIGHT 600 #define DEF_SDLGL_DEPTH 16 #define MIN_SDLGL_WIDTH 640 #define MIN_SDLGL_HEIGHT 400 #define MAX_SDLGL_WIDTH 2048 #define MAX_SDLGL_HEIGHT 1536 extern int sdlgl_width; extern int sdlgl_height; extern int sdlgl_depth; #define DEF_SDLGL_WINDOWED 0 #define DEF_SDLGL_JAILSIZE 35 #define DEF_SDLGL_KEYREPEAT 2 /* always */ #define DEF_SDLGL_PREVSTEP 1 #define MAX_SDLGL_PREVSTEP 20 #define DEF_TILE_HEIGHT 32 #define DEF_FONTSIZ_MAP 14 #define DEF_FONTSIZ_TEXT 20 #define DEF_VARY_MSGCOUNT 3 #define DEF_SCROLL_MARGIN 3 /* sdlgl_def_zoom can take on this value (text-mode view) */ #define TEXT_ZOOM -1 extern int sdlgl_windowed; extern int sdlgl_jail_size; extern int sdlgl_def_zoom; extern int sdlgl_key_repeat; extern int sdlgl_alt_prev; extern int sdlgl_prev_step; extern int sdlgl_msg_dim; extern int sdlgl_reformat; extern int sdlgl_shrink_wrap; extern int sdlgl_flipping; extern int sdlgl_jump_scroll; extern int sdlgl_invis_fx; extern int sdlgl_gamma; E void FDECL(sdlgl_parse_cmdline_options, (int *, char **)); E void NDECL(sdlgl_validate_wincap_options); E void NDECL(sdlgl_validate_gl_options); E void FDECL(Sdlgl_preference_update, (const char *)); /* * GL_CONF */ /* (nothing here yet) */ /* * GL_ROLE */ E void NDECL(Sdlgl_player_selection); /* * GL_UNIT */ extern int sdlgl_tex_max; typedef unsigned int rgbcol_t; #define RGB_MAKE(r,g,b) (((r) << 16) + ((g) << 8) + (b)) #define RGB_RED(rgb) ((rgb >> 16) & 0xFF) #define RGB_GRN(rgb) ((rgb >> 8) & 0xFF) #define RGB_BLU(rgb) ((rgb ) & 0xFF) struct GraphicUnit { /* texture used */ GLuint tex_id; /* texture coords */ float tx1, ty1, tx2, ty2; /* screen coordinates */ short x, y, w, h; /* rendering pass (lower ones are drawn first) */ short pass; /* image color */ rgbcol_t color; /* translucency, range is 0.0 - 1.0 */ float trans; }; E void NDECL(sdlgl_unit_startup); E void NDECL(sdlgl_unit_shutdown); E void FDECL(sdlgl_begin_units, (int, int)); E void FDECL(sdlgl_add_unit, (GLuint,float,float,float,float, short,short,short,short,short,rgbcol_t,float)); E void NDECL(sdlgl_finish_units); E void FDECL(sdlgl_hw_make_screenshot, (const char *)); /* * GL_TILE */ typedef unsigned short tileidx_t; typedef unsigned short tilecol_t; typedef unsigned short tileflags_t; #define TILE_EMPTY 0x7FFF #define TILE_F_FLIPX 0x0001 /* horizontally flip the fg */ #define TILE_F_TRANS50 0x0010 /* draw fg 50% translucent */ struct TilePair { /* What tiles to draw at each location. Any of these can be * TILE_EMPTY. BG contains the actual background (usually a floor, * maybe water). MG is for dungeon parts (walls, stairs, sinks, * traps, and so forth). FG contains everything else: objects, * monsters, zaps and swallows. */ tileidx_t fg; tileidx_t mg; /* mid-ground */ union { tilecol_t col; tileidx_t bg; } u; tileflags_t flags; }; struct FontCache; struct TileSet { /* total number of tiles in the set */ int tile_num; /* size of each tile */ int tile_w, tile_h; /* overlap size. Only non-zero for the pseudo 3D tileset. lap_skew * is the difference (of horizontal pixels) between to rows. */ int lap_w, lap_h; int lap_skew; /* number of tiles horizontal/vertical that fit in each 256x256 * image (or whatever size the 3D card supports). Tiles are packed * from left->right, bottom->top. For software mode, the tiles are * all packed in a single surface. */ int pack_w, pack_h; /* number of 256x256 images */ int tex_num; /* the GL texture ids. Unused in software mode */ GLuint *tex_ids; /* for GL, the size of all textures in the array. Usually these * will be the same as sdlgl_tex_max, but when sdlgl_tex_max is high * (like 1024) and the tileset is small (like the fonts), then the * size can be reduced to save memory. */ int tex_size_w, tex_size_h; /* which tiles have alpha parts. Valid for both GL and software * rendering. */ unsigned char *has_alpha; /* for Software mode, this surface contains the tiles. When using * large tilesets (32x32 and 48x64), surf_small contains the * shrunk-down version (otherwise it is NULL). */ SDL_Surface *surf; SDL_Surface *surf_small; /* when using the Isometric tileset in software mode, these contain * some extra tiles to draw the map borders. (Needed since the * dirty matrix code doesn't support drawing diagonal lines). */ SDL_Surface *borders; SDL_Surface *borders_small; /* fonts are normally bright white. For software mode, we need to * colorise them, and this is done by the font cache. This is * unused in GL mode. */ struct FontCache *font_cache; }; struct ExtraShape { /* type of extra shape */ enum ShapeType { SHAPE_None = 0, SHAPE_Heart, SHAPE_Ridden } type; /* position of shape, in terms of whole tiles */ short x, y; /* type-dependent parameters. * For SHAPE_Heart and SHAPE_Ridden, par1 means "on_left". */ int par1, par2; }; struct TileWindow { /* types of tiles drawn in this window */ struct TileSet *set; /* width and height of this window (in tiles). Can be larger than * the screen. */ int total_w, total_h; /* on-screen position of window (in pixels). All values are 0 when * the window is unmapped. Mapped windows are drawn in order of * their depth value (lower depths are drawn first). */ int scr_x, scr_y, scr_w, scr_h, scr_depth; /* private field -- index of window in mapped array */ int mapped_idx; /* text window ? */ int is_text; /* this is the map window ? */ int is_map; /* does the window have see-through parts ? This is normally false. * Only used for text on the tombstone currently. When true, lower * windows don't get clipped against this one, and _no_ background * is drawn. */ int see_through; /* for see-through windows, whether to blend in the text (needed for * the RIP image). */ int is_blended; /* background color. When the tiles don't take up all of the * window's area, this color fills in the unused portions. Also * used for text background. */ rgbcol_t background; /* used for panning. The values represent an offset (in screen * pixels) into the array. Larger pan_x values shift the tiles * further left. Larger pan_y values shift the tiles further * downwards. (negative values are useful too). */ int pan_x, pan_y; /* used for zooming. The values represent the displayed size of * each tile (in screen pixels). For NHW_MAP windows using the * pseudo 3D tileset, scale_w/h *ignore* the overlap portion of the * tiles (i.e. they give the stepping distance), and scale_full_w/h * give the size of the full tile. For all tilesets except the * pseudo 3D one, the full_* values equal the plain values. */ int scale_w, scale_h; int scale_full_w, scale_full_h; int scale_skew; /* the position (in terms of tiles) where to draw a cursor. * Negative values mean that no cursor should be drawn. */ int curs_x, curs_y, curs_w; /* cursor type: 1 for block, 0 for outline */ int curs_block; /* cursor color */ rgbcol_t curs_color; /* the array of tile indexes. Order is left->right, bottom->top. * For text windows, the values are characters (the charset is IBM * cp437, i.e. standard CGA/VGA), and the color field is used. For * the MAP window, the `bg' field in the TilePair is used as the * background tile. * * The color field contains the foreground in the least significant * 8 bits, background in the most significant 8 bits. Both are * indices into sdlgl_text_colors[]. NOTE: background color not * actually used yet (if ever). */ struct TilePair *tiles; /* set of extra shapes to draw */ struct ExtraShape *extra_shapes; int extra_max; int extra_num; /* used for the map window to draw a border around it */ int has_border; }; extern struct TileSet *sdlgl_tiles; E void NDECL(sdlgl_tile_startup); E void NDECL(sdlgl_tile_shutdown); E void NDECL(sdlgl_tile_load_rest); E void NDECL(sdlgl_start_logo); E int NDECL(sdlgl_iterate_logo); E int FDECL(sdlgl_display_RIP, (int)); E void NDECL(sdlgl_dismiss_RIP); E struct TileWindow *FDECL(sdlgl_new_tilewin, (struct TileSet *, int, int, int, int)); E void FDECL(sdlgl_map_tilewin, (struct TileWindow *, int, int, int, int, int)); E void FDECL(sdlgl_unmap_tilewin, (struct TileWindow *)); E void FDECL(sdlgl_free_tilewin, (struct TileWindow *)); E void FDECL(sdlgl_change_tileset, (struct TileWindow *, struct TileSet *, int)); E void NDECL(sdlgl_flush); E void FDECL(sdlgl_add_extrashape, (struct TileWindow *, enum ShapeType, short, short, int, int)); E void FDECL(sdlgl_remove_extrashapes, (struct TileWindow *, short, short)); E int FDECL(sdlgl_test_tile_visible, (int, int, int, int, int)); E void FDECL(sdlgl_set_start_depth, (int)); E void FDECL(sdlgl_store_char, (struct TileWindow *, int, int, char, rgbcol_t)); E int FDECL(sdlgl_store_str, (struct TileWindow *, int, int, const char *, int, rgbcol_t)); E void FDECL(sdlgl_store_tile, (struct TileWindow *, int, int, tileidx_t, tileidx_t, tileidx_t, tileflags_t)); E void FDECL(sdlgl_blank_area, (struct TileWindow *, int, int, int, int)); E void FDECL(sdlgl_copy_area, (struct TileWindow *, int, int, int, int, int, int)); E void FDECL(sdlgl_transfer_area, (struct TileWindow *, int, int, int, int, struct TileWindow *, int, int)); E void FDECL(sdlgl_transfer_line, (struct TileWindow *, int, int, int, struct TilePair *, int)); E void FDECL(sdlgl_set_scale, (struct TileWindow *, int)); E void FDECL(sdlgl_set_cursor, (struct TileWindow *, int, int, int)); /* * GL_IMAGE */ extern unsigned char pet_mark_bits[8]; extern unsigned char ridden_mark_bits[8]; extern char tile_16_face_dirs[1000]; extern char tile_32_face_dirs[1000]; extern SDL_Cursor *sdlgl_cursor_main; extern SDL_Cursor *sdlgl_cursor_left; extern SDL_Cursor *sdlgl_cursor_right; extern SDL_Cursor *sdlgl_cursor_up; extern SDL_Cursor *sdlgl_cursor_down; extern SDL_Cursor *sdlgl_cursor_hand; extern SDL_Cursor *sdlgl_cursor_cross; extern unsigned char sdlgl_gamma_table[256]; #define GAMMA(n) (sdlgl_gamma_table[n]) #define GAMMA_F(n) ((float)GAMMA(n) / 255.0) E int FDECL(sdlgl_quantize_tile_size, (int)); E int FDECL(sdlgl_mon_tile_face_dir, (tileidx_t)); E void NDECL(sdlgl_generate_gamma_table); E void NDECL(sdlgl_init_mouse_cursors); E void NDECL(sdlgl_free_mouse_cursors); E void FDECL(sdlgl_load_face_dirs, (const char *, char *)); E unsigned char * FDECL(sdlgl_load_png_file, (const char*, int*, int*)); E int FDECL(sdlgl_save_ppm_file, (const char *, const unsigned char *, int, int)); /* * GL_FONT */ #define CHAR_2_TILE(ch) ((tileidx_t)(unsigned char)(ch)) #define TILE_2_CHAR(t) ((unsigned char)(t)) #define TXT_MAKE(r,g,b) ((r)*25 + (g)*5 + (b)) #define TXT_GET_R(txt) (((txt) / 25) % 5) #define TXT_GET_G(txt) (((txt) / 5) % 5) #define TXT_GET_B(txt) (((txt) ) % 5) #define BLACK TXT_MAKE(0,0,0) #define D_GREY TXT_MAKE(1,1,1) #define GREY TXT_MAKE(2,2,2) #define L_GREY TXT_MAKE(3,3,3) #define WHITE TXT_MAKE(4,4,4) #define RED TXT_MAKE(3,0,0) #define BROWN TXT_MAKE(3,2,0) #define GREEN TXT_MAKE(0,3,0) #define CYAN TXT_MAKE(0,3,3) #define BLUE TXT_MAKE(0,0,3) #define MAGENTA TXT_MAKE(3,0,3) #define B_RED TXT_MAKE(4,0,0) #define B_YELLOW TXT_MAKE(4,4,0) #define B_ORANGE TXT_MAKE(4,3,0) #define B_GREEN TXT_MAKE(0,4,0) #define B_CYAN TXT_MAKE(0,4,4) #define B_BLUE TXT_MAKE(0,0,4) #define B_MAGENTA TXT_MAKE(4,0,4) #define TILECOL_UNUSED 0x7EEE struct FontCache { /* cache size (total number of characters on surface) */ int char_num; SDL_Surface *char_surf; /* how the characters are packed in the surface */ int pack_w, pack_h; /* what color each character in the cache currently is. Initially * all values are TILECOL_UNUSED. */ tilecol_t *what_cols; }; #define FONTCACHE_SIZE 512 #define FONTCACHE_PACK_W 32 /* this hash function has been carefully chosen so that the two most * used colors (L_GREY and GREY) have no collisions. */ #define FONTCACHE_HASH(ch,col) (int) \ (TXT_GET_R(col) * 41 + TXT_GET_G(col) * 31 + \ TXT_GET_B(col) * 23 + 2 * (unsigned int) ch) extern tilecol_t termcolor_to_tilecol[CLR_MAX]; /* colors used for text. Index 0 guaranteed to be black */ extern rgbcol_t sdlgl_text_colors[256]; extern struct TileSet *sdlgl_font_8; /* 8x8 (rip) font */ extern struct TileSet *sdlgl_font_map; extern struct TileSet *sdlgl_font_text; extern struct TileSet *sdlgl_font_menu; extern struct TileSet *sdlgl_font_message; extern struct TileSet *sdlgl_font_status; E void NDECL(sdlgl_font_startup); E void NDECL(sdlgl_font_shutdown); E int FDECL(sdlgl_quantize_font, (int)); E struct TileSet *FDECL(sdlgl_next_narrower_font, (int)); /* * GL_HARDW / GL_SOFTW * * (Rendering API) */ struct rendering_procs { void NDECL((*rend_startup)); void NDECL((*rend_shutdown)); struct TileSet *FDECL((*load_tileset), (const char *, int, int, int, int, int *, int *)); void FDECL((*free_tileset), (struct TileSet *)); void NDECL((*create_extra_graphics)); void NDECL((*free_extra_shapes)); void FDECL((*enable_clipper), (int, int, int, int)); void NDECL((*disable_clipper)); void NDECL((*blit_frame)); void FDECL((*draw_background), (int, int, int, int, rgbcol_t, int, int)); void FDECL((*draw_extra_shape), (struct TileWindow *, struct ExtraShape *)); void FDECL((*draw_cursor), (struct TileWindow *)); void FDECL((*begin_tile_draw), (int, int)); void FDECL((*draw_tile), (struct TileWindow *, int, int, int, int, tileidx_t, tilecol_t, tileflags_t, short)); void NDECL((*finish_tile_draw)); void FDECL((*draw_border), (struct TileWindow *, rgbcol_t)); void FDECL((*start_fading), (int, int)); void FDECL((*draw_fading), (float)); void NDECL((*finish_fading)); void FDECL((*make_screenshot), (const char *)); void FDECL((*set_pan), (struct TileWindow *, int, int)); void FDECL((*set_new_pos), (struct TileWindow *, int, int, int, int)); void FDECL((*mark_dirty), (int, int, int, int, int)); }; extern struct rendering_procs sdlgl_rend_procs; #ifdef GL_GRAPHICS extern struct rendering_procs sdlgl_hardw_rend_procs; #endif #ifdef SDL_GRAPHICS extern struct rendering_procs sdlgl_softw_rend_procs; #endif #define sdlgl_rend_startup (*sdlgl_rend_procs.rend_startup) #define sdlgl_rend_shutdown (*sdlgl_rend_procs.rend_shutdown) #define sdlgl_load_tileset (*sdlgl_rend_procs.load_tileset) #define sdlgl_free_tileset (*sdlgl_rend_procs.free_tileset) #define sdlgl_create_extra_graphics (*sdlgl_rend_procs.create_extra_graphics) #define sdlgl_free_extra_shapes (*sdlgl_rend_procs.free_extra_shapes) #define sdlgl_enable_clipper (*sdlgl_rend_procs.enable_clipper) #define sdlgl_disable_clipper (*sdlgl_rend_procs.disable_clipper) #define sdlgl_blit_frame (*sdlgl_rend_procs.blit_frame) #define sdlgl_draw_background (*sdlgl_rend_procs.draw_background) #define sdlgl_draw_extra_shape (*sdlgl_rend_procs.draw_extra_shape) #define sdlgl_draw_cursor (*sdlgl_rend_procs.draw_cursor) #define sdlgl_begin_tile_draw (*sdlgl_rend_procs.begin_tile_draw) #define sdlgl_draw_tile (*sdlgl_rend_procs.draw_tile) #define sdlgl_finish_tile_draw (*sdlgl_rend_procs.finish_tile_draw) #define sdlgl_draw_border (*sdlgl_rend_procs.draw_border) #define sdlgl_start_fading (*sdlgl_rend_procs.start_fading) #define sdlgl_draw_fading (*sdlgl_rend_procs.draw_fading) #define sdlgl_finish_fading (*sdlgl_rend_procs.finish_fading) #define sdlgl_make_screenshot (*sdlgl_rend_procs.make_screenshot) #define sdlgl_set_pan (*sdlgl_rend_procs.set_pan) #define sdlgl_set_new_pos (*sdlgl_rend_procs.set_new_pos) #define sdlgl_mark_dirty (*sdlgl_rend_procs.mark_dirty) #ifdef GL_GRAPHICS E GLuint FDECL(sdlgl_send_graphic_RGBA, (unsigned char *, int, int)); #endif /* * GL_RENDU */ #define TRANS_PIX 255 /* 8 bit transparent pixel */ extern rgbcol_t sdlgl_palette[256]; #define DIRTY_SIZE 64 #define CLEAN_CELL 0x7F struct DirtyMatrix { /* pixel size that matrix covers (screen size) */ int pw, ph; /* matrix size (in cells), enough to cover the screen */ int cw, ch; /* cell matrix. Each cell is either CLEAN_CELL, or the depth of the * window that became dirty somewhere inside the cell. If multiple * windows get dirty in the same cell, the *lowest* depth is * remembered. * * Note: using a high value of CLEAN_CELL is a nice trick, * simplifying the marking and testing code. */ unsigned char *cells; /* rectangles used to update screen. Worst case scenario is * slightly over half the total number of cells. */ int max_rects; SDL_Rect *updaters; }; E void FDECL(sdlgl_set_surface_colors, (SDL_Surface *)); E SDL_Surface *FDECL(sdlgl_RGBA_to_truecolor, (unsigned char *, int, int)); E SDL_Surface *FDECL(sdlgl_RGBA_to_palettised, (unsigned char *, int, int)); E SDL_Surface *FDECL(sdlgl_shrink_surface, (SDL_Surface *)); E void FDECL(sdlgl_sw_create_has_alpha, (struct TileSet *)); E void FDECL(sdlgl_create_font_cache, (struct TileSet *)); E void FDECL(sdlgl_free_font_cache, (struct TileSet *)); E void FDECL(sdlgl_font_cache_lookup, (struct TileSet *, tileidx_t, tilecol_t, int *, int *)); E struct DirtyMatrix *FDECL(sdlgl_create_dirty_matrix, (int, int)); E void FDECL(sdlgl_free_dirty_matrix, (struct DirtyMatrix *)); E void FDECL(sdlgl_dirty_matrix_clear, (struct DirtyMatrix *)); E void FDECL(sdlgl_dirty_matrix_add, (struct DirtyMatrix *, int, int, int, int, int)); E int FDECL(sdlgl_dirty_matrix_test, (struct DirtyMatrix *, int, int, int, int, int)); E int FDECL(sdlgl_dirty_matrix_to_updaters, (struct DirtyMatrix *)); E void FDECL(sdlgl_dirty_matrix_blit, (struct DirtyMatrix *, SDL_Surface *, SDL_Rect *, SDL_Rect *, Uint32, int)); /* * GL_WIN */ #define MAXWIN 20 /* active NHW_TEXT/NHW_MENU window, otherwise WIN_ERR */ extern int sdlgl_top_win; /* active NHW_MAP window, otherwise WIN_ERR */ extern int sdlgl_map_win; #define MIN_MESSAGE 2 #define MAX_MESSAGE 8 #define MIN_HISTORY 10 #define MAX_HISTORY 200 /* max history saved on message window */ typedef unsigned short glyphidx_t; struct GlyphPair { /* background and foreground glyphs. One or both may be NO_GLYPH. * FG is only for objects/monsters/etc, and BG is only for dungeon * glyphs (CMAP). */ glyphidx_t bg, fg; }; #define MENU_NONE_COL RGB_MAKE(48, 48, 48) #define MENU_ONE_COL RGB_MAKE(16, 32, 48) #define MENU_ANY_COL RGB_MAKE(0, 0, 48) #define TEXT_BACK_COL RGB_MAKE(0, 0, 48) #define PREV_BACK_COL RGB_MAKE(48, 24, 0) #define BORDER_COL RGB_MAKE(0, 0, 96) #define CURSOR_COL RGB_MAKE(192, 0, 0) #define OUTLINE_COL RGB_MAKE(255, 255, 255) struct MouseLocation { /* what the action should be at the current location. This also * indicates what the mouse cursor should look like. When the mouse * is outside the window (or when focus has been lost), then the * MACT_AWAY value is used. */ enum MouseLocAction { MACT_NORMAL = 0, MACT_AWAY, MACT_UP, MACT_DOWN, MACT_LEFT, MACT_RIGHT, MACT_HAND, MACT_CROSS } action; /* pixel position of mouse cursor. The coordinates are GL style * (i.e. y goes from the bottom up). */ int x, y; /* the window that the mouse pointer is currently over. Will be * WIN_ERR when not sitting over any window, e.g. a gap, or when the * focus has been lost. */ int window; }; extern struct MouseLocation sdlgl_mouseloc; struct TextWindow { /* type (one of NHW_XXX) */ int type; /* for NHW_MENU types: whether this window is being used as an * actual menu or just for text. Will be -1 until the * distinguishing call (start_menu | putstr) has been made. */ int is_menu; /* is this window (NHW_TEXT type) used for the RIP message ? */ int is_rip; int how_died; /* linked list of menu items. Only valid when is_menu == 1. Note * that this list goes upwards from the bottom of the window (not * top-down, as you might expect). */ struct MenuItem *items; /* linked list of text items. Only valid when type is NHW_TEXT, or * NHW_MENU and is_menu == 0. This one also goes upwards. */ struct TextItem *lines; /* computed width & height of the menu or text window. For menus * (is_menu == 1), it's only valid after the end_menu() interface * routine has been called. For text items, it is computed when * displayed. */ int calc_w, calc_h; /* for menu/text windows, the number of tiles that completely fit on * the screen at any one time. For small windows, this'll be the * same as calc_w/h. Also valid for NHW_MESSAGE/STATUS windows. */ int show_w, show_h; /* based on a tile window. This is NULL while the window is * unmapped (i.e. display_nhwindow hasn't been called). */ struct TileWindow *base; /* only valid for NHW_MAP windows, and then only when mapped. * Stores a record of all the glyphs on the map. The size is * exactly the same as in the `base' field. */ struct GlyphPair *glyphs; /* tile coordinates for the "focus", which (for NHW_MAP windows) is * the tile that controls where the jail is (usually the focus is * where the player tile is). * * For other window types, this is the tile to show at the bottom * left corner of the window. */ int focus_x, focus_y; /* panning values for NHW_MAP windows. Remembers the pan state of * graphical tiles when the text-mode view is active. */ int map_px, map_py; /* the JAIL... This is an rectangular area that is meant to be kept * at the middle of the screen. The player can move freely within * the jail without the map window panning -- when the player moves * outside of the jail, the map window will usually pan. * * The jail is mostly implicit (size calc'd from sdlgl_jail_size). * Here is the offset (in pixels) from center of screen to jail's * center. The jail is allowed to be uncentered on the screen, * though it should auto-correct itself, i.e. move closer to the * center instead of panning. The jail (in pixel terms) must always * fit on the screen. Hence when jail size is 100%, these offsets * are always zero. * * The jail is not used when in text-mode view (determined by * base->is_text), as we assume the whole map fits on the screen. */ int jail_x, jail_y; /* current zoom factor. Only used with NHW_MAP windows. * The value is the pixel height that the tiles are rendered at, so * higher values mean larger tiles. The allowable sizes depends on * what tileset is being used and whether we are using GL or * Software rendering. Not used when in text-mode view (i.e. * base->is_text is set) as we assume the whole map fits on the * screen. Invariant: zoom_h != TEXT_ZOOM. */ int zoom_h; /* For NHW_MAP windows, this field remembers which direction the * player was travelling in. Used for the tile flipping option. */ int player_dx; int player_dy; /* the current write position (in terms of tiles). Must always be * inside the tile window area. Order same as tiles: left->right, * bottom->top. */ int write_x, write_y; /* whether we show a cursor at the current write position. Also * used for NHW_MAP windows for cursor on player. */ int write_cursor; /* current writing color */ tilecol_t write_col; /* current filling color (for clear_screen, etc) */ tilecol_t fill_col; /* for NHW_MESSAGE windows: number of "fresh" lines, i.e. lines that * have been written onto the message window since clear_nhwindow() * or the last do_more(). Initial state is 0, meaning "blank". * After a [More] it is also 0. As soon as this value becomes the * same as the `show_h' field, that's when we display the more text * and wait for a key. * * Note: Other routines that use the MESSAGE window (e.g. getlin) * should also call sdlgl_more() when this value is non-zero. */ int fresh_lines; /* for NHW_MESSAGE windows: true if the next putstr() should be * placed on a new line, even if it fits on the previous one. */ int want_new_line; /* for NHW_MESSAGE windows: this field is for the scroll-back * capability (^P). The tile window is normally unmapped, silently * recording lines that scroll off the screen (except empty lines). * Clearing the msg window is equivalent to fully scrolling it up. */ struct TileWindow *scrollback; /* when true, scrolled-off lines are copied to the scrollback * buffer. This is disabled when routines that take over the * message window (get_ext_cmd, etc) are active. */ int scrollback_enable; /* this is 0 if the scrollback window is unmapped. This value only * used in the `alt_prev' mode, and signifies how many lines back we * are showing. */ int scrollback_pos; /* number of non-blank lines currently in the scrollback window. * Used to limit the scrollback to readable stuff. */ int scrollback_size; /* for NHW_MESSAGE windows, these fields handle the message_menu() * hack. When dismiss_more is non-zero, it is a character that can * be used to accept the single choice while [MORE] is displayed * (setting the more_ch). */ int dismiss_more; int more_ch; /* for NHW_MESSAGE windows, this will be set when the user pressed * the Escape key to dismiss the more. It should be cleared before * every turn, and when certain interface functions are called * (message_menu, etc). It is used to prevent further [MORE] * prompts (the TTY version also stops further output to the message * window, but I'd prefer to see them). */ int more_escaped; }; extern struct TextWindow *text_wins[MAXWIN]; E winid FDECL(Sdlgl_create_nhwindow, (int)); E void FDECL(Sdlgl_clear_nhwindow, (winid)); E void FDECL(Sdlgl_display_nhwindow, (winid, BOOLEAN_P)); E void FDECL(Sdlgl_dismiss_nhwindow, (winid)); E void FDECL(Sdlgl_destroy_nhwindow, (winid)); E void FDECL(Sdlgl_curs, (winid,int,int)); E void FDECL(Sdlgl_putstr, (winid, int, const char *)); E void FDECL(Sdlgl_outrip, (winid,int)); E int NDECL(Sdlgl_doprev_message); E void NDECL(sdlgl_win_startup); E void NDECL(sdlgl_win_shutdown); E void FDECL(sdlgl_more, (struct TextWindow *)); E void FDECL(sdlgl_adjust_scrollback, (struct TextWindow *, int)); E void NDECL(sdlgl_remove_scrollback); E void FDECL(sdlgl_pan_window, (int, int, int)); E tilecol_t FDECL(sdlgl_attr_to_tilecol, (int attr)); E void FDECL(sdlgl_update_mouse_location, (int)); E int FDECL(sdlgl_internal_key_handler, (SDL_keysym *, int)); E int FDECL(sdlgl_internal_button_handler, (SDL_MouseButtonEvent *)); E void FDECL(sdlgl_internal_motion_handler, (SDL_MouseMotionEvent *)); /* * GL_MENU */ E void FDECL(Sdlgl_start_menu, (winid)); E void FDECL(Sdlgl_add_menu, (winid,int,const ANY_P *, CHAR_P,CHAR_P,int,const char *, BOOLEAN_P)); E void FDECL(Sdlgl_end_menu, (winid, const char *)); E int FDECL(Sdlgl_select_menu, (winid, int, MENU_ITEM_P **)); E char FDECL(Sdlgl_message_menu, (CHAR_P,int,const char *)); E char FDECL(Sdlgl_yn_function, (const char *, const char *, CHAR_P)); E void FDECL(sdlgl_clear_menu_items, (struct TextWindow *)); E int FDECL(sdlgl_process_menu_window, (int, struct TextWindow *, int)); /* * GL_TEXT */ E void FDECL(Sdlgl_display_file, (const char *, BOOLEAN_P)); E void FDECL(sdlgl_clear_text_items, (struct TextWindow *)); E void FDECL(sdlgl_insert_text_item, (struct TextWindow *, struct TextItem *, int, int, const char *)); E void FDECL(sdlgl_process_text_window, (int, struct TextWindow *)); /* * GL_MAP */ #if defined(VANILLA_GLHACK) #define NUM_MON_TILES 393 #else #define NUM_MON_TILES 603 #endif /* extra floor tiles */ #if defined(VANILLA_GLHACK) #define FLOOR_TILES 1057 #else #define FLOOR_TILES 1367 #endif #define Fl_Mine (FLOOR_TILES + 0) #define Fl_Sokoban (FLOOR_TILES + 1) #define Fl_Knox Fl_Sokoban #define Fl_Tower (FLOOR_TILES + 2) #define Fl_Hell (FLOOR_TILES + 3) #define Fl_Quest (FLOOR_TILES + 4) #define Fl_Astral (FLOOR_TILES + 5) #define Fl_Rogue (FLOOR_TILES + 6) #define Fl_Caves Fl_Rogue #define Fl_Beach (FLOOR_TILES + 7) E void FDECL(Sdlgl_cliparound, (int, int)); E void FDECL(Sdlgl_update_positionbar, (char *)); E void FDECL(Sdlgl_print_glyph, (winid,XCHAR_P,XCHAR_P,int)); E void FDECL(sdlgl_create_map, (struct TextWindow *, int, int)); E void FDECL(sdlgl_zoom_map, (int)); E int FDECL(sdlgl_quantize_zoom, (int)); E int NDECL(sdlgl_cursor_visible); E void NDECL(sdlgl_center_screen_on_player); E void NDECL(sdlgl_toggle_text_view); E int FDECL(sdlgl_find_click, (int, int *, int *)); E void FDECL(sdlgl_pan_map_window, (int, int)); /* * GL_EMUL */ E void NDECL(sdlgl_emul_startup); E void NDECL(sdlgl_emul_shutdown); E void NDECL(Sdlgl_start_screen); E void NDECL(Sdlgl_end_screen); E void NDECL(Sdlgl_askname); E void FDECL(Sdlgl_getlin, (const char *,char *)); E int NDECL(Sdlgl_get_ext_cmd); E struct TextWindow *FDECL(sdlgl_new_textwin, (int)); E void FDECL(sdlgl_free_textwin, (struct TextWindow *)); E void FDECL(sdlgl_putc, (struct TextWindow *, int)); E void FDECL(sdlgl_puts, (struct TextWindow *, const char *)); E void FDECL(sdlgl_puts_nolf, (struct TextWindow *, const char *)); E void FDECL(sdlgl_gotoxy, (struct TextWindow *, int, int)); E void FDECL(sdlgl_home, (struct TextWindow *)); E void FDECL(sdlgl_backsp, (struct TextWindow *)); E void FDECL(sdlgl_clear, (struct TextWindow *)); E void FDECL(sdlgl_clear_end, (struct TextWindow *)); E void FDECL(sdlgl_clear_eos, (struct TextWindow *)); E void FDECL(sdlgl_enable_cursor, (struct TextWindow *, int)); /* * GL_STAT */ E void FDECL(sdlgl_write_status, (struct TextWindow *win)); E void FDECL(sdlgl_update_status, (int)); #undef E #endif /* WINGL_INTERNAL */ #endif /* WINGL_H */ /*winGL.c*/ slashem-0.0.7E7F3/include/prxyclnt.h0000664000076400007640000001376010545462317015342 0ustar aliali/* $Id: prxyclnt.h,v 1.11 2004/04/19 06:56:41 j_ali Exp $ */ /* Copyright (c) Slash'EM Development Team 2002-2004 */ /* NetHack may be freely redistributed. See license for details. */ #ifndef PRXYCLNT_H #define PRXYCLNT_H #define PROXY_CLNT_SYNCHRONOUS 1 extern short *proxy_glyph2tile; struct proxy_tilemap_entry { unsigned int tile; unsigned int refs; unsigned int no_descs; char **descs; }; struct proxy_tilemap { unsigned int no_entries; /* One tile may have several entries */ unsigned int no_tiles; unsigned int max_entries; /* No. allocted entries */ struct proxy_tilemap_entry *entries; }; #define PROXY_LEVEL_MAPPING 0 #define PROXY_LEVEL_FLAGS 1 #define PROXY_LEVEL_SUBMAPPING 2 #define PROXY_LEVEL_GLYPH 3 #define PROXY_LEVEL_BASED_MAPPING 4 #define PROXY_LEVEL_BASED_SUBMAPPING 5 #define PROXY_LEVEL_BASED_GLYPH 6 #define PROXY_MAX_NO_LEVELS 7 struct proxy_glyph_mapping { unsigned long rgbsym; int alt_glyph; unsigned int no_descs; const char **descs; }; struct proxy_glyph_map_info { struct proxy_glyph_mapping current; struct proxycb_get_glyph_mapping_res *glyph_map; int mi, smi, gi, bsmi, bgi; const char *descs[PROXY_MAX_NO_LEVELS]; }; struct window_ext_procs { const char *name; int FDECL((*winext_init_nhwindows), (int *, char **, char ***)); int FDECL((*winext_player_selection), (int *, int *, int *, int *)); char *NDECL((*winext_askname)); void NDECL((*winext_get_nh_event)) ; void FDECL((*winext_exit_nhwindows), (const char *)); void FDECL((*winext_suspend_nhwindows), (const char *)); void NDECL((*winext_resume_nhwindows)); int FDECL((*winext_create_nhwindow), (int)); void FDECL((*winext_clear_nhwindow), (int, int, int, int)); void FDECL((*winext_display_nhwindow), (int, BOOLEAN_P)); void FDECL((*winext_destroy_nhwindow), (int)); void FDECL((*winext_curs), (int,int,int)); void FDECL((*winext_putstr), (int, int, const char *)); void FDECL((*winext_display_file), (int)); void FDECL((*winext_start_menu), (int)); void FDECL((*winext_add_menu), (int,int,int, CHAR_P,CHAR_P,int,const char *, BOOLEAN_P)); void FDECL((*winext_end_menu), (int, const char *)); int FDECL((*winext_select_menu), (int, int, struct proxy_mi **)); int FDECL((*winext_message_menu), (int,int,const char *)); void NDECL((*winext_update_inventory)); void NDECL((*winext_mark_synch)); void NDECL((*winext_wait_synch)); void FDECL((*winext_cliparound), (int, int)); void FDECL((*winext_update_positionbar), (char *)); void FDECL((*winext_print_glyph), (int,int,int,int)); void FDECL((*winext_raw_print), (const char *)); void FDECL((*winext_raw_print_bold), (const char *)); int NDECL((*winext_nhgetch)); int FDECL((*winext_nh_poskey), (int *, int *, int *)); void NDECL((*winext_nhbell)); int NDECL((*winext_doprev_message)); char FDECL((*winext_yn_function), (const char *, const char *, CHAR_P, int *)); char *FDECL((*winext_getlin), (const char *)); int NDECL((*winext_get_ext_cmd)); void FDECL((*winext_number_pad), (int)); void NDECL((*winext_delay_output)); void FDECL((*winext_change_color), (int, long, int)); void FDECL((*winext_change_background), (int)); int FDECL((*winext_set_font_name), (int, char *)); char *NDECL((*winext_get_color_string)); void NDECL((*winext_start_screen)); void NDECL((*winext_end_screen)); int FDECL((*winext_outrip), (int, char *)); void FDECL((*winext_preference_update), (const char *, const char *)); void FDECL((*winext_status), (int, int, const char **)); void FDECL((*winext_print_glyph_layered), (int, int, struct proxy_glyph_layer *)); void FDECL((*winext_send_config_file), (int)); }; typedef void FDECL((*proxy_clnt_errhandler), (const char *)); typedef int FDECL((*proxy_clnt_authhandler), (unsigned long)); /* ### proxysvc.c ### */ extern void proxy_svc_set_ext_procs(void (*)(void), struct window_ext_procs *); extern char *win_proxy_clnt_gettag(const char *tag); extern void win_proxy_clnt_set_flags(unsigned long mask, unsigned long value); #ifdef NHXDR_H extern int win_proxy_clnt_log_open(nhext_io_func func, void *handle); extern int win_proxy_clnt_init(nhext_io_func, void *, nhext_io_func, void *); #endif extern int win_proxy_clnt_iteration(void); extern char *win_proxy_clnt_get_failed_packet(int *); extern char *win_proxy_clnt_get_extension(const char *name, const char *min_ver, const char *next_ver, unsigned short *idp); extern proxy_clnt_errhandler proxy_clnt_set_errhandler( proxy_clnt_errhandler new); extern void proxy_clnt_error(const char *fmt, ...); extern proxy_clnt_authhandler proxy_clnt_set_authhandler( proxy_clnt_authhandler new); /* ### prxymap.c ### */ extern struct proxy_glyph_mapping *proxy_glyph_map_first( struct proxy_glyph_map_info *, struct proxycb_get_glyph_mapping_res *); extern struct proxy_glyph_mapping *proxy_glyph_map_next( struct proxy_glyph_map_info *); extern void proxy_glyph_map_close(struct proxy_glyph_map_info *); extern unsigned int proxy_glyph_map_get_length( struct proxycb_get_glyph_mapping_res *); /* ### prxytile.c ### */ extern struct proxy_tilemap *proxy_new_tilemap(void); extern int proxy_load_tilemap_line(struct proxy_tilemap *map, const char *line); extern struct proxy_tilemap *proxy_load_tilemap(int, void (*pulse)(), void *pulse_data); extern void proxy_free_tilemap(struct proxy_tilemap *); extern short * proxy_map_glyph2tile( struct proxycb_get_glyph_mapping_res *glyph_map, struct proxy_tilemap *, void (*pulse)(), void *pulse_data); /* ### prxychar.c ### */ extern long *proxy_map_glyph2char(struct proxycb_get_glyph_mapping_res *); /* ### prxyconn.c ### */ extern void proxy_exit_client_services(void); #ifdef NHXDR_H extern int proxy_init_client_services(nhext_io_func read_f, void *read_h, nhext_io_func write_f, void *write_h); #endif extern void proxy_start_client_services(void); extern int proxy_connect( char *protocol, char *address, int *argcp, char **argv); #endif /* PRXYCLNT_H */ slashem-0.0.7E7F3/include/winX.h0000664000076400007640000003545310545462317014407 0ustar aliali/* SCCS Id: @(#)winX.h 3.4 1996/08/18 */ /* Copyright (c) Dean Luick, 1992 */ /* NetHack may be freely redistributed. See license for details. */ /* * Definitions for the X11 window-port. See doc/window.doc for details on * the window interface. */ #ifndef WINX_H #define WINX_H #ifndef E #define E extern #endif #if defined(BOS) || defined(NHSTDC) #define DIMENSION_P int #else # ifdef WIDENED_PROTOTYPES #define DIMENSION_P unsigned int # else #define DIMENSION_P Dimension # endif #endif /* * Generic text buffer. */ #define START_SIZE 512 /* starting text buffer size */ struct text_buffer { char *text; int text_size; int text_last; int num_lines; }; /* * Information specific to a map window. */ struct text_map_info_t { unsigned char text[ROWNO][COLNO]; /* Actual displayed screen. */ #ifdef TEXTCOLOR unsigned char colors[ROWNO][COLNO]; /* Color of each character. */ GC color_gcs[CLR_MAX], /* GC for each color */ inv_color_gcs[CLR_MAX]; /* GC for each inverse color */ #define copy_gc color_gcs[NO_COLOR] #define inv_copy_gc inv_color_gcs[NO_COLOR] #else GC copy_gc, /* Drawing GC */ inv_copy_gc; /* Inverse drawing GC */ #endif }; struct tile_map_info_t { unsigned short glyphs[ROWNO][COLNO]; /* Saved glyph numbers. */ GC white_gc; GC black_gc; }; struct map_info_t { Dimension viewport_width, /* Saved viewport size, so we can */ viewport_height; /* clip to cursor on a resize. */ unsigned char t_start[ROWNO], /* Starting column for new info. */ t_stop[ROWNO]; /* Ending column for new info. */ int square_width, /* Saved font/tile information so */ square_height, /* we can calculate the correct */ square_ascent, /* placement of changes. */ square_lbearing; boolean is_tile; union { struct text_map_info_t *text_map; struct tile_map_info_t *tile_map; } mtype; }; /* * Information specific to a message window. */ struct line_element { struct line_element *next; char *line; /* char buffer */ int buf_length; /* length of buffer */ int str_length; /* length of string in buffer */ }; struct mesg_info_t { XFontStruct *fs; /* Font for the window. */ int num_lines; /* line count */ struct line_element *head; /* head of circular line queue */ struct line_element *line_here;/* current drawn line position */ struct line_element *last_pause;/* point to the line after the prev */ /* bottom of screen */ struct line_element *last_pause_head;/* pointer to head of previous */ /* turn */ GC gc; /* GC for text drawing */ int char_width, /* Saved font information so we can */ char_height, /* calculate the correct placement */ char_ascent, /* of changes. */ char_lbearing; Dimension viewport_width, /* Saved viewport size, so we can adjust */ viewport_height;/* the slider on a resize. */ Boolean dirty; /* Lines have been added to the window. */ }; /* * Information specific to a "text" status window. */ struct status_info_t { struct text_buffer text; /* Just a text buffer. */ }; /* * Information specific to a menu window. First a structure for each * menu entry, then the structure for each menu window. */ typedef struct x11_mi { struct x11_mi *next; anything identifier; /* Opaque type to identify this selection */ long pick_count; /* specific selection count; -1 if none */ char *str; /* The text of the item. */ int attr; /* Attribute for the line. */ boolean selected; /* Been selected? */ char selector; /* Char used to select this entry. */ char gselector; /* Group selector. */ } x11_menu_item; struct menu { x11_menu_item *base; /* Starting pointer for item list. */ x11_menu_item *last; /* End pointer for item list. */ const char *query; /* Query string. */ const char *gacc; /* Group accelerators. */ int count; /* Number of strings. */ String *list_pointer;/* String list. */ Boolean *sensitive; /* Active list. */ char curr_selector;/* Next keyboard accelerator to assign, */ /* if 0, then we're out. */ }; struct menu_info_t { struct menu curr_menu; /* Menu being displayed. */ struct menu new_menu; /* New menu being built. */ XFontStruct *fs; /* Font for the window. */ long menu_count; /* number entered by user */ Dimension line_height; /* Total height of a line of text. */ Dimension internal_height; /* Internal height between widget & border */ Dimension internal_width; /* Internal width between widget & border */ short how; /* Menu mode PICK_NONE, PICK_ONE, PICK_ANY */ boolean valid_widgets; /* TRUE if widgets have been created. */ boolean is_menu; /* Has been confirmed to being a menu window. */ boolean is_active; /* TRUE when waiting for user input. */ boolean is_up; /* TRUE when window is popped-up. */ boolean cancelled; /* Menu has been explicitly cancelled. */ boolean counting; /* true when menu_count has a valid value */ }; /* * Information specific to a text window. */ struct text_info_t { struct text_buffer text; XFontStruct *fs; /* Font for the text window. */ int max_width; /* Width of widest line so far. */ int extra_width, /* Sum of left and right border widths. */ extra_height; /* Sum of top and bottom border widths. */ boolean blocked; /* */ boolean destroy_on_ack; /* Destroy this window when acknowleged. */ #ifdef GRAPHIC_TOMBSTONE boolean is_rip; /* This window needs a tombstone. */ #endif }; /* * Basic window structure. */ struct xwindow { int type; /* type of nethack window */ Widget popup; /* direct parent of widget w or viewport */ Widget w; /* the widget that does things */ Dimension pixel_width; /* window size, in pixels */ Dimension pixel_height; int prevx, cursx; /* Cursor position, only used by */ int prevy, cursy; /* map and "plain" status windows.*/ union { struct map_info_t *Map_info; /* map window info */ struct mesg_info_t *Mesg_info; /* message window info */ struct status_info_t *Status_info; /* status window info */ struct menu_info_t *Menu_info; /* menu window info */ struct text_info_t *Text_info; /* menu window info */ } Win_info; boolean keep_window; }; /* Defines to use for the window information union. */ #define map_information Win_info.Map_info #define mesg_information Win_info.Mesg_info #define status_information Win_info.Status_info #define menu_information Win_info.Menu_info #define text_information Win_info.Text_info #define MAX_WINDOWS 20 /* max number of open windows */ #define NHW_NONE 0 /* Unallocated window type. Must be */ /* different from any other NHW_* type. */ #define NO_CLICK 0 /* No click occured on the map window. Must */ /* be different than CLICK_1 and CLICK_2. */ #define DEFAULT_MESSAGE_WIDTH 60/* width in chars of the message window */ #define DISPLAY_FILE_SIZE 35 /* Max number of lines in the default */ /* file display window. */ #define MAX_KEY_STRING 64 /* String size for converting a keypress */ /* event into a character(s) */ #define DEFAULT_LINES_DISPLAYED 12 /* # of lines displayed message window */ #define MAX_HISTORY 60 /* max history saved on message window */ /* Window variables (winX.c). */ E struct xwindow window_list[MAX_WINDOWS]; E XtAppContext app_context; /* context of application */ E Widget toplevel; /* toplevel widget */ E Atom wm_delete_window; /* delete window protocol */ E boolean exit_x_event; /* exit condition for event loop */ #define EXIT_ON_KEY_PRESS 0 /* valid values for exit_x_event */ #define EXIT_ON_KEY_OR_BUTTON_PRESS 1 #define EXIT_ON_EXIT 2 #define EXIT_ON_SENT_EVENT 3 E int click_x, click_y, click_button, updated_inventory; typedef struct { Boolean slow; Boolean autofocus; Boolean message_line; Boolean double_tile_size; /* double tile size */ String tile_file; /* name of file to open for tiles */ String icon; /* name of desired icon */ int message_lines; /* number of lines to attempt to show */ String pet_mark_bitmap; /* X11 bitmap file used to mark pets */ Pixel pet_mark_color; /* color of pet mark */ #ifdef GRAPHIC_TOMBSTONE String tombstone; /* name of XPM file for tombstone */ int tombtext_x; /* x-coord of center of first tombstone text */ int tombtext_y; /* y-coord of center of first tombstone text */ int tombtext_dx; /* x-displacement between tombstone line */ int tombtext_dy; /* y-displacement between tombstone line */ #endif } AppResources; E AppResources appResources; E void (*input_func)(); extern struct window_procs X11_procs; /* Check for an invalid window id. */ #define check_winid(window) \ if ((window) < 0 || (window) >= MAX_WINDOWS) { \ panic("illegal windid [%d] in %s at line %d", \ window, __FILE__, __LINE__); \ } /* ### dialogs.c ### */ E Widget FDECL(CreateDialog, (Widget, String, XtCallbackProc, XtCallbackProc)); E void FDECL(SetDialogPrompt,(Widget, String)); E String FDECL(GetDialogResponse,(Widget)); E void FDECL(SetDialogResponse,(Widget, String)); E void FDECL(positionpopup,(Widget,BOOLEAN_P)); /* ### 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)); E void FDECL(nh_XtPopdown, (Widget)); E void NDECL(win_X11_init); E void FDECL(nh_keyscroll, (Widget, XEvent*, String*, Cardinal*)); /* ### winmesg.c ### */ E void FDECL(set_message_slider, (struct xwindow*)); E void FDECL(create_message_window,(struct xwindow*, BOOLEAN_P, Widget)); E void FDECL(destroy_message_window,(struct xwindow*)); E void FDECL(display_message_window, (struct xwindow*)); E void FDECL(append_message,(struct xwindow*, const char*)); E void FDECL(set_last_pause, (struct xwindow*)); /* ### winmap.c ### */ E void NDECL(post_process_tiles); E void FDECL(check_cursor_visibility,(struct xwindow*)); E void FDECL(display_map_window,(struct xwindow*)); E void FDECL(clear_map_window,(struct xwindow*)); E void FDECL(map_input, (Widget, XEvent*, String*, Cardinal*)); E void FDECL(set_map_size,(struct xwindow*, DIMENSION_P, DIMENSION_P)); E void FDECL(create_map_window,(struct xwindow*, BOOLEAN_P, Widget)); E void FDECL(destroy_map_window,(struct xwindow*)); E int FDECL(x_event,(int)); /* ### winmenu.c ### */ E void FDECL(menu_delete, (Widget, XEvent*, String*, Cardinal*)); E void FDECL(menu_key,(Widget, XEvent*, String*, Cardinal*)); E void FDECL(create_menu_window,(struct xwindow*)); E void FDECL(destroy_menu_window,(struct xwindow*)); /* ### winmisc.c ### */ E void FDECL(ps_key,(Widget, XEvent*, String*, Cardinal*)); /* player selection action */ E void FDECL(race_key,(Widget, XEvent*, String*, Cardinal*)); /* race selection action */ E void FDECL(gend_key, (Widget,XEvent *,String *,Cardinal *)); /* gender */ E void FDECL(algn_key, (Widget,XEvent *,String *,Cardinal *)); /* alignment */ E void FDECL(ec_delete, (Widget, XEvent*, String*, Cardinal*)); E void FDECL(ec_key,(Widget, XEvent*, String*, Cardinal*)); /* extended command action */ /* ### winstatus.c ### */ E void FDECL(create_status_window,(struct xwindow*, BOOLEAN_P, Widget)); E void FDECL(destroy_status_window,(struct xwindow*)); E void FDECL(adjust_status,(struct xwindow*, const char*)); E void NDECL(null_out_status); E void NDECL(check_turn_events); /* ### wintext.c ### */ E void FDECL(delete_text, (Widget, XEvent*, String*, Cardinal*)); E void FDECL(dismiss_text,(Widget, XEvent*, String*, Cardinal*)); E void FDECL(key_dismiss_text,(Widget, XEvent*, String*, Cardinal*)); #ifdef GRAPHIC_TOMBSTONE E void FDECL(rip_dismiss_text,(Widget, XEvent*, String*, Cardinal*)); #endif E void FDECL(add_to_text_window,(struct xwindow*, int, const char*)); E void FDECL(display_text_window,(struct xwindow*, BOOLEAN_P)); E void FDECL(create_text_window,(struct xwindow*)); E void FDECL(destroy_text_window,(struct xwindow*)); E void FDECL(clear_text_window,(struct xwindow*)); E void FDECL(append_text_buffer,(struct text_buffer*, const char*, BOOLEAN_P)); /* text buffer routines */ E void FDECL(init_text_buffer,(struct text_buffer*)); E void FDECL(clear_text_buffer,(struct text_buffer*)); E void FDECL(free_text_buffer,(struct text_buffer*)); #ifdef GRAPHIC_TOMBSTONE E void FDECL(calculate_rip_text, (int)); #endif /* ### winval.c ### */ E Widget FDECL(create_value,(Widget, const char*)); E void FDECL(set_name,(Widget, char*)); E void FDECL(set_name_width,(Widget, int)); E int FDECL(get_name_width,(Widget)); E void FDECL(set_value,(Widget, const char*)); E void FDECL(set_value_width,(Widget, int)); E int FDECL(get_value_width,(Widget)); E void FDECL(hilight_value,(Widget)); E void FDECL(swap_fg_bg,(Widget)); /* external declarations */ E void FDECL(X11_init_nhwindows, (int *, char **)); E void NDECL(X11_player_selection); E void NDECL(X11_askname); E void NDECL(X11_get_nh_event) ; E void FDECL(X11_exit_nhwindows, (const char *)); E void FDECL(X11_suspend_nhwindows, (const char *)); E void NDECL(X11_resume_nhwindows); E winid FDECL(X11_create_nhwindow, (int)); E void FDECL(X11_clear_nhwindow, (winid)); E void FDECL(X11_display_nhwindow, (winid, BOOLEAN_P)); E void FDECL(X11_destroy_nhwindow, (winid)); E void FDECL(X11_curs, (winid,int,int)); E void FDECL(X11_putstr, (winid, int, const char *)); #ifdef FILE_AREAS E void FDECL(X11_display_file, (const char *, const char *, BOOLEAN_P)); #else E void FDECL(X11_display_file, (const char *, BOOLEAN_P)); #endif E void FDECL(X11_start_menu, (winid)); E void FDECL(X11_add_menu, (winid,int,const ANY_P *, CHAR_P, CHAR_P, int, const char *, BOOLEAN_P)); E void FDECL(X11_end_menu, (winid, const char *)); E int FDECL(X11_select_menu, (winid, int, MENU_ITEM_P **)); E void NDECL(X11_update_inventory); E void NDECL(X11_mark_synch); E void NDECL(X11_wait_synch); #ifdef CLIPPING E void FDECL(X11_cliparound, (int, int)); #endif E void FDECL(X11_print_glyph, (winid,XCHAR_P,XCHAR_P,int)); E void FDECL(X11_raw_print, (const char *)); E void FDECL(X11_raw_print_bold, (const char *)); E int NDECL(X11_nhgetch); E int FDECL(X11_nh_poskey, (int *, int *, int *)); E void NDECL(X11_nhbell); E int NDECL(X11_doprev_message); E char FDECL(X11_yn_function, (const char *, const char *, CHAR_P)); E void FDECL(X11_getlin, (const char *,char *)); E int NDECL(X11_get_ext_cmd); E void FDECL(X11_number_pad, (int)); E void NDECL(X11_delay_output); /* other defs that really should go away (they're tty specific) */ E void NDECL(X11_start_screen); E void NDECL(X11_end_screen); #ifdef GRAPHIC_TOMBSTONE E void FDECL(X11_outrip, (winid,int)); #else E void FDECL(genl_outrip, (winid,int)); #endif #endif /* WINX_H */ slashem-0.0.7E7F3/include/xwindow.h0000664000076400007640000000545310545462317015156 0ustar aliali/* SCCS Id: @(#)xwindow.h 3.4 1992/03/07 */ /* Copyright (c) Dean Luick, 1992 */ /* NetHack may be freely redistributed. See license for details. */ #ifndef _xwindow_h #define _xwindow_h /**************************************************************** * * Window widget * ****************************************************************/ /* Resources: Name Class RepType Default Value ---- ----- ------- ------------- background Background Pixel XtDefaultBackground border BorderColor Pixel XtDefaultForeground borderWidth BorderWidth Dimension 1 destroyCallback Callback Pointer NULL height Height Dimension 0 mappedWhenManaged MappedWhenManaged Boolean True sensitive Sensitive Boolean True width Width Dimension 0 x Position Position 0 y Position Position 0 rows Width Dimension 21 columns Height Dimension 80 foreground Color Pixel XtDefaultForeground black Color Pixel "black" red Color Pixel "red" green Color Pixel "pale green" brown Color Pixel "brown" blue Color Pixel "blue" magenta Color Pixel "magenta" cyan Color Pixel "light cyan" gray Color Pixel "gray" //no color// orange Color Pixel "orange" bright_green Color Pixel "green" yellow Color Pixel "yellow" bright_blue Color Pixel "royal blue" bright_magenta Color Pixel "violet" bright_cyan Color Pixel "cyan" white Color Pixel "white" font Font XFontStruct* XtDefaultFont exposeCallback Callback Callback NULL callback Callback Callback NULL resizeCallback Callback Callback NULL */ /* define any special resource names here that are not in */ #define XtNrows "rows" #define XtNcolumns "columns" #define XtNblack "black" #define XtNred "red" #define XtNgreen "green" #define XtNbrown "brown" #define XtNblue "blue" #define XtNmagenta "magenta" #define XtNcyan "cyan" #define XtNgray "gray" #define XtNorange "orange" #define XtNbright_green "bright_green" #define XtNyellow "yellow" #define XtNbright_blue "bright_blue" #define XtNbright_magenta "bright_magenta" #define XtNbright_cyan "bright_cyan" #define XtNwhite "white" #define XtNexposeCallback "exposeCallback" #define XtNresizeCallback "resizeCallback" extern XFontStruct *WindowFontStruct(/* Widget */); extern Font WindowFont(/* Widget */); #define XtCWindowResource "WindowResource" #define XtCRows "Rows" #define XtCColumns "Columns" /* declare specific WindowWidget class and instance datatypes */ typedef struct _WindowClassRec *WindowWidgetClass; typedef struct _WindowRec *WindowWidget; /* declare the class constant */ extern WidgetClass windowWidgetClass; #endif /* _xwindow_h */ slashem-0.0.7E7F3/include/config1.h0000664000076400007640000001122410545462317014776 0ustar aliali/* 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. */ #ifndef CONFIG1_H #define CONFIG1_H /* * MS DOS - compilers * * Microsoft C auto-defines MSDOS, * Borland C auto-defines __MSDOS__, * DJGPP auto-defines MSDOS. */ /* #define MSDOS */ /* use if not defined by compiler or cases below */ #ifdef __MSDOS__ /* for Borland C */ # ifndef MSDOS # define MSDOS # endif #endif #ifdef __TURBOC__ # define __MSC /* increase Borland C compatibility in libraries */ #endif #ifdef MSDOS # undef UNIX #endif /* * Mac Stuff. */ #if defined(__SC__) || defined(__MRC__) /* MPW compilers, but not Metrowerks */ # define MAC # define MAC_MPW #endif #ifdef THINK_C /* Think C auto-defined symbol */ # define MAC # define NEED_VARARGS #endif #ifdef __MWERKS__ /* defined by Metrowerks' Codewarrior compiler */ # ifndef __BEOS__ /* BeOS */ # define MAC # endif # define NEED_VARARGS # define USE_STDARG #endif #if defined(MAC) || defined(__BEOS__) # define DLB # undef UNIX #endif #ifdef __BEOS__ # define NEED_VARARGS #endif #ifdef __APPLE__ /* defined by GCC on Mac OS X */ # define OSX #endif /* * Amiga setup. */ #ifdef AZTEC_C /* Manx auto-defines this */ # ifdef MCH_AMIGA /* Manx auto-defines this for AMIGA */ # ifndef AMIGA #define AMIGA /* define for Commodore-Amiga */ # endif /* (SAS/C auto-defines AMIGA) */ #define AZTEC_50 /* define for version 5.0 of manx */ # endif #endif #ifdef __SASC_60 # define NEARDATA __near /* put some data close */ #else # ifdef _DCC # define NEARDATA __near /* put some data close */ # else # define NEARDATA # endif #endif #ifdef AMIGA # define NEED_VARARGS # undef UNIX # define DLB # define HACKDIR "NetHack:" # define NO_MACRO_CPATH #endif /* * Atari auto-detection */ #ifdef atarist # undef UNIX # ifndef TOS # define TOS # endif #else # ifdef __MINT__ # undef UNIX # ifndef TOS # define TOS # endif # endif #endif /* * Windows NT Autodetection * */ #ifdef _WIN32_WCE #define WIN_CE # ifndef WIN32 # define WIN32 # endif #endif #if defined(__CYGWIN__) && !defined(UNIX) # define WIN32 #endif #ifdef WIN32 # undef UNIX # undef MSDOS # define NHSTDC # define USE_STDARG # define NEED_VARARGS #ifndef WIN_CE # define STRNCMPI # define STRCMPI #endif #endif #if defined(__linux__) && defined(__GNUC__) && !defined(_GNU_SOURCE) /* ensure _GNU_SOURCE is defined before including any system headers */ # define _GNU_SOURCE #endif #ifdef VMS /* really old compilers need special handling, detected here */ # undef UNIX # ifdef __DECC # ifndef __DECC_VER /* buggy early versions want widened prototypes */ # define NOTSTDC /* except when typedefs are involved */ # define USE_VARARGS # else # define NHSTDC # define USE_STDARG # define POSIX_TYPES # define _DECC_V4_SOURCE /* avoid some incompatible V5.x changes */ # endif # undef __HIDE_FORBIDDEN_NAMES /* need non-ANSI library support functions */ # else # ifdef VAXC /* must use CC/DEFINE=ANCIENT_VAXC for vaxc v2.2 or older */ # ifdef ANCIENT_VAXC /* vaxc v2.2 and earlier [lots of warnings to come] */ # define KR1ED /* simulate defined() */ # define USE_VARARGS # else /* vaxc v2.3,2.4,or 3.x, or decc in vaxc mode */ # if defined(USE_PROTOTYPES) /* this breaks 2.2 (*forces* use of ANCIENT)*/ # define __STDC__ 0 /* vaxc is not yet ANSI compliant, but close enough */ # define signed /* well, almost close enough */ #include # define UNWIDENED_PROTOTYPES # endif # define USE_STDARG # endif # endif /*VAXC*/ # endif /*__DECC*/ # ifdef VERYOLD_VMS /* v4.5 or earlier; no longer available for testing */ # define USE_OLDARGS /* is there, vprintf & vsprintf aren't */ # ifdef USE_VARARGS # undef USE_VARARGS # endif # ifdef USE_STDARG # undef USE_STDARG # endif # endif #endif /*VMS*/ #ifdef vax /* just in case someone thinks a DECstation is a vax. It's not, it's a mips */ # ifdef ULTRIX_PROTO # undef ULTRIX_PROTO # endif # ifdef ULTRIX_CC20 # undef ULTRIX_CC20 # endif #endif #ifdef KR1ED /* For compilers which cannot handle defined() */ #define defined(x) (-x-1 != -1) /* Because: * #define FOO => FOO={} => defined( ) => (-1 != - - 1) => 1 * #define FOO 1 or on command-line -DFOO * => defined(1) => (-1 != - 1 - 1) => 1 * if FOO isn't defined, FOO=0. But some compilers default to 0 instead of 1 * for -DFOO, oh well. * => defined(0) => (-1 != - 0 - 1) => 0 * * But: * defined("") => (-1 != - "" - 1) * [which is an unavoidable catastrophe.] */ #endif #if defined(__OS2__) || defined(__EMX__) # ifndef OS2 # define OS2 # endif # undef UNIX #endif #endif /* CONFIG1_H */ slashem-0.0.7E7F3/include/load_img.h0000664000076400007640000000324210545462317015224 0ustar aliali /* ------------------------------------------- */ #define XIMG 0x58494D47 /* Header of GEM Image Files */ typedef struct IMG_HEADER{ short version; /* Img file format version (1) */ short length; /* Header length in words (8) */ short planes; /* Number of bit-planes (1) */ short pat_len; /* length of Patterns (2) */ short pix_w; /* Pixel width in 1/1000 mmm (372) */ short pix_h; /* Pixel height in 1/1000 mmm (372) */ short img_w; /* Pixels per line (=(x+7)/8 Bytes) */ short img_h; /* Total number of lines */ long magic; /* Contains "XIMG" if standard color */ short paltype; /* palette type (0=RGB (short each)) */ short *palette; /* palette etc. */ char *addr; /* Address for the depacked bit-planes */ } IMG_header; /* ------------------------------------------- */ /* error codes */ #define ERR_HEADER 1 #define ERR_ALLOC 2 #define ERR_FILE 3 #define ERR_DEPACK 4 #define ERR_COLOR 5 /* saves the current colorpalette with col colors in palette */ void get_colors(int handle, short *palette, int col); /* sets col colors from palette */ void img_set_colors(int handle,short *palette, int col); /* converts MFDB of size from standard to deviceformat (0 if succeded, else error). */ int convert(MFDB *, long ); /* transforms image in VDI-Device format */ int transform_img(MFDB *); /* Loads & depacks IMG (0 if succeded, else error). */ /* Bitplanes are one after another in address IMG_HEADER.addr. */ int depack_img(char *, IMG_header *); /* Halves IMG in Device-format, dest memory has to be allocated*/ int half_img(MFDB *,MFDB *); slashem-0.0.7E7F3/include/emin.h0000664000076400007640000000050510545462317014400 0ustar aliali/* SCCS Id: @(#)emin.h 3.4 1997/05/01 */ /* Copyright (c) David Cohrs, 1990. */ /* NetHack may be freely redistributed. See license for details. */ #ifndef EMIN_H #define EMIN_H struct emin { aligntyp min_align; /* alignment of minion */ }; #define EMIN(mon) ((struct emin *)&(mon)->mextra[0]) #endif /* EMIN_H */ slashem-0.0.7E7F3/include/youprop.h0000664000076400007640000003133710545462317015174 0ustar aliali/* SCCS Id: @(#)youprop.h 3.4 1999/07/02 */ /* Copyright (c) 1989 Mike Threepoint */ /* NetHack may be freely redistributed. See license for details. */ #ifndef YOUPROP_H #define YOUPROP_H #include "prop.h" #include "permonst.h" #include "mondata.h" #include "pm.h" /* KMH, intrinsics patch. * Reorganized and rewritten for >32-bit properties. * HXxx refers to intrinsic bitfields while in human form. * EXxx refers to extrinsic bitfields from worn objects. * BXxx refers to the cause of the property being blocked. * Xxx refers to any source, including polymorph forms. */ #define maybe_polyd(if_so,if_not) (Upolyd ? (if_so) : (if_not)) /*** Resistances to troubles ***/ /* With intrinsics and extrinsics */ #define HFire_resistance u.uprops[FIRE_RES].intrinsic #define EFire_resistance u.uprops[FIRE_RES].extrinsic #define Fire_resistance (HFire_resistance || EFire_resistance || \ resists_fire(&youmonst)) #define HCold_resistance u.uprops[COLD_RES].intrinsic #define ECold_resistance u.uprops[COLD_RES].extrinsic #define Cold_resistance (HCold_resistance || ECold_resistance || \ resists_cold(&youmonst)) #define HSleep_resistance u.uprops[SLEEP_RES].intrinsic #define ESleep_resistance u.uprops[SLEEP_RES].extrinsic #define Sleep_resistance (HSleep_resistance || ESleep_resistance || \ resists_sleep(&youmonst)) #define HDisint_resistance u.uprops[DISINT_RES].intrinsic #define EDisint_resistance u.uprops[DISINT_RES].extrinsic #define Disint_resistance (HDisint_resistance || EDisint_resistance || \ resists_disint(&youmonst)) #define HShock_resistance u.uprops[SHOCK_RES].intrinsic #define EShock_resistance u.uprops[SHOCK_RES].extrinsic #define Shock_resistance (HShock_resistance || EShock_resistance || \ resists_elec(&youmonst)) #define HPoison_resistance u.uprops[POISON_RES].intrinsic #define EPoison_resistance u.uprops[POISON_RES].extrinsic #define Poison_resistance (HPoison_resistance || EPoison_resistance || \ resists_poison(&youmonst)) #define HDrain_resistance u.uprops[DRAIN_RES].intrinsic #define EDrain_resistance u.uprops[DRAIN_RES].extrinsic #define Drain_resistance (HDrain_resistance || EDrain_resistance || \ resists_drli(&youmonst)) /* Intrinsics only */ #define HSick_resistance u.uprops[SICK_RES].intrinsic #define Sick_resistance (HSick_resistance || \ youmonst.data->mlet == S_FUNGUS || \ youmonst.data == &mons[PM_GHOUL] || \ defends(AD_DISE,uwep)) #define Invulnerable u.uprops[INVULNERABLE].intrinsic /* [Tom] */ /* Extrinsics only */ #define EAntimagic u.uprops[ANTIMAGIC].extrinsic #define Antimagic (EAntimagic || \ (Upolyd && resists_magm(&youmonst))) #define EAcid_resistance u.uprops[ACID_RES].extrinsic #define Acid_resistance (EAcid_resistance || resists_acid(&youmonst)) #define EStone_resistance u.uprops[STONE_RES].extrinsic #define Stone_resistance (EStone_resistance || resists_ston(&youmonst)) /*** Troubles ***/ /* Pseudo-property */ #define Punished (uball) /* Those implemented solely as timeouts (we use just intrinsic) */ #define HStun u.uprops[STUNNED].intrinsic #define Stunned (HStun || u.umonnum == PM_STALKER || \ youmonst.data->mlet == S_BAT) /* Note: birds will also be stunned */ #define HConfusion u.uprops[CONFUSION].intrinsic #define Confusion HConfusion #define Blinded u.uprops[BLINDED].intrinsic #define Blindfolded (ublindf && ublindf->otyp != LENSES) /* ...means blind because of a cover */ #define Blind ((Blinded || Blindfolded || !haseyes(youmonst.data)) && \ !(ublindf && ublindf->oartifact == ART_EYES_OF_THE_OVERWORLD)) /* ...the Eyes operate even when you really are blind or don't have any eyes */ #define Sick u.uprops[SICK].intrinsic #define Stoned u.uprops[STONED].intrinsic #define Strangled u.uprops[STRANGLED].intrinsic #define Vomiting u.uprops[VOMITING].intrinsic #define Glib u.uprops[GLIB].intrinsic #define Slimed u.uprops[SLIMED].intrinsic /* [Tom] */ /* Hallucination is solely a timeout; its resistance is extrinsic */ #define HHallucination u.uprops[HALLUC].intrinsic #define EHalluc_resistance u.uprops[HALLUC_RES].extrinsic #define Halluc_resistance (EHalluc_resistance || \ (Upolyd && dmgtype(youmonst.data, AD_HALU))) #define Hallucination (HHallucination && !Halluc_resistance) /* Timeout, plus a worn mask */ #define HFumbling u.uprops[FUMBLING].intrinsic #define EFumbling u.uprops[FUMBLING].extrinsic #define Fumbling (HFumbling || EFumbling) #define HWounded_legs u.uprops[WOUNDED_LEGS].intrinsic #define EWounded_legs u.uprops[WOUNDED_LEGS].extrinsic #define Wounded_legs (HWounded_legs || EWounded_legs) #define HSleeping u.uprops[SLEEPING].intrinsic #define ESleeping u.uprops[SLEEPING].extrinsic #define Sleeping (HSleeping || ESleeping) #define HHunger u.uprops[HUNGER].intrinsic #define EHunger u.uprops[HUNGER].extrinsic #define Hunger (HHunger || EHunger) /*** Vision and senses ***/ #define HSee_invisible u.uprops[SEE_INVIS].intrinsic #define ESee_invisible u.uprops[SEE_INVIS].extrinsic #define See_invisible (HSee_invisible || ESee_invisible || \ perceives(youmonst.data)) #define HTelepat u.uprops[TELEPAT].intrinsic #define ETelepat u.uprops[TELEPAT].extrinsic #define Blind_telepat (HTelepat || ETelepat || \ telepathic(youmonst.data)) #define Unblind_telepat (ETelepat) #define HWarning u.uprops[WARNING].intrinsic #define EWarning u.uprops[WARNING].extrinsic #define Warning (HWarning || EWarning) /* Warning for a specific type of monster */ #define HWarn_of_mon u.uprops[WARN_OF_MON].intrinsic #define EWarn_of_mon u.uprops[WARN_OF_MON].extrinsic #define Warn_of_mon (HWarn_of_mon || EWarn_of_mon) #define HUndead_warning u.uprops[WARN_UNDEAD].intrinsic #define Undead_warning (HUndead_warning) #define HSearching u.uprops[SEARCHING].intrinsic #define ESearching u.uprops[SEARCHING].extrinsic #define Searching (HSearching || ESearching) #define HClairvoyant u.uprops[CLAIRVOYANT].intrinsic #define EClairvoyant u.uprops[CLAIRVOYANT].extrinsic #define BClairvoyant u.uprops[CLAIRVOYANT].blocked #define Clairvoyant ((HClairvoyant || EClairvoyant) &&\ !BClairvoyant) #define HInfravision u.uprops[INFRAVISION].intrinsic #define EInfravision u.uprops[INFRAVISION].extrinsic #define Infravision (HInfravision || EInfravision || \ infravision(youmonst.data)) #define HDetect_monsters u.uprops[DETECT_MONSTERS].intrinsic #define EDetect_monsters u.uprops[DETECT_MONSTERS].extrinsic #define Detect_monsters (HDetect_monsters || EDetect_monsters) /*** Appearance and behavior ***/ #define Adornment u.uprops[ADORNED].extrinsic #define HInvis u.uprops[INVIS].intrinsic #define EInvis u.uprops[INVIS].extrinsic #define BInvis u.uprops[INVIS].blocked #define Invis ((HInvis || EInvis || \ pm_invisible(youmonst.data)) && !BInvis) #define Invisible (Invis && !See_invisible) /* Note: invisibility also hides inventory and steed */ #define EDisplaced u.uprops[DISPLACED].extrinsic #define Displaced EDisplaced #define HStealth u.uprops[STEALTH].intrinsic #define EStealth u.uprops[STEALTH].extrinsic #define BStealth u.uprops[STEALTH].blocked #define Stealth ((HStealth || EStealth) && !BStealth) #define HAggravate_monster u.uprops[AGGRAVATE_MONSTER].intrinsic #define EAggravate_monster u.uprops[AGGRAVATE_MONSTER].extrinsic #define Aggravate_monster (HAggravate_monster || EAggravate_monster) #define HConflict u.uprops[CONFLICT].intrinsic #define EConflict u.uprops[CONFLICT].extrinsic #define Conflict (HConflict || EConflict) /*** Transportation ***/ #define HJumping u.uprops[JUMPING].intrinsic #define EJumping u.uprops[JUMPING].extrinsic #define Jumping (HJumping || EJumping) #define HTeleportation u.uprops[TELEPORT].intrinsic #define ETeleportation u.uprops[TELEPORT].extrinsic #define Teleportation (HTeleportation || ETeleportation || \ can_teleport(youmonst.data)) #define HTeleport_control u.uprops[TELEPORT_CONTROL].intrinsic #define ETeleport_control u.uprops[TELEPORT_CONTROL].extrinsic #define Teleport_control (HTeleport_control || ETeleport_control || \ control_teleport(youmonst.data)) #define HLevitation u.uprops[LEVITATION].intrinsic #define ELevitation u.uprops[LEVITATION].extrinsic #define Levitation (HLevitation || ELevitation || \ is_floater(youmonst.data)) /* Can't touch surface, can't go under water; overrides all others */ #define Lev_at_will (((HLevitation & I_SPECIAL) != 0L || \ (ELevitation & W_ARTI) != 0L) && \ (HLevitation & ~(I_SPECIAL|TIMEOUT)) == 0L && \ (ELevitation & ~W_ARTI) == 0L && \ !is_floater(youmonst.data)) #define EFlying u.uprops[FLYING].extrinsic #ifdef STEED # define Flying (EFlying || is_flyer(youmonst.data) || \ (u.usteed && is_flyer(u.usteed->data))) #else # define Flying (EFlying || is_flyer(youmonst.data)) #endif /* May touch surface; does not override any others */ #define Wwalking (u.uprops[WWALKING].extrinsic && \ !Is_waterlevel(&u.uz)) /* Don't get wet, can't go under water; overrides others except levitation */ /* Wwalking is meaningless on water level */ #define HSwimming u.uprops[SWIMMING].intrinsic #define ESwimming u.uprops[SWIMMING].extrinsic /* [Tom] */ #ifdef STEED # define Swimming (HSwimming || ESwimming || \ is_swimmer(youmonst.data) || \ (u.usteed && is_swimmer(u.usteed->data))) #else # define Swimming (HSwimming || ESwimming || \ is_swimmer(youmonst.data)) #endif /* Get wet, don't go under water unless if amphibious */ #define HMagical_breathing u.uprops[MAGICAL_BREATHING].intrinsic #define EMagical_breathing u.uprops[MAGICAL_BREATHING].extrinsic #define Amphibious (HMagical_breathing || EMagical_breathing || \ amphibious(youmonst.data)) /* Get wet, may go under surface */ #define Breathless (HMagical_breathing || EMagical_breathing || \ breathless(youmonst.data)) #define Underwater (u.uinwater) /* Note that Underwater and u.uinwater are both used in code. The latter form is for later implementation of other in-water states, like swimming, wading, etc. */ #define HPasses_walls u.uprops[PASSES_WALLS].intrinsic #define EPasses_walls u.uprops[PASSES_WALLS].extrinsic #define Passes_walls (HPasses_walls || EPasses_walls || \ passes_walls(youmonst.data)) /*** Physical attributes ***/ #define HSlow_digestion u.uprops[SLOW_DIGESTION].intrinsic #define ESlow_digestion u.uprops[SLOW_DIGESTION].extrinsic #define Slow_digestion (HSlow_digestion || ESlow_digestion) /* KMH */ #define HHalf_spell_damage u.uprops[HALF_SPDAM].intrinsic #define EHalf_spell_damage u.uprops[HALF_SPDAM].extrinsic #define Half_spell_damage (HHalf_spell_damage || EHalf_spell_damage) #define HHalf_physical_damage u.uprops[HALF_PHDAM].intrinsic #define EHalf_physical_damage u.uprops[HALF_PHDAM].extrinsic #define Half_physical_damage (HHalf_physical_damage || EHalf_physical_damage) #define HRegeneration u.uprops[REGENERATION].intrinsic #define ERegeneration u.uprops[REGENERATION].extrinsic #define Regeneration (HRegeneration || ERegeneration || \ regenerates(youmonst.data)) #define HEnergy_regeneration u.uprops[ENERGY_REGENERATION].intrinsic #define EEnergy_regeneration u.uprops[ENERGY_REGENERATION].extrinsic #define Energy_regeneration (HEnergy_regeneration || EEnergy_regeneration) #define HProtection u.uprops[PROTECTION].intrinsic #define EProtection u.uprops[PROTECTION].extrinsic #define Protection (HProtection || EProtection) #define HProtection_from_shape_changers \ u.uprops[PROT_FROM_SHAPE_CHANGERS].intrinsic #define EProtection_from_shape_changers \ u.uprops[PROT_FROM_SHAPE_CHANGERS].extrinsic #define Protection_from_shape_changers \ (HProtection_from_shape_changers || \ EProtection_from_shape_changers) #define HPolymorph u.uprops[POLYMORPH].intrinsic #define EPolymorph u.uprops[POLYMORPH].extrinsic #define Polymorph (HPolymorph || EPolymorph) #define HPolymorph_control u.uprops[POLYMORPH_CONTROL].intrinsic #define EPolymorph_control u.uprops[POLYMORPH_CONTROL].extrinsic #define Polymorph_control (HPolymorph_control || EPolymorph_control) #define HUnchanging u.uprops[UNCHANGING].intrinsic #define EUnchanging u.uprops[UNCHANGING].extrinsic #define Unchanging (HUnchanging || EUnchanging) /* KMH */ #define HFast u.uprops[FAST].intrinsic #define EFast u.uprops[FAST].extrinsic #define Fast (HFast || EFast) #define Very_fast ((HFast & ~INTRINSIC) || EFast) #define EReflecting u.uprops[REFLECTING].extrinsic #define Reflecting (EReflecting || \ (youmonst.data == &mons[PM_SILVER_DRAGON] ||\ youmonst.data == &mons[PM_CRYSTAL_GOLEM] ||\ youmonst.data == &mons[PM_SAPPHIRE_GOLEM] ||\ youmonst.data == &mons[PM_DIAMOND_GOLEM])) #define Free_action u.uprops[FREE_ACTION].extrinsic /* [Tom] */ #define Fixed_abil u.uprops[FIXED_ABIL].extrinsic /* KMH */ #define Lifesaved u.uprops[LIFESAVED].extrinsic #endif /* YOUPROP_H */ slashem-0.0.7E7F3/include/winproxy.h0000664000076400007640000000611610545462317015353 0ustar aliali/* $Id: winproxy.h,v 1.15 2003/05/31 08:12:43 j_ali Exp $ */ /* Copyright (c) Slash'EM Development Team 2001-2003 */ /* NetHack may be freely redistributed. See license for details. */ #ifndef WINEXT_H #define WINEXT_H #define E extern #ifdef NHXDR_H struct proxy_extension { const char *name; const char *version; void FDECL((*init), (unsigned short)); int no_procedures; void FDECL((*handler), (unsigned short, NhExtXdr *, NhExtXdr *)); }; extern struct proxy_extension proxy_extents[]; #endif extern struct window_procs proxy_procs; extern unsigned long proxy_interface_mode; extern short glyph2proxy[MAX_GLYPH]; extern FILE *proxy_config_fp; /* external declarations */ E void FDECL(proxy_init_nhwindows, (int *, char **)); E void NDECL(proxy_player_selection); E void NDECL(proxy_askname); E void NDECL(proxy_get_nh_event) ; E void FDECL(proxy_exit_nhwindows, (const char *)); E void FDECL(proxy_suspend_nhwindows, (const char *)); E void NDECL(proxy_resume_nhwindows); E winid FDECL(proxy_create_nhwindow, (int)); E void FDECL(proxy_clear_nhwindow, (winid)); E void FDECL(proxy_display_nhwindow, (winid, BOOLEAN_P)); E void FDECL(proxy_dismiss_nhwindow, (winid)); E void FDECL(proxy_destroy_nhwindow, (winid)); E void FDECL(proxy_curs, (winid, int, int)); E void FDECL(proxy_putstr, (winid, int, const char *)); #ifdef FILE_AREAS E void FDECL(proxy_display_file, (const char *, const char *, BOOLEAN_P)); #else E void FDECL(proxy_display_file, (const char *, BOOLEAN_P)); #endif E void FDECL(proxy_start_menu, (winid)); E void FDECL(proxy_add_menu, (winid, int, const ANY_P *, CHAR_P, CHAR_P, int, const char *, BOOLEAN_P)); E void FDECL(proxy_end_menu, (winid, const char *)); E int FDECL(proxy_select_menu, (winid, int, MENU_ITEM_P **)); E char FDECL(proxy_message_menu, (CHAR_P, int, const char *)); E void NDECL(proxy_update_inventory); E void NDECL(proxy_mark_synch); E void NDECL(proxy_wait_synch); #ifdef CLIPPING E void FDECL(proxy_cliparound, (int, int)); #endif #ifdef POSITIONBAR E void FDECL(proxy_update_positionbar, (char *)); #endif E void FDECL(proxy_print_glyph, (winid, XCHAR_P, XCHAR_P, int)); E void FDECL(proxy_raw_print, (const char *)); E void FDECL(proxy_raw_print_bold, (const char *)); E int NDECL(proxy_nhgetch); E int FDECL(proxy_nh_poskey, (int *, int *, int *)); E void NDECL(proxy_nhbell); E int NDECL(proxy_doprev_message); E char FDECL(proxy_yn_function, (const char *, const char *, CHAR_P)); E void FDECL(proxy_getlin, (const char *,char *)); E int NDECL(proxy_get_ext_cmd); E void FDECL(proxy_number_pad, (int)); E void NDECL(proxy_delay_output); #ifdef CHANGE_COLOR E void FDECL(proxy_change_color, (int, long, int)); #ifdef MAC E void FDECL(proxy_change_background, (int)); E short FDECL(set_proxy_font_name, (winid, char *)); #endif E char * NDECL(proxy_get_color_string); #endif E void NDECL(proxy_start_screen); E void NDECL(proxy_end_screen); E void FDECL(proxy_outrip, (winid, int)); E void FDECL(proxy_preference_update, (const char *)); E void FDECL(proxy_status, (int, int, const char **)); E FILE *NDECL(proxy_config_file_open); #undef E #endif /* WINPROXY_H */ slashem-0.0.7E7F3/include/trap.h0000664000076400007640000000406110545462317014417 0ustar aliali/* 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. */ /* note for 3.1.0 and later: no longer manipulated by 'makedefs' */ #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; d_level dst; /* destination for portals */ coord launch; Bitfield(ttyp,5); Bitfield(tseen,1); Bitfield(once,1); Bitfield(madeby_u,1); /* So monsters may take offence when you trap them. Recognizing who made the trap isn't completely unreasonable, everybody has their own style. This flag is also needed 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; #define newtrap() (struct trap *) alloc(sizeof(struct trap)) #define dealloc_trap(trap) free((genericptr_t) (trap)) /* reasons for statue animation */ #define ANIMATE_NORMAL 0 #define ANIMATE_SHATTER 1 #define ANIMATE_SPELL 2 /* reasons for animate_statue's failure */ #define AS_OK 0 /* didn't fail */ #define AS_NO_MON 1 /* makemon failed */ #define AS_MON_IS_UNIQUE 2 /* statue monster is unique */ /* Note: if adding/removing a trap, adjust trap_engravings[] in mklev.c */ /* unconditional traps */ #define NO_TRAP 0 #define ARROW_TRAP 1 #define DART_TRAP 2 #define ROCKTRAP 3 #define SQKY_BOARD 4 #define BEAR_TRAP 5 #define LANDMINE 6 #define ROLLING_BOULDER_TRAP 7 #define SLP_GAS_TRAP 8 #define RUST_TRAP 9 #define FIRE_TRAP 10 #define PIT 11 #define SPIKED_PIT 12 #define HOLE 13 #define TRAPDOOR 14 #define TELEP_TRAP 15 #define LEVEL_TELEP 16 #define MAGIC_PORTAL 17 #define WEB 18 #define STATUE_TRAP 19 #define MAGIC_TRAP 20 #define ANTI_MAGIC 21 #define POLY_TRAP 22 #define TRAPNUM 23 #endif /* TRAP_H */ slashem-0.0.7E7F3/include/lev.h0000664000076400007640000000244210545462317014240 0ustar aliali/* 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. */ /* Common include file for save and restore routines */ #ifndef LEV_H #define LEV_H #define COUNT_SAVE 0x1 #define WRITE_SAVE 0x2 #define FREE_SAVE 0x4 /* 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 */ slashem-0.0.7E7F3/include/xwindowp.h0000664000076400007640000000277010545462317015335 0ustar aliali/* SCCS Id: @(#)xwindowp.h 3.4 1992/03/07 */ /* Copyright (c) Dean Luick, 1992 */ /* NetHack may be freely redistributed. See license for details. */ #ifndef _xwindowp_h #define _xwindowp_h #include "xwindow.h" #ifndef SYSV #define PRESERVE_NO_SYSV /* X11 include files may define SYSV */ #endif /* include superclass private header file */ #include #ifdef PRESERVE_NO_SYSV # ifdef SYSV # undef SYSV # endif # undef PRESERVE_NO_SYSV #endif /* define unique representation types not found in */ #define XtRWindowResource "WindowResource" typedef struct { int empty; } WindowClassPart; typedef struct _WindowClassRec { CoreClassPart core_class; WindowClassPart window_class; } WindowClassRec; extern WindowClassRec windowClassRec; typedef struct { /* resources */ Dimension rows; Dimension columns; Pixel foreground; Pixel black; Pixel red; Pixel green; Pixel brown; Pixel blue; Pixel magenta; Pixel cyan; Pixel gray; Pixel orange; Pixel bright_green; Pixel yellow; Pixel bright_blue; Pixel bright_magenta; Pixel bright_cyan; Pixel white; XFontStruct *font; XtCallbackList expose_callback; XtCallbackList input_callback; XtCallbackList resize_callback; /* private state */ /* (none) */ } WindowPart; typedef struct _WindowRec { CorePart core; WindowPart window; } WindowRec; #endif /* _xwindowp_h */ slashem-0.0.7E7F3/include/vision.h0000664000076400007640000000412510545462317014761 0ustar aliali/* 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. */ #ifndef VISION_H #define VISION_H #if 0 /* (moved to decl.h) */ extern boolean vision_full_recalc; /* TRUE if need vision recalc */ extern char **viz_array; /* could see/in sight row pointers */ extern char *viz_rmin; /* min could see indices */ extern char *viz_rmax; /* max could see indices */ #endif #define COULD_SEE 0x1 /* location could be seen, if it were lit */ #define IN_SIGHT 0x2 /* location can be seen */ #define TEMP_LIT 0x4 /* location is temporarily lit */ /* * Light source sources */ #define LS_OBJECT 0 #define LS_MONSTER 1 /* WAC Added a new light source temp type * This is meant to be called within a function and destroyed before * control is returned to user. They are NOT saved. Used for light * sourcing spells, explosions, etc. */ #define LS_TEMP 2 /* * cansee() - Returns true if the hero can see the location. * * couldsee() - Returns true if the hero has a clear line of sight to * the location. */ #define cansee(x,y) (viz_array[y][x] & IN_SIGHT) #define couldsee(x,y) (viz_array[y][x] & COULD_SEE) #define templit(x,y) (viz_array[y][x] & TEMP_LIT) /* * The following assume the monster is not blind. * * m_cansee() - Returns true if the monster can see the given location. * * m_canseeu() - Returns true if the monster could see the hero. Assumes * that if the hero has a clear line of sight to the monster's * location and the hero is visible, then monster can see the * hero. */ #define m_cansee(mtmp,x2,y2) clear_path((mtmp)->mx,(mtmp)->my,(x2),(y2)) #define m_canseeu(m) ((!Invis || perceives((m)->data)) && \ !(Underwater || u.uburied || (m)->mburied) ? \ couldsee((m)->mx,(m)->my) : 0) /* * Circle information */ #define MAX_RADIUS 15 /* this is in points from the source */ /* Use this macro to get a list of distances of the edges (see vision.c). */ #define circle_ptr(z) (&circle_data[(int)circle_start[z]]) #endif /* VISION_H */ slashem-0.0.7E7F3/include/monattk.h0000664000076400007640000001031410545462317015124 0ustar aliali/* SCCS Id: @(#)monattk.h 3.4 2002/03/24 */ /* NetHack may be freely redistributed. See license for details. */ /* Copyright 1988, M. Stephenson */ #ifndef MONATTK_H #define MONATTK_H /* Add new attack types below - ordering affects experience (exper.c). * Attacks > AT_BUTT are worth extra experience. */ #define AT_ANY (-1) /* fake attack; dmgtype_fromattack wildcard */ #define AT_NONE 0 /* passive monster (ex. acid blob) */ #define AT_CLAW 1 /* claw (punch, hit, etc.) */ #define AT_BITE 2 /* bite */ #define AT_KICK 3 /* kick */ #define AT_BUTT 4 /* head butt (ex. a unicorn) */ #define AT_TUCH 5 /* touches */ #define AT_STNG 6 /* sting */ #define AT_HUGS 7 /* crushing bearhug */ #define AT_SPIT 10 /* spits substance - ranged */ #define AT_ENGL 11 /* engulf (swallow or by a cloud) */ #define AT_BREA 12 /* breath - ranged */ #define AT_EXPL 13 /* explodes - proximity */ #define AT_BOOM 14 /* explodes when killed */ #define AT_GAZE 15 /* gaze - ranged */ #define AT_TENT 16 /* tentacles */ #define AT_MULTIPLY 17 /* RJ - multiplies (yes, it's an attack) */ #define AT_WEAP 254 /* uses weapon */ #define AT_MAGC 255 /* uses magic spell(s) */ /* Add new damage types below. * * Note that 1-10 correspond to the types of attack used in buzz(). * Please don't disturb the order unless you rewrite the buzz() code. */ #define AD_ANY (-1) /* fake damage; attacktype_fordmg wildcard */ #define AD_PHYS 0 /* ordinary physical */ #define AD_MAGM 1 /* magic missiles */ #define AD_FIRE 2 /* fire damage */ #define AD_COLD 3 /* frost damage */ #define AD_SLEE 4 /* sleep ray */ #define AD_DISN 5 /* disintegration (death ray) */ #define AD_ELEC 6 /* shock damage */ #define AD_DRST 7 /* drains str (poison) */ #define AD_ACID 8 /* acid damage */ #define AD_LITE 9 /* KMH -- light ray */ #define AD_SPC2 10 /* for extension of buzz() */ #define AD_BLND 11 /* blinds (yellow light) */ #define AD_STUN 12 /* stuns */ #define AD_SLOW 13 /* slows */ #define AD_PLYS 14 /* paralyses */ #define AD_DRLI 15 /* drains life levels (Vampire) */ #define AD_DREN 16 /* drains magic energy */ #define AD_LEGS 17 /* damages legs (xan) */ #define AD_STON 18 /* petrifies (Medusa, cockatrice) */ #define AD_STCK 19 /* sticks to you (mimic) */ #define AD_SGLD 20 /* steals gold (leppie) */ #define AD_SITM 21 /* steals item (nymphs) */ #define AD_SEDU 22 /* seduces & steals multiple items */ #define AD_TLPT 23 /* teleports you (Quantum Mech.) */ #define AD_RUST 24 /* rusts armour (Rust Monster)*/ #define AD_CONF 25 /* confuses (Umber Hulk) */ #define AD_DGST 26 /* digests opponent (trapper, etc.) */ #define AD_HEAL 27 /* heals opponent's wounds (nurse) */ #define AD_WRAP 28 /* special "stick" for eels */ #define AD_WERE 29 /* confers lycanthropy */ #define AD_DRDX 30 /* drains dexterity (quasit) */ #define AD_DRCO 31 /* drains constitution */ #define AD_DRIN 32 /* drains intelligence (mind flayer) */ #define AD_DISE 33 /* confers diseases */ #define AD_DCAY 34 /* decays organics (brown pudding) */ #define AD_SSEX 35 /* Succubus seduction (extended) */ /* If no SEDUCE then same as AD_SEDU */ #define AD_HALU 36 /* causes hallucination */ #define AD_DETH 37 /* for Death only */ #define AD_PEST 38 /* for Pestilence only */ #define AD_FAMN 39 /* for Famine only */ #define AD_SLIM 40 /* turns you into green slime */ #define AD_CALM 41 /* KMH -- calms its enemies (koala) */ #define AD_ENCH 42 /* KMH -- remove enchantment */ #define AD_POLY 43 /* RJ -- polymorphs (genetic engineer) */ #define AD_CORR 44 /* corrode armor (black pudding) */ #define AD_TCKL 45 /* Tickle (Nightgaunts) */ #define AD_CLRC 240 /* random clerical spell */ #define AD_SPEL 241 /* random magic spell */ #define AD_RBRE 242 /* random breath weapon */ #define AD_SAMU 252 /* hits, may steal Amulet (Wizard) */ #define AD_CURS 253 /* random curse (ex. gremlin) */ /* * Monster to monster attacks. When a monster attacks another (mattackm), * any or all of the following can be returned. See mattackm() for more * details. */ #define MM_MISS 0x0 /* aggressor missed */ #define MM_HIT 0x1 /* aggressor hit defender */ #define MM_DEF_DIED 0x2 /* defender died */ #define MM_AGR_DIED 0x4 /* aggressor died */ #endif /* MONATTK_H */ slashem-0.0.7E7F3/include/engrave.h0000664000076400007640000000135310545462317015101 0ustar aliali/* 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. */ #ifndef ENGRAVE_H #define ENGRAVE_H struct engr { struct engr *nxt_engr; char *engr_txt; xchar engr_x, engr_y; unsigned engr_lth; /* for save & restore; not length of text */ long engr_time; /* moment engraving was (will be) finished */ xchar engr_type; #define DUST 1 #define ENGRAVE 2 #define BURN 3 #define MARK 4 #define ENGR_BLOOD 5 #define HEADSTONE 6 #define N_ENGRAVE 6 }; #define newengr(lth) (struct engr *)alloc((unsigned)(lth) + sizeof(struct engr)) #define dealloc_engr(engr) free((genericptr_t) (engr)) #endif /* ENGRAVE_H */ slashem-0.0.7E7F3/include/timeout.h0000664000076400007640000000336610545462317015146 0ustar aliali/* SCCS Id: @(#)timeout.h 3.4 1999/02/13 */ /* Copyright 1994, Dean Luick */ /* NetHack may be freely redistributed. See license for details. */ #ifndef TIMEOUT_H #define TIMEOUT_H /* generic timeout function */ typedef void FDECL((*timeout_proc), (genericptr_t, long)); /* kind of timer */ #define TIMER_LEVEL 0 /* event specific to level */ #define TIMER_GLOBAL 1 /* event follows current play */ #define TIMER_OBJECT 2 /* event follows a object */ #define TIMER_MONSTER 3 /* event follows a monster */ /* save/restore timer ranges */ #define RANGE_LEVEL 0 /* save/restore timers staying on level */ #define RANGE_GLOBAL 1 /* save/restore timers following global play */ /* * Timeout functions. Add a define here, then put it in the table * in timeout.c. "One more level of indirection will fix everything." */ #define ROT_ORGANIC 0 /* for buried organics */ #define ROT_CORPSE 1 #define MOLDY_CORPSE 2 #define REVIVE_MON 3 #define BURN_OBJECT 4 #define HATCH_EGG 5 #define FIG_TRANSFORM 6 #define UNPOLY_MON 7 # ifdef FIREARMS #define BOMB_BLOW 8 # ifdef UNPOLYPILE #define UNPOLY_OBJ 9 #define NUM_TIME_FUNCS 10 # else #define NUM_TIME_FUNCS 9 # endif # else /* FIREARMS */ # ifdef UNPOLYPILE #define UNPOLY_OBJ 8 #define NUM_TIME_FUNCS 9 # else #define NUM_TIME_FUNCS 8 # endif # endif /* FIREARMS */ /* 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 */ slashem-0.0.7E7F3/include/mttypriv.h0000664000076400007640000000234710545462317015354 0ustar aliali/* SCCS Id: @(#)mttypriv.h 3.4 1993/03/01 */ /* Copyright (c) Jon W{tte 1993. */ /* NetHack may be freely redistributed. See license for details. */ /* * This file contains private structures used to implement the * tty windows - note that these structures may change between * minor releases! */ #ifndef _H_tty_private # define _H_tty_private # ifndef _H_tty_public #include "mactty.h" # endif #if !TARGET_API_MAC_CARBON # include # include # include #endif #define TA_TO_RGB(ta,rgb) (((rgb).red=(((ta)>>16)&0xff)*257),((rgb).green=(((ta)>>8)&0xff)*257),\ ((rgb).blue=((ta)&0xff)*257)),rgb typedef struct tty_record { WindowPtr its_window ; short font_number ; short font_size ; short char_width ; short row_height ; short ascent_height ; short x_size ; short y_size ; short x_curs ; short y_curs ; GWorldPtr its_window_world ; BitMap its_bits ; GrafPtr offscreen_port ; GWorldPtr offscreen_world ; #if CLIP_RECT_ONLY Rect invalid_rect ; #else RgnHandle invalid_part ; #endif long attribute [ TTY_NUMBER_ATTRIBUTES ] ; long last_cursor ; Boolean was_allocated ; Boolean curs_state ; Boolean uses_gworld ; } tty_record ; #endif /* _H_tty_private */ slashem-0.0.7E7F3/include/wintype.h0000664000076400007640000000347310545462317015156 0ustar aliali/* SCCS Id: @(#)wintype.h 3.4 1996/02/18 */ /* Copyright (c) David Cohrs, 1991 */ /* NetHack may be freely redistributed. See license for details. */ #ifndef WINTYPE_H #define WINTYPE_H typedef int winid; /* a window identifier */ /* generic parameter - must not be any larger than a pointer */ typedef union any { genericptr_t a_void; struct obj *a_obj; int a_int; char a_char; schar a_schar; /* add types as needed */ } anything; #define ANY_P union any /* avoid typedef in prototypes */ /* (buggy old Ultrix compiler) */ /* menu return list */ typedef struct mi { anything item; /* identifier */ long count; /* count */ } menu_item; #define MENU_ITEM_P struct mi /* select_menu() "how" argument types */ #define PICK_NONE 0 /* user picks nothing (display only) */ #define PICK_ONE 1 /* only pick one */ #define PICK_ANY 2 /* can pick any amount */ /* window types */ /* any additional port specific types should be defined in win*.h */ #define NHW_MESSAGE 1 #define NHW_STATUS 2 #define NHW_MAP 3 #define NHW_MENU 4 #define NHW_TEXT 5 /* attribute types for putstr; the same as the ANSI value, for convenience */ #define ATR_NONE 0 #define ATR_BOLD 1 #define ATR_DIM 2 #define ATR_ULINE 4 #define ATR_BLINK 5 #define ATR_INVERSE 7 /* nh_poskey() modifier types */ #define CLICK_1 1 #define CLICK_2 2 /* invalid winid */ #define WIN_ERR ((winid) -1) /* menu window keyboard commands (may be mapped) */ #define MENU_FIRST_PAGE '^' #define MENU_LAST_PAGE '|' #define MENU_NEXT_PAGE '>' #define MENU_PREVIOUS_PAGE '<' #define MENU_SELECT_ALL '.' #define MENU_UNSELECT_ALL '-' #define MENU_INVERT_ALL '@' #define MENU_SELECT_PAGE ',' #define MENU_UNSELECT_PAGE '\\' #define MENU_INVERT_PAGE '~' #define MENU_SEARCH ':' #endif /* WINTYPE_H */ slashem-0.0.7E7F3/include/mac-term.h0000664000076400007640000000211110545462317015150 0ustar aliali/* SCCS Id: @(#)mac-term.h 3.4 2003/06/01 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 2003. */ /* NetHack may be freely redistributed. See license for details. */ /* Compiler prefix file for the MacOS X Terminal.app port. * * IMPORTANT: This file is intended only as a compiler prefix * file and must NEVER be included by other source (.c or .h) * files. * * Usage for MacOS X Project Builder: * Project menu -> Edit Active Target '_target_' -> * target settings dialog -> Settings -> Simple View -> * GCC Compiler Settings -> * set "Prefix Header" to include/mac-term.h * * Usage for Metrowerks CodeWarrior: * Edit menu -> _target_ Settings -> Language Settings -> * C/C++ Language -> * set "Prefix File" to include/mac-term.h */ /* Stuff needed for the core of NetHack */ #undef MAC #define UNIX #define BSD #define __FreeBSD__ /* Darwin is based on FreeBSD */ #define GCC_WARN /* May already be defined by CodeWarrior as 0 or 1 */ #ifdef TARGET_API_MAC_CARBON # undef TARGET_API_MAC_CARBON #endif #define TARGET_API_MAC_CARBON 0 /* Not Carbon */ slashem-0.0.7E7F3/include/display.h0000664000076400007640000003724210545462317015125 0ustar aliali/* 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. */ #ifndef DISPLAY_H #define DISPLAY_H #ifndef VISION_H #include "vision.h" #endif #ifndef MONDATA_H #include "mondata.h" /* for mindless() */ #endif #ifndef INVISIBLE_OBJECTS #define vobj_at(x,y) (level.objects[x][y]) #endif /* * sensemon() * * Returns true if the hero can sense the given monster. This includes * monsters that are hiding or mimicing other monsters. */ #define tp_sensemon(mon) ( /* The hero can always sense a monster IF: */\ (!mindless((mon)->data)) && /* 1. the monster has a brain to sense AND */\ ((Blind && Blind_telepat) || /* 2a. hero is blind and telepathic OR */\ /* 2b. hero is using a telepathy inducing */\ /* object and in range */\ (Unblind_telepat && \ (distu((mon)->mx, (mon)->my) <= (BOLT_LIM * BOLT_LIM)))) \ ) #define sensemon(mon) (tp_sensemon(mon) || Detect_monsters || MATCH_WARN_OF_MON(mon)) /* * mon_warning() is used to warn of any dangerous monsters in your * vicinity, and a glyph representing the warning level is displayed. */ #define mon_warning(mon) (Warning && !(mon)->mpeaceful && \ (distu((mon)->mx, (mon)->my) < 100) && \ (((int) ((mon)->m_lev / 4)) >= flags.warnlevel)) /* * mon_visible() * * Returns true if the hero can see the monster. It is assumed that the * Infravision is not taken into account. * hero can physically see the location of the monster. The function * vobj_at() returns a pointer to an object that the hero can see there. * Infravision is not taken into account. */ #define mon_visible(mon) ( /* The hero can see the monster */\ /* IF the monster */\ (!((mon)->minvis) || See_invisible) && /* 1. is not invisible AND */\ (!((mon)->mundetected)) && /* 2. not an undetected hider */\ (!((mon)->mburied || u.uburied)) /* 3. neither you or it is buried */\ ) /* * see_with_infrared() * * This function is true if the player can see a monster using infravision. * The caller must check for invisibility (invisible monsters are also * invisible to infravision), because this is usually called from within * canseemon() or canspotmon() which already check that. */ #define see_with_infrared(mon) (!Blind && Infravision && infravisible(mon->data) && couldsee(mon->mx, mon->my)) /* * see_with_infrared() * * This function is true if the player can see a monster using infravision. * The caller must check for invisibility (invisible monsters are also * invisible to infravision), because this is usually called from within * canseemon() or canspotmon() which already check that. */ #define see_with_infrared(mon) (!Blind && Infravision && infravisible(mon->data) && couldsee(mon->mx, mon->my)) /* * canseemon() * * This is the globally used canseemon(). It is not called within the display * routines. Like mon_visible(), but it checks to see if the hero sees the * location instead of assuming it. (And also considers worms.) */ #define canseemon(mon) (((mon)->wormno ? worm_known(mon) : \ (cansee(mon->mx, mon->my) || see_with_infrared(mon))) \ && mon_visible(mon)) /* * canspotmon(mon) * * This function checks whether you can either see a monster or sense it by * telepathy, and is what you usually call for monsters about which nothing is * known. */ #define canspotmon(mon) \ (canseemon(mon) || sensemon(mon)) /* knowninvisible(mon) * This one checks to see if you know a monster is both there and invisible. * 1) If you can see the monster and have see invisible, it is assumed the * monster is transparent, but visible in some manner. (Earlier versions of * Nethack were really inconsistent on this.) * 2) If you can't see the monster, but can see its location and you have * telepathy that works when you can see, you can tell that there is a * creature in an apparently empty spot. * Infravision is not relevant; we assume that invisible monsters are also * invisible to infravision. */ #define knowninvisible(mon) \ (mon->minvis && \ ((cansee(mon->mx, mon->my) && (See_invisible || Detect_monsters)) || \ (!Blind && (HTelepat & ~INTRINSIC) && \ distu(mon->mx, mon->my) <= (BOLT_LIM * BOLT_LIM) \ ) \ ) \ ) /* * is_safepet(mon) * * A special case check used in attack() and domove(). Placing the * definition here is convenient. */ #define is_safepet(mon) \ ((mon) && (mon)->mtame && canspotmon(mon) && flags.safe_dog \ && !Confusion && !Hallucination && !Stunned) /* * canseeself() * senseself() * * This returns true if the hero can see her/himself. * * The u.uswallow check assumes that you can see yourself even if you are * invisible. If not, then we don't need the check. */ #define canseeself() (Blind || u.uswallow || (!Invisible && !u.uundetected)) #define senseself() (canseeself() || Unblind_telepat || Detect_monsters) /* * random_monster() * random_object() * random_trap() * * Respectively return a random monster, object, or trap number. */ #define random_monster() rn2(NUMMONS) #define random_object() rn1(NUM_OBJECTS-1,1) #define random_trap() rn1(TRAPNUM-1,1) /* * what_obj() * what_mon() * what_trap() * * If hallucinating, choose a random object/monster, otherwise, use the one * given. */ #define what_obj(obj) (Hallucination ? random_object() : obj) #define what_mon(mon) (Hallucination ? random_monster() : mon) #define what_trap(trp) (Hallucination ? random_trap() : trp) /* * covers_objects() * covers_traps() * * These routines are true if what is really at the given location will * "cover" any objects or traps that might be there. */ #define covers_objects(xx,yy) \ ((is_pool(xx,yy) && !Underwater) || (levl[xx][yy].typ == LAVAPOOL)) #define covers_traps(xx,yy) covers_objects(xx,yy) /* * tmp_at() control calls. */ #define DISP_BEAM (-1) /* Keep all glyphs showing & clean up at end. */ #define DISP_BEAM_ALWAYS (-2) /* Like beam, but still displayed if not visible. */ #define DISP_FLASH (-3) /* Clean up each glyph before displaying new one. */ #define DISP_ALWAYS (-4) /* Like flash, but still displayed if not visible. */ #define DISP_CHANGE (-5) /* Change glyph. */ #define DISP_END (-6) /* Clean up. */ #define DISP_FREEMEM (-7) /* Free all memory during exit only. */ /* Total number of cmap indices in the sheild_static[] array. */ #define SHIELD_COUNT 21 /* * display_self() * * Display the hero. It is assumed that all checks necessary to determine * _if_ the hero can be seen have already been done. */ #ifdef STEED #define maybe_display_usteed (u.usteed && mon_visible(u.usteed)) ? \ ridden_mon_to_glyph(u.usteed) : #else #define maybe_display_usteed /* empty */ #endif #define display_self() \ show_glyph(u.ux, u.uy, \ maybe_display_usteed /* else */ \ youmonst.m_ap_type == M_AP_NOTHING ? \ hero_glyph : \ youmonst.m_ap_type == M_AP_FURNITURE ? \ cmap_to_glyph(youmonst.mappearance) : \ youmonst.m_ap_type == M_AP_OBJECT ? \ objnum_to_glyph(youmonst.mappearance) : \ /* else M_AP_MONSTER */ monnum_to_glyph(youmonst.mappearance)) /* * A glyph is an abstraction that represents a _unique_ monster, object, * dungeon part, or effect. The uniqueness is important. For example, * It is not enough to have four (one for each "direction") zap beam glyphs, * we need a set of four for each beam type. Why go to so much trouble? * Because it is possible that any given window dependent display driver * [print_glyph()] can produce something different for each type of glyph. * That is, a beam of cold and a beam of fire would not only be different * colors, but would also be represented by different symbols. * * Glyphs are grouped for easy accessibility: * * monster Represents all the wild (not tame) monsters. Count: NUMMONS. * * pet Represents all of the tame monsters. Count: NUMMONS * * invisible Invisible monster placeholder. Count: 1 * * detect Represents all detected monsters. Count: NUMMONS * * corpse One for each monster. Count: NUMMONS * * ridden Represents all monsters being ridden. Count: NUMMONS * * object One for each object. Count: NUM_OBJECTS * * cmap One for each entry in the character map. The character map * 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 * * swallow A set of eight for each monster. The eight positions rep- * resent those surrounding the hero. The monster number is * shifted over 3 positions and the swallow position is stored * in the lower three bits. Count: NUMMONS << 3 * * warning A set of six representing the different warning levels. * * The following are offsets used to convert to and from a glyph. */ #define NUM_ZAP 8 /* number of zap beam types */ #define GLYPH_MON_OFF 0 #define GLYPH_PET_OFF (NUMMONS + GLYPH_MON_OFF) #define GLYPH_INVIS_OFF (NUMMONS + GLYPH_PET_OFF) #define GLYPH_DETECT_OFF (1 + GLYPH_INVIS_OFF) #define GLYPH_BODY_OFF (NUMMONS + GLYPH_DETECT_OFF) #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) #define NO_GLYPH MAX_GLYPH #define GLYPH_INVISIBLE GLYPH_INVIS_OFF #define warning_to_glyph(mwarnlev) ((mwarnlev)+GLYPH_WARNING_OFF) #define mon_to_glyph(mon) ((int) what_mon(monsndx((mon)->data))+GLYPH_MON_OFF) #define detected_mon_to_glyph(mon) ((int) what_mon(monsndx((mon)->data))+GLYPH_DETECT_OFF) #define ridden_mon_to_glyph(mon) ((int) what_mon(monsndx((mon)->data))+GLYPH_RIDDEN_OFF) #define pet_to_glyph(mon) ((int) what_mon(monsndx((mon)->data))+GLYPH_PET_OFF) /* This has the unfortunate side effect of needing a global variable */ /* to store a result. 'otg_temp' is defined and declared in decl.{ch}. */ #define obj_to_glyph(obj) \ (Hallucination ? \ ((otg_temp = random_object()) == CORPSE ? \ random_monster() + GLYPH_BODY_OFF : \ otg_temp + GLYPH_OBJ_OFF) : \ ((obj)->otyp == CORPSE ? \ (int) (obj)->corpsenm + GLYPH_BODY_OFF : \ (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_cmap(trap) trap_to_defsym(what_trap((trap)->ttyp)) #define trap_to_glyph(trap) cmap_to_glyph(trap_to_cmap(trap)) /* Not affected by hallucination. Gives a generic body for CORPSE */ #define objnum_to_glyph(onum) ((int) (onum) + GLYPH_OBJ_OFF) #define monnum_to_glyph(mnum) ((int) (mnum) + GLYPH_MON_OFF) #define detected_monnum_to_glyph(mnum) ((int) (mnum) + GLYPH_DETECT_OFF) #define ridden_monnum_to_glyph(mnum) ((int) (mnum) + GLYPH_RIDDEN_OFF) #define petnum_to_glyph(mnum) ((int) (mnum) + GLYPH_PET_OFF) #define body_to_glyph(mnum) ((int) (mnum) + GLYPH_BODY_OFF) /* The hero's glyph when seen as a monster. */ #define hero_glyph \ monnum_to_glyph((Upolyd || !iflags.showrace) ? u.umonnum : \ (flags.female && urace.femalenum != NON_PM) ? urace.femalenum : \ urace.malenum) /* * Change the given glyph into it's given type. Note: * 1) Pets, detected, and ridden monsters are animals and are converted * to the proper monster number. * 2) Bodies are all mapped into the generic CORPSE object * 3) If handed a glyph out of range for the type, these functions * will return NO_GLYPH (see exception below) * 4) glyph_to_swallow() does not return a showsyms[] index, but an * offset from the first swallow symbol. If handed something * out of range, it will return zero (for lack of anything better * to return). */ #define glyph_to_mon(glyph) \ (glyph_is_normal_monster(glyph) ? ((glyph)-GLYPH_MON_OFF) : \ glyph_is_pet(glyph) ? ((glyph)-GLYPH_PET_OFF) : \ glyph_is_detected_monster(glyph) ? ((glyph)-GLYPH_DETECT_OFF) : \ glyph_is_ridden_monster(glyph) ? ((glyph)-GLYPH_RIDDEN_OFF) : \ NO_GLYPH) #define glyph_to_body(glyph) \ (glyph_is_body(glyph) ? ((glyph) - GLYPH_BODY_OFF) : \ NO_GLYPH) #define glyph_to_obj(glyph) \ (glyph_is_body(glyph) ? CORPSE : \ glyph_is_normal_object(glyph) ? ((glyph)-GLYPH_OBJ_OFF) : \ NO_GLYPH) #define glyph_to_trap(glyph) \ (glyph_is_trap(glyph) ? \ ((int) defsym_to_trap((glyph) - GLYPH_CMAP_OFF)) : \ NO_GLYPH) #define glyph_to_cmap(glyph) \ (glyph_is_cmap(glyph) ? ((glyph) - GLYPH_CMAP_OFF) : \ NO_GLYPH) #define glyph_to_swallow(glyph) \ (glyph_is_swallow(glyph) ? (((glyph) - GLYPH_SWALLOW_OFF) & 0x7) : \ 0) #define glyph_to_warning(glyph) \ (glyph_is_warning(glyph) ? ((glyph) - GLYPH_WARNING_OFF) : \ NO_GLYPH); /* * Return true if the given glyph is what we want. Note that bodies are * considered objects. */ #define glyph_is_monster(glyph) \ (glyph_is_normal_monster(glyph) \ || glyph_is_pet(glyph) \ || glyph_is_ridden_monster(glyph) \ || glyph_is_detected_monster(glyph)) #define glyph_is_normal_monster(glyph) \ ((glyph) >= GLYPH_MON_OFF && (glyph) < (GLYPH_MON_OFF+NUMMONS)) #define glyph_is_pet(glyph) \ ((glyph) >= GLYPH_PET_OFF && (glyph) < (GLYPH_PET_OFF+NUMMONS)) #define glyph_is_body(glyph) \ ((glyph) >= GLYPH_BODY_OFF && (glyph) < (GLYPH_BODY_OFF+NUMMONS)) #define glyph_is_ridden_monster(glyph) \ ((glyph) >= GLYPH_RIDDEN_OFF && (glyph) < (GLYPH_RIDDEN_OFF+NUMMONS)) #define glyph_is_detected_monster(glyph) \ ((glyph) >= GLYPH_DETECT_OFF && (glyph) < (GLYPH_DETECT_OFF+NUMMONS)) #define glyph_is_invisible(glyph) ((glyph) == GLYPH_INVISIBLE) #define glyph_is_normal_object(glyph) \ ((glyph) >= GLYPH_OBJ_OFF && (glyph) < (GLYPH_OBJ_OFF+NUM_OBJECTS)) #define glyph_is_object(glyph) \ (glyph_is_normal_object(glyph) \ || glyph_is_body(glyph)) #define glyph_is_trap(glyph) \ ((glyph) >= (GLYPH_CMAP_OFF+trap_to_defsym(1)) && \ (glyph) < (GLYPH_CMAP_OFF+trap_to_defsym(1)+TRAPNUM)) #define glyph_is_cmap(glyph) \ ((glyph) >= GLYPH_CMAP_OFF && (glyph) < (GLYPH_CMAP_OFF+MAXPCHARS)) #define glyph_is_explosion(glyph) \ ((glyph) >= GLYPH_EXPLODE_OFF && \ (glyph) < (GLYPH_EXPLODE_OFF + MAXEXPCHARS * EXPL_MAX)) #define glyph_is_zap_beam(glyph) \ ((glyph) >= GLYPH_ZAP_OFF && (glyph) < (GLYPH_ZAP_OFF + (NUM_ZAP << 2))) #define glyph_is_swallow(glyph) \ ((glyph) >= GLYPH_SWALLOW_OFF && (glyph) < (GLYPH_SWALLOW_OFF+(NUMMONS << 3))) #define glyph_is_warning(glyph) \ ((glyph) >= GLYPH_WARNING_OFF && (glyph) < (GLYPH_WARNING_OFF + WARNCOUNT)) #ifdef DISPLAY_LAYERS #define memory_is_invisible(x,y) (levl[x][y].mem_invis) #define remembered_object(x,y) \ (levl[x][y].mem_corpse ? CORPSE : \ levl[x][y].mem_obj ? levl[x][y].mem_obj - 1 : NO_GLYPH) #else #define memory_is_invisible(x,y) glyph_is_invisible(levl[x][y].glyph) #define remembered_object(x,y) glyph_to_obj(levl[x][y].glyph) #endif #endif /* DISPLAY_H */ slashem-0.0.7E7F3/include/tcap.h0000664000076400007640000000304310545462317014377 0ustar aliali/* 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. */ /* not named termcap.h because it may conflict with a system header */ #ifndef TCAP_H #define TCAP_H #ifndef MICRO # define TERMLIB /* include termcap code */ #endif /* might display need graphics code? */ #if !defined(AMIGA) && !defined(TOS) && !defined(MAC) # if defined(TERMLIB) || defined(OS2) || defined(MSDOS) # define ASCIIGRAPH # endif #endif #ifndef DECL_H extern struct tc_gbl_data { /* also declared in decl.h; defined in decl.c */ char *tc_AS, *tc_AE; /* graphics start and end (tty font swapping) */ int tc_LI, tc_CO; /* lines and columns */ } tc_gbl_data; #define AS tc_gbl_data.tc_AS #define AE tc_gbl_data.tc_AE #define LI tc_gbl_data.tc_LI #define CO tc_gbl_data.tc_CO #endif extern struct tc_lcl_data { /* defined and set up in termcap.c */ char *tc_CM, *tc_ND, *tc_CD; char *tc_HI, *tc_HE, *tc_US, *tc_UE; boolean tc_ul_hack; } tc_lcl_data; /* some curses.h declare CM etc. */ #define nh_CM tc_lcl_data.tc_CM #define nh_ND tc_lcl_data.tc_ND #define nh_CD tc_lcl_data.tc_CD #define nh_HI tc_lcl_data.tc_HI #define nh_HE tc_lcl_data.tc_HE #define nh_US tc_lcl_data.tc_US #define nh_UE tc_lcl_data.tc_UE #define ul_hack tc_lcl_data.tc_ul_hack extern short ospeed; /* set up in termcap.c */ #ifdef TEXTCOLOR # ifdef TOS extern const char *hilites[CLR_MAX]; # else extern NEARDATA char *hilites[CLR_MAX]; # endif #endif #endif /* TCAP_H */ slashem-0.0.7E7F3/include/macconf.h0000664000076400007640000000605610545462317015065 0ustar aliali/* 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. */ #ifdef MAC # ifndef MACCONF_H # define MACCONF_H /* * 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. # # The Metrowerks compiler defines __STDC__ (which sets NHSTC) and uses # WIDENED_PROTOTYPES (defined if UNWIDENED_PROTOTYPES is undefined and # NHSTDC is defined). */ #ifndef __powerc # define MAC68K /* 68K mac (non-powerpc) */ #endif #ifndef MAC_MPW # ifndef TARGET_API_MAC_CARBON # define TARGET_API_MAC_CARBON 0 # endif #endif #ifndef __MACH__ #define RANDOM #endif #define NO_SIGNAL /* You wouldn't believe our signals ... */ #define FILENAMELEN 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 #include /* 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 ! */ #if TARGET_API_MAC_CARBON /* Avoid including -- it has a conflicting expl() */ # define __FP__ # include #else # include #endif /* * We could use the PSN under sys 7 here ... * ...but it wouldn't matter... */ #ifndef __MWERKS__ # 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 # 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(__MACH__)) && (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 YY_NEVER_INTERACTIVE 1 # define TEXT_TYPE 'TEXT' # define LEVL_TYPE 'LEVL' # define BONE_TYPE 'BONE' # define SAVE_TYPE 'SAVE' # define PREF_TYPE 'PREF' # define DATA_TYPE 'DATA' # define LOGF_TYPE 'ttro' /* read-only text */ # define MAC_CREATOR 'slEm' /* 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. * This file is included into the resource fork of the application. */ #define PORT_HELP "MacHelp" #define MAC_GRAPHICS_ENV # endif /* ! MACCONF_H */ #endif /* MAC */ slashem-0.0.7E7F3/include/tech.h0000664000076400007640000000525310545462317014400 0ustar aliali/* SCCS Id: @(#)tech.h 3.2 98/Oct/30 */ /* Original Code by Warren Cheung */ /* Copyright 1986, M. Stephenson */ /* NetHack may be freely redistributed. See license for details. */ #ifndef TECH_H #define TECH_H /* An array of this struct holds your current techs */ struct tech { int t_id; /* tech id * Unique number for the tech * see the #defines below */ xchar t_lev; /* power level * This is the level * you were when you got the tech */ int t_tout; /* timeout - time until tech can be * used again */ int t_inuse; /* time till effect stops */ long t_intrinsic; /* Source(s) */ #define OUTSIDE_LEVEL TIMEOUT /* Level "from outside" started at */ }; struct innate_tech { schar ulevel; /* gains tech at level */ short tech_id; /* the tech unique ID*/ int tech_lev; /* starts at level */ }; struct blitz_tab { const char *blitz_cmd; /* the typed command */ const int blitz_len; /* The length of blitz_cmd */ int NDECL((*blitz_funct)); /* function called when the command is executed */ const int blitz_tech; /* the tech designation - determines tech needed * to access this blitz and the name of the blitz */ const int blitz_type; /* the type of blitz chain */ #define BLITZ_START 0 /* Starts the chain */ #define BLITZ_CHAIN 1 /* Goes anywhere in the chain (usually middle) */ #define BLITZ_END 2 /* Finishes the chain */ }; #define NO_TECH 0 #define T_BERSERK 1 #define T_KIII 2 #define T_RESEARCH 3 #define T_SURGERY 4 #define T_REINFORCE 5 #define T_FLURRY 6 #define T_PRACTICE 7 #define T_EVISCERATE 8 #define T_HEAL_HANDS 9 #define T_CALM_STEED 10 #define T_TURN_UNDEAD 11 #define T_VANISH 12 #define T_CUTTHROAT 13 #define T_BLESSING 14 #define T_E_FIST 15 #define T_PRIMAL_ROAR 16 #define T_LIQUID_LEAP 17 #define T_CRIT_STRIKE 18 #define T_SIGIL_CONTROL 19 #define T_SIGIL_TEMPEST 20 #define T_SIGIL_DISCHARGE 21 #define T_RAISE_ZOMBIES 22 #define T_REVIVE 23 #define T_WARD_FIRE 24 #define T_WARD_COLD 25 #define T_WARD_ELEC 26 #define T_TINKER 27 #define T_RAGE 28 #define T_BLINK 29 #define T_CHI_STRIKE 30 #define T_DRAW_ENERGY 31 #define T_CHI_HEALING 32 #define T_DISARM 33 #define T_DAZZLE 34 #define T_BLITZ 35 #define T_PUMMEL 36 #define T_G_SLAM 37 #define T_DASH 38 #define T_POWER_SURGE 39 #define T_SPIRIT_BOMB 40 #define T_DRAW_BLOOD 41 #define MAXTECH 41 #endif /* TECH_H */ slashem-0.0.7E7F3/include/region.h0000664000076400007640000000565110545462317014742 0ustar aliali/* SCCS Id: @(#)region.h 3.4 2002/10/15 */ /* Copyright (c) 1996 by Jean-Christophe Collet */ /* NetHack may be freely redistributed. See license for details. */ #ifndef REGION_H #define REGION_H /* generic callback function */ typedef boolean FDECL((*callback_proc), (genericptr_t, genericptr_t)); /* * Overload the old player_inside field with two values, coded in such * a way as to retain compatibility with 3.4.0 save and bones files; * this relies on the fact that nethack's `boolean' is really stored * in a `char' (or bigger type) rather than in a single bit. * * 3.4.1 save and bones files will be correct. * 3.4.0 save files restored under 3.4.1 will be correct. * 3.4.0 bones files used with 3.4.1 will continue to have the minor * 3.4.0 bug of falsely claiming that the current game's hero is * responsible for the dead former hero's stinking clouds. */ #define REG_HERO_INSIDE 1 #define REG_NOT_HEROS 2 #define hero_inside(r) ((unsigned)(r)->player_flags & REG_HERO_INSIDE) #define heros_fault(r) (!((unsigned)(r)->player_flags & REG_NOT_HEROS)) #define set_hero_inside(r) ((r)->player_flags |= REG_HERO_INSIDE) #define clear_hero_inside(r) ((r)->player_flags &= ~REG_HERO_INSIDE) #define set_heros_fault(r) ((r)->player_flags &= ~REG_NOT_HEROS) #define clear_heros_fault(r) ((r)->player_flags |= REG_NOT_HEROS) typedef struct { NhRect bounding_box; /* Bounding box of the region */ NhRect *rects; /* Rectangles composing the region */ short nrects; /* Number of rectangles */ boolean attach_2_u; /* Region attached to player ? */ unsigned int attach_2_m; /* Region attached to monster ? */ /*struct obj *attach_2_o;*/ /* Region attached to object ? UNUSED YET */ const char* enter_msg; /* Message when entering */ const char* leave_msg; /* Message when leaving */ short ttl; /* Time to live. -1 is forever */ short expire_f; /* Function to call when region's ttl expire */ short can_enter_f; /* Function to call to check wether the player can, or can not, enter the region */ short enter_f; /* Function to call when the player enters*/ short can_leave_f; /* Function to call to check wether the player can, or can not, leave the region */ short leave_f; /* Function to call when the player leaves */ short inside_f; /* Function to call every turn if player's inside */ boolean player_flags; /* (see above) */ unsigned int* monsters; /* Monsters currently inside this region */ short n_monst; /* Number of monsters inside this region */ short max_monst; /* Maximum number of monsters that can be listed without having to grow the array */ #define MONST_INC 5 /* Should probably do the same thing about objects */ boolean visible; /* Is the region visible ? */ int glyph; /* Which glyph to use if visible */ genericptr_t arg; /* Optional user argument (Ex: strength of force field, damage of a fire zone, ...*/ } NhRegion; #endif /* REGION_H */ slashem-0.0.7E7F3/include/wceconf.h0000664000076400007640000002346010545462317015101 0ustar aliali/* Copyright (C) 2001 by Alex Kompel */ /* Copyright (c) NetHack PC Development Team 1993, 1994. */ /* NetHack may be freely redistributed. See license for details. */ #ifndef WCECONF_H #define WCECONF_H #pragma warning(disable:4142) /* benign redefinition of type */ #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers #include /* Detect the targe device */ #if defined(WIN32_PLATFORM_PSPC) # if _WIN32_WCE >= 300 # define WIN_CE_POCKETPC # else # define WIN_CE_PS2xx # endif #elif defined(WIN32_PLATFORM_HPCPRO) # define WIN_CE_HPCPRO #elif defined(WIN32_PLATFORM_WFSP) # define WIN_CE_SMARTPHONE #else # error "Unsupported Windows CE platform" #endif /* #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 */ #define PC_LOCKING /* Prevent overwrites of aborted or in-progress games */ /* without first receiving confirmation. */ #define SELF_RECOVER /* Allow the game itself to recover from an aborted game */ #define NOTSTDC /* no strerror() */ #define USER_SOUNDS #define AUTOPICKUP_EXCEPTIONS /* * ----------------------------------------------------------------- * The remaining code shouldn't need modification. * ----------------------------------------------------------------- */ /* #define SHORT_FILENAMES /* All NT filesystems support long names now */ #ifdef MICRO #undef MICRO /* never define this! */ #endif #define NOCWD_ASSUMPTIONS /* Always define this. There are assumptions that it is defined for WIN32. Allow paths to be specified for HACKDIR, LEVELDIR, SAVEDIR, BONESDIR, DATADIR, SCOREDIR, LOCKDIR, CONFIGDIR, and TROUBLEDIR */ #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" #if defined(WIN_CE_POCKETPC) # define PORT_CE_PLATFORM "Pocket PC" #elif defined(WIN_CE_PS2xx) # define PORT_CE_PLATFORM "Palm-size PC 2.11" #elif defined(WIN_CE_HPCPRO) # define PORT_CE_PLATFORM "H/PC Pro 2.11" #elif defined(WIN_CE_SMARTPHONE) # define PORT_CE_PLATFORM "Smartphone 2002" #endif #if defined(ARM) # define PORT_CE_CPU "ARM" #elif defined(PPC) # define PORT_CE_CPU "PPC" #elif defined(ALPHA) # define PORT_CE_CPU "ALPHA" #elif defined(SH3) # define PORT_CE_CPU "SH3" #elif defined(SH4) # define PORT_CE_CPU "SH4" #elif defined(MIPS) # define PORT_CE_CPU "MIPS" #elif defined(X86) || defined(_X86_) # define PORT_CE_CPU "X86" #else # error Only ARM, PPC, ALPHA, SH3, SH4, MIPS and X86 supported #endif #define RUNTIME_PORT_ID /* trigger run-time port identification since Makedefs is bootstrapped on a cross-platform. */ #include /* Provides prototypes of strncmpi(), etc. */ #ifdef STRNCMPI #define strncmpi(a,b,c) _strnicmp(a,b,c) #endif #ifdef STRCMPI #define strcmpi(a,b) _stricmp(a,b) #define stricmp(a,b) _stricmp(a,b) #endif #include #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 #define rindex strrchr #define USE_STDARG #ifdef RANDOM /* Use the high quality random number routines. */ #define Rand() random() #else #define Rand() rand() #endif #define FCMASK 0660 /* file creation mask */ #define regularize nt_regularize #define HLOCK "NHPERM" #ifndef M #define M(c) ((char) (0x80 | (c))) /* #define M(c) ((c) - 128) */ #endif #ifndef C #define C(c) (0x1f & (c)) #endif #if defined(DLB) #define FILENAME_CMP _stricmp /* case insensitive */ #endif #if 0 extern char levels[], bones[], permbones[], #endif /* 0 */ /* this was part of the MICRO stuff in the past */ extern const char *alllevels, *allbones; extern char hackdir[]; #define ABORT C('a') #define getuid() 1 #define getlogin() ((char *)0) extern void NDECL(win32_abort); #ifdef WIN32CON extern void FDECL(nttty_preference_update, (const char *)); extern void NDECL(toggle_mouse_support); #endif #ifndef alloca #define ALLOCA_HACK /* used in util/panic.c */ #endif #ifndef REDO #undef Getchar #define Getchar nhgetch #endif #ifdef _MSC_VER #if 0 #pragma warning(disable:4018) /* signed/unsigned mismatch */ #pragma warning(disable:4305) /* init, conv from 'const int' to 'char' */ #endif #pragma warning(disable:4761) /* integral size mismatch in arg; conv supp*/ #ifdef YYPREFIX #pragma warning(disable:4102) /* unreferenced label */ #endif #endif /* UNICODE stuff */ #define NHSTR_BUFSIZE 255 #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 extern int FDECL(set_win32_option, (const char *, const char *)); /* * 3.4.3 addition - Stuff to help the user with some common, yet significant errors * Let's make it NOP for now */ #define interject_assistance(_1,_2,_3,_4) #define interject(_1) /* Missing definitions */ extern int mswin_have_input(); #define kbhit mswin_have_input #define getenv(a) ((char*)NULL) /* __stdio.h__ */ #define perror(a) #define freopen(a, b, c) fopen(a, b) extern int isatty(int); /* __time.h___ */ #ifndef _TIME_T_DEFINED typedef __int64 time_t; /* time value */ #define _TIME_T_DEFINED /* avoid multiple def's of time_t */ #endif #ifndef _TM_DEFINED struct tm { int tm_sec; /* seconds after the minute - [0,59] */ int tm_min; /* minutes after the hour - [0,59] */ int tm_hour; /* hours since midnight - [0,23] */ int tm_mday; /* day of the month - [1,31] */ int tm_mon; /* months since January - [0,11] */ int tm_year; /* years since 1900 */ int tm_wday; /* days since Sunday - [0,6] */ int tm_yday; /* days since January 1 - [0,365] */ int tm_isdst; /* daylight savings time flag - - NOT IMPLEMENTED */ }; #define _TM_DEFINED #endif extern struct tm * __cdecl localtime(const time_t *); extern time_t __cdecl time(time_t *); /* __stdio.h__ */ #ifndef BUFSIZ #define BUFSIZ 255 #endif #define rewind(stream) (void)fseek( stream, 0L, SEEK_SET ) /* __io.h__ */ typedef long off_t; extern int __cdecl close(int); extern int __cdecl creat(const char *, int); extern int __cdecl eof(int); extern long __cdecl lseek(int, long, int); extern int __cdecl open(const char *, int, ...); extern int __cdecl read(int, void *, unsigned int); extern int __cdecl unlink(const char *); extern int __cdecl write(int, const void *, unsigned int); extern int __cdecl rename(const char *, const char *); extern int __cdecl access(const char *, int); #ifdef DeleteFile #undef DeleteFile #endif #define DeleteFile(a) unlink(a) int chdir( const char *dirname ); extern char *getcwd( char *buffer, int maxlen ); /* __stdlib.h__ */ #define abort() (void)TerminateProcess(GetCurrentProcess(), 0) #ifndef strdup #define strdup _strdup #endif /* sys/stat.h */ #define S_IWRITE GENERIC_WRITE #define S_IREAD GENERIC_READ /* CE 2.xx is missing even more stuff */ #if defined(WIN_CE_PS2xx) || defined(WIN32_PLATFORM_HPCPRO) #define ZeroMemory(p, s) memset((p), 0, (s)) extern int __cdecl isupper(int c); extern int __cdecl isdigit(int c); extern int __cdecl isspace(int c); extern int __cdecl isprint(int c); extern char* __cdecl _strdup(const char* s); extern char* __cdecl strrchr( const char *string, int c ); extern int __cdecl _stricmp(const char* a, const char* b); extern FILE * __cdecl fopen(const char* filename, const char *mode); extern int __cdecl fscanf(FILE *f , const char *format, ...); extern int __cdecl fprintf(FILE *f , const char *format, ...); extern int __cdecl vfprintf(FILE* f, const char *format, va_list args); extern int __cdecl fgetc(FILE * f); extern char * __cdecl fgets(char *s, int size, FILE *f); extern int __cdecl printf(const char *format, ...); extern int __cdecl vprintf(const char *format, va_list args); extern int __cdecl puts(const char * s); extern FILE* __cdecl _getstdfilex(int desc); extern int __cdecl fclose(FILE * f); extern size_t __cdecl fread(void *p, size_t size, size_t count, FILE *f); extern size_t __cdecl fwrite(const void *p, size_t size, size_t count, FILE * f); extern int __cdecl fflush(FILE *f); extern int __cdecl feof(FILE *f); extern int __cdecl fseek(FILE *f, long offset, int from); extern long __cdecl ftell(FILE * f); #endif /* ARM - the processor; avoids conflict with ARM in hack.h */ # ifdef ARM # undef ARM # endif /* leave - Windows CE defines leave as part of exception handling (__leave) It confilicts with existing sources and since we don't use exceptions it is safe to undefine it */ # ifdef leave # undef leave # endif #endif /* WCECONF_H */ slashem-0.0.7E7F3/include/skills.h0000664000076400007640000001035010545462317014750 0ustar aliali/* 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. */ #ifndef SKILLS_H #define SKILLS_H /* KMH, balance patch -- Much of this code was taken from you.h */ /* Code to denote that no skill is being used */ #define P_NONE 0 /* Weapon Skills -- Stephen White * Order matters and are used in macros. * Positive values denote a wielded weapon or launcher. * Negative values denote ammunition or missiles. * Update weapon.c if you ammend any skills. * Also used for oc_subtyp. */ #define P_DAGGER 1 #define P_KNIFE 2 #define P_AXE 3 #define P_PICK_AXE 4 #define P_SHORT_SWORD 5 #define P_BROAD_SWORD 6 #define P_LONG_SWORD 7 #define P_TWO_HANDED_SWORD 8 #define P_SCIMITAR 9 #define P_SABER 10 #define P_CLUB 11 /* Bludgeon with a heavy shaft */ #define P_PADDLE 12 /* Bludgeon with a flattened shaft */ #define P_MACE 13 /* Bludgeon with a spiked shaft? */ #define P_MORNING_STAR 14 /* Spiked ball chained to stick */ #define P_FLAIL 15 /* Two pieces hinged or chained together */ #define P_HAMMER 16 /* Bludgeon with a heavy head on the end */ #define P_QUARTERSTAFF 17 /* Bludgeon with a long shaft */ #define P_POLEARMS 18 #define P_SPEAR 19 #define P_JAVELIN 20 #define P_TRIDENT 21 #define P_LANCE 22 #define P_BOW 23 #define P_SLING 24 #ifdef FIREARMS #define P_FIREARM 25 /* KMH */ #endif #define P_CROSSBOW 26 #define P_DART 27 #define P_SHURIKEN 28 #define P_BOOMERANG 29 #define P_WHIP 30 #define P_UNICORN_HORN 31 #ifdef LIGHTSABERS #define P_LIGHTSABER 32 /* last weapon */ #endif #define P_FIRST_WEAPON P_DAGGER #ifdef LIGHTSABERS #define P_LAST_WEAPON P_LIGHTSABER #else #define P_LAST_WEAPON P_UNICORN_HORN #endif /* Spell skills -- Wizard Patch by Larry Stewart-Zerba */ #define P_ATTACK_SPELL (P_LAST_WEAPON + 1) #define P_HEALING_SPELL (P_LAST_WEAPON + 2) #define P_DIVINATION_SPELL (P_LAST_WEAPON + 3) #define P_ENCHANTMENT_SPELL (P_LAST_WEAPON + 4) #define P_PROTECTION_SPELL (P_LAST_WEAPON + 5) #define P_BODY_SPELL (P_LAST_WEAPON + 6) #define P_MATTER_SPELL (P_LAST_WEAPON + 7) #define P_FIRST_SPELL P_ATTACK_SPELL #define P_LAST_SPELL P_MATTER_SPELL /* Other types of combat */ #define P_BARE_HANDED_COMBAT (P_LAST_SPELL + 1) #define P_MARTIAL_ARTS (P_LAST_SPELL + 2) /* WAC used to be role distinguishes */ #define P_TWO_WEAPON_COMBAT (P_LAST_SPELL + 3) /* Finally implemented */ #ifdef STEED #define P_RIDING (P_LAST_SPELL + 4) /* How well you control your steed */ #define P_LAST_H_TO_H P_RIDING #else #define P_LAST_H_TO_H P_TWO_WEAPON_COMBAT #endif #define P_FIRST_H_TO_H P_BARE_HANDED_COMBAT #define P_NUM_SKILLS (P_LAST_H_TO_H+1) /* * These are the standard weapon skill levels. It is important that * the lowest "valid" skill be be 1. The code calculates the * previous amount to practice by calling practice_needed_to_advance() * with the current skill-1. To work out for the UNSKILLED case, * a value of 0 needed. */ #define P_ISRESTRICTED -1 #define P_UNSKILLED 1 #define P_BASIC 2 #define P_SKILLED 3 #define P_EXPERT 4 #define P_MASTER 5 #define P_GRAND_MASTER 6 #define P_LIMIT P_GRAND_MASTER #define practice_needed_to_advance(level,skill) \ (P_SKILL(skill) == P_ISRESTRICTED ? 500 : \ P_SKILL(skill) >= P_MAX_SKILL(skill) ? (level)*(level)*200 : \ (level)*(level)*20) /* The hero's skill in various weapons. */ struct skills { xchar skill; xchar max_skill; unsigned short advance; }; #define P_SKILL(type) (u.weapon_skills[type].skill) #define P_MAX_SKILL(type) (u.weapon_skills[type].max_skill) #define P_ADVANCE(type) (u.weapon_skills[type].advance) #define P_RESTRICTED(type) (u.weapon_skills[type].skill == P_ISRESTRICTED) #define P_SKILL_LIMIT 60 /* max number of skill advancements */ /* initial skill matrix structure; used in u_init.c and weapon.c */ struct def_skill { xchar skill; xchar skmax; }; /* these roles qualify for a martial arts bonus */ /* WAC - made this dependant on weapon skills if defined */ # define martial_bonus() (P_SKILL(P_MARTIAL_ARTS) >= P_BASIC) /* #else # define martial_bonus() (Role_if(PM_SAMURAI) || Role_if(PM_PRIEST) || Role_if(PM_MONK)) */ #endif /* SKILLS_H */ slashem-0.0.7E7F3/include/tosconf.h0000664000076400007640000000410510545462317015123 0ustar aliali/* SCCS Id: @(#)tosconf.h 3.2 90/02/22 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #ifdef TOS #ifndef TOSCONF_H #define TOSCONF_H #define MICRO /* must be defined to allow some inclusions */ /* Adjust these options to suit your compiler. The default here is for GNU C with the MiNT library. */ /* #define NO_SIGNAL */ /* library doesn't support signals */ /* #define NO_FSTAT */ /* library doesn't have fstat() call */ #define MINT /* library supports MiNT extensions to TOS */ #ifdef __MINT__ #define MINT #endif #ifdef O_BINARY #define FCMASK O_BINARY #else #define FCMASK 0660 #define O_BINARY 0 #endif #ifdef UNIXDEBUG #define remove(x) unlink(x) #endif /* configurable options */ #define MFLOPPY /* floppy support */ #define RANDOM /* improved random numbers */ #define SHELL /* allow spawning of shell */ #define TERMLIB /* use termcap */ #define TEXTCOLOR /* allow color */ #define MAIL /* enable the fake maildemon */ #ifdef MINT #define SUSPEND /* allow suspending the game */ #endif #ifndef TERMLIB #define ANSI_DEFAULT /* use vt52 by default */ #endif #if defined(__GNUC__) || defined(__MINT__) /* actually, only more recent GNU C libraries have strcmpi * on the other hand, they're free -- if yours is out of * date, grab the most recent from atari.archive.umich.edu */ #define STRNCMPI #undef strcmpi extern int FDECL(strcmpi,(const char *, const char *)); extern int FDECL(strncmpi,(const char *, const char *, size_t)); #endif #include #include /* instead of including system.h from pcconf.h */ #include #include #include #define SIG_RET_TYPE __Sigfunc #define SYSTEM_H #ifndef MICRO_H #include "micro.h" #endif #ifndef PCCONF_H #include "pcconf.h" /* remainder of stuff is same as the PC */ #endif #ifdef TEXTCOLOR extern boolean colors_changed; /* in tos.c */ #endif #ifdef __GNUC__ #define GCC_BUG /* correct a gcc bug involving double for loops */ #endif #endif /* TOSCONF_H */ #endif /* TOS */ slashem-0.0.7E7F3/include/vault.h0000664000076400007640000000143510545462317014606 0ustar aliali/* 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. */ #ifndef VAULT_H #define VAULT_H #define FCSIZ (ROWNO+COLNO) struct fakecorridor { xchar fx,fy,ftyp; }; struct egd { int fcbeg, fcend; /* fcend: first unused pos */ int vroom; /* room number of the vault */ xchar gdx, gdy; /* goal of guard's walk */ xchar ogx, ogy; /* guard's last position */ d_level gdlevel; /* level (& dungeon) guard was created in */ xchar warncnt; /* number of warnings to follow */ Bitfield(gddone,1); /* true iff guard has released player */ Bitfield(unused,7); struct fakecorridor fakecorr[FCSIZ]; }; #define EGD(mon) ((struct egd *)&(mon)->mextra[0]) #endif /* VAULT_H */ slashem-0.0.7E7F3/include/qt_kde0.h0000664000076400007640000000041510545462317014777 0ustar aliali/* 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 slashem-0.0.7E7F3/include/rect.h0000664000076400007640000000043210545462317014404 0ustar aliali/* 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; #endif /* RECT_H */ slashem-0.0.7E7F3/include/attrib.h0000664000076400007640000000222510545462317014736 0ustar aliali/* SCCS Id: @(#)attrib.h 3.4 1990/22/02 */ /* Copyright 1988, Mike Stephenson */ /* NetHack may be freely redistributed. See license for details. */ /* attrib.h - Header file for character class processing. */ #ifndef ATTRIB_H #define ATTRIB_H #define A_STR 0 #define A_INT 1 #define A_WIS 2 #define A_DEX 3 #define A_CON 4 #define A_CHA 5 #define A_MAX 6 /* used in rn2() selection of attrib */ #define ABASE(x) (u.acurr.a[x]) #define ABON(x) (u.abon.a[x]) #define AEXE(x) (u.aexe.a[x]) #define ACURR(x) (acurr(x)) #define ACURRSTR (acurrstr()) /* should be: */ /* #define ACURR(x) (ABON(x) + ATEMP(x) + (Upolyd ? MBASE(x) : ABASE(x)) */ #define MCURR(x) (u.macurr.a[x]) #define AMAX(x) (u.amax.a[x]) #define MMAX(x) (u.mamax.a[x]) #define ATEMP(x) (u.atemp.a[x]) #define ATIME(x) (u.atime.a[x]) /* KMH -- Conveniences when dealing with strength constants */ #define STR18(x) (18+(x)) /* 18/xx */ #define STR19(x) (100+(x)) /* For 19 and above */ struct attribs { schar a[A_MAX]; }; #define ATTRMAX(x) ((x == A_STR && Upolyd && strongmonst(youmonst.data)) ? STR18(100) : urace.attrmax[x]) #define ATTRMIN(x) (urace.attrmin[x]) #endif /* ATTRIB.H */ slashem-0.0.7E7F3/include/monst.h0000664000076400007640000001574010545462317014617 0ustar aliali/* 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. */ #ifndef MONST_H #define MONST_H /* The weapon_check flag is used two ways: * 1) When calling mon_wield_item, is 2-6 depending on what is desired. * 2) Between calls to mon_wield_item, is 0 or 1 depending on whether or not * the weapon is known by the monster to be cursed (so it shouldn't bother * trying for another weapon). * I originally planned to also use 0 if the monster already had its best * weapon, to avoid the overhead of a call to mon_wield_item, but it turns out * that there are enough situations which might make a monster change its * weapon that this is impractical. --KAA */ # define NO_WEAPON_WANTED 0 # define NEED_WEAPON 1 # define NEED_RANGED_WEAPON 2 # define NEED_HTH_WEAPON 3 # define NEED_PICK_AXE 4 # define NEED_AXE 5 # define NEED_PICK_OR_AXE 6 /* The following flags are used for the second argument to display_minventory * in invent.c: * * MINV_NOLET If set, don't display inventory letters on monster's inventory. * MINV_ALL If set, display all items in monster's inventory, otherwise * just display wielded weapons and worn items. */ #define MINV_NOLET 0x01 #define MINV_ALL 0x02 #ifndef ALIGN_H #include "align.h" #endif struct monst { struct monst *nmon; struct permonst *data; unsigned m_id; short mnum; /* permanent monster index number */ short movement; /* movement points (derived from permonst definition and added effects */ uchar m_lev; /* adjusted difficulty level of monster */ aligntyp malign; /* alignment of this monster, relative to the player (positive = good to kill) */ xchar mx, my; xchar mux, muy; /* where the monster thinks you are */ #define MTSZ 4 coord mtrack[MTSZ]; /* monster track */ int mhp, mhpmax; int m_en, m_enmax; /* Power level (for spells, etc.) */ unsigned mappearance; /* for undetected mimics and the wiz */ uchar m_ap_type; /* what mappearance is describing: */ #define M_AP_NOTHING 0 /* mappearance is unused -- monster appears as itself */ #define M_AP_FURNITURE 1 /* stairs, a door, an altar, etc. */ #define M_AP_OBJECT 2 /* an object */ #define M_AP_MONSTER 3 /* a monster */ schar mtame; /* level of tameness, implies peaceful */ unsigned long mintrinsics; /* initialized from mresists */ int mspec_used; /* monster's special ability attack timeout */ int oldmonnm; /* Old monster number - for polymorph */ Bitfield(female,1); /* is female */ Bitfield(minvis,1); /* currently invisible */ Bitfield(invis_blkd,1); /* invisibility blocked */ Bitfield(perminvis,1); /* intrinsic minvis value */ Bitfield(cham,3); /* shape-changer */ /* note: lychanthropes are handled elsewhere */ #define CHAM_ORDINARY 0 /* not a shapechanger */ #define CHAM_CHAMELEON 1 /* animal */ #define CHAM_DOPPELGANGER 2 /* demi-human */ #define CHAM_SANDESTIN 3 /* demon */ #define CHAM_MAX_INDX CHAM_SANDESTIN Bitfield(mundetected,1); /* not seen in present hiding place */ /* implies one of M1_CONCEAL or M1_HIDE, * but not mimic (that is, snake, spider, * trapper, piercer, eel) */ Bitfield(mcan,1); /* has been cancelled */ Bitfield(mburied,1); /* has been buried */ 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 */ Bitfield(mcansee,1); /* cansee 1, temp.blinded 0, blind 0 */ Bitfield(mblinded,7); /* cansee 0, temp.blinded n, blind 0 */ Bitfield(mcanmove,1); /* paralysis, similar to mblinded */ Bitfield(mfrozen,7); Bitfield(msleeping,1); /* asleep until woken */ Bitfield(mstun,1); /* stunned (off balance) */ Bitfield(mconf,1); /* confused */ Bitfield(mpeaceful,1); /* does not attack unprovoked */ Bitfield(mtrapped,1); /* trapped in a pit, web or bear trap */ Bitfield(mleashed,1); /* monster is on a leash */ Bitfield(isspell,1); /* is a temporary spell being */ Bitfield(uexp,1); /* you get experience for its kills */ Bitfield(mtraitor,1); /* Former pet that turned traitor */ Bitfield(isshk,1); /* is shopkeeper */ Bitfield(isminion,1); /* is a minion */ Bitfield(isgd,1); /* is guard */ Bitfield(isgyp, 1); /* is a gypsy */ Bitfield(ispriest,1); /* is a priest */ Bitfield(iswiz,1); /* is the Wizard of Yendor */ Bitfield(wormno,5); /* at most 31 worms on any level */ #define MAX_NUM_WORMS 32 /* should be 2^(wormno bitfield size) */ long mstrategy; /* for monsters with mflag3: current strategy */ #define STRAT_ARRIVE 0x40000000L /* just arrived on current level */ #define STRAT_WAITFORU 0x20000000L #define STRAT_CLOSE 0x10000000L #define STRAT_WAITMASK 0x30000000L #define STRAT_HEAL 0x08000000L #define STRAT_GROUND 0x04000000L #define STRAT_MONSTR 0x02000000L #define STRAT_PLAYER 0x01000000L #define STRAT_NONE 0x00000000L #define STRAT_STRATMASK 0x0f000000L #define STRAT_XMASK 0x00ff0000L #define STRAT_YMASK 0x0000ff00L #define STRAT_GOAL 0x000000ffL #define STRAT_GOALX(s) ((xchar)((s & STRAT_XMASK) >> 16)) #define STRAT_GOALY(s) ((xchar)((s & STRAT_YMASK) >> 8)) 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; long misc_worn_check; xchar weapon_check; /* * NOTE: DO NOT ADD PARTS TO MONST STRUCT AFTER THIS POINT! * ALL ADDITIONS SHOULD GO BEFORE!! * --WAC */ uchar mnamelth; /* length of name (following mxlth) */ short mxlth; /* length of following data */ /* in order to prevent alignment problems mextra should be (or follow) a long int */ int meating; /* monster is eating timeout */ long mextra[1]; /* monster dependent info */ }; /* * Note that mextra[] may correspond to any of a number of structures, which * are indicated by some of the other fields. * isgd -> struct egd * ispriest -> struct epri * isshk -> struct eshk * isminion -> struct emin * (struct epri for roaming priests and angels, which is * compatible with emin for polymorph purposes) * mtame -> struct edog * (struct epri for guardian angels, which do not eat * or do other doggy things) * Since at most one structure can be indicated in this manner, it is not * possible to tame any creatures using the other structures (the only * exception being the guardian angels which are tame on creation). */ #define newmonst(xl) (struct monst *)alloc((unsigned)(xl) + sizeof(struct monst)) #define dealloc_monst(mon) free((genericptr_t)(mon)) /* these are in mspeed */ #define MSLOW 1 /* slow monster */ #define MFAST 2 /* speeded monster */ #define NAME(mtmp) (((char *)(mtmp)->mextra) + (mtmp)->mxlth) #define MON_WEP(mon) ((mon)->mw) #define MON_NOWEP(mon) ((mon)->mw = (struct obj *)0) #define DEADMONSTER(mon) ((mon)->mhp < 1) #endif /* MONST_H */ slashem-0.0.7E7F3/include/mactty.h0000664000076400007640000002531510545462317014757 0ustar aliali/* SCCS Id: @(#)mactty.h 3.4 1993/03/01 */ /* Copyright (c) Jon W{tte 1993. */ /* NetHack may be freely redistributed. See license for details. */ /* * This header is the supported external interface for the "tty" window * package. This package sports care-free handling of "dumb" tty windows * (preferrably using monospaced fonts) - it does NOT remember the strings * sent to it; rather, it uses an offscreen bitmap. * * For best performance, make sure it is aligned on a 32-pixel boundary * (or at least a 16-pixel one) in black & white. For 24bit color, * alignment doesn't matter, and for 8-bit color, alignment to every * fourth pixel is most efficient. * * (c) Copyright 1993 Jon W{tte */ /* * You should really not poke in the structures used by the tty window. * However, since it uses the wRefCon of windows (by calling GetWRefCon * and SetWRefCon) you lose that possibility. If you still want to store * information about a window, the FIRST location _pointed to_ by the * wRefCon will be a void * that you can use for whatever reasons. Don't * take the address of this variable and expect it to stay the same * across calls to the tty window. * * void * my_config_ptr = * ( void * * ) GetWRefCon ( tty_window ) ; */ /* * The library uses the window's port temporarily through SetPortBits; * that means you shouldn't do any funky things to the clipping region * etc. Actually, you shouldn't even resize the window, as that will clip * new drawing. * * Also, if you use this library under Pascal, remember that the string * passed to add_tty_string() is a "C" style string with NO length byte, * and a terminating zero byte at the end instead. */ #ifndef _H_tty_public # define _H_tty_public #undef red /* undef internal color const strings from decl */ #undef green #undef blue #if !TARGET_API_MAC_CARBON # include #endif /* * Error code returned when it's probably our fault, or * bad parameters. */ #define general_failure 1 /* * Base resource id's for window types */ #define WIN_BASE_RES 128 #define WIN_BASE_KIND 128 /* * Commonly used characters */ #define CHAR_ENTER ((char)3) #define CHAR_BELL ((char)7) #define CHAR_BS ((char)8) #define CHAR_LF ((char)10) #define CHAR_CR ((char)13) #define CHAR_ESC ((char)27) #define CHAR_BLANK ((char)32) #define CHAR_DELETE ((char)127) extern char game_active; /* flag to window rendering routines not to use ppat */ /* * If you want some fancy operations that not a normal TTY device normally * supports, use EXTENDED_SUPPORT. For frames, area erases and area scrolls, * plus bitmap graphics - RESOLUTION DEPENDENT, be sure to call * get_tty_metrics and use those limits. */ #define EXTENDED_SUPPORT 0 /* * if you print a lot of single characters, accumulating each one in a * clipping region will take too much time. Instead, define this, which * will clip in rects. */ #define CLIP_RECT_ONLY 1 typedef enum tty_attrib { /* * Flags relating to the general functioning of the window. * These flags are passed at create_tty time, and changing them * later will clear the screen. */ TTY_ATTRIB_FLAGS , /* * When using proportional fonts, this will place each character * separately, ensuring aligned columns (but looking ugly and taking * time) */ # define TA_MOVE_EACH_CHAR 1L /* * This means draw each change as it occurs instead of collecting the area * and draw it all at once at update_tty() - slower, but more reliable. */ # define TA_ALWAYS_REFRESH 2L /* * When reaching the right end, we either just stop drawing, or wrap to the * next line. */ # define TA_WRAP_AROUND 4L /* * Overstrike means that characters are added on top of each other; i e don't * clear the letter beneath. This is faster, using srcOr under QuickDraw */ # define TA_OVERSTRIKE 8L /* * We may want the window not to scroll when we reach the end line, * but stop drawing instead. */ # define TA_INHIBIT_VERT_SCROLL 16L /* * Foreground and background colors. These only affect characters * drawn by subsequent calls; not what's already there (but it does * affect clears) * On b/w screens these do nothing. */ TTY_ATTRIB_FOREGROUND , TTY_ATTRIB_BACKGROUND , # define TA_RGB_TO_TTY(r) ((((long)((r).red>>8)&0xff)<<16)+\ (((long)((r).green>>8)&0xff)<<8)+((long)((r).blue>>8)&0xff)) /* * Attributes relating to the cursor, and character set mappings */ TTY_ATTRIB_CURSOR , /* * Blinking cursor is more noticeable when it's idle */ # define TA_BLINKING_CURSOR 1L /* * When handling input, do we echo characters as they are typed? */ # define TA_ECHO_INPUT 2L /* * Do we return each character code separately, or map delete etc? Note * that non-raw input means getchar won't return anything until the user * has typed a return. */ # define TA_RAW_INPUT 4L /* * Do we print every character as it is (including BS, NL and CR!) or do * do we interpret characters such as NL, BS and CR? */ # define TA_RAW_OUTPUT 8L /* * When getting a NL, do we also move to the left? */ # define TA_NL_ADD_CR 16L /* * When getting a CR, do we also move down? */ # define TA_CR_ADD_NL 32L /* * Wait for input or return what we've got? */ # define TA_NONBLOCKING_IO 64L /* * Use this macro to cast a function pointer to a tty attribute; this will help * portability to systems where a function pointer doesn't fit in a long */ # define TA_ATTRIB_FUNC(x) ((long)(x)) /* * This symbolic constant is used to check the number of attributes */ TTY_NUMBER_ATTRIBUTES } tty_attrib ; /* * Character returned by end-of-file condition */ # define TTY_EOF -1 /* * Create the window according to a resource WIND template. * The window pointer pointed to by window should be NULL to * allocate the window record dynamically, or point to a * WindowRecord structure already allocated. * * Passing in_color means you have to be sure there's color support; * on the Mac, this means 32bit QuickDraw present, else it will * crash. Not passing in_color means everything's rendered in * black & white. */ extern short create_tty ( WindowPtr * window , short resource_id , Boolean in_color ) ; /* * Use init_tty_name or init_tty_number to initialize a window * once allocated by create_tty. Size parameters are in characters. */ extern short init_tty_number ( WindowPtr window , short font_number , short font_size , short x_size , short y_size ) ; /* * Close and deallocate a window and its data */ extern short destroy_tty ( WindowPtr window ) ; /* * Change the font and font size used in the window for drawing after * the calls are made. To change the coordinate system, be sure to call * force_tty_coordinate_system_recalc() - else it may look strange if * the new font doesn't match the old one. */ extern short set_tty_font_name (winid window_type , char * name ) ; extern short force_tty_coordinate_system_recalc ( WindowPtr window ) ; /* * Getting some metrics about the tty and its drawing. */ extern short get_tty_metrics ( WindowPtr window , short * x_size , short * y_size , short * x_size_pixels , short * y_size_pixels , short * font_number , short * font_size , short * char_width , short * row_height ) ; /* * The basic move cursor function. 0,0 is topleft. */ extern short move_tty_cursor ( WindowPtr window , short x_pos , short y_pos ) ; /* * Flush all changes done to a tty to the screen (see TA_ALWAYS_UPDATE above) */ extern short update_tty ( WindowPtr window ) ; /* * Add a character to the tty and update the cursor position */ extern short add_tty_char ( WindowPtr window , short character ) ; /* * Add a string of characters to the tty and update the cursor * position. The string is 0-terminated! */ extern short add_tty_string ( WindowPtr window , const char * string ) ; /* * Change or read an attribute of the tty. Note that some attribute changes * may clear the screen. See the above enum and defines for values. * Attributes can be both function pointers and special flag values. */ extern short get_tty_attrib ( WindowPtr window , tty_attrib attrib , long * value ) ; extern short set_tty_attrib ( WindowPtr window , tty_attrib attrib , long value ) ; /* * Scroll the actual TTY image, in characters, positive means up/left * scroll_tty ( my_tty , 0 , 1 ) means a linefeed. Is always carried out * directly, regardless of the wait-update setting. Does updates before * scrolling. */ extern short scroll_tty ( WindowPtr window , short delta_x , short delta_y ) ; /* * Erase the offscreen bitmap and move the cursor to 0,0. Re-init some window * values (font etc) Is always carried out directly on-screen, regardless of * the wait-for-update setting. Clears update area. */ extern short clear_tty ( WindowPtr window ) ; /* * Call this routine with a window (always _mt_window) and a time (usually * from most recent event) to determine if cursor in window should be blinked */ extern short blink_cursor ( WindowPtr window , long when ) ; /* * For screen dumps, open the printer port and call this function. Can be used * for clipboard as well (only for a PICT, though; this library doesn't concern * itself with characters, just bitmaps) */ extern short image_tty ( EventRecord *theEvent, WindowPtr window ) ; /* * For erasing just an area of characters */ extern short clear_tty_window ( WindowPtr window , short from_row , short from_col , short to_row , short to_col ) ; /* * get and set the invalid region of the main window */ extern short get_invalid_region (WindowPtr window, Rect *inval_rect); extern short set_invalid_region (WindowPtr window, Rect *inval_rect); /* * Now in macsnd.c, which seemed like a good place */ extern void tty_nhbell (); #if EXTENDED_SUPPORT /* * Various versions of delete character/s, insert line/s etc can be handled by * this general-purpose function. Negative num_ means delete, positive means * insert, and you can never be sure which of row and col operations come first * if you specify both... */ extern short mangle_tty_rows_columns ( WindowPtr window , short from_row , short num_rows , short from_col , short num_cols ) ; /* * For framing an area without using grahpics characters. * Note that the given limits are those used for framing, you should not * draw in them. frame_fatness should typically be 1-5, and may be clipped * if it is too large. */ extern short frame_tty_window ( WindowPtr window , short from_row , short from_col , short to_row , short to_col , short frame_fatness ) ; /* * For inverting specific characters after the fact. May look funny in color. */ extern short invert_tty_window ( WindowPtr window , short from_row , short from_col , short to_row , short to_col ) ; /* * For drawing lines on the tty - VERY DEVICE DEPENDENT. Use get_tty_metrics. */ extern short draw_tty_line ( WindowPtr window , short from_x , short from_y , short to_x , short to_y ) ; #endif /* EXTENDED_SUPPORT */ #endif /* _H_tty_public */ slashem-0.0.7E7F3/include/ntconf.h0000664000076400007640000001356510545462317014751 0ustar aliali/* 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. */ #ifndef NTCONF_H #define NTCONF_H /* #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 */ #if defined(WIN32CON) && !defined(__CYGWIN__) # define LAN_FEATURES /* Include code for lan-aware features. */ #endif #define PC_LOCKING /* Prevent overwrites of aborted or in-progress games */ /* without first receiving confirmation. */ #define HOLD_LOCKFILE_OPEN /* Keep an exclusive lock on the .0 file */ #define SELF_RECOVER /* Allow the game itself to recover from an aborted game */ #define USER_SOUNDS /* * ----------------------------------------------------------------- * The remaining code shouldn't need modification. * ----------------------------------------------------------------- */ /* #define SHORT_FILENAMES */ /* All NT filesystems support long names now */ #ifdef MICRO #undef MICRO /* never define this! */ #endif #define NOCWD_ASSUMPTIONS /* Always define this. There are assumptions that it is defined for WIN32. Allow paths to be specified for HACKDIR, LEVELDIR, SAVEDIR, BONESDIR, DATADIR, SCOREDIR, LOCKDIR, CONFIGDIR, and TROUBLEDIR */ #define NO_TERMS #define ASCIIGRAPH #ifdef NH_OPTIONS_USED #undef NH_OPTIONS_USED #endif #if defined(MSWIN_GRAPHICS) || defined(GTK_GRAPHICS) #define NH_OPTIONS_USED "guioptions" #else #define NH_OPTIONS_USED "ttyoptions" #endif #define NH_OPTIONS_FILE NH_OPTIONS_USED #define PORT_HELP "porthelp" #ifdef WIN32CON #define PORT_DEBUG /* include ability to debug international keyboard issues */ #endif /* Stuff to help the user with some common, yet significant errors */ #define INTERJECT_PANIC 0 #define INTERJECTION_TYPES (INTERJECT_PANIC + 1) extern void FDECL(interject_assistance, (int,int,genericptr_t,genericptr_t)); extern void FDECL(interject, (int)); /* The following is needed for prototypes of certain functions */ #if defined(_MSC_VER) #include /* Provides prototypes of exit(), spawn() */ #endif #include /* Provides prototypes of strncmpi(), etc. */ #ifdef STRNCMPI #ifndef __CYGWIN__ #define strncmpi(a,b,c) strnicmp(a,b,c) #endif #endif #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 #define rindex strrchr #include #define USE_STDARG #ifdef RANDOM /* Use the high quality random number routines. */ #define Rand() random() #else #define Rand() rand() #endif #define FCMASK 0660 /* file creation mask */ #define regularize nt_regularize #define HLOCK "NHPERM" #ifndef M #define M(c) ((char) (0x80 | (c))) /* #define M(c) ((c) - 128) */ #endif #ifndef C #define C(c) (0x1f & (c)) #endif #if defined(DLB) #define FILENAME_CMP stricmp /* case insensitive */ #endif #if 0 extern char levels[], bones[], permbones[], #endif /* 0 */ /* this was part of the MICRO stuff in the past */ extern const char *alllevels, *allbones; extern char hackdir[]; #define ABORT C('a') #define getuid() 1 #define getlogin() ((char *)0) extern void NDECL(win32_abort); #ifdef WIN32CON extern void FDECL(nttty_preference_update, (const char *)); extern void NDECL(toggle_mouse_support); extern void FDECL(map_subkeyvalue, (char *)); extern void NDECL(load_keyboard_handler); #endif #include #if !defined(__BORLANDC__) && !defined(__CYGWIN__) # include # include # include #elif defined(__CYGWIN__) # include #else int _RTLENTRY _EXPFUNC access (const char _FAR *__path, int __amode); 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 _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); # include #endif #undef kbhit /* Use our special NT kbhit */ #define kbhit (*nt_kbhit) #ifdef LAN_FEATURES #define MAX_LAN_USERNAME 20 #define LAN_RO_PLAYGROUND /* not implemented in 3.3.0 */ #define LAN_SHARED_BONES /* not implemented in 3.3.0 */ #include "nhlan.h" #endif #ifndef alloca #define ALLOCA_HACK /* used in util/panic.c */ #endif #ifndef REDO #undef Getchar #define Getchar nhgetch #endif #ifdef _MSC_VER #if 0 #pragma warning(disable:4018) /* signed/unsigned mismatch */ #pragma warning(disable:4305) /* init, conv from 'const int' to 'char' */ #endif #pragma warning(disable:4761) /* integral size mismatch in arg; conv supp*/ #ifdef YYPREFIX #pragma warning(disable:4102) /* unreferenced label */ #endif #endif extern int FDECL(set_win32_option, (const char *, const char *)); #ifdef WIN32CON #define LEFTBUTTON FROM_LEFT_1ST_BUTTON_PRESSED #define RIGHTBUTTON RIGHTMOST_BUTTON_PRESSED #define MIDBUTTON FROM_LEFT_2ND_BUTTON_PRESSED #define MOUSEMASK (LEFTBUTTON | RIGHTBUTTON | MIDBUTTON) #endif /* WIN32CON */ #endif /* NTCONF_H */ slashem-0.0.7E7F3/include/monsym.h0000664000076400007640000000674710545462317015010 0ustar aliali/* 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. */ #ifndef MONSYM_H #define MONSYM_H /* * Monster classes. Below, are the corresponding default characters for * them. Monster class 0 is not used or defined so we can use it as a * NULL character. */ #define S_ANT 1 #define S_BLOB 2 #define S_COCKATRICE 3 #define S_DOG 4 #define S_EYE 5 #define S_FELINE 6 #define S_GREMLIN 7 #define S_HUMANOID 8 #define S_IMP 9 #define S_JELLY 10 #define S_KOBOLD 11 #define S_LEPRECHAUN 12 #define S_MIMIC 13 #define S_NYMPH 14 #define S_ORC 15 #define S_PIERCER 16 #define S_QUADRUPED 17 #define S_RODENT 18 #define S_SPIDER 19 #define S_TRAPPER 20 #define S_UNICORN 21 #define S_VORTEX 22 #define S_WORM 23 #define S_XAN 24 #define S_LIGHT 25 #define S_ZRUTY 26 #define S_ZOUTHERN 26 /* KMH */ #define S_ANGEL 27 #define S_BAT 28 #define S_CENTAUR 29 #define S_DRAGON 30 #define S_ELEMENTAL 31 #define S_FUNGUS 32 #define S_GNOME 33 #define S_GIANT 34 #define S_JABBERWOCK 36 #define S_KOP 37 #define S_LICH 38 #define S_MUMMY 39 #define S_NAGA 40 #define S_OGRE 41 #define S_PUDDING 42 #define S_QUANTMECH 43 #define S_RUSTMONST 44 #define S_SNAKE 45 #define S_TROLL 46 #define S_UMBER 47 #define S_VAMPIRE 48 #define S_WRAITH 49 #define S_XORN 50 #define S_YETI 51 #define S_ZOMBIE 52 #define S_HUMAN 53 #define S_GHOST 54 #define S_GOLEM 55 #define S_DEMON 56 #define S_EEL 57 #define S_LIZARD 58 #define S_BAD_FOOD 59 #define S_BAD_COINS 60 #define S_WORM_TAIL 61 #define S_MIMIC_DEF 62 #define MAXMCLASSES 63 /* number of monster classes */ #define MISCMCLASSES 2 /* currently only wormtail and mimicdef*/ #if 0 /* moved to decl.h so that makedefs.c won't see them */ extern const char def_monsyms[MAXMCLASSES]; /* default class symbols */ extern uchar monsyms[MAXMCLASSES]; /* current class symbols */ #endif /* * Default characters for monsters. These correspond to the monster classes * above. */ #define DEF_ANT 'a' #define DEF_BLOB 'b' #define DEF_COCKATRICE 'c' #define DEF_DOG 'd' #define DEF_EYE 'e' #define DEF_FELINE 'f' #define DEF_GREMLIN 'g' #define DEF_HUMANOID 'h' #define DEF_IMP 'i' #define DEF_JELLY 'j' #define DEF_KOBOLD 'k' #define DEF_LEPRECHAUN 'l' #define DEF_MIMIC 'm' #define DEF_NYMPH 'n' #define DEF_ORC 'o' #define DEF_PIERCER 'p' #define DEF_QUADRUPED 'q' #define DEF_RODENT 'r' #define DEF_SPIDER 's' #define DEF_TRAPPER 't' #define DEF_UNICORN 'u' #define DEF_VORTEX 'v' #define DEF_WORM 'w' #define DEF_XAN 'x' #define DEF_LIGHT 'y' #define DEF_ZRUTY 'z' #define DEF_ANGEL 'A' #define DEF_BAT 'B' #define DEF_CENTAUR 'C' #define DEF_DRAGON 'D' #define DEF_ELEMENTAL 'E' #define DEF_FUNGUS 'F' #define DEF_GNOME 'G' #define DEF_GIANT 'H' #define DEF_JABBERWOCK 'J' #define DEF_KOP 'K' #define DEF_LICH 'L' #define DEF_MUMMY 'M' #define DEF_NAGA 'N' #define DEF_OGRE 'O' #define DEF_PUDDING 'P' #define DEF_QUANTMECH 'Q' #define DEF_RUSTMONST 'R' #define DEF_SNAKE 'S' #define DEF_TROLL 'T' #define DEF_UMBER 'U' #define DEF_VAMPIRE 'V' #define DEF_WRAITH 'W' #define DEF_XORN 'X' #define DEF_YETI 'Y' #define DEF_ZOMBIE 'Z' #define DEF_HUMAN '@' #define DEF_GHOST ' ' #define DEF_GOLEM '\'' #define DEF_DEMON '&' #define DEF_EEL ';' #define DEF_LIZARD ':' #define DEF_BAD_FOOD '%' #define DEF_BAD_COINS '$' #define DEF_INVISIBLE 'I' #define DEF_WORM_TAIL '~' #define DEF_MIMIC_DEF ']' #endif /* MONSYM_H */ slashem-0.0.7E7F3/include/sp_lev.h0000664000076400007640000001055010545462317014741 0ustar aliali/* 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. */ #ifndef SP_LEV_H #define SP_LEV_H /* wall directions */ #define W_NORTH 1 #define W_SOUTH 2 #define W_EAST 4 #define W_WEST 8 #define W_ANY (W_NORTH|W_SOUTH|W_EAST|W_WEST) /* MAP limits */ #define MAP_X_LIM 76 #define MAP_Y_LIM 21 /* Per level flags */ #define NOTELEPORT 1 #define HARDFLOOR 2 #define NOMMAP 4 #define SHORTSIGHTED 8 #define ARBOREAL 16 #define SPOOKY 32 #define LETHE 64 /* All water on level is Lethe-ized */ /* special level types */ #define SP_LEV_ROOMS 1 #define SP_LEV_MAZE 2 /* object flags */ #define OBJF_LIT 1 #define OBJF_BURIED 2 /* * Structures manipulated by the special levels loader & compiler */ typedef union str_or_len { char *str; int len; } Str_or_Len; typedef struct { boolean init_present, padding; char fg, bg; boolean smoothed, joined; xchar lit, walled; } lev_init; typedef struct { xchar x, y, mask; short arti_key; /* Index (ART_) of key for this door */ } door; typedef struct { xchar wall, pos, secret, mask; short arti_key; /* Index (ART_) of key for this door */ } room_door; typedef struct { xchar x, y, chance, type; } trap; typedef struct { Str_or_Len name, appear_as; short id; aligntyp align; xchar x, y, chance, class, appear; schar peaceful, asleep; } monster; typedef struct { Str_or_Len name; int corpsenm; short id, spe; xchar x, y, chance, class, containment; schar curse_state; long oflags; /* OBJF_foo flags */ } object; typedef struct { xchar x, y; aligntyp align; xchar shrine; } altar; typedef struct { xchar x, y, dir, db_open; } drawbridge; typedef struct { xchar x, y, dir; } walk; typedef struct { xchar x1, y1, x2, y2; } digpos; typedef struct { xchar x, y, up; } lad; typedef struct { xchar x, y, up; } stair; typedef struct { xchar x1, y1, x2, y2; xchar rtype, rlit, rirreg; } region; /* values for rtype are defined in dungeon.h */ typedef struct { struct { xchar x1, y1, x2, y2; } inarea; struct { xchar x1, y1, x2, y2; } delarea; boolean in_islev, del_islev; xchar rtype, padding; Str_or_Len rname; } lev_region; typedef struct { xchar x, y; int amount; } gold; typedef struct { xchar x, y; Str_or_Len engr; xchar etype; } engraving; typedef struct { xchar x, y; } fountain; typedef struct { xchar x, y; } sink; typedef struct { xchar x, y; } pool; typedef struct { char halign, valign; char xsize, ysize; char **map; char nrobjects; char *robjects; char nlocset; char *nloc; char **rloc_x; char **rloc_y; char nrmonst; char *rmonst; char nreg; region **regions; char nlreg; lev_region **lregions; char nrndlreg; lev_region **rndlregions; char ndoor; door **doors; char ntrap; trap **traps; char nmonster; monster **monsters; char nobject; object **objects; char ndrawbridge; drawbridge **drawbridges; char nwalk; walk **walks; char ndig; digpos **digs; char npass; digpos **passs; char nlad; lad **lads; char nstair; stair **stairs; char naltar; altar **altars; char ngold; gold **golds; char nengraving; engraving **engravings; char nfountain; fountain **fountains; } mazepart; typedef struct { long flags; lev_init init_lev; schar filling; char numpart; mazepart **parts; } specialmaze; typedef struct _room { char *name; char *parent; xchar x, y, w, h; xchar xalign, yalign; xchar rtype, chance, rlit, filled; char ndoor; room_door **doors; char ntrap; trap **traps; char nmonster; monster **monsters; char nobject; object **objects; char naltar; altar **altars; char nstair; stair **stairs; char ngold; gold **golds; char nengraving; engraving **engravings; char nfountain; fountain **fountains; char nsink; sink **sinks; char npool; pool **pools; /* These three fields are only used when loading the level... */ int nsubroom; struct _room *subrooms[MAX_SUBROOMS]; struct mkroom *mkr; } room; typedef struct { struct { xchar room; xchar wall; xchar door; } src, dest; } corridor; #ifdef LEVEL_COMPILER /* used only by lev_comp */ typedef struct { long flags; lev_init init_lev; char nrobjects; char *robjects; char nrmonst; char *rmonst; xchar nroom; room **rooms; xchar ncorr; corridor **corrs; } splev; struct coord { int x, y; }; #endif /* LEVEL_COMPILER */ #endif /* SP_LEV_H */ slashem-0.0.7E7F3/include/tradstdc.h0000664000076400007640000002001110545462317015252 0ustar aliali/* 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. */ #ifndef TRADSTDC_H #define TRADSTDC_H #if defined(DUMB) && !defined(NOVOID) #define NOVOID #endif #ifdef NOVOID #define void int #endif /* * Borland C provides enough ANSI C compatibility in its Borland C++ * mode to warrant this. But it does not set __STDC__ unless it compiles * in its ANSI keywords only mode, which prevents use of and * far pointer use. */ #if (defined(__STDC__) || defined(__TURBOC__)) && !defined(NOTSTDC) #define NHSTDC #endif #if defined(ultrix) && defined(__STDC__) && !defined(__LANGUAGE_C) /* Ultrix seems to be in a constant state of flux. This check attempts to * set up ansi compatibility if it wasn't set up correctly by the compiler. */ #ifdef mips #define __mips mips #endif #ifdef LANGUAGE_C #define __LANGUAGE_C LANGUAGE_C #endif #endif /* * ANSI X3J11 detection. * Makes substitutes for compatibility with the old C standard. */ /* Decide how to handle variable parameter lists: * USE_STDARG means use the ANSI facilities (only ANSI compilers * should do this, and only if the library supports it). * USE_VARARGS means use the facilities. Again, this should only * be done if the library supports it. ANSI is *not* required for this. * Otherwise, the kludgy old methods are used. * The defaults are USE_STDARG for ANSI compilers, and USE_OLDARGS for * others. */ /* #define USE_VARARGS */ /* use instead of */ /* #define USE_OLDARGS */ /* don't use any variable argument facilites */ #if defined(apollo) /* Apollos have stdarg(3) but not stdarg.h */ # define USE_VARARGS #endif #if defined(NHSTDC) || defined(ULTRIX_PROTO) || defined(MAC) # if !defined(USE_VARARGS) && !defined(USE_OLDARGS) && !defined(USE_STDARG) # define USE_STDARG # endif #endif #ifdef NEED_VARARGS /* only define these if necessary */ #ifdef USE_STDARG #include # define VA_DECL(typ1,var1) (typ1 var1, ...) { va_list the_args; # define VA_DECL2(typ1,var1,typ2,var2) \ (typ1 var1, typ2 var2, ...) { va_list the_args; # define VA_INIT(var1,typ1) # define VA_NEXT(var1,typ1) var1 = va_arg(the_args, typ1) # define VA_ARGS the_args # define VA_START(x) va_start(the_args, x) # define VA_END() va_end(the_args) # if defined(ULTRIX_PROTO) && !defined(_VA_LIST_) # define _VA_LIST_ /* prevents multiple def in stdio.h */ # endif #else # ifdef USE_VARARGS #include # define VA_DECL(typ1,var1) (va_alist) va_dcl {\ va_list the_args; typ1 var1; # define VA_DECL2(typ1,var1,typ2,var2) (va_alist) va_dcl {\ va_list the_args; typ1 var1; typ2 var2; # define VA_ARGS the_args # define VA_START(x) va_start(the_args) # define VA_INIT(var1,typ1) var1 = va_arg(the_args, typ1) # define VA_NEXT(var1,typ1) var1 = va_arg(the_args,typ1) # define VA_END() va_end(the_args) # else # define VA_ARGS arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9 # define VA_DECL(typ1,var1) (var1,VA_ARGS) typ1 var1; \ char *arg1,*arg2,*arg3,*arg4,*arg5,*arg6,*arg7,*arg8,*arg9; { # define VA_DECL2(typ1,var1,typ2,var2) (var1,var2,VA_ARGS) \ typ1 var1; typ2 var2;\ char *arg1,*arg2,*arg3,*arg4,*arg5,*arg6,*arg7,*arg8,*arg9; { # define VA_START(x) # define VA_INIT(var1,typ1) # define VA_END() # endif #endif #endif /* NEED_VARARGS */ #if defined(NHSTDC) || defined(MSDOS) || defined(MAC) || defined(ULTRIX_PROTO) || defined(__BEOS__) /* * Used for robust ANSI parameter forward declarations: * int VDECL(sprintf, (char *, const char *, ...)); * * NDECL() is used for functions with zero arguments; * FDECL() is used for functions with a fixed number of arguments; * VDECL() is used for functions with a variable number of arguments. * Separate macros are needed because ANSI will mix old-style declarations * with prototypes, except in the case of varargs, and the OVERLAY-specific * trampoli.* mechanism conflicts with the ANSI <> syntax. */ # define NDECL(f) f(void) /* overridden later if USE_TRAMPOLI set */ # define FDECL(f,p) f p # if defined(MSDOS) || defined(USE_STDARG) # define VDECL(f,p) f p # else # define VDECL(f,p) f() # endif /* generic pointer, always a macro; genericptr_t is usually a typedef */ # define genericptr void * # if (defined(ULTRIX_PROTO) && !defined(__GNUC__)) || defined(OS2_CSET2) /* Cover for Ultrix on a DECstation with 2.0 compiler, which coredumps on * typedef void * genericptr_t; * extern void a(void(*)(int, genericptr_t)); * Using the #define is OK for other compiler versions too. */ /* And IBM CSet/2. The redeclaration of free hoses the compile. */ # define genericptr_t genericptr # else # if !defined(NHSTDC) && !defined(MAC) # define const # define signed # define volatile # endif # endif /* * Suppress `const' if necessary and not handled elsewhere. * Don't use `#if defined(xxx) && !defined(const)' * because some compilers choke on `defined(const)'. * This has been observed with Lattice, MPW, and High C. */ # if (defined(ULTRIX_PROTO) && !defined(NHSTDC)) || defined(apollo) /* the system header files don't use `const' properly */ # ifndef const # define const # endif # endif #else /* NHSTDC */ /* a "traditional" C compiler */ # define NDECL(f) f() # 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 # define genericptr char * # endif /* * Traditional C compilers don't have "signed", "const", or "volatile". */ # define signed # define const # define volatile #endif /* NHSTDC */ #ifndef genericptr_t typedef genericptr genericptr_t; /* (void *) or (char *) */ #endif /* * According to ANSI, prototypes for old-style declarations must widen the * arguments to int. However, the MSDOS compilers accept shorter arguments * (char, short, etc.) in prototypes and do typechecking with them. Therefore * this mess to allow the better typechecking while also allowing some * prototypes for the ANSI compilers so people quit trying to fix the * prototypes to match the standard and thus lose the typechecking. */ #if defined(MSDOS) && !defined(__GO32__) #define UNWIDENED_PROTOTYPES #endif #if defined(AMIGA) && !defined(AZTEC_50) #define UNWIDENED_PROTOTYPES #endif #if defined(MAC_MPW) #define WIDENED_PROTOTYPES #endif #if defined(__MWERKS__) && defined(__BEOS__) #define UNWIDENED_PROTOTYPES #endif #if defined(WIN32) #define UNWIDENED_PROTOTYPES #endif #if defined(ULTRIX_PROTO) && defined(ULTRIX_CC20) #define UNWIDENED_PROTOTYPES #endif #if defined(apollo) #define UNWIDENED_PROTOTYPES #endif #ifndef UNWIDENED_PROTOTYPES # if defined(NHSTDC) || defined(ULTRIX_PROTO) || defined(THINK_C) # define WIDENED_PROTOTYPES # endif #endif #if 0 /* The problem below is still the case through 4.0.5F, but the suggested * compiler flags in the Makefiles suppress the nasty messages, so we don't * need to be quite so drastic. */ #if defined(__sgi) && !defined(__GNUC__) /* * As of IRIX 4.0.1, /bin/cc claims to be an ANSI compiler, but it thinks * it's impossible for a prototype to match an old-style definition with * unwidened argument types. Thus, we have to turn off all NetHack * prototypes, and avoid declaring several system functions, since the system * include files have prototypes and the compiler also complains that * prototyped and unprototyped declarations don't match. */ # undef NDECL # undef FDECL # undef VDECL # define NDECL(f) f() # define FDECL(f,p) f() # define VDECL(f,p) f() #endif #endif /* MetaWare High-C defaults to unsigned chars */ /* AIX 3.2 needs this also */ #if defined(__HC__) || defined(_AIX32) # undef signed #endif /* * Allow gcc2 to check parameters of printf-like calls with -Wformat; * append this to a prototype declaration (see pline() in extern.h). */ #ifdef __GNUC__ # if __GNUC__ >= 2 #define PRINTF_F(f,v) __attribute__ ((format (printf, f, v))) # endif #endif #ifndef PRINTF_F #define PRINTF_F(f,v) #endif #endif /* TRADSTDC_H */ slashem-0.0.7E7F3/include/permonst.h0000664000076400007640000000473210545462317015325 0ustar aliali/* 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. */ #ifndef PERMONST_H #define PERMONST_H /* This structure covers all attack forms. * aatyp is the gross attack type (eg. claw, bite, breath, ...) * adtyp is the damage type (eg. physical, fire, cold, spell, ...) * damn is the number of hit dice of damage from the attack. * damd is the number of sides on each die. * * Some attacks can do no points of damage. Additionally, some can * have special effects *and* do damage as well. If damn and damd * are set, they may have a special meaning. For example, if set * for a blinding attack, they determine the amount of time blinded. */ struct attack { uchar aatyp; uchar adtyp, damn, damd; }; /* Max # of attacks for any given monster. */ #define NATTK 6 /* Weight of a human body */ #define WT_HUMAN 1450 #ifndef ALIGN_H #include "align.h" #endif #include "monattk.h" #include "monflag.h" struct permonst { const char *mname; /* full name */ char mlet; /* symbol */ schar mlevel, /* base monster level */ mmove, /* move speed */ ac, /* (base) armor class */ mr; /* (base) magic resistance */ aligntyp maligntyp; /* basic monster alignment */ unsigned short geno; /* creation/geno mask value */ struct attack mattk[NATTK]; /* attacks matrix */ unsigned short cwt, /* weight of corpse */ cnutrit; /* its nutritional value */ short pxlth; /* length of extension */ uchar msound; /* noise it makes (6 bits) */ uchar msize; /* physical size (3 bits) */ unsigned long mresists; /* resistances */ uchar mconveys; /* conveyed by eating */ unsigned long mflags1, /* boolean bitflags */ mflags2; /* more boolean bitflags */ unsigned short mflags3; /* yet more boolean bitflags */ # ifdef TEXTCOLOR uchar mcolor; /* color to use */ # endif }; extern NEARDATA struct permonst mons[]; /* the master list of monster types */ #define VERY_SLOW 3 #define SLOW_SPEED 9 #define NORMAL_SPEED 12 /* movement rates */ #define FAST_SPEED 15 #define VERY_FAST 24 #define NON_PM PM_PLAYERMON /* "not a monster" */ #define LOW_PM (NON_PM+1) /* first monster in mons[] */ #define SPECIAL_PM PM_LONG_WORM_TAIL /* [normal] < ~ < [special] */ /* mons[SPECIAL_PM] through mons[NUMMONS-1], inclusive, are never generated randomly and cannot be polymorphed into */ #endif /* PERMONST_H */ slashem-0.0.7E7F3/include/decl.h0000664000076400007640000003365610545462317014374 0ustar aliali/* 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. */ #ifndef DECL_H #define DECL_H #define E extern E int NDECL((*occupation)); E int NDECL((*afternmv)); E const char *hname; E int hackpid; #if defined(UNIX) || defined(VMS) E int locknum; #endif #ifdef DEF_PAGER E char *catmore; #endif /* DEF_PAGER */ E char SAVEF[]; #ifdef MICRO E char SAVEP[]; #endif E NEARDATA int bases[MAXOCLASSES]; E NEARDATA int multi; #if 0 E NEARDATA int warnlevel; #endif E NEARDATA int lastuse; E NEARDATA int nextuse; E NEARDATA int nroom; E NEARDATA int nsubroom; E NEARDATA int occtime; #define WARNCOUNT 6 /* number of different warning levels */ E uchar warnsyms[WARNCOUNT]; E int x_maze_max, y_maze_max; E int otg_temp; #ifdef REDO E NEARDATA int in_doagain; #endif E struct dgn_topology { /* special dungeon levels for speed */ d_level d_oracle_level; d_level d_bigroom_level; /* unused */ #ifdef REINCARNATION d_level d_rogue_level; #endif d_level d_medusa_level; d_level d_mineend_level; d_level d_stronghold_level; d_level d_valley_level; d_level d_wiz1_level; d_level d_wiz2_level; d_level d_wiz3_level; d_level d_juiblex_level; d_level d_orcus_level; d_level d_baalzebub_level; /* unused */ d_level d_demogorgon_level; /* unused */ d_level d_dispater_level; /* unused */ d_level d_geryon_level; /* unused */ d_level d_yeenoghu_level; /* unused */ d_level d_asmodeus_level; /* unused */ d_level d_portal_level; /* only in goto_level() [do.c] */ d_level d_sanctum_level; d_level d_earth_level; d_level d_water_level; d_level d_fire_level; d_level d_air_level; d_level d_astral_level; xchar d_tower_dnum; xchar d_sokoban_dnum; xchar d_mines_dnum, d_quest_dnum; xchar d_spiders_dnum; d_level d_lawful_quest_level; d_level d_neutral_quest_level; d_level d_chaotic_quest_level; d_level d_qstart_level, d_qlocate_level, d_nemesis_level; d_level d_knox_level; #ifdef BLACKMARKET d_level d_blackmarket_level; #endif /* BLACKMARKET */ } dungeon_topology; /* macros for accesing the dungeon levels by their old names */ #define oracle_level (dungeon_topology.d_oracle_level) #define bigroom_level (dungeon_topology.d_bigroom_level) #ifdef REINCARNATION #define rogue_level (dungeon_topology.d_rogue_level) #endif #define medusa_level (dungeon_topology.d_medusa_level) #define stronghold_level (dungeon_topology.d_stronghold_level) #define valley_level (dungeon_topology.d_valley_level) #define mineend_level (dungeon_topology.d_mineend_level) #define wiz1_level (dungeon_topology.d_wiz1_level) #define wiz2_level (dungeon_topology.d_wiz2_level) #define wiz3_level (dungeon_topology.d_wiz3_level) #define juiblex_level (dungeon_topology.d_juiblex_level) #define orcus_level (dungeon_topology.d_orcus_level) #define baalzebub_level (dungeon_topology.d_baalzebub_level) #define yeenoghu_level (dungeon_topology.d_yeenoghu_level) #define geryon_level (dungeon_topology.d_geryon_level) #define dispater_level (dungeon_topology.d_dispater_level) #define demogorgon_level (dungeon_topology.d_demogorgon_level) #define asmodeus_level (dungeon_topology.d_asmodeus_level) #define portal_level (dungeon_topology.d_portal_level) #define sanctum_level (dungeon_topology.d_sanctum_level) #define earth_level (dungeon_topology.d_earth_level) #define water_level (dungeon_topology.d_water_level) #define fire_level (dungeon_topology.d_fire_level) #define air_level (dungeon_topology.d_air_level) #define astral_level (dungeon_topology.d_astral_level) #define tower_dnum (dungeon_topology.d_tower_dnum) #define sokoban_dnum (dungeon_topology.d_sokoban_dnum) #define mines_dnum (dungeon_topology.d_mines_dnum) #define quest_dnum (dungeon_topology.d_quest_dnum) #define qstart_level (dungeon_topology.d_qstart_level) #define qlocate_level (dungeon_topology.d_qlocate_level) #define nemesis_level (dungeon_topology.d_nemesis_level) #define knox_level (dungeon_topology.d_knox_level) #define spiders_dnum (dungeon_topology.d_spiders_dnum) #define lawful_quest_level (dungeon_topology.d_lawful_quest_level) #define neutral_quest_level (dungeon_topology.d_neutral_quest_level) #define chaotic_quest_level (dungeon_topology.d_chaotic_quest_level) #ifdef BLACKMARKET #define blackmarket_level (dungeon_topology.d_blackmarket_level) #endif /* BLACKMARKET */ E NEARDATA stairway dnstair, upstair; /* stairs up and down */ #define xdnstair (dnstair.sx) #define ydnstair (dnstair.sy) #define xupstair (upstair.sx) #define yupstair (upstair.sy) E NEARDATA stairway dnladder, upladder; /* ladders up and down */ #define xdnladder (dnladder.sx) #define ydnladder (dnladder.sy) #define xupladder (upladder.sx) #define yupladder (upladder.sy) E NEARDATA stairway sstairs; E NEARDATA dest_area updest, dndest; /* level-change destination areas */ E NEARDATA coord inv_pos; E NEARDATA dungeon dungeons[]; E NEARDATA s_level *sp_levchn; #define dunlev_reached(x) (dungeons[(x)->dnum].dunlev_ureached) #include "quest.h" E struct q_score quest_status; E NEARDATA char pl_fruit[PL_FSIZ]; E NEARDATA int current_fruit; E NEARDATA struct fruit *ffruit; E NEARDATA char tune[6]; #define MAXLINFO (MAXDUNGEON * MAXLEVEL) E struct linfo level_info[MAXLINFO]; 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 int something_worth_saving; /* in case of panic */ int panicking; /* `panic' is in progress */ #if defined(VMS) || defined(WIN32) int exiting; /* an exit handler is executing */ #endif int in_impossible; #ifdef PANICLOG int in_paniclog; #endif } program_state; E boolean restoring; E const char quitchars[]; E const char vowels[]; E const char ynchars[]; E const char ynqchars[]; 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; #define KILLED_BY_AN 0 #define KILLED_BY 1 #define NO_KILLER_PREFIX 2 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]; E NEARDATA char dogname[]; E NEARDATA char catname[]; E NEARDATA char ghoulname[]; E NEARDATA char horsename[]; E NEARDATA char wolfname[]; #if 0 E NEARDATA char batname[]; E NEARDATA char snakename[]; E NEARDATA char ratname[]; E NEARDATA char badgername[]; E NEARDATA char reddragonname[]; E NEARDATA char whitedragonname[]; #endif E char preferred_pet; E const char *occtxt; /* defined when occupation != NULL */ E const char *nomovemsg; E const char nul[]; E char lock[]; E const char sdir[], ndir[]; E const schar xdir[], ydir[], zdir[]; 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; E NEARDATA long wailmsg; E NEARDATA boolean in_mklev; E NEARDATA boolean stoned; E NEARDATA boolean unweapon; E NEARDATA boolean mrg_to_wielded; E NEARDATA struct obj *current_wand; E NEARDATA boolean defer_see_monsters; E NEARDATA boolean in_steed_dismounting; E const int shield_static[]; /*** Objects ***/ #include "obj.h" E NEARDATA struct obj *invent, *uarm, *uarmc, *uarmh, *uarms, *uarmg, *uarmf, #ifdef TOURIST *uarmu, /* under-wear, so to speak */ #endif #ifdef STEED *usaddle, #endif *uskin, *uamul, *uleft, *uright, *ublindf, *uwep, *uswapwep, *uquiver; E NEARDATA struct obj *uchain; /* defined only when punished */ E NEARDATA struct obj *uball; E NEARDATA struct obj *migrating_objs; E NEARDATA struct obj *billobjs; E NEARDATA struct obj zeroobj; /* init'd and defined in decl.c */ E NEARDATA struct obj thisplace; /* init'd and defined in decl.c */ #include "spell.h" E NEARDATA struct spell spl_book[]; /* sized in decl.c */ #ifndef TECH_H #include "tech.h" #endif E NEARDATA struct tech tech_list[]; /* sized in decl.c */ /*** The player ***/ E NEARDATA char pl_character[PL_CSIZ]; E NEARDATA char pl_race; /* character's race */ /* KMH, role patch -- more maintainable when declared as an array */ E const char pl_classes[]; #include "you.h" #include "onames.h" E NEARDATA struct you u; E NEARDATA struct Role urole; /*** Monsters ***/ #ifndef PM_H #include "pm.h" #endif E NEARDATA struct permonst playermon, *uasmon; /* also decl'd extern in permonst.h */ /* init'd in monst.c */ E NEARDATA struct monst youmonst; /* init'd and defined in decl.c */ E NEARDATA struct monst *mydogs, *migrating_mons; E NEARDATA struct permonst upermonst; /* init'd in decl.c, * defined in polyself.c */ E NEARDATA struct mvitals { uchar born; uchar died; uchar mvflags; #ifdef EATEN_MEMORY uchar eaten; /* WAC -- eaten memory */ #endif } mvitals[NUMMONS]; /* 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, *const c_the_your[2]; } c_common_strings; #define nothing_happens c_common_strings.c_nothing_happens #define thats_enough_tries c_common_strings.c_thats_enough_tries #define silly_thing_to c_common_strings.c_silly_thing_to #define shudder_for_moment c_common_strings.c_shudder_for_moment #define something c_common_strings.c_something #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 #define the_your c_common_strings.c_the_your E const char no_elbow_room[]; /* material strings */ E const char *materialnm[]; /* Monster name articles */ #define ARTICLE_NONE 0 #define ARTICLE_THE 1 #define ARTICLE_A 2 #define ARTICLE_YOUR 3 /* Monster name suppress masks */ #define SUPPRESS_IT 0x01 #define SUPPRESS_INVISIBLE 0x02 #define SUPPRESS_HALLUCINATION 0x04 #define SUPPRESS_SADDLE 0x08 #define EXACT_NAME 0x0F /*** Vision ***/ E NEARDATA boolean vision_full_recalc; /* TRUE if need vision recalc */ E NEARDATA char **viz_array; /* could see/in sight row pointers */ /*** Window system stuff ***/ #include "color.h" #ifdef TEXTCOLOR E const int zapcolors[]; #endif E const char def_oc_syms[MAXOCLASSES]; /* default class symbols */ E uchar oc_syms[MAXOCLASSES]; /* current class symbols */ E const char def_monsyms[MAXMCLASSES]; /* default class symbols */ E uchar monsyms[MAXMCLASSES]; /* current class symbols */ E NEARDATA struct c_color_names { const char *const c_black, *const c_amber, *const c_golden, *const c_light_blue,*const c_red, *const c_green, *const c_silver, *const c_blue, *const c_purple, *const c_white; } c_color_names; #define NH_BLACK c_color_names.c_black #define NH_AMBER c_color_names.c_amber #define NH_GOLDEN c_color_names.c_golden #define NH_LIGHT_BLUE c_color_names.c_light_blue #define NH_RED c_color_names.c_red #define NH_GREEN c_color_names.c_green #define NH_SILVER c_color_names.c_silver #define NH_BLUE c_color_names.c_blue #define NH_PURPLE c_color_names.c_purple #define NH_WHITE c_color_names.c_white E NEARDATA winid WIN_MESSAGE, WIN_STATUS; E NEARDATA winid WIN_MAP, WIN_INVEN; E char toplines[]; #ifndef TCAP_H E struct tc_gbl_data { /* also declared in tcap.h */ char *tc_AS, *tc_AE; /* graphics start and end (tty font swapping) */ int tc_LI, tc_CO; /* lines and columns */ } tc_gbl_data; #define AS tc_gbl_data.tc_AS #define AE tc_gbl_data.tc_AE #define LI tc_gbl_data.tc_LI #define CO tc_gbl_data.tc_CO #endif E struct authentication { char prog[BUFSZ]; char args[BUFSZ]; } authentication; #define MAXNOTILESETS 20 #ifndef TILESET_MAX_FILENAME #define TILESET_MAX_FILENAME 256 #endif #define TILESET_TRANSPARENT 1 #define TILESET_PSEUDO3D 2 E struct tileset { char name[PL_PSIZ]; char file[TILESET_MAX_FILENAME]; unsigned long flags; void *data; /* For windowing port's use */ } tilesets[MAXNOTILESETS]; E int no_tilesets; E struct tileset def_tilesets[]; E char tileset[PL_PSIZ]; /* xxxexplain[] is in drawing.c */ E const char * const monexplain[], invisexplain[], * const objexplain[], * const oclass_names[]; /* Some systems want to use full pathnames for some subsets of file names, * rather than assuming that they're all in the current directory. This * provides all the subclasses that seem reasonable, and sets up for all * prefixes being null. Port code can set those that it wants. */ #define HACKPREFIX 0 #define LEVELPREFIX 1 #define SAVEPREFIX 2 #define BONESPREFIX 3 #define DATAPREFIX 4 /* this one must match hardcoded value in dlb.c */ #define SCOREPREFIX 5 #define LOCKPREFIX 6 #define CONFIGPREFIX 7 #define TROUBLEPREFIX 8 #define PREFIX_COUNT 9 /* used in files.c; xxconf.h can override if needed */ # ifndef FQN_MAX_FILENAME #define FQN_MAX_FILENAME 512 # endif #if defined(NOCWD_ASSUMPTIONS) || defined(VAR_PLAYGROUND) /* the bare-bones stuff is unconditional above to simplify coding; for * ports that actually use prefixes, add some more localized things */ #define PREFIXES_IN_USE #endif E char *fqn_prefix[PREFIX_COUNT]; #ifdef PREFIXES_IN_USE E char *fqn_prefix_names[PREFIX_COUNT]; #endif #ifdef AUTOPICKUP_EXCEPTIONS struct autopickup_exception { char *pattern; boolean grab; struct autopickup_exception *next; }; #endif /* AUTOPICKUP_EXCEPTIONS */ #undef E #endif /* DECL_H */ slashem-0.0.7E7F3/include/qt_clust.h0000664000076400007640000000107010545462317015304 0ustar aliali/* SCCS Id: @(#)qt_clust.h 3.4 1999/11/19 */ /* Copyright (c) Warwick Allison, 1999. */ /* NetHack may be freely redistributed. See license for details. */ #ifndef clusterizer_H #define clusterizer_H #include class Clusterizer { public: Clusterizer(int maxclusters); ~Clusterizer(); void add(int x, int y); // 1x1 rectangle (point) void add(int x, int y, int w, int h); void add(const QRect& rect); void clear(); int clusters() { return count; } const QRect& operator[](int i); private: QRect* cluster; int count; const int max; }; #endif slashem-0.0.7E7F3/include/monflag.h0000664000076400007640000002453510545462317015104 0ustar aliali/* SCCS Id: @(#)monflag.h 3.4 1996/05/04 */ /* Copyright (c) 1989 Mike Threepoint */ /* NetHack may be freely redistributed. See license for details. */ #ifndef MONFLAG_H #define MONFLAG_H #define MS_SILENT 0 /* makes no sound */ #define MS_BARK 1 /* if full moon, may howl */ #define MS_MEW 2 /* mews or hisses */ #define MS_ROAR 3 /* roars */ #define MS_GROWL 4 /* growls */ #define MS_SQEEK 5 /* squeaks, as a rodent */ #define MS_SQAWK 6 /* squawks, as a bird */ #define MS_HISS 7 /* hisses */ #define MS_BUZZ 8 /* buzzes (killer bee) */ #define MS_GRUNT 9 /* grunts (or speaks own language) */ #define MS_NEIGH 10 /* neighs, as an equine */ #define MS_WAIL 11 /* wails, as a tortured soul */ #define MS_GURGLE 12 /* gurgles, as liquid or through saliva */ #define MS_BURBLE 13 /* burbles (jabberwock) */ #define MS_ANIMAL 13 /* up to here are animal noises */ #define MS_SHRIEK 15 /* wakes up others */ #define MS_BONES 16 /* rattles bones (skeleton) */ #define MS_LAUGH 17 /* grins, smiles, giggles, and laughs */ #define MS_MUMBLE 18 /* says something or other */ #define MS_IMITATE 19 /* imitates others (leocrotta) */ #define MS_ORC MS_GRUNT /* intelligent brutes */ #define MS_HUMANOID 20 /* generic traveling companion */ #ifdef KOPS #define MS_ARREST 21 /* "Stop in the name of the law!" (Kops) */ #endif #define MS_SOLDIER 22 /* army and watchmen expressions */ #define MS_GUARD 23 /* "Please drop that gold and follow me." */ #define MS_DJINNI 24 /* "Thank you for freeing me!" */ #define MS_NURSE 25 /* "Take off your shirt, please." */ #define MS_SEDUCE 26 /* "Hello, sailor." (Nymphs) */ #define MS_VAMPIRE 27 /* vampiric seduction, Vlad's exclamations */ #define MS_BRIBE 28 /* asks for money, or berates you */ #define MS_CUSS 29 /* berates (demons) or intimidates (Wiz) */ #define MS_RIDER 30 /* astral level special monsters */ #define MS_LEADER 31 /* your class leader */ #define MS_NEMESIS 32 /* your nemesis */ #define MS_GUARDIAN 33 /* your leader's guards */ #define MS_SELL 34 /* demand payment, complain about shoplifters */ #define MS_ORACLE 35 /* do a consultation */ #define MS_PRIEST 36 /* ask for contribution; do cleansing */ #define MS_SPELL 37 /* spellcaster not matching any of the above */ #define MS_WERE 38 /* lycanthrope in human form */ #define MS_BOAST 39 /* giants */ #define MS_GYPSY 40 /* gypsies */ #define MS_SHEEP 41 /* sheep */ #define MS_CHICKEN 42 /* chicken */ #define MS_COW 43 /* cows and bulls */ #define MS_PARROT 44 /* parrots */ #define MR_FIRE 0x01 /* resists fire */ #define MR_COLD 0x02 /* resists cold */ #define MR_SLEEP 0x04 /* resists sleep */ #define MR_DISINT 0x08 /* resists disintegration */ #define MR_ELEC 0x10 /* resists electricity */ #define MR_POISON 0x20 /* resists poison */ #define MR_ACID 0x40 /* resists acid */ #define MR_STONE 0x80 /* resists petrification */ /* other resistances: magic, sickness */ /* other conveyances: teleport, teleport control, telepathy */ /* individual resistances */ #define MR2_SEE_INVIS 0x0100 /* see invisible */ #define MR2_LEVITATE 0x0200 /* levitation */ #define MR2_WATERWALK 0x0400 /* water walking */ #define MR2_MAGBREATH 0x0800 /* magical breathing */ #define MR2_DISPLACED 0x1000 /* displaced */ #define MR2_STRENGTH 0x2000 /* gauntlets of power */ #define MR2_FUMBLING 0x4000 /* clumsy */ /* more type resistances */ #define MR_DEATH 0x00400000L /* resists death magic */ #define MR_DRAIN 0x00800000L /* resists level drain */ #define MR_PLUSONE 0x01000000L /* need +1 weapon to hit */ #define MR_PLUSTWO 0x02000000L /* need +2 weapon to hit */ #define MR_PLUSTHREE 0x04000000L /* need +3 weapon to hit */ #define MR_PLUSFOUR 0x08000000L /* need +4 weapon to hit */ /* Doesn't really belong under resistances, but ... */ #define MR_HITASONE 0x10000000L /* hits ceatures as +1 weapon */ #define MR_HITASTWO 0x20000000L /* hits ceatures as +2 weapon */ #define MR_HITASTHREE 0x40000000L /* hits ceatures as +3 weapon */ #define MR_HITASFOUR 0x80000000L /* hits ceatures as +4 weapon */ #define MR_TYPEMASK 0xFFC000FFL /* bits to take from mresists */ #define M1_FLY 0x00000001L /* can fly or float */ #define M1_SWIM 0x00000002L /* can traverse water */ #define M1_AMORPHOUS 0x00000004L /* can flow under doors */ #define M1_WALLWALK 0x00000008L /* can phase thru rock */ #define M1_CLING 0x00000010L /* can cling to ceiling */ #define M1_TUNNEL 0x00000020L /* can tunnel thru rock */ #define M1_NEEDPICK 0x00000040L /* needs pick to tunnel */ #define M1_CONCEAL 0x00000080L /* hides under objects */ #define M1_HIDE 0x00000100L /* mimics, blends in with ceiling */ #define M1_AMPHIBIOUS 0x00000200L /* can survive underwater */ #define M1_BREATHLESS 0x00000400L /* doesn't need to breathe */ #define M1_NOTAKE 0x00000800L /* cannot pick up objects */ #define M1_NOEYES 0x00001000L /* no eyes to gaze into or blind */ #define M1_NOHANDS 0x00002000L /* no hands to handle things */ #define M1_NOLIMBS 0x00006000L /* no arms/legs to kick/wear on */ #define M1_NOHEAD 0x00008000L /* no head to behead */ #define M1_MINDLESS 0x00010000L /* has no mind--golem, zombie, mold */ #define M1_HUMANOID 0x00020000L /* has humanoid head/arms/torso */ #define M1_ANIMAL 0x00040000L /* has animal body */ #define M1_SLITHY 0x00080000L /* has serpent body */ #define M1_UNSOLID 0x00100000L /* has no solid or liquid body */ #define M1_THICK_HIDE 0x00200000L /* has thick hide or scales */ #define M1_OVIPAROUS 0x00400000L /* can lay eggs */ #define M1_REGEN 0x00800000L /* regenerates hit points */ #define M1_SEE_INVIS 0x01000000L /* can see invisible creatures */ #define M1_TPORT 0x02000000L /* can teleport */ #define M1_TPORT_CNTRL 0x04000000L /* controls where it teleports to */ #define M1_ACID 0x08000000L /* acidic to eat */ #define M1_POIS 0x10000000L /* poisonous to eat */ #define M1_CARNIVORE 0x20000000L /* eats corpses */ #define M1_HERBIVORE 0x40000000L /* eats fruits */ #define M1_OMNIVORE 0x60000000L /* eats both */ #ifdef NHSTDC #define M1_METALLIVORE 0x80000000UL /* eats metal */ #else #define M1_METALLIVORE 0x80000000L /* eats metal */ #endif #define M2_NOPOLY 0x00000001L /* players mayn't poly into one */ #define M2_UNDEAD 0x00000002L /* is walking dead */ #define M2_MERC 0x00000004L /* is a guard or soldier */ #define M2_HUMAN 0x00000008L /* is a human */ #define M2_ELF 0x00000010L /* is an elf */ #define M2_DWARF 0x00000020L /* is a dwarf */ #define M2_GNOME 0x00000040L /* is a gnome */ #define M2_ORC 0x00000080L /* is an orc */ #define M2_HOBBIT 0x00000100L /* is a hobbit */ #define M2_WERE 0x00000200L /* is a lycanthrope */ #define M2_VAMPIRE 0x00000400L /* is a vampire */ #define M2_LORD 0x00000800L /* is a lord to its kind */ #define M2_PRINCE 0x00001000L /* is an overlord to its kind */ #define M2_MINION 0x00002000L /* is a minion of a deity */ #define M2_GIANT 0x00004000L /* is a giant */ #define M2_DEMON 0x00008000L /* is a demon */ #define M2_MALE 0x00010000L /* always male */ #define M2_FEMALE 0x00020000L /* always female */ #define M2_NEUTER 0x00040000L /* neither male nor female */ #define M2_PNAME 0x00080000L /* monster name is a proper name */ #define M2_HOSTILE 0x00100000L /* always starts hostile */ #define M2_PEACEFUL 0x00200000L /* always starts peaceful */ #define M2_DOMESTIC 0x00400000L /* can be tamed by feeding */ #define M2_WANDER 0x00800000L /* wanders randomly */ #define M2_STALK 0x01000000L /* follows you to other levels */ #define M2_NASTY 0x02000000L /* extra-nasty monster (more xp) */ #define M2_STRONG 0x04000000L /* strong (or big) monster */ #define M2_ROCKTHROW 0x08000000L /* throws boulders */ #define M2_GREEDY 0x10000000L /* likes gold */ #define M2_JEWELS 0x20000000L /* likes gems */ #define M2_COLLECT 0x40000000L /* picks up weapons and food */ #ifdef NHSTDC #define M2_MAGIC 0x80000000UL /* picks up magic items */ #else #define M2_MAGIC 0x80000000L /* picks up magic items */ #endif #define M3_WANTSAMUL 0x0001 /* would like to steal the amulet */ #define M3_WANTSBELL 0x0002 /* wants the bell */ #define M3_WANTSBOOK 0x0004 /* wants the book */ #define M3_WANTSCAND 0x0008 /* wants the candelabrum */ #define M3_WANTSARTI 0x0010 /* wants the quest artifact */ #define M3_WANTSALL 0x001f /* wants any major artifact */ #define M3_WAITFORU 0x0040 /* waits to see you or get attacked */ #define M3_CLOSE 0x0080 /* lets you close unless attacked */ #define M3_COVETOUS 0x001f /* wants something */ #define M3_WAITMASK 0x00c0 /* waiting... */ /* Infravision is currently implemented for players only */ #define M3_INFRAVISION 0x0100 /* has infravision */ #define M3_INFRAVISIBLE 0x0200 /* visible by infravision */ /* [DS] Lethe */ #define M3_TRAITOR 0x0400L /* Capable of treachery */ #define M3_NOTAME 0x0800L /* Cannot be tamed */ #define MZ_TINY 0 /* < 2' */ #define MZ_SMALL 1 /* 2-4' */ #define MZ_MEDIUM 2 /* 4-7' */ #define MZ_HUMAN MZ_MEDIUM /* human-sized */ #define MZ_LARGE 3 /* 7-12' */ #define MZ_HUGE 4 /* 12-25' */ #define MZ_GIGANTIC 7 /* off the scale */ /* Monster races -- must stay within ROLE_RACEMASK */ /* Eventually this may become its own field */ #define MH_HUMAN M2_HUMAN #define MH_ELF M2_ELF #define MH_DWARF M2_DWARF #define MH_GNOME M2_GNOME #define MH_ORC M2_ORC #define MH_HOBBIT M2_HOBBIT #define MH_WERE M2_WERE #define MH_VAMPIRE M2_VAMPIRE /* for mons[].geno (constant during game) */ #define G_VLGROUP 0x2000 /* appear in very large groups normally */ #define G_UNIQ 0x1000 /* generated only once */ #define G_NOHELL 0x0800 /* not generated in "hell" */ #define G_HELL 0x0400 /* generated only in "hell" */ #define G_NOGEN 0x0200 /* generated only specially */ #define G_SGROUP 0x0080 /* appear in small groups normally */ #define G_LGROUP 0x0040 /* appear in large groups normally */ #define G_GENO 0x0020 /* can be genocided */ #define G_NOCORPSE 0x0010 /* no corpse left ever */ #define G_FREQ 0x0007 /* creation frequency mask */ /* for mvitals[].mvflags (variant during game), along with G_NOCORPSE */ #define G_KNOWN 0x0004 /* have been encountered */ #define G_GONE (G_GENOD|G_EXTINCT) #define G_GENOD 0x0002 /* have been genocided */ #define G_EXTINCT 0x0001 /* have been extinguished as population control */ #define MV_KNOWS_EGG 0x0008 /* player recognizes egg of this monster type */ /* Additional flag for mkclass() */ #define MKC_ULIMIT 0x10000 /* place an upper limit on difficulty of generated monster */ #endif /* MONFLAG_H */ slashem-0.0.7E7F3/include/proxycb.h0000664000076400007640000000466210545462317015146 0ustar aliali/* $Id: proxycb.h,v 1.16 2003/10/25 18:06:00 j_ali Exp $ */ /* Copyright (c) Slash'EM Development Team 2001-2003 */ /* NetHack may be freely redistributed. See license for details. */ #ifndef PROXYCB_H #define PROXYCB_H extern void NDECL(proxy_cb_display_inventory); extern int FDECL(proxy_cb_dlbh_fopen, (const char *, const char *)); extern char *FDECL(proxy_cb_dlbh_fgets, (char *, int, int)); extern int FDECL(proxy_cb_dlbh_fread, (char *, int, int, int)); extern int FDECL(proxy_cb_dlbh_fwrite, (char *, int, int, int)); extern int FDECL(proxy_cb_dlbh_fclose, (int)); extern char *FDECL(proxy_cb_dlbh_fmd5sum, (const char *)); extern void NDECL(proxy_cb_flush_screen); extern void NDECL(proxy_cb_doredraw); extern void FDECL(proxy_cb_interface_mode, (unsigned long)); extern int FDECL(proxy_cb_parse_options, (char *)); extern char *FDECL(proxy_cb_get_option, (char *)); extern struct proxycb_get_player_choices_res *NDECL(proxy_cb_get_player_choices); extern void FDECL(proxy_cb_free_player_choices, (struct proxycb_get_player_choices_res *choices)); extern struct proxycb_get_valid_selections_res *NDECL(proxy_cb_get_valid_selections); extern void FDECL(proxy_cb_free_valid_selections, (struct proxycb_get_valid_selections_res *vs)); extern void NDECL(proxy_cb_valid_selection_open); extern int FDECL(proxy_cb_valid_selection_check, (int, int, int, int)); extern void NDECL(proxy_cb_valid_selection_close); extern void NDECL(proxy_cb_quit_game); extern void NDECL(proxy_cb_display_score); extern void NDECL(proxy_cb_doset); extern struct proxycb_get_extended_commands_res *NDECL(proxy_cb_get_extended_commands); extern void FDECL(proxy_cb_free_extended_commands, (struct proxycb_get_extended_commands_res *commands)); extern int FDECL(proxy_cb_map_menu_cmd, (int)); extern int FDECL(proxy_cb_get_standard_winid, (char *)); extern struct proxycb_get_tilesets_res *NDECL(proxy_cb_get_tilesets); extern void FDECL(proxy_cb_free_tilesets, (struct proxycb_get_tilesets_res *tilesets)); extern struct proxycb_get_glyph_mapping_res *NDECL(proxy_cb_get_glyph_mapping); extern void FDECL(proxy_cb_free_glyph_mapping, (struct proxycb_get_glyph_mapping_res *mapping)); extern struct proxycb_get_extensions_res *NDECL(proxy_cb_get_extensions); extern void FDECL(proxy_cb_free_extensions, (struct proxycb_get_extensions_res *extensions)); extern unsigned long *FDECL(proxy_cb_start_async_mode, (int, unsigned long *async_callbacks, int *)); #endif /* PROXYCB_H */ slashem-0.0.7E7F3/include/micro.h0000664000076400007640000000072110545462317014561 0ustar aliali/* 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. */ #ifndef MICRO_H #define MICRO_H extern const char *alllevels, *allbones; extern char levels[], bones[], permbones[], hackdir[]; extern int ramdisk; #ifndef C #define C(c) (0x1f & (c)) #endif #ifndef M #define M(c) (((char)0x80) | (c)) #endif #define ABORT C('a') #endif /* MICRO_H */ slashem-0.0.7E7F3/include/dungeon.h0000664000076400007640000001570110545462317015113 0ustar aliali/* 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. */ #ifndef DUNGEON_H #define DUNGEON_H typedef struct d_flags { /* dungeon/level type flags */ Bitfield(town, 1); /* is this a town? (levels only) */ Bitfield(hellish, 1); /* is this part of hell? */ Bitfield(maze_like, 1); /* is this a maze? */ Bitfield(rogue_like, 1); /* is this an old-fashioned presentation? */ Bitfield(align, 3); /* dungeon alignment. */ Bitfield(unused, 1); /* etc... */ } d_flags; typedef struct d_level { /* basic dungeon level element */ xchar dnum; /* dungeon number */ xchar dlevel; /* level number */ } d_level; typedef struct s_level { /* special dungeon level element */ struct s_level *next; d_level dlevel; /* dungeon & level numbers */ char proto[15]; /* name of prototype file (eg. "tower") */ char boneid; /* character to id level in bones files */ uchar rndlevs; /* no. of randomly available similar levels */ d_flags flags; /* type flags */ } s_level; typedef struct stairway { /* basic stairway identifier */ xchar sx, sy; /* x / y location of the stair */ d_level tolev; /* where does it go */ char up; /* what type of stairway (up/down) */ } stairway; /* level region types */ #define LR_DOWNSTAIR 0 #define LR_UPSTAIR 1 #define LR_PORTAL 2 #define LR_BRANCH 3 #define LR_TELE 4 #define LR_UPTELE 5 #define LR_DOWNTELE 6 typedef struct dest_area { /* non-stairway level change indentifier */ xchar lx, ly; /* "lower" left corner (near [0,0]) */ xchar hx, hy; /* "upper" right corner (near [COLNO,ROWNO]) */ xchar nlx, nly; /* outline of invalid area */ xchar nhx, nhy; /* opposite corner of invalid area */ } dest_area; typedef struct dungeon { /* basic dungeon identifier */ char dname[24]; /* name of the dungeon (eg. "Hell") */ char proto[15]; /* name of prototype file (eg. "tower") */ char boneid; /* character to id dungeon in bones files */ d_flags flags; /* dungeon flags */ xchar entry_lev; /* entry level */ xchar num_dunlevs; /* number of levels in this dungeon */ xchar dunlev_ureached; /* how deep you have been in this dungeon */ int ledger_start, /* the starting depth in "real" terms */ depth_start; /* the starting depth in "logical" terms */ } dungeon; /* * A branch structure defines the connection between two dungeons. They * will be ordered by the dungeon number/level number of 'end1'. Ties * are resolved by 'end2'. 'Type' uses 'end1' arbitrarily as the primary * point. */ typedef struct branch { struct branch *next; /* next in the branch chain */ int id; /* branch identifier */ int type; /* type of branch */ d_level end1; /* "primary" end point */ d_level end2; /* other end point */ boolean end1_up; /* does end1 go up? */ } branch; /* branch types */ #define BR_STAIR 0 /* "Regular" connection, 2 staircases. */ #define BR_NO_END1 1 /* "Regular" connection. However, no stair from */ /* end1 to end2. There is a stair from end2 */ /* to end1. */ #define BR_NO_END2 2 /* "Regular" connection. However, no stair from */ /* end2 to end1. There is a stair from end1 */ /* to end2. */ #define BR_PORTAL 3 /* Connection by magic portals (traps) */ /* A particular dungeon contains num_dunlevs d_levels with dlevel 1.. * num_dunlevs. Ledger_start and depth_start are bases that are added * to the dlevel of a particular d_level to get the effective ledger_no * and depth for that d_level. * * Ledger_no is a bookkeeping number that gives a unique identifier for a * particular d_level (for level.?? files, e.g.). * * Depth corresponds to the number of floors below the surface. */ #define Is_astralevel(x) (on_level(x, &astral_level)) #define Is_earthlevel(x) (on_level(x, &earth_level)) #define Is_waterlevel(x) (on_level(x, &water_level)) #define Is_firelevel(x) (on_level(x, &fire_level)) #define Is_airlevel(x) (on_level(x, &air_level)) #define Is_medusa_level(x) (on_level(x, &medusa_level)) #define Is_oracle_level(x) (on_level(x, &oracle_level)) #define Is_valley(x) (on_level(x, &valley_level)) #define Is_juiblex_level(x) (on_level(x, &juiblex_level)) #define Is_asmo_level(x) (on_level(x, &asmodeus_level)) #define Is_baal_level(x) (on_level(x, &baalzebub_level)) #define Is_wiz1_level(x) (on_level(x, &wiz1_level)) #define Is_wiz2_level(x) (on_level(x, &wiz2_level)) #define Is_wiz3_level(x) (on_level(x, &wiz3_level)) #define Is_sanctum(x) (on_level(x, &sanctum_level)) #define Is_portal_level(x) (on_level(x, &portal_level)) #define Is_rogue_level(x) (on_level(x, &rogue_level)) #define Is_stronghold(x) (on_level(x, &stronghold_level)) #define Is_bigroom(x) (on_level(x, &bigroom_level)) #define Is_demogorgon_level(x) (on_level(x, &demogorgon_level)) #define Is_yeenoghu_level(x) (on_level(x, &yeenoghu_level)) #define Is_geryon_level(x) (on_level(x, &geryon_level)) #define Is_dispater_level(x) (on_level(x, &dispater_level)) #define Is_lawful_quest(x) (on_level(x, &lawful_quest_level)) #define Is_neutral_quest(x) (on_level(x, &neutral_quest_level)) #define Is_chaotic_quest(x) (on_level(x, &chaotic_quest_level)) #define Is_aligned_quest(x) (Is_lawful_quest(x) || Is_neutral_quest(x) || \ Is_chaotic_quest(x)) #define Is_qstart(x) (on_level(x, &qstart_level)) #define Is_qlocate(x) (on_level(x, &qlocate_level)) #define Is_nemesis(x) (on_level(x, &nemesis_level)) #define Is_knox(x) (on_level(x, &knox_level)) #ifdef BLACKMARKET #define Is_blackmarket(x) (on_level(x, &blackmarket_level)) #endif /* BLACKMARKET */ #define In_sokoban(x) ((x)->dnum == sokoban_dnum) #define Inhell In_hell(&u.uz) /* now gehennom */ #define In_endgame(x) ((x)->dnum == astral_level.dnum) #define within_bounded_area(X,Y,LX,LY,HX,HY) \ ((X) >= (LX) && (X) <= (HX) && (Y) >= (LY) && (Y) <= (HY)) /* monster and object migration codes */ #define MIGR_NOWHERE (-1) /* failure flag for down_gate() */ #define MIGR_RANDOM 0 #define MIGR_APPROX_XY 1 /* approximate coordinates */ #define MIGR_EXACT_XY 2 /* specific coordinates */ #define MIGR_STAIRS_UP 3 #define MIGR_STAIRS_DOWN 4 #define MIGR_LADDER_UP 5 #define MIGR_LADDER_DOWN 6 #define MIGR_SSTAIRS 7 /* dungeon branch */ #define MIGR_PORTAL 8 /* magic portal */ #define MIGR_NEAR_PLAYER 9 /* mon: followers; obj: trap door */ /* level information (saved via ledger number) */ struct linfo { unsigned char flags; #define VISITED 0x01 /* hero has visited this level */ #define FORGOTTEN 0x02 /* hero will forget this level when reached */ #define LFILE_EXISTS 0x04 /* a level file exists for this level */ /* * Note: VISITED and LFILE_EXISTS are currently almost always set at the * same time. However they _mean_ different things. */ #ifdef MFLOPPY # define FROMPERM 1 /* for ramdisk use */ # define TOPERM 2 /* for ramdisk use */ # define ACTIVE 1 # define SWAPPED 2 int where; long time; long size; #endif /* MFLOPPY */ }; #endif /* DUNGEON_H */ slashem-0.0.7E7F3/include/align.h0000664000076400007640000000175610545462317014553 0ustar aliali/* 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. */ #ifndef ALIGN_H #define ALIGN_H typedef schar aligntyp; /* basic alignment type */ typedef struct align { /* alignment & record */ aligntyp type; int record; } align; /* bounds for "record" -- respect initial alignments of 10 */ #define ALIGNLIM (10L + (moves/200L)) #define A_NONE (-128) /* the value range of type */ #define A_CHAOTIC (-1) #define A_NEUTRAL 0 #define A_LAWFUL 1 #define A_COALIGNED 1 #define A_OPALIGNED (-1) #define AM_NONE 0 #define AM_CHAOTIC 1 #define AM_NEUTRAL 2 #define AM_LAWFUL 4 #define AM_MASK 7 #define AM_SPLEV_CO 3 #define AM_SPLEV_NONCO 7 #define Amask2align(x) ((aligntyp) ((!(x)) ? A_NONE \ : ((x) == AM_LAWFUL) ? A_LAWFUL : ((int)x) - 2)) #define Align2amask(x) (((x) == A_NONE) ? AM_NONE \ : ((x) == A_LAWFUL) ? AM_LAWFUL : (x) + 2) #endif /* ALIGN_H */ slashem-0.0.7E7F3/include/trampoli.h0000664000076400007640000002032010545462317015274 0ustar aliali/* 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. */ #ifndef TRAMPOLI_H #define TRAMPOLI_H #ifdef USE_TRAMPOLI /* ### apply.c ### */ #define dig() dig_() #define doapply() doapply_() #define dojump() dojump_() #define dorub() dorub_() /* ### artifact.c ### */ #define doinvoke() doinvoke_() /* ### cmd.c ### */ #define doextcmd() doextcmd_() #define doextlist() doextlist_() #define domonability() domonability_() #ifdef POLYSELF #define polyatwill() polyatwill_() #endif /* POLYSELF */ #define playersteal() playersteal_() #ifdef EXPLORE_MODE #define enter_explore_mode() enter_explore_mode_() #endif /* EXPLORE MODE */ #define doprev_message() doprev_message_() #define timed_occupation() timed_occupation_() #define wiz_attributes() wiz_attributes_() #ifdef WIZARD #define wiz_detect() wiz_detect_() #define wiz_genesis() wiz_genesis_() #define wiz_identify() wiz_identify_() #define wiz_level_tele() wiz_level_tele_() #define wiz_map() wiz_map_() #define wiz_where() wiz_where_() #define wiz_wish() wiz_wish_() #endif /* ### display.c ### */ #define doredraw() doredraw_() /* ### do.c ### */ #define doddrop() doddrop_() #define dodown() dodown_() #define dodrop() dodrop_() #define donull() donull_() #define doup() doup_() #define dowipe() dowipe_() #define drop(x) drop_(x) #define wipeoff() wipeoff_() /* ### do_name.c ### */ #define ddocall() ddocall_() #define do_mname() do_mname_() /* ### do_wear.c ### */ #define Armor_off() Armor_off_() #define Boots_off() Boots_off_() #define Gloves_off() Gloves_off_() #define Helmet_off() Helmet_off_() #define Armor_on() Armor_on_() #define Boots_on() Boots_on_() #define Gloves_on() Gloves_on_() #define Helmet_on() Helmet_on_() #define doddoremarm() doddoremarm_() #define doputon() doputon_() #define doremring() doremring_() #define dotakeoff() dotakeoff_() #define dowear() dowear_() #define select_off(x) select_off_(x) #define take_off() take_off_() /* ### dogmove.c ### */ #define wantdoor(x, y, dummy) wantdoor_(x, y, dummy) /* ### dokick.c ### */ #define dokick() dokick_() /* ### dothrow.c ### */ #define dothrow() dothrow_() /* ### eat.c ### */ #define Hear_again() Hear_again_() #define eatmdone() eatmdone_() #define doeat() doeat_() #define eatfood() eatfood_() #define opentin() opentin_() #define unfaint() unfaint_() /* ### end.c ### */ #define done1(sig) done1_(sig) #define done2() done2_() #define done_intr(sig) done_intr_(sig) #if defined(UNIX) || defined (VMS) || defined(__EMX__) #define done_hangup(sig) done_hangup_(sig) #endif /* ### engrave.c ### */ #define doengrave() doengrave_() /* ### fountain.c ### */ #define gush(x, y, poolcnt) gush_(x, y, poolcnt) /* ### hack.c ### */ #define dopickup() dopickup_() #define identify(x) identify_(x) /* ### invent.c ### */ #define ckunpaid(x) ckunpaid_(x) #define ddoinv() ddoinv_() #define dolook() dolook_() #define dopramulet() dopramulet_() #define doprarm() doprarm_() #define doprgold() doprgold_() #define doprring() doprring_() #define doprtool() doprtool_() #define doprwep() doprwep_() #define dotypeinv() dotypeinv_() #define doorganize() doorganize_() /* ### ioctl.c ### */ #ifdef UNIX # ifdef SUSPEND #define dosuspend() dosuspend_() # endif /* SUSPEND */ #endif /* UNIX */ /* ### lock.c ### */ #define doclose() doclose_() #define doforce() doforce_() #define doopen() doopen_() #define forcelock() forcelock_() #define picklock() picklock_() /* ### mklev.c ### */ #define do_comp(x, y) comp_(x, y) /* ### mondata.c ### */ /* See comment in trampoli.c before uncommenting canseemon. */ /* #define canseemon(x) canseemon_(x) */ /* ### muse.c ### */ #define mbhitm(x, y) mbhitm_(x, y) /* ### o_init.c ### */ #define dodiscovered() dodiscovered_() /* ### objnam.c ### */ #define doname(x) doname_(x) #define xname(x) xname_(x) /* ### options.c ### */ #define doset() doset_() #define dotogglepickup() dotogglepickup_() /* ### pager.c ### */ #define dohelp() dohelp_() #define dohistory() dohistory_() #ifdef UNIX #define intruph() intruph_() #endif /* UNIX */ #define dowhatdoes() dowhatdoes_() #define dowhatis() dowhatis_() #define doquickwhatis() doquickwhatis_() /* ### pcsys.c ### */ #ifdef SHELL #define dosh() dosh_() #endif /* SHELL */ /* ### pickup.c ### */ #define ck_bag(x) ck_bag_(x) #define doloot() doloot_() #define in_container(x) in_container_(x) #define out_container(x) out_container_(x) /* ### potion.c ### */ #define dodrink() dodrink_() #define dodip() dodip_() /* ### pray.c ### */ #define doturn() doturn_() #define dopray() dopray_() #define prayer_done() prayer_done_() #define dosacrifice() dosacrifice_() /* ### read.c ### */ #define doread() doread_() #define set_lit(x, y, val) set_lit_(x, y, val) /* ### rip.c ### */ #define genl_outrip(tmpwin, how) genl_outrip_(tmpwin, how) /* ### save.c ### */ #define dosave() dosave_() #if defined(UNIX) || defined (VMS) || defined(__EMX__) #define hangup(sig) hangup_(sig) #endif /* ### search.c ### */ #define doidtrap() doidtrap_() #define dosearch() dosearch_() #define findone(zx, zy, num) findone_(zx, zy, num) #define openone(zx, zy, num) openone_(zx, zy, num) /* ### shk.c ### */ #define dopay() dopay_() /* ### sit.c ### */ #define dosit() dosit_() /* ### sounds.c ### */ #define dotalk() dotalk_() /* ### spell.c ### */ #define learn() learn_() #define docast() docast_() #define dovspell() dovspell_() /* ### steal.c ### */ #define stealarm() stealarm_() /* ### trap.c ### */ #define dotele() dotele_() #define dountrap() dountrap_() #define float_down() float_down_() /* ### version.c ### */ #define doversion() doversion_() #define doextversion() doextversion_() /* ### wield.c ### */ #define dowield() dowield_() /* ### zap.c ### */ #define bhitm(x, y) bhitm_(x, y) #define bhito(x, y) bhito_(x, y) #define dozap() dozap_() /* ### getline.c ### */ #define tty_getlin(x,y) tty_getlin_(x,y) #define tty_get_ext_cmd() tty_get_ext_cmd_() /* ### termcap.c ### */ #define tty_nhbell() tty_nhbell_() #define tty_number_pad(x) tty_number_pad_(x) #define tty_delay_output() tty_delay_output_() #define tty_start_screen() tty_start_screen_() #define tty_end_screen() tty_end_screen_() /* ### topl.c ### */ #define tty_doprev_message() tty_doprev_message_() #define tty_yn_function(x,y,z) tty_yn_function_(x,y,z) /* ### wintty.c ### */ #define tty_init_nhwindows(x,y) tty_init_nhwindows_(x,y) #define tty_player_selection() tty_player_selection_() #define tty_askname() tty_askname_() #define tty_get_nh_event() tty_get_nh_event_() #define tty_exit_nhwindows(x) tty_exit_nhwindows_(x) #define tty_suspend_nhwindows(x) tty_suspend_nhwindows_(x) #define tty_resume_nhwindows() tty_resume_nhwindows_() #define tty_create_nhwindow(x) tty_create_nhwindow_(x) #define tty_clear_nhwindow(x) tty_clear_nhwindow_(x) #define tty_display_nhwindow(x,y) tty_display_nhwindow_(x,y) #define tty_destroy_nhwindow(x) tty_destroy_nhwindow_(x) #define tty_curs(x,y,z) tty_curs_(x,y,z) #define tty_putstr(x,y,z) tty_putstr_(x,y,z) #ifdef FILE_AREAS #define tty_display_file(x,y,z) tty_display_file_(x,y,z) #else #define tty_display_file(x,y) tty_display_file_(x,y) #endif #define tty_start_menu(x) tty_start_menu_(x) #define tty_add_menu(a,b,c,d,e,f,g,h) tty_add_menu_(a,b,c,d,e,f,g,h) #define tty_end_menu(a,b) tty_end_menu_(a,b) #define tty_select_menu(a,b,c) tty_select_menu_(a,b,c) #define tty_update_inventory() tty_update_inventory_() #define tty_mark_synch() tty_mark_synch_() #define tty_wait_synch() tty_wait_synch_() #ifdef CLIPPING #define tty_cliparound(x,y) tty_cliparound_(x,y) #endif #ifdef POSITIONBAR #define tty_update_positionbar(x) tty_update_positionbar_(x) #endif #define tty_print_glyph(a,b,c,d) tty_print_glyph_(a,b,c,d) #define tty_raw_print(x) tty_raw_print_(x) #define tty_raw_print_bold(x) tty_raw_print_bold_(x) #define tty_nhgetch() tty_nhgetch_() #define tty_nh_poskey(x,y,z) tty_nh_poskey_(x,y,z) #endif /* USE_TRAMPOLI */ #endif /* TRAMPOLI_H */ slashem-0.0.7E7F3/include/patchlevel.h0000664000076400007640000000262110545462317015600 0ustar aliali/* SCCS Id: @(#)patchlevel.h 3.4 2003/12/06 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ /*The name of the compiled game- should be same as stuff in makefile*/ /*for makedefs*/ /* KMH -- Made it mixed case, from which upper & lower case versions are made */ #define DEF_GAME_NAME "SlashEM" /*#define DEF_GAME_NAME "NetHack"*/ /* Version */ #define VERSION_MAJOR 0 #define VERSION_MINOR 0 /* * PATCHLEVEL is updated for each release. */ #define PATCHLEVEL 7 #define EDITLEVEL 7 #define FIXLEVEL 3 #define COPYRIGHT_BANNER_A \ "This is SuperLotsoAddedStuffHack-Extended Magic 1997-2006" #define COPYRIGHT_BANNER_B \ "NetHack, Copyright 1985-2003 Stichting Mathematisch Centrum, M. Stephenson." #define COPYRIGHT_BANNER_C \ "See license for details. Bug reports to slashem-discuss@lists.sourceforge.net" #if 1 /* * If two or more successive releases have compatible data files, define * this with the version number of the oldest such release so that the * new release will accept old save and bones files. The format is * 0xMMmmPPeeL * 0x = literal prefix "0x", MM = major version, mm = minor version, * PP = patch level, ee = edit level, L = literal suffix "L", * with all four numbers specified as two hexadecimal digits. */ #define VERSION_COMPATIBILITY 0x00000702L #endif /*patchlevel.h*/ slashem-0.0.7E7F3/include/config.h0000664000076400007640000004027710545462317014727 0ustar aliali/* SCCS Id: @(#)config.h 3.4 2003/12/06 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #ifndef CONFIG_H /* make sure the compiler does not see the typedefs twice */ #define CONFIG_H #undef SHORT_FILENAMES /*#define DEBUG*/ /*#define DDEBUG*/ /*#define MONITOR_HEAP*/ #if defined(MONITOR_HEAP) && (defined(UNIX) || defined(WIN32)) #define INTERNAL_MALLOC /* Use internal malloc implementation */ #endif /* * Section 1: Operating and window systems selection. * Select the version of the OS you are using. * For "UNIX" select BSD, ULTRIX, SYSV, or HPUX in unixconf.h. * A "VMS" option is not needed since the VMS C-compilers * provide it (no need to change sec#1, vmsconf.h handles it). */ #define UNIX /* delete if no fork(), exec() available */ /* #define MSDOS */ /* in case it's not auto-detected */ /* #define OS2 */ /* in case it's not auto-detected */ /* #define TOS */ /* define for Atari ST/TT */ /* #define STUPID */ /* avoid some complicated expressions if your C compiler chokes on them */ /* #define MINIMAL_TERM */ /* if a terminal handles highlighting or tabs poorly, try this define, used in pager.c and termcap.c */ /* #define ULTRIX_CC20 */ /* define only if using cc v2.0 on a DECstation */ /* #define ULTRIX_PROTO */ /* define for Ultrix 4.0 (or higher) on a DECstation; * if you get compiler errors, don't define this. */ /* Hint: if you're not developing code, don't define ULTRIX_PROTO. */ #include "config1.h" /* should auto-detect MSDOS, MAC, AMIGA, WIN32 and OS2 */ /* Windowing systems... * Define all of those you want supported in your binary. * Some combinations make no sense. See the installation document. */ #define TTY_GRAPHICS /* good old tty based graphics */ /* #define X11_GRAPHICS */ /* X11 interface */ /* #define QT_GRAPHICS */ /* Qt Interface */ /* #define KDE */ /* KDE Interface */ /* #define GTK_GRAPHICS */ /* GTK Interface */ /* #define GNOME_GRAPHICS */ /* Gnome interface */ /* #define PROXY_GRAPHICS */ /* Plug-in interfaces */ /* #define MSWIN_GRAPHICS */ /* Windows NT, CE, Graphics */ /* #define GL_GRAPHICS */ /* OpenGL graphics */ /* #define SDL_GRAPHICS */ /* Software SDL graphics */ /* * Define the default window system. This should be one that is compiled * into your system (see defines above). Known window systems are: * * tty, X11, mac, amii, BeOS, Qt, Gem, Gnome, gtk, proxy, GL, SDL */ /* MAC also means MAC windows */ #ifdef MAC # ifndef AUX # define DEFAULT_WINDOW_SYS "Mac" # endif #endif /* Amiga supports AMII_GRAPHICS and/or TTY_GRAPHICS */ #ifdef AMIGA # define AMII_GRAPHICS /* (optional) */ # define DEFAULT_WINDOW_SYS "amii" /* "amii", "amitile" or "tty" */ #endif #if 0 /* Removed in 3.3.0 */ /* Windows NT supports TTY_GRAPHICS */ #ifdef WIN32 # define DEFAULT_WINDOW_SYS "tty" #endif #endif /* Atari supports GEM_GRAPHICS and/or TTY_GRAPHICS */ #ifdef TOS # define GEM_GRAPHICS /* Atari GEM interface (optional) */ # define DEFAULT_WINDOW_SYS "Gem" /* "Gem" or "tty" */ #endif #ifdef __BEOS__ #define BEOS_GRAPHICS /* (optional) */ #define DEFAULT_WINDOW_SYS "BeOS" /* "tty" */ #ifndef HACKDIR /* override the default hackdir below */ # define HACKDIR "/boot/apps/NetHack" #endif #endif #ifdef QT_GRAPHICS # define DEFAULT_WC_TILED_MAP /* Default to tiles if users doesn't say wc_ascii_map */ # define USER_SOUNDS /* Use sounds */ # ifndef __APPLE__ # define USER_SOUNDS_REGEX # endif # define USE_XPM /* Use XPM format for images (required) */ # define GRAPHIC_TOMBSTONE /* Use graphical tombstone (rip.xpm) */ # ifndef DEFAULT_WINDOW_SYS # define DEFAULT_WINDOW_SYS "Qt" # endif #endif #ifdef GNOME_GRAPHICS # define USE_XPM /* Use XPM format for images (required) */ # define GRAPHIC_TOMBSTONE /* Use graphical tombstone (rip.ppm) */ # ifndef DEFAULT_WINDOW_SYS # define DEFAULT_WINDOW_SYS "Gnome" # endif #endif #ifdef GTK_GRAPHICS # define USE_XPM /* Use XPM format for images (required) */ # define GRAPHIC_TOMBSTONE /* Use graphical tombstone (rip.xpm) */ /* # define GTK_PROXY */ /* Build for proxy interface */ # ifndef DEFAULT_WINDOW_SYS # define DEFAULT_WINDOW_SYS "gtk" # endif #endif #ifdef PROXY_GRAPHICS # define USE_XPM /* Use XPM format for images */ /* * The proxy interface shouldn't be used as the default window system. * This will cause it to always be initialized with undesirable side * effects. Instead, use the windowtype option. --ALI */ #endif #ifdef MSWIN_GRAPHICS # ifndef DEFAULT_WINDOW_SYS # define DEFAULT_WINDOW_SYS "mswin" # endif # define HACKDIR "\\nethack" #endif #ifdef GL_GRAPHICS # ifndef DEFAULT_WINDOW_SYS # define DEFAULT_WINDOW_SYS "GL" # endif #endif #ifdef SDL_GRAPHICS # ifndef DEFAULT_WINDOW_SYS # define DEFAULT_WINDOW_SYS "SDL" # endif #endif #if defined(GL_GRAPHICS) || defined(SDL_GRAPHICS) # define GRAPHIC_TOMBSTONE /* Use graphical tombstone */ /* -AJA- workaround for clash with ZLIB headers */ # if defined(VANILLA_GLHACK) # define compress nh_compress # define uncompress nh_uncompress # endif #endif #ifdef X11_GRAPHICS /* * There are two ways that X11 tiles may be defined. (1) using a custom * format loaded by NetHack code, or (2) using the XPM format loaded by * the free XPM library. The second option allows you to then use other * programs to generate tiles files. For example, the PBMPlus tools * would allow: * xpmtoppm x11tiles_big.xpm */ /* # define USE_XPM */ /* Disable if you do not have the XPM library */ # ifdef USE_XPM # define GRAPHIC_TOMBSTONE /* Use graphical tombstone (rip.xpm) */ # endif # ifndef DEFAULT_WINDOW_SYS # define DEFAULT_WINDOW_SYS "X11" # endif #endif #ifndef DEFAULT_WINDOW_SYS # define DEFAULT_WINDOW_SYS "tty" #endif /* * Section 2: Some global parameters and filenames. * Commenting out WIZARD, LOGFILE, NEWS or PANICLOG removes that * feature from the game; otherwise set the appropriate wizard * name. LOGFILE, NEWS and PANICLOG refer to files in the * playground. */ #ifndef WIZARD /* allow for compile-time or Makefile changes */ # ifndef KR1ED # define WIZARD "wizard" /* the person allowed to use the -D option */ # else # define WIZARD # define WIZARD_NAME "wizard" # endif #endif #define LOGFILE "logfile" /* larger file for debugging purposes */ #define LOGAREA FILE_AREA_VAR #define NEWS "news" /* the file containing the latest hack news */ #define NEWS_AREA FILE_AREA_SHARE #define PANICLOG "paniclog" /* log of panic and impossible events */ /* * If COMPRESS is defined, it should contain the full path name of your * 'compress' program. Defining INTERNAL_COMP causes NetHack to do * simpler byte-stream compression internally. Both COMPRESS and * INTERNAL_COMP create smaller bones/level/save files, but require * additional code and time. Currently, only UNIX fully implements * COMPRESS; other ports should be able to uncompress save files a * la unixmain.c if so inclined. * If you define COMPRESS, you must also define COMPRESS_EXTENSION * as the extension your compressor appends to filenames after * compression. */ #ifdef UNIX /* path and file name extension for compression program */ # define COMPRESS "/usr/bin/compress" /* Lempel-Ziv compression */ # define COMPRESS_EXTENSION ".Z" /* compress's extension */ /* An example of one alternative you might want to use: */ /* # define COMPRESS "/usr/local/bin/gzip" */ /* FSF gzip compression */ /* # define COMPRESS_EXTENSION ".gz" */ /* normal gzip extension */ /* # define COMPRESS "/usr/bin/bzip2" *//* bzip2 compression */ /* # define COMPRESS_EXTENSION ".bz2" *//* bzip2 extension */ #endif #ifndef COMPRESS # define INTERNAL_COMP /* control use of NetHack's compression routines */ #endif /* * Data librarian. Defining DLB places most of the support files into * a tar-like file, thus making a neater installation. See *conf.h * for detailed configuration. */ /* #define DLB */ /* not supported on all platforms */ /* * Defining INSURANCE slows down level changes, but allows games that * died due to program or system crashes to be resumed from the point * of the last level change, after running a utility program. */ #define INSURANCE /* allow crashed game recovery */ #ifndef MAC # define CHDIR /* delete if no chdir() available */ #endif #ifdef CHDIR /* * If you define HACKDIR, then this will be the default playground; * otherwise it will be the current directory. */ # ifndef HACKDIR # ifdef __APPLE__ # define HACKDIR "nethackdir" /* nethack directory */ # else # define HACKDIR "." # endif # endif /* * Some system administrators are stupid enough to make Hack suid root * or suid daemon, where daemon has other powers besides that of reading or * writing Hack files. In such cases one should be careful with chdir's * since the user might create files in a directory of his choice. * Of course SECURE is meaningful only if HACKDIR is defined. */ /* #define SECURE */ /* do setuid(getuid()) after chdir() */ /* * If it is desirable to limit the number of people that can play Hack * simultaneously, define HACKDIR, SECURE and MAX_NR_OF_PLAYERS. * #define MAX_NR_OF_PLAYERS 6 */ #endif /* CHDIR */ /* * Section 3: Definitions that may vary with system type. * For example, both schar and uchar should be short ints on * the AT&T 3B2/3B5/etc. family. */ /* * Uncomment the following line if your compiler doesn't understand the * 'void' type (and thus would give all sorts of compile errors without * this definition). */ /* #define NOVOID */ /* define if no "void" data type. */ /* * Uncomment the following line if your compiler falsely claims to be * a standard C compiler (i.e., defines __STDC__ without cause). * Examples are Apollo's cc (in some versions) and possibly SCO UNIX's rcc. */ /* #define NOTSTDC */ /* define for lying compilers */ #include "tradstdc.h" /* * type schar: small signed integers (8 bits suffice) (eg. TOS) * * typedef char schar; * * will do when you have signed characters; otherwise use * * typedef short int schar; */ #ifdef AZTEC # define schar char #else typedef signed char schar; #endif /* * type uchar: small unsigned integers (8 bits suffice - but 7 bits do not) * * typedef unsigned char uchar; * * will be satisfactory if you have an "unsigned char" type; * otherwise use * * typedef unsigned short int uchar; */ #ifndef _AIX32 /* identical typedef in system file causes trouble */ typedef unsigned char uchar; #endif #define RECORD_CONDUCT /* Record conduct challenges in logfile */ /* * Various structures have the option of using bitfields to save space. * If your C compiler handles bitfields well (e.g., it can initialize structs * containing bitfields), you can define BITFIELDS. Otherwise, the game will * allocate a separate character for each bitfield. (The bitfields used never * have more than 7 bits, and most are only 1 bit.) */ #define BITFIELDS /* Good bitfield handling */ /* #define STRNCMPI */ /* compiler/library has the strncmpi function */ /* * There are various choices for the NetHack vision system. There is a * choice of two algorithms with the same behavior. Defining VISION_TABLES * creates huge (60K) tables at compile time, drastically increasing data * size, but runs slightly faster than the alternate algorithm. (MSDOS in * particular cannot tolerate the increase in data size; other systems can * flip a coin weighted to local conditions.) * * If VISION_TABLES is not defined, things will be faster if you can use * MACRO_CPATH. Some cpps, however, cannot deal with the size of the * functions that have been macroized. */ /* WAC Can be defined under DJGPP, even though it's DOS*/ /*#define VISION_TABLES */ /* use vision tables generated at compile time */ #ifndef VISION_TABLES # ifndef NO_MACRO_CPATH # define MACRO_CPATH /* use clear_path macros instead of functions */ # endif #endif /* * Section 4: THE FUN STUFF!!! * * Conditional compilation of special options are controlled here. * If you define the following flags, you will add not only to the * complexity of the game but also to the size of the load module. */ /* dungeon features */ #define SINKS /* Kitchen sinks - Janet Walz */ #define LIGHT_SRC_SPELL /* WAC Light sourced spells (wac@intergate.bc.ca)*/ /* dungeon levels */ #define WALLIFIED_MAZE /* Fancy mazes - Jean-Christophe Collet */ /* #define REINCARNATION */ /* Special Rogue-like levels */ #define BLACKMARKET /* Massimo Campostrini (campo@sunthpi3.difi.unipi.it) */ /* monsters & objects */ #define KOPS /* Keystone Kops by Scott R. Turner */ #define SEDUCE /* Succubi/incubi seduction, by KAA, suggested by IM */ #define INVISIBLE_OBJECTS /* Not yet fully implemented */ #define UNPOLYPILE /* WAC -- Items can unpolymorph */ #define WALLET_O_P /* Perseus' Wallet, and all related code (tsanth@iname.com)*/ #define LIGHTSABERS #ifdef LIGHTSABERS # define D_SABER /* Enable WEAPON(dimsaber), and all related code (tsanth@iname.com)*/ #endif #define P_SPOON /* Enable WEPTOOL(spoon), and all related code (tsanth@iname.com)*/ #define FIREARMS /* KMH -- Guns and bullets */ #define EATEN_MEMORY /* WAC -- Remember which monsters have been eaten */ #define STEED /* The ability to ride monsters */ /* Roles */ #define DWARF /* Dwarf Patch, Osku Salerma (osku@iki.fi) */ #define TOURIST /* Tourist players with cameras and Hawaiian shirts */ #define YEOMAN /* KMH -- Yeoman class */ /* #define ZOUTHERN */ /* KMH -- Zoutherner class and its animals */ /* I/O */ #define REDO /* support for redoing last command - DGK */ #if !defined(MAC) # define CLIPPING /* allow smaller screens -- ERS */ #endif #ifdef TTY_GRAPHICS # define MENU_COLOR #endif #if defined(UNIX) #define USE_REGEX_MATCH /* if USE_REGEX_MATCH is defined, use regular expressions (GNU regex.h) * otherwise use pmatch() to match menu color lines. * pmatch() provides basic globbing: '*' and '?' wildcards. */ #endif /* difficulty */ #define ELBERETH /* Engraving the E-word repels monsters */ /* #define NOARTIFACTWISH */ /* No wishing for special artifacts -- swhite@cs.mun.ca */ /* #define NO_BONES */ /*Disables loading and saving bones levels*/ /* The following are best left disabled until their bugs are completely fixed */ /* User_sounds are sounds matches with messages. The messages are defined * in the player's .nethackrc using lines of the form: * * SOUND=MESG * * For example: * * SOUND=MESG "board beneath .....* squeaks" "squeak.au" 60 * * By default, the filenames are relative to the nethack install directory, * but this can be set in the .nethackrc via: * * SOUNDDIR= */ /* #define USER_SOUNDS */ /* Allow user-defined regex mappings from messages to sounds */ /* Only supported on Qt with NAS - Network Audio System */ #ifdef REDO # define DOAGAIN '\001' /* ^A, the "redo" key used in cmd.c and getline.c */ #endif #define EXP_ON_BOTL /* Show experience on bottom line */ /* #define SCORE_ON_BOTL */ /* added by Gary Erickson (erickson@ucivax) */ /* #define BORG */ /* Works only under DOS */ /* #define KEEP_SAVE */ /* Keep savefiles after Restore (wac@intergate.bc.ca)*/ /* #define CHARON */ /* Charon's boat, enables Cerebus - not implemented */ #define SHOW_DMG /* WAC made dmg reports optional (wac@intergate.bc.ca)*/ #define SHOW_WEIGHT /* [max] added display of object weight when picking up */ /* and in inventory (madmax@fly.cc.fer.hr). */ /* Originally added by zaga. */ #define OTHER_SERVICES /* shopkeeper services */ #define DUNGEON_GROWTH /* #define SHOUT */ /* JRN -- shouting and petcommands - not implemented */ #define DISPLAY_LAYERS /* Improved support for transparent tile sets - ALI */ /* * 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 */ /*#define AUTOPICKUP_EXCEPTIONS */ /* exceptions to autopickup */ /* End of Section 5 */ #include "global.h" /* Define everything else according to choices above */ #endif /* CONFIG_H */ slashem-0.0.7E7F3/include/proxycom.h0000664000076400007640000002512310545462317015333 0ustar aliali/* $Id: proxycom.h,v 1.17 2004/04/19 06:56:41 j_ali Exp $ */ /* Copyright (c) Slash'EM Development Team 2002-2004 */ /* NetHack may be freely redistributed. See license for details. */ #ifndef PROXYCOM_H #define PROXYCOM_H /* The NhExt standard to which we conform */ #define EXT_STANDARD_MAJOR 1 #define EXT_STANDARD_MINOR 0 #define EXT_STANDARD_MICRO 2 /* Not used in the code */ #define EXT_IM_STATUS 0x0001 #define EXT_IM_DISPLAY_LAYERS 0x0002 #define EXT_PARAM_INT 0x4001 #define EXT_PARAM_LONG 0x4002 #define EXT_PARAM_STRING 0x4003 #define EXT_PARAM_BYTES 0x4004 #define EXT_PARAM_BOOLEAN 0x4005 #define EXT_PARAM_CHAR 0x4006 #define EXT_PARAM_XDRF 0x4007 #define EXT_PARAM_PTR 0x8000 #define EXT_INT(i) EXT_PARAM_INT, i #define EXT_LONG(l) EXT_PARAM_LONG, l #define EXT_STRING(s) EXT_PARAM_STRING, (s) ? (s) : "" #define EXT_BYTES(buf,nb) EXT_PARAM_BYTES, buf, nb #define EXT_BOOLEAN(b) EXT_PARAM_BOOLEAN, b #define EXT_CHAR(c) EXT_PARAM_CHAR, c #define EXT_XDRF(func,data) EXT_PARAM_XDRF, func, data #define EXT_INT_P(i) EXT_PARAM_PTR | EXT_PARAM_INT, &(i) #define EXT_LONG_P(l) EXT_PARAM_PTR | EXT_PARAM_LONG, &(l) #define EXT_STRING_P(s) EXT_PARAM_PTR | EXT_PARAM_STRING, &(s) #define EXT_BYTES_P(buf,nb) EXT_PARAM_PTR | EXT_PARAM_BYTES, &(buf), &(nb) #define EXT_BOOLEAN_P(b) EXT_PARAM_PTR | EXT_PARAM_BOOLEAN, &(b) #define EXT_CHAR_P(c) EXT_PARAM_PTR | EXT_PARAM_CHAR, &(c) #define EXT_SPECIAL_ERROR 0 #define EXT_ERROR_UNSUPPORTED 1 #define EXT_ERROR_UNAVAILABLE 2 #define EXT_ERROR_INVALIDENCODING 3 #define EXT_ERROR_INVALIDPARAMS 4 #define EXT_ERROR_RESOURCEFAILURE 5 #define EXT_ERROR_GENERIC 0x100 #define EXT_ERROR_INTERNAL 0x101 #define EXT_ERROR_COMMS 0x102 #define EXT_ERROR_NOTSUPPORTED 0x103 #define EXT_ERROR_PROTOCOL 0x104 #ifdef NHXDR_H struct nhext_svc { unsigned short id; void FDECL((*handler), (unsigned short, NhExtXdr *, NhExtXdr *)); }; struct nhext_line { char *type; int n; char **tags, **values; }; typedef void FDECL((*nhext_errhandler), (int, const char *)); E int FDECL(nhext_init, (NhExtIO *, NhExtIO *, struct nhext_svc *)); E int FDECL(nhext_set_protocol, (int)); E int NDECL(nhext_async_mode); E void NDECL(nhext_end); E int FDECL(nhext_subprotocol0_write_line, (struct nhext_line *)); E void FDECL(nhext_subprotocol0_free_line, (struct nhext_line *)); E struct nhext_line *NDECL(nhext_subprotocol0_read_line); E char *FDECL(nhext_subprotocol0_get_failed_packet, (int *)); E nhext_errhandler FDECL(nhext_set_errhandler, (nhext_errhandler)); E int VDECL(nhext_rpc_params, (NhExtXdr *xdrs, int, ...)); E int VDECL(nhext_rpc, (unsigned short, ...)); E int FDECL(nhext_svc, (struct nhext_svc *)); E void FDECL(nhext_set_async_masks, (int, unsigned long *)); E void FDECL(nhext_set_unsupported, (int)); E unsigned short NDECL(nhext_rpc_get_next_serial); E unsigned short NDECL(nhext_svc_get_serial); E void FDECL(nhext_send_error, (unsigned short, unsigned char)); #endif /* NHXDR_H */ #define EXT_FID_INIT 0x01 #define EXT_FID_INIT_NHWINDOWS 0x02 #define EXT_FID_PLAYER_SELECTION 0x03 #define EXT_FID_ASKNAME 0x04 #define EXT_FID_GET_NH_EVENT 0x05 #define EXT_FID_EXIT_NHWINDOWS 0x06 #define EXT_FID_SUSPEND_NHWINDOWS 0x07 #define EXT_FID_RESUME_NHWINDOWS 0x08 #define EXT_FID_CREATE_NHWINDOW 0x09 #define EXT_FID_CLEAR_NHWINDOW 0x0A #define EXT_FID_DISPLAY_NHWINDOW 0x0B #define EXT_FID_DESTROY_NHWINDOW 0x0C #define EXT_FID_CURS 0x0D #define EXT_FID_PUTSTR 0x0E #define EXT_FID_DISPLAY_FILE 0x0F #define EXT_FID_START_MENU 0x10 #define EXT_FID_ADD_MENU 0x11 #define EXT_FID_END_MENU 0x12 #define EXT_FID_SELECT_MENU 0x13 #define EXT_FID_MESSAGE_MENU 0x14 #define EXT_FID_UPDATE_INVENTORY 0x15 #define EXT_FID_MARK_SYNC 0x16 #define EXT_FID_WAIT_SYNC 0x17 #define EXT_FID_CLIPAROUND 0x18 #define EXT_FID_UPDATE_POSITIONBAR 0x19 #define EXT_FID_PRINT_GLYPH 0x1A #define EXT_FID_RAW_PRINT 0x1B #define EXT_FID_RAW_PRINT_BOLD 0x1C #define EXT_FID_NHGETCH 0x1D #define EXT_FID_NH_POSKEY 0x1E #define EXT_FID_NHBELL 0x1F #define EXT_FID_DOPREV_MESSAGE 0x20 #define EXT_FID_YN_FUNCTION 0x21 #define EXT_FID_GETLIN 0x22 #define EXT_FID_GET_EXT_CMD 0x23 #define EXT_FID_NUMBER_PAD 0x24 #define EXT_FID_DELAY_OUTPUT 0x25 #define EXT_FID_CHANGE_COLOR 0x26 #define EXT_FID_CHANGE_BACKGROUND 0x27 #define EXT_FID_SET_FONT_NAME 0x28 #define EXT_FID_GET_COLOR_STRING 0x29 #define EXT_FID_START_SCREEN 0x2A #define EXT_FID_END_SCREEN 0x2B #define EXT_FID_OUTRIP 0x2C #define EXT_FID_PREFERENCE_UPDATE 0x2D #define EXT_FID_STATUS 0x2E #define EXT_FID_PRINT_GLYPH_LAYERED 0x2F #define EXT_FID_SEND_CONFIG_FILE 0x30 #ifdef NHXDR_H struct proxy_init_nhwindow_req { int argc; char **argv; }; struct proxy_init_nhwindow_res { nhext_xdr_bool_t inited; int argc; char **argv; int capc; char **capv; }; struct proxy_mi { int item; /* identifier */ long count; /* count */ }; struct proxy_select_menu_res { int retval; int n; struct proxy_mi *selected; }; struct proxy_status_req { int reconfig; int nv; const char **values; }; struct proxy_glyph_row { int start; int ng; int *glyphs; }; struct proxy_glyph_layer { int start; int nr; struct proxy_glyph_row *rows; }; struct proxy_print_glyph_layered_req { int window; int nl; struct proxy_glyph_layer *layers; }; E nhext_xdr_bool_t FDECL(proxy_xdr_init_nhwindow_req, (NhExtXdr *, struct proxy_init_nhwindow_req *)); E nhext_xdr_bool_t FDECL(proxy_xdr_init_nhwindow_res, (NhExtXdr *, struct proxy_init_nhwindow_res *)); E nhext_xdr_bool_t FDECL(proxy_xdr_proxy_mi, (NhExtXdr *, struct proxy_mi *)); E nhext_xdr_bool_t FDECL(proxy_xdr_select_menu_res, (NhExtXdr *, struct proxy_select_menu_res *)); E nhext_xdr_bool_t FDECL(proxy_xdr_status_req, (NhExtXdr *, struct proxy_status_req *)); E nhext_xdr_bool_t FDECL(proxy_xdr_print_glyph_layered_req, (NhExtXdr *, struct proxy_print_glyph_layered_req *)); #endif /* NHXDR_H */ #define EXT_CID_DISPLAY_INVENTORY 0x01 #define EXT_CID_DLBH_FOPEN 0x02 #define EXT_CID_DLBH_FGETS 0x03 #define EXT_CID_DLBH_FREAD 0x04 #define EXT_CID_DLBH_FWRITE 0x05 #define EXT_CID_DLBH_FCLOSE 0x06 #define EXT_CID_DLBH_FMD5SUM 0x07 #define EXT_CID_FLUSH_SCREEN 0x08 #define EXT_CID_DOREDRAW 0x09 #define EXT_CID_INTERFACE_MODE 0x0A #define EXT_CID_PARSE_OPTIONS 0x0B #define EXT_CID_GET_OPTION 0x0C #define EXT_CID_GET_PLAYER_CHOICES 0x0D #define EXT_CID_GET_VALID_SELECTIONS 0x0E #define EXT_CID_QUIT_GAME 0x0F #define EXT_CID_DISPLAY_SCORE 0x10 #define EXT_CID_DOSET 0x11 #define EXT_CID_GET_EXTENDED_COMMANDS 0x12 #define EXT_CID_MAP_MENU_CMD 0x13 #define EXT_CID_GET_STANDARD_WINID 0x14 #define EXT_CID_GET_TILESETS 0x15 #define EXT_CID_GET_GLYPH_MAPPING 0x16 #define EXT_CID_GET_EXTENSIONS 0x17 #define EXT_CID_SET_OPTION_MOD_STATUS 0x18 #ifdef NHXDR_H struct proxycb_dlbh_fmd5sum_res { int retval; const char *digest; }; struct proxycb_get_player_choices_res_role { const char *male; const char *female; }; struct proxycb_get_player_choices_res { int n_aligns; const char **aligns; int n_genders; const char **genders; int n_races; const char **races; int n_roles; struct proxycb_get_player_choices_res_role *roles; }; struct proxycb_get_valid_selections_res { int no_roles; int no_races; int no_aligns; int no_genders; int n_masks; unsigned long *masks; }; struct proxycb_get_extended_commands_res { int n_commands; const char **commands; }; struct proxycb_get_tilesets_res_tileset { const char *name; const char *file; const char *mapfile; unsigned long flags; }; struct proxycb_get_tilesets_res { int n_tilesets; struct proxycb_get_tilesets_res_tileset *tilesets; }; #define RGB_SYM(rgb, sym) ((rgb) << 8 | (sym)) #define RGBSYM_RGB(rgbsym) ((rgbsym) >> 8 & 0xFFFFFF) #define RGBSYM_SYM(rgbsym) ((rgbsym) & 0xFF) struct proxycb_get_glyph_mapping_res_symdef { long rgbsym; const char *description; }; struct proxycb_get_glyph_mapping_res_submapping { struct proxycb_get_glyph_mapping_res_symdef symdef; int n_glyphs; struct proxycb_get_glyph_mapping_res_symdef *glyphs; }; struct proxycb_get_glyph_mapping_res_mapping { const char *flags; int base_mapping; int alt_glyph; struct proxycb_get_glyph_mapping_res_symdef symdef; int n_submappings; struct proxycb_get_glyph_mapping_res_submapping *submappings; }; struct proxycb_get_glyph_mapping_res { int no_glyph; long transparent; int n_mappings; struct proxycb_get_glyph_mapping_res_mapping *mappings; }; struct proxycb_get_extensions_res_extension { const char *name; const char *version; int no_procedures; }; struct proxycb_get_extensions_res { int n_extensions; struct proxycb_get_extensions_res_extension *extensions; }; /* This structure is used for both the sub-protocol 2 init request and reply */ struct proxycb_subprot2_init { int n_masks; unsigned long *masks; }; extern nhext_xdr_bool_t FDECL(proxycb_xdr_get_player_choices_res_role, (NhExtXdr *, struct proxycb_get_player_choices_res_role *)); extern nhext_xdr_bool_t FDECL(proxycb_xdr_get_player_choices_res, (NhExtXdr *, struct proxycb_get_player_choices_res *)); extern nhext_xdr_bool_t FDECL(proxycb_xdr_get_valid_selections_res, (NhExtXdr *, struct proxycb_get_valid_selections_res *)); extern nhext_xdr_bool_t FDECL(proxycb_xdr_get_extended_commands_res, (NhExtXdr *, struct proxycb_get_extended_commands_res *)); extern nhext_xdr_bool_t FDECL(proxycb_xdr_get_tilesets_res_tileset, (NhExtXdr *, struct proxycb_get_tilesets_res_tileset *)); extern nhext_xdr_bool_t FDECL(proxycb_xdr_get_tilesets_res, (NhExtXdr *, struct proxycb_get_tilesets_res *)); extern nhext_xdr_bool_t FDECL(proxycb_xdr_get_glyph_mapping_res_symdef, (NhExtXdr *, struct proxycb_get_glyph_mapping_res_symdef *)); extern nhext_xdr_bool_t FDECL(proxycb_xdr_get_glyph_mapping_res_submapping, (NhExtXdr *, struct proxycb_get_glyph_mapping_res_submapping *)); extern nhext_xdr_bool_t FDECL(proxycb_xdr_get_glyph_mapping_res_mapping, (NhExtXdr *, struct proxycb_get_glyph_mapping_res_mapping *)); extern nhext_xdr_bool_t FDECL(proxycb_xdr_get_glyph_mapping_res, (NhExtXdr *, struct proxycb_get_glyph_mapping_res *)); extern nhext_xdr_bool_t FDECL(proxycb_xdr_get_extensions_res, (NhExtXdr *, struct proxycb_get_extensions_res *)); extern nhext_xdr_bool_t FDECL(proxycb_xdr_subprot2_init, (NhExtXdr *, struct proxycb_subprot2_init *)); #endif /* NHXDR_H */ /* riputil.c */ extern char * FDECL(get_killer_string, (int)); /* getopt.c */ extern char * FDECL(get_option, (const char *)); /* glyphmap.c */ extern void NDECL(set_glyph_mapping); extern struct proxycb_get_glyph_mapping_res * NDECL(get_glyph_mapping); extern void FDECL(free_glyph_mapping, (struct proxycb_get_glyph_mapping_res *)); #endif /* PROXYCOM_H */ slashem-0.0.7E7F3/include/nhlan.h0000664000076400007640000000231510545462317014551 0ustar aliali/* SCCS Id: @(#)nhlan.h 3.4 1997/04/12 */ /* Copyright (c) Michael Allison, 1997 */ /* NetHack may be freely redistributed. See license for details. */ #ifndef NHLAN_H #define NHLAN_H /* * Here are the LAN features currently implemented: * LAN_MAIL Mail facility allowing receipt and * reading of mail. * LAN_SHARED_BONES Allows bones files to be stored on a * network share. (Does NOT imply compatibiliy * between unlike platforms) */ # ifdef LAN_FEATURES # ifdef LAN_MAIL #define MAIL #ifndef WIN32 #define MAILCKFREQ 50 #else /* * WIN32 port does the real mail lookups in a separate thread * and the NetHack core code really just checks a flag, * so that part of it can be done more often. The throttle * for how often the mail thread should contact the mail * system is controlled by MAILTHREADFREQ and is expressed * in milliseconds. */ #define MAILCKFREQ 5 #define MAILTHREADFREQ 50000 #endif #ifndef MAX_BODY_SIZE #define MAX_BODY_SIZE 1024 #endif struct lan_mail_struct { char sender[120]; char subject[120]; boolean body_in_ram; /* TRUE means body in memory not file */ char filename[_MAX_PATH]; char body[MAX_BODY_SIZE]; }; # endif # endif /*LAN_FEATURES*/ #endif /*NHLAN_H*/ slashem-0.0.7E7F3/include/wingem.h0000664000076400007640000000713710545462317014746 0ustar aliali/* SCCS Id: @(#)wingem.h 3.4 1999/12/10 */ /* Copyright (c) Christian Bressler, 1999 */ /* NetHack may be freely redistributed. See license for details. */ #ifndef WINGEM_H #define WINGEM_H #define E extern /* menu structure */ typedef struct Gmi{ struct Gmi *Gmi_next; int Gmi_glyph; long Gmi_identifier; char Gmi_accelerator, Gmi_groupacc; int Gmi_attr; char *Gmi_str; long Gmi_count; int Gmi_selected; } Gem_menu_item; #define MAXWIN 20 /* maximum number of windows, cop-out */ extern struct window_procs Gem_procs; /* ### wingem1.c ### */ #ifdef CLIPPING E void NDECL(setclipped); #endif E void FDECL(docorner, (int, int)); E void NDECL(end_glyphout); E void FDECL(g_putch, (int)); E void NDECL(win_Gem_init); E int NDECL(mar_gem_init); E char NDECL(mar_ask_class); E char * NDECL(mar_ask_name); E int FDECL(mar_create_window, (int)); E void FDECL(mar_destroy_nhwindow, (int)); E void FDECL(mar_print_glyph, (int, int, int, int)); E void FDECL(mar_print_line, (int, int, int, char *)); E void FDECL(mar_set_message, (char *, char *, char *)); E Gem_menu_item *NDECL(mar_hol_inv); E void FDECL(mar_set_menu_type,(int)); E void NDECL(mar_reverse_menu); E void FDECL(mar_set_menu_title, (const char *)); E void NDECL(mar_set_accelerators); E void FDECL(mar_add_menu, (winid, Gem_menu_item *)); E void FDECL(mar_change_menu_2_text, (winid)); E void FDECL(mar_add_message, (const char *)); E void NDECL(mar_status_dirty); E int FDECL(mar_hol_win_type, (int)); E void NDECL(mar_clear_messagewin); E void FDECL(mar_set_no_glyph, (int)); E void NDECL(mar_map_curs_weiter); /* external declarations */ E void FDECL(Gem_init_nhwindows, (int *, char **)); E void NDECL(Gem_player_selection); E void NDECL(Gem_askname); E void NDECL(Gem_get_nh_event) ; E void FDECL(Gem_exit_nhwindows, (const char *)); E void FDECL(Gem_suspend_nhwindows, (const char *)); E void NDECL(Gem_resume_nhwindows); E winid FDECL(Gem_create_nhwindow, (int)); E void FDECL(Gem_clear_nhwindow, (winid)); E void FDECL(Gem_display_nhwindow, (winid, BOOLEAN_P)); E void FDECL(Gem_dismiss_nhwindow, (winid)); E void FDECL(Gem_destroy_nhwindow, (winid)); E void FDECL(Gem_curs, (winid,int,int)); E void FDECL(Gem_putstr, (winid, int, const char *)); E void FDECL(Gem_display_file, (const char *, BOOLEAN_P)); E void FDECL(Gem_start_menu, (winid)); E void FDECL(Gem_add_menu, (winid,int,const ANY_P *, CHAR_P,CHAR_P,int,const char *, BOOLEAN_P)); E void FDECL(Gem_end_menu, (winid, const char *)); E int FDECL(Gem_select_menu, (winid, int, MENU_ITEM_P **)); E char FDECL(Gem_message_menu, (CHAR_P,int,const char *)); E void NDECL(Gem_update_inventory); E void NDECL(Gem_mark_synch); E void NDECL(Gem_wait_synch); #ifdef CLIPPING E void FDECL(Gem_cliparound, (int, int)); #endif #ifdef POSITIONBAR E void FDECL(Gem_update_positionbar, (char *)); #endif E void FDECL(Gem_print_glyph, (winid,XCHAR_P,XCHAR_P,int)); E void FDECL(Gem_raw_print, (const char *)); E void FDECL(Gem_raw_print_bold, (const char *)); E int NDECL(Gem_nhgetch); E int FDECL(Gem_nh_poskey, (int *, int *, int *)); E void NDECL(Gem_nhbell); E int NDECL(Gem_doprev_message); E char FDECL(Gem_yn_function, (const char *, const char *, CHAR_P)); E void FDECL(Gem_getlin, (const char *,char *)); E int NDECL(Gem_get_ext_cmd); E void FDECL(Gem_number_pad, (int)); E void NDECL(Gem_delay_output); #ifdef CHANGE_COLOR E void FDECL(Gem_change_color,(int color,long rgb,int reverse)); E char * NDECL(Gem_get_color_string); #endif /* other defs that really should go away (they're tty specific) */ E void NDECL(Gem_start_screen); E void NDECL(Gem_end_screen); E void FDECL(genl_outrip, (winid,int)); #undef E #endif /* WINGEM_H */ slashem-0.0.7E7F3/include/os2conf.h0000664000076400007640000000527510545462317015032 0ustar aliali/* 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. */ #ifdef OS2 #ifndef OS2CONF_H #define OS2CONF_H /* * Compiler configuration. Compiler may be * selected either here or in Makefile.os2. */ /* #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 */ /* - " - */ /* * System configuration. */ #define OS2_USESYSHEADERS /* use compiler's own system headers */ #define OS2_HPFS /* use OS/2 High Performance File System */ #if defined(OS2_GCC) || defined(OS2_CSET2) # define OS2_32BITAPI /* enable for compilation in OS/2 2.0 */ #endif /* * Other configurable options. Generally no * 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 */ #define ANSI_DEFAULT /* allows NetHack to run without termcap file */ #define TEXTCOLOR /* allow color */ #define MAIL /* Allows for fake mail daemon to deliver mail */ #define TIMED_DELAY /* enable the `timed_delay' run-time option */ #ifdef TEXTCOLOR # define VIDEOSHADES #endif /* * The remaining code shouldn't need modification. */ #ifndef DLB # define DLB /* Untested without dlb, comment out on your own risk! */ #endif #ifdef MSDOS # undef MSDOS /* MSC autodefines this but we don't want it */ #endif #ifndef MICRO # define MICRO /* must be defined to allow some inclusions */ #endif #if !defined(TERMLIB) && !defined(ANSI_DEFAULT) # define ANSI_DEFAULT /* have to have one or the other */ #endif #define PATHLEN 260 /* maximum pathlength (HPFS) */ #define FILENAMELEN 260 /* maximum filename length (HPFS) */ #ifndef MICRO_H #include "micro.h" /* necessary externs for [os_name].c */ #endif #ifndef SYSTEM_H #include "system.h" #endif #ifndef index #define index strchr #endif #ifndef rindex #define rindex strrchr #endif #include /* the high quality random number routines */ #ifdef RANDOM # define Rand() random() #else # define Rand() rand() #endif /* file creation mask */ #include #include #define FCMASK (S_IREAD | S_IWRITE) #include #ifdef __EMX__ #include #endif #ifndef REDO # undef Getchar # define Getchar nhgetch #endif #ifdef TIMED_DELAY #define msleep(k) _sleep2(k) #endif void hangup(int i); #endif /* OS2CONF_H */ #endif /* OS2 */ slashem-0.0.7E7F3/include/mac-carbon.h0000664000076400007640000000171510545462317015456 0ustar aliali/* SCCS Id: @(#)mac-carbon.h 3.4 2003/06/01 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 2003. */ /* NetHack may be freely redistributed. See license for details. */ /* Compiler prefix file for the Macintosh Carbon port. * * IMPORTANT: This file is intended only as a compiler prefix * file and must NEVER be included by other source (.c or .h) * files. * * Usage for MacOS X Project Builder: * Project menu -> Edit Active Target '_target_' -> * target settings dialog -> Settings -> Simple View -> * GCC Compiler Settings -> * set "Prefix Header" to include/mac-carbon.h * * Usage for Metrowerks CodeWarrior: * Edit menu -> _target_ Settings -> Language Settings -> * C/C++ Language -> * set "Prefix File" to include/mac-carbon.h */ #define MAC #undef UNIX /* May already be defined by CodeWarrior as 0 or 1 */ #ifdef TARGET_API_MAC_CARBON # undef TARGET_API_MAC_CARBON #endif #define TARGET_API_MAC_CARBON 1 #define GCC_WARN slashem-0.0.7E7F3/include/extern.h0000644000076400007640000025101610545462317014760 0ustar aliali/* SCCS Id: @(#)extern.h 3.4 2003/03/10 */ /* Copyright (c) Steve Creps, 1988. */ /* NetHack may be freely redistributed. See license for details. */ #ifndef EXTERN_H #define EXTERN_H #define E extern /* ### alloc.c ### */ #if 0 E long *FDECL(alloc, (unsigned int)); #endif E char *FDECL(fmt_ptr, (const genericptr,char *)); /* This next pre-processor directive covers almost the entire file, * interrupted only occasionally to pick up specific functions as needed. */ #if !defined(MAKEDEFS_C) && !defined(LEV_LEX_C) /* ### allmain.c ### */ E void NDECL(moveloop); E void NDECL(stop_occupation); E void NDECL(display_gamewindows); E void NDECL(newgame); E void FDECL(welcome, (BOOLEAN_P)); /* ### apply.c ### */ E int NDECL(doapply); E int NDECL(dorub); E int NDECL(dojump); E int FDECL(jump, (int)); 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 *)); E void FDECL(check_leash, (XCHAR_P,XCHAR_P)); 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)); E int FDECL(wand_explode, (struct obj *,BOOLEAN_P)); /* ### artifact.c ### */ E void NDECL(init_artifacts); E void NDECL(init_artifacts1); E void FDECL(save_artifacts, (int)); E void FDECL(restore_artifacts, (int)); E const char *FDECL(artiname, (int)); E struct obj *FDECL(mk_artifact, (struct obj *,ALIGNTYP_P)); E const char *FDECL(artifact_name, (const char *,short *)); E boolean FDECL(exist_artifact, (int,const char *)); E void FDECL(artifact_exists, (struct obj *,const char *,BOOLEAN_P)); E int NDECL(nartifact_exist); E boolean FDECL(spec_ability, (struct obj *,unsigned long)); E boolean FDECL(confers_luck, (struct obj *)); E boolean FDECL(arti_reflects, (struct obj *)); E boolean FDECL(restrict_name, (struct obj *,const char *)); E boolean FDECL(defends, (int,struct obj *)); E boolean FDECL(protects, (int,struct obj *)); E void FDECL(set_artifact_intrinsic, (struct obj *,BOOLEAN_P,long)); E int FDECL(touch_artifact, (struct obj *,struct monst *)); E int FDECL(spec_abon, (struct obj *,struct monst *)); E int FDECL(spec_dbon, (struct obj *,struct monst *,int)); E void FDECL(discover_artifact, (XCHAR_P)); E boolean FDECL(undiscovered_artifact, (XCHAR_P)); E int FDECL(disp_artifact_discoveries, (winid)); E boolean FDECL(artifact_hit, (struct monst *,struct monst *, struct obj *,int *,int)); E int NDECL(doinvoke); E void FDECL(arti_speak, (struct obj *)); E boolean FDECL(artifact_light, (struct obj *)); E int FDECL(artifact_wet, (struct obj *, BOOLEAN_P)); 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 ### */ E boolean FDECL(adjattrib, (int,int,int)); E void FDECL(change_luck, (SCHAR_P)); E int FDECL(stone_luck, (BOOLEAN_P)); E void NDECL(set_moreluck); E void FDECL(gainstr, (struct obj *,int)); E void FDECL(losestr, (int)); E void NDECL(restore_attrib); E void FDECL(exercise, (int,BOOLEAN_P)); E void NDECL(exerchk); E void NDECL(reset_attribute_clock); E void FDECL(init_attr, (int)); E void NDECL(redist_attr); E void FDECL(adjabil, (int,int)); E int NDECL(newhp); E schar FDECL(acurr, (int)); E schar NDECL(acurrstr); E void FDECL(adjalign, (int)); /* KMH, balance patch -- new function */ E void NDECL(recalc_health); /* ### ball.c ### */ E void NDECL(ballfall); E void NDECL(placebc); E void NDECL(unplacebc); E void FDECL(set_bc, (int)); E void FDECL(move_bc, (int,int,XCHAR_P,XCHAR_P,XCHAR_P,XCHAR_P)); E boolean FDECL(drag_ball, (XCHAR_P,XCHAR_P, int *,xchar *,xchar *,xchar *,xchar *, boolean *,BOOLEAN_P)); E void FDECL(drop_ball, (XCHAR_P,XCHAR_P)); E void NDECL(drag_down); /* ### bones.c ### */ E boolean NDECL(can_make_bones); E void FDECL(savebones, (struct obj *)); E int NDECL(getbones); /* ### borg.c ### */ /* E char borg_on; E char borg_line[80]; E char FDECL(borg_input, (void)); */ /* ### botl.c ### */ E int FDECL(xlev_to_rank, (int)); E int FDECL(title_to_mon, (const char *,int *,int *)); E void NDECL(max_rank_sz); #ifdef SCORE_ON_BOTL E long NDECL(botl_score); #endif E int FDECL(describe_level, (char *, int)); E const char *FDECL(rank_of, (int,SHORT_P,BOOLEAN_P)); E void FDECL(bot_set_handler, (void (*)())); E void NDECL(bot_reconfig); E void NDECL(bot); #if 0 E const char * FDECL(shorten_bot1, (const char *, int)); #endif #ifdef TTY_GRAPHICS E const char * FDECL(shorten_bot2, (const char *, unsigned int)); #endif /* ### cmd.c ### */ #ifdef USE_TRAMPOLI E int NDECL(doextcmd); E int NDECL(domonability); E int NDECL(domonability); E int NDECL(polyatwill); E int NDECL(playersteal); E int NDECL(doprev_message); E int NDECL(timed_occupation); E int NDECL(wiz_attributes); E int NDECL(enter_explore_mode); # ifdef WIZARD E int NDECL(wiz_detect); E int NDECL(wiz_genesis); E int NDECL(wiz_identify); E int NDECL(wiz_level_tele); E int NDECL(wiz_map); E int NDECL(wiz_where); E int NDECL(wiz_wish); # endif /* WIZARD */ #endif /* USE_TRAMPOLI */ E void NDECL(reset_occupations); E void FDECL(set_occupation, (int (*)(void),const char *,int)); #ifdef REDO E char NDECL(pgetchar); E void FDECL(pushch, (CHAR_P)); E void FDECL(savech, (CHAR_P)); #endif #ifdef WIZARD E void NDECL(add_debug_extended_commands); #endif /* WIZARD */ E void FDECL(rhack, (char *)); E int NDECL(doextlist); E int NDECL(extcmd_via_menu); E void FDECL(enlightenment, (int)); E void FDECL(show_conduct, (int)); E int FDECL(xytod, (SCHAR_P,SCHAR_P)); E void FDECL(dtoxy, (coord *,int)); E int FDECL(movecmd, (CHAR_P)); E int FDECL(getdir, (const char *)); E void NDECL(confdir); E int FDECL(isok, (int,int)); E int FDECL(get_adjacent_loc, (const char *, const char *, XCHAR_P, XCHAR_P, coord *)); E const char *FDECL(click_to_cmd, (int,int,int)); E char NDECL(readchar); #ifdef WIZARD E void NDECL(sanity_check); #endif E char FDECL(yn_function, (const char *, const char *, CHAR_P)); /* ### dbridge.c ### */ E boolean FDECL(is_pool, (int,int)); E boolean FDECL(is_lava, (int,int)); E boolean FDECL(is_ice, (int,int)); E int FDECL(is_drawbridge_wall, (int,int)); E boolean FDECL(is_db_wall, (int,int)); E boolean FDECL(find_drawbridge, (int *,int*)); E boolean FDECL(create_drawbridge, (int,int,int,BOOLEAN_P)); E void FDECL(open_drawbridge, (int,int)); E void FDECL(close_drawbridge, (int,int)); E void FDECL(destroy_drawbridge, (int,int)); /* ### decl.c ### */ E void NDECL(decl_init); /* ### 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)); E int FDECL(monster_detect, (struct obj *,int)); E int FDECL(trap_detect, (struct obj *)); E const char *FDECL(level_distance, (d_level *)); E void FDECL(use_crystal_ball, (struct obj *)); E void NDECL(do_mapping); E void NDECL(do_vicinity_map); E void FDECL(cvt_sdoor_to_door, (struct rm *)); #ifdef USE_TRAMPOLI E void FDECL(findone, (int,int,genericptr_t)); E void FDECL(openone, (int,int,genericptr_t)); #endif E int NDECL(findit); E int NDECL(openit); E void FDECL(find_trap, (struct trap *)); E int FDECL(dosearch0, (int)); E int NDECL(dosearch); E void NDECL(sokoban_detect); /* KMH -- Sokoban levels */ E void NDECL(sokoban_detect); /* ### dig.c ### */ E boolean NDECL(is_digging); #ifdef USE_TRAMPOLI E int NDECL(dig); #endif E int NDECL(holetime); E boolean FDECL(dig_check, (struct monst *, BOOLEAN_P, int, int)); 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)); E void FDECL(unearth_objs, (int,int)); E void FDECL(rot_organic, (genericptr_t, long)); E void FDECL(rot_corpse, (genericptr_t, long)); #if 0 E void FDECL(bury_monst, (struct monst *)); E void NDECL(bury_you); E void NDECL(unearth_you); E void NDECL(escape_tomb); E void FDECL(bury_obj, (struct obj *)); #endif /* ### display.c ### */ #ifdef INVISIBLE_OBJECTS E struct obj * FDECL(vobj_at, (XCHAR_P,XCHAR_P)); #endif /* INVISIBLE_OBJECTS */ E void FDECL(magic_map_background, (XCHAR_P,XCHAR_P,int)); E void FDECL(map_background, (XCHAR_P,XCHAR_P,int)); E void FDECL(map_trap, (struct trap *,int)); E void FDECL(map_object, (struct obj *,int)); E void FDECL(map_invisible, (XCHAR_P,XCHAR_P)); E void FDECL(unmap_object, (int,int)); E void FDECL(map_location, (int,int,int)); E int FDECL(memory_glyph, (int, int)); E void FDECL(clear_memory_glyph, (int, int, int)); E void FDECL(feel_location, (XCHAR_P,XCHAR_P)); E void FDECL(newsym, (int,int)); E void FDECL(shieldeff, (XCHAR_P,XCHAR_P)); E void FDECL(tmp_at, (int,int)); #ifdef DISPLAY_LAYERS E int FDECL(glyph_is_floating, (int)); #endif E void FDECL(swallowed, (int)); E void FDECL(under_ground, (int)); E void FDECL(under_water, (int)); E void NDECL(see_monsters); E void NDECL(set_mimic_blocking); E void NDECL(see_objects); E void NDECL(see_traps); E void NDECL(curs_on_u); E int NDECL(doredraw); E void NDECL(docrt); E void FDECL(show_glyph, (int,int,int)); E void NDECL(clear_glyph_buffer); E void FDECL(row_refresh, (int,int,int)); E void NDECL(cls); E void FDECL(flush_screen, (int)); E int FDECL(back_to_glyph, (XCHAR_P,XCHAR_P)); E int FDECL(zapdir_to_glyph, (int,int,int)); E int FDECL(glyph_at, (XCHAR_P,XCHAR_P)); E void NDECL(set_wall_state); /* ### do.c ### */ #ifdef USE_TRAMPOLI E int FDECL(drop, (struct obj *)); E int NDECL(wipeoff); #endif E int NDECL(dodrop); E boolean FDECL(boulder_hits_pool, (struct obj *,int,int,BOOLEAN_P)); E boolean FDECL(flooreffects, (struct obj *,int,int,const char *)); E void FDECL(doaltarobj, (struct obj *)); 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); #ifdef INSURANCE E void NDECL(save_currentstate); #endif E void FDECL(goto_level, (d_level *,BOOLEAN_P,BOOLEAN_P,BOOLEAN_P)); E void FDECL(schedule_goto, (d_level *,BOOLEAN_P,BOOLEAN_P,int, const char *,const char *)); E void NDECL(deferred_goto); E boolean FDECL(revive_corpse, (struct obj *, BOOLEAN_P)); E void FDECL(revive_mon, (genericptr_t, long)); E void FDECL(moldy_corpse, (genericptr_t, long)); E int NDECL(donull); E int NDECL(dowipe); E void FDECL(set_wounded_legs, (long,int)); E void NDECL(heal_legs); /* ### do_name.c ### */ E int FDECL(getpos, (coord *,BOOLEAN_P,const char *)); E struct monst *FDECL(christen_monst, (struct monst *,const char *)); E int NDECL(do_mname); E struct obj *FDECL(oname, (struct obj *,const char *)); E int NDECL(ddocall); E void FDECL(docall, (struct obj *)); E const char *NDECL(rndghostname); E char *FDECL(x_monnam, (struct monst *,int,const char *,int,BOOLEAN_P)); E char *FDECL(l_monnam, (struct monst *)); E char *FDECL(mon_nam, (struct monst *)); E char *FDECL(noit_mon_nam, (struct monst *)); E char *FDECL(Monnam, (struct monst *)); E char *FDECL(noit_Monnam, (struct monst *)); E char *FDECL(m_monnam, (struct monst *)); E char *FDECL(y_monnam, (struct monst *)); 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 *)); E const char *NDECL(rndcolor); #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 ### */ E int NDECL(Armor_on); E int NDECL(Boots_on); E int NDECL(Cloak_on); E int NDECL(Helmet_on); E int NDECL(Gloves_on); E int NDECL(Shield_on); #ifdef TOURIST E int NDECL(Shirt_on); #endif E void NDECL(Amulet_on); #ifdef USE_TRAMPOLI E int FDECL(select_off, (struct obj *)); E int NDECL(take_off); #endif E void FDECL(off_msg, (struct obj *)); E void NDECL(set_wear); E boolean FDECL(donning, (struct obj *)); E void NDECL(cancel_don); E int NDECL(Armor_off); E int NDECL(Armor_gone); E int NDECL(Helmet_off); E int NDECL(Gloves_off); E int NDECL(Boots_off); E int NDECL(Cloak_off); E int NDECL(Shield_off); #ifdef TOURIST E int NDECL(Shirt_off); #endif E void NDECL(Amulet_off); E void FDECL(Ring_on, (struct obj *)); E void FDECL(Ring_off, (struct obj *)); E void FDECL(Ring_gone, (struct obj *)); E void FDECL(Blindf_on, (struct obj *)); E void FDECL(Blindf_off, (struct obj *)); E int NDECL(dotakeoff); E int NDECL(doremring); E int FDECL(cursed, (struct obj *)); E int FDECL(armoroff, (struct obj *)); E int FDECL(canwearobj, (struct obj *, long *, BOOLEAN_P)); E int NDECL(dowear); E int NDECL(doputon); E void NDECL(find_ac); E void NDECL(glibr); E struct obj *FDECL(some_armor,(struct monst *)); E void FDECL(erode_armor, (struct monst *,BOOLEAN_P)); E struct obj *FDECL(stuck_ring, (struct obj *,int)); E struct obj *NDECL(unchanger); E void NDECL(reset_remarm); E int NDECL(doddoremarm); E int FDECL(destroy_arm, (struct obj *)); E void FDECL(adj_abon, (struct obj *,SCHAR_P)); E int FDECL(dowear2, (const char *, const char *)); /* ### dog.c ### */ E void FDECL(initedog, (struct monst *)); E struct monst *FDECL(make_familiar, (struct obj *,XCHAR_P,XCHAR_P,BOOLEAN_P)); E struct monst *FDECL(make_helper, (int,XCHAR_P,XCHAR_P)); E struct monst *NDECL(makedog); E void NDECL(update_mlstmv); E void NDECL(losedogs); E void FDECL(mon_arrive, (struct monst *,BOOLEAN_P)); E void FDECL(mon_catchup_elapsed_time, (struct monst *,long)); E void FDECL(keepdogs, (BOOLEAN_P)); E void FDECL(migrate_to_level, (struct monst *,XCHAR_P,XCHAR_P,coord *)); E int FDECL(dogfood, (struct monst *,struct obj *)); E struct monst *FDECL(tamedog, (struct monst *,struct obj *)); E int FDECL(make_pet_minion, (int,ALIGNTYP_P)); E void FDECL(abuse_dog, (struct monst *)); E void FDECL(wary_dog, (struct monst *, BOOLEAN_P)); /* ### dogmove.c ### */ E int FDECL(dog_nutrition, (struct monst *,struct obj *)); E int FDECL(dog_eat, (struct monst *,struct obj *,int,int,BOOLEAN_P)); E int FDECL(dog_move, (struct monst *,int)); E boolean FDECL(betrayed, (struct monst *)); #ifdef USE_TRAMPOLI E void FDECL(wantdoor, (int,int,genericptr_t)); #endif /* ### dokick.c ### */ E boolean FDECL(ghitm, (struct monst *,struct obj *)); E void FDECL(container_impact_dmg, (struct obj *)); E int NDECL(dokick); E boolean FDECL(ship_object, (struct obj *,XCHAR_P,XCHAR_P,BOOLEAN_P)); E void NDECL(obj_delivery); E schar FDECL(down_gate, (XCHAR_P,XCHAR_P)); E void FDECL(impact_drop, (struct obj *,XCHAR_P,XCHAR_P,XCHAR_P)); /* ### dothrow.c ### */ E struct obj *FDECL(splitoneoff, (struct obj **)); E int NDECL(dothrow); 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,int)); E int FDECL(omon_adj, (struct monst *,struct obj *,BOOLEAN_P)); E int FDECL(thitmonst, (struct monst *,struct obj *, int)); E int FDECL(hero_breaks, (struct obj *,XCHAR_P,XCHAR_P,BOOLEAN_P)); E int FDECL(breaks, (struct obj *,XCHAR_P,XCHAR_P)); E boolean FDECL(breaktest, (struct obj *)); E boolean FDECL(walk_path, (coord *, coord *, boolean (*)(genericptr_t,int,int), genericptr_t)); E boolean FDECL(hurtle_step, (genericptr_t, int, int)); /* ### drawing.c ### */ #endif /* !MAKEDEFS_C && !LEV_LEX_C */ E int FDECL(def_char_to_objclass, (CHAR_P)); E int FDECL(def_char_to_monclass, (CHAR_P)); #if !defined(MAKEDEFS_C) && !defined(LEV_LEX_C) E void FDECL(assign_graphics, (uchar *,int,int,int)); E void FDECL(switch_graphics, (int)); #ifdef REINCARNATION E void FDECL(assign_rogue_graphics, (BOOLEAN_P)); #endif /* ### dungeon.c ### */ E void FDECL(save_dungeon, (int,BOOLEAN_P,BOOLEAN_P)); E void FDECL(restore_dungeon, (int)); E void FDECL(insert_branch, (branch *,BOOLEAN_P)); E void NDECL(init_dungeons); E s_level *FDECL(find_level, (const char *)); E s_level *FDECL(Is_special, (d_level *)); E branch *FDECL(Is_branchlev, (d_level *)); E xchar FDECL(ledger_no, (d_level *)); E xchar NDECL(maxledgerno); E schar FDECL(depth, (d_level *)); E xchar FDECL(dunlev, (d_level *)); E xchar FDECL(dunlevs_in_dungeon, (d_level *)); E xchar FDECL(real_dunlevs_in_dungeon, (d_level *)); E xchar FDECL(ledger_to_dnum, (XCHAR_P)); E xchar FDECL(ledger_to_dlev, (XCHAR_P)); E xchar FDECL(deepest_lev_reached, (BOOLEAN_P)); E boolean FDECL(on_level, (d_level *,d_level *)); E void FDECL(next_level, (BOOLEAN_P)); E void FDECL(prev_level, (BOOLEAN_P)); E void FDECL(u_on_newpos, (int,int)); E void NDECL(u_on_sstairs); E void NDECL(u_on_upstairs); E void NDECL(u_on_dnstairs); E boolean FDECL(On_stairs, (XCHAR_P,XCHAR_P)); E void FDECL(get_level, (d_level *,int)); E boolean FDECL(Is_botlevel, (d_level *)); E boolean FDECL(Can_fall_thru, (d_level *)); E boolean FDECL(Can_dig_down, (d_level *)); E boolean FDECL(Can_rise_up, (int,int,d_level *)); E boolean FDECL(In_quest, (d_level *)); E boolean FDECL(In_mines, (d_level *)); E boolean FDECL(In_spiders, (d_level *)); E branch *FDECL(dungeon_branch, (const char *)); E boolean FDECL(at_dgn_entrance, (const char *)); E boolean FDECL(In_hell, (d_level *)); E boolean FDECL(In_V_tower, (d_level *)); E boolean FDECL(On_W_tower_level, (d_level *)); E boolean FDECL(In_W_tower, (int,int,d_level *)); E void FDECL(find_hell, (d_level *)); E void FDECL(goto_hell, (BOOLEAN_P,BOOLEAN_P)); E void FDECL(assign_level, (d_level *,d_level *)); E void FDECL(assign_rnd_level, (d_level *,d_level *,int)); E int FDECL(induced_align, (int)); E boolean FDECL(Invocation_lev, (d_level *)); E xchar NDECL(level_difficulty); E schar FDECL(lev_by_name, (const char *)); #ifdef WIZARD E schar FDECL(print_dungeon, (BOOLEAN_P,schar *,xchar *)); #endif /* ### eat.c ### */ #ifdef USE_TRAMPOLI E int NDECL(eatmdone); E int NDECL(eatfood); E int NDECL(opentin); E int NDECL(unfaint); #endif E boolean FDECL(is_edible, (struct obj *)); E void NDECL(init_uhunger); E int NDECL(Hear_again); E void NDECL(reset_eat); E int NDECL(doeat); E void NDECL(gethungry); E void FDECL(morehungry, (int)); E void FDECL(lesshungry, (int)); E boolean NDECL(is_fainted); E void NDECL(reset_faint); E void NDECL(violated_vegetarian); #if 0 E void NDECL(sync_hunger); #endif E void FDECL(newuhs, (BOOLEAN_P)); E boolean NDECL(can_reach_floorobj); E void NDECL(vomit); E int FDECL(eaten_stat, (int,struct obj *)); E void FDECL(food_disappears, (struct obj *)); E void FDECL(food_substitution, (struct obj *,struct obj *)); E boolean FDECL(bite_monster, (struct monst *mon)); E void NDECL(fix_petrification); E void FDECL(consume_oeaten, (struct obj *,int)); E boolean FDECL(maybe_finished_meal, (BOOLEAN_P)); /* ### end.c ### */ E void FDECL(done1, (int)); E int NDECL(done2); #ifdef USE_TRAMPOLI E void FDECL(done_intr, (int)); #endif E void FDECL(done_in_by, (struct monst *)); #endif /* !MAKEDEFS_C && !LEV_LEX_C */ E void VDECL(panic, (const char *,...)) PRINTF_F(1,2); #if !defined(MAKEDEFS_C) && !defined(LEV_LEX_C) E void FDECL(done, (int)); E void FDECL(container_contents, (struct obj *,BOOLEAN_P,BOOLEAN_P)); E void FDECL(terminate, (int)); E int NDECL(dolistvanq); E int NDECL(num_genocides); /* KMH, ethics */ E int NDECL(doethics); /* ### engrave.c ### */ E char *FDECL(random_engraving, (char *)); E void FDECL(wipeout_text, (char *,int,unsigned)); E boolean NDECL(can_reach_floor); E const char *FDECL(surface, (int,int)); E const char *FDECL(ceiling, (int,int)); E struct engr *FDECL(engr_at, (XCHAR_P,XCHAR_P)); #ifdef ELBERETH E int FDECL(sengr_at, (const char *,XCHAR_P,XCHAR_P)); #endif E void FDECL(u_wipe_engr, (int)); E void FDECL(wipe_engr_at, (XCHAR_P,XCHAR_P,XCHAR_P)); E boolean FDECL(sense_engr_at, (int,int,BOOLEAN_P)); E void FDECL(make_engr_at, (int,int,const char *,long,XCHAR_P)); E void FDECL(del_engr_at, (int,int)); E int NDECL(freehand); E int NDECL(doengrave); E void FDECL(save_engravings, (int,int)); E void FDECL(rest_engravings, (int)); E void FDECL(del_engr, (struct engr *)); E void FDECL(rloc_engr, (struct engr *)); E void FDECL(make_grave, (int,int,const char *)); /* ### exper.c ### */ E long FDECL(newuexp, (int)); E int FDECL(experience, (struct monst *,int)); E void FDECL(more_experienced, (int,int)); E void FDECL(losexp, (const char *, BOOLEAN_P)); E void NDECL(newexplevel); E void FDECL(pluslvl, (BOOLEAN_P)); E long FDECL(rndexp, (BOOLEAN_P)); /* ### explode.c ### */ E void FDECL(explode, (int,int,int,int,CHAR_P,int)); E long FDECL(scatter, (int, int, int, unsigned int, struct obj *)); E void FDECL(splatter_burning_oil, (int, int)); #ifdef FIREARMS E void FDECL(grenade_explode, (struct obj *, int, int, BOOLEAN_P, int)); E void FDECL(arm_bomb, (struct obj *, BOOLEAN_P)); #endif /* ### extralev.c ### */ #ifdef REINCARNATION E void NDECL(makeroguerooms); E void FDECL(corr, (int,int)); E void NDECL(makerogueghost); #endif /* ### files.c ### */ E char *FDECL(fname_encode, (const char *, CHAR_P, char *, char *, int)); E char *FDECL(fname_decode, (CHAR_P, char *, char *, int)); E const char *FDECL(fqname, (const char *, int, int)); #ifndef FILE_AREAS E FILE *FDECL(fopen_datafile, (const char *,const char *,int)); #endif E boolean FDECL(uptodate, (int,const char *)); E void FDECL(store_version, (int)); #ifdef MFLOPPY E void NDECL(set_lock_and_bones); #endif E void FDECL(set_levelfile_name, (char *,int)); E int FDECL(create_levelfile, (int,char *)); E int FDECL(open_levelfile, (int,char *)); E void FDECL(delete_levelfile, (int)); E void NDECL(clearlocks); E int FDECL(create_bonesfile, (d_level*,char **, char *)); #ifdef MFLOPPY E void NDECL(cancel_bonesfile); #endif E void FDECL(commit_bonesfile, (d_level *)); E int FDECL(open_bonesfile, (d_level*,char **)); E int FDECL(delete_bonesfile, (d_level*)); E void NDECL(compress_bonesfile); E void NDECL(set_savefile_name); #ifdef INSURANCE E void FDECL(save_savefile_name, (int)); #endif #if defined(WIZARD) && !defined(MICRO) E void NDECL(set_error_savefile); #endif E int NDECL(create_savefile); E int NDECL(open_savefile); E int NDECL(delete_savefile); E int NDECL(restore_saved_game); E void FDECL(compress_area, (const char *, const char *)); E void FDECL(uncompress_area, (const char *, const char *)); #ifndef FILE_AREAS E boolean FDECL(lock_file, (const char *,int,int)); E void FDECL(unlock_file, (const char *)); #endif #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 E void FDECL(paniclog, (const char *, const char *)); E int FDECL(validate_prefix_locations, (char *)); E char** NDECL(get_saved_games); E void FDECL(free_saved_games, (char**)); #ifdef SELF_RECOVER E boolean NDECL(recover_savefile); #endif #ifdef HOLD_LOCKFILE_OPEN E void NDECL(really_close); #endif /* ### fountain.c ### */ E void FDECL(floating_above, (const char *)); E void FDECL(dogushforth, (int)); # ifdef USE_TRAMPOLI E void FDECL(gush, (int,int,genericptr_t)); # endif E void FDECL(dryup, (XCHAR_P,XCHAR_P, BOOLEAN_P)); E void NDECL(drinkfountain); E void FDECL(dipfountain, (struct obj *)); E void FDECL(whetstone_fountain_effects, (struct obj *)); #ifdef SINKS E void FDECL(diptoilet, (struct obj *)); E void FDECL(breaksink, (int,int)); E void FDECL(breaktoilet, (int,int)); E void NDECL(drinksink); E void NDECL(drinktoilet); E void FDECL(whetstone_sink_effects, (struct obj *)); E void FDECL(whetstone_toilet_effects, (struct obj *)); #endif /* ### gypsy.c ### */ E void FDECL(gypsy_init, (struct monst *)); E void FDECL(gypsy_chat, (struct monst *)); /* ### hack.c ### */ #ifdef DUNGEON_GROWTH E void FDECL(catchup_dgn_growths, (int)); E void FDECL(dgn_growths, (BOOLEAN_P,BOOLEAN_P)); #endif E boolean FDECL(revive_nasty, (int,int,const char*)); E void FDECL(movobj, (struct obj *,XCHAR_P,XCHAR_P)); E boolean FDECL(may_dig, (XCHAR_P,XCHAR_P)); E boolean FDECL(may_passwall, (XCHAR_P,XCHAR_P)); E boolean FDECL(bad_rock, (struct monst *,XCHAR_P,XCHAR_P)); E boolean FDECL(invocation_pos, (XCHAR_P,XCHAR_P)); E boolean FDECL(test_move, (int, int, int, int, int)); E void NDECL(domove); E void NDECL(invocation_message); E void FDECL(spoteffects, (BOOLEAN_P)); E char *FDECL(in_rooms, (XCHAR_P,XCHAR_P,int)); E boolean FDECL(in_town, (int,int)); E void FDECL(check_special_room, (BOOLEAN_P)); E int NDECL(dopickup); E void NDECL(lookaround); E int NDECL(monster_nearby); E void FDECL(nomul, (int)); E void FDECL(unmul, (const char *)); #ifdef SHOW_DMG E void FDECL(showdmg, (int)); #endif E void FDECL(losehp, (int,const char *, int)); E int NDECL(weight_cap); E int NDECL(inv_weight); E int NDECL(near_capacity); E int FDECL(calc_capacity, (int)); 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 ### */ E boolean FDECL(digit, (CHAR_P)); E boolean FDECL(letter, (CHAR_P)); 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(strkitten, (char *,CHAR_P)); E char *FDECL(s_suffix, (const char *)); E char *FDECL(xcrypt, (const char *,char *)); E boolean FDECL(onlyspace, (const char *)); E char *FDECL(tabexpand, (char *)); E char *FDECL(visctrl, (CHAR_P)); E const char *FDECL(ordin, (int)); E char *FDECL(sitoa, (int)); E int FDECL(sgn, (int)); E int FDECL(rounddiv, (long,int)); E int FDECL(dist2, (int,int,int,int)); E int FDECL(distmin, (int,int,int,int)); E boolean FDECL(online2, (int,int,int,int)); E boolean FDECL(pmatch, (const char *,const char *)); #ifndef STRNCMPI E int FDECL(strncmpi, (const char *,const char *,int)); #endif #ifndef STRSTRI E char *FDECL(strstri, (const char *,const char *)); #endif E boolean FDECL(fuzzymatch, (const char *,const char *,const char *,BOOLEAN_P)); E void NDECL(setrandom); E int NDECL(getyear); E int NDECL(getmonth); /* KMH -- Used by gypsies */ #if 0 E char *FDECL(yymmdd, (time_t)); #endif E long FDECL(yyyymmdd, (time_t)); E int NDECL(phase_of_the_moon); E boolean NDECL(friday_13th); E boolean NDECL(groundhog_day); /* KMH -- February 2 */ E int NDECL(night); E int NDECL(midnight); /* ### invent.c ### */ E void FDECL(assigninvlet, (struct obj *)); E struct obj *FDECL(merge_choice, (struct obj *,struct obj *)); E int FDECL(merged, (struct obj **,struct obj **)); #ifdef USE_TRAMPOLI E int FDECL(ckunpaid, (struct obj *)); #endif E void FDECL(addinv_core1, (struct obj *)); E void FDECL(addinv_core2, (struct obj *)); E struct obj *FDECL(addinv, (struct obj *)); E struct obj *FDECL(hold_another_object, (struct obj *,const char *,const char *,const char *)); E void FDECL(useupall, (struct obj *)); E void FDECL(useup, (struct obj *)); E void FDECL(consume_obj_charge, (struct obj *,BOOLEAN_P)); E void FDECL(freeinv_core, (struct obj *)); E void FDECL(freeinv, (struct obj *)); E void FDECL(delallobj, (int,int)); E void FDECL(delobj, (struct obj *)); E struct obj *FDECL(sobj_at, (int,int,int)); E struct obj *FDECL(carrying, (int)); E boolean NDECL(have_lizard); E struct obj *FDECL(o_on, (unsigned int,struct obj *)); E boolean FDECL(obj_here, (struct obj *,int,int)); E boolean NDECL(wearing_armor); E boolean FDECL(is_worn, (struct obj *)); 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)); E int NDECL(dolook); E boolean FDECL(will_feel_cockatrice, (struct obj *,BOOLEAN_P)); E void FDECL(feel_cockatrice, (struct obj *,BOOLEAN_P)); E void FDECL(stackobj, (struct obj *)); E int NDECL(doprgold); E int NDECL(doprwep); E int NDECL(doprarm); E int NDECL(doprring); E int NDECL(dopramulet); E int NDECL(doprtool); E int NDECL(doprinuse); E void FDECL(useupf, (struct obj *,long)); E char *FDECL(let_to_name, (CHAR_P,BOOLEAN_P)); E void NDECL(free_invbuf); 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 monst *, struct obj *)); E const char *FDECL(currency, (long)); E void FDECL(silly_thing, (const char *,struct obj *)); E int NDECL(doinvinuse); /* KMH, balance patch -- new function */ E int NDECL(jumble_pack); /* ### ioctl.c ### */ #if defined(UNIX) || defined(__BEOS__) E void NDECL(getwindowsz); E void NDECL(getioctls); E void NDECL(setioctls); # ifdef SUSPEND E int NDECL(dosuspend); # endif /* SUSPEND */ #endif /* UNIX || __BEOS__ */ /* ### light.c ### */ E void FDECL(new_light_source, (XCHAR_P, XCHAR_P, int, int, genericptr_t)); E void FDECL(del_light_source, (int, genericptr_t)); E void FDECL(do_light_sources, (char **)); E struct monst *FDECL(find_mid, (unsigned, unsigned)); E void FDECL(save_light_sources, (int, int, int)); E void FDECL(restore_light_sources, (int)); E void FDECL(relink_light_sources, (BOOLEAN_P)); E void FDECL(obj_move_light_source, (struct obj *, struct obj *)); E boolean NDECL(any_light_source); E void FDECL(snuff_light_source, (int, int)); E boolean FDECL(obj_sheds_light, (struct obj *)); E boolean FDECL(obj_is_burning, (struct obj *)); E boolean FDECL(obj_permanent_light, (struct obj *)); E void FDECL(obj_split_light_source, (struct obj *, struct obj *)); E void FDECL(obj_merge_light_sources, (struct obj *,struct obj *)); E int FDECL(candle_light_range, (struct obj *)); #ifdef WIZARD E int NDECL(wiz_light_sources); #endif /* ### lock.c ### */ #ifdef USE_TRAMPOLI E int NDECL(forcelock); E int NDECL(picklock); #endif E boolean FDECL(picking_lock, (int *,int *)); E boolean FDECL(picking_at, (int,int)); E void NDECL(reset_pick); E int FDECL(pick_lock, (struct obj **)); E int NDECL(doforce); E boolean FDECL(boxlock, (struct obj *,struct obj *)); E boolean FDECL(doorlock, (struct obj *,int,int)); E int NDECL(doopen); E int NDECL(doclose); E int FDECL(artifact_door, (int,int)); #ifdef MAC /* These declarations are here because the main code calls them. */ /* ### macfile.c ### */ E int FDECL(maccreat, (const char *,long)); E int FDECL(macopen, (const char *,int,long)); E int FDECL(macclose, (int)); E int FDECL(macread, (int,void *,unsigned)); E int FDECL(macwrite, (int,void *,unsigned)); E long FDECL(macseek, (int,long,short)); E int FDECL(macunlink, (const char *)); /* ### macsnd.c ### */ E void FDECL(mac_speaker, (struct obj *,char *)); /* ### macunix.c ### */ E void FDECL(regularize, (char *)); E void NDECL(getlock); /* ### macwin.c ### */ E void FDECL(lock_mouse_cursor, (Boolean)); E int NDECL(SanePositions); /* ### mttymain.c ### */ E void FDECL(getreturn, (const char *)); E void VDECL(msmsg, (const char *,...)); E void NDECL(gettty); E void NDECL(setftty); E void FDECL(settty, (const char *)); E int NDECL(tgetch); E void FDECL(cmov, (int x, int y)); E void FDECL(nocmov, (int x, int y)); #endif /* MAC */ /* ### mail.c ### */ #ifdef MAIL # ifdef UNIX E void NDECL(getmailstatus); # endif E void NDECL(ckmailstatus); E void FDECL(readmail, (struct obj *)); #endif /* MAIL */ /* ### makemon.c ### */ E boolean FDECL(is_home_elemental, (struct permonst *)); E struct monst *FDECL(clone_mon, (struct monst *,XCHAR_P,XCHAR_P)); E struct monst *FDECL(makemon, (struct permonst *,int,int,int)); E boolean FDECL(create_critters, (int,struct permonst *)); E struct permonst *NDECL(rndmonst); E void FDECL(reset_rndmonst, (int)); E struct permonst *FDECL(mkclass, (CHAR_P,int)); E int FDECL(pm_mkclass, (CHAR_P,int)); E int FDECL(adj_lev, (struct permonst *)); E struct permonst *FDECL(grow_up, (struct monst *,struct monst *)); E int FDECL(mongets, (struct monst *,int)); E int FDECL(golemhp, (int)); 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)); E void FDECL(mimic_hit_msg, (struct monst *, SHORT_P)); #ifdef GOLDOBJ E void FDECL(mkmonmoney, (struct monst *, long)); #endif E void FDECL(bagotricks, (struct obj *)); E boolean FDECL(propagate, (int, BOOLEAN_P,BOOLEAN_P)); /* ### 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 ### */ E int FDECL(fightm, (struct monst *)); E int FDECL(mattackm, (struct monst *,struct monst *)); E int FDECL(noattacks, (struct permonst *)); E int FDECL(sleep_monst, (struct monst *,int,int)); E void FDECL(slept_monst, (struct monst *)); E long FDECL(attk_protection, (int)); /* ### mhitu.c ### */ E const char *FDECL(mpoisons_subj, (struct monst *,struct attack *)); 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(magic_negation, (struct monst *)); E int FDECL(gazemu, (struct monst *,struct attack *)); E void FDECL(mdamageu, (struct monst *,int)); E int FDECL(could_seduce, (struct monst *,struct monst *,struct attack *)); #ifdef SEDUCE E int FDECL(doseduce, (struct monst *)); #endif /* ### minion.c ### */ E void FDECL(msummon, (struct monst *)); E void FDECL(summon_minion, (ALIGNTYP_P,BOOLEAN_P)); E int FDECL(demon_talk, (struct monst *)); E int FDECL(lawful_minion, (int)); E int FDECL(neutral_minion, (int)); E int FDECL(chaotic_minion, (int)); E long FDECL(bribe, (struct monst *)); E int FDECL(dprince, (ALIGNTYP_P)); E int FDECL(dlord, (ALIGNTYP_P)); E int NDECL(llord); E int FDECL(ndemon, (ALIGNTYP_P)); E int NDECL(lminion); /* ### mklev.c ### */ #ifdef USE_TRAMPOLI E int FDECL(do_comp, (genericptr_t,genericptr_t)); #endif E void NDECL(sort_rooms); E void FDECL(add_room, (int,int,int,int,BOOLEAN_P,SCHAR_P,BOOLEAN_P)); E void FDECL(add_subroom, (struct mkroom *,int,int,int,int, BOOLEAN_P,SCHAR_P,BOOLEAN_P)); E void NDECL(makecorridors); E int FDECL(add_door, (int,int,struct mkroom *)); E void NDECL(mklev); #ifdef SPECIALIZATION E void FDECL(topologize, (struct mkroom *,BOOLEAN_P)); #else E void FDECL(topologize, (struct mkroom *)); #endif E void FDECL(place_branch, (branch *,XCHAR_P,XCHAR_P)); E boolean FDECL(occupied, (XCHAR_P,XCHAR_P)); E int FDECL(okdoor, (XCHAR_P,XCHAR_P)); E void FDECL(dodoor, (int,int,struct mkroom *)); E void FDECL(mktrap, (int,int,struct mkroom *,coord*)); E void FDECL(mkstairs, (XCHAR_P,XCHAR_P,CHAR_P,struct mkroom *)); E void NDECL(mkinvokearea); /* ### mkmap.c ### */ void FDECL(flood_fill_rm, (int,int,int,BOOLEAN_P,BOOLEAN_P)); void FDECL(remove_rooms, (int,int,int,int)); /* ### mkmaze.c ### */ E void FDECL(wallification, (int,int,int,int, BOOLEAN_P)); E void FDECL(walkfrom, (int,int)); E void FDECL(makemaz, (const char *)); E void FDECL(mazexy, (coord *)); E void NDECL(bound_digging); E void FDECL(mkportal, (XCHAR_P,XCHAR_P,XCHAR_P,XCHAR_P)); E boolean FDECL(bad_location, (XCHAR_P,XCHAR_P,XCHAR_P,XCHAR_P,XCHAR_P,XCHAR_P)); E void FDECL(place_lregion, (XCHAR_P,XCHAR_P,XCHAR_P,XCHAR_P, XCHAR_P,XCHAR_P,XCHAR_P,XCHAR_P, XCHAR_P,d_level *)); E void NDECL(movebubbles); E void NDECL(water_friction); E void FDECL(save_waterlevel, (int,int)); E void FDECL(restore_waterlevel, (int)); E const char *FDECL(waterbody_name, (XCHAR_P,XCHAR_P)); /* ### 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)); E void FDECL(replace_object, (struct obj *,struct obj *)); E void FDECL(bill_dummy_object, (struct obj *)); E struct obj *FDECL(mksobj, (int,BOOLEAN_P,BOOLEAN_P)); E int FDECL(bcsign, (struct obj *)); E int FDECL(weight, (struct obj *)); E struct obj *FDECL(mkgold, (long,int,int)); E struct obj *FDECL(mkcorpstat, (int,struct monst *,struct permonst *,int,int,BOOLEAN_P)); E struct obj *FDECL(obj_attach_mid, (struct obj *, unsigned)); E struct monst *FDECL(get_mtraits, (struct obj *, BOOLEAN_P)); E struct obj *FDECL(mk_tt_object, (int,int,int)); E struct obj *FDECL(mk_named_object, (int,struct permonst *,int,int,const char *)); E struct obj *FDECL(rnd_treefruit_at, (int, int)); E void FDECL(start_corpse_timeout, (struct obj *)); E void FDECL(bless, (struct obj *)); E void FDECL(unbless, (struct obj *)); E void FDECL(curse, (struct obj *)); 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 *)); E void FDECL(obj_extract_self, (struct obj *)); E struct obj *FDECL(container_extract_indestructable, (struct obj *obj)); 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 *)); E void FDECL(obj_ice_effects, (int, int, BOOLEAN_P)); E long FDECL(peek_at_iced_corpse_age, (struct obj *)); #if defined(OBJ_SANITY) || defined(WIZARD) E void NDECL(obj_sanity_check); #endif /* ### mkroom.c ### */ E void FDECL(mkroom, (int)); E void FDECL(fill_zoo, (struct mkroom *)); E boolean FDECL(nexttodoor, (int,int)); E boolean FDECL(has_dnstairs, (struct mkroom *)); E boolean FDECL(has_upstairs, (struct mkroom *)); E int FDECL(somex, (struct mkroom *)); E int FDECL(somey, (struct mkroom *)); E boolean FDECL(inside_room, (struct mkroom *,XCHAR_P,XCHAR_P)); E boolean FDECL(somexy, (struct mkroom *,coord *)); E void FDECL(mkundead, (coord *,BOOLEAN_P,int)); E struct permonst *NDECL(courtmon); E struct permonst *NDECL(antholemon); E struct permonst *NDECL(realzoomon); E void FDECL(save_rooms, (int)); E void FDECL(rest_rooms, (int)); E struct mkroom *FDECL(search_special, (SCHAR_P)); /* ### mon.c ### */ E int FDECL(undead_to_corpse, (int)); E int FDECL(genus, (int,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 void FDECL(meatcorpse, (struct monst *)); E int FDECL(meatobj, (struct monst *)); E void FDECL(mpickgold, (struct monst *)); E boolean FDECL(mpickstuff, (struct monst *,const char *)); E int FDECL(curr_mon_load, (struct monst *)); E int FDECL(max_mon_load, (struct monst *)); E boolean FDECL(can_carry, (struct monst *,struct obj *)); E int FDECL(mfndpos, (struct monst *,coord *,long *,long)); E boolean FDECL(monnear, (struct monst *,int,int)); E void NDECL(dmonsfree); E int FDECL(mcalcmove, (struct monst*)); E void NDECL(mcalcdistress); 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 *)); E void FDECL(monstone, (struct monst *)); E void FDECL(monkilled, (struct monst *,const char *,int)); E void FDECL(mon_xkilled, (struct monst *,const char *,int)); E void FDECL(unstuck, (struct monst *)); E void FDECL(killed, (struct monst *)); E void FDECL(xkilled, (struct monst *,int)); E void FDECL(mon_to_stone, (struct monst*)); E void FDECL(mnexto, (struct monst *)); E boolean FDECL(mnearto, (struct monst *,XCHAR_P,XCHAR_P,BOOLEAN_P)); E void FDECL(poisontell, (int)); E void FDECL(poisoned, (const char *,int,const char *,int)); E void FDECL(m_respond, (struct monst *)); E void FDECL(setmangry, (struct monst *)); E void FDECL(wakeup, (struct monst *)); E void NDECL(wake_nearby); E void FDECL(wake_nearto, (int,int,int)); E void FDECL(seemimic, (struct monst *)); E void NDECL(rescham); 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,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)); E void NDECL(kill_genocided_monsters); E void FDECL(golemeffects, (struct monst *,int,int)); E boolean FDECL(angry_guards, (BOOLEAN_P)); E void NDECL(pacify_guards); /* ### 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 *)); E boolean FDECL(resists_magm, (struct monst *)); E boolean FDECL(resists_blnd, (struct monst *)); E boolean FDECL(can_blnd, (struct monst *,struct monst *,UCHAR_P,struct obj *)); E boolean FDECL(ranged_attk, (struct permonst *)); E boolean FDECL(passes_bars, (struct permonst *)); E boolean FDECL(can_track, (struct permonst *)); E boolean FDECL(breakarm, (struct permonst *)); E boolean FDECL(sliparm, (struct permonst *)); E boolean FDECL(sticks, (struct permonst *)); E int FDECL(num_horns, (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 *)); E int FDECL(name_to_mon, (const char *)); E int FDECL(gender, (struct monst *)); E int FDECL(pronoun_gender, (struct monst *)); E boolean FDECL(levl_follower, (struct monst *)); 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 *)); E const char *FDECL(on_fire, (struct permonst *,struct attack *)); E const struct permonst *FDECL(raceptr, (struct monst *)); /* ### monmove.c ### */ E boolean FDECL(itsstuck, (struct monst *)); E boolean FDECL(mb_trapped, (struct monst *)); 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)); E boolean FDECL(accessible, (int,int)); E void FDECL(set_apparxy, (struct monst *)); E boolean FDECL(can_ooze, (struct monst *)); /* ### monst.c ### */ E void NDECL(monst_init); /* ### monstr.c ### */ E void NDECL(monstr_init); /* ### mplayer.c ### */ E struct monst *FDECL(mk_mplayer, (struct permonst *,XCHAR_P, XCHAR_P,BOOLEAN_P)); E void FDECL(create_mplayers, (int,BOOLEAN_P)); E void FDECL(mplayer_talk, (struct monst *)); #if defined(MICRO) || defined(WIN32) /* ### msdos.c,os2.c,tos.c,winnt.c ### */ # ifndef WIN32 E int NDECL(tgetch); # endif # ifndef TOS E char NDECL(switchar); # endif # ifndef __GO32__ E long FDECL(freediskspace, (char *)); # ifdef MSDOS E int FDECL(findfirst_file, (char *)); E int NDECL(findnext_file); E long FDECL(filesize_nh, (char *)); # else E int FDECL(findfirst, (char *)); E int NDECL(findnext); E long FDECL(filesize, (char *)); # endif /* MSDOS */ E char *NDECL(foundfile_buffer); # endif /* __GO32__ */ # ifndef __CYGWIN__ E void FDECL(chdrive, (char *)); # endif # ifndef TOS E void NDECL(disable_ctrlP); E void NDECL(enable_ctrlP); # endif # if defined(MICRO) && !defined(WINNT) E void NDECL(get_scr_size); # ifndef TOS E void FDECL(gotoxy, (int,int)); # endif # endif # ifdef TOS E int FDECL(_copyfile, (char *,char *)); E int NDECL(kbhit); E void NDECL(set_colors); E void NDECL(restore_colors); # ifdef SUSPEND E int NDECL(dosuspend); # endif # endif /* TOS */ # ifdef WIN32 E char *FDECL(get_username, (int *)); E int FDECL(set_binary_mode, (int, int)); E void FDECL(nt_regularize, (char *)); E int NDECL((*nt_kbhit)); E void FDECL(Delay, (int)); # endif /* WIN32 */ #endif /* MICRO || WIN32 */ /* ### mthrowu.c ### */ E int FDECL(thitu, (int,int,struct obj *,const char *)); E int FDECL(ohitmon, (struct monst *,struct monst *,struct obj *,int,BOOLEAN_P)); E void FDECL(thrwmu, (struct monst *)); E int FDECL(spitmu, (struct monst *,struct attack *)); E int FDECL(breamu, (struct monst *,struct attack *)); E boolean FDECL(breamspot, (struct monst *, struct attack *, XCHAR_P, XCHAR_P)); E boolean FDECL(linedup, (XCHAR_P,XCHAR_P,XCHAR_P,XCHAR_P)); E boolean FDECL(lined_up, (struct monst *)); E struct obj *FDECL(m_carrying, (struct monst *,int)); E void FDECL(m_useup, (struct monst *,struct obj *)); E void FDECL(m_throw, (struct monst *,int,int,int,int,int,struct obj *)); E boolean FDECL(hits_bars, (struct obj **,int,int,int,int)); /* ### muse.c ### */ E boolean FDECL(find_defensive, (struct monst *)); E int FDECL(use_defensive, (struct monst *)); E int FDECL(rnd_defensive_item, (struct monst *)); E boolean FDECL(find_offensive, (struct monst *)); #ifdef USE_TRAMPOLI E int FDECL(mbhitm, (struct monst *,struct obj *)); #endif E int FDECL(use_offensive, (struct monst *)); E int FDECL(rnd_offensive_item, (struct monst *)); E boolean FDECL(find_misc, (struct monst *)); E int FDECL(use_misc, (struct monst *)); E int FDECL(rnd_misc_item, (struct monst *)); E boolean FDECL(searches_for_item, (struct monst *,struct obj *)); E boolean FDECL(mon_reflects, (struct monst *,const char *)); E boolean FDECL(ureflects, (const char *,const char *)); E boolean FDECL(munstone, (struct monst *,BOOLEAN_P)); /* ### music.c ### */ E void NDECL(awaken_soldiers); E int FDECL(do_play_instrument, (struct obj *)); /* ### nhlan.c ### */ #ifdef LAN_FEATURES E void NDECL(init_lan_features); E char *NDECL(lan_username); # ifdef LAN_MAIL E boolean NDECL(lan_mail_check); E void FDECL(lan_mail_read, (struct obj *)); E void NDECL(lan_mail_init); E void NDECL(lan_mail_finish); E void NDECL(lan_mail_terminate); # endif #endif /* ### nttty.c ### */ #ifdef WIN32CON E void NDECL(get_scr_size); E int NDECL(nttty_kbhit); E void NDECL(nttty_check_stdio); E void NDECL(nttty_open); E void NDECL(nttty_rubout); E int NDECL(tgetch); E int FDECL(ntposkey,(int *, int *, int *)); E void FDECL(set_output_mode, (int)); E void NDECL(synch_cursor); #endif /* ### o_init.c ### */ E void NDECL(init_objects); E int NDECL(find_skates); E void NDECL(oinit); E void FDECL(savenames, (int,int)); E void FDECL(restnames, (int)); E void FDECL(discover_object, (int,BOOLEAN_P,BOOLEAN_P)); E void FDECL(undiscover_object, (int)); E int NDECL(dodiscovered); /* ### objects.c ### */ E void NDECL(objects_init); /* ### objnam.c ### */ E char *FDECL(obj_typename, (int)); E char *FDECL(simple_typename, (int)); E boolean FDECL(obj_is_pname, (struct obj *)); E char *FDECL(distant_name, (struct obj *,char *(*)(OBJ_P))); E char *FDECL(fruitname, (BOOLEAN_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 char *FDECL(killer_xname, (struct obj *)); E char *FDECL(killer_cxname, (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(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(ysimple_name, (struct obj *)); E char *FDECL(Ysimple_name2, (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 *)); E const char *FDECL(mimic_obj_name, (struct monst *)); /* ### options.c ### */ E boolean FDECL(match_optname, (const char *,const char *,int,BOOLEAN_P)); E void NDECL(initoptions); E void FDECL(parseoptions, (char *,BOOLEAN_P,BOOLEAN_P)); E void FDECL(parsetileset, (char *)); E int NDECL(doset); E int NDECL(dotogglepickup); E void NDECL(option_help); E void FDECL(next_opt, (winid,const char *)); E int FDECL(fruitadd, (char *)); E int FDECL(choose_classes_menu, (const char *,int,BOOLEAN_P,char *,char *)); E void FDECL(add_menu_cmd_alias, (CHAR_P, CHAR_P)); 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_wc2_option_mod_status, (unsigned long, int)); E void FDECL(set_option_mod_status, (const char *, int)); #ifdef MENU_COLOR E boolean FDECL(add_menu_coloring, (char *)); #endif #ifdef AUTOPICKUP_EXCEPTIONS E int FDECL(add_autopickup_exception, (const char *)); E void NDECL(free_autopickup_exceptions); #endif /* AUTOPICKUP_EXCEPTIONS */ /* ### pager.c ### */ E int NDECL(dowhatis); E int NDECL(doquickwhatis); E int NDECL(doidtrap); E int NDECL(dowhatdoes); E char *FDECL(dowhatdoes_core,(CHAR_P, char *)); E int NDECL(dohelp); E int NDECL(dohistory); /* ### pcmain.c ### */ #if defined(MICRO) || defined(WIN32) # ifdef CHDIR E void FDECL(chdirx, (char *,BOOLEAN_P)); # endif /* CHDIR */ #endif /* MICRO || WIN32 */ /* ### pcsys.c ### */ #if defined(MICRO) || defined(WIN32) E void NDECL(flushout); E int NDECL(dosh); # ifdef MFLOPPY E void FDECL(eraseall, (const char *,const char *)); E void FDECL(copybones, (int)); E void NDECL(playwoRAMdisk); E int FDECL(saveDiskPrompt, (int)); E void NDECL(gameDiskPrompt); # endif E void FDECL(append_slash, (char *)); E void FDECL(getreturn, (const char *)); # ifndef AMIGA E void VDECL(msmsg, (const char *,...)); # endif E FILE *FDECL(fopenp, (const char *,const char *)); #endif /* MICRO || WIN32 */ /* ### pctty.c ### */ #if defined(MICRO) || defined(WIN32) E void NDECL(gettty); E void FDECL(settty, (const char *)); E void NDECL(setftty); E void VDECL(error, (const char *,...)); #if defined(TIMED_DELAY) && defined(_MSC_VER) E void FDECL(msleep, (unsigned)); #endif #endif /* MICRO || WIN32 */ /* ### pcunix.c ### */ #if defined(MICRO) E void FDECL(regularize, (char *)); #endif /* MICRO */ #if defined(PC_LOCKING) E void NDECL(getlock); #endif /* ### pickup.c ### */ #ifdef GOLDOBJ E int FDECL(collect_obj_classes, (char *,struct obj *,BOOLEAN_P,boolean FDECL((*),(OBJ_P)), int *)); #else E int FDECL(collect_obj_classes, (char *,struct obj *,BOOLEAN_P,BOOLEAN_P,boolean FDECL((*),(OBJ_P)), int *)); #endif E void FDECL(add_valid_menu_class, (int)); E boolean FDECL(allow_all, (struct obj *)); E boolean FDECL(allow_category, (struct obj *)); E boolean FDECL(is_worn_by_type, (struct obj *)); E boolean FDECL(mbag_explodes, (struct obj *, int)); E void FDECL(destroy_mbag, (struct obj *, BOOLEAN_P)); #ifdef USE_TRAMPOLI E int FDECL(ck_bag, (struct obj *)); E int FDECL(in_container, (struct obj *)); E int FDECL(out_container, (struct obj *)); #endif E int FDECL(pickup, (int)); E int FDECL(pickup_object, (struct obj *, long, BOOLEAN_P)); E int FDECL(query_category, (const char *, struct obj *, int, menu_item **, int)); E int FDECL(query_objlist, (const char *, struct obj *, int, menu_item **, int, boolean (*)(OBJ_P))); E struct obj *FDECL(pick_obj, (struct obj *)); E int NDECL(encumber_msg); E int NDECL(doloot); E boolean FDECL(container_gone, (int (*)(OBJ_P))); E int FDECL(use_container, (struct obj **,int)); E int FDECL(loot_mon, (struct monst *,int *,boolean *)); E const char *FDECL(safe_qbuf, (const char *,unsigned, const char *,const char *,const char *)); E boolean FDECL(is_autopickup_exception, (struct obj *, BOOLEAN_P)); /* ### pline.c ### */ E void VDECL(pline, (const char *,...)) PRINTF_F(1,2); E void VDECL(Norep, (const char *,...)) PRINTF_F(1,2); E void NDECL(free_youbuf); E void VDECL(You, (const char *,...)) PRINTF_F(1,2); E void VDECL(Your, (const char *,...)) PRINTF_F(1,2); E void VDECL(You_feel, (const char *,...)) PRINTF_F(1,2); E void VDECL(You_cant, (const char *,...)) PRINTF_F(1,2); E void VDECL(You_hear, (const char *,...)) PRINTF_F(1,2); E void VDECL(pline_The, (const char *,...)) PRINTF_F(1,2); E void VDECL(There, (const char *,...)) PRINTF_F(1,2); E void VDECL(verbalize, (const char *,...)) PRINTF_F(1,2); E void VDECL(raw_printf, (const char *,...)) PRINTF_F(1,2); E void VDECL(impossible, (const char *,...)) PRINTF_F(1,2); E const char *FDECL(align_str, (ALIGNTYP_P)); E void FDECL(mstatusline, (struct monst *)); E void NDECL(ustatusline); E void NDECL(self_invis_message); /* ### polyself.c ### */ E void NDECL(init_uasmon); 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); E int NDECL(dospit); 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); E void FDECL(ugolemeffects, (int,int)); E int NDECL(polyatwill); /* ### potion.c ### */ E void FDECL(set_itimeout, (long *,long)); E void FDECL(incr_itimeout, (long *,int)); E void FDECL(make_confused, (long,BOOLEAN_P)); E void FDECL(make_stunned, (long,BOOLEAN_P)); E void FDECL(make_blinded, (long,BOOLEAN_P)); E void FDECL(make_sick, (long, const char *, BOOLEAN_P,int)); E void FDECL(make_vomiting, (long,BOOLEAN_P)); E boolean FDECL(make_hallucinated, (long,BOOLEAN_P,long)); E int NDECL(dodrink); E int FDECL(dopotion, (struct obj *)); E int FDECL(peffects, (struct obj *)); E void FDECL(healup, (int,int,BOOLEAN_P,BOOLEAN_P)); E void FDECL(strange_feeling, (struct obj *,const char *)); E void FDECL(potionhit, (struct monst *,struct obj *,BOOLEAN_P)); E void FDECL(potionbreathe, (struct obj *)); E boolean FDECL(get_wet, (struct obj *, BOOLEAN_P)); E int NDECL(dodip); E void FDECL(djinni_from_bottle, (struct obj *)); /* KMH, balance patch -- new function */ E int FDECL(upgrade_obj, (struct obj *)); E struct monst *FDECL(split_mon, (struct monst *,struct monst *)); E const char *NDECL(bottlename); /* ### pray.c ### */ #ifdef USE_TRAMPOLI E int NDECL(prayer_done); #endif E int NDECL(dosacrifice); E boolean FDECL(can_pray, (BOOLEAN_P)); E int NDECL(dopray); E const char *NDECL(u_gname); E int NDECL(doturn); E int NDECL(turn_undead); E const char *NDECL(a_gname); E const char *FDECL(a_gname_at, (XCHAR_P x,XCHAR_P y)); E const char *FDECL(align_gname, (ALIGNTYP_P)); E const char *FDECL(halu_gname, (ALIGNTYP_P)); E const char *FDECL(align_gtitle, (ALIGNTYP_P)); E void FDECL(altar_wrath, (int,int)); /* ### priest.c ### */ E int FDECL(move_special, (struct monst *,BOOLEAN_P,SCHAR_P,BOOLEAN_P,BOOLEAN_P, XCHAR_P,XCHAR_P,XCHAR_P,XCHAR_P)); E char FDECL(temple_occupied, (char *)); E int FDECL(pri_move, (struct monst *)); E void FDECL(priestini, (d_level *,struct mkroom *,int,int,BOOLEAN_P)); E char *FDECL(priestname, (struct monst *,char *)); E boolean FDECL(p_coaligned, (struct monst *)); E struct monst *FDECL(findpriest, (CHAR_P)); E void FDECL(intemple, (int)); E void FDECL(priest_talk, (struct monst *)); E struct monst *FDECL(mk_roamer, (struct permonst *,ALIGNTYP_P, XCHAR_P,XCHAR_P,BOOLEAN_P)); E void FDECL(reset_hostility, (struct monst *)); E boolean FDECL(in_your_sanctuary, (struct monst *,XCHAR_P,XCHAR_P)); E void FDECL(ghod_hitsu, (struct monst *)); E void NDECL(angry_priest); E void NDECL(clearpriests); E void FDECL(restpriest, (struct monst *,BOOLEAN_P)); /* ### quest.c ### */ E void NDECL(onquest); E void NDECL(nemdead); E void NDECL(artitouch); E boolean NDECL(ok_to_quest); E void FDECL(leader_speaks, (struct monst *)); E void NDECL(nemesis_speaks); E void FDECL(quest_chat, (struct monst *)); E void FDECL(quest_talk, (struct monst *)); E void FDECL(quest_stat_check, (struct monst *)); E void FDECL(finish_quest, (struct obj *)); /* ### questpgr.c ### */ E void NDECL(load_qtlist); E void NDECL(unload_qtlist); E short FDECL(quest_info, (int)); E const char *NDECL(ldrname); E boolean FDECL(is_quest_artifact, (struct obj*)); E void FDECL(com_pager, (int)); E void FDECL(qt_pager, (int)); E struct permonst *NDECL(qt_montype); /* ### random.c ### */ #if defined(RANDOM) && !defined(__GO32__) /* djgpp has its own random */ E void FDECL(srandom, (unsigned)); E char *FDECL(initstate, (unsigned,char *,int)); E char *FDECL(setstate, (char *)); E long NDECL(random); #endif /* RANDOM */ /* ### read.c ### */ E int NDECL(doread); E boolean FDECL(is_chargeable, (struct obj *)); E void FDECL(recharge, (struct obj *,int)); E void FDECL(forget, (int)); E void FDECL(forget_objects, (int)); E void FDECL(forget_levels, (int)); E void NDECL(forget_traps); E void FDECL(forget_map, (int)); E int FDECL(seffects, (struct obj *)); #ifdef USE_TRAMPOLI E void FDECL(set_lit, (int,int,genericptr_t)); #endif E void FDECL(litroom, (BOOLEAN_P,struct obj *)); E void FDECL(do_genocide, (int)); E void FDECL(punish, (struct obj *)); E void NDECL(unpunish); E boolean FDECL(cant_create, (int *, BOOLEAN_P)); #ifdef WIZARD E struct monst *NDECL(create_particular); #endif /* ### rect.c ### */ E void NDECL(init_rect); E NhRect *FDECL(get_rect, (NhRect *)); E NhRect *NDECL(rnd_rect); E void FDECL(remove_rect, (NhRect *)); E void FDECL(add_rect, (NhRect *)); E void FDECL(split_rects, (NhRect *,NhRect *)); /* ## region.c ### */ E void NDECL(clear_regions); E void NDECL(run_regions); E boolean FDECL(in_out_region, (XCHAR_P,XCHAR_P)); E boolean FDECL(m_in_out_region, (struct monst *,XCHAR_P,XCHAR_P)); E void NDECL(update_player_regions); E void FDECL(update_monster_region, (struct monst *)); E NhRegion *FDECL(visible_region_at, (XCHAR_P,XCHAR_P)); E void FDECL(show_region, (NhRegion*, XCHAR_P, XCHAR_P)); E void FDECL(save_regions, (int,int)); E void FDECL(rest_regions, (int,BOOLEAN_P)); E NhRegion* FDECL(create_gas_cloud, (XCHAR_P, XCHAR_P, int, int)); E NhRegion* FDECL(create_cthulhu_death_cloud, (XCHAR_P, XCHAR_P, int, int)); /* ### restore.c ### */ E void FDECL(inven_inuse, (BOOLEAN_P)); E int FDECL(dorecover, (int)); E void FDECL(trickery, (char *)); E void FDECL(getlev, (int,int,XCHAR_P,BOOLEAN_P)); E void NDECL(minit); E boolean FDECL(lookup_id_mapping, (unsigned, unsigned *)); #ifdef ZEROCOMP E int FDECL(mread, (int,genericptr_t,unsigned int)); #else E void FDECL(mread, (int,genericptr_t,unsigned int)); #endif /* ### rip.c ### */ E void FDECL(genl_outrip, (winid,int)); /* ### rnd.c ### */ E int FDECL(rn2, (int)); E int FDECL(rnl, (int)); E int FDECL(rnd, (int)); E int FDECL(d, (int,int)); E int FDECL(rne, (int)); E int FDECL(rnz, (int)); /* ### role.c ### */ E boolean FDECL(validrole, (int)); E boolean FDECL(validrace, (int, int)); E boolean FDECL(validgend, (int, int, int)); E boolean FDECL(validalign, (int, int, int)); E int NDECL(randrole); E int FDECL(randrace, (int)); E int FDECL(randgend, (int, int)); E int FDECL(randalign, (int, int)); E int FDECL(str2role, (char *)); E int FDECL(str2race, (char *)); E int FDECL(str2gend, (char *)); E int FDECL(str2align, (char *)); E int FDECL(mrace2race, (int)); 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 ### */ E char *FDECL(getrumor, (int,char *, BOOLEAN_P)); E void FDECL(outrumor, (int,int)); E void FDECL(outoracle, (BOOLEAN_P, BOOLEAN_P)); E void FDECL(save_oracles, (int,int)); E void FDECL(restore_oracles, (int)); E int FDECL(doconsult, (struct monst *)); /* ### 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); #ifdef INSURANCE E void NDECL(savestateinlock); #endif #ifdef MFLOPPY E boolean FDECL(savelev, (int,XCHAR_P,int)); E boolean FDECL(swapin_file, (int)); E void NDECL(co_false); #else E void FDECL(savelev, (int,XCHAR_P,int)); #endif E void FDECL(bufon, (int)); E void FDECL(bufoff, (int)); E void FDECL(bflush, (int)); E void FDECL(bwrite, (int,genericptr_t,unsigned int)); E void FDECL(bclose, (int)); E void FDECL(savefruitchn, (int,int)); E void NDECL(free_dungeons); E void NDECL(freedynamicdata); /* ### 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)); E void FDECL(replshk, (struct monst *,struct monst *)); 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); E int FDECL(inhishop, (struct monst *)); E struct monst *FDECL(shop_keeper, (CHAR_P)); E boolean FDECL(tended_shop, (struct mkroom *)); E void FDECL(delete_contents, (struct obj *)); E void FDECL(obfree, (struct obj *,struct obj *)); E void FDECL(home_shk, (struct monst *,BOOLEAN_P)); E void FDECL(make_happy_shk, (struct monst *,BOOLEAN_P)); E void FDECL(hot_pursuit, (struct monst *)); E void FDECL(make_angry_shk, (struct monst *,XCHAR_P,XCHAR_P)); E int NDECL(dopay); E boolean FDECL(paybill, (int)); 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 *)); E void FDECL(addtobill, (struct obj *,BOOLEAN_P,BOOLEAN_P,BOOLEAN_P)); 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, 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 *)); E void FDECL(after_shk_move, (struct monst *)); E boolean FDECL(is_fshk, (struct monst *)); E void FDECL(shopdig, (int)); E void FDECL(pay_for_damage, (const char *,BOOLEAN_P)); E boolean FDECL(costly_spot, (XCHAR_P,XCHAR_P)); E struct obj *FDECL(shop_object, (XCHAR_P,XCHAR_P)); E void FDECL(price_quote, (struct obj *)); E void FDECL(shk_chat, (struct monst *)); E void FDECL(check_unpaid_usage, (struct obj *,BOOLEAN_P)); E void FDECL(check_unpaid, (struct obj *)); E void FDECL(costly_gold, (XCHAR_P,XCHAR_P,long)); E boolean FDECL(block_door, (XCHAR_P,XCHAR_P)); E boolean FDECL(block_entry, (XCHAR_P,XCHAR_P)); E boolean FDECL(block_entry, (XCHAR_P,XCHAR_P)); #ifdef BLACKMARKET E void FDECL(blkmar_guards, (struct monst *)); #endif /* BLACKMARKET */ E char *FDECL(shk_your, (char *,struct obj *)); E char *FDECL(Shk_Your, (char *,struct obj *)); /* ### shknam.c ### */ E void FDECL(stock_room, (int,struct mkroom *)); E boolean FDECL(saleable, (struct monst *,struct obj *)); E int FDECL(get_shop_item, (int)); /* ### sit.c ### */ E void NDECL(take_gold); E int NDECL(dosit); E void NDECL(rndcurse); E void NDECL(attrcurse); /* ### sounds.c ### */ E void NDECL(dosounds); E void FDECL(pet_distress, (struct monst *, int)); E const char *FDECL(growl_sound, (struct monst *)); /* JRN: converted growl,yelp,whimper to macros based on pet_distress. Putting them here since I don't know where else (TOFIX) */ #define growl(mon) pet_distress((mon),3) #define yelp(mon) pet_distress((mon),2) #define whimper(mon) pet_distress((mon),1) E void FDECL(beg, (struct monst *)); E int NDECL(dotalk); #ifdef USER_SOUNDS E int FDECL(add_sound_mapping, (const char *)); E void FDECL(play_sound_for_message, (const char *)); #endif /* ### sys/msdos/sound.c ### */ #ifdef MSDOS E int FDECL(assign_soundcard, (char *)); #endif /* ### sp_lev.c ### */ E boolean FDECL(check_room, (xchar *,xchar *,xchar *,xchar *,BOOLEAN_P)); E boolean FDECL(create_room, (XCHAR_P,XCHAR_P,XCHAR_P,XCHAR_P, XCHAR_P,XCHAR_P,XCHAR_P,XCHAR_P)); E void FDECL(create_secret_door, (struct mkroom *,XCHAR_P)); E boolean FDECL(dig_corridor, (coord *,coord *,BOOLEAN_P,SCHAR_P,SCHAR_P)); E void FDECL(fill_room, (struct mkroom *,BOOLEAN_P)); E boolean FDECL(load_special, (const char *)); /* ### spell.c ### */ #ifdef USE_TRAMPOLI 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); E int FDECL(spell_skilltype, (int)); E int FDECL(spelleffects, (int,BOOLEAN_P)); E void NDECL(losespells); E int NDECL(dovspell); E void FDECL(learnspell, (struct obj *)); E boolean NDECL(studyspell); E void FDECL(initialspell, (struct obj *)); /* ### steal.c ### */ #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 *,BOOLEAN_P)); E int FDECL(steal, (struct monst *, char *)); E int FDECL(mpickobj, (struct monst *,struct obj *)); E void FDECL(stealamulet, (struct monst *)); E void FDECL(mdrop_special_objs, (struct monst *)); E void FDECL(relobj, (struct monst *,int,BOOLEAN_P)); #ifdef GOLDOBJ E struct obj *FDECL(findgold, (struct obj *)); #endif /* ### steed.c ### */ #ifdef STEED E void NDECL(rider_cant_reach); E boolean FDECL(can_saddle, (struct monst *)); E int FDECL(use_saddle, (struct obj *)); E boolean FDECL(can_ride, (struct monst *)); E int NDECL(doride); E boolean FDECL(mount_steed, (struct monst *, BOOLEAN_P)); E void NDECL(exercise_steed); E void NDECL(kick_steed); E void FDECL(dismount_steed, (int)); E void FDECL(place_monster, (struct monst *,int,int)); #endif /* ### tech.c ### */ E void FDECL(adjtech, (int,int)); E int NDECL(dotech); E void NDECL(docalm); E int FDECL(tech_inuse, (int)); E void NDECL(tech_timeout); E boolean FDECL(tech_known, (SHORT_P)); E void FDECL(learntech, (SHORT_P,long,int)); /* ### teleport.c ### */ E boolean FDECL(goodpos, (int,int,struct monst *,unsigned)); E boolean FDECL(enexto, (coord *,XCHAR_P,XCHAR_P,struct permonst *)); E boolean FDECL(enexto_core, (coord *,XCHAR_P,XCHAR_P,struct permonst *,unsigned)); E int FDECL(epathto, (coord *,int,XCHAR_P,XCHAR_P,struct permonst *)); E void FDECL(xpathto, (int,XCHAR_P,XCHAR_P,int (*)(genericptr_t,int,int),void *)); E void FDECL(teleds, (int,int,BOOLEAN_P)); E boolean FDECL(safe_teleds, (BOOLEAN_P)); E boolean FDECL(teleport_pet, (struct monst *,BOOLEAN_P)); E void NDECL(tele); E int NDECL(dotele); E void NDECL(level_tele); E void FDECL(domagicportal, (struct trap *)); E void FDECL(tele_trap, (struct trap *)); E void FDECL(level_tele_trap, (struct trap *)); E void FDECL(rloc_to, (struct monst *,int,int)); E boolean FDECL(rloc, (struct monst *, BOOLEAN_P)); E boolean FDECL(tele_restrict, (struct monst *)); E void FDECL(mtele_trap, (struct monst *, struct trap *,int)); E int FDECL(mlevel_tele_trap, (struct monst *, struct trap *,BOOLEAN_P,int)); E void FDECL(rloco, (struct obj *)); E int NDECL(random_teleport_level); E boolean FDECL(u_teleport_mon, (struct monst *,BOOLEAN_P)); /* ### tile.c ### */ #ifdef USE_TILES E void FDECL(substitute_tiles, (d_level *)); #endif /* ### timeout.c ### */ E void NDECL(burn_away_slime); E void NDECL(nh_timeout); E void FDECL(fall_asleep, (int, BOOLEAN_P)); #ifdef UNPOLYPILE E void FDECL(set_obj_poly, (struct obj *, struct obj *)); E void FDECL(unpoly_obj, (genericptr_t, long)); #endif E int FDECL(mon_poly, (struct monst *, BOOLEAN_P, const char *)); E int FDECL(mon_spec_poly, (struct monst *, struct permonst *, long, BOOLEAN_P, BOOLEAN_P, BOOLEAN_P, BOOLEAN_P)); E void FDECL(unpoly_mon, (genericptr_t, long)); E void FDECL(attach_bomb_blow_timeout, (struct obj *, int, BOOLEAN_P)); E void FDECL(attach_egg_hatch_timeout, (struct obj *)); E void FDECL(attach_fig_transform_timeout, (struct obj *)); E void FDECL(kill_egg, (struct obj *)); E void FDECL(hatch_egg, (genericptr_t, long)); E void FDECL(learn_egg_type, (int)); E void FDECL(burn_object, (genericptr_t, long)); E void FDECL(begin_burn, (struct obj *, BOOLEAN_P)); E void FDECL(end_burn, (struct obj *, BOOLEAN_P)); E void FDECL(burn_faster, (struct obj *, long)); #ifdef LIGHTSABERS E void FDECL(lightsaber_deactivate, (struct obj *, BOOLEAN_P)); #endif E void NDECL(do_storms); E boolean FDECL(start_timer, (long, SHORT_P, SHORT_P, genericptr_t)); E long FDECL(stop_timer, (SHORT_P, genericptr_t)); E void NDECL(run_timers); E void FDECL(obj_move_timers, (struct obj *, struct obj *)); E void FDECL(obj_split_timers, (struct obj *, struct obj *)); E void FDECL(obj_stop_timers, (struct obj *)); E void FDECL(mon_stop_timers, (struct monst *)); E boolean FDECL(obj_is_local, (struct obj *)); E void FDECL(save_timers, (int,int,int)); E void FDECL(restore_timers, (int,int,BOOLEAN_P,long)); E void FDECL(relink_timers, (BOOLEAN_P)); #ifdef WIZARD E int NDECL(wiz_timeout_queue); E void NDECL(timer_sanity_check); #endif /* ### topten.c ### */ E void FDECL(topten, (int)); E void FDECL(prscore, (int,char **)); E struct obj *FDECL(tt_oname, (struct obj *)); #ifdef GTK_GRAPHICS E winid NDECL(create_toptenwin); E void NDECL(destroy_toptenwin); #endif /* ### track.c ### */ E void NDECL(initrack); E void NDECL(settrack); E coord *FDECL(gettrack, (int,int)); /* ### trap.c ### */ 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 *)); E void FDECL(minstapetrify, (struct monst *,BOOLEAN_P)); E void FDECL(selftouch, (const char *)); E void FDECL(mselftouch, (struct monst *,const char *,BOOLEAN_P)); 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(mon_drain_en, (struct monst *, int)); E void FDECL(drain_en, (int)); E int NDECL(dountrap); E int FDECL(untrap, (BOOLEAN_P)); E boolean FDECL(chest_trap, (struct obj *,int,BOOLEAN_P)); E void FDECL(deltrap, (struct trap *)); E boolean FDECL(delfloortrap, (struct trap *)); E struct trap *FDECL(t_at, (int,int)); 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)); /* KMH, balance patch -- new function */ E int NDECL(uunstone); /* ### u_init.c ### */ E void NDECL(u_init); /* ### uhitm.c ### */ E void FDECL(hurtmarmor,(struct monst *,int)); E int FDECL(attack_checks, (struct monst *,BOOLEAN_P)); E void FDECL(check_caitiff, (struct monst *)); E schar FDECL(find_roll_to_hit, (struct monst *)); E boolean FDECL(attack, (struct monst *)); E boolean FDECL(hmon, (struct monst *,struct obj *,int)); E int FDECL(damageum, (struct monst *,struct attack *)); E void FDECL(missum, (struct monst *,int, int, struct attack *)); E int FDECL(passive, (struct monst *,int,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 *)); /* ### unixmain.c ### */ #ifdef UNIX # ifdef PORT_HELP E void NDECL(port_help); # endif #endif /* UNIX */ /* ### unixtty.c ### */ #if defined(UNIX) || defined(__BEOS__) E void NDECL(gettty); E void FDECL(settty, (const char *)); E void NDECL(setftty); E void NDECL(intron); E void NDECL(introff); E void VDECL(error, (const char *,...)) PRINTF_F(1,2); #endif /* UNIX || __BEOS_ */ /* ### unixunix.c ### */ #ifdef UNIX E void NDECL(getlock); E void FDECL(regularize, (char *)); # if defined(TIMED_DELAY) && !defined(msleep) && defined(SYSV) E void FDECL(msleep, (unsigned)); # endif # ifdef SHELL E int NDECL(dosh); # endif /* SHELL */ # if defined(SHELL) || defined(DEF_PAGER) || defined(DEF_MAILREADER) E int FDECL(child, (int)); # endif #ifdef FILE_AREAS E char *FDECL(make_file_name, (const char *, const char *)); E FILE *FDECL(fopen_datafile_area, (const char *,const char *,const char *, BOOLEAN_P)); E FILE *FDECL(freopen_area, (const char *,const char *,const char *, FILE *)); E int FDECL(chmod_area, (const char *, const char *, int)); E int FDECL(open_area, (const char *, const char *, int, int)); E int FDECL(creat_area, (const char *, const char *, int)); E boolean FDECL(lock_file_area, (const char *, const char *,int)); E void FDECL(unlock_file_area, (const char *, const char *)); #endif #endif /* UNIX */ /* ### unixres.c ### */ #ifdef UNIX E int FDECL(hide_privileges, (BOOLEAN_P)); #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 *)); E char FDECL(vault_occupied, (char *)); E void NDECL(invault); E int FDECL(gd_move, (struct monst *)); E void NDECL(paygd); E long NDECL(hidden_gold); E boolean NDECL(gd_sound); /* ### version.c ### */ E char *FDECL(version_string, (char *)); E char *FDECL(getversionstring, (char *)); E int NDECL(doversion); E int NDECL(doextversion); #ifdef MICRO E boolean FDECL(comp_times, (long)); #endif E boolean FDECL(check_version, (struct version_info *, const char *,BOOLEAN_P)); E unsigned long FDECL(get_feature_notice_ver, (char *)); E unsigned long NDECL(get_current_feature_ver); #ifdef RUNTIME_PORT_ID E void FDECL(append_port_id, (char *)); #endif /* ### video.c ### */ #ifdef MSDOS E int FDECL(assign_video, (char *)); # ifdef NO_TERMS E void NDECL(gr_init); E void NDECL(gr_finish); # endif E void FDECL(tileview,(BOOLEAN_P)); #endif #ifdef VIDEOSHADES E int FDECL(assign_videoshades, (char *)); E int FDECL(assign_videocolors, (char *)); #endif /* ### vis_tab.c ### */ #ifdef VISION_TABLES E void NDECL(vis_tab_init); #endif /* ### vision.c ### */ E void NDECL(vision_init); E int FDECL(does_block, (int,int,struct rm*)); E void NDECL(vision_reset); E void FDECL(vision_recalc, (int)); E void FDECL(block_point, (int,int)); E void FDECL(unblock_point, (int,int)); E boolean FDECL(clear_path, (int,int,int,int)); E void FDECL(do_clear_area, (int,int,int, void (*)(int,int,genericptr_t),genericptr_t)); #ifdef VMS /* ### vmsfiles.c ### */ E int FDECL(vms_link, (const char *,const char *)); E int FDECL(vms_unlink, (const char *)); E int FDECL(vms_creat, (const char *,unsigned int)); E int FDECL(vms_open, (const char *,int,unsigned int)); E boolean FDECL(same_dir, (const char *,const char *)); E int FDECL(c__translate, (int)); E char *FDECL(vms_basename, (const char *)); /* ### vmsmail.c ### */ E unsigned long NDECL(init_broadcast_trapping); E unsigned long NDECL(enable_broadcast_trapping); E unsigned long NDECL(disable_broadcast_trapping); # if 0 E struct mail_info *NDECL(parse_next_broadcast); # endif /*0*/ /* ### vmsmain.c ### */ E int FDECL(main, (int, char **)); # ifdef CHDIR E void FDECL(chdirx, (const char *,BOOLEAN_P)); # endif /* CHDIR */ /* ### vmsmisc.c ### */ E void NDECL(vms_abort); E void FDECL(vms_exit, (int)); /* ### vmstty.c ### */ E int NDECL(vms_getchar); E void NDECL(gettty); E void FDECL(settty, (const char *)); E void FDECL(shuttty, (const char *)); E void NDECL(setftty); E void NDECL(intron); E void NDECL(introff); E void VDECL(error, (const char *,...)) PRINTF_F(1,2); #ifdef TIMED_DELAY E void FDECL(msleep, (unsigned)); #endif /* ### vmsunix.c ### */ E void NDECL(getlock); E void FDECL(regularize, (char *)); E int NDECL(vms_getuid); E boolean FDECL(file_is_stmlf, (int)); E int FDECL(vms_define, (const char *,const char *,int)); E int FDECL(vms_putenv, (const char *)); E char *NDECL(verify_termcap); # if defined(CHDIR) || defined(SHELL) || defined(SECURE) E void NDECL(privoff); E void NDECL(privon); # endif # ifdef SHELL E int NDECL(dosh); # endif # if defined(SHELL) || defined(MAIL) E int FDECL(vms_doshell, (const char *,BOOLEAN_P)); # endif # ifdef SUSPEND E int NDECL(dosuspend); # endif #endif /* VMS */ /* ### weapon.c ### */ E int FDECL(hitval, (struct obj *,struct monst *)); E int FDECL(dmgval, (struct obj *,struct monst *)); E struct obj *FDECL(select_rwep, (struct monst *)); E struct obj *FDECL(select_hwep, (struct monst *)); E void FDECL(possibly_unwield, (struct monst *,BOOLEAN_P)); E int FDECL(mon_wield_item, (struct monst *)); E int NDECL(abon); E int NDECL(dbon); E int NDECL(enhance_weapon_skill); E void FDECL(unrestrict_weapon_skill, (int)); E void FDECL(use_skill, (int,int)); E void FDECL(add_weapon_skill, (int)); E void FDECL(lose_weapon_skill, (int)); E int FDECL(weapon_type, (struct obj *)); E int NDECL(uwep_skill_type); E int FDECL(weapon_hit_bonus, (struct obj *)); E int FDECL(weapon_dam_bonus, (struct obj *)); E int FDECL(skill_bonus, (int)); E void FDECL(skill_init, (const struct def_skill *)); E void NDECL(practice_weapon); /* ### were.c ### */ E int FDECL(counter_were,(int)); E void FDECL(were_change, (struct monst *)); E void FDECL(new_were, (struct monst *)); E int FDECL(were_summon, (struct permonst *,BOOLEAN_P,int *,char *)); E void NDECL(you_were); E void FDECL(you_unwere, (BOOLEAN_P)); /* ### wield.c ### */ E void FDECL(setuwep, (struct obj *,BOOLEAN_P)); E void FDECL(setuqwep, (struct obj *)); E void FDECL(setuswapwep, (struct obj *,BOOLEAN_P)); E int NDECL(dowield); E int NDECL(doswapweapon); E int NDECL(dowieldquiver); E boolean FDECL(wield_tool, (struct obj *,const char *)); E int NDECL(can_twoweapon); E void NDECL(drop_uswapwep); E int NDECL(dotwoweapon); E void NDECL(uwepgone); E void NDECL(uswapwepgone); E void NDECL(uqwepgone); E void NDECL(untwoweapon); 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 *)); E void FDECL(unwield, (struct obj *,BOOLEAN_P)); /* ### 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 ### */ E void NDECL(amulet); E int FDECL(mon_has_amulet, (struct monst *)); E int FDECL(mon_has_special, (struct monst *)); E int FDECL(tactics, (struct monst *)); 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); E void FDECL(cuss, (struct monst *)); /* ### worm.c ### */ E int NDECL(get_wormno); E void FDECL(initworm, (struct monst *,int)); E void FDECL(worm_move, (struct monst *)); E void FDECL(worm_nomove, (struct monst *)); E void FDECL(wormgone, (struct monst *)); E void FDECL(wormhitu, (struct monst *)); E int FDECL(cutworm, (struct monst *,XCHAR_P,XCHAR_P,struct obj *)); E void FDECL(see_wsegs, (struct monst *)); E void FDECL(detect_wsegs, (struct monst *,BOOLEAN_P)); E void FDECL(save_worm, (int,int)); E void FDECL(rest_worm, (int)); E void FDECL(place_wsegs, (struct monst *)); E void FDECL(remove_worm, (struct monst *)); E void FDECL(place_worm_tail_randomly, (struct monst *,XCHAR_P,XCHAR_P)); E int FDECL(count_wsegs, (struct monst *)); E boolean FDECL(worm_known, (struct monst *)); /* ### worn.c ### */ 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,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); E int FDECL(racial_exception, (struct monst *, struct obj *)); /* ### write.c ### */ E int FDECL(dowrite, (struct obj *)); /* ### zap.c ### */ E int FDECL(bhitm, (struct monst *,struct obj *)); 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 *)); /* KMH */ E boolean FDECL(obj_resists, (struct obj *,int,int)); E boolean FDECL(obj_shudders, (struct obj *)); E void FDECL(do_osshock, (struct obj *)); E void FDECL(puton_worn_item, (struct obj *)); E struct obj *FDECL(poly_obj, (struct obj *, int)); E int FDECL(bhito, (struct obj *,struct obj *)); E int FDECL(bhitpile, (struct obj *,int (*)(OBJ_P,OBJ_P),int,int)); E int FDECL(zappable, (struct obj *)); E void FDECL(zapnodir, (struct obj *)); E int NDECL(dozap); E int FDECL(zapyourself, (struct obj *,BOOLEAN_P)); E boolean FDECL(cancel_monst, (struct monst *,struct obj *, BOOLEAN_P,BOOLEAN_P,BOOLEAN_P)); E void FDECL(weffects, (struct obj *)); E int FDECL(spell_damage_bonus, (int)); E const char *FDECL(exclam, (int force)); E void FDECL(hit, (const char *,struct monst *,const char *)); E void FDECL(miss, (const char *,struct monst *)); 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 *)); E void FDECL(fracture_rock, (struct obj *)); E boolean FDECL(break_statue, (struct obj *)); E void FDECL(destroy_item, (int,int)); E int FDECL(destroy_mitem, (struct monst *,int,int)); E int FDECL(resist, (struct monst *,CHAR_P,int,int)); E void NDECL(makewish); /* KMH -- xchar to XCHAR_P */ E void FDECL(zap_strike_fx, (XCHAR_P, XCHAR_P, int)); E void NDECL(throwspell); #endif /* !MAKEDEFS_C && !LEV_LEX_C */ #undef E #endif /* EXTERN_H */ slashem-0.0.7E7F3/include/tile2x11.h0000664000076400007640000000064110545462317015022 0ustar aliali/* SCCS Id: @(#)tile2x11.h 3.4 1995/01/25 */ /* NetHack may be freely redistributed. See license for details. */ #ifndef TILE2X11_H #define TILE2X11_H /* * Header for the x11 tile map. */ typedef struct { unsigned long version; unsigned long ncolors; unsigned long tile_width; unsigned long tile_height; unsigned long ntiles; unsigned long per_row; } x11_header; #endif /* TILE2X11_H */ slashem-0.0.7E7F3/src/0000775000076400007640000000000010545462317012443 5ustar alialislashem-0.0.7E7F3/src/save.c0000664000076400007640000007221710545462317013556 0ustar aliali/* SCCS Id: @(#)save.c 3.4 2003/11/14 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" #include "lev.h" #include "quest.h" #ifndef NO_SIGNAL #include #endif #if !defined(LSC) && !defined(O_WRONLY) && !defined(AZTEC_C) #include #endif #ifdef MFLOPPY long bytes_counted; static int count_only; #endif /*WAC boolean here to keep track of quit status*/ boolean saverestore; #ifdef MICRO int dotcnt, dotrow; /* also used in restore */ #endif #ifdef ZEROCOMP STATIC_DCL void FDECL(bputc, (int)); #endif STATIC_DCL void FDECL(savelevchn, (int,int)); STATIC_DCL void FDECL(savedamage, (int,int)); STATIC_DCL void FDECL(saveobjchn, (int,struct obj *,int)); STATIC_DCL void FDECL(savemonchn, (int,struct monst *,int)); STATIC_DCL void FDECL(savetrapchn, (int,struct trap *,int)); STATIC_DCL void FDECL(savegamestate, (int,int)); #ifdef MFLOPPY STATIC_DCL void FDECL(savelev0, (int,XCHAR_P,int)); STATIC_DCL boolean NDECL(swapout_oldest); STATIC_DCL void FDECL(copyfile, (char *,char *)); #endif /* MFLOPPY */ #ifdef GCC_WARN static long nulls[10]; #else #define nulls nul #endif #if defined(UNIX) || defined(VMS) || defined(__EMX__) || defined(WIN32) #define HUP if (!program_state.done_hup) #else #define HUP #endif #ifdef MENU_COLOR extern struct menucoloring *menu_colorings; #endif /* need to preserve these during save to avoid accessing freed memory */ static unsigned ustuck_id = 0, usteed_id = 0; int dosave() { #ifdef KEEP_SAVE /*WAC for reloading*/ register int fd; #endif clear_nhwindow(WIN_MESSAGE); if(yn("Really save?") == 'n') { clear_nhwindow(WIN_MESSAGE); if(multi > 0) nomul(0); } else { clear_nhwindow(WIN_MESSAGE); pline("Saving..."); #if defined(UNIX) || defined(VMS) || defined(__EMX__) program_state.done_hup = 0; #endif #ifdef KEEP_SAVE saverestore = FALSE; if (flags.keep_savefile) if(yn("Really quit?") == 'n') saverestore = TRUE; if(dosave0() && !saverestore) { #else if(dosave0()) { #endif program_state.something_worth_saving = 0; u.uhp = -1; /* universal game's over indicator */ /* make sure they see the Saving message */ display_nhwindow(WIN_MESSAGE, TRUE); exit_nhwindows("Be seeing you..."); terminate(EXIT_SUCCESS); } /*WAC redraw later else (void)doredraw();*/ } #ifdef KEEP_SAVE if (saverestore) { /*WAC pulled this from pcmain.c - restore game from the file just saved*/ fd = create_levelfile(0); if (fd < 0) { raw_print("Cannot create lock file"); } else { hackpid = 1; write(fd, (genericptr_t) &hackpid, sizeof(hackpid)); close(fd); } #ifdef MFLOPPY level_info[0].where = ACTIVE; #endif fd = restore_saved_game(); if (fd >= 0) dorecover(fd); check_special_room(FALSE); flags.move = 0; /*WAC correct these after restore*/ if(flags.moonphase == FULL_MOON) change_luck(1); if(flags.friday13) change_luck(-1); if(iflags.window_inited) clear_nhwindow(WIN_MESSAGE); } saverestore = FALSE; #endif (void)doredraw(); return 0; } #if defined(UNIX) || defined(VMS) || defined (__EMX__) || defined(WIN32) /*ARGSUSED*/ void hangup(sig_unused) /* called as signal() handler, so sent at least one arg */ int sig_unused; { # ifdef NOSAVEONHANGUP (void) signal(SIGINT, SIG_IGN); clearlocks(); # ifndef VMS 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; } #endif /* returns 1 if save successful */ int dosave0() { const char *fq_save; register int fd, ofd; xchar ltmp; d_level uz_save; char whynot[BUFSZ]; if (!SAVEF[0]) return 0; fq_save = fqname(SAVEF, SAVEPREFIX, 1); /* level files take 0 */ #if defined(UNIX) || defined(VMS) (void) signal(SIGHUP, SIG_IGN); #endif #ifndef NO_SIGNAL (void) signal(SIGINT, SIG_IGN); #endif #if defined(MICRO) && defined(MFLOPPY) if (!saveDiskPrompt(0)) return 0; #endif HUP if (iflags.window_inited) { uncompress_area(fq_save, SAVEF); fd = open_savefile(); if (fd > 0) { (void) close(fd); clear_nhwindow(WIN_MESSAGE); There("seems to be an old save file."); if (yn("Overwrite the old file?") == 'n') { compress_area(fq_save, SAVEF); #ifdef KEEP_SAVE /*WAC don't restore if you didn't save*/ saverestore = FALSE; #endif return 0; } } } HUP mark_synch(); /* flush any buffered screen output */ fd = create_savefile(); if(fd < 0) { HUP pline("Cannot open save file."); (void) delete_savefile(); /* ab@unido */ 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 */ if(flags.friday13) change_luck(1); if(iflags.window_inited) HUP clear_nhwindow(WIN_MESSAGE); #if defined(MICRO) && defined(TTY_GRAPHICS) if (!strncmpi("tty", windowprocs.name, 3)) { dotcnt = 0; dotrow = 2; curs(WIN_MAP, 1, 1); putstr(WIN_MAP, 0, "Saving:"); } #endif #ifdef MFLOPPY /* make sure there is enough disk space */ if (iflags.checkspace) { long fds, needed; savelev(fd, ledger_no(&u.uz), COUNT_SAVE); savegamestate(fd, COUNT_SAVE); needed = bytes_counted; for (ltmp = 1; ltmp <= maxledgerno(); ltmp++) if (ltmp != ledger_no(&u.uz) && level_info[ltmp].where) needed += level_info[ltmp].size + (sizeof ltmp); fds = freediskspace(fq_save); if (needed > fds) { HUP { There("is insufficient space on SAVE disk."); pline("Require %ld bytes but only have %ld.", needed, fds); } flushout(); (void) close(fd); (void) delete_savefile(); return 0; } co_false(); } #endif /* MFLOPPY */ store_version(fd); #ifdef STORE_PLNAME_IN_FILE bwrite(fd, (genericptr_t) plname, PL_NSIZ); #endif ustuck_id = (u.ustuck ? u.ustuck->m_id : 0); #ifdef STEED usteed_id = (u.usteed ? u.usteed->m_id : 0); #endif savelev(fd, ledger_no(&u.uz), WRITE_SAVE | FREE_SAVE); /*Keep things from beeing freed if not restoring*/ /* #ifdef KEEP_SAVE if (saverestore) savegamestate(fd, WRITE_SAVE); else #endif */ savegamestate(fd, WRITE_SAVE | FREE_SAVE); /* While copying level files around, zero out u.uz to keep * parts of the restore code from completely initializing all * in-core data structures, since all we're doing is copying. * This also avoids at least one nasty core dump. */ 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 */ setustuck((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; #if defined(MICRO) && defined(TTY_GRAPHICS) curs(WIN_MAP, 1 + dotcnt++, dotrow); if (dotcnt >= (COLNO - 1)) { dotrow++; dotcnt = 0; } putstr(WIN_MAP, 0, "."); mark_synch(); #endif ofd = open_levelfile(ltmp, whynot); if (ofd < 0) { HUP pline("%s", whynot); (void) close(fd); (void) delete_savefile(); HUP killer = whynot; HUP done(TRICKED); return(0); } minit(); /* ZEROCOMP */ getlev(ofd, hackpid, ltmp, FALSE); (void) close(ofd); bwrite(fd, (genericptr_t) <mp, sizeof ltmp); /* level number*/ savelev(fd, ltmp, WRITE_SAVE | FREE_SAVE); /* actual level*/ delete_levelfile(ltmp); } bclose(fd); u.uz = uz_save; /* get rid of current level --jgm */ delete_levelfile(ledger_no(&u.uz)); delete_levelfile(0); compress_area(FILE_AREA_SAVE, fq_save); return(1); } STATIC_OVL void savegamestate(fd, mode) register int fd, mode; { int uid; #ifdef MFLOPPY count_only = (mode & COUNT_SAVE); #endif uid = getuid(); bwrite(fd, (genericptr_t) &uid, sizeof uid); bwrite(fd, (genericptr_t) &flags, sizeof(struct flag)); bwrite(fd, (genericptr_t) &u, sizeof(struct you)); /* must come before migrating_objs and migrating_mons are freed */ save_timers(fd, mode, RANGE_GLOBAL); save_light_sources(fd, mode, RANGE_GLOBAL); saveobjchn(fd, invent, mode); saveobjchn(fd, migrating_objs, mode); savemonchn(fd, migrating_mons, mode); if (release_data(mode)) { invent = 0; migrating_objs = 0; migrating_mons = 0; } bwrite(fd, (genericptr_t) mvitals, sizeof(mvitals)); save_dungeon(fd, (boolean)!!perform_bwrite(mode), (boolean)!!release_data(mode)); savelevchn(fd, mode); bwrite(fd, (genericptr_t) &moves, sizeof moves); bwrite(fd, (genericptr_t) &monstermoves, sizeof monstermoves); bwrite(fd, (genericptr_t) &quest_status, sizeof(struct q_score)); bwrite(fd, (genericptr_t) spl_book, sizeof(struct spell) * (MAXSPELL + 1)); bwrite(fd, (genericptr_t) tech_list, sizeof(struct tech) * (MAXTECH + 1)); save_artifacts(fd); save_oracles(fd, mode); if(ustuck_id) bwrite(fd, (genericptr_t) &ustuck_id, sizeof ustuck_id); #ifdef STEED if(usteed_id) bwrite(fd, (genericptr_t) &usteed_id, sizeof usteed_id); #endif bwrite(fd, (genericptr_t) pl_character, sizeof pl_character); bwrite(fd, (genericptr_t) pl_fruit, sizeof pl_fruit); bwrite(fd, (genericptr_t) ¤t_fruit, sizeof current_fruit); savefruitchn(fd, mode); savenames(fd, mode); save_waterlevel(fd, mode); bflush(fd); } #ifdef INSURANCE void savestateinlock() { int fd, hpid; static boolean havestate = TRUE; char whynot[BUFSZ]; /* When checkpointing is on, the full state needs to be written * on each checkpoint. When checkpointing is off, only the pid * needs to be in the level.0 file, so it does not need to be * constantly rewritten. When checkpointing is turned off during * a game, however, the file has to be rewritten once to truncate * it and avoid restoring from outdated information. * * Restricting havestate to this routine means that an additional * noop pid rewriting will take place on the first "checkpoint" after * the game is started or restored, if checkpointing is off. */ if (flags.ins_chkpt || havestate) { /* save the rest of the current game state in the lock file, * following the original int pid, the current level number, * and the current savefile name, which should not be subject * to any internal compression schemes since they must be * readable by an external utility */ fd = open_levelfile(0, whynot); if (fd < 0) { pline("%s", whynot); pline("Probably someone removed it."); killer = whynot; done(TRICKED); return; } (void) read(fd, (genericptr_t) &hpid, sizeof(hpid)); if (hackpid != hpid) { Sprintf(whynot, "Level #0 pid (%d) doesn't match ours (%d)!", hpid, hackpid); pline("%s", whynot); killer = whynot; done(TRICKED); } (void) close(fd); fd = create_levelfile(0, whynot); if (fd < 0) { pline("%s", whynot); killer = whynot; done(TRICKED); return; } (void) write(fd, (genericptr_t) &hackpid, sizeof(hackpid)); if (flags.ins_chkpt) { int currlev = ledger_no(&u.uz); (void) write(fd, (genericptr_t) &currlev, sizeof(currlev)); save_savefile_name(fd); store_version(fd); #ifdef STORE_PLNAME_IN_FILE bwrite(fd, (genericptr_t) plname, PL_NSIZ); #endif ustuck_id = (u.ustuck ? u.ustuck->m_id : 0); #ifdef STEED usteed_id = (u.usteed ? u.usteed->m_id : 0); #endif savegamestate(fd, WRITE_SAVE); } bclose(fd); } havestate = flags.ins_chkpt; } #endif #ifdef MFLOPPY boolean savelev(fd, lev, mode) int fd; xchar lev; int mode; { if (mode & COUNT_SAVE) { bytes_counted = 0; savelev0(fd, lev, COUNT_SAVE); /* probably bytes_counted will be filled in again by an * immediately following WRITE_SAVE anyway, but we'll * leave it out of checkspace just in case */ if (iflags.checkspace) { while (bytes_counted > freediskspace(levels)) if (!swapout_oldest()) return FALSE; } } if (mode & (WRITE_SAVE | FREE_SAVE)) { bytes_counted = 0; savelev0(fd, lev, mode); } if (mode != FREE_SAVE) { level_info[lev].where = ACTIVE; level_info[lev].time = moves; level_info[lev].size = bytes_counted; } return TRUE; } STATIC_OVL void savelev0(fd,lev,mode) #else void savelev(fd,lev,mode) #endif int fd; xchar lev; int mode; { #ifdef TOS short tlev; #endif /* if we're tearing down the current level without saving anything (which happens upon entrance to the endgame or after an aborted restore attempt) then we don't want to do any actual I/O */ if (mode == FREE_SAVE) goto skip_lots; if (iflags.purge_monsters) { /* purge any dead monsters (necessary if we're starting * a panic save rather than a normal one, or sometimes * when changing levels without taking time -- e.g. * create statue trap then immediately level teleport) */ dmonsfree(); } if(fd < 0) panic("Save on bad file!"); /* impossible */ #ifdef MFLOPPY count_only = (mode & COUNT_SAVE); #endif if (lev >= 0 && lev <= maxledgerno()) level_info[lev].flags |= VISITED; bwrite(fd,(genericptr_t) &hackpid,sizeof(hackpid)); #ifdef TOS tlev=lev; tlev &= 0x00ff; bwrite(fd,(genericptr_t) &tlev,sizeof(tlev)); #else bwrite(fd,(genericptr_t) &lev,sizeof(lev)); #endif #ifdef RLECOMP { /* perform run-length encoding of rm structs */ struct rm *prm, *rgrm; int x, y; uchar match; rgrm = &levl[0][0]; /* start matching at first rm */ match = 0; for (y = 0; y < ROWNO; y++) { for (x = 0; x < COLNO; x++) { prm = &levl[x][y]; #ifdef DISPLAY_LAYERS if (prm->mem_bg == rgrm->mem_bg && prm->mem_trap == rgrm->mem_trap && prm->mem_obj == rgrm->mem_obj && prm->mem_corpse == rgrm->mem_corpse && prm->mem_invis == rgrm->mem_invis #else if (prm->glyph == rgrm->glyph #endif && prm->typ == rgrm->typ && prm->seenv == rgrm->seenv && prm->horizontal == rgrm->horizontal && prm->flags == rgrm->flags && prm->lit == rgrm->lit && prm->waslit == rgrm->waslit && prm->roomno == rgrm->roomno && prm->edge == rgrm->edge) { match++; if (match > 254) { match = 254; /* undo this match */ goto writeout; } } else { /* the run has been broken, * write out run-length encoding */ writeout: bwrite(fd, (genericptr_t)&match, sizeof(uchar)); bwrite(fd, (genericptr_t)rgrm, sizeof(struct rm)); /* start encoding again. we have at least 1 rm * in the next run, viz. this one. */ match = 1; rgrm = prm; } } } if (match > 0) { bwrite(fd, (genericptr_t)&match, sizeof(uchar)); bwrite(fd, (genericptr_t)rgrm, sizeof(struct rm)); } } #else bwrite(fd,(genericptr_t) levl,sizeof(levl)); #endif /* RLECOMP */ bwrite(fd,(genericptr_t) &monstermoves,sizeof(monstermoves)); bwrite(fd,(genericptr_t) &upstair,sizeof(stairway)); bwrite(fd,(genericptr_t) &dnstair,sizeof(stairway)); bwrite(fd,(genericptr_t) &upladder,sizeof(stairway)); bwrite(fd,(genericptr_t) &dnladder,sizeof(stairway)); bwrite(fd,(genericptr_t) &sstairs,sizeof(stairway)); bwrite(fd,(genericptr_t) &updest,sizeof(dest_area)); bwrite(fd,(genericptr_t) &dndest,sizeof(dest_area)); bwrite(fd,(genericptr_t) &level.flags,sizeof(level.flags)); bwrite(fd, (genericptr_t) doors, sizeof(doors)); save_rooms(fd); /* no dynamic memory to reclaim */ /* from here on out, saving also involves allocated memory cleanup */ skip_lots: /* must be saved before mons, objs, and buried objs */ save_timers(fd, mode, RANGE_LEVEL); save_light_sources(fd, mode, RANGE_LEVEL); savemonchn(fd, fmon, mode); save_worm(fd, mode); /* save worm information */ savetrapchn(fd, ftrap, mode); saveobjchn(fd, fobj, mode); saveobjchn(fd, level.buriedobjlist, mode); saveobjchn(fd, billobjs, mode); if (release_data(mode)) { fmon = 0; ftrap = 0; fobj = 0; level.buriedobjlist = 0; billobjs = 0; } save_engravings(fd, mode); savedamage(fd, mode); save_regions(fd, mode); if (mode != FREE_SAVE) bflush(fd); } #ifdef ZEROCOMP /* The runs of zero-run compression are flushed after the game state or a * level is written out. This adds a couple bytes to a save file, where * the runs could be mashed together, but it allows gluing together game * state and level files to form a save file, and it means the flushing * does not need to be specifically called for every other time a level * file is written out. */ #define RLESC '\0' /* Leading character for run of LRESC's */ #define flushoutrun(ln) (bputc(RLESC), bputc(ln), ln = -1) #ifndef ZEROCOMP_BUFSIZ # define ZEROCOMP_BUFSIZ BUFSZ #endif static NEARDATA unsigned char outbuf[ZEROCOMP_BUFSIZ]; static NEARDATA unsigned short outbufp = 0; static NEARDATA short outrunlength = -1; static NEARDATA int bwritefd; static NEARDATA boolean compressing = FALSE; /*dbg() { HUP printf("outbufp %d outrunlength %d\n", outbufp,outrunlength); }*/ STATIC_OVL void bputc(c) int c; { #ifdef MFLOPPY bytes_counted++; if (count_only) return; #endif if (outbufp >= sizeof outbuf) { (void) write(bwritefd, outbuf, sizeof outbuf); outbufp = 0; } outbuf[outbufp++] = (unsigned char)c; } /*ARGSUSED*/ void bufon(fd) int fd; { compressing = TRUE; return; } /*ARGSUSED*/ void bufoff(fd) int fd; { if (outbufp) { outbufp = 0; panic("closing file with buffered data still unwritten"); } outrunlength = -1; compressing = FALSE; return; } void bflush(fd) /* flush run and buffer */ register int fd; { bwritefd = fd; if (outrunlength >= 0) { /* flush run */ flushoutrun(outrunlength); } #ifdef MFLOPPY if (count_only) outbufp = 0; #endif if (outbufp) { if (write(fd, outbuf, outbufp) != outbufp) { #if defined(UNIX) || defined(VMS) || defined(__EMX__) if (program_state.done_hup) terminate(EXIT_FAILURE); else #endif bclose(fd); /* panic (outbufp != 0) */ } outbufp = 0; } } void bwrite(fd, loc, num) int fd; genericptr_t loc; register unsigned num; { register unsigned char *bp = (unsigned char *)loc; if (!compressing) { #ifdef MFLOPPY bytes_counted += num; if (count_only) return; #endif if ((unsigned) write(fd, loc, num) != num) { #if defined(UNIX) || defined(VMS) || defined(__EMX__) if (program_state.done_hup) terminate(EXIT_FAILURE); else #endif panic("cannot write %u bytes to file #%d", num, fd); } } else { bwritefd = fd; for (; num; num--, bp++) { if (*bp == RLESC) { /* One more char in run */ if (++outrunlength == 0xFF) { flushoutrun(outrunlength); } } else { /* end of run */ if (outrunlength >= 0) { /* flush run */ flushoutrun(outrunlength); } bputc(*bp); } } } } void bclose(fd) int fd; { bufoff(fd); (void) close(fd); return; } #else /* ZEROCOMP */ static int bw_fd = -1; static FILE *bw_FILE = 0; static boolean buffering = FALSE; void bufon(fd) int fd; { #ifdef UNIX if(bw_fd >= 0) panic("double buffering unexpected"); bw_fd = fd; if((bw_FILE = fdopen(fd, "w")) == 0) panic("buffering of file %d failed", fd); #endif buffering = TRUE; } void bufoff(fd) int fd; { bflush(fd); buffering = FALSE; } void bflush(fd) int fd; { #ifdef UNIX if(fd == bw_fd) { if(fflush(bw_FILE) == EOF) panic("flush of savefile failed!"); } #endif return; } void bwrite(fd,loc,num) register int fd; register genericptr_t loc; register unsigned num; { boolean failed; #ifdef MFLOPPY bytes_counted += num; if (count_only) return; #endif #ifdef UNIX if (buffering) { if(fd != bw_fd) panic("unbuffered write to fd %d (!= %d)", fd, bw_fd); failed = (fwrite(loc, (int)num, 1, bw_FILE) != 1); } else #endif /* UNIX */ { /* lint wants the 3rd arg of write to be an int; lint -p an unsigned */ #if defined(BSD) || defined(ULTRIX) failed = (write(fd, loc, (int)num) != (int)num); #else /* e.g. SYSV, __TURBOC__ */ failed = (write(fd, loc, num) != num); #endif } if (failed) { #if defined(UNIX) || defined(VMS) || defined(__EMX__) if (program_state.done_hup) terminate(EXIT_FAILURE); else #endif panic("cannot write %u bytes to file #%d", num, fd); } } void bclose(fd) int fd; { bufoff(fd); #ifdef UNIX if (fd == bw_fd) { (void) fclose(bw_FILE); bw_fd = -1; bw_FILE = 0; } else #endif (void) close(fd); return; } #endif /* ZEROCOMP */ STATIC_OVL void savelevchn(fd, mode) register int fd, mode; { s_level *tmplev, *tmplev2; int cnt = 0; for (tmplev = sp_levchn; tmplev; tmplev = tmplev->next) cnt++; if (perform_bwrite(mode)) bwrite(fd, (genericptr_t) &cnt, sizeof(int)); for (tmplev = sp_levchn; tmplev; tmplev = tmplev2) { tmplev2 = tmplev->next; if (perform_bwrite(mode)) bwrite(fd, (genericptr_t) tmplev, sizeof(s_level)); if (release_data(mode)) free((genericptr_t) tmplev); } if (release_data(mode)) sp_levchn = 0; } STATIC_OVL void savedamage(fd, mode) register int fd, mode; { register struct damage *damageptr, *tmp_dam; unsigned int xl = 0; damageptr = level.damagelist; for (tmp_dam = damageptr; tmp_dam; tmp_dam = tmp_dam->next) xl++; if (perform_bwrite(mode)) bwrite(fd, (genericptr_t) &xl, sizeof(xl)); while (xl--) { if (perform_bwrite(mode)) bwrite(fd, (genericptr_t) damageptr, sizeof(*damageptr)); tmp_dam = damageptr; damageptr = damageptr->next; if (release_data(mode)) free((genericptr_t)tmp_dam); } if (release_data(mode)) level.damagelist = 0; } STATIC_OVL void saveobjchn(fd, otmp, mode) register int fd, mode; register struct obj *otmp; { register struct obj *otmp2; unsigned int xl; int minusone = -1; while(otmp) { otmp2 = otmp->nobj; if (perform_bwrite(mode)) { xl = otmp->oxlth + otmp->onamelth; bwrite(fd, (genericptr_t) &xl, sizeof(int)); bwrite(fd, (genericptr_t) otmp, xl + sizeof(struct obj)); } 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 */ dealloc_obj(otmp); } otmp = otmp2; } if (perform_bwrite(mode)) bwrite(fd, (genericptr_t) &minusone, sizeof(int)); } STATIC_OVL void savemonchn(fd, mtmp, mode) register int fd, mode; register struct monst *mtmp; { register struct monst *mtmp2; unsigned int xl; int minusone = -1; struct permonst *monbegin = &mons[0]; if (perform_bwrite(mode)) bwrite(fd, (genericptr_t) &monbegin, sizeof(monbegin)); while (mtmp) { mtmp2 = mtmp->nmon; if (perform_bwrite(mode)) { xl = mtmp->mxlth + mtmp->mnamelth; bwrite(fd, (genericptr_t) &xl, sizeof(int)); bwrite(fd, (genericptr_t) mtmp, xl + sizeof(struct monst)); } if (mtmp->minvent) saveobjchn(fd,mtmp->minvent,mode); if (release_data(mode)) dealloc_monst(mtmp); mtmp = mtmp2; } if (perform_bwrite(mode)) bwrite(fd, (genericptr_t) &minusone, sizeof(int)); } STATIC_OVL void savetrapchn(fd, trap, mode) register int fd, mode; register struct trap *trap; { register struct trap *trap2; while (trap) { trap2 = trap->ntrap; if (perform_bwrite(mode)) bwrite(fd, (genericptr_t) trap, sizeof(struct trap)); if (release_data(mode)) dealloc_trap(trap); trap = trap2; } if (perform_bwrite(mode)) bwrite(fd, (genericptr_t)nulls, sizeof(struct trap)); } /* save all the fruit names and ID's; this is used only in saving whole games * (not levels) and in saving bones levels. When saving a bones level, * we only want to save the fruits which exist on the bones level; the bones * level routine marks nonexistent fruits by making the fid negative. */ void savefruitchn(fd, mode) register int fd, mode; { register struct fruit *f2, *f1; f1 = ffruit; while (f1) { f2 = f1->nextf; if (f1->fid >= 0 && perform_bwrite(mode)) bwrite(fd, (genericptr_t) f1, sizeof(struct fruit)); if (release_data(mode)) dealloc_fruit(f1); f1 = f2; } if (perform_bwrite(mode)) bwrite(fd, (genericptr_t)nulls, sizeof(struct fruit)); if (release_data(mode)) ffruit = 0; } /* also called by prscore(); this probably belongs in dungeon.c... */ /* * [ALI] Also called by init_dungeons() for the sake of the GTK interface * and the display_score callback of the proxy interface. For this purpose, * the previous dungeon must be discarded. */ void free_dungeons() { #if defined(FREE_ALL_MEMORY) || defined(GTK_GRAPHICS) || defined(PROXY_GRAPHICS) savelevchn(0, FREE_SAVE); save_dungeon(0, FALSE, TRUE); #endif return; } #ifdef MENU_COLOR void free_menu_coloring() { struct menucoloring *tmp = menu_colorings; while (tmp) { struct menucoloring *tmp2 = tmp->next; #ifdef USE_REGEX_MATCH (void) regfree(&tmp->match); #else free(tmp->match); #endif free(tmp); tmp = tmp2; } return; } #endif void freedynamicdata() { unload_qtlist(); free_invbuf(); /* let_to_name (invent.c) */ free_youbuf(); /* You_buf,&c (pline.c) */ #ifdef MENU_COLOR free_menu_coloring(); #endif tmp_at(DISP_FREEMEM, 0); /* temporary display effects */ #ifdef FREE_ALL_MEMORY # define freeobjchn(X) (saveobjchn(0, X, FREE_SAVE), X = 0) # define freemonchn(X) (savemonchn(0, X, FREE_SAVE), X = 0) # define freetrapchn(X) (savetrapchn(0, X, FREE_SAVE), X = 0) # define freefruitchn() savefruitchn(0, FREE_SAVE) # define freenames() savenames(0, FREE_SAVE) # define free_oracles() save_oracles(0, FREE_SAVE) # define free_waterlevel() save_waterlevel(0, FREE_SAVE) # define free_worm() save_worm(0, FREE_SAVE) # define free_timers(R) save_timers(0, FREE_SAVE, R) # define free_light_sources(R) save_light_sources(0, FREE_SAVE, R); # define free_engravings() save_engravings(0, FREE_SAVE) # define freedamage() savedamage(0, FREE_SAVE) # define free_animals() mon_animal_list(FALSE) /* move-specific data */ dmonsfree(); /* release dead monsters */ /* level-specific data */ free_timers(RANGE_LEVEL); free_light_sources(RANGE_LEVEL); freemonchn(fmon); free_worm(); /* release worm segment information */ freetrapchn(ftrap); freeobjchn(fobj); freeobjchn(level.buriedobjlist); freeobjchn(billobjs); free_engravings(); freedamage(); /* game-state data */ free_timers(RANGE_GLOBAL); free_light_sources(RANGE_GLOBAL); freeobjchn(invent); freeobjchn(migrating_objs); freemonchn(migrating_mons); freemonchn(mydogs); /* ascension or dungeon escape */ /* freelevchn(); [folded into free_dungeons()] */ free_animals(); free_oracles(); freefruitchn(); 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); #ifdef AUTOPICKUP_EXCEPTIONS free_autopickup_exceptions(); #endif #endif /* FREE_ALL_MEMORY */ return; } #ifdef MFLOPPY boolean swapin_file(lev) int lev; { char to[PATHLEN], from[PATHLEN]; Sprintf(from, "%s%s", permbones, alllevels); Sprintf(to, "%s%s", levels, alllevels); set_levelfile_name(from, lev); set_levelfile_name(to, lev); if (iflags.checkspace) { while (level_info[lev].size > freediskspace(to)) if (!swapout_oldest()) return FALSE; } # ifdef WIZARD if (wizard) { pline("Swapping in `%s'.", from); wait_synch(); } # endif copyfile(from, to); (void) unlink(from); level_info[lev].where = ACTIVE; return TRUE; } STATIC_OVL boolean swapout_oldest() { char to[PATHLEN], from[PATHLEN]; int i, oldest; long oldtime; if (!ramdisk) return FALSE; for (i = 1, oldtime = 0, oldest = 0; i <= maxledgerno(); i++) if (level_info[i].where == ACTIVE && (!oldtime || level_info[i].time < oldtime)) { oldest = i; oldtime = level_info[i].time; } if (!oldest) return FALSE; Sprintf(from, "%s%s", levels, alllevels); Sprintf(to, "%s%s", permbones, alllevels); set_levelfile_name(from, oldest); set_levelfile_name(to, oldest); # ifdef WIZARD if (wizard) { pline("Swapping out `%s'.", from); wait_synch(); } # endif copyfile(from, to); (void) unlink(from); level_info[oldest].where = SWAPPED; return TRUE; } STATIC_OVL void copyfile(from, to) char *from, *to; { # ifdef TOS if (_copyfile(from, to)) panic("Can't copy %s to %s", from, to); # else char buf[BUFSIZ]; /* this is system interaction, therefore * BUFSIZ instead of NetHack's BUFSZ */ int nfrom, nto, fdfrom, fdto; if ((fdfrom = open(from, O_RDONLY | O_BINARY, FCMASK)) < 0) panic("Can't copy from %s !?", from); if ((fdto = open(to, O_WRONLY | O_BINARY | O_CREAT | O_TRUNC, FCMASK)) < 0) panic("Can't copy to %s", to); do { nfrom = read(fdfrom, buf, BUFSIZ); nto = write(fdto, buf, nfrom); if (nto != nfrom) panic("Copyfile failed!"); } while (nfrom == BUFSIZ); (void) close(fdfrom); (void) close(fdto); # endif /* TOS */ } void co_false() /* see comment in bones.c */ { count_only = FALSE; return; } #endif /* MFLOPPY */ /*save.c*/ slashem-0.0.7E7F3/src/vision.c0000664000076400007640000022331310545462317014122 0ustar aliali/* 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. */ #include "hack.h" /* Circles ==================================================================*/ /* * These numbers are limit offsets for one quadrant of a circle of a given * radius (the first number of each line) from the source. The number in * the comment is the element number (so pointers can be set up). Each * "circle" has as many elements as its radius+1. The radius is the number * of points away from the source that the limit exists. The radius of the * offset on the same row as the source *is* included so we don't have to * make an extra check. For example, a circle of radius 4 has offsets: * * XXX +2 * ...X +3 * ....X +4 * ....X +4 * @...X +4 * */ char circle_data[] = { /* 0*/ 1, 1, /* 2*/ 2, 2, 1, /* 5*/ 3, 3, 2, 1, /* 9*/ 4, 4, 4, 3, 2, /* 14*/ 5, 5, 5, 4, 3, 2, /* 20*/ 6, 6, 6, 5, 5, 4, 2, /* 27*/ 7, 7, 7, 6, 6, 5, 4, 2, /* 35*/ 8, 8, 8, 7, 7, 6, 6, 4, 2, /* 44*/ 9, 9, 9, 9, 8, 8, 7, 6, 5, 3, /* 54*/ 10,10,10,10, 9, 9, 8, 7, 6, 5, 3, /* 65*/ 11,11,11,11,10,10, 9, 9, 8, 7, 5, 3, /* 77*/ 12,12,12,12,11,11,10,10, 9, 8, 7, 5, 3, /* 90*/ 13,13,13,13,12,12,12,11,10,10, 9, 7, 6, 3, /*104*/ 14,14,14,14,13,13,13,12,12,11,10, 9, 8, 6, 3, /*119*/ 15,15,15,15,14,14,14,13,13,12,11,10, 9, 8, 6, 3, /*135*/ 16 /* should be MAX_RADIUS+1; used to terminate range loops -dlc */ }; /* * These are the starting indexes into the circle_data[] array for a * circle of a given radius. */ char circle_start[] = { /* */ 0, /* circles of radius zero are not used */ /* 1*/ 0, /* 2*/ 2, /* 3*/ 5, /* 4*/ 9, /* 5*/ 14, /* 6*/ 20, /* 7*/ 27, /* 8*/ 35, /* 9*/ 44, /*10*/ 54, /*11*/ 65, /*12*/ 77, /*13*/ 90, /*14*/ 104, /*15*/ 119, }; /*===========================================================================*/ /* Vision (arbitrary line of sight) =========================================*/ /*------ global variables ------*/ #if 0 /* (moved to decl.c) */ /* True if we need to run a full vision recalculation. */ boolean vision_full_recalc = 0; /* Pointers to the current vision array. */ char **viz_array; #endif char *viz_rmin, *viz_rmax; /* current vision cs bounds */ /*------ local variables ------*/ static char could_see[2][ROWNO][COLNO]; /* vision work space */ static char *cs_rows0[ROWNO], *cs_rows1[ROWNO]; static char cs_rmin0[ROWNO], cs_rmax0[ROWNO]; static char cs_rmin1[ROWNO], cs_rmax1[ROWNO]; static char viz_clear[ROWNO][COLNO]; /* vision clear/blocked map */ static char *viz_clear_rows[ROWNO]; static char left_ptrs[ROWNO][COLNO]; /* LOS algorithm helpers */ static char right_ptrs[ROWNO][COLNO]; /* Forward declarations. */ STATIC_DCL void FDECL(fill_point, (int,int)); STATIC_DCL void FDECL(dig_point, (int,int)); STATIC_DCL void NDECL(view_init); STATIC_DCL void FDECL(view_from,(int,int,char **,char *,char *,int, void (*)(int,int,genericptr_t),genericptr_t)); STATIC_DCL void FDECL(get_unused_cs, (char ***,char **,char **)); #ifdef REINCARNATION STATIC_DCL void FDECL(rogue_vision, (char **,char *,char *)); #endif /* Macro definitions that I can't find anywhere. */ #define sign(z) ((z) < 0 ? -1 : ((z) ? 1 : 0 )) #define v_abs(z) ((z) < 0 ? -(z) : (z)) /* don't use abs -- it may exist */ /* * vision_init() * * The one-time vision initialization routine. * * This must be called before mklev() is called in newgame() [allmain.c], * or before a game restore. Else we die a horrible death. */ void vision_init() { int i; /* Set up the pointers. */ for (i = 0; i < ROWNO; i++) { cs_rows0[i] = could_see[0][i]; cs_rows1[i] = could_see[1][i]; viz_clear_rows[i] = viz_clear[i]; } /* Start out with cs0 as our current array */ viz_array = cs_rows0; viz_rmin = cs_rmin0; viz_rmax = cs_rmax0; vision_full_recalc = 0; (void) memset((genericptr_t) could_see, 0, sizeof(could_see)); /* Initialize the vision algorithm (currently C or D). */ view_init(); #ifdef VISION_TABLES /* Note: this initializer doesn't do anything except guarantee that we're linked properly. */ vis_tab_init(); #endif } /* * does_block() * * Returns true if the level feature, object, or monster at (x,y) blocks * sight. */ int does_block(x,y,lev) int x, y; register struct rm *lev; { struct obj *obj; struct monst *mon; /* Features that block . . */ /* KMH -- added trees */ if (IS_ROCK(lev->typ) || lev->typ == TREE || (IS_DOOR(lev->typ) && (lev->doormask & (D_CLOSED|D_LOCKED|D_TRAPPED) ))) return 1; if (lev->typ == CLOUD || lev->typ == WATER || (lev->typ == MOAT && Underwater)) return 1; /* Boulders block light. */ for (obj = level.objects[x][y]; obj; obj = obj->nexthere) if (obj->otyp == BOULDER) return 1; /* Mimics mimicing a door or boulder block light. */ if ((mon = m_at(x,y)) && (!mon->minvis || See_invisible) && ((mon->m_ap_type == M_AP_FURNITURE && (mon->mappearance == S_hcdoor || mon->mappearance == S_vcdoor)) || (mon->m_ap_type == M_AP_OBJECT && mon->mappearance == BOULDER))) return 1; return 0; } /* * vision_reset() * * This must be called *after* the levl[][] structure is set with the new * level and the level monsters and objects are in place. */ void vision_reset() { int y; register int x, i, dig_left, block; register struct rm *lev; /* Start out with cs0 as our current array */ viz_array = cs_rows0; viz_rmin = cs_rmin0; viz_rmax = cs_rmax0; (void) memset((genericptr_t) could_see, 0, sizeof(could_see)); /* Reset the pointers and clear so that we have a "full" dungeon. */ (void) memset((genericptr_t) viz_clear, 0, sizeof(viz_clear)); /* Dig the level */ for (y = 0; y < ROWNO; y++) { dig_left = 0; block = TRUE; /* location (0,y) is always stone; it's !isok() */ lev = &levl[1][y]; for (x = 1; x < COLNO; x++, lev += ROWNO) if (block != (IS_ROCK(lev->typ) || does_block(x,y,lev))) { if(block) { for(i=dig_left; i= 0) { for (zy = rooms[rnum].ly-1; zy <= rooms[rnum].hy+1; zy++) { rmin[zy] = start = rooms[rnum].lx-1; rmax[zy] = stop = rooms[rnum].hx+1; for (zx = start; zx <= stop; zx++) { if (rooms[rnum].rlit) { next[zy][zx] = COULD_SEE | IN_SIGHT; levl[zx][zy].seenv = SVALL; /* see the walls */ } else next[zy][zx] = COULD_SEE; } } } in_door = levl[u.ux][u.uy].typ == DOOR; /* Can always see adjacent. */ ylo = max(u.uy - 1, 0); yhi = min(u.uy + 1, ROWNO - 1); xlo = max(u.ux - 1, 1); xhi = min(u.ux + 1, COLNO - 1); for (zy = ylo; zy <= yhi; zy++) { if (xlo < rmin[zy]) rmin[zy] = xlo; if (xhi > rmax[zy]) rmax[zy] = xhi; for (zx = xlo; zx <= xhi; zx++) { next[zy][zx] = COULD_SEE | IN_SIGHT; /* * Yuck, update adjacent non-diagonal positions when in a doorway. * We need to do this to catch the case when we first step into * a room. The room's walls were not seen from the outside, but * now are seen (the seen bits are set just above). However, the * positions are not updated because they were already in sight. * So, we have to do it here. */ if (in_door && (zx == u.ux || zy == u.uy)) newsym(zx,zy); } } } #endif /* REINCARNATION */ /*#define EXTEND_SPINE*/ /* possibly better looking wall-angle */ #ifdef EXTEND_SPINE STATIC_DCL int FDECL(new_angle, (struct rm *, unsigned char *, int, int)); /* * new_angle() * * Return the new angle seen by the hero for this location. The angle * bit is given in the value pointed at by sv. * * For T walls and crosswall, just setting the angle bit, even though * it is technically correct, doesn't look good. If we can see the * next position beyond the current one and it is a wall that we can * see, then we want to extend a spine of the T to connect with the wall * that is beyond. Example: * * Correct, but ugly Extend T spine * * | ... | ... * | ... <-- wall beyond & floor --> | ... * | ... | ... * Unseen --> ... | ... * spine +-... <-- trwall & doorway --> +-... * | ... | ... * * * @ <-- hero --> @ * * * We fake the above check by only checking if the horizontal & * vertical positions adjacent to the crosswall and T wall are * unblocked. Then, _in general_ we can see beyond. Generally, * this is good enough. * * + When this function is called we don't have all of the seen * information (we're doing a top down scan in vision_recalc). * We would need to scan once to set all IN_SIGHT and COULD_SEE * bits, then again to correctly set the seenv bits. * + I'm trying to make this as cheap as possible. The display & * vision eat up too much CPU time. * * * Note: Even as I write this, I'm still not convinced. There are too * many exceptions. I may have to bite the bullet and do more * checks. - Dean 2/11/93 */ STATIC_OVL int new_angle(lev, sv, row, col) struct rm *lev; unsigned char *sv; int row, col; { register int res = *sv; /* * Do extra checks for crosswalls and T walls if we see them from * an angle. */ if (lev->typ >= CROSSWALL && lev->typ <= TRWALL) { switch (res) { case SV0: if (col > 0 && viz_clear[row][col-1]) res |= SV7; if (row > 0 && viz_clear[row-1][col]) res |= SV1; break; case SV2: if (row > 0 && viz_clear[row-1][col]) res |= SV1; if (col < COLNO-1 && viz_clear[row][col+1]) res |= SV3; break; case SV4: if (col < COLNO-1 && viz_clear[row][col+1]) res |= SV3; if (row < ROWNO-1 && viz_clear[row+1][col]) res |= SV5; break; case SV6: if (row < ROWNO-1 && viz_clear[row+1][col]) res |= SV5; if (col > 0 && viz_clear[row][col-1]) res |= SV7; break; } } return res; } #else /* * new_angle() * * Return the new angle seen by the hero for this location. The angle * bit is given in the value pointed at by sv. * * The other parameters are not used. */ #define new_angle(lev, sv, row, col) (*sv) #endif /* * vision_recalc() * * Do all of the heavy vision work. Recalculate all locations that could * possibly be seen by the hero --- if the location were lit, etc. Note * which locations are actually seen because of lighting. Then add to * this all locations that be seen by hero due to night vision and x-ray * vision. Finally, compare with what the hero was able to see previously. * Update the difference. * * This function is usually called only when the variable 'vision_full_recalc' * is set. The following is a list of places where this function is called, * with three valid values for the control flag parameter: * * Control flag = 0. A complete vision recalculation. Generate the vision * tables from scratch. This is necessary to correctly set what the hero * can see. (1) and (2) call this routine for synchronization purposes, (3) * calls this routine so it can operate correctly. * * + After the monster move, before input from the player. [moveloop()] * + At end of moveloop. [moveloop() ??? not sure why this is here] * + Right before something is printed. [pline()] * + Right before we do a vision based operation. [do_clear_area()] * + screen redraw, so we can renew all positions in sight. [docrt()] *WAC + when firing wand of fire [buzz()] #define LIGHT_SRC_SPELL *WAC + fire explosions [explode()] #define LIGHT_SRC_SPELL * * Control flag = 1. An adjacent vision recalculation. The hero has moved * one square. Knowing this, it might be possible to optimize the vision * recalculation using the current knowledge. This is presently unimplemented * and is treated as a control = 0 call. * * + Right after the hero moves. [domove()] * * Control flag = 2. Turn off the vision system. Nothing new will be * displayed, since nothing is seen. This is usually done when you need * a newsym() run on all locations in sight, or on some locations but you * don't know which ones. * * + Before a screen redraw, so all positions are renewed. [docrt()] * + Right before the hero arrives on a new level. [goto_level()] * + Right after a scroll of light is read. [litroom()] * + After an option has changed that affects vision [parseoptions()] * + Right after the hero is swallowed. [gulpmu()] * + Just before bubbles are moved. [movebubbles()] */ void vision_recalc(control) int control; { char **temp_array; /* points to the old vision array */ char **next_array; /* points to the new vision array */ char *next_row; /* row pointer for the new array */ char *old_row; /* row pointer for the old array */ char *next_rmin; /* min pointer for the new array */ char *next_rmax; /* max pointer for the new array */ char *ranges; /* circle ranges -- used for xray & night vision */ int row; /* row counter (outer loop) */ int start, stop; /* inner loop starting/stopping index */ int dx, dy; /* one step from a lit door or lit wall (see below) */ register int col; /* inner loop counter */ register struct rm *lev; /* pointer to current pos */ struct rm *flev; /* pointer to position in "front" of current pos */ extern unsigned char seenv_matrix[3][3]; /* from display.c */ static unsigned char colbump[COLNO+1]; /* cols to bump sv */ unsigned char *sv; /* ptr to seen angle bits */ int oldseenv; /* previous seenv value */ vision_full_recalc = 0; /* reset flag */ if (in_mklev || !iflags.vision_inited) return; #ifdef GCC_WARN row = 0; #endif /* * Either the light sources have been taken care of, or we must * recalculate them here. */ /* Get the unused could see, row min, and row max arrays. */ get_unused_cs(&next_array, &next_rmin, &next_rmax); /* You see nothing, nothing can see you --- if swallowed or refreshing. */ if (u.uswallow || control == 2) { /* do nothing -- get_unused_cs() nulls out the new work area */ } else if (Blind) { /* * Calculate the could_see array even when blind so that monsters * can see you, even if you can't see them. Note that the current * setup allows: * * + Monsters to see with the "new" vision, even on the rogue * level. * * + Monsters can see you even when you're in a pit. */ view_from(u.uy, u.ux, next_array, next_rmin, next_rmax, 0, (void FDECL((*),(int,int,genericptr_t)))0, (genericptr_t)0); /* * Our own version of the update loop below. We know we can't see * anything, so we only need update positions we used to be able * to see. */ temp_array = viz_array; /* set viz_array so newsym() will work */ viz_array = next_array; for (row = 0; row < ROWNO; row++) { old_row = temp_array[row]; /* Find the min and max positions on the row. */ start = min(viz_rmin[row], next_rmin[row]); stop = max(viz_rmax[row], next_rmax[row]); for (col = start; col <= stop; col++) if (old_row[col] & IN_SIGHT) newsym(col,row); } /* skip the normal update loop */ goto skip; } #ifdef REINCARNATION else if (Is_rogue_level(&u.uz)) { rogue_vision(next_array,next_rmin,next_rmax); } #endif else { int has_night_vision = 1; /* hero has night vision */ if (Underwater && !Is_waterlevel(&u.uz)) { /* * The hero is under water. Only see surrounding locations if * they are also underwater. This overrides night vision but * does not override x-ray vision. */ has_night_vision = 0; for (row = u.uy-1; row <= u.uy+1; row++) for (col = u.ux-1; col <= u.ux+1; col++) { if (!isok(col,row) || !is_pool(col,row)) continue; next_rmin[row] = min(next_rmin[row], col); next_rmax[row] = max(next_rmax[row], col); next_array[row][col] = IN_SIGHT | COULD_SEE; } } /* if in a pit, just update for immediate locations */ else if (u.utrap && u.utraptype == TT_PIT) { for (row = u.uy-1; row <= u.uy+1; row++) { if (row < 0) continue; if (row >= ROWNO) break; next_rmin[row] = max( 0, u.ux - 1); next_rmax[row] = min(COLNO-1, u.ux + 1); next_row = next_array[row]; for(col=next_rmin[row]; col <= next_rmax[row]; col++) next_row[col] = IN_SIGHT | COULD_SEE; } } else view_from(u.uy, u.ux, next_array, next_rmin, next_rmax, 0,(void(*)(int, int, genericptr_t))0, (genericptr_t)0); /* * Set the IN_SIGHT bit for xray and night vision. */ if (u.xray_range >= 0) { if (u.xray_range) { ranges = circle_ptr(u.xray_range); for (row = u.uy-u.xray_range; row <= u.uy+u.xray_range; row++) { if (row < 0) continue; if (row >= ROWNO) break; dy = v_abs(u.uy-row); next_row = next_array[row]; start = max( 0, u.ux - ranges[dy]); stop = min(COLNO-1, u.ux + ranges[dy]); for (col = start; col <= stop; col++) { char old_row_val = next_row[col]; next_row[col] |= IN_SIGHT; oldseenv = levl[col][row].seenv; levl[col][row].seenv = SVALL; /* see all! */ /* Update if previously not in sight or new angle. */ if (!(old_row_val & IN_SIGHT) || oldseenv != SVALL) newsym(col,row); } next_rmin[row] = min(start, next_rmin[row]); next_rmax[row] = max(stop, next_rmax[row]); } } else { /* range is 0 */ next_array[u.uy][u.ux] |= IN_SIGHT; levl[u.ux][u.uy].seenv = SVALL; next_rmin[u.uy] = min(u.ux, next_rmin[u.uy]); next_rmax[u.uy] = max(u.ux, next_rmax[u.uy]); } } if (has_night_vision && u.xray_range < u.nv_range) { if (!u.nv_range) { /* range is 0 */ next_array[u.uy][u.ux] |= IN_SIGHT; levl[u.ux][u.uy].seenv = SVALL; next_rmin[u.uy] = min(u.ux, next_rmin[u.uy]); next_rmax[u.uy] = max(u.ux, next_rmax[u.uy]); } else if (u.nv_range > 0) { ranges = circle_ptr(u.nv_range); for (row = u.uy-u.nv_range; row <= u.uy+u.nv_range; row++) { if (row < 0) continue; if (row >= ROWNO) break; dy = v_abs(u.uy-row); next_row = next_array[row]; start = max( 0, u.ux - ranges[dy]); stop = min(COLNO-1, u.ux + ranges[dy]); for (col = start; col <= stop; col++) if (next_row[col]) next_row[col] |= IN_SIGHT; next_rmin[row] = min(start, next_rmin[row]); next_rmax[row] = max(stop, next_rmax[row]); } } } } /* Set the correct bits for all light sources. */ do_light_sources(next_array); /* * Make the viz_array the new array so that cansee() will work correctly. */ temp_array = viz_array; viz_array = next_array; /* * The main update loop. Here we do two things: * * + Set the IN_SIGHT bit for places that we could see and are lit. * + Reset changed places. * * There is one thing that make deciding what the hero can see * difficult: * * 1. Directional lighting. Items that block light create problems. * The worst offenders are doors. Suppose a door to a lit room * is closed. It is lit on one side, but not on the other. How * do you know? You have to check the closest adjacent position. * Even so, that is not entirely correct. But it seems close * enough for now. */ colbump[u.ux] = colbump[u.ux+1] = 1; for (row = 0; row < ROWNO; row++) { dy = u.uy - row; dy = sign(dy); next_row = next_array[row]; old_row = temp_array[row]; /* Find the min and max positions on the row. */ start = min(viz_rmin[row], next_rmin[row]); stop = max(viz_rmax[row], next_rmax[row]); lev = &levl[start][row]; sv = &seenv_matrix[dy+1][start < u.ux ? 0 : (start > u.ux ? 2:1)]; for (col = start; col <= stop; lev += ROWNO, sv += (int) colbump[++col]) { if (next_row[col] & IN_SIGHT) { /* * We see this position because of night- or xray-vision. */ oldseenv = lev->seenv; lev->seenv |= new_angle(lev,sv,row,col); /* update seen angle */ /* Update pos if previously not in sight or new angle. */ if ( !(old_row[col] & IN_SIGHT) || oldseenv != lev->seenv) newsym(col,row); } else if ((next_row[col] & COULD_SEE) && (lev->lit || (next_row[col] & TEMP_LIT))) { /* * 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]); if (flev->lit || next_array[row+dy][col+dx] & TEMP_LIT) { next_row[col] |= IN_SIGHT; /* we see it */ oldseenv = lev->seenv; lev->seenv |= new_angle(lev,sv,row,col); /* Update pos if previously not in sight or new angle.*/ if (!(old_row[col] & IN_SIGHT) || oldseenv!=lev->seenv) newsym(col,row); } else goto not_in_sight; /* we don't see it */ } else { next_row[col] |= IN_SIGHT; /* we see it */ oldseenv = lev->seenv; lev->seenv |= new_angle(lev,sv,row,col); /* Update pos if previously not in sight or new angle. */ if ( !(old_row[col] & IN_SIGHT) || oldseenv != lev->seenv) newsym(col,row); } } else if ((next_row[col] & COULD_SEE) && lev->waslit) { /* * If we make it here, the hero _could see_ the location, * but doesn't see it (location is not lit). * However, the hero _remembers_ it as lit (waslit is true). * The hero can now see that it is not lit, so change waslit * and update the location. */ lev->waslit = 0; /* remember lit condition */ newsym(col,row); } /* * At this point we know that the row position is *not* in normal * sight. That is, the position is could be seen, but is dark * or LOS is just plain blocked. * * Update the position if: * o If the old one *was* in sight. We may need to clean up * the glyph -- E.g. darken room spot, etc. * o If we now could see the location (yet the location is not * lit), but previously we couldn't see the location, or vice * versa. Update the spot because there there may be an infared * monster there. */ else { not_in_sight: if ((old_row[col] & IN_SIGHT) || ((next_row[col] & COULD_SEE) ^ (old_row[col] & COULD_SEE))) newsym(col,row); } } /* end for col . . */ } /* end for row . . */ 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; viz_rmax = next_rmax; } /* * block_point() * * Make the location opaque to light. */ void block_point(x,y) int x, y; { fill_point(y,x); /* recalc light sources here? */ /* * We have to do a full vision recalculation if we "could see" the * location. Why? Suppose some monster opened a way so that the * hero could see a lit room. However, the position of the opening * was out of night-vision range of the hero. Suddenly the hero should * see the lit room. */ if (viz_array[y][x]) vision_full_recalc = 1; } /* * unblock_point() * * Make the location transparent to light. */ void unblock_point(x,y) int x, y; { dig_point(y,x); /* recalc light sources here? */ if (viz_array[y][x]) vision_full_recalc = 1; } /*===========================================================================*\ | | | Everything below this line uses (y,x) instead of (x,y) --- the | | algorithms are faster if they are less recursive and can scan | | on a row longer. | | | \*===========================================================================*/ /* ========================================================================= *\ Left and Right Pointer Updates \* ========================================================================= */ /* * LEFT and RIGHT pointer rules * * * **NOTE** The rules changed on 4/4/90. This comment reflects the * new rules. The change was so that the stone-wall optimization * would work. * * OK, now the tough stuff. We must maintain our left and right * row pointers. The rules are as follows: * * Left Pointers: * ______________ * * + If you are a clear spot, your left will point to the first * stone to your left. If there is none, then point the first * legal position in the row (0). * * + If you are a blocked spot, then your left will point to the * left-most blocked spot to your left that is connected to you. * This means that a left-edge (a blocked spot that has an open * spot on its left) will point to itself. * * * Right Pointers: * --------------- * + If you are a clear spot, your right will point to the first * stone to your right. If there is none, then point the last * legal position in the row (COLNO-1). * * + If you are a blocked spot, then your right will point to the * right-most blocked spot to your right that is connected to you. * This means that a right-edge (a blocked spot that has an open * spot on its right) will point to itself. */ STATIC_OVL void dig_point(row,col) int row,col; { int i; if (viz_clear[row][col]) return; /* already done */ viz_clear[row][col] = 1; /* * Boundary cases first. */ if (col == 0) { /* left edge */ if (viz_clear[row][1]) { right_ptrs[row][0] = right_ptrs[row][1]; } else { right_ptrs[row][0] = 1; for (i = 1; i <= right_ptrs[row][1]; i++) left_ptrs[row][i] = 1; } } else if (col == (COLNO-1)) { /* right edge */ if (viz_clear[row][COLNO-2]) { left_ptrs[row][COLNO-1] = left_ptrs[row][COLNO-2]; } else { left_ptrs[row][COLNO-1] = COLNO-2; for (i = left_ptrs[row][COLNO-2]; i < COLNO-1; i++) right_ptrs[row][i] = COLNO-2; } } /* * At this point, we know we aren't on the boundaries. */ else if (viz_clear[row][col-1] && viz_clear[row][col+1]) { /* Both sides clear */ for (i = left_ptrs[row][col-1]; i <= col; i++) { if (!viz_clear[row][i]) continue; /* catch non-end case */ right_ptrs[row][i] = right_ptrs[row][col+1]; } for (i = col; i <= right_ptrs[row][col+1]; i++) { if (!viz_clear[row][i]) continue; /* catch non-end case */ left_ptrs[row][i] = left_ptrs[row][col-1]; } } else if (viz_clear[row][col-1]) { /* Left side clear, right side blocked. */ for (i = col+1; i <= right_ptrs[row][col+1]; i++) left_ptrs[row][i] = col+1; for (i = left_ptrs[row][col-1]; i <= col; i++) { if (!viz_clear[row][i]) continue; /* catch non-end case */ right_ptrs[row][i] = col+1; } left_ptrs[row][col] = left_ptrs[row][col-1]; } else if (viz_clear[row][col+1]) { /* Right side clear, left side blocked. */ for (i = left_ptrs[row][col-1]; i < col; i++) right_ptrs[row][i] = col-1; for (i = col; i <= right_ptrs[row][col+1]; i++) { if (!viz_clear[row][i]) continue; /* catch non-end case */ left_ptrs[row][i] = col-1; } right_ptrs[row][col] = right_ptrs[row][col+1]; } else { /* Both sides blocked */ for (i = left_ptrs[row][col-1]; i < col; i++) right_ptrs[row][i] = col-1; for (i = col+1; i <= right_ptrs[row][col+1]; i++) left_ptrs[row][i] = col+1; left_ptrs[row][col] = col-1; right_ptrs[row][col] = col+1; } } STATIC_OVL void fill_point(row,col) int row, col; { int i; if (!viz_clear[row][col]) return; viz_clear[row][col] = 0; if (col == 0) { if (viz_clear[row][1]) { /* adjacent is clear */ right_ptrs[row][0] = 0; } else { right_ptrs[row][0] = right_ptrs[row][1]; for (i = 1; i <= right_ptrs[row][1]; i++) left_ptrs[row][i] = 0; } } else if (col == COLNO-1) { if (viz_clear[row][COLNO-2]) { /* adjacent is clear */ left_ptrs[row][COLNO-1] = COLNO-1; } else { left_ptrs[row][COLNO-1] = left_ptrs[row][COLNO-2]; for (i = left_ptrs[row][COLNO-2]; i < COLNO-1; i++) right_ptrs[row][i] = COLNO-1; } } /* * Else we know that we are not on an edge. */ else if (viz_clear[row][col-1] && viz_clear[row][col+1]) { /* Both sides clear */ for (i = left_ptrs[row][col-1]+1; i <= col; i++) right_ptrs[row][i] = col; if (!left_ptrs[row][col-1]) /* catch the end case */ right_ptrs[row][0] = col; for (i = col; i < right_ptrs[row][col+1]; i++) left_ptrs[row][i] = col; if (right_ptrs[row][col+1] == COLNO-1) /* catch the end case */ left_ptrs[row][COLNO-1] = col; } else if (viz_clear[row][col-1]) { /* Left side clear, right side blocked. */ for (i = col; i <= right_ptrs[row][col+1]; i++) left_ptrs[row][i] = col; for (i = left_ptrs[row][col-1]+1; i < col; i++) right_ptrs[row][i] = col; if (!left_ptrs[row][col-1]) /* catch the end case */ right_ptrs[row][i] = col; right_ptrs[row][col] = right_ptrs[row][col+1]; } else if (viz_clear[row][col+1]) { /* Right side clear, left side blocked. */ for (i = left_ptrs[row][col-1]; i <= col; i++) right_ptrs[row][i] = col; for (i = col+1; i < right_ptrs[row][col+1]; i++) left_ptrs[row][i] = col; if (right_ptrs[row][col+1] == COLNO-1) /* catch the end case */ left_ptrs[row][i] = col; left_ptrs[row][col] = left_ptrs[row][col-1]; } else { /* Both sides blocked */ for (i = left_ptrs[row][col-1]; i <= col; i++) right_ptrs[row][i] = right_ptrs[row][col+1]; for (i = col; i <= right_ptrs[row][col+1]; i++) left_ptrs[row][i] = left_ptrs[row][col-1]; } } /*===========================================================================*/ /*===========================================================================*/ /* Use either algorithm C or D. See the config.h for more details. =========*/ /* * Variables local to both Algorithms C and D. */ static int start_row; static int start_col; static int step; static char **cs_rows; static char *cs_left; static char *cs_right; static void FDECL((*vis_func), (int,int,genericptr_t)); static genericptr_t varg; /* * Both Algorithms C and D use the following macros. * * good_row(z) - Return TRUE if the argument is a legal row. * set_cs(rowp,col) - Set the local could see array. * set_min(z) - Save the min value of the argument and the current * row minimum. * set_max(z) - Save the max value of the argument and the current * row maximum. * * The last three macros depend on having local pointers row_min, row_max, * and rowp being set correctly. */ #define set_cs(rowp,col) (rowp[col] = COULD_SEE) #define good_row(z) ((z) >= 0 && (z) < ROWNO) #define set_min(z) if (*row_min > (z)) *row_min = (z) #define set_max(z) if (*row_max < (z)) *row_max = (z) #define is_clear(row,col) viz_clear_rows[row][col] /* * clear_path() expanded into 4 macros/functions: * * q1_path() * q2_path() * q3_path() * q4_path() * * "Draw" a line from the start to the given location. Stop if we hit * something that blocks light. The start and finish points themselves are * not checked, just the points between them. These routines do _not_ * expect to be called with the same starting and stopping point. * * These routines use the generalized integer Bresenham's algorithm (fast * line drawing) for all quadrants. The algorithm was taken from _Procedural * Elements for Computer Graphics_, by David F. Rogers. McGraw-Hill, 1985. */ #ifdef MACRO_CPATH /* quadrant calls are macros */ /* * When called, the result is in "result". * The first two arguments (srow,scol) are one end of the path. The next * two arguments (row,col) are the destination. The last argument is * used as a C language label. This means that it must be different * in each pair of calls. */ /* * Quadrant I (step < 0). */ #define q1_path(srow,scol,y2,x2,label) \ { \ int dx, dy; \ register int k, err, x, y, dxs, dys; \ \ x = (scol); y = (srow); \ dx = (x2) - x; dy = y - (y2); \ \ result = 0; /* default to a blocked path */\ \ dxs = dx << 1; /* save the shifted values */\ dys = dy << 1; \ if (dy > dx) { \ err = dxs - dy; \ \ for (k = dy-1; k; k--) { \ if (err >= 0) { \ x++; \ err -= dys; \ } \ y--; \ err += dxs; \ if (!is_clear(y,x)) goto label;/* blocked */\ } \ } else { \ err = dys - dx; \ \ for (k = dx-1; k; k--) { \ if (err >= 0) { \ y--; \ err -= dxs; \ } \ x++; \ err += dys; \ if (!is_clear(y,x)) goto label;/* blocked */\ } \ } \ \ result = 1; \ } /* * Quadrant IV (step > 0). */ #define q4_path(srow,scol,y2,x2,label) \ { \ int dx, dy; \ register int k, err, x, y, dxs, dys; \ \ x = (scol); y = (srow); \ dx = (x2) - x; dy = (y2) - y; \ \ result = 0; /* default to a blocked path */\ \ dxs = dx << 1; /* save the shifted values */\ dys = dy << 1; \ if (dy > dx) { \ err = dxs - dy; \ \ for (k = dy-1; k; k--) { \ if (err >= 0) { \ x++; \ err -= dys; \ } \ y++; \ err += dxs; \ if (!is_clear(y,x)) goto label;/* blocked */\ } \ \ } else { \ err = dys - dx; \ \ for (k = dx-1; k; k--) { \ if (err >= 0) { \ y++; \ err -= dxs; \ } \ x++; \ err += dys; \ if (!is_clear(y,x)) goto label;/* blocked */\ } \ } \ \ result = 1; \ } /* * Quadrant II (step < 0). */ #define q2_path(srow,scol,y2,x2,label) \ { \ int dx, dy; \ register int k, err, x, y, dxs, dys; \ \ x = (scol); y = (srow); \ dx = x - (x2); dy = y - (y2); \ \ result = 0; /* default to a blocked path */\ \ dxs = dx << 1; /* save the shifted values */\ dys = dy << 1; \ if (dy > dx) { \ err = dxs - dy; \ \ for (k = dy-1; k; k--) { \ if (err >= 0) { \ x--; \ err -= dys; \ } \ y--; \ err += dxs; \ if (!is_clear(y,x)) goto label;/* blocked */\ } \ } else { \ err = dys - dx; \ \ for (k = dx-1; k; k--) { \ if (err >= 0) { \ y--; \ err -= dxs; \ } \ x--; \ err += dys; \ if (!is_clear(y,x)) goto label;/* blocked */\ } \ } \ \ result = 1; \ } /* * Quadrant III (step > 0). */ #define q3_path(srow,scol,y2,x2,label) \ { \ int dx, dy; \ register int k, err, x, y, dxs, dys; \ \ x = (scol); y = (srow); \ dx = x - (x2); dy = (y2) - y; \ \ result = 0; /* default to a blocked path */\ \ dxs = dx << 1; /* save the shifted values */\ dys = dy << 1; \ if (dy > dx) { \ err = dxs - dy; \ \ for (k = dy-1; k; k--) { \ if (err >= 0) { \ x--; \ err -= dys; \ } \ y++; \ err += dxs; \ if (!is_clear(y,x)) goto label;/* blocked */\ } \ \ } else { \ err = dys - dx; \ \ for (k = dx-1; k; k--) { \ if (err >= 0) { \ y++; \ err -= dxs; \ } \ x--; \ err += dys; \ if (!is_clear(y,x)) goto label;/* blocked */\ } \ } \ \ result = 1; \ } #else /* quadrants are really functions */ STATIC_DCL int FDECL(_q1_path, (int,int,int,int)); STATIC_DCL int FDECL(_q2_path, (int,int,int,int)); STATIC_DCL int FDECL(_q3_path, (int,int,int,int)); STATIC_DCL int FDECL(_q4_path, (int,int,int,int)); #define q1_path(sy,sx,y,x,dummy) result = _q1_path(sy,sx,y,x) #define q2_path(sy,sx,y,x,dummy) result = _q2_path(sy,sx,y,x) #define q3_path(sy,sx,y,x,dummy) result = _q3_path(sy,sx,y,x) #define q4_path(sy,sx,y,x,dummy) result = _q4_path(sy,sx,y,x) /* * Quadrant I (step < 0). */ STATIC_OVL int _q1_path(srow,scol,y2,x2) int scol, srow, y2, x2; { int dx, dy; register int k, err, x, y, dxs, dys; x = scol; y = srow; dx = x2 - x; dy = y - y2; dxs = dx << 1; /* save the shifted values */ dys = dy << 1; if (dy > dx) { err = dxs - dy; for (k = dy-1; k; k--) { if (err >= 0) { x++; err -= dys; } y--; err += dxs; if (!is_clear(y,x)) return 0; /* blocked */ } } else { err = dys - dx; for (k = dx-1; k; k--) { if (err >= 0) { y--; err -= dxs; } x++; err += dys; if (!is_clear(y,x)) return 0;/* blocked */ } } return 1; } /* * Quadrant IV (step > 0). */ STATIC_OVL int _q4_path(srow,scol,y2,x2) int scol, srow, y2, x2; { int dx, dy; register int k, err, x, y, dxs, dys; x = scol; y = srow; dx = x2 - x; dy = y2 - y; dxs = dx << 1; /* save the shifted values */ dys = dy << 1; if (dy > dx) { err = dxs - dy; for (k = dy-1; k; k--) { if (err >= 0) { x++; err -= dys; } y++; err += dxs; if (!is_clear(y,x)) return 0; /* blocked */ } } else { err = dys - dx; for (k = dx-1; k; k--) { if (err >= 0) { y++; err -= dxs; } x++; err += dys; if (!is_clear(y,x)) return 0;/* blocked */ } } return 1; } /* * Quadrant II (step < 0). */ STATIC_OVL int _q2_path(srow,scol,y2,x2) int scol, srow, y2, x2; { int dx, dy; register int k, err, x, y, dxs, dys; x = scol; y = srow; dx = x - x2; dy = y - y2; dxs = dx << 1; /* save the shifted values */ dys = dy << 1; if (dy > dx) { err = dxs - dy; for (k = dy-1; k; k--) { if (err >= 0) { x--; err -= dys; } y--; err += dxs; if (!is_clear(y,x)) return 0; /* blocked */ } } else { err = dys - dx; for (k = dx-1; k; k--) { if (err >= 0) { y--; err -= dxs; } x--; err += dys; if (!is_clear(y,x)) return 0;/* blocked */ } } return 1; } /* * Quadrant III (step > 0). */ STATIC_OVL int _q3_path(srow,scol,y2,x2) int scol, srow, y2, x2; { int dx, dy; register int k, err, x, y, dxs, dys; x = scol; y = srow; dx = x - x2; dy = y2 - y; dxs = dx << 1; /* save the shifted values */ dys = dy << 1; if (dy > dx) { err = dxs - dy; for (k = dy-1; k; k--) { if (err >= 0) { x--; err -= dys; } y++; err += dxs; if (!is_clear(y,x)) return 0; /* blocked */ } } else { err = dys - dx; for (k = dx-1; k; k--) { if (err >= 0) { y++; err -= dxs; } x--; err += dys; if (!is_clear(y,x)) return 0;/* blocked */ } } return 1; } #endif /* quadrants are functions */ /* * Use vision tables to determine if there is a clear path from * (col1,row1) to (col2,row2). This is used by: * m_cansee() * m_canseeu() * do_light_sources() */ boolean clear_path(col1,row1,col2,row2) int col1, row1, col2, row2; { int result; if(col1 < col2) { if(row1 > row2) { q1_path(row1,col1,row2,col2,cleardone); } else { q4_path(row1,col1,row2,col2,cleardone); } } else { if(row1 > row2) { q2_path(row1,col1,row2,col2,cleardone); } else if(row1 == row2 && col1 == col2) { result = 1; } else { q3_path(row1,col1,row2,col2,cleardone); } } #ifdef MACRO_CPATH cleardone: #endif return((boolean)result); } #ifdef VISION_TABLES /*===========================================================================*\ GENERAL LINE OF SIGHT Algorithm D \*===========================================================================*/ /* * Indicate caller for the shadow routines. */ #define FROM_RIGHT 0 #define FROM_LEFT 1 /* * Include the table definitions. */ #include "vis_tab.h" /* 3D table pointers. */ static close2d *close_dy[CLOSE_MAX_BC_DY]; static far2d *far_dy[FAR_MAX_BC_DY]; STATIC_DCL void FDECL(right_side, (int,int,int,int,int,int,int,char*)); STATIC_DCL void FDECL(left_side, (int,int,int,int,int,int,int,char*)); STATIC_DCL int FDECL(close_shadow, (int,int,int,int)); STATIC_DCL int FDECL(far_shadow, (int,int,int,int)); /* * Initialize algorithm D's table pointers. If we don't have these, * then we do 3D table lookups. Verrrry slow. */ STATIC_OVL void view_init() { int i; for (i = 0; i < CLOSE_MAX_BC_DY; i++) close_dy[i] = &close_table[i]; for (i = 0; i < FAR_MAX_BC_DY; i++) far_dy[i] = &far_table[i]; } /* * If the far table has an entry of OFF_TABLE, then the far block prevents * us from seeing the location just above/below it. I.e. the first visible * location is one *before* the block. */ #define OFF_TABLE 0xff STATIC_OVL int close_shadow(side,this_row,block_row,block_col) int side,this_row,block_row,block_col; { register int sdy, sdx, pdy, offset; /* * If on the same column (block_row = -1), then we can see it. */ if (block_row < 0) return block_col; /* Take explicit absolute values. Adjust. */ if ((sdy = (start_row-block_row)) < 0) sdy = -sdy; --sdy; /* src dy */ if ((sdx = (start_col-block_col)) < 0) sdx = -sdx; /* src dx */ if ((pdy = (block_row-this_row)) < 0) pdy = -pdy; /* point dy */ if (sdy < 0 || sdy >= CLOSE_MAX_SB_DY || sdx >= CLOSE_MAX_SB_DX || pdy >= CLOSE_MAX_BC_DY) { impossible("close_shadow: bad value"); return block_col; } offset = close_dy[sdy]->close[sdx][pdy]; if (side == FROM_RIGHT) return block_col + offset; return block_col - offset; } STATIC_OVL int far_shadow(side,this_row,block_row,block_col) int side,this_row,block_row,block_col; { register int sdy, sdx, pdy, offset; /* * Take care of a bug that shows up only on the borders. * * If the block is beyond the border, then the row is negative. Return * the block's column number (should be 0 or COLNO-1). * * Could easily have the column be -1, but then wouldn't know if it was * the left or right border. */ if (block_row < 0) return block_col; /* Take explicit absolute values. Adjust. */ if ((sdy = (start_row-block_row)) < 0) sdy = -sdy; /* src dy */ if ((sdx = (start_col-block_col)) < 0) sdx = -sdx; --sdx; /* src dx */ if ((pdy = (block_row-this_row)) < 0) pdy = -pdy; --pdy; /* point dy */ if (sdy >= FAR_MAX_SB_DY || sdx < 0 || sdx >= FAR_MAX_SB_DX || pdy < 0 || pdy >= FAR_MAX_BC_DY) { impossible("far_shadow: bad value"); return block_col; } if ((offset = far_dy[sdy]->far_q[sdx][pdy]) == OFF_TABLE) offset = -1; if (side == FROM_RIGHT) return block_col + offset; return block_col - offset; } /* * right_side() * * Figure out what could be seen on the right side of the source. */ STATIC_OVL void right_side(row, cb_row, cb_col, fb_row, fb_col, left, right_mark, limits) int row; /* current row */ int cb_row, cb_col; /* close block row and col */ int fb_row, fb_col; /* far block row and col */ int left; /* left mark of the previous row */ int right_mark; /* right mark of previous row */ char *limits; /* points at range limit for current row, or NULL */ { register int i; register char *rowp; int hit_stone = 0; int left_shadow, right_shadow, loc_right; int lblock_col; /* local block column (current row) */ int nrow, deeper; char *row_min; /* left most */ char *row_max; /* right most */ int lim_max; /* right most limit of circle */ #ifdef GCC_WARN rowp = 0; #endif nrow = row + step; #ifdef GCC_WARN rowp = row_min = row_max = NULL; lblock_col = 0; #endif deeper = good_row(nrow) && (!limits || (*limits >= *(limits+1))); if(!vis_func) { rowp = cs_rows[row]; row_min = &cs_left[row]; row_max = &cs_right[row]; } if(limits) { lim_max = start_col + *limits; if(lim_max > COLNO-1) lim_max = COLNO-1; if(right_mark > lim_max) right_mark = lim_max; limits++; /* prepare for next row */ } else lim_max = COLNO-1; /* * Get the left shadow from the close block. This value could be * illegal. */ left_shadow = close_shadow(FROM_RIGHT,row,cb_row,cb_col); /* * Mark all stone walls as seen before the left shadow. All this work * for a special case. * * NOTE. With the addition of this code in here, it is now *required* * for the algorithm to work correctly. If this is commented out, * change the above assignment so that left and not left_shadow is the * variable that gets the shadow. */ while (left <= right_mark) { loc_right = right_ptrs[row][left]; if(loc_right > lim_max) loc_right = lim_max; if (viz_clear_rows[row][left]) { if (loc_right >= left_shadow) { left = left_shadow; /* opening ends beyond shadow */ break; } left = loc_right; loc_right = right_ptrs[row][left]; if(loc_right > lim_max) loc_right = lim_max; if (left == loc_right) return; /* boundary */ /* Shadow covers opening, beyond right mark */ if (left == right_mark && left_shadow > right_mark) return; } if (loc_right > right_mark) /* can't see stone beyond the mark */ loc_right = right_mark; if(vis_func) { for (i = left; i <= loc_right; i++) (*vis_func)(i, row, varg); } else { for (i = left; i <= loc_right; i++) set_cs(rowp,i); set_min(left); set_max(loc_right); } if (loc_right == right_mark) return; /* all stone */ if (loc_right >= left_shadow) hit_stone = 1; left = loc_right + 1; } /* * At this point we are at the first visible clear spot on or beyond * the left shadow, unless the left shadow is an illegal value. If we * have "hit stone" then we have a stone wall just to our left. */ /* * Get the right shadow. Make sure that it is a legal value. */ if ((right_shadow = far_shadow(FROM_RIGHT,row,fb_row,fb_col)) >= COLNO) right_shadow = COLNO-1; /* * Make vertical walls work the way we want them. In this case, we * note when the close block blocks the column just above/beneath * it (right_shadow < fb_col [actually right_shadow == fb_col-1]). If * the location is filled, then we want to see it, so we put the * right shadow back (same as fb_col). */ if (right_shadow < fb_col && !viz_clear_rows[row][fb_col]) right_shadow = fb_col; if(right_shadow > lim_max) right_shadow = lim_max; /* * Main loop. Within the range of sight of the previous row, mark all * stone walls as seen. Follow open areas recursively. */ while (left <= right_mark) { /* Get the far right of the opening or wall */ loc_right = right_ptrs[row][left]; if(loc_right > lim_max) loc_right = lim_max; if (!viz_clear_rows[row][left]) { hit_stone = 1; /* use stone on this row as close block */ /* * We can see all of the wall until the next open spot or the * start of the shadow caused by the far block (right). * * Can't see stone beyond the right mark. */ if (loc_right > right_mark) loc_right = right_mark; if(vis_func) { for (i = left; i <= loc_right; i++) (*vis_func)(i, row, varg); } else { for (i = left; i <= loc_right; i++) set_cs(rowp,i); set_min(left); set_max(loc_right); } if (loc_right == right_mark) return; /* hit the end */ left = loc_right + 1; loc_right = right_ptrs[row][left]; if(loc_right > lim_max) loc_right = lim_max; /* fall through... we know at least one position is visible */ } /* * We are in an opening. * * If this is the first open spot since the could see area (this is * true if we have hit stone), get the shadow generated by the wall * just to our left. */ if (hit_stone) { lblock_col = left-1; /* local block column */ left = close_shadow(FROM_RIGHT,row,row,lblock_col); if (left > lim_max) break; /* off the end */ } /* * Check if the shadow covers the opening. If it does, then * move to end of the opening. A shadow generated on from a * wall on this row does *not* cover the wall on the right * of the opening. */ if (left >= loc_right) { if (loc_right == lim_max) { /* boundary */ if (left == lim_max) { if(vis_func) (*vis_func)(lim_max, row, varg); else { set_cs(rowp,lim_max); /* last pos */ set_max(lim_max); } } return; /* done */ } left = loc_right; continue; } /* * If the far wall of the opening (loc_right) is closer than the * shadow limit imposed by the far block (right) then use the far * wall as our new far block when we recurse. * * If the limits are the the same, and the far block really exists * (fb_row >= 0) then do the same as above. * * Normally, the check would be for the far wall being closer OR EQUAL * to the shadow limit. However, there is a bug that arises from the * fact that the clear area pointers end in an open space (if it * exists) on a boundary. This then makes a far block exist where it * shouldn't --- on a boundary. To get around that, I had to * introduce the concept of a non-existent far block (when the * row < 0). Next I have to check for it. Here is where that check * exists. */ if ((loc_right < right_shadow) || (fb_row >= 0 && loc_right == right_shadow)) { if(vis_func) { for (i = left; i <= loc_right; i++) (*vis_func)(i, row, varg); } else { for (i = left; i <= loc_right; i++) set_cs(rowp,i); set_min(left); set_max(loc_right); } if (deeper) { if (hit_stone) right_side(nrow,row,lblock_col,row,loc_right, left,loc_right,limits); else right_side(nrow,cb_row,cb_col,row,loc_right, left,loc_right,limits); } /* * The following line, setting hit_stone, is needed for those * walls that are only 1 wide. If hit stone is *not* set and * the stone is only one wide, then the close block is the old * one instead one on the current row. A way around having to * set it here is to make left = loc_right (not loc_right+1) and * let the outer loop take care of it. However, if we do that * then we then have to check for boundary conditions here as * well. */ hit_stone = 1; left = loc_right+1; } /* * The opening extends beyond the right mark. This means that * the next far block is the current far block. */ else { if(vis_func) { for (i=left; i <= right_shadow; i++) (*vis_func)(i, row, varg); } else { for (i = left; i <= right_shadow; i++) set_cs(rowp,i); set_min(left); set_max(right_shadow); } if (deeper) { if (hit_stone) right_side(nrow, row,lblock_col,fb_row,fb_col, left,right_shadow,limits); else right_side(nrow,cb_row, cb_col,fb_row,fb_col, left,right_shadow,limits); } return; /* we're outta here */ } } } /* * left_side() * * This routine is the mirror image of right_side(). Please see right_side() * for blow by blow comments. */ STATIC_OVL void left_side(row, cb_row, cb_col, fb_row, fb_col, left_mark, right, limits) int row; /* the current row */ int cb_row, cb_col; /* close block row and col */ int fb_row, fb_col; /* far block row and col */ int left_mark; /* left mark of previous row */ int right; /* right mark of the previous row */ char *limits; { register int i; register char *rowp; int hit_stone = 0; int left_shadow, right_shadow, loc_left; int lblock_col; /* local block column (current row) */ int nrow, deeper; char *row_min; /* left most */ char *row_max; /* right most */ int lim_min; #ifdef GCC_WARN rowp = row_min = row_max = NULL; lblock_col = 0; #endif nrow = row + step; deeper = good_row(nrow) && (!limits || (*limits >= *(limits+1))); if(!vis_func) { rowp = cs_rows[row]; row_min = &cs_left[row]; row_max = &cs_right[row]; } if(limits) { lim_min = start_col - *limits; if(lim_min < 0) lim_min = 0; if(left_mark < lim_min) left_mark = lim_min; limits++; /* prepare for next row */ } else lim_min = 0; /* This value could be illegal. */ right_shadow = close_shadow(FROM_LEFT,row,cb_row,cb_col); while ( right >= left_mark ) { loc_left = left_ptrs[row][right]; if(loc_left < lim_min) loc_left = lim_min; if (viz_clear_rows[row][right]) { if (loc_left <= right_shadow) { right = right_shadow; /* opening ends beyond shadow */ break; } right = loc_left; loc_left = left_ptrs[row][right]; if(loc_left < lim_min) loc_left = lim_min; if (right == loc_left) return; /* boundary */ } if (loc_left < left_mark) /* can't see beyond the left mark */ loc_left = left_mark; if(vis_func) { for (i = loc_left; i <= right; i++) (*vis_func)(i, row, varg); } else { for (i = loc_left; i <= right; i++) set_cs(rowp,i); set_min(loc_left); set_max(right); } if (loc_left == left_mark) return; /* all stone */ if (loc_left <= right_shadow) hit_stone = 1; right = loc_left - 1; } /* At first visible clear spot on or beyond the right shadow. */ if ((left_shadow = far_shadow(FROM_LEFT,row,fb_row,fb_col)) < 0) left_shadow = 0; /* Do vertical walls as we want. */ if (left_shadow > fb_col && !viz_clear_rows[row][fb_col]) left_shadow = fb_col; if(left_shadow < lim_min) left_shadow = lim_min; while (right >= left_mark) { loc_left = left_ptrs[row][right]; if (!viz_clear_rows[row][right]) { hit_stone = 1; /* use stone on this row as close block */ /* We can only see walls until the left mark */ if (loc_left < left_mark) loc_left = left_mark; if(vis_func) { for (i = loc_left; i <= right; i++) (*vis_func)(i, row, varg); } else { for (i = loc_left; i <= right; i++) set_cs(rowp,i); set_min(loc_left); set_max(right); } if (loc_left == left_mark) return; /* hit end */ right = loc_left - 1; loc_left = left_ptrs[row][right]; if (loc_left < lim_min) loc_left = lim_min; /* fall through...*/ } /* We are in an opening. */ if (hit_stone) { lblock_col = right+1; /* stone block (local) */ right = close_shadow(FROM_LEFT,row,row,lblock_col); if (right < lim_min) return; /* off the end */ } /* Check if the shadow covers the opening. */ if (right <= loc_left) { /* Make a boundary condition work. */ if (loc_left == lim_min) { /* at boundary */ if (right == lim_min) { if(vis_func) (*vis_func)(lim_min, row, varg); else { set_cs(rowp,lim_min); /* caught the last pos */ set_min(lim_min); } } return; /* and break out the loop */ } right = loc_left; continue; } /* If the far wall of the opening is closer than the shadow limit. */ if ((loc_left > left_shadow) || (fb_row >= 0 && loc_left == left_shadow)) { if(vis_func) { for (i = loc_left; i <= right; i++) (*vis_func)(i, row, varg); } else { for (i = loc_left; i <= right; i++) set_cs(rowp,i); set_min(loc_left); set_max(right); } if (deeper) { if (hit_stone) left_side(nrow,row,lblock_col,row,loc_left, loc_left,right,limits); else left_side(nrow,cb_row,cb_col,row,loc_left, loc_left,right,limits); } hit_stone = 1; /* needed for walls of width 1 */ right = loc_left-1; } /* The opening extends beyond the left mark. */ else { if(vis_func) { for (i=left_shadow; i <= right; i++) (*vis_func)(i, row, varg); } else { for (i = left_shadow; i <= right; i++) set_cs(rowp,i); set_min(left_shadow); set_max(right); } if (deeper) { if (hit_stone) left_side(nrow,row,lblock_col,fb_row,fb_col, left_shadow,right,limits); else left_side(nrow,cb_row,cb_col,fb_row,fb_col, left_shadow,right,limits); } return; /* we're outta here */ } } } /* * view_from * * Calculate a view from the given location. Initialize and fill a * ROWNOxCOLNO array (could_see) with all the locations that could be * seen from the source location. Initialize and fill the left most * and right most boundaries of what could be seen. */ STATIC_OVL void view_from(srow,scol,loc_cs_rows,left_most,right_most, range, func, arg) int srow, scol; /* source row and column */ char **loc_cs_rows; /* could_see array (row pointers) */ char *left_most, *right_most; /* limits of what could be seen */ int range; /* 0 if unlimited */ void FDECL((*func), (int,int,genericptr_t)); genericptr_t arg; { register int i; char *rowp; int nrow, left, right, left_row, right_row; char *limits; /* Set globals for near_shadow(), far_shadow(), etc. to use. */ start_col = scol; start_row = srow; cs_rows = loc_cs_rows; cs_left = left_most; cs_right = right_most; vis_func = func; varg = arg; /* Find the left and right limits of sight on the starting row. */ if (viz_clear_rows[srow][scol]) { left = left_ptrs[srow][scol]; right = right_ptrs[srow][scol]; } else { left = (!scol) ? 0 : (viz_clear_rows[srow][scol-1] ? left_ptrs[srow][scol-1] : scol-1); right = (scol == COLNO-1) ? COLNO-1 : (viz_clear_rows[srow][scol+1] ? right_ptrs[srow][scol+1] : scol+1); } if(range) { if(range > MAX_RADIUS || range < 1) panic("view_from called with range %d", range); limits = circle_ptr(range) + 1; /* start at next row */ if(left < scol - range) left = scol - range; if(right > scol + range) right = scol + range; } else limits = (char*) 0; if(func) { for (i = left; i <= right; i++) (*func)(i, srow, arg); } else { /* Row optimization */ rowp = cs_rows[srow]; /* We know that we can see our row. */ for (i = left; i <= right; i++) set_cs(rowp,i); cs_left[srow] = left; cs_right[srow] = right; } /* The far block has a row number of -1 if we are on an edge. */ right_row = (right == COLNO-1) ? -1 : srow; left_row = (!left) ? -1 : srow; /* * Check what could be seen in quadrants. */ if ( (nrow = srow+1) < ROWNO ) { step = 1; /* move down */ if (scol= 0 ) { step = -1; /* move up */ if (scol= *(limits+1))); if(!vis_func) { rowp = cs_rows[row]; /* optimization */ row_min = &cs_left[row]; row_max = &cs_right[row]; } if(limits) { lim_max = start_col + *limits; if(lim_max > COLNO-1) lim_max = COLNO-1; if(right_mark > lim_max) right_mark = lim_max; limits++; /* prepare for next row */ } else lim_max = COLNO-1; while (left <= right_mark) { right_edge = right_ptrs[row][left]; if(right_edge > lim_max) right_edge = lim_max; if (!is_clear(row,left)) { /* * Jump to the far side of a stone wall. We can set all * the points in between as seen. * * If the right edge goes beyond the right mark, check to see * how much we can see. */ if (right_edge > right_mark) { /* * If the mark on the previous row was a clear position, * the odds are that we can actually see part of the wall * beyond the mark on this row. If so, then see one beyond * the mark. Otherwise don't. This is a kludge so corners * with an adjacent doorway show up in nethack. */ right_edge = is_clear(row-step,right_mark) ? right_mark+1 : right_mark; } if(vis_func) { for (i = left; i <= right_edge; i++) (*vis_func)(i, row, varg); } else { for (i = left; i <= right_edge; i++) set_cs(rowp,i); set_min(left); set_max(right_edge); } left = right_edge + 1; /* no limit check necessary */ continue; } /* No checking needed if our left side is the start column. */ if (left != start_col) { /* * Find the left side. Move right until we can see it or we run * into a wall. */ for (; left <= right_edge; left++) { if (step < 0) { q1_path(start_row,start_col,row,left,rside1); } else { q4_path(start_row,start_col,row,left,rside1); } rside1: /* used if q?_path() is a macro */ if (result) break; } /* * Check for boundary conditions. We *need* check (2) to break * an infinite loop where: * * left == right_edge == right_mark == lim_max. * */ if (left > lim_max) return; /* check (1) */ if (left == lim_max) { /* check (2) */ if(vis_func) (*vis_func)(lim_max, row, varg); else { set_cs(rowp,lim_max); set_max(lim_max); } return; } /* * Check if we can see any spots in the opening. We might * (left == right_edge) or might not (left == right_edge+1) have * been able to see the far wall. Make sure we *can* see the * wall (remember, we can see the spot above/below this one) * by backing up. */ if (left >= right_edge) { left = right_edge; /* for the case left == right_edge+1 */ continue; } } /* * Find the right side. If the marker from the previous row is * closer than the edge on this row, then we have to check * how far we can see around the corner (under the overhang). Stop * at the first non-visible spot or we actually hit the far wall. * * Otherwise, we know we can see the right edge of the current row. * * This must be a strict less than so that we can always see a * horizontal wall, even if it is adjacent to us. */ if (right_mark < right_edge) { for (right = right_mark; right <= right_edge; right++) { if (step < 0) { q1_path(start_row,start_col,row,right,rside2); } else { q4_path(start_row,start_col,row,right,rside2); } rside2: /* used if q?_path() is a macro */ if (!result) break; } --right; /* get rid of the last increment */ } else right = right_edge; /* * We have the range that we want. Set the bits. Note that * there is no else --- we no longer handle splinters. */ if (left <= right) { /* * An ugly special case. If you are adjacent to a vertical wall * and it has a break in it, then the right mark is set to be * start_col. We *want* to be able to see adjacent vertical * walls, so we have to set it back. */ if (left == right && left == start_col && start_col < (COLNO-1) && !is_clear(row,start_col+1)) right = start_col+1; if(right > lim_max) right = lim_max; /* set the bits */ if(vis_func) for (i = left; i <= right; i++) (*vis_func)(i, row, varg); else { for (i = left; i <= right; i++) set_cs(rowp,i); set_min(left); set_max(right); } /* recursive call for next finger of light */ if (deeper) right_side(nrow,left,right,limits); left = right + 1; /* no limit check necessary */ } } } /* * This routine is the mirror image of right_side(). See right_side() for * extensive comments. */ STATIC_OVL void left_side(row, left_mark, right, limits) int row, left_mark, right; char *limits; { int left, left_edge, nrow, deeper, result; register int i; register char *rowp; char *row_min, *row_max; int lim_min; #ifdef GCC_WARN rowp = row_min = row_max = 0; #endif nrow = row+step; deeper = good_row(nrow) && (!limits || (*limits >= *(limits+1))); if(!vis_func) { rowp = cs_rows[row]; row_min = &cs_left[row]; row_max = &cs_right[row]; } if(limits) { lim_min = start_col - *limits; if(lim_min < 0) lim_min = 0; if(left_mark < lim_min) left_mark = lim_min; limits++; /* prepare for next row */ } else lim_min = 0; while (right >= left_mark) { left_edge = left_ptrs[row][right]; if(left_edge < lim_min) left_edge = lim_min; if (!is_clear(row,right)) { /* Jump to the far side of a stone wall. */ if (left_edge < left_mark) { /* Maybe see more (kludge). */ left_edge = is_clear(row-step,left_mark) ? left_mark-1 : left_mark; } if(vis_func) { for (i = left_edge; i <= right; i++) (*vis_func)(i, row, varg); } else { for (i = left_edge; i <= right; i++) set_cs(rowp,i); set_min(left_edge); set_max(right); } right = left_edge - 1; /* no limit check necessary */ continue; } if (right != start_col) { /* Find the right side. */ for (; right >= left_edge; right--) { if (step < 0) { q2_path(start_row,start_col,row,right,lside1); } else { q3_path(start_row,start_col,row,right,lside1); } lside1: /* used if q?_path() is a macro */ if (result) break; } /* Check for boundary conditions. */ if (right < lim_min) return; if (right == lim_min) { if(vis_func) (*vis_func)(lim_min, row, varg); else { set_cs(rowp,lim_min); set_min(lim_min); } return; } /* Check if we can see any spots in the opening. */ if (right <= left_edge) { right = left_edge; continue; } } /* Find the left side. */ if (left_mark > left_edge) { for (left = left_mark; left >= left_edge; --left) { if (step < 0) { q2_path(start_row,start_col,row,left,lside2); } else { q3_path(start_row,start_col,row,left,lside2); } lside2: /* used if q?_path() is a macro */ if (!result) break; } left++; /* get rid of the last decrement */ } else left = left_edge; if (left <= right) { /* An ugly special case. */ if (left == right && right == start_col && start_col > 0 && !is_clear(row,start_col-1)) left = start_col-1; if(left < lim_min) left = lim_min; if(vis_func) for (i = left; i <= right; i++) (*vis_func)(i, row, varg); else { for (i = left; i <= right; i++) set_cs(rowp,i); set_min(left); set_max(right); } /* Recurse */ if (deeper) left_side(nrow,left,right,limits); right = left - 1; /* no limit check necessary */ } } } /* * Calculate all possible visible locations from the given location * (srow,scol). NOTE this is (y,x)! Mark the visible locations in the * array provided. */ STATIC_OVL void view_from(srow, scol, loc_cs_rows, left_most, right_most, range, func, arg) int srow, scol; /* starting row and column */ char **loc_cs_rows; /* pointers to the rows of the could_see array */ char *left_most; /* min mark on each row */ char *right_most; /* max mark on each row */ int range; /* 0 if unlimited */ void FDECL((*func), (int,int,genericptr_t)); genericptr_t arg; { register int i; /* loop counter */ char *rowp; /* optimization for setting could_see */ int nrow; /* the next row */ int left; /* the left-most visible column */ int right; /* the right-most visible column */ char *limits; /* range limit for next row */ /* Set globals for q?_path(), left_side(), and right_side() to use. */ start_col = scol; start_row = srow; cs_rows = loc_cs_rows; /* 'could see' rows */ cs_left = left_most; cs_right = right_most; vis_func = func; varg = arg; /* * Determine extent of sight on the starting row. */ if (is_clear(srow,scol)) { left = left_ptrs[srow][scol]; right = right_ptrs[srow][scol]; } else { /* * When in stone, you can only see your adjacent squares, unless * you are on an array boundary or a stone/clear boundary. */ left = (!scol) ? 0 : (is_clear(srow,scol-1) ? left_ptrs[srow][scol-1] : scol-1); right = (scol == COLNO-1) ? COLNO-1 : (is_clear(srow,scol+1) ? right_ptrs[srow][scol+1] : scol+1); } if(range) { if(range > MAX_RADIUS || range < 1) panic("view_from called with range %d", range); limits = circle_ptr(range) + 1; /* start at next row */ if(left < scol - range) left = scol - range; if(right > scol + range) right = scol + range; } else limits = (char*) 0; if(func) { for (i = left; i <= right; i++) (*func)(i, srow, arg); } else { /* Row pointer optimization. */ rowp = cs_rows[srow]; /* We know that we can see our row. */ for (i = left; i <= right; i++) set_cs(rowp,i); cs_left[srow] = left; cs_right[srow] = right; } /* * Check what could be seen in quadrants. We need to check for valid * rows here, since we don't do it in the routines right_side() and * left_side() [ugliness to remove extra routine calls]. */ if ( (nrow = srow+1) < ROWNO ) { /* move down */ step = 1; if (scol < COLNO-1) right_side(nrow, scol, right, limits); if (scol) left_side (nrow, left, scol, limits); } if ( (nrow = srow-1) >= 0 ) { /* move up */ step = -1; if (scol < COLNO-1) right_side(nrow, scol, right, limits); if (scol) left_side (nrow, left, scol, limits); } } #endif /*===== End of algorithm C =====*/ /* * AREA OF EFFECT "ENGINE" * * Calculate all possible visible locations as viewed from the given location * (srow,scol) within the range specified. Perform "func" with (x, y) args and * additional argument "arg" for each square. * * If not centered on the hero, just forward arguments to view_from(); it * will call "func" when necessary. If the hero is the center, use the * vision matrix and reduce extra work. */ void do_clear_area(scol,srow,range,func,arg) int scol, srow, range; void FDECL((*func), (int,int,genericptr_t)); genericptr_t arg; { /* If not centered on hero, do the hard work of figuring the area */ if (scol != u.ux || srow != u.uy) view_from(srow, scol, (char **)0, (char *)0, (char *)0, range, func, arg); else { register int x; int y, min_x, max_x, max_y, offset; char *limits; if (range > MAX_RADIUS || range < 1) panic("do_clear_area: illegal range %d", range); if(vision_full_recalc) vision_recalc(0); /* recalc vision if dirty */ limits = circle_ptr(range); if ((max_y = (srow + range)) >= ROWNO) max_y = ROWNO-1; if ((y = (srow - range)) < 0) y = 0; for (; y <= max_y; y++) { offset = limits[v_abs(y-srow)]; if((min_x = (scol - offset)) < 0) min_x = 0; if((max_x = (scol + offset)) >= COLNO) max_x = COLNO-1; for (x = min_x; x <= max_x; x++) if (couldsee(x, y)) (*func)(x, y, arg); } } } /*vision.c*/ slashem-0.0.7E7F3/src/steed.c0000664000076400007640000004276510545462317013731 0ustar aliali/* SCCS Id: @(#)steed.c 3.4 2003/01/10 */ /* Copyright (c) Kevin Hugo, 1998-1999. */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" #ifdef STEED /* Monsters that might be ridden */ static NEARDATA const char steeds[] = { S_QUADRUPED, S_UNICORN, S_ANGEL, S_CENTAUR, S_DRAGON, S_JABBERWOCK, '\0' }; STATIC_DCL boolean FDECL(landing_spot, (coord *, int, int)); /* caller has decided that hero can't reach something while mounted */ void rider_cant_reach() { You("aren't skilled enough to reach from %s.", y_monnam(u.usteed)); } /*** Putting the saddle on ***/ /* Can this monster wear a saddle? */ boolean can_saddle(mtmp) struct monst *mtmp; { struct permonst *ptr = mtmp->data; return (index(steeds, ptr->mlet) && (ptr->msize >= MZ_MEDIUM) && (!humanoid(ptr) || ptr->mlet == S_CENTAUR) && !amorphous(ptr) && !noncorporeal(ptr) && !is_whirly(ptr) && !unsolid(ptr)); } int use_saddle(otmp) struct obj *otmp; { struct monst *mtmp; struct permonst *ptr; int chance; const char *s; /* Can you use it? */ if (nohands(youmonst.data)) { You("have no hands!"); /* not `body_part(HAND)' */ return 0; } else if (!freehand()) { You("have no free %s.", body_part(HAND)); return 0; } /* Select an animal */ if (u.uswallow || Underwater || !getdir((char *)0)) { pline(Never_mind); return 0; } if (!u.dx && !u.dy) { pline("Saddle yourself? Very funny..."); return 0; } if (!isok(u.ux+u.dx, u.uy+u.dy) || !(mtmp = m_at(u.ux+u.dx, u.uy+u.dy)) || !canspotmon(mtmp)) { pline("I see nobody there."); return 1; } /* Is this a valid monster? */ if (mtmp->misc_worn_check & W_SADDLE || which_armor(mtmp, W_SADDLE)) { pline("%s doesn't need another one.", Monnam(mtmp)); return 1; } ptr = mtmp->data; if (touch_petrifies(ptr) && !uarmg && !Stone_resistance) { char kbuf[BUFSZ]; You("touch %s.", mon_nam(mtmp)); if (!(poly_when_stoned(youmonst.data) && polymon(PM_STONE_GOLEM))) { Sprintf(kbuf, "attempting to saddle %s", an(mtmp->data->mname)); instapetrify(kbuf); } } if (ptr == &mons[PM_INCUBUS] || ptr == &mons[PM_SUCCUBUS]) { pline("Shame on you!"); exercise(A_WIS, FALSE); return 1; } if (mtmp->isminion || mtmp->isshk || mtmp->ispriest || mtmp->isgd || mtmp->iswiz) { pline("I think %s would mind.", mon_nam(mtmp)); return 1; } if (!can_saddle(mtmp)) { You_cant("saddle such a creature."); return 1; } /* Calculate your chance */ chance = ACURR(A_DEX) + ACURR(A_CHA)/2 + 2*mtmp->mtame; chance += u.ulevel * (mtmp->mtame ? 20 : 5); if (!mtmp->mtame) chance -= 10*mtmp->m_lev; if (Role_if(PM_KNIGHT)) chance += 20; switch (P_SKILL(P_RIDING)) { case P_ISRESTRICTED: case P_UNSKILLED: default: chance -= 20; break; case P_BASIC: break; case P_SKILLED: chance += 15; break; case P_EXPERT: chance += 30; break; } if (Confusion || Fumbling || Glib) chance -= 20; else if (uarmg && (s = OBJ_DESCR(objects[uarmg->otyp])) != (char *)0 && !strncmp(s, "riding ", 7)) /* Bonus for wearing "riding" (but not fumbling) gloves */ chance += 10; else if (uarmf && (s = OBJ_DESCR(objects[uarmf->otyp])) != (char *)0 && !strncmp(s, "riding ", 7)) /* ... or for "riding boots" */ chance += 10; if (otmp->cursed) chance -= 50; /* Make the attempt */ if (rn2(100) < chance) { You("put the saddle on %s.", mon_nam(mtmp)); if (otmp->owornmask) remove_worn_item(otmp, FALSE); freeinv(otmp); /* mpickobj may free otmp it if merges, but we have already checked for a saddle above, so no merger should happen */ (void) mpickobj(mtmp, otmp); mtmp->misc_worn_check |= W_SADDLE; otmp->owornmask = W_SADDLE; otmp->leashmon = mtmp->m_id; update_mon_intrinsics(mtmp, otmp, TRUE, FALSE); } else pline("%s resists!", Monnam(mtmp)); return 1; } /*** Riding the monster ***/ /* Can we ride this monster? Caller should also check can_saddle() */ boolean can_ride(mtmp) struct monst *mtmp; { return (mtmp->mtame && humanoid(youmonst.data) && !verysmall(youmonst.data) && !bigmonst(youmonst.data) && (!Underwater || is_swimmer(mtmp->data))); } int doride() { boolean forcemount = FALSE; if (u.usteed) dismount_steed(DISMOUNT_BYCHOICE); else if (getdir((char *)0) && isok(u.ux+u.dx, u.uy+u.dy)) { #ifdef WIZARD if (wizard && yn("Force the mount to succeed?") == 'y') forcemount = TRUE; #endif return (mount_steed(m_at(u.ux+u.dx, u.uy+u.dy), forcemount)); } else return 0; return 1; } /* Start riding, with the given monster */ boolean mount_steed(mtmp, force) struct monst *mtmp; /* The animal */ boolean force; /* Quietly force this animal */ { struct obj *otmp; char buf[BUFSZ]; struct permonst *ptr; /* Sanity checks */ if (u.usteed) { You("are already riding %s.", mon_nam(u.usteed)); return (FALSE); } /* Is the player in the right form? */ if (Hallucination && !force) { 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) || slithy(youmonst.data))) { You("won't fit on a saddle."); return (FALSE); } if(!force && (near_capacity() > SLT_ENCUMBER)) { You_cant("do that while carrying so much stuff."); return (FALSE); } /* Can the player reach and see the monster? */ if (!mtmp || (!force && ((Blind && !Blind_telepat) || mtmp->mundetected || mtmp->m_ap_type == M_AP_FURNITURE || mtmp->m_ap_type == M_AP_OBJECT))) { pline("I see nobody there."); return (FALSE); } if (u.uswallow || u.ustuck || u.utrap || Punished || !test_move(u.ux, u.uy, mtmp->mx-u.ux, mtmp->my-u.uy, TEST_MOVE)) { if (Punished || !(u.uswallow || u.ustuck || u.utrap)) You("are unable to swing your %s over.", body_part(LEG)); else You("are stuck here for now."); return (FALSE); } /* Is this a valid monster? */ otmp = which_armor(mtmp, W_SADDLE); if (!otmp) { pline("%s is not saddled.", Monnam(mtmp)); return (FALSE); } ptr = mtmp->data; if (touch_petrifies(ptr) && !Stone_resistance) { char kbuf[BUFSZ]; You("touch %s.", mon_nam(mtmp)); Sprintf(kbuf, "attempting to ride %s", an(mtmp->data->mname)); instapetrify(kbuf); } if (!mtmp->mtame || mtmp->isminion) { pline("I think %s would mind.", mon_nam(mtmp)); return (FALSE); } if (mtmp->mtrapped) { struct trap *t = t_at(mtmp->mx, mtmp->my); You_cant("mount %s while %s's trapped in %s.", mon_nam(mtmp), mhe(mtmp), an(defsyms[trap_to_defsym(t->ttyp)].explanation)); 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)) { You_cant("ride that creature while under water."); return (FALSE); } if (!can_saddle(mtmp) || !can_ride(mtmp)) { You_cant("ride such a creature."); return (0); } /* Is the player impaired? */ if (!force && !is_floater(ptr) && !is_flyer(ptr) && Levitation && !Lev_at_will) { You("cannot reach %s.", mon_nam(mtmp)); return (FALSE); } if (!force && uarm && is_metallic(uarm) && greatest_erosion(uarm)) { Your("%s armor is too stiff to be able to mount %s.", uarm->oeroded ? "rusty" : "corroded", mon_nam(mtmp)); 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)); Sprintf(buf, "slipped while mounting %s", /* "a saddled mumak" or "a saddled pony called Dobbin" */ x_monnam(mtmp, ARTICLE_A, (char *)0, SUPPRESS_IT|SUPPRESS_INVISIBLE|SUPPRESS_HALLUCINATION, TRUE)); losehp(rn1(5,10), buf, NO_KILLER_PREFIX); return (FALSE); } /* Success */ if (!force) { if (Levitation && !is_floater(ptr) && !is_flyer(ptr)) /* Must have Lev_at_will at this point */ pline("%s magically floats up!", Monnam(mtmp)); You("mount %s.", mon_nam(mtmp)); } /* setuwep handles polearms differently when you're mounted */ if (uwep && is_pole(uwep)) unweapon = FALSE; u.usteed = mtmp; remove_monster(mtmp->mx, mtmp->my); teleds(mtmp->mx, mtmp->my, TRUE); return (TRUE); } /* You and your steed have moved */ void exercise_steed() { if (!u.usteed) return; /* It takes many turns of riding to exercise skill */ if (u.urideturns++ >= 100) { u.urideturns = 0; use_skill(P_RIDING, 1); } 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, reason, forceit) coord *spot; /* landing position (we fill it in) */ int reason; int forceit; { int i = 0, x, y, distance, min_distance = -1; boolean found = FALSE; struct trap *t; /* avoid known traps (i == 0) and boulders, but allow them as a backup */ if (reason != DISMOUNT_BYCHOICE || Stunned || Confusion || Fumbling) i = 1; for (; !found && i < 2; ++i) { 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))) { if (i > 0 || (((t = t_at(x, y)) == 0 || !t->tseen) && (!sobj_at(BOULDER, x, y) || throws_rocks(youmonst.data)))) { 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; } /* The player kicks or whips the steed */ 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; } pline("%s gallops!", Monnam(u.usteed)); u.ugallop += rn1(20, 30); return; } /* Stop riding the current steed */ void dismount_steed(reason) int reason; /* Player was thrown off etc. */ { struct monst *mtmp; struct obj *otmp; coord cc; const char *verb = "fall"; boolean repair_leg_damage = TRUE; unsigned save_utrap = u.utrap; boolean have_spot = landing_spot(&cc,reason,0); mtmp = u.usteed; /* make a copy of steed pointer */ /* Sanity check */ if (!mtmp) /* Just return silently */ return; /* Check the reason for dismounting */ otmp = which_armor(mtmp, W_SADDLE); switch (reason) { case DISMOUNT_THROWN: verb = "are thrown"; case DISMOUNT_FELL: You("%s off of %s!", verb, mon_nam(mtmp)); if (!have_spot) have_spot = landing_spot(&cc,reason,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,reason,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; case DISMOUNT_BYCHOICE: default: if (otmp && otmp->cursed) { You("can't. The saddle %s cursed.", otmp->bknown ? "is" : "seems to be"); 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. */ if (repair_leg_damage) HWounded_legs = EWounded_legs = 0; /* Release the steed and saddle */ 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 */ (void) rloc(mtmp, FALSE); 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 */ if (!is_flyer(mdat) && !is_floater(mdat) && !is_clinger(mdat)) { if (is_pool(u.ux, u.uy)) { if (!Underwater) pline("%s falls into the %s!", Monnam(mtmp), surface(u.ux, u.uy)); if (!is_swimmer(mdat) && !amphibious(mdat)) { killed(mtmp); adjalign(-1); } } else if (is_lava(u.ux, u.uy)) { pline("%s is pulled into the lava!", Monnam(mtmp)); if (!likes_lava(mdat)) { killed(mtmp); adjalign(-1); } } } /* Steed dismounting consists of two steps: being moved to another * square, and descending to the floor. We have functions to do * each of these activities, but they're normally called * individually and include an attempt to look at or pick up the * objects on the floor: * teleds() --> spoteffects() --> pickup() * float_down() --> pickup() * We use this kludge to make sure there is only one such attempt. * * Clearly this is not the best way to do it. A full fix would * involve having these functions not call pickup() at all, instead * calling them first and calling pickup() afterwards. But it * would take a lot of work to keep this change from having any * unforseen side effects (for instance, you would no longer be * 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, TRUE); 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 */ rloc_to(mtmp, cc.x, cc.y); /* Player stays put */ /* Otherwise, kill the steed */ } else { killed(mtmp); adjalign(-1); } } /* Return the player to the floor */ if (reason != DISMOUNT_ENGULFED) { in_steed_dismounting = TRUE; (void) float_down(0L, W_SADDLE); in_steed_dismounting = FALSE; flags.botl = 1; (void)encumber_msg(); vision_full_recalc = 1; } else flags.botl = 1; /* polearms behave differently when not mounted */ if (uwep && is_pole(uwep)) unweapon = TRUE; return; } void place_monster(mon, x, y) struct monst *mon; int x, y; { if (mon == u.usteed || /* special case is for convoluted vault guard handling */ (DEADMONSTER(mon) && !(mon->isgd && x == 0 && y == 0))) { impossible("placing %s onto map?", (mon == u.usteed) ? "steed" : "defunct monster"); return; } mon->mx = x, mon->my = y; level.monsters[x][y] = mon; } #endif /* STEED */ /*steed.c*/ slashem-0.0.7E7F3/src/mcastu.c0000664000076400007640000006116410545462317014113 0ustar aliali/* SCCS Id: @(#)mcastu.c 3.4 2003/01/08 */ /* 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 #define MGC_CREATE_POOL 12 #define MGC_CALL_UNDEAD 13 /* 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 extern const char * const flash_types[]; /* from zap.c */ /* 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) || u.uundetected) point_msg = "and curses in your general direction"; else if (Displaced && (mtmp->mux != u.ux || mtmp->muy != u.uy)) point_msg = "and curses at your displaced image"; else point_msg = "at you, then curses"; pline("%s points %s.", Monnam(mtmp), point_msg); } else if ((!(moves % 4) || !rn2(4))) { if (flags.soundok) Norep("You hear a mumbled curse."); } } #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; case 14: case 13: return MGC_AGGRAVATION; case 12: return MGC_CREATE_POOL; case 11: case 10: return MGC_CURSE_ITEMS; case 9: return MGC_CALL_UNDEAD; 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; int spellev, chance, difficulty, splcaster, learning; /* 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) && ml) { int cnt = 40; do { spellnum = rn2(ml); /* Casting level is limited by available energy */ spellev = spellnum / 7 + 1; if (spellev > 10) spellev = 10; if (spellev * 5 > mtmp->m_en) { spellev = mtmp->m_en / 5; spellnum = (spellev - 1) * 7 + 1; } 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; } else { /* Casting level is limited by available energy */ spellev = ml / 7 + 1; if (spellev > 10) spellev = 10; if (spellev * 5 > mtmp->m_en) { spellev = mtmp->m_en / 5; ml = (spellev - 1) * 7 + 1; } } /* monster unable to cast spells? */ if (mtmp->mcan || mtmp->m_en < 5 || mtmp->mspec_used || !ml) { cursetxt(mtmp, is_undirected_spell(mattk->adtyp, spellnum)); return(0); } if (mattk->adtyp == AD_SPEL || mattk->adtyp == AD_CLRC) { /* * Spell use (especially MGC) is more common in Slash'EM. * Still using mspec_used, just so monsters don't go bonkers. */ #if 0 mtmp->mspec_used = 10 - mtmp->m_lev; if (mtmp->mspec_used < 2) mtmp->mspec_used = 2; #endif mtmp->mspec_used = rn2(15) - mtmp->m_lev; if (mattk->adtyp == AD_SPEL) mtmp->mspec_used = mtmp->mspec_used > 0 ? 2 : 0; else 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); mtmp->m_en -= spellev * 5; /* Use up the energy now */ /* We should probably do similar checks to what is done for * the player - armor, etc. * Checks for armour and other intrinsic ability change splcaster * Difficulty and experience affect chance * Assume that monsters only cast spells that they know well */ splcaster = 15 - (mtmp->m_lev / 2); /* Base for a wizard is 5...*/ if (splcaster < 5) splcaster = 5; if (splcaster > 20) splcaster = 20; chance = 11 * (mtmp->m_lev > 25 ? 18 : (12 + (mtmp->m_lev / 5))); chance++ ; /* Minimum chance of 1 */ difficulty = (spellev - 1) * 4 - (mtmp->m_lev - 1); /* law of diminishing returns sets in quickly for * low-level spells. That is, higher levels quickly * result in almost no gain */ learning = 15 * (-difficulty / spellev); chance += learning > 20 ? 20 : learning; /* clamp the chance */ if (chance < 0) chance = 0; if (chance > 120) chance = 120; /* combine */ chance = chance * (20-splcaster) / 15 - splcaster; /* Clamp to percentile */ if (chance > 100) chance = 100; if (chance < 0) chance = 0; #if 0 if(rn2(ml*10) < (mtmp->mconf ? 100 : 20)) { /* fumbled attack */ #else if (mtmp->mconf || rnd(100) > chance) { /* fumbled attack */ #endif 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."); if(Fire_resistance) { shieldeff(u.ux, u.uy); pline("But you resist the effects."); dmg = 0; } if (Slimed) { pline("The slime is burned away!"); Slimed =0; } burn_away_slime(); break; case AD_COLD: pline("You're covered in frost."); if(Cold_resistance) { shieldeff(u.ux, u.uy); pline("But you resist the effects."); dmg = 0; } break; case AD_MAGM: You("are hit by a shower of missiles!"); if(Antimagic) { shieldeff(u.ux, u.uy); pline_The("missiles bounce off!"); dmg = 0; } 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_CREATE_POOL: if (levl[u.ux][u.uy].typ == ROOM || levl[u.ux][u.uy].typ == CORR) { pline("A pool appears beneath you!"); levl[u.ux][u.uy].typ = POOL; del_engr_at(u.ux, u.uy); water_damage(level.objects[u.ux][u.uy], FALSE, TRUE); spoteffects(FALSE); /* possibly drown, notice objects */ } else impossible("bad pool creation?"); 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: { 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_CALL_UNDEAD: { coord mm; mm.x = u.ux; mm.y = u.uy; pline("Undead creatures are called forth from the grave!"); mkundead(&mm, FALSE, NO_MINVENT); } 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; /* WAC add lightning strike effect */ zap_strike_fx(u.ux, u.uy, AD_ELEC - 1); pline("A bolt of lightning strikes down at you from above!"); reflects = ureflects("It bounces off your %s%s.", ""); if (!Blind) { pline("You are blinded by the flash!"); make_blinded(Half_spell_damage ? 10L : 20L, FALSE); } 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; int quan; quan = (mtmp->m_lev < 2) ? 1 : rnd((int)mtmp->m_lev / 2); if (quan < 3) quan = 3; success = pm ? TRUE : FALSE; for (i = 0; i <= quan; 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); } nomovemsg = 0; 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: case MGC_CALL_UNDEAD: 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 || spellnum == MGC_CALL_UNDEAD)) 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 || spellnum == MGC_CALL_UNDEAD || (!mtmp->iswiz && spellnum == MGC_CLONE_WIZ))) return TRUE; /* only lichs can cast call undead */ if (mtmp->data->mlet != S_LICH && spellnum == MGC_CALL_UNDEAD) return TRUE; /* pools can only be created in certain locations and then only * rarely unless you're carrying the amulet. */ if ((levl[u.ux][u.uy].typ != ROOM && levl[u.ux][u.uy].typ != CORR || !u.uhave.amulet && rn2(10)) && spellnum == MGC_CREATE_POOL) 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 */ #ifdef OVL0 /* convert 1..10 to 0..9; add 10 for second group (spell casting) */ #define ad_to_typ(k) (10 + (int)k - 1) int buzzmu(mtmp, mattk) /* monster uses spell (ranged) */ 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)) { nomul(0); if(mattk->adtyp && (mattk->adtyp < 11)) { /* no cf unsigned >0 */ if(canseemon(mtmp)) pline("%s zaps you with a %s!", Monnam(mtmp), flash_types[ad_to_typ(mattk->adtyp)]); buzz(-ad_to_typ(mattk->adtyp), (int)mattk->damn, mtmp->mx, mtmp->my, sgn(tbx), sgn(tby)); } else impossible("Monster spell %d cast", mattk->adtyp-1); } return(1); } #endif /* OVL0 */ /*mcastu.c*/ slashem-0.0.7E7F3/src/mon.c0000644000076400007640000026363510545462317013415 0ustar aliali/* SCCS Id: @(#)mon.c 3.4 2003/12/04 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ /* If you're using precompiled headers, you don't want this either */ #ifdef MICROPORT_BUG #define MKROOM_H #endif #include "hack.h" #include "mfndpos.h" #include "edog.h" #include "artifact.h" #include "display.h" #include "global.h" #include void FDECL(display_monster,(XCHAR_P,XCHAR_P,struct monst *,int,XCHAR_P)); STATIC_DCL boolean FDECL(restrap,(struct monst *)); STATIC_DCL long FDECL(mm_aggression, (struct monst *,struct monst *)); #ifdef OVL2 STATIC_DCL int NDECL(pick_animal); STATIC_DCL int FDECL(select_newcham_form, (struct monst *)); 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) && \ mdat != &mons[PM_VECNA] && rn2(3))) #else #define LEVEL_SPECIFIC_NOCORPSE(mdat) \ (level.flags.graveyard && is_undead(mdat) && \ mdat != &mons[PM_VECNA] && rn2(3)) #endif #if 0 /* part of the original warning code which was replaced in 3.3.1 */ #ifdef OVL1 #define warnDelay 10 long lastwarntime; int lastwarnlev; STATIC_DCL void NDECL(warn_effects); #endif /* OVL1 */ #endif /* 0 */ #ifndef OVLB STATIC_VAR short cham_to_pm[]; #else STATIC_DCL struct obj *FDECL(make_corpse,(struct monst *)); STATIC_DCL void FDECL(m_detach, (struct monst *, struct permonst *)); STATIC_DCL void FDECL(lifesaved_monster, (struct monst *)); static void FDECL(unpoly_monster, (struct monst *)); /* convert the monster index of an undead to its living counterpart */ int undead_to_corpse(mndx) int mndx; { switch (mndx) { case PM_KOBOLD_ZOMBIE: case PM_KOBOLD_MUMMY: mndx = PM_KOBOLD; break; case PM_DWARF_ZOMBIE: case PM_DWARF_MUMMY: mndx = PM_DWARF; break; case PM_GNOME_ZOMBIE: case PM_GNOME_MUMMY: mndx = PM_GNOME; break; case PM_ORC_ZOMBIE: case PM_ORC_MUMMY: mndx = PM_ORC; break; case PM_ELF_ZOMBIE: case PM_ELF_MUMMY: mndx = PM_ELF; break; case PM_VAMPIRE: case PM_VAMPIRE_LORD: case PM_VAMPIRE_MAGE: case PM_HUMAN_ZOMBIE: case PM_HUMAN_MUMMY: mndx = PM_HUMAN; break; case PM_GIANT_ZOMBIE: case PM_GIANT_MUMMY: mndx = PM_GIANT; break; case PM_ETTIN_ZOMBIE: case PM_ETTIN_MUMMY: mndx = PM_ETTIN; break; case PM_TROLL_MUMMY: mndx = PM_TROLL; break; default: break; } return mndx; } /* Convert the monster index of some monsters (such as quest guardians) * to their generic species type. * * Return associated character class monster, rather than species * if mode is 1. */ int genus(mndx, mode) int mndx, mode; { switch (mndx) { /* Quest guardians */ case PM_STUDENT: mndx = mode ? PM_ARCHEOLOGIST : PM_HUMAN; break; case PM_CHIEFTAIN: mndx = mode ? PM_BARBARIAN : PM_HUMAN; break; case PM_NEANDERTHAL: mndx = mode ? PM_CAVEMAN : PM_HUMAN; break; case PM_ATTENDANT: mndx = mode ? PM_HEALER : PM_HUMAN; break; case PM_PAGE: mndx = mode ? PM_KNIGHT : PM_HUMAN; break; case PM_ABBOT: mndx = mode ? PM_MONK : PM_HUMAN; break; case PM_ACOLYTE: mndx = mode ? PM_PRIEST : PM_HUMAN; break; case PM_HUNTER: mndx = mode ? PM_RANGER : PM_HUMAN; break; case PM_THUG: mndx = mode ? PM_ROGUE : PM_HUMAN; break; case PM_ROSHI: mndx = mode ? PM_SAMURAI : PM_HUMAN; break; #ifdef TOURIST case PM_GUIDE: mndx = mode ? PM_TOURIST : PM_HUMAN; break; #endif case PM_APPRENTICE: mndx = mode ? PM_WIZARD : PM_HUMAN; break; case PM_WARRIOR: mndx = mode ? PM_VALKYRIE : PM_HUMAN; break; default: if (mndx >= LOW_PM && mndx < NUMMONS) { struct permonst *ptr = &mons[mndx]; if (is_human(ptr)) mndx = PM_HUMAN; else if (is_elf(ptr)) mndx = PM_ELF; else if (is_dwarf(ptr)) mndx = PM_DWARF; else if (is_gnome(ptr)) mndx = PM_GNOME; else if (is_orc(ptr)) mndx = PM_ORC; } break; } return mndx; } /* convert monster index to chameleon index */ int pm_to_cham(mndx) int mndx; { int mcham; switch (mndx) { case PM_CHAMELEON: mcham = CHAM_CHAMELEON; break; case PM_DOPPELGANGER: mcham = CHAM_DOPPELGANGER; break; case PM_SANDESTIN: mcham = CHAM_SANDESTIN; break; default: mcham = CHAM_ORDINARY; break; } return mcham; } /* convert chameleon index to monster index */ STATIC_VAR short cham_to_pm[] = { NON_PM, /* placeholder for CHAM_ORDINARY */ PM_CHAMELEON, PM_DOPPELGANGER, PM_SANDESTIN, }; /* for deciding whether corpse or statue will carry along full monster data */ #define KEEPTRAITS(mon) ((mon)->isshk || (mon)->isgyp || (mon)->mtame ||\ ((mon)->data->geno & G_UNIQ) || \ is_reviver((mon)->data) || \ /* normally leader the will be unique, */ \ /* but he might have been polymorphed */ \ (mon)->m_id == quest_status.leader_m_id || \ /* special cancellation handling for these */ \ (dmgtype((mon)->data, AD_SEDU) || \ dmgtype((mon)->data, AD_SSEX))) /* Creates a monster corpse, a "special" corpse, or nothing if it doesn't * leave corpses. Monsters which leave "special" corpses should have * G_NOCORPSE set in order to prevent wishing for one, finding tins of one, * etc.... */ STATIC_OVL struct obj * make_corpse(mtmp) register struct monst *mtmp; { register struct permonst *mdat = mtmp->data; int num; struct obj *obj = (struct obj *)0; int x = mtmp->mx, y = mtmp->my; int mndx = monsndx(mdat); switch(mndx) { case PM_GRAY_DRAGON: case PM_SILVER_DRAGON: case PM_SHIMMERING_DRAGON: case PM_DEEP_DRAGON: case PM_RED_DRAGON: case PM_ORANGE_DRAGON: case PM_WHITE_DRAGON: case PM_BLACK_DRAGON: case PM_BLUE_DRAGON: case PM_GREEN_DRAGON: case PM_YELLOW_DRAGON: /* 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; } goto default_1; 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_KILLER_TRIPE_RATION: (void) mksobj_at(TRIPE_RATION, x, y, TRUE, FALSE); newsym(x, y); return (struct obj *)0; case PM_KILLER_FOOD_RATION: (void) mksobj_at(FOOD_RATION, x, y, TRUE, FALSE); newsym(x, y); return (struct obj *)0; case PM_VAMPIRE: case PM_VAMPIRE_LORD: case PM_VAMPIRE_MAGE: /* include mtmp in the mkcorpstat() call */ num = undead_to_corpse(mndx); obj = mkcorpstat(CORPSE, mtmp, &mons[num], x, y, TRUE); obj->age -= 100; /* this is an *OLD* corpse */ break; case PM_KOBOLD_MUMMY: case PM_DWARF_MUMMY: case PM_GNOME_MUMMY: case PM_ORC_MUMMY: case PM_ELF_MUMMY: case PM_HUMAN_MUMMY: case PM_GIANT_MUMMY: case PM_ETTIN_MUMMY: case PM_TROLL_MUMMY: case PM_KOBOLD_ZOMBIE: case PM_DWARF_ZOMBIE: case PM_GNOME_ZOMBIE: case PM_ORC_ZOMBIE: case PM_ELF_ZOMBIE: case PM_HUMAN_ZOMBIE: case PM_GIANT_ZOMBIE: case PM_ETTIN_ZOMBIE: num = undead_to_corpse(mndx); obj = mkcorpstat(CORPSE, mtmp, &mons[num], x, y, TRUE); obj->age -= 100; /* this is an *OLD* corpse */ break; case PM_WIGHT: case PM_GHOUL: case PM_GHAST: case PM_FRANKENSTEIN_S_MONSTER: obj = mkcorpstat(CORPSE, (struct monst *)0, &mons[mndx], x, y, TRUE); obj->age -= 100; /* this is an *OLD* corpse */ break; case PM_MEDUSA: { struct monst *mtmp2; /* KMH -- the legend of Medusa and Pegasus */ /* Only when Medusa leaves a corpse */ mtmp2 = makemon(&mons[PM_PEGASUS], x, y, 0); if (mtmp2) { You("%s something spring forth from the corpse of %s.", Blind ? "sense" : "see", mon_nam(mtmp)); mtmp2->mpeaceful = 1; mtmp2->mtame = 0; } goto default_1; } case PM_NIGHTMARE: pline("All that remains is her horn..."); obj = oname(mksobj(UNICORN_HORN, TRUE, FALSE), artiname(ART_NIGHTHORN)); goto initspecial; case PM_BEHOLDER: pline("All that remains is a single eye..."); obj = oname(mksobj(EYEBALL, TRUE, FALSE), artiname(ART_EYE_OF_THE_BEHOLDER)); goto initspecial; case PM_VECNA: pline("All that remains is a hand..."); obj = oname(mksobj(SEVERED_HAND, TRUE, FALSE), artiname(ART_HAND_OF_VECNA)); initspecial: obj->quan = 1; curse(obj); place_object(obj, x, y); stackobj(obj); newsym(x, y); return obj; break; 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_RUBY_GOLEM: /* [DS] Mik's original Lethe fobbed off the player with coloured * glass even for the higher golems. We'll play fair here - if * you can kill one of these guys, you deserve the gems. */ num = d(2,4); while (num--) obj = mksobj_at(RUBY, x, y, TRUE, FALSE); mtmp->mnamelth = 0; break; case PM_DIAMOND_GOLEM: num = d(2,4); while (num--) obj = mksobj_at(DIAMOND, x, y, TRUE, FALSE); mtmp->mnamelth = 0; break; case PM_SAPPHIRE_GOLEM: num = d(2,4); while (num--) obj = mksobj_at(SAPPHIRE, x, y, TRUE, FALSE); mtmp->mnamelth = 0; break; case PM_STEEL_GOLEM: num = d(2,6); /* [DS] Add steel chains (or handcuffs!) for steel golems? */ while (num--) obj = mksobj_at(IRON_CHAIN, x, y, TRUE, FALSE); mtmp->mnamelth = 0; break; case PM_CRYSTAL_GOLEM: /* [DS] Generate gemstones of various hues */ num = d(2,4); { int gemspan = LAST_GEM - bases[GEM_CLASS] + 1; while (num--) obj = mksobj_at(bases[GEM_CLASS] + rn2(gemspan), 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; break; case PM_STONE_GOLEM: obj = mkcorpstat(STATUE, (struct monst *)0, mdat, x, y, FALSE); break; 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_WAX_GOLEM: num = d(2,4); while (num--) obj = mksobj_at(WAX_CANDLE, x, y, TRUE, FALSE); mtmp->mnamelth = 0; break; case PM_PLASTIC_GOLEM: /* KMH -- Credit cards are #ifdef TOURIST */ num = d(2,2); while (num--) obj = mksobj_at( #ifdef TOURIST CREDIT_CARD, #else FAKE_AMULET_OF_YENDOR, #endif x, y, TRUE, FALSE); mtmp->mnamelth = 0; break; case PM_GOLD_GOLEM: /* Good luck gives more coins */ obj = mkgold((long)(200 - rnl(101)), x, y); 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: default: if (mvitals[mndx].mvflags & G_NOCORPSE) return (struct obj *)0; else /* preserve the unique traits of some creatures */ obj = mkcorpstat(CORPSE, KEEPTRAITS(mtmp) ? mtmp : 0, mdat, x, y, TRUE); break; } /* 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)); /* Avoid "It was hidden under a green mold corpse!" * during Blind combat. An unseen monster referred to as "it" * could be killed and leave a corpse. If a hider then hid * underneath it, you could be told the corpse type of a * monster that you never knew was there without this. * The code in hitmu() substitutes the word "something" * if the corpses obj->dknown is 0. */ if (Blind && !sensemon(mtmp)) obj->dknown = 0; #ifdef INVISIBLE_OBJECTS /* Invisible monster ==> invisible corpse */ obj->oinvis = mtmp->perminvis; #endif stackobj(obj); newsym(x, y); return obj; } #endif /* OVLB */ #ifdef OVL1 #if 0 /* part of the original warning code which was replaced in 3.3.1 */ STATIC_OVL void warn_effects() { register struct monst *mtmp; int num_mon; int warned_of; num_mon = 0; for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) { if (!canseemon(mtmp) && !(mtmp->mpeaceful) && !(mtmp->mtame)) { if (Warning && (!spec_ability(uwep,SPFX_WARN) || !spec_dbon(uwep,mtmp,1))) num_mon++; else if (Undead_warning && is_undead(mtmp->data)) num_mon++; else if (spec_ability(uwep,SPFX_WARN) && spec_dbon(uwep,mtmp,1)) num_mon++; } } if (num_mon == 0) return; /* num_mon is the # of monsters which could be warned against... pick one at random... */ warned_of = rn2(num_mon)+1; mtmp = fmon; num_mon = warned_of; do { if (!canseemon(mtmp) && !(mtmp->mpeaceful) && !(mtmp->mtame)) { if (Warning && (!spec_ability(uwep,SPFX_WARN) || !spec_dbon(uwep,mtmp,1))) num_mon--; else if (Undead_warning && is_undead(mtmp->data)) num_mon--; else if (spec_ability(uwep,SPFX_WARN) && spec_dbon(uwep,mtmp,1)) num_mon--; } if (num_mon > 0) mtmp = mtmp->nmon; } while (num_mon > 0); display_monster(mtmp->mx,mtmp->my,mtmp,1,0); lastwarnlev = warnlevel; lastwarntime = moves; /* warnlevel = 0;*/ return; } #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); #endif /* Gremlin multiplying won't go on forever since the hit points * keep going down, and when it gets to 1 hit point the clone * function will fail. */ if (mtmp->data == &mons[PM_GREMLIN] && (inpool || infountain) && rn2(3)) { if (split_mon(mtmp, (struct monst *)0)) dryup(mtmp->mx, mtmp->my, FALSE); if (inpool) water_damage(mtmp->minvent, FALSE, FALSE); return (0); } else if (mtmp->data == &mons[PM_IRON_GOLEM] && inpool && !rn2(5)) { int dam = d(2,6); if (cansee(mtmp->mx,mtmp->my)) pline("%s rusts.", Monnam(mtmp)); mtmp->mhp -= dam; if (mtmp->mhpmax > dam) mtmp->mhpmax -= dam; if (mtmp->mhp < 1) { mondead(mtmp); if (mtmp->mhp < 1) return (1); } water_damage(mtmp->minvent, FALSE, FALSE); 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 %s.", Monnam(mtmp), mtmp->data == &mons[PM_WATER_ELEMENTAL] ? "boils away" : "burns to a crisp"); 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); (void) rloc(mtmp, FALSE); 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... */ if (!is_clinger(mtmp->data) && !is_swimmer(mtmp->data) && !amphibious(mtmp->data)) { if (cansee(mtmp->mx,mtmp->my)) { pline("%s drowns.", Monnam(mtmp)); } if (u.ustuck && u.uswallow && u.ustuck == mtmp) { /* This can happen after a purple worm plucks you off a flying steed while you are over water. */ pline("%s sinks as water rushes in and flushes you out.", Monnam(mtmp)); } mondead(mtmp); if (mtmp->mhp > 0) { (void) rloc(mtmp, FALSE); water_damage(mtmp->minvent, FALSE, FALSE); return 0; } return (1); } } else { /* 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); } int mcalcmove(mon) struct monst *mon; { int mmove = mon->data->mmove; /* Note: MSLOW's `+ 1' prevents slowed speed 1 getting reduced to 0; * MFAST's `+ 2' prevents hasted speed 1 from becoming a no-op; * both adjustments have negligible effect on higher speeds. */ if (mon->mspeed == MSLOW) mmove = (2 * mmove + 1) / 3; else if (mon->mspeed == MFAST) mmove = (4 * mmove + 2) / 3; #ifdef STEED if (mon == u.usteed) { if (u.ugallop && flags.mv) { /* average movement is 1.50 times normal */ mmove = ((rn2(2) ? 4 : 5) * mmove) / 3; } } #endif return mmove; } /* actions that happen once per ``turn'', regardless of each individual monster's metabolism; some of these might need to be reclassified to occur more in proportion with movement rate */ void mcalcdistress() { struct monst *mtmp; for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) { if (DEADMONSTER(mtmp)) continue; /* must check non-moving monsters once/turn in case * they managed to end up in liquid */ if (mtmp->data->mmove == 0) { if (vision_full_recalc) vision_recalc(0); if (minliquid(mtmp)) continue; } /* regenerate hit points */ mon_regen(mtmp, FALSE); /* possibly polymorph shapechangers and lycanthropes */ if (mtmp->cham && !rn2(6)) (void) mon_spec_poly(mtmp, (struct permonst *)0, 0L, FALSE, cansee(mtmp->mx,mtmp->my) && flags.verbose, FALSE, FALSE); were_change(mtmp); /* gradually time out temporary problems */ if (mtmp->mblinded && !--mtmp->mblinded) mtmp->mcansee = 1; if (mtmp->mfrozen && !--mtmp->mfrozen) mtmp->mcanmove = 1; if (mtmp->mfleetim && !--mtmp->mfleetim) mtmp->mflee = 0; /* FIXME: mtmp->mlstmv ought to be updated here */ } } int movemon() { register struct monst *mtmp, *nmtmp; register boolean somebody_can_move = FALSE; #if 0 /* part of the original warning code which was replaced in 3.3.1 */ warnlevel = 0; #endif /* Some of you may remember the former assertion here that because of deaths and other actions, a simple one-pass algorithm wasn't possible for movemon. Deaths are no longer removed to the separate list fdmon; they are simply left in the chain with hit points <= 0, to be cleaned up at the end of the pass. The only other actions which cause monsters to be removed from the chain are level migrations and losedogs(). I believe losedogs() is a cleanup routine not associated with monster movements, and monsters can only affect level migrations on themselves, not others (hence the fetching of nmon before moving the monster). Currently, monsters can jump into traps, read cursed scrolls of teleportation, and drink cursed potions of raise level to change levels. These are all reflexive at this point. Should one monster be able to level teleport another, this scheme would have problems. */ for(mtmp = fmon; mtmp; mtmp = nmtmp) { nmtmp = mtmp->nmon; /* Find a monster that we have not treated yet. */ if(DEADMONSTER(mtmp)) continue; if(mtmp->movement < NORMAL_SPEED) continue; mtmp->movement -= NORMAL_SPEED; 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] */ if(restrap(mtmp)) continue; if(mtmp->m_ap_type == M_AP_FURNITURE || mtmp->m_ap_type == M_AP_OBJECT) continue; if(mtmp->mundetected) continue; } /* continue if the monster died fighting */ if (Conflict && !mtmp->iswiz && mtmp->mcansee) { /* Note: * Conflict does not take effect in the first round. * Therefore, A monster when stepping into the area will * get to swing at you. * * The call to fightm() must be _last_. The monster might * have died if it returns 1. */ if (couldsee(mtmp->mx,mtmp->my) && (distu(mtmp->mx,mtmp->my) <= BOLT_LIM*BOLT_LIM) && fightm(mtmp)) continue; /* mon might have died */ } if(dochugw(mtmp)) /* otherwise just move the monster */ continue; } #if 0 /* part of the original warning code which was replaced in 3.3.1 */ if(warnlevel > 0) warn_effects(); #endif if (any_light_source()) vision_full_recalc = 1; /* in case a mon moved with a light source */ dmonsfree(); /* remove all dead monsters */ /* a monster may have levteleported player -dlc */ if (u.utotype) { deferred_goto(); /* changed levels, so these monsters are dormant */ somebody_can_move = FALSE; } return somebody_can_move; } #endif /* OVL1 */ #ifdef OVLB #define mstoning(obj) (ofood(obj) && \ (touch_petrifies(&mons[(obj)->corpsenm]) || \ (obj)->corpsenm == PM_MEDUSA)) /* * Maybe eat a metallic object (not just gold). * Return value: 0 => nothing happened, 1 => monster ate something, * 2 => monster died (it must have grown into a genocided form, but * that can't happen at present because nothing which eats objects * has young and old forms). */ int meatmetal(mtmp) register struct monst *mtmp; { register struct obj *otmp; struct permonst *ptr; int poly, grow, heal, mstone; /* If a pet, eating is handled separately, in dog.c */ if (mtmp->mtame) return 0; /* 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) { if (cansee(mtmp->mx,mtmp->my) && flags.verbose) { pline("%s eats %s!", Monnam(mtmp), distant_name(otmp,doname)); } /* The object's rustproofing is gone now */ otmp->oerodeproof = 0; mtmp->mstun = 1; if (canseemon(mtmp) && flags.verbose) { pline("%s spits %s out in disgust!", Monnam(mtmp), distant_name(otmp,doname)); } /* KMH -- Don't eat indigestible/choking objects */ } else if (otmp->otyp != AMULET_OF_STRANGULATION && otmp->otyp != RIN_SLOW_DIGESTION) { if (cansee(mtmp->mx,mtmp->my) && flags.verbose) pline("%s eats %s!", Monnam(mtmp), distant_name(otmp,doname)); else if (flags.soundok && flags.verbose) You_hear("a crunching sound."); mtmp->meating = otmp->owt/2 + 1; /* Heal up to the object's weight in hp */ if (mtmp->mhp < mtmp->mhpmax) { mtmp->mhp += objects[otmp->otyp].oc_weight; if (mtmp->mhp > mtmp->mhpmax) mtmp->mhp = mtmp->mhpmax; } if(otmp == uball) { unpunish(); delobj(otmp); } else if (otmp == uchain) { unpunish(); /* frees uchain */ } else { poly = polyfodder(otmp); grow = mlevelgain(otmp); heal = mhealup(otmp); mstone = mstoning(otmp); delobj(otmp); ptr = mtmp->data; if (poly) { if (mon_spec_poly(mtmp, (struct permonst *)0, 0L, FALSE, cansee(mtmp->mx,mtmp->my) && flags.verbose, FALSE, FALSE)) ptr = mtmp->data; } else if (grow) { ptr = grow_up(mtmp, (struct monst *)0); } else if (mstone) { if (poly_when_stoned(ptr)) { mon_to_stone(mtmp); ptr = mtmp->data; } else if (!resists_ston(mtmp)) { if (canseemon(mtmp)) pline("%s turns to stone!", Monnam(mtmp)); monstone(mtmp); ptr = (struct permonst *)0; } } else if (heal) { mtmp->mhp = mtmp->mhpmax; } 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; } void meatcorpse(mtmp) register struct monst *mtmp; { register struct obj *otmp; /* If a pet, eating is handled separately, in dog.c */ if (mtmp->mtame) return; /* Eats topmost corpse if it is there */ for (otmp = level.objects[mtmp->mx][mtmp->my]; otmp; otmp = otmp->nexthere) if (otmp->otyp == CORPSE && otmp->age+50 <= monstermoves) { if (cansee(mtmp->mx,mtmp->my) && flags.verbose) pline("%s eats %s!", Monnam(mtmp), distant_name(otmp,doname)); else if (flags.soundok && flags.verbose) You("hear an awful gobbling noise!"); mtmp->meating = 2; delobj(otmp); break; /* only eat one at a time... */ } newsym(mtmp->mx, mtmp->my); } int meatobj(mtmp) /* for gelatinous cubes */ register struct monst *mtmp; { register struct obj *otmp, *otmp2; struct permonst *ptr; int poly, grow, heal, count = 0, ecount = 0; char buf[BUFSZ]; buf[0] = '\0'; /* If a pet, eating is handled separately, in dog.c */ if (mtmp->mtame) return 0; /* Eats organic objects, including cloth and wood, if there */ /* Engulfs others, except huge rocks and metal attached to player */ for (otmp = level.objects[mtmp->mx][mtmp->my]; otmp; otmp = otmp2) { otmp2 = otmp->nexthere; if (is_organic(otmp) && !obj_resists(otmp, 5, 95) && touch_artifact(otmp,mtmp)) { if (otmp->otyp == CORPSE && touch_petrifies(&mons[otmp->corpsenm]) && !resists_ston(mtmp)) continue; if (otmp->otyp == AMULET_OF_STRANGULATION || otmp->otyp == RIN_SLOW_DIGESTION) continue; ++count; if (cansee(mtmp->mx,mtmp->my) && flags.verbose) pline("%s eats %s!", Monnam(mtmp), distant_name(otmp, doname)); else if (flags.soundok && flags.verbose) You_hear("a slurping sound."); /* Heal up to the object's weight in hp */ if (mtmp->mhp < mtmp->mhpmax) { mtmp->mhp += objects[otmp->otyp].oc_weight; if (mtmp->mhp > mtmp->mhpmax) mtmp->mhp = mtmp->mhpmax; } if (otmp->otyp == MEDICAL_KIT) delete_contents(otmp); if (Has_contents(otmp)) { register struct obj *otmp3; /* contents of eaten containers become engulfed; this is arbitrary, but otherwise g.cubes are too powerful */ while ((otmp3 = otmp->cobj) != 0) { obj_extract_self(otmp3); if (otmp->otyp == ICE_BOX && otmp3->otyp == CORPSE) { otmp3->age = monstermoves - otmp3->age; start_corpse_timeout(otmp3); } (void) mpickobj(mtmp, otmp3); } } poly = polyfodder(otmp); grow = mlevelgain(otmp); heal = mhealup(otmp); delobj(otmp); /* munch */ ptr = mtmp->data; if (poly) { if (mon_spec_poly(mtmp, (struct permonst *)0, 0L, FALSE, cansee(mtmp->mx,mtmp->my) && flags.verbose, FALSE, FALSE)) ptr = mtmp->data; } else if (grow) { ptr = grow_up(mtmp, (struct monst *)0); } else if (heal) { mtmp->mhp = mtmp->mhpmax; } /* in case it polymorphed or died */ if (ptr != &mons[PM_GELATINOUS_CUBE]) return !ptr ? 2 : 1; } else if (otmp->oclass != ROCK_CLASS && otmp != uball && otmp != uchain) { ++ecount; if (ecount == 1) { Sprintf(buf, "%s engulfs %s.", Monnam(mtmp), distant_name(otmp,doname)); } else if (ecount == 2) Sprintf(buf, "%s engulfs several objects.", Monnam(mtmp)); obj_extract_self(otmp); (void) mpickobj(mtmp, otmp); /* slurp */ } /* Engulf & devour is instant, so don't set meating */ if (mtmp->minvis) newsym(mtmp->mx, mtmp->my); } if (ecount > 0) { if (cansee(mtmp->mx, mtmp->my) && flags.verbose && buf[0]) pline("%s", buf); else if (flags.soundok && flags.verbose) You_hear("%s slurping sound%s.", ecount == 1 ? "a" : "several", ecount == 1 ? "" : "s"); } return ((count > 0) || (ecount > 0)) ? 1 : 0; } void mpickgold(mtmp) register struct monst *mtmp; { register struct obj *gold; int mat_idx; if ((gold = g_at(mtmp->mx, mtmp->my)) != 0) { mat_idx = objects[gold->otyp].oc_material; #ifndef GOLDOBJ mtmp->mgold += gold->quan; delobj(gold); #else obj_extract_self(gold); add_to_minv(mtmp, gold); #endif if (cansee(mtmp->mx, mtmp->my) ) { if (flags.verbose && !mtmp->isgd) pline("%s picks up some %s.", Monnam(mtmp), mat_idx == GOLD ? "gold" : "money"); newsym(mtmp->mx, mtmp->my); } } } #endif /* OVLB */ #ifdef OVL2 boolean mpickstuff(mtmp, str) register struct monst *mtmp; register const char *str; { register struct obj *otmp, *otmp2; /* prevent shopkeepers from leaving the door of their shop */ if(mtmp->isshk && inhishop(mtmp)) return FALSE; for(otmp = level.objects[mtmp->mx][mtmp->my]; otmp; otmp = otmp2) { otmp2 = otmp->nexthere; /* 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; #ifdef INVISIBLE_OBJECTS if (otmp->oinvis && !perceives(mtmp->data)) continue; #endif if (cansee(mtmp->mx,mtmp->my) && flags.verbose) pline("%s picks up %s.", Monnam(mtmp), (distu(mtmp->mx, mtmp->my) <= 5) ? doname(otmp) : distant_name(otmp, doname)); obj_extract_self(otmp); /* unblock point after extract, before pickup */ if (otmp->otyp == BOULDER) unblock_point(otmp->ox,otmp->oy); /* vision */ (void) mpickobj(mtmp, otmp); /* may merge and free otmp */ m_dowear(mtmp, FALSE); newsym(mtmp->mx, mtmp->my); return TRUE; /* pick only one object */ } } return FALSE; } #endif /* OVL2 */ #ifdef OVL0 int curr_mon_load(mtmp) register struct monst *mtmp; { register int curload = 0; register struct obj *obj; for(obj = mtmp->minvent; obj; obj = obj->nobj) { if(obj->otyp != BOULDER || !throws_rocks(mtmp->data)) curload += obj->owt; } return curload; } int max_mon_load(mtmp) register struct monst *mtmp; { register long maxload; /* Base monster carrying capacity is equal to human maximum * carrying capacity, or half human maximum if not strong. * (for a polymorphed player, the value used would be the * non-polymorphed carrying capacity instead of max/half max). * This is then modified by the ratio between the monster weights * and human weights. Corpseless monsters are given a capacity * proportional to their size instead of weight. */ if (!mtmp->data->cwt) maxload = (MAX_CARR_CAP * (long)mtmp->data->msize) / MZ_HUMAN; else if (!strongmonst(mtmp->data) || (strongmonst(mtmp->data) && (mtmp->data->cwt > WT_HUMAN))) maxload = (MAX_CARR_CAP * (long)mtmp->data->cwt) / WT_HUMAN; else maxload = MAX_CARR_CAP; /*strong monsters w/cwt <= WT_HUMAN*/ if (!strongmonst(mtmp->data)) maxload /= 2; if (maxload < 1) maxload = 1; return (int) maxload; } /* for restricting monsters' object-pickup */ boolean can_carry(mtmp,otmp) struct monst *mtmp; struct obj *otmp; { int otyp = otmp->otyp, newload = otmp->owt; struct permonst *mdat = mtmp->data; if (notake(mdat)) return FALSE; /* can't carry anything */ 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; #ifdef STEED /* Steeds don't pick up stuff (to avoid shop abuse) */ if (mtmp == u.usteed) return (FALSE); #endif if (mtmp->isshk) return(TRUE); /* no limit */ if (mtmp->mpeaceful && !mtmp->mtame) return(FALSE); /* otherwise players might find themselves obligated to violate * their alignment if the monster takes something they need */ /* special--boulder throwers carry unlimited amounts of boulders */ if (throws_rocks(mdat) && otyp == BOULDER) return(TRUE); /* nymphs deal in stolen merchandise, but not boulders or statues */ if (mdat->mlet == S_NYMPH) return (boolean)(otmp->oclass != ROCK_CLASS); if (curr_mon_load(mtmp) + newload > max_mon_load(mtmp)) return FALSE; /* if the monster hates silver, don't pick it up */ if (objects[otmp->otyp].oc_material == SILVER && hates_silver(mtmp->data)) return(FALSE); if(curr_mon_load(mtmp) + newload > max_mon_load(mtmp)) return(FALSE); return(TRUE); } /* return number of acceptable neighbour positions */ int mfndpos(mon, poss, info, flag) register struct monst *mon; coord *poss; /* coord poss[9] */ long *info; /* long info[9] */ long flag; { struct permonst *mdat = mon->data; register xchar x,y,nx,ny; register int cnt = 0; register uchar ntyp; uchar nowtyp; boolean wantpool,poolok,lavaok,nodiag; boolean rockok = FALSE, treeok = FALSE, thrudoor; int maxx, maxy; x = mon->mx; y = mon->my; nowtyp = levl[x][y].typ; nodiag = (mdat == &mons[PM_GRID_BUG]); wantpool = mdat->mlet == S_EEL; poolok = is_flyer(mdat) || is_clinger(mdat) || (is_swimmer(mdat) && !wantpool); lavaok = is_flyer(mdat) || is_clinger(mdat) || likes_lava(mdat); thrudoor = ((flag & (ALLOW_WALL|BUSTDOOR)) != 0L); if (flag & ALLOW_DIG) { struct obj *mw_tmp; /* need to be specific about what can currently be dug */ if (!needspick(mdat)) { rockok = treeok = TRUE; } else if ((mw_tmp = MON_WEP(mon)) && mw_tmp->cursed && mon->weapon_check == NO_WEAPON_WANTED) { rockok = is_pick(mw_tmp); treeok = is_axe(mw_tmp); } else { rockok = (m_carrying(mon, PICK_AXE) || (m_carrying(mon, DWARVISH_MATTOCK) && !which_armor(mon, W_ARMS))); treeok = (m_carrying(mon, AXE) || (m_carrying(mon, BATTLE_AXE) && !which_armor(mon, W_ARMS))); } thrudoor |= rockok || treeok; } nexttry: /* eels prefer the water, but if there is no water nearby, they will crawl over land */ if(mon->mconf) { flag |= ALLOW_ALL; flag &= ~NOTONL; } if(!mon->mcansee) flag |= ALLOW_SSM; maxx = min(x+1,COLNO-1); maxy = min(y+1,ROWNO-1); for(nx = max(1,x-1); nx <= maxx; nx++) for(ny = max(0,y-1); ny <= maxy; ny++) { if(nx == x && ny == y) continue; if(IS_ROCK(ntyp = levl[nx][ny].typ) && !((flag & ALLOW_WALL) && may_passwall(nx,ny)) && !((IS_TREE(ntyp) ? treeok : rockok) && may_dig(nx,ny))) continue; /* KMH -- Added iron bars */ if (ntyp == IRONBARS && !(flag & ALLOW_BARS)) continue; /* ALI -- Artifact doors (no passage unless open/openable) */ if (IS_DOOR(ntyp)) if (artifact_door(nx, ny) ? levl[nx][ny].doormask & D_CLOSED && !(flag & OPENDOOR) || levl[nx][ny].doormask & D_LOCKED : !amorphous(mdat) && ((levl[nx][ny].doormask & D_CLOSED && !(flag & OPENDOOR)) || (levl[nx][ny].doormask & D_LOCKED && !(flag & UNLOCKDOOR))) && !thrudoor) continue; if(nx != x && ny != y && (nodiag || #ifdef REINCARNATION ((IS_DOOR(nowtyp) && ((levl[x][y].doormask & ~D_BROKEN) || Is_rogue_level(&u.uz))) || (IS_DOOR(ntyp) && ((levl[nx][ny].doormask & ~D_BROKEN) || Is_rogue_level(&u.uz)))) #else ((IS_DOOR(nowtyp) && (levl[x][y].doormask & ~D_BROKEN)) || (IS_DOOR(ntyp) && (levl[nx][ny].doormask & ~D_BROKEN))) #endif )) continue; if((is_pool(nx,ny) == wantpool || poolok) && (lavaok || !is_lava(nx,ny))) { int dispx, dispy; boolean monseeu = (mon->mcansee && (!Invis || perceives(mdat))); boolean checkobj = OBJ_AT(nx,ny); /* Displacement also displaces the Elbereth/scare monster, * as long as you are visible. */ if(Displaced && monseeu && (mon->mux==nx) && (mon->muy==ny)) { dispx = u.ux; dispy = u.uy; } else { dispx = nx; dispy = ny; } info[cnt] = 0; if ((checkobj || Displaced) && onscary(dispx, dispy, mon)) { if(!(flag & ALLOW_SSM)) continue; info[cnt] |= ALLOW_SSM; } if((nx == u.ux && ny == u.uy) || (nx == mon->mux && ny == mon->muy)) { if (nx == u.ux && ny == u.uy) { /* If it's right next to you, it found you, * displaced or no. We must set mux and muy * right now, so when we return we can tell * that the ALLOW_U means to attack _you_ and * not the image. */ mon->mux = u.ux; mon->muy = u.uy; } if(!(flag & ALLOW_U)) continue; info[cnt] |= ALLOW_U; } else { if(MON_AT(nx, ny)) { struct monst *mtmp2 = m_at(nx, ny); long mmflag = flag | mm_aggression(mon, mtmp2); if (!(mmflag & ALLOW_M)) continue; info[cnt] |= ALLOW_M; if (mtmp2->mtame) { if (!(mmflag & ALLOW_TM)) continue; info[cnt] |= ALLOW_TM; } } /* Note: ALLOW_SANCT only prevents movement, not */ /* attack, into a temple. */ if(level.flags.has_temple && *in_rooms(nx, ny, TEMPLE) && !*in_rooms(x, y, TEMPLE) && in_your_sanctuary((struct monst *)0, nx, ny)) { if(!(flag & ALLOW_SANCT)) continue; info[cnt] |= ALLOW_SANCT; } } if(checkobj && sobj_at(CLOVE_OF_GARLIC, nx, ny)) { if(flag & NOGARLIC) continue; info[cnt] |= NOGARLIC; } if(checkobj && sobj_at(BOULDER, nx, ny)) { if(!(flag & ALLOW_ROCK)) continue; info[cnt] |= ALLOW_ROCK; } if (monseeu && onlineu(nx,ny)) { if(flag & NOTONL) continue; info[cnt] |= NOTONL; } if (nx != x && ny != y && bad_rock(mon, x, ny) && bad_rock(mon, nx, y) && (bigmonst(mdat) || (curr_mon_load(mon) > 600))) continue; /* The monster avoids a particular type of trap if it's familiar * with the trap type. Pets get ALLOW_TRAPS and checking is * done in dogmove.c. In either case, "harmless" traps are * neither avoided nor marked in info[]. */ { register struct trap *ttmp = t_at(nx, ny); if(ttmp) { if(ttmp->ttyp >= TRAPNUM || ttmp->ttyp == 0) { impossible("A monster looked at a very strange trap of type %d.", ttmp->ttyp); continue; } if ((ttmp->ttyp != RUST_TRAP || mdat == &mons[PM_FLAMING_SPHERE] || mdat == &mons[PM_IRON_GOLEM]) && ttmp->ttyp != STATUE_TRAP && ((ttmp->ttyp != PIT && ttmp->ttyp != SPIKED_PIT && ttmp->ttyp != TRAPDOOR && ttmp->ttyp != HOLE) || (!is_flyer(mdat) && !is_floater(mdat) && !is_clinger(mdat)) || In_sokoban(&u.uz)) && (ttmp->ttyp != SLP_GAS_TRAP || !resists_sleep(mon)) && (ttmp->ttyp != BEAR_TRAP || (mdat->msize > MZ_SMALL && !amorphous(mdat) && !is_flyer(mdat))) && (ttmp->ttyp != FIRE_TRAP || !resists_fire(mon)) && (ttmp->ttyp != SQKY_BOARD || !is_flyer(mdat)) && (ttmp->ttyp != WEB || (!amorphous(mdat) && !webmaker(mdat))) ) { if (!(flag & ALLOW_TRAPS)) { if (mon->mtrapseen & (1L << (ttmp->ttyp - 1))) continue; } info[cnt] |= ALLOW_TRAPS; } } } poss[cnt].x = nx; poss[cnt].y = ny; cnt++; } } if(!cnt && wantpool && !is_pool(x,y)) { wantpool = FALSE; goto nexttry; } return(cnt); } #endif /* OVL0 */ #ifdef OVL1 /* Monster against monster special attacks; for the specified monster combinations, this allows one monster to attack another adjacent one in the absence of Conflict. There is no provision for targetting other monsters; just hand to hand fighting when they happen to be next to each other. */ STATIC_OVL long mm_aggression(magr, mdef) struct monst *magr, /* monster that is currently deciding where to move */ *mdef; /* another monster which is next to it */ { /* supposedly purple worms are attracted to shrieking because they like to eat shriekers, so attack the latter when feasible */ if (magr->data == &mons[PM_PURPLE_WORM] && mdef->data == &mons[PM_SHRIEKER]) return ALLOW_M|ALLOW_TM; /* elves vs. orcs */ if(magr->data->mflags2 & M2_ELF && mdef->data->mflags2 & M2_ORC) return ALLOW_M|ALLOW_TM; /* and vice versa */ if(mdef->data->mflags2 & M2_ELF && magr->data->mflags2 & M2_ORC) return ALLOW_M|ALLOW_TM; /* angels vs. demons */ if(magr->data->mlet==S_ANGEL && mdef->data->mflags2 & M2_DEMON) return ALLOW_M|ALLOW_TM; /* and vice versa */ if(mdef->data->mlet==S_ANGEL && magr->data->mflags2 & M2_DEMON) return ALLOW_M|ALLOW_TM; /* woodchucks vs. The Oracle */ if(magr->data == &mons[PM_WOODCHUCK] && mdef->data == &mons[PM_ORACLE]) return ALLOW_M|ALLOW_TM; return 0L; } boolean monnear(mon, x, y) register struct monst *mon; register int x,y; /* Is the square close enough for the monster to move or attack into? */ { register int distance = dist2(mon->mx, mon->my, x, y); if (distance==2 && mon->data==&mons[PM_GRID_BUG]) return 0; return((boolean)(distance < 3)); } /* really free dead monsters */ void dmonsfree() { struct monst **mtmp; int count = 0; for (mtmp = &fmon; *mtmp;) { if ((*mtmp)->mhp <= 0) { struct monst *freetmp = *mtmp; *mtmp = (*mtmp)->nmon; dealloc_monst(freetmp); count++; } else mtmp = &(*mtmp)->nmon; } if (count != iflags.purge_monsters) impossible("dmonsfree: %d removed doesn't match %d pending", count, iflags.purge_monsters); iflags.purge_monsters = 0; } #endif /* OVL1 */ #ifdef OVLB /* called when monster is moved to larger structure */ void replmon(mtmp, mtmp2) register struct monst *mtmp, *mtmp2; { struct obj *otmp; long unpolytime; /* WAC */ /* transfer the monster's inventory */ for (otmp = mtmp2->minvent; otmp; otmp = otmp->nobj) { #ifdef DEBUG if (otmp->where != OBJ_MINVENT || otmp->ocarry != mtmp) panic("replmon: minvent inconsistency"); #endif otmp->ocarry = mtmp2; } mtmp->minvent = 0; /* remove the old monster from the map and from `fmon' list */ relmon(mtmp); /* finish adding its replacement */ #ifdef STEED if (mtmp == u.usteed) ; else /* don't place steed onto the map */ #endif place_monster(mtmp2, mtmp2->mx, mtmp2->my); if (mtmp2->wormno) /* update level.monsters[wseg->wx][wseg->wy] */ place_wsegs(mtmp2); /* locations to mtmp2 not mtmp. */ if (emits_light(mtmp2->data)) { /* since this is so rare, we don't have any `mon_move_light_source' */ new_light_source(mtmp2->mx, mtmp2->my, emits_light(mtmp2->data), LS_MONSTER, (genericptr_t)mtmp2); /* here we rely on the fact that `mtmp' hasn't actually been deleted */ del_light_source(LS_MONSTER, (genericptr_t)mtmp); } /* If poly'ed, move polytimer along */ if (unpolytime = stop_timer(UNPOLY_MON, (genericptr_t) mtmp)) { (void) start_timer(unpolytime, TIMER_MONSTER, UNPOLY_MON, (genericptr_t) mtmp2); } mtmp2->nmon = fmon; fmon = mtmp2; if (u.ustuck == mtmp) setustuck(mtmp2); #ifdef STEED if (u.usteed == mtmp) u.usteed = mtmp2; #endif if (mtmp2->isshk) replshk(mtmp,mtmp2); /* discard the old monster */ dealloc_monst(mtmp); } /* release mon from display and monster list */ void relmon(mon) register struct monst *mon; { register struct monst *mtmp; if (fmon == (struct monst *)0) panic ("relmon: no fmon available."); remove_monster(mon->mx, mon->my); if(mon == fmon) fmon = fmon->nmon; else { for(mtmp = fmon; mtmp && mtmp->nmon != mon; mtmp = mtmp->nmon) ; if(mtmp) mtmp->nmon = mon->nmon; else panic("relmon: mon not in list."); } } /* remove effects of mtmp from other data structures */ STATIC_OVL void m_detach(mtmp, mptr) struct monst *mtmp; struct permonst *mptr; /* reflects mtmp->data _prior_ to mtmp's death */ { mon_stop_timers(mtmp); 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 */ relobj(mtmp, 0, FALSE); remove_monster(mtmp->mx, mtmp->my); if (emits_light(mptr)) del_light_source(LS_MONSTER, (genericptr_t)mtmp); newsym(mtmp->mx,mtmp->my); unstuck(mtmp); fill_pit(mtmp->mx, mtmp->my); if(mtmp->isshk) shkgone(mtmp); if(mtmp->wormno) wormgone(mtmp); iflags.purge_monsters++; } /* find the worn amulet of life saving which will save a monster */ struct obj * mlifesaver(mon) struct monst *mon; { if (!nonliving(mon->data)) { struct obj *otmp = which_armor(mon, W_AMUL); if (otmp && otmp->otyp == AMULET_OF_LIFE_SAVING) return otmp; } return (struct obj *)0; } STATIC_OVL void lifesaved_monster(mtmp) struct monst *mtmp; { int visible; struct obj *lifesave = mlifesaver(mtmp); if (lifesave) { /* not canseemon; amulets are on the head, so you don't want */ /* to show this for a long worm with only a tail visible. */ /* Nor do you check invisibility, because glowing and disinte- */ /* grating amulets are always visible. */ /* [ALI] Always treat swallower as visible for consistency */ /* with unpoly_monster(). */ visible = u.uswallow && u.ustuck == mtmp || cansee(mtmp->mx, mtmp->my); if (visible) { pline("But wait..."); pline("%s medallion begins to glow!", s_suffix(Monnam(mtmp))); makeknown(AMULET_OF_LIFE_SAVING); if (attacktype(mtmp->data, AT_EXPL) || attacktype(mtmp->data, AT_BOOM)) pline("%s reconstitutes!", Monnam(mtmp)); else pline("%s looks much better!", Monnam(mtmp)); pline_The("medallion crumbles to dust!"); } m_useup(mtmp, lifesave); mtmp->mcanmove = 1; mtmp->mfrozen = 0; if (mtmp->mtame && !mtmp->isminion) { wary_dog(mtmp, FALSE); } if (mtmp->mhpmax <= 0) mtmp->mhpmax = 10; mtmp->mhp = mtmp->mhpmax; if (mvitals[monsndx(mtmp->data)].mvflags & G_GENOD) { if (visible) pline("Unfortunately %s is still genocided...", mon_nam(mtmp)); } else return; } mtmp->mhp = 0; } /* WAC -- undo polymorph */ static void unpoly_monster(mtmp) struct monst *mtmp; { int visible; char buf[BUFSZ]; sprintf(buf, Monnam(mtmp)); /* If there is a timer == monster was poly'ed */ if (stop_timer(UNPOLY_MON, (genericptr_t) mtmp)) { /* [ALI] Always treat swallower as visible so that the message * indicating that the monster hasn't died comes _before_ any * message about breaking out of the "new" monster. */ visible = u.uswallow && u.ustuck == mtmp || cansee(mtmp->mx,mtmp->my); mtmp->mhp = mtmp->mhpmax; if (visible) pline("But wait..."); if (newcham(mtmp, &mons[mtmp->oldmonnm], FALSE, visible)) mtmp->mhp = mtmp->mhpmax/2; else { if (visible) pline("%s shudders!", Monnam(mtmp)); mtmp->mhp = 0; } } } void mondead(mtmp) register struct monst *mtmp; { struct permonst *mptr; int tmp; /* WAC just in case caller forgot to...*/ if (mtmp->mhp) mtmp->mhp = -1; if(mtmp->isgd) { /* if we're going to abort the death, it *must* be before * the m_detach or there will be relmon problems later */ if(!grddead(mtmp)) return; } mptr = mtmp->data; /* WAC First check that monster can unpoly */ unpoly_monster(mtmp); if (mtmp->mhp > 0) return; lifesaved_monster(mtmp); if (mtmp->mhp > 0) return; #ifdef STEED /* Player is thrown from his steed when it dies */ if (mtmp == u.usteed) dismount_steed(DISMOUNT_GENERIC); #endif mptr = mtmp->data; /* save this for m_detach() */ /* restore chameleon, lycanthropes to true form at death */ if (mtmp->cham) set_mon_data(mtmp, &mons[cham_to_pm[mtmp->cham]], -1); else if (mtmp->data == &mons[PM_WEREJACKAL]) set_mon_data(mtmp, &mons[PM_HUMAN_WEREJACKAL], -1); else if (mtmp->data == &mons[PM_WEREWOLF]) set_mon_data(mtmp, &mons[PM_HUMAN_WEREWOLF], -1); else if (mtmp->data == &mons[PM_WERERAT]) set_mon_data(mtmp, &mons[PM_HUMAN_WERERAT], -1); else if (mtmp->data == &mons[PM_WEREPANTHER]) set_mon_data(mtmp, &mons[PM_HUMAN_WEREPANTHER], -1); else if (mtmp->data == &mons[PM_WERETIGER]) set_mon_data(mtmp, &mons[PM_HUMAN_WERETIGER], -1); else if (mtmp->data == &mons[PM_WERESNAKE]) set_mon_data(mtmp, &mons[PM_HUMAN_WERESNAKE], -1); else if (mtmp->data == &mons[PM_WERESPIDER]) set_mon_data(mtmp, &mons[PM_HUMAN_WERESPIDER], -1); /* if MAXMONNO monsters of a given type have died, and it * can be done, extinguish that monster. * * mvitals[].died does double duty as total number of dead monsters * and as experience factor for the player killing more monsters. * this means that a dragon dying by other means reduces the * experience the player gets for killing a dragon directly; this * is probably not too bad, since the player likely finagled the * first dead dragon via ring of conflict or pets, and extinguishing * based on only player kills probably opens more avenues of abuse * for rings of conflict and such. */ /* KMH -- Yes, keep spell monsters in the count */ 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; #endif #ifdef KOPS if (mtmp->data->mlet == S_KOP) { /* Dead Kops may come back. */ switch(rnd(5)) { case 1: /* returns near the stairs */ (void) makemon(mtmp->data,xdnstair,ydnstair,NO_MM_FLAGS); break; case 2: /* randomly */ (void) makemon(mtmp->data,0,0,NO_MM_FLAGS); break; default: break; } } #endif if(mtmp->iswiz) wizdead(); if(mtmp->data->msound == MS_NEMESIS) nemdead(); if(memory_is_invisible(mtmp->mx, mtmp->my)) unmap_object(mtmp->mx, mtmp->my); 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))); /* KMH -- make_corpse() handles Vecna */ return (mdat == &mons[PM_VECNA]); } /* Gas spores always explode upon death */ for(i = 0; i < NATTK; i++) { if (mdat->mattk[i].aatyp == AT_BOOM) { if (mdat->mattk[i].damn) tmp = d((int)mdat->mattk[i].damn, (int)mdat->mattk[i].damd); else if(mdat->mattk[i].damd) tmp = d((int)mdat->mlevel+1, (int)mdat->mattk[i].damd); else tmp = 0; 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)); if (Half_physical_damage) tmp = (tmp+1) / 2; 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); } } /* Cthulhu Deliquesces... */ if (mdat == &mons[PM_CTHULHU]) { if (cansee(mon->mx, mon->my)) pline("%s body deliquesces into a cloud of noxious gas!", s_suffix(Monnam(mon))); else You_hear("hissing and bubbling!"); /* ...into a stinking cloud... */ (void) create_cthulhu_death_cloud(mon->mx, mon->my, 3, 8); return (FALSE); } /* 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] || is_golem(mdat) || is_mplayer(mdat) || is_rider(mdat)) return TRUE; return (boolean) (!rn2((int) (2 + ((int)(mdat->geno & G_FREQ)<2) + verysmall(mdat)))); } /* drop (perhaps) a cadaver and remove monster */ void mondied(mdef) register struct monst *mdef; { mondead(mdef); if (mdef->mhp > 0) return; /* lifesaved */ if (corpse_chance(mdef, (struct monst *)0, FALSE) && (accessible(mdef->mx, mdef->my) || is_pool(mdef->mx, mdef->my))) (void) make_corpse(mdef); } /* monster disappears, not dies */ void mongone(mdef) register struct monst *mdef; { mdef->mhp = 0; /* can skip some inventory bookkeeping */ #ifdef STEED /* Player is thrown from his steed when it disappears */ if (mdef == u.usteed) dismount_steed(DISMOUNT_GENERIC); #endif /* drop special items like the Amulet so that a dismissed Kop or nurse can't remove them from the game */ mdrop_special_objs(mdef); /* release rest of monster's inventory--it is removed from game */ discard_minvent(mdef); #ifndef GOLDOBJ mdef->mgold = 0L; #endif m_detach(mdef, mdef->data); } /* drop a statue or rock and remove monster */ void monstone(mdef) register struct monst *mdef; { struct obj *otmp, *obj, *oldminvent; 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 * making the statue.... */ lifesaved_monster(mdef); if (mdef->mhp > 0) return; mdef->mtrapped = 0; /* (see m_detach) */ if ((int)mdef->data->msize > MZ_TINY || !rn2(2 + ((int) (mdef->data->geno & G_FREQ) > 2))) { oldminvent = 0; /* some objects may end up outside the statue */ while ((obj = mdef->minvent) != 0) { obj_extract_self(obj); if (obj->owornmask) update_mon_intrinsics(mdef, obj, FALSE, TRUE); 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 */ (obj->otyp == STATUE && mons[obj->corpsenm].msize >= mdef->data->msize) || #endif obj_resists(obj, 0, 0)) { if (flooreffects(obj, x, y, "fall")) continue; place_object(obj, x, y); } else { if (obj->lamplit) end_burn(obj, TRUE); obj->nobj = oldminvent; oldminvent = obj; } } /* defer statue creation until after inventory removal so that saved monster traits won't retain any stale item-conferred attributes */ otmp = mkcorpstat(STATUE, KEEPTRAITS(mdef) ? mdef : 0, mdef->data, x, y, FALSE); if (mdef->mnamelth) otmp = oname(otmp, NAME(mdef)); while ((obj = oldminvent) != 0) { oldminvent = obj->nobj; (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(memory_is_invisible(x, y)) 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; (void) stop_timer(UNPOLY_MON, (genericptr_t) mdef); 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 */ void monkilled(mdef, fltxt, how) register struct monst *mdef; const char *fltxt; int how; { boolean be_sad = FALSE; /* true if unseen pet is killed */ if ((mdef->wormno ? worm_known(mdef) : cansee(mdef->mx, mdef->my)) && fltxt) pline("%s is %s%s%s!", Monnam(mdef), nonliving(mdef->data) ? "destroyed" : "killed", *fltxt ? " by the " : "", fltxt ); else be_sad = (mdef->mtame != 0 && !mdef->isspell); /* no corpses if digested or disintegrated */ if(how == AD_DGST || how == -AD_RBRE) mondead(mdef); else mondied(mdef); if (be_sad && mdef->mhp <= 0) You("have a sad feeling for a moment, then it passes."); } /* WAC -- another monster has killed the monster mdef and you get exp. */ void mon_xkilled(mdef, fltxt, how) register struct monst *mdef; const char *fltxt; int how; { boolean be_sad = FALSE; /* true if unseen pet is killed */ if ((mdef->wormno ? worm_known(mdef) : cansee(mdef->mx, mdef->my)) && fltxt) pline("%s is %s%s%s!", Monnam(mdef), nonliving(mdef->data) ? "destroyed" : "killed", *fltxt ? " by the " : "", fltxt); else be_sad = (mdef->mtame != 0 && !mdef->isspell); /* no corpses if digested or disintegrated */ if(how == AD_DGST || how == -AD_RBRE) xkilled(mdef,2); else xkilled(mdef,0); if (be_sad && mdef->mhp <= 0) You("have a sad feeling for a moment, then it passes."); } void unstuck(mtmp) register struct monst *mtmp; { if(u.ustuck == mtmp) { if(u.uswallow){ u.ux = mtmp->mx; u.uy = mtmp->my; u.uswallow = 0; u.uswldtim = 0; if (Punished) placebc(); vision_full_recalc = 1; docrt(); } setustuck(0); } } void killed(mtmp) register struct monst *mtmp; { xkilled(mtmp, 1); } /* the player has killed the monster mtmp */ void xkilled(mtmp, dest) register struct monst *mtmp; /* * Dest=1, normal; dest=0, don't print message; dest=2, don't drop corpse * either; dest=3, message but no corpse */ int dest; { register int tmp, x = mtmp->mx, y = mtmp->my; register struct permonst *mdat; int mndx; register struct obj *otmp; register struct trap *t; boolean redisp = FALSE; boolean wasinside = u.uswallow && (u.ustuck == mtmp); /* KMH, conduct */ 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 * whole routine is rearranged. */ /* your pet knows who just killed it...watch out */ if (mtmp->mtame && !mtmp->isminion) EDOG(mtmp)->killed_by_u = 1; /* dispose of monster and make cadaver */ if(stoned) monstone(mtmp); else mondead(mtmp); if (mtmp->mhp > 0) { /* monster cheated death */ /* Cannot put the non-visible lifesaving message in * lifesaved_monster()/unpoly_monster() since the message * appears only when you kill it (as opposed to visible * lifesaving which always appears). */ stoned = FALSE; if ((!u.uswallow || u.ustuck != mtmp) && !cansee(x, y)) pline("Maybe not..."); return; } mdat = mtmp->data; /* note: mondead can change mtmp->data */ mndx = monsndx(mdat); if (stoned) { stoned = FALSE; 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 if((!accessible(x, y) && !is_pool(x, y)) || (x == u.ux && y == u.uy)) { /* might be mimic in wall or corpse in lava or on player's spot */ redisp = TRUE; if(wasinside) spoteffects(TRUE); } else if(x != u.ux || y != u.uy) { /* might be here after swallowed */ if (!rn2(6) && !(mvitals[mndx].mvflags & G_NOCORPSE) && !(nohands(mdat)) #ifdef KOPS && mdat->mlet != S_KOP #endif ) { int typ; otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE); /* Don't create large objects from small monsters */ typ = otmp->otyp; if (mdat->msize < MZ_HUMAN && typ != FOOD_RATION && typ != LEASH && typ != FIGURINE && (otmp->owt > 3 || objects[typ].oc_big /*oc_bimanual/oc_bulky*/ || is_spear(otmp) || is_pole(otmp) || typ == MORNING_STAR)) { delobj(otmp); } else redisp = TRUE; } /* Whether or not it always makes a corpse is, in theory, * 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); cleanup: /* punish bad behaviour */ if(is_human(mdat) && (!always_hostile(mdat) && mtmp->malign <= 0) && (mndx < PM_ARCHEOLOGIST || mndx > PM_WIZARD) && u.ualign.type != A_CHAOTIC) { HTelepat &= ~INTRINSIC; change_luck(-2); You("murderer!"); if (Blind && !Blind_telepat) see_monsters(); /* Can't sense monsters any more. */ } if((mtmp->mpeaceful && !rn2(2)) || mtmp->mtame) change_luck(-1); if (is_unicorn(mdat) && sgn(u.ualign.type) == sgn(mdat->maligntyp)) { change_luck(-5); You_feel("guilty..."); } /* give experience points */ tmp = experience(mtmp, (int)mvitals[mndx].died + 1); more_experienced(tmp, 0); 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 " : ""); } else if (mdat->msound == MS_NEMESIS) /* Real good! */ adjalign((int)(ALIGNLIM/4)); else if (mdat->msound == MS_GUARDIAN) { /* Bad */ adjalign(-(int)(ALIGNLIM/8)); if (!Hallucination) pline("That was probably a bad idea..."); else pline("Whoopsie-daisy!"); } else if (mtmp->ispriest) { adjalign((p_coaligned(mtmp)) ? -2 : 2); /* cancel divine protection for killing your priest */ if (p_coaligned(mtmp)) u.ublessed = 0; if (mdat->maligntyp == A_NONE) adjalign((int)(ALIGNLIM / 4)); /* BIG bonus */ } else if (mtmp->mtame) { adjalign(-15); /* bad!! */ /* your god is mighty displeased... */ if (!Hallucination) You_hear("the rumble of distant thunder..."); else You_hear("the studio audience applaud!"); } else if (mtmp->mpeaceful) { adjalign(-5); if (!Hallucination) pline("The gods will probably not appreciate this..."); else pline("Whoopsie-daisy!"); } /* malign was already adjusted for u.ualign.type and randomization */ adjalign(mtmp->malign); } /* changes the monster into a stone monster of the same type */ /* this should only be called when poly_when_stoned() is true */ void mon_to_stone(mtmp) register struct monst *mtmp; { boolean polymorphed = mtmp->oldmonnm != monsndx(mtmp->data); if(mtmp->data->mlet == S_GOLEM) { /* 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, FALSE)) { if (!polymorphed) mtmp->oldmonnm = PM_STONE_GOLEM; /* Change is permanent */ if(canseemon(mtmp)) pline("Now it's %s.", an(mtmp->data->mname)); } else { if(canseemon(mtmp)) pline("... and returns to normal."); } } else impossible("Can't polystone %s!", a_monnam(mtmp)); } void mnexto(mtmp) /* Make monster mtmp next to you (if possible) */ struct monst *mtmp; { coord mm; #ifdef STEED if (mtmp == u.usteed) { /* Keep your steed in sync with you instead */ mtmp->mx = u.ux; mtmp->my = u.uy; return; } #endif if(!enexto(&mm, u.ux, u.uy, mtmp->data)) return; rloc_to(mtmp, mm.x, mm.y); return; } /* mnearto() * Put monster near (or at) location if possible. * Returns: * 1 - if a monster was moved from x, y to put mtmp at x, y. * 0 - in most cases. */ boolean mnearto(mtmp,x,y,move_other) register struct monst *mtmp; xchar x, y; boolean move_other; /* make sure mtmp gets to x, y! so move m_at(x, y) */ { struct monst *othermon = (struct monst *)0; xchar newx, newy; coord mm; if ((mtmp->mx == x) && (mtmp->my == y)) return(FALSE); if (move_other && (othermon = m_at(x, y))) { if (othermon->wormno) remove_worm(othermon); else remove_monster(x, y); } newx = x; newy = y; if (!goodpos(newx, newy, mtmp, 0)) { /* actually we have real problems if enexto ever fails. * migrating_mons that need to be placed will cause * no end of trouble. */ if (!enexto(&mm, newx, newy, mtmp->data)) return(FALSE); newx = mm.x; newy = mm.y; } rloc_to(mtmp, newx, newy); if (move_other && othermon) { othermon->mx = othermon->my = 0; (void) mnearto(othermon, x, y, FALSE); if ((othermon->mx != x) || (othermon->my != y)) return(TRUE); } return(FALSE); } static const char *poiseff[] = { " feel weaker", "r brain is on fire", "r judgement is impaired", "r muscles won't obey you", " feel very sick", " break out in hives" }; void poisontell(typ) int typ; { pline("You%s.", poiseff[typ]); } void poisoned(string, typ, pname, fatal) const char *string, *pname; int typ, fatal; { int i, plural, kprefix = KILLED_BY_AN; boolean thrown_weapon = (fatal < 0); if (thrown_weapon) fatal = -fatal; if(strcmp(string, "blast") && !thrown_weapon) { /* 'blast' has already given a 'poison gas' message */ /* so have "poison arrow", "poison dart", etc... */ plural = (string[strlen(string) - 1] == 's')? 1 : 0; /* avoid "The" Orcus's sting was poisoned... */ pline("%s%s %s poisoned!", isupper((int)*string) ? "" : "The ", string, plural ? "were" : "was"); } if(Poison_resistance) { if(!strcmp(string, "blast")) shieldeff(u.ux, u.uy); pline_The("poison doesn't seem to affect you."); return; } /* suppress killer prefix if it already has one */ if ((i = name_to_mon(pname)) >= LOW_PM && mons[i].geno & G_UNIQ) { kprefix = KILLED_BY; if (!type_is_pname(&mons[i])) pname = the(pname); } else if (!strncmpi(pname, "the ", 4) || !strncmpi(pname, "an ", 3) || !strncmpi(pname, "a ", 2)) { /*[ does this need a plural check too? ]*/ kprefix = KILLED_BY; } i = rn2(fatal + 20*thrown_weapon); if(i == 0 && typ != A_CHA) { if (Invulnerable) pline("You are unharmed!"); else { u.uhp = -1; pline_The("poison was deadly..."); } } else if(i <= 5) { /* Check that a stat change was made */ if (adjattrib(typ, thrown_weapon ? -1 : -rn1(3,3), 1)) pline("You%s!", poiseff[typ]); } else { i = thrown_weapon ? rnd(6) : rn1(10,6); if(Half_physical_damage) i = (i+1) / 2; losehp(i, pname, kprefix); } if(u.uhp < 1) { killer_format = kprefix; killer = pname; /* "Poisoned by a poisoned ___" is redundant */ done(strstri(pname, "poison") ? DIED : POISONING); } (void) encumber_msg(); } /* monster responds to player action; not the same as a passive attack */ /* assumes reason for response has been tested, and response _must_ be made */ void m_respond(mtmp) register struct monst *mtmp; { if(mtmp->data->msound == MS_SHRIEK) { if(flags.soundok) { pline("%s shrieks.", Monnam(mtmp)); stop_occupation(); } /* [Tom] took out the weird purple worm thing and lowered prob from 10 */ if (!rn2(8)) { /* if (!rn2(13)) (void) makemon(&mons[PM_PURPLE_WORM], 0, 0, NO_MM_FLAGS); else */ (void) makemon((struct permonst *)0, 0, 0, NO_MM_FLAGS); } aggravate(); } if(mtmp->data == &mons[PM_MEDUSA]) { register int i; for(i = 0; i < NATTK; i++) if(mtmp->data->mattk[i].aatyp == AT_GAZE) { (void) gazemu(mtmp, &mtmp->data->mattk[i]); break; } } } #endif /* OVLB */ #ifdef OVL2 void setmangry(mtmp) register struct monst *mtmp; { mtmp->mstrategy &= ~STRAT_WAITMASK; #ifdef BLACKMARKET /* Even if the black marketeer is already angry he may not have called * for his assistants if he or his staff have not been assaulted yet. */ if (Is_blackmarket(&u.uz) && !mtmp->mpeaceful && mtmp->isshk) blkmar_guards(mtmp); #endif /* BLACKMARKET */ if(!mtmp->mpeaceful) return; if(mtmp->mtame) return; mtmp->mpeaceful = 0; if(mtmp->ispriest) { if(p_coaligned(mtmp)) adjalign(-5); /* very bad */ else adjalign(2); } else { adjalign(-1); /* attacking peaceful monsters is bad */ } if (couldsee(mtmp->mx, mtmp->my)) { if (humanoid(mtmp->data) || mtmp->isshk || mtmp->isgd) pline("%s gets angry!", Monnam(mtmp)); else if (flags.verbose && flags.soundok) growl(mtmp); } #ifdef BLACKMARKET /* Don't misbehave in the Black Market or else... */ if (Is_blackmarket(&u.uz)) { if (mtmp->isshk) blkmar_guards(mtmp); else if (NAME(mtmp) && *NAME(mtmp)) { /* non-tame named monsters are presumably * black marketeer's assistants */ struct monst *shkp; shkp = shop_keeper(inside_shop(mtmp->mx, mtmp->my)); if (shkp) wakeup(shkp); } } #endif /* BLACKMARKET */ /* attacking your own quest leader will anger his or her guardians */ if (!flags.mon_moving && /* should always be the case here */ mtmp->data == &mons[quest_info(MS_LEADER)]) { struct monst *mon; struct permonst *q_guardian = &mons[quest_info(MS_GUARDIAN)]; int got_mad = 0; /* guardians will sense this attack even if they can't see it */ for (mon = fmon; mon; mon = mon->nmon) if (!DEADMONSTER(mon) && mon->data == q_guardian && mon->mpeaceful) { mon->mpeaceful = 0; if (canseemon(mon)) ++got_mad; } if (got_mad && !Hallucination) pline_The("%s appear%s to be angry too...", got_mad == 1 ? q_guardian->mname : makeplural(q_guardian->mname), got_mad == 1 ? "s" : ""); } } void wakeup(mtmp) register struct monst *mtmp; { mtmp->msleeping = 0; mtmp->meating = 0; /* assume there's no salvagable food left */ setmangry(mtmp); if(mtmp->m_ap_type) seemimic(mtmp); else if (flags.forcefight && !flags.mon_moving && mtmp->mundetected) { mtmp->mundetected = 0; newsym(mtmp->mx, mtmp->my); } } /* Wake up nearby monsters. */ void wake_nearby() { register struct monst *mtmp; for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) { if (!DEADMONSTER(mtmp) && distu(mtmp->mx,mtmp->my) < u.ulevel*20) { mtmp->msleeping = 0; if (mtmp->mtame && !mtmp->isminion) EDOG(mtmp)->whistletime = moves; } } } /* Wake up monsters near some particular location. */ void wake_nearto(x, y, distance) register int x, y, distance; { register struct monst *mtmp; for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) { if (!DEADMONSTER(mtmp) && mtmp->msleeping && (distance == 0 || dist2(mtmp->mx, mtmp->my, x, y) < distance)) mtmp->msleeping = 0; } } /* NOTE: we must check for mimicry before calling this routine */ void seemimic(mtmp) register struct monst *mtmp; { unsigned old_app = mtmp->mappearance; uchar old_ap_type = mtmp->m_ap_type; mtmp->m_ap_type = M_AP_NOTHING; mtmp->mappearance = 0; /* * Discovered mimics don't block light. */ if (((old_ap_type == M_AP_FURNITURE && (old_app == S_hcdoor || old_app == S_vcdoor)) || (old_ap_type == M_AP_OBJECT && old_app == BOULDER)) && !does_block(mtmp->mx, mtmp->my, &levl[mtmp->mx][mtmp->my])) unblock_point(mtmp->mx, mtmp->my); newsym(mtmp->mx,mtmp->my); } /* force all chameleons to become normal */ void rescham() { register struct monst *mtmp; int mcham; for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) { if (DEADMONSTER(mtmp)) continue; mcham = (int) mtmp->cham; if (mcham) { mtmp->cham = CHAM_ORDINARY; (void) newcham(mtmp, &mons[cham_to_pm[mcham]], FALSE, canseemon(mtmp)); } if(is_were(mtmp->data) && mtmp->data->mlet != S_HUMAN) new_were(mtmp); if(mtmp->m_ap_type && cansee(mtmp->mx, mtmp->my)) { seemimic(mtmp); /* we pretend that the mimic doesn't */ /* know that it has been unmasked. */ mtmp->msleeping = 1; } } } /* Let the chameleons change again -dgk */ void restartcham() { register struct monst *mtmp; for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) { if (DEADMONSTER(mtmp)) continue; mtmp->cham = pm_to_cham(monsndx(mtmp->data)); if (mtmp->data->mlet == S_MIMIC && mtmp->msleeping && cansee(mtmp->mx, mtmp->my)) { set_mimic_sym(mtmp); newsym(mtmp->mx,mtmp->my); } } } /* called when restoring a monster from a saved level; protection against shape-changing might be different now than it was at the time the level was saved. */ void restore_cham(mon) struct monst *mon; { int mcham; if (Protection_from_shape_changers) { mcham = (int) mon->cham; if (mcham) { mon->cham = CHAM_ORDINARY; (void) newcham(mon, &mons[cham_to_pm[mcham]], FALSE, 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)); } } /* unwatched hiders may hide again; if so, a 1 is returned. */ STATIC_OVL boolean restrap(mtmp) 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) { set_mimic_sym(mtmp); return(TRUE); } else if(levl[mtmp->mx][mtmp->my].typ == ROOM) { mtmp->mundetected = 1; return(TRUE); } return(FALSE); } short *animal_list = 0; /* list of PM values for animal monsters */ int animal_list_count; void mon_animal_list(construct) boolean construct; { if (construct) { short animal_temp[SPECIAL_PM]; int i, n; /* if (animal_list) impossible("animal_list already exists"); */ for (n = 0, i = LOW_PM; i < SPECIAL_PM; i++) if (is_animal(&mons[i])) animal_temp[n++] = i; /* if (n == 0) animal_temp[n++] = NON_PM; */ animal_list = (short *)alloc(n * sizeof *animal_list); (void) memcpy((genericptr_t)animal_list, (genericptr_t)animal_temp, n * sizeof *animal_list); animal_list_count = n; } else { /* release */ if (animal_list) free((genericptr_t)animal_list), animal_list = 0; animal_list_count = 0; } } STATIC_OVL int pick_animal() { if (!animal_list) mon_animal_list(TRUE); return animal_list[rn2(animal_list_count)]; } STATIC_OVL int select_newcham_form(mon) struct monst *mon; { int mndx = NON_PM; switch (mon->cham) { case CHAM_SANDESTIN: if (rn2(7)) mndx = pick_nasty(); break; case CHAM_DOPPELGANGER: if (!rn2(7)) mndx = pick_nasty(); else if (rn2(3)) mndx = rn1(PM_WIZARD - PM_ARCHEOLOGIST + 1, PM_ARCHEOLOGIST); break; case CHAM_CHAMELEON: 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 */ /* [ALI] Special case: Don't print a message if hero can neither spot the * original _or_ the new monster (avoids "It turns into it!"). */ int newcham(mtmp, mdat, polyspot, msg) struct monst *mtmp; struct permonst *mdat; boolean polyspot; /* change is the result of wand or spell of polymorph */ boolean msg; { int mhp, hpn, hpd; int mndx, tryct; int couldsee = canseemon(mtmp); struct permonst *olddata = mtmp->data; char oldname[BUFSZ]; boolean alt_mesg = FALSE; /* Avoid " turns into a " */ if (msg) { /* like Monnam() but never mention saddle */ Strcpy(oldname, x_monnam(mtmp, ARTICLE_THE, (char *)0, SUPPRESS_SADDLE, FALSE)); oldname[0] = highc(oldname[0]); } /* mdat = 0 -> caller wants a random monster shape */ tryct = 0; if(mdat == 0) { while (++tryct <= 100) { mndx = select_newcham_form(mtmp); mdat = &mons[mndx]; if ((mvitals[mndx].mvflags & G_GENOD) != 0 || is_placeholder(mdat)) continue; /* polyok rules out all M2_PNAME and M2_WERE's; select_newcham_form might deliberately pick a player character type, so we can't arbitrarily rule out all human forms any more */ if (is_mplayer(mdat) || (!is_human(mdat) && polyok(mdat))) break; } if (tryct > 100) return 0; /* Should never happen */ } else if (mvitals[monsndx(mdat)].mvflags & G_GENOD) return(0); /* passed in mdat is genocided */ if(is_male(mdat)) { if(mtmp->female) mtmp->female = FALSE; } else if (is_female(mdat)) { if(!mtmp->female) mtmp->female = TRUE; } else if (!is_neuter(mdat)) { if(!rn2(10)) mtmp->female = !mtmp->female; } if (In_endgame(&u.uz) && is_mplayer(olddata)) { /* mplayers start out as "Foo the Bar", but some of the * titles are inappropriate when polymorphed, particularly * into the opposite sex. players don't use ranks when * polymorphed, so dropping the rank for mplayers seems * reasonable. */ char *p = index(NAME(mtmp), ' '); if (p) { *p = '\0'; mtmp->mnamelth = p - NAME(mtmp) + 1; } } if(mdat == mtmp->data) return(0); /* still the same monster */ /* [ALI] Detect transforming between player monsters with the * same rank title to avoid badly formed messages. * Similarly for were creatures transforming to their alt. form. */ if (msg && is_mplayer(olddata) && is_mplayer(mdat)) { const struct Role *role; int i, oldmndx; mndx = monsndx(mdat); oldmndx = monsndx(olddata); for (role = roles; role->name.m; role++) { if (role->femalenum == NON_PM) continue; if ((mndx == role->femalenum && oldmndx == role->malenum) || (mndx == role->malenum && oldmndx == role->femalenum)) { /* Find the rank */ for (i = xlev_to_rank(mtmp->m_lev); i >= 0; i--) if (role->rank[i].m) { /* Only need alternate message if no female form */ alt_mesg = !role->rank[i].f; break; } } } } else if (msg && is_were(olddata) && monsndx(mdat) == counter_were(monsndx(olddata))) alt_mesg = TRUE; /* WAC - At this point, the transformation is going to happen */ /* Reset values, remove worm tails, change levels...etc. */ if(mtmp->wormno) { /* throw tail away */ wormgone(mtmp); place_monster(mtmp, mtmp->mx, mtmp->my); } hpn = mtmp->mhp; hpd = (mtmp->m_lev < 50) ? ((int)mtmp->m_lev)*8 : mdat->mlevel; if(!hpd) hpd = 4; mtmp->m_lev = adj_lev(mdat); /* new monster level */ mhp = (mtmp->m_lev < 50) ? ((int)mtmp->m_lev)*8 : mdat->mlevel; if(!mhp) mhp = 4; /* new hp: same fraction of max as before */ #ifndef LINT mtmp->mhp = (int)(((long)hpn*(long)mhp)/(long)hpd); #endif if(mtmp->mhp < 0) mtmp->mhp = hpn; /* overflow */ /* Unlikely but not impossible; a 1HD creature with 1HP that changes into a 0HD creature will require this statement */ if (!mtmp->mhp) mtmp->mhp = 1; /* and the same for maximum hit points */ hpn = mtmp->mhpmax; #ifndef LINT mtmp->mhpmax = (int)(((long)hpn*(long)mhp)/(long)hpd); #endif if(mtmp->mhpmax < 0) mtmp->mhpmax = hpn; /* overflow */ if (!mtmp->mhpmax) mtmp->mhpmax = 1; /* take on the new form... */ set_mon_data(mtmp, mdat, 0); if (emits_light(olddata) != emits_light(mtmp->data)) { /* used to give light, now doesn't, or vice versa, or light's range has changed */ if (emits_light(olddata)) del_light_source(LS_MONSTER, (genericptr_t)mtmp); if (emits_light(mtmp->data)) 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))) mtmp->mundetected = 0; #ifdef STEED if (u.usteed) { if (touch_petrifies(u.usteed->data) && !Stone_resistance && rnl(3)) { char buf[BUFSZ]; pline("You touch %s.", mon_nam(u.usteed)); Sprintf(buf, "riding %s", an(u.usteed->data->mname)); instapetrify(buf); } if (!can_ride(u.usteed)) dismount_steed(DISMOUNT_POLY); } #endif #ifndef DCC30_BUG if (mdat == &mons[PM_LONG_WORM] && (mtmp->wormno = get_wormno()) != 0) { #else /* DICE 3.0 doesn't like assigning and comparing mtmp->wormno in the * same expression. */ if (mdat == &mons[PM_LONG_WORM] && (mtmp->wormno = get_wormno(), mtmp->wormno != 0)) { #endif /* we can now create worms with tails - 11/91 */ initworm(mtmp, rn2(5)); if (count_wsegs(mtmp)) place_worm_tail_randomly(mtmp, mtmp->mx, mtmp->my); } newsym(mtmp->mx,mtmp->my); if (msg && (u.uswallow && mtmp == u.ustuck || canspotmon(mtmp))) { if (alt_mesg && is_mplayer(mdat)) pline("%s is suddenly very %s!", oldname, mtmp->female ? "feminine" : "masculine"); else if (alt_mesg) pline("%s changes into a %s!", oldname, is_human(mdat) ? "human" : mdat->mname + 4); else { uchar save_mnamelth = mtmp->mnamelth; mtmp->mnamelth = 0; pline("%s turns into %s!", oldname, mdat == &mons[PM_GREEN_SLIME] ? "slime" : x_monnam(mtmp, ARTICLE_A, (char*)0, SUPPRESS_SADDLE, FALSE)); mtmp->mnamelth = save_mnamelth; } } else if (msg && couldsee) /* No message if we only sensed the monster previously */ pline("%s suddenly disappears!", oldname); /* [ALI] In Slash'EM, this must come _after_ " turns into " * since it's possible to get both messages. */ if (u.ustuck == mtmp) { if(u.uswallow) { if(!attacktype(mdat,AT_ENGL)) { /* Does mdat care? */ if (!noncorporeal(mdat) && !amorphous(mdat) && !is_whirly(mdat) && (mdat != &mons[PM_YELLOW_LIGHT])) { You("break out of %s%s!", mon_nam(mtmp), (is_animal(mdat)? "'s stomach" : "")); mtmp->mhp = 1; /* almost dead */ } expels(mtmp, olddata, FALSE); } else { /* update swallow glyphs for new monster */ swallowed(0); } } else if (!sticks(mdat) && !sticks(youmonst.data)) unstuck(mtmp); } possibly_unwield(mtmp, polyspot); /* might lose use of weapon */ mon_break_armor(mtmp, polyspot); if (!(mtmp->misc_worn_check & W_ARMG)) mselftouch(mtmp, "No longer petrify-resistant, ", !flags.mon_moving); m_dowear(mtmp, FALSE); /* This ought to re-test can_carry() on each item in the inventory * rather than just checking ex-giants & boulders, but that'd be * pretty expensive to perform. If implemented, then perhaps * minvent should be sorted in order to drop heaviest items first. */ /* former giants can't continue carrying boulders */ if (mtmp->minvent && !throws_rocks(mdat)) { register struct obj *otmp, *otmp2; 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; place_object(otmp, mtmp->mx, mtmp->my); } } } return(1); } /* sometimes an egg will be special */ #define BREEDER_EGG (!rn2(77)) /* * Determine if the given monster number can be hatched from an egg. * Return the monster number to use as the egg's corpsenm. Return * NON_PM if the given monster can't be hatched. */ int can_be_hatched(mnum) int mnum; { /* ranger quest nemesis has the oviparous bit set, making it be possible to wish for eggs of that unique monster; turn such into ordinary eggs rather than forbidding them outright */ if (mnum == PM_SCORPIUS) mnum = PM_SCORPION; mnum = little_to_big(mnum); /* * Queen bees lay killer bee eggs (usually), but killer bees don't * grow into queen bees. Ditto for [winged-]gargoyles. */ if (mnum == PM_KILLER_BEE || mnum == PM_GARGOYLE || (lays_eggs(&mons[mnum]) && (BREEDER_EGG || (mnum != PM_QUEEN_BEE && mnum != PM_WINGED_GARGOYLE)))) return mnum; return NON_PM; } /* type of egg laid by #sit; usually matches parent */ int egg_type_from_parent(mnum, force_ordinary) int mnum; /* parent monster; caller must handle lays_eggs() check */ boolean force_ordinary; { if (force_ordinary || !BREEDER_EGG) { if (mnum == PM_QUEEN_BEE) mnum = PM_KILLER_BEE; else if (mnum == PM_WINGED_GARGOYLE) mnum = PM_GARGOYLE; } return mnum; } /* decide whether an egg of the indicated monster type is viable; */ /* also used to determine whether an egg or tin can be created... */ boolean dead_species(m_idx, egg) int m_idx; boolean egg; { /* * For monsters with both baby and adult forms, genociding either * form kills all eggs of that monster. Monsters with more than * two forms (small->large->giant mimics) are more or less ignored; * fortunately, none of them have eggs. Species extinction due to * overpopulation does not kill eggs. */ return (boolean) (m_idx >= LOW_PM && ((mvitals[m_idx].mvflags & G_GENOD) != 0 || (egg && (mvitals[big_to_little(m_idx)].mvflags & G_GENOD) != 0))); } /* kill off any eggs of genocided monsters */ STATIC_OVL void kill_eggs(obj_list) struct obj *obj_list; { struct obj *otmp; for (otmp = obj_list; otmp; otmp = otmp->nobj) if (otmp->otyp == EGG) { if (dead_species(otmp->corpsenm, TRUE)) { /* * It seems we could also just catch this when * it attempted to hatch, so we wouldn't have to * search all of the objlists.. or stop all * hatch timers based on a corpsenm. */ kill_egg(otmp); } #if 0 /* not used */ } else if (otmp->otyp == TIN) { if (dead_species(otmp->corpsenm, FALSE)) otmp->corpsenm = NON_PM; /* empty tin */ } else if (otmp->otyp == CORPSE) { if (dead_species(otmp->corpsenm, FALSE)) ; /* not yet implemented... */ #endif } else if (Has_contents(otmp)) { kill_eggs(otmp->cobj); } } /* kill all members of genocided species */ void kill_genocided_monsters() { struct monst *mtmp, *mtmp2; boolean kill_cham[CHAM_MAX_INDX+1]; int mndx; kill_cham[CHAM_ORDINARY] = FALSE; /* (this is mndx==0) */ for (mndx = 1; mndx <= CHAM_MAX_INDX; mndx++) kill_cham[mndx] = (mvitals[cham_to_pm[mndx]].mvflags & G_GENOD) != 0; /* * Called during genocide, and again upon level change. The latter * catches up with any migrating monsters as they finally arrive at * their intended destinations, so possessions get deposited there. * * Chameleon handling: * 1) if chameleons have been genocided, destroy them * regardless of current form; * 2) otherwise, force every chameleon which is imitating * any genocided species to take on a new form. */ for (mtmp = fmon; mtmp; mtmp = mtmp2) { mtmp2 = mtmp->nmon; if (DEADMONSTER(mtmp)) continue; mndx = monsndx(mtmp->data); if ((mvitals[mndx].mvflags & G_GENOD) || kill_cham[mtmp->cham]) { if (mtmp->cham && !kill_cham[mtmp->cham]) /* [ALI] Chameleons are not normally subject to * system shock, but genocide is a special case. */ (void) mon_spec_poly(mtmp, (struct permonst *)0, 0L, FALSE, FALSE, TRUE, TRUE); else mondead(mtmp); } if (mtmp->minvent) kill_eggs(mtmp->minvent); } kill_eggs(invent); kill_eggs(fobj); kill_eggs(level.buriedobjlist); } #endif /* OVL2 */ #ifdef OVLB void golemeffects(mon, damtype, dam) register struct monst *mon; int damtype, dam; { int heal=0, slow=0; if (mon->data == &mons[PM_FLESH_GOLEM]) { if (damtype == AD_ELEC) heal = dam / 6; else if (damtype == AD_FIRE || damtype == AD_COLD) slow = 1; } else if (mon->data == &mons[PM_IRON_GOLEM]) { if (damtype == AD_ELEC) slow = 1; else if (damtype == AD_FIRE) heal = dam; } else { return; } if (slow) { if (mon->mspeed != MSLOW) mon_adjust_speed(mon, -1, (struct obj *)0); } if (heal) { if (mon->mhp < mon->mhpmax) { mon->mhp += dam; if (mon->mhp > mon->mhpmax) mon->mhp = mon->mhpmax; if (cansee(mon->mx, mon->my)) pline("%s seems healthier.", Monnam(mon)); } } } boolean angry_guards(silent) register boolean silent; { register struct monst *mtmp; register int ct = 0, nct = 0, sct = 0, slct = 0; for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) { if (DEADMONSTER(mtmp)) continue; if((mtmp->data == &mons[PM_WATCHMAN] || mtmp->data == &mons[PM_WATCH_CAPTAIN]) && mtmp->mpeaceful) { ct++; if(cansee(mtmp->mx, mtmp->my) && mtmp->mcanmove) { if (distu(mtmp->mx, mtmp->my) == 2) nct++; else sct++; } if (mtmp->msleeping || mtmp->mfrozen) { slct++; mtmp->msleeping = mtmp->mfrozen = 0; } mtmp->mpeaceful = 0; } } if(ct) { if(!silent) { /* do we want pline msgs? */ if(slct) pline_The("guard%s wake%s up!", slct > 1 ? "s" : "", slct == 1 ? "s" : ""); if(nct || sct) { if(nct) pline_The("guard%s get%s angry!", nct == 1 ? "" : "s", nct == 1 ? "s" : ""); else if(!Blind) You("see %sangry guard%s approaching!", sct == 1 ? "an " : "", sct > 1 ? "s" : ""); } else if(flags.soundok) You_hear("the shrill sound of a guard's whistle."); } return(TRUE); } return(FALSE); } void pacify_guards() { register struct monst *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->mpeaceful = 1; } } void mimic_hit_msg(mtmp, otyp) struct monst *mtmp; short otyp; { short ap = mtmp->mappearance; switch(mtmp->m_ap_type) { case M_AP_NOTHING: case M_AP_FURNITURE: case M_AP_MONSTER: break; case M_AP_OBJECT: if (otyp == SPE_HEALING || otyp == SPE_EXTRA_HEALING) { pline("%s seems a more vivid %s than before.", The(simple_typename(ap)), c_obj_colors[objects[ap].oc_color]); } break; } } #endif /* OVLB */ /*mon.c*/ slashem-0.0.7E7F3/src/extralev.c0000664000076400007640000002121210545462317014437 0ustar aliali/* SCCS Id: @(#)extralev.c 3.4 2001/09/06 */ /* Copyright 1988, 1989 by Ken Arromdee */ /* NetHack may be freely redistributed. See license for details. */ /* * Support code for "rogue"-style level. */ #include "hack.h" #ifdef REINCARNATION struct rogueroom { xchar rlx, rly; xchar dx, dy; boolean real; uchar doortable; int nroom; /* Only meaningful for "real" rooms */ }; #define UP 1 #define DOWN 2 #define LEFT 4 #define RIGHT 8 static NEARDATA struct rogueroom r[3][3]; STATIC_DCL void FDECL(roguejoin,(int,int,int,int,int)); STATIC_DCL void FDECL(roguecorr,(int,int,int)); STATIC_DCL void FDECL(miniwalk,(int,int)); STATIC_OVL void roguejoin(x1,y1,x2,y2, horiz) int x1,y1,x2,y2; int horiz; { register int x,y,middle; #ifndef MAX #define MAX(a,b) (((a) > (b)) ? (a) : (b)) #endif #ifndef MIN #define MIN(a,b) (((a) < (b)) ? (a) : (b)) #endif if (horiz) { middle = x1 + rn2(x2-x1+1); for(x=MIN(x1,middle); x<=MAX(x1,middle); x++) corr(x, y1); for(y=MIN(y1,y2); y<=MAX(y1,y2); y++) corr(middle,y); for(x=MIN(middle,x2); x<=MAX(middle,x2); x++) corr(x, y2); } else { middle = y1 + rn2(y2-y1+1); for(y=MIN(y1,middle); y<=MAX(y1,middle); y++) corr(x1, y); for(x=MIN(x1,x2); x<=MAX(x1,x2); x++) corr(x, middle); for(y=MIN(middle,y2); y<=MAX(middle,y2); y++) corr(x2,y); } } STATIC_OVL void roguecorr(x, y, dir) int x,y,dir; { register int fromx, fromy, tox, toy; if (dir==DOWN) { r[x][y].doortable &= ~DOWN; if (!r[x][y].real) { fromx = r[x][y].rlx; fromy = r[x][y].rly; fromx += 1 + 26*x; fromy += 7*y; } else { fromx = r[x][y].rlx + rn2(r[x][y].dx); fromy = r[x][y].rly + r[x][y].dy; fromx += 1 + 26*x; fromy += 7*y; if (!IS_WALL(levl[fromx][fromy].typ)) impossible("down: no wall at %d,%d?",fromx, fromy); dodoor(fromx, fromy, &rooms[r[x][y].nroom]); levl[fromx][fromy].doormask = D_NODOOR; fromy++; } if(y >= 2) { impossible("down door from %d,%d going nowhere?",x,y); return; } y++; r[x][y].doortable &= ~UP; if (!r[x][y].real) { tox = r[x][y].rlx; toy = r[x][y].rly; tox += 1 + 26*x; toy += 7*y; } else { tox = r[x][y].rlx + rn2(r[x][y].dx); toy = r[x][y].rly - 1; tox += 1 + 26*x; toy += 7*y; if (!IS_WALL(levl[tox][toy].typ)) impossible("up: no wall at %d,%d?",tox,toy); dodoor(tox, toy, &rooms[r[x][y].nroom]); levl[tox][toy].doormask = D_NODOOR; toy--; } roguejoin(fromx, fromy, tox, toy, FALSE); return; } else if (dir == RIGHT) { r[x][y].doortable &= ~RIGHT; if (!r[x][y].real) { fromx = r[x][y].rlx; fromy = r[x][y].rly; fromx += 1 + 26*x; fromy += 7*y; } else { fromx = r[x][y].rlx + r[x][y].dx; fromy = r[x][y].rly + rn2(r[x][y].dy); fromx += 1 + 26*x; fromy += 7*y; if (!IS_WALL(levl[fromx][fromy].typ)) impossible("down: no wall at %d,%d?",fromx, fromy); dodoor(fromx, fromy, &rooms[r[x][y].nroom]); levl[fromx][fromy].doormask = D_NODOOR; fromx++; } if(x >= 2) { impossible("right door from %d,%d going nowhere?",x,y); return; } x++; r[x][y].doortable &= ~LEFT; if (!r[x][y].real) { tox = r[x][y].rlx; toy = r[x][y].rly; tox += 1 + 26*x; toy += 7*y; } else { tox = r[x][y].rlx - 1; toy = r[x][y].rly + rn2(r[x][y].dy); tox += 1 + 26*x; toy += 7*y; if (!IS_WALL(levl[tox][toy].typ)) impossible("left: no wall at %d,%d?",tox,toy); dodoor(tox, toy, &rooms[r[x][y].nroom]); levl[tox][toy].doormask = D_NODOOR; tox--; } roguejoin(fromx, fromy, tox, toy, TRUE); return; } else impossible("corridor in direction %d?",dir); } /* Modified walkfrom() from mkmaze.c */ STATIC_OVL void miniwalk(x, y) int x,y; { register int q, dir; int dirs[4]; while(1) { q = 0; #define doorhere (r[x][y].doortable) if (x>0 && (!(doorhere & LEFT)) && (!r[x-1][y].doortable || !rn2(10))) dirs[q++] = 0; if (x<2 && (!(doorhere & RIGHT)) && (!r[x+1][y].doortable || !rn2(10))) dirs[q++] = 1; if (y>0 && (!(doorhere & UP)) && (!r[x][y-1].doortable || !rn2(10))) dirs[q++] = 2; if (y<2 && (!(doorhere & DOWN)) && (!r[x][y+1].doortable || !rn2(10))) dirs[q++] = 3; /* Rogue levels aren't just 3 by 3 mazes; they have some extra * connections, thus that 1/10 chance */ if (!q) return; dir = dirs[rn2(q)]; switch(dir) { /* Move in direction */ case 0: doorhere |= LEFT; x--; doorhere |= RIGHT; break; case 1: doorhere |= RIGHT; x++; doorhere |= LEFT; break; case 2: doorhere |= UP; y--; doorhere |= DOWN; break; case 3: doorhere |= DOWN; y++; doorhere |= UP; break; } miniwalk(x,y); } } void makeroguerooms() { register int x,y; /* Rogue levels are structured 3 by 3, with each section containing * a room or an intersection. The minimum width is 2 each way. * One difference between these and "real" Rogue levels: real Rogue * uses 24 rows and NetHack only 23. So we cheat a bit by making the * second row of rooms not as deep. * * Each normal space has 6/7 rows and 25 columns in which a room may * actually be placed. Walls go from rows 0-5/6 and columns 0-24. * Not counting walls, the room may go in * rows 1-5 and columns 1-23 (numbering starting at 0). A room * coordinate of this type may be converted to a level coordinate * by adding 1+28*x to the column, and 7*y to the row. (The 1 * is because column 0 isn't used [we only use 1-78]). * Room height may be 2-4 (2-5 on last row), length 2-23 (not * counting walls) */ #define here r[x][y] nroom = 0; for(y=0; y<3; y++) for(x=0; x<3; x++) { /* Note: we want to insure at least 1 room. So, if the * first 8 are all dummies, force the last to be a room. */ if (!rn2(5) && (nroom || (x<2 && y<2))) { /* Arbitrary: dummy rooms may only go where real * ones do. */ here.real = FALSE; here.rlx = rn1(22, 2); here.rly = rn1((y==2)?4:3, 2); } else { here.real = TRUE; here.dx = rn1(22, 2); /* 2-23 long, plus walls */ here.dy = rn1((y==2)?4:3, 2); /* 2-5 high, plus walls */ /* boundaries of room floor */ here.rlx = rnd(23 - here.dx + 1); here.rly = rnd(((y==2) ? 5 : 4)- here.dy + 1); nroom++; } here.doortable = 0; } miniwalk(rn2(3), rn2(3)); nroom = 0; for(y=0; y<3; y++) for(x=0; x<3; x++) { if (here.real) { /* Make a room */ int lowx, lowy, hix, hiy; r[x][y].nroom = nroom; smeq[nroom] = nroom; lowx = 1 + 26*x + here.rlx; lowy = 7*y + here.rly; hix = 1 + 26*x + here.rlx + here.dx - 1; hiy = 7*y + here.rly + here.dy - 1; /* Strictly speaking, it should be lit only if above * level 10, but since Rogue rooms are only * encountered below level 10, use !rn2(7). */ add_room(lowx, lowy, hix, hiy, (boolean) !rn2(7), OROOM, FALSE); } } /* Now, add connecting corridors. */ for(y=0; y<3; y++) for(x=0; x<3; x++) { if (here.doortable & DOWN) roguecorr(x, y, DOWN); if (here.doortable & RIGHT) roguecorr(x, y, RIGHT); if (here.doortable & LEFT) impossible ("left end of %d, %d never connected?",x,y); if (here.doortable & UP) impossible ("up end of %d, %d never connected?",x,y); } } void corr(x,y) int x, y; { if (rn2(50)) { levl[x][y].typ = CORR; } else { levl[x][y].typ = SCORR; } } void makerogueghost() { register struct monst *ghost; struct obj *ghostobj; struct mkroom *croom; int x,y; if (!nroom) return; /* Should never happen */ croom = &rooms[rn2(nroom)]; x = somex(croom); y = somey(croom); if (!(ghost = makemon(&mons[PM_GHOST], x, y, NO_MM_FLAGS))) return; ghost->msleeping = 1; 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; } } #endif /* REINCARNATION */ /*extralev.c*/ slashem-0.0.7E7F3/src/write.c0000664000076400007640000001424710545462317013751 0ustar aliali/* SCCS Id: @(#)write.c 3.4 2001/11/29 */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" STATIC_DCL int FDECL(cost,(struct obj *)); /* * returns basecost of a scroll or a spellbook */ STATIC_OVL int cost(otmp) register struct obj *otmp; { if (otmp->oclass == SPBOOK_CLASS) return(10 * objects[otmp->otyp].oc_level); /* KMH, balance patch -- restoration of marker charges */ switch (otmp->otyp) { # ifdef MAIL case SCR_MAIL: return(2); /* break; */ # endif case SCR_LIGHT: case SCR_GOLD_DETECTION: case SCR_FOOD_DETECTION: case SCR_MAGIC_MAPPING: case SCR_AMNESIA: case SCR_FIRE: case SCR_EARTH: return(8); /* break; */ case SCR_DESTROY_ARMOR: case SCR_CREATE_MONSTER: case SCR_PUNISHMENT: return(10); /* break; */ case SCR_CONFUSE_MONSTER: return(12); /* break; */ case SCR_IDENTIFY: case SCR_SCARE_MONSTER: return(14); /* break; */ case SCR_TAMING: case SCR_TELEPORTATION: return(20); /* break; */ /* KMH, balance patch -- more useful scrolls cost more */ case SCR_STINKING_CLOUD: case SCR_ENCHANT_ARMOR: case SCR_REMOVE_CURSE: case SCR_ENCHANT_WEAPON: case SCR_CHARGING: return(24); /* break; */ case SCR_GENOCIDE: return(30); /* break; */ case SCR_BLANK_PAPER: default: impossible("You can't write such a weird scroll!"); } return(1000); } static NEARDATA const char write_on[] = { SCROLL_CLASS, SPBOOK_CLASS, 0 }; int dowrite(pen) register struct obj *pen; { register struct obj *paper; char namebuf[BUFSZ], *nm, *bp; register struct obj *new_obj; int basecost, actualcost; int curseval; char qbuf[QBUFSZ]; int first, last, i; boolean by_descr = FALSE; const char *typeword; if (nohands(youmonst.data)) { You("need hands to be able to write!"); return 0; } else if (Glib) { pline("%s from your %s.", Tobjnam(pen, "slip"), makeplural(body_part(FINGER))); dropx(pen); return 1; } /* get paper to write on */ paper = getobj(write_on,"write on"); if(!paper) return(0); typeword = (paper->oclass == SPBOOK_CLASS) ? "spellbook" : "scroll"; if(Blind && !paper->dknown) { You("don't know if that %s is blank or not!", typeword); return(1); } paper->dknown = 1; if(paper->otyp != SCR_BLANK_PAPER && paper->otyp != SPE_BLANK_PAPER) { pline("That %s is not blank!", typeword); exercise(A_WIS, FALSE); return(1); } /* what to write */ Sprintf(qbuf, "What type of %s do you want to write?", typeword); getlin(qbuf, namebuf); (void)mungspaces(namebuf); /* remove any excess whitespace */ if(namebuf[0] == '\033' || !namebuf[0]) return(1); nm = namebuf; if (!strncmpi(nm, "scroll ", 7)) nm += 7; else if (!strncmpi(nm, "spellbook ", 10)) nm += 10; if (!strncmpi(nm, "of ", 3)) nm += 3; if ((bp = strstri(nm, " armour")) != 0) { (void)strncpy(bp, " armor ", 7); /* won't add '\0' */ (void)mungspaces(bp + 1); /* remove the extra space */ } first = bases[(int)paper->oclass]; last = bases[(int)paper->oclass + 1] - 1; for (i = first; i <= last; i++) { /* extra shufflable descr not representing a real object */ if (!OBJ_NAME(objects[i])) continue; if (!strcmpi(OBJ_NAME(objects[i]), nm)) goto found; if (!strcmpi(OBJ_DESCR(objects[i]), nm)) { by_descr = TRUE; goto found; } } There("is no such %s!", typeword); return 1; found: if (i == SCR_BLANK_PAPER || i == SPE_BLANK_PAPER) { You_cant("write that!"); pline("It's obscene!"); return 1; } else if (i == SPE_BOOK_OF_THE_DEAD) { pline("No mere dungeon adventurer could write that."); return 1; } else if (by_descr && paper->oclass == SPBOOK_CLASS && !objects[i].oc_name_known) { /* can't write unknown spellbooks by description */ pline( "Unfortunately you don't have enough information to go on."); return 1; } /* KMH, conduct */ u.uconduct.literate++; new_obj = mksobj(i, FALSE, FALSE); new_obj->bknown = (paper->bknown && pen->bknown); #ifdef INVISIBLE_OBJECTS new_obj->oinvis = paper->oinvis; #endif /* shk imposes a flat rate per use, not based on actual charges used */ check_unpaid(pen); /* see if there's enough ink */ basecost = cost(new_obj); if(pen->spe < basecost/2) { Your("marker is too dry to write that!"); obfree(new_obj, (struct obj *) 0); return(1); } /* we're really going to write now, so calculate cost */ actualcost = rn1(basecost/2,basecost/2); 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); } pen->spe -= actualcost; /* can't write if we don't know it - unless we're lucky */ if(!(objects[new_obj->otyp].oc_name_known) && !(objects[new_obj->otyp].oc_uname) && (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); } else Sprintf(namebuf, "%s was here!", plname); You("write \"%s\" and the scroll disappears.", namebuf); useup(paper); } obfree(new_obj, (struct obj *) 0); return(1); } /* useup old scroll / spellbook */ useup(paper); /* success */ if (new_obj->oclass == SPBOOK_CLASS) { /* acknowledge the change in the object's description... */ pline_The("spellbook warps strangely, then turns %s.", OBJ_DESCR(objects[new_obj->otyp])); } new_obj->blessed = (curseval > 0); new_obj->cursed = (curseval < 0); #ifdef MAIL if (new_obj->otyp == SCR_MAIL) new_obj->spe = 1; #endif new_obj = hold_another_object(new_obj, "Oops! %s out of your grasp!", The(aobjnam(new_obj, "slip")), (const char *)0); return(1); } /*write.c*/ slashem-0.0.7E7F3/src/muse.c0000664000076400007640000021215110545462317013562 0ustar aliali/* SCCS Id: @(#)muse.c 3.4 2002/12/23 */ /* Copyright (C) 1990 by Ken Arromdee */ /* NetHack may be freely redistributed. See license for details. */ /* * Monster item usage routines. */ #include "hack.h" #include "edog.h" extern const int monstr[]; boolean m_using = FALSE; /* Let monsters use magic items. Arbitrary assumptions: Monsters only use * scrolls when they can see, monsters know when wands have 0 charges, monsters * cannot recognize if items are cursed are not, monsters which are confused * don't know not to read scrolls, etc.... */ #if 0 STATIC_DCL struct permonst *FDECL(muse_newcham_mon, (struct monst *)); #endif 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 *)); STATIC_DCL void FDECL(mquaffmsg, (struct monst *,struct obj *)); STATIC_PTR int FDECL(mbhitm, (struct monst *,struct obj *)); STATIC_DCL void FDECL(mbhit, (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; struct obj *defensive; struct obj *misc; int has_offense, has_defense, has_misc; /* =0, no capability; otherwise, different numbers. * If it's an object, the object is also set (it's 0 otherwise). */ } m; static int trapx, trapy; static boolean zap_oseen; /* for wands which use mbhitm and are zapped at players. We usually * want an oseen local to the function, but this is impossible since the * function mbhitm has to be compatible with the normal zap routines, * and those routines don't remember who zapped the wand. */ /* Any preliminary checks which may result in the monster being unable to use * the item. Returns 0 if nothing happened, 2 if the monster can't do anything * (i.e. it teleported) and 1 if it's dead. */ STATIC_OVL int precheck(mon, obj) struct monst *mon; struct obj *obj; { boolean vis; if (!obj) return 0; vis = cansee(mon->mx, mon->my); if (obj->oclass == POTION_CLASS) { coord cc; static const char *empty = "The potion turns out to be empty."; const char *potion_descr; struct monst *mtmp; #define POTION_OCCUPANT_CHANCE(n) (13 + 2*(n)) /* also in potion.c */ potion_descr = OBJ_DESCR(objects[obj->otyp]); if (potion_descr && !strcmp(potion_descr, "milky")) { if ( flags.ghost_count < MAXMONNO && !rn2(POTION_OCCUPANT_CHANCE(flags.ghost_count))) { if (!enexto(&cc, mon->mx, mon->my, &mons[PM_GHOST])) return 0; mquaffmsg(mon, obj); m_useup(mon, obj); mtmp = makemon(&mons[PM_GHOST], cc.x, cc.y, NO_MM_FLAGS); if (!mtmp) { if (vis) pline(empty); } else { if (vis) { pline("As %s opens the bottle, an enormous %s emerges!", mon_nam(mon), Hallucination ? rndmonnam() : (const char *)"ghost"); pline("%s is frightened to death, and unable to move.", Monnam(mon)); } mon->mcanmove = 0; mon->mfrozen = 3; } return 2; } } if (potion_descr && !strcmp(potion_descr, "smoky") && flags.djinni_count < MAXMONNO && !rn2(POTION_OCCUPANT_CHANCE(flags.djinni_count))) { if (!enexto(&cc, mon->mx, mon->my, &mons[PM_DJINNI])) return 0; mquaffmsg(mon, obj); m_useup(mon, obj); mtmp = makemon(&mons[PM_DJINNI], cc.x, cc.y, NO_MM_FLAGS); if (!mtmp) { if (vis) pline(empty); } else { if (vis) pline("In a cloud of smoke, %s emerges!", a_monnam(mtmp)); pline("%s speaks.", vis ? Monnam(mtmp) : Something); /* I suspect few players will be upset that monsters */ /* can't wish for wands of death here.... */ if (rn2(2)) { verbalize("You freed me!"); mtmp->mpeaceful = 1; set_malign(mtmp); } else { verbalize("It is about time."); if (vis) pline("%s vanishes.", Monnam(mtmp)); mongone(mtmp); } } return 2; } } if (obj->oclass == WAND_CLASS && obj->cursed && !rn2(100)) { int dam = d(obj->spe+2, 6); if (flags.soundok) { if (vis) pline("%s zaps %s, which suddenly explodes!", Monnam(mon), an(xname(obj))); else You_hear("a zap and an explosion in the distance."); } m_useup(mon, obj); if (mon->mhp <= dam) { monkilled(mon, "", AD_RBRE); return 1; } else mon->mhp -= dam; m.has_defense = m.has_offense = m.has_misc = 0; /* Only one needed to be set to 0 but the others are harmless */ } return 0; } STATIC_OVL void mzapmsg(mtmp, otmp, self) struct monst *mtmp; struct obj *otmp; boolean self; { if (!canseemon(mtmp)) { if (flags.soundok) You_hear("a %s zap.", (distu(mtmp->mx,mtmp->my) <= (BOLT_LIM+1)*(BOLT_LIM+1)) ? "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(); } } STATIC_OVL void mreadmsg(mtmp, otmp) struct monst *mtmp; struct obj *otmp; { boolean vismon = canseemon(mtmp); char onambuf[BUFSZ]; short saverole; unsigned savebknown; if (!vismon && !flags.soundok) return; /* no feedback */ otmp->dknown = 1; /* seeing or hearing it read reveals its label */ /* shouldn't be able to hear curse/bless status of unseen scrolls; for priest characters, bknown will always be set during naming */ savebknown = otmp->bknown; saverole = Role_switch; if (!vismon) { otmp->bknown = 0; if (Role_if(PM_PRIEST)) Role_switch = 0; } Strcpy(onambuf, singular(otmp, doname)); Role_switch = saverole; otmp->bknown = savebknown; if (vismon) pline("%s reads %s!", Monnam(mtmp), onambuf); else You_hear("%s reading %s.", x_monnam(mtmp, ARTICLE_A, (char *)0, (SUPPRESS_IT|SUPPRESS_INVISIBLE|SUPPRESS_SADDLE), FALSE), onambuf); if (mtmp->mconf) pline("Being confused, %s mispronounces the magic words...", vismon ? mon_nam(mtmp) : mhe(mtmp)); } STATIC_OVL void mquaffmsg(mtmp, otmp) struct monst *mtmp; struct obj *otmp; { if (canseemon(mtmp)) { otmp->dknown = 1; pline("%s drinks %s!", Monnam(mtmp), singular(otmp, doname)); } else if (flags.soundok) You_hear("a chugging sound."); } /* Defines for various types of stuff. The order in which monsters prefer * to use them is determined by the order of the code logic, not the * numerical order in which they are defined. */ #define MUSE_SCR_TELEPORTATION 1 #define MUSE_WAN_TELEPORTATION_SELF 2 #define MUSE_POT_HEALING 3 #define MUSE_POT_EXTRA_HEALING 4 #define MUSE_WAN_DIGGING 5 #define MUSE_TRAPDOOR 6 #define MUSE_TELEPORT_TRAP 7 #define MUSE_UPSTAIRS 8 #define MUSE_DOWNSTAIRS 9 #define MUSE_WAN_CREATE_MONSTER 10 #define MUSE_SCR_CREATE_MONSTER 11 #define MUSE_UP_LADDER 12 #define MUSE_DN_LADDER 13 #define MUSE_SSTAIRS 14 #define MUSE_WAN_TELEPORTATION 15 #define MUSE_BUGLE 16 #define MUSE_UNICORN_HORN 17 #define MUSE_POT_FULL_HEALING 18 #define MUSE_LIZARD_CORPSE 19 /* [Tom] my new items... */ #define MUSE_WAN_HEALING 20 #define MUSE_WAN_EXTRA_HEALING 21 #define MUSE_WAN_CREATE_HORDE 22 #define MUSE_POT_VAMPIRE_BLOOD 23 /* #define MUSE_INNATE_TPT 9999 * We cannot use this. Since monsters get unlimited teleportation, if they * were allowed to teleport at will you could never catch them. Instead, * assume they only teleport at random times, despite the inconsistency that if * you polymorph into one you teleport at will. */ /* Select a defensive item/action for a monster. Returns TRUE iff one is * found. */ boolean find_defensive(mtmp) struct monst *mtmp; { register struct obj *obj = 0; struct trap *t; int x=mtmp->mx, y=mtmp->my; boolean stuck = (mtmp == u.ustuck); boolean immobile = (mtmp->data->mmove == 0); int fraction; if (is_animal(mtmp->data) || mindless(mtmp->data)) return FALSE; if(dist2(x, y, mtmp->mux, mtmp->muy) > 25) return FALSE; if (u.uswallow && stuck) return FALSE; m.defensive = (struct obj *)0; m.has_defense = 0; /* since unicorn horns don't get used up, the monster would look * silly trying to use the same cursed horn round after round */ if (mtmp->mconf || mtmp->mstun || !mtmp->mcansee) { if (!is_unicorn(mtmp->data) && !nohands(mtmp->data)) { for(obj = mtmp->minvent; obj; obj = obj->nobj) if (obj->otyp == UNICORN_HORN && !obj->cursed) break; } if (obj || is_unicorn(mtmp->data)) { m.defensive = obj; m.has_defense = MUSE_UNICORN_HORN; return TRUE; } } 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 * is peaceful; then we don't want to flee the player, and by * coincidence healing is all there is that doesn't involve fleeing. * These would be hard to combine because of the control flow. * Pestilence won't use healing even when blind. */ if (!mtmp->mcansee && !nohands(mtmp->data) && mtmp->data != &mons[PM_PESTILENCE]) { if ((obj = m_carrying(mtmp, POT_FULL_HEALING)) != 0) { m.defensive = obj; m.has_defense = MUSE_POT_FULL_HEALING; return TRUE; } if ((obj = m_carrying(mtmp, POT_EXTRA_HEALING)) != 0) { m.defensive = obj; m.has_defense = MUSE_POT_EXTRA_HEALING; return TRUE; } if ((obj = m_carrying(mtmp, POT_HEALING)) != 0) { m.defensive = obj; m.has_defense = MUSE_POT_HEALING; return TRUE; } if ((obj = m_carrying(mtmp, POT_FULL_HEALING)) !=0) { m.defensive = obj; m.has_defense = MUSE_POT_FULL_HEALING; return TRUE; } } fraction = u.ulevel < 10 ? 5 : u.ulevel < 14 ? 4 : 3; if(mtmp->mhp >= mtmp->mhpmax || (mtmp->mhp >= 10 && mtmp->mhp*fraction >= mtmp->mhpmax)) return FALSE; if (mtmp->mpeaceful) { if (!nohands(mtmp->data)) { if ((obj = m_carrying(mtmp, POT_FULL_HEALING)) != 0) { m.defensive = obj; m.has_defense = MUSE_POT_FULL_HEALING; return TRUE; } if ((obj = m_carrying(mtmp, POT_EXTRA_HEALING)) != 0) { m.defensive = obj; m.has_defense = MUSE_POT_EXTRA_HEALING; return TRUE; } if ((obj = m_carrying(mtmp, POT_HEALING)) != 0) { m.defensive = obj; m.has_defense = MUSE_POT_HEALING; return TRUE; } if (is_vampire(mtmp->data) && (obj = m_carrying(mtmp, POT_VAMPIRE_BLOOD)) !=0) { m.defensive = obj; m.has_defense = MUSE_POT_VAMPIRE_BLOOD; return TRUE; } } return FALSE; } if (levl[x][y].typ == STAIRS && !stuck && !immobile) { if (x == xdnstair && y == ydnstair && !is_floater(mtmp->data)) m.has_defense = MUSE_DOWNSTAIRS; if (x == xupstair && y == yupstair && ledger_no(&u.uz) != 1) /* Unfair to let the monsters leave the dungeon with the Amulet */ /* (or go to the endlevel since you also need it, to get there) */ m.has_defense = MUSE_UPSTAIRS; } else if (levl[x][y].typ == LADDER && !stuck && !immobile) { if (x == xupladder && y == yupladder) m.has_defense = MUSE_UP_LADDER; if (x == xdnladder && y == ydnladder && !is_floater(mtmp->data)) m.has_defense = MUSE_DN_LADDER; } else if (sstairs.sx && sstairs.sx == x && sstairs.sy == y) { m.has_defense = MUSE_SSTAIRS; } else if (!stuck && !immobile) { /* Note: trap doors take precedence over teleport traps. */ int xx, yy; for(xx = x-1; xx <= x+1; xx++) for(yy = y-1; yy <= y+1; yy++) if (isok(xx,yy)) if (xx != u.ux && yy != u.uy) if (mtmp->data != &mons[PM_GRID_BUG] || xx == x || yy == y) if ((xx==x && yy==y) || !level.monsters[xx][yy]) if ((t = t_at(xx,yy)) != 0) if ((verysmall(mtmp->data) || throws_rocks(mtmp->data) || passes_walls(mtmp->data)) || !sobj_at(BOULDER, xx, yy)) if (!onscary(xx,yy,mtmp)) { if ((t->ttyp == TRAPDOOR || t->ttyp == HOLE) && !is_floater(mtmp->data) && !mtmp->isshk && !mtmp->isgd && !mtmp->ispriest && Can_fall_thru(&u.uz) ) { trapx = xx; trapy = yy; m.has_defense = MUSE_TRAPDOOR; } else if (t->ttyp == TELEP_TRAP && m.has_defense != MUSE_TRAPDOOR) { trapx = xx; trapy = yy; m.has_defense = MUSE_TELEPORT_TRAP; } } } if (nohands(mtmp->data)) /* can't use objects */ goto botm; if (is_mercenary(mtmp->data) && (obj = m_carrying(mtmp, BUGLE))) { int xx, yy; struct monst *mon; /* Distance is arbitrary. What we really want to do is * have the soldier play the bugle when it sees or * remembers soldiers nearby... */ for(xx = x-3; xx <= x+3; xx++) for(yy = y-3; yy <= y+3; yy++) if (isok(xx,yy)) if ((mon = m_at(xx,yy)) && is_mercenary(mon->data) && mon->data != &mons[PM_GUARD] && (mon->msleeping || (!mon->mcanmove))) { m.defensive = obj; m.has_defense = MUSE_BUGLE; } } /* use immediate physical escape prior to attempting magic */ if (m.has_defense) /* stairs, trap door or tele-trap, bugle alert */ goto botm; /* kludge to cut down on trap destruction (particularly portals) */ t = t_at(x,y); if (t && (t->ttyp == PIT || t->ttyp == SPIKED_PIT || t->ttyp == WEB || t->ttyp == BEAR_TRAP)) t = 0; /* ok for monster to dig here */ #define nomore(x) if(m.has_defense==x) continue; for (obj = mtmp->minvent; obj; obj = obj->nobj) { /* don't always use the same selection pattern */ if (m.has_defense && !rn2(3)) break; /* nomore(MUSE_WAN_DIGGING); */ if (m.has_defense == MUSE_WAN_DIGGING) break; 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)) && !(is_ice(x,y) || is_pool(x,y) || is_lava(x,y)) && !(mtmp->data == &mons[PM_VLAD_THE_IMPALER] && In_V_tower(&u.uz))) { m.defensive = obj; m.has_defense = MUSE_WAN_DIGGING; } nomore(MUSE_WAN_TELEPORTATION_SELF); nomore(MUSE_WAN_TELEPORTATION); if(obj->otyp == WAN_TELEPORTATION && obj->spe > 0) { /* use the TELEP_TRAP bit to determine if they know * about noteleport on this level or not. Avoids * ineffective re-use of teleportation. This does * mean if the monster leaves the level, they'll know * about teleport traps. */ if (!level.flags.noteleport || !(mtmp->mtrapseen & (1 << (TELEP_TRAP-1)))) { m.defensive = obj; m.has_defense = (mon_has_amulet(mtmp)) ? MUSE_WAN_TELEPORTATION : MUSE_WAN_TELEPORTATION_SELF; } } nomore(MUSE_SCR_TELEPORTATION); if(obj->otyp == SCR_TELEPORTATION && mtmp->mcansee && haseyes(mtmp->data) && (!obj->cursed || (!(mtmp->isshk && inhishop(mtmp)) && !mtmp->isgd && !mtmp->ispriest))) { /* see WAN_TELEPORTATION case above */ if (!level.flags.noteleport || !(mtmp->mtrapseen & (1 << (TELEP_TRAP-1)))) { m.defensive = obj; m.has_defense = MUSE_SCR_TELEPORTATION; } } if (mtmp->data != &mons[PM_PESTILENCE]) { nomore(MUSE_POT_FULL_HEALING); if(obj->otyp == POT_FULL_HEALING) { m.defensive = obj; m.has_defense = MUSE_POT_FULL_HEALING; } nomore(MUSE_POT_EXTRA_HEALING); if(obj->otyp == POT_EXTRA_HEALING) { m.defensive = obj; m.has_defense = MUSE_POT_EXTRA_HEALING; } nomore(MUSE_WAN_CREATE_MONSTER); if(obj->otyp == WAN_CREATE_MONSTER && obj->spe > 0) { m.defensive = obj; m.has_defense = MUSE_WAN_CREATE_MONSTER; } nomore(MUSE_WAN_CREATE_HORDE); if(obj->otyp == WAN_CREATE_HORDE && obj->spe > 0) { m.defensive = obj; m.has_defense = MUSE_WAN_CREATE_HORDE; } nomore(MUSE_POT_HEALING); if(obj->otyp == POT_HEALING) { m.defensive = obj; m.has_defense = MUSE_POT_HEALING; } nomore(MUSE_WAN_HEALING); if(obj->otyp == WAN_HEALING && obj->spe > 0) { m.defensive = obj; m.has_defense = MUSE_WAN_HEALING; } nomore(MUSE_WAN_EXTRA_HEALING); if(obj->otyp == WAN_EXTRA_HEALING && obj->spe > 0) { m.defensive = obj; m.has_defense = MUSE_WAN_EXTRA_HEALING; } nomore(MUSE_POT_VAMPIRE_BLOOD); if(is_vampire(mtmp->data) && obj->otyp == POT_VAMPIRE_BLOOD) { m.defensive = obj; m.has_defense = MUSE_POT_VAMPIRE_BLOOD; } } else { /* Pestilence */ nomore(MUSE_POT_FULL_HEALING); if (obj->otyp == POT_SICKNESS) { m.defensive = obj; m.has_defense = MUSE_POT_FULL_HEALING; } nomore(MUSE_WAN_CREATE_MONSTER); if (obj->otyp == WAN_CREATE_MONSTER && obj->spe > 0) { m.defensive = obj; m.has_defense = MUSE_WAN_CREATE_MONSTER; } } nomore(MUSE_SCR_CREATE_MONSTER); if(obj->otyp == SCR_CREATE_MONSTER) { m.defensive = obj; m.has_defense = MUSE_SCR_CREATE_MONSTER; } } botm: return((boolean)(!!m.has_defense)); #undef nomore } /* Perform a defensive action for a monster. Must be called immediately * after find_defensive(). Return values are 0: did something, 1: died, * 2: did something and can't attack again (i.e. teleported). */ int use_defensive(mtmp) struct monst *mtmp; { int i, fleetim, how = 0; struct obj *otmp = m.defensive; boolean vis, vismon, oseen; const char *mcsa = "%s can see again."; if ((i = precheck(mtmp, otmp)) != 0) return i; vis = cansee(mtmp->mx, mtmp->my); vismon = canseemon(mtmp); oseen = otmp && vismon; /* when using defensive choice to run away, we want monster to avoid 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: if (vismon) { if (otmp) pline("%s uses a unicorn horn!", Monnam(mtmp)); else pline_The("tip of %s's horn glows!", mon_nam(mtmp)); } if (!mtmp->mcansee) { mtmp->mcansee = 1; mtmp->mblinded = 0; if (vismon) pline(mcsa, Monnam(mtmp)); } else if (mtmp->mconf || mtmp->mstun) { mtmp->mconf = mtmp->mstun = 0; if (vismon) pline("%s seems steadier now.", Monnam(mtmp)); } else impossible("No need for unicorn horn?"); return 2; case MUSE_BUGLE: if (vismon) pline("%s plays %s!", Monnam(mtmp), doname(otmp)); else if (flags.soundok) You_hear("a bugle playing reveille!"); awaken_soldiers(); return 2; case MUSE_WAN_TELEPORTATION_SELF: if ((mtmp->isshk && inhishop(mtmp)) || mtmp->isgd || mtmp->ispriest) return 2; m_flee(mtmp); mzapmsg(mtmp, otmp, TRUE); otmp->spe--; how = WAN_TELEPORTATION; mon_tele: if (tele_restrict(mtmp)) { /* mysterious force... */ if (vismon && how) /* mentions 'teleport' */ makeknown(how); /* monster learns that teleportation isn't useful here */ if (level.flags.noteleport) mtmp->mtrapseen |= (1 << (TELEP_TRAP-1)); return 2; } if (( #if 0 mon_has_amulet(mtmp) || #endif On_W_tower_level(&u.uz)) && !rn2(3)) { if (vismon) pline("%s seems disoriented for a moment.", Monnam(mtmp)); return 2; } if (oseen && how) makeknown(how); (void) rloc(mtmp, FALSE); return 2; case MUSE_WAN_TELEPORTATION: zap_oseen = oseen; mzapmsg(mtmp, otmp, FALSE); otmp->spe--; m_using = TRUE; mbhit(mtmp,rn1(8,6),mbhitm,bhito,otmp); /* monster learns that teleportation isn't useful here */ if (level.flags.noteleport) mtmp->mtrapseen |= (1 << (TELEP_TRAP-1)); m_using = FALSE; return 2; case MUSE_SCR_TELEPORTATION: { int obj_is_cursed = otmp->cursed; if (mtmp->isshk || mtmp->isgd || mtmp->ispriest) return 2; m_flee(mtmp); mreadmsg(mtmp, otmp); m_useup(mtmp, otmp); /* otmp might be free'ed */ how = SCR_TELEPORTATION; if (obj_is_cursed || mtmp->mconf) { int nlev; d_level flev; if (mon_has_amulet(mtmp) || In_endgame(&u.uz)) { if (vismon) pline("%s seems very disoriented for a moment.", Monnam(mtmp)); return 2; } nlev = random_teleport_level(); if (nlev == depth(&u.uz)) { if (vismon) pline("%s shudders for a moment.", Monnam(mtmp)); return 2; } get_level(&flev, nlev); migrate_to_level(mtmp, ledger_no(&flev), MIGR_RANDOM, (coord *)0); if (oseen) makeknown(SCR_TELEPORTATION); } else goto mon_tele; return 2; } case MUSE_WAN_DIGGING: { struct trap *ttmp; m_flee(mtmp); mzapmsg(mtmp, otmp, FALSE); otmp->spe--; if (oseen) makeknown(WAN_DIGGING); if (IS_FURNITURE(levl[mtmp->mx][mtmp->my].typ) || IS_DRAWBRIDGE(levl[mtmp->mx][mtmp->my].typ) || (is_drawbridge_wall(mtmp->mx, mtmp->my) >= 0) || (sstairs.sx && sstairs.sx == mtmp->mx && sstairs.sy == mtmp->my)) { pline_The("digging ray is ineffective."); return 2; } if (!Can_dig_down(&u.uz)) { if(canseemon(mtmp)) pline_The("%s here is too hard to dig in.", surface(mtmp->mx, mtmp->my)); return 2; } ttmp = maketrap(mtmp->mx, mtmp->my, HOLE); if (!ttmp) return 2; seetrap(ttmp); if (vis) { pline("%s has made a hole in the %s.", Monnam(mtmp), surface(mtmp->mx, mtmp->my)); pline("%s %s through...", Monnam(mtmp), is_flyer(mtmp->data) ? "dives" : "falls"); } else if (flags.soundok) You_hear("%s crash through the %s.", something, surface(mtmp->mx, mtmp->my)); /* we made sure that there is a level for mtmp to go to */ migrate_to_level(mtmp, ledger_no(&u.uz) + 1, MIGR_RANDOM, (coord *)0); return 2; } case MUSE_WAN_CREATE_HORDE: { coord cc; struct permonst *pm=rndmonst(); int cnt = 1; if (!enexto(&cc, mtmp->mx, mtmp->my, pm)) return 0; mzapmsg(mtmp, otmp, FALSE); otmp->spe--; if (oseen) makeknown(WAN_CREATE_HORDE); cnt = rnd(4) + 10; while(cnt--) { struct monst *mon; if (!enexto(&cc, mtmp->mx, mtmp->my, pm)) continue; mon = makemon(rndmonst(), cc.x, cc.y, NO_MM_FLAGS); if (mon) newsym(mon->mx,mon->my); } return 2; } case MUSE_WAN_CREATE_MONSTER: { coord cc; /* pm: 0 => random, eel => aquatic, croc => amphibious */ struct permonst *pm = !is_pool(mtmp->mx, mtmp->my) ? 0 : &mons[u.uinwater ? PM_GIANT_EEL : PM_CROCODILE]; struct monst *mon; if (!enexto(&cc, mtmp->mx, mtmp->my, pm)) return 0; mzapmsg(mtmp, otmp, FALSE); otmp->spe--; mon = makemon((struct permonst *)0, cc.x, cc.y, NO_MM_FLAGS); if (mon && canspotmon(mon) && oseen) makeknown(WAN_CREATE_MONSTER); return 2; } case MUSE_SCR_CREATE_MONSTER: { coord cc; struct permonst *pm = 0, *fish = 0; int cnt = 1; struct monst *mon; boolean known = FALSE; if (!rn2(73)) cnt += rnd(4); if (mtmp->mconf || otmp->cursed) cnt += 12; if (mtmp->mconf) pm = fish = &mons[PM_ACID_BLOB]; else if (is_pool(mtmp->mx, mtmp->my)) fish = &mons[u.uinwater ? PM_GIANT_EEL : PM_CROCODILE]; mreadmsg(mtmp, otmp); while(cnt--) { /* `fish' potentially gives bias towards water locations; `pm' is what to actually create (0 => random) */ if (!enexto(&cc, mtmp->mx, mtmp->my, fish)) break; mon = makemon(pm, cc.x, cc.y, NO_MM_FLAGS); if (mon && canspotmon(mon)) known = TRUE; } /* The only case where we don't use oseen. For wands, you * have to be able to see the monster zap the wand to know * what type it is. For teleport scrolls, you have to see * the monster to know it teleported. */ if (known) makeknown(SCR_CREATE_MONSTER); else if (!objects[SCR_CREATE_MONSTER].oc_name_known && !objects[SCR_CREATE_MONSTER].oc_uname) docall(otmp); m_useup(mtmp, otmp); return 2; } case MUSE_TRAPDOOR: /* trap doors on "bottom" levels of dungeons are rock-drop * trap doors, not holes in the floor. We check here for * safety. */ if (Is_botlevel(&u.uz)) return 0; m_flee(mtmp); if (vis) { struct trap *t; t = t_at(trapx,trapy); 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)); } /* don't use rloc_to() because worm tails must "move" */ remove_monster(mtmp->mx, mtmp->my); newsym(mtmp->mx, mtmp->my); /* update old location */ place_monster(mtmp, trapx, trapy); if (mtmp->wormno) worm_move(mtmp); newsym(trapx, trapy); migrate_to_level(mtmp, ledger_no(&u.uz) + 1, MIGR_RANDOM, (coord *)0); return 2; case MUSE_UPSTAIRS: /* Monsters without amulets escape the dungeon and are * gone for good when they leave up the up stairs. * Monsters with amulets would reach the endlevel, * which we cannot allow since that would leave the * player stranded. */ if (ledger_no(&u.uz) == 1) { if (mon_has_special(mtmp)) return 0; if (vismon) pline("%s escapes the dungeon!", Monnam(mtmp)); mongone(mtmp); return 2; } m_flee(mtmp); if (Inhell && mon_has_amulet(mtmp) && !rn2(4) && (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 chance for a random position on the current level */ migrate_to_level(mtmp, ledger_no(&u.uz) + 1, MIGR_RANDOM, (coord *)0); } else { if (vismon) pline("%s escapes upstairs!", Monnam(mtmp)); migrate_to_level(mtmp, ledger_no(&u.uz) - 1, MIGR_STAIRS_DOWN, (coord *)0); } return 2; case MUSE_DOWNSTAIRS: m_flee(mtmp); if (vismon) pline("%s escapes downstairs!", Monnam(mtmp)); migrate_to_level(mtmp, ledger_no(&u.uz) + 1, MIGR_STAIRS_UP, (coord *)0); return 2; case MUSE_UP_LADDER: m_flee(mtmp); if (vismon) pline("%s escapes up the ladder!", Monnam(mtmp)); migrate_to_level(mtmp, ledger_no(&u.uz) - 1, MIGR_LADDER_DOWN, (coord *)0); return 2; case MUSE_DN_LADDER: m_flee(mtmp); if (vismon) pline("%s escapes down the ladder!", Monnam(mtmp)); migrate_to_level(mtmp, ledger_no(&u.uz) + 1, MIGR_LADDER_UP, (coord *)0); return 2; case MUSE_SSTAIRS: m_flee(mtmp); /* the stairs leading up from the 1st level are */ /* regular stairs, not sstairs. */ if (sstairs.up) { if (vismon) pline("%s escapes upstairs!", Monnam(mtmp)); if(Inhell) { migrate_to_level(mtmp, ledger_no(&sstairs.tolev), MIGR_RANDOM, (coord *)0); return 2; } } else if (vismon) pline("%s escapes downstairs!", Monnam(mtmp)); migrate_to_level(mtmp, ledger_no(&sstairs.tolev), MIGR_SSTAIRS, (coord *)0); return 2; case MUSE_TELEPORT_TRAP: m_flee(mtmp); 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" */ remove_monster(mtmp->mx, mtmp->my); newsym(mtmp->mx, mtmp->my); /* update old location */ place_monster(mtmp, trapx, trapy); if (mtmp->wormno) worm_move(mtmp); newsym(trapx, trapy); goto mon_tele; /* [Tom] */ case MUSE_WAN_HEALING: mzapmsg(mtmp, otmp, TRUE); otmp->spe--; i = d(5,2) + 5 * !!bcsign(otmp); mtmp->mhp += i; if (mtmp->mhp > mtmp->mhpmax) mtmp->mhp = ++mtmp->mhpmax; if (!otmp->cursed) mtmp->mcansee = 1; if (vismon) pline("%s begins to look better.", Monnam(mtmp)); if (oseen) makeknown(WAN_HEALING); return 2; case MUSE_WAN_EXTRA_HEALING: mzapmsg(mtmp, otmp, TRUE); otmp->spe--; i = d(5,4) + 10 * !!bcsign(otmp); mtmp->mhp += i; if (mtmp->mhp > mtmp->mhpmax) mtmp->mhp = ++mtmp->mhpmax; if (!otmp->cursed) mtmp->mcansee = 1; if (vismon) pline("%s begins to look better.", Monnam(mtmp)); if (oseen) makeknown(WAN_EXTRA_HEALING); return 2; case MUSE_POT_HEALING: mquaffmsg(mtmp, otmp); i = d(6 + 2 * bcsign(otmp), 4); mtmp->mhp += i; if (mtmp->mhp > mtmp->mhpmax) mtmp->mhp = ++mtmp->mhpmax; if (!otmp->cursed && !mtmp->mcansee) { mtmp->mcansee = 1; mtmp->mblinded = 0; if (vismon) pline(mcsa, Monnam(mtmp)); } if (vismon) pline("%s looks better.", Monnam(mtmp)); if (oseen) makeknown(POT_HEALING); m_useup(mtmp, otmp); return 2; case MUSE_POT_EXTRA_HEALING: mquaffmsg(mtmp, otmp); i = d(6 + 2 * bcsign(otmp), 8); mtmp->mhp += i; if (mtmp->mhp > mtmp->mhpmax) mtmp->mhp = (mtmp->mhpmax += (otmp->blessed ? 5 : 2)); if (!mtmp->mcansee) { mtmp->mcansee = 1; mtmp->mblinded = 0; if (vismon) pline(mcsa, Monnam(mtmp)); } if (vismon) pline("%s looks much better.", Monnam(mtmp)); if (oseen) makeknown(POT_EXTRA_HEALING); m_useup(mtmp, otmp); return 2; case MUSE_POT_FULL_HEALING: mquaffmsg(mtmp, otmp); if (otmp->otyp == POT_SICKNESS) unbless(otmp); /* Pestilence */ mtmp->mhp = (mtmp->mhpmax += (otmp->blessed ? 8 : 4)); if (!mtmp->mcansee && otmp->otyp != POT_SICKNESS) { mtmp->mcansee = 1; mtmp->mblinded = 0; if (vismon) pline(mcsa, Monnam(mtmp)); } if (vismon) pline("%s looks completely healed.", Monnam(mtmp)); if (oseen) makeknown(otmp->otyp); m_useup(mtmp, otmp); return 2; case MUSE_POT_VAMPIRE_BLOOD: mquaffmsg(mtmp, otmp); if (!otmp->cursed) { i = rnd(8) + rnd(2); mtmp->mhp += i; mtmp->mhpmax += i; if (vismon) pline("%s looks full of life.", Monnam(mtmp)); } else if (vismon) pline("%s discards the congealed blood in disgust.", Monnam(mtmp)); if (oseen) makeknown(POT_VAMPIRE_BLOOD); 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); break; } return 0; #undef m_flee } int rnd_defensive_item(mtmp) struct monst *mtmp; { struct permonst *pm = mtmp->data; int difficulty = monstr[(monsndx(pm))]; int trycnt = 0; if(is_animal(pm) || attacktype(pm, AT_EXPL) || mindless(mtmp->data) || pm->mlet == S_GHOST # ifdef KOPS || pm->mlet == S_KOP # endif ) return 0; try_again: switch (rn2(8 + (difficulty > 3) + (difficulty > 6) + (difficulty > 8))) { case 6: case 9: if (level.flags.noteleport && ++trycnt < 2) goto try_again; if (!rn2(3)) return WAN_TELEPORTATION; /* else FALLTHRU */ case 0: case 1: return SCR_TELEPORTATION; case 8: case 10: if (!rn2(3)) return WAN_CREATE_MONSTER; /* else FALLTHRU */ case 2: return SCR_CREATE_MONSTER; case 3: return POT_HEALING; case 4: return POT_EXTRA_HEALING; case 5: return (mtmp->data != &mons[PM_PESTILENCE]) ? POT_FULL_HEALING : POT_SICKNESS; case 7: if (is_floater(pm) || mtmp->isshk || mtmp->isgd || mtmp->ispriest ) return 0; else return WAN_DIGGING; } /*NOTREACHED*/ return 0; } #define MUSE_WAN_DEATH 1 #define MUSE_WAN_SLEEP 2 #define MUSE_WAN_FIREBALL 3 #define MUSE_WAN_FIRE 4 #define MUSE_WAN_COLD 5 #define MUSE_WAN_LIGHTNING 6 #define MUSE_WAN_MAGIC_MISSILE 7 #define MUSE_WAN_STRIKING 8 #define MUSE_SCR_FIRE 9 #define MUSE_POT_PARALYSIS 10 #define MUSE_POT_BLINDNESS 11 #define MUSE_POT_CONFUSION 12 #define MUSE_POT_SLEEPING 13 #define MUSE_POT_ACID 14 #define MUSE_FROST_HORN 15 #define MUSE_FIRE_HORN 16 #define MUSE_WAN_DRAINING 17 /* KMH */ /*#define MUSE_WAN_TELEPORTATION 18*/ #define MUSE_SCR_EARTH 19 #define MUSE_POT_AMNESIA 20 #define MUSE_WAN_CANCELLATION 21 /* Lethe */ /* Select an offensive item/action for a monster. Returns TRUE iff one is * found. */ boolean find_offensive(mtmp) struct monst *mtmp; { register struct obj *obj; boolean ranged_stuff = lined_up(mtmp); boolean reflection_skip = (Reflecting && rn2(2)); struct obj *helmet = which_armor(mtmp, W_ARMH); m.offensive = (struct obj *)0; m.has_offense = 0; if (mtmp->mpeaceful || is_animal(mtmp->data) || mindless(mtmp->data) || nohands(mtmp->data)) return FALSE; if (u.uswallow) return FALSE; if (in_your_sanctuary(mtmp, 0, 0)) return FALSE; if (dmgtype(mtmp->data, AD_HEAL) && !uwep #ifdef TOURIST && !uarmu #endif && !uarm && !uarmh && !uarms && !uarmg && !uarmc && !uarmf) return FALSE; if (!ranged_stuff) return FALSE; #define nomore(x) if(m.has_offense==x) continue; for(obj=mtmp->minvent; obj; obj=obj->nobj) { /* nomore(MUSE_WAN_DEATH); */ if (!reflection_skip) { if(obj->otyp == WAN_DEATH && obj->spe > 0) { m.offensive = obj; m.has_offense = MUSE_WAN_DEATH; } nomore(MUSE_WAN_SLEEP); if(obj->otyp == WAN_SLEEP && obj->spe > 0 && multi >= 0) { m.offensive = obj; m.has_offense = MUSE_WAN_SLEEP; } /*WAC fixed*/ /* [Tom] doesn't work...*/ nomore(MUSE_WAN_FIREBALL); if(obj->otyp == WAN_FIREBALL && obj->spe > 0) { m.offensive = obj; m.has_offense = MUSE_WAN_FIREBALL; } nomore(MUSE_WAN_FIRE); if(obj->otyp == WAN_FIRE && obj->spe > 0) { m.offensive = obj; m.has_offense = MUSE_WAN_FIRE; } nomore(MUSE_FIRE_HORN); if(obj->otyp == FIRE_HORN && obj->spe > 0) { m.offensive = obj; m.has_offense = MUSE_FIRE_HORN; } nomore(MUSE_WAN_COLD); if(obj->otyp == WAN_COLD && obj->spe > 0) { m.offensive = obj; m.has_offense = MUSE_WAN_COLD; } nomore(MUSE_FROST_HORN); if(obj->otyp == FROST_HORN && obj->spe > 0) { m.offensive = obj; m.has_offense = MUSE_FROST_HORN; } nomore(MUSE_WAN_LIGHTNING); if(obj->otyp == WAN_LIGHTNING && obj->spe > 0) { m.offensive = obj; m.has_offense = MUSE_WAN_LIGHTNING; } nomore(MUSE_WAN_MAGIC_MISSILE); if(obj->otyp == WAN_MAGIC_MISSILE && obj->spe > 0) { m.offensive = obj; m.has_offense = MUSE_WAN_MAGIC_MISSILE; } } nomore(MUSE_WAN_DRAINING); if(obj->otyp == WAN_DRAINING && obj->spe > 0) { m.offensive = obj; m.has_offense = MUSE_WAN_DRAINING; } nomore(MUSE_WAN_STRIKING); if(obj->otyp == WAN_STRIKING && obj->spe > 0) { m.offensive = obj; m.has_offense = MUSE_WAN_STRIKING; } nomore(MUSE_POT_PARALYSIS); if(obj->otyp == POT_PARALYSIS && multi >= 0) { m.offensive = obj; 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; } nomore(MUSE_POT_CONFUSION); if(obj->otyp == POT_CONFUSION) { m.offensive = obj; m.has_offense = MUSE_POT_CONFUSION; } nomore(MUSE_POT_SLEEPING); if(obj->otyp == POT_SLEEPING) { m.offensive = obj; m.has_offense = MUSE_POT_SLEEPING; } /* Mik's Lethe patch - monsters use !oAmnesia */ nomore(MUSE_POT_AMNESIA); if (obj->otyp == POT_AMNESIA) { m.offensive = obj; m.has_offense = MUSE_POT_AMNESIA; } nomore(MUSE_POT_SLEEPING); if(obj->otyp == POT_SLEEPING) { m.offensive = obj; m.has_offense = MUSE_POT_SLEEPING; } /* KMH, balance patch -- monsters use potion of acid */ nomore(MUSE_POT_ACID); if(obj->otyp == POT_ACID) { m.offensive = obj; m.has_offense = MUSE_POT_ACID; } /* we can safely put this scroll here since the locations that * are in a 1 square radius are a subset of the locations that * are in wand range */ nomore(MUSE_SCR_EARTH); if (obj->otyp == SCR_EARTH && ((helmet && is_metallic(helmet)) || mtmp->mconf || amorphous(mtmp->data) || passes_walls(mtmp->data) || noncorporeal(mtmp->data) || unsolid(mtmp->data) || !rn2(10)) && dist2(mtmp->mx,mtmp->my,mtmp->mux,mtmp->muy) <= 2 && mtmp->mcansee && haseyes(mtmp->data) #ifdef REINCARNATION && !Is_rogue_level(&u.uz) #endif && (!In_endgame(&u.uz) || Is_earthlevel(&u.uz))) { m.offensive = obj; m.has_offense = MUSE_SCR_EARTH; } nomore(MUSE_WAN_CANCELLATION); if (obj->otyp == WAN_CANCELLATION && obj->spe > 0) { m.offensive = obj; m.has_offense = MUSE_WAN_CANCELLATION; } #if 0 nomore(MUSE_SCR_FIRE); if (obj->otyp == SCR_FIRE && resists_fire(mtmp) && dist2(mtmp->mx,mtmp->my,mtmp->mux,mtmp->muy) <= 2 && mtmp->mcansee && haseyes(mtmp->data)) { m.offensive = obj; m.has_offense = MUSE_SCR_FIRE; } #endif } return((boolean)(!!m.has_offense)); #undef nomore } STATIC_PTR int mbhitm(mtmp, otmp) register struct monst *mtmp; register struct obj *otmp; { int tmp; boolean reveal_invis = FALSE; if (mtmp != &youmonst) { mtmp->msleeping = 0; if (mtmp->m_ap_type) seemimic(mtmp); } switch(otmp->otyp) { case WAN_STRIKING: reveal_invis = TRUE; if (mtmp == &youmonst) { if (zap_oseen) makeknown(WAN_STRIKING); if (Antimagic) { shieldeff(u.ux, u.uy); pline("Boing!"); } else if (rnd(20) < 10 + u.uac) { pline_The("wand hits you!"); tmp = d(2,12); if(Half_spell_damage) tmp = (tmp+1) / 2; losehp(tmp, "wand", KILLED_BY_AN); } else pline_The("wand misses you."); stop_occupation(); nomul(0); } else if (resists_magm(mtmp)) { shieldeff(mtmp->mx, mtmp->my); pline("Boing!"); } else if (rnd(20) < 10+find_mac(mtmp)) { tmp = d(2,12); hit("wand", mtmp, exclam(tmp)); (void) resist(mtmp, otmp->oclass, tmp, TELL); if (cansee(mtmp->mx, mtmp->my) && zap_oseen) makeknown(WAN_STRIKING); } else { miss("wand", mtmp); if (cansee(mtmp->mx, mtmp->my) && zap_oseen) makeknown(WAN_STRIKING); } break; case WAN_TELEPORTATION: if (mtmp == &youmonst) { if (zap_oseen) makeknown(WAN_TELEPORTATION); tele(); } else { /* for consistency with zap.c, don't identify */ if (mtmp->ispriest && *in_rooms(mtmp->mx, mtmp->my, TEMPLE)) { if (cansee(mtmp->mx, mtmp->my)) pline("%s resists the magic!", Monnam(mtmp)); mtmp->msleeping = 0; if(mtmp->m_ap_type) seemimic(mtmp); } else if (!tele_restrict(mtmp)) (void) rloc(mtmp, FALSE); } break; case WAN_CANCELLATION: case SPE_CANCELLATION: (void) cancel_monst(mtmp, otmp, FALSE, TRUE, FALSE); break; case WAN_DRAINING: /* KMH */ tmp = d(2,6); if (mtmp == &youmonst) { if (Drain_resistance) { shieldeff(u.ux, u.uy); pline("Boing!"); } else losexp("life drainage", FALSE); if (zap_oseen) makeknown(WAN_DRAINING); stop_occupation(); nomul(0); break; } else if (resists_drli(mtmp)) { shieldeff(mtmp->mx, mtmp->my); break; /* skip makeknown */ } else if (!resist(mtmp, otmp->oclass, tmp, NOTELL) && mtmp->mhp > 0) { mtmp->mhpmax -= tmp; if (mtmp->mhpmax <= 0 || mtmp->m_lev <= 0) monkilled(mtmp, "", AD_DRLI); else { mtmp->m_lev--; if (canseemon(mtmp)) { pline("%s suddenly seems weaker!", Monnam(mtmp)); } } } if (cansee(mtmp->mx, mtmp->my) && zap_oseen) makeknown(WAN_DRAINING); break; } if (reveal_invis) { if (mtmp->mhp > 0 && cansee(bhitpos.x,bhitpos.y) && !canspotmon(mtmp)) map_invisible(bhitpos.x, bhitpos.y); } return 0; } /* A modified bhit() for monsters. Based on bhit() in zap.c. Unlike * buzz(), bhit() doesn't take into account the possibility of a monster * zapping you, so we need a special function for it. (Unless someone wants * to merge the two functions...) */ STATIC_OVL void mbhit(mon,range,fhitm,fhito,obj) struct monst *mon; /* monster shooting the wand */ register int range; /* direction and range */ int FDECL((*fhitm),(MONST_P,OBJ_P)); int FDECL((*fhito),(OBJ_P,OBJ_P)); /* fns called when mon/obj hit */ struct obj *obj; /* 2nd arg to fhitm/fhito */ { register struct monst *mtmp; register struct obj *otmp; register uchar typ; int ddx, ddy; bhitpos.x = mon->mx; bhitpos.y = mon->my; u.dx = ddx = sgn(mon->mux - mon->mx); u.dy = ddy = sgn(mon->muy - mon->my); while(range-- > 0) { int x,y; bhitpos.x += ddx; bhitpos.y += ddy; x = bhitpos.x; y = bhitpos.y; if (!isok(x,y)) { bhitpos.x -= ddx; bhitpos.y -= ddy; break; } if (find_drawbridge(&x,&y)) switch (obj->otyp) { case WAN_STRIKING: destroy_drawbridge(x,y); } if(bhitpos.x==u.ux && bhitpos.y==u.uy) { (*fhitm)(&youmonst, obj); range -= 3; } else if(MON_AT(bhitpos.x, bhitpos.y)){ mtmp = m_at(bhitpos.x,bhitpos.y); if (cansee(bhitpos.x,bhitpos.y) && !canspotmon(mtmp)) map_invisible(bhitpos.x, bhitpos.y); (*fhitm)(mtmp, obj); range -= 3; } /* modified by GAN to hit all objects */ if(fhito){ int hitanything = 0; register struct obj *next_obj; for(otmp = level.objects[bhitpos.x][bhitpos.y]; otmp; otmp = next_obj) { /* Fix for polymorph bug, Tim Wright */ next_obj = otmp->nexthere; hitanything += (*fhito)(otmp, obj); } if(hitanything) range--; } typ = levl[bhitpos.x][bhitpos.y].typ; if(IS_DOOR(typ) || typ == SDOOR) { switch (obj->otyp) { /* note: monsters don't use opening or locking magic at present, but keep these as placeholders */ case WAN_OPENING: case WAN_LOCKING: case WAN_STRIKING: if (doorlock(obj, bhitpos.x, bhitpos.y)) { makeknown(obj->otyp); /* if a shop door gets broken, add it to the shk's fix list (no cost to player) */ if (levl[bhitpos.x][bhitpos.y].doormask == D_BROKEN && *in_rooms(bhitpos.x, bhitpos.y, SHOPBASE)) add_damage(bhitpos.x, bhitpos.y, 0L); } break; } } if(!ZAP_POS(typ) || (IS_DOOR(typ) && (levl[bhitpos.x][bhitpos.y].doormask & (D_LOCKED | D_CLOSED))) ) { bhitpos.x -= ddx; bhitpos.y -= ddy; break; } } } /* Perform an offensive action for a monster. Must be called immediately * after find_offensive(). Return values are same as use_defensive(). */ int use_offensive(mtmp) struct monst *mtmp; { int i; struct obj *otmp = m.offensive; boolean oseen; /* offensive potions are not drunk, they're thrown */ if (otmp->oclass != POTION_CLASS && (i = precheck(mtmp, otmp)) != 0) return i; oseen = otmp && canseemon(mtmp); switch(m.has_offense) { case MUSE_WAN_DEATH: case MUSE_WAN_SLEEP: /*WAC reactivate*/ case MUSE_WAN_FIREBALL: case MUSE_WAN_FIRE: case MUSE_WAN_COLD: case MUSE_WAN_LIGHTNING: case MUSE_WAN_MAGIC_MISSILE: mzapmsg(mtmp, otmp, FALSE); otmp->spe--; if (oseen) makeknown(otmp->otyp); m_using = TRUE; /*WAC Handled later if (otmp->otyp == WAN_FIREBALL) { buzz((int) -10 - SPE_FIREBALL - SPE_MAGIC_MISSILE, rn2(2)+3, mtmp->mx, mtmp->my, sgn(mtmp->mux-mtmp->mx), sgn(mtmp->muy-mtmp->my)); } else { */ buzz((int)(-30 - (otmp->otyp - WAN_MAGIC_MISSILE)), (otmp->otyp == WAN_MAGIC_MISSILE) ? 2 : 6, mtmp->mx, mtmp->my, sgn(mtmp->mux-mtmp->mx), sgn(mtmp->muy-mtmp->my)); m_using = FALSE; /* }*/ return (mtmp->mhp <= 0) ? 1 : 2; case MUSE_FIRE_HORN: case MUSE_FROST_HORN: if (oseen) { makeknown(otmp->otyp); pline("%s plays a %s!", Monnam(mtmp), xname(otmp)); } else You_hear("a horn being played."); otmp->spe--; m_using = TRUE; buzz(-30 - ((otmp->otyp==FROST_HORN) ? AD_COLD-1 : AD_FIRE-1), rn1(6,6), mtmp->mx, mtmp->my, sgn(mtmp->mux-mtmp->mx), sgn(mtmp->muy-mtmp->my)); m_using = FALSE; return (mtmp->mhp <= 0) ? 1 : 2; /* case MUSE_WAN_TELEPORTATION:*/ case MUSE_WAN_STRIKING: case MUSE_WAN_DRAINING: /* KMH */ case MUSE_WAN_CANCELLATION: /* Lethe */ zap_oseen = oseen; mzapmsg(mtmp, otmp, FALSE); otmp->spe--; m_using = TRUE; mbhit(mtmp,rn1(8,6),mbhitm,bhito,otmp); m_using = FALSE; return 2; case MUSE_SCR_EARTH: { /* TODO: handle steeds */ register int x, y; /* don't use monster fields after killing it */ boolean confused = (mtmp->mconf ? TRUE : FALSE); int mmx = mtmp->mx, mmy = mtmp->my; mreadmsg(mtmp, otmp); /* Identify the scroll */ if (canspotmon(mtmp)) { pline_The("%s rumbles %s %s!", ceiling(mtmp->mx, mtmp->my), otmp->blessed ? "around" : "above", mon_nam(mtmp)); if (oseen) makeknown(otmp->otyp); } else if (cansee(mtmp->mx, mtmp->my)) { pline_The("%s rumbles in the middle of nowhere!", ceiling(mtmp->mx, mtmp->my)); if (mtmp->minvis) map_invisible(mtmp->mx, mtmp->my); if (oseen) makeknown(otmp->otyp); } /* Loop through the surrounding squares */ for (x = mmx-1; x <= mmx+1; x++) { for (y = mmy-1; y <= mmy+1; y++) { /* Is this a suitable spot? */ if (isok(x, y) && !closed_door(x, y) && !IS_ROCK(levl[x][y].typ) && !IS_AIR(levl[x][y].typ) && (((x == mmx) && (y == mmy)) ? !otmp->blessed : !otmp->cursed) && (x != u.ux || y != u.uy)) { register struct obj *otmp2; register struct monst *mtmp2; /* Make the object(s) */ otmp2 = mksobj(confused ? ROCK : BOULDER, FALSE, FALSE); if (!otmp2) continue; /* Shouldn't happen */ otmp2->quan = confused ? rn1(5,2) : 1; otmp2->owt = weight(otmp2); /* Find the monster here (might be same as mtmp) */ mtmp2 = m_at(x, y); if (mtmp2 && !amorphous(mtmp2->data) && !passes_walls(mtmp2->data) && !noncorporeal(mtmp2->data) && !unsolid(mtmp2->data)) { struct obj *helmet = which_armor(mtmp2, W_ARMH); int mdmg; if (cansee(mtmp2->mx, mtmp2->my)) { pline("%s is hit by %s!", Monnam(mtmp2), doname(otmp2)); if (mtmp2->minvis && !canspotmon(mtmp2)) map_invisible(mtmp2->mx, mtmp2->my); } mdmg = dmgval(otmp2, mtmp2) * otmp2->quan; if (helmet) { if(is_metallic(helmet)) { if (canspotmon(mtmp2)) pline("Fortunately, %s is wearing a hard helmet.", mon_nam(mtmp2)); else if (flags.soundok) You_hear("a clanging sound."); if (mdmg > 2) mdmg = 2; } else { if (canspotmon(mtmp2)) pline("%s's %s does not protect %s.", Monnam(mtmp2), xname(helmet), mhim(mtmp2)); } } mtmp2->mhp -= mdmg; if (mtmp2->mhp <= 0) { pline("%s is killed.", Monnam(mtmp2)); mondied(mtmp2); } } /* Drop the rock/boulder to the floor */ if (!flooreffects(otmp2, x, y, "fall")) { place_object(otmp2, x, y); stackobj(otmp2); newsym(x, y); /* map the rock */ } } } } m_useup(mtmp, otmp); /* Attack the player */ if (distmin(mmx, mmy, u.ux, u.uy) == 1 && !otmp->cursed) { int dmg; struct obj *otmp2; /* Okay, _you_ write this without repeating the code */ otmp2 = mksobj(confused ? ROCK : BOULDER, FALSE, FALSE); if (!otmp2) goto xxx_noobj; /* Shouldn't happen */ otmp2->quan = confused ? rn1(5,2) : 1; otmp2->owt = weight(otmp2); if (!amorphous(youmonst.data) && !Passes_walls && !noncorporeal(youmonst.data) && !unsolid(youmonst.data)) { You("are hit by %s!", doname(otmp2)); dmg = dmgval(otmp2, &youmonst) * otmp2->quan; if (uarmh) { if(is_metallic(uarmh)) { pline("Fortunately, you are wearing a hard helmet."); if (dmg > 2) dmg = 2; } else if (flags.verbose) { Your("%s does not protect you.", xname(uarmh)); } } } else dmg = 0; if (!flooreffects(otmp2, u.ux, u.uy, "fall")) { place_object(otmp2, u.ux, u.uy); stackobj(otmp2); newsym(u.ux, u.uy); } if (dmg) losehp(dmg, "scroll of earth", KILLED_BY_AN); } xxx_noobj: return (mtmp->mhp <= 0) ? 1 : 2; } #if 0 case MUSE_SCR_FIRE: { boolean vis = cansee(mtmp->mx, mtmp->my); mreadmsg(mtmp, otmp); if (mtmp->mconf) { if (vis) pline("Oh, what a pretty fire!"); } else { struct monst *mtmp2; int num; if (vis) pline_The("scroll erupts in a tower of flame!"); shieldeff(mtmp->mx, mtmp->my); pline("%s is uninjured.", Monnam(mtmp)); (void) destroy_mitem(mtmp, SCROLL_CLASS, AD_FIRE); (void) destroy_mitem(mtmp, SPBOOK_CLASS, AD_FIRE); (void) destroy_mitem(mtmp, POTION_CLASS, AD_FIRE); num = (2*(rn1(3, 3) + 2 * bcsign(otmp)) + 1)/3; if (Slimed) { Your("slimy parts are burned away!"); Slimed = 0; } if (Fire_resistance) You("are not harmed."); burn_away_slime(); if (Half_spell_damage) num = (num+1) / 2; else losehp(num, "scroll of fire", KILLED_BY_AN); for(mtmp2 = fmon; mtmp2; mtmp2 = mtmp2->nmon) { if(DEADMONSTER(mtmp2)) continue; if(mtmp == mtmp2) continue; if(dist2(mtmp2->mx,mtmp2->my,mtmp->mx,mtmp->my) < 3){ if (resists_fire(mtmp2)) continue; mtmp2->mhp -= num; if (resists_cold(mtmp2)) mtmp2->mhp -= 3*num; if(mtmp2->mhp < 1) { mondied(mtmp2); break; } } } } return 2; } #endif /* 0 */ case MUSE_POT_PARALYSIS: case MUSE_POT_BLINDNESS: case MUSE_POT_CONFUSION: case MUSE_POT_SLEEPING: case MUSE_POT_ACID: case MUSE_POT_AMNESIA: /* Note: this setting of dknown doesn't suffice. A monster * which is out of sight might throw and it hits something _in_ * sight, a problem not existing with wands because wand rays * are not objects. Also set dknown in mthrowu.c. */ if (cansee(mtmp->mx, mtmp->my)) { otmp->dknown = 1; pline("%s hurls %s!", Monnam(mtmp), singular(otmp, doname)); } m_throw(mtmp, mtmp->mx, mtmp->my, sgn(mtmp->mux-mtmp->mx), sgn(mtmp->muy-mtmp->my), distmin(mtmp->mx,mtmp->my,mtmp->mux,mtmp->muy), otmp); return 2; case 0: return 0; /* i.e. an exploded wand */ default: impossible("%s wanted to perform action %d?", Monnam(mtmp), m.has_offense); break; } return 0; } int rnd_offensive_item(mtmp) struct monst *mtmp; { struct permonst *pm = mtmp->data; int difficulty = monstr[(monsndx(pm))]; if(is_animal(pm) || attacktype(pm, AT_EXPL) || mindless(mtmp->data) || pm->mlet == S_GHOST # ifdef KOPS || pm->mlet == S_KOP # endif ) return 0; if (difficulty > 7 && !rn2(35)) return WAN_DEATH; if (difficulty > 6 && !rn2(25)) return WAN_FIREBALL; switch (rn2(9 - (difficulty < 4) + 4 * (difficulty > 6))) { case 0: { struct obj *helmet = which_armor(mtmp, W_ARMH); if ((helmet && is_metallic(helmet)) || amorphous(pm) || passes_walls(pm) || noncorporeal(pm) || unsolid(pm)) return SCR_EARTH; } /* fall through */ case 1: return WAN_STRIKING; case 2: return POT_ACID; case 3: return POT_CONFUSION; case 4: return POT_BLINDNESS; case 5: return POT_SLEEPING; case 6: return POT_PARALYSIS; case 7: return WAN_MAGIC_MISSILE; case 8: return WAN_SLEEP; case 9: return WAN_FIRE; case 10: return WAN_COLD; case 11: return WAN_LIGHTNING; case 12: return WAN_DRAINING; } /*NOTREACHED*/ return 0; } #define MUSE_POT_GAIN_LEVEL 1 #define MUSE_WAN_MAKE_INVISIBLE 2 #define MUSE_POT_INVISIBILITY 3 #define MUSE_POLY_TRAP 4 #define MUSE_WAN_POLYMORPH 5 #define MUSE_POT_SPEED 6 #define MUSE_WAN_SPEED_MONSTER 7 #define MUSE_BULLWHIP 8 #define MUSE_POT_POLYMORPH 9 boolean find_misc(mtmp) struct monst *mtmp; { register struct obj *obj; struct permonst *mdat = mtmp->data; int x = mtmp->mx, y = mtmp->my; struct trap *t; int xx, yy; #ifdef STEED boolean immobile = (mdat->mmove == 0 || mtmp == u.usteed); #else boolean immobile = (mdat->mmove == 0); #endif boolean stuck = (mtmp == u.ustuck); m.misc = (struct obj *)0; m.has_misc = 0; if (is_animal(mdat) || mindless(mdat)) return 0; if (u.uswallow && stuck) return FALSE; /* We arbitrarily limit to times when a player is nearby for the * same reason as Junior Pac-Man doesn't have energizers eaten until * you can see them... */ if(dist2(x, y, mtmp->mux, mtmp->muy) > 36) return FALSE; if (!stuck && !immobile && !mtmp->cham && monstr[monsndx(mdat)] < 6) { boolean ignore_boulders = (verysmall(mdat) || throws_rocks(mdat) || passes_walls(mdat)); for(xx = x-1; xx <= x+1; xx++) for(yy = y-1; yy <= y+1; yy++) if (isok(xx,yy) && (xx != u.ux || yy != u.uy)) if (mdat != &mons[PM_GRID_BUG] || xx == x || yy == y) if (/* (xx==x && yy==y) || */ !level.monsters[xx][yy]) if ((t = t_at(xx, yy)) != 0 && (ignore_boulders || !sobj_at(BOULDER, xx, yy)) && !onscary(xx, yy, mtmp)) { if (t->ttyp == POLY_TRAP) { trapx = xx; trapy = yy; m.has_misc = MUSE_POLY_TRAP; return TRUE; } } } if (nohands(mdat)) return 0; #define nomore(x) if(m.has_misc==x) continue; for(obj=mtmp->minvent; obj; obj=obj->nobj) { /* Monsters shouldn't recognize cursed items; this kludge is */ /* necessary to prevent serious problems though... */ if(obj->otyp == POT_GAIN_LEVEL && (!obj->cursed || (!mtmp->isgd && !mtmp->isshk && !mtmp->ispriest))) { m.misc = obj; m.has_misc = MUSE_POT_GAIN_LEVEL; } nomore(MUSE_BULLWHIP); /* WAC kludge here so monsters don't attempt to grab cursed weapon */ if(obj->otyp == BULLWHIP && (MON_WEP(mtmp) == obj) && distu(mtmp->mx,mtmp->my)==1 && uwep && !uwep->cursed && !mtmp->mpeaceful) { m.misc = obj; m.has_misc = MUSE_BULLWHIP; } /* Note: peaceful/tame monsters won't make themselves * invisible unless you can see them. Not really right, but... */ nomore(MUSE_WAN_MAKE_INVISIBLE); 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; } nomore(MUSE_POT_INVISIBILITY); 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; } nomore(MUSE_WAN_SPEED_MONSTER); if(obj->otyp == WAN_SPEED_MONSTER && obj->spe > 0 && mtmp->mspeed != MFAST && !mtmp->isgd) { m.misc = obj; m.has_misc = MUSE_WAN_SPEED_MONSTER; } nomore(MUSE_POT_SPEED); if(obj->otyp == POT_SPEED && mtmp->mspeed != MFAST && !mtmp->isgd) { m.misc = obj; m.has_misc = MUSE_POT_SPEED; } nomore(MUSE_WAN_POLYMORPH); if(obj->otyp == WAN_POLYMORPH && obj->spe > 0 && !mtmp->cham && monstr[monsndx(mdat)] < 6) { m.misc = obj; m.has_misc = MUSE_WAN_POLYMORPH; } nomore(MUSE_POT_POLYMORPH); if(obj->otyp == POT_POLYMORPH && !mtmp->cham && monstr[monsndx(mdat)] < 6) { m.misc = obj; m.has_misc = MUSE_POT_POLYMORPH; } } return((boolean)(!!m.has_misc)); #undef nomore } #if 0 /* 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(); } #endif int use_misc(mtmp) struct monst *mtmp; { int i; struct obj *otmp = m.misc; boolean vis, vismon, oseen; char nambuf[BUFSZ]; if ((i = precheck(mtmp, otmp)) != 0) return i; vis = cansee(mtmp->mx, mtmp->my); vismon = canseemon(mtmp); oseen = otmp && vismon; switch(m.has_misc) { case MUSE_POT_GAIN_LEVEL: mquaffmsg(mtmp, otmp); if (otmp->cursed) { if (Can_rise_up(mtmp->mx, mtmp->my, &u.uz)) { register int tolev = depth(&u.uz)-1; d_level tolevel; get_level(&tolevel, tolev); /* insurance against future changes... */ if(on_level(&tolevel, &u.uz)) goto skipmsg; if (vismon) { pline("%s rises up, through the %s!", Monnam(mtmp), ceiling(mtmp->mx, mtmp->my)); if(!objects[POT_GAIN_LEVEL].oc_name_known && !objects[POT_GAIN_LEVEL].oc_uname) docall(otmp); } m_useup(mtmp, otmp); migrate_to_level(mtmp, ledger_no(&tolevel), MIGR_RANDOM, (coord *)0); return 2; } else { skipmsg: if (vismon) { pline("%s looks uneasy.", Monnam(mtmp)); if(!objects[POT_GAIN_LEVEL].oc_name_known && !objects[POT_GAIN_LEVEL].oc_uname) docall(otmp); } m_useup(mtmp, otmp); return 2; } } if (vismon) pline("%s seems more experienced.", Monnam(mtmp)); if (oseen) makeknown(POT_GAIN_LEVEL); m_useup(mtmp, otmp); if (!grow_up(mtmp,(struct monst *)0)) return 1; /* grew into genocided monster */ return 2; case MUSE_WAN_MAKE_INVISIBLE: case MUSE_POT_INVISIBILITY: if (otmp->otyp == WAN_MAKE_INVISIBLE) { mzapmsg(mtmp, otmp, TRUE); otmp->spe--; } else mquaffmsg(mtmp, otmp); /* format monster's name before altering its visibility */ Strcpy(nambuf, See_invisible ? Monnam(mtmp) : mon_nam(mtmp)); mon_set_minvis(mtmp); if (vismon && mtmp->minvis) { /* was seen, now invisible */ if (See_invisible) pline("%s body takes on a %s transparency.", s_suffix(nambuf), Hallucination ? "normal" : "strange"); else pline("Suddenly you cannot see %s.", nambuf); if (oseen) makeknown(otmp->otyp); } if (otmp->otyp == POT_INVISIBILITY) { if (otmp->cursed) you_aggravate(mtmp); m_useup(mtmp, otmp); } return 2; 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); /* note difference in potion effect due to substantially 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--; #if 0 (void) newcham(mtmp, muse_newcham_mon(), TRUE, vismon); #else (void) mon_poly(mtmp, FALSE, "%s changes!"); #endif if (oseen) makeknown(WAN_POLYMORPH); return 2; case MUSE_POT_POLYMORPH: mquaffmsg(mtmp, otmp); #if 0 if (vismon) pline("%s suddenly mutates!", Monnam(mtmp)); (void) newcham(mtmp, muse_newcham_mon(mtmp), FALSE, vismon); #else (void) mon_poly(mtmp, FALSE, "%s suddenly mutates!"); #endif if (oseen) makeknown(POT_POLYMORPH); m_useup(mtmp, otmp); return 2; case MUSE_POLY_TRAP: if (vismon) pline("%s deliberately %s onto a polymorph trap!", Monnam(mtmp), makeplural(locomotion(mtmp->data, "jump"))); if (vis) seetrap(t_at(trapx,trapy)); /* don't use rloc() due to worms */ remove_monster(mtmp->mx, mtmp->my); newsym(mtmp->mx, mtmp->my); place_monster(mtmp, trapx, trapy); if (mtmp->wormno) worm_move(mtmp); newsym(trapx, trapy); #if 0 (void) newcham(mtmp, (struct permonst *)0, FALSE, vismon); #else (void) mon_poly(mtmp, FALSE, "%s changes!"); #endif return 2; case MUSE_BULLWHIP: /* attempt to disarm hero */ if (uwep && !rn2(5)) { const char *The_whip = vismon ? "The bullwhip" : "A whip"; int where_to = rn2(4); struct obj *obj = uwep; const char *hand; char the_weapon[BUFSZ]; Strcpy(the_weapon, the(xname(obj))); hand = body_part(HAND); if (bimanual(obj)) hand = makeplural(hand); if (vismon) pline("%s flicks a bullwhip towards your %s!", Monnam(mtmp), hand); if (obj->otyp == HEAVY_IRON_BALL) { pline("%s fails to wrap around %s.", The_whip, the_weapon); return 1; } 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(); switch (where_to) { case 1: /* onto floor beneath mon */ pline("%s yanks %s from your %s!", Monnam(mtmp), the_weapon, hand); place_object(obj, mtmp->mx, mtmp->my); break; case 2: /* onto floor beneath you */ pline("%s yanks %s to the %s!", Monnam(mtmp), the_weapon, surface(u.ux, u.uy)); dropy(obj); break; case 3: /* into mon's inventory */ pline("%s snatches %s!", Monnam(mtmp), the_weapon); (void) mpickobj(mtmp,obj); break; } return 1; } return 0; case 0: return 0; /* i.e. an exploded wand */ default: impossible("%s wanted to perform action %d?", Monnam(mtmp), m.has_misc); break; } return 0; } STATIC_OVL void you_aggravate(mtmp) struct monst *mtmp; { pline("For some reason, %s presence is known to you.", s_suffix(noit_mon_nam(mtmp))); cls(); #ifdef CLIPPING cliparound(mtmp->mx, mtmp->my); #endif show_glyph(mtmp->mx, mtmp->my, mon_to_glyph(mtmp)); display_self(); You_feel("aggravated at %s.", noit_mon_nam(mtmp)); display_nhwindow(WIN_MAP, TRUE); docrt(); if (unconscious()) { multi = -1; nomovemsg = "Aggravated, you are jolted into full consciousness."; } newsym(mtmp->mx,mtmp->my); if (!canspotmon(mtmp)) map_invisible(mtmp->mx, mtmp->my); } int rnd_misc_item(mtmp) struct monst *mtmp; { struct permonst *pm = mtmp->data; int difficulty = monstr[(monsndx(pm))]; if(is_animal(pm) || attacktype(pm, AT_EXPL) || mindless(mtmp->data) || pm->mlet == S_GHOST # ifdef KOPS || pm->mlet == S_KOP # endif ) return 0; /* Unlike other rnd_item functions, we only allow _weak_ monsters * to have this item; after all, the item will be used to strengthen * the monster and strong monsters won't use it at all... */ if (difficulty < 6 && !rn2(30)) return rn2(6) ? POT_POLYMORPH : WAN_POLYMORPH; if (!rn2(40) && !nonliving(pm)) return AMULET_OF_LIFE_SAVING; switch (rn2(3)) { case 0: if (mtmp->isgd) return 0; return rn2(6) ? POT_SPEED : WAN_SPEED_MONSTER; case 1: if (mtmp->mpeaceful && !See_invisible) return 0; return rn2(6) ? POT_INVISIBILITY : WAN_MAKE_INVISIBLE; case 2: return POT_GAIN_LEVEL; } /*NOTREACHED*/ return 0; } boolean searches_for_item(mon, obj) struct monst *mon; struct obj *obj; { int typ = obj->otyp; if (is_animal(mon->data) || mindless(mon->data) || mon->data == &mons[PM_GHOST]) /* don't loot bones piles */ 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) return (boolean)(monstr[monsndx(mon->data)] < 6); if (objects[typ].oc_dir == RAY || typ == WAN_STRIKING || typ == WAN_TELEPORTATION || typ == WAN_CREATE_MONSTER || typ == WAN_CREATE_HORDE || typ == WAN_DRAINING || typ == WAN_HEALING || typ == WAN_EXTRA_HEALING || typ == WAN_CANCELLATION) return TRUE; break; case POTION_CLASS: if (typ == POT_VAMPIRE_BLOOD) return is_vampire(mon->data); if (typ == POT_HEALING || typ == POT_EXTRA_HEALING || typ == POT_FULL_HEALING || typ == POT_POLYMORPH || typ == POT_GAIN_LEVEL || typ == POT_PARALYSIS || typ == POT_SLEEPING || typ == POT_ACID || typ == POT_CONFUSION || typ == POT_AMNESIA) 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 || typ == SCR_EARTH) return TRUE; break; case AMULET_CLASS: if (typ == AMULET_OF_LIFE_SAVING) return (boolean)(!nonliving(mon->data)); if (typ == AMULET_OF_REFLECTION) return TRUE; break; case TOOL_CLASS: if (typ == PICK_AXE) return (boolean)needspick(mon->data); if (typ == UNICORN_HORN) return (boolean)(!obj->cursed && !is_unicorn(mon->data)); if (typ == FROST_HORN || typ == FIRE_HORN) return (obj->spe > 0); if (is_weptool(obj)) return (boolean)likes_objs(mon->data); break; case FOOD_CLASS: if (typ == CORPSE) return (boolean)(((mon->misc_worn_check & W_ARMG) && 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; default: break; } return FALSE; } boolean mon_reflects(mon,str) struct monst *mon; const char *str; { struct obj *orefl = which_armor(mon, W_ARMS); if (orefl && orefl->otyp == SHIELD_OF_REFLECTION) { if (str) { pline(str, s_suffix(mon_nam(mon)), "shield"); makeknown(SHIELD_OF_REFLECTION); } return TRUE; } else if (arti_reflects(MON_WEP(mon))) { /* due to wielded artifact weapon */ if (str) pline(str, s_suffix(mon_nam(mon)), "weapon"); return TRUE; } else if ((orefl = which_armor(mon, W_AMUL)) && orefl->otyp == AMULET_OF_REFLECTION) { if (str) { pline(str, s_suffix(mon_nam(mon)), "amulet"); makeknown(AMULET_OF_REFLECTION); } return TRUE; } else if (mon->data == &mons[PM_NIGHTMARE]) { pline(str,s_suffix(mon_nam(mon)),"horn"); return TRUE; } else if ((orefl = which_armor(mon, W_ARM)) && (orefl->otyp == SILVER_DRAGON_SCALES || orefl->otyp == SILVER_DRAGON_SCALE_MAIL)) { 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"); return TRUE; } else if (mon->data == &mons[PM_DIAMOND_GOLEM] || mon->data == &mons[PM_SAPPHIRE_GOLEM] || mon->data == &mons[PM_CRYSTAL_GOLEM]) { /* Some of the higher golems have intrinsic reflection */ if (str) pline(str, s_suffix(mon_nam(mon)), "body"); return TRUE; } return FALSE; } boolean ureflects (fmt, str) const char *fmt, *str; { /* Check from outermost to innermost objects */ if (EReflecting & W_ARMS) { if (fmt && str) { pline(fmt, str, "shield"); makeknown(SHIELD_OF_REFLECTION); } return TRUE; } else if (EReflecting & W_WEP) { /* Due to wielded artifact weapon */ if (fmt && str) pline(fmt, str, "weapon"); return TRUE; } else if (EReflecting & W_AMUL) { if (fmt && str) { pline(fmt, str, "medallion"); makeknown(AMULET_OF_REFLECTION); } return TRUE; } else if (EReflecting & W_ARM) { if (fmt && str) pline(fmt, str, "armor"); return TRUE; } else if (youmonst.data == &mons[PM_SILVER_DRAGON]) { if (fmt && str) pline(fmt, str, "scales"); return TRUE; } else if (youmonst.data == &mons[PM_DIAMOND_GOLEM] || youmonst.data == &mons[PM_SAPPHIRE_GOLEM] || youmonst.data == &mons[PM_CRYSTAL_GOLEM]) { if (fmt && str) pline(fmt, str, "body"); return TRUE; } return FALSE; } /* TRUE if the monster ate something */ boolean munstone(mon, by_you) struct monst *mon; boolean by_you; { struct obj *obj; if (resists_ston(mon)) return FALSE; if (mon->meating || !mon->mcanmove || mon->msleeping) return FALSE; 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 */ /* give a " is slowing down" message and also remove intrinsic speed (comparable to similar effect on the hero) */ mon_adjust_speed(mon, -3, (struct obj *)0); 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*/ slashem-0.0.7E7F3/src/pager.c0000664000076400007640000007103110545462317013707 0ustar aliali/* SCCS Id: @(#)pager.c 3.4 2003/08/13 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ /* This file contains the command routines dowhatis() and dohelp() and */ /* a few other help related facilities */ #include "hack.h" #include "dlb.h" STATIC_DCL boolean FDECL(is_swallow_sym, (int)); STATIC_DCL int FDECL(append_str, (char *, const char *)); STATIC_DCL struct permonst * FDECL(lookat, (int, int, char *, char *)); STATIC_DCL void FDECL(checkfile, (char *,struct permonst *,BOOLEAN_P,BOOLEAN_P)); STATIC_DCL int FDECL(do_look, (BOOLEAN_P)); STATIC_DCL boolean FDECL(help_menu, (int *)); #ifdef PORT_HELP extern void NDECL(port_help); #endif /* Returns "true" for characters that could represent a monster's stomach. */ STATIC_OVL boolean is_swallow_sym(c) int c; { int i; for (i = S_sw_tl; i <= S_sw_br; i++) if ((int)showsyms[i] == c) return TRUE; return FALSE; } /* * Append new_str to the end of buf if new_str doesn't already exist as * a substring of buf. Return 1 if the string was appended, 0 otherwise. * It is expected that buf is of size BUFSZ. */ STATIC_OVL int append_str(buf, new_str) char *buf; const char *new_str; { int space_left; /* space remaining in buf */ if (strstri(buf, new_str)) return 0; space_left = BUFSZ - strlen(buf) - 1; (void) strncat(buf, " or ", space_left); (void) strncat(buf, new_str, space_left - 4); return 1; } /* * Return the name of the glyph found at (x,y). * If not hallucinating and the glyph is a monster, also monster data. */ STATIC_OVL struct permonst * lookat(x, y, buf, monbuf) int x, y; char *buf, *monbuf; { register struct monst *mtmp = (struct monst *) 0; struct permonst *pm = (struct permonst *) 0; int glyph; buf[0] = monbuf[0] = 0; glyph = glyph_at(x,y); if (u.ux == x && u.uy == y && senseself()) { char race[QBUFSZ]; /* if not polymorphed, show both the role and the race */ race[0] = 0; if (!Upolyd) { Sprintf(race, "%s ", urace.adj); } Sprintf(buf, "%s%s%s called %s", Invis ? "invisible " : "", race, mons[u.umonnum].mname, plname); /* file lookup can't distinguish between "gnomish wizard" monster and correspondingly named player character, always picking the former; force it to find the general "wizard" entry instead */ if (Role_if(PM_WIZARD) && Race_if(PM_GNOME) && !Upolyd) pm = &mons[PM_WIZARD]; #if 0 char race[QBUFSZ], role[QBUFSZ]; /* if not polymorphed, show both the role and the race */ role[0] = 0; race[0] = 0; if (!Upolyd) { Sprintf(race, "%s ", urace.adj); Sprintf(role, "%s ", urole.name); } else Sprintf(race, "%s ", mons[u.umonnum].mname); Sprintf(buf, "%s%s%s called %s", Invis ? "invisible " : "", race, role, plname); #endif #ifdef STEED if (u.usteed) { char steedbuf[BUFSZ]; Sprintf(steedbuf, ", mounted on %s", y_monnam(u.usteed)); /* assert((sizeof buf >= strlen(buf)+strlen(steedbuf)+1); */ Strcat(buf, steedbuf); } #endif /* When you see yourself normally, no explanation is appended (even if you could also see yourself via other means). Sensing self while blind or swallowed is treated as if it were by normal vision (cf canseeself()). */ if ((Invisible || u.uundetected) && !Blind && !u.uswallow) { unsigned how = 0; if (Infravision) how |= 1; if (Unblind_telepat) how |= 2; if (Detect_monsters) how |= 4; if (how) Sprintf(eos(buf), " [seen: %s%s%s%s%s]", (how & 1) ? "infravision" : "", /* add comma if telep and infrav */ ((how & 3) > 2) ? ", " : "", (how & 2) ? "telepathy" : "", /* add comma if detect and (infrav or telep or both) */ ((how & 7) > 4) ? ", " : "", (how & 4) ? "monster detection" : ""); } } else if (u.uswallow) { /* all locations when swallowed other than the hero are the monster */ Sprintf(buf, "interior of %s", Blind ? "a monster" : a_monnam(u.ustuck)); pm = u.ustuck->data; } else if (glyph_is_monster(glyph)) { 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"); if (mtmp->mleashed) Strcat(buf, ", leashed to you"); if (mtmp->mtrapped && cansee(mtmp->mx, mtmp->my)) { struct trap *t = t_at(mtmp->mx, mtmp->my); int tt = t ? t->ttyp : NO_TRAP; /* newsym lets you know of the trap, so mention it here */ if (tt == BEAR_TRAP || tt == PIT || tt == SPIKED_PIT || tt == WEB) Sprintf(eos(buf), ", trapped in %s", an(defsyms[trap_to_defsym(tt)].explanation)); } { int ways_seen = 0, normal = 0, xraydist; boolean useemon = (boolean) canseemon(mtmp); xraydist = (u.xray_range<0) ? -1 : u.xray_range * u.xray_range; /* normal vision */ if ((mtmp->wormno ? worm_known(mtmp) : cansee(mtmp->mx, mtmp->my)) && mon_visible(mtmp) && !mtmp->minvis) { ways_seen++; normal++; } /* see invisible */ if (useemon && mtmp->minvis) ways_seen++; /* infravision */ if ((!mtmp->minvis || See_invisible) && see_with_infrared(mtmp)) ways_seen++; /* telepathy */ if (tp_sensemon(mtmp)) ways_seen++; /* xray */ if (useemon && xraydist > 0 && distu(mtmp->mx, mtmp->my) <= xraydist) ways_seen++; if (Detect_monsters) ways_seen++; if (MATCH_WARN_OF_MON(mtmp)) ways_seen++; if (ways_seen > 1 || !normal) { if (normal) { Strcat(monbuf, "normal vision"); /* can't actually be 1 yet here */ if (ways_seen-- > 1) Strcat(monbuf, ", "); } if (useemon && mtmp->minvis) { Strcat(monbuf, "see invisible"); if (ways_seen-- > 1) Strcat(monbuf, ", "); } if ((!mtmp->minvis || See_invisible) && see_with_infrared(mtmp)) { Strcat(monbuf, "infravision"); if (ways_seen-- > 1) Strcat(monbuf, ", "); } if (tp_sensemon(mtmp)) { Strcat(monbuf, "telepathy"); if (ways_seen-- > 1) Strcat(monbuf, ", "); } if (useemon && xraydist > 0 && distu(mtmp->mx, mtmp->my) <= xraydist) { /* Eyes of the Overworld */ Strcat(monbuf, "astral vision"); if (ways_seen-- > 1) Strcat(monbuf, ", "); } if (Detect_monsters) { Strcat(monbuf, "monster detection"); if (ways_seen-- > 1) Strcat(monbuf, ", "); } 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, ", "); } } } } } else if (glyph_is_object(glyph)) { struct obj *otmp = vobj_at(x,y); if (!otmp || otmp->otyp != glyph_to_obj(glyph)) { if (glyph_to_obj(glyph) != STRANGE_OBJECT) { otmp = mksobj(glyph_to_obj(glyph), FALSE, FALSE); if (otmp->oclass == COIN_CLASS) otmp->quan = 2L; /* to force pluralization */ else if (otmp->otyp == SLIME_MOLD) otmp->spe = current_fruit; /* give the fruit a type */ Strcpy(buf, distant_name(otmp, xname)); dealloc_obj(otmp); } } else Strcpy(buf, distant_name(otmp, xname)); if (levl[x][y].typ == STONE || levl[x][y].typ == SCORR) Strcat(buf, " embedded in stone"); else if (IS_WALL(levl[x][y].typ) || levl[x][y].typ == SDOOR) Strcat(buf, " embedded in a wall"); else if (closed_door(x,y)) Strcat(buf, " embedded in a door"); else if (is_pool(x,y)) Strcat(buf, " in water"); else if (is_lava(x,y)) Strcat(buf, " in molten lava"); /* [can this ever happen?] */ } else if (glyph_is_trap(glyph)) { int tnum = what_trap(glyph_to_trap(glyph)); Strcpy(buf, defsyms[trap_to_defsym(tnum)].explanation); } else if(!glyph_is_cmap(glyph)) { Strcpy(buf,"dark part of a room"); } else switch(glyph_to_cmap(glyph)) { case S_altar: if(!In_endgame(&u.uz)) Sprintf(buf, "%s altar", align_str(Amask2align(levl[x][y].altarmask & ~AM_SHRINE))); else Sprintf(buf, "aligned altar"); break; case S_ndoor: if (is_drawbridge_wall(x, y) >= 0) Strcpy(buf,"open drawbridge portcullis"); else if ((levl[x][y].doormask & ~D_TRAPPED) == D_BROKEN) Strcpy(buf,"broken door"); else Strcpy(buf,"doorway"); break; case S_cloud: Strcpy(buf, Is_airlevel(&u.uz) ? "cloudy area" : "fog/vapor cloud"); break; case S_water: case S_pool: Strcpy(buf, level.flags.lethe? "sparkling water" : "water"); break; default: Strcpy(buf,defsyms[glyph_to_cmap(glyph)].explanation); break; } return ((pm && !Hallucination) ? pm : (struct permonst *) 0); } /* * Look in the "data" file for more info. Called if the user typed in the * whole name (user_typed_name == TRUE), or we've found a possible match * with a character/glyph and flags.help is TRUE. * * NOTE: when (user_typed_name == FALSE), inp is considered read-only and * must not be changed directly, e.g. via lcase(). We want to force * lcase() for data.base lookup so that we can have a clean key. * Therefore, we create a copy of inp _just_ for data.base lookup. */ STATIC_OVL void checkfile(inp, pm, user_typed_name, without_asking) char *inp; struct permonst *pm; boolean user_typed_name, without_asking; { dlb *fp; char buf[BUFSZ], newstr[BUFSZ]; char *ep, *dbase_str; long txt_offset; int chk_skip; boolean found_in_file = FALSE, skipping_entry = FALSE; fp = dlb_fopen_area(NH_DATAAREA, NH_DATAFILE, "r"); if (!fp) { pline("Cannot open data file!"); return; } /* To prevent the need for entries in data.base like *ngel to account * for Angel and angel, make the lookup string the same for both * user_typed_name and picked name. */ if (pm != (struct permonst *) 0 && !user_typed_name) dbase_str = strcpy(newstr, pm->mname); else dbase_str = strcpy(newstr, inp); (void) lcase(dbase_str); if (!strncmp(dbase_str, "interior of ", 12)) dbase_str += 12; if (!strncmp(dbase_str, "a ", 2)) dbase_str += 2; else if (!strncmp(dbase_str, "an ", 3)) dbase_str += 3; else if (!strncmp(dbase_str, "the ", 4)) dbase_str += 4; if (!strncmp(dbase_str, "tame ", 5)) dbase_str += 5; else if (!strncmp(dbase_str, "peaceful ", 9)) dbase_str += 9; if (!strncmp(dbase_str, "invisible ", 10)) dbase_str += 10; if (!strncmp(dbase_str, "statue of ", 10)) dbase_str[6] = '\0'; else if (!strncmp(dbase_str, "figurine of ", 12)) dbase_str[8] = '\0'; /* Make sure the name is non-empty. */ if (*dbase_str) { /* adjust the input to remove "named " and convert to lower case */ char *alt = 0; /* alternate description */ if ((ep = strstri(dbase_str, " named ")) != 0) alt = ep + 7; else ep = strstri(dbase_str, " called "); if (!ep) ep = strstri(dbase_str, ", "); if (ep && ep > dbase_str) *ep = '\0'; /* * If the object is named, then the name is the alternate description; * otherwise, the result of makesingular() applied to the name is. This * isn't strictly optimal, but named objects of interest to the user * will usually be found under their name, rather than under their * object type, so looking for a singular form is pointless. */ if (!alt) alt = makesingular(dbase_str); else if (user_typed_name) (void) lcase(alt); /* skip first record; read second */ txt_offset = 0L; if (!dlb_fgets(buf, BUFSZ, fp) || !dlb_fgets(buf, BUFSZ, fp)) { impossible("can't read 'data' file"); (void) dlb_fclose(fp); return; } else if (sscanf(buf, "%8lx\n", &txt_offset) < 1 || txt_offset <= 0) goto bad_data_file; /* look for the appropriate entry */ while (dlb_fgets(buf,BUFSZ,fp)) { if (*buf == '.') break; /* we passed last entry without success */ if (digit(*buf)) { /* a number indicates the end of current entry */ skipping_entry = FALSE; } else if (!skipping_entry) { if (!(ep = index(buf, '\n'))) goto bad_data_file; *ep = 0; /* if we match a key that begins with "~", skip this entry */ chk_skip = (*buf == '~') ? 1 : 0; if (pmatch(&buf[chk_skip], dbase_str) || (alt && pmatch(&buf[chk_skip], alt))) { if (chk_skip) { skipping_entry = TRUE; continue; } else { found_in_file = TRUE; break; } } } } } if(found_in_file) { long entry_offset; int entry_count; int i; /* skip over other possible matches for the info */ do { if (!dlb_fgets(buf, BUFSZ, fp)) goto bad_data_file; } while (!digit(*buf)); if (sscanf(buf, "%ld,%d\n", &entry_offset, &entry_count) < 2) { bad_data_file: impossible("'data' file in wrong format"); (void) dlb_fclose(fp); return; } if (user_typed_name || without_asking || yn("More info?") == 'y') { winid datawin; if (dlb_fseek(fp, txt_offset + entry_offset, SEEK_SET) < 0) { pline("? Seek error on 'data' file!"); (void) dlb_fclose(fp); return; } datawin = create_nhwindow(NHW_MENU); for (i = 0; i < entry_count; i++) { if (!dlb_fgets(buf, BUFSZ, fp)) goto bad_data_file; if ((ep = index(buf, '\n')) != 0) *ep = 0; if (index(buf+1, '\t') != 0) (void) tabexpand(buf+1); putstr(datawin, 0, buf+1); } display_nhwindow(datawin, FALSE); destroy_nhwindow(datawin); } } else if (user_typed_name) pline("I don't have any information on those things."); (void) dlb_fclose(fp); } /* getpos() return values */ #define LOOK_TRADITIONAL 0 /* '.' -- ask about "more info?" */ #define LOOK_QUICK 1 /* ',' -- skip "more info?" */ #define LOOK_ONCE 2 /* ';' -- skip and stop looping */ #define LOOK_VERBOSE 3 /* ':' -- show more info w/o asking */ /* also used by getpos hack in do_name.c */ const char what_is_an_unknown_object[] = "an unknown object"; STATIC_OVL int do_look(quick) boolean quick; /* use cursor && don't search for "more info" */ { char out_str[BUFSZ], look_buf[BUFSZ]; const char *x_str, *firstmatch = 0; struct permonst *pm = 0; int i, ans = 0; int sym; /* typed symbol or converted glyph */ int found; /* count of matching syms found */ coord cc; /* screen pos of unknown glyph */ boolean save_verbose; /* saved value of flags.verbose */ boolean from_screen; /* question from the screen */ boolean need_to_look; /* need to get explan. from glyph */ boolean hit_trap; /* true if found trap explanation */ int skipped_venom; /* non-zero if we ignored "splash of venom" */ static const char *mon_interior = "the interior of a monster"; if (quick) { from_screen = TRUE; /* yes, we want to use the cursor */ } else { i = ynq("Specify unknown object by cursor?"); if (i == 'q') return 0; from_screen = (i == 'y'); } if (from_screen) { cc.x = u.ux; cc.y = u.uy; sym = 0; /* gcc -Wall lint */ } else { getlin("Specify what? (type the word)", out_str); if (out_str[0] == '\0' || out_str[0] == '\033') return 0; if (out_str[1]) { /* user typed in a complete string */ checkfile(out_str, pm, TRUE, TRUE); return 0; } sym = out_str[0]; } /* Save the verbose flag, we change it later. */ save_verbose = flags.verbose; flags.verbose = flags.verbose && !quick; /* * The user typed one letter, or we're identifying from the screen. */ do { /* Reset some variables. */ need_to_look = FALSE; pm = (struct permonst *)0; skipped_venom = 0; found = 0; out_str[0] = '\0'; if (from_screen) { int glyph; /* glyph at selected position */ if (flags.verbose) pline("Please move the cursor to %s.", what_is_an_unknown_object); else pline("Pick an object."); ans = getpos(&cc, quick, what_is_an_unknown_object); if (ans < 0 || cc.x < 0) { flags.verbose = save_verbose; return 0; /* done */ } flags.verbose = FALSE; /* only print long question once */ /* Convert the glyph at the selected position to a symbol. */ glyph = glyph_at(cc.x,cc.y); if (glyph_is_cmap(glyph)) { sym = showsyms[glyph_to_cmap(glyph)]; } else if (glyph_is_trap(glyph)) { 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]; } else if (glyph_is_swallow(glyph)) { sym = showsyms[glyph_to_swallow(glyph)+S_sw_tl]; } else if (glyph_is_invisible(glyph)) { sym = DEF_INVISIBLE; } else if (glyph_is_warning(glyph)) { sym = glyph_to_warning(glyph); sym = warnsyms[sym]; } else { impossible("do_look: bad glyph %d at (%d,%d)", glyph, (int)cc.x, (int)cc.y); sym = ' '; } } /* * Check all the possibilities, saving all explanations in a buffer. * When all have been checked then the string is printed. */ /* Check for monsters */ for (i = 0; i < MAXMCLASSES; i++) { if (sym == (from_screen ? monsyms[i] : def_monsyms[i]) && monexplain[i]) { need_to_look = TRUE; if (!found) { Sprintf(out_str, "%c %s", sym, an(monexplain[i])); firstmatch = monexplain[i]; found++; } else { found += append_str(out_str, an(monexplain[i])); } } } /* handle '@' as a special case if it refers to you and you're playing a character which isn't normally displayed by that symbol; firstmatch is assumed to already be set for '@' */ if ((from_screen ? (sym == monsyms[S_HUMAN] && cc.x == u.ux && cc.y == u.uy) : (sym == def_monsyms[S_HUMAN] && !iflags.showrace)) && !(Race_if(PM_HUMAN) || Race_if(PM_ELF)) && !Upolyd) found += append_str(out_str, "you"); /* tack on "or you" */ /* * Special case: if identifying from the screen, and we're swallowed, * and looking at something other than our own symbol, then just say * "the interior of a monster". */ if (u.uswallow && from_screen && is_swallow_sym(sym)) { if (!found) { Sprintf(out_str, "%c %s", sym, mon_interior); firstmatch = mon_interior; } else { found += append_str(out_str, mon_interior); } need_to_look = TRUE; } /* Now check for objects */ for (i = 1; i < MAXOCLASSES; i++) { if (sym == (from_screen ? oc_syms[i] : def_oc_syms[i])) { need_to_look = TRUE; if (from_screen && i == VENOM_CLASS) { skipped_venom++; continue; } if (!found) { Sprintf(out_str, "%c %s", sym, an(objexplain[i])); firstmatch = objexplain[i]; found++; } else { found += append_str(out_str, an(objexplain[i])); } } } if (sym == DEF_INVISIBLE) { if (!found) { Sprintf(out_str, "%c %s", sym, an(invisexplain)); firstmatch = invisexplain; found++; } else { found += append_str(out_str, an(invisexplain)); } } #define is_cmap_trap(i) ((i) >= S_arrow_trap && (i) <= S_polymorph_trap) #define is_cmap_drawbridge(i) ((i) >= S_vodbridge && (i) <= S_hcdbridge) /* Now check for graphics symbols */ for (hit_trap = FALSE, i = 0; i < MAXPCHARS; i++) { x_str = defsyms[i].explanation; if (sym == (from_screen ? showsyms[i] : defsyms[i].sym) && *x_str) { /* avoid "an air", "a water", or "a floor of a room" */ int article = (i == S_room) ? 2 : /* 2=>"the" */ !(strcmp(x_str, "air") == 0 || /* 1=>"an" */ strcmp(x_str, "water") == 0); /* 0=>(none)*/ if (!found) { if (is_cmap_trap(i)) { Sprintf(out_str, "%c a trap", sym); hit_trap = TRUE; } else if (level.flags.lethe && !strcmp(x_str, "water")) { Sprintf(out_str, "%c sparkling water", sym); } else { Sprintf(out_str, "%c %s", sym, article == 2 ? the(x_str) : article == 1 ? an(x_str) : x_str); } firstmatch = x_str; found++; } else if (!u.uswallow && !(hit_trap && is_cmap_trap(i)) && !(found >= 3 && is_cmap_drawbridge(i))) { if (level.flags.lethe && !strcmp(x_str, "water")) found += append_str(out_str, "sparkling water"); else found += append_str(out_str, article == 2 ? the(x_str) : article == 1 ? an(x_str) : x_str); if (is_cmap_trap(i)) hit_trap = TRUE; } if (i == S_altar || is_cmap_trap(i)) need_to_look = TRUE; } } /* 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) { Sprintf(out_str, "%c %s", sym, def_warnsyms[i].explanation); firstmatch = def_warnsyms[i].explanation; found++; } else { found += append_str(out_str, def_warnsyms[i].explanation); } /* Kludge: warning trumps boulders on the display. Reveal the boulder too or player can get confused */ if (from_screen && sobj_at(BOULDER, cc.x, cc.y)) Strcat(out_str, " co-located with a boulder"); break; /* out of for loop*/ } } /* if we ignored venom and list turned out to be short, put it back */ if (skipped_venom && found < 2) { x_str = objexplain[VENOM_CLASS]; if (!found) { Sprintf(out_str, "%c %s", sym, an(x_str)); firstmatch = x_str; found++; } else { found += append_str(out_str, an(x_str)); } } /* handle optional boulder symbol as a special case */ if (iflags.bouldersym && sym == iflags.bouldersym) { if (!found) { firstmatch = "boulder"; Sprintf(out_str, "%c %s", sym, an(firstmatch)); found++; } else { found += append_str(out_str, "boulder"); } } /* * If we are looking at the screen, follow multiple possibilities or * an ambiguous explanation by something more detailed. */ 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 */ } if (monbuf[0]) { Sprintf(temp_buf, " [seen: %s]", monbuf); (void)strncat(out_str, temp_buf, BUFSZ-strlen(out_str)-1); } #ifdef WIZARD if (wizard && pm) { struct monst *mtmp = m_at(cc.x, cc.y); if (mtmp && mtmp->oldmonnm != monsndx(pm)) { Sprintf(temp_buf, " [polymorphed from a %s]", mons[mtmp->oldmonnm].mname); (void)strncat(out_str, temp_buf, BUFSZ-strlen(out_str)-1); } } #endif } } /* Finally, print out our explanation. */ if (found) { pline("%s", out_str); /* check the data file for information about this thing */ if (found == 1 && ans != LOOK_QUICK && ans != LOOK_ONCE && (ans == LOOK_VERBOSE || (flags.help && !quick))) { char temp_buf[BUFSZ]; Strcpy(temp_buf, level.flags.lethe && !strcmp(firstmatch, "water")? "lethe" : firstmatch); checkfile(temp_buf, pm, FALSE, (boolean)(ans == LOOK_VERBOSE)); } } else { pline("I've never heard of such things."); } } while (from_screen && !quick && ans != LOOK_ONCE); flags.verbose = save_verbose; return 0; } int dowhatis() { return do_look(FALSE); } int doquickwhatis() { return do_look(TRUE); } int doidtrap() { register struct trap *trap; int x, y, tt; if (!getdir("^")) return 0; x = u.ux + u.dx; y = u.uy + u.dy; for (trap = ftrap; trap; trap = trap->ntrap) if (trap->tx == x && trap->ty == y) { if (!trap->tseen) break; tt = trap->ttyp; if (u.dz) { if (u.dz < 0 ? (tt == TRAPDOOR || tt == HOLE) : tt == ROCKTRAP) break; } tt = what_trap(tt); pline("That is %s%s%s.", an(defsyms[trap_to_defsym(tt)].explanation), !trap->madeby_u ? "" : (tt == WEB) ? " woven" : /* trap doors & spiked pits can't be made by player, and should be considered at least as much "set" as "dug" anyway */ (tt == HOLE || tt == PIT) ? " dug" : " set", !trap->madeby_u ? "" : " by you"); return 0; } pline("I can't see a trap there."); return 0; } char * dowhatdoes_core(q, cbuf) char q; char *cbuf; { dlb *fp; char bufr[BUFSZ]; register char *buf = &bufr[6], *ep, ctrl, meta; fp = dlb_fopen_area(NH_CMDHELPAREA, NH_CMDHELPFILE, "r"); if (!fp) { pline("Cannot open data file!"); return 0; } ctrl = ((q <= '\033') ? (q - 1 + 'A') : 0); meta = ((0x80 & q) ? (0x7f & q) : 0); while(dlb_fgets(buf,BUFSZ-6,fp)) { if ((ctrl && *buf=='^' && *(buf+1)==ctrl) || (meta && *buf=='M' && *(buf+1)=='-' && *(buf+2)==meta) || *buf==q) { if ((ep = index(buf, '\n')) != 0) *ep = 0; #ifdef MSDOS if ((ep = index(buf, '\r')) != 0) *ep = 0; #endif if (ctrl && buf[2] == '\t'){ buf = bufr + 1; (void) strncpy(buf, "^? ", 8); buf[1] = ctrl; } else if (meta && buf[3] == '\t'){ buf = bufr + 2; (void) strncpy(buf, "M-? ", 8); buf[2] = meta; } else if(buf[1] == '\t'){ buf = bufr; buf[0] = q; (void) strncpy(buf+1, " ", 7); } (void) dlb_fclose(fp); Strcpy(cbuf, buf); return cbuf; } } (void) dlb_fclose(fp); return (char *)0; } int dowhatdoes() { char bufr[BUFSZ]; char q, *reslt; #if defined(UNIX) || defined(VMS) introff(); #endif q = yn_function("What command?", (char *)0, '\0'); #if defined(UNIX) || defined(VMS) intron(); #endif reslt = dowhatdoes_core(q, bufr); if (reslt) pline("%s", reslt); else pline("I've never heard of such commands."); return 0; } /* data for help_menu() */ static const char *help_menu_items[] = { /* 0*/ "Long description of the game and commands.", /* 1*/ "List of game commands.", /* 2*/ "Concise history of Slash'EM.", /* 3*/ "Info on a character in the game display.", /* 4*/ "Info on what a given key does.", /* 5*/ "List of game options.", /* 6*/ "Longer explanation of game options.", /* 7*/ "List of extended commands.", /* 8*/ "The NetHack license.", #ifndef MAC /*WAC Add access to txt guidebook*/ /* 9*/ "The Slash'EM Guidebook.", #endif #ifdef PORT_HELP "%s-specific help and commands.", #endif #ifdef WIZARD "List of wizard-mode commands.", #endif "", (char *)0 }; enum { LICENSE_SLOT=8, #ifndef MAC GUIDEBOOK_SLOT, #endif #ifdef PORT_HELP PORT_HELP_ID, #endif #ifdef WIZARD WIZHLP_SLOT, #endif NULL_SLOT }; STATIC_OVL boolean help_menu(sel) int *sel; { winid tmpwin = create_nhwindow(NHW_MENU); #ifdef PORT_HELP char helpbuf[QBUFSZ]; #endif int i, n; menu_item *selected; anything any; any.a_void = 0; /* zero all bits */ start_menu(tmpwin); #ifdef WIZARD if (!wizard) help_menu_items[WIZHLP_SLOT] = "", help_menu_items[WIZHLP_SLOT+1] = (char *)0; #endif for (i = 0; help_menu_items[i]; i++) #ifdef PORT_HELP /* port-specific line has a %s in it for the PORT_ID */ if (help_menu_items[i][0] == '%') { Sprintf(helpbuf, help_menu_items[i], PORT_ID); any.a_int = PORT_HELP_ID + 1; add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, helpbuf, MENU_UNSELECTED); } else #endif { any.a_int = (*help_menu_items[i]) ? i+1 : 0; add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, help_menu_items[i], MENU_UNSELECTED); } end_menu(tmpwin, "Select one item:"); n = select_menu(tmpwin, PICK_ONE, &selected); destroy_nhwindow(tmpwin); if (n > 0) { *sel = selected[0].item.a_int - 1; free((genericptr_t)selected); return TRUE; } return FALSE; } int dohelp() { int sel = 0; if (help_menu(&sel)) { switch (sel) { case 0: display_file_area(NH_HELP_AREA, NH_HELP, TRUE); break; case 1: display_file_area(NH_SHELP_AREA, NH_SHELP, TRUE); break; case 2: (void) dohistory(); break; case 3: (void) dowhatis(); break; case 4: (void) dowhatdoes(); break; case 5: option_help(); break; case 6: display_file_area(NH_OPTIONAREA, NH_OPTIONFILE, TRUE); break; case 7: (void) doextlist(); break; case 8: display_file_area(NH_LICENSE_AREA, NH_LICENSE, TRUE); break; #ifndef MAC /*WAC add guidebook.*/ case GUIDEBOOK_SLOT: display_file_area(NH_GUIDEBOOK_AREA, NH_GUIDEBOOK, TRUE); break; #endif #ifdef PORT_HELP case PORT_HELP_ID: port_help(); break; #endif #ifdef WIZARD case WIZHLP_SLOT: display_file_area(NH_DEBUGHELP_AREA, NH_DEBUGHELP, TRUE); break; #endif } } return 0; } int dohistory() { display_file_area(NH_HISTORY_AREA, NH_HISTORY, TRUE); return 0; } /*pager.c*/ slashem-0.0.7E7F3/src/mthrowu.c0000664000076400007640000006503710545462317014327 0ustar aliali/* SCCS Id: @(#)mthrowu.c 3.4 2003/05/09 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" STATIC_DCL int FDECL(drop_throw,(struct monst *, struct obj *,BOOLEAN_P,int,int)); #define URETREATING(x,y) (distmin(u.ux,u.uy,x,y) > distmin(u.ux0,u.uy0,x,y)) #define POLE_LIM 5 /* How far monsters can use pole-weapons */ #ifndef OVLB const char *breathwep[]; #else /* OVLB */ /* * Keep consistent with breath weapons in zap.c, and AD_* in monattk.h. */ NEARDATA const char *breathwep[] = { "fragments", "fire", "frost", "sleep gas", "a disintegration blast", "lightning", "poison gas", "acid", "strange breath #8", "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' */ { const char *onm, *knm; boolean is_acid; int kprefix = KILLED_BY_AN; char onmbuf[BUFSZ], knmbuf[BUFSZ]; if (!name) { if (!obj) panic("thitu: name & obj both null?"); name = strcpy(onmbuf, (obj->quan > 1L) ? doname(obj) : mshot_xname(obj)); knm = strcpy(knmbuf, killer_xname(obj)); kprefix = KILLED_BY; /* killer_name supplies "an" if warranted */ } else { knm = name; /* [perhaps ought to check for plural here to] */ if (!strncmpi(name, "the ", 4) || !strncmpi(name, "an ", 3) || !strncmpi(name, "a ", 2)) kprefix = KILLED_BY; } onm = (obj && obj_is_pname(obj)) ? the(name) : (obj && obj->quan > 1L) ? name : an(name); is_acid = (obj && obj->otyp == ACID_VENOM); 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)) { dam += rnd(20); pline_The("silver sears your flesh!"); exercise(A_CON, FALSE); } if (is_acid && Acid_resistance) pline("It doesn't seem to hurt you."); else { if (is_acid) pline("It burns!"); if (Half_physical_damage) dam = (dam+1) / 2; losehp(dam, knm, kprefix); exercise(A_STR, FALSE); } return(1); } } /* Be sure this corresponds with what happens to player-thrown objects in * dothrow.c (for consistency). --KAA * Returns 0 if object still exists (not destroyed). */ STATIC_OVL int drop_throw(mon, obj, ohit, x, y) register struct monst *mon; register struct obj *obj; boolean ohit; int x,y; { struct obj *mwep = (struct obj *) 0; int retvalu = 1; int create; struct monst *mtmp; struct trap *t; if (mon) mwep = MON_WEP(mon); if (obj->otyp == CREAM_PIE || obj->oclass == VENOM_CLASS || /* WAC added Spoon throw code */ # ifdef P_SPOON (obj->oartifact == ART_HOUCHOU) || # endif #ifdef FIREARMS /* WAC -- assume monsters don't throw without using the right propellor */ (is_bullet(obj)) || #endif (ohit && obj->otyp == EGG)) create = 0; else if (ohit && (is_multigen(obj) || obj->otyp == ROCK)) create = !rn2(3); else create = 1; #ifdef FIREARMS /* Detonate rockets */ if (is_grenade(obj)) { if (!ohit) { create = 1; /* Don't destroy */ arm_bomb(obj, FALSE); } else { grenade_explode(obj, bhitpos.x, bhitpos.y, FALSE, 0); obj = (struct obj *)0; } } else if (objects[obj->otyp].oc_dir & EXPLOSION) { if (cansee(bhitpos.x,bhitpos.y)) pline("%s explodes in a ball of fire!", Doname2(obj)); else You_hear("an explosion"); explode(bhitpos.x, bhitpos.y, -ZT_SPELL(ZT_FIRE), d(3,8), WEAPON_CLASS, EXPL_FIERY); } #endif /* D: Detonate crossbow bolts from Hellfire if they hit */ if (ohit && mwep && mwep->oartifact == ART_HELLFIRE && is_ammo(obj) && ammo_and_launcher(obj, mwep)) { if (cansee(bhitpos.x,bhitpos.y)) pline("%s explodes in a ball of fire!", Doname2(obj)); else You_hear("an explosion"); explode(bhitpos.x, bhitpos.y, -ZT_SPELL(ZT_FIRE), d(2,6), WEAPON_CLASS, EXPL_FIERY); /* D: Exploding bolts will be destroyed */ create = 0; } if (create && !((mtmp = m_at(x, y)) && (mtmp->mtrapped) && (t = t_at(x, y)) && ((t->ttyp == PIT) || (t->ttyp == SPIKED_PIT)))) { int objgone = 0; if (down_gate(x, y) != -1) objgone = ship_object(obj, x, y, FALSE); 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; } } } else if (obj) obfree(obj, (struct obj*) 0); return retvalu; } #endif /* OVLB */ #ifdef OVL1 /* an object launched by someone/thing other than player attacks a monster; return 1 if the object has stopped moving (hit or its range used up) */ int ohitmon(mon, mtmp, otmp, range, verbose) struct monst *mon; /* monster thrower (if applicable) */ struct monst *mtmp; /* accidental target */ struct obj *otmp; /* missile; might be destroyed by drop_throw */ int range; /* how much farther will object travel if it misses */ /* Use -1 to signify to keep going even after hit, */ /* unless its gone (used for rolling_boulder_traps) */ boolean verbose; /* give message(s) even when you can't see what happened */ { int damage, tmp; boolean vis, ismimic; int objgone = 1; ismimic = mtmp->m_ap_type && mtmp->m_ap_type != M_AP_MONSTER; vis = cansee(bhitpos.x, bhitpos.y); 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 */ (void) drop_throw(mon, otmp, 0, mtmp->mx, mtmp->my); return 1; } } else if (otmp->oclass == POTION_CLASS) { if (ismimic) seemimic(mtmp); mtmp->msleeping = 0; if (vis) otmp->dknown = 1; potionhit(mtmp, otmp, FALSE); if (mon && !DEADMONSTER(mon) && !DEADMONSTER(mtmp) && mtmp->movement >= NORMAL_SPEED && rn2(4)) { /* retaliate */ mtmp->movement -= NORMAL_SPEED; mattackm(mtmp, mon); } return 1; } else { damage = dmgval(otmp, mtmp); # ifdef P_SPOON if (otmp->otyp == SPOON) { pline("The spoon flashes brightly as it hits %s.", the(mon_nam(mtmp))); } # endif /* P_SPOON */ if (otmp->otyp == ACID_VENOM && resists_acid(mtmp)) damage = 0; if (ismimic) seemimic(mtmp); mtmp->msleeping = 0; if (vis) hit(distant_name(otmp,mshot_xname), mtmp, exclam(damage)); else if (verbose) pline("%s is hit%s", Monnam(mtmp), exclam(damage)); if (otmp->opoisoned && is_poisonable(otmp)) { if (resists_poison(mtmp)) { if (vis) pline_The("poison doesn't seem to affect %s.", mon_nam(mtmp)); } else { if (rn2(30)) { damage += rnd(6); } else { if (vis) pline_The("poison was deadly..."); damage = mtmp->mhp; } } } if (objects[otmp->otyp].oc_material == SILVER && hates_silver(mtmp->data)) { if (vis) pline_The("silver sears %s flesh!", s_suffix(mon_nam(mtmp))); else if (verbose) pline("Its flesh is seared!"); } if (otmp->otyp == ACID_VENOM && cansee(mtmp->mx,mtmp->my)) { if (resists_acid(mtmp)) { if (vis || verbose) pline("%s is unaffected.", Monnam(mtmp)); damage = 0; } else { if (vis) pline_The("acid burns %s!", mon_nam(mtmp)); else if (verbose) pline("It is burned!"); } } mtmp->mhp -= damage; if (mtmp->mhp < 1) { if (vis || verbose) pline("%s is %s!", Monnam(mtmp), (nonliving(mtmp->data) || !canspotmon(mtmp)) ? "destroyed" : "killed"); /* don't blame hero for unknown rolling boulder trap */ if (!flags.mon_moving && (otmp->otyp != BOULDER || range >= 0 || !otmp->otrapped)) xkilled(mtmp,0); else mondied(mtmp); } if (can_blnd((struct monst*)0, mtmp, (uchar)(otmp->otyp == BLINDING_VENOM ? AT_SPIT : AT_WEAP), otmp)) { if (vis && mtmp->mcansee) pline("%s is blinded by %s.", Monnam(mtmp), the(xname(otmp))); mtmp->mcansee = 0; tmp = (int)mtmp->mblinded + rnd(25) + 20; if (tmp > 127) tmp = 127; mtmp->mblinded = tmp; } if (mon && !DEADMONSTER(mon) && !DEADMONSTER(mtmp) && mtmp->movement >= NORMAL_SPEED && rn2(4)) { /* retaliate */ mtmp->movement -= NORMAL_SPEED; mattackm(mtmp, mon); } objgone = drop_throw(mon, otmp, 1, bhitpos.x, bhitpos.y); if (!objgone && range == -1) { /* special case */ obj_extract_self(otmp); /* free it for motion again */ return 0; } return 1; } return 0; } void m_throw(mon, x, y, dx, dy, range, obj) register struct monst *mon; register int x,y,dx,dy,range; /* direction and range */ register struct obj *obj; { register struct monst *mtmp; struct obj *singleobj, *mwep; char sym = obj->oclass; int hitu, blindinc = 0; bhitpos.x = x; bhitpos.y = y; if (obj->quan == 1L) { /* * Remove object from minvent. This cannot be done later on; * what if the player dies before then, leaving the monster * with 0 daggers? (This caused the infamous 2^32-1 orcish * dagger bug). * * VENOM is not in minvent - it should already be OBJ_FREE. * The extract below does nothing. */ /* 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); } singleobj->owornmask = 0; /* threw one of multiple weapons in hand? */ if (mon) mwep = MON_WEP(mon); else mwep = (struct obj *) 0; /* D: Special launcher effects */ if (mwep && is_ammo(singleobj) && ammo_and_launcher(singleobj, mwep)) { if (mwep->oartifact == ART_PLAGUE && is_poisonable(singleobj)) singleobj->opoisoned = 1; /* D: Hellfire is handled in drop_throw */ } if (singleobj->cursed && (dx || dy) && !rn2(7)) { if(canseemon(mon) && flags.verbose) { 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; /* check validity of new direction */ if (!dx && !dy) { (void) drop_throw(mon, singleobj, 0, bhitpos.x, bhitpos.y); return; } } /* pre-check for doors, walls and boundaries. Also need to pre-check for bars regardless of direction; the random chance for small objects hitting bars is skipped when reaching them at point blank range */ if (!isok(bhitpos.x+dx,bhitpos.y+dy) || IS_ROCK(levl[bhitpos.x+dx][bhitpos.y+dy].typ) || closed_door(bhitpos.x+dx, bhitpos.y+dy) || (levl[bhitpos.x + dx][bhitpos.y + dy].typ == IRONBARS && hits_bars(&singleobj, bhitpos.x, bhitpos.y, 0, 0))) { (void) drop_throw(mon, singleobj, 0, bhitpos.x, bhitpos.y); return; } /* Note: drop_throw may destroy singleobj. Since obj must be destroyed * early to avoid the dagger bug, anyone who modifies this code should * be careful not to use either one after it's been freed. */ if (sym) tmp_at(DISP_FLASH, obj_to_glyph(singleobj)); while(range-- > 0) { /* Actually the loop is always exited by break */ bhitpos.x += dx; bhitpos.y += dy; if ((mtmp = m_at(bhitpos.x, bhitpos.y)) != 0) { if (ohitmon(mon, mtmp, singleobj, range, TRUE)) break; } else if (bhitpos.x == u.ux && bhitpos.y == u.uy) { if (multi) nomul(0); if (singleobj->oclass == GEM_CLASS && singleobj->otyp <= LAST_GEM+9 /* 9 glass colors */ && is_unicorn(youmonst.data)) { if (singleobj->otyp > LAST_GEM) { You("catch the %s.", xname(singleobj)); You("are not interested in %s junk.", s_suffix(mon_nam(mon))); makeknown(singleobj->otyp); dropy(singleobj); } else { You("accept %s gift in the spirit in which it was intended.", s_suffix(mon_nam(mon))); (void)hold_another_object(singleobj, "You catch, but drop, %s.", xname(singleobj), "You catch:"); } break; } if (singleobj->oclass == POTION_CLASS) { if (!Blind) singleobj->dknown = 1; potionhit(&youmonst, singleobj, FALSE); break; } switch(singleobj->otyp) { int dam, hitv; case EGG: if (!touch_petrifies(&mons[singleobj->corpsenm])) { impossible("monster throwing egg type %d", singleobj->corpsenm); hitu = 0; break; } /* fall through */ case CREAM_PIE: case BLINDING_VENOM: hitu = thitu(8, 0, singleobj, (char *)0); break; default: dam = dmgval(singleobj, &youmonst); hitv = 3 - distmin(u.ux,u.uy, mon->mx,mon->my); if (hitv < -4) hitv = -4; if (is_elf(mon->data) && objects[singleobj->otyp].oc_skill == P_BOW) { hitv++; if (MON_WEP(mon) && MON_WEP(mon)->otyp == ELVEN_BOW) hitv++; if(singleobj->otyp == ELVEN_ARROW) dam++; } if (bigmonst(youmonst.data)) hitv++; hitv += 8 + singleobj->spe; if (dam < 1) dam = 1; hitu = thitu(hitv, dam, singleobj, (char *)0); } if (hitu && singleobj->opoisoned && is_poisonable(singleobj)) { char onmbuf[BUFSZ], knmbuf[BUFSZ]; Strcpy(onmbuf, xname(singleobj)); Strcpy(knmbuf, killer_xname(singleobj)); poisoned(onmbuf, A_STR, knmbuf, -10); } 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) { (void) drop_throw(mon, singleobj, hitu, u.ux, u.uy); break; } } if (!range /* reached end of path */ /* missile hits edge of screen */ || !isok(bhitpos.x+dx,bhitpos.y+dy) /* missile hits the wall */ || IS_ROCK(levl[bhitpos.x+dx][bhitpos.y+dy].typ) /* missile hit closed door */ || closed_door(bhitpos.x+dx, bhitpos.y+dy) /* missile might hit bars */ || (levl[bhitpos.x+dx][bhitpos.y+dy].typ == IRONBARS && hits_bars(&singleobj, bhitpos.x, bhitpos.y, !rn2(5), 0)) #ifdef SINKS /* Thrown objects "sink" */ || IS_SINK(levl[bhitpos.x][bhitpos.y].typ) #endif ) { if (singleobj) /* hits_bars might have destroyed it */ (void) drop_throw(mon, singleobj, 0, bhitpos.x, bhitpos.y); break; } tmp_at(bhitpos.x, bhitpos.y); delay_output(); } 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); } } #endif /* OVL1 */ #ifdef OVLB /* Remove an item from the monster's inventory and destroy it. */ void m_useup(mon, obj) struct monst *mon; struct obj *obj; { if (obj->quan > 1L) { obj->quan--; obj->owt = weight(obj); } else { obj_extract_self(obj); possibly_unwield(mon, FALSE); if (obj->owornmask) { mon->misc_worn_check &= ~(obj->owornmask); update_mon_intrinsics(mon, obj, FALSE, 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; int chance; /* Rearranged beginning so monsters can use polearms not in a line */ if (mtmp->weapon_check == NEED_WEAPON || !MON_WEP(mtmp)) { mtmp->weapon_check = NEED_RANGED_WEAPON; /* mon_wield_item resets weapon_check as appropriate */ if(mon_wield_item(mtmp) != 0) return; } /* Pick a weapon */ otmp = select_rwep(mtmp); if (!otmp) return; if ((MON_WEP(mtmp) == otmp) && 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. */ /* WAC Catch this since rn2(0) is illegal */ chance = (BOLT_LIM - distmin(x,y,mtmp->mux,mtmp->muy) > 0) ? BOLT_LIM - distmin(x,y,mtmp->mux,mtmp->muy) : 1; if (!lined_up(mtmp) || (URETREATING(x,y) && rn2(chance))) return; skill = objects[otmp->otyp].oc_skill; mwep = MON_WEP(mtmp); /* wielded weapon */ if (ammo_and_launcher(otmp, mwep) && objects[mwep->otyp].oc_range && dist2(mtmp->mx, mtmp->my, mtmp->mux, mtmp->muy) > objects[mwep->otyp].oc_range * objects[mwep->otyp].oc_range) return; /* Out of range */ /* 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++; /* Elven Craftsmanship makes for light, quick bows */ if (otmp->otyp == ELVEN_ARROW && !otmp->cursed) multishot++; if (mwep && mwep->otyp == ELVEN_BOW && !mwep->cursed) multishot++; /* 1/3 of object enchantment */ if (mwep && mwep->spe > 1) multishot += rounddiv(mwep->spe, 3); /* Some randomness */ if (multishot > 1) multishot = rnd(multishot); #ifdef FIREARMS if (mwep && objects[mwep->otyp].oc_rof && is_launcher(mwep)) multishot += objects[mwep->otyp].oc_rof; #endif 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), #ifdef FIREARMS m_shot.s ? is_bullet(otmp) ? "fires" : "shoots" : "throws", onm); #else m_shot.s ? "shoots" : "throws", onm); #endif 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 */ #ifdef OVLB int spitmu(mtmp, mattk) /* monster spits substance at you */ register struct monst *mtmp; register struct attack *mattk; { register struct obj *otmp; if(mtmp->mcan) { if(flags.soundok) pline("A dry rattle comes from %s throat.", s_suffix(mon_nam(mtmp))); return 0; } if(lined_up(mtmp)) { switch (mattk->adtyp) { case AD_BLND: case AD_DRST: otmp = mksobj(BLINDING_VENOM, TRUE, FALSE); break; default: impossible("bad attack type in spitmu"); /* fall through */ case AD_ACID: otmp = mksobj(ACID_VENOM, TRUE, FALSE); break; } if(!rn2(BOLT_LIM-distmin(mtmp->mx,mtmp->my,mtmp->mux,mtmp->muy))) { if (canseemon(mtmp)) pline("%s spits venom!", Monnam(mtmp)); m_throw(mtmp, mtmp->mx, mtmp->my, sgn(tbx), sgn(tby), distmin(mtmp->mx,mtmp->my,mtmp->mux,mtmp->muy), otmp); nomul(0); return 0; } } return 0; } #endif /* OVLB */ #ifdef OVL1 int breamu(mtmp, mattk) /* monster breathes at you (ranged) */ register struct monst *mtmp; register struct attack *mattk; { /* if new breath types are added, change AD_ACID to max type */ int typ = (mattk->adtyp == AD_RBRE) ? rnd(AD_ACID) : mattk->adtyp ; if(lined_up(mtmp)) { if(mtmp->mcan) { if(flags.soundok) { if(canseemon(mtmp)) pline("%s coughs.", Monnam(mtmp)); else You_hear("a cough."); } return(0); } if(!mtmp->mspec_used && rn2(3)) { if((typ >= AD_MAGM) && (typ <= AD_ACID)) { if(canseemon(mtmp)) pline("%s breathes %s!", Monnam(mtmp), breathwep[typ-1]); buzz((int) (-20 - (typ-1)), (int)mattk->damn, mtmp->mx, mtmp->my, sgn(tbx), sgn(tby)); nomul(0); /* breath runs out sometimes. Also, give monster some * cunning; don't breath if the player fell asleep. */ if(!rn2(3)) mtmp->mspec_used = 10+rn2(20); if(typ == AD_SLEE && !Sleep_resistance) mtmp->mspec_used += rnd(20); } else impossible("Breath weapon %d used", typ-1); } } return(1); } /* WAC for doorbusting ONLY (at this point in time) No checks */ boolean breamspot(mtmp, mattk, ax, ay) register struct monst *mtmp; register struct attack *mattk; xchar ax, ay; { /* if new breath types are added, change AD_ACID to max type */ int typ = (mattk->adtyp == AD_RBRE) ? rnd(AD_ACID) : mattk->adtyp ; if((typ >= AD_MAGM) && (typ <= AD_ACID)) { if(canseemon(mtmp)) pline("%s breathes %s!", Monnam(mtmp), breathwep[typ-1]); /* Do the door first - monster is ON TOP so call direct */ zap_over_floor(mtmp->mx, mtmp->my, (int) (-20 - (typ-1)), NULL); buzz((int) (-20 - (typ-1)), (int)mattk->damn, mtmp->mx, mtmp->my, ax, ay); nomul(0); /* breath runs out sometimes. */ if(!rn2(3)) mtmp->mspec_used = 10+rn2(20); } else impossible("Breath weapon %d used", typ-1); return(TRUE); } boolean linedup(ax, ay, bx, by) register xchar ax, ay, bx, by; { tbx = ax - bx; /* These two values are set for use */ tby = ay - by; /* after successful return. */ /* sometimes displacement makes a monster think that you're at its own location; prevent it from throwing and zapping in that case */ if (!tbx && !tby) return FALSE; if((!tbx || !tby || abs(tbx) == abs(tby)) /* straight line or diagonal */ && distmin(tbx, tby, 0, 0) < BOLT_LIM) { if(ax == u.ux && ay == u.uy) return((boolean)(couldsee(bx,by))); else if(clear_path(ax,ay,bx,by)) return TRUE; } return FALSE; } boolean lined_up(mtmp) /* is mtmp in position to use ranged attack? */ register struct monst *mtmp; { return(linedup(mtmp->mux,mtmp->muy,mtmp->mx,mtmp->my)); } #endif /* OVL1 */ #ifdef OVL0 /* Check if a monster is carrying a particular item. */ struct obj * m_carrying(mtmp, type) struct monst *mtmp; int type; { register struct obj *otmp; for(otmp = mtmp->minvent; otmp; otmp = otmp->nobj) if(otmp->otyp == type) return(otmp); return((struct obj *) 0); } /* TRUE iff thrown/kicked/rolled object doesn't pass through iron bars */ boolean hits_bars(obj_p, x, y, always_hit, whodidit) struct obj **obj_p; /* *obj_p will be set to NULL if object breaks */ int x, y; int always_hit; /* caller can force a hit for items which would fit through */ int whodidit; /* 1==hero, 0=other, -1==just check whether it'll pass thru */ { struct obj *otmp = *obj_p; int obj_type = otmp->otyp; boolean hits = always_hit; if (!hits) switch (otmp->oclass) { case WEAPON_CLASS: { int oskill = objects[obj_type].oc_skill; hits = (oskill != -P_BOW && oskill != -P_CROSSBOW && oskill != -P_DART && oskill != -P_SHURIKEN && #ifdef FIREARMS (oskill != -P_FIREARM || obj_type == ROCKET) && #endif oskill != P_SPEAR && oskill != P_JAVELIN && oskill != P_KNIFE); /* but not dagger */ break; } case ARMOR_CLASS: hits = (objects[obj_type].oc_armcat != ARM_GLOVES); break; case TOOL_CLASS: hits = (obj_type != SKELETON_KEY && obj_type != LOCK_PICK && #ifdef TOURIST obj_type != CREDIT_CARD && #endif obj_type != TALLOW_CANDLE && obj_type != WAX_CANDLE && obj_type != LENSES && obj_type != TIN_WHISTLE && obj_type != MAGIC_WHISTLE); break; case ROCK_CLASS: /* includes boulder */ if (obj_type != STATUE || mons[otmp->corpsenm].msize > MZ_TINY) hits = TRUE; break; case FOOD_CLASS: if (obj_type == CORPSE && mons[otmp->corpsenm].msize > MZ_TINY) hits = TRUE; else hits = (obj_type == MEAT_STICK || obj_type == HUGE_CHUNK_OF_MEAT); break; case SPBOOK_CLASS: case WAND_CLASS: case BALL_CLASS: case CHAIN_CLASS: hits = TRUE; break; default: break; } if (hits && whodidit != -1) { if (whodidit ? hero_breaks(otmp, x, y, FALSE) : breaks(otmp, x, y)) *obj_p = otmp = 0; /* object is now gone */ /* breakage makes its own noises */ else if (obj_type == BOULDER || obj_type == HEAVY_IRON_BALL) pline("Whang!"); else if (otmp->oclass == COIN_CLASS || objects[obj_type].oc_material == GOLD || objects[obj_type].oc_material == SILVER) pline("Clink!"); else pline("Clonk!"); } return hits; } #endif /* OVL0 */ /*mthrowu.c*/ slashem-0.0.7E7F3/src/light.c0000644000076400007640000004412710545462317013724 0ustar aliali/* SCCS Id: @(#)light.c 3.4 1997/04/10 */ /* Copyright (c) Dean Luick, 1994 */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" #include "lev.h" /* for checking save modes */ /* * Mobile light sources. * * This implementation minimizes memory at the expense of extra * recalculations. * * Light sources are "things" that have a physical position and range. * They have a type, which gives us information about them. Currently * they are only attached to objects and monsters. Note well: the * polymorphed-player handling assumes that both youmonst.m_id and * youmonst.mx will always remain 0. * * Light sources, like timers, either follow game play (RANGE_GLOBAL) or * stay on a level (RANGE_LEVEL). Light sources are unique by their * (type, id) pair. For light sources attached to objects, this id * is a pointer to the object. * * The major working function is do_light_sources(). It is called * when the vision system is recreating its "could see" array. Here * we add a flag (TEMP_LIT) to the array for all locations that are lit * via a light source. The bad part of this is that we have to * re-calculate the LOS of each light source every time the vision * system runs. Even if the light sources and any topology (vision blocking * positions) have not changed. The good part is that no extra memory * is used, plus we don't have to figure out how far the sources have moved, * or if the topology has changed. * * The structure of the save/restore mechanism is amazingly similar to * the timer save/restore. This is because they both have the same * principals of having pointers into objects that must be recalculated * across saves and restores. */ #ifdef OVL3 /* flags */ #define LSF_SHOW 0x1 /* display the light source */ #define LSF_NEEDS_FIXUP 0x2 /* need oid fixup */ #define LSF_FLOATING 0x4 /* location not yet determined */ static light_source *light_base = 0; STATIC_DCL void FDECL(write_ls, (int, light_source *)); STATIC_DCL int FDECL(maybe_write_ls, (int, int, BOOLEAN_P)); /* imported from vision.c, for small circles */ extern char circle_data[]; extern char circle_start[]; /* WAC in artifact.c, for obj_sheds_light*/ extern boolean FDECL(obj_special_light, (struct obj *)); /* Create a new light source. */ void new_light_source(x, y, range, type, id) xchar x, y; int range, type; genericptr_t id; { light_source *ls; if (range > MAX_RADIUS || range < 1) { impossible("new_light_source: illegal range %d", range); return; } ls = (light_source *) alloc(sizeof(light_source)); ls->next = light_base; ls->x = x; ls->y = y; ls->range = range; ls->type = type; ls->id = id; if (ls->type != LS_TEMP && x == 0) ls->flags = LSF_FLOATING; else ls->flags = 0; light_base = ls; vision_full_recalc = 1; /* make the source show up */ } /* * Delete a light source. This assumes only one light source is attached * to an object at a time. */ void del_light_source(type, id) int type; genericptr_t id; { light_source *curr, *prev; genericptr_t tmp_id; /* need to be prepared for dealing a with light source which has only been partially restored during a level change (in particular: chameleon vs prot. from shape changers) */ switch (type) { case LS_OBJECT: tmp_id = (genericptr_t)(((struct obj *)id)->o_id); break; case LS_MONSTER: tmp_id = (genericptr_t)(((struct monst *)id)->m_id); break; case LS_TEMP: tmp_id = id; break; default: tmp_id = 0; break; } for (prev = 0, curr = light_base; curr; prev = curr, curr = curr->next) { if (curr->type != type) continue; if (curr->id == ((curr->flags & LSF_NEEDS_FIXUP) ? tmp_id : id)) { if (prev) prev->next = curr->next; else light_base = curr->next; free((genericptr_t)curr); vision_full_recalc = 1; return; } } impossible("del_light_source: not found type=%d, id=0x%lx", type, (long)id); } /* Mark locations that are temporarily lit via mobile light sources. */ void do_light_sources(cs_rows) char **cs_rows; { int x, y, min_x, max_x, max_y, offset; char *limits; short at_hero_range = 0; light_source *ls; char *row; for (ls = light_base; ls; ls = ls->next) { ls->flags &= ~LSF_SHOW; /* * See if floating light source has been finalized yet. * If not, arrange for vision to be recalculated later. */ if (ls->flags & LSF_FLOATING) { if (ls->type == LS_OBJECT) { if (get_obj_location((struct obj *) ls->id, &ls->x, &ls->y, CONTAINED_TOO | BURIED_TOO)) ls->flags &= ~LSF_FLOATING; } else if (ls->type == LS_MONSTER) { if (get_mon_location((struct monst *) ls->id, &ls->x, &ls->y, CONTAINED_TOO | BURIED_TOO)) ls->flags &= ~LSF_FLOATING; } if (ls->flags & LSF_FLOATING) { vision_full_recalc = 1; continue; } } /* * Check for moved light sources. It may be possible to * save some effort if an object has not moved, but not in * the current setup -- we need to recalculate for every * vision recalc. */ if (ls->type == LS_OBJECT) { if (get_obj_location((struct obj *) ls->id, &ls->x, &ls->y, 0)) ls->flags |= LSF_SHOW; } else if (ls->type == LS_MONSTER) { if (get_mon_location((struct monst *) ls->id, &ls->x, &ls->y, 0)) ls->flags |= LSF_SHOW; } else if (ls->type == LS_TEMP) { ls->flags |= LSF_SHOW; } /* minor optimization: don't bother with duplicate light sources */ /* at hero */ if (ls->x == u.ux && ls->y == u.uy) { if (at_hero_range >= ls->range) ls->flags &= ~LSF_SHOW; else at_hero_range = ls->range; } if (ls->flags & LSF_SHOW) { /* * Walk the points in the circle and see if they are * visible from the center. If so, mark'em. * * Kevin's tests indicated that doing this brute-force * method is faster for radius <= 3 (or so). */ limits = circle_ptr(ls->range); if ((max_y = (ls->y + ls->range)) >= ROWNO) max_y = ROWNO-1; if ((y = (ls->y - ls->range)) < 0) y = 0; for (; y <= max_y; y++) { row = cs_rows[y]; offset = limits[abs(y - ls->y)]; if ((min_x = (ls->x - offset)) < 0) min_x = 0; if ((max_x = (ls->x + offset)) >= COLNO) max_x = COLNO-1; if (ls->x == u.ux && ls->y == u.uy) { /* * If the light source is located at the hero, then * we can use the COULD_SEE bits already calcualted * by the vision system. More importantly than * this optimization, is that it allows the vision * system to correct problems with clear_path(). * The function clear_path() is a simple LOS * path checker that doesn't go out of its way * make things look "correct". The vision system * does this. */ for (x = min_x; x <= max_x; x++) if (row[x] & COULD_SEE) row[x] |= TEMP_LIT; } else { for (x = min_x; x <= max_x; x++) if ((ls->x == x && ls->y == y) || clear_path((int)ls->x, (int) ls->y, x, y)) row[x] |= TEMP_LIT; } } } } } /* (mon->mx == 0) implies migrating */ #define mon_is_local(mon) ((mon)->mx > 0) struct monst * find_mid(nid, fmflags) unsigned nid; unsigned fmflags; { struct monst *mtmp; if (!nid) return &youmonst; if (fmflags & FM_FMON) for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) if (!DEADMONSTER(mtmp) && mtmp->m_id == nid) return mtmp; if (fmflags & FM_MIGRATE) for (mtmp = migrating_mons; mtmp; mtmp = mtmp->nmon) if (mtmp->m_id == nid) return mtmp; if (fmflags & FM_MYDOGS) for (mtmp = mydogs; mtmp; mtmp = mtmp->nmon) if (mtmp->m_id == nid) return mtmp; return (struct monst *) 0; } /* Save all light sources of the given range. */ void save_light_sources(fd, mode, range) int fd, mode, range; { int count, actual, is_global; light_source **prev, *curr; if (perform_bwrite(mode)) { count = maybe_write_ls(fd, range, FALSE); bwrite(fd, (genericptr_t) &count, sizeof count); actual = maybe_write_ls(fd, range, TRUE); if (actual != count) panic("counted %d light sources, wrote %d! [range=%d]", count, actual, range); } if (release_data(mode)) { for (prev = &light_base; (curr = *prev) != 0; ) { if (!curr->id) { impossible("save_light_sources: no id! [range=%d]", range); is_global = 0; } else switch (curr->type) { case LS_OBJECT: is_global = !obj_is_local((struct obj *)curr->id); break; case LS_MONSTER: is_global = !mon_is_local((struct monst *)curr->id); break; case LS_TEMP: /* Temp light sources should never be saved, but need to * set next (or else you get caught in an infinite loop */ prev = &(*prev)->next; continue; default: is_global = 0; impossible("save_light_sources: bad type (%d) [range=%d]", curr->type, range); break; } /* if global and not doing local, or vice versa, remove it */ if (is_global ^ (range == RANGE_LEVEL)) { *prev = curr->next; free((genericptr_t)curr); } else { prev = &(*prev)->next; } } } } /* * Pull in the structures from disk, but don't recalculate the object * pointers. */ void restore_light_sources(fd) int fd; { int count; light_source *ls; /* restore elements */ mread(fd, (genericptr_t) &count, sizeof count); while (count-- > 0) { ls = (light_source *) alloc(sizeof(light_source)); mread(fd, (genericptr_t) ls, sizeof(light_source)); ls->next = light_base; light_base = ls; } } /* Relink all lights that are so marked. */ void relink_light_sources(ghostly) boolean ghostly; { char which; unsigned nid; light_source *ls; for (ls = light_base; ls; ls = ls->next) { if (ls->flags & LSF_NEEDS_FIXUP) { if (ls->type == LS_OBJECT || ls->type == LS_MONSTER) { if (ghostly) { if (!lookup_id_mapping((unsigned)ls->id, &nid)) impossible("relink_light_sources: no id mapping"); } else nid = (unsigned) ls->id; if (ls->type == LS_OBJECT) { which = 'o'; ls->id = (genericptr_t) find_oid(nid); } else { which = 'm'; ls->id = (genericptr_t) find_mid(nid, FM_EVERYWHERE); } if (!ls->id) impossible("relink_light_sources: cant find %c_id %d", which, nid); } else impossible("relink_light_sources: bad type (%d)", ls->type); ls->flags &= ~LSF_NEEDS_FIXUP; } } } /* * Part of the light source save routine. Count up the number of light * sources that would be written. If write_it is true, actually write * the light source out. */ STATIC_OVL int maybe_write_ls(fd, range, write_it) int fd, range; boolean write_it; { int count = 0, is_global; light_source *ls; for (ls = light_base; ls; ls = ls->next) { if (!ls->id) { impossible("maybe_write_ls: no id! [range=%d]", range); continue; } switch (ls->type) { case LS_OBJECT: is_global = !obj_is_local((struct obj *)ls->id); break; case LS_MONSTER: is_global = !mon_is_local((struct monst *)ls->id); break; case LS_TEMP: continue; default: is_global = 0; impossible("maybe_write_ls: bad type (%d) [range=%d]", ls->type, range); break; } /* if global and not doing local, or vice versa, count it */ if (is_global ^ (range == RANGE_LEVEL)) { count++; if (write_it) write_ls(fd, ls); } } return count; } /* Write a light source structure to disk. */ STATIC_OVL void write_ls(fd, ls) int fd; light_source *ls; { genericptr_t arg_save; struct obj *otmp; struct monst *mtmp; if (ls->type == LS_OBJECT || ls->type == LS_MONSTER) { if (ls->flags & LSF_NEEDS_FIXUP) bwrite(fd, (genericptr_t)ls, sizeof(light_source)); else { /* replace object pointer with id for write, then put back */ arg_save = ls->id; if (ls->type == LS_OBJECT) { otmp = (struct obj *)ls->id; ls->id = (genericptr_t)otmp->o_id; #ifdef DEBUG if (find_oid((unsigned)ls->id) != otmp) panic("write_ls: can't find obj #%u!", (unsigned)ls->id); #endif } else { /* ls->type == LS_MONSTER */ mtmp = (struct monst *)ls->id; ls->id = (genericptr_t)mtmp->m_id; #ifdef DEBUG if (find_mid((unsigned)ls->id, FM_EVERYWHERE) != mtmp) panic("write_ls: can't find mon #%u!", (unsigned)ls->id); #endif } ls->flags |= LSF_NEEDS_FIXUP; bwrite(fd, (genericptr_t)ls, sizeof(light_source)); ls->id = arg_save; ls->flags &= ~LSF_NEEDS_FIXUP; } } else { impossible("write_ls: bad type (%d)", ls->type); } } /* Change light source's ID from src to dest. */ void obj_move_light_source(src, dest) struct obj *src, *dest; { light_source *ls; for (ls = light_base; ls; ls = ls->next) if (ls->type == LS_OBJECT && ls->id == (genericptr_t) src) ls->id = (genericptr_t) dest; src->lamplit = 0; dest->lamplit = 1; } /* return true if there exist any light sources */ boolean any_light_source() { return light_base != (light_source *) 0; } /* * Snuff an object light source if at (x,y). This currently works * only for burning light sources. */ void snuff_light_source(x, y) int x, y; { light_source *ls; struct obj *obj; for (ls = light_base; ls; ls = ls->next) /* Is this position check valid??? Can I assume that the positions will always be correct because the objects would have been updated with the last vision update? [Is that recent enough???] */ 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 * ls->next is now invalid). Return assuming that there * is only one light source attached to each object. */ return; } } } /* Return TRUE if object sheds any light at all. */ boolean obj_sheds_light(obj) struct obj *obj; { /* so far, only burning objects shed light */ return obj_is_burning(obj); } /* Return TRUE if sheds light AND will be snuffed by end_burn(). */ boolean obj_is_burning(obj) struct obj *obj; { return (obj->lamplit && ( obj->otyp == MAGIC_LAMP || obj->otyp == MAGIC_CANDLE || ignitable(obj) #ifdef LIGHTSABERS || is_lightsaber(obj) #endif || artifact_light(obj))); } /* copy the light source(s) attachted to src, and attach it/them to dest */ void obj_split_light_source(src, dest) struct obj *src, *dest; { light_source *ls, *new_ls; for (ls = light_base; ls; ls = ls->next) if (ls->type == LS_OBJECT && ls->id == (genericptr_t) src) { /* * Insert the new source at beginning of list. This will * never interfere us walking down the list - we are already * past the insertion point. */ new_ls = (light_source *) alloc(sizeof(light_source)); *new_ls = *ls; if (Is_candle(src)) { /* split candles may emit less light than original group */ ls->range = candle_light_range(src); new_ls->range = candle_light_range(dest); vision_full_recalc = 1; /* in case range changed */ } new_ls->id = (genericptr_t) dest; new_ls->next = light_base; light_base = new_ls; dest->lamplit = 1; /* now an active light source */ } } /* light source `src' has been folded into light source `dest'; used for merging lit candles and adding candle(s) to lit candelabrum */ void obj_merge_light_sources(src, dest) struct obj *src, *dest; { light_source *ls; /* src == dest implies adding to candelabrum */ if (src != dest) end_burn(src, TRUE); /* extinguish candles */ for (ls = light_base; ls; ls = ls->next) if (ls->type == LS_OBJECT && ls->id == (genericptr_t) dest) { ls->range = candle_light_range(dest); vision_full_recalc = 1; /* in case range changed */ break; } } /* Candlelight is proportional to the number of candles; minimum range is 2 rather than 1 for playability. */ int candle_light_range(obj) struct obj *obj; { int radius; if (obj->otyp == CANDELABRUM_OF_INVOCATION) { /* * The special candelabrum emits more light than the * corresponding number of candles would. * 1..3 candles, range 2 (minimum range); * 4..6 candles, range 3 (normal lamp range); * 7 candles, range 4 (bright). */ radius = (obj->spe < 4) ? 2 : (obj->spe < 7) ? 3 : 4; } else if (Is_candle(obj)) { /* * Range is incremented by powers of 7 so that it will take * wizard mode quantities of candles to get more light than * from a lamp, without imposing an arbitrary limit. * 1..6 candles, range 2; * 7..48 candles, range 3; * 49..342 candles, range 4; &c. */ long n = obj->quan; radius = 1; /* always incremented at least once */ do { radius++; n /= 7L; } while (n > 0L); } else { /* we're only called for lit candelabrum or candles */ /* impossible("candlelight for %d?", obj->otyp); */ radius = 3; /* lamp's value */ } return radius; } #ifdef WIZARD extern char *FDECL(fmt_ptr, (const genericptr, char *)); /* from alloc.c */ int wiz_light_sources() { winid win; char buf[BUFSZ], arg_address[20]; light_source *ls; win = create_nhwindow(NHW_MENU); /* corner text window */ if (win == WIN_ERR) return 0; Sprintf(buf, "Mobile light sources: hero @ (%2d,%2d)", u.ux, u.uy); putstr(win, 0, buf); putstr(win, 0, ""); if (light_base) { putstr(win, 0, "location range flags type id"); putstr(win, 0, "-------- ----- ------ ---- -------"); for (ls = light_base; ls; ls = ls->next) { Sprintf(buf, " %2d,%2d %2d 0x%04x %s %s", ls->x, ls->y, ls->range, ls->flags, (ls->type == LS_OBJECT ? "obj" : ls->type == LS_MONSTER ? (mon_is_local((struct monst *)ls->id) ? "mon" : ((struct monst *)ls->id == &youmonst) ? "you" : "") : /* migrating monster */ "???"), fmt_ptr(ls->id, arg_address)); putstr(win, 0, buf); } } else putstr(win, 0, ""); display_nhwindow(win, FALSE); destroy_nhwindow(win); return 0; } #endif /* WIZARD */ #endif /* OVL3 */ /*light.c*/ slashem-0.0.7E7F3/src/zap.c0000664000076400007640000041313710545462317013412 0ustar aliali/* SCCS Id: @(#)zap.c 3.4 2003/08/24 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" /* Disintegration rays have special treatment; corpses are never left. * But the routine which calculates the damage is separate from the routine * which kills the monster. The damage routine returns this cookie to * indicate that the monster should be disintegrated. */ #define MAGIC_COOKIE 1000 #ifdef OVLB static NEARDATA boolean obj_zapped; static NEARDATA int poly_zapped; #endif extern boolean notonhead; /* for long worms */ /* kludge to use mondied instead of killed */ extern boolean m_using; STATIC_DCL void FDECL(costly_cancel, (struct obj *)); STATIC_DCL void FDECL(polyuse, (struct obj*, int, int)); STATIC_DCL void FDECL(create_polymon, (struct obj *, int)); STATIC_DCL boolean FDECL(zap_updown, (struct obj *)); 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 void FDECL(throwstorm, (struct obj *, int, int, int)); #ifdef STEED STATIC_DCL boolean FDECL(zap_steed, (struct obj *)); #endif #ifdef OVLB STATIC_DCL int FDECL(zap_hit, (int,int)); #endif #ifdef OVL0 STATIC_DCL void FDECL(backfire, (struct obj *)); STATIC_DCL int FDECL(spell_hit_bonus, (int)); #endif /* WAC -- ZT_foo #defines moved to spell.h, since explode uses these types */ #define is_hero_spell(type) ((type) >= 10 && (type) < 20) #define is_mega_spell(type) (type >= ZT_MEGA(ZT_FIRST) && \ type <= ZT_MEGA(ZT_LAST)) #ifndef OVLB STATIC_VAR const char are_blinded_by_the_flash[]; extern const char * const flash_types[]; #else STATIC_VAR const char are_blinded_by_the_flash[] = "are blinded by the flash!"; const char * const flash_types[] = { /* also used in buzzmu(mcastu.c) */ "magic missile", /* Wands must be 0-9 */ "bolt of fire", "bolt of cold", "sleep ray", "death ray", "bolt of lightning", "", "", "", "", "magic missile", /* Spell equivalents must be 10-19 */ "fireball", "cone of cold", "sleep ray", "finger of death", "bolt of lightning", /* New spell & used for retribution */ "blast of poison gas", /*WAC New spells acid + poison*/ "stream of acid", "", "", "blast of missiles", /* Dragon breath equivalents 20-29*/ "blast of fire", "blast of frost", "blast of sleep gas", "blast of disintegration", "blast of lightning", "blast of poison gas", "blast of acid", "", "", "magical blast", /* Megaspell equivalents must be 30-39 */ "fireball", /*Should be same as explosion names*/ "ball of cold", "", "", "ball lightning", "poison gas cloud", "splash of acid", "", "" }; /* Yells for Megaspells*/ const char *yell_types[] = { /*10 different beam types*/ "With the wisdom of Merlin!", /* Magic */ /* Merlin was the wizard who advised King Arthur */ "The rage of Huitzilopochtli!", /* Fire */ /* Huitzilopochtli is the god of the Sun of Aztec myth */ "The sorrow of Demeter!", /* Frost */ /* Demeter - when she is without her daughter Persephone * she caused winter */ "The rest of Hypnos", /* Sleep */ /* Hypnos - Greek god of sleep */ "The wrath of Kali", /* Disint */ /* Kali is the Hindu god of dissolution and destruction */ "From the forge of Vulcan!", /* Lightning*/ /* Vulcan forged Zeus' lightning bolts [Greek] */ "From the Fangs of Jormungand", /* Poison gas */ /* Serpent of Viking Mythology. Poisons the skies/seas during * Ragnarok */ "The anger of the Mad Chemist!", /* Acid */ "", "" }; /* Routines for IMMEDIATE wands and spells. */ /* bhitm: monster mtmp was hit by the effect of wand or spell otmp */ int bhitm(mtmp, otmp) struct monst *mtmp; struct obj *otmp; { boolean wake = TRUE; /* Most 'zaps' should wake monster */ boolean reveal_invis = FALSE; boolean dbldam = Role_if(PM_KNIGHT) && u.uhave.questart; int dmg, otyp = otmp->otyp; const char *zap_type_text = "spell"; struct obj *obj; boolean disguised_mimic = (mtmp->data->mlet == S_MIMIC && mtmp->m_ap_type != M_AP_NOTHING); int pm_index; int skilldmg = 0; if (objects[otyp].oc_class == SPBOOK_CLASS) { /* Is a spell */ skilldmg = spell_damage_bonus(otyp); zap_type_text = "spell"; } else zap_type_text = "wand"; if (u.uswallow && mtmp == u.ustuck) reveal_invis = FALSE; switch(otyp) { case WAN_STRIKING: zap_type_text = "wand"; /* fall through */ case SPE_FORCE_BOLT: reveal_invis = TRUE; if (resists_magm(mtmp)) { /* match effect on player */ shieldeff(mtmp->mx, mtmp->my); break; /* skip makeknown */ } else if (u.uswallow || rnd(20) < 10 + find_mac(mtmp)) { dmg = d(2,12); if(dbldam) dmg *= 2; dmg += skilldmg; hit(zap_type_text, mtmp, exclam(dmg)); (void) resist(mtmp, otmp->oclass, dmg, TELL); } else miss(zap_type_text, mtmp); makeknown(otyp); break; 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)); pline("A huge hole opens up..."); expels(mtmp, mtmp->data, TRUE); } } 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 SPE_TURN_UNDEAD: case WAN_UNDEAD_TURNING: wake = FALSE; if (unturn_dead(mtmp)) wake = TRUE; if (is_undead(mtmp->data)) { reveal_invis = TRUE; wake = TRUE; dmg = rnd(8); if(dbldam) dmg *= 2; dmg += skilldmg; 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: case SPE_POLYMORPH: case POT_POLYMORPH: if (resists_magm(mtmp)) { /* magic resistance protects from polymorph traps, so make 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); } /* dropped inventory shouldn't be hit by this zap */ for (obj = mtmp->minvent; obj; obj = obj->nobj) bypass_obj(obj); /* flags.bypasses = TRUE; ## for make_corpse() */ /* no corpse after system shock */ xkilled(mtmp, 3); } else if (mon_spec_poly(mtmp, (struct permonst *)0, 0L, (otyp != POT_POLYMORPH), canseemon(mtmp), FALSE, TRUE)) { if (!Hallucination && canspotmon(mtmp)) makeknown(otyp); } } break; case WAN_CANCELLATION: case SPE_CANCELLATION: (void) cancel_monst(mtmp, otmp, TRUE, TRUE, FALSE); break; case WAN_TELEPORTATION: case SPE_TELEPORT_AWAY: reveal_invis = !u_teleport_mon(mtmp, TRUE); break; case WAN_MAKE_INVISIBLE: { int oldinvis = mtmp->minvis; char nambuf[BUFSZ]; /* format monster's name before altering its visibility */ Strcpy(nambuf, Monnam(mtmp)); mon_set_minvis(mtmp); if (!oldinvis && knowninvisible(mtmp)) { pline("%s turns transparent!", nambuf); makeknown(otyp); } break; } case WAN_NOTHING: case WAN_LOCKING: case SPE_WIZARD_LOCK: wake = FALSE; reveal_invis = TRUE; break; case WAN_FEAR: if (!is_undead(mtmp->data) && !resist(mtmp, otmp->oclass, 0, NOTELL) && (!mtmp->mflee || mtmp->mfleetim)) { if (canseemon(mtmp)) pline("%s suddenly panics!", Monnam(mtmp)); monflee(mtmp, 0, FALSE, TRUE); } break; case WAN_PROBING: reveal_invis = TRUE; wake = FALSE; probe_monster(mtmp); makeknown(otyp); break; case WAN_OPENING: case SPE_KNOCK: wake = FALSE; /* don't want immediate counterattack */ if (u.uswallow && mtmp == u.ustuck) { if (is_animal(mtmp->data)) { if (Blind) You_feel("a sudden rush of air!"); else pline("%s opens its mouth!", Monnam(mtmp)); } expels(mtmp, mtmp->data, TRUE); #ifdef STEED } else if (!!(obj = which_armor(mtmp, W_SADDLE))) { mtmp->misc_worn_check &= ~obj->owornmask; update_mon_intrinsics(mtmp, obj, FALSE, FALSE); obj->owornmask = 0L; obj_extract_self(obj); place_object(obj, mtmp->mx, mtmp->my); /* call stackobj() if we ever drop anything that can merge */ newsym(mtmp->mx, mtmp->my); #endif } break; case WAN_HEALING: case WAN_EXTRA_HEALING: case SPE_HEALING: case SPE_EXTRA_HEALING: reveal_invis = TRUE; if (mtmp->data != &mons[PM_PESTILENCE]) { wake = FALSE; /* wakeup() makes the target angry */ mtmp->mhp += /* [ALI] FIXME: Makes no sense that cursed wands are more * effective than uncursed wands. This behaviour dates * right back to Slash v3 (and probably to v1). */ otyp == WAN_HEALING ? d(5,2) + 5 * !!bcsign(otmp) : otyp == WAN_EXTRA_HEALING ? d(5,4) + 10 * !!bcsign(otmp) : otyp == SPE_HEALING ? rnd(10) +4 : d(3,8)+6; if (mtmp->mhp > mtmp->mhpmax) { if (otmp->oclass == WAND_CLASS) mtmp->mhpmax++; mtmp->mhp = mtmp->mhpmax; } if (otmp->oclass == WAND_CLASS && !otmp->cursed) mtmp->mcansee = 1; if (mtmp->mblinded) { mtmp->mblinded = 0; mtmp->mcansee = 1; } if (canseemon(mtmp)) { if (disguised_mimic) { if (mtmp->m_ap_type == M_AP_OBJECT && mtmp->mappearance == STRANGE_OBJECT) { /* it can do better now */ set_mimic_sym(mtmp); newsym(mtmp->mx, mtmp->my); } else mimic_hit_msg(mtmp, otyp); } else pline("%s %s%s better.", Monnam(mtmp), otmp->oclass == SPBOOK_CLASS ? "looks" : "begins to look", (otyp == SPE_EXTRA_HEALING || otyp == WAN_EXTRA_HEALING) ? " much" : "" ); makeknown(otyp); } /* Healing pets is a good thing ... */ if (mtmp->mtame || mtmp->mpeaceful) { adjalign(Role_if(PM_HEALER) ? 1 : sgn(u.ualign.type)); } } else if (otmp->oclass == SPBOOK_CLASS) { /* Pestilence */ /* [ALI] FIXME: Makes no sense that Pestilence is not * affected by wands of (extra) healing, but that raises * whole new questions of what damage should be done. * In vanilla NetHack, 3d{4,8} is half of the normal * 6d{4,8} healing power of spells of (extra) healing. */ /* Pestilence will always resist; damage is half of 3d{4,8} */ (void) resist(mtmp, otmp->oclass, d(3, otyp == SPE_EXTRA_HEALING ? 8 : 4), TELL); } break; case WAN_LIGHT: /* (broken wand) */ if (flash_hits_mon(mtmp, otmp)) { makeknown(WAN_LIGHT); reveal_invis = TRUE; } break; case WAN_SLEEP: /* (broken wand) */ /* [wakeup() doesn't rouse victims of temporary sleep, so it's okay to leave `wake' set to TRUE here] */ reveal_invis = TRUE; if (sleep_monst(mtmp, d(1 + otmp->spe, 12), WAND_CLASS)) slept_monst(mtmp); if (!Blind) makeknown(WAN_SLEEP); break; case SPE_STONE_TO_FLESH: if (monsndx(mtmp->data) == PM_STONE_GOLEM) pm_index = PM_FLESH_GOLEM; else if (monsndx(mtmp->data) == PM_STATUE_GARGOYLE) pm_index = PM_GARGOYLE; else pm_index = NON_PM; if (pm_index != NON_PM) { char *name = Monnam(mtmp); /* turn into flesh equivalent */ if (newcham(mtmp, &mons[pm_index], FALSE, FALSE)) { if (canseemon(mtmp)) pline("%s turns to flesh!", name); } else { if (canseemon(mtmp)) pline("%s looks rather fleshy for a moment.", name); } } else wake = FALSE; break; case SPE_DRAIN_LIFE: case WAN_DRAINING: /* KMH */ dmg = rnd(8); if(dbldam) dmg *= 2; dmg += skilldmg; if (resists_drli(mtmp)) { shieldeff(mtmp->mx, mtmp->my); break; /* skip makeknown */ }else if (!resist(mtmp, otmp->oclass, dmg, NOTELL) && 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)); } } makeknown(otyp); break; default: impossible("What an interesting effect (%d)", otyp); break; } if(wake) { if(mtmp->mhp > 0) { wakeup(mtmp); m_respond(mtmp); if(mtmp->isshk && !*u.ushops) hot_pursuit(mtmp); } else if(mtmp->m_ap_type) seemimic(mtmp); /* might unblock if mimicing a boulder/door */ } /* note: bhitpos won't be set if swallowed, but that's okay since * reveal_invis will be false. We can't use mtmp->mx, my since it * might be an invisible worm hit on the tail. */ if (reveal_invis) { if (mtmp->mhp > 0 && cansee(bhitpos.x, bhitpos.y) && !canspotmon(mtmp)) map_invisible(bhitpos.x, bhitpos.y); } return 0; } void probe_monster(mtmp) struct monst *mtmp; { struct obj *otmp; 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)); } } #endif /*OVLB*/ #ifdef OVL1 /* * Return the object's physical location. This only makes sense for * objects that are currently on the level (i.e. migrating objects * are nowhere). By default, only things that can be seen (in hero's * inventory, monster's inventory, or on the ground) are reported. * By adding BURIED_TOO and/or CONTAINED_TOO flags, you can also get * the location of buried and contained objects. Note that if an * object is carried by a monster, its reported position may change * from turn to turn. This function returns FALSE if the position * is not available or subject to the constraints above. */ boolean get_obj_location(obj, xp, yp, locflags) struct obj *obj; xchar *xp, *yp; int locflags; { switch (obj->where) { case OBJ_INVENT: *xp = u.ux; *yp = u.uy; return TRUE; case OBJ_FLOOR: *xp = obj->ox; *yp = obj->oy; return TRUE; case OBJ_MINVENT: if (obj->ocarry->mx) { *xp = obj->ocarry->mx; *yp = obj->ocarry->my; return TRUE; } break; /* !mx => migrating monster */ case OBJ_BURIED: if (locflags & BURIED_TOO) { *xp = obj->ox; *yp = obj->oy; return TRUE; } break; case OBJ_CONTAINED: if (locflags & CONTAINED_TOO) return get_obj_location(obj->ocontainer, xp, yp, locflags); break; } *xp = *yp = 0; return FALSE; } boolean get_mon_location(mon, xp, yp, locflags) struct monst *mon; xchar *xp, *yp; int locflags; /* non-zero means get location even if monster is buried */ { if (mon == &youmonst) { *xp = u.ux; *yp = u.uy; return TRUE; } else if (mon->mx > 0 && (!mon->mburied || locflags)) { *xp = mon->mx; *yp = mon->my; return TRUE; } else { /* migrating or buried */ *xp = *yp = 0; return FALSE; } } /* used by revive() and animate_statue() */ struct monst * montraits(obj,cc) struct obj *obj; coord *cc; { struct monst *mtmp = (struct monst *)0; struct monst *mtmp2 = (struct monst *)0; if (obj->oxlth && (obj->oattached == OATTACHED_MONST)) mtmp2 = get_mtraits(obj, TRUE); if (mtmp2) { /* save_mtraits() validated mtmp2->mnum */ mtmp2->data = &mons[mtmp2->mnum]; 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 */ if (mtmp->mhpmax > mtmp2->mhpmax && is_rider(mtmp2->data)) mtmp2->mhpmax = mtmp->mhpmax; 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; mtmp2->muy = mtmp->muy; mtmp2->mw = mtmp->mw; mtmp2->wormno = mtmp->wormno; mtmp2->misc_worn_check = mtmp->misc_worn_check; mtmp2->weapon_check = mtmp->weapon_check; mtmp2->mtrapseen = mtmp->mtrapseen; mtmp2->mflee = mtmp->mflee; mtmp2->mburied = mtmp->mburied; mtmp2->mundetected = mtmp->mundetected; mtmp2->mfleetim = mtmp->mfleetim; mtmp2->mlstmv = mtmp->mlstmv; mtmp2->m_ap_type = mtmp->m_ap_type; #ifdef INVISIBLE_OBJECTS mtmp2->minvis = obj->oinvis; #endif /* set these ones explicitly */ mtmp2->mavenge = 0; mtmp2->meating = 0; mtmp2->mleashed = 0; mtmp2->mtrapped = 0; mtmp2->msleeping = 0; mtmp2->mfrozen = 0; mtmp2->mcanmove = 1; /* most cancelled monsters return to normal, but some need to stay cancelled */ if (!dmgtype(mtmp2->data, AD_SEDU) #ifdef SEDUCE && !dmgtype(mtmp2->data, AD_SSEX) #endif && mtmp2->mnum != PM_GYPSY /* Gypsies use mcan to enforce the rule that they only * ever grant one wish. */ ) mtmp2->mcan = 0; mtmp2->mcansee = 1; /* set like in makemon */ mtmp2->mblinded = 0; mtmp2->mstun = 0; mtmp2->mconf = 0; replmon(mtmp,mtmp2); newsym(mtmp2->mx, mtmp2->my); /* Might now be invisible */ } return mtmp2; } /* * 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. */ struct monst * revive(obj) 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; if (enexto(&new_xy, x, y, &mons[montype])) x = new_xy.x, y = new_xy.y; } if(cant_create(&montype, TRUE)) { /* make a zombie or worm instead */ mtmp = makemon(&mons[montype], x, y, 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)) { coord xy; xy.x = x; xy.y = y; mtmp = montraits(obj, &xy); if (mtmp && mtmp->mtame && !mtmp->isminion) 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; struct monst *ghost; (void) memcpy((genericptr_t)&m_id, (genericptr_t)obj->oextra, sizeof(m_id)); ghost = find_mid(m_id, FM_FMON); if (ghost && ghost->data == &mons[PM_GHOST]) { int x2, y2; x2 = ghost->mx; y2 = ghost->my; if (ghost->mtame) savetame = ghost->mtame; if (canseemon(ghost)) pline("%s is suddenly drawn into its former body!", Monnam(ghost)); mondead(ghost); recorporealization = TRUE; newsym(x2, y2); } /* don't mess with obj->oxlth here */ obj->oattached = OATTACHED_NOTHING; } /* 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) { if (obj->oeaten) mtmp->mhp = eaten_stat(mtmp->mhp, obj); /* track that this monster was revived at least once */ mtmp->mrevived = 1; if (recorporealization) { /* If mtmp is revivification of former tame ghost*/ if (savetame) { struct monst *mtmp2 = tamedog(mtmp, (struct obj *)0); if (mtmp2) { mtmp2->mtame = savetame; mtmp = mtmp2; } } /* was ghost, now alive, it's all very confusing */ mtmp->mconf = 1; } switch (obj->where) { case OBJ_INVENT: useup(obj); break; case OBJ_FLOOR: /* in case MON_AT+enexto for invisible mon */ x = obj->ox, y = obj->oy; /* not useupf(), which charges */ if (obj->quan > 1L) obj = splitobj(obj, 1); 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"); } } } return mtmp; } STATIC_OVL void revive_egg(obj) struct obj *obj; { /* * Note: generic eggs with corpsenm set to NON_PM will never hatch. */ if (obj->otyp != EGG) return; if (obj->corpsenm != NON_PM && !dead_species(obj->corpsenm, TRUE)) attach_egg_hatch_timeout(obj); } /* try to revive all corpses and eggs carried by `mon' */ int unturn_dead(mon) struct monst *mon; { struct obj *otmp, *otmp2; struct monst *mtmp2; char owner[BUFSZ], corpse[BUFSZ]; boolean youseeit; int once = 0, res = 0; youseeit = (mon == &youmonst) ? TRUE : canseemon(mon); otmp2 = (mon == &youmonst) ? invent : mon->minvent; while ((otmp = otmp2) != 0) { otmp2 = otmp->nobj; if (otmp->otyp == EGG) revive_egg(otmp); if (otmp->otyp != CORPSE) continue; /* save the name; the object is liable to go away */ if (youseeit) Strcpy(corpse, corpse_xname(otmp, TRUE)); /* for a merged group, only one is revived; should this be fixed? */ if ((mtmp2 = revive(otmp)) != 0) { ++res; if (youseeit) { if (!once++) Strcpy(owner, (mon == &youmonst) ? "Your" : s_suffix(Monnam(mon))); pline("%s %s suddenly comes alive!", owner, corpse); } else if (canseemon(mtmp2)) pline("%s suddenly appears!", Amonnam(mtmp2)); } } return res; } #endif /*OVL1*/ #ifdef OVLB static const char charged_objs[] = { WAND_CLASS, WEAPON_CLASS, ARMOR_CLASS, SPBOOK_CLASS, 0 }; STATIC_OVL void costly_cancel(obj) register struct obj *obj; { char objroom; struct monst *shkp = (struct monst *)0; if (obj->no_charge) return; switch (obj->where) { case OBJ_INVENT: if (obj->unpaid) { shkp = shop_keeper(*u.ushops); if (!shkp) return; Norep("You cancel an unpaid object, you pay for it!"); bill_dummy_object(obj); } break; case OBJ_FLOOR: objroom = *in_rooms(obj->ox, obj->oy, SHOPBASE); shkp = shop_keeper(objroom); if (!shkp || !inhishop(shkp)) return; if (costly_spot(u.ux, u.uy) && objroom == *u.ushops) { Norep("You cancel it, you pay for it!"); bill_dummy_object(obj); } else (void) stolen_value(obj, obj->ox, obj->oy, FALSE, FALSE, FALSE); break; } } /* cancel obj, possibly carried by you or a monster */ void cancel_item(obj) register struct obj *obj; { boolean u_ring = (obj == uleft) || (obj == uright); register boolean holy = (obj->otyp == POT_WATER && obj->blessed); switch(obj->otyp) { case RIN_GAIN_STRENGTH: if ((obj->owornmask & W_RING) && u_ring) { ABON(A_STR) -= obj->spe; flags.botl = 1; } break; case RIN_GAIN_DEXTERITY: if ((obj->owornmask & W_RING) && u_ring) { ABON(A_DEX) -= obj->spe; flags.botl = 1; } break; case RIN_GAIN_CONSTITUTION: if ((obj->owornmask & W_RING) && u_ring) { ABON(A_CON) -= obj->spe; flags.botl = 1; } break; case RIN_GAIN_INTELLIGENCE: if ((obj->owornmask & W_RING) && u_ring) { ABON(A_INT) -= obj->spe; flags.botl = 1; } break; case RIN_GAIN_WISDOM: if ((obj->owornmask & W_RING) && u_ring) { ABON(A_WIS) -= obj->spe; flags.botl = 1; } break; case RIN_ADORNMENT: if ((obj->owornmask & W_RING) && u_ring) { ABON(A_CHA) -= obj->spe; flags.botl = 1; } break; case RIN_INCREASE_ACCURACY: if ((obj->owornmask & W_RING) && u_ring) u.uhitinc -= obj->spe; break; case RIN_INCREASE_DAMAGE: if ((obj->owornmask & W_RING) && u_ring) u.udaminc -= obj->spe; break; case HELM_OF_BRILLIANCE: if ((obj->owornmask & W_ARMH) && (obj == uarmh)) { ABON(A_INT) -= obj->spe; ABON(A_WIS) -= obj->spe; flags.botl = 1; } break; case GAUNTLETS_OF_DEXTERITY: if ((obj->owornmask & W_ARMG) && (obj == uarmg)) { ABON(A_DEX) -= obj->spe; flags.botl = 1; } break; /* case RIN_PROTECTION: not needed */ } if (objects[obj->otyp].oc_magic || (obj->spe && (obj->oclass == ARMOR_CLASS || obj->oclass == WEAPON_CLASS || is_weptool(obj))) || obj->otyp == POT_ACID || obj->otyp == POT_SICKNESS) { if (obj->spe != ((obj->oclass == WAND_CLASS) ? -1 : 0) && obj->otyp != WAN_CANCELLATION && /* can't cancel cancellation */ obj->otyp != MAGIC_LAMP && obj->otyp != MAGIC_CANDLE && obj->otyp != CANDELABRUM_OF_INVOCATION) { costly_cancel(obj); obj->spe = (obj->oclass == WAND_CLASS) ? -1 : 0; } switch (obj->oclass) { case SCROLL_CLASS: costly_cancel(obj); obj->otyp = SCR_BLANK_PAPER; obj->spe = 0; break; case SPBOOK_CLASS: if (obj->otyp != SPE_CANCELLATION && obj->otyp != SPE_BOOK_OF_THE_DEAD) { costly_cancel(obj); obj->otyp = SPE_BLANK_PAPER; } break; case POTION_CLASS: /* Potions of amnesia are uncancelable. */ if (obj->otyp == POT_AMNESIA) break; costly_cancel(obj); if (obj->otyp == POT_SICKNESS || obj->otyp == POT_SEE_INVISIBLE) { /* sickness is "biologically contaminated" fruit juice; cancel it * and it just becomes fruit juice... whereas see invisible * tastes like "enchanted" fruit juice, it similarly cancels. */ obj->otyp = POT_FRUIT_JUICE; } else { obj->otyp = POT_WATER; obj->odiluted = 0; /* same as any other water */ } break; } } if (holy) costly_cancel(obj); unbless(obj); uncurse(obj); #ifdef INVISIBLE_OBJECTS if (obj->oinvis) obj->oinvis = 0; #endif return; } /* Remove a positive enchantment or charge from obj, * possibly carried by you or a monster */ boolean drain_item(obj) register struct obj *obj; { boolean u_ring; /* Is this a charged/enchanted object? */ if (!obj || (!objects[obj->otyp].oc_charged && obj->oclass != WEAPON_CLASS && obj->oclass != ARMOR_CLASS && !is_weptool(obj)) || obj->spe <= 0) return (FALSE); if (obj_resists(obj, 10, 90)) return (FALSE); /* Charge for the cost of the object */ costly_cancel(obj); /* The term "cancel" is okay for now */ /* Drain the object and any implied effects */ obj->spe--; u_ring = (obj == uleft) || (obj == uright); switch(obj->otyp) { case RIN_GAIN_STRENGTH: if ((obj->owornmask & W_RING) && u_ring) { ABON(A_STR)--; flags.botl = 1; } break; case RIN_GAIN_CONSTITUTION: if ((obj->owornmask & W_RING) && u_ring) { ABON(A_CON)--; flags.botl = 1; } break; case RIN_ADORNMENT: if ((obj->owornmask & W_RING) && u_ring) { ABON(A_CHA)--; flags.botl = 1; } break; case RIN_INCREASE_ACCURACY: if ((obj->owornmask & W_RING) && u_ring) u.uhitinc--; break; case RIN_INCREASE_DAMAGE: if ((obj->owornmask & W_RING) && u_ring) u.udaminc--; break; case HELM_OF_BRILLIANCE: if ((obj->owornmask & W_ARMH) && (obj == uarmh)) { ABON(A_INT)--; ABON(A_WIS)--; flags.botl = 1; } break; case GAUNTLETS_OF_DEXTERITY: if ((obj->owornmask & W_ARMG) && (obj == uarmg)) { ABON(A_DEX)--; flags.botl = 1; } break; case RIN_PROTECTION: flags.botl = 1; break; } if (carried(obj)) update_inventory(); return (TRUE); } #endif /*OVLB*/ #ifdef OVL0 boolean obj_resists(obj, ochance, achance) struct obj *obj; int ochance, achance; /* percent chance for ordinary objects, artifacts */ { /* [ALI] obj_resists(obj, 0, 0) is used to test for objects resisting * containment (see bury_an_obj() and monstone() for details). */ if (evades_destruction(obj) && (ochance || achance)) return TRUE; if (obj->otyp == AMULET_OF_YENDOR || obj->otyp == SPE_BOOK_OF_THE_DEAD || obj->otyp == CANDELABRUM_OF_INVOCATION || obj->otyp == BELL_OF_OPENING || (obj->otyp == CORPSE && is_rider(&mons[obj->corpsenm]))) { return TRUE; } else { int chance = rn2(100); return((boolean)(chance < (obj->oartifact ? achance : ochance))); } } boolean obj_shudders(obj) struct obj *obj; { int zap_odds; if (obj->oclass == WAND_CLASS) zap_odds = 3; /* half-life = 2 zaps */ else if (obj->cursed) zap_odds = 3; /* half-life = 2 zaps */ else if (obj->blessed) zap_odds = 12; /* half-life = 8 zaps */ else zap_odds = 8; /* half-life = 6 zaps */ /* adjust for "large" quantities of identical things */ if(obj->quan > 4L) zap_odds /= 2; return((boolean)(! rn2(zap_odds))); } #endif /*OVL0*/ #ifdef OVLB /* Use up at least minwt number of things made of material mat. * There's also a chance that other stuff will be used up. Finally, * there's a random factor here to keep from always using the stuff * at the top of the pile. */ STATIC_OVL void polyuse(objhdr, mat, minwt) struct obj *objhdr; int mat, minwt; { register struct obj *otmp, *otmp2; for(otmp = objhdr; minwt > 0 && otmp; otmp = otmp2) { otmp2 = otmp->nexthere; if (otmp == uball || otmp == uchain) continue; if (obj_resists(otmp, 0, 0)) continue; /* preserve unique objects */ if (evades_destruction(otmp)) continue; #ifdef MAIL if (otmp->otyp == SCR_MAIL) continue; #endif if (((int) objects[otmp->otyp].oc_material == mat) == (rn2(minwt + 1) != 0)) { /* appropriately add damage to bill */ if (costly_spot(otmp->ox, otmp->oy)) { if (*u.ushops) addtobill(otmp, FALSE, FALSE, FALSE); else (void)stolen_value(otmp, otmp->ox, otmp->oy, FALSE, FALSE, TRUE); } if (otmp->quan < LARGEST_INT) minwt -= (int)otmp->quan; else minwt = 0; delobj(otmp); } } } /* * Polymorph some of the stuff in this pile into a monster, preferably * a golem of the kind okind. */ STATIC_OVL void create_polymon(obj, okind) struct obj *obj; int okind; { struct permonst *mdat = (struct permonst *)0; struct monst *mtmp; const char *material; int pm_index; /* no golems if you zap only one object -- not enough stuff */ if(!obj || (!obj->nexthere && obj->quan == 1L)) return; /* some of these choices are arbitrary */ switch(okind) { case IRON: case METAL: case MITHRIL: pm_index = PM_IRON_GOLEM; material = "metal "; break; case COPPER: case SILVER: case PLATINUM: case GEMSTONE: case MINERAL: pm_index = rn2(2) ? PM_STONE_GOLEM : PM_CLAY_GOLEM; material = "lithic "; break; case 0: case FLESH: /* there is no flesh type, but all food is type 0, so we use it */ pm_index = PM_FLESH_GOLEM; material = "organic "; break; case WAX: pm_index = PM_WAX_GOLEM; material = "wax "; break; case WOOD: pm_index = PM_WOOD_GOLEM; material = "wood "; break; case LEATHER: pm_index = PM_LEATHER_GOLEM; material = "leather "; break; case CLOTH: pm_index = PM_ROPE_GOLEM; material = "cloth "; break; case PLASTIC: pm_index = PM_PLASTIC_GOLEM; material = "plastic "; break; case BONE: pm_index = PM_SKELETON; /* nearest thing to "bone golem" */ material = "bony "; break; case GOLD: pm_index = PM_GOLD_GOLEM; material = "gold "; break; case GLASS: pm_index = PM_GLASS_GOLEM; material = "glassy "; break; case PAPER: pm_index = PM_PAPER_GOLEM; material = "paper "; break; default: /* if all else fails... */ pm_index = PM_STRAW_GOLEM; material = ""; break; } if (!(mvitals[pm_index].mvflags & G_GENOD)) mdat = &mons[pm_index]; 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)); } } /* Assumes obj is on the floor. */ void do_osshock(obj) struct obj *obj; { long i; #ifdef MAIL if (obj->otyp == SCR_MAIL) return; #endif obj_zapped = TRUE; if(poly_zapped < 0) { /* some may metamorphosize */ for(i=obj->quan; i; i--) if (! rn2(Luck + 45)) { poly_zapped = objects[obj->otyp].oc_material; break; } } /* 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 */ if (costly_spot(obj->ox, obj->oy)) { if (*u.ushops) addtobill(obj, FALSE, FALSE, FALSE); else (void)stolen_value(obj, obj->ox, obj->oy, FALSE, FALSE, TRUE); } /* zap the object */ delobj(obj); } /* [ALI] Deal with any special effects after "wearing" an object. */ void puton_worn_item(obj) struct obj *obj; { if (!obj->owornmask) return; switch (obj->oclass) { case TOOL_CLASS: if (obj == ublindf) Blindf_on(obj); break; case AMULET_CLASS: Amulet_on(); break; case RING_CLASS: case FOOD_CLASS: /* meat ring */ Ring_on(obj); break; case ARMOR_CLASS: if (obj == uarm) (void) Armor_on(); else if (obj == uarmc) (void) Cloak_on(); else if (obj == uarmf) (void) Boots_on(); else if (obj == uarmg) (void) Gloves_on(); else if (obj == uarmh) (void) Helmet_on(); /* else if (obj == uarms) (void) Shield_on(); */ break; } } /* * Polymorph the object to the given object ID. If the ID is STRANGE_OBJECT * then pick random object from the source's class (this is the standard * "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; { struct obj *otmp; xchar ox, oy; boolean can_merge = (id == STRANGE_OBJECT); int obj_location = obj->where; int old_nutrit, new_nutrit; #ifdef UNPOLYPILE boolean unpoly = (id == STRANGE_OBJECT); #endif /* WAC Amulets of Unchanging shouldn't change */ if (obj->otyp == AMULET_OF_UNCHANGING) return obj; if (obj->otyp == BOULDER && In_sokoban(&u.uz)) change_luck(-1); /* Sokoban guilt */ #ifdef WIZARD otmp = (struct obj *)0; if (id == STRANGE_OBJECT && wizard && Polymorph_control) { int typ; char buf[BUFSZ]; getlin("Polymorph into what? [type the name]", buf); otmp = readobjnam(buf, (struct obj *)0, TRUE); if (otmp && otmp->oclass != obj->oclass) { delobj(otmp); otmp = (struct obj *)0; } else if (otmp) { typ = otmp->otyp; delobj(otmp); otmp = mksobj(typ, TRUE, FALSE); } } if (!otmp) #endif if (id == STRANGE_OBJECT) { /* preserve symbol */ int try_limit = 3; /* Try up to 3 times to make the magic-or-not status of the new item be the same as it was for the old one. */ otmp = (struct obj *)0; do { if (otmp) delobj(otmp); otmp = mkobj(obj->oclass, FALSE); } while (--try_limit > 0 && objects[obj->otyp].oc_magic != objects[otmp->otyp].oc_magic); } else { /* literally replace obj with this new thing */ otmp = mksobj(id, FALSE, FALSE); /* Actually more things use corpsenm but they polymorph differently */ #define USES_CORPSENM(typ) ((typ)==CORPSE || (typ)==STATUE || (typ)==FIGURINE) if (USES_CORPSENM(obj->otyp) && USES_CORPSENM(id)) otmp->corpsenm = obj->corpsenm; #undef USES_CORPSENM } /* preserve quantity */ otmp->quan = obj->quan; /* preserve the shopkeepers (lack of) interest */ otmp->no_charge = obj->no_charge; /* preserve inventory letter if in inventory */ if (obj_location == OBJ_INVENT) otmp->invlet = obj->invlet; #ifdef MAIL /* You can't send yourself 100 mail messages and then * polymorph them into useful scrolls */ if (obj->otyp == SCR_MAIL) { otmp->otyp = SCR_MAIL; otmp->spe = 1; #ifdef UNPOLYPILE unpoly = FALSE; /* WAC -- no change! */ #endif } #endif /* avoid abusing eggs laid by you */ if (obj->otyp == EGG && obj->spe) { int mnum, tryct = 100; #ifdef UNPOLYPILE unpoly = FALSE; /* WAC no unpolying eggs */ #endif /* first, turn into a generic egg */ if (otmp->otyp == EGG) kill_egg(otmp); else { otmp->otyp = EGG; otmp->owt = weight(otmp); } otmp->corpsenm = NON_PM; otmp->spe = 0; /* now change it into something layed by the hero */ while (tryct--) { mnum = can_be_hatched(random_monster()); if (mnum != NON_PM && !dead_species(mnum, TRUE)) { otmp->spe = 1; /* layed by hero */ otmp->corpsenm = mnum; attach_egg_hatch_timeout(otmp); break; } } } /* keep special fields (including charges on wands) */ if (index(charged_objs, otmp->oclass)) otmp->spe = obj->spe; otmp->recharged = obj->recharged; otmp->cursed = obj->cursed; otmp->blessed = obj->blessed; otmp->oeroded = obj->oeroded; otmp->oeroded2 = obj->oeroded2; if (!is_flammable(otmp) && !is_rustprone(otmp)) otmp->oeroded = 0; if (!is_corrodeable(otmp) && !is_rottable(otmp)) otmp->oeroded2 = 0; if (is_damageable(otmp)) otmp->oerodeproof = obj->oerodeproof; /* Keep chest/box traps and poisoned ammo if we may */ if (obj->otrapped && Is_box(otmp)) otmp->otrapped = TRUE; /* KMH, balance patch -- new macro */ if (obj->opoisoned && is_poisonable(otmp)) otmp->opoisoned = TRUE; if (id == STRANGE_OBJECT && obj->otyp == CORPSE) { #ifdef UNPOLYPILE unpoly = FALSE; /* WAC - don't bother */ #endif /* turn crocodile corpses into shoes */ if (obj->corpsenm == PM_CROCODILE) { otmp->otyp = LOW_BOOTS; otmp->oclass = ARMOR_CLASS; otmp->spe = 0; otmp->oeroded = 0; otmp->oerodeproof = TRUE; otmp->quan = 1L; otmp->cursed = FALSE; } } /* no box contents --KAA */ if (Has_contents(otmp)) delete_contents(otmp); /* 'n' merged objects may be fused into 1 object */ if (otmp->quan > 1L && (!objects[otmp->otyp].oc_merge || (can_merge && otmp->quan > (long)rn2(1000)))) otmp->quan = 1L; switch (otmp->oclass) { case TOOL_CLASS: if(otmp->otyp == MAGIC_LAMP) { otmp->otyp = OIL_LAMP; otmp->age = 1500L; /* "best" oil lamp possible */ #ifdef UNPOLYPILE unpoly = FALSE; #endif } else if (otmp->otyp == MAGIC_MARKER) { otmp->recharged = 1; /* degraded quality */ } #ifdef UNPOLYPILE else if (otmp->otyp == LAND_MINE || otmp->otyp == BEARTRAP) { /* Avoid awkward questions about traps set using hazy objs */ unpoly = FALSE; } #endif /* don't care about the recharge count of other tools */ break; case WAND_CLASS: while(otmp->otyp == WAN_WISHING || otmp->otyp == WAN_POLYMORPH) otmp->otyp = rnd_class(WAN_LIGHT, WAN_FIREBALL); /* altering the object tends to degrade its quality (analogous to spellbook `read count' handling) */ if ((int)otmp->recharged < rn2(7)) /* recharge_limit */ otmp->recharged++; break; case POTION_CLASS: while (otmp->otyp == POT_POLYMORPH) otmp->otyp = rnd_class(POT_GAIN_ABILITY, POT_WATER); break; case SPBOOK_CLASS: while (otmp->otyp == SPE_POLYMORPH) otmp->otyp = rnd_class(SPE_DIG, SPE_BLANK_PAPER); /* reduce spellbook abuse */ if ((int)otmp->recharged < rn2(7)) /* recharge_limit */ otmp->recharged++; otmp->spestudied = obj->spestudied + 1; break; case GEM_CLASS: if (otmp->quan > (long) rnd(4) && objects[obj->otyp].oc_material == MINERAL && objects[otmp->otyp].oc_material != MINERAL) { otmp->otyp = ROCK; /* transmutation backfired */ otmp->quan /= 2L; /* some material has been lost */ } break; case FOOD_CLASS: if (otmp->otyp == SLIME_MOLD) otmp->spe = current_fruit; /* Preserve percentage eaten (except for tins) */ old_nutrit = objects[obj->otyp].oc_nutrition; if (obj->oeaten && otmp->otyp != TIN && old_nutrit) { new_nutrit = objects[otmp->otyp].oc_nutrition; otmp->oeaten = obj->oeaten * new_nutrit / old_nutrit; if (otmp->oeaten == 0) otmp->oeaten++; if (otmp->oeaten >= new_nutrit) otmp->oeaten = new_nutrit - 1; } break; } /* update the weight */ otmp->owt = weight(otmp); /* for now, take off worn items being polymorphed */ /* [ALI] In Slash'EM only take off worn items if no longer compatible */ if (obj_location == OBJ_INVENT || obj_location == OBJ_MINVENT) { /* This is called only for stone to flesh. It's a lot simpler * than it otherwise might be. We don't need to check for * special effects when putting them on (no meat objects have * any) and only three worn masks are possible. */ /* [ALI] Unfortunately, hazy polymorphs means that this * is not true for Slash'EM, and we need to be a little more * careful. */ if (obj == uskin) rehumanize(); otmp->owornmask = obj->owornmask; /* Quietly remove worn item if no longer compatible --ALI */ if (otmp->owornmask & W_ARM && !is_suit(otmp)) otmp->owornmask &= ~W_ARM; if (otmp->owornmask & W_ARMC && !is_cloak(otmp)) otmp->owornmask &= ~W_ARMC; if (otmp->owornmask & W_ARMH && !is_helmet(otmp)) otmp->owornmask &= ~W_ARMH; if (otmp->owornmask & W_ARMS && !is_shield(otmp)) otmp->owornmask &= ~W_ARMS; if (otmp->owornmask & W_ARMG && !is_gloves(otmp)) otmp->owornmask &= ~W_ARMG; if (otmp->owornmask & W_ARMF && !is_boots(otmp)) otmp->owornmask &= ~W_ARMF; #ifdef TOURIST if (otmp->owornmask & W_ARMU && !is_shirt(otmp)) otmp->owornmask &= ~W_ARMU; #endif if (otmp->owornmask & W_TOOL && otmp->otyp != BLINDFOLD && otmp->otyp != TOWEL && otmp->otyp != LENSES) otmp->owornmask &= ~W_TOOL; if (obj->otyp == LEASH && obj->leashmon) o_unleash(obj); if (obj_location == OBJ_INVENT) { remove_worn_item(obj, TRUE); setworn(otmp, otmp->owornmask); puton_worn_item(otmp); if (otmp->owornmask & LEFT_RING) uleft = otmp; if (otmp->owornmask & RIGHT_RING) uright = otmp; if (otmp->owornmask & W_WEP) uwep = otmp; if (otmp->owornmask & W_SWAPWEP) uswapwep = otmp; if (otmp->owornmask & W_QUIVER) uquiver = otmp; } /* (We have to pend updating monster intrinsics until later) */ } else { /* preserve the mask in case being used by something else */ otmp->owornmask = obj->owornmask; #ifdef STEED if (otmp->owornmask & W_SADDLE && otmp->otyp != SADDLE) { struct monst *mtmp = obj->ocarry; dismount_steed(DISMOUNT_THROWN); otmp->owornmask &= ~W_SADDLE; /* The ex-saddle slips to the floor */ mtmp->misc_worn_check &= ~obj->owornmask; otmp->owornmask = obj->owornmask = 0; update_mon_intrinsics(mtmp, obj, FALSE, FALSE); obj_extract_self(obj); place_object(obj, mtmp->mx, mtmp->my); stackobj(obj); newsym(mtmp->mx, mtmp->my); obj_location = OBJ_FLOOR; } #endif } if (obj_location == OBJ_FLOOR && obj->otyp == BOULDER && otmp->otyp != BOULDER) unblock_point(obj->ox, obj->oy); #ifdef UNPOLYPILE /* WAC -- Attach unpoly timer if this is a standard poly */ if (unpoly /* && !rn2(20) */) { set_obj_poly(otmp, obj); if (is_hazy(otmp) && !Blind && carried(obj)) pline("%s seems hazy.", Yname2(otmp)); } #endif /* ** we are now done adjusting the object ** */ /* swap otmp for obj */ replace_object(obj, otmp); if (obj_location == OBJ_INVENT) { /* * We may need to do extra adjustments for the hero if we're * messing with the hero's inventory. The following calls are * equivalent to calling freeinv on obj and addinv on otmp, * while doing an in-place swap of the actual objects. */ freeinv_core(obj); addinv_core1(otmp); addinv_core2(otmp); } else if (obj_location == OBJ_MINVENT) { /* Pended update of monster intrinsics */ update_mon_intrinsics(obj->ocarry, obj, FALSE, FALSE); if (otmp->owornmask) update_mon_intrinsics(otmp->ocarry, otmp, TRUE, FALSE); } if ((!carried(otmp) || obj->unpaid) && #if defined(UNPOLYPILE) !is_hazy(obj) && #endif get_obj_location(otmp, &ox, &oy, BURIED_TOO|CONTAINED_TOO) && costly_spot(ox, oy)) { char objroom = *in_rooms(ox, oy, SHOPBASE); register struct monst *shkp = shop_keeper(objroom); 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) == *in_rooms(shkp->mx, shkp->my, 0) && !costly_spot(u.ux, u.uy)) make_angry_shk(shkp, ox, oy); else { pline("%s gets angry!", Monnam(shkp)); hot_pursuit(shkp); } } else Norep("%s is furious!", Monnam(shkp)); if (!carried(otmp)) { if (costly_spot(u.ux, u.uy) && objroom == *u.ushops) bill_dummy_object(obj); else (void) stolen_value(obj, ox, oy, FALSE, FALSE, TRUE); } } } delobj(obj); return otmp; } /* * Object obj was hit by the effect of the wand/spell otmp. Return * non-zero if the wand/spell had any effect. */ int bhito(obj, otmp) struct obj *obj, *otmp; { int res = 1; /* affected object by default */ xchar refresh_x, refresh_y; 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. */ if (!(obj->where == OBJ_FLOOR || otmp->otyp == SPE_STONE_TO_FLESH)) impossible("bhito: obj is not floor or Stone To Flesh spell"); if (obj == uball) { res = 0; } else if (obj == uchain) { if (otmp->otyp == WAN_OPENING || otmp->otyp == SPE_KNOCK) { unpunish(); makeknown(otmp->otyp); } else res = 0; } else switch(otmp->otyp) { case WAN_POLYMORPH: case SPE_POLYMORPH: if (obj->otyp == WAN_POLYMORPH || obj->otyp == SPE_POLYMORPH || obj->otyp == POT_POLYMORPH || obj_resists(obj, 5, 95)) { res = 0; break; } /* KMH, conduct */ u.uconduct.polypiles++; /* any saved lock context will be dangerously obsolete */ if (Is_box(obj)) (void) boxlock(obj, otmp); if (obj_shudders(obj)) { if (cansee(obj->ox, obj->oy)) makeknown(otmp->otyp); 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) */ for (o = obj->cobj; o; o = o->nobj) o->dknown = 1; /* "seen", even if blind */ (void) display_cinventory(obj); } res = 1; } if (res) makeknown(WAN_PROBING); break; case WAN_STRIKING: case SPE_FORCE_BOLT: if (obj->otyp == BOULDER) fracture_rock(obj); else if (obj->otyp == STATUE) (void) break_statue(obj); else { if (!flags.mon_moving) (void)hero_breaks(obj, obj->ox, obj->oy, FALSE); else (void)breaks(obj, obj->ox, obj->oy); res = 0; } /* BUG[?]: shouldn't this depend upon you seeing it happen? */ makeknown(otmp->otyp); break; case WAN_CANCELLATION: case SPE_CANCELLATION: cancel_item(obj); #ifdef TEXTCOLOR newsym(obj->ox,obj->oy); /* might change color */ #endif break; case SPE_DRAIN_LIFE: case WAN_DRAINING: /* KMH */ (void) drain_item(obj); break; case WAN_TELEPORTATION: case SPE_TELEPORT_AWAY: rloco(obj); break; case WAN_MAKE_INVISIBLE: #ifdef INVISIBLE_OBJECTS if (!always_visible(obj)) { obj->oinvis = TRUE; newsym(obj->ox,obj->oy); /* make object disappear */ } #endif break; case WAN_UNDEAD_TURNING: case SPE_TURN_UNDEAD: if (obj->otyp == EGG) revive_egg(obj); else res = !!revive(obj); break; case WAN_OPENING: case SPE_KNOCK: case WAN_LOCKING: case SPE_WIZARD_LOCK: if(Is_box(obj)) res = boxlock(obj, otmp); else res = 0; if (res /* && otmp->oclass == WAND_CLASS */) makeknown(otmp->otyp); break; case WAN_SLOW_MONSTER: /* no effect on objects */ case SPE_SLOW_MONSTER: case WAN_SPEED_MONSTER: case WAN_NOTHING: case SPE_HEALING: case SPE_EXTRA_HEALING: case WAN_HEALING: case WAN_EXTRA_HEALING: case WAN_FEAR: case WAN_FIREBALL: res = 0; break; case SPE_STONE_TO_FLESH: refresh_x = obj->ox; refresh_y = obj->oy; if (objects[obj->otyp].oc_material != MINERAL && objects[obj->otyp].oc_material != GEMSTONE) { res = 0; break; } /* add more if stone objects are added.. */ switch (objects[obj->otyp].oc_class) { case ROCK_CLASS: /* boulders and statues */ if (obj->otyp == BOULDER) { obj = poly_obj(obj, HUGE_CHUNK_OF_MEAT); goto smell; } else if (obj->otyp == STATUE) { xchar oox, ooy; (void) get_obj_location(obj, &oox, &ooy, 0); refresh_x = oox; refresh_y = ooy; if (vegetarian(&mons[obj->corpsenm])) { /* Don't animate monsters that aren't flesh */ obj = poly_obj(obj, MEATBALL); goto smell; } if (!animate_statue(obj, oox, ooy, ANIMATE_SPELL, (int *)0)) { struct obj *item; makecorpse: if (mons[obj->corpsenm].geno & (G_NOCORPSE|G_UNIQ)) { res = 0; break; } /* Unlikely to get here since genociding * monsters also sets the G_NOCORPSE flag. * Drop the contents, poly_obj looses them. */ while ((item = obj->cobj) != 0) { obj_extract_self(item); place_object(item, oox, ooy); } obj = poly_obj(obj, CORPSE); break; } } else { /* new rock class object... */ /* impossible? */ res = 0; } break; case TOOL_CLASS: /* figurine */ { struct monst *mon; xchar oox, ooy; if (obj->otyp != FIGURINE) { res = 0; break; } if (vegetarian(&mons[obj->corpsenm])) { /* Don't animate monsters that aren't flesh */ obj = poly_obj(obj, MEATBALL); goto smell; } (void) get_obj_location(obj, &oox, &ooy, 0); refresh_x = oox; refresh_y = ooy; mon = makemon(&mons[obj->corpsenm], oox, ooy, NO_MM_FLAGS); if (mon) { delobj(obj); if (cansee(mon->mx, mon->my)) pline_The("figurine animates!"); break; } goto makecorpse; } /* 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) || Role_if(PM_MONK) || !u.uconduct.unvegetarian)) Norep("You smell the odor of meat."); else Norep("You smell a delicious smell."); break; case WEAPON_CLASS: /* crysknife */ /* fall through */ default: res = 0; break; } newsym(refresh_x, refresh_y); break; default: impossible("What an interesting effect (%d)", otmp->otyp); break; } return res; } /* returns nonzero if something was hit */ int bhitpile(obj,fhito,tx,ty) struct obj *obj; int FDECL((*fhito), (OBJ_P,OBJ_P)); int tx, ty; { int hitanything = 0; register struct obj *otmp, *next_obj; if (obj->otyp == SPE_FORCE_BOLT || obj->otyp == WAN_STRIKING) { struct trap *t = t_at(tx, ty); /* We can't settle for the default calling sequence of bhito(otmp) -> break_statue(otmp) -> activate_statue_trap(ox,oy) because that last call might end up operating on our `next_obj' (below), rather than on the current object, if it happens to encounter a statue which mustn't become animated. */ if (t && t->ttyp == STATUE_TRAP && activate_statue_trap(t, tx, ty, TRUE) && obj->otyp == WAN_STRIKING) makeknown(obj->otyp); } poly_zapped = -1; for(otmp = level.objects[tx][ty]; otmp; otmp = next_obj) { /* Fix for polymorph bug, Tim Wright */ next_obj = otmp->nexthere; hitanything += (*fhito)(otmp, obj); } if(poly_zapped >= 0) create_polymon(level.objects[tx][ty], poly_zapped); return hitanything; } #endif /*OVLB*/ #ifdef OVL1 /* * zappable - returns 1 if zap is available, 0 otherwise. * it removes a charge from the wand if zappable. * added by GAN 11/03/86 */ int zappable(wand) register struct obj *wand; { if(wand->spe < 0 || (wand->spe == 0 && rn2(121))) return 0; if(wand->spe == 0) You("wrest one last charge from the worn-out wand."); wand->spe--; return 1; } /* * zapnodir - zaps a NODIR wand/spell. * added by GAN 11/03/86 */ void zapnodir(obj) register struct obj *obj; { boolean known = FALSE; switch(obj->otyp) { case WAN_LIGHT: case SPE_LIGHT: litroom(TRUE,obj); if (!Blind) known = TRUE; break; case WAN_SECRET_DOOR_DETECTION: case SPE_DETECT_UNSEEN: if(!findit()) return; if (!Blind) known = TRUE; break; case WAN_CREATE_MONSTER: known = create_critters(rn2(23) ? 1 : rn1(7,2), (struct permonst *)0); break; case WAN_CREATE_HORDE: known = create_critters(rn1(7,6), (struct permonst *)0); break; case WAN_WISHING: known = TRUE; if(Luck + rn2(5) < 0) { pline("Unfortunately, nothing happens."); break; } makewish(); break; case WAN_ENLIGHTENMENT: known = TRUE; You_feel("self-knowledgeable..."); display_nhwindow(WIN_MESSAGE, FALSE); enlightenment(FALSE); pline_The("feeling subsides."); exercise(A_WIS, TRUE); break; } if (known && !objects[obj->otyp].oc_name_known) { makeknown(obj->otyp); more_experienced(0,10); } } #endif /*OVL1*/ #ifdef OVL0 STATIC_OVL void backfire(otmp) struct obj *otmp; { otmp->in_use = TRUE; /* in case losehp() is fatal */ /* KMH, balance patch -- spells (not spellbooks) explode */ if (otmp->oclass != SPBOOK_CLASS) pline("%s suddenly explodes!", The(xname(otmp))); /* losehp(d(otmp->spe+2,6), "exploding wand", KILLED_BY_AN); useup(otmp);*/ wand_explode (otmp, FALSE); } static NEARDATA const char zap_syms[] = { WAND_CLASS, 0 }; int dozap() { register struct obj *obj; int damage; if(check_capacity((char *)0)) return(0); obj = getobj(zap_syms, "zap"); if(!obj) return(0); check_unpaid(obj); /* zappable addition done by GAN 11/03/86 */ if(!zappable(obj)) pline(nothing_happens); else if(obj->cursed && !rn2(5)) { /* WAC made this rn2(5) from rn2(100)*/ backfire(obj); /* the wand blows up in your face! */ exercise(A_STR, FALSE); return(1); /* WAC wands of lightning will also explode in your face*/ } else if ((obj->otyp == WAN_LIGHTNING || obj->otyp == SPE_LIGHTNING) && (Underwater) && (!obj->blessed)) { backfire(obj); /* the wand blows up in your face! */ exercise(A_STR, FALSE); return(1); } else if(!(objects[obj->otyp].oc_dir == NODIR) && !getdir((char *)0)) { if (!Blind) 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? * weffects -> buzz(obj->otyp) -> zhitm (temple priest) -> * attack -> hitum -> known_hitum -> ghod_hitsu -> * buzz(AD_ELEC) -> destroy_item(WAND_CLASS) -> * useup -> obfree -> dealloc_obj -> free(obj) */ current_wand = obj; weffects(obj); obj = current_wand; current_wand = 0; } if (obj && obj->spe < 0) { pline("%s to dust.", Tobjnam(obj, "turn")); useup(obj); } update_inventory(); /* maybe used a charge */ return(1); } /* WAC lightning strike effect. */ void zap_strike_fx(x,y, type) xchar x,y; int type; { xchar row; boolean otherrow = FALSE; if (!cansee(x, y) || IS_STWALL(levl[x][y].typ)) return; /* Zapdir is always downward ;B */ tmp_at(DISP_BEAM_ALWAYS, zapdir_to_glyph(0, -1, abs(type) % 10)); for (row = 0; row <= y; row++){ tmp_at(x,row); if (otherrow) delay_output(); otherrow = (!otherrow); } delay_output(); tmp_at(DISP_END, 0); } STATIC_OVL void throwstorm(obj, skilldmg, min, range) register struct obj *obj; int min, range, skilldmg; { boolean didblast = FALSE; int failcheck; int sx, sy; int type = ZT_SPELL(obj->otyp - SPE_MAGIC_MISSILE); int expl_type; int num = 2 + rn2(3); if (tech_inuse(T_SIGIL_CONTROL)) { throwspell(); sx = u.dx; sy = u.dy; } else { sx = u.ux; sy = u.uy; } if (sx != u.ux || sy != u.uy) min = 0; if (tech_inuse(T_SIGIL_DISCHARGE)) num *= 2; /*WAC Based off code that used to be the wizard patch mega fireball */ if (u.uinwater) { pline("You joking! In this weather?"); return; } else if (Is_waterlevel(&u.uz)) { You("better wait for the sun to come out."); return; } switch (abs(type) % 10) { case ZT_MAGIC_MISSILE: case ZT_DEATH: expl_type = EXPL_MAGICAL; break; case ZT_FIRE: case ZT_LIGHTNING: expl_type = EXPL_FIERY; break; case ZT_COLD: expl_type = EXPL_FROSTY; break; case ZT_SLEEP: case ZT_POISON_GAS: case ZT_ACID: expl_type = EXPL_NOXIOUS; break; } while(num--) { failcheck = 0; do { confdir(); /* Random Dir */ u.dx *= (rn2(range) + min); u.dx += sx; u.dy *= (rn2(range) + min); u.dy += sy; failcheck++; } while (failcheck < 3 && (!cansee(u.dx, u.dy) || IS_STWALL(levl[u.dx][u.dy].typ))); if (failcheck >= 3) continue; if (abs(type) % 10 == ZT_LIGHTNING) zap_strike_fx(u.dx,u.dy,type); explode(u.dx, u.dy, type, u.ulevel/4 + 1 + skilldmg, 0, expl_type); delay_output(); didblast = TRUE; } if (!didblast) { explode(u.dx, u.dy, type, u.ulevel/2 + 1 + skilldmg, 0, expl_type); delay_output(); } return; } int zapyourself(obj, ordinary) struct obj *obj; boolean ordinary; { int damage = 0; char buf[BUFSZ]; switch(obj->otyp) { case WAN_STRIKING: makeknown(WAN_STRIKING); case SPE_FORCE_BOLT: if(Antimagic) { shieldeff(u.ux, u.uy); pline("Boing!"); } else { if (ordinary) { You("bash yourself!"); damage = d(2,12); } else damage = d(1 + obj->spe,6); exercise(A_STR, FALSE); } break; /*WAC Add Spell Acid, Poison*/ case SPE_POISON_BLAST: poisoned("blast", A_DEX, "poisoned blast", 15); break; case SPE_ACID_STREAM: /* KMH, balance patch -- new intrinsic */ if (Acid_resistance) { damage = 0; } else { pline_The("acid burns!"); damage = d(12,6); exercise(A_STR, FALSE); } 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; case WAN_LIGHTNING: makeknown(WAN_LIGHTNING); /*WAC Added Spell Lightning*/ case SPE_LIGHTNING: if (!Shock_resistance) { You("shock yourself!"); damage = d(12,6); exercise(A_CON, FALSE); } else { shieldeff(u.ux, u.uy); You("zap yourself, but seem unharmed."); ugolemeffects(AD_ELEC, d(12,6)); } destroy_item(WAND_CLASS, AD_ELEC); destroy_item(RING_CLASS, AD_ELEC); if (!resists_blnd(&youmonst)) { You(are_blinded_by_the_flash); make_blinded((long)rnd(100),FALSE); if (!Blind) Your(vision_clears); } break; case WAN_FIREBALL: makeknown(WAN_FIREBALL); 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); case FIRE_HORN: if (Fire_resistance) { shieldeff(u.ux, u.uy); You_feel("rather warm."); ugolemeffects(AD_FIRE, d(12,6)); } else { pline("You've set yourself afire!"); damage = d(12,6); } if (Slimed) { pline("The slime is burned away!"); Slimed = 0; } burn_away_slime(); (void) burnarmor(&youmonst); destroy_item(SCROLL_CLASS, AD_FIRE); destroy_item(POTION_CLASS, AD_FIRE); destroy_item(SPBOOK_CLASS, AD_FIRE); break; case WAN_COLD: makeknown(WAN_COLD); case SPE_CONE_OF_COLD: case FROST_HORN: if (Cold_resistance) { shieldeff(u.ux, u.uy); You_feel("a little chill."); ugolemeffects(AD_COLD, d(12,6)); } else { You("imitate a popsicle!"); damage = d(12,6); } destroy_item(POTION_CLASS, AD_COLD); break; case WAN_MAGIC_MISSILE: makeknown(WAN_MAGIC_MISSILE); case SPE_MAGIC_MISSILE: if(Antimagic) { shieldeff(u.ux, u.uy); pline_The("missiles bounce!"); } else { damage = d(4,6); pline("Idiot! You've shot yourself!"); } break; case WAN_POLYMORPH: if (!Unchanging) makeknown(WAN_POLYMORPH); case SPE_POLYMORPH: if (!Unchanging) polyself(FALSE); break; case WAN_CANCELLATION: case SPE_CANCELLATION: (void) cancel_monst(&youmonst, obj, TRUE, FALSE, TRUE); break; case WAN_DRAINING: /* KMH */ makeknown(obj->otyp); case SPE_DRAIN_LIFE: if (!Drain_resistance) { losexp("life drainage", FALSE); } else { shieldeff(u.ux, u.uy); pline("Boing!"); } damage = 0; /* No additional damage */ break; case WAN_MAKE_INVISIBLE: { /* have to test before changing HInvis but must change * HInvis before doing newsym(). */ int msg = !Invis && !Blind && !BInvis; if (BInvis && uarmc->otyp == MUMMY_WRAPPING) { /* A mummy wrapping absorbs it and protects you */ You_feel("rather itchy under your %s.", xname(uarmc)); break; } if (ordinary || !rn2(10)) { /* permanent */ HInvis |= FROMOUTSIDE; } else { /* temporary */ incr_itimeout(&HInvis, d(obj->spe, 250)); } if (msg) { makeknown(WAN_MAKE_INVISIBLE); newsym(u.ux, u.uy); self_invis_message(); } break; } case WAN_SPEED_MONSTER: if (!(HFast & INTRINSIC)) { if (!Fast) You("speed up."); else Your("quickness feels more natural."); makeknown(WAN_SPEED_MONSTER); exercise(A_DEX, TRUE); } /* KMH, balance patch -- Make it permanent, like NetHack */ /* Note that this is _not_ very fast */ HFast |= FROMOUTSIDE; break; case WAN_HEALING: You("begin to feel better."); healup(d(5,6),0,0,0); exercise(A_STR, TRUE); makeknown(WAN_HEALING); break; case WAN_EXTRA_HEALING: You("feel much better."); healup(d(6,8),0,0,0); make_hallucinated(0L,TRUE,0L); exercise(A_STR, TRUE); exercise(A_CON, TRUE); makeknown(WAN_EXTRA_HEALING); break; case WAN_FEAR: You("suddenly panic!"); if(!HConfusion) make_confused(HConfusion + rnd(10),FALSE); break; case WAN_SLEEP: makeknown(WAN_SLEEP); case SPE_SLEEP: if(Sleep_resistance) { shieldeff(u.ux, u.uy); You("don't feel sleepy!"); } else { pline_The("sleep ray hits you!"); fall_asleep(-rnd(50), TRUE); } break; case WAN_SLOW_MONSTER: case SPE_SLOW_MONSTER: if(HFast & (TIMEOUT | INTRINSIC)) { u_slow_down(); makeknown(obj->otyp); } break; case WAN_TELEPORTATION: case SPE_TELEPORT_AWAY: tele(); makeknown(obj->otyp); break; case WAN_DEATH: case SPE_FINGER_OF_DEATH: if (nonliving(youmonst.data) || is_demon(youmonst.data)) { pline((obj->otyp == WAN_DEATH) ? "The wand shoots an apparently harmless beam at you." : "You seem no deader than before."); break; } if (Invulnerable) { pline("You are unharmed!"); break; } killer_format = NO_KILLER_PREFIX; Sprintf(buf, "shot %sself with a death ray", uhim()); killer = buf; You("irradiate yourself with pure energy!"); You("die."); makeknown(obj->otyp); /* They might survive with an amulet of life saving */ done(DIED); break; case WAN_UNDEAD_TURNING: makeknown(WAN_UNDEAD_TURNING); case SPE_TURN_UNDEAD: (void) unturn_dead(&youmonst); if (is_undead(youmonst.data)) { You_feel("frightened and %sstunned.", Stunned ? "even more " : ""); make_stunned(HStun + rnd(30), FALSE); } else You("shudder in dread."); break; case SPE_HEALING: case SPE_EXTRA_HEALING: healup(obj->otyp == SPE_HEALING ? rnd(10) + 4 : d(3,8)+6, 0, FALSE, FALSE); You_feel("%sbetter.", obj->otyp == SPE_EXTRA_HEALING ? "much " : ""); break; case WAN_LIGHT: /* (broken wand) */ /* assert( !ordinary ); */ damage = d(obj->spe, 25); #ifdef TOURIST case EXPENSIVE_CAMERA: #endif damage += rnd(25); if (!resists_blnd(&youmonst)) { You(are_blinded_by_the_flash); make_blinded((long)damage, FALSE); makeknown(obj->otyp); if (!Blind) Your(vision_clears); } damage = 0; /* reset */ break; case WAN_OPENING: if (Punished) makeknown(WAN_OPENING); case SPE_KNOCK: if (Punished) Your("chain quivers for a moment."); break; case WAN_DIGGING: case SPE_DIG: case SPE_DETECT_UNSEEN: case WAN_NOTHING: case WAN_LOCKING: case SPE_WIZARD_LOCK: break; case WAN_PROBING: for (obj = invent; obj; obj = obj->nobj) obj->dknown = 1; /* note: `obj' reused; doesn't point at wand anymore */ makeknown(WAN_PROBING); ustatusline(); break; case SPE_STONE_TO_FLESH: { struct obj *otemp, *onext; boolean didmerge; if (u.umonnum == PM_STONE_GOLEM) (void) polymon(PM_FLESH_GOLEM); if (Stoned) fix_petrification(); /* saved! */ /* but at a cost.. */ for (otemp = invent; otemp; otemp = onext) { onext = otemp->nobj; (void) bhito(otemp, obj); } /* * It is possible that we can now merge some inventory. * Do a higly paranoid merge. Restart from the beginning * until no merges. */ do { didmerge = FALSE; for (otemp = invent; !didmerge && otemp; otemp = otemp->nobj) for (onext = otemp->nobj; onext; onext = onext->nobj) if (merged(&otemp, &onext)) { didmerge = TRUE; break; } } while (didmerge); } break; default: impossible("object %d used?",obj->otyp); break; } return(damage); } #ifdef STEED /* you've zapped a wand downwards while riding * Return TRUE if the steed was hit by the wand. * Return FALSE if the steed was not hit by the wand. */ STATIC_OVL boolean zap_steed(obj) struct obj *obj; /* wand or spell */ { int steedhit = FALSE; switch (obj->otyp) { /* * Wands that are allowed to hit the steed * Carefully test the results of any that are * moved here from the bottom section. */ case WAN_PROBING: probe_monster(u.usteed); makeknown(WAN_PROBING); steedhit = TRUE; break; case WAN_TELEPORTATION: case SPE_TELEPORT_AWAY: /* you go together */ tele(); if(Teleport_control || !couldsee(u.ux0, u.uy0) || (distu(u.ux0, u.uy0) >= 16)) makeknown(obj->otyp); steedhit = TRUE; break; /* Default processing via bhitm() for these */ case SPE_CURE_SICKNESS: case WAN_MAKE_INVISIBLE: case WAN_CANCELLATION: case SPE_CANCELLATION: case WAN_POLYMORPH: case SPE_POLYMORPH: case WAN_STRIKING: case SPE_FORCE_BOLT: case WAN_SLOW_MONSTER: case SPE_SLOW_MONSTER: case WAN_SPEED_MONSTER: case SPE_HEALING: case SPE_EXTRA_HEALING: case WAN_HEALING: case WAN_EXTRA_HEALING: case WAN_DRAINING: case SPE_DRAIN_LIFE: case WAN_OPENING: case SPE_KNOCK: (void) bhitm(u.usteed, obj); steedhit = TRUE; break; default: steedhit = FALSE; break; } return steedhit; } #endif #endif /*OVL0*/ #ifdef OVL3 /* * cancel a monster (possibly the hero). inventory is cancelled only * if the monster is zapping itself directly, since otherwise the * effect is too strong. currently non-hero monsters do not zap * themselves with cancellation. */ boolean cancel_monst(mdef, obj, youattack, allow_cancel_kill, self_cancel) register struct monst *mdef; register struct obj *obj; boolean youattack, allow_cancel_kill, self_cancel; { boolean youdefend = (mdef == &youmonst); static const char writing_vanishes[] = "Some writing vanishes from %s head!"; static const char your[] = "your"; /* should be extern */ if (youdefend) You(!Hallucination? "are covered in sparkling lights!" : "are enveloped by psychedelic fireworks!"); if (youdefend ? (!youattack && Antimagic) : resist(mdef, obj->oclass, 0, NOTELL)) return FALSE; /* resisted cancellation */ /* 1st cancel inventory */ /* Lethe allows monsters to zap you with /oCanc, which has a small * chance of affecting hero's inventory; for parity, /oCanc zapped by * the hero also have a small chance of affecting the monster's * inventory */ if (!(youdefend? Antimagic : resists_magm(mdef)) || !rn2(6)) { struct obj *otmp; boolean did_cancel = FALSE; for (otmp = (youdefend ? invent : mdef->minvent); otmp; otmp = otmp->nobj) if (self_cancel || !rn2(24)) { cancel_item(otmp); did_cancel = TRUE; } if (youdefend && did_cancel) { flags.botl = 1; /* potential AC change */ find_ac(); } /* Indicate to the hero that something happened */ if (did_cancel && !self_cancel && youdefend) You_feel("a strange sense of loss."); } /* now handle special cases */ if (youdefend) { if (Upolyd) { if ((u.umonnum == PM_CLAY_GOLEM) && !Blind) pline(writing_vanishes, your); if (Unchanging) Your("amulet grows hot for a moment, then cools."); else { u.uhp -= mons[u.umonnum].mlevel; u.uhpmax -= mons[u.umonnum].mlevel; if (u.uhpmax < 1) u.uhpmax = 1; u.mh = 0; rehumanize(); } } } else { mdef->mcan = TRUE; if (is_were(mdef->data) && mdef->data->mlet != S_HUMAN) were_change(mdef); if (mdef->data == &mons[PM_CLAY_GOLEM]) { if (canseemon(mdef)) pline(writing_vanishes, s_suffix(mon_nam(mdef))); if (allow_cancel_kill) { if (youattack) killed(mdef); else monkilled(mdef, "", AD_SPEL); } } } return TRUE; } /* you've zapped an immediate type wand up or down */ STATIC_OVL boolean zap_updown(obj) struct obj *obj; /* wand or spell */ { boolean striking = FALSE, disclose = FALSE; 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; if (u.dz < 0) { You("probe towards the %s.", ceiling(x,y)); } else { ptmp += bhitpile(obj, bhito, x, y); You("probe beneath the %s.", surface(x,y)); ptmp += display_binventory(x, y, TRUE); } if (!ptmp) Your("probe reveals nothing."); return TRUE; /* we've done our own bhitpile */ case WAN_OPENING: case SPE_KNOCK: /* up or down, but at closed portcullis only */ if (is_db_wall(x,y) && find_drawbridge(&xx, &yy)) { open_drawbridge(xx, yy); disclose = TRUE; } else if (u.dz > 0 && (x == xdnstair && y == ydnstair) && /* can't use the stairs down to quest level 2 until leader "unlocks" them; give feedback if you try */ on_level(&u.uz, &qstart_level) && !ok_to_quest()) { pline_The("stairs seem to ripple momentarily."); disclose = TRUE; } break; case WAN_STRIKING: case SPE_FORCE_BOLT: striking = TRUE; /*FALLTHRU*/ case WAN_LOCKING: case SPE_WIZARD_LOCK: /* down at open bridge or up or down at open portcullis */ if ((levl[x][y].typ == DRAWBRIDGE_DOWN) ? (u.dz > 0) : (is_drawbridge_wall(x,y) && !is_db_wall(x,y)) && find_drawbridge(&xx, &yy)) { if (!striking) close_drawbridge(xx, yy); else destroy_drawbridge(xx, yy); disclose = TRUE; } else if (striking && u.dz < 0 && rn2(3) && !Is_airlevel(&u.uz) && !Is_waterlevel(&u.uz) && !Underwater && !Is_qstart(&u.uz)) { /* similar to zap_dig() */ pline("A rock is dislodged from the %s and falls on your %s.", 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: if (Is_airlevel(&u.uz) || Is_waterlevel(&u.uz) || Underwater || (Is_qstart(&u.uz) && u.dz < 0)) { pline(nothing_happens); } else if (u.dz < 0) { /* we should do more... */ pline("Blood drips on your %s.", body_part(FACE)); } 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; } if (u.dz > 0) { /* zapping downward */ (void) bhitpile(obj, bhito, x, y); /* subset of engraving effects; none sets `disclose' */ if ((e = engr_at(x, y)) != 0 && e->engr_type != HEADSTONE) { switch (obj->otyp) { case WAN_POLYMORPH: case SPE_POLYMORPH: del_engr(e); make_engr_at(x, y, random_engraving(buf), moves, (xchar)0); break; case WAN_CANCELLATION: case SPE_CANCELLATION: case WAN_MAKE_INVISIBLE: del_engr(e); break; case WAN_TELEPORTATION: case SPE_TELEPORT_AWAY: rloc_engr(e); break; case SPE_STONE_TO_FLESH: if (e->engr_type == ENGRAVE) { /* only affects things in stone */ pline_The(Hallucination ? "floor runs like butter!" : "edges on the floor get smoother."); wipe_engr_at(x, y, d(2,4)); } break; case WAN_STRIKING: case SPE_FORCE_BOLT: wipe_engr_at(x, y, d(2,4)); break; default: break; } } } return disclose; } #endif /*OVL3*/ #ifdef OVLB /* called for various wand and spell effects - M. Stephenson */ void weffects(obj) struct obj *obj; { int otyp = obj->otyp; boolean disclose = FALSE, was_unkn = !objects[otyp].oc_name_known; int skilldmg = 0; /*WAC - Skills damage bonus*/ if (otyp >= SPE_MAGIC_MISSILE && otyp <= SPE_ACID_STREAM) skilldmg = spell_damage_bonus(obj->otyp); exercise(A_WIS, TRUE); #ifdef STEED if (u.usteed && (objects[otyp].oc_dir != NODIR) && !u.dx && !u.dy && (u.dz > 0) && zap_steed(obj)) { disclose = TRUE; } else #endif if (objects[otyp].oc_dir == IMMEDIATE) { obj_zapped = FALSE; if (u.uswallow) { (void) bhitm(u.ustuck, obj); /* [how about `bhitpile(u.ustuck->minvent)' effect?] */ } else if (u.dz) { disclose = zap_updown(obj); } else { (void) bhit(u.dx,u.dy, rn1(8,6), ZAPPED_WAND, bhitm, bhito, &obj); } /* give a clue if obj_zapped */ if (obj_zapped) You_feel("shuddering vibrations."); } else if (objects[otyp].oc_dir == NODIR) { zapnodir(obj); } else { /* neither immediate nor directionless */ if (otyp == WAN_DIGGING || otyp == SPE_DIG) zap_dig(); /* else if (otyp >= SPE_MAGIC_MISSILE && otyp <= SPE_FINGER_OF_DEATH)*/ else if (otyp >= SPE_MAGIC_MISSILE && otyp <= SPE_ACID_STREAM) /* WAC -- * Include effect for Mega Large Fireball/Cones of Cold. * Include effect for Lightning cast. * Include Yell...atmospheric. * Added slight delay before fireworks. */ if (((otyp >= SPE_MAGIC_MISSILE && otyp <= SPE_CONE_OF_COLD) || (otyp >= SPE_LIGHTNING && otyp <= SPE_ACID_STREAM)) && (tech_inuse(T_SIGIL_TEMPEST))) { /* sigil of tempest */ throwstorm(obj, skilldmg, 2 , 2); } else if (((otyp >= SPE_MAGIC_MISSILE && otyp <= SPE_CONE_OF_COLD) || (otyp >= SPE_LIGHTNING && otyp <= SPE_ACID_STREAM)) /*WAC - use sigil of discharge */ && (tech_inuse(T_SIGIL_DISCHARGE))) { You("yell \"%s\"",yell_types[otyp - SPE_MAGIC_MISSILE]); display_nhwindow(WIN_MESSAGE, TRUE); /* --More-- */ buzz(ZT_MEGA(otyp - SPE_MAGIC_MISSILE), u.ulevel/2 + 1 + skilldmg, u.ux, u.uy, u.dx, u.dy); } else buzz(ZT_SPELL(otyp - SPE_MAGIC_MISSILE), u.ulevel / 2 + 1 + skilldmg, u.ux, u.uy, u.dx, u.dy); else if (otyp >= WAN_MAGIC_MISSILE && otyp <= WAN_FIREBALL) { buzz(otyp - WAN_MAGIC_MISSILE, (otyp == WAN_MAGIC_MISSILE) ? 2 : 6, u.ux, u.uy, u.dx, u.dy); } else impossible("weffects: unexpected spell or wand"); disclose = TRUE; } if (disclose && was_unkn) { makeknown(otyp); more_experienced(0,10); } return; } #endif /*OVLB*/ #ifdef OVL0 /* * LSZ/WWA The Wizard Patch July '96 - * Generate the to damage bonus for a spell. Based on the hero's intelligence */ /* WAC now also depends on skill level. Returns -2 to 5 */ int spell_damage_bonus(booktype) register int booktype; { register int intell = ACURR(A_INT); int tmp; if (intell < 10) tmp = -1; /* Punish low intell. before level else low */ else if (u.ulevel < 5) tmp = 0; /* intell. gets punished only when high level*/ else if (intell < 14) tmp = 1; else if (intell <= 18) tmp = 2; else tmp = 3; /* Hero may have helm of brilliance on */ switch (P_SKILL(spell_skilltype(booktype))) { case P_ISRESTRICTED: case P_UNSKILLED: tmp -= 1; break; case P_BASIC: break; case P_SKILLED: tmp += 1; break; case P_EXPERT: tmp += 2; break; } return tmp; } /* * Generate the to hit bonus for a spell. Based on the hero's skill in * spell class and dexterity. */ STATIC_OVL int spell_hit_bonus(skill) int skill; { int hit_bon = 0; int dex = ACURR(A_DEX); switch (P_SKILL(spell_skilltype(skill))) { case P_ISRESTRICTED: case P_UNSKILLED: hit_bon = -4; break; case P_BASIC: hit_bon = 0; break; case P_SKILLED: hit_bon = 2; break; case P_EXPERT: hit_bon = 3; break; } if (dex < 4) hit_bon -= 3; else if (dex < 6) hit_bon -= 2; else if (dex < 8) hit_bon -= 1; else if (dex < 14) hit_bon -= 0; /* Will change when print stuff below removed */ else hit_bon += dex - 14; /* Even increment for dextrous heroes (see weapon.c abon) */ return hit_bon; } const char * exclam(force) register int force; { /* force == 0 occurs e.g. with sleep ray */ /* note that large force is usual with wands so that !! would require information about hand/weapon/wand */ return (const char *)((force < 0) ? "?" : (force <= 4) ? "." : "!"); } void hit(str,mtmp,force) register const char *str; register struct monst *mtmp; register const char *force; /* usually either "." or "!" */ { if((!cansee(bhitpos.x,bhitpos.y) && !canspotmon(mtmp) && !(u.uswallow && mtmp == u.ustuck)) || !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 miss(str,mtmp) 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*/ #ifdef OVL1 /* * Called for the following distance effects: * when a weapon is thrown (weapon == THROWN_WEAPON) * when an object is kicked (KICKED_WEAPON) * when an IMMEDIATE wand is zapped (ZAPPED_WAND) * when a light beam is flashed (FLASHED_LIGHT) * when a mirror is applied (INVIS_BEAM) * A thrown/kicked object falls down at the end of its range or when a monster * is hit. The variable 'bhitpos' is set to the final position of the weapon * thrown/zapped. The ray of a wand may affect (by calling a provided * function) several objects and monsters on its path. The return value * is the monster hit (weapon != ZAPPED_WAND), or a null monster pointer. * Thrown and kicked objects (THROWN_WEAPON or KICKED_WEAPON) may be * destroyed and *obj_p set to NULL to indicate this. * * Check !u.uswallow before calling bhit(). * This function reveals the absence of a remembered invisible monster in * necessary cases (throwing or kicking weapons). The presence of a real * one is revealed for a weapon, but if not a weapon is left up to fhitm(). */ struct monst * bhit(ddx,ddy,range,weapon,fhitm,fhito,obj_p) register int ddx,ddy,range; /* direction and range */ int weapon; /* see values in hack.h */ int FDECL((*fhitm), (MONST_P, OBJ_P)), /* fns called when mon/obj hit */ FDECL((*fhito), (OBJ_P, OBJ_P)); struct obj **obj_p; /* object tossed/used */ { struct monst *mtmp; struct obj *obj = *obj_p; uchar typ; boolean shopdoor = FALSE, point_blank = TRUE; #ifdef LIGHT_SRC_SPELL int lits = 0; boolean use_lights = FALSE; #endif if (weapon == KICKED_WEAPON) { /* object starts one square in front of player */ bhitpos.x = u.ux + ddx; bhitpos.y = u.uy + ddy; range--; } else { bhitpos.x = u.ux; bhitpos.y = u.uy; } if (weapon == FLASHED_LIGHT) { #ifdef LIGHT_SRC_SPELL use_lights = TRUE; #endif tmp_at(DISP_BEAM, cmap_to_glyph(S_flashbeam)); } else if (weapon != ZAPPED_WAND && weapon != INVIS_BEAM) { #ifdef LIGHT_SRC_SPELL use_lights = obj->lamplit; #endif tmp_at(DISP_FLASH, obj_to_glyph(obj)); } while(range-- > 0) { int x,y; bhitpos.x += ddx; bhitpos.y += ddy; x = bhitpos.x; y = bhitpos.y; if(!isok(x, y)) { bhitpos.x -= ddx; bhitpos.y -= ddy; break; } 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_p, x - ddx, y - ddy, point_blank ? 0 : !rn2(5), 1)) { /* caveat: obj might now be null... */ obj = *obj_p; bhitpos.x -= ddx; bhitpos.y -= ddy; break; } if (weapon == ZAPPED_WAND && find_drawbridge(&x,&y)) switch (obj->otyp) { case WAN_OPENING: case SPE_KNOCK: if (is_db_wall(bhitpos.x, bhitpos.y)) { if (cansee(x,y) || cansee(bhitpos.x,bhitpos.y)) makeknown(obj->otyp); open_drawbridge(x,y); } break; case WAN_LOCKING: case SPE_WIZARD_LOCK: if ((cansee(x,y) || cansee(bhitpos.x, bhitpos.y)) && levl[x][y].typ == DRAWBRIDGE_DOWN) makeknown(obj->otyp); close_drawbridge(x,y); break; case WAN_STRIKING: case SPE_FORCE_BOLT: if (typ != DRAWBRIDGE_UP) destroy_drawbridge(x,y); makeknown(obj->otyp); break; } 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); #ifdef LIGHT_SRC_SPELL if (use_lights) { while (lits) { del_light_source(LS_TEMP, (genericptr_t) lits); lits--; } vision_full_recalc = 1; vision_recalc(0); /* clean up vision */ } #endif } 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 && memory_is_invisible(bhitpos.x, bhitpos.y)) { unmap_object(bhitpos.x, bhitpos.y); newsym(x, y); } } if(fhito) { if(bhitpile(obj,fhito,bhitpos.x,bhitpos.y)) range--; } else { if(weapon == KICKED_WEAPON && ((obj->oclass == COIN_CLASS && OBJ_AT(bhitpos.x, bhitpos.y)) || ship_object(obj, bhitpos.x, bhitpos.y, costly_spot(bhitpos.x, bhitpos.y)))) { tmp_at(DISP_END, 0); return (struct monst *)0; } } if(weapon == ZAPPED_WAND && (IS_DOOR(typ) || typ == SDOOR)) { switch (obj->otyp) { case WAN_OPENING: case WAN_LOCKING: case WAN_STRIKING: case SPE_KNOCK: case SPE_WIZARD_LOCK: case SPE_FORCE_BOLT: if (doorlock(obj, bhitpos.x, bhitpos.y)) { if (cansee(bhitpos.x, bhitpos.y) || (obj->otyp == WAN_STRIKING)) makeknown(obj->otyp); if (levl[bhitpos.x][bhitpos.y].doormask == D_BROKEN && *in_rooms(bhitpos.x, bhitpos.y, SHOPBASE)) { shopdoor = TRUE; add_damage(bhitpos.x, bhitpos.y, 400L); } } break; } } if(!ZAP_POS(typ) || closed_door(bhitpos.x, bhitpos.y)) { bhitpos.x -= ddx; bhitpos.y -= ddy; break; } if(weapon != ZAPPED_WAND && weapon != INVIS_BEAM) { /* 'I' present but no monster: erase */ /* do this before the tmp_at() */ if (memory_is_invisible(bhitpos.x, bhitpos.y) && cansee(x, y)) { unmap_object(bhitpos.x, bhitpos.y); newsym(x, y); } #ifdef LIGHT_SRC_SPELL if (use_lights) { lits++; new_light_source(bhitpos.x, bhitpos.y, 1, LS_TEMP, (genericptr_t) lits); vision_full_recalc = 1; vision_recalc(0); } #endif tmp_at(bhitpos.x, bhitpos.y); 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) break; /* physical objects fall onto sink */ #endif } /* limit range of ball so hero won't make an invalid move */ if (weapon == THROWN_WEAPON && range > 0 && obj->otyp == HEAVY_IRON_BALL) { struct obj *bobj; struct trap *t; if ((bobj = sobj_at(BOULDER, x, y)) != 0) { if (cansee(x,y)) pline("%s hits %s.", The(distant_name(obj, xname)), an(xname(bobj))); range = 0; } else if (obj == uball) { if (!test_move(x - ddx, y - ddy, ddx, ddy, TEST_MOVE)) { /* nb: it didn't hit anything directly */ if (cansee(x,y)) pline("%s jerks to an abrupt halt.", The(distant_name(obj, xname))); /* lame */ range = 0; } else if (In_sokoban(&u.uz) && (t = t_at(x, y)) != 0 && (t->ttyp == PIT || t->ttyp == SPIKED_PIT || t->ttyp == HOLE || t->ttyp == TRAPDOOR)) { /* hero falls into the trap, so ball stops */ range = 0; } } } /* thrown/kicked missile has moved away from its starting spot */ point_blank = FALSE; /* affects passing through iron bars */ } if (weapon != ZAPPED_WAND && weapon != INVIS_BEAM) { tmp_at(DISP_END, 0); #ifdef LIGHT_SRC_SPELL while (lits) { del_light_source(LS_TEMP, (genericptr_t) lits); lits--; } vision_full_recalc = 1; vision_recalc(0); /*clean up vision*/ #endif } if(shopdoor) pay_for_damage("destroy", FALSE); return (struct monst *)0; } struct monst * boomhit(dx, dy) int dx, dy; { register int i, ct; int boom = S_boomleft; /* showsym[] index */ struct monst *mtmp; bhitpos.x = u.ux; bhitpos.y = u.uy; for(i=0; i<8; i++) if(xdir[i] == dx && ydir[i] == dy) break; tmp_at(DISP_FLASH, cmap_to_glyph(boom)); for(ct=0; ct<10; ct++) { if(i == 8) i = 0; boom = (boom == S_boomleft) ? S_boomright : S_boomleft; tmp_at(DISP_CHANGE, cmap_to_glyph(boom));/* change glyph */ dx = xdir[i]; dy = ydir[i]; bhitpos.x += dx; bhitpos.y += dy; if(MON_AT(bhitpos.x, bhitpos.y)) { mtmp = m_at(bhitpos.x,bhitpos.y); m_respond(mtmp); tmp_at(DISP_END, 0); return(mtmp); } if(!ZAP_POS(levl[bhitpos.x][bhitpos.y].typ) || closed_door(bhitpos.x, bhitpos.y)) { bhitpos.x -= dx; bhitpos.y -= dy; break; } if(bhitpos.x == u.ux && bhitpos.y == u.uy) { /* ct == 9 */ if(Fumbling || rn2(20) >= ACURR(A_DEX)) { /* we hit ourselves */ (void) thitu(10, rnd(10), (struct obj *)0, "boomerang"); break; } else { /* we catch it */ tmp_at(DISP_END, 0); You("skillfully catch the boomerang."); return(&youmonst); } } tmp_at(bhitpos.x, bhitpos.y); delay_output(); if(ct % 5 != 0) i++; #ifdef SINKS if(IS_SINK(levl[bhitpos.x][bhitpos.y].typ)) break; /* boomerang falls on sink */ #endif } tmp_at(DISP_END, 0); /* do not leave last symbol */ return (struct monst *)0; } STATIC_OVL int zhitm(mon, type, nd, ootmp) /* returns damage to mon */ register struct monst *mon; register int type, nd; struct obj **ootmp; /* to return worn armor for caller to disintegrate */ { register int tmp = 0; register int abstype = abs(type) % 10; boolean sho_shieldeff = FALSE; boolean spellcaster = (is_hero_spell(type) || is_mega_spell(type)); /* maybe get a bonus! */ int skilldmg = 0; *ootmp = (struct obj *)0; switch(abstype) { case ZT_MAGIC_MISSILE: if (resists_magm(mon)) { sho_shieldeff = TRUE; break; } tmp = d(nd,6); if (spellcaster) skilldmg = spell_damage_bonus(SPE_MAGIC_MISSILE); break; case ZT_FIRE: if (resists_fire(mon)) { sho_shieldeff = TRUE; break; } tmp = d(nd,6); if (resists_cold(mon)) tmp += 7; if (spellcaster) skilldmg = spell_damage_bonus(SPE_FIREBALL); if (burnarmor(mon)) { if (!rn2(3)) (void)destroy_mitem(mon, POTION_CLASS, AD_FIRE); if (!rn2(3)) (void)destroy_mitem(mon, SCROLL_CLASS, AD_FIRE); if (!rn2(5)) (void)destroy_mitem(mon, SPBOOK_CLASS, AD_FIRE); } break; case ZT_COLD: if (resists_cold(mon)) { sho_shieldeff = TRUE; break; } tmp = d(nd,6); if (resists_fire(mon)) tmp += d(nd, 3); if (spellcaster) skilldmg = spell_damage_bonus(SPE_CONE_OF_COLD); if (!rn2(3)) (void)destroy_mitem(mon, POTION_CLASS, AD_COLD); break; case ZT_SLEEP: tmp = 0; (void)sleep_monst(mon, d(nd, 25), type == ZT_WAND(ZT_SLEEP) ? WAND_CLASS : '\0'); break; case ZT_DEATH: /* death/disintegration */ if(abs(type) != ZT_BREATH(ZT_DEATH)) { /* death */ if(mon->data == &mons[PM_DEATH]) { mon->mhpmax += mon->mhpmax/2; if (mon->mhpmax >= MAGIC_COOKIE) mon->mhpmax = MAGIC_COOKIE - 1; mon->mhp = mon->mhpmax; break; } if (nonliving(mon->data) || is_demon(mon->data) || resists_death(mon) || resists_magm(mon)) { /* similar to player */ sho_shieldeff = TRUE; break; } type = -1; /* so they don't get saving throws */ } else { struct obj *otmp2; if (resists_disint(mon)) { sho_shieldeff = TRUE; } else if (mon->misc_worn_check & W_ARMS) { /* destroy shield; victim survives */ *ootmp = which_armor(mon, W_ARMS); } else if (mon->misc_worn_check & W_ARM) { /* destroy body armor, also cloak if present */ *ootmp = which_armor(mon, W_ARM); if ((otmp2 = which_armor(mon, W_ARMC)) != 0) m_useup(mon, otmp2); break; } else { /* no body armor, victim dies; destroy cloak and shirt now in case target gets life-saved */ tmp = MAGIC_COOKIE; if ((otmp2 = which_armor(mon, W_ARMC)) != 0) m_useup(mon, otmp2); #ifdef TOURIST if ((otmp2 = which_armor(mon, W_ARMU)) != 0) m_useup(mon, otmp2); #endif } type = -1; /* no saving throw wanted */ break; /* not ordinary damage */ } tmp = mon->mhp+1; break; case ZT_LIGHTNING: if (resists_elec(mon)) { sho_shieldeff = TRUE; tmp = 0; /* can still blind the monster */ } else tmp = d(nd,6); if (spellcaster) skilldmg = spell_damage_bonus(SPE_LIGHTNING); if (!resists_blnd(mon) && !(type > 0 && u.uswallow && mon == u.ustuck)) { register unsigned rnd_tmp = rnd(50); mon->mcansee = 0; if((mon->mblinded + rnd_tmp) > 127) mon->mblinded = 127; else mon->mblinded += rnd_tmp; } if (!rn2(3)) (void)destroy_mitem(mon, WAND_CLASS, AD_ELEC); /* not actually possible yet */ if (!rn2(3)) (void)destroy_mitem(mon, RING_CLASS, AD_ELEC); break; case ZT_POISON_GAS: if (resists_poison(mon)) { sho_shieldeff = TRUE; break; } tmp = d(nd,6); break; case ZT_ACID: if (resists_acid(mon)) { sho_shieldeff = TRUE; break; } tmp = d(nd,6); if (!rn2(6)) erode_obj(MON_WEP(mon), TRUE, TRUE); if (!rn2(6)) erode_armor(mon, TRUE); break; } if (sho_shieldeff) shieldeff(mon->mx, mon->my); if (spellcaster && (Role_if(PM_KNIGHT) && u.uhave.questart)) tmp *= 2; #ifdef WIZ_PATCH_DEBUG if (spellcaster) pline("Damage = %d + %d", tmp, skilldmg); #endif tmp += skilldmg; 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 mon->mhp -= tmp; #ifdef SHOW_DMG if (mon->mhp > 0) showdmg(tmp); #endif return(tmp); } STATIC_OVL void zhitu(type, nd, fltxt, sx, sy) int type, nd; const char *fltxt; xchar sx, sy; { int dam = 0; /* KMH -- Don't bother checking if the ray hit our steed. * 1. Assume monsters aim to hit you. * 2. If hit by own beam, let the hero suffer. * 3. Falling off of the steed could relocate the hero * so he is hit twice, which is unrealistic. */ switch (abs(type) % 10) { case ZT_MAGIC_MISSILE: if (Antimagic) { shieldeff(sx, sy); pline_The("missiles bounce off!"); } else { dam = d(nd,6); exercise(A_STR, FALSE); } break; case ZT_FIRE: if (Fire_resistance) { shieldeff(sx, sy); You("don't feel hot!"); ugolemeffects(AD_FIRE, d(nd, 6)); } else { dam = d(nd, 6); } if (Slimed) { pline("The slime is burned away!"); Slimed = 0; } burn_away_slime(); if (burnarmor(&youmonst)) { /* "body hit" */ if (!rn2(3)) destroy_item(POTION_CLASS, AD_FIRE); if (!rn2(3)) destroy_item(SCROLL_CLASS, AD_FIRE); if (!rn2(5)) destroy_item(SPBOOK_CLASS, AD_FIRE); } break; case ZT_COLD: if (Cold_resistance) { shieldeff(sx, sy); You("don't feel cold."); ugolemeffects(AD_COLD, d(nd, 6)); } else { dam = d(nd, 6); } if (!rn2(3)) destroy_item(POTION_CLASS, AD_COLD); break; case ZT_SLEEP: if (Sleep_resistance) { shieldeff(u.ux, u.uy); You("don't feel sleepy."); } else { fall_asleep(-d(nd,25), TRUE); /* sleep ray */ } break; case ZT_DEATH: if (abs(type) == ZT_BREATH(ZT_DEATH)) { if (Disint_resistance) { You("are not disintegrated."); break; } else if (uarms) { /* destroy shield; other possessions are safe */ (void) destroy_arm(uarms); break; } else if (uarm) { /* destroy suit; if present, cloak goes too */ if (uarmc) (void) destroy_arm(uarmc); (void) destroy_arm(uarm); break; } /* no shield or suit, you're dead; wipe out cloak and/or shirt in case of life-saving or bones */ if (uarmc) (void) destroy_arm(uarmc); #ifdef TOURIST if (uarmu) (void) destroy_arm(uarmu); #endif if (Invulnerable) { pline("You are unharmed!"); break; } } else if (nonliving(youmonst.data) || is_demon(youmonst.data)) { shieldeff(sx, sy); You("seem unaffected."); break; } else if (Antimagic) { shieldeff(sx, sy); You("aren't affected."); break; } else if (Invulnerable) { dam = 0; pline("You are unharmed!"); break; } killer_format = KILLED_BY_AN; killer = fltxt; /* when killed by disintegration breath, don't leave corpse */ u.ugrave_arise = (type == -ZT_BREATH(ZT_DEATH)) ? -3 : NON_PM; done(DIED); return; /* lifesaved */ case ZT_LIGHTNING: if (Shock_resistance) { shieldeff(sx, sy); You("aren't affected."); ugolemeffects(AD_ELEC, d(nd, 6)); } else { dam = d(nd, 6); exercise(A_CON, FALSE); } if (!rn2(3)) destroy_item(WAND_CLASS, AD_ELEC); if (!rn2(3)) destroy_item(RING_CLASS, AD_ELEC); break; case ZT_POISON_GAS: poisoned("blast", A_DEX, "poisoned blast", 15); break; case ZT_ACID: /* KMH, balance patch -- new intrinsic */ if (Acid_resistance) { dam = 0; } else { pline_The("acid burns!"); dam = d(nd,6); 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; } if (Half_spell_damage && dam && type < 0 && (type > -20 || type < -29)) /* !Breath */ dam = (dam + 1) / 2; /* when killed by disintegration breath, don't leave corpse */ u.ugrave_arise = (type == -ZT_BREATH(ZT_DEATH)) ? -3 : -1; losehp(dam, fltxt, KILLED_BY_AN); return; } #endif /*OVL1*/ #ifdef OVLB /* * burn scrolls and spell books on floor at position x,y * return the number of scrolls and spell books 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; char buf1[BUFSZ], buf2[BUFSZ]; int cnt = 0; for (obj = level.objects[x][y]; obj; obj = obj2) { obj2 = obj->nexthere; if (obj->oclass == SCROLL_CLASS || obj->oclass == SPBOOK_CLASS) { if (obj->otyp == SCR_FIRE || obj->otyp == SPE_FIREBALL || obj_resists(obj, 2, 100)) continue; scrquan = obj->quan; /* number present */ delquan = 0; /* number to destroy */ for (i = scrquan; i > 0; i--) if (!rn2(3)) delquan++; if (delquan) { /* save name before potential delobj() */ if (give_feedback) { obj->quan = 1; Strcpy(buf1, (x == u.ux && y == u.uy) ? xname(obj) : distant_name(obj, xname)); obj->quan = 2; Strcpy(buf2, (x == u.ux && y == u.uy) ? xname(obj) : distant_name(obj, xname)); obj->quan = scrquan; } /* 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) { if (delquan > 1) pline("%ld %s burn.", delquan, buf2); else pline("%s burns.", An(buf1)); } } } } return cnt; } /* will zap/spell/breath attack score a hit against armor class `ac'? */ STATIC_OVL int zap_hit(ac, type) int ac; int type; { int chance = rn2(20); int spell_bonus = type ? spell_hit_bonus(type) : 0; /* small chance for naked target to avoid being hit */ if (!chance) return rnd(10) < ac+spell_bonus; /* very high armor protection does not achieve invulnerability */ ac = AC_VALUE(ac); return (3 - chance) < ac+spell_bonus; } /* #endif */ /* type == 0 to 9 : you shooting a wand */ /* type == 10 to 19 : you casting a spell */ /* type == 20 to 29 : you breathing as a monster */ /* type == 30 to 39 : you casting Super spell -- WAC */ /* currently only fireball, cone of cold*/ /* type == -10 to -19 : monster casting spell */ /* type == -20 to -29 : monster breathing at you */ /* type == -30 to -39 : monster shooting a wand */ /* called with dx = dy = 0 with vertical bolts */ void buzz(type,nd,sx,sy,dx,dy) register int type, nd; register xchar sx,sy; register int dx,dy; { int range, abstype; struct rm *lev; register xchar lsx, lsy; struct monst *mon; coord save_bhitpos; boolean shopdamage = FALSE; register const char *fltxt; struct obj *otmp; #ifdef LIGHT_SRC_SPELL int lits = 0; #endif /*for mega crude hack to keep from blowing up in face --WAC*/ int away=0; struct monst *mblamed = m_at(sx, sy); /* Apparent aggressor */ int spell_type = 0; /* LSZ/WWA The Wizard Patch July 96 * If its a Hero Spell then get its SPE_TYPE */ /* horrible kludge for wands of fireball... */ if (type == ZT_WAND(ZT_LIGHTNING+1)) type = ZT_SPELL(ZT_FIRE); /*WAC kludge for monsters zapping wands of fireball*/ if ((type <= ZT_MONWAND(ZT_FIRST) && type >=ZT_MONWAND(ZT_LAST)) && ( (abs(type) % 10) == ZT_WAND(ZT_LIGHTNING+1))) type = - ZT_SPELL(ZT_FIRE); /*WAC bugfix - should show right color stream now (for wands of fireball) */ abstype = abs(type) % 10; if (is_hero_spell(type) || is_mega_spell(type)) spell_type = abstype + SPE_MAGIC_MISSILE; /* WAC Whoops...this just catches monster wands ;B */ fltxt = flash_types[(type <= ZT_MONWAND(ZT_FIRST)) ? abstype : abs(type)]; if(u.uswallow) { register int tmp; if(type < 0) return; tmp = zhitm(u.ustuck, type, nd, &otmp); if(!u.ustuck) u.uswallow = 0; else pline("%s rips into %s%s", The(fltxt), mon_nam(u.ustuck), exclam(tmp)); /* Using disintegration from the inside only makes a hole... */ if (tmp == MAGIC_COOKIE) u.ustuck->mhp = 0; if (u.ustuck->mhp < 1) killed(u.ustuck); return; } if(type < 0) newsym(u.ux,u.uy); range = rn1(7,7); if(dx == 0 && dy == 0) range = 1; save_bhitpos = bhitpos; if (!is_mega_spell(type)) { tmp_at(DISP_BEAM, zapdir_to_glyph(dx, dy, abstype)); } while(range-- > 0) { /*hack to keep mega spells from blowing up in your face WAC*/ away++; /* Control sigil */ if ((away > 4 && !rn2(4)) && tech_inuse(T_SIGIL_CONTROL)) { getdir((char *)0); if(u.dx || u.dy) { /* Change dir! */ dx = u.dx; dy = u.dy; } } lsx = sx; sx += dx; lsy = sy; sy += dy; lev = &levl[sx][sy]; /*new zap code*/ /* if(isok(sx,sy) && (lev = &levl[sx][sy])->typ) {*/ if(isok(sx,sy) && (ZAP_POS(lev->typ))) { #ifdef LIGHT_SRC_SPELL /*WAC added light sourcing for the zap...*/ if (((abstype == ZT_FIRE) || (abstype == ZT_LIGHTNING)) && (!(type >= ZT_MEGA(ZT_FIRST) && type <= ZT_MEGA(ZT_LAST)))) { lits++; new_light_source(sx, sy, 1, LS_TEMP, (genericptr_t) lits); vision_full_recalc = 1; vision_recalc(0); } #endif /*Actual Megablast:right now only mag missile to cone of cold WAC*/ if (is_mega_spell(type) && away != 1) { /*explode takes care of vision stuff*/ int expl_type; expl_type = abstype == ZT_FIRE ? EXPL_FIERY : abstype == ZT_COLD ? EXPL_FROSTY : EXPL_MAGICAL; explode(sx, sy, type, nd, 0, expl_type); delay_output(); /* wait a little */ } mon = m_at(sx, sy); /* Normal Zap */ if (!is_mega_spell(type) && cansee(sx,sy)) { /* reveal/unreveal invisible monsters before tmp_at() */ if (mon && !canspotmon(mon)) map_invisible(sx, sy); else if (!mon && memory_is_invisible(sx, sy)) { unmap_object(sx, sy); newsym(sx, sy); } if(ZAP_POS(lev->typ) || cansee(lsx,lsy)) { tmp_at(sx,sy); delay_output(); /* wait a little */ } } /*Clear blast for Megablasts + Fireball*/ /*Clean for fireball*/ #ifdef LIGHT_SRC_SPELL if (abs(type) == ZT_SPELL(ZT_FIRE)) { del_light_source(LS_TEMP, (genericptr_t) lits); lits--; } #endif } else goto make_bounce; /* hit() and miss() need bhitpos to match the target */ bhitpos.x = sx, bhitpos.y = sy; /* Fireballs only damage when they explode */ if (abs(type) != ZT_SPELL(ZT_FIRE)) range += zap_over_floor(sx, sy, type, &shopdamage); if (mon) { /* WAC Player/Monster Fireball */ if (abs(type) == ZT_SPELL(ZT_FIRE)) break; if (type >= 0) mon->mstrategy &= ~STRAT_WAITMASK; #ifdef STEED buzzmonst: #endif if (zap_hit(find_mac(mon), spell_type)) { if (mon_reflects(mon, (char *)0)) { if(cansee(mon->mx,mon->my)) { hit(fltxt, mon, exclam(0)); shieldeff(mon->mx, mon->my); (void) mon_reflects(mon, "But it reflects from %s %s!"); } dx = -dx; dy = -dy; /* WAC clear the beam so you can see it bounce back ;B */ if (!is_mega_spell(type)) { tmp_at(DISP_END,0); tmp_at(DISP_BEAM, zapdir_to_glyph(dx, dy, abstype)); } delay_output(); } else { boolean mon_could_move = mon->mcanmove; int tmp = zhitm(mon, type, nd, &otmp); /*WAC Since Death is a rider, check for death before disint*/ if (mon->data == &mons[PM_DEATH] && abstype == ZT_DEATH && tmp != MAGIC_COOKIE) { if (canseemon(mon)) { hit(fltxt, mon, "."); pline("%s absorbs the deadly %s!", Monnam(mon), /*make this abs(type) rather than just type to catch those monsters*/ /*actually, breath should always be disintegration....*/ abs(type) == ZT_BREATH(ZT_DEATH) ? "blast" : "ray"); pline("It seems even stronger than before."); /*It heals to max hitpoints. Max hp is raised in zhitm */ } mon->mhp = mon->mhpmax; break; /* Out of while loop */ } /* if (is_rider(mon->data) && abs(type) && type == ZT_BREATH(ZT_DEATH)) {*/ /*WAC rider and disintegration check*/ if (is_rider(mon->data) && abstype == ZT_DEATH && tmp == MAGIC_COOKIE) { if (canseemon(mon)) { hit(fltxt, mon, "."); 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; break; /* Out of while loop */ } else if (tmp == MAGIC_COOKIE) { /* disintegration */ struct obj *otmp2, *m_amulet = mlifesaver(mon); if (canseemon(mon)) { if (!m_amulet) pline("%s is disintegrated!", Monnam(mon)); 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) \ (objects[obj->otyp].oc_oprop == DISINT_RES || \ obj_resists(obj, 5, 50) || is_quest_artifact(obj) || \ obj == m_amulet) for (otmp = mon->minvent; otmp; otmp = otmp2) { otmp2 = otmp->nobj; if (!oresist_disintegration(otmp)) { if (Has_contents(otmp)) delete_contents(otmp); obj_extract_self(otmp); obfree(otmp, (struct obj *)0); } } if (type < 0) monkilled(mon, (char *)0, -AD_RBRE); else xkilled(mon, 2); } else if(mon->mhp < 1) { if(type < 0) monkilled(mon, fltxt, AD_RBRE); else killed(mon); } else { if (!otmp) { /* normal non-fatal hit */ hit(fltxt, mon, exclam(tmp)); if (mblamed && mblamed != mon && !DEADMONSTER(mblamed) && mon->movement >= NORMAL_SPEED && rn2(4)) { /* retaliate */ mon->movement -= NORMAL_SPEED; mattackm(mon, mblamed); } } else { /* some armor was destroyed; no damage done */ if (canseemon(mon)) pline("%s %s is disintegrated!", s_suffix(Monnam(mon)), distant_name(otmp, xname)); m_useup(mon, otmp); } if (mon_could_move && !mon->mcanmove) /* ZT_SLEEP */ slept_monst(mon); } } range -= 2; } else { miss(fltxt,mon); } } else if (sx == u.ux && sy == u.uy && range >= 0) { nomul(0); #ifdef STEED if (u.usteed && !rn2(3) && !mon_reflects(u.usteed, (char *)0)) { mon = u.usteed; goto buzzmonst; } else #endif if (zap_hit((int) u.uac, 0)) { range -= 2; pline("%s hits you!", The(fltxt)); if (Reflecting && abs(type) != ZT_SPELL(ZT_FIRE)) { if (!Blind) { (void) ureflects("But %s reflects from your %s!", "it"); } else pline("For some reason you are not affected."); dx = -dx; dy = -dy; shieldeff(sx, sy); /* WAC clear the beam so you can see it bounce back ;B */ if (!is_mega_spell(type)) { tmp_at(DISP_END,0); tmp_at(DISP_BEAM, zapdir_to_glyph(dx, dy, abstype)); } } else { if (abs(type) != ZT_SPELL(ZT_FIRE)) zhitu(type, nd, fltxt, sx, sy); else range = 0; } } else { pline("%s whizzes by you!", The(fltxt)); } 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); } if(!ZAP_POS(lev->typ) || (closed_door(sx, sy) && (range >= 0))) { int bounce; uchar rmn; make_bounce: /* WAC Player/Monster Fireball */ if (abs(type) == ZT_SPELL(ZT_FIRE)) { sx = lsx; sy = lsy; break; /* fireballs explode before the wall */ } bounce = 0; /* range--;*/ if(range && isok(lsx, lsy) && cansee(lsx,lsy)) pline("%s bounces!", The(fltxt)); if(!dx || !dy || !rn2(20)) { dx = -dx; dy = -dy; /* WAC clear the beam so you can see it bounce back ;B */ if (!is_mega_spell(type)) { tmp_at(DISP_END,0); tmp_at(DISP_BEAM, zapdir_to_glyph(dx, dy, abstype)); } delay_output(); } else { if(isok(sx,lsy) && ZAP_POS(rmn = levl[sx][lsy].typ) && !closed_door(sx,lsy) && (IS_ROOM(rmn) || (isok(sx+dx,lsy) && ZAP_POS(levl[sx+dx][lsy].typ)))) bounce = 1; if(isok(lsx,sy) && ZAP_POS(rmn = levl[lsx][sy].typ) && !closed_door(lsx,sy) && (IS_ROOM(rmn) || (isok(lsx,sy+dy) && ZAP_POS(levl[lsx][sy+dy].typ)))) if(!bounce || rn2(2)) bounce = 2; switch(bounce) { case 0: dx = -dx; dy = -dy; /* WAC clear the beam so you can see it bounce back ;B */ if (!is_mega_spell(type)) { tmp_at(DISP_END,0); tmp_at(DISP_BEAM, zapdir_to_glyph(dx, dy, abstype)); } delay_output(); break; case 1: dy = -dy; sx = lsx; break; case 2: dx = -dx; sy = lsy; break; } if (!is_mega_spell(type)) tmp_at(DISP_CHANGE, zapdir_to_glyph(dx,dy,abstype)); } } } /* Let you enjoy the beam */ display_nhwindow(WIN_MESSAGE, TRUE); /* --More-- */ /*WAC clear the light source*/ #ifdef LIGHT_SRC_SPELL if (((abstype == ZT_FIRE) || (abstype == ZT_LIGHTNING)) && (!(type >= ZT_MEGA(ZT_FIRST) && type <= ZT_MEGA(ZT_LAST)))) { while (lits) { del_light_source(LS_TEMP, (genericptr_t) lits); lits--; } vision_full_recalc = 1; vision_recalc(0); /*clean up vision*/ } #endif if (!is_mega_spell(type)) tmp_at(DISP_END,0); /*WAC Player/Monster fireball*/ if (abs(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" : abstype == ZT_DEATH ? "disintegrate" : "destroy", FALSE); bhitpos = save_bhitpos; } #endif /*OVLB*/ #ifdef OVL0 void melt_ice(x, y) xchar x, y; { struct rm *lev = &levl[x][y]; struct obj *otmp; if (lev->typ == DRAWBRIDGE_UP) lev->drawbridgemask &= ~DB_ICE; /* revert to DB_MOAT */ else { /* lev->typ == ICE */ #ifdef STUPID if (lev->icedpool == ICED_POOL) lev->typ = POOL; else lev->typ = MOAT; #else lev->typ = (lev->icedpool == ICED_POOL ? POOL : MOAT); #endif lev->icedpool = 0; } obj_ice_effects(x, y, FALSE); unearth_objs(x, y); if (Underwater) vision_recalc(1); newsym(x,y); if (cansee(x,y)) Norep("The ice crackles and melts."); if ((otmp = sobj_at(BOULDER, x, y)) != 0) { if (cansee(x,y)) pline("%s settles...", An(xname(otmp))); do { obj_extract_self(otmp); /* boulder isn't being pushed */ if (!boulder_hits_pool(otmp, x, y, FALSE)) impossible("melt_ice: no pool?"); /* try again if there's another boulder and pool didn't fill */ } while (is_pool(x,y) && (otmp = sobj_at(BOULDER, x, y)) != 0); newsym(x,y); } if (x == u.ux && y == u.uy) spoteffects(TRUE); /* possibly drown, notice objects */ } /* Burn floor scrolls, evaporate pools, etc... in a single square. Used * both for normal bolts of fire, cold, etc... and for fireballs. * Sets shopdamage to TRUE if a shop door is destroyed, and returns the * amount by which range is reduced (the latter is just ignored by fireballs) */ int zap_over_floor(x, y, type, shopdamage) xchar x, y; int type; boolean *shopdamage; { struct monst *mon; int abstype = abs(type) % 10; struct rm *lev = &levl[x][y]; 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)) { const char *msgtxt = "You hear hissing gas."; if(lev->typ != POOL) { /* MOAT or DRAWBRIDGE_UP */ if (cansee(x,y)) msgtxt = "Some water evaporates."; } else { register struct trap *ttmp; rangemod -= 3; lev->typ = ROOM; ttmp = maketrap(x, y, PIT); if (ttmp) ttmp->tseen = 1; if (cansee(x,y)) msgtxt = "The water evaporates."; } Norep(msgtxt); if (lev->typ == ROOM) newsym(x,y); } else if(IS_FOUNTAIN(lev->typ)) { if (cansee(x,y)) pline("Steam billows from the fountain."); rangemod -= 1; dryup(x, y, type > 0); } } else if(abstype == ZT_COLD && (is_pool(x,y) || is_lava(x,y))) { boolean lava = is_lava(x,y); boolean moat = (!lava && (lev->typ != POOL) && (lev->typ != WATER) && !Is_medusa_level(&u.uz) && !Is_waterlevel(&u.uz)); if (lev->typ == WATER) { /* For now, don't let WATER freeze. */ if (cansee(x,y)) pline_The("water freezes for a moment."); else You_hear("a soft crackling."); rangemod -= 1000; /* stop */ } else { rangemod -= 3; if (lev->typ == DRAWBRIDGE_UP) { lev->drawbridgemask &= ~DB_UNDER; /* clear lava */ lev->drawbridgemask |= (lava ? DB_FLOOR : DB_ICE); } else { if (!lava) lev->icedpool = (lev->typ == POOL ? ICED_POOL : ICED_MOAT); lev->typ = (lava ? ROOM : ICE); } bury_objs(x,y); if(cansee(x,y)) { if(moat) Norep("The moat is bridged with ice!"); else if(lava) Norep("The lava cools and solidifies."); else Norep("The water freezes."); newsym(x,y); } else if(flags.soundok && !lava) You_hear("a crackling sound."); if (x == u.ux && y == u.uy) { if (u.uinwater) { /* not just `if (Underwater)' */ /* leave the no longer existent water */ u.uinwater = 0; u.uundetected = 0; docrt(); vision_full_recalc = 1; } else if (u.utrap && u.utraptype == TT_LAVA) { if (Passes_walls) { You("pass through the now-solid rock."); } else { u.utrap = rn1(50,20); u.utraptype = TT_INFLOOR; You("are firmly stuck in the cooling rock."); } } } else if ((mon = m_at(x,y)) != 0) { /* probably ought to do some hefty damage to any non-ice creature caught in freezing water; at a minimum, eels are forced out of hiding */ if (is_swimmer(mon->data) && mon->mundetected) { mon->mundetected = 0; newsym(x,y); } } } obj_ice_effects(x,y,TRUE); } if(closed_door(x, y)) { int new_doormask = -1; const char *see_txt = 0, *sense_txt = 0, *hear_txt = 0; rangemod = -1000; /* ALI - Artifact doors */ if (artifact_door(x, y)) goto def_case; switch(abstype) { case ZT_FIRE: new_doormask = D_NODOOR; see_txt = "The door is consumed in flames!"; sense_txt = "smell smoke."; break; case ZT_COLD: new_doormask = D_NODOOR; see_txt = "The door freezes and shatters!"; sense_txt = "feel cold."; break; case ZT_DEATH: /* death spells/wands don't disintegrate */ if(abs(type) != ZT_BREATH(ZT_DEATH)) goto def_case; new_doormask = D_NODOOR; see_txt = "The door disintegrates!"; hear_txt = "crashing wood."; break; case ZT_LIGHTNING: new_doormask = D_BROKEN; see_txt = "The door splinters!"; hear_txt = "crackling."; break; case ZT_ACID: new_doormask = D_NODOOR; see_txt = "The door melts!"; hear_txt = "sizzling."; break; default: def_case: if(cansee(x,y)) { pline_The("door absorbs %s %s!", (type < 0) ? "the" : "your", abs(type) < ZT_SPELL(0) ? "bolt" : abs(type) < ZT_BREATH(0) ? "spell" : "blast"); } else You_feel("vibrations."); break; } if (new_doormask >= 0) { /* door gets broken */ if (*in_rooms(x, y, SHOPBASE)) { if (type >= 0) { add_damage(x, y, 400L); *shopdamage = TRUE; } else /* caused by monster */ add_damage(x, y, 0L); } lev->doormask = new_doormask; unblock_point(x, y); /* vision */ if (cansee(x, y)) { pline(see_txt); newsym(x, y); } else if (sense_txt) { You(sense_txt); } else if (hear_txt) { if (flags.soundok) You_hear(hear_txt); } if (picking_at(x, y)) { stop_occupation(); reset_pick(); } } } 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"); } if ((mon = m_at(x,y)) != 0) { /* Cannot use wakeup() which also angers the monster */ mon->msleeping = 0; if(mon->m_ap_type) seemimic(mon); if(type >= 0) { setmangry(mon); if(mon->ispriest && *in_rooms(mon->mx, mon->my, TEMPLE)) ghod_hitsu(mon); if(mon->isshk && !*u.ushops) hot_pursuit(mon); } } return rangemod; } #endif /*OVL0*/ #ifdef OVL3 void fracture_rock(obj) /* fractured by pick-axe or wand of striking */ register struct obj *obj; /* no texts here! */ { /* A little Sokoban guilt... */ if (obj->otyp == BOULDER && In_sokoban(&u.uz) && !flags.mon_moving) change_luck(-1); obj->otyp = ROCK; obj->quan = (long) rn1(60, 7); obj->owt = weight(obj); obj->oclass = GEM_CLASS; obj->known = FALSE; obj->onamelth = 0; /* no names */ obj->oxlth = 0; /* no extra data */ obj->oattached = OATTACHED_NOTHING; if (obj->where == OBJ_FLOOR) { 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)) newsym(obj->ox,obj->oy); } } /* handle statue hit by striking/force bolt/pick-axe */ boolean break_statue(obj) register struct obj *obj; { /* [obj is assumed to be on floor, so no get_obj_location() needed] */ struct trap *trap = t_at(obj->ox, obj->oy); struct obj *item; if (trap && trap->ttyp == STATUE_TRAP && activate_statue_trap(trap, obj->ox, obj->oy, TRUE)) return FALSE; /* drop any objects contained inside the statue */ while ((item = obj->cobj) != 0) { obj_extract_self(item); place_object(item, obj->ox, obj->oy); } if (Role_if(PM_ARCHEOLOGIST) && !flags.mon_moving && (obj->spe & STATUE_HISTORIC)) { You_feel("guilty about damaging such a historic statue."); adjalign(-1); } obj->spe = 0; fracture_rock(obj); return TRUE; } const char * const destroy_strings[] = { /* also used in trap.c */ "freezes and shatters", "freeze and shatter", "shattered potion", "boils and explodes", "boil and explode", "boiling potion", "catches fire and burns", "catch fire and burn", "burning scroll", "catches fire and burns", "catch fire and burn", "burning book", "turns to dust and vanishes", "turn to dust and vanish", "", "breaks apart and explodes", "break apart and explode", "exploding wand" }; void destroy_item(osym, dmgtyp) register int osym, dmgtyp; { register struct obj *obj; register int dmg, xresist, skip; register long i, cnt, quan; register int dindx; const char *mult; /* * [ALI] Because destroy_item() can call wand_explode() which can * call explode() which can call destroy_item() again, we need to * be able to deal with the possibility of not only the current * object we are looking at no longer being in the inventory, but * also the next object (and the one after that, etc.). * We do this by taking advantage of the fact that objects in the * inventory destroyed as a result of calling wand_explode() will * always be destroyed by this same function. This allows us to * maintain a list of "next" pointers and to adjust these pointers * as required when we destroy an object that they might be pointing * at. */ struct destroy_item_frame { struct obj *next_obj; struct destroy_item_frame *next_frame; } frame; static struct destroy_item_frame *destroy_item_stack; /* this is to deal with gas spores -- they don't really destroy objects, but this routine is called a lot in explode.c for them... hmph... */ if (dmgtyp == AD_PHYS) return; frame.next_frame = destroy_item_stack; destroy_item_stack = &frame; for(obj = invent; obj; obj = frame.next_obj) { frame.next_obj = obj->nobj; if(obj->oclass != osym) continue; /* test only objs of type osym */ if(obj->oartifact) continue; /* don't destroy artifacts */ if(obj->in_use && obj->quan == 1) continue; /* not available */ xresist = skip = 0; #ifdef GCC_WARN dmg = dindx = 0; quan = 0L; #endif switch(dmgtyp) { case AD_COLD: if(osym == POTION_CLASS && obj->otyp != POT_OIL) { quan = obj->quan; dindx = 0; dmg = rnd(4); } else skip++; break; case AD_FIRE: xresist = (Fire_resistance && obj->oclass != POTION_CLASS); if (obj->otyp == SCR_FIRE || obj->otyp == SPE_FIREBALL) skip++; if (obj->otyp == SPE_BOOK_OF_THE_DEAD) { skip++; if (!Blind) pline("%s glows a strange %s, but remains intact.", The(xname(obj)), hcolor("dark red")); } quan = obj->quan; switch(osym) { case POTION_CLASS: dindx = 1; dmg = rnd(6); break; case SCROLL_CLASS: dindx = 2; dmg = 1; break; case SPBOOK_CLASS: dindx = 3; dmg = 1; break; default: skip++; break; } break; case AD_ELEC: xresist = (Shock_resistance && obj->oclass != RING_CLASS); quan = obj->quan; switch(osym) { case RING_CLASS: if(obj->otyp == RIN_SHOCK_RESISTANCE) { skip++; break; } dindx = 4; dmg = 0; break; case WAND_CLASS: if(obj->otyp == WAN_LIGHTNING) { skip++; break; } #if 0 if (obj == current_wand) { skip++; break; } #endif dindx = 5; dmg = rnd(10); break; default: skip++; break; } break; default: skip++; break; } if(!skip) { if (obj->in_use) --quan; /* one will be used up elsewhere */ for(i = cnt = 0L; i < quan; i++) if(!rn2(3)) cnt++; if(!cnt) continue; if(cnt == quan) mult = "Your"; else mult = (cnt == 1L) ? "One of your" : "Some of your"; 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); else setnotworn(obj); } if (obj == current_wand) current_wand = 0; /* destroyed */ if (cnt == obj->quan && frame.next_frame) { /* Before removing an object from the inventory, adjust * any "next" pointers that would otherwise become invalid. */ struct destroy_item_frame *fp; for(fp = frame.next_frame; fp; fp = fp->next_frame) { if (fp->next_obj == obj) fp->next_obj = frame.next_obj; } } if(osym == WAND_CLASS && dmgtyp == AD_ELEC) { /* MAR use a continue since damage and stuff is taken care of * in wand_explode */ wand_explode(obj, FALSE); continue; } /* Use up the object */ for (i = 0; i < cnt; i++) useup(obj); /* Do the damage if not resisted */ if(dmg) { if(xresist) You("aren't hurt!"); else { const char *how = destroy_strings[dindx * 3 + 2]; boolean one = (cnt == 1L); losehp(dmg, one ? how : (const char *)makeplural(how), one ? KILLED_BY_AN : KILLED_BY); exercise(A_STR, FALSE); } } } } destroy_item_stack = frame.next_frame; return; } int destroy_mitem(mtmp, osym, dmgtyp) struct monst *mtmp; int osym, dmgtyp; { struct obj *obj, *obj2; int skip, tmp = 0; long i, cnt, quan; int dindx; boolean vis; if (mtmp == &youmonst) { /* this simplifies artifact_hit() */ destroy_item(osym, dmgtyp); return 0; /* arbitrary; value doesn't matter to artifact_hit() */ } vis = canseemon(mtmp); for(obj = mtmp->minvent; obj; obj = obj2) { obj2 = obj->nobj; if(obj->oclass != osym) continue; /* test only objs of type osym */ skip = 0; quan = 0L; dindx = 0; switch(dmgtyp) { case AD_COLD: if(osym == POTION_CLASS && obj->otyp != POT_OIL) { quan = obj->quan; dindx = 0; tmp++; } else skip++; break; case AD_FIRE: if (obj->otyp == SCR_FIRE || obj->otyp == SPE_FIREBALL) skip++; if (obj->otyp == SPE_BOOK_OF_THE_DEAD) { skip++; if (vis) pline("%s glows a strange %s, but remains intact.", The(distant_name(obj, xname)), hcolor("dark red")); } quan = obj->quan; switch(osym) { case POTION_CLASS: dindx = 1; tmp++; break; case SCROLL_CLASS: dindx = 2; tmp++; break; case SPBOOK_CLASS: dindx = 3; tmp++; break; default: skip++; break; } break; case AD_ELEC: quan = obj->quan; switch(osym) { case RING_CLASS: if(obj->otyp == RIN_SHOCK_RESISTANCE) { skip++; break; } dindx = 4; break; case WAND_CLASS: if(obj->otyp == WAN_LIGHTNING) { skip++; break; } dindx = 5; tmp++; break; default: skip++; break; } break; default: skip++; break; } if(!skip) { for(i = cnt = 0L; i < quan; i++) if(!rn2(3)) cnt++; if(!cnt) continue; if (vis) pline("%s %s %s!", s_suffix(Monnam(mtmp)), xname(obj), (cnt > 1L) ? destroy_strings[dindx*3 + 1] : destroy_strings[dindx*3]); for(i = 0; i < cnt; i++) m_useup(mtmp, obj); } } return(tmp); } #endif /*OVL3*/ #ifdef OVL2 int resist(mtmp, oclass, damage, tell) struct monst *mtmp; char oclass; int damage, tell; { int resisted; int alev, dlev; /* attack level */ switch (oclass) { case WAND_CLASS: alev = 12; break; case TOOL_CLASS: alev = 10; break; /* instrument */ case WEAPON_CLASS: alev = 10; break; /* artifact */ 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 */ dlev = (int)mtmp->m_lev; if (dlev > 50) dlev = 50; 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); } void 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) { /* The(aobjnam()) is safe since otmp is unidentified -dlc */ (void) hold_another_object(otmp, u.uswallow ? "Oops! %s out of your reach!" : (Is_airlevel(&u.uz) || Is_waterlevel(&u.uz) || levl[u.ux][u.uy].typ < IRONBARS || levl[u.ux][u.uy].typ >= ICE) ? "Oops! %s away from you!" : "Oops! %s to the floor!", The(aobjnam(otmp, Is_airlevel(&u.uz) || u.uinwater ? "slip" : "drop")), (const char *)0); u.ublesscnt += rn1(100,50); /* the gods take notice */ } } /* LSZ/WWA Wizard Patch June '96 Choose location where spell takes effect.*/ /* WAC made into a void */ void throwspell() { coord cc; /* if (u.uinwater) { pline("You joking! In this weather?"); return 0; } else if (Is_waterlevel(&u.uz)) { You("better wait for the sun to come out."); return 0; } */ pline("Where do you want to cast the spell?"); cc.x = u.ux; cc.y = u.uy; while (1) { getpos(&cc, TRUE, "the desired position"); if(cc.x == -10) { u.dx = u.ux; u.dy = u.uy; return; /* user pressed esc */ } /* The number of moves from hero to where the spell drops.*/ if (distmin(u.ux, u.uy, cc.x, cc.y) > 10) { You("can't reach that far with your mind!"); } else if (u.uswallow) { pline("The spell is cut short!"); u.dx = u.ux; u.dy = u.uy; return; } else if (!cansee(cc.x, cc.y) || IS_STWALL(levl[cc.x][cc.y].typ)) { Your("mind fails to lock onto that location!"); } else { /* Bingo! */ u.dx=cc.x; u.dy=cc.y; return; } } } #endif /*OVL2*/ /*zap.c*/ slashem-0.0.7E7F3/src/dogmove.c0000664000076400007640000010021710545462317014250 0ustar aliali/* SCCS Id: @(#)dogmove.c 3.4 2002/09/10 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" #include "mfndpos.h" #include "edog.h" #include "emin.h" #include "epri.h" /* #define DEBUG */ /* uncomment to enable debugging */ #ifdef DEBUG # ifdef WIZARD #define debugpline if (wizard) pline # else #define debugpline pline # endif #endif extern boolean notonhead; #ifdef OVL0 STATIC_DCL boolean FDECL(dog_hunger,(struct monst *,struct edog *)); STATIC_DCL int FDECL(dog_invent,(struct monst *,struct edog *,int)); 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_location,(struct monst *,XCHAR_P,XCHAR_P, XCHAR_P,XCHAR_P)); STATIC_DCL boolean FDECL(could_reach_item,(struct monst *, XCHAR_P,XCHAR_P)); STATIC_OVL struct obj * DROPPABLES(mon) register struct monst *mon; { register struct obj *obj; struct obj *wep = MON_WEP(mon); boolean item1 = FALSE, item2 = FALSE; if (is_animal(mon->data) || mindless(mon->data)) item1 = item2 = TRUE; if (!tunnels(mon->data) || !needspick(mon->data)) item1 = TRUE; for(obj = mon->minvent; obj; obj = obj->nobj) { if (!item1 && is_pick(obj) && (obj->otyp != DWARVISH_MATTOCK || !which_armor(mon, W_ARMS))) { item1 = TRUE; continue; } if (!item2 && obj->otyp == UNICORN_HORN && !obj->cursed) { item2 = TRUE; continue; } if (!obj->owornmask && obj != wep) return obj; } return (struct obj *)0; } static NEARDATA const char nofetch[] = { BALL_CLASS, CHAIN_CLASS, ROCK_CLASS, 0 }; #endif /* OVL0 */ STATIC_OVL boolean FDECL(cursed_object_at, (struct monst *, int, int)); STATIC_VAR xchar gtyp, gx, gy; /* type and position of dog's current goal */ STATIC_PTR void FDECL(wantdoor, (int, int, genericptr_t)); #ifdef OVLB STATIC_OVL boolean cursed_object_at(mtmp, x, y) register struct monst *mtmp; int x, y; { struct obj *otmp; for(otmp = level.objects[x][y]; otmp; otmp = otmp->nexthere) /* [Tom] demons & undead don't care, though */ /* [ALI] demons & undead avoid blessed items instead */ if ((is_demon(mtmp->data) || is_undead(mtmp->data)) ? otmp->blessed : otmp->cursed) { #ifdef DEBUG debugpline("%s thinks %s at (%d,%d) is `cursed'", noit_Monnam(mtmp), doname(otmp), x, y); #endif return TRUE; } return FALSE; } int dog_nutrition(mtmp, obj) struct monst *mtmp; struct obj *obj; { int nutrit; /* * It is arbitrary that the pet takes the same length of time to eat * as a human, but gets more nutritional value. */ if (obj->oclass == FOOD_CLASS) { if(obj->otyp == CORPSE) { mtmp->meating = 3 + (mons[obj->corpsenm].cwt >> 6); nutrit = mons[obj->corpsenm].cnutrit; } else { mtmp->meating = objects[obj->otyp].oc_delay; nutrit = objects[obj->otyp].oc_nutrition; } switch(mtmp->data->msize) { case MZ_TINY: nutrit *= 8; break; case MZ_SMALL: nutrit *= 6; break; default: case MZ_MEDIUM: nutrit *= 5; break; case MZ_LARGE: nutrit *= 4; break; case MZ_HUGE: nutrit *= 3; break; case MZ_GIGANTIC: nutrit *= 2; break; } if(obj->oeaten) { mtmp->meating = eaten_stat(mtmp->meating, obj); nutrit = eaten_stat(nutrit, obj); } } else if (obj->oclass == COIN_CLASS) { mtmp->meating = (int)(obj->quan/2000) + 1; if (mtmp->meating < 0) mtmp->meating = 1; nutrit = (int)(obj->quan/20); if (nutrit < 0) nutrit = 0; } else { /* Unusual pet such as gelatinous cube eating odd stuff. * meating made consistent with wild monsters in mon.c. * nutrit made consistent with polymorphed player nutrit in * eat.c. (This also applies to pets eating gold.) */ mtmp->meating = obj->owt/20 + 1; nutrit = 5*objects[obj->otyp].oc_nutrition; } return nutrit; } /* returns 2 if pet dies, otherwise 1 */ int dog_eat(mtmp, obj, x, y, devour) register struct monst *mtmp; register struct obj * obj; int x, y; boolean devour; { register struct edog *edog = EDOG(mtmp); boolean poly = FALSE, grow = FALSE, heal = FALSE; int nutrit; boolean vis = (cansee(x, y) || cansee(mtmp->mx, mtmp->my)); boolean vampiric = is_vampire(mtmp->data); if(edog->hungrytime < monstermoves) edog->hungrytime = monstermoves; nutrit = dog_nutrition(mtmp, obj); poly = polyfodder(obj); grow = mlevelgain(obj); heal = mhealup(obj); if (devour) { if (mtmp->meating > 1) mtmp->meating /= 2; if (nutrit > 1) nutrit = (nutrit * 3) / 4; } /* vampires only get 1/5 normal nutrition */ if (vampiric) { mtmp->meating = (mtmp->meating + 4) / 5; nutrit = (nutrit + 4) / 5; } edog->hungrytime += nutrit; mtmp->mconf = 0; if (edog->mhpmax_penalty) { /* no longer starving */ mtmp->mhpmax += edog->mhpmax_penalty; edog->mhpmax_penalty = 0; } if (mtmp->mflee && mtmp->mfleetim > 1) mtmp->mfleetim /= 2; if (mtmp->mtame < 20) mtmp->mtame++; if (x != mtmp->mx || y != mtmp->my) { /* moved & ate on same turn */ newsym(x, y); newsym(mtmp->mx, mtmp->my); } if (is_pool(x, y) && !Underwater) { /* Don't print obj */ /* TODO: Reveal presence of sea monster (especially sharks) */ } else /* hack: observe the action if either new or old location is in view */ /* However, invisible monsters should still be "it" even though out of sight locations should not. */ if (vis) pline("%s %s %s.", mon_visible(mtmp) ? noit_Monnam(mtmp) : "It", vampiric ? "drains" : devour ? "devours" : "eats", (obj->oclass == FOOD_CLASS) ? singular(obj, doname) : doname(obj)); /* It's a reward if it's DOGFOOD and the player dropped/threw it. */ /* We know the player had it if invlet is set -dlc */ if(dogfood(mtmp,obj) == DOGFOOD && obj->invlet) #ifdef LINT edog->apport = 0; #else edog->apport += (int)(200L/ ((long)edog->dropdist + monstermoves - edog->droptime)); #endif if (mtmp->data == &mons[PM_RUST_MONSTER] && obj->oerodeproof) { /* The object's rustproofing is gone now */ obj->oerodeproof = 0; mtmp->mstun = 1; if (canseemon(mtmp) && flags.verbose) { pline("%s spits %s out in disgust!", Monnam(mtmp), distant_name(obj,doname)); } } else if (vampiric) { /* Split Object */ if (obj->quan > 1L) { if(!carried(obj)) { (void) splitobj(obj, 1L); } else { /* Carried */ obj = splitobj(obj, obj->quan - 1L); freeinv(obj); if (inv_cnt() >= 52 && !merge_choice(invent, obj)) dropy(obj); else obj = addinv(obj); /* unlikely but a merge is possible */ } #ifdef DEBUG debugpline("split object,"); #endif } /* Take away blood nutrition */ obj->oeaten = drainlevel(obj); obj->odrained = 1; } else if (obj == uball) { unpunish(); 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) { (void) mon_spec_poly(mtmp, (struct permonst *)0, 0L, FALSE, cansee(mtmp->mx, mtmp->my), FALSE, FALSE); #if 0 (void) newcham(mtmp, (struct permonst *)0, FALSE, cansee(mtmp->mx, mtmp->my)); #endif } /* limit "instant" growth to prevent potential abuse */ if (grow && (int) mtmp->m_lev < (int)mtmp->data->mlevel + 15) { if (!grow_up(mtmp, (struct monst *)0)) return 2; } if (heal) mtmp->mhp = mtmp->mhpmax; return 1; } #endif /* OVLB */ #ifdef OVL0 /* hunger effects -- returns TRUE on starvation */ STATIC_OVL boolean dog_hunger(mtmp, edog) register struct monst *mtmp; register struct edog *edog; { if (monstermoves > edog->hungrytime + 500) { if (!carnivorous(mtmp->data) && !herbivorous(mtmp->data)) { edog->hungrytime = monstermoves + 500; /* but not too high; it might polymorph */ } else if (!edog->mhpmax_penalty) { /* starving pets are limited in healing */ int newmhpmax = mtmp->mhpmax / 3; mtmp->mconf = 1; edog->mhpmax_penalty = mtmp->mhpmax - newmhpmax; mtmp->mhpmax = newmhpmax; if (mtmp->mhp > mtmp->mhpmax) mtmp->mhp = mtmp->mhpmax; if (mtmp->mhp < 1) goto dog_died; if (cansee(mtmp->mx, mtmp->my)) pline("%s is confused from hunger.", Monnam(mtmp)); else if (couldsee(mtmp->mx, mtmp->my)) 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 #ifdef STEED && mtmp != u.usteed #endif ) Your("leash goes slack."); else if (cansee(mtmp->mx, mtmp->my)) pline("%s starves.", Monnam(mtmp)); else You_feel("%s for a moment.", Hallucination ? "bummed" : "sad"); mondied(mtmp); return(TRUE); } } return(FALSE); } /* do something with object (drop, pick up, eat) at current position * returns 1 if object eaten (since that counts as dog's move), 2 if died */ STATIC_OVL int dog_invent(mtmp, edog, udist) register struct monst *mtmp; register struct edog *edog; int udist; { /* KMH, balance patch -- quantity picked up should depend on dog's level */ int dogquan = 10 * mtmp->m_lev; register int omx, omy; struct obj *obj; /* struct obj *floor_obj; int temp_quan; */ if (mtmp->msleeping || !mtmp->mcanmove) return(0); omx = mtmp->mx; omy = mtmp->my; /* 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); if(edog->apport > 1) edog->apport--; edog->dropdist = udist; /* hpscdi!jon */ edog->droptime = moves; } } else { if((obj=level.objects[omx][omy]) && !index(nofetch,obj->oclass) #ifdef MAIL && obj->otyp != SCR_MAIL #endif ){ int edible = dogfood(mtmp, obj); if ((edible <= CADAVER || /* starving pet is more aggressive about eating */ (edog->mhpmax_penalty && edible == ACCFOOD)) && could_reach_item(mtmp, obj->ox, obj->oy)) return dog_eat(mtmp, obj, omx, omy, FALSE); /* [Tom] demonic & undead pets don't mind cursed items */ if(can_carry(mtmp, obj) && could_reach_item(mtmp, obj->ox, obj->oy) && (!obj->cursed || is_demon(mtmp->data) || is_undead(mtmp->data)) && (!obj->blessed || (!is_demon(mtmp->data) && !is_undead(mtmp->data)))) { if(rn2(20) < edog->apport+3) { if (rn2(udist) || !rn2(edog->apport)) { if ((!nohands(mtmp->data)) || /* KMH, balance patch -- 10*level */ (obj->quan <= dogquan)) { if (cansee(omx, omy) && flags.verbose) pline("%s picks up %s.", Monnam(mtmp), distant_name(obj, doname)); obj_extract_self(obj); newsym(omx,omy); (void) mpickobj(mtmp,obj); } else /* picking up a few objects from a pile... */ /* KMH -- fix picking up zero quantity */ if (dogquan > 0) { if (obj->oclass == COIN_CLASS) { /* KMH, balance patch -- 10*level */ #ifndef GOLDOBJ obj->quan -= dogquan; if (cansee(omx, omy) && flags.verbose) pline("%s picks up %d gold pieces.", Monnam(mtmp), dogquan); mtmp->mgold += dogquan; #else if (obj->quan != dogquan) obj = splitobj(obj, dogquan); if (cansee(omx, omy) && flags.verbose) pline("%s picks up %s.", Monnam(mtmp), doname(obj)); obj_extract_self(obj); newsym(omx,omy); (void) mpickobj(mtmp,obj); #endif } else { /* struct obj *floor_obj; int temp_quan; obj->quan -= dogquan; temp_quan = obj->quan; floor_obj = level.objects[omx][omy]; mpickobj(mtmp,obj); obj->quan = dogquan; if (cansee(omx, omy) && flags.verbose) pline("%s picks up %s.", Monnam(mtmp), distant_name(obj, doname)); floor_obj->quan = temp_quan;*/ } } if (attacktype(mtmp->data, AT_WEAP) && mtmp->weapon_check == NEED_WEAPON) { mtmp->weapon_check = NEED_HTH_WEAPON; (void) mon_wield_item(mtmp); } m_dowear(mtmp, FALSE); } } } } } return 0; } /* set dog's goal -- gtyp, gx, gy * returns -1/0/1 (dog's desire to approach player) or -2 (abort move) */ STATIC_OVL int dog_goal(mtmp, edog, after, udist, whappr) register struct monst *mtmp; struct edog *edog; int after, udist, whappr; { register int omx, omy; boolean in_masters_sight, dog_has_minvent; register struct obj *obj; xchar otyp; int appr; #ifdef STEED /* Steeds don't move on their own will */ if (mtmp == u.usteed) return (-2); #endif omx = mtmp->mx; omy = mtmp->my; in_masters_sight = couldsee(omx, omy); dog_has_minvent = (DROPPABLES(mtmp) != 0); if (!edog || mtmp->mleashed) { /* he's not going anywhere... */ gtyp = APPORT; gx = u.ux; gy = u.uy; } else { #define DDIST(x,y) (dist2(x,y,omx,omy)) #define SQSRCHRADIUS 5 int min_x, max_x, min_y, max_y; register int nx, ny; gtyp = UNDEF; /* no goal as yet */ gx = gy = 0; /* suppress 'used before set' message */ if ((min_x = omx - SQSRCHRADIUS) < 1) min_x = 1; if ((max_x = omx + SQSRCHRADIUS) >= COLNO) max_x = COLNO - 1; if ((min_y = omy - SQSRCHRADIUS) < 0) min_y = 0; if ((max_y = omy + SQSRCHRADIUS) >= ROWNO) max_y = ROWNO - 1; /* nearby food is the first choice, then other objects */ for (obj = fobj; obj; obj = obj->nobj) { nx = obj->ox; ny = obj->oy; if (nx >= min_x && nx <= max_x && ny >= min_y && ny <= max_y) { otyp = dogfood(mtmp, obj); /* skip inferior goals */ if (otyp > gtyp || otyp == UNDEF) continue; /* avoid cursed items unless starving */ if (cursed_object_at(mtmp, nx, ny) && !(edog->mhpmax_penalty && otyp < MANFOOD)) continue; /* skip completely unreacheable goals */ if (!could_reach_item(mtmp, nx, ny) || !can_reach_location(mtmp, mtmp->mx, mtmp->my, nx, ny)) continue; if (otyp < MANFOOD) { if (otyp < gtyp || DDIST(nx,ny) < DDIST(gx,gy)) { gx = nx; gy = ny; gtyp = otyp; } } else if(gtyp == UNDEF && in_masters_sight && !dog_has_minvent && (!levl[omx][omy].lit || levl[u.ux][u.uy].lit) && (otyp == MANFOOD || m_cansee(mtmp, nx, ny)) && edog->apport > rn2(8) && can_carry(mtmp,obj)) { gx = nx; gy = ny; gtyp = APPORT; } } } } /* follow player if appropriate */ if (gtyp == UNDEF || (gtyp != DOGFOOD && gtyp != APPORT && monstermoves < edog->hungrytime)) { gx = u.ux; gy = u.uy; if (after && udist <= 4 && gx == u.ux && gy == u.uy) return(-2); appr = (udist >= 9) ? 1 : (mtmp->mflee) ? -1 : 0; if (udist > 1) { if (!IS_ROOM(levl[u.ux][u.uy].typ) || !rn2(4) || whappr || (dog_has_minvent && rn2(edog->apport))) appr = 1; } /* if you have dog food it'll follow you more closely */ if (appr == 0) { obj = invent; while (obj) { if(dogfood(mtmp, obj) == DOGFOOD) { appr = 1; break; } obj = obj->nobj; } } } else appr = 1; /* gtyp != UNDEF */ if(mtmp->mconf) appr = 0; #define FARAWAY (COLNO + 2) /* position outside screen */ if (gx == u.ux && gy == u.uy && !in_masters_sight) { register coord *cp; cp = gettrack(omx,omy); if (cp) { gx = cp->x; gy = cp->y; if(edog) edog->ogoal.x = 0; } else { /* assume master hasn't moved far, and reuse previous goal */ if(edog && edog->ogoal.x && ((edog->ogoal.x != omx) || (edog->ogoal.y != omy))) { gx = edog->ogoal.x; gy = edog->ogoal.y; edog->ogoal.x = 0; } else { int fardist = FARAWAY * FARAWAY; gx = gy = FARAWAY; /* random */ do_clear_area(omx, omy, 9, wantdoor, (genericptr_t)&fardist); /* here gx == FARAWAY e.g. when dog is in a vault */ if (gx == FARAWAY || (gx == omx && gy == omy)) { gx = u.ux; gy = u.uy; } else if(edog) { edog->ogoal.x = gx; edog->ogoal.y = gy; } } } } else if(edog) { edog->ogoal.x = 0; } return appr; } #ifdef DEBUG #define CHECK_ALLOW(flag,str) if ((allowflags & (flag)) == (flag)) { \ allowflags ^= (flag); \ if (bp != buf) { *bp++=','; *bp++=' '; } \ Strcpy(bp, str); \ bp += strlen(bp); \ } else STATIC_OVL char * allow_set(allowflags) long allowflags; { static char buf[500]; char *bp = buf; if (allowflags == 0) return "(none)"; *bp = '\0'; CHECK_ALLOW(ALLOW_TRAPS, "can enter traps"); CHECK_ALLOW(ALLOW_U, "can attack you"); CHECK_ALLOW(ALLOW_M, "can attack other monsters"); CHECK_ALLOW(ALLOW_TM, "can attack tame monsters"); CHECK_ALLOW(NOTONL, "avoids direct line to player"); CHECK_ALLOW(OPENDOOR, "opens closed doors"); CHECK_ALLOW(UNLOCKDOOR, "unlocks locked doors"); CHECK_ALLOW(BUSTDOOR, "breaks any doors"); CHECK_ALLOW(ALLOW_ROCK, "pushes rocks"); CHECK_ALLOW(ALLOW_WALL, "walks thru walls"); CHECK_ALLOW(ALLOW_DIG, "digs"); CHECK_ALLOW(ALLOW_SANCT, "enters temples"); CHECK_ALLOW(ALLOW_SSM, "ignores scare monster"); CHECK_ALLOW(NOGARLIC, "hates garlic"); if (allowflags) { if (bp != buf) { *bp++=','; *bp++=' '; } sprintf(bp, "0x%lX", allowflags); } return buf; } #undef CHECK_ALLOW #endif boolean betrayed(mtmp) register struct monst *mtmp; { boolean has_edog = !mtmp->isminion; struct edog *edog = EDOG(mtmp); int udist = distu(mtmp->mx, mtmp->my); if (udist < 4 && has_edog && !mtmp->isspell && !rn2(3) && can_betray(mtmp->data) && !mindless(mtmp->data) && mtmp->mhp >= u.uhp /* Pet is buff enough */ && rn2(22) > mtmp->mtame /* Roll against tameness */ && rn2(edog->abuse + 2)) { /* Treason */ if (canseemon(mtmp)) pline("%s turns on you!", Monnam(mtmp)); else pline("You feel uneasy about %s.", y_monnam(mtmp)); mtmp->mpeaceful = 0; mtmp->mtame = 0; mtmp->mtraitor = TRUE; /* Do we need to call newsym() here? */ newsym(mtmp->mx, mtmp->my); return TRUE; } return FALSE; } /* return 0 (no move), 1 (move) or 2 (dead) */ int dog_move(mtmp, after) register struct monst *mtmp; register int after; /* this is extra fast monster movement */ { int omx, omy; /* original mtmp position */ int appr, whappr, udist; int i, j, k; register struct edog *edog = EDOG(mtmp); struct obj *obj = (struct obj *) 0; xchar otyp; boolean has_edog, cursemsg[9], is_spell, do_eat = FALSE; xchar nix, niy; /* position mtmp is (considering) moving to */ register int nx, ny; /* temporary coordinates */ xchar cnt, uncursedcnt, chcnt; int chi = -1, nidist, ndist; coord poss[9]; long info[9], allowflags; #define GDIST(x,y) (dist2(x,y,gx,gy)) /* * Tame Angels have isminion set and an ispriest structure instead of * an edog structure. Fortunately, guardian Angels need not worry * about mundane things like eating and fetching objects, and can * spend all their energy defending the player. (They are the only * monsters with other structures that can be tame.) */ has_edog = !mtmp->isminion; /* * Similar to Angels and Guardians are spell beings - temporary * magical manifestations of the spellcaster's mind. * They don't eat/pickup objects - only fight. * But, they aren't dismissed by conflict. */ is_spell = mtmp->isspell; omx = mtmp->mx; omy = mtmp->my; if (has_edog && !is_spell && dog_hunger(mtmp, edog)) return(2); /* starved */ udist = distu(omx,omy); #ifdef STEED /* Let steeds eat and maybe throw rider during Conflict */ if (mtmp == u.usteed) { if (Conflict && !resist(mtmp, RING_CLASS, 0, 0)) { dismount_steed(DISMOUNT_THROWN); return (1); } udist = 1; } else #endif /* maybe we tamed him while being swallowed --jgm */ if (!udist) return(0); /* Intelligent pets may rebel (apart from minions, spell beings) */ if (!rn2(850) && betrayed(mtmp)) return 1; nix = omx; /* set before newdogpos */ niy = omy; cursemsg[0] = FALSE; /* lint suppression */ info[0] = 0; /* ditto */ if (has_edog && !is_spell) { j = dog_invent(mtmp, edog, udist); if (j == 2) return 2; /* died */ else if (j == 1) goto newdogpos; /* eating something */ whappr = (monstermoves - edog->whistletime < 5); } else whappr = 0; appr = dog_goal(mtmp, (has_edog && !is_spell) ? edog : (struct edog *)0, after, udist, whappr); #ifdef DEBUG { char *goal; switch(gtyp) { case DOGFOOD: goal = "dogfood"; break; case CADAVER: goal = "cadaver"; break; case ACCFOOD: goal = "accfood"; break; case MANFOOD: goal = "manfood"; break; case APPORT: goal = "apport"; break; case POISON: goal = "poison"; break; case UNDEF: goal = "undef"; break; case TABU: goal = "tabu"; break; default: goal = "???"; break; } debugpline("G(%s): %s @ (%d,%d), appr = %d", mon_nam(mtmp), goal, gx, gy, appr); } #endif if (appr == -2) return(0); allowflags = ALLOW_M | ALLOW_TRAPS | ALLOW_SSM | ALLOW_SANCT; if (passes_walls(mtmp->data)) allowflags |= (ALLOW_ROCK | ALLOW_WALL); if (passes_bars(mtmp->data) && !In_sokoban(&u.uz)) allowflags |= ALLOW_BARS; if (throws_rocks(mtmp->data)) allowflags |= ALLOW_ROCK; if (Conflict && !resist(mtmp, RING_CLASS, 0, 0) && In_endgame(&u.uz)) { allowflags |= ALLOW_U; if (!has_edog && !is_spell) { coord mm; /* Guardian angel refuses to be conflicted; rather, * it disappears, angrily, and sends in some nasties */ if (canspotmon(mtmp)) { pline("%s rebukes you, saying:", Monnam(mtmp)); verbalize("Since you desire conflict, have some more!"); } mongone(mtmp); i = rnd(4); while(i--) { mm.x = u.ux; mm.y = u.uy; if(enexto(&mm, mm.x, mm.y, &mons[PM_ANGEL])) (void) mk_roamer(&mons[PM_ANGEL], u.ualign.type, mm.x, mm.y, FALSE); } return(2); } } /* ALI -- Mindless pets shouldn't attack monsters when * scared; they have no sense of allegiance to the hero, * only self-preservation. This prevents weak pets blocking * your exit from a shop by constantly missing shopkeeper. */ if (mindless(mtmp->data) && mtmp->mflee) allowflags &= ~ALLOW_M; 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; } if (is_giant(mtmp->data)) allowflags |= BUSTDOOR; if (tunnels(mtmp->data)) allowflags |= ALLOW_DIG; cnt = mfndpos(mtmp, poss, info, allowflags); #ifdef DEBUG debugpline("%d positions found with allow: %s", cnt, allow_set(allowflags)); for (i = 0; i < cnt; i++) { debugpline("[%d] %s @ (%d, %d)", i, allow_set(info[i]), poss[i].x, poss[i].y); } #endif /* Normally dogs don't step on cursed items, but if they have no * other choice they will. This requires checking ahead of time * to see how many uncursed item squares are around. */ uncursedcnt = 0; for (i = 0; i < cnt; i++) { nx = poss[i].x; ny = poss[i].y; if (MON_AT(nx,ny) && !(info[i] & ALLOW_M)) continue; if (cursed_object_at(mtmp, nx, ny)) continue; uncursedcnt++; } chcnt = 0; chi = -1; nidist = GDIST(nix,niy); for (i = 0; i < cnt; i++) { nx = poss[i].x; ny = poss[i].y; cursemsg[i] = FALSE; /* if leashed, we drag him along. */ if (mtmp->mleashed && distu(nx, ny) > 4) continue; /* if a guardian, try to stay close by choice */ if ((!has_edog || is_spell) && (j = distu(nx, ny)) > 16 && j >= udist) continue; if ((info[i] & ALLOW_M) && MON_AT(nx, ny)) { int mstatus; register struct monst *mtmp2 = m_at(nx,ny); aligntyp align1, align2; /* For priests, minions etc. */ if (mtmp->isminion) align1 = EMIN(mtmp)->min_align; else if (is_unicorn(mtmp->data)) align1 = sgn(mtmp->data->maligntyp); else if (mtmp->ispriest) align1 = EPRI(mtmp)->shralign; else align1 = A_NONE; if (mtmp2->isminion) align2 = EMIN(mtmp2)->min_align; else if (is_unicorn(mtmp2->data)) align2 = sgn(mtmp2->data->maligntyp); else if (mtmp2->ispriest) align2 = EPRI(mtmp2)->shralign; else align2 = A_NONE; /* Mindless monsters and spelled monsters have no fear of * attacking higher level monsters */ if (((int)mtmp2->m_lev >= (int)mtmp->m_lev+2 && !is_spell && !mindless(mtmp->data)) || (mtmp2->data == &mons[PM_FLOATING_EYE] && rn2(10) && mtmp->mcansee && haseyes(mtmp->data) && mtmp2->mcansee && (perceives(mtmp->data) || !mtmp2->minvis)) || (mtmp2->data==&mons[PM_GELATINOUS_CUBE] && rn2(10)) || (mtmp2->data==&mons[PM_GAS_SPORE] && rn2(16)) || (!attacktype(mtmp->data, AT_EXPL) && max_passive_dmg(mtmp2, mtmp) >= mtmp->mhp) || /* Minions/Angels don't attack * coaligned minions/priests/angels/unicorns. */ (align1 == align2 && align1 != A_NONE) || ((mtmp->mhp*4 < mtmp->mhpmax || mtmp2->data->msound == MS_GUARDIAN || mtmp2->data->msound == MS_LEADER) && mtmp2->mpeaceful && !Conflict) || (touch_petrifies(mtmp2->data) && !resists_ston(mtmp))) continue; if (after) return(0); /* hit only once each move */ notonhead = 0; mstatus = mattackm(mtmp, mtmp2); /* aggressor (pet) died */ if (mstatus & MM_AGR_DIED) return 2; if ((mstatus & MM_HIT) && !(mstatus & MM_DEF_DIED) && rn2(4) && mtmp2->mlstmv != monstermoves && !onscary(mtmp->mx, mtmp->my, mtmp2) && /* monnear check needed: long worms hit on tail */ monnear(mtmp2, mtmp->mx, mtmp->my)) { mstatus = mattackm(mtmp2, mtmp); /* return attack */ if (mstatus & MM_DEF_DIED) return 2; } return 0; } { /* Dog avoids harmful traps, but perhaps it has to pass one * in order to follow player. (Non-harmful traps do not * have ALLOW_TRAPS in info[].) The dog only avoids the * trap if you've seen it, unlike enemies who avoid traps * if they've seen some trap of that type sometime in the * past. (Neither behavior is really realistic.) */ struct trap *trap; if ((info[i] & ALLOW_TRAPS) && (trap = t_at(nx,ny))) { if (mtmp->mleashed) { if (flags.soundok) whimper(mtmp); } else /* 1/40 chance of stepping on it anyway, in case * it has to pass one to follow the player... */ if (trap->tseen && rn2(40)) continue; } } /* dog eschews cursed objects, but likes dog food */ /* [Tom] except demons & undead, who don't care */ /* (minion isn't interested; `cursemsg' stays FALSE) */ if (has_edog && !is_spell) { for (obj = level.objects[nx][ny]; obj; obj = obj->nexthere) { if ((obj->cursed) && has_edog && !is_demon(mtmp->data) && !is_undead(mtmp->data)) cursemsg[i] = TRUE; if (obj->blessed && has_edog && (is_demon(mtmp->data) || is_undead(mtmp->data))) cursemsg[i] = TRUE; else if ((otyp = dogfood(mtmp, obj)) < MANFOOD && (otyp < ACCFOOD || edog->hungrytime <= monstermoves)) { /* Note: our dog likes the food so much that he * might eat it even when it conceals a cursed object */ nix = nx; niy = ny; chi = i; do_eat = TRUE; cursemsg[i] = FALSE; /* not reluctant */ goto newdogpos; } } } /* didn't find something to eat; if we saw a cursed item and aren't being forced to walk on it, usually keep looking */ if (cursemsg[i] && !mtmp->mleashed && uncursedcnt > 0 && rn2(13 * uncursedcnt)) continue; /* lessen the chance of backtracking to previous position(s) */ k = (has_edog && !is_spell) ? uncursedcnt : cnt; for (j = 0; j < MTSZ && j < k - 1; j++) if (nx == mtmp->mtrack[j].x && ny == mtmp->mtrack[j].y) if (rn2(MTSZ * (k - j))) goto nxti; j = ((ndist = GDIST(nx,ny)) - nidist) * appr; if ((j == 0 && !rn2(++chcnt)) || j < 0 || (j > 0 && !whappr && ((omx == nix && omy == niy && !rn2(3)) || !rn2(12)) )) { nix = nx; niy = ny; nidist = ndist; if(j < 0) chcnt = 0; chi = i; } nxti: ; } newdogpos: if (nix != omx || niy != omy) { struct obj *mw_tmp; 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); } if (!m_in_out_region(mtmp, nix, niy)) return 1; if (((IS_ROCK(levl[nix][niy].typ) && may_dig(nix,niy)) || closed_door(nix, niy)) && mtmp->weapon_check != NO_WEAPON_WANTED && tunnels(mtmp->data) && needspick(mtmp->data)) { if (closed_door(nix, niy)) { if (!(mw_tmp = MON_WEP(mtmp)) || !is_pick(mw_tmp) || !is_axe(mw_tmp)) mtmp->weapon_check = NEED_PICK_OR_AXE; } else if (IS_TREE(levl[nix][niy].typ)) { if (!(mw_tmp = MON_WEP(mtmp)) || !is_axe(mw_tmp)) mtmp->weapon_check = NEED_AXE; } else if (!(mw_tmp = MON_WEP(mtmp)) || !is_pick(mw_tmp)) { mtmp->weapon_check = NEED_PICK_AXE; } if (mtmp->weapon_check >= NEED_PICK_AXE && mon_wield_item(mtmp)) return 0; } /* insert a worm_move() if worms ever begin to eat things */ remove_monster(omx, omy); place_monster(mtmp, nix, niy); if (has_edog && !is_spell && cursemsg[chi] && (cansee(omx,omy) || cansee(nix,niy))) pline("%s moves only reluctantly.", Monnam(mtmp)); for (j=MTSZ-1; j>0; j--) mtmp->mtrack[j] = mtmp->mtrack[j-1]; mtmp->mtrack[0].x = omx; mtmp->mtrack[0].y = omy; /* We have to know if the pet's gonna do a combined eat and * move before moving it, but it can't eat until after being * moved. Thus the do_eat flag. */ if (do_eat) { if (dog_eat(mtmp, obj, omx, omy, FALSE) == 2) return 2; } } else if (mtmp->mleashed && distu(omx, omy) > 4) { /* an incredible kludge, but the only way to keep pooch near * after it spends time eating or in a trap, etc. */ coord cc; nx = sgn(omx - u.ux); ny = sgn(omy - u.uy); cc.x = u.ux + nx; cc.y = u.uy + ny; if (goodpos(cc.x, cc.y, mtmp, 0)) goto dognext; i = xytod(nx, ny); for (j = (i + 7)%8; j < (i + 1)%8; j++) { dtoxy(&cc, j); if (goodpos(cc.x, cc.y, mtmp, 0)) goto dognext; } for (j = (i + 6)%8; j < (i + 2)%8; j++) { dtoxy(&cc, j); if (goodpos(cc.x, cc.y, mtmp, 0)) goto dognext; } cc.x = mtmp->mx; cc.y = mtmp->my; dognext: if (!m_in_out_region(mtmp, nix, niy)) return 1; remove_monster(mtmp->mx, mtmp->my); place_monster(mtmp, cc.x, cc.y); newsym(cc.x,cc.y); set_apparxy(mtmp); } return(1); } /* check if a monster could pick up objects from a location */ STATIC_OVL boolean could_reach_item(mon, nx, ny) struct monst *mon; xchar nx, ny; { if ((!is_pool(nx,ny) || is_swimmer(mon->data)) && (!is_lava(nx,ny) || likes_lava(mon->data)) && (!sobj_at(BOULDER,nx,ny) || throws_rocks(mon->data))) return TRUE; return FALSE; } /* Hack to prevent a dog from being endlessly stuck near an object that * it can't reach, such as caught in a teleport scroll niche. It recursively * checks to see if the squares in between 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_location(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 (!could_reach_item(mon, i, j)) continue; if (can_reach_location(mon, i, j, fx, fy)) return TRUE; } } return FALSE; } #endif /* OVL0 */ #ifdef OVLB /*ARGSUSED*/ /* do_clear_area client */ STATIC_PTR void wantdoor(x, y, distance) int x, y; genericptr_t distance; { int ndist; if (*(int*)distance > (ndist = distu(x, y))) { gx = x; gy = y; *(int*)distance = ndist; } } #endif /* OVLB */ /*dogmove.c*/ slashem-0.0.7E7F3/src/objects.c0000664000076400007640000017530710545462317014255 0ustar aliali/* SCCS Id: @(#)objects.c 3.4 2002/07/31 */ /* Copyright (c) Mike Threepoint, 1989. */ /* NetHack may be freely redistributed. See license for details. */ #ifndef OBJECTS_PASS_2_ /* first pass */ struct monst { struct monst *dummy; }; /* lint: struct obj's union */ #include "config.h" #include "obj.h" #include "objclass.h" #include "prop.h" #include "skills.h" #include "skills.h" #else /* !OBJECTS_PASS_2_ */ /* second pass */ #include "color.h" # define COLOR_FIELD(X) X, #endif /* !OBJECTS_PASS_2_ */ /* objects have symbols: ) [ = " ( % ! ? + / $ * ` 0 _ . */ /* * Note: OBJ() and BITS() macros are used to avoid exceeding argument * limits imposed by some compilers. The ctnr field of BITS currently * does not map into struct objclass, and is ignored in the expansion. * The 0 in the expansion corresponds to oc_pre_discovered, which is * set at run-time during role-specific character initialization. */ #ifndef OBJECTS_PASS_2_ /* first pass -- object descriptive text */ # define OBJ(name,desc) name,desc # define OBJECT(obj,bits,prp,sym,prob,dly,wt,cost,sdam,ldam,oc1,oc2,nut,color) \ {obj} NEARDATA struct objdescr obj_descr[] = { #else /* second pass -- object definitions */ # define BITS(nmkn,mrg,uskn,ctnr,mgc,chrg,uniq,nwsh,big,tuf,dir,sub,mtrl) \ nmkn,mrg,uskn,0,mgc,chrg,uniq,nwsh,big,tuf,dir,mtrl,sub /* SCO ODT 1.1 cpp fodder */ # define OBJECT(obj,bits,prp,sym,prob,dly,wt,cost,sdam,ldam,oc1,oc2,nut,color) \ {0, 0, (char *)0, bits, prp, sym, dly, COLOR_FIELD(color) \ prob, wt, cost, sdam, ldam, oc1, oc2, nut} # ifndef lint # define HARDGEM(n) (n >= 8) # else # define HARDGEM(n) (0) # endif NEARDATA struct objclass objects[] = { #endif /* dummy object[0] -- description [2nd arg] *must* be NULL */ OBJECT(OBJ("strange object",(char *)0), BITS(1,0,0,0,0,0,0,0,0,0,0,0,0), 0, ILLOBJ_CLASS, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), /* weapons ... */ #define WEAPON(name,app,kn,mg,bi,prob,wt,cost,sdam,ldam,hitbon,typ,sub,metal,color) \ OBJECT( \ OBJ(name,app), BITS(kn,mg,1,0,0,1,0,0,bi,0,typ,sub,metal), 0, \ WEAPON_CLASS, prob, 0, \ wt, cost, sdam, ldam, hitbon, 0, wt, color ) #define PROJECTILE(name,app,kn,prob,wt,cost,sdam,ldam,hitbon,metal,sub,color) \ OBJECT( \ OBJ(name,app), BITS(kn,1,1,0,0,1,0,0,0,0,PIERCE,sub,metal), 0, \ WEAPON_CLASS, prob, 0, \ wt, cost, sdam, ldam, hitbon, WP_GENERIC, wt, color ) #define BOW(name,app,kn,bi,prob,wt,cost,hitbon,metal,sub,color) \ OBJECT( \ OBJ(name,app), BITS(kn,0,1,0,0,1,0,0,bi,0,0,sub,metal), 0, \ WEAPON_CLASS, prob, 0, \ wt, cost, 0, 0, hitbon, WP_GENERIC, wt, color ) #define BULLET(name,app,kn,prob,wt,cost,sdam,ldam,hitbon,ammotyp,typ,metal,sub,color) \ OBJECT( \ OBJ(name,app), BITS(kn,1,1,0,0,1,0,0,0,0,typ,sub,metal), 0, \ WEAPON_CLASS, prob, 0, \ wt, cost, sdam, ldam, hitbon, ammotyp, wt, color ) #define GUN(name,app,kn,bi,prob,wt,cost,range,rof,hitbon,ammotyp,metal,sub,color) \ OBJECT( \ OBJ(name,app), BITS(kn,0,1,0,0,1,0,0,bi,0,0,sub,metal), 0, \ WEAPON_CLASS, prob, 0, \ wt, cost, range, rof, hitbon, ammotyp, wt, color ) /* Note: for weapons that don't do an even die of damage (ex. 2-7 or 3-18) * the extra damage is added on in weapon.c, not here! */ #define P PIERCE #define S SLASH #define B WHACK #define E EXPLOSION /* Daggers */ WEAPON("orcish dagger", "crude dagger", 0, 1, 0, 10, 10, 4, 3, 3, 2, P, P_DAGGER, IRON, CLR_BLACK), WEAPON("dagger", (char *)0, 1, 1, 0, 25, 10, 4, 4, 3, 2, P, P_DAGGER, IRON, HI_METAL), WEAPON("athame", (char *)0, 1, 1, 0, 0, 10, 4, 4, 3, 2, S, P_DAGGER, IRON, HI_METAL), WEAPON("silver dagger", (char *)0, 1, 1, 0, 2, 12, 40, 4, 3, 2, P, P_DAGGER, SILVER, HI_SILVER), /* STEPHEN WHITE'S NEW CODE */ /* WAC silver dagger now pierces, to be same as other daggers allows it to be thrown without penalty as well*/ WEAPON("elven dagger", "runed dagger", 0, 1, 0, 8, 10, 4, 5, 3, 2, P, P_DAGGER, WOOD, HI_METAL), WEAPON("dark elven dagger", "black runed dagger", 0, 1, 0, 0, 10, 4, 5, 3, 2, P, P_DAGGER, WOOD, CLR_BLACK), WEAPON("wooden stake", (char *)0, 1, 0, 0, 0, 20, 50, 6, 6, 0, P, P_DAGGER, WOOD, HI_WOOD), /* STEPHEN WHITE'S NEW CODE */ /* Base for artifact (Stake of Van Helsing) */ WEAPON("great dagger", (char *)0, 1, 0, 0, 0, 20,500, 6, 7, 2, P, P_DAGGER, METAL, CLR_BLACK), /* STEPHEN WHITE'S NEW CODE */ /* for necromancer artifact... */ /* Knives */ WEAPON("worm tooth", (char *)0, 1, 0, 0, 0, 20, 2, 2, 2, 0, 0, P_KNIFE, 0, CLR_WHITE), WEAPON("knife", (char *)0, 1, 1, 0, 15, 5, 4, 3, 2, 0, P|S, P_KNIFE, IRON, HI_METAL), WEAPON("stiletto", (char *)0, 1, 1, 0, 5, 5, 4, 3, 2, 0, P|S, P_KNIFE, IRON, HI_METAL), WEAPON("scalpel", (char *)0, 1, 1, 0, 0, 5, 4, 3, 3, 2, S, P_KNIFE, METAL, HI_METAL), WEAPON("crysknife", (char *)0, 1, 0, 0, 0, 20,100, 20, 30, 3, P, P_KNIFE, MINERAL, CLR_WHITE), /* [Tom] increased crysknife damage from d10/d10 */ /* to d20/d30 (otherwise, it's useless to make them...) */ /* Axes */ WEAPON("axe", (char *)0, 1, 0, 0, 35, 60, 8, 6, 4, 0, S, P_AXE, IRON, HI_METAL), WEAPON("battle-axe", "double-headed axe", /* "double-bitted" ? */ 0, 0, 1, 10,120, 40, 8, 6, 0, S, P_AXE, IRON, HI_METAL), /* Pick-axes */ /* (also weptool pick-axe) */ WEAPON("dwarvish mattock", "broad pick", 0, 0, 1, 13,120, 50, 12, 8,-1, B, P_PICK_AXE, IRON, HI_METAL), /* Short swords */ WEAPON("orcish short sword", "crude short sword", 0, 0, 0, 3, 30, 10, 5, 8, 0, P, P_SHORT_SWORD, IRON, CLR_BLACK), WEAPON("short sword", (char *)0, 1, 0, 0, 8, 30, 10, 6, 8, 0, P, P_SHORT_SWORD, IRON, HI_METAL), WEAPON("silver short sword", (char *)0, 1, 0, 0, 2, 36, 50, 6, 8, 0, P, P_SHORT_SWORD, SILVER, HI_SILVER), /* STEPHEN WHITE'S NEW CODE */ WEAPON("dwarvish short sword", "broad short sword", 0, 0, 0, 2, 30, 10, 7, 8, 0, P, P_SHORT_SWORD, IRON, HI_METAL), WEAPON("elven short sword", "runed short sword", 0, 0, 0, 2, 30, 10, 8, 8, 0, P, P_SHORT_SWORD, WOOD, HI_METAL), WEAPON("dark elven short sword", "black runed short sword", 0, 0, 0, 2, 30, 10, 8, 8, 0, P, P_SHORT_SWORD, WOOD, CLR_BLACK), /* Broadswords */ WEAPON("broadsword", (char *)0, 1, 0, 0, 20, 70, 10, 4, 6, 0, S, P_BROAD_SWORD, IRON, HI_METAL), /* +d4 small, +1 large */ WEAPON("runesword", "runed broadsword", 0, 0, 0, 0, 40,300, 4, 6, 0, S, P_BROAD_SWORD, IRON, CLR_BLACK), /* +d4 small, +1 large; base for artifact (Stormbringer) */ /* +5d2 +d8 from level drain */ WEAPON("elven broadsword", "runed broadsword", 0, 0, 0, 4, 70, 10, 6, 6, 0, S, P_BROAD_SWORD, WOOD, HI_METAL), /* +d4 small, +1 large */ /* Long swords */ WEAPON("long sword", (char *)0, 1, 0, 0, 50, 40, 15, 8, 12, 0, S, P_LONG_SWORD, IRON, HI_METAL), WEAPON("silver long sword", (char *)0, 1, 0, 0, 2, 48, 75, 8, 12, 0, S, P_LONG_SWORD,SILVER, HI_SILVER), /* STEPHEN WHITE'S NEW CODE */ WEAPON("katana", "samurai sword", 0, 0, 0, 4, 40, 80, 10, 12, 1, S, P_LONG_SWORD, IRON, HI_METAL), /* Two-handed swords */ WEAPON("two-handed sword", (char *)0, 1, 0, 1, 25,150, 50, 12, 6, 0, S, P_TWO_HANDED_SWORD, IRON, HI_METAL), /* +2d6 large */ WEAPON("tsurugi", "long samurai sword", 0, 0, 1, 0, 60,500, 16, 8, 2, S, P_TWO_HANDED_SWORD, METAL, HI_METAL), /* +2d6 large; base for artifact (T of Muramasa) */ /* Scimitars */ WEAPON("scimitar", "curved sword", 0, 0, 0, 15, 40, 15, 8, 8, 0, S, P_SCIMITAR, IRON, HI_METAL), /* Sabers */ WEAPON("rapier", (char *)0, 1, 0, 0, 0, 30, 40, 6, 8, 0, P, P_SABER, METAL, CLR_BLACK), /* STEPHEN WHITE'S NEW CODE */ /* Base for artifact (Scalpel) */ WEAPON("silver saber", (char *)0, 1, 0, 0, 27, 40, 75, 8, 8, 0, S, P_SABER, SILVER, HI_SILVER), /* Clubs */ WEAPON("club", (char *)0, 1, 0, 0, 22, 30, 3, 6, 3, 0, B, P_CLUB, WOOD, HI_WOOD), WEAPON("aklys", "thonged club", 0, 0, 0, 16, 15, 4, 6, 3, 0, B, P_CLUB, IRON, HI_METAL), WEAPON("baseball bat", (char *)0, 1, 0, 0, 0, 40, 50, 8, 6, 0, B, P_CLUB, WOOD, HI_WOOD), /* STEPHEN WHITE'S NEW CODE */ /* Base for artifact */ /* Paddles */ /* Good to-hit and small damage, but low large damage */ WEAPON("fly swatter", (char *)0, 1, 0, 0, 2, 10, 3, 10, 2, 2, B, P_PADDLE, PLASTIC, CLR_GREEN), /* Maces */ WEAPON("silver mace", (char *)0, 1, 0, 0, 12, 36, 65, 6, 6, 0, B, P_MACE, SILVER, HI_SILVER), /* STEPHEN WHITE'S NEW CODE */ WEAPON("mace", (char *)0, 1, 0, 0, 40, 30, 5, 6, 6, 0, B, P_MACE, IRON, HI_METAL), /* +1 small */ /* Morning stars */ WEAPON("morning star", (char *)0, 1, 0, 0, 12,120, 10, 4, 6, 0, B, P_MORNING_STAR, IRON, HI_METAL), /* +d4 small, +1 large */ /* Flails */ WEAPON("flail", (char *)0, 1, 0, 0, 30, 15, 4, 6, 4, 0, B, P_FLAIL, IRON, HI_METAL), /* +1 small, +1d4 large */ /* Hammers */ WEAPON("war hammer", (char *)0, 1, 0, 0, 25, 50, 5, 4, 4, 0, B, P_HAMMER, IRON, HI_METAL), /* +1 small */ WEAPON("heavy hammer", (char *)0, 1, 0, 0, 0, 60,500, 6, 6, 0, B, P_HAMMER, METAL, HI_METAL), /* STEPHEN WHITE'S NEW CODE */ /* Base for artifact */ /* Quarterstaves */ WEAPON("quarterstaff", "staff", 0, 0, 1, 11, 40, 5, 6, 6, 0, B, P_QUARTERSTAFF, WOOD, HI_WOOD), /* Polearms */ /* (also weptool fishing pole) */ /* spear-type */ WEAPON("partisan", "vulgar polearm", 0, 0, 1, 3, 80, 10, 6, 6, 0, P, P_POLEARMS, IRON, HI_METAL), /* +1 large */ WEAPON("glaive", "single-edged polearm", 0, 0, 1, 4, 75, 6, 6, 10, 0, S, P_POLEARMS, IRON, HI_METAL), WEAPON("spetum", "forked polearm", 0, 0, 1, 3, 50, 5, 6, 6, 0, P, P_POLEARMS, IRON, HI_METAL), /* +1 small, +d6 large */ WEAPON("ranseur", "hilted polearm", 0, 0, 1, 3, 50, 6, 4, 4, 0, P, P_POLEARMS, IRON, HI_METAL), /* +d4 both */ /* axe-type */ WEAPON("bardiche", "long poleaxe", 0, 0, 1, 2,120, 7, 4, 4, 0, S, P_POLEARMS, IRON, HI_METAL), /* +1d4 small, +2d4 large */ WEAPON("voulge", "pole cleaver", 0, 0, 1, 2,125, 5, 4, 4, 0, S, P_POLEARMS, IRON, HI_METAL), /* +d4 both */ WEAPON("halberd", "angled poleaxe", 0, 0, 1, 4,150, 10, 10, 6, 0, P|S, P_POLEARMS, IRON, HI_METAL), /* +1d6 large */ /* curved/hooked */ WEAPON("fauchard", "pole sickle", 0, 0, 1, 3, 60, 5, 6, 8, 0, P|S, P_POLEARMS, IRON, HI_METAL), WEAPON("guisarme", "pruning hook", 0, 0, 1, 3, 80, 5, 4, 8, 0, S, P_POLEARMS, IRON, HI_METAL), /* +1d4 small */ WEAPON("bill-guisarme", "hooked polearm", 0, 0, 1, 2,120, 7, 4, 10, 0, P|S, P_POLEARMS, IRON, HI_METAL), /* +1d4 small */ /* other */ WEAPON("lucern hammer", "pronged polearm", 0, 0, 1, 3,150, 7, 4, 6, 0, B|P, P_POLEARMS, IRON, HI_METAL), /* +1d4 small */ WEAPON("bec de corbin", "beaked polearm", 0, 0, 1, 2,100, 8, 8, 6, 0, B|P, P_POLEARMS, IRON, HI_METAL), /* Spears */ WEAPON("orcish spear", "crude spear", 0, 1, 0, 13, 30, 3, 5, 8, 0, P, P_SPEAR, IRON, CLR_BLACK), WEAPON("spear", (char *)0, 1, 1, 0, 50, 30, 3, 6, 8, 0, P, P_SPEAR, IRON, HI_METAL), WEAPON("silver spear", (char *)0, 1, 1, 0, 3, 36, 40, 6, 8, 0, P, P_SPEAR, SILVER, HI_SILVER), /* STEPHEN WHITE'S NEW CODE */ WEAPON("elven spear", "runed spear", 0, 1, 0, 10, 30, 3, 7, 8, 0, P, P_SPEAR, WOOD, HI_METAL), WEAPON("dwarvish spear", "stout spear", 0, 1, 0, 12, 35, 3, 8, 8, 0, P, P_SPEAR, IRON, HI_METAL), /* Javelins */ WEAPON("javelin", "throwing spear", 0, 1, 0, 10, 20, 3, 6, 6, 0, P, P_JAVELIN, IRON, HI_METAL), /* Tridents */ WEAPON("trident", (char *)0, 1, 0, 0, 8, 25, 5, 6, 4, 0, P, P_TRIDENT, IRON, HI_METAL), /* +1 small, +2d4 large */ /* Lances */ WEAPON("lance", (char *)0, 1, 0, 0, 1,180, 10, 6, 8, 0, P, P_LANCE, IRON, HI_METAL), /* Bows (and arrows) */ /* KMH, balance patch -- damage of launchers restored to d2 big and small */ BOW("orcish bow", "crude bow", 0, 1, 12, 30, 60, 0, WOOD, P_BOW, CLR_BLACK), BOW("bow", (char *)0, 1, 1, 24, 30, 60, 0, WOOD, P_BOW, HI_WOOD), BOW("elven bow", "runed bow", 0, 1, 12, 30, 60, 0, WOOD, P_BOW, HI_WOOD), BOW("dark elven bow", "black runed bow", 0, 1, 0, 30, 60, 0, WOOD, P_BOW, CLR_BLACK), BOW("yumi", "long bow", 0, 1, 0, 30, 60, 0, WOOD, P_BOW, HI_WOOD), PROJECTILE("orcish arrow", "crude arrow", 0, 15, 1, 2, 5, 6, 0, IRON, -P_BOW, CLR_BLACK), PROJECTILE("arrow", (char *)0, 1, 50, 1, 2, 6, 6, 0, IRON, -P_BOW, HI_METAL), PROJECTILE("silver arrow", (char *)0, 1, 15, 1, 5, 6, 6, 0, SILVER, -P_BOW, HI_SILVER), PROJECTILE("elven arrow", "runed arrow", 0, 25, 1, 2, 7, 6, 0, WOOD, -P_BOW, HI_METAL), PROJECTILE("dark elven arrow", "black runed arrow", 0, 0, 1, 2, 7, 6, 0, WOOD, -P_BOW, CLR_BLACK), PROJECTILE("ya", "bamboo arrow", 0, 10, 1, 4, 7, 7, 1, METAL, -P_BOW, HI_METAL), /* Slings */ BOW("sling", (char *)0, 1, 0, 40, 3, 20, 0, WOOD, P_SLING, HI_LEATHER), /* Firearms */ #ifdef FIREARMS GUN("pistol", (char *)0, 1, 0, 0, 20, 100, 15, 0, 0, WP_BULLET, IRON, P_FIREARM, HI_METAL), GUN("submachine gun", (char *)0, 1, 0, 0, 25, 250, 10, 3, -1, WP_BULLET, IRON, P_FIREARM, HI_METAL), GUN("heavy machine gun", (char *)0,1, 1, 0, 500, 2000, 20, 8, -4, WP_BULLET, IRON, P_FIREARM, HI_METAL), GUN("rifle", (char *)0, 1, 1, 0, 30, 150, 22, -1, 1, WP_BULLET, IRON, P_FIREARM, HI_METAL), GUN("assault rifle", (char *)0, 1, 0, 0, 40, 1000, 20, 5, -2, WP_BULLET, IRON, P_FIREARM, HI_METAL), GUN("sniper rifle", (char *)0, 1, 1, 0, 50, 4000, 25, -3, 4, WP_BULLET, IRON, P_FIREARM, HI_METAL), GUN("shotgun", (char *)0, 1, 0, 0, 35, 200, 3, -1, 3, WP_SHELL, IRON, P_FIREARM, HI_METAL), GUN("auto shotgun", (char *)0, 1, 1, 0, 60, 1500, 3, 2, 0, WP_SHELL, IRON, P_FIREARM, HI_METAL), GUN("rocket launcher", (char *)0, 1, 1, 0, 750, 3500, 20, -5, -4, WP_ROCKET, IRON, P_FIREARM, HI_METAL), GUN("grenade launcher", (char *)0, 1, 1, 0, 55, 1500, 6, -3, -3,WP_GRENADE, IRON, P_FIREARM, HI_METAL), BULLET("bullet", (char *)0, 1, 0, 1, 5, 20, 30, 0, WP_BULLET, P, IRON, -P_FIREARM, HI_METAL), BULLET("silver bullet", (char *)0, 1, 0, 1, 15, 20, 30, 0, WP_BULLET, P, SILVER, -P_FIREARM, HI_SILVER), BULLET("shotgun shell", (char *)0, 1, 0, 1, 10, 30, 45, 0, WP_SHELL, P, IRON, -P_FIREARM, CLR_RED), BULLET("rocket", (char *)0, 1, 0, 200, 450, 45, 60, 0, WP_ROCKET, P|E, IRON, -P_FIREARM, CLR_BLUE), BULLET("frag grenade", (char *)0, 1, 0, 25, 350, 0, 0, 0, WP_GRENADE, B|E, IRON, -P_FIREARM, CLR_GREEN), BULLET("gas grenade", (char *)0, 1, 0, 25, 350, 0, 0, 0, WP_GRENADE, B|E, IRON, -P_FIREARM, CLR_ORANGE), BULLET("stick of dynamite", "red stick", 0, 0, 30, 150, 0, 0, 0, WP_GENERIC, B, PLASTIC, P_NONE, CLR_RED), #endif /* Crossbows (and bolts) */ /* Crossbow range is now independant of strength */ GUN("crossbow", (char *)0, 0, 1, 45, 50, 40, 12, -1, 0, WP_GENERIC, WOOD, P_CROSSBOW, HI_WOOD), PROJECTILE("crossbow bolt", (char *)0, 1, 45, 1, 2, 4, 6, 0, IRON, -P_CROSSBOW, HI_METAL), /* Darts */ /* (also weptoool spoon) */ WEAPON("dart", (char *)0, 1, 1, 0, 55, 1, 2, 3, 2, 0, P, -P_DART, IRON, HI_METAL), /* Shurikens */ WEAPON("shuriken", "throwing star", 0, 1, 0, 35, 1, 5, 8, 6, 2, P, -P_SHURIKEN, IRON, HI_METAL), /* Boomerangs */ WEAPON("boomerang", (char *)0, 1, 1, 0, 15, 5, 20, 9, 9, 0, 0, -P_BOOMERANG, WOOD, HI_WOOD), /* Whips */ WEAPON("bullwhip", (char *)0, 1, 0, 0, 2, 20, 4, 2, 1, 0, 0, P_WHIP, LEATHER, CLR_BROWN), #ifdef KOPS WEAPON("rubber hose", (char *)0, 1, 0, 0, 0, 20, 3, 4, 3, 0, B, P_WHIP, PLASTIC, CLR_BROWN), #endif /* With shuffled appearances... */ #undef P #undef S #undef B #undef E #undef WEAPON #undef PROJECTILE #undef BOW #undef BULLET #undef GUN /* armor ... */ /* IRON denotes ferrous metals, including steel. * Only IRON weapons and armor can rust. * Only COPPER (including brass) corrodes. * Some creatures are vulnerable to SILVER. */ #define ARMOR(name,desc,kn,mgc,blk,power,prob,delay,wt,cost,ac,can,sub,metal,c) \ OBJECT( \ OBJ(name,desc), BITS(kn,0,1,0,mgc,1,0,0,blk,0,0,sub,metal), power, \ ARMOR_CLASS, prob, delay, wt, cost, \ 0, 0, 10 - ac, can, wt, c ) #define CLOAK(name,desc,kn,mgc,power,prob,delay,wt,cost,ac,can,metal,c) \ ARMOR(name,desc,kn,mgc,0,power,prob,delay,wt,cost,ac,can,ARM_CLOAK,metal,c) #define HELM(name,desc,kn,mgc,power,prob,delay,wt,cost,ac,can,metal,c) \ ARMOR(name,desc,kn,mgc,0,power,prob,delay,wt,cost,ac,can,ARM_HELM,metal,c) #define GLOVES(name,desc,kn,mgc,power,prob,delay,wt,cost,ac,can,metal,c) \ ARMOR(name,desc,kn,mgc,0,power,prob,delay,wt,cost,ac,can,ARM_GLOVES,metal,c) #define SHIELD(name,desc,kn,mgc,blk,power,prob,delay,wt,cost,ac,can,metal,c) \ ARMOR(name,desc,kn,mgc,blk,power,prob,delay,wt,cost,ac,can,ARM_SHIELD,metal,c) #define BOOTS(name,desc,kn,mgc,power,prob,delay,wt,cost,ac,can,metal,c) \ ARMOR(name,desc,kn,mgc,0,power,prob,delay,wt,cost,ac,can,ARM_BOOTS,metal,c) #ifdef TOURIST /* Shirts */ ARMOR("Hawaiian shirt", (char *)0, 1, 0, 0, 0, 8, 0, 5, 3, 10, 0, ARM_SHIRT, CLOTH, CLR_MAGENTA), ARMOR("T-shirt", (char *)0, 1, 0, 0, 0, 2, 0, 5, 2, 10, 0, ARM_SHIRT, CLOTH, CLR_WHITE), #endif /* Suits of armor */ ARMOR("plate mail", (char *)0, 1, 0, 1, 0, 40, 5, 450, 600, 3, 2, ARM_SUIT, IRON, HI_METAL), ARMOR("crystal plate mail", (char *)0, 1, 0, 1, 0, 10, 5, 450, 820, 3, 2, ARM_SUIT, GLASS, CLR_WHITE), #ifdef TOURIST ARMOR("bronze plate mail", (char *)0, 1, 0, 1, 0, 25, 5, 450, 400, 4, 0, ARM_SUIT, COPPER, HI_COPPER), #else ARMOR("bronze plate mail", (char *)0, 1, 0, 1, 0, 35, 5, 450, 400, 4, 0, ARM_SUIT, COPPER, HI_COPPER), #endif ARMOR("splint mail", (char *)0, 1, 0, 1, 0, 65, 5, 400, 80, 4, 1, ARM_SUIT, IRON, HI_METAL), ARMOR("banded mail", (char *)0, 1, 0, 1, 0, 75, 5, 350, 90, 4, 0, ARM_SUIT, IRON, HI_METAL), ARMOR("dwarvish mithril-coat", (char *)0, 1, 0, 0, 0, 10, 1, 150, 240, 4, 3, ARM_SUIT, MITHRIL, HI_METAL), ARMOR("dark elven mithril-coat", (char *)0, 1, 0, 0, 0, 0, 1, 150, 240, 4, 3, ARM_SUIT, MITHRIL, CLR_BLACK), ARMOR("elven mithril-coat", (char *)0, 1, 0, 0, 0, 15, 1, 150, 240, 5, 3, ARM_SUIT, MITHRIL, HI_METAL), ARMOR("chain mail", (char *)0, 1, 0, 0, 0, 70, 5, 300, 75, 5, 1, ARM_SUIT, IRON, HI_METAL), ARMOR("orcish chain mail", "crude chain mail", 0, 0, 0, 0, 20, 5, 300, 75, 6, 1, ARM_SUIT, IRON, CLR_BLACK), ARMOR("scale mail", (char *)0, 1, 0, 0, 0, 70, 5, 250, 45, 6, 0, ARM_SUIT, IRON, HI_METAL), ARMOR("studded leather armor", (char *)0, 1, 0, 0, 0, 70, 3, 200, 15, 7, 1, ARM_SUIT, LEATHER, HI_LEATHER), ARMOR("ring mail", (char *)0, 1, 0, 0, 0, 70, 5, 250, 100, 7, 0, ARM_SUIT, IRON, HI_METAL), ARMOR("orcish ring mail", "crude ring mail", 0, 0, 0, 0, 20, 5, 250, 80, 8, 1, ARM_SUIT, IRON, CLR_BLACK), ARMOR("leather armor", (char *)0, 1, 0, 0, 0, 75, 3, 150, 5, 8, 0, ARM_SUIT, LEATHER, HI_LEATHER), ARMOR("leather jacket", (char *)0, 1, 0, 0, 0, 11, 0, 30, 10, 9, 0, ARM_SUIT, LEATHER, CLR_BLACK), /* Robes */ /* STEPHEN WHITE'S NEW CODE */ ARMOR("robe", "red robe", 0, 0, 0, 0, 1, 1, 40, 25, 9, 0, ARM_SUIT, LEATHER, CLR_RED), ARMOR("robe of protection", "blue robe", 0, 1, 0, PROTECTION, 1, 1, 40, 50, 5, 0, ARM_SUIT, LEATHER, CLR_BLUE), ARMOR("robe of power", "orange robe", 0, 1, 0, 0, 0, 1, 40, 50, 9, 0, ARM_SUIT, LEATHER, CLR_ORANGE), ARMOR("robe of weakness", "green robe", 0, 1, 0, 0, 1, 1, 40, 50, 9, 0, ARM_SUIT, LEATHER, CLR_GREEN), /* * Dragon suits * There is code in polyself.c that assumes (1) and (2). * There is code in obj.h, objnam.c, mon.c, read.c that assumes (2). * * (1) The dragon scale mails and the dragon scales are together. * (2) That the order of the dragon scale mail and dragon scales is the * the same defined in monst.c. */ #define DRGN_ARMR(name,mgc,power,cost,ac,color) \ ARMOR(name,(char *)0,1,mgc,1,power,0,5,50,cost,ac,0,ARM_SUIT,DRAGON_HIDE,color) /* 3.4.1: dragon scale mail reclassified as "magic" since magic is needed to create them */ DRGN_ARMR("gray dragon scale mail", 1, ANTIMAGIC, 1200, 1, CLR_GRAY), DRGN_ARMR("silver dragon scale mail", 1, REFLECTING, 1200, 1, SILVER), DRGN_ARMR("shimmering dragon scale mail", 1, DISPLACED, 1200, 1, CLR_CYAN), DRGN_ARMR("deep dragon scale mail", 1, DRAIN_RES, 1200, 1, CLR_MAGENTA), DRGN_ARMR("red dragon scale mail", 1, FIRE_RES, 900, 1, CLR_RED), DRGN_ARMR("white dragon scale mail", 1, COLD_RES, 900, 1, CLR_WHITE), DRGN_ARMR("orange dragon scale mail", 1, SLEEP_RES, 900, 1, CLR_ORANGE), DRGN_ARMR("black dragon scale mail", 1, DISINT_RES, 1200, 1, CLR_BLACK), DRGN_ARMR("blue dragon scale mail", 1, SHOCK_RES, 900, 1, CLR_BLUE), DRGN_ARMR("green dragon scale mail", 1, POISON_RES, 900, 1, CLR_GREEN), DRGN_ARMR("yellow dragon scale mail", 1, ACID_RES, 900, 1, CLR_YELLOW), /* For now, only dragons leave these. */ /* 3.4.1: dragon scales left classified as "non-magic"; they confer magical properties but are produced "naturally" */ DRGN_ARMR("gray dragon scales", 0, ANTIMAGIC, 700, 7, CLR_GRAY), DRGN_ARMR("silver dragon scales", 0, REFLECTING, 700, 7, SILVER), DRGN_ARMR("shimmering dragon scales", 0, DISPLACED, 700, 7, CLR_CYAN), DRGN_ARMR("deep dragon scales", 0, DRAIN_RES, 500, 7, CLR_MAGENTA), DRGN_ARMR("red dragon scales", 0, FIRE_RES, 500, 7, CLR_RED), DRGN_ARMR("white dragon scales", 0, COLD_RES, 500, 7, CLR_WHITE), DRGN_ARMR("orange dragon scales", 0, SLEEP_RES, 500, 7, CLR_ORANGE), DRGN_ARMR("black dragon scales", 0, DISINT_RES, 700, 7, CLR_BLACK), DRGN_ARMR("blue dragon scales", 0, SHOCK_RES, 500, 7, CLR_BLUE), DRGN_ARMR("green dragon scales", 0, POISON_RES, 500, 7, CLR_GREEN), DRGN_ARMR("yellow dragon scales", 0, ACID_RES, 500, 7, CLR_YELLOW), #undef DRGN_ARMR /* Cloaks */ /* 'cope' is not a spelling mistake... leave it be */ CLOAK("mummy wrapping", (char *)0, 1, 0, 0, 0, 0, 3, 2, 10, 1, CLOTH, CLR_GRAY), 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("elven cloak", "faded pall", 0, 1, STEALTH, 8, 0, 10, 60, 9, 3, CLOTH, CLR_BLACK), CLOAK("lab coat", "white coat", 0, 1, POISON_RES,10, 0, 10, 60, 9, 3, CLOTH, CLR_WHITE), CLOAK("leather cloak", (char *)0, 1, 0, 0, 8, 0, 15, 40, 9, 1, LEATHER, CLR_BROWN), #if 0 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), #endif /* With shuffled appearances... */ CLOAK("cloak of protection", "tattered cape", 0, 1, PROTECTION, 9, 0, 10, 50, 7, 3, CLOTH, HI_CLOTH), CLOAK("poisonous cloak", "dirty rag", 0, 1, 0, 5, 0, 10, 40, 10, 3, CLOTH, CLR_GREEN), 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), /* Helmets */ HELM("elven leather helm", "leather hat", 0, 0, 0, 6, 1, 3, 8, 9, 0, LEATHER, HI_LEATHER), HELM("orcish helm", "iron skull cap", 0, 0, 0, 6, 1, 30, 10, 9, 0, IRON, CLR_BLACK), HELM("dwarvish iron helm", "hard hat", 0, 0, 0, 6, 1, 40, 20, 8, 0, IRON, HI_METAL), HELM("fedora", (char *)0, 1, 0, 0, 0, 0, 3, 1,10, 0, CLOTH, CLR_BROWN), HELM("cornuthaum", "conical hat", 0, 1, CLAIRVOYANT, 3, 1, 4, 80,10, 2, CLOTH, CLR_BLUE), HELM("dunce cap", "conical hat", 0, 1, 0, 3, 1, 4, 1,10, 0, CLOTH, CLR_BLUE), HELM("dented pot", (char *)0, 1, 0, 0, 2, 0, 10, 8, 9, 0, IRON, CLR_BLACK), /* ...with shuffled appearances */ HELM("helmet", "plumed helmet", 0, 0, 0, 10, 1, 30, 10, 9, 0, IRON, HI_METAL), HELM("helm of brilliance", "etched helmet", 0, 1, 0, 6, 1, 50, 50, 9, 0, IRON, CLR_GREEN), HELM("helm of opposite alignment", "crested helmet", 0, 1, 0, 6, 1, 50, 50, 9, 0, IRON, HI_METAL), HELM("helm of telepathy", "visored helmet", 0, 1, TELEPAT, 2, 1, 50, 50, 9, 0, IRON, HI_METAL), /* Gloves */ /* these have their color but not material shuffled, so the IRON must stay * CLR_BROWN (== HI_LEATHER) */ GLOVES("leather gloves", "old gloves", 0, 0, 0, 16, 1, 10, 8, 9, 0, LEATHER, HI_LEATHER), GLOVES("gauntlets of fumbling", "padded gloves", 0, 1, FUMBLING, 8, 1, 10, 50, 9, 0, LEATHER, HI_LEATHER), GLOVES("gauntlets of power", "riding gloves", 0, 1, 0, 8, 1, 30, 50, 9, 0, IRON, CLR_BROWN), GLOVES("gauntlets of swimming", "black gloves", 0, 1, SWIMMING, 8, 1, 10, 50, 9, 0, LEATHER, HI_LEATHER), GLOVES("gauntlets of dexterity", "fencing gloves", 0, 1, 0, 8, 1, 10, 50, 9, 0, LEATHER, HI_LEATHER), /* Shields */ SHIELD("small shield", (char *)0, 1, 0, 0, 0, 6, 0, 30, 3, 9, 0, WOOD, HI_WOOD), /* Elven ... orcish shields can't be differentiated by feel */ SHIELD("elven shield", "blue and green shield", 0, 0, 0, 0, 2, 0, 50, 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", 0, 0, 0, 0, 2, 0, 50, 7, 9, 0, IRON, CLR_RED), SHIELD("large shield", (char *)0, 1, 0, 1, 0, 7, 0,100, 10, 8, 0, IRON, HI_METAL), SHIELD("dwarvish roundshield", "large round shield", 0, 0, 0, 0, 4, 0,100, 10, 8, 0, IRON, HI_METAL), SHIELD("shield of reflection", "polished silver shield", 0, 1, 0, REFLECTING, 3, 0, 50, 50, 8, 0, SILVER, HI_SILVER), /* Boots */ BOOTS("low boots", "walking shoes", 0, 0, 0, 25, 2, 10, 8, 9, 0, LEATHER, HI_LEATHER), BOOTS("iron shoes", "hard shoes", 0, 0, 0, 7, 2, 50, 16, 8, 0, IRON, HI_METAL), BOOTS("high boots", "jackboots", 0, 0, 0, 15, 2, 20, 12, 8, 0, LEATHER, HI_LEATHER), /* ...with shuffled appearances */ BOOTS("speed boots", "combat boots", 0, 1, FAST, 12, 2, 20, 50, 9, 0, LEATHER, HI_LEATHER), /* With shuffled appearances... */ BOOTS("water walking boots", "jungle boots", 0, 1, WWALKING, 12, 2, 20, 50, 9, 0, LEATHER, HI_LEATHER), BOOTS("jumping boots", "hiking boots", 0, 1, JUMPING, 12, 2, 20, 50, 9, 0, LEATHER, HI_LEATHER), BOOTS("elven boots", "mud boots", 0, 1, STEALTH, 12, 2, 15, 8, 9, 0, LEATHER, HI_LEATHER), BOOTS("kicking boots", "steel boots", 0, 1, 0, 12, 2, 15, 8, 9, 0, IRON, CLR_BROWN), BOOTS("fumble boots", "riding boots", 0, 1, FUMBLING, 12, 2, 20, 30, 9, 0, LEATHER, HI_LEATHER), BOOTS("levitation boots", "snow boots", 0, 1, LEVITATION,12, 2, 15, 30, 9, 0, LEATHER, HI_LEATHER), #undef HELM #undef CLOAK #undef SHIELD #undef GLOVES #undef BOOTS #undef ARMOR /* rings ... */ /* [Tom] looks like there are no probs to change... */ #define RING(name,power,stone,cost,mgc,spec,mohs,metal,color) OBJECT( \ OBJ(name,stone), \ BITS(0,0,spec,0,mgc,spec,0,0,0,HARDGEM(mohs),0,0,metal), \ power, RING_CLASS, 0, 0, 3, cost, 0, 0, 0, 0, 15, color ) RING("adornment", ADORNED, "wooden", 100, 1, 1, 2, WOOD, HI_WOOD), RING("hunger", HUNGER, "topaz", 100, 1, 0, 8, GEMSTONE, CLR_CYAN), RING("mood", 0, "ridged", 100, 1, 0, 8, IRON, HI_METAL), RING("protection", PROTECTION, "black onyx",100, 1, 1, 7, MINERAL, CLR_BLACK), RING("protection from shape changers", PROT_FROM_SHAPE_CHANGERS, "shiny", 100, 1, 0, 5, IRON, CLR_BRIGHT_CYAN), RING("sleeping", SLEEPING, "wedding", 100, 1, 0, 7, GEMSTONE, CLR_WHITE), RING("stealth", STEALTH, "jade", 100, 1, 0, 6, GEMSTONE, CLR_GREEN), RING("sustain ability", FIXED_ABIL, "bronze", 100, 1, 0, 4, COPPER, HI_COPPER), RING("warning", WARNING, "diamond", 100, 1, 0,10, GEMSTONE, CLR_WHITE), RING("aggravate monster", AGGRAVATE_MONSTER, "sapphire", 150, 1, 0, 9, GEMSTONE, CLR_BLUE), RING("cold resistance", COLD_RES, "brass", 150, 1, 0, 4, COPPER, HI_COPPER), RING("gain constitution", 0, "opal", 150, 1, 1, 7, MINERAL, HI_MINERAL), RING("gain dexterity", 0, "obsidian", 150, 1, 1, 7, GEMSTONE, CLR_BLACK), RING("gain intelligence", 0, "plain", 150, 1, 1, 7, MINERAL, HI_MINERAL), RING("gain strength", 0, "granite", 150, 1, 1, 7, MINERAL, HI_MINERAL), RING("gain wisdom", 0, "glass", 150, 1, 1, 7, MINERAL, CLR_CYAN), RING("increase accuracy", 0, "clay", 150, 1, 1, 4, MINERAL, CLR_RED), RING("increase damage", 0, "coral", 150, 1, 1, 4, MINERAL, CLR_ORANGE), RING("slow digestion", SLOW_DIGESTION, "steel", 200, 1, 0, 8, IRON, HI_METAL), RING("invisibility", INVIS, "wire", 150, 1, 0, 5, IRON, HI_METAL), RING("poison resistance", POISON_RES, "pearl", 150, 1, 0, 4, IRON, CLR_WHITE), RING("see invisible", SEE_INVIS, "engagement", 150, 1, 0, 5, IRON, HI_METAL), RING("shock resistance", SHOCK_RES, "copper", 150, 1, 0, 3, COPPER, HI_COPPER), RING("fire resistance", FIRE_RES, "iron", 200, 1, 0, 5, IRON, HI_METAL), RING("free action", FREE_ACTION, "twisted", 200, 1, 0, 6, IRON, HI_METAL), /*RING("infravision", 0, "zinc", 200, 1, 0, 5, MITHRIL, HI_METAL),*/ RING("levitation", LEVITATION, "agate", 200, 1, 0, 7, GEMSTONE, CLR_RED), RING("regeneration", REGENERATION, "moonstone", 200, 1, 0, 6, MINERAL, HI_MINERAL), RING("searching", SEARCHING, "tiger eye", 200, 1, 0, 6, GEMSTONE, CLR_BROWN), RING("teleportation", TELEPORT, "silver", 200, 1, 0, 3, SILVER, HI_SILVER), RING("conflict", CONFLICT, "ruby", 300, 1, 0, 9, GEMSTONE, CLR_RED), RING("polymorph", POLYMORPH, "ivory", 300, 1, 0, 4, BONE, CLR_WHITE), RING("polymorph control", POLYMORPH_CONTROL, "emerald", 300, 1, 0, 8, GEMSTONE, CLR_BRIGHT_GREEN), RING("teleport control", TELEPORT_CONTROL, "gold", 300, 1, 0, 3, GOLD, HI_GOLD), /* More descriptions: cameo, intaglio */ #undef RING /* amulets ... - THE Amulet comes last because it is special */ #define AMULET(name,desc,power,prob) OBJECT( \ OBJ(name,desc), BITS(0,0,0,0,1,0,0,0,0,0,0,0,IRON), power, \ AMULET_CLASS, prob, 0, 20, 150, 0, 0, 0, 0, 20, HI_METAL ) AMULET("amulet of change", "square", 0, 110), AMULET("amulet of drain resistance","warped", DRAIN_RES, 60), AMULET("amulet of ESP", "circular", TELEPAT, 140), AMULET("amulet of flying", "convex", FLYING, 50), AMULET("amulet of life saving", "spherical", LIFESAVED, 60), AMULET("amulet of magical breathing", "octagonal", MAGICAL_BREATHING, 50), AMULET("amulet of reflection", "hexagonal", REFLECTING, 60), AMULET("amulet of restful sleep", "triangular", SLEEPING, 110), AMULET("amulet of strangulation", "oval", STRANGLED, 110), AMULET("amulet of unchanging", "concave", UNCHANGING, 50), AMULET("amulet versus poison", "pyramidal", POISON_RES, 140), AMULET("amulet versus stone", "lunate", /*STONE_RES*/0,60), OBJECT(OBJ("cheap plastic imitation of the Amulet of Yendor", "Amulet of Yendor"), BITS(0,0,1,0,0,0,0,0,0,0,0,0,PLASTIC), 0, 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 ... */ /* tools with weapon characteristics come last */ #define TOOL(name,desc,kn,mrg,mgc,chg,prob,wt,cost,mat,color) \ OBJECT( OBJ(name,desc), \ BITS(kn,mrg,chg,0,mgc,chg,0,0,0,0,0,P_NONE,mat), \ 0, TOOL_CLASS, prob, 0, \ wt, cost, 0, 0, 0, 0, wt, color ) #define CONTAINER(name,desc,kn,mgc,chg,bi,prob,wt,cost,mat,color) \ OBJECT( OBJ(name,desc), \ BITS(kn,0,chg,1,mgc,chg,0,0,bi,0,0,P_NONE,mat), \ 0, TOOL_CLASS, prob, 0, \ wt, cost, 0, 0, 0, 0, wt, color ) #define WEPTOOL(name,desc,kn,mgc,chg,bi,prob,wt,cost,sdam,ldam,hitbon,typ,sub,mat,clr) \ OBJECT( OBJ(name,desc), \ BITS(kn,0,1,chg,mgc,1,0,0,bi,0,typ,sub,mat), \ 0, TOOL_CLASS, prob, 0, \ wt, cost, sdam, ldam, hitbon, 0, wt, clr ) /* Containers */ CONTAINER("large box", (char *)0, 1, 0, 0, 1, 40,350, 8, WOOD, HI_WOOD), CONTAINER("chest", (char *)0, 1, 0, 0, 1, 35,600, 16, WOOD, HI_WOOD), CONTAINER("ice box", (char *)0, 1, 0, 0, 1, 10,900, 42, PLASTIC, CLR_WHITE), CONTAINER("sack", "bag", 0, 0, 0, 0, 40, 15, 2, CLOTH, HI_CLOTH), CONTAINER("oilskin sack", "bag", 0, 0, 0, 0, 10, 15, 100, CLOTH, HI_CLOTH), CONTAINER("bag of holding", "bag", 0, 1, 0, 0, 20, 15, 100, CLOTH, HI_CLOTH), CONTAINER("bag of tricks", "bag", 0, 1, 1, 0, 20, 15, 100, CLOTH, HI_CLOTH), /* Unlocking tools */ TOOL("skeleton key", "key", 0, 0, 0, 0, 80, 3, 10, IRON, HI_METAL), #ifdef TOURIST TOOL("lock pick", (char *)0, 1, 0, 0, 0, 60, 4, 20, IRON, HI_METAL), TOOL("credit card", (char *)0, 1, 0, 0, 0, 15, 1, 10, PLASTIC, CLR_WHITE), #else TOOL("lock pick", (char *)0, 1, 0, 0, 0, 75, 4, 20, IRON, HI_METAL), #endif /* Light sources */ /* [Tom] made candles cheaper & more common */ TOOL("tallow candle", "candle", 0, 1, 0, 0, 50, 2, 1, WAX, CLR_WHITE), TOOL("wax candle", "candle", 0, 1, 0, 0, 40, 2, 2, WAX, CLR_WHITE), TOOL("magic candle", "candle", 0, 1, 1, 0, 5, 2, 500, WAX, CLR_WHITE), TOOL("oil lamp", "lamp", 0, 0, 0, 0, 25, 20, 10, COPPER, CLR_YELLOW), TOOL("brass lantern", (char *)0,1, 0, 0, 0, 15, 30, 12, COPPER, CLR_YELLOW), TOOL("magic lamp", "lamp", 0, 0, 1, 0, 10, 20,1000, COPPER, CLR_YELLOW), /* Instruments */ /* KMH -- made less common */ TOOL("tin whistle", "whistle", 0, 0, 0, 0, 63, 3, 10, METAL, HI_METAL), TOOL("magic whistle", "whistle",0, 0, 1, 0, 25, 3, 10, METAL, HI_METAL), /* "If tin whistles are made out of tin, what do they make foghorns out of?" */ TOOL("wooden flute", "flute", 0, 0, 0, 0, 2, 5, 12, WOOD, HI_WOOD), TOOL("magic flute", "flute", 0, 0, 1, 1, 1, 5, 36, WOOD, HI_WOOD), TOOL("tooled horn", "horn", 0, 0, 0, 0, 2, 18, 15, BONE, CLR_WHITE), TOOL("frost horn", "horn", 0, 0, 1, 1, 1, 18, 50, BONE, CLR_WHITE), TOOL("fire horn", "horn", 0, 0, 1, 1, 1, 18, 50, BONE, CLR_WHITE), TOOL("horn of plenty", "horn", 0, 0, 1, 1, 1, 18, 50, BONE, CLR_WHITE), TOOL("wooden harp", "harp", 0, 0, 0, 0, 2, 30, 50, WOOD, HI_WOOD), TOOL("magic harp", "harp", 0, 0, 1, 1, 1, 30, 50, WOOD, HI_WOOD), TOOL("bell", (char *)0, 1, 0, 0, 0, 1, 30, 50, COPPER, HI_COPPER), TOOL("bugle", (char *)0, 1, 0, 0, 0, 2, 10, 15, COPPER, HI_COPPER), TOOL("leather drum", "drum", 0, 0, 0, 0, 2, 25, 25, LEATHER, HI_LEATHER), TOOL("drum of earthquake", "drum", 0, 0, 1, 1, 1, 25, 25, LEATHER, HI_LEATHER), /* Traps */ TOOL("land mine",(char *)0, 1, 0, 0, 0, 0,300, 180, IRON, CLR_RED), TOOL("beartrap", (char *)0, 1, 0, 0, 0, 0,200, 60, IRON, HI_METAL), /* Weapon-tools */ # ifdef P_SPOON /* Added by Tsanth, in homage to Final Fantasy 2 */ /* KMH -- Not randomly generated (no damage!) */ WEPTOOL("spoon", (char *)0, 1, 0, 0, 0, 0, 1, 5000, 0, 0, 0, WHACK, -P_DART, PLATINUM, HI_METAL), # endif /* P_SPOON */ #ifdef LIGHTSABERS # ifdef D_SABER WEPTOOL("pick-axe", (char *)0, 1, 0, 0, 0, 17, 80, 50, 6, 3, 0, WHACK, P_PICK_AXE, IRON, HI_METAL), # else WEPTOOL("pick-axe", (char *)0, 1, 0, 0, 0, 18, 80, 50, 6, 3, 0, WHACK, P_PICK_AXE, IRON, HI_METAL), # endif #else /* LIGHTSABERS */ WEPTOOL("pick-axe", (char *)0, 1, 0, 0, 0, 20, 80, 50, 6, 3, 0, WHACK, P_PICK_AXE, IRON, HI_METAL), #endif WEPTOOL("fishing pole", (char *)0, 1, 0, 0, 0, 5, 30, 50, 2, 6, 0, WHACK, P_POLEARMS, METAL, HI_METAL), WEPTOOL("grappling hook", "iron hook", 0, 0, 0, 0, 5, 30, 50, 2, 6, 0, WHACK, P_FLAIL, IRON, HI_METAL), /* 3.4.1: unicorn horn left classified as "magic" */ WEPTOOL("unicorn horn", (char *)0, 1, 1, 0, 1, 0, 20, 100, 12, 12, 0, PIERCE, P_UNICORN_HORN, BONE, CLR_WHITE), /* WEPTOOL("torch", (char *)0, 1, 0, 0, 0, 25, 8, 5, 2, WHACK, P_CLUB, WOOD, HI_WOOD), */ OBJECT(OBJ("torch", (char *)0), BITS(1,1,1,0,0,1,0,0,0,0,WHACK,P_CLUB,WOOD), 0, TOOL_CLASS, 25, 0, 20, 8, 2, 5, WHACK, 0, 20, HI_WOOD ), #ifdef LIGHTSABERS /* [WAC] * Lightsabers are -3 to hit * Double lightsaber is -4 to hit (only red) * DMG is increased: 10.5/15.5 * green :9 + d3, 13 + d5 * blue : 8 + d5, 12 + d7 * red : 6 + d9, 10 + d11 * red double: 6 + d9 + d9, 10 + d11 + d11 (15/21) in double mode */ WEPTOOL("green lightsaber", "lightsaber", 0, 0, 1, 0, 1, 60, 500, 3, 5, -3, SLASH, P_LIGHTSABER, PLASTIC, HI_METAL), # ifdef D_SABER WEPTOOL("blue lightsaber", "lightsaber", 0, 0, 1, 0, 1, 60, 500, 5, 7, -3, SLASH, P_LIGHTSABER, PLATINUM, HI_METAL), # endif /* D_SABER */ WEPTOOL("red lightsaber", "lightsaber", 0, 0, 1, 0, 1, 60, 500, 9, 11, -3, SLASH, P_LIGHTSABER, PLATINUM, HI_METAL), WEPTOOL("red double lightsaber", "double lightsaber", 0, 0, 1, 1, 0, 60,1000, 9, 11, -4, SLASH, P_LIGHTSABER, PLATINUM, HI_METAL), #endif /* LIGHTSABERS */ /* Other tools */ #ifdef TOURIST TOOL("expensive camera", (char *)0, 1, 0, 0, 1, 10, 12, 200, PLASTIC, CLR_BLACK), TOOL("mirror", "looking glass", 0, 0, 0, 0, 40, 13, 10, GLASS, HI_SILVER), #else TOOL("mirror", "looking glass", 0, 0, 0, 0, 50, 13, 10, GLASS, HI_SILVER), #endif TOOL("crystal ball", "glass orb", 0, 0, 1, 1, 10,150, 60, GLASS, HI_GLASS), #if 0 /* STEPHEN WHITE'S NEW CODE */ /* KMH -- removed because there's potential for abuse */ TOOL("orb of enchantment", "glass orb", 0, 0, 1, 1, 5, 75, 750, GLASS, HI_GLASS), TOOL("orb of charging", "glass orb", 0, 0, 1, 1, 5, 75, 750, GLASS, HI_GLASS), TOOL("orb of destruction", "glass orb", 0, 0, 0, 0, 5, 75, 750, GLASS, HI_GLASS), #endif TOOL("lenses", (char *)0, 1, 0, 0, 0, 5, 3, 80, GLASS, HI_GLASS), TOOL("blindfold", (char *)0, 1, 0, 0, 0, 50, 2, 20, CLOTH, CLR_BLACK), TOOL("towel", (char *)0, 1, 0, 0, 0, 50, 2, 50, CLOTH, CLR_MAGENTA), #ifdef STEED TOOL("saddle", (char *)0, 1, 0, 0, 0, 5,100, 150, LEATHER, HI_LEATHER), TOOL("leash", (char *)0, 1, 0, 0, 0, 65, 12, 20, LEATHER, HI_LEATHER), #else TOOL("leash", (char *)0, 1, 0, 0, 0, 70, 12, 20, LEATHER, HI_LEATHER), #endif TOOL("stethoscope", (char *)0, 1, 0, 0, 0, 25, 4, 75, IRON, HI_METAL), TOOL("tinning kit", (char *)0, 1, 0, 0, 1, 15, 75, 30, IRON, HI_METAL), CONTAINER("medical kit", "leather bag", 0, 0, 0, 0, 10, 25, 500, LEATHER, HI_LEATHER), TOOL("tin opener", (char *)0, 1, 0, 0, 0, 25, 4, 30, IRON, HI_METAL), TOOL("can of grease", (char *)0,1, 0, 0, 1, 15, 15, 20, IRON, HI_METAL), TOOL("figurine", (char *)0, 1, 0, 1, 0, 25, 50, 80, MINERAL, HI_MINERAL), TOOL("magic marker", (char *)0, 1, 0, 1, 1, 15, 2, 50, PLASTIC, CLR_RED), /* Two pseudo tools. These can never exist outside of medical kits. */ OBJECT(OBJ("bandage", (char *)0), BITS(1,1,0,0,0,0,0,1,0,0,0,P_NONE,CLOTH), 0, TOOL_CLASS, 0, 0, 1, 1, 0, 0, 0, 0, 0, CLR_WHITE), OBJECT(OBJ("phial", (char *)0), BITS(1,1,0,0,0,0,0,1,0,0,0,P_NONE,GLASS), 0, TOOL_CLASS, 0, 0, 2, 1, 0, 0, 0, 0, 1, HI_GLASS), /* Two special unique artifact "tools" */ OBJECT(OBJ("Candelabrum of Invocation", "candelabrum"), BITS(0,0,1,0,1,0,1,1,0,0,0,0,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,0,SILVER), 0, TOOL_CLASS, 0, 0,10, 5000, 0, 0, 0, 0, 50, HI_SILVER), #undef TOOL #undef CONTAINER #undef WEPTOOL /* Comestibles ... */ #define FOOD(name,prob,delay,wt,unk,tin,nutrition,color) OBJECT( \ OBJ(name,(char *)0), BITS(1,1,unk,0,0,0,0,0,0,0,0,0,tin), 0, \ FOOD_CLASS, prob, delay, \ wt, nutrition/20 + 5, 0, 0, 0, 0, nutrition, color ) /* all types of food (except tins & corpses) must have a delay of at least 1. */ /* delay on corpses is computed and is weight dependant */ /* dog eats foods 0-4 but prefers tripe rations above all others */ /* fortune cookies can be read */ /* carrots improve your vision */ /* +0 tins contain monster meat */ /* +1 tins (of spinach) make you stronger (like Popeye) */ /* food CORPSE is a cadaver of some type */ /* meatballs/sticks/rings are only created from objects via stone to flesh */ /* Meat */ FOOD("tripe ration", 142, 2, 10, 0, FLESH, 200, CLR_BROWN), FOOD("corpse", 0, 1, 0, 0, FLESH, 0, CLR_BROWN), FOOD("egg", 80, 1, 1, 1, FLESH, 80, CLR_WHITE), FOOD("meatball", 0, 1, 1, 0, FLESH, 5, CLR_BROWN), FOOD("meat stick", 0, 1, 1, 0, FLESH, 5, CLR_BROWN), FOOD("huge chunk of meat", 0,20,400, 0, FLESH,2000, CLR_BROWN), /* special case because it's not mergable */ OBJECT(OBJ("meat ring", (char *)0), BITS(1,0,0,0,0,0,0,0,0,0,0,0,FLESH), 0, FOOD_CLASS, 0, 1, 5, 1, 0, 0, 0, 0, 5, CLR_BROWN), /* Body parts.... eeeww */ FOOD("eyeball", 0, 1, 0, 0, FLESH, 10, CLR_WHITE), FOOD("severed hand", 0, 1, 0, 0, FLESH, 40, CLR_BROWN), /* Fruits & veggies */ FOOD("kelp frond", 0, 1, 1, 0, VEGGY, 30, CLR_GREEN), FOOD("eucalyptus leaf", 4, 1, 1, 0, VEGGY, 30, CLR_GREEN), FOOD("clove of garlic", 7, 1, 1, 0, VEGGY, 40, CLR_WHITE), FOOD("sprig of wolfsbane", 7, 1, 1, 0, VEGGY, 40, CLR_GREEN), FOOD("apple", 13, 1, 2, 0, VEGGY, 50, CLR_RED), FOOD("carrot", 15, 1, 2, 0, VEGGY, 50, CLR_ORANGE), FOOD("pear", 9, 1, 2, 0, VEGGY, 50, CLR_BRIGHT_GREEN), FOOD("asian pear", 1, 1, 2, 0, VEGGY, 75, CLR_BRIGHT_GREEN), FOOD("banana", 10, 1, 2, 0, VEGGY, 80, CLR_YELLOW), FOOD("orange", 10, 1, 2, 0, VEGGY, 80, CLR_ORANGE), FOOD("mushroom", 1, 1, 5, 0, VEGGY, 90, CLR_BLACK), FOOD("melon", 9, 1, 5, 0, VEGGY, 100, CLR_BRIGHT_GREEN), FOOD("slime mold", 75, 1, 5, 0, VEGGY, 250, HI_ORGANIC), /* People food */ FOOD("lump of royal jelly", 1, 1, 2, 0, VEGGY, 200, CLR_YELLOW), FOOD("cream pie", 10, 1, 10, 0, VEGGY, 100, CLR_WHITE), FOOD("sandwich", 10, 1, 10, 0, FLESH, 100, CLR_WHITE), FOOD("candy bar", 13, 1, 2, 0, VEGGY, 100, CLR_BROWN), FOOD("fortune cookie", 55, 1, 1, 0, VEGGY, 40, CLR_YELLOW), FOOD("pancake", 14, 2, 2, 0, VEGGY, 200, CLR_YELLOW), FOOD("tortilla", 1, 2, 2, 0, VEGGY, 80, CLR_WHITE), /* [Tom] more food.... taken off pancake (25) */ FOOD("cheese", 10, 2, 2, 0, FLESH, 250, CLR_YELLOW), FOOD("pill", 1, 1, 1, 0, VEGGY, 0, CLR_BRIGHT_MAGENTA), FOOD("holy wafer", 7, 1, 1, 0, VEGGY, 150, CLR_WHITE), FOOD("lembas wafer", 20, 2, 5, 0, VEGGY, 800, CLR_WHITE), FOOD("cram ration", 20, 3, 15, 0, VEGGY, 600, HI_ORGANIC), FOOD("food ration", 380, 5, 20, 0, VEGGY, 800, HI_ORGANIC), FOOD("K-ration", 0, 1, 10, 0, VEGGY, 400, HI_ORGANIC), FOOD("C-ration", 0, 1, 10, 0, VEGGY, 300, HI_ORGANIC), FOOD("tin", 75, 0, 10, 1, METAL, 0, HI_METAL), #undef FOOD /* potions ... */ #define POTION(name,desc,mgc,power,prob,cost,color) OBJECT( \ OBJ(name,desc), BITS(0,1,0,0,mgc,0,0,0,0,0,0,0,GLASS), power, \ POTION_CLASS, prob, 0, 20, cost, 0, 0, 0, 0, 10, color ) POTION("booze", "brown", 0, 0, 40, 50, CLR_BROWN), POTION("fruit juice", "dark", 0, 0, 40, 50, CLR_BLACK), POTION("see invisible", "magenta", 1, SEE_INVIS, 38, 50, CLR_MAGENTA), POTION("sickness", "fizzy", 0, 0, 40, 50, CLR_CYAN), POTION("sleeping", "effervescent", 1, 0, 40, 100, CLR_GRAY), POTION("clairvoyance","luminescent", 1, 0, 20, 100, CLR_WHITE), POTION("confusion", "orange", 1, CONFUSION, 40, 100, CLR_ORANGE), POTION("hallucination", "sky blue", 1, HALLUC, 40, 100, CLR_CYAN), POTION("healing", "purple-red", 1, 0, 55, 100, CLR_MAGENTA), POTION("extra healing", "puce", 1, 0, 45, 100, CLR_RED), POTION("restore ability", "pink", 1, 0, 40, 100, CLR_BRIGHT_MAGENTA), POTION("blindness", "yellow", 1, BLINDED, 38, 150, CLR_YELLOW), POTION("ESP", "muddy", 1, TELEPAT, 20, 150, CLR_BROWN), POTION("gain energy", "cloudy", 1, 0, 40, 150, CLR_WHITE), POTION("invisibility", "brilliant blue",1, INVIS, 40, 150, CLR_BRIGHT_BLUE), POTION("monster detection", "bubbly", 1, 0, 38, 150, CLR_WHITE), POTION("object detection", "smoky", 1, 0, 38, 150, CLR_GRAY), POTION("enlightenment", "swirly", 1, 0, 20, 200, CLR_BROWN), POTION("full healing", "black", 1, 0, 20, 200, CLR_BLACK), POTION("levitation", "cyan", 1, LEVITATION, 38, 200, CLR_CYAN), POTION("polymorph", "golden", 1, 0, 10, 200, CLR_YELLOW), POTION("speed", "dark green", 1, FAST, 38, 200, CLR_GREEN), POTION("acid", "white", 0, 0, 20, 250, CLR_WHITE), POTION("oil", "murky", 0, 0, 30, 250, CLR_BROWN), POTION("gain ability", "ruby", 1, 0, 38, 300, CLR_RED), POTION("gain level", "milky", 1, 0, 20, 300, CLR_WHITE), POTION("invulnerability", "icy", 1, 0, 5, 300, CLR_BRIGHT_BLUE), POTION("paralysis", "emerald", 1, 0, 38, 300, CLR_BRIGHT_GREEN), POTION("water", "clear", 0, 0, 55, 100, CLR_CYAN), POTION("blood", "blood-red", 0, 0, 0, 50, CLR_RED), POTION("vampire blood", "blood-red", 1, 0, 0, 350, CLR_RED), POTION("amnesia", "sparkling", 1, 0, 16, 100, CLR_CYAN), #undef POTION /* scrolls ... */ #define SCROLL(name,text,sub,mgc,prob,cost) OBJECT( \ OBJ(name,text), BITS(0,1,0,0,mgc,0,0,0,0,0,0,sub,PAPER), 0, \ SCROLL_CLASS, prob, 0, 5, cost, 0, 0, 0, 0, 6, HI_PAPER ) /* Attack */ SCROLL("create monster", "LEP GEX VEN ZEA", P_ATTACK_SPELL, 1, 45, 200), /* Enchantment */ SCROLL("taming", "PRIRUTSENIE", P_ENCHANTMENT_SPELL, 1, 15, 200), /* Divination */ SCROLL("light", "VERR YED HORRE", P_DIVINATION_SPELL, 1, 90, 50), SCROLL("food detection", "YUM YUM", P_DIVINATION_SPELL, 1, 25, 100), SCROLL("gold detection", "THARR", P_DIVINATION_SPELL, 1, 33, 100), SCROLL("identify", "KERNOD WEL", P_DIVINATION_SPELL, 1, 185, 20), SCROLL("magic mapping", "ELAM EBOW", P_DIVINATION_SPELL, 1, 45, 100), /* Enchantment */ SCROLL("confuse monster", "NR 9", P_ENCHANTMENT_SPELL, 1, 43, 100), SCROLL("scare monster", "XIXAXA XOXAXA XUXAXA", P_ENCHANTMENT_SPELL, 1, 35, 100), SCROLL("enchant weapon", "DAIYEN FOOELS", P_ENCHANTMENT_SPELL, 1, 80, 60), SCROLL("enchant armor", "ZELGO MER", P_ENCHANTMENT_SPELL, 1, 63, 80), /* Protection */ SCROLL("remove curse", "PRATYAVAYAH", P_PROTECTION_SPELL, 1, 65, 80), /* Body */ SCROLL("teleportation", "VENZAR BORGAVVE", P_BODY_SPELL, 1, 55, 100), /* Matter */ SCROLL("fire", "ANDOVA BEGARIN", P_MATTER_SPELL, 1, 33, 100), SCROLL("earth", "KIRJE", P_MATTER_SPELL, 1, 20, 200), SCROLL("destroy armor", "JUYED AWK YACC", P_NONE, 1, 45, 100), SCROLL("amnesia", "DUAM XNAHT", P_NONE, 1, 35, 200), SCROLL("charging", "HACKEM MUCHE", P_NONE, 1, 15, 300), SCROLL("genocide", "ELBIB YLOH", P_NONE, 1, 15, 300), SCROLL("punishment", "VE FORBRYDERNE", P_NONE, 1, 15, 300), SCROLL("stinking cloud", "VELOX NEB", P_NONE, 1, 15, 300), SCROLL((char *)0, "FOOBIE BLETCH", P_NONE, 1, 0, 100), SCROLL((char *)0, "TEMOV", P_NONE, 1, 0, 100), SCROLL((char *)0, "GARVEN DEH", P_NONE, 1, 0, 100), SCROLL((char *)0, "READ ME", P_NONE, 1, 0, 100), /* these must come last because they have special descriptions */ #ifdef MAIL SCROLL("mail", "stamped", P_NONE, 0, 0, 0), #endif SCROLL("blank paper", "unlabeled", P_NONE, 0, 28, 60), #undef SCROLL /* spell books ... */ #define SPELL(name,desc,sub,prob,delay,level,mgc,dir,color) OBJECT( \ OBJ(name,desc), BITS(0,0,1,0,mgc,1,0,0,0,0,dir,sub,PAPER), 0, \ SPBOOK_CLASS, prob, delay, \ 50, level*100, 0, 0, 0, level, 20, color ) /* Attack spells */ SPELL("force bolt", "red", P_ATTACK_SPELL, 25, 2, 1, 1, IMMEDIATE, CLR_RED), SPELL("create monster", "turquoise", P_ATTACK_SPELL, 25, 3, 2, 1, NODIR, CLR_BRIGHT_CYAN), SPELL("drain life", "velvet", P_ATTACK_SPELL, 10, 4, 3, 1, IMMEDIATE, CLR_MAGENTA), /* NEEDS TILE */ /* WAC -- probs from force bolt and extra healing */ SPELL("command undead", "dark", P_ATTACK_SPELL, 10, 7, 5, 1, IMMEDIATE, CLR_BLACK), SPELL("summon undead", "black", P_ATTACK_SPELL, 10, 7, 5, 1, IMMEDIATE, CLR_BLACK), /* Healing spells */ SPELL("stone to flesh", "thick", P_HEALING_SPELL, 15, 1, 3, 1, IMMEDIATE, HI_PAPER), SPELL("healing", "white", P_HEALING_SPELL, 30, 2, 1, 1, IMMEDIATE, CLR_WHITE), SPELL("cure blindness", "yellow", P_HEALING_SPELL, 20, 2, 2, 1, IMMEDIATE, CLR_YELLOW), SPELL("cure sickness", "indigo", P_HEALING_SPELL, 20, 3, 3, 1, NODIR, CLR_BLUE), SPELL("extra healing", "plaid", P_HEALING_SPELL, 15, 5, 3, 1, IMMEDIATE, CLR_GREEN), SPELL("restore ability", "light brown", P_HEALING_SPELL, 15, 5, 4, 1, NODIR, CLR_BROWN), SPELL("create familiar", "glittering", P_HEALING_SPELL, 10, 7, 6, 1, NODIR, CLR_WHITE), /* Divination spells */ SPELL("light", "cloth", P_DIVINATION_SPELL, 30, 1, 1, 1, NODIR, HI_CLOTH), SPELL("detect monsters", "leather", P_DIVINATION_SPELL, 20, 1, 1, 1, NODIR, HI_LEATHER), SPELL("detect food", "cyan", P_DIVINATION_SPELL, 15, 3, 2, 1, NODIR, CLR_CYAN), SPELL("clairvoyance", "dark blue", P_DIVINATION_SPELL, 15, 3, 3, 1, NODIR, CLR_BLUE), SPELL("detect unseen", "violet", P_DIVINATION_SPELL, 15, 4, 3, 1, NODIR, CLR_MAGENTA), SPELL("identify", "bronze", P_DIVINATION_SPELL, 30, 8, 5, 1, NODIR, HI_COPPER), SPELL("detect treasure", "gray", P_DIVINATION_SPELL, 25, 5, 4, 1, NODIR, CLR_GRAY), SPELL("magic mapping", "dusty", P_DIVINATION_SPELL, 15, 7, 5, 1, NODIR, HI_PAPER), /* Enchantment spells */ SPELL("confuse monster", "orange", P_ENCHANTMENT_SPELL, 25, 2, 2, 1, IMMEDIATE, CLR_ORANGE), SPELL("slow monster", "light green", P_ENCHANTMENT_SPELL, 25, 2, 2, 1, IMMEDIATE, CLR_BRIGHT_GREEN), SPELL("cause fear", "light blue", P_ENCHANTMENT_SPELL, 20, 3, 3, 1, NODIR, CLR_BRIGHT_BLUE), SPELL("charm monster", "magenta", P_ENCHANTMENT_SPELL, 20, 3, 3, 1, IMMEDIATE, CLR_MAGENTA), SPELL("enchant weapon", "dull", P_ENCHANTMENT_SPELL, 5, 8, 7, 1, NODIR, CLR_WHITE), SPELL("enchant armor", "thin", P_ENCHANTMENT_SPELL, 5, 8, 7, 1, NODIR, CLR_WHITE), /* Protection spells */ SPELL("protection", "wide", P_PROTECTION_SPELL, 5, 3, 1, 1, NODIR, HI_PAPER), SPELL("resist poison", "big", P_PROTECTION_SPELL, 20, 2, 1, 1, NODIR, CLR_GRAY), SPELL("resist sleep", "fuzzy", P_PROTECTION_SPELL, 20, 2, 1, 1, NODIR, CLR_BROWN), SPELL("endure cold", "deep", P_PROTECTION_SPELL, 15, 3, 2, 1, NODIR, HI_PAPER), SPELL("endure heat", "spotted", P_PROTECTION_SPELL, 15, 3, 2, 1, NODIR, HI_PAPER), SPELL("insulate", "long", P_PROTECTION_SPELL, 15, 3, 2, 1, NODIR, HI_PAPER), SPELL("remove curse", "wrinkled", P_PROTECTION_SPELL, 25, 5, 5, 1, NODIR, HI_PAPER), SPELL("turn undead", "copper", P_PROTECTION_SPELL, 15, 8, 6, 1, IMMEDIATE, HI_COPPER), /* Body spells */ SPELL("jumping", "torn", P_BODY_SPELL, 15, 3, 1, 1, IMMEDIATE, HI_PAPER), SPELL("haste self", "purple", P_BODY_SPELL, 20, 4, 3, 1, NODIR, CLR_MAGENTA), SPELL("enlighten", "faded", P_BODY_SPELL, 15, 5, 4, 1, NODIR, CLR_GRAY), SPELL("invisibility", "dark brown", P_BODY_SPELL, 20, 5, 4, 1, NODIR, CLR_BROWN), SPELL("levitation", "tan", P_BODY_SPELL, 15, 4, 4, 1, NODIR, CLR_BROWN), SPELL("teleport away", "gold", P_BODY_SPELL, 15, 6, 6, 1, IMMEDIATE, HI_GOLD), SPELL("passwall", "ochre", P_BODY_SPELL, 5, 7, 6, 1, NODIR, CLR_YELLOW), SPELL("polymorph", "silver", P_BODY_SPELL, 15, 8, 6, 1, IMMEDIATE, HI_SILVER), /* Matter spells */ SPELL("knock", "pink", P_MATTER_SPELL, 25, 1, 1, 1, IMMEDIATE, CLR_BRIGHT_MAGENTA), SPELL("flame sphere", "canvas", P_MATTER_SPELL, 20, 2, 1, 1, NODIR, CLR_BROWN), SPELL("freeze sphere", "hardcover", P_MATTER_SPELL, 20, 2, 1, 1, NODIR, CLR_BROWN), SPELL("wizard lock", "dark green", P_MATTER_SPELL, 30, 3, 2, 1, IMMEDIATE, CLR_GREEN), SPELL("dig", "parchment", P_MATTER_SPELL, 20, 6, 5, 1, RAY, HI_PAPER), SPELL("cancellation", "shining", P_MATTER_SPELL, 15, 8, 7, 1, IMMEDIATE, CLR_WHITE), /* Ray type spells are all here. Kludge for zap.c */ SPELL("magic missile", "vellum", P_ATTACK_SPELL, 40, 3, 2, 1, RAY, HI_PAPER), SPELL("fireball", "ragged", P_MATTER_SPELL, 15, 6, 4, 1, RAY, HI_PAPER), SPELL("cone of cold", "dog eared", P_MATTER_SPELL, 15, 8, 5, 1, RAY, HI_PAPER), SPELL("sleep", "mottled", P_ENCHANTMENT_SPELL, 35, 1, 1, 1, RAY, HI_PAPER), SPELL("finger of death", "stained", P_ATTACK_SPELL, 5, 10, 7, 1, RAY, HI_PAPER), SPELL("lightning", "rainbow", P_MATTER_SPELL, 10, 7, 4, 1, RAY, HI_PAPER), SPELL("poison blast", "tattered", P_ATTACK_SPELL, 5, 7, 4, 1, RAY, HI_PAPER), SPELL("acid stream", "colorful", P_MATTER_SPELL, 5, 7, 4, 1, RAY, HI_PAPER), /* Description placeholders and special spellbooks */ SPELL((char *)0, "tartan", P_NONE, 0, 0, 0, 1, 0, CLR_RED), SPELL((char *)0, "stylish", P_NONE, 0, 0, 0, 1, 0, HI_PAPER), SPELL((char *)0, "psychedelic", P_NONE, 0, 0, 0, 1, 0, CLR_BRIGHT_MAGENTA), SPELL((char *)0, "spiral-bound",P_NONE, 0, 0, 0, 1, 0, HI_PAPER), SPELL((char *)0, "left-handed", P_NONE, 0, 0, 0, 1, 0, HI_PAPER), SPELL((char *)0, "stapled", P_NONE, 0, 0, 0, 1, 0, HI_PAPER), SPELL("blank paper", "plain", P_NONE, 20, 0, 0, 0, 0, HI_PAPER), /* ...Blank spellbook must come last because it retains its description */ OBJECT(OBJ("Book of the Dead", "papyrus"), BITS(0,0,1,0,1,0,1,1,0,0,0,0,PAPER), 0, SPBOOK_CLASS, 0, 0,20, 10000, 0, 0, 0, 7, 20, HI_PAPER), /* ...A special, one of a kind, spellbook */ #undef SPELL /* wands ... */ #define WAND(name,typ,prob,cost,mgc,dir,metal,color) OBJECT( \ OBJ(name,typ), BITS(0,0,1,0,mgc,1,0,0,0,0,dir,0,metal), 0, \ WAND_CLASS, prob, 0, 7, cost, 0, 0, 0, 0, 30, color ) WAND("light", "glass", 50, 100, 1, NODIR, GLASS, HI_GLASS), WAND("nothing", "oak", 20, 100, 0, IMMEDIATE, WOOD, HI_WOOD), WAND("enlightenment", "crystal", 30, 150, 1, NODIR, GLASS, HI_GLASS), WAND("healing", "bamboo", 60, 150, 1, IMMEDIATE, WOOD, CLR_YELLOW), WAND("locking", "aluminum", 25, 150, 1, IMMEDIATE, METAL, HI_METAL), WAND("make invisible", "marble", 45, 150, 1, IMMEDIATE, MINERAL, HI_MINERAL), WAND("opening", "zinc", 25, 150, 1, IMMEDIATE, METAL, HI_METAL), WAND("probing", "uranium", 30, 150, 1, IMMEDIATE, METAL, HI_METAL), WAND("secret door detection", "balsa", 30, 150, 1, NODIR, WOOD, HI_WOOD), WAND("slow monster", "tin", 45, 150, 1, IMMEDIATE, METAL, HI_METAL), WAND("speed monster", "brass", 45, 150, 1, IMMEDIATE, COPPER, HI_COPPER), WAND("striking", "ebony", 65, 150, 1, IMMEDIATE, WOOD, HI_WOOD), WAND("undead turning", "copper", 45, 150, 1, IMMEDIATE, COPPER, HI_COPPER), WAND("draining", "ceramic", 15, 175, 1, IMMEDIATE, MINERAL, HI_MINERAL), /* KMH -- 15/1000 probability from light */ WAND("cancellation", "platinum", 45, 200, 1, IMMEDIATE, PLATINUM, CLR_WHITE), WAND("create monster", "maple", 35, 200, 1, NODIR, WOOD, HI_WOOD), WAND("fear", "rusty", 25, 200, 1, IMMEDIATE, IRON, CLR_RED), WAND("polymorph", "silver", 45, 200, 1, IMMEDIATE, SILVER, HI_SILVER), WAND("teleportation", "iridium", 45, 200, 1, IMMEDIATE, METAL, CLR_BRIGHT_CYAN), WAND("create horde", "black", 5, 300, 1, NODIR, PLASTIC, CLR_BLACK), WAND("extra healing", "bronze", 30, 300, 1, IMMEDIATE, COPPER, CLR_YELLOW), WAND("wishing", "pine", 5, 500, 1, NODIR, WOOD, HI_WOOD), /* Ray wands have to come last, and in this order. */ /* This is extremely kludgy, but that's what zap.c expects. */ WAND("digging", "iron", 50, 150, 1, RAY, IRON, HI_METAL), WAND("magic missile", "steel", 50, 150, 1, RAY, IRON, HI_METAL), WAND("fire", "hexagonal",25, 175, 1, RAY, IRON, HI_METAL), WAND("cold", "short", 30, 175, 1, RAY, IRON, HI_METAL), WAND("sleep", "runed", 50, 175, 1, RAY, IRON, HI_METAL), WAND("death", "long", 5, 500, 1, RAY, IRON, HI_METAL), WAND("lightning", "curved", 20, 175, 1, RAY, IRON, HI_METAL), WAND("fireball", "octagonal", 5, 300, 1, RAY, IRON, HI_METAL), WAND((char *)0, "forked", 0, 150, 1, 0, WOOD, HI_WOOD), WAND((char *)0, "spiked", 0, 150, 1, 0, IRON, HI_METAL), WAND((char *)0, "jeweled", 0, 150, 1, 0, IRON, HI_MINERAL), #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, \ COIN_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 */ #define GEM(name,desc,prob,wt,gval,nutr,mohs,glass,color) OBJECT( \ OBJ(name,desc), \ BITS(0,1,0,0,0,0,0,0,0,HARDGEM(mohs),0,-P_SLING,glass), 0, \ GEM_CLASS, prob, 0, 1, gval, 3, 3, 0, 0, nutr, color ) #define ROCK(name,desc,kn,prob,wt,gval,sdam,ldam,mgc,nutr,mohs,glass,color) OBJECT( \ OBJ(name,desc), \ BITS(kn,1,0,0,mgc,0,0,0,0,HARDGEM(mohs),0,-P_SLING,glass), 0, \ GEM_CLASS, prob, 0, wt, gval, sdam, ldam, 0, 0, nutr, color ) GEM("dilithium crystal", "white", 2, 1, 4500, 15, 5, GEMSTONE, CLR_WHITE), GEM("diamond", "white", 3, 1, 4000, 15, 10, GEMSTONE, CLR_WHITE), GEM("ruby", "red", 4, 1, 3500, 15, 9, GEMSTONE, CLR_RED), GEM("jacinth", "orange", 3, 1, 3250, 15, 9, GEMSTONE, CLR_ORANGE), GEM("sapphire", "blue", 4, 1, 3000, 15, 9, GEMSTONE, CLR_BLUE), GEM("black opal", "black", 3, 1, 2500, 15, 8, GEMSTONE, CLR_BLACK), GEM("emerald", "green", 5, 1, 2500, 15, 8, GEMSTONE, CLR_GREEN), GEM("turquoise", "green", 6, 1, 2000, 15, 6, GEMSTONE, CLR_GREEN), GEM("citrine", "yellow", 4, 1, 1500, 15, 6, GEMSTONE, CLR_YELLOW), GEM("aquamarine", "green", 6, 1, 1500, 15, 8, GEMSTONE, CLR_GREEN), GEM("amber", "yellowish brown", 8, 1, 1000, 15, 2, GEMSTONE, CLR_BROWN), GEM("topaz", "yellowish brown", 10, 1, 900, 15, 8, GEMSTONE, CLR_BROWN), GEM("jet", "black", 6, 1, 850, 15, 7, GEMSTONE, CLR_BLACK), GEM("opal", "white", 12, 1, 800, 15, 6, GEMSTONE, CLR_WHITE), GEM("chrysoberyl", "yellow", 8, 1, 700, 15, 5, GEMSTONE, CLR_YELLOW), GEM("garnet", "red", 12, 1, 700, 15, 7, GEMSTONE, CLR_RED), GEM("amethyst", "violet", 14, 1, 600, 15, 7, GEMSTONE, CLR_MAGENTA), GEM("jasper", "red", 15, 1, 500, 15, 7, GEMSTONE, CLR_RED), GEM("fluorite", "violet", 15, 1, 400, 15, 4, GEMSTONE, CLR_MAGENTA), GEM("obsidian", "black", 9, 1, 200, 15, 6, GEMSTONE, CLR_BLACK), GEM("agate", "orange", 12, 1, 200, 15, 6, GEMSTONE, CLR_ORANGE), GEM("jade", "green", 10, 1, 300, 15, 6, GEMSTONE, CLR_GREEN), GEM("worthless piece of white glass", "white", 76, 1, 0, 6, 5, GLASS, CLR_WHITE), GEM("worthless piece of blue glass", "blue", 76, 1, 0, 6, 5, GLASS, CLR_BLUE), GEM("worthless piece of red glass", "red", 76, 1, 0, 6, 5, GLASS, CLR_RED), GEM("worthless piece of yellowish brown glass", "yellowish brown", 76, 1, 0, 6, 5, GLASS, CLR_BROWN), GEM("worthless piece of orange glass", "orange", 76, 1, 0, 6, 5, GLASS, CLR_ORANGE), GEM("worthless piece of yellow glass", "yellow", 76, 1, 0, 6, 5, GLASS, CLR_YELLOW), GEM("worthless piece of black glass", "black", 76, 1, 0, 6, 5, GLASS, CLR_BLACK), GEM("worthless piece of green glass", "green", 76, 1, 0, 6, 5, GLASS, CLR_GREEN), GEM("worthless piece of violet glass", "violet", 76, 1, 0, 6, 5, GLASS, CLR_MAGENTA), /* Placement note: there is a wishable subrange for * "gray stones" in the o_ranges[] array in objnam.c * that is currently everything between luckstones and flint (inclusive). */ ROCK("luckstone", "gray", 0, 10, 10, 60, 3, 3, 1, 10, 7, MINERAL, CLR_GRAY), ROCK("healthstone", "gray", 0, 8, 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, 4, 10, 45, 3, 3, 1, 10, 6, MINERAL, CLR_GRAY), ROCK("whetstone", "gray", 0, 3, 10, 45, 3, 3, 1, 10, 7, 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 /* miscellaneous ... */ /* Note: boulders and rocks are not normally created at random; the * probabilities only come into effect when you try to polymorph them. * Boulders weigh more than MAX_CARR_CAP; statues use corpsenm to take * on a specific type and may act as containers (both affect weight). */ OBJECT(OBJ("boulder",(char *)0), BITS(1,0,0,0,0,0,0,0,1,0,0,P_NONE,MINERAL), 0, ROCK_CLASS, 100, 0, 6000, 0, 20, 20, 0, 0, 2000, HI_MINERAL), OBJECT(OBJ("statue", (char *)0), BITS(1,0,0,1,0,0,0,0,0,0,0,P_NONE,MINERAL), 0, ROCK_CLASS, 900, 0, 2500, 0, 20, 20, 0, 0, 2500, CLR_WHITE), OBJECT(OBJ("heavy iron ball", (char *)0), BITS(1,0,0,0,0,0,0,0,0,0,WHACK,P_NONE,IRON), 0, BALL_CLASS, 1000, 0, 480, 10, 25, 25, 0, 0, 200, HI_METAL), /* +d4 when "very heavy" */ OBJECT(OBJ("iron chain", (char *)0), BITS(1,0,0,0,0,0,0,0,0,0,WHACK,P_NONE,IRON), 0, CHAIN_CLASS, 1000, 0, 120, 0, 4, 4, 0, 0, 200, HI_METAL), /* +1 both l & s */ OBJECT(OBJ("blinding venom", "splash of venom"), BITS(0,1,0,0,0,0,0,1,0,0,0,P_NONE,LIQUID), 0, VENOM_CLASS, 500, 0, 1, 0, 0, 0, 0, 0, 0, HI_ORGANIC), OBJECT(OBJ("acid venom", "splash of venom"), BITS(0,1,0,0,0,0,0,1,0,0,0,P_NONE,LIQUID), 0, VENOM_CLASS, 500, 0, 1, 0, 6, 6, 0, 0, 0, HI_ORGANIC), /* +d6 small or large */ /* fencepost, the deadly Array Terminator -- name [1st arg] *must* be NULL */ OBJECT(OBJ((char *)0,(char *)0), BITS(0,0,0,0,0,0,0,0,0,0,0,P_NONE,0), 0, ILLOBJ_CLASS, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) }; /* objects[] */ #ifndef OBJECTS_PASS_2_ /* perform recursive compilation for second structure */ # undef OBJ # undef OBJECT # define OBJECTS_PASS_2_ #include "objects.c" void NDECL(objects_init); /* dummy routine used to force linkage */ void objects_init() { return; } #endif /* !OBJECTS_PASS_2_ */ /*objects.c*/ slashem-0.0.7E7F3/src/dbridge.c0000664000076400007640000005523710545462317014223 0ustar aliali/* SCCS Id: @(#)dbridge.c 3.4 2003/02/08 */ /* Copyright (c) 1989 by Jean-Christophe Collet */ /* NetHack may be freely redistributed. See license for details. */ /* * This file contains the drawbridge manipulation (create, open, close, * destroy). * * Added comprehensive monster-handling, and the "entity" structure to * deal with players as well. - 11/89 */ #include "hack.h" #ifdef OVLB STATIC_DCL void FDECL(get_wall_for_db, (int *, int *)); STATIC_DCL struct entity *FDECL(e_at, (int, int)); STATIC_DCL void FDECL(m_to_e, (struct monst *, int, int, struct entity *)); STATIC_DCL void FDECL(u_to_e, (struct entity *)); STATIC_DCL void FDECL(set_entity, (int, int, struct entity *)); STATIC_DCL const char *FDECL(e_nam, (struct entity *)); #ifdef D_DEBUG static const char *FDECL(Enam, (struct entity *)); /* unused */ #endif STATIC_DCL const char *FDECL(E_phrase, (struct entity *, const char *)); STATIC_DCL boolean FDECL(e_survives_at, (struct entity *, int, int)); STATIC_DCL void FDECL(e_died, (struct entity *, int, int)); STATIC_DCL boolean FDECL(automiss, (struct entity *)); STATIC_DCL boolean FDECL(e_missed, (struct entity *, BOOLEAN_P)); STATIC_DCL boolean FDECL(e_jumps, (struct entity *)); STATIC_DCL void FDECL(do_entity, (struct entity *)); #endif /* OVLB */ #ifdef OVL0 boolean is_pool(x,y) int x,y; { schar ltyp; if (!isok(x,y)) return FALSE; ltyp = levl[x][y].typ; if (ltyp == POOL || ltyp == MOAT || ltyp == WATER) return TRUE; if (ltyp == DRAWBRIDGE_UP && (levl[x][y].drawbridgemask & DB_UNDER) == DB_MOAT) return TRUE; return FALSE; } boolean is_lava(x,y) int x,y; { schar ltyp; if (!isok(x,y)) return FALSE; ltyp = levl[x][y].typ; if (ltyp == LAVAPOOL || (ltyp == DRAWBRIDGE_UP && (levl[x][y].drawbridgemask & DB_UNDER) == DB_LAVA)) return TRUE; return FALSE; } boolean is_ice(x,y) int x,y; { schar ltyp; if (!isok(x,y)) return FALSE; ltyp = levl[x][y].typ; if (ltyp == ICE || (ltyp == DRAWBRIDGE_UP && (levl[x][y].drawbridgemask & DB_UNDER) == DB_ICE)) return TRUE; return FALSE; } #endif /* OVL0 */ #ifdef OVL1 /* * We want to know whether a wall (or a door) is the portcullis (passageway) * of an eventual drawbridge. * * Return value: the direction of the drawbridge. */ int is_drawbridge_wall(x,y) int x,y; { struct rm *lev; lev = &levl[x][y]; if (lev->typ != DOOR && lev->typ != DBWALL) return (-1); if (IS_DRAWBRIDGE(levl[x+1][y].typ) && (levl[x+1][y].drawbridgemask & DB_DIR) == DB_WEST) return (DB_WEST); if (IS_DRAWBRIDGE(levl[x-1][y].typ) && (levl[x-1][y].drawbridgemask & DB_DIR) == DB_EAST) return (DB_EAST); if (IS_DRAWBRIDGE(levl[x][y-1].typ) && (levl[x][y-1].drawbridgemask & DB_DIR) == DB_SOUTH) return (DB_SOUTH); if (IS_DRAWBRIDGE(levl[x][y+1].typ) && (levl[x][y+1].drawbridgemask & DB_DIR) == DB_NORTH) return (DB_NORTH); return (-1); } /* * Use is_db_wall where you want to verify that a * drawbridge "wall" is UP in the location x, y * (instead of UP or DOWN, as with is_drawbridge_wall). */ boolean is_db_wall(x,y) int x,y; { return((boolean)( levl[x][y].typ == DBWALL )); } /* * Return true with x,y pointing to the drawbridge if x,y initially indicate * a drawbridge or drawbridge wall. */ boolean find_drawbridge(x,y) int *x,*y; { int dir; if (IS_DRAWBRIDGE(levl[*x][*y].typ)) return TRUE; dir = is_drawbridge_wall(*x,*y); if (dir >= 0) { switch(dir) { case DB_NORTH: (*y)++; break; case DB_SOUTH: (*y)--; break; case DB_EAST: (*x)--; break; case DB_WEST: (*x)++; break; } return TRUE; } return FALSE; } #endif /* OVL1 */ #ifdef OVLB /* * Find the drawbridge wall associated with a drawbridge. */ STATIC_OVL void get_wall_for_db(x,y) int *x,*y; { switch (levl[*x][*y].drawbridgemask & DB_DIR) { case DB_NORTH: (*y)--; break; case DB_SOUTH: (*y)++; break; case DB_EAST: (*x)++; break; case DB_WEST: (*x)--; break; } } /* * Creation of a drawbridge at pos x,y. * dir is the direction. * flag must be put to TRUE if we want the drawbridge to be opened. */ boolean create_drawbridge(x,y,dir,flag) int x,y,dir; boolean flag; { int x2,y2; boolean horiz; boolean lava = levl[x][y].typ == LAVAPOOL; /* assume initialized map */ x2 = x; y2 = y; switch(dir) { case DB_NORTH: horiz = TRUE; y2--; break; case DB_SOUTH: horiz = TRUE; y2++; break; case DB_EAST: horiz = FALSE; x2++; break; default: impossible("bad direction in create_drawbridge"); /* fall through */ case DB_WEST: horiz = FALSE; x2--; break; } if (!IS_WALL(levl[x2][y2].typ)) return(FALSE); if (flag) { /* We want the bridge open */ levl[x][y].typ = DRAWBRIDGE_DOWN; levl[x2][y2].typ = DOOR; levl[x2][y2].doormask = D_NODOOR; } else { levl[x][y].typ = DRAWBRIDGE_UP; levl[x2][y2].typ = DBWALL; /* Drawbridges are non-diggable. */ levl[x2][y2].wall_info = W_NONDIGGABLE; } levl[x][y].horizontal = !horiz; levl[x2][y2].horizontal = horiz; levl[x][y].drawbridgemask = dir; if(lava) levl[x][y].drawbridgemask |= DB_LAVA; return(TRUE); } struct entity { struct monst *emon; /* youmonst for the player */ struct permonst *edata; /* must be non-zero for record to be valid */ int ex, ey; }; #define ENTITIES 2 static NEARDATA struct entity occupants[ENTITIES]; STATIC_OVL struct entity * e_at(x, y) int x, y; { int entitycnt; for (entitycnt = 0; entitycnt < ENTITIES; entitycnt++) if ((occupants[entitycnt].edata) && (occupants[entitycnt].ex == x) && (occupants[entitycnt].ey == y)) break; #ifdef D_DEBUG pline("entitycnt = %d", entitycnt); wait_synch(); #endif return((entitycnt == ENTITIES)? (struct entity *)0 : &(occupants[entitycnt])); } STATIC_OVL void m_to_e(mtmp, x, y, etmp) struct monst *mtmp; int x, y; struct entity *etmp; { etmp->emon = mtmp; if (mtmp) { etmp->ex = x; etmp->ey = y; if (mtmp->wormno && (x != mtmp->mx || y != mtmp->my)) etmp->edata = &mons[PM_LONG_WORM_TAIL]; else etmp->edata = mtmp->data; } else etmp->edata = (struct permonst *)0; } STATIC_OVL void u_to_e(etmp) struct entity *etmp; { etmp->emon = &youmonst; etmp->ex = u.ux; etmp->ey = u.uy; etmp->edata = youmonst.data; } STATIC_OVL void set_entity(x, y, etmp) int x, y; struct entity *etmp; { if ((x == u.ux) && (y == u.uy)) u_to_e(etmp); else if (MON_AT(x, y)) m_to_e(m_at(x, y), x, y, etmp); else etmp->edata = (struct permonst *)0; } #define is_u(etmp) (etmp->emon == &youmonst) #define e_canseemon(etmp) (is_u(etmp) ? (boolean)TRUE : canseemon(etmp->emon)) /* * e_strg is a utility routine which is not actually in use anywhere, since * the specialized routines below suffice for all current purposes. */ /* #define e_strg(etmp, func) (is_u(etmp)? (char *)0 : func(etmp->emon)) */ STATIC_OVL const char * e_nam(etmp) struct entity *etmp; { return(is_u(etmp)? "you" : mon_nam(etmp->emon)); } #ifdef D_DEBUG /* * Enam is another unused utility routine: E_phrase is preferable. */ static const char * Enam(etmp) struct entity *etmp; { return(is_u(etmp)? "You" : Monnam(etmp->emon)); } #endif /* D_DEBUG */ /* * Generates capitalized entity name, makes 2nd -> 3rd person conversion on * verb, where necessary. */ STATIC_OVL const char * E_phrase(etmp, verb) struct entity *etmp; 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); } /* * Simple-minded "can it be here?" routine */ STATIC_OVL boolean e_survives_at(etmp, x, y) struct entity *etmp; int x, y; { if (noncorporeal(etmp->edata)) return(TRUE); if (is_pool(x, y)) return((boolean)((is_u(etmp) && (Wwalking || Amphibious || Swimming || Flying || Levitation)) || is_swimmer(etmp->edata) || is_flyer(etmp->edata) || is_floater(etmp->edata))); /* must force call to lava_effects in e_died if is_u */ if (is_lava(x, y)) return (boolean)((is_u(etmp) && (Levitation || Flying)) || likes_lava(etmp->edata) || is_flyer(etmp->edata)); if (is_db_wall(x, y)) return((boolean)(is_u(etmp) ? Passes_walls : passes_walls(etmp->edata))); return(TRUE); } STATIC_OVL void e_died(etmp, dest, how) struct entity *etmp; int dest, how; { if (is_u(etmp)) { if (how == DROWNING) { killer = 0; /* drown() sets its own killer */ (void) drown(); } else if (how == BURNING) { killer = 0; /* lava_effects() sets its own killer */ (void) lava_effects(); } else { coord xy; /* use more specific killer if specified */ if (!killer) { killer_format = KILLED_BY_AN; killer = "falling drawbridge"; } done(how); /* So, you didn't die */ if (!e_survives_at(etmp, etmp->ex, etmp->ey)) { if (enexto(&xy, etmp->ex, etmp->ey, etmp->edata)) { pline("A %s force teleports you away...", Hallucination ? "normal" : "strange"); teleds(xy.x, xy.y, FALSE); } /* otherwise on top of the drawbridge is the * only viable spot in the dungeon, so stay there */ } } /* we might have crawled out of the moat to survive */ etmp->ex = u.ux, etmp->ey = u.uy; } else { int entitycnt; killer = 0; /* fake "digested to death" damage-type suppresses corpse */ #define mk_message(dest) ((dest & 1) ? "" : (char *)0) #define mk_corpse(dest) ((dest & 2) ? AD_DGST : AD_PHYS) /* if monsters are moving, one of them caused the destruction */ if (flags.mon_moving) monkilled(etmp->emon, mk_message(dest), mk_corpse(dest)); else /* you caused it */ xkilled(etmp->emon, dest); etmp->edata = (struct permonst *)0; /* dead long worm handling */ for (entitycnt = 0; entitycnt < ENTITIES; entitycnt++) { if (etmp != &(occupants[entitycnt]) && etmp->emon == occupants[entitycnt].emon) occupants[entitycnt].edata = (struct permonst *)0; } #undef mk_message #undef mk_corpse } } /* * These are never directly affected by a bridge or portcullis. */ STATIC_OVL boolean automiss(etmp) struct entity *etmp; { return (boolean)((is_u(etmp) ? Passes_walls : passes_walls(etmp->edata)) || noncorporeal(etmp->edata)); } /* * Does falling drawbridge or portcullis miss etmp? */ STATIC_OVL boolean e_missed(etmp, chunks) struct entity *etmp; boolean chunks; { int misses; #ifdef D_DEBUG if (chunks) pline("Do chunks miss?"); #endif if (automiss(etmp)) return(TRUE); if (is_flyer(etmp->edata) && (is_u(etmp)? !Sleeping : (etmp->emon->mcanmove && !etmp->emon->msleeping))) /* flying requires mobility */ misses = 5; /* out of 8 */ else if (is_floater(etmp->edata) || (is_u(etmp) && Levitation)) /* doesn't require mobility */ misses = 3; else if (chunks && is_pool(etmp->ex, etmp->ey)) misses = 2; /* sitting ducks */ else misses = 0; if (is_db_wall(etmp->ex, etmp->ey)) misses -= 3; /* less airspace */ #ifdef D_DEBUG pline("Miss chance = %d (out of 8)", misses); #endif return((boolean)((misses >= rnd(8))? TRUE : FALSE)); } /* * Can etmp jump from death? */ STATIC_OVL boolean e_jumps(etmp) struct entity *etmp; { int tmp = 4; /* out of 10 */ if (is_u(etmp)? (Sleeping || Fumbling) : (!etmp->emon->mcanmove || etmp->emon->msleeping || !etmp->edata->mmove || etmp->emon->wormno)) return(FALSE); if (is_u(etmp)? Confusion : etmp->emon->mconf) tmp -= 2; if (is_u(etmp)? Stunned : etmp->emon->mstun) tmp -= 3; if (is_db_wall(etmp->ex, etmp->ey)) tmp -= 2; /* less room to maneuver */ #ifdef D_DEBUG pline("%s to jump (%d chances in 10)", E_phrase(etmp, "try"), tmp); #endif return((boolean)((tmp >= rnd(10))? TRUE : FALSE)); } STATIC_OVL void do_entity(etmp) struct entity *etmp; { int newx, newy, at_portcullis, oldx, oldy; boolean must_jump = FALSE, relocates = FALSE, e_inview; struct rm *crm; if (!etmp->edata) return; e_inview = e_canseemon(etmp); oldx = etmp->ex; oldy = etmp->ey; at_portcullis = is_db_wall(oldx, oldy); crm = &levl[oldx][oldy]; if (automiss(etmp) && e_survives_at(etmp, oldx, oldy)) { if (e_inview && (at_portcullis || IS_DRAWBRIDGE(crm->typ))) pline_The("%s passes through %s!", at_portcullis ? "portcullis" : "drawbridge", e_nam(etmp)); if (is_u(etmp)) spoteffects(FALSE); return; } if (e_missed(etmp, FALSE)) { if (at_portcullis) pline_The("portcullis misses %s!", e_nam(etmp)); #ifdef D_DEBUG else pline_The("drawbridge misses %s!", e_nam(etmp)); #endif if (e_survives_at(etmp, oldx, oldy)) return; else { #ifdef D_DEBUG pline("Mon can't survive here"); #endif if (at_portcullis) must_jump = TRUE; else relocates = TRUE; /* just ride drawbridge in */ } } else { if (crm->typ == DRAWBRIDGE_DOWN) { pline("%s crushed underneath the drawbridge.", E_phrase(etmp, "are")); /* no jump */ e_died(etmp, e_inview? 3 : 2, CRUSHING);/* no corpse */ return; /* Note: Beyond this point, we know we're */ } /* not at an opened drawbridge, since all */ must_jump = TRUE; /* *missable* creatures survive on the */ } /* square, and all the unmissed ones die. */ if (must_jump) { if (at_portcullis) { if (e_jumps(etmp)) { relocates = TRUE; #ifdef D_DEBUG pline("Jump succeeds!"); #endif } else { if (e_inview) pline("%s crushed by the falling portcullis!", E_phrase(etmp, "are")); else if (flags.soundok) You_hear("a crushing sound."); e_died(etmp, e_inview? 3 : 2, CRUSHING); /* no corpse */ return; } } else { /* tries to jump off bridge to original square */ relocates = !e_jumps(etmp); #ifdef D_DEBUG pline("Jump %s!", (relocates)? "fails" : "succeeds"); #endif } } /* * Here's where we try to do relocation. Assumes that etmp is not arriving * at the portcullis square while the drawbridge is falling, since this square * would be inaccessible (i.e. etmp started on drawbridge square) or * unnecessary (i.e. etmp started here) in such a situation. */ #ifdef D_DEBUG pline("Doing relocation."); #endif newx = oldx; newy = oldy; (void)find_drawbridge(&newx, &newy); if ((newx == oldx) && (newy == oldy)) get_wall_for_db(&newx, &newy); #ifdef D_DEBUG pline("Checking new square for occupancy."); #endif if (relocates && (e_at(newx, newy))) { /* * Standoff problem: one or both entities must die, and/or both switch * places. Avoid infinite recursion by checking first whether the other * entity is staying put. Clean up if we happen to move/die in recursion. */ struct entity *other; other = e_at(newx, newy); #ifdef D_DEBUG pline("New square is occupied by %s", e_nam(other)); #endif if (e_survives_at(other, newx, newy) && automiss(other)) { relocates = FALSE; /* "other" won't budge */ #ifdef D_DEBUG pline("%s suicide.", E_phrase(etmp, "commit")); #endif } else { #ifdef D_DEBUG pline("Handling %s", e_nam(other)); #endif while ((e_at(newx, newy) != 0) && (e_at(newx, newy) != etmp)) do_entity(other); #ifdef D_DEBUG pline("Checking existence of %s", e_nam(etmp)); wait_synch(); #endif if (e_at(oldx, oldy) != etmp) { #ifdef D_DEBUG pline("%s moved or died in recursion somewhere", E_phrase(etmp, "have")); wait_synch(); #endif return; } } } if (relocates && !e_at(newx, newy)) {/* if e_at() entity = worm tail */ #ifdef D_DEBUG pline("Moving %s", e_nam(etmp)); #endif if (!is_u(etmp)) { remove_monster(etmp->ex, etmp->ey); place_monster(etmp->emon, newx, newy); update_monster_region(etmp->emon); } else { u.ux = newx; u.uy = newy; } etmp->ex = newx; etmp->ey = newy; e_inview = e_canseemon(etmp); } #ifdef D_DEBUG pline("Final disposition of %s", e_nam(etmp)); wait_synch(); #endif if (is_db_wall(etmp->ex, etmp->ey)) { #ifdef D_DEBUG pline("%s in portcullis chamber", E_phrase(etmp, "are")); wait_synch(); #endif if (e_inview) { if (is_u(etmp)) { You("tumble towards the closed portcullis!"); if (automiss(etmp)) You("pass through it!"); else pline_The("drawbridge closes in..."); } else pline("%s behind the drawbridge.", E_phrase(etmp, "disappear")); } if (!e_survives_at(etmp, etmp->ex, etmp->ey)) { killer_format = KILLED_BY_AN; killer = "closing drawbridge"; e_died(etmp, 0, CRUSHING); /* no message */ return; } #ifdef D_DEBUG pline("%s in here", E_phrase(etmp, "survive")); #endif } else { #ifdef D_DEBUG pline("%s on drawbridge square", E_phrase(etmp, "are")); #endif if (is_pool(etmp->ex, etmp->ey) && !e_inview) if (flags.soundok) You_hear("a splash."); if (e_survives_at(etmp, etmp->ex, etmp->ey)) { if (e_inview && !is_flyer(etmp->edata) && !is_floater(etmp->edata)) pline("%s from the bridge.", E_phrase(etmp, "fall")); return; } #ifdef D_DEBUG pline("%s cannot survive on the drawbridge square",Enam(etmp)); #endif if (is_pool(etmp->ex, etmp->ey) || is_lava(etmp->ex, etmp->ey)) if (e_inview && !is_u(etmp)) { /* drown() will supply msgs if nec. */ boolean lava = is_lava(etmp->ex, etmp->ey); if (Hallucination) pline("%s the %s and disappears.", E_phrase(etmp, "drink"), lava ? "lava" : "moat"); else pline("%s into the %s.", E_phrase(etmp, "fall"), lava ? "lava" : "moat"); } killer_format = NO_KILLER_PREFIX; killer = "fell from a drawbridge"; e_died(etmp, e_inview ? 3 : 2, /* CRUSHING is arbitrary */ (is_pool(etmp->ex, etmp->ey)) ? DROWNING : (is_lava(etmp->ex, etmp->ey)) ? BURNING : CRUSHING); /*no corpse*/ return; } } /* * Close the drawbridge located at x,y */ void close_drawbridge(x,y) int x,y; { register struct rm *lev1, *lev2; struct trap *t; int x2, y2; lev1 = &levl[x][y]; if (lev1->typ != DRAWBRIDGE_DOWN) return; x2 = x; y2 = y; get_wall_for_db(&x2,&y2); if (cansee(x,y) || cansee(x2,y2)) You("see a drawbridge %s up!", (((u.ux == x || u.uy == y) && !Underwater) || distu(x2,y2) < distu(x,y)) ? "coming" : "going"); lev1->typ = DRAWBRIDGE_UP; lev2 = &levl[x2][y2]; lev2->typ = DBWALL; switch (lev1->drawbridgemask & DB_DIR) { case DB_NORTH: case DB_SOUTH: lev2->horizontal = TRUE; break; case DB_WEST: case DB_EAST: lev2->horizontal = FALSE; break; } lev2->wall_info = W_NONDIGGABLE; set_entity(x, y, &(occupants[0])); set_entity(x2, y2, &(occupants[1])); do_entity(&(occupants[0])); /* Do set_entity after first */ set_entity(x2, y2, &(occupants[1])); /* do_entity for worm tail */ do_entity(&(occupants[1])); if(OBJ_AT(x,y) && flags.soundok) You_hear("smashing and crushing."); (void) revive_nasty(x,y,(char *)0); (void) revive_nasty(x2,y2,(char *)0); delallobj(x, y); delallobj(x2, y2); if ((t = t_at(x, y)) != 0) deltrap(t); if ((t = t_at(x2, y2)) != 0) deltrap(t); newsym(x, y); newsym(x2, y2); block_point(x2,y2); /* vision */ } /* * Open the drawbridge located at x,y */ void open_drawbridge(x,y) int x,y; { register struct rm *lev1, *lev2; struct trap *t; int x2, y2; lev1 = &levl[x][y]; if (lev1->typ != DRAWBRIDGE_UP) return; x2 = x; y2 = y; get_wall_for_db(&x2,&y2); if (cansee(x,y) || cansee(x2,y2)) You("see a drawbridge %s down!", (distu(x2,y2) < distu(x,y)) ? "going" : "coming"); lev1->typ = DRAWBRIDGE_DOWN; lev2 = &levl[x2][y2]; lev2->typ = DOOR; lev2->doormask = D_NODOOR; set_entity(x, y, &(occupants[0])); set_entity(x2, y2, &(occupants[1])); do_entity(&(occupants[0])); /* do set_entity after first */ set_entity(x2, y2, &(occupants[1])); /* do_entity for worm tails */ do_entity(&(occupants[1])); (void) revive_nasty(x,y,(char *)0); delallobj(x, y); if ((t = t_at(x, y)) != 0) deltrap(t); if ((t = t_at(x2, y2)) != 0) deltrap(t); newsym(x, y); newsym(x2, y2); unblock_point(x2,y2); /* vision */ if (Is_stronghold(&u.uz)) u.uevent.uopened_dbridge = TRUE; } /* * Let's destroy the drawbridge located at x,y */ void destroy_drawbridge(x,y) int x,y; { register struct rm *lev1, *lev2; struct trap *t; int x2, y2; boolean e_inview; struct entity *etmp1 = &(occupants[0]), *etmp2 = &(occupants[1]); lev1 = &levl[x][y]; if (!IS_DRAWBRIDGE(lev1->typ)) return; x2 = x; y2 = y; get_wall_for_db(&x2,&y2); lev2 = &levl[x2][y2]; if ((lev1->drawbridgemask & DB_UNDER) == DB_MOAT || (lev1->drawbridgemask & DB_UNDER) == DB_LAVA) { struct obj *otmp; boolean lava = (lev1->drawbridgemask & DB_UNDER) == DB_LAVA; if (lev1->typ == DRAWBRIDGE_UP) { if (cansee(x2,y2)) pline_The("portcullis of the drawbridge falls into the %s!", lava ? "lava" : "moat"); else if (flags.soundok) You_hear("a loud *SPLASH*!"); } else { if (cansee(x,y)) pline_The("drawbridge collapses into the %s!", lava ? "lava" : "moat"); else if (flags.soundok) You_hear("a loud *SPLASH*!"); } lev1->typ = lava ? LAVAPOOL : MOAT; lev1->drawbridgemask = 0; if ((otmp = sobj_at(BOULDER,x,y)) != 0) { obj_extract_self(otmp); (void) flooreffects(otmp,x,y,"fall"); } } else { if (cansee(x,y)) pline_The("drawbridge disintegrates!"); else You_hear("a loud *CRASH*!"); lev1->typ = ((lev1->drawbridgemask & DB_ICE) ? ICE : ROOM); lev1->icedpool = ((lev1->drawbridgemask & DB_ICE) ? ICED_MOAT : 0); } wake_nearto(x, y, 500); lev2->typ = DOOR; lev2->doormask = D_NODOOR; if ((t = t_at(x, y)) != 0) deltrap(t); if ((t = t_at(x2, y2)) != 0) deltrap(t); newsym(x,y); newsym(x2,y2); if (!does_block(x2,y2,lev2)) unblock_point(x2,y2); /* vision */ if (Is_stronghold(&u.uz)) u.uevent.uopened_dbridge = TRUE; set_entity(x2, y2, etmp2); /* currently only automissers can be here */ if (etmp2->edata) { e_inview = e_canseemon(etmp2); if (!automiss(etmp2)) { if (e_inview) pline("%s blown apart by flying debris.", E_phrase(etmp2, "are")); killer_format = KILLED_BY_AN; killer = "exploding drawbridge"; e_died(etmp2, e_inview? 3 : 2, CRUSHING); /*no corpse*/ } /* nothing which is vulnerable can survive this */ } set_entity(x, y, etmp1); if (etmp1->edata) { e_inview = e_canseemon(etmp1); if (e_missed(etmp1, TRUE)) { #ifdef D_DEBUG pline("%s spared!", E_phrase(etmp1, "are")); #endif } else { if (e_inview) { if (!is_u(etmp1) && Hallucination) pline("%s into some heavy metal!", E_phrase(etmp1, "get")); else pline("%s hit by a huge chunk of metal!", E_phrase(etmp1, "are")); } else { if (flags.soundok && !is_u(etmp1) && !is_pool(x,y)) You_hear("a crushing sound."); #ifdef D_DEBUG else pline("%s from shrapnel", E_phrase(etmp1, "die")); #endif } killer_format = KILLED_BY_AN; killer = "collapsing drawbridge"; e_died(etmp1, e_inview? 3 : 2, CRUSHING); /*no corpse*/ if(lev1->typ == MOAT) do_entity(etmp1); } } } #endif /* OVLB */ /*dbridge.c*/ slashem-0.0.7E7F3/src/windows.c0000664000076400007640000001012310545462317014276 0ustar aliali/* SCCS Id: @(#)windows.c 3.4 1996/05/19 */ /* Copyright (c) D. Cohrs, 1993. */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" #ifdef TTY_GRAPHICS #include "wintty.h" #endif #ifdef X11_GRAPHICS /* cannot just blindly include winX.h without including all of X11 stuff */ /* and must get the order of include files right. Don't bother */ extern struct window_procs X11_procs; extern void NDECL(win_X11_init); #endif #ifdef QT_GRAPHICS extern struct window_procs Qt_procs; #endif #ifdef GTK_GRAPHICS /* * GTK interface (By issei@guru.gr.jp) */ extern struct window_procs GTK_procs; extern void NDECL(win_GTK_init); #endif #ifdef GEM_GRAPHICS #include "wingem.h" #endif #ifdef MAC extern struct window_procs mac_procs; #endif #ifdef BEOS_GRAPHICS extern struct window_procs beos_procs; extern void NDECL(be_win_init); #endif #ifdef AMIGA_INTUITION extern struct window_procs amii_procs; extern struct window_procs amiv_procs; extern void NDECL(ami_wininit_data); #endif #ifdef WIN32_GRAPHICS extern struct window_procs win32_procs; #endif #ifdef GNOME_GRAPHICS #include "winGnome.h" extern struct window_procs Gnome_procs; #endif #ifdef GL_GRAPHICS #include "winGL.h" extern struct window_procs sdlgl_hardw_procs; #endif #ifdef SDL_GRAPHICS #include "winGL.h" extern struct window_procs sdlgl_softw_procs; #endif #ifdef PROXY_GRAPHICS #include "winproxy.h" extern struct window_procs proxy_procs; extern void NDECL(win_proxy_init); #endif #ifdef MSWIN_GRAPHICS extern struct window_procs mswin_procs; #endif STATIC_DCL void FDECL(def_raw_print, (const char *s)); NEARDATA struct window_procs windowprocs; static struct win_choices { struct window_procs *procs; void NDECL((*ini_routine)); /* optional (can be 0) */ } winchoices[] = { #ifdef TTY_GRAPHICS { &tty_procs, win_tty_init }, #endif #ifdef X11_GRAPHICS { &X11_procs, win_X11_init }, #endif #ifdef QT_GRAPHICS { &Qt_procs, 0 }, #endif #ifdef GTK_GRAPHICS { >K_procs, win_GTK_init }, #endif #ifdef GEM_GRAPHICS { &Gem_procs, win_Gem_init }, #endif #ifdef MAC { &mac_procs, 0 }, #endif #ifdef BEOS_GRAPHICS { &beos_procs, be_win_init }, #endif #ifdef AMIGA_INTUITION { &amii_procs, ami_wininit_data }, /* Old font version of the game */ { &amiv_procs, ami_wininit_data }, /* Tile version of the game */ #endif #ifdef WIN32_GRAPHICS { &win32_procs, 0 }, #endif #ifdef GNOME_GRAPHICS { &Gnome_procs, 0 }, #endif #ifdef GL_GRAPHICS { &sdlgl_hardw_procs, 0 }, #endif #ifdef SDL_GRAPHICS { &sdlgl_softw_procs, 0 }, #endif #ifdef PROXY_GRAPHICS { &proxy_procs, win_proxy_init }, #endif #ifdef MSWIN_GRAPHICS { &mswin_procs, 0 }, #endif { 0, 0 } /* must be last */ }; STATIC_OVL void def_raw_print(s) const char *s; { puts(s); } static int windows_lock = FALSE; int lock_windows(flag) int flag; { int retval = windows_lock; windows_lock = flag; return retval; } void choose_windows(s) const char *s; { register int i; if (windows_lock) return; for(i=0; winchoices[i].procs; i++) if (!strcmpi(s, winchoices[i].procs->name)) { windowprocs = *winchoices[i].procs; if (winchoices[i].ini_routine) (*winchoices[i].ini_routine)(); return; } if (!windowprocs.win_raw_print) windowprocs.win_raw_print = def_raw_print; raw_printf("Window type %s not recognized. Choices are:", s); for(i=0; winchoices[i].procs; i++) raw_printf(" %s", winchoices[i].procs->name); if (windowprocs.win_raw_print == def_raw_print) terminate(EXIT_SUCCESS); wait_synch(); } /* * tty_message_menu() provides a means to get feedback from the * --More-- prompt; other interfaces generally don't need that. */ /*ARGSUSED*/ char genl_message_menu(let, how, mesg) char let; int how; const char *mesg; { #if defined(MAC_MPW) # pragma unused ( how,let ) #endif pline("%s", mesg); 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*/ slashem-0.0.7E7F3/src/o_init.c0000664000076400007640000003137210545462317014076 0ustar aliali/* 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. */ #include "hack.h" #include "lev.h" /* save & restore info */ STATIC_DCL void FDECL(setgemprobs, (d_level*)); STATIC_DCL void FDECL(shuffle,(int,int,BOOLEAN_P)); STATIC_DCL void NDECL(shuffle_all); STATIC_DCL boolean FDECL(interesting_to_discover,(int)); static NEARDATA short disco[NUM_OBJECTS] = DUMMY; #ifdef USE_TILES STATIC_DCL void NDECL(shuffle_tiles); extern short glyph2tile[]; /* from tile.c */ /* Shuffle tile assignments to match descriptions, so a red potion isn't * displayed with a blue tile and so on. * * Tile assignments are not saved, and shouldn't be so that a game can * be resumed on an otherwise identical non-tile-using binary, so we have * to reshuffle the assignments from oc_descr_idx information when a game * is restored. So might as well do that the first time instead of writing * another routine. */ STATIC_OVL void shuffle_tiles() { int i; short tmp_tilemap[NUM_OBJECTS]; for (i = 0; i < NUM_OBJECTS; i++) tmp_tilemap[i] = glyph2tile[objects[i].oc_descr_idx + GLYPH_OBJ_OFF]; for (i = 0; i < NUM_OBJECTS; i++) glyph2tile[i + GLYPH_OBJ_OFF] = tmp_tilemap[i]; } #endif /* USE_TILES */ #ifdef PROXY_GRAPHICS STATIC_DCL void NDECL(shuffle_proxy_glyphs); extern short glyph2proxy[]; /* from glyphmap.c */ /* Shuffle proxy glyph assignments for the same reason as tiles * (internal glyphs are based on object numbers, proxy glyphs * are based on object descriptions). */ STATIC_OVL void shuffle_proxy_glyphs() { int i; short tmp_glyphmap[NUM_OBJECTS]; for (i = 0; i < NUM_OBJECTS; i++) tmp_glyphmap[i] = glyph2proxy[objects[i].oc_descr_idx + GLYPH_OBJ_OFF]; for (i = 0; i < NUM_OBJECTS; i++) glyph2proxy[i + GLYPH_OBJ_OFF] = tmp_glyphmap[i]; } #endif /* USE_TILES */ STATIC_OVL void setgemprobs(dlev) d_level *dlev; { int j, first, lev; if (dlev) lev = (ledger_no(dlev) > maxledgerno()) ? maxledgerno() : ledger_no(dlev); else lev = 0; first = bases[GEM_CLASS]; for(j = 0; j < 9-lev/3; j++) objects[first+j].oc_prob = 0; first += j; if (first > LAST_GEM || objects[first].oc_class != GEM_CLASS || OBJ_NAME(objects[first]) == (char *)0) { raw_printf("Not enough gems? - first=%d j=%d LAST_GEM=%d", first, j, LAST_GEM); wait_synch(); } for (j = first; j <= LAST_GEM; j++) /* KMH, balance patch -- valuable gems now sum to 171 */ objects[j].oc_prob = (171+j-first)/(LAST_GEM+1-first); } /* shuffle descriptions on objects o_low to o_high */ STATIC_OVL void shuffle(o_low, o_high, domaterial) int o_low, o_high; boolean domaterial; { int i, j, num_to_shuffle; short sw; int color; for (num_to_shuffle = 0, j=o_low; j <= o_high; j++) if (!objects[j].oc_name_known) num_to_shuffle++; if (num_to_shuffle < 2) return; for (j=o_low; j <= o_high; j++) { if (objects[j].oc_name_known) continue; do i = j + rn2(o_high-j+1); while (objects[i].oc_name_known); sw = objects[j].oc_descr_idx; objects[j].oc_descr_idx = objects[i].oc_descr_idx; objects[i].oc_descr_idx = sw; 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; objects[j].oc_material = objects[i].oc_material; objects[i].oc_material = sw; } } } void init_objects() { register int i, first, last, sum; register char oclass; #ifdef TEXTCOLOR # define COPY_OBJ_DESCR(o_dst,o_src) \ o_dst.oc_descr_idx = o_src.oc_descr_idx,\ o_dst.oc_color = o_src.oc_color #else # define COPY_OBJ_DESCR(o_dst,o_src) o_dst.oc_descr_idx = o_src.oc_descr_idx #endif /* bug fix to prevent "initialization error" abort on Intel Xenix. * reported by mikew@semike */ for (i = 0; i < MAXOCLASSES; i++) bases[i] = 0; /* initialize object descriptions */ for (i = 0; i < NUM_OBJECTS; i++) objects[i].oc_name_idx = objects[i].oc_descr_idx = i; /* init base; if probs given check that they add up to 1000, otherwise compute probs */ first = 0; while( first < NUM_OBJECTS ) { oclass = objects[first].oc_class; last = first+1; while (last < NUM_OBJECTS && objects[last].oc_class == oclass) last++; bases[(int)oclass] = first; if (oclass == GEM_CLASS) { setgemprobs((d_level *)0); if (rn2(2)) { /* change turquoise from green to blue? */ COPY_OBJ_DESCR(objects[TURQUOISE],objects[SAPPHIRE]); } if (rn2(2)) { /* change aquamarine from green to blue? */ COPY_OBJ_DESCR(objects[AQUAMARINE],objects[SAPPHIRE]); } switch (rn2(4)) { /* change fluorite from violet? */ case 0: break; case 1: /* blue */ COPY_OBJ_DESCR(objects[FLUORITE],objects[SAPPHIRE]); break; case 2: /* white */ COPY_OBJ_DESCR(objects[FLUORITE],objects[DIAMOND]); break; case 3: /* green */ COPY_OBJ_DESCR(objects[FLUORITE],objects[EMERALD]); break; } } check: sum = 0; for(i = first; i < last; i++) sum += objects[i].oc_prob; if(sum == 0) { for(i = first; i < last; i++) objects[i].oc_prob = (1000+i-first)/(last-first); goto check; } if(sum != sum) error("init-prob error for class %d (%d%%)", oclass, sum); first = last; } /* shuffle descriptions */ shuffle_all(); #ifdef USE_TILES shuffle_tiles(); #endif #ifdef PROXY_GRAPHICS shuffle_proxy_glyphs(); #endif } STATIC_OVL void shuffle_all() { int first, last, oclass; for (oclass = 1; oclass < MAXOCLASSES; oclass++) { first = bases[oclass]; last = first+1; while (last < NUM_OBJECTS && objects[last].oc_class == oclass) last++; if (OBJ_DESCR(objects[first]) != (char *)0 && oclass != TOOL_CLASS && oclass != WEAPON_CLASS && oclass != ARMOR_CLASS && oclass != GEM_CLASS) { int j = last-1; if (oclass == POTION_CLASS) /* water and following have fixed descriptions */ j = POT_WATER - 1; else if (oclass == AMULET_CLASS || oclass == SCROLL_CLASS || oclass == SPBOOK_CLASS) { while (!objects[j].oc_magic || objects[j].oc_unique) j--; } /* non-magical amulets, scrolls, and spellbooks * (ex. imitation Amulets, blank, scrolls of mail) * and one-of-a-kind magical artifacts at the end of * their class in objects[] have fixed descriptions. */ shuffle(first, j, TRUE); } } /* shuffle the helmets */ shuffle(HELMET, HELM_OF_TELEPATHY, FALSE); /* shuffle the gloves */ shuffle(LEATHER_GLOVES, GAUNTLETS_OF_DEXTERITY, FALSE); /* shuffle the robes */ shuffle(ROBE, ROBE_OF_WEAKNESS, FALSE); /* shuffle the cloaks */ shuffle(CLOAK_OF_PROTECTION, CLOAK_OF_DISPLACEMENT, FALSE); /* shuffle the boots [if they change, update find_skates() below] */ shuffle(SPEED_BOOTS, LEVITATION_BOOTS, FALSE); } /* find the object index for snow boots; used [once] by slippery ice code */ int find_skates() { register int i; register const char *s; for (i = SPEED_BOOTS; i <= LEVITATION_BOOTS; i++) if ((s = OBJ_DESCR(objects[i])) != 0 && !strcmp(s, "snow boots")) return i; impossible("snow boots not found?"); return -1; /* not 0, or caller would try again each move */ } void oinit() /* level dependent initialization */ { setgemprobs(&u.uz); } void savenames(fd, mode) int fd, mode; { register int i; unsigned int len; if (perform_bwrite(mode)) { bwrite(fd, (genericptr_t)bases, sizeof bases); bwrite(fd, (genericptr_t)disco, sizeof disco); bwrite(fd, (genericptr_t)objects, sizeof(struct objclass) * NUM_OBJECTS); } /* as long as we use only one version of Hack we need not save oc_name and oc_descr, but we must save oc_uname for all objects */ for (i = 0; i < NUM_OBJECTS; i++) if (objects[i].oc_uname) { if (perform_bwrite(mode)) { len = strlen(objects[i].oc_uname)+1; bwrite(fd, (genericptr_t)&len, sizeof len); bwrite(fd, (genericptr_t)objects[i].oc_uname, len); } if (release_data(mode)) { free((genericptr_t)objects[i].oc_uname); objects[i].oc_uname = 0; } } } void restnames(fd) register int fd; { register int i; unsigned int len; mread(fd, (genericptr_t) bases, sizeof bases); mread(fd, (genericptr_t) disco, sizeof disco); mread(fd, (genericptr_t) objects, sizeof(struct objclass) * NUM_OBJECTS); for (i = 0; i < NUM_OBJECTS; i++) if (objects[i].oc_uname) { mread(fd, (genericptr_t) &len, sizeof len); objects[i].oc_uname = (char *) alloc(len); mread(fd, (genericptr_t)objects[i].oc_uname, len); } #ifdef USE_TILES shuffle_tiles(); #endif #ifdef PROXY_GRAPHICS shuffle_proxy_glyphs(); #endif } void discover_object(oindx, mark_as_known, credit_hero) register int oindx; boolean mark_as_known; boolean credit_hero; { /* KMH -- If we are hallucinating, we aren't sure of the object description */ if (Hallucination) return; if (!objects[oindx].oc_name_known) { register int dindx, acls = objects[oindx].oc_class; /* Loop thru disco[] 'til we find the target (which may have been uname'd) or the next open slot; one or the other will be found before we reach the next class... */ for (dindx = bases[acls]; disco[dindx] != 0; dindx++) if (disco[dindx] == oindx) break; disco[dindx] = oindx; if (mark_as_known) { objects[oindx].oc_name_known = 1; if (credit_hero) exercise(A_WIS, TRUE); } if (moves > 1L) update_inventory(); } } /* if a class name has been cleared, we may need to purge it from disco[] */ void undiscover_object(oindx) register int oindx; { if (!objects[oindx].oc_name_known) { register int dindx, acls = objects[oindx].oc_class; register boolean found = FALSE; /* find the object; shift those behind it forward one slot */ for (dindx = bases[acls]; dindx < NUM_OBJECTS && disco[dindx] != 0 && objects[dindx].oc_class == acls; dindx++) if (found) disco[dindx-1] = disco[dindx]; else if (disco[dindx] == oindx) found = TRUE; /* clear last slot */ if (found) disco[dindx-1] = 0; else impossible("named object not in disco"); update_inventory(); } } STATIC_OVL boolean interesting_to_discover(i) register int i; { /* Pre-discovered objects are now printed with a '*' */ return((boolean)(objects[i].oc_uname != (char *)0 || (objects[i].oc_name_known && OBJ_DESCR(objects[i]) != (char *)0))); } /* items that should stand out once they're known */ static short uniq_objs[] = { AMULET_OF_YENDOR, SPE_BOOK_OF_THE_DEAD, CANDELABRUM_OF_INVOCATION, BELL_OF_OPENING, }; int dodiscovered() /* free after Robert Viduya */ { register int i, dis; int ct = 0; char *s, oclass, prev_class, classes[MAXOCLASSES]; char buf[BUFSZ]; /* WAC */ winid tmpwin; anything any; menu_item *selected; tmpwin = create_nhwindow(NHW_MENU); /* * Use the add_menu() interface so that eg., GTK windowing port * can display the relevant glyphs --ALI */ start_menu(tmpwin); any.a_void = 0; add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_BOLD, "Discoveries", MENU_UNSELECTED); add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, "", MENU_UNSELECTED); /* gather "unique objects" into a pseudo-class; note that they'll also be displayed individually within their regular class */ for (i = dis = 0; i < SIZE(uniq_objs); i++) if (objects[uniq_objs[i]].oc_name_known) { if (!dis++) add_menu(tmpwin, NO_GLYPH, &any, 0, 0, iflags.menu_headings, "Unique Items", MENU_UNSELECTED); Sprintf(buf, " %s", OBJ_NAME(objects[uniq_objs[i]])); add_menu(tmpwin, objnum_to_glyph(uniq_objs[i]), &any, 0, 0, ATR_NONE, buf, MENU_UNSELECTED); ++ct; } /* display any known artifacts as another pseudo-class */ ct += disp_artifact_discoveries(tmpwin); /* several classes are omitted from packorder; one is of interest here */ Strcpy(classes, flags.inv_order); if (!index(classes, VENOM_CLASS)) { s = eos(classes); *s++ = VENOM_CLASS; *s = '\0'; } for (s = classes; *s; s++) { oclass = *s; prev_class = oclass + 1; /* forced different from oclass */ for (i = bases[(int)oclass]; i < NUM_OBJECTS && objects[i].oc_class == oclass; i++) { if ((dis = disco[i]) && interesting_to_discover(dis)) { ct++; if (oclass != prev_class) { add_menu(tmpwin, NO_GLYPH, &any, 0, 0, iflags.menu_headings, let_to_name(oclass, FALSE), MENU_UNSELECTED); prev_class = oclass; } Sprintf(buf, "%s %s",(objects[dis].oc_pre_discovered ? "*" : " "), obj_typename(dis)); add_menu(tmpwin, objnum_to_glyph(dis), &any, 0, 0, ATR_NONE, buf, MENU_UNSELECTED); } } } end_menu(tmpwin, (char *) 0); if (ct == 0) { You("haven't discovered anything yet..."); } else (void) select_menu(tmpwin, PICK_NONE, &selected); destroy_nhwindow(tmpwin); return 0; } /*o_init.c*/ slashem-0.0.7E7F3/src/potion.c0000644000076400007640000024535310545462317014131 0ustar aliali/* SCCS Id: @(#)potion.c 3.4 2002/10/02 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" /* KMH, intrinsics patch * There are many changes here to support >32-bit properties. * Also, blessed potions are once again permitted to convey * permanent intrinsics. */ #ifdef OVLB boolean notonhead = FALSE; static NEARDATA int nothing, unkn; static NEARDATA const char beverages[] = { POTION_CLASS, 0 }; STATIC_DCL long FDECL(itimeout, (long)); STATIC_DCL long FDECL(itimeout_incr, (long,int)); STATIC_DCL void NDECL(ghost_from_bottle); STATIC_DCL short FDECL(mixtype, (struct obj *,struct obj *)); STATIC_DCL void FDECL(healup_mon, (struct monst *, int,int,BOOLEAN_P,BOOLEAN_P)); /* For healing monsters - analogous to healup for players */ /* force `val' to be within valid range for intrinsic timeout value */ STATIC_OVL long itimeout(val) long val; { if (val >= TIMEOUT) val = TIMEOUT; else if (val < 1) val = 0; return val; } /* increment `old' by `incr' and force result to be valid intrinsic timeout */ STATIC_OVL long itimeout_incr(old, incr) long old; int incr; { return itimeout((old & TIMEOUT) + (long)incr); } /* set the timeout field of intrinsic `which' */ void set_itimeout(which, val) long *which, val; { *which &= ~TIMEOUT; *which |= itimeout(val); } /* increment the timeout field of intrinsic `which' */ void incr_itimeout(which, incr) long *which; int incr; { set_itimeout(which, itimeout_incr(*which, incr)); } void make_confused(xtime,talk) long xtime; boolean talk; { long old = HConfusion; if (!xtime && old) { if (talk) You_feel("less %s now.", Hallucination ? "trippy" : "confused"); } if ((xtime && !old) || (!xtime && old)) flags.botl = TRUE; set_itimeout(&HConfusion, xtime); } void make_stunned(xtime,talk) long xtime; boolean talk; { long old = HStun; if (!xtime && old) { if (talk) You_feel("%s now.", 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; set_itimeout(&HStun, xtime); } void make_sick(xtime, cause, talk, type) long xtime; const char *cause; /* sickness cause */ boolean talk; int type; { long old = Sick; if (xtime > 0L) { if (Sick_resistance) return; if (!old) { /* newly sick */ You_feel("deathly sick."); } else { /* already sick */ if (talk) You_feel("%s worse.", xtime <= Sick/2L ? "much" : "even"); } set_itimeout(&Sick, xtime); u.usick_type |= type; flags.botl = TRUE; } else if (old && (type & u.usick_type)) { /* was sick, now not */ u.usick_type &= ~type; if (u.usick_type) { /* only partly cured */ if (talk) You_feel("somewhat better."); set_itimeout(&Sick, Sick * 2); /* approximation */ } else { if (talk) pline("What a relief!"); Sick = 0L; /* set_itimeout(&Sick, 0L) */ } flags.botl = TRUE; } if (Sick) { exercise(A_CON, FALSE); if (cause) { (void) strncpy(u.usick_cause, cause, sizeof(u.usick_cause)); u.usick_cause[sizeof(u.usick_cause)-1] = 0; } else u.usick_cause[0] = 0; } else u.usick_cause[0] = 0; } void make_vomiting(xtime, talk) long xtime; boolean talk; { long old = Vomiting; if(!xtime && old) if(talk) You_feel("much less nauseated now."); set_itimeout(&Vomiting, xtime); } static const char vismsg[] = "vision seems to %s for a moment but is %s now."; static const char eyemsg[] = "%s momentarily %s."; void make_blinded(xtime, talk) long xtime; boolean talk; { long old = Blinded; boolean u_could_see, can_see_now; int eyecnt; char buf[BUFSZ]; /* 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(); } } boolean make_hallucinated(xtime, talk, mask) long xtime; /* nonzero if this is an attempt to turn on hallucination */ boolean talk; long mask; /* nonzero if resistance status should change by mask */ { long old = HHallucination; boolean changed = 0; const char *message, *verb; message = (!xtime) ? "Everything %s SO boring now." : "Oh wow! Everything %s so cosmic!"; verb = (!Blind) ? "looks" : "feels"; if (mask) { if (HHallucination) changed = TRUE; if (!xtime) EHalluc_resistance |= mask; else EHalluc_resistance &= ~mask; } else { if (!EHalluc_resistance && (!!HHallucination != !!xtime)) changed = TRUE; set_itimeout(&HHallucination, xtime); /* clearing temporary hallucination without toggling vision */ if (!changed && !HHallucination && old && talk) { if (!haseyes(youmonst.data)) { strange_feeling((struct obj *)0, (char *)0); } else if (Blind) { char buf[BUFSZ]; int eyecnt = eyecount(youmonst.data); Strcpy(buf, body_part(EYE)); Your(eyemsg, (eyecnt == 1) ? buf : makeplural(buf), (eyecnt == 1) ? "itches" : "itch"); } else { /* Grayswandir */ Your(vismsg, "flatten", "normal"); } } } if (changed) { if (u.uswallow) { swallowed(0); /* redraw swallow display */ } else { /* The see_* routines should be called *before* the pline. */ see_monsters(); see_objects(); see_traps(); } /* for perm_inv and anything similar (eg. Qt windowport's equipped items display) */ update_inventory(); flags.botl = 1; if (talk) pline(message, verb); } return changed; } STATIC_OVL void ghost_from_bottle() { struct monst *mtmp = makemon(&mons[PM_GHOST], u.ux, u.uy, NO_MM_FLAGS); if (!mtmp) { pline("This bottle turns out to be empty."); return; } if (Blind) { pline("As you open the bottle, %s emerges.", something); return; } pline("As you open the bottle, an enormous %s emerges!", Hallucination ? rndmonnam() : (const char *)"ghost"); if(flags.verbose) You("are frightened to death, and unable to move."); nomul(-3); nomovemsg = "You regain your composure."; } /* "Quaffing is like drinking, except you spill more." -- Terry Pratchett */ int dodrink() { register struct obj *otmp; const char *potion_descr; char quaffables[SIZE(beverages) + 2]; char *qp = quaffables; if (Strangled) { pline("If you can't breathe air, how can you drink liquid?"); return 0; } *qp++ = ALLOW_FLOOROBJ; if (!u.uswallow && (IS_FOUNTAIN(levl[u.ux][u.uy].typ) || #ifdef SINKS IS_SINK(levl[u.ux][u.uy].typ) || IS_TOILET(levl[u.ux][u.uy].typ) || #endif Underwater || IS_POOL(levl[u.ux][u.uy].typ))) *qp++ = ALLOW_THISPLACE; Strcpy(qp, beverages); otmp = getobj(quaffables, "drink"); if (otmp == &thisplace) { if (IS_FOUNTAIN(levl[u.ux][u.uy].typ)) { drinkfountain(); return 1; } #ifdef SINKS else if (IS_SINK(levl[u.ux][u.uy].typ)) { drinksink(); return 1; } else if (IS_TOILET(levl[u.ux][u.uy].typ)) { drinktoilet(); return 1; } #endif pline("Do you know what lives in this water!"); return 1; } if(!otmp) return(0); otmp->in_use = TRUE; /* you've opened the stopper */ #define POTION_OCCUPANT_CHANCE(n) (13 + 2*(n)) /* also in muse.c */ potion_descr = OBJ_DESCR(objects[otmp->otyp]); if (potion_descr) { if (!strcmp(potion_descr, "milky") && flags.ghost_count < MAXMONNO && !rn2(POTION_OCCUPANT_CHANCE(flags.ghost_count))) { ghost_from_bottle(); if (carried(otmp)) useup(otmp); else useupf(otmp, 1L); return(1); } else if (!strcmp(potion_descr, "smoky") && (flags.djinni_count < MAXMONNO) && !rn2(POTION_OCCUPANT_CHANCE(flags.djinni_count))) { djinni_from_bottle(otmp); if (carried(otmp)) useup(otmp); else useupf(otmp, 1L); return(1); } } return dopotion(otmp); } int dopotion(otmp) register struct obj *otmp; { int retval; otmp->in_use = TRUE; nothing = unkn = 0; if((retval = peffects(otmp)) >= 0) return(retval); if(nothing) { unkn++; You("have a %s feeling for a moment, then it passes.", Hallucination ? "normal" : "peculiar"); } if(otmp->dknown && !objects[otmp->otyp].oc_name_known) { if(!unkn) { makeknown(otmp->otyp); more_experienced(0,10); } else if(!objects[otmp->otyp].oc_uname) docall(otmp); } if (carried(otmp)) useup(otmp); else if (mcarried(otmp)) m_useup(otmp->ocarry, otmp); else if (otmp->where == OBJ_FLOOR) useupf(otmp, 1L); else dealloc_obj(otmp); /* Dummy potion */ return(1); } /* return -1 if potion is used up, 0 if error, 1 not used */ int peffects(otmp) register struct obj *otmp; { register int i, ii, lim; /* KMH, balance patch -- this is too cruel for novices */ #if 0 /* sometimes your constitution can be a little _too_ high! */ if ((Role_if(PM_BARBARIAN) || ACURR(A_CON) > 15) && !rn2(5)) { pline("Strange ..."); nothing++; return(-1); } #endif switch(otmp->otyp){ case POT_RESTORE_ABILITY: case SPE_RESTORE_ABILITY: unkn++; if(otmp->cursed) { pline("Ulch! This makes you feel mediocre!"); 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); if (i == A_STR && u.uhs >= 3) --lim; /* WEAK */ if (ABASE(i) < lim) { ABASE(i) = lim; flags.botl = 1; /* only first found if not blessed */ if (!otmp->blessed) break; } if(++i >= A_MAX) i = 0; } } break; case POT_HALLUCINATION: if (Hallucination || Halluc_resistance) nothing++; else makeknown(otmp->otyp); (void) make_hallucinated(itimeout_incr(HHallucination, rn1(200, 600 - 300 * bcsign(otmp))), TRUE, 0L); break; case POT_AMNESIA: pline(Hallucination? "This tastes like champagne!" : "This liquid bubbles and fizzes as you drink it."); forget((!otmp->blessed? ALL_SPELLS : 0) | ALL_MAP); if (Hallucination) pline("Hakuna matata!"); else You_feel("your memories dissolve."); /* Blessed amnesia makes you forget lycanthropy, sickness */ if (otmp->blessed) { if (u.ulycn >= LOW_PM && !Race_if(PM_HUMAN_WEREWOLF)) { You("forget your affinity to %s!", makeplural(mons[u.ulycn].mname)); if (youmonst.data == &mons[u.ulycn]) you_unwere(FALSE); u.ulycn = NON_PM; /* cure lycanthropy */ } make_sick(0L, (char *) 0, TRUE, SICK_ALL); /* You feel refreshed */ u.uhunger += 50 + rnd(50); newuhs(FALSE); } else exercise(A_WIS, FALSE); break; case POT_WATER: if(!otmp->blessed && !otmp->cursed) { pline("This tastes like water."); u.uhunger += rnd(10); newuhs(FALSE); break; } unkn++; if(is_undead(youmonst.data) || is_demon(youmonst.data) || u.ualign.type == A_CHAOTIC) { if(otmp->blessed) { pline("This burns like acid!"); exercise(A_CON, FALSE); if (u.ulycn >= LOW_PM && !Race_if(PM_HUMAN_WEREWOLF)) { Your("affinity to %s disappears!", makeplural(mons[u.ulycn].mname)); if (youmonst.data == &mons[u.ulycn]) you_unwere(FALSE); u.ulycn = NON_PM; /* cure lycanthropy */ } losehp(d(6,6), "potion of holy water", KILLED_BY_AN); } else if(otmp->cursed) { You_feel("quite proud of yourself."); healup(d(6,6),0,0,0); if (u.ulycn >= LOW_PM && !Upolyd) you_were(); exercise(A_CON, TRUE); } } else { if(otmp->blessed) { You_feel("full of awe."); if(u.ualign.type == A_LAWFUL) healup(d(6,6),0,0,0); make_sick(0L, (char *) 0, TRUE, SICK_ALL); exercise(A_WIS, TRUE); exercise(A_CON, TRUE); if (u.ulycn >= LOW_PM && !Race_if(PM_HUMAN_WEREWOLF)) { you_unwere(TRUE); /* "Purified" */ } /* make_confused(0L,TRUE); */ } else { if(u.ualign.type == A_LAWFUL) { pline("This burns like acid!"); losehp(d(6,6), "potion of unholy water", KILLED_BY_AN); } else You_feel("full of dread."); if (u.ulycn >= LOW_PM && !Upolyd) you_were(); exercise(A_CON, FALSE); } } break; case POT_BOOZE: unkn++; pline("Ooph! This tastes like %s%s!", otmp->odiluted ? "watered down " : "", Hallucination ? "dandelion wine" : "liquid fire"); if (!otmp->blessed) make_confused(itimeout_incr(HConfusion, d(3,8)), FALSE); /* the whiskey makes us feel better */ if (!otmp->odiluted) healup(1, 0, FALSE, FALSE); u.uhunger += 10 * (2 + bcsign(otmp)); newuhs(FALSE); exercise(A_WIS, FALSE); if(otmp->cursed) { You("pass out."); multi = -rnd(15); nomovemsg = "You awake with a headache."; } break; case POT_ENLIGHTENMENT: if(otmp->cursed) { unkn++; You("have an uneasy feeling..."); exercise(A_WIS, FALSE); } else { if (otmp->blessed) { (void) adjattrib(A_INT, 1, FALSE); (void) adjattrib(A_WIS, 1, FALSE); } You_feel("self-knowledgeable..."); display_nhwindow(WIN_MESSAGE, FALSE); enlightenment(0); pline_The("feeling subsides."); exercise(A_WIS, TRUE); } break; case SPE_INVISIBILITY: /* spell cannot penetrate mummy wrapping */ if (BInvis && uarmc->otyp == MUMMY_WRAPPING) { You_feel("rather itchy under your %s.", xname(uarmc)); break; } /* FALLTHRU */ case POT_INVISIBILITY: if (Invis || Blind || BInvis) { nothing++; } else { self_invis_message(); } if (otmp->blessed) HInvis |= FROMOUTSIDE; else incr_itimeout(&HInvis, rn1(15,31)); newsym(u.ux,u.uy); /* update position */ if(otmp->cursed) { pline("For some reason, you feel your presence is known."); aggravate(); } break; case POT_SEE_INVISIBLE: /* tastes like fruit juice in Rogue */ case POT_FRUIT_JUICE: { int msg = Invisible && !Blind; unkn++; if (otmp->cursed) pline("Yecch! This tastes %s.", Hallucination ? "overripe" : "rotten"); else pline(Hallucination ? "This tastes like 10%% real %s%s all-natural beverage." : "This tastes like %s%s.", otmp->odiluted ? "reconstituted " : "", fruitname(TRUE)); if (otmp->otyp == POT_FRUIT_JUICE) { u.uhunger += (otmp->odiluted ? 5 : 10) * (2 + bcsign(otmp)); newuhs(FALSE); break; } if (!otmp->cursed) { /* Tell them they can see again immediately, which * will help them identify the potion... */ make_blinded(0L,TRUE); } if (otmp->blessed) HSee_invisible |= FROMOUTSIDE; else incr_itimeout(&HSee_invisible, rn1(100,750)); set_mimic_blocking(); /* do special mimic handling */ see_monsters(); /* see invisible monsters */ newsym(u.ux,u.uy); /* see yourself! */ if (msg && !Blind) { /* Blind possible if polymorphed */ You("can see through yourself, but you are visible!"); unkn--; } break; } case POT_PARALYSIS: if (Free_action) You("stiffen momentarily."); else { if (Levitation || Is_airlevel(&u.uz)||Is_waterlevel(&u.uz)) You("are motionlessly suspended."); #ifdef STEED else if (u.usteed) You("are frozen in place!"); #endif else Your("%s are frozen to the %s!", makeplural(body_part(FOOT)), surface(u.ux, u.uy)); nomul(-(rn1(10, 25 - 12*bcsign(otmp)))); nomovemsg = You_can_move_again; exercise(A_DEX, FALSE); } break; case POT_SLEEPING: if(Sleep_resistance || Free_action) You("yawn."); else { You("suddenly fall asleep!"); fall_asleep(-rn1(10, 25 - 12*bcsign(otmp)), TRUE); } break; case POT_MONSTER_DETECTION: case SPE_DETECT_MONSTERS: if (otmp->blessed) { int x, y; 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 (memory_is_invisible(x, y)) { unmap_object(x, y); newsym(x,y); } if (MON_AT(x,y)) unkn = 0; } } see_monsters(); if (unkn) You_feel("lonely."); break; } if (monster_detect(otmp, 0)) return(1); /* nothing detected */ exercise(A_WIS, TRUE); break; case POT_OBJECT_DETECTION: case SPE_DETECT_TREASURE: if (object_detect(otmp, 0)) return(1); /* nothing detected */ exercise(A_WIS, TRUE); break; case POT_SICKNESS: pline("Yecch! This stuff tastes like poison."); if (otmp->blessed) { pline("(But in fact it was mildly stale %s.)", fruitname(TRUE)); if (!Role_if(PM_HEALER)) { /* NB: blessed otmp->fromsink is not possible */ losehp(1, "mildly contaminated potion", KILLED_BY_AN); } } else { if(Poison_resistance) pline( "(But in fact it was biologically contaminated %s.)", fruitname(TRUE)); if (Role_if(PM_HEALER)) pline("Fortunately, you have been immunized."); else { int typ = rn2(A_MAX); if (!Fixed_abil) { poisontell(typ); (void) adjattrib(typ, Poison_resistance ? -1 : -rn1(4,3), TRUE); } if(!Poison_resistance) { if (otmp->fromsink) 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); } } if(Hallucination) { You("are shocked back to your senses!"); (void) make_hallucinated(0L,FALSE,0L); } break; case POT_CONFUSION: if(!Confusion) { if (Hallucination) { pline("What a trippy feeling!"); unkn++; } else pline("Huh, What? Where am I?"); } else nothing++; make_confused(itimeout_incr(HConfusion, rn1(7, 16 - 8 * bcsign(otmp))), FALSE); break; case POT_CLAIRVOYANCE: /* KMH -- handle cursed, blessed, blocked */ if (otmp->cursed) nothing++; else if (!BClairvoyant) { if (Hallucination) pline("Dude! See-through walls!"); do_vicinity_map(); } if (otmp->blessed) incr_itimeout(&HClairvoyant, rn1(50, 100)); break; case POT_ESP: { const char *mod; /* KMH -- handle cursed, blessed */ if (otmp->cursed) { if (HTelepat) mod = "less "; else { unkn++; mod = NULL; } HTelepat = 0; } else if (otmp->blessed) { mod = "fully "; incr_itimeout(&HTelepat, rn1(100, 200)); HTelepat |= FROMOUTSIDE; } else { mod = "more "; incr_itimeout(&HTelepat, rn1(50, 100)); } if (mod) You_feel(Hallucination ? "%sin touch with the cosmos." : "%smentally acute.", mod); see_monsters(); break; } /* KMH, balance patch -- removed case POT_FIRE_RESISTANCE: if(!(HFire_resistance & FROMOUTSIDE)) { if (Hallucination) pline("You feel, like, totally cool!"); else You("feel cooler."); HFire_resistance += rn1(100,50); unkn++; HFire_resistance |= FROMOUTSIDE; } break;*/ case POT_INVULNERABILITY: incr_itimeout(&Invulnerable, rn1(4, 8 + 4 * bcsign(otmp))); You_feel(Hallucination ? "like a super-duper hero!" : "invulnerable!"); break; case POT_GAIN_ABILITY: 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 */ for (ii = A_MAX; ii > 0; ii--) { i = (otmp->blessed ? i + 1 : rn2(A_MAX)); /* only give "your X is already as high as it can get" message on last attempt (except blessed potions) */ itmp = (otmp->blessed || ii == 1) ? 0 : -1; if (adjattrib(i, 1, itmp) && !otmp->blessed) break; } } 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) You("are suddenly moving %sfaster.", Fast ? "" : "much "); else { Your("%s get new energy.", makeplural(body_part(LEG))); unkn++; } exercise(A_DEX, TRUE); incr_itimeout(&HFast, rn1(10, 100 + 60 * bcsign(otmp))); break; case POT_BLINDNESS: if(Blind) nothing++; make_blinded(itimeout_incr(Blinded, rn1(200, 250 - 125 * bcsign(otmp))), (boolean)!Blind); break; case POT_GAIN_LEVEL: if (otmp->cursed) { unkn++; /* they went up a level */ if((ledger_no(&u.uz) == 1 && u.uhave.amulet) || Can_rise_up(u.ux, u.uy, &u.uz)) { const char *riseup ="rise up, through the %s!"; /* [ALI] Special handling for quaffing potions * off the floor (otmp won't be valid after * we change levels otherwise). */ if (otmp->where == OBJ_FLOOR) { if (otmp->quan > 1) (void) splitobj(otmp, 1); /* Make sure you're charged if in shop */ otmp->quan++; useupf(otmp, 1); obj_extract_self(otmp); } if(ledger_no(&u.uz) == 1) { You(riseup, ceiling(u.ux,u.uy)); goto_level(&earth_level, FALSE, FALSE, FALSE); } else { register int newlev = depth(&u.uz)-1; d_level newlevel; get_level(&newlevel, newlev); if(on_level(&newlevel, &u.uz)) { pline("It tasted bad."); break; } else You(riseup, ceiling(u.ux,u.uy)); goto_level(&newlevel, FALSE, FALSE, FALSE); } } else You("have an uneasy feeling."); break; } pluslvl(FALSE); if (otmp->blessed) /* blessed potions place you at a random spot in the * middle of the new level instead of the low point */ u.uexp = rndexp(TRUE); break; case POT_HEALING: You_feel("better."); healup(d(5,6) + 5 * bcsign(otmp), !otmp->cursed ? 1 : 0, 1+1*!!otmp->blessed, !otmp->cursed); exercise(A_CON, TRUE); break; case POT_EXTRA_HEALING: You_feel("much better."); healup(d(6,8) + 5 * bcsign(otmp), otmp->blessed ? 5 : !otmp->cursed ? 2 : 0, !otmp->cursed, TRUE); (void) make_hallucinated(0L,TRUE,0L); 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); } (void) make_hallucinated(0L,TRUE,0L); exercise(A_STR, TRUE); exercise(A_CON, TRUE); break; case POT_LEVITATION: case SPE_LEVITATION: if (otmp->cursed) HLevitation &= ~I_SPECIAL; if(!Levitation) { /* kludge to ensure proper operation of float_up() */ HLevitation = 1; float_up(); /* reverse kludge */ HLevitation = 0; if (otmp->cursed && !Is_waterlevel(&u.uz)) { if((u.ux != xupstair || u.uy != yupstair) && (u.ux != sstairs.sx || u.uy != sstairs.sy || !sstairs.up) && (!xupladder || u.ux != xupladder || u.uy != yupladder) ) { You("hit your %s on the %s.", body_part(HEAD), ceiling(u.ux,u.uy)); losehp(uarmh ? 1 : rnd(10), "colliding with the ceiling", KILLED_BY); } else (void) doup(); } } else nothing++; if (otmp->blessed) { 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 , num2; if(otmp->cursed) You_feel("lackluster."); else pline("Magical energies course through your body."); num = rnd(25) + 5 * otmp->blessed + 10; num2 = rnd(2) + 2 * otmp->blessed + 1; u.uenmax += (otmp->cursed) ? -num2 : num2; u.uen += (otmp->cursed) ? -num : num; if(u.uenmax <= 0) u.uenmax = 0; if(u.uen <= 0) u.uen = 0; if(u.uen > u.uenmax) { u.uenmax += ((u.uen - u.uenmax) / 2); u.uen = u.uenmax; } flags.botl = 1; exercise(A_WIS, TRUE); } break; case POT_OIL: /* P. Winner */ { boolean good_for_you = FALSE; if (otmp->lamplit) { if (likes_fire(youmonst.data)) { pline("Ahh, a refreshing drink."); good_for_you = TRUE; } else { You("burn your %s.", body_part(FACE)); losehp(d(Fire_resistance ? 1 : 3, 4), "burning potion of oil", KILLED_BY_AN); } } else if(otmp->cursed) pline("This tastes like castor oil."); else pline("That was smooth!"); exercise(A_WIS, good_for_you); } break; case POT_ACID: if (Acid_resistance) /* Not necessarily a creature who _likes_ acid */ 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; case POT_BLOOD: case POT_VAMPIRE_BLOOD: unkn++; u.uconduct.unvegan++; if (maybe_polyd(is_vampire(youmonst.data), Race_if(PM_VAMPIRE))) { violated_vegetarian(); if (otmp->cursed) pline("Yecch! This %s.", Hallucination ? "liquid could do with a good stir" : "blood has congealed"); else pline(Hallucination ? "The %s liquid stirs memories of home." : "The %s blood tastes delicious.", otmp->odiluted ? "watery" : "thick"); if (!otmp->cursed) lesshungry((otmp->odiluted ? 1 : 2) * (otmp->otyp == POT_VAMPIRE_BLOOD ? 400 : otmp->blessed ? 15 : 10)); if (otmp->otyp == POT_VAMPIRE_BLOOD && otmp->blessed) { int num = newhp(); if (Upolyd) { u.mhmax += num; u.mh += num; } else { u.uhpmax += num; u.uhp += num; } } } else if (otmp->otyp == POT_VAMPIRE_BLOOD) { /* [CWC] fix conducts for potions of (vampire) blood - doesn't use violated_vegetarian() to prevent duplicated "you feel guilty" messages */ u.uconduct.unvegetarian++; if (u.ualign.type == A_LAWFUL || Role_if(PM_MONK)) { You_feel("%sguilty about drinking such a vile liquid.", Role_if(PM_MONK) ? "especially " : ""); u.ugangr++; adjalign(-15); } else if (u.ualign.type == A_NEUTRAL) adjalign(-3); exercise(A_CON, FALSE); if (!Unchanging && polymon(PM_VAMPIRE)) u.mtimedone = 0; /* "Permament" change */ } else { violated_vegetarian(); pline("Ugh. That was vile."); make_vomiting(Vomiting+d(10,8), TRUE); } break; default: impossible("What a funny potion! (%u)", otmp->otyp); return(0); } return(-1); } void healup(nhp, nxtra, curesick, cureblind) int nhp, nxtra; register boolean curesick, cureblind; { if (nhp) { if (Upolyd) { u.mh += nhp; if(u.mh > u.mhmax) u.mh = (u.mhmax += nxtra); } else { u.uhp += nhp; if(u.uhp > u.uhpmax) u.uhp = (u.uhpmax += nxtra); } } if(cureblind) make_blinded(0L,TRUE); if(curesick) make_sick(0L, (char *) 0, TRUE, SICK_ALL); flags.botl = 1; return; } void healup_mon(mtmp, nhp, nxtra, curesick, cureblind) struct monst *mtmp; int nhp, nxtra; register boolean curesick, cureblind; { if (nhp) { mtmp->mhp += nhp; if (mtmp->mhp > mtmp->mhpmax) mtmp->mhp = (mtmp->mhpmax += nxtra); } #if 0 if(cureblind) ; /* NOT DONE YET */ if(curesick) ; /* NOT DONE YET */ #endif return; } void strange_feeling(obj,txt) 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 pline(txt); if(!obj) /* e.g., crystal ball finds no traps */ return; if(obj->dknown && !objects[obj->otyp].oc_name_known && !objects[obj->otyp].oc_uname) docall(obj); if (carried(obj)) useup(obj); else useupf(obj, 1L); } const char *bottlenames[] = { "bottle", "phial", "flagon", "carafe", "flask", "jar", "vial" }; const char * bottlename() { return bottlenames[rn2(SIZE(bottlenames))]; } /* WAC -- monsters can throw potions around too! */ void potionhit(mon, obj, your_fault) register struct monst *mon; /* Monster that got hit */ register struct obj *obj; boolean your_fault; { register const char *botlnam = bottlename(); boolean isyou = (mon == &youmonst); int distance; if(isyou) { distance = 0; pline_The("%s crashes on your %s and breaks into shards.", botlnam, body_part(HEAD)); losehp(rnd(2), "thrown potion", KILLED_BY_AN); } else { distance = distu(mon->mx,mon->my); if (!cansee(mon->mx,mon->my)) pline("Crash!"); else { char *mnam = mon_nam(mon); char buf[BUFSZ]; if(has_head(mon->data)) { Sprintf(buf, "%s %s", s_suffix(mnam), (notonhead ? "body" : "head")); } else { Strcpy(buf, mnam); } pline_The("%s crashes on %s and breaks into shards.", botlnam, buf); } if(rn2(5) && mon->mhp > 1) mon->mhp--; } /* 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) { case POT_OIL: if (obj->lamplit) splatter_burning_oil(u.ux, u.uy); break; case POT_POLYMORPH: You_feel("a little %s.", Hallucination ? "normal" : "strange"); if (!Unchanging && !Antimagic) polyself(FALSE); break; case POT_ACID: if (!Acid_resistance) { pline("This burns%s!", obj->blessed ? " a little" : obj->cursed ? " a lot" : ""); losehp(d(obj->cursed ? 2 : 1, obj->blessed ? 4 : 8), "potion of acid", KILLED_BY_AN); } break; case POT_AMNESIA: /* Uh-oh! */ if (uarmh && is_helmet(uarmh) && rn2(10 - (uarmh->cursed? 8 : 0))) get_wet(uarmh, TRUE); break; } } else { boolean angermon = TRUE; if (!your_fault) angermon = FALSE; switch (obj->otyp) { case POT_HEALING: do_healing: if (mon->data == &mons[PM_PESTILENCE]) goto do_illness; angermon = FALSE; if (canseemon(mon)) pline("%s looks better.", Monnam(mon)); healup_mon(mon, d(5,6) + 5 * bcsign(obj), !obj->cursed ? 1 : 0, 1+1*!!obj->blessed, !obj->cursed); break; case POT_EXTRA_HEALING: if (mon->data == &mons[PM_PESTILENCE]) goto do_illness; angermon = FALSE; if (canseemon(mon)) pline("%s looks much better.", Monnam(mon)); healup_mon(mon, d(6,8) + 5 * bcsign(obj), obj->blessed ? 5 : !obj->cursed ? 2 : 0, !obj->cursed, TRUE); break; case POT_FULL_HEALING: if (mon->data == &mons[PM_PESTILENCE]) goto do_illness; /*FALLTHRU*/ case POT_RESTORE_ABILITY: case POT_GAIN_ABILITY: angermon = FALSE; if (canseemon(mon)) pline("%s looks sound and hale again.", Monnam(mon)); healup_mon(mon, 400, 5+5*!!(obj->blessed), !(obj->cursed), 1); break; 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)); break; } do_illness: if((mon->mhpmax > 3) && !resist(mon, POTION_CLASS, 0, NOTELL)) mon->mhpmax /= 2; if((mon->mhp > 2) && !resist(mon, POTION_CLASS, 0, NOTELL)) mon->mhp /= 2; if (mon->mhp > mon->mhpmax) mon->mhp = mon->mhpmax; if (canseemon(mon)) pline("%s looks rather ill.", Monnam(mon)); break; case POT_CONFUSION: case POT_BOOZE: if(!resist(mon, POTION_CLASS, 0, NOTELL)) mon->mconf = TRUE; break; #if 0 /* NH 3.3.0 version */ case POT_POLYMORPH: (void) bhitm(mon, obj); break; #endif case POT_POLYMORPH: /* [Tom] polymorph potion thrown * [max] added poor victim a chance to resist * magic resistance protects from polymorph traps, so make * it guard against involuntary polymorph attacks too... */ if (resists_magm(mon)) { shieldeff(mon->mx, mon->my); } else if (!resist (mon, POTION_CLASS, 0, NOTELL)) { mon_poly(mon, your_fault, "%s changes!"); if (!Hallucination && canspotmon (mon)) makeknown (POT_POLYMORPH); } break; case POT_INVISIBILITY: angermon = FALSE; mon_set_minvis(mon); break; case POT_SLEEPING: /* wakeup() doesn't rouse victims of temporary sleep */ if (sleep_monst(mon, rnd(12), POTION_CLASS)) { pline("%s falls asleep.", Monnam(mon)); slept_monst(mon); } break; case POT_PARALYSIS: if (mon->mcanmove) { mon->mcanmove = 0; /* really should be rnd(5) for consistency with players * breathing potions, but... */ mon->mfrozen = rnd(25); } break; case POT_SPEED: angermon = FALSE; mon_adjust_speed(mon, 1, obj); break; case POT_BLINDNESS: if(haseyes(mon->data)) { register int btmp = 64 + rn2(32) + rn2(32) * !resist(mon, POTION_CLASS, 0, NOTELL); btmp += mon->mblinded; mon->mblinded = min(btmp,127); mon->mcansee = 0; } break; case POT_WATER: 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); if (mon->mhp < 1) { if (your_fault) killed(mon); else monkilled(mon, "", AD_ACID); } else if (is_were(mon->data) && !is_human(mon->data)) new_were(mon); /* revert to human */ } else if (obj->cursed) { angermon = FALSE; if (canseemon(mon)) pline("%s looks healthier.", Monnam(mon)); mon->mhp += d(2,6); if (mon->mhp > mon->mhpmax) mon->mhp = mon->mhpmax; if (is_were(mon->data) && is_human(mon->data) && !Protection_from_shape_changers) new_were(mon); /* transform into beast */ } } else if(mon->data == &mons[PM_GREMLIN]) { angermon = FALSE; (void)split_mon(mon, (struct monst *)0); } else if(mon->data == &mons[PM_FLAMING_SPHERE] || mon->data == &mons[PM_IRON_GOLEM]) { if (canseemon(mon)) pline("%s %s.", Monnam(mon), mon->data == &mons[PM_IRON_GOLEM] ? "rusts" : "flickers"); mon->mhp -= d(1,6); if (mon->mhp < 1) { if (your_fault) killed(mon); else monkilled(mon, "", AD_ACID); } } break; case POT_AMNESIA: switch (monsndx(mon->data)) { case PM_GREMLIN: /* Gremlins multiply... */ mon->mtame = FALSE; (void)split_mon(mon, (struct monst *)0); break; case PM_FLAMING_SPHERE: case PM_IRON_GOLEM: if (canseemon(mon)) pline("%s %s.", Monnam(mon), monsndx(mon->data) == PM_IRON_GOLEM ? "rusts" : "flickers"); mon->mhp -= d(1,6); if (mon->mhp < 1) if (your_fault) killed(mon); else monkilled(mon, "", AD_ACID); else mon->mtame = FALSE; break; case PM_WIZARD_OF_YENDOR: if (your_fault) { if (canseemon(mon)) pline("%s laughs at you!", Monnam(mon)); forget(1); } break; case PM_MEDUSA: if (canseemon(mon)) pline("%s looks like %s's having a bad hair day!", Monnam(mon), mhe(mon)); break; case PM_CROESUS: if (canseemon(mon)) pline("%s says: 'My gold! I must count my gold!'", Monnam(mon)); break; case PM_DEATH: if (canseemon(mon)) pline("%s pauses, then looks at you thoughtfully!", Monnam(mon)); break; case PM_FAMINE: if (canseemon(mon)) pline("%s looks unusually hungry!", Monnam(mon)); break; case PM_PESTILENCE: if (canseemon(mon)) pline("%s looks unusually well!", Monnam(mon)); break; default: if (mon->data->msound == MS_NEMESIS && canseemon(mon) && your_fault) pline("%s curses your ancestors!", Monnam(mon)); else if (mon->isshk) { angermon = FALSE; if (canseemon(mon)) pline("%s looks at you curiously!", Monnam(mon)); make_happy_shk(mon, FALSE); } else if (!is_covetous(mon->data) && !rn2(4) && !resist(mon, POTION_CLASS, 0, 0)) { angermon = FALSE; if (canseemon(mon)) { if (mon->msleeping) { wakeup(mon); pline("%s wakes up looking bewildered!", Monnam(mon)); } else pline("%s looks bewildered!", Monnam(mon)); mon->mpeaceful = TRUE; mon->mtame = FALSE; } } break; } break; case POT_OIL: if (obj->lamplit) splatter_burning_oil(mon->mx, mon->my); break; /* case POT_GAIN_LEVEL: case POT_LEVITATION: case POT_FRUIT_JUICE: case POT_MONSTER_DETECTION: case POT_OBJECT_DETECTION: break; */ /* KMH, balance patch -- added */ 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) killed(mon); else monkilled(mon, "", AD_ACID); } } break; } if (angermon) wakeup(mon); else mon->msleeping = 0; } /* 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)) docall(obj); if(*u.ushops && obj->unpaid) { register struct monst *shkp = shop_keeper(*in_rooms(u.ux, u.uy, SHOPBASE)); if(!shkp) obj->unpaid = 0; else { (void)stolen_value(obj, u.ux, u.uy, (boolean)shkp->mpeaceful, FALSE, TRUE); subfrombill(obj, shkp); } } obfree(obj, (struct obj *)0); } /* vapors are inhaled or get in your eyes */ void potionbreathe(obj) register struct obj *obj; { register int i, ii, isdone, kn = 0; switch(obj->otyp) { 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 */ for(isdone = ii = 0; !isdone && ii < A_MAX; ii++) { if(ABASE(i) < AMAX(i)) { ABASE(i)++; /* only first found if not blessed */ isdone = !(obj->blessed); flags.botl = 1; } if(++i >= A_MAX) i = 0; } } break; case POT_FULL_HEALING: if (Upolyd && u.mh < u.mhmax) u.mh++, flags.botl = 1; if (u.uhp < u.uhpmax) u.uhp++, flags.botl = 1; /*FALL THROUGH*/ case POT_EXTRA_HEALING: if (Upolyd && u.mh < u.mhmax) u.mh++, flags.botl = 1; if (u.uhp < u.uhpmax) u.uhp++, flags.botl = 1; /*FALL THROUGH*/ case POT_HEALING: if (Upolyd && u.mh < u.mhmax) u.mh++, flags.botl = 1; if (u.uhp < u.uhpmax) u.uhp++, flags.botl = 1; exercise(A_CON, TRUE); break; case POT_SICKNESS: if (!Role_if(PM_HEALER)) { if (Upolyd) { if (u.mh <= 5) u.mh = 1; else u.mh -= 5; } else { if (u.uhp <= 5) u.uhp = 1; else u.uhp -= 5; } flags.botl = 1; exercise(A_CON, FALSE); } break; case POT_HALLUCINATION: You("have a momentary vision."); break; case POT_CONFUSION: case POT_BOOZE: if(!Confusion) You_feel("somewhat dizzy."); make_confused(itimeout_incr(HConfusion, rnd(5)), FALSE); break; case POT_INVISIBILITY: if (!Blind && !Invis) { kn++; pline("For an instant you %s!", See_invisible ? "could see right through yourself" : "couldn't see yourself"); } 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; exercise(A_DEX, FALSE); } else You("yawn."); break; case POT_SPEED: if (!Fast) Your("knees seem more flexible now."); incr_itimeout(&HFast, rnd(5)); exercise(A_DEX, TRUE); break; case POT_BLINDNESS: if (!Blind && !u.usleep) { kn++; 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) { (void)split_mon(&youmonst, (struct monst *)0); } else if (u.ulycn >= LOW_PM) { /* vapor from [un]holy water will trigger transformation but won't cure lycanthropy */ if (obj->blessed && youmonst.data == &mons[u.ulycn]) you_unwere(FALSE); else if (obj->cursed && !Upolyd) you_were(); } break; case POT_AMNESIA: if(u.umonnum == PM_GREMLIN) (void)split_mon(&youmonst, (struct monst *)0); else if(u.umonnum == PM_FLAMING_SPHERE) { You("flicker!"); losehp(d(1,6),"potion of amnesia", KILLED_BY_AN); } else if(u.umonnum == PM_IRON_GOLEM) { You("rust!"); losehp(d(1,6),"potion of amnesia", KILLED_BY_AN); } You_feel("dizzy!"); forget(1 + rn2(5)); break; case POT_ACID: case POT_POLYMORPH: exercise(A_CON, FALSE); break; case POT_BLOOD: case POT_VAMPIRE_BLOOD: if (maybe_polyd(is_vampire(youmonst.data), Race_if(PM_VAMPIRE))) { exercise(A_WIS, FALSE); You_feel("a %ssense of loss.", obj->otyp == POT_VAMPIRE_BLOOD ? "terrible " : ""); } else exercise(A_CON, FALSE); break; /* case POT_GAIN_LEVEL: case POT_LEVITATION: case POT_FRUIT_JUICE: case POT_MONSTER_DETECTION: case POT_OBJECT_DETECTION: case POT_OIL: break; */ } /* note: no obfree() */ if (obj->dknown) { if (kn) makeknown(obj->otyp); else if (!objects[obj->otyp].oc_name_known && !objects[obj->otyp].oc_uname && !Blind) docall(obj); } } STATIC_OVL short mixtype(o1, o2) register struct obj *o1, *o2; /* returns the potion type when o1 is dipped in o2 */ { /* cut down on the number of cases below */ if (o1->oclass == POTION_CLASS && (o2->otyp == POT_GAIN_LEVEL || o2->otyp == POT_GAIN_ENERGY || o2->otyp == POT_HEALING || o2->otyp == POT_EXTRA_HEALING || o2->otyp == POT_FULL_HEALING || o2->otyp == POT_ENLIGHTENMENT || o2->otyp == POT_FRUIT_JUICE)) { struct obj *swp; swp = o1; o1 = o2; o2 = swp; } switch (o1->otyp) { case POT_HEALING: switch (o2->otyp) { case POT_SPEED: case POT_GAIN_LEVEL: case POT_GAIN_ENERGY: return POT_EXTRA_HEALING; } break; case POT_EXTRA_HEALING: switch (o2->otyp) { case POT_GAIN_LEVEL: case POT_GAIN_ENERGY: return POT_FULL_HEALING; } break; case POT_FULL_HEALING: switch (o2->otyp) { case POT_GAIN_LEVEL: case POT_GAIN_ENERGY: return POT_GAIN_ABILITY; } break; case UNICORN_HORN: switch (o2->otyp) { case POT_SICKNESS: return POT_FRUIT_JUICE; case POT_HALLUCINATION: case POT_BLINDNESS: case POT_CONFUSION: case POT_BLOOD: case POT_VAMPIRE_BLOOD: return POT_WATER; } break; case AMETHYST: /* "a-methyst" == "not intoxicated" */ if (o2->otyp == POT_BOOZE) return POT_FRUIT_JUICE; break; case POT_GAIN_LEVEL: case POT_GAIN_ENERGY: switch (o2->otyp) { case POT_CONFUSION: return (rn2(3) ? POT_BOOZE : POT_ENLIGHTENMENT); case POT_HEALING: return POT_EXTRA_HEALING; case POT_EXTRA_HEALING: return POT_FULL_HEALING; case POT_FULL_HEALING: return POT_GAIN_ABILITY; case POT_FRUIT_JUICE: return POT_SEE_INVISIBLE; case POT_BOOZE: return POT_HALLUCINATION; } break; case POT_FRUIT_JUICE: switch (o2->otyp) { case POT_SICKNESS: return POT_SICKNESS; case POT_BLOOD: return POT_BLOOD; case POT_VAMPIRE_BLOOD: return POT_VAMPIRE_BLOOD; case POT_SPEED: return POT_BOOZE; case POT_GAIN_LEVEL: case POT_GAIN_ENERGY: return POT_SEE_INVISIBLE; } break; case POT_ENLIGHTENMENT: switch (o2->otyp) { case POT_LEVITATION: if (rn2(3)) return POT_GAIN_LEVEL; break; case POT_FRUIT_JUICE: return POT_BOOZE; case POT_BOOZE: return POT_CONFUSION; } break; } /* MRKR: Extra alchemical effects. */ if (o2->otyp == POT_ACID && o1->oclass == GEM_CLASS) { const char *potion_descr; /* Note: you can't create smoky, milky or clear potions */ switch (o1->otyp) { /* white */ case DILITHIUM_CRYSTAL: /* explodes - special treatment in dodip */ /* here we just want to return something non-zero */ return POT_WATER; break; case DIAMOND: /* won't dissolve */ potion_descr = NULL; break; case OPAL: potion_descr = "cloudy"; break; /* red */ case RUBY: potion_descr = "ruby"; break; case GARNET: potion_descr = "pink"; break; case JASPER: potion_descr = "purple-red"; break; /* orange */ case JACINTH: potion_descr = "orange"; break; case AGATE: potion_descr = "swirly"; break; /* yellow */ case CITRINE: potion_descr = "yellow"; break; case CHRYSOBERYL: potion_descr = "golden"; break; /* yellowish brown */ case AMBER: potion_descr = "brown"; break; case TOPAZ: potion_descr = "murky"; break; /* green */ case EMERALD: potion_descr = "emerald"; break; case TURQUOISE: potion_descr = "sky blue"; break; case AQUAMARINE: potion_descr = "cyan"; break; case JADE: potion_descr = "dark green"; break; /* blue */ case SAPPHIRE: potion_descr = "brilliant blue"; break; /* violet */ case AMETHYST: potion_descr = "magenta"; break; case FLUORITE: potion_descr = "white"; break; /* black */ case BLACK_OPAL: potion_descr = "black"; break; case JET: potion_descr = "dark"; break; case OBSIDIAN: potion_descr = "effervescent"; break; default: potion_descr = NULL; } if (potion_descr) { int typ; /* find a potion that matches the description */ for (typ = bases[POTION_CLASS]; objects[typ].oc_class == POTION_CLASS; typ++) { if (strcmp(potion_descr, OBJ_DESCR(objects[typ])) == 0) { return typ; } } } } return 0; } /* Bills an object that's about to be downgraded, assuming that's not already * been done */ STATIC_OVL void pre_downgrade_obj(obj, used) register struct obj *obj; boolean *used; { boolean dummy = FALSE; if (!used) used = &dummy; if (!*used) Your("%s for a moment.", aobjnam(obj, "sparkle")); if(obj->unpaid && costly_spot(u.ux, u.uy) && !*used) { You("damage it, you pay for it."); bill_dummy_object(obj); } *used = TRUE; } /* Implements the downgrading effect of potions of amnesia and Lethe water */ STATIC_OVL void downgrade_obj(obj, nomagic, used) register struct obj *obj; int nomagic; /* The non-magical object to downgrade to */ boolean *used; { pre_downgrade_obj(obj, used); obj->otyp = nomagic; obj->spe = 0; obj->owt = weight(obj); flags.botl = TRUE; } boolean get_wet(obj, amnesia) register struct obj *obj; boolean amnesia; /* returns TRUE if something happened (potion should be used up) */ { char Your_buf[BUFSZ]; boolean used = FALSE; if (snuff_lit(obj)) return(TRUE); if (obj->greased) { grease_protect(obj,(char *)0,&youmonst); return(FALSE); } (void) Shk_Your(Your_buf, obj); /* (Rusting shop goods ought to be charged for.) */ switch (obj->oclass) { case POTION_CLASS: if (obj->otyp == POT_WATER) { if (amnesia) { Your("%s to sparkle.", aobjnam(obj,"start")); obj->odiluted = 0; obj->otyp = POT_AMNESIA; used = TRUE; break; } return FALSE; } /* Diluting a !ofAmnesia just gives water... */ if (obj->otyp == POT_AMNESIA) { Your("%s flat.", aobjnam(obj, "become")); obj->odiluted = 0; obj->otyp = POT_WATER; used = TRUE; break; } /* KMH -- Water into acid causes an explosion */ if (obj->otyp == POT_ACID) { pline("It boils vigorously!"); You("are caught in the explosion!"); losehp(Acid_resistance ? rnd(5) : rnd(10), "elementary chemistry", KILLED_BY); if (amnesia) { You_feel("a momentary lapse of reason!"); forget(2 + rn2(3)); } makeknown(obj->otyp); used = TRUE; break; } if (amnesia) pline("%s %s completely.", Your_buf, aobjnam(obj,"dilute")); else pline("%s %s%s.", Your_buf, aobjnam(obj,"dilute"), obj->odiluted ? " further" : ""); if(obj->unpaid && costly_spot(u.ux, u.uy)) { You("dilute it, you pay for it."); bill_dummy_object(obj); } if (obj->odiluted || amnesia) { obj->odiluted = 0; #ifdef UNIXPC obj->blessed = FALSE; obj->cursed = FALSE; #else obj->blessed = obj->cursed = FALSE; #endif obj->otyp = POT_WATER; } else obj->odiluted++; used = TRUE; break; case SCROLL_CLASS: if (obj->otyp != SCR_BLANK_PAPER #ifdef MAIL && obj->otyp != SCR_MAIL #endif ) { 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."); bill_dummy_object(obj); } obj->otyp = SCR_BLANK_PAPER; obj->spe = 0; used = TRUE; } break; case SPBOOK_CLASS: if (obj->otyp != SPE_BLANK_PAPER) { if (obj->otyp == SPE_BOOK_OF_THE_DEAD) { pline("%s suddenly heats up; steam rises and it remains dry.", The(xname(obj))); } else { if (!Blind) { boolean oq1 = obj->quan == 1L; pline_The("spellbook%s %s.", oq1 ? "" : "s", otense(obj, "fade")); } if(obj->unpaid) { subfrombill(obj, shop_keeper(*u.ushops)); You("erase it, you pay for it."); bill_dummy_object(obj); } obj->otyp = SPE_BLANK_PAPER; } used = TRUE; } break; case GEM_CLASS: if (amnesia && (obj->otyp == LUCKSTONE || obj->otyp == LOADSTONE || obj->otyp == HEALTHSTONE || obj->otyp == TOUCHSTONE)) downgrade_obj(obj, FLINT, &used); break; case TOOL_CLASS: /* Artifacts aren't downgraded by amnesia */ if (amnesia && !obj->oartifact) { switch (obj->otyp) { case MAGIC_LAMP: /* Magic lamps forget their djinn... */ downgrade_obj(obj, OIL_LAMP, &used); break; case MAGIC_CANDLE: downgrade_obj(obj, rn2(2)? WAX_CANDLE : TALLOW_CANDLE, &used); break; case DRUM_OF_EARTHQUAKE: downgrade_obj(obj, LEATHER_DRUM, &used); break; case MAGIC_WHISTLE: /* Magic whistles lose their powers... */ downgrade_obj(obj, TIN_WHISTLE, &used); break; case MAGIC_FLUTE: /* Magic flutes sound normal again... */ downgrade_obj(obj, WOODEN_FLUTE, &used); break; case MAGIC_HARP: /* Magic harps sound normal again... */ downgrade_obj(obj, WOODEN_HARP, &used); break; case FIRE_HORN: case FROST_HORN: case HORN_OF_PLENTY: downgrade_obj(obj, TOOLED_HORN, &used); break; case MAGIC_MARKER: /* Magic markers run... */ if (obj->spe > 0) { pre_downgrade_obj(obj, &used); if ((obj->spe -= (3 + rn2(10))) < 0) obj->spe = 0; } break; } } /* The only other tools that can be affected are pick axes and * unicorn horns... */ if (!is_weptool(obj)) break; /* Drop through for disenchantment and rusting... */ /* fall through */ case ARMOR_CLASS: case WEAPON_CLASS: case WAND_CLASS: case RING_CLASS: /* Just "fall through" to generic rustprone check for now. */ /* fall through */ default: switch(artifact_wet(obj, FALSE)) { case -1: break; default: return TRUE; } /* !ofAmnesia acts as a disenchanter... */ if (amnesia && obj->spe > 0) { pre_downgrade_obj(obj, &used); drain_item(obj); } if (!obj->oerodeproof && is_rustprone(obj) && (obj->oeroded < MAX_ERODE) && !rn2(2)) { pline("%s %s some%s.", Your_buf, aobjnam(obj, "rust"), obj->oeroded ? " more" : "what"); obj->oeroded++; if(obj->unpaid && costly_spot(u.ux, u.uy) && !used) { You("damage it, you pay for it."); bill_dummy_object(obj); } used = TRUE; } break; } /* !ofAmnesia might strip away fooproofing... */ if (amnesia && obj->oerodeproof && !rn2(13)) { pre_downgrade_obj(obj, &used); obj->oerodeproof = FALSE; } /* !ofAmnesia also strips blessed/cursed status... */ if (amnesia && (obj->cursed || obj->blessed)) { /* Blessed objects are valuable, cursed objects aren't, unless * they're water. */ if (obj->blessed || obj->otyp == POT_WATER) pre_downgrade_obj(obj, &used); else if (!used) { Your("%s for a moment.", aobjnam(obj, "sparkle")); used = TRUE; } uncurse(obj); unbless(obj); } if (used) update_inventory(); else pline("%s %s wet.", Your_buf, aobjnam(obj,"get")); return used; } /* KMH, balance patch -- idea by Dylan O'Donnell * The poor hacker's polypile. This includes weapons, armor, and tools. * To maintain balance, magical categories (amulets, scrolls, spellbooks, * potions, rings, and wands) should NOT be supported. * Polearms are not currently implemented. */ int upgrade_obj(obj) register struct obj *obj; /* returns 1 if something happened (potion should be used up) * returns 0 if nothing happened * returns -1 if object exploded (potion should be used up) */ { int chg, otyp = obj->otyp, otyp2; xchar ox, oy; long owornmask; struct obj *otmp; boolean explodes; char buf[BUFSZ]; /* Check to see if object is valid */ if (!obj) return 0; (void)snuff_lit(obj); if (obj->oartifact) /* WAC -- Could have some funky fx */ return 0; switch (obj->otyp) { /* weapons */ case ORCISH_DAGGER: obj->otyp = DAGGER; break; case GREAT_DAGGER: case DAGGER: if (!rn2(2)) obj->otyp = ELVEN_DAGGER; else obj->otyp = DARK_ELVEN_DAGGER; break; case ELVEN_DAGGER: case DARK_ELVEN_DAGGER: obj->otyp = GREAT_DAGGER; break; case KNIFE: obj->otyp = STILETTO; break; case STILETTO: obj->otyp = KNIFE; break; case AXE: obj->otyp = BATTLE_AXE; break; case BATTLE_AXE: obj->otyp = AXE; break; case PICK_AXE: obj->otyp = DWARVISH_MATTOCK; break; case DWARVISH_MATTOCK: obj->otyp = PICK_AXE; break; case ORCISH_SHORT_SWORD: obj->otyp = SHORT_SWORD; break; case ELVEN_SHORT_SWORD: case DARK_ELVEN_SHORT_SWORD: case SHORT_SWORD: obj->otyp = DWARVISH_SHORT_SWORD; break; case DWARVISH_SHORT_SWORD: if (!rn2(2)) obj->otyp = ELVEN_SHORT_SWORD; else obj->otyp = DARK_ELVEN_SHORT_SWORD; break; case BROADSWORD: obj->otyp = ELVEN_BROADSWORD; break; case ELVEN_BROADSWORD: obj->otyp = BROADSWORD; break; case CLUB: obj->otyp = AKLYS; break; case AKLYS: obj->otyp = CLUB; break; case WAR_HAMMER: obj->otyp = HEAVY_HAMMER; break; case HEAVY_HAMMER: obj->otyp = WAR_HAMMER; break; case ELVEN_BOW: case DARK_ELVEN_BOW: case YUMI: case ORCISH_BOW: obj->otyp = BOW; break; case BOW: switch (rn2(3)) { case 0: obj->otyp = ELVEN_BOW; break; case 1: obj->otyp = DARK_ELVEN_BOW; break; case 2: obj->otyp = YUMI; break; } break; case ELVEN_ARROW: case DARK_ELVEN_ARROW: case YA: case ORCISH_ARROW: obj->otyp = ARROW; break; case ARROW: switch (rn2(3)) { case 0: obj->otyp = ELVEN_ARROW; break; case 1: obj->otyp = DARK_ELVEN_ARROW; break; case 2: obj->otyp = YA; break; } break; /* armour */ case ELVEN_MITHRIL_COAT: obj->otyp = DARK_ELVEN_MITHRIL_COAT; break; case DARK_ELVEN_MITHRIL_COAT: obj->otyp = ELVEN_MITHRIL_COAT; break; case ORCISH_CHAIN_MAIL: obj->otyp = CHAIN_MAIL; break; case CHAIN_MAIL: obj->otyp = ORCISH_CHAIN_MAIL; break; case STUDDED_LEATHER_ARMOR: case LEATHER_JACKET: obj->otyp = LEATHER_ARMOR; break; case LEATHER_ARMOR: obj->otyp = STUDDED_LEATHER_ARMOR; break; /* robes */ case ROBE: if (!rn2(2)) obj->otyp = ROBE_OF_PROTECTION; else obj->otyp = ROBE_OF_POWER; break; case ROBE_OF_PROTECTION: case ROBE_OF_POWER: obj->otyp = ROBE; break; /* cloaks */ case CLOAK_OF_PROTECTION: case CLOAK_OF_INVISIBILITY: case CLOAK_OF_MAGIC_RESISTANCE: case CLOAK_OF_DISPLACEMENT: case DWARVISH_CLOAK: case ORCISH_CLOAK: if (!rn2(2)) obj->otyp = OILSKIN_CLOAK; else obj->otyp = ELVEN_CLOAK; break; case OILSKIN_CLOAK: case ELVEN_CLOAK: switch (rn2(4)) { case 0: obj->otyp = CLOAK_OF_PROTECTION; break; case 1: obj->otyp = CLOAK_OF_INVISIBILITY; break; case 2: obj->otyp = CLOAK_OF_MAGIC_RESISTANCE; break; case 3: obj->otyp = CLOAK_OF_DISPLACEMENT; break; } break; /* helms */ case FEDORA: obj->otyp = ELVEN_LEATHER_HELM; break; case ELVEN_LEATHER_HELM: obj->otyp = FEDORA; break; case DENTED_POT: obj->otyp = ORCISH_HELM; break; case ORCISH_HELM: case HELM_OF_BRILLIANCE: case HELM_OF_TELEPATHY: obj->otyp = DWARVISH_IRON_HELM; break; case DWARVISH_IRON_HELM: if (!rn2(2)) obj->otyp = HELM_OF_BRILLIANCE; else obj->otyp = HELM_OF_TELEPATHY; break; case CORNUTHAUM: obj->otyp = DUNCE_CAP; break; case DUNCE_CAP: obj->otyp = CORNUTHAUM; break; /* gloves */ case LEATHER_GLOVES: if (!rn2(2)) obj->otyp = GAUNTLETS_OF_SWIMMING; else obj->otyp = GAUNTLETS_OF_DEXTERITY; break; case GAUNTLETS_OF_SWIMMING: case GAUNTLETS_OF_DEXTERITY: obj->otyp = LEATHER_GLOVES; break; /* shields */ case ELVEN_SHIELD: if (!rn2(2)) obj->otyp = URUK_HAI_SHIELD; else obj->otyp = ORCISH_SHIELD; break; case URUK_HAI_SHIELD: case ORCISH_SHIELD: obj->otyp = ELVEN_SHIELD; break; case DWARVISH_ROUNDSHIELD: obj->otyp = LARGE_SHIELD; break; case LARGE_SHIELD: obj->otyp = DWARVISH_ROUNDSHIELD; break; /* boots */ case LOW_BOOTS: obj->otyp = HIGH_BOOTS; break; case HIGH_BOOTS: obj->otyp = LOW_BOOTS; break; /* NOTE: Supposedly, HIGH_BOOTS should upgrade to any of the other magic leather boots (except for fumble). IRON_SHOES should upgrade to the iron magic boots, unless the iron magic boots are fumble */ /* rings, amulets */ case LARGE_BOX: case ICE_BOX: obj->otyp = CHEST; break; case CHEST: obj->otyp = ICE_BOX; break; case SACK: obj->otyp = rn2(5) ? OILSKIN_SACK : BAG_OF_HOLDING; break; case OILSKIN_SACK: obj->otyp = BAG_OF_HOLDING; break; case BAG_OF_HOLDING: obj->otyp = OILSKIN_SACK; break; #ifdef TOURIST case TOWEL: obj->otyp = BLINDFOLD; break; case BLINDFOLD: obj->otyp = TOWEL; break; case CREDIT_CARD: #endif case LOCK_PICK: obj->otyp = SKELETON_KEY; break; case SKELETON_KEY: obj->otyp = LOCK_PICK; break; case TALLOW_CANDLE: obj->otyp = WAX_CANDLE; break; case WAX_CANDLE: obj->otyp = TALLOW_CANDLE; break; case OIL_LAMP: obj->otyp = BRASS_LANTERN; break; case BRASS_LANTERN: obj->otyp = OIL_LAMP; break; case TIN_WHISTLE: obj->otyp = MAGIC_WHISTLE; break; case MAGIC_WHISTLE: obj->otyp = TIN_WHISTLE; break; case WOODEN_FLUTE: obj->otyp = MAGIC_FLUTE; obj->spe = rn1(5,10); break; case MAGIC_FLUTE: obj->otyp = WOODEN_FLUTE; break; case TOOLED_HORN: obj->otyp = rn1(HORN_OF_PLENTY - TOOLED_HORN, FROST_HORN); obj->spe = rn1(5,10); obj->known = 0; break; case HORN_OF_PLENTY: case FIRE_HORN: case FROST_HORN: obj->otyp = TOOLED_HORN; break; case WOODEN_HARP: obj->otyp = MAGIC_HARP; obj->spe = rn1(5,10); obj->known = 0; break; case MAGIC_HARP: obj->otyp = WOODEN_HARP; break; #ifdef STEED case LEASH: obj->otyp = SADDLE; break; case SADDLE: obj->otyp = LEASH; break; #endif case TIN_OPENER: obj->otyp = TINNING_KIT; obj->spe = rn1(30,70); obj->known = 0; break; case TINNING_KIT: obj->otyp = TIN_OPENER; break; case CRYSTAL_BALL: /* "ball-point pen" */ obj->otyp = MAGIC_MARKER; /* Keep the charges (crystal ball usually less than marker) */ break; case MAGIC_MARKER: obj->otyp = CRYSTAL_BALL; chg = rn1(10,3); if (obj->spe > chg) obj->spe = chg; obj->known = 0; break; case K_RATION: case C_RATION: case LEMBAS_WAFER: if (!rn2(2)) obj->otyp = CRAM_RATION; else obj->otyp = FOOD_RATION; break; case FOOD_RATION: case CRAM_RATION: obj->otyp = LEMBAS_WAFER; break; case LOADSTONE: obj->otyp = FLINT; break; case FLINT: if (!rn2(2)) obj->otyp = LUCKSTONE; else obj->otyp = HEALTHSTONE; break; default: /* This object is not upgradable */ return 0; } if (artifact_name(ONAME(obj), &otyp2) && otyp2 == obj->otyp) { int n; char c1, c2; Strcpy(buf, ONAME(obj)); n = rn2((int)strlen(buf)); c1 = lowc(buf[n]); do c2 = 'a' + rn2('z'-'a'); while (c1 == c2); buf[n] = (buf[n] == c1) ? c2 : highc(c2); /* keep same case */ if (oname(obj, buf) != obj) panic("upgrade_obj: unhandled realloc"); } if ((!carried(obj) || obj->unpaid) && #ifdef UNPOLYPILE !is_hazy(obj) && #endif get_obj_location(obj, &ox, &oy, BURIED_TOO|CONTAINED_TOO) && costly_spot(ox, oy)) { char objroom = *in_rooms(ox, oy, SHOPBASE); register struct monst *shkp = shop_keeper(objroom); 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) == *in_rooms(shkp->mx, shkp->my, 0) && !costly_spot(u.ux, u.uy)) make_angry_shk(shkp, ox, oy); else { pline("%s gets angry!", Monnam(shkp)); hot_pursuit(shkp); } } else Norep("%s is furious!", Monnam(shkp)); otyp2 = obj->otyp; obj->otyp = otyp; /* * [ALI] When unpaid containers are upgraded, the * old container is billed as a dummy object, but * it's contents are unaffected and will remain * either unpaid or not as appropriate. */ otmp = obj->cobj; obj->cobj = NULL; if (costly_spot(u.ux, u.uy) && objroom == *u.ushops) bill_dummy_object(obj); else (void) stolen_value(obj, ox, oy, FALSE, FALSE, FALSE); obj->otyp = otyp2; obj->cobj = otmp; } } /* The object was transformed */ obj->owt = weight(obj); obj->oclass = objects[obj->otyp].oc_class; if (!objects[obj->otyp].oc_uses_known) obj->known = 1; if (carried(obj)) { if (obj == uskin) rehumanize(); /* Quietly remove worn item if no longer compatible --ALI */ owornmask = obj->owornmask; if (owornmask & W_ARM && !is_suit(obj)) owornmask &= ~W_ARM; if (owornmask & W_ARMC && !is_cloak(obj)) owornmask &= ~W_ARMC; if (owornmask & W_ARMH && !is_helmet(obj)) owornmask &= ~W_ARMH; if (owornmask & W_ARMS && !is_shield(obj)) owornmask &= ~W_ARMS; if (owornmask & W_ARMG && !is_gloves(obj)) owornmask &= ~W_ARMG; if (owornmask & W_ARMF && !is_boots(obj)) owornmask &= ~W_ARMF; #ifdef TOURIST if (owornmask & W_ARMU && !is_shirt(obj)) owornmask &= ~W_ARMU; #endif if (owornmask & W_TOOL && obj->otyp != BLINDFOLD && obj->otyp != TOWEL && obj->otyp != LENSES) owornmask &= ~W_TOOL; otyp2 = obj->otyp; obj->otyp = otyp; if (obj->otyp == LEASH && obj->leashmon) o_unleash(obj); remove_worn_item(obj, TRUE); obj->otyp = otyp2; obj->owornmask = owornmask; setworn(obj, obj->owornmask); puton_worn_item(obj); } if (obj->otyp == BAG_OF_HOLDING && Has_contents(obj)) { explodes = FALSE; for (otmp = obj->cobj; otmp; otmp = otmp->nobj) if (mbag_explodes(otmp, 0)) { explodes = TRUE; break; } if (explodes) { pline("As you upgrade your bag, you are blasted by a magical explosion!"); delete_contents(obj); if (carried(obj)) useup(obj); else useupf(obj, obj->quan); losehp(d(6,6), "magical explosion", KILLED_BY_AN); return -1; } } return 1; } int dodip() { struct obj *potion, *obj, *singlepotion; const char *tmp; uchar here; char allowall[2], qbuf[QBUFSZ], Your_buf[BUFSZ]; short mixture; int res; allowall[0] = ALL_CLASSES; allowall[1] = '\0'; if(!(obj = getobj(allowall, "dip"))) return(0); here = levl[u.ux][u.uy].typ; /* Is there a fountain to dip into here? */ if (IS_FOUNTAIN(here)) { if(yn("Dip it into the fountain?") == 'y') { dipfountain(obj); return(1); } } else if (IS_TOILET(here)) { if(yn("Dip it into the toilet?") == 'y') { diptoilet(obj); return(1); } } else if (is_pool(u.ux,u.uy)) { tmp = waterbody_name(u.ux,u.uy); Sprintf(qbuf, "Dip it into the %s?", tmp); if (yn(qbuf) == 'y') { if (Levitation) { floating_above(tmp); #ifdef STEED } else if (u.usteed && !is_swimmer(u.usteed->data) && P_SKILL(P_RIDING) < P_BASIC) { rider_cant_reach(); /* not skilled enough to reach */ #endif } else { (void) get_wet(obj, level.flags.lethe); if (obj->otyp == POT_ACID) useup(obj); } return 1; } } if(!(potion = getobj(beverages, "dip into"))) return(0); if (potion == obj && potion->quan == 1L) { pline("That is a potion bottle, not a Klein bottle!"); return 0; } if(potion->otyp != POT_WATER && obj->otyp == POT_WATER) { /* swap roles, to ensure symmetry */ struct obj *otmp = potion; potion = obj; obj = otmp; } potion->in_use = TRUE; /* assume it will be used up */ if(potion->otyp == POT_WATER) { boolean useeit = !Blind; if (useeit) (void) Shk_Your(Your_buf, obj); if (potion->blessed) { if (obj->cursed) { if (useeit) pline("%s %s %s.", Your_buf, aobjnam(obj, "softly glow"), hcolor(NH_AMBER)); uncurse(obj); obj->bknown=1; poof: if(!(objects[potion->otyp].oc_name_known) && !(objects[potion->otyp].oc_uname)) docall(potion); useup(potion); return(1); } else if(!obj->blessed) { if (useeit) { tmp = hcolor(NH_LIGHT_BLUE); pline("%s %s with a%s %s aura.", Your_buf, aobjnam(obj, "softly glow"), index(vowels, *tmp) ? "n" : "", tmp); } bless(obj); obj->bknown=1; goto poof; } } else if (potion->cursed) { if (obj->blessed) { if (useeit) pline("%s %s %s.", Your_buf, aobjnam(obj, "glow"), hcolor((const char *)"brown")); unbless(obj); obj->bknown=1; goto poof; } else if(!obj->cursed) { if (useeit) { tmp = hcolor(NH_BLACK); pline("%s %s with a%s %s aura.", Your_buf, aobjnam(obj, "glow"), index(vowels, *tmp) ? "n" : "", tmp); } curse(obj); obj->bknown=1; goto poof; } } else { switch(artifact_wet(obj,TRUE)) { /* Assume ZT_xxx is AD_xxx-1 */ case -1: break; default: zap_over_floor(u.ux, u.uy, (artifact_wet(obj,TRUE)-1), NULL); break; } if (get_wet(obj, FALSE)) goto poof; } } else if (potion->otyp == POT_AMNESIA) { if (potion == obj) { obj->in_use = FALSE; potion = splitobj(obj, 1L); potion->in_use = TRUE; } if (get_wet(obj, TRUE)) goto poof; } /* WAC - Finn Theoderson - make polymorph and gain level msgs similar * Give out name of new object and allow user to name the potion */ else if (obj->otyp == POT_POLYMORPH || potion->otyp == POT_POLYMORPH) { /* some objects can't be polymorphed */ 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, TRUE); else if (was_swapwep) setuswapwep(obj, TRUE); else if (was_quiver) setuqwep(obj); if (obj->otyp != save_otyp) { makeknown(POT_POLYMORPH); useup(potion); prinv((char *)0, obj, 0L); return 1; } else { pline("Nothing seems to happen."); goto poof; } } potion->in_use = FALSE; /* didn't go poof */ return(1); #ifdef UNPOLYPILE } else if (potion->otyp == POT_RESTORE_ABILITY && is_hazy(obj)) { /* KMH -- Restore ability will stop unpolymorphing */ stop_timer(UNPOLY_OBJ, (genericptr_t) obj); obj->oldtyp = STRANGE_OBJECT; if (!Blind) pline("%s seems less hazy.", Yname2(obj)); useup(potion); return (1); #endif } else if(obj->oclass == POTION_CLASS && obj->otyp != potion->otyp) { /* Mixing potions is dangerous... */ pline_The("potions mix..."); /* KMH, balance patch -- acid is particularly unstable */ if (obj->cursed || obj->otyp == POT_ACID || potion->cursed || potion->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); /* MRKR: an alchemy smock ought to be */ /* some protection against this: */ losehp(Acid_resistance ? rnd(5) : rnd(10), "alchemic blast", KILLED_BY_AN); return(1); } obj->blessed = obj->cursed = obj->bknown = 0; if (Blind || Hallucination) obj->dknown = 0; if ((mixture = mixtype(obj, potion)) != 0) { obj->otyp = mixture; } else { switch (obj->odiluted ? 1 : rnd(8)) { case 1: obj->otyp = POT_WATER; break; case 2: case 3: obj->otyp = POT_SICKNESS; break; case 4: { struct obj *otmp; otmp = mkobj(POTION_CLASS,FALSE); obj->otyp = otmp->otyp; obfree(otmp, (struct obj *)0); } break; default: if (!Blind) pline_The("mixture glows brightly and evaporates."); useup(obj); useup(potion); return(1); } } obj->odiluted = (obj->otyp != POT_WATER); if (obj->otyp == POT_WATER && !Hallucination) { pline_The("mixture bubbles%s.", Blind ? "" : ", then clears"); } else if (!Blind) { pline_The("mixture looks %s.", hcolor(OBJ_DESCR(objects[obj->otyp]))); } useup(potion); return(1); } #ifdef INVISIBLE_OBJECTS if (!always_visible(obj)) { if (potion->otyp == POT_INVISIBILITY && !obj->oinvis) { obj->oinvis = TRUE; if (!Blind) pline(!See_invisible ? "Where did %s go?" : "Gee! All of a sudden you can see right through %s.", the(xname(obj))); goto poof; } else if (potion->otyp == POT_SEE_INVISIBLE && obj->oinvis) { obj->oinvis = FALSE; if (!Blind) { if (!See_invisible) pline("So that's where %s went!", the(xname(obj))); else You("can no longer see through %s.", the(xname(obj))); } goto poof; } } #endif 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 && (potion->otyp == POT_HEALING || potion->otyp == POT_EXTRA_HEALING || potion->otyp == POT_FULL_HEALING)) { pline("A coating wears off %s.", the(xname(obj))); obj->opoisoned = 0; goto poof; } } 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)); if (obj->oeroded == MAX_ERODE) { obj_extract_self(obj); 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++; } } } else if (potion->cursed) { 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--; if (obj->oeroded2 > 0) obj->oeroded2--; wisx = TRUE; } exercise(A_WIS, wisx); makeknown(potion->otyp); useup(potion); return 1; } else if (potion->otyp == POT_GAIN_LEVEL) { res = upgrade_obj(obj); if (res != 0) { if (res == 1) { /* The object was upgraded */ pline("Hmm! You don't recall dipping that into the potion."); prinv((char *)0, obj, 0L); } /* else potion exploded */ if (!objects[potion->otyp].oc_name_known && !objects[potion->otyp].oc_uname) docall(potion); useup(potion); update_inventory(); exercise(A_WIS, TRUE); return 1; } /* no return here, go for Interesting... message */ } /* KMH, balance patch -- acid affects damage(proofing) */ if (potion->otyp == POT_ACID && (obj->oclass == ARMOR_CLASS || obj->oclass == WEAPON_CLASS || is_weptool(obj))) { if (!potion->blessed && obj->oerodeproof) { pline("%s %s golden shield.", Yname2(obj), (obj->quan > 1L) ? "lose their" : "loses its"); obj->oerodeproof = 0; makeknown(potion->otyp); } else { pline("%s looks a little dull.", Yname2(obj)); if (!objects[potion->otyp].oc_name_known && !objects[potion->otyp].oc_uname) docall(potion); } exercise(A_WIS, FALSE); 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) && (potion->otyp == POT_OIL)) { /* Turn off engine before fueling, turn off fuel too :-) */ if (obj->lamplit || potion->lamplit) { useup(potion); explode(u.ux, u.uy, ZT_SPELL(ZT_FIRE), d(6,6), 0, EXPL_FIERY); exercise(A_WIS, FALSE); return 1; } /* Adding oil to an empty magic lamp renders it into an oil lamp */ if ((obj->otyp == MAGIC_LAMP) && obj->spe == 0) { obj->otyp = OIL_LAMP; obj->age = 0; } if (obj->age > 1000L) { pline("%s %s full.", Yname2(obj), otense(obj, "are")); potion->in_use = FALSE; /* didn't go poof */ } else { You("fill your %s with oil.", yname(obj)); check_unpaid(potion); /* Yendorian Fuel Tax */ obj->age += 2*potion->age; /* burns more efficiently */ if (obj->age > 1500L) obj->age = 1500L; useup(potion); exercise(A_WIS, TRUE); } makeknown(POT_OIL); obj->spe = 1; update_inventory(); return 1; } potion->in_use = FALSE; /* didn't go poof */ if ((obj->otyp == UNICORN_HORN || obj->oclass == GEM_CLASS) && (mixture = mixtype(obj, potion)) != 0) { char oldbuf[BUFSZ], newbuf[BUFSZ]; short old_otyp = potion->otyp; boolean old_dknown = FALSE; boolean more_than_one = potion->quan > 1; oldbuf[0] = '\0'; if (potion->dknown) { old_dknown = TRUE; Sprintf(oldbuf, "%s ", hcolor(OBJ_DESCR(objects[potion->otyp]))); } /* with multiple merged potions, split off one and just clear it */ if (potion->quan > 1L) { singlepotion = splitobj(potion, 1L); } else singlepotion = potion; /* MRKR: Gems dissolve in acid to produce new potions */ if (obj->oclass == GEM_CLASS && potion->otyp == POT_ACID) { struct obj *singlegem = (obj->quan > 1L ? splitobj(obj, 1L) : obj); singlegem->in_use = TRUE; if (potion->otyp == POT_ACID && (obj->otyp == DILITHIUM_CRYSTAL || potion->cursed || !rn2(10))) { /* Just to keep them on their toes */ singlepotion->in_use = TRUE; if (Hallucination && obj->otyp == DILITHIUM_CRYSTAL) { /* Thanks to Robin Johnson */ pline("Warning, Captain! The warp core has been breached!"); } pline("BOOM! %s explodes!", The(xname(singlegem))); exercise(A_STR, FALSE); if (!breathless(youmonst.data) || haseyes(youmonst.data)) potionbreathe(singlepotion); useup(singlegem); useup(singlepotion); /* MRKR: an alchemy smock ought to be */ /* some protection against this: */ losehp(Acid_resistance ? rnd(5) : rnd(10), "alchemic blast", KILLED_BY_AN); return(1); } pline("%s dissolves in %s.", The(xname(singlegem)), the(xname(singlepotion))); makeknown(POT_ACID); useup(singlegem); } if(singlepotion->unpaid && costly_spot(u.ux, u.uy)) { You("use it, you pay for it."); bill_dummy_object(singlepotion); } if (singlepotion->otyp == mixture) { /* no change - merge it back in */ if (more_than_one && !merged(&potion, &singlepotion)) { /* should never happen */ impossible("singlepotion won't merge with parent potion."); } } else { 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 { singlepotion->dknown = !Hallucination; if (mixture == POT_WATER && singlepotion->dknown) Sprintf(newbuf, "clears"); else Sprintf(newbuf, "turns %s", hcolor(OBJ_DESCR(objects[mixture]))); pline_The("%spotion%s %s.", oldbuf, more_than_one ? " that you dipped into" : "", newbuf); if(!objects[old_otyp].oc_uname && !objects[old_otyp].oc_name_known && old_dknown) { struct obj fakeobj; fakeobj = zeroobj; fakeobj.dknown = 1; fakeobj.otyp = old_otyp; fakeobj.oclass = POTION_CLASS; docall(&fakeobj); } } obj_extract_self(singlepotion); singlepotion = hold_another_object(singlepotion, "You juggle and drop %s!", doname(singlepotion), (const char *)0); update_inventory(); } return(1); } pline("Interesting..."); return(1); } void djinni_from_bottle(obj) register struct obj *obj; { struct monst *mtmp; int genie_type; int chance; #if 0 /* KMH -- See comments in monst.c */ switch (rn2(4)) { default: case 0: genie_type = PM_DJINNI; break; case 1: genie_type = PM_EFREETI; break; case 2: genie_type = PM_MARID; break; case 3: genie_type = PM_DAO; break; } #else genie_type = PM_DJINNI; #endif if(!(mtmp = makemon(&mons[genie_type], u.ux, u.uy, NO_MM_FLAGS))){ pline("It turns out to be empty."); return; } if (!Blind) { pline("In a cloud of smoke, %s emerges!", a_monnam(mtmp)); pline("%s speaks.", Monnam(mtmp)); } else { You("smell acrid fumes."); pline("%s speaks.", Something); } chance = rn2(5); if (obj->blessed) chance = (chance == 4) ? rnd(4) : 0; else if (obj->cursed) chance = (chance == 0) ? rn2(4) : 4; /* 0,1,2,3,4: b=80%,5,5,5,5; nc=20%,20,20,20,20; c=5%,5,5,5,80 */ switch (chance) { case 0 : verbalize("I am in your debt. I will grant one wish!"); makewish(); mongone(mtmp); break; case 1 : verbalize("Thank you for freeing me!"); (void) tamedog(mtmp, (struct obj *)0); break; case 2 : verbalize("You freed me!"); mtmp->mpeaceful = TRUE; set_malign(mtmp); break; case 3 : verbalize("It is about time!"); pline("%s vanishes.", Monnam(mtmp)); mongone(mtmp); break; default: verbalize("You disturbed me, fool!"); break; } } /* clone a gremlin or mold (2nd arg non-null implies heat as the trigger); hit points are cut in half (odd HP stays with original) */ struct monst * split_mon(mon, mtmp) struct monst *mon, /* monster being split */ *mtmp; /* optional attacker whose heat triggered it */ { struct monst *mtmp2; char reason[BUFSZ]; reason[0] = '\0'; if (mtmp) Sprintf(reason, " from %s heat", (mtmp == &youmonst) ? (const char *)"your" : (const char *)s_suffix(mon_nam(mtmp))); if (mon == &youmonst) { mtmp2 = cloneu(); if (mtmp2) { mtmp2->mhpmax = u.mhmax / 2; u.mhmax -= mtmp2->mhpmax; flags.botl = 1; You("multiply%s!", reason); } } else { mtmp2 = clone_mon(mon, 0, 0); if (mtmp2) { mtmp2->mhpmax = mon->mhpmax / 2; mon->mhpmax -= mtmp2->mhpmax; if (canspotmon(mon)) pline("%s multiplies%s!", Monnam(mon), reason); } } return mtmp2; } #endif /* OVLB */ /*potion.c*/ slashem-0.0.7E7F3/src/mondata.c0000664000076400007640000005144110545462317014237 0ustar aliali/* SCCS Id: @(#)mondata.c 3.4 2003/06/02 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" #include "eshk.h" #include "epri.h" /* These routines provide basic data for any type of monster. */ #ifdef OVLB void set_mon_data(mon, ptr, flag) struct monst *mon; struct permonst *ptr; int flag; { mon->data = ptr; if (flag == -1) return; /* "don't care" */ if (flag == 1) mon->mintrinsics |= (ptr->mresists & MR_TYPEMASK); else mon->mintrinsics = (ptr->mresists & MR_TYPEMASK); return; } #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 */ #ifdef OVLB boolean poly_when_stoned(ptr) struct permonst *ptr; { return((boolean)(is_golem(ptr) && ptr != &mons[PM_STONE_GOLEM] && !(mvitals[PM_STONE_GOLEM].mvflags & G_GENOD))); /* allow G_EXTINCT */ } boolean resists_drli(mon) /* returns TRUE if monster is drain-life resistant */ struct monst *mon; { struct permonst *ptr = mon->data; struct obj *wep = ((mon == &youmonst) ? uwep : MON_WEP(mon)); return (boolean)(is_undead(ptr) || is_demon(ptr) || is_were(ptr) || ptr == &mons[PM_DEATH] || is_golem(ptr) || resists_drain(mon) || (wep && wep->oartifact && defends(AD_DRLI, wep))); } boolean resists_magm(mon) /* TRUE if monster is magic-missile resistant */ struct monst *mon; { struct permonst *ptr = mon->data; struct obj *o; /* as of 3.2.0: gray dragons, Angels, Oracle, Yeenoghu */ if (dmgtype(ptr, AD_MAGM) || ptr == &mons[PM_BABY_GRAY_DRAGON] || dmgtype(ptr, AD_RBRE)) /* Chromatic Dragon */ return TRUE; /* check for magic resistance granted by wielded weapon */ o = (mon == &youmonst) ? uwep : MON_WEP(mon); if (o && o->oartifact && defends(AD_MAGM, o)) return TRUE; /* check for magic resistance granted by worn or carried items */ o = (mon == &youmonst) ? invent : mon->minvent; for ( ; o; o = o->nobj) if ((o->owornmask && objects[o->otyp].oc_oprop == ANTIMAGIC) || (o->oartifact && protects(AD_MAGM, o))) return TRUE; return FALSE; } /* TRUE if monster is resistant to light-induced blindness */ boolean resists_blnd(mon) struct monst *mon; { struct permonst *ptr = mon->data; boolean is_you = (mon == &youmonst); struct obj *o; if (is_you ? (Blind || u.usleep) : (mon->mblinded || !mon->mcansee || !haseyes(ptr) || /* BUG: temporary sleep sets mfrozen, but since 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)) return TRUE; o = is_you ? invent : mon->minvent; for ( ; o; o = o->nobj) if ((o->owornmask && objects[o->otyp].oc_oprop == BLINDED) || (o->oartifact && protects(AD_BLND, o))) return TRUE; return FALSE; } /* TRUE iff monster can be blinded by the given attack */ /* Note: may return TRUE when mdef is blind (e.g. new cream-pie attack) */ boolean can_blnd(magr, mdef, aatyp, obj) struct monst *magr; /* NULL == no specific aggressor */ struct monst *mdef; uchar aatyp; struct obj *obj; /* aatyp == AT_WEAP, AT_SPIT */ { boolean is_you = (mdef == &youmonst); boolean check_visor = FALSE; struct obj *o; const char *s; /* no eyes protect against all attacks for now */ if (!haseyes(mdef->data)) return FALSE; switch(aatyp) { case AT_EXPL: case AT_BOOM: case AT_GAZE: case AT_MAGC: case AT_BREA: /* assumed to be lightning */ /* light-based attacks may be cancelled or resisted */ if (magr && magr->mcan) return FALSE; return !resists_blnd(mdef); case AT_WEAP: case AT_SPIT: case AT_NONE: /* an object is used (thrown/spit/other) */ if (obj && (obj->otyp == CREAM_PIE)) { if (is_you && Blindfolded) return FALSE; } else if (obj && (obj->otyp == BLINDING_VENOM)) { /* all ublindf, including LENSES, protect, cream-pies too */ if (is_you && (ublindf || u.ucreamed)) return FALSE; check_visor = TRUE; } else if (obj && (obj->otyp == POT_BLINDNESS)) { return TRUE; /* no defense */ } else return FALSE; /* other objects cannot cause blindness yet */ if ((magr == &youmonst) && u.uswallow) return FALSE; /* can't affect eyes while inside monster */ break; case AT_ENGL: if (is_you && (Blindfolded || u.usleep || u.ucreamed)) return FALSE; if (!is_you && mdef->msleeping) return FALSE; break; case AT_CLAW: /* e.g. raven: all ublindf, including LENSES, protect */ if (is_you && ublindf) return FALSE; if ((magr == &youmonst) && u.uswallow) return FALSE; /* can't affect eyes while inside monster */ check_visor = TRUE; break; case AT_TUCH: case AT_STNG: /* some physical, blind-inducing attacks can be cancelled */ if (magr && magr->mcan) return FALSE; break; default: break; } /* check if wearing a visor (only checked if visor might help) */ if (check_visor) { o = (mdef == &youmonst) ? invent : mdef->minvent; for ( ; o; o = o->nobj) if ((o->owornmask & W_ARMH) && (s = OBJ_DESCR(objects[o->otyp])) != (char *)0 && !strcmp(s, "visored helmet")) return FALSE; } return TRUE; } #endif /* OVLB */ #ifdef OVL0 boolean ranged_attk(ptr) /* returns TRUE if monster can attack at range */ struct permonst *ptr; { register int i, atyp; long atk_mask = (1L << AT_BREA) | (1L << AT_SPIT) | (1L << AT_GAZE); /* was: (attacktype(ptr, AT_BREA) || attacktype(ptr, AT_WEAP) || attacktype(ptr, AT_SPIT) || attacktype(ptr, AT_GAZE) || attacktype(ptr, AT_MAGC)); but that's too slow -dlc */ for(i = 0; i < NATTK; i++) { atyp = ptr->mattk[i].aatyp; if (atyp >= AT_WEAP) return TRUE; /* assert(atyp < 32); */ if ((atk_mask & (1L << atyp)) != 0L) return TRUE; } return FALSE; } /* true iff the type of monster pass through iron bars */ boolean passes_bars(mptr) struct permonst *mptr; { return (boolean) (passes_walls(mptr) || amorphous(mptr) || is_whirly(mptr) || verysmall(mptr) || (slithy(mptr) && !bigmonst(mptr))); } #endif /* OVL0 */ #ifdef OVL1 boolean can_track(ptr) /* returns TRUE if monster can track well */ register struct permonst *ptr; { if (uwep && uwep->oartifact == ART_EXCALIBUR) return TRUE; else return((boolean)haseyes(ptr)); } #endif /* OVL1 */ #ifdef OVLB boolean sliparm(ptr) /* creature will slide out of armor */ register struct permonst *ptr; { return((boolean)(is_whirly(ptr) || ptr->msize <= MZ_SMALL || noncorporeal(ptr))); } boolean breakarm(ptr) /* creature will break out of armor */ register struct permonst *ptr; { return ((bigmonst(ptr) || (ptr->msize > MZ_SMALL && !humanoid(ptr)) || /* special cases of humanoids that cannot wear body armor */ ptr == &mons[PM_MARILITH] || ptr == &mons[PM_WINGED_GARGOYLE]) && !sliparm(ptr)); } #endif /* OVLB */ #ifdef OVL1 boolean sticks(ptr) /* creature sticks other creatures it hits */ register struct permonst *ptr; { return((boolean)(dmgtype(ptr,AD_STCK) || dmgtype(ptr,AD_WRAP) || attacktype(ptr,AT_HUGS))); } /* number of horns this type of monster has on its head */ int num_horns(ptr) struct permonst *ptr; { switch (monsndx(ptr)) { case PM_LAMB: case PM_SHEEP: case PM_GOAT: case PM_COW: case PM_BULL: case PM_HORNED_DEVIL: /* ? "more than one" */ case PM_MINOTAUR: case PM_ASMODEUS: case PM_BALROG: return 2; case PM_WHITE_UNICORN: case PM_GRAY_UNICORN: case PM_BLACK_UNICORN: case PM_KI_RIN: return 1; default: break; } return 0; } 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 * a passive defense */ int max_passive_dmg(mdef, magr) register struct monst *mdef, *magr; { int i, dmg = 0; uchar adtyp; for(i = 0; i < NATTK; i++) if(mdef->data->mattk[i].aatyp == AT_NONE || mdef->data->mattk[i].aatyp == AT_BOOM) { adtyp = mdef->data->mattk[i].adtyp; if ((adtyp == AD_ACID && !resists_acid(magr)) || (adtyp == AD_COLD && !resists_cold(magr)) || (adtyp == AD_FIRE && !resists_fire(magr)) || (adtyp == AD_ELEC && !resists_elec(magr)) || adtyp == AD_PHYS) { dmg = mdef->data->mattk[i].damn; if(!dmg) dmg = mdef->data->mlevel+1; dmg *= mdef->data->mattk[i].damd; } else dmg = 0; return dmg; } return 0; } #endif /* OVL1 */ #ifdef OVL0 int monsndx(ptr) /* return an index into the mons array */ struct permonst *ptr; { register int i; if (ptr == &upermonst) return PM_PLAYERMON; i = (int)(ptr - &mons[0]); if (i < LOW_PM || i >= NUMMONS) { /* ought to switch this to use `fmt_ptr' */ panic("monsndx - could not index monster (%d)", i); return NON_PM; /* will not get here */ } return(i); } #endif /* OVL0 */ #ifdef OVL1 int name_to_mon(in_str) const char *in_str; { /* Be careful. We must check the entire string in case it was * something such as "ettin zombie corpse". The calling routine * doesn't know about the "corpse" until the monster name has * already been taken off the front, so we have to be able to * read the name with extraneous stuff such as "corpse" stuck on * the end. * This causes a problem for names which prefix other names such * as "ettin" on "ettin zombie". In this case we want the _longest_ * name which exists. * This also permits plurals created by adding suffixes such as 's' * or 'es'. Other plurals must still be handled explicitly. */ register int i; register int mntmp = NON_PM; register char *s, *str, *term; char buf[BUFSZ]; int len, slen; str = strcpy(buf, in_str); if (!strncmp(str, "a ", 2)) str += 2; else if (!strncmp(str, "an ", 3)) str += 3; slen = strlen(str); term = str + slen; if ((s = strstri(str, "vortices")) != 0) Strcpy(s+4, "ex"); /* be careful with "ies"; "priest", "zombies" */ else if (slen > 3 && !strcmpi(term-3, "ies") && (slen < 7 || strcmpi(term-7, "zombies"))) Strcpy(term-3, "y"); /* luckily no monster names end in fe or ve with ves plurals */ else if (slen > 3 && !strcmpi(term-3, "ves")) Strcpy(term-3, "f"); slen = strlen(str); /* length possibly needs recomputing */ { static const struct alt_spl { const char* name; short pm_val; } names[] = { /* Alternate spellings */ { "grey dragon", PM_GRAY_DRAGON }, { "baby grey dragon", PM_BABY_GRAY_DRAGON }, { "grey unicorn", PM_GRAY_UNICORN }, { "grey ooze", PM_GRAY_OOZE }, { "gray-elf", PM_GREY_ELF }, { "mindflayer", PM_MIND_FLAYER }, { "master mindflayer", PM_MASTER_MIND_FLAYER }, /* Hyphenated names */ { "ki rin", PM_KI_RIN }, { "uruk hai", PM_URUK_HAI }, { "orc captain", PM_ORC_CAPTAIN }, { "woodland elf", PM_WOODLAND_ELF }, { "green elf", PM_GREEN_ELF }, { "grey elf", PM_GREY_ELF }, { "gray elf", PM_GREY_ELF }, { "elf lord", PM_ELF_LORD }, #if 0 /* OBSOLETE */ { "high elf", PM_HIGH_ELF }, #endif { "olog hai", PM_OLOG_HAI }, { "arch lich", PM_ARCH_LICH }, /* Some irregular plurals */ { "incubi", PM_INCUBUS }, { "succubi", PM_SUCCUBUS }, { "violet fungi", PM_VIOLET_FUNGUS }, { "homunculi", PM_HOMUNCULUS }, { "baluchitheria", PM_BALUCHITHERIUM }, { "lurkers above", PM_LURKER_ABOVE }, { "cavemen", PM_CAVEMAN }, { "cavewomen", PM_CAVEWOMAN }, #ifndef ZOUTHERN /* { "zruties", PM_ZRUTY },*/ #endif { "djinn", PM_DJINNI }, { "mumakil", PM_MUMAK }, { "erinyes", PM_ERINYS }, { "giant lice", PM_GIANT_LOUSE }, /* RJ */ /* falsely caught by -ves check above */ { "master of thief", PM_MASTER_OF_THIEVES }, /* end of list */ { 0, 0 } }; register const struct alt_spl *namep; for (namep = names; namep->name; namep++) if (!strncmpi(str, namep->name, (int)strlen(namep->name))) return namep->pm_val; } for (len = 0, i = LOW_PM; i < NUMMONS; i++) { register int m_i_len = strlen(mons[i].mname); if (m_i_len > len && !strncmpi(mons[i].mname, str, m_i_len)) { if (m_i_len == slen) return i; /* exact match */ else if (slen > m_i_len && (str[m_i_len] == ' ' || !strcmpi(&str[m_i_len], "s") || !strncmpi(&str[m_i_len], "s ", 2) || !strcmpi(&str[m_i_len], "'") || !strncmpi(&str[m_i_len], "' ", 2) || !strcmpi(&str[m_i_len], "'s") || !strncmpi(&str[m_i_len], "'s ", 3) || !strcmpi(&str[m_i_len], "es") || !strncmpi(&str[m_i_len], "es ", 3))) { mntmp = i; len = m_i_len; } } } if (mntmp == NON_PM) mntmp = title_to_mon(str, (int *)0, (int *)0); return mntmp; } #endif /* OVL1 */ #ifdef OVL2 /* returns 3 values (0=male, 1=female, 2=none) */ int gender(mtmp) register struct monst *mtmp; { if (is_neuter(mtmp->data)) return 2; return mtmp->female; } /* Like gender(), but lower animals and such are still "it". */ /* This is the one we want to use when printing messages. */ int pronoun_gender(mtmp) register struct monst *mtmp; { if (!mtmp->isshk && (is_neuter(mtmp->data) || !canspotmon(mtmp))) return 2; return (humanoid(mtmp->data) || (mtmp->data->geno & G_UNIQ) || type_is_pname(mtmp->data)) ? (int)mtmp->female : 2; } #endif /* OVL2 */ #ifdef OVLB /* used for nearby monsters when you go to another level */ boolean levl_follower(mtmp) struct monst *mtmp; { /* monsters with the Amulet--even pets--won't follow across levels */ if (mon_has_amulet(mtmp)) return FALSE; /* some monsters will follow even while intending to flee from you */ if (mtmp->mtame || mtmp->iswiz || is_fshk(mtmp)) return TRUE; /* stalking types follow, but won't when fleeing unless you hold the Amulet */ return (boolean)((mtmp->data->mflags2 & M2_STALK) && (!mtmp->mflee || u.uhave.amulet)); } static const short grownups[][2] = { {PM_LITTLE_DOG, PM_DOG}, {PM_DOG, PM_LARGE_DOG}, {PM_HELL_HOUND_PUP, PM_HELL_HOUND}, {PM_KITTEN, PM_HOUSECAT}, {PM_HOUSECAT, PM_LARGE_CAT}, {PM_KOBOLD, PM_LARGE_KOBOLD}, {PM_LARGE_KOBOLD, PM_KOBOLD_LORD}, {PM_GNOME, PM_GNOME_LORD}, {PM_GNOME_LORD, PM_GNOME_WARRIOR}, {PM_DWARF, PM_DWARF_LORD}, {PM_DWARF_LORD, PM_DWARF_KING}, {PM_MIND_FLAYER, PM_MASTER_MIND_FLAYER}, {PM_ORC, PM_ORC_CAPTAIN}, {PM_HILL_ORC, PM_ORC_CAPTAIN}, {PM_MORDOR_ORC, PM_ORC_CAPTAIN}, {PM_URUK_HAI, PM_ORC_CAPTAIN}, {PM_SEWER_RAT, PM_GIANT_RAT}, {PM_CAVE_SPIDER, PM_GIANT_SPIDER}, {PM_OGRE, PM_OGRE_LORD}, {PM_OGRE_LORD, PM_OGRE_KING}, {PM_ELF, PM_ELF_LORD}, {PM_WOODLAND_ELF, PM_ELF_LORD}, {PM_GREEN_ELF, PM_ELF_LORD}, {PM_GREY_ELF, PM_ELF_LORD}, {PM_ELF_LORD, PM_ELVENKING}, {PM_LICH, PM_DEMILICH}, {PM_DEMILICH, PM_MASTER_LICH}, {PM_MASTER_LICH, PM_ARCH_LICH}, {PM_VAMPIRE, PM_VAMPIRE_LORD}, {PM_VAMPIRE_LORD, PM_VAMPIRE_MAGE}, {PM_BAT, PM_GIANT_BAT}, {PM_CHICKATRICE, PM_COCKATRICE}, {PM_BABY_GRAY_DRAGON, PM_GRAY_DRAGON}, {PM_BABY_RED_DRAGON, PM_RED_DRAGON}, {PM_BABY_SILVER_DRAGON, PM_SILVER_DRAGON}, {PM_BABY_DEEP_DRAGON, PM_DEEP_DRAGON}, {PM_BABY_SHIMMERING_DRAGON, PM_SHIMMERING_DRAGON}, {PM_BABY_WHITE_DRAGON, PM_WHITE_DRAGON}, {PM_BABY_ORANGE_DRAGON, PM_ORANGE_DRAGON}, {PM_BABY_BLACK_DRAGON, PM_BLACK_DRAGON}, {PM_BABY_BLUE_DRAGON, PM_BLUE_DRAGON}, {PM_BABY_GREEN_DRAGON, PM_GREEN_DRAGON}, {PM_BABY_YELLOW_DRAGON, PM_YELLOW_DRAGON}, {PM_RED_NAGA_HATCHLING, PM_RED_NAGA}, {PM_BLACK_NAGA_HATCHLING, PM_BLACK_NAGA}, {PM_GOLDEN_NAGA_HATCHLING, PM_GOLDEN_NAGA}, {PM_GUARDIAN_NAGA_HATCHLING, PM_GUARDIAN_NAGA}, {PM_SMALL_MIMIC, PM_LARGE_MIMIC}, {PM_LARGE_MIMIC, PM_GIANT_MIMIC}, {PM_BABY_LONG_WORM, PM_LONG_WORM}, {PM_BABY_PURPLE_WORM, PM_PURPLE_WORM}, {PM_BABY_CROCODILE, PM_CROCODILE}, {PM_SOLDIER, PM_SERGEANT}, {PM_SERGEANT, PM_LIEUTENANT}, {PM_LIEUTENANT, PM_CAPTAIN}, {PM_WATCHMAN, PM_WATCH_CAPTAIN}, {PM_ALIGNED_PRIEST, PM_HIGH_PRIEST}, {PM_STUDENT, PM_ARCHEOLOGIST}, {PM_ATTENDANT, PM_HEALER}, {PM_PAGE, PM_KNIGHT}, {PM_ACOLYTE, PM_PRIEST}, {PM_APPRENTICE, PM_WIZARD}, {PM_MANES,PM_LEMURE}, #ifdef KOPS {PM_KEYSTONE_KOP, PM_KOP_SERGEANT}, {PM_KOP_SERGEANT, PM_KOP_LIEUTENANT}, {PM_KOP_LIEUTENANT, PM_KOP_KAPTAIN}, #endif /* WAC -- added killer coin piles */ {PM_PILE_OF_KILLER_COINS, PM_LARGE_PILE_OF_KILLER_COINS}, {PM_LARGE_PILE_OF_KILLER_COINS,PM_HUGE_PILE_OF_KILLER_COINS}, /* KMH -- added more sequences */ {PM_DINGO_PUPPY, PM_DINGO}, {PM_DINGO, PM_LARGE_DINGO}, {PM_PONY, PM_HORSE}, {PM_HORSE, PM_WARHORSE}, {PM_LARVA, PM_MAGGOT}, {PM_MAGGOT, PM_DUNG_WORM}, {PM_WINTER_WOLF_CUB, PM_WINTER_WOLF}, {PM_GIANT_TICK, PM_GIANT_FLEA}, {PM_GIANT_FLEA, PM_GIANT_LOUSE}, /* RJ */ /* DS -- growing up, Lethe style */ {PM_DEEP_ONE, PM_DEEPER_ONE}, {PM_DEEPER_ONE, PM_DEEPEST_ONE}, {PM_LAMB, PM_SHEEP}, {PM_SHOGGOTH, PM_GIANT_SHOGGOTH}, {PM_GNOLL, PM_GNOLL_WARRIOR}, {PM_GNOLL_WARRIOR, PM_GNOLL_CHIEFTAIN}, {PM_MIGO_DRONE, PM_MIGO_WARRIOR}, {NON_PM,NON_PM} }; int little_to_big(montype) int montype; { #ifndef AIXPS2_BUG register int i; for (i = 0; grownups[i][0] >= LOW_PM; i++) if(montype == grownups[i][0]) return grownups[i][1]; return montype; #else /* AIX PS/2 C-compiler 1.1.1 optimizer does not like the above for loop, * and causes segmentation faults at runtime. (The problem does not * occur if -O is not used.) * lehtonen@cs.Helsinki.FI (Tapio Lehtonen) 28031990 */ int i; int monvalue; monvalue = montype; for (i = 0; grownups[i][0] >= LOW_PM; i++) if(montype == grownups[i][0]) monvalue = grownups[i][1]; return monvalue; #endif } int big_to_little(montype) int montype; { register int i; for (i = 0; grownups[i][0] >= LOW_PM; i++) if(montype == grownups[i][1]) return grownups[i][0]; return montype; } /* * Return the permonst ptr for the race of the monster. * Returns correct pointer for non-polymorphed and polymorphed * player. It does not return a pointer to player role character. */ const struct permonst * raceptr(mtmp) struct monst *mtmp; { if (mtmp == &youmonst && !Upolyd) return(&mons[urace.malenum]); else return(mtmp->data); } 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) const struct permonst *ptr; const char *def; { int capitalize = (*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 ); } 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 ); } /* return a phrase describing the effect of fire attack on a type of monster */ const char * on_fire(mptr, mattk) struct permonst *mptr; struct attack *mattk; { const char *what; switch (monsndx(mptr)) { case PM_FLAMING_SPHERE: case PM_FIRE_VORTEX: case PM_FIRE_ELEMENTAL: case PM_SALAMANDER: what = "already on fire"; break; case PM_WATER_ELEMENTAL: case PM_FOG_CLOUD: case PM_STEAM_VORTEX: what = "boiling"; break; case PM_ICE_VORTEX: case PM_GLASS_GOLEM: what = "melting"; break; case PM_STONE_GOLEM: case PM_CLAY_GOLEM: case PM_GOLD_GOLEM: case PM_AIR_ELEMENTAL: case PM_EARTH_ELEMENTAL: case PM_DUST_VORTEX: case PM_ENERGY_VORTEX: what = "heating up"; break; default: what = (mattk->aatyp == AT_HUGS) ? "being roasted" : "on fire"; break; } return what; } #endif /* OVLB */ /*mondata.c*/ slashem-0.0.7E7F3/src/rip.c0000664000076400007640000001335110545462317013404 0ustar aliali/* SCCS Id: @(#)rip.c 3.4 2003/01/08 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" STATIC_DCL void FDECL(center, (int, char *)); extern const char * const killed_by_prefix[]; /* from topten.c */ #if defined(TTY_GRAPHICS) || defined(X11_GRAPHICS) || defined(GEM_GRAPHICS) || defined(MSWIN_GRAPHICS) || defined(GTK_GRAPHICS) # define TEXT_TOMBSTONE #endif #if defined(mac) || defined(__BEOS__) || defined(WIN32_GRAPHICS) # ifndef TEXT_TOMBSTONE # define TEXT_TOMBSTONE # endif #endif #ifdef TEXT_TOMBSTONE #ifndef NH320_DEDICATION /* A normal tombstone for end of game display. */ static const char *rip_txt[] = { " ----------", " / \\", " / REST \\", " / IN \\", " / PEACE \\", " / \\", " | |", /* Name of player */ " | |", /* Amount of $ */ " | |", /* Type of death */ " | |", /* . */ " | |", /* . */ " | |", /* . */ " | 1001 |", /* Real year of death */ " *| * * * | *", " _________)/\\\\_//(\\/(/\\)/\\//\\/|_)_______", 0 }; #define STONE_LINE_CENT 28 /* char[] element of center of stone face */ #else /* NH320_DEDICATION */ /* NetHack 3.2.x displayed a dual tombstone as a tribute to Izchak. */ static const char *rip_txt[] = { " ---------- ----------", " / \\ / \\", " / REST \\ / This \\", " / IN \\ / release of \\", " / PEACE \\ / NetHack is \\", " / \\ / dedicated to \\", " | | | the memory of |", " | | | |", " | | | Izchak Miller |", " | | | 1935 - 1994 |", " | | | |", " | | | Ascended |", " | 1001 | | |", " * | * * * | * * | * * * | *", " _____)/\\|\\__//(\\/(/\\)/\\//\\/|_)________)/|\\\\_/_/(\\/(/\\)/\\/\\/|_)____", 0 }; #define STONE_LINE_CENT 19 /* char[] element of center of stone face */ #endif /* NH320_DEDICATION */ #define STONE_LINE_LEN 16 /* # chars that fit on one line * (note 1 ' ' border) */ #define NAME_LINE 6 /* *char[] line # for player name */ #define GOLD_LINE 7 /* *char[] line # for amount of gold */ #define DEATH_LINE 8 /* *char[] line # for death description */ #define YEAR_LINE 12 /* *char[] line # for year */ static char **rip; STATIC_OVL void center(line, text) int line; char *text; { register char *ip,*op; ip = text; op = &rip[line][STONE_LINE_CENT - ((strlen(text)+1)>>1)]; while(*ip) *op++ = *ip++; } void genl_outrip(tmpwin, how) winid tmpwin; int how; { register char **dp; register char *dpx; char buf[BUFSZ]; register int x; int line; rip = dp = (char **) alloc(sizeof(rip_txt)); for (x = 0; rip_txt[x]; x++) { dp[x] = (char *) alloc((unsigned int)(strlen(rip_txt[x]) + 1)); Strcpy(dp[x], rip_txt[x]); } dp[x] = (char *)0; /* Put name on stone */ Sprintf(buf, "%s", plname); buf[STONE_LINE_LEN] = 0; 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); /* Put together death description */ switch (killer_format) { default: impossible("bad killer format?"); case KILLED_BY_AN: if (Instant_Death) { Strcpy(buf, "instantly "); strcat(buf, killed_by_prefix[how]); } else if (Quick_Death) { Strcpy(buf, "quickly "); strcat(buf, killed_by_prefix[how]); } else Strcpy(buf, killed_by_prefix[how]); Strcat(buf, an(killer)); break; case KILLED_BY: if (Instant_Death) { Strcpy(buf, "instantly "); strcat(buf, killed_by_prefix[how]); } else if (Quick_Death) { Strcpy(buf, "quickly "); strcat(buf, killed_by_prefix[how]); } else Strcpy(buf, killed_by_prefix[how]); Strcat(buf, killer); break; case NO_KILLER_PREFIX: Strcpy(buf, killer); break; } /* Put death type on stone */ for (line=DEATH_LINE, dpx = buf; line 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; center(line, dpx); if (tmpchar != ' ') { dpx[i0] = tmpchar; dpx= &dpx[i0]; } else dpx= &dpx[i0+1]; } /* Put year on stone */ Sprintf(buf, "%4d", getyear()); center(YEAR_LINE, buf); putstr(tmpwin, 0, ""); for(; *dp; dp++) putstr(tmpwin, 0, *dp); putstr(tmpwin, 0, ""); putstr(tmpwin, 0, ""); for (x = 0; rip_txt[x]; x++) { free((genericptr_t)rip[x]); } free((genericptr_t)rip); rip = 0; } #endif /* TEXT_TOMBSTONE */ /*rip.c*/ slashem-0.0.7E7F3/src/worm.c0000664000076400007640000004560110545462317013601 0ustar aliali/* 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. */ #include "hack.h" #include "lev.h" #define newseg() (struct wseg *) alloc(sizeof(struct wseg)) #define dealloc_seg(wseg) free((genericptr_t) (wseg)) /* worm segment structure */ struct wseg { struct wseg *nseg; xchar wx, wy; /* the segment's position */ }; STATIC_DCL void FDECL(toss_wsegs, (struct wseg *,BOOLEAN_P)); STATIC_DCL void FDECL(shrink_worm, (int)); STATIC_DCL void FDECL(random_dir, (XCHAR_P,XCHAR_P,xchar *,xchar *)); STATIC_DCL struct wseg *FDECL(create_worm_tail, (int)); /* Description of long worm implementation. * * Each monst struct of the head of a tailed worm has a wormno set to * 1 <= wormno < MAX_NUM_WORMS * If wormno == 0 this does not mean that the monster is not a worm, * it just means that the monster does not have a long worm tail. * * The actual segments of a worm are not full blown monst structs. * They are small wseg structs, and their position in the levels.monsters[][] * array is held by the monst struct of the head of the worm. This makes * things like probing and hit point bookkeeping much easier. * * The segments of the long worms on a level are kept as an array of * singly threaded linked lists. The wormno variable is used as an index * for these segment arrays. * * wtails: The first (starting struct) of a linked list. This points * to the tail (last) segment of the worm. * * wheads: The last (end) of a linked list of segments. This points to * the segment that is at the same position as the real monster * (the head). Note that the segment that wheads[wormno] points * to, is not displayed. It is simply there to keep track of * where the head came from, so that worm movement and display are * simplified later. * Keeping the head segment of the worm at the end of the list * of tail segments is an endless source of confusion, but it is * necessary. * From now on, we will use "start" and "end" to refer to the * linked list and "head" and "tail" to refer to the worm. * * One final worm array is: * * wgrowtime: This tells us when to add another segment to the worm. * * When a worm is moved, we add a new segment at the head, and delete the * segment at the tail (unless we want it to grow). This new head segment is * located in the same square as the actual head of the worm. If we want * to grow the worm, we don't delete the tail segment, and we give the worm * extra hit points, which possibly go into its maximum. * * Non-moving worms (worm_nomove) are assumed to be surrounded by their own * tail, and, thus, shrink instead of grow (as their tails keep going while * their heads are stopped short). In this case, we delete the last tail * segment, and remove hit points from the worm. */ struct wseg *wheads[MAX_NUM_WORMS] = DUMMY, *wtails[MAX_NUM_WORMS] = DUMMY; long wgrowtime[MAX_NUM_WORMS] = DUMMY; /* * get_wormno() * * Find an unused worm tail slot and return the index. A zero means that * there are no slots available. This means that the worm head can exist, * it just cannot ever grow a tail. * * It, also, means that there is an optimisation to made. The [0] positions * of the arrays are never used. Meaning, we really *could* have one more * tailed worm on the level, or use a smaller array (using wormno - 1). * * Implementation is left to the interested hacker. */ int get_wormno() { register int new_wormno = 1; while (new_wormno < MAX_NUM_WORMS) { if (!wheads[new_wormno]) return new_wormno; /* found an empty wtails[] slot at new_wormno */ new_wormno++; } return(0); /* level infested with worms */ } /* * initworm() * * Use if (mon->wormno = get_wormno()) before calling this function! * * Initialize the worm entry. This will set up the worm grow time, and * create and initialize the dummy segment for wheads[] and wtails[]. * * If the worm has no tail (ie get_wormno() fails) then this function need * not be called. */ void initworm(worm, wseg_count) struct monst *worm; int wseg_count; { register struct wseg *seg, *new_tail = create_worm_tail(wseg_count); register int wnum = worm->wormno; /* if (!wnum) return; bullet proofing */ if (new_tail) { wtails[wnum] = new_tail; for (seg = new_tail; seg->nseg; seg = seg->nseg); wheads[wnum] = seg; } else { wtails[wnum] = wheads[wnum] = seg = newseg(); seg->nseg = (struct wseg *) 0; seg->wx = worm->mx; seg->wy = worm->my; } wgrowtime[wnum] = 0L; } /* * toss_wsegs() * * Get rid of all worm segments on and following the given pointer curr. * The display may or may not need to be updated as we free the segments. */ STATIC_OVL void toss_wsegs(curr, display_update) register struct wseg *curr; register boolean display_update; { register struct wseg *seg; while (curr) { seg = curr->nseg; /* remove from level.monsters[][] */ /* need to check curr->wx for genocided while migrating_mon */ if (curr->wx) { remove_monster(curr->wx, curr->wy); /* update screen before deallocation */ if (display_update) newsym(curr->wx,curr->wy); } /* free memory used by the segment */ dealloc_seg(curr); curr = seg; } } /* * shrink_worm() * * Remove the tail segment of the worm (the starting segment of the list). */ STATIC_OVL void shrink_worm(wnum) int wnum; /* worm number */ { struct wseg *seg; if (wtails[wnum] == wheads[wnum]) return; /* no tail */ seg = wtails[wnum]; wtails[wnum] = seg->nseg; seg->nseg = (struct wseg *) 0; toss_wsegs(seg, TRUE); } /* * worm_move() * * Check for mon->wormno before calling this function! * * Move the worm. Maybe grow. */ void worm_move(worm) struct monst *worm; { register struct wseg *seg, *new_seg; /* new segment */ register int wnum = worm->wormno; /* worm number */ /* if (!wnum) return; bullet proofing */ /* * Place a segment at the old worm head. The head has already moved. */ seg = wheads[wnum]; place_worm_seg(worm, seg->wx, seg->wy); newsym(seg->wx,seg->wy); /* display the new segment */ /* * Create a new dummy segment head and place it at the end of the list. */ new_seg = newseg(); new_seg->wx = worm->mx; new_seg->wy = worm->my; new_seg->nseg = (struct wseg *) 0; seg->nseg = new_seg; /* attach it to the end of the list */ wheads[wnum] = new_seg; /* move the end pointer */ if (wgrowtime[wnum] <= moves) { if (!wgrowtime[wnum]) wgrowtime[wnum] = moves + rnd(5); else wgrowtime[wnum] += rn1(15, 3); worm->mhp += 3; if (worm->mhp > MHPMAX) worm->mhp = MHPMAX; if (worm->mhp > worm->mhpmax) worm->mhpmax = worm->mhp; } else /* The worm doesn't grow, so the last segment goes away. */ shrink_worm(wnum); } /* * worm_nomove() * * Check for mon->wormno before calling this function! * * The worm don't move so it should shrink. */ void worm_nomove(worm) register struct monst *worm; { shrink_worm((int) worm->wormno); /* shrink */ if (worm->mhp > 3) worm->mhp -= 3; /* mhpmax not changed ! */ else worm->mhp = 1; } /* * wormgone() * * Check for mon->wormno before calling this function! * * Kill a worm tail. */ void wormgone(worm) register struct monst *worm; { register int wnum = worm->wormno; /* if (!wnum) return; bullet proofing */ worm->wormno = 0; /* This will also remove the real monster (ie 'w') from the its * position in level.monsters[][]. */ toss_wsegs(wtails[wnum], TRUE); wheads[wnum] = wtails[wnum] = (struct wseg *) 0; } /* * wormhitu() * * Check for mon->wormno before calling this function! * * If the hero is near any part of the worm, the worm will try to attack. */ void wormhitu(worm) register struct monst *worm; { register int wnum = worm->wormno; register struct wseg *seg; /* if (!wnum) return; bullet proofing */ /* This does not work right now because mattacku() thinks that the head is * out of range of the player. We might try to kludge, and bring the head * within range for a tiny moment, but this needs a bit more looking at * before we decide to do this. */ for (seg = wtails[wnum]; seg; seg = seg->nseg) if (distu(seg->wx, seg->wy) < 3) (void) mattacku(worm); } /* cutworm() * * Check for mon->wormno before calling this function! * * When hitting a worm (worm) at position x, y, with a weapon (weap), * there is a chance that the worm will be cut in half, and a chance * that both halves will survive. * * [ALI] Return true if worm is cut. */ int cutworm(worm, x, y, weap) struct monst *worm; xchar x,y; struct obj *weap; { register struct wseg *curr, *new_tail; register struct monst *new_worm; int wnum = worm->wormno; int cut_chance, new_wnum; if (!wnum) return 0; /* bullet proofing */ if (x == worm->mx && y == worm->my) return 0; /* hit on head */ /* cutting goes best with a bladed weapon */ cut_chance = rnd(20); /* Normally 1-16 does not cut */ /* Normally 17-20 does */ if (weap && is_blade(weap)) /* With a blade 1- 6 does not cut */ cut_chance += 10; /* 7-20 does */ if (cut_chance < 17) return 0; /* not good enough */ /* Find the segment that was attacked. */ curr = wtails[wnum]; while ( (curr->wx != x) || (curr->wy != y) ) { curr = curr->nseg; if (!curr) { impossible("cutworm: no segment at (%d,%d)", (int) x, (int) y); return 0; } } /* If this is the tail segment, then the worm just loses it. */ if (curr == wtails[wnum]) { shrink_worm(wnum); return 1; } /* * Split the worm. The tail for the new worm is the old worm's tail. * The tail for the old worm is the segment that follows "curr", * and "curr" becomes the dummy segment under the new head. */ new_tail = wtails[wnum]; wtails[wnum] = curr->nseg; curr->nseg = (struct wseg *) 0; /* split the worm */ /* * At this point, the old worm is correct. Any new worm will have * it's head at "curr" and its tail at "new_tail". */ /* Sometimes the tail end dies. */ if (rn2(3) || !(new_wnum = get_wormno())) { if (flags.mon_moving) pline("Part of the tail of %s is cut off.", mon_nam(worm)); else You("cut part of the tail off of %s.", mon_nam(worm)); toss_wsegs(new_tail, TRUE); if (worm->mhp > 1) worm->mhp /= 2; return 1; } remove_monster(x, y); /* clone_mon puts new head here */ new_worm = clone_mon(worm, x, y); new_worm->wormno = new_wnum; /* affix new worm number */ /* Devalue the monster level of both halves of the worm. */ worm->m_lev = ((unsigned)worm->m_lev <= 3) ? (unsigned)worm->m_lev : max((unsigned)worm->m_lev - 2, 3); new_worm->m_lev = worm->m_lev; /* Calculate the mhp on the new_worm for the (lower) monster level. */ new_worm->mhpmax = new_worm->mhp = d((int)new_worm->m_lev, 8); /* Calculate the mhp on the old worm for the (lower) monster level. */ if (worm->m_lev > 3) { worm->mhpmax = d((int)worm->m_lev, 8); if (worm->mhpmax < worm->mhp) worm->mhp = worm->mhpmax; } wtails[new_wnum] = new_tail; /* We've got all the info right now */ wheads[new_wnum] = curr; /* so we can do this faster than */ wgrowtime[new_wnum] = 0L; /* trying to call initworm(). */ /* Place the new monster at all the segment locations. */ place_wsegs(new_worm); if (flags.mon_moving) pline("%s is cut in half.", Monnam(worm)); else You("cut %s in half.", mon_nam(worm)); return 1; } /* * see_wsegs() * * Refresh all of the segments of the given worm. This is only called * from see_monster() in display.c or when a monster goes minvis. It * is located here for modularity. */ void see_wsegs(worm) struct monst *worm; { struct wseg *curr = wtails[worm->wormno]; /* if (!mtmp->wormno) return; bullet proofing */ while (curr != wheads[worm->wormno]) { newsym(curr->wx,curr->wy); curr = curr->nseg; } } /* * detect_wsegs() * * Display all of the segments of the given worm for detection. */ void detect_wsegs(worm, use_detection_glyph) struct monst *worm; boolean use_detection_glyph; { int num; struct wseg *curr = wtails[worm->wormno]; /* if (!mtmp->wormno) return; bullet proofing */ while (curr != wheads[worm->wormno]) { num = use_detection_glyph ? detected_monnum_to_glyph(what_mon(PM_LONG_WORM_TAIL)) : monnum_to_glyph(what_mon(PM_LONG_WORM_TAIL)); show_glyph(curr->wx,curr->wy,num); curr = curr->nseg; } } /* * save_worm() * * Save the worm information for later use. The count is the number * of segments, including the dummy. Called from save.c. */ void save_worm(fd, mode) int fd, mode; { int i; int count; struct wseg *curr, *temp; if (perform_bwrite(mode)) { for (i = 1; i < MAX_NUM_WORMS; i++) { for (count = 0, curr = wtails[i]; curr; curr = curr->nseg) count++; /* Save number of segments */ bwrite(fd, (genericptr_t) &count, sizeof(int)); /* Save segment locations of the monster. */ if (count) { for (curr = wtails[i]; curr; curr = curr->nseg) { bwrite(fd, (genericptr_t) &(curr->wx), sizeof(xchar)); bwrite(fd, (genericptr_t) &(curr->wy), sizeof(xchar)); } } } bwrite(fd, (genericptr_t) wgrowtime, sizeof(wgrowtime)); } if (release_data(mode)) { /* Free the segments only. savemonchn() will take care of the * monsters. */ for (i = 1; i < MAX_NUM_WORMS; i++) { if (!(curr = wtails[i])) continue; while (curr) { temp = curr->nseg; dealloc_seg(curr); /* free the segment */ curr = temp; } wheads[i] = wtails[i] = (struct wseg *) 0; } } } /* * rest_worm() * * Restore the worm information from the save file. Called from restore.c */ void rest_worm(fd) int fd; { int i, j, count; struct wseg *curr, *temp; for (i = 1; i < MAX_NUM_WORMS; i++) { mread(fd, (genericptr_t) &count, sizeof(int)); if (!count) continue; /* none */ /* Get the segments. */ for (curr = (struct wseg *) 0, j = 0; j < count; j++) { temp = newseg(); temp->nseg = (struct wseg *) 0; mread(fd, (genericptr_t) &(temp->wx), sizeof(xchar)); mread(fd, (genericptr_t) &(temp->wy), sizeof(xchar)); if (curr) curr->nseg = temp; else wtails[i] = temp; curr = temp; } wheads[i] = curr; } mread(fd, (genericptr_t) wgrowtime, sizeof(wgrowtime)); } /* * place_wsegs() * * Place the segments of the given worm. Called from restore.c */ void place_wsegs(worm) struct monst *worm; { struct wseg *curr = wtails[worm->wormno]; /* if (!mtmp->wormno) return; bullet proofing */ while (curr != wheads[worm->wormno]) { place_worm_seg(worm,curr->wx,curr->wy); curr = curr->nseg; } } /* * remove_worm() * * This function is equivalent to the remove_monster #define in * rm.h, only it will take the worm *and* tail out of the levels array. * It does not get rid of (dealloc) the worm tail structures, and it does * not remove the mon from the fmon chain. */ void remove_worm(worm) register struct monst *worm; { register struct wseg *curr = wtails[worm->wormno]; /* if (!mtmp->wormno) return; bullet proofing */ while (curr) { remove_monster(curr->wx, curr->wy); newsym(curr->wx, curr->wy); curr = curr->nseg; } } /* * place_worm_tail_randomly() * * Place a worm tail somewhere on a level behind the head. * This routine essentially reverses the order of the wsegs from head * to tail while placing them. * x, and y are most likely the worm->mx, and worm->my, but don't *need* to * be, if somehow the head is disjoint from the tail. */ void place_worm_tail_randomly(worm, x, y) struct monst *worm; xchar x, y; { int wnum = worm->wormno; struct wseg *curr = wtails[wnum]; struct wseg *new_tail; register xchar ox = x, oy = y; /* if (!wnum) return; bullet proofing */ if (wnum && (!wtails[wnum] || !wheads[wnum]) ) { impossible("place_worm_tail_randomly: wormno is set without a tail!"); return; } wheads[wnum] = new_tail = curr; curr = curr->nseg; new_tail->nseg = (struct wseg *) 0; new_tail->wx = x; new_tail->wy = y; while(curr) { xchar nx, ny; char tryct = 0; /* pick a random direction from x, y and search for goodpos() */ do { random_dir(ox, oy, &nx, &ny); } while (!goodpos(nx, ny, worm, 0) && (tryct++ < 50)); if (tryct < 50) { place_worm_seg(worm, nx, ny); curr->wx = ox = nx; curr->wy = oy = ny; wtails[wnum] = curr; curr = curr->nseg; wtails[wnum]->nseg = new_tail; new_tail = wtails[wnum]; newsym(nx, ny); } else { /* Oops. Truncate because there was */ toss_wsegs(curr, FALSE); /* no place for the rest of it */ curr = (struct wseg *) 0; } } } /* * Given a coordinate x, y. * return in *nx, *ny, the coordinates of one of the <= 8 squares adjoining. * * This function, and the loop it serves, could be eliminated by coding * enexto() with a search radius. */ STATIC_OVL void random_dir(x, y, nx, ny) register xchar x, y; register xchar *nx, *ny; { *nx = x; *ny = y; *nx += (x > 1 ? /* extreme left ? */ (x < COLNO ? /* extreme right ? */ (rn2(3) - 1) /* neither so +1, 0, or -1 */ : -rn2(2)) /* 0, or -1 */ : rn2(2)); /* 0, or 1 */ *ny += (*nx == x ? /* same kind of thing with y */ (y > 1 ? (y < ROWNO ? (rn2(2) ? 1 : -1) : -1) : 1) : (y > 1 ? (y < ROWNO ? (rn2(3) - 1) : -rn2(2)) : rn2(2))); } /* count_wsegs() * * returns * the number of visible segments that a worm has. */ int count_wsegs(mtmp) struct monst *mtmp; { register int i=0; register struct wseg *curr = (wtails[mtmp->wormno])->nseg; /* if (!mtmp->wormno) return 0; bullet proofing */ while (curr) { i++; curr = curr->nseg; } return i; } /* create_worm_tail() * * will create a worm tail chain of (num_segs + 1) and return a pointer to it. */ STATIC_OVL struct wseg * create_worm_tail(num_segs) int num_segs; { register int i=0; register struct wseg *new_tail, *curr; if (!num_segs) return (struct wseg *)0; new_tail = curr = newseg(); curr->nseg = (struct wseg *)0; curr->wx = 0; curr->wy = 0; while (i < num_segs) { curr->nseg = newseg(); curr = curr->nseg; curr->nseg = (struct wseg *)0; curr->wx = 0; curr->wy = 0; i++; } return (new_tail); } /* worm_known() * * Is any segment of this worm in viewing range? Note: caller must check * invisibility and telepathy (which should only show the head anyway). * Mostly used in the canseemon() macro. */ boolean worm_known(worm) struct monst *worm; { struct wseg *curr = wtails[worm->wormno]; while (curr) { if(cansee(curr->wx,curr->wy)) return TRUE; curr = curr->nseg; } return FALSE; } /*worm.c*/ slashem-0.0.7E7F3/src/hack.c0000664000076400007640000022051310545462317013520 0ustar aliali/* SCCS Id: @(#)hack.c 3.4 2003/04/30 */ /* 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 boolean FDECL(findtravelpath, (BOOLEAN_P)); STATIC_DCL boolean FDECL(monstinroom, (struct permonst *,int)); STATIC_DCL void FDECL(move_update, (BOOLEAN_P)); #define IS_SHOP(x) (rooms[x].rtype >= SHOPBASE) #ifdef OVL2 #ifdef DUNGEON_GROWTH void rndmappos(x,y) /* guaranteed to return a valid coord */ xchar *x; xchar *y; { if (*x >= COLNO) *x = COLNO; else if (*x == -1) *x = rn2(COLNO-1)+1; else if (*x < 1) *x = 1; if (*y >= ROWNO) *y = ROWNO; else if (*y == -1) *y = rn2(ROWNO); else if (*y < 0) *y = 0; } #define HERB_GROWTH_LIMIT 3 /* to limit excessive farming */ static const struct herb_info { int herb; boolean in_water; } herb_info[] = { { SPRIG_OF_WOLFSBANE, FALSE }, { CLOVE_OF_GARLIC, FALSE }, { CARROT, FALSE }, { KELP_FROND, TRUE } }; long count_herbs_at(x,y, watery) xchar x,y; boolean watery; { register int dd; register long count = 0; if (isok(x,y)) { for (dd = 0; dd < SIZE(herb_info); dd++) { if (watery == herb_info[dd].in_water) { register struct obj *otmp = sobj_at(herb_info[dd].herb, x,y); if (otmp) count += otmp->quan; } } } return count; } /* returns TRUE if a herb can grow at (x,y) */ boolean herb_can_grow_at(x,y, watery) xchar x,y; boolean watery; { register struct rm *lev = &levl[x][y]; if (inside_shop(x,y)) return FALSE; if (watery) return (IS_POOL(lev->typ) && ((count_herbs_at(x,y, watery)) < HERB_GROWTH_LIMIT)); return (lev->lit && (lev->typ == ROOM || lev->typ == CORR || (IS_DOOR(lev->typ) && ((lev->doormask == D_NODOOR) || (lev->doormask == D_ISOPEN) || (lev->doormask == D_BROKEN)))) && (count_herbs_at(x,y, watery) < HERB_GROWTH_LIMIT)); } /* grow herbs in water. return true if did something. */ boolean grow_water_herbs(herb, x,y) int herb; xchar x,y; { struct obj *otmp; rndmappos(&x, &y); otmp = sobj_at(herb, x, y); if (otmp && herb_can_grow_at(x,y, TRUE)) { otmp->quan++; otmp->owt = weight(otmp); return TRUE; /* There's no need to start growing these on the neighboring * mapgrids, as they move around (see water_current()) */ } return FALSE; } /* grow herb on ground at (x,y), or maybe spread out. return true if did something. */ boolean grow_herbs(herb, x,y, showmsg, update) int herb; xchar x,y; boolean showmsg, update; { struct obj *otmp; struct rm *lev; rndmappos(&x, &y); lev = &levl[x][y]; otmp = sobj_at(herb, x, y); if (otmp && herb_can_grow_at(x,y, FALSE)) { if (otmp->quan <= rn2(HERB_GROWTH_LIMIT)) { otmp->quan++; otmp->owt = weight(otmp); return TRUE; } else { int dd, dofs = rn2(8); /* check surroundings, maybe grow there? */ for (dd = 0; dd < 8; dd++) { coord pos; dtoxy(&pos, (dd+dofs) % 8); pos.x += x; pos.y += y; if (isok(pos.x,pos.y) && herb_can_grow_at(pos.x,pos.y, FALSE)) { lev = &levl[pos.x][pos.y]; otmp = sobj_at(herb, pos.x, pos.y); if (otmp) { if (otmp->quan <= rn2(HERB_GROWTH_LIMIT)) { otmp->quan++; otmp->owt = weight(otmp); return TRUE; } } else { otmp = mksobj(herb, TRUE, FALSE); otmp->quan = 1; otmp->owt = weight(otmp); place_object(otmp, pos.x, pos.y); if (update) newsym(pos.x,pos.y); if (cansee(pos.x,pos.y)) { if (showmsg && flags.verbose) { const char *what; if (herb == CLOVE_OF_GARLIC) what = "some garlic"; else what = an(xname(otmp)); Norep("Suddenly you notice %s growing on the %s.", what, surface(pos.x,pos.y)); } } return TRUE; } } } } } return FALSE; } /* moves topmost object in water at (x,y) to dir. return true if did something. */ boolean water_current(x,y,dir,waterforce, showmsg, update) xchar x,y; int dir; unsigned waterforce; /* strength of the water current */ boolean showmsg, update; { struct obj *otmp; coord pos; rndmappos(&x,&y); dtoxy(&pos, dir); pos.x += x; pos.y += y; if (isok(pos.x,pos.y) && IS_POOL(levl[x][y].typ) && IS_POOL(levl[pos.x][pos.y].typ)) { otmp = level.objects[x][y]; if (otmp && otmp->where == OBJ_FLOOR) { if (otmp->quan > 1) otmp = splitobj(otmp, otmp->quan - 1); if (otmp->owt <= waterforce) { if (showmsg && Underwater && (cansee(pos.x,pos.y) || cansee(x,y))) { Norep("%s floats%s in%s the murky water.", An(xname(otmp)), (cansee(x,y) && cansee(pos.x,pos.y)) ? "" : (cansee(x,y) ? " away from you" : " towards you"), flags.verbose ? " the currents of" : ""); } obj_extract_self(otmp); place_object(otmp, pos.x,pos.y); stackobj(otmp); if (update) { newsym(x,y); newsym(pos.x,pos.y); } return TRUE; } else /* the object didn't move, put it back */ stackobj(otmp); } } return FALSE; } /* a tree at (x,y) spontaneously drops a ripe fruit */ boolean drop_ripe_treefruit(x,y,showmsg, update) xchar x,y; boolean showmsg, update; { register struct rm *lev; rndmappos(&x,&y); lev = &levl[x][y]; if (IS_TREE(lev->typ) && !(lev->looted & TREE_LOOTED) && may_dig(x,y)) { coord pos; int dir, dofs = rn2(8); for (dir = 0; dir < 8; dir++) { dtoxy(&pos, (dir + dofs) % 8); pos.x += x; pos.y += y; if (!isok(pos.x, pos.y)) return FALSE; lev = &levl[pos.x][pos.y]; if (SPACE_POS(lev->typ) || IS_POOL(lev->typ)) { struct obj *otmp; otmp = rnd_treefruit_at(pos.x,pos.y); if (otmp) { otmp->quan = 1; otmp->owt = weight(otmp); obj_extract_self(otmp); if (showmsg) { if ((cansee(pos.x,pos.y) || cansee(x,y))) { Norep("%s falls from %s%s.", cansee(pos.x,pos.y) ? An(xname(otmp)) : Something, cansee(x,y) ? "the tree" : "somewhere", (cansee(x,y) && IS_POOL(lev->typ)) ? " into the water" : ""); } else if (distu(pos.x,pos.y) < 9 && otmp->otyp != EUCALYPTUS_LEAF) { /* a leaf is too light to cause any sound */ You_hear("a %s!", (IS_POOL(lev->typ) || IS_FOUNTAIN(lev->typ)) ? "plop" : "splut"); /* rainforesty sounds */ } } place_object(otmp, pos.x,pos.y); stackobj(otmp); if (rn2(6)) levl[x][y].looted |= TREE_LOOTED; if (update) newsym(pos.x,pos.y); return TRUE; } } } } return FALSE; } /* Tree at (x,y) seeds. returns TRUE if a new tree was created. * Creates a kind of forest, with (hopefully) most places available. */ boolean seed_tree(x,y) xchar x,y; { coord pos, pos2; struct rm *lev; rndmappos(&x,&y); if (IS_TREE(levl[x][y].typ) && may_dig(x,y)) { int dir = rn2(8); dtoxy(&pos, dir); pos.x += x; pos.y += y; if (!rn2(3)) { dtoxy(&pos2, (dir+rn2(2)) % 8); pos.x += pos2.x; pos.y += pos2.y; } if (!isok(pos.x,pos.y)) return FALSE; lev = &levl[pos.x][pos.y]; if (lev->lit && !cansee(pos.x,pos.y) && !inside_shop(pos.x,pos.y) && (lev->typ == ROOM || lev->typ == CORR) && !(u.ux == pos.x && u.uy == pos.y) && !m_at(pos.x,pos.y) && !t_at(pos.x,pos.y) && !OBJ_AT(pos.x,pos.y)) { int nogrow = 0; int dx,dy; for (dx = pos.x-1; dx <= pos.x+1; dx++) { for (dy = pos.y-1; dy <= pos.y+1; dy++) { if (!isok(dx,dy) || (isok(dx,dy) && !SPACE_POS(levl[dx][dy].typ))) nogrow++; } } if (nogrow < 3) { lev->typ = TREE; lev->looted &= ~TREE_LOOTED; block_point(pos.x,pos.y); return TRUE; } } } return FALSE; } void dgn_growths(showmsg, update) boolean showmsg; /* show messages */ boolean update; /* do newsym() */ { int herbnum = rn2(SIZE(herb_info)); (void) seed_tree(-1,-1); if (herb_info[herbnum].in_water) (void) grow_water_herbs(herb_info[herbnum].herb, -1,-1); else (void) grow_herbs(herb_info[herbnum].herb, -1,-1, showmsg, update); if (!rn2(30)) (void) drop_ripe_treefruit(-1,-1, showmsg, update); (void) water_current(-1,-1, rn2(8), Is_waterlevel(&u.uz) ? 200 : 25, showmsg, update); } /* catch up with growths when returning to a previously visited level */ void catchup_dgn_growths(mvs) int mvs; { if (mvs < 0) mvs = 0; else if (mvs > LARGEST_INT) mvs = LARGEST_INT; while (mvs-- > 0) dgn_growths(FALSE, FALSE); } #endif /* DUNGEON_GROWTH */ boolean revive_nasty(x, y, msg) int x,y; const char *msg; { register struct obj *otmp, *otmp2; struct monst *mtmp; coord cc; boolean revived = FALSE; for(otmp = level.objects[x][y]; otmp; otmp = otmp2) { otmp2 = otmp->nexthere; if (otmp->otyp == CORPSE && (is_rider(&mons[otmp->corpsenm]) || otmp->corpsenm == PM_WIZARD_OF_YENDOR)) { /* move any living monster already at that location */ if((mtmp = m_at(x,y)) && enexto(&cc, x, y, mtmp->data)) rloc_to(mtmp, cc.x, cc.y); if(msg) Norep("%s", msg); revived = revive_corpse(otmp, FALSE); } } /* this location might not be safe, if not, move revived monster */ if (revived) { mtmp = m_at(x,y); if (mtmp && !goodpos(x, y, mtmp, 0) && enexto(&cc, x, y, mtmp->data)) { rloc_to(mtmp, cc.x, cc.y); } /* else impossible? */ } return (revived); } STATIC_OVL int moverock() { register xchar rx, ry, sx, sy; register struct obj *otmp; register struct trap *ttmp; register struct monst *mtmp; sx = u.ux + u.dx, sy = u.uy + u.dy; /* boulder starting position */ while ((otmp = sobj_at(BOULDER, sx, sy)) != 0) { /* make sure that this boulder is visible as the top object */ if (otmp != level.objects[sx][sy]) movobj(otmp, sx, sy); rx = u.ux + 2 * u.dx; /* boulder destination position */ ry = u.uy + 2 * u.dy; nomul(0); if (Levitation || Is_airlevel(&u.uz)) { if (Blind) feel_location(sx,sy); You("don't have enough leverage to push %s.", the(xname(otmp))); /* Give them a chance to climb over it? */ return -1; } if (verysmall(youmonst.data) #ifdef STEED && !u.usteed #endif ) { if (Blind) feel_location(sx,sy); pline("You're too small to push that %s.", xname(otmp)); goto cannot_push; } if (isok(rx,ry) && !IS_ROCK(levl[rx][ry].typ) && levl[rx][ry].typ != IRONBARS && (!IS_DOOR(levl[rx][ry].typ) || !(u.dx && u.dy) || ( #ifdef REINCARNATION !Is_rogue_level(&u.uz) && #endif (levl[rx][ry].doormask & ~D_BROKEN) == D_NODOOR)) && !sobj_at(BOULDER, rx, ry)) { ttmp = t_at(rx, ry); mtmp = m_at(rx, ry); /* KMH -- Sokoban doesn't let you push boulders diagonally */ if (In_sokoban(&u.uz) && u.dx && u.dy) { if (Blind) feel_location(sx,sy); pline("%s won't roll diagonally on this %s.", The(xname(otmp)), surface(sx, sy)); goto cannot_push; } if (revive_nasty(rx, ry, "You sense movement on the other side.")) return (-1); if (mtmp && !noncorporeal(mtmp->data) && (!mtmp->mtrapped || !(ttmp && ((ttmp->ttyp == PIT) || (ttmp->ttyp == SPIKED_PIT))))) { if (Blind) feel_location(sx,sy); if (canspotmon(mtmp)) { boolean by_name = (mtmp->data->geno & G_UNIQ || mtmp->isshk || mtmp->mnamelth); if (by_name && !Hallucination) pline("%s is on the other side.", Monnam(mtmp)); else pline("There's %s on the other side.", a_monnam(mtmp)); } else { You_hear("a monster behind %s.", the(xname(otmp))); map_invisible(rx, ry); } if (flags.verbose) pline("Perhaps that's why %s cannot move it.", #ifdef STEED u.usteed ? y_monnam(u.usteed) : #endif "you"); goto cannot_push; } if (ttmp) switch(ttmp->ttyp) { case LANDMINE: if (rn2(10)) { obj_extract_self(otmp); place_object(otmp, rx, ry); unblock_point(sx, sy); newsym(sx, sy); pline("KAABLAMM!!! %s %s land mine.", Tobjnam(otmp, "trigger"), ttmp->madeby_u ? "your" : "a"); 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; } break; case SPIKED_PIT: case PIT: obj_extract_self(otmp); /* vision kludge to get messages right; the pit will temporarily be seen even if this is one among multiple boulders */ if (!Blind) viz_array[ry][rx] |= IN_SIGHT; if (!flooreffects(otmp, rx, ry, "fall")) { place_object(otmp, rx, ry); } if (mtmp && !Blind) newsym(rx, ry); 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); delobj(otmp); bury_objs(rx, ry); if (cansee(rx,ry)) newsym(rx,ry); continue; case LEVEL_TELEP: case TELEP_TRAP: #ifdef STEED if (u.usteed) pline("%s pushes %s and suddenly it disappears!", upstart(y_monnam(u.usteed)), the(xname(otmp))); else #endif You("push %s and suddenly it disappears!", the(xname(otmp))); if (ttmp->ttyp == TELEP_TRAP) rloco(otmp); else { int newlev = random_teleport_level(); d_level dest; if (newlev == depth(&u.uz) || In_endgame(&u.uz)) continue; obj_extract_self(otmp); add_to_migration(otmp); get_level(&dest, newlev); otmp->ox = dest.dnum; otmp->oy = dest.dlevel; otmp->owornmask = (long)MIGR_RANDOM; } seetrap(ttmp); continue; } if (closed_door(rx, ry)) goto nopushmsg; if (boulder_hits_pool(otmp, rx, ry, TRUE)) continue; /* * Re-link at top of fobj chain so that pile order is preserved * when level is restored. */ if (otmp != fobj) { remove_object(otmp); place_object(otmp, otmp->ox, otmp->oy); } { #ifdef LINT /* static long lastmovetime; */ long lastmovetime; lastmovetime = 0; #else /* note: reset to zero after save/restore cycle */ static NEARDATA long lastmovetime; #endif #ifdef STEED if (!u.usteed) { #endif if (moves > lastmovetime+2 || moves < lastmovetime) pline("With %s effort you move %s.", throws_rocks(youmonst.data) ? "little" : "great", the(xname(otmp))); exercise(A_STR, TRUE); #ifdef STEED } else pline("%s moves %s.", upstart(y_monnam(u.usteed)), the(xname(otmp))); #endif lastmovetime = moves; } /* Move the boulder *after* the message. */ if (memory_is_invisible(rx, ry)) unmap_object(rx, ry); movobj(otmp, rx, ry); /* does newsym(rx,ry) */ if (Blind) { feel_location(rx,ry); feel_location(sx,sy); } else { newsym(sx,sy); } } else { nopushmsg: #ifdef STEED if (u.usteed) pline("%s tries to move %s, but cannot.", upstart(y_monnam(u.usteed)), the(xname(otmp))); else #endif You("try to move %s, but in vain.", the(xname(otmp))); if (Blind) feel_location(sx,sy); cannot_push: if (throws_rocks(youmonst.data)) { #ifdef STEED if (u.usteed && P_SKILL(P_RIDING) < P_BASIC) { You("aren't skilled enough to %s %s from %s.", (flags.pickup && !In_sokoban(&u.uz)) ? "pick up" : "push aside", the(xname(otmp)), y_monnam(u.usteed)); } else #endif { pline("However, you can easily %s.", (flags.pickup && !In_sokoban(&u.uz)) ? "pick it up" : "push it aside"); if (In_sokoban(&u.uz)) change_luck(-1); /* Sokoban guilt */ break; } break; } if ( #ifdef STEED !u.usteed && #endif (((!invent || inv_weight() <= -850) && (!u.dx || !u.dy || (IS_ROCK(levl[u.ux][sy].typ) && IS_ROCK(levl[sx][u.uy].typ)))) || verysmall(youmonst.data))) { pline("However, you can squeeze yourself into a small opening."); if (In_sokoban(&u.uz)) change_luck(-1); /* Sokoban guilt */ break; } else return (-1); } } return (0); } /* * still_chewing() * * Chew on a wall, door, or boulder. Returns TRUE if still eating, FALSE * when done. */ STATIC_OVL int still_chewing(x,y) xchar x, y; { struct rm *lev = &levl[x][y]; struct obj *boulder = sobj_at(BOULDER,x,y); const char *digtxt = (char *)0, *dmgtxt = (char *)0; if (digging.down) /* not continuing previous dig (w/ pick-axe) */ (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; } /* Okay, you've chewed through something */ u.uconduct.food++; u.uhunger += rnd(20); if (boulder) { delobj(boulder); /* boulder goes bye-bye */ You("eat the boulder."); /* yum */ /* * The location could still block because of * 1. More than one boulder * 2. Boulder stuck in a wall/stone/door. * * [perhaps use does_block() below (from vision.c)] */ if (IS_ROCK(lev->typ) || closed_door(x,y) || sobj_at(BOULDER,x,y)) { block_point(x,y); /* delobj will unblock the point */ /* reset dig state */ (void) memset((genericptr_t)&digging, 0, sizeof digging); return 1; } } else if (IS_WALL(lev->typ)) { if (*in_rooms(x, y, SHOPBASE)) { add_damage(x, y, 10L * ACURRSTR); dmgtxt = "damage"; } digtxt = "chew a hole in the wall."; if (level.flags.is_maze_lev) { lev->typ = ROOM; } else if (level.flags.is_cavernous_lev && !in_town(x, y)) { lev->typ = CORR; } else { lev->typ = DOOR; lev->doormask = D_NODOOR; } } else if (IS_TREE(lev->typ)) { digtxt = "chew through the tree."; lev->typ = ROOM; } else if (lev->typ == SDOOR) { if (lev->doormask & D_TRAPPED) { lev->doormask = D_NODOOR; b_trapped("secret door", 0); } else { digtxt = "chew through the secret door."; lev->doormask = D_BROKEN; } lev->typ = DOOR; } else if (IS_DOOR(lev->typ)) { if (*in_rooms(x, y, SHOPBASE)) { add_damage(x, y, 400L); dmgtxt = "break"; } if (lev->doormask & D_TRAPPED) { lev->doormask = D_NODOOR; b_trapped("door", 0); } else { digtxt = "chew through the door."; lev->doormask = D_BROKEN; } } else { /* STONE or SCORR */ digtxt = "chew a passage through the rock."; lev->typ = CORR; } unblock_point(x, y); /* vision */ newsym(x, y); if (digtxt) You(digtxt); /* after newsym */ if (dmgtxt) pay_for_damage(dmgtxt, FALSE); (void) memset((genericptr_t)&digging, 0, sizeof digging); return 0; } #endif /* OVL2 */ #ifdef OVLB void movobj(obj, ox, oy) register struct obj *obj; register xchar ox, oy; { /* optimize by leaving on the fobj chain? */ remove_object(obj); newsym(obj->ox, obj->oy); place_object(obj, ox, oy); newsym(ox, oy); } #ifdef SINKS static NEARDATA const char fell_on_sink[] = "fell onto a sink"; STATIC_OVL void dosinkfall() { register struct obj *obj; if (is_floater(youmonst.data) || (HLevitation & FROMOUTSIDE)) { You("wobble unsteadily for a moment."); } else { long save_ELev = ELevitation, save_HLev = HLevitation; /* fake removal of levitation in advance so that final disclosure will be right in case this turns out to be fatal; fortunately the fact that rings and boots are really still worn has no effect on bones data */ ELevitation = HLevitation = 0L; 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 = save_ELev; HLevitation = save_HLev; } ELevitation &= ~W_ARTI; HLevitation &= ~(I_SPECIAL|TIMEOUT); HLevitation++; if(uleft && uleft->otyp == RIN_LEVITATION) { obj = uleft; Ring_off(obj); off_msg(obj); } if(uright && uright->otyp == RIN_LEVITATION) { obj = uright; Ring_off(obj); off_msg(obj); } if(uarmf && uarmf->otyp == LEVITATION_BOOTS) { obj = uarmf; (void)Boots_off(); off_msg(obj); } HLevitation--; } #endif boolean may_dig(x,y) register xchar x,y; /* intended to be called only on ROCKs */ { return (boolean)(!(IS_STWALL(levl[x][y].typ) && (levl[x][y].wall_info & W_NONDIGGABLE))); } boolean may_passwall(x,y) register xchar x,y; { return (boolean)(!(IS_STWALL(levl[x][y].typ) && (levl[x][y].wall_info & W_NONPASSWALL))); } #endif /* OVLB */ #ifdef OVL1 /* [ALI] Changed to take monst * as argument to support passwall property */ boolean bad_rock(mon,x,y) struct monst *mon; register xchar x,y; { struct permonst *mdat = mon->data; boolean passwall = mon == &youmonst ? Passes_walls : passes_walls(mdat); return((boolean) ((In_sokoban(&u.uz) && sobj_at(BOULDER,x,y)) || (IS_ROCK(levl[x][y].typ) && (!tunnels(mdat) || needspick(mdat) || !may_dig(x,y)) && !(passwall && may_passwall(x,y))))); } boolean invocation_pos(x, y) xchar x, y; { return((boolean)(Invocation_lev(&u.uz) && x == inv_pos.x && y == inv_pos.y)); } #endif /* OVL1 */ #ifdef OVL3 /* For my clever ending messages... */ int Instant_Death = 0; int Quick_Death = 0; int Nibble_Death = 0; int last_hit = 0; int second_last_hit = 0; int third_last_hit = 0; /* For those tough guys who get carried away... */ int repeat_hit = 0; /* return TRUE if (dx,dy) is an OK place to move * mode is one of DO_MOVE, TEST_MOVE or TEST_TRAV */ boolean test_move(ux, uy, dx, dy, mode) int ux, uy, dx, dy; int mode; { 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 && mode == DO_MOVE) feel_location(x,y); if (tmpr->typ == IRONBARS) { if (!(Passes_walls || passes_bars(youmonst.data))) return FALSE; else if (In_sokoban(&u.uz)) { if (mode == DO_MOVE) pline_The("Sokoban bars resist your ability."); return FALSE; } } else if (Passes_walls && may_passwall(x,y)) { ; /* do nothing */ } else if (tunnels(youmonst.data) && !needspick(youmonst.data)) { /* Eat the rock. */ if (mode == DO_MOVE && 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 (mode == DO_MOVE) (void) use_pick_axe2(uwep); return FALSE; } else { if (mode == DO_MOVE) { 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 && mode == DO_MOVE) feel_location(x,y); /* ALI - artifact doors */ if (artifact_door(x, y)) { if (mode == DO_MOVE) { if (amorphous(youmonst.data)) You("try to ooze under the door, but the gap is too small."); else if (tunnels(youmonst.data) && !needspick(youmonst.data)) You("hurt your teeth on the re-enforced door."); else if (x == u.ux || y == u.uy) { if (Blind || Stunned || ACURR(A_DEX) < 10 || Fumbling) { pline("Ouch! You bump into a heavy door."); exercise(A_DEX, FALSE); } else pline("That door is closed."); } } return FALSE; } else if (Passes_walls) ; /* do nothing */ else if (can_ooze(&youmonst)) { if (mode == DO_MOVE) You("ooze under the door."); } else if (tunnels(youmonst.data) && !needspick(youmonst.data)) { /* Eat the door. */ if (mode == DO_MOVE && still_chewing(x,y)) return FALSE; } else { if (mode == DO_MOVE) { 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.", y_monnam(u.usteed)); } else #endif { pline("Ouch! You bump into a door."); exercise(A_DEX, FALSE); } } else pline("That door is closed."); } } else if (mode == TEST_TRAV) goto testdiag; return FALSE; } } else { testdiag: 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 && mode == DO_MOVE) feel_location(x,y); return FALSE; } } } if (dx && dy && bad_rock(&youmonst,ux,y) && bad_rock(&youmonst,x,uy)) { /* Move at a diagonal. */ if (In_sokoban(&u.uz)) { if (mode == DO_MOVE) You("cannot pass that way."); return FALSE; } if (bigmonst(youmonst.data)) { if (mode == DO_MOVE) Your("body is too large to fit through."); return FALSE; } if (invent && (inv_weight() + weight_cap() > 600)) { if (mode == DO_MOVE) You("are carrying too much to get through."); return FALSE; } } /* Pick travel path that does not require crossing a trap. * Avoid water and lava using the usual running rules. * (but not u.ux/u.uy because findtravelpath walks toward u.ux/u.uy) */ if (flags.run == 8 && mode != DO_MOVE && (x != u.ux || y != u.uy)) { struct trap* t = t_at(x, y); if ((t && t->tseen) || (!Levitation && !Flying && !is_clinger(youmonst.data) && (is_pool(x, y) || is_lava(x, y)) && levl[x][y].seenv)) 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) && mode != TEST_TRAV) return FALSE; if (mode == DO_MOVE) { /* 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; } else if (mode == TEST_TRAV) { struct obj* obj; /* don't pick two boulders in a row, unless there's a way thru */ if (sobj_at(BOULDER,ux,uy) && !In_sokoban(&u.uz)) { if (!Passes_walls && !(tunnels(youmonst.data) && !needspick(youmonst.data)) && !carrying(PICK_AXE) && !carrying(DWARVISH_MATTOCK) && !((obj = carrying(WAN_DIGGING)) && !objects[obj->otyp].oc_name_known)) return FALSE; } } /* assume you'll be able to push it when you get there... */ } /* OK, it is a legal place to move. */ return TRUE; } /* * Find a path from the destination (u.tx,u.ty) back to (u.ux,u.uy). * A shortest path is returned. If guess is TRUE, consider various * inaccessible locations as valid intermediate path points. * Returns TRUE if a path was found. */ static boolean findtravelpath(guess) boolean guess; { /* if travel to adjacent, reachable location, use normal movement rules */ if (!guess && iflags.travel1 && distmin(u.ux, u.uy, u.tx, u.ty) == 1) { flags.run = 0; if (test_move(u.ux, u.uy, u.tx-u.ux, u.ty-u.uy, TEST_MOVE)) { u.dx = u.tx-u.ux; u.dy = u.ty-u.uy; nomul(0); iflags.travelcc.x = iflags.travelcc.y = -1; return TRUE; } flags.run = 8; } if (u.tx != u.ux || u.ty != u.uy) { xchar travel[COLNO][ROWNO]; xchar travelstepx[2][COLNO*ROWNO]; xchar travelstepy[2][COLNO*ROWNO]; xchar tx, ty, ux, uy; int n = 1; /* max offset in travelsteps */ int set = 0; /* two sets current and previous */ int radius = 1; /* search radius */ int i; /* If guessing, first find an "obvious" goal location. The obvious * goal is the position the player knows of, or might figure out * (couldsee) that is closest to the target on a straight path. */ if (guess) { tx = u.ux; ty = u.uy; ux = u.tx; uy = u.ty; } else { tx = u.tx; ty = u.ty; ux = u.ux; uy = u.uy; } noguess: (void) memset((genericptr_t)travel, 0, sizeof(travel)); travelstepx[0][0] = tx; travelstepy[0][0] = ty; while (n != 0) { int nn = 0; for (i = 0; i < n; i++) { int dir; int x = travelstepx[set][i]; int y = travelstepy[set][i]; static int ordered[] = { 0, 2, 4, 6, 1, 3, 5, 7 }; /* no diagonal movement for grid bugs */ int dirmax = u.umonnum == PM_GRID_BUG ? 4 : 8; for (dir = 0; dir < dirmax; ++dir) { int nx = x+xdir[ordered[dir]]; int ny = y+ydir[ordered[dir]]; if (!isok(nx, ny)) continue; if ((!Passes_walls && !can_ooze(&youmonst) && closed_door(x, y)) || sobj_at(BOULDER, x, y)) { /* closed doors and boulders usually * cause a delay, so prefer another path */ if (travel[x][y] > radius-3) { travelstepx[1-set][nn] = x; travelstepy[1-set][nn] = y; /* don't change travel matrix! */ nn++; continue; } } if (test_move(x, y, nx-x, ny-y, TEST_TRAV) && (levl[nx][ny].seenv || (!Blind && couldsee(nx, ny)))) { if (nx == ux && ny == uy) { if (!guess) { u.dx = x-ux; u.dy = y-uy; if (x == u.tx && y == u.ty) { nomul(0); /* reset run so domove run checks work */ flags.run = 8; iflags.travelcc.x = iflags.travelcc.y = -1; } return TRUE; } } else if (!travel[nx][ny]) { travelstepx[1-set][nn] = nx; travelstepy[1-set][nn] = ny; travel[nx][ny] = radius; nn++; } } } } n = nn; set = 1-set; radius++; } /* if guessing, find best location in travel matrix and go there */ if (guess) { int px = tx, py = ty; /* pick location */ int dist, nxtdist, d2, nd2; dist = distmin(ux, uy, tx, ty); d2 = dist2(ux, uy, tx, ty); for (tx = 1; tx < COLNO; ++tx) for (ty = 0; ty < ROWNO; ++ty) if (travel[tx][ty]) { nxtdist = distmin(ux, uy, tx, ty); if (nxtdist == dist && couldsee(tx, ty)) { nd2 = dist2(ux, uy, tx, ty); if (nd2 < d2) { /* prefer non-zigzag path */ px = tx; py = ty; d2 = nd2; } } else if (nxtdist < dist && couldsee(tx, ty)) { px = tx; py = ty; dist = nxtdist; d2 = dist2(ux, uy, tx, ty); } } if (px == u.ux && py == u.uy) { /* no guesses, just go in the general direction */ u.dx = sgn(u.tx - u.ux); u.dy = sgn(u.ty - u.uy); if (test_move(u.ux, u.uy, u.dx, u.dy, TEST_MOVE)) return TRUE; goto found; } tx = px; ty = py; ux = u.ux; uy = u.uy; set = 0; n = radius = 1; guess = FALSE; goto noguess; } return FALSE; } found: u.dx = 0; u.dy = 0; nomul(0); return FALSE; } void domove() { register struct monst *mtmp; register struct rm *tmpr; register xchar x,y; struct trap *trap; int wtcap; boolean on_ice; xchar chainx, chainy, ballx, bally; /* ball&chain new positions */ int bc_control; /* control for ball&chain */ boolean cause_delay = FALSE; /* dragging ball will skip a move */ const char *predicament; boolean displacer = FALSE; /* defender attempts to displace you */ u_wipe_engr(rnd(5)); if (flags.travel) { if (!findtravelpath(FALSE)) (void) findtravelpath(TRUE); iflags.travel1 = 0; } if(((wtcap = near_capacity()) >= OVERLOADED || (wtcap > SLT_ENCUMBER && (Upolyd ? (u.mh < 5 && u.mh != u.mhmax) : (u.uhp < 10 && u.uhp != u.uhpmax)))) && !Is_airlevel(&u.uz)) { if(wtcap < OVERLOADED) { You("don't have enough stamina to move."); exercise(A_CON, FALSE); } else You("collapse under your load."); nomul(0); return; } if(u.uswallow) { u.dx = u.dy = 0; u.ux = x = u.ustuck->mx; u.uy = y = u.ustuck->my; mtmp = u.ustuck; } else { if (Is_airlevel(&u.uz) && rn2(4) && !Levitation && !Flying) { switch(rn2(3)) { case 0: You("tumble in place."); exercise(A_DEX, FALSE); break; case 1: You_cant("control your movements very well."); break; case 2: pline("It's hard to walk in thin air."); exercise(A_DEX, TRUE); break; } return; } /* check slippery ice */ on_ice = !Levitation && is_ice(u.ux, u.uy); if (on_ice) { static int skates = 0; if (!skates) skates = find_skates(); if ((uarmf && uarmf->otyp == skates) || resists_cold(&youmonst) || Flying || is_floater(youmonst.data) || is_clinger(youmonst.data) || is_whirly(youmonst.data)) on_ice = FALSE; else if (!rn2(Cold_resistance ? 3 : 2)) { HFumbling |= FROMOUTSIDE; HFumbling &= ~TIMEOUT; HFumbling += 1; /* slip on next move */ } } if (!on_ice && (HFumbling & FROMOUTSIDE)) HFumbling &= ~FROMOUTSIDE; x = u.ux + u.dx; y = u.uy + u.dy; #ifdef STEED /* Check if your steed can move */ if (u.usteed && (!u.usteed->mcanmove || u.usteed->msleeping)) { Your("steed doesn't respond!"); nomul(0); return; } #endif if(Stunned || (Confusion && !rn2(5)) #ifdef STEED || (u.usteed && u.usteed->mconf) #endif ) { register int tries = 0; do { if(tries++ > 50) { nomul(0); return; } confdir(); x = u.ux + u.dx; y = u.uy + u.dy; } while(!isok(x, y) || bad_rock(&youmonst, x, y)); } /* turbulence might alter your actual destination */ if (u.uinwater) { water_friction(); if (!u.dx && !u.dy) { nomul(0); return; } x = u.ux + u.dx; y = u.uy + u.dy; } if(!isok(x, y)) { nomul(0); return; } if (((trap = t_at(x, y)) && trap->tseen) || (Blind && !Levitation && !Flying && !is_clinger(youmonst.data) && (is_pool(x, y) || is_lava(x, y)) && levl[x][y].seenv)) { if(flags.run >= 2) { nomul(0); flags.move = 0; return; } else nomul(0); } if (u.ustuck && (x != u.ustuck->mx || y != u.ustuck->my)) { if (distu(u.ustuck->mx, u.ustuck->my) > 2) { /* perhaps it fled (or was teleported or ... ) */ setustuck(0); } else if (sticks(youmonst.data)) { /* When polymorphed into a sticking monster, * u.ustuck means it's stuck to you, not you to it. */ You("release %s.", mon_nam(u.ustuck)); setustuck(0); } else { /* If holder is asleep or paralyzed: * 37.5% chance of getting away, * 12.5% chance of waking/releasing it; * 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)); setustuck(0); break; case 3: if (!u.ustuck->mcanmove) { /* it's free to move on next turn */ u.ustuck->mfrozen = 1; u.ustuck->msleeping = 0; } /*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; } } } mtmp = m_at(x,y); if (mtmp) { /* Don't attack if you're running, and can see it */ /* We should never get here if forcefight */ if (flags.run && ((!Blind && mon_visible(mtmp) && ((mtmp->m_ap_type != M_AP_FURNITURE && mtmp->m_ap_type != M_AP_OBJECT) || Protection_from_shape_changers)) || sensemon(mtmp))) { nomul(0); flags.move = 0; return; } } } u.ux0 = u.ux; u.uy0 = u.uy; bhitpos.x = x; bhitpos.y = y; tmpr = &levl[x][y]; /* attack monster */ if(mtmp) { nomul(0); /* only attack if we know it's there */ /* or if we used the 'F' command to fight blindly */ /* or if it hides_under, in which case we call attack() to print * the Wait! message. * This is different from ceiling hiders, who aren't handled in * attack(). */ /* If they used a 'm' command, trying to move onto a monster * prints the below message and wastes a turn. The exception is * if the monster is unseen and the player doesn't remember an * invisible monster--then, we fall through to attack() and * attack_check(), which still wastes a turn, but prints a * different message and makes the player remember the monster. */ if(flags.nopick && (canspotmon(mtmp) || memory_is_invisible(x, y))){ 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)); return; } if(flags.forcefight || !mtmp->mundetected || sensemon(mtmp) || ((hides_under(mtmp->data) || mtmp->data->mlet == S_EEL) && !is_safepet(mtmp))){ gethungry(); if(wtcap >= HVY_ENCUMBER && moves%3) { if (Upolyd && u.mh > 1) { u.mh--; } else if (!Upolyd && u.uhp > 1) { u.uhp--; } else { You("pass out from exertion!"); exercise(A_CON, FALSE); fall_asleep(-10, FALSE); } } if(multi < 0) return; /* we just fainted */ /* new displacer beast thingie -- by [Tom] */ /* sometimes, instead of attacking, you displace it. */ /* Good joke, huh? */ if (mtmp->data == &mons[PM_DISPLACER_BEAST] && !rn2(2)) displacer = TRUE; else /* try to attack; note that it might evade */ /* also, we don't attack tame when _safepet_ */ if(attack(mtmp)) return; } } /* specifying 'F' with no monster wastes a turn */ if (flags.forcefight || /* remembered an 'I' && didn't use a move command */ (memory_is_invisible(x, y) && !flags.nopick)) { boolean expl = (Upolyd && attacktype(youmonst.data, AT_EXPL)); char buf[BUFSZ]; Sprintf(buf,"a vacant spot on the %s", surface(x,y)); You("%s %s.", expl ? "explode at" : "attack", !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); if (expl) { u.mh = -1; /* dead in the current form */ rehumanize(); } return; } if (memory_is_invisible(x, y)) { unmap_object(x, y); newsym(x, y); } /* not attacking an animal, so we try to move */ if (!displacer) { #ifdef STEED if (u.usteed && !u.usteed->mcanmove && (u.dx || u.dy)) { pline("%s won't move!", upstart(y_monnam(u.usteed))); nomul(0); return; } else #endif if(!youmonst.data->mmove) { You("are rooted %s.", Levitation || Is_airlevel(&u.uz) || Is_waterlevel(&u.uz) ? "in place" : "to the ground"); nomul(0); return; } if(u.utrap) { if(u.utraptype == TT_PIT) { if (!rn2(2) && sobj_at(BOULDER, u.ux, u.uy)) { Your("%s gets stuck in a crevice.", body_part(LEG)); display_nhwindow(WIN_MESSAGE, FALSE); clear_nhwindow(WIN_MESSAGE); You("free your %s.", body_part(LEG)); } else if (Flying && !In_sokoban(&u.uz)) { /* eg fell in pit, poly'd to a flying monster */ You("fly from the pit."); u.utrap = 0; fill_pit(u.ux, u.uy); vision_full_recalc = 1; /* vision limits change */ } 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(y_monnam(u.usteed))); 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) { predicament = "stuck in the lava"; #ifdef STEED if (u.usteed) Norep("%s is %s.", upstart(y_monnam(u.usteed)), 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.", y_monnam(u.usteed)); else #endif You("pull yourself to the edge of the lava."); u.utrap = 0; } } u.umoved = TRUE; } else if (u.utraptype == TT_WEB) { if(uwep && uwep->oartifact == ART_STING) { u.utrap = 0; pline("Sting cuts through the web!"); return; } if(--u.utrap) { if(flags.verbose) { predicament = "stuck to the web"; #ifdef STEED if (u.usteed) Norep("%s is %s.", upstart(y_monnam(u.usteed)), predicament); else #endif Norep("You are %s.", predicament); } } else { #ifdef STEED if (u.usteed) pline("%s breaks out of the web.", upstart(y_monnam(u.usteed))); else #endif You("disentangle yourself."); } } else if (u.utraptype == TT_INFLOOR) { if(--u.utrap) { if(flags.verbose) { predicament = "stuck in the"; #ifdef STEED if (u.usteed) Norep("%s is %s %s.", upstart(y_monnam(u.usteed)), 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(y_monnam(u.usteed))); else #endif You("finally wiggle free."); } } else { if(flags.verbose) { predicament = "caught in a bear trap"; #ifdef STEED if (u.usteed) Norep("%s is %s.", upstart(y_monnam(u.usteed)), 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, DO_MOVE)) { flags.move = 0; nomul(0); return; } } else if (!test_move(u.ux, u.uy, x-u.ux, y-u.uy, TEST_MOVE)) { /* * If a monster attempted to displace us but failed * then we are entitled to our normal attack. */ if (!attack(mtmp)) { flags.move = 0; nomul(0); } return; } /* Move ball and chain. */ if (Punished) if (!drag_ball(x,y, &bc_control, &ballx, &bally, &chainx, &chainy, &cause_delay, TRUE)) return; /* Check regions entering/leaving */ if (!in_out_region(x,y)) { #if 0 /* [ALI] This can't happen at present, but if it did we would * also need to worry about the call to drag_ball above. */ if (displacer) (void)attack(mtmp); #endif return; } /* now move the hero */ mtmp = m_at(x, y); u.ux += u.dx; u.uy += u.dy; #ifdef STEED /* Move your steed, too */ if (u.usteed) { u.usteed->mx = u.ux; u.usteed->my = u.uy; exercise_steed(); } #endif if (displacer) { char pnambuf[BUFSZ]; u.utrap = 0; /* A lucky escape */ /* save its current description in case of polymorph */ Strcpy(pnambuf, mon_nam(mtmp)); 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("displaced %s.", pnambuf); break; case 1: case 3: break; case 2: u.uconduct.killer++; break; } } /* * if safepet at destination then move the pet to the hero's * previous location using the same conditions as in attack(). * there are special extenuating circumstances: * (1) if the pet dies then your god angers, * (2) if the pet gets trapped then your god may disapprove, * (3) if the pet was already trapped and you attempt to free it * not only do you encounter the trap but you may frighten your * pet causing it to go wild! moral: don't abuse this privilege. * * Ceiling-hiding pets are skipped by this section of code, to * be caught by the normal falling-monster code. */ if (is_safepet(mtmp) && !(is_hider(mtmp->data) && mtmp->mundetected)) { /* if trapped, there's a chance the pet goes wild */ 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); } } mtmp->mundetected = 0; if (mtmp->m_ap_type) seemimic(mtmp); else if (!mtmp->mtame) newsym(mtmp->mx, mtmp->my); if (mtmp->mtrapped && (trap = t_at(mtmp->mx, mtmp->my)) != 0 && (trap->ttyp == PIT || trap->ttyp == SPIKED_PIT) && sobj_at(BOULDER, trap->tx, trap->ty)) { /* 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 if (u.ux0 != x && u.uy0 != y && bad_rock(mtmp, x, u.uy0) && bad_rock(mtmp, u.ux0, y) && (bigmonst(mtmp->data) || (curr_mon_load(mtmp) > 600))) { /* can't swap places when pet won't fit thru the opening */ u.ux = u.ux0, u.uy = u.uy0; /* didn't move after all */ You("stop. %s won't fit through.", upstart(y_monnam(mtmp))); } 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 */ /* there's already been a trap message, reinforce it */ abuse_dog(mtmp); adjalign(-3); break; case 2: /* it may have drowned or died. that's no way to * treat a pet! your god gets angry. */ if (rn2(4)) { You_feel("guilty about losing your pet like this."); 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!"); break; } } } reset_occupations(); if (flags.run) { if ( flags.run < 8 ) if (IS_DOOR(tmpr->typ) || IS_ROCK(tmpr->typ) || IS_FURNITURE(tmpr->typ)) nomul(0); } if (hides_under(youmonst.data)) u.uundetected = OBJ_AT(u.ux, u.uy); else if (youmonst.data->mlet == S_EEL) u.uundetected = is_pool(u.ux, u.uy) && !Is_waterlevel(&u.uz); else if (u.dx || u.dy) u.uundetected = 0; /* * Mimics (or whatever) become noticeable if they move and are * imitating something that doesn't move. We could extend this * to non-moving monsters... */ if ((u.dx || u.dy) && (youmonst.m_ap_type == M_AP_OBJECT || youmonst.m_ap_type == M_AP_FURNITURE)) youmonst.m_ap_type = M_AP_NOTHING; check_leash(u.ux0,u.uy0); if(u.ux0 != u.ux || u.uy0 != u.uy) { u.umoved = TRUE; /* Clean old position -- vision_recalc() will print our new one. */ newsym(u.ux0,u.uy0); /* Since the hero has moved, adjust what can be seen/unseen. */ vision_recalc(1); /* Do the work now in the recover time. */ invocation_message(); } if (Punished) /* put back ball and chain */ move_bc(0,bc_control,ballx,bally,chainx,chainy); spoteffects(TRUE); /* delay next move because of ball dragging */ /* must come after we finished picking up, in spoteffects() */ if (cause_delay) { nomul(-2); nomovemsg = ""; } if (flags.run && iflags.runmode != RUN_TPORT) { /* display every step or every 7th step depending upon mode */ if (iflags.runmode != RUN_LEAP || !(moves % 7L)) { if (flags.time) flags.botl = 1; curs_on_u(); delay_output(); if (iflags.runmode == RUN_CRAWL) { delay_output(); delay_output(); delay_output(); delay_output(); } } } } void invocation_message() { /* a special clue-msg when on the Invocation position */ if(invocation_pos(u.ux, u.uy) && !On_stairs(u.ux, u.uy)) { char buf[BUFSZ]; struct obj *otmp = carrying(CANDELABRUM_OF_INVOCATION); nomul(0); /* stop running or travelling */ if (Hallucination) pline("You're picking up good vibrations!"); else { #ifdef STEED if (u.usteed) Sprintf(buf, "beneath %s", y_monnam(u.usteed)); else #endif if (Levitation || Flying) Strcpy(buf, "beneath you"); else Sprintf(buf, "under your %s", makeplural(body_part(FOOT))); You_feel("a strange vibration %s.", buf); } if (otmp && otmp->spe == 7 && otmp->lamplit) pline("%s %s!", The(xname(otmp)), Blind ? "throbs palpably" : "glows with a strange light"); } } #endif /* OVL3 */ #ifdef OVL2 void spoteffects(pick) boolean pick; { register struct monst *mtmp; if(u.uinwater) { int was_underwater; if (!is_pool(u.ux,u.uy)) { if (Is_waterlevel(&u.uz)) You("pop into an air bubble."); else if (is_lava(u.ux, u.uy)) You("leave the water..."); /* oops! */ else You("are on solid %s again.", is_ice(u.ux, u.uy) ? "ice" : "land"); } else if (Is_waterlevel(&u.uz)) goto stillinwater; else if (Levitation) You("pop out of the water like a cork!"); /* KMH, balance patch -- new intrinsic */ else if (Flying) You("fly out of the water."); else if (Wwalking) You("slowly rise above the surface."); /* else if (Swimming) You("paddle up to the surface.");*/ else goto stillinwater; was_underwater = Underwater && !Is_waterlevel(&u.uz); u.uinwater = 0; /* leave the water */ if (was_underwater) { /* restore vision */ docrt(); vision_full_recalc = 1; } } 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 if(IS_SINK(levl[u.ux][u.uy].typ) && Levitation) dosinkfall(); #endif if (!in_steed_dismounting) { /* if dismounting, we'll check again later */ struct trap *trap = t_at(u.ux, u.uy); boolean pit; pit = (trap && (trap->ttyp == PIT || trap->ttyp == SPIKED_PIT)); if (trap && pit) dotrap(trap, 0); /* fall into pit */ if (pick) (void) pickup(1); if (trap && !pit) dotrap(trap, 0); /* fall into arrow trap, etc. */ } if((mtmp = m_at(u.ux, u.uy)) && !u.uswallow) { mtmp->mundetected = mtmp->msleeping = 0; switch(mtmp->data->mlet) { case S_PIERCER: pline("%s suddenly drops from the %s!", Amonnam(mtmp), ceiling(u.ux,u.uy)); if(mtmp->mtame) /* jumps to greet you, not attack */ ; else if(uarmh && is_metallic(uarmh)) pline("Its blow glances off your helmet."); else if (u.uac + 3 <= rnd(20)) You("are almost hit by %s!", x_monnam(mtmp, ARTICLE_A, "falling", 0, TRUE)); else { int dmg; You("are hit by %s!", x_monnam(mtmp, ARTICLE_A, "falling", 0, TRUE)); dmg = d(4,6); if(Half_physical_damage) dmg = (dmg+1) / 2; mdamageu(mtmp, dmg); } break; default: /* monster surprises you. */ if(mtmp->mtame) pline("%s jumps near you from the %s.", Amonnam(mtmp), ceiling(u.ux,u.uy)); else if(mtmp->mpeaceful) { You("surprise %s!", Blind && !sensemon(mtmp) ? something : a_monnam(mtmp)); mtmp->mpeaceful = 0; } else pline("%s attacks you by surprise!", Amonnam(mtmp)); break; } mnexto(mtmp); /* have to move the monster */ } } STATIC_OVL boolean monstinroom(mdat,roomno) struct permonst *mdat; int roomno; { register struct monst *mtmp; for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) if(!DEADMONSTER(mtmp) && mtmp->data == mdat && index(in_rooms(mtmp->mx, mtmp->my, 0), roomno + ROOMOFFSET)) return(TRUE); return(FALSE); } char * in_rooms(x, y, typewanted) register xchar x, y; register int typewanted; { static char buf[5]; char rno, *ptr = &buf[4]; int typefound, min_x, min_y, max_x, max_y_offset, step; register struct rm *lev; #define goodtype(rno) (!typewanted || \ ((typefound = rooms[rno - ROOMOFFSET].rtype) == typewanted) || \ ((typewanted == SHOPBASE) && (typefound > SHOPBASE))) \ switch (rno = levl[x][y].roomno) { case NO_ROOM: return(ptr); case SHARED: step = 2; break; case SHARED_PLUS: step = 1; break; default: /* i.e. a regular room # */ if (goodtype(rno)) *(--ptr) = rno; return(ptr); } min_x = x - 1; max_x = x + 1; if (x < 1) min_x += step; else if (x >= COLNO) max_x -= step; min_y = y - 1; max_y_offset = 2; if (min_y < 0) { min_y += step; max_y_offset -= step; } else if ((min_y + max_y_offset) >= ROWNO) max_y_offset -= step; for (x = min_x; x <= max_x; x += step) { lev = &levl[x][min_y]; y = 0; if (((rno = lev[y].roomno) >= ROOMOFFSET) && !index(ptr, rno) && goodtype(rno)) *(--ptr) = rno; y += step; if (y > max_y_offset) continue; if (((rno = lev[y].roomno) >= ROOMOFFSET) && !index(ptr, rno) && goodtype(rno)) *(--ptr) = rno; y += step; if (y > max_y_offset) continue; if (((rno = lev[y].roomno) >= ROOMOFFSET) && !index(ptr, rno) && goodtype(rno)) *(--ptr) = rno; } return(ptr); } /* is (x,y) in a town? */ boolean in_town(x, y) register int x, y; { s_level *slev = Is_special(&u.uz); register struct mkroom *sroom; boolean has_subrooms = FALSE; if (!slev || !slev->flags.town) return FALSE; /* * See if (x,y) is in a room with subrooms, if so, assume it's the * town. If there are no subrooms, the whole level is in town. */ for (sroom = &rooms[0]; sroom->hx > 0; sroom++) { if (sroom->nsubrooms > 0) { has_subrooms = TRUE; if (inside_room(sroom, x, y)) return TRUE; } } return !has_subrooms; } STATIC_OVL void move_update(newlev) register boolean newlev; { char *ptr1, *ptr2, *ptr3, *ptr4; Strcpy(u.urooms0, u.urooms); Strcpy(u.ushops0, u.ushops); if (newlev) { u.urooms[0] = '\0'; u.uentered[0] = '\0'; u.ushops[0] = '\0'; u.ushops_entered[0] = '\0'; Strcpy(u.ushops_left, u.ushops0); return; } Strcpy(u.urooms, in_rooms(u.ux, u.uy, 0)); for (ptr1 = &u.urooms[0], ptr2 = &u.uentered[0], ptr3 = &u.ushops[0], ptr4 = &u.ushops_entered[0]; *ptr1; ptr1++) { if (!index(u.urooms0, *ptr1)) *(ptr2++) = *ptr1; if (IS_SHOP(*ptr1 - ROOMOFFSET)) { *(ptr3++) = *ptr1; if (!index(u.ushops0, *ptr1)) *(ptr4++) = *ptr1; } } *ptr2 = '\0'; *ptr3 = '\0'; *ptr4 = '\0'; /* filter u.ushops0 -> u.ushops_left */ for (ptr1 = &u.ushops0[0], ptr2 = &u.ushops_left[0]; *ptr1; ptr1++) if (!index(u.ushops, *ptr1)) *(ptr2++) = *ptr1; *ptr2 = '\0'; } void check_special_room(newlev) register boolean newlev; { register struct monst *mtmp; char *ptr; move_update(newlev); if (*u.ushops0) u_left_shop(u.ushops_left, newlev); if (!*u.uentered && !*u.ushops_entered) /* implied by newlev */ return; /* no entrance messages necessary */ /* Did we just enter a shop? */ if (*u.ushops_entered) u_entered_shop(u.ushops_entered); for (ptr = &u.uentered[0]; *ptr; ptr++) { register int roomno = *ptr - ROOMOFFSET, rt = rooms[roomno].rtype; /* Did we just enter some other special room? */ /* vault.c insists that a vault remain a VAULT, * and temples should remain TEMPLEs, * but everything else gives a message only the first time */ switch (rt) { case ZOO: pline("Welcome to David's treasure zoo!"); break; case SWAMP: pline("It %s rather %s down here.", Blind ? "feels" : "looks", Blind ? "humid" : "muddy"); break; case COURT: You("enter an opulent throne room!"); break; case REALZOO: You("enter a smelly zoo!"); break; case GIANTCOURT: You("enter a giant throne room!"); break; case DRAGONLAIR: You("enter a dragon lair..."); break; case BADFOODSHOP: You("enter an abandoned store..."); break; case LEPREHALL: You("enter a leprechaun hall!"); break; case MORGUE: if(midnight()) { const char *run = locomotion(youmonst.data, "Run"); pline("%s away! %s away!", run, run); } else You("have an uncanny feeling..."); break; case BEEHIVE: You("enter a giant beehive!"); break; case LEMUREPIT: You("enter a pit of screaming lemures!"); break; case MIGOHIVE: You("enter a strange hive!"); break; case FUNGUSFARM: You("enter a room full of fungi!"); break; case COCKNEST: You("enter a disgusting nest!"); break; case ANTHOLE: You("enter an anthole!"); break; case BARRACKS: if(monstinroom(&mons[PM_SOLDIER], roomno) || monstinroom(&mons[PM_SERGEANT], roomno) || monstinroom(&mons[PM_LIEUTENANT], roomno) || monstinroom(&mons[PM_CAPTAIN], roomno)) You("enter a military barracks!"); else You("enter an abandoned barracks."); break; case DELPHI: if(monstinroom(&mons[PM_ORACLE], roomno)) verbalize("%s, %s, welcome to Delphi!", Hello((struct monst *) 0), plname); break; case TEMPLE: intemple(roomno + ROOMOFFSET); /* fall through */ default: rt = 0; } if (rt != 0) { rooms[roomno].rtype = OROOM; if (!search_special(rt)) { /* No more room of that type */ switch(rt) { case COURT: case GIANTCOURT: level.flags.has_court = 0; break; case SWAMP: level.flags.has_swamp = 0; break; case MORGUE: level.flags.has_morgue = 0; break; case ZOO: case REALZOO: level.flags.has_zoo = 0; break; case BARRACKS: level.flags.has_barracks = 0; break; case TEMPLE: level.flags.has_temple = 0; break; case BEEHIVE: level.flags.has_beehive = 0; break; case LEMUREPIT: level.flags.has_lemurepit = 0; break; case MIGOHIVE: level.flags.has_migohive = 0; break; case FUNGUSFARM: level.flags.has_fungusfarm = 0; break; } } if(rt==COURT || rt==SWAMP || rt==MORGUE || rt==ZOO) for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) if (!DEADMONSTER(mtmp) && !Stealth && !rn2(3)) mtmp->msleeping = 0; } } return; } #endif /* OVL2 */ #ifdef OVLB int dopickup() { int count; struct trap *traphere = t_at(u.ux, u.uy); /* awful kludge to work around parse()'s pre-decrement */ count = (multi || (save_cm && *save_cm == ',')) ? multi + 1 : 0; 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."); } else 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) || (Flying && !Breathless)) { You("cannot dive into the water to pick things up."); return(0); } else if (!Underwater) { You_cant("even see the bottom, let alone pick up %s.", something); return(0); } } if (is_lava(u.ux, u.uy)) { if (Wwalking || is_floater(youmonst.data) || is_clinger(youmonst.data) || (Flying && !Breathless)) { You_cant("reach the bottom to pick things up."); return(0); } else if (!likes_lava(youmonst.data)) { You("would burn to a crisp trying to pick things up."); return(0); } } if(!OBJ_AT(u.ux, u.uy)) { There("is nothing here to pick up."); return(0); } if (!can_reach_floor()) { #ifdef STEED if (u.usteed && P_SKILL(P_RIDING) < P_BASIC) You("aren't skilled enough to reach from %s.", y_monnam(u.usteed)); else #endif You("cannot reach the %s.", surface(u.ux,u.uy)); return(0); } if (traphere && traphere->tseen) { /* Allow pickup from holes and trap doors that you escaped from * because that stuff is teetering on the edge just like you, but * not pits, because there is an elevation discrepancy with stuff * in pits. */ if ((traphere->ttyp == PIT || traphere->ttyp == SPIKED_PIT) && (!u.utrap || (u.utrap && u.utraptype != TT_PIT))) { You("cannot reach the bottom of the pit."); return(0); } } return (pickup(-count)); } #endif /* OVLB */ #ifdef OVL2 /* stop running if we see something interesting */ /* turn around a corner if that is the only way we can proceed */ /* do not turn left or right twice */ void lookaround() { register int x, y, i, x0 = 0, y0 = 0, m0 = 1, i0 = 9; register int corrct = 0, noturn = 0; 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; if(x == u.ux && y == u.uy) continue; if((mtmp = m_at(x,y)) && mtmp->m_ap_type != M_AP_FURNITURE && mtmp->m_ap_type != M_AP_OBJECT && (!mtmp->minvis || See_invisible) && !mtmp->mundetected) { if((flags.run != 1 && !mtmp->mtame) || (x == u.ux+u.dx && y == u.uy+u.dy)) goto stop; } if (levl[x][y].typ == STONE) continue; if (x == u.ux-u.dx && y == u.uy-u.dy) continue; if (IS_ROCK(levl[x][y].typ) || (levl[x][y].typ == ROOM) || IS_AIR(levl[x][y].typ)) continue; else if (closed_door(x,y) || (mtmp && mtmp->m_ap_type == M_AP_FURNITURE && (mtmp->mappearance == S_hcdoor || mtmp->mappearance == S_vcdoor))) { if(x != u.ux && y != u.uy) continue; if(flags.run != 1) goto stop; goto bcorr; } 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) noturn = 1; if(i < i0) { i0 = i; x0 = x; y0 = y; m0 = mtmp ? 1 : 0; } } corrct++; } continue; } else if ((trap = t_at(x,y)) && trap->tseen) { if(flags.run == 1) goto bcorr; /* if you must */ if(x == u.ux+u.dx && y == u.uy+u.dy) goto stop; continue; } else if (is_pool(x,y) || is_lava(x,y)) { /* water and lava only stop you if directly in front, and stop * you even if you are running */ /* KMH, balance patch -- new intrinsic */ if(!Levitation && !Flying && !is_clinger(youmonst.data) && x == u.ux+u.dx && y == u.uy+u.dy) /* No Wwalking check; otherwise they'd be able * to test boots by trying to SHIFT-direction * into a pool and seeing if the game allowed it */ goto stop; 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))) continue; } stop: nomul(0); return; } /* 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) i = 2; /* straight turn right */ else i = -2; /* straight turn left */ } else if(u.dx && u.dy) { if((u.dx == u.dy && y0 == u.uy) || (u.dx != u.dy && y0 != u.uy)) i = -1; /* half turn left */ else i = 1; /* half turn right */ } else { if((x0-u.ux == y0-u.uy && !u.dy) || (x0-u.ux != y0-u.uy && u.dy)) i = 1; /* half turn right */ else i = -1; /* half turn left */ } i += u.last_str_turn; if(i <= 2 && i >= -2) { u.last_str_turn = i; u.dx = x0-u.ux; u.dy = y0-u.uy; } } } /* something like lookaround, but we are not running */ /* react only to monsters that might hit us */ int monster_nearby() { register int x,y; register struct monst *mtmp; /* Also see the similar check in dochugw() in monmove.c */ 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(x == u.ux && y == u.uy) continue; if((mtmp = m_at(x,y)) && mtmp->m_ap_type != M_AP_FURNITURE && mtmp->m_ap_type != M_AP_OBJECT && (!mtmp->mpeaceful || Hallucination) && (!is_hider(mtmp->data) || !mtmp->mundetected) && !noattacks(mtmp->data) && mtmp->mcanmove && !mtmp->msleeping && /* aplvax!jcn */ !onscary(u.ux, u.uy, mtmp) && canspotmon(mtmp)) return(1); } return(0); } STATIC_OVL void maybe_wail() { static short powers[] = { TELEPORT, SEE_INVIS, POISON_RES, COLD_RES, SHOCK_RES, FIRE_RES, SLEEP_RES, DISINT_RES, TELEPORT_CONTROL, STEALTH, FAST, INVIS }; if (moves <= wailmsg + 50) return; wailmsg = moves; if (Role_if(PM_WIZARD) || Race_if(PM_ELF) || Role_if(PM_VALKYRIE)) { const char *who; int i, powercnt; who = (Role_if(PM_WIZARD) || Role_if(PM_VALKYRIE)) ? urole.name.m : "Elf"; if (u.uhp == 1) { pline("%s is about to die.", who); } else { for (i = 0, powercnt = 0; i < SIZE(powers); ++i) if (u.uprops[powers[i]].intrinsic & INTRINSIC) ++powercnt; pline(powercnt >= 4 ? "%s, all your powers will be lost..." : "%s, your life force is running out.", who); } } else { You_hear(u.uhp == 1 ? "the wailing of the Banshee..." : "the howling of the CwnAnnwn..."); } } void nomul(nval) register int nval; { if(multi < nval) return; /* This is a bug fix by ab@unido */ u.uinvulnerable = FALSE; /* Kludge to avoid ctrl-C bug -dlc */ u.usleep = 0; multi = nval; flags.travel = iflags.travel1 = flags.mv = flags.run = 0; } /* called when a non-movement, multi-turn action has completed */ void unmul(msg_override) const char *msg_override; { multi = 0; /* caller will usually have done this already */ if (msg_override) nomovemsg = msg_override; else if (!nomovemsg) nomovemsg = You_can_move_again; if (*nomovemsg) pline(nomovemsg); nomovemsg = 0; u.usleep = 0; if (afternmv) (*afternmv)(); afternmv = 0; } #endif /* OVL2 */ #ifdef OVL1 #ifdef SHOW_DMG /* Print the amount of damage inflicted */ /* KMH -- Centralized to one function */ void showdmg(n) register int n; { int lev; if (flags.showdmg && n > 1) { switch (Role_switch) { case PM_BARBARIAN: case PM_MONK: lev = 10; break; case PM_CAVEMAN: case PM_VALKYRIE: lev = 12; break; case PM_SAMURAI: case PM_KNIGHT: lev = 14; break; default: lev = 17; break; } switch (Race_switch) { case PM_GNOME: if (lev > 14) lev = 14; break; } #ifdef WIZARD if (wizard) lev = 1; #endif if(u.ulevel >= lev) pline("(%d pts.)", n); } return; } #endif void losehp(n, knam, k_format) register int n; register const char *knam; int k_format; /* WAC k_format is an int */ { /* [max] Invulnerable no dmg */ if (Invulnerable) { n = 0; pline("You are unharmed!"); /* NOTE: DO NOT RETURN - losehp is also called to check for death * via u.uhp < 1 */ } #ifdef SHOW_DMG else if (flags.showdmg && n > 0) pline("[%d pts.]", n); /* WAC see damage */ #endif if (Upolyd) { u.mh -= n; if (u.mhmax < u.mh) u.mhmax = u.mh; if (u.mh < 1) rehumanize(); else if (n > 0 && u.mh*10 < u.mhmax && Unchanging) maybe_wail(); return; } else { u.uhp -= n; if(u.uhp > u.uhpmax) u.uhpmax = u.uhp; /* perhaps n was negative */ } flags.botl = 1; /* Update status bar */ if(u.uhp < 1) { killer_format = k_format; killer = knam; /* the thing that killed you */ You("die..."); done(DIED); } else if (n > 0 && u.uhp*10 < u.uhpmax) { maybe_wail(); } } int weight_cap() { register long carrcap; carrcap = 25*(ACURRSTR + ACURR(A_CON)) + 50; if (Upolyd) { /* consistent with can_carry() in mon.c */ if (youmonst.data->mlet == S_NYMPH) carrcap = MAX_CARR_CAP; else if (!youmonst.data->cwt) carrcap = (carrcap * (long)youmonst.data->msize) / MZ_HUMAN; else if (!strongmonst(youmonst.data) || (strongmonst(youmonst.data) && (youmonst.data->cwt > WT_HUMAN))) carrcap = (carrcap * (long)youmonst.data->cwt / WT_HUMAN); } if (Levitation || Is_airlevel(&u.uz) /* pugh@cornell */ #ifdef STEED || (u.usteed && strongmonst(u.usteed->data)) #endif ) carrcap = MAX_CARR_CAP; else { if(carrcap > MAX_CARR_CAP) carrcap = MAX_CARR_CAP; if (!Flying) { if(EWounded_legs & LEFT_SIDE) carrcap -= 100; if(EWounded_legs & RIGHT_SIDE) carrcap -= 100; } if (carrcap < 0) carrcap = 0; } return((int) carrcap); } static int wc; /* current weight_cap(); valid after call to inv_weight() */ /* returns how far beyond the normal capacity the player is currently. */ /* inv_weight() is negative if the player is below normal capacity. */ int 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 == COIN_CLASS) ? 0 : (int)((u.ugold + 50L) / 100L); #endif while (otmp) { #ifndef GOLDOBJ if (otmp->otyp != BOULDER || !throws_rocks(youmonst.data)) #else if (otmp->oclass == COIN_CLASS) wt += (int)(((long)otmp->quan + 50L) / 100L); else if (otmp->otyp != BOULDER || !throws_rocks(youmonst.data)) #endif wt += otmp->owt; otmp = otmp->nobj; } wc = weight_cap(); return (wt - wc); } /* * Returns 0 if below normal capacity, or the number of "capacity units" * over the normal capacity the player is loaded. Max is 5. */ int calc_capacity(xtra_wt) int xtra_wt; { int cap, wt = inv_weight() + xtra_wt; if (wt <= 0) return UNENCUMBERED; if (wc <= 1) return OVERLOADED; cap = (wt*2 / wc) + 1; return min(cap, OVERLOADED); } int near_capacity() { return calc_capacity(0); } int max_capacity() { int wt = inv_weight(); return (wt - (2 * wc)); } boolean check_capacity(str) const char *str; { if(near_capacity() >= EXT_ENCUMBER) { if(str) pline(str); else You_cant("do that while carrying so much stuff."); return 1; } return 0; } #endif /* OVL1 */ #ifdef OVLB int inv_cnt() { register struct obj *otmp = invent; register int ct = 0; while(otmp){ ct++; otmp = otmp->nobj; } 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 == COIN_CLASS) return otmp->quan; otmp = otmp->nobj; } return 0; } #endif #endif /* OVLB */ /*hack.c*/ slashem-0.0.7E7F3/src/mkroom.c0000664000076400007640000005300410545462317014115 0ustar aliali/* 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. */ /* * Entry points: * mkroom() -- make and stock a room of a given type * nexttodoor() -- return TRUE if adjacent to a door * has_dnstairs() -- return TRUE if given room has a down staircase * has_upstairs() -- return TRUE if given room has an up staircase * courtmon() -- generate a court monster * save_rooms() -- save rooms into file fd * rest_rooms() -- restore rooms from file fd */ #include "hack.h" #ifdef OVLB STATIC_DCL boolean FDECL(isbig, (struct mkroom *)); STATIC_DCL struct mkroom * FDECL(pick_room,(BOOLEAN_P)); STATIC_DCL void NDECL(mkshop), FDECL(mkzoo,(int)), NDECL(mkswamp); STATIC_DCL void NDECL(mktemple); STATIC_DCL coord * FDECL(shrine_pos, (int)); STATIC_DCL struct permonst * NDECL(morguemon); STATIC_DCL struct permonst * NDECL(squadmon); STATIC_DCL struct permonst * NDECL(fungus); STATIC_DCL void FDECL(save_room, (int,struct mkroom *)); STATIC_DCL void FDECL(rest_room, (int,struct mkroom *)); #endif /* OVLB */ #define sq(x) ((x)*(x)) extern const struct shclass shtypes[]; /* defined in shknam.c */ #ifdef OVLB STATIC_OVL boolean isbig(sroom) register struct mkroom *sroom; { register int area = (sroom->hx - sroom->lx + 1) * (sroom->hy - sroom->ly + 1); return((boolean)( area > 20 )); } void mkroom(roomtype) /* make and stock a room of a given type */ int roomtype; { if (roomtype >= SHOPBASE) mkshop(); /* someday, we should be able to specify shop type */ else switch(roomtype) { case COURT: mkzoo(COURT); break; case ZOO: mkzoo(ZOO); break; case BEEHIVE: mkzoo(BEEHIVE); break; case MORGUE: mkzoo(MORGUE); break; case BARRACKS: mkzoo(BARRACKS); break; case REALZOO: mkzoo(REALZOO); break; case BADFOODSHOP: mkzoo(BADFOODSHOP); break; case DRAGONLAIR: mkzoo(DRAGONLAIR); break; case GIANTCOURT: mkzoo(GIANTCOURT); break; case SWAMP: mkswamp(); break; case TEMPLE: mktemple(); break; case LEPREHALL: mkzoo(LEPREHALL); break; case COCKNEST: mkzoo(COCKNEST); break; case ANTHOLE: mkzoo(ANTHOLE); break; case LEMUREPIT: mkzoo(LEMUREPIT); break; case MIGOHIVE: mkzoo(MIGOHIVE); break; case FUNGUSFARM: mkzoo(FUNGUSFARM); break; default: impossible("Tried to make a room of type %d.", roomtype); } } STATIC_OVL void mkshop() { register struct mkroom *sroom; int i = -1, j; #ifdef WIZARD char *ep = (char *)0; /* (init == lint suppression) */ /* first determine shoptype */ if(wizard){ #ifndef MAC ep = nh_getenv("SHOPTYPE"); if(ep){ if(*ep == 'z' || *ep == 'Z'){ mkzoo(ZOO); return; } if(*ep == 'm' || *ep == 'M'){ mkzoo(MORGUE); return; } if(*ep == 'b' || *ep == 'B'){ mkzoo(BEEHIVE); return; } if (*ep == 'p' || *ep == 'P') { mkzoo(LEMUREPIT); return; } if (*ep == 'i' || *ep == 'I') { mkzoo(MIGOHIVE); return; } if (*ep == 'f' || *ep == 'F') { mkzoo(FUNGUSFARM); return; } if(*ep == 't' || *ep == 'T' || *ep == '\\'){ mkzoo(COURT); return; } if(*ep == 's' || *ep == 'S'){ mkzoo(BARRACKS); return; } if(*ep == 'a' || *ep == 'A'){ mkzoo(ANTHOLE); return; } if(*ep == 'c' || *ep == 'C'){ mkzoo(COCKNEST); return; } if(*ep == 'l' || *ep == 'L'){ mkzoo(LEPREHALL); return; } if(*ep == '_'){ mktemple(); return; } if(*ep == '}'){ mkswamp(); return; } j = -1; for(i=0; shtypes[i].name; i++) if(*ep == def_oc_syms[(int)shtypes[i].symb]) { if (j < 0) j = i; if (!strcmp(ep + 1, shtypes[i].name)) break; } if(*ep == 'g' || *ep == 'G') i = 0; else i = j; } #endif } #endif for(sroom = &rooms[0]; ; sroom++){ if(sroom->hx < 0) return; if(sroom - rooms >= nroom) { pline("rooms not closed by -1?"); return; } if(sroom->rtype != OROOM) continue; if(has_dnstairs(sroom) || has_upstairs(sroom)) continue; if( #ifdef WIZARD (wizard && ep && sroom->doorct != 0) || #endif sroom->doorct == 1) break; } if (!sroom->rlit) { int x, y; for(x = sroom->lx - 1; x <= sroom->hx + 1; x++) for(y = sroom->ly - 1; y <= sroom->hy + 1; y++) levl[x][y].lit = 1; sroom->rlit = 1; } if(i < 0) { /* shoptype not yet determined */ /* pick a shop type at random */ for (j = rnd(100), i = 0; (j -= shtypes[i].prob) > 0; i++) continue; /* big rooms cannot be wand or book shops, * - so make them general stores */ if(isbig(sroom) && (shtypes[i].symb == WAND_CLASS || shtypes[i].symb == SPBOOK_CLASS)) i = 0; } sroom->rtype = SHOPBASE + i; /* set room bits before stocking the shop */ #ifdef SPECIALIZATION topologize(sroom, FALSE); /* doesn't matter - this is a special room */ #else topologize(sroom); #endif /* stock the room with a shopkeeper and artifacts */ stock_room(i, sroom); } STATIC_OVL struct mkroom * pick_room(strict) register boolean strict; /* pick an unused room, preferably with only one door */ { register struct mkroom *sroom; register int i = nroom; for(sroom = &rooms[rn2(nroom)]; i--; sroom++) { if(sroom == &rooms[nroom]) sroom = &rooms[0]; if(sroom->hx < 0) return (struct mkroom *)0; if(sroom->rtype != OROOM) continue; if(!strict) { if(has_upstairs(sroom) || (has_dnstairs(sroom) && rn2(3))) continue; } else if(has_upstairs(sroom) || has_dnstairs(sroom)) continue; if(sroom->doorct == 1 || (!rn2(5) && !strict) #ifdef WIZARD || (wizard && !strict) #endif ) return sroom; } return (struct mkroom *)0; } STATIC_OVL void mkzoo(type) int type; { register struct mkroom *sroom; if (type == BADFOODSHOP) { if ((sroom = pick_room(TRUE)) != 0) { sroom->rtype = type; fill_zoo(sroom); } } else if ((sroom = pick_room(FALSE)) != 0) { sroom->rtype = type; fill_zoo(sroom); } } void fill_zoo(sroom) struct mkroom *sroom; { struct monst *mon; register int sx,sy,i; int sh, tx, ty, goldlim, type = sroom->rtype; int rmno = (sroom - rooms) + ROOMOFFSET; coord mm; #ifdef GCC_WARN tx = ty = goldlim = 0; #endif sh = sroom->fdoor; switch(type) { case COURT: case GIANTCOURT: if(level.flags.is_maze_lev) { for(tx = sroom->lx; tx <= sroom->hx; tx++) for(ty = sroom->ly; ty <= sroom->hy; ty++) if(IS_THRONE(levl[tx][ty].typ)) goto throne_placed; } i = 100; do { /* don't place throne on top of stairs */ (void) somexy(sroom, &mm); tx = mm.x; ty = mm.y; } while (occupied((xchar)tx, (xchar)ty) && --i > 0); throne_placed: /* TODO: try to ensure the enthroned monster is an M2_PRINCE */ break; case BEEHIVE: case MIGOHIVE: tx = sroom->lx + (sroom->hx - sroom->lx + 1)/2; ty = sroom->ly + (sroom->hy - sroom->ly + 1)/2; if(sroom->irregular) { /* center might not be valid, so put queen elsewhere */ if ((int) levl[tx][ty].roomno != rmno || levl[tx][ty].edge) { (void) somexy(sroom, &mm); tx = mm.x; ty = mm.y; } } break; case ZOO: case LEPREHALL: goldlim = 500 * level_difficulty(); break; case DRAGONLAIR: goldlim = 1500 * level_difficulty(); break; } for(sx = sroom->lx; sx <= sroom->hx; sx++) for(sy = sroom->ly; sy <= sroom->hy; sy++) { if(sroom->irregular) { if ((int) levl[sx][sy].roomno != rmno || levl[sx][sy].edge || (sroom->doorct && distmin(sx, sy, doors[sh].x, doors[sh].y) <= 1)) continue; } else if(!SPACE_POS(levl[sx][sy].typ) || (sroom->doorct && ((sx == sroom->lx && doors[sh].x == sx-1) || (sx == sroom->hx && doors[sh].x == sx+1) || (sy == sroom->ly && doors[sh].y == sy-1) || (sy == sroom->hy && doors[sh].y == sy+1)))) continue; /* don't place monster on explicitly placed throne */ if(type == COURT && IS_THRONE(levl[sx][sy].typ)) continue; mon = makemon( (type == COURT) ? courtmon() : (type == BARRACKS) ? squadmon() : (type == MORGUE) ? morguemon() : (type == FUNGUSFARM) ? fungus() : (type == BEEHIVE) ? (sx == tx && sy == ty ? &mons[PM_QUEEN_BEE] : &mons[PM_KILLER_BEE]) : (type == LEPREHALL) ? &mons[PM_LEPRECHAUN] : (type == COCKNEST) ? (rn2(4) ? &mons[PM_COCKATRICE] : &mons[PM_CHICKATRICE]) : (type == ANTHOLE) ? antholemon() : (type == DRAGONLAIR) ? mkclass(S_DRAGON,0) : (type == LEMUREPIT)? (!rn2(10)? &mons[PM_HORNED_DEVIL] : &mons[PM_LEMURE]) : (type == MIGOHIVE)? (sx == tx && sy == ty? &mons[PM_MIGO_QUEEN] : (rn2(2)? &mons[PM_MIGO_DRONE] : &mons[PM_MIGO_WARRIOR])) : (type == BADFOODSHOP) ? mkclass(S_BAD_FOOD,0) : (type == REALZOO) ? realzoomon() : (type == GIANTCOURT) ? mkclass(S_GIANT,0) : (struct permonst *) 0, sx, sy, NO_MM_FLAGS); if(mon) { mon->msleeping = 1; if (type==COURT && mon->mpeaceful) { mon->mpeaceful = 0; set_malign(mon); } } switch(type) { case ZOO: case DRAGONLAIR: case LEPREHALL: if(sroom->doorct) { int distval = dist2(sx,sy,doors[sh].x,doors[sh].y); i = sq(distval); } else i = goldlim; if(i >= goldlim) i = 5*level_difficulty(); goldlim -= i; (void) mkgold((long) rn1(i, 10), sx, sy); break; case MORGUE: if(!rn2(5)) (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 FUNGUSFARM: if (!rn2(3)) (void) mksobj_at(SLIME_MOLD, sx, sy, TRUE, FALSE); break; case MIGOHIVE: switch (rn2(10)) { case 9: mksobj_at(DIAMOND, sx, sy, TRUE, FALSE); break; case 8: mksobj_at(RUBY, sx, sy, TRUE, FALSE); break; case 7: case 6: mksobj_at(AGATE, sx, sy, TRUE, FALSE); break; case 5: case 4: mksobj_at(FLUORITE, sx, sy, TRUE, FALSE); break; default: break; } break; case BARRACKS: if(!rn2(20)) /* the payroll and some loot */ (void) mksobj_at((rn2(3)) ? LARGE_BOX : CHEST, sx, sy, TRUE, FALSE); if (!rn2(5)) make_grave(sx, sy, (char *)0); 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; } } switch (type) { case COURT: case GIANTCOURT: { struct obj *chest; 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; } case BARRACKS: level.flags.has_barracks = 1; break; case REALZOO: case ZOO: level.flags.has_zoo = 1; break; case MORGUE: level.flags.has_morgue = 1; break; case SWAMP: level.flags.has_swamp = 1; break; case BEEHIVE: level.flags.has_beehive = 1; break; case LEMUREPIT: level.flags.has_lemurepit = 1; break; case MIGOHIVE: level.flags.has_migohive = 1; break; case FUNGUSFARM: level.flags.has_fungusfarm = 1; break; } } /* make a swarm of undead around mm */ void mkundead(mm, revive_corpses, mm_flags) coord *mm; boolean revive_corpses; int mm_flags; { int cnt = (level_difficulty() + 1)/10 + rnd(5); struct permonst *mdat; struct obj *otmp; coord cc; while (cnt--) { mdat = morguemon(); if (enexto(&cc, mm->x, mm->y, mdat) && (!revive_corpses || !(otmp = sobj_at(CORPSE, cc.x, cc.y)) || !revive(otmp))) (void) makemon(mdat, cc.x, cc.y, mm_flags); } level.flags.graveyard = TRUE; /* reduced chance for undead corpse */ } STATIC_OVL struct permonst * morguemon() { register int i = rn2(100), hd = rn2(level_difficulty()); if(hd > 10 && i < 10) return((Inhell || In_endgame(&u.uz)) ? mkclass(S_DEMON,0) : &mons[ndemon(A_NONE)]); if(hd > 8 && i > 85) return(mkclass(S_VAMPIRE,0)); return((i < 20) ? &mons[PM_GHOST] : (i < 40) ? &mons[PM_WRAITH] : mkclass(S_ZOMBIE,0)); } struct permonst * antholemon() { int mtyp; /* Same monsters within a level, different ones between levels */ switch ((level_difficulty() + ((long)u.ubirthday)) % 4) { default: mtyp = PM_GIANT_ANT; break; case 0: mtyp = PM_SOLDIER_ANT; break; case 1: mtyp = PM_FIRE_ANT; break; case 2: mtyp = PM_SNOW_ANT; break; } return ((mvitals[mtyp].mvflags & G_GONE) ? (struct permonst *)0 : &mons[mtyp]); } STATIC_OVL struct permonst * fungus() { register int i, hd = level_difficulty(), mtyp = 0; i = rn2(hd > 20 ? 17 : hd > 12 ? 14 : 12); switch (i) { case 0: case 1: mtyp = PM_LICHEN; break; case 2: mtyp = PM_BROWN_MOLD; break; case 3: mtyp = PM_YELLOW_MOLD; break; case 4: mtyp = PM_GREEN_MOLD; break; case 5: mtyp = PM_RED_MOLD; break; case 6: mtyp = PM_SHRIEKER; break; case 7: mtyp = PM_VIOLET_FUNGUS; break; case 8: mtyp = PM_BLUE_JELLY; break; case 9: mtyp = PM_DISGUSTING_MOLD; break; case 10: mtyp = PM_BLACK_MOLD; break; case 11: mtyp = PM_GRAY_OOZE; break; /* Following only after level 12... */ case 12: mtyp = PM_SPOTTED_JELLY; break; case 13: mtyp = PM_BROWN_PUDDING; break; /* Following only after level 20... */ case 14: mtyp = PM_GREEN_SLIME; break; case 15: mtyp = PM_BLACK_PUDDING; break; case 16: mtyp = PM_OCHRE_JELLY; break; } return ((mvitals[mtyp].mvflags & G_GONE) ? (struct permonst *)0 : &mons[mtyp]); } STATIC_OVL void mkswamp() /* Michiel Huisjes & Fred de Wilde */ { register struct mkroom *sroom; register int sx,sy,i,eelct = 0; for(i=0; i<5; i++) { /* turn up to 5 rooms swampy */ sroom = &rooms[rn2(nroom)]; if(sroom->hx < 0 || sroom->rtype != OROOM || has_upstairs(sroom) || has_dnstairs(sroom)) continue; /* satisfied; make a swamp */ sroom->rtype = SWAMP; for(sx = sroom->lx; sx <= sroom->hx; sx++) for(sy = sroom->ly; sy <= sroom->hy; sy++) if(!OBJ_AT(sx, sy) && !MON_AT(sx, sy) && !t_at(sx,sy) && !nexttodoor(sx,sy)) { if((sx+sy)%2) { levl[sx][sy].typ = POOL; if(!eelct || !rn2(4)) { /* mkclass() won't do, as we might get kraken */ (void) makemon(rn2(5) ? &mons[PM_GIANT_EEL] : rn2(2) ? &mons[PM_PIRANHA] : &mons[PM_ELECTRIC_EEL], sx, sy, NO_MM_FLAGS); eelct++; } } else if(!rn2(4)) /* swamps tend to be moldy */ (void) makemon(mkclass(S_FUNGUS,0), sx, sy, NO_MM_FLAGS); } level.flags.has_swamp = 1; } } STATIC_OVL coord * shrine_pos(roomno) int roomno; { static coord buf; struct mkroom *troom = &rooms[roomno - ROOMOFFSET]; buf.x = troom->lx + ((troom->hx - troom->lx) / 2); buf.y = troom->ly + ((troom->hy - troom->ly) / 2); return(&buf); } STATIC_OVL void mktemple() { register struct mkroom *sroom; coord *shrine_spot; register struct rm *lev; if(!(sroom = pick_room(TRUE))) return; /* set up Priest and shrine */ sroom->rtype = TEMPLE; /* * In temples, shrines are blessed altars * located in the center of the room */ shrine_spot = shrine_pos((sroom - rooms) + ROOMOFFSET); lev = &levl[shrine_spot->x][shrine_spot->y]; lev->typ = ALTAR; lev->altarmask = induced_align(80); priestini(&u.uz, sroom, shrine_spot->x, shrine_spot->y, FALSE); lev->altarmask |= AM_SHRINE; level.flags.has_temple = 1; } boolean nexttodoor(sx,sy) register int sx, sy; { register int dx, dy; register struct rm *lev; for(dx = -1; dx <= 1; dx++) for(dy = -1; dy <= 1; dy++) { if(!isok(sx+dx, sy+dy)) continue; if(IS_DOOR((lev = &levl[sx+dx][sy+dy])->typ) || lev->typ == SDOOR) return(TRUE); } return(FALSE); } boolean has_dnstairs(sroom) register struct mkroom *sroom; { if (sroom == dnstairs_room) return TRUE; if (sstairs.sx && !sstairs.up) return((boolean)(sroom == sstairs_room)); return FALSE; } boolean has_upstairs(sroom) register struct mkroom *sroom; { if (sroom == upstairs_room) return TRUE; if (sstairs.sx && sstairs.up) return((boolean)(sroom == sstairs_room)); return FALSE; } #endif /* OVLB */ #ifdef OVL0 int somex(croom) register struct mkroom *croom; { return rn2(croom->hx-croom->lx+1) + croom->lx; } int somey(croom) register struct mkroom *croom; { return rn2(croom->hy-croom->ly+1) + croom->ly; } boolean inside_room(croom, x, y) struct mkroom *croom; xchar x, y; { return((boolean)(x >= croom->lx-1 && x <= croom->hx+1 && y >= croom->ly-1 && y <= croom->hy+1)); } boolean somexy(croom, c) struct mkroom *croom; coord *c; { int try_cnt = 0; int i; if (croom->irregular) { i = (croom - rooms) + ROOMOFFSET; while(try_cnt++ < 100) { c->x = somex(croom); c->y = somey(croom); if (!levl[c->x][c->y].edge && (int) levl[c->x][c->y].roomno == i) return TRUE; } /* try harder; exhaustively search until one is found */ for(c->x = croom->lx; c->x <= croom->hx; c->x++) for(c->y = croom->ly; c->y <= croom->hy; c->y++) if (!levl[c->x][c->y].edge && (int) levl[c->x][c->y].roomno == i) return TRUE; return FALSE; } if (!croom->nsubrooms) { c->x = somex(croom); c->y = somey(croom); return TRUE; } /* Check that coords doesn't fall into a subroom or into a wall */ while(try_cnt++ < 100) { c->x = somex(croom); c->y = somey(croom); if (IS_WALL(levl[c->x][c->y].typ)) continue; for(i=0 ; insubrooms;i++) if(inside_room(croom->sbrooms[i], c->x, c->y)) goto you_lose; break; you_lose: ; } if (try_cnt >= 100) return FALSE; return TRUE; } /* * Search for a special room given its type (zoo, court, etc...) * Special values : * - ANY_SHOP * - ANY_TYPE */ struct mkroom * search_special(type) schar type; { register struct mkroom *croom; for(croom = &rooms[0]; croom->hx >= 0; croom++) if((type == ANY_TYPE && croom->rtype != OROOM) || (type == ANY_SHOP && croom->rtype >= SHOPBASE) || croom->rtype == type) return croom; for(croom = &subrooms[0]; croom->hx >= 0; croom++) if((type == ANY_TYPE && croom->rtype != OROOM) || (type == ANY_SHOP && croom->rtype >= SHOPBASE) || croom->rtype == type) return croom; return (struct mkroom *) 0; } #endif /* OVL0 */ #ifdef OVLB struct permonst * courtmon() { int i = rn2(60) + rn2(3*level_difficulty()); if (i > 200) return(mkclass(S_DRAGON,0)); else if (i > 130) return(mkclass(S_GIANT,0)); else if (i > 85) return(mkclass(S_TROLL,0)); else if (i > 75) return(mkclass(S_CENTAUR,0)); else if (i > 60) return(mkclass(S_ORC,0)); else if (i > 45) return(&mons[PM_BUGBEAR]); else if (i > 30) return(&mons[PM_HOBGOBLIN]); else if (i > 15) return(mkclass(S_GNOME,0)); else return(mkclass(S_KOBOLD,0)); } struct permonst * realzoomon() { int i = rn2(60) + rn2(3*level_difficulty()); if (i > 175) return(&mons[PM_JUMBO_THE_ELEPHANT]); else if (i > 115) return(&mons[PM_MASTODON]); else if (i > 85) return(&mons[PM_PYTHON]); else if (i > 70) return(&mons[PM_MUMAK]); else if (i > 55) return(&mons[PM_TIGER]); else if (i > 45) return(&mons[PM_PANTHER]); else if (i > 25) return(&mons[PM_JAGUAR]); else if (i > 15) return(&mons[PM_APE]); else return(&mons[PM_MONKEY]); } #define NSTYPES (PM_CAPTAIN - PM_SOLDIER + 1) static struct { unsigned pm; unsigned prob; } squadprob[NSTYPES] = { {PM_SOLDIER, 80}, {PM_SERGEANT, 15}, {PM_LIEUTENANT, 4}, {PM_CAPTAIN, 1} }; STATIC_OVL struct permonst * squadmon() /* return soldier types. */ { int sel_prob, i, cpro, mndx; sel_prob = rnd(80+level_difficulty()); cpro = 0; for (i = 0; i < NSTYPES; i++) { cpro += squadprob[i].prob; if (cpro > sel_prob) { mndx = squadprob[i].pm; goto gotone; } } mndx = squadprob[rn2(NSTYPES)].pm; gotone: if (!(mvitals[mndx].mvflags & G_GONE)) return(&mons[mndx]); else return((struct permonst *) 0); } /* * save_room : A recursive function that saves a room and its subrooms * (if any). */ STATIC_OVL void save_room(fd, r) int fd; struct mkroom *r; { short i; /* * Well, I really should write only useful information instead * of writing the whole structure. That is I should not write * the subrooms pointers, but who cares ? */ bwrite(fd, (genericptr_t) r, sizeof(struct mkroom)); for(i=0; insubrooms; i++) save_room(fd, r->sbrooms[i]); } /* * save_rooms : Save all the rooms on disk! */ void save_rooms(fd) int fd; { short i; /* First, write the number of rooms */ bwrite(fd, (genericptr_t) &nroom, sizeof(nroom)); for(i=0; insubrooms; i++) { r->sbrooms[i] = &subrooms[nsubroom]; rest_room(fd, &subrooms[nsubroom]); subrooms[nsubroom++].resident = (struct monst *)0; } } /* * rest_rooms : That's for restoring rooms. Read the rooms structure from * the disk. */ void rest_rooms(fd) int fd; { short i; mread(fd, (genericptr_t) &nroom, sizeof(nroom)); nsubroom = 0; for(i = 0; i 2) ? \ (u.uhp * 10 / u.uhpmax) : 2)) #define can_limitbreak() (!Upolyd && (u.uhp*10 < u.uhpmax) && \ (u.uhp == 1 || (!((((LB_BASE1 * \ LB_BASE2) % LB_CYCLE) >> LB_STRIP) \ % LB_HPMOD)))) /* Whether you know the tech */ boolean tech_known(tech) short tech; { int i; for (i = 0; i < MAXTECH; i++) { if (techid(i) == tech) return TRUE; } return FALSE; } /* Called to prematurely stop a technique */ void aborttech(tech) { int i; i = get_tech_no(tech); if (tech_list[i].t_inuse) { switch (tech_list[i].t_id) { case T_RAGE: u.uhpmax -= tech_list[i].t_inuse - 1; if (u.uhpmax < 1) u.uhpmax = 0; u.uhp -= tech_list[i].t_inuse - 1; if (u.uhp < 1) u.uhp = 1; break; case T_POWER_SURGE: u.uenmax -= tech_list[i].t_inuse - 1; if (u.uenmax < 1) u.uenmax = 0; u.uen -= tech_list[i].t_inuse - 1; if (u.uen < 0) u.uen = 0; break; } tech_list[i].t_inuse = 0; } } /* Called to teach a new tech. Level is starting tech level */ void learntech(tech, mask, tlevel) short tech; long mask; int tlevel; { int i; const struct innate_tech *tp; i = get_tech_no(tech); if (tlevel > 0) { if (i < 0) { i = get_tech_no(NO_TECH); if (i < 0) { impossible("No room for new technique?"); return; } } tlevel = u.ulevel ? u.ulevel - tlevel : 0; if (tech_list[i].t_id == NO_TECH) { tech_list[i].t_id = tech; tech_list[i].t_lev = tlevel; tech_list[i].t_inuse = 0; /* not in use */ tech_list[i].t_intrinsic = 0; } else if (tech_list[i].t_intrinsic & mask) { impossible("Tech already known."); return; } if (mask == FROMOUTSIDE) { tech_list[i].t_intrinsic &= ~OUTSIDE_LEVEL; tech_list[i].t_intrinsic |= tlevel & OUTSIDE_LEVEL; } if (tlevel < tech_list[i].t_lev) tech_list[i].t_lev = tlevel; tech_list[i].t_intrinsic |= mask; tech_list[i].t_tout = 0; /* Can use immediately*/ } else if (tlevel < 0) { if (i < 0 || !(tech_list[i].t_intrinsic & mask)) { impossible("Tech not known."); return; } tech_list[i].t_intrinsic &= ~mask; if (!(tech_list[i].t_intrinsic & INTRINSIC)) { if (tech_list[i].t_inuse) aborttech(tech); tech_list[i].t_id = NO_TECH; return; } /* Re-calculate lowest t_lev */ if (tech_list[i].t_intrinsic & FROMOUTSIDE) tlevel = tech_list[i].t_intrinsic & OUTSIDE_LEVEL; if (tech_list[i].t_intrinsic & FROMEXPER) { for(tp = role_tech(); tp->tech_id; tp++) if (tp->tech_id == tech) break; if (!tp->tech_id) impossible("No inate technique for role?"); else if (tlevel < 0 || tp->ulevel - tp->tech_lev < tlevel) tlevel = tp->ulevel - tp->tech_lev; } if (tech_list[i].t_intrinsic & FROMRACE) { for(tp = race_tech(); tp->tech_id; tp++) if (tp->tech_id == tech) break; if (!tp->tech_id) impossible("No inate technique for race?"); else if (tlevel < 0 || tp->ulevel - tp->tech_lev < tlevel) tlevel = tp->ulevel - tp->tech_lev; } tech_list[i].t_lev = tlevel; } else impossible("Invalid Tech Level!"); } /* * Return TRUE if a tech was picked, with the tech index in the return * parameter. Otherwise return FALSE. */ static boolean gettech(tech_no) int *tech_no; { int i, ntechs, idx; char ilet, lets[BUFSZ], qbuf[QBUFSZ]; for (ntechs = i = 0; i < MAXTECH; i++) if (techid(i) != NO_TECH) ntechs++; if (ntechs == 0) { You("don't know any techniques right now."); return FALSE; } if (flags.menu_style == MENU_TRADITIONAL) { if (ntechs == 1) Strcpy(lets, "a"); else if (ntechs < 27) Sprintf(lets, "a-%c", 'a' + ntechs - 1); else if (ntechs == 27) Sprintf(lets, "a-z A"); else Sprintf(lets, "a-z A-%c", 'A' + ntechs - 27); for(;;) { Sprintf(qbuf, "Perform which technique? [%s ?]", lets); if ((ilet = yn_function(qbuf, (char *)0, '\0')) == '?') break; if (index(quitchars, ilet)) return FALSE; if (letter(ilet) && ilet != '@') { /* in a-zA-Z, convert back to an index */ if (lowc(ilet) == ilet) /* lower case */ idx = ilet - 'a'; else idx = ilet - 'A' + 26; if (idx < ntechs) for(i = 0; i < MAXTECH; i++) if (techid(i) != NO_TECH) { if (idx-- == 0) { *tech_no = i; return TRUE; } } } You("don't know that technique."); } } return dotechmenu(PICK_ONE, tech_no); } static boolean dotechmenu(how, tech_no) int how; int *tech_no; { winid tmpwin; int i, n, len, longest, techs_useable, tlevel; char buf[BUFSZ], let = 'a'; const char *prefix; menu_item *selected; anything any; tmpwin = create_nhwindow(NHW_MENU); start_menu(tmpwin); any.a_void = 0; /* zero out all bits */ techs_useable = 0; if (!iflags.menu_tab_sep) { /* find the length of the longest tech */ for (longest = 0, i = 0; i < MAXTECH; i++) { if (techid(i) == NO_TECH) continue; if ((len = strlen(techname(i))) > longest) longest = len; } Sprintf(buf, " %-*s Level Status", longest, "Name"); } else Sprintf(buf, "Name\tLevel\tStatus"); add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, MENU_UNSELECTED); for (i = 0; i < MAXTECH; i++) { if (techid(i) == NO_TECH) continue; tlevel = techlev(i); if (!techtout(i) && tlevel > 0) { /* Ready to use */ techs_useable++; prefix = ""; any.a_int = i + 1; } else { prefix = " "; any.a_int = 0; } #ifdef WIZARD if (wizard) if (!iflags.menu_tab_sep) Sprintf(buf, "%s%-*s %2d%c%c%c %s(%i)", prefix, longest, techname(i), tlevel, tech_list[i].t_intrinsic & FROMEXPER ? 'X' : ' ', tech_list[i].t_intrinsic & FROMRACE ? 'R' : ' ', tech_list[i].t_intrinsic & FROMOUTSIDE ? 'O' : ' ', tech_inuse(techid(i)) ? "Active" : tlevel <= 0 ? "Beyond recall" : can_limitbreak() ? "LIMIT" : !techtout(i) ? "Prepared" : techtout(i) > 100 ? "Not Ready" : "Soon", techtout(i)); else Sprintf(buf, "%s%s\t%2d%c%c%c\t%s(%i)", prefix, techname(i), tlevel, tech_list[i].t_intrinsic & FROMEXPER ? 'X' : ' ', tech_list[i].t_intrinsic & FROMRACE ? 'R' : ' ', tech_list[i].t_intrinsic & FROMOUTSIDE ? 'O' : ' ', tech_inuse(techid(i)) ? "Active" : tlevel <= 0 ? "Beyond recall" : can_limitbreak() ? "LIMIT" : !techtout(i) ? "Prepared" : techtout(i) > 100 ? "Not Ready" : "Soon", techtout(i)); else #endif if (!iflags.menu_tab_sep) Sprintf(buf, "%s%-*s %5d %s", prefix, longest, techname(i), tlevel, tech_inuse(techid(i)) ? "Active" : tlevel <= 0 ? "Beyond recall" : can_limitbreak() ? "LIMIT" : !techtout(i) ? "Prepared" : techtout(i) > 100 ? "Not Ready" : "Soon"); else Sprintf(buf, "%s%s\t%5d\t%s", prefix, techname(i), tlevel, tech_inuse(techid(i)) ? "Active" : tlevel <= 0 ? "Beyond recall" : can_limitbreak() ? "LIMIT" : !techtout(i) ? "Prepared" : techtout(i) > 100 ? "Not Ready" : "Soon"); add_menu(tmpwin, NO_GLYPH, &any, techtout(i) ? 0 : let, 0, ATR_NONE, buf, MENU_UNSELECTED); if (let++ == 'z') let = 'A'; } if (!techs_useable) how = PICK_NONE; end_menu(tmpwin, how == PICK_ONE ? "Choose a technique" : "Currently known techniques"); n = select_menu(tmpwin, how, &selected); destroy_nhwindow(tmpwin); if (n > 0) { *tech_no = selected[0].item.a_int - 1; free((genericptr_t)selected); return TRUE; } return FALSE; } static int get_tech_no(tech) int tech; { int i; for (i = 0; i < MAXTECH; i++) { if (techid(i) == tech) { return(i); } } return (-1); } int dotech() { int tech_no; if (gettech(&tech_no)) return techeffects(tech_no); return 0; } static NEARDATA const char kits[] = { TOOL_CLASS, 0 }; static struct obj * use_medical_kit(type, feedback, verb) int type; boolean feedback; char *verb; { struct obj *obj, *otmp; makeknown(MEDICAL_KIT); if (!(obj = carrying(MEDICAL_KIT))) { if (feedback) You("need a medical kit to do that."); return (struct obj *)0; } for (otmp = invent; otmp; otmp = otmp->nobj) if (otmp->otyp == MEDICAL_KIT && otmp != obj) break; if (otmp) { /* More than one medical kit */ obj = getobj(kits, verb); if (!obj) return (struct obj *)0; } for (otmp = obj->cobj; otmp; otmp = otmp->nobj) if (otmp->otyp == type) break; if (!otmp) { if (feedback) You_cant("find any more %s in %s.", makeplural(simple_typename(type)), yname(obj)); return (struct obj *)0; } return otmp; } /* gettech is reworked getspell */ /* reworked class special effects code */ /* adapted from specialpower in cmd.c */ static int techeffects(tech_no) int tech_no; { /* These variables are used in various techs */ struct obj *obj, *otmp; const char *str; struct monst *mtmp; int num; char Your_buf[BUFSZ]; char allowall[2]; int i, j, t_timeout = 0; /* check timeout */ if (tech_inuse(techid(tech_no))) { pline("This technique is already active!"); return (0); } if (techtout(tech_no) && !can_limitbreak()) { You("have to wait %s before using your technique again.", (techtout(tech_no) > 100) ? "for a while" : "a little longer"); #ifdef WIZARD if (!wizard || (yn("Use technique anyways?") == 'n')) #endif return(0); } /* switch to the tech and do stuff */ switch (techid(tech_no)) { case T_RESEARCH: /* WAC stolen from the spellcasters...'A' can identify from historical research*/ if(Hallucination || Stunned || Confusion) { You("can't concentrate right now!"); return(0); } else if((ACURR(A_INT) + ACURR(A_WIS)) < rnd(60)) { pline("Nothing in your pack looks familiar."); t_timeout = rn1(500,500); break; } else if(invent) { You("examine your possessions."); identify_pack((int) ((techlev(tech_no) / 10) + 1)); } else { /* KMH -- fixed non-compliant string */ You("are already quite familiar with the contents of your pack."); break; } t_timeout = rn1(500,1500); break; case T_EVISCERATE: /* only when empty handed, in human form */ if (Upolyd || uwep || uarmg) { You_cant("do this while %s!", Upolyd ? "polymorphed" : uwep ? "holding a weapon" : "wearing gloves"); return 0; } Your("fingernails extend into claws!"); aggravate(); techt_inuse(tech_no) = d(2,4) + techlev(tech_no)/5 + 2; t_timeout = rn1(1000,1000); break; case T_BERSERK: You("fly into a berserk rage!"); techt_inuse(tech_no) = d(2,8) + (techlev(tech_no)/5) + 2; incr_itimeout(&HFast, techt_inuse(tech_no)); t_timeout = rn1(1000,500); break; case T_REINFORCE: /* WAC spell-users can study their known spells*/ if(Hallucination || Stunned || Confusion) { You("can't concentrate right now!"); break; } else { You("concentrate..."); if (studyspell()) t_timeout = rn1(1000,500); /*in spell.c*/ } break; case T_FLURRY: Your("%s %s become blurs as they reach for your quiver!", uarmg ? "gloved" : "bare", /* Del Lamb */ makeplural(body_part(HAND))); techt_inuse(tech_no) = rnd((int) (techlev(tech_no)/6 + 1)) + 2; t_timeout = rn1(1000,500); break; case T_PRACTICE: if(!uwep || (weapon_type(uwep) == P_NONE)) { You("are not wielding a weapon!"); return(0); } else if(uwep->known == TRUE) { practice_weapon(); } else { if (not_fully_identified(uwep)) { You("examine %s.", doname(uwep)); if (rnd(15) <= ACURR(A_INT)) { makeknown(uwep->otyp); uwep->known = TRUE; You("discover it is %s",doname(uwep)); } else pline("Unfortunately, you didn't learn anything new."); } /*WAC Added practicing code - in weapon.c*/ practice_weapon(); } t_timeout = rn1(500,500); break; case T_SURGERY: if (Hallucination || Stunned || Confusion) { You("are in no condition to perform surgery!"); break; } if (Sick || Slimed) { if (carrying(SCALPEL)) { pline("Using your scalpel (ow!), you cure your infection!"); make_sick(0L, (char *)0, TRUE, SICK_ALL); Slimed = 0; if (Upolyd) { u.mh -= 5; if (u.mh < 1) rehumanize(); } else if (u.uhp > 6) u.uhp -= 5; else u.uhp = 1; t_timeout = rn1(500,500); flags.botl = TRUE; break; } else pline("If only you had a scalpel..."); } if (Upolyd ? u.mh < u.mhmax : u.uhp < u.uhpmax) { otmp = use_medical_kit(BANDAGE, FALSE, "dress your wounds with"); if (otmp) { check_unpaid(otmp); if (otmp->quan > 1L) { otmp->quan--; otmp->ocontainer->owt = weight(otmp->ocontainer); } else { obj_extract_self(otmp); obfree(otmp, (struct obj *)0); } pline("Using %s, you dress your wounds.", yname(otmp)); healup(techlev(tech_no) * (rnd(2)+1) + rn1(5,5), 0, FALSE, FALSE); } else { You("strap your wounds as best you can."); healup(techlev(tech_no) + rn1(5,5), 0, FALSE, FALSE); } t_timeout = rn1(1000,500); flags.botl = TRUE; } else You("don't need your healing powers!"); break; case T_HEAL_HANDS: if (Slimed) { Your("body is on fire!"); burn_away_slime(); t_timeout = 3000; } else if (Sick) { You("lay your hands on the foul sickness..."); make_sick(0L, (char*)0, TRUE, SICK_ALL); t_timeout = 3000; } else if (Upolyd ? u.mh < u.mhmax : u.uhp < u.uhpmax) { pline("A warm glow spreads through your body!"); healup(techlev(tech_no) * 4, 0, FALSE, FALSE); t_timeout = 3000; } else pline(nothing_happens); break; case T_KIII: You("scream \"KIIILLL!\""); aggravate(); techt_inuse(tech_no) = rnd((int) (techlev(tech_no)/6 + 1)) + 2; t_timeout = rn1(1000,500); break; #ifdef STEED case T_CALM_STEED: if (u.usteed) { pline("%s gets tamer.", Monnam(u.usteed)); tamedog(u.usteed, (struct obj *) 0); t_timeout = rn1(1000,500); } else Your("technique is only effective when riding a monster."); break; #endif case T_TURN_UNDEAD: return(turn_undead()); case T_VANISH: if (Invisible && Fast) { You("are already quite nimble and undetectable."); } techt_inuse(tech_no) = rn1(50,50) + techlev(tech_no); if (!Invisible) pline("In a puff of smoke, you disappear!"); if (!Fast) You("feel more nimble!"); incr_itimeout(&HInvis, techt_inuse(tech_no)); incr_itimeout(&HFast, techt_inuse(tech_no)); newsym(u.ux,u.uy); /* update position */ t_timeout = rn1(1000,500); break; case T_CRIT_STRIKE: if (!getdir((char *)0)) return(0); if (!u.dx && !u.dy) { /* Hopefully a mistake ;B */ You("decide against that idea."); return(0); } mtmp = m_at(u.ux + u.dx, u.uy + u.dy); if (!mtmp) { You("perform a flashy twirl!"); return (0); } else { int oldhp = mtmp->mhp; int tmp; if (!attack(mtmp)) return(0); if (!DEADMONSTER(mtmp) && mtmp->mhp < oldhp && !noncorporeal(mtmp->data) && !unsolid(mtmp->data)) { You("strike %s vital organs!", s_suffix(mon_nam(mtmp))); /* Base damage is always something, though it may be * reduced to zero if the hero is hampered. However, * since techlev will never be zero, stiking vital * organs will always do _some_ damage. */ tmp = mtmp->mhp > 1 ? mtmp->mhp / 2 : 1; if (!humanoid(mtmp->data) || is_golem(mtmp->data) || mtmp->data->mlet == S_CENTAUR) { You("are hampered by the differences in anatomy."); tmp /= 2; } tmp += techlev(tech_no); t_timeout = rn1(1000, 500); hurtmon(mtmp, tmp); } } break; case T_CUTTHROAT: if (!is_blade(uwep)) { You("need a blade to perform cutthroat!"); return 0; } if (!getdir((char *)0)) return 0; if (!u.dx && !u.dy) { /* Hopefully a mistake ;B */ pline("Things may be going badly, but that's extreme."); return 0; } mtmp = m_at(u.ux + u.dx, u.uy + u.dy); if (!mtmp) { You("attack...nothing!"); return 0; } else { int oldhp = mtmp->mhp; if (!attack(mtmp)) return 0; if (!DEADMONSTER(mtmp) && mtmp->mhp < oldhp) { if (!has_head(mtmp->data) || u.uswallow) You_cant("perform cutthroat on %s!", mon_nam(mtmp)); else { int tmp = 0; if (rn2(5) < (techlev(tech_no)/10 + 1)) { You("sever %s head!", s_suffix(mon_nam(mtmp))); tmp = mtmp->mhp; } else { You("hurt %s badly!", s_suffix(mon_nam(mtmp))); tmp = mtmp->mhp / 2; } tmp += techlev(tech_no); t_timeout = rn1(1000,500); hurtmon(mtmp, tmp); } } } break; case T_BLESSING: allowall[0] = ALL_CLASSES; allowall[1] = '\0'; if ( !(obj = getobj(allowall, "bless"))) return(0); pline("An aura of holiness surrounds your hands!"); if (!Blind) (void) Shk_Your(Your_buf, obj); if (obj->cursed) { if (!Blind) pline("%s %s %s.",Your_buf, aobjnam(obj, "softly glow"), hcolor(NH_AMBER)); uncurse(obj); obj->bknown=1; } else if(!obj->blessed) { if (!Blind) { str = hcolor(NH_LIGHT_BLUE); pline("%s %s with a%s %s aura.", Your_buf, aobjnam(obj, "softly glow"), index(vowels, *str) ? "n" : "", str); } bless(obj); obj->bknown=1; } else { if (obj->bknown) { pline ("That object is already blessed!"); return(0); } obj->bknown=1; pline("The aura fades."); } t_timeout = rn1(1000,500); break; case T_E_FIST: blitz_e_fist(); #if 0 str = makeplural(body_part(HAND)); You("focus the powers of the elements into your %s", str); techt_inuse(tech_no) = rnd((int) (techlev(tech_no)/3 + 1)) + d(1,4) + 2; #endif t_timeout = rn1(1000,500); break; case T_PRIMAL_ROAR: You("let out a bloodcurdling roar!"); aggravate(); techt_inuse(tech_no) = d(2,6) + (techlev(tech_no)) + 2; incr_itimeout(&HFast, techt_inuse(tech_no)); for(i = -5; i <= 5; i++) for(j = -5; j <= 5; j++) if(isok(u.ux+i, u.uy+j) && (mtmp = m_at(u.ux+i, u.uy+j))) { if (mtmp->mtame != 0 && !mtmp->isspell) { struct permonst *ptr = mtmp->data; struct monst *mtmp2; int ttime = techt_inuse(tech_no); int type = little_to_big(monsndx(ptr)); mtmp2 = tamedog(mtmp, (struct obj *) 0); if (mtmp2) mtmp = mtmp2; if (type && type != monsndx(ptr)) { ptr = &mons[type]; mon_spec_poly(mtmp, ptr, ttime, FALSE, canseemon(mtmp), FALSE, TRUE); } } } t_timeout = rn1(1000,500); break; case T_LIQUID_LEAP: { coord cc; int dx, dy, sx, sy, range; pline("Where do you want to leap to?"); cc.x = sx = u.ux; cc.y = sy = u.uy; getpos(&cc, TRUE, "the desired position"); if (cc.x == -10) return 0; /* user pressed esc */ dx = cc.x - u.ux; dy = cc.y - u.uy; /* allow diagonals */ if (dx && dy && dx != dy && dx != -dy) { You("can only leap in straight lines!"); return 0; } else if (distu(cc.x, cc.y) > 19 + techlev(tech_no)) { pline("Too far!"); return 0; } else if (m_at(cc.x, cc.y) || !isok(cc.x, cc.y) || IS_ROCK(levl[cc.x][cc.y].typ) || sobj_at(BOULDER, cc.x, cc.y) || closed_door(cc.x, cc.y)) { You_cant("flow there!"); /* MAR */ return 0; } else { You("liquify!"); if (Punished) { You("slip out of the iron chain."); unpunish(); } if(u.utrap) { switch(u.utraptype) { case TT_BEARTRAP: You("slide out of the bear trap."); break; case TT_PIT: You("leap from the pit!"); break; case TT_WEB: You("flow through the web!"); break; case TT_LAVA: You("separate from the lava!"); u.utrap = 0; break; case TT_INFLOOR: u.utrap = 0; You("ooze out of the floor!"); } u.utrap = 0; } /* Fry the things in the path ;B */ if (dx) range = dx; else range = dy; if (range < 0) range = -range; dx = sgn(dx); dy = sgn(dy); while (range-- > 0) { int tmp_invul = 0; if (!Invulnerable) Invulnerable = tmp_invul = 1; sx += dx; sy += dy; tmp_at(DISP_BEAM, zapdir_to_glyph(dx, dy, AD_ACID-1)); tmp_at(sx,sy); delay_output(); /* wait a little */ if ((mtmp = m_at(sx, sy)) != 0) { int chance; chance = rn2(20); if (!chance || (3 - chance) > AC_VALUE(find_mac(mtmp))) break; setmangry(mtmp); You("catch %s in your acid trail!", mon_nam(mtmp)); if (!resists_acid(mtmp)) { int tmp = 1; /* Need to add a to-hit */ tmp += d(2,4); tmp += rn2((int) (techlev(tech_no)/5 + 1)); if (!Blind) pline_The("acid burns %s!", mon_nam(mtmp)); hurtmon(mtmp, tmp); } else if (!Blind) pline_The("acid doesn't affect %s!", mon_nam(mtmp)); } /* Clean up */ tmp_at(DISP_END,0); if (tmp_invul) Invulnerable = 0; } /* A little Sokoban guilt... */ if (In_sokoban(&u.uz)) change_luck(-1); You("reform!"); teleds(cc.x, cc.y, FALSE); nomul(-1); nomovemsg = ""; } t_timeout = rn1(1000,500); break; } case T_SIGIL_TEMPEST: /* Have enough power? */ num = 50 - techlev(tech_no)/5; if (u.uen < num) { You("don't have enough power to invoke the sigil!"); return (0); } u.uen -= num; /* Invoke */ You("invoke the sigil of tempest!"); techt_inuse(tech_no) = d(1,6) + rnd(techlev(tech_no)/5 + 1) + 2; u_wipe_engr(2); return(0); break; case T_SIGIL_CONTROL: /* Have enough power? */ num = 30 - techlev(tech_no)/5; if (u.uen < num) { You("don't have enough power to invoke the sigil!"); return (0); } u.uen -= num; /* Invoke */ You("invoke the sigil of control!"); techt_inuse(tech_no) = d(1,4) + rnd(techlev(tech_no)/5 + 1) + 2; u_wipe_engr(2); return(0); break; case T_SIGIL_DISCHARGE: /* Have enough power? */ num = 100 - techlev(tech_no)/5; if (u.uen < num) { You("don't have enough power to invoke the sigil!"); return (0); } u.uen -= num; /* Invoke */ You("invoke the sigil of discharge!"); techt_inuse(tech_no) = d(1,4) + rnd(techlev(tech_no)/5 + 1) + 2; u_wipe_engr(2); return(0); break; case T_RAISE_ZOMBIES: You("chant the ancient curse..."); for(i = -1; i <= 1; i++) for(j = -1; j <= 1; j++) { int corpsenm; if (!isok(u.ux+i, u.uy+j)) continue; for (obj = level.objects[u.ux+i][u.uy+j]; obj; obj = otmp) { otmp = obj->nexthere; if (obj->otyp != CORPSE) continue; /* Only generate undead */ corpsenm = mon_to_zombie(obj->corpsenm); if (corpsenm != -1 && !cant_create(&corpsenm, TRUE) && (!obj->oxlth || obj->oattached != OATTACHED_MONST)) { /* Maintain approx. proportion of oeaten to cnutrit * so that the zombie's HP relate roughly to how * much of the original corpse was left. */ if (obj->oeaten) obj->oeaten = eaten_stat(mons[corpsenm].cnutrit, obj); obj->corpsenm = corpsenm; mtmp = revive(obj); if (mtmp) { if (!resist(mtmp, SPBOOK_CLASS, 0, TELL)) { mtmp = tamedog(mtmp, (struct obj *) 0); You("dominate %s!", mon_nam(mtmp)); } else setmangry(mtmp); } } } } nomul(-2); /* You need to recover */ nomovemsg = 0; t_timeout = rn1(1000,500); break; case T_REVIVE: if (u.uswallow) { You(no_elbow_room); return 0; } num = 100 - techlev(tech_no); /* WAC make this depend on mon? */ if ((Upolyd && u.mh <= num) || (!Upolyd && u.uhp <= num)){ You("don't have the strength to perform revivification!"); return 0; } obj = getobj((const char *)revivables, "revive"); if (!obj) return (0); mtmp = revive(obj); if (mtmp) { #ifdef BLACKMARKET if (Is_blackmarket(&u.uz)) setmangry(mtmp); else #endif if (mtmp->isshk) make_happy_shk(mtmp, FALSE); else if (!resist(mtmp, SPBOOK_CLASS, 0, NOTELL)) (void) tamedog(mtmp, (struct obj *) 0); } if (Upolyd) u.mh -= num; else u.uhp -= num; t_timeout = rn1(1000,500); break; case T_WARD_FIRE: /* Already have it intrinsically? */ if (HFire_resistance & FROMOUTSIDE) return (0); You("invoke the ward against flame!"); HFire_resistance += rn1(100,50); HFire_resistance += techlev(tech_no); t_timeout = rn1(1000,500); break; case T_WARD_COLD: /* Already have it intrinsically? */ if (HCold_resistance & FROMOUTSIDE) return (0); You("invoke the ward against ice!"); HCold_resistance += rn1(100,50); HCold_resistance += techlev(tech_no); t_timeout = rn1(1000,500); break; case T_WARD_ELEC: /* Already have it intrinsically? */ if (HShock_resistance & FROMOUTSIDE) return (0); You("invoke the ward against lightning!"); HShock_resistance += rn1(100,50); HShock_resistance += techlev(tech_no); t_timeout = rn1(1000,500); break; case T_TINKER: if (Blind) { You("can't do any tinkering if you can't see!"); return (0); } if (!uwep) { You("aren't holding an object to work on!"); return (0); } You("are holding %s.", doname(uwep)); if (yn("Start tinkering on this?") != 'y') return(0); You("start working on %s",doname(uwep)); delay=-150 + techlev(tech_no); set_occupation(tinker, "tinkering", 0); break; case T_RAGE: if (Upolyd) { You("cannot focus your anger!"); return(0); } You("feel the anger inside you erupt!"); num = 50 + (4 * techlev(tech_no)); techt_inuse(tech_no) = num + 1; u.uhpmax += num; u.uhp += num; t_timeout = rn1(1000,500); break; case T_BLINK: You("feel the flow of time slow down."); techt_inuse(tech_no) = rnd(techlev(tech_no) + 1) + 2; t_timeout = rn1(1000,500); break; case T_CHI_STRIKE: if (!blitz_chi_strike()) return(0); t_timeout = rn1(1000,500); break; case T_DRAW_ENERGY: if (u.uen == u.uenmax) { if (Hallucination) You("are fully charged!"); else You("cannot hold any more energy!"); return(0); } You("begin drawing energy from your surroundings!"); delay=-15; set_occupation(draw_energy, "drawing energy", 0); t_timeout = rn1(1000,500); break; case T_CHI_HEALING: if (u.uen < 1) { You("are too weak to attempt this!"); return(0); } You("direct your internal energy to restoring your body!"); techt_inuse(tech_no) = techlev(tech_no)*2 + 4; t_timeout = rn1(1000,500); break; case T_DISARM: if (P_SKILL(weapon_type(uwep)) == P_NONE) { You("aren't wielding a proper weapon!"); return(0); } if ((P_SKILL(weapon_type(uwep)) < P_SKILLED) || (Blind)) { You("aren't capable of doing this!"); return(0); } if (u.uswallow) { pline("What do you think %s is? A sword swallower?", mon_nam(u.ustuck)); return(0); } if (!getdir((char *)0)) return(0); if (!u.dx && !u.dy) { /* Hopefully a mistake ;B */ pline("Why don't you try wielding something else instead."); return(0); } mtmp = m_at(u.ux + u.dx, u.uy + u.dy); if (!mtmp || !canspotmon(mtmp)) { if (memory_is_invisible(u.ux + u.dx, u.uy + u.dy)) You("don't know where to aim for!"); else You("don't see anything there!"); return (0); } obj = MON_WEP(mtmp); /* can be null */ if (!obj) { You_cant("disarm an unarmed foe!"); return(0); } /* Blindness dealt with above */ if (!mon_visible(mtmp) #ifdef INVISIBLE_OBJECTS || obj->oinvis && !See_invisible #endif ) { You_cant("see %s weapon!", s_suffix(mon_nam(mtmp))); return(0); } num = ((rn2(techlev(tech_no) + 15)) * (P_SKILL(weapon_type(uwep)) - P_SKILLED + 1)) / 10; You("attempt to disarm %s...",mon_nam(mtmp)); /* WAC can't yank out cursed items */ if (num > 0 && (!Fumbling || !rn2(10)) && !obj->cursed) { int roll; obj_extract_self(obj); possibly_unwield(mtmp, FALSE); setmnotwielded(mtmp, obj); roll = rn2(num + 1); if (roll > 3) roll = 3; switch (roll) { case 2: /* to floor near you */ You("knock %s %s to the %s!", s_suffix(mon_nam(mtmp)), xname(obj), surface(u.ux, u.uy)); if (obj->otyp == CRYSKNIFE && (!obj->oerodeproof || !rn2(10))) { obj->otyp = WORM_TOOTH; obj->oerodeproof = 0; } place_object(obj, u.ux, u.uy); stackobj(obj); break; case 3: #if 0 if (!rn2(25)) { /* proficient at disarming, but maybe not so proficient at catching weapons */ int hitu, hitvalu; hitvalu = 8 + obj->spe; hitu = thitu(hitvalu, dmgval(obj, &youmonst), obj, xname(obj)); if (hitu) pline("%s hits you as you try to snatch it!", The(xname(obj))); place_object(obj, u.ux, u.uy); stackobj(obj); break; } #endif /* 0 */ /* right into your inventory */ You("snatch %s %s!", s_suffix(mon_nam(mtmp)), xname(obj)); if (obj->otyp == CORPSE && touch_petrifies(&mons[obj->corpsenm]) && !uarmg && !Stone_resistance && !(poly_when_stoned(youmonst.data) && polymon(PM_STONE_GOLEM))) { char kbuf[BUFSZ]; Sprintf(kbuf, "%s corpse", an(mons[obj->corpsenm].mname)); pline("Snatching %s is a fatal mistake.", kbuf); instapetrify(kbuf); } obj = hold_another_object(obj, "You drop %s!", doname(obj), (const char *)0); break; default: /* to floor beneath mon */ You("knock %s from %s grasp!", the(xname(obj)), s_suffix(mon_nam(mtmp))); if (obj->otyp == CRYSKNIFE && (!obj->oerodeproof || !rn2(10))) { obj->otyp = WORM_TOOTH; obj->oerodeproof = 0; } place_object(obj, mtmp->mx, mtmp->my); stackobj(obj); break; } } else if (mtmp->mcanmove && !mtmp->msleeping) pline("%s evades your attack.", Monnam(mtmp)); else You("fail to dislodge %s %s.", s_suffix(mon_nam(mtmp)), xname(obj)); wakeup(mtmp); if (!mtmp->mcanmove && !rn2(10)) { mtmp->mcanmove = 1; mtmp->mfrozen = 0; } break; case T_DAZZLE: /* Short range stun attack */ if (Blind) { You("can't see anything!"); return(0); } if (!getdir((char *)0)) return(0); if (!u.dx && !u.dy) { /* Hopefully a mistake ;B */ You("can't see yourself!"); return(0); } for(i = 0; (i <= ((techlev(tech_no) / 8) + 1) && isok(u.ux + (i*u.dx), u.uy + (i*u.dy))); i++) { mtmp = m_at(u.ux + (i*u.dx), u.uy + (i*u.dy)); if (mtmp && canseemon(mtmp)) break; } if (!mtmp || !canseemon(mtmp)) { You("fail to make eye contact with anything!"); return (0); } You("stare at %s.", mon_nam(mtmp)); if (!haseyes(mtmp->data)) pline("..but %s has no eyes!", mon_nam(mtmp)); else if (!mtmp->mcansee) pline("..but %s cannot see you!", mon_nam(mtmp)); if ((rn2(6) + rn2(6) + (techlev(tech_no) - mtmp->m_lev)) > 10) { You("dazzle %s!", mon_nam(mtmp)); mtmp->mcanmove = 0; mtmp->mfrozen = rnd(10); } else { pline("%s breaks the stare!", Monnam(mtmp)); } t_timeout = rn1(50,25); break; case T_BLITZ: if (uwep || (u.twoweap && uswapwep)) { You("can't do this while wielding a weapon!"); return(0); } else if (uarms) { You("can't do this while holding a shield!"); return(0); } if (!doblitz()) return (0); t_timeout = rn1(1000,500); break; case T_PUMMEL: if (uwep || (u.twoweap && uswapwep)) { You("can't do this while wielding a weapon!"); return(0); } else if (uarms) { You("can't do this while holding a shield!"); return(0); } if (!getdir((char *)0)) return(0); if (!u.dx && !u.dy) { You("flex your muscles."); return(0); } if (!blitz_pummel()) return(0); t_timeout = rn1(1000,500); break; case T_G_SLAM: if (uwep || (u.twoweap && uswapwep)) { You("can't do this while wielding a weapon!"); return(0); } else if (uarms) { You("can't do this while holding a shield!"); return(0); } if (!getdir((char *)0)) return(0); if (!u.dx && !u.dy) { You("flex your muscles."); return(0); } if (!blitz_g_slam()) return(0); t_timeout = rn1(1000,500); break; case T_DASH: if (!getdir((char *)0)) return(0); if (!u.dx && !u.dy) { You("stretch."); return(0); } if (!blitz_dash()) return(0); t_timeout = rn1(50, 25); break; case T_POWER_SURGE: if (!blitz_power_surge()) return(0); t_timeout = rn1(1000,500); break; case T_SPIRIT_BOMB: if (uwep || (u.twoweap && uswapwep)) { You("can't do this while wielding a weapon!"); return(0); } else if (uarms) { You("can't do this while holding a shield!"); return(0); } if (!getdir((char *)0)) return(0); if (!blitz_spirit_bomb()) return(0); t_timeout = rn1(1000,500); break; case T_DRAW_BLOOD: if (!maybe_polyd(is_vampire(youmonst.data), Race_if(PM_VAMPIRE))) { /* ALI * Otherwise we get problems with what we create: * potions of vampire blood would no longer be * appropriate. */ You("must be in your natural form to draw blood."); return(0); } obj = use_medical_kit(PHIAL, TRUE, "draw blood with"); if (!obj) return 0; if (u.ulevel <= 1) { You_cant("seem to find a vein."); return 0; } check_unpaid(obj); if (obj->quan > 1L) obj->quan--; else { obj_extract_self(obj); obfree(obj, (struct obj *)0); } pline("Using your medical kit, you draw off a phial of your blood."); losexp("drawing blood", TRUE); if (u.uexp > 0) u.uexp = newuexp(u.ulevel - 1); otmp = mksobj(POT_VAMPIRE_BLOOD, FALSE, FALSE); otmp->cursed = obj->cursed; otmp->blessed = obj->blessed; (void) hold_another_object(otmp, "You fill, but have to drop, %s!", doname(otmp), (const char *)0); t_timeout = rn1(1000, 500); break; default: pline ("Error! No such effect (%i)", tech_no); break; } if (!can_limitbreak()) techtout(tech_no) = (t_timeout * (100 - techlev(tech_no))/100); /*By default, action should take a turn*/ return(1); } /* Whether or not a tech is in use. * 0 if not in use, turns left if in use. Tech is done when techinuse == 1 */ int tech_inuse(tech_id) int tech_id; { int i; if (tech_id < 1 || tech_id > MAXTECH) { impossible ("invalid tech: %d", tech_id); return(0); } for (i = 0; i < MAXTECH; i++) { if (techid(i) == tech_id) { return (techt_inuse(i)); } } return (0); } void tech_timeout() { int i; for (i = 0; i < MAXTECH; i++) { if (techid(i) == NO_TECH) continue; if (techt_inuse(i)) { /* Check if technique is done */ if (!(--techt_inuse(i))) switch (techid(i)) { case T_EVISCERATE: You("retract your claws."); /* You're using bare hands now, so new msg for next attack */ unweapon=TRUE; /* Lose berserk status */ repeat_hit = 0; break; case T_BERSERK: The("red haze in your mind clears."); break; case T_KIII: You("calm down."); break; case T_FLURRY: You("relax."); break; case T_E_FIST: You("feel the power dissipate."); break; case T_SIGIL_TEMPEST: pline_The("sigil of tempest fades."); break; case T_SIGIL_CONTROL: pline_The("sigil of control fades."); break; case T_SIGIL_DISCHARGE: pline_The("sigil of discharge fades."); break; case T_RAGE: Your("anger cools."); break; case T_POWER_SURGE: pline_The("awesome power within you fades."); break; case T_BLINK: You("sense the flow of time returning to normal."); break; case T_CHI_STRIKE: You("feel the power in your hands dissipate."); break; case T_CHI_HEALING: You("feel the healing power dissipate."); break; default: break; } else switch (techid(i)) { /* During the technique */ case T_RAGE: /* Bleed but don't kill */ if (u.uhpmax > 1) u.uhpmax--; if (u.uhp > 1) u.uhp--; break; case T_POWER_SURGE: /* Bleed off power. Can go to zero as 0 power is not fatal */ if (u.uenmax > 1) u.uenmax--; if (u.uen > 0) u.uen--; break; default: break; } } if (techtout(i) > 0) techtout(i)--; } } void docalm() { int i, tech, n = 0; for (i = 0; i < MAXTECH; i++) { tech = techid(i); if (tech != NO_TECH && techt_inuse(i)) { aborttech(tech); n++; } } if (n) You("calm down."); } static void hurtmon(mtmp, tmp) struct monst *mtmp; int tmp; { mtmp->mhp -= tmp; if (mtmp->mhp < 1) killed (mtmp); #ifdef SHOW_DMG else showdmg(tmp); #endif } static const struct innate_tech * role_tech() { switch (Role_switch) { case PM_ARCHEOLOGIST: return (arc_tech); case PM_BARBARIAN: return (bar_tech); case PM_CAVEMAN: return (cav_tech); case PM_FLAME_MAGE: return (fla_tech); case PM_HEALER: return (hea_tech); case PM_ICE_MAGE: return (ice_tech); case PM_KNIGHT: return (kni_tech); case PM_MONK: return (mon_tech); case PM_NECROMANCER: return (nec_tech); case PM_PRIEST: return (pri_tech); case PM_RANGER: return (ran_tech); case PM_ROGUE: return (rog_tech); case PM_SAMURAI: return (sam_tech); #ifdef TOURIST case PM_TOURIST: return (tou_tech); #endif case PM_UNDEAD_SLAYER: return (und_tech); case PM_VALKYRIE: return (val_tech); case PM_WIZARD: return (wiz_tech); #ifdef YEOMAN case PM_YEOMAN: return (yeo_tech); #endif default: return ((struct innate_tech *) 0); } } static const struct innate_tech * race_tech() { switch (Race_switch) { case PM_DOPPELGANGER: return (dop_tech); #ifdef DWARF case PM_DWARF: return (dwa_tech); #endif case PM_ELF: case PM_DROW: return (elf_tech); case PM_GNOME: return (gno_tech); case PM_HOBBIT: return (hob_tech); case PM_HUMAN_WEREWOLF: return (lyc_tech); case PM_VAMPIRE: return (vam_tech); default: return ((struct innate_tech *) 0); } } void adjtech(oldlevel,newlevel) int oldlevel, newlevel; { const struct innate_tech *tech = role_tech(), *rtech = race_tech(); long mask = FROMEXPER; while (tech || rtech) { /* Have we finished with the tech lists? */ if (!tech || !tech->tech_id) { /* Try the race intrinsics */ if (!rtech || !rtech->tech_id) break; tech = rtech; rtech = (struct innate_tech *) 0; mask = FROMRACE; } for(; tech->tech_id; tech++) if(oldlevel < tech->ulevel && newlevel >= tech->ulevel) { if (tech->ulevel != 1 && !tech_known(tech->tech_id)) You("learn how to perform %s!", tech_names[tech->tech_id]); learntech(tech->tech_id, mask, tech->tech_lev); } else if (oldlevel >= tech->ulevel && newlevel < tech->ulevel && tech->ulevel != 1) { learntech(tech->tech_id, mask, -1); if (!tech_known(tech->tech_id)) You("lose the ability to perform %s!", tech_names[tech->tech_id]); } } } int mon_to_zombie(monnum) int monnum; { if ((&mons[monnum])->mlet == S_ZOMBIE) return monnum; /* is already zombie */ if ((&mons[monnum])->mlet == S_KOBOLD) return PM_KOBOLD_ZOMBIE; if ((&mons[monnum])->mlet == S_GNOME) return PM_GNOME_ZOMBIE; if (is_orc(&mons[monnum])) return PM_ORC_ZOMBIE; if (is_dwarf(&mons[monnum])) return PM_DWARF_ZOMBIE; if (is_elf(&mons[monnum])) return PM_ELF_ZOMBIE; if (is_human(&mons[monnum])) return PM_HUMAN_ZOMBIE; if (monnum == PM_ETTIN) return PM_ETTIN_ZOMBIE; if (is_giant(&mons[monnum])) return PM_GIANT_ZOMBIE; /* Is it humanoid? */ if (!humanoid(&mons[monnum])) return (-1); /* Otherwise, return a ghoul or ghast */ if (!rn2(4)) return PM_GHAST; else return PM_GHOUL; } /*WAC tinker code*/ STATIC_PTR int tinker() { int chance; struct obj *otmp = uwep; if (delay) { /* not if (delay++), so at end delay == 0 */ delay++; #if 0 use_skill(P_TINKER, 1); /* Tinker skill */ #endif /*WAC a bit of practice so even if you're interrupted you won't be wasting your time ;B*/ return(1); /* still busy */ } if (!uwep) return (0); You("finish your tinkering."); chance = 5; /* chance += PSKILL(P_TINKER); */ if (rnl(10) < chance) { upgrade_obj(otmp); } else { /* object downgrade - But for now, nothing :) */ } setuwep(otmp, FALSE); You("now hold %s!", doname(otmp)); return(0); } /*WAC draw energy from surrounding objects */ STATIC_PTR int draw_energy() { int powbonus = 1; if (delay) { /* not if (delay++), so at end delay == 0 */ delay++; confdir(); if(isok(u.ux + u.dx, u.uy + u.dy)) { switch((&levl[u.ux + u.dx][u.uy + u.dy])->typ) { case ALTAR: /* Divine power */ powbonus = (u.uenmax > 28 ? u.uenmax / 4 : 7); break; case THRONE: /* Regal == pseudo divine */ powbonus = (u.uenmax > 36 ? u.uenmax / 6 : 6); break; case CLOUD: /* Air */ case TREE: /* Earth */ case LAVAPOOL: /* Fire */ case ICE: /* Water - most ordered form */ powbonus = 5; break; case AIR: case MOAT: /* Doesn't freeze */ case WATER: powbonus = 4; break; case POOL: /* Can dry up */ powbonus = 3; break; case FOUNTAIN: powbonus = 2; break; case SINK: /* Cleansing water */ if (!rn2(3)) powbonus = 2; break; case TOILET: /* Water Power...but also waste! */ if (rn2(100) < 50) powbonus = 2; else powbonus = -2; break; case GRAVE: powbonus = -4; break; default: break; } } u.uen += powbonus; if (u.uen > u.uenmax) { delay = 0; u.uen = u.uenmax; } if (u.uen < 1) u.uen = 0; flags.botl = 1; return(1); /* still busy */ } You("finish drawing energy from your surroundings."); return(0); } static const char *Enter_Blitz = "Enter Blitz Command[. to end]: "; /* Keep commands that reference the same blitz together * Keep the BLITZ_START before the BLITZ_CHAIN before the BLITZ_END */ static const struct blitz_tab blitzes[] = { {"LLDDR", 5, blitz_chi_strike, T_CHI_STRIKE, BLITZ_START}, {"LLDDRDR", 7, blitz_chi_strike, T_CHI_STRIKE, BLITZ_START}, {"RR", 2, blitz_dash, T_DASH, BLITZ_START}, {"LL", 2, blitz_dash, T_DASH, BLITZ_START}, {"UURRDDL", 7, blitz_e_fist, T_E_FIST, BLITZ_START}, {"URURRDDLDL", 10, blitz_e_fist, T_E_FIST, BLITZ_START}, {"DDRRDDRR", 8, blitz_power_surge, T_POWER_SURGE, BLITZ_START}, {"DRDRDRDR", 8, blitz_power_surge, T_POWER_SURGE, BLITZ_START}, {"LRL", 3, blitz_pummel, T_PUMMEL, BLITZ_CHAIN}, {"RLR", 3, blitz_pummel, T_PUMMEL, BLITZ_CHAIN}, {"DDDD", 4, blitz_g_slam, T_G_SLAM, BLITZ_END}, {"DUDUUDDD", 8, blitz_spirit_bomb, T_SPIRIT_BOMB, BLITZ_END}, {"", 0, (void *)0, 0, BLITZ_END} /* Array terminator */ }; #define MAX_BLITZ 50 #define MIN_CHAIN 2 #define MAX_CHAIN 5 /* parse blitz input */ static int doblitz() { int i, j, dx, dy, bdone = 0, tech_no; char buf[BUFSZ]; char *bp; int blitz_chain[MAX_CHAIN], blitz_num; tech_no = (get_tech_no(T_BLITZ)); if (tech_no == -1) { return(0); } if (u.uen < 10) { You("are too weak to attempt this!"); return(0); } bp = buf; if (!getdir((char *)0)) return(0); if (!u.dx && !u.dy) { return(0); } dx = u.dx; dy = u.dy; doblitzlist(); for (i= 0; i < MAX_BLITZ; i++) { if (!getdir(Enter_Blitz)) return(0); /* Get directional input */ if (!u.dx && !u.dy && !u.dz) break; if (u.dx == -1) { *(bp) = 'L'; bp++; } else if (u.dx == 1) { *(bp) = 'R'; bp++; } if (u.dy == -1) { *(bp) = 'U'; bp++; } else if (u.dy == 1) { *(bp) = 'D'; bp++; } if (u.dz == -1) { *(bp) = '>'; bp++; } else if (u.dz == 1) { *(bp) = '<'; bp++; } } *(bp) = '.'; bp++; *(bp) = '\0'; bp = buf; /* Point of no return - You've entered and terminated a blitz, so... */ u.uen -= 10; /* parse input */ /* You can't put two of the same blitz in a row */ blitz_num = 0; while(strncmp(bp, ".", 1)) { bdone = 0; for (j = 0; blitzes[j].blitz_len; j++) { if (blitz_num >= MAX_CHAIN || blitz_num >= (MIN_CHAIN + (techlev(tech_no) / 10))) break; /* Trying to chain too many blitz commands */ else if (!strncmp(bp, blitzes[j].blitz_cmd, blitzes[j].blitz_len)) { /* Trying to chain in a command you don't know yet */ if (!tech_known(blitzes[j].blitz_tech)) break; if (blitz_num) { /* Check if trying to chain two of the exact same * commands in a row */ if (j == blitz_chain[(blitz_num - 1)]) break; /* Trying to chain after chain finishing command */ if (blitzes[blitz_chain[(blitz_num - 1)]].blitz_type == BLITZ_END) break; /* Trying to put a chain starter after starting * a chain * Note that it's OK to put two chain starters in a * row */ if ((blitzes[j].blitz_type == BLITZ_START) && (blitzes[blitz_chain[(blitz_num - 1)]].blitz_type != BLITZ_START)) break; } bp += blitzes[j].blitz_len; blitz_chain[blitz_num] = j; blitz_num++; bdone = 1; break; } } if (!bdone) { You("stumble!"); return(1); } } for (i = 0; i < blitz_num; i++) { u.dx = dx; u.dy = dy; if (!( (*blitzes[blitz_chain[i]].blitz_funct)() )) break; } /* done */ return(1); } static void doblitzlist() { winid tmpwin; int i, n; char buf[BUFSZ]; menu_item *selected; anything any; tmpwin = create_nhwindow(NHW_MENU); start_menu(tmpwin); any.a_void = 0; /* zero out all bits */ Sprintf(buf, "%16s %10s %-17s", "[LU = Left Up]", "[U = Up]", "[RU = Right Up]"); add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, MENU_UNSELECTED); Sprintf(buf, "%16s %10s %-17s", "[L = Left]", "", "[R = Right]"); add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, MENU_UNSELECTED); Sprintf(buf, "%16s %10s %-17s", "[LD = Left Down]", "[D = Down]", "[RD = Right Down]"); add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, MENU_UNSELECTED); Sprintf(buf, "%-30s %10s %s", "Name", "Type", "Command"); add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, MENU_UNSELECTED); for (i = 0; blitzes[i].blitz_len; i++) { if (tech_known(blitzes[i].blitz_tech)) { Sprintf(buf, "%-30s %10s %s", (i && blitzes[i].blitz_tech == blitzes[(i-1)].blitz_tech ? "" : tech_names[blitzes[i].blitz_tech]), (blitzes[i].blitz_type == BLITZ_START ? "starter" : (blitzes[i].blitz_type == BLITZ_CHAIN ? "chain" : (blitzes[i].blitz_type == BLITZ_END ? "finisher" : "unknown"))), blitzes[i].blitz_cmd); add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, MENU_UNSELECTED); } } end_menu(tmpwin, "Currently known blitz manoeuvers"); n = select_menu(tmpwin, PICK_NONE, &selected); destroy_nhwindow(tmpwin); return; } static int blitz_chi_strike() { int tech_no; tech_no = (get_tech_no(T_CHI_STRIKE)); if (tech_no == -1) { return(0); } if (u.uen < 1) { You("are too weak to attempt this!"); return(0); } You("feel energy surge through your hands!"); techt_inuse(tech_no) = techlev(tech_no) + 4; return(1); } static int blitz_e_fist() { int tech_no; const char *str; tech_no = (get_tech_no(T_E_FIST)); if (tech_no == -1) { return(0); } str = makeplural(body_part(HAND)); You("focus the powers of the elements into your %s.", str); techt_inuse(tech_no) = rnd((int) (techlev(tech_no)/3 + 1)) + d(1,4) + 2; return 1; } /* Assumes u.dx, u.dy already set up */ static int blitz_pummel() { int i = 0, tech_no; struct monst *mtmp; tech_no = (get_tech_no(T_PUMMEL)); if (tech_no == -1) { return(0); } You("let loose a barrage of blows!"); if (u.uswallow) mtmp = u.ustuck; else mtmp = m_at(u.ux + u.dx, u.uy + u.dy); if (!mtmp) { You("strike nothing."); return (0); } if (!attack(mtmp)) return (0); /* Perform the extra attacks */ for (i = 0; (i < 4); i++) { if (rn2(70) > (techlev(tech_no) + 30)) break; if (u.uswallow) mtmp = u.ustuck; else mtmp = m_at(u.ux + u.dx, u.uy + u.dy); if (!mtmp) return (1); if (!attack(mtmp)) return (1); } return(1); } /* Assumes u.dx, u.dy already set up */ static int blitz_g_slam() { int tech_no, tmp, canhitmon, objenchant; struct monst *mtmp; struct trap *chasm; tech_no = (get_tech_no(T_G_SLAM)); if (tech_no == -1) { return(0); } mtmp = m_at(u.ux + u.dx, u.uy + u.dy); if (!mtmp) { You("strike nothing."); return (0); } if (!attack(mtmp)) return (0); /* Slam the monster into the ground */ mtmp = m_at(u.ux + u.dx, u.uy + u.dy); if (!mtmp || u.uswallow) return(1); You("hurl %s downwards...", mon_nam(mtmp)); if (Is_airlevel(&u.uz) || Is_waterlevel(&u.uz)) return(1); if (need_four(mtmp)) canhitmon = 4; else if (need_three(mtmp)) canhitmon = 3; else if (need_two(mtmp)) canhitmon = 2; else if (need_one(mtmp)) canhitmon = 1; else canhitmon = 0; if (Upolyd) { if (hit_as_four(&youmonst)) objenchant = 4; else if (hit_as_three(&youmonst)) objenchant = 3; else if (hit_as_two(&youmonst)) objenchant = 2; else if (hit_as_one(&youmonst)) objenchant = 1; else if (need_four(&youmonst)) objenchant = 4; else if (need_three(&youmonst)) objenchant = 3; else if (need_two(&youmonst)) objenchant = 2; else if (need_one(&youmonst)) objenchant = 1; else objenchant = 0; } else objenchant = u.ulevel / 4; tmp = (5 + rnd(6) + (techlev(tech_no) / 5)); chasm = maketrap(u.ux + u.dx, u.uy + u.dy, PIT); if (chasm) { if (!is_flyer(mtmp->data) && !is_clinger(mtmp->data)) mtmp->mtrapped = 1; chasm->tseen = 1; levl[u.ux + u.dx][u.uy + u.dy].doormask = 0; pline("%s slams into the ground, creating a crater!", Monnam(mtmp)); tmp *= 2; } mselftouch(mtmp, "Falling, ", TRUE); if (!DEADMONSTER(mtmp)) { if (objenchant < canhitmon) pline("%s doesn't seem to be harmed.", Monnam(mtmp)); else if ((mtmp->mhp -= tmp) <= 0) { if(!cansee(u.ux + u.dx, u.uy + u.dy)) pline("It is destroyed!"); else { You("destroy %s!", mtmp->mtame ? x_monnam(mtmp, ARTICLE_THE, "poor", mtmp->mnamelth ? SUPPRESS_SADDLE : 0, FALSE) : mon_nam(mtmp)); } xkilled(mtmp,0); } } return(1); } /* Assumes u.dx, u.dy already set up */ static int blitz_dash() { int tech_no; tech_no = (get_tech_no(T_DASH)); if (tech_no == -1) { return(0); } if ((!Punished || carried(uball)) && !u.utrap) You("dash forwards!"); hurtle(u.dx, u.dy, 2, FALSE); multi = 0; /* No paralysis with dash */ return 1; } static int blitz_power_surge() { int tech_no, num; tech_no = (get_tech_no(T_POWER_SURGE)); if (tech_no == -1) { return(0); } if (Upolyd) { You("cannot tap into your full potential in this form."); return(0); } You("tap into the full extent of your power!"); num = 50 + (2 * techlev(tech_no)); techt_inuse(tech_no) = num + 1; u.uenmax += num; u.uen = u.uenmax; return 1; } /* Assumes u.dx, u.dy already set up */ static int blitz_spirit_bomb() { int tech_no, num; int sx = u.ux, sy = u.uy, i; tech_no = (get_tech_no(T_SPIRIT_BOMB)); if (tech_no == -1) { return(0); } You("gather your energy..."); if (u.uen < 10) { pline("But it fizzles out."); u.uen = 0; } num = 10 + (techlev(tech_no) / 5); num = (u.uen < num ? u.uen : num); u.uen -= num; for( i = 0; i < 2; i++) { if (!isok(sx,sy) || !cansee(sx,sy) || IS_STWALL(levl[sx][sy].typ) || u.uswallow) break; /* Display the center of the explosion */ tmp_at(DISP_FLASH, explosion_to_glyph(EXPL_MAGICAL, S_explode5)); tmp_at(sx, sy); delay_output(); tmp_at(DISP_END, 0); sx += u.dx; sy += u.dy; } /* Magical Explosion */ explode(sx, sy, 10, (d(3,6) + num), WAND_CLASS, EXPL_MAGICAL); return 1; } #ifdef DEBUG void wiz_debug_cmd() /* in this case, allow controlled loss of techniques */ { int tech_no, id, n = 0; long mask; if (gettech(&tech_no)) { id = techid(tech_no); if (id == NO_TECH) { impossible("Unknown technique ([%d])?", tech_no); return; } mask = tech_list[tech_no].t_intrinsic; if (mask & FROMOUTSIDE) n++; if (mask & FROMRACE) n++; if (mask & FROMEXPER) n++; if (!n) { impossible("No intrinsic masks set (0x%lX).", mask); return; } n = rn2(n); if (mask & FROMOUTSIDE && !n--) mask = FROMOUTSIDE; if (mask & FROMRACE && !n--) mask = FROMRACE; if (mask & FROMEXPER && !n--) mask = FROMEXPER; learntech(id, mask, -1); if (!tech_known(id)) You("lose the ability to perform %s.", tech_names[id]); } } #endif /* DEBUG */ slashem-0.0.7E7F3/src/attrib.c0000664000076400007640000005425610545462317014110 0ustar aliali/* SCCS Id: @(#)attrib.c 3.4 2002/10/07 */ /* Copyright 1988, 1989, 1990, 1992, M. Stephenson */ /* NetHack may be freely redistributed. See license for details. */ /* attribute modification routines. */ #include "hack.h" /* #define DEBUG */ /* uncomment for debugging info */ #ifdef OVLB /* part of the output on gain or loss of attribute */ static const char * const plusattr[] = { "strong", "smart", "wise", "agile", "tough", "charismatic" }, * const minusattr[] = { "weak", "stupid", "foolish", "clumsy", "fragile", "repulsive" }; /* KMH, intrinsics patch -- many of these are updated */ static const struct innate { schar ulevel; long *ability; const char *gainstr, *losestr; } arc_abil[] = { { 1, &(HStealth), "", "" }, { 1, &(HFast), "", "" }, { 10, &(HSearching), "perceptive", "" }, { 0, 0, 0, 0 } }, bar_abil[] = { { 1, &(HPoison_resistance), "", "" }, { 7, &(HFast), "quick", "slow" }, { 15, &(HStealth), "stealthy", "" }, { 0, 0, 0, 0 } }, cav_abil[] = { { 7, &(HFast), "quick", "slow" }, { 15, &(HWarning), "sensitive", "" }, { 0, 0, 0, 0 } }, fla_abil[] = { { 1, &(HFire_resistance), "", "" }, { 13, &(HCold_resistance), "warm", "cooler" }, { 0, 0, 0, 0 } }, hea_abil[] = { { 1, &(HPoison_resistance), "", "" }, { 15, &(HWarning), "sensitive", "" }, { 0, 0, 0, 0 } }, ice_abil[] = { { 1, &(HCold_resistance), "", "" }, { 13, &(HFire_resistance), "cool", "warmer" }, { 0, 0, 0, 0 } }, kni_abil[] = { { 7, &(HFast), "quick", "slow" }, { 0, 0, 0, 0 } }, mon_abil[] = { { 1, &(HFast), "", "" }, { 1, &(HSleep_resistance), "", "" }, { 1, &(HSee_invisible), "", "" }, { 3, &(HPoison_resistance), "healthy", "" }, { 5, &(HStealth), "stealthy", "" }, { 7, &(HWarning), "sensitive", "" }, { 9, &(HSearching), "perceptive", "unaware" }, #if 0 { 11, &(HFire_resistance), "cool", "warmer" }, { 13, &(HCold_resistance), "warm", "cooler" }, { 15, &(HShock_resistance), "insulated", "conductive" }, /* WAC -- made the above three attribs techs */ #endif { 17, &(HTeleport_control), "controlled","uncontrolled" }, { 0, 0, 0, 0 } }, nec_abil[] = { { 1, &(HDrain_resistance), "", "" }, { 1, &(HSick_resistance), "", "" }, { 3, &(HUndead_warning), "sensitive", "" }, { 0, 0, 0, 0 } }, pri_abil[] = { { 15, &(HWarning), "sensitive", "" }, { 20, &(HFire_resistance), "cool", "warmer" }, { 0, 0, 0, 0 } }, ran_abil[] = { { 1, &(HSearching), "", "" }, { 7, &(HStealth), "stealthy", "" }, { 15, &(HSee_invisible), "", "" }, { 0, 0, 0, 0 } }, rog_abil[] = { { 1, &(HStealth), "", "" }, { 10, &(HSearching), "perceptive", "" }, { 0, 0, 0, 0 } }, sam_abil[] = { { 1, &(HFast), "", "" }, { 15, &(HStealth), "stealthy", "" }, { 0, 0, 0, 0 } }, tou_abil[] = { { 10, &(HSearching), "perceptive", "" }, { 20, &(HPoison_resistance), "hardy", "" }, { 0, 0, 0, 0 } }, und_abil[] = { { 1, &(HStealth), "", "" }, { 1, &(HDrain_resistance), "", "" }, { 1, &(HSick_resistance), "", "" }, { 1, &(HUndead_warning), "", "" }, { 7, &(HFast), "quick", "slow" }, { 9, &(HPoison_resistance), "hardy", "less healthy" }, { 0, 0, 0, 0 } }, val_abil[] = { { 1, &(HCold_resistance), "", "" }, { 1, &(HStealth), "", "" }, { 7, &(HFast), "quick", "slow" }, { 0, 0, 0, 0 } }, #ifdef YEOMAN yeo_abil[] = { { 7, &(HFast), "quick", "slow" }, { 15, &(HSwimming), "ready to swim","afraid of the water" }, { 0, 0, 0, 0 } }, #endif wiz_abil[] = { { 15, &(HWarning), "sensitive", "" }, { 17, &(HTeleport_control), "controlled","uncontrolled" }, { 0, 0, 0, 0 } }, /* Intrinsics conferred by race */ dop_abil[] = {/* { 1, &(HPolymorph), "", "" },*/ { 9, &(HPolymorph_control), "your choices improve", "choiceless" }, { 0, 0, 0, 0 } }, #ifdef DWARF dwa_abil[] = { { 1, &(HSearching), "", "" }, /* { 10, &(HFire_resistance), "cool", "warmer" },*/ { 0, 0, 0, 0 } }, #endif elf_abil[] = { { 4, &(HSleep_resistance), "awake", "tired" }, { 0, 0, 0, 0 } }, gno_abil[] = { { 5, &(HStealth), "stealthy", "" }, /* { 9, &(HFast), "quick", "slow" }, { 11, &(HSearching), "perceptive", "unaware" },*/ { 0, 0, 0, 0 } }, hob_abil[] = { { 1, &(HStealth), "", "" }, { 7, &(HFast), "quick", "slow" }, { 0, 0, 0, 0 } }, lyc_abil[] = { /*{ 1, &(HPoison_resistance), "", "" },*/ { 1, &(HRegeneration), "", "" }, /* { 7, &(HStealth), "stealthy", "" },*/ { 0, 0, 0, 0 } }, orc_abil[] = { { 1, &(HPoison_resistance), "", "" }, { 0, 0, 0, 0 } }; static long next_check = 600L; /* arbitrary first setting */ STATIC_DCL void NDECL(exerper); STATIC_DCL void FDECL(postadjabil, (long *)); /* adjust an attribute; return TRUE if change is made, FALSE otherwise */ boolean adjattrib(ndx, incr, msgflg) int ndx, incr; int msgflg; /* 2 => no message at all, 1 => no message */ /* except encumber, zero => message, and */ { /* negative => conditional (msg if change made) */ if (Fixed_abil || !incr) return FALSE; if ((ndx == A_INT || ndx == A_WIS) && uarmh && uarmh->otyp == DUNCE_CAP) { if (msgflg == 0) Your("cap constricts briefly, then relaxes again."); return FALSE; } if (incr > 0) { if ((AMAX(ndx) >= ATTRMAX(ndx)) && (ACURR(ndx) >= AMAX(ndx))) { if (msgflg == 0 && flags.verbose) pline("You're already as %s as you can get.", plusattr[ndx]); ABASE(ndx) = AMAX(ndx) = ATTRMAX(ndx); /* just in case */ return FALSE; } ABASE(ndx) += incr; if(ABASE(ndx) > AMAX(ndx)) { incr = ABASE(ndx) - AMAX(ndx); AMAX(ndx) += incr; if(AMAX(ndx) > ATTRMAX(ndx)) AMAX(ndx) = ATTRMAX(ndx); ABASE(ndx) = AMAX(ndx); } } else { if (ABASE(ndx) <= ATTRMIN(ndx)) { if (msgflg == 0 && flags.verbose) pline("You're already as %s as you can get.", minusattr[ndx]); ABASE(ndx) = ATTRMIN(ndx); /* just in case */ return FALSE; } ABASE(ndx) += incr; if(ABASE(ndx) < ATTRMIN(ndx)) { incr = ABASE(ndx) - ATTRMIN(ndx); ABASE(ndx) = ATTRMIN(ndx); AMAX(ndx) += incr; if(AMAX(ndx) < ATTRMIN(ndx)) AMAX(ndx) = ATTRMIN(ndx); } } if (msgflg <= 0) You_feel("%s%s!", (incr > 1 || incr < -1) ? "very ": "", (incr > 0) ? plusattr[ndx] : minusattr[ndx]); flags.botl = 1; if (msgflg <= 1 && moves > 1 && (ndx == A_STR || ndx == A_CON)) (void)encumber_msg(); return TRUE; } void gainstr(otmp, incr) register struct obj *otmp; register int incr; { int num = 1; if(incr) num = incr; else { if(ABASE(A_STR) < 18) num = (rn2(4) ? 1 : rnd(6) ); else if (ABASE(A_STR) < STR18(85)) num = rnd(10); } (void) adjattrib(A_STR, (otmp && otmp->cursed) ? -num : num, TRUE); } void losestr(num) /* may kill you; cause may be poison or monster like 'a' */ register int num; { int ustr = ABASE(A_STR) - num; while(ustr < 3) { ++ustr; --num; if (Upolyd) { u.mh -= 6; u.mhmax -= 6; } else { u.uhp -= 6; u.uhpmax -= 6; } } (void) adjattrib(A_STR, -num, TRUE); } void change_luck(n) register schar n; { u.uluck += n; if (u.uluck < 0 && u.uluck < LUCKMIN) u.uluck = LUCKMIN; if (u.uluck > 0 && u.uluck > LUCKMAX) u.uluck = LUCKMAX; } int stone_luck(parameter) boolean parameter; /* So I can't think up of a good name. So sue me. --KAA */ { register struct obj *otmp; register long bonchance = 0; for (otmp = invent; otmp; otmp = otmp->nobj) if (confers_luck(otmp)) { if (otmp->cursed) bonchance -= otmp->quan; else if (otmp->blessed) bonchance += otmp->quan; else if (parameter) bonchance += otmp->quan; } /* STEPHEN WHITE'S NEW CODE */ if (uarmh && uarmh->otyp == FEDORA && !uarmh->cursed) bonchance += 2; return sgn((int)bonchance); } /* there has just been an inventory change affecting a luck-granting item */ void set_moreluck() { int luckbon = stone_luck(TRUE); if (!luckbon && !carrying(LUCKSTONE)) u.moreluck = 0; else if (luckbon >= 0) u.moreluck = LUCKADD; else u.moreluck = -LUCKADD; } /* KMH, balance patch -- new function for healthstones */ void recalc_health() { register struct obj *otmp; u.uhealbonus = 0; for(otmp = invent; otmp; otmp=otmp->nobj) if (otmp->otyp == HEALTHSTONE) u.uhealbonus += otmp->quan * (otmp->blessed ? 2 : otmp->cursed ? -2 : 1); return; } #endif /* OVLB */ #ifdef OVL1 void restore_attrib() { int i; for(i = 0; i < A_MAX; i++) { /* all temporary losses/gains */ if(ATEMP(i) && ATIME(i)) { if(!(--(ATIME(i)))) { /* countdown for change */ ATEMP(i) += ATEMP(i) > 0 ? -1 : 1; if(ATEMP(i)) /* reset timer */ ATIME(i) = 100 / ACURR(A_CON); } } } (void)encumber_msg(); } #endif /* OVL1 */ #ifdef OVLB #define AVAL 50 /* tune value for exercise gains */ void exercise(i, inc_or_dec) int i; boolean inc_or_dec; { #ifdef DEBUG pline("Exercise:"); #endif if (i == A_INT || i == A_CHA) return; /* can't exercise these */ /* no physical exercise while polymorphed; the body's temporary */ if (Upolyd && i != A_WIS) return; if(abs(AEXE(i)) < AVAL) { /* * Law of diminishing returns (Part I): * * Gain is harder at higher attribute values. * 79% at "3" --> 0% at "18" * Loss is even at all levels (50%). * * Note: *YES* ACURR is the right one to use. */ AEXE(i) += (inc_or_dec) ? (rn2(19) > ACURR(i)) : -rn2(2); #ifdef DEBUG pline("%s, %s AEXE = %d", (i == A_STR) ? "Str" : (i == A_WIS) ? "Wis" : (i == A_DEX) ? "Dex" : "Con", (inc_or_dec) ? "inc" : "dec", AEXE(i)); #endif } if (moves > 0 && (i == A_STR || i == A_CON)) (void)encumber_msg(); } /* hunger values - from eat.c */ #define SATIATED 0 #define NOT_HUNGRY 1 #define HUNGRY 2 #define WEAK 3 #define FAINTING 4 #define FAINTED 5 #define STARVED 6 STATIC_OVL void exerper() { if(!(moves % 10)) { /* Hunger Checks */ int hs = (u.uhunger > 1000) ? SATIATED : (u.uhunger > 150) ? NOT_HUNGRY : (u.uhunger > 50) ? HUNGRY : (u.uhunger > 0) ? WEAK : FAINTING; #ifdef DEBUG pline("exerper: Hunger checks"); #endif switch (hs) { case SATIATED: exercise(A_DEX, FALSE); if (Role_if(PM_MONK)) exercise(A_WIS, FALSE); break; case NOT_HUNGRY: exercise(A_CON, TRUE); break; case WEAK: exercise(A_STR, FALSE); if (Role_if(PM_MONK)) /* fasting */ exercise(A_WIS, TRUE); break; case FAINTING: case FAINTED: exercise(A_CON, FALSE); break; } /* Encumberance Checks */ #ifdef DEBUG pline("exerper: Encumber checks"); #endif switch (near_capacity()) { case MOD_ENCUMBER: exercise(A_STR, TRUE); break; case HVY_ENCUMBER: exercise(A_STR, TRUE); exercise(A_DEX, FALSE); break; case EXT_ENCUMBER: exercise(A_DEX, FALSE); exercise(A_CON, FALSE); break; } } /* status checks */ if(!(moves % 5)) { #ifdef DEBUG pline("exerper: Status checks"); #endif /* KMH, intrinsic patch */ if ((HClairvoyant & (INTRINSIC|TIMEOUT)) && !BClairvoyant) exercise(A_WIS, TRUE); if (HRegeneration) exercise(A_STR, TRUE); 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); } } void exerchk() { int i, mod_val; /* Check out the periodic accumulations */ exerper(); #ifdef DEBUG if(moves >= next_check) pline("exerchk: ready to test. multi = %d.", multi); #endif /* Are we ready for a test? */ if(moves >= next_check && !multi) { #ifdef DEBUG pline("exerchk: testing."); #endif /* * Law of diminishing returns (Part II): * * The effects of "exercise" and "abuse" wear * off over time. Even if you *don't* get an * increase/decrease, you lose some of the * accumulated effects. * * Note that if you are polymorphed then the * effects of any physical exercise done in your * own body will just wear off with no checking * until you return to your natural form. */ for(i = 0; i < A_MAX; AEXE(i++) /= 2) { if(Upolyd && i != A_WIS) continue; if(ABASE(i) >= 18 || !AEXE(i)) continue; if(i == A_INT || i == A_CHA) continue;/* can't exercise these */ #ifdef DEBUG pline("exerchk: testing %s (%d).", (i == A_STR) ? "Str" : (i == A_WIS) ? "Wis" : (i == A_DEX) ? "Dex" : "Con", AEXE(i)); #endif /* * Law of diminishing returns (Part III): * * You don't *always* gain by exercising. * [MRS 92/10/28 - Treat Wisdom specially for balance.] */ if(rn2(AVAL) > ((i != A_WIS) ? abs(AEXE(i)*2/3) : abs(AEXE(i)))) continue; mod_val = sgn(AEXE(i)); #ifdef DEBUG pline("exerchk: changing %d.", i); #endif if(adjattrib(i, mod_val, -1)) { #ifdef DEBUG pline("exerchk: changed %d.", i); #endif /* if you actually changed an attrib - zero accumulation */ AEXE(i) = 0; /* then print an explanation */ switch(i) { case A_STR: You((mod_val >0) ? "must have been exercising." : "must have been abusing your body."); break; case A_WIS: You((mod_val >0) ? "must have been very observant." : "haven't been paying attention."); break; case A_DEX: You((mod_val >0) ? "must have been working on your reflexes." : "haven't been working on reflexes lately."); break; case A_CON: You((mod_val >0) ? "must be leading a healthy life-style." : "haven't been watching your health."); break; } } } next_check += rn1(2000,2000); #ifdef DEBUG pline("exerchk: next check at %ld.", next_check); #endif } } /* next_check will otherwise have its initial 600L after a game restore */ void reset_attribute_clock() { if (moves > 600L) next_check = moves + rn1(50,800); } void init_attr(np) register int np; { register int i, x, tryct; for(i = 0; i < A_MAX; i++) { ABASE(i) = AMAX(i) = urole.attrbase[i]; ATEMP(i) = ATIME(i) = 0; np -= urole.attrbase[i]; } tryct = 0; while(np > 0 && tryct < 100) { x = rn2(100); for (i = 0; (i < A_MAX) && ((x -= urole.attrdist[i]) > 0); i++) ; if(i >= A_MAX) continue; /* impossible */ if(ABASE(i) >= ATTRMAX(i)) { tryct++; continue; } tryct = 0; ABASE(i)++; AMAX(i)++; np--; } tryct = 0; while(np < 0 && tryct < 100) { /* for redistribution */ x = rn2(100); for (i = 0; (i < A_MAX) && ((x -= urole.attrdist[i]) > 0); i++) ; if(i >= A_MAX) continue; /* impossible */ if(ABASE(i) <= ATTRMIN(i)) { tryct++; continue; } tryct = 0; ABASE(i)--; AMAX(i)--; np++; } } void redist_attr() { register int i, tmp; for(i = 0; i < A_MAX; i++) { if (i==A_INT || i==A_WIS) continue; /* Polymorphing doesn't change your mind */ tmp = AMAX(i); AMAX(i) += (rn2(5)-2); if (AMAX(i) > ATTRMAX(i)) AMAX(i) = ATTRMAX(i); if (AMAX(i) < ATTRMIN(i)) AMAX(i) = ATTRMIN(i); ABASE(i) = ABASE(i) * AMAX(i) / tmp; /* ABASE(i) > ATTRMAX(i) is impossible */ if (ABASE(i) < ATTRMIN(i)) ABASE(i) = ATTRMIN(i); } (void)encumber_msg(); } STATIC_OVL void postadjabil(ability) long *ability; { if (!ability) return; if (ability == &(HWarning) || ability == &(HSee_invisible)) see_monsters(); } void adjabil(oldlevel,newlevel) int oldlevel, newlevel; { register const struct innate *abil, *rabil; long mask = FROMEXPER; switch (Role_switch) { case PM_ARCHEOLOGIST: abil = arc_abil; break; case PM_BARBARIAN: abil = bar_abil; break; case PM_CAVEMAN: abil = cav_abil; break; case PM_FLAME_MAGE: abil = fla_abil; break; case PM_HEALER: abil = hea_abil; break; case PM_ICE_MAGE: abil = ice_abil; break; case PM_KNIGHT: abil = kni_abil; break; case PM_MONK: abil = mon_abil; break; case PM_NECROMANCER: abil = nec_abil; break; case PM_PRIEST: abil = pri_abil; break; case PM_RANGER: abil = ran_abil; break; case PM_ROGUE: abil = rog_abil; break; case PM_SAMURAI: abil = sam_abil; break; #ifdef TOURIST case PM_TOURIST: abil = tou_abil; break; #endif case PM_UNDEAD_SLAYER: abil = und_abil; break; case PM_VALKYRIE: abil = val_abil; break; case PM_WIZARD: abil = wiz_abil; break; #ifdef YEOMAN case PM_YEOMAN: abil = yeo_abil; break; #endif default: abil = 0; break; } switch (Race_switch) { case PM_DOPPELGANGER: rabil = dop_abil; break; #ifdef DWARF case PM_DWARF: rabil = dwa_abil; break; #endif case PM_DROW: case PM_ELF: rabil = elf_abil; break; case PM_GNOME: rabil = gno_abil; break; case PM_HOBBIT: rabil = hob_abil; break; case PM_ORC: rabil = orc_abil; break; case PM_HUMAN_WEREWOLF: rabil = lyc_abil; break; case PM_HUMAN: case PM_VAMPIRE: default: rabil = 0; break; } while (abil || rabil) { long prevabil; /* Have we finished with the intrinsics list? */ if (!abil || !abil->ability) { /* Try the race intrinsics */ if (!rabil || !rabil->ability) break; abil = rabil; rabil = 0; mask = FROMRACE; } prevabil = *(abil->ability); if(oldlevel < abil->ulevel && newlevel >= abil->ulevel) { /* Abilities gained at level 1 can never be lost * via level loss, only via means that remove _any_ * sort of ability. A "gain" of such an ability from * an outside source is devoid of meaning, so we set * FROMOUTSIDE to avoid such gains. */ if (abil->ulevel == 1) *(abil->ability) |= (mask|FROMOUTSIDE); else *(abil->ability) |= mask; if(!(*(abil->ability) & INTRINSIC & ~mask)) { if(*(abil->gainstr)) You_feel("%s!", abil->gainstr); } } else if (oldlevel >= abil->ulevel && newlevel < abil->ulevel) { *(abil->ability) &= ~mask; if(!(*(abil->ability) & INTRINSIC)) { if(*(abil->losestr)) You_feel("%s!", abil->losestr); else if(*(abil->gainstr)) You_feel("less %s!", abil->gainstr); } } if (prevabil != *(abil->ability)) /* it changed */ postadjabil(abil->ability); abil++; } if (oldlevel > 0) { if (newlevel > oldlevel) add_weapon_skill(newlevel - oldlevel); else lose_weapon_skill(oldlevel - newlevel); } /* ALI -- update Warn_of_mon */ HWarn_of_mon = HUndead_warning; if (HUndead_warning) flags.warntype |= M2_UNDEAD; else flags.warntype &= ~M2_UNDEAD; /* WAC -- adjust techniques */ adjtech(oldlevel, newlevel); } /* STEPHEN WHITE'S NEW CODE */ int newhp() { int hp, conplus; if(u.ulevel == 0) { /* Initialize hit points */ hp = urole.hpadv.infix + urace.hpadv.infix; if (urole.hpadv.inrnd > 0) hp += rnd(urole.hpadv.inrnd); if (urace.hpadv.inrnd > 0) hp += rnd(urace.hpadv.inrnd); /* Initialize alignment stuff */ u.ualign.type = aligns[flags.initalign].value; u.ualign.record = urole.initrecord; return hp; } else { if (u.ulevel < urole.xlev) { hp = urole.hpadv.lofix + urace.hpadv.lofix; if (urole.hpadv.lornd > 0) hp += rnd(urole.hpadv.lornd); if (urace.hpadv.lornd > 0) hp += rnd(urace.hpadv.lornd); } else { hp = urole.hpadv.hifix + urace.hpadv.hifix; if (urole.hpadv.hirnd > 0) hp += rnd(urole.hpadv.hirnd); if (urace.hpadv.hirnd > 0) hp += rnd(urace.hpadv.hirnd); } } if (ACURR(A_CON) <= 3) conplus = -2; else if (ACURR(A_CON) <= 6) conplus = -1; else if (ACURR(A_CON) <= 14) conplus = 0; else if (ACURR(A_CON) <= 16) conplus = 1; else if (ACURR(A_CON) == 17) conplus = 2; else if (ACURR(A_CON) == 18) conplus = 3; else conplus = 4; hp += conplus; return((hp <= 0) ? 1 : hp); } #endif /* OVLB */ #ifdef OVL0 /* STEPHEN WHITE'S NEW CODE */ schar acurr(x) int x; { register int tmp = (u.abon.a[x] + u.atemp.a[x] + u.acurr.a[x]); if (x == A_STR) { /* WAC twiddle so that wearing rings and gauntlets have a bonus */ /* robe of weakness and gauntlets of power will cancel */ int base = u.acurr.a[x]; int bonus = tmp - base; boolean nobonus = (uarmg && uarmg->otyp == GAUNTLETS_OF_POWER && uarm && uarm->otyp == ROBE_OF_WEAKNESS); if (uarmg && uarmg->otyp == GAUNTLETS_OF_POWER && !nobonus) { if ((uarmg->spe > 7) || ((118 + bonus + uarmg->spe) > 125) || ((tmp + uarmg->spe) > 125)) return(125); else if (base > 118) return (base + uarmg->spe + bonus); else return(118 + uarmg->spe + bonus); } else if (uarm && uarm->otyp == ROBE_OF_WEAKNESS && !nobonus) return(3 + bonus); else return((tmp >= 125) ? 125 : (tmp <= 3) ? 3 : tmp); } else if (x == A_CHA) { if (tmp < 18 && (youmonst.data->mlet == S_NYMPH || u.umonnum == PM_SUCCUBUS || u.umonnum == PM_INCUBUS)) tmp = 18; if (uarmh && uarmh->otyp == FEDORA) tmp += 1; return((tmp >= 25) ? 25 : (tmp <= 3) ? 3 : tmp); } else if (x == A_INT || x == A_WIS) { /* yes, this may raise int/wis if player is sufficiently * stupid. there are lower levels of cognition than "dunce". */ if (uarmh && uarmh->otyp == DUNCE_CAP) return(6); } #ifdef WIN32_BUG return(x=((tmp >= 25) ? 25 : (tmp <= 3) ? 3 : tmp)); #else return((schar)((tmp >= 25) ? 25 : (tmp <= 3) ? 3 : tmp)); #endif } /* condense clumsy ACURR(A_STR) value into value that fits into game formulas */ schar acurrstr() { register int str = ACURR(A_STR); if (str <= 18) return str; if (str <= 121) return (19 + str / 50); /* map to 19-21 */ else return str - 100; } #endif /* OVL0 */ #ifdef OVL2 /* avoid possible problems with alignment overflow, and provide a centralized * location for any future alignment limits */ void adjalign(n) register int n; { register int newalign = u.ualign.record + n; if (n < 0) { if (newalign < u.ualign.record) u.ualign.record = newalign; } else if (newalign > u.ualign.record) { u.ualign.record = newalign; if(u.ualign.record > ALIGNLIM) u.ualign.record = ALIGNLIM; } } #endif /* OVL2 */ /*attrib.c*/ slashem-0.0.7E7F3/src/shknam.c0000664000076400007640000006231010545462317014072 0ustar aliali/* SCCS Id: @(#)shknam.c 3.4 2003/01/09 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ /* shknam.c -- initialize a shop */ #include "hack.h" #include "eshk.h" #ifndef OVLB extern const struct shclass shtypes[]; #else STATIC_DCL void FDECL(mkshobj_at, (const struct shclass *,int,int)); STATIC_DCL void FDECL(nameshk, (struct monst *,const char * const *)); STATIC_DCL int FDECL(shkinit, (const struct shclass *,struct mkroom *)); #ifdef BLACKMARKET STATIC_DCL void FDECL(stock_blkmar, (const struct shclass *, struct mkroom *, int)); #endif /* BLACKMARKET */ #ifdef OTHER_SERVICES /* WAC init shk services */ static void FDECL(init_shk_services, (struct monst *)); #endif static const char * const shkliquors[] = { /* Ukraine */ "Njezjin", "Tsjernigof", "Ossipewsk", "Gorlowka", /* Belarus */ "Gomel", /* N. Russia */ "Konosja", "Weliki Oestjoeg", "Syktywkar", "Sablja", "Narodnaja", "Kyzyl", /* Silezie */ "Walbrzych", "Swidnica", "Klodzko", "Raciborz", "Gliwice", "Brzeg", "Krnov", "Hradec Kralove", /* Schweiz */ "Leuk", "Brig", "Brienz", "Thun", "Sarnen", "Burglen", "Elm", "Flims", "Vals", "Schuls", "Zum Loch", 0 }; static const char * const shkbooks[] = { /* Eire */ "Skibbereen", "Kanturk", "Rath Luirc", "Ennistymon", "Lahinch", "Kinnegad", "Lugnaquillia", "Enniscorthy", "Gweebarra", "Kittamagh", "Nenagh", "Sneem", "Ballingeary", "Kilgarvan", "Cahersiveen", "Glenbeigh", "Kilmihil", "Kiltamagh", "Droichead Atha", "Inniscrone", "Clonegal", "Lisnaskea", "Culdaff", "Dunfanaghy", "Inishbofin", "Kesh", 0 }; static const char * const shkarmors[] = { /* Turquie */ "Demirci", "Kalecik", "Boyabai", "Yildizeli", "Gaziantep", "Siirt", "Akhalataki", "Tirebolu", "Aksaray", "Ermenak", "Iskenderun", "Kadirli", "Siverek", "Pervari", "Malasgirt", "Bayburt", "Ayancik", "Zonguldak", "Balya", "Tefenni", "Artvin", "Kars", "Makharadze", "Malazgirt", "Midyat", "Birecik", "Kirikkale", "Alaca", "Polatli", "Nallihan", 0 }; static const char * const shkwands[] = { /* Wales */ "Yr Wyddgrug", "Trallwng", "Mallwyd", "Pontarfynach", "Rhaeader", "Llandrindod", "Llanfair-ym-muallt", "Y-Fenni", "Maesteg", "Rhydaman", "Beddgelert", "Curig", "Llanrwst", "Llanerchymedd", "Caergybi", /* Scotland */ "Nairn", "Turriff", "Inverurie", "Braemar", "Lochnagar", "Kerloch", "Beinn a Ghlo", "Drumnadrochit", "Morven", "Uist", "Storr", "Sgurr na Ciche", "Cannich", "Gairloch", "Kyleakin", "Dunvegan", 0 }; static const char * const shkrings[] = { /* Hollandse familienamen */ "Feyfer", "Flugi", "Gheel", "Havic", "Haynin", "Hoboken", "Imbyze", "Juyn", "Kinsky", "Massis", "Matray", "Moy", "Olycan", "Sadelin", "Svaving", "Tapper", "Terwen", "Wirix", "Ypey", /* Skandinaviske navne */ "Rastegaisa", "Varjag Njarga", "Kautekeino", "Abisko", "Enontekis", "Rovaniemi", "Avasaksa", "Haparanda", "Lulea", "Gellivare", "Oeloe", "Kajaani", "Fauske", 0 }; static const char * const shkfoods[] = { /* Indonesia */ "Djasinga", "Tjibarusa", "Tjiwidej", "Pengalengan", "Bandjar", "Parbalingga", "Bojolali", "Sarangan", "Ngebel", "Djombang", "Ardjawinangun", "Berbek", "Papar", "Baliga", "Tjisolok", "Siboga", "Banjoewangi", "Trenggalek", "Karangkobar", "Njalindoeng", "Pasawahan", "Pameunpeuk", "Patjitan", "Kediri", "Pemboeang", "Tringanoe", "Makin", "Tipor", "Semai", "Berhala", "Tegal", "Samoe", 0 }; static const char * const shkweapons[] = { /* Perigord */ "Voulgezac", "Rouffiac", "Lerignac", "Touverac", "Guizengeard", "Melac", "Neuvicq", "Vanzac", "Picq", "Urignac", "Corignac", "Fleac", "Lonzac", "Vergt", "Queyssac", "Liorac", "Echourgnac", "Cazelon", "Eypau", "Carignan", "Monbazillac", "Jonzac", "Pons", "Jumilhac", "Fenouilledes", "Laguiolet", "Saujon", "Eymoutiers", "Eygurande", "Eauze", "Labouheyre", 0 }; static const char * const shktools[] = { /* Spmi */ "Ymla", "Eed-morra", "Cubask", "Nieb", "Bnowr Falr", "Telloc Cyaj", "Sperc", "Noskcirdneh", "Yawolloh", "Hyeghu", "Niskal", "Trahnil", "Htargcm", "Enrobwem", "Kachzi Rellim", "Regien", "Donmyar", "Yelpur", "Nosnehpets", "Stewe", "Renrut", "_Zlaw", "Nosalnef", "Rewuorb", "Rellenk", "Yad", "Cire Htims", "Y-crad", "Nenilukah", "Corsh", "Aned", #ifdef OVERLAY "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", "Yao-hang", "Tonbar", "Nivek", "Kivenhoug", #endif #ifdef AMIGA "Falo", "Nosid-da\'r", "Ekim-p", "Rebrol-nek", "Noslo", "Yl-rednow", "Mured-oog", "Ivrajimsal", #endif #ifdef TOS "Nivram", #endif #ifdef VMS "Lez-tneg", "Ytnu-haled", "Niknar", #endif 0 }; static const char * const shklight[] = { /* Romania */ "Zarnesti", "Slanic", "Nehoiasu", "Ludus", "Sighisoara", "Nisipitu", "Razboieni", "Bicaz", "Dorohoi", "Vaslui", "Fetesti", "Tirgu Neamt", "Babadag", "Zimnicea", "Zlatna", "Jiu", "Eforie", "Mamaia", /* Bulgaria */ "Silistra", "Tulovo", "Panagyuritshte", "Smolyan", "Kirklareli", "Pernik", "Lom", "Haskovo", "Dobrinishte", "Varvara", "Oryahovo", "Troyan", "Lovech", "Sliven", 0 }; static const char * const shkgeneral[] = { /* Suriname */ "Hebiwerie", "Possogroenoe", "Asidonhopo", "Manlobbi", "Adjama", "Pakka Pakka", "Kabalebo", "Wonotobo", "Akalapi", "Sipaliwini", /* Greenland */ "Annootok", "Upernavik", "Angmagssalik", /* N. Canada */ "Aklavik", "Inuvik", "Tuktoyaktuk", "Chicoutimi", "Ouiatchouane", "Chibougamau", "Matagami", "Kipawa", "Kinojevis", "Abitibi", "Maganasipi", /* Iceland */ "Akureyri", "Kopasker", "Budereyri", "Akranes", "Bordeyri", "Holmavik", 0 }; #ifdef BLACKMARKET static const char *shkblack[] = { "One-eyed Sam", "One-eyed Sam", "One-eyed Sam", "One-eyed Sam", "One-eyed Sam", "One-eyed Sam", "One-eyed Sam", "One-eyed Sam", "One-eyed Sam", "One-eyed Sam", "One-eyed Sam", "One-eyed Sam", "One-eyed Sam", "One-eyed Sam", "One-eyed Sam", "One-eyed Sam", "One-eyed Sam", "One-eyed Sam", "One-eyed Sam", "One-eyed Sam", "One-eyed Sam", "One-eyed Sam", "One-eyed Sam", "One-eyed Sam", "One-eyed Sam", "One-eyed Sam", "One-eyed Sam", "One-eyed Sam", "One-eyed Sam", "One-eyed Sam", "One-eyed Sam", "One-eyed Sam", "One-eyed Sam", 0 }; #endif /* BLACKMARKET */ /* STEPHEN WHITE'S NEW CODE */ static const char *shkpet[] = { "Silistra", "Tulovo", "Panagyuritshte", "Smolyan", "Kirklareli", "Pernik", "Lom", "Haskovo", "Dobrinishte", "Varvara", "Oryahovo", "Troyan", "Lovech", "Sliven", 0 }; /* * To add new shop types, all that is necessary is to edit the shtypes[] array. * See mkroom.h for the structure definition. Typically, you'll have to lower * some or all of the probability fields in old entries to free up some * percentage for the new type. * * The placement type field is not yet used but will be in the near future. * * The iprobs array in each entry defines the probabilities for various kinds * of objects to be present in the given shop type. You can associate with * each percentage either a generic object type (represented by one of the * *_CLASS macros) or a specific object (represented by an onames.h define). * In the latter case, prepend it with a unary minus so the code can know * (by testing the sign) whether to use mkobj() or mksobj(). */ /* KMH -- Don't forget to update mkroom.h and lev_main.c when adding * a new shop type. */ const struct shclass shtypes[] = { {"general store", RANDOM_CLASS, 24, D_SHOP, {{100, RANDOM_CLASS}, {0, 0}, {0, 0}}, shkgeneral}, {"used armor dealership", ARMOR_CLASS, 20, D_SHOP, {{90, ARMOR_CLASS}, {10, WEAPON_CLASS}, {0, 0}}, shkarmors}, {"second-hand bookstore", SCROLL_CLASS, 4, D_SHOP, {{90, SCROLL_CLASS}, {10, SPBOOK_CLASS}, {0, 0}}, shkbooks}, {"liquor emporium", POTION_CLASS, 4, D_SHOP, {{100, POTION_CLASS}, {0, 0}, {0, 0}}, shkliquors}, #ifdef FIREARMS /* KMH -- no longer "antique" */ {"weapons outlet", WEAPON_CLASS, 20, D_SHOP, { {80, WEAPON_CLASS}, {6, -BULLET}, {3, -BULLET}, {1, -SILVER_BULLET}, #else {"antique weapons outlet", WEAPON_CLASS, 20, D_SHOP, { {90, WEAPON_CLASS}, #endif {10, ARMOR_CLASS}, {0, 0}}, shkweapons}, {"delicatessen", FOOD_CLASS, 4, D_SHOP, {{83, FOOD_CLASS}, {5, -POT_FRUIT_JUICE}, {4, -POT_BOOZE}, {5, -POT_WATER}, {3, -ICE_BOX}}, shkfoods}, {"jewelers", RING_CLASS, 4, D_SHOP, {{85, RING_CLASS}, {10, GEM_CLASS}, {5, AMULET_CLASS}, {0, 0}}, shkrings}, {"quality apparel and accessories", WAND_CLASS, 4, D_SHOP, {{90, WAND_CLASS}, {5, -LEATHER_GLOVES}, {5, -ELVEN_CLOAK}, {0, 0}}, shkwands}, {"hardware store", TOOL_CLASS, 4, D_SHOP, {{100, TOOL_CLASS}, {0, 0}}, shktools}, /* Actually shktools is ignored; the code specifically chooses a * random implementor name (along with candle shops having * random shopkeepers) */ /* STEPHEN WHITE'S NEW CODE */ {"pet store", FOOD_CLASS, 4, D_SHOP, { #ifdef STEED {67, -FIGURINE}, {5, -LEASH},{10, -TRIPE_RATION}, {5, -SADDLE}, #else {72, -FIGURINE}, {5, -LEASH},{10, -TRIPE_RATION}, #endif {10, -TIN_WHISTLE}, {3, -MAGIC_WHISTLE}}, shkpet}, /* Robin Johnson -- 4% taken from pet store */ {"frozen food store", FOOD_CLASS, 4, D_SHOP, {{90, -ICE_BOX}, {10, -TIN}, /* shopkeeper will pay for corpses, but they aren't generated */ /* on the shop floor */ {0, -CORPSE}, {0, 0}}, shkfoods}, {"rare books", SPBOOK_CLASS, 4, D_SHOP, {{90, SPBOOK_CLASS}, {10, SCROLL_CLASS}, {0, 0}}, shkbooks}, /* Shops below this point are "unique". That is they must all have a * probability of zero. They are only created via the special level * loader. */ {"lighting store", TOOL_CLASS, 0, D_SHOP, {{25, -WAX_CANDLE}, {35, -TALLOW_CANDLE}, {5, -TORCH}, {11, -BRASS_LANTERN}, {16, -OIL_LAMP}, {3, -MAGIC_LAMP}, {5, -MAGIC_CANDLE}}, shklight}, #ifdef BLACKMARKET {"black market", RANDOM_CLASS, 0, D_SHOP, {{100, RANDOM_CLASS}, {0, 0}, {0, 0}}, shkblack}, #endif /* BLACKMARKET */ {(char *)0, 0, 0, 0, {{0, 0}, {0, 0}, {0, 0}}, 0} }; #if 0 /* validate shop probabilities; otherwise incorrect local changes could end up provoking infinite loops or wild subscripts fetching garbage */ void init_shop_selection() { register int i, j, item_prob, shop_prob; for (shop_prob = 0, i = 0; i < SIZE(shtypes); i++) { shop_prob += shtypes[i].prob; for (item_prob = 0, j = 0; j < SIZE(shtypes[0].iprobs); j++) item_prob += shtypes[i].iprobs[j].iprob; if (item_prob != 100) panic("item probabilities total to %d for %s shops!", item_prob, shtypes[i].name); } if (shop_prob != 100) panic("shop probabilities total to %d!", shop_prob); } #endif /*0*/ STATIC_OVL void mkshobj_at(shp, sx, sy) /* make an object of the appropriate type for a shop square */ 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 */ STATIC_OVL void nameshk(shk, nlp) struct monst *shk; const char * const *nlp; { int i, trycnt, names_avail; const char *shname = 0; struct monst *mtmp; int name_wanted; s_level *sptr; if (nlp == shklight && In_mines(&u.uz) && (sptr = Is_special(&u.uz)) != 0 && sptr->flags.town) { /* special-case minetown lighting shk */ shname = "Izchak"; shk->female = FALSE; #ifdef BLACKMARKET } else if (nlp == shkblack) { /* special-case black marketeer */ shname = "One-eyed Sam"; shk->female = shk->data->mflags2 & M2_MALE ? FALSE : TRUE; #endif /* BLACKMARKET */ } else { /* We want variation from game to game, without needing the save and restore support which would be necessary for randomization; try not to make too many assumptions about time_t's internals; use ledger_no rather than depth to keep mine town distinct. */ int nseed = (int)((long)u.ubirthday / 257L); name_wanted = ledger_no(&u.uz) + (nseed % 13) - (nseed % 5); if (name_wanted < 0) name_wanted += (13 + 5); shk->female = name_wanted & 1; for (names_avail = 0; nlp[names_avail]; names_avail++) continue; for (trycnt = 0; trycnt < 50; trycnt++) { if (nlp == shktools) { shname = shktools[rn2(names_avail)]; shk->female = (*shname == '_'); if (shk->female) shname++; } else if (name_wanted < names_avail) { shname = nlp[name_wanted]; } else if ((i = rn2(names_avail)) != 0) { shname = nlp[i - 1]; } else if (nlp != shkgeneral) { nlp = shkgeneral; /* try general names */ for (names_avail = 0; nlp[names_avail]; names_avail++) continue; continue; /* next `trycnt' iteration */ } else { shname = shk->female ? "Lucrezia" : "Dirk"; } /* is name already in use on this level? */ for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) { if (DEADMONSTER(mtmp) || (mtmp == shk) || !mtmp->isshk) continue; if (strcmp(ESHK(mtmp)->shknam, shname)) continue; break; } if (!mtmp) break; /* new name */ } } (void) strncpy(ESHK(shk)->shknam, shname, PL_NSIZ); ESHK(shk)->shknam[PL_NSIZ-1] = 0; } STATIC_OVL int shkinit(shp, sroom) /* create a new shopkeeper in the given room */ const struct shclass *shp; struct mkroom *sroom; { register int sh, sx, sy; struct monst *shk; long shkmoney; /* Temporary placeholder for Shopkeeper's initial capital */ /* place the shopkeeper in the given room */ sh = sroom->fdoor; sx = doors[sh].x; sy = doors[sh].y; /* check that the shopkeeper placement is sane */ if(sroom->irregular) { int rmno = (sroom - rooms) + ROOMOFFSET; if (isok(sx-1,sy) && !levl[sx-1][sy].edge && (int) levl[sx-1][sy].roomno == rmno) sx--; else if (isok(sx+1,sy) && !levl[sx+1][sy].edge && (int) levl[sx+1][sy].roomno == rmno) sx++; else if (isok(sx,sy-1) && !levl[sx][sy-1].edge && (int) levl[sx][sy-1].roomno == rmno) sy--; else if (isok(sx,sy+1) && !levl[sx][sy+1].edge && (int) levl[sx][sy+1].roomno == rmno) sx++; else goto shk_failed; } else if(sx == sroom->lx-1) sx++; else if(sx == sroom->hx+1) sx--; else if(sy == sroom->ly-1) sy++; else if(sy == sroom->hy+1) sy--; else { shk_failed: #ifdef DEBUG # ifdef WIZARD /* Said to happen sometimes, but I have never seen it. */ /* Supposedly fixed by fdoor change in mklev.c */ if(wizard) { register int j = sroom->doorct; pline("Where is shopdoor?"); pline("Room at (%d,%d),(%d,%d).", sroom->lx, sroom->ly, sroom->hx, sroom->hy); pline("doormax=%d doorct=%d fdoor=%d", doorindex, sroom->doorct, sh); while(j--) { pline("door [%d,%d]", doors[sh].x, doors[sh].y); sh++; } display_nhwindow(WIN_MESSAGE, FALSE); } # endif #endif return(-1); } if(MON_AT(sx, sy)) (void) rloc(m_at(sx, sy), FALSE); /* insurance */ /* now initialize the shopkeeper monster structure */ #ifdef BLACKMARKET shk = 0; if (Is_blackmarket(&u.uz)) { shk = makemon(&mons[PM_BLACK_MARKETEER], sx, sy, NO_MM_FLAGS); } if (!shk) { if(!(shk = makemon(&mons[PM_SHOPKEEPER], sx, sy, NO_MM_FLAGS))) return(-1); } #else /* BLACKMARKET */ if(!(shk = makemon(&mons[PM_SHOPKEEPER], sx, sy, NO_MM_FLAGS))) return(-1); #endif /* BLACKMARKET */ shk->isshk = shk->mpeaceful = 1; set_malign(shk); shk->msleeping = 0; shk->mtrapseen = ~0; /* we know all the traps already */ ESHK(shk)->shoproom = (sroom - rooms) + ROOMOFFSET; sroom->resident = shk; ESHK(shk)->shoptype = sroom->rtype; assign_level(&(ESHK(shk)->shoplevel), &u.uz); ESHK(shk)->shd.x = doors[sh].x; ESHK(shk)->shd.y = doors[sh].y; ESHK(shk)->shk.x = sx; ESHK(shk)->shk.y = sy; ESHK(shk)->robbed = 0L; ESHK(shk)->credit = 0L; ESHK(shk)->debit = 0L; ESHK(shk)->loan = 0L; ESHK(shk)->visitct = 0; ESHK(shk)->following = 0; ESHK(shk)->billct = 0; #ifdef OTHER_SERVICES /* WAC init services */ init_shk_services(shk); #endif shkmoney = 1000L + 30L*(long)rnd(100); /* initial capital */ /* [CWC] Lets not create the money yet until we see if the shk is a black marketeer, else we'll have to create another money object, if GOLDOBJ is defined */ if (shp->shknms == shkrings) (void) mongets(shk, TOUCHSTONE); nameshk(shk, shp->shknms); #ifdef BLACKMARKET if (Is_blackmarket(&u.uz)) shkmoney = 7*shkmoney + rn2(3*shkmoney); #endif #ifndef GOLDOBJ shk->mgold = shkmoney; #else mkmonmoney(shk, shkmoney); #endif #ifdef BLACKMARKET if (Is_blackmarket(&u.uz)) { register struct obj *otmp; /* make sure black marketeer can wield Thiefbane */ shk->data->maligntyp = -1; /* black marketeer's equipment */ otmp = mksobj(LONG_SWORD, FALSE, FALSE); otmp = oname(otmp, artiname(ART_THIEFBANE)); mpickobj(shk, otmp); if (otmp->spe < 5) otmp->spe += rnd(5); otmp = mksobj(SHIELD_OF_REFLECTION, FALSE, FALSE); mpickobj(shk, otmp); if (otmp->spe < 5) otmp->spe += rnd(5); otmp = mksobj(GRAY_DRAGON_SCALE_MAIL, FALSE, FALSE); mpickobj(shk, otmp); if (otmp->spe < 5) otmp->spe += rnd(5); otmp = mksobj(SPEED_BOOTS, FALSE, FALSE); mpickobj(shk, otmp); if (otmp->spe < 5) otmp->spe += rnd(5); otmp = mksobj(AMULET_OF_LIFE_SAVING, FALSE, FALSE); mpickobj(shk, otmp); /* wear armor and amulet */ m_dowear(shk, TRUE); otmp = mksobj(SKELETON_KEY, FALSE, FALSE); mpickobj(shk, otmp); } #endif /* BLACKMARKET */ return(sh); } /* stock a newly-created room with objects */ void stock_room(shp_indx, sroom) int shp_indx; register struct mkroom *sroom; { /* * Someday soon we'll dispatch on the shdist field of shclass to do * different placements in this routine. Currently it only supports * shop-style placement (all squares except a row nearest the first * door get objects). */ register int sx, sy, sh; char buf[BUFSZ]; int rmno = (sroom - rooms) + ROOMOFFSET; const struct shclass *shp = &shtypes[shp_indx]; /* first, try to place a shopkeeper in the room */ if ((sh = shkinit(shp, sroom)) < 0) return; /* make sure no doorways without doors, and no */ /* trapped doors, in shops. */ sx = doors[sroom->fdoor].x; sy = doors[sroom->fdoor].y; if(levl[sx][sy].doormask == D_NODOOR) { levl[sx][sy].doormask = D_ISOPEN; newsym(sx,sy); } if(levl[sx][sy].typ == SDOOR) { cvt_sdoor_to_door(&levl[sx][sy]); /* .typ = DOOR */ newsym(sx,sy); } if(levl[sx][sy].doormask & D_TRAPPED) levl[sx][sy].doormask = D_LOCKED; if(levl[sx][sy].doormask == D_LOCKED) { register int m = sx, n = sy; if(inside_shop(sx+1,sy)) m--; else if(inside_shop(sx-1,sy)) m++; if(inside_shop(sx,sy+1)) n--; else if(inside_shop(sx,sy-1)) n++; Sprintf(buf, "Closed for inventory"); make_engr_at(m, n, buf, 0L, DUST); } #ifdef BLACKMARKET if (Is_blackmarket(&u.uz)) { stock_blkmar(shp, sroom, sh); level.flags.has_shop = TRUE; return; } #endif /* BLACKMARKET */ for(sx = sroom->lx; sx <= sroom->hx; sx++) for(sy = sroom->ly; sy <= sroom->hy; sy++) { if(sroom->irregular) { if (levl[sx][sy].edge || (int) levl[sx][sy].roomno != rmno || distmin(sx, sy, doors[sh].x, doors[sh].y) <= 1) continue; } else if((sx == sroom->lx && doors[sh].x == sx-1) || (sx == sroom->hx && doors[sh].x == sx+1) || (sy == sroom->ly && doors[sh].y == sy-1) || (sy == sroom->hy && doors[sh].y == sy+1)) continue; mkshobj_at(shp, sx, sy); } /* * Special monster placements (if any) should go here: that way, * monsters will sit on top of objects and not the other way around. */ level.flags.has_shop = TRUE; } #ifdef BLACKMARKET /* stock a newly-created black market with objects */ static void stock_blkmar(shp, sroom, sh) const struct shclass *shp; register struct mkroom *sroom; register int sh; { /* * Someday soon we'll dispatch on the shdist field of shclass to do * different placements in this routine. Currently it only supports * shop-style placement (all squares except a row nearest the first * door get objects). */ /* [max] removed register int cl, char buf[bufsz] */ int i, sx, sy, first = 0, next = 0, total, partial, typ; struct obj *otmp; int blkmar_gen[NUM_OBJECTS+2]; int *clp, *lastclp; int goodcl[12]; goodcl[ 0] = WEAPON_CLASS; goodcl[ 1] = ARMOR_CLASS; goodcl[ 2] = RING_CLASS; goodcl[ 3] = AMULET_CLASS; goodcl[ 4] = TOOL_CLASS; goodcl[ 5] = FOOD_CLASS; goodcl[ 6] = POTION_CLASS; goodcl[ 7] = SCROLL_CLASS; goodcl[ 8] = SPBOOK_CLASS; goodcl[ 9] = WAND_CLASS; goodcl[10] = GEM_CLASS; goodcl[11] = 0; for (i=0; i < NUM_OBJECTS; i++) { blkmar_gen[i] = 0; } total = 0; for (clp=goodcl; *clp!=0; clp++) { lastclp = clp; first = bases[*clp]; /* this assumes that luckstone & loadstone comes just after the gems */ next = (*clp==GEM_CLASS) ? (LOADSTONE+1) : bases[(*clp)+1]; total += next-first; } if (total==0) return; if (sroom->hx-sroom->lx<2) return; clp = goodcl-1; partial = 0; for(sx = sroom->lx+1; sx <= sroom->hx; sx++) { if (sx==sroom->lx+1 || ((sx-sroom->lx-2)*total)/(sroom->hx-sroom->lx-1)>partial) { clp++; if (clp>lastclp) clp = lastclp; first = bases[*clp]; next = (*clp==GEM_CLASS) ? (LOADSTONE+1) : bases[(*clp)+1]; partial += next-first; } for(sy = sroom->ly; sy <= sroom->hy; sy++) { if((sx == sroom->lx && doors[sh].x == sx-1) || (sx == sroom->hx && doors[sh].x == sx+1) || (sy == sroom->ly && doors[sh].y == sy-1) || (sy == sroom->hy && doors[sh].y == sy+1) || (rn2(3))) continue; for (i=0; i<50; i++) { typ = rn2(next-first) + first; /* forbidden objects */ if (typ==AMULET_OF_YENDOR || typ==CANDELABRUM_OF_INVOCATION || typ==BELL_OF_OPENING || typ==SPE_BOOK_OF_THE_DEAD || objects[typ].oc_nowish || typ==0) continue; otmp = mkobj_at(RANDOM_CLASS,sx,sy,TRUE); /* generate multiple copies with decreasing probabilities */ /* if (rn2(blkmar_gen[typ]+1) && i<49) continue; */ /* otmp = mksobj_at(typ, sx, sy, TRUE, TRUE); blkmar_gen[typ]++;*/ /* prevent wishing abuse */ if (typ==WAN_WISHING) { otmp->spe = 0; otmp->recharged = 1; } if (typ==MAGIC_LAMP) { otmp->spe = 0; } break; } } } /* * Special monster placements (if any) should go here: that way, * monsters will sit on top of objects and not the other way around. */ } #endif /* BLACKMARKET */ #ifdef OTHER_SERVICES static void init_shk_services(shk) struct monst *shk; { ESHK(shk)->services = 0L; /* KMH, balance patch 2 -- Increase probability of shopkeeper services. * Requested by Dave */ #ifdef BLACKMARKET if (Is_blackmarket(&u.uz)) { ESHK(shk)->services = SHK_ID_BASIC|SHK_ID_PREMIUM|SHK_UNCURSE|SHK_APPRAISE| SHK_SPECIAL_A|SHK_SPECIAL_B|SHK_SPECIAL_C; return; } #endif /* Guarantee some form of identification * 1/3 both Basic and Premium ID * 2/15 Premium ID only * 8/15 Basic ID only */ if (!rn2(2)) ESHK(shk)->services |= (SHK_ID_BASIC|SHK_ID_PREMIUM); else if (!rn2(4)) ESHK(shk)->services |= SHK_ID_PREMIUM; else ESHK(shk)->services |= SHK_ID_BASIC; if (!rn2(3)) ESHK(shk)->services |= SHK_UNCURSE; if (!rn2(3) && shk_class_match(WEAPON_CLASS, shk)) ESHK(shk)->services |= SHK_APPRAISE; if ((shk_class_match(WEAPON_CLASS, shk) == SHK_MATCH) || (shk_class_match(ARMOR_CLASS, shk) == SHK_MATCH) || (shk_class_match(WAND_CLASS, shk) == SHK_MATCH) || (shk_class_match(TOOL_CLASS, shk) == SHK_MATCH) || (shk_class_match(SPBOOK_CLASS, shk) == SHK_MATCH) || (shk_class_match(RING_CLASS, shk) == SHK_MATCH)) { if (!rn2(4/*5*/)) ESHK(shk)->services |= SHK_SPECIAL_A; if (!rn2(4/*5*/)) ESHK(shk)->services |= SHK_SPECIAL_B; } if (!rn2(4/*5*/) && (shk_class_match(WEAPON_CLASS, shk) == SHK_MATCH)) ESHK(shk)->services |= SHK_SPECIAL_C; return; } #endif #endif /* OVLB */ #ifdef OVL0 /* does shkp's shop stock this item type? */ boolean saleable(shkp, obj) struct monst *shkp; struct obj *obj; { int i, shp_indx = ESHK(shkp)->shoptype - SHOPBASE; const struct shclass *shp = &shtypes[shp_indx]; if (shp->symb == RANDOM_CLASS) return TRUE; else for (i = 0; i < SIZE(shtypes[0].iprobs) && shp->iprobs[i].iprob; i++) if (shp->iprobs[i].itype < 0 ? shp->iprobs[i].itype == - obj->otyp : shp->iprobs[i].itype == obj->oclass) return TRUE; /* not found */ return FALSE; } /* positive value: class; negative value: specific object type */ int get_shop_item(type) int type; { const struct shclass *shp = shtypes+type; register int i,j; /* select an appropriate object type at random */ for(j = rnd(100), i = 0; (j -= shp->iprobs[i].iprob) > 0; i++) continue; return shp->iprobs[i].itype; } #endif /* OVL0 */ /*shknam.c*/ slashem-0.0.7E7F3/src/u_init.c0000664000076400007640000016135410545462317014110 0ustar aliali/* SCCS Id: @(#)u_init.c 3.4 2002/10/22 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" struct trobj { short trotyp; schar trspe; char trclass; Bitfield(trquan,6); 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' #define UNDEF_BLESS 2 /* * Initial inventory for the various roles. */ static struct trobj Archeologist[] = { #define A_BOOK 4 /* if adventure has a name... idea from tan@uvm-gen */ { BULLWHIP, 2, WEAPON_CLASS, 1, UNDEF_BLESS }, { LEATHER_JACKET, 0, ARMOR_CLASS, 1, UNDEF_BLESS }, { FEDORA, 0, ARMOR_CLASS, 1, UNDEF_BLESS }, { FOOD_RATION, 0, FOOD_CLASS, 3, 0 }, { UNDEF_TYP, UNDEF_SPE, SPBOOK_CLASS, 1, 1 }, { UNDEF_TYP, UNDEF_SPE, SCROLL_CLASS, 2, UNDEF_BLESS }, { 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 } }; static struct trobj Barbarian[] = { #define B_MAJOR 0 /* two-handed sword or battle-axe */ #define B_MINOR 1 /* matched with axe or short sword */ { TWO_HANDED_SWORD, 0, WEAPON_CLASS, 1, UNDEF_BLESS }, { AXE, 0, WEAPON_CLASS, 1, UNDEF_BLESS }, { RING_MAIL, 0, ARMOR_CLASS, 1, UNDEF_BLESS }, { FOOD_RATION, 0, FOOD_CLASS, 2, 0 }, { 0, 0, 0, 0, 0 } }; static struct trobj Cave_man[] = { #define C_AMMO 2 { CLUB, 1, WEAPON_CLASS, 1, UNDEF_BLESS }, { SLING, 2, WEAPON_CLASS, 1, UNDEF_BLESS }, { FLINT, 0, GEM_CLASS, 15, UNDEF_BLESS }, /* quan is variable */ { ROCK, 0, GEM_CLASS, 3, 0 }, /* yields 18..33 */ { LEATHER_ARMOR, 0, ARMOR_CLASS, 1, UNDEF_BLESS }, { 0, 0, 0, 0, 0 } }; static struct trobj Flame_Mage[] = { #define F_BOOK 9 { QUARTERSTAFF, 1, WEAPON_CLASS, 1, 1 }, /* for dealing with ghosts */ { STUDDED_LEATHER_ARMOR, 0, ARMOR_CLASS, 1, UNDEF_BLESS }, { FOOD_RATION, 0, FOOD_CLASS, 2, 0 }, { UNDEF_TYP, UNDEF_SPE, POTION_CLASS, 1, UNDEF_BLESS }, { UNDEF_TYP, UNDEF_SPE, SCROLL_CLASS, 1, UNDEF_BLESS }, { WAN_FIRE, UNDEF_SPE, WAND_CLASS, 1, UNDEF_BLESS }, { UNDEF_TYP, UNDEF_SPE, RING_CLASS, 1, UNDEF_BLESS }, { SPE_FLAME_SPHERE, UNDEF_SPE, SPBOOK_CLASS, 1, 1 }, { SPE_FIREBALL, UNDEF_SPE, SPBOOK_CLASS, 1, 1 }, { UNDEF_TYP, UNDEF_SPE, SPBOOK_CLASS, 1, 1 }, { 0, 0, 0, 0, 0 } }; static struct trobj Healer[] = { { SCALPEL, 1, WEAPON_CLASS, 1, UNDEF_BLESS }, { LEATHER_GLOVES, 1, ARMOR_CLASS, 1, UNDEF_BLESS }, { STETHOSCOPE, 0, TOOL_CLASS, 1, 0 }, { MEDICAL_KIT, 0, TOOL_CLASS, 1, 0 }, { POT_HEALING, 0, POTION_CLASS, 4, UNDEF_BLESS }, { POT_EXTRA_HEALING, 0, POTION_CLASS, 4, UNDEF_BLESS }, { WAN_SLEEP, UNDEF_SPE, WAND_CLASS, 1, UNDEF_BLESS }, /* [Tom] they might as well have a wand of healing, too */ { WAN_HEALING, UNDEF_SPE, WAND_CLASS, 1, UNDEF_BLESS }, /* always blessed, so it's guaranteed readable */ { SPE_HEALING, UNDEF_SPE, SPBOOK_CLASS, 1, 1 }, { SPE_STONE_TO_FLESH, UNDEF_SPE, SPBOOK_CLASS, 1, 1 }, { APPLE, 0, FOOD_CLASS, 10, 0 }, { 0, 0, 0, 0, 0 } }; static struct trobj Ice_Mage[] = { #define I_BOOK 9 { QUARTERSTAFF, 1, WEAPON_CLASS, 1, 1 }, /* for dealing with ghosts */ { STUDDED_LEATHER_ARMOR, 0, ARMOR_CLASS, 1, UNDEF_BLESS }, { FOOD_RATION, 0, FOOD_CLASS, 2, 0 }, { UNDEF_TYP, UNDEF_SPE, POTION_CLASS, 1, UNDEF_BLESS }, { UNDEF_TYP, UNDEF_SPE, SCROLL_CLASS, 1, UNDEF_BLESS }, { WAN_COLD, UNDEF_SPE, WAND_CLASS, 1, UNDEF_BLESS }, { UNDEF_TYP, UNDEF_SPE, RING_CLASS, 1, UNDEF_BLESS }, { SPE_FREEZE_SPHERE, UNDEF_SPE, SPBOOK_CLASS, 1, 1 }, { SPE_CONE_OF_COLD, UNDEF_SPE, SPBOOK_CLASS, 1, 1 }, { UNDEF_TYP, UNDEF_SPE, SPBOOK_CLASS, 1, 1 }, { 0, 0, 0, 0, 0 } }; static struct trobj Knight[] = { { LONG_SWORD, 1, WEAPON_CLASS, 1, UNDEF_BLESS }, { LANCE, 0, WEAPON_CLASS, 1, UNDEF_BLESS }, { PLATE_MAIL, 0, ARMOR_CLASS, 1, UNDEF_BLESS }, { HELMET, 0, ARMOR_CLASS, 1, UNDEF_BLESS }, { LARGE_SHIELD, 0, ARMOR_CLASS, 1, UNDEF_BLESS }, { LEATHER_GLOVES, 0, ARMOR_CLASS, 1, UNDEF_BLESS }, { APPLE, 0, FOOD_CLASS, 10, 0 }, { CARROT, 0, FOOD_CLASS, 10, 0 }, { 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 }, { UNDEF_TYP, UNDEF_SPE, SCROLL_CLASS, 1, UNDEF_BLESS }, { POT_HEALING, 0, POTION_CLASS, 3, UNDEF_BLESS }, { FOOD_RATION, 0, FOOD_CLASS, 3, 0 }, { APPLE, 0, FOOD_CLASS, 5, UNDEF_BLESS }, { ORANGE, 0, FOOD_CLASS, 5, UNDEF_BLESS }, /* Yes, we know fortune cookies aren't really from China. They were * invented by George Jung in Los Angeles, California, USA in 1916. */ { FORTUNE_COOKIE, 0, FOOD_CLASS, 3, UNDEF_BLESS }, { 0, 0, 0, 0, 0 } }; static struct trobj Necromancer[] = { #define N_BOOK 8 /* pretty much like Wizard, except with pick-axe instead of magic resist. */ { QUARTERSTAFF, 1, WEAPON_CLASS, 1, 1 }, /* for dealing with ghosts */ { UNDEF_TYP, UNDEF_SPE, RING_CLASS, 2, UNDEF_BLESS }, { UNDEF_TYP, UNDEF_SPE, POTION_CLASS, 3, UNDEF_BLESS }, { UNDEF_TYP, UNDEF_SPE, SCROLL_CLASS, 3, UNDEF_BLESS }, { SPE_SUMMON_UNDEAD, 0, SPBOOK_CLASS, 1, 1 }, { SPE_COMMAND_UNDEAD, 0, SPBOOK_CLASS, 1, 1 }, { SPE_DRAIN_LIFE, 0, SPBOOK_CLASS, 1, 1 }, /* WAC -- gave him drain life rather than turn undead */ { WAN_DRAINING, UNDEF_SPE, WAND_CLASS, 1, UNDEF_BLESS }, /* KMH -- ...and the matching wand for the inexperienced */ { UNDEF_TYP, UNDEF_SPE, SPBOOK_CLASS, 1, 1 }, { PICK_AXE, UNDEF_SPE, TOOL_CLASS, 1, UNDEF_BLESS }, { 0, 0, 0, 0, 0 } }; static struct trobj Priest[] = { #define P_BOOK 7 { MACE, 0, WEAPON_CLASS, 1, 1 }, { ROBE, 0, ARMOR_CLASS, 1, 1 }, { SMALL_SHIELD, 2, ARMOR_CLASS, 1, 1 }, { POT_WATER, 0, POTION_CLASS, 4, 1 }, /* holy water */ { CLOVE_OF_GARLIC, 0, FOOD_CLASS, 1, 1 }, { SPRIG_OF_WOLFSBANE, 0, FOOD_CLASS, 1, 1 }, { SPE_HEALING, UNDEF_SPE, SPBOOK_CLASS, 1, 1 }, { UNDEF_TYP, UNDEF_SPE, SPBOOK_CLASS, 1, 1 }, { UNDEF_TYP, UNDEF_SPE, SCROLL_CLASS, 1, 1 }, { 0, 0, 0, 0, 0 } }; static struct trobj Ranger[] = { #define RAN_BOW 1 #define RAN_TWO_ARROWS 2 #define RAN_ZERO_ARROWS 3 { DAGGER, 1, WEAPON_CLASS, 1, UNDEF_BLESS }, { BOW, 1, WEAPON_CLASS, 1, UNDEF_BLESS }, { ARROW, 2, WEAPON_CLASS, 50, UNDEF_BLESS }, { ARROW, 0, WEAPON_CLASS, 30, UNDEF_BLESS }, { CLOAK_OF_DISPLACEMENT, 2, ARMOR_CLASS, 1, UNDEF_BLESS }, { CRAM_RATION, 0, FOOD_CLASS, 4, 0 }, { 0, 0, 0, 0, 0 } }; static struct trobj Rogue[] = { #define R_DAGGERS 1 #define R_DARTS 2 { SHORT_SWORD, 0, WEAPON_CLASS, 1, UNDEF_BLESS }, { DAGGER, 0, WEAPON_CLASS, 10, 0 }, /* quan is variable */ { DART, 0, WEAPON_CLASS, 25, UNDEF_BLESS }, { LEATHER_ARMOR, 1, ARMOR_CLASS, 1, UNDEF_BLESS }, { POT_SICKNESS, 0, POTION_CLASS, 1, 0 }, { SCR_GOLD_DETECTION, 0, SCROLL_CLASS, 4, 1 }, { SCR_TELEPORTATION, 0, SCROLL_CLASS, 4, 1 }, { LOCK_PICK, 9, TOOL_CLASS, 1, 0 }, { OILSKIN_SACK, 0, TOOL_CLASS, 1, 0 }, { 0, 0, 0, 0, 0 } }; static struct trobj Samurai[] = { #define S_ARROWS 3 { KATANA, 0, WEAPON_CLASS, 1, UNDEF_BLESS }, { SHORT_SWORD, 0, WEAPON_CLASS, 1, UNDEF_BLESS }, /* wakizashi */ { YUMI, 0, WEAPON_CLASS, 1, UNDEF_BLESS }, { YA, 0, WEAPON_CLASS, 25, UNDEF_BLESS }, /* variable quan */ { SPLINT_MAIL, 0, ARMOR_CLASS, 1, UNDEF_BLESS }, { 0, 0, 0, 0, 0 } }; #ifdef TOURIST static struct trobj Tourist[] = { #define T_DARTS 0 { DART, 2, WEAPON_CLASS, 25, UNDEF_BLESS }, /* quan is variable */ { UNDEF_TYP, UNDEF_SPE, FOOD_CLASS, 12, 0 }, { POT_EXTRA_HEALING, 0, POTION_CLASS, 2, UNDEF_BLESS }, { SCR_MAGIC_MAPPING, 0, SCROLL_CLASS, 6, UNDEF_BLESS }, { HAWAIIAN_SHIRT, 0, ARMOR_CLASS, 1, UNDEF_BLESS }, { EXPENSIVE_CAMERA, UNDEF_SPE, TOOL_CLASS, 1, 0 }, { CREDIT_CARD, 0, TOOL_CLASS, 1, 0 }, { 0, 0, 0, 0, 0 } }; #endif static struct trobj UndeadSlayer[] = { #define U_MINOR 1 /* silver spear or whip [Castlevania] 25/25% */ /* crossbow 50% [Buffy] */ #define U_RANGE 2 /* silver daggers or crossbow bolts */ #define U_MISC 3 /* +1 boots [Buffy can kick] or helmet */ #define U_ARMOR 4 /* Tshirt/leather +1 or chain mail */ { WOODEN_STAKE, 0, WEAPON_CLASS, 1, UNDEF_BLESS }, { SILVER_SPEAR, 0, WEAPON_CLASS, 1, UNDEF_BLESS }, { SILVER_DAGGER, 0, WEAPON_CLASS, 5, UNDEF_BLESS }, { HELMET, 0, ARMOR_CLASS, 1, UNDEF_BLESS }, { CHAIN_MAIL, 0, ARMOR_CLASS, 1, UNDEF_BLESS }, { CLOVE_OF_GARLIC, 0, FOOD_CLASS, 5, 1 }, { SPRIG_OF_WOLFSBANE, 0, FOOD_CLASS, 5, 1 }, { HOLY_WAFER, 0, FOOD_CLASS, 4, 0 }, { POT_WATER, 0, POTION_CLASS, 4, 1 }, /* holy water */ { 0, 0, 0, 0, 0 } }; static struct trobj Valkyrie[] = { /* { LONG_SWORD, 1, WEAPON_CLASS, 1, UNDEF_BLESS }, */ { SPEAR, 1, WEAPON_CLASS, 1, UNDEF_BLESS }, /* Traditional Weapon - WAC*/ { DAGGER, 0, WEAPON_CLASS, 5, UNDEF_BLESS }, { SMALL_SHIELD, 3, ARMOR_CLASS, 1, UNDEF_BLESS }, { FOOD_RATION, 0, FOOD_CLASS, 1, 0 }, { 0, 0, 0, 0, 0 } }; static struct trobj Wizard[] = { #define W_MULTSTART 2 #define W_MULTEND 6 #define W_BOOK1 6 #define W_BOOK2 7 #define W_BOOK3 8 #define W_BOOK4 9 { QUARTERSTAFF, 1, WEAPON_CLASS, 1, 1 }, { CLOAK_OF_MAGIC_RESISTANCE, 0, ARMOR_CLASS, 1, UNDEF_BLESS }, { UNDEF_TYP, UNDEF_SPE, WAND_CLASS, 1, UNDEF_BLESS }, { UNDEF_TYP, UNDEF_SPE, RING_CLASS, 2, UNDEF_BLESS }, { UNDEF_TYP, UNDEF_SPE, POTION_CLASS, 3, UNDEF_BLESS }, { UNDEF_TYP, UNDEF_SPE, SCROLL_CLASS, 3, UNDEF_BLESS }, { UNDEF_TYP, UNDEF_SPE, SPBOOK_CLASS, 1, 1 }, { UNDEF_TYP, UNDEF_SPE, SPBOOK_CLASS, 1, 1 }, { UNDEF_TYP, UNDEF_SPE, SPBOOK_CLASS, 1, 1 }, { UNDEF_TYP, UNDEF_SPE, SPBOOK_CLASS, 1, 1 }, { 0, 0, 0, 0, 0 } }; #ifdef YEOMAN static struct trobj Yeoman[] = { { SHORT_SWORD, 2, WEAPON_CLASS, 1, UNDEF_BLESS }, { PARTISAN, 1, WEAPON_CLASS, 1, UNDEF_BLESS }, { LEATHER_ARMOR, 1, ARMOR_CLASS, 1, UNDEF_BLESS }, { HIGH_BOOTS, 0, ARMOR_CLASS, 1, UNDEF_BLESS }, { LEATHER_GLOVES, 0, ARMOR_CLASS, 1, UNDEF_BLESS }, { APPLE, 0, FOOD_CLASS, 10, 0 }, { CARROT, 0, FOOD_CLASS, 10, 0 }, { POT_WATER, 0, POTION_CLASS, 3, 0 }, { FISHING_POLE, 0, TOOL_CLASS, 1, 0 }, { 0, 0, 0, 0, 0 } }; #endif /* * Optional extra inventory items. */ static struct trobj Tinopener[] = { { TIN_OPENER, 0, TOOL_CLASS, 1, 0 }, { 0, 0, 0, 0, 0 } }; static struct trobj Magicmarker[] = { { MAGIC_MARKER, UNDEF_SPE, TOOL_CLASS, 1, 0 }, { 0, 0, 0, 0, 0 } }; static struct trobj Lamp[] = { { OIL_LAMP, 1, TOOL_CLASS, 1, 0 }, { 0, 0, 0, 0, 0 } }; static struct trobj Torch[] = { { TORCH, 0, TOOL_CLASS, 2, 0 }, { 0, 0, 0, 0, 0 } }; static struct trobj Blindfold[] = { { BLINDFOLD, 0, TOOL_CLASS, 1, 0 }, { 0, 0, 0, 0, 0 } }; static struct trobj Instrument[] = { { WOODEN_FLUTE, 0, TOOL_CLASS, 1, 0 }, { 0, 0, 0, 0, 0 } }; static struct trobj Xtra_food[] = { { UNDEF_TYP, UNDEF_SPE, FOOD_CLASS, 2, 0 }, { 0, 0, 0, 0, 0 } }; #ifdef TOURIST static struct trobj Leash[] = { { LEASH, 0, TOOL_CLASS, 1, 0 }, { 0, 0, 0, 0, 0 } }; static struct trobj Towel[] = { { TOWEL, 0, TOOL_CLASS, 1, 0 }, { 0, 0, 0, 0, 0 } }; #endif /* TOURIST */ static struct trobj Wishing[] = { { WAN_WISHING, 3, WAND_CLASS, 1, 0 }, { 0, 0, 0, 0, 0 } }; #ifdef GOLDOBJ static struct trobj Money[] = { { GOLD_PIECE, 0 , COIN_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 */ static struct inv_sub { short race_pm, item_otyp, subs_otyp; } inv_subs[] = { { PM_ELF, DAGGER, ELVEN_DAGGER }, { PM_ELF, SPEAR, ELVEN_SPEAR }, { PM_ELF, SHORT_SWORD, ELVEN_SHORT_SWORD }, { PM_ELF, BOW, ELVEN_BOW }, { PM_ELF, ARROW, ELVEN_ARROW }, { PM_ELF, HELMET, ELVEN_LEATHER_HELM }, /* { PM_ELF, SMALL_SHIELD, ELVEN_SHIELD }, */ { PM_ELF, CLOAK_OF_DISPLACEMENT, ELVEN_CLOAK }, { PM_ELF, CRAM_RATION, LEMBAS_WAFER }, { PM_ORC, DAGGER, ORCISH_DAGGER }, { PM_ORC, SPEAR, ORCISH_SPEAR }, { PM_ORC, SHORT_SWORD, ORCISH_SHORT_SWORD }, { PM_ORC, BOW, ORCISH_BOW }, { PM_ORC, ARROW, ORCISH_ARROW }, { PM_ORC, HELMET, ORCISH_HELM }, { PM_ORC, SMALL_SHIELD, ORCISH_SHIELD }, { PM_ORC, RING_MAIL, ORCISH_RING_MAIL }, { PM_ORC, CHAIN_MAIL, ORCISH_CHAIN_MAIL }, { PM_DWARF, SPEAR, DWARVISH_SPEAR }, { PM_DWARF, SHORT_SWORD, DWARVISH_SHORT_SWORD }, { PM_DWARF, HELMET, DWARVISH_IRON_HELM }, /* { PM_DWARF, SMALL_SHIELD, DWARVISH_ROUNDSHIELD }, */ /* { PM_DWARF, PICK_AXE, DWARVISH_MATTOCK }, */ { PM_GNOME, BOW, CROSSBOW }, { PM_GNOME, ARROW, CROSSBOW_BOLT }, { PM_HUMAN_WEREWOLF,FOOD_RATION, TRIPE_RATION }, { PM_HUMAN_WEREWOLF,SILVER_SPEAR, SPEAR }, { PM_HUMAN_WEREWOLF,SILVER_DAGGER, DAGGER }, #ifdef FIREARMS { PM_HUMAN_WEREWOLF,SILVER_BULLET, BULLET }, #endif { PM_DROW, DAGGER, DARK_ELVEN_DAGGER }, { PM_DROW, SHORT_SWORD, DARK_ELVEN_SHORT_SWORD}, { PM_DROW, BOW, DARK_ELVEN_BOW }, { PM_DROW, ARROW, DARK_ELVEN_ARROW }, { PM_VAMPIRE, POT_FRUIT_JUICE, POT_BLOOD }, { PM_VAMPIRE, FOOD_RATION, POT_VAMPIRE_BLOOD }, { NON_PM, STRANGE_OBJECT, STRANGE_OBJECT } }; /* align-based substitutions for initial inventory */ struct inv_asub { aligntyp align; short item_otyp, subs_otyp; }; static struct inv_asub inv_asubs[] = { { A_CHAOTIC, HOLY_WAFER, LEMBAS_WAFER }, { A_NONE, STRANGE_OBJECT, STRANGE_OBJECT } }; /* KMH -- Expectations for skills. * 1. Starting equipment will start as basic, and should have a maximum * of at least skilled. If you enter the dungeon with it, you should * know how to use it. See weapon.c, skill_init(). * 2. First and second artifact gifts should have a maximum of at least * skilled. See artifact.c, init_artifacts(). * 3. Quest artifacts should have a maximum of expert. See artifact.c, * init_artifacts(). * 4. Races that construct weapons (elf, dwarf, orc) should have * a maximum of expert in those weapons. * 5. Spellcasters should get a maximum of at least basic in all spell * categories. */ static const struct def_skill Skill_A[] = { { P_DAGGER, P_BASIC }, { P_KNIFE, P_BASIC }, { P_PICK_AXE, P_EXPERT }, { P_SHORT_SWORD, P_BASIC }, { P_SCIMITAR, P_SKILLED }, { P_SABER, P_EXPERT }, { P_CLUB, P_SKILLED }, { P_PADDLE, P_BASIC }, { P_QUARTERSTAFF, P_SKILLED }, #ifdef FIREARMS { P_FIREARM, P_SKILLED }, #endif { P_SLING, P_SKILLED }, { P_DART, P_BASIC }, { P_BOOMERANG, P_EXPERT }, { P_WHIP, P_EXPERT }, { P_UNICORN_HORN, P_SKILLED }, { P_ATTACK_SPELL, P_BASIC }, { P_HEALING_SPELL, P_BASIC }, { P_DIVINATION_SPELL, P_EXPERT }, { P_ENCHANTMENT_SPELL, P_BASIC }, { P_PROTECTION_SPELL, P_BASIC }, { P_BODY_SPELL, P_BASIC }, { P_MATTER_SPELL, P_SKILLED }, /*WAC- 'A' knows of all spells from studying, but only really good at divination class*/ { P_TWO_WEAPON_COMBAT, P_BASIC }, { P_BARE_HANDED_COMBAT, P_EXPERT }, { P_NONE, 0 } }; static const struct def_skill Skill_B[] = { { P_DAGGER, P_BASIC }, { P_AXE, P_EXPERT }, { P_PICK_AXE, P_SKILLED }, { P_SHORT_SWORD, P_EXPERT }, { P_BROAD_SWORD, P_SKILLED }, { P_LONG_SWORD, P_SKILLED }, { P_TWO_HANDED_SWORD, P_EXPERT }, { P_SCIMITAR, P_SKILLED }, { P_SABER, P_BASIC }, { P_CLUB, P_SKILLED }, { P_PADDLE, 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 }, { P_BODY_SPELL, P_SKILLED }, /*WAC - 'B' is good at attack spells and body manipulation spells -both combat oriented */ #ifdef STEED { P_RIDING, P_BASIC }, #endif { P_TWO_WEAPON_COMBAT, P_BASIC }, { P_BARE_HANDED_COMBAT, P_MASTER }, { P_NONE, 0 } }; static const struct def_skill Skill_C[] = { { P_DAGGER, P_BASIC }, { P_KNIFE, P_SKILLED }, { P_AXE, P_SKILLED }, { P_PICK_AXE, P_BASIC }, { P_CLUB, P_EXPERT }, { P_PADDLE, P_EXPERT }, { P_MACE, P_EXPERT }, { P_MORNING_STAR, P_BASIC }, { P_FLAIL, P_SKILLED }, { P_HAMMER, P_SKILLED }, { P_QUARTERSTAFF, P_EXPERT }, { P_POLEARMS, P_SKILLED }, { P_SPEAR, P_EXPERT }, { P_JAVELIN, P_SKILLED }, { P_TRIDENT, P_SKILLED }, { P_BOW, P_EXPERT }, { P_SLING, P_SKILLED }, { P_BOOMERANG, P_EXPERT }, { P_UNICORN_HORN, P_BASIC }, { P_MATTER_SPELL, P_SKILLED }, { P_ENCHANTMENT_SPELL, P_BASIC }, /*WAC - 'C' is at one with the elements - matter spells, as well as basic enchantments - removed attack spell basic skill as it is now "dark" spells*/ { P_BARE_HANDED_COMBAT, P_MASTER }, { P_NONE, 0 } }; static const struct def_skill Skill_F[] = { /*Style: small-med edged weapons, blunt weapons*/ { P_DAGGER, P_EXPERT }, { P_KNIFE, P_SKILLED }, { P_AXE, P_BASIC }, /*{ P_PICK_AXE, P_BASIC },*/ { P_SHORT_SWORD, P_EXPERT }, /*{ P_BROAD_SWORD, P_BASIC },*/ { P_LONG_SWORD, P_SKILLED }, /*{ P_TWO_HANDED_SWORD, P_BASIC },*/ { P_SCIMITAR, P_SKILLED }, { P_SABER, P_SKILLED }, { P_PADDLE, P_BASIC }, { P_MACE, P_BASIC }, /*{ P_MORNING_STAR, P_BASIC }, { P_FLAIL, P_BASIC },*/ { P_HAMMER, P_BASIC }, { P_QUARTERSTAFF, P_SKILLED }, /* { P_POLEARMS, P_BASIC },*/ /* Relies on spells for ranged attack { P_SPEAR, P_BASIC }, { P_JAVELIN, P_BASIC }, { P_TRIDENT, P_BASIC }, { P_LANCE, P_BASIC }, { P_BOW, P_BASIC }, { P_SLING, P_BASIC }, { P_CROSSBOW, P_BASIC }, { P_DART, P_EXPERT }, { P_SHURIKEN, P_BASIC }, { P_BOOMERANG, P_BASIC }, */ { P_WHIP, P_BASIC }, { P_UNICORN_HORN, P_SKILLED }, { P_ATTACK_SPELL, P_SKILLED }, { P_HEALING_SPELL, P_BASIC }, { P_DIVINATION_SPELL, P_EXPERT }, { P_ENCHANTMENT_SPELL, P_BASIC }, { P_PROTECTION_SPELL, P_BASIC }, { P_BODY_SPELL, P_SKILLED }, { P_MATTER_SPELL, P_EXPERT }, /* Added expert matter spell (elements), skilled in attack, basic in rest He is a mage, so knows the types.*/ #ifdef STEED { P_RIDING, P_SKILLED }, #endif { P_TWO_WEAPON_COMBAT, P_SKILLED }, { P_BARE_HANDED_COMBAT, P_SKILLED }, { P_NONE, 0 } }; static const struct def_skill Skill_H[] = { { P_DAGGER, P_SKILLED }, { P_KNIFE, P_EXPERT }, { P_SHORT_SWORD, P_SKILLED }, { P_SCIMITAR, P_BASIC }, { P_SABER, P_BASIC }, { P_CLUB, P_SKILLED }, { P_PADDLE, P_SKILLED }, { P_MACE, P_BASIC }, { P_QUARTERSTAFF, P_EXPERT }, { P_POLEARMS, P_BASIC }, { P_SPEAR, P_BASIC }, { P_JAVELIN, P_BASIC }, { P_TRIDENT, P_BASIC }, { P_SLING, P_SKILLED }, { P_DART, P_EXPERT }, { P_SHURIKEN, P_SKILLED }, { P_UNICORN_HORN, P_EXPERT }, { P_ATTACK_SPELL, P_BASIC }, { P_HEALING_SPELL, P_EXPERT }, { P_DIVINATION_SPELL, P_BASIC }, { P_ENCHANTMENT_SPELL, P_BASIC }, { P_PROTECTION_SPELL, P_BASIC }, { P_BODY_SPELL, P_BASIC }, { P_MATTER_SPELL, P_BASIC }, #ifdef STEED { P_RIDING, P_BASIC }, #endif { P_BARE_HANDED_COMBAT, P_BASIC }, { P_NONE, 0 } }; static const struct def_skill Skill_I[] = { /*Resorts mostly to stabbing weapons*/ { P_DAGGER, P_EXPERT }, { P_KNIFE, P_SKILLED }, /* { P_AXE, P_BASIC }, { P_PICK_AXE, P_BASIC }, { P_SHORT_SWORD, P_EXPERT }, { P_BROAD_SWORD, P_BASIC },*/ { P_LONG_SWORD, P_SKILLED }, /*{ P_TWO_HANDED_SWORD, P_BASIC }, { P_SCIMITAR, P_SKILLED }, { P_SABER, P_SKILLED }, { P_MACE, P_BASIC }, { P_MORNING_STAR, P_BASIC }, { P_FLAIL, P_BASIC }, { P_HAMMER, P_BASIC },*/ { P_QUARTERSTAFF, P_SKILLED }, { P_POLEARMS, P_BASIC }, { P_SPEAR, P_BASIC }, { P_JAVELIN, P_BASIC }, { P_TRIDENT, P_BASIC }, { P_LANCE, P_BASIC }, /* { P_BOW, P_BASIC }, { P_SLING, P_BASIC }, { P_CROSSBOW, P_BASIC }, { P_DART, P_EXPERT }, { P_SHURIKEN, P_BASIC }, { P_BOOMERANG, P_BASIC },*/ { P_WHIP, P_BASIC }, { P_UNICORN_HORN, P_SKILLED }, { P_ATTACK_SPELL, P_BASIC }, { P_HEALING_SPELL, P_SKILLED }, { P_DIVINATION_SPELL, P_BASIC }, { P_ENCHANTMENT_SPELL, P_EXPERT }, { P_PROTECTION_SPELL, P_SKILLED }, { P_BODY_SPELL, P_BASIC }, { P_MATTER_SPELL, P_EXPERT }, /*WAC - same as Flame Mage*/ #ifdef STEED { P_RIDING, P_SKILLED }, #endif { P_TWO_WEAPON_COMBAT, P_SKILLED }, { P_BARE_HANDED_COMBAT, P_SKILLED }, { P_NONE, 0 } }; static const struct def_skill Skill_K[] = { { P_DAGGER, P_BASIC }, { P_KNIFE, P_BASIC }, { P_AXE, P_SKILLED }, { P_PICK_AXE, P_BASIC }, { P_SHORT_SWORD, P_SKILLED }, { P_BROAD_SWORD, P_SKILLED }, { P_LONG_SWORD, P_EXPERT }, { P_TWO_HANDED_SWORD, P_SKILLED }, { P_SCIMITAR, P_BASIC }, { P_SABER, P_SKILLED }, { P_CLUB, P_BASIC }, { P_PADDLE, P_BASIC }, { P_MACE, P_SKILLED }, { P_MORNING_STAR, P_SKILLED }, { P_FLAIL, P_BASIC }, { P_HAMMER, P_BASIC }, { P_POLEARMS, P_SKILLED }, { P_SPEAR, P_SKILLED }, { P_JAVELIN, P_SKILLED }, { P_TRIDENT, P_BASIC }, { P_LANCE, P_EXPERT }, { P_BOW, P_BASIC }, { P_CROSSBOW, P_SKILLED }, { P_HEALING_SPELL, P_SKILLED }, { P_PROTECTION_SPELL, P_SKILLED }, { P_BODY_SPELL, P_BASIC }, /*WAC - removed the attack spells - no good having knights summoning undead! Replaced with skilled body spells*/ #ifdef STEED { P_RIDING, P_EXPERT }, #endif { P_TWO_WEAPON_COMBAT, P_SKILLED }, { P_BARE_HANDED_COMBAT, P_EXPERT }, { P_NONE, 0 } }; static const struct def_skill Skill_Mon[] = { { P_PADDLE, P_SKILLED }, { P_QUARTERSTAFF, P_SKILLED }, { P_SPEAR, P_BASIC }, { P_JAVELIN, P_BASIC }, { P_BOW, P_BASIC }, { P_SHURIKEN, P_BASIC }, { P_MARTIAL_ARTS, P_GRAND_MASTER }, { P_ATTACK_SPELL, P_BASIC }, { P_HEALING_SPELL, P_EXPERT }, { P_DIVINATION_SPELL, P_BASIC }, { P_ENCHANTMENT_SPELL, P_SKILLED }, { P_PROTECTION_SPELL, P_EXPERT }, { P_BODY_SPELL, P_BASIC }, { P_MATTER_SPELL, P_BASIC }, /*WAC - monks are good healers - expert healing - and expert protect*/ { P_NONE, 0 } }; static const struct def_skill Skill_N[] = { { P_DAGGER, P_EXPERT }, { P_KNIFE, P_SKILLED }, { P_AXE, P_SKILLED }, { P_PICK_AXE, P_SKILLED }, { P_CLUB, P_SKILLED }, { P_MACE, P_BASIC }, { P_QUARTERSTAFF, P_EXPERT }, { P_POLEARMS, P_SKILLED }, { P_SPEAR, P_BASIC }, { P_JAVELIN, P_BASIC }, { P_TRIDENT, P_BASIC }, { P_SLING, P_SKILLED }, { P_DART, P_EXPERT }, { P_SHURIKEN, P_BASIC }, { P_ATTACK_SPELL, P_EXPERT }, { P_MATTER_SPELL, P_EXPERT }, /*WAC- expert of dark arts - attack spells, skilled in matter -for fireball and cone of cold*/ { P_BARE_HANDED_COMBAT, P_BASIC }, { P_NONE, 0 } }; static struct def_skill Skill_P[] = { /* KMH -- Long sword for Sunsword */ { P_LONG_SWORD, P_SKILLED }, { P_CLUB, P_EXPERT }, { P_PADDLE, P_EXPERT }, { P_MACE, P_EXPERT }, { P_MORNING_STAR, P_EXPERT }, { P_FLAIL, P_EXPERT }, { P_HAMMER, P_EXPERT }, { P_QUARTERSTAFF, P_EXPERT }, { P_POLEARMS, P_SKILLED }, { P_SPEAR, P_SKILLED }, { P_JAVELIN, P_SKILLED }, { P_TRIDENT, P_SKILLED }, { P_LANCE, P_BASIC }, { P_BOW, P_BASIC }, { P_SLING, P_BASIC }, { P_CROSSBOW, P_BASIC }, { P_DART, P_BASIC }, { P_SHURIKEN, P_BASIC }, { P_BOOMERANG, P_BASIC }, { P_UNICORN_HORN, P_SKILLED }, /* [ALI] Depending on the spellbook which priests enter the dungeon with, * one of the maximum skill levels listed here will be raised by one. */ { P_ATTACK_SPELL, P_BASIC }, { P_HEALING_SPELL, P_EXPERT }, { P_DIVINATION_SPELL, P_EXPERT }, { P_ENCHANTMENT_SPELL, P_BASIC }, { P_PROTECTION_SPELL, P_SKILLED }, { P_BODY_SPELL, P_BASIC }, { P_MATTER_SPELL, P_BASIC }, { P_BARE_HANDED_COMBAT, P_BASIC }, /* the monk is added in slash */ { P_NONE, 0 } }; static const struct def_skill Skill_R[] = { { P_DAGGER, P_EXPERT }, { P_KNIFE, P_EXPERT }, { P_SHORT_SWORD, P_EXPERT }, { P_BROAD_SWORD, P_SKILLED }, { P_LONG_SWORD, P_SKILLED }, { P_TWO_HANDED_SWORD, P_BASIC }, { P_SCIMITAR, P_SKILLED }, { P_SABER, P_SKILLED }, { P_CLUB, P_SKILLED }, { P_PADDLE, P_SKILLED }, { P_MACE, P_SKILLED }, { P_MORNING_STAR, P_BASIC }, { P_FLAIL, P_BASIC }, { P_HAMMER, P_BASIC }, { P_POLEARMS, P_BASIC }, { P_SPEAR, P_BASIC }, #ifdef FIREARMS { P_FIREARM, P_EXPERT }, #endif { P_CROSSBOW, P_EXPERT }, { P_DART, P_EXPERT }, { P_SHURIKEN, P_SKILLED }, { P_DIVINATION_SPELL, P_SKILLED }, { P_BODY_SPELL, P_SKILLED }, { P_MATTER_SPELL, P_SKILLED }, /*WAC Left as is*/ #ifdef STEED { P_RIDING, P_BASIC }, #endif { P_TWO_WEAPON_COMBAT, P_EXPERT }, { P_BARE_HANDED_COMBAT, P_EXPERT }, { P_NONE, 0 } }; static const 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_BODY_SPELL, P_BASIC }, #ifdef STEED { P_RIDING, P_BASIC }, #endif { P_BARE_HANDED_COMBAT, P_BASIC }, { P_NONE, 0 } }; static const struct def_skill Skill_S[] = { { P_DAGGER, P_BASIC }, { P_KNIFE, P_SKILLED }, { P_SHORT_SWORD, P_EXPERT }, { P_BROAD_SWORD, P_SKILLED }, { P_LONG_SWORD, P_EXPERT }, { P_TWO_HANDED_SWORD, P_EXPERT }, { P_SCIMITAR, P_BASIC }, { P_SABER, P_BASIC }, { P_PADDLE, P_BASIC }, { P_FLAIL, P_SKILLED }, { P_QUARTERSTAFF, P_BASIC }, { P_POLEARMS, P_SKILLED }, { P_SPEAR, P_BASIC }, { P_JAVELIN, P_BASIC }, { P_LANCE, P_SKILLED }, { P_BOW, P_EXPERT }, { P_SHURIKEN, P_EXPERT }, { P_PROTECTION_SPELL, P_SKILLED }, { P_BODY_SPELL, P_BASIC }, /* WAC - removed the attack spells, replace with body. clairvoyance, meditate*/ #ifdef STEED { P_RIDING, P_SKILLED }, #endif { P_TWO_WEAPON_COMBAT, P_EXPERT }, { P_MARTIAL_ARTS, P_MASTER }, { P_NONE, 0 } }; #ifdef TOURIST static const struct def_skill Skill_T[] = { { P_DAGGER, P_EXPERT }, { P_KNIFE, P_SKILLED }, { P_AXE, P_BASIC }, { P_PICK_AXE, P_BASIC }, { P_SHORT_SWORD, P_EXPERT }, { P_BROAD_SWORD, P_BASIC }, { P_LONG_SWORD, P_BASIC }, { P_TWO_HANDED_SWORD, P_BASIC }, { P_SCIMITAR, P_SKILLED }, { P_SABER, P_SKILLED }, { P_PADDLE, P_BASIC }, { P_MACE, P_BASIC }, { P_MORNING_STAR, P_BASIC }, { P_FLAIL, P_BASIC }, { P_HAMMER, P_BASIC }, { P_QUARTERSTAFF, P_BASIC }, { P_POLEARMS, P_BASIC }, { P_SPEAR, P_BASIC }, { P_JAVELIN, P_BASIC }, { P_TRIDENT, P_BASIC }, { P_LANCE, P_BASIC }, { P_BOW, P_BASIC }, { P_SLING, P_BASIC }, #ifdef FIREARMS { P_FIREARM, P_BASIC }, #endif { P_CROSSBOW, P_BASIC }, { P_DART, P_EXPERT }, { P_SHURIKEN, P_BASIC }, { P_BOOMERANG, P_BASIC }, { P_WHIP, P_BASIC }, { P_UNICORN_HORN, P_SKILLED }, { P_DIVINATION_SPELL, P_BASIC }, { P_ENCHANTMENT_SPELL, P_BASIC }, { P_BODY_SPELL, P_SKILLED }, /*WAC left alone*/ #ifdef STEED { P_RIDING, P_BASIC }, #endif { P_TWO_WEAPON_COMBAT, P_SKILLED }, { P_BARE_HANDED_COMBAT, P_SKILLED }, { P_NONE, 0 } }; #endif /* TOURIST */ static const struct def_skill Skill_U[] = { /*WAC * -made dagger skill expert too, since it's a starting weapon * -made spear skill Expert rather than Skilled * Slayer artifact is a spear, after all * -made crossbow skill Expert - Dracula movies * -changed bare handed basic to martial arts master-Buffy the Vampire Slayer * -Added whip Expert - Castlevania * -made club, flail, mace, morning star, hammer, quarterstaff Skilled from Expert to balance * -removed Trident skill - from Skilled to Restricted * -removed Lance skill - from Basic to Restricted */ { P_DAGGER, P_EXPERT }, { P_LONG_SWORD, P_SKILLED }, { P_CLUB, P_SKILLED }, { P_PADDLE, P_SKILLED }, { P_MACE, P_SKILLED }, { P_MORNING_STAR, P_SKILLED }, { P_FLAIL, P_SKILLED }, { P_HAMMER, P_SKILLED }, { P_QUARTERSTAFF, P_SKILLED }, { P_POLEARMS, P_SKILLED }, { P_SPEAR, P_EXPERT }, { P_JAVELIN, P_SKILLED }, { P_BOW, P_BASIC }, { P_SLING, P_BASIC }, #ifdef FIREARMS { P_FIREARM, P_EXPERT }, #endif { P_CROSSBOW, P_EXPERT }, { P_DART, P_BASIC }, { P_SHURIKEN, P_BASIC }, { P_BOOMERANG, P_BASIC }, { P_WHIP, P_EXPERT }, { P_UNICORN_HORN, P_SKILLED }, { P_PROTECTION_SPELL, P_SKILLED }, { P_BODY_SPELL, P_SKILLED }, { P_MATTER_SPELL, P_BASIC }, /*WAC - added PROTECTION spells, body spells as skilled, basic matter spells - for the fire vs undead*/ { P_BARE_HANDED_COMBAT, P_GRAND_MASTER }, { P_NONE, 0 } }; static const struct def_skill Skill_V[] = { { P_DAGGER, P_EXPERT }, { P_AXE, P_EXPERT }, { P_PICK_AXE, P_SKILLED }, { P_SHORT_SWORD, P_SKILLED }, { P_BROAD_SWORD, P_SKILLED }, { P_LONG_SWORD, P_EXPERT }, { P_TWO_HANDED_SWORD, P_EXPERT }, { P_SCIMITAR, P_BASIC }, { P_SABER, P_BASIC }, { P_HAMMER, P_EXPERT }, { P_QUARTERSTAFF, P_BASIC }, { P_POLEARMS, P_SKILLED }, { P_SPEAR, P_SKILLED }, { P_JAVELIN, P_BASIC }, { P_TRIDENT, P_BASIC }, { P_LANCE, P_SKILLED }, { P_SLING, P_BASIC }, { P_BODY_SPELL, P_BASIC }, { P_MATTER_SPELL, P_EXPERT }, /* replace attack spell with matter spell - cone of cold, lightning * Boosted to Expert */ #ifdef STEED { P_RIDING, P_SKILLED }, #endif { P_TWO_WEAPON_COMBAT, P_SKILLED }, { P_BARE_HANDED_COMBAT, P_EXPERT }, { P_NONE, 0 } }; static const struct def_skill Skill_W[] = { { P_DAGGER, P_EXPERT }, { P_KNIFE, P_SKILLED }, { P_AXE, P_SKILLED }, { P_SHORT_SWORD, P_BASIC }, { P_CLUB, P_SKILLED }, { P_PADDLE, P_BASIC }, { P_MACE, P_BASIC }, { P_QUARTERSTAFF, P_EXPERT }, { P_POLEARMS, P_SKILLED }, { P_SPEAR, P_BASIC }, { P_JAVELIN, P_BASIC }, { P_TRIDENT, P_BASIC }, { P_SLING, P_SKILLED }, { P_DART, P_EXPERT }, { P_SHURIKEN, P_BASIC }, { P_ATTACK_SPELL, P_EXPERT }, { P_HEALING_SPELL, P_SKILLED }, { P_DIVINATION_SPELL, P_SKILLED }, { P_ENCHANTMENT_SPELL, P_SKILLED }, { P_PROTECTION_SPELL, P_SKILLED }, { P_BODY_SPELL, P_SKILLED }, { P_MATTER_SPELL, P_SKILLED }, /* added matter spell skilled, as fireball and cone of cold are matter spells, but now specialty of F/I Mages*/ #ifdef STEED { P_RIDING, P_BASIC }, #endif { P_BARE_HANDED_COMBAT, P_BASIC }, { P_NONE, 0 } }; #ifdef YEOMAN static const struct def_skill Skill_Y[] = { { P_DAGGER, P_SKILLED }, { P_KNIFE, P_BASIC }, { P_AXE, P_SKILLED }, { P_SHORT_SWORD, P_EXPERT }, { P_BROAD_SWORD, P_BASIC }, { P_LONG_SWORD, P_SKILLED }, { P_SABER, P_SKILLED }, { P_PADDLE, P_SKILLED }, { P_HAMMER, P_BASIC }, { P_QUARTERSTAFF, P_SKILLED }, { P_POLEARMS, P_EXPERT }, { P_SPEAR, P_BASIC }, { P_JAVELIN, P_SKILLED }, { P_TRIDENT, P_SKILLED }, { P_LANCE, P_SKILLED }, { P_BOW, P_EXPERT }, { P_SLING, P_BASIC }, #ifdef FIREARMS { P_FIREARM, P_SKILLED }, #endif { P_CROSSBOW, P_SKILLED }, { P_DART, P_BASIC }, { P_WHIP, P_BASIC }, { P_UNICORN_HORN, P_BASIC }, { P_ENCHANTMENT_SPELL, P_SKILLED }, { P_PROTECTION_SPELL, P_SKILLED }, { P_BODY_SPELL, P_BASIC }, #ifdef STEED { P_RIDING, P_EXPERT }, #endif { P_TWO_WEAPON_COMBAT, P_SKILLED }, { P_BARE_HANDED_COMBAT, P_SKILLED }, { P_NONE, 0 } }; #endif STATIC_OVL void knows_object(obj) register int obj; { discover_object(obj,TRUE,FALSE); objects[obj].oc_pre_discovered = 1; /* not a "discovery" */ } /* 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; { register int ct; for (ct = 1; ct < NUM_OBJECTS; ct++) if (objects[ct].oc_class == sym && !objects[ct].oc_magic) knows_object(ct); } /* [ALI] Raise one spell skill by one level. Priorities: * - The skill for the chosen spellbook if not already expert. * - A skill currently at skilled level. * - A skill currently at basic level. * Where more than one skill is possible at a priority level, choose one * at random. * * The idea is that where a role may be given spellbooks in which the * role is normally at basic level, then the Skill array can be tweaked * to reduce one skill from expert to skilled. After choosing the * spellbook we can then dynamically raise one skill which will either be * the one for the spellbook if that is currently basic (and so avoid the * warning message from skill_init) or raise the tweaked skill to expert. * * Currently only used by priests. */ static void spellbook_skill_raise(class_skill, spellbook) register struct def_skill *class_skill; int spellbook; { register int i, j; j = spell_skilltype(spellbook); for(i = 0; class_skill[i].skill != P_NONE; i++) if (class_skill[i].skill == j) break; if (class_skill[i].skill == P_NONE) pline("Warning: No entry for %s in Skill array.", obj_typename(spellbook)); else if (class_skill[i].skmax < P_EXPERT) class_skill[i].skmax++; else { j = 0; for(i = 0; class_skill[i].skill != P_NONE; i++) { if (class_skill[i].skill >= P_FIRST_SPELL && class_skill[i].skill <= P_LAST_SPELL && class_skill[i].skmax == P_SKILLED) j++; } if (j) { j = rn2(j); for(i = 0; class_skill[i].skill != P_NONE; i++) { if (class_skill[i].skill >= P_FIRST_SPELL && class_skill[i].skill <= P_LAST_SPELL && class_skill[i].skmax == P_SKILLED) if (!j--) { class_skill[i].skmax++; break; } } } else { for(i = 0; class_skill[i].skill != P_NONE; i++) { if (class_skill[i].skill >= P_FIRST_SPELL && class_skill[i].skill <= P_LAST_SPELL && class_skill[i].skmax >= P_BASIC && class_skill[i].skmax < P_EXPERT) j++; } if (j) { j = rn2(j); for(i = 0; class_skill[i].skill != P_NONE; i++) { if (class_skill[i].skill >= P_FIRST_SPELL && class_skill[i].skill <= P_LAST_SPELL && class_skill[i].skmax >= P_BASIC && class_skill[i].skmax < P_EXPERT) if (!j--) { class_skill[i].skmax++; break; } } } } } } void u_init() { register int i, temp; int no_extra_food = FALSE; flags.female = flags.initgend; flags.beginner = 1; /* WAC -- Clear Tech List since adjabil will init the 1st level techs*/ for (i = 0; i <= MAXTECH; i++) tech_list[i].t_id = NO_TECH; /* Initialize spells */ for (i = 0; i <= MAXSPELL; i++) spl_book[i].sp_id = NO_SPELL; /* Initialize the "u" structure. * Note that some values may have been incorrectly set by a failed restore. */ (void) memset((genericptr_t)&u, 0, sizeof(u)); setustuck((struct monst *)0); #if 0 /* documentation of more zero values as desirable */ u.usick_cause[0] = 0; u.uluck = u.moreluck = 0; # ifdef TOURIST uarmu = 0; # endif uarm = uarmc = uarmh = uarms = uarmg = uarmf = 0; uwep = uball = uchain = uleft = uright = 0; /* WAC Added uswapwep, uquiver*/ uswapwep = uquiver = 0; /* KMH -- added two-weapon combat */ u.twoweap = 0; u.ublessed = 0; /* not worthy yet */ u.ugangr = 0; /* gods not angry */ u.ugifts = 0; /* no divine gifts bestowed */ /* WAC not needed - use techs */ /* u.unextuse = 0; u.ulastuse = 0;*/ # ifdef ELBERETH u.uevent.uhand_of_elbereth = 0; # endif u.uevent.uheard_tune = 0; u.uevent.uopened_dbridge = 0; u.uevent.udemigod = 0; /* not a demi-god yet... */ u.udg_cnt = 0; u.mh = u.mhmax = Upolyd = 0; u.uz.dnum = u.uz0.dnum = 0; u.utotype = 0; #endif /* 0 */ u.uz.dlevel = 1; u.uz0.dlevel = 0; u.utolev = u.uz; u.umoved = FALSE; u.umortality = 0; u.ugrave_arise = NON_PM; u.umonnum = u.umonster = (flags.female && urole.femalenum != NON_PM) ? urole.femalenum : urole.malenum; init_uasmon(); u.ulevel = 0; /* set up some of the initial attributes */ u.uhp = u.uhpmax = newhp(); u.uenmax = urole.enadv.infix + urace.enadv.infix; if (urole.enadv.inrnd > 0) u.uenmax += rnd(urole.enadv.inrnd); if (urace.enadv.inrnd > 0) u.uenmax += rnd(urace.enadv.inrnd); u.uen = u.uenmax; u.uspellprot = 0; adjabil(0,1); u.ulevel = u.ulevelmax = 1; init_uhunger(); u.ublesscnt = 300; /* no prayers just yet */ u.ualignbase[A_CURRENT] = u.ualignbase[A_ORIGINAL] = u.ualign.type = aligns[flags.initalign].value; u.ulycn = NON_PM; #if defined(BSD) && !defined(POSIX_TYPES) (void) time((long *)&u.ubirthday); #else (void) time(&u.ubirthday); #endif /* * For now, everyone but elves, cavemen and lycanthropes starts * out with a night vision range of 1 and their xray range disabled. */ u.nv_range = 1; u.xray_range = -1; /* Role-specific initializations */ switch (Role_switch) { case PM_ARCHEOLOGIST: switch (rnd(5)) { case 1: Archeologist[A_BOOK].trotyp = SPE_DETECT_FOOD; break; case 2: Archeologist[A_BOOK].trotyp = SPE_DETECT_MONSTERS; break; case 3: Archeologist[A_BOOK].trotyp = SPE_LIGHT; break; case 4: Archeologist[A_BOOK].trotyp = SPE_KNOCK; break; case 5: Archeologist[A_BOOK].trotyp = SPE_WIZARD_LOCK; break; default: break; } ini_inv(Archeologist); if(!rn2(4)) ini_inv(Blindfold); #ifdef TOURIST else if(!rn2(4)) ini_inv(Towel); if(!rn2(4)) ini_inv(Leash); #endif if(!rn2(4)) ini_inv(Tinopener); else if(!rn2(4)) (rn2(100) > 50 ? ini_inv(Lamp) : ini_inv(Torch)); if(!rn2(8)) ini_inv(Magicmarker); knows_object(TOUCHSTONE); knows_object(SACK); skill_init(Skill_A); break; case PM_BARBARIAN: if (rn2(100) >= 50) { /* see Elf comment */ Barbarian[B_MAJOR].trotyp = BATTLE_AXE; Barbarian[B_MINOR].trotyp = SHORT_SWORD; } ini_inv(Barbarian); if(!rn2(6)) ini_inv(Torch); knows_class(WEAPON_CLASS); knows_class(ARMOR_CLASS); skill_init(Skill_B); break; case PM_CAVEMAN: u.nv_range = 2; Cave_man[C_AMMO].trquan = rn1(11, 10); /* 10..20 */ ini_inv(Cave_man); skill_init(Skill_C); break; case PM_FLAME_MAGE: switch (rnd(2)) { case 1: Flame_Mage[F_BOOK].trotyp = SPE_DETECT_MONSTERS; break; case 2: Flame_Mage[F_BOOK].trotyp = SPE_LIGHT; break; default: break; } ini_inv(Flame_Mage); if(!rn2(5)) ini_inv(Lamp); else if(!rn2(5)) ini_inv(Blindfold); else if(!rn2(5)) ini_inv(Magicmarker); skill_init(Skill_F); break; case PM_HEALER: #ifndef GOLDOBJ u.ugold = u.ugold0 = rn1(1000, 1001); #else u.umoney0 = rn1(1000, 1001); #endif ini_inv(Healer); knows_class(POTION_CLASS); /* WAC - remove? */ knows_object(POT_SICKNESS); knows_object(POT_BLINDNESS); knows_object(POT_HALLUCINATION); knows_object(POT_RESTORE_ABILITY); knows_object(POT_FULL_HEALING); knows_object(HEALTHSTONE); /* KMH */ if(!rn2(5)) ini_inv(Lamp); if(!rn2(5)) ini_inv(Magicmarker); if(!rn2(5)) ini_inv(Blindfold); skill_init(Skill_H); break; case PM_ICE_MAGE: switch (rnd(2)) { case 1: Ice_Mage[I_BOOK].trotyp = SPE_CONFUSE_MONSTER; break; case 2: Ice_Mage[I_BOOK].trotyp = SPE_SLOW_MONSTER; break; default: break; } ini_inv(Ice_Mage); if(!rn2(5)) ini_inv(Lamp); else if(!rn2(5)) ini_inv(Blindfold); else if(!rn2(5)) ini_inv(Magicmarker); skill_init(Skill_I); break; case PM_KNIGHT: ini_inv(Knight); knows_class(WEAPON_CLASS); knows_class(ARMOR_CLASS); /* give knights chess-like mobility * -- idea from wooledge@skybridge.scl.cwru.edu */ HJumping |= FROMOUTSIDE; skill_init(Skill_K); break; case PM_MONK: switch (rn2(90) / 30) { case 0: Monk[M_BOOK].trotyp = SPE_HEALING; break; case 1: Monk[M_BOOK].trotyp = SPE_PROTECTION; break; case 2: Monk[M_BOOK].trotyp = SPE_SLEEP; break; } ini_inv(Monk); if(!rn2(5)) ini_inv(Magicmarker); else if(!rn2(10)) ini_inv(Lamp); knows_class(ARMOR_CLASS); skill_init(Skill_Mon); break; case PM_NECROMANCER: switch (rnd(5)) { case 1: Necromancer[N_BOOK].trotyp = SPE_FORCE_BOLT; break; case 2: Necromancer[N_BOOK].trotyp = SPE_KNOCK; break; case 3: Necromancer[N_BOOK].trotyp = SPE_MAGIC_MISSILE; break; case 4: Necromancer[N_BOOK].trotyp = SPE_CREATE_MONSTER; break; case 5: Necromancer[N_BOOK].trotyp = SPE_WIZARD_LOCK; break; default: break; } ini_inv(Necromancer); knows_class(SPBOOK_CLASS); if(!rn2(5)) ini_inv(Magicmarker); if(!rn2(5)) ini_inv(Blindfold); skill_init(Skill_N); break; case PM_PRIEST: switch (rnd(9)) { case 1: Priest[P_BOOK].trotyp = SPE_FORCE_BOLT; break; case 2: Priest[P_BOOK].trotyp = SPE_SLEEP; break; case 3: Priest[P_BOOK].trotyp = SPE_RESIST_POISON; break; case 4: Priest[P_BOOK].trotyp = SPE_RESIST_SLEEP; break; case 5: Priest[P_BOOK].trotyp = SPE_DETECT_FOOD; break; case 6: Priest[P_BOOK].trotyp = SPE_DETECT_MONSTERS; break; case 7: Priest[P_BOOK].trotyp = SPE_LIGHT; break; case 8: Priest[P_BOOK].trotyp = SPE_KNOCK; break; case 9: Priest[P_BOOK].trotyp = SPE_WIZARD_LOCK; break; default: break; } ini_inv(Priest); if(!rn2(10)) ini_inv(Magicmarker); else if(!rn2(10)) (rn2(100) > 50 ? ini_inv(Lamp) : ini_inv(Torch)); knows_object(POT_WATER); spellbook_skill_raise(Skill_P, Priest[P_BOOK].trotyp); skill_init(Skill_P); /* KMH, conduct -- * Some may claim that this isn't agnostic, since they * are literally "priests" and they have holy water. * But we don't count it as such. Purists can always * avoid playing priests and/or confirm another player's * role in their YAAP. */ break; case PM_RANGER: Ranger[RAN_TWO_ARROWS].trquan = rn1(10, 50); Ranger[RAN_ZERO_ARROWS].trquan = rn1(10, 30); ini_inv(Ranger); skill_init(Skill_Ran); break; case PM_ROGUE: Rogue[R_DAGGERS].trquan = rn1(10, 6); Rogue[R_DARTS].trquan = rn1(10, 25); #ifdef FIREARMS if (rn2(100) < 30) { Rogue[R_DAGGERS].trotyp = PISTOL; Rogue[R_DAGGERS].trquan = 1; Rogue[R_DARTS].trotyp = BULLET; } #endif #ifndef GOLDOBJ u.ugold = u.ugold0 = rn1(500 ,1500); #else u.umoney0 = rn1(500 ,1500); #endif ini_inv(Rogue); if(!rn2(5)) ini_inv(Blindfold); knows_object(OILSKIN_SACK); skill_init(Skill_R); break; case PM_SAMURAI: Samurai[S_ARROWS].trquan = rn1(20, 26); ini_inv(Samurai); if(!rn2(5)) ini_inv(Blindfold); knows_class(WEAPON_CLASS); knows_class(ARMOR_CLASS); skill_init(Skill_S); break; #ifdef TOURIST case PM_TOURIST: Tourist[T_DARTS].trquan = rn1(20, 21); #ifndef GOLDOBJ u.ugold = u.ugold0 = rn1(500,1000); #else u.umoney0 = rn1(500,1000); #endif ini_inv(Tourist); if(!rn2(25)) ini_inv(Tinopener); else if(!rn2(25)) ini_inv(Leash); else if(!rn2(25)) ini_inv(Towel); else if(!rn2(25)) ini_inv(Magicmarker); skill_init(Skill_T); break; #endif /* TOURIST */ case PM_UNDEAD_SLAYER: switch (rn2(100) / 25) { case 0: /* Pistol and silver bullets */ #ifdef FIREARMS UndeadSlayer[U_MINOR].trotyp = PISTOL; UndeadSlayer[U_RANGE].trotyp = SILVER_BULLET; UndeadSlayer[U_RANGE].trquan = rn1(10, 30); break; #endif case 1: /* Crossbow and bolts */ UndeadSlayer[U_MINOR].trotyp = CROSSBOW; UndeadSlayer[U_RANGE].trotyp = CROSSBOW_BOLT; UndeadSlayer[U_RANGE].trquan = rn1(10, 30); UndeadSlayer[U_MISC].trotyp = LOW_BOOTS; UndeadSlayer[U_MISC].trspe = 1; UndeadSlayer[U_ARMOR].trotyp = LEATHER_JACKET; UndeadSlayer[U_ARMOR].trspe = 1; /* helmet & armour are no longer candidates for * substitution for orcish versions so no extra * food should be given in compensation. */ if (Race_if(PM_ORC)) no_extra_food = TRUE; break; case 2: /* Whip and daggers */ UndeadSlayer[U_MINOR].trotyp = BULLWHIP; UndeadSlayer[U_MINOR].trspe = 2; break; case 3: /* Silver spear and daggers */ break; } ini_inv(UndeadSlayer); knows_class(WEAPON_CLASS); knows_class(ARMOR_CLASS); if(!rn2(6)) ini_inv(Lamp); skill_init(Skill_U); break; case PM_VALKYRIE: ini_inv(Valkyrie); if(!rn2(6)) (rn2(100) > 50 ? ini_inv(Lamp) : ini_inv(Torch)); knows_class(WEAPON_CLASS); knows_class(ARMOR_CLASS); skill_init(Skill_V); break; case PM_WIZARD: switch (rnd(2)) { case 1: Wizard[W_BOOK1].trotyp = SPE_FORCE_BOLT; break; case 2: Wizard[W_BOOK1].trotyp = SPE_SLEEP; break; default: break; } switch (rnd(2)) { case 1: Wizard[W_BOOK2].trotyp = SPE_RESIST_POISON; break; case 2: Wizard[W_BOOK2].trotyp = SPE_RESIST_SLEEP; break; default: break; } switch (rnd(5)) { case 1: Wizard[W_BOOK3].trotyp = SPE_DETECT_FOOD; break; case 2: Wizard[W_BOOK3].trotyp = SPE_DETECT_MONSTERS; break; case 3: Wizard[W_BOOK3].trotyp = SPE_LIGHT; break; case 4: Wizard[W_BOOK3].trotyp = SPE_KNOCK; break; case 5: Wizard[W_BOOK3].trotyp = SPE_WIZARD_LOCK; break; default: break; } switch (rnd(9)) { case 1: Wizard[W_BOOK4].trotyp = SPE_MAGIC_MISSILE; break; case 2: Wizard[W_BOOK4].trotyp = SPE_CONFUSE_MONSTER; break; case 3: Wizard[W_BOOK4].trotyp = SPE_SLOW_MONSTER; break; case 4: Wizard[W_BOOK4].trotyp = SPE_CURE_BLINDNESS; break; case 5: Wizard[W_BOOK4].trotyp = SPE_ENDURE_HEAT; break; case 6: Wizard[W_BOOK4].trotyp = SPE_ENDURE_COLD; break; case 7: Wizard[W_BOOK4].trotyp = SPE_INSULATE; break; case 8: Wizard[W_BOOK4].trotyp = SPE_CREATE_MONSTER; break; case 9: Wizard[W_BOOK4].trotyp = SPE_HEALING; break; default: break; } ini_inv(Wizard); knows_class(SPBOOK_CLASS); if(!rn2(5)) ini_inv(Magicmarker); if(!rn2(5)) ini_inv(Blindfold); skill_init(Skill_W); break; #ifdef YEOMAN case PM_YEOMAN: ini_inv(Yeoman); knows_class(WEAPON_CLASS); knows_class(ARMOR_CLASS); skill_init(Skill_Y); break; #endif default: /* impossible */ break; } /*** Race-specific initializations ***/ switch (Race_switch) { case PM_HUMAN: /* Nothing special */ break; case PM_ELF: /* * Elves are people of music and song, or they are warriors. * Non-warriors get an instrument. We use a kludge to * get only non-magic instruments. */ if (Role_if(PM_PRIEST) || Role_if(PM_WIZARD)) { static int trotyp[] = { WOODEN_FLUTE, TOOLED_HORN, WOODEN_HARP, BELL, BUGLE, LEATHER_DRUM }; Instrument[0].trotyp = trotyp[rn2(SIZE(trotyp))]; ini_inv(Instrument); } /* Elves can recognize all elvish objects */ knows_object(ELVEN_SHORT_SWORD); knows_object(ELVEN_ARROW); knows_object(ELVEN_BOW); knows_object(ELVEN_SPEAR); knows_object(ELVEN_DAGGER); knows_object(ELVEN_BROADSWORD); knows_object(ELVEN_MITHRIL_COAT); knows_object(ELVEN_LEATHER_HELM); knows_object(ELVEN_SHIELD); knows_object(ELVEN_BOOTS); knows_object(ELVEN_CLOAK); break; case PM_DROW: /* Drows can recognize all droven objects */ knows_object(DARK_ELVEN_SHORT_SWORD); knows_object(DARK_ELVEN_ARROW); knows_object(DARK_ELVEN_BOW); knows_object(DARK_ELVEN_DAGGER); knows_object(DARK_ELVEN_MITHRIL_COAT); break; case PM_DWARF: /* Dwarves can recognize all dwarvish objects */ knows_object(DWARVISH_SPEAR); knows_object(DWARVISH_SHORT_SWORD); knows_object(DWARVISH_MATTOCK); knows_object(DWARVISH_IRON_HELM); knows_object(DWARVISH_MITHRIL_COAT); knows_object(DWARVISH_CLOAK); knows_object(DWARVISH_ROUNDSHIELD); break; case PM_GNOME: break; case PM_HUMAN_WEREWOLF: u.ulycn = PM_WEREWOLF; /* u.nv_range = 2; u.uen = u.uenmax += 6; ini_inv(Lycanthrope);*/ break; case PM_ORC: /* compensate for generally inferior equipment */ if (!no_extra_food && !Role_if(PM_WIZARD) && !Role_if(PM_FLAME_MAGE) && !Role_if(PM_ICE_MAGE) && !Role_if(PM_NECROMANCER)) ini_inv(Xtra_food); /* Orcs can recognize all orcish objects */ knows_object(ORCISH_SHORT_SWORD); knows_object(ORCISH_ARROW); knows_object(ORCISH_BOW); knows_object(ORCISH_SPEAR); knows_object(ORCISH_DAGGER); knows_object(ORCISH_CHAIN_MAIL); knows_object(ORCISH_RING_MAIL); knows_object(ORCISH_HELM); knows_object(ORCISH_SHIELD); knows_object(URUK_HAI_SHIELD); knows_object(ORCISH_CLOAK); break; case PM_VAMPIRE: /* Vampires start off with gods not as pleased, luck penalty */ adjalign(-5); change_luck(-1); break; 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 temp = rn1(10,70); init_attr(temp); /* init attribute values */ find_ac(); /* get initial ac value */ max_rank_sz(); /* set max str size for class ranks */ /* * Do we really need this? */ for(i = 0; i < A_MAX; i++) if(!rn2(20)) { register int xd = rn2(7) - 2; /* biased variation */ (void) adjattrib(i, xd, TRUE); if (ABASE(i) < AMAX(i)) AMAX(i) = ABASE(i); } /* make sure you can carry all you have - especially for Tourists */ while (inv_weight() > 0) { if (adjattrib(A_STR, 1, TRUE)) continue; if (adjattrib(A_CON, 1, TRUE)) continue; /* only get here when didn't boost strength or constitution */ break; } return; } /* skills aren't initialized, so we use the role-specific skill lists */ STATIC_OVL boolean restricted_spell_discipline(otyp) int otyp; { const struct def_skill *skills; int this_skill = spell_skilltype(otyp); switch (Role_switch) { case PM_ARCHEOLOGIST: skills = Skill_A; break; case PM_BARBARIAN: skills = Skill_B; break; case PM_CAVEMAN: skills = Skill_C; break; case PM_HEALER: skills = Skill_H; break; case PM_KNIGHT: skills = Skill_K; break; case PM_MONK: skills = Skill_Mon; break; case PM_PRIEST: skills = Skill_P; break; case PM_RANGER: skills = Skill_Ran; break; case PM_ROGUE: skills = Skill_R; break; case PM_SAMURAI: skills = Skill_S; break; #ifdef TOURIST case PM_TOURIST: skills = Skill_T; break; #endif case PM_VALKYRIE: skills = Skill_V; break; case PM_WIZARD: skills = Skill_W; break; default: skills = 0; break; /* lint suppression */ } while (skills->skill != P_NONE) { if (skills->skill == this_skill) return FALSE; ++skills; } return TRUE; } STATIC_OVL void ini_inv(trop) register struct trobj *trop; { struct obj *obj; int otyp, i; while (trop->trclass) { if (trop->trotyp != UNDEF_TYP) { otyp = (int)trop->trotyp; if (urace.malenum != PM_HUMAN) { /* substitute specific items for generic ones */ for (i = 0; inv_subs[i].race_pm != NON_PM; ++i) if (inv_subs[i].race_pm == urace.malenum && otyp == inv_subs[i].item_otyp) { otyp = inv_subs[i].subs_otyp; break; } } for (i = 0; inv_asubs[i].align != A_NONE; ++i) if (inv_asubs[i].align == u.ualign.type && otyp == inv_asubs[i].item_otyp) { otyp = inv_asubs[i].subs_otyp; break; } obj = mksobj(otyp, TRUE, FALSE); } else { /* UNDEF_TYP */ static NEARDATA short nocreate = STRANGE_OBJECT; static NEARDATA short nocreate2 = STRANGE_OBJECT; static NEARDATA short nocreate3 = STRANGE_OBJECT; static NEARDATA short nocreate4 = STRANGE_OBJECT; /* * For random objects, do not create certain overly powerful * items: wand of wishing, ring of levitation, or the * polymorph/polymorph control combination. Specific objects, * i.e. the discovery wishing, are still OK. * Also, don't get a couple of really useless items. (Note: * punishment isn't "useless". Some players who start out with * one will immediately read it and use the iron ball as a * weapon.) */ obj = mkobj(trop->trclass, FALSE); otyp = obj->otyp; while (otyp == WAN_WISHING || otyp == nocreate || otyp == nocreate2 || otyp == nocreate3 || otyp == nocreate4 #ifdef ELBERETH || otyp == RIN_LEVITATION #endif || ((Role_if(PM_FLAME_MAGE) || Role_if(PM_ICE_MAGE)) && (otyp == RIN_FIRE_RESISTANCE || otyp == RIN_COLD_RESISTANCE || otyp == SPE_ENDURE_HEAT || otyp == SPE_ENDURE_COLD)) /* KMH -- Hobbits shouldn't get ring of invis. */ || (Role_if(PM_HOBBIT) && otyp == RIN_INVISIBILITY) /* KMH, balance patch -- now an amulet */ || (Role_if(PM_NECROMANCER) && otyp == AMULET_OF_DRAIN_RESISTANCE) /* 'useless' or over powerful items */ || otyp == POT_HALLUCINATION || otyp == POT_ACID || otyp == SCR_AMNESIA || otyp == SCR_FIRE || otyp == SCR_BLANK_PAPER || otyp == SPE_BLANK_PAPER || otyp == RIN_AGGRAVATE_MONSTER || otyp == RIN_HUNGER || otyp == RIN_SLEEPING || otyp == WAN_NOTHING /* Monks don't use weapons */ || (otyp == SCR_ENCHANT_WEAPON && Role_if(PM_MONK)) /* wizard patch -- they already have one */ || (otyp == SPE_FORCE_BOLT && Role_if(PM_WIZARD)) /* powerful spells are either useless to low level players or unbalancing; also spells in restricted skill categories */ || (obj->oclass == SPBOOK_CLASS && (objects[otyp].oc_level > 3 || restricted_spell_discipline(otyp))) ) { dealloc_obj(obj); obj = mkobj(trop->trclass, FALSE); otyp = obj->otyp; } /* Don't start with +0 or negative rings */ if (objects[otyp].oc_charged && obj->spe <= 0) obj->spe = rne(3); /* Heavily relies on the fact that 1) we create wands * before rings, 2) that we create rings before * spellbooks, and that 3) not more than 1 object of a * particular symbol is to be prohibited. (For more * objects, we need more nocreate variables...) */ switch (otyp) { case WAN_POLYMORPH: case RIN_POLYMORPH: case POT_POLYMORPH: nocreate = RIN_POLYMORPH_CONTROL; break; case RIN_POLYMORPH_CONTROL: nocreate = RIN_POLYMORPH; nocreate2 = SPE_POLYMORPH; nocreate3 = POT_POLYMORPH; } /* Don't have 2 of the same ring or spellbook */ if (obj->oclass == RING_CLASS || obj->oclass == SPBOOK_CLASS) nocreate4 = otyp; } #ifdef GOLDOBJ if (trop->trclass == COIN_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); /* Make the type known if necessary */ if (OBJ_DESCR(objects[otyp]) && obj->known) discover_object(otyp, TRUE, FALSE); if (otyp == OIL_LAMP) 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, TRUE); } else if (is_helmet(obj) && !uarmh) setworn(obj, W_ARMH); else if (is_gloves(obj) && !uarmg) setworn(obj, W_ARMG); #ifdef TOURIST else if (is_shirt(obj) && !uarmu) setworn(obj, W_ARMU); #endif else if (is_cloak(obj) && !uarmc) setworn(obj, W_ARMC); else if (is_boots(obj) && !uarmf) setworn(obj, W_ARMF); else if (is_suit(obj) && !uarm) setworn(obj, W_ARM); } if (obj->oclass == WEAPON_CLASS || is_weptool(obj) || otyp == TIN_OPENER || otyp == FLINT || otyp == ROCK) { if (is_ammo(obj) || is_missile(obj)) { if (!uquiver) setuqwep(obj); } else if (!uwep) setuwep(obj, FALSE); else if (!uswapwep) setuswapwep(obj, FALSE); } if (obj->oclass == SPBOOK_CLASS && obj->otyp != SPE_BLANK_PAPER) initialspell(obj); #if !defined(PYRAMID_BUG) && !defined(MAC) if(--trop->trquan) continue; /* make a similar object */ #else if(trop->trquan) { /* check if zero first */ --trop->trquan; if(trop->trquan) continue; /* make a similar object */ } #endif trop++; } } /*u_init.c*/ slashem-0.0.7E7F3/src/monmove.c0000664000076400007640000012667410545462317014307 0ustar aliali/* SCCS Id: @(#)monmove.c 3.4 2002/04/06 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" #include "mfndpos.h" #include "artifact.h" #include "epri.h" extern boolean notonhead; #ifdef OVL0 STATIC_DCL int FDECL(disturb,(struct monst *)); STATIC_DCL void FDECL(distfleeck,(struct monst *,int *,int *,int *)); STATIC_DCL int FDECL(m_arrival, (struct monst *)); STATIC_DCL void FDECL(watch_on_duty,(struct monst *)); /* WAC for breath door busting */ static int FDECL(bust_door_breath, (struct monst *)); #endif /* OVL0 */ #ifdef OVLB boolean /* TRUE : mtmp died */ mb_trapped(mtmp) register struct monst *mtmp; { if (flags.verbose) { if (cansee(mtmp->mx, mtmp->my)) pline("KABOOM!! You see a door explode."); else if (flags.soundok) You_hear("a distant explosion."); } wake_nearto(mtmp->mx, mtmp->my, 7*7); mtmp->mstun = 1; mtmp->mhp -= rnd(15); if(mtmp->mhp <= 0) { mondied(mtmp); if (mtmp->mhp > 0) /* lifesaved */ return(FALSE); else return(TRUE); } return(FALSE); } #endif /* OVLB */ #ifdef OVL0 STATIC_OVL void watch_on_duty(mtmp) register struct monst *mtmp; { int x, y; if(mtmp->mpeaceful && in_town(u.ux+u.dx, u.uy+u.dy) && mtmp->mcansee && m_canseeu(mtmp) && !rn2(3)) { if(picking_lock(&x, &y) && IS_DOOR(levl[x][y].typ) && (levl[x][y].doormask & D_LOCKED)) { if(couldsee(mtmp->mx, mtmp->my)) { pline("%s yells:", Amonnam(mtmp)); if(levl[x][y].looted & D_WARNED) { verbalize("Halt, thief! You're under arrest!"); (void) angry_guards(!(flags.soundok)); } else { int i; verbalize("Hey, stop picking that lock!"); /* [ALI] Since marking a door as warned will have * the side effect of trapping the door, it must be * included in the doors[] array in order that trap * detection will find it. */ for(i = doorindex - 1; i >= 0; i--) if (x == doors[i].x && y == doors[i].y) break; if (i < 0) i = add_door(x, y, (struct mkroom *)0); if (i >= 0) levl[x][y].looted |= D_WARNED; } stop_occupation(); } } else if (is_digging()) { /* chewing, wand/spell of digging are checked elsewhere */ watch_dig(mtmp, digging.pos.x, digging.pos.y, FALSE); } } } #endif /* OVL0 */ #ifdef OVL1 int dochugw(mtmp) register struct monst *mtmp; { register int x = mtmp->mx, y = mtmp->my; boolean already_saw_mon = !occupation ? 0 : canspotmon(mtmp); int rd = dochug(mtmp); #if 0 /* part of the original warning code which was replaced in 3.3.1 */ register struct permonst *mdat = mtmp->data; int dd; if(Warning && !rd && !mtmp->mpeaceful && (dd = distu(mtmp->mx,mtmp->my)) < distu(x,y) && dd < 100 && !canseemon(mtmp)) { /* Note: this assumes we only want to warn against the monster to * which the weapon does extra damage, as there is no "monster * which the weapon warns against" field. */ if (spec_ability(uwep, SPFX_WARN) && spec_dbon(uwep, mtmp, 1)) warnlevel = 100; else if ((int) (mtmp->m_lev / 4) > warnlevel) warnlevel = (mtmp->m_lev / 4); /* STEPHEN WHITE'S NEW CODE */ } else if(Undead_warning && !rd && !mtmp->mpeaceful && (dd = distu(mtmp->mx,mtmp->my)) < distu(x,y) && dd < 100 && !canseemon(mtmp) && is_undead(mdat)) { /* * The value of warnlevel coresponds to the 8 * cardinal directions, see mon.c. */ if(((mtmp->mx - u.ux) < 0) && ((mtmp->my - u.uy) < 0)) warnlevel = 101; if(((mtmp->mx - u.ux) == 0) && ((mtmp->my - u.uy) < 0)) warnlevel = 102; if(((mtmp->mx - u.ux) > 0) && ((mtmp->my - u.uy) < 0)) warnlevel = 103; if(((mtmp->mx - u.ux) < 0) && ((mtmp->my - u.uy) == 0)) warnlevel = 104; if(((mtmp->mx - u.ux) > 0) && ((mtmp->my - u.uy) == 0)) warnlevel = 105; if(((mtmp->mx - u.ux) < 0) && ((mtmp->my - u.uy) > 0)) warnlevel = 106; if(((mtmp->mx - u.ux) == 0) && ((mtmp->my - u.uy) > 0)) warnlevel = 107; if(((mtmp->mx - u.ux) > 0) && ((mtmp->my - u.uy) > 0)) warnlevel = 108; } #endif /* 0 */ /* a similar check is in monster_nearby() in hack.c */ /* check whether hero notices monster and stops current activity */ if (occupation && !rd && !Confusion && (!mtmp->mpeaceful || Hallucination) && /* it's close enough to be a threat */ distu(mtmp->mx,mtmp->my) <= (BOLT_LIM+1)*(BOLT_LIM+1) && /* and either couldn't see it before, or it was too far away */ (!already_saw_mon || !couldsee(x,y) || distu(x,y) > (BOLT_LIM+1)*(BOLT_LIM+1)) && /* can see it now, or sense it and would normally see it */ (canseemon(mtmp) || (sensemon(mtmp) && couldsee(mtmp->mx,mtmp->my))) && mtmp->mcanmove && !noattacks(mtmp->data) && !onscary(u.ux, u.uy, mtmp)) stop_occupation(); return(rd); } #endif /* OVL1 */ #ifdef OVL2 boolean onscary(x, y, mtmp) int x, y; struct monst *mtmp; { if (mtmp->isshk || mtmp->isgd || mtmp->iswiz || !mtmp->mcansee || mtmp->mpeaceful || mtmp->data->mlet == S_HUMAN || is_lminion(mtmp) || mtmp->data == &mons[PM_ANGEL] || mtmp->data == &mons[PM_CTHULHU] || is_rider(mtmp->data) || mtmp->data == &mons[PM_MINOTAUR]) return(FALSE); return (boolean)(sobj_at(SCR_SCARE_MONSTER, x, y) #ifdef ELBERETH || sengr_at("Elbereth", x, y) #endif || (is_vampire(mtmp->data) && IS_ALTAR(levl[x][y].typ))); } #endif /* OVL2 */ #ifdef OVL0 /* regenerate lost hit points */ void mon_regen(mon, digest_meal) struct monst *mon; boolean digest_meal; { if (mon->mhp < mon->mhpmax && !is_golem(mon->data) && (moves % 20 == 0 || regenerates(mon->data))) mon->mhp++; if (mon->m_en < mon->m_enmax && (moves % 20 == 0 || (rn2(mon->m_lev + 5) > 15))) { mon->m_en += rn1((mon->m_lev % 10 + 1),1); if (mon->m_en > mon->m_enmax) mon->m_en = mon->m_enmax; } if (mon->mspec_used) mon->mspec_used--; if (digest_meal) { if (mon->meating) mon->meating--; } } /* * Possibly awaken the given monster. Return a 1 if the monster has been * jolted awake. */ STATIC_OVL int disturb(mtmp) register struct monst *mtmp; { /* * + Ettins are hard to surprise. * + Nymphs, jabberwocks, and leprechauns do not easily wake up. * * Wake up if: * in direct LOS AND * within 10 squares AND * not stealthy or (mon is an ettin and 9/10) AND * (mon is not a nymph, jabberwock, or leprechaun) or 1/50 AND * Aggravate or mon is (dog or human) or * (1/7 and mon is not mimicing furniture or object) */ if(couldsee(mtmp->mx,mtmp->my) && distu(mtmp->mx,mtmp->my) <= 100 && (!Stealth || (mtmp->data == &mons[PM_ETTIN] && rn2(10))) && (!(mtmp->data->mlet == S_NYMPH || mtmp->data == &mons[PM_JABBERWOCK] || mtmp->data == &mons[PM_VORPAL_JABBERWOCK] #if 0 /* DEFERRED */ || mtmp->data == &mons[PM_VORPAL_JABBERWOCK] #endif || mtmp->data->mlet == S_LEPRECHAUN) || !rn2(50)) && (Aggravate_monster || (mtmp->data->mlet == S_DOG || mtmp->data->mlet == S_HUMAN) || (!rn2(7) && mtmp->m_ap_type != M_AP_FURNITURE && mtmp->m_ap_type != M_AP_OBJECT) )) { mtmp->msleeping = 0; return(1); } 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) && !mtmp->mfrozen) pline("%s turns to flee!", (Monnam(mtmp))); mtmp->mflee = 1; } } STATIC_OVL void distfleeck(mtmp,inrange,nearby,scared) register struct monst *mtmp; int *inrange, *nearby, *scared; { int seescaryx, seescaryy; *inrange = (dist2(mtmp->mx, mtmp->my, mtmp->mux, mtmp->muy) <= (BOLT_LIM * BOLT_LIM)); *nearby = *inrange && monnear(mtmp, mtmp->mux, mtmp->muy); /* Note: if your image is displaced, the monster sees the Elbereth * at your displaced position, thus never attacking your displaced * position, but possibly attacking you by accident. If you are * invisible, it sees the Elbereth at your real position, thus never * running into you by accident but possibly attacking the spot * where it guesses you are. */ if (!mtmp->mcansee || (Invis && !perceives(mtmp->data))) { seescaryx = mtmp->mux; seescaryy = mtmp->muy; } else { seescaryx = u.ux; seescaryy = u.uy; } *scared = (*nearby && (onscary(seescaryx, seescaryy, mtmp) || (!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); } } /* perform a special one-time action for a monster; returns -1 if nothing special happened, 0 if monster uses up its turn, 1 if monster is killed */ STATIC_OVL int m_arrival(mon) struct monst *mon; { mon->mstrategy &= ~STRAT_ARRIVE; /* always reset */ return -1; } /* returns 1 if monster died moving, 0 otherwise */ /* The whole dochugw/m_move/distfleeck/mfndpos section is serious spaghetti * code. --KAA */ int dochug(mtmp) register struct monst *mtmp; { register struct permonst *mdat; register int tmp=0; int inrange, nearby, scared; #ifdef GOLDOBJ struct obj *ygold = 0, *lepgold = 0; #endif /* Pre-movement adjustments */ mdat = mtmp->data; if (mtmp->mstrategy & STRAT_ARRIVE) { int res = m_arrival(mtmp); if (res >= 0) return res; } /* check for waitmask status change */ if ((mtmp->mstrategy & STRAT_WAITFORU) && (m_canseeu(mtmp) || mtmp->mhp < mtmp->mhpmax)) mtmp->mstrategy &= ~STRAT_WAITFORU; /* update quest status flags */ quest_stat_check(mtmp); if (!mtmp->mcanmove || (mtmp->mstrategy & STRAT_WAITMASK)) { if (Hallucination) newsym(mtmp->mx,mtmp->my); if (mtmp->mcanmove && (mtmp->mstrategy & STRAT_CLOSE) && !mtmp->msleeping && monnear(mtmp, u.ux, u.uy)) quest_talk(mtmp); /* give the leaders a chance to speak */ return(0); /* other frozen monsters can't do anything */ } /* there is a chance we will wake it */ if (mtmp->msleeping && !disturb(mtmp)) { if (Hallucination) newsym(mtmp->mx,mtmp->my); return(0); } /* not frozen or sleeping: wipe out texts written in the dust */ wipe_engr_at(mtmp->mx, mtmp->my, 1); /* confused monsters get unconfused with small probability */ if (mtmp->mconf && !rn2(50)) mtmp->mconf = 0; /* stunned monsters get un-stunned with larger probability */ if (mtmp->mstun && !rn2(10)) mtmp->mstun = 0; /* some monsters teleport */ if (mtmp->mflee && !rn2(40) && can_teleport(mdat) && !mtmp->iswiz && !level.flags.noteleport) { (void) rloc(mtmp, FALSE); return(0); } 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 */ /* fleeing monsters might regain courage */ if (mtmp->mflee && !mtmp->mfleetim && mtmp->mhp == mtmp->mhpmax && !rn2(25)) mtmp->mflee = 0; set_apparxy(mtmp); /* Must be done after you move and before the monster does. The * set_apparxy() call in m_move() doesn't suffice since the variables * inrange, etc. all depend on stuff set by set_apparxy(). */ /* Monsters that want to acquire things */ /* may teleport, so do it before inrange is set */ if(is_covetous(mdat)) (void) tactics(mtmp); /* check distance and scariness of attacks */ distfleeck(mtmp,&inrange,&nearby,&scared); if(find_defensive(mtmp)) { if (use_defensive(mtmp) != 0) return 1; } else if(find_misc(mtmp)) { if (use_misc(mtmp) != 0) return 1; } /* Demonic Blackmail! */ if(nearby && mdat->msound == MS_BRIBE && mtmp->mpeaceful && !mtmp->mtame && !u.uswallow) { if (mtmp->mux != u.ux || mtmp->muy != u.uy) { pline("%s whispers at thin air.", cansee(mtmp->mux, mtmp->muy) ? Monnam(mtmp) : "It"); if (is_demon(youmonst.data)) { /* "Good hunting, brother" */ if (!tele_restrict(mtmp)) (void) rloc(mtmp, FALSE); } else { mtmp->minvis = mtmp->perminvis = 0; /* Why? For the same reason in real demon talk */ pline("%s gets angry!", Amonnam(mtmp)); mtmp->mpeaceful = 0; /* since no way is an image going to pay it off */ } } else if(demon_talk(mtmp)) return(1); /* you paid it off */ } /* the watch will look around and see if you are up to no good :-) */ if (mdat == &mons[PM_WATCHMAN] || mdat == &mons[PM_WATCH_CAPTAIN]) watch_on_duty(mtmp); /* [DS] Cthulhu also uses psychic blasts */ else if ((is_mind_flayer(mdat) || mdat == &mons[PM_CTHULHU]) && !rn2(20)) { struct monst *m2, *nmon = (struct monst *)0; if (canseemon(mtmp)) pline("%s concentrates.", Monnam(mtmp)); if (distu(mtmp->mx, mtmp->my) > BOLT_LIM * BOLT_LIM) { You("sense a faint wave of psychic energy."); goto toofar; } pline("A wave of psychic energy pours over you!"); if (mtmp->mpeaceful && (!Conflict || resist(mtmp, RING_CLASS, 0, 0))) pline("It feels quite soothing."); else { register boolean m_sen = sensemon(mtmp); if (m_sen || (Blind_telepat && rn2(2)) || !rn2(10)) { int dmg; pline("It locks on to your %s!", m_sen ? "telepathy" : Blind_telepat ? "latent telepathy" : "mind"); dmg = (mdat == &mons[PM_CTHULHU])? rn1(10, 10) : rn1(4, 4); if (Half_spell_damage) dmg = (dmg+1) / 2; losehp(dmg, "psychic blast", KILLED_BY_AN); } } for(m2=fmon; m2; m2 = nmon) { nmon = m2->nmon; if (DEADMONSTER(m2)) continue; if (m2->mpeaceful == mtmp->mpeaceful) continue; if (mindless(m2->data)) continue; if (m2 == mtmp) continue; if ((telepathic(m2->data) && (rn2(2) || m2->mblinded)) || !rn2(10)) { if (cansee(m2->mx, m2->my)) pline("It locks on to %s.", mon_nam(m2)); m2->mhp -= rnd(15); if (m2->mhp <= 0) if (mtmp->uexp) mon_xkilled(m2, "", AD_DRIN); else 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. */ if((!mtmp->mpeaceful || Conflict) && inrange && dist2(mtmp->mx, mtmp->my, mtmp->mux, mtmp->muy) <= 8 && attacktype(mdat, AT_WEAP)) { struct obj *mw_tmp; /* The scared check is necessary. Otherwise a monster that is * one square near the player but fleeing into a wall would keep * switching between pick-axe and weapon. If monster is stuck * in a trap, prefer ranged weapon (wielding is done in thrwmu). * This may cost the monster an attack, but keeps the monster * from switching back and forth if carrying both. */ mw_tmp = MON_WEP(mtmp); if (!(scared && mw_tmp && is_pick(mw_tmp)) && mtmp->weapon_check == NEED_WEAPON && !(mtmp->mtrapped && !nearby && select_rwep(mtmp))) { mtmp->weapon_check = NEED_HTH_WEAPON; if (mon_wield_item(mtmp) != 0) return(0); } } /* 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 #ifdef BLACKMARKET && !Is_blackmarket(&u.uz) #endif ) || (!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) <= 49 && !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 */ switch (tmp) { 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. */ if(Hallucination) newsym(mtmp->mx,mtmp->my); break; case 1: /* monster moved */ /* Maybe it stepped on a trap and fell asleep... */ if (mtmp->msleeping || !mtmp->mcanmove) return(0); if(!nearby && (ranged_attk(mdat) || find_offensive(mtmp))) break; else if(u.uswallow && mtmp == u.ustuck) { /* a monster that's digesting you can move at the * same time -dlc */ return(mattacku(mtmp)); } else return(0); /*NOTREACHED*/ break; case 2: /* monster died */ return(1); } } /* Now, attack the player if possible - one attack set per monst */ if (!mtmp->mpeaceful || (Conflict && !resist(mtmp, RING_CLASS, 0, 0) #ifdef BLACKMARKET && !Is_blackmarket(&u.uz) #endif )) { if(inrange && !noattacks(mdat) && u.uhp > 0 && !scared && tmp != 3) if(mattacku(mtmp)) return(1); /* monster died (e.g. exploded) */ if(mtmp->wormno) wormhitu(mtmp); } /* special speeches for quest monsters */ if (!mtmp->msleeping && mtmp->mcanmove && nearby) quest_talk(mtmp); /* extra emotional attack for vile monsters */ if(inrange && mtmp->data->msound == MS_CUSS && !mtmp->mpeaceful && couldsee(mtmp->mx, mtmp->my) && !mtmp->minvis && !rn2(5)) cuss(mtmp); return(tmp == 2); } static NEARDATA const char practical[] = { WEAPON_CLASS, ARMOR_CLASS, GEM_CLASS, FOOD_CLASS, 0 }; static NEARDATA const char magical[] = { AMULET_CLASS, POTION_CLASS, SCROLL_CLASS, WAND_CLASS, RING_CLASS, SPBOOK_CLASS, 0 }; static NEARDATA const char indigestion[] = { BALL_CLASS, ROCK_CLASS, 0 }; static NEARDATA const char boulder_class[] = { ROCK_CLASS, 0 }; static NEARDATA const char gem_class[] = { GEM_CLASS, 0 }; boolean itsstuck(mtmp) register struct monst *mtmp; { if (sticks(youmonst.data) && mtmp==u.ustuck && !u.uswallow) { pline("%s cannot escape from you!", Monnam(mtmp)); return(TRUE); } return(FALSE); } /* Return values: * 0: did not move, but can still attack and do other stuff. * 1: moved, possibly can attack. * 2: monster died. * 3: did not move, and can't do anything else either. */ int m_move(mtmp, after) register struct monst *mtmp; register int after; { register int appr; xchar gx,gy,nix,niy,chcnt; int chi; /* could be schar except for stupid Sun-2 compiler */ 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 */ long info[9]; long flag; int omx = mtmp->mx, omy = mtmp->my; struct obj *mw_tmp; if(mtmp->mtrapped) { int i = mintrap(mtmp); if(i >= 2) { newsym(mtmp->mx,mtmp->my); return(2); }/* it died */ if(i == 1) return(0); /* still in trap, so didn't move */ } ptr = mtmp->data; /* mintrap() can change mtmp->data -dlc */ if (mtmp->meating) { mtmp->meating--; return 3; /* still eating */ } if (hides_under(ptr) && OBJ_AT(mtmp->mx, mtmp->my) && rn2(10)) return 0; /* do not leave hiding place */ set_apparxy(mtmp); /* where does mtmp think you are? */ /* Not necessary if m_move called from this file, but necessary in * other calls of m_move (ex. leprechauns dodging) */ #ifdef REINCARNATION if (!Is_rogue_level(&u.uz)) #endif can_tunnel = tunnels(ptr); can_open = !(nohands(ptr) || verysmall(ptr)); can_unlock = ((can_open && m_carrying(mtmp, SKELETON_KEY)) || mtmp->iswiz || is_rider(ptr)); /* doorbuster = is_giant(ptr);*/ /* WAC add dragon breath */ doorbuster = is_giant(ptr) || (bust_door_breath(mtmp) != -1); if(mtmp->wormno) goto not_special; /* my dog gets special treatment */ if(mtmp->mtame) { mmoved = dog_move(mtmp, after); goto postmov; } /* likewise for shopkeeper */ if(mtmp->isshk) { mmoved = shk_move(mtmp); if(mmoved == -2) return(2); if(mmoved >= 0) goto postmov; mmoved = 0; /* follow player outside shop */ } /* and for the guard */ if(mtmp->isgd) { mmoved = gd_move(mtmp); if(mmoved == -2) return(2); if(mmoved >= 0) goto postmov; mmoved = 0; } /* and the acquisitive monsters get special treatment */ if(is_covetous(ptr)) { xchar tx = STRAT_GOALX(mtmp->mstrategy), ty = STRAT_GOALY(mtmp->mstrategy); struct monst *intruder = m_at(tx, ty); /* * if there's a monster on the object or in possesion of it, * attack it. */ if((dist2(mtmp->mx, mtmp->my, tx, ty) < 2) && intruder && (intruder != mtmp)) { notonhead = (intruder->mx != tx || intruder->my != ty); if(mattackm(mtmp, intruder) == 2) return(2); mmoved = 1; } else mmoved = 0; goto postmov; } /* and for the priest */ if(mtmp->ispriest) { mmoved = pri_move(mtmp); if(mmoved == -2) return(2); if(mmoved >= 0) goto postmov; mmoved = 0; } #ifdef MAIL if(ptr == &mons[PM_MAIL_DAEMON]) { if(flags.soundok && canseemon(mtmp)) verbalize("I'm late!"); mongone(mtmp); return(2); } #endif /* teleport if that lies in our nature */ if(ptr == &mons[PM_TENGU] && !rn2(5) && !mtmp->mcan && !tele_restrict(mtmp)) { if(mtmp->mhp < 7 || mtmp->mpeaceful || rn2(2)) (void) rloc(mtmp, FALSE); else mnexto(mtmp); mmoved = 1; goto postmov; } not_special: if(u.uswallow && !mtmp->mflee && u.ustuck != mtmp) return(1); omx = mtmp->mx; omy = mtmp->my; gx = mtmp->mux; gy = mtmp->muy; appr = mtmp->mflee ? -1 : 1; 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) && (dist2(omx, omy, gx, gy) <= 36)); if (!mtmp->mcansee || (should_see && Invis && !perceives(ptr) && rn2(11)) || (youmonst.m_ap_type == M_AP_OBJECT && youmonst.mappearance == STRANGE_OBJECT) || u.uundetected || (youmonst.m_ap_type == M_AP_OBJECT && youmonst.mappearance == GOLD_PIECE && !likes_gold(ptr)) || (mtmp->mpeaceful && !mtmp->isshk) || /* allow shks to follow */ ((monsndx(ptr) == PM_STALKER || ptr->mlet == S_BAT || ptr->mlet == S_LIGHT) && !rn2(3))) 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)) { register coord *cp; cp = gettrack(omx,omy); if (cp) { gx = cp->x; gy = cp->y; } } } if ((!mtmp->mpeaceful || !rn2(10)) #ifdef REINCARNATION && (!Is_rogue_level(&u.uz)) #endif ) { boolean in_line = lined_up(mtmp) && (distmin(mtmp->mx, mtmp->my, mtmp->mux, mtmp->muy) <= (throws_rocks(youmonst.data) ? 20 : ACURRSTR/2+1) ); if (appr != 1 || !in_line) { /* Monsters in combat won't pick stuff up, avoiding the * situation where you toss arrows at it and it has nothing * better to do than pick the arrows up. */ 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); setlikes = TRUE; } } #define SQSRCHRADIUS 5 { register int minr = SQSRCHRADIUS; /* not too far away */ register struct obj *otmp; register int xx, yy; int oomx, oomy, lmx, lmy; /* cut down the search radius if it thinks character is closer. */ if(distmin(mtmp->mux, mtmp->muy, omx, omy) < SQSRCHRADIUS && !mtmp->mpeaceful) minr--; /* guards shouldn't get too distracted */ if(!mtmp->mpeaceful && is_mercenary(ptr)) minr = 1; if((likegold || likegems || likeobjs || likemagic || likerock || conceals) && (!*in_rooms(omx, omy, SHOPBASE) || (!rn2(25) && !mtmp->isshk))) { look_for_obj: oomx = min(COLNO-1, omx+minr); oomy = min(ROWNO-1, omy+minr); lmx = max(1, omx-minr); lmy = max(0, omy-minr); for(otmp = fobj; otmp; otmp = otmp->nobj) { /* monsters may pick rocks up, but won't go out of their way to grab them; this might hamper sling wielders, but it cuts down on move overhead by filtering out most common item */ if (otmp->otyp == ROCK) continue; xx = otmp->ox; yy = otmp->oy; /* Nymphs take everything. Most other creatures should not * pick up corpses except as a special case like in * searches_for_item(). We need to do this check in * mpickstuff() as well. */ if(xx >= lmx && xx <= oomx && yy >= lmy && yy <= oomy) { /* don't get stuck circling around an object that's underneath an immobile or hidden monster; paralysis victims excluded */ if ((mtoo = m_at(xx,yy)) != 0 && (mtoo->msleeping || mtoo->mundetected || (mtoo->mappearance && !mtoo->iswiz) || !mtoo->data->mmove)) continue; if(((likegold && otmp->oclass == COIN_CLASS) || (likeobjs && index(practical, otmp->oclass) && (otmp->otyp != CORPSE || (ptr->mlet == S_NYMPH && !is_rider(&mons[otmp->corpsenm])))) || (likemagic && index(magical, otmp->oclass)) || (uses_items && searches_for_item(mtmp, otmp)) || (likerock && otmp->otyp == BOULDER) || (likegems && otmp->oclass == GEM_CLASS && objects[otmp->otyp].oc_material != MINERAL) || (conceals && !cansee(otmp->ox,otmp->oy)) || (ptr == &mons[PM_GELATINOUS_CUBE] && !index(indigestion, otmp->oclass) && !(otmp->otyp == CORPSE && touch_petrifies(&mons[otmp->corpsenm]))) ) && touch_artifact(otmp,mtmp)) { if(can_carry(mtmp,otmp) && (throws_rocks(ptr) || !sobj_at(BOULDER,xx,yy)) && (!is_unicorn(ptr) || objects[otmp->otyp].oc_material == GEMSTONE) && /* Don't get stuck circling an Elbereth */ !(onscary(xx, yy, mtmp))) { minr = distmin(omx,omy,xx,yy); oomx = min(COLNO-1, omx+minr); oomy = min(ROWNO-1, omy+minr); lmx = max(1, omx-minr); lmy = max(0, omy-minr); gx = otmp->ox; gy = otmp->oy; if (gx == omx && gy == omy) { mmoved = 3; /* actually unnecessary */ goto postmov; } } } } } } else if(likegold) { /* don't try to pick up anything else, but use the same loop */ uses_items = 0; likegems = likeobjs = likemagic = likerock = conceals = 0; goto look_for_obj; } if(minr < SQSRCHRADIUS && appr == -1) { if(distmin(omx,omy,mtmp->mux,mtmp->muy) <= 3) { gx = mtmp->mux; gy = mtmp->muy; } else appr = 1; } } /* don't tunnel if hostile and close enough to prefer a weapon */ if (can_tunnel && needspick(ptr) && ((!mtmp->mpeaceful || Conflict) && dist2(mtmp->mx, mtmp->my, mtmp->mux, mtmp->muy) <= 8)) can_tunnel = FALSE; nix = omx; niy = omy; flag = 0L; if (mtmp->mpeaceful && (!Conflict || resist(mtmp, RING_CLASS, 0, 0))) 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 (passes_bars(ptr) && !In_sokoban(&u.uz)) flag |= ALLOW_BARS; if (can_tunnel) flag |= ALLOW_DIG; if (is_human(ptr) || ptr == &mons[PM_MINOTAUR]) flag |= ALLOW_SSM; if (is_undead(ptr) && ptr->mlet != S_GHOST) flag |= NOGARLIC; if (throws_rocks(ptr)) flag |= ALLOW_ROCK; if (can_open) flag |= OPENDOOR; if (can_unlock) flag |= UNLOCKDOOR; if (doorbuster) flag |= BUSTDOOR; { register int i, j, nx, ny, nearer; int jcnt, cnt; int ndist, nidist; register coord *mtrk; coord poss[9]; cnt = mfndpos(mtmp, poss, info, flag); chcnt = 0; jcnt = min(MTSZ, cnt-1); chi = -1; nidist = dist2(nix,niy,gx,gy); /* 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; if (appr != 0) { mtrk = &mtmp->mtrack[0]; for(j=0; j < jcnt; mtrk++, j++) if(nx == mtrk->x && ny == mtrk->y) if(rn2(4*(cnt-j))) goto nxti; } nearer = ((ndist = dist2(nx,ny,gx,gy)) < nidist); if((appr == 1 && nearer) || (appr == -1 && !nearer) || (!appr && !rn2(++chcnt)) || !mmoved) { nix = nx; niy = ny; nidist = ndist; chi = i; mmoved = 1; } nxti: ; } } if(mmoved) { register int j; if (mmoved==1 && (u.ux != nix || u.uy != niy) && itsstuck(mtmp)) return(3); if (((IS_ROCK(levl[nix][niy].typ) && may_dig(nix,niy)) || closed_door(nix, niy)) && mmoved==1 && can_tunnel && needspick(ptr)) { if (closed_door(nix, niy)) { if (!(mw_tmp = MON_WEP(mtmp)) || !is_pick(mw_tmp) || !is_axe(mw_tmp)) mtmp->weapon_check = NEED_PICK_OR_AXE; } else if (IS_TREE(levl[nix][niy].typ)) { if (!(mw_tmp = MON_WEP(mtmp)) || !is_axe(mw_tmp)) mtmp->weapon_check = NEED_AXE; } else if (!(mw_tmp = MON_WEP(mtmp)) || !is_pick(mw_tmp)) { mtmp->weapon_check = NEED_PICK_AXE; } if (mtmp->weapon_check >= NEED_PICK_AXE && mon_wield_item(mtmp)) return(3); } /* If ALLOW_U is set, either it's trying to attack you, or it * thinks it is. In either case, attack this spot in preference to * all others. */ /* Actually, this whole section of code doesn't work as you'd expect. * Most attacks are handled in dochug(). It calls distfleeck(), which * among other things sets nearby if the monster is near you--and if * nearby is set, we never call m_move unless it is a special case * (confused, stun, etc.) The effect is that this ALLOW_U (and * mfndpos) has no effect for normal attacks, though it lets a confused * monster attack you by accident. */ if(info[chi] & ALLOW_U) { nix = mtmp->mux; niy = mtmp->muy; } if (nix == u.ux && niy == u.uy) { mtmp->mux = u.ux; mtmp->muy = u.uy; return(0); } /* The monster may attack another based on 1 of 2 conditions: * 1 - It may be confused. * 2 - It may mistake the monster for your (displaced) image. * Pets get taken care of above and shouldn't reach this code. * Conflict gets handled even farther away (movemon()). */ if((info[chi] & ALLOW_M) || (nix == mtmp->mux && niy == mtmp->muy)) { struct monst *mtmp2; int mstatus; mtmp2 = m_at(nix,niy); notonhead = mtmp2 && (nix != mtmp2->mx || niy != mtmp2->my); /* note: mstatus returns 0 if mtmp2 is nonexistent */ mstatus = mattackm(mtmp, mtmp2); if (mstatus & MM_AGR_DIED) /* aggressor died */ return 2; if ((mstatus & MM_HIT) && !(mstatus & MM_DEF_DIED) && rn2(4) && mtmp2->movement >= NORMAL_SPEED) { mtmp2->movement -= NORMAL_SPEED; notonhead = 0; mstatus = mattackm(mtmp2, mtmp); /* return attack */ if (mstatus & MM_DEF_DIED) return 2; } return 3; } if (!m_in_out_region(mtmp,nix,niy)) return 3; remove_monster(omx, omy); place_monster(mtmp, nix, niy); for(j = MTSZ-1; j > 0; j--) mtmp->mtrack[j] = mtmp->mtrack[j-1]; mtmp->mtrack[0].x = omx; mtmp->mtrack[0].y = omy; /* Place a segment at the old position. */ if (mtmp->wormno) worm_move(mtmp); } else { if(is_unicorn(ptr) && rn2(2) && !tele_restrict(mtmp)) { (void) rloc(mtmp, FALSE); return(1); } if(mtmp->wormno) worm_nomove(mtmp); } postmov: if(mmoved == 1 || mmoved == 3) { boolean canseeit = cansee(mtmp->mx, mtmp->my); if(mmoved == 1) { newsym(omx,omy); /* update the old position */ if (mintrap(mtmp) >= 2) { if(mtmp->mx) newsym(mtmp->mx,mtmp->my); return(2); /* it died */ } ptr = mtmp->data; /* open a door, or crash through it, if you can */ if(IS_DOOR(levl[mtmp->mx][mtmp->my].typ) && !passes_walls(ptr) /* doesn't need to open doors */ && !can_tunnel /* taken care of below */ ) { struct rm *here = &levl[mtmp->mx][mtmp->my]; boolean btrapped = (here->doormask & D_TRAPPED); if(here->doormask & (D_LOCKED|D_CLOSED) && amorphous(ptr)) { if (flags.verbose && canseemon(mtmp)) pline("%s %s under the door.", Monnam(mtmp), (ptr == &mons[PM_FOG_CLOUD] || ptr == &mons[PM_YELLOW_LIGHT]) ? "flows" : "oozes"); } else if(here->doormask & D_LOCKED && can_unlock) { if(btrapped) { here->doormask = D_NODOOR; newsym(mtmp->mx, mtmp->my); unblock_point(mtmp->mx,mtmp->my); /* vision */ if(mb_trapped(mtmp)) return(2); } else { if (flags.verbose) { if (canseeit) You("see a door unlock and open."); else if (flags.soundok) You_hear("a door unlock and open."); } here->doormask = D_ISOPEN; /* newsym(mtmp->mx, mtmp->my); */ unblock_point(mtmp->mx,mtmp->my); /* vision */ } } else if (here->doormask == D_CLOSED && can_open) { if(btrapped) { here->doormask = D_NODOOR; newsym(mtmp->mx, mtmp->my); unblock_point(mtmp->mx,mtmp->my); /* vision */ if(mb_trapped(mtmp)) return(2); } else { if (flags.verbose) { if (canseeit) You("see a door open."); else if (flags.soundok) You_hear("a door open."); } here->doormask = D_ISOPEN; /* newsym(mtmp->mx, mtmp->my); */ /* done below */ unblock_point(mtmp->mx,mtmp->my); /* vision */ } } else if (here->doormask & (D_LOCKED|D_CLOSED)) { /* mfndpos guarantees this must be a doorbuster */ /* WAC do dragons and breathers */ if (bust_door_breath(mtmp) != -1) { (void) breamspot(mtmp, &ptr->mattk[bust_door_breath(mtmp)], (nix-omx), (niy-omy)); } else if(btrapped) { here->doormask = D_NODOOR; newsym(mtmp->mx, mtmp->my); unblock_point(mtmp->mx,mtmp->my); /* vision */ if(mb_trapped(mtmp)) return(2); } else { if (flags.verbose) { if (canseeit) You("see a door crash open."); else if (flags.soundok) You_hear("a door crash open."); } if (here->doormask & D_LOCKED && !rn2(2)) here->doormask = D_NODOOR; else here->doormask = D_BROKEN; /* newsym(mtmp->mx, mtmp->my); */ /* done below */ unblock_point(mtmp->mx,mtmp->my); /* vision */ } /* if it's a shop door, schedule repair */ if (*in_rooms(mtmp->mx, mtmp->my, SHOPBASE)) add_damage(mtmp->mx, mtmp->my, 0L); } } else if (levl[mtmp->mx][mtmp->my].typ == IRONBARS) { if (flags.verbose && canseemon(mtmp)) Norep("%s %s %s the iron bars.", Monnam(mtmp), /* pluralization fakes verb conjugation */ makeplural(locomotion(ptr, "pass")), passes_walls(ptr) ? "through" : "between"); } /* possibly dig */ if (can_tunnel && mdig_tunnel(mtmp)) return(2); /* mon died (position already updated) */ /* set also in domove(), hack.c */ if (u.uswallow && mtmp == u.ustuck && (mtmp->mx != omx || mtmp->my != omy)) { /* If the monster moved, then update */ u.ux0 = u.ux; u.uy0 = u.uy; u.ux = mtmp->mx; u.uy = mtmp->my; swallowed(0); } else 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); /* Maybe a cube ate just about anything */ /* KMH -- Taz likes organics, too! */ if (ptr == &mons[PM_GELATINOUS_CUBE] || ptr == &mons[PM_TASMANIAN_DEVIL]) { if (meatobj(mtmp) == 2) return 2; /* it died */ } if (ptr == &mons[PM_GHOUL] || ptr == &mons[PM_GHAST]) meatcorpse(mtmp); if(!*in_rooms(mtmp->mx, mtmp->my, SHOPBASE) || !rn2(25)) { boolean picked = FALSE; if(likeobjs) picked |= mpickstuff(mtmp, practical); if(likemagic) picked |= mpickstuff(mtmp, magical); if(likerock) picked |= mpickstuff(mtmp, boulder_class); if(likegems) picked |= mpickstuff(mtmp, gem_class); if(uses_items) picked |= mpickstuff(mtmp, (char *)0); if(picked) mmoved = 3; } if(mtmp->minvis) { newsym(mtmp->mx, mtmp->my); if (mtmp->wormno) see_wsegs(mtmp); } } if(hides_under(ptr) || ptr->mlet == S_EEL) { /* Always set--or reset--mundetected if it's already hidden (just in case the object it was hiding under went away); usually set mundetected unless monster can't move. */ if (mtmp->mundetected || (mtmp->mcanmove && !mtmp->msleeping && rn2(5))) mtmp->mundetected = (ptr->mlet != S_EEL) ? OBJ_AT(mtmp->mx, mtmp->my) : (is_pool(mtmp->mx, mtmp->my) && !Is_waterlevel(&u.uz)); newsym(mtmp->mx, mtmp->my); } if (mtmp->isshk) { after_shk_move(mtmp); } } return(mmoved); } #endif /* OVL0 */ #ifdef OVL2 boolean closed_door(x, y) register int x, y; { return((boolean)(IS_DOOR(levl[x][y].typ) && (levl[x][y].doormask & (D_LOCKED | D_CLOSED)))); } boolean accessible(x, y) register int x, y; { return((boolean)(ACCESSIBLE(levl[x][y].typ) && !closed_door(x, y))); } #endif /* OVL2 */ #ifdef OVL0 /* decide where the monster thinks you are standing */ void set_apparxy(mtmp) register struct monst *mtmp; { 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 */ /* pet knows your smell; grabber still has hold of you */ if (mtmp->mtame || mtmp == u.ustuck) goto found_you; /* monsters which know where you are don't suddenly forget, if you haven't moved away */ if (mx == u.ux && my == u.uy) goto found_you; 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. are too powerful */ gotu = notseen ? !rn2(3) : Displaced ? !rn2(4) : FALSE; #if 0 /* this never worked as intended & isn't needed anyway */ /* If invis but not displaced, staying around gets you 'discovered' */ gotu |= (!Displaced && u.dx == 0 && u.dy == 0); #endif if (!gotu) { register int try_cnt = 0; do { if (++try_cnt > 200) goto found_you; /* punt */ mx = u.ux - disp + rn2(2*disp+1); my = u.uy - disp + rn2(2*disp+1); } while (!isok(mx,my) || (disp != 2 && mx == mtmp->mx && my == mtmp->my) || ((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; my = u.uy; } mtmp->mux = mx; mtmp->muy = my; } boolean can_ooze(mtmp) struct monst *mtmp; { struct obj *chain, *obj; 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 == COIN_CLASS && obj->quan > 100L) return FALSE; #endif if (obj->oclass != GEM_CLASS && !(typ >= ARROW && typ <= BOOMERANG) && !(typ >= DAGGER && typ <= CRYSKNIFE) && typ != SLING && !is_cloak(obj) && typ != FEDORA && !is_gloves(obj) && typ != LEATHER_JACKET && #ifdef TOURIST typ != CREDIT_CARD && !is_shirt(obj) && #endif !(typ == CORPSE && verysmall(&mons[obj->corpsenm])) && typ != FORTUNE_COOKIE && typ != CANDY_BAR && typ != PANCAKE && typ != LEMBAS_WAFER && typ != LUMP_OF_ROYAL_JELLY && obj->oclass != AMULET_CLASS && obj->oclass != RING_CLASS && #ifdef WIZARD obj->oclass != VENOM_CLASS && #endif typ != SACK && typ != BAG_OF_HOLDING && typ != BAG_OF_TRICKS && !Is_candle(obj) && typ != OILSKIN_SACK && typ != LEASH && typ != STETHOSCOPE && typ != BLINDFOLD && typ != TOWEL && typ != TIN_WHISTLE && typ != MAGIC_WHISTLE && typ != MAGIC_MARKER && typ != TIN_OPENER && typ != SKELETON_KEY && typ != LOCK_PICK ) return FALSE; if (Is_container(obj) && obj->cobj) return FALSE; } return TRUE; } static int bust_door_breath(mtmp) register struct monst *mtmp; { struct permonst *ptr = mtmp->data; int i; if (mtmp->mcan || mtmp->mspec_used) return (-1); /* Cancelled/used up */ for(i = 0; i < NATTK; i++) if ((ptr->mattk[i].aatyp == AT_BREA) && (ptr->mattk[i].adtyp == AD_ACID || ptr->mattk[i].adtyp == AD_MAGM || ptr->mattk[i].adtyp == AD_DISN || ptr->mattk[i].adtyp == AD_ELEC || ptr->mattk[i].adtyp == AD_FIRE || ptr->mattk[i].adtyp == AD_COLD)) return(i); return(-1); } #endif /* OVL0 */ /*monmove.c*/ slashem-0.0.7E7F3/src/topten.c0000644000076400007640000007126310545462317014127 0ustar aliali/* 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. */ #include "hack.h" #include "dlb.h" #ifdef SHORT_FILENAMES #include "patchlev.h" #else #include "patchlevel.h" #endif #ifdef VMS /* We don't want to rewrite the whole file, because that entails */ /* creating a new version which requires that the old one be deletable. */ # define UPDATE_RECORD_IN_PLACE #endif /* * Updating in place can leave junk at the end of the file in some * circumstances (if it shrinks and the O.S. doesn't have a straightforward * way to truncate it). The trailing junk is harmless and the code * which reads the scores will ignore it. */ #ifdef UPDATE_RECORD_IN_PLACE static long final_fpos; #endif #define done_stopprint program_state.stopprint #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 */ #define ENTRYMAX 100 /* must be >= 10 */ #if !defined(MICRO) && !defined(MAC) && !defined(WIN32) #define PERS_IS_UID /* delete for PERSMAX per name; now per uid */ #endif struct toptenentry { struct toptenentry *tt_next; #ifdef UPDATE_RECORD_IN_PLACE long fpos; #endif long points; int deathdnum, deathlev; int maxlvl, hp, maxhp, deaths; int ver_major, ver_minor, patchlevel; long deathdate, birthdate; #ifdef RECORD_CONDUCT long conduct; #endif int uid; char plrole[ROLESZ+1]; char plrace[ROLESZ+1]; char plgend[ROLESZ+1]; char plalign[ROLESZ+1]; char name[NAMSZ+1]; char death[DTHSZ+1]; } *tt_head; STATIC_DCL void FDECL(topten_print, (const char *)); STATIC_DCL void FDECL(topten_print_bold, (const char *)); STATIC_DCL xchar FDECL(observable_depth, (d_level *)); STATIC_DCL void NDECL(outheader); STATIC_DCL void FDECL(outentry, (int,struct toptenentry *,BOOLEAN_P)); STATIC_DCL void FDECL(readentry, (FILE *,struct toptenentry *)); STATIC_DCL void FDECL(writeentry, (FILE *,struct toptenentry *)); STATIC_DCL void FDECL(free_ttlist, (struct toptenentry *)); STATIC_DCL int FDECL(classmon, (char *,BOOLEAN_P)); STATIC_DCL int FDECL(score_wanted, (BOOLEAN_P, int,struct toptenentry *,int,const char **,int)); #ifdef RECORD_CONDUCT STATIC_DCL long FDECL(encodeconduct, (void)); #endif #ifdef NO_SCAN_BRACK STATIC_DCL void FDECL(nsb_mung_line,(char*)); STATIC_DCL void FDECL(nsb_unmung_line,(char*)); #endif /* must fit with end.c; used in rip.c */ NEARDATA const char * const killed_by_prefix[] = { "killed by ", "betrayed by ", "choked on ", "poisoned by ", "died of ", "drowned in ", "burned by ", "dissolved in ", "crushed to death by ", "petrified by ", "turned to slime by ", "killed by ", "", "", "", "", "" }; static winid toptenwin = WIN_ERR; STATIC_OVL void topten_print(x) const char *x; { if (toptenwin == WIN_ERR) raw_print(x); else putstr(toptenwin, ATR_NONE, x); } STATIC_OVL void topten_print_bold(x) const char *x; { if (toptenwin == WIN_ERR) raw_print_bold(x); else putstr(toptenwin, ATR_BOLD, x); } STATIC_OVL xchar observable_depth(lev) d_level *lev; { #if 0 /* if we ever randomize the order of the elemental planes, we must use a constant external representation in the record file */ if (In_endgame(lev)) { if (Is_astralevel(lev)) return -5; else if (Is_waterlevel(lev)) return -4; else if (Is_firelevel(lev)) return -3; else if (Is_airlevel(lev)) return -2; else if (Is_earthlevel(lev)) return -1; else return 0; /* ? */ } else #endif return depth(lev); } #ifdef RECORD_CONDUCT long encodeconduct(void) { long e = 0L; if(u.uconduct.unvegetarian) e |= 0x1L; if(u.uconduct.unvegan) e |= 0x2L; if(u.uconduct.food) e |= 0x4L; if(u.uconduct.gnostic) e |= 0x8L; if(u.uconduct.weaphit) e |= 0x10L; if(u.uconduct.killer) e |= 0x20L; if(u.uconduct.literate) e |= 0x40L; if(u.uconduct.polypiles) e |= 0x80L; if(u.uconduct.polyselfs) e |= 0x100L; if(u.uconduct.wishes) e |= 0x200L; if(u.uconduct.wisharti) e |= 0x400L; if(num_genocides()) e |= 0x800L; return e; } #endif STATIC_OVL void readentry(rfile,tt) FILE *rfile; struct toptenentry *tt; { #ifdef NO_SCAN_BRACK /* Version_ Pts DgnLevs_ Hp___ Died__Born id */ static const char fmt[] = "%d %d %d %ld %d %d %d %d %d %d %ld %ld %d%*c"; static const char fmt005[] = "%s %c %s %s%*c"; static const char fmt33[] = "%s %s %s %s %s %s%*c"; #else static const char fmt[] = "%d.%d.%d %ld %d %d %d %d %d %d %ld %ld %d "; static const char fmt005[] = "%s %c %[^,],%[^\n]%*c"; static const char fmt33[] = "%s %s %s %s %[^,],%[^\n]%*c"; #endif #ifdef UPDATE_RECORD_IN_PLACE /* note: fscanf() below must read the record's terminating newline */ final_fpos = tt->fpos = ftell(rfile); #endif #define TTFIELDS 13 #ifdef RECORD_CONDUCT tt->conduct = 4095; #endif if(fscanf(rfile, fmt, &tt->ver_major, &tt->ver_minor, &tt->patchlevel, &tt->points, &tt->deathdnum, &tt->deathlev, &tt->maxlvl, &tt->hp, &tt->maxhp, &tt->deaths, &tt->deathdate, &tt->birthdate, &tt->uid) != TTFIELDS) #undef TTFIELDS tt->points = 0; else { /* Check for backwards compatibility */ if (!tt->ver_major && !tt->ver_minor && tt->patchlevel < 6) { int i; if (fscanf(rfile, fmt005, tt->plrole, tt->plgend, tt->name, tt->death) != 4) tt->points = 0; tt->plrole[1] = '\0'; if ((i = str2role(tt->plrole)) >= 0) Strcpy(tt->plrole, roles[i].filecode); tt->plrole[ROLESZ] = 0; Strcpy(tt->plrace, "?"); Strcpy(tt->plgend, (tt->plgend[0] == 'M') ? "Mal" : "Fem"); Strcpy(tt->plalign, "?"); } else if (fscanf(rfile, fmt33, tt->plrole, tt->plrace, tt->plgend, tt->plalign, tt->name, tt->death) != 6) tt->points = 0; #ifdef NO_SCAN_BRACK if(tt->points > 0) { nsb_unmung_line(tt->name); nsb_unmung_line(tt->death); } #endif #ifdef RECORD_CONDUCT if(tt->points > 0) { /* If the string "Conduct=%d" appears, set tt->conduct and remove that * portion of the string */ char *dp, *dp2; for(dp = tt->death; *dp; dp++) { if(!strncmp(dp, " Conduct=", 9)) { dp2 = dp + 9; sscanf(dp2, "%d", &tt->conduct); /* Find trailing null or space */ while(*dp2 && *dp2 != ' ') dp2++; /* Cut out the " Conduct=" portion of the death string */ while(*dp2) { *dp = *dp2; dp2++; dp++; } *dp = *dp2; } } /* Sanity check */ if(tt->conduct < 0 || tt->conduct > 4095) tt->conduct = 4095; } #endif } /* check old score entries for Y2K problem and fix whenever found */ if (tt->points > 0) { if (tt->birthdate < 19000000L) tt->birthdate += 19000000L; if (tt->deathdate < 19000000L) tt->deathdate += 19000000L; } } STATIC_OVL void writeentry(rfile,tt) FILE *rfile; struct toptenentry *tt; { #ifdef RECORD_CONDUCT char *cp = eos(tt->death); /* Add a trailing " Conduct=%d" to tt->death */ Sprintf(cp, " Conduct=%d", tt->conduct); #endif #ifdef NO_SCAN_BRACK nsb_mung_line(tt->name); nsb_mung_line(tt->death); /* Version_ Pts DgnLevs_ Hp___ Died__Born id */ (void) fprintf(rfile,"%d %d %d %ld %d %d %d %d %d %d %ld %ld %d ", #else (void) fprintf(rfile,"%d.%d.%d %ld %d %d %d %d %d %d %ld %ld %d ", #endif tt->ver_major, tt->ver_minor, tt->patchlevel, tt->points, tt->deathdnum, tt->deathlev, tt->maxlvl, tt->hp, tt->maxhp, tt->deaths, tt->deathdate, tt->birthdate, tt->uid); if (!tt->ver_major && !tt->ver_minor && tt->patchlevel < 6) #ifdef NO_SCAN_BRACK (void) fprintf(rfile,"%s %c %s %s\n", #else (void) fprintf(rfile,"%s %c %s,%s\n", #endif tt->plrole, tt->plgend[0], onlyspace(tt->name) ? "_" : tt->name, tt->death); else #ifdef NO_SCAN_BRACK (void) fprintf(rfile,"%s %s %s %s %s %s\n", #else (void) fprintf(rfile,"%s %s %s %s %s,%s\n", #endif tt->plrole, tt->plrace, tt->plgend, tt->plalign, onlyspace(tt->name) ? "_" : tt->name, tt->death); #ifdef NO_SCAN_BRACK nsb_unmung_line(tt->name); nsb_unmung_line(tt->death); #endif #ifdef RECORD_CONDUCT /* Return the tt->death line to the original form */ *cp = '\0'; #endif } STATIC_OVL void free_ttlist(tt) struct toptenentry *tt; { struct toptenentry *ttnext; while (tt->points > 0) { ttnext = tt->tt_next; dealloc_ttentry(tt); tt = ttnext; } dealloc_ttentry(tt); } void topten(how) int how; { int uid = getuid(); int rank, rank0 = -1, rank1 = 0; int occ_cnt = PERSMAX; register struct toptenentry *t0, *tprev; struct toptenentry *t1; FILE *rfile; register int flg = 0; boolean t0_used; #ifdef LOGFILE FILE *lfile; #endif /* LOGFILE */ /* Under DICE 3.0, this crashes the system consistently, apparently due to * corruption of *rfile somewhere. Until I figure this out, just cut out * topten support entirely - at least then the game exits cleanly. --AC */ #ifdef _DCC 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); } #if defined(UNIX) || defined(VMS) || defined(__EMX__) #define HUP if (!program_state.done_hup) #else #define HUP #endif #ifdef TOS restore_colors(); /* make sure the screen is black on white */ #endif /* create a new 'topten' entry */ t0_used = FALSE; t0 = newttentry(); /* deepest_lev_reached() is in terms of depth(), and reporting the * deepest level reached in the dungeon death occurred in doesn't * seem right, so we have to report the death level in depth() terms * as well (which also seems reasonable since that's all the player * sees on the screen anyway) */ t0->ver_major = VERSION_MAJOR; t0->ver_minor = VERSION_MINOR; t0->patchlevel = PATCHLEVEL; t0->points = u.urexp; t0->deathdnum = u.uz.dnum; t0->deathlev = observable_depth(&u.uz); t0->maxlvl = deepest_lev_reached(TRUE); t0->hp = u.uhp; t0->maxhp = u.uhpmax; t0->deaths = u.umortality; t0->uid = uid; (void) strncpy(t0->plrole, urole.filecode, ROLESZ); t0->plrole[ROLESZ] = '\0'; (void) strncpy(t0->plrace, urace.filecode, ROLESZ); t0->plrace[ROLESZ] = '\0'; (void) strncpy(t0->plgend, genders[flags.female].filecode, ROLESZ); t0->plgend[ROLESZ] = '\0'; (void) strncpy(t0->plalign, aligns[1-u.ualign.type].filecode, ROLESZ); t0->plalign[ROLESZ] = '\0'; (void) strncpy(t0->name, plname, NAMSZ); t0->name[NAMSZ] = '\0'; t0->death[0] = '\0'; switch (killer_format) { default: impossible("bad killer format?"); case KILLED_BY_AN: Strcat(t0->death, killed_by_prefix[how]); (void) strncat(t0->death, an(killer), DTHSZ-strlen(t0->death)); break; case KILLED_BY: Strcat(t0->death, killed_by_prefix[how]); (void) strncat(t0->death, killer, DTHSZ-strlen(t0->death)); break; case NO_KILLER_PREFIX: (void) strncat(t0->death, killer, DTHSZ); break; } t0->birthdate = yyyymmdd(u.ubirthday); t0->deathdate = yyyymmdd((time_t)0L); #ifdef RECORD_CONDUCT t0->conduct = encodeconduct(); #endif t0->tt_next = 0; #ifdef UPDATE_RECORD_IN_PLACE t0->fpos = -1L; #endif #ifdef LOGFILE /* used for debugging (who dies of what, where) */ #ifdef FILE_AREAS if (lock_file_area(LOGAREA, LOGFILE, 10)) { #else if (lock_file(LOGFILE, SCOREPREFIX, 10)) { #endif if(!(lfile = fopen_datafile_area(LOGAREA, LOGFILE, "a", SCOREPREFIX))) { HUP raw_print("Cannot open log file!"); } else { writeentry(lfile, t0); (void) fclose(lfile); } unlock_file_area(LOGAREA, LOGFILE); } #endif /* LOGFILE */ if (wizard || discover) { if (how != PANICKED) HUP { char pbuf[BUFSZ]; topten_print(""); Sprintf(pbuf, "Since you were in %s mode, the score list will not be checked.", wizard ? "wizard" : "discover"); topten_print(pbuf); } goto showwin; } #ifdef FILE_AREAS if (!lock_file_area(NH_RECORD_AREA, NH_RECORD, 60)) #else if (!lock_file(NH_RECORD, SCOREPREFIX, 60)) #endif goto destroywin; #ifdef UPDATE_RECORD_IN_PLACE rfile = fopen_datafile_area(NH_RECORD_AREA, NH_RECORD, "r+", SCOREPREFIX); #else rfile = fopen_datafile_area(NH_RECORD_AREA, NH_RECORD, "r", SCOREPREFIX); #endif if (!rfile) { HUP raw_print("Cannot open record file!"); unlock_file_area(NH_RECORD_AREA, NH_RECORD); goto destroywin; } HUP topten_print(""); /* assure minimum number of points */ if(t0->points < POINTSMIN) t0->points = 0; t1 = tt_head = newttentry(); tprev = 0; /* rank0: -1 undefined, 0 not_on_list, n n_th on list */ for(rank = 1; ; ) { readentry(rfile, t1); if (t1->points < POINTSMIN) t1->points = 0; if(rank0 < 0 && t1->points < t0->points) { rank0 = rank++; if(tprev == 0) tt_head = t0; else tprev->tt_next = t0; t0->tt_next = t1; #ifdef UPDATE_RECORD_IN_PLACE t0->fpos = t1->fpos; /* insert here */ #endif t0_used = TRUE; occ_cnt--; flg++; /* ask for a rewrite */ } else tprev = t1; if(t1->points == 0) break; if( #ifdef PERS_IS_UID t1->uid == t0->uid && #else strncmp(t1->name, t0->name, NAMSZ) == 0 && #endif !strncmp(t1->plrole, t0->plrole, ROLESZ) && --occ_cnt <= 0) { if(rank0 < 0) { rank0 = 0; rank1 = rank; HUP { char pbuf[BUFSZ]; Sprintf(pbuf, "You didn't beat your previous score of %ld points.", t1->points); topten_print(pbuf); topten_print(""); } } if(occ_cnt < 0) { flg++; continue; } } if(rank <= ENTRYMAX) { t1->tt_next = newttentry(); t1 = t1->tt_next; rank++; } if(rank > ENTRYMAX) { t1->points = 0; break; } } if(flg) { /* rewrite record file */ #ifdef UPDATE_RECORD_IN_PLACE (void) fseek(rfile, (t0->fpos >= 0 ? t0->fpos : final_fpos), SEEK_SET); #else (void) fclose(rfile); if(!(rfile = fopen_datafile_area(NH_RECORD_AREA, NH_RECORD, "w", SCOREPREFIX))){ HUP raw_print("Cannot write record file"); unlock_file_area(NH_RECORD_AREA, NH_RECORD); free_ttlist(tt_head); goto destroywin; } #endif /* UPDATE_RECORD_IN_PLACE */ if(!done_stopprint) if(rank0 > 0){ if(rank0 <= 10) topten_print("You made the top ten list!"); else { char pbuf[BUFSZ]; Sprintf(pbuf, "You reached the %d%s place on the top %d list.", rank0, ordin(rank0), ENTRYMAX); topten_print(pbuf); } topten_print(""); } } if(rank0 == 0) rank0 = rank1; if(rank0 <= 0) rank0 = rank; if(!done_stopprint) outheader(); t1 = tt_head; for(rank = 1; t1->points != 0; rank++, t1 = t1->tt_next) { if(flg #ifdef UPDATE_RECORD_IN_PLACE && rank >= rank0 #endif ) writeentry(rfile, t1); if (done_stopprint) continue; if (rank > flags.end_top && (rank < rank0 - flags.end_around || rank > rank0 + flags.end_around) && (!flags.end_own || #ifdef PERS_IS_UID t1->uid != t0->uid #else strncmp(t1->name, t0->name, NAMSZ) #endif )) continue; if (rank == rank0 - flags.end_around && rank0 > flags.end_top + flags.end_around + 1 && !flags.end_own) topten_print(""); if(rank != rank0) outentry(rank, t1, FALSE); else if(!rank1) outentry(rank, t1, TRUE); else { outentry(rank, t1, TRUE); outentry(0, t0, TRUE); } } if(rank0 >= rank) if(!done_stopprint) outentry(0, t0, TRUE); #ifdef UPDATE_RECORD_IN_PLACE if (flg) { # ifdef TRUNCATE_FILE /* if a reasonable way to truncate a file exists, use it */ truncate_file(rfile); # else /* use sentinel record rather than relying on truncation */ t1->points = 0L; /* terminates file when read back in */ t1->ver_major = t1->ver_minor = t1->patchlevel = 0; t1->uid = t1->deathdnum = t1->deathlev = 0; t1->maxlvl = t1->hp = t1->maxhp = t1->deaths = 0; t1->plrole[0] = t1->plrace[0] = t1->plgend[0] = t1->plalign[0] = '-'; t1->plrole[1] = t1->plrace[1] = t1->plgend[1] = t1->plalign[1] = 0; t1->birthdate = t1->deathdate = yyyymmdd((time_t)0L); Strcpy(t1->name, "@"); Strcpy(t1->death, "\n"); writeentry(rfile, t1); (void) fflush(rfile); # endif /* TRUNCATE_FILE */ } #endif /* UPDATE_RECORD_IN_PLACE */ (void) fclose(rfile); unlock_file_area(NH_RECORD_AREA, NH_RECORD); free_ttlist(tt_head); showwin: if (flags.toptenwin && !done_stopprint) display_nhwindow(toptenwin, 1); destroywin: if (!t0_used) dealloc_ttentry(t0); if (flags.toptenwin) { destroy_nhwindow(toptenwin); toptenwin=WIN_ERR; } } STATIC_OVL void outheader() { char linebuf[BUFSZ]; register char *bp; Strcpy(linebuf, " No Points Name"); bp = eos(linebuf); while(bp < linebuf + COLNO - 9) *bp++ = ' '; Strcpy(bp, "Hp [max]"); topten_print(linebuf); } /* so>0: standout line; so=0: ordinary line */ STATIC_OVL void outentry(rank, t1, so) struct toptenentry *t1; int rank; boolean so; { boolean second_line = TRUE; char linebuf[BUFSZ]; char *bp, hpbuf[24], linebuf3[BUFSZ]; int hppos, lngr; linebuf[0] = '\0'; if (rank) Sprintf(eos(linebuf), "%3d", rank); else Strcat(linebuf, " "); Sprintf(eos(linebuf), " %10ld %.10s", t1->points, t1->name); Sprintf(eos(linebuf), "-%s", t1->plrole); if (t1->plrace[0] != '?') Sprintf(eos(linebuf), "-%s", t1->plrace); /* Printing of gender and alignment is intentional. It has been * part of the NetHack Geek Code, and illustrates a proper way to * specify a character from the command line. */ Sprintf(eos(linebuf), "-%s", t1->plgend); if (t1->plalign[0] != '?') Sprintf(eos(linebuf), "-%s ", t1->plalign); else Strcat(linebuf, " "); if (!strncmp("escaped", t1->death, 7)) { Sprintf(eos(linebuf), "escaped the dungeon %s[max level %d]", !strncmp(" (", t1->death + 7, 2) ? t1->death + 7 + 2 : "", t1->maxlvl); /* fixup for closing paren in "escaped... with...Amulet)[max..." */ if ((bp = index(linebuf, ')')) != 0) *bp = (t1->deathdnum == astral_level.dnum) ? '\0' : ' '; second_line = FALSE; } else if (!strncmp("ascended", t1->death, 8)) { #ifdef RECORD_CONDUCT /* Add a notation for conducts kept */ if(t1->conduct != 4095) { int i, m; char dash = 0, skip; const char *conduct_names[] = { "Food", "Vgn", "Vgt", "Ath", "Weap", "Pac", "Ill", "Poly", "Form", "Wish", "Art", "Geno", NULL }; Strcat(eos(linebuf), "("); for(i = 0, m = 1; conduct_names[i]; i += skip + 1, m <<= (skip + 1)) { skip = 0; if(t1->conduct & m) continue; /* Only show one of foodless, vegan, vegetarian */ if(i == 0) skip = 2; if(i == 1) skip = 1; /* Only show one of wishless, artiwishless */ if(i == 9) skip = 1; /* Add a hyphen for multiple conducts */ if(dash) Strcat(eos(linebuf), "-"); Strcat(eos(linebuf), conduct_names[i]); dash = 1; } Strcat(eos(linebuf), ") "); } #endif Sprintf(eos(linebuf), "ascended to demigod%s-hood", (t1->plgend[0] == 'F') ? "dess" : ""); second_line = FALSE; } else { if (!strncmp(t1->death, "quit", 4)) { Strcat(linebuf, "quit"); second_line = FALSE; } else if (!strncmp(t1->death, "died of st", 10)) { Strcat(linebuf, "starved to death"); second_line = FALSE; } else if (!strncmp(t1->death, "choked", 6)) { Sprintf(eos(linebuf), "choked on h%s food", (t1->plgend[0] == 'F') ? "er" : "is"); } else if (!strncmp(t1->death, "poisoned", 8)) { Strcat(linebuf, "was poisoned"); } else if (!strncmp(t1->death, "crushed", 7)) { Strcat(linebuf, "was crushed to death"); } else if (!strncmp(t1->death, "petrified by ", 13)) { Strcat(linebuf, "turned to stone"); } else Strcat(linebuf, "died"); if (t1->deathdnum == astral_level.dnum) { int deathlev = t1->deathlev; const char *arg, *fmt = " on the Plane of %s"; if (!t1->ver_major && !t1->ver_minor && t1->patchlevel < 7) deathlev--; switch (deathlev) { case -5: fmt = " on the %s Plane"; arg = "Astral"; break; case -4: arg = "Water"; break; case -3: arg = "Fire"; break; case -2: arg = "Air"; break; case -1: arg = "Earth"; break; default: arg = "Void"; break; } Sprintf(eos(linebuf), fmt, arg); } else { Sprintf(eos(linebuf), " in %s", dungeons[t1->deathdnum].dname); if (t1->deathdnum != knox_level.dnum) Sprintf(eos(linebuf), " on level %d", t1->deathlev); if (t1->deathlev != t1->maxlvl) Sprintf(eos(linebuf), " [max %d]", t1->maxlvl); } /* kludge for "quit while already on Charon's boat" */ if (!strncmp(t1->death, "quit ", 5)) Strcat(linebuf, t1->death + 4); } Strcat(linebuf, "."); /* Quit, starved, ascended, and escaped contain no second line */ if (second_line) Sprintf(eos(linebuf), " %c%s.", highc(*(t1->death)), t1->death+1); lngr = (int)strlen(linebuf); if (t1->hp <= 0) hpbuf[0] = '-', hpbuf[1] = '\0'; else Sprintf(hpbuf, "%d", t1->hp); /* beginning of hp column after padding (not actually padded yet) */ hppos = COLNO - (sizeof(" Hp [max]")-1); /* sizeof(str) includes \0 */ while (lngr >= hppos) { for(bp = eos(linebuf); !(*bp == ' ' && (bp-linebuf < hppos)); bp--) ; /* special case: if about to wrap in the middle of maximum dungeon depth reached, wrap in front of it instead */ if (bp > linebuf + 5 && !strncmp(bp - 5, " [max", 5)) bp -= 5; Strcpy(linebuf3, bp+1); *bp = 0; if (so) { while (bp < linebuf + (COLNO-1)) *bp++ = ' '; *bp = 0; topten_print_bold(linebuf); } else topten_print(linebuf); Sprintf(linebuf, "%15s %s", "", linebuf3); lngr = strlen(linebuf); } /* beginning of hp column not including padding */ hppos = COLNO - 7 - (int)strlen(hpbuf); bp = eos(linebuf); if (bp <= linebuf + hppos) { /* pad any necessary blanks to the hit point entry */ while (bp < linebuf + hppos) *bp++ = ' '; Strcpy(bp, hpbuf); Sprintf(eos(bp), " %s[%d]", (t1->maxhp < 10) ? " " : (t1->maxhp < 100) ? " " : "", t1->maxhp); } if (so) { bp = eos(linebuf); if (so >= COLNO) so = COLNO-1; while (bp < linebuf + so) *bp++ = ' '; *bp = 0; topten_print_bold(linebuf); } else topten_print(linebuf); } STATIC_OVL int score_wanted(current_ver, rank, t1, playerct, players, uid) boolean current_ver; int rank; struct toptenentry *t1; int playerct; const char **players; int uid; { int i; if (current_ver && (t1->ver_major != VERSION_MAJOR || t1->ver_minor != VERSION_MINOR || t1->patchlevel != PATCHLEVEL)) return 0; #ifdef PERS_IS_UID if (!playerct && t1->uid == uid) return 1; #endif for (i = 0; i < playerct; i++) { if (players[i][0] == '-' && index("prga", 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)) || (players[i][1] == 'g' && str2gend(arg) == str2gend(t1->plgend)) || (players[i][1] == 'a' && str2align(arg) == str2align(t1->plalign))) 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] && players[i][2] == 0) || (digit(players[i][0]) && rank <= atoi(players[i]))) return 1; } return 0; } /* * print selected parts of score list. * argc >= 2, with argv[0] untrustworthy (directory names, et al.), * and argv[1] starting with "-s". */ void prscore(argc,argv) int argc; char **argv; { const char **players; int playerct, rank; boolean current_ver = TRUE, init_done = FALSE; register struct toptenentry *t1; FILE *rfile; boolean match_found = FALSE; register int i; char pbuf[BUFSZ]; int uid = -1; #ifndef PERS_IS_UID const char *player0; #endif if (argc < 2 || strncmp(argv[1], "-s", 2)) { raw_printf("prscore: bad arguments (%d)", argc); return; } rfile = fopen_datafile_area(NH_RECORD_AREA, NH_RECORD, "r", SCOREPREFIX); if (!rfile) { raw_print("Cannot open record file!"); return; } #ifdef AMIGA { extern winid amii_rawprwin; init_nhwindows(&argc, argv); amii_rawprwin = create_nhwindow(NHW_TEXT); } #endif /* If the score list isn't after a game, we never went through * initialization. */ if (wiz1_level.dlevel == 0) { dlb_init(); init_dungeons(); init_done = TRUE; } if (!argv[1][2]){ /* plain "-s" */ argc--; argv++; } else argv[1] += 2; if (argc > 1 && !strcmp(argv[1], "-v")) { current_ver = FALSE; argc--; argv++; } if (argc <= 1) { #ifdef PERS_IS_UID uid = getuid(); playerct = 0; players = (const char **)0; #else player0 = plname; if (!*player0) # ifdef AMIGA player0 = "all"; /* single user system */ # else player0 = "hackplayer"; # endif playerct = 1; players = &player0; #endif } else { playerct = --argc; players = (const char **)++argv; } raw_print(""); t1 = tt_head = newttentry(); for (rank = 1; ; rank++) { readentry(rfile, t1); if (t1->points == 0) break; if (!match_found && score_wanted(current_ver, rank, t1, playerct, players, uid)) match_found = TRUE; t1->tt_next = newttentry(); t1 = t1->tt_next; } (void) fclose(rfile); if (init_done) { free_dungeons(); dlb_cleanup(); } if (match_found) { outheader(); t1 = tt_head; for (rank = 1; t1->points != 0; rank++, t1 = t1->tt_next) { if (score_wanted(current_ver, rank, t1, playerct, players, uid)) (void) outentry(rank, t1, 0); } } else { Sprintf(pbuf, "Cannot find any %sentries for ", current_ver ? "current " : ""); if (playerct < 1) Strcat(pbuf, "you."); else { if (playerct > 1) Strcat(pbuf, "any of "); for (i = 0; i < playerct; i++) { /* stop printing players if there are too many to fit */ if (strlen(pbuf) + strlen(players[i]) + 2 >= BUFSZ) { if (strlen(pbuf) < BUFSZ-4) Strcat(pbuf, "..."); else Strcpy(pbuf+strlen(pbuf)-4, "..."); break; } Strcat(pbuf, players[i]); if (i < playerct-1) { if (players[i][0] == '-' && index("prga", 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] [-g gender] [-a align]"); } free_ttlist(tt_head); #ifdef AMIGA { extern winid amii_rawprwin; display_nhwindow(amii_rawprwin, 1); destroy_nhwindow(amii_rawprwin); amii_rawprwin = WIN_ERR; } #endif } STATIC_OVL int classmon(plch, fem) char *plch; boolean fem; { int i; /* Look for this role in the role table */ for (i = 0; roles[i].name.m; i++) if (!strncmp(plch, roles[i].filecode, ROLESZ)) { if (fem && roles[i].femalenum != NON_PM) return roles[i].femalenum; else if (roles[i].malenum != NON_PM) return roles[i].malenum; else return PM_HUMAN; } /* this might be from a 3.2.x score for former Elf class */ if (!strcmp(plch, "E")) return PM_RANGER; impossible("What weird role is this? (%s)", plch); return (PM_HUMAN_MUMMY); } /* * Get a random player name and class from the high score list, * and attach them to an object (for statues or morgue corpses). */ struct obj * tt_oname(otmp) struct obj *otmp; { int rank; register int i; register struct toptenentry *tt; FILE *rfile; struct toptenentry tt_buf; if (!otmp) return((struct obj *) 0); rfile = fopen_datafile_area(NH_RECORD_AREA, NH_RECORD, "r", SCOREPREFIX); if (!rfile) { impossible("Cannot open record file!"); return (struct obj *)0; } tt = &tt_buf; rank = rnd(10); pickentry: for(i = rank; i; i--) { readentry(rfile, tt); if(tt->points == 0) break; } if(tt->points == 0) { if(rank > 1) { rank = 1; rewind(rfile); goto pickentry; } otmp = (struct obj *) 0; } else { /* reset timer in case corpse started out as lizard or troll */ if (otmp->otyp == CORPSE) obj_stop_timers(otmp); otmp->corpsenm = classmon(tt->plrole, (tt->plgend[0] == 'F')); otmp->owt = weight(otmp); otmp = oname(otmp, tt->name); if (otmp->otyp == CORPSE) start_corpse_timeout(otmp); } (void) fclose(rfile); return otmp; } #ifdef NO_SCAN_BRACK /* Lattice scanf isn't up to reading the scorefile. What */ /* follows deals with that; I admit it's ugly. (KL) */ /* Now generally available (KL) */ STATIC_OVL void nsb_mung_line(p) char *p; { while ((p = index(p, ' ')) != 0) *p = '|'; } STATIC_OVL void nsb_unmung_line(p) char *p; { while ((p = index(p, '|')) != 0) *p = ' '; } #endif /* NO_SCAN_BRACK */ #if defined(GTK_GRAPHICS) || defined(PROXY_GRAPHICS) winid create_toptenwin() { toptenwin = create_nhwindow(NHW_TEXT); return toptenwin; } void destroy_toptenwin() { destroy_nhwindow(toptenwin); toptenwin = WIN_ERR; } #endif /*topten.c*/ slashem-0.0.7E7F3/src/weapon.c0000664000076400007640000014430210545462317014104 0ustar aliali/* SCCS Id: @(#)weapon.c 3.4 2002/11/07 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ /* * This module contains code for calculation of "to hit" and damage * bonuses for any given weapon used, as well as weapons selection * code for monsters. */ #include "hack.h" /* categories whose names don't come from OBJ_NAME(objects[type]) */ #define PN_POLEARMS (-1) #define PN_SABER (-2) #define PN_HAMMER (-3) #define PN_WHIP (-4) #define PN_PADDLE (-5) #define PN_FIREARMS (-6) #define PN_ATTACK_SPELL (-7) #define PN_HEALING_SPELL (-8) #define PN_DIVINATION_SPELL (-9) #define PN_ENCHANTMENT_SPELL (-10) #define PN_PROTECTION_SPELL (-11) #define PN_BODY_SPELL (-12) #define PN_MATTER_SPELL (-13) #define PN_BARE_HANDED (-14) #define PN_MARTIAL_ARTS (-15) #define PN_RIDING (-16) #define PN_TWO_WEAPONS (-17) #ifdef LIGHTSABERS #define PN_LIGHTSABER (-18) #endif static void FDECL(give_may_advance_msg, (int)); STATIC_PTR int NDECL(practice); static int FDECL(get_obj_skill, (struct obj *)); #ifdef LIGHTSABERS static void FDECL(mon_ignite_lightsaber, (struct obj *, struct monst *)); #endif /*WAC practicing needs a delay counter*/ static NEARDATA schar delay; /* moves left for practice */ static NEARDATA boolean speed_advance = FALSE; STATIC_DCL void FDECL(give_may_advance_msg, (int)); #ifndef OVLB STATIC_DCL NEARDATA const short skill_names_indices[]; STATIC_DCL NEARDATA const char *odd_skill_names[]; #else /* OVLB */ /* KMH, balance patch -- updated */ STATIC_OVL NEARDATA const short skill_names_indices[P_NUM_SKILLS] = { 0, DAGGER, KNIFE, AXE, PICK_AXE, SHORT_SWORD, BROADSWORD, LONG_SWORD, TWO_HANDED_SWORD, SCIMITAR, PN_SABER, CLUB, PN_PADDLE, MACE, MORNING_STAR, FLAIL, PN_HAMMER, QUARTERSTAFF, PN_POLEARMS, SPEAR, JAVELIN, TRIDENT, LANCE, BOW, SLING, PN_FIREARMS, CROSSBOW, DART, SHURIKEN, BOOMERANG, PN_WHIP, UNICORN_HORN, #ifdef LIGHTSABERS PN_LIGHTSABER, #endif PN_ATTACK_SPELL, PN_HEALING_SPELL, PN_DIVINATION_SPELL, PN_ENCHANTMENT_SPELL, PN_PROTECTION_SPELL, PN_BODY_SPELL, PN_MATTER_SPELL, PN_BARE_HANDED, PN_MARTIAL_ARTS, PN_TWO_WEAPONS, #ifdef STEED PN_RIDING, #endif }; STATIC_OVL NEARDATA const char * const odd_skill_names[] = { "no skill", "polearms", "saber", "hammer", "whip", "paddle", "firearms", "attack spells", "healing spells", "divination spells", "enchantment spells", "protection spells", "body spells", "matter spells", "bare-handed combat", "martial arts", "riding", "two-handed combat", #ifdef LIGHTSABERS "lightsaber" #endif }; STATIC_OVL void give_may_advance_msg(skill) int skill; { You_feel("more %s in your %sskills.", !P_RESTRICTED(skill) ? "confident" : "comfortable", skill == P_NONE ? "" : skill <= P_LAST_WEAPON ? "weapon " : skill <= P_LAST_SPELL ? "spell casting " : skill <= P_LAST_H_TO_H ? "fighting ": ""); } #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)); STATIC_DCL boolean FDECL(can_practice, (int)); /* WAC for Practicing */ #ifdef OVL1 STATIC_DCL char *FDECL(skill_level_name, (int,char *)); STATIC_DCL void FDECL(skill_advance, (int)); #endif /* OVL1 */ #ifdef OVLB #define P_NAME(type) (skill_names_indices[type] > 0 ? \ OBJ_NAME(objects[skill_names_indices[type]]) : \ odd_skill_names[-skill_names_indices[type]]) static NEARDATA const char kebabable[] = { S_XORN, S_DRAGON, S_JABBERWOCK, S_NAGA, S_GIANT, '\0' }; /* * hitval returns an integer representing the "to hit" bonuses * of "otmp" against the monster. */ int hitval(otmp, mon) struct obj *otmp; struct monst *mon; { int tmp = 0; struct permonst *ptr = mon->data; boolean Is_weapon = (otmp->oclass == WEAPON_CLASS || is_weptool(otmp)); if (Is_weapon) tmp += otmp->spe; /* Put weapon specific "to hit" bonuses in below: */ tmp += objects[otmp->otyp].oc_hitbon; tmp += weapon_hit_bonus(otmp); /* weapon skill */ if (u.twoweap && (otmp == uwep || otmp == uswapwep)) tmp += (skill_bonus(P_TWO_WEAPON_COMBAT) * 2) - 5; /* Put weapon vs. monster type "to hit" bonuses in below: */ /* Blessed weapons used against undead or demons */ if (Is_weapon && otmp->blessed && (is_demon(ptr) || is_undead(ptr))) tmp += 2; /* KMH, balance patch -- new macro */ if (is_spear(otmp) && index(kebabable, ptr->mlet)) tmp += 2; /* KMH -- Paddles are effective against insects */ if (Is_weapon && (objects[otmp->otyp].oc_skill == P_PADDLE) && (ptr->mlet == S_ANT || ptr->mlet == S_SPIDER || ptr->mlet == S_XAN)) tmp += 2; /* trident is highly effective against swimmers */ if (otmp->otyp == TRIDENT && is_swimmer(ptr)) { if (is_pool(mon->mx, mon->my)) tmp += 4; else if (ptr->mlet == S_EEL || ptr->mlet == S_SNAKE) tmp += 2; } /* pick-axe used against xorns and earth elementals */ /* WAC made generic against "rock people" */ /* KMH, balance patch -- allow all picks */ if (is_pick(otmp) && /* (passes_walls(ptr) && thick_skinned(ptr))) tmp += 2;*/ (made_of_rock(ptr))) tmp += 2; #ifdef INVISIBLE_OBJECTS /* invisible weapons against monsters who can't see invisible */ if (otmp->oinvis && !perceives(ptr)) tmp += 3; #endif /* Check specially named weapon "to hit" bonuses */ if (otmp->oartifact) tmp += spec_abon(otmp, mon); return tmp; } /* Historical note: The original versions of Hack used a range of damage * which was similar to, but not identical to the damage used in Advanced * Dungeons and Dragons. I figured that since it was so close, I may as well * make it exactly the same as AD&D, adding some more weapons in the process. * This has the advantage that it is at least possible that the player would * already know the damage of at least some of the weapons. This was circa * 1987 and I used the table from Unearthed Arcana until I got tired of typing * them in (leading to something of an imbalance towards weapons early in * alphabetical order). The data structure still doesn't include fields that * fully allow the appropriate damage to be described (there's no way to say * 3d6 or 1d6+1) so we add on the extra damage in dmgval() if the weapon * doesn't do an exact die of damage. * * Of course new weapons were added later in the development of Nethack. No * AD&D consistency was kept, but most of these don't exist in AD&D anyway. * * 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. */ /* * dmgval returns an integer representing the damage bonuses * of "otmp" against the monster. */ int dmgval(otmp, mon) struct obj *otmp; struct monst *mon; { int tmp = 0, otyp = otmp->otyp; struct permonst *ptr = mon->data; boolean Is_weapon = (otmp->oclass == WEAPON_CLASS || is_weptool(otmp)); if (otyp == CREAM_PIE) return 0; # ifdef P_SPOON if (otmp->oartifact == ART_HOUCHOU) return 9999; # endif /* P_SPOON */ if (bigmonst(ptr)) { if (objects[otyp].oc_wldam) tmp = rnd(objects[otyp].oc_wldam); switch (otyp) { case IRON_CHAIN: case CROSSBOW_BOLT: case MORNING_STAR: case PARTISAN: case RUNESWORD: case ELVEN_BROADSWORD: case BROADSWORD: tmp++; break; case FLAIL: case RANSEUR: case VOULGE: tmp += rnd(4); break; case ACID_VENOM: case HALBERD: case SPETUM: tmp += rnd(6); break; case BATTLE_AXE: case BARDICHE: case TRIDENT: tmp += d(2,4); break; case TSURUGI: case DWARVISH_MATTOCK: case TWO_HANDED_SWORD: tmp += d(2,6); break; #ifdef LIGHTSABERS case GREEN_LIGHTSABER: tmp +=13; break; #ifdef D_SABER case BLUE_LIGHTSABER: tmp +=12; break; #endif case RED_DOUBLE_LIGHTSABER: if (otmp->altmode) tmp += rnd(11); /* fallthrough */ case RED_LIGHTSABER: tmp +=10; break; #endif } } else { if (objects[otyp].oc_wsdam) tmp = rnd(objects[otyp].oc_wsdam); switch (otyp) { case IRON_CHAIN: case CROSSBOW_BOLT: case MACE: case SILVER_MACE: case WAR_HAMMER: case FLAIL: case SPETUM: case TRIDENT: tmp++; break; case BATTLE_AXE: case BARDICHE: case BILL_GUISARME: case GUISARME: case LUCERN_HAMMER: case MORNING_STAR: case RANSEUR: case BROADSWORD: case ELVEN_BROADSWORD: case RUNESWORD: case VOULGE: tmp += rnd(4); break; #ifdef LIGHTSABERS case GREEN_LIGHTSABER: tmp +=9; break; #ifdef D_SABER case BLUE_LIGHTSABER: tmp +=8; break; #endif case RED_DOUBLE_LIGHTSABER: if (otmp->altmode) tmp += rnd(9); /* fallthrough */ case RED_LIGHTSABER: tmp +=6; break; #endif case ACID_VENOM: tmp += rnd(6); break; } } if (Is_weapon) { tmp += otmp->spe; /* negative enchantment mustn't produce negative damage */ if (tmp < 0) tmp = 0; } if (objects[otyp].oc_material <= LEATHER && thick_skinned(ptr)) /* thick skinned/scaled creatures don't feel it */ tmp = 0; if (ptr == &mons[PM_SHADE] && objects[otyp].oc_material != SILVER) tmp = 0; /* "very heavy iron ball"; weight increase is in increments of 160 */ if (otyp == HEAVY_IRON_BALL && tmp > 0) { int wt = (int)objects[HEAVY_IRON_BALL].oc_weight; if ((int)otmp->owt > wt) { wt = ((int)otmp->owt - wt) / 160; tmp += rnd(4 * wt); if (tmp > 25) tmp = 25; /* objects[].oc_wldam */ } } /* Put weapon vs. monster type damage bonuses in below: */ if (Is_weapon || otmp->oclass == GEM_CLASS || otmp->oclass == BALL_CLASS || otmp->oclass == CHAIN_CLASS) { int bonus = 0; if (otmp->blessed && (is_undead(ptr) || is_demon(ptr))) bonus += rnd(4); if (is_axe(otmp) && is_wooden(ptr)) bonus += rnd(4); if (objects[otyp].oc_material == SILVER && hates_silver(ptr)) bonus += rnd(20); /* Ralf Engels - added more special cases*/ /* You can kill a eye with a needle */ /* WAC--currently disabled since spheres and gas spores are S_EYE too */ /* if((objects[otyp].oc_dir & (PIERCE) ) && (ptr->mlet == S_EYE)) bonus += 2; */ /* You cut worms */ if((objects[otyp].oc_dir & (SLASH) ) && (ptr->mlet == S_WORM)) bonus += 2; /* You pierce blobs */ if((objects[otyp].oc_dir & (PIERCE) ) && (ptr->mlet == S_BLOB)) bonus += 2; /* You slash jellies */ if((objects[otyp].oc_dir & (SLASH) ) && (ptr->mlet == S_JELLY)) bonus += 2; /* concussion damage is better agains chitinous armour */ if( (objects[otyp].oc_dir & (WHACK) ) && (ptr->mlet == S_ANT || ptr->mlet == S_SPIDER || ptr->mlet == S_XAN)) bonus += 2; /* flyers can better be reached with a polearm */ if( (is_pole(otmp) || is_spear(otmp) ) && is_flyer(ptr) ) bonus += 2; if (is_pick(otmp) && made_of_rock(ptr) ) bonus += 3; /* if the weapon is going to get a double damage bonus, adjust this bonus so that effectively it's added after the doubling */ if (bonus > 1 && otmp->oartifact && spec_dbon(otmp, mon, 25) >= 25) bonus = (bonus + 1) / 2; tmp += bonus; } if (tmp > 0) { /* It's debateable whether a rusted blunt instrument should do less damage than a pristine one, since it will hit with essentially the same impact, but there ought to some penalty for using damaged gear so always subtract erosion even for blunt weapons. */ tmp -= greatest_erosion(otmp); if (tmp < 1) tmp = 1; } return(tmp); } #endif /* OVLB */ #ifdef OVL0 STATIC_DCL struct obj *FDECL(oselect, (struct monst *,int)); #define Oselect(x) if ((otmp = oselect(mtmp, x)) != 0) return(otmp); STATIC_OVL struct obj * oselect(mtmp, x) struct monst *mtmp; int x; { struct obj *otmp; for (otmp = mtmp->minvent; otmp; otmp = otmp->nobj) { if (otmp->otyp == x && /* never select non-cockatrice corpses */ !((x == CORPSE || x == EGG) && !touch_petrifies(&mons[otmp->corpsenm])) && #ifdef LIGHTSABERS (!is_lightsaber(otmp) || otmp->age) && #endif (!otmp->oartifact || touch_artifact(otmp,mtmp))) return otmp; } return (struct obj *)0; } /* WAC added the Ya, increased priority of silver dagger, added Spoon */ /* KMH -- added bullets */ static NEARDATA const int rwep[] = { #ifdef SPOON SPOON, #endif #ifdef FIREARMS FRAG_GRENADE, GAS_GRENADE, ROCKET, SILVER_BULLET, BULLET, SHOTGUN_SHELL, #endif DWARVISH_SPEAR, SILVER_SPEAR, ELVEN_SPEAR, SPEAR, ORCISH_SPEAR, JAVELIN, SHURIKEN, YA, SILVER_ARROW, ELVEN_ARROW, DARK_ELVEN_ARROW, ARROW, ORCISH_ARROW, CROSSBOW_BOLT, SILVER_DAGGER, ELVEN_DAGGER, DARK_ELVEN_DAGGER, DAGGER, ORCISH_DAGGER, KNIFE, FLINT, ROCK, LOADSTONE, LUCKSTONE, DART, /* BOOMERANG, */ CREAM_PIE /* note: CREAM_PIE should NOT be #ifdef KOPS */ }; static NEARDATA const int pwep[] = { HALBERD, BARDICHE, SPETUM, BILL_GUISARME, VOULGE, RANSEUR, GUISARME, GLAIVE, LUCERN_HAMMER, BEC_DE_CORBIN, FAUCHARD, PARTISAN, LANCE }; static struct obj *propellor; struct obj * select_rwep(mtmp) /* select a ranged weapon for the monster */ register struct monst *mtmp; { register struct obj *otmp; int i; #ifdef KOPS char mlet = mtmp->data->mlet; #endif propellor = &zeroobj; Oselect(EGG); /* cockatrice egg */ #ifdef KOPS if(mlet == S_KOP) /* pies are first choice for Kops */ Oselect(CREAM_PIE); #endif if(throws_rocks(mtmp->data)) /* ...boulders for giants */ Oselect(BOULDER); /* Select polearms first; they do more damage and aren't expendable */ /* The limit of 13 here is based on the monster polearm range limit * (defined as 5 in mthrowu.c). 5 corresponds to a distance of 2 in * one direction and 1 in another; one space beyond that would be 3 in * one direction and 2 in another; 3^2+2^2=13. */ if (dist2(mtmp->mx, mtmp->my, mtmp->mux, mtmp->muy) <= 13 && couldsee(mtmp->mx, mtmp->my)) { for (i = 0; i < SIZE(pwep); i++) { /* Only strong monsters can wield big (esp. long) weapons. * Big weapon is basically the same as bimanual. * All monsters can wield the remaining weapons. */ if (((strongmonst(mtmp->data) && (mtmp->misc_worn_check & W_ARMS) == 0) || !objects[pwep[i]].oc_bimanual) && (objects[pwep[i]].oc_material != SILVER || !hates_silver(mtmp->data))) { if ((otmp = oselect(mtmp, pwep[i])) != 0) { propellor = otmp; /* force the monster to wield it */ return otmp; } } } } /* * other than these two specific cases, always select the * most potent ranged weapon to hand. */ for (i = 0; i < SIZE(rwep); i++) { int prop; /* shooting gems from slings; this goes just before the darts */ /* (shooting rocks is already handled via the rwep[] ordering) */ if (rwep[i] == DART && !likes_gems(mtmp->data) && m_carrying(mtmp, SLING)) { /* propellor */ for (otmp = mtmp->minvent; otmp; otmp = otmp->nobj) if (otmp->oclass == GEM_CLASS && (otmp->otyp != LOADSTONE || !otmp->cursed)) { propellor = m_carrying(mtmp, SLING); return otmp; } } /* KMH -- This belongs here so darts will work */ propellor = &zeroobj; /* KMH, balance patch -- now using skills */ prop = (objects[rwep[i]]).oc_skill; if (prop < 0) { switch (-prop) { /* WAC NOTE: remember to always start the 1st item in * a list of propellors with a * propellor = ... * and follow up with * if (!propellor) ... */ case P_BOW: propellor = (oselect(mtmp, YUMI)); if (!propellor) propellor = (oselect(mtmp, ELVEN_BOW)); /* WAC added dark elven bow */ if (!propellor) propellor = (oselect(mtmp, DARK_ELVEN_BOW)); if (!propellor) propellor = (oselect(mtmp, BOW)); if (!propellor) propellor = (oselect(mtmp, ORCISH_BOW)); break; case P_SLING: propellor = (oselect(mtmp, SLING)); break; case P_CROSSBOW: propellor = (oselect(mtmp, CROSSBOW)); #ifdef FIREARMS case P_FIREARM: if ((objects[rwep[i]].w_ammotyp) == WP_BULLET) { propellor = (oselect(mtmp, HEAVY_MACHINE_GUN)); if (!propellor) propellor = (oselect(mtmp, ASSAULT_RIFLE)); if (!propellor) propellor = (oselect(mtmp, SUBMACHINE_GUN)); if (!propellor) propellor = (oselect(mtmp, SNIPER_RIFLE)); if (!propellor) propellor = (oselect(mtmp, RIFLE)); if (!propellor) propellor = (oselect(mtmp, PISTOL)); } else if ((objects[rwep[i]].w_ammotyp) == WP_SHELL) { propellor = (oselect(mtmp, AUTO_SHOTGUN)); if (!propellor) propellor = (oselect(mtmp, SHOTGUN)); } else if ((objects[rwep[i]].w_ammotyp) == WP_ROCKET) { propellor = (oselect(mtmp, ROCKET_LAUNCHER)); } else if ((objects[rwep[i]].w_ammotyp) == WP_GRENADE) { propellor = (oselect(mtmp, GRENADE_LAUNCHER)); if (!propellor) propellor = &zeroobj; /* can toss grenades */ } break; #endif } if ((otmp = MON_WEP(mtmp)) && otmp->cursed && otmp != propellor && mtmp->weapon_check == NO_WEAPON_WANTED) propellor = 0; } /* propellor = obj, propellor to use * propellor = &zeroobj, doesn't need a propellor * propellor = 0, needed one and didn't have one */ if (propellor != 0) { /* Note: cannot use m_carrying for loadstones, since it will * always select the first object of a type, and maybe the * monster is carrying two but only the first is unthrowable. */ /* STEPHEN WHITE'S NEW CODE */ if (rwep[i] != LOADSTONE) { /* Don't throw a cursed weapon-in-hand or an artifact */ if ((otmp = oselect(mtmp, rwep[i])) && !otmp->oartifact && (!otmp->cursed || otmp != MON_WEP(mtmp))) return(otmp); /* STEPHEN WHITE'S NEW CODE */ /* KMH, balance patch -- removed stone of rotting */ } else for(otmp=mtmp->minvent; otmp; otmp=otmp->nobj) { if (otmp->otyp == LOADSTONE && !otmp->cursed) return otmp; } } } /* failure */ return (struct obj *)0; } /* Weapons in order of preference */ /* WAC -- added dark elven short sword here */ /* WAC -- removed polearms */ static const NEARDATA short hwep[] = { CORPSE, /* cockatrice corpse */ TSURUGI, RUNESWORD, HEAVY_HAMMER, DWARVISH_MATTOCK, #ifdef LIGHTSABERS RED_DOUBLE_LIGHTSABER, RED_LIGHTSABER, #ifdef D_SABER BLUE_LIGHTSABER, #endif GREEN_LIGHTSABER, #endif TWO_HANDED_SWORD, BATTLE_AXE, KATANA, UNICORN_HORN, CRYSKNIFE, TRIDENT, LONG_SWORD, ELVEN_BROADSWORD, BROADSWORD, SCIMITAR, SILVER_SABER, SILVER_SHORT_SWORD, SILVER_LONG_SWORD, SILVER_MACE, MORNING_STAR, DARK_ELVEN_SHORT_SWORD, ELVEN_SHORT_SWORD, DWARVISH_SHORT_SWORD, SHORT_SWORD, ORCISH_SHORT_SWORD, MACE, AXE, DWARVISH_SPEAR, SILVER_SPEAR, ELVEN_SPEAR, SPEAR, ORCISH_SPEAR, FLAIL, BULLWHIP, QUARTERSTAFF, JAVELIN, AKLYS, CLUB, PICK_AXE, FLY_SWATTER, #ifdef KOPS RUBBER_HOSE, #endif /* KOPS */ WAR_HAMMER, SILVER_DAGGER, ELVEN_DAGGER, WOODEN_STAKE, DAGGER, ORCISH_DAGGER, ATHAME, SCALPEL, KNIFE, TORCH, WORM_TOOTH }; struct obj * select_hwep(mtmp) /* select a hand to hand weapon for the monster */ register struct monst *mtmp; { register struct obj *otmp; register int i; boolean strong = strongmonst(mtmp->data); boolean wearing_shield = (mtmp->misc_worn_check & W_ARMS) != 0; /* prefer artifacts to everything else */ for(otmp=mtmp->minvent; otmp; otmp = otmp->nobj) { if (otmp->oclass == WEAPON_CLASS && otmp->oartifact && touch_artifact(otmp,mtmp) && ((strong && !wearing_shield) || !objects[otmp->otyp].oc_bimanual)) return otmp; } if(is_giant(mtmp->data)) /* giants just love to use clubs */ Oselect(CLUB); /* 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; } /* Called after polymorphing a monster, robbing it, etc.... Monsters * otherwise never unwield stuff on their own. Might print message. */ void possibly_unwield(mon, polyspot) struct monst *mon; boolean polyspot; { struct obj *obj, *mw_tmp; if (!(mw_tmp = MON_WEP(mon))) return; for (obj = mon->minvent; obj; obj = obj->nobj) if (obj == mw_tmp) break; if (!obj) { /* The weapon was stolen or destroyed */ MON_NOWEP(mon); mon->weapon_check = NEED_WEAPON; return; } if (!attacktype(mon->data, AT_WEAP)) { setmnotwielded(mon, mw_tmp); MON_NOWEP(mon); mon->weapon_check = NO_WEAPON_WANTED; obj_extract_self(obj); if (cansee(mon->mx, mon->my)) { pline("%s drops %s.", Monnam(mon), distant_name(obj, doname)); newsym(mon->mx, mon->my); } /* might be dropping object into water or lava */ if (!flooreffects(obj, mon->mx, mon->my, "drop")) { if (polyspot) bypass_obj(obj); place_object(obj, mon->mx, mon->my); stackobj(obj); } return; } /* The remaining case where there is a change is where a monster * is polymorphed into a stronger/weaker monster with a different * choice of weapons. This has no parallel for players. It can * be handled by waiting until mon_wield_item is actually called. * Though the monster still wields the wrong weapon until then, * this is OK since the player can't see it. (FIXME: Not okay since * probing can reveal it.) * Note that if there is no change, setting the check to NEED_WEAPON * is harmless. * Possible problem: big monster with big cursed weapon gets * 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; return; } /* Let a monster try to wield a weapon, based on mon->weapon_check. * Returns 1 if the monster took time to do it, 0 if it did not. */ int mon_wield_item(mon) register struct monst *mon; { struct obj *obj; /* This case actually should never happen */ if (mon->weapon_check == NO_WEAPON_WANTED) return 0; switch(mon->weapon_check) { case NEED_HTH_WEAPON: obj = select_hwep(mon); break; case NEED_RANGED_WEAPON: (void)select_rwep(mon); obj = propellor; break; case NEED_PICK_AXE: obj = m_carrying(mon, PICK_AXE); /* KMH -- allow other picks */ if (!obj && !which_armor(mon, W_ARMS)) obj = m_carrying(mon, DWARVISH_MATTOCK); break; case NEED_AXE: /* currently, only 2 types of axe */ obj = m_carrying(mon, BATTLE_AXE); if (!obj || which_armor(mon, W_ARMS)) obj = m_carrying(mon, AXE); break; case NEED_PICK_OR_AXE: /* prefer pick for fewer switches on most levels */ obj = m_carrying(mon, DWARVISH_MATTOCK); if (!obj) obj = m_carrying(mon, BATTLE_AXE); if (!obj || which_armor(mon, W_ARMS)) { obj = m_carrying(mon, PICK_AXE); if (!obj) obj = m_carrying(mon, AXE); } break; default: impossible("weapon_check %d for %s?", mon->weapon_check, mon_nam(mon)); return 0; } if (obj && obj != &zeroobj) { struct obj *mw_tmp = MON_WEP(mon); if (mw_tmp && mw_tmp->otyp == obj->otyp) { /* already wielding it */ #ifdef LIGHTSABERS if (is_lightsaber(obj)) mon_ignite_lightsaber(obj, mon); #endif mon->weapon_check = NEED_WEAPON; return 0; } /* Actually, this isn't necessary--as soon as the monster * wields the weapon, the weapon welds itself, so the monster * can know it's cursed and needn't even bother trying. * Still.... */ if (mw_tmp && mw_tmp->cursed && mw_tmp->otyp != CORPSE) { if (canseemon(mon)) { char welded_buf[BUFSZ]; const char *mon_hand = mbodypart(mon, HAND); 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,", s_suffix(mon_nam(mon)), plur(mw_tmp->quan), welded_buf); pline("%s cannot wield that %s.", mon_nam(mon), xname(obj)); } else { pline("%s tries to wield %s.", Monnam(mon), doname(obj)); pline("%s %s %s!", s_suffix(Monnam(mon)), xname(mw_tmp), welded_buf); } mw_tmp->bknown = 1; } mon->weapon_check = NO_WEAPON_WANTED; 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; #ifdef LIGHTSABERS if (is_lightsaber(obj)) mon_ignite_lightsaber(obj, mon); #endif return 1; } mon->weapon_check = NEED_WEAPON; return 0; } #ifdef LIGHTSABERS static void mon_ignite_lightsaber(obj, mon) struct obj * obj; struct monst * mon; { /* No obj or not lightsaber */ if (!obj || !is_lightsaber(obj)) return; /* WAC - Check lightsaber is on */ if (!obj->lamplit) { if (obj->cursed && !rn2(2)) { if (canseemon(mon)) pline("%s %s flickers and goes out.", s_suffix(Monnam(mon)), xname(obj)); } else { if (canseemon(mon)) { makeknown(obj->otyp); pline("%s ignites %s.", Monnam(mon), an(xname(obj))); } begin_burn(obj, FALSE); } } else { /* Double Lightsaber in single mode? Ignite second blade */ if (obj->otyp == RED_DOUBLE_LIGHTSABER && !obj->altmode) { /* Do we want to activate dual bladed mode? */ if (!obj->altmode && (!obj->cursed || rn2(4))) { if (canseemon(mon)) pline("%s ignites the second blade of %s.", Monnam(mon), an(xname(obj))); obj->altmode = TRUE; return; } else obj->altmode = FALSE; lightsaber_deactivate(obj, TRUE); } return; } } #endif /* STEPHEN WHITE'S NEW CODE */ int abon() /* attack bonus for strength & dexterity */ { int sbon; int str = ACURR(A_STR), dex = ACURR(A_DEX); if (Upolyd) return(adj_lev(&mons[u.umonnum]) - 3); /* [Tom] lowered these a little */ if (str < 6) sbon = -2; else if (str < 8) sbon = -1; else if (str < 17) sbon = 0; else if (str <= STR18(50)) sbon = 1; /* up to 18/50 */ else if (str < STR18(100)) sbon = 1; else if (str == STR18(100)) sbon = 2; /* 18/00 */ else if (str == STR19(19)) sbon = 2; /* 19 */ else if (str == STR19(20)) sbon = 3; /* 20 */ else if (str == STR19(21)) sbon = 3; /* 21 */ else if (str == STR19(22)) sbon = 4; /* 22 */ else if (str == STR19(23)) sbon = 4; /* 23 */ else if (str == STR19(24)) sbon = 5; /* 24 */ else sbon = 5; if (dex < 5) sbon -= 2; else if (dex < 7) sbon -= 1; else if (dex < 15) sbon += 0; else if (dex == 15) sbon += 1; /* 15 */ else if (dex == 16) sbon += 1; /* 16 */ else if (dex == 17) sbon += 1; /* 17 */ else if (dex == 18) sbon += 2; /* 18 */ else if (dex == 19) sbon += 2; /* 19 */ else if (dex == 20) sbon += 2; /* 20 */ else if (dex == 21) sbon += 3; /* 21 */ else if (dex == 22) sbon += 3; /* 22 */ else if (dex == 23) sbon += 3; /* 23 */ else if (dex == 24) sbon += 4; /* 24 */ else sbon += 5; /* Game tuning kludge: make it a bit easier for a low level character to hit */ sbon += (u.ulevel < 3) ? 1 : 0; return(sbon); } #endif /* OVL0 */ #ifdef OVL1 /* STEPHEN WHITE'S NEW CODE */ int dbon() /* damage bonus for strength */ { int str = ACURR(A_STR); if (Upolyd) return(0); /* [Tom] I lowered this a little */ if (str < 6) return(-1); else if (str < 16) return(0); else if (str < 18) return(1); else if (str == 18) return(2); /* up to 18 */ else if (str < STR18(100)) return(3); /* up to 18/99 */ else if (str == STR18(100)) return(4); /* 18/00 */ else if (str == STR19(19)) return(5); /* 19 */ else if (str == STR19(20)) return(6); /* 20 */ else if (str == STR19(21)) return(7); /* 21 */ else if (str == STR19(22)) return(8); /* 22 */ else if (str == STR19(23)) return(9); /* 23 */ else if (str == STR19(24)) return(10); /* 24 */ else return(11); } /* copy the skill level name into the given buffer */ STATIC_OVL char * skill_level_name(skill, buf) int skill; char *buf; { const char *ptr; switch (P_SKILL(skill)) { case P_UNSKILLED: ptr = "Unskilled"; break; case P_BASIC: ptr = "Basic"; break; case P_SKILLED: ptr = "Skilled"; break; case P_EXPERT: ptr = "Expert"; break; case P_MASTER: ptr = "Master"; break; case P_GRAND_MASTER: if (skill <= P_LAST_WEAPON) ptr = "Wizard" ; else if (skill <= P_LAST_SPELL) ptr = "Legendary"; else if (skill <= P_LAST_H_TO_H) ptr = "Grand Master"; else ptr = "Unprecedented"; break; default: ptr = "Unknown"; break; } Strcpy(buf, ptr); return buf; } /* return the # of slots required to advance the skill */ STATIC_OVL int slots_required(skill) int skill; { int tmp = P_SKILL(skill); /* WAC if you're over your class max, it's twice as costly */ if (tmp >= P_MAX_SKILL(skill)) tmp *=2; if (tmp < 0) tmp = 0; /* for Restricted skills */ /* The more difficult the training, the more slots it takes. * unskilled -> basic 1 * basic -> skilled 2 * skilled -> expert 3 */ if (skill <= P_LAST_SPELL) return tmp; /* Fewer slots used up for unarmed or martial, miscellaneous skills * unskilled -> basic 1 * basic -> skilled 1 * skilled -> expert 2 * expert -> master 2 * master -> grand master 3 */ return (tmp + 1) / 2; } /* return true if this skill can be advanced */ /*ARGSUSED*/ STATIC_OVL boolean can_advance(skill, speedy) int skill; boolean speedy; { return !P_RESTRICTED(skill) && P_SKILL(skill) < P_MAX_SKILL(skill) && ( #ifdef WIZARD (wizard && speedy) || #endif (P_ADVANCE(skill) >= (unsigned) practice_needed_to_advance(P_SKILL(skill), skill) && u.skills_advanced < P_SKILL_LIMIT && u.weapon_slots >= slots_required(skill))); } /* WAC return true if skill can be practiced */ STATIC_OVL boolean can_practice(skill) int skill; { return !P_RESTRICTED(skill) && P_SKILL(skill) < P_MAX_SKILL(skill) && u.skills_advanced < P_SKILL_LIMIT; } /* 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), 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), skill))); } STATIC_OVL void skill_advance(skill) int skill; { #ifdef WIZARD if (wizard && speed_advance && P_RESTRICTED(skill)) { unrestrict_weapon_skill(skill); return; } #endif u.weapon_slots -= slots_required(skill); P_SKILL(skill)++; 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)); if (!tech_known(T_DISARM) && (P_SKILL(skill) == P_SKILLED) && skill <= P_LAST_WEAPON && skill != P_WHIP) { learntech(T_DISARM, FROMOUTSIDE, 1); You("learn how to perform disarm!"); } } const static struct skill_range { short first, last; const char *name; } skill_ranges[] = { { P_FIRST_H_TO_H, P_LAST_H_TO_H, "Fighting Skills" }, { P_FIRST_WEAPON, P_LAST_WEAPON, "Weapon Skills" }, { P_FIRST_SPELL, P_LAST_SPELL, "Spellcasting Skills" }, }; /* * The `#enhance' extended command. What we _really_ would like is * to keep being able to pick things to advance until we couldn't any * more. This is currently not possible -- the menu code has no way * to call us back for instant action. Even if it did, we would also need * to be able to update the menu since selecting one item could make * others unselectable. */ 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; #endif 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 (i == P_TWO_WEAPON_COMBAT && youmonst.data->mattk[1].aatyp != AT_WEAP) 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_void = 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 weapon skills for spellcaster roles. */ for (pass = 0; pass < SIZE(skill_ranges); pass++) for (i = skill_ranges[pass].first; i <= skill_ranges[pass].last; i++) { /* Print headings for skill types */ any.a_void = 0; if (i == skill_ranges[pass].first) add_menu(win, NO_GLYPH, &any, 0, 0, iflags.menu_headings, skill_ranges[pass].name, MENU_UNSELECTED); if (P_RESTRICTED(i)) continue; if (i == P_TWO_WEAPON_COMBAT && youmonst.data->mattk[1].aatyp != AT_WEAP) 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 %4d(%4d)", prefix, longest, P_NAME(i), sklnambuf, P_ADVANCE(i), practice_needed_to_advance(P_SKILL(i), 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), 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); destroy_nhwindow(win); if (n > 0) { n = selected[0].item.a_int - 1; /* get item selected */ free((genericptr_t)selected); skill_advance(n); /* check for more skills able to advance, if so then .. */ for (n = i = 0; i < P_NUM_SKILLS; i++) { if (can_advance(i, speedy)) { if (!speedy) You_feel("you could be more dangerous!"); n++; break; } } } } while (speedy && n > 0); return 0; } /* * Change from restricted to unrestricted, allowing P_BASIC as max. This * function may be called with with P_NONE. Used in pray.c. */ void unrestrict_weapon_skill(skill) int skill; { if (skill < P_NUM_SKILLS && P_RESTRICTED(skill)) { P_SKILL(skill) = P_UNSKILLED; P_MAX_SKILL(skill) = P_BASIC; P_ADVANCE(skill) = 0; } } #endif /* OVL1 */ #ifdef OVLB void use_skill(skill,degree) int skill; int degree; { boolean advance_before; /* if (skill != P_NONE && !P_RESTRICTED(skill)) {*/ if (skill != P_NONE) { advance_before = can_advance(skill, FALSE); P_ADVANCE(skill) += degree; if (!advance_before && can_advance(skill, FALSE)) { give_may_advance_msg(skill); if (P_RESTRICTED(skill)) { unrestrict_weapon_skill(skill); } } } } void add_weapon_skill(n) int n; /* number of slots to gain; normally one */ { int i, before, after; for (i = 0, before = 0; i < P_NUM_SKILLS; i++) if (can_advance(i, FALSE)) before++; u.weapon_slots += n; for (i = 0, after = 0; i < P_NUM_SKILLS; i++) if (can_advance(i, FALSE)) after++; if (before < after) give_may_advance_msg(P_NONE); } void lose_weapon_skill(n) int n; /* number of slots to lose; normally one */ { int skill; boolean maybe_loose_disarm = FALSE; while (--n >= 0) { /* deduct first from unused slots, then from last placed slot, if any */ if (u.weapon_slots) { u.weapon_slots--; } else if (u.skills_advanced) { skill = u.skill_record[--u.skills_advanced]; if (P_SKILL(skill) <= P_UNSKILLED) panic("lose_weapon_skill (%d)", skill); if (skill <= P_LAST_WEAPON && skill != P_WHIP && P_SKILL(skill) == P_SKILLED) maybe_loose_disarm = TRUE; P_SKILL(skill)--; /* drop skill one level */ /* Lost skill might have taken more than one slot; refund rest. */ u.weapon_slots = slots_required(skill) - 1; /* It might now be possible to advance some other pending skill by using the refunded slots, but giving a message to that effect would seem pretty confusing.... */ } } if (maybe_loose_disarm && tech_known(T_DISARM)) { int i; for(i = u.skills_advanced - 1; i >= 0; i--) { skill = u.skill_record[i]; if (skill <= P_LAST_WEAPON && skill != P_WHIP && P_SKILL(skill) >= P_SKILLED) break; } if (i < 0) learntech(T_DISARM, FROMOUTSIDE, -1); } } int weapon_type(obj) struct obj *obj; { /* KMH, balance patch -- now uses the object table */ int type; if (!obj) /* Not using a weapon */ return (martial_bonus() ? P_MARTIAL_ARTS : P_BARE_HANDED_COMBAT); if (obj->oclass != WEAPON_CLASS && obj->oclass != TOOL_CLASS && obj->oclass != GEM_CLASS) /* Not a weapon, weapon-tool, or ammo */ return (P_NONE); type = objects[obj->otyp].oc_skill; return ((type < 0) ? -type : type); } int uwep_skill_type() { if (u.twoweap) return P_TWO_WEAPON_COMBAT; return weapon_type(uwep); } /* * Return hit bonus/penalty based on skill of weapon. * Treat restricted weapons as unskilled. */ int weapon_hit_bonus(weapon) struct obj *weapon; { int type, wep_type, bonus = 0; #if 0 int skill; #endif static const char bad_skill[] = "weapon_hit_bonus: bad skill %d"; wep_type = weapon_type(weapon); #if 0 /* 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; #endif type = wep_type; if (type == P_NONE) { bonus = 0; } else if (type <= P_LAST_WEAPON) { switch (P_SKILL(type)) { default: impossible(bad_skill, P_SKILL(type)); /* fall through */ case P_ISRESTRICTED: case P_UNSKILLED: bonus = -4; break; case P_BASIC: bonus = 0; break; case P_SKILLED: bonus = 1; break; case P_EXPERT: bonus = 2; break; case P_MASTER: bonus = 3; break; case P_GRAND_MASTER: bonus = 4; break; } /* WAC -- No longer needed here... */ #if 0 } 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; case P_SKILLED: bonus = -5; break; case P_EXPERT: bonus = -3; break; case P_MASTER: bonus = -1; break; case P_GRAND_MASTER: bonus = 1; break; } if (u.twoweap) bonus -= 2; } #endif /* WAC because we split Martial Arts and Bare handed */ } else if (type <= P_LAST_H_TO_H) { /* * 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 /* KMH -- It's harder to hit while you are riding */ if (u.usteed) { switch (P_SKILL(P_RIDING)) { case P_ISRESTRICTED: case P_UNSKILLED: bonus -= 2; break; case P_BASIC: bonus -= 1; break; case P_SKILLED: break; case P_EXPERT: break; case P_MASTER: bonus += 1; break; case P_GRAND_MASTER: bonus += 2; break; } if (type == P_LANCE) bonus++; } #endif return bonus; } /* * Return damage bonus/penalty based on skill of weapon. * Treat restricted weapons as unskilled. */ int weapon_dam_bonus(weapon) struct obj *weapon; { int type, wep_type, bonus = 0; #if 0 int skill; #endif wep_type = weapon_type(weapon); #if 0 /* 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; #endif type = wep_type; if (type == P_NONE) { bonus = 0; } else if (type <= P_LAST_WEAPON) { switch (P_SKILL(type)) { default: impossible("weapon_dam_bonus: bad skill %d",P_SKILL(type)); /* fall through */ case P_ISRESTRICTED: case P_UNSKILLED: bonus = -2; break; case P_BASIC: bonus = 0; break; case P_SKILLED: bonus = 1; break; case P_EXPERT: bonus = 2; break; case P_MASTER: bonus = 3; break; case P_GRAND_MASTER:bonus = 4; break; } #if 0 } 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: case P_UNSKILLED: bonus = -3; break; case P_BASIC: bonus = -1; break; case P_SKILLED: bonus = 0; break; case P_EXPERT: bonus = 1; break; } #endif /* from == P_bare... to < = P_last_h.... */ } else if (type <= P_LAST_H_TO_H) { /* * 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; } /* Misc skills aren't usually called by weapons */ #ifdef STEED /* KMH -- Riding gives some thrusting damage */ if (u.usteed) { switch (P_SKILL(P_RIDING)) { case P_ISRESTRICTED: case P_UNSKILLED: break; case P_BASIC: break; case P_SKILLED: bonus += 1; break; case P_EXPERT: bonus += 2; break; } } #endif return bonus; } int skill_bonus(type) int type; { int bonus = 0; if (type == P_NONE) { bonus = 0; } else if (type <= P_LAST_WEAPON) { switch (P_SKILL(type)) { default: impossible("skill_bonus: bad skill %d",P_SKILL(type)); /* fall through */ case P_ISRESTRICTED: case P_UNSKILLED: bonus = -2; break; case P_BASIC: bonus = 0; break; case P_SKILLED: bonus = 1; break; case P_EXPERT: bonus = 2; break; case P_MASTER: bonus = 3; break; case P_GRAND_MASTER: bonus = 4; break; } } else if (type == P_BARE_HANDED_COMBAT || type == P_MARTIAL_ARTS) { bonus = (P_SKILL(type) * (martial_bonus() ? 2 : 1)) / 2; } else { /* Misc. */ switch (P_SKILL(type)) { default: impossible("skill_bonus: bad skill %d",P_SKILL(type)); /* fall through */ case P_ISRESTRICTED: case P_UNSKILLED: bonus = -2; break; case P_BASIC: bonus = 0; break; case P_SKILLED: bonus = 1; break; case P_EXPERT: bonus = 2; break; case P_MASTER: bonus = 3; break; case P_GRAND_MASTER: bonus = 4; break; } } return bonus; } /* Try to return an associated skill for the specified object */ static int get_obj_skill(obj) struct obj *obj; { int skill; /* Try for a weapon skill */ skill = weapon_type(obj); /* Try for a spell type */ if (skill == P_NONE && obj->oclass == SPBOOK_CLASS) skill = spell_skilltype(obj->otyp); /* Should be integrated into oc_subtyp as soon as more skills are * invented */ #ifdef STEED if (obj->otyp == SADDLE) skill = P_RIDING; #endif /* Negative skills == not a skill */ if (skill < P_NONE) skill = P_NONE; return (skill); } /* * Initialize weapon skill array for the game. Start by setting all * skills to restricted, then set the skill for every weapon the * hero is holding, finally reading the given array that sets * maximums. */ void skill_init(class_skill) const struct def_skill *class_skill; { struct obj *obj; int skmax, skill; /* initialize skill array; by default, everything is restricted */ for (skill = 0; skill < P_NUM_SKILLS; skill++) { P_SKILL(skill) = P_ISRESTRICTED; P_MAX_SKILL(skill) = P_ISRESTRICTED; P_ADVANCE(skill) = 0; } /* Walk through array to set skill maximums */ for (; class_skill->skill != P_NONE; class_skill++) { skill = class_skill->skill; skmax = class_skill->skmax; P_MAX_SKILL(skill) = skmax; if (P_SKILL(skill) == P_ISRESTRICTED) /* skill pre-set */ P_SKILL(skill) = P_UNSKILLED; /* Really high potential in the skill * Right now only used for H to H skills */ if (P_MAX_SKILL(skill) > P_EXPERT) P_SKILL(skill) = P_BASIC; } /* Set skill for all objects in inventory to be basic */ for (obj = invent; obj; obj = obj->nobj) { skill = get_obj_skill(obj); if (skill != P_NONE) { P_SKILL(skill) = P_BASIC; /* KMH -- If you came into the dungeon with it, you should at least be skilled */ if (P_MAX_SKILL(skill) < P_SKILLED) { pline("Warning: %s should be at least skilled. Fixing...", P_NAME(skill)); P_MAX_SKILL(skill) = P_SKILLED; } } } #if 0 /* This should all be handled above now... */ /* set skills for magic */ /* WAC - added setup for role is F, I, M or N*/ if (Role_if(PM_HEALER) || Role_if(PM_MONK)) { P_SKILL(P_HEALING_SPELL) = P_BASIC; } else if (Role_if(PM_PRIEST)) { P_SKILL(P_PROTECTION_SPELL) = P_BASIC; } else if (Role_if(PM_NECROMANCER)) { P_SKILL(P_ATTACK_SPELL) = P_BASIC; } else if (Role_if(PM_FLAME_MAGE) || Role_if(PM_ICE_MAGE)) { P_SKILL(P_MATTER_SPELL) = P_BASIC; } else if (Role_if(PM_WIZARD)) { P_SKILL(P_ATTACK_SPELL) = P_BASIC; P_SKILL(P_ENCHANTMENT_SPELL) = P_BASIC; } /* High potential fighters already know how to use their hands. */ if (P_MAX_SKILL(P_BARE_HANDED_COMBAT) > P_EXPERT) P_SKILL(P_BARE_HANDED_COMBAT) = P_BASIC; if (P_MAX_SKILL(P_MARTIAL_ARTS) > P_EXPERT) P_SKILL(P_MARTIAL_ARTS) = P_BASIC; #endif /* Roles that start with a horse know how to ride it */ #ifdef STEED if (urole.petnum == PM_PONY) P_SKILL(P_RIDING) = P_BASIC; #endif /* * Make sure we haven't missed setting the max on a skill * & set advance */ for (skill = 0; skill < P_NUM_SKILLS; skill++) { if (!P_RESTRICTED(skill)) { if (P_MAX_SKILL(skill) < P_SKILL(skill)) { impossible("skill_init: curr > max: %s", P_NAME(skill)); P_MAX_SKILL(skill) = P_SKILL(skill); } P_ADVANCE(skill) = practice_needed_to_advance(P_SKILL(skill)-1,skill); } } } /*WAC weapon practice code*/ STATIC_PTR int practice() { if (delay) { /* not if (delay++), so at end delay == 0 */ delay++; use_skill(weapon_type(uwep), 1); /*WAC a bit of practice so even if you're interrupted you won't be wasting your time ;B*/ return(1); /* still busy */ } You("finish your practice session."); use_skill(weapon_type(uwep), practice_needed_to_advance(P_SKILL(weapon_type(uwep)),weapon_type(uwep))/3); return(0); } void practice_weapon() { if (can_practice(weapon_type(uwep)) #ifdef WIZARD || (wizard && (yn("Skill at normal max. Practice?") == 'y')) #endif ) { if (uwep) You("start practicing intensely with %s",doname(uwep)); else You("start practicing intensely with your %s %s.", uarmg ? "gloved" : "bare", /* Del Lamb */ makeplural(body_part(HAND))); delay=-10; set_occupation(practice, "practicing", 0); } else if (P_SKILL(weapon_type(uwep)) >= P_MAX_SKILL(weapon_type(uwep))) You("cannot increase your skill in %s.", P_NAME(weapon_type(uwep))); else You("cannot learn much about %s right now.", P_NAME(weapon_type(uwep))); } 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 */ /*weapon.c*/ slashem-0.0.7E7F3/src/monst.c0000664000076400007640000072460510545462317013765 0ustar aliali/* 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. */ #include "config.h" #include "permonst.h" #include "monsym.h" #include "dungeon.h" /* prerequisite for eshk,vault,epri */ #include "eshk.h" #include "vault.h" #include "epri.h" #include "egyp.h" /* #ifdef MUSE */ #define MARM(x,y) x /* x is usually 10 */ /* #else #define MARM(x,y) y #endif */ #define NO_ATTK {0,0,0,0} #define WT_ELF 800 #define WT_DRAGON 4500 #ifdef C #undef C #endif #ifdef TEXTCOLOR #include "color.h" #define C(color) color #define HI_DOMESTIC CLR_WHITE /* use for player + friendlies */ #define HI_LORD CLR_MAGENTA #else #define C(color) #endif void NDECL(monst_init); /* * Entry Format: (from permonst.h) * * name, symbol (S_* defines), * difficulty level, move rate, armor class, magic resistance, * alignment, creation/geno flags (G_* defines), * 6 * attack structs ATTK(type , damage-type, # dice, # sides), * weight (WT_* defines), nutritional value, extension length, * sounds made (MS_* defines), physical size (MZ_* defines), * resistances, resistances conferred (both MR_* defines), * 3 * flag bitmaps (M1_*, M2_*, and M3_* defines respectively) * symbol color (C(x) macro) */ #define MON(nam,sym,lvl,gen,atk,siz,mr1,mr2,flg1,flg2,flg3,col) \ {nam,sym,lvl,gen,atk,siz,mr1,mr2,flg1,flg2,flg3,C(col)} /* LVL() and SIZ() collect several fields to cut down on # of args for MON() */ #define LVL(lvl,mov,ac,mr,aln) lvl,mov,ac,mr,aln #define SIZ(wt,nut,pxl,snd,siz) wt,nut,pxl,snd,siz /* ATTK() and A() are to avoid braces and commas within args to MON() */ #define ATTK(at,ad,n,d) {at,ad,n,d} #define A(a1,a2,a3,a4,a5,a6) {a1,a2,a3,a4,a5,a6} /* * Rule #1: monsters of a given class are contiguous in the * mons[] array. * * Rule #2: monsters of a given class are presented in ascending * order of strength. * * Rule #3: monster frequency is included in the geno mask; * the frequency can be from 0 to 7. 0's will also * be skipped during generation. * * Rule #4: monster subclasses (e.g. giants) should be kept * together, unless it violates Rule 2. NOGEN monsters * won't violate Rule 2. * * Guidelines for color assignment: * * * Use the same color for all `growth stages' of a monster (ex. * little dog/big dog, baby naga/full-grown naga. * * * Use colors given in names wherever possible. If the class has `real' * members with strong color associations, use those. * * * Favor `cool' colors for cold-resistent monsters, `warm' ones for * fire-resistent ones. * * * Try to reserve purple (magenta) for powerful `ruler' monsters (queen * bee, kobold lord, &c.). * * * Subject to all these constraints, try to use color to make as many * distinctions as the / command (that is, within a monster letter * distinct names should map to distinct colors). * * The aim in assigning colors is to be consistent enough so a player can * become `intuitive' about them, deducing some or all of these rules * unconsciously. Use your common sense. */ /* [Tom] I increased frequencies of all the "old" monsters, so the new ones * are all that much more rare and special */ /* [Tom] I made many monsters NOHELL -- mostly natural animals and stuff */ #ifndef SPLITMON_2 NEARDATA struct permonst mons[] = { /* * ants */ MON("giant ant", S_ANT, LVL(2, 18, 3, 0, 0), (G_NOHELL|G_GENO|G_SGROUP|4), A(ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(10, 10, 0, MS_SILENT, MZ_TINY), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_OVIPAROUS|M1_CARNIVORE, M2_HOSTILE, 0, CLR_BROWN), MON("giant tick", S_ANT, LVL(1, 12, 9, 0, 0), (G_GENO|G_SGROUP|G_HELL|G_NOGEN), A(ATTK(AT_BITE, AD_PHYS, 1, 1), ATTK(AT_MULTIPLY, 0, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(5, 10, 0, MS_SILENT, MZ_TINY), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_OVIPAROUS|M1_CARNIVORE, M2_HOSTILE, 0, CLR_GRAY), MON("killer bee", S_ANT, LVL(1, 18, -1, 0, 0), (G_NOHELL|G_GENO|G_LGROUP|3), A(ATTK(AT_STNG, AD_DRST, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1, 5, 0, MS_BUZZ, MZ_TINY), MR_POISON, MR_POISON, M1_ANIMAL|M1_FLY|M1_NOHANDS|M1_POIS, M2_HOSTILE|M2_FEMALE, 0, CLR_YELLOW), MON("giant flea", S_ANT, LVL(3, 14, 8, 0, 0), (G_GENO|G_SGROUP|G_HELL|G_NOGEN), A(ATTK(AT_BITE, AD_PHYS, 1, 2), ATTK(AT_BITE, AD_PHYS, 1, 2), ATTK(AT_MULTIPLY, 0, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(5, 10, 0, MS_SILENT, MZ_TINY), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_OVIPAROUS|M1_CARNIVORE, M2_HOSTILE, 0, CLR_GRAY), MON("soldier ant", S_ANT, LVL(3, 18, 3, 0, 0), (G_NOHELL|G_GENO|G_SGROUP|3), A(ATTK(AT_BITE, AD_PHYS, 2, 4), ATTK(AT_STNG, AD_DRST, 3, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(20, 5, 0, MS_SILENT, MZ_TINY), MR_POISON, MR_POISON, M1_ANIMAL|M1_NOHANDS|M1_OVIPAROUS|M1_POIS|M1_CARNIVORE, M2_HOSTILE, 0, CLR_BLUE), MON("fire ant", S_ANT, LVL(3, 18, 3, 10, 0), (G_GENO|G_SGROUP|3), A(ATTK(AT_BITE, AD_PHYS, 2, 4), ATTK(AT_BITE, AD_FIRE, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(30, 10, 0, MS_SILENT, MZ_TINY), MR_FIRE, MR_FIRE, M1_ANIMAL|M1_NOHANDS|M1_OVIPAROUS|M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, CLR_RED), MON("snow ant", S_ANT, LVL(3, 18, 3, 10, 0), (G_NOHELL|G_GENO|G_SGROUP|1), A(ATTK(AT_BITE, AD_PHYS, 2, 4), ATTK(AT_BITE, AD_COLD, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(30, 10, 0, MS_SILENT, MZ_TINY), MR_COLD, MR_COLD, M1_ANIMAL|M1_NOHANDS|M1_OVIPAROUS|M1_CARNIVORE, M2_HOSTILE, 0, CLR_CYAN), MON("giant beetle", S_ANT, LVL(5, 6, 4, 0, 0), (G_NOHELL|G_GENO|4), A(ATTK(AT_BITE, AD_PHYS, 3, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(10, 10, 0, MS_SILENT, MZ_LARGE), MR_POISON, MR_POISON, M1_ANIMAL|M1_NOHANDS|M1_POIS|M1_CARNIVORE, M2_HOSTILE, 0, CLR_BLACK), MON("giant louse", S_ANT, LVL(5, 16, 6, 0, 0), (G_GENO|G_SGROUP|G_HELL|G_NOGEN), A(ATTK(AT_BITE, AD_PHYS, 1, 4), ATTK(AT_BITE, AD_PHYS, 1, 4), ATTK(AT_MULTIPLY, 0, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(10, 10, 0, MS_SILENT, MZ_TINY), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_OVIPAROUS|M1_CARNIVORE, M2_HOSTILE, 0, CLR_GRAY), MON("tsetse fly", S_ANT, LVL(3, 15, 0, 0, 0), (G_HELL|G_GENO|G_SGROUP|1), A(ATTK(AT_STNG, AD_SLEE, 1, 3), ATTK(AT_STNG, AD_PHYS, 1, 3), NO_ATTK,NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1, 5, 0, MS_BUZZ, MZ_TINY), MR_POISON|MR_SLEEP, MR_POISON|MR_SLEEP, M1_ANIMAL|M1_FLY|M1_NOHANDS|M1_POIS, M2_HOSTILE|M2_NASTY, 0, CLR_GREEN), MON("migo drone", S_ANT, LVL(7, 12, 0, 10, -5), (G_GENO|G_LGROUP|2), A(ATTK(AT_STNG, AD_DRST, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(500, 50, 0, MS_BUZZ, MZ_MEDIUM), MR_POISON, MR_POISON, M1_FLY|M1_POIS|M1_SEE_INVIS|M1_OMNIVORE, M2_NEUTER|M2_WANDER|M2_STRONG|M2_COLLECT|M2_MAGIC|M2_GREEDY|M2_JEWELS|M2_HOSTILE, M3_INFRAVISION|M3_TRAITOR, CLR_GREEN), MON("queen bee", S_ANT, LVL(9, 24, -4, 0, 0), (G_NOHELL|G_GENO|G_NOGEN), A(ATTK(AT_STNG, AD_DRST, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1, 5, 0, MS_BUZZ, MZ_TINY), MR_POISON, MR_POISON, M1_ANIMAL|M1_FLY|M1_NOHANDS|M1_OVIPAROUS|M1_POIS, M2_HOSTILE|M2_FEMALE|M2_PRINCE, 0, HI_LORD), MON("yellow jacket", S_ANT, LVL(8, 15, 2, 0, 0), (G_NOHELL|G_GENO|G_LGROUP|1), A(ATTK(AT_STNG, AD_DRST, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(30, 10, 0, MS_BUZZ, MZ_SMALL), MR_POISON, MR_POISON, M1_ANIMAL|M1_FLY|M1_NOHANDS|M1_POIS, M2_HOSTILE|M2_FEMALE, 0, CLR_YELLOW), MON("black wasp", S_ANT, LVL(9, 15, 2, 0, 0), (G_NOHELL|G_GENO|G_LGROUP|1), A(ATTK(AT_STNG, AD_DRST, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(300, 100, 0, MS_BUZZ, MZ_MEDIUM), MR_POISON, MR_POISON, M1_ANIMAL|M1_FLY|M1_NOHANDS|M1_POIS, M2_HOSTILE|M2_FEMALE, 0, CLR_YELLOW), MON("migo warrior", S_ANT, LVL(10, 18, -3, 30, -7), (G_GENO|G_SGROUP|1), A(ATTK(AT_STNG, AD_DRST, 1, 3), ATTK(AT_BITE, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(600, 50, 0, MS_BUZZ, MZ_MEDIUM), MR_POISON, MR_POISON, M1_FLY|M1_POIS|M1_SEE_INVIS|M1_OMNIVORE, M2_MALE|M2_STRONG|M2_COLLECT|M2_MAGIC|M2_HOSTILE, M3_INFRAVISION|M3_TRAITOR, CLR_YELLOW), MON("giant wasp", S_ANT, LVL(12, 15, 2, 0, 0), (G_NOHELL|G_GENO|G_LGROUP|1), A(ATTK(AT_STNG, AD_DRST, 2, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(300, 100, 0, MS_BUZZ, MZ_MEDIUM), MR_POISON, MR_POISON, M1_ANIMAL|M1_FLY|M1_NOHANDS|M1_POIS, M2_HOSTILE|M2_FEMALE, 0, CLR_BLACK), MON("spitting beetle", S_ANT, LVL(14, 6, -4, 0, 0), (G_NOHELL|G_GENO|1), A(ATTK(AT_BITE, AD_PHYS, 4, 6), ATTK(AT_SPIT, AD_ACID, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(100, 100, 0, MS_SILENT, MZ_LARGE), MR_POISON, MR_POISON, M1_ANIMAL|M1_NOHANDS|M1_POIS|M1_CARNIVORE, M2_HOSTILE, 0, CLR_BROWN), MON("migo queen", S_ANT, LVL(15, 15, -3, 50, -9), (G_GENO|G_NOGEN), A(ATTK(AT_STNG, AD_DRIN, 1, 3), ATTK(AT_BITE, AD_PHYS, 6, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1500, 100, 0, MS_BUZZ, MZ_LARGE), MR_POISON, MR_POISON, M1_FLY|M1_POIS|M1_SEE_INVIS|M1_OMNIVORE, M2_FEMALE|M2_STRONG|M2_COLLECT|M2_MAGIC|M2_HOSTILE, M3_INFRAVISION|M3_NOTAME, HI_LORD), MON("assassin bug", S_ANT, LVL(10, 24, 4, 0, 0), (G_NOHELL|G_GENO|1), A(ATTK(AT_BITE, AD_DRST, 4, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(100, 100, 0, MS_SILENT, MZ_LARGE), MR_POISON, MR_POISON, M1_ANIMAL|M1_NOHANDS|M1_POIS|M1_CARNIVORE, M2_HOSTILE, M3_TRAITOR, CLR_BLACK), MON("killer beetle", S_ANT, LVL(19, 6, -4, 0, 0), (G_NOHELL|G_GENO|1), A(ATTK(AT_BITE, AD_PHYS, 6, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(100, 100, 0, MS_SILENT, MZ_LARGE), MR_POISON, MR_POISON, M1_ANIMAL|M1_NOHANDS|M1_POIS|M1_CARNIVORE, M2_HOSTILE, 0, CLR_ORANGE), /* * blobs */ MON("acid blob", S_BLOB, LVL(1, 3, 8, 0, 0), (G_NOHELL|G_GENO|3), A(ATTK(AT_NONE, AD_ACID, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(30, 10, 0, MS_SILENT, MZ_TINY), MR_SLEEP|MR_POISON|MR_ACID|MR_STONE, MR_STONE, M1_BREATHLESS|M1_AMORPHOUS|M1_NOEYES|M1_NOLIMBS|M1_NOHEAD| M1_MINDLESS|M1_ACID, M2_WANDER|M2_NEUTER, 0, CLR_GREEN), MON("quivering blob", S_BLOB, LVL(5, 1, 8, 0, 0), (G_NOHELL|G_GENO|3), A(ATTK(AT_TUCH, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(200, 100, 0, MS_SILENT, MZ_SMALL), MR_SLEEP|MR_POISON, MR_POISON, M1_NOEYES|M1_NOLIMBS|M1_NOHEAD|M1_MINDLESS, M2_WANDER|M2_HOSTILE|M2_NEUTER, 0, CLR_WHITE), MON("gelatinous cube", S_BLOB, LVL(6, 6, 8, 0, 0), (G_NOHELL|G_GENO|3), A(ATTK(AT_TUCH, AD_PLYS, 2, 4), ATTK(AT_NONE, AD_PLYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(600, 150, 0, MS_SILENT, MZ_LARGE), MR_FIRE|MR_COLD|MR_ELEC|MR_SLEEP|MR_POISON|MR_ACID|MR_STONE, MR_FIRE|MR_COLD|MR_ELEC|MR_SLEEP, M1_NOEYES|M1_NOLIMBS|M1_NOHEAD|M1_MINDLESS|M1_OMNIVORE|M1_ACID, M2_WANDER|M2_HOSTILE|M2_NEUTER, 0, CLR_CYAN), MON("jiggling blob", S_BLOB, LVL(10, 6, 8, 0, 0), (G_NOHELL|G_GENO|1), A(ATTK(AT_TUCH, AD_PHYS, 2, 8), ATTK(AT_NONE, AD_ACID, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(200, 100, 0, MS_SILENT, MZ_LARGE), MR_SLEEP|MR_POISON, MR_POISON, M1_NOEYES|M1_NOLIMBS|M1_NOHEAD|M1_MINDLESS, M2_WANDER|M2_HOSTILE|M2_NEUTER, 0, CLR_MAGENTA), MON("lava blob", S_BLOB, LVL(10, 6, 8, 0, 0), (G_GENO|1), A(ATTK(AT_TUCH, AD_FIRE, 4, 4), ATTK(AT_NONE, AD_FIRE, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(200, 100, 0, MS_SILENT, MZ_LARGE), MR_SLEEP|MR_FIRE, MR_FIRE, M1_NOEYES|M1_NOLIMBS|M1_NOHEAD|M1_MINDLESS, M2_WANDER|M2_HOSTILE|M2_NEUTER, 0, CLR_RED), MON("static blob", S_BLOB, LVL(12, 6, 8, 0, 0), (G_NOHELL|G_GENO|1), A(ATTK(AT_TUCH, AD_ELEC, 3, 8), ATTK(AT_NONE, AD_ELEC, 3, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(200, 100, 0, MS_SILENT, MZ_LARGE), MR_SLEEP|MR_POISON|MR_ELEC, MR_POISON|MR_ELEC, M1_NOEYES|M1_NOLIMBS|M1_NOHEAD|M1_MINDLESS, M2_WANDER|M2_HOSTILE|M2_NEUTER, 0, HI_ZAP), MON("burbling blob", S_BLOB, LVL(14, 6, 8, 0, 0), (G_NOHELL|G_GENO|1), A(ATTK(AT_TUCH, AD_PHYS, 2, 8), ATTK(AT_NONE, AD_ACID, 5, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(200, 100, 0, MS_SILENT, MZ_LARGE), MR_SLEEP|MR_POISON, MR_POISON, M1_NOEYES|M1_NOLIMBS|M1_NOHEAD|M1_MINDLESS, M2_WANDER|M2_HOSTILE|M2_NEUTER, 0, CLR_BLACK), /* * cockatrice */ MON("chicken", S_COCKATRICE, LVL(2, 15, 8, 0, 0), (G_GENO|G_SGROUP|1), A(ATTK(AT_BITE, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(100, 50, 0, MS_CHICKEN, MZ_SMALL), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_HERBIVORE, M2_WANDER|M2_DOMESTIC, M3_INFRAVISIBLE, CLR_BROWN), MON("cockatoo", S_COCKATRICE, LVL(3, 15, 6, 0, 0), (G_GENO|G_SGROUP|1), A(ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(75, 30, 0, MS_PARROT, MZ_SMALL), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_HERBIVORE, M2_WANDER|M2_DOMESTIC, M3_INFRAVISIBLE, CLR_WHITE), MON("chickatrice", S_COCKATRICE, LVL(4, 4, 8, 30, 0), (G_GENO|G_SGROUP|1), A(ATTK(AT_BITE, AD_PHYS, 1, 2), ATTK(AT_TUCH, AD_STON, 0, 0), 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|6), 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_HITASTWO, 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), MON("parrot", S_COCKATRICE, LVL(7, 15, 6, 0, 0), (G_GENO|1), A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(75, 30, 0, MS_PARROT, MZ_SMALL), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_HERBIVORE, M2_WANDER|M2_DOMESTIC, M3_INFRAVISIBLE, CLR_GREEN), /* * dogs & other canines */ MON("jackal", S_DOG, LVL(0, 12, 7, 0, 0), (G_NOHELL|G_GENO|G_SGROUP|4), A(ATTK(AT_BITE, AD_PHYS, 1, 2), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(300, 250, 0, MS_BARK, MZ_SMALL), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, CLR_BROWN), MON("fox", S_DOG, LVL(0, 15, 7, 0, 0), (G_GENO|1), A(ATTK(AT_BITE, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(300, 250, 0, MS_BARK, MZ_SMALL), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, CLR_RED), MON("coyote", S_DOG, LVL(1, 12, 7, 0, 0), (G_GENO|G_SGROUP|1), A(ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(300, 250, 0, MS_BARK, MZ_SMALL), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, CLR_BROWN), MON("werejackal", S_DOG, LVL(2, 12, 7, 10, -7), (G_NOGEN|G_NOCORPSE), A(ATTK(AT_BITE, AD_WERE, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(300, 250, 0, MS_BARK, MZ_SMALL), MR_POISON|MR_HITASONE, 0, M1_NOHANDS|M1_POIS|M1_REGEN|M1_CARNIVORE, M2_NOPOLY|M2_WERE|M2_HOSTILE, M3_INFRAVISIBLE, CLR_BROWN), MON("little dog", S_DOG, LVL(2, 18, 6, 0, 0), (G_NOHELL|G_GENO|7), A(ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(150, 150, 0, MS_BARK, MZ_SMALL), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_DOMESTIC, M3_INFRAVISIBLE, HI_DOMESTIC), MON("dog", S_DOG, LVL(4, 16, 5, 0, 0), (G_NOHELL|G_GENO|7), A(ATTK(AT_BITE, AD_PHYS, 1 ,6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(400, 200, 0, MS_BARK, MZ_MEDIUM), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_DOMESTIC, M3_INFRAVISIBLE, HI_DOMESTIC), MON("large dog", S_DOG, LVL(6, 15, 4, 0, 0), (G_NOHELL|G_GENO|7), A(ATTK(AT_BITE, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(800, 250, 0, MS_BARK, MZ_MEDIUM), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_STRONG|M2_DOMESTIC, M3_INFRAVISIBLE, HI_DOMESTIC), MON("pit bull", S_DOG, LVL(11, 15, 4, 0, 0), (G_NOHELL|G_GENO|1), A(ATTK(AT_BITE, AD_PHYS, 4, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(800, 250, 0, MS_BARK, MZ_MEDIUM), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_STRONG|M2_DOMESTIC, M3_INFRAVISIBLE, HI_DOMESTIC), MON("dingo puppy", S_DOG, LVL(2, 18, 6, 0, 0), (G_NOHELL|G_GENO|1), A(ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(150, 150, 0, MS_BARK, MZ_SMALL), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, CLR_YELLOW), MON("dingo", S_DOG, LVL(4, 16, 5, 0, 0), (G_GENO|1), A(ATTK(AT_BITE, AD_PHYS, 1 ,6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(400, 200, 0, MS_BARK, MZ_MEDIUM), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, CLR_YELLOW), MON("large dingo", S_DOG, LVL(6, 15, 4, 0, 0), (G_NOHELL|G_GENO|1), A(ATTK(AT_BITE, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(800, 250, 0, MS_BARK, MZ_MEDIUM), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_STRONG|M2_HOSTILE, M3_INFRAVISIBLE, CLR_YELLOW), MON("wolf", S_DOG, LVL(5, 12, 4, 0, 0), (G_NOHELL|G_GENO|G_SGROUP|3), 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("death dog", S_DOG, LVL(2, 12, 7, 0, 0), (G_HELL|G_GENO|G_SGROUP|1), A(ATTK(AT_BITE, AD_PHYS, 1, 10), ATTK(AT_BITE, AD_PHYS, 1, 10), 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_TRAITOR, CLR_BLACK), MON("rabid wolf", S_DOG, LVL(6, 12, 4, 0, 0), (G_NOHELL|G_GENO|1), A(ATTK(AT_BITE, AD_DRCO, 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|M3_TRAITOR, CLR_BROWN), MON("werewolf", S_DOG, LVL(5, 12, 4, 20, -7), (G_NOGEN|G_NOCORPSE), A(ATTK(AT_BITE, AD_WERE, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(500, 250, 0, MS_BARK, MZ_MEDIUM), MR_POISON|MR_HITASTWO, 0, M1_NOHANDS|M1_POIS|M1_REGEN|M1_CARNIVORE, M2_NOPOLY|M2_WERE, M3_INFRAVISIBLE, CLR_BROWN), MON("warg", S_DOG, LVL(7, 12, 4, 0, -5), (G_NOHELL|G_GENO|G_SGROUP|3), A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(850, 350, 0, MS_BARK, MZ_MEDIUM), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, CLR_BROWN), MON("winter wolf cub", S_DOG, LVL(5, 12, 4, 0, -5), (G_NOHELL|G_GENO|G_SGROUP|2), A(ATTK(AT_BITE, AD_PHYS, 1, 8), ATTK(AT_BREA, AD_COLD, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(250, 200, 0, MS_BARK, MZ_SMALL), MR_COLD, MR_COLD, M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE, 0, CLR_CYAN), MON("winter wolf", S_DOG, LVL(7, 12, 4, 20, 0), (G_NOHELL|G_GENO|1), A(ATTK(AT_BITE, AD_PHYS, 3, 6), ATTK(AT_BREA, AD_COLD, 3, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(700, 300, 0, MS_BARK, MZ_LARGE), MR_COLD, MR_COLD, M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE|M2_STRONG, 0, CLR_CYAN), MON("hell hound pup", S_DOG, LVL(7, 12, 4, 20, -5), (G_HELL|G_GENO|G_SGROUP|1), A(ATTK(AT_BITE, AD_PHYS, 2, 6), ATTK(AT_BREA, AD_FIRE, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(200, 200, 0, MS_BARK, MZ_SMALL), MR_FIRE, MR_FIRE, M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, CLR_RED), MON("wolverine", S_DOG, LVL(9, 15, 4, 0, -8), (G_NOHELL|G_GENO|1), A(ATTK(AT_BITE, AD_PHYS, 4, 6), ATTK(AT_CLAW, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(850, 350, 0, MS_BARK, MZ_MEDIUM), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, CLR_GRAY), MON("shadow wolf", S_DOG, LVL(11, 15, 4, 0, -8), (G_GENO|G_SGROUP|1), A(ATTK(AT_BITE, AD_COLD, 4, 6), ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(850, 350, 0, MS_BARK, MZ_MEDIUM), MR_PLUSONE|MR_HITASTWO, 0, M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE, M3_TRAITOR, CLR_BLACK), MON("mist wolf", S_DOG, LVL(12, 18, 4, 0, 0), (G_NOHELL|G_GENO|G_SGROUP|1), A(ATTK(AT_BITE, AD_COLD, 4, 6), ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(850, 350, 0, MS_BARK, MZ_MEDIUM), MR_PLUSONE|MR_HITASTWO, 0, M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE, 0, CLR_GREEN), MON("hell hound", S_DOG, LVL(12, 14, 2, 20, 0), (G_HELL|G_GENO|1), A(ATTK(AT_BITE, AD_PHYS, 3, 6), ATTK(AT_BREA, AD_FIRE, 3, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(600, 300, 0, MS_BARK, MZ_MEDIUM), MR_FIRE, MR_FIRE, M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE|M2_STRONG, M3_INFRAVISIBLE, CLR_RED), /* [DS] No longer tied to Charon, Lethe frees Kerberos. */ /* #ifdef CHARON */ MON("Cerberus", S_DOG, LVL(17, 16, 2, 50, -7), (G_HELL|G_UNIQ|1), A(ATTK(AT_BITE, AD_PHYS, 6, 8), ATTK(AT_BITE, AD_PHYS, 6, 8), ATTK(AT_BITE, AD_PHYS, 4, 8), ATTK(AT_BREA, AD_FIRE, 3, 8), NO_ATTK, NO_ATTK), SIZ(1000, 350, 0, MS_BARK, MZ_LARGE), MR_FIRE|MR_STONE|MR_POISON|MR_DISINT|MR_SLEEP, MR_FIRE, M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_NOPOLY|M2_HOSTILE|M2_STRONG|M2_PNAME|M2_MALE|M2_LORD, M3_INFRAVISIBLE|M3_INFRAVISION|M3_NOTAME, HI_LORD), /* #endif */ /* * eyes */ MON("gas spore", S_EYE, LVL(1, 3, 10, 0, 0), (G_NOCORPSE|G_GENO|1), 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_NOHELL|G_GENO|6), A(ATTK(AT_NONE, AD_PLYS, 0,70), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(10, 10, 0, MS_SILENT, MZ_SMALL), 0, 0, M1_FLY|M1_AMPHIBIOUS|M1_NOLIMBS|M1_NOHEAD|M1_NOTAKE, M2_HOSTILE|M2_NEUTER, M3_INFRAVISIBLE, CLR_BLUE), MON("glowing eye", S_EYE, LVL(5, 3, 4, 0, 0), (G_NOHELL|G_GENO|1), A(ATTK(AT_GAZE, AD_BLND, 3, 4), 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_YELLOW), MON("freezing sphere", S_EYE, LVL(6, 13, 4, 0, 0), (G_NOCORPSE|G_NOHELL|G_GENO|2), 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_SLEEP|MR_HITASTWO, 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), MON("bloodshot eye", S_EYE, LVL(6, 3, 4, 0, 0), (G_NOHELL|G_GENO|1), A(ATTK(AT_GAZE, AD_STUN, 3, 4), 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, M3_INFRAVISIBLE, CLR_RED), MON("blinking eye", S_EYE, LVL(8, 12, 4, 0, 0), (G_NOHELL|G_GENO|1), A(ATTK(AT_GAZE, AD_TLPT, 0, 0), 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|M1_TPORT, M2_HOSTILE|M2_NEUTER, M3_INFRAVISIBLE, CLR_CYAN), /* * felines */ MON("kitten", S_FELINE, LVL(2, 18, 6, 0, 0), (G_NOHELL|G_GENO|7), A(ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(150, 150, 0, MS_MEW, MZ_SMALL), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_WANDER|M2_DOMESTIC, M3_INFRAVISIBLE, HI_DOMESTIC), MON("housecat", S_FELINE, LVL(4, 16, 5, 0, 0), (G_NOHELL|G_GENO|7), A(ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(200, 200, 0, MS_MEW, MZ_SMALL), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_DOMESTIC, M3_INFRAVISIBLE, HI_DOMESTIC), MON("jaguar", S_FELINE, LVL(4, 15, 6, 0, 0), (G_NOHELL|G_GENO|2), A(ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_BITE, AD_PHYS, 1, 8), 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_BROWN), MON("lynx", S_FELINE, 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, LVL(5, 15, 6, 0, 0), (G_GENO|1), A(ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_CLAW, AD_PHYS, 1, 6), 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_BLACK), MON("werepanther", S_FELINE, LVL(5, 15, 6, 20, -7), (G_NOGEN|G_NOCORPSE), A(ATTK(AT_BITE, AD_WERE, 1, 10), ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_CLAW, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(600, 300, 0, MS_GROWL, MZ_LARGE), MR_POISON, 0, M1_NOHANDS|M1_POIS|M1_REGEN|M1_CARNIVORE, M2_NOPOLY|M2_WERE|M2_HOSTILE, M3_INFRAVISIBLE, CLR_BLACK), MON("large cat", S_FELINE, LVL(6, 15, 4, 0, 0), (G_NOHELL|G_GENO|7), A(ATTK(AT_BITE, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(250, 250, 0, MS_MEW, MZ_SMALL), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_STRONG|M2_DOMESTIC, M3_INFRAVISIBLE, HI_DOMESTIC), MON("kamadan", S_FELINE, LVL(4, 12, 4, 0, -3), (G_NOHELL|G_GENO|1), A(ATTK(AT_BREA, AD_SLEE, 1, 6), ATTK(AT_BITE, AD_PHYS, 1, 3), ATTK(AT_BITE, AD_PHYS, 1, 3), ATTK(AT_BITE, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK), SIZ(750, 400, 0, MS_GROWL, MZ_LARGE), MR_SLEEP, MR_SLEEP, M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE,M2_HOSTILE, M3_INFRAVISIBLE, CLR_ORANGE), MON("displacer beast", S_FELINE, LVL(12, 12, -10, 0, -3), (G_GENO|1), A(ATTK(AT_CLAW, AD_PHYS, 4, 4), ATTK(AT_CLAW, AD_PHYS, 4, 4), ATTK(AT_BITE, AD_PHYS, 2, 10), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(750, 400, 0, MS_GROWL, MZ_LARGE), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE|M3_TRAITOR, CLR_BLUE), MON("caterwaul", S_FELINE, LVL(6, 24, 4, 0, 0), (G_NOHELL|G_GENO|1), A(ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(300, 100, 0, MS_GROWL, MZ_HUMAN), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE,M2_HOSTILE, M3_INFRAVISIBLE, CLR_GRAY), MON("tiger", S_FELINE, LVL(6, 12, 6, 0, 0), (G_NOHELL|G_GENO|2), A(ATTK(AT_CLAW, AD_PHYS, 2, 4), ATTK(AT_CLAW, AD_PHYS, 2, 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_YELLOW), MON("weretiger", S_FELINE, LVL(7, 12, 6, 20, -7), (G_NOGEN|G_NOCORPSE), A(ATTK(AT_BITE, AD_WERE, 2, 6), ATTK(AT_CLAW, AD_PHYS, 2, 5), ATTK(AT_CLAW, AD_PHYS, 2, 5), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(600, 300, 0, MS_GROWL, MZ_LARGE), MR_POISON, 0, M1_NOHANDS|M1_POIS|M1_REGEN|M1_CARNIVORE, M2_NOPOLY|M2_WERE|M2_HOSTILE, M3_INFRAVISIBLE, CLR_YELLOW), MON("sabre-toothed cat", S_FELINE, LVL(9, 12, 6, 0, 0), (G_NOHELL|G_GENO|1), A(ATTK(AT_CLAW, AD_PHYS, 4, 4), ATTK(AT_CLAW, AD_PHYS, 4, 4), ATTK(AT_BITE, AD_PHYS, 2, 10), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(800, 400, 0, MS_GROWL, MZ_LARGE), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE,M2_HOSTILE, M3_INFRAVISIBLE, CLR_YELLOW), MON("hellcat", S_FELINE, LVL(12, 12, 6, 0, 0), (G_HELL|G_GENO|1), A(ATTK(AT_CLAW, AD_PHYS, 4, 4), ATTK(AT_CLAW, AD_PHYS, 4, 4), ATTK(AT_BITE, AD_FIRE, 3, 10), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(800, 400, 0, MS_GROWL, MZ_LARGE), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE,M2_HOSTILE, M3_INFRAVISIBLE|M3_TRAITOR, CLR_RED), /* * gremlins and gargoyles */ MON("gremlin", S_GREMLIN, LVL(5, 12, 2, 25, -9), (G_GENO|2), A(ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_BITE, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_CURS, 0, 0), NO_ATTK, NO_ATTK), SIZ(100, 20, 0, MS_LAUGH, MZ_SMALL), MR_POISON, MR_POISON, M1_SWIM|M1_HUMANOID|M1_POIS, M2_STALK, M3_INFRAVISIBLE|M3_TRAITOR, CLR_GREEN), MON("gargoyle", S_GREMLIN, LVL(6, 10, -4, 0, -9), (G_GENO|2), A(ATTK(AT_CLAW, AD_PHYS, 2, 6), ATTK(AT_CLAW, AD_PHYS, 2, 6), ATTK(AT_BITE, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1000, 200, 0, MS_GRUNT, MZ_HUMAN), MR_STONE, MR_STONE, M1_HUMANOID|M1_THICK_HIDE|M1_BREATHLESS, M2_HOSTILE|M2_STRONG, M3_TRAITOR, CLR_BROWN), MON("winged gargoyle", S_GREMLIN, LVL(9, 15, -2, 0, -12), (G_GENO|1), A(ATTK(AT_CLAW, AD_PHYS, 3, 6), ATTK(AT_CLAW, AD_PHYS, 3, 6), ATTK(AT_BITE, AD_PHYS, 3, 4), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1200, 300, 0, MS_GRUNT, MZ_HUMAN), MR_STONE, MR_STONE, M1_FLY|M1_HUMANOID|M1_THICK_HIDE|M1_BREATHLESS|M1_OVIPAROUS, M2_LORD|M2_HOSTILE|M2_STRONG|M2_MAGIC, M3_TRAITOR, HI_LORD), MON("statue gargoyle", S_GREMLIN, LVL(4, 9, 5, 0, 0), (G_NOHELL|G_GENO|G_NOCORPSE|1), A(ATTK(AT_CLAW, AD_PHYS, 1, 3), ATTK(AT_CLAW, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(900, 0, 0, MS_SILENT, MZ_HUMAN), MR_DEATH|MR_SLEEP|MR_POISON|MR_STONE|MR_PLUSONE, 0, M1_BREATHLESS|M1_MINDLESS|M1_HUMANOID|M1_THICK_HIDE, M2_HOSTILE, 0, CLR_GRAY), /* MON("galltrit", S_GREMLIN, LVL(3, 18, 2, 25, -9), (G_GENO|1), A(ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_BITE, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_CURS, 0, 0), NO_ATTK, NO_ATTK), SIZ(100, 20, 0, MS_LAUGH, MZ_SMALL), MR_POISON, 0, M1_SWIM|M1_HUMANOID|M1_POIS, M2_STALK, 0, CLR_BLACK), MON("jermlaine", S_GREMLIN, LVL(0, 15, 7, 0, -9), (G_NOHELL|G_GENO|G_VLGROUP|1), A(ATTK(AT_CLAW, AD_PHYS, 1, 2), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(100, 20, 0, MS_LAUGH, MZ_SMALL), MR_POISON, 0, M1_HUMANOID|M1_POIS, M2_STALK, 0, CLR_GRAY),*/ /* * humanoids */ MON("hobbit", S_HUMANOID, LVL(1, 9, MARM(10,7), 0, 6), (G_NOHELL|G_GENO|4), A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(500, 200, 0, MS_HUMANOID, MZ_SMALL), 0, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HOBBIT|M2_COLLECT, M3_INFRAVISIBLE|M3_INFRAVISION, CLR_GREEN), MON("dwarf", S_HUMANOID, LVL(2, 6, MARM(10,4), 10, 4), (G_NOHELL|G_GENO|5), A(ATTK(AT_WEAP, AD_PHYS, 1, 4), ATTK(AT_WEAP, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(900, 300, 0, MS_HUMANOID, MZ_HUMAN), 0, 0, M1_TUNNEL|M1_NEEDPICK|M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_DWARF|M2_STRONG|M2_GREEDY|M2_JEWELS|M2_COLLECT, M3_INFRAVISIBLE|M3_INFRAVISION, CLR_RED), MON("dwarf thief", S_HUMANOID, LVL(2, 6, MARM(10,4), 10, 4), (G_GENO|G_NOGEN), A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_TUCH, AD_SITM, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(900, 300, 0, MS_HUMANOID, MZ_HUMAN), 0, 0, M1_TUNNEL|M1_NEEDPICK|M1_HUMANOID|M1_OMNIVORE, M2_DWARF|M2_HOSTILE|M2_STRONG|M2_GREEDY|M2_JEWELS|M2_COLLECT, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, CLR_BLACK), MON("bugbear", S_HUMANOID, LVL(3, 9, 5, 0, -6), (G_NOHELL|G_GENO|1), A(ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1250, 250, 0, MS_GROWL, MZ_LARGE), 0, 0, M1_HUMANOID|M1_OMNIVORE, M2_STRONG|M2_COLLECT, M3_INFRAVISIBLE|M3_INFRAVISION, CLR_BROWN), MON("dwarf lord", S_HUMANOID, LVL(4, 6, MARM(10,4), 10, 5), (G_NOHELL|G_GENO|3), A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(900, 300, 0, MS_HUMANOID, MZ_HUMAN), 0, 0, M1_TUNNEL|M1_NEEDPICK|M1_HUMANOID|M1_OMNIVORE, M2_DWARF|M2_STRONG|M2_LORD|M2_MALE|M2_GREEDY|M2_JEWELS|M2_COLLECT, M3_INFRAVISIBLE|M3_INFRAVISION, CLR_BLUE), MON("dwarf king", S_HUMANOID, LVL(6, 6, MARM(10,4), 20, 6), (G_NOHELL|G_GENO|1), A(ATTK(AT_WEAP, AD_PHYS, 2, 6), ATTK(AT_WEAP, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(900, 300, 0, MS_HUMANOID, MZ_HUMAN), 0, 0, M1_TUNNEL|M1_NEEDPICK|M1_HUMANOID|M1_OMNIVORE, M2_DWARF|M2_STRONG|M2_PRINCE|M2_MALE|M2_GREEDY|M2_JEWELS|M2_COLLECT, M3_INFRAVISIBLE|M3_INFRAVISION, HI_LORD), MON("duergar", S_HUMANOID, LVL(4, 6, MARM(10,2), 10, 5), (G_HELL|G_GENO|1), A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(900, 300, 0, MS_HUMANOID, MZ_HUMAN),MR_HITASONE, 0, M1_TUNNEL|M1_NEEDPICK|M1_HUMANOID, M2_DWARF|M2_STRONG|M2_MALE|M2_GREEDY|M2_JEWELS|M2_COLLECT, 0, CLR_GRAY), MON("deep one", S_HUMANOID, LVL(7, 9, 5, 10, -5), (G_GENO|G_LGROUP|2), A(ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_BITE, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1500, 400, 0, MS_GURGLE, MZ_HUMAN), MR_COLD|MR_POISON, MR_POISON, M1_SWIM|M1_AMPHIBIOUS|M1_HUMANOID|M1_OMNIVORE|M1_POIS, M2_HOSTILE|M2_STALK|M2_GREEDY|M2_JEWELS|M2_COLLECT|M2_MAGIC, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, CLR_GREEN), MON("mind flayer", S_HUMANOID, 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), ATTK(AT_TENT, AD_DRIN, 2, 1)), SIZ(1450, 400, 0, MS_HISS, MZ_HUMAN),MR_HITASTWO, 0, M1_HUMANOID|M1_FLY|M1_SEE_INVIS|M1_OMNIVORE, M2_HOSTILE|M2_NASTY|M2_GREEDY|M2_JEWELS|M2_COLLECT, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, CLR_MAGENTA), MON("master mind flayer", S_HUMANOID, 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), 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, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, CLR_MAGENTA), MON("deeper one", S_HUMANOID, LVL(15,12, 0, 30, -7), (G_GENO|G_SGROUP|2), A(ATTK(AT_CLAW, AD_PHYS, 3, 4), ATTK(AT_CLAW, AD_PHYS, 3, 4), ATTK(AT_BITE, AD_PHYS, 4, 6), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(2000, 500, 0, MS_GURGLE, MZ_LARGE), MR_COLD|MR_POISON, MR_POISON, M1_SWIM|M1_AMPHIBIOUS|M1_HUMANOID|M1_OMNIVORE|M1_POIS, M2_HOSTILE|M2_STALK|M2_GREEDY|M2_JEWELS|M2_COLLECT|M2_LORD|M2_STRONG|M2_MAGIC, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, CLR_GREEN), MON("deepest one", S_HUMANOID, LVL(30, 15, -5, 70, -9), (G_GENO|1), A(ATTK(AT_CLAW, AD_PHYS, 3, 6), ATTK(AT_CLAW, AD_PHYS, 3, 6), ATTK(AT_BITE, AD_PHYS, 5, 6), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(3000, 500, 0, MS_GURGLE, MZ_HUGE), MR_COLD|MR_POISON, MR_POISON, M1_SWIM|M1_AMPHIBIOUS|M1_HUMANOID|M1_OMNIVORE|M1_POIS|M1_THICK_HIDE, M2_HOSTILE|M2_STALK|M2_GREEDY|M2_JEWELS|M2_COLLECT|M2_PRINCE|M2_STRONG|M2_MAGIC, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, HI_LORD), /* * imps & other minor demons/devils */ MON("manes", S_IMP, LVL(1, 3, 7, 0, -7), (G_GENO|G_LGROUP|G_NOCORPSE|1), A(ATTK(AT_CLAW, AD_PHYS, 1, 3), ATTK(AT_CLAW, AD_PHYS, 1, 3), ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(100, 100, 0, MS_SILENT, MZ_SMALL), MR_SLEEP|MR_POISON|MR_HITASONE, 0, M1_POIS, M2_HOSTILE|M2_STALK, M3_INFRAVISIBLE|M3_INFRAVISION, CLR_RED), MON("homunculus", S_IMP, LVL(2, 12, 6, 10, -7), (G_GENO|2), A(ATTK(AT_BITE, AD_SLEE, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(60, 100, 0, MS_SILENT, MZ_TINY), MR_SLEEP|MR_POISON|MR_HITASONE, MR_SLEEP|MR_POISON, M1_FLY|M1_POIS, M2_STALK, M3_INFRAVISIBLE|M3_INFRAVISION, CLR_GREEN), MON("dretch", S_IMP, LVL(2, 12, 2, 20, -7), (G_GENO|1), A(ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(20, 10, 0, MS_CUSS, MZ_TINY), 0, 0, M1_REGEN, M2_WANDER|M2_STALK, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, CLR_YELLOW), MON("imp", S_IMP, LVL(3, 12, 2, 20, -7), (G_GENO|1), A(ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(20, 10, 0, MS_CUSS, MZ_TINY), 0, 0, M1_REGEN, M2_WANDER|M2_STALK, M3_INFRAVISIBLE|M3_INFRAVISION, CLR_RED), MON("lemure", S_IMP, LVL(3, 3, 7, 0, -7), (G_HELL|G_GENO|G_LGROUP|G_NOCORPSE|1), A(ATTK(AT_CLAW, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(150, 100, 0, MS_SILENT, MZ_MEDIUM), MR_SLEEP|MR_POISON|MR_PLUSONE|MR_HITASONE, MR_SLEEP, M1_POIS|M1_REGEN, M2_HOSTILE|M2_WANDER|M2_STALK|M2_NEUTER, M3_INFRAVISIBLE|M3_INFRAVISION, CLR_BROWN), MON("quasit", S_IMP, LVL(3, 15, 2, 20, -7), (G_GENO|2), A(ATTK(AT_CLAW, AD_DRDX, 1, 2), ATTK(AT_CLAW, AD_DRDX, 1, 2), ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(200, 200, 0, MS_SILENT, MZ_SMALL), MR_POISON|MR_HITASONE, MR_POISON, M1_REGEN, M2_STALK, M3_INFRAVISIBLE|M3_INFRAVISION, CLR_BLUE), MON("rutterkin", S_IMP, LVL(5, 12, 2, 20, -7), (G_GENO|1), A(ATTK(AT_CLAW, AD_DRST, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(20, 10, 0, MS_CUSS, MZ_TINY), 0, 0, M1_REGEN, M2_WANDER|M2_STALK, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, CLR_ORANGE), MON("tengu", S_IMP, LVL(6, 13, 5, 30, 7), (G_GENO|3), A(ATTK(AT_BITE, AD_PHYS, 1, 7), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(300, 200, 0, MS_SQAWK, MZ_SMALL), MR_POISON|MR_HITASONE, MR_POISON, M1_TPORT|M1_TPORT_CNTRL, M2_STALK, M3_INFRAVISIBLE|M3_INFRAVISION, CLR_CYAN), MON("nupperibo", S_IMP, LVL(7, 12, 0, 20, -7), (G_GENO|1), A(ATTK(AT_CLAW, AD_DRST, 3, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(20, 10, 0, MS_CUSS, MZ_TINY), 0, 0, M1_REGEN, M2_WANDER|M2_STALK, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, CLR_GREEN), MON("blood imp", S_IMP, LVL(9, 12, 0, 60, -7), (G_GENO|1), A(ATTK(AT_CLAW, AD_DRST, 3, 4), ATTK(AT_BITE, AD_PHYS, 3, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(20, 10, 0, MS_CUSS, MZ_TINY), 0, 0, M1_REGEN, M2_WANDER|M2_STALK, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, CLR_BLACK), /* * jellies */ MON("blue jelly", S_JELLY, LVL(4, 0, 8, 10, 0), (G_NOHELL|G_GENO|2), A(ATTK(AT_NONE, AD_COLD, 0, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(50, 20, 0, MS_SILENT, MZ_MEDIUM), MR_COLD|MR_POISON, MR_COLD|MR_POISON, M1_BREATHLESS|M1_AMORPHOUS|M1_NOEYES|M1_NOLIMBS|M1_NOHEAD|M1_MINDLESS |M1_NOTAKE, M2_HOSTILE|M2_NEUTER, 0, CLR_BLUE), MON("spotted jelly", S_JELLY, LVL(5, 0, 8, 10, 0), (G_NOHELL|G_GENO|1), A(ATTK(AT_NONE, AD_ACID, 0, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(50, 20, 0, MS_SILENT, MZ_MEDIUM), MR_ACID|MR_STONE, 0, M1_BREATHLESS|M1_AMORPHOUS|M1_NOEYES|M1_NOLIMBS|M1_NOHEAD| M1_MINDLESS|M1_ACID|M1_NOTAKE, M2_HOSTILE|M2_NEUTER, 0, CLR_GREEN), MON("clear jelly", S_JELLY, LVL(6, 3, 8, 10, 0), (G_NOHELL|G_GENO|1), A(ATTK(AT_TUCH, AD_ACID, 3, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(50, 20, 0, MS_SILENT, MZ_MEDIUM),MR_COLD|MR_POISON, MR_COLD|MR_POISON, M1_BREATHLESS|M1_CLING|M1_HIDE|M1_AMORPHOUS|M1_NOEYES|M1_NOLIMBS| M1_NOHEAD|M1_MINDLESS|M1_OMNIVORE, M2_HOSTILE|M2_NEUTER, 0, CLR_CYAN), MON("ochre jelly", S_JELLY, LVL(6, 3, 8, 20, 0), (G_NOHELL|G_GENO|2), A(ATTK(AT_ENGL, AD_ACID, 3, 6), ATTK(AT_NONE, AD_ACID, 3, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(50, 20, 0, MS_SILENT, MZ_MEDIUM), MR_ACID|MR_STONE, 0, M1_BREATHLESS|M1_AMORPHOUS|M1_NOEYES|M1_NOLIMBS|M1_NOHEAD| M1_MINDLESS|M1_ACID|M1_NOTAKE, M2_HOSTILE|M2_NEUTER, 0, CLR_BROWN), MON("yellow jelly", S_JELLY, LVL(8, 5, 8, 20, 0), (G_NOHELL|G_GENO|1), A(ATTK(AT_ENGL, AD_ACID, 3, 6), ATTK(AT_NONE, AD_STUN, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(250, 220, 0, MS_SILENT, MZ_MEDIUM), MR_ACID|MR_STONE, 0, M1_BREATHLESS|M1_AMORPHOUS|M1_NOEYES|M1_NOLIMBS|M1_NOHEAD| M1_MINDLESS|M1_ACID|M1_OMNIVORE, M2_HOSTILE|M2_NEUTER, 0, CLR_YELLOW), MON("orange jelly", S_JELLY, LVL(8, 5, 8, 20, 0), (G_NOHELL|G_GENO|1), A(ATTK(AT_ENGL, AD_ACID, 2, 8), ATTK(AT_NONE, AD_SLEE, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(250, 220, 0, MS_SILENT, MZ_MEDIUM), MR_ACID|MR_STONE, 0, M1_BREATHLESS|M1_AMORPHOUS|M1_NOEYES|M1_NOLIMBS|M1_NOHEAD| M1_MINDLESS|M1_ACID|M1_OMNIVORE, M2_HOSTILE|M2_NEUTER, 0, CLR_ORANGE), MON("rancid jelly", S_JELLY, LVL(12, 5, 8, 20, 0), (G_NOHELL|G_GENO|1), A(ATTK(AT_ENGL, AD_ACID, 4, 6), ATTK(AT_NONE, AD_ACID, 3, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(250, 220, 0, MS_SILENT, MZ_MEDIUM), MR_ACID|MR_STONE, 0, M1_BREATHLESS|M1_AMORPHOUS|M1_NOEYES|M1_NOLIMBS|M1_NOHEAD| M1_MINDLESS|M1_ACID|M1_OMNIVORE, M2_HOSTILE|M2_NEUTER, 0, CLR_BLACK), /* * kobolds */ MON("kobold", S_KOBOLD, LVL(0, 6, MARM(10,7), 0, -2), (G_NOHELL|G_GENO|1), A(ATTK(AT_WEAP, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(400, 100, 0, MS_ORC, MZ_SMALL), MR_POISON, 0, M1_HUMANOID|M1_POIS|M1_OMNIVORE, M2_HOSTILE|M2_COLLECT, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, CLR_BROWN), MON("large kobold", S_KOBOLD, LVL(1, 6, MARM(10,6), 0, -3), (G_NOHELL|G_GENO|1), A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(450, 150, 0, MS_ORC, MZ_SMALL), MR_POISON, 0, M1_HUMANOID|M1_POIS|M1_OMNIVORE, M2_HOSTILE|M2_COLLECT, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, CLR_RED), MON("kobold lord", S_KOBOLD, LVL(2, 6, MARM(10,5), 0, -4), (G_NOHELL|G_GENO|1), A(ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(500, 200, 0, MS_ORC, MZ_SMALL), MR_POISON, 0, M1_HUMANOID|M1_POIS|M1_OMNIVORE, M2_HOSTILE|M2_LORD|M2_MALE|M2_COLLECT, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, HI_LORD), MON("kobold shaman", S_KOBOLD, LVL(2, 6, 6, 10, -4), (G_GENO|1), A(ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(450, 150, 0, MS_ORC, MZ_SMALL), MR_POISON, 0, M1_HUMANOID|M1_POIS|M1_OMNIVORE, M2_HOSTILE|M2_MAGIC, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, HI_ZAP), MON("swamp kobold", S_KOBOLD, LVL(3, 9, MARM(10,5), 0, -3), (G_NOHELL|G_GENO|1), A(ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(450, 150, 0, MS_ORC, MZ_SMALL), MR_POISON, 0, M1_HUMANOID|M1_POIS|M1_OMNIVORE, M2_HOSTILE|M2_COLLECT, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, CLR_GREEN), MON("rock kobold", S_KOBOLD, LVL(5, 9, MARM(10,5), 0, -3), (G_NOHELL|G_GENO|1), A(ATTK(AT_WEAP, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(450, 150, 0, MS_ORC, MZ_SMALL), MR_POISON, 0, M1_HUMANOID|M1_POIS|M1_OMNIVORE, M2_HOSTILE|M2_COLLECT, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, CLR_BLACK), MON("kobold warrior", S_KOBOLD, LVL(7, 9, MARM(10,4), 0, -3), (G_NOHELL|G_GENO|1), A(ATTK(AT_WEAP, AD_PHYS, 2, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(450, 150, 0, MS_ORC, MZ_SMALL), MR_POISON, 0, M1_HUMANOID|M1_POIS|M1_OMNIVORE, M2_HOSTILE|M2_COLLECT, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, CLR_GRAY), MON("Kroo the Kobold King", S_KOBOLD, LVL(13, 9, MARM(10,0), 0, -3), (G_UNIQ|G_NOGEN|1), A(ATTK(AT_WEAP, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(450, 150, 0, MS_ORC, MZ_SMALL), MR_POISON|MR_STONE, 0, M1_HUMANOID|M1_POIS|M1_OMNIVORE, M2_PNAME|M2_PRINCE|M2_MALE|M2_GREEDY|M2_STALK| M2_HOSTILE|M2_NASTY|M2_NOPOLY|M2_JEWELS|M2_COLLECT| M2_MAGIC, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, HI_LORD), /* * leprechauns */ MON("leprechaun", S_LEPRECHAUN, LVL(5, 15, 8, 20, 0), (G_NOHELL|G_GENO|4), A(ATTK(AT_CLAW, AD_SGLD, 1, 2), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(60, 30, 0, MS_LAUGH, MZ_TINY), MR_HITASONE, 0, M1_HUMANOID|M1_TPORT, M2_HOSTILE|M2_GREEDY, M3_INFRAVISIBLE, CLR_GREEN), MON("leprechaun wizard", S_LEPRECHAUN, LVL(8, 15, 6, 20, 0), (G_NOHELL|G_GENO|1), A(ATTK(AT_CLAW, AD_SGLD, 1, 2), ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(60, 30, 0, MS_LAUGH, MZ_TINY), MR_HITASONE, 0, M1_HUMANOID|M1_TPORT, M2_HOSTILE|M2_GREEDY|M2_MAGIC, 0, HI_ZAP), /* * mimics */ MON("small mimic", S_MIMIC, LVL(7, 3, 7, 0, 0), (G_GENO|2), A(ATTK(AT_CLAW, AD_PHYS, 3, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(300, 200, 0, MS_SILENT, MZ_MEDIUM), MR_ACID, 0, M1_BREATHLESS|M1_AMORPHOUS|M1_HIDE|M1_ANIMAL|M1_NOEYES| M1_NOHEAD|M1_NOLIMBS|M1_THICK_HIDE|M1_CARNIVORE, M2_HOSTILE, 0, CLR_BROWN), MON("large mimic", S_MIMIC, LVL(8, 3, 7, 10, 0), (G_GENO|1), A(ATTK(AT_CLAW, AD_STCK, 3, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(600, 400, 0, MS_SILENT, MZ_LARGE), MR_ACID, 0, M1_CLING|M1_BREATHLESS|M1_AMORPHOUS|M1_HIDE|M1_ANIMAL|M1_NOEYES| M1_NOHEAD|M1_NOLIMBS|M1_THICK_HIDE|M1_CARNIVORE, M2_HOSTILE|M2_STRONG, 0, CLR_RED), MON("giant mimic", S_MIMIC, LVL(9, 3, 7, 20, 0), (G_GENO|1), A(ATTK(AT_CLAW, AD_STCK, 3, 6), ATTK(AT_CLAW, AD_STCK, 3, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(800, 500, 0, MS_SILENT, MZ_LARGE), MR_ACID, 0, M1_CLING|M1_BREATHLESS|M1_AMORPHOUS|M1_HIDE|M1_ANIMAL|M1_NOEYES| M1_NOHEAD|M1_NOLIMBS|M1_THICK_HIDE|M1_CARNIVORE, M2_HOSTILE|M2_STRONG, 0, HI_LORD), /* * nymphs */ MON("wood nymph", S_NYMPH, LVL(3, 12, 9, 20, 0), (G_NOHELL|G_GENO|2), A(ATTK(AT_CLAW, AD_SITM, 0, 0), ATTK(AT_CLAW, AD_SEDU, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(600, 300, 0, MS_SEDUCE, MZ_HUMAN), MR_HITASONE, 0, M1_HUMANOID|M1_TPORT, M2_HOSTILE|M2_FEMALE|M2_COLLECT, M3_INFRAVISIBLE, CLR_GREEN), MON("water nymph", S_NYMPH, LVL(3, 12, 9, 20, 0), (G_NOHELL|G_GENO|2), A(ATTK(AT_CLAW, AD_SITM, 0, 0), ATTK(AT_CLAW, AD_SEDU, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(600, 300, 0, MS_SEDUCE, MZ_HUMAN), MR_HITASONE, 0, M1_HUMANOID|M1_TPORT|M1_SWIM, M2_HOSTILE|M2_FEMALE|M2_COLLECT, M3_INFRAVISIBLE, CLR_BLUE), MON("mountain nymph", S_NYMPH, LVL(3, 12, 9, 20, 0), (G_NOHELL|G_GENO|2), A(ATTK(AT_CLAW, AD_SITM, 0, 0), ATTK(AT_CLAW, AD_SEDU, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(600, 300, 0, MS_SEDUCE, MZ_HUMAN), MR_HITASONE, 0, M1_HUMANOID|M1_TPORT, M2_HOSTILE|M2_FEMALE|M2_COLLECT, M3_INFRAVISIBLE, CLR_BROWN), MON("pixie", S_NYMPH, LVL(3, 15, 3, 20, 0), (G_NOHELL|G_GENO|1), A(ATTK(AT_CLAW, AD_SITM, 1, 2), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(60, 30, 0, MS_LAUGH, MZ_TINY), MR_HITASONE, 0, M1_HUMANOID|M1_SEE_INVIS, M2_HOSTILE|M2_GREEDY, M3_INFRAVISIBLE, CLR_CYAN), MON("brownie", S_NYMPH, LVL(8, 15, 3, 20, 0), (G_NOHELL|G_GENO|1), A(ATTK(AT_CLAW, AD_SITM, 0, 0), ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(60, 30, 0, MS_LAUGH, MZ_TINY), MR_HITASONE, 0, M1_HUMANOID|M1_TPORT, M2_HOSTILE|M2_GREEDY|M2_MAGIC, M3_INFRAVISIBLE, CLR_BROWN), MON("quickling", S_NYMPH, LVL(3, 30, 10, 20, -10), (G_HELL|G_GENO|1), A(ATTK(AT_WEAP, AD_PHYS, 1, 2), ATTK(AT_CLAW, AD_SITM, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(60, 30, 0, MS_LAUGH, MZ_TINY), MR_HITASONE, 0, M1_HUMANOID, M2_HOSTILE|M2_GREEDY|M2_NASTY, M3_INFRAVISIBLE|M3_TRAITOR, CLR_BLUE), MON("Aphrodite", S_NYMPH, LVL(10, 15, -5, 20, 0), (G_UNIQ|G_NOGEN|1), A(ATTK(AT_CLAW, AD_SITM, 0, 0), ATTK(AT_CLAW, AD_SEDU, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(600, 300, 0, MS_SEDUCE, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_TPORT, M2_PNAME|M2_PRINCE|M2_FEMALE|M2_GREEDY|M2_STALK|M2_HOSTILE| M2_NASTY|M2_NOPOLY|M2_JEWELS|M2_COLLECT|M2_MAGIC, M3_INFRAVISIBLE|M3_NOTAME, HI_LORD), /* * orcs */ MON("goblin", S_ORC, LVL(0, 6, MARM(10,6), 0, -3), (G_NOHELL|G_GENO|3), A(ATTK(AT_WEAP, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(400, 100, 0, MS_ORC, MZ_SMALL), 0, 0, M1_HUMANOID|M1_OMNIVORE, M2_ORC|M2_COLLECT, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, CLR_GRAY), MON("hobgoblin", S_ORC, LVL(1, 9, MARM(10,6), 0, -4), (G_NOHELL|G_GENO|3), A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1000, 200, 0, MS_ORC, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_OMNIVORE, M2_ORC|M2_STRONG|M2_COLLECT, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, CLR_BROWN), /* plain "orc" for zombie corpses only; not created at random */ MON("orc", S_ORC, LVL(1, 9, MARM(10,6), 0, -3), (G_NOGEN|G_GENO), A(ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(850, 150, 0, MS_ORC, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_ORC|M2_STRONG|M2_GREEDY|M2_JEWELS|M2_COLLECT, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, CLR_RED), MON("hill orc", S_ORC, LVL(2, 9, MARM(10,6), 0, -4), (G_NOHELL|G_GENO|G_LGROUP|3), A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1000, 200, 0, MS_ORC, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_OMNIVORE, M2_ORC|M2_STRONG|M2_GREEDY|M2_JEWELS|M2_COLLECT, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, CLR_YELLOW), MON("Mordor orc", S_ORC, LVL(3, 5, MARM(10,6), 0, -5), (G_NOHELL|G_GENO|G_LGROUP|2), A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1200, 200, 0, MS_ORC, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_OMNIVORE, M2_ORC|M2_STRONG|M2_GREEDY|M2_JEWELS|M2_COLLECT, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, CLR_BLUE), MON("Uruk-hai", S_ORC, LVL(3, 7, MARM(10,5), 0, -4), (G_NOHELL|G_GENO|G_LGROUP|1), A(ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1300, 300, 0, MS_ORC, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_OMNIVORE, M2_ORC|M2_STRONG|M2_GREEDY|M2_JEWELS|M2_COLLECT, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, CLR_BLACK), MON("orc shaman", S_ORC, LVL(3, 9, 5, 10, -5), (G_NOHELL|G_GENO|1), A(ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1000, 300, 0, MS_ORC, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_OMNIVORE, M2_ORC|M2_STRONG|M2_GREEDY|M2_JEWELS|M2_MAGIC, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, HI_ZAP), MON("orc-captain", S_ORC, LVL(5, 5, MARM(10,4), 0, -5), (G_NOHELL|G_GENO|1), A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1350, 350, 0, MS_ORC, MZ_HUMAN), MR_HITASONE, 0, M1_HUMANOID|M1_OMNIVORE, M2_ORC|M2_STRONG|M2_GREEDY|M2_JEWELS|M2_COLLECT, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, HI_LORD), MON("war orc", S_ORC, LVL(6, 7, MARM(10,3), 0, -4), (G_HELL|G_GENO|G_LGROUP|1), A(ATTK(AT_WEAP, AD_PHYS, 2, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1300, 300, 0, MS_ORC, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_OMNIVORE, M2_ORC|M2_STRONG|M2_GREEDY|M2_JEWELS|M2_COLLECT, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, CLR_GREEN), MON("great orc", S_ORC, LVL(9, 7, MARM(10,2), 10, -4), (G_HELL|G_GENO|G_LGROUP|1), A(ATTK(AT_WEAP, AD_PHYS, 2, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1300, 300, 0, MS_ORC, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_OMNIVORE, M2_ORC|M2_STRONG|M2_GREEDY|M2_JEWELS|M2_COLLECT, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, CLR_BRIGHT_GREEN), MON("Grund the Orc King", S_ORC, LVL(20, 7, MARM(10,0), 66, -4), (G_UNIQ|G_NOGEN|1), A(ATTK(AT_WEAP, AD_PHYS, 4, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1300, 300, 0, MS_ORC, MZ_HUMAN), MR_POISON, MR_POISON, M1_HUMANOID|M1_OMNIVORE, M2_ORC|M2_STRONG|M2_PNAME|M2_PRINCE|M2_MALE|M2_GREEDY|M2_STALK| M2_HOSTILE|M2_NASTY|M2_NOPOLY|M2_JEWELS|M2_COLLECT|M2_MAGIC, M3_INFRAVISIBLE|M3_INFRAVISION|M3_NOTAME, HI_LORD), MON("snow orc", S_ORC, LVL(9, 12, MARM(10,-2), 10, -9), (G_NOHELL|G_GENO|G_LGROUP|1), A(ATTK(AT_WEAP, AD_PHYS, 2, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1300, 300, 0, MS_ORC, MZ_HUMAN), MR_COLD, MR_COLD, M1_HUMANOID|M1_OMNIVORE, M2_ORC|M2_STRONG|M2_GREEDY|M2_JEWELS|M2_COLLECT, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, CLR_CYAN), MON("demon orc", S_ORC, LVL(12, 12, MARM(10,-2), 10, -9), (G_HELL|G_GENO|G_LGROUP|1), A(ATTK(AT_WEAP, AD_PHYS, 3, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1300, 300, 0, MS_ORC, MZ_HUMAN), MR_FIRE, MR_FIRE, M1_HUMANOID|M1_OMNIVORE, M2_ORC|M2_HOSTILE|M2_STRONG|M2_GREEDY|M2_JEWELS|M2_COLLECT, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, CLR_ORANGE), /* * piercers */ MON("rock piercer", S_PIERCER, LVL(3, 1, 3, 0, 0), (G_GENO|4), A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(200, 200, 0, MS_SILENT, MZ_SMALL), 0, 0, M1_CLING|M1_HIDE|M1_ANIMAL|M1_NOEYES|M1_NOLIMBS|M1_CARNIVORE|M1_NOTAKE, M2_HOSTILE, 0, CLR_GRAY), MON("iron piercer", S_PIERCER, LVL(5, 1, 0, 0, 0), (G_GENO|2), A(ATTK(AT_BITE, AD_PHYS, 3, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(400, 300, 0, MS_SILENT, MZ_MEDIUM), 0, 0, M1_CLING|M1_HIDE|M1_ANIMAL|M1_NOEYES|M1_NOLIMBS|M1_CARNIVORE|M1_NOTAKE, M2_HOSTILE, 0, CLR_CYAN), MON("glass piercer", S_PIERCER, LVL(7, 1, 0, 0, 0), (G_GENO|1), A(ATTK(AT_BITE, AD_PHYS, 4, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(400, 300, 0, MS_SILENT, MZ_MEDIUM), MR_ACID, 0, M1_CLING|M1_HIDE|M1_ANIMAL|M1_NOEYES|M1_NOLIMBS|M1_CARNIVORE|M1_NOTAKE, M2_HOSTILE, 0, CLR_WHITE), /* * quadrupeds */ MON("lamb", S_QUADRUPED, LVL(1, 12, 10, 0, 0), (G_GENO|G_SGROUP|2), A(ATTK(AT_BUTT, AD_PHYS, 1, 2), ATTK(AT_KICK, AD_PHYS, 1, 2), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(200, 50, 0, MS_SHEEP, MZ_SMALL), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_HERBIVORE, M2_WANDER|M2_DOMESTIC|M2_PEACEFUL, M3_INFRAVISIBLE, CLR_WHITE), MON("rothe", S_QUADRUPED, LVL(2, 9, 7, 0, 0), (G_NOHELL|G_GENO|G_SGROUP|4), A(ATTK(AT_CLAW, AD_PHYS, 1, 3), ATTK(AT_BITE, AD_PHYS, 1, 3), ATTK(AT_BITE, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(400, 100, 0, MS_SILENT, MZ_LARGE), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_OMNIVORE, M2_HOSTILE, 0, CLR_BROWN), MON("giant badger", S_QUADRUPED, LVL(2, 12, 6, 0, 0), (G_NOHELL|G_GENO|1), A(ATTK(AT_CLAW, AD_PHYS, 1, 2), ATTK(AT_CLAW, AD_PHYS, 1, 2), ATTK(AT_BITE, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(200, 50, 0, MS_SILENT, MZ_MEDIUM), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE, 0, CLR_BROWN), MON("scramper", S_QUADRUPED, LVL(3, 9, 7, 0, 0), (G_NOHELL|G_GENO|G_SGROUP|1), A(ATTK(AT_CLAW, AD_PHYS, 1, 3), ATTK(AT_BITE, AD_PHYS, 1, 3), ATTK(AT_BITE, AD_PHYS, 1, 8), ATTK(AT_STNG, AD_LEGS, 1, 6), NO_ATTK, NO_ATTK), SIZ(400, 100, 0, MS_SILENT, MZ_LARGE), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE|M1_POIS, M2_HOSTILE, 0, CLR_GREEN), MON("sheep", S_QUADRUPED, LVL(3, 12, 8, 0, 0), (G_GENO|G_SGROUP|2), A(ATTK(AT_BUTT, AD_PHYS, 1, 4), ATTK(AT_KICK, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(700, 100, 0, MS_SHEEP, MZ_MEDIUM), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_HERBIVORE, M2_WANDER|M2_DOMESTIC|M2_PEACEFUL, M3_INFRAVISIBLE, CLR_WHITE), MON("goat", S_QUADRUPED, LVL(4, 12, 6, 0, 0), (G_GENO|G_SGROUP|1), A(ATTK(AT_BUTT, AD_PHYS, 2, 4), ATTK(AT_KICK, AD_PHYS, 1, 4), ATTK(AT_KICK, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(700, 75, 0, MS_SILENT, MZ_MEDIUM), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_HERBIVORE, M2_WANDER|M2_DOMESTIC, M3_INFRAVISIBLE, CLR_WHITE), MON("squealer", S_QUADRUPED, LVL(4, 9, 7, 0, 0), (G_NOHELL|G_GENO|G_SGROUP|1), A(ATTK(AT_CLAW, AD_PHYS, 1, 3), ATTK(AT_BITE, AD_PHYS, 1, 3), ATTK(AT_BITE, AD_PHYS, 1, 8), ATTK(AT_STNG, AD_LEGS, 1, 6), NO_ATTK, NO_ATTK), SIZ(400, 100, 0, MS_SHRIEK, MZ_LARGE), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE|M1_POIS, M2_HOSTILE, 0, CLR_MAGENTA), MON("mumak", S_QUADRUPED, LVL(5, 9, 0, 0, -2), (G_NOHELL|G_GENO|1), A(ATTK(AT_BUTT, AD_PHYS, 4,12), ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(2500, 500, 0, MS_ROAR, MZ_LARGE), 0, 0, M1_ANIMAL|M1_THICK_HIDE|M1_NOHANDS|M1_HERBIVORE, M2_HOSTILE|M2_STRONG, 0, CLR_GRAY), MON("leocrotta", S_QUADRUPED, LVL(6, 18, 4, 10, 0), (G_GENO|2), A(ATTK(AT_CLAW, AD_PHYS, 2, 6), ATTK(AT_BITE, AD_PHYS, 2, 6), ATTK(AT_CLAW, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1200, 500, 0, MS_IMITATE, MZ_LARGE), MR_HITASTWO, 0, M1_ANIMAL|M1_NOHANDS|M1_OMNIVORE, M2_HOSTILE|M2_STRONG, 0, CLR_RED), MON("cow", S_QUADRUPED, LVL(7, 9, 7, 0, 0), (G_GENO|2), A(ATTK(AT_BUTT, AD_PHYS, 1, 8), ATTK(AT_KICK, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(2000, 300, 0, MS_COW, MZ_MEDIUM), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_HERBIVORE, M2_WANDER|M2_DOMESTIC|M2_PEACEFUL| M2_FEMALE,M3_INFRAVISIBLE, CLR_WHITE), MON("mangler", S_QUADRUPED, LVL(8, 9, 7, 0, 0), (G_NOHELL|G_GENO|G_SGROUP|1), A(ATTK(AT_CLAW, AD_PHYS, 3, 3), ATTK(AT_CLAW, AD_PHYS, 3, 3), ATTK(AT_BITE, AD_PHYS, 3, 8), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(400, 100, 0, MS_SILENT, MZ_LARGE), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE, M3_TRAITOR, CLR_ORANGE), MON("wumpus", S_QUADRUPED, LVL(8, 3, 2, 10, 0), (G_NOHELL|G_GENO|1), A(ATTK(AT_BITE, AD_PHYS, 3, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(2500, 500, 0, MS_BURBLE, MZ_LARGE), MR_HITASONE, 0, M1_CLING|M1_ANIMAL|M1_NOHANDS|M1_OMNIVORE, M2_HOSTILE|M2_STRONG, 0, CLR_CYAN), MON("bull", S_QUADRUPED, LVL(10, 15, 5, 0, 0), (G_GENO|1), A(ATTK(AT_BUTT, AD_PHYS, 2, 8), ATTK(AT_KICK, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(3000, 500, 0, MS_COW, MZ_MEDIUM), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_HERBIVORE, M2_WANDER|M2_DOMESTIC|M2_HOSTILE| M2_MALE,M3_INFRAVISIBLE, CLR_BLACK), MON("titanothere", S_QUADRUPED, LVL(12, 12, 6, 0, 0), (G_NOHELL|G_GENO|2), A(ATTK(AT_CLAW, AD_PHYS, 2, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(2650, 650, 0, MS_SILENT, MZ_LARGE), MR_HITASTWO, 0, M1_ANIMAL|M1_THICK_HIDE|M1_NOHANDS|M1_HERBIVORE, M2_HOSTILE|M2_STRONG, 0, CLR_GRAY), MON("baluchitherium", S_QUADRUPED, LVL(14, 12, 5, 0, 0), (G_NOHELL|G_GENO|2), A(ATTK(AT_CLAW, AD_PHYS, 5, 4), ATTK(AT_CLAW, AD_PHYS, 5, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(3800, 800, 0, MS_SILENT, MZ_LARGE), MR_HITASTHREE, 0, M1_ANIMAL|M1_THICK_HIDE|M1_NOHANDS|M1_HERBIVORE, M2_HOSTILE|M2_STRONG, 0, CLR_GRAY), MON("mastodon", S_QUADRUPED, LVL(20, 12, 5, 0, 0), (G_GENO|1), A(ATTK(AT_BUTT, AD_PHYS, 4, 8), ATTK(AT_BUTT, AD_PHYS, 4, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(3800, 800, 0, MS_SILENT, MZ_LARGE), 0, 0, M1_ANIMAL|M1_THICK_HIDE|M1_NOHANDS|M1_HERBIVORE, M2_HOSTILE|M2_STRONG, 0, CLR_BROWN), MON("Jumbo the Elephant", S_QUADRUPED, LVL(30, 12, 5, 0, 0), (G_UNIQ|1), A(ATTK(AT_BUTT, AD_PHYS, 6, 8), ATTK(AT_BUTT, AD_PHYS, 6, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(3800, 800, 0, MS_SILENT, MZ_LARGE), MR_STONE, MR_STONE, M1_ANIMAL|M1_THICK_HIDE|M1_NOHANDS|M1_HERBIVORE, M2_STRONG|M2_PNAME|M2_PRINCE|M2_MALE|M2_STALK| M2_HOSTILE|M2_NASTY|M2_NOPOLY, 0, HI_LORD), MON("juggernaut", S_QUADRUPED, LVL(30, 9, 7, 0, 0), (G_NOHELL|G_GENO|G_NOCORPSE|1), A(ATTK(AT_BUTT, AD_PHYS, 8, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(3800, 800, 0, MS_SILENT, MZ_GIGANTIC), 0, 0, M1_ANIMAL|M1_THICK_HIDE|M1_NOHANDS|M1_HERBIVORE, M2_HOSTILE|M2_STRONG, 0, CLR_YELLOW), MON("catoblepas", S_QUADRUPED, LVL(6, 6, 7, 10, 0), (G_NOGEN|G_UNIQ|G_GENO), A(ATTK(AT_GAZE, AD_DETH, 2, 6), ATTK(AT_BITE, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1200, 500, 0, MS_SILENT, MZ_LARGE), MR_HITASTWO, 0, M1_ANIMAL|M1_NOHANDS|M1_HERBIVORE, M2_HOSTILE|M2_NASTY|M2_STRONG, 0, CLR_BLACK), /* * rodents */ MON("sewer rat", S_RODENT, LVL(0, 12, 7, 0, 0), (G_NOHELL|G_GENO|G_SGROUP|1), A(ATTK(AT_BITE, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(20, 12, 0, MS_SQEEK, MZ_TINY), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, CLR_BROWN), MON("rabbit", S_RODENT, LVL(0, 15, 7, 0, 0), (G_NOHELL|G_GENO|2), A(ATTK(AT_BITE, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(20, 12, 0, MS_SQEEK, MZ_TINY), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_HERBIVORE, M2_HOSTILE, M3_INFRAVISIBLE, CLR_WHITE), MON("black rat", S_RODENT, LVL(0, 12, 7, 0, 0), (G_NOGEN|G_GENO), A(ATTK(AT_BITE, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(20, 12, 0, MS_SQEEK, MZ_TINY), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, CLR_BLACK), MON("giant rat", S_RODENT, LVL(1, 10, 7, 0, 0), (G_NOHELL|G_GENO|G_SGROUP|2), A(ATTK(AT_BITE, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(30, 30, 0, MS_SQEEK, MZ_TINY), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, CLR_BROWN), MON("rabid rat", S_RODENT, LVL(2, 12, 6, 0, 0), (G_NOHELL|G_GENO|1), A(ATTK(AT_BITE, AD_DRCO, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(30, 5, 0, MS_SQEEK, MZ_TINY), MR_POISON, 0, M1_ANIMAL|M1_NOHANDS|M1_POIS|M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, CLR_BROWN), MON("rabid rabbit", S_RODENT, LVL(3, 18, 7, 0, 0), (G_NOHELL|G_GENO|1), A(ATTK(AT_BITE, AD_DRCO, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(20, 12, 0, MS_SQEEK, MZ_TINY), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_HERBIVORE, M2_HOSTILE, M3_INFRAVISIBLE, CLR_WHITE), MON("pack rat", S_RODENT, LVL(0, 12, 7, 0, 0), (G_NOGEN|G_GENO), A(ATTK(AT_BITE, AD_PHYS, 1, 3), ATTK(AT_TUCH, AD_SITM, 1, 1), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(20, 12, 0, MS_SQEEK, MZ_TINY), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, CLR_BLACK), MON("wererat", S_RODENT, LVL(2, 12, 6, 10, -7), (G_NOGEN|G_NOCORPSE), A(ATTK(AT_BITE, AD_WERE, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(40, 30, 0, MS_SQEEK, MZ_TINY), MR_POISON, 0, M1_NOHANDS|M1_POIS|M1_REGEN|M1_CARNIVORE, M2_NOPOLY|M2_WERE|M2_HOSTILE, M3_INFRAVISIBLE, CLR_BROWN), MON("rock mole", S_RODENT, LVL(3, 3, 0, 20, 0), (G_NOHELL|G_GENO|2), 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|M1_ANIMAL|M1_NOHANDS|M1_METALLIVORE, M2_HOSTILE|M2_GREEDY|M2_JEWELS|M2_COLLECT, M3_INFRAVISIBLE, CLR_GRAY), MON("woodchuck", S_RODENT, LVL(3, 3, 0, 20, 0), (G_NOGEN|G_GENO), 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), MON("hellrat", S_RODENT, LVL(5, 15, 7, 0, 0), (G_HELL|G_GENO|G_LGROUP|G_NOCORPSE|1), A(ATTK(AT_BITE, AD_FIRE, 3, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(20, 12, 0, MS_SQEEK, MZ_TINY), MR_FIRE, MR_FIRE, M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, CLR_RED), MON("the Rat King", S_RODENT, LVL(12, 15, 7, 0, 0), (G_UNIQ|1), A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_BITE, AD_PHYS, 2, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(200, 120, 0, MS_SQEEK, MZ_MEDIUM), MR_STONE, MR_STONE, M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_STRONG|M2_PNAME|M2_PRINCE|M2_MALE|M2_GREEDY|M2_STALK| M2_HOSTILE|M2_NASTY|M2_NOPOLY|M2_JEWELS|M2_COLLECT| M2_MAGIC, M3_INFRAVISIBLE|M3_NOTAME, HI_LORD), /* * spiders & scorpions (keep webmaker() in sync if new critters are added) */ MON("cave spider", S_SPIDER, LVL(1, 12, 3, 0, 0), (G_NOHELL|G_GENO|G_SGROUP|3), A(ATTK(AT_BITE, AD_PHYS, 1, 2), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(50, 50, 0, MS_SILENT, MZ_TINY), MR_POISON, MR_POISON, M1_CONCEAL|M1_ANIMAL|M1_NOHANDS|M1_OVIPAROUS|M1_CARNIVORE, M2_HOSTILE, 0, CLR_GRAY), MON("centipede", S_SPIDER, LVL(2, 4, 3, 0, 0), (G_GENO|1), A(ATTK(AT_BITE, AD_DRST, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(50, 50, 0, MS_SILENT, MZ_TINY), MR_POISON, MR_POISON, M1_CONCEAL|M1_ANIMAL|M1_NOHANDS|M1_OVIPAROUS|M1_CARNIVORE, M2_HOSTILE, 0, CLR_YELLOW), MON("recluse spider", S_SPIDER, LVL(3, 12, 3, 0, 0), (G_NOHELL|G_GENO|G_SGROUP|1), A(ATTK(AT_BITE, AD_DRST, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(50, 50, 0, MS_SILENT, MZ_TINY), MR_POISON, MR_POISON, M1_CONCEAL|M1_ANIMAL|M1_NOHANDS|M1_OVIPAROUS|M1_CARNIVORE, M2_HOSTILE, 0, CLR_BROWN), MON("giant spider", S_SPIDER, LVL(5, 15, 4, 0, 0), (G_NOHELL|G_GENO|1), A(ATTK(AT_BITE, AD_DRST, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(100, 100, 0, MS_SILENT, MZ_LARGE), MR_POISON, MR_POISON, M1_ANIMAL|M1_NOHANDS|M1_OVIPAROUS|M1_POIS|M1_CARNIVORE, M2_HOSTILE|M2_STRONG, 0, CLR_MAGENTA), MON("barking spider", S_SPIDER, LVL(5, 15, 3, 0, 0), (G_NOHELL|G_GENO|1), A(ATTK(AT_BITE, AD_PHYS, 1, 2), ATTK(AT_BITE, AD_PHYS, 1, 2), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(100, 100, 0, MS_BARK, MZ_LARGE), MR_POISON, MR_POISON, M1_ANIMAL|M1_NOHANDS|M1_OVIPAROUS|M1_POIS| M1_CARNIVORE, M2_HOSTILE, 0, CLR_ORANGE), MON("scorpion", S_SPIDER, LVL(5, 15, 3, 0, 0), (G_NOHELL|G_GENO|1), A(ATTK(AT_CLAW, AD_PHYS, 1, 2), ATTK(AT_CLAW, AD_PHYS, 1, 2), ATTK(AT_STNG, AD_DRST, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(50, 100, 0, MS_SILENT, MZ_SMALL), MR_POISON, MR_POISON, M1_CONCEAL|M1_ANIMAL|M1_NOHANDS|M1_OVIPAROUS|M1_POIS|M1_CARNIVORE, M2_HOSTILE, 0, CLR_RED), MON("carrion crawler", S_SPIDER, LVL(3, 12, 3, 0, 0), (G_NOHELL|G_GENO|1), A(ATTK(AT_TUCH, AD_PLYS, 1, 1), ATTK(AT_TUCH, AD_PLYS, 1, 1), ATTK(AT_TUCH, AD_PLYS, 1, 1), ATTK(AT_TUCH, AD_PLYS, 1, 1), ATTK(AT_TUCH, AD_PLYS, 1, 1), ATTK(AT_TUCH, AD_PLYS, 1, 1)), SIZ(50, 100, 0, MS_SILENT, MZ_LARGE), MR_POISON, MR_POISON, M1_ANIMAL|M1_NOHANDS|M1_OVIPAROUS|M1_CARNIVORE, M2_HOSTILE|M2_NASTY, 0, CLR_GREEN), MON("nickelpede", S_SPIDER, LVL(8, 4, 3, 0, 0), (G_NOHELL|G_GENO|1), A(ATTK(AT_BITE, AD_DRST, 3, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(150, 50, 0, MS_SILENT, MZ_MEDIUM), MR_POISON, MR_POISON, M1_CONCEAL|M1_ANIMAL|M1_NOHANDS|M1_OVIPAROUS|M1_CARNIVORE, M2_HOSTILE, 0, CLR_CYAN), MON("giant scorpion", S_SPIDER, LVL(12, 15, 3, 0, 0), (G_NOHELL|G_GENO|1), A(ATTK(AT_CLAW, AD_PHYS, 5, 2), ATTK(AT_CLAW, AD_PHYS, 5, 2), ATTK(AT_STNG, AD_DRST, 3, 4), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(500, 150, 0, MS_SILENT, MZ_LARGE), MR_POISON, MR_POISON, M1_ANIMAL|M1_NOHANDS|M1_OVIPAROUS|M1_POIS|M1_CARNIVORE, M2_HOSTILE, 0, CLR_RED), MON("Girtab", S_SPIDER, LVL(22, 15, 3, 0, 0), (G_UNIQ|G_NOGEN|1), A(ATTK(AT_CLAW, AD_PHYS, 5, 4), ATTK(AT_CLAW, AD_PHYS, 5, 4), ATTK(AT_STNG, AD_DRST, 3, 8), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(500, 150, 0, MS_SILENT, MZ_LARGE), MR_POISON|MR_STONE, MR_POISON, M1_ANIMAL|M1_NOHANDS|M1_OVIPAROUS|M1_POIS|M1_CARNIVORE, M2_STRONG|M2_PNAME|M2_PRINCE|M2_FEMALE|M2_STALK| M2_HOSTILE|M2_NASTY|M2_NOPOLY, M3_NOTAME, CLR_RED), MON("Shelob", S_SPIDER, SIZ(26, 15, 3, 0, 0), (G_UNIQ|G_NOGEN|1), A(ATTK(AT_BITE, AD_PHYS, 8, 4), ATTK(AT_BITE, AD_DRST, 5, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(500, 150, 0, MS_SILENT, MZ_LARGE), MR_POISON|MR_STONE, MR_POISON, M1_ANIMAL|M1_NOHANDS|M1_OVIPAROUS|M1_POIS|M1_CARNIVORE, M2_STRONG|M2_PNAME|M2_PRINCE|M2_FEMALE|M2_STALK| M2_HOSTILE|M2_NASTY|M2_NOPOLY, M3_NOTAME, CLR_BLACK), MON("phase spider", S_SPIDER, LVL(8, 12, 2, 0, -4), (G_GENO|1), A(ATTK(AT_BITE, AD_DRST, 3, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(100, 100, 0, MS_SILENT, MZ_LARGE), MR_POISON, MR_POISON, M1_ANIMAL|M1_NOHANDS|M1_OVIPAROUS|M1_POIS|M1_TPORT|M1_CARNIVORE, M2_HOSTILE|M2_STRONG, 0, CLR_BLUE), MON("werespider", S_SPIDER, LVL(11, 15, 3, 0, 0), (G_GENO|G_NOGEN|1), A(ATTK(AT_BITE, AD_WERE, 4, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(100, 100, 0, MS_BARK, MZ_LARGE), MR_POISON, MR_POISON, M1_ANIMAL|M1_NOHANDS|M1_OVIPAROUS|M1_POIS|M1_CARNIVORE|M1_REGEN, M2_NOPOLY|M2_HOSTILE|M2_WERE, 0, CLR_BLACK), /* * trappers, lurkers, &c */ MON("lurker above", S_TRAPPER, LVL(10, 3, 3, 0, 0), (G_GENO|2), A(ATTK(AT_ENGL, AD_DGST, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(800, 350, 0, MS_SILENT, MZ_HUGE), 0, 0, M1_HIDE|M1_FLY|M1_ANIMAL|M1_NOEYES|M1_NOLIMBS|M1_NOHEAD|M1_CARNIVORE, M2_HOSTILE|M2_STALK|M2_STRONG, 0, CLR_GRAY), MON("trapper", S_TRAPPER, LVL(12, 3, 3, 0, 0), (G_GENO|2), A(ATTK(AT_ENGL, AD_DGST, 1,10), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(800, 350, 0, MS_SILENT, MZ_HUGE), 0, 0, M1_HIDE|M1_ANIMAL|M1_NOEYES|M1_NOLIMBS|M1_NOHEAD|M1_CARNIVORE, M2_HOSTILE|M2_STALK|M2_STRONG, 0, CLR_GREEN), /* * unicorns and horses */ MON("white unicorn", S_UNICORN, LVL(4, 24, 2, 70, 7), (G_NOHELL|G_GENO|4), A(ATTK(AT_BUTT, AD_PHYS, 1,12), ATTK(AT_KICK, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1300, 300, 0, MS_NEIGH, MZ_LARGE), MR_POISON|MR_HITASTWO, MR_POISON, M1_NOHANDS|M1_HERBIVORE, M2_WANDER|M2_STRONG|M2_JEWELS, M3_INFRAVISIBLE, CLR_WHITE), MON("gray unicorn", S_UNICORN, LVL(4, 24, 2, 70, 0), (G_NOHELL|G_GENO|4), A(ATTK(AT_BUTT, AD_PHYS, 1,12), ATTK(AT_KICK, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1300, 300, 0, MS_NEIGH, MZ_LARGE), MR_POISON|MR_HITASTWO, MR_POISON, M1_NOHANDS|M1_HERBIVORE, M2_WANDER|M2_STRONG|M2_JEWELS, M3_INFRAVISIBLE, CLR_GRAY), MON("black unicorn", S_UNICORN, LVL(4, 24, 2, 70, -7), (G_NOHELL|G_GENO|4), A(ATTK(AT_BUTT, AD_PHYS, 1,12), ATTK(AT_KICK, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1300, 300, 0, MS_NEIGH, MZ_LARGE), MR_POISON|MR_HITASTWO, MR_POISON, M1_NOHANDS|M1_HERBIVORE, M2_WANDER|M2_STRONG|M2_JEWELS, M3_INFRAVISIBLE, CLR_BLACK), MON("pony", S_UNICORN, LVL(3, 16, 6, 0, 0), (G_GENO|2), A(ATTK(AT_KICK, AD_PHYS, 1, 6), ATTK(AT_BITE, AD_PHYS, 1, 2), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1300, 250, 0, MS_NEIGH, MZ_MEDIUM), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_HERBIVORE, M2_WANDER|M2_STRONG|M2_DOMESTIC, M3_INFRAVISIBLE, CLR_BROWN), MON("horse", S_UNICORN, LVL(5, 20, 5, 0, 0), (G_GENO|2), A(ATTK(AT_KICK, AD_PHYS, 1, 8), ATTK(AT_BITE, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1500, 300, 0, MS_NEIGH, MZ_LARGE), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_HERBIVORE, M2_WANDER|M2_STRONG|M2_DOMESTIC, M3_INFRAVISIBLE, CLR_BROWN), MON("warhorse", S_UNICORN, LVL(7, 24, 4, 0, 0), (G_GENO|2), A(ATTK(AT_KICK, AD_PHYS, 1, 10), ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1800, 350, 0, MS_NEIGH, MZ_LARGE), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_HERBIVORE, M2_WANDER|M2_STRONG|M2_DOMESTIC, M3_INFRAVISIBLE, CLR_BROWN), MON("Pegasus", S_UNICORN, LVL(12, 24, 2, 70, 7), (G_NOGEN|G_UNIQ), A(ATTK(AT_KICK, AD_PHYS, 2, 10), ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1500, 350, 0, MS_NEIGH, MZ_LARGE), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_FLY, M2_NOPOLY|M2_PEACEFUL|M2_PNAME|M2_WANDER|M2_STRONG, 0, CLR_WHITE), /* * vortices */ MON("fog cloud", S_VORTEX, LVL(3, 1, 0, 0, 0), (G_GENO|G_NOCORPSE|2), A(ATTK(AT_ENGL, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(0, 0, 0, MS_SILENT, MZ_HUGE), MR_SLEEP|MR_POISON|MR_STONE, 0, M1_FLY|M1_BREATHLESS|M1_NOEYES|M1_NOLIMBS|M1_NOHEAD|M1_MINDLESS| M1_AMORPHOUS|M1_UNSOLID, M2_HOSTILE|M2_NEUTER, 0, CLR_GRAY), MON("dust vortex", S_VORTEX, LVL(4, 20, 2, 30, 0), (G_GENO|G_NOCORPSE|2), A(ATTK(AT_ENGL, AD_BLND, 2, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(0, 0, 0, MS_SILENT, MZ_HUGE), MR_SLEEP|MR_POISON|MR_STONE, 0, M1_FLY|M1_BREATHLESS|M1_NOEYES|M1_NOLIMBS|M1_NOHEAD|M1_MINDLESS, M2_HOSTILE|M2_NEUTER, 0, CLR_BROWN), MON("ice vortex", S_VORTEX, LVL(5, 20, 2, 30, 0), (G_NOHELL|G_GENO|G_NOCORPSE|1), A(ATTK(AT_ENGL, AD_COLD, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(0, 0, 0, MS_SILENT, MZ_HUGE), MR_COLD|MR_SLEEP|MR_POISON|MR_STONE, 0, M1_FLY|M1_BREATHLESS|M1_NOEYES|M1_NOLIMBS|M1_NOHEAD|M1_MINDLESS, M2_HOSTILE|M2_NEUTER, M3_INFRAVISIBLE, CLR_CYAN), MON("energy vortex", S_VORTEX, LVL(6, 20, 2, 30, 0), (G_NOHELL|G_GENO|G_NOCORPSE|1), A(ATTK(AT_ENGL, AD_ELEC, 1, 6), ATTK(AT_ENGL, AD_DREN, 0, 0), ATTK(AT_NONE, AD_ELEC, 0, 4), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(0, 0, 0, MS_SILENT, MZ_HUGE), MR_ELEC|MR_SLEEP|MR_DISINT|MR_POISON|MR_STONE, 0, M1_FLY|M1_BREATHLESS|M1_NOEYES|M1_NOLIMBS|M1_NOHEAD|M1_MINDLESS| M1_UNSOLID, M2_HOSTILE|M2_NEUTER, 0, HI_ZAP), MON("steam vortex", S_VORTEX, LVL(7, 22, 2, 30, 0), (G_HELL|G_GENO|G_NOCORPSE|2), A(ATTK(AT_ENGL, AD_FIRE, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(0, 0, 0, MS_SILENT, MZ_HUGE), MR_FIRE|MR_SLEEP|MR_POISON|MR_STONE|MR_PLUSONE, 0, M1_FLY|M1_BREATHLESS|M1_NOEYES|M1_NOLIMBS|M1_NOHEAD|M1_MINDLESS| M1_UNSOLID, M2_HOSTILE|M2_NEUTER, M3_INFRAVISIBLE, CLR_BLUE), MON("fire vortex", S_VORTEX, LVL(8, 22, 2, 30, 0), (G_HELL|G_GENO|G_NOCORPSE|1), A(ATTK(AT_ENGL, AD_FIRE, 1,10), ATTK(AT_NONE, AD_FIRE, 0, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(0, 0, 0, MS_SILENT, MZ_HUGE), MR_FIRE|MR_SLEEP|MR_POISON|MR_STONE|MR_PLUSONE, 0, M1_FLY|M1_BREATHLESS|M1_NOEYES|M1_NOLIMBS|M1_NOHEAD|M1_MINDLESS| M1_UNSOLID, M2_HOSTILE|M2_NEUTER, M3_INFRAVISIBLE, CLR_YELLOW), /* * worms */ MON("larva", S_WORM, LVL(1, 6, 9, 0, 0), (G_GENO|G_SGROUP|2), A(ATTK(AT_BITE, AD_PHYS, 1, 2), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(150, 100, 0, MS_SILENT, MZ_MEDIUM), MR_SLEEP|MR_POISON, MR_SLEEP, M1_ANIMAL|M1_SLITHY|M1_NOLIMBS|M1_POIS|M1_REGEN|M1_NOTAKE, M2_HOSTILE|M2_WANDER|M2_STALK|M2_NEUTER, 0, CLR_WHITE), MON("maggot", S_WORM, LVL(2, 9, 5, 0, 0), (G_GENO|G_SGROUP|2), A(ATTK(AT_BITE, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(10, 10, 0, MS_SILENT, MZ_SMALL), 0, 0, M1_ANIMAL|M1_CONCEAL|M1_SLITHY|M1_NOLIMBS|M1_CARNIVORE|M1_NOTAKE, M2_HOSTILE, 0, CLR_WHITE), MON("dung worm", S_WORM, LVL(3, 9, 5, 0, 0), (G_GENO|G_SGROUP|2), A(ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(10, 10, 0, MS_SILENT, MZ_SMALL), 0, 0, M1_ANIMAL|M1_SLITHY|M1_NOLIMBS|M1_CARNIVORE|M1_NOTAKE, M2_HOSTILE, 0, CLR_BLACK), MON("acid worm", S_WORM, LVL(4, 9, 5, 0, 0), (G_GENO|G_SGROUP|1), A(ATTK(AT_SPIT, AD_ACID, 2, 4), ATTK(AT_BITE, AD_DRST, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(30, 30, 0, MS_SILENT, MZ_SMALL), MR_ACID|MR_STONE, MR_STONE, M1_ANIMAL|M1_SLITHY|M1_NOLIMBS|M1_CARNIVORE|M1_ACID|M1_NOTAKE, M2_HOSTILE, 0, CLR_GREEN), MON("bloodworm", S_WORM, LVL(6, 9, 4, 0, 0), (G_NOHELL|G_GENO|1), A(ATTK(AT_BITE, AD_DRST, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(30, 30, 0, MS_SILENT, MZ_SMALL), MR_ACID, 0, M1_ANIMAL|M1_SLITHY|M1_NOLIMBS|M1_CARNIVORE|M1_AMPHIBIOUS|M1_NOTAKE, M2_HOSTILE, 0, CLR_BROWN), MON("tunnel worm", S_WORM, LVL(7, 9, 5, 0, 0), (G_NOHELL|G_GENO|1), A(ATTK(AT_BITE, AD_PHYS, 3, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(300, 200, 0, MS_SILENT, MZ_MEDIUM), MR_ACID, 0, M1_ANIMAL|M1_SLITHY|M1_TUNNEL|M1_NOLIMBS|M1_CARNIVORE|M1_NOTAKE, M2_HOSTILE, 0, CLR_RED), MON("baby long worm", S_WORM, LVL(8, 3, 5, 0, 0), G_GENO, A(ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(600, 250, 0, MS_SILENT, MZ_LARGE), 0, 0, M1_ANIMAL|M1_SLITHY|M1_NOLIMBS|M1_CARNIVORE|M1_NOTAKE, M2_HOSTILE, 0, CLR_BROWN), MON("baby purple worm", S_WORM, LVL(8, 3, 5, 0, 0), G_GENO, A(ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(600, 250, 0, MS_SILENT, MZ_LARGE), 0, 0, M1_ANIMAL|M1_SLITHY|M1_NOLIMBS|M1_CARNIVORE, M2_HOSTILE, 0, CLR_MAGENTA), MON("long worm", S_WORM, LVL(8, 3, 5, 10, 0), (G_NOHELL|G_GENO|2), A(ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1500, 500, 0, MS_SILENT, MZ_GIGANTIC), 0, 0, M1_ANIMAL|M1_SLITHY|M1_NOLIMBS|M1_OVIPAROUS|M1_CARNIVORE|M1_NOTAKE, M2_HOSTILE|M2_STRONG|M2_NASTY, 0, CLR_BROWN), MON("purple worm", S_WORM, LVL(15, 9, 6, 20, 0), (G_NOHELL|G_GENO|2), A(ATTK(AT_BITE, AD_PHYS, 2, 8), ATTK(AT_ENGL, AD_DGST, 1,10), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(2700, 700, 0, MS_SILENT, MZ_GIGANTIC), MR_HITASONE, 0, M1_ANIMAL|M1_SLITHY|M1_NOLIMBS|M1_OVIPAROUS|M1_CARNIVORE, M2_HOSTILE|M2_STRONG|M2_NASTY, 0, CLR_MAGENTA), MON("rot worm", S_WORM, LVL(1, 9, 5, 0, 0), (G_NOGEN|G_GENO), A(ATTK(AT_BITE, AD_DISE, 1, 2), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(10, 10, 0, MS_SILENT, MZ_SMALL), 0, 0, M1_ANIMAL|M1_CONCEAL|M1_SLITHY|M1_NOLIMBS|M1_CARNIVORE, M2_NASTY|M2_HOSTILE, 0, CLR_GRAY), /* * xan, &c */ MON("grid bug", S_XAN, LVL(0, 12, 9, 0, 0), (G_NOHELL|G_GENO|G_SGROUP|G_NOCORPSE|3), A(ATTK(AT_BITE, AD_ELEC, 1, 1), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(15, 10, 0, MS_BUZZ, MZ_TINY), MR_ELEC|MR_POISON|MR_HITASONE, 0, M1_ANIMAL, M2_HOSTILE, M3_INFRAVISIBLE, CLR_MAGENTA), MON("spark bug", S_XAN, LVL(2, 12, 9, 0, 0), (G_NOHELL|G_GENO|G_SGROUP|G_NOCORPSE|1), A(ATTK(AT_BITE, AD_ELEC, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(15, 10, 0, MS_BUZZ, MZ_TINY), MR_ELEC|MR_POISON|MR_HITASONE, 0, M1_ANIMAL, M2_HOSTILE, M3_INFRAVISIBLE, HI_ZAP), MON("arc bug", S_XAN, LVL(4, 12, 9, 0, 0), (G_NOHELL|G_GENO|G_SGROUP|G_NOCORPSE|1), A(ATTK(AT_BITE, AD_ELEC, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(15, 10, 0, MS_BUZZ, MZ_TINY), MR_ELEC|MR_POISON|MR_HITASONE, 0, M1_ANIMAL, M2_HOSTILE, M3_INFRAVISIBLE, CLR_ORANGE), MON("lightning bug", S_XAN, LVL(6, 12, 9, 0, 0), (G_NOHELL|G_GENO|G_SGROUP|G_NOCORPSE|1), A(ATTK(AT_BITE, AD_ELEC, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(15, 10, 0, MS_BUZZ, MZ_TINY), MR_ELEC|MR_POISON|MR_HITASONE, 0, M1_ANIMAL, M2_HOSTILE, M3_INFRAVISIBLE, CLR_YELLOW), MON("xan", S_XAN, LVL(7, 18, -4, 0, 0), (G_GENO|3), A(ATTK(AT_STNG, AD_LEGS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(300, 300, 0, MS_BUZZ, MZ_TINY), MR_POISON, MR_POISON, M1_FLY|M1_ANIMAL|M1_NOHANDS|M1_POIS, M2_HOSTILE, M3_INFRAVISIBLE, CLR_RED), /* * lights */ MON("yellow light", S_LIGHT, LVL(3, 15, 0, 0, 0), (G_NOHELL|G_NOCORPSE|G_GENO|4), A(ATTK(AT_EXPL, AD_BLND, 10,20), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(0, 0, 0, MS_SILENT, MZ_SMALL), MR_FIRE|MR_COLD|MR_ELEC|MR_DISINT|MR_SLEEP|MR_POISON|MR_ACID| MR_STONE, 0, M1_FLY|M1_BREATHLESS|M1_AMORPHOUS|M1_NOEYES|M1_NOLIMBS|M1_NOHEAD| M1_MINDLESS|M1_UNSOLID|M1_NOTAKE, M2_HOSTILE|M2_NEUTER, M3_INFRAVISIBLE, CLR_YELLOW), MON("black light", S_LIGHT, LVL(5, 15, 0, 0, 0), (G_NOCORPSE|G_GENO|2), A(ATTK(AT_EXPL, AD_HALU, 10,12), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(0, 0, 0, MS_SILENT, MZ_SMALL), MR_FIRE|MR_COLD|MR_ELEC|MR_DISINT|MR_SLEEP|MR_POISON|MR_ACID| MR_STONE, 0, M1_FLY|M1_BREATHLESS|M1_AMORPHOUS|M1_NOEYES|M1_NOLIMBS|M1_NOHEAD| M1_MINDLESS|M1_UNSOLID|M1_SEE_INVIS|M1_NOTAKE, M2_HOSTILE|M2_NEUTER, 0, CLR_BLACK), /* * Zouthern animals * (the zruty has been moved to Yeti) */ #if 0 MON("zruty", S_ZRUTY, LVL(9, 8, 3, 0, 0), (G_NOHELL|G_GENO|2), A(ATTK(AT_CLAW, AD_PHYS, 3, 4), ATTK(AT_CLAW, AD_PHYS, 3, 4), ATTK(AT_BITE, AD_PHYS, 3, 6), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1200, 600, 0, MS_SILENT, MZ_LARGE), MR_HITASONE, 0, M1_ANIMAL|M1_HUMANOID|M1_CARNIVORE, M2_HOSTILE|M2_STRONG, M3_INFRAVISIBLE, CLR_BROWN), #endif #define M1_MARSUPIAL 0 /* Montronemes (egg-laying mammals) */ MON("echidna", S_ZOUTHERN, LVL(2, 6, 9, 0, 0), (G_NOHELL|G_GENO|1), A(ATTK(AT_CLAW, AD_PHYS, 1, 2), ATTK(AT_CLAW, AD_PHYS, 1, 2), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(15, 10, 0, MS_SILENT, MZ_TINY), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE|M1_OVIPAROUS|M1_THICK_HIDE, M2_WANDER, 0, CLR_BROWN), MON("platypus", S_ZOUTHERN, LVL(4, 8, 8, 0, 0), (G_NOHELL|G_GENO|1), A(ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_KICK, AD_DRST, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(20, 12, 0, MS_SILENT, MZ_TINY), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE|M1_OVIPAROUS|M1_SWIM|M1_THICK_HIDE, M2_WANDER, 0, CLR_GREEN), /* ...males have a poisonous spur on their hind paws */ /* Bear-like marsupials */ MON("koala", S_ZOUTHERN, LVL(7, 4, 9, 10, 0), (G_NOHELL|G_GENO|2), A(ATTK(AT_TUCH, AD_CALM, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(150, 50, 0, MS_SQEEK, MZ_SMALL), MR_POISON, 0, M1_ANIMAL|M1_HERBIVORE|M1_MARSUPIAL|M1_SEE_INVIS, M2_DOMESTIC, 0, CLR_GRAY), /* ...cute and fuzzy! A tame koala versus a hostile monster (or vice * versa) will calm (AD_CALM) the other monster into peacefullness. * Certain monsters resist. * Koalas can only eat eucalyptus leaves. */ MON("wombat", S_ZOUTHERN, LVL(5, 12, 5, 0, 0), (G_NOHELL|G_GENO|1), A(ATTK(AT_KICK, AD_PHYS, 1, 6), ATTK(AT_BITE, AD_PHYS, 1, 2), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(100, 40, 0, MS_GROWL, MZ_SMALL), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_HERBIVORE|M1_MARSUPIAL, M2_DOMESTIC, 0, CLR_BROWN), MON("Tasmanian devil", S_ZOUTHERN, LVL(9, 12, 8, 0, 0), (G_NOHELL|G_GENO|1), A(ATTK(AT_CLAW, AD_PHYS, 3, 4), ATTK(AT_CLAW, AD_PHYS, 3, 4), ATTK(AT_BITE, AD_PHYS, 3, 6), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(500, 250, 0, MS_GROWL, MZ_SMALL), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_OMNIVORE|M1_MARSUPIAL, M2_HOSTILE, 0, CLR_BLACK), /* ...also eats organics (like gelatinous cube) */ /* Macropods (kangaroos) */ MON("wallaby", S_ZOUTHERN, LVL(5, 16, 7, 0, 0), (G_NOHELL|G_GENO|1), A(ATTK(AT_KICK, AD_PHYS, 2, 4), ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(400, 150, 0, MS_SILENT, MZ_SMALL), 0, 0, M1_ANIMAL|M1_HERBIVORE|M1_MARSUPIAL, 0, 0, CLR_BROWN), MON("wallaroo", S_ZOUTHERN, LVL(6, 20, 8, 0, 0), (G_NOHELL|G_GENO|G_SGROUP|1), A(ATTK(AT_KICK, AD_PHYS, 2, 6), ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(600, 300, 0, MS_SILENT, MZ_SMALL), 0, 0, M1_ANIMAL|M1_HERBIVORE|M1_MARSUPIAL, 0, 0, CLR_RED), MON("kangaroo", S_ZOUTHERN, LVL(10, 24, 6, 0, 0), (G_NOHELL|G_GENO|G_SGROUP|2), A(ATTK(AT_KICK, AD_PHYS, 2, 8), ATTK(AT_KICK, AD_PHYS, 2, 8), ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1000, 500, 0, MS_SILENT, MZ_MEDIUM), 0, 0, M1_ANIMAL|M1_HERBIVORE|M1_MARSUPIAL, M2_NASTY, 0, CLR_GRAY), /* * Angels and other lawful minions */ MON("couatl", S_ANGEL, LVL(8, 10, 5, 30, 7), (G_NOHELL|G_NOHELL|G_SGROUP|G_NOCORPSE|1), A(ATTK(AT_BITE, AD_DRST, 2, 4), ATTK(AT_BITE, AD_PHYS, 1, 3), ATTK(AT_HUGS, AD_WRAP, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(900, 400, 0, MS_HISS, MZ_LARGE), MR_POISON|MR_PLUSTWO, 0, M1_FLY|M1_POIS, M2_MINION|M2_STALK|M2_STRONG|M2_NASTY, M3_INFRAVISIBLE|M3_INFRAVISION, CLR_GREEN), MON("Aleax", S_ANGEL, LVL(10, 8, 0, 30, 7), (G_NOHELL|G_NOCORPSE|1), A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_KICK, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_IMITATE, MZ_HUMAN), MR_COLD|MR_ELEC|MR_SLEEP|MR_POISON|MR_PLUSTWO, 0, M1_HUMANOID|M1_SEE_INVIS, M2_MINION|M2_STALK|M2_NASTY|M2_COLLECT, M3_INFRAVISIBLE|M3_INFRAVISION, CLR_YELLOW), MON("movanic deva", S_ANGEL, LVL(12, 18, -5, 90, 15), (G_NOHELL|G_NOCORPSE|1), A(ATTK(AT_WEAP, AD_FIRE, 3, 4), ATTK(AT_WEAP, AD_FIRE, 3, 4), ATTK(AT_CLAW, AD_PHYS, 3, 4), ATTK(AT_MAGC, AD_CLRC, 2, 6), NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_CUSS, MZ_MEDIUM), MR_DEATH|MR_PLUSONE, 0, M1_FLY|M1_HUMANOID|M1_SEE_INVIS, M2_NOPOLY|M2_MINION|M2_STALK|M2_STRONG|M2_NASTY, M3_INFRAVISIBLE|M3_INFRAVISION, CLR_BLUE), MON("monadic deva", S_ANGEL, LVL(15, 18, -4, 90, 15), (G_NOHELL|G_NOCORPSE|1), A(ATTK(AT_WEAP, AD_PHYS, 3, 4), ATTK(AT_WEAP, AD_PHYS, 6, 4), ATTK(AT_MAGC, AD_CLRC, 3, 4), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_CUSS, MZ_MEDIUM), MR_DEATH|MR_PLUSONE, 0, M1_FLY|M1_HUMANOID|M1_SEE_INVIS, M2_NOPOLY|M2_MINION|M2_STALK|M2_STRONG|M2_NASTY, M3_INFRAVISIBLE|M3_INFRAVISION, CLR_BRIGHT_CYAN), MON("astral deva", S_ANGEL, LVL(18, 18, -6, 90, 15), (G_NOHELL|G_NOCORPSE|1), A(ATTK(AT_WEAP, AD_PHYS, 3, 12), ATTK(AT_WEAP, AD_STUN, 1, 4), ATTK(AT_MAGC, AD_CLRC, 3, 4), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_CUSS, MZ_MEDIUM), MR_DEATH|MR_PLUSONE, 0, M1_FLY|M1_HUMANOID|M1_SEE_INVIS, M2_NOPOLY|M2_MINION|M2_STALK|M2_STRONG|M2_NASTY, M3_INFRAVISIBLE|M3_INFRAVISION, CLR_WHITE), 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_DEATH|MR_COLD|MR_ELEC|MR_SLEEP|MR_POISON|MR_PLUSTHREE, 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, LVL(16, 18, -5, 90, 15), (G_NOHELL|G_NOCORPSE|1), A(ATTK(AT_KICK, AD_PHYS, 2, 4), ATTK(AT_KICK, AD_PHYS, 2, 4), ATTK(AT_BUTT, AD_PHYS, 3, 6), ATTK(AT_MAGC, AD_SPEL, 2, 6), NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_NEIGH, MZ_LARGE), MR_DEATH|MR_PLUSTHREE, 0, M1_FLY|M1_SEE_INVIS, M2_NOPOLY|M2_MINION|M2_STALK|M2_STRONG|M2_NASTY|M2_LORD, M3_INFRAVISIBLE|M3_INFRAVISION, HI_GOLD), MON("Archon", S_ANGEL, LVL(19, 16, -10, 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_DEATH|MR_FIRE|MR_COLD|MR_ELEC|MR_SLEEP|MR_POISON|MR_PLUSFOUR, 0, M1_FLY|M1_HUMANOID|M1_SEE_INVIS|M1_REGEN, M2_NOPOLY|M2_MINION|M2_STALK|M2_STRONG|M2_NASTY|M2_LORD| M2_COLLECT|M2_MAGIC, M3_INFRAVISIBLE|M3_INFRAVISION, HI_LORD), MON("Planetar", S_ANGEL, LVL(29, 16, -10, 80, 15), (G_NOHELL|G_NOCORPSE |1), A(ATTK(AT_WEAP, AD_PHYS, 4, 4), ATTK(AT_WEAP, AD_PHYS, 4, 4), ATTK(AT_GAZE, AD_BLND, 3, 6), ATTK(AT_CLAW, AD_PHYS, 2, 8), ATTK(AT_MAGC, AD_SPEL, 4, 6), NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_CUSS, MZ_LARGE), MR_DEATH|MR_FIRE|MR_COLD|MR_ELEC|MR_SLEEP|MR_POISON|MR_PLUSFOUR, 0, M1_FLY|M1_HUMANOID|M1_SEE_INVIS|M1_REGEN, M2_NOPOLY|M2_MINION|M2_STALK|M2_STRONG|M2_NASTY|M2_LORD| M2_COLLECT|M2_MAGIC, M3_INFRAVISIBLE|M3_INFRAVISION, CLR_CYAN), MON("Solar", S_ANGEL, LVL(39, 16, -10, 80, 15), (G_NOHELL|G_NOCORPSE |1), A(ATTK(AT_WEAP, AD_PHYS, 5, 4), ATTK(AT_WEAP, AD_PHYS, 5, 4), ATTK(AT_GAZE, AD_BLND, 5, 6), ATTK(AT_CLAW, AD_PHYS, 5, 8), ATTK(AT_MAGC, AD_SPEL, 5, 6), NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_CUSS, MZ_LARGE), MR_DEATH|MR_FIRE|MR_COLD|MR_ELEC|MR_SLEEP|MR_POISON|MR_PLUSFOUR, 0, M1_FLY|M1_HUMANOID|M1_SEE_INVIS|M1_REGEN, M2_NOPOLY|M2_MINION|M2_STALK|M2_STRONG|M2_NASTY|M2_LORD| M2_COLLECT|M2_MAGIC, M3_INFRAVISIBLE|M3_INFRAVISION, CLR_BROWN), /* * Bats and birds */ MON("bat", S_BAT, LVL(0, 22, 8, 0, 0), (G_NOHELL|G_GENO|G_SGROUP|2), A(ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(20, 20, 0, MS_SQEEK, MZ_TINY), 0, 0, M1_FLY|M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_WANDER, M3_INFRAVISIBLE, CLR_BROWN), MON("giant bat", S_BAT, LVL(2, 22, 7, 0, 0), (G_NOHELL|G_GENO|2), A(ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(30, 30, 0, MS_SQEEK, MZ_SMALL), 0, 0, M1_FLY|M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_WANDER|M2_HOSTILE, M3_INFRAVISIBLE, CLR_RED), MON("rhumbat", S_BAT, LVL(3, 22, 7, 0, 0), (G_HELL|G_GENO|G_SGROUP|1), A(ATTK(AT_BITE, AD_PHYS, 1, 10), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(30, 30, 0, MS_SQEEK, MZ_MEDIUM), 0, 0, M1_FLY|M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_WANDER|M2_HOSTILE, M3_INFRAVISIBLE, CLR_YELLOW), MON("athol", S_BAT, LVL(2, 20, 7, 0, 0), (G_HELL|G_GENO|G_LGROUP|1), A(ATTK(AT_BITE, AD_PHYS, 1, 5), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(30, 30, 0, MS_SQEEK, MZ_MEDIUM), 0, 0, M1_FLY|M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_WANDER|M2_HOSTILE, M3_INFRAVISIBLE, CLR_GRAY), MON("raven", S_BAT, LVL(4, 20, 6, 0, 0), (G_GENO|2), A(ATTK(AT_BITE, AD_PHYS, 1, 6), ATTK(AT_CLAW, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(40, 20, 0, MS_SQAWK, MZ_SMALL), 0, 0, M1_FLY|M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_WANDER|M2_HOSTILE, 0, CLR_BLACK), MON("vampire bat", S_BAT, LVL(5, 20, 6, 0, 0), (G_GENO|2), 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_VAMPIRE|M2_HOSTILE, M3_INFRAVISIBLE, CLR_BLACK), MON("hellbat", S_BAT, LVL(7, 22, 7, 0, 0), (G_HELL|G_GENO|G_SGROUP|G_NOCORPSE|1), A(ATTK(AT_BITE, AD_FIRE, 1, 12), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(30, 30, 0, MS_SQEEK, MZ_MEDIUM), MR_FIRE, MR_FIRE, M1_FLY|M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_WANDER|M2_HOSTILE, M3_INFRAVISIBLE, CLR_RED), MON("mongbat", S_BAT, LVL(7, 22, 7, 0, 0), (G_HELL|G_GENO|G_SGROUP|1), A(ATTK(AT_BITE, AD_PHYS, 1, 12), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(30, 30, 0, MS_SQEEK, MZ_MEDIUM), 0, 0, M1_FLY|M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_WANDER|M2_HOSTILE, M3_INFRAVISIBLE, CLR_ORANGE), MON("mobat", S_BAT, LVL(9, 22, 7, 0, 0), (G_HELL|G_GENO|G_LGROUP|1), A(ATTK(AT_BITE, AD_PHYS, 2, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(30, 30, 0, MS_SHRIEK, MZ_MEDIUM), 0, 0, M1_FLY|M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_WANDER|M2_HOSTILE, M3_INFRAVISIBLE, CLR_BLACK), MON("harpy", S_BAT, LVL(9, 17, 5, 0, -4), (G_HELL|G_GENO|G_SGROUP|1), A(ATTK(AT_BITE, AD_PHYS, 1, 12), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(130, 130, 0, MS_SQEEK, MZ_MEDIUM), 0, 0, M1_FLY|M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_WANDER|M2_HOSTILE, M3_INFRAVISIBLE|M3_TRAITOR, CLR_GRAY), MON("byakhee", S_BAT, LVL(11, 20, 1, 25, -4), (G_GENO|2|G_SGROUP), A(ATTK(AT_BITE, AD_PHYS, 1, 6), ATTK(AT_CLAW, AD_PHYS, 2, 4), ATTK(AT_CLAW, AD_PHYS, 2, 4), ATTK(AT_STNG, AD_STUN, 1, 3), NO_ATTK, NO_ATTK), SIZ(1600, 100, 0, MS_SQEEK, MZ_MEDIUM), MR_SLEEP|MR_POISON|MR_COLD, 0, M1_FLY|M1_BREATHLESS|M1_POIS|M1_REGEN|M1_THICK_HIDE|M1_SEE_INVIS|M1_OMNIVORE, M2_HOSTILE|M2_WANDER|M2_STALK|M2_STRONG|M2_COLLECT|M2_MAGIC, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, CLR_BROWN), MON("nightgaunt", S_BAT, LVL(15, 20, -2, 50, -6), (G_GENO|2|G_SGROUP), A(ATTK(AT_CLAW, AD_TCKL, 1, 6), ATTK(AT_CLAW, AD_TCKL, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1300, 100, 0, MS_SQEEK, MZ_MEDIUM), MR_SLEEP|MR_POISON|MR_COLD, MR_COLD, M1_FLY|M1_BREATHLESS|M1_POIS|M1_REGEN|M1_THICK_HIDE|M1_SEE_INVIS|M1_OMNIVORE|M1_NOEYES, M2_HOSTILE|M2_WANDER|M2_STALK|M2_STRONG|M2_COLLECT|M2_MAGIC, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, CLR_BROWN), /* * Centaurs */ MON("plains centaur", S_CENTAUR, LVL(4, 18, 4, 0, 0), (G_NOHELL|G_GENO|3), A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_KICK, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(2500, 500, 0, MS_HUMANOID, MZ_LARGE), 0, 0, M1_HUMANOID|M1_OMNIVORE, M2_STRONG|M2_GREEDY|M2_COLLECT, M3_INFRAVISIBLE, CLR_BROWN), MON("forest centaur", S_CENTAUR, LVL(5, 18, 3, 10, -1), (G_NOHELL|G_GENO|3), A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_KICK, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(2550, 600, 0, MS_HUMANOID, MZ_LARGE), 0, 0, M1_HUMANOID|M1_OMNIVORE, M2_STRONG|M2_GREEDY|M2_COLLECT, M3_INFRAVISIBLE|M3_TRAITOR, CLR_GREEN), MON("mountain centaur", S_CENTAUR, LVL(6, 20, 2, 10, -3), (G_NOHELL|G_GENO|3), A(ATTK(AT_WEAP, AD_PHYS, 1,10), ATTK(AT_KICK, AD_PHYS, 1, 6), ATTK(AT_KICK, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(2550, 500, 0, MS_HUMANOID, MZ_LARGE), 0, 0, M1_HUMANOID|M1_OMNIVORE, M2_STRONG|M2_GREEDY|M2_COLLECT, M3_INFRAVISIBLE|M3_TRAITOR, CLR_CYAN), /* * Dragons */ /* The order of the dragons is VERY IMPORTANT. Quite a few * pieces of code depend on gray being first and yellow being last. * The code also depends on the *order* being the same as that for * dragon scale mail and dragon scales in objects.c. Baby dragons * cannot confer intrinsics, to avoid polyself/egg abuse. * * As reptiles, dragons are cold-blooded and thus aren't seen * with infravision. Red dragons are the exception. */ MON("baby gray dragon", S_DRAGON, LVL(4, 9, 2, 10, 0), (G_GENO|2), A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(500, 500, 0, MS_ROAR, MZ_HUGE), MR_HITASONE, 0, M1_FLY|M1_THICK_HIDE|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE|M2_STRONG|M2_GREEDY|M2_JEWELS, 0, CLR_GRAY), MON("baby silver dragon", S_DRAGON, LVL(4, 9, 2, 40, 0), (G_GENO|2), A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(500, 500, 0, MS_ROAR, MZ_HUGE), 0, 0, M1_FLY|M1_THICK_HIDE|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE|M2_STRONG|M2_GREEDY|M2_JEWELS, 0, DRAGON_SILVER), MON("baby shimmering dragon", S_DRAGON, LVL(4, 9, -4, 10, 0), (G_GENO|2), A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(500, 500, 0, MS_ROAR, MZ_HUGE), 0, 0, M1_FLY|M1_THICK_HIDE|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE|M2_STRONG|M2_GREEDY|M2_JEWELS, 0, CLR_CYAN), MON("baby deep dragon", S_DRAGON, LVL(4, 9, 0, 10, 0), (G_GENO|2), A(ATTK(AT_BITE, AD_DRST, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(500, 500, 0, MS_ROAR, MZ_HUGE), 0, 0, M1_FLY|M1_THICK_HIDE|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE|M2_STRONG|M2_GREEDY|M2_JEWELS, 0, CLR_MAGENTA), MON("baby red dragon", S_DRAGON, LVL(4, 9, 2, 10, 0), (G_GENO|2), A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(500, 500, 0, MS_ROAR, MZ_HUGE), MR_FIRE|MR_HITASONE, 0, M1_FLY|M1_THICK_HIDE|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE|M2_STRONG|M2_GREEDY|M2_JEWELS, M3_INFRAVISIBLE, CLR_RED), MON("baby white dragon", S_DRAGON, LVL(4, 9, 2, 10, 0), (G_GENO|2), A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(500, 500, 0, MS_ROAR, MZ_HUGE), MR_COLD|MR_HITASONE, 0, M1_FLY|M1_THICK_HIDE|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE|M2_STRONG|M2_GREEDY|M2_JEWELS, 0, CLR_WHITE), MON("baby orange dragon", S_DRAGON, LVL(4, 9, 2, 10, 0), (G_GENO|2), A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(500, 500, 0, MS_ROAR, MZ_HUGE), MR_SLEEP|MR_HITASONE, 0, M1_FLY|M1_THICK_HIDE|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE|M2_STRONG|M2_GREEDY|M2_JEWELS, 0, CLR_ORANGE), MON("baby black dragon", S_DRAGON, LVL(4, 9, 2, 10, 0), (G_GENO|2), A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(500, 500, 0, MS_ROAR, MZ_HUGE), MR_DISINT|MR_HITASONE, 0, M1_FLY|M1_THICK_HIDE|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE|M2_STRONG|M2_GREEDY|M2_JEWELS, 0, CLR_BLACK), MON("baby blue dragon", S_DRAGON, LVL(4, 9, 2, 10, 0), (G_GENO|2), A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(500, 500, 0, MS_ROAR, MZ_HUGE), MR_ELEC|MR_HITASONE, 0, M1_FLY|M1_THICK_HIDE|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE|M2_STRONG|M2_GREEDY|M2_JEWELS, 0, CLR_BLUE), MON("baby green dragon", S_DRAGON, LVL(4, 9, 2, 10, 0), (G_GENO|2), A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(500, 500, 0, MS_ROAR, MZ_HUGE), MR_POISON|MR_HITASONE, 0, M1_FLY|M1_THICK_HIDE|M1_NOHANDS|M1_CARNIVORE|M1_POIS, M2_HOSTILE|M2_STRONG|M2_GREEDY|M2_JEWELS, 0, CLR_GREEN), MON("baby yellow dragon", S_DRAGON, LVL(4, 9, 2, 10, 0), (G_GENO|2), A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(500, 500, 0, MS_ROAR, MZ_HUGE), MR_ACID|MR_STONE|MR_HITASONE, 0, M1_FLY|M1_THICK_HIDE|M1_NOHANDS|M1_CARNIVORE|M1_ACID, M2_HOSTILE|M2_STRONG|M2_GREEDY|M2_JEWELS, 0, CLR_YELLOW), MON("gray dragon", S_DRAGON, LVL(18, 9, -4, 20, 4), (G_GENO|3), A(ATTK(AT_BREA, AD_MAGM, 4, 6), ATTK(AT_BITE, AD_PHYS, 4, 8), ATTK(AT_CLAW, AD_PHYS, 3, 4), ATTK(AT_CLAW, AD_PHYS, 3, 4), NO_ATTK, NO_ATTK), SIZ(WT_DRAGON, 1500, 0, MS_ROAR, MZ_GIGANTIC), MR_HITASTHREE, 0, M1_FLY|M1_THICK_HIDE|M1_NOHANDS|M1_SEE_INVIS|M1_OVIPAROUS| M1_CARNIVORE, M2_HOSTILE|M2_STRONG|M2_NASTY|M2_GREEDY|M2_JEWELS|M2_MAGIC, 0, CLR_GRAY), MON("silver dragon", S_DRAGON, LVL(18, 9, -1, 95, 4), (G_GENO|3), A(ATTK(AT_BREA, AD_COLD, 4, 6), ATTK(AT_BITE, AD_PHYS, 3, 8), ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK), SIZ(WT_DRAGON, 1500, 0, MS_ROAR, MZ_GIGANTIC), MR_COLD, 0, M1_FLY|M1_THICK_HIDE|M1_NOHANDS|M1_SEE_INVIS|M1_OVIPAROUS| M1_CARNIVORE, M2_HOSTILE|M2_STRONG|M2_NASTY|M2_GREEDY|M2_JEWELS|M2_MAGIC, 0, DRAGON_SILVER), MON("shimmering dragon", S_DRAGON, LVL(18, 9, -8, 20, 4), (G_GENO|3), A(ATTK(AT_BREA, AD_MAGM, 4, 6), ATTK(AT_BITE, AD_PHYS, 3, 8), ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK), SIZ(WT_DRAGON, 1500, 0, MS_ROAR, MZ_GIGANTIC), 0, 0, M1_FLY|M1_THICK_HIDE|M1_NOHANDS|M1_SEE_INVIS|M1_OVIPAROUS| M1_CARNIVORE, M2_HOSTILE|M2_STRONG|M2_NASTY|M2_GREEDY|M2_JEWELS|M2_MAGIC, 0, CLR_CYAN), MON("deep dragon", S_DRAGON, LVL(18, 9, -4, 20, -6), (G_GENO|3), A(ATTK(AT_BREA, AD_DRST, 4, 10), ATTK(AT_BITE, AD_DRLI, 4, 8), ATTK(AT_CLAW, AD_PHYS, 3, 4), ATTK(AT_CLAW, AD_PHYS, 3, 4), NO_ATTK, NO_ATTK), SIZ(WT_DRAGON, 1500, 0, MS_ROAR, MZ_GIGANTIC), MR_DRAIN|MR_POISON|MR_HITASTHREE, MR_POISON, M1_FLY|M1_THICK_HIDE|M1_NOHANDS|M1_SEE_INVIS|M1_OVIPAROUS|M1_CARNIVORE| M1_POIS, M2_HOSTILE|M2_STRONG|M2_NASTY|M2_GREEDY|M2_JEWELS|M2_MAGIC, M3_TRAITOR, CLR_MAGENTA), MON("red dragon", S_DRAGON, LVL(18, 9, -4, 20, -4), (G_GENO|3), A(ATTK(AT_BREA, AD_FIRE, 6, 6), ATTK(AT_BITE, AD_PHYS, 4, 8), ATTK(AT_CLAW, AD_PHYS, 3, 4), ATTK(AT_CLAW, AD_PHYS, 3, 4), NO_ATTK, NO_ATTK), SIZ(WT_DRAGON, 1500, 0, MS_ROAR, MZ_GIGANTIC), MR_FIRE|MR_HITASTHREE, MR_FIRE, M1_FLY|M1_THICK_HIDE|M1_NOHANDS|M1_SEE_INVIS|M1_OVIPAROUS| M1_CARNIVORE, M2_HOSTILE|M2_STRONG|M2_NASTY|M2_GREEDY|M2_JEWELS|M2_MAGIC, M3_INFRAVISIBLE|M3_TRAITOR, CLR_RED), MON("white dragon", S_DRAGON, LVL(18, 9, -4, 20, -5), (G_GENO|3), A(ATTK(AT_BREA, AD_COLD, 4, 6), ATTK(AT_BITE, AD_PHYS, 4, 8), ATTK(AT_CLAW, AD_PHYS, 3, 4), ATTK(AT_CLAW, AD_PHYS, 3, 4), NO_ATTK, NO_ATTK), SIZ(WT_DRAGON, 1500, 0, MS_ROAR, MZ_GIGANTIC), MR_COLD|MR_HITASTHREE, MR_COLD, M1_FLY|M1_THICK_HIDE|M1_NOHANDS|M1_SEE_INVIS|M1_OVIPAROUS| M1_CARNIVORE, M2_HOSTILE|M2_STRONG|M2_NASTY|M2_GREEDY|M2_JEWELS|M2_MAGIC, M3_TRAITOR, CLR_WHITE), MON("orange dragon", S_DRAGON, LVL(18, 9, -4, 20, 5), (G_GENO|3), A(ATTK(AT_BREA, AD_SLEE, 4,25), ATTK(AT_BITE, AD_PHYS, 4, 8), ATTK(AT_CLAW, AD_PHYS, 3, 4), ATTK(AT_CLAW, AD_PHYS, 3, 4), NO_ATTK, NO_ATTK), SIZ(WT_DRAGON, 1500, 0, MS_ROAR, MZ_GIGANTIC), MR_SLEEP|MR_HITASTHREE, MR_SLEEP, M1_FLY|M1_THICK_HIDE|M1_NOHANDS|M1_SEE_INVIS|M1_OVIPAROUS| M1_CARNIVORE, M2_HOSTILE|M2_STRONG|M2_NASTY|M2_GREEDY|M2_JEWELS|M2_MAGIC, M3_TRAITOR, CLR_ORANGE), MON("black dragon", S_DRAGON, LVL(18, 9, -4, 20, -6), (G_GENO|3), A(ATTK(AT_BREA, AD_DISN, 4,10), ATTK(AT_BITE, AD_PHYS, 4, 8), ATTK(AT_CLAW, AD_PHYS, 3, 4), ATTK(AT_CLAW, AD_PHYS, 3, 4), NO_ATTK, NO_ATTK), SIZ(WT_DRAGON, 1500, 0, MS_ROAR, MZ_GIGANTIC), MR_DISINT|MR_HITASTHREE, MR_DISINT, M1_FLY|M1_THICK_HIDE|M1_NOHANDS|M1_SEE_INVIS|M1_OVIPAROUS| M1_CARNIVORE, M2_HOSTILE|M2_STRONG|M2_NASTY|M2_GREEDY|M2_JEWELS|M2_MAGIC, M3_TRAITOR, CLR_BLACK), MON("blue dragon", S_DRAGON, LVL(18, 9, -4, 20, -7), (G_GENO|3), A(ATTK(AT_BREA, AD_ELEC, 4, 6), ATTK(AT_BITE, AD_PHYS, 4, 8), ATTK(AT_CLAW, AD_PHYS, 3, 4), ATTK(AT_CLAW, AD_PHYS, 3, 4), NO_ATTK, NO_ATTK), SIZ(WT_DRAGON, 1500, 0, MS_ROAR, MZ_GIGANTIC), MR_ELEC|MR_HITASTHREE, MR_ELEC, M1_FLY|M1_THICK_HIDE|M1_NOHANDS|M1_SEE_INVIS|M1_OVIPAROUS| M1_CARNIVORE, M2_HOSTILE|M2_STRONG|M2_NASTY|M2_GREEDY|M2_JEWELS|M2_MAGIC, M3_TRAITOR, CLR_BLUE), MON("green dragon", S_DRAGON, LVL(18, 9, -4, 20, 6), (G_GENO|3), A(ATTK(AT_BREA, AD_DRST, 4, 6), ATTK(AT_BITE, AD_PHYS, 4, 8), ATTK(AT_CLAW, AD_PHYS, 3, 4), ATTK(AT_CLAW, AD_PHYS, 3, 4), NO_ATTK, NO_ATTK), SIZ(WT_DRAGON, 1500, 0, MS_ROAR, MZ_GIGANTIC), MR_POISON|MR_HITASTHREE, MR_POISON, M1_FLY|M1_THICK_HIDE|M1_NOHANDS|M1_SEE_INVIS|M1_OVIPAROUS| M1_CARNIVORE|M1_POIS, M2_HOSTILE|M2_STRONG|M2_NASTY|M2_GREEDY|M2_JEWELS|M2_MAGIC, 0, CLR_GREEN), MON("yellow dragon", S_DRAGON, LVL(18, 9, -4, 20, 7), (G_GENO|3), A(ATTK(AT_BREA, AD_ACID, 4, 6), ATTK(AT_BITE, AD_PHYS, 4, 8), ATTK(AT_CLAW, AD_PHYS, 3, 4), ATTK(AT_CLAW, AD_PHYS, 3, 4), NO_ATTK, NO_ATTK), SIZ(WT_DRAGON, 1500, 0, MS_ROAR, MZ_GIGANTIC), MR_ACID|MR_STONE|MR_HITASTHREE, MR_STONE, M1_FLY|M1_THICK_HIDE|M1_NOHANDS|M1_SEE_INVIS|M1_OVIPAROUS| M1_CARNIVORE|M1_ACID, M2_HOSTILE|M2_STRONG|M2_NASTY|M2_GREEDY|M2_JEWELS|M2_MAGIC, 0, CLR_YELLOW), MON("wyvern", S_DRAGON, LVL(18, 9, -4, 20, 7), (G_GENO|1), A(ATTK(AT_STNG, AD_DRST, 4, 6), ATTK(AT_BITE, AD_PHYS, 3, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_DRAGON, 500, 0, MS_ROAR, MZ_GIGANTIC), MR_POISON|MR_STONE|MR_HITASTWO, MR_POISON, M1_FLY|M1_THICK_HIDE|M1_NOHANDS|M1_SEE_INVIS|M1_CARNIVORE, M2_HOSTILE|M2_STRONG|M2_NASTY|M2_GREEDY|M2_JEWELS|M2_MAGIC, 0, CLR_BROWN), MON("hydra", S_DRAGON, LVL(26, 9, -4, 20, 7), (G_GENO|1), A(ATTK(AT_BITE, AD_PHYS, 2, 8), ATTK(AT_BITE, AD_PHYS, 2, 8), ATTK(AT_BITE, AD_PHYS, 2, 8), ATTK(AT_BITE, AD_PHYS, 2, 8), ATTK(AT_BITE, AD_PHYS, 2, 8), ATTK(AT_BITE, AD_PHYS, 2, 8)), SIZ(WT_DRAGON, 500, 0, MS_ROAR, MZ_GIGANTIC), MR_POISON|MR_STONE|MR_HITASTWO, MR_POISON, M1_FLY|M1_THICK_HIDE|M1_NOHANDS|M1_SEE_INVIS|M1_CARNIVORE, M2_HOSTILE|M2_STRONG|M2_NASTY|M2_GREEDY|M2_JEWELS|M2_MAGIC, 0, CLR_BRIGHT_GREEN), /* * Elementals */ MON("stalker", S_ELEMENTAL, LVL(8, 12, 3, 0, 0), (G_GENO|3), A(ATTK(AT_CLAW, AD_PHYS, 4, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(900, 400, 0, MS_SILENT, MZ_LARGE), 0, 0, M1_ANIMAL|M1_FLY|M1_SEE_INVIS, M2_WANDER|M2_STALK|M2_HOSTILE|M2_STRONG, M3_INFRAVISION|M3_TRAITOR, CLR_WHITE), MON("air elemental", S_ELEMENTAL, LVL(8, 36, 2, 30, 0), (G_NOHELL|G_NOCORPSE|2), 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, M2_STRONG|M2_NEUTER, 0, CLR_CYAN), MON("fire elemental", S_ELEMENTAL, LVL(8, 12, 2, 30, 0), (G_NOHELL|G_NOCORPSE|2), A(ATTK(AT_CLAW, AD_FIRE, 3, 6), ATTK(AT_NONE, AD_FIRE, 0, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(0, 0, 0, MS_SILENT, MZ_HUGE), MR_FIRE|MR_POISON|MR_STONE, 0, M1_NOEYES|M1_NOLIMBS|M1_NOHEAD|M1_MINDLESS|M1_UNSOLID|M1_FLY|M1_NOTAKE, M2_STRONG|M2_NEUTER, M3_INFRAVISIBLE, CLR_YELLOW), MON("earth elemental", S_ELEMENTAL, LVL(8, 6, 2, 30, 0), (G_NOHELL|G_NOCORPSE|2), A(ATTK(AT_CLAW, AD_PHYS, 4, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(2500, 0, 0, MS_SILENT, MZ_HUGE), MR_FIRE|MR_COLD|MR_POISON|MR_STONE, 0, M1_NOEYES|M1_NOLIMBS|M1_NOHEAD|M1_MINDLESS|M1_BREATHLESS| M1_WALLWALK|M1_THICK_HIDE, M2_STRONG|M2_NEUTER, 0, CLR_BROWN), MON("water elemental", S_ELEMENTAL, LVL(8, 6, 2, 30, 0), (G_NOHELL|G_NOCORPSE|2), A(ATTK(AT_CLAW, AD_PHYS, 5, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(2500, 0, 0, MS_SILENT, MZ_HUGE), MR_POISON|MR_STONE, 0, M1_NOEYES|M1_NOLIMBS|M1_NOHEAD|M1_MINDLESS|M1_AMPHIBIOUS|M1_SWIM, M2_STRONG|M2_NEUTER, 0, CLR_BLUE), /* * Fungi */ MON("lichen", S_FUNGUS, LVL(0, 1, 9, 0, 0), (G_GENO|4), A(ATTK(AT_TUCH, AD_STCK, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(20, 200, 0, MS_SILENT, MZ_SMALL), 0, 0, M1_BREATHLESS|M1_NOEYES|M1_NOLIMBS|M1_NOHEAD|M1_MINDLESS|M1_NOTAKE, M2_HOSTILE|M2_NEUTER, 0, CLR_BRIGHT_GREEN), MON("brown mold", S_FUNGUS, LVL(1, 0, 9, 0, 0), (G_NOHELL|G_GENO|1), A(ATTK(AT_NONE, AD_COLD, 0, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(50, 30, 0, MS_SILENT, MZ_SMALL), MR_COLD|MR_POISON, MR_COLD|MR_POISON, M1_BREATHLESS|M1_NOEYES|M1_NOLIMBS|M1_NOHEAD|M1_MINDLESS|M1_NOTAKE, M2_HOSTILE|M2_NEUTER, 0, CLR_BROWN), MON("yellow mold", S_FUNGUS, LVL(1, 0, 9, 0, 0), (G_NOHELL|G_GENO|2), A(ATTK(AT_NONE, AD_STUN, 0, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(50, 30, 0, MS_SILENT, MZ_SMALL), MR_POISON, MR_POISON, M1_BREATHLESS|M1_NOEYES|M1_NOLIMBS|M1_NOHEAD|M1_MINDLESS|M1_POIS|M1_NOTAKE, M2_HOSTILE|M2_NEUTER, 0, CLR_YELLOW), MON("green mold", S_FUNGUS, LVL(1, 0, 9, 0, 0), (G_NOHELL|G_GENO|1), A(ATTK(AT_NONE, AD_ACID, 0, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(50, 30, 0, MS_SILENT, MZ_SMALL), MR_ACID|MR_STONE, MR_STONE, M1_BREATHLESS|M1_NOEYES|M1_NOLIMBS|M1_NOHEAD|M1_MINDLESS|M1_ACID|M1_NOTAKE, M2_HOSTILE|M2_NEUTER, 0, CLR_GREEN), MON("red mold", S_FUNGUS, LVL(1, 0, 9, 0, 0), (G_NOHELL|G_GENO|1), A(ATTK(AT_NONE, AD_FIRE, 0, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(50, 30, 0, MS_SILENT, MZ_SMALL), MR_FIRE|MR_POISON, MR_FIRE|MR_POISON, M1_BREATHLESS|M1_NOEYES|M1_NOLIMBS|M1_NOHEAD|M1_MINDLESS|M1_NOTAKE, M2_HOSTILE|M2_NEUTER, M3_INFRAVISIBLE, CLR_RED), MON("shrieker", S_FUNGUS, LVL(3, 1, 7, 0, 0), (G_NOHELL|G_GENO|2), A(NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(100, 100, 0, MS_SHRIEK, MZ_SMALL), MR_DEATH|MR_POISON, MR_POISON, M1_BREATHLESS|M1_NOEYES|M1_NOLIMBS|M1_NOHEAD|M1_MINDLESS, M2_HOSTILE|M2_NEUTER, 0, CLR_MAGENTA), MON("violet fungus", S_FUNGUS, LVL(3, 1, 7, 0, 0), (G_NOHELL|G_GENO|2), A(ATTK(AT_TUCH, AD_PHYS, 1, 4), ATTK(AT_TUCH, AD_STCK, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(100, 100, 0, MS_SILENT, MZ_SMALL), MR_POISON, MR_POISON, M1_BREATHLESS|M1_NOEYES|M1_NOLIMBS|M1_NOHEAD|M1_MINDLESS|M1_NOTAKE, M2_HOSTILE|M2_NEUTER, 0, CLR_MAGENTA), MON("disgusting mold", S_FUNGUS, LVL(5, 0, 7, 0, 0), (G_HELL|G_GENO|1), A(ATTK(AT_NONE, AD_DRST, 1, 8), ATTK(AT_NONE, AD_ACID, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(100, 100, 0, MS_SILENT, MZ_SMALL), MR_POISON, MR_POISON, M1_BREATHLESS|M1_NOEYES|M1_NOLIMBS|M1_NOHEAD|M1_MINDLESS| M1_OMNIVORE|M1_NOTAKE, M2_HOSTILE|M2_NEUTER, 0, CLR_CYAN), MON("black mold", S_FUNGUS, LVL(6, 0, 7, 0, 0), (G_HELL|G_GENO|1), A(ATTK(AT_NONE, AD_DRST, 0, 4), ATTK(AT_NONE, AD_ACID, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(100, 100, 0, MS_SILENT, MZ_SMALL), MR_POISON, MR_POISON, M1_BREATHLESS|M1_NOEYES|M1_NOLIMBS|M1_NOHEAD|M1_MINDLESS| M1_OMNIVORE|M1_NOTAKE, M2_HOSTILE|M2_NEUTER, 0, CLR_BLACK), /* * Gnomes */ MON("gnome", S_GNOME, LVL(1, 6, MARM(10,5), 4, 0), (G_NOHELL|G_GENO|G_SGROUP|4), A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(650, 100, 0, MS_ORC, MZ_SMALL), 0, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_GNOME|M2_COLLECT, M3_INFRAVISIBLE|M3_INFRAVISION, CLR_BROWN), MON("gnome thief", S_GNOME, LVL(1, 6, MARM(10,5), 4, 0), (G_GENO|G_NOGEN), A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_TUCH, AD_SITM, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(650, 100, 0, MS_ORC, MZ_SMALL), 0, 0, M1_HUMANOID|M1_OMNIVORE, M2_HOSTILE|M2_COLLECT, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, CLR_BLACK), MON("gnome lord", S_GNOME, LVL(3, 8, MARM(10,4), 4, 0), (G_NOHELL|G_GENO|2), A(ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(700, 120, 0, MS_ORC, MZ_SMALL), 0, 0, M1_HUMANOID|M1_OMNIVORE, M2_GNOME|M2_LORD|M2_MALE|M2_COLLECT, M3_INFRAVISIBLE|M3_INFRAVISION, CLR_BLUE), MON("gnomish wizard", S_GNOME, LVL(3, 10, 4, 10, 0), (G_NOHELL|G_GENO|2), A(ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(700, 120, 0, MS_ORC, MZ_SMALL), 0, 0, M1_HUMANOID|M1_OMNIVORE, M2_GNOME|M2_MAGIC, M3_INFRAVISIBLE|M3_INFRAVISION, HI_ZAP), MON("deep gnome", S_GNOME, LVL(5, 10, MARM(10,2), 20, 0), (G_HELL|G_GENO|1), A(ATTK(AT_WEAP, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(750, 150, 0, MS_ORC, MZ_SMALL), MR_HITASONE, 0, M1_HUMANOID|M1_OMNIVORE|M1_TUNNEL|M1_NEEDPICK, M2_MALE|M2_GREEDY| M2_JEWELS|M2_COLLECT, M3_INFRAVISIBLE|M3_INFRAVISION, CLR_GRAY), MON("gnome warrior", S_GNOME, LVL(5, 10, MARM(10,2), 20, 0), (G_HELL|G_GENO|1), A(ATTK(AT_WEAP, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(750, 150, 0, MS_ORC, MZ_SMALL), MR_HITASONE, 0, M1_HUMANOID|M1_OMNIVORE, M2_MALE|M2_COLLECT, M3_INFRAVISIBLE|M3_INFRAVISION, CLR_RED), MON("Ruggo the Gnome King", S_GNOME, LVL(16, 10, MARM(10,2), 10, -3), (G_UNIQ|1), A(ATTK(AT_WEAP, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(750, 150, 0, MS_ORC, MZ_SMALL), MR_POISON|MR_STONE|MR_HITASONE, 0, M1_HUMANOID|M1_OMNIVORE, M2_PNAME|M2_PRINCE|M2_MALE|M2_COLLECT|M2_GREEDY| M2_STALK|M2_HOSTILE|M2_NASTY|M2_NOPOLY|M2_JEWELS|M2_MAGIC, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, HI_LORD), MON("gnome king", S_GNOME, LVL(5, 10, 10, 20, 0), (G_GENO|1), A(ATTK(AT_WEAP, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(750, 150, 0, MS_ORC, MZ_SMALL), 0, 0, M1_HUMANOID|M1_OMNIVORE, M2_GNOME|M2_PRINCE|M2_MALE|M2_COLLECT, M3_INFRAVISIBLE|M3_INFRAVISION, HI_LORD), /* [Lethe] Gnolls are no longer S_HUMANOID */ MON("gnoll", S_GNOME, LVL(18, 12, 5, 10, -5), (G_GENO|G_HELL|1), A(ATTK(AT_WEAP, AD_PHYS, 3, 6), ATTK(AT_WEAP, AD_PHYS, 3, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1800, 100, 0, MS_ORC, MZ_LARGE), 0, 0, M1_HIDE|M1_HUMANOID|M1_POIS|M1_SEE_INVIS|M1_OMNIVORE, M2_NOPOLY|M2_HOSTILE|M2_COLLECT|M2_MAGIC|M2_GREEDY|M2_JEWELS, M3_INFRAVISION|M3_TRAITOR, CLR_GRAY), MON("gnoll warrior", S_GNOME, LVL(24, 15, 0, 20, -6), (G_GENO|G_HELL|1), A(ATTK(AT_WEAP, AD_PHYS, 3, 6), ATTK(AT_WEAP, AD_PHYS, 3, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1800, 100, 0, MS_ORC, MZ_LARGE), 0, 0, M1_HIDE|M1_HUMANOID|M1_POIS|M1_SEE_INVIS|M1_OMNIVORE, M2_NOPOLY|M2_HOSTILE|M2_COLLECT|M2_MAGIC|M2_GREEDY|M2_JEWELS, M3_INFRAVISION|M3_TRAITOR, CLR_WHITE), MON("gnoll chieftain", S_GNOME, LVL(30, 18, -5, 40, -8), (G_GENO|G_HELL|1), A(ATTK(AT_WEAP, AD_PHYS, 3, 6), ATTK(AT_WEAP, AD_PHYS, 3, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1800, 100, 0, MS_ORC, MZ_LARGE), 0, 0, M1_HIDE|M1_HUMANOID|M1_POIS|M1_SEE_INVIS|M1_OMNIVORE, M2_NOPOLY|M2_HOSTILE|M2_COLLECT|M2_MAGIC|M2_GREEDY|M2_JEWELS, M3_INFRAVISION|M3_TRAITOR, CLR_MAGENTA), MON("gnoll shaman", S_GNOME, LVL(18, 15, 0, 60, -10), (G_GENO|G_HELL|1), A(ATTK(AT_MAGC, AD_SPEL, 0, 0), ATTK(AT_MAGC, AD_CLRC, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1800, 100, 0, MS_ORC, MZ_LARGE), 0, 0, M1_HIDE|M1_HUMANOID|M1_POIS|M1_SEE_INVIS|M1_OMNIVORE, M2_NOPOLY|M2_HOSTILE|M2_COLLECT|M2_MAGIC|M2_GREEDY|M2_JEWELS, M3_INFRAVISION|M3_TRAITOR, CLR_YELLOW), #ifdef SPLITMON_1 }; #endif #endif /* !SPLITMON_2 */ /* horrible kludge alert: * This is a compiler-specific kludge to allow the compilation of monst.o in * two pieces, by defining first SPLITMON_1 and then SPLITMON_2. The * resulting assembler files (monst1.s and monst2.s) are then run through * sed to change local symbols, concatenated together, and assembled to * produce monst.o. THIS ONLY WORKS WITH THE ATARI GCC, and should only * be done if you don't have enough memory to compile monst.o the "normal" * way. --ERS */ #ifndef SPLITMON_1 #ifdef SPLITMON_2 struct permonst _mons2[] = { #endif /* * giant Humanoids */ MON("giant", S_GIANT, LVL(6, 6, 0, 0, 2), (G_NOHELL|G_GENO|G_NOGEN), A(ATTK(AT_WEAP, AD_PHYS, 2,10), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(2250, 750, 0, MS_BOAST, MZ_HUGE), MR_HITASONE, 0, M1_HUMANOID|M1_CARNIVORE, M2_GIANT|M2_STRONG|M2_ROCKTHROW|M2_NASTY|M2_COLLECT|M2_JEWELS, M3_INFRAVISIBLE|M3_INFRAVISION, CLR_RED), MON("stone giant", S_GIANT, LVL(6, 6, 0, 0, 2), (G_NOHELL|G_GENO|G_SGROUP|2), A(ATTK(AT_WEAP, AD_PHYS, 2,10), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(2250, 750, 0, MS_BOAST, MZ_HUGE), MR_HITASTWO, 0, M1_HUMANOID|M1_CARNIVORE, M2_GIANT|M2_STRONG|M2_ROCKTHROW|M2_NASTY|M2_COLLECT|M2_JEWELS, M3_INFRAVISIBLE|M3_INFRAVISION, CLR_GRAY), MON("hill giant", S_GIANT, LVL(8, 10, 6, 0, -2), (G_NOHELL|G_GENO|G_SGROUP|2), A(ATTK(AT_WEAP, AD_PHYS, 2, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(2200, 700, 0, MS_BOAST, MZ_HUGE), MR_HITASTWO, 0, M1_HUMANOID|M1_CARNIVORE, M2_GIANT|M2_STRONG|M2_ROCKTHROW|M2_NASTY|M2_COLLECT|M2_JEWELS, M3_INFRAVISIBLE|M3_INFRAVISION, CLR_CYAN), MON("fire giant", S_GIANT, LVL(9, 12, 4, 5, 2), (G_GENO|G_SGROUP|2), A(ATTK(AT_WEAP, AD_PHYS, 2,10), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(2250, 750, 0, MS_BOAST, MZ_HUGE), MR_FIRE|MR_HITASTWO, MR_FIRE, M1_HUMANOID|M1_CARNIVORE, M2_GIANT|M2_STRONG|M2_ROCKTHROW|M2_NASTY|M2_COLLECT|M2_JEWELS, M3_INFRAVISIBLE|M3_INFRAVISION, CLR_YELLOW), MON("frost giant", S_GIANT, LVL(10, 12, 3, 10, -3), (G_NOHELL|G_GENO|G_SGROUP|1), A(ATTK(AT_WEAP, AD_PHYS, 2,12), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(2250, 750, 0, MS_BOAST, MZ_HUGE), MR_COLD|MR_HITASTWO, MR_COLD, M1_HUMANOID|M1_CARNIVORE, M2_GIANT|M2_STRONG|M2_ROCKTHROW|M2_NASTY|M2_COLLECT|M2_JEWELS, M3_INFRAVISIBLE|M3_INFRAVISION, CLR_WHITE), MON("ettin", S_GIANT, LVL(10, 12, 3, 0, 0), (G_NOHELL|G_GENO|1), A(ATTK(AT_WEAP, AD_PHYS, 2, 8), ATTK(AT_WEAP, AD_PHYS, 3, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1700, 500, 0, MS_GRUNT, MZ_HUGE), MR_HITASTWO, 0, M1_ANIMAL|M1_HUMANOID|M1_CARNIVORE, M2_HOSTILE|M2_STRONG|M2_NASTY|M2_COLLECT, M3_INFRAVISIBLE|M3_INFRAVISION, CLR_BROWN), MON("titan", S_GIANT, LVL(16, 18, -3, 70, 9), (G_NOHELL|G_GENO|1), A(ATTK(AT_WEAP, AD_PHYS, 2, 8), ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(2300, 900, 0, MS_SPELL, MZ_HUGE), MR_DEATH, 0, M1_FLY|M1_HUMANOID|M1_OMNIVORE, M2_STRONG|M2_ROCKTHROW|M2_NASTY|M2_COLLECT|M2_MAGIC, M3_INFRAVISIBLE|M3_INFRAVISION, CLR_MAGENTA), MON("storm giant", S_GIANT, LVL(16, 12, 3, 10, -3), (G_GENO|G_SGROUP|1), A(ATTK(AT_WEAP, AD_PHYS, 2, 12), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(2250, 750, 0, MS_BOAST, MZ_HUGE), MR_ELEC, MR_ELEC, M1_HUMANOID|M1_CARNIVORE, M2_GIANT|M2_STRONG|M2_ROCKTHROW|M2_NASTY|M2_COLLECT|M2_JEWELS, M3_INFRAVISIBLE|M3_INFRAVISION, CLR_BLUE), MON("minotaur", S_GIANT, LVL(15, 15, 6, 0, 0), (G_GENO|G_NOGEN), A(ATTK(AT_CLAW, AD_PHYS, 3,10), ATTK(AT_CLAW, AD_PHYS, 3,10), ATTK(AT_BUTT, AD_PHYS, 2, 8), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1500, 700, 0, MS_SILENT, MZ_LARGE), MR_DEATH|MR_HITASTWO, 0, M1_ANIMAL|M1_HUMANOID|M1_CARNIVORE,M2_MALE|M2_HOSTILE|M2_STRONG| M2_NASTY, M3_INFRAVISIBLE|M3_INFRAVISION,CLR_BROWN), MON("the Largest Giant", S_GIANT, LVL(26, 12, 0, 15, -3), (G_UNIQ|1), A(ATTK(AT_WEAP, AD_PHYS, 3, 10), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(2250, 750, 0, MS_SILENT, MZ_HUGE), MR_FIRE|MR_HITASTHREE| MR_POISON|MR_STONE, MR_FIRE, M1_HUMANOID|M1_CARNIVORE, M2_PNAME|M2_PRINCE|M2_MALE|M2_STALK|M2_HOSTILE| M2_GIANT|M2_STRONG|M2_ROCKTHROW|M2_NASTY|M2_COLLECT| M2_NOPOLY|M2_MAGIC|M2_JEWELS, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, HI_LORD), MON("Father Dagon", S_GIANT, LVL(100, 15, -10, 90, -10), (G_UNIQ|G_NOGEN), A(ATTK(AT_CLAW, AD_PHYS, 8, 10), ATTK(AT_CLAW, AD_PHYS, 8, 10), ATTK(AT_BITE, AD_PHYS, 6, 6), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(5000, 500, 0, MS_GURGLE, MZ_GIGANTIC), MR_COLD|MR_POISON, MR_POISON, M1_SWIM|M1_AMPHIBIOUS|M1_HUMANOID|M1_OMNIVORE|M1_POIS|M1_THICK_HIDE, M2_NOPOLY|M2_HOSTILE|M2_STALK|M2_GREEDY|M2_JEWELS|M2_COLLECT|M2_MINION|M2_STRONG|M2_ROCKTHROW|M2_PNAME|M2_MALE, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR|M3_NOTAME, CLR_GREEN), MON("Mother Hydra", S_GIANT, LVL(102, 18, -12, 90, -10), (G_UNIQ|G_NOGEN), A(ATTK(AT_CLAW, AD_PHYS, 8, 12), ATTK(AT_CLAW, AD_PHYS, 8, 10), ATTK(AT_BITE, AD_PHYS, 6, 8), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(5000, 500, 0, MS_GURGLE, MZ_GIGANTIC), MR_COLD|MR_POISON, MR_POISON, M1_SWIM|M1_AMPHIBIOUS|M1_HUMANOID|M1_OMNIVORE|M1_POIS|M1_THICK_HIDE, M2_NOPOLY|M2_HOSTILE|M2_STALK|M2_GREEDY|M2_JEWELS|M2_COLLECT|M2_MINION|M2_STRONG|M2_ROCKTHROW|M2_PNAME|M2_FEMALE, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR|M3_NOTAME, CLR_GREEN), /* 'I' is a visual marker for all invisible monsters and must be unused */ /* * Jabberwock */ MON("jabberwock", S_JABBERWOCK, LVL(15, 12, -2, 50, 0), (G_NOHELL|G_GENO|1), A(ATTK(AT_BITE, AD_PHYS, 2,10), ATTK(AT_BITE, AD_PHYS, 2,10), ATTK(AT_CLAW, AD_PHYS, 2,10), ATTK(AT_CLAW, AD_PHYS, 2,10), NO_ATTK, NO_ATTK), SIZ(1300, 600, 0, MS_BURBLE, MZ_LARGE), MR_HITASONE, 0, M1_ANIMAL|M1_FLY|M1_CARNIVORE, M2_HOSTILE|M2_STRONG|M2_NASTY|M2_COLLECT, M3_INFRAVISIBLE, CLR_ORANGE), MON("vorpal jabberwock", S_JABBERWOCK, LVL(20, 12, -2, 50, 0), (G_NOHELL|G_GENO|1), A(ATTK(AT_BITE, AD_PHYS, 3, 10), ATTK(AT_BITE, AD_PHYS, 3, 10), ATTK(AT_CLAW, AD_PHYS, 3, 10), ATTK(AT_CLAW, AD_PHYS, 3, 10), NO_ATTK, NO_ATTK), SIZ(1300, 600, 0, MS_BURBLE, MZ_LARGE), MR_HITASTHREE, 0, M1_ANIMAL|M1_FLY|M1_CARNIVORE, M2_HOSTILE|M2_STRONG|M2_NASTY|M2_COLLECT, M3_INFRAVISIBLE, HI_LORD), #ifdef KOPS /* * Kops */ MON("Keystone Kop", S_KOP, LVL(1, 6, MARM(10,7), 10, 9), (G_GENO|G_LGROUP|G_NOGEN), A(ATTK(AT_WEAP, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 200, 0, MS_ARREST, MZ_HUMAN), 0, 0, M1_HUMANOID, M2_HUMAN|M2_WANDER|M2_HOSTILE|M2_MALE|M2_COLLECT, M3_INFRAVISIBLE, CLR_BLUE), MON("Kop Sergeant", S_KOP, LVL(2, 8, MARM(10,6), 10, 10), (G_GENO|G_SGROUP|G_NOGEN), A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 200, 0, MS_ARREST, MZ_HUMAN), 0, 0, M1_HUMANOID, M2_HUMAN|M2_WANDER|M2_HOSTILE|M2_STRONG|M2_MALE|M2_COLLECT, M3_INFRAVISIBLE, CLR_BLUE), MON("Kop Lieutenant", S_KOP, LVL(3, 10, MARM(10,5), 20, 11), (G_GENO|G_NOGEN), A(ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 200, 0, MS_ARREST, MZ_HUMAN), 0, 0, M1_HUMANOID, M2_HUMAN|M2_WANDER|M2_HOSTILE|M2_STRONG|M2_MALE|M2_COLLECT, M3_INFRAVISIBLE, CLR_CYAN), MON("Kop Kaptain", S_KOP, LVL(4, 12, MARM(10,4), 20, 12), (G_GENO|G_NOGEN), A(ATTK(AT_WEAP, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 200, 0, MS_ARREST, MZ_HUMAN), 0, 0, M1_HUMANOID, M2_HUMAN|M2_WANDER|M2_HOSTILE|M2_STRONG|M2_MALE|M2_COLLECT, M3_INFRAVISIBLE, HI_LORD), #endif /* * Liches */ MON("lich", S_LICH, LVL(11, 6, 0, 30, -9), (G_GENO|G_NOCORPSE|1), A(ATTK(AT_TUCH, AD_COLD, 1,10), ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1200, 100, 0, MS_MUMBLE, MZ_HUMAN), MR_COLD|MR_SLEEP|MR_POISON|MR_PLUSTWO, MR_COLD, M1_BREATHLESS|M1_HUMANOID|M1_POIS|M1_REGEN, M2_UNDEAD|M2_HOSTILE|M2_MAGIC, M3_INFRAVISION|M3_TRAITOR, CLR_BROWN), MON("demilich", S_LICH, LVL(14, 9, -2, 60, -12), (G_GENO|G_NOCORPSE|1), A(ATTK(AT_TUCH, AD_COLD, 3, 4), ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1200, 100, 0, MS_MUMBLE, MZ_HUMAN), MR_COLD|MR_SLEEP|MR_POISON|MR_PLUSTHREE, MR_COLD, M1_BREATHLESS|M1_HUMANOID|M1_POIS|M1_REGEN, M2_UNDEAD|M2_HOSTILE|M2_MAGIC, M3_INFRAVISION|M3_TRAITOR, CLR_RED), MON("master lich", S_LICH, LVL(17, 9, -4, 90, -15), (G_HELL|G_GENO|G_NOCORPSE|1), A(ATTK(AT_TUCH, AD_COLD, 3, 6), ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1200, 100, 0, MS_MUMBLE, MZ_HUMAN), MR_FIRE|MR_COLD|MR_SLEEP|MR_POISON|MR_PLUSTHREE, MR_FIRE|MR_COLD, M1_BREATHLESS|M1_HUMANOID|M1_POIS|M1_REGEN, M2_UNDEAD|M2_HOSTILE|M2_MAGIC, M3_WANTSBOOK|M3_TRAITOR, HI_LORD), MON("arch-lich", S_LICH, LVL(25, 9, -6, 90, -15), (G_HELL|G_GENO|G_NOCORPSE|1), A(ATTK(AT_TUCH, AD_COLD, 5, 6), ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1200, 100, 0, MS_MUMBLE, MZ_HUMAN), MR_FIRE|MR_COLD|MR_SLEEP|MR_ELEC|MR_POISON|MR_PLUSTHREE, MR_FIRE|MR_COLD, M1_BREATHLESS|M1_HUMANOID|M1_POIS|M1_REGEN, M2_UNDEAD|M2_HOSTILE|M2_MAGIC, M3_WANTSBOOK|M3_INFRAVISION|M3_TRAITOR, HI_LORD), /* * Mummies */ MON("kobold mummy", S_MUMMY, LVL(3, 8, 6, 20, -2), (G_GENO|G_NOCORPSE|1), A(ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(400, 50, 0, MS_SILENT, MZ_SMALL), MR_COLD|MR_SLEEP|MR_POISON, 0, M1_BREATHLESS|M1_MINDLESS|M1_HUMANOID|M1_POIS, M2_UNDEAD|M2_HOSTILE, M3_INFRAVISION, CLR_BROWN), MON("gnome mummy", S_MUMMY, LVL(4, 10, 6, 20, -3), (G_GENO|G_NOCORPSE|1), A(ATTK(AT_CLAW, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(650, 50, 0, MS_SILENT, MZ_SMALL), MR_COLD|MR_SLEEP|MR_POISON, 0, M1_BREATHLESS|M1_MINDLESS|M1_HUMANOID|M1_POIS, M2_UNDEAD|M2_HOSTILE|M2_GNOME, M3_INFRAVISION, CLR_RED), MON("orc mummy", S_MUMMY, LVL(5, 10, 5, 20, -4), (G_GENO|G_NOCORPSE|1), A(ATTK(AT_CLAW, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(850, 75, 0, MS_SILENT, MZ_HUMAN), MR_COLD|MR_SLEEP|MR_POISON, 0, M1_BREATHLESS|M1_MINDLESS|M1_HUMANOID|M1_POIS, M2_UNDEAD|M2_HOSTILE|M2_ORC|M2_GREEDY|M2_JEWELS, M3_INFRAVISION, CLR_GRAY), MON("dwarf mummy", S_MUMMY, LVL(5, 10, 5, 20, -4), (G_GENO|G_NOCORPSE|1), A(ATTK(AT_CLAW, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(900, 150, 0, MS_SILENT, MZ_HUMAN), MR_COLD|MR_SLEEP|MR_POISON, 0, M1_BREATHLESS|M1_MINDLESS|M1_HUMANOID|M1_POIS, M2_UNDEAD|M2_HOSTILE|M2_DWARF|M2_GREEDY|M2_JEWELS, M3_INFRAVISION, CLR_RED), MON("elf mummy", S_MUMMY, LVL(6, 12, 4, 30, 5), (G_GENO|G_NOCORPSE|1), A(ATTK(AT_CLAW, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_ELF, 175, 0, MS_SILENT, MZ_HUMAN), MR_COLD|MR_SLEEP|MR_POISON, 0, M1_BREATHLESS|M1_MINDLESS|M1_HUMANOID|M1_POIS, M2_UNDEAD|M2_HOSTILE|M2_ELF, M3_INFRAVISION, CLR_GREEN), MON("human mummy", S_MUMMY, LVL(6, 12, 4, 30, -5), (G_GENO|G_NOCORPSE|1), A(ATTK(AT_CLAW, AD_PHYS, 2, 4), ATTK(AT_CLAW, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 200, 0, MS_SILENT, MZ_HUMAN), MR_COLD|MR_SLEEP|MR_POISON, 0, M1_BREATHLESS|M1_MINDLESS|M1_HUMANOID|M1_POIS, M2_UNDEAD|M2_HOSTILE, M3_INFRAVISION, CLR_GRAY), MON("ettin mummy", S_MUMMY, LVL(7, 12, 4, 30, -6), (G_GENO|G_NOCORPSE|1), A(ATTK(AT_CLAW, AD_PHYS, 2, 6), ATTK(AT_CLAW, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1700, 250, 0, MS_SILENT, MZ_HUGE), MR_COLD|MR_SLEEP|MR_POISON, 0, M1_BREATHLESS|M1_MINDLESS|M1_HUMANOID|M1_POIS, M2_UNDEAD|M2_HOSTILE|M2_STRONG, M3_INFRAVISION, CLR_BLUE), MON("giant mummy", S_MUMMY, LVL(8, 14, 3, 30, -7), (G_GENO|G_NOCORPSE|1), A(ATTK(AT_CLAW, AD_PHYS, 3, 4), ATTK(AT_CLAW, AD_PHYS, 3, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(2050, 375, 0, MS_SILENT, MZ_HUGE), MR_COLD|MR_SLEEP|MR_POISON, 0, M1_BREATHLESS|M1_MINDLESS|M1_HUMANOID|M1_POIS, M2_UNDEAD|M2_HOSTILE|M2_GIANT|M2_STRONG|M2_JEWELS, M3_INFRAVISION, CLR_CYAN), MON("troll mummy", S_MUMMY, LVL(9, 14, 3, 30, -8), (G_GENO|G_NOCORPSE|1), A(ATTK(AT_CLAW, AD_PHYS, 3, 4), ATTK(AT_CLAW, AD_PHYS, 3, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1500, 375, 0, MS_SILENT, MZ_HUGE), MR_COLD|MR_SLEEP|MR_POISON, 0, M1_BREATHLESS|M1_MINDLESS|M1_HUMANOID|M1_POIS, M2_UNDEAD|M2_HOSTILE|M2_GIANT|M2_STRONG|M2_JEWELS, 0, CLR_BROWN), /* * Nagas */ MON("red naga hatchling", S_NAGA, LVL(3, 10, 6, 0, 0), G_GENO, A(ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(500, 100, 0, MS_MUMBLE, MZ_LARGE), MR_FIRE|MR_POISON, MR_FIRE|MR_POISON, M1_NOLIMBS|M1_SLITHY|M1_THICK_HIDE|M1_NOTAKE|M1_OMNIVORE, M2_STRONG, M3_INFRAVISIBLE, CLR_RED), MON("black naga hatchling", S_NAGA, LVL(3, 10, 6, 0, 0), G_GENO, A(ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(500, 100, 0, MS_MUMBLE, MZ_LARGE), MR_POISON|MR_ACID|MR_STONE, MR_POISON|MR_STONE, M1_NOLIMBS|M1_SLITHY|M1_THICK_HIDE|M1_ACID|M1_NOTAKE|M1_CARNIVORE, M2_STRONG, 0, CLR_BLACK), MON("golden naga hatchling", S_NAGA, LVL(3, 10, 6, 0, 0), G_GENO, A(ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(500, 100, 0, MS_MUMBLE, MZ_LARGE), MR_POISON, MR_POISON, M1_NOLIMBS|M1_SLITHY|M1_THICK_HIDE|M1_NOTAKE|M1_OMNIVORE, M2_STRONG, 0, HI_GOLD), MON("guardian naga hatchling", S_NAGA, LVL(3, 10, 6, 0, 0), G_GENO, A(ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(500, 100, 0, MS_MUMBLE, MZ_LARGE), MR_POISON, MR_POISON, M1_NOLIMBS|M1_SLITHY|M1_THICK_HIDE|M1_NOTAKE|M1_OMNIVORE, M2_STRONG, 0, CLR_GREEN), MON("red naga", S_NAGA, LVL(6, 12, 4, 0, -4), (G_NOHELL|G_GENO|1), A(ATTK(AT_BITE, AD_PHYS, 2, 4), ATTK(AT_BREA, AD_FIRE, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(2600, 400, 0, MS_MUMBLE, MZ_HUGE), MR_FIRE|MR_POISON, MR_FIRE|MR_POISON, M1_NOLIMBS|M1_SLITHY|M1_THICK_HIDE|M1_OVIPAROUS|M1_NOTAKE|M1_OMNIVORE, M2_STRONG, M3_INFRAVISIBLE, CLR_RED), MON("black naga", S_NAGA, LVL(8, 14, 2, 10, 4), (G_NOHELL|G_GENO|1), A(ATTK(AT_BITE, AD_PHYS, 2, 6), ATTK(AT_SPIT, AD_ACID, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(2600, 400, 0, MS_MUMBLE, MZ_HUGE), MR_POISON|MR_ACID|MR_STONE, MR_POISON|MR_STONE, M1_NOLIMBS|M1_SLITHY|M1_THICK_HIDE|M1_OVIPAROUS|M1_ACID|M1_NOTAKE| M1_CARNIVORE, M2_STRONG, 0, CLR_BLACK), MON("golden naga", S_NAGA, LVL(10, 14, 2, 70, 5), (G_NOHELL|G_GENO|1), A(ATTK(AT_BITE, AD_PHYS, 2, 6), ATTK(AT_MAGC, AD_SPEL, 4, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(2600, 400, 0, MS_MUMBLE, MZ_HUGE), MR_POISON|MR_HITASONE, MR_POISON, M1_NOLIMBS|M1_SLITHY|M1_THICK_HIDE|M1_OVIPAROUS|M1_NOTAKE|M1_OMNIVORE, M2_STRONG, 0, HI_GOLD), MON("guardian naga", S_NAGA, LVL(12, 16, 0, 50, 7), (G_NOHELL|G_GENO|1), A(ATTK(AT_BITE, AD_PLYS, 1, 6), ATTK(AT_SPIT, AD_DRST, 1, 6), ATTK(AT_HUGS, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(2600, 400, 0, MS_MUMBLE, MZ_HUGE), MR_POISON|MR_HITASONE, MR_POISON, M1_NOLIMBS|M1_SLITHY|M1_THICK_HIDE|M1_OVIPAROUS|M1_POIS|M1_NOTAKE| M1_OMNIVORE, M2_STRONG, 0, CLR_GREEN), /* * Ogres */ MON("ogre", S_OGRE, LVL(5, 10, 5, 0, -3), (G_NOHELL|G_SGROUP|G_GENO|2), A(ATTK(AT_WEAP, AD_PHYS, 2, 5), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1600, 500, 0, MS_GRUNT, MZ_LARGE), 0, 0, M1_HUMANOID|M1_CARNIVORE, M2_STRONG|M2_GREEDY|M2_JEWELS|M2_COLLECT, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, CLR_BROWN), MON("ogre lord", S_OGRE, LVL(7, 12, 3, 30, -5), (G_NOHELL|G_GENO|1), A(ATTK(AT_WEAP, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1700, 700, 0, MS_GRUNT, MZ_LARGE), 0, 0, M1_HUMANOID|M1_CARNIVORE, M2_STRONG|M2_LORD|M2_MALE|M2_GREEDY|M2_JEWELS|M2_COLLECT, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, CLR_RED), MON("ogre mage", S_OGRE, LVL(7, 12, 3, 30, -5), (G_NOHELL|G_GENO), A(ATTK(AT_WEAP, AD_PHYS, 2, 6), ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1700, 700, 0, MS_GRUNT, MZ_LARGE), 0, 0, M1_HUMANOID|M1_CARNIVORE, M2_STRONG|M2_LORD|M2_MALE|M2_GREEDY|M2_JEWELS|M2_COLLECT, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, HI_ZAP), MON("ogre king", S_OGRE, LVL(9, 14, 4, 60, -7), (G_GENO|2), A(ATTK(AT_WEAP, AD_PHYS, 3, 5), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1700, 750, 0, MS_GRUNT, MZ_LARGE), MR_HITASONE, 0, M1_HUMANOID|M1_CARNIVORE, M2_STRONG|M2_PRINCE|M2_MALE|M2_GREEDY|M2_JEWELS|M2_COLLECT, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, HI_LORD), MON("shadow ogre", S_OGRE, LVL(10, 14, 0, 60, -7), (G_HELL|G_GENO), A(ATTK(AT_WEAP, AD_PHYS, 3, 5), ATTK(AT_TUCH, AD_DRLI, 3, 5), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1700, 750, 0, MS_GRUNT, MZ_LARGE), MR_PLUSONE, 0, M1_HUMANOID|M1_CARNIVORE, M2_STRONG|M2_PRINCE|M2_MALE|M2_GREEDY|M2_JEWELS|M2_COLLECT, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, CLR_BLACK), /* * Puddings */ MON("gray ooze", S_PUDDING, LVL(3, 1, 8, 0, 0), (G_NOHELL|G_GENO|3), A(ATTK(AT_BITE, AD_RUST, 2, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(500, 250, 0, MS_SILENT, MZ_MEDIUM), MR_DEATH|MR_FIRE|MR_COLD|MR_POISON|MR_ACID|MR_STONE, MR_FIRE|MR_COLD|MR_POISON, M1_BREATHLESS|M1_AMORPHOUS|M1_NOEYES|M1_NOLIMBS|M1_NOHEAD| M1_MINDLESS|M1_OMNIVORE|M1_ACID, M2_HOSTILE|M2_NEUTER, 0, CLR_GRAY), MON("brown pudding", S_PUDDING, LVL(5, 3, 8, 0, 0), (G_NOHELL|G_GENO|1), A(ATTK(AT_BITE, AD_DCAY, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(500, 250, 0, MS_SILENT, MZ_MEDIUM), MR_DEATH|MR_COLD|MR_ELEC|MR_POISON|MR_ACID|MR_STONE|MR_HITASONE, MR_COLD|MR_ELEC|MR_POISON, M1_BREATHLESS|M1_AMORPHOUS|M1_NOEYES|M1_NOLIMBS|M1_NOHEAD| M1_MINDLESS|M1_OMNIVORE|M1_ACID, M2_HOSTILE|M2_NEUTER, 0, CLR_BROWN), MON("moldy pudding", S_PUDDING, LVL(8, 3, 8, 0, 0), (G_NOHELL|G_GENO), A(ATTK(AT_ENGL, AD_DCAY, 4, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(500, 250, 0, MS_SILENT, MZ_MEDIUM), MR_DEATH|MR_COLD|MR_ELEC|MR_POISON|MR_ACID|MR_STONE|MR_HITASONE, MR_COLD|MR_ELEC|MR_POISON, M1_BREATHLESS|M1_AMORPHOUS|M1_NOEYES|M1_NOLIMBS|M1_NOHEAD| M1_MINDLESS|M1_OMNIVORE|M1_ACID, M2_HOSTILE|M2_NEUTER, 0, CLR_GREEN), MON("black pudding", S_PUDDING, LVL(10, 6, 6, 0, 0), (G_NOHELL|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_DEATH|MR_COLD|MR_ELEC|MR_POISON|MR_ACID|MR_STONE|MR_HITASTWO, MR_COLD|MR_ELEC|MR_POISON, M1_BREATHLESS|M1_AMORPHOUS|M1_NOEYES|M1_NOLIMBS|M1_NOHEAD| M1_MINDLESS|M1_OMNIVORE|M1_ACID, M2_HOSTILE|M2_NEUTER, 0, CLR_BLACK), MON("green slime", S_PUDDING, LVL(6, 6, 6, 0, 0), (G_HELL|G_GENO|1), A(ATTK(AT_TUCH, AD_SLIM, 1, 4), ATTK(AT_NONE, AD_SLIM, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(400, 150, 0, MS_SILENT, MZ_LARGE), MR_COLD|MR_ELEC|MR_POISON|MR_ACID|MR_STONE, 0, M1_BREATHLESS|M1_AMORPHOUS|M1_NOEYES|M1_NOLIMBS|M1_NOHEAD| M1_MINDLESS|M1_OMNIVORE|M1_ACID|M1_POIS, M2_HOSTILE|M2_NEUTER, 0, CLR_GREEN), MON("shoggoth", S_PUDDING, LVL(18, 15, -5, 25, -5), (G_GENO|1), A(ATTK(AT_CLAW, AD_PHYS, 4, 8), ATTK(AT_TUCH, AD_CORR, 0, 0), ATTK(AT_NONE, AD_CORR, 0, 0), ATTK(AT_ENGL, AD_ACID, 4, 8), NO_ATTK, NO_ATTK), SIZ(2500, 500, 0, MS_SILENT, MZ_LARGE), MR_COLD|MR_ELEC|MR_POISON|MR_ACID|MR_STONE, MR_COLD|MR_ELEC|MR_POISON, M1_BREATHLESS|M1_AMORPHOUS|M1_NOEYES|M1_NOLIMBS|M1_NOHEAD |M1_OMNIVORE|M1_ACID|M1_HIDE|M1_REGEN|M1_METALLIVORE, M2_HOSTILE|M2_NEUTER|M2_STALK|M2_NASTY|M2_STRONG|M2_COLLECT|M2_MAGIC, M3_INFRAVISION|M3_TRAITOR, CLR_BLACK), MON("giant shoggoth", S_PUDDING, LVL(36, 20, -10, 50, -10), (G_GENO|1), A(ATTK(AT_CLAW, AD_PHYS, 5, 10), ATTK(AT_CLAW, AD_PHYS, 5, 10), ATTK(AT_TUCH, AD_CORR, 0, 0), ATTK(AT_TUCH, AD_CORR, 0, 0), ATTK(AT_NONE, AD_CORR, 0, 0), ATTK(AT_ENGL, AD_ACID, 8, 10) ), SIZ(2500, 500, 0, MS_SILENT, MZ_LARGE), MR_COLD|MR_ELEC|MR_POISON|MR_ACID|MR_STONE, MR_COLD|MR_ELEC|MR_POISON, M1_BREATHLESS|M1_AMORPHOUS|M1_NOEYES|M1_NOLIMBS|M1_NOHEAD|M1_TPORT |M1_OMNIVORE|M1_ACID|M1_HIDE|M1_REGEN|M1_METALLIVORE|M1_TPORT_CNTRL, M2_HOSTILE|M2_NEUTER|M2_STALK|M2_NASTY|M2_STRONG|M2_COLLECT|M2_MAGIC, M3_INFRAVISION|M3_TRAITOR, CLR_BLACK), /* * Quantum mechanics */ MON("quantum mechanic", S_QUANTMECH, LVL(7, 12, 3, 10, 0), (G_NOHELL|G_GENO|2), A(ATTK(AT_CLAW, AD_TLPT, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 20, 0, MS_HUMANOID, MZ_HUMAN), MR_POISON|MR_HITASONE, 0, M1_HUMANOID|M1_OMNIVORE|M1_POIS|M1_TPORT, M2_HOSTILE, M3_INFRAVISIBLE, CLR_CYAN), MON("genetic engineer", S_QUANTMECH, LVL(12, 12, 3, 10, 0), (G_HELL|G_GENO|1), A(ATTK(AT_CLAW, AD_POLY, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 20, 0, MS_HUMANOID, MZ_HUMAN), MR_POISON, 0, M1_HUMANOID|M1_OMNIVORE|M1_POIS|M1_TPORT, M2_HOSTILE, M3_INFRAVISIBLE, CLR_GREEN), MON("Doctor Frankenstein", S_QUANTMECH, LVL(20, 12, -10, 75, 0), (G_NOGEN|G_UNIQ), A(ATTK(AT_WEAP, AD_PHYS, 4, 4), ATTK(AT_CLAW, AD_TLPT, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 20, 0, MS_HUMANOID, MZ_HUMAN), MR_POISON|MR_ELEC|MR_SLEEP, 0, M1_HUMANOID|M1_OMNIVORE|M1_POIS|M1_TPORT, M2_HOSTILE|M2_NOPOLY|M2_MALE|M2_PNAME, M3_INFRAVISIBLE|M3_NOTAME, HI_LORD), /* * Rust monster or disenchanter */ MON("rust monster", S_RUSTMONST, LVL(5, 18, 2, 0, 0), (G_NOHELL|G_GENO|2), A(ATTK(AT_TUCH, AD_RUST, 0, 0), ATTK(AT_TUCH, AD_RUST, 0, 0), ATTK(AT_NONE, AD_RUST, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1000, 250, 0, MS_SILENT, MZ_MEDIUM), MR_HITASONE, 0, M1_SWIM|M1_ANIMAL|M1_NOHANDS|M1_METALLIVORE, M2_HOSTILE, M3_INFRAVISIBLE, CLR_BROWN), MON("disenchanter", S_RUSTMONST, LVL(12, 12, -10, 0, -3), (G_HELL|G_GENO|2), A(ATTK(AT_CLAW, AD_ENCH, 4, 4), ATTK(AT_NONE, AD_ENCH, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(750, 200, 0, MS_GROWL, MZ_LARGE), 0, 0, M1_ANIMAL|M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE|M3_TRAITOR, CLR_BLUE), /* * Snakes */ MON("garter snake", S_SNAKE, LVL(1, 8, 8, 0, 0), (G_LGROUP|G_GENO|1), A(ATTK(AT_BITE, AD_PHYS, 1, 2), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(50, 60, 0, MS_HISS, MZ_TINY), 0, 0, M1_SWIM|M1_CONCEAL|M1_NOLIMBS|M1_ANIMAL|M1_SLITHY|M1_OVIPAROUS| M1_CARNIVORE|M1_NOTAKE, 0, 0, CLR_GREEN), MON("snake", S_SNAKE, LVL(4, 15, 3, 0, 0), (G_NOHELL|G_GENO|2), A(ATTK(AT_BITE, AD_DRST, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(100, 80, 0, MS_HISS, MZ_SMALL), MR_POISON, MR_POISON, M1_SWIM|M1_CONCEAL|M1_NOLIMBS|M1_ANIMAL|M1_SLITHY|M1_POIS| M1_OVIPAROUS|M1_CARNIVORE|M1_NOTAKE, M2_HOSTILE, 0, CLR_BROWN), MON("water moccasin", S_SNAKE, LVL(4, 15, 3, 0, 0), (G_GENO|G_NOGEN|G_LGROUP), A(ATTK(AT_BITE, AD_DRST, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(150, 80, 0, MS_HISS, MZ_SMALL), MR_POISON, MR_POISON, M1_SWIM|M1_CONCEAL|M1_NOLIMBS|M1_ANIMAL|M1_SLITHY|M1_POIS| M1_CARNIVORE|M1_OVIPAROUS|M1_NOTAKE, M2_HOSTILE, 0, CLR_RED), MON("pit viper", S_SNAKE, LVL(6, 15, 2, 0, 0), (G_NOHELL|G_GENO|1), A(ATTK(AT_BITE, AD_DRST, 1, 4), ATTK(AT_BITE, AD_DRST, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(100, 60, 0, MS_HISS, MZ_MEDIUM), MR_POISON, MR_POISON, M1_SWIM|M1_CONCEAL|M1_NOLIMBS|M1_ANIMAL|M1_SLITHY|M1_POIS| M1_CARNIVORE|M1_OVIPAROUS|M1_NOTAKE, M2_HOSTILE, M3_INFRAVISION, CLR_BLUE), MON("python", S_SNAKE, LVL(6, 3, 5, 0, 0), (G_NOHELL|G_GENO|1), A(ATTK(AT_BITE, AD_PHYS, 1, 4), ATTK(AT_TUCH, AD_PHYS, 0, 0), ATTK(AT_HUGS, AD_WRAP, 1, 4), ATTK(AT_HUGS, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK), SIZ(250, 100, 0, MS_HISS, MZ_LARGE), MR_POISON|MR_HITASONE, MR_POISON, M1_SWIM|M1_NOLIMBS|M1_ANIMAL|M1_SLITHY| M1_CARNIVORE|M1_OVIPAROUS|M1_NOTAKE, M2_HOSTILE|M2_STRONG, M3_INFRAVISION, CLR_MAGENTA), MON("cobra", S_SNAKE, LVL(6, 18, 2, 0, 0), (G_NOHELL|G_GENO|1), A(ATTK(AT_BITE, AD_DRST, 2, 4), ATTK(AT_SPIT, AD_BLND, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(250, 100, 0, MS_HISS, MZ_MEDIUM), MR_POISON, MR_POISON, M1_SWIM|M1_CONCEAL|M1_NOLIMBS|M1_ANIMAL|M1_SLITHY|M1_POIS| M1_CARNIVORE|M1_OVIPAROUS|M1_NOTAKE, M2_HOSTILE, 0, CLR_BLUE), MON("king cobra", S_SNAKE, LVL(9, 15, 2, 0, 0), (G_NOHELL|G_GENO), A(ATTK(AT_BITE, AD_DRST, 3, 4), ATTK(AT_BITE, AD_DRST, 3, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(200, 120, 0, MS_HISS, MZ_MEDIUM), MR_POISON, MR_POISON, M1_SWIM|M1_CONCEAL|M1_NOLIMBS|M1_ANIMAL|M1_SLITHY|M1_POIS| M1_CARNIVORE|M1_OVIPAROUS|M1_NOTAKE, M2_HOSTILE, 0, CLR_GRAY), MON("weresnake", S_SNAKE, LVL(9, 12, 2, 20, -7), G_NOGEN|G_NOCORPSE, A(ATTK(AT_BITE, AD_WERE, 3, 6), ATTK(AT_BITE, AD_DRST, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(300, 120, 0, MS_HISS, MZ_MEDIUM), MR_POISON, 0, M1_NOLIMBS|M1_SWIM|M1_SLITHY|M1_POIS|M1_REGEN|M1_CARNIVORE, M2_NOPOLY|M2_WERE|M2_HOSTILE|M1_NOTAKE, 0, CLR_BROWN), MON("asphynx", S_SNAKE, LVL(8, 15, 3, 0, 0), (G_NOHELL|G_GENO|1), A(ATTK(AT_BITE, AD_STON, 1, 6), ATTK(AT_NONE, AD_STON, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(100, 80, 0, MS_HISS, MZ_SMALL), MR_POISON|MR_STONE, MR_POISON|MR_STONE, M1_SWIM|M1_CONCEAL|M1_NOLIMBS|M1_ANIMAL|M1_SLITHY|M1_POIS| M1_OVIPAROUS|M1_CARNIVORE|M1_NOTAKE, M2_HOSTILE, 0, CLR_BLACK), /* * Trolls */ MON("troll", S_TROLL, LVL(7, 12, 4, 0, -3), (G_NOHELL|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), MR_HITASONE, 0, M1_HUMANOID|M1_REGEN|M1_CARNIVORE, M2_STRONG|M2_STALK|M2_HOSTILE, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, 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_HITASONE, MR_COLD, M1_HUMANOID|M1_REGEN|M1_CARNIVORE, M2_STRONG|M2_STALK|M2_HOSTILE, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, CLR_WHITE), MON("rock troll", S_TROLL, LVL(9, 12, 0, 0, -3), (G_NOHELL|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), MR_HITASTWO, 0, M1_HUMANOID|M1_REGEN|M1_CARNIVORE, M2_STRONG|M2_STALK|M2_HOSTILE|M2_COLLECT, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, CLR_CYAN), MON("two-headed troll", S_TROLL, LVL(10, 12, 8, 0, -3), (G_NOHELL|G_GENO|1), A(ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_BITE, AD_PHYS, 1, 10), ATTK(AT_BITE, AD_PHYS, 1, 10), NO_ATTK, NO_ATTK), SIZ(1200, 300, 0, MS_GRUNT, MZ_LARGE), MR_HITASTWO, 0, M1_HUMANOID|M1_REGEN|M1_CARNIVORE, M2_STRONG|M2_STALK|M2_HOSTILE|M2_COLLECT, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, CLR_GREEN), 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), MR_HITASTWO, 0, M1_HUMANOID|M1_REGEN|M1_CARNIVORE|M1_SWIM, M2_STRONG|M2_STALK|M2_HOSTILE, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, CLR_BLUE), MON("Olog-hai", S_TROLL, LVL(13, 12, -4, 0, -7), (G_NOHELL|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), MR_HITASTWO, 0, M1_HUMANOID|M1_REGEN|M1_CARNIVORE, M2_STRONG|M2_STALK|M2_HOSTILE|M2_COLLECT, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, HI_LORD), MON("black troll", S_TROLL, LVL(17, 12, -4, 0, -7), (G_HELL|G_GENO|1), A(ATTK(AT_WEAP, AD_PHYS, 3, 6), ATTK(AT_CLAW, AD_PHYS, 3, 8), ATTK(AT_BITE, AD_PHYS, 3, 6), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1500, 400, 0, MS_GRUNT, MZ_LARGE), MR_HITASTHREE, 0, M1_HUMANOID|M1_REGEN|M1_CARNIVORE, M2_STRONG|M2_STALK|M2_HOSTILE|M2_COLLECT, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, CLR_BLACK), /* * Umber hulk */ MON("umber hulk", S_UMBER, LVL(9, 6, 2, 25, 0), (G_NOHELL|G_GENO|2), A(ATTK(AT_CLAW, AD_PHYS, 3, 4), ATTK(AT_CLAW, AD_PHYS, 3, 4), ATTK(AT_BITE, AD_PHYS, 2, 5), ATTK(AT_GAZE, AD_CONF, 0, 0), NO_ATTK, NO_ATTK), SIZ(1200, 500, 0, MS_SILENT, MZ_LARGE), MR_HITASONE, 0, M1_TUNNEL|M1_CARNIVORE, M2_STRONG, M3_INFRAVISIBLE, CLR_BROWN), MON("water hulk", S_UMBER, LVL(11, 6, 2, 25, 0), (G_HELL|G_GENO|1), A(ATTK(AT_CLAW, AD_PHYS, 3, 4), ATTK(AT_CLAW, AD_PHYS, 3, 4), ATTK(AT_BITE, AD_PHYS, 2, 5), ATTK(AT_GAZE, AD_CONF, 0, 0), NO_ATTK, NO_ATTK), SIZ(1200, 500, 0, MS_SILENT, MZ_LARGE), MR_HITASONE, 0, M1_SWIM|M1_TUNNEL|M1_CARNIVORE, M2_STRONG, 0, CLR_GREEN), /* * Vampires */ MON("vampire", S_VAMPIRE, LVL(10, 12, 1, 25, -8), (G_GENO|G_NOCORPSE|2), 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|MR_PLUSTWO, 0, M1_FLY|M1_BREATHLESS|M1_HUMANOID|M1_POIS|M1_REGEN|M1_CARNIVORE, M2_NOPOLY|M2_UNDEAD|M2_VAMPIRE|M2_STALK|M2_HOSTILE|M2_STRONG|M2_NASTY, M3_INFRAVISIBLE|M3_TRAITOR, CLR_RED), MON("vampire lord", S_VAMPIRE, LVL(12, 14, 0, 50, -9), (G_GENO|G_NOCORPSE|2), 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|MR_PLUSTHREE, 0, M1_FLY|M1_BREATHLESS|M1_HUMANOID|M1_POIS|M1_REGEN|M1_CARNIVORE, M2_UNDEAD|M2_VAMPIRE|M2_STALK|M2_HOSTILE|M2_STRONG|M2_NASTY|M2_LORD|M2_MALE, M3_INFRAVISIBLE|M3_TRAITOR, CLR_BLUE), MON("fire vampire", S_VAMPIRE, LVL(12, 24, 0, 50, -5), (G_GENO|G_NOCORPSE|1), A(ATTK(AT_CLAW, AD_FIRE, 2, 4), ATTK(AT_CLAW, AD_FIRE, 2, 4), ATTK(AT_BITE, AD_DRLI, 2, 4), ATTK(AT_TUCH, AD_DREN, 2, 4), ATTK(AT_MAGC, AD_FIRE, 2, 12), NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_SILENT, MZ_HUMAN), MR_SLEEP|MR_POISON|MR_COLD|MR_FIRE, 0, M1_FLY|M1_BREATHLESS|M1_HUMANOID|M1_POIS|M1_REGEN|M1_CARNIVORE, M2_VAMPIRE|M2_STALK|M2_HOSTILE|M2_STRONG|M2_NASTY|M2_NEUTER, M3_INFRAVISIBLE|M3_TRAITOR, CLR_RED), MON("star vampire", S_VAMPIRE, LVL(18, 18, -5, 60, -5), (G_GENO|G_NOCORPSE|1), A(ATTK(AT_TENT, AD_PHYS, 2, 6), ATTK(AT_TENT, AD_DRLI, 2, 6), ATTK(AT_TENT, AD_PHYS, 2, 6), ATTK(AT_TENT, AD_DRLI, 2, 6), ATTK(AT_TENT, AD_PHYS, 2, 6), ATTK(AT_TENT, AD_DRLI, 2, 6)), SIZ(WT_HUMAN, 400, 0, MS_SILENT, MZ_LARGE), MR_SLEEP|MR_POISON|MR_COLD, 0, M1_FLY|M1_BREATHLESS|M1_HUMANOID|M1_POIS|M1_REGEN|M1_CARNIVORE, M2_VAMPIRE|M2_STALK|M2_HOSTILE|M2_STRONG|M2_NASTY|M2_NEUTER, M3_INFRAVISIBLE|M3_TRAITOR, CLR_WHITE), 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| MR_PLUSTHREE, 0, M1_FLY|M1_BREATHLESS|M1_HUMANOID|M1_POIS|M1_REGEN|M1_CARNIVORE, M2_UNDEAD|M2_VAMPIRE|M2_STALK|M2_HOSTILE|M2_STRONG|M2_NASTY|M2_LORD|M2_MALE| M2_MAGIC, M3_INFRAVISIBLE|M3_TRAITOR, HI_ZAP), MON("Vlad the Impaler", S_VAMPIRE, LVL(14, 18, -3, 80, -10), (G_NOGEN|G_NOCORPSE|G_UNIQ), A(ATTK(AT_WEAP, AD_PHYS, 1, 10), ATTK(AT_BITE, AD_DRLI, 1, 10), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_VAMPIRE, MZ_HUMAN), MR_SLEEP|MR_POISON|MR_PLUSTHREE, 0, M1_FLY|M1_BREATHLESS|M1_HUMANOID|M1_POIS|M1_REGEN|M1_CARNIVORE, M2_NOPOLY|M2_UNDEAD|M2_VAMPIRE|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), MON("wight", S_WRAITH, LVL(5, 12, 5, 5, -3), (G_NOCORPSE|G_GENO|1), A(ATTK(AT_CLAW, AD_DRLI, 1, 4), ATTK(AT_BITE, AD_PHYS, 2, 3), ATTK(AT_CLAW, AD_DRLI, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1200, 0, 0, MS_SILENT, MZ_HUMAN), MR_COLD|MR_SLEEP|MR_POISON, 0, M1_BREATHLESS|M1_HUMANOID, M2_UNDEAD|M2_STALK|M2_HOSTILE|M2_COLLECT, 0, CLR_GRAY), MON("wraith", S_WRAITH, LVL(6, 12, 4, 15, -6), (G_GENO|2), A(ATTK(AT_TUCH, AD_DRLI, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(0, 0, 0, MS_SILENT, MZ_HUMAN), MR_COLD|MR_SLEEP|MR_POISON|MR_STONE|MR_PLUSONE|MR_HITASTWO, 0, M1_BREATHLESS|M1_FLY|M1_HUMANOID|M1_UNSOLID, M2_UNDEAD|M2_STALK|M2_HOSTILE, 0, CLR_BLACK), MON("Nazgul", S_WRAITH, LVL(13, 12, 0, 25, -17), (G_GENO|G_NOCORPSE|1), A(ATTK(AT_WEAP, AD_DRLI, 1, 4), ATTK(AT_BREA, AD_SLEE, 2,25), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 0, 0, MS_SPELL, MZ_HUMAN), MR_COLD|MR_SLEEP|MR_POISON|MR_PLUSONE|MR_HITASTWO, 0, M1_BREATHLESS|M1_HUMANOID, M2_NOPOLY|M2_UNDEAD|M2_STALK|M2_STRONG|M2_HOSTILE|M2_MALE|M2_COLLECT, 0, HI_LORD), /* * Xorn */ MON("xorn", S_XORN, LVL(8, 9,-2, 20, 0), (G_NOHELL|G_GENO|3), 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_HITASTWO, MR_COLD|MR_FIRE|MR_STONE, M1_BREATHLESS|M1_WALLWALK|M1_THICK_HIDE|M1_METALLIVORE, M2_HOSTILE|M2_STRONG, 0, CLR_BROWN), /* * Apelike beasts */ MON("monkey", S_YETI, LVL(2, 12, 6, 0, 0), (G_GENO|1), A(ATTK(AT_CLAW, AD_SITM, 0, 0), ATTK(AT_BITE, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(100, 50, 0, MS_GROWL, MZ_SMALL), 0, 0, M1_ANIMAL|M1_HUMANOID|M1_OMNIVORE, 0, M3_INFRAVISIBLE, CLR_GRAY), MON("ape", S_YETI, LVL(4, 12, 6, 0, 0), (G_NOHELL|G_GENO|G_SGROUP|2), A(ATTK(AT_CLAW, AD_PHYS, 1, 3), ATTK(AT_CLAW, AD_PHYS, 1, 3), ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1100, 500, 0, MS_GROWL, MZ_LARGE), 0, 0, M1_ANIMAL|M1_HUMANOID|M1_OMNIVORE, M2_STRONG, M3_INFRAVISIBLE, CLR_BROWN), MON("owlbear", S_YETI, LVL(5, 12, 5, 0, 0), (G_NOHELL|G_GENO|3), A(ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_HUGS, AD_PHYS, 2, 8), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1700, 700, 0, MS_ROAR, MZ_LARGE), MR_HITASONE, 0, M1_ANIMAL|M1_HUMANOID|M1_CARNIVORE, M2_HOSTILE|M2_STRONG|M2_NASTY, M3_INFRAVISIBLE, CLR_BROWN), MON("yeti", S_YETI, LVL(5, 15, 6, 0, 0), (G_NOHELL|G_GENO|2), A(ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1600, 700, 0, MS_GROWL, MZ_LARGE), MR_COLD|MR_HITASONE, MR_COLD, M1_ANIMAL|M1_HUMANOID|M1_CARNIVORE, M2_HOSTILE|M2_STRONG, M3_INFRAVISIBLE, CLR_WHITE), MON("carnivorous ape", S_YETI, LVL(6, 12, 6, 0, 0), (G_NOHELL|G_GENO|1), A(ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_HUGS, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1250, 550, 0, MS_GROWL, MZ_LARGE), 0, 0, M1_ANIMAL|M1_HUMANOID|M1_CARNIVORE, M2_HOSTILE|M2_STRONG, M3_INFRAVISIBLE, CLR_BLACK), MON("sasquatch", S_YETI, LVL(7, 15, 6, 0, 2), (G_NOHELL|G_GENO|1), A(ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_KICK, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1550, 750, 0, MS_GROWL, MZ_LARGE), MR_HITASONE, 0, M1_ANIMAL|M1_HUMANOID|M1_SEE_INVIS|M1_OMNIVORE, M2_STRONG, M3_INFRAVISIBLE, CLR_GRAY), /* Moved from 'z' */ MON("zruty", S_YETI, LVL(9, 8, 3, 0, 0), (G_NOHELL|G_GENO|2), A(ATTK(AT_CLAW, AD_PHYS, 3, 4), ATTK(AT_CLAW, AD_PHYS, 3, 4), ATTK(AT_BITE, AD_PHYS, 3, 6), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1200, 600, 0, MS_SILENT, MZ_LARGE), MR_HITASONE, 0, M1_ANIMAL|M1_HUMANOID|M1_CARNIVORE, M2_HOSTILE|M2_STRONG, M3_INFRAVISIBLE, CLR_GREEN), /* * Zombies */ MON("kobold zombie", S_ZOMBIE, LVL(0, 6, 10, 0, -2), (G_GENO|G_NOCORPSE|1), A(ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(400, 50, 0, MS_SILENT, MZ_SMALL), MR_COLD|MR_SLEEP|MR_POISON, 0, M1_BREATHLESS|M1_MINDLESS|M1_HUMANOID|M1_POIS, M2_UNDEAD|M2_STALK|M2_HOSTILE, M3_INFRAVISION, CLR_BROWN), MON("gnome zombie", S_ZOMBIE, LVL(1, 6, 10, 0, -2), (G_GENO|G_NOCORPSE|1), A(ATTK(AT_CLAW, AD_PHYS, 1, 5), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(650, 50, 0, MS_SILENT, MZ_SMALL), MR_COLD|MR_SLEEP|MR_POISON, 0, M1_BREATHLESS|M1_MINDLESS|M1_HUMANOID|M1_POIS, M2_UNDEAD|M2_STALK|M2_HOSTILE|M2_GNOME, M3_INFRAVISION, CLR_BROWN), MON("orc zombie", S_ZOMBIE, LVL(2, 6, 9, 0, -3), (G_GENO|G_SGROUP|G_NOCORPSE|1), A(ATTK(AT_CLAW, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(850, 75, 0, MS_SILENT, MZ_HUMAN), MR_COLD|MR_SLEEP|MR_POISON, 0, M1_BREATHLESS|M1_MINDLESS|M1_HUMANOID|M1_POIS, M2_UNDEAD|M2_STALK|M2_HOSTILE|M2_ORC, M3_INFRAVISION, CLR_GRAY), MON("dwarf zombie", S_ZOMBIE, LVL(2, 6, 9, 0, -3), (G_GENO|G_SGROUP|G_NOCORPSE|1), A(ATTK(AT_CLAW, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(900, 150, 0, MS_SILENT, MZ_HUMAN), MR_COLD|MR_SLEEP|MR_POISON, 0, M1_BREATHLESS|M1_MINDLESS|M1_HUMANOID|M1_POIS, M2_UNDEAD|M2_STALK|M2_HOSTILE|M2_DWARF, M3_INFRAVISION, CLR_RED), MON("elf zombie", S_ZOMBIE, LVL(3, 6, 9, 0, 3), (G_GENO|G_SGROUP|G_NOCORPSE|1), A(ATTK(AT_CLAW, AD_PHYS, 1, 7), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_ELF, 175, 0, MS_SILENT, MZ_HUMAN), MR_COLD|MR_SLEEP|MR_POISON, 0, M1_BREATHLESS|M1_MINDLESS|M1_HUMANOID, M2_UNDEAD|M2_STALK|M2_HOSTILE|M2_ELF, M3_INFRAVISION, CLR_GREEN), MON("human zombie", S_ZOMBIE, LVL(4, 6, 8, 0, -3), (G_GENO|G_SGROUP|G_NOCORPSE|1), A(ATTK(AT_CLAW, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 200, 0, MS_SILENT, MZ_HUMAN), MR_COLD|MR_SLEEP|MR_POISON, 0, M1_BREATHLESS|M1_MINDLESS|M1_HUMANOID, M2_UNDEAD|M2_STALK|M2_HOSTILE, M3_INFRAVISION, HI_DOMESTIC), MON("ghoul", S_ZOMBIE, LVL(5, 6, 10, 0, -2), (G_GENO|G_NOCORPSE|1), A(ATTK(AT_CLAW, AD_PLYS, 1, 6), ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(400, 50, 0, MS_SILENT, MZ_SMALL), MR_COLD|MR_SLEEP|MR_POISON, 0, M1_BREATHLESS|M1_MINDLESS|M1_HUMANOID|M1_POIS|M1_CARNIVORE, M2_UNDEAD|M2_WANDER|M2_HOSTILE, M3_INFRAVISION, CLR_BLACK), MON("ghoul mage", S_ZOMBIE, LVL(10, 12, 4, 10, -4), (G_GENO|G_NOCORPSE|1), A(ATTK(AT_CLAW, AD_PLYS, 1, 3), ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_MAGC, AD_SPEL, 6, 6), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(400, 50, 0, MS_SILENT, MZ_SMALL), MR_COLD|MR_SLEEP|MR_POISON, 0, M1_HUMANOID|M1_POIS|M1_TUNNEL|M1_NEEDPICK|M1_CARNIVORE, M2_UNDEAD|M2_WANDER|M2_HOSTILE|M2_COLLECT|M2_MAGIC, M3_INFRAVISION|M3_TRAITOR, CLR_BLACK), MON("ettin zombie", S_ZOMBIE, LVL(6, 8, 6, 0, -4), (G_GENO|G_NOCORPSE|1), A(ATTK(AT_CLAW, AD_PHYS, 1,10), ATTK(AT_CLAW, AD_PHYS, 1,10), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1700, 250, 0, MS_SILENT, MZ_HUGE), MR_COLD|MR_SLEEP|MR_POISON, 0, M1_BREATHLESS|M1_MINDLESS|M1_HUMANOID, M2_UNDEAD|M2_STALK|M2_HOSTILE|M2_STRONG, M3_INFRAVISION, CLR_BLUE), MON("ghast", S_ZOMBIE, LVL(4, 6, 10, 0, -2), (G_GENO|G_NOCORPSE|1), A(ATTK(AT_CLAW, AD_PLYS, 1, 2), ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(400, 50, 0, MS_SILENT, MZ_SMALL), MR_COLD|MR_SLEEP|MR_POISON, 0, M1_BREATHLESS|M1_MINDLESS|M1_HUMANOID|M1_POIS|M1_CARNIVORE, M2_UNDEAD|M2_STALK|M2_HOSTILE, 0, CLR_MAGENTA), MON("giant zombie", S_ZOMBIE, LVL(8, 8, 6, 0, -4), (G_GENO|G_NOCORPSE|1), A(ATTK(AT_CLAW, AD_PHYS, 2, 8), ATTK(AT_CLAW, AD_PHYS, 2, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(2050, 375, 0, MS_SILENT, MZ_HUGE), MR_COLD|MR_SLEEP|MR_POISON, 0, M1_BREATHLESS|M1_MINDLESS|M1_HUMANOID, M2_UNDEAD|M2_STALK|M2_HOSTILE|M2_GIANT|M2_STRONG, M3_INFRAVISION, CLR_CYAN), MON("skeleton", S_ZOMBIE, LVL(12, 8, 4, 0, 0), (G_NOCORPSE|G_NOGEN), A(ATTK(AT_WEAP, AD_PHYS, 2, 6), ATTK(AT_TUCH, AD_SLOW, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(300, 5, 0, MS_BONES, MZ_HUMAN), MR_COLD|MR_SLEEP|MR_POISON|MR_STONE|MR_PLUSTWO, 0, M1_BREATHLESS|M1_MINDLESS|M1_HUMANOID|M1_THICK_HIDE, M2_UNDEAD|M2_WANDER|M2_HOSTILE|M2_STRONG|M2_COLLECT|M2_NASTY, M3_INFRAVISION, CLR_WHITE), MON("ghoul queen", S_ZOMBIE, LVL(14, 12, 0, 30, -8), (G_GENO|G_NOCORPSE|G_NOGEN|1), A(ATTK(AT_CLAW, AD_PLYS, 1, 3), ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_MAGC, AD_SPEL, 4, 6), ATTK(AT_MAGC, AD_SPEL, 4, 6), NO_ATTK, NO_ATTK), SIZ(400, 50, 0, MS_SILENT, MZ_SMALL), MR_COLD|MR_SLEEP|MR_POISON, 0, M1_HUMANOID|M1_POIS|M1_TUNNEL|M1_NEEDPICK|M1_CARNIVORE, M2_UNDEAD|M2_WANDER|M2_HOSTILE|M2_FEMALE|M2_COLLECT|M2_MAGIC, M3_INFRAVISION|M3_TRAITOR, CLR_BLACK), MON("gug", S_ZOMBIE, LVL(15, 18, 5, 15, -4), (G_GENO|G_NOCORPSE|1|G_LGROUP), A(ATTK(AT_CLAW, AD_PHYS, 2, 6), ATTK(AT_CLAW, AD_PHYS, 2, 6), ATTK(AT_BITE, AD_PLYS, 3, 6), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1800, 150, 0, MS_SILENT, MZ_MEDIUM), MR_COLD|MR_SLEEP|MR_POISON, 0, M1_HUMANOID|M1_POIS|M1_TUNNEL|M1_NEEDPICK|M1_THICK_HIDE|M1_CARNIVORE, M2_UNDEAD|M2_WANDER|M2_HOSTILE|M2_STRONG|M2_STALK|M2_COLLECT|M2_MAGIC, M3_INFRAVISION|M3_TRAITOR, CLR_BLACK), /* * golems */ MON("straw golem", S_GOLEM, LVL(3, 12, 10, 0, 0), (G_NOCORPSE|1), A(ATTK(AT_CLAW, AD_PHYS, 1, 2), ATTK(AT_CLAW, AD_PHYS, 1, 2), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(400, 0, 0, MS_SILENT, MZ_LARGE), MR_SLEEP|MR_POISON|MR_HITASONE, 0, M1_BREATHLESS|M1_MINDLESS|M1_HUMANOID, M2_HOSTILE|M2_NEUTER, 0, CLR_YELLOW), MON("paper golem", S_GOLEM, LVL(3, 12, 10, 0, 0), (G_NOCORPSE|1), A(ATTK(AT_CLAW, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(400, 0, 0, MS_SILENT, MZ_LARGE), MR_SLEEP|MR_POISON, 0, M1_BREATHLESS|M1_MINDLESS|M1_HUMANOID, M2_HOSTILE|M2_NEUTER, 0, HI_PAPER), MON("wax golem", S_GOLEM, LVL(3, 12, 9, 0, 0), (G_NOCORPSE|1), A(ATTK(AT_CLAW, AD_PHYS, 1, 2), ATTK(AT_TUCH, AD_FIRE, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(400, 0, 0, MS_SILENT, MZ_LARGE), MR_SLEEP|MR_POISON, 0, M1_BREATHLESS|M1_MINDLESS|M1_HUMANOID, M2_HOSTILE|M2_NEUTER, M3_INFRAVISIBLE, CLR_GRAY), MON("plastic golem", S_GOLEM, LVL(4, 12, 9, 0, 0), (G_NOCORPSE|1), A(ATTK(AT_CLAW, AD_PHYS, 1, 3), ATTK(AT_CLAW, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(400, 0, 0, MS_SILENT, MZ_LARGE), MR_SLEEP|MR_POISON, 0, M1_BREATHLESS|M1_MINDLESS|M1_HUMANOID, M2_HOSTILE|M2_NEUTER, 0, CLR_BLACK), MON("rope golem", S_GOLEM, LVL(4, 9, 8, 0, 0), (G_NOCORPSE|1), A(ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_HUGS, AD_PHYS, 6, 1), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(450, 0, 0, MS_SILENT, MZ_LARGE), MR_DEATH|MR_SLEEP|MR_POISON|MR_HITASONE, 0, M1_BREATHLESS|M1_MINDLESS|M1_HUMANOID, M2_HOSTILE|M2_NEUTER, 0, CLR_BROWN), MON("gold golem", S_GOLEM, LVL(5, 9, 6, 0, 0), (G_NOCORPSE|1), A(ATTK(AT_CLAW, AD_PHYS, 2, 3), ATTK(AT_CLAW, AD_PHYS, 2, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(450, 0, 0, MS_SILENT, MZ_LARGE), MR_SLEEP|MR_POISON|MR_ACID, 0, M1_BREATHLESS|M1_MINDLESS|M1_HUMANOID|M1_THICK_HIDE, M2_HOSTILE|M2_NEUTER, 0, HI_GOLD), MON("leather golem", S_GOLEM, LVL(6, 6, 6, 0, 0), (G_NOCORPSE|1), A(ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_CLAW, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(800, 0, 0, MS_SILENT, MZ_LARGE), MR_DEATH|MR_SLEEP|MR_POISON|MR_HITASONE, 0, M1_BREATHLESS|M1_MINDLESS|M1_HUMANOID, M2_HOSTILE|M2_NEUTER, 0, HI_LEATHER), MON("wood golem", S_GOLEM, LVL(7, 3, 4, 0, 0), (G_NOCORPSE|1), A(ATTK(AT_CLAW, AD_PHYS, 3, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(900, 0, 0, MS_SILENT, MZ_LARGE), MR_DEATH|MR_SLEEP|MR_POISON|MR_HITASONE, 0, M1_BREATHLESS|M1_MINDLESS|M1_HUMANOID|M1_THICK_HIDE, M2_HOSTILE|M2_NEUTER, 0, HI_WOOD), MON("flesh golem", S_GOLEM, LVL(9, 8, 9, 30, 0), (1), A(ATTK(AT_CLAW, AD_PHYS, 2, 8), ATTK(AT_CLAW, AD_PHYS, 2, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1400, 600, 0, MS_SILENT, MZ_LARGE), MR_FIRE|MR_COLD|MR_ELEC|MR_SLEEP|MR_POISON|MR_PLUSONE|MR_HITASTWO, MR_FIRE|MR_COLD|MR_ELEC|MR_SLEEP|MR_POISON, M1_BREATHLESS|M1_MINDLESS|M1_HUMANOID, M2_HOSTILE|M2_STRONG, 0, CLR_RED), MON("clay golem", S_GOLEM, LVL(11, 7, 7, 40, 0), (G_NOCORPSE|1), A(ATTK(AT_CLAW, AD_PHYS, 3,10), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1550, 0, 0, MS_SILENT, MZ_LARGE), MR_SLEEP|MR_POISON, 0, M1_BREATHLESS|M1_MINDLESS|M1_HUMANOID|M1_THICK_HIDE, M2_HOSTILE|M2_STRONG, 0, CLR_BROWN), MON("stone golem", S_GOLEM, LVL(14, 6, 5, 50, 0), (G_NOCORPSE|1), A(ATTK(AT_CLAW, AD_PHYS, 3, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1900, 0, 0, MS_SILENT, MZ_LARGE), MR_SLEEP|MR_POISON|MR_STONE, 0, M1_BREATHLESS|M1_MINDLESS|M1_HUMANOID|M1_THICK_HIDE, M2_HOSTILE|M2_STRONG, 0, CLR_GRAY), MON("glass golem", S_GOLEM, LVL(16, 6, 1, 50, 0), (G_NOCORPSE|1), A(ATTK(AT_CLAW, AD_PHYS, 2, 8), ATTK(AT_CLAW, AD_PHYS, 2, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1800, 0, 0, MS_SILENT, MZ_LARGE), MR_SLEEP|MR_POISON|MR_ACID, 0, M1_BREATHLESS|M1_MINDLESS|M1_HUMANOID|M1_THICK_HIDE, M2_HOSTILE|M2_STRONG, 0, CLR_CYAN), MON("iron golem", S_GOLEM, LVL(18, 6, 3, 60, 0), (G_NOCORPSE|1), A(ATTK(AT_WEAP, AD_PHYS, 4,10), ATTK(AT_BREA, AD_DRST, 4, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(2000, 0, 0, MS_SILENT, MZ_LARGE), MR_FIRE|MR_COLD|MR_ELEC|MR_SLEEP|MR_POISON, 0, M1_BREATHLESS|M1_MINDLESS|M1_HUMANOID|M1_THICK_HIDE|M1_POIS, M2_HOSTILE|M2_STRONG|M2_COLLECT, 0, HI_METAL), MON("Frankenstein's Monster", S_GOLEM, LVL(20, 8, -5, 50, 0), (G_NOGEN|G_UNIQ), A(ATTK(AT_CLAW, AD_PHYS, 3, 8), ATTK(AT_CLAW, AD_PHYS, 3, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1400, 600, 0, MS_SILENT, MZ_LARGE), MR_COLD|MR_ELEC|MR_SLEEP|MR_POISON, MR_COLD|MR_ELEC|MR_SLEEP|MR_POISON, M1_BREATHLESS|M1_MINDLESS|M1_HUMANOID, M2_HOSTILE|M2_STRONG|M2_UNDEAD|M2_NOPOLY|M2_MALE|M2_PNAME, 0, HI_LORD), /* [Lethe] Greater golems */ MON("ruby golem", S_GOLEM, LVL(24, 12, 3, 60, 0), (G_NOCORPSE|1), A(ATTK(AT_WEAP, AD_PHYS, 4,10), ATTK(AT_BREA, AD_FIRE, 5, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(2000, 0, 0, MS_SILENT, MZ_LARGE), MR_FIRE|MR_COLD|MR_ELEC|MR_SLEEP|MR_POISON, 0, M1_BREATHLESS|M1_MINDLESS|M1_HUMANOID|M1_THICK_HIDE|M1_POIS, M2_HOSTILE|M2_STRONG|M2_COLLECT|M2_NEUTER, 0, CLR_RED), MON("diamond golem", S_GOLEM, LVL(26, 12, 3, 60, 0), (G_NOCORPSE|1), A(ATTK(AT_WEAP, AD_PHYS, 5,10), ATTK(AT_BREA, AD_MAGM, 5, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(2000, 0, 0, MS_SILENT, MZ_LARGE), MR_FIRE|MR_COLD|MR_ELEC|MR_SLEEP|MR_POISON, 0, M1_BREATHLESS|M1_MINDLESS|M1_HUMANOID|M1_THICK_HIDE|M1_POIS, M2_HOSTILE|M2_STRONG|M2_COLLECT|M2_NEUTER, 0, CLR_WHITE), MON("sapphire golem", S_GOLEM, LVL(28, 12, 3, 60, 0), (G_NOCORPSE|1), A(ATTK(AT_WEAP, AD_PHYS, 6,10), ATTK(AT_BREA, AD_ELEC, 5, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(2000, 0, 0, MS_SILENT, MZ_LARGE), MR_FIRE|MR_COLD|MR_ELEC|MR_SLEEP|MR_POISON, 0, M1_BREATHLESS|M1_MINDLESS|M1_HUMANOID|M1_THICK_HIDE|M1_POIS, M2_HOSTILE|M2_STRONG|M2_COLLECT|M2_NEUTER, 0, CLR_BRIGHT_CYAN), MON("steel golem", S_GOLEM, LVL(30, 15, 3, 60, 0), (G_NOCORPSE|1), A(ATTK(AT_WEAP, AD_PHYS, 6,10), ATTK(AT_BREA, AD_COLD, 5, 8), ATTK(AT_NONE, AD_ENCH, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(2000, 0, 0, MS_SILENT, MZ_LARGE), MR_FIRE|MR_COLD|MR_ELEC|MR_SLEEP|MR_POISON, 0, M1_BREATHLESS|M1_MINDLESS|M1_HUMANOID|M1_THICK_HIDE|M1_POIS, M2_HOSTILE|M2_STRONG|M2_COLLECT|M2_NEUTER, 0, CLR_BRIGHT_BLUE), MON("crystal golem", S_GOLEM, LVL(32, 15, 3, 60, 0), (G_NOCORPSE|1), A(ATTK(AT_WEAP, AD_PHYS, 8,12), ATTK(AT_BREA, AD_RBRE, 6, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(2000, 0, 0, MS_SILENT, MZ_LARGE), MR_FIRE|MR_COLD|MR_ELEC|MR_SLEEP|MR_POISON, 0, M1_BREATHLESS|M1_MINDLESS|M1_HUMANOID|M1_THICK_HIDE|M1_POIS, M2_HOSTILE|M2_STRONG|M2_COLLECT|M2_NEUTER, 0, CLR_BRIGHT_BLUE), /* * humans, including elves and were-critters */ MON("human", S_HUMAN, LVL(0, 12, 10, 0, 0), G_NOGEN, /* for corpses */ A(ATTK(AT_WEAP, AD_PHYS, 1, 3), ATTK(AT_WEAP, AD_PHYS, 1, 3), 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("wererat", S_HUMAN, LVL(2, 12, 10, 10, -7), (1), A(ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_WERE, MZ_HUMAN), MR_POISON, 0, M1_HUMANOID|M1_POIS|M1_REGEN|M1_OMNIVORE, M2_NOPOLY|M2_WERE|M2_HOSTILE|M2_HUMAN|M2_COLLECT, M3_INFRAVISIBLE, CLR_BROWN), MON("werejackal", S_HUMAN, LVL(2, 12, 10, 10, -7), (1), A(ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_WERE, MZ_HUMAN), MR_POISON, 0, M1_HUMANOID|M1_POIS|M1_REGEN|M1_OMNIVORE, M2_NOPOLY|M2_WERE|M2_HOSTILE|M2_HUMAN|M2_COLLECT, M3_INFRAVISIBLE, CLR_RED), MON("werewolf", S_HUMAN, LVL(5, 12, 10, 20, -7), (1), A(ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_WERE, MZ_HUMAN), MR_POISON, 0, M1_HUMANOID|M1_POIS|M1_REGEN|M1_OMNIVORE, M2_NOPOLY|M2_WERE|M2_HUMAN|M2_COLLECT, M3_INFRAVISIBLE, CLR_ORANGE), MON("werepanther", S_HUMAN, LVL(5, 15, MARM(10,6), 20, -7), (1), A(ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_GROWL, MZ_HUMAN), MR_POISON, 0, M1_HUMANOID|M1_POIS|M1_REGEN|M1_OMNIVORE, M2_NOPOLY|M2_WERE|M2_HOSTILE|M2_HUMAN|M2_COLLECT, M3_INFRAVISIBLE, CLR_BLACK), MON("weretiger", S_HUMAN, LVL(7, 12, MARM(10,5), 20, -7), (1), A(ATTK(AT_WEAP, AD_PHYS, 3, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_GROWL, MZ_HUMAN), MR_POISON, 0, M1_HUMANOID|M1_POIS|M1_REGEN|M1_OMNIVORE, M2_NOPOLY|M2_WERE|M2_HOSTILE|M2_HUMAN|M2_COLLECT, M3_INFRAVISIBLE, CLR_YELLOW), MON("weresnake", S_HUMAN, LVL(9, 12, MARM(10,3), 20, -7), (0), A(ATTK(AT_WEAP, AD_PHYS, 3, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_HISS, MZ_HUMAN), MR_POISON, 0, M1_HUMANOID|M1_POIS|M1_REGEN|M1_OMNIVORE, M2_NOPOLY|M2_WERE|M2_HOSTILE|M2_HUMAN|M2_COLLECT, 0, CLR_BROWN), MON("werespider", S_HUMAN, LVL(9, 12, MARM(10,3), 20, -7), (0), A(ATTK(AT_WEAP, AD_PHYS, 3, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_HISS, MZ_HUMAN), MR_POISON, 0, M1_HUMANOID|M1_POIS|M1_REGEN|M1_OMNIVORE, M2_NOPOLY|M2_WERE|M2_HOSTILE|M2_HUMAN|M2_COLLECT, 0, CLR_BLACK), MON("gibberling", S_HUMAN, LVL(6, 12, 10, 0, -2), (G_HELL|G_GENO|G_VLGROUP|1), A(ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_WAIL, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_COLLECT, M3_INFRAVISIBLE|M3_TRAITOR, CLR_GRAY), MON("grimlock", S_HUMAN, LVL(8, 12, 5, 0, -2), (G_HELL|G_GENO|G_VLGROUP|1), A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_GRUNT, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_OMNIVORE|M1_NOEYES, M2_NOPOLY|M2_HUMAN|M2_COLLECT, M3_INFRAVISIBLE|M3_TRAITOR, CLR_BLACK), /* [ALI] Elves in the Slash'EM universe are based on Tolkien * and are lawful rather than chaotic. To quote Elrond from the FotR: * "The Three were not made by Sauron, nor did he ever touch * them. But of them it is not permitted to speak. So much * only in this hour of doubt I may now say. They are not * idle. But they were not made as weapons of war or conquest: * that is not their power. Those who made them did not * desire strength or domination or hoarded wealth, but * understanding, making, and healing, to preserve all things * unstained. These things the Elves of Middle-earth have in * some measure gained, though with sorrow." */ MON("elf", S_HUMAN, LVL(10, 12, 10, 2, 3), G_NOGEN, /* for corpses */ A(ATTK(AT_WEAP, AD_PHYS, 1, 4), ATTK(AT_WEAP, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_ELF, 350, 0, MS_HUMANOID, MZ_HUMAN), MR_SLEEP, MR_SLEEP, M1_HUMANOID|M1_OMNIVORE|M1_SEE_INVIS, M2_NOPOLY|M2_ELF|M2_STRONG|M2_COLLECT, M3_INFRAVISION|M3_INFRAVISIBLE, HI_DOMESTIC), MON("Woodland-elf", S_HUMAN, LVL(4, 12, 10, 10, 5), (G_GENO|G_SGROUP|3), A(ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_ELF, 350, 0, MS_HUMANOID, MZ_HUMAN), MR_SLEEP, MR_SLEEP, M1_HUMANOID|M1_OMNIVORE|M1_SEE_INVIS, M2_ELF|M2_COLLECT, M3_INFRAVISIBLE|M3_INFRAVISION, CLR_GREEN), MON("Green-elf", S_HUMAN, LVL(5, 12, 10, 10, 6), (G_GENO|G_SGROUP|3), A(ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_ELF, 350, 0, MS_HUMANOID, MZ_HUMAN), MR_SLEEP, MR_SLEEP, M1_HUMANOID|M1_OMNIVORE|M1_SEE_INVIS, M2_ELF|M2_COLLECT, M3_INFRAVISIBLE|M3_INFRAVISION, CLR_BRIGHT_GREEN), MON("Grey-elf", S_HUMAN, LVL(6, 12, 10, 10, 7), (G_GENO|G_SGROUP|3), A(ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_ELF, 350, 0, MS_HUMANOID, MZ_HUMAN), MR_SLEEP, MR_SLEEP, M1_HUMANOID|M1_OMNIVORE|M1_SEE_INVIS, M2_ELF|M2_COLLECT, M3_INFRAVISIBLE|M3_INFRAVISION, CLR_GRAY), MON("High-elf", S_HUMAN, LVL(7, 12, 10, 10, 9), G_NOGEN, A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_MAGC, AD_CLRC, 2, 17), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_ELF, 350, 0, MS_HUMANOID, MZ_HUMAN), MR_SLEEP, MR_SLEEP, M1_HUMANOID|M1_OMNIVORE|M1_SEE_INVIS, M2_ELF|M2_STRONG|M2_COLLECT, M3_INFRAVISION|M3_INFRAVISIBLE, CLR_WHITE), MON("elf-lord", S_HUMAN, LVL(8, 12, 10, 20, 9), (G_GENO|G_SGROUP|2), A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_ELF, 350, 0, MS_HUMANOID, MZ_HUMAN), MR_SLEEP, MR_SLEEP, M1_HUMANOID|M1_OMNIVORE|M1_SEE_INVIS, M2_ELF|M2_STRONG|M2_LORD|M2_MALE|M2_COLLECT, M3_INFRAVISIBLE|M3_INFRAVISION, CLR_BRIGHT_BLUE), MON("drow", S_HUMAN, LVL(6, 12, MARM(4,0), 60, -9), (G_GENO|G_SGROUP|1), A(ATTK(AT_WEAP, AD_SLEE, 2, 4), ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_ELF, 350, 0, MS_HUMANOID, MZ_HUMAN), MR_SLEEP, MR_SLEEP, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_ELF|M2_STRONG|M2_LORD|M2_MALE|M2_COLLECT|M2_HOSTILE, M3_TRAITOR, CLR_BLACK), MON("Elvenking", S_HUMAN, LVL(9, 12, 10, 25, 10), (G_GENO|1), A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_ELF, 350, 0, MS_HUMANOID, MZ_HUMAN), MR_SLEEP, MR_SLEEP, M1_HUMANOID|M1_OMNIVORE|M1_SEE_INVIS, M2_ELF|M2_STRONG|M2_PRINCE|M2_MALE|M2_COLLECT, M3_INFRAVISIBLE|M3_INFRAVISION, HI_LORD), MON("doppelganger", S_HUMAN, LVL(9, 12, 5, 20, 0), (G_GENO|1), A(ATTK(AT_WEAP, AD_PHYS, 1, 12), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_IMITATE, MZ_HUMAN), MR_SLEEP, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_HOSTILE|M2_STRONG|M2_COLLECT, M3_INFRAVISIBLE, HI_DOMESTIC), MON("mugger", S_HUMAN, LVL(2, 12, MARM(10,7), 0, -8), (G_GENO|G_NOGEN), A(ATTK(AT_WEAP, AD_PHYS, 1, 4), 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_HOSTILE|M2_COLLECT, M3_INFRAVISIBLE|M3_TRAITOR, CLR_BLACK), MON("nurse", S_HUMAN, LVL(11, 6, 0, 0, 0), (G_GENO|3), A(ATTK(AT_CLAW, AD_HEAL, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_NURSE, MZ_HUMAN), MR_POISON, MR_POISON, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_HOSTILE, M3_INFRAVISIBLE, HI_DOMESTIC), MON("gypsy", S_HUMAN, LVL(20, 12, -2, 90, 0), (G_GENO|2), A(ATTK(AT_CLAW, AD_CURS, 2,12), ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, sizeof(struct egyp), MS_GYPSY, MZ_HUMAN), MR_DEATH|MR_SLEEP|MR_POISON, 0, M1_HUMANOID|M1_REGEN|M1_SEE_INVIS|M1_TPORT|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_PEACEFUL|M2_STRONG|M2_GREEDY|M2_MAGIC, M3_TRAITOR, HI_DOMESTIC), MON("shopkeeper", S_HUMAN, LVL(24, 18, -6, 50, 0), G_NOGEN, A(ATTK(AT_WEAP, AD_PHYS, 4, 4), ATTK(AT_WEAP, AD_PHYS, 4, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, sizeof(struct eshk), MS_SELL, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_PEACEFUL|M2_STRONG|M2_COLLECT|M2_MAGIC, M3_INFRAVISIBLE, HI_DOMESTIC), #ifdef BLACKMARKET /* the black marketeer's speed (24) matches the speed boots he's wearing */ MON("black marketeer", S_HUMAN, LVL(25, 24, -8, 50, -2), G_NOGEN, A(ATTK(AT_WEAP, AD_PHYS, 4, 10), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, sizeof(struct eshk), MS_SELL, MZ_HUMAN), MR_DEATH|MR_FIRE|MR_COLD|MR_SLEEP|MR_ELEC|MR_STONE|MR_HITASFOUR, MR_SLEEP, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_PEACEFUL|M2_STRONG| M2_COLLECT|M2_MAGIC|M2_MALE, M3_INFRAVISIBLE, CLR_BLACK), #endif /* BLACKMARKET */ MON("guard", S_HUMAN, LVL(12, 12, 10, 40, 10), G_NOGEN, A(ATTK(AT_WEAP, AD_PHYS, 4,10), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, sizeof(struct egd), MS_GUARD, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_MERC|M2_PEACEFUL|M2_STRONG|M2_COLLECT, M3_INFRAVISIBLE, CLR_BLUE), MON("prisoner", S_HUMAN, LVL(12, 12, 10, 0, 0), G_NOGEN, /* for special levels */ A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_DJINNI, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_PEACEFUL|M2_STRONG|M2_COLLECT, M3_INFRAVISIBLE|M3_CLOSE, HI_DOMESTIC), MON("Oracle", S_HUMAN, LVL(12, 0, 0, 50, 0), (G_NOGEN|G_UNIQ), A(ATTK(AT_NONE, AD_MAGM, 0, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_ORACLE, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_PEACEFUL|M2_FEMALE, M3_INFRAVISIBLE, HI_ZAP), MON("aligned priest", S_HUMAN, LVL(12, 12, 10, 50, 0), G_NOGEN, A(ATTK(AT_WEAP, AD_PHYS, 4,10), ATTK(AT_KICK, AD_PHYS, 1, 4), ATTK(AT_MAGC, AD_CLRC, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, sizeof(struct epri), MS_PRIEST, MZ_HUMAN), MR_ELEC, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_LORD|M2_PEACEFUL|M2_COLLECT, M3_INFRAVISIBLE, CLR_WHITE), MON("high priest", S_HUMAN, LVL(25, 15, 7, 70, 0), (G_NOGEN|G_UNIQ), A(ATTK(AT_WEAP, AD_PHYS, 4,10), ATTK(AT_KICK, AD_PHYS, 2, 8), ATTK(AT_MAGC, AD_CLRC, 2, 8), ATTK(AT_MAGC, AD_CLRC, 2, 8), NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, sizeof(struct epri), MS_PRIEST, MZ_HUMAN), MR_FIRE|MR_ELEC|MR_SLEEP|MR_POISON, 0, M1_HUMANOID|M1_SEE_INVIS|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_MINION|M2_PRINCE|M2_NASTY|M2_COLLECT|M2_MAGIC, M3_INFRAVISIBLE, CLR_WHITE), /* #ifndef MUSE MON("unarmored watchman", S_HUMAN, LVL(6, 4, 10, 0, -2), 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_SOLDIER, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_MERC|M2_STALK|M2_PEACEFUL|M2_STRONG| M2_COLLECT, M3_INFRAVISIBLE, CLR_BROWN), #endif */ /* # ifndef MUSE MON("unarmored soldier", S_HUMAN, LVL(6, 4, 10, 0, -2), 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_SOLDIER, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_MERC|M2_STALK|M2_HOSTILE|M2_STRONG| M2_COLLECT, M3_INFRAVISIBLE, CLR_BROWN), # endif */ MON("soldier", S_HUMAN, LVL(6, 10, 10, 0, -2), (G_SGROUP|G_GENO|1), A(ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_SOLDIER, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_MERC|M2_STALK|M2_HOSTILE|M2_STRONG|M2_COLLECT, M3_INFRAVISIBLE, CLR_GRAY), MON("sergeant", S_HUMAN, LVL(8, 10, 10, 5, -3), (G_SGROUP|G_GENO|1), A(ATTK(AT_WEAP, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_SOLDIER, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_MERC|M2_STALK|M2_HOSTILE|M2_STRONG|M2_COLLECT, M3_INFRAVISIBLE, CLR_RED), MON("lieutenant", S_HUMAN, LVL(10, 10, 10, 15, -4), (G_GENO|1), A(ATTK(AT_WEAP, AD_PHYS, 3, 4), ATTK(AT_WEAP, AD_PHYS, 3, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_SOLDIER, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_MERC|M2_STALK|M2_HOSTILE|M2_STRONG|M2_COLLECT, M3_INFRAVISIBLE, CLR_GREEN), MON("captain", S_HUMAN, LVL(12, 10, 10, 15, -5), (G_GENO|1), A(ATTK(AT_WEAP, AD_PHYS, 4, 4), ATTK(AT_WEAP, AD_PHYS, 4, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_SOLDIER, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_MERC|M2_STALK|M2_HOSTILE|M2_STRONG|M2_COLLECT, M3_INFRAVISIBLE, CLR_BLUE), /* Keep these separate - some of the mkroom code assumes that * all the soldiers are contiguous. */ MON("watchman", S_HUMAN, LVL(6, 10, 10, 0, -2), (G_SGROUP|G_NOGEN|G_GENO|1), A(ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_SOLDIER, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_MERC|M2_STALK|M2_PEACEFUL|M2_STRONG|M2_COLLECT, M3_INFRAVISIBLE, CLR_GRAY), MON("watch captain", S_HUMAN, LVL(10, 10, 10, 15, -4), (G_NOGEN|G_GENO|1), A(ATTK(AT_WEAP, AD_PHYS, 3, 4), ATTK(AT_WEAP, AD_PHYS, 3, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_SOLDIER, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_MERC|M2_STALK|M2_PEACEFUL|M2_STRONG|M2_COLLECT, M3_INFRAVISIBLE, CLR_GREEN), /* Unique humans not tied to quests. */ 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, M1_FLY|M1_SWIM|M1_AMPHIBIOUS|M1_HUMANOID|M1_POIS|M1_OMNIVORE, M2_NOPOLY|M2_HOSTILE|M2_STRONG|M2_PNAME|M2_FEMALE, M3_WAITFORU|M3_INFRAVISIBLE, CLR_BRIGHT_GREEN), MON("Wizard of Yendor", S_HUMAN, LVL(30, 12, -8, 100, A_NONE), (G_NOGEN|G_UNIQ), A(ATTK(AT_CLAW, AD_SAMU, 2,12), ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_CUSS, MZ_HUMAN), MR_FIRE|MR_POISON, MR_FIRE|MR_POISON, M1_FLY|M1_BREATHLESS|M1_HUMANOID|M1_REGEN|M1_SEE_INVIS|M1_TPORT| M1_TPORT_CNTRL|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_HOSTILE|M2_STRONG|M2_NASTY| M2_PRINCE|M2_MALE|M2_MAGIC, M3_COVETOUS|M3_WAITFORU|M3_INFRAVISIBLE, HI_LORD), MON("Croesus", S_HUMAN, LVL(20, 15, 0, 40, 15), (G_UNIQ|G_NOGEN), A(ATTK(AT_WEAP, AD_PHYS, 4,10), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_GUARD, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_SEE_INVIS|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_STALK|M2_HOSTILE|M2_STRONG|M2_NASTY|M2_PNAME| M2_PRINCE|M2_MALE|M2_GREEDY|M2_JEWELS|M2_COLLECT|M2_MAGIC, M3_INFRAVISIBLE, HI_LORD), #ifdef CHARON MON("Charon", S_HUMAN, LVL(76, 18, -5, 120, 0), (G_HELL|G_NOCORPSE|G_NOGEN|G_UNIQ), A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_TUCH, AD_PLYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_FERRY, MZ_HUMAN), MR_FIRE|MR_COLD|MR_POISON|MR_STONE, 0, M1_BREATHLESS|M1_SEE_INVIS|M1_HUMANOID, M2_NOPOLY|M2_HUMAN|M2_PEACEFUL|M2_PNAME|M2_MALE|M2_GREEDY|M2_COLLECT, M3_INFRAVISIBLE, CLR_WHITE), #endif /* * ghosts */ MON("shadow", S_GHOST, LVL(4, 9, 4, 0, 0), (G_NOCORPSE|G_NOGEN), A(ATTK(AT_TUCH, AD_DRST, 1, 4), ATTK(AT_TUCH, AD_COLD, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 0, 0, MS_WAIL, MZ_HUMAN), MR_COLD|MR_DISINT|MR_SLEEP|MR_POISON|MR_STONE, 0, M1_FLY|M1_BREATHLESS|M1_WALLWALK|M1_HUMANOID|M1_SEE_INVIS, M2_NOPOLY|M2_UNDEAD|M2_WANDER|M2_HOSTILE|M2_NASTY, 0, CLR_BLACK), MON("ghost", S_GHOST, LVL(10, 3, -5, 50, -5), (G_NOCORPSE|G_NOGEN), A(ATTK(AT_TUCH, AD_PHYS, 1, 1), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 0, 0, MS_SILENT, MZ_HUMAN), MR_COLD|MR_DISINT|MR_SLEEP|MR_POISON|MR_STONE, 0, M1_FLY|M1_BREATHLESS|M1_WALLWALK|M1_HUMANOID|M1_UNSOLID, M2_NOPOLY|M2_UNDEAD|M2_STALK|M2_HOSTILE, M3_INFRAVISION, CLR_GRAY), MON("shade", S_GHOST, LVL(12, 10, 10, 0, 0), (G_NOCORPSE|G_NOGEN), A(ATTK(AT_TUCH, AD_PLYS, 2, 6), ATTK(AT_TUCH, AD_SLOW, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 0, 0, MS_WAIL, MZ_HUMAN), MR_COLD|MR_DISINT|MR_SLEEP|MR_POISON|MR_STONE, 0, M1_FLY|M1_BREATHLESS|M1_WALLWALK|M1_HUMANOID|M1_UNSOLID|M1_SEE_INVIS, M2_NOPOLY|M2_UNDEAD|M2_WANDER|M2_STALK|M2_HOSTILE|M2_NASTY, M3_INFRAVISION, CLR_BLACK), /* * (major) demons */ MON("water demon", S_DEMON, LVL(8, 12,-4, 30, -7), (G_NOCORPSE|G_NOGEN), A(ATTK(AT_WEAP, AD_PHYS, 1, 3), ATTK(AT_CLAW, AD_PHYS, 1, 3), ATTK(AT_BITE, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_DJINNI, MZ_HUMAN), MR_FIRE|MR_POISON, 0, M1_HUMANOID|M1_POIS|M1_SWIM, M2_NOPOLY|M2_DEMON|M2_STALK|M2_HOSTILE|M2_NASTY|M2_COLLECT, M3_INFRAVISIBLE|M3_INFRAVISION, CLR_BLUE), /* standard demons & devils */ MON("horned devil", S_DEMON, LVL(6, 9, -5, 50, 11), (G_HELL|G_NOCORPSE|2), A(ATTK(AT_WEAP, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_BITE, AD_PHYS, 2, 3), ATTK(AT_STNG, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_SILENT, MZ_HUMAN), MR_FIRE|MR_POISON, 0, M1_POIS|M1_THICK_HIDE, M2_DEMON|M2_STALK|M2_HOSTILE|M2_NASTY, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, CLR_BROWN), MON("spined devil", S_DEMON, LVL(5, 18, 1, 45, 7), (G_HELL|G_LGROUP|G_NOCORPSE|2), A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_CLAW, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_SILENT, MZ_HUMAN), MR_DEATH|MR_FIRE|MR_POISON|MR_PLUSONE, 0, M1_FLY|M1_POIS|M1_THICK_HIDE, M2_DEMON|M2_STALK|M2_HOSTILE|M2_NASTY, M3_TRAITOR, CLR_GREEN), MON("bearded devil", S_DEMON, LVL(8, 15, 1, 45, 7), (G_HELL|G_NOCORPSE|1), A(ATTK(AT_WEAP, AD_PHYS, 1, 10), ATTK(AT_WEAP, AD_PHYS, 1, 10), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_SILENT, MZ_HUMAN), MR_DEATH|MR_FIRE|MR_POISON|MR_PLUSONE|MR_HITASTWO, 0, M1_POIS|M1_THICK_HIDE, M2_DEMON|M2_STALK|M2_HOSTILE|M2_NASTY, M3_TRAITOR, CLR_BLACK), #ifdef SEDUCE # define SEDUCTION_ATTACKS \ A(ATTK(AT_BITE, AD_SSEX, 0, 0), ATTK(AT_CLAW, AD_PHYS, 1, 3), \ ATTK(AT_CLAW, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK) #else # define SEDUCTION_ATTACKS \ A(ATTK(AT_CLAW, AD_PHYS, 1, 3), ATTK(AT_CLAW, AD_PHYS, 1, 3), \ ATTK(AT_BITE, AD_DRLI, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK) #endif MON("succubus", S_DEMON, LVL(6, 12, 0, 70, -9), (G_NOCORPSE|2), SEDUCTION_ATTACKS, SIZ(WT_HUMAN, 400, 0, MS_SEDUCE, MZ_HUMAN), MR_FIRE|MR_POISON, 0, M1_HUMANOID|M1_FLY|M1_POIS, M2_DEMON|M2_STALK|M2_HOSTILE|M2_NASTY|M2_FEMALE, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, CLR_GRAY), MON("incubus", S_DEMON, LVL(6, 12, 0, 70, -9), (G_NOCORPSE|2), SEDUCTION_ATTACKS, SIZ(WT_HUMAN, 400, 0, MS_SEDUCE, MZ_HUMAN), MR_FIRE|MR_POISON, 0, M1_HUMANOID|M1_FLY|M1_POIS, M2_DEMON|M2_STALK|M2_HOSTILE|M2_NASTY|M2_MALE, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, CLR_GRAY), #undef SEDUCTION_ATTACKS /* Used by AD&D for a type of demon, originally one of the Furies */ /* and spelled this way */ MON("erinys", S_DEMON, LVL(7, 12, 2, 30, 10), (G_HELL|G_NOCORPSE|G_SGROUP|1), A(ATTK(AT_WEAP, AD_DRST, 2, 4), 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), A(ATTK(AT_CLAW, AD_PHYS, 2, 4), ATTK(AT_CLAW, AD_PHYS, 2, 4), ATTK(AT_STNG, AD_PHYS, 3, 4), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_SILENT, MZ_HUMAN), MR_FIRE|MR_POISON, 0, M1_POIS|M1_THICK_HIDE, M2_DEMON|M2_STALK|M2_HOSTILE|M2_NASTY, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, CLR_RED), 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, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, CLR_RED), MON("bar-lgura", S_DEMON, LVL(7, 15, -3, 45, -9), (G_HELL|G_NOCORPSE|G_SGROUP|1), A(ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_BITE, AD_PHYS, 2, 12), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_SILENT, MZ_LARGE), MR_DEATH|MR_FIRE|MR_POISON|MR_PLUSONE|MR_HITASTWO, 0, M1_POIS, M2_DEMON|M2_STALK|M2_HOSTILE|M2_NASTY, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, CLR_ORANGE), MON("chasme", S_DEMON, LVL(8, 21, -1, 40, -9), (G_HELL|G_NOCORPSE|G_SGROUP|1), A(ATTK(AT_CLAW, AD_PHYS, 2, 6), ATTK(AT_CLAW, AD_PHYS, 2, 6), ATTK(AT_BITE, AD_PHYS, 2, 4), ATTK(AT_GAZE, AD_SLEE, 1, 6), NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_SILENT, MZ_MEDIUM), MR_DEATH|MR_FIRE|MR_POISON|MR_PLUSONE|MR_HITASTWO, 0, M1_POIS|M1_FLY, M2_DEMON|M2_STALK|M2_HOSTILE|M2_NASTY, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, CLR_CYAN), MON("vrock", S_DEMON, LVL(8, 12, 0, 50, -9), (G_HELL|G_NOCORPSE|G_SGROUP|2), A(ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 8), ATTK(AT_CLAW, AD_PHYS, 1, 8), ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_SILENT, MZ_LARGE), MR_FIRE|MR_POISON, 0, M1_POIS, M2_DEMON|M2_STALK|M2_HOSTILE|M2_NASTY, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, CLR_RED), MON("babau", S_DEMON, LVL(9, 15, -3, 50, -9), (G_HELL|G_NOCORPSE|G_SGROUP|1), A(ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_GAZE, AD_DRST, 1, 8), ATTK(AT_BITE, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_SILENT, MZ_LARGE), MR_DEATH|MR_FIRE|MR_POISON|MR_PLUSONE|MR_HITASTWO, 0, M1_POIS, M2_DEMON|M2_STALK|M2_HOSTILE|M2_NASTY, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, CLR_BLACK), MON("hezrou", S_DEMON, LVL(9, 6, -2, 55, -10), (G_HELL|G_NOCORPSE|G_SGROUP|2), A(ATTK(AT_CLAW, AD_PHYS, 1, 3), ATTK(AT_CLAW, AD_PHYS, 1, 3), ATTK(AT_BITE, AD_PHYS, 4, 4), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_SILENT, MZ_LARGE), MR_FIRE|MR_POISON, 0, M1_HUMANOID|M1_POIS, M2_DEMON|M2_STALK|M2_HOSTILE|M2_NASTY, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, CLR_RED), MON("bone devil", S_DEMON, LVL(9, 15, -1, 40, -9), (G_HELL|G_NOCORPSE|G_SGROUP|2), A(ATTK(AT_WEAP, AD_PHYS, 3, 4), ATTK(AT_STNG, AD_DRST, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_SILENT, MZ_LARGE), MR_FIRE|MR_POISON, 0, M1_POIS, M2_DEMON|M2_STALK|M2_HOSTILE|M2_NASTY|M2_COLLECT, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, CLR_GRAY), MON("ice devil", S_DEMON, LVL(11, 6, -4, 55, -12), (G_HELL|G_NOCORPSE|2), A(ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_BITE, AD_PHYS, 2, 4), ATTK(AT_STNG, AD_COLD, 3, 4), NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_SILENT, MZ_LARGE), MR_FIRE|MR_COLD|MR_POISON, 0, M1_SEE_INVIS|M1_POIS, M2_DEMON|M2_STALK|M2_HOSTILE|M2_NASTY, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, CLR_WHITE), MON("nalfeshnee", S_DEMON, LVL(11, 9, -1, 65, -11), (G_HELL|G_NOCORPSE|1), A(ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_BITE, AD_PHYS, 2, 4), ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_SPELL, MZ_LARGE), MR_FIRE|MR_POISON, 0, M1_HUMANOID|M1_POIS, M2_DEMON|M2_STALK|M2_HOSTILE|M2_NASTY, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, CLR_RED), MON("nabassu", S_DEMON, LVL(9, 15, -5, 50, -11), (G_HELL|G_NOCORPSE|1), A(ATTK(AT_CLAW, AD_PHYS, 2, 4), ATTK(AT_CLAW, AD_PHYS, 2, 4), ATTK(AT_BITE, AD_DRLI, 3, 4), ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_SILENT, MZ_LARGE), MR_DEATH|MR_FIRE|MR_POISON|MR_PLUSONE|MR_HITASTHREE, 0, M1_HUMANOID|M1_POIS|M1_FLY, M2_DEMON|M2_STALK|M2_HOSTILE|M2_NASTY, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, CLR_BLACK), MON("pit fiend", S_DEMON, LVL(13, 6, -3, 65, -13), (G_HELL|G_NOCORPSE|2), A(ATTK(AT_WEAP, AD_PHYS, 4, 2), ATTK(AT_WEAP, AD_PHYS, 4, 2), ATTK(AT_HUGS, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_GROWL, MZ_LARGE), MR_FIRE|MR_POISON, 0, M1_SEE_INVIS|M1_POIS, M2_DEMON|M2_STALK|M2_HOSTILE|M2_NASTY|M2_COLLECT, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, CLR_RED), MON("balrog", S_DEMON, LVL(16, 5, -2, 75, -14), (G_HELL|G_NOCORPSE|1), A(ATTK(AT_WEAP, AD_PHYS, 8, 4), ATTK(AT_WEAP, AD_PHYS, 4, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_SILENT, MZ_LARGE), MR_FIRE|MR_POISON, 0, M1_FLY|M1_SEE_INVIS|M1_POIS, M2_DEMON|M2_STALK|M2_HOSTILE|M2_STRONG|M2_NASTY|M2_COLLECT, M3_INFRAVISIBLE|M3_INFRAVISION|M3_TRAITOR, CLR_RED), /* Named demon lords & princes plus Arch-Devils. * (their order matters; see minion.c) */ MON("Juiblex", S_DEMON, LVL(50, 3, -7, 65, -15), (G_HELL|G_NOCORPSE|G_NOGEN|G_UNIQ), A(ATTK(AT_ENGL, AD_DISE, 4,10), ATTK(AT_SPIT, AD_ACID, 3, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1500, 0, 0, MS_GURGLE, MZ_LARGE), MR_FIRE|MR_POISON|MR_ACID|MR_STONE, 0, M1_AMPHIBIOUS|M1_AMORPHOUS|M1_NOHEAD|M1_FLY|M1_SEE_INVIS|M1_ACID| M1_POIS, M2_NOPOLY|M2_DEMON|M2_STALK|M2_HOSTILE|M2_PNAME|M2_NASTY|M2_LORD| M2_MALE, M3_WAITFORU|M3_WANTSAMUL|M3_INFRAVISION, CLR_BRIGHT_GREEN), 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, M2_NOPOLY|M2_DEMON|M2_STALK|M2_HOSTILE|M2_PNAME|M2_NASTY|M2_LORD| M2_MALE|M2_COLLECT, M3_WAITFORU|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, M2_NOPOLY|M2_DEMON|M2_STALK|M2_HOSTILE|M2_PNAME|M2_NASTY|M2_PRINCE| M2_MALE|M2_COLLECT, M3_WAITFORU|M3_WANTSBOOK|M3_WANTSAMUL|M3_INFRAVISIBLE|M3_INFRAVISION, HI_LORD), MON("Geryon", S_DEMON, LVL(72, 3, -3, 75, 15), (G_HELL|G_NOCORPSE|G_NOGEN|G_UNIQ), A(ATTK(AT_CLAW, AD_PHYS, 3, 6), ATTK(AT_CLAW, AD_PHYS, 3, 6), ATTK(AT_STNG, AD_DRST, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1500, 500, 0, MS_BRIBE, MZ_HUGE), MR_FIRE|MR_POISON, 0, M1_FLY|M1_SEE_INVIS|M1_POIS|M1_SLITHY, M2_NOPOLY|M2_DEMON|M2_STALK|M2_HOSTILE|M2_PNAME|M2_NASTY| M2_PRINCE|M2_MALE, M3_WAITFORU|M3_WANTSAMUL|M3_INFRAVISIBLE|M3_INFRAVISION, HI_LORD), MON("Dispater", S_DEMON, LVL(78, 15, -2, 80, 15), (G_HELL|G_NOCORPSE|G_NOGEN|G_UNIQ), A(ATTK(AT_WEAP, AD_PHYS, 4, 6), ATTK(AT_MAGC, AD_SPEL, 6, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1500, 500, 0, MS_BRIBE, MZ_HUMAN), MR_FIRE|MR_POISON, 0, M1_FLY|M1_SEE_INVIS|M1_POIS|M1_HUMANOID, M2_NOPOLY|M2_DEMON|M2_STALK|M2_HOSTILE|M2_PNAME|M2_NASTY| M2_PRINCE|M2_MALE|M2_COLLECT, M3_WAITFORU|M3_WANTSAMUL|M3_INFRAVISIBLE|M3_INFRAVISION, HI_LORD), MON("Baalzebub", S_DEMON, LVL(89, 9, -5, 85, 20), (G_HELL|G_NOCORPSE|G_NOGEN|G_UNIQ), A(ATTK(AT_BITE, AD_DRST, 2, 6), ATTK(AT_GAZE, AD_STUN, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1500, 500, 0, MS_BRIBE, MZ_LARGE), MR_FIRE|MR_POISON, 0, M1_FLY|M1_SEE_INVIS|M1_POIS, M2_NOPOLY|M2_DEMON|M2_STALK|M2_HOSTILE|M2_PNAME|M2_NASTY| M2_PRINCE|M2_MALE, M3_WANTSAMUL|M3_WAITFORU|M3_INFRAVISIBLE|M3_INFRAVISION, HI_LORD), MON("Asmodeus", S_DEMON, LVL(105, 12, -7, 90, 20), (G_HELL|G_NOCORPSE|G_NOGEN|G_UNIQ), A(ATTK(AT_CLAW, AD_PHYS, 4, 4), ATTK(AT_MAGC, AD_COLD, 6, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1500, 500, 0, MS_BRIBE, MZ_HUGE), MR_FIRE|MR_COLD|MR_POISON, 0, M1_FLY|M1_SEE_INVIS|M1_HUMANOID|M1_POIS, M2_NOPOLY|M2_DEMON|M2_STALK|M2_HOSTILE|M2_PNAME|M2_STRONG| M2_NASTY|M2_PRINCE|M2_MALE, M3_WANTSAMUL|M3_WAITFORU|M3_INFRAVISIBLE|M3_INFRAVISION, HI_LORD), MON("Demogorgon", S_DEMON, LVL(106, 15, -8, 95, -20), (G_HELL|G_NOCORPSE|G_NOGEN|G_UNIQ), A(ATTK(AT_MAGC, AD_SPEL, 8, 6), ATTK(AT_STNG, AD_DRLI, 1, 4), ATTK(AT_CLAW, AD_DISE, 1, 6), ATTK(AT_CLAW, AD_DISE, 1, 6), NO_ATTK, NO_ATTK), SIZ(1500, 500, 0, MS_GROWL, MZ_HUGE), MR_FIRE|MR_POISON, 0, M1_FLY|M1_SEE_INVIS|M1_NOHANDS|M1_POIS, M2_NOPOLY|M2_DEMON|M2_STALK|M2_HOSTILE|M2_PNAME|M2_NASTY| M2_PRINCE|M2_MALE, M3_WAITFORU|M3_WANTSAMUL|M3_INFRAVISIBLE|M3_INFRAVISION, HI_LORD), /* Cthulhu MUST be placed after Demogorgon so he will not be summoned as a random demon lord or demon prince. See minion.c */ MON("Cthulhu", S_DEMON, LVL(106, 18, -15, 95, 0), (G_HELL|G_NOCORPSE|G_NOGEN|G_UNIQ), A(ATTK(AT_MAGC, AD_CLRC, 4, 6), ATTK(AT_CLAW, AD_PHYS, 6, 8), ATTK(AT_BITE, AD_PHYS, 4, 10), ATTK(AT_HUGS, AD_PHYS, 6, 6), ATTK(AT_TENT, AD_DRIN, 2, 1), ATTK(AT_GAZE, AD_CONF, 0, 0)), SIZ(3000, 500, 0, MS_ROAR, MZ_GIGANTIC), MR_POISON|MR_STONE|MR_DISINT|MR_SLEEP|MR_ACID, 0, M1_SWIM|M1_AMPHIBIOUS|M1_BREATHLESS|M1_THICK_HIDE|M1_SEE_INVIS| M1_NOHANDS|M1_POIS, M2_NOPOLY|M2_DEMON|M2_STALK|M2_HOSTILE|M2_PNAME|M2_NASTY|M2_STRONG| M2_PRINCE|M2_NEUTER, M3_WAITFORU|M3_INFRAVISION|M3_NOTAME, HI_LORD), /* Riders -- the Four Horsemen of the Apocalypse ("War" == player) */ MON("Death", S_DEMON, LVL(30, 12, -5, 100, 0), (G_UNIQ|G_NOGEN), A(ATTK(AT_TUCH, AD_DETH, 8, 8), ATTK(AT_TUCH, AD_DETH, 8, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 1, 0, MS_RIDER, MZ_HUMAN), MR_FIRE|MR_COLD|MR_ELEC|MR_SLEEP|MR_POISON|MR_STONE, 0, M1_FLY|M1_HUMANOID|M1_REGEN|M1_SEE_INVIS|M1_TPORT_CNTRL, M2_NOPOLY|M2_STALK|M2_HOSTILE|M2_PNAME|M2_STRONG|M2_NASTY, M3_INFRAVISIBLE|M3_INFRAVISION, HI_LORD), MON("Pestilence", S_DEMON, LVL(30, 12, -5, 100, 0), (G_UNIQ|G_NOGEN), A(ATTK(AT_TUCH, AD_PEST, 8, 8), ATTK(AT_TUCH, AD_PEST, 8, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 1, 0, MS_RIDER, MZ_HUMAN), MR_FIRE|MR_COLD|MR_ELEC|MR_SLEEP|MR_POISON|MR_STONE, 0, M1_FLY|M1_HUMANOID|M1_REGEN|M1_SEE_INVIS|M1_TPORT_CNTRL, M2_NOPOLY|M2_STALK|M2_HOSTILE|M2_PNAME|M2_STRONG|M2_NASTY, M3_INFRAVISIBLE|M3_INFRAVISION, HI_LORD), MON("Famine", S_DEMON, LVL(30, 12, -5, 100, 0), (G_UNIQ|G_NOGEN), A(ATTK(AT_TUCH, AD_FAMN, 8, 8), ATTK(AT_TUCH, AD_FAMN, 8, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 1, 0, MS_RIDER, MZ_HUMAN), MR_FIRE|MR_COLD|MR_ELEC|MR_SLEEP|MR_POISON|MR_STONE, 0, M1_FLY|M1_HUMANOID|M1_REGEN|M1_SEE_INVIS|M1_TPORT_CNTRL, M2_NOPOLY|M2_STALK|M2_HOSTILE|M2_PNAME|M2_STRONG|M2_NASTY, M3_INFRAVISIBLE|M3_INFRAVISION, HI_LORD), /* other demons */ #ifdef MAIL MON("mail daemon", S_DEMON, LVL(56, 24, 10, 127, 0), (G_NOGEN|G_NOCORPSE), A(NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(600, 300, 0, MS_SILENT, MZ_HUMAN), MR_FIRE|MR_COLD|MR_ELEC|MR_SLEEP|MR_POISON|MR_STONE, 0, M1_FLY|M1_SWIM|M1_BREATHLESS|M1_SEE_INVIS|M1_HUMANOID|M1_POIS, M2_NOPOLY|M2_STALK|M2_PEACEFUL, M3_INFRAVISIBLE|M3_INFRAVISION, CLR_BRIGHT_BLUE), /* Neither rain nor sleet nor gloom of night shall stay this courier... */ #endif MON("djinni", S_DEMON, LVL(7, 12, 4, 30, 0), (G_NOGEN|G_NOCORPSE), A(ATTK(AT_WEAP, AD_PHYS, 2, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1500, 400, 0, MS_DJINNI, MZ_HUMAN), MR_POISON|MR_STONE, 0, M1_HUMANOID|M1_FLY|M1_POIS, M2_NOPOLY|M2_STALK|M2_COLLECT, M3_INFRAVISIBLE, CLR_YELLOW), #if 0 /* KMH -- Redundant djinni types removed * These were causing problems with the djinni chances. Since * they are basically different names for the same monster, why * should we keep them? */ MON("efreeti", S_DEMON, LVL(7, 12, 4, 30, 0), (G_NOGEN|G_NOCORPSE), A(ATTK(AT_WEAP, AD_PHYS, 2, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1500, 400, 0, MS_DJINNI, MZ_HUMAN), MR_POISON|MR_STONE| MR_FIRE|MR_ELEC, 0, M1_HUMANOID|M1_FLY|M1_POIS, M2_NOPOLY|M2_STALK|M2_COLLECT, 0, CLR_RED), MON("dao", S_DEMON, LVL(7, 12, 4, 30, 0), (G_NOGEN|G_NOCORPSE), A(ATTK(AT_WEAP, AD_PHYS, 2, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1500, 400, 0, MS_DJINNI, MZ_HUMAN), MR_POISON|MR_STONE, 0, M1_HUMANOID|M1_FLY|M1_POIS, M2_NOPOLY|M2_STALK|M2_COLLECT, 0, CLR_BROWN), MON("marid", S_DEMON, LVL(7, 12, 4, 30, 0), (G_NOGEN|G_NOCORPSE), A(ATTK(AT_WEAP, AD_PHYS, 2, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1500, 400, 0, MS_DJINNI, MZ_HUMAN), MR_COLD|MR_POISON|MR_STONE, 0, M1_HUMANOID|M1_FLY|M1_POIS, M2_NOPOLY|M2_STALK|M2_COLLECT, 0, CLR_BLUE), #endif MON("sandestin", S_DEMON, LVL(13, 12, 4, 60, -5), (G_HELL|G_NOCORPSE|1), A(ATTK(AT_WEAP, AD_PHYS, 2, 6), ATTK(AT_WEAP, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1500, 400, 0, MS_CUSS, MZ_HUMAN), MR_STONE, 0, M1_HUMANOID, M2_NOPOLY|M2_STALK|M2_STRONG|M2_COLLECT, M3_INFRAVISIBLE|M3_INFRAVISION, CLR_GRAY), /* * sea monsters */ MON("jellyfish", S_EEL, LVL(3, 3, 6, 0, 0), (G_GENO|G_NOGEN), A(ATTK(AT_STNG, AD_DRST, 3, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(80, 20, 0, MS_SILENT, MZ_SMALL), MR_POISON, MR_POISON, M1_SWIM|M1_AMPHIBIOUS|M1_SLITHY|M1_NOLIMBS|M1_NOTAKE|M1_POIS, M2_HOSTILE, 0, CLR_BLUE), MON("piranha", S_EEL, LVL(5, 12, 4, 0, 0), (G_GENO|G_NOGEN|G_SGROUP), A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(60, 30, 0, MS_SILENT, MZ_SMALL), 0, 0, M1_SWIM|M1_AMPHIBIOUS|M1_ANIMAL|M1_SLITHY|M1_NOLIMBS| M1_CARNIVORE|M1_OVIPAROUS|M1_NOTAKE, M2_HOSTILE, 0, CLR_RED), MON("giant eel", S_EEL, LVL(5, 9, -1, 0, 0), (G_GENO|G_NOGEN), A(ATTK(AT_BITE, AD_PHYS, 3, 6), ATTK(AT_TUCH, AD_WRAP, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(200, 250, 0, MS_SILENT, MZ_HUGE), 0, 0, M1_SWIM|M1_AMPHIBIOUS|M1_ANIMAL|M1_SLITHY|M1_NOLIMBS| M1_CARNIVORE|M1_OVIPAROUS|M1_NOTAKE, M2_HOSTILE, M3_INFRAVISIBLE, CLR_CYAN), MON("shark", S_EEL, LVL(7, 12, 2, 0, 0), (G_GENO|G_NOGEN), A(ATTK(AT_BITE, AD_PHYS, 5, 6), NO_ATTK, 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 crab", S_EEL, LVL(7, 12, 0, 0, 0), (G_GENO|G_NOGEN), A(ATTK(AT_CLAW, AD_PHYS, 3, 6), ATTK(AT_CLAW, AD_PHYS, 3, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(500, 350, 0, MS_SILENT, MZ_HUGE), 0, 0, M1_SWIM|M1_AMPHIBIOUS|M1_ANIMAL|M1_OVIPAROUS, M2_HOSTILE, 0, CLR_GREEN), MON("electric eel", S_EEL, LVL(7, 10, -3, 0, 0), (G_GENO|G_NOGEN), A(ATTK(AT_BITE, AD_ELEC, 4, 6), ATTK(AT_TUCH, AD_WRAP, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(200, 250, 0, MS_SILENT, MZ_HUGE), MR_ELEC, MR_ELEC, M1_SWIM|M1_AMPHIBIOUS|M1_ANIMAL|M1_SLITHY|M1_NOLIMBS| M1_CARNIVORE|M1_OVIPAROUS|M1_NOTAKE, M2_HOSTILE, M3_INFRAVISIBLE, CLR_BRIGHT_BLUE), MON("kraken", S_EEL, LVL(20, 3, 6, 0, -3), (G_GENO|G_NOGEN), A(ATTK(AT_CLAW, AD_PHYS, 2, 4), ATTK(AT_CLAW, AD_PHYS, 2, 4), ATTK(AT_HUGS, AD_WRAP, 2, 6), ATTK(AT_BITE, AD_PHYS, 5, 4), NO_ATTK, NO_ATTK), SIZ(1800, 1000, 0, MS_SILENT, MZ_HUGE), 0, 0, M1_SWIM|M1_AMPHIBIOUS|M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_NOPOLY|M2_HOSTILE|M2_STRONG, M3_INFRAVISIBLE, CLR_RED), /* * lizards, &c */ MON("newt", S_LIZARD, LVL(0, 6, 8, 0, 0), (G_GENO|5), A(ATTK(AT_BITE, AD_PHYS, 1, 2), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(10, 20, 0, MS_SILENT, MZ_TINY), 0, 0, M1_SWIM|M1_AMPHIBIOUS|M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE, 0, CLR_YELLOW), MON("gecko", S_LIZARD, LVL(1, 6, 8, 0, 0), (G_GENO|5), A(ATTK(AT_BITE, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(10, 20, 0, MS_SQEEK, MZ_TINY), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE, 0, CLR_GREEN), MON("iguana", S_LIZARD, LVL(2, 6, 7, 0, 0), (G_GENO|5), A(ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(30, 30, 0, MS_SILENT, MZ_TINY), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE, 0, CLR_BROWN), MON("baby crocodile", S_LIZARD, LVL(3, 6, 7, 0, 0), G_GENO, A(ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(200, 200, 0, MS_SILENT, MZ_MEDIUM), 0, 0, M1_SWIM|M1_AMPHIBIOUS|M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE, 0, CLR_BROWN), MON("lizard", S_LIZARD, LVL(5, 6, 6, 10, 0), (G_GENO|5), A(ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(10, 40, 0, MS_SILENT, MZ_TINY), MR_STONE, MR_STONE, M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE, 0, CLR_GREEN), MON("gila monster", S_LIZARD, LVL(6, 6, 6, 10, 0), (G_NOHELL|G_GENO|1), A(ATTK(AT_BITE, AD_DRST, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(10, 40, 0, MS_SILENT, MZ_TINY), MR_POISON, 0, M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE, 0, CLR_ORANGE), MON("chameleon", S_LIZARD, LVL(6, 5, 6, 10, 0), (G_GENO|2), A(ATTK(AT_BITE, AD_PHYS, 4, 2), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(100, 100, 0, MS_SILENT, MZ_TINY), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_NOPOLY|M2_HOSTILE, 0, CLR_BROWN), MON("crocodile", S_LIZARD, LVL(6, 9, 5, 0, 0), (G_GENO|1), A(ATTK(AT_BITE, AD_PHYS, 4, 2), ATTK(AT_CLAW, AD_PHYS, 1,12), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_SILENT, MZ_LARGE), 0, 0, M1_SWIM|M1_AMPHIBIOUS|M1_ANIMAL|M1_THICK_HIDE|M1_NOHANDS| M1_OVIPAROUS|M1_CARNIVORE, M2_STRONG|M2_HOSTILE, 0, CLR_BROWN), MON("salamander", S_LIZARD, LVL(8, 12, -1, 0, -9), (G_HELL|1), A(ATTK(AT_WEAP, AD_PHYS, 2, 8), ATTK(AT_TUCH, AD_FIRE, 1, 6), ATTK(AT_HUGS, AD_PHYS, 2, 6), ATTK(AT_HUGS, AD_FIRE, 3, 6), NO_ATTK, NO_ATTK), SIZ(1500, 400, 0, MS_MUMBLE, MZ_HUMAN), MR_SLEEP|MR_FIRE, MR_FIRE, M1_HUMANOID|M1_SLITHY|M1_THICK_HIDE|M1_POIS, M2_STALK|M2_HOSTILE|M2_COLLECT|M2_MAGIC, M3_INFRAVISIBLE, CLR_ORANGE), MON("rhaumbusun", S_LIZARD, LVL(2, 9, 5, 0, 0), (G_HELL|G_GENO|1), A(ATTK(AT_GAZE, AD_PLYS, 1, 2), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(20, 40, 0, MS_SILENT, MZ_TINY), MR_POISON, MR_POISON, M1_ANIMAL|M1_THICK_HIDE|M1_NOHANDS| M1_OVIPAROUS|M1_CARNIVORE, M2_NASTY|M2_HOSTILE, 0, CLR_MAGENTA), MON("basilisk", S_LIZARD, LVL(8, 9, 5, 0, 0), (G_GENO|1), A(ATTK(AT_BITE, AD_STON, 4, 2), ATTK(AT_NONE, AD_STON, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_SILENT, MZ_LARGE), MR_POISON|MR_STONE, MR_POISON|MR_STONE, M1_ANIMAL|M1_THICK_HIDE|M1_NOHANDS| M1_OVIPAROUS|M1_CARNIVORE, M2_STRONG|M2_HOSTILE, 0, CLR_BLACK), MON("komodo dragon", S_LIZARD, LVL(9, 9, 5, 0, 0), (G_NOHELL|G_GENO|1), A(ATTK(AT_BITE, AD_DRCO, 2, 6), ATTK(AT_CLAW, AD_PHYS, 1, 12), ATTK(AT_CLAW, AD_PHYS, 1, 12), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_SILENT, MZ_LARGE), 0, 0, M1_ANIMAL|M1_THICK_HIDE|M1_NOHANDS| M1_OVIPAROUS|M1_CARNIVORE, M2_STRONG|M2_HOSTILE, 0, CLR_GREEN), /* evil food */ /* WAC moved Evil Food here - otherwise won't get generated */ MON("bad egg", S_BAD_FOOD, LVL(4, 9, 7, 0, 0), (G_NOHELL|G_GENO|G_NOCORPSE), A(ATTK(AT_BITE, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(0, 0, 0, MS_SILENT, MZ_SMALL), 0, 0, M1_BREATHLESS|M1_NOEYES|M1_NOHEAD|M1_MINDLESS| M1_NOLIMBS|M1_CARNIVORE, M2_HOSTILE, 0, CLR_WHITE), MON("killer tripe ration", S_BAD_FOOD, LVL(7, 9, 7, 0, 0), (G_NOHELL|G_GENO|G_NOCORPSE), A(ATTK(AT_BITE, AD_PHYS, 2, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(0, 0, 0, MS_SILENT, MZ_SMALL), 0, 0, M1_BREATHLESS|M1_NOEYES|M1_NOHEAD|M1_MINDLESS| M1_NOLIMBS|M1_CARNIVORE, M2_HOSTILE, 0, CLR_BROWN), MON("killer food ration", S_BAD_FOOD, LVL(9, 9, 7, 0, 0), (G_NOHELL|G_GENO|G_NOCORPSE), A(ATTK(AT_BITE, AD_PHYS, 2, 10), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(0, 0, 0, MS_SILENT, MZ_SMALL), 0, 0, M1_BREATHLESS|M1_NOEYES|M1_NOHEAD|M1_MINDLESS| M1_NOLIMBS|M1_CARNIVORE, M2_HOSTILE, 0, CLR_BROWN), /* evil coins */ MON("pile of killer coins", S_BAD_COINS, LVL(6, 9, 7, 0, 0), (G_NOHELL|G_GENO|G_NOCORPSE), A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(0, 0, 0, MS_SILENT, MZ_SMALL), 0, 0, M1_BREATHLESS|M1_NOEYES|M1_NOHEAD|M1_MINDLESS | M1_NOLIMBS|M1_CARNIVORE, M2_HOSTILE, 0, CLR_YELLOW), MON("large pile of killer coins", S_BAD_COINS, LVL(9, 12, 7, 0, 0), (G_NOHELL|G_GENO|G_NOCORPSE), A(ATTK(AT_BITE, AD_PHYS, 3, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(0, 0, 0, MS_SILENT, MZ_SMALL), 0, 0, M1_BREATHLESS|M1_NOEYES|M1_NOHEAD|M1_MINDLESS| M1_NOLIMBS|M1_CARNIVORE, M2_HOSTILE, 0, CLR_YELLOW), MON("huge pile of killer coins", S_BAD_COINS, LVL(11, 12, 7, 0, 0), (G_NOHELL|G_GENO|G_NOCORPSE), A(ATTK(AT_BITE, AD_PHYS, 4, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(0, 0, 0, MS_SILENT, MZ_SMALL), 0, 0, M1_BREATHLESS|M1_NOEYES|M1_NOHEAD|M1_MINDLESS| M1_NOLIMBS|M1_CARNIVORE, M2_HOSTILE, 0, CLR_YELLOW), /* * dummy monster needed for visual interface */ /* (marking it unique prevents figurines) */ MON("long worm tail", S_WORM_TAIL, LVL(0, 0, 0, 0, 0), (G_NOGEN|G_NOCORPSE|G_UNIQ), A(NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(0, 0, 0, 0, 0), 0, 0, 0L, M2_NOPOLY, 0, CLR_BROWN), /* Note: * Worm tail must be between the normal monsters and the special * quest & pseudo-character ones because an optimization in the * random monster selection code assumes everything beyond here * has the G_NOGEN and M2_NOPOLY attributes. */ /* * KMH -- Monsters of the aligned key quests */ MON("Nightmare", S_UNICORN, LVL(12, 24, -2, 70, 15), (G_UNIQ|G_NOGEN|G_NOCORPSE), A(ATTK(AT_BUTT, AD_PHYS, 3, 12), ATTK(AT_KICK, AD_PHYS, 3, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1500, 300, 0, MS_NEIGH, MZ_LARGE), MR_POISON|MR_FIRE|MR_COLD|MR_ELEC|MR_HITASTWO, MR_POISON|MR_FIRE|MR_COLD|MR_ELEC, M1_ANIMAL|M1_NOHANDS|M1_HERBIVORE, M2_NOPOLY|M2_PNAME|M2_FEMALE|M2_HOSTILE|M2_NASTY|M2_STALK| M2_WANDER|M2_STRONG, M3_WAITFORU|M3_WANTSALL, CLR_RED), MON("Beholder", S_EYE, LVL(15, 9, -4, 70, 0), (G_UNIQ|G_NOGEN|G_NOCORPSE), A(ATTK(AT_GAZE, AD_DETH, 1, 4), ATTK(AT_GAZE, AD_PHYS, 3, 8), ATTK(AT_GAZE, AD_STUN, 1, 3), ATTK(AT_GAZE, AD_CONF, 1, 3), ATTK(AT_GAZE, AD_SLEE, 1, 4), NO_ATTK), SIZ(500, 100, 0, MS_SILENT, MZ_LARGE), 0, 0, M1_FLY|M1_NOLIMBS|M1_NOHEAD|M1_REGEN, M2_NOPOLY|M2_NEUTER|M2_HOSTILE|M2_NASTY|M2_STALK, M3_INFRAVISIBLE|M3_WAITFORU|M3_WANTSALL, CLR_GRAY), MON("Vecna", S_LICH, LVL(49, 9, -8, 90, -15), (G_UNIQ|G_NOGEN|G_NOCORPSE), A(ATTK(AT_TUCH, AD_COLD, 9, 6), ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1200, 100, 0, MS_MUMBLE, MZ_HUMAN), MR_FIRE|MR_COLD|MR_SLEEP|MR_POISON|MR_STONE|MR_PLUSFOUR, MR_FIRE|MR_COLD, M1_BREATHLESS|M1_HUMANOID|M1_POIS|M1_REGEN, M2_NOPOLY|M2_PNAME|M2_PRINCE|M2_MALE|M2_HOSTILE|M2_NASTY|M2_STALK| M2_GREEDY|M2_JEWELS|M2_COLLECT|M2_UNDEAD|M2_STRONG|M2_MAGIC, M3_WAITFORU|M3_WANTSALL, HI_LORD), /* WAC fixed so all classes have G_NOGEN only, level 10 */ /* * character classes */ 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), MON("caveman", S_HUMAN, LVL(10, 12, 10, 0, 1), G_NOGEN, A(ATTK(AT_WEAP, AD_PHYS, 2, 4), 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_MALE|M2_COLLECT, M3_INFRAVISIBLE, HI_DOMESTIC), MON("cavewoman", S_HUMAN, LVL(10, 12, 10, 0, 1), G_NOGEN, A(ATTK(AT_WEAP, AD_PHYS, 2, 4), 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_FEMALE|M2_COLLECT, M3_INFRAVISIBLE, HI_DOMESTIC), MON("flame mage", S_HUMAN, LVL(10, 12, 10, 3, 0), G_NOGEN, A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_MAGC, AD_SPEL, 0, 0), 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|M2_MAGIC|M2_HOSTILE, M3_INFRAVISIBLE, CLR_RED), MON("healer", 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), MON("ice mage", S_HUMAN, LVL(10, 12, 10, 3, 0), G_NOGEN, A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_MAGC, AD_SPEL, 0, 0), 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|M2_MAGIC|M2_HOSTILE, M3_INFRAVISIBLE, CLR_WHITE), 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, M3_INFRAVISIBLE, HI_DOMESTIC), MON("necromancer", S_HUMAN, LVL(10, 12, 10, 3, 0), G_NOGEN, A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_MAGC, AD_SPEL, 0, 0), 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|M2_MAGIC|M2_HOSTILE, M3_INFRAVISIBLE, CLR_BLACK), MON("priest", S_HUMAN, LVL(10, 12, 10, 2, 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_MALE|M2_COLLECT, M3_INFRAVISIBLE, HI_DOMESTIC), MON("priestess", S_HUMAN, LVL(10, 12, 10, 2, 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_FEMALE|M2_COLLECT, M3_INFRAVISIBLE, HI_DOMESTIC), MON("ranger", S_HUMAN, LVL(10, 12, 10, 2, -3), G_NOGEN, A(ATTK(AT_WEAP, AD_PHYS, 1, 4), 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("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("undead slayer", S_HUMAN, LVL(10, 10, 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_DRAIN, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_STRONG|M2_FEMALE|M2_COLLECT|M2_HOSTILE, M3_INFRAVISIBLE, CLR_BLACK), 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, HI_DOMESTIC), #ifdef YEOMAN MON("yeoman", S_HUMAN, LVL(10, 10, 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), #endif /* Wizard should be last. Sigh. */ MON("wizard", S_HUMAN, LVL(10, 12, 10, 3, 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|M2_MAGIC, M3_INFRAVISIBLE, HI_DOMESTIC), /* * quest leaders */ MON("Lord Carnarvon", S_HUMAN, LVL(20, 12, 0, 30, 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_TUNNEL|M1_NEEDPICK|M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_PNAME|M2_PEACEFUL|M2_STRONG|M2_MALE| M2_COLLECT|M2_MAGIC, M3_CLOSE|M3_INFRAVISIBLE, HI_LORD), MON("Pelias", S_HUMAN, LVL(20, 12, 0, 30, 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), MR_POISON, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_PNAME|M2_PEACEFUL|M2_STRONG|M2_MALE| M2_COLLECT|M2_MAGIC, M3_CLOSE|M3_INFRAVISIBLE, HI_LORD), MON("Shaman Karnov", S_HUMAN, LVL(20, 12, 0, 30, 20), (G_NOGEN|G_UNIQ), A(ATTK(AT_WEAP, AD_PHYS, 2, 4), 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| M2_COLLECT|M2_MAGIC, M3_CLOSE|M3_INFRAVISIBLE, HI_LORD), #if 0 /* OBSOLETE */ MON("Master Shifter", S_HUMAN, LVL(20, 12, 0, 30, 0), (G_NOGEN|G_UNIQ), A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_LEADER, MZ_HUMAN), MR_HITASFOUR, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_PNAME|M2_PEACEFUL|M2_STRONG|M2_MALE| M2_COLLECT|M2_MAGIC, M3_CLOSE, HI_LORD), #ifdef DWARF MON("Thorin", S_HUMANOID, LVL(20, 12, 0, 30, 20), (G_NOGEN|G_UNIQ), A(ATTK(AT_WEAP, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(900, 300, 0, MS_LEADER, MZ_HUMAN), 0, 0, M1_TUNNEL|M1_NEEDPICK|M1_HUMANOID|M1_OMNIVORE, M2_DWARF|M2_STRONG|M2_NOPOLY|M2_PNAME|M2_MALE|M2_GREEDY| M2_JEWELS|M2_COLLECT|M2_MAGIC|M2_PEACEFUL, M3_CLOSE, HI_LORD), #endif /* Two for elves - one of each sex. */ MON("Earendil", S_HUMAN, LVL(20, 12, 0, 50, 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_ELF, 350, 0, MS_LEADER, MZ_HUMAN), MR_SLEEP, MR_SLEEP, M1_HUMANOID|M1_SEE_INVIS|M1_OMNIVORE, M2_NOPOLY|M2_ELF|M2_HUMAN|M2_PNAME|M2_PEACEFUL|M2_STRONG| M2_MALE|M2_COLLECT|M2_MAGIC, M3_CLOSE|M3_INFRAVISION|M3_INFRAVISIBLE, HI_LORD), MON("Elwing", S_HUMAN, LVL(20, 12, 0, 50, 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_ELF, 350, 0, MS_LEADER, MZ_HUMAN), MR_SLEEP, MR_SLEEP, M1_HUMANOID|M1_SEE_INVIS|M1_OMNIVORE, M2_NOPOLY|M2_ELF|M2_HUMAN|M2_PNAME|M2_PEACEFUL|M2_STRONG| M2_FEMALE|M2_COLLECT|M2_MAGIC, M3_CLOSE|M3_INFRAVISION|M3_INFRAVISIBLE, HI_LORD), #endif /* 0 */ MON("High Flame Mage", S_HUMAN, LVL(20, 12, 0, 40, 0), (G_NOGEN|G_UNIQ), A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_LEADER, MZ_HUMAN), MR_POISON|MR_HITASFOUR, MR_POISON, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_PNAME|M2_PEACEFUL|M2_STRONG|M2_MALE| M2_COLLECT|M2_MAGIC, M3_CLOSE|M3_INFRAVISIBLE, HI_LORD), MON("Hippocrates", S_HUMAN, LVL(20, 12, 0, 40, 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), MR_POISON, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_PNAME|M2_PEACEFUL|M2_STRONG|M2_MALE| M2_COLLECT|M2_MAGIC, M3_CLOSE, HI_LORD), #if 0 /* OBSOLETE */ MON("Bilbo Baggins", S_HUMANOID, LVL(20, 9, MARM(10,7), 0, 6), (G_NOGEN|G_UNIQ), A(ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(500, 200, 0, MS_LEADER, MZ_SMALL), 0, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_PNAME|M2_PEACEFUL|M2_STRONG|M2_MALE|M2_COLLECT|M2_MAGIC| M2_HOBBIT, M3_CLOSE, HI_LORD), #endif /* 0 */ MON("High Ice Mage", S_HUMAN, LVL(20, 12, 0, 40, 0), (G_NOGEN|G_UNIQ), A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_LEADER, MZ_HUMAN), MR_POISON|MR_HITASFOUR, MR_POISON, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_PNAME|M2_PEACEFUL|M2_STRONG|M2_MALE| M2_COLLECT|M2_MAGIC, 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| M2_COLLECT|M2_MAGIC, M3_CLOSE|M3_INFRAVISIBLE, HI_LORD), #if 0 /* OBSOLETE */ MON("High Lycanthrope", S_HUMAN, LVL(20, 12, 0, 40, -20), (G_NOGEN|G_UNIQ), A(ATTK(AT_BITE, AD_PHYS, 3, 6), ATTK(AT_BITE, AD_PHYS, 3, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_LEADER, MZ_HUMAN), MR_POISON|MR_HITASFOUR, MR_POISON, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_PNAME|M2_PEACEFUL|M2_STRONG|M2_MALE| M2_COLLECT|M2_MAGIC, M3_CLOSE|M3_INFRAVISIBLE, HI_LORD), #endif /* 0 */ MON("Grand Master", S_HUMAN, LVL(25, 12, 0, 70, 0), (G_NOGEN|G_UNIQ), A(ATTK(AT_CLAW, AD_PHYS, 4, 10), ATTK(AT_KICK, AD_PHYS, 2, 8), ATTK(AT_MAGC, AD_CLRC, 2, 8), ATTK(AT_MAGC, AD_CLRC, 2, 8), NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_LEADER, MZ_HUMAN), MR_FIRE|MR_ELEC|MR_SLEEP|MR_POISON, 0, M1_HUMANOID|M1_SEE_INVIS|M1_HERBIVORE, M2_NOPOLY|M2_HUMAN|M2_PEACEFUL|M2_STRONG|M2_NASTY|M2_MAGIC, M3_CLOSE|M3_INFRAVISIBLE, CLR_BLACK), MON("Dark Lord", S_HUMAN, LVL(20, 12, 0, 60, -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), MR_HITASFOUR, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_PEACEFUL|M2_STRONG| M2_COLLECT|M2_MAGIC, M3_CLOSE, HI_LORD), MON("Arch Priest", S_HUMAN, LVL(25, 12, 7, 70, 0), (G_NOGEN|G_UNIQ), A(ATTK(AT_WEAP, AD_PHYS, 4,10), ATTK(AT_KICK, AD_PHYS, 2, 8), ATTK(AT_MAGC, AD_CLRC, 2, 8), ATTK(AT_MAGC, AD_CLRC, 2, 8), NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_LEADER, MZ_HUMAN), MR_FIRE|MR_ELEC|MR_SLEEP|MR_POISON, 0, M1_HUMANOID|M1_SEE_INVIS|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_PEACEFUL|M2_STRONG|M2_COLLECT|M2_MAGIC, M3_CLOSE|M3_INFRAVISIBLE, CLR_WHITE), MON("Orion", S_HUMAN, LVL(20, 12, 0, 30, 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|M1_SEE_INVIS|M1_SWIM|M1_AMPHIBIOUS, M2_NOPOLY|M2_HUMAN|M2_PNAME|M2_PEACEFUL|M2_STRONG|M2_MALE| M2_COLLECT|M2_MAGIC, M3_CLOSE|M3_INFRAVISION|M3_INFRAVISIBLE, HI_LORD), /* Note: Master of Thieves is also the Tourist's nemesis. */ MON("Master of Thieves", S_HUMAN, LVL(20, 12, 0, 30, -20), (G_NOGEN|G_UNIQ), A(ATTK(AT_WEAP, AD_PHYS, 2, 6), ATTK(AT_WEAP, AD_PHYS, 2, 6), ATTK(AT_CLAW, AD_SAMU, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_LEADER, MZ_HUMAN), MR_STONE, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_PEACEFUL|M2_STRONG|M2_MALE|M2_GREEDY| M2_JEWELS|M2_COLLECT|M2_MAGIC, 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| M2_COLLECT|M2_MAGIC, M3_CLOSE|M3_INFRAVISIBLE, HI_LORD), #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| M2_COLLECT|M2_MAGIC, M3_CLOSE|M3_INFRAVISIBLE, HI_DOMESTIC), #endif MON("Van Helsing", S_HUMAN, LVL(20, 12, 0, 40, 20), (G_NOGEN|G_UNIQ), A(ATTK(AT_WEAP, AD_PHYS, 2, 6), ATTK(AT_WEAP, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_LEADER, MZ_HUMAN), MR_HITASFOUR, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_PNAME|M2_PEACEFUL|M2_STRONG|M2_MALE| M2_COLLECT|M2_MAGIC, M3_CLOSE, HI_LORD), 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), #if 0 /* OBSOLETE */ MON("Lolth", S_SPIDER, LVL(20, 15, 0, 50, -20), (G_NOGEN|G_UNIQ), A(ATTK(AT_BITE, AD_DRST, 5, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_ELF, 350, 0, MS_LEADER, MZ_HUMAN), MR_SLEEP|MR_HITASFOUR, MR_SLEEP, M1_HUMANOID|M1_SEE_INVIS|M1_OMNIVORE, M2_NOPOLY|M2_ELF|M2_HUMAN|M2_PNAME|M2_PEACEFUL|M2_STRONG| M2_FEMALE|M2_COLLECT|M2_MAGIC, M3_CLOSE, HI_LORD), #endif #ifdef YEOMAN MON("Chief Yeoman Warder", 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_PEACEFUL|M2_STRONG|M2_MALE|M2_COLLECT|M2_MAGIC, M3_CLOSE, HI_LORD), #endif /* * quest nemeses */ MON("Minion of Huhetotl", S_DEMON, LVL(16, 12, -2, 75, -14), (G_NOCORPSE|G_NOGEN|G_UNIQ), A(ATTK(AT_WEAP, AD_PHYS, 8, 4), ATTK(AT_WEAP, AD_PHYS, 4, 6), ATTK(AT_MAGC, AD_SPEL, 0, 0), ATTK(AT_CLAW, AD_SAMU, 2, 6), NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_NEMESIS, MZ_LARGE), MR_FIRE|MR_POISON|MR_STONE, 0, M1_FLY|M1_SEE_INVIS|M1_POIS, M2_NOPOLY|M2_DEMON|M2_STALK|M2_HOSTILE|M2_STRONG|M2_NASTY|M2_COLLECT, 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|MR_STONE, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_PNAME|M2_STRONG|M2_MALE|M2_STALK|M2_HOSTILE| M2_NASTY|M2_COLLECT|M2_MAGIC, M3_WANTSARTI|M3_WAITFORU|M3_INFRAVISIBLE, HI_LORD), /* Multi-headed, possessing the breath attacks of all the other dragons * (selected at random when attacking). */ MON("Chromatic Dragon", S_DRAGON, LVL(16, 12, 0, 30, -14), (G_NOGEN|G_UNIQ), A(ATTK(AT_BREA, AD_RBRE, 6, 8), ATTK(AT_MAGC, AD_SPEL, 0, 0), ATTK(AT_CLAW, AD_SAMU, 2, 8), ATTK(AT_BITE, AD_PHYS, 4, 8), ATTK(AT_BITE, AD_PHYS, 4, 8), ATTK(AT_STNG, AD_PHYS, 1, 6)), SIZ(WT_DRAGON, 1700, 0, MS_NEMESIS, MZ_GIGANTIC), MR_FIRE|MR_COLD|MR_SLEEP|MR_DISINT|MR_ELEC|MR_POISON|MR_ACID|MR_STONE, MR_FIRE|MR_COLD|MR_SLEEP|MR_DISINT|MR_ELEC|MR_POISON|MR_STONE, M1_THICK_HIDE|M1_NOHANDS|M1_CARNIVORE|M1_SEE_INVIS|M1_POIS, M2_NOPOLY|M2_HOSTILE|M2_FEMALE|M2_STALK|M2_STRONG|M2_NASTY| M2_GREEDY|M2_JEWELS|M2_MAGIC, M3_WANTSARTI|M3_WAITFORU|M3_INFRAVISIBLE, HI_LORD), #if 0 /* OBSOLETE */ MON("Transmuter", S_HUMAN, LVL(25, 10, -10, 30, -20), (G_NOGEN|G_UNIQ), A(ATTK(AT_MAGC, AD_SPEL, 0, 0), ATTK(AT_MAGC, AD_SPEL, 0, 0), ATTK(AT_CLAW, AD_SAMU, 2, 8), ATTK(AT_CLAW, AD_SAMU, 2, 8), ATTK(AT_CLAW, AD_SAMU, 2, 8), ATTK(AT_CLAW, AD_SAMU, 2, 8)), SIZ(WT_HUMAN, 400, 0, MS_NEMESIS, MZ_HUMAN), MR_DEATH|MR_FIRE|MR_COLD|MR_ELEC|MR_POISON|MR_HITASFOUR, MR_FIRE|MR_COLD|MR_ELEC|MR_POISON, M1_CARNIVORE|M1_SEE_INVIS, M2_NOPOLY|M2_HOSTILE|M2_PNAME|M2_STALK| M2_STRONG|M2_NASTY|M2_GREEDY|M2_JEWELS|M2_MAGIC, M3_WANTSARTI|M3_WAITFORU, HI_LORD), #ifdef DWARF MON("Smaug", S_DRAGON, LVL(16, 10, 0, 20, -14), (G_NOGEN|G_UNIQ), A(ATTK(AT_BREA, AD_FIRE, 6, 8), ATTK(AT_BREA, AD_FIRE, 2, 6), ATTK(AT_CLAW, AD_SAMU, 2, 8), ATTK(AT_BITE, AD_PHYS, 1, 6), ATTK(AT_BITE, AD_PHYS, 2, 4), ATTK(AT_CLAW, AD_PHYS, 2, 4)), SIZ(WT_DRAGON, 1800, 0, MS_NEMESIS, MZ_GIGANTIC), MR_FIRE, MR_FIRE, M1_THICK_HIDE|M1_NOHANDS|M1_CARNIVORE|M1_FLY, M2_NOPOLY|M2_PNAME|M2_HOSTILE|M2_MALE|M2_STALK|M2_STRONG|M2_NASTY| M2_GREEDY|M2_JEWELS|M2_MAGIC, M3_WANTSARTI|M3_WAITFORU, CLR_RED), #endif MON("Goblin King", S_ORC, LVL(15, 12, 10, 0, -15), (G_NOGEN|G_UNIQ), A(ATTK(AT_WEAP, AD_PHYS, 2, 6), ATTK(AT_WEAP, AD_PHYS, 2, 6), ATTK(AT_CLAW, AD_SAMU, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(750, 350, 0, MS_NEMESIS, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_ORC|M2_HOSTILE|M2_STRONG|M2_STALK|M2_NASTY|M2_MALE| M2_GREEDY|M2_JEWELS|M2_COLLECT|M2_MAGIC, M3_WANTSARTI|M3_WAITFORU|M3_INFRAVISION|M3_INFRAVISIBLE, HI_LORD), #endif /* 0 */ MON("Water Mage", S_HUMAN, LVL(25, 10, -10, 10, 20), (G_NOGEN|G_UNIQ), 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_DEATH|MR_POISON| MR_HITASFOUR, MR_POISON, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_STRONG|M2_STALK|M2_HOSTILE|M2_NASTY| M2_COLLECT|M2_MAGIC, M3_WANTSARTI|M3_WAITFORU, HI_LORD), #if 0 /* OBSOLETE */ MON("Lareth", S_HUMAN, LVL(25, 15, 0, 50, 20), (G_NOGEN|G_UNIQ), A(ATTK(AT_WEAP, AD_PHYS, 4, 8), ATTK(AT_WEAP, AD_SLEE, 2, 5), ATTK(AT_MAGC, AD_SPEL, 0, 0), ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, NO_ATTK), SIZ(WT_ELF, 350, 0, MS_NEMESIS, MZ_HUMAN), MR_SLEEP|MR_HITASFOUR| MR_DEATH, MR_SLEEP, M1_HUMANOID|M1_SEE_INVIS|M1_OMNIVORE, M2_NOPOLY|M2_ELF|M2_HUMAN|M2_STRONG|M2_PNAME|M2_HOSTILE|M2_NASTY| M2_MALE|M2_COLLECT|M2_JEWELS|M2_MAGIC|M2_STALK, M3_WANTSARTI|M3_WAITFORU, CLR_BLACK), #endif MON("Cyclops", S_GIANT, LVL(18, 12, 0, 0, -15), (G_NOGEN|G_UNIQ), A(ATTK(AT_WEAP, AD_PHYS, 4, 8), ATTK(AT_WEAP, AD_PHYS, 4, 8), ATTK(AT_CLAW, AD_SAMU, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1900, 700, 0, MS_NEMESIS, MZ_HUGE), MR_STONE, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_GIANT|M2_STRONG|M2_ROCKTHROW|M2_STALK|M2_HOSTILE| M2_NASTY|M2_MALE|M2_JEWELS|M2_COLLECT, M3_WANTSARTI|M3_WAITFORU|M3_INFRAVISION|M3_INFRAVISIBLE, CLR_GRAY), #if 0 /* OBSOLETE */ MON("Gollum", S_HUMANOID, LVL(16, 10, -5, 0, -6), (G_NOGEN|G_UNIQ), A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_TUCH, AD_DRST, 1, 2), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(500, 200, 0, MS_NEMESIS, MZ_SMALL), MR_POISON, MR_POISON, M1_HUMANOID|M1_OMNIVORE|M1_SEE_INVIS|M1_POIS, M2_NOPOLY|M2_PNAME|M2_STRONG|M2_STALK|M2_HOSTILE|M2_NASTY| M2_MALE|M2_COLLECT|M2_JEWELS|M2_MAGIC, M3_WANTSARTI|M3_WAITFORU, CLR_BLACK), #endif MON("Earth Mage", S_HUMAN, LVL(25, 10, -10, 10, 20), (G_NOGEN|G_UNIQ), 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_DEATH|MR_POISON| MR_HITASFOUR, MR_POISON, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_STRONG|M2_STALK|M2_HOSTILE|M2_NASTY| M2_COLLECT|M2_MAGIC, M3_WANTSARTI|M3_WAITFORU, HI_LORD), MON("Ixoth", S_DRAGON, LVL(15, 12, -1, 20, -14), (G_NOGEN|G_UNIQ), A(ATTK(AT_BREA, AD_FIRE, 8, 6), ATTK(AT_BITE, AD_PHYS, 4, 8), ATTK(AT_MAGC, AD_SPEL, 0, 0), ATTK(AT_CLAW, AD_PHYS, 2, 4), ATTK(AT_CLAW, AD_SAMU, 2, 4), NO_ATTK ), SIZ(WT_DRAGON, 1600, 0, MS_NEMESIS, MZ_GIGANTIC), MR_FIRE|MR_STONE, MR_FIRE, M1_FLY|M1_THICK_HIDE|M1_NOHANDS|M1_CARNIVORE|M1_SEE_INVIS, M2_NOPOLY|M2_PNAME|M2_HOSTILE|M2_STRONG|M2_NASTY|M2_STALK| M2_GREEDY|M2_JEWELS|M2_MAGIC, M3_WANTSARTI|M3_WAITFORU|M3_INFRAVISIBLE, CLR_RED), #if 0 /* OBSOLETE */ MON("Sir Lorimar", S_HUMAN, LVL(25, 15, -10, 40, -20), (G_NOGEN|G_UNIQ), A(ATTK(AT_WEAP, AD_PHYS, 2, 6), ATTK(AT_WEAP, AD_PHYS, 2, 6), ATTK(AT_CLAW, AD_SAMU, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_NEMESIS, MZ_HUMAN), MR_DEATH|MR_HITASFOUR, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_STRONG|M2_PNAME|M2_HOSTILE|M2_STALK| M2_NASTY|M2_MALE|M2_COLLECT|M2_MAGIC, M3_WANTSARTI|M3_WAITFORU|M3_INFRAVISIBLE, HI_LORD), #endif MON("Master Kaen", S_HUMAN, LVL(25, 12, -10, 10, -20), (G_NOGEN|G_UNIQ), A(ATTK(AT_CLAW, AD_PHYS, 16, 2), ATTK(AT_CLAW, AD_PHYS, 16, 2), ATTK(AT_MAGC, AD_CLRC, 0, 0), ATTK(AT_CLAW, AD_SAMU, 1, 4), NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_NEMESIS, MZ_HUMAN), MR_POISON|MR_STONE, MR_POISON, M1_HUMANOID|M1_HERBIVORE|M1_SEE_INVIS, M2_NOPOLY|M2_HUMAN|M2_PNAME|M2_HOSTILE|M2_STRONG|M2_NASTY| M2_STALK|M2_COLLECT|M2_MAGIC, M3_WANTSARTI|M3_WAITFORU|M3_INFRAVISIBLE, HI_LORD), MON("Maugneshaagar", S_DEMON, LVL(16, 10, -10, 85, -20), (G_NOGEN|G_UNIQ|G_NOCORPSE), A(ATTK(AT_WEAP, AD_PHYS, 8, 4), ATTK(AT_WEAP, AD_PHYS, 4, 6), ATTK(AT_MAGC, AD_SPEL, 0, 0), ATTK(AT_CLAW, AD_SAMU, 2, 6), NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_NEMESIS, MZ_LARGE), MR_DEATH|MR_FIRE| MR_POISON|MR_HITASFOUR, 0, M1_FLY|M1_SEE_INVIS|M1_POIS, M2_NOPOLY|M2_DEMON|M2_PNAME|M2_HOSTILE|M2_STRONG|M2_STALK| M2_NASTY|M2_COLLECT, M3_WANTSARTI|M3_WAITFORU, CLR_BLACK), MON("Nalzok", S_DEMON, LVL(16, 12, -2, 85, -127), (G_NOGEN|G_UNIQ|G_NOCORPSE), A(ATTK(AT_WEAP, AD_PHYS, 8, 4), ATTK(AT_WEAP, AD_PHYS, 4, 6), ATTK(AT_MAGC, AD_SPEL, 0, 0), ATTK(AT_CLAW, AD_SAMU, 2, 6), NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_NEMESIS, MZ_LARGE), MR_FIRE|MR_POISON|MR_STONE, 0, M1_FLY|M1_SEE_INVIS|M1_POIS, M2_NOPOLY|M2_DEMON|M2_PNAME|M2_HOSTILE|M2_STRONG|M2_STALK| M2_NASTY|M2_COLLECT, M3_WANTSARTI|M3_WAITFORU|M3_INFRAVISION|M3_INFRAVISIBLE, CLR_RED), MON("Scorpius", S_SPIDER, LVL(15, 12, 10, 0, -15), (G_NOGEN|G_UNIQ), A(ATTK(AT_CLAW, AD_PHYS, 2, 6), ATTK(AT_CLAW, AD_SAMU, 2, 6), ATTK(AT_STNG, AD_DISE, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(750, 350, 0, MS_NEMESIS, MZ_HUMAN), MR_POISON|MR_STONE, MR_POISON, M1_ANIMAL|M1_NOHANDS|M1_OVIPAROUS|M1_POIS|M1_CARNIVORE, M2_NOPOLY|M2_PNAME|M2_HOSTILE|M2_STRONG|M2_STALK|M2_NASTY| M2_COLLECT|M2_MAGIC, M3_WANTSARTI|M3_WAITFORU, HI_LORD), MON("Master Assassin", S_HUMAN, LVL(15, 12, 0, 30, 18), (G_NOGEN|G_UNIQ), A(ATTK(AT_WEAP, AD_DRST, 2, 6), ATTK(AT_WEAP, AD_PHYS, 2, 8), ATTK(AT_CLAW, AD_SAMU, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_NEMESIS, MZ_HUMAN), MR_STONE, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_STRONG|M2_HOSTILE|M2_STALK|M2_NASTY| M2_COLLECT|M2_MAGIC, M3_WANTSARTI|M3_WAITFORU|M3_INFRAVISIBLE, HI_LORD), /* A renegade daimyo who led a 13 year civil war against the shogun * of his time. */ MON("Ashikaga Takauji", S_HUMAN, LVL(15, 12, 0, 40, -13), (G_NOGEN|G_UNIQ|G_NOCORPSE), A(ATTK(AT_WEAP, AD_PHYS, 2, 6), ATTK(AT_WEAP, AD_PHYS, 2, 6), ATTK(AT_CLAW, AD_SAMU, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_NEMESIS, MZ_HUMAN), MR_STONE, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_PNAME|M2_HOSTILE|M2_STRONG|M2_STALK| M2_NASTY|M2_MALE|M2_COLLECT|M2_MAGIC, M3_WANTSARTI|M3_WAITFORU|M3_INFRAVISIBLE, HI_LORD), #ifdef TOURIST /* * Note: the Master of Thieves was defined above. */ #endif MON("Count Dracula", S_VAMPIRE, LVL(25, 18, -8, 80, -10), (G_NOGEN|G_NOCORPSE|G_UNIQ), A(ATTK(AT_WEAP, AD_PHYS, 2, 6), ATTK(AT_WEAP, AD_PHYS, 2, 6), ATTK(AT_BITE, AD_DRLI, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_NEMESIS, MZ_HUMAN), MR_SLEEP|MR_POISON|MR_HITASFOUR, 0, M1_FLY|M1_BREATHLESS|M1_HUMANOID|M1_POIS|M1_REGEN, M2_NOPOLY|M2_UNDEAD|M2_VAMPIRE|M2_STALK|M2_HOSTILE|M2_PNAME| M2_STRONG|M2_NASTY|M2_PRINCE|M2_MALE, M3_WAITFORU|M3_WANTSARTI, HI_LORD), MON("Lord Surtur", S_GIANT, LVL(15, 12, 2, 50, 12), (G_NOGEN|G_UNIQ), A(ATTK(AT_WEAP, AD_PHYS, 2,10), ATTK(AT_WEAP, AD_PHYS, 2,10), ATTK(AT_CLAW, AD_SAMU, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(2250, 850, 0, MS_NEMESIS, MZ_HUGE), MR_FIRE|MR_STONE, MR_FIRE, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_GIANT|M2_MALE|M2_PNAME|M2_HOSTILE|M2_STALK| M2_STRONG|M2_NASTY|M2_ROCKTHROW|M2_JEWELS|M2_COLLECT, 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), MR_STONE, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_STRONG|M2_HOSTILE|M2_STALK|M2_NASTY| M2_COLLECT|M2_MAGIC, M3_WANTSARTI|M3_WAITFORU|M3_INFRAVISIBLE, CLR_BLACK), #ifdef YEOMAN MON("Colonel Blood", S_HUMAN, LVL(20, 10, 5, 10, -10), (G_NOGEN|G_UNIQ), A(ATTK(AT_WEAP, AD_PHYS, 4, 6), ATTK(AT_WEAP, AD_PHYS, 4, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_NEMESIS, MZ_HUMAN), MR_POISON, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_PNAME|M2_STRONG|M2_MALE|M2_STALK|M2_HOSTILE| M2_NASTY|M2_COLLECT|M2_MAGIC, M3_WANTSARTI|M3_WAITFORU, HI_LORD), #endif /* * quest "guardians" */ MON("student", 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_TUNNEL|M1_NEEDPICK|M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_PEACEFUL|M2_STRONG|M2_COLLECT, M3_INFRAVISIBLE, HI_DOMESTIC), MON("chieftain", S_HUMAN, LVL(5, 12, 10, 10, 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_GUARDIAN, MZ_HUMAN), MR_POISON, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_PEACEFUL|M2_STRONG|M2_COLLECT, M3_INFRAVISIBLE, HI_DOMESTIC), MON("neanderthal", S_HUMAN, LVL(5, 12, 10, 10, 1), G_NOGEN, A(ATTK(AT_WEAP, AD_PHYS, 2, 4), 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, HI_DOMESTIC), #if 0 /* OBSOLETE */ MON("shifter", S_HUMAN, LVL(5, 12, 0, 10, 0), G_NOGEN, A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_GUARDIAN, MZ_HUMAN), MR_HITASONE, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_PEACEFUL|M2_COLLECT, M3_INFRAVISIBLE, CLR_GRAY), #ifdef DWARF MON("dwarf warrior", S_HUMANOID, LVL(5, 10, 10, 10, 5), G_NOGEN, A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(900, 300, 0, MS_GUARDIAN, MZ_HUMAN), 0, 0, M1_TUNNEL|M1_NEEDPICK|M1_HUMANOID|M1_OMNIVORE, M2_DWARF|M2_STRONG|M2_NOPOLY|M2_MALE|M2_GREEDY|M2_JEWELS| M2_COLLECT|M2_PEACEFUL, M3_INFRAVISION|M3_INFRAVISIBLE, HI_DOMESTIC), #endif #endif MON("igniter", S_HUMAN, LVL(5, 10, 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), MR_POISON|MR_HITASONE, MR_POISON, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_PEACEFUL|M2_STRONG|M2_COLLECT, M3_INFRAVISIBLE, CLR_RED), MON("froster", S_HUMAN, LVL(5, 10, 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), MR_POISON|MR_HITASONE, MR_POISON, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_PEACEFUL|M2_STRONG|M2_COLLECT, M3_INFRAVISIBLE, CLR_WHITE), #if 0 /* OBSOLETE */ MON("fiend", S_HUMAN, LVL(5, 10, 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), MR_POISON|MR_HITASONE, MR_POISON, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_PEACEFUL|M2_STRONG|M2_COLLECT, M3_INFRAVISION|M3_INFRAVISIBLE, CLR_ORANGE), #endif MON("attendant", 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), MR_POISON, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_PEACEFUL|M2_STRONG|M2_COLLECT, M3_INFRAVISIBLE, HI_DOMESTIC), #if 0 /* OBSOLETE */ MON("proudfoot", S_HUMANOID, LVL(5, 9, MARM(10,7), 0, 6), G_NOGEN, A(ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(500, 200, 0, MS_GUARDIAN, MZ_SMALL), 0, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_PEACEFUL|M2_COLLECT|M2_HOBBIT, M3_INFRAVISION|M3_INFRAVISIBLE, HI_DOMESTIC), MON("intern", S_HUMAN, LVL(5, 10, 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), MR_POISON|MR_HITASONE, MR_POISON, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_PEACEFUL|M2_STRONG|M2_COLLECT, M3_INFRAVISIBLE, HI_DOMESTIC), #endif 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, HI_DOMESTIC), MON("abbot", S_HUMAN, LVL(5, 12, 10, 20, 0), G_NOGEN, A(ATTK(AT_CLAW, AD_PHYS, 8, 2), ATTK(AT_KICK, AD_STUN, 3, 2), ATTK(AT_MAGC, AD_CLRC, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_GUARDIAN, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_HERBIVORE, M2_NOPOLY|M2_HUMAN|M2_PEACEFUL|M2_STRONG|M2_COLLECT, M3_INFRAVISIBLE, HI_DOMESTIC), MON("embalmer", S_HUMAN, LVL(5, 12, 10, 30, 0), G_NOGEN, A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_GUARDIAN, MZ_HUMAN), MR_HITASONE, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_PEACEFUL|M2_STRONG| M2_COLLECT|M2_MAGIC, M3_INFRAVISIBLE, CLR_BLACK), MON("acolyte", S_HUMAN, LVL(5, 12, 10, 20, 0), G_NOGEN, A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_MAGC, AD_CLRC, 0, 0), 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, HI_DOMESTIC), MON("hunter", S_HUMAN, LVL(5, 12, 10, 10, -7), G_NOGEN, A(ATTK(AT_WEAP, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, 0, MS_GUARDIAN, MZ_HUMAN), 0, 0, M1_HUMANOID|M1_SEE_INVIS|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_PEACEFUL|M2_STRONG|M2_COLLECT, 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, HI_DOMESTIC), #ifdef TOURIST MON("guide", S_HUMAN, LVL(5, 12, 10, 20, 0), G_NOGEN, A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_MAGC, AD_SPEL, 0, 0), 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|M2_MAGIC, M3_INFRAVISIBLE, HI_DOMESTIC), #endif MON("exterminator", S_HUMAN, LVL(8, 10, 10, 10, 10), 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), MR_HITASONE, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_HUMAN|M2_PEACEFUL|M2_STRONG|M2_COLLECT, M3_INFRAVISIBLE, CLR_BLACK), 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|M2_FEMALE, M3_INFRAVISIBLE, HI_DOMESTIC), MON("apprentice", S_HUMAN, LVL(5, 12, 10, 30, 0), G_NOGEN, A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_MAGC, AD_SPEL, 0, 0), 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|M2_MAGIC, M3_INFRAVISIBLE, HI_DOMESTIC), #ifdef YEOMAN MON("Yeoman Warder", S_HUMAN, LVL(5, 10, 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, HI_DOMESTIC), #endif /* * Other quest uniques */ #if 0 /* OBSOLETE */ /* He's making a guest appearance from Angband. -RJ */ MON("Farmer Maggot", S_HUMANOID, LVL(11, 9, 10, 0, 6), (G_NOGEN|G_UNIQ), A(ATTK(/*AT_MOAN*/AT_NONE, AD_PHYS, 0, 0), ATTK(/*AT_MOAN*/AT_NONE, AD_PHYS, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(500, 200, 0, MS_HUMANOID, MZ_SMALL), 0, 0, M1_HUMANOID|M1_OMNIVORE, M2_NOPOLY|M2_PNAME|M2_HOSTILE|M2_STRONG|M2_COLLECT, M3_INFRAVISIBLE, CLR_BROWN), #endif /* * array terminator */ MON("", 0, LVL(0, 0, 0, 0, 0), (0), A(NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(0, 0, 0, 0, 0), 0, 0, 0L, 0L, 0, 0) }; #endif /* !SPLITMON_1 */ #ifndef SPLITMON_1 /* dummy routine used to force linkage */ void monst_init() { return; } #endif /*monst.c*/ slashem-0.0.7E7F3/src/end.c0000664000076400007640000007623010545462317013365 0ustar aliali/* SCCS Id: @(#)end.c 3.4 2003/03/10 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #define NEED_VARARGS /* comment line for pre-compiled headers */ #include "hack.h" #include "eshk.h" #ifndef NO_SIGNAL #include #endif #include "dlb.h" /* these probably ought to be generated by makedefs, like LAST_GEM */ #define FIRST_GEM DILITHIUM_CRYSTAL #define FIRST_AMULET AMULET_OF_ESP #define LAST_AMULET AMULET_OF_YENDOR struct valuable_data { long count; int typ; }; static struct valuable_data gems[LAST_GEM+1 - FIRST_GEM + 1], /* 1 extra for glass */ amulets[LAST_AMULET+1 - FIRST_AMULET]; static struct val_list { struct valuable_data *list; int size; } valuables[] = { { gems, sizeof gems / sizeof *gems }, { amulets, sizeof amulets / sizeof *amulets }, { 0, 0 } }; #ifndef NO_SIGNAL STATIC_PTR void FDECL(done_intr, (int)); # if defined(UNIX) || defined(VMS) || defined (__EMX__) static void FDECL(done_hangup, (int)); # endif #endif STATIC_DCL void FDECL(disclose,(int,BOOLEAN_P)); STATIC_DCL void FDECL(get_valuables, (struct obj *)); STATIC_DCL void FDECL(sort_valuables, (struct valuable_data *,int)); STATIC_DCL void FDECL(artifact_score, (struct obj *,BOOLEAN_P,winid)); STATIC_DCL void FDECL(savelife, (int)); STATIC_DCL boolean FDECL(list_vanquished, (CHAR_P, BOOLEAN_P)); STATIC_DCL void FDECL(list_genocided, (CHAR_P, BOOLEAN_P)); STATIC_DCL boolean FDECL(should_query_disclose_option, (int,char *)); #if defined(__BEOS__) || defined(MICRO) || defined(WIN32) || defined(OS2) extern void FDECL(nethack_exit,(int)); #else #define nethack_exit exit #endif #define done_stopprint program_state.stopprint #ifdef AMIGA # define NH_abort() Abort(0) #else # ifdef SYSV # define NH_abort() (void) abort() # else # ifdef WIN32 # define NH_abort() win32_abort() # else # define NH_abort() abort() # endif # endif #endif /* * The order of these needs to match the macros in hack.h. */ static NEARDATA const char *deaths[] = { /* the array of death */ "died", "betrayed", "choked", "poisoned", "starvation", "drowning", "burning", "dissolving under the heat and pressure", "crushed", "turned to stone", "turned into slime", "genocided", "panic", "trickery", "quit", "escaped", "ascended" }; static NEARDATA const char *ends[] = { /* "when you..." */ "died", "were betrayed", "choked", "were poisoned", "starved", "drowned", "burned", "dissolved in the lava", "were crushed", "turned to stone", "turned into slime", "were genocided", "panicked", "were tricked", "quit", "escaped", "ascended" }; /*ARGSUSED*/ void done1(sig_unused) /* called as signal() handler, so sent at least one arg */ int sig_unused; { #if defined(MAC_MPW) # pragma unused ( sig_unused ) #endif #ifndef NO_SIGNAL (void) signal(SIGINT,SIG_IGN); #endif if(flags.ignintr) { #ifndef NO_SIGNAL (void) signal(SIGINT, (SIG_RET_TYPE) done1); #endif clear_nhwindow(WIN_MESSAGE); curs_on_u(); wait_synch(); if(multi > 0) nomul(0); } else { (void)done2(); } } extern const char * const killed_by_prefix[]; /* from topten.c */ /* "#quit" command or keyboard interrupt */ int done2() { if(yn("Really quit?") == 'n') { #ifndef NO_SIGNAL (void) signal(SIGINT, (SIG_RET_TYPE) done1); #endif clear_nhwindow(WIN_MESSAGE); curs_on_u(); wait_synch(); if(multi > 0) nomul(0); if(multi == 0) { u.uinvulnerable = FALSE; /* avoid ctrl-C bug -dlc */ u.usleep = 0; } return 0; } #if defined(WIZARD) && (defined(UNIX) || defined(VMS) || defined(LATTICE)) if(wizard) { int c; # ifdef VMS const char *tmp = "Enter debugger?"; # else # ifdef LATTICE const char *tmp = "Create SnapShot?"; # else const char *tmp = "Dump core?"; # endif # endif if ((c = ynq(tmp)) == 'y') { (void) signal(SIGINT, (SIG_RET_TYPE) done1); exit_nhwindows((char *)0); NH_abort(); } else if (c == 'q') done_stopprint++; } #endif #ifndef LINT done(QUIT); #endif return 0; } #ifndef NO_SIGNAL /*ARGSUSED*/ STATIC_PTR void done_intr(sig_unused) /* called as signal() handler, so sent at least one arg */ int sig_unused; { #if defined(MAC_MPW) # pragma unused ( sig_unused ) #endif done_stopprint++; (void) signal(SIGINT, SIG_IGN); # if defined(UNIX) || defined(VMS) (void) signal(SIGQUIT, SIG_IGN); # endif return; } # if defined(UNIX) || defined(VMS) || defined(__EMX__) static void done_hangup(sig) /* signal() handler */ int sig; { program_state.done_hup++; (void)signal(SIGHUP, SIG_IGN); done_intr(sig); return; } # endif #endif /* NO_SIGNAL */ void done_in_by(mtmp) register struct monst *mtmp; { char buf[BUFSZ]; boolean distorted = (boolean)(Hallucination && canspotmon(mtmp)); You("die..."); /* for those wand o'death, touch o'death, poisoned spike times... */ if (Instant_Death) You("were hosed!"); mark_synch(); /* flush buffered screen output */ buf[0] = '\0'; killer_format = KILLED_BY_AN; if (!Blind || Blind_telepat) { /* "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; } /* _the_ ghost of Dudley */ if (mtmp->data == &mons[PM_GHOST] && mtmp->mnamelth) { Strcat(buf, "the "); killer_format = KILLED_BY; } if (mtmp->minvis) Strcat(buf, "invisible "); if (distorted) Strcat(buf, "hallucinogen-distorted "); if(mtmp->data == &mons[PM_GHOST]) { Strcat(buf, "ghost"); if (mtmp->mnamelth) Sprintf(eos(buf), " of %s", NAME(mtmp)); } else if(mtmp->isshk) { Sprintf(eos(buf), "%s %s, the shopkeeper", (mtmp->female ? "Ms." : "Mr."), shkname(mtmp)); killer_format = KILLED_BY; } else if (mtmp->ispriest || mtmp->isminion) { /* m_monnam() suppresses "the" prefix plus "invisible", and it overrides the effect of Hallucination on priestname() */ killer = m_monnam(mtmp); Strcat(buf, killer); } else { Strcat(buf, mtmp->data->mname); if (mtmp->mnamelth) Sprintf(eos(buf), " called %s", NAME(mtmp)); } if (multi) Strcat(buf,", while helpless"); } else { killer_format = KILLED_BY; Strcat(buf,"something while blind"); if (multi) Strcat(buf," and helpless"); } killer = buf; if (mtmp->data->mlet == S_WRAITH) u.ugrave_arise = PM_WRAITH; else if (mtmp->data->mlet == S_MUMMY && urace.mummynum != NON_PM) u.ugrave_arise = urace.mummynum; else if (is_vampire(mtmp->data) && Race_if(PM_HUMAN) && mtmp->data != &mons[PM_FIRE_VAMPIRE] && mtmp->data != &mons[PM_STAR_VAMPIRE]) 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; if (touch_petrifies(mtmp->data)) done(STONING); else if (mtmp->mtraitor) done(BETRAYED); else done(DIED); return; } #if defined(WIN32) #define NOTIFY_NETHACK_BUGS #endif /*VARARGS1*/ void panic VA_DECL(const char *, str) VA_START(str); VA_INIT(str, char *); if (program_state.panicking++) NH_abort(); /* avoid loops - this should never happen*/ if (iflags.window_inited) { raw_print("\r\nOops..."); wait_synch(); /* make sure all pending output gets flushed */ exit_nhwindows((char *)0); iflags.window_inited = 0; /* they're gone; force raw_print()ing */ } raw_print(program_state.gameover ? "Postgame wrapup disrupted." : !program_state.something_worth_saving ? "Program initialization has failed." : "Suddenly, the dungeon collapses."); #if defined(WIZARD) && !defined(MICRO) # if defined(NOTIFY_NETHACK_BUGS) if (!wizard) raw_printf("Report the following error to \"%s\".", "slashem-discuss@lists.sourceforge.net"); else if (program_state.something_worth_saving) raw_print("\nError save file being written.\n"); # else if (!wizard) raw_printf("Report error to \"%s\"%s.", # ifdef WIZARD_NAME /*(KR1ED)*/ WIZARD_NAME, # else WIZARD, # endif !program_state.something_worth_saving ? "" : " and it may be possible to rebuild."); # endif if (program_state.something_worth_saving) { set_error_savefile(); (void) dosave0(); } #endif { char buf[BUFSZ]; Vsprintf(buf,str,VA_ARGS); raw_print(buf); paniclog("panic", buf); } #ifdef WIN32 interject(INTERJECT_PANIC); #endif #if defined(WIZARD) && (defined(UNIX) || defined(VMS) || defined(LATTICE) || defined(WIN32)) if (wizard) NH_abort(); /* generate core dump */ #endif VA_END(); done(PANICKED); } STATIC_OVL boolean should_query_disclose_option(category, defquery) int category; char *defquery; { int idx; char *dop = index(disclosure_options, category); if (dop && defquery) { idx = dop - disclosure_options; 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, defquery; char qbuf[QBUFSZ]; boolean ask; boolean hallu=FALSE; 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) { c = ask ? yn_function(qbuf, ynqchars, defquery) : defquery; if (c == 'y') { struct obj *obj; if (Hallucination) { make_hallucinated(0L, FALSE, 0L); hallu = TRUE; } 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 (hallu) make_hallucinated(20L, FALSE, 0L); ask = should_query_disclose_option('a', &defquery); if (!done_stopprint) { c = ask ? yn_function("Do you want to see your attributes?", ynqchars, defquery) : defquery; if (c == 'y') enlightenment(how >= PANICKED ? 1 : 2); /* final */ if (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) { c = ask ? yn_function("Do you want to see your conduct?", ynqchars, defquery) : defquery; if (c == 'y') show_conduct(how >= PANICKED ? 1 : 2); if (c == 'q') done_stopprint++; } } /* try to get the player back in a viable state after being killed */ STATIC_OVL void savelife(how) int how; { u.uswldtim = 0; u.uhp = u.uhpmax; if (u.uhunger < 500) { 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; if(multi > 0) multi = 0; else multi = -1; if(u.utrap && u.utraptype == TT_LAVA) u.utrap = 0; flags.botl = 1; u.ugrave_arise = NON_PM; HUnchanging = 0L; curs_on_u(); } /* * Get valuables from the given list. Revised code: the list always remains * intact. */ STATIC_OVL void get_valuables(list) struct obj *list; /* inventory or container contents */ { 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; gems[i].typ = obj->otyp; } else gems[i].count += obj->quan; } return; } /* * Sort collected valuables, most frequent to least. We could just * as easily use qsort, but we don't care about efficiency here. */ STATIC_OVL void sort_valuables(list, size) struct valuable_data list[]; int size; /* max value is less than 20 */ { register int i, j; struct valuable_data ltmp; /* move greater quantities to the front of the list */ for (i = 1; i < size; i++) { if (list[i].count == 0) continue; /* empty slot */ ltmp = list[i]; /* structure copy */ for (j = i; j > 0; --j) if (list[j-1].count >= ltmp.count) break; else { list[j] = list[j-1]; } list[j] = ltmp; } return; } /* called twice; first to calculate total, then to list relevant items */ STATIC_OVL void artifact_score(list, counting, endwin) struct obj *list; boolean counting; /* true => add up points; false => display them */ winid endwin; { char pbuf[BUFSZ]; struct obj *otmp; long value, points; short dummy; /* object type returned by artifact_name() */ for (otmp = list; otmp; otmp = otmp->nobj) { if (otmp->oartifact || otmp->otyp == BELL_OF_OPENING || otmp->otyp == SPE_BOOK_OF_THE_DEAD || otmp->otyp == CANDELABRUM_OF_INVOCATION) { value = arti_cost(otmp); /* zorkmid value */ points = value * 5 / 2; /* score value */ if (counting) { u.urexp += points; } else { makeknown(otmp->otyp); otmp->known = otmp->dknown = otmp->bknown = 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]), value, currency(value), points); putstr(endwin, 0, pbuf); } } if (Has_contents(otmp)) artifact_score(otmp->cobj, counting, endwin); } } /* Be careful not to call panic from here! */ void done(how) int how; { boolean taken; char kilbuf[BUFSZ], pbuf[BUFSZ]; winid endwin = WIN_ERR; boolean bones_ok, have_windows = iflags.window_inited; struct obj *corpse = (struct obj *)0; long umoney; if (how == TRICKED) { if (killer) { paniclog("trickery", killer); killer = 0; } #ifdef WIZARD if (wizard) { You("are a very tricky wizard, it seems."); return; } #endif } /* 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)) killer_format = KILLED_BY; Strcpy(kilbuf, (!killer || how >= PANICKED ? deaths[how] : killer)); killer = kilbuf; if (how < PANICKED) u.umortality++; if (how == STONING && uamul && uamul->otyp == AMULET_VERSUS_STONE) { pline("But wait..."); makeknown(AMULET_VERSUS_STONE); Your("medallion %s%s!", !Blind ? "begins to glow" : "feels warm", uamul->cursed ? " and disintegrates" : ""); /* blessed -> uncursed -> cursed -> gone */ if (uamul->cursed) useup(uamul); else if (uamul->blessed) unbless(uamul); else curse(uamul); uunstone(); (void) adjattrib(A_CON, -1, TRUE); if(u.uhpmax <= 0) u.uhpmax = 1; savelife(how); killer = 0; killer_format = 0; return; } if (Lifesaved && (how <= GENOCIDED)) { pline("But wait..."); makeknown(AMULET_OF_LIFE_SAVING); Your("medallion %s!", !Blind ? "begins to glow" : "feels warm"); if (how == CHOKING) You("vomit ..."); You_feel("much better!"); pline_The("medallion crumbles to dust!"); /* KMH -- Bullet-proofing */ if (uamul) useup(uamul); (void) adjattrib(A_CON, -1, TRUE); if(u.uhpmax <= 0) u.uhpmax = 10; /* arbitrary */ savelife(how); if (how == GENOCIDED) pline("Unfortunately you are still genocided..."); else { killer = 0; killer_format = 0; return; } } if (( #ifdef WIZARD wizard || #endif discover) && (how <= GENOCIDED || how == TURNED_SLIME)) { if(yn("Die?") == 'y') goto die; pline("OK, so you don't %s.", (how == CHOKING) ? "choke" : "die"); if(u.uhpmax <= 0) u.uhpmax = u.ulevel * 8; /* arbitrary */ savelife(how); killer = 0; killer_format = 0; return; } /* * The game is now over... */ die: 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); /* Sometimes you die on the first move. Life's not fair. * On those rare occasions you get hosed immediately, go out * 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 (void) signal(SIGINT, (SIG_RET_TYPE) done_intr); # if defined(UNIX) || defined(VMS) || defined (__EMX__) (void) signal(SIGQUIT, (SIG_RET_TYPE) done_intr); (void) signal(SIGHUP, (SIG_RET_TYPE) done_hangup); # endif #endif /* NO_SIGNAL */ #ifdef ALLEG_FX if(iflags.usealleg && (how < PANICKED)) fade_to_black(); #endif bones_ok = (how < GENOCIDED) && can_make_bones(); if (how == TURNED_SLIME) u.ugrave_arise = PM_GREEN_SLIME; if (bones_ok && u.ugrave_arise < LOW_PM) { /* corpse gets burnt up too */ if (how == BURNING) 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)) { int mnum = u.umonnum; if (!Upolyd) { /* Base corpse on race when not poly'd since original * u.umonnum is based on role, and all role monsters * are human. */ mnum = undead_to_corpse( (flags.female && urace.femalenum != NON_PM) ? urace.femalenum : urace.malenum); } corpse = mk_named_object(CORPSE, &mons[mnum], u.ux, u.uy, plname); Sprintf(pbuf, "%s, %s%s", plname, killer_format == NO_KILLER_PREFIX ? "" : killed_by_prefix[how], killer_format == KILLED_BY_AN ? an(killer) : killer); make_grave(u.ux, u.uy, pbuf); } } if (how == TURNED_SLIME) killer_format = NO_KILLER_PREFIX; if (how == QUIT) { killer_format = NO_KILLER_PREFIX; if (u.uhp < 1) { how = DIED; u.umortality++; /* skipped above when how==QUIT */ /* note that killer is pointing at kilbuf */ Strcpy(kilbuf, "quit while already on Charon's boat"); } } if (how == ESCAPED || how == PANICKED) killer_format = NO_KILLER_PREFIX; if (how != PANICKED) { /* these affect score and/or bones, but avoid them during panic */ taken = paybill((how == ESCAPED) ? -1 : (how != QUIT)); paygd(); clearpriests(); } else taken = FALSE; /* lint; assert( !bones_ok ); */ clearlocks(); if (have_windows) display_nhwindow(WIN_MESSAGE, FALSE); if (strcmp(flags.end_disclose, "none") && how != PANICKED) disclose(how, taken); /* finish_paybill should be called after disclosure but before bones */ if (bones_ok && taken) finish_paybill(); /* calculate score, before creating bones [container gold] */ { 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) tmp -= tmp / 10L; u.urexp += tmp; u.urexp += 50L * (long)(deepest - 1); if (deepest > 20) u.urexp += 1000L * (long)((deepest > 30) ? 10 : deepest - 20); if (how == ASCENDED) u.urexp *= 2L; } if (bones_ok) { #ifdef WIZARD /* KMH -- We need the "Save bones?" prompt for testing! */ if (!wizard || yn("Save bones?") == 'y') #endif savebones(corpse); /* corpse may be invalid pointer now so ensure that it isn't used again */ 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(); display_nhwindow(WIN_MESSAGE, TRUE); destroy_nhwindow(WIN_MAP); destroy_nhwindow(WIN_STATUS); destroy_nhwindow(WIN_MESSAGE); WIN_MESSAGE = WIN_STATUS = WIN_MAP = WIN_ERR; if(!done_stopprint || flags.tombstone) endwin = create_nhwindow(NHW_TEXT); if (how < GENOCIDED && flags.tombstone && endwin != WIN_ERR) outrip(endwin, how); } else done_stopprint = 1; /* just avoid any more output */ /* changing kilbuf really changes killer. we do it this way because killer is declared a (const char *) */ if (u.uhave.amulet) Strcat(kilbuf, " (with the Amulet)"); else if (how == ESCAPED) { if (Is_astralevel(&u.uz)) /* offered Amulet to wrong deity */ Strcat(kilbuf, " (in celestial disgrace)"); else if (carrying(FAKE_AMULET_OF_YENDOR)) Strcat(kilbuf, " (with a fake Amulet)"); /* don't bother counting to see whether it should be plural */ } if (!done_stopprint) { Sprintf(pbuf, "%s %s the %s...", Goodbye(), plname, how != ASCENDED ? (const char *) ((flags.female && urole.name.f) ? urole.name.f : urole.name.m) : (const char *) (flags.female ? "Demigoddess" : "Demigod")); putstr(endwin, 0, pbuf); putstr(endwin, 0, ""); } if (how == ESCAPED || how == ASCENDED) { register struct monst *mtmp; register struct obj *otmp; register struct val_list *val; register int i; for (val = valuables; val->list; val++) for (i = 0; i < val->size; i++) { val->list[i].count = 0L; } get_valuables(invent); /* add points for collected valuables */ for (val = valuables; val->list; val++) for (i = 0; i < val->size; i++) if (val->list[i].count != 0L) u.urexp += val->list[i].count * (long)objects[val->list[i].typ].oc_cost; /* count the points for artifacts */ artifact_score(invent, TRUE, endwin); keepdogs(TRUE); viz_array[0][0] |= IN_SIGHT; /* need visibility for naming */ mtmp = mydogs; if (!done_stopprint) Strcpy(pbuf, "You"); if (mtmp) { while (mtmp) { if (!done_stopprint) Sprintf(eos(pbuf), " and %s", mon_nam(mtmp)); if (mtmp->mtame) u.urexp += mtmp->mhp; mtmp = mtmp->nmon; } if (!done_stopprint) putstr(endwin, 0, pbuf); pbuf[0] = '\0'; } else { if (!done_stopprint) Strcat(pbuf, " "); } if (!done_stopprint) { Sprintf(eos(pbuf), "%s with %ld point%s,", how==ASCENDED ? "went to your reward" : "escaped from the dungeon", u.urexp, plur(u.urexp)); putstr(endwin, 0, pbuf); } if (!done_stopprint) artifact_score(invent, FALSE, endwin); /* list artifacts */ /* list valuables here */ for (val = valuables; val->list; val++) { sort_valuables(val->list, val->size); for (i = 0; i < val->size && !done_stopprint; i++) { int typ = val->list[i].typ; long count = val->list[i].count; if (count == 0L) continue; if (objects[typ].oc_class != GEM_CLASS || typ <= LAST_GEM) { otmp = mksobj(typ, FALSE, FALSE); makeknown(otmp->otyp); otmp->known = 1; /* for fake amulets */ 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, "%8ld worthless piece%s of colored glass,", count, plur(count)); } putstr(endwin, 0, pbuf); } } } else if (!done_stopprint) { /* did not escape or ascend */ if (u.uz.dnum == 0 && u.uz.dlevel <= 0) { /* level teleported out of the dungeon; `how' is DIED, due to falling or to "arriving at heaven prematurely" */ Sprintf(pbuf, "You %s beyond the confines of the dungeon", (u.uz.dlevel < 0) ? "passed away" : ends[how]); } else { /* more conventional demise */ const char *where = dungeons[u.uz.dnum].dname; if (Is_astralevel(&u.uz)) where = "The Astral Plane"; Sprintf(pbuf, "You %s in %s", ends[how], where); if (!In_endgame(&u.uz) && !Is_knox(&u.uz)) Sprintf(eos(pbuf), " on dungeon level %d", In_quest(&u.uz) ? dunlev(&u.uz) : depth(&u.uz)); } Sprintf(eos(pbuf), " with %ld point%s,", u.urexp, plur(u.urexp)); putstr(endwin, 0, pbuf); } 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) { Sprintf(pbuf, "You were level %d with a maximum of %d hit point%s when you %s.", u.ulevel, u.uhpmax, plur(u.uhpmax), ends[how]); putstr(endwin, 0, pbuf); putstr(endwin, 0, ""); } if (!done_stopprint) display_nhwindow(endwin, TRUE); if (endwin != WIN_ERR) destroy_nhwindow(endwin); /* "So when I die, the first thing I will see in Heaven is a * score list?" */ if (flags.toptenwin) { topten(how); if (have_windows) exit_nhwindows((char *)0); } else { if (have_windows) exit_nhwindows((char *)0); topten(how); } if(done_stopprint) { raw_print(""); raw_print(""); } terminate(EXIT_SUCCESS); } void container_contents(list, identified, all_containers) struct obj *list; boolean identified, all_containers; { register struct obj *box, *obj; char buf[BUFSZ]; for (box = list; box; box = box->nobj) { if (Is_container(box) || box->otyp == STATUE) { if (box->otyp == BAG_OF_TRICKS) { continue; /* wrong type of container */ } else if (box->cobj) { winid tmpwin = create_nhwindow(NHW_MENU); Sprintf(buf, "Contents of %s:", the(xname(box))); putstr(tmpwin, 0, buf); putstr(tmpwin, 0, ""); for (obj = box->cobj; obj; obj = obj->nobj) { if (identified) { makeknown(obj->otyp); obj->known = obj->bknown = obj->dknown = obj->rknown = 1; } putstr(tmpwin, 0, doname(obj)); } display_nhwindow(tmpwin, TRUE); destroy_nhwindow(tmpwin); if (all_containers) container_contents(box->cobj, identified, TRUE); } else { pline("%s empty.", Tobjnam(box, "are")); display_nhwindow(WIN_MESSAGE, FALSE); } } if (!all_containers) break; } } /* should be called with either EXIT_SUCCESS or EXIT_FAILURE */ void terminate(status) int status; { #ifdef MAC getreturn("to exit"); #endif /* don't bother to try to release memory if we're in panic mode, to avoid trouble in case that happens to be due to memory problems */ if (!program_state.panicking) { freedynamicdata(); dlb_cleanup(); } nethack_exit(status); } STATIC_OVL boolean list_vanquished(defquery, ask) char defquery; boolean ask; { register int i, lev; int ntypes = 0, max_lev = 0, nkilled; long total_killed = 0L; char c; winid klwin; char buf[BUFSZ]; /* get totals first */ for (i = LOW_PM; i < NUMMONS; i++) { if (mvitals[i].died) ntypes++; total_killed += (long)mvitals[i].died; if (mons[i].mlevel > max_lev) max_lev = mons[i].mlevel; } /* vanquished creatures list; * includes all dead monsters, not just those killed by the player */ if (ntypes != 0) { c = ask ? yn_function("Do you want an account of creatures vanquished?", ynqchars, defquery) : defquery; if (c == 'q') done_stopprint++; if (c == 'y') { klwin = create_nhwindow(NHW_MENU); putstr(klwin, 0, "Vanquished creatures:"); putstr(klwin, 0, ""); /* countdown by monster "toughness" */ for (lev = max_lev; lev >= 0; lev--) for (i = LOW_PM; i < NUMMONS; i++) if (mons[i].mlevel == lev && (nkilled = mvitals[i].died) > 0) { if ((mons[i].geno & G_UNIQ) && i != PM_HIGH_PRIEST) { 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 */ if (nkilled == 1) Strcpy(buf, an(mons[i].mname)); else Sprintf(buf, "%d %s", nkilled, makeplural(mons[i].mname)); } putstr(klwin, 0, buf); } /* * if (Hallucination) * putstr(klwin, 0, "and a partridge in a pear tree"); */ if (ntypes > 1) { putstr(klwin, 0, ""); Sprintf(buf, "%ld creatures vanquished.", total_killed); putstr(klwin, 0, buf); } display_nhwindow(klwin, TRUE); destroy_nhwindow(klwin); } } return (boolean) (total_killed); } int dolistvanq() { if (!list_vanquished('y', FALSE)) pline("No monsters have yet been killed."); return(0); } /* number of monster species which have been genocided */ int num_genocides() { int i, n = 0; for (i = LOW_PM; i < NUMMONS; ++i) if (mvitals[i].mvflags & G_GENOD) ++n; return n; } STATIC_OVL void list_genocided(defquery, ask) char defquery; boolean ask; { register int i; int ngenocided; char c; winid klwin; char buf[BUFSZ]; ngenocided = num_genocides(); /* genocided species list */ if (ngenocided != 0) { c = ask ? yn_function("Do you want a list of species genocided?", ynqchars, defquery) : defquery; if (c == 'q') done_stopprint++; if (c == 'y') { klwin = create_nhwindow(NHW_MENU); putstr(klwin, 0, "Genocided species:"); putstr(klwin, 0, ""); for (i = LOW_PM; i < NUMMONS; i++) if (mvitals[i].mvflags & G_GENOD) { if ((mons[i].geno & G_UNIQ) && i != PM_HIGH_PRIEST) Sprintf(buf, "%s%s", !type_is_pname(&mons[i]) ? "" : "the ", mons[i].mname); else Strcpy(buf, makeplural(mons[i].mname)); putstr(klwin, 0, buf); } putstr(klwin, 0, ""); Sprintf(buf, "%d species genocided.", ngenocided); putstr(klwin, 0, buf); display_nhwindow(klwin, TRUE); destroy_nhwindow(klwin); } } } /*end.c*/ slashem-0.0.7E7F3/src/objnam.c0000644000076400007640000024750410545462317014067 0ustar aliali/* SCCS Id: @(#)objnam.c 3.4 2003/12/04 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" /* "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 *)); STATIC_DCL char *FDECL(xname2, (struct obj *)); struct Jitem { int item; const char *name; }; /* true for gems/rocks that should have " stone" appended to their names */ #define GemStone(typ) (typ == FLINT || \ (objects[typ].oc_material == GEMSTONE && \ (typ != DILITHIUM_CRYSTAL && typ != RUBY && \ typ != DIAMOND && typ != SAPPHIRE && \ typ != BLACK_OPAL && \ typ != EMERALD && typ != OPAL))) #ifndef OVLB STATIC_DCL struct Jitem Japanese_items[]; #else /* OVLB */ STATIC_OVL struct Jitem Japanese_items[] = { { SHORT_SWORD, "wakizashi" }, { BROADSWORD, "ninja-to" }, { FLAIL, "nunchaku" }, { GLAIVE, "naginata" }, { LOCK_PICK, "osaku" }, { WOODEN_HARP, "koto" }, { KNIFE, "shito" }, { PLATE_MAIL, "tanko" }, { HELMET, "kabuto" }, { LEATHER_GLOVES, "yugake" }, { FOOD_RATION, "gunyoki" }, { POT_BOOZE, "sake" }, {0, "" } }; #endif /* OVLB */ STATIC_DCL const char *FDECL(Japanese_item_name,(int i)); #ifdef OVL1 STATIC_OVL char * strprepend(s,pref) register char *s; register const char *pref; { register int i = (int)strlen(pref); if(i > PREFIX) { impossible("PREFIX too short (for %d).", i); return(s); } s -= i; (void) strncpy(s, pref, i); /* do not copy trailing 0 */ return(s); } #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) { case COIN_CLASS: Strcpy(buf, "coin"); break; case POTION_CLASS: Strcpy(buf, "potion"); break; case SCROLL_CLASS: Strcpy(buf, "scroll"); break; case WAND_CLASS: Strcpy(buf, "wand"); break; case SPBOOK_CLASS: Strcpy(buf, "spellbook"); break; case RING_CLASS: Strcpy(buf, "ring"); break; case AMULET_CLASS: if(nn) Strcpy(buf,actualn); else Strcpy(buf,"amulet"); if(un) Sprintf(eos(buf)," called %s",un); if(dn) Sprintf(eos(buf)," (%s)",dn); return(buf); default: if(nn) { Strcpy(buf, actualn); if (GemStone(otyp)) Strcat(buf, " stone"); if(un) Sprintf(eos(buf), " called %s", un); if(dn) Sprintf(eos(buf), " (%s)", dn); } else { Strcpy(buf, dn ? dn : actualn); if(ocl->oc_class == GEM_CLASS) Strcat(buf, (ocl->oc_material == MINERAL) ? " stone" : " gem"); if(un) Sprintf(eos(buf), " called %s", un); } return(buf); } /* here for ring/scroll/potion/wand */ if(nn) { if (ocl->oc_unique) Strcpy(buf, actualn); /* avoid spellbook of Book of the Dead */ /* KMH -- "mood ring" instead of "ring of mood" */ else if (otyp == RIN_MOOD) Sprintf(buf, "%s ring", actualn); else Sprintf(eos(buf), " of %s", actualn); } if(un) Sprintf(eos(buf), " called %s", un); if(dn) Sprintf(eos(buf), " (%s)", dn); return(buf); } /* less verbose result than obj_typename(); either the actual name or the description (but not both); user-assigned name is ignored */ char * simple_typename(otyp) int otyp; { char *bufp, *pp, *save_uname = objects[otyp].oc_uname; objects[otyp].oc_uname = 0; /* suppress any name given by user */ bufp = obj_typename(otyp); objects[otyp].oc_uname = save_uname; if ((pp = strstri(bufp, " (")) != 0) *pp = '\0'; /* strip the appended description */ return bufp; } boolean obj_is_pname(obj) register struct obj *obj; { return((boolean)(obj->dknown && obj->known && obj->onamelth && /* Since there aren't any objects which are both artifacts and unique, the last check is redundant. */ obj->oartifact && !objects[obj->otyp].oc_unique)); } /* Give the name of an object seen at a distance. Unlike xname/doname, * we don't want to set dknown if it's not set already. The kludge used is * to temporarily set Blind so that xname() skips the dknown setting. This * assumes that we don't want to do this too often; if this function becomes * frequently used, it'd probably be better to pass a parameter to xname() * or doname() instead. */ char * distant_name(obj, func) register struct obj *obj; char *FDECL((*func), (OBJ_P)); { char *str; long save_Blinded = Blinded; Blinded = 1; str = (*func)(obj); Blinded = save_Blinded; return str; } /* convert player specified fruit name into corresponding fruit juice name ("slice of pizza" -> "pizza juice" rather than "slice of pizza juice") */ char * fruitname(juice) boolean juice; /* whether or not to append " juice" to the name */ { char *buf = nextobuf(); const char *fruit_nam = strstri(pl_fruit, " of "); if (fruit_nam) fruit_nam += 4; /* skip past " of " */ else fruit_nam = pl_fruit; /* use it as is */ Sprintf(buf, "%s%s", makesingular(fruit_nam), juice ? " juice" : ""); return buf; } #endif /* OVLB */ #ifdef OVL1 char * xname2(obj) register struct obj *obj; { /* Hallu */ register char *buf; register int typ = obj->otyp; register struct objclass *ocl = &objects[typ]; register int nn = ocl->oc_name_known; register const char *actualn = OBJ_NAME(*ocl); 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 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) obj->known = 0; #ifndef INVISIBLE_OBJECTS if (!Blind) obj->dknown = TRUE; #else if (!Blind && (!obj->oinvis || See_invisible)) obj->dknown = TRUE; #endif if (Role_if(PM_PRIEST) || Role_if(PM_NECROMANCER)) obj->bknown = TRUE; /* We could put a switch(obj->oclass) here but currently only this one case exists */ if (obj->oclass == WEAPON_CLASS && is_poisonable(obj) && obj->opoisoned) Strcpy(buf, "poisoned "); if (obj_is_pname(obj)) goto nameit; switch (obj->oclass) { case AMULET_CLASS: if (!obj->dknown) Strcpy(buf, "amulet"); else if (typ == AMULET_OF_YENDOR || typ == FAKE_AMULET_OF_YENDOR) /* each must be identified individually */ Strcpy(buf, obj->known ? actualn : dn); else if (nn) Strcpy(buf, actualn); else if (un) Sprintf(buf,"amulet called %s", un); else Sprintf(buf,"%s amulet", dn); break; case WEAPON_CLASS: case VENOM_CLASS: case TOOL_CLASS: if (typ == LENSES) Strcpy(buf, "pair of "); if (!obj->dknown) Strcat(buf, dn ? dn : actualn); else if (nn) Strcat(buf, actualn); else if (un) { Strcat(buf, dn ? dn : actualn); Strcat(buf, " called "); Strcat(buf, un); } else Strcat(buf, dn ? dn : actualn); /* If we use an() here we'd have to remember never to use */ /* it whenever calling doname() or xname(). */ if (typ == FIGURINE) Sprintf(eos(buf), " of a%s %s", index(vowels,*(mons[obj->corpsenm].mname)) ? "n" : "", mons[obj->corpsenm].mname); break; case ARMOR_CLASS: /* depends on order of the dragon scales objects */ if (typ >= GRAY_DRAGON_SCALES && typ <= YELLOW_DRAGON_SCALES) { Sprintf(buf, "set of %s", actualn); break; } if(is_boots(obj) || is_gloves(obj)) Strcpy(buf,"pair of "); if(obj->otyp >= ELVEN_SHIELD && obj->otyp <= ORCISH_SHIELD && !obj->dknown) { Strcpy(buf, "shield"); break; } if(obj->otyp == SHIELD_OF_REFLECTION && !obj->dknown) { Strcpy(buf, "smooth shield"); break; } if(nn) Strcat(buf, actualn); else if(un) { if(is_boots(obj)) Strcat(buf,"boots"); else if(is_gloves(obj)) Strcat(buf,"gloves"); else if(is_cloak(obj)) Strcpy(buf,"cloak"); else if(is_helmet(obj)) Strcpy(buf,"helmet"); else if(is_shield(obj)) Strcpy(buf,"shield"); else Strcpy(buf,"armor"); Strcat(buf, " called "); Strcat(buf, un); } else Strcat(buf, dn); break; case FOOD_CLASS: if (typ == SLIME_MOLD) { register struct fruit *f; for(f=ffruit; f; f = f->nextf) { if(f->fid == obj->spe) { Strcpy(buf, f->fname); break; } } if (!f) impossible("Bad fruit #%d?", obj->spe); break; } Strcpy(buf, actualn); if (typ == TIN && obj->known) { if(obj->spe > 0) Strcat(buf, " of spinach"); else if (obj->corpsenm == NON_PM) Strcpy(buf, "empty tin"); else if (vegetarian(&mons[obj->corpsenm])) Sprintf(eos(buf), " of %s", mons[obj->corpsenm].mname); else Sprintf(eos(buf), " of %s meat", mons[obj->corpsenm].mname); } break; case COIN_CLASS: case CHAIN_CLASS: Strcpy(buf, actualn); break; case ROCK_CLASS: if (typ == STATUE) Sprintf(buf, "%s%s of %s%s", (Role_if(PM_ARCHEOLOGIST) && (obj->spe & STATUE_HISTORIC)) ? "historic " : "" , actualn, type_is_pname(&mons[obj->corpsenm]) ? "" : (mons[obj->corpsenm].geno & G_UNIQ) ? "the " : (index(vowels,*(mons[obj->corpsenm].mname)) ? "an " : "a "), mons[obj->corpsenm].mname); else Strcpy(buf, actualn); break; case BALL_CLASS: Sprintf(buf, "%sheavy iron ball", (obj->owt > ocl->oc_weight) ? "very " : ""); break; case POTION_CLASS: if (obj->dknown && obj->odiluted) Strcpy(buf, "diluted "); if(nn || un || !obj->dknown) { Strcat(buf, "potion"); if(!obj->dknown) break; if(nn) { Strcat(buf, " of "); if (typ == POT_WATER && obj->bknown && (obj->blessed || obj->cursed)) { Strcat(buf, obj->blessed ? "holy " : "unholy "); } Strcat(buf, actualn); } else { Strcat(buf, " called "); Strcat(buf, un); } } else { Strcat(buf, dn); Strcat(buf, " potion"); } break; case SCROLL_CLASS: Strcpy(buf, "scroll"); if(!obj->dknown) break; if(nn) { Strcat(buf, " of "); Strcat(buf, actualn); } else if(un) { Strcat(buf, " called "); Strcat(buf, un); } else if (ocl->oc_magic) { Strcat(buf, " labeled "); Strcat(buf, dn); } else { Strcpy(buf, dn); Strcat(buf, " scroll"); } break; case WAND_CLASS: if(!obj->dknown) Strcpy(buf, "wand"); else if(nn) Sprintf(buf, "wand of %s", actualn); else if(un) Sprintf(buf, "wand called %s", un); else Sprintf(buf, "%s wand", dn); break; case SPBOOK_CLASS: if (!obj->dknown) { Strcpy(buf, "spellbook"); } else if (nn) { if (typ != SPE_BOOK_OF_THE_DEAD) Strcpy(buf, "spellbook of "); Strcat(buf, actualn); } else if (un) { Sprintf(buf, "spellbook called %s", un); } else Sprintf(buf, "%s spellbook", dn); break; case RING_CLASS: if(!obj->dknown) Strcpy(buf, "ring"); else if(nn) { /* KMH -- "mood ring" instead of "ring of mood" */ if (typ == RIN_MOOD) Sprintf(buf, "%s ring", actualn); else Sprintf(buf, "ring of %s", actualn); } else if(un) Sprintf(buf, "ring called %s", un); else Sprintf(buf, "%s ring", dn); break; case GEM_CLASS: { const char *rock = (ocl->oc_material == MINERAL) ? "stone" : "gem"; if (!obj->dknown) { Strcpy(buf, rock); } else if (!nn) { if (un) Sprintf(buf,"%s called %s", rock, un); else Sprintf(buf, "%s %s", dn, rock); } else { Strcpy(buf, actualn); if (GemStone(typ)) Strcat(buf, " stone"); } break; } default: Sprintf(buf,"glorkum %d %d %d", obj->oclass, typ, obj->spe); } if (obj->quan != 1L) Strcpy(buf, makeplural(buf)); if (obj->onamelth && obj->dknown) { Strcat(buf, " named "); nameit: Strcat(buf, ONAME(obj)); } if (!strncmpi(buf, "the ", 4)) buf += 4; return(buf); } /* end Hallu */ /* WAC calls the above xname2 */ char * xname(obj) register struct obj *obj; { /* WAC moved hallucination here */ register struct obj *hobj; #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 " */ if (Hallucination && !program_state.gameover) { hobj = mkobj(obj->oclass, 0); hobj->quan = obj->quan; /* WAC clean up */ buf = xname2(hobj); obj_extract_self(hobj); dealloc_obj(hobj); return (buf); } else return xname2(obj); } /* 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; { if (!obj->dknown) return FALSE; else if (obj->otyp == FAKE_AMULET_OF_YENDOR && !obj->known) return TRUE; /* lie */ else return (boolean)(objects[obj->otyp].oc_unique && (obj->known || obj->otyp == AMULET_OF_YENDOR)); } static void add_erosion_words(obj,prefix) struct obj *obj; char *prefix; { boolean iscrys = (obj->otyp == CRYSKNIFE); if (!is_damageable(obj) && !iscrys || Hallucination) return; /* The only cases where any of these bits do double duty are for * rotted food and diluted potions, which are all not is_damageable(). */ if (obj->oeroded && !iscrys) { switch (obj->oeroded) { case 2: Strcat(prefix, "very "); break; case 3: Strcat(prefix, "thoroughly "); break; } Strcat(prefix, is_rustprone(obj) ? "rusty " : "burnt "); } if (obj->oeroded2 && !iscrys) { switch (obj->oeroded2) { case 2: Strcat(prefix, "very "); break; case 3: Strcat(prefix, "thoroughly "); break; } Strcat(prefix, is_corrodeable(obj) ? "corroded " : "rotted "); } if (obj->rknown && obj->oerodeproof) Strcat(prefix, iscrys ? "fixed " : is_rustprone(obj) ? "rustproof " : is_corrodeable(obj) ? "corrodeproof " : /* "stainless"? */ is_flammable(obj) ? "fireproof " : ""); } char * doname(obj) register struct obj *obj; { boolean ispoisoned = FALSE; char prefix[PREFIX]; char tmpbuf[PREFIX+1]; /* when we have to add something at the start of prefix instead of the * end (Strcat is used on the end) */ register char *bp = xname(obj); /* When using xname, we want "poisoned arrow", and when using * doname, we want "poisoned +0 arrow". This kludge is about the only * way to do it, at least until someone overhauls xname() and doname(), * combining both into one function taking a parameter. */ /* must check opoisoned--someone can have a weirdly-named fruit */ if (!strncmp(bp, "poisoned ", 9) && obj->opoisoned) { bp += 9; ispoisoned = TRUE; } if(obj->quan != 1L) Sprintf(prefix, "%ld ", obj->quan); else if (!Hallucination && (obj_is_pname(obj) || the_unique_obj(obj))) { if (!strncmpi(bp, "the ", 4)) bp += 4; Strcpy(prefix, "the "); } else Strcpy(prefix, "a "); #ifdef INVISIBLE_OBJECTS if (obj->oinvis) Strcat(prefix,"invisible "); #endif #if defined(WIZARD) && defined(UNPOLYPILE) if (wizard && is_hazy(obj)) Strcat(prefix,"hazy "); #endif if ((!Hallucination || Role_if(PM_PRIEST) || Role_if(PM_NECROMANCER)) && obj->bknown && obj->oclass != COIN_CLASS && (obj->otyp != POT_WATER || !objects[POT_WATER].oc_name_known || (!obj->cursed && !obj->blessed) || Hallucination)) { /* allow 'blessed clear potion' if we don't know it's holy water; * always allow "uncursed potion of water" */ if (Hallucination ? !rn2(10) : obj->cursed) Strcat(prefix, "cursed "); else if (Hallucination ? !rn2(10) : obj->blessed) Strcat(prefix, "blessed "); else if ((!obj->known || !objects[obj->otyp].oc_charged || (obj->oclass == ARMOR_CLASS || obj->oclass == RING_CLASS)) /* For most items with charges or +/-, if you know how many * charges are left or what the +/- is, then you must have * totally identified the item, so "uncursed" is unneccesary, * because an identified object not described as "blessed" or * "cursed" must be uncursed. * * If the charges or +/- is not known, "uncursed" must be * printed to avoid ambiguity between an item whose curse * status is unknown, and an item known to be uncursed. */ #ifdef MAIL && obj->otyp != SCR_MAIL #endif && obj->otyp != FAKE_AMULET_OF_YENDOR && obj->otyp != AMULET_OF_YENDOR && !Role_if(PM_PRIEST) && !Role_if(PM_NECROMANCER)) Strcat(prefix, "uncursed "); } if (Hallucination ? !rn2(100) : obj->greased) Strcat(prefix, "greased "); switch(obj->oclass) { case AMULET_CLASS: add_erosion_words(obj, prefix); if(obj->owornmask & W_AMUL) Strcat(bp, " (being worn)"); break; case WEAPON_CLASS: if(ispoisoned) Strcat(prefix, "poisoned "); plus: add_erosion_words(obj, prefix); if (Hallucination) break; if(obj->known) { Strcat(prefix, sitoa(obj->spe)); Strcat(prefix, " "); } #ifdef FIREARMS if ( # ifdef LIGHTSABERS is_lightsaber(obj) || # endif obj->otyp == STICK_OF_DYNAMITE) { if (obj->lamplit) Strcat(bp, " (lit)"); # ifdef DEBUG Sprintf(eos(bp), " (%d)", obj->age); # endif } else if (is_grenade(obj)) if (obj->oarmed) Strcat(bp, " (armed)"); #else /* FIREARMS */ # ifdef LIGHTSABERS if (is_lightsaber(obj)) { if (obj->lamplit) Strcat(bp, " (lit)"); # ifdef DEBUG Sprintf(eos(bp), " (%d)", obj->age); # endif } # endif #endif /* FIREARMS */ break; case ARMOR_CLASS: if(obj->owornmask & W_ARMOR) Strcat(bp, (obj == uskin) ? " (embedded in your skin)" : " (being worn)"); goto plus; case TOOL_CLASS: /* weptools already get this done when we go to the +n code */ if (!is_weptool(obj)) add_erosion_words(obj, prefix); if (Hallucination) break; if(obj->owornmask & (W_TOOL /* blindfold */ #ifdef STEED | W_SADDLE #endif )) { Strcat(bp, " (being worn)"); break; } if (obj->otyp == LEASH && obj->leashmon != 0) { Strcat(bp, " (in use)"); break; } if (obj->otyp == CANDELABRUM_OF_INVOCATION) { if (!obj->spe) Strcpy(tmpbuf, "no"); else Sprintf(tmpbuf, "%d", obj->spe); Sprintf(eos(bp), " (%s candle%s%s)", tmpbuf, plur(obj->spe), !obj->lamplit ? " attached" : ", lit"); break; } else if (obj->otyp == OIL_LAMP || obj->otyp == MAGIC_LAMP || obj->otyp == BRASS_LANTERN || obj->otyp == TORCH || Is_candle(obj)) { if (Is_candle(obj) && /* WAC - magic candles are never "partly used" */ obj->otyp != MAGIC_CANDLE && obj->age < 20L * (long)objects[obj->otyp].oc_cost) Strcat(prefix, "partly used "); if(obj->lamplit) Strcat(bp, " (lit)"); } if (is_weptool(obj)) goto plus; if(objects[obj->otyp].oc_charged) goto charges; break; case SPBOOK_CLASS: /* WAC spellbooks have charges now */ #ifdef WIZARD if (wizard) { if (Hallucination) break; if (obj->known) Sprintf(eos(bp), " (%d:%d,%d)", (int)obj->recharged, obj->spe, obj->spestudied); break; } else #endif goto charges; case WAND_CLASS: add_erosion_words(obj, prefix); charges: if (Hallucination) break; if(obj->known) Sprintf(eos(bp), " (%d:%d)", (int)obj->recharged, obj->spe); break; case POTION_CLASS: if (Hallucination) break; if (obj->otyp == POT_OIL && obj->lamplit) Strcat(bp, " (lit)"); break; case RING_CLASS: add_erosion_words(obj, prefix); ring: if(obj->owornmask & W_RINGR) Strcat(bp, " (on right "); if(obj->owornmask & W_RINGL) Strcat(bp, " (on left "); if(obj->owornmask & W_RING) { Strcat(bp, body_part(HAND)); Strcat(bp, ")"); } if (Hallucination) break; if(obj->known && objects[obj->otyp].oc_charged) { Strcat(prefix, sitoa(obj->spe)); Strcat(prefix, " "); } break; case FOOD_CLASS: if (obj->otyp == CORPSE && obj->odrained) { #ifdef WIZARD if (wizard && obj->oeaten < drainlevel(obj)) Strcpy(tmpbuf, "over-drained "); else #endif Sprintf(tmpbuf, "%sdrained ", (obj->oeaten > drainlevel(obj)) ? "partly " : ""); } else if (obj->oeaten) Strcpy(tmpbuf, "partly eaten "); else tmpbuf[0] = '\0'; Strcat(prefix, tmpbuf); if (obj->otyp == CORPSE && !Hallucination) { if (mons[obj->corpsenm].geno & G_UNIQ) { Sprintf(prefix, "%s%s ", (type_is_pname(&mons[obj->corpsenm]) ? "" : "the "), s_suffix(mons[obj->corpsenm].mname)); Strcat(prefix, tmpbuf); } else { Strcat(prefix, mons[obj->corpsenm].mname); Strcat(prefix, " "); } } else if (obj->otyp == EGG) { #if 0 /* corpses don't tell if they're stale either */ if (obj->known && stale_egg(obj)) Strcat(prefix, "stale "); #endif if (obj->corpsenm >= LOW_PM && (obj->known || mvitals[obj->corpsenm].mvflags & MV_KNOWS_EGG)) { Strcat(prefix, mons[obj->corpsenm].mname); Strcat(prefix, " "); if (obj->spe == 2) Strcat(bp, " (with your markings)"); else if (obj->spe) Strcat(bp, " (laid by you)"); } } if (obj->otyp == MEAT_RING) goto ring; break; case BALL_CLASS: case CHAIN_CLASS: add_erosion_words(obj, prefix); if(obj->owornmask & W_BALL) Strcat(bp, " (chained to you)"); break; } if((obj->owornmask & W_WEP) && !mrg_to_wielded) { if (obj->quan != 1L) { Strcat(bp, " (wielded)"); } else { const char *hand_s = body_part(HAND); if (bimanual(obj)) hand_s = makeplural(hand_s); Sprintf(eos(bp), " (weapon in %s)", hand_s); } } if(obj->owornmask & W_SWAPWEP) { if (u.twoweap) Sprintf(eos(bp), " (wielded in other %s)", body_part(HAND)); else Strcat(bp, " (alternate weapon; not wielded)"); } if(obj->owornmask & W_QUIVER) Strcat(bp, " (in quiver)"); if (!Hallucination && 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)); } #ifdef WIZARD if (wizard && obj->in_use) /* Can't use "(in use)", see leashes */ Strcat(bp, " (finishing)"); /* always a bug */ #endif if (!strncmp(prefix, "a ", 2) && index(vowels, *(prefix+2) ? *(prefix+2) : *bp) && (*(prefix+2) || (strncmp(bp, "uranium", 7) && strncmp(bp, "unicorn", 7) && strncmp(bp, "eucalyptus", 10)))) { Strcpy(tmpbuf, prefix); Strcpy(prefix, "an "); Strcpy(prefix+3, tmpbuf+2); } #ifdef SHOW_WEIGHT /* [max] weight inventory */ if ((obj->otyp != BOULDER) || !throws_rocks (youmonst.data)) if ((obj->otyp < LUCKSTONE) && (obj->otyp != CHEST) && (obj->otyp != LARGE_BOX) && (obj->otyp != ICE_BOX) && (!Hallucination && flags.invweight)) Sprintf (eos(bp), " {%d}", obj->owt); #endif bp = strprepend(bp, prefix); return(bp); } #endif /* OVL0 */ #ifdef OVLB /* used from invent.c */ boolean not_fully_identified(otmp) register struct obj *otmp; { #ifdef GOLDOBJ /* gold doesn't have any interesting attributes [yet?] */ if (otmp->oclass == COIN_CLASS) return FALSE; /* always fully ID'd */ #endif /* check fundamental ID hallmarks first */ if (!otmp->known || !otmp->dknown || #ifdef MAIL (!otmp->bknown && otmp->otyp != SCR_MAIL) || #else !otmp->bknown || #endif !objects[otmp->otyp].oc_name_known) /* ?redundant? */ return TRUE; if (otmp->oartifact && undiscovered_artifact(otmp->oartifact)) return TRUE; /* otmp->rknown is the only item of interest if we reach here */ /* * Note: if a revision ever allows scrolls to become fireproof or * rings to become shockproof, this checking will need to be revised. * `rknown' ID only matters if xname() will provide the info about it. */ if (otmp->rknown || (otmp->oclass != ARMOR_CLASS && otmp->oclass != WEAPON_CLASS && !is_weptool(otmp) && /* (redunant) */ otmp->oclass != BALL_CLASS)) /* (useless) */ return FALSE; else /* lack of `rknown' only matters for vulnerable objects */ return (boolean)(is_rustprone(otmp) || is_corrodeable(otmp) || 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[Hallucination ? rndmonnum() : otmp->corpsenm].mname); if (ignore_oquan || otmp->quan < 2) return nambuf; else 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); } /* treat an object as fully ID'd when it might be used as reason for death */ char * killer_xname(obj) struct obj *obj; { struct obj save_obj; unsigned save_ocknown; char *buf, *save_ocuname; /* remember original settings for core of the object; oname and oattached extensions don't matter here--since they aren't modified they don't need to be saved and restored */ save_obj = *obj; /* killer name should be more specific than general xname; however, exact info like blessed/cursed and rustproof makes things be too verbose */ obj->known = obj->dknown = 1; obj->bknown = obj->rknown = obj->greased = 0; /* if character is a priest[ess], bknown will get toggled back on */ obj->blessed = obj->cursed = 0; /* "killed by poisoned " would be misleading when poison is not the cause of death and "poisoned by poisoned " would be redundant when it is, so suppress "poisoned" prefix */ obj->opoisoned = 0; /* strip user-supplied name; artifacts keep theirs */ if (!obj->oartifact) obj->onamelth = 0; /* temporarily identify the type of object */ save_ocknown = objects[obj->otyp].oc_name_known; objects[obj->otyp].oc_name_known = 1; save_ocuname = objects[obj->otyp].oc_uname; objects[obj->otyp].oc_uname = 0; /* avoid "foo called bar" */ buf = xname2(obj); if (obj->quan == 1L) buf = obj_is_pname(obj) ? the(buf) : an(buf); objects[obj->otyp].oc_name_known = save_ocknown; objects[obj->otyp].oc_uname = save_ocuname; *obj = save_obj; /* restore object's core settings */ return buf; } char * killer_cxname(obj, ignore_oquan) struct obj *obj; boolean ignore_oquan; /* to force singular */ { char *buf; if (obj->otyp == CORPSE) { buf = nextobuf(); Sprintf(buf, "%s%s corpse", Hallucination ? "hallucinogen-distorted " : "", mons[obj->corpsenm].mname); if (!ignore_oquan && obj->quan >= 2) buf = makeplural(buf); } else buf = killer_xname(obj); return buf; } /* * Used if only one of a collection of objects is named (e.g. in eat.c). */ const char * singular(otmp, func) register struct obj *otmp; char *FDECL((*func), (OBJ_P)); { long savequan; #ifdef SHOW_WEIGHT unsigned saveowt; #endif char *nam; /* Note: using xname for corpses will not give the monster type */ if (otmp->otyp == CORPSE && func == xname && !Hallucination) return corpse_xname(otmp, TRUE); savequan = otmp->quan; otmp->quan = 1L; #ifdef SHOW_WEIGHT saveowt = otmp->owt; otmp->owt = weight(otmp); #endif nam = (*func)(otmp); otmp->quan = savequan; #ifdef SHOW_WEIGHT otmp->owt = saveowt; #endif return nam; } char * an(str) register const char *str; { char *buf = nextobuf(); buf[0] = '\0'; if (strncmpi(str, "the ", 4) && strcmp(str, "molten lava") && strcmp(str, "iron bars") && strcmp(str, "ice")) { if (index(vowels, *str) && strncmp(str, "one-", 4) && strncmp(str, "useful", 6) && strncmp(str, "unicorn", 7) && strncmp(str, "uranium", 7) && strncmp(str, "eucalyptus", 10)) Strcpy(buf, "an "); else Strcpy(buf, "a "); } Strcat(buf, str); return buf; } char * An(str) const char *str; { register char *tmp = an(str); *tmp = highc(*tmp); return tmp; } /* * Prepend "the" if necessary; assumes str is a subject derived from xname. * Use type_is_pname() for monster names, not the(). the() is idempotent. */ char * the(str) const char *str; { char *buf = nextobuf(); boolean insert_the = FALSE; if (!strncmpi(str, "the ", 4)) { buf[0] = lowc(*str); Strcpy(&buf[1], str+1); return buf; } else if (*str < 'A' || *str > 'Z') { /* not a proper name, needs an article */ insert_the = TRUE; } else { /* Probably a proper name, might not need an article */ register char *tmp, *named, *called; int l; /* some objects have capitalized adjectives in their names */ if(((tmp = rindex(str, ' ')) || (tmp = rindex(str, '-'))) && (tmp[1] < 'A' || tmp[1] > 'Z')) insert_the = TRUE; else if (tmp && index(str, ' ') < tmp) { /* has spaces */ /* it needs an article if the name contains "of" */ tmp = strstri(str, " of "); named = strstri(str, " named "); called = strstri(str, " called "); if (called && (!named || called < named)) named = called; if (tmp && (!named || tmp < named)) /* found an "of" */ insert_the = TRUE; /* stupid special case: lacks "of" but needs "the" */ else if (!named && (l = strlen(str)) >= 31 && !strcmp(&str[l - 31], "Platinum Yendorian Express Card")) insert_the = TRUE; } } if (insert_the) Strcpy(buf, "the "); else buf[0] = '\0'; Strcat(buf, str); return buf; } char * The(str) const char *str; { register char *tmp = the(str); *tmp = highc(*tmp); 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) { Sprintf(prefix, "%ld ", otmp->quan); bp = strprepend(bp, prefix); } 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; } /* various singular words that vtense would otherwise categorize as plural */ static const char * const special_subjs[] = { "erinys", "manes", /* this one is ambiguous */ "Cyclops", "Hippocrates", "Pelias", "aklys", "amnesia", "paralysis", 0 }; /* 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, ltmp; const char *sp, *spot; const char * const *spec; /* * 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) { if (!strncmpi(subj, "a ", 2) || !strncmpi(subj, "an ", 3)) goto sing; spot = (const char *)0; for (sp = subj; (sp = index(sp, ' ')) != 0; ++sp) { if (!strncmp(sp, " of ", 4) || !strncmp(sp, " from ", 6) || !strncmp(sp, " called ", 8) || !strncmp(sp, " named ", 7) || !strncmp(sp, " labeled ", 9)) { if (sp != subj) spot = sp - 1; break; } } len = (int) strlen(subj); if (!spot) spot = subj + len - 1; /* * plural: anything that ends in 's', but not '*us' or '*ss'. * Guess at a few other special cases that makeplural creates. */ if ((*spot == 's' && spot != subj && (*(spot-1) != 'u' && *(spot-1) != 's')) || ((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))) { /* check for special cases to avoid false matches */ len = (int)(spot - subj) + 1; for (spec = special_subjs; *spec; spec++) { ltmp = strlen(*spec); if (len == ltmp && !strncmpi(*spec, subj, len)) goto sing; /* also check for to catch things like "the invisible erinys" */ if (len > ltmp && *(spot - ltmp) == ' ' && !strncmpi(*spec, spot - ltmp + 1, ltmp)) goto sing; } return strcpy(buf, verb); } /* * 3rd person plural doesn't end in telltale 's'; * 2nd person singular behaves as if plural. */ if (!strcmpi(subj, "they") || !strcmpi(subj, "you")) return strcpy(buf, verb); } sing: 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) register struct obj *obj; { register char *s = doname(obj); *s = highc(*s); return(s); } /* returns "your xname(obj)" or "Foobar's xname(obj)" or "the xname(obj)" */ char * 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() */ char * Yname2(obj) struct obj *obj; { char *s = yname(obj); *s = highc(*s); return s; } /* returns "your simple_typename(obj->otyp)" * or "Foobar's simple_typename(obj->otyp)" * or "the simple_typename(obj-otyp)" */ char * ysimple_name(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, " "), simple_typename(obj->otyp), space_left); } /* capitalized variant of ysimple_name() */ char * Ysimple_name2(obj) struct obj *obj; { char *s = ysimple_name(obj); *s = highc(*s); return s; } static const char *wrp[] = { "wand", "ring", "potion", "scroll", "gem", "amulet", "spellbook", "spell book", /* for non-specific wishes */ "weapon", "armor", "armour", "tool", "food", "comestible", }; static const char wrpsym[] = { WAND_CLASS, RING_CLASS, POTION_CLASS, SCROLL_CLASS, GEM_CLASS, AMULET_CLASS, SPBOOK_CLASS, SPBOOK_CLASS, WEAPON_CLASS, ARMOR_CLASS, ARMOR_CLASS, TOOL_CLASS, FOOD_CLASS, FOOD_CLASS }; #endif /* OVLB */ #ifdef OVL0 /* Plural routine; chiefly used for user-defined fruits. We have to try to * account for everything reasonable the player has; something unreasonable * can still break the code. However, it's still a lot more accurate than * "just add an s at the end", which Rogue uses... * * Also used for plural monster names ("Wiped out all homunculi.") * and body parts. * * Also misused by muse.c to convert 1st person present verbs to 2nd person. */ char * makeplural(oldstr) const char *oldstr; { /* Note: cannot use strcmpi here -- it'd give MATZot, CAVEMeN,... */ register char *spot; char *str = nextobuf(); const char *excess = (char *)0; int len; while (*oldstr==' ') oldstr++; if (!oldstr || !*oldstr) { impossible("plural of null?"); Strcpy(str, "s"); return str; } 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; /* Search for common compounds, ex. lump of royal jelly */ for(spot=str; *spot; spot++) { if (!strncmp(spot, " of ", 4) || !strncmp(spot, " labeled ", 9) || !strncmp(spot, " called ", 8) || !strncmp(spot, " named ", 7) || !strcmp(spot, " above") /* lurkers above */ || !strncmp(spot, " versus ", 8) || !strncmp(spot, " from ", 6) || !strncmp(spot, " in ", 4) || !strncmp(spot, " on ", 4) || !strncmp(spot, " a la ", 6) || !strncmp(spot, " with", 5) /* " with "? */ || !strncmp(spot, " de ", 4) || !strncmp(spot, " d'", 3) || !strncmp(spot, " du ", 4)) { excess = oldstr + (int) (spot - str); *spot = 0; break; } } spot--; while (*spot==' ') spot--; /* Strip blanks from end */ *(spot+1) = 0; /* Now spot is the last character of the string */ len = strlen(str); /* Single letters */ if (len==1 || !letter(*spot)) { Strcpy(spot+1, "'s"); goto bottom; } /* Same singular and plural; mostly Japanese words except for "manes" */ if ((len == 2 && !strcmp(str, "ya")) || (len >= 2 && !strcmp(spot-1, "ai")) || /* samurai, Uruk-hai */ (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, "drow"))) || (len >= 5 && (!strcmp(spot-4, "sheep") || !strcmp(spot-4, "ninja") || !strcmp(spot-4, "shito") || !strcmp(spot-7, "shuriken") || !strcmp(spot-4, "tengu") || !strcmp(spot-4, "manes"))) || (len >= 6 && (!strcmp(spot-5, "ki-rin") || !strcmp(spot-5, "Nazgul"))) || (len >= 7 && !strcmp(spot-6, "gunyoki"))) goto bottom; /* man/men ("Wiped out all cavemen.") */ if (len >= 3 && !strcmp(spot-2, "man") && (len<6 || strcmp(spot-5, "shaman")) && (len<5 || strcmp(spot-4, "human"))) { *(spot-1) = 'e'; goto bottom; } /* tooth/teeth */ if (len >= 5 && !strcmp(spot-4, "tooth")) { Strcpy(spot-3, "eeth"); goto bottom; } /* knife/knives, etc... */ if (!strcmp(spot-1, "fe")) { Strcpy(spot-1, "ves"); goto bottom; } else if (*spot == 'f') { if (index("lr", *(spot-1)) || index(vowels, *(spot-1))) { Strcpy(spot, "ves"); goto bottom; } else if (len >= 5 && !strncmp(spot-4, "staf", 4)) { Strcpy(spot-1, "ves"); goto bottom; } } /* foot/feet (body part) */ if (len >= 4 && !strcmp(spot-3, "foot")) { Strcpy(spot-2, "eet"); goto bottom; } /* ium/ia (mycelia, baluchitheria) */ if (len >= 3 && !strcmp(spot-2, "ium")) { *(spot--) = (char)0; *spot = 'a'; goto bottom; } /* algae, larvae, hyphae (another fungus part) */ if ((len >= 4 && !strcmp(spot-3, "alga")) || (len >= 5 && (!strcmp(spot-4, "hypha") || !strcmp(spot-4, "larva")))) { Strcpy(spot, "ae"); 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; } /* vortex/vortices */ if (len >= 6 && !strcmp(spot-3, "rtex")) { Strcpy(spot-1, "ices"); goto bottom; } /* djinni/djinn (note: also efreeti/efreet) */ if (len >= 6 && !strcmp(spot-5, "djinni")) { *spot = (char)0; goto bottom; } /* mumak/mumakil */ if (len >= 5 && !strcmp(spot-4, "mumak")) { Strcpy(spot+1, "il"); goto bottom; } /* sis/ses (nemesis) */ if (len >= 3 && !strcmp(spot-2, "sis")) { *(spot-1) = 'e'; goto bottom; } /* erinys/erinyes */ if (len >= 6 && !strcmp(spot-5, "erinys")) { Strcpy(spot, "es"); goto bottom; } /* mouse/mice,louse/lice (not a monster, but possible in food names) */ if (len >= 5 && !strcmp(spot-3, "ouse") && index("MmLl", *(spot-4))) { Strcpy(spot-3, "ice"); goto bottom; } /* matzoh/matzot, possible food name */ if (len >= 6 && (!strcmp(spot-5, "matzoh") || !strcmp(spot-5, "matzah"))) { Strcpy(spot-1, "ot"); goto bottom; } if (len >= 5 && (!strcmp(spot-4, "matzo") || !strcmp(spot-5, "matza"))) { Strcpy(spot, "ot"); goto bottom; } /* child/children (for wise guys who give their food funny names) */ if (len >= 5 && !strcmp(spot-4, "child")) { Strcpy(spot, "dren"); goto bottom; } /* note: -eau/-eaux (gateau, bordeau...) */ /* note: ox/oxen, VAX/VAXen, goose/geese */ /* Ends in z, x, s, ch, sh; add an "es" */ if (index("zxs", *spot) || (len >= 2 && *spot=='h' && index("cs", *(spot-1))) /* Kludge to get "tomatoes" and "potatoes" right */ || (len >= 4 && !strcmp(spot-2, "ato"))) { Strcpy(spot+1, "es"); goto bottom; } /* Ends in y preceded by consonant (note: also "qu") change to "ies" */ if (*spot == 'y' && (!index(vowels, *(spot-1)))) { Strcpy(spot, "ies"); goto bottom; } /* Default: append an 's' */ Strcpy(spot+1, "s"); bottom: if (excess) Strcpy(eos(str), excess); return str; } #endif /* OVL0 */ struct o_range { const char *name, oclass; int f_o_range, l_o_range; }; #ifndef OVLB STATIC_DCL const struct o_range o_ranges[]; #else /* OVLB */ /* wishable subranges of objects */ /* KMH, balance patch -- fixed */ STATIC_OVL NEARDATA const struct o_range o_ranges[] = { { "bag", TOOL_CLASS, SACK, BAG_OF_TRICKS }, { "lamp", TOOL_CLASS, OIL_LAMP, MAGIC_LAMP }, { "candle", TOOL_CLASS, TALLOW_CANDLE, MAGIC_CANDLE }, { "horn", TOOL_CLASS, TOOLED_HORN, HORN_OF_PLENTY }, { "shield", ARMOR_CLASS, SMALL_SHIELD, SHIELD_OF_REFLECTION }, { "helm", ARMOR_CLASS, ELVEN_LEATHER_HELM, HELM_OF_TELEPATHY }, { "gloves", ARMOR_CLASS, LEATHER_GLOVES, GAUNTLETS_OF_DEXTERITY }, { "gauntlets", ARMOR_CLASS, LEATHER_GLOVES, GAUNTLETS_OF_DEXTERITY }, { "boots", ARMOR_CLASS, LOW_BOOTS, LEVITATION_BOOTS }, { "shoes", ARMOR_CLASS, LOW_BOOTS, IRON_SHOES }, { "cloak", ARMOR_CLASS, MUMMY_WRAPPING, CLOAK_OF_DISPLACEMENT }, #ifdef TOURIST { "shirt", ARMOR_CLASS, HAWAIIAN_SHIRT, T_SHIRT }, #endif { "dragon scales", ARMOR_CLASS, GRAY_DRAGON_SCALES, YELLOW_DRAGON_SCALES }, { "dragon scale mail", ARMOR_CLASS, GRAY_DRAGON_SCALE_MAIL, YELLOW_DRAGON_SCALE_MAIL }, { "sword", WEAPON_CLASS, ORCISH_SHORT_SWORD, TSURUGI }, { "polearm", WEAPON_CLASS, PARTISAN, LANCE }, #ifdef LIGHTSABERS { "lightsaber", WEAPON_CLASS, GREEN_LIGHTSABER, RED_DOUBLE_LIGHTSABER }, #endif #ifdef FIREARMS { "firearm", WEAPON_CLASS, PISTOL, AUTO_SHOTGUN }, { "gun", WEAPON_CLASS, PISTOL, AUTO_SHOTGUN }, { "grenade", WEAPON_CLASS, FRAG_GRENADE, GAS_GRENADE }, #endif #ifdef WIZARD { "venom", VENOM_CLASS, BLINDING_VENOM, ACID_VENOM }, #endif { "gray stone", GEM_CLASS, LUCKSTONE, FLINT }, { "grey stone", GEM_CLASS, LUCKSTONE, FLINT }, }; #define BSTRCMP(base,ptr,string) ((ptr) < base || strcmp((ptr),string)) #define BSTRCMPI(base,ptr,string) ((ptr) < base || strcmpi((ptr),string)) #define BSTRNCMP(base,ptr,string,num) ((ptr) STRCMPI so that they are case insensitive * catching things like "bag of Tricks" */ char * makesingular(oldstr) const char *oldstr; { register char *p, *bp; char *str = nextobuf(); if (!oldstr || !*oldstr) { impossible("singular of null?"); str[0] = 0; return str; } Strcpy(str, oldstr); bp = str; while (*bp == ' ') bp++; /* find "cloves of garlic", "worthless pieces of blue glass" */ if ((p = strstri(bp, "s of ")) != 0) { /* but don't singularize "gauntlets", "boots", "Eyes of the.." */ if (BSTRNCMPI(bp, p-3, "Eye", 3) && BSTRNCMP(bp, p-4, "boot", 4) && BSTRNCMP(bp, p-8, "gauntlet", 8)) while ((*p = *(p+1)) != 0) p++; return bp; } /* remove -s or -es (boxes) or -ies (rubies) */ p = eos(bp); if (p >= bp+1 && p[-1] == 's') { if (p >= bp+2 && p[-2] == 'e') { if (p >= bp+3 && p[-3] == 'i') { if(!BSTRCMPI(bp, p-7, "cookies") || !BSTRCMPI(bp, p-4, "pies")) goto mins; Strcpy(p-3, "y"); return bp; } /* note: cloves / knives from clove / knife */ if(!BSTRCMPI(bp, p-6, "knives")) { Strcpy(p-3, "fe"); return bp; } if(!BSTRCMPI(bp, p-6, "staves")) { Strcpy(p-3, "ff"); return bp; } if (!BSTRCMPI(bp, p-6, "leaves")) { Strcpy(p-3, "f"); return bp; } if (!BSTRCMP(bp, p-8, "vortices")) { Strcpy(p-4, "ex"); return bp; } /* note: nurses, axes but boxes */ if (!BSTRCMP(bp, p-5, "boxes") || !BSTRCMP(bp, p-4, "ches") ) { p[-2] = 0; return bp; } if (!BSTRCMPI(bp, p-6, "gloves") || !BSTRCMP(bp, p-6, "lenses") || !BSTRCMPI(bp, p-5, "shoes") || !BSTRCMPI(bp, p-6, "scales")) return bp; } else if (!BSTRCMPI(bp, p-5, "boots") || !BSTRCMP(bp, p-9, "gauntlets") || !BSTRCMPI(bp, p-6, "tricks") || !BSTRCMPI(bp, p-9, "paralysis") || !BSTRCMPI(bp, p-5, "glass") || !BSTRCMPI(bp, p-4, "ness") || !BSTRCMPI(bp, p-14, "shape changers") || !BSTRCMPI(bp, p-15, "detect monsters") || !BSTRCMPI(bp, p-21, "Medallion of Shifters") || /* WAC added */ !BSTRCMPI(bp, p-12, "Key of Chaos") || #ifdef WALLET_O_P !BSTRCMPI(bp, p-7, "Perseus") || /* WAC added */ #endif !BSTRCMPI(bp, p-11, "Aesculapius") || /* staff */ !BSTRCMP(bp, p-10, "eucalyptus") || #ifdef WIZARD !BSTRCMP(bp, p-9, "iron bars") || #endif !BSTRCMP(bp, p-5, "aklys") || !BSTRCMP(bp, p-6, "fungus")) return bp; mins: p[-1] = 0; } else { if(!BSTRCMPI(bp, p-5, "teeth")) { Strcpy(p-5, "tooth"); return bp; } if (!BSTRCMP(bp, p-5, "fungi")) { Strcpy(p-5, "fungus"); return bp; } /* here we cannot find the plural suffix */ } return bp; } /* compare user string against object name string using fuzzy matching */ static boolean wishymatch(u_str, o_str, retry_inverted) const char *u_str; /* from user, so might be variant spelling */ const char *o_str; /* from objects[], so is in canonical form */ boolean retry_inverted; /* optional extra "of" handling */ { /* special case: wizards can wish for traps. The object is "beartrap" * and the trap is "bear trap", so to let wizards wish for both we * must not fuzzymatch. */ #ifdef WIZARD if (wizard && !strcmp(o_str, "beartrap")) return !strncmpi(o_str, u_str, 8); #endif /* ignore spaces & hyphens and upper/lower case when comparing */ if (fuzzymatch(u_str, o_str, " -", TRUE)) return TRUE; if (retry_inverted) { const char *u_of, *o_of; char *p, buf[BUFSZ]; /* when just one of the strings is in the form "foo of bar", convert it into "bar foo" and perform another comparison */ u_of = strstri(u_str, " of "); o_of = strstri(o_str, " of "); if (u_of && !o_of) { Strcpy(buf, u_of + 4); p = eos(strcat(buf, " ")); while (u_str < u_of) *p++ = *u_str++; *p = '\0'; return fuzzymatch(buf, o_str, " -", TRUE); } else if (o_of && !u_of) { Strcpy(buf, o_of + 4); p = eos(strcat(buf, " ")); while (o_str < o_of) *p++ = *o_str++; *p = '\0'; return fuzzymatch(u_str, buf, " -", TRUE); } } /* [note: if something like "elven speed boots" ever gets added, these special cases should be changed to call wishymatch() recursively in order to get the "of" inversion handling] */ if (!strncmp(o_str, "dwarvish ", 9)) { if (!strncmpi(u_str, "dwarven ", 8)) return fuzzymatch(u_str + 8, o_str + 9, " -", TRUE); } else if (!strncmp(o_str, "elven ", 6)) { if (!strncmpi(u_str, "elvish ", 7)) return fuzzymatch(u_str + 7, o_str + 6, " -", TRUE); else if (!strncmpi(u_str, "elfin ", 6)) return fuzzymatch(u_str + 6, o_str + 6, " -", TRUE); } else if (!strcmp(o_str, "aluminum")) { /* this special case doesn't really fit anywhere else... */ /* (note that " wand" will have been stripped off by now) */ if (!strcmpi(u_str, "aluminium")) return fuzzymatch(u_str + 9, o_str + 8, " -", TRUE); } return FALSE; } /* alternate spellings; if the difference is only the presence or absence of spaces and/or hyphens (such as "pickaxe" vs "pick axe" vs "pick-axe") then there is no need for inclusion in this list; likewise for ``"of" inversions'' ("boots of speed" vs "speed boots") */ struct alt_spellings { const char *sp; int ob; } spellings[] = { { "pickax", PICK_AXE }, { "whip", BULLWHIP }, { "saber", SILVER_SABER }, { "silver sabre", SILVER_SABER }, { "smooth shield", SHIELD_OF_REFLECTION }, { "grey dragon scale mail", GRAY_DRAGON_SCALE_MAIL }, { "grey dragon scales", GRAY_DRAGON_SCALES }, { "enchant armour", SCR_ENCHANT_ARMOR }, { "destroy armour", SCR_DESTROY_ARMOR }, { "scroll of enchant armour", SCR_ENCHANT_ARMOR }, { "scroll of destroy armour", SCR_DESTROY_ARMOR }, { "leather armour", LEATHER_ARMOR }, { "studded leather armour", STUDDED_LEATHER_ARMOR }, { "iron ball", HEAVY_IRON_BALL }, { "lantern", BRASS_LANTERN }, { "mattock", DWARVISH_MATTOCK }, { "amulet of poison resistance", AMULET_VERSUS_POISON }, { "stone", ROCK }, { "can", TIN }, { "can opener", TIN_OPENER }, { "kelp", KELP_FROND }, { "eucalyptus", EUCALYPTUS_LEAF }, { "grapple", GRAPPLING_HOOK }, /* KMH, balance patch -- new items */ { "amulet versus stoning", AMULET_VERSUS_STONE }, { "amulet of stone resistance", AMULET_VERSUS_STONE }, { "health stone", HEALTHSTONE }, #ifdef FIREARMS { "handgun", PISTOL }, { "hand gun", PISTOL }, { "revolver", PISTOL }, { "bazooka", ROCKET_LAUNCHER }, { "hand grenade", FRAG_GRENADE }, { "dynamite", STICK_OF_DYNAMITE }, #endif #ifdef ZOUTHERN { "kiwifruit", APPLE }, { "kiwi fruit", APPLE }, { "kiwi", APPLE }, /* Actually refers to the bird */ #endif #ifdef WIZARD /* KMH, balance patch -- How lazy are we going to let the players get? */ /* WAC Added Abbreviations */ /* Tools */ { "BoH", BAG_OF_HOLDING }, { "BoO", BELL_OF_OPENING }, { "ML", MAGIC_LAMP }, { "MM", MAGIC_MARKER }, { "UH", UNICORN_HORN }, /* Rings */ { "RoC", RIN_CONFLICT }, { "RoPC", RIN_POLYMORPH_CONTROL }, { "RoTC", RIN_TELEPORT_CONTROL }, /* Scrolls */ { "SoC", SCR_CHARGING }, { "SoEA", SCR_ENCHANT_ARMOR }, { "SoEW", SCR_ENCHANT_WEAPON }, { "SoG", SCR_GENOCIDE }, { "SoI", SCR_IDENTIFY }, { "SoRC", SCR_REMOVE_CURSE }, /* Potions */ { "PoEH", POT_EXTRA_HEALING}, { "PoGL", POT_GAIN_LEVEL}, { "PoW", POT_WATER}, /* Amulet */ { "AoESP", AMULET_OF_ESP}, { "AoLS", AMULET_OF_LIFE_SAVING}, { "AoY", AMULET_OF_YENDOR}, /* Wands */ { "WoW", WAN_WISHING}, { "WoCM", WAN_CREATE_MONSTER}, { "WoT", WAN_TELEPORTATION}, { "WoUT", WAN_UNDEAD_TURNING}, /* Armour */ { "BoL", LEVITATION_BOOTS}, { "BoS", SPEED_BOOTS}, { "SB", SPEED_BOOTS}, { "BoWW", WATER_WALKING_BOOTS}, { "WWB", WATER_WALKING_BOOTS}, { "CoD", CLOAK_OF_DISPLACEMENT}, { "CoI", CLOAK_OF_INVISIBILITY}, { "CoMR", CLOAK_OF_MAGIC_RESISTANCE}, { "GoD", GAUNTLETS_OF_DEXTERITY}, { "GoP", GAUNTLETS_OF_POWER}, { "HoB", HELM_OF_BRILLIANCE}, { "HoOA", HELM_OF_OPPOSITE_ALIGNMENT}, { "HoT", HELM_OF_TELEPATHY}, { "SoR", SHIELD_OF_REFLECTION}, #endif #ifdef TOURIST { "camera", EXPENSIVE_CAMERA }, { "T shirt", T_SHIRT }, { "tee shirt", T_SHIRT }, #endif { (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; register struct obj *otmp; int cnt, spe, spesgn, typ, very, rechrg; int blessed, uncursed, iscursed, ispoisoned, isgreased, isdrained; int eroded, eroded2, erodeproof; #ifdef INVISIBLE_OBJECTS int isinvisible; #endif int halfeaten, halfdrained, mntmp, contents; int islit, unlabeled, ishistoric, isdiluted; struct fruit *f; int ftype = current_fruit; char fruitbuf[BUFSZ]; /* Fruits may not mess up the ability to wish for real objects (since * you can leave a fruit in a bones file and it will be added to * another person's game), so they must be checked for last, after * stripping all the possible prefixes and seeing if there's a real * name in there. So we have to save the full original name. However, * it's still possible to do things like "uncursed burnt Alaska", * or worse yet, "2 burned 5 course meals", so we need to loop to * strip off the prefixes again, this time stripping only the ones * possible on food. * We could get even more detailed so as to allow food names with * prefixes that _are_ possible on food, so you could wish for * "2 3 alarm chilis". Currently this isn't allowed; options.c * automatically sticks 'candied' in front of such names. */ char oclass; char *un, *dn, *actualn; const char *name=0; cnt = spe = spesgn = typ = very = rechrg = blessed = uncursed = iscursed = isdrained = halfdrained = #ifdef INVISIBLE_OBJECTS isinvisible = #endif ispoisoned = isgreased = eroded = eroded2 = erodeproof = halfeaten = islit = unlabeled = ishistoric = isdiluted = 0; mntmp = NON_PM; #define UNDEFINED 0 #define EMPTY 1 #define SPINACH 2 contents = UNDEFINED; oclass = 0; actualn = dn = un = 0; 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") || !strcmpi(bp, "none")) return no_wish; /* save the [nearly] unmodified choice string */ Strcpy(fruitbuf, bp); for(;;) { register int l; if (!bp || !*bp) goto any; if (!strncmpi(bp, "an ", l=3) || !strncmpi(bp, "a ", l=2)) { cnt = 1; } else if (!strncmpi(bp, "the ", l=4)) { ; /* just increment `bp' by `l' below */ } else if (!cnt && digit(*bp) && strcmp(bp, "0")) { cnt = atoi(bp); 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) /*WAC removed this. Holy is in some artifact weapon names || !strncmpi(bp, "holy ", l=5) */ ) { blessed = 1; } else if (!strncmpi(bp, "cursed ", l=7) || !strncmpi(bp, "unholy ", l=7)) { iscursed = 1; } else if (!strncmpi(bp, "uncursed ", l=9)) { uncursed = 1; #ifdef INVISIBLE_OBJECTS } else if (!strncmpi(bp, "visible ", l=8)) { isinvisible = -1; } else if (!strncmpi(bp, "invisible ", l=10)) { isinvisible = 1; #endif } else if (!strncmpi(bp, "rustproof ", l=10) || !strncmpi(bp, "erodeproof ", l=11) || !strncmpi(bp, "corrodeproof ", l=13) || !strncmpi(bp, "fixed ", l=6) || !strncmpi(bp, "fireproof ", l=10) || !strncmpi(bp, "rotproof ", l=9)) { erodeproof = 1; } else if (!strncmpi(bp,"lit ", l=4) || !strncmpi(bp,"burning ", l=8)) { islit = 1; } else if (!strncmpi(bp,"unlit ", l=6) || !strncmpi(bp,"extinguished ", l=13)) { islit = 0; /* "unlabeled" and "blank" are synonymous */ } else if (!strncmpi(bp,"unlabeled ", l=10) || !strncmpi(bp,"unlabelled ", l=11) || !strncmpi(bp,"blank ", l=6)) { unlabeled = 1; } else if(!strncmpi(bp, "poisoned ",l=9) #ifdef WIZARD || (wizard && !strncmpi(bp, "trapped ",l=8)) #endif ) { ispoisoned=1; } else if(!strncmpi(bp, "greased ",l=8)) { isgreased=1; } else if (!strncmpi(bp, "very ", l=5)) { /* very rusted very heavy iron ball */ very = 1; } else if (!strncmpi(bp, "thoroughly ", l=11)) { very = 2; } else if (!strncmpi(bp, "rusty ", l=6) || !strncmpi(bp, "rusted ", l=7) || !strncmpi(bp, "burnt ", l=6) || !strncmpi(bp, "burned ", l=7)) { eroded = 1 + very; very = 0; } else if (!strncmpi(bp, "corroded ", l=9) || !strncmpi(bp, "rotted ", l=7)) { eroded2 = 1 + very; very = 0; } else if (!strncmpi(bp, "partly drained ", l=15)) { isdrained = 1; halfdrained = 1; } else if (!strncmpi(bp, "drained ", l=8)) { isdrained = 1; halfdrained = 0; } else if (!strncmpi(bp, "partly eaten ", l=13)) { halfeaten = 1; } else if (!strncmpi(bp, "historic ", l=9)) { 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++; if (!strcmpi(p, "lit)")) { islit = 1; } else { spe = atoi(p); while(digit(*p)) p++; if (*p == ':') { p++; rechrg = spe; spe = atoi(p); while (digit(*p)) p++; } if (*p != ')') { spe = rechrg = 0; } else { spesgn = 1; p++; if (*p) Strcat(bp, p); } } } } /* otmp->spe is type schar; so we don't want spe to be any bigger or smaller. also, spe should always be positive -- some cheaters may try to confuse atoi() */ if (spe < 0) { spesgn = -1; /* cheaters get what they deserve */ spe = abs(spe); } if (spe > SCHAR_LIM) spe = SCHAR_LIM; if (rechrg < 0 || rechrg > 7) rechrg = 7; /* recharge_limit */ /* now we have the actual name, as delivered by xname, say green potions called whisky scrolls labeled "QWERTY" egg fortune cookies very heavy iron ball named hoei wand of wishing elven cloak */ if ((p = strstri(bp, " named ")) != 0) { *p = 0; name = p+7; } if ((p = strstri(bp, " called ")) != 0) { *p = 0; un = p+8; /* "helmet called telepathy" is not "helmet" (a specific type) * "shield called reflection" is not "shield" (a general type) */ for(i = 0; i < SIZE(o_ranges); i++) if(!strcmpi(bp, o_ranges[i].name)) { oclass = o_ranges[i].oclass; goto srch; } } if ((p = strstri(bp, " labeled ")) != 0) { *p = 0; dn = p+9; } else if ((p = strstri(bp, " labelled ")) != 0) { *p = 0; dn = p+10; } if ((p = strstri(bp, " of spinach")) != 0) { *p = 0; contents = SPINACH; } /* Skip over "pair of ", "pairs of", "set of" and "sets of". Accept "3 pair of boots" as well as "3 pairs of boots". It is valid English either way. See makeplural() for more on pair/pairs. We should only double count if the object in question is not refered to as a "pair of". E.g. We should double if the player types "pair of spears", but not if the player types "pair of lenses". Luckily (?) all objects that are refered to as pairs -- boots, gloves, and lenses -- are also not mergable, so cnt is ignored anyway. */ if(!strncmpi(bp, "pair of ",8)) { bp += 8; cnt *= 2; } else if(cnt > 1 && !strncmpi(bp, "pairs of ",9)) { bp += 9; cnt *= 2; } else if (!strncmpi(bp, "set of ",7)) { bp += 7; } else if (!strncmpi(bp, "sets of ",8)) { bp += 8; } /* * Find corpse type using "of" (figurine of an orc, tin of orc meat) * Don't check if it's a wand or spellbook. * (avoid "wand/finger of death" confusion). * (WAC avoid "hand/eye of vecna", "wallet of perseus" * "medallion of shifters", "stake of van helsing" similarly * ALI "potion of vampire blood" also). */ if (!strstri(bp, "wand ") && !strstri(bp, "spellbook ") && !strstri(bp, "hand ") && !strstri(bp, "eye ") && !strstri(bp, "medallion ") && !strstri(bp, "stake ") && !strstri(bp, "potion ") && !strstri(bp, "potions ") && !strstri(bp, "finger ")) { if ((p = strstri(bp, " of ")) != 0 && (mntmp = name_to_mon(p+4)) >= LOW_PM) *p = 0; } /* Find corpse type w/o "of" (red dragon scale mail, yeti corpse) */ if (strncmpi(bp, "samurai sword", 13)) /* not the "samurai" monster! */ if (strncmpi(bp, "wizard lock", 11)) /* not the "wizard" monster! */ if (strncmpi(bp, "ninja-to", 8)) /* not the "ninja" rank */ if (strncmpi(bp, "master key", 10)) /* not the "master" rank */ if (strncmpi(bp, "magenta", 7)) /* not the "mage" rank */ if (strncmpi(bp, "Thiefbane", 9)) /* not the "thief" rank */ if (strncmpi(bp, "Ogresmasher", 11)) /* not the "ogre" monster */ if (strncmpi(bp, "Bat from Hell", 13)) /* not the "bat" monster */ if (strncmpi(bp, "vampire blood", 13)) /* not the "vampire" monster */ if (mntmp < LOW_PM && strlen(bp) > 2 && (mntmp = name_to_mon(bp)) >= LOW_PM) { 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; else if (!*bp && !actualn && !dn && !un && !oclass) { /* no referent; they don't really mean a monster type */ bp = obp; mntmp = NON_PM; } } /* first change to singular if necessary */ if (*bp) { char *sng = makesingular(bp); if (strcmp(bp, sng)) { if (cnt == 1) cnt = 2; Strcpy(bp, sng); } } /* Alternate spellings (pick-ax, silver sabre, &c) */ { struct alt_spellings *as = spellings; while(as->sp) { if (fuzzymatch(bp, as->sp, " -", TRUE)) { typ = as->ob; goto typfnd; } as++; } /* can't use spellings list for this one due to shuffling */ if (!strncmpi(bp, "grey spell", 10)) *(bp + 2) = 'a'; } /* dragon scales - assumes order of dragons */ if(!strcmpi(bp, "scales") && mntmp >= PM_GRAY_DRAGON && mntmp <= PM_YELLOW_DRAGON) { typ = GRAY_DRAGON_SCALES + mntmp - PM_GRAY_DRAGON; mntmp = NON_PM; /* no monster */ goto typfnd; } p = eos(bp); if(!BSTRCMPI(bp, p-10, "holy water")) { typ = POT_WATER; if ((p-bp) >= 12 && *(p-12) == 'u') iscursed = 1; /* unholy water */ else blessed = 1; goto typfnd; } if(unlabeled && !BSTRCMPI(bp, p-6, "scroll")) { typ = SCR_BLANK_PAPER; goto typfnd; } if(unlabeled && !BSTRCMPI(bp, p-9, "spellbook")) { typ = SPE_BLANK_PAPER; goto typfnd; } /* * NOTE: Gold pieces are handled as objects nowadays, and therefore * this section should probably be reconsidered as well as the entire * gold/money concept. Maybe we want to add other monetary units as * well in the future. (TH) */ if(!BSTRCMPI(bp, p-10, "gold piece") || !BSTRCMPI(bp, p-7, "zorkmid") || !strcmpi(bp, "gold") || !strcmpi(bp, "money") || !strcmpi(bp, "coin") || *bp == GOLD_SYM) { if (cnt > 5000 #ifdef WIZARD && !wizard #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 #ifdef WIZARD && (wizard || i != VENOM_CLASS) #else && i != VENOM_CLASS #endif ) { oclass = i; goto any; } /* Search for class names: XXXXX potion, scroll of XXXXX. Avoid */ /* false hits on, e.g., rings for "ring mail". */ /* false hits on "GrayWAND", "Staff of WitheRING" -- WAC */ if(strncmpi(bp, "enchant ", 8) && strncmpi(bp, "destroy ", 8) && strncmpi(bp, "food detection", 14) && strncmpi(bp, "ring mail", 9) && strncmpi(bp, "studded leather arm", 19) && strncmpi(bp, "leather arm", 11) && strncmpi(bp, "tooled horn", 11) && strncmpi(bp, "graywand", 8) && strncmpi(bp, "staff of withering", 18) && strncmpi(bp, "one ring", 8) && strncmpi(bp, "food ration", 11) && strncmpi(bp, "meat ring", 9) ) for (i = 0; i < (int)(sizeof wrpsym); i++) { register int j = strlen(wrp[i]); if(!strncmpi(bp, wrp[i], j)){ oclass = wrpsym[i]; if(oclass != AMULET_CLASS) { bp += j; if(!strncmpi(bp, " of ", 4)) actualn = bp+4; /* else if(*bp) ?? */ } else actualn = bp; goto srch; } if(!BSTRCMPI(bp, p-j, wrp[i])){ oclass = wrpsym[i]; p -= j; *p = 0; if(p > bp && p[-1] == ' ') p[-1] = 0; actualn = dn = bp; goto srch; } } /* "grey stone" check must be before general "stone" */ for (i = 0; i < SIZE(o_ranges); i++) if(!strcmpi(bp, o_ranges[i].name)) { typ = rnd_class(o_ranges[i].f_o_range, o_ranges[i].l_o_range); goto typfnd; } if (!BSTRCMPI(bp, p-6, " stone")) { p[-6] = 0; oclass = GEM_CLASS; dn = actualn = bp; goto srch; } else if (!strcmpi(bp, "looking glass")) { ; /* avoid false hit on "* glass" */ } else if (!BSTRCMPI(bp, p-6, " glass") || !strcmpi(bp, "glass")) { register char *g = bp; if (strstri(g, "broken")) return (struct obj *)0; if (!strncmpi(g, "worthless ", 10)) g += 10; if (!strncmpi(g, "piece of ", 9)) g += 9; if (!strncmpi(g, "colored ", 8)) g += 8; else if (!strncmpi(g, "coloured ", 9)) g += 9; if (!strcmpi(g, "glass")) { /* choose random color */ /* 9 different kinds */ typ = LAST_GEM + rnd(9); if (objects[typ].oc_class == GEM_CLASS) goto typfnd; else typ = 0; /* somebody changed objects[]? punt */ } else { /* try to construct canonical form */ char tbuf[BUFSZ]; Strcpy(tbuf, "worthless piece of "); Strcat(tbuf, g); /* assume it starts with the color */ Strcpy(bp, tbuf); } } actualn = bp; if (!dn) dn = actualn; /* ex. "skull cap" */ srch: /* check real names of gems first */ if(!oclass && actualn) { for(i = bases[GEM_CLASS]; i <= LAST_GEM; i++) { register const char *zn; if((zn = OBJ_NAME(objects[i])) && !strcmpi(actualn, zn)) { typ = i; goto typfnd; } } } i = oclass ? bases[(int)oclass] : 1; while(i < NUM_OBJECTS && (!oclass || objects[i].oc_class == oclass)){ register const char *zn; if (actualn && (zn = OBJ_NAME(objects[i])) != 0 && wishymatch(actualn, zn, TRUE)) { typ = i; goto typfnd; } if (dn && (zn = OBJ_DESCR(objects[i])) != 0 && wishymatch(dn, zn, FALSE)) { /* don't match extra descriptions (w/o real name) */ if (!OBJ_NAME(objects[i])) return (struct obj *)0; typ = i; goto typfnd; } if (un && (zn = objects[i].oc_uname) != 0 && wishymatch(un, zn, FALSE)) { typ = i; goto typfnd; } i++; } if (actualn) { struct Jitem *j = Japanese_items; while(j->item) { if (actualn && !strcmpi(actualn, j->name)) { typ = j->item; goto typfnd; } j++; } } if (!strcmpi(bp, "spinach")) { contents = SPINACH; typ = TIN; goto typfnd; } /* Note: not strncmpi. 2 fruits, one capital, one not, are possible. */ { char *fp; int l, cntf; int blessedf, iscursedf, uncursedf, halfeatenf; blessedf = iscursedf = uncursedf = halfeatenf = 0; cntf = 0; fp = fruitbuf; for(;;) { if (!fp || !*fp) break; if (!strncmpi(fp, "an ", l=3) || !strncmpi(fp, "a ", l=2)) { cntf = 1; } else if (!cntf && digit(*fp)) { cntf = atoi(fp); while(digit(*fp)) fp++; while(*fp == ' ') fp++; l = 0; } else if (!strncmpi(fp, "blessed ", l=8)) { blessedf = 1; } else if (!strncmpi(fp, "cursed ", l=7)) { iscursedf = 1; } else if (!strncmpi(fp, "uncursed ", l=9)) { uncursedf = 1; } else if (!strncmpi(fp, "partly eaten ", l=13)) { halfeatenf = 1; } else break; fp += l; } for(f=ffruit; f; f = f->nextf) { char *f1 = f->fname, *f2 = makeplural(f->fname); if(!strncmp(fp, f1, strlen(f1)) || !strncmp(fp, f2, strlen(f2))) { typ = SLIME_MOLD; blessed = blessedf; iscursed = iscursedf; uncursed = uncursedf; halfeaten = halfeatenf; cnt = cntf; ftype = f->fid; goto typfnd; } } } if(!oclass && actualn) { short objtyp; /* Perhaps it's an artifact specified by name, not type */ name = artifact_name(actualn, &objtyp); if(name) { typ = objtyp; goto typfnd; } } #ifdef WIZARD /* Let wizards wish for traps --KAA */ /* 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++) { const char *tname; tname = defsyms[trap_to_defsym(trap)].explanation; if (!strncmpi(tname, bp, strlen(tname))) { /* avoid stupid mistakes */ if((trap == TRAPDOOR || trap == HOLE) && !Can_fall_thru(&u.uz)) trap = ROCKTRAP; (void) maketrap(u.ux, u.uy, trap); pline("%s.", An(tname)); return(&zeroobj); } } /* or some other dungeon features -dlc */ p = eos(bp); if(!BSTRCMP(bp, p-8, "fountain")) { levl[u.ux][u.uy].typ = FOUNTAIN; level.flags.nfountains++; if(!strncmpi(bp, "magic ", 6)) levl[u.ux][u.uy].blessedftn = 1; pline("A %sfountain.", levl[u.ux][u.uy].blessedftn ? "magic " : ""); newsym(u.ux, u.uy); return(&zeroobj); } if(!BSTRCMP(bp, p-6, "throne")) { levl[u.ux][u.uy].typ = THRONE; pline("A throne."); newsym(u.ux, u.uy); return(&zeroobj); } if(!BSTRCMP(bp, p-9, "headstone") || !BSTRCMP(bp, p-5, "grave")) { levl[u.ux][u.uy].typ = GRAVE; make_grave(u.ux, u.uy, (char *) 0); pline("A grave."); newsym(u.ux, u.uy); return(&zeroobj); } if(!BSTRCMP(bp, p-4, "tree")) { levl[u.ux][u.uy].typ = TREE; pline("A tree."); newsym(u.ux, u.uy); return &zeroobj; } # ifdef SINKS if(!BSTRCMP(bp, p-4, "sink")) { levl[u.ux][u.uy].typ = SINK; level.flags.nsinks++; pline("A sink."); newsym(u.ux, u.uy); return &zeroobj; } if(!BSTRCMP(bp, p-6, "toilet")) { levl[u.ux][u.uy].typ = TOILET; level.flags.nsinks++; pline("A toilet."); newsym(u.ux, u.uy); return &zeroobj; } # endif if(!BSTRCMP(bp, p-4, "pool")) { levl[u.ux][u.uy].typ = POOL; del_engr_at(u.ux, u.uy); pline("A pool."); /* Must manually make kelp! */ water_damage(level.objects[u.ux][u.uy], FALSE, TRUE); newsym(u.ux, u.uy); return &zeroobj; } if (!BSTRCMP(bp, p-4, "lava")) { /* also matches "molten lava" */ levl[u.ux][u.uy].typ = LAVAPOOL; del_engr_at(u.ux, u.uy); pline("A pool of molten lava."); if (!(Levitation || Flying)) (void) lava_effects(); newsym(u.ux, u.uy); return &zeroobj; } if(!BSTRCMP(bp, p-5, "altar")) { aligntyp al; levl[u.ux][u.uy].typ = ALTAR; if(!strncmpi(bp, "chaotic ", 8)) al = A_CHAOTIC; else if(!strncmpi(bp, "neutral ", 8)) al = A_NEUTRAL; else if(!strncmpi(bp, "lawful ", 7)) al = A_LAWFUL; else if(!strncmpi(bp, "unaligned ", 10)) al = A_NONE; else /* -1 - A_CHAOTIC, 0 - A_NEUTRAL, 1 - A_LAWFUL */ al = (!rn2(6)) ? A_NONE : rn2((int)A_LAWFUL+2) - 1; levl[u.ux][u.uy].altarmask = Align2amask( al ); pline("%s altar.", An(align_str(al))); newsym(u.ux, u.uy); return(&zeroobj); } if(!BSTRCMP(bp, p-5, "grave") || !BSTRCMP(bp, p-9, "headstone")) { make_grave(u.ux, u.uy, (char *) 0); pline("A grave."); newsym(u.ux, u.uy); return(&zeroobj); } if(!BSTRCMP(bp, p-4, "tree")) { levl[u.ux][u.uy].typ = TREE; pline("A tree."); newsym(u.ux, u.uy); block_point(u.ux, u.uy); return &zeroobj; } if(!BSTRCMP(bp, p-4, "bars")) { levl[u.ux][u.uy].typ = IRONBARS; pline("Iron bars."); newsym(u.ux, u.uy); return &zeroobj; } } #endif if(!oclass) return((struct obj *)0); any: if(!oclass) oclass = wrpsym[rn2((int)sizeof(wrpsym))]; typfnd: if (typ) oclass = objects[typ].oc_class; /* check for some objects that are not allowed */ if (typ && objects[typ].oc_unique) { #ifdef WIZARD if (wizard) ; /* allow unique objects */ else #endif switch (typ) { case AMULET_OF_YENDOR: typ = FAKE_AMULET_OF_YENDOR; break; case CANDELABRUM_OF_INVOCATION: typ = rnd_class(TALLOW_CANDLE, WAX_CANDLE); break; case BELL_OF_OPENING: typ = BELL; break; case SPE_BOOK_OF_THE_DEAD: typ = SPE_BLANK_PAPER; break; } } /* catch any other non-wishable objects */ if (objects[typ].oc_nowish #ifdef WIZARD && !wizard #endif ) return((struct obj *)0); /* convert magic lamps to regular lamps before lighting them or setting the charges */ if (typ == MAGIC_LAMP #ifdef WIZARD && !wizard #endif ) typ = OIL_LAMP; if(typ) { otmp = mksobj(typ, TRUE, FALSE); } else { otmp = mkobj(oclass, FALSE); if (otmp) typ = otmp->otyp; } if (islit && (typ == OIL_LAMP || typ == MAGIC_LAMP || typ == BRASS_LANTERN || typ == TORCH || Is_candle(otmp) || typ == POT_OIL)) { place_object(otmp, u.ux, u.uy); /* make it viable light source */ begin_burn(otmp, FALSE); obj_extract_self(otmp); /* now release it for caller's use */ } if(cnt > 0 && objects[typ].oc_merge && oclass != SPBOOK_CLASS && (typ != CORPSE || !is_reviver(&mons[mntmp])) && (cnt < rnd(6) || #ifdef WIZARD wizard || #endif (cnt <= 7 && Is_candle(otmp)) || (cnt <= 20 && ((oclass == WEAPON_CLASS && is_ammo(otmp)) || typ == ROCK || is_missile(otmp))))) otmp->quan = (long) cnt; #ifdef WIZARD if (oclass == VENOM_CLASS) otmp->spe = 1; #endif if (spesgn == 0) spe = otmp->spe; #ifdef WIZARD else if (wizard) /* no alteration to spe */ ; #endif else if (oclass == ARMOR_CLASS || oclass == WEAPON_CLASS || is_weptool(otmp) || (oclass==RING_CLASS && objects[typ].oc_charged)) { if(spe > rnd(5) && spe > otmp->spe) spe = 0; if(spe > 2 && Luck < 0) spesgn = -1; } else { if (oclass == WAND_CLASS) { if (spe > 1 && spesgn == -1) spe = 1; } else { if (spe > 0 && spesgn == -1) spe = 0; } if (spe > otmp->spe) spe = otmp->spe; } if (spesgn == -1) spe = -spe; /* set otmp->spe. This may, or may not, use spe... */ switch (typ) { case TIN: if (contents==EMPTY) { otmp->corpsenm = NON_PM; otmp->spe = 0; } else if (contents==SPINACH) { otmp->corpsenm = NON_PM; otmp->spe = 1; } break; case SLIME_MOLD: otmp->spe = ftype; /* Fall through */ case SKELETON_KEY: case CHEST: case LARGE_BOX: case HEAVY_IRON_BALL: case IRON_CHAIN: case STATUE: /* otmp->cobj already done in mksobj() */ break; #ifdef MAIL case SCR_MAIL: otmp->spe = 1; break; #endif case WAN_WISHING: #ifdef WIZARD if (!wizard) { #endif otmp->spe = (rn2(10) ? -1 : 0); break; #ifdef WIZARD } /* fall through, if wizard */ #endif default: otmp->spe = spe; } /* 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)) { otmp->corpsenm = NON_PM; /* it's empty */ } else if (!(mons[mntmp].geno & G_UNIQ) && !(mvitals[mntmp].mvflags & G_NOCORPSE) && mons[mntmp].cnutrit != 0) { otmp->corpsenm = mntmp; } break; case CORPSE: if # ifdef WIZARD ((wizard) || # endif /* WIZARD */ (!(mons[mntmp].geno & G_UNIQ) && !(mvitals[mntmp].mvflags & G_NOCORPSE)) # ifdef WIZARD ) # endif /* WIZARD */ { /* beware of random troll or lizard corpse, or of ordinary one being forced to such */ if (otmp->timed) obj_stop_timers(otmp); if (mons[mntmp].msound == MS_GUARDIAN) otmp->corpsenm = genus(mntmp,1); else otmp->corpsenm = mntmp; start_corpse_timeout(otmp); } break; case FIGURINE: if # ifdef WIZARD ((wizard) || # endif /* WIZARD */ ((!(mons[mntmp].geno & G_UNIQ) && !is_human(&mons[mntmp]) # ifdef WIZARD ) # endif /* WIZARD */ #ifdef MAIL && mntmp != PM_MAIL_DAEMON #endif )) otmp->corpsenm = mntmp; break; case EGG: mntmp = can_be_hatched(mntmp); if (mntmp != NON_PM) { otmp->corpsenm = mntmp; if (!dead_species(mntmp, TRUE)) attach_egg_hatch_timeout(otmp); else kill_egg(otmp); } break; case STATUE: otmp->corpsenm = mntmp; if (Has_contents(otmp) && verysmall(&mons[mntmp])) delete_contents(otmp); /* no spellbook */ otmp->spe = ishistoric ? STATUE_HISTORIC : 0; break; case SCALE_MAIL: /* Dragon mail - depends on the order of objects */ /* & dragons. */ if (mntmp >= PM_GRAY_DRAGON && mntmp <= PM_YELLOW_DRAGON) otmp->otyp = GRAY_DRAGON_SCALE_MAIL + mntmp - PM_GRAY_DRAGON; break; } } /* set blessed/cursed -- setting the fields directly is safe * since weight() is called below and addinv() will take care * of luck */ if (iscursed) { curse(otmp); } else if (uncursed) { otmp->blessed = 0; otmp->cursed = (Luck < 0 #ifdef WIZARD && !wizard #endif ); } else if (blessed) { otmp->blessed = (Luck >= 0 #ifdef WIZARD || wizard #endif ); otmp->cursed = (Luck < 0 #ifdef WIZARD && !wizard #endif ); } else if (spesgn < 0) { curse(otmp); } #ifdef INVISIBLE_OBJECTS if (isinvisible) otmp->oinvis = isinvisible > 0 && !always_visible(otmp); #endif /* set eroded */ if (is_damageable(otmp) || otmp->otyp == CRYSKNIFE) { if (eroded && (is_flammable(otmp) || is_rustprone(otmp))) otmp->oeroded = eroded; if (eroded2 && (is_corrodeable(otmp) || is_rottable(otmp))) otmp->oeroded2 = eroded2; /* set erodeproof */ if (erodeproof && !eroded && !eroded2) otmp->oerodeproof = (Luck >= 0 #ifdef WIZARD || wizard #endif ); } /* set otmp->recharged */ if (oclass == WAND_CLASS) { /* prevent wishing abuse */ if (otmp->otyp == WAN_WISHING #ifdef WIZARD && !wizard #endif ) rechrg = 1; otmp->recharged = (unsigned)rechrg; } /* set poisoned */ if (ispoisoned) { if (is_poisonable(otmp)) otmp->opoisoned = (Luck >= 0); else if (Is_box(otmp) || typ == TIN) otmp->otrapped = 1; else if (oclass == FOOD_CLASS) /* try to taint by making it as old as possible */ otmp->age = 1L; } if (isgreased) otmp->greased = 1; if (isdiluted && otmp->oclass == POTION_CLASS && otmp->otyp != POT_WATER) otmp->odiluted = 1; if (name) { const char *aname; short objtyp; char nname[256]; strcpy(nname,name); /* an artifact name might need capitalization fixing */ aname = artifact_name(name, &objtyp); if (aname && objtyp == otmp->otyp) name = aname; # ifdef NOARTIFACTWISH /* Tom -- not always getting what you're wishing for... */ if (restrict_name(otmp, nname) && !rn2(3) && !wizard) { int n = rn2((int)strlen(nname)); register char c1, c2; c1 = lowc(nname[n]); do c2 = 'a' + rn2('z'-'a'); while (c1 == c2); nname[n] = (nname[n] == c1) ? c2 : highc(c2); /* keep same case */ } # endif place_object(otmp, u.ux, u.uy);/* make it viable light source */ otmp = oname(otmp, nname); obj_extract_self(otmp); /* now release it for caller's use */ if (otmp->oartifact) { otmp->quan = 1L; u.uconduct.wisharti++; /* KMH, conduct */ } } /* more wishing abuse: don't allow wishing for certain artifacts */ /* and make them pay; charge them for the wish anyway! */ if ((is_quest_artifact(otmp) || /* [ALI] Can't wish for artifacts which have a set location */ (otmp->oartifact && (otmp->oartifact == ART_KEY_OF_CHAOS || otmp->oartifact == ART_KEY_OF_NEUTRALITY || otmp->oartifact == ART_KEY_OF_LAW || otmp->oartifact == ART_HAND_OF_VECNA || otmp->oartifact == ART_EYE_OF_THE_BEHOLDER || otmp->oartifact == ART_NIGHTHORN || otmp->oartifact == ART_THIEFBANE)) || # ifdef NOARTIFACTWISH /* Wishing for a "weak" artifact is easier than for a stronger one */ (otmp->oartifact && (otmp->oartifact != ART_STING && otmp->oartifact != ART_ELFRIST && otmp->oartifact != ART_ORCRIST && otmp->oartifact != ART_WEREBANE && otmp->oartifact != ART_GRIMTOOTH && otmp->oartifact != ART_DISRUPTER && otmp->oartifact != ART_DEMONBANE && otmp->oartifact != ART_DRAGONBANE && otmp->oartifact != ART_TROLLSBANE && otmp->oartifact != ART_GIANTKILLER && otmp->oartifact != ART_OGRESMASHER && otmp->oartifact != ART_SWORD_OF_BALANCE)) || # endif (otmp->oartifact && rn2(nartifact_exist()) > 1)) #ifdef WIZARD && !wizard #endif ) { artifact_exists(otmp, ONAME(otmp), FALSE); if (Has_contents(otmp)) delete_contents(otmp); 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); } if (isdrained && otmp->otyp == CORPSE && mons[otmp->corpsenm].cnutrit) { int amt; otmp->odrained = 1; amt = mons[otmp->corpsenm].cnutrit - drainlevel(otmp); if (halfdrained) { amt /= 2; if (amt == 0) amt++; } /* (do this adjustment before setting up object's weight) */ consume_oeaten(otmp, -amt); } otmp->owt = weight(otmp); if (very && otmp->otyp == HEAVY_IRON_BALL) otmp->owt += 160; return(otmp); } int rnd_class(first,last) int first,last; { int i, x, sum=0; if (first == last) return (first); for(i=first; i<=last; i++) sum += objects[i].oc_prob; if (!sum) /* all zero */ return first + rn2(last-first+1); x = rnd(sum); for(i=first; i<=last; i++) if (objects[i].oc_prob && (x -= objects[i].oc_prob) <= 0) return i; return 0; } STATIC_OVL const char * Japanese_item_name(i) int i; { struct Jitem *j = Japanese_items; while(j->item) { if (i == j->item) return j->name; j++; } 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 LAB_COAT: return "coat"; #ifdef ALCHEMY_SMOCK case ALCHEMY_SMOCK: return (objects[cloak->otyp].oc_name_known && cloak->dknown) ? "smock" : "apron"; #endif default: break; } } return "cloak"; } const char * mimic_obj_name(mtmp) struct monst *mtmp; { if (mtmp->m_ap_type == M_AP_OBJECT && mtmp->mappearance != STRANGE_OBJECT) { int idx = objects[mtmp->mappearance].oc_descr_idx; if (mtmp->mappearance == GOLD_PIECE) return "gold"; return obj_descr[idx].oc_name; } return "whatcha-may-callit"; } #endif /* OVLB */ /*objnam.c*/ slashem-0.0.7E7F3/src/minion.c0000664000076400007640000002370410545462317014106 0ustar aliali/* SCCS Id: @(#)minion.c 3.4 2003/01/09 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" #include "emin.h" #include "epri.h" void msummon(mon) /* mon summons a monster */ struct monst *mon; { register struct permonst *ptr; register int dtype = NON_PM, cnt = 0; aligntyp atyp; struct monst *mtmp; if (mon) { ptr = mon->data; atyp = (ptr->maligntyp==A_NONE) ? A_NONE : sgn(ptr->maligntyp); if (mon->ispriest || mon->data == &mons[PM_ALIGNED_PRIEST] || mon->data == &mons[PM_ANGEL]) atyp = EPRI(mon)->shralign; } else { ptr = &mons[PM_WIZARD_OF_YENDOR]; 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) : (!rn2(4)) ? dlord(atyp) : ndemon(atyp); cnt = (!rn2(4) && is_ndemon(&mons[dtype])) ? 2 : 1; } else if (is_dlord(ptr)) { dtype = (!rn2(50)) ? dprince(atyp) : (!rn2(20)) ? dlord(atyp) : ndemon(atyp); cnt = (!rn2(4) && is_ndemon(&mons[dtype])) ? 2 : 1; } else if (is_ndemon(ptr)) { dtype = (!rn2(20)) ? dlord(atyp) : (!rn2(6)) ? ndemon(atyp) : monsndx(ptr); cnt = 1; } else if (is_lminion(mon)) { dtype = (is_lord(ptr) && !rn2(20)) ? llord() : (is_lord(ptr) || !rn2(6)) ? lminion() : monsndx(ptr); cnt = (!rn2(4) && !is_lord(&mons[dtype])) ? 2 : 1; } else if (ptr == &mons[PM_ANGEL]) { /* non-lawful angels can also summon */ if (!rn2(6)) { switch (atyp) { /* see summon_minion */ case A_NEUTRAL: dtype = PM_AIR_ELEMENTAL + rn2(4); break; case A_CHAOTIC: case A_NONE: dtype = ndemon(atyp); break; } } else { dtype = PM_ANGEL; } cnt = (!rn2(4) && !is_lord(&mons[dtype])) ? 2 : 1; } if (dtype == NON_PM) return; /* sanity checks */ if (cnt > 1 && (mons[dtype].geno & G_UNIQ)) cnt = 1; /* * If this daemon is unique and being re-summoned (the only way we * could get this far with an extinct dtype), try another. */ if (mvitals[dtype].mvflags & G_GONE) { dtype = ndemon(atyp); if (dtype == NON_PM) return; } while (cnt > 0) { mtmp = makemon(&mons[dtype], u.ux, u.uy, NO_MM_FLAGS); if (mtmp && (dtype == PM_ANGEL)) { /* alignment should match the summoner */ EPRI(mtmp)->shralign = atyp; } cnt--; } } void summon_minion(alignment, talk) aligntyp alignment; boolean talk; { register struct monst *mon; int mnum; switch ((int)alignment) { case A_LAWFUL: mnum = lminion(); break; case A_NEUTRAL: mnum = PM_AIR_ELEMENTAL + rn2(4); break; case A_CHAOTIC: case A_NONE: mnum = ndemon(alignment); break; default: impossible("unaligned player?"); mnum = ndemon(A_NONE); break; } if (mnum == NON_PM) { mon = 0; } else if (mons[mnum].pxlth == 0) { struct permonst *pm = &mons[mnum]; mon = makemon(pm, u.ux, u.uy, MM_EMIN); if (mon) { mon->isminion = TRUE; EMIN(mon)->min_align = alignment; } } else if (mnum == PM_ANGEL) { mon = makemon(&mons[mnum], u.ux, u.uy, NO_MM_FLAGS); if (mon) { mon->isminion = TRUE; EPRI(mon)->shralign = alignment; /* always A_LAWFUL here */ } } else mon = makemon(&mons[mnum], u.ux, u.uy, NO_MM_FLAGS); if (mon) { if (talk) { pline_The("voice of %s booms:", align_gname(alignment)); verbalize("Thou shalt pay for thy indiscretion!"); if (!Blind) pline("%s appears before you.", Amonnam(mon)); } mon->mpeaceful = FALSE; /* don't call set_malign(); player was naughty */ } } #define Athome (Inhell && !mtmp->cham) int demon_talk(mtmp) /* returns 1 if it won't attack. */ register struct monst *mtmp; { long cash, demand, offer; if (uwep && uwep->oartifact == ART_EXCALIBUR) { pline("%s looks very angry.", Amonnam(mtmp)); mtmp->mpeaceful = mtmp->mtame = 0; set_malign(mtmp); newsym(mtmp->mx, mtmp->my); return 0; } /* Slight advantage given. */ if (is_dprince(mtmp->data) && mtmp->minvis) { mtmp->minvis = mtmp->perminvis = 0; if (!Blind) pline("%s appears before you.", Amonnam(mtmp)); newsym(mtmp->mx,mtmp->my); } if (youmonst.data->mlet == S_DEMON) { /* Won't blackmail their own. */ pline("%s says, \"Good hunting, %s.\"", Amonnam(mtmp), flags.female ? "Sister" : "Brother"); if (!tele_restrict(mtmp)) (void) rloc(mtmp, FALSE); return(1); } #ifndef GOLDOBJ cash = u.ugold; #else cash = money_cnt(invent); #endif demand = (cash * (rnd(80) + 20 * Athome)) / (100 * (1 + (sgn(u.ualign.type) == sgn(mtmp->data->maligntyp)))); if (!demand) { /* you have no gold */ mtmp->mpeaceful = 0; set_malign(mtmp); return 0; } else { /* make sure that the demand is unmeetable if the monster has the Amulet, preventing monster from being satisified and removed from the game (along with said Amulet...) */ if (mon_has_amulet(mtmp)) demand = cash + (long)rn1(1000,40); 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.", Amonnam(mtmp)); } else if (offer > 0L && (long)rnd(40) > (demand - offer)) { pline("%s scowls at you menacingly, then vanishes.", Amonnam(mtmp)); } else { pline("%s gets angry...", Amonnam(mtmp)); mtmp->mpeaceful = 0; set_malign(mtmp); return 0; } } mongone(mtmp); return(1); } int lawful_minion(int difficulty) /* this routine returns the # of an appropriate minion, given a difficulty rating from 1 to 30 */ { difficulty = difficulty + rn2(5) - 2; if (difficulty < 0) difficulty = 0; if (difficulty > 30) difficulty = 30; difficulty /= 3; switch (difficulty) { case 0: return PM_TENGU; case 1: return PM_COUATL; case 2: return PM_WHITE_UNICORN; case 3: return PM_MOVANIC_DEVA; case 4: return PM_MONADIC_DEVA; case 5: return PM_KI_RIN; case 6: return PM_ASTRAL_DEVA; case 7: return PM_ARCHON; case 8: return PM_PLANETAR; case 9: return PM_SOLAR; case 10: return PM_SOLAR; default: return PM_TENGU; } } int neutral_minion(int difficulty) /* this routine returns the # of an appropriate minion, given a difficulty rating from 1 to 30 */ { difficulty = difficulty + rn2(9) - 4; if (difficulty < 0) difficulty = 0; if (difficulty > 30) difficulty = 30; if (difficulty < 6) return PM_GRAY_UNICORN; if (difficulty < 15) return (PM_AIR_ELEMENTAL+rn2(4)); return (PM_DJINNI /* +rn2(4) */); } int chaotic_minion(int difficulty) /* this routine returns the # of an appropriate minion, given a difficulty rating from 1 to 30 */ { difficulty = difficulty + rn2(5) - 2; if (difficulty < 0) difficulty = 0; if (difficulty > 30) difficulty = 30; /* KMH, balance patch -- avoid using floating-point (not supported by all ports) */ /* difficulty = (int)((float)difficulty / 1.5);*/ difficulty = (difficulty * 2) / 3; switch (difficulty) { case 0: return PM_GREMLIN; case 1: case 2: return (PM_DRETCH+rn2(5)); case 3: return PM_BLACK_UNICORN; case 4: return PM_BLOOD_IMP; case 5: return PM_SPINED_DEVIL; case 6: return PM_SHADOW_WOLF; case 7: return PM_HELL_HOUND; case 8: return PM_HORNED_DEVIL; case 9: return PM_BEARDED_DEVIL; case 10: return PM_BAR_LGURA; case 11: return PM_CHASME; case 12: return PM_BARBED_DEVIL; case 13: return PM_VROCK; case 14: return PM_BABAU; case 15: return PM_NALFESHNEE; case 16: return PM_MARILITH; case 17: return PM_NABASSU; case 18: return PM_BONE_DEVIL; case 19: return PM_ICE_DEVIL; case 20: return PM_PIT_FIEND; } return PM_GREMLIN; } long bribe(mtmp) struct monst *mtmp; { 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 money.", 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); } int dprince(atyp) aligntyp atyp; { int tryct, pm; for (tryct = 0; tryct < 20; tryct++) { pm = rn1(PM_DEMOGORGON + 1 - PM_ORCUS, PM_ORCUS); if (!(mvitals[pm].mvflags & G_GONE) && (atyp == A_NONE || sgn(mons[pm].maligntyp) == sgn(atyp))) return(pm); } return(dlord(atyp)); /* approximate */ } int dlord(atyp) aligntyp atyp; { int tryct, pm; for (tryct = 0; tryct < 20; tryct++) { pm = rn1(PM_YEENOGHU + 1 - PM_JUIBLEX, PM_JUIBLEX); if (!(mvitals[pm].mvflags & G_GONE) && (atyp == A_NONE || sgn(mons[pm].maligntyp) == sgn(atyp))) return(pm); } return(ndemon(atyp)); /* approximate */ } /* create lawful (good) lord */ int llord() { if (!(mvitals[PM_ARCHON].mvflags & G_GONE)) return(PM_ARCHON); return(lminion()); /* approximate */ } int lminion() { int tryct; struct permonst *ptr; for (tryct = 0; tryct < 20; tryct++) { ptr = mkclass(S_ANGEL,0); if (ptr && !is_lord(ptr)) return(monsndx(ptr)); } return NON_PM; } int ndemon(atyp) aligntyp atyp; { int tryct; struct permonst *ptr; for (tryct = 0; tryct < 20; tryct++) { ptr = mkclass(S_DEMON, 0); if (ptr && is_ndemon(ptr) && (atyp == A_NONE || sgn(ptr->maligntyp) == sgn(atyp))) return(monsndx(ptr)); } return NON_PM; } /*minion.c*/ slashem-0.0.7E7F3/src/mkmap.c0000664000076400007640000003043610545462317013722 0ustar aliali/* 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. */ #include "hack.h" #include "sp_lev.h" #define HEIGHT (ROWNO - 1) #define WIDTH (COLNO - 2) STATIC_DCL void FDECL(init_map,(SCHAR_P)); STATIC_DCL void FDECL(init_fill,(SCHAR_P,SCHAR_P)); STATIC_DCL schar FDECL(get_map,(int,int,SCHAR_P)); STATIC_DCL void FDECL(pass_one,(SCHAR_P,SCHAR_P)); STATIC_DCL void FDECL(pass_two,(SCHAR_P,SCHAR_P)); STATIC_DCL void FDECL(pass_three,(SCHAR_P,SCHAR_P)); STATIC_DCL void NDECL(wallify_map); STATIC_DCL void FDECL(join_map,(SCHAR_P,SCHAR_P)); STATIC_DCL void FDECL(finish_map,(SCHAR_P,SCHAR_P,XCHAR_P,XCHAR_P)); STATIC_DCL void FDECL(remove_room,(unsigned)); void FDECL(mkmap, (lev_init *)); char *new_locations; int min_rx, max_rx, min_ry, max_ry; /* rectangle bounds for regions */ static int n_loc_filled; STATIC_OVL void init_map(bg_typ) schar bg_typ; { register int i,j; for(i=1; i WIDTH || row >= HEIGHT) return bg_typ; return levl[col][row].typ; } static int dirs[16] = { -1, -1 /**/, -1, 0 /**/, -1, 1 /**/, 0, -1 /**/, 0, 1 /**/, 1, -1 /**/, 1, 0 /**/, 1, 1}; STATIC_OVL void pass_one(bg_typ, fg_typ) schar bg_typ, fg_typ; { register int i,j; short count, dr; for(i=2; i<=WIDTH; i++) for(j=1; j 0 && (anyroom ? IS_ROOM(levl[sx][sy].typ) : levl[sx][sy].typ == fg_typ) && (int) levl[sx][sy].roomno != rmno) sx--; sx++; /* compensate for extra decrement */ /* assume sx,sy is valid */ if(sx < min_rx) min_rx = sx; if(sy < min_ry) min_ry = sy; for(i=sx; i<=WIDTH && levl[i][sy].typ == fg_typ; i++) { levl[i][sy].roomno = rmno; levl[i][sy].lit = lit; if(anyroom) { /* add walls to room as well */ register int ii,jj; for(ii= (i == sx ? i-1 : i); ii <= i+1; ii++) for(jj = sy-1; jj <= sy+1; jj++) if(isok(ii,jj) && (IS_WALL(levl[ii][jj].typ) || IS_DOOR(levl[ii][jj].typ))) { levl[ii][jj].edge = 1; if(lit) levl[ii][jj].lit = lit; if ((int) levl[ii][jj].roomno != rmno) levl[ii][jj].roomno = SHARED; } } n_loc_filled++; } nx = i; if(isok(sx,sy-1)) { for(i=sx; isx || isok(i-1,sy-1)) && levl[i-1][sy-1].typ == fg_typ) { if ((int) levl[i-1][sy-1].roomno != rmno) flood_fill_rm(i-1,sy-1,rmno,lit,anyroom); } if((isx || isok(i-1,sy+1)) && levl[i-1][sy+1].typ == fg_typ) { if ((int) levl[i-1][sy+1].roomno != rmno) flood_fill_rm(i-1,sy+1,rmno,lit,anyroom); } if((i max_rx) max_rx = nx - 1; /* nx is just past valid region */ if(sy > max_ry) max_ry = sy; } /* * If we have drawn a map without walls, this allows us to * auto-magically wallify it. Taken from lev_main.c. */ STATIC_OVL void wallify_map() { int x, y, xx, yy; for(x = 1; x < COLNO; x++) for(y = 0; y < ROWNO; y++) if(levl[x][y].typ == STONE) { for(yy = y - 1; yy <= y+1; yy++) for(xx = x - 1; xx <= x+1; xx++) if(isok(xx,yy) && levl[xx][yy].typ == ROOM) { if(yy != y) levl[x][y].typ = HWALL; else levl[x][y].typ = VWALL; } } } STATIC_OVL void join_map(bg_typ, fg_typ) schar bg_typ, fg_typ; { register struct mkroom *croom, *croom2; register int i, j; int sx, sy; coord sm, em; /* first, use flood filling to find all of the regions that need joining */ for(i=2; i<=WIDTH; i++) for(j=1; j 3) { add_room(min_rx, min_ry, max_rx, max_ry, FALSE, OROOM, TRUE); rooms[nroom-1].irregular = TRUE; if(nroom >= (MAXNROFROOMS*2)) goto joinm; } else { /* * it's a tiny hole; erase it from the map to avoid * having the player end up here with no way out. */ for(sx = min_rx; sx<=max_rx; sx++) for(sy = min_ry; sy<=max_ry; sy++) if ((int) levl[sx][sy].roomno == nroom + ROOMOFFSET) { levl[sx][sy].typ = bg_typ; levl[sx][sy].roomno = NO_ROOM; } } } } joinm: /* * Ok, now we can actually join the regions with fg_typ's. * The rooms are already sorted due to the previous loop, * so don't call sort_rooms(), which can screw up the roomno's * validity in the levl structure. */ for(croom = &rooms[0], croom2 = croom + 1; croom2 < &rooms[nroom]; ) { /* pick random starting and end locations for "corridor" */ if(!somexy(croom, &sm) || !somexy(croom2, &em)) { /* ack! -- the level is going to be busted */ /* arbitrarily pick centers of both rooms and hope for the best */ impossible("No start/end room loc in join_map."); sm.x = croom->lx + ((croom->hx - croom->lx) / 2); sm.y = croom->ly + ((croom->hy - croom->ly) / 2); em.x = croom2->lx + ((croom2->hx - croom2->lx) / 2); em.y = croom2->ly + ((croom2->hy - croom2->ly) / 2); } (void) dig_corridor(&sm, &em, FALSE, fg_typ, bg_typ); /* choose next region to join */ /* only increment croom if croom and croom2 are non-overlapping */ if(croom2->lx > croom->hx || ((croom2->ly > croom->hy || croom2->hy < croom->ly) && rn2(3))) { croom = croom2; } croom2++; /* always increment the next room */ } } STATIC_OVL void finish_map(fg_typ, bg_typ, lit, walled) schar fg_typ, bg_typ; boolean lit, walled; { int i, j; if(walled) wallify_map(); if(lit) { for(i=1; i= 0; --i) { croom = &rooms[i]; if (croom->hx < lx || croom->lx >= hx || croom->hy < ly || croom->ly >= hy) continue; /* no overlap */ if (croom->lx < lx || croom->hx >= hx || croom->ly < ly || croom->hy >= hy) { /* partial overlap */ /* TODO: ensure remaining parts of room are still joined */ if (!croom->irregular) impossible("regular room in joined map"); } else { /* total overlap, remove the room */ remove_room((unsigned)i); } } } /* * Remove roomno from the rooms array, decrementing nroom. Also updates * all level roomno values of affected higher numbered rooms. Assumes * level structure contents corresponding to roomno have already been reset. * Currently handles only the removal of rooms that have no subrooms. */ STATIC_OVL void remove_room(roomno) unsigned roomno; { struct mkroom *croom = &rooms[roomno]; struct mkroom *maxroom = &rooms[--nroom]; int i, j; unsigned oroomno; if (croom != maxroom) { /* since the order in the array only matters for making corridors, * copy the last room over the one being removed on the assumption * that corridors have already been dug. */ (void) memcpy((genericptr_t)croom, (genericptr_t)maxroom, sizeof(struct mkroom)); /* since maxroom moved, update affected level roomno values */ oroomno = nroom + ROOMOFFSET; roomno += ROOMOFFSET; for (i = croom->lx; i <= croom->hx; ++i) for (j = croom->ly; j <= croom->hy; ++j) { if (levl[i][j].roomno == oroomno) levl[i][j].roomno = roomno; } } maxroom->hx = -1; /* just like add_room */ } #define N_P1_ITER 1 /* tune map generation via this value */ #define N_P2_ITER 1 /* tune map generation via this value */ #define N_P3_ITER 2 /* tune map smoothing via this value */ void mkmap(init_lev) lev_init *init_lev; { schar bg_typ = init_lev->bg, fg_typ = init_lev->fg; boolean smooth = init_lev->smoothed, join = init_lev->joined; xchar lit = init_lev->lit, walled = init_lev->walled; int i; if(lit < 0) lit = (rnd(1+abs(depth(&u.uz))) < 11 && rn2(77)) ? 1 : 0; new_locations = (char *)alloc((WIDTH+1) * HEIGHT); init_map(bg_typ); init_fill(bg_typ, fg_typ); for(i = 0; i < N_P1_ITER; i++) pass_one(bg_typ, fg_typ); for(i = 0; i < N_P2_ITER; i++) pass_two(bg_typ, fg_typ); if(smooth) for(i = 0; i < N_P3_ITER; i++) pass_three(bg_typ, fg_typ); if(join) join_map(bg_typ, fg_typ); finish_map(fg_typ, bg_typ, (boolean)lit, (boolean)walled); /* a walled, joined level is cavernous, not mazelike -dlc */ if (walled && join) { level.flags.is_maze_lev = FALSE; level.flags.is_cavernous_lev = TRUE; } free(new_locations); } /*mkmap.c*/ slashem-0.0.7E7F3/src/region.c0000664000076400007640000006506010545462317014101 0ustar aliali/* SCCS Id: @(#)region.c 3.4 2002/10/15 */ /* 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 * I'll start here for ease. It *WILL* move into the level * structure eventually. */ static NhRegion **regions; static int n_regions = 0; static int max_regions = 0; #define NO_CALLBACK (-1) boolean FDECL(inside_gas_cloud, (genericptr,genericptr)); boolean FDECL(expire_gas_cloud, (genericptr,genericptr)); boolean FDECL(revive_cthulhu, (genericptr, genericptr)); boolean FDECL(inside_rect, (NhRect *,int,int)); boolean FDECL(inside_region, (NhRegion *,int,int)); NhRegion *FDECL(create_region, (NhRect *,int)); void FDECL(add_rect_to_reg, (NhRegion *,NhRect *)); void FDECL(add_mon_to_reg, (NhRegion *,struct monst *)); void FDECL(remove_mon_from_reg, (NhRegion *,struct monst *)); boolean FDECL(mon_in_region, (NhRegion *,struct monst *)); #if 0 NhRegion *FDECL(clone_region, (NhRegion *)); #endif void FDECL(free_region, (NhRegion *)); void FDECL(add_region, (NhRegion *)); void FDECL(remove_region, (NhRegion *)); #if 0 void FDECL(replace_mon_regions, (struct monst *,struct monst *)); void FDECL(remove_mon_from_regions, (struct monst *)); NhRegion *FDECL(create_msg_region, (XCHAR_P,XCHAR_P,XCHAR_P,XCHAR_P, const char *,const char *)); boolean FDECL(enter_force_field, (genericptr,genericptr)); NhRegion *FDECL(create_force_field, (XCHAR_P,XCHAR_P,int,int)); #endif static void FDECL(reset_region_mids, (NhRegion *)); static callback_proc callbacks[] = { #define INSIDE_GAS_CLOUD 0 inside_gas_cloud, #define EXPIRE_GAS_CLOUD 1 expire_gas_cloud, #define REVIVE_CTHULHU 2 /* Cthulhu comes back... */ revive_cthulhu }; /* Should be inlined. */ boolean inside_rect(r, x, y) NhRect *r; int x, y; { return (x >= r->lx && x <= r->hx && y >= r->ly && y <= r->hy); } /* * Check if a point is inside a region. */ boolean inside_region(reg, x, y) NhRegion *reg; int x, y; { int i; if (reg == NULL || !inside_rect(&(reg->bounding_box), x, y)) return FALSE; for (i = 0; i < reg->nrects; i++) if (inside_rect(&(reg->rects[i]), x, y)) return TRUE; return FALSE; } /* * Create a region. It does not activate it. */ NhRegion * create_region(rects, nrect) NhRect *rects; int nrect; { int i; NhRegion *reg; reg = (NhRegion *) alloc(sizeof (NhRegion)); /* Determines bounding box */ if (nrect > 0) { reg->bounding_box = rects[0]; } else { reg->bounding_box.lx = 99; reg->bounding_box.ly = 99; reg->bounding_box.hx = 0; reg->bounding_box.hy = 0; } reg->nrects = nrect; reg->rects = nrect > 0 ? (NhRect *)alloc((sizeof (NhRect)) * nrect) : NULL; for (i = 0; i < nrect; i++) { if (rects[i].lx < reg->bounding_box.lx) reg->bounding_box.lx = rects[i].lx; if (rects[i].ly < reg->bounding_box.ly) reg->bounding_box.ly = rects[i].ly; if (rects[i].hx > reg->bounding_box.hx) reg->bounding_box.hx = rects[i].hx; if (rects[i].hy > reg->bounding_box.hy) reg->bounding_box.hy = rects[i].hy; reg->rects[i] = rects[i]; } reg->ttl = -1; /* Defaults */ reg->attach_2_u = FALSE; reg->attach_2_m = 0; /* reg->attach_2_o = NULL; */ reg->enter_msg = NULL; reg->leave_msg = NULL; reg->expire_f = NO_CALLBACK; reg->enter_f = NO_CALLBACK; reg->can_enter_f = NO_CALLBACK; reg->leave_f = NO_CALLBACK; reg->can_leave_f = NO_CALLBACK; reg->inside_f = NO_CALLBACK; clear_hero_inside(reg); clear_heros_fault(reg); reg->n_monst = 0; reg->max_monst = 0; reg->monsters = NULL; reg->arg = NULL; return reg; } /* * Add rectangle to region. */ void add_rect_to_reg(reg, rect) NhRegion *reg; NhRect *rect; { NhRect *tmp_rect; tmp_rect = (NhRect *) alloc(sizeof (NhRect) * (reg->nrects + 1)); if (reg->nrects > 0) { (void) memcpy((genericptr_t) tmp_rect, (genericptr_t) reg->rects, (sizeof (NhRect) * reg->nrects)); free((genericptr_t) reg->rects); } tmp_rect[reg->nrects] = *rect; reg->nrects++; reg->rects = tmp_rect; /* Update bounding box if needed */ if (reg->bounding_box.lx > rect->lx) reg->bounding_box.lx = rect->lx; if (reg->bounding_box.ly > rect->ly) reg->bounding_box.ly = rect->ly; if (reg->bounding_box.hx < rect->hx) reg->bounding_box.hx = rect->hx; if (reg->bounding_box.hy < rect->hy) reg->bounding_box.hy = rect->hy; } /* * Add a monster to the region */ void add_mon_to_reg(reg, mon) NhRegion *reg; struct monst *mon; { int i; unsigned *tmp_m; if (reg->max_monst <= reg->n_monst) { tmp_m = (unsigned *) alloc(sizeof (unsigned) * (reg->max_monst + MONST_INC)); if (reg->max_monst > 0) { for (i = 0; i < reg->max_monst; i++) tmp_m[i] = reg->monsters[i]; free((genericptr_t) reg->monsters); } reg->monsters = tmp_m; reg->max_monst += MONST_INC; } reg->monsters[reg->n_monst++] = mon->m_id; } /* * Remove a monster from the region list (it left or died...) */ void remove_mon_from_reg(reg, mon) NhRegion *reg; struct monst *mon; { register int i; for (i = 0; i < reg->n_monst; i++) if (reg->monsters[i] == mon->m_id) { reg->n_monst--; reg->monsters[i] = reg->monsters[reg->n_monst]; return; } } /* * Check if a monster is inside the region. * It's probably quicker to check with the region internal list * than to check for coordinates. */ boolean mon_in_region(reg, mon) NhRegion *reg; struct monst *mon; { int i; for (i = 0; i < reg->n_monst; i++) if (reg->monsters[i] == mon->m_id) return TRUE; return FALSE; } #if 0 /* not yet used */ /* * Clone (make a standalone copy) the region. */ NhRegion * clone_region(reg) NhRegion *reg; { NhRegion *ret_reg; ret_reg = create_region(reg->rects, reg->nrects); ret_reg->ttl = reg->ttl; ret_reg->attach_2_u = reg->attach_2_u; ret_reg->attach_2_m = reg->attach_2_m; /* ret_reg->attach_2_o = reg->attach_2_o; */ ret_reg->expire_f = reg->expire_f; ret_reg->enter_f = reg->enter_f; ret_reg->can_enter_f = reg->can_enter_f; ret_reg->leave_f = reg->leave_f; ret_reg->can_leave_f = reg->can_leave_f; ret_reg->player_flags = reg->player_flags; /* set/clear_hero_inside,&c*/ ret_reg->n_monst = reg->n_monst; if (reg->n_monst > 0) { ret_reg->monsters = (unsigned *) alloc((sizeof (unsigned)) * reg->n_monst); (void) memcpy((genericptr_t) ret_reg->monsters, (genericptr_t) reg->monsters, sizeof (unsigned) * reg->n_monst); } else ret_reg->monsters = NULL; return ret_reg; } #endif /*0*/ /* * Free mem from region. */ void free_region(reg) NhRegion *reg; { if (reg) { if (reg->rects) free((genericptr_t) reg->rects); if (reg->monsters) free((genericptr_t) reg->monsters); free((genericptr_t) reg); } } /* * Add a region to the list. * This actually activates the region. */ void add_region(reg) NhRegion *reg; { NhRegion **tmp_reg; int i, j; if (max_regions <= n_regions) { tmp_reg = regions; regions = (NhRegion **)alloc(sizeof (NhRegion *) * (max_regions + 10)); if (max_regions > 0) { (void) memcpy((genericptr_t) regions, (genericptr_t) tmp_reg, max_regions * sizeof (NhRegion *)); free((genericptr_t) tmp_reg); } max_regions += 10; } regions[n_regions] = reg; n_regions++; /* Check for monsters inside the region */ for (i = reg->bounding_box.lx; i <= reg->bounding_box.hx; i++) for (j = reg->bounding_box.ly; j <= reg->bounding_box.hy; j++) { /* Some regions can cross the level boundaries */ if (!isok(i,j)) continue; if (MON_AT(i, j) && inside_region(reg, i, j)) add_mon_to_reg(reg, level.monsters[i][j]); if (reg->visible && cansee(i, j)) newsym(i, j); } /* Check for player now... */ if (inside_region(reg, u.ux, u.uy)) set_hero_inside(reg); else clear_hero_inside(reg); } /* * Remove a region from the list & free it. */ void remove_region(reg) NhRegion *reg; { register int i, x, y; for (i = 0; i < n_regions; i++) if (regions[i] == reg) break; if (i == n_regions) return; /* Update screen if necessary */ if (reg->visible) for (x = reg->bounding_box.lx; x <= reg->bounding_box.hx; x++) for (y = reg->bounding_box.ly; y <= reg->bounding_box.hy; y++) if (isok(x,y) && inside_region(reg, x, y) && cansee(x, y)) newsym(x, y); free_region(reg); regions[i] = regions[n_regions - 1]; regions[n_regions - 1] = (NhRegion *) 0; n_regions--; } /* * Remove all regions and clear all related data (This must be down * when changing level, for instance). */ void clear_regions() { register int i; for (i = 0; i < n_regions; i++) free_region(regions[i]); n_regions = 0; if (max_regions > 0) free((genericptr_t) regions); max_regions = 0; regions = NULL; } /* * This function is called every turn. * It makes the regions age, if necessary and calls the appropriate * callbacks when needed. */ void run_regions() { register int i, j, k; int f_indx; /* End of life ? */ /* Do it backward because the array will be modified */ for (i = n_regions - 1; i >= 0; i--) { if (regions[i]->ttl == 0) { if ((f_indx = regions[i]->expire_f) == NO_CALLBACK || (*callbacks[f_indx])(regions[i], (genericptr_t) 0)) remove_region(regions[i]); } } /* Process remaining regions */ for (i = 0; i < n_regions; i++) { /* Make the region age */ if (regions[i]->ttl > 0) regions[i]->ttl--; /* Check if player is inside region */ f_indx = regions[i]->inside_f; if (f_indx != NO_CALLBACK && hero_inside(regions[i])) (void) (*callbacks[f_indx])(regions[i], (genericptr_t) 0); /* 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)) { /* The monster died, remove it from list */ k = (regions[i]->n_monst -= 1); regions[i]->monsters[j] = regions[i]->monsters[k]; regions[i]->monsters[k] = 0; --j; /* current slot has been reused; recheck it next */ } } } } } /* * check whether player enters/leaves one or more regions. */ boolean in_out_region(x, y) xchar x, y; { int i, f_indx; /* First check if we can do the move */ for (i = 0; i < n_regions; i++) { if (inside_region(regions[i], x, y) && !hero_inside(regions[i]) && !regions[i]->attach_2_u) { if ((f_indx = regions[i]->can_enter_f) != NO_CALLBACK) if (!(*callbacks[f_indx])(regions[i], (genericptr_t) 0)) return FALSE; } else if (hero_inside(regions[i]) && !inside_region(regions[i], x, y) && !regions[i]->attach_2_u) { if ((f_indx = regions[i]->can_leave_f) != NO_CALLBACK) if (!(*callbacks[f_indx])(regions[i], (genericptr_t) 0)) return FALSE; } } /* Callbacks for the regions we do leave */ for (i = 0; i < n_regions; i++) if (hero_inside(regions[i]) && !regions[i]->attach_2_u && !inside_region(regions[i], x, y)) { clear_hero_inside(regions[i]); if (regions[i]->leave_msg != NULL) pline(regions[i]->leave_msg); if ((f_indx = regions[i]->leave_f) != NO_CALLBACK) (void) (*callbacks[f_indx])(regions[i], (genericptr_t) 0); } /* Callbacks for the regions we do enter */ for (i = 0; i < n_regions; i++) if (!hero_inside(regions[i]) && !regions[i]->attach_2_u && inside_region(regions[i], x, y)) { set_hero_inside(regions[i]); if (regions[i]->enter_msg != NULL) pline(regions[i]->enter_msg); if ((f_indx = regions[i]->enter_f) != NO_CALLBACK) (void) (*callbacks[f_indx])(regions[i], (genericptr_t) 0); } return TRUE; } /* * check wether a monster enters/leaves one or more region. */ boolean m_in_out_region(mon, x, y) struct monst *mon; xchar x, y; { int i, f_indx; /* First check if we can do the move */ for (i = 0; i < n_regions; i++) { if (inside_region(regions[i], x, y) && !mon_in_region(regions[i], mon) && regions[i]->attach_2_m != mon->m_id) { if ((f_indx = regions[i]->can_enter_f) != NO_CALLBACK) if (!(*callbacks[f_indx])(regions[i], mon)) return FALSE; } else if (mon_in_region(regions[i], mon) && !inside_region(regions[i], x, y) && regions[i]->attach_2_m != mon->m_id) { if ((f_indx = regions[i]->can_leave_f) != NO_CALLBACK) if (!(*callbacks[f_indx])(regions[i], mon)) return FALSE; } } /* Callbacks for the regions we do leave */ for (i = 0; i < n_regions; i++) if (mon_in_region(regions[i], mon) && regions[i]->attach_2_m != mon->m_id && !inside_region(regions[i], x, y)) { remove_mon_from_reg(regions[i], mon); if ((f_indx = regions[i]->leave_f) != NO_CALLBACK) (void) (*callbacks[f_indx])(regions[i], mon); } /* Callbacks for the regions we do enter */ for (i = 0; i < n_regions; i++) if (!hero_inside(regions[i]) && !regions[i]->attach_2_u && inside_region(regions[i], x, y)) { add_mon_to_reg(regions[i], mon); if ((f_indx = regions[i]->enter_f) != NO_CALLBACK) (void) (*callbacks[f_indx])(regions[i], mon); } return TRUE; } /* * Checks player's regions after a teleport for instance. */ void update_player_regions() { register int i; for (i = 0; i < n_regions; i++) if (!regions[i]->attach_2_u && inside_region(regions[i], u.ux, u.uy)) set_hero_inside(regions[i]); else clear_hero_inside(regions[i]); } /* * Ditto for a specified monster. */ void update_monster_region(mon) struct monst *mon; { register int i; for (i = 0; i < n_regions; i++) { if (inside_region(regions[i], mon->mx, mon->my)) { if (!mon_in_region(regions[i], mon)) add_mon_to_reg(regions[i], mon); } else { if (mon_in_region(regions[i], mon)) remove_mon_from_reg(regions[i], mon); } } } #if 0 /* not yet used */ /* * Change monster pointer in regions * This happens, for instance, when a monster grows and * need a new structure (internally that is). */ void replace_mon_regions(monold, monnew) struct monst *monold, *monnew; { register int i; for (i = 0; i < n_regions; i++) if (mon_in_region(regions[i], monold)) { remove_mon_from_reg(regions[i], monold); add_mon_to_reg(regions[i], monnew); } } /* * Remove monster from all regions it was in (ie monster just died) */ void remove_mon_from_regions(mon) struct monst *mon; { register int i; for (i = 0; i < n_regions; i++) if (mon_in_region(regions[i], mon)) remove_mon_from_reg(regions[i], mon); } #endif /*0*/ /* * Check if a spot is under a visible region (eg: gas cloud). * Returns NULL if not, otherwise returns region. */ NhRegion * visible_region_at(x, y) xchar x, y; { register int i; for (i = 0; i < n_regions; i++) if (inside_region(regions[i], x, y) && regions[i]->visible && regions[i]->ttl != 0) return regions[i]; return (NhRegion *) 0; } void show_region(reg, x, y) NhRegion *reg; xchar x, y; { show_glyph(x, y, reg->glyph); } /** * save_regions : */ void save_regions(fd, mode) int fd; int mode; { 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++) { bwrite(fd, (genericptr_t) ®ions[i]->bounding_box, sizeof (NhRect)); bwrite(fd, (genericptr_t) ®ions[i]->nrects, sizeof (short)); for (j = 0; j < regions[i]->nrects; j++) bwrite(fd, (genericptr_t) ®ions[i]->rects[j], sizeof (NhRect)); bwrite(fd, (genericptr_t) ®ions[i]->attach_2_u, sizeof (boolean)); n = 0; bwrite(fd, (genericptr_t) ®ions[i]->attach_2_m, sizeof (unsigned)); n = regions[i]->enter_msg != NULL ? strlen(regions[i]->enter_msg) : 0; bwrite(fd, (genericptr_t) &n, sizeof n); if (n > 0) bwrite(fd, (genericptr_t) regions[i]->enter_msg, n); n = regions[i]->leave_msg != NULL ? strlen(regions[i]->leave_msg) : 0; bwrite(fd, (genericptr_t) &n, sizeof n); if (n > 0) bwrite(fd, (genericptr_t) regions[i]->leave_msg, n); bwrite(fd, (genericptr_t) ®ions[i]->ttl, sizeof (short)); bwrite(fd, (genericptr_t) ®ions[i]->expire_f, sizeof (short)); bwrite(fd, (genericptr_t) ®ions[i]->can_enter_f, sizeof (short)); bwrite(fd, (genericptr_t) ®ions[i]->enter_f, sizeof (short)); bwrite(fd, (genericptr_t) ®ions[i]->can_leave_f, sizeof (short)); bwrite(fd, (genericptr_t) ®ions[i]->leave_f, sizeof (short)); bwrite(fd, (genericptr_t) ®ions[i]->inside_f, sizeof (short)); bwrite(fd, (genericptr_t) ®ions[i]->player_flags, sizeof (boolean)); bwrite(fd, (genericptr_t) ®ions[i]->n_monst, sizeof (short)); for (j = 0; j < regions[i]->n_monst; j++) bwrite(fd, (genericptr_t) ®ions[i]->monsters[j], sizeof (unsigned)); bwrite(fd, (genericptr_t) ®ions[i]->visible, sizeof (boolean)); 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 rest_regions(fd, ghostly) int fd; boolean ghostly; /* If a bones file restore */ { int i, j; unsigned n; long tmstamp; char *msg_buf; clear_regions(); /* Just for security */ mread(fd, (genericptr_t) &tmstamp, sizeof (tmstamp)); if (ghostly) tmstamp = 0; else tmstamp = (moves - tmstamp); mread(fd, (genericptr_t) &n_regions, sizeof (n_regions)); max_regions = n_regions; if (n_regions > 0) regions = (NhRegion **) alloc(sizeof (NhRegion *) * n_regions); for (i = 0; i < n_regions; i++) { regions[i] = (NhRegion *) alloc(sizeof (NhRegion)); mread(fd, (genericptr_t) ®ions[i]->bounding_box, sizeof (NhRect)); mread(fd, (genericptr_t) ®ions[i]->nrects, sizeof (short)); if (regions[i]->nrects > 0) regions[i]->rects = (NhRect *) alloc(sizeof (NhRect) * regions[i]->nrects); for (j = 0; j < regions[i]->nrects; j++) mread(fd, (genericptr_t) ®ions[i]->rects[j], sizeof (NhRect)); mread(fd, (genericptr_t) ®ions[i]->attach_2_u, sizeof (boolean)); mread(fd, (genericptr_t) ®ions[i]->attach_2_m, sizeof (unsigned)); mread(fd, (genericptr_t) &n, sizeof n); if (n > 0) { msg_buf = (char *) alloc(n + 1); mread(fd, (genericptr_t) msg_buf, n); msg_buf[n] = '\0'; regions[i]->enter_msg = (const char *) msg_buf; } else regions[i]->enter_msg = NULL; mread(fd, (genericptr_t) &n, sizeof n); if (n > 0) { msg_buf = (char *) alloc(n + 1); mread(fd, (genericptr_t) msg_buf, n); msg_buf[n] = '\0'; regions[i]->leave_msg = (const char *) msg_buf; } else regions[i]->leave_msg = NULL; mread(fd, (genericptr_t) ®ions[i]->ttl, sizeof (short)); /* check for expired region */ if (regions[i]->ttl >= 0) regions[i]->ttl = (regions[i]->ttl > tmstamp) ? regions[i]->ttl - tmstamp : 0; mread(fd, (genericptr_t) ®ions[i]->expire_f, sizeof (short)); mread(fd, (genericptr_t) ®ions[i]->can_enter_f, sizeof (short)); mread(fd, (genericptr_t) ®ions[i]->enter_f, sizeof (short)); mread(fd, (genericptr_t) ®ions[i]->can_leave_f, sizeof (short)); mread(fd, (genericptr_t) ®ions[i]->leave_f, sizeof (short)); mread(fd, (genericptr_t) ®ions[i]->inside_f, sizeof (short)); mread(fd, (genericptr_t) ®ions[i]->player_flags, sizeof (boolean)); if (ghostly) { /* settings pertained to old player */ clear_hero_inside(regions[i]); clear_heros_fault(regions[i]); } mread(fd, (genericptr_t) ®ions[i]->n_monst, sizeof (short)); if (regions[i]->n_monst > 0) regions[i]->monsters = (unsigned *) alloc(sizeof (unsigned) * regions[i]->n_monst); else regions[i]->monsters = NULL; regions[i]->max_monst = regions[i]->n_monst; for (j = 0; j < regions[i]->n_monst; j++) mread(fd, (genericptr_t) ®ions[i]->monsters[j], sizeof (unsigned)); mread(fd, (genericptr_t) ®ions[i]->visible, sizeof (boolean)); mread(fd, (genericptr_t) ®ions[i]->glyph, sizeof (int)); mread(fd, (genericptr_t) ®ions[i]->arg, sizeof (genericptr_t)); } /* remove expired regions, do not trigger the expire_f callback (yet!); also update monster lists if this data is coming from a bones file */ for (i = n_regions - 1; i >= 0; i--) if (regions[i]->ttl == 0) remove_region(regions[i]); else if (ghostly && regions[i]->n_monst > 0) reset_region_mids(regions[i]); } /* update monster IDs for region being loaded from bones; `ghostly' implied */ static void reset_region_mids(reg) NhRegion *reg; { int i = 0, n = reg->n_monst; unsigned *mid_list = reg->monsters; while (i < n) if (!lookup_id_mapping(mid_list[i], &mid_list[i])) { /* shrink list to remove missing monster; order doesn't matter */ mid_list[i] = mid_list[--n]; } else { /* move on to next monster */ ++i; } reg->n_monst = n; return; } #if 0 /* not yet used */ /*--------------------------------------------------------------* * * * Create Region with just a message * * * *--------------------------------------------------------------*/ NhRegion * create_msg_region(x, y, w, h, msg_enter, msg_leave) xchar x, y; xchar w, h; const char *msg_enter; const char *msg_leave; { NhRect tmprect; NhRegion *reg = create_region((NhRect *) 0, 0); reg->enter_msg = msg_enter; reg->leave_msg = msg_leave; tmprect.lx = x; tmprect.ly = y; tmprect.hx = x + w; tmprect.hy = y + h; add_rect_to_reg(reg, &tmprect); reg->ttl = -1; return reg; } /*--------------------------------------------------------------* * * * Force Field Related Code * * (unused yet) * *--------------------------------------------------------------*/ boolean enter_force_field(p1, p2) genericptr_t p1; genericptr_t p2; { struct monst *mtmp; if (p2 == NULL) { /* That means the player */ if (!Blind) You("bump into %s. Ouch!", Hallucination ? "an invisible tree" : "some kind of invisible wall"); else pline("Ouch!"); } else { mtmp = (struct monst *) p2; if (canseemon(mtmp)) pline("%s bumps into %s!", Monnam(mtmp), something); } return FALSE; } NhRegion * create_force_field(x, y, radius, ttl) xchar x, y; int radius, ttl; { int i; NhRegion *ff; int nrect; NhRect tmprect; ff = create_region((NhRect *) 0, 0); nrect = radius; tmprect.lx = x; tmprect.hx = x; tmprect.ly = y - (radius - 1); tmprect.hy = y + (radius - 1); for (i = 0; i < nrect; i++) { add_rect_to_reg(ff, &tmprect); tmprect.lx--; tmprect.hx++; tmprect.ly++; tmprect.hy--; } ff->ttl = ttl; if (!in_mklev && !flags.mon_moving) set_heros_fault(ff); /* assume player has created it */ /* ff->can_enter_f = enter_force_field; */ /* ff->can_leave_f = enter_force_field; */ add_region(ff); return ff; } #endif /*0*/ /*--------------------------------------------------------------* * * * Gas cloud related code * * * *--------------------------------------------------------------*/ /* * Here is an example of an expire function that may prolong * region life after some mods... */ boolean expire_gas_cloud(p1, p2) genericptr_t p1; genericptr_t p2; { NhRegion *reg; int damage; reg = (NhRegion *) p1; damage = (int) reg->arg; /* If it was a thick cloud, it dissipates a little first */ if (damage >= 5) { damage /= 2; /* It dissipates, let's do less damage */ reg->arg = (genericptr_t) damage; reg->ttl = 2; /* Here's the trick : reset ttl */ return FALSE; /* THEN return FALSE, means "still there" */ } return TRUE; /* OK, it's gone, you can free it! */ } boolean revive_cthulhu(p1, p2) genericptr_t p1; genericptr_t p2; { boolean ret = expire_gas_cloud(p1, p2); if (ret) { /* Bring back Cthulhu! */ int cx, cy; NhRegion *reg = (NhRegion *) p1; struct monst *cthulhu = NULL; coord cc; cx = (reg->bounding_box.lx + reg->bounding_box.hx) / 2; cy = (reg->bounding_box.ly + reg->bounding_box.hy) / 2; if (enexto(&cc, cx, cy, &mons[PM_CTHULHU])) { cx = cc.x; cy = cc.y; } else { cx = cy = 0; /* Place Cthulhu randomly */ } /* Make sure Cthulhu doesn't get the Amulet again! :-) */ cthulhu = makemon(&mons[PM_CTHULHU], cx, cy, MM_NOCOUNTBIRTH | NO_MINVENT); if (cthulhu && canseemon(cthulhu)) pline("%s reforms!", Monnam(cthulhu)); } return ret; } boolean inside_gas_cloud(p1, p2) genericptr_t p1; genericptr_t p2; { NhRegion *reg; struct monst *mtmp; int dam; reg = (NhRegion *) p1; dam = (int) reg->arg; if (p2 == NULL) { /* This means *YOU* Bozo! */ if (nonliving(youmonst.data) || Breathless) return FALSE; if (!Blind) make_blinded(1L, FALSE); if (!Poison_resistance) { pline("%s is burning your %s!", Something, makeplural(body_part(LUNG))); You("cough and spit blood!"); losehp(rnd(dam) + 5, "gas cloud", KILLED_BY_AN); return FALSE; } else { You("cough!"); return FALSE; } } else { /* A monster is inside the cloud */ mtmp = (struct monst *) p2; /* Non living and non breathing monsters are not concerned */ if (!nonliving(mtmp->data) && !breathless(mtmp->data)) { if (cansee(mtmp->mx, mtmp->my)) pline("%s coughs!", Monnam(mtmp)); if (heros_fault(reg)) 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; if (mtmp->mhp <= 0) { if (heros_fault(reg)) killed(mtmp); else monkilled(mtmp, "gas cloud", AD_DRST); if (mtmp->mhp <= 0) { /* not lifesaved */ return TRUE; } } } } return FALSE; /* Monster is still alive */ } NhRegion * create_cthulhu_death_cloud(x, y, radius, damage) xchar x, y; int radius; int damage; { NhRegion *cloud; cloud = create_gas_cloud(x, y, radius, damage); if (cloud) cloud->expire_f = REVIVE_CTHULHU; return cloud; } NhRegion * create_gas_cloud(x, y, radius, damage) xchar x, y; int radius; int damage; { NhRegion *cloud; int i, nrect; NhRect tmprect; cloud = create_region((NhRect *) 0, 0); nrect = radius; tmprect.lx = x; tmprect.hx = x; tmprect.ly = y - (radius - 1); tmprect.hy = y + (radius - 1); for (i = 0; i < nrect; i++) { add_rect_to_reg(cloud, &tmprect); tmprect.lx--; tmprect.hx++; tmprect.ly++; tmprect.hy--; } cloud->ttl = rn1(3,4); if (!in_mklev && !flags.mon_moving) set_heros_fault(cloud); /* assume player has created it */ cloud->inside_f = INSIDE_GAS_CLOUD; cloud->expire_f = EXPIRE_GAS_CLOUD; cloud->arg = (genericptr_t) damage; cloud->visible = TRUE; cloud->glyph = cmap_to_glyph(S_cloud); add_region(cloud); return cloud; } /*region.c*/ slashem-0.0.7E7F3/src/priest.c0000664000076400007640000005401410545462317014121 0ustar aliali/* SCCS Id: @(#)priest.c 3.4 2002/11/06 */ /* Copyright (c) Izchak Miller, Steve Linhart, 1989. */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" #include "mfndpos.h" #include "eshk.h" #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)); STATIC_DCL boolean FDECL(has_shrine,(struct monst *)); /* * Move for priests and shopkeepers. Called from shk_move() and pri_move(). * Valid returns are 1: moved 0: didn't -1: let m_move do it -2: died. */ int move_special(mtmp,in_his_shop,appr,uondoor,avoid,omx,omy,gx,gy) register struct monst *mtmp; boolean in_his_shop; schar appr; boolean uondoor,avoid; register xchar omx,omy,gx,gy; { register xchar nx,ny,nix,niy; register schar i; schar chcnt,cnt; coord poss[9]; long info[9]; long allowflags; struct obj *ib = (struct obj *)0; if(omx == gx && omy == gy) return(0); if(mtmp->mconf) { avoid = FALSE; appr = 0; } nix = omx; niy = omy; if (mtmp->isshk) allowflags = ALLOW_SSM; else allowflags = ALLOW_SSM | ALLOW_SANCT; if (passes_walls(mtmp->data)) allowflags |= (ALLOW_ROCK|ALLOW_WALL); if (throws_rocks(mtmp->data)) allowflags |= ALLOW_ROCK; if (tunnels(mtmp->data)) allowflags |= ALLOW_DIG; if (!nohands(mtmp->data) && !verysmall(mtmp->data)) { allowflags |= OPENDOOR; if (m_carrying(mtmp, SKELETON_KEY)) allowflags |= BUSTDOOR; } if (is_giant(mtmp->data)) allowflags |= BUSTDOOR; cnt = mfndpos(mtmp, poss, info, allowflags); if(mtmp->isshk && avoid && uondoor) { /* perhaps we cannot avoid him */ for(i=0; iispriest && levl[nx][ny].typ == ALTAR) || (mtmp->isshk && (!in_his_shop || ESHK(mtmp)->following))) { if(avoid && (info[i] & NOTONL)) continue; if((!appr && !rn2(++chcnt)) || (appr && GDIST(nx,ny) < GDIST(nix,niy))) { nix = nx; niy = ny; } } } if(mtmp->ispriest && avoid && nix == omx && niy == omy && onlineu(omx,omy)) { /* might as well move closer as long it's going to stay * lined up */ avoid = FALSE; goto pick_move; } if(nix != omx || niy != omy) { remove_monster(omx, omy); place_monster(mtmp, nix, niy); newsym(nix,niy); if (mtmp->isshk && !in_his_shop && inhishop(mtmp)) check_special_room(FALSE); if(ib) { if (cansee(mtmp->mx,mtmp->my)) pline("%s picks up %s.", Monnam(mtmp), distant_name(ib,doname)); obj_extract_self(ib); (void) mpickobj(mtmp, ib); } return(1); } return(0); } #endif /* OVLB */ #ifdef OVL0 char temple_occupied(array) register char *array; { register char *ptr; for (ptr = array; *ptr; ptr++) if (rooms[*ptr - ROOMOFFSET].rtype == TEMPLE) return(*ptr); return('\0'); } #endif /* OVL0 */ #ifdef OVLB STATIC_OVL boolean histemple_at(priest, x, y) register struct monst *priest; register xchar x, y; { return((boolean)((EPRI(priest)->shroom == *in_rooms(x, y, TEMPLE)) && on_level(&(EPRI(priest)->shrlevel), &u.uz))); } /* * pri_move: return 1: moved 0: didn't -1: let m_move do it -2: died */ int pri_move(priest) register struct monst *priest; { register xchar gx,gy,omx,omy; schar temple; boolean avoid = TRUE; omx = priest->mx; omy = priest->my; if(!histemple_at(priest, omx, omy)) return(-1); temple = EPRI(priest)->shroom; gx = EPRI(priest)->shrpos.x; gy = EPRI(priest)->shrpos.y; gx += rn1(3,-1); /* mill around the altar */ gy += rn1(3,-1); if(!priest->mpeaceful || (Conflict && !resist(priest, RING_CLASS, 0, 0))) { if(monnear(priest, u.ux, u.uy)) { if(Displaced) Your("displaced image doesn't fool %s!", mon_nam(priest)); (void) mattacku(priest); return(0); } else if(index(u.urooms, temple)) { /* chase player if inside temple & can see him */ if(priest->mcansee && m_canseeu(priest)) { gx = u.ux; gy = u.uy; } avoid = FALSE; } } else if(Invis) avoid = FALSE; return(move_special(priest,FALSE,TRUE,FALSE,avoid,omx,omy,gx,gy)); } /* exclusively for mktemple() */ void priestini(lvl, sroom, sx, sy, sanctum) d_level *lvl; struct mkroom *sroom; int sx, sy; boolean sanctum; /* is it the seat of the high priest? */ { struct monst *priest; struct obj *otmp = NULL; int cnt; if(MON_AT(sx+1, sy)) (void) rloc(m_at(sx+1, sy), FALSE); /* insurance */ priest = makemon(&mons[sanctum ? PM_HIGH_PRIEST : PM_ALIGNED_PRIEST], sx + 1, sy, NO_MM_FLAGS); if (priest) { EPRI(priest)->shroom = (sroom - rooms) + ROOMOFFSET; EPRI(priest)->shralign = Amask2align(levl[sx][sy].altarmask); EPRI(priest)->shrpos.x = sx; EPRI(priest)->shrpos.y = sy; assign_level(&(EPRI(priest)->shrlevel), lvl); priest->mtrapseen = ~0; /* traps are known */ priest->mpeaceful = 1; priest->ispriest = 1; priest->msleeping = 0; set_malign(priest); /* mpeaceful may have changed */ /* now his/her goodies... */ if(sanctum && EPRI(priest)->shralign == A_NONE && 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)); } /* [ALI] Upgrade existing robe or aquire new */ if (rn2(2) || (otmp = which_armor(priest, W_ARM)) == 0) { struct obj *obj; obj = mksobj(rn2(p_coaligned(priest) ? 2 : 5) ? ROBE_OF_PROTECTION : ROBE_OF_POWER, TRUE, FALSE); if (p_coaligned(priest)) uncurse(obj); else curse(obj); (void) mpickobj(priest, obj); m_dowear(priest, TRUE); if (!(obj->owornmask & W_ARM)) { obj_extract_self(obj); obfree(obj, (struct obj *)0); } else if (otmp) { obj_extract_self(otmp); obfree(otmp, (struct obj *)0); } } } } /* * Specially aligned monsters are named specially. * - aligned priests with ispriest and high priests have shrines * they retain ispriest and epri when polymorphed * - aligned priests without ispriest and Angels are roamers * they retain isminion and access epri as emin when polymorphed * (coaligned Angels are also created as minions, but they * use the same naming convention) * - minions do not have ispriest but have isminion and emin * - caller needs to inhibit Hallucination if it wants to force * the true name even when under that influence */ char * priestname(mon, pname) register struct monst *mon; char *pname; /* caller-supplied output buffer */ { const char *what = Hallucination ? rndmonnam() : mon->data->mname; Strcpy(pname, "the "); if (mon->minvis) Strcat(pname, "invisible "); if (mon->ispriest || mon->data == &mons[PM_ALIGNED_PRIEST] || mon->data == &mons[PM_ANGEL]) { /* use epri */ if (mon->mtame && mon->data == &mons[PM_ANGEL]) Strcat(pname, "guardian "); if (mon->data != &mons[PM_ALIGNED_PRIEST] && mon->data != &mons[PM_HIGH_PRIEST]) { Strcat(pname, what); Strcat(pname, " "); } if (mon->data != &mons[PM_ANGEL]) { if (!mon->ispriest && EPRI(mon)->renegade) Strcat(pname, "renegade "); if (mon->data == &mons[PM_HIGH_PRIEST]) Strcat(pname, "high "); if (Hallucination) Strcat(pname, "poohbah "); else if (mon->female) Strcat(pname, "priestess "); else Strcat(pname, "priest "); } Strcat(pname, "of "); Strcat(pname, halu_gname((int)EPRI(mon)->shralign)); return(pname); } /* use emin instead of epri */ Strcat(pname, what); Strcat(pname, " of "); Strcat(pname, halu_gname(EMIN(mon)->min_align)); return(pname); } boolean p_coaligned(priest) struct monst *priest; { return((boolean)(u.ualign.type == ((int)EPRI(priest)->shralign))); } STATIC_OVL boolean has_shrine(pri) struct monst *pri; { struct rm *lev; if(!pri) return(FALSE); lev = &levl[EPRI(pri)->shrpos.x][EPRI(pri)->shrpos.y]; if (!IS_ALTAR(lev->typ) || !(lev->altarmask & AM_SHRINE)) return(FALSE); return((boolean)(EPRI(pri)->shralign == Amask2align(lev->altarmask & ~AM_SHRINE))); } struct monst * findpriest(roomno) char roomno; { register struct monst *mtmp; for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) { if (DEADMONSTER(mtmp)) continue; if(mtmp->ispriest && (EPRI(mtmp)->shroom == roomno) && histemple_at(mtmp,mtmp->mx,mtmp->my)) return(mtmp); } return (struct monst *)0; } /* called from check_special_room() when the player enters the temple room */ void intemple(roomno) register int roomno; { register struct monst *priest = findpriest((char)roomno); boolean tended = (priest != (struct monst *)0); boolean shrined, sanctum, can_speak; const char *msg1, *msg2; char buf[BUFSZ]; if(!temple_occupied(u.urooms0)) { if(tended) { shrined = has_shrine(priest); sanctum = (priest->data == &mons[PM_HIGH_PRIEST] && (Is_sanctum(&u.uz) || In_endgame(&u.uz))); can_speak = (priest->mcanmove && !priest->msleeping && flags.soundok); if (can_speak) { unsigned save_priest = priest->ispriest; /* don't reveal the altar's owner upon temple entry in the endgame; for the Sanctum, the next message names Moloch so suppress the "of Moloch" for him here too */ if (sanctum && !Hallucination) priest->ispriest = 0; pline("%s intones:", canseemon(priest) ? Monnam(priest) : "A nearby voice"); priest->ispriest = save_priest; } msg2 = 0; if(sanctum && Is_sanctum(&u.uz)) { if(priest->mpeaceful) { msg1 = "Infidel, you have entered Moloch's Sanctum!"; msg2 = "Be gone!"; priest->mpeaceful = 0; set_malign(priest); } else msg1 = "You desecrate this place by your presence!"; } else { Sprintf(buf, "Pilgrim, you enter a %s place!", !shrined ? "desecrated" : "sacred"); msg1 = buf; } if (can_speak) { verbalize(msg1); if (msg2) verbalize(msg2); } 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."); } } else { switch(rn2(3)) { case 0: You("have an eerie feeling..."); break; case 1: You_feel("like you are being watched."); break; default: pline("A shiver runs down your %s.", body_part(SPINE)); break; } if(!rn2(5)) { struct monst *mtmp; if(!(mtmp = makemon(&mons[PM_GHOST],u.ux,u.uy,NO_MM_FLAGS))) return; if (!Blind || sensemon(mtmp)) pline("An enormous ghost appears next to you!"); else You("sense a presence close by!"); mtmp->mpeaceful = 0; set_malign(mtmp); if(flags.verbose) You("are frightened to death, and unable to move."); nomul(-3); nomovemsg = "You regain your composure."; } } } } void priest_talk(priest) register struct monst *priest; { boolean coaligned = p_coaligned(priest); boolean strayed = (u.ualign.record < 0); /* KMH, conduct */ u.uconduct.gnostic++; if(priest->mflee || (!priest->ispriest && coaligned && strayed)) { pline("%s doesn't want anything to do with you!", Monnam(priest)); priest->mpeaceful = 0; return; } /* priests don't chat unless peaceful and in their own temple */ if(!histemple_at(priest,priest->mx,priest->my) || !priest->mpeaceful || !priest->mcanmove || priest->msleeping) { static const char *cranky_msg[3] = { "Thou wouldst have words, eh? I'll give thee a word or two!", "Talk? Here is what I have to say!", "Pilgrim, I would speak no longer with thee." }; if(!priest->mcanmove || priest->msleeping) { pline("%s breaks out of %s reverie!", Monnam(priest), mhis(priest)); priest->mfrozen = priest->msleeping = 0; priest->mcanmove = 1; } priest->mpeaceful = 0; verbalize(cranky_msg[rn2(3)]); return; } /* you desecrated the temple and now you want to chat? */ if(priest->mpeaceful && *in_rooms(priest->mx, priest->my, TEMPLE) && !has_shrine(priest)) { verbalize("Begone! Thou desecratest this holy place with thy presence."); priest->mpeaceful = 0; return; } #ifndef GOLDOBJ if(!u.ugold) { if(coaligned && !strayed) { if (priest->mgold > 0L) { /* Note: two bits is actually 25 cents. Hmm. */ pline("%s gives you %s for an ale.", Monnam(priest), (priest->mgold == 1L) ? "one bit" : "two bits"); if (priest->mgold > 1L) u.ugold = 2L; else 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); } else pline("%s is not interested.", Monnam(priest)); return; } else { long offer; pline("%s asks you for a contribution for the temple.", Monnam(priest)); if((offer = bribe(priest)) == 0) { 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 */ exercise(A_WIS, TRUE); } } 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."); /* KMH, intrinsic patch */ incr_itimeout(&HClairvoyant, rn1(500,500)); } } else if(offer < (u.ulevel * 600) && u.ublessed < 20 && (u.ublessed < 9 || !rn2(u.ublessed))) { verbalize("Thy devotion has been rewarded."); if (!(HProtection & INTRINSIC)) { HProtection |= FROMOUTSIDE; if (!u.ublessed) u.ublessed = rn1(3, 2); } 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; } else { adjalign(2); } } } } } struct monst * mk_roamer(ptr, alignment, x, y, peaceful) register struct permonst *ptr; aligntyp alignment; xchar x, y; boolean peaceful; { register struct monst *roamer; register boolean coaligned = (u.ualign.type == alignment); if (ptr != &mons[PM_ALIGNED_PRIEST] && ptr != &mons[PM_ANGEL]) return((struct monst *)0); if (MON_AT(x, y)) (void) rloc(m_at(x, y), FALSE); /* insurance */ if (!(roamer = makemon(ptr, x, y, NO_MM_FLAGS))) return((struct monst *)0); EPRI(roamer)->shralign = alignment; if (coaligned && !peaceful) EPRI(roamer)->renegade = TRUE; /* roamer->ispriest == FALSE naturally */ roamer->isminion = TRUE; /* borrowing this bit */ roamer->mtrapseen = ~0; /* traps are known */ roamer->mpeaceful = peaceful; roamer->msleeping = 0; set_malign(roamer); /* peaceful may have changed */ /* MORE TO COME */ return(roamer); } void reset_hostility(roamer) register struct monst *roamer; { if(!(roamer->isminion && (roamer->data == &mons[PM_ALIGNED_PRIEST] || roamer->data == &mons[PM_ANGEL]))) return; if(EPRI(roamer)->shralign != u.ualign.type) { roamer->mpeaceful = roamer->mtame = 0; set_malign(roamer); } newsym(roamer->mx, roamer->my); } boolean in_your_sanctuary(mon, x, y) struct monst *mon; /* if non-null, overrides */ xchar x, y; { register char roomno; register struct monst *priest; if (mon) { 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)) return FALSE; if ((priest = findpriest(roomno)) == 0) return FALSE; return (boolean)(has_shrine(priest) && p_coaligned(priest) && priest->mpeaceful); } void ghod_hitsu(priest) /* when attacking "priest" in his temple */ struct monst *priest; { int x, y, ax, ay, roomno = (int)temple_occupied(u.urooms); int x1, y1, x2, y2, n; coord poss[4]; int stpx = sgn(u.ux - priest->mx), stpy = sgn(u.uy - priest->my); /* gods avoid hitting the temple priest */ struct mkroom *troom; if (!roomno || !has_shrine(priest)) return; ax = x = EPRI(priest)->shrpos.x; ay = y = EPRI(priest)->shrpos.y; troom = &rooms[roomno - ROOMOFFSET]; /* * Determine the source of the lightning bolt according to the * following rules: * 1. The source cannot be directly under the player * 2. Don't zap through the temple priest * 3. First choice of source is the altar itself * 4. Otherwise use a wall, prefering orthogonal to diagonal paths * 5. Choose randomly from equally preferred sources * Note that if the hero is not standing on either the altar or * a door then (u.ux, u.uy) may be counted as a possible source which * is later rejected by linedup() letting the hero off the hook. */ if((u.ux == x && u.uy == y) || !linedup(u.ux, u.uy, x, y) || stpx == sgn(tbx) && stpy == sgn(tby)) { if(IS_DOOR(levl[u.ux][u.uy].typ)) { if(u.ux == troom->lx - 1) { if (stpx != sgn(u.ux - troom->hx) || stpy != 0) { x = troom->hx; y = u.uy; } else { /* Diagonal required */ x1 = u.ux + u.uy - troom->ly; y1 = troom->ly; x2 = u.ux + troom->hy - u.uy; y2 = troom->hy; if (x1 > troom->hx && x2 > troom->hx) return; else if (x2 > troom->hx || x1 <= troom->hx && !rn2(2)) { x = x1; y = y1; } else { x = x2; y = y2; } } } else if(u.ux == troom->hx + 1) { if (stpx != sgn(u.ux - troom->lx) || stpy != 0) { x = troom->lx; y = u.uy; } else { /* Diagonal required */ x1 = u.ux - (u.uy - troom->ly); y1 = troom->ly; x2 = u.ux - (troom->hy - u.uy); y2 = troom->hy; if (x1 < troom->lx && x2 < troom->lx) return; else if (x2 < troom->lx || x1 >= troom->lx && !rn2(2)) { x = x1; y = y1; } else { x = x2; y = y2; } } } else if(u.uy == troom->ly - 1) { if (stpx != 0 || stpy != sgn(u.uy - troom->hy)) { x = u.ux; y = troom->hy; } else { /* Diagonal required */ x1 = troom->lx; y1 = u.uy + u.ux - troom->lx; x2 = troom->hx; y2 = u.uy + troom->hx - u.ux; if (y1 > troom->hy && y2 > troom->hy) return; else if (y2 > troom->hy || y1 <= troom->hy && !rn2(2)) { x = x1; y = y1; } else { x = x2; y = y2; } } } else if(u.uy == troom->hy + 1) { if (stpx != 0 || stpy != sgn(u.uy - troom->ly)) { x = u.ux; y = troom->ly; } else { /* Diagonal required */ x1 = troom->lx; y1 = u.uy - (u.ux - troom->lx); x2 = troom->hx; y2 = u.uy - (troom->hx - u.ux); if (y1 < troom->ly && y2 < troom->ly) return; else if (y2 < troom->ly || y1 >= troom->ly && !rn2(2)) { x = x1; y = y1; } else { x = x2; y = y2; } } } } else { /* Calculate the possible orthogonal paths */ n = 0; if (stpx != 0 || stpy != sgn(u.uy - troom->ly)) { poss[n].x = u.ux; poss[n++].y = troom->ly; } if (stpx != 0 || stpy != sgn(u.uy - troom->hy)) { poss[n].x = u.ux; poss[n++].y = troom->hy; } if (stpx != sgn(u.ux - troom->lx) || stpy != 0) { poss[n].x = troom->lx; poss[n++].y = u.uy; } if (stpx != sgn(u.ux - troom->hx) || stpy != 0) { poss[n].x = troom->hx; poss[n++].y = u.uy; } if (n) { n = rn2(n); x = poss[n].x; y = poss[n].y; } else { impossible("Omnipresent priest?"); return; } } if(!linedup(u.ux, u.uy, x, y)) return; } switch(rn2(3)) { case 0: pline("%s roars in anger: \"Thou shalt suffer!\"", a_gname_at(ax, ay)); break; case 1: pline("%s voice booms: \"How darest thou harm my servant!\"", s_suffix(a_gname_at(ax, ay))); break; default: pline("%s roars: \"Thou dost profane my shrine!\"", a_gname_at(ax, ay)); break; } buzz(-10-(AD_ELEC-1), 6, x, y, sgn(tbx), sgn(tby)); /* bolt of lightning */ exercise(A_WIS, FALSE); } void angry_priest() { register struct monst *priest; struct rm *lev; if ((priest = findpriest(temple_occupied(u.urooms))) != 0) { wakeup(priest); /* * If the altar has been destroyed or converted, let the * priest run loose. * (When it's just a conversion and there happens to be * a fresh corpse nearby, the priest ought to have an * opportunity to try converting it back; maybe someday...) */ lev = &levl[EPRI(priest)->shrpos.x][EPRI(priest)->shrpos.y]; if (!IS_ALTAR(lev->typ) || ((aligntyp)Amask2align(lev->altarmask & AM_MASK) != EPRI(priest)->shralign)) { priest->ispriest = 0; /* now a roamer */ priest->isminion = 1; /* but still aligned */ /* this overloads the `shroom' field, which is now clobbered */ EPRI(priest)->renegade = 0; } } } /* * When saving bones, find priests that aren't on their shrine level, * and remove them. This avoids big problems when restoring bones. */ void clearpriests() { register struct monst *mtmp, *mtmp2; for(mtmp = fmon; mtmp; mtmp = mtmp2) { mtmp2 = mtmp->nmon; if (!DEADMONSTER(mtmp) && mtmp->ispriest && !on_level(&(EPRI(mtmp)->shrlevel), &u.uz)) mongone(mtmp); } } /* munge priest-specific structure when restoring -dlc */ void restpriest(mtmp, ghostly) register struct monst *mtmp; boolean ghostly; { if(u.uz.dlevel) { if (ghostly) assign_level(&(EPRI(mtmp)->shrlevel), &u.uz); } } #endif /* OVLB */ /*priest.c*/ slashem-0.0.7E7F3/src/mkobj.c0000664000076400007640000013750710545462317013726 0ustar aliali/* SCCS Id: @(#)mkobj.c 3.4 2002/10/07 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" #include "prop.h" STATIC_DCL void FDECL(mkbox_cnts,(struct obj *)); STATIC_DCL void FDECL(obj_timer_checks,(struct obj *, XCHAR_P, XCHAR_P, int)); #ifdef OVL1 STATIC_DCL void FDECL(container_weight, (struct obj *)); STATIC_DCL struct obj *FDECL(save_mtraits, (struct obj *, struct monst *)); #ifdef WIZARD STATIC_DCL const char *FDECL(where_name, (int)); STATIC_DCL void FDECL(check_contained, (struct obj *,const char *)); #endif #endif /* OVL1 */ extern struct obj *thrownobj; /* defined in dothrow.c */ /*#define DEBUG_EFFECTS*/ /* show some messages for debugging */ struct icp { int iprob; /* probability of an item type */ char iclass; /* item class */ }; #ifdef OVL1 /* STEPHEN WHITE'S NEW CODE */ /* [Tom] tried to fix this back up a little... */ /* KMH, balance patch -- changed again */ const struct icp mkobjprobs[] = { {10, WEAPON_CLASS}, {10, ARMOR_CLASS}, {20, FOOD_CLASS}, {10, TOOL_CLASS}, { 8, GEM_CLASS}, {15, POTION_CLASS}, {15, SCROLL_CLASS}, { 4, SPBOOK_CLASS}, { 4, WAND_CLASS}, { 4, RING_CLASS} /* KMH -- amulets now appear later in the game */ /*{ 0, AMULET_CLASS}*/ }; const struct icp boxiprobs[] = { {15, GEM_CLASS}, {10, FOOD_CLASS}, {20, POTION_CLASS}, {20, SCROLL_CLASS}, {12, SPBOOK_CLASS}, { 7, COIN_CLASS}, { 7, WAND_CLASS}, { 6, RING_CLASS}, { 3, AMULET_CLASS} }; #ifdef REINCARNATION const struct icp rogueprobs[] = { {12, WEAPON_CLASS}, {12, ARMOR_CLASS}, {22, FOOD_CLASS}, {22, POTION_CLASS}, {22, SCROLL_CLASS}, { 5, WAND_CLASS}, { 5, RING_CLASS} }; #endif const struct icp hellprobs[] = { {15, WEAPON_CLASS}, {15, ARMOR_CLASS}, {16, FOOD_CLASS}, {14, TOOL_CLASS}, {12, GEM_CLASS}, { 2, POTION_CLASS}, { 2, SCROLL_CLASS}, {10, WAND_CLASS}, {10, RING_CLASS}, { 4, AMULET_CLASS} }; 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); } struct obj * mkobj(oclass, artif) char oclass; boolean artif; { int tprob, i, prob = rnd(1000); if(oclass == RANDOM_CLASS) { const struct icp *iprobs = #ifdef REINCARNATION (Is_rogue_level(&u.uz)) ? (const struct icp *)rogueprobs : #endif Inhell ? (const struct icp *)hellprobs : (const struct icp *)mkobjprobs; for(tprob = rnd(100); (tprob -= iprobs->iprob) > 0; iprobs++); oclass = iprobs->iclass; } i = bases[(int)oclass]; while((prob -= objects[i].oc_prob) > 0) i++; if(objects[i].oc_class != oclass || !OBJ_NAME(objects[i])) panic("probtype error, oclass=%d i=%d", (int) oclass, i); return(mksobj(i, TRUE, artif)); } STATIC_OVL void mkbox_cnts(box) struct obj *box; { register int n, minn = 0; register struct obj *otmp; box->cobj = (struct obj *) 0; switch (box->otyp) { case MEDICAL_KIT: n = 60; /* Initial inventory, no empty medical kits */ if (moves <= 1 && !in_mklev) minn = 1; break; 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 = rn1(n+1 - minn, minn); n > 0; n--) { if (box->otyp == MEDICAL_KIT) { int supplies[] = { PHIAL, BANDAGE, PILL }; if (!(otmp = mksobj(supplies[rn2(SIZE(supplies))], TRUE, TRUE))) continue; else otmp->oinvis = FALSE; } else if (box->otyp == ICE_BOX) { if (!(otmp = mksobj(CORPSE, TRUE, TRUE))) continue; /* Note: setting age to 0 is correct. Age has a different * from usual meaning for objects stored in ice boxes. -KAA */ otmp->age = 0L; if (otmp->timed) { (void) stop_timer(ROT_CORPSE, (genericptr_t)otmp); (void) stop_timer(MOLDY_CORPSE, (genericptr_t)otmp); (void) stop_timer(REVIVE_MON, (genericptr_t)otmp); } } else { register int tprob; const struct icp *iprobs = boxiprobs; for (tprob = rnd(100); (tprob -= iprobs->iprob) > 0; iprobs++) ; if (!(otmp = mkobj(iprobs->iclass, TRUE))) continue; /* handle a couple of special cases */ if (otmp->oclass == COIN_CLASS) { /* 2.5 x level's usual amount; weight adjusted below */ otmp->quan = (long)(rnd(level_difficulty()+5) * rnd(100)); otmp->owt = weight(otmp); } else while (otmp->otyp == ROCK) { otmp->otyp = rnd_class(DILITHIUM_CRYSTAL, LOADSTONE); if (otmp->quan > 2L) otmp->quan = 1L; otmp->owt = weight(otmp); } if (box->otyp == BAG_OF_HOLDING) { if (Is_mbag(otmp)) { otmp->otyp = SACK; otmp->spe = 0; otmp->owt = weight(otmp); } else while (otmp->otyp == WAN_CANCELLATION) otmp->otyp = rnd_class(WAN_LIGHT, WAN_FIREBALL); } } (void) add_to_container(box, otmp); } } int rndmonnum() /* select a random, common monster type */ { register struct permonst *ptr; register int i; /* Plan A: get a level-appropriate common monster */ ptr = rndmonst(); if (ptr) return(monsndx(ptr)); /* Plan B: get any common monster */ do { i = rn1(SPECIAL_PM - LOW_PM, LOW_PM); ptr = &mons[i]; } while((ptr->geno & G_NOGEN) || (!Inhell && (ptr->geno & G_HELL))); return(i); } /* * 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) struct obj *obj; long num; { 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 */ otmp->o_id = flags.ident++; 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 */ /* as a back pointer to the container object when contained. */ if (obj->where == OBJ_FLOOR) obj->nexthere = otmp; if (obj->oxlth) (void)memcpy((genericptr_t)otmp->oextra, (genericptr_t)obj->oextra, obj->oxlth); if (obj->onamelth) (void)strncpy(ONAME(otmp), ONAME(obj), (int)obj->onamelth); if (obj->unpaid) splitbill(obj,otmp); if (obj->timed) obj_split_timers(obj, otmp); if (obj_sheds_light(obj)) obj_split_light_source(obj, otmp); return otmp; } /* * Insert otmp right after obj in whatever chain(s) it is on. Then extract * obj from the chain(s). This function does a literal swap. It is up to * the caller to provide a valid context for the swap. When done, obj will * still exist, but not on any chain. * * Note: Don't use use obj_extract_self() -- we are doing an in-place swap, * not actually moving something. */ void replace_object(obj, otmp) struct obj *obj; struct obj *otmp; { otmp->where = obj->where; switch (obj->where) { case OBJ_FREE: /* do nothing */ break; case OBJ_INVENT: otmp->nobj = obj->nobj; obj->nobj = otmp; extract_nobj(obj, &invent); break; case OBJ_CONTAINED: otmp->nobj = obj->nobj; otmp->ocontainer = obj->ocontainer; obj->nobj = otmp; extract_nobj(obj, &obj->ocontainer->cobj); break; case OBJ_MINVENT: otmp->nobj = obj->nobj; otmp->ocarry = obj->ocarry; obj->nobj = otmp; extract_nobj(obj, &obj->ocarry->minvent); break; case OBJ_FLOOR: otmp->nobj = obj->nobj; otmp->nexthere = obj->nexthere; otmp->ox = obj->ox; otmp->oy = obj->oy; obj->nobj = otmp; obj->nexthere = otmp; extract_nobj(obj, &fobj); extract_nexthere(obj, &level.objects[obj->ox][obj->oy]); break; case OBJ_MIGRATING: otmp->nobj = obj->nobj; obj->nobj = otmp; extract_nobj(obj, &migrating_objs); break; case OBJ_BURIED: otmp->nobj = obj->nobj; obj->nobj = otmp; extract_nobj(obj, &level.buriedobjlist); break; case OBJ_ONBILL: otmp->nobj = obj->nobj; obj->nobj = otmp; extract_nobj(obj, &billobjs); break; default: panic("replace_object: obj position"); break; } } /* * Create a dummy duplicate to put on shop bill. The duplicate exists * only in the billobjs chain. This function is used when a shop object * is being altered, and a copy of the original is needed for billing * purposes. For example, when eating, where an interruption will yield * an object which is different from what it started out as; the "I x" * command needs to display the original object. * * The caller is responsible for checking otmp->unpaid and * costly_spot(u.ux, u.uy). This function will make otmp no charge. * * Note that check_unpaid_usage() should be used instead for partial * usage of an object. */ void bill_dummy_object(otmp) register struct obj *otmp; { register struct obj *dummy, *obj; if (otmp->unpaid) subfrombill(otmp, shop_keeper(*u.ushops)); dummy = newobj(otmp->oxlth + otmp->onamelth); *dummy = *otmp; if (Has_contents(otmp)) { for(obj = otmp->cobj; obj; obj = obj->nobj) bill_dummy_object(obj); dummy->cobj = NULL; } dummy->where = OBJ_FREE; dummy->o_id = flags.ident++; if (!dummy->o_id) dummy->o_id = flags.ident++; /* ident overflowed */ dummy->timed = 0; if (otmp->oxlth) (void)memcpy((genericptr_t)dummy->oextra, (genericptr_t)otmp->oextra, otmp->oxlth); if (otmp->onamelth) (void)strncpy(ONAME(dummy), ONAME(otmp), (int)otmp->onamelth); if (Is_candle(dummy)) dummy->lamplit = 0; addtobill(dummy, FALSE, TRUE, TRUE); if (otmp->where != OBJ_INVENT) otmp->no_charge = 1; otmp->unpaid = 0; return; } #endif /* OVL1 */ #ifdef OVLB static const char dknowns[] = { WAND_CLASS, RING_CLASS, POTION_CLASS, SCROLL_CLASS, GEM_CLASS, SPBOOK_CLASS, WEAPON_CLASS, TOOL_CLASS, 0 }; struct obj * mksobj(otyp, init, artif) int otyp; boolean init; boolean artif; { int mndx, tryct; struct obj *otmp; char let = objects[otyp].oc_class; otmp = newobj(0); *otmp = zeroobj; otmp->age = monstermoves; otmp->o_id = flags.ident++; if (!otmp->o_id) otmp->o_id = flags.ident++; /* ident overflowed */ otmp->quan = 1L; otmp->oclass = let; otmp->otyp = otyp; otmp->where = OBJ_FREE; otmp->dknown = index(dknowns, let) ? 0 : 1; otmp->oinvis = 0; otmp->olocked = FALSE; /* ->recharged */ otmp->altmode = WP_MODE_AUTO; if ((otmp->otyp >= ELVEN_SHIELD && otmp->otyp <= ORCISH_SHIELD) || otmp->otyp == SHIELD_OF_REFLECTION) otmp->dknown = 0; if (!objects[otmp->otyp].oc_uses_known) otmp->known = 1; #ifdef INVISIBLE_OBJECTS otmp->oinvis = !always_visible(otmp) && \ (otmp->otyp != BOULDER || !In_sokoban(&u.uz)) && !rn2(1250); #endif if (init) switch (let) { /* -----------============STEPHEN WHITE'S NEW CODE============----------- */ case WEAPON_CLASS: /* KMH, balance patch -- new macros */ otmp->quan = is_multigen(otmp) ? (long) rn1(6,6) : 1L; if(!rn2(11)) { otmp->spe = rne(3); otmp->blessed = rn2(2); } else if(!rn2(10)) { curse(otmp); otmp->spe = -rne(3); } else blessorcurse(otmp, 10); if (is_poisonable(otmp) && !rn2(100)) otmp->opoisoned = 1; if (artif && !rn2(20)) otmp = mk_artifact(otmp, (aligntyp)A_NONE); #ifdef FIREARMS if (otmp->otyp == STICK_OF_DYNAMITE) { otmp->age = (otmp->cursed ? rn2(15) + 2 : (otmp->blessed ? 15 : rn2(10) + 10)); } #endif break; case FOOD_CLASS: otmp->odrained = 0; otmp->oeaten = 0; switch(otmp->otyp) { case CORPSE: /* possibly overridden by mkcorpstat() */ tryct = 50; do otmp->corpsenm = undead_to_corpse(rndmonnum()); while ((mvitals[otmp->corpsenm].mvflags & G_NOCORPSE) && (--tryct > 0)); if (tryct == 0) { /* perhaps rndmonnum() only wants to make G_NOCORPSE monsters on this level; let's create an adventurer's corpse instead, then */ otmp->corpsenm = PM_HUMAN; } /* timer set below */ break; case EGG: otmp->corpsenm = NON_PM; /* generic egg */ if (!rn2(3)) for (tryct = 200; tryct > 0; --tryct) { mndx = can_be_hatched(rndmonnum()); if (mndx != NON_PM && !dead_species(mndx, TRUE)) { otmp->corpsenm = mndx; /* typed egg */ attach_egg_hatch_timeout(otmp); break; } } break; case TIN: otmp->corpsenm = NON_PM; /* empty (so far) */ if (!rn2(6)) otmp->spe = 1; /* spinach */ else for (tryct = 200; tryct > 0; --tryct) { mndx = undead_to_corpse(rndmonnum()); if (mons[mndx].cnutrit && !(mvitals[mndx].mvflags & G_NOCORPSE)) { otmp->corpsenm = mndx; break; } } blessorcurse(otmp, 10); break; 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 */ /* -----------============STEPHEN WHITE'S NEW CODE============----------- */ case GEM_CLASS: /* KMH, balance patch -- healthstone replaces rotting/health */ if (otmp->otyp == LOADSTONE || otmp->otyp == HEALTHSTONE) curse(otmp); else if (otmp->otyp == ROCK) otmp->quan = (long) rn1(6,6); else if ((otmp->otyp != LUCKSTONE) && (otmp->otyp != HEALTHSTONE) && !rn2(6)) otmp->quan = 2L; else otmp->quan = 1L; break; /* -----------============STEPHEN WHITE'S NEW CODE============----------- */ case TOOL_CLASS: switch(otmp->otyp) { case TALLOW_CANDLE: case WAX_CANDLE: otmp->spe = 1; otmp->age = 20L * /* 400 or 200 */ (long)objects[otmp->otyp].oc_cost; otmp->lamplit = 0; otmp->quan = 1L + (long)(rn2(2) ? rn2(7) : 0); blessorcurse(otmp, 5); break; case TORCH: otmp->spe = 0; otmp->age = (long) rn1(300,600); otmp->lamplit = 0; otmp->quan = rnd(3); blessorcurse(otmp, 5); break; case BRASS_LANTERN: case OIL_LAMP: otmp->spe = 1; otmp->age = (long) rn1(500,1000); otmp->lamplit = 0; blessorcurse(otmp, 5); break; case MAGIC_CANDLE: case MAGIC_LAMP: otmp->spe = 1; otmp->lamplit = 0; blessorcurse(otmp, 2); break; #ifdef LIGHTSABERS case RED_DOUBLE_LIGHTSABER: otmp->altmode = FALSE; case GREEN_LIGHTSABER: #ifdef D_SABER case BLUE_LIGHTSABER: #endif case RED_LIGHTSABER: otmp->lamplit = 0; otmp->age = (long) rn1(500,1000); blessorcurse(otmp, 2); break; #endif case CHEST: case LARGE_BOX: otmp->olocked = !!(rn2(5)); otmp->otrapped = !(rn2(10)); case ICE_BOX: case SACK: case OILSKIN_SACK: case BAG_OF_HOLDING: case MEDICAL_KIT: mkbox_cnts(otmp); break; #ifdef TOURIST case EXPENSIVE_CAMERA: #endif case TINNING_KIT: case MAGIC_MARKER: otmp->spe = rn1(70,30); break; case CAN_OF_GREASE: otmp->spe = rn1(25,10); blessorcurse(otmp, 10); break; /* KMH, balance patch -- removed to prevent abuse case ORB_OF_DESTRUCTION:blessorcurse(otmp, 2); break; case ORB_OF_CHARGING: otmp->spe = rnd(10) + 5; blessorcurse(otmp, 2); break; case ORB_OF_ENCHANTMENT:otmp->spe = rnd(3) + 1; blessorcurse(otmp, 2); break;*/ case CRYSTAL_BALL: otmp->spe = rn1(10,3); blessorcurse(otmp, 2); break; case HORN_OF_PLENTY: case BAG_OF_TRICKS: otmp->spe = rn1(20,10); break; case FIGURINE: { int tryct2 = 0; do otmp->corpsenm = rndmonnum(); while(is_human(&mons[otmp->corpsenm]) && tryct2++ < 30); blessorcurse(otmp, 4); break; } case BELL_OF_OPENING: otmp->spe = 3; break; case MAGIC_FLUTE: case MAGIC_HARP: case FROST_HORN: case FIRE_HORN: case DRUM_OF_EARTHQUAKE: /* KMH, balance patch -- removed case PAN_PIPE_OF_SUMMONING: case PAN_PIPE_OF_THE_SEWERS: */ otmp->spe = rn1(5,10); break; } break; case AMULET_CLASS: if (otmp->otyp == AMULET_OF_YENDOR) flags.made_amulet = TRUE; if(rn2(10) && (otmp->otyp == AMULET_OF_STRANGULATION || otmp->otyp == AMULET_OF_CHANGE || otmp->otyp == AMULET_OF_RESTFUL_SLEEP)) { curse(otmp); } else blessorcurse(otmp, 10); case VENOM_CLASS: case CHAIN_CLASS: case BALL_CLASS: break; case POTION_CLASS: if (otmp->otyp == POT_OIL) otmp->age = MAX_OIL_IN_FLASK; /* amount of oil */ /* fall through */ case SCROLL_CLASS: #ifdef MAIL if (otmp->otyp != SCR_MAIL) #endif blessorcurse(otmp, 4); break; case SPBOOK_CLASS: /* WAC charged books are easier to read */ if (otmp->otyp != SPE_BOOK_OF_THE_DEAD) otmp->spe = rn1(3,2); blessorcurse(otmp, 17); break; /* -----------============STEPHEN WHITE'S NEW CODE============----------- */ case ARMOR_CLASS: if(rn2(10) && (otmp->otyp == FUMBLE_BOOTS || otmp->otyp == LEVITATION_BOOTS || otmp->otyp == HELM_OF_OPPOSITE_ALIGNMENT || otmp->otyp == GAUNTLETS_OF_FUMBLING || otmp->otyp == ROBE_OF_WEAKNESS || !rn2(11))) { curse(otmp); otmp->spe = -rne(3); } else if(!rn2(10)) { otmp->blessed = rn2(2); otmp->spe = rne(3); } else blessorcurse(otmp, 10); if (artif && !rn2(40)) otmp = mk_artifact(otmp, (aligntyp)A_NONE); /* simulate lacquered armor for samurai */ if (Role_if(PM_SAMURAI) && otmp->otyp == SPLINT_MAIL && (moves <= 1 || In_quest(&u.uz))) { #ifdef UNIXPC /* optimizer bitfield bug */ otmp->oerodeproof = 1; otmp->rknown = 1; #else otmp->oerodeproof = otmp->rknown = 1; #endif } break; /* -----------============STEPHEN WHITE'S NEW CODE============----------- */ case WAND_CLASS: if(otmp->otyp == WAN_WISHING) { otmp->spe = rnd(3); #ifdef INVISIBLE_OBJECTS if (Is_stronghold(&u.uz)) otmp->oinvis = 1; #endif if(!rn2(2)) otmp->recharged = 1; } else otmp->spe = rn1(5, (objects[otmp->otyp].oc_dir == NODIR) ? 15 : 8); blessorcurse(otmp, 17); otmp->recharged = 0; /* used to control recharging */ break; case RING_CLASS: if(objects[otmp->otyp].oc_charged) { blessorcurse(otmp, 3); if(rn2(10)) { if(rn2(10) && bcsign(otmp)) otmp->spe = bcsign(otmp) * rne(3); else otmp->spe = rn2(2) ? rne(3) : -rne(3); } /* make useless +0 rings much less common */ if (otmp->spe == 0) { /* otmp->spe = rn2(4) - rn2(3); */ /* wow! +8! */ if (rn2(2)) otmp->spe = rne(8)+1; else otmp->spe = -(rne(8)+1); } /* negative rings are usually cursed */ if (otmp->spe < 0 && rn2(5)) curse(otmp); } else if(rn2(10) && (otmp->otyp == RIN_TELEPORTATION || otmp->otyp == RIN_POLYMORPH || otmp->otyp == RIN_AGGRAVATE_MONSTER || otmp->otyp == RIN_SLEEPING || otmp->otyp == RIN_HUNGER || !rn2(9))) { curse(otmp); } break; case ROCK_CLASS: switch (otmp->otyp) { case STATUE: /* possibly overridden by mkcorpstat() */ 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 COIN_CLASS: break; /* do nothing */ default: impossible("impossible mkobj %d, sym '%c'.", otmp->otyp, objects[otmp->otyp].oc_class); return (struct obj *)0; } /* Some things must get done (timers) even if init = 0 */ switch (otmp->otyp) { case CORPSE: start_corpse_timeout(otmp); break; } /* unique objects may have an associated artifact entry */ if (objects[otyp].oc_unique && !otmp->oartifact) otmp = mk_artifact(otmp, (aligntyp)A_NONE); otmp->owt = weight(otmp); return(otmp); } /* * 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 MOLD_REVIVE_CHANCE 23 /* 1/23 chance for 50 turns ~ 90% chance */ #define MOLDY_CHANCE 290 /* 1/290 chance for 200 turns ~ 50% 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])) { /* * Riders always revive. They have a 1/3 chance per turn * of reviving after 12 turns. Always revive by 500. */ action = REVIVE_MON; 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 */ action = REVIVE_MON; when = age; break; } } else if (mons[body->corpsenm].mlet == S_FUNGUS) { /* Fungi come back with a vengeance - if you don't eat it or * destroy it, any live cells will quickly use the dead ones * as food and come back. */ long age; for (age = 2; age <= TAINT_AGE; age++) if (!rn2(MOLD_REVIVE_CHANCE)) { /* mold revives */ action = REVIVE_MON; when = age; break; } } if (action == ROT_CORPSE && !acidic(&mons[body->corpsenm])) { /* Corpses get moldy */ long age; for (age = TAINT_AGE + 1; age <= ROT_AGE; age++) if (!rn2(MOLDY_CHANCE)) { /* "revives" as a random s_fungus */ action = MOLDY_CORPSE; when = age; break; } } if (body->norevive) body->norevive = 0; (void) start_timer(when, TIMER_OBJECT, action, (genericptr_t)body); } void bless(otmp) register struct obj *otmp; { #ifdef GOLDOBJ if (otmp->oclass == COIN_CLASS) return; #endif otmp->cursed = 0; otmp->blessed = 1; if (carried(otmp) && confers_luck(otmp)) set_moreluck(); else if (otmp->otyp == HEALTHSTONE) recalc_health(); else if (otmp->otyp == BAG_OF_HOLDING) otmp->owt = weight(otmp); else if (otmp->otyp == FIGURINE && otmp->timed) (void) stop_timer(FIG_TRANSFORM, (genericptr_t) otmp); return; } void unbless(otmp) register struct obj *otmp; { otmp->blessed = 0; if (carried(otmp) && confers_luck(otmp)) set_moreluck(); else if (otmp->otyp == HEALTHSTONE) recalc_health(); else if (otmp->otyp == BAG_OF_HOLDING) otmp->owt = weight(otmp); else if (otmp->otyp == FIGURINE && otmp->timed) (void) stop_timer(FIG_TRANSFORM, (genericptr_t) otmp); return; } void curse(otmp) register struct obj *otmp; { #ifdef GOLDOBJ if (otmp->oclass == COIN_CLASS) return; #endif otmp->blessed = 0; otmp->cursed = 1; /* welded two-handed weapon interferes with some armor removal */ if (otmp == uwep && bimanual(uwep)) reset_remarm(); /* rules at top of wield.c state that twoweapon cannot be done with cursed alternate weapon */ if (otmp == uswapwep && u.twoweap) drop_uswapwep(); /* some cursed items need immediate updating */ if (carried(otmp) && confers_luck(otmp)) set_moreluck(); else if (otmp->otyp == HEALTHSTONE) recalc_health(); else if (otmp->otyp == BAG_OF_HOLDING) otmp->owt = weight(otmp); else if (otmp->otyp == FIGURINE) { if (otmp->corpsenm != NON_PM && !dead_species(otmp->corpsenm,TRUE) && (carried(otmp) || mcarried(otmp))) attach_fig_transform_timeout(otmp); } return; } void uncurse(otmp) register struct obj *otmp; { otmp->cursed = 0; if (carried(otmp) && confers_luck(otmp)) set_moreluck(); /* KMH, balance patch -- healthstones affect healing */ else if (otmp->otyp == HEALTHSTONE) recalc_health(); else if (otmp->otyp == BAG_OF_HOLDING) otmp->owt = weight(otmp); } #endif /* OVLB */ #ifdef OVL1 void blessorcurse(otmp, chance) register struct obj *otmp; register int chance; { if(otmp->blessed || otmp->cursed) return; if(!rn2(chance)) { if(!rn2(2)) { curse(otmp); } else { bless(otmp); } } return; } #endif /* OVL1 */ #ifdef OVLB int bcsign(otmp) register struct obj *otmp; { return(!!otmp->blessed - !!otmp->cursed); } #endif /* OVLB */ #ifdef OVL0 /* * Calculate the weight of the given object. This will recursively follow * and calculate the weight of any containers. * * Note: It is possible to end up with an incorrect weight if some part * of the code messes with a contained object and doesn't update the * container's weight. */ int weight(obj) register struct obj *obj; { int wt = objects[obj->otyp].oc_weight; if (obj->otyp == LARGE_BOX && obj->spe == 1) /* Schroedinger's Cat */ wt += mons[PM_HOUSECAT].cwt; if (Is_container(obj) || obj->otyp == STATUE) { struct obj *contents; register int cwt = 0; if (obj->otyp == STATUE && obj->corpsenm >= LOW_PM) wt = (int)obj->quan * ((int)mons[obj->corpsenm].cwt * 3 / 2); for(contents=obj->cobj; contents; contents=contents->nobj) cwt += weight(contents); /* KMH -- support artifact BoH (including the Wallet of Perseus) * * The weight of bags of holding is calculated as the weight * of the bag plus the weight of the bag's contents modified * as follows: * * Bag status Ordinary Artifact * ---------- -------- -------- * cursed 2x 4x * blessed (x + 3)/4 (x + 5)/6 * otherwise (x + 1)/2 (x + 2)/3 * * The macro DELTA_CWT in pickup.c also implements these * weight equations. * * Note: The above checks are performed in the given order. * this means that if an object is both blessed and * cursed (not supposed to happen), it will be treated * as cursed. */ #define CEILDIV(x,y) (((x)+(y)-1)/(y)) /* ceil(x/y) */ if (obj->otyp == BAG_OF_HOLDING) cwt = obj->cursed ? (cwt * (obj->oartifact ? 4 : 2)) : CEILDIV(cwt, (obj->oartifact ? 3 : 2) * (obj->blessed ? 2 : 1)); #undef CEILDIV return wt + cwt; } if (obj->otyp == CORPSE && obj->corpsenm >= LOW_PM) { long long_wt = (int)obj->quan * 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 == COIN_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 */ return(wt ? wt*(int)obj->quan : ((int)obj->quan + 1)>>1); } static int treefruits[] = {APPLE,ORANGE,PEAR,BANANA,EUCALYPTUS_LEAF}; 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 struct obj * mkgold(amount, x, y) long amount; int x, y; { 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); return (gold); } #endif /* OVLB */ #ifdef OVL1 /* return TRUE if the corpse has special timing */ /* special timing is a timing that is not rotting or molding */ #define special_corpse(num) (((num) == PM_LIZARD) \ || ((num) == PM_LICHEN) \ || (is_rider(&mons[num])) \ || (mons[num].mlet == S_FUNGUS) \ || (mons[num].mlet == S_TROLL)) /* * OEXTRA note: Passing mtmp causes mtraits to be saved * even if ptr passed as well, but ptr is always used for * the corpse type (corpsenm). That allows the corpse type * to be different from the original monster, * i.e. vampire -> human corpse * yet still allow restoration of the original monster upon * resurrection. */ struct obj * mkcorpstat(objtype, mtmp, ptr, x, y, init) int objtype; /* CORPSE or STATUE */ struct monst *mtmp; struct permonst *ptr; int x, y; boolean init; { register struct obj *otmp; if (objtype != CORPSE && objtype != STATUE) impossible("making corpstat type %d", objtype); if (x == 0 && y == 0) { /* special case - random placement */ otmp = mksobj(objtype, init, FALSE); if (otmp) rloco(otmp); } else otmp = mksobj_at(objtype, x, y, init, FALSE); if (otmp) { if (mtmp) { struct obj *otmp2; if (!ptr) ptr = mtmp->data; /* save_mtraits frees original data pointed to by otmp */ otmp2 = save_mtraits(otmp, mtmp); if (otmp2) otmp = otmp2; } /* use the corpse or statue produced by mksobj() as-is unless `ptr' is non-null */ if (ptr) { int old_corpsenm = otmp->corpsenm; otmp->corpsenm = monsndx(ptr); otmp->owt = weight(otmp); if (otmp->otyp == CORPSE && (special_corpse(old_corpsenm) || special_corpse(otmp->corpsenm))) { obj_stop_timers(otmp); start_corpse_timeout(otmp); } } } return(otmp); } /* * Attach a monster id to an object, to provide * a lasting association between the two. */ struct obj * obj_attach_mid(obj, mid) struct obj *obj; unsigned mid; { struct obj *otmp; int lth, namelth; if (!mid || !obj) return (struct obj *)0; lth = sizeof(mid); namelth = obj->onamelth ? strlen(ONAME(obj)) + 1 : 0; if (namelth) otmp = realloc_obj(obj, lth, (genericptr_t) &mid, namelth, ONAME(obj)); else { otmp = obj; otmp->oxlth = sizeof(mid); (void) memcpy((genericptr_t)otmp->oextra, (genericptr_t)&mid, sizeof(mid)); } if (otmp && otmp->oxlth) otmp->oattached = OATTACHED_M_ID; /* mark it */ return otmp; } static struct obj * save_mtraits(obj, mtmp) struct obj *obj; struct monst *mtmp; { struct obj *otmp; int lth, namelth; lth = sizeof(struct monst) + mtmp->mxlth + mtmp->mnamelth; namelth = obj->onamelth ? strlen(ONAME(obj)) + 1 : 0; otmp = realloc_obj(obj, lth, (genericptr_t) mtmp, namelth, ONAME(obj)); 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; otmp->oattached = OATTACHED_MONST; /* mark it */ } return otmp; } /* returns a pointer to a new monst structure based on * the one contained within the obj. */ struct monst * get_mtraits(obj, copyof) struct obj *obj; boolean copyof; { struct monst *mtmp = (struct monst *)0; struct monst *mnew = (struct monst *)0; if (obj->oxlth && obj->oattached == OATTACHED_MONST) mtmp = (struct monst *)obj->oextra; if (mtmp) { if (copyof) { int lth = mtmp->mxlth + mtmp->mnamelth; mnew = newmonst(lth); lth += sizeof(struct monst); (void) memcpy((genericptr_t)mnew, (genericptr_t)mtmp, lth); } else { /* Never insert this returned pointer into mon chains! */ mnew = mtmp; } } return mnew; } #endif /* OVL1 */ #ifdef OVLB /* make an object named after someone listed in the scoreboard file */ struct obj * mk_tt_object(objtype, x, y) int objtype; /* CORPSE or STATUE */ register int x, y; { register struct obj *otmp, *otmp2; boolean initialize_it; /* 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; } return(otmp); } /* make a new corpse or statue, uninitialized if a statue (i.e. no books) */ struct obj * mk_named_object(objtype, ptr, x, y, nm) int objtype; /* CORPSE or STATUE */ struct permonst *ptr; int x, y; const char *nm; { struct obj *otmp; otmp = mkcorpstat(objtype, (struct monst *)0, ptr, x, y, (boolean)(objtype != STATUE)); if (nm) otmp = oname(otmp, nm); return(otmp); } boolean is_flammable(otmp) 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)); } #endif /* OVLB */ #ifdef OVL1 /* * These routines maintain the single-linked lists headed in level.objects[][] * and threaded through the nexthere fields in the object-instance structure. */ /* put the object at the given location */ void place_object(otmp, x, y) register struct obj *otmp; int x, y; { register struct obj *otmp2 = level.objects[x][y]; 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 */ if (otmp2 && (otmp2->otyp == BOULDER)) { otmp->nexthere = otmp2->nexthere; otmp2->nexthere = otmp; } else { otmp->nexthere = otmp2; level.objects[x][y] = otmp; } /* set the new object's location */ otmp->ox = x; otmp->oy = y; otmp->where = OBJ_FLOOR; /* add to floor chain */ otmp->nobj = fobj; fobj = otmp; if (otmp->timed) obj_timer_checks(otmp, x, y, 0); } #define ON_ICE(a) ((a)->recharged) #define ROT_ICE_ADJUSTMENT 2 /* rotting on ice takes 2 times as long */ /* If ice was affecting any objects correct that now * Also used for starting ice effects too. [zap.c] */ void obj_ice_effects(x, y, do_buried) int x, y; boolean do_buried; { struct obj *otmp; for (otmp = level.objects[x][y]; otmp; otmp = otmp->nexthere) { if (otmp->timed) obj_timer_checks(otmp, x, y, 0); } if (do_buried) { for (otmp = level.buriedobjlist; otmp; otmp = otmp->nobj) { if (otmp->ox == x && otmp->oy == y) { if (otmp->timed) obj_timer_checks(otmp, x, y, 0); } } } } /* * Returns an obj->age for a corpse object on ice, that would be the * actual obj->age if the corpse had just been lifted from the ice. * This is useful when just using obj->age in a check or calculation because * rot timers pertaining to the object don't have to be stopped and * restarted etc. */ long peek_at_iced_corpse_age(otmp) struct obj *otmp; { long age, retval = otmp->age; if (otmp->otyp == CORPSE && ON_ICE(otmp)) { /* Adjust the age; must be same as obj_timer_checks() for off ice*/ age = monstermoves - otmp->age; retval = otmp->age + (age / ROT_ICE_ADJUSTMENT); #ifdef DEBUG_EFFECTS pline_The("%s age has ice modifications:otmp->age = %ld, returning %ld.", s_suffix(doname(otmp)),otmp->age, retval); pline("Effective age of corpse: %ld.", monstermoves - retval); #endif } return retval; } STATIC_OVL void obj_timer_checks(otmp, x, y, force) struct obj *otmp; xchar x, y; int force; /* 0 = no force so do checks, <0 = force off, >0 force on */ { long tleft = 0L; short action = ROT_CORPSE; boolean restart_timer = FALSE; boolean on_floor = (otmp->where == OBJ_FLOOR); boolean buried = (otmp->where == OBJ_BURIED); /* Check for corpses just placed on or in ice */ if (otmp->otyp == CORPSE && (on_floor || buried) && is_ice(x,y)) { tleft = stop_timer(action, (genericptr_t)otmp); if (tleft == 0L) { action = MOLDY_CORPSE; tleft = stop_timer(action, (genericptr_t)otmp); if (tleft == 0L) { action = REVIVE_MON; tleft = stop_timer(action, (genericptr_t)otmp); } } if (tleft != 0L) { long age; tleft = tleft - monstermoves; /* mark the corpse as being on ice */ ON_ICE(otmp) = 1; #ifdef DEBUG_EFFECTS pline("%s is now on ice at %d,%d.", The(xname(otmp)),x,y); #endif /* Adjust the time remaining */ tleft *= ROT_ICE_ADJUSTMENT; restart_timer = TRUE; /* Adjust the age; must be same as in obj_ice_age() */ age = monstermoves - otmp->age; otmp->age = monstermoves - (age * ROT_ICE_ADJUSTMENT); } } /* Check for corpses coming off ice */ else if ((force < 0) || (otmp->otyp == CORPSE && ON_ICE(otmp) && ((on_floor && !is_ice(x,y)) || !on_floor))) { tleft = stop_timer(action, (genericptr_t)otmp); if (tleft == 0L) { action = MOLDY_CORPSE; tleft = stop_timer(action, (genericptr_t)otmp); if (tleft == 0L) { action = REVIVE_MON; tleft = stop_timer(action, (genericptr_t)otmp); } } if (tleft != 0L) { long age; tleft = tleft - monstermoves; ON_ICE(otmp) = 0; #ifdef DEBUG_EFFECTS pline("%s is no longer on ice at %d,%d.", The(xname(otmp)),x,y); #endif /* Adjust the remaining time */ tleft /= ROT_ICE_ADJUSTMENT; restart_timer = TRUE; /* Adjust the age */ age = monstermoves - otmp->age; otmp->age = otmp->age + (age / ROT_ICE_ADJUSTMENT); } } /* now re-start the timer with the appropriate modifications */ if (restart_timer) (void) start_timer(tleft, TIMER_OBJECT, action, (genericptr_t)otmp); } #undef ON_ICE #undef ROT_ICE_ADJUSTMENT void remove_object(otmp) register struct obj *otmp; { xchar x = otmp->ox; xchar y = otmp->oy; if (otmp->where != OBJ_FLOOR) panic("remove_object: obj not on floor"); if (otmp->otyp == BOULDER) unblock_point(x,y); /* vision */ extract_nexthere(otmp, &level.objects[x][y]); extract_nobj(otmp, &fobj); if (otmp->timed) obj_timer_checks(otmp,x,y,0); } /* throw away all of a monster's inventory */ void discard_minvent(mtmp) struct monst *mtmp; { struct obj *otmp, *curr; while (mtmp->minvent) { /* Move all contained objects out into the monster's main inventory * so that we can easily check that every object (whether contained * or not) does not evade destruction. */ while (Has_contents((otmp = mtmp->minvent))) { curr = otmp->cobj; obj_extract_self(curr); (void) add_to_minv(mtmp, curr); } obj_extract_self(otmp); if (evades_destruction(otmp)) { impossible("%s discarded from %s inventory", obj_typename(otmp->otyp), s_suffix(mon_nam(mtmp))); place_object(otmp, mtmp->mx, mtmp->my); continue; } obfree(otmp, (struct obj *)0); /* dealloc_obj() isn't sufficient */ } } /* * Free obj from whatever list it is on in preperation of deleting it or * moving it elsewhere. This will perform all high-level consequences * involved with removing the item. E.g. if the object is in the hero's * inventory and confers heat resistance, the hero will lose it. * * Object positions: * OBJ_FREE not on any list * OBJ_FLOOR fobj, level.locations[][] chains (use remove_object) * OBJ_CONTAINED cobj chain of container object * OBJ_INVENT hero's invent chain (use freeinv) * OBJ_MINVENT monster's invent chain * OBJ_MIGRATING migrating chain * OBJ_BURIED level.buriedobjs chain * OBJ_ONBILL on billobjs chain */ void obj_extract_self(obj) struct obj *obj; { switch (obj->where) { case OBJ_FREE: break; case OBJ_FLOOR: remove_object(obj); break; case OBJ_CONTAINED: extract_nobj(obj, &obj->ocontainer->cobj); container_weight(obj->ocontainer); break; case OBJ_INVENT: freeinv(obj); break; case OBJ_MINVENT: extract_nobj(obj, &obj->ocarry->minvent); break; case OBJ_MIGRATING: extract_nobj(obj, &migrating_objs); break; case OBJ_BURIED: extract_nobj(obj, &level.buriedobjlist); break; case OBJ_ONBILL: extract_nobj(obj, &billobjs); break; default: panic("obj_extract_self"); break; } } /* Extract a contained indestructable object (if one exists) and return it */ struct obj * container_extract_indestructable(struct obj *obj) { struct obj *otmp = obj->cobj, *indestructable = (struct obj *)0; while (!indestructable && otmp) { if (Has_contents(otmp)) indestructable = container_extract_indestructable(otmp); if (!indestructable && evades_destruction(otmp)) { indestructable = otmp; obj_extract_self(indestructable); } otmp = otmp->nobj; } return indestructable; } /* Extract the given object from the chain, following nobj chain. */ void extract_nobj(obj, head_ptr) struct obj *obj, **head_ptr; { struct obj *curr, *prev; curr = *head_ptr; for (prev = (struct obj *) 0; curr; prev = curr, curr = curr->nobj) { if (curr == obj) { if (prev) prev->nobj = curr->nobj; else *head_ptr = curr->nobj; break; } } if (!curr) panic("extract_nobj: object lost"); obj->where = OBJ_FREE; } /* * Extract the given object from the chain, following nexthere chain. * * This does not set obj->where, this function is expected to be called * in tandem with extract_nobj, which does set it. */ void extract_nexthere(obj, head_ptr) struct obj *obj, **head_ptr; { struct obj *curr, *prev; curr = *head_ptr; for (prev = (struct obj *) 0; curr; prev = curr, curr = curr->nexthere) { if (curr == obj) { if (prev) prev->nexthere = curr->nexthere; else *head_ptr = curr->nexthere; break; } } if (!curr) panic("extract_nexthere: object lost"); } /* * Add obj to mon's inventory. If obj is able to merge with something already * in the inventory, then the passed obj is deleted and 1 is returned. * Otherwise 0 is returned. */ int add_to_minv(mon, obj) struct monst *mon; struct obj *obj; { struct obj *otmp; if (obj->where != OBJ_FREE) panic("add_to_minv: obj not free"); /* merge if possible */ for (otmp = mon->minvent; otmp; otmp = otmp->nobj) if (merged(&otmp, &obj)) return 1; /* obj merged and then free'd */ /* else insert; don't bother forcing it to end of chain */ obj->where = OBJ_MINVENT; obj->ocarry = mon; obj->nobj = mon->minvent; mon->minvent = obj; 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 add_to_migration(obj) struct obj *obj; { if (obj->where != OBJ_FREE) panic("add_to_migration: obj not free"); obj->where = OBJ_MIGRATING; obj->nobj = migrating_objs; migrating_objs = obj; } void add_to_buried(obj) struct obj *obj; { if (obj->where != OBJ_FREE) panic("add_to_buried: obj not free"); obj->where = OBJ_BURIED; obj->nobj = level.buriedobjlist; level.buriedobjlist = obj; } /* Recalculate the weight of this container and all of _its_ containers. */ STATIC_OVL void container_weight(container) struct obj *container; { container->owt = weight(container); if (container->where == OBJ_CONTAINED) container_weight(container->ocontainer); /* else if (container->where == OBJ_INVENT) recalculate load delay here ??? */ } /* * Deallocate the object. _All_ objects should be run through here for * them to be deallocated. */ void dealloc_obj(obj) struct obj *obj; { if (obj->where != OBJ_FREE) panic("dealloc_obj: obj not free"); /* free up any timers attached to the object */ if (obj->timed) obj_stop_timers(obj); /* * Free up any light sources attached to the object. * * We may want to just call del_light_source() without any * checks (requires a code change there). Otherwise this * list must track all objects that can have a light source * attached to it (and also requires lamplit to be set). */ if (obj_sheds_light(obj)) del_light_source(LS_OBJECT, (genericptr_t) obj); if (obj == thrownobj) thrownobj = (struct obj*)0; free((genericptr_t) obj); } #if defined(OBJ_SANITY) || defined(WIZARD) # ifdef WIZARD # define msgprefix "" # else # define msgprefix "BUG (please report): " # endif /* Check all object lists for consistency. */ void obj_sanity_check() { int x, y; struct obj *obj; struct monst *mon; const char *mesg; char obj_address[20], mon_address[20]; /* room for formatted pointers */ mesg = "fobj sanity"; for (obj = fobj; obj; obj = obj->nobj) { if (obj->where != OBJ_FLOOR) { pline("%s%s obj %s %s@(%d,%d): %s\n", msgprefix, mesg, fmt_ptr((genericptr_t)obj, obj_address), where_name(obj->where), obj->ox, obj->oy, doname(obj)); } check_contained(obj, mesg); } mesg = "location sanity"; for (x = 0; x < COLNO; x++) for (y = 0; y < ROWNO; y++) for (obj = level.objects[x][y]; obj; obj = obj->nexthere) if (obj->where != OBJ_FLOOR) { pline("%s%s obj %s %s@(%d,%d): %s\n", msgprefix, mesg, fmt_ptr((genericptr_t)obj, obj_address), where_name(obj->where), obj->ox, obj->oy, doname(obj)); } mesg = "invent sanity"; for (obj = invent; obj; obj = obj->nobj) { if (obj->where != OBJ_INVENT) { pline("%s%s obj %s %s: %s\n", msgprefix, mesg, fmt_ptr((genericptr_t)obj, obj_address), where_name(obj->where), doname(obj)); } check_contained(obj, mesg); } mesg = "migrating sanity"; for (obj = migrating_objs; obj; obj = obj->nobj) { if (obj->where != OBJ_MIGRATING) { pline("%s%s obj %s %s: %s\n", msgprefix, mesg, fmt_ptr((genericptr_t)obj, obj_address), where_name(obj->where), doname(obj)); } check_contained(obj, mesg); } mesg = "buried sanity"; for (obj = level.buriedobjlist; obj; obj = obj->nobj) { if (obj->where != OBJ_BURIED) { pline("%s%s obj %s %s: %s\n", msgprefix, mesg, fmt_ptr((genericptr_t)obj, obj_address), where_name(obj->where), doname(obj)); } check_contained(obj, mesg); } mesg = "bill sanity"; for (obj = billobjs; obj; obj = obj->nobj) { if (obj->where != OBJ_ONBILL) { pline("%s%s obj %s %s: %s\n", msgprefix, mesg, fmt_ptr((genericptr_t)obj, obj_address), where_name(obj->where), doname(obj)); } /* shouldn't be a full container on the bill */ if (obj->cobj) { pline("%s%s obj %s contains %s! %s\n", msgprefix, mesg, fmt_ptr((genericptr_t)obj, obj_address), something, doname(obj)); } } mesg = "minvent sanity"; for (mon = fmon; mon; mon = mon->nmon) for (obj = mon->minvent; obj; obj = obj->nobj) { if (obj->where != OBJ_MINVENT) { pline("%s%s obj %s %s: %s\n", msgprefix, mesg, fmt_ptr((genericptr_t)obj, obj_address), where_name(obj->where), doname(obj)); } if (obj->ocarry != mon) { pline("%s%s obj %s (%s) not held by mon %s (%s)\n", msgprefix, mesg, fmt_ptr((genericptr_t)obj, obj_address), doname(obj), fmt_ptr((genericptr_t)mon, mon_address), mon_nam(mon)); } check_contained(obj, mesg); } } /* This must stay consistent with the defines in obj.h. */ static const char *obj_state_names[NOBJ_STATES] = { "free", "floor", "contained", "invent", "minvent", "migrating", "buried", "onbill" }; STATIC_OVL const char * where_name(where) int where; { return (where<0 || where>=NOBJ_STATES) ? "unknown" : obj_state_names[where]; } /* obj sanity check: check objs contained by container */ STATIC_OVL void check_contained(container, mesg) struct obj *container; const char *mesg; { struct obj *obj; char obj1_address[20], obj2_address[20]; for (obj = container->cobj; obj; obj = obj->nobj) { if (obj->where != OBJ_CONTAINED) pline("%scontained %s obj %s: %s\n", msgprefix, mesg, fmt_ptr((genericptr_t)obj, obj1_address), where_name(obj->where)); else if (obj->ocontainer != container) pline("%s%s obj %s not in container %s\n", msgprefix, mesg, fmt_ptr((genericptr_t)obj, obj1_address), fmt_ptr((genericptr_t)container, obj2_address)); } } #endif /* OBJ_SANITY || WIZARD */ #endif /* OVL1 */ /*mkobj.c*/ slashem-0.0.7E7F3/src/timeout.c0000644000076400007640000016775610545462317014321 0ustar aliali/* SCCS Id: @(#)timeout.c 3.4 2002/12/17 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" #include "lev.h" /* for checking save modes */ STATIC_DCL void NDECL(stoned_dialogue); STATIC_DCL void NDECL(vomiting_dialogue); STATIC_DCL void NDECL(choke_dialogue); STATIC_DCL void NDECL(slime_dialogue); STATIC_DCL void NDECL(slime_dialogue); 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(accelerate_timer, (SHORT_P, genericptr_t, long)); STATIC_DCL void FDECL(cleanup_burn, (genericptr_t,long)); #ifdef OVLB /* He is being petrified - dialogue by inmet!tower */ static NEARDATA const char * const stoned_texts[] = { "You are slowing down.", /* 5 */ "Your limbs are stiffening.", /* 4 */ "Your limbs have turned to stone.", /* 3 */ "You have turned to stone.", /* 2 */ "You are a statue." /* 1 */ }; STATIC_OVL void stoned_dialogue() { 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); nomovemsg = 0; } exercise(A_DEX, FALSE); } /* He is getting sicker and sicker prior to vomiting */ static NEARDATA const char * const vomiting_texts[] = { "are feeling mildly nauseated.", /* 14 */ "feel slightly confused.", /* 11 */ "can't seem to think straight.", /* 8 */ "feel incredibly sick.", /* 5 */ "suddenly vomit!" /* 2 */ }; STATIC_OVL void vomiting_dialogue() { register long i = (Vomiting & TIMEOUT) / 3L; if ((((Vomiting & TIMEOUT) % 3L) == 2) && (i >= 0) && (i < SIZE(vomiting_texts))) You(vomiting_texts[SIZE(vomiting_texts) - i - 1]); switch ((int) i) { case 0: vomit(); morehungry(20); break; case 2: make_stunned(HStun + d(2,4), FALSE); /* fall through */ case 3: make_confused(HConfusion + d(2,4), FALSE); break; } exercise(A_CON, FALSE); } static NEARDATA const char * const choke_texts[] = { "You find it hard to breathe.", "You're gasping for air.", "You can no longer breathe.", "You're turning %s.", "You suffocate." }; static NEARDATA const char * const choke_texts2[] = { "Your %s is becoming constricted.", "Your blood is having trouble reaching your brain.", "The pressure on your %s increases.", "Your consciousness is fading.", "You suffocate." }; STATIC_OVL void choke_dialogue() { register long i = (Strangled & TIMEOUT); if(i > 0 && i <= SIZE(choke_texts)) { if (Breathless || !rn2(50)) pline(choke_texts2[SIZE(choke_texts2) - i], body_part(NECK)); else { const char *str = choke_texts[SIZE(choke_texts)-i]; if (index(str, '%')) pline(str, hcolor(NH_BLUE)); else pline(str); } } exercise(A_STR, FALSE); } static NEARDATA const char * const slime_texts[] = { "You are turning a little %s.", /* 5 */ "Your limbs are getting oozy.", /* 4 */ "Your skin begins to peel away.", /* 3 */ "You are turning into %s.", /* 2 */ "You have become %s." /* 1 */ }; STATIC_OVL void slime_dialogue() { 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(NH_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); } void burn_away_slime() { if (Slimed) { pline_The("slime that covers you is burned away!"); Slimed = 0L; flags.botl = 1; } return; } #endif /* OVLB */ #ifdef OVL0 void nh_timeout() { register struct prop *upp; /* char c; */ int sleeptime; int m_idx; int baseluck = (flags.moonphase == FULL_MOON) ? 1 : 0; if (flags.friday13) baseluck -= 1; if (u.uluck != baseluck && moves % (u.uhave.amulet || u.ugangr ? 300 : 600) == 0) { /* Cursed luckstones stop bad luck from timing out; blessed luckstones * stop good luck from timing out; normal luckstones stop both; * neither is stopped if you don't have a luckstone. * Luck is based at 0 usually, +1 if a full moon and -1 on Friday 13th */ register int time_luck = stone_luck(FALSE); boolean nostone = !carrying(LUCKSTONE) && !stone_luck(TRUE); if(u.uluck > baseluck && (nostone || time_luck < 0)) u.uluck--; else if(u.uluck < baseluck && (nostone || time_luck > 0)) u.uluck++; } /* WAC -- check for timeout of specials */ tech_timeout(); if(u.uinvulnerable) return; /* things past this point could kill you */ if(Stoned) stoned_dialogue(); if(Slimed) slime_dialogue(); if(Vomiting) vomiting_dialogue(); if(Strangled) choke_dialogue(); if(u.mtimedone && !--u.mtimedone) { if (Unchanging) u.mtimedone = rnd(100*youmonst.data->mlevel + 1); else rehumanize(); } if(u.ucreamed) u.ucreamed--; /* Dissipate spell-based protection. */ if (u.usptime) { if (--u.usptime == 0 && u.uspellprot) { u.usptime = u.uspmtime; u.uspellprot--; find_ac(); if (!Blind) Norep("The %s haze around you %s.", hcolor(NH_GOLDEN), u.uspellprot ? "becomes less dense" : "disappears"); } } #ifdef STEED if (u.ugallop) { if (--u.ugallop == 0L && u.usteed) pline("%s stops galloping.", Monnam(u.usteed)); } #endif for(upp = u.uprops; upp < u.uprops+SIZE(u.uprops); upp++) if((upp->intrinsic & TIMEOUT) && !(--upp->intrinsic & TIMEOUT)) { switch(upp - u.uprops){ case STONED: if (delayed_killer && !killer) { killer = delayed_killer; delayed_killer = 0; } if (!killer) { /* leaving killer_format would make it "petrified by petrification" */ killer_format = NO_KILLER_PREFIX; killer = "killed by petrification"; } done(STONING); break; case SLIMED: if (delayed_killer && !killer) { killer = delayed_killer; delayed_killer = 0; } if (!killer) { killer_format = NO_KILLER_PREFIX; killer = "turned into green slime"; } done(TURNED_SLIME); break; case VOMITING: make_vomiting(0L, TRUE); break; case SICK: You("die from your illness."); killer_format = KILLED_BY_AN; killer = u.usick_cause; if ((m_idx = name_to_mon(killer)) >= LOW_PM) { if (type_is_pname(&mons[m_idx])) { killer_format = KILLED_BY; } else if (mons[m_idx].geno & G_UNIQ) { killer = the(killer); Strcpy(u.usick_cause, killer); killer_format = KILLED_BY; } } u.usick_type = 0; done(POISONING); break; case FAST: if (!Very_fast) You_feel("yourself slowing down%s.", Fast ? " a bit" : ""); break; case FIRE_RES: if (!Fire_resistance) You("feel a little warmer."); break; case COLD_RES: if (!Cold_resistance) You("feel a little cooler."); break; case SLEEP_RES: if (!Sleep_resistance) You("feel a little sleepy."); break; case SHOCK_RES: if (!Shock_resistance) You("feel a little static cling."); break; case POISON_RES: if (!Poison_resistance) You("feel a little less healthy."); break; case DISINT_RES: if (!Disint_resistance) You("feel a little less firm."); break; case TELEPORT: if (!Teleportation) You("feel a little less jumpy."); break; case TELEPORT_CONTROL: if (!Teleport_control) You("feel a little less in control of yourself."); break; case TELEPAT: if (!HTelepat) You("feel a little less mentally acute."); break; case FREE_ACTION: if (!Free_action) You("feel a little stiffer."); break; case PASSES_WALLS: if (!Passes_walls) You("feel a little more solid."); break; case INVULNERABLE: if (!Invulnerable) You("are no longer invulnerable."); break; case CONFUSION: HConfusion = 1; /* So make_confused works properly */ make_confused(0L, TRUE); stop_occupation(); break; case STUNNED: HStun = 1; make_stunned(0L, TRUE); stop_occupation(); break; case BLINDED: Blinded = 1; make_blinded(0L, TRUE); stop_occupation(); break; case INVIS: newsym(u.ux,u.uy); if (!Invis && !BInvis && !Blind) { You(!See_invisible ? "are no longer invisible." : "can no longer see through yourself."); stop_occupation(); } break; case SEE_INVIS: set_mimic_blocking(); /* do special mimic handling */ see_monsters(); /* make invis mons appear */ newsym(u.ux,u.uy); /* make self appear */ stop_occupation(); break; case WOUNDED_LEGS: heal_legs(); stop_occupation(); break; case HALLUC: HHallucination = 1; (void) make_hallucinated(0L, TRUE, 0L); stop_occupation(); break; case SLEEPING: if (unconscious() || Sleep_resistance) HSleeping += rnd(100); else if (Sleeping) { You("fall asleep."); sleeptime = rnd(20); fall_asleep(-sleeptime, TRUE); HSleeping += sleeptime + rnd(100); } break; case LEVITATION: (void) float_down(I_SPECIAL|TIMEOUT, 0L); break; case STRANGLED: killer_format = KILLED_BY; killer = (u.uburied) ? "suffocation" : "strangulation"; done(DIED); break; case FUMBLING: /* call this only when a move took place. */ /* otherwise handle fumbling msgs locally. */ if (u.umoved && !Levitation) { slip_or_trip(); nomul(-2); nomovemsg = ""; /* The more you are carrying the more likely you * are to make noise when you fumble. Adjustments * to this number must be thoroughly play tested. */ if ((inv_weight() > -500)) { You("make a lot of noise!"); wake_nearby(); } } /* from outside means slippery ice; don't reset counter if that's the only fumble reason */ HFumbling &= ~FROMOUTSIDE; if (Fumbling) HFumbling += rnd(20); break; case DETECT_MONSTERS: see_monsters(); break; } } run_timers(); } #endif /* OVL0 */ #ifdef OVL1 void fall_asleep(how_long, wakeup_msg) int how_long; boolean wakeup_msg; { stop_occupation(); nomul(how_long); /* generally don't notice sounds while sleeping */ if (wakeup_msg && multi == how_long) { /* caller can follow with a direct call to Hear_again() if there's a need to override this when wakeup_msg is true */ flags.soundok = 0; afternmv = Hear_again; /* this won't give any messages */ } /* early wakeup from combat won't be possible until next monster turn */ u.usleep = monstermoves; nomovemsg = wakeup_msg ? "You wake up." : You_can_move_again; } #ifdef UNPOLYPILE /* WAC polymorph an object * Unlike monsters, this function is called after the polymorph */ void set_obj_poly(obj, old) struct obj *obj, *old; { /* Same unpolytime (500,500) as for player */ if (is_hazy(old)) obj->oldtyp = old->oldtyp; else obj->oldtyp = old->otyp; if (obj->oldtyp == obj->otyp) obj->oldtyp = STRANGE_OBJECT; else (void) start_timer(rn1(500,500), TIMER_OBJECT, UNPOLY_OBJ, (genericptr_t) obj); return; } /* timer callback routine: undo polymorph on an object */ void unpoly_obj(arg, timeout) genericptr_t arg; long timeout; { struct obj *obj, *otmp, *otmp2; int oldobj, depthin; boolean silent = (timeout != monstermoves), /* unpoly'ed while away */ explodes; obj = (struct obj *) arg; if (!is_hazy(obj)) return; oldobj = obj->oldtyp; if (carried(obj) && !silent) /* silent == TRUE is a strange case... */ pline("Suddenly, your %s!", aobjnam(obj, "transmute")); (void) stop_timer(UNPOLY_OBJ, (genericptr_t) obj); obj = poly_obj(obj, oldobj); if (obj->otyp == WAN_CANCELLATION || Is_mbag(obj)) { otmp = obj; depthin = 0; explodes = FALSE; while (otmp->where == OBJ_CONTAINED) { otmp = otmp->ocontainer; if (otmp->otyp == BAG_OF_HOLDING) { explodes = mbag_explodes(obj, depthin); break; } depthin++; } if (explodes) { otmp2 = otmp; while (otmp2->where == OBJ_CONTAINED) { otmp2 = otmp2->ocontainer; if (otmp2->otyp == BAG_OF_HOLDING) otmp = otmp2; } destroy_mbag(otmp, silent); } } return; } #endif /* UNPOLYPILE */ #endif /* OVL1 */ #ifdef OVL0 #ifdef UNPOLYPILE /* * Cleanup a hazy object if timer stopped. */ /*ARGSUSED*/ static void cleanup_unpoly(arg, timeout) genericptr_t arg; long timeout; { #if defined(MAC_MPW) || defined(__MWERKS__) # pragma unused(timeout) #endif struct obj *obj = (struct obj *)arg; obj->oldtyp = STRANGE_OBJECT; #ifdef WIZARD if (wizard && obj->where == OBJ_INVENT) update_inventory(); #endif } #endif /* UNPOLYPILE */ #endif /* OVL0 */ #ifdef OVL1 /* WAC polymorph a monster * returns 0 if no change, 1 if polymorphed and -1 if died. * This handles system shock for monsters so DON'T do system shock elsewhere * when polymorphing. * (except in unpolymorph code, which is a special case) */ int mon_poly(mtmp, your_fault, change_fmt) struct monst *mtmp; boolean your_fault; const char *change_fmt; { if (change_fmt && canseemon(mtmp)) pline(change_fmt, Monnam(mtmp)); return mon_spec_poly(mtmp, (struct permonst *)0, 0L, FALSE, canseemon(mtmp), TRUE, your_fault); } /* WAC Muscle function - for more control over polying * returns 0 if no change, 1 if polymorphed and -1 if died. * cancels/sets up timers if polymorph is successful * lets receiver handle failures */ int mon_spec_poly(mtmp, type, when, polyspot, transform_msg, system_shock, your_fault) struct monst *mtmp; struct permonst *type; long when; boolean polyspot; boolean transform_msg; boolean system_shock; boolean your_fault; { int i; i = newcham(mtmp, type, polyspot, transform_msg); if (system_shock && (!i || !rn2(25))) { /* Uhoh. !i == newcham wasn't able to make the polymorph...*/ if (transform_msg) pline("%s shudders.", Monnam(mtmp)); if (i) mtmp->mhp -= rnd(30); if (!i || (mtmp->mhp <= 0)) { if (your_fault) xkilled(mtmp, 3); else mondead(mtmp); i = -1; } } if (i > 0) { /* Stop any old timers. */ (void) stop_timer(UNPOLY_MON, (genericptr_t) mtmp); /* Lengthen unpolytime - was 500,500 for player */ (void) start_timer(when ? when : rn1(1000, 1000), TIMER_MONSTER, UNPOLY_MON, (genericptr_t) mtmp); } return i; } /* timer callback routine: undo polymorph on a monster */ void unpoly_mon(arg, timeout) genericptr_t arg; long timeout; { struct monst *mtmp; int oldmon; char oldname[BUFSZ]; /* DON'T use char * since this will change! */ boolean silent = (timeout != monstermoves); /* unpoly'ed while away */ mtmp = (struct monst *) arg; oldmon = mtmp->oldmonnm; strcpy(oldname, Monnam(mtmp)); (void) stop_timer(UNPOLY_MON, (genericptr_t) mtmp); if (!newcham(mtmp, &mons[oldmon], FALSE, (canseemon(mtmp) && !silent))) { /* Wasn't able to unpolymorph */ if (canseemon(mtmp) && !silent) pline("%s shudders.", oldname); mondead(mtmp); return; } /* Check if current form is genocided */ if (mvitals[oldmon].mvflags & G_GENOD) { mtmp->mhp = 0; if (canseemon(mtmp) && !silent) pline("%s shudders.", oldname); /* Since only player can read scrolls of genocide... */ xkilled(mtmp, 3); return; } #if 0 if (canseemon(mtmp)) pline ("%s changes into %s!", oldname, an(mtmp->data->mname)); #endif return; } #ifdef FIREARMS /* Attach an explosion timeout to a given explosive device */ void attach_bomb_blow_timeout(bomb, fuse, yours) struct obj *bomb; int fuse; boolean yours; { long expiretime; if (bomb->cursed && !rn2(2)) return; /* doesn't arm if not armed */ /* Now if you play with other people's property... */ if (yours && (!carried(bomb) && costly_spot(bomb->ox, bomb->oy) && !bomb->no_charge || bomb->unpaid)) { verbalize("You play with it, you pay for it!"); bill_dummy_object(bomb); } expiretime = stop_timer(BOMB_BLOW, (genericptr_t) bomb); if (expiretime > 0L) fuse = fuse - (expiretime - monstermoves); bomb->yours = yours; bomb->oarmed = TRUE; (void) start_timer((long)fuse, TIMER_OBJECT, BOMB_BLOW, (genericptr_t)bomb); } /* timer callback routine: detonate the explosives */ void bomb_blow(arg, timeout) genericptr_t arg; long timeout; { struct obj *bomb; xchar x,y; boolean silent, underwater; struct monst *mtmp = (struct monst *)0; bomb = (struct obj *) arg; silent = (timeout != monstermoves); /* exploded while away */ if (get_obj_location(bomb, &x, &y, BURIED_TOO | CONTAINED_TOO)) { switch(bomb->where) { case OBJ_MINVENT: mtmp = bomb->ocarry; if (bomb == MON_WEP(mtmp)) { bomb->owornmask &= ~W_WEP; MON_NOWEP(mtmp); } if (!silent) { if (canseemon(mtmp)) You("see %s engulfed in an explosion!", mon_nam(mtmp)); } mtmp->mhp -= d(2,5); if(mtmp->mhp < 1) { if(!bomb->yours) monkilled(mtmp, (silent ? "" : "explosion"), AD_PHYS); else xkilled(mtmp, !silent); } break; case OBJ_INVENT: /* This shouldn't be silent! */ pline("Something explodes inside your knapsack!"); if (bomb == uwep) { uwepgone(); stop_occupation(); } else if (bomb == uswapwep) { uswapwepgone(); stop_occupation(); } else if (bomb == uquiver) { uqwepgone(); stop_occupation(); } losehp(d(2,5), "carrying live explosives", KILLED_BY); break; case OBJ_FLOOR: underwater = is_pool(x, y); if (!silent) { if (x == u.ux && y == u.uy) { if (underwater && (Flying || Levitation)) pline_The("water boils beneath you."); else if (underwater && Wwalking) pline_The("water erupts around you."); else pline("A bomb explodes under your %s!", makeplural(body_part(FOOT))); } else if (cansee(x, y)) You(underwater ? "see a plume of water shoot up." : "see a bomb explode."); } if (underwater && (Flying || Levitation || Wwalking)) { if (Wwalking && x == u.ux && y == u.uy) { struct trap trap; trap.ntrap = NULL; trap.tx = x; trap.ty = y; trap.launch.x = -1; trap.launch.y = -1; trap.ttyp = RUST_TRAP; trap.tseen = 0; trap.once = 0; trap.madeby_u = 0; trap.dst.dnum = -1; trap.dst.dlevel = -1; dotrap(&trap, 0); } goto free_bomb; } break; default: /* Buried, contained, etc. */ if (!silent) You_hear("a muffled explosion."); goto free_bomb; break; } grenade_explode(bomb, x, y, bomb->yours, silent ? 2 : 0); return; } /* Migrating grenades "blow up in midair" */ free_bomb: obj_extract_self(bomb); obfree(bomb, (struct obj *)0); } #endif /* Attach an egg hatch timeout to the given egg. */ void attach_egg_hatch_timeout(egg) struct obj *egg; { int i; /* stop previous timer, if any */ (void) stop_timer(HATCH_EGG, (genericptr_t) egg); /* * Decide if and when to hatch the egg. The old hatch_it() code tried * once a turn from age 151 to 200 (inclusive), hatching if it rolled * a number x, 1<=x<=age, where x>150. This yields a chance of * hatching > 99.9993%. Mimic that here. */ for (i = (MAX_EGG_HATCH_TIME-50)+1; i <= MAX_EGG_HATCH_TIME; i++) if (rnd(i) > 150) { /* egg will hatch */ (void) start_timer((long)i, TIMER_OBJECT, HATCH_EGG, (genericptr_t)egg); break; } } /* prevent an egg from ever hatching */ void kill_egg(egg) struct obj *egg; { /* stop previous timer, if any */ (void) stop_timer(HATCH_EGG, (genericptr_t) egg); } /* timer callback routine: hatch the given egg */ void hatch_egg(arg, timeout) genericptr_t arg; long timeout; { struct obj *egg; struct monst *mon, *mon2; coord cc; xchar x, y; boolean yours, silent, knows_egg = FALSE; boolean cansee_hatchspot = FALSE; int i, mnum, hatchcount = 0; egg = (struct obj *) arg; /* sterilized while waiting */ if (egg->corpsenm == NON_PM) return; mon = mon2 = (struct monst *)0; mnum = big_to_little(egg->corpsenm); /* The identity of one's father is learned, not innate */ yours = (egg->spe || (!flags.female && carried(egg) && !rn2(2))); silent = (timeout != monstermoves); /* hatched while away */ /* only can hatch when in INVENT, FLOOR, MINVENT */ if (get_obj_location(egg, &x, &y, 0)) { hatchcount = rnd((int)egg->quan); cansee_hatchspot = cansee(x, y) && !silent; if (!(mons[mnum].geno & G_UNIQ) && !(mvitals[mnum].mvflags & (G_GENOD | G_EXTINCT))) { for (i = hatchcount; i > 0; i--) { if (!enexto(&cc, x, y, &mons[mnum]) || !(mon = makemon(&mons[mnum], cc.x, cc.y, NO_MINVENT))) break; /* tame if your own egg hatches while you're on the same dungeon level, or any dragon egg which hatches while it's in your inventory */ if ((yours && !silent) || (carried(egg) && mon->data->mlet == S_DRAGON)) { if ((mon2 = tamedog(mon, (struct obj *)0)) != 0) { mon = mon2; if (carried(egg) && mon->data->mlet != S_DRAGON) mon->mtame = 20; } } if (mvitals[mnum].mvflags & G_EXTINCT) break; /* just made last one */ mon2 = mon; /* in case makemon() fails on 2nd egg */ } if (!mon) mon = mon2; hatchcount -= i; egg->quan -= (long)hatchcount; } } #if 0 /* * We could possibly hatch while migrating, but the code isn't * set up for it... */ else if (obj->where == OBJ_MIGRATING) { /* We can do several things. The first ones that come to mind are: + Create the hatched monster then place it on the migrating mons list. This is tough because all makemon() is made to place the monster as well. Makemon() also doesn't lend itself well to splitting off a "not yet placed" subroutine. + Mark the egg as hatched, then place the monster when we place the migrating objects. + Or just kill any egg which gets sent to another level. Falling is the usual reason such transportation occurs. */ cansee_hatchspot = FALSE; mon = ??? } #endif if (mon) { char monnambuf[BUFSZ], carriedby[BUFSZ]; boolean siblings = (hatchcount > 1), redraw = FALSE; 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, as well as being able to see the resulting monster, checked below */ } switch (egg->where) { case OBJ_INVENT: knows_egg = TRUE; /* true even if you are blind */ if (!cansee_hatchspot) You_feel("%s %s from your pack!", something, locomotion(mon->data, "drop")); else You("see %s %s out of your pack!", monnambuf, locomotion(mon->data, "drop")); if (yours) { pline("%s cries sound like \"%s%s\"", siblings ? "Their" : "Its", flags.female ? "mommy" : "daddy", egg->spe ? "." : "?"); } else if (mon->data->mlet == S_DRAGON) { verbalize("Gleep!"); /* Mything eggs :-) */ } break; case OBJ_FLOOR: if (cansee_hatchspot) { knows_egg = TRUE; You("see %s hatch.", monnambuf); redraw = TRUE; /* update egg's map location */ } break; case OBJ_MINVENT: if (cansee_hatchspot) { /* egg carring monster might be invisible */ if (canseemon(egg->ocarry)) { Sprintf(carriedby, "%s pack", s_suffix(a_monnam(egg->ocarry))); knows_egg = TRUE; } else if (is_pool(mon->mx, mon->my)) Strcpy(carriedby, "empty water"); else Strcpy(carriedby, "thin air"); You("see %s %s out of %s!", monnambuf, locomotion(mon->data, "drop"), carriedby); } break; #if 0 case OBJ_MIGRATING: break; #endif default: impossible("egg hatched where? (%d)", (int)egg->where); break; } if (cansee_hatchspot && knows_egg) learn_egg_type(mnum); if (egg->quan > 0) { /* still some eggs left */ attach_egg_hatch_timeout(egg); if (egg->timed) { /* replace ordinary egg timeout with a short one */ (void) stop_timer(HATCH_EGG, (genericptr_t)egg); (void) start_timer((long)rnd(12), TIMER_OBJECT, HATCH_EGG, (genericptr_t)egg); } } else if (carried(egg)) { useup(egg); } else { /* free egg here because we use it above */ obj_extract_self(egg); obfree(egg, (struct obj *)0); } if (redraw) newsym(x, y); } } /* Learn to recognize eggs of the given type. */ void learn_egg_type(mnum) int mnum; { /* baby monsters hatch from grown-up eggs */ mnum = little_to_big(mnum); mvitals[mnum].mvflags |= MV_KNOWS_EGG; /* we might have just learned about other eggs being carried */ update_inventory(); } /* Attach a fig_transform timeout to the given figurine. */ void attach_fig_transform_timeout(figurine) struct obj *figurine; { int i; /* stop previous timer, if any */ (void) stop_timer(FIG_TRANSFORM, (genericptr_t) figurine); /* * Decide when to transform the figurine. */ i = rnd(9000) + 200; /* figurine will transform */ (void) start_timer((long)i, TIMER_OBJECT, FIG_TRANSFORM, (genericptr_t)figurine); } /* give a fumble message */ STATIC_OVL void slip_or_trip() { 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 && !u.uinwater && is_pool(u.ux, u.uy)) otmp = 0; 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, if the top item has been or can be seen, refer to it by name; if not, look for rocks to trip over; trip over anonymous "something" if there aren't any rocks. */ pronoun = otmp->quan == 1L ? "it" : Hallucination ? "they" : "them"; what = !otmp->nexthere ? pronoun : (otmp->dknown || !Blind) ? doname(otmp) : ((otmp = sobj_at(ROCK, u.ux, u.uy)) == 0 ? something : (otmp->quan == 1L ? "a rock" : "some rocks")); if (Hallucination) { what = strcpy(buf, what); buf[0] = highc(buf[0]); pline("Egads! %s bite%s your %s!", what, (!otmp || otmp->quan == 1L) ? "s" : "", body_part(FOOT)); } else { 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. */ STATIC_OVL void see_lamp_flicker(obj, tailer) struct obj *obj; const char *tailer; { switch (obj->where) { case OBJ_INVENT: case OBJ_MINVENT: pline("%s flickers%s.", Yname2(obj), tailer); break; case OBJ_FLOOR: You("see %s flicker%s.", an(xname(obj)), tailer); break; } } /* Print a dimming message for brass lanterns. */ STATIC_OVL void lantern_message(obj) struct obj *obj; { /* from adventure */ switch (obj->where) { case OBJ_INVENT: Your("lantern is getting dim."); if (Hallucination) pline("Batteries have not been invented yet."); break; case OBJ_FLOOR: You("see a lantern getting dim."); break; case OBJ_MINVENT: pline("%s lantern is getting dim.", s_suffix(Monnam(obj->ocarry))); break; } } /* * Timeout callback for for objects that are burning. E.g. lamps, candles. * See begin_burn() for meanings of obj->age and obj->spe. */ void burn_object(arg, timeout) genericptr_t arg; long timeout; { struct obj *obj = (struct obj *) arg; boolean canseeit, many, menorah, need_newsym; xchar x, y; char whose[BUFSZ]; menorah = obj->otyp == CANDELABRUM_OF_INVOCATION; many = menorah ? obj->spe > 1 : obj->quan > 1L; /* timeout while away */ if (timeout != monstermoves) { long how_long = monstermoves - timeout; if (how_long >= obj->age) { obj->age = 0; end_burn(obj, FALSE); if (menorah) { obj->spe = 0; /* no more candles */ } else if (Is_candle(obj) || obj->otyp == POT_OIL) { /* get rid of candles and burning oil potions */ obj_extract_self(obj); obfree(obj, (struct obj *)0); obj = (struct obj *) 0; #ifdef FIREARMS } else if (obj->otyp == STICK_OF_DYNAMITE) { bomb_blow((genericptr_t) obj, timeout); return; #endif } } else { obj->age -= how_long; begin_burn(obj, TRUE); } return; } /* only interested in INVENT, FLOOR, and MINVENT */ if (get_obj_location(obj, &x, &y, 0)) { canseeit = !Blind && cansee(x, y); /* set up `whose[]' to be "Your" or "Fred's" or "The goblin's" */ (void) Shk_Your(whose, obj); } else { canseeit = FALSE; } need_newsym = FALSE; /* obj->age is the age remaining at this point. */ switch (obj->otyp) { case POT_OIL: /* this should only be called when we run out */ if (canseeit) { switch (obj->where) { case OBJ_INVENT: case OBJ_MINVENT: pline("%s potion of oil has burnt away.", whose); break; case OBJ_FLOOR: You("see a burning potion of oil go out."); need_newsym = TRUE; break; } } end_burn(obj, FALSE); /* turn off light source */ obj_extract_self(obj); obfree(obj, (struct obj *)0); obj = (struct obj *) 0; break; case TORCH: case BRASS_LANTERN: case OIL_LAMP: switch((int)obj->age) { case 150: case 100: case 50: if (canseeit) { if (obj->otyp == BRASS_LANTERN) lantern_message(obj); else see_lamp_flicker(obj, obj->age == 50L ? " considerably" : ""); } break; case 25: if (canseeit) { if (obj->otyp == BRASS_LANTERN) lantern_message(obj); else { switch (obj->where) { case OBJ_INVENT: case OBJ_MINVENT: pline("%s %s seems about to go out.", whose, xname(obj)); break; case OBJ_FLOOR: You("see %s about to go out.", an(xname(obj))); break; } } } break; case 0: /* even if blind you'll know if holding it */ if (canseeit || obj->where == OBJ_INVENT) { switch (obj->where) { case OBJ_INVENT: case OBJ_MINVENT: if (obj->otyp == BRASS_LANTERN) pline("%s lantern has run out of power.", whose); else pline("%s %s has gone out.", whose, xname(obj)); break; case OBJ_FLOOR: if (obj->otyp == BRASS_LANTERN) You("see a lantern run out of power."); else You("see %s go out.", an(xname(obj))); break; } } /* MRKR: Burnt out torches are considered worthless */ if (obj->otyp == TORCH) { if (obj->unpaid && costly_spot(u.ux, u.uy)) { const char *ithem = obj->quan > 1L ? "them" : "it"; verbalize("You burn %s, you bought %s!", ithem, ithem); bill_dummy_object(obj); } } end_burn(obj, FALSE); break; default: /* * Someone added fuel to the lamp while it was * lit. Just fall through and let begin burn * handle the new age. */ break; } if (obj->age) begin_burn(obj, TRUE); break; case CANDELABRUM_OF_INVOCATION: case TALLOW_CANDLE: case WAX_CANDLE: switch (obj->age) { case 75: if (canseeit) switch (obj->where) { case OBJ_INVENT: case OBJ_MINVENT: pline("%s %scandle%s getting short.", whose, menorah ? "candelabrum's " : "", many ? "s are" : " is"); break; case OBJ_FLOOR: You("see %scandle%s getting short.", menorah ? "a candelabrum's " : many ? "some " : "a ", many ? "s" : ""); break; } break; case 15: if (canseeit) switch (obj->where) { case OBJ_INVENT: case OBJ_MINVENT: pline( "%s %scandle%s flame%s flicker%s low!", whose, menorah ? "candelabrum's " : "", many ? "s'" : "'s", many ? "s" : "", many ? "" : "s"); break; case OBJ_FLOOR: You("see %scandle%s flame%s flicker low!", menorah ? "a candelabrum's " : many ? "some " : "a ", many ? "s'" : "'s", many ? "s" : ""); break; } break; case 0: /* we know even if blind and in our inventory */ if (canseeit || obj->where == OBJ_INVENT) { if (menorah) { switch (obj->where) { case OBJ_INVENT: case OBJ_MINVENT: pline("%s candelabrum's flame%s.", whose, many ? "s die" : " dies"); break; case OBJ_FLOOR: You("see a candelabrum's flame%s die.", many ? "s" : ""); break; } } else { switch (obj->where) { case OBJ_INVENT: case OBJ_MINVENT: pline("%s %s %s consumed!", whose, xname(obj), many ? "are" : "is"); break; case OBJ_FLOOR: /* You see some wax candles consumed! You see a wax candle consumed! */ You("see %s%s consumed!", many ? "some " : "", many ? xname(obj):an(xname(obj))); need_newsym = TRUE; break; } /* post message */ pline(Hallucination ? (many ? "They shriek!" : "It shrieks!") : Blind ? "" : (many ? "Their flames die." : "Its flame dies.")); } } end_burn(obj, FALSE); if (menorah) { obj->spe = 0; } else { obj_extract_self(obj); obfree(obj, (struct obj *)0); obj = (struct obj *) 0; } break; default: /* * Someone added fuel (candles) to the menorah while * it was lit. Just fall through and let begin burn * handle the new age. */ break; } if (obj && obj->age) begin_burn(obj, TRUE); break; #ifdef LIGHTSABERS case RED_DOUBLE_LIGHTSABER: if (obj->altmode && obj->cursed && !rn2(25)) { obj->altmode = FALSE; pline("%s %s reverts to single blade mode!", whose, xname(obj)); } case GREEN_LIGHTSABER: #ifdef D_SABER case BLUE_LIGHTSABER: #endif case RED_LIGHTSABER: /* Callback is checked every 5 turns - lightsaber automatically deactivates if not wielded */ if ((obj->cursed && !rn2(50)) || (obj->where == OBJ_FLOOR) || (obj->where == OBJ_MINVENT && (!MON_WEP(obj->ocarry) || MON_WEP(obj->ocarry) != obj)) || (obj->where == OBJ_INVENT && ((!uwep || uwep != obj) && (!u.twoweap || !uswapwep || obj != uswapwep)))) lightsaber_deactivate(obj, FALSE); switch (obj->age) { case 100: /* Single warning time */ if (canseeit) { switch (obj->where) { case OBJ_INVENT: case OBJ_MINVENT: pline("%s %s dims!",whose, xname(obj)); break; case OBJ_FLOOR: You("see %s dim!", an(xname(obj))); break; } } else { You("hear the hum of %s change!", an(xname(obj))); } break; case 0: lightsaber_deactivate(obj, FALSE); break; default: /* * Someone added fuel to the lightsaber while it was * lit. Just fall through and let begin burn * handle the new age. */ break; } if (obj && obj->age && obj->lamplit) /* might be deactivated */ begin_burn(obj, TRUE); break; #endif #ifdef FIREARMS case STICK_OF_DYNAMITE: end_burn(obj, FALSE); bomb_blow((genericptr_t) obj, timeout); return; #endif default: impossible("burn_object: unexpeced obj %s", xname(obj)); break; } if (need_newsym) newsym(x, y); } #ifdef LIGHTSABERS /* lightsabers deactivate when they hit the ground/not wielded */ /* assumes caller checks for correct conditions */ void lightsaber_deactivate (obj, timer_attached) struct obj *obj; boolean timer_attached; { xchar x,y; char whose[BUFSZ]; (void) Shk_Your(whose, obj); if (get_obj_location(obj, &x, &y, 0)) { if (cansee(x, y)) { switch (obj->where) { case OBJ_INVENT: case OBJ_MINVENT: pline("%s %s deactivates.",whose, xname(obj)); break; case OBJ_FLOOR: You("see %s deactivate.", an(xname(obj))); break; } } else { You("hear a lightsaber deactivate."); } } if (obj->otyp == RED_DOUBLE_LIGHTSABER) obj->altmode = FALSE; if ((obj == uwep) || (u.twoweap && obj != uswapwep)) unweapon = TRUE; end_burn(obj, timer_attached); } #endif /* * Start a burn timeout on the given object. If not "already lit" then * create a light source for the vision system. There had better not * be a burn already running on the object. * * Magic lamps stay lit as long as there's a genie inside, so don't start * a timer. * * Burn rules: * torches * age = # of turns of fuel left * spe = * * potions of oil, lamps & candles: * age = # of turns of fuel left * spe = * * magic lamps: * age = * spe = 0 not lightable, 1 lightable forever * * candelabrum: * age = # of turns of fuel left * spe = # of candles * * Once the burn begins, the age will be set to the amount of fuel * remaining _once_the_burn_finishes_. If the burn is terminated * early then fuel is added back. * * This use of age differs from the use of age for corpses and eggs. * For the latter items, age is when the object was created, so we * know when it becomes "bad". * * This is a "silent" routine - it should not print anything out. */ void begin_burn(obj, already_lit) struct obj *obj; boolean already_lit; { int radius = 3; long turns = 0; boolean do_timer = TRUE; if (obj->age == 0 && obj->otyp != MAGIC_LAMP && obj->otyp != MAGIC_CANDLE && !artifact_light(obj)) return; switch (obj->otyp) { case MAGIC_LAMP: case MAGIC_CANDLE: obj->lamplit = 1; do_timer = FALSE; if (obj->otyp == MAGIC_CANDLE) obj->age = 300L; break; #ifdef LIGHTSABERS case RED_DOUBLE_LIGHTSABER: if (obj->altmode && obj->age > 1) obj->age--; /* Double power usage */ case RED_LIGHTSABER: #ifdef D_SABER case BLUE_LIGHTSABER: #endif case GREEN_LIGHTSABER: turns = 1; radius = 1; break; #endif case POT_OIL: turns = obj->age; radius = 1; /* very dim light */ break; #ifdef FIREARMS case STICK_OF_DYNAMITE: turns = obj->age; radius = 1; /* very dim light */ break; #endif case BRASS_LANTERN: case OIL_LAMP: case TORCH: /* magic times are 150, 100, 50, 25, and 0 */ if (obj->age > 150L) turns = obj->age - 150L; else if (obj->age > 100L) turns = obj->age - 100L; else if (obj->age > 50L) turns = obj->age - 50L; else if (obj->age > 25L) turns = obj->age - 25L; else turns = obj->age; break; case CANDELABRUM_OF_INVOCATION: case TALLOW_CANDLE: case WAX_CANDLE: /* magic times are 75, 15, and 0 */ if (obj->age > 75L) turns = obj->age - 75L; else if (obj->age > 15L) turns = obj->age - 15L; else turns = obj->age; radius = candle_light_range(obj); break; default: /* [ALI] Support artifact light sources */ if (obj->oartifact && artifact_light(obj)) { obj->lamplit = 1; do_timer = FALSE; radius = 2; } else { impossible("begin burn: unexpected %s", xname(obj)); turns = obj->age; } break; } if (do_timer) { if (start_timer(turns, TIMER_OBJECT, 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) { xchar x, y; if (get_obj_location(obj, &x, &y, CONTAINED_TOO|BURIED_TOO)) new_light_source(x, y, radius, LS_OBJECT, (genericptr_t) obj); else impossible("begin_burn: can't get obj position"); } } /* * Stop a burn timeout on the given object if timer attached. Darken * light source. */ void end_burn(obj, timer_attached) struct obj *obj; boolean timer_attached; { if (!obj->lamplit) { impossible("end_burn: obj %s not lit", xname(obj)); return; } if (obj->otyp == MAGIC_LAMP || obj->otyp == MAGIC_CANDLE || 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 /* * MRKR: Use up some fuel quickly, eg: when hitting a monster with * a torch. */ void burn_faster(obj, adj) struct obj *obj; long adj; { if (!obj->lamplit) { impossible("burn_faster: obj %s not lit", xname(obj)); return; } accelerate_timer(BURN_OBJECT, obj, adj); } void do_storms() { int nstrike; register int x, y; int dirx, diry; int count; /* no lightning if not the air level or too often, even then */ if(!Is_airlevel(&u.uz) || rn2(8)) return; /* the number of strikes is 8-log2(nstrike) */ for(nstrike = rnd(64); nstrike <= 64; nstrike *= 2) { count = 0; do { x = rnd(COLNO-1); y = rn2(ROWNO); } while (++count < 100 && levl[x][y].typ != CLOUD); if(count < 100) { dirx = rn2(3) - 1; diry = rn2(3) - 1; if(dirx != 0 || diry != 0) buzz(-15, /* "monster" LIGHTNING spell */ 8, x, y, dirx, diry); } } if(levl[u.ux][u.uy].typ == CLOUD) { /* inside a cloud during a thunder storm is deafening */ pline("Kaboom!!! Boom!! Boom!!"); if(!u.uinvulnerable) { stop_occupation(); nomul(-3); nomovemsg = 0; } } else You_hear("a rumbling noise."); } #endif /* OVL1 */ #ifdef OVL0 /* ------------------------------------------------------------------------- */ /* * Generic Timeout Functions. * * Interface: * * General: * boolean start_timer(long timeout,short kind,short func_index, * genericptr_t arg) * Start a timer of kind 'kind' that will expire at time * monstermoves+'timeout'. Call the function at 'func_index' * in the timeout table using argument 'arg'. Return TRUE if * a timer was started. This places the timer on a list ordered * "sooner" to "later". If an object, increment the object's * timer count. * * long stop_timer(short func_index, genericptr_t arg) * Stop a timer specified by the (func_index, arg) pair. This * assumes that such a pair is unique. Return the time the * timer would have gone off. If no timer is found, return 0. * If an object, decrement the object's timer count. * * void run_timers(void) * Call timers that have timed out. * * * Save/Restore: * void save_timers(int fd, int mode, int range) * Save all timers of range 'range'. Range is either global * or local. Global timers follow game play, local timers * are saved with a level. Object and monster timers are * saved using their respective id's instead of pointers. * * void restore_timers(int fd, int range, boolean ghostly, long adjust) * Restore timers of range 'range'. If from a ghost pile, * adjust the timeout by 'adjust'. The object and monster * ids are not restored until later. * * void relink_timers(boolean ghostly) * Relink all object and monster timers that had been saved * using their object's or monster's id number. * * Object Specific: * void obj_move_timers(struct obj *src, struct obj *dest) * Reassign all timers from src to dest. * * void obj_split_timers(struct obj *src, struct obj *dest) * Duplicate all timers assigned to src and attach them to dest. * * void obj_stop_timers(struct obj *obj) * Stop all timers attached to obj. * * Monster Specific: * void mon_stop_timers(struct monst *mon) * Stop all timers attached to mon. */ #ifdef WIZARD STATIC_DCL const char *FDECL(kind_name, (SHORT_P)); STATIC_DCL void FDECL(print_queue, (winid, timer_element *)); #endif 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)); static void FDECL(write_timer, (int, timer_element *)); /* Damn typedef write_timer is in the middle */ /* ordered timer list */ static timer_element *timer_base; /* "active" */ static unsigned long timer_id = 1; /* If defined, then include names when printing out the timer queue */ #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 const ttable timeout_funcs[NUM_TIME_FUNCS] = { TTAB(rot_organic, (timeout_proc)0, "rot_organic"), TTAB(rot_corpse, (timeout_proc)0, "rot_corpse"), TTAB(moldy_corpse, (timeout_proc)0, "moldy_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"), TTAB(unpoly_mon, (timeout_proc)0, "unpoly_mon"), #ifdef FIREARMS TTAB(bomb_blow, (timeout_proc)0, "bomb_blow"), #endif #ifdef UNPOLYPILE TTAB(unpoly_obj, cleanup_unpoly, "unpoly_obj"), #endif }; #undef TTAB #if defined(WIZARD) STATIC_OVL const char * kind_name(kind) short kind; { switch (kind) { case TIMER_LEVEL: return "level"; case TIMER_GLOBAL: return "global"; case TIMER_OBJECT: return "object"; case TIMER_MONSTER: return "monster"; } return "unknown"; } STATIC_OVL void print_queue(win, base) winid win; timer_element *base; { timer_element *curr; char buf[BUFSZ], arg_address[20]; if (!base) { putstr(win, 0, ""); } else { putstr(win, 0, "timeout id kind call"); for (curr = base; curr; curr = curr->next) { #ifdef VERBOSE_TIMER Sprintf(buf, " %4ld %4ld %-6s %s(%s)", curr->timeout, curr->tid, kind_name(curr->kind), timeout_funcs[curr->func_index].name, fmt_ptr((genericptr_t)curr->arg, arg_address)); #else Sprintf(buf, " %4ld %4ld %-6s #%d(%s)", curr->timeout, curr->tid, kind_name(curr->kind), curr->func_index, fmt_ptr((genericptr_t)curr->arg, arg_address)); #endif putstr(win, 0, buf); } } } int wiz_timeout_queue() { winid win; char buf[BUFSZ]; win = create_nhwindow(NHW_MENU); /* corner text window */ if (win == WIN_ERR) return 0; Sprintf(buf, "Current time = %ld.", monstermoves); putstr(win, 0, buf); putstr(win, 0, ""); putstr(win, 0, "Active timeout queue:"); putstr(win, 0, ""); print_queue(win, timer_base); display_nhwindow(win, FALSE); destroy_nhwindow(win); return 0; } void timer_sanity_check() { timer_element *curr; char obj_address[20]; /* this should be much more complete */ for (curr = timer_base; curr; curr = curr->next) if (curr->kind == TIMER_OBJECT) { struct obj *obj = (struct obj *) curr->arg; if (obj->timed == 0) { pline("timer sanity: untimed obj %s, timer %ld", fmt_ptr((genericptr_t)obj, obj_address), curr->tid); } } } #endif /* WIZARD */ /* * Pick off timeout elements from the global queue and call their functions. * Do this until their time is less than or equal to the move count. */ void run_timers() { timer_element *curr; /* * Always use the first element. Elements may be added or deleted at * any time. The list is ordered, we are done when the first element * is in the future. */ while (timer_base && timer_base->timeout <= monstermoves) { curr = timer_base; timer_base = curr->next; if (curr->kind == TIMER_OBJECT) ((struct obj *)(curr->arg))->timed--; (*timeout_funcs[curr->func_index].f)(curr->arg, curr->timeout); free((genericptr_t) curr); } } /* * Start a timer. Return TRUE if successful. */ boolean start_timer(when, kind, func_index, arg) long when; short kind; short func_index; genericptr_t arg; { timer_element *gnu; if (func_index < 0 || func_index >= NUM_TIME_FUNCS) panic("start_timer"); gnu = (timer_element *) alloc(sizeof(timer_element)); gnu->next = 0; gnu->tid = timer_id++; gnu->timeout = monstermoves + when; gnu->kind = kind; gnu->needs_fixup = 0; gnu->func_index = func_index; gnu->arg = arg; insert_timer(gnu); if (kind == TIMER_OBJECT) /* increment object's timed count */ ((struct obj *)arg)->timed++; /* should check for duplicates and fail if any */ return TRUE; } /* * Remove the timer from the current list and free it up. Return the time * it would have gone off, 0 if not found. */ long stop_timer(func_index, arg) short func_index; genericptr_t arg; { timer_element *doomed; long timeout; doomed = remove_timer(&timer_base, func_index, arg); if (doomed) { 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; } return 0; } /* * Move all object timers from src to dest, leaving src untimed. */ void obj_move_timers(src, dest) struct obj *src, *dest; { int count; timer_element *curr; for (count = 0, curr = timer_base; curr; curr = curr->next) if (curr->kind == TIMER_OBJECT && curr->arg == (genericptr_t)src) { curr->arg = (genericptr_t) dest; dest->timed++; count++; } if (count != src->timed) panic("obj_move_timers"); src->timed = 0; } /* * Find all object timers and duplicate them for the new object "dest". */ void obj_split_timers(src, dest) struct obj *src, *dest; { timer_element *curr, *next_timer=0; for (curr = timer_base; curr; curr = next_timer) { next_timer = curr->next; /* things may be inserted */ if (curr->kind == TIMER_OBJECT && curr->arg == (genericptr_t)src) { (void) start_timer(curr->timeout-monstermoves, TIMER_OBJECT, curr->func_index, (genericptr_t)dest); } } } /* * Stop all timers attached to this object. We can get away with this because * all object pointers are unique. */ void obj_stop_timers(obj) struct obj *obj; { timer_element *curr, *prev, *next_timer=0; for (prev = 0, curr = timer_base; curr; curr = next_timer) { next_timer = curr->next; if (curr->kind == TIMER_OBJECT && curr->arg == (genericptr_t)obj) { if (prev) 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; } } obj->timed = 0; } /* * Stop all timers attached to this monster. We can get away with this because * all monster pointers are unique. */ void mon_stop_timers(mon) struct monst *mon; { timer_element *curr, *prev, *next_timer=0; for (prev = 0, curr = timer_base; curr; curr = next_timer) { next_timer = curr->next; if (curr->kind == TIMER_MONSTER && curr->arg == (genericptr_t)mon) { if (prev) 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; } } } /* Insert timer into the global queue */ STATIC_OVL void insert_timer(gnu) timer_element *gnu; { timer_element *curr, *prev; for (prev = 0, curr = timer_base; curr; prev = curr, curr = curr->next) if (curr->timeout >= gnu->timeout) break; gnu->next = curr; if (prev) prev->next = gnu; else timer_base = gnu; } STATIC_OVL timer_element * remove_timer(base, func_index, arg) timer_element **base; short func_index; genericptr_t arg; { timer_element *prev, *curr; for (prev = 0, curr = *base; curr; prev = curr, curr = curr->next) if (curr->func_index == func_index && curr->arg == arg) break; if (curr) { if (prev) prev->next = curr->next; else *base = curr->next; } return curr; } STATIC_OVL void write_timer(fd, timer) int fd; timer_element *timer; { genericptr_t arg_save; switch (timer->kind) { case TIMER_GLOBAL: case TIMER_LEVEL: /* assume no pointers in arg */ bwrite(fd, (genericptr_t) timer, sizeof(timer_element)); break; case TIMER_OBJECT: if (timer->needs_fixup) bwrite(fd, (genericptr_t)timer, sizeof(timer_element)); else { /* replace object pointer with id */ arg_save = timer->arg; timer->arg = (genericptr_t)((struct obj *)timer->arg)->o_id; timer->needs_fixup = 1; bwrite(fd, (genericptr_t)timer, sizeof(timer_element)); timer->arg = arg_save; timer->needs_fixup = 0; } break; case TIMER_MONSTER: if (timer->needs_fixup) bwrite(fd, (genericptr_t)timer, sizeof(timer_element)); else { /* replace monster pointer with id */ arg_save = timer->arg; timer->arg = (genericptr_t)((struct monst *)timer->arg)->m_id; timer->needs_fixup = 1; bwrite(fd, (genericptr_t)timer, sizeof(timer_element)); timer->arg = arg_save; timer->needs_fixup = 0; } break; default: panic("write_timer"); break; } } /* * MRKR: Run one particular timer faster for a number of steps * Needed for burn_faster above. */ STATIC_OVL void accelerate_timer(func_index, arg, adj) short func_index; genericptr_t arg; long adj; { timer_element *timer; /* This will effect the ordering, so we remove it from the list */ /* and add it back in afterwards (if warranted) */ timer = remove_timer(&timer_base, func_index, arg); for (; adj > 0; adj--) { timer->timeout--; if (timer->timeout <= monstermoves) { if (timer->kind == TIMER_OBJECT) ((struct obj *)arg)->timed--; (*timeout_funcs[func_index].f)(arg, timer->timeout); free((genericptr_t) timer); break; } } if (adj == 0) insert_timer(timer); } /* * Return TRUE if the object will stay on the level when the level is * saved. */ boolean obj_is_local(obj) struct obj *obj; { switch (obj->where) { case OBJ_INVENT: case OBJ_MIGRATING: return FALSE; case OBJ_FLOOR: case OBJ_BURIED: return TRUE; case OBJ_CONTAINED: return obj_is_local(obj->ocontainer); case OBJ_MINVENT: return mon_is_local(obj->ocarry); } panic("obj_is_local"); return FALSE; } /* * Return TRUE if the given monster will stay on the level when the * level is saved. */ STATIC_OVL boolean mon_is_local(mon) struct monst *mon; { struct monst *curr; for (curr = migrating_mons; curr; curr = curr->nmon) if (curr == mon) return FALSE; /* `mydogs' is used during level changes, never saved and restored */ for (curr = mydogs; curr; curr = curr->nmon) if (curr == mon) return FALSE; return TRUE; } /* * Return TRUE if the timer is attached to something that will stay on the * level when the level is saved. */ STATIC_OVL boolean timer_is_local(timer) timer_element *timer; { switch (timer->kind) { case TIMER_LEVEL: return TRUE; case TIMER_GLOBAL: return FALSE; case TIMER_OBJECT: return obj_is_local((struct obj *)timer->arg); case TIMER_MONSTER: return mon_is_local((struct monst *)timer->arg); } panic("timer_is_local"); return FALSE; } /* * Part of the save routine. Count up the number of timers that would * be written. If write_it is true, actually write the timer. */ STATIC_OVL int maybe_write_timer(fd, range, write_it) int fd, range; boolean write_it; { int count = 0; timer_element *curr; for (curr = timer_base; curr; curr = curr->next) { if (range == RANGE_GLOBAL) { /* global timers */ if (!timer_is_local(curr)) { count++; if (write_it) write_timer(fd, curr); } } else { /* local timers */ if (timer_is_local(curr)) { count++; if (write_it) write_timer(fd, curr); } } } return count; } /* * Save part of the timer list. The parameter 'range' specifies either * global or level timers to save. The timer ID is saved with the global * timers. * * Global range: * + timeouts that follow the hero (global) * + timeouts that follow obj & monst that are migrating * * Level range: * + timeouts that are level specific (e.g. storms) * + timeouts that stay with the level (obj & monst) */ void save_timers(fd, mode, range) int fd, mode, range; { timer_element *curr, *prev, *next_timer=0; int count; if (perform_bwrite(mode)) { if (range == RANGE_GLOBAL) bwrite(fd, (genericptr_t) &timer_id, sizeof(timer_id)); count = maybe_write_timer(fd, range, FALSE); bwrite(fd, (genericptr_t) &count, sizeof count); (void) maybe_write_timer(fd, range, TRUE); } if (release_data(mode)) { for (prev = 0, curr = timer_base; curr; curr = next_timer) { next_timer = curr->next; /* in case curr is removed */ if ( !(!!(range == RANGE_LEVEL) ^ !!timer_is_local(curr)) ) { if (prev) prev->next = curr->next; else timer_base = curr->next; free((genericptr_t) curr); /* prev stays the same */ } else { prev = curr; } } } } /* * Pull in the structures from disk, but don't recalculate the object and * monster pointers. */ void restore_timers(fd, range, ghostly, adjust) int fd, range; boolean ghostly; /* restoring from a ghost level */ long adjust; /* how much to adjust timeout */ { int count; timer_element *curr; if (range == RANGE_GLOBAL) mread(fd, (genericptr_t) &timer_id, sizeof timer_id); /* restore elements */ mread(fd, (genericptr_t) &count, sizeof count); while (count-- > 0) { curr = (timer_element *) alloc(sizeof(timer_element)); mread(fd, (genericptr_t) curr, sizeof(timer_element)); if (ghostly) curr->timeout += adjust; insert_timer(curr); } } /* reset all timers that are marked for reseting */ void relink_timers(ghostly) boolean ghostly; { timer_element *curr; unsigned nid; for (curr = timer_base; curr; curr = curr->next) { if (curr->needs_fixup) { if (curr->kind == TIMER_OBJECT) { if (ghostly) { if (!lookup_id_mapping((unsigned)curr->arg, &nid)) panic("relink_timers 1"); } else nid = (unsigned) curr->arg; curr->arg = (genericptr_t) find_oid(nid); if (!curr->arg) panic("cant find o_id %d", nid); curr->needs_fixup = 0; } else if (curr->kind == TIMER_MONSTER) { /* panic("relink_timers: no monster timer implemented");*/ /* WAC attempt to relink monster timers based on above * and light source code */ if (ghostly) { if (!lookup_id_mapping((unsigned)curr->arg, &nid)) panic("relink_timers 1b"); } else nid = (unsigned) curr->arg; curr->arg = (genericptr_t) find_mid(nid, FM_EVERYWHERE); if (!curr->arg) panic("cant find m_id %d", nid); curr->needs_fixup = 0; } else panic("relink_timers 2"); } } } #endif /* OVL0 */ /*timeout.c*/ slashem-0.0.7E7F3/src/options.c0000664000076400007640000036716010545462317014317 0ustar aliali/* SCCS Id: @(#)options.c 3.4 2003/11/14 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #ifdef OPTION_LISTS_ONLY /* (AMIGA) external program for opt lists */ #include "config.h" #include "objclass.h" #include "flag.h" NEARDATA struct flag flags; /* provide linkage */ NEARDATA struct instance_flags iflags; /* provide linkage */ #define static #else #include "hack.h" #include "tcap.h" #include #endif #if defined(GL_GRAPHICS) || defined(SDL_GRAPHICS) #include "winGL.h" /* Sdlgl_parse_options */ #endif #include "filename.h" #define WINTYPELEN 16 #ifdef DEFAULT_WC_TILED_MAP #define PREFER_TILED TRUE #else #define PREFER_TILED FALSE #endif /* * NOTE: If you add (or delete) an option, please update the short * 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, !PREFER_TILED, SET_IN_GAME}, /*WC*/ #ifdef MFLOPPY {"asksavedisk", &flags.asksavedisk, FALSE, SET_IN_GAME}, #else {"asksavedisk", (boolean *)0, FALSE, SET_IN_GAME}, #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 {"cmdassist", &iflags.cmdassist, TRUE, SET_IN_GAME}, # if defined(MICRO) || defined(WIN32) {"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 {"fullscreen", &iflags.wc2_fullscreen, FALSE, SET_IN_FILE}, {"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 #ifdef SHOW_WEIGHT {"invweight", &flags.invweight, FALSE, SET_IN_GAME}, #else {"invweight", (boolean *)0, FALSE, SET_IN_FILE}, #endif /*WAC the keep savefile option...*/ #ifdef KEEP_SAVE {"keep_savefile", &flags.keep_savefile, FALSE, SET_IN_FILE}, #else {"keep_savefile", (boolean *)0, FALSE, DISP_IN_GAME}, #endif {"large_font", &iflags.obsolete, FALSE, SET_IN_FILE}, /* OBSOLETE */ {"legacy", &flags.legacy, TRUE, DISP_IN_GAME}, {"lit_corridor", &flags.lit_corridor, FALSE, SET_IN_GAME}, {"lootabc", &iflags.lootabc, 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 MENU_COLOR # ifdef MICRO {"menucolors", &iflags.use_menu_color, TRUE, SET_IN_GAME}, # else {"menucolors", &iflags.use_menu_color, FALSE, SET_IN_GAME}, # endif #else {"menucolors", (boolean *)0, FALSE, SET_IN_GAME}, #endif {"menu_on_esc", &flags.menu_on_esc, TRUE, SET_IN_GAME}, #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 WIZARD {"mon_polycontrol", &iflags.mon_polycontrol, FALSE, SET_IN_GAME}, #else {"mon_polycontrol", (boolean *)0, FALSE, SET_IN_FILE}, #endif {"mouse_support", &iflags.wc_mouse_support, TRUE, DISP_IN_GAME}, /*WC*/ #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}, #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}, {"pickup_thrown", &flags.pickup_thrown, TRUE, 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}, {"radar", (boolean *)0, FALSE, SET_IN_FILE}, /* OBSOLETE */ #if defined(MICRO) && !defined(AMIGA) {"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}, #if defined(OBJ_SANITY) {"sanity_check", &iflags.sanity_check, TRUE, SET_IN_GAME}, #elif defined(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 {"showrace", &iflags.showrace, FALSE, SET_IN_GAME}, #ifdef SCORE_ON_BOTL {"showscore", &flags.showscore, FALSE, SET_IN_GAME}, #else {"showscore", (boolean *)0, FALSE, SET_IN_FILE}, #endif /* WAC made the [ xx pts] dmg display optional */ #ifdef SHOW_DMG {"showdmg", &flags.showdmg, FALSE, SET_IN_GAME}, #else {"showdmg", (boolean *)0, FALSE, SET_IN_FILE}, #endif #ifdef SHOW_WEIGHT {"showweight", &flags.showweight, FALSE, SET_IN_GAME}, #else {"showweight", (boolean *)0, FALSE, SET_IN_FILE}, #endif {"silent", &flags.silent, TRUE, SET_IN_GAME}, {"softkeyboard", &iflags.wc2_softkeyboard, FALSE, SET_IN_FILE}, {"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, PREFER_TILED, 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}, {"travel", &iflags.travelcmd, TRUE, SET_IN_GAME}, #ifdef WIN32CON {"use_inverse", &iflags.wc_inverse, TRUE, SET_IN_GAME}, /*WC*/ #else {"use_inverse", &iflags.wc_inverse, FALSE, SET_IN_GAME}, /*WC*/ #endif {"verbose", &flags.verbose, TRUE, SET_IN_GAME}, {"wraptext", &iflags.wc2_wraptext, FALSE, SET_IN_GAME}, {(char *)0, (boolean *)0, FALSE, 0} }; genericptr_t nh_option_get_boolopt() { return (genericptr_t)boolopt; } /* compound options, for option_help() and external programs like Amiga * frontend */ static struct Comp_Opt { const char *name, *descr; int size; /* for frontends and such allocating space -- * usually allowed size of data in game, but * occasionally maximum reasonable size for * typing when game maintains information in * a different format */ int optflags; } 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*/ { "altkeyhandler", "alternate key handler", 20, DISP_IN_GAME }, { "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 }, { "dungeon", "the symbols to use in drawing the dungeon map", 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 menu font", 20, DISP_IN_GAME }, /*WC*/ { "font_size_message", "the size of the message font", 20, DISP_IN_GAME }, /*WC*/ { "font_size_status", "the size of the status font", 20, DISP_IN_GAME }, /*WC*/ { "font_size_text", "the size of the text 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 }, { "ghoulname", "the name of your (first) ghoul (e.g., ghoulname:Casper)", PL_PSIZ, 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*/ { "menucolor", "set menu colors", PL_PSIZ, SET_IN_FILE }, { "menustyle", "user interface for object selection", MENUTYPELEN, SET_IN_GAME }, { "menu_deselect_all", "deselect all items in a menu", 4, SET_IN_FILE }, { "menu_deselect_page", "deselect all items on this page of a menu", 4, SET_IN_FILE }, { "menu_first_page", "jump to the first page in a menu", 4, SET_IN_FILE }, { "menu_headings", "bold, inverse, or underline headings", 9, SET_IN_GAME }, { "menu_invert_all", "invert all items in a menu", 4, SET_IN_FILE }, { "menu_invert_page", "invert all items on this page of a menu", 4, SET_IN_FILE }, { "menu_last_page", "jump to the last page in a menu", 4, SET_IN_FILE }, { "menu_next_page", "goto the next menu page", 4, SET_IN_FILE }, { "menu_previous_page", "goto the previous menu page", 4, SET_IN_FILE }, { "menu_search", "search for a menu item", 4, SET_IN_FILE }, { "menu_select_all", "select all items in a menu", 4, SET_IN_FILE }, { "menu_select_page", "select all items on this page of a menu", 4, SET_IN_FILE }, { "monsters", "the symbols to use for monsters", MAXMCLASSES, SET_IN_FILE }, { "msghistory", "number of top line messages to save", 5, DISP_IN_GAME }, # ifdef TTY_GRAPHICS {"msg_window", "the type of message window required",1, SET_IN_GAME}, # else {"msg_window", "the type of message window required", 1, SET_IN_FILE}, # endif { "name", "your character's name (e.g., name:Merlin-W)", PL_NSIZ, DISP_IN_GAME }, { "number_pad", "use the number pad", 1, SET_IN_GAME}, { "objects", "the symbols to use for objects", MAXOCLASSES, SET_IN_FILE }, { "packorder", "the inventory order of the items in your pack", MAXOCLASSES, SET_IN_GAME }, #ifdef CHANGE_COLOR { "palette", "palette (00c/880/-fff is blue/yellow/reverse white)", 15 , SET_IN_GAME }, # if defined(MAC) { "hicolor", "same as palette, only order is reversed", 15, SET_IN_FILE }, # endif #endif { "pettype", "your preferred initial pet type", 4, DISP_IN_GAME }, { "pickup_burden", "maximum burden picked up before prompt", 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 }, { "runmode", "display frequency when `running' or `travelling'", sizeof "teleport", SET_IN_GAME }, { "scores", "the parts of the score list you wish to see", 32, SET_IN_GAME }, { "scroll_amount", "amount to scroll map when scroll_margin is reached", 20, DISP_IN_GAME }, /*WC*/ { "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*/ { "tileset", "name of predefined tileset to use", PL_PSIZ, SET_IN_GAME }, { "traps", "the symbols to use in drawing traps", MAXTCHARS+1, SET_IN_FILE }, { "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 #ifdef VIDEOSHADES { "videocolors", "color mappings for internal screen routines", 40, DISP_IN_GAME }, #ifdef MSDOS { "videoshades", "gray shades to map to black/gray/white", 32, DISP_IN_GAME }, #endif #endif #ifdef WIN32CON {"subkeyvalue", "override keystroke value", 7, SET_IN_FILE}, #endif { "windowcolors", "the foreground/background colors of windows", /*WC*/ 80, DISP_IN_GAME }, { "windowtype", "windowing system to use", WINTYPELEN, DISP_IN_GAME }, { "wolfname", "the name of your (first) wolf (e.g., wolfname:Beast)", PL_PSIZ, DISP_IN_GAME }, { (char *)0, (char *)0, 0, 0 } }; static struct Bool_Tile_Opt { const char *name; unsigned long flag; unsigned long initvalue; } booltileopt[] = { {"transparent", TILESET_TRANSPARENT, 0}, {"pseudo3D", TILESET_PSEUDO3D, 0}, {(char *)0, 0, 0} }; #ifdef OPTION_LISTS_ONLY #undef static #else /* use rest of file */ static boolean need_redraw; /* for doset() */ #if defined(TOS) && defined(TEXTCOLOR) extern boolean colors_changed; /* in tos.c */ #endif #ifdef VIDEOSHADES extern char *shade[3]; /* in sys/msdos/video.c */ extern char ttycolors[CLR_MAX]; /* in sys/msdos/video.c, win/tty/termcap.c*/ #endif static char def_inv_order[MAXOCLASSES] = { COIN_CLASS, AMULET_CLASS, WEAPON_CLASS, ARMOR_CLASS, FOOD_CLASS, SCROLL_CLASS, SPBOOK_CLASS, POTION_CLASS, RING_CLASS, WAND_CLASS, TOOL_CLASS, GEM_CLASS, ROCK_CLASS, BALL_CLASS, CHAIN_CLASS, 0, }; /* * Default menu manipulation command accelerators. These may _not_ be: * * + a number - reserved for counts * + an upper or lower case US ASCII letter - used for accelerators * + ESC - reserved for escaping the menu * + NULL, CR or LF - reserved for commiting the selection(s). NULL * is kind of odd, but the tty's xwaitforspace() will return it if * someone hits a . * + a default object class symbol - used for object class accelerators * * Standard letters (for now) are: * * < back 1 page * > forward 1 page * ^ first page * | last page * : search * * page all * , select . * \ deselect - * ~ invert @ * * The command name list is duplicated in the compopt array. */ typedef struct { const char *name; char cmd; } menu_cmd_t; #define NUM_MENU_CMDS 11 static const menu_cmd_t default_menu_cmd_info[NUM_MENU_CMDS] = { /* 0*/ { "menu_first_page", MENU_FIRST_PAGE }, { "menu_last_page", MENU_LAST_PAGE }, { "menu_next_page", MENU_NEXT_PAGE }, { "menu_previous_page", MENU_PREVIOUS_PAGE }, { "menu_select_all", MENU_SELECT_ALL }, /* 5*/ { "menu_deselect_all", MENU_UNSELECT_ALL }, { "menu_invert_all", MENU_INVERT_ALL }, { "menu_select_page", MENU_SELECT_PAGE }, { "menu_deselect_page", MENU_UNSELECT_PAGE }, { "menu_invert_page", MENU_INVERT_PAGE }, /*10*/ { "menu_search", MENU_SEARCH }, }; /* * Allow the user to map incoming characters to various menu commands. * The accelerator list must be a valid C string. */ #define MAX_MENU_MAPPED_CMDS 32 /* some number */ char mapped_menu_cmds[MAX_MENU_MAPPED_CMDS+1]; /* exported */ static char mapped_menu_op[MAX_MENU_MAPPED_CMDS+1]; static short n_menu_mapped = 0; static boolean initial, from_file; 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 void FDECL(rejectoption, (const char *)); STATIC_DCL void FDECL(badoption, (const char *)); STATIC_OVL void FDECL(badtileoption, (const char *)); STATIC_DCL char *FDECL(string_for_opt, (char *,BOOLEAN_P)); STATIC_OVL char *FDECL(string_for_tile_opt, (char *, BOOLEAN_P)); STATIC_DCL char *FDECL(string_for_env_opt, (const char *, char *,BOOLEAN_P)); STATIC_DCL void FDECL(bad_negation, (const char *,BOOLEAN_P)); STATIC_DCL int FDECL(change_inv_order, (char *)); STATIC_DCL void FDECL(oc_to_str, (char *, char *)); STATIC_DCL void FDECL(graphics_opts, (char *,const char *,int,int)); STATIC_DCL int FDECL(feature_alert_opts, (char *, const char *)); 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 *)); STATIC_OVL boolean FDECL(is_wc2_option, (const char *)); STATIC_OVL boolean FDECL(wc2_supported, (const char *)); #ifdef AUTOPICKUP_EXCEPTIONS STATIC_DCL void FDECL(remove_autopickup_exception, (struct autopickup_exception *)); STATIC_OVL int FDECL(count_ape_maps, (int *, int *)); #endif /* check whether a user-supplied option string is a proper leading substring of a particular option name; option string might have a colon or equals sign and arbitrary value appended to it */ boolean match_optname(user_string, opt_name, min_length, val_allowed) const char *user_string, *opt_name; int min_length; boolean val_allowed; { int len = (int)strlen(user_string); if (val_allowed) { const char *p = index(user_string, ':'), *q = index(user_string, '='); if (!p || (q && q < p)) p = q; while(p && p > user_string && isspace(*(p-1))) p--; if (p) len = (int)(p - user_string); } return (len >= min_length) && !strncmpi(opt_name, user_string, len); } /* most environment variables will eventually be printed in an error * message if they don't work, and most error message paths go through * BUFSZ buffers, which could be overflowed by a maliciously long * environment variable. if a variable can legitimately be long, or * if it's put in a smaller buffer, the responsible code will have to * bounds-check itself. */ char * nh_getenv(ev) const char *ev; { char *getev = getenv(ev); if (getev && strlen(getev) <= (BUFSZ / 2)) return getev; else return (char *)0; } void initoptions() { #ifndef MAC char *opts; #endif int i; /* 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; } flags.end_own = FALSE; flags.end_top = 3; flags.end_around = 2; iflags.runmode = RUN_LEAP; iflags.msg_history = 20; #ifdef TTY_GRAPHICS iflags.prevmsg_window = 's'; #endif iflags.menu_headings = ATR_INVERSE; /* Use negative indices to indicate not yet selected */ flags.initrole = -1; flags.initrace = -1; flags.initgend = -1; flags.initalign = -1; /* Set the default monster and object class symbols. Don't use */ /* memcpy() --- sizeof char != sizeof uchar on some machines. */ for (i = 0; i < MAXOCLASSES; i++) oc_syms[i] = (uchar) def_oc_syms[i]; for (i = 0; i < MAXMCLASSES; i++) monsyms[i] = (uchar) def_monsyms[i]; for (i = 0; i < WARNCOUNT; i++) warnsyms[i] = def_warnsyms[i].sym; iflags.bouldersym = 0; iflags.travelcc.x = iflags.travelcc.y = -1; flags.warnlevel = 1; flags.warntype = 0L; /* assert( sizeof flags.inv_order == sizeof def_inv_order ); */ (void)memcpy((genericptr_t)flags.inv_order, (genericptr_t)def_inv_order, sizeof flags.inv_order); 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) /* * Set defaults for some options depending on what we can * detect about the environment's capabilities. * This has to be done after the global initialization above * and before reading user-specific initialization via * config file/environment variable below. */ /* this detects the IBM-compatible console on most 386 boxes */ if ((opts = nh_getenv("TERM")) && !strncmp(opts, "AT", 2)) { switch_graphics(IBM_GRAPHICS); # ifdef TEXTCOLOR iflags.use_color = TRUE; # endif } #endif /* UNIX && TTY_GRAPHICS */ #if defined(UNIX) || defined(VMS) # ifdef TTY_GRAPHICS /* detect whether a "vt" terminal can handle alternate charsets */ if ((opts = nh_getenv("TERM")) && !strncmpi(opts, "vt", 2) && AS && AE && index(AS, '\016') && index(AE, '\017')) { switch_graphics(DEC_GRAPHICS); } # endif #endif /* UNIX || VMS */ #ifdef MAC_GRAPHICS_ENV switch_graphics(MAC_GRAPHICS); #endif /* MAC_GRAPHICS_ENV */ flags.menu_style = MENU_FULL; /* since this is done before init_objects(), do partial init here */ objects[SLIME_MOLD].oc_name_idx = SLIME_MOLD; nmcpy(pl_fruit, OBJ_NAME(objects[SLIME_MOLD]), PL_FSIZ); #ifndef MAC opts = getenv(NETHACK_ENV_OPTIONS); if (!opts) opts = getenv("NETHACKOPTIONS"); if (!opts) opts = getenv("HACKOPTIONS"); if (opts) { if (*opts == '/' || *opts == '\\' || *opts == '@') { if (*opts == '@') opts++; /* @filename */ /* looks like a filename */ if (strlen(opts) < BUFSZ/2) read_config_file(opts); } else { read_config_file((char *)0); /* let the total length of options be long; * parseoptions() will check each individually */ parseoptions(opts, TRUE, FALSE); } } 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 */ /* as a named (or default) fruit. Wishing for "fruit" will */ /* result in the player's preferred fruit [better than "\033"]. */ obj_descr[SLIME_MOLD].oc_name = "fruit"; #if defined(GL_GRAPHICS) || defined(SDL_GRAPHICS) /* -AJA- SDL/GL support. Needs to happen after main config * file has been read. */ opts = getenv(SDLGL_ENV_VAR); if (opts) Sdlgl_parse_options(opts, TRUE, FALSE); #endif return; } STATIC_OVL void nmcpy(dest, src, maxlen) char *dest; const char *src; int maxlen; { int count; for(count = 1; count < maxlen; count++) { if(*src == ',' || *src == '\0') break; /*exit on \0 terminator*/ *dest++ = *src++; } *dest = 0; } /* * escapes: escape expansion for showsyms. C-style escapes understood include * \n, \b, \t, \r, \xnnn (hex), \onnn (octal), \nnn (decimal). The ^-prefix * for control characters is also understood, and \[mM] followed by any of the * previous forms or by a character has the effect of 'meta'-ing the value (so * that the alternate character set will be enabled). */ STATIC_OVL void escapes(cp, tp) const char *cp; char *tp; { while (*cp) { int cval = 0, meta = 0; if (*cp == '\\' && index("mM", cp[1])) { meta = 1; cp += 2; } if (*cp == '\\' && index("0123456789xXoO", cp[1])) { const char *dp, *hex = "00112233445566778899aAbBcCdDeEfF"; int dcount = 0; cp++; if (*cp == 'x' || *cp == 'X') for (++cp; (dp = index(hex, *cp)) && (dcount++ < 2); cp++) cval = (cval * 16) + (dp - hex) / 2; else if (*cp == 'o' || *cp == 'O') for (++cp; (index("01234567",*cp)) && (dcount++ < 3); cp++) cval = (cval * 8) + (*cp - '0'); else for (; (index("0123456789",*cp)) && (dcount++ < 3); cp++) cval = (cval * 10) + (*cp - '0'); } else if (*cp == '\\') /* C-style character escapes */ { switch (*++cp) { case '\\': cval = '\\'; break; case 'n': cval = '\n'; break; case 't': cval = '\t'; break; case 'b': cval = '\b'; break; case 'r': cval = '\r'; break; default: cval = *cp; } cp++; } else if (*cp == '^') /* expand control-character syntax */ { cval = (*++cp & 0x1f); cp++; } else cval = *cp++; if (meta) cval |= 0x80; *tp++ = cval; } *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 %s or %s.", optname, NETHACK_ENV_OPTIONS, configfile); #endif } STATIC_OVL void badoption(opts) const char *opts; { if (!initial) { if (!strncmp(opts, "h", 1) || !strncmp(opts, "?", 1)) option_help(); else pline("Bad syntax: %s. Enter \"?g\" for help.", opts); return; } #ifdef MAC else return; #endif if(from_file) raw_printf("Bad syntax in OPTIONS in %s: %s.", configfile, opts); else raw_printf("Bad syntax in %s: %s.", NETHACK_ENV_OPTIONS, opts); wait_synch(); } STATIC_OVL void badauthoption(opts) const char *opts; { raw_printf("Bad syntax in AUTHENTICATION in %s: %s.", configfile, opts); wait_synch(); } STATIC_OVL void badtileoption(opts) const char *opts; { raw_printf("Bad syntax in TILESET in %s: %s.", configfile, opts); wait_synch(); } STATIC_OVL char * string_for_opt(opts, val_optional) char *opts; boolean val_optional; { char *colon, *equals; colon = index(opts, ':'); equals = index(opts, '='); if (!colon || (equals && equals < colon)) colon = equals; if (!colon || !*++colon) { if (!val_optional) badoption(opts); return (char *)0; } return colon; } STATIC_OVL char * string_for_auth_opt(opts, val_optional) char *opts; boolean val_optional; { char *colon = string_for_opt(opts, TRUE); if (!colon && !val_optional) badauthoption(opts); return colon; } STATIC_OVL char * string_for_tile_opt(opts, val_optional) char *opts; boolean val_optional; { char *colon = string_for_opt(opts, TRUE); if (!colon && !val_optional) badtileoption(opts); return colon; } STATIC_OVL char * string_for_env_opt(optname, opts, val_optional) const char *optname; char *opts; boolean val_optional; { if(!initial) { rejectoption(optname); return (char *)0; } return string_for_opt(opts, val_optional); } STATIC_OVL void bad_negation(optname, with_parameter) const char *optname; boolean with_parameter; { pline_The("%s option may not %sbe negated.", optname, with_parameter ? "both have a value and " : ""); } /* * Change the inventory order, using the given string as the new order. * Missing characters in the new order are filled in at the end from * the current inv_order, except for gold, which is forced to be first * if not explicitly present. * * This routine returns 1 unless there is a duplicate or bad char in * the string. */ STATIC_OVL int change_inv_order(op) char *op; { int oc_sym, num; char *sp, buf[BUFSZ]; num = 0; #ifndef GOLDOBJ if (!index(op, GOLD_SYM)) buf[num++] = COIN_CLASS; #else /* !!!! probably unnecessary with gold as normal inventory */ #endif for (sp = op; *sp; sp++) { oc_sym = def_char_to_objclass(*sp); /* reject bad or duplicate entries */ if (oc_sym == MAXOCLASSES || oc_sym == RANDOM_CLASS || oc_sym == ILLOBJ_CLASS || !index(flags.inv_order, oc_sym) || index(sp+1, *sp)) return 0; /* retain good ones */ buf[num++] = (char) oc_sym; } buf[num] = '\0'; /* fill in any omitted classes, using previous ordering */ for (sp = flags.inv_order; *sp; sp++) if (!index(buf, *sp)) { buf[num++] = *sp; buf[num] = '\0'; /* explicitly terminate for next index() */ } Strcpy(flags.inv_order, buf); return 1; } STATIC_OVL void graphics_opts(opts, optype, maxlen, offset) register char *opts; const char *optype; int maxlen, offset; { uchar translate[MAXPCHARS+1]; int length, i; if (!(opts = string_for_env_opt(optype, opts, FALSE))) return; escapes(opts, opts); length = strlen(opts); if (length > maxlen) length = maxlen; /* match the form obtained from PC configuration files */ for (i = 0; i < length; i++) translate[i] = (uchar) opts[i]; assign_graphics(translate, length, maxlen, offset); } STATIC_OVL void warning_opts(opts, optype) register char *opts; const char *optype; { uchar translate[MAXPCHARS+1]; int length, i; if (!(opts = string_for_env_opt(optype, opts, FALSE))) return; escapes(opts, opts); length = strlen(opts); if (length > WARNCOUNT) length = WARNCOUNT; /* match the form obtained from PC configuration files */ for (i = 0; i < length; i++) translate[i] = (((i < WARNCOUNT) && opts[i]) ? (uchar) opts[i] : def_warnsyms[i].sym); assign_warnings(translate); } void assign_warnings(graph_chars) register uchar *graph_chars; { int i; for (i = 0; i < WARNCOUNT; i++) if (graph_chars[i]) warnsyms[i] = graph_chars[i]; } STATIC_OVL int feature_alert_opts(op, optn) char *op; const char *optn; { char buf[BUFSZ]; boolean rejectver = FALSE; unsigned long fnv = get_feature_notice_ver(op); /* version.c */ if (fnv == 0L) return 0; if (fnv > get_current_feature_ver()) rejectver = TRUE; else flags.suppress_alert = fnv; if (rejectver) { if (!initial) You_cant("disable new feature alerts for future versions."); else { Sprintf(buf, "\n%s=%s Invalid reference to a future version ignored", optn, op); badoption(buf); } return 0; } if (!initial) { Sprintf(buf, "%lu.%lu.%lu", FEATURE_NOTICE_VER_MAJ, FEATURE_NOTICE_VER_MIN, FEATURE_NOTICE_VER_PATCH); pline("Feature change alerts disabled for Slash'EM %s features and prior.", buf); } return 1; } 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 */ } } } } #ifdef MENU_COLOR extern struct menucoloring *menu_colorings; static const struct { const char *name; const int color; } colornames[] = { {"black", CLR_BLACK}, {"red", CLR_RED}, {"green", CLR_GREEN}, {"brown", CLR_BROWN}, {"blue", CLR_BLUE}, {"magenta", CLR_MAGENTA}, {"cyan", CLR_CYAN}, {"gray", CLR_GRAY}, {"orange", CLR_ORANGE}, {"lightgreen", CLR_BRIGHT_GREEN}, {"yellow", CLR_YELLOW}, {"lightblue", CLR_BRIGHT_BLUE}, {"lightmagenta", CLR_BRIGHT_MAGENTA}, {"lightcyan", CLR_BRIGHT_CYAN}, {"white", CLR_WHITE} }; static const struct { const char *name; const int attr; } attrnames[] = { {"none", ATR_NONE}, {"bold", ATR_BOLD}, {"dim", ATR_DIM}, {"underline", ATR_ULINE}, {"blink", ATR_BLINK}, {"inverse", ATR_INVERSE} }; /* parse '"regex_string"=color' and add it to menucoloring */ boolean add_menu_coloring(str) char *str; { int i, c = NO_COLOR, a = ATR_NONE; struct menucoloring *tmp; char *tmps, *cs = strchr(str, '='); #ifdef POSIX_REGEX int errnum; char errbuf[80]; #endif const char *err = (char *)0; if (!cs || !str) return FALSE; tmps = cs; tmps++; while (*tmps && isspace(*tmps)) tmps++; for (i = 0; i < SIZE(colornames); i++) if (strstri(tmps, colornames[i].name) == tmps) { c = colornames[i].color; break; } if ((i == SIZE(colornames)) && (*tmps >= '0' && *tmps <='9')) c = atoi(tmps); if (c > 15) return FALSE; tmps = strchr(str, '&'); if (tmps) { tmps++; while (*tmps && isspace(*tmps)) tmps++; for (i = 0; i < SIZE(attrnames); i++) if (strstri(tmps, attrnames[i].name) == tmps) { a = attrnames[i].attr; break; } if ((i == SIZE(attrnames)) && (*tmps >= '0' && *tmps <='9')) a = atoi(tmps); } *cs = '\0'; tmps = str; if ((*tmps == '"') || (*tmps == '\'')) { cs--; while (isspace(*cs)) cs--; if (*cs == *tmps) { *cs = '\0'; tmps++; } } tmp = (struct menucoloring *)alloc(sizeof(struct menucoloring)); #ifdef USE_REGEX_MATCH # ifdef GNU_REGEX tmp->match.translate = 0; tmp->match.fastmap = 0; tmp->match.buffer = 0; tmp->match.allocated = 0; tmp->match.regs_allocated = REGS_FIXED; err = re_compile_pattern(tmps, strlen(tmps), &tmp->match); # else # ifdef POSIX_REGEX errnum = regcomp(&tmp->match, tmps, REG_EXTENDED | REG_NOSUB); if (errnum != 0) { regerror(errnum, &tmp->match, errbuf, sizeof(errbuf)); err = errbuf; } # endif # endif #else tmp->match = (char *)alloc(strlen(tmps)+1); (void) memcpy((genericptr_t)tmp->match, (genericptr_t)tmps, strlen(tmps)+1); #endif if (err) { raw_printf("\nMenucolor regex error: %s\n", err); wait_synch(); free(tmp); return FALSE; } else { tmp->next = menu_colorings; tmp->color = c; tmp->attr = a; menu_colorings = tmp; return TRUE; } } #endif /* MENU_COLOR */ void parseoptions(opts, tinitial, tfrom_file) register char *opts; boolean tinitial, tfrom_file; { register char *op; unsigned num; boolean negated; int i; const char *fullname; initial = tinitial; from_file = tfrom_file; if ((op = index(opts, ',')) != 0) { *op++ = 0; parseoptions(op, initial, from_file); } if (strlen(opts) > BUFSZ/2) { badoption("option too long"); return; } /* strip leading and trailing white space */ while (isspace((int)*opts)) opts++; op = eos(opts); while (--op >= opts && isspace((int)*op)) *op = '\0'; if (!*opts) return; negated = FALSE; while ((*opts == '!') || !strncmpi(opts, "no", 2)) { if (*opts == '!') opts++; else opts += 2; negated = !negated; } /* variant spelling */ if (match_optname(opts, "colour", 5, FALSE)) Strcpy(opts, "color"); /* fortunately this isn't longer */ if (!match_optname(opts, "subkeyvalue", 11, TRUE)) /* allow multiple */ duplicate_opt_detection(opts, 1); /* 1 means compound opts */ /* special boolean options */ if (match_optname(opts, "female", 3, FALSE)) { if(!initial && flags.female == negated) pline("That is not anatomically possible."); else flags.initgend = flags.female = !negated; return; } if (match_optname(opts, "male", 4, FALSE)) { if(!initial && flags.female != negated) pline("That is not anatomically possible."); else flags.initgend = flags.female = negated; return; } #if defined(MICRO) && !defined(AMIGA) /* included for compatibility with old NetHack.cnf files */ if (match_optname(opts, "IBM_", 4, FALSE)) { iflags.BIOS = !negated; return; } #endif /* MICRO */ /* compound options */ fullname = "pettype"; if (match_optname(opts, fullname, 3, TRUE)) { if ((op = string_for_env_opt(fullname, opts, negated)) != 0) { if (negated) bad_negation(fullname, TRUE); else switch (*op) { case 'd': /* dog */ case 'D': preferred_pet = 'd'; break; case 'c': /* cat */ case 'C': case 'f': /* feline */ 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; } fullname = "ghoulname"; if (match_optname(opts, fullname, 3, TRUE)) { if (negated) bad_negation(fullname, FALSE); else if ((op = string_for_env_opt(fullname, opts, FALSE)) != 0) nmcpy(ghoulname, op, PL_PSIZ); return; } fullname = "wolfname"; if (match_optname(opts, fullname, 3, TRUE)) { if (negated) bad_negation(fullname, FALSE); else if ((op = string_for_env_opt(fullname, opts, FALSE)) != 0) nmcpy(wolfname, op, PL_PSIZ); return; } fullname = "catname"; if (match_optname(opts, fullname, 3, TRUE)) { if (negated) bad_negation(fullname, FALSE); else if ((op = string_for_env_opt(fullname, opts, FALSE)) != 0) nmcpy(catname, op, PL_PSIZ); return; } fullname = "dogname"; if (match_optname(opts, fullname, 3, TRUE)) { if (negated) bad_negation(fullname, FALSE); else if ((op = string_for_env_opt(fullname, opts, FALSE)) != 0) nmcpy(dogname, op, PL_PSIZ); return; } fullname = "horsename"; if (match_optname(opts, fullname, 5, TRUE)) { if (negated) bad_negation(fullname, FALSE); else if ((op = string_for_env_opt(fullname, opts, FALSE)) != 0) nmcpy(horsename, op, PL_PSIZ); return; } /* menucolor:"regex_string"=color */ fullname = "menucolor"; if (match_optname(opts, fullname, 9, TRUE)) { #ifdef MENU_COLOR if (negated) bad_negation(fullname, FALSE); else if ((op = string_for_env_opt(fullname, opts, FALSE)) != 0) if (!add_menu_coloring(op)) badoption(opts); #endif return; } fullname = "number_pad"; if (match_optname(opts, fullname, 10, TRUE)) { boolean compat = (strlen(opts) <= 10); op = string_for_opt(opts, (compat || !initial)); if (!op) { if (compat || negated || initial) { /* for backwards compatibility, "number_pad" without a value is a synonym for number_pad:1 */ iflags.num_pad = !negated; if (iflags.num_pad) iflags.num_pad_mode = 0; number_pad(iflags.num_pad); } return; } if (negated) { bad_negation("number_pad", TRUE); return; } if (*op == '1' || *op == '2') { iflags.num_pad = 1; if (*op == '2') iflags.num_pad_mode = 1; else iflags.num_pad_mode = 0; number_pad(1); } else if (*op == '0') { iflags.num_pad = 0; iflags.num_pad_mode = 0; number_pad(0); } else badoption(opts); return; } fullname = "runmode"; if (match_optname(opts, fullname, 4, TRUE)) { if (negated) { iflags.runmode = RUN_TPORT; } else if ((op = string_for_opt(opts, FALSE)) != 0) { if (!strncmpi(op, "teleport", strlen(op))) iflags.runmode = RUN_TPORT; else if (!strncmpi(op, "run", strlen(op))) iflags.runmode = RUN_LEAP; else if (!strncmpi(op, "walk", strlen(op))) iflags.runmode = RUN_STEP; else if (!strncmpi(op, "crawl", strlen(op))) iflags.runmode = RUN_CRAWL; else badoption(opts); } return; } fullname = "msghistory"; if (match_optname(opts, fullname, 3, TRUE)) { op = string_for_env_opt(fullname, opts, negated); if ((negated && !op) || (!negated && op)) { iflags.msg_history = negated ? 0 : atoi(op); } else if (negated) bad_negation(fullname, TRUE); return; } fullname="msg_window"; /* msg_window:single, combo, full or reversed */ if (match_optname(opts, fullname, 4, TRUE)) { /* allow option to be silently ignored by non-tty ports */ #ifdef TTY_GRAPHICS int tmp; if (!(op = string_for_opt(opts, TRUE))) { tmp = negated ? 's' : 'f'; } else { if (negated) { bad_negation(fullname, TRUE); return; } tmp = tolower(*op); } switch (tmp) { case 's': /* single message history cycle (default if negated) */ iflags.prevmsg_window = 's'; break; case 'c': /* combination: two singles, then full page reversed */ iflags.prevmsg_window = 'c'; break; case 'f': /* full page (default if no opts) */ iflags.prevmsg_window = 'f'; break; case 'r': /* full page (reversed) */ iflags.prevmsg_window = 'r'; break; default: badoption(opts); } #endif 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 if (match_optname(opts, "palette", 3, TRUE) # ifdef MAC || match_optname(opts, "hicolor", 3, TRUE) # endif ) { int color_number, color_incr; # ifdef MAC if (match_optname(opts, "hicolor", 3, TRUE)) { if (negated) { bad_negation("hicolor", FALSE); return; } color_number = CLR_MAX + 4; /* HARDCODED inverse number */ color_incr = -1; } else { # endif if (negated) { bad_negation("palette", FALSE); return; } color_number = 0; color_incr = 1; # ifdef MAC } # endif if ((op = string_for_opt(opts, FALSE)) != (char *)0) { char *pt = op; int cnt, tmp, reverse; long rgb; while (*pt && color_number >= 0) { cnt = 3; rgb = 0L; if (*pt == '-') { reverse = 1; pt++; } else { reverse = 0; } while (cnt-- > 0) { if (*pt && *pt != '/') { # ifdef AMIGA rgb <<= 4; # else rgb <<= 8; # endif tmp = *(pt++); if (isalpha(tmp)) { tmp = (tmp + 9) & 0xf; /* Assumes ASCII... */ } else { tmp &= 0xf; /* Digits in ASCII too... */ } # ifndef AMIGA /* Add an extra so we fill f -> ff and 0 -> 00 */ rgb += tmp << 4; # endif rgb += tmp; } } if (*pt == '/') { pt++; } change_color(color_number, rgb, reverse); color_number += color_incr; } } if (!initial) { need_redraw = TRUE; } return; } #endif /* CHANGE_COLOR */ if (match_optname(opts, "fruit", 2, TRUE)) { char empty_str = '\0'; op = string_for_opt(opts, negated); if (negated) { if (op) { bad_negation("fruit", TRUE); return; } op = &empty_str; goto goodfruit; } if (!op) return; if (!initial) { struct fruit *f; num = 0; for(f=ffruit; f; f=f->nextf) { if (!strcmp(op, f->fname)) goto goodfruit; num++; } if (num >= 100) { pline("Doing that so many times isn't very fruitful."); return; } } goodfruit: nmcpy(pl_fruit, op, PL_FSIZ); /* OBJ_NAME(objects[SLIME_MOLD]) won't work after initialization */ if (!*pl_fruit) nmcpy(pl_fruit, "slime mold", PL_FSIZ); if (!initial) (void)fruitadd(pl_fruit); /* If initial, then initoptions is allowed to do it instead * of here (initoptions always has to do it even if there's * no fruit option at all. Also, we don't want people * setting multiple fruits in their options.) */ return; } /* graphics:string */ fullname = "graphics"; if (match_optname(opts, fullname, 2, TRUE)) { if (negated) bad_negation(fullname, FALSE); else graphics_opts(opts, fullname, MAXPCHARS, 0); return; } fullname = "dungeon"; if (match_optname(opts, fullname, 2, TRUE)) { if (negated) bad_negation(fullname, FALSE); else graphics_opts(opts, fullname, MAXDCHARS, 0); return; } fullname = "traps"; if (match_optname(opts, fullname, 2, TRUE)) { if (negated) bad_negation(fullname, FALSE); else graphics_opts(opts, fullname, MAXTCHARS, MAXDCHARS); return; } fullname = "effects"; if (match_optname(opts, fullname, 2, TRUE)) { if (negated) bad_negation(fullname, FALSE); else graphics_opts(opts, fullname, MAXECHARS, MAXDCHARS+MAXTCHARS); return; } /* objects:string */ fullname = "objects"; if (match_optname(opts, fullname, 7, TRUE)) { int length; if (negated) { bad_negation(fullname, FALSE); return; } if (!(opts = string_for_env_opt(fullname, opts, FALSE))) return; escapes(opts, opts); /* * Override the default object class symbols. The first * object in the object class is the "random object". I * don't want to use 0 as an object class, so the "random * object" is basically a place holder. * * The object class symbols have already been initialized in * initoptions(). */ length = strlen(opts); if (length >= MAXOCLASSES) length = MAXOCLASSES-1; /* don't count RANDOM_OBJECT */ for (i = 0; i < length; i++) oc_syms[i+1] = (uchar) opts[i]; return; } /* monsters:string */ fullname = "monsters"; if (match_optname(opts, fullname, 8, TRUE)) { int length; if (negated) { bad_negation(fullname, FALSE); return; } if (!(opts = string_for_env_opt(fullname, opts, FALSE))) return; escapes(opts, opts); /* Override default mon class symbols set in initoptions(). */ length = strlen(opts); if (length >= MAXMCLASSES) length = MAXMCLASSES-1; /* mon class 0 unused */ for (i = 0; i < length; i++) monsyms[i+1] = (uchar) opts[i]; return; } fullname = "warnings"; if (match_optname(opts, fullname, 5, TRUE)) { if (negated) bad_negation(fullname, FALSE); else warning_opts(opts, fullname); return; } /* boulder:symbol */ fullname = "boulder"; if (match_optname(opts, fullname, 7, TRUE)) { int clash = 0; 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); if (def_char_to_monclass(opts[0]) != MAXMCLASSES) clash = 1; else if (opts[0] >= '1' && opts[0] <= '5') clash = 2; if (clash) { /* symbol chosen matches a used monster or warning symbol which is not good - reject it*/ pline( "Badoption - boulder symbol '%c' conflicts with a %s symbol.", opts[0], (clash == 1) ? "monster" : "warning"); } else { /* * 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)) { if (negated) bad_negation(fullname, FALSE); else if ((op = string_for_env_opt(fullname, opts, FALSE)) != 0) #ifdef PROXY_GRAPHICS /* * Can't change player name if authentication required. */ if (!getenv("HACKAUTHENTICATION")) #endif nmcpy(plname, op, PL_NSIZ); return; } /* role:string or character:string */ fullname = "role"; if (match_optname(opts, fullname, 4, TRUE) || match_optname(opts, (fullname = "character"), 4, TRUE)) { if (negated) bad_negation(fullname, FALSE); else if ((op = string_for_env_opt(fullname, opts, FALSE)) != 0) { if ((flags.initrole = str2role(op)) == ROLE_NONE) badoption(opts); else /* Backwards compatibility */ nmcpy(pl_character, op, PL_NSIZ); } return; } /* race:string */ fullname = "race"; 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.initrace = str2race(op)) == ROLE_NONE) badoption(opts); else /* Backwards compatibility */ pl_race = *op; } return; } /* gender:string */ fullname = "gender"; 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.initgend = str2gend(op)) == ROLE_NONE) badoption(opts); else flags.female = flags.initgend; } return; } /* altkeyhandler:string */ fullname = "altkeyhandler"; if (match_optname(opts, fullname, 4, TRUE)) { if (negated) bad_negation(fullname, FALSE); else if ((op = string_for_opt(opts, negated))) { #ifdef WIN32CON (void)strncpy(iflags.altkeyhandler, op, MAX_ALTKEYHANDLER - 5); load_keyboard_handler(); #endif } 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) badoption(opts); return; } /* the order to list the pack */ fullname = "packorder"; if (match_optname(opts, fullname, 4, TRUE)) { if (negated) { bad_negation(fullname, FALSE); return; } else if (!(op = string_for_opt(opts, FALSE))) return; if (!change_inv_order(op)) badoption(opts); return; } /* maximum burden picked up before prompt (Warren Cheung) */ fullname = "pickup_burden"; if (match_optname(opts, fullname, 8, TRUE)) { if (negated) { bad_negation(fullname, FALSE); return; } else if ((op = string_for_env_opt(fullname, opts, FALSE)) != 0) { switch (tolower(*op)) { /* Unencumbered */ 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; break; /* overLoaded */ case 'l': flags.pickup_burden = OVERLOADED; break; default: badoption(opts); } } return; } /* types of objects to pick up automatically */ if (match_optname(opts, "pickup_types", 8, TRUE)) { char ocl[MAXOCLASSES + 1], tbuf[MAXOCLASSES + 1], qbuf[QBUFSZ], abuf[BUFSZ]; int oc_sym; boolean badopt = FALSE, compat = (strlen(opts) <= 6), use_menu; oc_to_str(flags.pickup_types, tbuf); flags.pickup_types[0] = '\0'; /* all */ op = string_for_opt(opts, (compat || !initial)); if (!op) { if (compat || negated || initial) { /* for backwards compatibility, "pickup" without a value is a synonym for autopickup of all types (and during initialization, we can't prompt yet) */ flags.pickup = !negated; return; } oc_to_str(flags.inv_order, ocl); use_menu = TRUE; if (flags.menu_style == MENU_TRADITIONAL || flags.menu_style == MENU_COMBINATION) { use_menu = FALSE; Sprintf(qbuf, "New pickup_types: [%s am] (%s)", ocl, *tbuf ? tbuf : "all"); getlin(qbuf, abuf); op = mungspaces(abuf); if (abuf[0] == '\0' || abuf[0] == '\033') op = tbuf; /* restore */ else if (abuf[0] == 'm') use_menu = TRUE; } if (use_menu) { (void) choose_classes_menu("Auto-Pickup what?", 1, TRUE, ocl, tbuf); op = tbuf; } } if (negated) { bad_negation("pickup_types", TRUE); return; } while (*op == ' ') op++; if (*op != 'a' && *op != 'A') { num = 0; while (*op) { oc_sym = def_char_to_objclass(*op); /* make sure all are valid obj symbols occuring once */ if (oc_sym != MAXOCLASSES && !index(flags.pickup_types, oc_sym)) { flags.pickup_types[num] = (char)oc_sym; flags.pickup_types[++num] = '\0'; } else badopt = TRUE; op++; } if (badopt) badoption(opts); } 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; op = string_for_opt(opts, TRUE); if (op && negated) { bad_negation("disclose", TRUE); return; } /* "disclose" without a value means "all with prompting" and negated means "none without prompting" */ if (!op || !strcmpi(op, "all") || !strcmpi(op, "none")) { if (op && !strcmpi(op, "none")) negated = TRUE; for (num = 0; num < NUM_DISCLOSURE_OPTIONS; num++) flags.end_disclose[num] = negated ? DISCLOSE_NO_WITHOUT_PROMPT : DISCLOSE_PROMPT_DEFAULT_YES; 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; } /* scores:5t[op] 5a[round] o[wn] */ if (match_optname(opts, "scores", 4, TRUE)) { if (negated) { bad_negation("scores", FALSE); return; } if (!(op = string_for_opt(opts, FALSE))) return; while (*op) { int inum = 1; if (digit(*op)) { inum = atoi(op); while (digit(*op)) op++; } else if (*op == '!') { negated = !negated; op++; } while (*op == ' ') op++; switch (*op) { case 't': case 'T': flags.end_top = inum; break; case 'a': case 'A': flags.end_around = inum; break; case 'o': case 'O': flags.end_own = !negated; break; default: badoption(opts); return; } while (letter(*++op) || *op == ' ') continue; if (*op == '/') op++; } return; } fullname = "suppress_alert"; if (match_optname(opts, fullname, 4, TRUE)) { op = string_for_opt(opts, negated); if (negated) bad_negation(fullname, FALSE); else if (op) (void) feature_alert_opts(op,fullname); return; } fullname = "tileset"; if (match_optname(opts, fullname, 4, TRUE)) { if (negated || (op = string_for_opt(opts, TRUE)) == 0) tileset[0] = '\0'; else { /* * The tileset may not be defined (yet) if we're * in initial mode, otherwise it must exist. */ if (!initial) { int len = strlen(op); for(i = 0; i < no_tilesets; i++) if (len == strlen(tilesets[i].name) && !strncmpi(tilesets[i].name, op, len)) break; if (i == no_tilesets) { pline("Tileset %s not defined.", op); return; } else /* Use canonical case */ strcpy(tileset, tilesets[i].name); } else nmcpy(tileset, op, PL_PSIZ); } if (!initial) need_redraw = TRUE; return; } #if defined(VIDEOSHADES) && !defined(NO_TERMS) /* videocolors:string */ fullname = "videocolors"; if (match_optname(opts, fullname, 6, TRUE) || match_optname(opts, "videocolours", 10, TRUE)) { if (negated) { bad_negation(fullname, FALSE); return; } else if (!(opts = string_for_env_opt(fullname, opts, FALSE))) { return; } if (!assign_videocolors(opts)) badoption(opts); return; } # ifdef MSDOS /* videoshades:string */ fullname = "videoshades"; if (match_optname(opts, fullname, 6, TRUE)) { if (negated) { bad_negation(fullname, FALSE); return; } else if (!(opts = string_for_env_opt(fullname, opts, FALSE))) { return; } if (!assign_videoshades(opts)) badoption(opts); return; } # endif #endif /* VIDEOSHADES */ #ifdef MSDOS # ifdef NO_TERMS /* video:string -- must be after longer tests */ fullname = "video"; if (match_optname(opts, fullname, 5, TRUE)) { if (negated) { bad_negation(fullname, FALSE); return; } else if (!(opts = string_for_env_opt(fullname, opts, FALSE))) { return; } if (!assign_video(opts)) badoption(opts); return; } # endif /* NO_TERMS */ /* soundcard:string -- careful not to match boolean 'sound' */ fullname = "soundcard"; if (match_optname(opts, fullname, 6, TRUE)) { if (negated) { bad_negation(fullname, FALSE); return; } else if (!(opts = string_for_env_opt(fullname, opts, FALSE))) { return; } if (!assign_soundcard(opts)) badoption(opts); return; } #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_amount:nn */ fullname = "scroll_amount"; if (match_optname(opts, fullname, sizeof("scroll_amount")-1, TRUE)) { op = string_for_opt(opts, negated); if ((negated && !op) || (!negated && op)) { iflags.wc_scroll_amount = negated ? 1 : atoi(op); } 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; } fullname = "subkeyvalue"; if (match_optname(opts, fullname, 5, TRUE)) { if (negated) bad_negation(fullname, FALSE); else { #if defined(WIN32CON) op = string_for_opt(opts, 0); map_subkeyvalue(op); #endif } 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)) { if (negated) { bad_negation(fullname, FALSE); return; } else if ((op = string_for_env_opt(fullname, opts, FALSE)) != 0) { char buf[WINTYPELEN]; nmcpy(buf, op, WINTYPELEN); choose_windows(buf); } 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; boolean val_required = (strlen(opts) > 5 && !negated); if (!(op = string_for_opt(opts, !val_required))) { if (val_required) return; /* string_for_opt gave feedback */ tmp = negated ? 'n' : 'f'; } else { tmp = tolower(*op); } switch (tmp) { case 'n': /* none */ case 't': /* traditional */ flags.menu_style = MENU_TRADITIONAL; break; case 'c': /* combo: trad.class sel+menu */ flags.menu_style = MENU_COMBINATION; break; case 'p': /* partial: no class menu */ flags.menu_style = MENU_PARTIAL; break; case 'f': /* full: class menu + menu */ flags.menu_style = MENU_FULL; break; default: badoption(opts); } return; } fullname = "menu_headings"; if (match_optname(opts, fullname, 12, TRUE)) { if (negated) { bad_negation(fullname, FALSE); return; } else if (!(opts = string_for_env_opt(fullname, opts, FALSE))) { return; } if (!strcmpi(opts,"bold")) iflags.menu_headings = ATR_BOLD; else if (!strcmpi(opts,"inverse")) iflags.menu_headings = ATR_INVERSE; else if (!strcmpi(opts,"underline")) iflags.menu_headings = ATR_ULINE; else badoption(opts); return; } /* check for menu command mapping */ for (i = 0; i < NUM_MENU_CMDS; i++) { fullname = default_menu_cmd_info[i].name; if (match_optname(opts, fullname, (int)strlen(fullname), TRUE)) { if (negated) bad_negation(fullname, FALSE); else if ((op = string_for_opt(opts, FALSE)) != 0) { int j; char c, op_buf[BUFSZ]; boolean isbad = FALSE; escapes(op, op_buf); c = *op_buf; if (c == 0 || c == '\r' || c == '\n' || c == '\033' || c == ' ' || digit(c) || (letter(c) && c != '@')) isbad = TRUE; else /* reject default object class symbols */ for (j = 1; j < MAXOCLASSES; j++) if (c == def_oc_syms[i]) { isbad = TRUE; break; } if (isbad) badoption(opts); else add_menu_cmd_alias(c, default_menu_cmd_info[i].cmd); } return; } } /* OK, if we still haven't recognized the option, check the boolean * options list */ for (i = 0; boolopt[i].name; i++) { if (match_optname(opts, boolopt[i].name, 3, FALSE)) { /* options that don't exist */ if (!boolopt[i].addr) { if (!initial && !negated) pline_The("\"%s\" option is not available.", boolopt[i].name); 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 || (boolopt[i].addr) == &iflags.DECgraphics # endif # ifdef ASCIIGRAPH || (boolopt[i].addr) == &iflags.IBMgraphics # endif # ifdef MAC_GRAPHICS_ENV || (boolopt[i].addr) == &iflags.MACgraphics # endif ) { # ifdef REINCARNATION /* [ALI] GTK port may call doset() after initial * but before we start a game. Prevent false match. */ if (!initial && u.uz.dlevel && Is_rogue_level(&u.uz)) assign_rogue_graphics(FALSE); # endif need_redraw = TRUE; # ifdef TERMLIB if ((boolopt[i].addr) == &iflags.DECgraphics) switch_graphics(iflags.DECgraphics ? DEC_GRAPHICS : ASCII_GRAPHICS); # endif # ifdef ASCIIGRAPH if ((boolopt[i].addr) == &iflags.IBMgraphics) switch_graphics(iflags.IBMgraphics ? IBM_GRAPHICS : ASCII_GRAPHICS); # endif # ifdef MAC_GRAPHICS_ENV if ((boolopt[i].addr) == &iflags.MACgraphics) switch_graphics(iflags.MACgraphics ? MAC_GRAPHICS : ASCII_GRAPHICS); # endif # ifdef REINCARNATION if (!initial && u.uz.dlevel && Is_rogue_level(&u.uz)) assign_rogue_graphics(TRUE); # endif } #endif /* TERMLIB || ASCIIGRAPH || MAC_GRAPHICS_ENV */ /* only do processing below if setting with doset() */ if (initial) return; if ((boolopt[i].addr) == &flags.time #ifdef EXP_ON_BOTL || (boolopt[i].addr) == &flags.showexp #endif #ifdef SCORE_ON_BOTL || (boolopt[i].addr) == &flags.showscore #endif #ifdef SHOW_WEIGHT || (boolopt[i].addr) == &flags.showweight #endif ) bot_reconfig(); else if ((boolopt[i].addr) == &flags.invlet_constant) { if (flags.invlet_constant) reassign(); } #ifdef LAN_MAIL else if ((boolopt[i].addr) == &flags.biff) { if (flags.biff) lan_mail_init(); else lan_mail_finish(); } #endif else if ((boolopt[i].addr) == &flags.lit_corridor) { /* * All corridor squares seen via night vision or * candles & lamps change. Update them by calling * newsym() on them. Don't do this if we are * initializing the options --- the vision system * isn't set up yet. */ if (u.uz.dlevel) { vision_recalc(2); /* shut down vision */ vision_full_recalc = 1; /* delayed recalc */ } } else if ((boolopt[i].addr) == &iflags.use_inverse || (boolopt[i].addr) == &iflags.showrace || (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 && iflags.BIOS) { if (colors_changed) restore_colors(); else set_colors(); } # endif } #endif else if ((boolopt[i].addr) == &flags.perm_invent) update_inventory(); return; } } /* out of valid options */ badoption(opts); } static void parseauthopt(opts) register char *opts; { register char *op; boolean negated; const char *fullname; if (strlen(opts) > BUFSZ/2) { badauthoption("option too long"); return; } /* strip leading and trailing white space */ while (isspace((int)*opts)) opts++; op = eos(opts); while (--op >= opts && isspace((int)*op)) *op = '\0'; if (!*opts) return; negated = FALSE; while ((*opts == '!') || !strncmpi(opts, "no", 2)) { if (*opts == '!') opts++; else opts += 2; negated = !negated; } /* compound options */ fullname = "prog"; if (match_optname(opts, fullname, 4, TRUE)) { if (negated) bad_negation(fullname, FALSE); else if ((op = string_for_auth_opt(opts, FALSE)) != 0) nmcpy(authentication.prog, op, BUFSZ); return; } fullname = "args"; if (match_optname(opts, fullname, 4, TRUE)) { if (negated) bad_negation(fullname, FALSE); else if ((op = string_for_auth_opt(opts, FALSE)) != 0) nmcpy(authentication.args, op, BUFSZ); return; } /* out of valid options */ badauthoption(opts); } void parseauthentication(opts) register char *opts; { register char *op; /* Initial values */ authentication.prog[0] = '\0'; authentication.args[0] = '\0'; while ((op = index(opts, ',')) != 0) { *op++ = 0; parseauthopt(opts); opts = op; } parseauthopt(opts); if (!authentication.prog[0] && authentication.args[0]) badauthoption("Arguments given but no program specified."); } static void parsetilesetopt(opts) register char *opts; { register char *op; boolean negated; int i; const char *fullname; if (strlen(opts) > BUFSZ/2) { badtileoption("option too long"); return; } /* strip leading and trailing white space */ while (isspace((int)*opts)) opts++; op = eos(opts); while (--op >= opts && isspace((int)*op)) *op = '\0'; if (!*opts) return; negated = FALSE; while ((*opts == '!') || !strncmpi(opts, "no", 2)) { if (*opts == '!') opts++; else opts += 2; negated = !negated; } /* compound options */ fullname = "name"; if (match_optname(opts, fullname, 4, TRUE)) { if (negated) bad_negation(fullname, FALSE); else if ((op = string_for_tile_opt(opts, FALSE)) != 0) nmcpy(tilesets[no_tilesets].name, op, PL_PSIZ); return; } fullname = "filename"; if (match_optname(opts, fullname, 4, TRUE)) { if (negated) bad_negation(fullname, FALSE); else if ((op = string_for_tile_opt(opts, FALSE)) != 0) nmcpy(tilesets[no_tilesets].file, op, TILESET_MAX_FILENAME); return; } /* OK, if we still haven't recognized the option, check the boolean * options list */ for (i = 0; booltileopt[i].name; i++) { if (match_optname(opts, booltileopt[i].name, 3, FALSE)) { if (negated) tilesets[no_tilesets].flags &= ~booltileopt[i].flag; else tilesets[no_tilesets].flags |= booltileopt[i].flag; return; } } /* out of valid options */ badtileoption(opts); } void parsetileset(opts) register char *opts; { register char *op; int i; if (no_tilesets >= MAXNOTILESETS) { badtileoption("too many tilesets"); return; } /* Initial values */ tilesets[no_tilesets].name[0] = '\0'; tilesets[no_tilesets].file[0] = '\0'; tilesets[no_tilesets].flags = 0; for (i = 0; booltileopt[i].name; i++) tilesets[no_tilesets].flags |= booltileopt[i].initvalue; while ((op = index(opts, ',')) != 0) { *op++ = 0; parsetilesetopt(opts); opts = op; } parsetilesetopt(opts); if (tilesets[no_tilesets].name[0] == '\0' || tilesets[no_tilesets].file[0] == '\0') { badtileoption("Incomplete tileset definition."); } else no_tilesets++; } static NEARDATA const char *menutype[] = { "traditional", "combination", "partial", "full" }; static NEARDATA const char *burdentype[] = { "unencumbered", "burdened", "stressed", "strained", "overtaxed", "overloaded" }; static NEARDATA const char *runmodes[] = { "teleport", "run", "walk", "crawl" }; /* * Convert the given string of object classes to a string of default object * symbols. */ STATIC_OVL void oc_to_str(src,dest) char *src, *dest; { int i; while ((i = (int) *src++) != 0) { if (i < 0 || i >= MAXOCLASSES) impossible("oc_to_str: illegal object class %d", i); else *dest++ = def_oc_syms[i]; } *dest = '\0'; } /* * Add the given mapping to the menu command map list. Always keep the * maps valid C strings. */ void add_menu_cmd_alias(from_ch, to_ch) char from_ch, to_ch; { if (n_menu_mapped >= MAX_MENU_MAPPED_CMDS) pline("out of menu map space."); else { mapped_menu_cmds[n_menu_mapped] = from_ch; mapped_menu_op[n_menu_mapped] = to_ch; n_menu_mapped++; mapped_menu_cmds[n_menu_mapped] = 0; mapped_menu_op[n_menu_mapped] = 0; } } /* * Map the given character to its corresponding menu command. If it * doesn't match anything, just return the original. */ char map_menu_cmd(ch) char ch; { char *found = index(mapped_menu_cmds, ch); if (found) { int idx = found - mapped_menu_cmds; ch = mapped_menu_op[idx]; } return ch; } #if defined(MICRO) || defined(MAC) || defined(WIN32) # define OPTIONS_HEADING "OPTIONS" #else # define OPTIONS_HEADING NETHACK_ENV_OPTIONS #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) winid win; /* window to add to */ const char *option; /* option name */ int indexoffset; /* value to add to index in compopt[], or zero if option cannot be changed */ { const char *value = "unknown"; /* current value */ char buf[BUFSZ], buf2[BUFSZ]; anything any; int i; any.a_void = 0; if (indexoffset == 0) { any.a_int = 0; value = get_compopt_value(option, buf2); } else { for (i=0; compopt[i].name; i++) if (strcmp(option, compopt[i].name) == 0) break; if (compopt[i].name) { any.a_int = i + 1 + indexoffset; value = get_compopt_value(option, buf2); } else { /* We are trying to add an option not found in compopt[]. This is almost certainly bad, but we'll let it through anyway (with a zero value, so it can't be selected). */ any.a_int = 0; } } /* " " 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); } /* Changing options via menu by Per Liboriussen */ int doset() { char buf[BUFSZ], buf2[BUFSZ]; int i, pass, boolcount, pick_cnt, pick_idx, opt_indx; boolean *bool_p; winid tmpwin; anything any; menu_item *pick_list; int indexoffset, startpass, endpass; boolean setinitial = FALSE, fromfile = FALSE; int biggest_name = 0; tmpwin = create_nhwindow(NHW_MENU); start_menu(tmpwin); any.a_void = 0; add_menu(tmpwin, NO_GLYPH, &any, 0, 0, iflags.menu_headings, "Booleans (selecting will toggle value):", MENU_UNSELECTED); any.a_int = 0; /* first list any other non-modifiable booleans, then modifiable ones */ 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 #ifndef OBJ_SANITY if (bool_p == &iflags.sanity_check && !wizard) continue; #endif if (bool_p == &iflags.menu_tab_sep && !wizard) continue; #endif if (is_wc_option(boolopt[i].name) && !wc_supported(boolopt[i].name)) continue; if (is_wc2_option(boolopt[i].name) && !wc2_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); } boolcount = i; indexoffset = boolcount; any.a_void = 0; add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, "", MENU_UNSELECTED); add_menu(tmpwin, NO_GLYPH, &any, 0, 0, iflags.menu_headings, "Compounds (selecting will prompt for new value):", MENU_UNSELECTED); startpass = DISP_IN_GAME; endpass = SET_IN_GAME; /* spin through the options to find the biggest name and adjust the format string accordingly if needed */ biggest_name = 0; for (i = 0; compopt[i].name; i++) if (compopt[i].optflags >= startpass && compopt[i].optflags <= endpass && 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); doset_add_menu(tmpwin, "race", 0); doset_add_menu(tmpwin, "gender", 0); for (pass = startpass; pass <= endpass; pass++) for (i = 0; compopt[i].name; i++) if (compopt[i].optflags == pass) { if (!strcmp(compopt[i].name, "name") || !strcmp(compopt[i].name, "role") || !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 if (is_wc2_option(compopt[i].name) && !wc2_supported(compopt[i].name)) continue; else doset_add_menu(tmpwin, compopt[i].name, (pass == DISP_IN_GAME) ? 0 : indexoffset); } #ifdef AUTOPICKUP_EXCEPTIONS any.a_int = -1; Sprintf(buf, "autopickup exceptions (%d currently set)", count_ape_maps((int *)0, (int *)0)); add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, MENU_UNSELECTED); #endif /* AUTOPICKUP_EXCEPTIONS */ #ifdef PREFIXES_IN_USE any.a_void = 0; add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, "", MENU_UNSELECTED); add_menu(tmpwin, NO_GLYPH, &any, 0, 0, iflags.menu_headings, "Variable playground locations:", MENU_UNSELECTED); for (i = 0; i < PREFIX_COUNT; i++) doset_add_menu(tmpwin, fqn_prefix_names[i], 0); #endif end_menu(tmpwin, "Set what options?"); need_redraw = FALSE; if ((pick_cnt = select_menu(tmpwin, PICK_ANY, &pick_list)) > 0) { /* * Walk down the selection list and either invert the booleans * or prompt for new values. In most cases, call parseoptions() * to take care of options that require special attention, like * redraws. */ for (pick_idx = 0; pick_idx < pick_cnt; ++pick_idx) { opt_indx = pick_list[pick_idx].item.a_int - 1; #ifdef AUTOPICKUP_EXCEPTIONS if (opt_indx == -2) { special_handling("autopickup_exception", setinitial, fromfile); } else #endif if (opt_indx < boolcount) { /* boolean option */ Sprintf(buf, "%s%s", *boolopt[opt_indx].addr ? "!" : "", boolopt[opt_indx].name); parseoptions(buf, setinitial, fromfile); if (wc_supported(boolopt[opt_indx].name) || wc2_supported(boolopt[opt_indx].name)) preference_update(boolopt[opt_indx].name); } else { /* compound option */ opt_indx -= boolcount; if (!special_handling(compopt[opt_indx].name, setinitial, fromfile)) { Sprintf(buf, "Set %s to what?", compopt[opt_indx].name); getlin(buf, buf2); if (buf2[0] == '\033') continue; Sprintf(buf, "%s:%s", compopt[opt_indx].name, buf2); /* pass the buck */ parseoptions(buf, setinitial, fromfile); } if (wc_supported(compopt[opt_indx].name) || wc2_supported(compopt[opt_indx].name)) preference_update(compopt[opt_indx].name); } } free((genericptr_t)pick_list); pick_list = (menu_item *)0; } destroy_nhwindow(tmpwin); if (need_redraw) (void) doredraw(); return 0; } STATIC_OVL boolean special_handling(optname, setinitial, setfromfile) const char *optname; boolean setinitial,setfromfile; { winid tmpwin; anything any; int i; char buf[BUFSZ]; boolean retval = FALSE; /* Special handling of menustyle, pickup_burden, pickup_types, * disclose, runmode, msg_window, menu_headings, and number_pad options. #ifdef AUTOPICKUP_EXCEPTIONS * Also takes care of interactive autopickup_exception_handling changes. #endif */ if (!strcmp("menustyle", optname)) { const char *style_name; menu_item *style_pick = (menu_item *)0; tmpwin = create_nhwindow(NHW_MENU); start_menu(tmpwin); for (i = 0; i < SIZE(menutype); i++) { style_name = menutype[i]; /* note: separate `style_name' variable used to avoid an optimizer bug in VAX C V2.3 */ any.a_int = i + 1; add_menu(tmpwin, NO_GLYPH, &any, *style_name, 0, ATR_NONE, style_name, MENU_UNSELECTED); } end_menu(tmpwin, "Select menustyle:"); if (select_menu(tmpwin, PICK_ONE, &style_pick) > 0) { flags.menu_style = style_pick->item.a_int - 1; free((genericptr_t)style_pick); } destroy_nhwindow(tmpwin); retval = TRUE; } else if (!strcmp("pickup_burden", optname)) { const char *burden_name, *burden_letters = "ubsntl"; menu_item *burden_pick = (menu_item *)0; tmpwin = create_nhwindow(NHW_MENU); start_menu(tmpwin); for (i = 0; i < SIZE(burdentype); i++) { burden_name = burdentype[i]; any.a_int = i + 1; 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); } destroy_nhwindow(tmpwin); retval = TRUE; } else if (!strcmp("pickup_types", optname)) { /* 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; } else if (!strcmp("runmode", optname)) { const char *mode_name; menu_item *mode_pick = (menu_item *)0; tmpwin = create_nhwindow(NHW_MENU); start_menu(tmpwin); for (i = 0; i < SIZE(runmodes); i++) { mode_name = runmodes[i]; any.a_int = i + 1; add_menu(tmpwin, NO_GLYPH, &any, *mode_name, 0, ATR_NONE, mode_name, MENU_UNSELECTED); } end_menu(tmpwin, "Select run/travel display mode:"); if (select_menu(tmpwin, PICK_ONE, &mode_pick) > 0) { iflags.runmode = mode_pick->item.a_int - 1; free((genericptr_t)mode_pick); } destroy_nhwindow(tmpwin); retval = TRUE; } #ifdef TTY_GRAPHICS else if (!strcmp("msg_window", optname)) { /* by Christian W. Cooper */ menu_item *window_pick = (menu_item *)0; tmpwin = create_nhwindow(NHW_MENU); start_menu(tmpwin); any.a_char = 's'; add_menu(tmpwin, NO_GLYPH, &any, 's', 0, ATR_NONE, "single", MENU_UNSELECTED); any.a_char = 'c'; add_menu(tmpwin, NO_GLYPH, &any, 'c', 0, ATR_NONE, "combination", MENU_UNSELECTED); any.a_char = 'f'; add_menu(tmpwin, NO_GLYPH, &any, 'f', 0, ATR_NONE, "full", MENU_UNSELECTED); any.a_char = 'r'; add_menu(tmpwin, NO_GLYPH, &any, 'r', 0, ATR_NONE, "reversed", MENU_UNSELECTED); end_menu(tmpwin, "Select message history display type:"); if (select_menu(tmpwin, PICK_ONE, &window_pick) > 0) { iflags.prevmsg_window = window_pick->item.a_char; free((genericptr_t)window_pick); } destroy_nhwindow(tmpwin); retval = TRUE; } #endif else if (!strcmp("align_message", optname) || !strcmp("align_status", optname)) { menu_item *window_pick = (menu_item *)0; char abuf[BUFSZ]; boolean msg = (*(optname+6) == 'm'); tmpwin = create_nhwindow(NHW_MENU); start_menu(tmpwin); any.a_int = ALIGN_TOP; add_menu(tmpwin, NO_GLYPH, &any, 't', 0, ATR_NONE, "top", MENU_UNSELECTED); any.a_int = ALIGN_BOTTOM; add_menu(tmpwin, NO_GLYPH, &any, 'b', 0, ATR_NONE, "bottom", MENU_UNSELECTED); any.a_int = ALIGN_LEFT; add_menu(tmpwin, NO_GLYPH, &any, 'l', 0, ATR_NONE, "left", MENU_UNSELECTED); any.a_int = ALIGN_RIGHT; add_menu(tmpwin, NO_GLYPH, &any, 'r', 0, ATR_NONE, "right", MENU_UNSELECTED); Sprintf(abuf, "Select %s window placement relative to the map:", msg ? "message" : "status"); end_menu(tmpwin, abuf); if (select_menu(tmpwin, PICK_ONE, &window_pick) > 0) { if (msg) iflags.wc_align_message = window_pick->item.a_int; else iflags.wc_align_status = window_pick->item.a_int; free((genericptr_t)window_pick); } destroy_nhwindow(tmpwin); retval = TRUE; } else if (!strcmp("number_pad", optname)) { static const char *npchoices[3] = {"0 (off)", "1 (on)", "2 (on, DOS compatible)"}; const char *npletters = "abc"; menu_item *mode_pick = (menu_item *)0; tmpwin = create_nhwindow(NHW_MENU); start_menu(tmpwin); for (i = 0; i < SIZE(npchoices); i++) { any.a_int = i + 1; add_menu(tmpwin, NO_GLYPH, &any, npletters[i], 0, ATR_NONE, npchoices[i], MENU_UNSELECTED); } end_menu(tmpwin, "Select number_pad mode:"); if (select_menu(tmpwin, PICK_ONE, &mode_pick) > 0) { int mode = mode_pick->item.a_int - 1; switch(mode) { case 2: iflags.num_pad = 1; iflags.num_pad_mode = 1; break; case 1: iflags.num_pad = 1; iflags.num_pad_mode = 0; break; case 0: default: iflags.num_pad = 0; iflags.num_pad_mode = 0; } free((genericptr_t)mode_pick); number_pad(iflags.num_pad); } destroy_nhwindow(tmpwin); retval = TRUE; } else if (!strcmp("menu_headings", optname)) { static const char *mhchoices[3] = {"bold", "inverse", "underline"}; const char *npletters = "biu"; menu_item *mode_pick = (menu_item *)0; tmpwin = create_nhwindow(NHW_MENU); start_menu(tmpwin); for (i = 0; i < SIZE(mhchoices); i++) { any.a_int = i + 1; add_menu(tmpwin, NO_GLYPH, &any, npletters[i], 0, ATR_NONE, mhchoices[i], MENU_UNSELECTED); } end_menu(tmpwin, "How to highlight menu headings:"); if (select_menu(tmpwin, PICK_ONE, &mode_pick) > 0) { int mode = mode_pick->item.a_int - 1; switch(mode) { case 2: iflags.menu_headings = ATR_ULINE; break; case 0: iflags.menu_headings = ATR_BOLD; break; case 1: default: iflags.menu_headings = ATR_INVERSE; } free((genericptr_t)mode_pick); } destroy_nhwindow(tmpwin); retval = TRUE; #ifdef AUTOPICKUP_EXCEPTIONS } else if (!strcmp("autopickup_exception", optname)) { boolean retval; int pick_cnt, pick_idx, opt_idx, pass; int totalapes = 0, numapes[2] = {0,0}; menu_item *pick_list = (menu_item *)0; anything any; char apebuf[BUFSZ]; struct autopickup_exception *ape; static const char *action_titles[] = { "a", "add new autopickup exception", "l", "list autopickup exceptions", "r", "remove existing autopickup exception", "e", "exit this menu", }; ape_again: opt_idx = 0; totalapes = count_ape_maps(&numapes[AP_LEAVE], &numapes[AP_GRAB]); tmpwin = create_nhwindow(NHW_MENU); start_menu(tmpwin); any.a_int = 0; for (i = 0; i < SIZE(action_titles) ; i += 2) { any.a_int++; if (!totalapes && (i >= 2 && i < 6)) continue; add_menu(tmpwin, NO_GLYPH, &any, *action_titles[i], 0, ATR_NONE, action_titles[i+1], MENU_UNSELECTED); } end_menu(tmpwin, "Do what?"); if ((pick_cnt = select_menu(tmpwin, PICK_ONE, &pick_list)) > 0) { for (pick_idx = 0; pick_idx < pick_cnt; ++pick_idx) { opt_idx = pick_list[pick_idx].item.a_int - 1; } free((genericptr_t)pick_list); pick_list = (menu_item *)0; } destroy_nhwindow(tmpwin); if (pick_cnt < 1) return FALSE; if (opt_idx == 0) { /* add new */ getlin("What new autopickup exception pattern?", &apebuf[1]); if (apebuf[1] == '\033') return FALSE; apebuf[0] = '"'; Strcat(apebuf,"\""); add_autopickup_exception(apebuf); goto ape_again; } else if (opt_idx == 3) { retval = TRUE; } else { /* remove */ tmpwin = create_nhwindow(NHW_MENU); start_menu(tmpwin); for (pass = AP_LEAVE; pass <= AP_GRAB; ++pass) { if (numapes[pass] == 0) continue; ape = iflags.autopickup_exceptions[pass]; any.a_void = 0; add_menu(tmpwin, NO_GLYPH, &any, 0, 0, iflags.menu_headings, (pass == 0) ? "Never pickup" : "Always pickup", MENU_UNSELECTED); for (i = 0; i < numapes[pass] && ape; i++) { any.a_void = (opt_idx == 1) ? 0 : ape; Sprintf(apebuf, "\"%s\"", ape->pattern); add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, apebuf, MENU_UNSELECTED); ape = ape->next; } } Sprintf(apebuf, "%s autopickup exceptions", (opt_idx == 1) ? "List of" : "Remove which"); end_menu(tmpwin, apebuf); pick_cnt = select_menu(tmpwin, (opt_idx == 1) ? PICK_NONE : PICK_ANY, &pick_list); if (pick_cnt > 0) { for (pick_idx = 0; pick_idx < pick_cnt; ++pick_idx) remove_autopickup_exception( (struct autopickup_exception *)pick_list[pick_idx].item.a_void); } free((genericptr_t)pick_list); pick_list = (menu_item *)0; destroy_nhwindow(tmpwin); goto ape_again; } retval = TRUE; #endif /* AUTOPICKUP_EXCEPTIONS */ } return retval; } #define rolestring(val,array,field) ((val >= 0) ? array[val].field : \ (val == ROLE_RANDOM) ? randomrole : none) /* This is ugly. We have all the option names in the compopt[] array, but we need to look at each option individually to get the value. */ STATIC_OVL const char * get_compopt_value(optname, buf) const char *optname; char *buf; { 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)); #ifdef WIN32CON else if (!strcmp(optname,"altkeyhandler")) Sprintf(buf, "%s", iflags.altkeyhandler[0] ? iflags.altkeyhandler : "default"); #endif 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, "ghoulname")) Sprintf(buf, "%s", ghoulname[0] ? ghoulname : none ); 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")) Sprintf(buf, "%s", to_be_done); else if (!strcmp(optname, "menu_deselect_page")) Sprintf(buf, "%s", to_be_done); else if (!strcmp(optname, "menu_first_page")) Sprintf(buf, "%s", to_be_done); else if (!strcmp(optname, "menu_invert_all")) Sprintf(buf, "%s", to_be_done); else if (!strcmp(optname, "menu_headings")) { Sprintf(buf, "%s", (iflags.menu_headings == ATR_BOLD) ? "bold" : (iflags.menu_headings == ATR_INVERSE) ? "inverse" : (iflags.menu_headings == ATR_ULINE) ? "underline" : "unknown"); } else if (!strcmp(optname, "menu_invert_page")) Sprintf(buf, "%s", to_be_done); else if (!strcmp(optname, "menu_last_page")) Sprintf(buf, "%s", to_be_done); else if (!strcmp(optname, "menu_next_page")) Sprintf(buf, "%s", to_be_done); else if (!strcmp(optname, "menu_previous_page")) Sprintf(buf, "%s", to_be_done); else if (!strcmp(optname, "menu_search")) Sprintf(buf, "%s", to_be_done); else if (!strcmp(optname, "menu_select_all")) Sprintf(buf, "%s", to_be_done); else if (!strcmp(optname, "menu_select_page")) Sprintf(buf, "%s", to_be_done); else if (!strcmp(optname, "monsters")) Sprintf(buf, "%s", to_be_done); else if (!strcmp(optname, "msghistory")) Sprintf(buf, "%u", iflags.msg_history); #ifdef TTY_GRAPHICS else if (!strcmp(optname, "msg_window")) Sprintf(buf, "%s", (iflags.prevmsg_window=='s') ? "single" : (iflags.prevmsg_window=='c') ? "combination" : (iflags.prevmsg_window=='f') ? "full" : "reversed"); #endif else if (!strcmp(optname, "name")) Sprintf(buf, "%s", plname); else if (!strcmp(optname, "number_pad")) Sprintf(buf, "%s", (!iflags.num_pad) ? "0=off" : (iflags.num_pad_mode) ? "2=on, DOS compatible" : "1=on"); else if (!strcmp(optname, "objects")) Sprintf(buf, "%s", to_be_done); else if (!strcmp(optname, "packorder")) { oc_to_str(flags.inv_order, ocl); Sprintf(buf, "%s", ocl); } #ifdef CHANGE_COLOR else if (!strcmp(optname, "palette")) Sprintf(buf, "%s", get_color_string()); #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")) { oc_to_str(flags.pickup_types, ocl); Sprintf(buf, "%s", ocl[0] ? ocl : "all" ); } else if (!strcmp(optname, "race")) Sprintf(buf, "%s", rolestring(flags.initrace, races, noun)); else if (!strcmp(optname, "role")) Sprintf(buf, "%s", rolestring(flags.initrole, roles, name.m)); else if (!strcmp(optname, "runmode")) Sprintf(buf, "%s", runmodes[iflags.runmode]); 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_amount")) { if (iflags.wc_scroll_amount) Sprintf(buf, "%d",iflags.wc_scroll_amount); else Strcpy(buf, defopt); } 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); #endif else if (!strcmp(optname, "suppress_alert")) { if (flags.suppress_alert == 0L) Strcpy(buf, none); else Sprintf(buf, "%lu.%lu.%lu", 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, "tileset")) Sprintf(buf, "%s", tileset[0] ? tileset : none ); 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); #endif #ifdef VIDEOSHADES # ifdef MSDOS else if (!strcmp(optname, "videoshades")) Sprintf(buf, "%s-%s-%s", shade[0],shade[1],shade[2]); else if (!strcmp(optname, "videocolors")) Sprintf(buf, "%d-%d-%d-%d-%d-%d-%d-%d-%d-%d-%d-%d", ttycolors[CLR_RED], ttycolors[CLR_GREEN], ttycolors[CLR_BROWN], ttycolors[CLR_BLUE], ttycolors[CLR_MAGENTA], ttycolors[CLR_CYAN], ttycolors[CLR_ORANGE], ttycolors[CLR_BRIGHT_GREEN], ttycolors[CLR_YELLOW], ttycolors[CLR_BRIGHT_BLUE], ttycolors[CLR_BRIGHT_MAGENTA], ttycolors[CLR_BRIGHT_CYAN]); # else else if (!strcmp(optname, "videocolors")) Sprintf(buf, "%d-%d-%d-%d-%d-%d-%d-%d-%d-%d-%d-%d-%d-%d-%d", ttycolors[CLR_RED], ttycolors[CLR_GREEN], ttycolors[CLR_BROWN], ttycolors[CLR_BLUE], ttycolors[CLR_MAGENTA], ttycolors[CLR_CYAN], ttycolors[CLR_GRAY], ttycolors[CLR_BLACK], ttycolors[CLR_ORANGE], ttycolors[CLR_BRIGHT_GREEN], ttycolors[CLR_YELLOW], ttycolors[CLR_BRIGHT_BLUE], ttycolors[CLR_BRIGHT_MAGENTA], ttycolors[CLR_BRIGHT_CYAN], ttycolors[CLR_WHITE]); # endif /* MSDOS */ #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); else if (!strcmp(optname, "wolfname")) Sprintf(buf, "%s", wolfname[0] ? wolfname : none ); #ifdef PREFIXES_IN_USE else { for (i = 0; i < PREFIX_COUNT; ++i) if (!strcmp(optname, fqn_prefix_names[i]) && fqn_prefix[i]) Sprintf(buf, "%s", fqn_prefix[i]); } #endif if (buf[0]) return buf; else return "unknown"; } int dotogglepickup() { char buf[BUFSZ], ocl[MAXOCLASSES+1]; flags.pickup = !flags.pickup; if (flags.pickup) { oc_to_str(flags.pickup_types, ocl); Sprintf(buf, "ON, for %s objects%s", ocl[0] ? ocl : "all", #ifdef AUTOPICKUP_EXCEPTIONS (iflags.autopickup_exceptions[AP_LEAVE] || iflags.autopickup_exceptions[AP_GRAB]) ? ((count_ape_maps((int *)0, (int *)0) == 1) ? ", with one exception" : ", with some exceptions") : #endif ""); } else { Strcpy(buf, "OFF"); } pline("Autopickup: %s.", buf); return 0; } #ifdef AUTOPICKUP_EXCEPTIONS int add_autopickup_exception(mapping) const char *mapping; { struct autopickup_exception *ape, **apehead; char text[256], *text2; int textsize = 0; boolean grab = FALSE; if (sscanf(mapping, "\"%255[^\"]\"", text) == 1) { text2 = &text[0]; if (*text2 == '<') { /* force autopickup */ grab = TRUE; ++text2; } else if (*text2 == '>') { /* default - Do not pickup */ grab = FALSE; ++text2; } textsize = strlen(text2); apehead = (grab) ? &iflags.autopickup_exceptions[AP_GRAB] : &iflags.autopickup_exceptions[AP_LEAVE]; ape = (struct autopickup_exception *) alloc(sizeof(struct autopickup_exception)); ape->pattern = (char *) alloc(textsize+1); Strcpy(ape->pattern, text2); ape->grab = grab; if (!*apehead) ape->next = (struct autopickup_exception *)0; else ape->next = *apehead; *apehead = ape; } else { raw_print("syntax error in AUTOPICKUP_EXCEPTION"); return 0; } return 1; } STATIC_OVL void remove_autopickup_exception(whichape) struct autopickup_exception *whichape; { struct autopickup_exception *ape, *prev = 0; int chain = whichape->grab ? AP_GRAB : AP_LEAVE; for (ape = iflags.autopickup_exceptions[chain]; ape;) { if (ape == whichape) { struct autopickup_exception *freeape = ape; ape = ape->next; if (prev) prev->next = ape; else iflags.autopickup_exceptions[chain] = ape; free(freeape->pattern); free(freeape); } else { prev = ape; ape = ape->next; } } } STATIC_OVL int count_ape_maps(leave, grab) int *leave, *grab; { struct autopickup_exception *ape; int pass, totalapes, numapes[2] = {0,0}; for (pass = AP_LEAVE; pass <= AP_GRAB; ++pass) { ape = iflags.autopickup_exceptions[pass]; while(ape) { ape = ape->next; numapes[pass]++; } } totalapes = numapes[AP_LEAVE] + numapes[AP_GRAB]; if (leave) *leave = numapes[AP_LEAVE]; if (grab) *grab = numapes[AP_GRAB]; return totalapes; } void free_autopickup_exceptions() { struct autopickup_exception *ape; int pass; for (pass = AP_LEAVE; pass <= AP_GRAB; ++pass) { while((ape = iflags.autopickup_exceptions[pass]) != 0) { free(ape->pattern); iflags.autopickup_exceptions[pass] = ape->next; free(ape); } } } #endif /* AUTOPICKUP_EXCEPTIONS */ /* data for option_help() */ static const char *opt_intro[] = { "", " SlashEM Options Help:", "", #define CONFIG_SLOT 3 /* fill in next value at run-time */ (char *)0, #define ENV_SLOT 4 /* substitute variable name in next value at run-time */ #if !defined(MICRO) && !defined(MAC) "or use `%s=\"\"' in your environment", #endif "( is a list of options separated by commas)", #ifdef VMS "-- for example, $ DEFINE %s \"noautopickup,fruit:kumquat\"", #endif "or press \"O\" while playing and use the menu.", "", "Boolean options (which can be negated by prefixing them with '!' or \"no\"):", (char *)0 }; static const char *opt_epilog[] = { "", "Some of the options can be set only before the game is started; those", "items will not be selectable in the 'O' command's menu.", (char *)0 }; void option_help() { char buf[BUFSZ], buf2[BUFSZ]; register int i; 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++) if (i==ENV_SLOT) { Sprintf(buf2, opt_intro[ENV_SLOT], NETHACK_ENV_OPTIONS); putstr(datawin, 0, buf2);; } else putstr(datawin, 0, opt_intro[i]); /* Boolean options */ for (i = 0; boolopt[i].name; i++) { if (boolopt[i].addr) { #ifdef WIZARD #ifndef OBJ_SANITY if (boolopt[i].addr == &iflags.sanity_check && !wizard) continue; #endif if (boolopt[i].addr == &iflags.menu_tab_sep && !wizard) continue; #endif next_opt(datawin, boolopt[i].name); } } next_opt(datawin, ""); /* Compound options */ putstr(datawin, 0, "Compound options:"); for (i = 0; compopt[i].name; i++) { Sprintf(buf2, "`%s'", compopt[i].name); Sprintf(buf, "%-20s - %s%c", buf2, compopt[i].descr, compopt[i+1].name ? ',' : '.'); putstr(datawin, 0, buf); } for (i = 0; opt_epilog[i]; i++) putstr(datawin, 0, opt_epilog[i]); display_nhwindow(datawin, FALSE); destroy_nhwindow(datawin); return; } /* * prints the next boolean option, on the same line if possible, on a new * line if not. End with next_opt(""). */ void next_opt(datawin, str) winid datawin; const char *str; { static char *buf = 0; int i; char *s; if (!buf) *(buf = (char *)alloc(BUFSZ)) = '\0'; if (!*str) { s = eos(buf); if (s > &buf[1] && s[-2] == ',') Strcpy(s - 2, "."); /* replace last ", " */ i = COLNO; /* (greater than COLNO - 2) */ } else { i = strlen(buf) + strlen(str) + 2; } if (i > COLNO - 2) { /* rule of thumb */ putstr(datawin, 0, buf); buf[0] = 0; } if (*str) { Strcat(buf, str); Strcat(buf, ", "); } else { putstr(datawin, 0, str); free(buf), buf = 0; } return; } /* Returns the fid of the fruit type; if that type already exists, it * returns the fid of that one; if it does not exist, it adds a new fruit * type to the chain and returns the new one. */ int fruitadd(str) char *str; { register int i; register struct fruit *f; struct fruit *lastf = 0; int highest_fruit_id = 0; char buf[PL_FSIZ]; boolean user_specified = (str == pl_fruit); /* if not user-specified, then it's a fruit name for a fruit on * a bones level... */ /* Note: every fruit has an id (spe for fruit objects) of at least * 1; 0 is an error. */ if (user_specified) { /* disallow naming after other foods (since it'd be impossible * to tell the difference) */ boolean found = FALSE, numeric = FALSE; for (i = bases[FOOD_CLASS]; objects[i].oc_class == FOOD_CLASS; i++) { if (!strcmp(OBJ_NAME(objects[i]), pl_fruit)) { found = TRUE; break; } } { char *c; c = pl_fruit; for(c = pl_fruit; *c >= '0' && *c <= '9'; c++) ; if (isspace(*c) || *c == 0) numeric = TRUE; } if (found || numeric || !strncmp(str, "cursed ", 7) || !strncmp(str, "uncursed ", 9) || !strncmp(str, "blessed ", 8) || !strncmp(str, "partly eaten ", 13) || (!strncmp(str, "tin of ", 7) && (!strcmp(str+7, "spinach") || name_to_mon(str+7) >= LOW_PM)) || !strcmp(str, "empty tin") || ((!strncmp(eos(str)-7," corpse",7) || !strncmp(eos(str)-4, " egg",4)) && name_to_mon(str) >= LOW_PM)) { Strcpy(buf, pl_fruit); Strcpy(pl_fruit, "candied "); nmcpy(pl_fruit+8, buf, PL_FSIZ-8); } } for(f=ffruit; f; f = f->nextf) { lastf = f; if(f->fid > highest_fruit_id) highest_fruit_id = f->fid; if(!strncmp(str, f->fname, PL_FSIZ)) goto nonew; } /* if adding another fruit would overflow spe, use a random fruit instead... we've got a lot to choose from. */ if (highest_fruit_id >= 127) return rnd(127); highest_fruit_id++; f = newfruit(); if (ffruit) lastf->nextf = f; else ffruit = f; Strcpy(f->fname, str); f->fid = highest_fruit_id; f->nextf = 0; nonew: if (user_specified) current_fruit = highest_fruit_id; return f->fid; } /* * This is a somewhat generic menu for taking a list of NetHack style * class choices and presenting them via a description * rather than the traditional NetHack characters. * (Benefits users whose first exposure to NetHack is via tiles). * * prompt * The title at the top of the menu. * * category: 0 = monster class * 1 = object class * * way * FALSE = PICK_ONE, TRUE = PICK_ANY * * class_list * a null terminated string containing the list of choices. * * class_selection * a null terminated string containing the selected characters. * * Returns number selected. */ int choose_classes_menu(prompt, category, way, class_list, class_select) const char *prompt; int category; boolean way; char *class_list; char *class_select; { menu_item *pick_list = (menu_item *)0; winid win; anything any; char buf[BUFSZ]; int i, n; int ret; int next_accelerator, accelerator; if (class_list == (char *)0 || class_select == (char *)0) return 0; accelerator = 0; next_accelerator = 'a'; any.a_void = 0; win = create_nhwindow(NHW_MENU); start_menu(win); while (*class_list) { const char *text; boolean selected; text = (char *)0; selected = FALSE; switch (category) { case 0: text = monexplain[def_char_to_monclass(*class_list)]; accelerator = *class_list; Sprintf(buf, "%s", text); break; case 1: text = objexplain[def_char_to_objclass(*class_list)]; accelerator = next_accelerator; Sprintf(buf, "%c %s", *class_list, text); break; default: impossible("choose_classes_menu: invalid category %d", category); } if (way && *class_select) { /* Selections there already */ if (index(class_select, *class_list)) { selected = TRUE; } } any.a_int = *class_list; add_menu(win, NO_GLYPH, &any, accelerator, category ? *class_list : 0, ATR_NONE, buf, selected); ++class_list; if (category > 0) { ++next_accelerator; if (next_accelerator == ('z' + 1)) next_accelerator = 'A'; if (next_accelerator == ('Z' + 1)) break; } } end_menu(win, prompt); n = select_menu(win, way ? PICK_ANY : PICK_ONE, &pick_list); destroy_nhwindow(win); if (n > 0) { for (i = 0; i < n; ++i) *class_select++ = (char)pick_list[i].item.a_int; free((genericptr_t)pick_list); ret = n; } else if (n == -1) { class_select = eos(class_select); ret = -1; } else 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}, {"popup_dialog", WC_POPUP_DIALOG}, {"player_selection", WC_PLAYER_SELECTION}, {"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_amount", WC_SCROLL_AMOUNT}, {"scroll_margin", WC_SCROLL_MARGIN}, {"splash_screen", WC_SPLASH_SCREEN}, {"vary_msgcount",WC_VARY_MSGCOUNT}, {"windowcolors", WC_WINDOWCOLORS}, {"mouse_support", WC_MOUSE_SUPPORT}, {(char *)0, 0L} }; struct wc_Opt wc2_options[] = { {"fullscreen", WC2_FULLSCREEN}, {"softkeyboard", WC2_SOFTKEYBOARD}, {"wraptext", WC2_WRAPTEXT}, {(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) const 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_wc_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; } /* * You can set several wc2_options in one call to * set_wc2_option_mod_status() by setting * the appropriate bits for each option that you * are setting in the optmask argument * prior to calling. * example: set_wc2_option_mod_status(WC2_FULLSCREEN|WC2_SOFTKEYBOARD|WC2_WRAPTEXT, SET_IN_FILE); */ void set_wc2_option_mod_status(optmask, status) unsigned long optmask; int status; { int k = 0; if (status < SET_IN_FILE || status > SET_IN_GAME) { impossible("set_wc2_option_mod_status: status out of range %d.", status); return; } while (wc2_options[k].wc_name) { if (optmask & wc2_options[k].wc_bit) { set_option_mod_status(wc2_options[k].wc_name, status); } k++; } } STATIC_OVL boolean is_wc2_option(optnam) const char *optnam; { int k = 0; while (wc2_options[k].wc_name) { if (strcmp(wc2_options[k].wc_name, optnam) == 0) return TRUE; k++; } return FALSE; } STATIC_OVL boolean wc2_supported(optnam) const char *optnam; { int k = 0; while (wc2_options[k].wc_name) { if (!strcmp(wc2_options[k].wc_name, optnam) && (windowprocs.wincap2 & wc2_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 const char *wnames[] = { "menu", "message", "status", "text" }; static const 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 */ /*options.c*/ slashem-0.0.7E7F3/src/makemon.c0000664000076400007640000022155010545462317014243 0ustar aliali/* SCCS Id: @(#)makemon.c 3.4 2003/09/06 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" #include "epri.h" #include "emin.h" #include "edog.h" #ifdef REINCARNATION #include #endif 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 *)); #endif /* OVL0 */ STATIC_DCL boolean FDECL(wrong_elem_type, (struct permonst *)); STATIC_DCL void FDECL(m_initgrp,(struct monst *,int,int,int)); STATIC_DCL void FDECL(m_initthrow,(struct monst *,int,int)); STATIC_DCL void FDECL(m_initweap,(struct monst *)); STATIC_DCL void FDECL(m_initweap_normal,(struct monst *)); #ifdef OVL1 STATIC_DCL void FDECL(m_initinv,(struct monst *)); #endif /* OVL1 */ extern const int monstr[]; #define m_initsgrp(mtmp, x, y) m_initgrp(mtmp, x, y, 3) #define m_initlgrp(mtmp, x, y) m_initgrp(mtmp, x, y, 10) #define m_initvlgrp(mtmp, x, y) m_initgrp(mtmp, x, y, 20) #define toostrong(monindx, lev) (monstr[monindx] > lev) #define tooweak(monindx, lev) (monstr[monindx] < lev) #ifdef OVLB boolean is_home_elemental(ptr) register struct permonst *ptr; { if (ptr->mlet == S_ELEMENTAL) switch (monsndx(ptr)) { case PM_AIR_ELEMENTAL: return Is_airlevel(&u.uz); case PM_FIRE_ELEMENTAL: return Is_firelevel(&u.uz); case PM_EARTH_ELEMENTAL: return Is_earthlevel(&u.uz); case PM_WATER_ELEMENTAL: return Is_waterlevel(&u.uz); } return FALSE; } /* * Return true if the given monster cannot exist on this elemental level. */ STATIC_OVL boolean wrong_elem_type(ptr) register struct permonst *ptr; { if (ptr->mlet == S_ELEMENTAL) { return((boolean)(!is_home_elemental(ptr))); } else if (Is_earthlevel(&u.uz)) { /* no restrictions? */ } else if (Is_waterlevel(&u.uz)) { /* just monsters that can swim */ if(!is_swimmer(ptr)) return TRUE; } else if (Is_firelevel(&u.uz)) { if (!pm_resistance(ptr,MR_FIRE)) return TRUE; } else if (Is_airlevel(&u.uz)) { if(!(is_flyer(ptr) && ptr->mlet != S_TRAPPER) && !is_floater(ptr) && !amorphous(ptr) && !noncorporeal(ptr) && !is_whirly(ptr)) return TRUE; } return FALSE; } STATIC_OVL void m_initgrp(mtmp, x, y, n) /* make a group just like mtmp */ register struct monst *mtmp; register int x, y, n; { coord mm; register int cnt = rnd(n); struct monst *mon; #if defined(__GNUC__) && (defined(HPUX) || defined(DGUX)) /* There is an unresolved problem with several people finding that * the game hangs eating CPU; if interrupted and restored, the level * will be filled with monsters. Of those reports giving system type, * there were two DG/UX and two HP-UX, all using gcc as the compiler. * hcroft@hpopb1.cern.ch, using gcc 2.6.3 on HP-UX, says that the * problem went away for him and another reporter-to-newsgroup * after adding this debugging code. This has almost got to be a * compiler bug, but until somebody tracks it down and gets it fixed, * might as well go with the "but it went away when I tried to find * it" code. */ int cnttmp,cntdiv; cnttmp = cnt; # ifdef DEBUG pline("init group call x=%d,y=%d,n=%d,cnt=%d.", x, y, n, cnt); # endif cntdiv = ((u.ulevel < 3) ? 4 : (u.ulevel < 5) ? 2 : 1); #endif /* Tuning: cut down on swarming at low character levels [mrs] */ if (u.ulevel < 5) cnt /= 2; #if defined(__GNUC__) && (defined(HPUX) || defined(DGUX)) if (cnt != (cnttmp/cntdiv)) { pline("cnt=%d using %d, cnttmp=%d, cntdiv=%d", cnt, (u.ulevel < 3) ? 4 : (u.ulevel < 5) ? 2 : 1, cnttmp, cntdiv); } #endif if(!cnt) cnt++; #if defined(__GNUC__) && (defined(HPUX) || defined(DGUX)) if (cnt < 0) cnt = 1; if (cnt > 10) cnt = 10; #endif mm.x = x; mm.y = y; while(cnt--) { if (peace_minded(mtmp->data)) continue; /* Don't create groups of peaceful monsters since they'll get * in our way. If the monster has a percentage chance so some * are peaceful and some are not, the result will just be a * smaller group. */ 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 * didn't create it at all; we don't want a second check. */ } } } STATIC_OVL void m_initthrow(mtmp,otyp,oquan) struct monst *mtmp; int otyp,oquan; { register struct obj *otmp; otmp = mksobj(otyp, TRUE, FALSE); otmp->quan = (long) rn1(oquan, 3); otmp->owt = weight(otmp); if (otyp == ORCISH_ARROW) otmp->opoisoned = TRUE; (void) mpickobj(mtmp, otmp); } #endif /* OVLB */ #ifdef OVL2 STATIC_OVL void m_initweap_normal(mtmp) register struct monst *mtmp; { register struct permonst *ptr = mtmp->data; int bias; bias = is_lord(ptr) + is_prince(ptr) * 2 + extra_nasty(ptr); switch(rnd(14 - (2 * bias))) { case 1: if(strongmonst(ptr)) (void) mongets(mtmp, BATTLE_AXE); else m_initthrow(mtmp, DART, 12); break; case 2: if(strongmonst(ptr)) (void) mongets(mtmp, TWO_HANDED_SWORD); else { (void) mongets(mtmp, CROSSBOW); m_initthrow(mtmp, CROSSBOW_BOLT, 12); } break; case 3: (void) mongets(mtmp, BOW); m_initthrow(mtmp, ARROW, 12); break; case 4: if(strongmonst(ptr)) (void) mongets(mtmp, LONG_SWORD); else m_initthrow(mtmp, DAGGER, 3); break; case 5: if(strongmonst(ptr)) (void) mongets(mtmp, LUCERN_HAMMER); else (void) mongets(mtmp, AKLYS); break; /* [Tom] added some more */ case 6: if(strongmonst(ptr)) (void) mongets(mtmp, AXE); else (void) mongets(mtmp, SHORT_SWORD); break; case 7: if(strongmonst(ptr)) (void) mongets(mtmp, MACE); else (void) mongets(mtmp, CLUB); break; default: break; } return; } STATIC_OVL void m_initweap(mtmp) register struct monst *mtmp; { register struct permonst *ptr = mtmp->data; register int mm = monsndx(ptr); struct obj *otmp; #ifdef REINCARNATION if (Is_rogue_level(&u.uz)) return; #endif /* * first a few special cases: * * giants get a boulder to throw sometimes. * ettins get clubs * kobolds get darts to throw * centaurs get some sort of bow & arrows or bolts * soldiers get all sorts of things. * kops get clubs & cream pies. */ switch (ptr->mlet) { case S_GIANT: if (rn2(2)) (void)mongets(mtmp, (mm != PM_ETTIN) ? BOULDER : CLUB); break; case S_HUMAN: if(is_mercenary(ptr) || mm == PM_SHOPKEEPER #ifdef YEOMAN || mm == PM_CHIEF_YEOMAN_WARDER || mm == PM_YEOMAN_WARDER #endif ) { int w1 = 0, w2 = 0; switch (mm) { case PM_SOLDIER: #ifdef FIREARMS w1 = rn2(2) ? RIFLE : SUBMACHINE_GUN; m_initthrow(mtmp, BULLET, 25); m_initthrow(mtmp, BULLET, 25); w2 = rn2(2) ? KNIFE : DAGGER; (void) mongets(mtmp, FRAG_GRENADE); break; #endif case PM_WATCHMAN: if (!rn2(3)) { w1 = rn1(BEC_DE_CORBIN - PARTISAN + 1, PARTISAN); w2 = rn2(2) ? DAGGER : KNIFE; } else w1 = rn2(2) ? SPEAR : SHORT_SWORD; break; case PM_WATCH_CAPTAIN: w1 = rn2(2) ? LONG_SWORD : SILVER_SABER; break; case PM_LIEUTENANT: #ifdef FIREARMS if (rn2(2)) { w1 = HEAVY_MACHINE_GUN; m_initthrow(mtmp, BULLET, 50); m_initthrow(mtmp, BULLET, 50); m_initthrow(mtmp, BULLET, 50); } else { w1 = SUBMACHINE_GUN; m_initthrow(mtmp, BULLET, 30); m_initthrow(mtmp, BULLET, 30); } w2 = rn2(2) ? KNIFE : DAGGER; if (rn2(2)) { (void) mongets(mtmp, FRAG_GRENADE); (void) mongets(mtmp, FRAG_GRENADE); } else { (void) mongets(mtmp, GAS_GRENADE); (void) mongets(mtmp, GAS_GRENADE); } break; #endif case PM_SERGEANT: #ifdef FIREARMS if (rn2(2)) { w1 = AUTO_SHOTGUN; m_initthrow(mtmp, SHOTGUN_SHELL, 10); m_initthrow(mtmp, SHOTGUN_SHELL, 10); } else { w1 = ASSAULT_RIFLE; m_initthrow(mtmp, BULLET, 30); m_initthrow(mtmp, BULLET, 30); } w2= rn2(2) ? DAGGER : KNIFE; if (rn2(2)) { m_initthrow(mtmp, FRAG_GRENADE, 5); } else { m_initthrow(mtmp, GAS_GRENADE, 5); } if (!rn2(5)) (void) mongets(mtmp, GRENADE_LAUNCHER); break; #endif #ifdef YEOMAN case PM_YEOMAN_WARDER: #endif w1 = rn2(2) ? FLAIL : MACE; break; case PM_CAPTAIN: #ifdef FIREARMS if (rn2(2)) { w1 = AUTO_SHOTGUN; m_initthrow(mtmp, SHOTGUN_SHELL, 20); m_initthrow(mtmp, SHOTGUN_SHELL, 20); } else if (rn2(2)) { w1 = HEAVY_MACHINE_GUN; m_initthrow(mtmp, BULLET, 60); m_initthrow(mtmp, BULLET, 60); m_initthrow(mtmp, BULLET, 60); } else { w1 = ASSAULT_RIFLE; m_initthrow(mtmp, BULLET, 60); m_initthrow(mtmp, BULLET, 60); } if (rn2(2)) { w2 = ROCKET_LAUNCHER; m_initthrow(mtmp, ROCKET, 5); } else if (rn2(2)) { (void) mongets(mtmp, GRENADE_LAUNCHER); m_initthrow(mtmp, (rn2(2) ? FRAG_GRENADE : GAS_GRENADE), 5); } else { w2 = rn2(2) ? SILVER_SABER : DAGGER; } break; #endif #ifdef YEOMAN case PM_CHIEF_YEOMAN_WARDER: #endif w1 = rn2(2) ? BROADSWORD : LONG_SWORD; break; case PM_SHOPKEEPER: #ifdef FIREARMS (void) mongets(mtmp,SHOTGUN); m_initthrow(mtmp, SHOTGUN_SHELL, 20); m_initthrow(mtmp, SHOTGUN_SHELL, 20); m_initthrow(mtmp, SHOTGUN_SHELL, 20); #endif /* Fallthrough */ default: if (!rn2(4)) w1 = DAGGER; if (!rn2(7)) w2 = SPEAR; break; } if (w1) (void)mongets(mtmp, w1); if (!w2 && w1 != DAGGER && !rn2(4)) w2 = KNIFE; if (w2) (void)mongets(mtmp, w2); } else if (is_elf(ptr)) { if (mm == PM_DROW) { (void) mongets(mtmp, DARK_ELVEN_MITHRIL_COAT); (void) mongets(mtmp, DARK_ELVEN_SHORT_SWORD); (void) mongets(mtmp, DARK_ELVEN_BOW); m_initthrow(mtmp, DARK_ELVEN_ARROW, 12); } else { if (rn2(2)) (void) mongets(mtmp, !rn2(4) ? ELVEN_MITHRIL_COAT : ELVEN_CLOAK); if (!rn2(3)) (void)mongets(mtmp, ELVEN_LEATHER_HELM); else if (!rn2(4)) (void)mongets(mtmp, ELVEN_BOOTS); if (!rn2(3)) (void)mongets(mtmp, ELVEN_DAGGER); switch (rn2(3)) { case 0: if (!rn2(4)) (void)mongets(mtmp, ELVEN_SHIELD); if (rn2(3)) (void)mongets(mtmp, ELVEN_SHORT_SWORD); (void)mongets(mtmp, ELVEN_BOW); m_initthrow(mtmp, ELVEN_ARROW, 12); break; case 1: (void)mongets(mtmp, ELVEN_BROADSWORD); if (rn2(2)) (void)mongets(mtmp, ELVEN_SHIELD); break; case 2: if (rn2(2)) { (void)mongets(mtmp, ELVEN_SPEAR); (void)mongets(mtmp, ELVEN_SHIELD); } break; } if (mm == PM_ELVENKING) { if (rn2(3) || (in_mklev && Is_earthlevel(&u.uz))) (void)mongets(mtmp, PICK_AXE); if (!rn2(50)) (void)mongets(mtmp, CRYSTAL_BALL); } } /* normal elves */ } else /* enemy characters! */ if (mm >= PM_ARCHEOLOGIST && mm <= PM_WIZARD && rn2(4)) { switch (mm) { case PM_ARCHEOLOGIST: (void)mongets(mtmp, BULLWHIP); (void)mongets(mtmp, LEATHER_JACKET); (void)mongets(mtmp, FEDORA); if (rn2(2)) (void)mongets(mtmp, PICK_AXE); #ifndef GOLDOBJ mtmp->mgold = (long) d(mtmp->m_lev, 15); #else mkmonmoney(mtmp, (long) d(mtmp->m_lev, 15)); #endif break; case PM_BARBARIAN: (void)mongets(mtmp, BATTLE_AXE); if (!rn2(2)) (void)mongets(mtmp, TWO_HANDED_SWORD); (void)mongets(mtmp, RING_MAIL); #ifndef GOLDOBJ mtmp->mgold = (long) d(mtmp->m_lev, 15); #else mkmonmoney(mtmp, (long) d(mtmp->m_lev, 15)); #endif break; case PM_CAVEMAN: case PM_CAVEWOMAN: (void)mongets(mtmp, CLUB); if (rn2(3)) { (void)mongets(mtmp, BOW); m_initthrow(mtmp, ARROW, 18); } (void)mongets(mtmp, LEATHER_ARMOR); #ifndef GOLDOBJ mtmp->mgold = (long) d(mtmp->m_lev, 15); #else mkmonmoney(mtmp, (long) d(mtmp->m_lev, 15)); #endif break; case PM_DOPPELGANGER: (void)mongets(mtmp, SILVER_DAGGER); #ifndef GOLDOBJ mtmp->mgold = (long) d(mtmp->m_lev, 15); #else mkmonmoney(mtmp, (long) d(mtmp->m_lev, 15)); #endif break; case PM_ELF: /* gets taken care of later... */ /*(void)mongets(mtmp, ELVEN_SHORT_SWORD); if (rn2(3)) { (void)mongets(mtmp, ELVEN_BOW); m_initthrow(mtmp, ELVEN_ARROW, 18); } if (rn2(3)) (void)mongets(mtmp, ELVEN_CLOAK); else (void)mongets(mtmp, ELVEN_MITHRIL_COAT);*/ #ifndef GOLDOBJ mtmp->mgold = (long) d(mtmp->m_lev, 15); #else mkmonmoney(mtmp, (long) d(mtmp->m_lev, 15)); #endif break; case PM_FLAME_MAGE: (void)mongets(mtmp, QUARTERSTAFF); (void)mongets(mtmp, STUDDED_LEATHER_ARMOR); (void)mongets(mtmp, WAN_FIRE); #ifndef GOLDOBJ mtmp->mgold = (long) d(mtmp->m_lev, 15); #else mkmonmoney(mtmp, (long) d(mtmp->m_lev, 15)); #endif break; case PM_HEALER: (void)mongets(mtmp, SCALPEL); (void)mongets(mtmp, LEATHER_GLOVES); (void)mongets(mtmp, WAN_HEALING); (void)mongets(mtmp, WAN_SLEEP); #ifndef GOLDOBJ mtmp->mgold = (long) d(mtmp->m_lev, 20); #else mkmonmoney(mtmp, (long) d(mtmp->m_lev, 20)); #endif break; case PM_ICE_MAGE: (void)mongets(mtmp, QUARTERSTAFF); (void)mongets(mtmp, STUDDED_LEATHER_ARMOR); (void)mongets(mtmp, WAN_COLD); #ifndef GOLDOBJ mtmp->mgold = (long) d(mtmp->m_lev, 15); #else mkmonmoney(mtmp, (long) d(mtmp->m_lev, 15)); #endif break; #ifdef YEOMAN case PM_YEOMAN: #endif case PM_KNIGHT: (void)mongets(mtmp, LONG_SWORD); (void)mongets(mtmp, PLATE_MAIL); (void)mongets(mtmp, LARGE_SHIELD); (void)mongets(mtmp, HELMET); (void)mongets(mtmp, LEATHER_GLOVES); #ifndef GOLDOBJ mtmp->mgold = (long) d(mtmp->m_lev, 15); #else mkmonmoney(mtmp, (long) d(mtmp->m_lev, 15)); #endif break; case PM_MONK: #ifndef GOLDOBJ mtmp->mgold = (long) d(mtmp->m_lev, 5); #else mkmonmoney(mtmp, (long) d(mtmp->m_lev, 5)); #endif break; case PM_NECROMANCER: (void)mongets(mtmp, ATHAME); if (!rn2(4)) (void)mongets(mtmp, PICK_AXE); (void) mongets(mtmp, rnd_offensive_item(mtmp)); (void) mongets(mtmp, rnd_defensive_item(mtmp)); #ifndef GOLDOBJ mtmp->mgold = (long) d(mtmp->m_lev, 15); #else mkmonmoney(mtmp, (long) d(mtmp->m_lev, 15)); #endif break; case PM_PRIEST: case PM_PRIESTESS: (void)mongets(mtmp, MACE); (void)mongets(mtmp, rn1(ROBE_OF_WEAKNESS - ROBE + 1, ROBE)); (void)mongets(mtmp, SMALL_SHIELD); if (!rn2(4)) { int v,vials; vials = rn2(4)+1; for (v=0;vmgold = (long) d(mtmp->m_lev, 15); #else mkmonmoney(mtmp, (long) d(mtmp->m_lev, 15)); #endif break; case PM_ROGUE: (void)mongets(mtmp, SHORT_SWORD); (void)mongets(mtmp, LEATHER_ARMOR); #ifndef GOLDOBJ mtmp->mgold = (long) d(mtmp->m_lev, 25); #else mkmonmoney(mtmp, (long) d(mtmp->m_lev, 25)); #endif break; case PM_SAMURAI: (void)mongets(mtmp, KATANA); if (rn2(2)) (void)mongets(mtmp, SHORT_SWORD); if (rn2(3)) { (void)mongets(mtmp, YUMI); m_initthrow(mtmp, YA, 18); } (void)mongets(mtmp, SPLINT_MAIL); #ifndef GOLDOBJ mtmp->mgold = (long) d(mtmp->m_lev, 15); #else mkmonmoney(mtmp, (long) d(mtmp->m_lev, 15)); #endif break; #ifdef TOURIST case PM_TOURIST: m_initthrow(mtmp, DART, 18); (void)mongets(mtmp, HAWAIIAN_SHIRT); if (rn2(2)) (void)mongets(mtmp, EXPENSIVE_CAMERA); #ifndef GOLDOBJ mtmp->mgold = (long) d(mtmp->m_lev, 20); #else mkmonmoney(mtmp, (long) d(mtmp->m_lev, 20)); #endif break; #endif case PM_UNDEAD_SLAYER: (void)mongets(mtmp, SILVER_SPEAR); (void)mongets(mtmp, CHAIN_MAIL); #ifndef GOLDOBJ mtmp->mgold = (long) d(mtmp->m_lev, 15); #else mkmonmoney(mtmp, (long) d(mtmp->m_lev, 15)); #endif break; case PM_VALKYRIE: (void)mongets(mtmp, LONG_SWORD); if (!rn2(3)) m_initthrow(mtmp, DAGGER, 4); (void)mongets(mtmp, SMALL_SHIELD); #ifndef GOLDOBJ mtmp->mgold = (long) d(mtmp->m_lev, 15); #else mkmonmoney(mtmp, (long) d(mtmp->m_lev, 15)); #endif break; case PM_WIZARD: (void)mongets(mtmp, ATHAME); (void) mongets(mtmp, rnd_offensive_item(mtmp)); (void) mongets(mtmp, rnd_offensive_item(mtmp)); (void) mongets(mtmp, rnd_defensive_item(mtmp)); #ifndef GOLDOBJ mtmp->mgold = (long) d(mtmp->m_lev, 15); #else mkmonmoney(mtmp, (long) d(mtmp->m_lev, 15)); #endif break; default: break; } if ((int) mtmp->m_lev > rn2(40)) (void) mongets(mtmp, rnd_offensive_item(mtmp)); if ((int) mtmp->m_lev > rn2(40)) (void) mongets(mtmp, rnd_offensive_item(mtmp)); if ((int) mtmp->m_lev > rn2(40)) (void) mongets(mtmp, rnd_defensive_item(mtmp)); if ((int) mtmp->m_lev > rn2(40)) (void) mongets(mtmp, rnd_defensive_item(mtmp)); if ((int) mtmp->m_lev > rn2(40)) (void) mongets(mtmp, rnd_misc_item(mtmp)); if ((int) mtmp->m_lev > rn2(40)) (void) mongets(mtmp, rnd_misc_item(mtmp)); } /* end of other characters */ /*break;*/ else if (ptr->msound == MS_PRIEST || quest_mon_represents_role(ptr,PM_PRIEST)) { otmp = mksobj(MACE, FALSE, FALSE); if(otmp) { otmp->spe = rnd(3); if(!rn2(2)) curse(otmp); (void) mpickobj(mtmp, otmp); } /* MRKR: Dwarves in the Mines sometimes carry torches */ if (In_mines(&u.uz)) { if (!rn2(4)) { otmp = mksobj(TORCH, TRUE, FALSE); otmp->quan = 1; (void) mpickobj(mtmp, otmp); /* If this spot is unlit, light the torch */ if (!levl[mtmp->mx][mtmp->my].lit) { begin_burn(otmp, FALSE); } } } } break; case S_ANGEL: { int spe2; /* create minion stuff; can't use mongets */ otmp = mksobj(LONG_SWORD, FALSE, FALSE); /* maybe make it special */ if (!rn2(20) || is_lord(ptr)) otmp = oname(otmp, artiname( rn2(2) ? ART_DEMONBANE : ART_SUNSWORD)); bless(otmp); otmp->oerodeproof = TRUE; spe2 = rn2(4); otmp->spe = max(otmp->spe, spe2); (void) mpickobj(mtmp, otmp); otmp = mksobj(!rn2(4) || is_lord(ptr) ? SHIELD_OF_REFLECTION : LARGE_SHIELD, FALSE, FALSE); otmp->cursed = FALSE; otmp->oerodeproof = TRUE; otmp->spe = 0; (void) mpickobj(mtmp, otmp); } break; case S_GNOME: switch (mm) { case PM_GNOLL: if(!rn2(3)) (void) mongets(mtmp, ORCISH_HELM); if(!rn2(3)) (void) mongets(mtmp, STUDDED_LEATHER_ARMOR); if(!rn2(3)) (void) mongets(mtmp, ORCISH_SHIELD); if(!rn2(4)) (void) mongets(mtmp, SPEAR); break; case PM_GNOLL_WARRIOR: if(!rn2(2)) (void) mongets(mtmp, ORCISH_HELM); if (!rn2(20)) (void) mongets(mtmp, ORANGE_DRAGON_SCALE_MAIL); else if (rn2(3)) (void) mongets(mtmp, SCALE_MAIL); else (void) mongets(mtmp, SPLINT_MAIL); if(!rn2(2)) (void) mongets(mtmp, ORCISH_SHIELD); if(!rn2(3)) (void) mongets(mtmp, KATANA); break; case PM_GNOLL_CHIEFTAIN: (void) mongets(mtmp, ORCISH_HELM); if (!rn2(10)) (void) mongets(mtmp, BLUE_DRAGON_SCALE_MAIL); else (void) mongets(mtmp, CRYSTAL_PLATE_MAIL); (void) mongets(mtmp, ORCISH_SHIELD); (void) mongets(mtmp, KATANA); (void) mongets(mtmp, rnd_offensive_item(mtmp)); break; case PM_GNOLL_SHAMAN: if (!rn2(10)) (void) mongets(mtmp, SILVER_DRAGON_SCALE_MAIL); else if (rn2(5)) (void) mongets(mtmp, CRYSTAL_PLATE_MAIL); else (void) mongets(mtmp, RED_DRAGON_SCALE_MAIL); (void) mongets(mtmp, ATHAME); m_initthrow(mtmp, SHURIKEN, 12); (void) mongets(mtmp, rnd_offensive_item(mtmp)); (void) mongets(mtmp, rnd_offensive_item(mtmp)); break; default: m_initweap_normal(mtmp); break; } break; case S_HUMANOID: if (is_dwarf(ptr)) { if (rn2(7)) (void)mongets(mtmp, DWARVISH_CLOAK); if (rn2(7)) (void)mongets(mtmp, IRON_SHOES); if (!rn2(4)) { (void)mongets(mtmp, DWARVISH_SHORT_SWORD); /* note: you can't use a mattock with a shield */ if (rn2(2)) (void)mongets(mtmp, DWARVISH_MATTOCK); else { (void)mongets(mtmp, AXE); (void)mongets(mtmp, DWARVISH_ROUNDSHIELD); } (void)mongets(mtmp, DWARVISH_IRON_HELM); if (!rn2(4)) (void)mongets(mtmp, DWARVISH_MITHRIL_COAT); } else { (void)mongets(mtmp, !rn2(3) ? PICK_AXE : DAGGER); } } else if (is_hobbit(ptr)) { switch (rn2(3)) { case 0: (void)mongets(mtmp, DAGGER); break; case 1: (void)mongets(mtmp, ELVEN_DAGGER); break; case 2: (void)mongets(mtmp, SLING); /* WAC give them some rocks to throw */ m_initthrow(mtmp, ROCK, 2); break; } /* WAC add 50% chance of leather */ if (!rn2(10)) (void)mongets(mtmp, ELVEN_MITHRIL_COAT); else if (!rn2(2)) (void)mongets(mtmp, LEATHER_ARMOR); if (!rn2(10)) (void)mongets(mtmp, DWARVISH_CLOAK); } else switch(mm) { /* Mind flayers get robes */ case PM_MIND_FLAYER: if (!rn2(2)) (void)mongets(mtmp, ROBE); break; case PM_MASTER_MIND_FLAYER: if (!rn2(10)) (void)mongets(mtmp, ROBE_OF_PROTECTION); else if (!rn2(10)) (void)mongets(mtmp, ROBE_OF_POWER); else (void)mongets(mtmp, ROBE); break; case PM_GNOLL: if (!rn2(2)) switch (rn2(3)) { case 0: (void)mongets(mtmp, BARDICHE); break; case 1: (void)mongets(mtmp, VOULGE); break; case 2: (void)mongets(mtmp, HALBERD); break; } if (!rn2(2)) (void)mongets(mtmp, LEATHER_ARMOR); break; default: break; } break; # ifdef KOPS case S_KOP: /* create Keystone Kops with cream pies to * throw. As suggested by KAA. [MRS] */ if (!rn2(4)) m_initthrow(mtmp, CREAM_PIE, 2); if (!rn2(3)) (void)mongets(mtmp,(rn2(2)) ? CLUB : RUBBER_HOSE); break; # endif case S_ORC: /* All orcs will get at least an orcish dagger*/ if(rn2(2)) (void)mongets(mtmp, ORCISH_HELM); switch (mm != PM_ORC_CAPTAIN ? mm : rn2(2) ? PM_MORDOR_ORC : PM_URUK_HAI) { case PM_MORDOR_ORC: if(!rn2(3)) (void)mongets(mtmp, SCIMITAR); else (void)mongets(mtmp, ORCISH_DAGGER); if(!rn2(3)) (void)mongets(mtmp, ORCISH_SHIELD); if(!rn2(3)) (void)mongets(mtmp, KNIFE); /* WAC add possible orcish spear */ if (!rn2(4)) m_initthrow(mtmp, ORCISH_SPEAR, 1); if(!rn2(3)) (void)mongets(mtmp, KNIFE); if(!rn2(3)) (void)mongets(mtmp, ORCISH_CHAIN_MAIL); break; case PM_URUK_HAI: if(!rn2(3)) (void)mongets(mtmp, ORCISH_CLOAK); if(!rn2(3)) (void)mongets(mtmp, ORCISH_SHORT_SWORD); else (void)mongets(mtmp, ORCISH_DAGGER); if(!rn2(3)) (void)mongets(mtmp, IRON_SHOES); if(!rn2(3)) { (void)mongets(mtmp, ORCISH_BOW); m_initthrow(mtmp, ORCISH_ARROW, 12); } if(!rn2(3)) (void)mongets(mtmp, URUK_HAI_SHIELD); break; case PM_GOBLIN: if(!rn2(3)) (void)mongets(mtmp, ORCISH_SHORT_SWORD); else (void)mongets(mtmp, ORCISH_DAGGER); break; case PM_HOBGOBLIN: if(!rn2(3)) (void)mongets(mtmp, MORNING_STAR); else if(!rn2(3)) (void)mongets(mtmp, ORCISH_SHORT_SWORD); else (void)mongets(mtmp, ORCISH_DAGGER); break; default: if (mm != PM_ORC_SHAMAN && rn2(2)) /* (void)mongets(mtmp, (mm == PM_GOBLIN || rn2(2) == 0)*/ (void)mongets(mtmp, (rn2(2) == 0) ? ORCISH_DAGGER : SCIMITAR); } break; case S_OGRE: if (!rn2(mm == PM_OGRE_KING ? 3 : mm == PM_OGRE_LORD ? 6 : 12)) (void) mongets(mtmp, BATTLE_AXE); else (void) mongets(mtmp, CLUB); break; case S_KOBOLD: /* WAC gets orcish 1:4, otherwise darts (used to be darts 1:4) gets orcish short sword 1:4, otherwise orcish dagger */ if (!rn2(4)) m_initthrow(mtmp, ORCISH_SPEAR, 1); else m_initthrow(mtmp, DART, 12); if (!rn2(4)) mongets(mtmp, ORCISH_SHORT_SWORD); else mongets(mtmp, ORCISH_DAGGER); break; case S_CENTAUR: if (rn2(2)) { if(ptr == &mons[PM_FOREST_CENTAUR]) { (void)mongets(mtmp, BOW); m_initthrow(mtmp, ARROW, 12); } else { (void)mongets(mtmp, CROSSBOW); m_initthrow(mtmp, CROSSBOW_BOLT, 12); } } break; case S_WRAITH: (void)mongets(mtmp, KNIFE); (void)mongets(mtmp, LONG_SWORD); break; case S_ZOMBIE: if (!rn2(4)) (void)mongets(mtmp, LEATHER_ARMOR); if (!rn2(4)) (void)mongets(mtmp, (rn2(3) ? KNIFE : SHORT_SWORD)); break; case S_LIZARD: if (mm == PM_SALAMANDER) (void)mongets(mtmp, (rn2(7) ? SPEAR : rn2(3) ? TRIDENT : STILETTO)); break; case S_TROLL: if (!rn2(2)) switch (rn2(4)) { case 0: (void)mongets(mtmp, RANSEUR); break; case 1: (void)mongets(mtmp, PARTISAN); break; case 2: (void)mongets(mtmp, GLAIVE); break; case 3: (void)mongets(mtmp, SPETUM); break; } break; case S_DEMON: switch (mm) { case PM_BALROG: (void)mongets(mtmp, BULLWHIP); (void)mongets(mtmp, BROADSWORD); break; case PM_ORCUS: (void)mongets(mtmp, WAN_DEATH); /* the Wand of Orcus */ break; case PM_HORNED_DEVIL: (void)mongets(mtmp, rn2(4) ? TRIDENT : BULLWHIP); break; case PM_DISPATER: (void)mongets(mtmp, WAN_STRIKING); break; case PM_YEENOGHU: (void)mongets(mtmp, FLAIL); break; } /* prevent djinnis and mail daemons from leaving objects when * they vanish */ if (!is_demon(ptr)) break; /* fall thru */ /* * Now the general case, Some chance of getting some type * of weapon for "normal" monsters. Certain special types * of monsters will get a bonus chance or different selections. */ default: m_initweap_normal(mtmp); break; } /* if ((int) mtmp->m_lev > rn2(120)) */ if ((int) mtmp->m_lev > rn2(200)) (void) mongets(mtmp, rnd_offensive_item(mtmp)); } #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; { register int cnt; register struct obj *otmp; register struct permonst *ptr = mtmp->data; /* char *opera_cloak = "opera cloak";*/ int i; #ifdef REINCARNATION if (Is_rogue_level(&u.uz)) return; #endif /* * Soldiers get armour & rations - armour approximates their ac. * Nymphs may get mirror or potion of object detection. */ switch(ptr->mlet) { case S_HUMAN: if(is_mercenary(ptr) #ifdef YEOMAN || ptr == &mons[PM_CHIEF_YEOMAN_WARDER] || ptr == &mons[PM_YEOMAN_WARDER] #endif ) { register int mac; switch(monsndx(ptr)) { case PM_GUARD: mac = -1; break; case PM_SOLDIER: mac = 3; break; case PM_SERGEANT: mac = 0; break; case PM_LIEUTENANT: mac = -2; break; case PM_CAPTAIN: mac = -3; break; #ifdef YEOMAN case PM_YEOMAN_WARDER: #endif case PM_WATCHMAN: mac = 3; break; #ifdef YEOMAN case PM_CHIEF_YEOMAN_WARDER: mongets(mtmp, TALLOW_CANDLE); #endif case PM_WATCH_CAPTAIN: mac = -2; break; default: impossible("odd mercenary %d?", monsndx(ptr)); mac = 0; break; } if (mac < -1 && rn2(5)) mac += 7 + mongets(mtmp, (rn2(5)) ? PLATE_MAIL : CRYSTAL_PLATE_MAIL); else if (mac < 3 && rn2(5)) mac += 6 + mongets(mtmp, (rn2(3)) ? SPLINT_MAIL : BANDED_MAIL); else if (rn2(5)) mac += 3 + mongets(mtmp, (rn2(3)) ? RING_MAIL : STUDDED_LEATHER_ARMOR); else mac += 2 + mongets(mtmp, LEATHER_ARMOR); if (mac < 10 && rn2(3)) mac += 1 + mongets(mtmp, HELMET); else if (mac < 10 && rn2(2)) mac += 1 + mongets(mtmp, DENTED_POT); if (mac < 10 && rn2(3)) mac += 1 + mongets(mtmp, SMALL_SHIELD); else if (mac < 10 && rn2(2)) mac += 2 + mongets(mtmp, LARGE_SHIELD); if (mac < 10 && rn2(3)) mac += 1 + mongets(mtmp, LOW_BOOTS); else if (mac < 10 && rn2(2)) mac += 2 + mongets(mtmp, HIGH_BOOTS); 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] && ptr != &mons[PM_WATCH_CAPTAIN]) { if (!rn2(3)) (void) mongets(mtmp, K_RATION); if (!rn2(2)) (void) mongets(mtmp, C_RATION); if (ptr != &mons[PM_SOLDIER] && !rn2(3)) (void) mongets(mtmp, BUGLE); } else if (ptr == &mons[PM_WATCHMAN] && rn2(3)) (void) mongets(mtmp, TIN_WHISTLE); } else if (ptr == &mons[PM_SHOPKEEPER]) { (void) mongets(mtmp,SKELETON_KEY); /* STEPHEN WHITE'S NEW CODE * * "Were here to pump *clap* YOU up!" -Hans and Frans * Saterday Night Live */ #ifndef FIREARMS switch (rn2(4)) { /* MAJOR fall through ... */ case 0: (void) mongets(mtmp, WAN_MAGIC_MISSILE); case 1: (void) mongets(mtmp, POT_EXTRA_HEALING); case 2: (void) mongets(mtmp, POT_HEALING); case 3: (void) mongets(mtmp, WAN_STRIKING); } #endif switch (rnd(4)) { /* MAJOR fall through ... */ case 1: (void) mongets(mtmp,POT_HEALING); case 2: (void) mongets(mtmp,POT_EXTRA_HEALING); case 3: (void) mongets(mtmp,SCR_TELEPORTATION); case 4: (void) mongets(mtmp,WAN_TELEPORTATION); default: break; } } else if (ptr->msound == MS_PRIEST || quest_mon_represents_role(ptr,PM_PRIEST)) { (void) mongets(mtmp, rn2(7) ? rn1(ROBE_OF_WEAKNESS - ROBE + 1, 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: if(!rn2(2)) (void) mongets(mtmp, MIRROR); if(!rn2(2)) (void) mongets(mtmp, POT_OBJECT_DETECTION); break; case S_GIANT: if (ptr == &mons[PM_MINOTAUR]) { if (!rn2(3) || (in_mklev && Is_earthlevel(&u.uz))) (void) mongets(mtmp, WAN_DIGGING); } else if (is_giant(ptr)) { for (cnt = rn2((int)(mtmp->m_lev / 2)); cnt; cnt--) { otmp = mksobj(rnd_class(DILITHIUM_CRYSTAL,LUCKSTONE-1), FALSE, FALSE); otmp->quan = (long) rn1(2, 3); otmp->owt = weight(otmp); (void) mpickobj(mtmp, otmp); } } break; case S_WRAITH: if (!rn2(2)) (void)mongets(mtmp, ROBE); if (ptr == &mons[PM_NAZGUL]) { otmp = mksobj(RIN_INVISIBILITY, FALSE, FALSE); curse(otmp); (void) mpickobj(mtmp, otmp); } break; case S_LICH: if (ptr == &mons[PM_MASTER_LICH] && !rn2(13)) (void)mongets(mtmp, (rn2(7) ? ATHAME : WAN_NOTHING)); else if (ptr == &mons[PM_ARCH_LICH] && !rn2(3)) { otmp = mksobj(rn2(3) ? ATHAME : QUARTERSTAFF, TRUE, rn2(13) ? FALSE : TRUE); if (otmp->spe < 2) otmp->spe = rnd(3); if (!rn2(4)) otmp->oerodeproof = 1; (void) mpickobj(mtmp, otmp); } break; case S_MUMMY: if (rn2(7)) (void)mongets(mtmp, MUMMY_WRAPPING); break; case S_QUANTMECH: if (monsndx(ptr) == PM_QUANTUM_MECHANIC && !rn2(20)) { otmp = mksobj(LARGE_BOX, FALSE, FALSE); otmp->spe = 1; /* flag for special box */ otmp->owt = weight(otmp); (void) mpickobj(mtmp, otmp); } if (monsndx(ptr) == PM_DOCTOR_FRANKENSTEIN) { (void)mongets(mtmp, LAB_COAT); (void)mongets(mtmp, WAN_POLYMORPH); (void)mongets(mtmp, SPE_POLYMORPH); } break; case S_LEPRECHAUN: #ifndef GOLDOBJ mtmp->mgold = (long) d(level_difficulty(), 30); #else mkmonmoney(mtmp, (long) d(level_difficulty(), 30)); #endif break; case S_ELEMENTAL: /* if(ptr == &mons[PM_WATER_WEIRD]){ otmp = mksobj(WAN_WISHING,TRUE,FALSE); otmp->spe=3; otmp->blessed=0; mpickobj(mtmp, otmp); }*/ break; case S_VAMPIRE: /* [Lethe] Star and fire vampires don't get this stuff */ if (ptr == &mons[PM_STAR_VAMPIRE] || ptr == &mons[PM_FIRE_VAMPIRE]) break; /* Get opera cloak */ /* otmp = readobjnam(opera_cloak); if (otmp && otmp != &zeroobj) mpickobj(mtmp, otmp);*/ for (i = STRANGE_OBJECT; i < NUM_OBJECTS; i++) { register const char *zn; if ((zn = OBJ_DESCR(objects[i])) && !strcmpi(zn, "opera cloak")) { if (!OBJ_NAME(objects[i])) i = STRANGE_OBJECT; break; } } if (i != NUM_OBJECTS) (void)mongets(mtmp, i); if (rn2(2)) { if ((int) mtmp->m_lev > rn2(30)) (void)mongets(mtmp, POT_VAMPIRE_BLOOD); else (void)mongets(mtmp, POT_BLOOD); } break; case S_DEMON: /* moved here from m_initweap() because these don't have AT_WEAP so m_initweap() is not called for them */ if (ptr == &mons[PM_ICE_DEVIL] && !rn2(4)) { (void)mongets(mtmp, SPEAR); /* [DS] Cthulhu isn't fully integrated yet, and he won't be * until Moloch's Sanctum is rearranged */ } else if (ptr == &mons[PM_CTHULHU]) { (void)mongets(mtmp, AMULET_OF_YENDOR); (void)mongets(mtmp, WAN_DEATH); (void)mongets(mtmp, POT_FULL_HEALING); } else if (ptr == &mons[PM_ASMODEUS]) { (void)mongets(mtmp, WAN_COLD); (void)mongets(mtmp, WAN_FIRE); } break; default: break; } /* ordinary soldiers rarely have access to magic (or gold :-) */ if (ptr == &mons[PM_SOLDIER] && rn2(15)) return; if ((int) mtmp->m_lev > rn2(200)) (void) mongets(mtmp, rnd_defensive_item(mtmp)); if ((int) mtmp->m_lev > rn2(200)) (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 } /* Note: for long worms, always call cutworm (cutworm calls clone_mon) */ struct monst * clone_mon(mon, x, y) struct monst *mon; xchar x, y; /* clone's preferred location or 0 (near mon) */ { coord mm; struct monst *m2; /* may be too weak or have been extinguished for population control */ if (mon->mhp <= 1 || (mvitals[monsndx(mon->data)].mvflags & G_EXTINCT)) return (struct monst *)0; if (x == 0) { mm.x = mon->mx; mm.y = mon->my; if (!enexto(&mm, mm.x, mm.y, mon->data) || MON_AT(mm.x, mm.y)) return (struct monst *)0; } else if (!isok(x, y)) { return (struct monst *)0; /* paranoia */ } else { mm.x = x; mm.y = y; if (MON_AT(mm.x, mm.y)) { if (!enexto(&mm, mm.x, mm.y, mon->data) || MON_AT(mm.x, mm.y)) return (struct monst *)0; } } m2 = newmonst(0); *m2 = *mon; /* copy condition of old monster */ m2->nmon = fmon; fmon = m2; m2->m_id = flags.ident++; if (!m2->m_id) m2->m_id = flags.ident++; /* ident overflowed */ m2->mx = mm.x; m2->my = mm.y; 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. */ m2->mhpmax = mon->mhpmax; m2->mhp = mon->mhp / 2; mon->mhp -= m2->mhp; /* Same for the power */ m2->m_enmax = mon->m_enmax; m2->m_en = mon->m_en /= 2; /* since shopkeepers and guards will only be cloned if they've been * 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; if (mon->isgyp) m2->isgyp = 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)); } else if (mon->isshk) { m2 = christen_monst(m2, shkname(mon)); } /* not all clones caused by player are tame or peaceful */ if (!flags.mon_moving) { if (mon->mtame) m2->mtame = rn2(max(2 + u.uluck, 2)) ? mon->mtame : 0; else if (mon->mpeaceful) m2->mpeaceful = rn2(max(2 + u.uluck, 2)) ? 1 : 0; } newsym(m2->mx,m2->my); /* display the new monster */ if (m2->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)); } } } set_malign(m2); return m2; } /* * Propagate a species * * Once a certain number of monsters are created, don't create any more * at random (i.e. make them extinct). The previous (3.2) behavior was * to do this when a certain number had _died_, which didn't make * much sense. * * Returns FALSE propagation unsuccessful * TRUE propagation successful */ boolean propagate(mndx, tally, ghostly) int mndx; boolean tally; boolean ghostly; { boolean result; uchar lim = mbirth_limit(mndx); boolean gone = (mvitals[mndx].mvflags & G_GONE); /* genocided or extinct */ result = (((int) mvitals[mndx].born < lim) && !gone) ? TRUE : FALSE; /* if it's unique, don't ever make it again */ if (mons[mndx].geno & G_UNIQ) mvitals[mndx].mvflags |= G_EXTINCT; if (mvitals[mndx].born < 255 && tally && (!ghostly || (ghostly && result))) mvitals[mndx].born++; if ((int) mvitals[mndx].born >= lim && !(mons[mndx].geno & G_NOGEN) && !(mvitals[mndx].mvflags & G_EXTINCT)) { #if defined(DEBUG) && defined(WIZARD) if (wizard) pline("Automatically extinguished %s.", makeplural(mons[mndx].mname)); #endif mvitals[mndx].mvflags |= G_EXTINCT; reset_rndmonst(mndx); } return result; } /* * called with [x,y] = coordinates; * [0,0] means anyplace * [u.ux,u.uy] means: near player (if !in_mklev) * * In case we make a monster group, only return the one at [x,y]. */ struct monst * makemon(ptr, x, y, mmflags) register struct permonst *ptr; register int x, y; register int mmflags; { register struct monst *mtmp; int mndx, mcham, ct, mitem, xlth; boolean anymon = (!ptr); boolean byyou = (x == u.ux && y == u.uy); boolean allow_minvent = ((mmflags & NO_MINVENT) == 0); boolean countbirth = ((mmflags & MM_NOCOUNTBIRTH) == 0); unsigned gpflags = (mmflags & MM_IGNOREWATER) ? MM_IGNOREWATER : 0; /* if caller wants random location, do it here */ if(x == 0 && y == 0) { int tryct = 0; /* careful with bigrooms */ struct monst fakemon; fakemon.data = ptr; /* set up for goodpos */ do { x = rn1(COLNO-3,2); y = rn2(ROWNO); } while(!goodpos(x, y, ptr ? &fakemon : (struct monst *)0, gpflags) || (!in_mklev && tryct++ < 50 && cansee(x, y))); } else if (byyou && !in_mklev) { coord bypos; if(enexto_core(&bypos, u.ux, u.uy, ptr, gpflags)) { x = bypos.x; y = bypos.y; } else return((struct monst *)0); } /* Does monster already exist at the position? */ if(MON_AT(x, y)) { if ((mmflags & MM_ADJACENTOK) != 0) { coord bypos; if(enexto_core(&bypos, x, y, ptr, gpflags)) { x = bypos.x; y = bypos.y; } else return((struct monst *) 0); } else return((struct monst *) 0); } if(ptr){ mndx = monsndx(ptr); /* if you are to make a specific monster and it has already been genocided, return */ if (mvitals[mndx].mvflags & G_GENOD) return((struct monst *) 0); #if defined(WIZARD) && defined(DEBUG) if (wizard && (mvitals[mndx].mvflags & G_EXTINCT)) pline("Explicitly creating extinct monster %s.", mons[mndx].mname); #endif } else { /* make a random (common) monster that can survive here. * (the special levels ask for random monsters at specific * positions, causing mass drowning on the medusa level, * for instance.) */ int tryct = 0; /* maybe there are no good choices */ struct monst fakemon; do { if(!(ptr = rndmonst())) { #ifdef DEBUG pline("Warning: no monster."); #endif return((struct monst *) 0); /* no more monsters! */ } fakemon.data = ptr; /* set up for goodpos */ } while(!goodpos(x, y, &fakemon, gpflags) && tryct++ < 50); mndx = monsndx(ptr); } (void) propagate(mndx, countbirth, FALSE); xlth = ptr->pxlth; if (mmflags & MM_EDOG) xlth += sizeof(struct edog); else if (mmflags & MM_EMIN) xlth += sizeof(struct emin); mtmp = newmonst(xlth); *mtmp = zeromonst; /* clear all entries in structure */ (void)memset((genericptr_t)mtmp->mextra, 0, xlth); mtmp->nmon = fmon; fmon = mtmp; 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; mtmp->m_lev = adj_lev(ptr); /* WAC set oldmonnm */ mtmp->oldmonnm = monsndx(ptr); if (ptr >= &mons[PM_ARCHEOLOGIST] && ptr <= &mons[PM_WIZARD]) { /* enemy characters are of varying level */ int base_you, base_lev; base_you = (u.ulevel / 2)+1; base_lev = level_difficulty()+1; if (base_you < 1) base_you = 1; if (base_lev < 1) base_lev = 1; mtmp->m_lev = (1 + rn2(base_you) + rn2(base_lev) / 2)+1; } /* Set HP, HPmax */ if (is_golem(ptr)) { mtmp->mhpmax = mtmp->mhp = golemhp(mndx); } else if (is_rider(ptr)) { /* We want low HP, but a high mlevel so they can attack well */ mtmp->mhpmax = mtmp->mhp = d(10,8) + 20; } else if (ptr->mlevel > 49) { /* "special" fixed hp monster * the hit points are encoded in the mlevel in a somewhat strange * way to fit in the 50..127 positive range of a signed character * above the 1..49 that indicate "normal" monster levels */ mtmp->mhpmax = mtmp->mhp = 2*(ptr->mlevel - 6); mtmp->m_lev = mtmp->mhp / 4; /* approximation */ } else if (ptr->mlet == S_DRAGON && mndx >= PM_GRAY_DRAGON) { /* adult dragons */ mtmp->mhpmax = mtmp->mhp = (int) (In_endgame(&u.uz) ? (8 * mtmp->m_lev) : (4 * mtmp->m_lev + d((int)mtmp->m_lev, 4))); } else if (!mtmp->m_lev) { mtmp->mhpmax = mtmp->mhp = rnd(4); } else { mtmp->mhpmax = mtmp->mhp = d((int)mtmp->m_lev, 8); if (is_home_elemental(ptr)) mtmp->mhpmax = (mtmp->mhp *= 3); else mtmp->mhpmax = mtmp->mhp = d((int)mtmp->m_lev, 8) + (mtmp->m_lev*rnd(2)); } /* Assign power */ if (mindless(ptr)) { mtmp->m_enmax = mtmp->m_en = 0; } else { /* This is actually quite similar to hit dice, * but with more randomness */ mtmp->m_enmax = mtmp->m_en = d((int)mtmp->m_lev * 2, 4) + (mtmp->m_lev*rnd(2)); } if (is_female(ptr)) mtmp->female = TRUE; else if (is_male(ptr)) mtmp->female = FALSE; else mtmp->female = rn2(2); /* ignored for neuters */ 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 |= (1L << (MAGIC_PORTAL-1)); place_monster(mtmp, x, y); mtmp->mcansee = mtmp->mcanmove = TRUE; mtmp->mpeaceful = (mmflags & MM_ANGRY) ? FALSE : peace_minded(ptr); mtmp->mtraitor = FALSE; switch(ptr->mlet) { case S_MIMIC: set_mimic_sym(mtmp); break; case S_SPIDER: case S_SNAKE: if(in_mklev) if(x && y) (void) mkobj_at(0, x, y, TRUE); if(hides_under(ptr) && OBJ_AT(x, y)) mtmp->mundetected = TRUE; break; case S_LIGHT: case S_ELEMENTAL: if (mndx == PM_STALKER || mndx == PM_BLACK_LIGHT) { mtmp->perminvis = TRUE; mtmp->minvis = TRUE; } break; case S_EEL: if (is_pool(x, y)) mtmp->mundetected = TRUE; break; case S_LEPRECHAUN: mtmp->msleeping = 1; break; case S_JABBERWOCK: case S_NYMPH: if (rn2(5) && !u.uhave.amulet) mtmp->msleeping = 1; if (mndx == PM_PIXIE) { /* mtmp->perminvis = TRUE;*/ mtmp->minvis = TRUE; } break; case S_ORC: if (Race_if(PM_ELF)) mtmp->mpeaceful = FALSE; break; case S_UNICORN: if (is_unicorn(ptr) && sgn(u.ualign.type) == sgn(ptr->maligntyp)) mtmp->mpeaceful = TRUE; break; case S_BAT: if (Inhell && is_bat(ptr)) mon_adjust_speed(mtmp, 2, (struct obj *)0); break; case S_VAMPIRE: /* [DS] Star vampires are invisible until they feed */ if (mndx == PM_STAR_VAMPIRE) { mtmp->perminvis = TRUE; mtmp->minvis = TRUE; } break; } if ((ct = emits_light(mtmp->data)) > 0) new_light_source(mtmp->mx, mtmp->my, ct, LS_MONSTER, (genericptr_t)mtmp); mitem = 0; /* extra inventory item for this monster */ if ((mcham = pm_to_cham(mndx)) != CHAM_ORDINARY) { /* If you're protected with a ring, don't create * any shape-changing chameleons -dgk */ if (Protection_from_shape_changers) mtmp->cham = CHAM_ORDINARY; else { mtmp->cham = mcham; (void) mon_spec_poly(mtmp, rndmonst(), 0L, FALSE, FALSE, FALSE, FALSE); } } else if (mndx == PM_WIZARD_OF_YENDOR) { mtmp->iswiz = TRUE; flags.no_of_wizards++; if (flags.no_of_wizards == 1 && Is_earthlevel(&u.uz)) mitem = SPE_DIG; } else if (mndx == PM_DJINNI) { flags.djinni_count++; } else if (mndx == PM_GHOST) { flags.ghost_count++; if (!(mmflags & MM_NONAME)) mtmp = christen_monst(mtmp, rndghostname()); } else if (mndx == PM_NIGHTMARE) { struct obj *otmp; otmp = oname(mksobj(SKELETON_KEY, TRUE, FALSE), artiname(ART_KEY_OF_LAW)); if (otmp) { otmp->blessed = otmp->cursed = 0; mpickobj(mtmp, otmp); } } else if (mndx == PM_BEHOLDER) { struct obj *otmp; otmp = oname(mksobj(SKELETON_KEY, TRUE, FALSE), artiname(ART_KEY_OF_NEUTRALITY)); if (otmp) { otmp->blessed = otmp->cursed = 0; mpickobj(mtmp, otmp); } } else if (mndx == PM_VECNA) { struct obj *otmp; otmp = oname(mksobj(SKELETON_KEY, TRUE, FALSE), artiname(ART_KEY_OF_CHAOS)); if (otmp) { otmp->blessed = otmp->cursed = 0; mpickobj(mtmp, otmp); } } else if (mndx == PM_GYPSY) { /* KMH -- Gypsies are randomly generated; initialize them here */ gypsy_init(mtmp); } else if (mndx == PM_VLAD_THE_IMPALER) { mitem = CANDELABRUM_OF_INVOCATION; } else if (mndx == PM_CROESUS) { mitem = TWO_HANDED_SWORD; } else if (ptr->msound == MS_NEMESIS) { mitem = BELL_OF_OPENING; } else if (mndx == PM_PESTILENCE) { mitem = POT_SICKNESS; } if (mitem && allow_minvent) (void) mongets(mtmp, mitem); if(in_mklev) { if(((is_ndemon(ptr)) || (mndx == PM_WUMPUS) || (mndx == PM_LONG_WORM) || (mndx == PM_GIANT_EEL)) && !u.uhave.amulet && rn2(5)) mtmp->msleeping = 1; } else { if(byyou) { newsym(mtmp->mx,mtmp->my); set_apparxy(mtmp); } } 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; } #ifndef DCC30_BUG if (mndx == PM_LONG_WORM && (mtmp->wormno = get_wormno()) != 0) #else /* DICE 3.0 doesn't like assigning and comparing mtmp->wormno in the * same expression. */ if (mndx == PM_LONG_WORM && (mtmp->wormno = get_wormno(), mtmp->wormno != 0)) #endif { /* we can now create worms with tails - 11/91 */ initworm(mtmp, rn2(5)); if (count_wsegs(mtmp)) place_worm_tail_randomly(mtmp, x, y); } set_malign(mtmp); /* having finished peaceful changes */ if(anymon) { if ((ptr->geno & G_SGROUP) && rn2(2)) { m_initsgrp(mtmp, mtmp->mx, mtmp->my); } else if (ptr->geno & G_LGROUP) { if(rn2(3)) m_initlgrp(mtmp, mtmp->mx, mtmp->my); else m_initsgrp(mtmp, mtmp->mx, mtmp->my); } else if(ptr->geno & G_VLGROUP) { if(rn2(3)) m_initvlgrp(mtmp, mtmp->mx, mtmp->my); else if(rn2(3)) m_initlgrp(mtmp, mtmp->mx, mtmp->my); else m_initsgrp(mtmp, mtmp->mx, mtmp->my); } } if (allow_minvent) { if(is_armed(ptr)) m_initweap(mtmp); /* equip with weapons / armor */ m_initinv(mtmp); /* add on a few special items incl. more armor */ m_dowear(mtmp, TRUE); } else { if (mtmp->minvent) discard_minvent(mtmp); mtmp->minvent = (struct obj *)0; /* caller expects this */ mtmp->minvent = (struct obj *)0; /* caller expects this */ } if ((ptr->mflags3 & M3_WAITMASK) && !(mmflags & MM_NOWAIT)) { if (ptr->mflags3 & M3_WAITFORU) mtmp->mstrategy |= STRAT_WAITFORU; if (ptr->mflags3 & M3_CLOSE) mtmp->mstrategy |= STRAT_CLOSE; } if (!in_mklev) newsym(mtmp->mx,mtmp->my); /* make sure the mon shows up */ return(mtmp); } int mbirth_limit(mndx) int mndx; { /* assert(MAXMONNO < 255); */ 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 create_critters(cnt, mptr) int cnt; struct permonst *mptr; /* usually null; used for confused reading */ { coord c; int x, y; struct monst *mon; boolean known = FALSE; #ifdef WIZARD boolean ask = wizard; #endif while (cnt--) { #ifdef WIZARD if (ask) { if (create_particular()) { known = TRUE; continue; } else ask = FALSE; /* ESC will shut off prompting */ } #endif x = u.ux, y = u.uy; /* if in water, try to encourage an aquatic monster by finding and then specifying another wet location */ if (!mptr && u.uinwater && enexto(&c, x, y, &mons[PM_GIANT_EEL])) x = c.x, y = c.y; mon = makemon(mptr, x, y, NO_MM_FLAGS); if (mon && canspotmon(mon)) known = TRUE; } return known; } #endif /* OVL1 */ #ifdef OVL0 STATIC_OVL boolean uncommon(mndx) int mndx; { if (mons[mndx].geno & (G_NOGEN | G_UNIQ)) return TRUE; if (mvitals[mndx].mvflags & G_GONE) return TRUE; if (Inhell) return(mons[mndx].maligntyp > A_NEUTRAL); else return((mons[mndx].geno & G_HELL) != 0); } /* * shift the probability of a monster's generation by * comparing the dungeon alignment and monster alignment. * return an integer in the range of 0-5. */ STATIC_OVL int align_shift(ptr) register struct permonst *ptr; { static NEARDATA long oldmoves = 0L; /* != 1, starting value of moves */ static NEARDATA s_level *lev; register int alshift; if(oldmoves != moves) { lev = Is_special(&u.uz); oldmoves = moves; } switch((lev) ? lev->flags.align : dungeons[u.uz.dnum].flags.align) { default: /* just in case */ case AM_NONE: alshift = 0; break; case AM_LAWFUL: alshift = (ptr->maligntyp+20)/(2*ALIGNWEIGHT); break; case AM_NEUTRAL: alshift = (20 - abs(ptr->maligntyp))/ALIGNWEIGHT; break; case AM_CHAOTIC: alshift = (-(ptr->maligntyp-20))/(2*ALIGNWEIGHT); break; } return alshift; } static NEARDATA struct { int choice_count; char mchoices[SPECIAL_PM]; /* value range is 0..127 */ } rndmonst_state = { -1, {0} }; /* select a random monster type */ struct permonst * rndmonst() { register struct permonst *ptr; register int mndx, ct; /* [Tom] this was locking up priest quest... who knows why? */ /* fixed it! no 'W' class monsters with corpses! oops! */ /* if(u.uz.dnum == quest_dnum && (ptr = qt_montype())) return(ptr); */ if(u.uz.dnum == quest_dnum) { if ((ptr = qt_montype())) { return(ptr); } } /* KMH -- February 2 is Groundhog Day! */ if (Is_oracle_level(&u.uz) && (!!flags.groundhogday ^ !rn2(20))) return (&mons[PM_WOODCHUCK]); /* if (u.uz.dnum == quest_dnum && rn2(7) && (ptr = qt_montype()) != 0) return ptr; */ if (rndmonst_state.choice_count < 0) { /* need to recalculate */ int zlevel, minmlev, maxmlev; boolean elemlevel; #ifdef REINCARNATION boolean upper; #endif rndmonst_state.choice_count = 0; /* look for first common monster */ for (mndx = LOW_PM; mndx < SPECIAL_PM; mndx++) { if (!uncommon(mndx)) break; rndmonst_state.mchoices[mndx] = 0; } if (mndx == SPECIAL_PM) { /* evidently they've all been exterminated */ #ifdef DEBUG pline("rndmonst: no common mons!"); #endif return (struct permonst *)0; } /* else `mndx' now ready for use below */ zlevel = level_difficulty(); /* determine the level of the weakest monster to make. */ minmlev = zlevel / 6; /* determine the level of the strongest monster to make. */ maxmlev = (zlevel + u.ulevel + 1)>>1; #ifdef REINCARNATION upper = Is_rogue_level(&u.uz); #endif elemlevel = In_endgame(&u.uz) && !Is_astralevel(&u.uz); /* * Find out how many monsters exist in the range we have selected. */ loopback: /* (`mndx' initialized above) */ for ( ; mndx < SPECIAL_PM; mndx++) { ptr = &mons[mndx]; rndmonst_state.mchoices[mndx] = 0; if (tooweak(mndx, minmlev) || toostrong(mndx, maxmlev)) continue; #ifdef REINCARNATION if (upper && !isupper((int)def_monsyms[(int)(ptr->mlet)])) continue; #endif if (elemlevel && wrong_elem_type(ptr)) continue; if (uncommon(mndx)) continue; if (Inhell && (ptr->geno & G_NOHELL)) continue; ct = (int)(ptr->geno & G_FREQ) + align_shift(ptr); if (ct < 0 || ct > 127) panic("rndmonst: bad count [#%d: %d]", mndx, ct); rndmonst_state.choice_count += ct; rndmonst_state.mchoices[mndx] = (char)ct; } /* * Possible modification: if choice_count is "too low", * expand minmlev..maxmlev range and try again. */ } /* choice_count+mchoices[] recalc */ if (rndmonst_state.choice_count <= 0) { /* maybe no common mons left, or all are too weak or too strong */ #ifdef DEBUG Norep("rndmonst: choice_count=%d", rndmonst_state.choice_count); #endif return (struct permonst *)0; } /* * Now, select a monster at random. */ ct = rnd(rndmonst_state.choice_count); for (mndx = LOW_PM; mndx < SPECIAL_PM; mndx++) if ((ct -= (int)rndmonst_state.mchoices[mndx]) <= 0) break; if (mndx == SPECIAL_PM || uncommon(mndx)) { /* shouldn't happen */ impossible("rndmonst: bad `mndx' [#%d]", mndx); return (struct permonst *)0; } return &mons[mndx]; /* * [Tom] Your rival adventurers are a special case: * - They have varying levels, and thus can always appear * - But they need to be sorta rare or else they're a large * percentage of the dungeon inhabitants. */ if ((monsndx(ptr-1) >= PM_ARCHEOLOGIST) && (monsndx(ptr-1) <= PM_WIZARD) && (rn2(4))) goto loopback; } /* called when you change level (experience or dungeon depth) or when monster species can no longer be created (genocide or extinction) */ void reset_rndmonst(mndx) int mndx; /* particular species that can no longer be created */ { /* cached selection info is out of date */ if (mndx == NON_PM) { rndmonst_state.choice_count = -1; /* full recalc needed */ } else if (mndx < SPECIAL_PM) { rndmonst_state.choice_count -= rndmonst_state.mchoices[mndx]; rndmonst_state.mchoices[mndx] = 0; } /* note: safe to ignore extinction of unique monsters */ } #endif /* OVL0 */ #ifdef OVL1 /* The routine below is used to make one of the multiple types * of a given monster class. The second parameter specifies a * special casing bit mask to allow the normal genesis * masks to be deactivated. Returns 0 if no monsters * in that class can be made. */ struct permonst * mkclass(class,spc) char class; int spc; { register int first; first = pm_mkclass(class,spc); if (first == -1) return((struct permonst *) 0); return(&mons[first]); } /* Called by mkclass() - returns the pm of the monster * Returns -1 (PM_PLAYERMON) if can't find monster of the class * * spc may have G_UNIQ and/or G_NOGEN set to allow monsters of * this type (otherwise they will be ignored). It may also have * MKC_ULIMIT set to place an upper limit on the difficulty of * the monster returned. */ int pm_mkclass(class,spc) char class; int spc; { register int first, last, num = 0; int maxmlev, mask = (G_NOGEN | G_UNIQ) & ~spc; maxmlev = level_difficulty() >> 1; if(class < 1 || class >= MAXMCLASSES) { impossible("mkclass called with bad class!"); return(-1); } /* Assumption #1: monsters of a given class are contiguous in the * mons[] array. */ for (first = LOW_PM; first < SPECIAL_PM; first++) if (mons[first].mlet == class) break; if (first == SPECIAL_PM) return (-1); for (last = first; last < SPECIAL_PM && mons[last].mlet == class; last++) if (!(mvitals[last].mvflags & G_GONE) && !(mons[last].geno & mask) && !is_placeholder(&mons[last])) { /* consider it */ if(spc & MKC_ULIMIT && toostrong(last, 4 * maxmlev)) break; if(num && toostrong(last, maxmlev) && monstr[last] != monstr[last-1] && rn2(2)) break; num += mons[last].geno & G_FREQ; } if(!num) return(-1); /* Assumption #2: monsters of a given class are presented in ascending * order of strength. */ for(num = rnd(num); num > 0; first++) if (!(mvitals[first].mvflags & G_GONE) && !(mons[first].geno & mask) && !is_placeholder(&mons[first])) { /* skew towards lower value monsters at lower exp. levels */ num -= mons[first].geno & G_FREQ; if (num && adj_lev(&mons[first]) > (u.ulevel*2)) { /* but not when multiple monsters are same level */ if (mons[first].mlevel != mons[first+1].mlevel) num--; } } first--; /* correct an off-by-one error */ return(first); } int adj_lev(ptr) /* adjust strength of monsters based on u.uz and u.ulevel */ register struct permonst *ptr; { int tmp, tmp2; if (ptr == &mons[PM_WIZARD_OF_YENDOR]) { /* does not depend on other strengths, but does get stronger * every time he is killed */ tmp = ptr->mlevel + mvitals[PM_WIZARD_OF_YENDOR].died; if (tmp > 49) tmp = 49; return tmp; } if((tmp = ptr->mlevel) > 49) return(50); /* "special" demons/devils */ tmp2 = (level_difficulty() - tmp); if(tmp2 < 0) tmp--; /* if mlevel > u.uz decrement tmp */ else tmp += (tmp2 / 5); /* else increment 1 per five diff */ tmp2 = (u.ulevel - ptr->mlevel); /* adjust vs. the player */ if(tmp2 > 0) tmp += (tmp2 / 4); /* level as well */ tmp2 = (3 * ((int) ptr->mlevel))/ 2; /* crude upper limit */ if (tmp2 > 49) tmp2 = 49; /* hard upper limit */ return((tmp > tmp2) ? tmp2 : (tmp > 0 ? tmp : 0)); /* 0 lower limit */ } #endif /* OVL1 */ #ifdef OVLB struct permonst * grow_up(mtmp, victim) /* `mtmp' might "grow up" into a bigger version */ struct monst *mtmp, *victim; { int oldtype, newtype, max_increase, cur_increase, lev_limit, hp_threshold; struct permonst *ptr = mtmp->data; /* monster died after killing enemy but before calling this function */ /* currently possible if killing a gas spore */ if (mtmp->mhp <= 0) return ((struct permonst *)0); if (mtmp->oldmonnm != monsndx(ptr)) return ptr; /* No effect if polymorphed */ /* note: none of the monsters with special hit point calculations have both little and big forms */ oldtype = monsndx(ptr); newtype = little_to_big(oldtype); if (newtype == PM_PRIEST && mtmp->female) newtype = PM_PRIESTESS; /* growth limits differ depending on method of advancement */ if (victim) { /* killed a monster */ /* * The HP threshold is the maximum number of hit points for the * current level; once exceeded, a level will be gained. * Possible bug: if somehow the hit points are already higher * than that, monster will gain a level without any increase in HP. */ hp_threshold = mtmp->m_lev * 8; /* normal limit */ if (!mtmp->m_lev) hp_threshold = 4; else if (is_golem(ptr)) /* strange creatures */ hp_threshold = ((mtmp->mhpmax / 10) + 1) * 10 - 1; else if (is_home_elemental(ptr)) hp_threshold *= 3; lev_limit = 3 * (int)ptr->mlevel / 2; /* same as adj_lev() */ /* If they can grow up, be sure the level is high enough for that */ if (oldtype != newtype && mons[newtype].mlevel > lev_limit) lev_limit = (int)mons[newtype].mlevel; /* number of hit points to gain; unlike for the player, we put the limit at the bottom of the next level rather than the top */ max_increase = rnd((int)victim->m_lev + 1); if (mtmp->mhpmax + max_increase > hp_threshold + 1) max_increase = max((hp_threshold + 1) - mtmp->mhpmax, 0); cur_increase = (max_increase > 1) ? rn2(max_increase) : 0; } else { /* a gain level potion or wraith corpse; always go up a level unless already at maximum (49 is hard upper limit except for demon lords, who start at 50 and can't go any higher) */ max_increase = cur_increase = rnd(8) + rnd(2); hp_threshold = 0; /* smaller than `mhpmax + max_increase' */ lev_limit = 50; /* recalc below */ } mtmp->mhpmax += max_increase; mtmp->mhp += cur_increase; mtmp->m_enmax += max_increase; mtmp->m_en += cur_increase; if (mtmp->mhpmax <= hp_threshold) return ptr; /* doesn't gain a level */ /* Allow to grow up even if grown up form would normally be * out of range */ if (lev_limit < mons[newtype].mlevel) lev_limit = mons[newtype].mlevel; if (is_mplayer(ptr)) lev_limit = 30; /* same as player */ else if (lev_limit < 5) lev_limit = 5; /* arbitrary */ else if (lev_limit > 49) lev_limit = (ptr->mlevel > 49 ? 50 : 49); if ((int)++mtmp->m_lev >= mons[newtype].mlevel && newtype != oldtype) { ptr = &mons[newtype]; 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); return (struct permonst *)0; } set_mon_data(mtmp, ptr, 1); /* preserve intrinsics */ newsym(mtmp->mx, mtmp->my); /* color may change */ lev_limit = (int)mtmp->m_lev; /* never undo increment */ } /* sanity checks */ if ((int)mtmp->m_lev > lev_limit) { mtmp->m_lev--; /* undo increment */ /* HP might have been allowed to grow when it shouldn't */ if (mtmp->mhpmax == hp_threshold + 1) mtmp->mhpmax--; } if (mtmp->mhpmax > 50*8) mtmp->mhpmax = 50*8; /* absolute limit */ if (mtmp->mhp > mtmp->mhpmax) mtmp->mhp = mtmp->mhpmax; if (mtmp->m_enmax > 50*8) mtmp->m_enmax = 50*8; /* absolute limit */ if (mtmp->m_en > mtmp->m_enmax) mtmp->m_en = mtmp->m_enmax; if (mtmp->oldmonnm != monsndx(ptr)) mtmp->oldmonnm = monsndx(ptr); return ptr; } #endif /* OVLB */ #ifdef OVL1 int mongets(mtmp, otyp) register struct monst *mtmp; register int otyp; { register struct obj *otmp; int spe; if (!otyp) return 0; otmp = mksobj(otyp, TRUE, FALSE); if (otmp) { if (mtmp->data->mlet == S_DEMON) { /* demons never get blessed objects */ if (otmp->blessed) curse(otmp); } else if(is_lminion(mtmp)) { /* lawful minions don't get cursed, bad, or rusting objects */ otmp->cursed = FALSE; if(otmp->spe < 0) otmp->spe = 0; otmp->oerodeproof = TRUE; } else if(In_endgame(&u.uz) && is_mplayer(mtmp->data) && is_sword(otmp)) { otmp->spe = (3 + rn2(3)); } /* * This seems to be covered under mkobj.c ... * * * STEPHEN WHITE'S NEW CODE * * * if ((otmp->otyp == ORCISH_DAGGER && !rn2(8)) || * (otmp->otyp == ORCISH_SPEAR && !rn2(10)) || * (otmp->otyp == ORCISH_SHORT_SWORD && !rn2(12))) * otmp->opoisoned = TRUE; * * * It could be alread immune to rust ... * * if (!otmp->oerodeproof && !is_rustprone(otmp) && * ((otmp->otyp >= SPEAR && otmp->otyp <= BULLWHIP) || * (otmp->otyp >= ELVEN_LEATHER_HELM && * otmp->otyp <= LEVITATION_BOOTS))) { * if (!rn2(10-otmp->spe)) otmp->oerodeproof = TRUE; * else if (!rn2(10+otmp->spe)) otmp->oeroded = rn2(3); * } */ if(otmp->otyp == CANDELABRUM_OF_INVOCATION) { otmp->spe = 0; otmp->age = 0L; otmp->lamplit = FALSE; otmp->blessed = otmp->cursed = FALSE; } else if (otmp->otyp == BELL_OF_OPENING) { otmp->blessed = otmp->cursed = FALSE; } else if (otmp->otyp == SPE_BOOK_OF_THE_DEAD) { otmp->blessed = FALSE; otmp->cursed = TRUE; } /* leaders don't tolerate inferior quality battle gear */ if (is_prince(mtmp->data)) { if (otmp->oclass == WEAPON_CLASS && otmp->spe < 1) otmp->spe = 1; else if (otmp->oclass == ARMOR_CLASS && otmp->spe < 0) otmp->spe = 0; } spe = otmp->spe; (void) mpickobj(mtmp, otmp); /* might free otmp */ return(spe); } else return(0); } #endif /* OVL1 */ #ifdef OVLB int golemhp(type) int type; { switch(type) { case PM_PAPER_GOLEM: return 36; case PM_STRAW_GOLEM: return 40; case PM_GARGOYLE: return 46; case PM_ROPE_GOLEM: return 60; case PM_LEATHER_GOLEM: return 80; case PM_GOLD_GOLEM: return 80; case PM_WOOD_GOLEM: return 100; case PM_FLESH_GOLEM: return 120; case PM_STATUE_GARGOYLE: return 140; case PM_CLAY_GOLEM: return 150; case PM_STONE_GOLEM: return 180; case PM_GLASS_GOLEM: return 140; case PM_IRON_GOLEM: return 240; case PM_RUBY_GOLEM: return 250; case PM_DIAMOND_GOLEM: return 270; case PM_SAPPHIRE_GOLEM: return 280; case PM_STEEL_GOLEM: return 290; case PM_CRYSTAL_GOLEM: return 300; case PM_FRANKENSTEIN_S_MONSTER: return 400; case PM_WAX_GOLEM: return 40; case PM_PLASTIC_GOLEM: return 60; default: return 0; } } #endif /* OVLB */ #ifdef OVL1 /* * Alignment vs. yours determines monster's attitude to you. * ( some "animal" types are co-aligned, but also hungry ) */ boolean peace_minded(ptr) register struct permonst *ptr; { aligntyp mal = ptr->maligntyp, ual = u.ualign.type; if (always_peaceful(ptr)) return TRUE; if (always_hostile(ptr)) return FALSE; if (ptr->msound == MS_LEADER || ptr->msound == MS_GUARDIAN) return TRUE; if (ptr->msound == MS_NEMESIS) return FALSE; if (is_elf(ptr) && is_elf(youmonst.data)) { /* Light and dark elves are always hostile to each other. * Suggested by Dr. Eva R. Myers. */ if (ual > A_NEUTRAL && mal < A_NEUTRAL || ual < A_NEUTRAL && mal > A_NEUTRAL) return FALSE; } if (race_peaceful(ptr)) return TRUE; if (race_hostile(ptr)) return FALSE; /* the monster is hostile if its alignment is different from the * player's */ if (sgn(mal) != sgn(ual)) return FALSE; /* Negative monster hostile to player with Amulet. */ if (mal < A_NEUTRAL && u.uhave.amulet) return FALSE; /* minions are hostile to players that have strayed at all */ if (is_minion(ptr)) return((boolean)(u.ualign.record >= 0)); /* Last case: a chance of a co-aligned monster being * hostile. This chance is greater if the player has strayed * (u.ualign.record negative) or the monster is not strongly aligned. */ return((boolean)(!!rn2(16 + (u.ualign.record < -15 ? -15 : u.ualign.record)) && !!rn2(2 + abs(mal)))); } /* Set malign to have the proper effect on player alignment if monster is * killed. Negative numbers mean it's bad to kill this monster; positive * numbers mean it's good. Since there are more hostile monsters than * peaceful monsters, the penalty for killing a peaceful monster should be * greater than the bonus for killing a hostile monster to maintain balance. * Rules: * it's bad to kill peaceful monsters, potentially worse to kill always- * peaceful monsters * it's never bad to kill a hostile monster, although it may not be good */ void set_malign(mtmp) struct monst *mtmp; { schar mal = mtmp->data->maligntyp; boolean coaligned; if (mtmp->ispriest || mtmp->isminion) { /* some monsters have individual alignments; check them */ if (mtmp->ispriest) mal = EPRI(mtmp)->shralign; else if (mtmp->isminion) mal = EMIN(mtmp)->min_align; /* unless alignment is none, set mal to -5,0,5 */ /* (see align.h for valid aligntyp values) */ if(mal != A_NONE) mal *= 5; /* make priests of Moloch hostile */ if (mal == A_NONE) mtmp->mpeaceful = 0; } coaligned = (sgn(mal) == sgn(u.ualign.type)); if (mtmp->data->msound == MS_LEADER) { mtmp->malign = -20; } else if (mal == A_NONE) { if (mtmp->mpeaceful) mtmp->malign = 0; else mtmp->malign = 20; /* really hostile */ } else if (always_peaceful(mtmp->data)) { int absmal = abs(mal); if (mtmp->mpeaceful) mtmp->malign = -3*max(5,absmal); else mtmp->malign = 3*max(5,absmal); /* renegade */ } else if (always_hostile(mtmp->data)) { int absmal = abs(mal); if (coaligned) mtmp->malign = 0; else mtmp->malign = max(5,absmal); } else if (coaligned) { int absmal = abs(mal); if (mtmp->mpeaceful) mtmp->malign = -3*max(3,absmal); else /* renegade */ mtmp->malign = max(3,absmal); } else /* not coaligned and therefore hostile */ mtmp->malign = abs(mal); } #endif /* OVL1 */ #ifdef OVLB static NEARDATA char syms[] = { MAXOCLASSES, MAXOCLASSES+1, RING_CLASS, WAND_CLASS, WEAPON_CLASS, FOOD_CLASS, COIN_CLASS, SCROLL_CLASS, POTION_CLASS, ARMOR_CLASS, AMULET_CLASS, TOOL_CLASS, ROCK_CLASS, GEM_CLASS, SPBOOK_CLASS, S_MIMIC_DEF, S_MIMIC_DEF, S_MIMIC_DEF, }; void set_mimic_sym(mtmp) /* KAA, modified by ERS */ register struct monst *mtmp; { int typ, roomno, rt; unsigned appear, ap_type; int s_sym; struct obj *otmp; int mx, my; if (!mtmp) return; mx = mtmp->mx; my = mtmp->my; typ = levl[mx][my].typ; /* only valid for INSIDE of room */ roomno = levl[mx][my].roomno - ROOMOFFSET; if (roomno >= 0) rt = rooms[roomno].rtype; #ifdef SPECIALIZATION else if (IS_ROOM(typ)) rt = OROOM, roomno = 0; #endif else rt = 0; /* roomno < 0 case for GCC_WARN */ if (OBJ_AT(mx, my)) { ap_type = M_AP_OBJECT; appear = level.objects[mx][my]->otyp; } else if (IS_DOOR(typ) || IS_WALL(typ) || typ == SDOOR || typ == SCORR) { ap_type = M_AP_FURNITURE; /* * If there is a wall to the left that connects to this * location, then the mimic mimics a horizontal closed door. * This does not allow doors to be in corners of rooms. */ if (mx != 0 && (levl[mx-1][my].typ == HWALL || levl[mx-1][my].typ == TLCORNER || levl[mx-1][my].typ == TRWALL || levl[mx-1][my].typ == BLCORNER || levl[mx-1][my].typ == TDWALL || levl[mx-1][my].typ == CROSSWALL|| levl[mx-1][my].typ == TUWALL )) appear = S_hcdoor; else appear = S_vcdoor; if(!mtmp->minvis || See_invisible) block_point(mx,my); /* vision */ } else if (level.flags.is_maze_lev && rn2(2)) { ap_type = M_AP_OBJECT; appear = STATUE; } else if (roomno < 0) { ap_type = M_AP_OBJECT; appear = BOULDER; if(!mtmp->minvis || See_invisible) block_point(mx,my); /* vision */ } else if (rt == ZOO || rt == VAULT) { ap_type = M_AP_OBJECT; appear = GOLD_PIECE; } else if (rt == DELPHI) { if (rn2(2)) { ap_type = M_AP_OBJECT; appear = STATUE; } else { ap_type = M_AP_FURNITURE; appear = S_fountain; } } else if (rt == TEMPLE) { ap_type = M_AP_FURNITURE; appear = S_altar; /* * We won't bother with beehives, morgues, barracks, throne rooms * since they shouldn't contain too many mimics anyway... */ } else if (rt >= SHOPBASE) { s_sym = get_shop_item(rt - SHOPBASE); if (s_sym < 0) { ap_type = M_AP_OBJECT; appear = -s_sym; } else { if (s_sym == RANDOM_CLASS) s_sym = syms[rn2((int)sizeof(syms)-2) + 2]; goto assign_sym; } } else { s_sym = syms[rn2((int)sizeof(syms))]; assign_sym: if (s_sym >= MAXOCLASSES) { ap_type = M_AP_FURNITURE; appear = s_sym == MAXOCLASSES ? S_upstair : S_dnstair; } else if (s_sym == COIN_CLASS) { ap_type = M_AP_OBJECT; appear = GOLD_PIECE; } else { ap_type = M_AP_OBJECT; if (s_sym == S_MIMIC_DEF) { appear = STRANGE_OBJECT; } else { otmp = mkobj( (char) s_sym, FALSE ); appear = otmp->otyp; /* make sure container contents are free'ed */ if (Has_contents(otmp)) delete_contents(otmp); obfree(otmp, (struct obj *) 0); } } } mtmp->m_ap_type = ap_type; mtmp->mappearance = appear; } /* release a monster from a bag of tricks */ void bagotricks(bag) struct obj *bag; { if (!bag || bag->otyp != BAG_OF_TRICKS) { impossible("bad bag o' tricks"); } else if (bag->spe < 1) { pline(nothing_happens); } else { boolean gotone = FALSE; int cnt = 1; consume_obj_charge(bag, TRUE); if (!rn2(23)) cnt += rn1(7, 1); while (cnt-- > 0) { if (makemon((struct permonst *)0, u.ux, u.uy, NO_MM_FLAGS)) gotone = TRUE; } if (gotone) makeknown(BAG_OF_TRICKS); } } #endif /* OVLB */ /*makemon.c*/ slashem-0.0.7E7F3/src/invent.c0000664000076400007640000025143410545462317014123 0ustar aliali/* SCCS Id: @(#)invent.c 3.4 2003/12/02 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" #define NOINVSYM '#' #define CONTAINED_SYM '>' /* designator for inside a container */ #ifdef OVL1 STATIC_DCL void NDECL(reorder_invent); STATIC_DCL boolean FDECL(mergable,(struct obj *,struct obj *)); STATIC_DCL void FDECL(invdisp_nothing, (const char *,const char *)); STATIC_DCL boolean FDECL(worn_wield_only, (struct obj *)); 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 *)); /* define for getobj() */ #define FOLLOW(curr, flags) \ (((flags) & BY_NEXTHERE) ? (curr)->nexthere : (curr)->nobj) #ifdef OVLB static int lastinvnr = 51; /* 0 ... 51 (never saved&restored) */ #ifdef WIZARD /* wizards can wish for venom, which will become an invisible inventory * item without this. putting it in inv_order would mean venom would * suddenly become a choice for all the inventory-class commands, which * would probably cause mass confusion. the test for inventory venom * is only WIZARD and not wizard because the wizard can leave venom lying * around on a bones level for normal players to find. */ static char venom_inv[] = { VENOM_CLASS, 0 }; /* (constant) */ #endif void assigninvlet(otmp) register struct obj *otmp; { boolean inuse[52]; register int i; register struct obj *obj; #ifdef GOLDOBJ /* There is only one of these in inventory... */ if (otmp->oclass == COIN_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; if('a' <= i && i <= 'z') inuse[i - 'a'] = TRUE; else if('A' <= i && i <= 'Z') inuse[i - 'A' + 26] = TRUE; if(i == otmp->invlet) otmp->invlet = 0; } if((i = otmp->invlet) && (('a' <= i && i <= 'z') || ('A' <= i && i <= 'Z'))) return; for(i = lastinvnr+1; i != lastinvnr; i++) { if(i == 52) { i = -1; continue; } if(!inuse[i]) break; } otmp->invlet = (inuse[i] ? NOINVSYM : (i < 26) ? ('a'+i) : ('A'+i-26)); lastinvnr = i; } #endif /* OVLB */ #ifdef OVL1 /* note: assumes ASCII; toggling a bit puts lowercase in front of uppercase */ #define inv_rank(o) ((o)->invlet ^ 040) /* sort the inventory; used by addinv() and doorganize() */ STATIC_OVL void reorder_invent() { struct obj *otmp, *prev, *next; boolean need_more_sorting; do { /* * We expect at most one item to be out of order, so this * isn't nearly as inefficient as it may first appear. */ need_more_sorting = FALSE; for (otmp = invent, prev = 0; otmp; ) { next = otmp->nobj; if (next && inv_rank(next) < inv_rank(otmp)) { need_more_sorting = TRUE; if (prev) prev->nobj = next; else invent = next; otmp->nobj = next->nobj; next->nobj = otmp; prev = next; } else { prev = otmp; otmp = next; } } } while (need_more_sorting); } #undef inv_rank /* KMH, balance patch -- Idea by Wolfgang von Hansen . * Harmless to character, yet deliciously evil. * Somewhat expensive, so don't use it often. * * Some players who depend upon fixinv complained. They take damage * instead. */ int jumble_pack () { register struct obj *obj, *nobj, *otmp; register char let; register int dmg = 0; for (obj = invent; obj; obj = nobj) { nobj = obj->nobj; if (rn2(10)) /* Skip it */; else if (flags.invlet_constant) dmg += 2; else { /* Remove it from the inventory list (but don't touch the obj) */ extract_nobj(obj, &invent); /* Determine the new letter */ let = rnd(52) + 'A'; if (let > 'Z') let = let - 'Z' + 'a' - 1; /* Does another object share this letter? */ for (otmp = invent; otmp; otmp = otmp->nobj) if (otmp->invlet == let) otmp->invlet = obj->invlet; /* Add the item back into the inventory */ obj->invlet = let; obj->nobj = invent; /* insert at beginning */ obj->where = OBJ_INVENT; invent = obj; } } /* Clean up */ reorder_invent(); return (dmg); } /* scan a list of objects to see whether another object will merge with one of them; used in pickup.c when all 52 inventory slots are in use, to figure out whether another object could still be picked up */ struct obj * merge_choice(objlist, obj) struct obj *objlist, *obj; { struct monst *shkp; int save_nocharge; if (obj->otyp == SCR_SCARE_MONSTER) /* punt on these */ return (struct obj *)0; /* if this is an item on the shop floor, the attributes it will have when carried are different from what they are now; prevent that from eliciting an incorrect result from mergable() */ save_nocharge = obj->no_charge; if (objlist == invent && obj->where == OBJ_FLOOR && (shkp = shop_keeper(inside_shop(obj->ox, obj->oy))) != 0) { if (obj->no_charge) obj->no_charge = 0; /* A billable object won't have its `unpaid' bit set, so would erroneously seem to be a candidate to merge with a similar ordinary object. That's no good, because once it's really picked up, it won't merge after all. It might merge with another unpaid object, but we can't check that here (depends too much upon shk's bill) and if it doesn't merge it would end up in the '#' overflow inventory slot, so reject it now. */ else if (inhishop(shkp)) return (struct obj *)0; } while (objlist) { if (mergable(objlist, obj)) break; objlist = objlist->nobj; } obj->no_charge = save_nocharge; return objlist; } /* merge obj with otmp and delete obj if types agree */ int merged(potmp, pobj) struct obj **potmp, **pobj; { register struct obj *otmp = *potmp, *obj = *pobj; if(mergable(otmp, obj)) { /* Approximate age: we do it this way because if we were to * do it "accurately" (merge only when ages are identical) * we'd wind up never merging any corpses. * otmp->age = otmp->age*(1-proportion) + obj->age*proportion; * * Don't do the age manipulation if lit. We would need * to stop the burn on both items, then merge the age, * then restart the burn. */ if (!obj->lamplit) otmp->age = ((otmp->age*otmp->quan) + (obj->age*obj->quan)) / (otmp->quan + obj->quan); otmp->quan += obj->quan; #ifdef GOLDOBJ /* temporary special case for gold objects!!!! */ #endif if (otmp->oclass == COIN_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); /* really should merge the timeouts */ if (obj->lamplit) obj_merge_light_sources(obj, otmp); 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); } return 0; } /* Adjust hero intrinsics as if this object was being added to the hero's inventory. Called _before_ the object has been added to the hero's inventory. This is called when adding objects to the hero's inventory normally (via addinv) or when an object in the hero's inventory has been polymorphed in-place. It may be valid to merge this code with with addinv_core2(). */ void addinv_core1(obj) struct obj *obj; { if (obj->oclass == COIN_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; } else if (obj->otyp == CANDELABRUM_OF_INVOCATION) { if (u.uhave.menorah) impossible("already have candelabrum?"); u.uhave.menorah = 1; } else if (obj->otyp == BELL_OF_OPENING) { if (u.uhave.bell) impossible("already have silver bell?"); u.uhave.bell = 1; } else if (obj->otyp == SPE_BOOK_OF_THE_DEAD) { if (u.uhave.book) impossible("already have the book?"); u.uhave.book = 1; } else if (obj->oartifact) { if (is_quest_artifact(obj)) { if (u.uhave.questart) impossible("already have quest artifact?"); u.uhave.questart = 1; artitouch(); } set_artifact_intrinsic(obj, 1, W_ART); } } /* Adjust hero intrinsics as if this object was being added to the hero's inventory. Called _after_ the object has been added to the hero's inventory. This is called when adding objects to the hero's inventory normally (via addinv) or when an object in the hero's inventory has been polymorphed in-place. */ void addinv_core2(obj) struct obj *obj; { if (confers_luck(obj)) { /* new luckstone must be in inventory by this point * for correct calculation */ set_moreluck(); } /* KMH, balance patch -- recalculate health if you've gained healthstones */ if (obj->otyp == HEALTHSTONE) recalc_health(); } /* Add obj to the hero's inventory. Make sure the object is "free". Adjust hero attributes as necessary. */ struct obj * addinv(obj) struct obj *obj; { struct obj *otmp, *prev; 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 == COIN_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) if (merged(&otmp, &obj)) { obj = otmp; goto added; } /* didn't merge, so insert into chain */ if (flags.invlet_constant || !prev) { if (flags.invlet_constant) assigninvlet(obj); obj->nobj = invent; /* insert at beginning */ invent = obj; if (flags.invlet_constant) reorder_invent(); } else { prev->nobj = obj; /* insert at end */ obj->nobj = 0; } obj->where = OBJ_INVENT; added: addinv_core2(obj); carry_obj_effects(&youmonst, obj); /* carrying affects the obj */ update_inventory(); return(obj); } /* * Some objects are affected by being carried. * Make those adjustments here. Called _after_ the object * has been added to the hero's or monster's inventory, * and after hero's intrinsics have been updated. */ void carry_obj_effects(mon, obj) struct monst *mon; struct obj *obj; { /* Cursed figurines can spontaneously transform when carried. */ if (obj->otyp == FIGURINE) { if (obj->cursed && obj->corpsenm != NON_PM && !dead_species(obj->corpsenm,TRUE)) { attach_fig_transform_timeout(obj); } } else if (obj->otyp == TORCH && obj->lamplit) { /* MRKR: extinguish torches before putting them */ /* away. Should monsters do the same? */ if (mon == &youmonst) { You("extinguish %s before putting it away.", yname(obj)); end_burn(obj, TRUE); } } } #endif /* OVL1 */ #ifdef OVLB /* Add an item to the inventory unless we're fumbling or it refuses to be * held (via touch_artifact), and give a message. * If there aren't any free inventory slots, we'll drop it instead. * If both success and failure messages are NULL, then we're just doing the * fumbling/slot-limit checking for a silent grab. In any case, * touch_artifact will print its own messages if they are warranted. */ struct obj * hold_another_object(obj, drop_fmt, drop_arg, hold_msg) struct obj *obj; const char *drop_fmt, *drop_arg, *hold_msg; { char buf[BUFSZ]; #ifndef INVISIBLE_OBJECTS if (!Blind) obj->dknown = 1; /* maximize mergibility */ #else if (!Blind && (!obj->oinvis || See_invisible)) obj->dknown = 1; #endif if (obj->oartifact) { /* place_object may change these */ boolean crysknife = (obj->otyp == CRYSKNIFE); int oerode = obj->oerodeproof; boolean wasUpolyd = Upolyd; /* in case touching this object turns out to be fatal */ place_object(obj, u.ux, u.uy); if (!touch_artifact(obj, &youmonst)) { obj_extract_self(obj); /* remove it from the floor */ dropy(obj); /* now put it back again :-) */ return obj; } else if (wasUpolyd && !Upolyd) { /* loose your grip if you revert your form */ if (drop_fmt) pline(drop_fmt, drop_arg); obj_extract_self(obj); dropy(obj); return obj; } obj_extract_self(obj); if (crysknife) { obj->otyp = CRYSKNIFE; obj->oerodeproof = oerode; } } if (Fumbling) { if (drop_fmt) pline(drop_fmt, drop_arg); dropy(obj); } else { long oquan = obj->quan; int prev_encumbr = near_capacity(); /* before addinv() */ /* encumbrance only matters if it would now become worse than max( current_value, stressed ) */ if (prev_encumbr < MOD_ENCUMBER) prev_encumbr = MOD_ENCUMBER; /* addinv() may redraw the entire inventory, overwriting drop_arg when it comes from something like doname() */ if (drop_arg) drop_arg = strcpy(buf, drop_arg); obj = addinv(obj); if (inv_cnt() > 52 || ((obj->otyp != LOADSTONE || !obj->cursed) && near_capacity() > prev_encumbr)) { 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 { if (flags.autoquiver && !uquiver && !obj->owornmask && (is_missile(obj) || ammo_and_launcher(obj, uwep) || ammo_and_launcher(obj, uswapwep))) setuqwep(obj); if (hold_msg || drop_fmt) prinv(hold_msg, obj, oquan); } } return obj; } /* useup() all of an item regardless of its quantity */ void useupall(obj) struct obj *obj; { if (Has_contents(obj)) delete_contents(obj); setnotworn(obj); freeinv(obj); obfree(obj, (struct obj *)0); } void useup(obj) register struct obj *obj; { /* Note: This works correctly for containers because they */ /* (containers) don't merge. */ if(obj->quan > 1L){ obj->in_use = FALSE; /* no longer in use */ obj->quan--; obj->owt = weight(obj); update_inventory(); } else { useupall(obj); } } /* use one charge from an item and possibly incur shop debt for it */ void consume_obj_charge(obj, maybe_unpaid) struct obj *obj; boolean maybe_unpaid; /* false if caller handles shop billing */ { if (maybe_unpaid) check_unpaid(obj); obj->spe -= 1; if (obj->known) update_inventory(); } #endif /* OVLB */ #ifdef OVL3 /* Adjust hero's attributes as if this object was being removed from the hero's inventory. This should only be called from freeinv() and where we are polymorphing an object already in the hero's inventory. Should think of a better name... */ void freeinv_core(obj) struct obj *obj; { if (obj->oclass == COIN_CLASS) { #ifndef GOLDOBJ u.ugold -= obj->quan; obj->in_use = FALSE; #endif flags.botl = 1; return; } else if (obj->otyp == AMULET_OF_YENDOR) { if (!u.uhave.amulet) impossible("don't have amulet?"); u.uhave.amulet = 0; } else if (obj->otyp == CANDELABRUM_OF_INVOCATION) { if (!u.uhave.menorah) impossible("don't have candelabrum?"); u.uhave.menorah = 0; } else if (obj->otyp == BELL_OF_OPENING) { if (!u.uhave.bell) impossible("don't have silver bell?"); u.uhave.bell = 0; } else if (obj->otyp == SPE_BOOK_OF_THE_DEAD) { if (!u.uhave.book) impossible("don't have the book?"); u.uhave.book = 0; } else if (obj->oartifact) { if (is_quest_artifact(obj)) { if (!u.uhave.questart) impossible("don't have quest artifact?"); u.uhave.questart = 0; } set_artifact_intrinsic(obj, 0, W_ART); } if (obj->otyp == LOADSTONE) { curse(obj); } else if (confers_luck(obj)) { set_moreluck(); flags.botl = 1; } else if (obj->otyp == HEALTHSTONE) { /* KMH, balance patch -- recalculate health if you've lost healthstones */ recalc_health(); } else if (obj->otyp == FIGURINE && obj->timed) { (void) stop_timer(FIG_TRANSFORM, (genericptr_t) obj); } } /* remove an object from the hero's inventory */ void freeinv(obj) register struct obj *obj; { extract_nobj(obj, &invent); freeinv_core(obj); update_inventory(); } void delallobj(x, y) int x, y; { struct obj *otmp, *otmp2; for (otmp = level.objects[x][y]; otmp; otmp = otmp2) { if (otmp == uball) unpunish(); /* after unpunish(), or might get deallocated chain */ otmp2 = otmp->nexthere; if (otmp == uchain) continue; delobj(otmp); } } #endif /* OVL3 */ #ifdef OVL2 /* destroy object in fobj chain (if unpaid, it remains on the bill) */ void delobj(obj) register struct obj *obj; { boolean update_map; if (evades_destruction(obj)) { /* player might be doing something stupid, but we * can't guarantee that. assume special artifacts * are indestructible via drawbridges, and exploding * chests, and golem creation, and ... */ return; } update_map = (obj->where == OBJ_FLOOR || Has_contents(obj) && (obj->where == OBJ_INVENT || obj->where == OBJ_MINVENT)); if (Has_contents(obj)) delete_contents(obj); obj_extract_self(obj); if (update_map) newsym(obj->ox, obj->oy); obfree(obj, (struct obj *) 0); } #endif /* OVL2 */ #ifdef OVL0 struct obj * sobj_at(n,x,y) register int n, x, y; { register struct obj *otmp; for(otmp = level.objects[x][y]; otmp; otmp = otmp->nexthere) if(otmp->otyp == n) return(otmp); return((struct obj *)0); } #endif /* OVL0 */ #ifdef OVLB struct obj * carrying(type) register int type; { register struct obj *otmp; for(otmp = invent; otmp; otmp = otmp->nobj) if(otmp->otyp == type) return(otmp); return((struct obj *) 0); } const char * currency(amount) long amount; { if (amount == 1L) return "zorkmid"; else return "zorkmids"; } boolean have_lizard() { register struct obj *otmp; for(otmp = invent; otmp; otmp = otmp->nobj) if(otmp->otyp == CORPSE && otmp->corpsenm == PM_LIZARD) return(TRUE); return(FALSE); } struct obj * o_on(id, objchn) unsigned int id; register struct obj *objchn; { struct obj *temp; while(objchn) { if(objchn->o_id == id) return(objchn); if (Has_contents(objchn) && (temp = o_on(id,objchn->cobj))) return temp; objchn = objchn->nobj; } return((struct obj *) 0); } boolean obj_here(obj, x, y) register struct obj *obj; int x, y; { register struct obj *otmp; for(otmp = level.objects[x][y]; otmp; otmp = otmp->nexthere) if(obj == otmp) return(TRUE); return(FALSE); } #endif /* OVLB */ #ifdef OVL2 struct obj * g_at(x,y) register int x, y; { register struct obj *obj = level.objects[x][y]; while(obj) { if (obj->oclass == COIN_CLASS) return obj; obj = obj->nexthere; } return((struct obj *)0); } #endif /* OVL2 */ #ifdef OVLB #ifndef GOLDOBJ /* Make a gold object from the hero's gold. */ struct obj * mkgoldobj(q) register long q; { register struct obj *otmp; otmp = mksobj(GOLD_PIECE, FALSE, FALSE); u.ugold -= q; otmp->quan = q; otmp->owt = weight(otmp); flags.botl = 1; return(otmp); } #endif #endif /* OVLB */ #ifdef OVL1 STATIC_OVL void compactify(buf) register char *buf; /* compact a string of inventory letters by dashing runs of letters */ { register int i1 = 1, i2 = 1; register char ilet, ilet1, ilet2; ilet2 = buf[0]; ilet1 = buf[1]; buf[++i2] = buf[++i1]; ilet = buf[i1]; while(ilet) { if(ilet == ilet1+1) { if(ilet1 == ilet2+1) buf[i2 - 1] = ilet1 = '-'; else if(ilet2 == '-') { buf[i2 - 1] = ++ilet1; buf[i2] = buf[++i1]; ilet = buf[i1]; continue; } } ilet2 = ilet1; ilet1 = ilet; buf[++i2] = buf[++i1]; ilet = buf[i1]; } } /* 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"); } STATIC_OVL int ugly_checks(let, word, otmp) const char *let, *word; struct obj *otmp; { register int otyp = otmp->otyp; /* 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 */ #if 0 /* 3.4.1 -- include currently wielded weapon among the choices */ || (!strcmp(word, "wield") && (otmp->owornmask & W_WEP)) #endif || (!strcmp(word, "ready") && (otmp == uwep || (otmp == uswapwep && u.twoweap))) ) { return 1; } /* 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))) /*add check for improving*/ || ( (!strcmp(word, "wield") || !strcmp(word, "improve")) && (otmp->oclass == TOOL_CLASS && !is_weptool(otmp))) || (!strcmp(word, "eat") && !is_edible(otmp)) || (!strcmp(word, "revive") && otyp != CORPSE) /* revive */ || (!strcmp(word, "sacrifice") && (otyp != CORPSE && otyp != SEVERED_HAND && otyp != EYEBALL && /* KMH -- fixed */ otyp != AMULET_OF_YENDOR && otyp != FAKE_AMULET_OF_YENDOR)) || (!strcmp(word, "write with") && (otmp->oclass == TOOL_CLASS && #ifdef LIGHTSABERS (!is_lightsaber(otmp) || !otmp->lamplit) && #endif otyp != MAGIC_MARKER && otyp != TOWEL)) || (!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)))) || (!strncmp(word, "rub on the stone", 16) && *let == GEM_CLASS && /* using known touchstone */ otmp->dknown && objects[otyp].oc_name_known) || ((!strcmp(word, "use or apply") || !strcmp(word, "untrap with")) && /* Picks, axes, pole-weapons, bullwhips */ ((otmp->oclass == WEAPON_CLASS && !is_pick(otmp) && #ifdef FIREARMS otyp != SUBMACHINE_GUN && otyp != AUTO_SHOTGUN && otyp != ASSAULT_RIFLE && otyp != FRAG_GRENADE && otyp != GAS_GRENADE && otyp != STICK_OF_DYNAMITE && #endif !is_axe(otmp) && !is_pole(otmp) && otyp != BULLWHIP) || (otmp->oclass == POTION_CLASS && /* 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) && /* water is only for untrapping */ (strcmp(word, "untrap with") || otyp != POT_WATER || !otmp->dknown || !objects[POT_WATER].oc_name_known)) || (otmp->oclass == FOOD_CLASS && otyp != CREAM_PIE && otyp != EUCALYPTUS_LEAF) || (otmp->oclass == GEM_CLASS && !is_graystone(otmp)))) || (!strcmp(word, "invoke") && (!otmp->oartifact && !objects[otyp].oc_unique && (otyp != FAKE_AMULET_OF_YENDOR || otmp->known) && otyp != CRYSTAL_BALL && /* #invoke synonym for apply */ /* note: presenting the possibility of invoking non-artifact mirrors and/or lamps is a simply a cruel deception... */ otyp != MIRROR && otyp != MAGIC_LAMP && (otyp != OIL_LAMP || /* don't list known oil lamp */ (otmp->dknown && objects[OIL_LAMP].oc_name_known)))) || (!strcmp(word, "untrap with") && (otmp->oclass == TOOL_CLASS && otyp != CAN_OF_GREASE)) || (!strcmp(word, "charge") && !is_chargeable(otmp)) || (!strcmp(word, "poison") && !is_poisonable(otmp)) || ((!strcmp(word, "draw blood with") || !strcmp(word, "bandage your wounds with")) && (otmp->oclass == TOOL_CLASS && otyp != MEDICAL_KIT)) ) return 2; else return 0; } /* List of valid classes for allow_ugly callback */ static char valid_ugly_classes[MAXOCLASSES + 1]; /* Action word for allow_ugly callback */ static const char *ugly_word; STATIC_OVL boolean allow_ugly(obj) struct obj *obj; { return index(valid_ugly_classes, obj->oclass) && !ugly_checks(valid_ugly_classes, ugly_word, obj); } /* * getobj returns: * struct obj *xxx: object to do something with. * (struct obj *) 0 error return: no object. * &zeroobj explicitly no object (as in w-). * &thisplace this place (as in r.). #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) register const char *let,*word; { register struct obj *otmp; register char ilet; char buf[BUFSZ], qbuf[QBUFSZ]; char lets[BUFSZ], altlets[BUFSZ], *ap; 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; boolean allowfloor = FALSE; boolean usefloor = FALSE; boolean allowthisplace = FALSE; boolean useboulder = FALSE; xchar foox = 0; long cnt; boolean prezero = FALSE; long dummymask; int ugly; struct obj *floorchain; int floorfollow; if(*let == ALLOW_COUNT) let++, allowcnt = 1; #ifndef GOLDOBJ if(*let == COIN_CLASS) let++, usegold = TRUE, allowgold = (u.ugold ? TRUE : FALSE); #else if(*let == COIN_CLASS) let++, usegold = TRUE; #endif /* Equivalent of an "ugly check" for gold */ if (usegold && !strcmp(word, "eat") && (!metallivorous(youmonst.data) || youmonst.data == &mons[PM_RUST_MONSTER])) #ifndef GOLDOBJ usegold = allowgold = FALSE; #else usegold = FALSE; #endif if(*let == ALL_CLASSES) let++, allowall = TRUE; if(*let == ALLOW_NONE) let++, allownone = TRUE; if(*let == ALLOW_FLOOROBJ) { let++; if (!u.uswallow) { floorchain = can_reach_floorobj() ? level.objects[u.ux][u.uy] : (struct obj *)0; floorfollow = BY_NEXTHERE; } else { floorchain = u.ustuck->minvent; floorfollow = 0; /* nobj */ } usefloor = TRUE; allowfloor = !!floorchain; } if(*let == ALLOW_THISPLACE) let++, allowthisplace = TRUE; /* "ugly check" for reading fortune cookies, part 1 */ /* The normal 'ugly check' keeps the object on the inventory list. * We don't want to do that for shirts/cookies, so the check for * them is handled a bit differently (and also requires that we set * allowall in the caller) */ if(allowall && !strcmp(word, "read")) allowall = FALSE; /* another ugly check: show boulders (not statues) */ if(*let == WEAPON_CLASS && !strcmp(word, "throw") && throws_rocks(youmonst.data)) useboulder = TRUE; if(allownone) *bp++ = '-'; #ifndef GOLDOBJ if(allowgold) *bp++ = def_oc_syms[COIN_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 || (useboulder && otmp->otyp == BOULDER) ) { bp[foo++] = otmp->invlet; /* ugly checks */ ugly = ugly_checks(let, word, otmp); if (ugly == 1) { foo--; foox++; } else if (ugly == 2) 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; *ap++ = otmp->invlet; } } else { /* "ugly check" for reading fortune cookies, part 2 */ if ((!strcmp(word, "read") && (otmp->otyp == FORTUNE_COOKIE #ifdef TOURIST || otmp->otyp == T_SHIRT #endif ))) allowall = TRUE; } if(ilet == 'z') ilet = 'A'; else ilet++; } bp[foo] = 0; if(foo == 0 && bp > buf && bp[-1] == ' ') *--bp = 0; Strcpy(lets, bp); /* necessary since we destroy buf */ if(foo > 5) /* compactify string */ compactify(bp); *ap = '\0'; if (allowfloor && !allowall) { if (usegold) { valid_ugly_classes[0] = COIN_CLASS; Strcpy(valid_ugly_classes + 1, let); } else Strcpy(valid_ugly_classes, let); ugly_word = word; for (otmp = floorchain; otmp; otmp = FOLLOW(otmp, floorfollow)) if (allow_ugly(otmp)) break; if (!otmp) allowfloor = FALSE; } if(!foo && !allowall && !allownone && #ifndef GOLDOBJ !allowgold && #endif !allowfloor && !allowthisplace) { You("don't have anything %sto %s.", foox ? "else " : "", word); return((struct obj *)0); } for(;;) { cnt = 0; if (allowcnt == 2) allowcnt = 1; /* abort previous count */ Sprintf(qbuf, "What do you want to %s? [", word); bp = eos(qbuf); if (buf[0]) { Sprintf(bp, "%s or ?", buf); bp = eos(bp); } *bp++ = '*'; if (allowfloor) *bp++ = ','; if (allowthisplace) *bp++ = '.'; if (!buf[0] && bp[-2] != '[') { /* "*," -> "* or ,"; "*." -> "* or ."; "*,." -> "*, or ." */ --bp; Sprintf(bp, " or %c", *bp); bp += 5; } *bp++ = ']'; *bp = '\0'; #ifdef REDO if (in_doagain) ilet = readchar(); else #endif ilet = yn_function(qbuf, (char *)0, '\0'); if(ilet == '0') prezero = TRUE; while(digit(ilet) && allowcnt) { #ifdef REDO if (ilet != '?' && ilet != '*') savech(ilet); #endif cnt = 10*cnt + (ilet - '0'); allowcnt = 2; /* signal presence of cnt */ ilet = readchar(); } if(digit(ilet)) { pline("No count allowed with this command."); continue; } if(index(quitchars,ilet)) { if(flags.verbose) pline(Never_mind); return((struct obj *)0); } if(ilet == '-') { return(allownone ? &zeroobj : (struct obj *) 0); } if(ilet == def_oc_syms[COIN_CLASS]) { if (!usegold) { if (!strncmp(word, "rub on ", 7)) { /* the dangers of building sentences... */ You("cannot rub gold%s.", word + 3); } else { 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 * gold pieces was allowed, and did interesting things * to your money supply. The LRS is the tax bureau * from Larn. */ if(cnt < 0) { pline_The("LRS would be very interested to know you have that much."); return(struct obj *)0; } #ifndef GOLDOBJ if(!(allowcnt == 2 && cnt < u.ugold)) cnt = u.ugold; return(mkgoldobj(cnt)); #endif } if(ilet == '.') { if (allowthisplace) return &thisplace; else { pline(silly_thing_to, word); return(struct obj *)0; } } if(ilet == ',') { int n; menu_item *pick_list; if (!usefloor) { pline(silly_thing_to, word); return(struct obj *)0; } else if (!allowfloor) { if ((Levitation || Flying)) You("cannot reach the floor to %s while %sing.", word, Levitation ? "float" : "fly"); else pline("There's nothing here to %s.", word); return(struct obj *)0; } Sprintf(qbuf, "%s what?", word); n = query_objlist(qbuf, floorchain, floorfollow|INVORDER_SORT|SIGNAL_CANCEL, &pick_list, PICK_ONE, allowall ? allow_all : allow_ugly); if (n<0) { if (flags.verbose) pline(Never_mind); return (struct obj *)0; } else if (!n) continue; otmp = pick_list->item.a_obj; if (allowcnt && pick_list->count < otmp->quan) otmp = splitobj(otmp, pick_list->count); free((genericptr_t)pick_list); return otmp; } 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); return((struct obj *)0); } /* they typed a letter (not a space) at the prompt */ } /* WAC - throw now takes a count to allow for single/controlled shooting */ 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[COIN_CLASS]) #endif allowcnt = 1; if(cnt == 0 && prezero) return((struct obj *)0); if (cnt == 1) { save_cm = (char *) 1; /* Non zero */ multi = 0; } if(cnt > 1) { /* You("can only throw one item at a time."); continue; */ multi = cnt - 1; cnt = 1; } } #ifdef GOLDOBJ flags.botl = 1; /* May have changed the amount of money */ #endif #ifdef REDO savech(ilet); #endif for (otmp = invent; otmp; otmp = otmp->nobj) if (otmp->invlet == ilet) break; if(!otmp) { You("don't have that object."); #ifdef REDO if (in_doagain) return((struct obj *) 0); #endif continue; } else if (cnt < 0 || otmp->quan < cnt) { You("don't have that many! You have only %ld.", otmp->quan); #ifdef REDO if (in_doagain) return((struct obj *) 0); #endif continue; } break; } if(!allowall && let && !index(let,otmp->oclass) #ifdef GOLDOBJ && !(usegold && otmp->oclass == COIN_CLASS) #endif ) { silly_thing(word, otmp); return((struct obj *)0); } if(allowcnt == 2) { /* cnt given */ if(cnt == 0) return (struct obj *)0; if(cnt != otmp->quan) { /* don't split a stack of cursed loadstones */ if (otmp->otyp == LOADSTONE && otmp->cursed) /* kludge for canletgo()'s can't-drop-this message */ otmp->corpsenm = (int) cnt; else otmp = splitobj(otmp, cnt); } } return(otmp); } void silly_thing(word, otmp) const char *word; struct obj *otmp; { const char *s1, *s2, *s3, *what; int ocls = otmp->oclass, otyp = otmp->otyp; s1 = s2 = s3 = 0; /* check for attempted use of accessory commands ('P','R') on armor and for corresponding armor commands ('W','T') on accessories */ if (ocls == ARMOR_CLASS) { if (!strcmp(word, "put on")) s1 = "W", s2 = "wear", s3 = ""; else if (!strcmp(word, "remove")) s1 = "T", s2 = "take", s3 = " off"; } else if ((ocls == RING_CLASS || otyp == MEAT_RING) || ocls == AMULET_CLASS || (otyp == BLINDFOLD || otyp == TOWEL || otyp == LENSES)) { if (!strcmp(word, "wear")) s1 = "P", s2 = "put", s3 = " on"; else if (!strcmp(word, "take off")) s1 = "R", s2 = "remove", s3 = ""; } if (s1) { what = "that"; /* quantity for armor and accessory objects is always 1, but some things should be referred to as plural */ if (otyp == LENSES || is_gloves(otmp) || is_boots(otmp)) what = "those"; pline("Use the '%s' command to %s %s%s.", s1, s2, what, s3); } else { pline(silly_thing_to, word); } } #endif /* OVL1 */ #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; { return((int)(otmp->unpaid)); } boolean wearing_armor() { return((boolean)(uarm || uarmc || uarmf || uarmg || uarmh || uarms #ifdef TOURIST || uarmu #endif )); } boolean is_worn(otmp) register struct obj *otmp; { return((boolean)(!!(otmp->owornmask & (W_ARMOR | W_RING | W_AMUL | W_TOOL | #ifdef STEED W_SADDLE | #endif W_WEP | W_SWAPWEP | W_QUIVER)))); } static NEARDATA const char removeables[] = { ARMOR_CLASS, WEAPON_CLASS, RING_CLASS, AMULET_CLASS, TOOL_CLASS, 0 }; /* interactive version of getobj - used for Drop, Identify and */ /* 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; int itemcount; #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 extra_removeables[3+1]; /* uwep,uswapwep,uquiver */ 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")) { ident = TRUE; filter = not_fully_identified; } iletct = collect_obj_classes(ilets, invent, FALSE, #ifndef GOLDOBJ (allowgold != 0), #endif filter, &itemcount); unpaid = count_unpaid(invent); if (ident && !iletct) { return -1; /* no further identifications */ } 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++] = ' '; } ilets[iletct++] = 'i'; if (!combo) ilets[iletct++] = 'm'; /* allow menu presentation on request */ ilets[iletct] = '\0'; for (;;) { Sprintf(qbuf,"What kinds of thing do you want to %s? [%s]", word, ilets); getlin(qbuf, buf); if (buf[0] == '\033') return(0); if (index(buf, 'i')) { if (display_inventory((char *)0, TRUE) == '\033') return 0; } else break; } extra_removeables[0] = '\0'; if (takeoff) { /* arbitrary types of items can be placed in the weapon slots [any duplicate entries in extra_removeables[] won't matter] */ if (uwep) (void)strkitten(extra_removeables, uwep->oclass); if (uswapwep) (void)strkitten(extra_removeables, uswapwep->oclass); if (uquiver) (void)strkitten(extra_removeables, uquiver->oclass); } ip = buf; olets[oletct = 0] = '\0'; while ((sym = *ip++) != '\0') { if (sym == ' ') continue; oc_of_sym = def_char_to_objclass(sym); if (takeoff && oc_of_sym != MAXOCLASSES) { if (index(extra_removeables, oc_of_sym)) { ; /* skip rest of takeoff checks */ } else if (!index(removeables, oc_of_sym)) { pline("Not applicable."); return 0; } else if (oc_of_sym == ARMOR_CLASS && !wearing_armor()) { You("are not wearing any armor."); return 0; } else if (oc_of_sym == WEAPON_CLASS && !uwep && !uswapwep && !uquiver) { You("are not wielding anything."); return 0; } else if (oc_of_sym == RING_CLASS && !uright && !uleft) { You("are not wearing rings."); return 0; } else if (oc_of_sym == AMULET_CLASS && !uamul) { You("are not wearing an amulet."); return 0; } else if (oc_of_sym == TOOL_CLASS && !ublindf) { You("are not wearing a blindfold."); return 0; } } if (oc_of_sym == COIN_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) { You("don't have any %c's.", sym); } else if (oc_of_sym != VENOM_CLASS) { /* suppress venom */ if (!index(olets, oc_of_sym)) { add_valid_menu_class(oc_of_sym); olets[oletct++] = oc_of_sym; olets[oletct] = 0; } } } if (m_seen) 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; } } /* * Walk through the chain starting at objchn and ask for all objects * with olet in olets (if nonNULL) and satisfying ckfn (if nonnull) * whether the action in question (i.e., fn) has to be performed. * If allflag then no questions are asked. Max gives the max nr of * objects to be treated. Return the number of objects treated. */ int askchain(objchn, olets, allflag, fn, ckfn, mx, word) struct obj **objchn; register int allflag, mx; register const char *olets, *word; /* olets is an Obj Class char array */ register int FDECL((*fn),(OBJ_P)), FDECL((*ckfn),(OBJ_P)); { struct obj *otmp, *otmp2, *otmpo; register char sym, ilet; register int cnt = 0, dud = 0, tmp; 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); ininv = (*objchn == invent); /* Changed so the askchain is interrogated in the order specified. * For example, if a person specifies =/ then first all rings will be * asked about followed by all wands -dgk */ nextclass: ilet = 'a'-1; if (*objchn && (*objchn)->oclass == COIN_CLASS) ilet--; /* extra iteration */ for (otmp = *objchn; otmp; otmp = otmp2) { if(ilet == 'z') ilet = 'A'; else ilet++; otmp2 = otmp->nobj; if (olets && *olets && otmp->oclass != *olets) continue; if (takeoff && !is_worn(otmp)) continue; if (ident && !not_fully_identified(otmp)) continue; 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); } else sym = 'y'; otmpo = otmp; if (sym == '#') { /* Number was entered; split the object unless it corresponds to 'none' or 'all'. 2 special cases: cursed loadstones and welded weapons (eg, multiple daggers) will remain as merged unit; done to avoid splitting an object that won't be droppable (even if we're picking up rather than dropping). */ if (!yn_number) sym = 'n'; else { sym = 'y'; if (yn_number < otmp->quan && !welded(otmp) && (!otmp->cursed || otmp->otyp != LOADSTONE)) { otmp = splitobj(otmp, yn_number); } } } switch(sym){ case 'a': allflag = 1; case 'y': tmp = (*fn)(otmp); if(tmp < 0) { if (container_gone(fn)) { /* otmp caused magic bag to explode; both are now gone */ otmp = 0; /* and return */ } else if (otmp && otmp != otmpo) { /* split occurred, merge again */ (void) merged(&otmpo, &otmp); } goto ret; } cnt += tmp; if(--mx == 0) goto ret; case 'n': if(nodot) dud++; default: break; case 'q': /* special case for seffects() */ if (ident) cnt = -1; goto ret; } } if (olets && *olets && *++olets) goto nextclass; if(!takeoff && (dud || cnt)) pline("That was all."); else if(!dud && !cnt) pline("No applicable objects."); ret: return(cnt); } /* * Object identification routines: */ /* make an object actually be identified; no display updating */ void fully_identify_obj(otmp) struct obj *otmp; { makeknown(otmp->otyp); if (otmp->oartifact) discover_artifact((xchar)otmp->oartifact); otmp->known = otmp->dknown = otmp->bknown = otmp->rknown = 1; if (otmp->otyp == EGG && otmp->corpsenm != NON_PM) learn_egg_type(otmp->corpsenm); } /* ggetobj callback routine; identify an object and give immediate feedback */ int identify(otmp) struct obj *otmp; { fully_identify_obj(otmp); prinv((char *)0, otmp, 0L); return 1; } /* menu of unidentified objects; select and identify up to id_limit of them */ STATIC_OVL void menu_identify(id_limit) int id_limit; { menu_item *pick_list; int n, i, first = 1; char buf[BUFSZ]; /* assumptions: id_limit > 0 and at least one unID'd item is present */ while (id_limit) { Sprintf(buf, "What would you like to identify %s?", first ? "first" : "next"); n = query_objlist(buf, invent, SIGNAL_NOMENU|USE_INVLET|INVORDER_SORT, &pick_list, PICK_ANY, not_fully_identified); if (n > 0) { if (n > id_limit) n = id_limit; for (i = 0; i < n; i++, id_limit--) (void) identify(pick_list[i].item.a_obj); free((genericptr_t) pick_list); mark_synch(); /* Before we loop to pop open another menu */ } else { if (n < 0) pline("That was all."); id_limit = 0; /* Stop now */ } first = 0; } } /* dialog with user to identify a given number of items; 0 means all */ void identify_pack(id_limit) int id_limit; { struct obj *obj, *the_obj; int n, unid_cnt; unid_cnt = 0; the_obj = 0; /* if unid_cnt ends up 1, this will be it */ for (obj = invent; obj; obj = obj->nobj) if (not_fully_identified(obj)) ++unid_cnt, the_obj = obj; if (!unid_cnt) { You("have already identified all of your possessions."); } else if (!id_limit) { /* identify everything */ if (unid_cnt == 1) { (void) identify(the_obj); } else { /* TODO: use fully_identify_obj and cornline/menu/whatever here */ for (obj = invent; obj; obj = obj->nobj) if (not_fully_identified(obj)) (void) identify(obj); } } else { /* identify up to `id_limit' items */ 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) menu_identify(id_limit); } update_inventory(); } #endif /* OVLB */ #ifdef OVL2 STATIC_OVL char obj_to_let(obj) /* should of course only be called for things in invent */ register struct obj *obj; { #ifndef GOLDOBJ if (obj->oclass == COIN_CLASS) return GOLD_SYM; #endif if (!flags.invlet_constant) { obj->invlet = NOINVSYM; reassign(); } return obj->invlet; } /* * Print the indicated quantity of the given object. If quan == 0L then use * the current quantity. */ void prinv(prefix, obj, quan) const char *prefix; 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. * > Then the object is contained and doesn't have an inventory letter. */ 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 == COIN_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; } #endif /* OVL1 */ #ifdef OVLB /* the 'i' command */ int ddoinv() { (void) display_inventory((char *)0, FALSE); return 0; } /* * find_unpaid() * * Scan the given list of objects. If last_found is NULL, return the first * unpaid object found. If last_found is not NULL, then skip over unpaid * objects until last_found is reached, then set last_found to NULL so the * next unpaid object is returned. This routine recursively follows * containers. */ STATIC_OVL struct obj * find_unpaid(list, last_found) struct obj *list, **last_found; { struct obj *obj; while (list) { if (list->unpaid) { if (*last_found) { /* still looking for previous unpaid object */ if (list == *last_found) *last_found = (struct obj *) 0; } else return (*last_found = list); } if (Has_contents(list)) { if ((obj = find_unpaid(list->cobj, last_found)) != 0) return obj; } list = list->nobj; } return (struct obj *) 0; } /* * 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; char *invlet = flags.inv_order; int n, classcount; winid win; /* windows being used */ static winid local_win = WIN_ERR; /* window for partial menus */ anything any; menu_item *selected; #ifdef PROXY_GRAPHICS static int busy = 0; if (busy) return 0; busy++; #endif /* overriden by global flag */ if (flags.perm_invent) { win = (lets && *lets) ? local_win : WIN_INVEN; /* create the first time used */ if (win == WIN_ERR) win = local_win = create_nhwindow(NHW_MENU); } else win = WIN_INVEN; /* Exit early if no inventory -- but keep going if we are doing a permanent inventory update. We need to keep going so the permanent inventory window updates itself to remove the last item(s) dropped. One down side: the addition of the exception for permanent inventory window updates _can_ pop the window up when it's not displayed -- even if it's empty -- because we don't know at this level if its up or not. This may not be an issue if empty checks are done before hand and the call 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 #ifdef PROXY_GRAPHICS busy--; #endif return 0; } /* oxymoron? temporarily assign permanent inventory letters */ if (!flags.invlet_constant) reassign(); if (lets && strlen(lets) == 1) { /* when only one item of interest, use pline instead of menus; we actually use a fake message-line menu in order to allow the user to perform selection at the --More-- prompt for tty */ ret = '\0'; 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)); if (out_cnt) *out_cnt = -1L; /* select all */ break; } } #ifdef PROXY_GRAPHICS busy--; #endif return ret; } start_menu(win); nextclass: classcount = 0; any.a_void = 0; /* set all bits to zero */ for(otmp = invent; otmp; otmp = otmp->nobj) { ilet = otmp->invlet; if(!lets || !*lets || index(lets, ilet)) { if (!flags.sortpack || otmp->oclass == *invlet) { if (flags.sortpack && !classcount) { any.a_void = 0; /* zero */ add_menu(win, NO_GLYPH, &any, 0, 0, iflags.menu_headings, let_to_name(*invlet, FALSE), MENU_UNSELECTED); classcount++; } any.a_char = ilet; add_menu(win, obj_to_glyph(otmp), &any, ilet, 0, ATR_NONE, doname(otmp), MENU_UNSELECTED); } } } if (flags.sortpack) { if (*++invlet) goto nextclass; #ifdef WIZARD if (--invlet != venom_inv) { invlet = venom_inv; goto nextclass; } #endif } end_menu(win, (char *) 0); 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 */ #ifdef PROXY_GRAPHICS busy--; #endif return ret; } /* * 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. */ int count_unpaid(list) struct obj *list; { int count = 0; while (list) { if (list->unpaid) count++; if (Has_contents(list)) count += count_unpaid(list->cobj); list = list->nobj; } 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) { if (Role_if(PM_PRIEST)) list->bknown = TRUE; switch(type) { case BUC_BLESSED: if (list->oclass != COIN_CLASS && list->bknown && list->blessed) count++; break; case BUC_CURSED: if (list->oclass != COIN_CLASS && list->bknown && list->cursed) count++; break; case BUC_UNCURSED: if (list->oclass != COIN_CLASS && list->bknown && !list->blessed && !list->cursed) count++; break; case BUC_UNKNOWN: if (list->oclass != COIN_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() { winid win; struct obj *otmp, *marker; register char ilet; char *invlet = flags.inv_order; int classcount, count, num_so_far; int save_unpaid = 0; /* lint init */ long cost, totcost; count = count_unpaid(invent); if (count == 1) { marker = (struct obj *) 0; otmp = find_unpaid(invent, &marker); /* see if the unpaid item is in the top level inventory */ for (marker = invent; marker; marker = marker->nobj) if (marker == otmp) break; pline("%s", xprname(otmp, distant_name(otmp, doname), marker ? otmp->invlet : CONTAINED_SYM, TRUE, unpaid_cost(otmp), 0L)); return; } win = create_nhwindow(NHW_MENU); cost = totcost = 0; num_so_far = 0; /* count of # printed so far */ if (!flags.invlet_constant) reassign(); do { classcount = 0; for (otmp = invent; otmp; otmp = otmp->nobj) { ilet = otmp->invlet; if (otmp->unpaid) { if (!flags.sortpack || otmp->oclass == *invlet) { if (flags.sortpack && !classcount) { putstr(win, 0, let_to_name(*invlet, TRUE)); classcount++; } totcost += cost = unpaid_cost(otmp); /* suppress "(unpaid)" suffix */ 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++; } } } } while (flags.sortpack && (*++invlet)); if (count > num_so_far) { /* something unpaid is contained */ if (flags.sortpack) putstr(win, 0, let_to_name(CONTAINED_SYM, TRUE)); /* * Search through the container objects in the inventory for * unpaid items. The top level inventory items have already * been listed. */ for (otmp = invent; otmp; otmp = otmp->nobj) { if (Has_contents(otmp)) { marker = (struct obj *) 0; /* haven't found any */ while (find_unpaid(otmp->cobj, &marker)) { totcost += cost = unpaid_cost(marker); save_unpaid = marker->unpaid; marker->unpaid = 0; /* suppress "(unpaid)" suffix */ putstr(win, 0, xprname(marker, distant_name(marker, doname), CONTAINED_SYM, TRUE, cost, 0L)); marker->unpaid = save_unpaid; } } } } putstr(win, 0, ""); putstr(win, 0, xprname((struct obj *)0, "Total:", '*', FALSE, totcost, 0L)); display_nhwindow(win, FALSE); destroy_nhwindow(win); } /* query objlist callback: return TRUE if obj type matches "this_type" */ static int this_type; STATIC_OVL boolean this_type_only(obj) struct obj *obj; { return (obj->oclass == this_type); } /* the 'I' command */ int dotypeinv() { char c = '\0'; int n, i = 0; char *extra_types, types[BUFSZ]; int class_count, oclass, unpaid_count, itemcount; boolean billx = *u.ushops && doinvbill(0); menu_item *pick_list; 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; } unpaid_count = count_unpaid(invent); if (flags.menu_style != MENU_TRADITIONAL) { if (flags.menu_style == MENU_FULL || flags.menu_style == MENU_PARTIAL) { traditional = FALSE; i = UNPAID_TYPES; if (billx) i |= BILLED_TYPES; n = query_category(prompt, invent, i, &pick_list, PICK_ONE); if (!n) return 0; this_type = c = pick_list[0].item.a_int; free((genericptr_t) pick_list); } } if (traditional) { /* 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, &itemcount); if (unpaid_count) { Strcat(types, "u"); class_count++; } if (billx) { Strcat(types, "x"); class_count++; } /* add everything not already included; user won't see these */ extra_types = eos(types); *extra_types++ = '\033'; if (!unpaid_count) *extra_types++ = 'u'; if (!billx) *extra_types++ = 'x'; *extra_types = '\0'; /* for index() */ for (i = 0; i < MAXOCLASSES; i++) if (!index(types, def_oc_syms[i])) { *extra_types++ = def_oc_syms[i]; *extra_types = '\0'; } if(class_count > 1) { c = yn_function(prompt, types, '\0'); #ifdef REDO savech(c); #endif if(c == '\0') { clear_nhwindow(WIN_MESSAGE); return 0; } } else { /* only one thing to itemize */ if (unpaid_count) c = 'u'; else if (billx) c = 'x'; else c = types[0]; } } if (c == 'x') { if (billx) (void) doinvbill(1); else pline("No used-up objects on your shopping bill."); return 0; } if (c == 'u') { if (unpaid_count) dounpaid(); else You("are not carrying any unpaid objects."); return 0; } if (traditional) { oclass = def_char_to_objclass(c); /* change to object class */ if (oclass == COIN_CLASS) { return doprgold(); } else if (index(types, c) > index(types, '\033')) { You("have no such objects."); return 0; } this_type = oclass; } if (query_objlist((char *) 0, invent, (flags.invlet_constant ? USE_INVLET : 0)|INVORDER_SORT, &pick_list, PICK_NONE, this_type_only) > 0) free((genericptr_t)pick_list); return 0; } /* return a string describing the dungeon feature at if there is one worth mentioning at that location; otherwise null */ const char * dfeature_at(x, y, buf) int x, y; char *buf; { struct rm *lev = &levl[x][y]; int ltyp = lev->typ, cmap = -1; const char *dfeature = 0; static char altbuf[BUFSZ]; if (IS_DOOR(ltyp)) { switch (lev->doormask) { case D_NODOOR: cmap = S_ndoor; break; /* "doorway" */ case D_ISOPEN: cmap = S_vodoor; break; /* "open door" */ case D_BROKEN: dfeature = "broken door"; break; default: cmap = S_vcdoor; break; /* "closed door" */ } /* override door description for open drawbridge */ if (is_drawbridge_wall(x, y) >= 0) dfeature = "open drawbridge portcullis", cmap = -1; } else if (IS_FOUNTAIN(ltyp)) cmap = S_fountain; /* "fountain" */ else if (IS_THRONE(ltyp)) cmap = S_throne; /* "opulent throne" */ else if (is_lava(x,y)) cmap = S_lava; /* "molten lava" */ else if (is_ice(x,y)) cmap = S_ice; /* "ice" */ else if (is_pool(x,y)) dfeature = "pool of water"; #ifdef SINKS else if (IS_SINK(ltyp)) cmap = S_sink; /* "sink" */ else if (IS_TOILET(ltyp)) cmap = S_toilet; #endif else if (IS_ALTAR(ltyp)) { Sprintf(altbuf, "altar to %s (%s)", a_gname(), align_str(Amask2align(lev->altarmask & ~AM_SHRINE))); dfeature = altbuf; } else if ((x == xupstair && y == yupstair) || (x == sstairs.sx && y == sstairs.sy && sstairs.up)) cmap = S_upstair; /* "staircase up" */ else if ((x == xdnstair && y == ydnstair) || (x == sstairs.sx && y == sstairs.sy && !sstairs.up)) cmap = S_dnstair; /* "staircase down" */ else if (x == xupladder && y == yupladder) cmap = S_upladder; /* "ladder up" */ else if (x == xdnladder && y == ydnladder) cmap = S_dnladder; /* "ladder down" */ else if (ltyp == DRAWBRIDGE_DOWN) cmap = S_vodbridge; /* "lowered drawbridge" */ else if (ltyp == DBWALL) cmap = S_vcdbridge; /* "raised drawbridge" */ else if (IS_GRAVE(ltyp)) cmap = S_grave; /* "grave" */ else if (ltyp == TREE) cmap = S_tree; /* "tree" */ else if (ltyp == IRONBARS) dfeature = "set of iron bars"; if (cmap >= 0) dfeature = defsyms[cmap].explanation; if (dfeature) Strcpy(buf, dfeature); return dfeature; } /* look at what is here; if there are many objects (5 or more), don't show them unless obj_cnt is 0 */ int look_here(obj_cnt, picked_some) int obj_cnt; /* obj_cnt > 0 implies that autopickup is in progess */ boolean picked_some; { struct obj *otmp; struct trap *trap; const char *verb = Blind ? "feel" : "see"; const char *dfeature = (char*) 0; char fbuf[BUFSZ], fbuf2[BUFSZ]; winid tmpwin; boolean skip_objects = (obj_cnt >= 5), felt_cockatrice = FALSE; 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.", an(defsyms[trap_to_defsym(trap->ttyp)].explanation)); otmp = level.objects[u.ux][u.uy]; dfeature = dfeature_at(u.ux, u.uy, fbuf2); if (dfeature && !strcmp(dfeature, "pool of water") && Underwater) dfeature = 0; if (Blind) { boolean drift = Is_airlevel(&u.uz) || Is_waterlevel(&u.uz); if (dfeature && !strncmp(dfeature, "altar ", 6)) { /* don't say "altar" twice, dfeature has more info */ You("try to feel what is here."); } else { You("try to feel what is %s%s.", drift ? "floating here" : "lying here on the ", drift ? "" : surface(u.ux, u.uy)); } if (dfeature && !drift && !strcmp(dfeature, surface(u.ux,u.uy))) dfeature = 0; /* ice already identifed */ if (!can_reach_floor()) { pline("But you can't reach it!"); return(0); } } if (dfeature) { Sprintf(fbuf, "There is %s here.", an(dfeature)); if (flags.suppress_alert < FEATURE_NOTICE_VER(0,0,7) && (IS_FOUNTAIN(levl[u.ux][u.uy].typ) || #ifdef SINKS IS_SINK(levl[u.ux][u.uy].typ) || IS_TOILET(levl[u.ux][u.uy].typ) #endif )) Strcat(fbuf, " Use \"q.\" to drink from it."); } if (!otmp || is_lava(u.ux,u.uy) || (is_pool(u.ux,u.uy) && !Underwater)) { if (dfeature) pline(fbuf); sense_engr_at(u.ux, u.uy, FALSE); /* Eric Backus */ if (!skip_objects && (Blind || !dfeature)) You("%s no objects here.", verb); return(!!Blind); } /* we know there is something here */ if (skip_objects) { if (dfeature) pline(fbuf); sense_engr_at(u.ux, u.uy, FALSE); /* Eric Backus */ There("are %s%s objects here.", (obj_cnt <= 10) ? "several" : "many", picked_some ? " more" : ""); } else if (!otmp->nexthere) { /* only one object */ if (dfeature) pline(fbuf); sense_engr_at(u.ux, u.uy, FALSE); /* Eric Backus */ #ifdef INVISIBLE_OBJECTS if (otmp->oinvis && !See_invisible) verb = "feel"; #endif You("%s here %s.", verb, doname(otmp)); if (otmp->otyp == CORPSE) feel_cockatrice(otmp, FALSE); } else { display_nhwindow(WIN_MESSAGE, FALSE); tmpwin = create_nhwindow(NHW_MENU); if(dfeature) { putstr(tmpwin, 0, fbuf); putstr(tmpwin, 0, ""); } putstr(tmpwin, 0, Blind ? "Things that you feel here:" : "Things that are here:"); for ( ; otmp; otmp = otmp->nexthere) { if (otmp->otyp == CORPSE && will_feel_cockatrice(otmp, FALSE)) { char buf[BUFSZ]; felt_cockatrice = TRUE; Strcpy(buf, doname(otmp)); Strcat(buf, "..."); putstr(tmpwin, 0, buf); break; } putstr(tmpwin, 0, doname(otmp)); } display_nhwindow(tmpwin, TRUE); destroy_nhwindow(tmpwin); if (felt_cockatrice) feel_cockatrice(otmp, FALSE); sense_engr_at(u.ux, u.uy, FALSE); /* Eric Backus */ } return(!!Blind); } /* explicilty look at what is here, including all objects */ int dolook() { return look_here(0, FALSE); } boolean will_feel_cockatrice(otmp, force_touch) struct obj *otmp; boolean force_touch; { if ((Blind || force_touch) && !uarmg && !Stone_resistance && (otmp->otyp == CORPSE && touch_petrifies(&mons[otmp->corpsenm]))) return TRUE; return FALSE; } void feel_cockatrice(otmp, force_touch) struct obj *otmp; boolean force_touch; { char kbuf[BUFSZ]; if (will_feel_cockatrice(otmp, force_touch)) { if(poly_when_stoned(youmonst.data)) You("touched the %s corpse with your bare %s.", mons[otmp->corpsenm].mname, makeplural(body_part(HAND))); else pline("Touching the %s corpse is a fatal mistake...", mons[otmp->corpsenm].mname); Sprintf(kbuf, "%s corpse", an(mons[otmp->corpsenm].mname)); instapetrify(kbuf); } } #endif /* OVLB */ #ifdef OVL1 void stackobj(obj) struct obj *obj; { struct obj *otmp; for(otmp = level.objects[obj->ox][obj->oy]; otmp; otmp = otmp->nexthere) if(otmp != obj && merged(&obj,&otmp)) break; return; } STATIC_OVL boolean mergable(otmp, obj) /* returns TRUE if obj & otmp can be merged */ register struct obj *otmp, *obj; { if (obj->otyp != otmp->otyp) return FALSE; #ifdef GOLDOBJ /* coins of the same kind will always merge */ if (obj->oclass == COIN_CLASS) return TRUE; #endif if (obj->unpaid != otmp->unpaid || obj->spe != otmp->spe || obj->dknown != otmp->dknown || (obj->bknown != otmp->bknown && !Role_if(PM_PRIEST)) || obj->cursed != otmp->cursed || obj->blessed != otmp->blessed || obj->no_charge != otmp->no_charge || obj->obroken != otmp->obroken || obj->otrapped != otmp->otrapped || obj->lamplit != otmp->lamplit || flags.pickup_thrown && obj->was_thrown != otmp->was_thrown || #ifdef INVISIBLE_OBJECTS obj->oinvis != otmp->oinvis || #endif #ifdef UNPOLYPILE obj->oldtyp != otmp->oldtyp || #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) && (obj->oerodeproof!=otmp->oerodeproof || obj->rknown!=otmp->rknown)) return FALSE; if (obj->oclass == FOOD_CLASS && (obj->oeaten != otmp->oeaten || obj->odrained != otmp->odrained || obj->orotten != otmp->orotten)) return(FALSE); if (obj->otyp == CORPSE || obj->otyp == EGG || obj->otyp == TIN) { if (obj->corpsenm != otmp->corpsenm) return FALSE; } /* armed grenades do not merge */ if ((obj->timed || otmp->timed) && is_grenade(obj)) return FALSE; /* hatching eggs don't merge; ditto for revivable corpses */ if ((obj->timed || otmp->timed) && (obj->otyp == EGG || (obj->otyp == CORPSE && otmp->corpsenm >= LOW_PM && is_reviver(&mons[otmp->corpsenm])))) return FALSE; /* allow candle merging only if their ages are close */ /* see begin_burn() for a reference for the magic "25" */ /* [ALI] Slash'EM can't rely on using 25, because we * have chosen to reduce the cost of candles such that * the initial age is no longer a multiple of 25. The * simplest solution is just to use 20 instead, since * initial candle age is always a multiple of 20. */ if ((obj->otyp == TORCH || Is_candle(obj)) && obj->age/20 != otmp->age/20) return(FALSE); /* burning potions of oil never merge */ /* MRKR: nor do burning torches */ if ((obj->otyp == POT_OIL || obj->otyp == TORCH) && obj->lamplit) return FALSE; /* don't merge surcharged item with base-cost item */ if (obj->unpaid && !same_price(obj, otmp)) return FALSE; /* if they have names, make sure they're the same */ if ( (obj->onamelth != otmp->onamelth && ((obj->onamelth && otmp->onamelth) || obj->otyp == CORPSE) ) || (obj->onamelth && otmp->onamelth && strncmp(ONAME(obj), ONAME(otmp), (int)obj->onamelth))) return FALSE; /* for the moment, any additional information is incompatible */ if (obj->oxlth || otmp->oxlth) return FALSE; if(obj->oartifact != otmp->oartifact) return FALSE; if(obj->known == otmp->known || !objects[otmp->otyp].oc_uses_known) { return((boolean)(objects[obj->otyp].oc_merge)); } else return(FALSE); } int doprgold() { /* 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; } #endif /* OVL1 */ #ifdef OVLB int doprwep() { if (!uwep) { if (!u.twoweap){ You("are empty %s.", body_part(HANDED)); return 0; } /* Avoid printing "right hand empty" and "other hand empty" */ if (!uswapwep) { You("are attacking with both %s.", makeplural(body_part(HAND))); return 0; } Your("right %s is empty.", body_part(HAND)); } else { prinv((char *)0, uwep, 0L); } if (u.twoweap) { if (uswapwep) prinv((char *)0, uswapwep, 0L); else Your("other %s is empty.", body_part(HAND)); } return 0; #if 0 if(!uwep && !uswapwep && !uquiver) You("are empty %s.", body_part(HANDED)); else { char lets[3]; register int ct = 0; if(uwep) lets[ct++] = obj_to_let(uwep); if(uswapwep) lets[ct++] = obj_to_let(uswapwep); if(uquiver) lets[ct++] = obj_to_let(uquiver); lets[ct] = 0; (void) display_inventory(lets, FALSE); } return 0; #endif } int doprarm() { if(!wearing_armor()) You("are not wearing any armor."); else { #ifdef TOURIST char lets[8]; #else char lets[7]; #endif register int ct = 0; #ifdef TOURIST if(uarmu) lets[ct++] = obj_to_let(uarmu); #endif if(uarm) lets[ct++] = obj_to_let(uarm); if(uarmc) lets[ct++] = obj_to_let(uarmc); if(uarmh) lets[ct++] = obj_to_let(uarmh); if(uarms) lets[ct++] = obj_to_let(uarms); if(uarmg) lets[ct++] = obj_to_let(uarmg); if(uarmf) lets[ct++] = obj_to_let(uarmf); lets[ct] = 0; (void) display_inventory(lets, FALSE); } return 0; } int doprring() { if(!uleft && !uright) You("are not wearing any rings."); else { char lets[3]; register int ct = 0; if(uleft) lets[ct++] = obj_to_let(uleft); if(uright) lets[ct++] = obj_to_let(uright); lets[ct] = 0; (void) display_inventory(lets, FALSE); } return 0; } int dopramulet() { if (!uamul) You("are not wearing an amulet."); else prinv((char *)0, uamul, 0L); return 0; } STATIC_OVL boolean tool_in_use(obj) struct obj *obj; { if ((obj->owornmask & (W_TOOL #ifdef STEED | W_SADDLE #endif )) != 0L) return TRUE; if (obj->oclass != TOOL_CLASS) return FALSE; return (boolean)(obj == uwep || obj->lamplit || (obj->otyp == LEASH && obj->leashmon)); } int doprtool() { struct obj *otmp; int ct = 0; char lets[52+1]; for (otmp = invent; otmp; otmp = otmp->nobj) if (tool_in_use(otmp)) lets[ct++] = obj_to_let(otmp); lets[ct] = '\0'; if (!ct) You("are not using any tools."); else (void) display_inventory(lets, FALSE); return 0; } /* '*' command; combines the ')' + '[' + '=' + '"' + '(' commands; show inventory of all currently wielded, worn, or used objects */ int doprinuse() { struct obj *otmp; int ct = 0; char lets[52+1]; for (otmp = invent; otmp; otmp = otmp->nobj) if (is_worn(otmp) || tool_in_use(otmp)) lets[ct++] = obj_to_let(otmp); lets[ct] = '\0'; if (!ct) You("are not wearing or wielding anything."); else (void) display_inventory(lets, FALSE); return 0; } /* * uses up an object that's on the floor, charging for it as necessary */ void useupf(obj, numused) register struct obj *obj; long numused; { register struct obj *otmp; boolean at_u = (obj->ox == u.ux && obj->oy == u.uy); /* 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); obj->in_use = FALSE; /* rest no longer in use */ } else otmp = obj; if(costly_spot(otmp->ox, otmp->oy)) { if(index(u.urooms, *in_rooms(otmp->ox, otmp->oy, 0))) addtobill(otmp, FALSE, FALSE, FALSE); else (void)stolen_value(otmp, otmp->ox, otmp->oy, FALSE, FALSE, TRUE); } delobj(otmp); if (at_u && u.uundetected && hides_under(youmonst.data)) u.uundetected = OBJ_AT(u.ux, u.uy); } #endif /* OVLB */ #ifdef OVL1 /* * Conversion from a class to a string for printing. * This must match the object class order. */ STATIC_VAR NEARDATA const char *names[] = { 0, "Illegal objects", "Weapons", "Armor", "Rings", "Amulets", "Tools", "Comestibles", "Potions", "Scrolls", "Spellbooks", "Wands", "Coins", "Gems", "Boulders/Statues", "Iron balls", "Chains", "Venoms" }; static NEARDATA const char oth_symbols[] = { CONTAINED_SYM, '\0' }; static NEARDATA const char *oth_names[] = { "Bagged/Boxed items" }; static NEARDATA char *invbuf = (char *)0; static NEARDATA unsigned invbufsiz = 0; char * let_to_name(let,unpaid) char let; boolean unpaid; { const char *class_name; const char *pos; int oclass = (let >= 1 && let < MAXOCLASSES) ? let : 0; unsigned len; if (oclass) class_name = names[oclass]; else if ((pos = index(oth_symbols, let)) != 0) class_name = oth_names[pos - oth_symbols]; else class_name = names[0]; len = strlen(class_name) + (unpaid ? sizeof "unpaid_" : sizeof ""); if (len > invbufsiz) { if (invbuf) free((genericptr_t)invbuf); invbufsiz = len + 10; /* add slop to reduce incremental realloc */ invbuf = (char *) alloc(invbufsiz); } if (unpaid) Strcat(strcpy(invbuf, "Unpaid "), class_name); else Strcpy(invbuf, class_name); return invbuf; } void free_invbuf() { if (invbuf) free((genericptr_t)invbuf), invbuf = (char *)0; invbufsiz = 0; } #endif /* OVL1 */ #ifdef OVLB void reassign() { register int i; register struct obj *obj; for(obj = invent, i = 0; obj; obj = obj->nobj, i++) obj->invlet = (i < 26) ? ('a'+i) : ('A'+i-26); lastinvnr = i; } #endif /* OVLB */ #ifdef OVL1 int doorganize() /* inventory organizer by Del Lamb */ { struct obj *obj, *otmp; register int ix, cur; register char let; char alphabet[52+1], buf[52+1]; char qbuf[QBUFSZ]; char allowall[2]; const char *adj_type; if (!flags.invlet_constant) reassign(); /* get a pointer to the object the user wants to organize */ allowall[0] = ALL_CLASSES; allowall[1] = '\0'; if (!(obj = getobj(allowall,"adjust"))) return(0); /* initialize the list with all upper and lower case letters */ for (let = 'a', ix = 0; let <= 'z';) alphabet[ix++] = let++; for (let = 'A', ix = 26; let <= 'Z';) alphabet[ix++] = let++; alphabet[52] = 0; /* blank out all the letters currently in use in the inventory */ /* except those that will be merged with the selected object */ for (otmp = invent; otmp; otmp = otmp->nobj) if (otmp != obj && !mergable(otmp,obj)) { if (otmp->invlet <= 'Z') alphabet[(otmp->invlet) - 'A' + 26] = ' '; else alphabet[(otmp->invlet) - 'a'] = ' '; } /* compact the list by removing all the blanks */ for (ix = cur = 0; ix <= 52; ix++) if (alphabet[ix] != ' ') buf[cur++] = alphabet[ix]; /* and by dashing runs of letters */ if(cur > 5) compactify(buf); /* get new letter to use as inventory letter */ for (;;) { Sprintf(qbuf, "Adjust letter to what [%s]?",buf); let = yn_function(qbuf, (char *)0, '\0'); if(index(quitchars,let)) { pline(Never_mind); return(0); } if (let == '@' || !letter(let)) pline("Select an inventory slot letter."); else break; } /* change the inventory and print the resulting item */ adj_type = "Moving:"; /* * don't use freeinv/addinv to avoid double-touching artifacts, * dousing lamps, losing luck, cursing loadstone, etc. */ extract_nobj(obj, &invent); for (otmp = invent; otmp;) if (merged(&otmp,&obj)) { adj_type = "Merging:"; obj = otmp; otmp = otmp->nobj; extract_nobj(obj, &invent); } else { if (otmp->invlet == let) { adj_type = "Swapping:"; otmp->invlet = obj->invlet; } otmp = otmp->nobj; } /* inline addinv (assuming flags.invlet_constant and !merged) */ obj->invlet = let; obj->nobj = invent; /* insert at beginning */ obj->where = OBJ_INVENT; invent = obj; reorder_invent(); prinv(adj_type, obj, 0L); update_inventory(); return(0); } /* common to display_minventory and display_cinventory */ STATIC_OVL void invdisp_nothing(hdr, txt) const char *hdr, *txt; { winid win; anything any; menu_item *selected; any.a_void = 0; win = create_nhwindow(NHW_MENU); start_menu(win); add_menu(win, NO_GLYPH, &any, 0, 0, iflags.menu_headings, hdr, MENU_UNSELECTED); add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE, "", MENU_UNSELECTED); add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE, txt, MENU_UNSELECTED); end_menu(win, (char *)0); if (select_menu(win, PICK_NONE, &selected) > 0) free((genericptr_t)selected); destroy_nhwindow(win); return; } /* query_objlist callback: return things that could possibly be worn/wielded */ STATIC_OVL boolean worn_wield_only(obj) struct obj *obj; { return (obj->oclass == WEAPON_CLASS || obj->oclass == ARMOR_CLASS || obj->oclass == AMULET_CLASS || obj->oclass == RING_CLASS || obj->oclass == TOOL_CLASS); } /* * Display a monster's inventory. * Returns a pointer to the object from the monster's inventory selected * or NULL if nothing was selected. * * By default, only worn and wielded items are displayed. The caller * can pick one. Modifier flags are: * * MINV_NOLET - nothing selectable * 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 * the mon's inventory. We can get away with using a * stack variable object because monsters don't carry * gold in their inventory, so it won't merge. */ m_gold = zeroobj; m_gold.otyp = GOLD_PIECE; m_gold.oclass = COIN_CLASS; m_gold.quan = mon->mgold; m_gold.dknown = 1; m_gold.where = OBJ_FREE; /* we had better not merge and free this object... */ if (add_to_minv(mon, &m_gold)) 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; } /* * Display the contents of a container in inventory style. * Currently, this is only used for statues, via wand of probing. * [ALI] Also used when looting medical kits. */ struct obj * display_cinventory(obj) register struct obj *obj; { struct obj *ret; char tmp[QBUFSZ]; int n; menu_item *selected = 0; Sprintf(tmp,"Contents of %s:", doname(obj)); if (obj->cobj) { n = query_objlist(tmp, obj->cobj, INVORDER_SORT, &selected, PICK_NONE, allow_all); } else { invdisp_nothing(tmp, "(empty)"); n = 0; } if (n > 0) { ret = selected[0].item.a_obj; free((genericptr_t)selected); } else ret = (struct obj *) 0; return ret; } /* query objlist callback: return TRUE if obj is at given location */ static coord only; STATIC_OVL boolean only_here(obj) struct obj *obj; { return (obj->ox == only.x && obj->oy == only.y); } /* * Display a list of buried items in inventory style. Return a non-zero * value if there were items at that spot. * * Currently, this is only used with a wand of probing zapped downwards. */ int display_binventory(x, y, as_if_seen) int x, y; boolean as_if_seen; { struct obj *obj; menu_item *selected = 0; int n; /* count # of objects here */ for (n = 0, obj = level.buriedobjlist; obj; obj = obj->nobj) if (obj->ox == x && obj->oy == y) { if (as_if_seen) obj->dknown = 1; n++; } if (n) { only.x = x; only.y = y; if (query_objlist("Things that are buried here:", level.buriedobjlist, INVORDER_SORT, &selected, PICK_NONE, only_here) > 0) free((genericptr_t)selected); only.x = only.y = 0; } return n; } #endif /* OVL1 */ /*invent.c*/ slashem-0.0.7E7F3/src/dokick.c0000664000076400007640000012600210545462317014054 0ustar aliali/* SCCS Id: @(#)dokick.c 3.4 2003/12/04 */ /* Copyright (c) Izchak Miller, Mike Stephenson, Steve Linhart, 1989. */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" #include "eshk.h" #define is_bigfoot(x) ((x) == &mons[PM_SASQUATCH]) #define martial() (martial_bonus() || is_bigfoot(youmonst.data) || \ (uarmf && uarmf->otyp == KICKING_BOOTS)) static NEARDATA struct rm *maploc; static NEARDATA const char *gate_str; extern boolean notonhead; /* for long worms */ STATIC_DCL void FDECL(kickdmg, (struct monst *, BOOLEAN_P)); STATIC_DCL void FDECL(kick_monster, (XCHAR_P, XCHAR_P)); STATIC_DCL int FDECL(kick_object, (XCHAR_P, XCHAR_P)); STATIC_DCL char *FDECL(kickstr, (char *)); STATIC_DCL void FDECL(otransit_msg, (struct obj *, BOOLEAN_P, long)); STATIC_DCL void FDECL(drop_to, (coord *,SCHAR_P)); static NEARDATA struct obj *kickobj; static const char kick_passes_thru[] = "kick passes harmlessly through"; STATIC_OVL void kickdmg(mon, clumsy) register struct monst *mon; register boolean clumsy; { register int mdx, mdy; register int dmg = ( ACURRSTR + ACURR(A_DEX) + ACURR(A_CON) )/ 15; int kick_skill = P_NONE; int blessed_foot_damage = 0; boolean trapkilled = FALSE; if (uarmf && uarmf->otyp == KICKING_BOOTS) dmg += 5; /* excessive wt affects dex, so it affects dmg */ if (clumsy) dmg /= 2; /* kicking a dragon or an elephant will not harm it */ if (thick_skinned(mon->data)) dmg = 0; /* attacking a shade is useless */ if (mon->data == &mons[PM_SHADE]) dmg = 0; if ((is_undead(mon->data) || is_demon(mon->data)) && uarmf && uarmf->blessed) blessed_foot_damage = 1; if (mon->data == &mons[PM_SHADE] && !blessed_foot_damage) { pline_The("%s.", kick_passes_thru); /* doesn't exercise skill or abuse alignment or frighten pet, and shades have no passive counterattack */ return; } if(mon->m_ap_type) seemimic(mon); check_caitiff(mon); /* 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) { /* convert potential damage to actual damage */ dmg = rnd(dmg); if (martial()) { if (dmg > 1) kick_skill = P_MARTIAL_ARTS; dmg += rn2(ACURR(A_DEX)/2 + 1); dmg += weapon_dam_bonus((struct obj *)0); } /* a good kick exercises your dex */ exercise(A_DEX, TRUE); } if (blessed_foot_damage) dmg += rnd(4); if (uarmf) dmg += uarmf->spe; dmg += u.udaminc; /* add ring(s) of increase damage */ if (dmg > 0) { mon->mhp -= dmg; #ifdef SHOW_DMG showdmg(dmg); #endif } 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, 0)) { 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); if (mintrap(mon) == 2) trapkilled = TRUE; } } } (void) passive(mon, TRUE, mon->mhp > 0, AT_KICK); if (mon->mhp <= 0 && !trapkilled) killed(mon); /* may bring up a dialog, so put this after all messages */ if (kick_skill != P_NONE) /* exercise proficiency */ use_skill(kick_skill, 1); } STATIC_OVL void kick_monster(x, y) register xchar x, y; { register boolean clumsy = FALSE; register struct monst *mon = m_at(x, y); register int i, j, canhitmon, objenchant; bhitpos.x = x; bhitpos.y = y; if (!attack_checks(mon, TRUE)) return; setmangry(mon); /* Kick attacks by kicking monsters are normal attacks, not special. * This is almost always worthless, since you can either take one turn * and do all your kicks, or else take one turn and attack the monster * normally, getting all your attacks _including_ all your kicks. * If you have >1 kick attack, you get all of them. */ if (Upolyd && attacktype(youmonst.data, AT_KICK)) { struct attack *uattk; int sum; schar tmp = find_roll_to_hit(mon); schar roll = 0; for (i = 0; i < NATTK; i++) { /* first of two kicks might have provoked counterattack that has incapacitated the hero (ie, floating eye) */ if (multi < 0) break; uattk = &youmonst.data->mattk[i]; /* we only care about kicking attacks here */ if (uattk->aatyp != AT_KICK) continue; if (mon->data == &mons[PM_SHADE] && (!uarmf || !uarmf->blessed)) { /* doesn't matter whether it would have hit or missed, and shades have no passive counterattack */ Your("%s %s.", kick_passes_thru, mon_nam(mon)); break; /* skip any additional kicks */ } else if (tmp > (roll = rnd(20))) { 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, tmp, roll, uattk); (void)passive(mon, 0, 1, AT_KICK); } } return; } if(Levitation && !rn2(3) && verysmall(mon->data) && !is_flyer(mon->data)) { pline("Floating in the air, you miss wildly!"); exercise(A_DEX, FALSE); (void) passive(mon, FALSE, 1, AT_KICK); return; } /*STEPHEN WHITE'S NEW CODE */ canhitmon = 0; if (need_one(mon)) canhitmon = 1; if (need_two(mon)) canhitmon = 2; if (need_three(mon)) canhitmon = 3; if (need_four(mon)) canhitmon = 4; if (Role_if(PM_MONK) && !Upolyd) { if (!uwep && !uarm && !uarms) objenchant = u.ulevel / 4; else if (!uwep) objenchant = u.ulevel / 12; else objenchant = 0; if (objenchant < 0) objenchant = 0; } else if (uarmf) objenchant = uarmf->spe; else objenchant = 0; if (objenchant < canhitmon && !Upolyd) { Your("attack doesn't seem to harm %s.", mon_nam(mon)); (void) passive(mon, FALSE, 1, TRUE); return; } i = -inv_weight(); j = weight_cap(); if(i < (j*3)/10) { if(!rn2((i < j/10) ? 2 : (i < j/5) ? 3 : 4)) { if(martial() && !rn2(2)) goto doit; Your("clumsy kick does no damage."); (void) passive(mon, FALSE, 1, AT_KICK); return; } if(i < j/10) clumsy = TRUE; else if(!rn2((i < j/5) ? 2 : 3)) clumsy = TRUE; } if(Fumbling) clumsy = TRUE; else if (uarm && objects[uarm->otyp].oc_bulky && ACURR(A_DEX) < rnd(25)) clumsy = TRUE; doit: You("kick %s.", mon_nam(mon)); if(!rn2(clumsy ? 3 : 4) && (clumsy || !bigmonst(mon->data)) && mon->mcansee && !mon->mtrapped && !thick_skinned(mon->data) && mon->data->mlet != S_EEL && haseyes(mon->data) && mon->mcanmove && !mon->mstun && !mon->mconf && !mon->msleeping && mon->data->mmove >= 12) { if(!nohands(mon->data) && !rn2(martial() ? 5 : 3)) { pline("%s blocks your %skick.", Monnam(mon), clumsy ? "clumsy " : ""); (void) passive(mon, FALSE, 1, AT_KICK); return; } else { mnexto(mon); if(mon->mx != x || mon->my != y) { if(memory_is_invisible(x, y)) { unmap_object(x, y); newsym(x, y); } 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", clumsy ? "clumsy " : ""); (void) passive(mon, FALSE, 1, AT_KICK); return; } } } kickdmg(mon, clumsy); return; } /* * Return TRUE if caught (the gold taken care of), FALSE otherwise. * The gold object is *not* attached to the fobj chain! */ boolean ghitm(mtmp, gold) register struct monst *mtmp; register struct obj *gold; { boolean msg_given = FALSE; if(!likes_gold(mtmp->data) && !mtmp->isshk && !mtmp->ispriest && !is_mercenary(mtmp->data)) { wakeup(mtmp); } else if (!mtmp->mcanmove) { /* too light to do real damage */ if (canseemon(mtmp)) { pline_The("%s harmlessly %s %s.", xname(gold), otense(gold, "hit"), mon_nam(mtmp)); msg_given = TRUE; } } 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 */ /* 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) { if (mtmp->mpeaceful) verbalize("Thank you for your contribution."); else verbalize("Thanks, scum!"); } else if (is_mercenary(mtmp->data)) { long goldreqd = 0L; if (rn2(3)) { if (mtmp->data == &mons[PM_SOLDIER]) goldreqd = 100L; else if (mtmp->data == &mons[PM_SERGEANT]) goldreqd = 250L; else if (mtmp->data == &mons[PM_LIEUTENANT]) goldreqd = 500L; else if (mtmp->data == &mons[PM_CAPTAIN]) 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; } } if (mtmp->mpeaceful) verbalize("That should do. Now beat it!"); else verbalize("That's not enough, coward!"); } #ifndef GOLDOBJ dealloc_obj(gold); #else add_to_minv(mtmp, gold); #endif return TRUE; } if (!msg_given) miss(xname(gold), mtmp); return FALSE; } /* container is kicked, dropped, thrown or otherwise impacted by player. * Assumes container is on floor. Checks contents for possible damage. */ void container_impact_dmg(obj) struct obj *obj; { struct monst *shkp; struct obj *otmp, *otmp2; long loss = 0L; boolean costly, insider; xchar x = obj->ox, y = obj->oy; /* only consider normal containers */ if (!Is_container(obj) || Is_mbag(obj)) return; costly = ((shkp = shop_keeper(*in_rooms(x, y, SHOPBASE))) && costly_spot(x, y)); insider = (*u.ushops && inside_shop(u.ux, u.uy) && *in_rooms(x, y, SHOPBASE) == *u.ushops); for (otmp = obj->cobj; otmp; otmp = otmp2) { const char *result = (char *)0; otmp2 = otmp->nobj; if (objects[otmp->otyp].oc_material == GLASS && otmp->oclass != GEM_CLASS && !obj_resists(otmp, 33, 100)) { result = "shatter"; } else if (otmp->otyp == EGG && !rn2(3)) { 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, TRUE); if (otmp->quan > 1L) useup(otmp); else { obj_extract_self(otmp); obfree(otmp, (struct obj *) 0); } } } 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)); } } } STATIC_OVL int kick_object(x, y) xchar x, y; { int range; register struct monst *mon, *shkp; struct trap *trap; char bhitroom; boolean costly, isgold, slide = FALSE; /* if a pile, the "top" object gets kicked */ kickobj = level.objects[x][y]; /* kickobj should always be set due to conditions of call */ if(!kickobj || kickobj->otyp == BOULDER || kickobj == uball || kickobj == uchain) return(0); if ((trap = t_at(x,y)) != 0 && (((trap->ttyp == PIT || trap->ttyp == SPIKED_PIT) && !Passes_walls) || trap->ttyp == WEB)) { if (!trap->tseen) find_trap(trap); You_cant("kick %s that's in a %s!", something, Hallucination ? "tizzy" : (trap->ttyp == WEB) ? "web" : "pit"); return 1; } if(Fumbling && !rn2(3)) { Your("clumsy kick missed."); return(1); } 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(killer_cxname(kickobj, TRUE))); killer = kbuf; done(STONING); } } /* range < 2 means the object will not move. */ /* maybe dexterity should also figure here. */ /* MAR - if there are multiple objects, range is calculated */ /* from a single object (not entire stack!) */ if (kickobj->quan > 1L && (kickobj->oclass != COIN_CLASS)) /*MAR*/ range = (int)((ACURRSTR)/2 - kickobj->owt/kickobj->quan/40); else range = (int)((ACURRSTR)/2 - kickobj->owt/40); if(martial()) range += rnd(3); if (is_pool(x, y)) { /* you're in the water too; significantly reduce range */ range = range / 3 + 1; /* {1,2}=>1, {3,4,5}=>2, {6,7,8}=>3 */ } else { if (is_ice(x, y)) range += rnd(3), slide = TRUE; if (kickobj->greased) range += rnd(3), slide = TRUE; } /* Mjollnir is magically too heavy to kick */ if(kickobj->oartifact == ART_MJOLLNIR) range = 1; /* see if the object has a place to move into */ if(!ZAP_POS(levl[x+u.dx][y+u.dy].typ) || closed_door(x+u.dx, y+u.dy)) range = 1; costly = ((shkp = shop_keeper(*in_rooms(x, y, SHOPBASE))) && costly_spot(x, y)); isgold = (kickobj->oclass == COIN_CLASS); if (IS_ROCK(levl[x][y].typ) || closed_door(x, y)) { if ((!martial() && rn2(20) > ACURR(A_DEX)) || 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) || !index(u.urooms, *in_rooms(x, y, SHOPBASE)))) addtobill(kickobj, FALSE, FALSE, FALSE); if (!flooreffects(kickobj, u.ux, u.uy, "fall")) { place_object(kickobj, u.ux, u.uy); stackobj(kickobj); newsym(u.ux, u.uy); } return 1; } /* a box gets a chance of breaking open here */ if(Is_box(kickobj)) { boolean otrp = kickobj->otrapped; if(range < 2) pline("THUD!"); container_impact_dmg(kickobj); if (kickobj->olocked) { if (!rn2(5) || (martial() && !rn2(2))) { You("break open the lock!"); kickobj->olocked = 0; kickobj->obroken = 1; if (otrp) (void) chest_trap(kickobj, LEG, FALSE); return(1); } } else { if (!rn2(3) || (martial() && !rn2(2))) { pline_The("lid slams open, then falls shut."); if (otrp) (void) chest_trap(kickobj, LEG, FALSE); return(1); } } if(range < 2) return(1); /* else let it fall through to the next cases... */ } /* fragile objects should not be kicked */ if (hero_breaks(kickobj, kickobj->ox, kickobj->oy, FALSE)) return 1; /* too heavy to move. range is calculated as potential distance from * player, so range == 2 means the object may move up to one square * from its current position */ if(range < 2 || (isgold && kickobj->quan > 300L)) { if(!Is_box(kickobj)) pline("Thump!"); 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); newsym(x, y); mon = bhit(u.dx, u.dy, range, KICKED_WEAPON, (int FDECL((*),(MONST_P,OBJ_P)))0, (int FDECL((*),(OBJ_P,OBJ_P)))0, &kickobj); if (!kickobj) return 1; /* object broken (and charged for if costly) */ if(mon) { if (mon->isshk && kickobj->where == OBJ_MINVENT && kickobj->ocarry == mon) return 1; /* alert shk caught it */ notonhead = (mon->mx != bhitpos.x || mon->my != bhitpos.y); if(isgold ? ghitm(mon, kickobj) : /* caught? */ thitmonst(mon, kickobj, 3)) /* hit && used up? */ return(1); } /* the object might have fallen down a hole */ if (kickobj->where == OBJ_MIGRATING) { if (costly) { if(isgold) costly_gold(x, y, kickobj->quan); else (void)stolen_value(kickobj, x, y, (boolean)shkp->mpeaceful, FALSE, FALSE); } return 1; } bhitroom = *in_rooms(bhitpos.x, bhitpos.y, SHOPBASE); if (costly && (!costly_spot(bhitpos.x, bhitpos.y) || *in_rooms(x, y, SHOPBASE) != bhitroom)) { if(isgold) costly_gold(x, y, kickobj->quan); else (void)stolen_value(kickobj, x, y, (boolean)shkp->mpeaceful, FALSE, FALSE); } if(flooreffects(kickobj,bhitpos.x,bhitpos.y,"fall")) return(1); place_object(kickobj, bhitpos.x, bhitpos.y); stackobj(kickobj); newsym(kickobj->ox, kickobj->oy); return(1); } STATIC_OVL char * kickstr(buf) char *buf; { const char *what; 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"; else if (IS_TOILET(maploc->typ)) what = "a toilet"; #endif else if (IS_ALTAR(maploc->typ)) what = "an altar"; else if (IS_DRAWBRIDGE(maploc->typ)) what = "a drawbridge"; else if (maploc->typ == STAIRS) what = "the stairs"; else if (maploc->typ == LADDER) what = "a ladder"; else if (maploc->typ == IRONBARS) what = "an iron bar"; else what = "something weird"; return strcat(strcpy(buf, "kicking "), what); } int dokick() { int x, y; int avrg_attrib; register struct monst *mtmp; boolean no_kick = FALSE; char buf[BUFSZ]; if (nolimbs(youmonst.data) || slithy(youmonst.data)) { You("have no legs to kick with."); no_kick = TRUE; } else if (verysmall(youmonst.data)) { You("are too small to do any kicking."); no_kick = TRUE; #ifdef STEED } else if (u.usteed) { if (yn_function("Kick your steed?", ynchars, 'y') == 'y') { You("kick %s.", mon_nam(u.usteed)); kick_steed(); return 1; } else { return 0; } #endif } else if (Wounded_legs) { /* note: jump() has similar code */ long wl = (EWounded_legs & BOTH_SIDES); const char *bp = body_part(LEG); if (wl == BOTH_SIDES) bp = makeplural(bp); Your("%s%s %s in no shape for kicking.", (wl == LEFT_SIDE) ? "left " : (wl == RIGHT_SIDE) ? "right " : "", bp, (wl == BOTH_SIDES) ? "are" : "is"); no_kick = TRUE; } else if (near_capacity() > SLT_ENCUMBER) { Your("load is too heavy to balance yourself for a kick."); no_kick = TRUE; } else if (youmonst.data->mlet == S_LIZARD) { Your("legs cannot kick effectively."); no_kick = TRUE; } else if (u.uinwater && !rn2(2)) { Your("slow motion kick doesn't hit anything."); no_kick = TRUE; } else if (u.utrap) { switch (u.utraptype) { case TT_PIT: pline("There's not enough room to kick down here."); break; case TT_WEB: case TT_BEARTRAP: You_cant("move your %s!", body_part(LEG)); break; default: break; } no_kick = TRUE; } if (no_kick) { /* ignore direction typed before player notices kick failed */ display_nhwindow(WIN_MESSAGE, TRUE); /* --More-- */ return 0; } if(!getdir((char *)0)) return(0); if(!u.dx && !u.dy) return(0); x = u.ux + u.dx; y = u.uy + u.dy; /* KMH -- Kicking boots always succeed */ if (uarmf && uarmf->otyp == KICKING_BOOTS) avrg_attrib = 99; else avrg_attrib = (ACURRSTR+ACURR(A_DEX)+ACURR(A_CON))/3; if(u.uswallow) { switch(rn2(3)) { case 0: You_cant("move your %s!", body_part(LEG)); break; case 1: if (is_animal(u.ustuck->data)) { pline("%s burps loudly.", Monnam(u.ustuck)); break; } default: Your("feeble kick has no effect."); break; } return(1); } if (Levitation) { int xx, yy; xx = u.ux - u.dx; yy = u.uy - u.dy; /* doors can be opened while levitating, so they must be * reachable for bracing purposes * Possible extension: allow bracing against stuff on the side? */ if (isok(xx,yy) && !IS_ROCK(levl[xx][yy].typ) && !IS_DOOR(levl[xx][yy].typ) && (!Is_airlevel(&u.uz) || !OBJ_AT(xx,yy))) { You("have nothing to brace yourself against."); return(0); } } wake_nearby(); u_wipe_engr(2); maploc = &levl[x][y]; /* The next five tests should stay in */ /* their present order: monsters, pools, */ /* objects, non-doors, doors. */ if(MON_AT(x, y)) { struct permonst *mdat; mtmp = m_at(x, y); mdat = mtmp->data; if (!mtmp->mpeaceful || !canspotmon(mtmp)) flags.forcefight = TRUE; /* attack even if invisible */ kick_monster(x, y); flags.forcefight = FALSE; /* see comment in attack_checks() */ if (!DEADMONSTER(mtmp) && !canspotmon(mtmp) && /* check x and y; a monster that evades your kick by jumping to an unseen square doesn't leave an I behind */ mtmp->mx == x && mtmp->my == y && !memory_is_invisible(x, y) && !(u.uswallow && mtmp == u.ustuck)) map_invisible(x, y); if((Is_airlevel(&u.uz) || Levitation) && flags.move) { int range; range = ((int)youmonst.data->cwt + (weight_cap() + inv_weight())); if (range < 1) range = 1; /* divide by zero avoidance */ range = (3*(int)mdat->cwt) / range; if(range < 1) range = 1; hurtle(-u.dx, -u.dy, range, TRUE); } return(1); } if (memory_is_invisible(x, y)) { unmap_object(x, y); newsym(x, y); } if (is_pool(x, y) ^ !!u.uinwater) { /* objects normally can't be removed from water by kicking */ You("splash some water around."); return 1; } kickobj = (struct obj *)0; if (OBJ_AT(x, y) && (!Levitation || Is_airlevel(&u.uz) || Is_waterlevel(&u.uz) || sobj_at(BOULDER,x,y))) { if(kick_object(x, y)) { if(Is_airlevel(&u.uz)) hurtle(-u.dx, -u.dy, 1, TRUE); /* assume it's light */ return(1); } goto ouch; } if(!IS_DOOR(maploc->typ)) { if(maploc->typ == SDOOR) { if(!Levitation && rn2(30) < avrg_attrib) { cvt_sdoor_to_door(maploc); /* ->typ = DOOR */ pline("Crash! %s a secret door!", /* don't "kick open" when it's locked unless it also happens to be trapped */ (maploc->doormask & (D_LOCKED|D_TRAPPED)) == D_LOCKED ? "Your kick uncovers" : "You kick open"); exercise(A_DEX, TRUE); if(maploc->doormask & D_TRAPPED) { maploc->doormask = D_NODOOR; b_trapped("door", FOOT); } else if (maploc->doormask != D_NODOOR && !(maploc->doormask & D_LOCKED)) maploc->doormask = D_ISOPEN; if (Blind) feel_location(x,y); /* we know it's gone */ else newsym(x,y); if (maploc->doormask == D_ISOPEN || maploc->doormask == D_NODOOR) unblock_point(x,y); /* vision */ return(1); } else goto ouch; } if(maploc->typ == SCORR) { if(!Levitation && rn2(30) < avrg_attrib) { pline("Crash! You kick open a secret passage!"); exercise(A_DEX, TRUE); maploc->typ = CORR; if (Blind) feel_location(x,y); /* we know it's gone */ else newsym(x,y); unblock_point(x,y); /* vision */ return(1); } else goto ouch; } if(IS_THRONE(maploc->typ)) { register int i; if(Levitation) goto dumb; if((Luck < 0 || maploc->doormask) && !rn2(3)) { maploc->typ = ROOM; maploc->doormask = 0; /* don't leave loose ends.. */ (void) mkgold((long)rnd(200), x, y); if (Blind) pline("CRASH! You destroy it."); else { pline("CRASH! You destroy the throne."); newsym(x, y); } exercise(A_DEX, TRUE); return(1); } else if(Luck > 0 && !rn2(3) && !maploc->looted) { (void) mkgold((long) rn1(201, 300), x, y); i = Luck + 1; if(i > 6) i = 6; while(i--) (void) mksobj_at(rnd_class(DILITHIUM_CRYSTAL, LUCKSTONE-1), x, y, FALSE, TRUE); if (Blind) You("kick %s loose!", something); else { You("kick loose some ornamental coins and gems!"); newsym(x, y); } /* prevent endless milking */ maploc->looted = T_LOOTED; return(1); } else if (!rn2(4)) { if(dunlev(&u.uz) < dunlevs_in_dungeon(&u.uz)) { fall_through(FALSE); return(1); } else goto ouch; } goto ouch; } if(IS_ALTAR(maploc->typ)) { if(Levitation) goto dumb; You("kick %s.",(Blind ? something : "the altar")); if(!rn2(3)) goto ouch; altar_wrath(x, y); exercise(A_DEX, TRUE); return(1); } if(IS_FOUNTAIN(maploc->typ)) { if(Levitation) goto dumb; You("kick %s.",(Blind ? something : "the fountain")); if(!rn2(3)) goto ouch; /* make metal boots rust */ if(uarmf && rn2(3)) if (!rust_dmg(uarmf, "metal boots", 1, FALSE, &youmonst)) { Your("boots get wet."); /* could cause short-lived fumbling here */ } exercise(A_DEX, TRUE); return(1); } if(IS_GRAVE(maploc->typ) || maploc->typ == IRONBARS) goto ouch; if(IS_TREE(maploc->typ)) { struct obj *treefruit; /* nothing, fruit or trouble? 75:23.5:1.5% */ if (rn2(3)) { if ( !rn2(6) && !(mvitals[PM_KILLER_BEE].mvflags & G_GONE) ) You_hear("a low buzzing."); /* a warning */ goto ouch; } if (rn2(15) && !(maploc->looted & TREE_LOOTED) && (treefruit = rnd_treefruit_at(x, y))) { long nfruit = 8L-rnl(7), nfall; short frtype = treefruit->otyp; treefruit->quan = nfruit; if (is_plural(treefruit)) pline("Some %s fall from the tree!", xname(treefruit)); else pline("%s falls from the tree!", An(xname(treefruit))); nfall = scatter(x,y,2,MAY_HIT,treefruit); if (nfall != nfruit) { /* scatter left some in the tree, but treefruit * may not refer to the correct object */ treefruit = mksobj(frtype, TRUE, FALSE); treefruit->quan = nfruit-nfall; pline("%ld %s got caught in the branches.", nfruit-nfall, xname(treefruit)); dealloc_obj(treefruit); } exercise(A_DEX, TRUE); exercise(A_WIS, TRUE); /* discovered a new food source! */ newsym(x, y); maploc->looted |= TREE_LOOTED; return(1); } else if (!(maploc->looted & TREE_SWARM)) { int cnt = rnl(4) + 2; int made = 0; coord mm; mm.x = x; mm.y = y; while (cnt--) { if (enexto(&mm, mm.x, mm.y, &mons[PM_KILLER_BEE]) && makemon(&mons[PM_KILLER_BEE], mm.x, mm.y, MM_ANGRY)) made++; } if ( made ) pline("You've attracted the tree's former occupants!"); else You("smell stale honey."); maploc->looted |= TREE_SWARM; return(1); } goto ouch; } #ifdef SINKS if(IS_TOILET(maploc->typ)) { if(Levitation) goto dumb; pline("Klunk!"); if (!rn2(4)) breaktoilet(x,y); return(1); } if(IS_GRAVE(maploc->typ)) { goto ouch; } if(IS_SINK(maploc->typ)) { int gend = poly_gender(); short washerndx = (gend == 1 || (gend == 2 && rn2(2))) ? PM_INCUBUS : PM_SUCCUBUS; if(Levitation) goto dumb; if(rn2(5)) { if(flags.soundok) pline("Klunk! The pipes vibrate noisily."); else pline("Klunk!"); exercise(A_DEX, TRUE); return(1); } else if(!(maploc->looted & S_LPUDDING) && !rn2(3) && !(mvitals[PM_BLACK_PUDDING].mvflags & G_GONE)) { if (Blind) You_hear("a gushing sound."); else pline("A %s ooze gushes up from the drain!", hcolor(NH_BLACK)); (void) makemon(&mons[PM_BLACK_PUDDING], x, y, NO_MM_FLAGS); exercise(A_DEX, TRUE); newsym(x,y); maploc->looted |= S_LPUDDING; return(1); } else if(!(maploc->looted & S_LDWASHER) && !rn2(3) && !(mvitals[washerndx].mvflags & G_GONE)) { /* can't resist... */ pline("%s returns!", (Blind ? Something : "The dish washer")); if (makemon(&mons[washerndx], x, y, NO_MM_FLAGS)) newsym(x,y); maploc->looted |= S_LDWASHER; exercise(A_DEX, TRUE); return(1); } else if(!rn2(3)) { pline("Flupp! %s.", (Blind ? "You hear a sloshing sound" : "Muddy waste pops up from the drain")); if(!(maploc->looted & S_LRING)) { /* once per sink */ if (!Blind) You("see a ring shining in its midst."); (void) mkobj_at(RING_CLASS, x, y, TRUE); newsym(x, y); exercise(A_DEX, TRUE); exercise(A_WIS, TRUE); /* a discovery! */ maploc->looted |= S_LRING; } return(1); } goto ouch; } #endif if (maploc->typ == STAIRS || maploc->typ == LADDER || IS_STWALL(maploc->typ)) { if(!IS_STWALL(maploc->typ) && maploc->ladder == LA_DOWN) goto dumb; ouch: pline("Ouch! That hurts!"); exercise(A_DEX, FALSE); exercise(A_STR, FALSE); if (Blind) feel_location(x,y); /* we know we hit it */ if (is_drawbridge_wall(x,y) >= 0) { pline_The("drawbridge is unaffected."); /* update maploc to refer to the drawbridge */ (void) find_drawbridge(&x,&y); maploc = &levl[x][y]; } if(!rn2(3)) set_wounded_legs(RIGHT_SIDE, 5 + rnd(5)); losehp(rnd(ACURR(A_CON) > 15 ? 3 : 5), kickstr(buf), KILLED_BY); if(Is_airlevel(&u.uz) || Levitation) hurtle(-u.dx, -u.dy, rn1(2,4), TRUE); /* assume it's heavy */ return(1); } goto dumb; } if(maploc->doormask == D_ISOPEN || maploc->doormask == D_BROKEN || maploc->doormask == D_NODOOR) { dumb: exercise(A_DEX, FALSE); if (martial() || ACURR(A_DEX) >= 16 || rn2(3)) { You("kick at empty space."); if (Blind) feel_location(x,y); } else { pline("Dumb move! You strain a muscle."); exercise(A_STR, FALSE); set_wounded_legs(RIGHT_SIDE, 5 + rnd(5)); } if ((Is_airlevel(&u.uz) || Levitation) && rn2(2)) { hurtle(-u.dx, -u.dy, 1, TRUE); return 1; /* you moved, so use up a turn */ } return(0); } /* not enough leverage to kick open doors while levitating */ if(Levitation) goto ouch; /* Ali - artifact doors */ if (artifact_door(x, y)) goto ouch; exercise(A_DEX, TRUE); /* door is known to be CLOSED or LOCKED */ if(rnl(35) < avrg_attrib + (!martial() ? 0 : ACURR(A_DEX))) { boolean shopdoor = *in_rooms(x, y, SHOPBASE) ? TRUE : FALSE; /* break the door */ if(maploc->doormask & D_TRAPPED) { if (flags.verbose) You("kick the door."); exercise(A_STR, FALSE); maploc->doormask = D_NODOOR; b_trapped("door", FOOT); } else if(ACURR(A_STR) > 18 && !rn2(5) && !shopdoor) { pline("As you kick the door, it shatters to pieces!"); exercise(A_STR, TRUE); maploc->doormask = D_NODOOR; } else { pline("As you kick the door, it crashes open!"); exercise(A_STR, TRUE); maploc->doormask = D_BROKEN; } if (Blind) feel_location(x,y); /* we know we broke it */ else newsym(x,y); unblock_point(x,y); /* vision */ if (shopdoor) { add_damage(x, y, 400L); pay_for_damage("break", FALSE); } if (in_town(x, y)) for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) { if (DEADMONSTER(mtmp)) continue; if((mtmp->data == &mons[PM_WATCHMAN] || 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; } } } else { if (Blind) feel_location(x,y); /* we know we hit it */ exercise(A_STR, TRUE); pline("WHAMMM!!!"); if (in_town(x, y)) for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) { if (DEADMONSTER(mtmp)) continue; 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); } else { int i; verbalize("Hey, stop damaging that door!"); /* [ALI] Since marking a door as warned will have * the side effect of trapping the door, it must be * included in the doors[] array in order that trap * detection will find it. */ for(i = doorindex - 1; i >= 0; i--) if (x == doors[i].x && y == doors[i].y) break; if (i < 0) i = add_door(x, y, (struct mkroom *)0); if (i >= 0) levl[x][y].looted |= D_WARNED; } break; } } } return(1); } STATIC_OVL void drop_to(cc, loc) coord *cc; schar loc; { /* cover all the MIGR_xxx choices generated by down_gate() */ switch (loc) { case MIGR_RANDOM: /* trap door or hole */ if (Is_stronghold(&u.uz)) { cc->x = valley_level.dnum; cc->y = valley_level.dlevel; break; } else if (In_endgame(&u.uz) || Is_botlevel(&u.uz)) { cc->y = cc->x = 0; break; } /* else fall to the next cases */ case MIGR_STAIRS_UP: case MIGR_LADDER_UP: cc->x = u.uz.dnum; cc->y = u.uz.dlevel + 1; break; case MIGR_SSTAIRS: cc->x = sstairs.tolev.dnum; cc->y = sstairs.tolev.dlevel; break; default: case MIGR_NOWHERE: /* y==0 means "nowhere", in which case x doesn't matter */ cc->y = cc->x = 0; break; } } void impact_drop(missile, x, y, dlev) struct obj *missile; xchar x, y, dlev; { schar toloc; register struct obj *obj, *obj2; register struct monst *shkp; long oct, dct, price, debit, robbed; boolean angry, costly, isrock; coord cc; if(!OBJ_AT(x, y)) return; toloc = down_gate(x, y); drop_to(&cc, toloc); if (!cc.y) return; if (dlev) { /* send objects next to player falling through trap door. * checked in obj_delivery(). */ toloc = MIGR_NEAR_PLAYER; cc.y = dlev; } costly = costly_spot(x, y); price = debit = robbed = 0L; angry = FALSE; shkp = (struct monst *) 0; /* if 'costly', we must keep a record of ESHK(shkp) before * it undergoes changes through the calls to stolen_value. * the angry bit must be reset, if needed, in this fn, since * stolen_value is called under the 'silent' flag to avoid * unsavory pline repetitions. */ if(costly) { if ((shkp = shop_keeper(*in_rooms(x, y, SHOPBASE))) != 0) { debit = ESHK(shkp)->debit; robbed = ESHK(shkp)->robbed; angry = !shkp->mpeaceful; } } isrock = (missile && missile->otyp == ROCK); oct = dct = 0L; for(obj = level.objects[x][y]; obj; obj = obj2) { obj2 = obj->nexthere; if(obj == missile) continue; /* number of objects in the pile */ oct += obj->quan; if(obj == uball || obj == uchain) continue; /* boulders can fall too, but rarely & never due to rocks */ if((isrock && obj->otyp == BOULDER) || rn2(obj->otyp == BOULDER ? 30 : 3)) continue; obj_extract_self(obj); if(costly) { price += stolen_value(obj, x, y, (costly_spot(u.ux, u.uy) && index(u.urooms, *in_rooms(x, y, SHOPBASE))), TRUE, FALSE); /* set obj->no_charge to 0 */ if (Has_contents(obj)) picked_container(obj); /* does the right thing */ if (obj->oclass != COIN_CLASS) obj->no_charge = 0; } add_to_migration(obj); obj->ox = cc.x; obj->oy = cc.y; obj->owornmask = (long)toloc; /* number of fallen objects */ dct += obj->quan; } if (dct && cansee(x, y)) { /* at least one object fell */ const char *what = (dct == 1L ? "object falls" : "objects fall"); if (missile) pline("From the impact, %sother %s.", dct == oct ? "the " : dct == 1L ? "an" : "", what); else if (oct == dct) pline("%s adjacent %s %s.", dct == 1L ? "The" : "All the", what, gate_str); else pline("%s adjacent %s %s.", dct == 1L ? "One of the" : "Some of the", dct == 1L ? "objects falls" : what, gate_str); } 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, plname, PL_NSIZ); if(angry) pline("%s is infuriated!", Monnam(shkp)); else pline("\"%s, you are a thief!\"", plname); } else You_hear("a scream, \"Thief!\""); hot_pursuit(shkp); (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)); } } } /* NOTE: ship_object assumes otmp was FREED from fobj or invent. * is the point of drop. otmp is _not_ an resident: * otmp is either a kicked, dropped, or thrown object. */ boolean ship_object(otmp, x, y, shop_floor_obj) xchar x, y; struct obj *otmp; boolean shop_floor_obj; { schar toloc; xchar ox, oy; coord cc; struct obj *obj; struct trap *t; boolean nodrop, unpaid, container, impact = FALSE; long n = 0L; if (!otmp) return(FALSE); if ((toloc = down_gate(x, y)) == MIGR_NOWHERE) return(FALSE); drop_to(&cc, toloc); if (!cc.y) return(FALSE); /* objects other than attached iron ball always fall down ladder, but have a chance of staying otherwise */ nodrop = (otmp == uball) || (otmp == uchain) || (toloc != MIGR_LADDER_UP && rn2(3)); container = Has_contents(otmp); unpaid = (otmp->unpaid || (container && count_unpaid(otmp->cobj))); if(OBJ_AT(x, y)) { for(obj = level.objects[x][y]; obj; obj = obj->nexthere) if(obj != otmp) n += obj->quan; if(n) impact = TRUE; } /* boulders never fall through trap doors, but they might knock other things down before plugging the hole */ if (otmp->otyp == BOULDER && ((t = t_at(x, y)) != 0) && (t->ttyp == TRAPDOOR || t->ttyp == HOLE)) { if (impact) impact_drop(otmp, x, y, 0); return FALSE; /* let caller finish the drop */ } if (cansee(x, y)) otransit_msg(otmp, nodrop, n); if (nodrop) { if (impact) impact_drop(otmp, x, y, 0); return(FALSE); } if(unpaid || shop_floor_obj) { if(unpaid) { subfrombill(otmp, shop_keeper(*u.ushops)); (void)stolen_value(otmp, u.ux, u.uy, TRUE, FALSE, FALSE); } else { ox = otmp->ox; oy = otmp->oy; (void)stolen_value(otmp, ox, oy, (costly_spot(u.ux, u.uy) && index(u.urooms, *in_rooms(ox, oy, SHOPBASE))), FALSE, FALSE); } /* set otmp->no_charge to 0 */ if(container) picked_container(otmp); /* happens to do the right thing */ if(otmp->oclass != COIN_CLASS) otmp->no_charge = 0; } if (otmp == uwep) setuwep((struct obj *)0, FALSE); if (otmp == uswapwep) setuswapwep((struct obj *)0, FALSE); if (otmp == uquiver) setuqwep((struct obj *)0); /* some things break rather than ship */ if (breaktest(otmp)) { const 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; otmp->owornmask = (long)toloc; /* boulder from rolling boulder trap, no longer part of the trap */ if (otmp->otyp == BOULDER) otmp->otrapped = 0; if(impact) { /* the objs impacted may be in a shop other than * the one in which the hero is located. another * check for a shk is made in impact_drop. it is, e.g., * possible to kick/throw an object belonging to one * shop into another shop through a gap in the wall, * and cause objects belonging to the other shop to * fall down a trap door--thereby getting two shopkeepers * angry at the hero in one shot. */ impact_drop(otmp, x, y, 0); newsym(x,y); } return(TRUE); } void obj_delivery() { register struct obj *otmp, *otmp2; register int nx, ny; long where; for (otmp = migrating_objs; otmp; otmp = otmp2) { otmp2 = otmp->nobj; if (otmp->ox != u.uz.dnum || otmp->oy != u.uz.dlevel) continue; obj_extract_self(otmp); where = otmp->owornmask; /* destination code */ otmp->owornmask = 0L; switch ((int)where) { case MIGR_STAIRS_UP: nx = xupstair, ny = yupstair; break; case MIGR_LADDER_UP: nx = xupladder, ny = yupladder; break; case MIGR_SSTAIRS: nx = sstairs.sx, ny = sstairs.sy; break; case MIGR_NEAR_PLAYER: nx = u.ux, ny = u.uy; break; default: case MIGR_RANDOM: nx = ny = 0; break; } if (nx > 0) { place_object(otmp, nx, ny); stackobj(otmp); (void)scatter(nx, ny, rnd(2), 0, otmp); } else { /* random location */ /* set dummy coordinates because there's no current position for rloco() to update */ otmp->ox = otmp->oy = 0; rloco(otmp); } } } STATIC_OVL void otransit_msg(otmp, nodrop, num) register struct obj *otmp; register boolean nodrop; long num; { char obuf[BUFSZ]; Sprintf(obuf, "%s%s", (otmp->otyp == CORPSE && type_is_pname(&mons[otmp->corpsenm])) ? "" : "The ", 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 */ schar down_gate(x, y) xchar x, y; { struct trap *ttmp; gate_str = 0; /* this matches the player restriction in goto_level() */ if (on_level(&u.uz, &qstart_level) && !ok_to_quest()) return MIGR_NOWHERE; if ((xdnstair == x && ydnstair == y) || (sstairs.sx == x && sstairs.sy == y && !sstairs.up)) { gate_str = "down the stairs"; return (xdnstair == x && ydnstair == y) ? MIGR_STAIRS_UP : MIGR_SSTAIRS; } if (xdnladder == x && ydnladder == y) { gate_str = "down the ladder"; return MIGR_LADDER_UP; } if (((ttmp = t_at(x, y)) != 0 && ttmp->tseen) && (ttmp->ttyp == TRAPDOOR || ttmp->ttyp == HOLE)) { gate_str = (ttmp->ttyp == TRAPDOOR) ? "through the trap door" : "through the hole"; return MIGR_RANDOM; } return MIGR_NOWHERE; } /*dokick.c*/ slashem-0.0.7E7F3/src/engrave.c0000664000076400007640000010544610545462317014250 0ustar aliali/* 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. */ #include "hack.h" #include "lev.h" #include STATIC_VAR NEARDATA struct engr *head_engr; #ifdef OVLB /* random engravings */ static const char *random_mesg[] = { "Elbereth", /* trap engravings */ "Vlad was here", "ad aerarium", /* take-offs and other famous engravings */ "Owlbreath", "Galadriel", "Kilroy was here", "A.S. ->", "<- A.S.", /* Journey to the Center of the Earth */ "You won't get it up the steps", /* Adventure */ "Lasciate ogni speranza o voi ch'entrate.", /* Inferno */ "Well Come", /* Prisoner */ "We apologize for the inconvenience.", /* So Long... */ "See you next Wednesday", /* Thriller */ "notary sojak", /* Smokey Stover */ "For a good time call 8?7-5309", "Please don't feed the animals.", /* Various zoos around the world */ "Madam, in Eden, I'm Adam.", /* A palindrome */ "Two thumbs up!", /* Siskel & Ebert */ "Hello, World!", /* The First C Program */ #ifdef MAIL "You've got mail!", /* AOL */ #endif "As if!", /* Clueless */ /* [Tom] added these */ "Y?v?l s??ks!", /* just kidding... */ "T?m ?as h?r?", /* Tsanth added these */ "Gazortenplatz", /* Tribute to David Fizz */ "John 3:16", /* You see this everywhere; why not here? */ "Exhale! Exhale! Exhale!", /* Prodigy */ "All you need is love.", /* The Beatles */ "Please don't feed the animals.", /* Various zoos around the world */ "....TCELES B HSUP A magic spell?", /* Final Fantasy I (US) */ "Madam, in Eden, I'm Adam.", /* A palindrome */ "Two thumbs up!", /* Siskel & Ebert */ "Hello, World!", /* The First Program line */ "Turn around.", /* Various people at various times in history */ "You've got mail!", /* AOL */ "UY WUZ HERE", /* :] */ "Time flies when you're having fun.", /* Who said this first, anyway? */ "As if!", /* Clueless */ "How bizarre, how bizarre.", /* OMC */ "Silly rabbit, Trix are for kids!", /* Trix */ "I'll be back!", /* Terminator */ "That is not dead which can eternal lie.", /* HPL */ }; char * random_engraving(outbuf) char *outbuf; { const char *rumor; /* a random engraving may come from the "rumors" file, or from the list above */ if (!rn2(4) || !(rumor = getrumor(0, outbuf, TRUE)) || !*rumor) Strcpy(outbuf, random_mesg[rn2(SIZE(random_mesg))]); wipeout_text(outbuf, (int)(strlen(outbuf) / 4), 0); return outbuf; } /* Partial rubouts for engraving characters. -3. */ static const struct { char wipefrom; const char * wipeto; } rubouts[] = { {'A', "^"}, {'B', "Pb["}, {'C', "("}, {'D', "|)["}, {'E', "|FL[_"}, {'F', "|-"}, {'G', "C("}, {'H', "|-"}, {'I', "|"}, {'K', "|<"}, {'L', "|_"}, {'M', "|"}, {'N', "|\\"}, {'O', "C("}, {'P', "F"}, {'Q', "C("}, {'R', "PF"}, {'T', "|"}, {'U', "J"}, {'V', "/\\"}, {'W', "V/\\"}, {'Z', "/"}, {'b', "|"}, {'d', "c|"}, {'e', "c"}, {'g', "c"}, {'h', "n"}, {'j', "i"}, {'k', "|"}, {'l', "|"}, {'m', "nr"}, {'n', "r"}, {'o', "c"}, {'q', "c"}, {'w', "v"}, {'y', "v"}, {':', "."}, {';', ","}, {'0', "C("}, {'1', "|"}, {'6', "o"}, {'7', "/"}, {'8', "3o"} }; void wipeout_text(engr, cnt, seed) char *engr; int cnt; unsigned seed; /* for semi-controlled randomization */ { char *s; int i, j, nxt, use_rubout, lth = (int)strlen(engr); if (lth && cnt > 0) { while (cnt--) { /* pick next character */ if (!seed) { /* random */ nxt = rn2(lth); use_rubout = rn2(4); } else { /* predictable; caller can reproduce the same sequence by supplying the same arguments later, or a pseudo-random sequence by varying any of them */ nxt = seed % lth; seed *= 31, seed %= (BUFSZ-1); use_rubout = seed & 3; } s = &engr[nxt]; if (*s == ' ') continue; /* rub out unreadable & small punctuation marks */ if (index("?.,'`-|_", *s)) { *s = ' '; continue; } if (!use_rubout) i = SIZE(rubouts); else for (i = 0; i < SIZE(rubouts); i++) if (*s == rubouts[i].wipefrom) { /* * Pick one of the substitutes at random. */ if (!seed) j = rn2(strlen(rubouts[i].wipeto)); else { seed *= 31, seed %= (BUFSZ-1); j = seed % (strlen(rubouts[i].wipeto)); } *s = rubouts[i].wipeto[j]; break; } /* didn't pick rubout; use '?' for unreadable character */ if (i == SIZE(rubouts)) *s = '?'; } } /* trim trailing spaces */ while (lth && engr[lth-1] == ' ') engr[--lth] = 0; } boolean can_reach_floor() { return (boolean)(!u.uswallow && #ifdef STEED /* Restricted/unskilled riders can't reach the floor */ !(u.usteed && P_SKILL(P_RIDING) < P_BASIC) && #endif (!Levitation || Is_airlevel(&u.uz) || Is_waterlevel(&u.uz))); } #endif /* OVLB */ #ifdef OVL0 const char * surface(x, y) register int x, y; { register struct rm *lev = &levl[x][y]; 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 (Underwater && !Is_waterlevel(&u.uz)) ? "bottom" : "water"; else if (is_ice(x,y)) return "ice"; else if (is_lava(x,y)) return "lava"; else if (lev->typ == DRAWBRIDGE_DOWN) return "bridge"; else if(IS_ALTAR(levl[x][y].typ)) return "altar"; else if(IS_GRAVE(levl[x][y].typ)) return "headstone"; else if(IS_FOUNTAIN(levl[x][y].typ)) return "fountain"; else if ((IS_ROOM(lev->typ) && !Is_earthlevel(&u.uz)) || IS_WALL(lev->typ) || IS_DOOR(lev->typ) || lev->typ == SDOOR) return "floor"; else return "ground"; } const char * ceiling(x, y) register int x, y; { register struct rm *lev = &levl[x][y]; const char *what; /* other room types will no longer exist when we're interested -- * see check_special_room() */ if (*in_rooms(x,y,VAULT)) what = "vault's ceiling"; else if (*in_rooms(x,y,TEMPLE)) what = "temple's ceiling"; else if (*in_rooms(x,y,SHOPBASE)) what = "shop's ceiling"; else if (IS_AIR(lev->typ)) what = "sky"; else if (Underwater) what = "water's surface"; else if ((IS_ROOM(lev->typ) && !Is_earthlevel(&u.uz)) || IS_WALL(lev->typ) || IS_DOOR(lev->typ) || lev->typ == SDOOR) what = "ceiling"; else what = "rock above"; return what; } struct engr * engr_at(x, y) xchar x, y; { register struct engr *ep = head_engr; while(ep) { if(x == ep->engr_x && y == ep->engr_y) return(ep); ep = ep->nxt_engr; } return((struct engr *) 0); } #ifdef ELBERETH /* Decide whether a particular string is engraved at a specified * location; a case-insensitive substring match used. * Ignore headstones, in case the player names herself "Elbereth". */ int sengr_at(s, x, y) const char *s; xchar x, y; { register struct engr *ep = engr_at(x,y); return (ep && ep->engr_type != HEADSTONE && ep->engr_time <= moves && strstri(ep->engr_txt, s) != 0); } #endif /* ELBERETH */ #endif /* OVL0 */ #ifdef OVL2 void u_wipe_engr(cnt) register int cnt; { if (can_reach_floor()) wipe_engr_at(u.ux, u.uy, cnt); } #endif /* OVL2 */ #ifdef OVL1 void wipe_engr_at(x,y,cnt) register xchar x,y,cnt; { register struct engr *ep = engr_at(x,y); /* Headstones are indelible */ if(ep && ep->engr_type != HEADSTONE){ if(ep->engr_type != BURN || is_ice(x,y)) { if(ep->engr_type != DUST && ep->engr_type != ENGR_BLOOD) { cnt = rn2(1 + 50/(cnt+1)) ? 0 : 1; } wipeout_text(ep->engr_txt, (int)cnt, 0); while(ep->engr_txt[0] == ' ') ep->engr_txt++; if(!ep->engr_txt[0]) del_engr(ep); } } } #endif /* OVL1 */ #ifdef OVL2 boolean sense_engr_at(x,y,read_it) register int x,y; boolean read_it; /* Read any sensed engraving */ { register struct engr *ep = engr_at(x,y); register int sensed = 0; char buf[BUFSZ]; /* Sensing an engraving does not require sight, * nor does it necessarily imply comprehension (literacy). */ if(ep && ep->engr_txt[0]) { switch(ep->engr_type) { case DUST: if(!Blind) { sensed = 1; pline("%s is written here in the %s.", Something, is_ice(x,y) ? "frost" : "dust"); } break; case ENGRAVE: case HEADSTONE: if (!Blind || can_reach_floor()) { sensed = 1; pline("%s is engraved here on the %s.", Something, surface(x,y)); } break; case BURN: if (!Blind || can_reach_floor()) { sensed = 1; pline("Some text has been %s into the %s here.", is_ice(x,y) ? "melted" : "burned", surface(x,y)); } break; case MARK: if(!Blind) { sensed = 1; pline("There's some graffiti on the %s here.", surface(x,y)); } break; case ENGR_BLOOD: /* "It's a message! Scrawled in blood!" * "What's it say?" * "It says... `See you next Wednesday.'" -- Thriller */ if(!Blind) { sensed = 1; You("see a message scrawled in blood here."); } break; default: impossible("%s is written in a very strange way.", Something); sensed = 1; } if (sensed && !read_it && flags.suppress_alert < FEATURE_NOTICE_VER(0,0,7)) { pline("Use \"r.\" to read it."); } else if (sensed && read_it) { char *et; unsigned len, maxelen = BUFSZ - sizeof("You feel the words: \"\". "); len = strlen(ep->engr_txt); if (len > maxelen) { (void)strncpy(buf, ep->engr_txt, (int)maxelen); buf[maxelen] = '\0'; et = buf; } else et = ep->engr_txt; /* If you can engrave an 'x', you can "read" it --ALI */ if (len != 1 || (!index(et, 'x') && !index(et, 'X'))) u.uconduct.literate++; You("%s: \"%s\".", (Blind) ? "feel the words" : "read", et); if(flags.run > 1) nomul(0); return TRUE; } } return FALSE; } #endif /* OVL2 */ #ifdef OVLB void make_engr_at(x,y,s,e_time,e_type) register int x,y; register const char *s; register long e_time; register xchar e_type; { register struct engr *ep; if ((ep = engr_at(x,y)) != 0) del_engr(ep); ep = newengr(strlen(s) + 1); ep->nxt_engr = head_engr; head_engr = ep; ep->engr_x = x; ep->engr_y = y; ep->engr_txt = (char *)(ep + 1); Strcpy(ep->engr_txt, s); /* engraving Elbereth shows wisdom */ if (!in_mklev && !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; } /* delete any engraving at location */ void del_engr_at(x, y) int x, y; { register struct engr *ep = engr_at(x, y); if (ep) del_engr(ep); } /* * freehand - returns true if player has a free hand */ int freehand() { return(!uwep || !welded(uwep) || (!bimanual(uwep) && (!uarms || !uarms->cursed))); /* if ((uwep && bimanual(uwep)) || (uwep && uarms)) return(0); else return(1);*/ } static NEARDATA const char styluses[] = { ALL_CLASSES, ALLOW_NONE, TOOL_CLASS, WEAPON_CLASS, WAND_CLASS, GEM_CLASS, RING_CLASS, 0 }; /* Mohs' Hardness Scale: * 1 - Talc 6 - Orthoclase * 2 - Gypsum 7 - Quartz * 3 - Calcite 8 - Topaz * 4 - Fluorite 9 - Corundum * 5 - Apatite 10 - Diamond * * Since granite is a igneous rock hardness ~ 7, anything >= 8 should * probably be able to scratch the rock. * Devaluation of less hard gems is not easily possible because obj struct * does not contain individual oc_cost currently. 7/91 * * steel - 5-8.5 (usu. weapon) * diamond - 10 * jade - 5-6 (nephrite) * ruby - 9 (corundum) * turquoise - 5-6 * sapphire - 9 (corundum) * opal - 5-6 * topaz - 8 * glass - ~5.5 * emerald - 7.5-8 (beryl) * dilithium - 4-5?? * aquamarine - 7.5-8 (beryl) * iron - 4-5 * garnet - 7.25 (var. 6.5-8) * fluorite - 4 * agate - 7 (quartz) * brass - 3-4 * amethyst - 7 (quartz) * gold - 2.5-3 * jasper - 7 (quartz) * silver - 2.5-3 * onyx - 7 (quartz) * copper - 2.5-3 * moonstone - 6 (orthoclase) * amber - 2-2.5 */ /* return 1 if action took 1 (or more) moves, 0 if error or aborted */ int doengrave() { boolean dengr = FALSE; /* TRUE if we wipe out the current engraving */ boolean doblind = FALSE;/* TRUE if engraving blinds the player */ boolean doknown = FALSE;/* TRUE if we identify the stylus */ boolean eow = FALSE; /* TRUE if we are overwriting oep */ boolean jello = FALSE; /* TRUE if we are engraving in slime */ boolean ptext = TRUE; /* TRUE if we must prompt for engrave text */ boolean teleengr =FALSE;/* TRUE if we move the old engraving */ boolean zapwand = FALSE;/* TRUE if we remove a wand charge */ xchar type = DUST; /* Type of engraving made */ char buf[BUFSZ]; /* Buffer for final/poly engraving text */ char ebuf[BUFSZ]; /* Buffer for initial engraving text */ char qbuf[QBUFSZ]; /* Buffer for query text */ 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 */ buf[0] = (char)0; ebuf[0] = (char)0; post_engr_text[0] = (char)0; maxelen = BUFSZ - 1; if (is_demon(youmonst.data) || youmonst.data->mlet == S_VAMPIRE) type = ENGR_BLOOD; /* Can the adventurer engrave at all? */ if(u.uswallow) { if (is_animal(u.ustuck->data)) { pline("What would you write? \"Jonah was here\"?"); return(0); } else if (is_whirly(u.ustuck->data)) { You_cant("reach the %s.", surface(u.ux,u.uy)); return(0); } else jello = TRUE; } else if (is_lava(u.ux, u.uy)) { You_cant("write on the lava!"); return(0); } else if (is_pool(u.ux,u.uy) || IS_FOUNTAIN(levl[u.ux][u.uy].typ)) { You_cant("write on the water!"); return(0); } if(Is_airlevel(&u.uz) || Is_waterlevel(&u.uz)/* in bubble */) { You_cant("write in thin air!"); return(0); } if (cantwield(youmonst.data)) { You_cant("even hold anything!"); return(0); } if (check_capacity((char *)0)) return (0); /* One may write with finger, or weapon, or wand, or..., or... * Edited by GAN 10/20/86 so as not to change weapon wielded. */ otmp = getobj(styluses, "write with"); if(!otmp) return(0); /* otmp == zeroobj if fingers */ if (otmp == &zeroobj) writer = makeplural(body_part(FINGER)); else writer = xname(otmp); /* There's no reason you should be able to write with a wand * while both your hands are tied up. */ if (!freehand() && otmp != uwep && !otmp->owornmask) { You("have no free %s to write with!", body_part(HAND)); return(0); } if (jello) { You("tickle %s with your %s.", mon_nam(u.ustuck), writer); Your("message dissolves..."); return(0); } if (otmp->oclass != WAND_CLASS && !can_reach_floor()) { You_cant("reach the %s!", surface(u.ux,u.uy)); return(0); } if (IS_ALTAR(levl[u.ux][u.uy].typ)) { You("make a motion towards the altar with your %s.", writer); altar_wrath(u.ux, u.uy); return(0); } if (IS_GRAVE(levl[u.ux][u.uy].typ)) { if (otmp == &zeroobj) { /* using only finger */ You("would only make a small smudge on the %s.", surface(u.ux, u.uy)); return(0); } else 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 */ switch (otmp->oclass) { default: case AMULET_CLASS: case CHAIN_CLASS: case POTION_CLASS: case COIN_CLASS: break; case RING_CLASS: /* "diamond" rings and others should work */ case GEM_CLASS: /* diamonds & other hard gems should work */ if (objects[otmp->otyp].oc_tough) { type = ENGRAVE; break; } break; case ARMOR_CLASS: if (is_boots(otmp)) { type = DUST; break; } /* fall through */ /* Objects too large to engrave with */ case BALL_CLASS: case ROCK_CLASS: You_cant("engrave with such a large object!"); ptext = FALSE; break; /* Objects too silly to engrave with */ case FOOD_CLASS: case SCROLL_CLASS: case SPBOOK_CLASS: Your("%s would get %s.", xname(otmp), is_ice(u.ux,u.uy) ? "all frosty" : "too dirty"); ptext = FALSE; break; case RANDOM_CLASS: /* This should mean fingers */ break; /* The charge is removed from the wand before prompting for * the engraving text, because all kinds of setup decisions * and pre-engraving messages are based upon knowing what type * of engraving the wand is going to do. Also, the player * will have potentially seen "You wrest .." message, and * therefore will know they are using a charge. */ case WAND_CLASS: if (zappable(otmp)) { check_unpaid(otmp); zapwand = TRUE; if (Levitation) ptext = FALSE; switch (otmp->otyp) { /* DUST wands */ default: break; /* NODIR wands */ case WAN_LIGHT: case WAN_SECRET_DOOR_DETECTION: case WAN_CREATE_MONSTER: case WAN_CREATE_HORDE: case WAN_ENLIGHTENMENT: case WAN_WISHING: zapnodir(otmp); break; /* IMMEDIATE wands */ /* If wand is "IMMEDIATE", remember to affect the * previous engraving even if turning to dust. */ case WAN_STRIKING: Strcpy(post_engr_text, "The wand unsuccessfully fights your attempt to write!" ); break; case WAN_SLOW_MONSTER: if (!Blind) { Sprintf(post_engr_text, "The bugs on the %s slow down!", surface(u.ux, u.uy)); } break; case WAN_SPEED_MONSTER: if (!Blind) { Sprintf(post_engr_text, "The bugs on the %s speed up!", surface(u.ux, u.uy)); } break; case WAN_HEALING: case WAN_EXTRA_HEALING: if (!Blind) { Sprintf(post_engr_text, "The bugs on the %s look healthier!", surface(u.ux, u.uy)); } break; case WAN_FEAR: if (!Blind) { Sprintf(post_engr_text, "The bugs on the %s run away!", surface(u.ux, u.uy)); } break; case WAN_POLYMORPH: if(oep) { if (!Blind) { type = (xchar)0; /* random */ (void) random_engraving(buf); } dengr = TRUE; } break; case WAN_DRAINING: /* KMH */ if (oep) { /* * [ALI] Wand of draining give messages like * either polymorph or cancellation/make * invisible depending on whether the * old engraving is completely wiped or not. * Note: Blindness has slightly different * effect than with wand of polymorph. */ u_wipe_engr(5); oep = engr_at(u.ux,u.uy); if (!Blind) { if (!oep) pline_The("engraving on the %s vanishes!", surface(u.ux,u.uy)); else { strcpy(buf, oep->engr_txt); dengr = TRUE; } } } break; case WAN_NOTHING: case WAN_UNDEAD_TURNING: case WAN_OPENING: case WAN_LOCKING: case WAN_PROBING: break; /* RAY wands */ case WAN_MAGIC_MISSILE: ptext = TRUE; if (!Blind) { Sprintf(post_engr_text, "The %s is riddled by bullet holes!", surface(u.ux, u.uy)); } break; /* can't tell sleep from death - Eric Backus */ case WAN_SLEEP: case WAN_DEATH: if (!Blind) { Sprintf(post_engr_text, "The bugs on the %s stop moving!", surface(u.ux, u.uy)); } break; case WAN_COLD: if (!Blind) Strcpy(post_engr_text, "A few ice cubes drop from the wand."); if(!oep || (oep->engr_type != BURN)) 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)); dengr = TRUE; } break; case WAN_TELEPORTATION: if (oep && oep->engr_type != HEADSTONE) { if (!Blind) pline_The("engraving on the %s vanishes!", surface(u.ux,u.uy)); teleengr = TRUE; } break; /* type = ENGRAVE wands */ case WAN_DIGGING: ptext = TRUE; type = ENGRAVE; if(!objects[otmp->otyp].oc_name_known) { if (flags.verbose) pline("This %s is a wand of digging!", xname(otmp)); doknown = TRUE; } if (!Blind) Strcpy(post_engr_text, IS_GRAVE(levl[u.ux][u.uy].typ) ? "Chips fly out from the headstone." : is_ice(u.ux,u.uy) ? "Ice chips fly up from the ice surface!" : "Gravel flies up from the floor."); else Strcpy(post_engr_text, "You hear drilling!"); break; /* type = BURN wands */ case WAN_FIRE: ptext = TRUE; type = BURN; if(!objects[otmp->otyp].oc_name_known) { if (flags.verbose) pline("This %s is a wand of fire!", xname(otmp)); doknown = TRUE; } Strcpy(post_engr_text, Blind ? "You feel the wand heat up." : "Flames fly from the wand."); break; case WAN_FIREBALL: ptext = TRUE; type = BURN; if(!objects[otmp->otyp].oc_name_known) { if (flags.verbose) pline("This %s is a wand of fireballs!", xname(otmp)); doknown = TRUE; } Strcpy(post_engr_text, Blind ? "You feel the wand heat up." : "Flames fly from the wand."); break; case WAN_LIGHTNING: ptext = TRUE; type = BURN; if(!objects[otmp->otyp].oc_name_known) { if (flags.verbose) pline("This %s is a wand of lightning!", xname(otmp)); doknown = TRUE; } if (!Blind) { Strcpy(post_engr_text, "Lightning arcs from the wand."); doblind = TRUE; } else Strcpy(post_engr_text, "You hear crackling!"); break; /* type = MARK wands */ /* type = ENGR_BLOOD wands */ } } else /* end if zappable */ if (!can_reach_floor()) { You_cant("reach the %s!", surface(u.ux,u.uy)); return(0); } break; case WEAPON_CLASS: if(is_blade(otmp)) { if ((int)otmp->spe > -3) type = ENGRAVE; else Your("%s too dull for engraving.", aobjnam(otmp,"are")); } break; case TOOL_CLASS: if(otmp == ublindf) { pline( "That is a bit difficult to engrave with, don't you think?"); return(0); } #ifdef LIGHTSABERS if (is_lightsaber(otmp)) { if (otmp->lamplit) type = BURN; else Your("%s is deactivated!", aobjnam(otmp,"are")); } else #endif switch (otmp->otyp) { case MAGIC_MARKER: if (otmp->spe <= 0) Your("marker has dried out."); else type = MARK; break; case TOWEL: /* Can't really engrave with a towel */ ptext = FALSE; if (oep) if ((oep->engr_type == DUST ) || (oep->engr_type == ENGR_BLOOD) || (oep->engr_type == MARK )) { 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: break; } break; case VENOM_CLASS: #ifdef WIZARD if (wizard) { pline("Writing a poison pen letter??"); break; } #endif case ILLOBJ_CLASS: impossible("You're engraving with an illegal object!"); 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 */ if (doknown) { makeknown(otmp->otyp); more_experienced(0,10); } if (teleengr) { rloc_engr(oep); oep = (struct engr *)0; } if (dengr) { del_engr(oep); oep = (struct engr *)0; } /* Something has changed the engraving here */ if (*buf) { make_engr_at(u.ux, u.uy, buf, moves, type); pline_The("engraving looks different now."); ptext = FALSE; } 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; } if (!ptext) { /* Early exit for some implements. */ if (otmp->oclass == WAND_CLASS && !can_reach_floor()) You_cant("reach the %s!", surface(u.ux,u.uy)); return(1); } /* Special effects should have deleted the current engraving (if * possible) by now. */ if (oep) { register char c = 'n'; /* 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'); if (c == 'q') { pline(Never_mind); return(0); } } if (c == 'n' || Blind) { if( (oep->engr_type == DUST) || (oep->engr_type == ENGR_BLOOD) || (oep->engr_type == MARK) ) { if (!Blind) { You("wipe out the message that was %s here.", ((oep->engr_type == DUST) ? "written in the dust" : ((oep->engr_type == ENGR_BLOOD) ? "scrawled in blood" : "written"))); del_engr(oep); oep = (struct engr *)0; } else /* Don't delete engr until after we *know* we're engraving */ eow = TRUE; } else if ( (type == DUST) || (type == MARK) || (type == ENGR_BLOOD) ) { You( "cannot wipe out the message that is %s the %s here.", oep->engr_type == BURN ? (is_ice(u.ux,u.uy) ? "melted into" : "burned into") : "engraved in", surface(u.ux,u.uy)); return(1); } else if ( (type != oep->engr_type) || (c == 'n') ) { if (!Blind || can_reach_floor()) You("will overwrite the current message."); eow = TRUE; } } } eloc = surface(u.ux,u.uy); switch(type){ default: everb = (oep && !eow ? "add to the weird writing on" : "write strangely on"); break; case DUST: everb = (oep && !eow ? "add to the writing in" : "write in"); eloc = (is_ice(u.ux,u.uy) ? "frost" : "dust"); break; case HEADSTONE: everb = (oep && !eow ? "add to the epitaph on" : "engrave on"); break; case ENGRAVE: everb = (oep && !eow ? "add to the engraving in" : "engrave in"); break; case BURN: everb = (oep && !eow ? ( is_ice(u.ux,u.uy) ? "add to the text melted into" : "add to the text burned into") : ( is_ice(u.ux,u.uy) ? "melt into" : "burn into")); break; case MARK: everb = (oep && !eow ? "add to the graffiti on" : "scribble on"); break; case ENGR_BLOOD: everb = (oep && !eow ? "add to the scrawl on" : "scrawl on"); break; } /* Tell adventurer what is going on */ if (otmp != &zeroobj) You("%s the %s with %s.", everb, eloc, doname(otmp)); else You("%s the %s with your %s.", everb, eloc, makeplural(body_part(FINGER))); /* Prompt for engraving! */ 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); return(0); } } /* 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); oep = (struct engr *)0; } /* Figure out how long it took to engrave, and if player has * engraved too much. */ switch(type){ default: multi = -(len/10); if (multi) nomovemsg = "You finish your weird engraving."; break; case DUST: multi = -(len/10); if (multi) nomovemsg = "You finish writing in the dust."; break; case HEADSTONE: case ENGRAVE: multi = -(len/10); if ((otmp->oclass == WEAPON_CLASS) && ((otmp->otyp != ATHAME) || otmp->cursed)) { multi = -len; maxelen = ((otmp->spe + 3) * 2) + 1; /* -2 = 3, -1 = 5, 0 = 7, +1 = 9, +2 = 11 * Note: this does not allow a +0 anything (except * an athame) to engrave "Elbereth" all at once. * However, you could now engrave "Elb", then * "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) ) multi = -len; if (multi) nomovemsg = "You finish engraving."; break; case BURN: multi = -(len/10); if (multi) nomovemsg = is_ice(u.ux,u.uy) ? "You finish melting your message into the ice.": "You finish burning your message into the floor."; break; case MARK: multi = -(len/10); if ((otmp->oclass == TOOL_CLASS) && (otmp->otyp == MAGIC_MARKER)) { maxelen = (otmp->spe) * 2; /* one charge / 2 letters */ if (len > maxelen) { Your("marker dries out."); otmp->spe = 0; multi = -(maxelen/10); } else if (len > 1) otmp->spe -= len >> 1; else otmp->spe -= 1; /* Prevent infinite grafitti */ } if (multi) nomovemsg = "You finish defacing the dungeon."; break; case ENGR_BLOOD: multi = -(len/10); if (multi) nomovemsg = "You finish scrawling."; break; } /* Chop engraving down to size if necessary */ if (len > maxelen) { for (sp = ebuf; (maxelen && *sp); sp++) if (!isspace((int)*sp)) maxelen--; if (!maxelen && *sp) { *sp = (char)0; if (multi) nomovemsg = "You cannot write any more."; You("only are able to write \"%s\"", ebuf); } } /* Add to existing engraving */ if (oep) Strcpy(buf, oep->engr_txt); (void) strncat(buf, ebuf, (BUFSZ - (int)strlen(buf) - 1)); make_engr_at(u.ux, u.uy, buf, (moves - multi), type); if (post_engr_text[0]) pline(post_engr_text); if (doblind && !resists_blnd(&youmonst)) { You("are blinded by the flash!"); make_blinded((long)rnd(50),FALSE); if (!Blind) Your(vision_clears); } return(1); } void save_engravings(fd, mode) int fd, mode; { register struct engr *ep = head_engr; register struct engr *ep2; unsigned no_more_engr = 0; while (ep) { ep2 = ep->nxt_engr; if (ep->engr_lth && ep->engr_txt[0] && perform_bwrite(mode)) { bwrite(fd, (genericptr_t)&(ep->engr_lth), sizeof(ep->engr_lth)); bwrite(fd, (genericptr_t)ep, sizeof(struct engr) + ep->engr_lth); } if (release_data(mode)) dealloc_engr(ep); ep = ep2; } if (perform_bwrite(mode)) bwrite(fd, (genericptr_t)&no_more_engr, sizeof no_more_engr); if (release_data(mode)) head_engr = 0; } void rest_engravings(fd) int fd; { register struct engr *ep; unsigned lth; head_engr = 0; while(1) { mread(fd, (genericptr_t) <h, sizeof(unsigned)); if(lth == 0) return; ep = newengr(lth); mread(fd, (genericptr_t) ep, sizeof(struct engr) + lth); ep->nxt_engr = head_engr; head_engr = ep; ep->engr_txt = (char *) (ep + 1); /* Andreas Bormann */ /* mark as finished for bones levels -- no problem for * normal levels as the player must have finished engraving * to be able to move again */ ep->engr_time = moves; } } void del_engr(ep) register struct engr *ep; { if (ep == head_engr) { head_engr = ep->nxt_engr; } else { register struct engr *ept; for (ept = head_engr; ept; ept = ept->nxt_engr) if (ept->nxt_engr == ep) { ept->nxt_engr = ep->nxt_engr; break; } if (!ept) { impossible("Error in del_engr?"); return; } } dealloc_engr(ep); } /* randomly relocate an engraving */ void rloc_engr(ep) struct engr *ep; { int tx, ty, tryct = 200; do { if (--tryct < 0) return; tx = rn1(COLNO-3,2); ty = rn2(ROWNO); } while (engr_at(tx, ty) || !goodpos(tx, ty, (struct monst *)0, 0)); ep->engr_x = tx; ep->engr_y = ty; } /* Epitaphs for random headstones */ static const char *epitaphs[] = { "Rest in peace", "R.I.P.", "Rest In Pieces", "Note -- there are NO valuable items in this grave", "1994-1995. The Longest-Lived Hacker Ever", "The Grave of the Unknown Hacker", "We weren't sure who this was, but we buried him here anyway", "Sparky -- he was a very good dog", "Beware of Electric Third Rail", "Made in Taiwan", "Og friend. Og good dude. Og died. Og now food", "Beetlejuice Beetlejuice Beetlejuice", "Look out below!", "Please don't dig me up. I'm perfectly happy down here. -- Resident", "Postman, please note forwarding address: Gehennom, Asmodeus's Fortress, fifth lemure on the left", "Mary had a little lamb/Its fleece was white as snow/When Mary was in trouble/The lamb was first to go", "Be careful, or this could happen to you!", "Soon you'll join this fellow in hell! -- the Wizard of Yendor", "Caution! This grave contains toxic waste", "Sum quod eris", "Here lies an Atheist, all dressed up and no place to go", "Here lies Ezekiel, age 102. The good die young.", "Here lies my wife: Here let her lie! Now she's at rest and so am I.", "Here lies Johnny Yeast. Pardon me for not rising.", "He always lied while on the earth and now he's lying in it", "I made an ash of myself", "Soon ripe. Soon rotten. Soon gone. But not forgotten.", "Here lies the body of Jonathan Blake. Stepped on the gas instead of the brake.", "Go away!", /* From SLASH'EM */ "This old man, he played one, he played knick-knack on my thumb." }; /* Create a headstone at the given location. * The caller is responsible for newsym(x, y). */ void make_grave(x, y, str) int x, y; const char *str; { /* Can we put a grave here? */ if ((levl[x][y].typ != ROOM && levl[x][y].typ != GRAVE) || t_at(x,y)) return; /* Make the grave */ levl[x][y].typ = GRAVE; /* Engrave the headstone */ if (!str) str = epitaphs[rn2(SIZE(epitaphs))]; del_engr_at(x, y); make_engr_at(x, y, str, 0L, HEADSTONE); return; } #endif /* OVLB */ /*engrave.c*/ slashem-0.0.7E7F3/src/vault.c0000664000076400007640000005225110545462317013747 0ustar aliali/* SCCS Id: @(#)vault.c 3.4 2003/01/15 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" #include "vault.h" 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)); STATIC_DCL void FDECL(restfakecorr,(struct monst *)); STATIC_DCL boolean FDECL(in_fcorridor, (struct monst *,int,int)); STATIC_DCL void FDECL(move_gold,(struct obj *,int)); STATIC_DCL void FDECL(wallify_vault,(struct monst *)); STATIC_OVL boolean clear_fcorr(grd, forceshow) register struct monst *grd; register boolean forceshow; { 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; if((grd->mhp <= 0 || !in_fcorridor(grd, u.ux, u.uy)) && EGD(grd)->gddone) forceshow = TRUE; if((u.ux == fcx && u.uy == fcy && grd->mhp > 0) || (!forceshow && couldsee(fcx,fcy)) || (Punished && !carried(uball) && uball->ox == fcx && uball->oy == fcy)) return FALSE; if ((mtmp = m_at(fcx,fcy)) != 0) { if(mtmp->isgd) return(FALSE); else if(!in_fcorridor(grd, u.ux, u.uy)) { if(mtmp->mtame) yelp(mtmp); (void) rloc(mtmp, FALSE); } } levl[fcx][fcy].typ = EGD(grd)->fakecorr[fcbeg].ftyp; map_location(fcx, fcy, 1); /* bypass vision */ if(!ACCESSIBLE(levl[fcx][fcy].typ)) block_point(fcx,fcy); EGD(grd)->fcbeg++; } if(grd->mhp <= 0) { pline_The("corridor disappears."); if(IS_ROCK(levl[u.ux][u.uy].typ)) You("are encased in rock."); } return(TRUE); } STATIC_OVL void restfakecorr(grd) register struct monst *grd; { /* it seems you left the corridor - let the guard disappear */ if(clear_fcorr(grd, FALSE)) mongone(grd); } boolean grddead(grd) /* called in mon.c */ register struct monst *grd; { register boolean dispose = clear_fcorr(grd, TRUE); if(!dispose) { /* see comment by newpos in gd_move() */ remove_monster(grd->mx, grd->my); newsym(grd->mx, grd->my); place_monster(grd, 0, 0); EGD(grd)->ogx = grd->mx; EGD(grd)->ogy = grd->my; dispose = clear_fcorr(grd, TRUE); } return(dispose); } STATIC_OVL boolean in_fcorridor(grd, x, y) register struct monst *grd; int x, y; { register int fci; for(fci = EGD(grd)->fcbeg; fci < EGD(grd)->fcend; fci++) if(x == EGD(grd)->fakecorr[fci].fx && y == EGD(grd)->fakecorr[fci].fy) return(TRUE); return(FALSE); } STATIC_OVL struct monst * findgd() { register struct monst *mtmp; for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) if(mtmp->isgd && !DEADMONSTER(mtmp) && on_level(&(EGD(mtmp)->gdlevel), &u.uz)) return(mtmp); return((struct monst *)0); } #endif /* OVLB */ #ifdef OVL0 char vault_occupied(array) char *array; { register char *ptr; for (ptr = array; *ptr; ptr++) if (rooms[*ptr - ROOMOFFSET].rtype == VAULT) return(*ptr); return('\0'); } void invault() { #ifdef BSD_43_BUG int dummy; /* hack to avoid schain botch */ #endif struct monst *guard; int trycount, vaultroom = (int)vault_occupied(u.urooms); if(!vaultroom) { u.uinvault = 0; return; } vaultroom -= ROOMOFFSET; guard = findgd(); if(++u.uinvault % 30 == 0 && !guard) { /* if time ok and no guard now. */ 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++) { if(y < 0 || y > ROWNO-1) continue; for(x = u.ux-dd; x <= u.ux+dd; lx = x, x++) { if(y != u.uy-dd && y != u.uy+dd && x != u.ux-dd) x = u.ux+dd; if(x < 1 || x > COLNO-1) continue; if(levl[x][y].typ == CORR) { if(x < u.ux) lx = x + 1; else if(x > u.ux) lx = x - 1; else lx = x; if(y < u.uy) ly = y + 1; else if(y > u.uy) ly = y - 1; else ly = y; if(levl[lx][ly].typ != STONE && levl[lx][ly].typ != CORR) goto incr_radius; goto fnd; } } } incr_radius: ; } impossible("Not a single corridor on this level??"); tele(); return; fnd: gx = x; gy = y; /* next find a good place for a door in the wall */ x = u.ux; y = u.uy; if(levl[x][y].typ != ROOM) { /* player dug a door and is in it */ if(levl[x+1][y].typ == ROOM) x = x + 1; else if(levl[x][y+1].typ == ROOM) y = y + 1; else if(levl[x-1][y].typ == ROOM) x = x - 1; else if(levl[x][y-1].typ == ROOM) y = y - 1; else if(levl[x+1][y+1].typ == ROOM) { x = x + 1; y = y + 1; } else if (levl[x-1][y-1].typ == ROOM) { x = x - 1; y = y - 1; } else if (levl[x+1][y-1].typ == ROOM) { x = x + 1; y = y - 1; } else if (levl[x-1][y+1].typ == ROOM) { x = x - 1; y = y + 1; } } while(levl[x][y].typ == ROOM) { register int dx,dy; dx = (gx > x) ? 1 : (gx < x) ? -1 : 0; dy = (gy > y) ? 1 : (gy < y) ? -1 : 0; if(abs(gx-x) >= abs(gy-y)) x += dx; else y += dy; } if(x == u.ux && y == u.uy) { if(levl[x+1][y].typ == HWALL || levl[x+1][y].typ == DOOR) x = x + 1; else if(levl[x-1][y].typ == HWALL || levl[x-1][y].typ == DOOR) x = x - 1; else if(levl[x][y+1].typ == VWALL || levl[x][y+1].typ == DOOR) y = y + 1; else if(levl[x][y-1].typ == VWALL || levl[x][y-1].typ == DOOR) y = y - 1; else return; } /* make something interesting happen */ if(!(guard = makemon(&mons[PM_GUARD], x, y, NO_MM_FLAGS))) return; guard->isgd = 1; guard->mpeaceful = 1; set_malign(guard); EGD(guard)->gddone = 0; EGD(guard)->ogx = x; EGD(guard)->ogy = y; assign_level(&(EGD(guard)->gdlevel), &u.uz); EGD(guard)->vroom = vaultroom; EGD(guard)->warncnt = 0; reset_faint(); /* if fainted - wake up */ if (canspotmon(guard)) pline("Suddenly one of the Vault's %s enters!", makeplural(g_monnam(guard))); else pline("Someone else has entered the Vault."); newsym(guard->mx,guard->my); if (youmonst.m_ap_type == M_AP_OBJECT || u.uundetected) { if (youmonst.m_ap_type == M_AP_OBJECT && youmonst.mappearance != GOLD_PIECE) verbalize("Hey! Who left that %s in here?", mimic_obj_name(&youmonst)); /* You're mimicking some object or you're hidden. */ pline("Puzzled, %s turns around and leaves.", mhe(guard)); mongone(guard); return; } if (Strangled || is_silent(youmonst.data) || multi < 0) { /* [we ought to record whether this this message has already been given in order to vary it upon repeat visits, but discarding the monster and its egd data renders that hard] */ verbalize("I'll be back when you're ready to speak to me!"); mongone(guard); return; } stop_occupation(); /* if occupied, stop it *now* */ if (multi > 0) { nomul(0); unmul((char *)0); } trycount = 5; do { getlin("\"Hello stranger, who are you?\" -", buf); (void) mungspaces(buf); } while (!letter(buf[0]) && --trycount > 0); if (u.ualign.type == A_LAWFUL && /* ignore trailing text, in case player includes character's rank */ strncmpi(buf, plname, (int) strlen(plname)) != 0) { adjalign(-1); /* Liar! */ } if (!strcmpi(buf, "Croesus") || !strcmpi(buf, "Kroisos") #ifdef TOURIST || !strcmpi(buf, "Creosote") #endif ) { if (!mvitals[PM_CROESUS].died) { verbalize("Oh, yes, of course. Sorry to have disturbed you."); mongone(guard); } else { setmangry(guard); verbalize("Back from the dead, are you? I'll remedy that!"); /* don't want guard to waste next turn wielding a weapon */ if (!MON_WEP(guard)) { guard->weapon_check = NEED_HTH_WEAPON; (void) mon_wield_item(guard); } } return; } verbalize("I don't know you."); #ifndef GOLDOBJ if (!u.ugold && !hidden_gold()) verbalize("Please follow me."); else { if (!u.ugold) verbalize("You have hidden gold."); 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; EGD(guard)->fakecorr[0].fx = x; EGD(guard)->fakecorr[0].fy = y; if(IS_WALL(levl[x][y].typ)) EGD(guard)->fakecorr[0].ftyp = levl[x][y].typ; else { /* the initial guard location is a dug door */ int vlt = EGD(guard)->vroom; xchar lowx = rooms[vlt].lx, hix = rooms[vlt].hx; xchar lowy = rooms[vlt].ly, hiy = rooms[vlt].hy; if(x == lowx-1 && y == lowy-1) EGD(guard)->fakecorr[0].ftyp = TLCORNER; else if(x == hix+1 && y == lowy-1) EGD(guard)->fakecorr[0].ftyp = TRCORNER; else if(x == lowx-1 && y == hiy+1) EGD(guard)->fakecorr[0].ftyp = BLCORNER; else if(x == hix+1 && y == hiy+1) EGD(guard)->fakecorr[0].ftyp = BRCORNER; else if(y == lowy-1 || y == hiy+1) EGD(guard)->fakecorr[0].ftyp = HWALL; else if(x == lowx-1 || x == hix+1) EGD(guard)->fakecorr[0].ftyp = VWALL; } levl[x][y].typ = DOOR; levl[x][y].doormask = D_NODOOR; unblock_point(x, y); /* doesn't block light */ EGD(guard)->fcend = 1; EGD(guard)->warncnt = 1; } } #endif /* OVL0 */ #ifdef OVLB STATIC_OVL void move_gold(gold, vroom) struct obj *gold; int vroom; { xchar nx, ny; remove_object(gold); newsym(gold->ox, gold->oy); nx = rooms[vroom].lx + rn2(2); ny = rooms[vroom].ly + rn2(2); place_object(gold, nx, ny); stackobj(gold); newsym(nx,ny); } STATIC_OVL void wallify_vault(grd) struct monst *grd; { int x, y, typ; int vlt = EGD(grd)->vroom; char tmp_viz; xchar lox = rooms[vlt].lx - 1, hix = rooms[vlt].hx + 1, loy = rooms[vlt].ly - 1, hiy = rooms[vlt].hy + 1; struct monst *mon; struct obj *gold; struct trap *trap; boolean fixed = FALSE; boolean movedgold = FALSE; for (x = lox; x <= hix; x++) for (y = loy; y <= hiy; y++) { /* if not on the room boundary, skip ahead */ if (x != lox && x != hix && y != loy && y != hiy) continue; if (!IS_WALL(levl[x][y].typ) && !in_fcorridor(grd, x, y)) { if ((mon = m_at(x, y)) != 0 && mon != grd) { if (mon->mtame) yelp(mon); (void) rloc(mon, FALSE); } if ((gold = g_at(x, y)) != 0) { move_gold(gold, EGD(grd)->vroom); movedgold = TRUE; } if ((trap = t_at(x, y)) != 0) deltrap(trap); if (x == lox) typ = (y == loy) ? TLCORNER : (y == hiy) ? BLCORNER : VWALL; else if (x == hix) typ = (y == loy) ? TRCORNER : (y == hiy) ? BRCORNER : VWALL; else /* not left or right side, must be top or bottom */ typ = HWALL; levl[x][y].typ = typ; levl[x][y].doormask = 0; /* * hack: player knows walls are restored because of the * message, below, so show this on the screen. */ tmp_viz = viz_array[y][x]; viz_array[y][x] = IN_SIGHT|COULD_SEE; newsym(x,y); viz_array[y][x] = tmp_viz; block_point(x,y); fixed = TRUE; } } 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."); if(fixed) pline_The("damaged vault's walls are magically restored!"); } } /* * return 1: guard moved, 0: guard didn't, -1: let m_move do it, -2: died */ int gd_move(grd) register struct monst *grd; { int x, y, nx, ny, m, n; int dx, dy, gx, gy, fci; uchar typ; struct fakecorridor *fcp; register struct egd *egrd = EGD(grd); register struct rm *crm; register boolean goldincorridor = FALSE, u_in_vault = vault_occupied(u.urooms)? TRUE : FALSE, 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 boolean see_guard; if(!on_level(&(egrd->gdlevel), &u.uz)) return(-1); nx = ny = m = n = 0; if(!u_in_vault && !grd_in_vault) wallify_vault(grd); if(!grd->mpeaceful) { if(semi_dead) { egrd->gddone =1; goto newpos; } if(!u_in_vault && (grd_in_vault || (in_fcorridor(grd, grd->mx, grd->my) && !in_fcorridor(grd, u.ux, u.uy)))) { (void) rloc(grd, FALSE); wallify_vault(grd); (void) clear_fcorr(grd, TRUE); goto letknow; } if(!in_fcorridor(grd, grd->mx, grd->my)) (void) clear_fcorr(grd, TRUE); return(-1); } if(abs(egrd->ogx - grd->mx) > 1 || abs(egrd->ogy - grd->my) > 1) return(-1); /* teleported guard - treat as monster */ if(egrd->fcend == 1) { if(u_in_vault && (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; verbalize("You've been warned, knave!"); mnexto(grd); levl[m][n].typ = egrd->fakecorr[0].ftyp; newsym(m,n); grd->mpeaceful = 0; return(-1); } /* not fair to get mad when (s)he's fainted or paralyzed */ if(!is_fainted() && multi >= 0) egrd->warncnt++; return(0); } if (!u_in_vault) { if (u_carry_gold) { /* player teleported */ m = grd->mx; n = grd->my; (void) rloc(grd, FALSE); levl[m][n].typ = egrd->fakecorr[0].ftyp; 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."); wallify_vault(grd); egrd->gddone = 1; goto cleanup; } } } if(egrd->fcend > 1) { if(egrd->fcend > 2 && in_fcorridor(grd, grd->mx, grd->my) && !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; } if(u_carry_gold && (in_fcorridor(grd, u.ux, u.uy) || /* cover a 'blind' spot */ (egrd->fcend > 1 && u_in_vault))) { if(!grd->mx) { restfakecorr(grd); return(-2); } if(egrd->warncnt < 6) { egrd->warncnt = 6; verbalize("Drop all your gold, scoundrel!"); return(0); } else { verbalize("So be it, rogue!"); grd->mpeaceful = 0; return(-1); } } } for(fci = egrd->fcbeg; fci < egrd->fcend; fci++) if(g_at(egrd->fakecorr[fci].fx, egrd->fakecorr[fci].fy)){ m = egrd->fakecorr[fci].fx; n = egrd->fakecorr[fci].fy; goldincorridor = TRUE; } if(goldincorridor && !egrd->gddone) { x = grd->mx; y = grd->my; 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 */ } else { /* just for insurance... */ if (MON_AT(m, n) && m != grd->mx && n != grd->my) { verbalize("Out of my way, scum!"); (void) rloc(m_at(m, n), FALSE); } remove_monster(grd->mx, grd->my); newsym(grd->mx, grd->my); place_monster(grd, m, n); mpickgold(grd); /* does a newsym */ } if(cansee(m,n)) pline("%s%s picks up the gold.", Monnam(grd), grd->mpeaceful ? " calms down and" : ""); if(x != grd->mx || y != grd->my) { remove_monster(grd->mx, grd->my); newsym(grd->mx, grd->my); place_monster(grd, x, y); newsym(x, y); } if(!grd->mpeaceful) return(-1); else { egrd->warncnt = 5; return(0); } } if(um_dist(grd->mx, grd->my, 1) || egrd->gddone) { if(!egrd->gddone && !rn2(10)) verbalize("Move along!"); restfakecorr(grd); return(0); /* didn't move */ } x = grd->mx; y = grd->my; if(u_in_vault) goto nextpos; /* look around (hor & vert only) for accessible places */ for(nx = x-1; nx <= x+1; nx++) for(ny = y-1; ny <= y+1; ny++) { if((nx == x || ny == y) && (nx != x || ny != y) && isok(nx, ny)) { typ = (crm = &levl[nx][ny])->typ; if(!IS_STWALL(typ) && !IS_POOL(typ)) { if(in_fcorridor(grd, nx, ny)) goto nextnxy; if(*in_rooms(nx,ny,VAULT)) continue; /* seems we found a good place to leave him alone */ egrd->gddone = 1; if(ACCESSIBLE(typ)) goto newpos; #ifdef STUPID if (typ == SCORR) crm->typ = CORR; else crm->typ = DOOR; #else crm->typ = (typ == SCORR) ? CORR : DOOR; #endif if(crm->typ == DOOR) crm->doormask = D_NODOOR; goto proceed; } } nextnxy: ; } nextpos: nx = x; ny = y; gx = egrd->gdx; gy = egrd->gdy; dx = (gx > x) ? 1 : (gx < x) ? -1 : 0; dy = (gy > y) ? 1 : (gy < y) ? -1 : 0; if(abs(gx-x) >= abs(gy-y)) nx += dx; else ny += dy; while((typ = (crm = &levl[nx][ny])->typ) != 0) { /* in view of the above we must have IS_WALL(typ) or typ == POOL */ /* must be a wall here */ if(isok(nx+nx-x,ny+ny-y) && !IS_POOL(typ) && IS_ROOM(levl[nx+nx-x][ny+ny-y].typ)){ crm->typ = DOOR; crm->doormask = D_NODOOR; goto proceed; } if(dy && nx != x) { nx = x; ny = y+dy; continue; } if(dx && ny != y) { ny = y; nx = x+dx; dy = 0; continue; } /* I don't like this, but ... */ if(IS_ROOM(typ)) { crm->typ = DOOR; crm->doormask = D_NODOOR; goto proceed; } break; } crm->typ = CORR; proceed: unblock_point(nx, ny); /* doesn't block light */ if (cansee(nx,ny)) newsym(nx,ny); fcp = &(egrd->fakecorr[egrd->fcend]); if(egrd->fcend++ == FCSIZ) panic("fakecorr overflow"); fcp->fx = nx; fcp->fy = ny; fcp->ftyp = typ; newpos: if(egrd->gddone) { /* The following is a kludge. We need to keep */ /* the guard around in order to be able to make */ /* the fake corridor disappear as the player */ /* moves out of it, but we also need the guard */ /* out of the way. We send the guard to never- */ /* never land. We set ogx ogy to mx my in order */ /* to avoid a check at the top of this function. */ /* At the end of the process, the guard is killed */ /* in restfakecorr(). */ cleanup: x = grd->mx; y = grd->my; see_guard = canspotmon(grd); wallify_vault(grd); remove_monster(grd->mx, grd->my); newsym(grd->mx,grd->my); place_monster(grd, 0, 0); egrd->ogx = grd->mx; egrd->ogy = grd->my; restfakecorr(grd); if(!semi_dead && (in_fcorridor(grd, u.ux, u.uy) || cansee(x, y))) { if (!disappear_msg_seen && see_guard) pline("Suddenly, the %s disappears.", g_monnam(grd)); return(1); } return(-2); } egrd->ogx = grd->mx; /* update old positions */ egrd->ogy = grd->my; remove_monster(grd->mx, grd->my); place_monster(grd, nx, ny); newsym(grd->mx,grd->my); restfakecorr(grd); return(1); } /* Routine when dying or quitting with a vault guard around */ void 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 { if(grd->mpeaceful) { /* guard has no "right" to your gold */ mongone(grd); return; } mnexto(grd); pline("%s remits your gold to the vault.", Monnam(grd)); gx = rooms[EGD(grd)->vroom].lx + rn2(2); gy = rooms[EGD(grd)->vroom].ly + rn2(2); Sprintf(buf, "To Croesus: here's the gold recovered from %s the %s.", 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 == COIN_CLASS) { freeinv(coins); place_object(coins, gx, gy); stackobj(coins); } } #endif mongone(grd); } long hidden_gold() { register long value = 0L; register struct obj *obj; for (obj = invent; obj; obj = obj->nobj) if (Has_contents(obj)) value += contained_gold(obj); /* unknown gold stuck inside statues may cause some consternation... */ return(value); } boolean gd_sound() /* prevent "You hear footsteps.." when inappropriate */ { register struct monst *grd = findgd(); if (vault_occupied(u.urooms)) return(FALSE); else return((boolean)(grd == (struct monst *)0)); } #endif /* OVLB */ /*vault.c*/ slashem-0.0.7E7F3/src/do_name.c0000664000076400007640000007005610545462317014221 0ustar aliali/* SCCS Id: @(#)do_name.c 3.4 2003/01/14 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" #ifdef OVLB STATIC_DCL void FDECL(do_oname, (struct obj *)); static void FDECL(getpos_help, (BOOLEAN_P,const char *)); extern const char what_is_an_unknown_object[]; /* from pager.c */ /* the response for '?' help request in getpos() */ static void getpos_help(force, goal) boolean force; const char *goal; { char sbuf[BUFSZ]; boolean doing_what_is; winid tmpwin = create_nhwindow(NHW_MENU); Sprintf(sbuf, "Use [%s] to move the cursor to %s.", iflags.num_pad ? "2468" : "hjkl", goal); putstr(tmpwin, 0, sbuf); putstr(tmpwin, 0, "Use [HJKL] to move the cursor 8 units at a time."); putstr(tmpwin, 0, "Or enter a background symbol (ex. <)."); /* disgusting hack; the alternate selection characters work for any getpos call, but they only matter for dowhatis (and doquickwhatis) */ doing_what_is = (goal == what_is_an_unknown_object); Sprintf(sbuf, "Type a .%s when you are at the right place.", doing_what_is ? " or , or ; or :" : ""); putstr(tmpwin, 0, sbuf); if (!force) putstr(tmpwin, 0, "Type Space or Escape when you're done."); putstr(tmpwin, 0, ""); display_nhwindow(tmpwin, TRUE); destroy_nhwindow(tmpwin); } int getpos(cc,force,goal) coord *cc; boolean force; const char *goal; { int result = 0; int cx, cy, i, c; int sidx, tx, ty; boolean msg_given = TRUE; /* clear message window by default */ static const char pick_chars[] = ".,;:"; const char *cp; const char *sdp; if(iflags.num_pad) sdp = ndir; else sdp = sdir; /* DICE workaround */ if (flags.verbose) { pline("(For instructions type a ?)"); msg_given = TRUE; } cx = cc->x; cy = cc->y; #ifdef CLIPPING cliparound(cx, cy); #endif curs(WIN_MAP, cx,cy); flush_screen(0); #ifdef MAC lock_mouse_cursor(TRUE); #endif for (;;) { c = nh_poskey(&tx, &ty, &sidx); if (c == '\033') { cx = cy = -10; msg_given = TRUE; /* force clear */ result = -1; break; } if(c == 0) { if (!isok(tx, ty)) continue; /* a mouse click event, just assign and return */ cx = tx; cy = ty; break; } if ((cp = index(pick_chars, c)) != 0) { /* '.' => 0, ',' => 1, ';' => 2, ':' => 3 */ result = cp - pick_chars; break; } for (i = 0; i < 8; i++) { int dx, dy; if (sdp[i] == c) { /* a normal movement letter or digit */ dx = xdir[i]; dy = ydir[i]; } else if (sdir[i] == lowc((char)c)) { /* a shifted movement letter */ dx = 8 * xdir[i]; dy = 8 * ydir[i]; } else continue; /* truncate at map edge; diagonal moves complicate this... */ if (cx + dx < 1) { dy -= sgn(dy) * (1 - (cx + dx)); dx = 1 - cx; /* so that (cx+dx == 1) */ } else if (cx + dx > COLNO-1) { dy += sgn(dy) * ((COLNO-1) - (cx + dx)); dx = (COLNO-1) - cx; } if (cy + dy < 0) { dx -= sgn(dx) * (0 - (cy + dy)); dy = 0 - cy; /* so that (cy+dy == 0) */ } else if (cy + dy > ROWNO-1) { dx += sgn(dx) * ((ROWNO-1) - (cy + dy)); dy = (ROWNO-1) - cy; } cx += dx; cy += dy; goto nxtc; } if(c == '?'){ getpos_help(force, goal); } else { if (!index(quitchars, c)) { char matching[MAXPCHARS]; int pass, lo_x, lo_y, hi_x, hi_y, k = 0; (void)memset((genericptr_t)matching, 0, sizeof matching); for (sidx = 1; sidx < MAXPCHARS; sidx++) if (c == defsyms[sidx].sym || c == (int)showsyms[sidx]) matching[sidx] = (char) ++k; if (k) { for (pass = 0; pass <= 1; pass++) { /* pass 0: just past current pos to lower right; pass 1: upper left corner to current pos */ lo_y = (pass == 0) ? cy : 0; hi_y = (pass == 0) ? ROWNO - 1 : cy; for (ty = lo_y; ty <= hi_y; ty++) { lo_x = (pass == 0 && ty == lo_y) ? cx + 1 : 1; hi_x = (pass == 1 && ty == hi_y) ? cx : COLNO - 1; for (tx = lo_x; tx <= hi_x; tx++) { k = glyph_at(tx, ty); if (glyph_is_cmap(k) && matching[glyph_to_cmap(k)]) { cx = tx, cy = ty; if (msg_given) { clear_nhwindow(WIN_MESSAGE); msg_given = FALSE; } goto nxtc; } } /* column */ } /* row */ } /* pass */ pline("Can't find dungeon feature '%c'.", c); msg_given = TRUE; goto nxtc; } else { pline("Unknown direction: '%s' (%s).", visctrl((char)c), !force ? "aborted" : iflags.num_pad ? "use 2468 or ." : "use hjkl or ."); msg_given = TRUE; } /* k => matching */ } /* !quitchars */ if (force) goto nxtc; pline("Done."); msg_given = FALSE; /* suppress clear */ cx = -1; cy = 0; result = 0; /* not -1 */ break; } nxtc: ; #ifdef CLIPPING cliparound(cx, cy); #endif curs(WIN_MAP,cx,cy); flush_screen(0); } #ifdef MAC lock_mouse_cursor(FALSE); #endif if (msg_given) clear_nhwindow(WIN_MESSAGE); cc->x = cx; cc->y = cy; return result; } struct monst * christen_monst(mtmp, name) struct monst *mtmp; const char *name; { int lth; struct monst *mtmp2; char buf[PL_PSIZ]; /* dogname & catname are PL_PSIZ arrays; object names have same limit */ lth = *name ? (int)(strlen(name) + 1) : 0; if(lth > PL_PSIZ){ lth = PL_PSIZ; name = strncpy(buf, name, PL_PSIZ - 1); buf[PL_PSIZ - 1] = '\0'; } if (lth == mtmp->mnamelth) { /* don't need to allocate a new monst struct */ if (lth) Strcpy(NAME(mtmp), name); return mtmp; } mtmp2 = newmonst(mtmp->mxlth + lth); *mtmp2 = *mtmp; (void) memcpy((genericptr_t)mtmp2->mextra, (genericptr_t)mtmp->mextra, mtmp->mxlth); mtmp2->mnamelth = lth; if (lth) Strcpy(NAME(mtmp2), name); replmon(mtmp,mtmp2); return(mtmp2); } int do_mname() { char buf[BUFSZ]; coord cc; register int cx,cy; register struct monst *mtmp; char qbuf[QBUFSZ]; if (Hallucination) { You("would never recognize it anyway."); return 0; } cc.x = u.ux; cc.y = u.uy; if (getpos(&cc, FALSE, "the monster you want to name") < 0 || (cx = cc.x) < 0) return 0; cy = cc.y; if (cx == u.ux && cy == u.uy) { #ifdef STEED if (u.usteed && canspotmon(u.usteed)) mtmp = u.usteed; else { #endif pline("This %s creature is called %s and cannot be renamed.", ACURR(A_CHA) > 14 ? (flags.female ? "beautiful" : "handsome") : "ugly", plname); return(0); #ifdef STEED } #endif } else mtmp = m_at(cx, cy); if (!mtmp || (!sensemon(mtmp) && (!(cansee(cx,cy) || see_with_infrared(mtmp)) || mtmp->mundetected || mtmp->m_ap_type == M_AP_FURNITURE || mtmp->m_ap_type == M_AP_OBJECT || (mtmp->minvis && !See_invisible)))) { pline("I see no monster there."); 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); /* strip leading and trailing spaces; unnames monster if all spaces */ (void)mungspaces(buf); if (mtmp->data->geno & G_UNIQ) pline("%s doesn't like being called names!", Monnam(mtmp)); else (void) christen_monst(mtmp, buf); return(0); } /* * This routine changes the address of obj. Be careful not to call it * when there might be pointers around in unknown places. For now: only * when obj is in the inventory. */ STATIC_OVL void do_oname(obj) register struct obj *obj; { char buf[BUFSZ], qbuf[QBUFSZ]; const char *aname; 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 */ (void)mungspaces(buf); /* relax restrictions over proper capitalization for artifacts */ if ((aname = artifact_name(buf, &objtyp)) != 0 && objtyp == obj->otyp) Strcpy(buf, aname); if (obj->oartifact) { pline_The("artifact seems to resist the attempt."); return; } else if (restrict_name(obj, buf) || exist_artifact(obj->otyp, buf)) { int n = rn2((int)strlen(buf)); register char c1, c2; c1 = lowc(buf[n]); do c2 = 'a' + rn2('z'-'a'); while (c1 == c2); buf[n] = (buf[n] == c1) ? c2 : highc(c2); /* keep same case */ pline("While engraving your %s slips.", body_part(HAND)); display_nhwindow(WIN_MESSAGE, FALSE); You("engrave: \"%s\".",buf); } obj = oname(obj, buf); } /* * Allocate a new and possibly larger storage space for an obj. */ struct obj * realloc_obj(obj, oextra_size, oextra_src, oname_size, name) struct obj *obj; int oextra_size; /* storage to allocate for oextra */ genericptr_t oextra_src; int oname_size; /* size of name string + 1 (null terminator) */ const char *name; { struct obj *otmp; otmp = newobj(oextra_size + oname_size); *otmp = *obj; /* the cobj pointer is copied to otmp */ if (oextra_size) { if (oextra_src) (void) memcpy((genericptr_t)otmp->oextra, oextra_src, oextra_size); } else { otmp->oattached = OATTACHED_NOTHING; } otmp->oxlth = oextra_size; otmp->onamelth = oname_size; otmp->timed = 0; /* not timed, yet */ otmp->lamplit = 0; /* ditto */ /* __GNUC__ note: if the assignment of otmp->onamelth immediately precedes this `if' statement, a gcc bug will miscompile the test on vax (`insv' instruction used to store bitfield does not set condition codes, but optimizer behaves as if it did). gcc-2.7.2.1 finally fixed this.... */ if (oname_size) { if (name) Strcpy(ONAME(otmp), name); } if (obj->owornmask) { boolean save_twoweap = u.twoweap; /* unwearing the old instance will clear dual-wield mode if this object is either of the two weapons */ setworn((struct obj *)0, obj->owornmask); setworn(otmp, otmp->owornmask); u.twoweap = save_twoweap; } /* replace obj with otmp */ replace_object(obj, otmp); /* fix ocontainer pointers */ if (Has_contents(obj)) { struct obj *inside; for(inside = obj->cobj; inside; inside = inside->nobj) inside->ocontainer = otmp; } /* move timers and light sources from obj to otmp */ if (obj->timed) obj_move_timers(obj, otmp); if (obj->lamplit) obj_move_light_source(obj, otmp); /* objects possibly being manipulated by multi-turn occupations which have been interrupted but might be subsequently resumed */ if (obj->oclass == FOOD_CLASS) food_substitution(obj, otmp); /* eat food or open tin */ else if (obj->oclass == SPBOOK_CLASS) book_substitution(obj, otmp); /* read spellbook */ /* obfree(obj, otmp); now unnecessary: no pointers on bill */ dealloc_obj(obj); /* let us hope nobody else saved a pointer */ return otmp; } struct obj * oname(obj, name) struct obj *obj; const char *name; { int lth; char buf[PL_PSIZ]; lth = *name ? (int)(strlen(name) + 1) : 0; if (lth > PL_PSIZ) { lth = PL_PSIZ; name = strncpy(buf, name, PL_PSIZ - 1); buf[PL_PSIZ - 1] = '\0'; } /* If named artifact exists in the game, do not create another. * Also trying to create an artifact shouldn't de-artifact * it (e.g. Excalibur from prayer). In this case the object * will retain its current name. */ if (obj->oartifact || (lth && exist_artifact(obj->otyp, name))) return obj; if (lth == obj->onamelth) { /* no need to replace entire object */ if (lth) Strcpy(ONAME(obj), name); } else { obj = realloc_obj(obj, obj->oxlth, (genericptr_t)obj->oextra, lth, name); } if (lth) artifact_exists(obj, name, TRUE); if (obj->oartifact) { /* can't dual-wield with artifact as secondary weapon */ if (obj == uswapwep) untwoweapon(); /* activate warning if you've just named your weapon "Sting" */ if (obj == uwep) set_artifact_intrinsic(obj, TRUE, W_WEP); } if (carried(obj)) update_inventory(); return obj; } static NEARDATA const char callable[] = { SCROLL_CLASS, POTION_CLASS, WAND_CLASS, RING_CLASS, AMULET_CLASS, GEM_CLASS, SPBOOK_CLASS, ARMOR_CLASS, TOOL_CLASS, 0 }; int ddocall() { register struct obj *obj; #ifdef REDO char ch; #endif char allowall[2]; switch( #ifdef REDO ch = #endif ynq("Name an individual object?")) { case 'q': break; case 'y': #ifdef REDO savech(ch); #endif allowall[0] = ALL_CLASSES; allowall[1] = '\0'; obj = getobj(allowall, "name"); if(obj) do_oname(obj); break; default : #ifdef REDO savech(ch); #endif obj = getobj(callable, "call"); if (obj) { /* behave as if examining it in inventory; this might set dknown if it was picked up while blind and the hero can now see */ (void) xname(obj); if (!obj->dknown) { You("would never recognize another one."); return 0; } docall(obj); } break; } return 0; } void docall(obj) register struct obj *obj; { char buf[BUFSZ], qbuf[QBUFSZ]; struct obj otemp; register char **str1; if (!obj->dknown) return; /* probably blind */ otemp = *obj; otemp.quan = 1L; otemp.onamelth = 0; otemp.oxlth = 0; if (objects[otemp.otyp].oc_class == POTION_CLASS && otemp.fromsink) /* kludge, meaning it's sink water */ Sprintf(qbuf,"Call a stream of %s fluid:", OBJ_DESCR(objects[otemp.otyp])); else Sprintf(qbuf, "Call %s:", an(xname(&otemp))); getlin(qbuf, buf); if(!*buf || *buf == '\033') return; /* clear old name */ str1 = &(objects[obj->otyp].oc_uname); if(*str1) free((genericptr_t)*str1); /* strip leading and trailing spaces; uncalls item if all spaces */ (void)mungspaces(buf); if (!*buf) { if (*str1) { /* had name, so possibly remove from disco[] */ /* strip name first, for the update_inventory() call from undiscover_object() */ *str1 = (char *)0; undiscover_object(obj->otyp); } } else { *str1 = strcpy((char *) alloc((unsigned)strlen(buf)+1), buf); discover_object(obj->otyp, FALSE, TRUE); /* possibly add to disco[] */ } } #endif /*OVLB*/ #ifdef OVL0 static const char * const ghostnames[] = { /* these names should have length < PL_NSIZ */ /* Capitalize the names for aesthetics -dgk */ "Adri", "Andries", "Andreas", "Bert", "David", "Dirk", "Emile", "Frans", "Fred", "Greg", "Hether", "Jay", "John", "Jon", "Karnov", "Kay", "Kenny", "Kevin", "Maud", "Michiel", "Mike", "Peter", "Robert", "Ron", "Tom", "Wilmar", "Nick Danger", "Phoenix", "Jiro", "Mizue", "Stephan", "Lance Braccus", "Shadowhawk" }; /* ghost names formerly set by x_monnam(), now by makemon() instead */ const char * rndghostname() { return rn2(7) ? ghostnames[rn2(SIZE(ghostnames))] : (const char *)plname; } /* Monster naming functions: * x_monnam is the generic monster-naming function. * seen unseen detected named * mon_nam: the newt it the invisible orc Fido * noit_mon_nam:the newt (as if detected) the invisible orc Fido * l_monnam: newt it invisible orc dog called fido * Monnam: The newt It The invisible orc Fido * noit_Monnam: The newt (as if detected) The invisible orc Fido * Adjmonnam: The poor newt It The poor invisible orc The poor Fido * Amonnam: A newt It An invisible orc Fido * a_monnam: a newt it an invisible orc Fido * m_monnam: newt xan orc Fido * y_monnam: your newt your xan your invisible orc Fido */ /* Bug: if the monster is a priest or shopkeeper, not every one of these * options works, since those are special cases. */ char * x_monnam(mtmp, article, adjective, suppress, called) register struct monst *mtmp; int article; /* ARTICLE_NONE, ARTICLE_THE, ARTICLE_A: obvious * ARTICLE_YOUR: "your" on pets, "the" on everything else * * If the monster would be referred to as "it" or if the monster has a name * _and_ there is no adjective, "invisible", "saddled", etc., override this * and always use no article. */ const char *adjective; int suppress; /* SUPPRESS_IT, SUPPRESS_INVISIBLE, SUPPRESS_HALLUCINATION, SUPPRESS_SADDLE. * EXACT_NAME: combination of all the above */ boolean called; { #ifdef LINT /* static char buf[BUFSZ]; */ char buf[BUFSZ]; #else static char buf[BUFSZ]; #endif 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; if (article == ARTICLE_YOUR && !mtmp->mtame) article = ARTICLE_THE; do_hallu = Hallucination && !(suppress & SUPPRESS_HALLUCINATION); do_invis = mtmp->minvis && !(suppress & SUPPRESS_INVISIBLE); do_it = !canspotmon(mtmp) && article != ARTICLE_YOUR && !program_state.gameover && #ifdef STEED mtmp != u.usteed && #endif !(u.uswallow && mtmp == u.ustuck) && !(suppress & SUPPRESS_IT); do_saddle = !(suppress & SUPPRESS_SADDLE); 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]; char *name; long save_prop = EHalluc_resistance; unsigned save_invis = mtmp->minvis; /* when true name is wanted, explicitly block Hallucination */ if (!do_hallu) EHalluc_resistance = 1L; if (!do_invis) mtmp->minvis = 0; name = priestname(mtmp, priestnambuf); EHalluc_resistance = save_prop; mtmp->minvis = save_invis; if (article == ARTICLE_NONE && !strncmp(name, "the ", 4)) name += 4; return strcpy(buf, name); } /* Shopkeepers: use shopkeeper name. For normal shopkeepers, just * "Asidonhopo"; for unusual ones, "Asidonhopo the invisible * shopkeeper" or "Asidonhopo the blue dragon". If hallucinating, * none of this applies. */ if (mtmp->isshk && !do_hallu) { if (adjective && article == ARTICLE_THE) { /* pathological case: "the angry Asidonhopo the blue dragon" sounds silly */ Strcpy(buf, "the "); Strcat(strcat(buf, adjective), " "); Strcat(buf, shkname(mtmp)); return buf; } Strcat(buf, shkname(mtmp)); if (mdat == &mons[PM_SHOPKEEPER] && !do_invis) return buf; Strcat(buf, " the "); if (do_invis) Strcat(buf, "invisible "); Strcat(buf, mdat->mname); return buf; } /* Put the adjectives in the buffer */ if (adjective) Strcat(strcat(buf, adjective), " "); 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) has_adjectives = TRUE; else has_adjectives = FALSE; /* Put the actual monster name or type into the buffer now */ /* Be sure to remember whether the buffer starts with a name */ if (do_hallu) { Strcat(buf, rndmonnam()); 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; } } else if (is_mplayer(mdat) && !In_endgame(&u.uz)) { char pbuf[BUFSZ]; Strcpy(pbuf, rank_of((int)mtmp->m_lev, monsndx(mdat), (boolean)mtmp->female)); Strcat(buf, lcase(pbuf)); name_at_start = FALSE; } else { Strcat(buf, mdat->mname); name_at_start = (boolean)type_is_pname(mdat); } if (name_at_start && (article == ARTICLE_YOUR || !has_adjectives)) { if (mdat == &mons[PM_WIZARD_OF_YENDOR]) article = ARTICLE_THE; else article = ARTICLE_NONE; } else if ((mdat->geno & G_UNIQ) && article == ARTICLE_A) { article = ARTICLE_THE; } { char buf2[BUFSZ]; switch(article) { case ARTICLE_YOUR: Strcpy(buf2, "your "); Strcat(buf2, buf); Strcpy(buf, buf2); return buf; case ARTICLE_THE: Strcpy(buf2, "the "); Strcat(buf2, buf); Strcpy(buf, buf2); return buf; case ARTICLE_A: return(an(buf)); case ARTICLE_NONE: default: return buf; } } } #endif /* OVL0 */ #ifdef OVLB char * l_monnam(mtmp) register struct monst *mtmp; { return(x_monnam(mtmp, ARTICLE_NONE, (char *)0, mtmp->mnamelth ? SUPPRESS_SADDLE : 0, TRUE)); } #endif /* OVLB */ #ifdef OVL0 char * mon_nam(mtmp) register struct monst *mtmp; { return(x_monnam(mtmp, ARTICLE_THE, (char *)0, mtmp->mnamelth ? SUPPRESS_SADDLE : 0, FALSE)); } /* print the name as if mon_nam() was called, but assume that the player * can always see the monster--used for probing and for monsters aggravating * the player with a cursed potion of invisibility */ char * noit_mon_nam(mtmp) register struct monst *mtmp; { return(x_monnam(mtmp, ARTICLE_THE, (char *)0, mtmp->mnamelth ? (SUPPRESS_SADDLE|SUPPRESS_IT) : SUPPRESS_IT, FALSE)); } char * Monnam(mtmp) register struct monst *mtmp; { register char *bp = mon_nam(mtmp); *bp = highc(*bp); return(bp); } char * noit_Monnam(mtmp) register struct monst *mtmp; { register char *bp = noit_mon_nam(mtmp); *bp = highc(*bp); return(bp); } /* monster's own name */ char * m_monnam(mtmp) struct monst *mtmp; { return x_monnam(mtmp, ARTICLE_NONE, (char *)0, EXACT_NAME, FALSE); } /* pet name: "your little dog" */ char * y_monnam(mtmp) struct monst *mtmp; { int prefix, suppression_flag; prefix = mtmp->mtame ? ARTICLE_YOUR : ARTICLE_THE; suppression_flag = (mtmp->mnamelth #ifdef STEED /* "saddled" is redundant when mounted */ || mtmp == u.usteed #endif ) ? SUPPRESS_SADDLE : 0; return x_monnam(mtmp, prefix, (char *)0, suppression_flag, FALSE); } #endif /* OVL0 */ #ifdef OVLB char * Adjmonnam(mtmp, adj) register struct monst *mtmp; register const char *adj; { register char *bp = x_monnam(mtmp, ARTICLE_THE, adj, mtmp->mnamelth ? SUPPRESS_SADDLE : 0, FALSE); *bp = highc(*bp); return(bp); } char * a_monnam(mtmp) register struct monst *mtmp; { return x_monnam(mtmp, ARTICLE_A, (char *)0, mtmp->mnamelth ? SUPPRESS_SADDLE : 0, FALSE); } char * Amonnam(mtmp) register struct monst *mtmp; { register char *bp = a_monnam(mtmp); *bp = highc(*bp); 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 * const bogusmons[] = { "jumbo shrimp", "giant pigmy", "gnu", "killer penguin", "giant cockroach", "giant slug", "pterodactyl", "tyrannosaurus rex", "rot grub", "bookworm", "master lichen", "hologram", "jester", "attorney", "sleazoid", "killer tomato", "amazon", "robot", "battlemech", "rhinovirus", "harpy", "lion-dog", "rat-ant", "Y2K bug", /* misc. */ "grue", "Christmas-tree monster", "luck sucker", "paskald", "brogmoid", "dornbeast", /* Quendor (Zork, &c.) */ "Ancient Multi-Hued Dragon", "Evil Iggy", /* Moria */ "emu", "kestrel", "xeroc", "venus flytrap", /* Rogue */ "creeping coins", /* Wizardry */ "siren", /* Greek legend */ "killer bunny", /* Monty Python */ "rodent of unusual size", /* The Princess Bride */ "Smokey the bear", /* "Only you can prevent forest fires!" */ "Luggage", /* Discworld */ "Ent", /* Lord of the Rings */ "tangle tree", "wiggle", /* Xanth */ "white rabbit", "snark", /* Lewis Carroll */ "pushmi-pullyu", /* Dr. Doolittle */ "smurf", /* The Smurfs */ "tribble", "Klingon", "Borg", /* Star Trek */ "Ewok", /* Star Wars */ "Totoro", /* Tonari no Totoro */ "ohmu", /* Nausicaa */ "youma", /* Sailor Moon */ "nyaasu", /* Pokemon (Meowth) */ "Godzilla", "King Kong", /* monster movies */ "earthquake beast", /* old L of SH */ "Invid", /* Robotech */ "Terminator", /* The Terminator */ "boomer", /* Bubblegum Crisis */ "Dalek", /* Dr. Who ("Exterminate!") */ "microscopic space fleet", "Ravenous Bugblatter Beast of Traal", /* HGttG */ "teenage mutant ninja turtle", /* TMNT */ "samurai rabbit", /* Usagi Yojimbo */ "aardvark", /* Cerebus */ "Audrey II", /* Little Shop of Horrors */ "witch doctor", "one-eyed one-horned flying purple people eater", /* 50's rock 'n' roll */ "Barney the dinosaur", /* saccharine kiddy TV */ "Azog the Orc King", "Morgoth", /* Angband */ /*[Tom] new wacky names */ "commando", "green beret", "sherman tank", /* Military */ "Jedi knight", "tie fighter", "protocol droid", "R2 unit", "Emperor", /* Star Wars */ "Vorlon", /* Babylon 5 */ "keg","Diet Pepsi", /* drinks */ "questing beast", /* King Arthur */ "Predator", /* Movie */ "green light", "automobile", "invisible Wizard of Yendor", "piece of yellowish-brown glass", "wand of nothing", "ocean","ballpoint pen","paper cut", /* misc */ "Rune", "Gurk", "Yuval", /* people I know */ "mother-in-law" /* common pest */ }; /* Return a random monster name, for hallucination. * KNOWN BUG: May be a proper name (Godzilla, Barney), may not * (the Terminator, a Dalek). There's no elegant way to deal * with this without radically modifying the calling functions. */ const char * rndmonnam() { int name; do { name = rn1(SPECIAL_PM + SIZE(bogusmons) - LOW_PM, LOW_PM); } while (name < SPECIAL_PM && (type_is_pname(&mons[name]) || (mons[name].geno & G_NOGEN))); if (name >= SPECIAL_PM) return bogusmons[name - SPECIAL_PM]; return mons[name].mname; } #ifdef REINCARNATION const char * roguename() /* Name of a Rogue player */ { char *i, *opts; if ((opts = nh_getenv("ROGUEOPTS")) != 0) { for (i = opts; *i; i++) if (!strncmp("name=",i,5)) { char *j; if ((j = index(i+5,',')) != 0) *j = (char)0; return i+5; } } return rn2(3) ? (rn2(2) ? "Michael Toy" : "Kenneth Arnold") : "Glenn Wichman"; } #endif /* REINCARNATION */ #endif /* OVLB */ #ifdef OVL2 static NEARDATA const char * const hcolors[] = { "ultraviolet", "infrared", "bluish-orange", "reddish-green", "dark white", "light black", "sky blue-pink", "salty", "sweet", "sour", "bitter", "striped", "spiral", "swirly", "plaid", "checkered", "argyle", "paisley", "blotchy", "guernsey-spotted", "polka-dotted", "square", "round", "triangular", "cabernet", "sangria", "fuchsia", "wisteria", "lemon-lime", "strawberry-banana", "peppermint", "romantic", "incandescent" }; const char * hcolor(colorpref) const char *colorpref; { return (Hallucination || !colorpref) ? hcolors[rn2(SIZE(hcolors))] : colorpref; } /* return a random real color unless hallucinating */ const char * rndcolor() { int k = rn2(CLR_MAX); return Hallucination ? hcolor((char *)0) : (k == NO_COLOR) ? "colorless" : c_obj_colors[k]; } /* Aliases for road-runner nemesis */ static const char * const coynames[] = { "Carnivorous Vulgaris","Road-Runnerus Digestus", "Eatibus Anythingus" ,"Famishus-Famishus", "Eatibus Almost Anythingus","Eatius Birdius", "Famishius Fantasticus","Eternalii Famishiis", "Famishus Vulgarus","Famishius Vulgaris Ingeniusi", "Eatius-Slobbius","Hardheadipus Oedipus", "Carnivorous Slobbius","Hard-Headipus Ravenus", "Evereadii Eatibus","Apetitius Giganticus", "Hungrii Flea-Bagius","Overconfidentii Vulgaris", "Caninus Nervous Rex","Grotesques Appetitus", "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 */ /*do_name.c*/ slashem-0.0.7E7F3/src/track.c0000664000076400007640000000237110545462317013716 0ustar aliali/* 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 */ #include "hack.h" #define UTSZ 50 STATIC_VAR NEARDATA int utcnt, utpnt; STATIC_VAR NEARDATA coord utrack[UTSZ]; #ifdef OVLB void initrack() { utcnt = utpnt = 0; } #endif /* OVLB */ #ifdef OVL1 /* add to track */ void settrack() { if(utcnt < UTSZ) utcnt++; if(utpnt == UTSZ) utpnt = 0; utrack[utpnt].x = u.ux; utrack[utpnt].y = u.uy; utpnt++; } #endif /* OVL1 */ #ifdef OVL0 coord * gettrack(x, y) register int x, y; { register int cnt, ndist; register coord *tc; cnt = utcnt; for(tc = &utrack[utpnt]; cnt--; ){ if(tc == utrack) tc = &utrack[UTSZ-1]; else tc--; ndist = distmin(x,y,tc->x,tc->y); /* if far away, skip track entries til we're closer */ if(ndist > 2) { ndist -= 2; /* be careful due to extra decrement at top of loop */ cnt -= ndist; if(cnt <= 0) return (coord *) 0; /* too far away, no matches possible */ if(tc < &utrack[ndist]) tc += (UTSZ-ndist); else tc -= ndist; } else if(ndist <= 1) return(ndist ? tc : 0); } return (coord *)0; } #endif /* OVL0 */ /*track.c*/ slashem-0.0.7E7F3/src/worn.c0000664000076400007640000005505510545462317013606 0ustar aliali/* SCCS Id: @(#)worn.c 3.4 2003/01/08 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" STATIC_DCL void FDECL(m_lose_armor, (struct monst *,struct obj *)); STATIC_DCL void FDECL(m_dowear_type, (struct monst *,long, BOOLEAN_P, BOOLEAN_P)); STATIC_DCL int FDECL(extra_pref, (struct monst *, struct obj *)); const struct worn { long w_mask; struct obj **w_obj; } worn[] = { { W_ARM, &uarm }, { W_ARMC, &uarmc }, { W_ARMH, &uarmh }, { W_ARMS, &uarms }, { W_ARMG, &uarmg }, { W_ARMF, &uarmf }, #ifdef TOURIST { W_ARMU, &uarmu }, #endif { W_RINGL, &uleft }, { W_RINGR, &uright }, { W_WEP, &uwep }, { W_SWAPWEP, &uswapwep }, { W_QUIVER, &uquiver }, { W_AMUL, &uamul }, { W_TOOL, &ublindf }, { W_BALL, &uball }, { W_CHAIN, &uchain }, #ifdef STEED { W_SADDLE, &usaddle }, #endif { 0, 0 } }; /* this only allows for one blocking property per item */ /* KMH -- Added Hobbits & stealth */ /* This only allows for one blocking item per property */ #define w_blocks(o,m) \ ((o->otyp == MUMMY_WRAPPING && ((m) & W_ARMC)) ? INVIS : \ (o->otyp == CORNUTHAUM && ((m) & W_ARMH) && \ !Role_if(PM_WIZARD)) ? CLAIRVOYANT : \ (is_boots(o) && o->otyp != ELVEN_BOOTS && ((m) & W_ARMF) && \ Role_if(PM_HOBBIT)) ? STEALTH : 0) /* note: monsters don't have clairvoyance, so your role has no significant effect on their use of w_blocks() */ /* KMH, intrinsic patch. * Updated to use the extrinsic and blocked fields. */ void setworn(obj, mask) register struct obj *obj; long mask; { register const struct worn *wp; register struct obj *oobj; register int p; if ((mask & (W_ARM|I_SPECIAL)) == (W_ARM|I_SPECIAL)) { /* restoring saved game; no properties are conferred via skin */ uskin = obj; /* assert( !uarm ); */ } else { for(wp = worn; wp->w_mask; wp++) if(wp->w_mask & mask) { oobj = *(wp->w_obj); if(oobj && !(oobj->owornmask & wp->w_mask)) impossible("Setworn: mask = %ld.", wp->w_mask); if(oobj) { if (u.twoweap && (oobj->owornmask & (W_WEP|W_SWAPWEP))) { if (uswapwep) unwield(uswapwep, FALSE); u.twoweap = 0; } oobj->owornmask &= ~wp->w_mask; if (wp->w_mask & ~(W_SWAPWEP|W_QUIVER)) { /* leave as "x = x y", here and below, for broken * compilers */ p = objects[oobj->otyp].oc_oprop; u.uprops[p].extrinsic = u.uprops[p].extrinsic & ~wp->w_mask; if ((p = w_blocks(oobj,mask)) != 0) u.uprops[p].blocked &= ~wp->w_mask; if (oobj->oartifact) set_artifact_intrinsic(oobj, 0, mask); } } *(wp->w_obj) = obj; if(obj) { obj->owornmask |= wp->w_mask; /* Prevent getting/blocking intrinsics from wielding * potions, through the quiver, etc. * Allow weapon-tools, too. * wp_mask should be same as mask at this point. */ if (wp->w_mask & ~(W_SWAPWEP|W_QUIVER)) { if (obj->oclass == WEAPON_CLASS || is_weptool(obj) || mask != W_WEP) { p = objects[obj->otyp].oc_oprop; u.uprops[p].extrinsic = u.uprops[p].extrinsic | wp->w_mask; if ((p = w_blocks(obj, mask)) != 0) u.uprops[p].blocked |= wp->w_mask; } if (obj->oartifact) set_artifact_intrinsic(obj, 1, mask); } } } } update_inventory(); } /* called e.g. when obj is destroyed */ /* KMH, intrinsic patch. * Updated to use the extrinsic and blocked fields. */ void setnotworn(obj) register struct obj *obj; { register const struct worn *wp; register int p; if (!obj) return; if (obj == uwep || obj == uswapwep) { if (uswapwep) unwield(uswapwep, FALSE); 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(); } void mon_set_minvis(mon) struct monst *mon; { mon->perminvis = 1; if (!mon->invis_blkd) { mon->minvis = 1; newsym(mon->mx, mon->my); /* make it disappear */ if (mon->wormno) see_wsegs(mon); /* and any tail too */ } } 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, petrify = FALSE; 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; else mon->permspeed = MFAST; break; case 0: /* just check for worn speed boots */ break; case -1: if (mon->permspeed == MFAST) mon->permspeed = 0; else mon->permspeed = MSLOW; break; case -2: mon->permspeed = MSLOW; give_msg = FALSE; /* (not currently used) */ break; case -3: /* petrification */ /* take away intrinsic speed but don't reduce normal speed */ if (mon->permspeed == MFAST) mon->permspeed = 0; petrify = TRUE; break; } for (otmp = mon->minvent; otmp; otmp = otmp->nobj) if (otmp->owornmask && objects[otmp->otyp].oc_oprop == FAST) break; if (otmp) /* speed boots */ mon->mspeed = MFAST; else mon->mspeed = mon->permspeed; if (give_msg && (mon->mspeed != oldspeed || petrify) && canseemon(mon)) { /* fast to slow (skipping intermediate state) or vice versa */ const char *howmuch = (mon->mspeed + oldspeed == MFAST + MSLOW) ? "much " : ""; if (petrify) { /* mimic the player's petrification countdown; "slowing down" even if fast movement rate retained via worn speed boots */ if (flags.verbose) pline("%s is slowing down.", Monnam(mon)); } else 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 */ void update_mon_intrinsics(mon, obj, on, silently) struct monst *mon; struct obj *obj; boolean on, silently; { int unseen; unsigned long mask; struct obj *otmp; int which = (int) objects[obj->otyp].oc_oprop; unseen = !canseemon(mon); if (!which) goto maybe_blocks; if (on) { switch (which) { case INVIS: mon->minvis = !mon->invis_blkd; break; case FAST: { boolean save_in_mklev = in_mklev; if (silently) in_mklev = TRUE; mon_adjust_speed(mon, 0, obj); in_mklev = save_in_mklev; break; } /* properties handled elsewhere */ case ANTIMAGIC: case REFLECTING: break; /* properties which have no effect for monsters */ case CLAIRVOYANT: case STEALTH: case TELEPAT: break; /* properties which should have an effect but aren't implemented */ case LEVITATION: case WWALKING: break; /* properties which maybe should have an effect but don't */ case DISPLACED: case FUMBLING: case JUMPING: case PROTECTION: break; case DRAIN_RES: mon->mintrinsics |= MR_DRAIN; break; default: if (which <= 8) { /* 1 thru 8 correspond to MR_xxx mask values */ /* FIRE,COLD,SLEEP,DISINT,SHOCK,POISON,ACID,STONE */ mask = (uchar) (1 << (which - 1)); mon->mintrinsics |= (unsigned short) mask; } break; } } else { /* off */ switch (which) { case INVIS: mon->minvis = mon->perminvis; break; case FAST: { boolean save_in_mklev = in_mklev; if (silently) in_mklev = TRUE; mon_adjust_speed(mon, 0, obj); in_mklev = save_in_mklev; break; } case DRAIN_RES: mask = MR_DRAIN; goto maybe_loose; case FIRE_RES: case COLD_RES: case SLEEP_RES: case DISINT_RES: case SHOCK_RES: case POISON_RES: case ACID_RES: case STONE_RES: mask = (uchar) (1 << (which - 1)); maybe_loose: /* If the monster doesn't have this resistance intrinsically, check whether any other worn item confers it. Note that we don't currently check for anything conferred via simply carrying an object. */ if (!(mon->data->mresists & mask)) { for (otmp = mon->minvent; otmp; otmp = otmp->nobj) if (otmp->owornmask && (int) objects[otmp->otyp].oc_oprop == which) break; if (!otmp) mon->mintrinsics &= ~mask; } break; default: break; } } maybe_blocks: /* obj->owornmask has been cleared by this point, so we can't use it. However, since monsters don't wield armor, we don't have to guard against that and can get away with a blanket worn-mask value. */ switch (w_blocks(obj,~0L)) { case INVIS: mon->invis_blkd = on ? 1 : 0; mon->minvis = on ? 0 : mon->perminvis; break; default: break; } #ifdef STEED if (!on && mon == u.usteed && obj->otyp == SADDLE) dismount_steed(DISMOUNT_FELL); #endif /* if couldn't see it but now can, or vice versa, update display */ if (!silently && (unseen ^ !canseemon(mon))) newsym(mon->mx, mon->my); } int find_mac(mon) register struct monst *mon; { register struct obj *obj; int base = mon->data->ac; long mwflags = mon->misc_worn_check; for (obj = mon->minvent; obj; obj = obj->nobj) { if (obj->owornmask & mwflags) base -= ARM_BONUS(obj); /* since ARM_BONUS is positive, subtracting it increases AC */ } return base; } /* weapons are handled separately; rings and eyewear aren't used by monsters */ /* Wear the best object of each type that the monster has. During creation, * the monster can put everything on at once; otherwise, wearing takes time. * This doesn't affect monster searching for objects--a monster may very well * search for objects it would not want to wear, because we don't want to * check which_armor() each round. * * We'll let monsters put on shirts and/or suits under worn cloaks, but * not shirts under worn suits. This is somewhat arbitrary, but it's * too tedious to have them remove and later replace outer garments, * and preventing suits under cloaks makes it a little bit too easy for * players to influence what gets worn. Putting on a shirt underneath * already worn body armor is too obviously buggy... */ void m_dowear(mon, creation) register struct monst *mon; boolean creation; { #define RACE_EXCEPTION TRUE /* Note the restrictions here are the same as in dowear in do_wear.c * except for the additional restriction on intelligence. (Players * are always intelligent, even if polymorphed). */ if (verysmall(mon->data) || nohands(mon->data) || is_animal(mon->data)) return; /* give mummies a chance to wear their wrappings * and let skeletons wear their initial armor */ if (mindless(mon->data) && (!creation || (mon->data->mlet != S_MUMMY && mon->data != &mons[PM_SKELETON]))) return; m_dowear_type(mon, W_AMUL, creation, FALSE); #ifdef TOURIST /* can't put on shirt if already wearing suit */ if (!cantweararm(mon->data) || (mon->misc_worn_check & W_ARM)) m_dowear_type(mon, W_ARMU, creation, FALSE); #endif /* treating small as a special case allows hobbits, gnomes, and kobolds to wear cloaks */ if (!cantweararm(mon->data) || mon->data->msize == MZ_SMALL) m_dowear_type(mon, W_ARMC, creation, FALSE); m_dowear_type(mon, W_ARMH, creation, FALSE); if (!MON_WEP(mon) || !bimanual(MON_WEP(mon))) m_dowear_type(mon, W_ARMS, creation, FALSE); m_dowear_type(mon, W_ARMG, creation, FALSE); if (!slithy(mon->data) && mon->data->mlet != S_CENTAUR) m_dowear_type(mon, W_ARMF, creation, FALSE); if (!cantweararm(mon->data)) m_dowear_type(mon, W_ARM, creation, FALSE); else m_dowear_type(mon, W_ARM, creation, RACE_EXCEPTION); } STATIC_OVL void m_dowear_type(mon, flag, creation, racialexception) struct monst *mon; long flag; boolean creation; boolean racialexception; { struct obj *old, *best, *obj; int m_delay = 0; int unseen = !canseemon(mon); char nambuf[BUFSZ]; if (mon->mfrozen) return; /* probably putting previous item on */ /* Get a copy of monster's name before altering its visibility */ Strcpy(nambuf, See_invisible ? Monnam(mon) : mon_nam(mon)); old = which_armor(mon, flag); if (old && old->cursed) return; if (old && flag == W_AMUL) return; /* no such thing as better amulets */ best = old; for(obj = mon->minvent; obj; obj = obj->nobj) { switch(flag) { case W_AMUL: if (obj->oclass != AMULET_CLASS || (obj->otyp != AMULET_OF_LIFE_SAVING && obj->otyp != AMULET_OF_REFLECTION)) continue; best = obj; goto outer_break; /* no such thing as better amulets */ #ifdef TOURIST case W_ARMU: if (!is_shirt(obj)) continue; break; #endif case W_ARMC: if (!is_cloak(obj)) continue; break; case W_ARMH: if (!is_helmet(obj)) continue; /* (flimsy exception matches polyself handling) */ if (has_horns(mon->data) && !is_flimsy(obj)) continue; break; case W_ARMS: if (!is_shield(obj)) continue; break; case W_ARMG: if (!is_gloves(obj)) continue; break; case W_ARMF: if (!is_boots(obj)) continue; break; case W_ARM: if (!is_suit(obj)) continue; if (racialexception && (racial_exception(mon, obj) < 1)) continue; break; } if (obj->owornmask) continue; /* I'd like to define a VISIBLE_ARM_BONUS which doesn't assume the * monster knows obj->spe, but if I did that, a monster would keep * switching forever between two -2 caps since when it took off one * 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: if (!best || best == old) return; /* if wearing a cloak, account for the time spent removing and re-wearing it when putting on a suit or shirt */ if ((flag == W_ARM #ifdef TOURIST || flag == W_ARMU #endif ) && (mon->misc_worn_check & W_ARMC)) m_delay += 2; /* when upgrading a piece of armor, account for time spent taking off current one */ if (old) m_delay += objects[old->otyp].oc_delay; if (old) /* do this first to avoid "(being worn)" */ old->owornmask = 0L; if (!creation) { if (canseemon(mon)) { char buf[BUFSZ]; if (old) Sprintf(buf, " removes %s and", distant_name(old, doname)); else buf[0] = '\0'; pline("%s%s puts on %s.", Monnam(mon), buf, distant_name(best,doname)); } /* can see it */ m_delay += objects[best->otyp].oc_delay; mon->mfrozen = m_delay; if (mon->mfrozen) mon->mcanmove = 0; } if (old) update_mon_intrinsics(mon, old, FALSE, creation); mon->misc_worn_check |= flag; best->owornmask |= flag; update_mon_intrinsics(mon, best, TRUE, creation); /* if couldn't see it but now can, or vice versa, */ if (!creation && (unseen ^ !canseemon(mon))) { if (mon->minvis && !See_invisible) { pline("Suddenly you cannot see %s.", nambuf); makeknown(best->otyp); } /* else if (!mon->minvis) pline("%s suddenly appears!", Amonnam(mon)); */ } } #undef RACE_EXCEPTION struct obj * which_armor(mon, flag) struct monst *mon; long flag; { register struct obj *obj; for(obj = mon->minvent; obj; obj = obj->nobj) if (obj->owornmask & flag) return obj; return((struct obj *)0); } /* remove an item of armor and then drop it */ STATIC_OVL void m_lose_armor(mon, obj) struct monst *mon; struct obj *obj; { mon->misc_worn_check &= ~obj->owornmask; if (obj->owornmask) update_mon_intrinsics(mon, obj, FALSE, FALSE); obj->owornmask = 0L; obj_extract_self(obj); place_object(obj, mon->mx, mon->my); /* call stackobj() if we ever drop anything that can merge */ newsym(mon->mx, mon->my); } /* all objects with their bypass bit set should now be reset to normal */ void clear_bypasses() { struct obj *otmp, *nobj; struct monst *mtmp; for (otmp = fobj; otmp; otmp = nobj) { nobj = otmp->nobj; if (otmp->bypass) { otmp->bypass = 0; /* bypass will have inhibited any stacking, but since it's used for polymorph handling, the objects here probably have been transformed and won't be stacked in the usual manner afterwards; so don't bother with this */ #if 0 if (objects[otmp->otyp].oc_merge) { xchar ox, oy; (void) get_obj_location(otmp, &ox, &oy, 0); stack_object(otmp); newsym(ox, oy); } #endif /*0*/ } } /* invent and mydogs chains shouldn't matter here */ for (otmp = migrating_objs; otmp; otmp = otmp->nobj) otmp->bypass = 0; for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) { if (DEADMONSTER(mtmp)) continue; for (otmp = mtmp->minvent; otmp; otmp = otmp->nobj) otmp->bypass = 0; } for (mtmp = migrating_mons; mtmp; mtmp = mtmp->nmon) { for (otmp = mtmp->minvent; otmp; otmp = otmp->nobj) otmp->bypass = 0; } 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); boolean handless_or_tiny = (nohands(mdat) || verysmall(mdat)); 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."); m_useup(mon, otmp); } 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); } } #ifdef TOURIST if ((otmp = which_armor(mon, W_ARMU)) != 0) { if (vis) pline("%s shirt rips to shreds!", s_suffix(Monnam(mon))); else You_hear("a ripping sound."); m_useup(mon, otmp); } #endif } else if (sliparm(mdat)) { if ((otmp = which_armor(mon, W_ARM)) != 0) { if (vis) pline("%s armor falls around %s!", 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 if ((otmp = which_armor(mon, W_ARMU)) != 0) { if (vis) { if (sliparm(mon->data)) pline("%s seeps right through %s shirt!", Monnam(mon), ppronoun); else pline("%s becomes much too small for %s shirt!", Monnam(mon), ppronoun); } if (polyspot) bypass_obj(otmp); m_lose_armor(mon, otmp); } #endif } if (handless_or_tiny) { /* [caller needs to handle weapon checks] */ if ((otmp = which_armor(mon, W_ARMG)) != 0) { if (vis) pline("%s drops %s gloves%s!", Monnam(mon), ppronoun, MON_WEP(mon) ? " and weapon" : ""); if (polyspot) bypass_obj(otmp); m_lose_armor(mon, otmp); } if ((otmp = which_armor(mon, W_ARMS)) != 0) { if (vis) pline("%s can no longer hold %s shield!", Monnam(mon), ppronoun); else You_hear("a clank."); if (polyspot) bypass_obj(otmp); m_lose_armor(mon, otmp); } } if (handless_or_tiny || has_horns(mdat)) { if ((otmp = which_armor(mon, W_ARMH)) != 0 && /* flimsy test for horns matches polyself handling */ (handless_or_tiny || !is_flimsy(otmp))) { if (vis) pline("%s helmet falls to the %s!", s_suffix(Monnam(mon)), surface(mon->mx, mon->my)); else You_hear("a clank."); if (polyspot) bypass_obj(otmp); m_lose_armor(mon, otmp); } } if (handless_or_tiny || slithy(mdat) || mdat->mlet == S_CENTAUR) { if ((otmp = which_armor(mon, W_ARMF)) != 0) { if (vis) { if (is_whirly(mon->data)) pline("%s boots fall away!", s_suffix(Monnam(mon))); else pline("%s boots %s off %s feet!", 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))); } if (mon == u.usteed) goto noride; } else if (mon == u.usteed && !can_ride(mon)) { noride: You("can no longer ride %s.", mon_nam(mon)); if (touch_petrifies(u.usteed->data) && !Stone_resistance && rnl(3)) { char buf[BUFSZ]; You("touch %s.", mon_nam(u.usteed)); Sprintf(buf, "falling off %s", an(u.usteed->data->mname)); instapetrify(buf); } dismount_steed(DISMOUNT_FELL); } #endif 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; } /* * Exceptions to things based on race. Correctly checks polymorphed player race. * Returns: * 0 No exception, normal rules apply. * 1 If the race/object combination is acceptable. * -1 If the race/object combination is unacceptable. */ int racial_exception(mon, obj) struct monst *mon; struct obj *obj; { const struct permonst *ptr = raceptr(mon); /* Acceptable Exceptions: */ /* Allow hobbits to wear elven armor - LoTR */ if (ptr == &mons[PM_HOBBIT] && is_elven_armor(obj)) return 1; /* Unacceptable Exceptions: */ /* Checks for object that certain races should never use go here */ /* return -1; */ return 0; } /*worn.c*/ slashem-0.0.7E7F3/src/pickup.c0000664000076400007640000022057410545462317014114 0ustar aliali/* SCCS Id: @(#)pickup.c 3.4 2003/07/27 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ /* * Contains code for picking objects up, and container use. */ #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 *)); #if 0 /* not used */ STATIC_DCL boolean FDECL(allow_cat_no_uchain, (struct obj *)); #endif STATIC_DCL int FDECL(autopick, (struct obj*, int, menu_item **)); STATIC_DCL int FDECL(count_categories, (struct obj *,int)); STATIC_DCL long FDECL(carry_count, (struct obj *,struct obj *,long,BOOLEAN_P,int *,int *)); STATIC_DCL int FDECL(lift_object, (struct obj *,struct obj *,long *,BOOLEAN_P)); STATIC_PTR int FDECL(in_container,(struct obj *)); STATIC_PTR int FDECL(ck_bag,(struct obj *)); STATIC_PTR int FDECL(out_container,(struct obj *)); STATIC_DCL long FDECL(mbag_item_gone, (int,struct obj *)); STATIC_DCL void FDECL(observe_quantum_cat, (struct obj *)); STATIC_DCL int FDECL(menu_loot, (int, struct obj *, BOOLEAN_P)); STATIC_DCL int FDECL(in_or_out_menu, (const char *,struct obj *, BOOLEAN_P, BOOLEAN_P)); STATIC_DCL int FDECL(container_at, (int, int, BOOLEAN_P)); STATIC_DCL boolean FDECL(able_to_loot, (int, int)); STATIC_DCL boolean FDECL(mon_beside, (int, int)); /* define for query_objlist() and autopickup() */ #define FOLLOW(curr, flags) \ (((flags) & BY_NEXTHERE) ? (curr)->nexthere : (curr)->nobj) #define CEILDIV(x,y) (((x)+(y)-1)/(y)) /* ceil(x/y) */ /* * How much the weight of the given container will change when the given * object is removed from it. This calculation must match the one used * by weight() in mkobj.c. */ #define DELTA_CWT(cont,obj) \ ((cont)->cursed ? (obj)->owt * ((cont)->oartifact ? 4 : 2) : \ CEILDIV((obj)->owt, ((cont)->oartifact ? 3 : 2) * ((cont)->blessed ? 2 : 1))) #define GOLD_WT(n) (((n) + 50L) / 100L) /* if you can figure this out, give yourself a hearty pat on the back... */ #define GOLD_CAPACITY(w,n) (((w) * -100L) - ((n) + 50L) - 1L) /* A variable set in use_container(), to be used by the callback routines */ /* in_container() and out_container() from askchain() and use_container(). */ /* Also used by memu_loot() and container_gone(). */ static NEARDATA struct obj *current_container; #define Icebox (current_container->otyp == ICE_BOX) static const char moderateloadmsg[] = "You have a little trouble lifting"; static const char nearloadmsg[] = "You have much trouble lifting"; static const char overloadmsg[] = "You have extreme difficulty lifting"; /* BUG: this lets you look at cockatrice corpses while blind without touching them */ /* much simpler version of the look-here code; used by query_classes() */ STATIC_OVL void simple_look(otmp, here) struct obj *otmp; /* list of objects */ boolean here; /* flag for type of obj list linkage */ { /* Neither of the first two cases is expected to happen, since * we're only called after multiple classes of objects have been * detected, hence multiple objects must be present. */ if (!otmp) { impossible("simple_look(null)"); } else if (!(here ? otmp->nexthere : otmp->nobj)) { pline("%s", doname(otmp)); } else { winid tmpwin = create_nhwindow(NHW_MENU); putstr(tmpwin, 0, ""); do { putstr(tmpwin, 0, doname(otmp)); otmp = here ? otmp->nexthere : otmp->nobj; } while (otmp); display_nhwindow(tmpwin, TRUE); destroy_nhwindow(tmpwin); } } #ifndef GOLDOBJ int collect_obj_classes(ilets, otmp, here, incl_gold, filter, itemcount) char ilets[]; register struct obj *otmp; boolean here, incl_gold; boolean FDECL((*filter),(OBJ_P)); int *itemcount; #else int collect_obj_classes(ilets, otmp, here, filter, itemcount) char ilets[]; register struct obj *otmp; boolean here; boolean FDECL((*filter),(OBJ_P)); int *itemcount; #endif { register int iletct = 0; register char c; *itemcount = 0; #ifndef GOLDOBJ if (incl_gold) ilets[iletct++] = def_oc_syms[COIN_CLASS]; #endif ilets[iletct] = '\0'; /* terminate ilets so that index() will work */ while (otmp) { c = def_oc_syms[(int)otmp->oclass]; if (!index(ilets, c) && (!filter || (*filter)(otmp))) ilets[iletct++] = c, ilets[iletct] = '\0'; *itemcount += 1; otmp = here ? otmp->nexthere : otmp->nobj; } return iletct; } /* * Suppose some '?' and '!' objects are present, but '/' objects aren't: * "a" picks all items without further prompting; * "A" steps through all items, asking one by one; * "?" steps through '?' items, asking, and ignores '!' ones; * "/" becomes 'A', since no '/' present; * "?a" or "a?" picks all '?' without further prompting; * "/a" or "a/" becomes 'A' since there aren't any '/' * (bug fix: 3.1.0 thru 3.1.3 treated it as "a"); * "?/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) char oclasses[]; boolean *one_at_a_time, *everything; const char *action; 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; boolean not_everything; char qbuf[QBUFSZ]; boolean m_seen; int itemcount; 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, &itemcount); if (iletct == 0) { return FALSE; } else if (iletct == 1) { oclasses[0] = def_char_to_objclass(ilets[0]); oclasses[1] = '\0'; if (itemcount && menu_on_demand) { ilets[iletct++] = 'm'; *menu_on_demand = 0; ilets[iletct] = '\0'; } } else { /* more than one choice available */ const char *where = 0; register char sym, oc_of_sym, *p; /* additional choices */ ilets[iletct++] = ' '; ilets[iletct++] = 'a'; ilets[iletct++] = 'A'; ilets[iletct++] = (objs == invent ? 'i' : ':'); if (menu_on_demand) { ilets[iletct++] = 'm'; *menu_on_demand = 0; } ilets[iletct] = '\0'; ask_again: oclasses[oclassct = 0] = '\0'; *one_at_a_time = *everything = FALSE; not_everything = FALSE; Sprintf(qbuf,"What kinds of thing do you want to %s? [%s]", action, ilets); getlin(qbuf,inbuf); if (*inbuf == '\033') return FALSE; for (p = inbuf; (sym = *p++); ) { /* new A function (selective all) added by GAN 01/09/87 */ if (sym == ' ') continue; else if (sym == 'A') *one_at_a_time = TRUE; else if (sym == 'a') *everything = TRUE; else if (sym == ':') { simple_look(objs, here); /* dumb if objs==invent */ goto ask_again; } else if (sym == 'i') { (void) display_inventory((char *)0, TRUE); goto ask_again; } else if (sym == 'm') { m_seen = TRUE; } else { oc_of_sym = def_char_to_objclass(sym); if (index(ilets,sym)) { add_valid_menu_class(oc_of_sym); oclasses[oclassct++] = oc_of_sym; oclasses[oclassct] = '\0'; } else { if (!where) where = !strcmp(action,"pick up") ? "here" : !strcmp(action,"take out") ? "inside" : ""; if (*where) There("are no %c's %s.", sym, where); else You("have no %c's.", sym); not_everything = TRUE; } } } if (m_seen && menu_on_demand) { *menu_on_demand = (*everything || !oclassct) ? -2 : -3; return FALSE; } if (!oclassct && (!*everything || not_everything)) { /* didn't pick anything, or tried to pick something that's not present */ *one_at_a_time = TRUE; /* force 'A' */ *everything = FALSE; /* inhibit 'a' */ } } return TRUE; } /* look at the objects at our location, unless there are too many of them */ STATIC_OVL void check_here(picked_some) boolean picked_some; { register struct obj *obj; register int ct = 0; /* count the objects here */ for (obj = level.objects[u.ux][u.uy]; obj; obj = obj->nexthere) { if (obj != uchain) ct++; } /* If there are objects here, take a look. */ if (ct) { if (flags.run) nomul(0); flush_screen(1); (void) look_here(ct, picked_some); } else { sense_engr_at(u.ux, u.uy, FALSE); } } /* Value set by query_objlist() for n_or_more(). */ static long val_for_n_or_more; /* query_objlist callback: return TRUE if obj's count is >= reference value */ STATIC_OVL boolean n_or_more(obj) struct obj *obj; { if (obj == uchain) return FALSE; return (obj->quan >= val_for_n_or_more); } /* List of valid menu classes for query_objlist() and allow_category callback */ static char valid_menu_classes[MAXOCLASSES + 2]; void add_valid_menu_class(c) int c; { static int vmc_count = 0; if (c == 0) /* reset */ vmc_count = 0; else valid_menu_classes[vmc_count++] = (char)c; valid_menu_classes[vmc_count] = '\0'; } /* query_objlist callback: return TRUE if not uchain */ STATIC_OVL boolean all_but_uchain(obj) struct obj *obj; { return (obj != uchain); } /* query_objlist callback: return TRUE */ /*ARGSUSED*/ boolean allow_all(obj) struct obj *obj; { return TRUE; } boolean allow_category(obj) struct obj *obj; { if (Role_if(PM_PRIEST)) obj->bknown = TRUE; 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 != COIN_CLASS && obj->bknown && !obj->blessed && !obj->cursed))) return TRUE; else if (((index(valid_menu_classes,'B') != (char *)0) && (obj->oclass != COIN_CLASS && obj->bknown && obj->blessed))) return TRUE; else if (((index(valid_menu_classes,'C') != (char *)0) && (obj->oclass != COIN_CLASS && obj->bknown && obj->cursed))) return TRUE; else if (((index(valid_menu_classes,'X') != (char *)0) && (obj->oclass != COIN_CLASS && !obj->bknown))) return TRUE; else return FALSE; } #if 0 /* not used */ /* query_objlist callback: return TRUE if valid category (class), no uchain */ STATIC_OVL boolean allow_cat_no_uchain(obj) struct obj *obj; { if ((obj != uchain) && (((index(valid_menu_classes,'u') != (char *)0) && obj->unpaid) || (index(valid_menu_classes, obj->oclass) != (char *)0))) return TRUE; else return FALSE; } #endif /* query_objlist callback: return TRUE if valid class and worn */ boolean is_worn_by_type(otmp) register struct obj *otmp; { return((boolean)(!!(otmp->owornmask & (W_ARMOR | W_RING | W_AMUL | W_TOOL | W_WEP | W_SWAPWEP | W_QUIVER))) && (index(valid_menu_classes, otmp->oclass) != (char *)0)); } /* * Have the hero pick things from the ground * or a monster's inventory if swallowed. * * Arg what: * >0 autopickup * =0 interactive * <0 pickup count of something * * Returns 1 if tried to pick something up, whether * or not it succeeded. */ int pickup(what) int what; /* should be a long */ { 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) { struct trap *ttmp = t_at(u.ux, u.uy); /* 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))) { sense_engr_at(u.ux, u.uy, FALSE); return (0); } /* no pickup if levitating & not on air or water level */ if (!can_reach_floor()) { if ((multi && !flags.run) || (autopickup && !flags.pickup)) sense_engr_at(u.ux, u.uy, FALSE); return (0); } if (ttmp && ttmp->tseen) { /* Allow pickup from holes and trap doors that you escaped * from because that stuff is teetering on the edge just * like you, but not pits, because there is an elevation * discrepancy with stuff in pits. */ if ((ttmp->ttyp == PIT || ttmp->ttyp == SPIKED_PIT) && (!u.utrap || (u.utrap && u.utraptype != TT_PIT))) { sense_engr_at(u.ux, u.uy, FALSE); 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. * Automatic pickup has been split into its own menu-style routine * to make things less confusing. */ if (autopickup) { n = autopick(objchain, traverse_how, &pick_list); goto menu_pickup; } if (flags.menu_style != MENU_TRADITIONAL || iflags.menu_requested) { /* use menus exclusively */ if (count) { /* looking for N of something */ 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|FEEL_COCKATRICE, &pick_list, PICK_ANY, all_but_uchain); } menu_pickup: n_tried = n; for (n_picked = i = 0 ; i < n; i++) { res = pickup_object(pick_list[i].item.a_obj,pick_list[i].count, FALSE); if (res < 0) break; /* can't continue */ n_picked += res; } if (pick_list) free((genericptr_t)pick_list); } else { /* old style interface */ int ct = 0; long lcount; boolean all_of_a_type, selective; char oclasses[MAXOCLASSES]; struct obj *obj, *obj2; oclasses[0] = '\0'; /* types to consider (empty for all) */ all_of_a_type = TRUE; /* take all of considered types */ 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) n_picked++; /* picked something */ goto end_query; } else if (ct >= 2) { int via_menu = 0; 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)) continue; if (!all_of_a_type) { char qbuf[BUFSZ]; Sprintf(qbuf, "Pick up %s?", safe_qbuf("", sizeof("Pick up ?"), doname(obj), an(simple_typename(obj->otyp)), "something")); switch ((obj->quan < 2L) ? ynaq(qbuf) : ynNaq(qbuf)) { case 'q': goto end_query; /* out 2 levels */ case 'n': continue; case 'a': all_of_a_type = TRUE; if (selective) { selective = FALSE; oclasses[0] = obj->oclass; oclasses[1] = '\0'; } break; case '#': /* count was entered */ if (!yn_number) continue; /* 0 count => No */ lcount = (long) yn_number; if (lcount > obj->quan) lcount = obj->quan; /* fall thru */ default: /* 'y' */ break; } } if (lcount == -1L) lcount = obj->quan; n_tried++; if ((res = pickup_object(obj, lcount, FALSE)) < 0) break; n_picked += res; } end_query: ; /* 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); } #ifdef AUTOPICKUP_EXCEPTIONS boolean is_autopickup_exception(obj, grab) struct obj *obj; boolean grab; /* forced pickup, rather than forced leave behind? */ { /* * Does the text description of this match an exception? */ char *objdesc = makesingular(doname(obj)); struct autopickup_exception *ape = (grab) ? iflags.autopickup_exceptions[AP_GRAB] : iflags.autopickup_exceptions[AP_LEAVE]; while (ape) { if (pmatch(ape->pattern, objdesc)) return TRUE; ape = ape->next; } return FALSE; } #endif /* AUTOPICKUP_EXCEPTIONS */ /* * Pick from the given list using flags.pickup_types. Return the number * of items picked (not counts). Create an array that returns pointers * and counts of the items to be picked up. If the number of items * picked is zero, the pickup list is left alone. The caller of this * function must free the pickup list. */ STATIC_OVL int autopick(olist, follow, pick_list) struct obj *olist; /* the object list */ int follow; /* how to follow the object list */ menu_item **pick_list; /* list of objects and counts to pick up */ { menu_item *pi; /* pick item */ struct obj *curr; int n; const char *otypes = flags.pickup_types; /* first count the number of eligible items */ for (n = 0, curr = olist; curr; curr = FOLLOW(curr, follow)) #ifndef AUTOPICKUP_EXCEPTIONS if (!*otypes || index(otypes, curr->oclass) || flags.pickup_thrown && curr->was_thrown) #else if ((!*otypes || index(otypes, curr->oclass) || flags.pickup_thrown && curr->was_thrown || is_autopickup_exception(curr, TRUE)) && !is_autopickup_exception(curr, FALSE)) #endif n++; if (n) { *pick_list = pi = (menu_item *) alloc(sizeof(menu_item) * n); for (n = 0, curr = olist; curr; curr = FOLLOW(curr, follow)) #ifndef AUTOPICKUP_EXCEPTIONS if (!*otypes || index(otypes, curr->oclass) || flags.pickup_thrown && curr->was_thrown) { #else if ((!*otypes || index(otypes, curr->oclass) || flags.pickup_thrown && curr->was_thrown || is_autopickup_exception(curr, TRUE)) && !is_autopickup_exception(curr, FALSE)) { #endif pi[n].item.a_obj = curr; pi[n].count = curr->quan; n++; } } return n; } /* * Put up a menu using the given object list. Only those objects on the * list that meet the approval of the allow function are displayed. Return * a count of the number of items selected, as well as an allocated array of * menu_items, containing pointers to the objects selected and counts. The * returned counts are guaranteed to be in bounds and non-zero. * * Query flags: * BY_NEXTHERE - Follow object list via nexthere instead of nobj. * AUTOSELECT_SINGLE - Don't ask if only 1 object qualifies - just * use it. * USE_INVLET - Use object's invlet. * INVORDER_SORT - Use hero's pack order. * SIGNAL_NOMENU - Return -1 rather than 0 if nothing passes "allow". * SIGNAL_CANCEL - Return -2 rather than 0 if player cancels. */ int query_objlist(qstr, olist, qflags, pick_list, how, allow) const char *qstr; /* query string */ struct obj *olist; /* the list to pick from */ int qflags; /* options to control the query */ menu_item **pick_list; /* return list of items picked */ int how; /* type of query */ boolean FDECL((*allow), (OBJ_P));/* allow function */ { int n; winid win; struct obj *curr, *last; char *pack; anything any; boolean printed_type_name; *pick_list = (menu_item *) 0; if (!olist) return 0; /* count the number of items allowed */ for (n = 0, last = 0, curr = olist; curr; curr = FOLLOW(curr, qflags)) if ((*allow)(curr)) { last = curr; n++; } if (n == 0) /* nothing to pick here */ return (qflags & SIGNAL_NOMENU) ? -1 : 0; if (n == 1 && (qflags & AUTOSELECT_SINGLE)) { *pick_list = (menu_item *) alloc(sizeof(menu_item)); (*pick_list)->item.a_obj = last; (*pick_list)->count = last->quan; return 1; } win = create_nhwindow(NHW_MENU); start_menu(win); any.a_obj = (struct obj *) 0; /* * Run through the list and add the objects to the menu. If * INVORDER_SORT is set, we'll run through the list once for * each type so we can group them. The allow function will only * be called once per object in the list. */ pack = flags.inv_order; do { printed_type_name = FALSE; for (curr = olist; curr; curr = FOLLOW(curr, qflags)) { if ((qflags & FEEL_COCKATRICE) && curr->otyp == CORPSE && will_feel_cockatrice(curr, FALSE)) { destroy_nhwindow(win); /* stop the menu and revert */ (void) look_here(0, FALSE); return 0; } if ((!(qflags & INVORDER_SORT) || curr->oclass == *pack) && (*allow)(curr)) { /* if sorting, print type name (once only) */ if (qflags & INVORDER_SORT && !printed_type_name) { any.a_obj = (struct obj *) 0; add_menu(win, NO_GLYPH, &any, 0, 0, iflags.menu_headings, let_to_name(*pack, FALSE), MENU_UNSELECTED); printed_type_name = TRUE; } any.a_obj = curr; add_menu(win, obj_to_glyph(curr), &any, qflags & USE_INVLET ? curr->invlet : 0, def_oc_syms[(int)objects[curr->otyp].oc_class], ATR_NONE, doname(curr), MENU_UNSELECTED); } } pack++; } while (qflags & INVORDER_SORT && *pack); end_menu(win, qstr); n = select_menu(win, how, pick_list); destroy_nhwindow(win); if (n > 0) { menu_item *mi; int i; /* fix up counts: -1 means no count used => pick all */ for (i = 0, mi = *pick_list; i < n; i++, mi++) if (mi->count == -1L || mi->count > mi->item.a_obj->quan) mi->count = mi->item.a_obj->quan; } else if (n < 0) { /* caller's don't expect -1 */ n = (qflags & SIGNAL_CANCEL) ? -2 : 0; } return n; } /* * allow menu-based category (class) selection (for Drop,take off etc.) * */ int query_category(qstr, olist, qflags, pick_list, how) const char *qstr; /* query string */ struct obj *olist; /* the list to pick from */ int qflags; /* behaviour modification flags */ menu_item **pick_list; /* return list of items picked */ int how; /* type of query */ { int n; winid win; struct obj *curr; char *pack; anything any; boolean collected_type_name; 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))) continue; break; } if (curr) { *pick_list = (menu_item *) alloc(sizeof(menu_item)); (*pick_list)->item.a_int = curr->oclass; return 1; } else { #ifdef DEBUG impossible("query_category: no single object match"); #endif } return 0; } win = create_nhwindow(NHW_MENU); start_menu(win); pack = flags.inv_order; if ((qflags & ALL_TYPES) && (ccount > 1)) { invlet = 'a'; any.a_void = 0; any.a_int = ALL_TYPES_SELECTED; add_menu(win, NO_GLYPH, &any, invlet, 0, ATR_NONE, (qflags & WORN_TYPES) ? "All worn types" : "All types", MENU_UNSELECTED); invlet = 'b'; } else invlet = 'a'; do { collected_type_name = FALSE; for (curr = olist; curr; curr = FOLLOW(curr, qflags)) { if (curr->oclass == *pack) { if ((qflags & WORN_TYPES) && !(curr->owornmask & (W_ARMOR | W_RING | W_AMUL | W_TOOL | W_WEP | W_SWAPWEP | W_QUIVER))) continue; if (!collected_type_name) { any.a_void = 0; any.a_int = curr->oclass; add_menu(win, NO_GLYPH, &any, invlet++, def_oc_syms[(int)objects[curr->otyp].oc_class], ATR_NONE, let_to_name(*pack, FALSE), MENU_UNSELECTED); collected_type_name = TRUE; } } } pack++; if (invlet >= 'u') { impossible("query_category: too many categories"); return 0; } } while (*pack); /* unpaid items if there are any */ if (do_unpaid) { invlet = 'u'; any.a_void = 0; any.a_int = 'u'; add_menu(win, NO_GLYPH, &any, invlet, 0, ATR_NONE, "Unpaid items", MENU_UNSELECTED); } /* billed items: checked by caller, so always include if BILLED_TYPES */ if (qflags & BILLED_TYPES) { invlet = 'x'; any.a_void = 0; any.a_int = 'x'; add_menu(win, NO_GLYPH, &any, invlet, 0, ATR_NONE, "Unpaid items already used up", MENU_UNSELECTED); } if (qflags & CHOOSE_ALL) { invlet = 'A'; any.a_void = 0; any.a_int = 'A'; add_menu(win, NO_GLYPH, &any, invlet, 0, ATR_NONE, (qflags & WORN_TYPES) ? "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); if (n < 0) n = 0; /* caller's don't expect -1 */ return n; } STATIC_OVL int count_categories(olist, qflags) struct obj *olist; int qflags; { char *pack; boolean counted_category; int ccount = 0; struct obj *curr; pack = flags.inv_order; do { counted_category = FALSE; for (curr = olist; curr; curr = FOLLOW(curr, qflags)) { if (curr->oclass == *pack) { if ((qflags & WORN_TYPES) && !(curr->owornmask & (W_ARMOR | W_RING | W_AMUL | W_TOOL | W_WEP | W_SWAPWEP | W_QUIVER))) continue; if (!counted_category) { ccount++; counted_category = TRUE; } } } pack++; } while (*pack); return ccount; } /* could we carry `obj'? if not, could we carry some of it/them? */ STATIC_OVL long carry_count(obj, container, count, telekinesis, wt_before, wt_after) struct obj *obj, *container; /* object to pick up, bag it's coming out of */ long count; boolean telekinesis; int *wt_before, *wt_after; { boolean adjust_wt = container && carried(container), is_gold = obj->oclass == COIN_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); } wt = iw + (int)obj->owt; 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; oow = ow; } iw -= oow; qq -= 100L; } 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 * object and calling weight. * * This works for containers only because containers * don't merge. -dean */ for (qq = 1L; qq <= count; qq++) { obj->quan = qq; obj->owt = (unsigned)(ow = weight(obj)); if (adjust_wt) ow -= (container->otyp == BAG_OF_HOLDING) ? (int)DELTA_CWT(container, obj) : (int)obj->owt; if (iw + ow >= 0) break; wt = iw + ow; } --qq; } else { /* there's only one, and we can't lift it */ qq = 0L; } obj->quan = savequan; obj->owt = saveowt; if (qq < count) { /* some message will be given */ Strcpy(obj_nambuf, doname(obj)); if (container) { Sprintf(where, "in %s", the(xname(container))); verb = "carry"; } else { Strcpy(where, "lying here"); verb = telekinesis ? "acquire" : "lift"; } } else { /* lint supppression */ *obj_nambuf = *where = '\0'; verb = ""; } /* we can carry qq of them */ if (qq > 0) { if (qq < count) You("can only %s %s of the %s %s.", verb, (qq == 1L) ? "one" : "some", obj_nambuf, where); *wt_after = wt; return qq; } 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"; } else { prefx1 = (obj->quan == 1L) ? "it " : "even one "; prefx2 = "is too heavy for you to "; suffx = ""; } There("%s %s %s, but %s%s%s%s.", otense(obj, "are"), obj_nambuf, where, prefx1, prefx2, verb, suffx); /* *wt_after = iw; */ return 0L; } /* 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)); return -1; } if (obj->otyp == LOADSTONE || (obj->otyp == BOULDER && throws_rocks(youmonst.data))) return 1; /* lift regardless of current situation */ *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 != COIN_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 { result = 1; prev_encumbr = near_capacity(); if (prev_encumbr < flags.pickup_burden) prev_encumbr = flags.pickup_burden; next_encumbr = calc_capacity(new_wt - old_wt); if (next_encumbr > prev_encumbr) { if (telekinesis) { result = 0; /* don't lift */ } else { char qbuf[BUFSZ]; long savequan = obj->quan; obj->quan = *cnt_p; Strcpy(qbuf, (next_encumbr > HVY_ENCUMBER) ? overloadmsg : (next_encumbr > MOD_ENCUMBER) ? nearloadmsg : moderateloadmsg); Sprintf(eos(qbuf), " %s. Continue?", safe_qbuf(qbuf, sizeof(" . Continue?"), doname(obj), an(simple_typename(obj->otyp)), "something")); obj->quan = savequan; switch (ynq(qbuf)) { case 'q': result = -1; break; case 'n': result = 0; break; default: break; /* 'y' => result == 1 */ } clear_nhwindow(WIN_MESSAGE); } } } if (obj->otyp == SCR_SCARE_MONSTER && result <= 0 && !container) obj->spe = 0; return result; } /* To prevent qbuf overflow in prompts use planA only * if it fits, or planB if PlanA doesn't fit, * finally using the fallback as a last resort. * last_restort is expected to be very short. */ const char * safe_qbuf(qbuf, padlength, planA, planB, last_resort) const char *qbuf, *planA, *planB, *last_resort; unsigned padlength; { /* convert size_t (or int for ancient systems) to ordinary unsigned */ unsigned len_qbuf = (unsigned)strlen(qbuf), len_planA = (unsigned)strlen(planA), len_planB = (unsigned)strlen(planB), len_lastR = (unsigned)strlen(last_resort); unsigned textleft = QBUFSZ - (len_qbuf + padlength); if (len_lastR >= textleft) { impossible("safe_qbuf: last_resort too large at %u characters.", len_lastR); return ""; } return (len_planA < textleft) ? planA : (len_planB < textleft) ? planB : last_resort; } /* * Pick up of obj from the ground and add it to the hero's inventory. * Returns -1 if caller should break out of its loop, 0 if nothing picked * up, 1 if otherwise. */ int pickup_object(obj, count, telekinesis) struct obj *obj; long count; 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?", count, obj->quan); return 0; } /* In case of auto-pickup, where we haven't had a chance to look at it yet; affects docall(SCR_SCARE_MONSTER). */ if (!Blind) #ifdef INVISIBLE_OBJECTS if (!obj->oinvis || See_invisible) #endif obj->dknown = 1; if (obj == uchain) { /* do not pick up attached chain */ return 0; } else if (obj->oartifact && !touch_artifact(obj,&youmonst)) { return 0; #ifndef GOLDOBJ } else if (obj->oclass == COIN_CLASS) { /* Special consideration for gold pieces... */ long iw = (long)max_capacity() - GOLD_WT(u.ugold); long gold_capacity = GOLD_CAPACITY(iw, u.ugold); 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) { You("can only %s %s of the %ld gold pieces lying %s.", telekinesis ? "acquire" : "carry", gold_capacity == 1L ? "one" : "some", obj->quan, where); pline("%s %ld gold piece%s.", nearloadmsg, gold_capacity, plur(gold_capacity)); u.ugold += gold_capacity; obj->quan -= gold_capacity; costly_gold(obj->ox, obj->oy, gold_capacity); } else { u.ugold += count; if ((nearload = near_capacity()) != 0) pline("%s %ld gold piece%s.", nearload < MOD_ENCUMBER ? moderateloadmsg : nearloadmsg, count, plur(count)); else prinv((char *) 0, obj, count); costly_gold(obj->ox, obj->oy, count); if (count == obj->quan) delobj(obj); else obj->quan -= count; } 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); Strcpy(kbuf, an(killer_cxname(obj, TRUE))); instapetrify(kbuf); return -1; } } else if (is_rider(&mons[obj->corpsenm])) { pline("At your %s, the corpse suddenly moves...", telekinesis ? "attempted acquisition" : "touch"); (void) revive_corpse(obj, FALSE); exercise(A_WIS, FALSE); return -1; } } else if (obj->otyp == SCR_SCARE_MONSTER) { 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) && !(objects[SCR_SCARE_MONSTER].oc_uname)) docall(obj); useupf(obj, obj->quan); return 1; /* tried to pick something up and failed, but don't want to terminate pickup loop yet */ } } 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 == COIN_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; } /* * Do the actual work of picking otmp from the floor or monster's interior * and putting it in the hero's inventory. Take care of billing. Return a * 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 (!u.uswallow && 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 (otmp->no_charge) /* only applies to objects outside invent */ otmp->no_charge = 0; if (otmp->was_thrown) /* likewise */ otmp->was_thrown = 0; newsym(otmp->ox, otmp->oy); return addinv(otmp); /* might merge it with other objects */ } /* * prints a message if encumbrance changed since the last check and * returns the new encumbrance value (from near_capacity()). */ int encumber_msg() { static int oldcap = UNENCUMBERED; int newcap = near_capacity(); if(oldcap < newcap) { switch(newcap) { case 1: Your("movements are slowed slightly because of your load."); 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"); break; } flags.botl = 1; } else if(oldcap > newcap) { switch(newcap) { case 0: Your("movements are now unencumbered."); break; case 1: Your("movements are only slowed slightly by your load."); 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; } oldcap = newcap; return (newcap); } /* Is there a container at x,y. Optional: return count of containers at x,y */ STATIC_OVL int container_at(x, y, countem) int x,y; boolean countem; { struct obj *cobj, *nobj; int container_count = 0; for(cobj = level.objects[x][y]; cobj; cobj = nobj) { nobj = cobj->nexthere; if(Is_container(cobj)) { container_count++; if (!countem) break; } } return container_count; } STATIC_OVL boolean able_to_loot(x, y) int x, y; { if (!can_reach_floor()) { #ifdef STEED if (u.usteed && P_SKILL(P_RIDING) < P_BASIC) rider_cant_reach(); /* not skilled enough to reach */ else #endif You("cannot reach the %s.", surface(x, y)); return FALSE; } else if (is_pool(x, y) || is_lava(x, y)) { /* at present, can't loot in water even when Underwater */ You("cannot loot things that are deep in the %s.", is_lava(x, y) ? "lava" : "water"); return FALSE; } else if (nolimbs(youmonst.data)) { pline("Without limbs, you cannot loot anything."); return FALSE; } else if (!freehand()) { pline("Without a free %s, you cannot loot anything.", body_part(HAND)); return FALSE; } return TRUE; } STATIC_OVL boolean mon_beside(x,y) int x, y; { int i,j,nx,ny; for(i = -1; i <= 1; i++) for(j = -1; j <= 1; j++) { nx = x + i; ny = y + j; if(isok(nx, ny) && MON_AT(nx, ny)) return TRUE; } return FALSE; } int doloot() /* loot a container on the floor or loot saddle from mon. */ { struct obj *cobj, *nobj; register int c = -1; int timepassed = 0; coord cc; boolean underfoot = TRUE; const char *dont_find_anything = "don't find anything"; struct monst *mtmp; char qbuf[BUFSZ]; 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; } cc.x = u.ux; cc.y = u.uy; lootcont: if (container_at(cc.x, cc.y, FALSE)) { boolean any = FALSE; if (!able_to_loot(cc.x, cc.y)) return 0; for (cobj = level.objects[cc.x][cc.y]; cobj; cobj = nobj) { nobj = cobj->nexthere; if (Is_container(cobj)) { Sprintf(qbuf, "There is %s here, loot it?", safe_qbuf("", sizeof("There is here, loot it?"), doname(cobj), an(simple_typename(cobj->otyp)), "a container")); c = ynq(qbuf); if (c == 'q') return (timepassed); if (c == 'n') continue; any = TRUE; if (cobj->olocked) { pline("Hmmm, it seems to be locked."); 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; } You("carefully open %s...", the(xname(cobj))); timepassed |= use_container(&cobj, 0); /* might have triggered chest trap or magic bag explosion */ if (multi < 0 || !cobj) return 1; } } if (any) c = 'y'; } 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 == COIN_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; /* find the original coffers chest, or any chest */ for (pass = 2; pass > -1; pass -= 2) for (coffers = fobj; coffers; coffers = coffers->nobj) 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."); } else { dropx(goldob); } } } 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."); } } } else if (IS_GRAVE(levl[cc.x][cc.y].typ)) { You("need to dig up the grave to effectively loot it..."); } /* * 3.3.1 introduced directional looting for some things. */ if (c != 'y' && mon_beside(u.ux, u.uy)) { if (!get_adjacent_loc("Loot in what direction?", "Invalid loot location", u.ux, u.uy, &cc)) return 0; if (cc.x == u.ux && cc.y == u.uy) { underfoot = TRUE; if (container_at(cc.x, cc.y, FALSE)) goto lootcont; } else underfoot = FALSE; if (u.dz < 0) { You("%s to loot on the %s.", dont_find_anything, ceiling(cc.x, cc.y)); timepassed = 1; return timepassed; } mtmp = m_at(cc.x, cc.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(cc.x, cc.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); } if (otmp->cursed) { You("can't. The saddle seems to be stuck to %s.", x_monnam(mtmp, ARTICLE_THE, (char *)0, SUPPRESS_SADDLE, FALSE)); /* the attempt costs you time */ return (1); } obj_extract_self(otmp); if ((unwornmask = otmp->owornmask) != 0L) { mtmp->misc_worn_check &= ~unwornmask; otmp->owornmask = 0L; update_mon_intrinsics(mtmp, otmp, FALSE, FALSE); } 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; } /* * Decide whether an object being placed into a magic bag will cause * it to explode. If the object is a bag itself, check recursively. */ boolean mbag_explodes(obj, depthin) struct obj *obj; int depthin; { /* these won't cause an explosion when they're empty */ if ((obj->otyp == WAN_CANCELLATION || obj->otyp == BAG_OF_TRICKS) && obj->spe <= 0) return FALSE; /* odds: 1/1, 2/2, 3/4, 4/8, 5/16, 6/32, 7/64, 8/128, 9/128, 10/128,... */ if ((Is_mbag(obj) || obj->otyp == WAN_CANCELLATION) && (rn2(1 << (depthin > 7 ? 7 : depthin)) <= depthin)) return TRUE; else if (Has_contents(obj)) { struct obj *otmp; for (otmp = obj->cobj; otmp; otmp = otmp->nobj) if (mbag_explodes(otmp, depthin+1)) return TRUE; } return FALSE; } void destroy_mbag(bomb, silent) struct obj *bomb; boolean silent; { xchar x,y; boolean underwater; struct monst *mtmp = (struct monst *)0; if (get_obj_location(bomb, &x, &y, BURIED_TOO | CONTAINED_TOO)) { switch(bomb->where) { case OBJ_MINVENT: mtmp = bomb->ocarry; if (bomb == MON_WEP(mtmp)) { bomb->owornmask &= ~W_WEP; MON_NOWEP(mtmp); } if (!silent && canseemon(mtmp)) You("see %s engulfed in an explosion!", mon_nam(mtmp)); mtmp->mhp -= d(6,6); if (mtmp->mhp < 1) { if (!bomb->yours) monkilled(mtmp, silent ? "" : "explosion", AD_PHYS); else xkilled(mtmp, !silent); } break; case OBJ_INVENT: /* This shouldn't be silent! */ pline("Something explodes inside your knapsack!"); if (bomb == uwep) { uwepgone(); stop_occupation(); } else if (bomb == uswapwep) { uswapwepgone(); stop_occupation(); } else if (bomb == uquiver) { uqwepgone(); stop_occupation(); } losehp(d(6,6), "carrying live explosives", KILLED_BY); break; case OBJ_FLOOR: underwater = is_pool(x, y); if (!silent) { if (x == u.ux && y == u.uy) { if (underwater && (Flying || Levitation)) pline_The("water boils beneath you."); else if (underwater && Wwalking) pline_The("water erupts around you."); else pline("A bag explodes under your %s!", makeplural(body_part(FOOT))); } else if (cansee(x, y)) You(underwater ? "see a plume of water shoot up." : "see a bag explode."); } if (underwater && (Flying || Levitation || Wwalking)) { if (Wwalking && x == u.ux && y == u.uy) { struct trap trap; trap.ntrap = NULL; trap.tx = x; trap.ty = y; trap.launch.x = -1; trap.launch.y = -1; trap.ttyp = RUST_TRAP; trap.tseen = 0; trap.once = 0; trap.madeby_u = 0; trap.dst.dnum = -1; trap.dst.dlevel = -1; dotrap(&trap, 0); } goto free_bomb; } break; default: /* Buried, contained, etc. */ if (!silent) You_hear("a muffled explosion."); goto free_bomb; break; } } free_bomb: if (Has_contents(bomb)) delete_contents(bomb); obj_extract_self(bomb); obfree(bomb, (struct obj *)0); newsym(x,y); } /* Returns: -1 to stop, 1 item was inserted, 0 item was not inserted. */ STATIC_PTR int in_container(obj) register struct obj *obj; { boolean floor_container = !carried(current_container); boolean was_unpaid = FALSE; char buf[BUFSZ]; if (!current_container) { impossible(" no current_container?"); return 0; } else if (obj == uball || obj == uchain) { You("must be kidding."); return 0; } else if (obj == current_container) { pline("That would be an interesting topological exercise."); return 0; } else if (obj->owornmask & (W_ARMOR | W_RING | W_AMUL | W_TOOL)) { Norep("You cannot %s %s you are wearing.", Icebox ? "refrigerate" : "stash", something); return 0; } else if ((obj->otyp == LOADSTONE) && obj->cursed) { obj->bknown = 1; pline_The("stone%s won't leave your person.", plur(obj->quan)); return 0; } else if (obj->otyp == AMULET_OF_YENDOR || obj->otyp == CANDELABRUM_OF_INVOCATION || obj->otyp == BELL_OF_OPENING || obj->otyp == SPE_BOOK_OF_THE_DEAD) { /* Prohibit Amulets in containers; if you allow it, monsters can't * steal them. It also becomes a pain to check to see if someone * has the Amulet. Ditto for the Candelabrum, the Bell and the Book. */ 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)) { weldmsg(obj); return 0; } setuwep((struct obj *) 0, FALSE); if (uwep) return 0; /* unwielded, died, rewielded */ } else if (obj == uswapwep) { setuswapwep((struct obj *) 0, FALSE); if (uswapwep) return 0; /* unwielded, died, rewielded */ } else if (obj == uquiver) { setuqwep((struct obj *) 0); 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); Strcpy(kbuf, an(killer_cxname(obj, TRUE))); 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]))) { /* * xname() uses a static result array. Save obj's name * before current_container's name is computed. Don't * use the result of strcpy() within You() --- the order * of evaluation of the parameters is undefined. */ Strcpy(buf, the(xname(obj))); You("cannot fit %s into %s.", buf, the(xname(current_container))); return 0; } 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)) { if (current_container->no_charge && !obj->unpaid) { /* don't sell when putting the item into your own container */ obj->no_charge = 1; } else if (obj->oclass != COIN_CLASS) { /* sellobj() will take an unpaid item off the shop bill * note: coins are handled later */ was_unpaid = obj->unpaid ? TRUE : FALSE; sellobj_state(SELL_DELIBERATE); sellobj(obj, u.ux, u.uy); sellobj_state(SELL_NORMAL); } } if (Icebox && !age_is_relative(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(MOLDY_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)) { /* explicitly mention what item is triggering the explosion */ pline( "As you put %s inside, you are blasted by a magical explosion!", doname(obj)); if (Has_contents(obj)) { struct obj *otmp; while((otmp = container_extract_indestructable(obj))) if (!flooreffects(otmp, u.ux, u.uy, "fall")) place_object(otmp, u.ux, u.uy); } /* did not actually insert obj yet */ if (was_unpaid) addtobill(obj, FALSE, FALSE, TRUE); if (Has_contents(obj)) delete_contents(obj); obfree(obj, (struct obj *)0); delete_contents(current_container); if (!floor_container) useup(current_container); else if (obj_here(current_container, u.ux, u.uy)) useupf(current_container, current_container->quan); else panic("in_container: bag not found."); losehp(d(6,6),"magical explosion", KILLED_BY_AN); current_container = 0; /* baggone = TRUE; */ } if (current_container) { Strcpy(buf, the(xname(current_container))); You("put %s into %s.", doname(obj), buf); /* gold in container always needs to be added to credit */ if (floor_container && obj->oclass == COIN_CLASS) sellobj(obj, current_container->ox, current_container->oy); (void) add_to_container(current_container, obj); current_container->owt = weight(current_container); } /* gold needs this, and freeinv() many lines above may cause * the encumbrance to disappear from the status, so just always * update status immediately. */ bot(); return(current_container ? 1 : -1); } STATIC_PTR int ck_bag(obj) struct obj *obj; { return current_container && obj != current_container; } /* Returns: -1 to stop, 1 item was removed, 0 item was not removed. */ STATIC_PTR int out_container(obj) register struct obj *obj; { register struct obj *otmp; boolean is_gold = (obj->oclass == COIN_CLASS); int res, loadlev; long count; if (!current_container) { impossible(" no current_container?"); return -1; } else if (is_gold) { obj->owt = weight(obj); } 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); Strcpy(kbuf, an(killer_cxname(obj, TRUE))); 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); current_container->owt = weight(current_container); if (Icebox && !age_is_relative(obj)) { obj->age = monstermoves - obj->age; /* actual age */ if (obj->otyp == CORPSE) start_corpse_timeout(obj); } /* simulated point of time */ if(!obj->unpaid && !carried(current_container) && costly_spot(current_container->ox, current_container->oy)) { obj->ox = current_container->ox; obj->oy = current_container->oy; addtobill(obj, FALSE, FALSE, FALSE); } if (is_pick(obj) && !obj->unpaid && *u.ushops && shop_keeper(*u.ushops)) verbalize("You sneaky cad! Get out of here with that pick!"); otmp = addinv(obj); loadlev = near_capacity(); prinv(loadlev ? (loadlev < MOD_ENCUMBER ? "You have a little trouble removing" : "You have much trouble removing") : (char *)0, otmp, count); if (is_gold) { #ifndef GOLDOBJ dealloc_obj(obj); #endif bot(); /* update character's gold piece count immediately */ } return 1; } /* an object inside a cursed bag of holding is being destroyed */ STATIC_OVL long mbag_item_gone(held, item) int held; struct obj *item; { struct monst *shkp; long loss = 0L; if (item->dknown) pline("%s %s vanished!", Doname2(item), otense(item, "have")); else You("%s %s disappear!", Blind ? "notice" : "see", doname(item)); if (*u.ushops && (shkp = shop_keeper(*u.ushops)) != 0) { if (held ? (boolean) item->unpaid : costly_spot(u.ux, u.uy)) loss = stolen_value(item, u.ux, u.uy, (boolean)shkp->mpeaceful, TRUE, TRUE); } /* [ALI] In Slash'EM we must delete the contents of containers before * we call obj_extract_self() so that any indestructable items can * migrate into the bag of holding. We are also constrained by the * need to wait until after we have calculated any loss. */ if (Has_contents(item)) delete_contents(item); obj_extract_self(item); obfree(item, (struct obj *) 0); return loss; } STATIC_OVL void observe_quantum_cat(box) struct obj *box; { static NEARDATA const char sc[] = "Schroedinger's Cat"; struct obj *deadcat; struct monst *livecat; xchar ox, oy; box->spe = 0; /* box->owt will be updated below */ if (get_obj_location(box, &ox, &oy, 0)) box->ox = ox, box->oy = oy; /* in case it's being carried */ /* this isn't really right, since any form of observation (telepathic or monster/object/food detection) ought to force the determination of alive vs dead state; but basing it just on opening the box is much simpler to cope with */ livecat = rn2(2) ? makemon(&mons[PM_HOUSECAT], box->ox, box->oy, NO_MINVENT) : 0; if (livecat) { livecat->mpeaceful = 1; set_malign(livecat); if (!canspotmon(livecat)) You("think %s brushed your %s.", something, body_part(FOOT)); else pline("%s inside the box is still alive!", Monnam(livecat)); (void) christen_monst(livecat, sc); } else { deadcat = mk_named_object(CORPSE, &mons[PM_HOUSECAT], box->ox, box->oy, sc); if (deadcat) { obj_extract_self(deadcat); (void) add_to_container(box, deadcat); } pline_The("%s inside the box is dead!", Hallucination ? rndmonnam() : "housecat"); } box->owt = weight(box); return; } #undef Icebox /* used by askchain() to check for magic bag explosion */ boolean container_gone(fn) int FDECL((*fn), (OBJ_P)); { /* result is only meaningful while use_container() is executing */ return ((fn == in_container || fn == out_container) && !current_container); } int use_container(objp, held) struct obj **objp; int held; { struct obj *curr, *otmp, *obj = *objp; #ifndef GOLDOBJ struct obj *u_gold = (struct obj *)0; #endif struct monst *shkp; boolean one_by_one, allflag, quantum_cat = FALSE, loot_out = FALSE, loot_in = FALSE; char select[MAXOCLASSES+1]; char qbuf[BUFSZ], emptymsg[BUFSZ], pbuf[QBUFSZ]; long loss = 0L; int cnt = 0, used = 0, lcnt = 0, menu_on_request; emptymsg[0] = '\0'; if (nohands(youmonst.data)) { You("have no hands!"); /* not `body_part(HAND)' */ return 0; } else if (!freehand()) { You("have no free %s.", body_part(HAND)); return 0; } 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) { if (held) You("open %s...", the(xname(obj))); (void) chest_trap(obj, HAND, FALSE); /* even if the trap fails, you've used up this turn */ if (multi >= 0) { /* in case we didn't become paralyzed */ nomul(-1); nomovemsg = ""; } return 1; } current_container = obj; /* for use by in/out_container */ /* from here on out, all early returns go through containerdone */ if (obj->spe == 1) { observe_quantum_cat(obj); used = 1; quantum_cat = TRUE; /* for adjusting "it's empty" message */ } /* [ALI] If a container vanishes which contains indestructible * objects then these will be added to the magic bag. This makes * it very hard to combine the count and vanish loops so we do * them seperately. */ /* Sometimes toss objects if a cursed magic bag. */ if (Is_mbag(obj) && obj->cursed) { for (curr = obj->cobj; curr; curr = otmp) { otmp = curr->nobj; if (!rn2(13) && !evades_destruction(curr)) { loss += mbag_item_gone(held, curr); used = 1; } } } /* Count the number of contained objects. */ for (curr = obj->cobj; curr; curr = curr->nobj) cnt++; if (loss) /* magic bag lost some shop goods */ You("owe %ld %s for lost merchandise.", loss, currency(loss)); obj->owt = weight(obj); /* in case any items were lost */ if (!cnt) Sprintf(emptymsg, "%s is %sempty.", Yname2(obj), quantum_cat ? "now " : ""); if (current_container->otyp == MEDICAL_KIT) { if (!cnt) pline("%s", emptymsg); else (void) display_cinventory(current_container); return 0; } if (cnt || flags.menu_style == MENU_FULL) { Strcpy(qbuf, "Do you want to take something out of "); Sprintf(eos(qbuf), "%s?", safe_qbuf(qbuf, 1, yname(obj), ysimple_name(obj), "it")); if (flags.menu_style != MENU_TRADITIONAL) { if (flags.menu_style == MENU_FULL) { int t; char menuprompt[BUFSZ]; boolean outokay = (cnt != 0), inokay = (invent != 0); #ifndef GOLDOBJ if (u.ugold) inokay = TRUE; #endif if (!outokay && !inokay) { pline("%s", emptymsg); You("don't have anything to put in."); goto containerdone; } menuprompt[0] = '\0'; if (!cnt) Sprintf(menuprompt, "%s ", emptymsg); Strcat(menuprompt, "Do what?"); t = in_or_out_menu(menuprompt, current_container, outokay, inokay); if (t <= 0) { used = 0; goto containerdone; } loot_out = (t & 0x01) != 0; loot_in = (t & 0x02) != 0; } else { /* MENU_COMBINATION or MENU_PARTIAL */ loot_out = (yn_function(qbuf, "ynq", 'n') == 'y'); } if (loot_out) { add_valid_menu_class(0); /* reset */ used |= menu_loot(0, current_container, FALSE) > 0; } } else { /* traditional code */ ask_again2: menu_on_request = 0; add_valid_menu_class(0); /* reset */ Strcpy(pbuf, ":ynq"); if (cnt) Strcat(pbuf, "m"); switch (yn_function(qbuf, pbuf, 'n')) { case ':': container_contents(current_container, FALSE, FALSE); goto ask_again2; 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, (int FDECL((*),(OBJ_P)))0, 0, "nodot")) used = 1; } else if (menu_on_request < 0) { used |= menu_loot(menu_on_request, current_container, FALSE) > 0; } /*FALLTHRU*/ case 'n': break; case 'm': menu_on_request = -2; /* triggers ALL_CLASSES */ used |= menu_loot(menu_on_request, current_container, FALSE) > 0; break; case 'q': default: goto containerdone; } } } else { pline("%s", emptymsg); /* is empty. */ } #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."); goto containerdone; } if (flags.menu_style != MENU_FULL) { Sprintf(qbuf, "Do you wish to put %s in?", something); Strcpy(pbuf, ynqchars); if (flags.menu_style == MENU_TRADITIONAL && invent && inv_cnt() > 0) Strcat(pbuf, "m"); switch (yn_function(qbuf, pbuf, 'n')) { case 'y': loot_in = TRUE; break; case 'n': break; case 'm': add_valid_menu_class(0); /* reset */ menu_on_request = -2; /* triggers ALL_CLASSES */ used |= menu_loot(menu_on_request, current_container, TRUE) > 0; break; case 'q': default: goto containerdone; } } /* * Gone: being nice about only selecting food if we know we are * 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 * and put it at the head of the inventory list. */ u_gold = mkgoldobj(u.ugold); /* removes from u.ugold */ u_gold->in_use = TRUE; u.ugold = u_gold->quan; /* put the gold back */ assigninvlet(u_gold); /* might end up as NOINVSYM */ 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; } else { /* 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, in_container, ck_bag, 0, "nodot"); used = 1; } else if (menu_on_request < 0) { used |= menu_loot(menu_on_request, current_container, TRUE) > 0; } } } #ifndef GOLDOBJ if (u_gold && invent && invent->oclass == COIN_CLASS) { /* didn't stash [all of] it */ u_gold = invent; invent = u_gold->nobj; u_gold->in_use = FALSE; dealloc_obj(u_gold); } #endif containerdone: *objp = current_container; /* might have become null */ current_container = 0; /* avoid hanging on to stale pointer */ return used; } /* Loot a container (take things out, put things in), using a menu. */ STATIC_OVL int menu_loot(retry, container, put_in) int retry; struct obj *container; boolean put_in; { int n, i, n_looted = 0; boolean all_categories = TRUE, loot_everything = FALSE; char buf[BUFSZ]; const char *takeout = "Take out", *putin = "Put in"; struct obj *otmp, *otmp2; menu_item *pick_list; int mflags, res; long count; if (retry) { all_categories = (retry == -2); } 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; for (i = 0; i < n; i++) { if (pick_list[i].item.a_int == 'A') loot_everything = TRUE; else if (pick_list[i].item.a_int == ALL_TYPES_SELECTED) all_categories = TRUE; else add_valid_menu_class(pick_list[i].item.a_int); } free((genericptr_t) pick_list); } if (loot_everything) { for (otmp = container->cobj; otmp; otmp = otmp2) { otmp2 = otmp->nobj; res = out_container(otmp); if (res < 0) break; } } else { mflags = INVORDER_SORT; if (put_in && flags.invlet_constant) mflags |= USE_INVLET; Sprintf(buf,"%s what?", put_in ? putin : takeout); n = query_objlist(buf, put_in ? invent : container->cobj, mflags, &pick_list, PICK_ANY, all_categories ? allow_all : allow_category); if (n) { n_looted = n; for (i = 0; i < n; i++) { 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) { if (!current_container) { /* otmp caused current_container to explode; both are now gone */ otmp = 0; /* and break loop */ } else if (otmp && otmp != pick_list[i].item.a_obj) { /* split occurred, merge again */ (void) merged(&pick_list[i].item.a_obj, &otmp); } break; } } free((genericptr_t)pick_list); } } return n_looted; } STATIC_OVL int in_or_out_menu(prompt, obj, outokay, inokay) const char *prompt; struct obj *obj; boolean outokay, inokay; { winid win; anything any; menu_item *pick_list; char buf[BUFSZ]; int n; const char *menuselector = iflags.lootabc ? "abc" : "oib"; any.a_void = 0; win = create_nhwindow(NHW_MENU); start_menu(win); if (outokay) { any.a_int = 1; Sprintf(buf,"Take %s out of %s", something, the(xname(obj))); add_menu(win, NO_GLYPH, &any, *menuselector, 0, ATR_NONE, buf, MENU_UNSELECTED); } menuselector++; if (inokay) { any.a_int = 2; Sprintf(buf,"Put %s into %s", something, the(xname(obj))); add_menu(win, NO_GLYPH, &any, *menuselector, 0, ATR_NONE, buf, MENU_UNSELECTED); } menuselector++; if (outokay && inokay) { any.a_int = 3; add_menu(win, NO_GLYPH, &any, *menuselector, 0, ATR_NONE, "Both of the above", MENU_UNSELECTED); } end_menu(win, prompt); n = select_menu(win, PICK_ONE, &pick_list); destroy_nhwindow(win); if (n > 0) { n = pick_list[0].item.a_int; free((genericptr_t) pick_list); } return n; } /*pickup.c*/ slashem-0.0.7E7F3/src/lock.c0000664000076400007640000007675110545462317013557 0ustar aliali/* 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. */ #include "hack.h" STATIC_PTR int NDECL(picklock); STATIC_PTR int NDECL(forcelock); STATIC_PTR int NDECL(forcedoor); /* at most one of `door' and `box' should be non-null at any given time */ STATIC_VAR NEARDATA struct xlock_s { struct rm *door; struct obj *box; int picktyp, chance, usedtime; /* ALI - Artifact doors */ int key; /* Key being used (doors only) */ } xlock; #ifdef OVLB STATIC_DCL const char *NDECL(lock_action); STATIC_DCL boolean FDECL(obstructed,(int,int)); STATIC_DCL void FDECL(chest_shatter_msg, (struct obj *)); boolean picking_lock(x, y) int *x, *y; { if (occupation == picklock || occupation == forcedoor) { *x = u.ux + u.dx; *y = u.uy + u.dy; return TRUE; } else { *x = *y = 0; return FALSE; } } boolean picking_at(x, y) int x, y; { return (boolean)(occupation == picklock && xlock.door == &levl[x][y]); } /* produce an occupation string appropriate for the current activity */ STATIC_OVL const char * lock_action() { /* "unlocking"+2 == "locking" */ static const char *actions[] = { /* [0] */ "unlocking the door", /* [1] */ "unlocking the chest", /* [2] */ "unlocking the box", /* [3] */ "picking the lock" }; /* if the target is currently unlocked, we're trying to lock it now */ if (xlock.door && !(xlock.door->doormask & D_LOCKED)) return actions[0]+2; /* "locking the door" */ else if (xlock.box && !xlock.box->olocked) return xlock.box->otyp == CHEST ? actions[1]+2 : actions[2]+2; /* otherwise we're trying to unlock it */ else if (xlock.picktyp == LOCK_PICK) return actions[3]; /* "picking the lock" */ #ifdef TOURIST else if (xlock.picktyp == CREDIT_CARD) return actions[3]; /* same as lock_pick */ #endif else if (xlock.door) return actions[0]; /* "unlocking the door" */ else return xlock.box->otyp == CHEST ? actions[1] : actions[2]; } STATIC_PTR int picklock() /* try to open/close a lock */ { if (xlock.box) { if((xlock.box->ox != u.ux) || (xlock.box->oy != u.uy)) { return((xlock.usedtime = 0)); /* you or it moved */ } } else { /* door */ if(xlock.door != &(levl[u.ux+u.dx][u.uy+u.dy])) { return((xlock.usedtime = 0)); /* you moved */ } switch (xlock.door->doormask) { case D_NODOOR: pline("This doorway has no door."); return((xlock.usedtime = 0)); case D_ISOPEN: You("cannot lock an open door."); return((xlock.usedtime = 0)); case D_BROKEN: pline("This door is broken."); return((xlock.usedtime = 0)); } } if (xlock.usedtime++ >= 50 || nohands(youmonst.data)) { You("give up your attempt at %s.", lock_action()); exercise(A_DEX, TRUE); /* even if you don't succeed */ return((xlock.usedtime = 0)); } if(rn2(100) >= xlock.chance) return(1); /* still busy */ You("succeed in %s.", lock_action()); if (xlock.door) { if(xlock.door->doormask & D_TRAPPED) { b_trapped("door", FINGER); xlock.door->doormask = D_NODOOR; unblock_point(u.ux+u.dx, u.uy+u.dy); if (*in_rooms(u.ux+u.dx, u.uy+u.dy, SHOPBASE)) add_damage(u.ux+u.dx, u.uy+u.dy, 0L); newsym(u.ux+u.dx, u.uy+u.dy); } else if(xlock.door->doormask == D_LOCKED) xlock.door->doormask = D_CLOSED; else xlock.door->doormask = D_LOCKED; } else { xlock.box->olocked = !xlock.box->olocked; if(xlock.box->otrapped) (void) chest_trap(xlock.box, FINGER, FALSE); } exercise(A_DEX, TRUE); return((xlock.usedtime = 0)); } STATIC_PTR int forcelock() /* try to force a locked chest */ { register struct obj *otmp; if((xlock.box->ox != u.ux) || (xlock.box->oy != u.uy)) return((xlock.usedtime = 0)); /* you or it moved */ if (xlock.usedtime++ >= 50 || !uwep || nohands(youmonst.data)) { You("give up your attempt to force the lock."); if(xlock.usedtime >= 50) /* you made the effort */ exercise((xlock.picktyp) ? A_DEX : A_STR, TRUE); return((xlock.usedtime = 0)); } if(xlock.picktyp == 1) { /* blade */ if(rn2(1000-(int)uwep->spe) > (992-greatest_erosion(uwep)*10) && !uwep->cursed && !obj_resists(uwep, 0, 99)) { /* for a +0 weapon, probability that it survives an unsuccessful * attempt to force the lock is (.992)^50 = .67 */ pline("%sour %s broke!", (uwep->quan > 1L) ? "One of y" : "Y", xname(uwep)); useup(uwep); You("give up your attempt to force the lock."); exercise(A_DEX, TRUE); return((xlock.usedtime = 0)); } } else if(xlock.picktyp == 0) /* 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; xlock.box->obroken = 1; if((xlock.picktyp == 0 && !rn2(3)) || (xlock.picktyp == 2 && !rn2(5))) { struct monst *shkp; boolean costly; long loss = 0L; costly = (*u.ushops && costly_spot(u.ux, u.uy)); shkp = costly ? shop_keeper(*u.ushops) : 0; pline("In fact, you've totally destroyed %s.", the(xname(xlock.box))); /* Put the contents on ground at the hero's feet. */ while ((otmp = xlock.box->cobj) != 0) { obj_extract_self(otmp); /* [ALI] Allowing containers to be destroyed is complicated * (because they might contain indestructible objects). * Since this is very unlikely to occur in practice simply * avoid the possibility. */ if (!evades_destruction(otmp) && !Has_contents(otmp) && (!rn2(3) || otmp->oclass == POTION_CLASS)) { chest_shatter_msg(otmp); if (costly) loss += stolen_value(otmp, u.ux, u.uy, (boolean)shkp->mpeaceful, TRUE, TRUE); if (otmp->quan == 1L) { obfree(otmp, (struct obj *) 0); continue; } useup(otmp); } if (xlock.box->otyp == ICE_BOX && otmp->otyp == CORPSE) { otmp->age = monstermoves - otmp->age; /* actual age */ start_corpse_timeout(otmp); } place_object(otmp, u.ux, u.uy); stackobj(otmp); } if (costly) loss += stolen_value(xlock.box, u.ux, u.uy, (boolean)shkp->mpeaceful, TRUE, TRUE); if(loss) You("owe %ld %s for objects destroyed.", loss, currency(loss)); delobj(xlock.box); } exercise((xlock.picktyp) ? A_DEX : A_STR, TRUE); return((xlock.usedtime = 0)); } STATIC_PTR int forcedoor() /* try to break/pry open a door */ { if(xlock.door != &(levl[u.ux+u.dx][u.uy+u.dy])) { return((xlock.usedtime = 0)); /* you moved */ } switch (xlock.door->doormask) { case D_NODOOR: pline("This doorway has no door."); return((xlock.usedtime = 0)); case D_ISOPEN: You("cannot lock an open door."); return((xlock.usedtime = 0)); case D_BROKEN: pline("This door is broken."); return((xlock.usedtime = 0)); } if (xlock.usedtime++ >= 50 || nohands(youmonst.data)) { You("give up your attempt at %s the door.", (xlock.picktyp == 2 ? "melting" : xlock.picktyp == 1 ? "prying open" : "breaking down")); exercise(A_STR, TRUE); /* even if you don't succeed */ return((xlock.usedtime = 0)); } if(rn2(100) > xlock.chance) return(1); /* still busy */ You("succeed in %s the door.", (xlock.picktyp == 2 ? "melting" : xlock.picktyp == 1 ? "prying open" : "breaking down")); if(xlock.door->doormask & D_TRAPPED) { b_trapped("door", 0); xlock.door->doormask = D_NODOOR; } else if (xlock.picktyp == 1) xlock.door->doormask = D_BROKEN; else xlock.door->doormask = D_NODOOR; unblock_point(u.ux+u.dx, u.uy+u.dy); if (*in_rooms(u.ux+u.dx, u.uy+u.dy, SHOPBASE)) { add_damage(u.ux+u.dx, u.uy+u.dy, 400L); pay_for_damage("break", FALSE); if (in_town(u.ux+u.dx, u.uy+u.dy)) { struct monst *mtmp; for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) { if (DEADMONSTER(mtmp)) continue; if((mtmp->data == &mons[PM_WATCHMAN] || 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; } } } } if (Blind) feel_location(u.ux+u.dx, u.uy+u.dy); /* we know we broke it */ else newsym(u.ux+u.dx, u.uy+u.dy); exercise(A_STR, TRUE); return((xlock.usedtime = 0)); } #endif /* OVLB */ #ifdef OVL0 void reset_pick() { xlock.usedtime = xlock.chance = xlock.picktyp = 0; xlock.door = 0; xlock.box = 0; } #endif /* OVL0 */ #ifdef OVLB int pick_lock(pickp) /* pick a lock with a given object */ struct obj **pickp; { int picktyp, c, ch; coord cc; int key; struct rm *door; struct obj *otmp; struct obj *pick = *pickp; char qbuf[QBUFSZ]; picktyp = pick->otyp; /* check whether we're resuming an interrupted previous attempt */ if (xlock.usedtime && picktyp == xlock.picktyp) { static char no_longer[] = "Unfortunately, you can no longer %s %s."; if (nohands(youmonst.data)) { const char *what = (picktyp == LOCK_PICK) ? "pick" : "key"; #ifdef TOURIST if (picktyp == CREDIT_CARD) what = "card"; #endif pline(no_longer, "hold the", what); reset_pick(); return 0; } else if (xlock.box && !can_reach_floor()) { pline(no_longer, "reach the", "lock"); reset_pick(); return 0; } else if (!xlock.door || xlock.key == pick->oartifact) { const char *action = lock_action(); You("resume your attempt at %s.", action); set_occupation(picklock, action, 0); return(1); } } if(nohands(youmonst.data)) { You_cant("hold %s -- you have no hands!", doname(pick)); return(0); } if((picktyp != LOCK_PICK && #ifdef TOURIST picktyp != CREDIT_CARD && #endif picktyp != SKELETON_KEY)) { impossible("picking lock with object %d?", picktyp); return(0); } ch = 0; /* lint suppression */ if(!get_adjacent_loc((char *)0, "Invalid location!", u.ux, u.uy, &cc)) return 0; if (cc.x == u.ux && cc.y == u.uy) { /* pick lock on a container */ const char *verb; boolean it; int count; if (u.dz < 0) { There("isn't any sort of lock up %s.", Levitation ? "here" : "there"); return 0; } else if (is_lava(u.ux, u.uy)) { pline("Doing that would probably melt your %s.", xname(pick)); return 0; } else if (is_pool(u.ux, u.uy) && !Underwater) { pline_The("water has no lock."); return 0; } count = 0; c = 'n'; /* in case there are no boxes here */ for(otmp = level.objects[cc.x][cc.y]; otmp; otmp = otmp->nexthere) if (Is_box(otmp)) { ++count; if (!can_reach_floor()) { You_cant("reach %s from up here.", the(xname(otmp))); return 0; } it = 0; if (otmp->obroken) verb = "fix"; else if (!otmp->olocked) verb = "lock", it = 1; else if (picktyp != LOCK_PICK) verb = "unlock", it = 1; else verb = "pick"; Sprintf(qbuf, "There is %s here, %s %s?", safe_qbuf("", sizeof("There is here, unlock its lock?"), doname(otmp), an(simple_typename(otmp->otyp)), "a box"), verb, it ? "it" : "its lock"); c = ynq(qbuf); if(c == 'q') return(0); if(c == 'n') continue; if (otmp->obroken) { You_cant("fix its broken lock with %s.", doname(pick)); return 0; } #ifdef TOURIST else if (picktyp == CREDIT_CARD && !otmp->olocked) { /* credit cards are only good for unlocking */ You_cant("do that with %s.", doname(pick)); return 0; } #endif switch(picktyp) { #ifdef TOURIST case CREDIT_CARD: if(!rn2(20) && !pick->blessed && !pick->oartifact) { Your("credit card breaks in half!"); useup(pick); *pickp = (struct obj *)0; return(1); } ch = ACURR(A_DEX) + 20*Role_if(PM_ROGUE); break; #endif case LOCK_PICK: if(!rn2(Role_if(PM_ROGUE) ? 40 : 30) && !pick->blessed && !pick->oartifact) { You("break your pick!"); useup(pick); *pickp = (struct obj *)0; return(1); } ch = 4*ACURR(A_DEX) + 25*Role_if(PM_ROGUE); break; case SKELETON_KEY: if(!rn2(15) && !pick->blessed && !pick->oartifact) { Your("key didn't quite fit the lock and snapped!"); useup(pick); *pickp = (struct obj *)0; return(1); } ch = 75 + ACURR(A_DEX); break; default: ch = 0; } if(otmp->cursed) ch /= 2; xlock.picktyp = picktyp; xlock.box = otmp; xlock.door = 0; break; } if (c != 'y') { if (!count) There("doesn't seem to be any sort of lock here."); return(0); /* decided against all boxes */ } } else { /* pick the lock in a door */ struct monst *mtmp; if (u.utrap && u.utraptype == TT_PIT) { You_cant("reach over the edge of the pit."); return(0); } door = &levl[cc.x][cc.y]; if ((mtmp = m_at(cc.x, cc.y)) && canseemon(mtmp) && mtmp->m_ap_type != M_AP_FURNITURE && mtmp->m_ap_type != M_AP_OBJECT) { #ifdef TOURIST if (picktyp == CREDIT_CARD && (mtmp->isshk || mtmp->data == &mons[PM_ORACLE])) verbalize("No checks, no credit, no problem."); else #endif pline("I don't think %s would appreciate that.", mon_nam(mtmp)); return(0); } if(!IS_DOOR(door->typ)) { if (is_drawbridge_wall(cc.x,cc.y) >= 0) You("%s no lock on the drawbridge.", Blind ? "feel" : "see"); else You("%s no door there.", Blind ? "feel" : "see"); return(0); } switch (door->doormask) { case D_NODOOR: pline("This doorway has no door."); return(0); case D_ISOPEN: You("cannot lock an open door."); return(0); case D_BROKEN: pline("This door is broken."); return(0); default: #ifdef TOURIST /* credit cards are only good for unlocking */ if(picktyp == CREDIT_CARD && !(door->doormask & D_LOCKED)) { You_cant("lock a door with a credit card."); return(0); } #endif /* ALI - Artifact doors */ key = artifact_door(cc.x, cc.y); Sprintf(qbuf,"%sock it?", (door->doormask & D_LOCKED) ? "Unl" : "L" ); c = yn(qbuf); if(c == 'n') return(0); switch(picktyp) { #ifdef TOURIST case CREDIT_CARD: if(!rn2(Role_if(PM_TOURIST) ? 30 : 20) && !pick->blessed && !pick->oartifact) { You("break your card off in the door!"); useup(pick); *pickp = (struct obj *)0; return(0); } ch = 2*ACURR(A_DEX) + 20*Role_if(PM_ROGUE); break; #endif case LOCK_PICK: if(!rn2(Role_if(PM_ROGUE) ? 40 : 30) && !pick->blessed && !pick->oartifact) { You("break your pick!"); useup(pick); *pickp = (struct obj *)0; return(0); } ch = 3*ACURR(A_DEX) + 30*Role_if(PM_ROGUE); break; case SKELETON_KEY: if(!rn2(15) && !pick->blessed && !pick->oartifact) { Your("key wasn't designed for this door and broke!"); useup(pick); *pickp = (struct obj *)0; return(0); } ch = 70 + ACURR(A_DEX); break; default: ch = 0; } xlock.door = door; xlock.box = 0; /* ALI - Artifact doors */ xlock.key = pick->oartifact; if (key && xlock.key != key) { if (picktyp == SKELETON_KEY) { Your("key doesn't seem to fit."); return(0); } else ch = -1; /* -1 == 0% chance */ } } } flags.move = 0; xlock.chance = ch; xlock.picktyp = picktyp; xlock.usedtime = 0; set_occupation(picklock, lock_action(), 0); return(1); } int doforce() /* try to force a chest with your weapon */ { register struct obj *otmp; register int x, y, c, picktyp; struct rm *door; char qbuf[QBUFSZ]; if (!uwep) { /* Might want to make this so you use your shoulder */ You_cant("force anything without a weapon."); return(0); } if (u.utrap && u.utraptype == TT_WEB) { You("are entangled in a web!"); return(0); #ifdef LIGHTSABERS } else if (uwep && is_lightsaber(uwep)) { if (!uwep->lamplit) { Your("lightsaber is deactivated!"); return(0); } #endif } else if(uwep->otyp == LOCK_PICK || #ifdef TOURIST uwep->otyp == CREDIT_CARD || #endif uwep->otyp == SKELETON_KEY) { return pick_lock(&uwep); /* not a lightsaber or lockpicking device*/ } else if(!uwep || /* proper type test */ (uwep->oclass != WEAPON_CLASS && !is_weptool(uwep) && uwep->oclass != ROCK_CLASS) || (objects[uwep->otyp].oc_skill < P_DAGGER) || (objects[uwep->otyp].oc_skill > P_LANCE) || uwep->otyp == FLAIL || uwep->otyp == AKLYS #ifdef KOPS || uwep->otyp == RUBBER_HOSE #endif ) { You_cant("force anything without a %sweapon.", (uwep) ? "proper " : ""); return(0); } #ifdef LIGHTSABERS if (is_lightsaber(uwep)) picktyp = 2; else #endif picktyp = is_blade(uwep) ? 1 : 0; if(xlock.usedtime && picktyp == xlock.picktyp) { if (xlock.box) { if (!can_reach_floor()) { pline("Unfortunately, you can no longer reach the lock."); return 0; } You("resume your attempt to force the lock."); set_occupation(forcelock, "forcing the lock", 0); return(1); } else if (xlock.door) { You("resume your attempt to force the door."); set_occupation(forcedoor, "forcing the door", 0); return(1); } } /* A lock is made only for the honest man, the thief will break it. */ xlock.box = (struct obj *)0; if(!getdir((char *)0)) return(0); x = u.ux + u.dx; y = u.uy + u.dy; if (x == u.ux && y == u.uy) { if (u.dz < 0) { There("isn't any sort of lock up %s.", Levitation ? "here" : "there"); return 0; } else if (is_lava(u.ux, u.uy)) { pline("Doing that would probably melt your %s.", xname(uwep)); return 0; } else if (is_pool(u.ux, u.uy) && !Underwater) { pline_The("water has no lock."); return 0; } for(otmp = level.objects[u.ux][u.uy]; otmp; otmp = otmp->nexthere) if(Is_box(otmp)) { if (!can_reach_floor()) { You_cant("reach %s from up here.", the(xname(otmp))); return 0; } if (otmp->obroken || !otmp->olocked) { There("is %s here, but its lock is already %s.", doname(otmp), otmp->obroken ? "broken" : "unlocked"); continue; } Sprintf(qbuf,"There is %s here, force its lock?", safe_qbuf("", sizeof("There is here, force its lock?"), doname(otmp), an(simple_typename(otmp->otyp)), "a box")); c = ynq(qbuf); if(c == 'q') return(0); if(c == 'n') continue; #ifdef LIGHTSABERS if(picktyp == 2) You("begin melting it with your %s.", xname(uwep)); else #endif if(picktyp) You("force your %s into a crack and pry.", xname(uwep)); else You("start bashing it with your %s.", xname(uwep)); xlock.box = otmp; #ifdef LIGHTSABERS if (is_lightsaber(uwep)) xlock.chance = uwep->spe * 2 + 75; else #endif xlock.chance = (uwep->spe + objects[uwep->otyp].oc_wldam) * 2; xlock.picktyp = picktyp; xlock.usedtime = 0; break; } if(xlock.box) { xlock.door = 0; set_occupation(forcelock, "forcing the lock", 0); return(1); } } else { /* break down/open door */ struct monst *mtmp; door = &levl[x][y]; if ((mtmp = m_at(x, y)) && canseemon(mtmp) && mtmp->m_ap_type != M_AP_FURNITURE && mtmp->m_ap_type != M_AP_OBJECT) { if (mtmp->isshk || mtmp->data == &mons[PM_ORACLE]) verbalize("What do you think you are, a Jedi?"); /* Phantom Menace */ else pline("I don't think %s would appreciate that.", mon_nam(mtmp)); return(0); } /* Lightsabers dig through doors and walls via dig.c */ if (is_pick(uwep) || #ifdef LIGHTSABERS is_lightsaber(uwep) || #endif is_axe(uwep)) return use_pick_axe2(uwep); if(!IS_DOOR(door->typ)) { if (is_drawbridge_wall(x,y) >= 0) pline("The drawbridge is too solid to force open."); else You("%s no door there.", Blind ? "feel" : "see"); return(0); } /* ALI - artifact doors */ if (artifact_door(x, y)) { pline("This door is too solid to force open."); return 0; } switch (door->doormask) { case D_NODOOR: pline("This doorway has no door."); return(0); case D_ISOPEN: You("cannot force an open door."); return(0); case D_BROKEN: pline("This door is broken."); return(0); default: c = yn("Break down the door?"); if(c == 'n') return(0); if(picktyp == 1) You("force your %s into a crack and pry.", xname(uwep)); else You("start bashing it with your %s.", xname(uwep)); #ifdef LIGHTSABERS if (is_lightsaber(uwep)) xlock.chance = uwep->spe + 38; else #endif xlock.chance = uwep->spe + objects[uwep->otyp].oc_wldam; xlock.picktyp = picktyp; xlock.usedtime = 0; xlock.door = door; xlock.box = 0; set_occupation(forcedoor, "forcing the door", 0); return(1); } } You("decide not to force the issue."); return(0); } int doopen() /* try to open a door */ { coord cc; register struct rm *door; struct monst *mtmp; if (nohands(youmonst.data)) { You_cant("open anything -- you have no hands!"); return 0; } if (u.utrap && u.utraptype == TT_PIT) { You_cant("reach over the edge of the pit."); return 0; } if(!get_adjacent_loc((char *)0, (char *)0, u.ux, u.uy, &cc)) return(0); if((cc.x == u.ux) && (cc.y == u.uy)) return(0); if ((mtmp = m_at(cc.x,cc.y)) && mtmp->m_ap_type == M_AP_FURNITURE && (mtmp->mappearance == S_hcdoor || mtmp->mappearance == S_vcdoor) && !Protection_from_shape_changers) { stumble_onto_mimic(mtmp); return(1); } door = &levl[cc.x][cc.y]; if(!IS_DOOR(door->typ)) { if (is_db_wall(cc.x,cc.y)) { There("is no obvious way to open the drawbridge."); return(0); } You("%s no door there.", Blind ? "feel" : "see"); return(0); } if (!(door->doormask & D_CLOSED)) { const char *mesg; switch (door->doormask) { case D_BROKEN: mesg = " is broken"; break; case D_NODOOR: mesg = "way has no door"; break; case D_ISOPEN: mesg = " is already open"; break; default: mesg = " is locked"; break; } pline("This door%s.", mesg); if (Blind) feel_location(cc.x,cc.y); return(0); } if(verysmall(youmonst.data)) { pline("You're too small to pull the door open."); return(0); } /* door is known to be CLOSED */ if (rnl(20) < (ACURRSTR+ACURR(A_DEX)+ACURR(A_CON))/3) { pline_The("door opens."); if(door->doormask & D_TRAPPED) { b_trapped("door", FINGER); door->doormask = D_NODOOR; if (*in_rooms(cc.x, cc.y, SHOPBASE)) add_damage(cc.x, cc.y, 0L); } else door->doormask = D_ISOPEN; if (Blind) feel_location(cc.x,cc.y); /* the hero knows she opened it */ else newsym(cc.x,cc.y); unblock_point(cc.x,cc.y); /* vision: new see through there */ } else { exercise(A_STR, TRUE); pline_The("door resists!"); } return(1); } STATIC_OVL boolean obstructed(x,y) register int x, y; { register struct monst *mtmp = m_at(x, y); if(mtmp && mtmp->m_ap_type != M_AP_FURNITURE) { if (mtmp->m_ap_type == M_AP_OBJECT) goto objhere; pline("%s stands in the way!", !canspotmon(mtmp) ? "Some creature" : Monnam(mtmp)); if (!canspotmon(mtmp)) map_invisible(mtmp->mx, mtmp->my); return(TRUE); } if (OBJ_AT(x, y)) { objhere: pline("%s's in the way.", Something); return(TRUE); } return(FALSE); } int doclose() /* try to close a door */ { register int x, y; register struct rm *door; struct monst *mtmp; if (nohands(youmonst.data)) { You_cant("close anything -- you have no hands!"); return 0; } if (u.utrap && u.utraptype == TT_PIT) { You_cant("reach over the edge of the pit."); return 0; } if(!getdir((char *)0)) return(0); x = u.ux + u.dx; y = u.uy + u.dy; if((x == u.ux) && (y == u.uy)) { You("are in the way!"); return(1); } if ((mtmp = m_at(x,y)) && mtmp->m_ap_type == M_AP_FURNITURE && (mtmp->mappearance == S_hcdoor || mtmp->mappearance == S_vcdoor) && !Protection_from_shape_changers) { stumble_onto_mimic(mtmp); return(1); } door = &levl[x][y]; if(!IS_DOOR(door->typ)) { if (door->typ == DRAWBRIDGE_DOWN) There("is no obvious way to close the drawbridge."); else You("%s no door there.", Blind ? "feel" : "see"); return(0); } if(door->doormask == D_NODOOR) { pline("This doorway has no door."); return(0); } if(obstructed(x, y)) return(0); if(door->doormask == D_BROKEN) { pline("This door is broken."); return(0); } if(door->doormask & (D_CLOSED | D_LOCKED)) { pline("This door is already closed."); return(0); } if(door->doormask == D_ISOPEN) { if(verysmall(youmonst.data) #ifdef STEED && !u.usteed #endif ) { pline("You're too small to push the door closed."); return(0); } if ( #ifdef STEED u.usteed || #endif rn2(25) < (ACURRSTR+ACURR(A_DEX)+ACURR(A_CON))/3) { pline_The("door closes."); door->doormask = D_CLOSED; if (Blind) feel_location(x,y); /* the hero knows she closed it */ else newsym(x,y); block_point(x,y); /* vision: no longer see there */ } else { exercise(A_STR, TRUE); pline_The("door resists!"); } } return(1); } boolean /* box obj was hit with spell effect otmp */ boxlock(obj, otmp) /* returns true if something happened */ register struct obj *obj, *otmp; /* obj *is* a box */ { register boolean res = 0; switch(otmp->otyp) { case WAN_LOCKING: case SPE_WIZARD_LOCK: if (!obj->olocked) { /* lock it; fix if broken */ pline("Klunk!"); obj->olocked = 1; obj->obroken = 0; res = 1; } /* else already closed and locked */ break; case WAN_OPENING: case SPE_KNOCK: if (obj->olocked) { /* unlock; couldn't be broken */ pline("Klick!"); obj->olocked = 0; res = 1; } else /* silently fix if broken */ obj->obroken = 0; break; case WAN_POLYMORPH: case SPE_POLYMORPH: /* maybe start unlocking chest, get interrupted, then zap it; we must avoid any attempt to resume unlocking it */ if (xlock.box == obj) reset_pick(); break; } return res; } boolean /* Door/secret door was hit with spell effect otmp */ doorlock(otmp,x,y) /* returns true if something happened */ struct obj *otmp; int x, y; { register struct rm *door = &levl[x][y]; boolean res = TRUE; int loudness = 0; const char *msg = (const char *)0; const char *dustcloud = "A cloud of dust"; const char *quickly_dissipates = "quickly dissipates"; int key = artifact_door(x, y); /* ALI - Artifact doors */ if (door->typ == SDOOR) { switch (otmp->otyp) { case WAN_OPENING: case SPE_KNOCK: case WAN_STRIKING: case SPE_FORCE_BOLT: if (key) /* Artifact doors are revealed only */ cvt_sdoor_to_door(door); else { door->typ = DOOR; door->doormask = D_CLOSED | (door->doormask & D_TRAPPED); } newsym(x,y); if (cansee(x,y)) pline("A door appears in the wall!"); if (otmp->otyp == WAN_OPENING || otmp->otyp == SPE_KNOCK) return TRUE; break; /* striking: continue door handling below */ case WAN_LOCKING: case SPE_WIZARD_LOCK: default: return FALSE; } } switch(otmp->otyp) { case WAN_LOCKING: case SPE_WIZARD_LOCK: #ifdef REINCARNATION if (Is_rogue_level(&u.uz)) { boolean vis = cansee(x,y); /* Can't have real locking in Rogue, so just hide doorway */ if (vis) pline("%s springs up in the older, more primitive doorway.", dustcloud); else You_hear("a swoosh."); if (obstructed(x,y)) { if (vis) pline_The("cloud %s.",quickly_dissipates); return FALSE; } block_point(x, y); door->typ = SDOOR; if (vis) pline_The("doorway vanishes!"); newsym(x,y); return TRUE; } #endif if (obstructed(x,y)) return FALSE; /* Don't allow doors to close over traps. This is for pits */ /* & trap doors, but is it ever OK for anything else? */ if (t_at(x,y)) { /* maketrap() clears doormask, so it should be NODOOR */ pline( "%s springs up in the doorway, but %s.", dustcloud, quickly_dissipates); return FALSE; } switch (door->doormask & ~D_TRAPPED) { case D_CLOSED: if (key) msg = "The door closes!"; else msg = "The door locks!"; break; case D_ISOPEN: if (key) msg = "The door swings shut!"; else msg = "The door swings shut, and locks!"; break; case D_BROKEN: if (key) msg = "The broken door reassembles!"; else msg = "The broken door reassembles and locks!"; break; case D_NODOOR: msg = "A cloud of dust springs up and assembles itself into a door!"; break; default: res = FALSE; break; } block_point(x, y); if (key) door->doormask = D_CLOSED | (door->doormask & D_TRAPPED); else door->doormask = D_LOCKED | (door->doormask & D_TRAPPED); newsym(x,y); break; case WAN_OPENING: case SPE_KNOCK: if (!key && door->doormask & D_LOCKED) { msg = "The door unlocks!"; door->doormask = D_CLOSED | (door->doormask & D_TRAPPED); } else res = FALSE; break; case WAN_STRIKING: case SPE_FORCE_BOLT: if (!key && door->doormask & (D_LOCKED | D_CLOSED)) { if (door->doormask & D_TRAPPED) { if (MON_AT(x, y)) (void) mb_trapped(m_at(x,y)); else if (flags.verbose) { if (cansee(x,y)) pline("KABOOM!! You see a door explode."); else if (flags.soundok) You_hear("a distant explosion."); } door->doormask = D_NODOOR; unblock_point(x,y); newsym(x,y); loudness = 40; break; } door->doormask = D_BROKEN; if (flags.verbose) { if (cansee(x,y)) pline_The("door crashes open!"); else if (flags.soundok) You_hear("a crashing sound."); } unblock_point(x,y); newsym(x,y); /* force vision recalc before printing more messages */ if (vision_full_recalc) vision_recalc(0); loudness = 20; } else res = FALSE; break; default: impossible("magic (%d) attempted on door.", otmp->otyp); break; } if (msg && cansee(x,y)) pline(msg); if (loudness > 0) { /* door was destroyed */ wake_nearto(x, y, loudness); if (*in_rooms(x, y, SHOPBASE)) add_damage(x, y, 0L); } if (res && picking_at(x, y)) { /* maybe unseen monster zaps door you're unlocking */ stop_occupation(); reset_pick(); } return res; } STATIC_OVL void chest_shatter_msg(otmp) struct obj *otmp; { const char *disposition; const char *thing; long save_Blinded; if (otmp->oclass == POTION_CLASS) { You("%s %s shatter!", Blind ? "hear" : "see", an(bottlename())); if (!breathless(youmonst.data) || haseyes(youmonst.data)) potionbreathe(otmp); return; } /* We have functions for distant and singular names, but not one */ /* which does _both_... */ save_Blinded = Blinded; Blinded = 1; thing = singular(otmp, xname); Blinded = save_Blinded; switch (objects[otmp->otyp].oc_material) { case PAPER: disposition = "is torn to shreds"; break; case WAX: disposition = "is crushed"; break; case VEGGY: disposition = "is pulped"; break; case FLESH: disposition = "is mashed"; break; case GLASS: disposition = "shatters"; break; case WOOD: disposition = "splinters to fragments"; break; default: disposition = "is destroyed"; break; } pline("%s %s!", An(thing), disposition); } /* ALI - Kevin Hugo's artifact doors. * Return the artifact which unlocks the door at (x, y), or * zero if it is an ordinary door. * Note: Not all doors are listed in the doors array (eg., doors * dynamically converted from secret doors). Since only trapped * and artifact doors are needed this isn't a problem. If we ever * implement trapped secret doors we will have to extend this. */ int artifact_door(x, y) int x, y; { int i; for(i = 0; i < doorindex; i++) { if (x == doors[i].x && y == doors[i].y) return doors[i].arti_key; } return 0; } #endif /* OVLB */ /*lock.c*/ slashem-0.0.7E7F3/src/cmd.c0000644000076400007640000027353710545462317013371 0ustar aliali/* SCCS Id: @(#)cmd.c 3.4 2003/02/06 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" #include "func_tab.h" /* #define DEBUG */ /* uncomment for debugging */ /* * Some systems may have getchar() return EOF for various reasons, and * we should not quit before seeing at least NR_OF_EOFS consecutive EOFs. */ #if defined(SYSV) || defined(DGUX) || defined(HPUX) #define NR_OF_EOFS 20 #endif #define CMD_TRAVEL (char)0x90 #ifdef DEBUG /* * only one "wiz_debug_cmd" routine should be available (in whatever * module you are trying to debug) or things are going to get rather * hard to link :-) */ extern int NDECL(wiz_debug_cmd); #endif #ifdef DUMB /* stuff commented out in extern.h, but needed here */ extern int NDECL(doapply); /**/ extern int NDECL(dorub); /**/ extern int NDECL(dojump); /**/ extern int NDECL(doextlist); /**/ extern int NDECL(dodrop); /**/ extern int NDECL(doddrop); /**/ extern int NDECL(dodown); /**/ extern int NDECL(doup); /**/ extern int NDECL(donull); /**/ extern int NDECL(dowipe); /**/ extern int NDECL(do_mname); /**/ extern int NDECL(ddocall); /**/ extern int NDECL(dotakeoff); /**/ extern int NDECL(doremring); /**/ extern int NDECL(dowear); /**/ extern int NDECL(doputon); /**/ extern int NDECL(doddoremarm); /**/ extern int NDECL(dokick); /**/ extern int NDECL(dofire); /**/ extern int NDECL(dofire); /**/ extern int NDECL(dothrow); /**/ extern int NDECL(doeat); /**/ extern int NDECL(done2); /**/ extern int NDECL(doengrave); /**/ extern int NDECL(dopickup); /**/ extern int NDECL(ddoinv); /**/ extern int NDECL(dotypeinv); /**/ extern int NDECL(dolook); /**/ extern int NDECL(doprgold); /**/ extern int NDECL(doprwep); /**/ extern int NDECL(doprarm); /**/ extern int NDECL(doprring); /**/ extern int NDECL(dopramulet); /**/ extern int NDECL(doprtool); /**/ extern int NDECL(dosuspend); /**/ extern int NDECL(doforce); /**/ extern int NDECL(doopen); /**/ extern int NDECL(doclose); /**/ extern int NDECL(dosh); /**/ extern int NDECL(dodiscovered); /**/ extern int NDECL(doset); /**/ extern int NDECL(dotogglepickup); /**/ extern int NDECL(dowhatis); /**/ extern int NDECL(doquickwhatis); /**/ extern int NDECL(dowhatdoes); /**/ extern int NDECL(dohelp); /**/ extern int NDECL(dohistory); /**/ extern int NDECL(doloot); /**/ extern int NDECL(dodrink); /**/ extern int NDECL(dodip); /**/ extern int NDECL(dosacrifice); /**/ extern int NDECL(dopray); /**/ extern int NDECL(doturn); /**/ extern int NDECL(dotech); /**/ extern int NDECL(doredraw); /**/ extern int NDECL(doread); /**/ extern int NDECL(dosave); /**/ extern int NDECL(dosearch); /**/ extern int NDECL(doidtrap); /**/ extern int NDECL(dopay); /**/ extern int NDECL(dosit); /**/ extern int NDECL(dotalk); /**/ extern int NDECL(docast); /**/ extern int NDECL(dovspell); /**/ extern int NDECL(dotele); /**/ extern int NDECL(dountrap); /**/ extern int NDECL(doversion); /**/ extern int NDECL(doextversion); /**/ extern int NDECL(doswapweapon); /**/ extern int NDECL(doswapweapon); /**/ extern int NDECL(dowield); /**/ extern int NDECL(dowieldquiver); /**/ extern int NDECL(dowieldquiver); /**/ extern int NDECL(dozap); /**/ extern int NDECL(doorganize); /**/ extern int NDECL(dolistvanq); /**/ #endif /* DUMB */ #ifdef OVL1 static int NDECL((*timed_occ_fn)); #endif /* OVL1 */ STATIC_PTR int NDECL(doprev_message); STATIC_PTR int NDECL(timed_occupation); STATIC_PTR int NDECL(doextcmd); #ifdef BORG STATIC_PTR int NDECL(doborgtoggle); #endif STATIC_PTR int NDECL(domonability); STATIC_PTR int NDECL(dotravel); STATIC_PTR int NDECL(playersteal); #if 0 STATIC_PTR int NDECL(specialpower); /* WAC -- use techniques */ #endif # ifdef WIZARD STATIC_PTR int NDECL(wiz_wish); STATIC_PTR int NDECL(wiz_identify); STATIC_PTR int NDECL(wiz_map); /* BEGIN TSANTH'S CODE */ STATIC_PTR int NDECL(wiz_gain_ac); STATIC_PTR int NDECL(wiz_gain_level); STATIC_PTR int NDECL(wiz_toggle_invulnerability); /* END TSANTH'S CODE */ STATIC_PTR int NDECL(wiz_genesis); STATIC_PTR int NDECL(wiz_where); STATIC_PTR int NDECL(wiz_detect); STATIC_PTR int NDECL(wiz_panic); 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 #ifdef DEBUG_MIGRATING_MONS STATIC_PTR int NDECL(wiz_migrate_mons); #endif STATIC_DCL void FDECL(count_obj, (struct obj *, long *, long *, BOOLEAN_P, BOOLEAN_P)); STATIC_DCL void FDECL(obj_chain, (winid, const char *, struct obj *, long *, long *)); STATIC_DCL void FDECL(mon_invent_chain, (winid, const char *, struct monst *, long *, long *)); STATIC_DCL void FDECL(mon_chain, (winid, const char *, struct monst *, long *, long *)); STATIC_DCL void FDECL(contained, (winid, const char *, long *, long *)); STATIC_PTR int NDECL(wiz_show_stats); #ifdef DISPLAY_LAYERS STATIC_PTR int NDECL(wiz_show_display); #endif # ifdef PORT_DEBUG STATIC_DCL int NDECL(wiz_port_debug); # endif # endif STATIC_PTR int NDECL(enter_explore_mode); STATIC_PTR int NDECL(doattributes); STATIC_PTR int NDECL(doconduct); /**/ STATIC_PTR boolean NDECL(minimal_enlightenment); STATIC_PTR int FDECL(makemenu, (const char *, struct menu_list *)); static NEARDATA struct rm *maploc; #ifdef OVLB STATIC_DCL void FDECL(enlght_line, (const char *,const char *,const char *)); STATIC_DCL char *FDECL(enlght_combatinc, (const char *,int,int,char *)); #ifdef UNIX static void NDECL(end_of_input); #endif #endif /* OVLB */ static const char* readchar_queue=""; STATIC_DCL char *NDECL(parse); STATIC_DCL boolean FDECL(help_dir, (CHAR_P,const char *)); STATIC_PTR int NDECL(domenusystem); /* WAC the menus*/ #ifdef BORG /* in borg.c */ extern char borg_on; extern char borg_line[80]; char borg_input(void); #endif #ifdef OVL1 STATIC_PTR int doprev_message() { return nh_doprev_message(); } /* Count down by decrementing multi */ STATIC_PTR int timed_occupation() { (*timed_occ_fn)(); if (multi > 0) multi--; return multi > 0; } /* If you have moved since initially setting some occupations, they * now shouldn't be able to restart. * * The basic rule is that if you are carrying it, you can continue * since it is with you. If you are acting on something at a distance, * your orientation to it must have changed when you moved. * * The exception to this is taking off items, since they can be taken * off in a number of ways in the intervening time, screwing up ordering. * * Currently: Take off all armor. * Picking Locks / Forcing Chests. * Setting traps. */ void reset_occupations() { reset_remarm(); reset_pick(); reset_trapset(); } /* If a time is given, use it to timeout this function, otherwise the * function times out by its own means. */ void set_occupation(fn, txt, xtime) int NDECL((*fn)); const char *txt; int xtime; { if (xtime) { occupation = timed_occupation; timed_occ_fn = fn; } else occupation = fn; occtxt = txt; occtime = 0; return; } #ifdef REDO static char NDECL(popch); /* Provide a means to redo the last command. The flag `in_doagain' is set * to true while redoing the command. This flag is tested in commands that * require additional input (like `throw' which requires a thing and a * direction), and the input prompt is not shown. Also, while in_doagain is * TRUE, no keystrokes can be saved into the saveq. */ #define BSIZE 20 static char pushq[BSIZE], saveq[BSIZE]; static NEARDATA int phead, ptail, shead, stail; static char popch() { /* If occupied, return '\0', letting tgetch know a character should * be read from the keyboard. If the character read is not the * ABORT character (as checked in pcmain.c), that character will be * pushed back on the pushq. */ if (occupation) return '\0'; if (in_doagain) return(char)((shead != stail) ? saveq[stail++] : '\0'); else return(char)((phead != ptail) ? pushq[ptail++] : '\0'); } char pgetchar() { /* curtesy of aeb@cwi.nl */ register int ch; if(!(ch = popch())) ch = nhgetch(); return((char)ch); } /* A ch == 0 resets the pushq */ void pushch(ch) char ch; { if (!ch) phead = ptail = 0; if (phead < BSIZE) pushq[phead++] = ch; return; } /* A ch == 0 resets the saveq. Only save keystrokes when not * replaying a previous command. */ void savech(ch) char ch; { if (!in_doagain) { if (!ch) phead = ptail = shead = stail = 0; else if (shead < BSIZE) saveq[shead++] = ch; } return; } #endif /* REDO */ #endif /* OVL1 */ #ifdef OVLB STATIC_PTR int doextcmd() /* here after # - now read a full-word command */ { int idx, retval; /* keep repeating until we don't run help or quit */ do { idx = get_ext_cmd(); if (idx < 0) return 0; /* quit */ retval = (*extcmdlist[idx].ef_funct)(); } while (extcmdlist[idx].ef_funct == doextlist); return retval; } int doextlist() /* here after #? - now list all full-word commands */ { register const struct ext_func_tab *efp; char buf[BUFSZ]; winid datawin; datawin = create_nhwindow(NHW_TEXT); putstr(datawin, 0, ""); putstr(datawin, 0, " Extended Commands List"); putstr(datawin, 0, ""); putstr(datawin, 0, " Press '#', then type:"); 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); destroy_nhwindow(datawin); return 0; } #ifdef BORG STATIC_PTR int doborgtoggle() { char qbuf[QBUFSZ]; char c; Strcpy(qbuf,"Really enable cyborg?"); if ((c = yn_function(qbuf, ynqchars, 'n')) == 'y') { borg_on = 1; pline("The cyborg is enabled.... Good luck!"); } return 0; } #endif #if defined(TTY_GRAPHICS) || defined(GL_GRAPHICS) || defined(SDL_GRAPHICS) #define MAX_EXT_CMD 40 /* Change if we ever have > 40 ext cmds */ /* * This is currently used only by the tty port and is * controlled via runtime option 'extmenu' * -AJA- The SDL/GL window systems use it too. */ int extcmd_via_menu() /* here after # - now show pick-list of possible commands */ { const struct ext_func_tab *efp; menu_item *pick_list = (menu_item *)0; winid win; anything any; const struct ext_func_tab *choices[MAX_EXT_CMD]; char buf[BUFSZ]; char cbuf[QBUFSZ], prompt[QBUFSZ], fmtstr[20]; int i, n, nchoices, acount; int ret, biggest; int accelerator, prevaccelerator; int matchlevel = 0; ret = 0; cbuf[0] = '\0'; biggest = 0; while (!ret) { i = n = 0; accelerator = 0; any.a_void = 0; /* populate choices */ for(efp = extcmdlist; efp->ef_txt; efp++) { if (!matchlevel || !strncmp(efp->ef_txt, cbuf, matchlevel)) { choices[i++] = efp; if ((int)strlen(efp->ef_desc) > biggest) { biggest = strlen(efp->ef_desc); Sprintf(fmtstr,"%%-%ds", biggest + 15); } #ifdef DEBUG if (i >= MAX_EXT_CMD - 2) { impossible("Exceeded %d extended commands in doextcmd() menu", MAX_EXT_CMD - 2); return 0; } #endif } } choices[i] = (struct ext_func_tab *)0; nchoices = i; /* if we're down to one, we have our selection so get out of here */ if (nchoices == 1) { for (i = 0; extcmdlist[i].ef_txt != (char *)0; i++) if (!strncmpi(extcmdlist[i].ef_txt, cbuf, matchlevel)) { ret = i; break; } break; } /* otherwise... */ win = create_nhwindow(NHW_MENU); start_menu(win); prevaccelerator = 0; acount = 0; for(i = 0; choices[i]; ++i) { accelerator = choices[i]->ef_txt[matchlevel]; if (accelerator != prevaccelerator || nchoices < (ROWNO - 3)) { if (acount) { /* flush the extended commands for that letter already in buf */ Sprintf(buf, fmtstr, prompt); any.a_char = prevaccelerator; add_menu(win, NO_GLYPH, &any, any.a_char, 0, ATR_NONE, buf, FALSE); acount = 0; } } prevaccelerator = accelerator; if (!acount || nchoices < (ROWNO - 3)) { Sprintf(prompt, "%s [%s]", choices[i]->ef_txt, choices[i]->ef_desc); } else if (acount == 1) { Sprintf(prompt, "%s or %s", choices[i-1]->ef_txt, choices[i]->ef_txt); } else { Strcat(prompt," or "); Strcat(prompt, choices[i]->ef_txt); } ++acount; } if (acount) { /* flush buf */ Sprintf(buf, fmtstr, prompt); any.a_char = prevaccelerator; add_menu(win, NO_GLYPH, &any, any.a_char, 0, ATR_NONE, buf, FALSE); } Sprintf(prompt, "Extended Command: %s", cbuf); end_menu(win, prompt); n = select_menu(win, PICK_ONE, &pick_list); destroy_nhwindow(win); if (n==1) { if (matchlevel > (QBUFSZ - 2)) { free((genericptr_t)pick_list); #ifdef DEBUG impossible("Too many characters (%d) entered in extcmd_via_menu()", matchlevel); #endif ret = -1; } else { cbuf[matchlevel++] = pick_list[0].item.a_char; cbuf[matchlevel] = '\0'; free((genericptr_t)pick_list); } } else { if (matchlevel) { ret = 0; matchlevel = 0; } else ret = -1; } } return ret; } #endif /* #monster command - use special monster ability while polymorphed */ STATIC_PTR int domonability() { 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(); else if (is_mind_flayer(youmonst.data)) return domindblast(); else if (u.umonnum == PM_GREMLIN) { if(IS_FOUNTAIN(levl[u.ux][u.uy].typ)) { if (split_mon(&youmonst, (struct monst *)0)) dryup(u.ux, u.uy, TRUE); } else There("is no fountain here."); } else if (is_unicorn(youmonst.data)) { use_unicorn_horn((struct obj *)0); return 1; } else if (youmonst.data->msound == MS_SHRIEK) { You("shriek."); if(u.uburied) pline("Unfortunately sound does not carry well through rock."); else aggravate(); } else if (Upolyd) pline("Any special ability you may have is purely reflexive."); else You("don't have a special ability in your normal form!"); return 0; } STATIC_PTR int enter_explore_mode() { if(!discover && !wizard) { pline("Beware! From explore mode there will be no return to normal game."); if (yn("Do you want to enter explore mode?") == 'y') { clear_nhwindow(WIN_MESSAGE); You("are now in non-scoring explore mode."); discover = TRUE; } else { clear_nhwindow(WIN_MESSAGE); pline("Resuming normal game."); } } return 0; } STATIC_PTR int playersteal() { register int x, y; int temp, chanch, base, dexadj, statbonus = 0; boolean no_steal = FALSE; if (nohands(youmonst.data)) { pline("Could be hard without hands ..."); no_steal = TRUE; } else if (near_capacity() > SLT_ENCUMBER) { Your("load is too heavy to attempt to steal."); no_steal = TRUE; } if (no_steal) { /* discard direction typeahead, if any */ display_nhwindow(WIN_MESSAGE, TRUE); /* --More-- */ return(0); } if(!getdir(NULL)) return(0); if(!u.dx && !u.dy) return(0); x = u.ux + u.dx; y = u.uy + u.dy; if(u.uswallow) { pline("You search around but don't find anything."); return(1); } u_wipe_engr(2); maploc = &levl[x][y]; if(MON_AT(x, y)) { register struct monst *mdat = m_at(x, y); /* calculate chanch of sucess */ base = 5; dexadj = 1; if (Role_if(PM_ROGUE)) { base = 5 + (u.ulevel * 2); dexadj = 3; } if (ACURR(A_DEX) < 10) statbonus = (ACURR(A_DEX) - 10) * dexadj; else if (ACURR(A_DEX) > 14) statbonus = (ACURR(A_DEX) - 14) * dexadj; chanch = base + statbonus; if (uarmg && uarmg->otyp != GAUNTLETS_OF_DEXTERITY) chanch -= 5; if (!uarmg) chanch += 5; if (uarms) chanch -= 10; if (uarm && uarm->owt < 75) chanch += 10; else if (uarm && uarm->owt < 125) chanch += 5; else if (uarm && uarm->owt < 175) chanch += 0; else if (uarm && uarm->owt < 225) chanch -= 5; else if (uarm && uarm->owt < 275) chanch -= 10; else if (uarm && uarm->owt < 325) chanch -= 15; else if (uarm && uarm->owt < 375) chanch -= 20; else if (uarm) chanch -= 25; if (chanch < 5) chanch = 5; if (chanch > 95) chanch = 95; if (rnd(100) < chanch || mdat->mtame) { #ifdef GOLDOBJ /* [CWC] This will steal money from the monster from the * first found goldobj - we could be really clever here and * then move onwards to the next goldobj in invent if we * still have coins left to steal, but lets leave that until * we actually have other coin types to test it on. */ struct obj *gold = findgold(mdat->minvent); if (gold) { int mongold; int coinstolen; coinstolen = (u.ulevel * rn1(25,25)); mongold = (int)gold->quan; if (coinstolen > mongold) coinstolen = mongold; if (coinstolen > 0) { if (coinstolen != mongold) gold = splitobj(gold, coinstolen); obj_extract_self(gold); if (merge_choice(invent, gold) || inv_cnt() < 52) { addinv(gold); You("steal %s.", doname(gold)); } else { You("grab %s, but find no room in your knapsack.", doname(gold)); dropy(gold); } } else impossible("cmd.c:playersteal() stealing negative money"); #else if (mdat->mgold) { temp = (u.ulevel * rn1(25,25)); if (temp > mdat->mgold) temp = mdat->mgold; u.ugold += temp; mdat->mgold -= temp; You("steal %d gold.",temp); #endif } else You("don't find anything to steal."); if (!mdat->mtame) exercise(A_DEX, TRUE); return(1); } else { You("failed to steal anything."); setmangry(mdat); return(1); } } else { pline("I don't see anybody to rob there!"); return(0); } return(0); } #ifdef WIZARD /* ^W command - wish for something */ STATIC_PTR int wiz_wish() /* Unlimited wishes for debug mode by Paul Polderman */ { if (wizard) { boolean save_verbose = flags.verbose; flags.verbose = FALSE; makewish(); flags.verbose = save_verbose; (void) encumber_msg(); } else pline("Unavailable command '^W'."); return 0; } #if 0 /* WAC -- Now uses techniques */ STATIC_PTR int specialpower() /* Special class abilites [modified by Tom] */ { /* * STEPHEN WHITE'S NEW CODE * * For clarification, lastuse (as declared in decl.{c|h}) is the * actual length of time the power is active, nextuse is when you can * next use the ability. */ /*Added wizard mode can choose to use ability - wAC*/ if (u.unextuse) { You("have to wait %s before using your ability again.", (u.unextuse > 500) ? "for a while" : "a little longer"); #ifdef WIZARD if (!wizard || (yn("Use ability anyways?") == 'n')) #endif return(0); } switch (u.role) { case 'A': /*WAC stolen from the spellcasters...'A' can identify from historical research*/ if(Hallucination || Stunned || Confusion) { You("can't concentrate right now!"); break; } else if((ACURR(A_INT) + ACURR(A_WIS)) < rnd(60)) { pline("Nothing in your pack looks familiar."); u.unextuse = rn1(500,500); break; } else if(invent) { int ret; You("examine your possessions."); identify_pack(1); /*WAC this should be better - made like scroll of identify*/ /* KMH -- also commented out use of 'ret' without initialization */ /* ret = ggetobj("identify", identify, 1, FALSE);*/ /* if (ret < 0) break; *//* quit or no eligible items */ /* ret = ggetobj("identify", identify, 1, FALSE);*/ } else { /* KMH -- fixed non-compliant string */ You("are already quite familiar with the contents of your pack."); break; } u.unextuse = rn1(500,1500); break; case 'G': Your("ability, gem identification, is automatic."); return(0); case 'P': Your("ability, bless and curse detection, is automatic."); return(0); case 'D': /* KMH -- Just do it! (Besides, Alt isn't portable...) */ return (polyatwill()); /*Your("ability, polymorphing, uses the alt-y key.");*/ /*return(0);*/ case 'L': /*only when empty handed, in human form!*/ if (Upolyd) { You("can't do this while polymorphed!"); break; } if (uwep == 0) { Your("fingernails extend into claws!"); aggravate(); u.ulastuse = d(2,4) + (u.ulevel/5) + 1; /* [max] was d(2,8) */ u.unextuse = rn1(1000,1000); /* [max] increased delay */ } else You("can't do this while holding a weapon!"); break; case 'R': /* KMH -- Just do it! (Besides, Alt isn't portable...) */ return (playersteal()); /*Your("ability, stealing, uses the alt-b key.");*/ /*return(0);*/ break; case 'M': Your("special ability is unarmed combat, and it is automatic."); return(0); break; case 'C': case 'T': You("don't have a special ability!"); return(0); break; case 'B': You("fly into a berserk rage!"); u.ulastuse = d(2,8) + (u.ulevel/5) + 1; incr_itimeout(&HFast, u.ulastuse); u.unextuse = rn1(1000,500); return(0); break; case 'F': case 'I': case 'N': case 'W': /* WAC spell-users can study their known spells*/ if(Hallucination || Stunned || Confusion) { You("can't concentrate right now!"); break; } else { You("concentrate..."); studyspell(); /*in spell.c*/ } break; case 'E': Your("%s %s become blurs as they reach for your quiver!", uarmg ? "gloved" : "bare", /* Del Lamb */ makeplural(body_part(HAND))); u.ulastuse = rnd((int) (u.ulevel/6 + 1)) + 1; u.unextuse = rn1(1000,500); break; case 'U': case 'V': if(!uwep || (weapon_type(uwep) == P_NONE)) { You("are not wielding a weapon!"); break; } else if(uwep->known == TRUE) { You("study and practice with your %s %s.", uarmg ? "gloved" : "bare", /* Del Lamb */ makeplural(body_part(HAND))); practice_weapon(); } else { if (not_fully_identified(uwep)) { You("examine %s.", doname(uwep)); if (rnd(15) <= ACURR(A_INT)) { makeknown(uwep->otyp); uwep->known = TRUE; You("discover it is %s",doname(uwep)); } else pline("Unfortunately, you didn't learn anything new."); } /*WAC Added practicing code - in weapon.c*/ practice_weapon(); } u.unextuse = rn1(500,500); break; case 'H': if (Hallucination || Stunned || Confusion) { You("are in no condition to perform surgery!"); break; } if ((Sick) || (Slimed)) { /* WAC cure sliming too */ if(carrying(SCALPEL)) { pline("Using your scalpel (ow!), you cure your infection!"); make_sick(0L,(char *)0, TRUE,SICK_ALL); Slimed = 0; if(u.uhp > 6) u.uhp -= 5; else u.uhp = 1; u.unextuse = rn1(500,500); break; } else pline("If only you had a scalpel..."); } if (u.uhp < u.uhpmax) { if(carrying(MEDICAL_KIT)) { pline("Using your medical kit, you bandage your wounds."); u.uhp += (u.ulevel * (rnd(2)+1)) + rn1(5,5); } else { pline("You bandage your wounds as best you can."); u.uhp += (u.ulevel) + rn1(5,5); } u.unextuse = rn1(1000,500); if (u.uhp > u.uhpmax) u.uhp = u.uhpmax; } else pline("You don't need your healing powers!"); break; case 'K': if (u.uhp < u.uhpmax || Sick || Slimed) { /*WAC heal sliming */ if (Sick) You("lay your hands on the foul sickness..."); pline("A warm glow spreads through your body!"); if (Slimed) pline_The("slime is removed."); Slimed = 0; if(Sick) make_sick(0L,(char*)0, TRUE, SICK_ALL); else u.uhp += (u.ulevel * 4); if (u.uhp > u.uhpmax) u.uhp = u.uhpmax; u.unextuse = 3000; } else pline(nothing_happens); break; case 'S': You("scream \"KIIILLL!\""); aggravate(); u.ulastuse = rnd((int) (u.ulevel/6 + 1)) + 1; u.unextuse = rn1(1000,500); return(0); break; #ifdef YEOMAN case 'Y': #ifdef STEED if (u.usteed) { pline("%s gets tamer.", Monnam(u.usteed)); tamedog(u.usteed, (struct obj *) 0); u.unextuse = rn1(1000,500); } else Your("special ability is only effective when riding a monster."); break; #else You("don't have a special ability!"); return(0); #endif #endif default: break; } /*By default, action should take a turn*/ return(1); } #endif /* ^I command - identify hero's inventory */ STATIC_PTR int wiz_identify() { if (wizard) identify_pack(0); else pline("Unavailable command '^I'."); return 0; } /* ^F command - reveal the level map and any traps on it */ STATIC_PTR int wiz_map() { if (wizard) { struct trap *t; long save_Hconf = HConfusion, save_Hhallu = HHallucination; HConfusion = HHallucination = 0L; for (t = ftrap; t != 0; t = t->ntrap) { t->tseen = 1; map_trap(t, TRUE); } do_mapping(); HConfusion = save_Hconf; HHallucination = save_Hhallu; } else pline("Unavailable command '^F'."); return 0; } /* ^G command - generate monster(s); a count prefix will be honored */ STATIC_PTR int wiz_gain_level() { if (wizard) pluslvl(FALSE); else pline("Unavailable command '^J'."); return 0; } /* BEGIN TSANTH'S CODE */ STATIC_PTR int wiz_gain_ac() { if (wizard) { if (u.ublessed < 20) { pline("Intrinsic AC increased by 1."); HProtection |= FROMOUTSIDE; u.ublessed++; flags.botl = 1; } else pline("Intrinsic AC is already maximized."); } else pline("Unavailable command '^C'."); return 0; } STATIC_PTR int wiz_toggle_invulnerability() { if (wizard) { if ((Invulnerable == 0) && (u.uinvulnerable == FALSE)) { You("will be invulnerable for 32000 turns."); Invulnerable = 32000; u.uinvulnerable = TRUE; } else { You("are no longer invulnerable."); Invulnerable = 0; u.uinvulnerable = FALSE; } } else pline("Unavailable command '^N'."); return 0; } /* END TSANTH'S CODE */ STATIC_PTR int wiz_genesis() { if (wizard) (void) create_particular(); else pline("Unavailable command '^G'."); return 0; } /* ^O command - display dungeon layout */ STATIC_PTR int wiz_where() { if (wizard) (void) print_dungeon(FALSE, (schar *)0, (xchar *)0); else pline("Unavailable command '^O'."); return 0; } /* ^E command - detect unseen (secret doors, traps, hidden monsters) */ STATIC_PTR int wiz_detect() { if(wizard) (void) findit(); else pline("Unavailable command '^E'."); return 0; } /* ^V command - level teleport */ STATIC_PTR int wiz_level_tele() { if (wizard) level_tele(); else pline("Unavailable command '^V'."); return 0; } /* #monpolycontrol command - choose new form for shapechangers, polymorphees */ 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; } /* #levelchange command - adjust hero's experience level */ 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("#levelchange", TRUE); } 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; } /* #panic command - test program's panic handling */ STATIC_PTR int wiz_panic() { if (yn("Do you want to call panic() and end your game?") == 'y') panic("crash test."); return 0; } /* #polyself command - change hero's form */ STATIC_PTR int wiz_polyself() { polyself(TRUE); return 0; } /* #seenv command */ STATIC_PTR int wiz_show_seenv() { winid win; int x, y, v, startx, stopx, curx; char row[COLNO+1]; win = create_nhwindow(NHW_TEXT); /* * Each seenv description takes up 2 characters, so center * the seenv display around the hero. */ startx = max(1, u.ux-(COLNO/4)); stopx = min(startx+(COLNO/2), COLNO); /* can't have a line exactly 80 chars long */ if (stopx - startx == COLNO/2) startx++; for (y = 0; y < ROWNO; y++) { for (x = startx, curx = 0; x < stopx; x++, curx += 2) { if (x == u.ux && y == u.uy) { row[curx] = row[curx+1] = '@'; } else { v = levl[x][y].seenv & 0xff; if (v == 0) row[curx] = row[curx+1] = ' '; else Sprintf(&row[curx], "%02x", v); } } /* remove trailing spaces */ for (x = curx-1; x >= 0; x--) if (row[x] != ' ') break; row[x+1] = '\0'; putstr(win, 0, row); } display_nhwindow(win, TRUE); destroy_nhwindow(win); return 0; } /* #vision command */ STATIC_PTR int wiz_show_vision() { winid win; int x, y, v; char row[COLNO+1]; win = create_nhwindow(NHW_TEXT); Sprintf(row, "Flags: 0x%x could see, 0x%x in sight, 0x%x temp lit", COULD_SEE, IN_SIGHT, TEMP_LIT); putstr(win, 0, row); putstr(win, 0, ""); for (y = 0; y < ROWNO; y++) { for (x = 1; x < COLNO; x++) { if (x == u.ux && y == u.uy) row[x] = '@'; else { v = viz_array[y][x]; /* data access should be hidden */ if (v == 0) row[x] = ' '; else row[x] = '0' + viz_array[y][x]; } } /* remove trailing spaces */ for (x = COLNO-1; x >= 1; x--) if (row[x] != ' ') break; row[x+1] = '\0'; putstr(win, 0, &row[1]); } display_nhwindow(win, TRUE); destroy_nhwindow(win); return 0; } /* #wmode command */ STATIC_PTR int wiz_show_wmodes() { winid win; int x,y; char row[COLNO+1]; struct rm *lev; win = create_nhwindow(NHW_TEXT); for (y = 0; y < ROWNO; y++) { for (x = 0; x < COLNO; x++) { 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] = '#'; else if (IS_ROOM(lev->typ) || IS_DOOR(lev->typ)) row[x] = '.'; else row[x] = 'x'; } row[COLNO] = '\0'; putstr(win, 0, row); } display_nhwindow(win, TRUE); destroy_nhwindow(win); return 0; } #endif /* WIZARD */ /* -enlightenment and conduct- */ static winid en_win; static const char You_[] = "You ", are[] = "are ", were[] = "were ", have[] = "have ", had[] = "had ", can[] = "can ", could[] = "could "; static const char have_been[] = "have been ", have_never[] = "have never ", never[] = "never "; #define enl_msg(prefix,present,past,suffix) \ enlght_line(prefix, final ? past : present, suffix) #define you_are(attr) enl_msg(You_,are,were,attr) #define you_have(attr) enl_msg(You_,have,had,attr) #define you_can(attr) enl_msg(You_,can,could,attr) #define you_have_been(goodthing) enl_msg(You_,have_been,were,goodthing) #define you_have_never(badthing) enl_msg(You_,have_never,never,badthing) #define you_have_X(something) enl_msg(You_,have,(const char *)"",something) static void enlght_line(start, middle, end) const char *start, *middle, *end; { char buf[BUFSZ]; Sprintf(buf, "%s%s%s.", start, middle, end); putstr(en_win, 0, buf); } /* KMH, intrinsic patch -- several of these are updated */ void enlightenment(final) int final; /* 0 => still in progress; 1 => over, survived; 2 => dead */ { int ltmp; char buf[BUFSZ]; en_win = create_nhwindow(NHW_MENU); putstr(en_win, 0, final ? "Final Attributes:" : "Current Attributes:"); putstr(en_win, 0, ""); #ifdef ELBERETH if (u.uevent.uhand_of_elbereth) { static const char * const hofe_titles[3] = { "the Hand of Elbereth", "the Envoy of Balance", "the Glory of Arioch" }; you_are(hofe_titles[u.uevent.uhand_of_elbereth - 1]); } #endif /* note: piousness 20 matches MIN_QUEST_ALIGN (quest.h) */ if (u.ualign.record >= 20) you_are("piously aligned"); else if (u.ualign.record > 13) you_are("devoutly aligned"); else if (u.ualign.record > 8) you_are("fervently aligned"); else if (u.ualign.record > 3) you_are("stridently aligned"); else if (u.ualign.record == 3) you_are("aligned"); else if (u.ualign.record > 0) you_are("haltingly aligned"); else if (u.ualign.record == 0) you_are("nominally aligned"); else if (u.ualign.record >= -3) you_have("strayed"); else if (u.ualign.record >= -8) you_have("sinned"); else you_have("transgressed"); #ifdef WIZARD if (wizard) { Sprintf(buf, " %d", u.ualign.record); enl_msg("Your alignment ", "is", "was", buf); } #endif /*** Resistances to troubles ***/ if (Fire_resistance) you_are("fire resistant"); if (Cold_resistance) you_are("cold resistant"); if (Sleep_resistance) you_are("sleep resistant"); if (Disint_resistance) you_are("disintegration-resistant"); if (Shock_resistance) you_are("shock resistant"); if (Poison_resistance) you_are("poison resistant"); if (Drain_resistance) you_are("level-drain resistant"); if (Sick_resistance) you_are("immune to sickness"); if (Antimagic) you_are("magic-protected"); if (Acid_resistance) you_are("acid resistant"); if (Stone_resistance) you_are("petrification resistant"); if (Invulnerable) you_are("invulnerable"); if (u.uedibility) you_can("recognize detrimental food"); /*** Troubles ***/ if (Halluc_resistance) enl_msg("You resist", "", "ed", " hallucinations"); if (final) { if (Hallucination) you_are("hallucinating"); if (Stunned) you_are("stunned"); if (Confusion) you_are("confused"); if (Blinded) you_are("blinded"); if (Sick) { if (u.usick_type & SICK_VOMITABLE) you_are("sick from food poisoning"); if (u.usick_type & SICK_NONVOMITABLE) you_are("sick from illness"); } } if (Stoned) you_are("turning to stone"); if (Slimed) you_are("turning into slime"); if (Strangled) you_are((u.uburied) ? "buried" : "being strangled"); if (Glib) { Sprintf(buf, "slippery %s", makeplural(body_part(FINGER))); 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"); /*** Vision and senses ***/ if (See_invisible) enl_msg(You_, "see", "saw", " invisible"); if (Blind_telepat) you_are("telepathic"); if (Warning) you_are("warned"); if (Warn_of_mon && flags.warntype) { /* [ALI] Add support for undead */ int i, nth = 0; unsigned long warntype = flags.warntype; struct { unsigned long mask; const char *str; } warntypes[] = { M2_ORC, "orcs", M2_DEMON, "demons", M2_UNDEAD, "undead", }; Sprintf(buf, "aware of the presence of "); for(i = 0; i < SIZE(warntypes); i++) { if (warntype & warntypes[i].mask) { warntype &= ~warntypes[i].mask; if (nth) { if (warntype) strcat(buf, ", "); else strcat(buf, " and "); } else nth = 1; strcat(buf, warntypes[i].str); } } if (warntype) { if (nth) strcat(buf, " and "); strcat(buf, something); } you_are(buf); } #if 0 /* ALI - dealt with under Warn_of_mon */ if (Undead_warning) you_are("warned of undead"); #endif if (Searching) you_have("automatic searching"); 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) { int adorn = 0; if(uleft && uleft->otyp == RIN_ADORNMENT) adorn += uleft->spe; if(uright && uright->otyp == RIN_ADORNMENT) adorn += uright->spe; if (adorn < 0) you_are("poorly adorned"); else you_are("adorned"); } if (Invisible) you_are("invisible"); else if (Invis) you_are("invisible to others"); /* ordinarily "visible" is redundant; this is a special case for the situation when invisibility would be an expected attribute */ else if ((HInvis || EInvis || pm_invisible(youmonst.data)) && BInvis) you_are("visible"); if (Displaced) you_are("displaced"); if (Stealth) you_are("stealthy"); if (Aggravate_monster) enl_msg("You aggravate", "", "d", " monsters"); if (Conflict) enl_msg("You cause", "", "d", " conflict"); /*** Transportation ***/ if (Jumping) you_can("jump"); if (Teleportation) you_can("teleport"); if (Teleport_control) you_have("teleport control"); if (Lev_at_will) you_are("levitating, at will"); else if (Levitation) you_are("levitating"); /* without control */ else if (Flying) you_can("fly"); if (Wwalking) you_can("walk on water"); if (Swimming) you_can("swim"); if (Breathless) you_can("survive without air"); else if (Amphibious) you_can("breathe water"); if (Passes_walls) you_can("walk through walls"); #ifdef STEED /* If you die while dismounting, u.usteed is still set. Since several * places in the done() sequence depend on u.usteed, just detect this * special case. */ if (u.usteed && (final < 2 || strcmp(killer, "riding accident"))) { Sprintf(buf, "riding %s", y_monnam(u.usteed)); you_are(buf); } #endif if (u.uswallow) { Sprintf(buf, "swallowed by %s", a_monnam(u.ustuck)); #ifdef WIZARD if (wizard) Sprintf(eos(buf), " (%u)", u.uswldtim); #endif you_are(buf); } else if (u.ustuck) { Sprintf(buf, "%s %s", (Upolyd && sticks(youmonst.data)) ? "holding" : "held by", a_monnam(u.ustuck)); you_are(buf); } /*** Physical attributes ***/ if (u.uhitinc) you_have(enlght_combatinc("to hit", u.uhitinc, final, buf)); if (u.udaminc) you_have(enlght_combatinc("damage", u.udaminc, final, buf)); if (Slow_digestion) you_have("slower digestion"); if (Regeneration) enl_msg("You regenerate", "", "d", ""); if (u.uspellprot || Protection) { int prot = 0; if(uleft && uleft->otyp == RIN_PROTECTION) prot += uleft->spe; if(uright && uright->otyp == RIN_PROTECTION) prot += uright->spe; if (HProtection & INTRINSIC) prot += u.ublessed; prot += u.uspellprot; if (prot < 0) you_are("ineffectively protected"); else you_are("protected"); } if (Protection_from_shape_changers) you_are("protected from shape changers"); if (Polymorph) you_are("polymorphing"); if (Polymorph_control) you_have("polymorph control"); if (u.ulycn >= LOW_PM) { Strcpy(buf, an(mons[u.ulycn].mname)); you_are(buf); } if (Upolyd) { if (u.umonnum == u.ulycn) Strcpy(buf, "in beast form"); else Sprintf(buf, "polymorphed into %s", an(youmonst.data->mname)); #ifdef WIZARD if (wizard) Sprintf(eos(buf), " (%d)", u.mtimedone); #endif you_are(buf); } if (Unchanging) you_can("not change from your current form"); if (Fast) you_are(Very_fast ? "very fast" : "fast"); if (Reflecting) you_have("reflection"); if (Free_action) you_have("free action"); if (Fixed_abil) you_have("fixed abilities"); if (uamul && uamul->otyp == AMULET_VERSUS_STONE) enl_msg("You ", "will be", "would have been", " depetrified"); if (Lifesaved) enl_msg("Your life ", "will be", "would have been", " saved"); if (u.twoweap) { if (uwep && uswapwep) Sprintf(buf, "wielding two weapons at once"); else if (uwep || uswapwep) Sprintf(buf, "fighting with a weapon and your %s %s", uwep ? "left" : "right", body_part(HAND)); else Sprintf(buf, "fighting with two %s", makeplural(body_part(HAND))); you_are(buf); } /*** Miscellany ***/ if (Luck) { ltmp = abs((int)Luck); Sprintf(buf, "%s%slucky", ltmp >= 10 ? "extremely " : ltmp >= 5 ? "very " : "", Luck < 0 ? "un" : ""); #ifdef WIZARD if (wizard) Sprintf(eos(buf), " (%d)", Luck); #endif you_are(buf); } #ifdef WIZARD else if (wizard) enl_msg("Your luck ", "is", "was", " zero"); #endif if (u.moreluck > 0) you_have("extra luck"); else if (u.moreluck < 0) you_have("reduced luck"); if (carrying(LUCKSTONE) || stone_luck(TRUE)) { ltmp = stone_luck(FALSE); if (ltmp <= 0) enl_msg("Bad luck ", "does", "did", " not time out for you"); if (ltmp >= 0) enl_msg("Good luck ", "does", "did", " not time out for you"); } /* KMH, balance patch -- healthstones affect health */ if (u.uhealbonus) { Sprintf(buf, "%s health", u.uhealbonus > 0 ? "extra" : "reduced"); #ifdef WIZARD if (wizard) Sprintf(eos(buf), " (%d)", u.uhealbonus); #endif you_have(buf); } #ifdef WIZARD else if (wizard) enl_msg("Your health bonus ", "is", "was", " zero"); #endif if (u.ugangr) { Sprintf(buf, " %sangry with you", u.ugangr > 6 ? "extremely " : u.ugangr > 3 ? "very " : ""); #ifdef WIZARD if (wizard) Sprintf(eos(buf), " (%d)", u.ugangr); #endif enl_msg(u_gname(), " is", " was", buf); } else /* * We need to suppress this when the game is over, because death * can change the value calculated by can_pray(), potentially * resulting in a false claim that you could have prayed safely. */ if (!final) { #if 0 /* "can [not] safely pray" vs "could [not] have safely prayed" */ Sprintf(buf, "%s%ssafely pray%s", can_pray(FALSE) ? "" : "not ", final ? "have " : "", final ? "ed" : ""); #else Sprintf(buf, "%ssafely pray", can_pray(FALSE) ? "" : "not "); #endif #ifdef WIZARD if (wizard) Sprintf(eos(buf), " (%d)", u.ublesscnt); #endif you_can(buf); #if 0 /* WAC -- replaced by techniques */ /* Sprintf(buf, "%s%suse%s your special", !u.unextuse ? "" : "not ", final ? "have " : "", final ? "d" : "");*/ Sprintf(buf, "%suse your special", !u.unextuse ? "" : "not "); #ifdef WIZARD if (wizard) Sprintf(eos(buf), " (%d)", u.unextuse); #endif you_can(buf); #endif } { const char *p; buf[0] = '\0'; if (final < 2) { /* still in progress, or quit/escaped/ascended */ p = "survived after being killed "; switch (u.umortality) { case 0: p = !final ? (char *)0 : "survived"; break; case 1: Strcpy(buf, "once"); break; case 2: Strcpy(buf, "twice"); break; case 3: Strcpy(buf, "thrice"); break; default: Sprintf(buf, "%d times", u.umortality); break; } } else { /* game ended in character's death */ p = "are dead"; switch (u.umortality) { case 0: impossible("dead without dying?"); case 1: break; /* just "are dead" */ default: Sprintf(buf, " (%d%s time!)", u.umortality, ordin(u.umortality)); break; } } if (p) enl_msg(You_, "have been killed ", p, buf); } display_nhwindow(en_win, TRUE); destroy_nhwindow(en_win); return; } /* * Courtesy function for non-debug, non-explorer mode players * to help refresh them about who/what they are. * Returns FALSE if menu cancelled (dismissed with ESC), TRUE otherwise. */ STATIC_OVL boolean minimal_enlightenment() { winid tmpwin; menu_item *selected; anything any; int genidx, n; char buf[BUFSZ], buf2[BUFSZ]; static const char untabbed_fmtstr[] = "%-15s: %-12s"; static const char untabbed_deity_fmtstr[] = "%-17s%s"; static const char tabbed_fmtstr[] = "%s:\t%-12s"; static const char tabbed_deity_fmtstr[] = "%s\t%s"; static const char *fmtstr; static const char *deity_fmtstr; fmtstr = iflags.menu_tab_sep ? tabbed_fmtstr : untabbed_fmtstr; deity_fmtstr = iflags.menu_tab_sep ? tabbed_deity_fmtstr : untabbed_deity_fmtstr; any.a_void = 0; buf[0] = buf2[0] = '\0'; tmpwin = create_nhwindow(NHW_MENU); start_menu(tmpwin); add_menu(tmpwin, NO_GLYPH, &any, 0, 0, iflags.menu_headings, "Starting", FALSE); /* Starting name, race, role, gender */ Sprintf(buf, fmtstr, "name", plname); add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, FALSE); Sprintf(buf, fmtstr, "race", urace.noun); add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, FALSE); Sprintf(buf, fmtstr, "role", (flags.initgend && urole.name.f) ? urole.name.f : urole.name.m); add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, FALSE); Sprintf(buf, fmtstr, "gender", genders[flags.initgend].adj); add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, FALSE); /* Starting alignment */ Sprintf(buf, fmtstr, "alignment", align_str(u.ualignbase[A_ORIGINAL])); add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, FALSE); /* Current name, race, role, gender */ add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, "", FALSE); add_menu(tmpwin, NO_GLYPH, &any, 0, 0, iflags.menu_headings, "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); } /* don't want poly_gender() here; it forces `2' for non-humanoids */ genidx = is_neuter(youmonst.data) ? 2 : flags.female; Sprintf(buf, fmtstr, "gender", genders[genidx].adj); add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, FALSE); if (Upolyd && (int)u.mfemale != genidx) { Sprintf(buf, fmtstr, "gender (base)", genders[u.mfemale].adj); add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, FALSE); } /* Current alignment */ Sprintf(buf, fmtstr, "alignment", align_str(u.ualign.type)); add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, FALSE); /* Deity list */ add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, "", FALSE); add_menu(tmpwin, NO_GLYPH, &any, 0, 0, iflags.menu_headings, "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)" : (u.ualign.type == A_CHAOTIC) ? " (c)" : ""); Sprintf(buf, fmtstr, "Chaotic", 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)" : (u.ualign.type == A_NEUTRAL) ? " (c)" : ""); Sprintf(buf, fmtstr, "Neutral", 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)" : ""); Sprintf(buf, fmtstr, "Lawful", buf2); add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, FALSE); end_menu(tmpwin, "Base Attributes"); n = select_menu(tmpwin, PICK_NONE, &selected); destroy_nhwindow(tmpwin); return (n != -1); } STATIC_PTR int doattributes() { if (!minimal_enlightenment()) return 0; if (wizard || discover) enlightenment(0); return 0; } static const struct menu_tab game_menu[] = { {'O', TRUE, doset, "Options"}, {'r', TRUE, doredraw, "Redraw Screen"}, {'x', TRUE, enter_explore_mode, "Enter Explore Mode"}, #ifdef SHELL {'!', TRUE, dosh, "Jump to Shell"}, #endif {'S', TRUE, dosave, "Save"}, {'q', TRUE, done2, "Quit [M-q]"}, {0,0,0,0}, }; static const struct menu_tab inv_menu[] = { {(char)0, TRUE, (void *)0, "View Inventory"}, {'i', TRUE, ddoinv, "Inventory List"}, {'I', TRUE, dotypeinv, "Inventory List by Type"}, {'*', TRUE, doprinuse, "Items in use"}, {(char)0, TRUE, (void *)0, "Ready Items"}, {'w', FALSE, dowield, "Wield Weapon"}, {'W', FALSE, dowear, "Wear Protective Gear"}, {'Q', FALSE, dowieldquiver, "Prepare missile weapon (in Quiver)"}, {'T', FALSE, dotakeoff, "Take off Protective Gear"}, {(char)0, TRUE, (void *)0, "Manipulate Items"}, {'a', FALSE, doapply, "Apply an object"}, {'d', FALSE, dodip, "Dip an object [M-d]"}, {'E', FALSE, doengrave, "Engrave into the ground"}, {'f', FALSE, dofire, "Fire your prepared missile weapon"}, {'i', TRUE, doinvoke, "Invoke your weapon"}, {'t', FALSE, dothrow, "Throw an item"}, {(char)0, TRUE, (void *)0, "Drop Items"}, {'d', FALSE, dodrop, "Drop an object"}, {'D', FALSE, doddrop, "Multi-Drop"}, {0,0,0,0} }; static const struct menu_tab action_menu[] = { {'c', FALSE, doclose, "Close a door"}, {'e', FALSE, doeat, "Eat some food"}, {'f', FALSE, doforce, "Force a lock [M-f]"}, {'l', FALSE, doloot, "Loot an object"}, {'o', FALSE, doopen, "Open a door"}, {'q', TRUE, dodrink, "Quaff a potion"}, {'r', FALSE, doread, "Read an object"}, {'u', FALSE, dountrap, "Untrap"}, {'z', FALSE, dozap, "Zap a wand"}, {'Z', TRUE, docast, "Cast a spell"}, {0,0,0,0} }; static const struct menu_tab player_menu[] = { {'b', FALSE, playersteal, "Steal from Monsters [M-b]"}, {'c', TRUE, dotalk, "Chat with Monsters [M-c]"}, {'d', FALSE, dokick, "Do Kick"}, /* {'e', FALSE, specialpower, "Use your Class Ability [M-e]"},*/ {'e', TRUE, enhance_weapon_skill, "Weapon Skills [M-k]"}, {'m', TRUE, domonability, "Use your Monster Ability [M-m]"}, {'o', FALSE, dosacrifice, "Offer a Sacrifice [M-o]"}, {'p', FALSE, dopay, "Pay the Shopkeeper"}, {'s', FALSE, dosit, "Sit down [M-s]"}, {'t', TRUE, dotele, "Controlled Teleport [C-t]"}, /* {'T', TRUE, doturn, "Turn Undead [M-t]"},*/ {'T', TRUE, dotech, "Use Techniques [M-t]"}, {'x', TRUE, doattributes, "Show attributes"}, {'y', TRUE, polyatwill, "Self-Polymorph [M-y]"}, {0,0,0,0} }; #ifdef WIZARD static const struct menu_tab wizard_menu[] = { {'c', TRUE, wiz_gain_ac, "Increase AC"}, #ifdef DISPLAY_LAYERS {'d', TRUE, wiz_show_display, "Detail display layers"}, #endif {'e', TRUE, wiz_detect, "Detect secret doors and traps"}, {'f', TRUE, wiz_map, "Do magic mapping"}, {'g', TRUE, wiz_genesis, "Create monster"}, {'i', TRUE, wiz_identify, "Identify items in pack"}, {'j', TRUE, wiz_gain_level, "Go up an experience level"}, {'n', TRUE, wiz_toggle_invulnerability, "Toggle invulnerability"}, {'o', TRUE, wiz_where, "Tell locations of special levels"}, {'v', TRUE, wiz_level_tele, "Do trans-level teleport"}, {'w', TRUE, wiz_wish, "Make wish"}, {'L', TRUE, wiz_light_sources, "show mobile light sources"}, {'M', TRUE, wiz_show_stats, "show memory statistics"}, {'S', TRUE, wiz_show_seenv, "show seen vectors"}, {'T', TRUE, wiz_timeout_queue, "look at timeout queue"}, {'V', TRUE, wiz_show_vision, "show vision array"}, {'W', TRUE, wiz_show_wmodes, "show wall modes"}, #ifdef DEBUG {'&', TRUE, wiz_debug_cmd, "wizard debug command"}, #endif {0,0,0,0,0}, }; #endif static const struct menu_tab help_menu[] = { {'?', TRUE, dohelp, "Help Contents"}, {'v', TRUE, doextversion, "Version"}, {'/', TRUE, dowhatis, "Identify an object on the screen" }, {'&', TRUE, dowhatdoes, "Determine what a key does"}, {0,0,0,0,0}, }; static const struct menu_tab main_menu[] = { {'g', TRUE, (void *)0, "Game"}, {'i', TRUE, (void *)0, "Inventory"}, {'a', TRUE, (void *)0, "Action"}, {'p', TRUE, (void *)0, "Player"}, {'d', TRUE, (void *)0, "Discoveries"}, #ifdef WIZARD {'w', TRUE, (void *)0, "Wizard"}, #endif {'?', TRUE, (void *)0, "Help"}, {0,0,0,0}, }; static const struct menu_tab discover_menu[] = { {'X', TRUE, dovspell, "View known spells"}, /* Mike Stephenson */ {'d', TRUE, dodiscovered, "Items already discovered [\\]"}, /* Robert Viduya */ {'C', TRUE, do_mname, "Name a monster"}, {0,0,0,0}, }; static struct menu_list main_menustruct[] = { {"Game", "Main Menu", game_menu}, {"Inventory", "Main Menu", inv_menu}, {"Action", "Main Menu", action_menu}, {"Player", "Main Menu", player_menu}, {"Discoveries", "Main Menu", discover_menu}, #ifdef WIZARD {"Wizard", "Main Menu", wizard_menu}, #endif {"Help", "Main Menu", help_menu}, {"Main Menu",(char *)0, main_menu}, {0,0,0}, }; STATIC_PTR int makemenu(menuname, menu_struct) const char *menuname; struct menu_list menu_struct[]; { winid win; anything any; menu_item *selected; int n, i, NDECL((*func)); const struct menu_tab *current_menu; any.a_void = 0; win = create_nhwindow(NHW_MENU); start_menu(win); for (i = 0; menu_struct[i].m_header; i++) { if (strcmp(menu_struct[i].m_header,menuname)) continue; current_menu = menu_struct[i].m_menu; for (n = 0; current_menu[n].m_item; n++) { if (u.uburied && !current_menu[n].can_if_buried) continue; #ifdef WIZARD if (!wizard && !current_menu[n].m_funct && !strcmp(current_menu[n].m_item,"Wizard")) continue; #endif if (current_menu[n].m_char == (char)0) { any.a_int = 0; add_menu(win, NO_GLYPH, &any, 0, 0, ATR_BOLD, current_menu[n].m_item, MENU_UNSELECTED); continue; } any.a_int = n + 1; /* non-zero */ add_menu(win, NO_GLYPH, &any, current_menu[n].m_char, 0, ATR_NONE, current_menu[n].m_item, MENU_UNSELECTED); } break; } end_menu(win, menuname); n = select_menu(win, PICK_ONE, &selected); destroy_nhwindow(win); if (n > 0) { /* we discard 'const' because some compilers seem to have trouble with the pointer passed to set_occupation() */ i = selected[0].item.a_int - 1; func = current_menu[i].m_funct; if (current_menu[i].m_text && !occupation && multi) set_occupation(func, current_menu[i].m_text, multi); /*WAC catch void into makemenu */ if (func == (void *)0) return (makemenu(current_menu[i].m_item, menu_struct)); else return (*func)(); /* perform the command */ } else if (n < 0) { for (i = 0; menu_struct[i].m_header; i++){ if (menuname == menu_struct[i].m_header) { if (menu_struct[i].m_parent) return (makemenu(menu_struct[i].m_parent, menu_struct)); else return (0); } } } return 0; } STATIC_PTR int domenusystem() /* WAC add helpful menus ;B */ { return (makemenu("Main Menu", main_menustruct)); } /* KMH, #conduct * (shares enlightenment's tense handling) */ STATIC_PTR int doconduct() { show_conduct(0); return 0; } /* format increased damage or chance to hit */ static char * enlght_combatinc(inctyp, incamt, final, outbuf) const char *inctyp; int incamt, final; char *outbuf; { char numbuf[24]; const char *modif, *bonus; if (final #ifdef WIZARD || wizard #endif ) { Sprintf(numbuf, "%s%d", (incamt > 0) ? "+" : "", incamt); modif = (const char *) numbuf; } else { int absamt = abs(incamt); if (absamt <= 3) modif = "small"; else if (absamt <= 6) modif = "moderate"; else if (absamt <= 12) modif = "large"; else modif = "huge"; } bonus = (incamt > 0) ? "bonus" : "penalty"; /* "bonus to hit" vs "damage bonus" */ if (!strcmp(inctyp, "damage")) { const char *ctmp = inctyp; inctyp = bonus; bonus = ctmp; } Sprintf(outbuf, "%s %s %s", an(modif), bonus, inctyp); return outbuf; } void show_conduct(final) int final; { char buf[BUFSZ]; int ngenocided; /* Create the conduct window */ en_win = create_nhwindow(NHW_MENU); putstr(en_win, 0, "Voluntary challenges:"); putstr(en_win, 0, ""); if (!u.uconduct.food && !u.uconduct.unvegan) enl_msg(You_, "have gone", "went", " without food"); /* But beverages are okay */ else if (!u.uconduct.food) enl_msg(You_, "have gone", "went", " without eating"); /* But quaffing animal products (eg., blood) is okay */ else if (!u.uconduct.unvegan) you_have_X("followed a strict vegan diet"); else if (!u.uconduct.unvegetarian) you_have_been("vegetarian"); if (!u.uconduct.gnostic) you_have_been("an atheist"); if (!u.uconduct.weaphit) you_have_never("hit with a wielded weapon"); #ifdef WIZARD else if (wizard) { Sprintf(buf, "used a wielded weapon %ld time%s", u.uconduct.weaphit, plur(u.uconduct.weaphit)); you_have_X(buf); } #endif if (!u.uconduct.killer) you_have_been("a pacifist"); if (!u.uconduct.literate) you_have_been("illiterate"); #ifdef WIZARD else if (wizard) { Sprintf(buf, "read items or engraved %ld time%s", u.uconduct.literate, plur(u.uconduct.literate)); you_have_X(buf); } #endif ngenocided = num_genocides(); if (ngenocided == 0) { you_have_never("genocided any monsters"); } else { Sprintf(buf, "genocided %d type%s of monster%s", ngenocided, plur(ngenocided), plur(ngenocided)); you_have_X(buf); } if (!u.uconduct.polypiles) you_have_never("polymorphed an object"); #ifdef WIZARD else if (wizard) { Sprintf(buf, "polymorphed %ld item%s", u.uconduct.polypiles, plur(u.uconduct.polypiles)); you_have_X(buf); } #endif if (!u.uconduct.polyselfs) you_have_never("changed form"); #ifdef WIZARD else if (wizard) { Sprintf(buf, "changed form %ld time%s", u.uconduct.polyselfs, plur(u.uconduct.polyselfs)); you_have_X(buf); } #endif if (!u.uconduct.wishes) you_have_X("used no wishes"); else { Sprintf(buf, "used %ld wish%s", u.uconduct.wishes, (u.uconduct.wishes > 1L) ? "es" : ""); you_have_X(buf); if (!u.uconduct.wisharti) enl_msg(You_, "have not wished", "did not wish", " for any artifacts"); } if (!u.uconduct.celibacy) you_have_X("remained celibate"); #ifdef WIZARD else if (wizard) { Sprintf(buf, "your vow of celibacy %ld time%s", u.uconduct.celibacy, plur(u.uconduct.celibacy)); enl_msg(You_, "have broken ", "broke ", buf); } #endif /* Pop up the window and wait for a key */ display_nhwindow(en_win, TRUE); destroy_nhwindow(en_win); } #endif /* OVLB */ #ifdef OVL1 #ifndef M # ifndef NHSTDC # define M(c) (0x80 | (c)) # else # define M(c) ((c) - 128) # endif /* NHSTDC */ #endif #ifndef C #define C(c) (0x1f & (c)) #endif static const struct func_tab cmdlist[] = { {C('d'), FALSE, dokick}, /* "D" is for door!...? Msg is in dokick.c */ #ifdef WIZARD {C('b'), FALSE, playersteal}, /* BEGIN TSANTH'S CODE */ {C('c'), TRUE, wiz_gain_ac}, /* END TSANTH'S CODE */ {C('e'), TRUE, wiz_detect}, {C('f'), TRUE, wiz_map}, {C('g'), TRUE, wiz_genesis}, {C('i'), TRUE, wiz_identify}, {C('j'), TRUE, wiz_gain_level}, #endif {C('l'), TRUE, doredraw}, /* if number_pad is set */ #ifdef WIZARD /* BEGIN TSANTH'S CODE */ {C('n'), TRUE, wiz_toggle_invulnerability}, /* END TSANTH'S CODE */ {C('o'), TRUE, wiz_where}, #endif {C('p'), TRUE, doprev_message}, {C('q'), TRUE, done2}, {C('r'), TRUE, doredraw}, /* {C('s'), FALSE, specialpower},*/ {C('s'), TRUE, dosave}, {C('t'), TRUE, dotele}, #ifdef WIZARD {C('v'), TRUE, wiz_level_tele}, {C('w'), TRUE, wiz_wish}, #endif {C('x'), TRUE, doattributes}, {C('y'), TRUE, polyatwill}, #ifdef SUSPEND {C('z'), TRUE, dosuspend}, #endif {'a', FALSE, doapply}, {'A', FALSE, doddoremarm}, {M('a'), TRUE, doorganize}, /* 'b', 'B' : go sw */ #ifdef BORG {'B', TRUE, doborgtoggle}, /* [Tom] */ #endif {M('b'), FALSE, playersteal}, /* jla */ #if 0 {M('b'), FALSE, specialpower}, /* jla */ #endif {'c', FALSE, doclose}, {'C', TRUE, do_mname}, {M('c'), TRUE, dotalk}, {'d', FALSE, dodrop}, {'D', FALSE, doddrop}, {M('d'), FALSE, dodip}, {'e', FALSE, doeat}, {'E', FALSE, doengrave}, {M('e'), TRUE, enhance_weapon_skill}, {'f', FALSE, dofire}, /* 'F' : fight (one time) */ {M('f'), FALSE, doforce}, /* 'g', 'G' : multiple go */ /* 'h', 'H' : go west */ {'h', TRUE, dohelp}, /* if number_pad is set */ {'i', TRUE, ddoinv}, {'I', TRUE, dotypeinv}, /* Robert Viduya */ {M('i'), TRUE, doinvoke}, /* 'j', 'J', 'k', 'K', 'l', 'L', 'm', 'M', 'n', 'N' : move commands */ {'j', FALSE, dojump}, /* if number_pad is on */ {M('j'), FALSE, dojump}, {'k', FALSE, dokick}, /* if number_pad is on */ {'K', TRUE, dolistvanq}, /* if number_pad is on */ {M('k'), TRUE, enhance_weapon_skill}, {'l', FALSE, doloot}, /* if number_pad is on */ {M('l'), FALSE, doloot}, /* 'n' prefixes a count if number_pad is on */ {M('m'), TRUE, domonability}, {'N', TRUE, ddocall}, /* if number_pad is on */ {M('n'), TRUE, ddocall}, {'o', FALSE, doopen}, {'O', TRUE, doset}, {M('o'), FALSE, dosacrifice}, {'p', FALSE, dopay}, /*WAC replace with dowear*/ {'P', FALSE, doputon}, {M('p'), TRUE, dopray}, {'q', FALSE, dodrink}, {'Q', FALSE, dowieldquiver}, {M('q'), TRUE, done2}, {'r', FALSE, doread}, {'R', FALSE, doremring}, {M('r'), FALSE, dorub}, {'s', TRUE, dosearch, "searching"}, {'S', TRUE, dosave}, {M('s'), FALSE, dosit}, {'t', FALSE, dothrow}, {'T', FALSE, dotakeoff}, /* {M('t'), TRUE, doturn},*/ {M('t'), TRUE, dotech}, /* 'u', 'U' : go ne */ {'u', FALSE, dountrap}, /* if number_pad is on */ {M('u'), FALSE, dountrap}, {'v', TRUE, doversion}, {'V', TRUE, dohistory}, {M('v'), TRUE, doextversion}, /*replaced with dowear*/ {'w', FALSE, dowield}, {'W', FALSE, dowear}, {M('w'), FALSE, dowipe}, {'x', FALSE, doswapweapon}, /* [Tom] */ {'X', TRUE, enter_explore_mode}, #if 0 {M('x'), TRUE, dovspell}, /* Mike Stephenson */ #endif /* 'y', 'Y' : go nw */ {M('y'), FALSE, polyatwill}, /* jla */ {'z', FALSE, dozap}, {'Z', TRUE, docast}, {'<', FALSE, doup}, {'>', FALSE, dodown}, {'/', TRUE, dowhatis}, {'&', TRUE, dowhatdoes}, {'?', TRUE, dohelp}, {M('?'), TRUE, doextlist}, #ifdef SHELL {'!', TRUE, dosh}, #endif {'.', TRUE, donull, "waiting"}, {' ', TRUE, donull, "waiting"}, {',', FALSE, dopickup}, {':', TRUE, dolook}, {';', TRUE, doquickwhatis}, {'^', TRUE, doidtrap}, {'\\', TRUE, dodiscovered}, /* Robert Viduya */ {'@', TRUE, dotogglepickup}, {M('2'), FALSE, dotwoweapon}, /* WAC Angband style items in use, menusystem {'*', TRUE, doinvinuse}, */ {'`', TRUE, domenusystem}, {'~', TRUE, domenusystem}, {WEAPON_SYM, TRUE, doprwep}, {ARMOR_SYM, TRUE, doprarm}, {RING_SYM, TRUE, doprring}, {AMULET_SYM, TRUE, dopramulet}, {TOOL_SYM, TRUE, doprtool}, {'*', TRUE, doprinuse}, /* inventory of all equipment in use */ {GOLD_SYM, TRUE, doprgold}, {SPBOOK_SYM, TRUE, dovspell}, /* Mike Stephenson */ {'#', TRUE, doextcmd}, {'_', TRUE, dotravel}, {0,0,0,0} }; struct ext_func_tab extcmdlist[] = { {"2weapon", "toggle two-weapon combat", dotwoweapon, FALSE}, {"adjust", "adjust inventory letters", doorganize, TRUE}, {"borrow", "steal from monsters", playersteal, FALSE}, /* jla */ {"chat", "talk to someone", dotalk, TRUE}, /* converse? */ {"conduct", "list which challenges you have adhered to", doconduct, TRUE}, {"dip", "dip an object into something", dodip, FALSE}, {"enhance", "advance or check weapons skills", enhance_weapon_skill, TRUE}, #if 0 {"ethics", "list which challenges you have adhered to", doethics, TRUE}, #endif {"explore", "enter explore mode", enter_explore_mode, TRUE}, {"force", "force a lock", doforce, FALSE}, {"invoke", "invoke an object's powers", doinvoke, TRUE}, {"jump", "jump to a location", dojump, FALSE}, {"loot", "loot a box on the floor", doloot, FALSE}, {"monster", "use a monster's special ability", domonability, TRUE}, {"name", "name an item or type of object", ddocall, TRUE}, {"offer", "offer a sacrifice to the gods", dosacrifice, FALSE}, {"pray", "pray to the gods for help", dopray, TRUE}, {"quit", "exit without saving current game", done2, TRUE}, #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}, #ifdef SHOUT {"shout", "say something loud", doyell, TRUE}, /* jrn */ #endif {"technique", "perform a technique", dotech, TRUE}, {"turn", "turn undead", doturn, TRUE}, {"twoweapon", "toggle two-weapon combat", dotwoweapon, FALSE}, {"untrap", "untrap something", dountrap, FALSE}, {"vanquished", "list vanquished monsters", dolistvanq, TRUE}, {"version", "list compile time options for this version of Slash'EM", doextversion, TRUE}, {"wipe", "wipe off your face", dowipe, FALSE}, {"youpoly", "polymorph at will", polyatwill, FALSE}, /* jla */ {"?", "get this list of extended commands", doextlist, TRUE}, #if defined(WIZARD) /* * There must be a blank entry here for every entry in the table * below. */ #ifdef DISPLAY_LAYERS {(char *)0, (char *)0, donull, TRUE}, #endif {(char *)0, (char *)0, donull, TRUE}, {(char *)0, (char *)0, donull, TRUE}, #ifdef DEBUG_MIGRATING_MONS {(char *)0, (char *)0, donull, TRUE}, #endif {(char *)0, (char *)0, donull, TRUE}, {(char *)0, (char *)0, donull, TRUE}, #ifdef PORT_DEBUG {(char *)0, (char *)0, donull, TRUE}, #endif {(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 {(char *)0, (char *)0, donull, TRUE}, #endif {(char *)0, (char *)0, donull, TRUE} /* sentinel */ }; #if defined(WIZARD) static const struct ext_func_tab debug_extcmdlist[] = { #ifdef DISPLAY_LAYERS {"display", "detail display layers", wiz_show_display, TRUE}, #endif {"levelchange", "change experience level", wiz_level_change, TRUE}, {"lightsources", "show mobile light sources", wiz_light_sources, TRUE}, #ifdef DEBUG_MIGRATING_MONS {"migratemons", "migrate n random monsters", wiz_migrate_mons, TRUE}, #endif {"monpolycontrol", "control monster polymorphs", wiz_mon_polycontrol, TRUE}, {"panic", "test panic routine (fatal to game)", wiz_panic, TRUE}, {"polyself", "polymorph self", wiz_polyself, TRUE}, #ifdef PORT_DEBUG {"portdebug", "wizard port debug command", wiz_port_debug, TRUE}, #endif {"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}, {"vision", "show vision array", wiz_show_vision, TRUE}, #ifdef DEBUG {"wizdebug", "wizard debug command", wiz_debug_cmd, TRUE}, #endif {"wmode", "show wall modes", wiz_show_wmodes, TRUE}, {(char *)0, (char *)0, donull, TRUE} }; /* * Insert debug commands into the extended command list. This function * assumes that the last entry will be the help entry. * * You must add entries in ext_func_tab every time you add one to the * debug_extcmdlist(). */ void add_debug_extended_commands() { int i, j, k, n; /* count the # of help entries */ for (n = 0; extcmdlist[n].ef_txt[0] != '?'; n++) ; for (i = 0; debug_extcmdlist[i].ef_txt; i++) { for (j = 0; j < n; j++) if (strcmp(debug_extcmdlist[i].ef_txt, extcmdlist[j].ef_txt) < 0) break; /* insert i'th debug entry into extcmdlist[j], pushing down */ for (k = n; k >= j; --k) extcmdlist[k+1] = extcmdlist[k]; extcmdlist[j] = debug_extcmdlist[i]; n++; /* now an extra entry */ } } static const char template[] = "%-18s %4ld %6ld"; static const char count_str[] = " count bytes"; static const char separator[] = "------------------ ----- ------"; STATIC_OVL void count_obj(chain, total_count, total_size, top, recurse) struct obj *chain; long *total_count; long *total_size; boolean top; boolean recurse; { long count, size; struct obj *obj; for (count = size = 0, obj = chain; obj; obj = obj->nobj) { if (top) { count++; size += sizeof(struct obj) + obj->oxlth + obj->onamelth; } if (recurse && obj->cobj) count_obj(obj->cobj, total_count, total_size, TRUE, TRUE); } *total_count += count; *total_size += size; } STATIC_OVL void obj_chain(win, src, chain, total_count, total_size) winid win; const char *src; struct obj *chain; long *total_count; long *total_size; { char buf[BUFSZ]; long count = 0, size = 0; count_obj(chain, &count, &size, TRUE, FALSE); *total_count += count; *total_size += size; Sprintf(buf, template, src, count, size); putstr(win, 0, buf); } STATIC_OVL void mon_invent_chain(win, src, chain, total_count, total_size) winid win; const char *src; struct monst *chain; long *total_count; long *total_size; { char buf[BUFSZ]; long count = 0, size = 0; struct monst *mon; for (mon = chain; mon; mon = mon->nmon) count_obj(mon->minvent, &count, &size, TRUE, FALSE); *total_count += count; *total_size += size; Sprintf(buf, template, src, count, size); putstr(win, 0, buf); } STATIC_OVL void contained(win, src, total_count, total_size) winid win; const char *src; long *total_count; long *total_size; { char buf[BUFSZ]; long count = 0, size = 0; struct monst *mon; count_obj(invent, &count, &size, FALSE, TRUE); count_obj(fobj, &count, &size, FALSE, TRUE); count_obj(level.buriedobjlist, &count, &size, FALSE, TRUE); count_obj(migrating_objs, &count, &size, FALSE, TRUE); /* DEADMONSTER check not required in this loop since they have no inventory */ for (mon = fmon; mon; mon = mon->nmon) count_obj(mon->minvent, &count, &size, FALSE, TRUE); for (mon = migrating_mons; mon; mon = mon->nmon) count_obj(mon->minvent, &count, &size, FALSE, TRUE); *total_count += count; *total_size += size; Sprintf(buf, template, src, count, size); putstr(win, 0, buf); } STATIC_OVL void mon_chain(win, src, chain, total_count, total_size) winid win; const char *src; struct monst *chain; long *total_count; long *total_size; { char buf[BUFSZ]; long count, size; struct monst *mon; for (count = size = 0, mon = chain; mon; mon = mon->nmon) { count++; size += sizeof(struct monst) + mon->mxlth + mon->mnamelth; } *total_count += count; *total_size += size; Sprintf(buf, template, src, count, size); putstr(win, 0, buf); } /* * Display memory usage of all monsters and objects on the level. */ static int wiz_show_stats() { char buf[BUFSZ]; winid win; long total_obj_size = 0, total_obj_count = 0; long total_mon_size = 0, total_mon_count = 0; win = create_nhwindow(NHW_TEXT); putstr(win, 0, "Current memory statistics:"); putstr(win, 0, ""); Sprintf(buf, "Objects, size %d", (int) sizeof(struct obj)); putstr(win, 0, buf); putstr(win, 0, ""); putstr(win, 0, count_str); obj_chain(win, "invent", invent, &total_obj_count, &total_obj_size); obj_chain(win, "fobj", fobj, &total_obj_count, &total_obj_size); obj_chain(win, "buried", level.buriedobjlist, &total_obj_count, &total_obj_size); obj_chain(win, "migrating obj", migrating_objs, &total_obj_count, &total_obj_size); mon_invent_chain(win, "minvent", fmon, &total_obj_count,&total_obj_size); mon_invent_chain(win, "migrating minvent", migrating_mons, &total_obj_count, &total_obj_size); contained(win, "contained", &total_obj_count, &total_obj_size); putstr(win, 0, separator); Sprintf(buf, template, "Total", total_obj_count, total_obj_size); putstr(win, 0, buf); putstr(win, 0, ""); putstr(win, 0, ""); Sprintf(buf, "Monsters, size %d", (int) sizeof(struct monst)); putstr(win, 0, buf); putstr(win, 0, ""); mon_chain(win, "fmon", fmon, &total_mon_count, &total_mon_size); mon_chain(win, "migrating", migrating_mons, &total_mon_count, &total_mon_size); putstr(win, 0, separator); Sprintf(buf, template, "Total", total_mon_count, total_mon_size); putstr(win, 0, buf); #if defined(__BORLANDC__) && !defined(_WIN32) show_borlandc_stats(win); #endif display_nhwindow(win, FALSE); destroy_nhwindow(win); return 0; } void sanity_check() { obj_sanity_check(); timer_sanity_check(); } #ifdef DISPLAY_LAYERS /* * Detail contents of each display layer at specified location(s). */ static int wiz_show_display() { int ans, glyph; coord cc; winid win; char buf[BUFSZ]; struct rm *lev; cc.x = u.ux; cc.y = u.uy; pline("Pick a location."); ans = getpos(&cc, FALSE, "a location of interest"); if (ans < 0 || cc.x < 0) return 0; /* done */ lev = &levl[cc.x][cc.y]; win = create_nhwindow(NHW_MENU); Sprintf(buf, "Contents of hero's memory at (%d, %d):", cc.x, cc.y); putstr(win, 0, buf); putstr(win, 0, ""); Sprintf(buf, "Invisible monster: %s", lev->mem_invis ? "present" : "none"); putstr(win, 0, buf); if (lev->mem_obj && lev->mem_corpse) if (mons[lev->mem_obj - 1].geno & G_UNIQ) Sprintf(buf, "Object: %s%s corpse", type_is_pname(&mons[lev->mem_obj - 1]) ? "" : "the ", s_suffix(mons[lev->mem_obj - 1].mname)); else Sprintf(buf, "Object: %s corpse", mons[lev->mem_obj - 1].mname); else Sprintf(buf, "Object: %s", lev->mem_obj ? obj_typename(lev->mem_obj - 1) : "none"); putstr(win, 0, buf); Sprintf(buf, "Trap: %s", lev->mem_trap ? defsyms[trap_to_defsym(lev->mem_trap)].explanation : "none"); putstr(win, 0, buf); Sprintf(buf, "Backgroud: %s", defsyms[lev->mem_bg].explanation); putstr(win, 0, buf); putstr(win, 0, ""); glyph = glyph_at(cc.x, cc.y); Sprintf(buf, "Buffered (3rd screen): "); if (glyph_is_monster(glyph)) { Strcat(buf, mons[glyph_to_mon(glyph)].mname); if (glyph_is_pet(glyph)) Strcat(buf, " (tame)"); if (glyph_is_ridden_monster(glyph)) Strcat(buf, " (ridden)"); if (glyph_is_detected_monster(glyph)) Strcat(buf, " (detected)"); } else if (glyph_is_object(glyph)) { if (glyph_is_body(glyph)) { int corpse = glyph_to_body(glyph); if (mons[corpse].geno & G_UNIQ) Sprintf(eos(buf), "%s%s corpse", type_is_pname(&mons[corpse]) ? "" : "the ", s_suffix(mons[corpse].mname)); else Sprintf(eos(buf), "%s corpse", mons[corpse].mname); } else Strcat(buf, obj_typename(glyph_to_obj(glyph))); } else if (glyph_is_invisible(glyph)) Strcat(buf, "invisible monster"); else if (glyph_is_cmap(glyph)) Strcat(buf, defsyms[glyph_to_cmap(glyph)].explanation); else Sprintf(eos(buf), "[%d]", glyph); putstr(win, 0, buf); display_nhwindow(win, FALSE); destroy_nhwindow(win); return 0; } #endif #ifdef DEBUG_MIGRATING_MONS static int wiz_migrate_mons() { int mcount = 0; char inbuf[BUFSZ]; struct permonst *ptr; struct monst *mtmp; d_level tolevel; getlin("How many random monsters to migrate? [0]", inbuf); if (*inbuf == '\033') return 0; mcount = atoi(inbuf); if (mcount < 0 || mcount > (COLNO * ROWNO) || Is_botlevel(&u.uz)) return 0; while (mcount > 0) { if (Is_stronghold(&u.uz)) assign_level(&tolevel, &valley_level); else get_level(&tolevel, depth(&u.uz) + 1); ptr = rndmonst(); mtmp = makemon(ptr, 0, 0, NO_MM_FLAGS); if (mtmp) migrate_to_level(mtmp, ledger_no(&tolevel), MIGR_RANDOM, (coord *)0); mcount--; } return 0; } #endif #endif /* WIZARD */ #define unctrl(c) ((c) <= C('z') ? (0x60 | (c)) : (c)) #define unmeta(c) (0x7f & (c)) void rhack(cmd) register char *cmd; { boolean do_walk, do_rush, prefix_seen, bad_command, firsttime = (cmd == 0); iflags.menu_requested = FALSE; if (firsttime) { flags.nopick = 0; cmd = parse(); } if (*cmd == '\033') { /* key - user might be panicking */ /* Bring up the menu */ if (multi || !flags.menu_on_esc || !(domenusystem())) { flags.move = FALSE; multi = 0; } return; #if 0 flags.move = FALSE; return; #endif } #ifdef REDO if (*cmd == DOAGAIN && !in_doagain && saveq[0]) { in_doagain = TRUE; stail = 0; rhack((char *)0); /* read and execute command */ in_doagain = FALSE; return; } /* Special case of *cmd == ' ' handled better below */ if(!*cmd || *cmd == (char)0377) #else if(!*cmd || *cmd == (char)0377 || (!flags.rest_on_space && *cmd == ' ')) #endif { nhbell(); flags.move = FALSE; return; /* probably we just had an interrupt */ } if (iflags.num_pad && iflags.num_pad_mode == 1) { /* This handles very old inconsistent DOS/Windows behaviour * in a new way: earlier, the keyboard handler mapped these, * which caused counts to be strange when entered from the * number pad. Now do not map them until here. */ switch (*cmd) { case '5': *cmd = 'g'; break; case M('5'): *cmd = 'G'; break; case M('0'): *cmd = 'I'; break; } } /* handle most movement commands */ do_walk = do_rush = prefix_seen = FALSE; flags.travel = iflags.travel1 = 0; switch (*cmd) { case 'g': if (movecmd(cmd[1])) { flags.run = 2; do_rush = TRUE; } else prefix_seen = TRUE; break; case '5': if (!iflags.num_pad) break; /* else FALLTHRU */ case 'G': if (movecmd(lowc(cmd[1]))) { flags.run = 3; do_rush = TRUE; } else prefix_seen = TRUE; break; case '-': if (!iflags.num_pad) break; /* else FALLTHRU */ /* Effects of movement commands and invisible monsters: * m: always move onto space (even if 'I' remembered) * F: always attack space (even if 'I' not remembered) * normal movement: attack if 'I', move otherwise */ case 'F': if (movecmd(cmd[1])) { flags.forcefight = 1; do_walk = TRUE; } else prefix_seen = TRUE; break; case 'm': if (movecmd(cmd[1]) || u.dz) { flags.run = 0; flags.nopick = 1; if (!u.dz) do_walk = TRUE; else cmd[0] = cmd[1]; /* "m<" or "m>" */ } else prefix_seen = TRUE; break; case 'M': if (movecmd(lowc(cmd[1]))) { flags.run = 1; flags.nopick = 1; do_rush = TRUE; } else prefix_seen = TRUE; break; case '0': if (!iflags.num_pad) break; (void)ddoinv(); /* a convenience borrowed from the PC */ flags.move = FALSE; multi = 0; return; case CMD_TRAVEL: if (iflags.travelcmd) { flags.travel = 1; iflags.travel1 = 1; flags.run = 8; flags.nopick = 1; do_rush = TRUE; break; } /*FALLTHRU*/ default: if (movecmd(*cmd)) { /* ordinary movement */ flags.run = 0; /* only matters here if it was 8 */ do_walk = TRUE; } else if (movecmd(iflags.num_pad ? unmeta(*cmd) : lowc(*cmd))) { flags.run = 1; do_rush = TRUE; } else if (movecmd(unctrl(*cmd))) { flags.run = 3; do_rush = TRUE; } break; } /* some special prefix handling */ /* overload 'm' prefix for ',' to mean "request a menu" */ if (prefix_seen && cmd[1] == ',') { iflags.menu_requested = TRUE; ++cmd; } if (do_walk) { if (multi) flags.mv = TRUE; domove(); flags.forcefight = 0; return; } else if (do_rush) { if (firsttime) { if (!multi) multi = max(COLNO,ROWNO); u.last_str_turn = 0; } flags.mv = TRUE; domove(); return; } else if (prefix_seen && cmd[1] == '\033') { /* */ /* don't report "unknown command" for change of heart... */ bad_command = FALSE; } else if (*cmd == ' ' && !flags.rest_on_space) { bad_command = TRUE; /* skip cmdlist[] loop */ /* handle all other commands */ } else { register const struct func_tab *tlist; int res, NDECL((*func)); for (tlist = cmdlist; tlist->f_char; tlist++) { if ((*cmd & 0xff) != (tlist->f_char & 0xff)) continue; if (u.uburied && !tlist->can_if_buried) { You_cant("do that while you are buried!"); res = 0; } else { /* we discard 'const' because some compilers seem to have trouble with the pointer passed to set_occupation() */ func = ((struct func_tab *)tlist)->f_funct; if (tlist->f_text && !occupation && multi) set_occupation(func, tlist->f_text, multi); res = (*func)(); /* perform the command */ } if (!res) { flags.move = FALSE; multi = 0; } return; } /* if we reach here, cmd wasn't found in cmdlist[] */ bad_command = TRUE; } if (bad_command) { char expcmd[10]; register char *cp = expcmd; while (*cmd && (int)(cp - expcmd) < (int)(sizeof expcmd - 3)) { if (*cmd >= 040 && *cmd < 0177) { *cp++ = *cmd++; } else if (*cmd & 0200) { *cp++ = 'M'; *cp++ = '-'; *cp++ = *cmd++ &= ~0200; } else { *cp++ = '^'; *cp++ = *cmd++ ^ 0100; } } *cp = '\0'; if (!prefix_seen || !iflags.cmdassist || !help_dir(0, "Invalid direction key!")) Norep("Unknown command '%s'.", expcmd); } /* didn't move */ flags.move = FALSE; multi = 0; return; } int xytod(x, y) /* convert an x,y pair into a direction code */ schar x, y; { register int dd; for(dd = 0; dd < 8; dd++) if(x == xdir[dd] && y == ydir[dd]) return dd; return -1; } void dtoxy(cc,dd) /* convert a direction code into an x,y pair */ coord *cc; register int dd; { cc->x = xdir[dd]; cc->y = ydir[dd]; return; } int movecmd(sym) /* also sets u.dz, but returns false for <> */ char sym; { register const char *dp; register const char *sdp; if(iflags.num_pad) sdp = ndir; else sdp = sdir; /* DICE workaround */ u.dz = 0; if(!(dp = index(sdp, sym))) return 0; u.dx = xdir[dp-sdp]; u.dy = ydir[dp-sdp]; u.dz = zdir[dp-sdp]; if (u.dx && u.dy && u.umonnum == PM_GRID_BUG) { u.dx = u.dy = 0; return 0; } return !u.dz; } /* * uses getdir() but unlike getdir() it specifically * produces coordinates using the direction from getdir() * and verifies that those coordinates are ok. * * If the call to getdir() returns 0, Never_mind is displayed. * If the resulting coordinates are not okay, emsg is displayed. * * Returns non-zero if coordinates in cc are valid. */ int get_adjacent_loc(prompt,emsg,x,y,cc) const char *prompt, *emsg; xchar x,y; coord *cc; { xchar new_x, new_y; if (!getdir(prompt)) { pline(Never_mind); return 0; } new_x = x + u.dx; new_y = y + u.dy; if (cc && isok(new_x,new_y)) { cc->x = new_x; cc->y = new_y; } else { if (emsg) pline(emsg); return 0; } return 1; } int getdir(s) const char *s; { char dirsym; /* WAC add dirsymbols to generic prompt */ char buf[BUFSZ]; Sprintf(buf, "In what direction? [%s]", (iflags.num_pad ? ndir : sdir)); #ifdef REDO if(in_doagain || *readchar_queue) dirsym = readchar(); else #endif do { dirsym = yn_function ((s && *s != '^') ? s : buf, (char *)0, '\0'); } while (!movecmd(dirsym) && !index(quitchars, dirsym) && dirsym == '.' && dirsym == 's' && !u.dz); #ifdef REDO savech(dirsym); #endif if(dirsym == '.' || dirsym == 's') u.dx = u.dy = u.dz = 0; else if(!movecmd(dirsym) && !u.dz) { boolean did_help = FALSE; if(!index(quitchars, dirsym)) { if (iflags.cmdassist) { did_help = help_dir((s && *s == '^') ? dirsym : 0, "Invalid direction key!"); } if (!did_help) pline("What a strange direction!"); } return 0; } if(!u.dz && (Stunned || (Confusion && !rn2(5)))) confdir(); return 1; } STATIC_OVL boolean help_dir(sym, msg) char sym; const char *msg; { char ctrl; winid win; static const char wiz_only_list[] = "EFGIOVW"; char buf[BUFSZ], buf2[BUFSZ], *expln; win = create_nhwindow(NHW_TEXT); if (!win) return FALSE; if (msg) { Sprintf(buf, "cmdassist: %s", msg); putstr(win, 0, buf); putstr(win, 0, ""); } if (letter(sym)) { sym = highc(sym); ctrl = (sym - 'A') + 1; if ((expln = dowhatdoes_core(ctrl, buf2)) && (!index(wiz_only_list, sym) #ifdef WIZARD || wizard #endif )) { Sprintf(buf, "Are you trying to use ^%c%s?", sym, index(wiz_only_list, sym) ? "" : " as specified in the Guidebook"); putstr(win, 0, buf); putstr(win, 0, ""); putstr(win, 0, expln); putstr(win, 0, ""); putstr(win, 0, "To use that command, you press"); Sprintf(buf, "the key, and the <%c> key at the same time.", sym); putstr(win, 0, buf); putstr(win, 0, ""); } } if (iflags.num_pad && u.umonnum == PM_GRID_BUG) { putstr(win, 0, "Valid direction keys in your current form (with number_pad on) are:"); putstr(win, 0, " 8 "); putstr(win, 0, " | "); putstr(win, 0, " 4- . -6"); putstr(win, 0, " | "); putstr(win, 0, " 2 "); } else if (u.umonnum == PM_GRID_BUG) { putstr(win, 0, "Valid direction keys in your current form are:"); putstr(win, 0, " k "); putstr(win, 0, " | "); putstr(win, 0, " h- . -l"); putstr(win, 0, " | "); putstr(win, 0, " j "); } else if (iflags.num_pad) { putstr(win, 0, "Valid direction keys (with number_pad on) are:"); putstr(win, 0, " 7 8 9"); putstr(win, 0, " \\ | / "); putstr(win, 0, " 4- . -6"); putstr(win, 0, " / | \\ "); putstr(win, 0, " 1 2 3"); } else { putstr(win, 0, "Valid direction keys are:"); putstr(win, 0, " y k u"); putstr(win, 0, " \\ | / "); putstr(win, 0, " h- . -l"); putstr(win, 0, " / | \\ "); putstr(win, 0, " b j n"); }; putstr(win, 0, ""); putstr(win, 0, " < up"); putstr(win, 0, " > down"); putstr(win, 0, " . direct at yourself"); putstr(win, 0, ""); putstr(win, 0, "(Suppress this message with !cmdassist in config file.)"); display_nhwindow(win, FALSE); destroy_nhwindow(win); return TRUE; } #endif /* OVL1 */ #ifdef OVLB void confdir() { register int x = (u.umonnum == PM_GRID_BUG) ? 2*rn2(4) : rn2(8); u.dx = xdir[x]; u.dy = ydir[x]; return; } #endif /* OVLB */ #ifdef OVL0 int isok(x,y) register int x, y; { /* x corresponds to curx, so x==1 is the first column. Ach. %% */ return x >= 1 && x <= COLNO-1 && y >= 0 && y <= ROWNO-1; } static NEARDATA int last_multi; /* * 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 (iflags.travelcmd) { 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, TEST_MOVE)) { 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; } } } else { /* 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 "."; dir = xytod(x, y); } /* 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 * parse() { #ifdef LINT /* static char in_line[COLNO]; */ char in_line[COLNO]; #else static char in_line[COLNO]; #endif register int foo; #ifdef BORG char junk_char; #endif static char repeat_char; boolean prezero = FALSE; multi = 0; flags.move = 1; flush_screen(1); /* Flush screen buffer. Put the cursor on the hero. */ #ifdef BORG if (borg_on) { /* KMH -- Danger! kbhit() is non-standard! */ if (!kbhit()) { borg_input(); return(borg_line); } else { junk_char = readchar(); pline("Cyborg terminated."); borg_on = 0; } } else #endif /* [Tom] for those who occasionally go insane... */ if (repeat_hit) { /* Sanity checks for repeat_hit */ if (repeat_hit < 0) repeat_hit = 0; else { /* Don't want things to get too out of hand */ if (repeat_hit > 10) repeat_hit = 10; repeat_hit--; in_line[0] = repeat_char; in_line[1] = 0; return (in_line); } } if (!iflags.num_pad || (foo = readchar()) == 'n') for (;;) { foo = readchar(); if (foo >= '0' && foo <= '9') { multi = 10 * multi + foo - '0'; if (multi < 0 || multi >= LARGEST_INT) multi = LARGEST_INT; if (multi > 9) { clear_nhwindow(WIN_MESSAGE); Sprintf(in_line, "Count: %d", multi); pline(in_line); mark_synch(); } last_multi = multi; if (!multi && foo == '0') prezero = TRUE; } else break; /* not a digit */ } if (foo == '\033') { /* esc cancels count (TH) */ clear_nhwindow(WIN_MESSAGE); /* multi = */ last_multi = 0; /* WAC multi is cleared later in rhack */ # ifdef REDO } else if (foo == DOAGAIN || in_doagain) { multi = last_multi; } else { last_multi = multi; savech(0); /* reset input queue */ savech((char)foo); # endif } if (multi) { multi--; save_cm = in_line; } else { save_cm = (char *)0; } in_line[0] = foo; in_line[1] = '\0'; if (foo == 'g' || foo == 'G' || foo == 'm' || foo == 'M' || foo == 'F' || (iflags.num_pad && (foo == '5' || foo == '-'))) { foo = readchar(); #ifdef REDO savech((char)foo); #endif in_line[1] = foo; in_line[2] = 0; } clear_nhwindow(WIN_MESSAGE); if (prezero) in_line[0] = '\033'; repeat_char = in_line[0]; return(in_line); } #endif /* OVL0 */ #ifdef OVLB #ifdef UNIX static void end_of_input() { #ifndef NOSAVEONHANGUP if (!program_state.done_hup++ && program_state.something_worth_saving) (void) dosave0(); #endif exit_nhwindows((char *)0); clearlocks(); terminate(EXIT_SUCCESS); } #endif #endif /* OVLB */ #ifdef OVL0 char readchar() { 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 # ifdef NR_OF_EOFS if (sym == EOF) { register int cnt = NR_OF_EOFS; /* * Some SYSV systems seem to return EOFs for various reasons * (?like when one hits break or for interrupted systemcalls?), * and we must see several before we quit. */ do { clearerr(stdin); /* omit if clearerr is undefined */ sym = Getchar(); } while (--cnt && sym == EOF); } # endif /* NR_OF_EOFS */ if (sym == EOF) 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; if (!iflags.travelcmd) return 0; cmd[1]=0; cc.x = iflags.travelcc.x; cc.y = iflags.travelcc.y; if (cc.x == -1 && cc.y == -1) { /* No cached destination, start attempt from current position */ 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; } iflags.travelcc.x = u.tx = cc.x; iflags.travelcc.y = u.ty = cc.y; cmd[0] = CMD_TRAVEL; readchar_queue = cmd; return 0; } #ifdef PORT_DEBUG # ifdef WIN32CON extern void NDECL(win32con_debug_keystrokes); extern void NDECL(win32con_handler_info); # endif int wiz_port_debug() { int n, k; winid win; anything any; int item = 'a'; int num_menu_selections; struct menu_selection_struct { char *menutext; char *portname; void NDECL((*fn)); } menu_selections[] = { #ifdef WIN32CON {"test win32 keystrokes", "tty", win32con_debug_keystrokes}, {"show keystroke handler information", "tty", win32con_handler_info}, #endif {(char *)0, (char *)0, (void NDECL((*)))0}/* array terminator */ }; num_menu_selections = SIZE(menu_selections) - 1; for (k=n=0; k < num_menu_selections; ++k) if (!strcmp(menu_selections[k].portname, windowprocs.name)) n++; if (n > 0) { menu_item *pick_list; win = create_nhwindow(NHW_MENU); start_menu(win); for (k=0; k < num_menu_selections; ++k) { if (strcmp(menu_selections[k].portname, windowprocs.name)) continue; any.a_int = k+1; add_menu(win, NO_GLYPH, &any, item++, 0, ATR_NONE, menu_selections[k].menutext, MENU_UNSELECTED); } end_menu(win, "Which port debugging feature?"); n = select_menu(win, PICK_ONE, &pick_list); destroy_nhwindow(win); if (n > 0) { n = pick_list[0].item.a_int - 1; free((genericptr_t) pick_list); /* execute the function */ (*menu_selections[n].fn)(); } } else pline("No port-specific debug capability defined."); return 0; } # endif /*PORT_DEBUG*/ #endif /* OVL0 */ #ifdef OVLB /* * Parameter validator for generic yes/no function to prevent * the core from sending too long a prompt string to the * window port causing a buffer overflow there. */ char yn_function(query,resp, def) const char *query,*resp; char def; { char qbuf[QBUFSZ]; unsigned truncspot, reduction = sizeof(" [N] ?") + 1; if (resp) reduction += strlen(resp) + sizeof(" () "); if (strlen(query) < (QBUFSZ - reduction)) return (*windowprocs.win_yn_function)(query, resp, def); paniclog("Query truncated: ", query); reduction += sizeof("..."); truncspot = QBUFSZ - reduction; (void) strncpy(qbuf, query, (int)truncspot); qbuf[truncspot] = '\0'; Strcat(qbuf,"..."); return (*windowprocs.win_yn_function)(qbuf, resp, def); } #endif /*cmd.c*/ slashem-0.0.7E7F3/src/pline.c0000664000076400007640000002471110545462317013723 0ustar aliali/* 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 static boolean no_repeat = FALSE; static char *FDECL(You_buf, (int)); /*VARARGS1*/ /* Note that these declarations rely on knowledge of the internals * of the variable argument handling stuff in "tradstdc.h" */ #if defined(USE_STDARG) || defined(USE_VARARGS) static void FDECL(vpline, (const char *, va_list)); void pline VA_DECL(const char *, line) VA_START(line); VA_INIT(line, char *); vpline(line, VA_ARGS); VA_END(); } # ifdef USE_STDARG static void vpline(const char *line, va_list the_args) { # else static void vpline(line, the_args) const char *line; va_list the_args; { # endif #else /* USE_STDARG | USE_VARARG */ #define vpline pline void pline VA_DECL(const char *, line) #endif /* USE_STDARG | USE_VARARG */ char pbuf[BUFSZ]; /* Do NOT use VA_START and VA_END in here... see above */ if (!line || !*line) return; if (index(line, '%')) { Vsprintf(pbuf,line,VA_ARGS); line = pbuf; } if (!iflags.window_inited) { raw_print(line); return; } #ifndef MAC if (no_repeat && !strcmp(line, toplines)) return; #endif /* MAC */ if (vision_full_recalc) vision_recalc(0); if (u.ux) flush_screen(1); /* %% */ putstr(WIN_MESSAGE, 0, line); } /*VARARGS1*/ void Norep VA_DECL(const char *, line) VA_START(line); VA_INIT(line, const char *); no_repeat = TRUE; vpline(line, VA_ARGS); no_repeat = FALSE; VA_END(); return; } /* work buffer for You(), &c and verbalize() */ static char *you_buf = 0; static int you_buf_siz = 0; static char * You_buf(siz) int siz; { if (siz > you_buf_siz) { if (you_buf) free((genericptr_t) you_buf); you_buf_siz = siz + 10; you_buf = (char *) alloc((unsigned) you_buf_siz); } return you_buf; } void free_youbuf() { if (you_buf) free((genericptr_t) you_buf), you_buf = (char *)0; you_buf_siz = 0; } /* `prefix' must be a string literal, not a pointer */ #define YouPrefix(pointer,prefix,text) \ Strcpy((pointer = You_buf((int)(strlen(text) + sizeof prefix))), prefix) #define YouMessage(pointer,prefix,text) \ strcat((YouPrefix(pointer, prefix, text), pointer), text) /*VARARGS1*/ void You VA_DECL(const char *, line) char *tmp; VA_START(line); VA_INIT(line, const char *); vpline(YouMessage(tmp, "You ", line), VA_ARGS); VA_END(); } /*VARARGS1*/ void Your VA_DECL(const char *,line) char *tmp; VA_START(line); VA_INIT(line, const char *); vpline(YouMessage(tmp, "Your ", line), VA_ARGS); VA_END(); } /*VARARGS1*/ void You_feel VA_DECL(const char *,line) char *tmp; VA_START(line); VA_INIT(line, const char *); vpline(YouMessage(tmp, "You feel ", line), VA_ARGS); VA_END(); } /*VARARGS1*/ void You_cant VA_DECL(const char *,line) char *tmp; VA_START(line); VA_INIT(line, const char *); vpline(YouMessage(tmp, "You can't ", line), VA_ARGS); VA_END(); } /*VARARGS1*/ void pline_The VA_DECL(const char *,line) char *tmp; VA_START(line); VA_INIT(line, const char *); vpline(YouMessage(tmp, "The ", line), VA_ARGS); VA_END(); } /*VARARGS1*/ void There VA_DECL(const char *,line) char *tmp; VA_START(line); VA_INIT(line, const char *); vpline(YouMessage(tmp, "There ", line), VA_ARGS); VA_END(); } /*VARARGS1*/ void You_hear VA_DECL(const char *,line) char *tmp; VA_START(line); VA_INIT(line, const char *); if (Underwater) YouPrefix(tmp, "You barely hear ", line); else if (u.usleep) YouPrefix(tmp, "You dream that you hear ", line); else YouPrefix(tmp, "You hear ", line); vpline(strcat(tmp, line), VA_ARGS); VA_END(); } /*VARARGS1*/ void verbalize VA_DECL(const char *,line) char *tmp; if (!flags.soundok) return; VA_START(line); VA_INIT(line, const char *); tmp = You_buf((int)strlen(line) + sizeof "\"\""); Strcpy(tmp, "\""); Strcat(tmp, line); Strcat(tmp, "\""); vpline(tmp, VA_ARGS); VA_END(); } /*VARARGS1*/ /* Note that these declarations rely on knowledge of the internals * of the variable argument handling stuff in "tradstdc.h" */ #if defined(USE_STDARG) || defined(USE_VARARGS) static void FDECL(vraw_printf,(const char *,va_list)); void raw_printf VA_DECL(const char *, line) VA_START(line); VA_INIT(line, char *); vraw_printf(line, VA_ARGS); VA_END(); } # ifdef USE_STDARG static void vraw_printf(const char *line, va_list the_args) { # else static void vraw_printf(line, the_args) const char *line; va_list the_args; { # endif #else /* USE_STDARG | USE_VARARG */ void raw_printf VA_DECL(const char *, line) #endif /* Do NOT use VA_START and VA_END in here... see above */ if(!index(line, '%')) raw_print(line); else { char pbuf[BUFSZ]; Vsprintf(pbuf,line,VA_ARGS); raw_print(pbuf); } } /*VARARGS1*/ void impossible VA_DECL(const char *, s) VA_START(s); VA_INIT(s, const char *); if (program_state.in_impossible) panic("impossible called impossible"); program_state.in_impossible = 1; { char pbuf[BUFSZ]; Vsprintf(pbuf,s,VA_ARGS); paniclog("impossible", pbuf); } vpline(s,VA_ARGS); pline("Program in disorder - perhaps you'd better #quit."); program_state.in_impossible = 0; VA_END(); } const char * align_str(alignment) aligntyp alignment; { switch ((int)alignment) { case A_CHAOTIC: return "chaotic"; case A_NEUTRAL: return "neutral"; case A_LAWFUL: return "lawful"; case A_NONE: return "unaligned"; } return "unknown"; } void mstatusline(mtmp) register struct monst *mtmp; { aligntyp alignment; char info[BUFSZ], monnambuf[BUFSZ]; if (mtmp->ispriest || mtmp->data == &mons[PM_ALIGNED_PRIEST] || mtmp->data == &mons[PM_ANGEL]) alignment = EPRI(mtmp)->shralign; else alignment = mtmp->data->maligntyp; alignment = (alignment > 0) ? A_LAWFUL : (alignment < 0) ? A_CHAOTIC : A_NEUTRAL; 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"); else if (mtmp->mtraitor) Strcat(info, ", traitor"); if (mtmp->meating) Strcat(info, ", eating"); if (mtmp->mcan) Strcat(info, ", cancelled"); if (mtmp->mconf) Strcat(info, ", confused"); if (mtmp->mblinded || !mtmp->mcansee) Strcat(info, ", blind"); if (mtmp->mstun) Strcat(info, ", stunned"); if (mtmp->msleeping) Strcat(info, ", asleep"); #if 0 /* unfortunately mfrozen covers temporary sleep and being busy (donning armor, for instance) as well as paralysis */ else if (mtmp->mfrozen) Strcat(info, ", paralyzed"); #else else if (mtmp->mfrozen || !mtmp->mcanmove) Strcat(info, ", can't move"); #endif /* [arbitrary reason why it isn't moving] */ else if (mtmp->mstrategy & STRAT_WAITMASK) Strcat(info, ", meditating"); else if (mtmp->mflee) { Strcat(info, ", scared"); #ifdef WIZARD if (wizard) Sprintf(eos(info), " (%d)", mtmp->mfleetim); #endif } if (mtmp->mtrapped) Strcat(info, ", trapped"); if (mtmp->mspeed) Strcat(info, mtmp->mspeed == MFAST ? ", fast" : mtmp->mspeed == MSLOW ? ", slow" : ", ???? speed"); if (mtmp->mundetected) Strcat(info, ", concealed"); if (mtmp->minvis) Strcat(info, ", invisible"); if (mtmp == u.ustuck) Strcat(info, (sticks(youmonst.data)) ? ", held by you" : u.uswallow ? (is_animal(u.ustuck->data) ? ", swallowed you" : ", engulfed you") : ", holding you"); #ifdef STEED if (mtmp == u.usteed) Strcat(info, ", carrying you"); #endif /* avoid "Status of the invisible newt ..., invisible" */ /* and unlike a normal mon_nam, use "saddled" even if it has a name */ Strcpy(monnambuf, x_monnam(mtmp, ARTICLE_THE, (char *)0, (SUPPRESS_IT|SUPPRESS_INVISIBLE), FALSE)); pline("Status of %s (%s): Level %d HP %d(%d) Pw %d(%d) AC %d%s.", monnambuf, align_str(alignment), mtmp->m_lev, mtmp->mhp, mtmp->mhpmax, mtmp->m_en, mtmp->m_enmax, find_mac(mtmp), info); } void ustatusline() { char info[BUFSZ]; info[0] = '\0'; if (Sick) { Strcat(info, ", dying from"); if (u.usick_type & SICK_VOMITABLE) Strcat(info, " food poisoning"); if (u.usick_type & SICK_NONVOMITABLE) { if (u.usick_type & SICK_VOMITABLE) Strcat(info, " and"); Strcat(info, " illness"); } } if (Stoned) Strcat(info, ", solidifying"); if (Slimed) Strcat(info, ", becoming slimy"); if (Strangled) Strcat(info, ", being strangled"); if (Vomiting) Strcat(info, ", nauseated"); /* !"nauseous" */ if (Confusion) Strcat(info, ", confused"); if (Blind) { Strcat(info, ", blind"); if (u.ucreamed) { if ((long)u.ucreamed < Blinded || Blindfolded || !haseyes(youmonst.data)) Strcat(info, ", cover"); Strcat(info, "ed by sticky goop"); } /* note: "goop" == "glop"; variation is intentional */ } if (Stunned) Strcat(info, ", stunned"); #ifdef STEED if (!u.usteed) #endif if (Wounded_legs) { const char *what = body_part(LEG); if ((Wounded_legs & BOTH_SIDES) == BOTH_SIDES) what = makeplural(what); Sprintf(eos(info), ", injured %s", what); } if (Glib) Sprintf(eos(info), ", slippery %s", makeplural(body_part(HAND))); if (u.utrap) Strcat(info, ", trapped"); if (Fast) Strcat(info, Very_fast ? ", very fast" : ", fast"); if (u.uundetected) Strcat(info, ", concealed"); if (Invis) Strcat(info, ", invisible"); if (u.ustuck) { if (sticks(youmonst.data)) Strcat(info, ", holding "); else Strcat(info, ", held by "); Strcat(info, mon_nam(u.ustuck)); } pline("Status of %s (%s%s): Level %d HP %d(%d) Pw %d(%d) AC %d%s.", plname, (u.ualign.record >= 20) ? "piously " : (u.ualign.record > 13) ? "devoutly " : (u.ualign.record > 8) ? "fervently " : (u.ualign.record > 3) ? "stridently " : (u.ualign.record == 3) ? "" : (u.ualign.record >= 1) ? "haltingly " : (u.ualign.record == 0) ? "nominally " : "insufficiently ", align_str(u.ualign.type), Upolyd ? mons[u.umonnum].mlevel : u.ulevel, Upolyd ? u.mh : u.uhp, Upolyd ? u.mhmax : u.uhpmax, u.uen, u.uenmax, u.uac, info); } void self_invis_message() { pline("%s %s.", Hallucination ? "Far out, man! You" : "Gee! All of a sudden, you", See_invisible ? "can see right through yourself" : "can't see yourself"); } #endif /* OVLB */ /*pline.c*/ slashem-0.0.7E7F3/src/alloc.c0000664000076400007640000004125310545462317013706 0ustar aliali/* 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. */ /* to get the malloc() prototype from system.h */ #define ALLOC_C /* comment line for pre-compiled headers */ /* since this file is also used in auxiliary programs, don't include all the * function declarations for all of nethack */ #define EXTERN_H /* comment line for pre-compiled headers */ #include "config.h" /* [Ali] * There are a number of preprocessor symbols which affect how this * file is compiled: * * NHALLOC_DLL When set this causes the alloc module to build as a stand-alone * allocator (which can either be used in object form for use * with utility programs or combined with panic.o to form a DLL * for dynamic linking with the game - this last allows for the * possibility of 3rd party libraries to allocate memory via the * module and thus be represented in the heap monitoring). * * Global symbols defined: malloc, calloc etc. * monitor_heap_push, monitor_heap_pop etc. * * Warning: The version of panic defined in panic.o does _not_ * attempt to save the game. nhalloc.dll should therefore only be * used for testing. * * WIZARD When set this causes the definition of the fmt_ptr function. * * MONITOR_HEAP When set this causes the alloc module to define the nhalloc and * nhfree functions (which can then be used by the alloc and free * macros). This allows some basic monitoring of the heap for * memory leaks by dumping the heap to a log file on exit. * * Note: This symbol also causes fmt_ptr to be defined. * * Note: If the INTERNAL_MALLOC symbol is also defined, then * nhalloc and nhfree will use the monitor_heap_ functions to * store information about where the memory was allocated from. * Unless compiling on the WIN32 platform, this will also cause * the definition of the monitor_heap_ functions, the trivial * allocator and a standard front end (malloc and friends). * On the WIN32 platform, the monitor_heap_ and standard allocator * functions are left as external references. */ /* to get the definitons of ENOMEM and errno */ #if defined(NHALLOC_DLL) || defined(MONITOR_HEAP) && defined(INTERNAL_MALLOC) #include #include #ifdef WIN32 #include #endif #endif #ifdef NHALLOC_DLL #undef free #else /* NHALLOC_DLL */ #if defined(MONITOR_HEAP) || defined(WIZARD) char *FDECL(fmt_ptr, (const genericptr,char *)); #endif #ifdef MONITOR_HEAP #undef alloc #undef free extern void FDECL(free,(genericptr_t)); static void NDECL(heapmon_init); static FILE *heaplog = 0; static boolean tried_heaplog = FALSE; #endif long *FDECL(alloc,(unsigned int)); extern void VDECL(panic, (const char *,...)) PRINTF_F(1,2); long * alloc(lth) register unsigned int lth; { #ifdef LINT /* * a ridiculous definition, suppressing * "possible pointer alignment problem" for (long *) malloc() * from lint */ long dummy = ftell(stderr); if(lth) dummy = 0; /* make sure arg is used */ return(&dummy); #else register genericptr_t ptr; ptr = malloc(lth); #ifndef MONITOR_HEAP if (!ptr) panic("Memory allocation failure; cannot get %u bytes", lth); #endif return((long *) ptr); #endif } #if defined(MONITOR_HEAP) || defined(WIZARD) # if defined(MICRO) || defined(WIN32) /* we actually want to know which systems have an ANSI run-time library * to know which support the new %p format for printing pointers. * due to the presence of things like gcc, NHSTDC is not a good test. * so we assume microcomputers have all converted to ANSI and bigger * computers which may have older libraries give reasonable results with * the cast. */ # define MONITOR_PTR_FMT # endif # ifdef MONITOR_PTR_FMT # define PTR_FMT "%p" # define PTR_TYP genericptr_t # else # define PTR_FMT "%06lx" # define PTR_TYP unsigned long # endif /* format a pointer for display purposes; caller supplies the result buffer */ char * fmt_ptr(ptr, buf) const genericptr ptr; char *buf; { Sprintf(buf, PTR_FMT, (PTR_TYP)ptr); return buf; } #endif /* MONITOR_HEAP || WIZARD */ #endif /* !NHALLOC_DLL */ #if defined(MONITOR_HEAP) && !defined(NHALLOC_DLL) /* If ${NH_HEAPLOG} is defined and we can create a file by that name, then we'll log the allocation and release information to that file. */ static void heapmon_init() { char *logname = getenv("NH_HEAPLOG"); if (logname && *logname) heaplog = fopen(logname, "w"); tried_heaplog = TRUE; } long * nhalloc(lth, file, line) unsigned int lth; const char *file; int line; { long *ptr; char ptr_address[20]; #ifdef INTERNAL_MALLOC monitor_heap_push(file, line); #endif ptr = alloc(lth); #ifdef INTERNAL_MALLOC (void)monitor_heap_pop(file, line, 0); #endif if (!tried_heaplog) heapmon_init(); if (heaplog) (void) fprintf(heaplog, "+%5u %s %4d %s\n", lth, fmt_ptr((genericptr_t)ptr, ptr_address), line, file); /* potential panic in alloc() was deferred til here */ if (!ptr) panic("Cannot get %u bytes, line %d of %s", lth, line, file); return ptr; } void nhfree(ptr, file, line) genericptr_t ptr; const char *file; int line; { char ptr_address[20]; if (!tried_heaplog) heapmon_init(); if (heaplog) (void) fprintf(heaplog, "- %s %4d %s\n", fmt_ptr((genericptr_t)ptr, ptr_address), line, file); free(ptr); } #endif /* MONITOR_HEAP && !NHALLOC_DLL */ /* * Under Win32, the trivial allocator and monitor front end are * placed in nhalloc.dll rather than in the main executable. */ #if defined(NHALLOC_DLL) || (defined(INTERNAL_MALLOC) && !defined(WIN32)) /* * [Ali] A trivial malloc implementation. * * Notes: * * If attempting to port to a non-UNIX environment, you will need * a replacement for the sbrk() call. Under UNIX, sbrk() returns * contiguous blocks. If there is no equivalent call in the target * environment, you will either need to make this allocator rather * more intelligent, or just increase PAGESIZE to something huge like * 1Mb to keep the resultant fragmentation under control. * * The alignment implementation is advisory at best; we assume that * if the target enviroment is that bothered by alignment, sbrk() * will return aligned blocks and the compiler will pad the triv_head * structure appropriately. If either of these assumptions is not * correct, the alignment will be relaxed, which is presumably okay. * * This implementation is _very_ vulnerable to memory allocation bugs * in the main code. Don't enable it unless you are confident that * no such bugs exist. */ #define TRIV_ALIGN sizeof(double) #define TRIV_PAGESIZE 4096 struct triv_head { size_t triv_size; /* Total block size (excluding header) */ union { struct { size_t nb; /* Number of bytes allocated by user */ void *userdata; } alloc; struct triv_head *next; /* Next free block */ double d; /* Dummy for alignment */ } u; #define triv_nb u.alloc.nb #define triv_userdata u.alloc.userdata #define triv_next u.next /* Free blocks only */ }; static struct triv_head *triv_freelist = NULL; #ifdef WIN32 /* * MS-Windows rounds size request up to a system page, so we need to * ensure we always request an exact number of system pages. This * variable holds TRIV_PAGESIZE rounded up accordingly. */ static unsigned int triv_pagesize = 0; #endif #define ROUNDUP(nbytes, align) (((nbytes) + (align) - 1) / (align) * (align)) void *triv_get_userdata(void *p) { struct triv_head *h; if (!p) return p; h = (struct triv_head *)p - 1; return h->triv_userdata; } void triv_set_userdata(void *p, void *d) { struct triv_head *h; if (p) { h = (struct triv_head *)p - 1; h->triv_userdata = d; } } #define IS_CONTIGUOUS(h1,h2) ((h2) == \ (struct triv_head *)((unsigned char *)((h1) + 1) + (h1)->triv_size)) void triv_free(void *p) { struct triv_head *f, *lf, *h; if (!p) return; h = (struct triv_head *)p - 1; /* Find f, the first free block _after_ h in memory */ for (lf = NULL, f = triv_freelist; f; lf = f, f = f->triv_next) if (f > h) break; if (IS_CONTIGUOUS(h, f)) { /* f is contiguous with h; merge them */ h->triv_size += sizeof(struct triv_head) + f->triv_size; h->triv_next = f->triv_next; } else /* f is not contiguous; insert new block */ h->triv_next = f; /* Update pointer from previous block */ if (lf) lf->triv_next = h; else triv_freelist = h; /* Then check last free block _below_ h in memory */ if (lf && IS_CONTIGUOUS(lf, h)) { /* h is contiguous with lf; merge them */ lf->triv_size += sizeof(struct triv_head) + h->triv_size; lf->triv_next = h->triv_next; } } void *triv_malloc(size_t nb) { struct triv_head *f, *lf, *nf; size_t size = ROUNDUP(nb, TRIV_ALIGN); size_t pagesize; if (!nb) return NULL; /* _Not_ an error; don't set errno */ for (lf = NULL, f = triv_freelist; f; lf = f, f = f->triv_next) /* Use first block found which is large enough */ if (f->triv_size >= size) { /* Split the free block if there's enough space left over */ if (f->triv_size - size > sizeof(struct triv_head)) { nf = (struct triv_head *)((unsigned char *)(f + 1) + size); nf->triv_size = f->triv_size - size - sizeof(struct triv_head); nf->triv_next = f->triv_next; f->triv_next = nf; f->triv_size = size; } /* Remove block from freelist */ if (lf) lf->triv_next = f->triv_next; else triv_freelist = f->triv_next; /* Initialise header and return */ f->triv_nb = nb; f->triv_userdata = NULL; return f + 1; } /* Get new block */ #ifdef WIN32 if (triv_pagesize == 0) { SYSTEM_INFO si; GetSystemInfo(&si); triv_pagesize = ROUNDUP(TRIV_PAGESIZE, si.dwPageSize); } pagesize = ROUNDUP(sizeof(struct triv_head) + size, triv_pagesize); f = VirtualAlloc(NULL, pagesize, MEM_COMMIT, PAGE_READWRITE); #else pagesize = ROUNDUP(sizeof(struct triv_head) + size, TRIV_PAGESIZE); f = sbrk(pagesize); #endif if (!f) { errno = ENOMEM; return f; } /* Initialise header */ f->triv_size = pagesize - sizeof(struct triv_head); f->triv_nb = nb; f->triv_userdata = NULL; /* Split the new block if there's enough space left over */ if (f->triv_size - size > sizeof(struct triv_head)) { nf = (struct triv_head *)((unsigned char *)(f + 1) + size); nf->triv_size = f->triv_size - size - sizeof(struct triv_head); f->triv_size = size; /* And contribute it to the free list */ triv_free(nf + 1); } return f + 1; } void *triv_calloc(size_t nobj, size_t size) { void *p; size_t nb = nobj * size; if (nb / nobj != size) { /* Check overflow */ errno = ENOMEM; return NULL; } p = triv_malloc(nb); if (p) memset(p, 0, nb); return p; } void *triv_realloc(void *p, size_t size) { struct triv_head *h; void *np; if (!size) { triv_free(p); return NULL; } if (!p) return triv_malloc(size); h = (struct triv_head *)p - 1; if (size <= h->triv_size) { h->triv_nb = size; return p; } np = triv_malloc(size); if (np) { memcpy(np, p, h->triv_nb); triv_set_userdata(np, triv_get_userdata(p)); triv_free(p); } return np; } /* Monitoring front-end */ struct monitor_id { const char *id; /* Typically file name */ int subid; /* Typically line number */ }; static char *monitor_id_stack_default_id = ""; static int monitor_id_stack_depth = 0; static struct monitor_id *monitor_id_stack = NULL; static size_t monitor_mem_in_use = 0; static boolean monitor_trace = 0; static FILE *monitor_fp = NULL; #define MHF_MARKED 1 struct monitor_head { void *p; size_t size; struct monitor_id id; unsigned long flags; struct monitor_head *next, *prev; }; static struct monitor_head *monitor_heap = NULL; void monitor_heap_push(const char *id, int subid) { ++monitor_id_stack_depth; monitor_id_stack = triv_realloc(monitor_id_stack, monitor_id_stack_depth * sizeof (*monitor_id_stack)); if (!monitor_id_stack) panic("monitor_heap_push: not enough memory"); monitor_id_stack[monitor_id_stack_depth - 1].id = id; monitor_id_stack[monitor_id_stack_depth - 1].subid = subid; } /* retval is to make writing macros which use monitor_heap_push/pop easier */ unsigned long monitor_heap_pop(const char *id, int subid, unsigned long retval) { if (!monitor_id_stack_depth) panic("monitor_heap_pop: empty stack"); if (monitor_id_stack[monitor_id_stack_depth - 1].id != id || monitor_id_stack[monitor_id_stack_depth - 1].subid != subid) panic("monitor_heap_pop: mismatch: (%s, %d) != (%s, %d)", monitor_id_stack[monitor_id_stack_depth - 1].id, monitor_id_stack[monitor_id_stack_depth - 1].subid, id, subid); --monitor_id_stack_depth; monitor_id_stack = triv_realloc(monitor_id_stack, monitor_id_stack_depth * sizeof (*monitor_id_stack)); return retval; } void monitor_heap_set_subid(const char *id, int subid) { if (!monitor_id_stack_depth) panic("monitor_heap_set_subid: empty stack"); if (monitor_id_stack[monitor_id_stack_depth - 1].id != id) panic("monitor_heap_set_subid: mismatch: %s != %s", monitor_id_stack[monitor_id_stack_depth - 1].id, id); monitor_id_stack[monitor_id_stack_depth - 1].subid = subid; } size_t monitor_heap_getmem(void) { return monitor_mem_in_use; } boolean monitor_heap_trace(boolean flag) { boolean retval = !!monitor_trace; if (flag) monitor_trace++; else monitor_trace--; return retval; } void monitor_heap_mark(void) { struct monitor_head *m; for(m = monitor_heap; m; m = m->next) m->flags |= MHF_MARKED; } void monitor_heap_release(void) { int first = 1; struct monitor_head *m; if (!monitor_fp) return; for(m = monitor_heap; m; m = m->next) m->flags ^= MHF_MARKED; for(m = monitor_heap; m; m = m->next) if (m->flags & MHF_MARKED) { if (first) { fprintf(monitor_fp, "Blocks allocated but not freed during mark/release:\n"); fprintf(monitor_fp, "Address Size Sub-ID ID\n"); first = 0; } fprintf(monitor_fp, "%-16p%-8lu%-8d%s\n", m->p, m->size, m->id.subid, m->id.id); } } static void monitor_dump(void) { int first = 1; struct monitor_head *m; FILE *fp; size_t used = 0; if (!monitor_fp) return; monitor_heap_mark(); fprintf(monitor_fp, "Dump of all monitored blocks in heap:\n"); for(m = monitor_heap; m; m = m->next) { if (m->flags & MHF_MARKED) { used += m->size; if (m->id.id == monitor_id_stack_default_id) continue; if (first) { fprintf(monitor_fp, "Address Size Sub-ID ID\n"); first = 0; } fprintf(monitor_fp, "%-16p%-8lu%-8d%s\n", m->p, m->size, m->id.subid, m->id.id); } } if (first) fprintf(monitor_fp, "No monitored blocks in heap with non-default ID.\n"); fprintf(monitor_fp, "Total used space: %lu bytes\n", used); } void *malloc(size_t nb) { static int busy = 0; static int inited = 0; struct monitor_head *m; if (!busy && !(inited&1) && !monitor_id_stack_depth) { inited|=1; monitor_heap_push(monitor_id_stack_default_id, 0); } if (!busy && !(inited&2)) { char *s; inited|=2; atexit(monitor_dump); s = getenv("NH_HEAPDUMP"); monitor_fp = s ? fopen(s, "w"): NULL; } if (!nb) return NULL; busy++; m = triv_malloc(sizeof(*m)); if (!m) { busy--; return m; } m->size = nb; m->flags = 0; m->p = triv_malloc(nb); if (monitor_trace) fprintf(stderr, "malloc(%d) = %p\n", nb, m->p); if (!m->p) { triv_free(m); busy--; return NULL; } monitor_mem_in_use += nb; m->prev = NULL; m->next = monitor_heap; m->id = monitor_id_stack[monitor_id_stack_depth - 1]; if (monitor_heap) monitor_heap->prev = m; monitor_heap = m; triv_set_userdata(m->p, m); busy--; return m->p; } void *calloc(size_t nobj, size_t size) { void *p; size_t nb = nobj * size; if (nb / nobj != size) { /* Check overflow */ errno = ENOMEM; return NULL; } p = malloc(nb); if (p) memset(p, 0, nb); return p; } void *realloc(void *p, size_t size) { struct monitor_head *m; void *np; if (!size) { free(p); return NULL; } if (!p) return malloc(size); m = triv_get_userdata(p); np = triv_realloc(p, size); if (monitor_trace) fprintf(stderr, "realloc(%p, %d) = %p\n", p, size, np); if (np) { monitor_mem_in_use += size - m->size; m->size = size; m->p = np; } return np; } void free(void *p) { struct monitor_head *m; if (p) { if (monitor_trace) fprintf(stderr, "free(%p)\n", p); m = triv_get_userdata(p); monitor_mem_in_use -= m->size; triv_free(p); if (m->prev) m->prev->next = m->next; else monitor_heap = m->next; if (m->next) m->next->prev = m->prev; triv_free(m); } } #endif /* NHALLOC_DLL || INTERNAL_MALLOC && !WIN32 */ /*alloc.c*/ slashem-0.0.7E7F3/src/rect.c0000664000076400007640000000711310545462317013546 0ustar aliali/* 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. */ #include "hack.h" int FDECL(get_rect_ind, (NhRect *)); static boolean FDECL(intersect, (NhRect *,NhRect *,NhRect *)); /* * In this file, we will handle the various rectangle functions we * need for room generation. */ #define MAXRECT 50 #define XLIM 4 #define YLIM 3 static NhRect rect[MAXRECT+1]; static int rect_cnt; /* * Initialisation of internal structures. Should be called for every * new level to be build... */ void init_rect() { rect_cnt = 1; rect[0].lx = rect[0].ly = 0; rect[0].hx = COLNO - 1; rect[0].hy = ROWNO - 1; } /* * Search Index of one precise NhRect. * */ int get_rect_ind(r) NhRect *r; { register NhRect *rectp; register int lx, ly, hx, hy; register int i; lx = r->lx; ly = r->ly; hx = r->hx; hy = r->hy; for (i=0,rectp = &rect[0];ilx && ly == rectp->ly && hx == rectp->hx && hy == rectp->hy) return i; return -1; } /* * Search a free rectangle that include the one given in arg */ NhRect * get_rect(r) NhRect *r; { register NhRect *rectp; register int lx, ly, hx, hy; register int i; lx = r->lx; ly = r->ly; hx = r->hx; hy = r->hy; for (i=0,rectp = &rect[0];i= rectp->lx && ly >= rectp->ly && hx <= rectp->hx && hy <= rectp->hy) return rectp; return 0; } /* * Get some random NhRect from the list. */ NhRect * rnd_rect() { return rect_cnt > 0 ? &rect[rn2(rect_cnt)] : 0; } /* * Search intersection between two rectangles (r1 & r2). * return TRUE if intersection exist and put it in r3. * otherwise returns FALSE */ static boolean intersect(r1, r2, r3) NhRect *r1, *r2, *r3; { if (r2->lx > r1->hx || r2->ly > r1->hy || r2->hx < r1->lx || r2->hy < r1->ly) return FALSE; r3->lx = (r2->lx > r1->lx ? r2->lx : r1->lx); r3->ly = (r2->ly > r1->ly ? r2->ly : r1->ly); r3->hx = (r2->hx > r1->hx ? r1->hx : r2->hx); r3->hy = (r2->hy > r1->hy ? r1->hy : r2->hy); if (r3->lx > r3->hx || r3->ly > r3->hy) return FALSE; return TRUE; } /* * Remove a rectangle from the list of free NhRect. */ void remove_rect(r) NhRect *r; { int ind; ind = get_rect_ind(r); if ( ind >=0 ) rect[ind] = rect[--rect_cnt]; } /* * Add a NhRect to the list. */ void add_rect(r) NhRect *r; { if (rect_cnt >= MAXRECT) { #ifdef WIZARD if (wizard) pline("MAXRECT may be too small."); #endif return; } /* Check that this NhRect is not included in another one */ if (get_rect(r)) return; rect[rect_cnt] = *r; rect_cnt++; } /* * Okay, here we have two rectangles (r1 & r2). * r1 was already in the list and r2 is included in r1. * What we want is to allocate r2, that is split r1 into smaller rectangles * then remove it. */ void split_rects(r1, r2) NhRect *r1, *r2; { NhRect r, old_r; int i; old_r = *r1; remove_rect(r1); /* Walk down since rect_cnt & rect[] will change... */ for (i=rect_cnt-1; i>=0; i--) if (intersect(&rect[i], r2, &r)) split_rects(&rect[i], &r); if (r2->ly - old_r.ly-1 > (old_r.hy < ROWNO - 1 ? 2*YLIM : YLIM+1)+4) { r = old_r; r.hy = r2->ly - 2; add_rect(&r); } if (r2->lx - old_r.lx-1 > (old_r.hx < COLNO - 1 ? 2*XLIM : XLIM+1)+4) { r = old_r; r.hx = r2->lx - 2; add_rect(&r); } if (old_r.hy - r2->hy-1 > (old_r.ly > 0 ? 2*YLIM : YLIM+1)+4) { r = old_r; r.ly = r2->hy + 2; add_rect(&r); } if (old_r.hx - r2->hx-1 > (old_r.lx > 0 ? 2*XLIM : XLIM+1)+4) { r = old_r; r.lx = r2->hx + 2; add_rect(&r); } } /*rect.c*/ slashem-0.0.7E7F3/src/mplayer.c0000664000076400007640000002325610545462317014270 0ustar aliali/* SCCS Id: @(#)mplayer.c 3.4 1997/02/04 */ /* Copyright (c) Izchak Miller, 1992. */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" STATIC_DCL const char *NDECL(dev_name); STATIC_DCL void FDECL(get_mplname, (struct monst *, char *)); 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. */ static const char *developers[] = { /* 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 */ "Joshua", "Pat", ""}; /* return a randomly chosen developer name */ STATIC_OVL const char * dev_name() { register int i, m = 0, n = SIZE(developers); register struct monst *mtmp; register boolean match; do { match = FALSE; i = rn2(n); for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) { if(!is_mplayer(mtmp->data)) continue; if(!strncmp(developers[i], NAME(mtmp), strlen(developers[i]))) { match = TRUE; break; } } m++; } while (match && m < 100); /* m for insurance */ if (match) return (const char *)0; return(developers[i]); } STATIC_OVL void get_mplname(mtmp, nam) register struct monst *mtmp; char *nam; { boolean fmlkind = is_female(mtmp->data); const char *devnam; devnam = dev_name(); if (!devnam) Strcpy(nam, fmlkind ? "Eve" : "Adam"); else if (fmlkind && !!strcmp(devnam, "Janet")) Strcpy(nam, rn2(2) ? "Maud" : "Eve"); else Strcpy(nam, devnam); if (fmlkind || !strcmp(nam, "Janet")) mtmp->female = 1; else mtmp->female = 0; Strcat(nam, " the "); Strcat(nam, rank_of((int)mtmp->m_lev, monsndx(mtmp->data), (boolean)mtmp->female)); } STATIC_OVL void mk_mplayer_armor(mon, typ) struct monst *mon; short typ; { struct obj *obj; if (typ == STRANGE_OBJECT) return; obj = mksobj(typ, FALSE, FALSE); if (!rn2(3)) obj->oerodeproof = 1; if (!rn2(3)) curse(obj); if (!rn2(3)) bless(obj); /* Most players who get to the endgame who have cursed equipment * have it because the wizard or other monsters cursed it, so its * chances of having plusses is the same as usual.... */ obj->spe = rn2(10) ? (rn2(3) ? rn2(5) : rn1(4,4)) : -rnd(3); (void) mpickobj(mon, obj); } struct monst * mk_mplayer(ptr, x, y, special) register struct permonst *ptr; xchar x, y; register boolean special; { register struct monst *mtmp; char nam[PL_NSIZ]; if(!is_mplayer(ptr)) return((struct monst *)0); if(MON_AT(x, y)) (void) rloc(m_at(x, y), FALSE); /* insurance */ if(!In_endgame(&u.uz)) special = FALSE; if ((mtmp = makemon(ptr, x, y, NO_MM_FLAGS)) != 0) { short weapon = rn2(2) ? LONG_SWORD : rnd_class(SPEAR, BULLWHIP); short armor = rnd_class(GRAY_DRAGON_SCALE_MAIL, YELLOW_DRAGON_SCALE_MAIL); short cloak = !rn2(8) ? STRANGE_OBJECT : rnd_class(OILSKIN_CLOAK, CLOAK_OF_DISPLACEMENT); short helm = !rn2(8) ? STRANGE_OBJECT : rnd_class(ELVEN_LEATHER_HELM, HELM_OF_TELEPATHY); short shield = !rn2(8) ? STRANGE_OBJECT : rnd_class(ELVEN_SHIELD, SHIELD_OF_REFLECTION); int quan; struct obj *otmp; mtmp->m_lev = (special ? rn1(16,15) : rnd(16)); mtmp->mhp = mtmp->mhpmax = d((int)mtmp->m_lev,10) + (special ? (30 + rnd(30)) : 30); if(special) { get_mplname(mtmp, nam); mtmp = christen_monst(mtmp, nam); /* that's why they are "stuck" in the endgame :-) */ (void)mongets(mtmp, FAKE_AMULET_OF_YENDOR); } mtmp->mpeaceful = 0; set_malign(mtmp); /* peaceful may have changed again */ switch(monsndx(ptr)) { case PM_ARCHEOLOGIST: if (rn2(2)) weapon = BULLWHIP; break; case PM_BARBARIAN: if (rn2(2)) { weapon = rn2(2) ? TWO_HANDED_SWORD : BATTLE_AXE; shield = STRANGE_OBJECT; } if (rn2(2)) armor = rnd_class(PLATE_MAIL, CHAIN_MAIL); if (helm == HELM_OF_BRILLIANCE) helm = STRANGE_OBJECT; break; case PM_CAVEMAN: case PM_CAVEWOMAN: if (rn2(4)) weapon = MACE; else if (rn2(2)) weapon = CLUB; if (helm == HELM_OF_BRILLIANCE) helm = STRANGE_OBJECT; break; case PM_HEALER: if (rn2(4)) weapon = QUARTERSTAFF; else if (rn2(2)) weapon = rn2(2) ? UNICORN_HORN : SCALPEL; if (rn2(4)) helm = rn2(2) ? HELM_OF_BRILLIANCE : HELM_OF_TELEPATHY; if (rn2(2)) shield = STRANGE_OBJECT; break; #ifdef YEOMAN case PM_YEOMAN: #endif case PM_KNIGHT: if (rn2(4)) weapon = LONG_SWORD; if (rn2(2)) armor = rnd_class(PLATE_MAIL, CHAIN_MAIL); break; case PM_MONK: weapon = STRANGE_OBJECT; armor = STRANGE_OBJECT; cloak = ROBE; if (rn2(2)) shield = STRANGE_OBJECT; break; case PM_PRIEST: case PM_PRIESTESS: if (rn2(2)) weapon = MACE; if (rn2(2)) armor = rnd_class(PLATE_MAIL, CHAIN_MAIL); if (rn2(4)) cloak = ROBE; if (rn2(4)) helm = rn2(2) ? HELM_OF_BRILLIANCE : HELM_OF_TELEPATHY; if (rn2(2)) shield = STRANGE_OBJECT; break; case PM_RANGER: if (rn2(2)) weapon = ELVEN_DAGGER; break; case PM_ROGUE: weapon = SHORT_SWORD; armor = LEATHER_ARMOR; break; case PM_SAMURAI: if (rn2(2)) weapon = KATANA; break; #ifdef TOURIST case PM_TOURIST: /* Defaults are just fine */ break; #endif case PM_UNDEAD_SLAYER: if (rn2(2)) weapon = SILVER_SPEAR; if (rn2(2)) armor = rnd_class(PLATE_MAIL, CHAIN_MAIL); break; case PM_VALKYRIE: if (rn2(2)) weapon = WAR_HAMMER; if (rn2(2)) armor = rnd_class(PLATE_MAIL, CHAIN_MAIL); break; case PM_FLAME_MAGE: case PM_ICE_MAGE: case PM_NECROMANCER: case PM_WIZARD: if (rn2(4)) weapon = rn2(2) ? QUARTERSTAFF : ATHAME; if (rn2(2)) { armor = rn2(2) ? BLACK_DRAGON_SCALE_MAIL : SILVER_DRAGON_SCALE_MAIL; cloak = CLOAK_OF_MAGIC_RESISTANCE; } if (rn2(4)) helm = HELM_OF_BRILLIANCE; shield = STRANGE_OBJECT; break; default: impossible("bad mplayer monster"); weapon = 0; break; } if (weapon != STRANGE_OBJECT) { otmp = mksobj(weapon, TRUE, FALSE); otmp->spe = (special ? rn1(5,4) : rn2(4)); if (!rn2(3)) otmp->oerodeproof = 1; else if (!rn2(2)) otmp->greased = 1; if (special && rn2(2)) otmp = mk_artifact(otmp, A_NONE); /* mplayers knew better than to overenchant Magicbane */ if (otmp->oartifact == ART_MAGICBANE) otmp->spe = rnd(4); (void) mpickobj(mtmp, otmp); } if(special) { if (!rn2(10)) (void) mongets(mtmp, rn2(3) ? LUCKSTONE : LOADSTONE); mk_mplayer_armor(mtmp, armor); mk_mplayer_armor(mtmp, cloak); mk_mplayer_armor(mtmp, helm); mk_mplayer_armor(mtmp, shield); if (rn2(8)) mk_mplayer_armor(mtmp, rnd_class(LEATHER_GLOVES, GAUNTLETS_OF_DEXTERITY)); if (rn2(8)) mk_mplayer_armor(mtmp, rnd_class(LOW_BOOTS, LEVITATION_BOOTS)); m_dowear(mtmp, TRUE); quan = rn2(3) ? rn2(3) : rn2(16); while(quan--) (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)); } else { /* wandering characters... */ #ifndef GOLDOBJ mtmp->mgold = rn2((mtmp->m_lev)*100); #else mkmonmoney(mtmp, rn2((mtmp->m_lev)*100)); #endif } quan = rnd(3); while(quan--) (void)mongets(mtmp, rnd_offensive_item(mtmp)); quan = rnd(3); while(quan--) (void)mongets(mtmp, rnd_defensive_item(mtmp)); quan = rnd(3); while(quan--) (void)mongets(mtmp, rnd_misc_item(mtmp)); } return(mtmp); } /* create the indicated number (num) of monster-players, * randomly chosen, and in randomly chosen (free) locations * on the level. If "special", the size of num should not * be bigger than the number of _non-repeated_ names in the * developers array, otherwise a bunch of Adams and Eves will * fill up the overflow. */ void create_mplayers(num, special) register int num; boolean special; { int pm, x, y; struct monst fakemon; while(num) { int tryct = 0; /* roll for character class */ pm = PM_ARCHEOLOGIST + rn2(PM_WIZARD - PM_ARCHEOLOGIST + 1); fakemon.data = &mons[pm]; /* roll for an available location */ do { x = rn1(COLNO-4, 2); y = rnd(ROWNO-2); } while(!goodpos(x, y, &fakemon, 0) && tryct++ <= 50); /* if pos not found in 50 tries, don't bother to continue */ if(tryct > 50) return; (void) mk_mplayer(&mons[pm], (xchar)x, (xchar)y, special); num--; } } void mplayer_talk(mtmp) register struct monst *mtmp; { static const char *same_class_msg[3] = { "I can't win, and neither will you!", "You don't deserve to win!", "Mine should be the honor, not yours!", }, *other_class_msg[3] = { "The low-life wants to talk, eh?", "Fight, scum!", "Here is what I have to say!", }; if(mtmp->mpeaceful) return; /* will drop to humanoid talk */ pline("Talk? -- %s", (mtmp->data == &mons[urole.malenum] || mtmp->data == &mons[urole.femalenum]) ? same_class_msg[rn2(3)] : other_class_msg[rn2(3)]); } /*mplayer.c*/ slashem-0.0.7E7F3/src/music.c0000664000076400007640000004761110545462317013740 0ustar aliali/* SCCS Id: @(#)music.c 3.4 2003/05/25 */ /* Copyright (c) 1989 by Jean-Christophe Collet */ /* NetHack may be freely redistributed. See license for details. */ /* * This file contains the different functions designed to manipulate the * musical instruments and their various effects. * * Actually the list of instruments / effects is : * * (wooden) flute may calm snakes if player has enough dexterity * magic flute may put monsters to sleep: area of effect depends * on player level. * (tooled) horn Will awaken monsters: area of effect depends on player * level. May also scare monsters. * fire horn Acts like a wand of fire. * frost horn Acts like a wand of cold. * bugle Will awaken soldiers (if any): area of effect depends * on player level. * (wooden) harp May calm nymph if player has enough dexterity. * magic harp Charm monsters: area of effect depends on player * level. * (leather) drum Will awaken monsters like the horn. * drum of earthquake Will initiate an earthquake whose intensity depends * on player level. That is, it creates random pits * called here chasms. */ #include "hack.h" STATIC_DCL void FDECL(awaken_monsters,(int)); STATIC_DCL void FDECL(put_monsters_to_sleep,(int)); STATIC_DCL void FDECL(charm_snakes,(int)); STATIC_DCL void FDECL(calm_nymphs,(int)); STATIC_DCL void FDECL(charm_monsters,(int)); STATIC_DCL void FDECL(do_earthquake,(int)); STATIC_DCL int FDECL(do_improvisation,(struct obj *)); #ifdef UNIX386MUSIC STATIC_DCL int NDECL(atconsole); STATIC_DCL void FDECL(speaker,(struct obj *,char *)); #endif #ifdef VPIX_MUSIC extern int sco_flag_console; /* will need changing if not _M_UNIX */ STATIC_DCL void NDECL(playinit); STATIC_DCL void FDECL(playstring, (char *,size_t)); STATIC_DCL void FDECL(speaker,(struct obj *,char *)); #endif #ifdef PCMUSIC void FDECL( pc_speaker, ( struct obj *, char * ) ); #endif #ifdef AMIGA void FDECL( amii_speaker, ( struct obj *, char *, int ) ); #endif /* * Wake every monster in range... */ STATIC_OVL void awaken_monsters(distance) int distance; { register struct monst *mtmp = fmon; register int distm; while(mtmp) { if (!DEADMONSTER(mtmp)) { distm = distu(mtmp->mx, mtmp->my); if (distm < distance) { mtmp->msleeping = 0; mtmp->mcanmove = 1; 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; } } /* * Make monsters fall asleep. Note that they may resist the spell. */ STATIC_OVL void put_monsters_to_sleep(distance) int distance; { register struct monst *mtmp = fmon; 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); } mtmp = mtmp->nmon; } } /* * Charm snakes in range. Note that the snakes are NOT tamed. */ STATIC_OVL void charm_snakes(distance) int distance; { register struct monst *mtmp = fmon; int could_see_mon, was_peaceful; while (mtmp) { if (!DEADMONSTER(mtmp) && mtmp->data->mlet == S_SNAKE && mtmp->mcanmove && 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); if (canseemon(mtmp)) { if (!could_see_mon) You("notice %s, swaying with the music.", a_monnam(mtmp)); else pline("%s freezes, then sways with the music%s.", Monnam(mtmp), was_peaceful ? "" : ", and now seems quieter"); } } mtmp = mtmp->nmon; } } /* * Calm nymphs in range. */ STATIC_OVL void calm_nymphs(distance) int distance; { register struct monst *mtmp = fmon; while (mtmp) { if (!DEADMONSTER(mtmp) && mtmp->data->mlet == S_NYMPH && mtmp->mcanmove && 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.", Monnam(mtmp)); } mtmp = mtmp->nmon; } } /* Awake only soldiers of the level. */ void awaken_soldiers() { register struct monst *mtmp = fmon; while(mtmp) { if (!DEADMONSTER(mtmp) && is_mercenary(mtmp->data) && mtmp->data != &mons[PM_GUARD]) { mtmp->mpeaceful = mtmp->msleeping = mtmp->mfrozen = 0; mtmp->mcanmove = 1; if (canseemon(mtmp)) pline("%s is now ready for battle!", Monnam(mtmp)); else Norep("You hear the rattle of battle gear being readied."); } mtmp = mtmp->nmon; } } /* 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); } } } } /* Generate earthquake :-) of desired force. * That is: create random chasms (pits). */ STATIC_OVL void do_earthquake(force) int force; { register int x,y; struct monst *mtmp; struct obj *otmp; struct trap *chasm; int start_x, start_y, end_x, end_y; start_x = u.ux - (force * 2); start_y = u.uy - (force * 2); end_x = u.ux + (force * 2); end_y = u.uy + (force * 2); if (start_x < 1) start_x = 1; if (start_y < 1) start_y = 1; if (end_x >= COLNO) end_x = COLNO - 1; if (end_y >= ROWNO) end_y = ROWNO - 1; for (x=start_x; x<=end_x; x++) for (y=start_y; y<=end_y; y++) { if ((mtmp = m_at(x,y)) != 0) { wakeup(mtmp); /* peaceful monster will become hostile */ if (mtmp->mundetected && is_hider(mtmp->data)) { mtmp->mundetected = 0; if (cansee(x,y)) pline("%s is shaken loose from the ceiling!", Amonnam(mtmp)); else You_hear("a thumping sound."); if (x==u.ux && y==u.uy) You("easily dodge the falling %s.", mon_nam(mtmp)); newsym(x,y); } } if (!rn2(14 - force)) switch (levl[x][y].typ) { case FOUNTAIN : /* Make the fountain disappear */ if (cansee(x,y)) pline_The("fountain falls into a chasm."); goto do_pit; #ifdef SINKS case SINK : if (cansee(x,y)) pline_The("kitchen sink falls into a chasm."); goto do_pit; case TOILET : if (cansee(x,y)) pline("The toilet falls into a chasm."); goto do_pit; #endif case ALTAR : if (Is_astralevel(&u.uz) || Is_sanctum(&u.uz)) break; if (cansee(x,y)) pline_The("altar falls into a chasm."); goto do_pit; case GRAVE : if (cansee(x,y)) pline_The("headstone topples into a chasm."); goto do_pit; case THRONE : if (cansee(x,y)) pline_The("throne falls into a chasm."); /* Falls into next case */ case ROOM : case CORR : /* Try to make a pit */ do_pit: chasm = maketrap(x,y,PIT); if (!chasm) break; /* no pit if portal at that location */ chasm->tseen = 1; levl[x][y].doormask = 0; mtmp = m_at(x,y); if ((otmp = sobj_at(BOULDER, x, y)) != 0) { if (cansee(x, y)) pline("KADOOM! The boulder falls into a chasm%s!", ((x == u.ux) && (y == u.uy)) ? " below you" : ""); if (mtmp) mtmp->mtrapped = 0; obj_extract_self(otmp); (void) flooreffects(otmp, x, y, ""); break; } /* We have to check whether monsters or player falls in a chasm... */ if (mtmp) { if(!is_flyer(mtmp->data) && !is_clinger(mtmp->data)) { mtmp->mtrapped = 1; if(cansee(x,y)) pline("%s falls into a chasm!", Monnam(mtmp)); else if (flags.soundok && humanoid(mtmp->data)) You_hear("a scream!"); mselftouch(mtmp, "Falling, ", TRUE); if (mtmp->mhp > 0) if ((mtmp->mhp -= rnd(6)) <= 0) { if(!cansee(x,y)) pline("It is destroyed!"); else { You("destroy %s!", mtmp->mtame ? x_monnam(mtmp, ARTICLE_THE, "poor", mtmp->mnamelth ? SUPPRESS_SADDLE : 0, FALSE): mon_nam(mtmp)); } xkilled(mtmp,0); } } } else if (x == u.ux && y == u.uy) { /* KMH, balance patch -- new intrinsic */ if (Levitation || Flying || is_clinger(youmonst.data)) { pline("A chasm opens up under you!"); You("don't fall in!"); } else { You("fall into a chasm!"); u.utrap = rn1(6,2); u.utraptype = TT_PIT; losehp(rnd(6),"fell into a chasm", NO_KILLER_PREFIX); selftouch("Falling, you"); } } else newsym(x,y); break; case DOOR : /* Make the door collapse */ /* ALI - artifact doors */ if (artifact_door(x, y)) break; if (levl[x][y].doormask == D_NODOOR) goto do_pit; if (cansee(x,y)) pline_The("door collapses."); 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; } } } /* * The player is trying to extract something from his/her instrument. */ STATIC_OVL int do_improvisation(instr) struct obj *instr; { int damage, do_spec = !Confusion; #if defined(MAC) || defined(AMIGA) || defined(VPIX_MUSIC) || defined (PCMUSIC) struct obj itmp; itmp = *instr; /* if won't yield special effect, make sound of mundane counterpart */ if (!do_spec || instr->spe <= 0) while (objects[itmp.otyp].oc_magic) itmp.otyp -= 1; # ifdef MAC mac_speaker(&itmp, "C"); # endif # ifdef AMIGA amii_speaker(&itmp, "Cw", AMII_OKAY_VOLUME); # endif # ifdef VPIX_MUSIC if (sco_flag_console) speaker(&itmp, "C"); # endif #ifdef PCMUSIC pc_speaker ( &itmp, "C"); #endif #endif /* MAC || AMIGA || VPIX_MUSIC || PCMUSIC */ if (!do_spec) pline("What you produce is quite far from music..."); else You("start playing %s.", the(xname(instr))); switch (instr->otyp) { case MAGIC_FLUTE: /* Make monster fall asleep */ if (do_spec && instr->spe > 0) { consume_obj_charge(instr, TRUE); You("produce soft music."); put_monsters_to_sleep(u.ulevel * 5); exercise(A_DEX, TRUE); break; } /* else FALLTHRU */ case WOODEN_FLUTE: /* May charm snakes */ /* KMH, balance patch -- removed case PAN_PIPE: */ 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; case FROST_HORN: /* Idem wand of cold */ case FIRE_HORN: /* Idem wand of fire */ if (do_spec && instr->spe > 0) { consume_obj_charge(instr, TRUE); 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, KILLED_BY); } } else { buzz((instr->otyp == FROST_HORN) ? AD_COLD-1 : AD_FIRE-1, rn1(6,6), u.ux, u.uy, u.dx, u.dy); } makeknown(instr->otyp); break; } /* else FALLTHRU */ case TOOLED_HORN: /* Awaken or scare monsters */ You("produce a frightful, grave sound."); awaken_monsters(u.ulevel * 30); exercise(A_WIS, FALSE); break; case BUGLE: /* Awaken & attract soldiers */ You("extract a loud noise from %s.", the(xname(instr))); awaken_soldiers(); exercise(A_WIS, FALSE); break; case MAGIC_HARP: /* Charm monsters */ if (do_spec && instr->spe > 0) { consume_obj_charge(instr, TRUE); pline("%s very attractive music.", Tobjnam(instr, "produce")); charm_monsters((u.ulevel - 1) / 3 + 1); exercise(A_DEX, TRUE); break; } /* else FALLTHRU */ case WOODEN_HARP: /* May calm Nymph */ do_spec &= (rn2(ACURR(A_DEX)) + u.ulevel > 25); pline("%s %s.", The(xname(instr)), do_spec ? "produces a lilting melody" : "twangs"); if (do_spec) calm_nymphs(u.ulevel * 3); exercise(A_DEX, TRUE); break; case DRUM_OF_EARTHQUAKE: /* create several pits */ if (do_spec && instr->spe > 0) { consume_obj_charge(instr, TRUE); You("produce a heavy, thunderous rolling!"); pline_The("entire dungeon is shaking around you!"); do_earthquake((u.ulevel - 1) / 3 + 1); /* shake up monsters in a much larger radius... */ awaken_monsters(ROWNO * COLNO); makeknown(DRUM_OF_EARTHQUAKE); break; } /* else FALLTHRU */ /* KMH, balance patch -- removed (in the wrong place anyways) */ #if 0 case PAN_PIPE_OF_SUMMONING: /* yikes! */ if (instr->spe > 0) { register int cnt = 1; instr->spe--; cnt += rn2(4) + 3; while(cnt--) (void) makemon((struct permonst *) 0, u.ux, u.uy, NO_MM_FLAGS); } break; case PAN_PIPE_OF_THE_SEWERS: You("call out the rats!"); if (instr->spe > 0) { register int cnt = 1; register struct monst *mtmp; instr->spe--; cnt += rn2(4) + 3; while(cnt--) { mtmp = makemon(&mons[PM_SEWER_RAT], u.ux, u.uy, NO_MM_FLAGS); (void) tamedog(mtmp, (struct obj *) 0); } } break; #endif case LEATHER_DRUM: /* Awaken monsters */ You("beat a deafening row!"); awaken_monsters(u.ulevel * 40); exercise(A_WIS, FALSE); break; default: impossible("What a weird instrument (%d)!", instr->otyp); break; } return 2; /* That takes time */ } /* * So you want music... */ int do_play_instrument(instr) struct obj *instr; { char buf[BUFSZ], c = 'y'; char *s; int x,y; boolean ok; if (Underwater) { You_cant("play music underwater!"); return(0); } if (instr->otyp != LEATHER_DRUM && instr->otyp != DRUM_OF_EARTHQUAKE) { c = yn("Improvise?"); } if (c == 'n') { if (u.uevent.uheard_tune == 2 && yn("Play the passtune?") == 'y') { Strcpy(buf, tune); } else { getlin("What tune are you playing? [5 notes, A-G]", buf); (void)mungspaces(buf); /* convert to uppercase and change any "H" to the expected "B" */ for (s = buf; *s; s++) { #ifndef AMIGA *s = highc(*s); #else /* The AMIGA supports two octaves of notes */ if (*s == 'h') *s = 'b'; #endif if (*s == 'H') *s = 'B'; } } You("extract a strange sound from %s!", the(xname(instr))); #ifdef UNIX386MUSIC /* if user is at the console, play through the console speaker */ if (atconsole()) speaker(instr, buf); #endif #ifdef VPIX_MUSIC if (sco_flag_console) speaker(instr, buf); #endif #ifdef MAC mac_speaker ( instr , buf ) ; #endif #ifdef PCMUSIC pc_speaker ( instr, buf ); #endif #ifdef AMIGA { char nbuf[ 20 ]; int i; for( i = 0; buf[i] && i < 5; ++i ) { nbuf[ i*2 ] = buf[ i ]; nbuf[ (i*2)+1 ] = 'h'; } nbuf[ i*2 ] = 0; amii_speaker ( instr , nbuf, AMII_OKAY_VOLUME ) ; } #endif /* Check if there was the Stronghold drawbridge near * and if the tune conforms to what we're waiting for. */ if(Is_stronghold(&u.uz)) { exercise(A_WIS, TRUE); /* just for trying */ if(!strcmp(buf,tune)) { /* Search for the drawbridge */ for(y=u.uy-1; y<=u.uy+1; y++) for(x=u.ux-1;x<=u.ux+1;x++) if(isok(x,y)) if(find_drawbridge(&x,&y)) { u.uevent.uheard_tune = 2; /* tune now fully known */ if(levl[x][y].typ == DRAWBRIDGE_DOWN) close_drawbridge(x,y); else open_drawbridge(x,y); return 0; } } else if(flags.soundok) { if (u.uevent.uheard_tune < 1) u.uevent.uheard_tune = 1; /* Okay, it wasn't the right tune, but perhaps * we can give the player some hints like in the * Mastermind game */ ok = FALSE; for(y = u.uy-1; y <= u.uy+1 && !ok; y++) for(x = u.ux-1; x <= u.ux+1 && !ok; x++) if(isok(x,y)) if(IS_DRAWBRIDGE(levl[x][y].typ) || is_drawbridge_wall(x,y) >= 0) ok = TRUE; if(ok) { /* There is a drawbridge near */ int tumblers, gears; boolean matched[5]; tumblers = gears = 0; for(x=0; x < 5; x++) matched[x] = FALSE; for(x=0; x < (int)strlen(buf); x++) if(x < 5) { if(buf[x] == tune[x]) { gears++; matched[x] = TRUE; } else for(y=0; y < 5; y++) if(!matched[y] && buf[x] == tune[y] && buf[y] != tune[y]) { tumblers++; matched[y] = TRUE; break; } } if(tumblers) { if(gears) You_hear("%d tumbler%s click and %d gear%s turn.", tumblers, plur(tumblers), gears, plur(gears)); else You_hear("%d tumbler%s click.", tumblers, plur(tumblers)); } else if(gears) { You_hear("%d gear%s turn.", gears, plur(gears)); /* could only get `gears == 5' by playing five correct notes followed by excess; otherwise, tune would have matched above */ if (gears == 5) u.uevent.uheard_tune = 2; } } } } return 1; } else return do_improvisation(instr); } #ifdef UNIX386MUSIC /* * Play audible music on the machine's speaker if appropriate. */ STATIC_OVL int atconsole() { /* * Kluge alert: This code assumes that your [34]86 has no X terminals * attached and that the console tty type is AT386 (this is always true * under AT&T UNIX for these boxen). The theory here is that your remote * ttys will have terminal type `ansi' or something else other than * `AT386' or `xterm'. We'd like to do better than this, but testing * to see if we're running on the console physical terminal is quite * difficult given the presence of virtual consoles and other modern * UNIX impedimenta... */ char *termtype = nh_getenv("TERM"); return(!strcmp(termtype, "AT386") || !strcmp(termtype, "xterm")); } STATIC_OVL void speaker(instr, buf) struct obj *instr; char *buf; { /* * For this to work, you need to have installed the PD speaker-control * driver for PC-compatible UNIX boxes that I (esr@snark.thyrsus.com) * posted to comp.sources.unix in Feb 1990. A copy should be included * with your nethack distribution. */ int fd; if ((fd = open("/dev/speaker", 1)) != -1) { /* send a prefix to modify instrumental `timbre' */ switch (instr->otyp) { case WOODEN_FLUTE: case MAGIC_FLUTE: (void) write(fd, ">ol", 1); /* up one octave & lock */ break; case TOOLED_HORN: case FROST_HORN: case FIRE_HORN: (void) write(fd, "< #include #include # else #define KIOC ('K' << 8) #define KDMKTONE (KIOC | 8) # endif #define noDEBUG STATIC_OVL void tone(hz, ticks) /* emit tone of frequency hz for given number of ticks */ unsigned int hz, ticks; { ioctl(0,KDMKTONE,hz|((ticks*10)<<16)); # ifdef DEBUG printf("TONE: %6d %6d\n",hz,ticks * 10); # endif nap(ticks * 10); } STATIC_OVL void rest(ticks) /* rest for given number of ticks */ int ticks; { nap(ticks * 10); # ifdef DEBUG printf("REST: %6d\n",ticks * 10); # endif } #include "interp.c" /* from snd86unx.shr */ STATIC_OVL void speaker(instr, buf) struct obj *instr; char *buf; { /* emit a prefix to modify instrumental `timbre' */ playinit(); switch (instr->otyp) { case WOODEN_FLUTE: case MAGIC_FLUTE: playstring(">ol", 1); /* up one octave & lock */ break; case TOOLED_HORN: case FROST_HORN: case FIRE_HORN: playstring("< #endif #define DATAPREFIX 4 #ifdef DLB /* * Data librarian. Present a STDIO-like interface to NetHack while * multiplexing on one or more "data libraries". If a file is not found * in a given library, look for it outside the libraries. */ typedef struct dlb_procs { boolean NDECL((*dlb_init_proc)); void NDECL((*dlb_cleanup_proc)); boolean FDECL((*dlb_fopen_proc), (DLB_P,const char *,const char *)); int FDECL((*dlb_fclose_proc), (DLB_P)); int FDECL((*dlb_fread_proc), (char *,int,int,DLB_P)); int FDECL((*dlb_fseek_proc), (DLB_P,long,int)); char *FDECL((*dlb_fgets_proc), (char *,int,DLB_P)); int FDECL((*dlb_fgetc_proc), (DLB_P)); long FDECL((*dlb_ftell_proc), (DLB_P)); } dlb_procs_t; /* without extern.h via hack.h, these haven't been declared for us */ #ifdef FILE_AREAS extern FILE *FDECL(fopen_datafile_area, (const char *,const char *, const char *,int)); #else /* * If FILE_AREAS is not defined, then fopen_datafile_area * is a macro defined in terms of fopen_datafile. */ extern FILE *FDECL(fopen_datafile, (const char *,const char *,int)); #endif #ifdef DLBLIB /* * Library Implementation: * * When initialized, we open all library files and read in their tables * of contents. The library files stay open all the time. When * a open is requested, the libraries' directories are searched. If * successful, we return a descriptor that contains the library, file * size, and current file mark. This descriptor is used for all * successive calls. * * The ability to open more than one library is supported but used * only in the Amiga port (the second library holds the sound files). * For Unix, the idea would be to split the NetHack library * into text and binary parts, where the text version could be shared. */ #define MAX_LIBS 4 static library dlb_libs[MAX_LIBS]; static boolean FDECL(readlibdir,(library *lp)); static boolean FDECL(find_file,(const char *name, library **lib, long *startp, long *sizep)); static boolean NDECL(lib_dlb_init); static void NDECL(lib_dlb_cleanup); static boolean FDECL(lib_dlb_fopen,(dlb *, const char *, const char *)); static int FDECL(lib_dlb_fclose,(dlb *)); static int FDECL(lib_dlb_fread,(char *, int, int, dlb *)); static int FDECL(lib_dlb_fseek,(dlb *, long, int)); static char *FDECL(lib_dlb_fgets,(char *, int, dlb *)); static int FDECL(lib_dlb_fgetc,(dlb *)); static long FDECL(lib_dlb_ftell,(dlb *)); /* not static because shared with dlb_main.c */ boolean FDECL(open_library,(const char *lib_area, const char *lib_name, library *lp)); void FDECL(close_library,(library *lp)); /* without extern.h via hack.h, these haven't been declared for us */ extern char *FDECL(eos, (char *)); /* * Read the directory out of the library. Return 1 if successful, * 0 if it failed. * * NOTE: An improvement of the file structure should be the file * size as part of the directory entry or perhaps in place of the * offset -- the offset can be calculated by a running tally of * the sizes. * * Library file structure: * * HEADER: * %3ld library FORMAT revision (currently rev 1) * %1c space * %8ld # of files in archive (includes 1 for directory) * %1c space * %8ld size of allocation for string space for directory names * %1c space * %8ld library offset - sanity check - lseek target for start of first file * %1c space * %8ld size - sanity check - byte size of complete archive file * * followed by one DIRECTORY entry for each file in the archive, including * the directory itself: * %1c handling information (compression, etc.) Always ' ' in rev 1. * %s file name * %1c space * %8ld offset in archive file of start of this file * %c newline * * followed by the contents of the files */ #define DLB_MIN_VERS 1 /* min library version readable by this code */ #define DLB_MAX_VERS 1 /* max library version readable by this code */ /* * Read the directory from the library file. This will allocate and * fill in our globals. The file pointer is reset back to position * zero. If any part fails, leave nothing that needs to be deallocated. * * Return TRUE on success, FALSE on failure. */ static boolean readlibdir(lp) library *lp; /* library pointer to fill in */ { int i; char *sp; long liboffset, totalsize; if (fscanf(lp->fdata, "%ld %ld %ld %ld %ld\n", &lp->rev,&lp->nentries,&lp->strsize,&liboffset,&totalsize) != 5) return FALSE; if (lp->rev > DLB_MAX_VERS || lp->rev < DLB_MIN_VERS) return FALSE; lp->dir = (libdir *) alloc(lp->nentries * sizeof(libdir)); lp->sspace = (char *) alloc(lp->strsize); /* read in each directory entry */ for (i = 0, sp = lp->sspace; i < lp->nentries; i++) { lp->dir[i].fname = sp; if (fscanf(lp->fdata, "%c%s %ld\n", &lp->dir[i].handling, sp, &lp->dir[i].foffset) != 3) { free((genericptr_t) lp->dir); free((genericptr_t) lp->sspace); lp->dir = (libdir *) 0; lp->sspace = (char *) 0; return FALSE; } sp = eos(sp) + 1; } /* calculate file sizes using offset information */ for (i = 0; i < lp->nentries; i++) { if (i == lp->nentries - 1) lp->dir[i].fsize = totalsize - lp->dir[i].foffset; else lp->dir[i].fsize = lp->dir[i+1].foffset - lp->dir[i].foffset; } (void) fseek(lp->fdata, 0L, SEEK_SET); /* reset back to zero */ lp->fmark = 0; return TRUE; } /* * Look for the file in our directory structure. Return 1 if successful, * 0 if not found. Fill in the size and starting position. */ static boolean find_file(name, lib, startp, sizep) const char *name; library **lib; long *startp, *sizep; { int i, j; library *lp; for (i = 0; i < MAX_LIBS && dlb_libs[i].fdata; i++) { lp = &dlb_libs[i]; for (j = 0; j < lp->nentries; j++) { if (FILENAME_CMP(name, lp->dir[j].fname) == 0) { *lib = lp; *startp = lp->dir[j].foffset; *sizep = lp->dir[j].fsize; return TRUE; } } } *lib = (library *) 0; *startp = *sizep = 0; return FALSE; } /* * Open the library of the given name and fill in the given library * structure. Return TRUE if successful, FALSE otherwise. */ boolean open_library(lib_area, lib_name, lp) const char *lib_area, *lib_name; library *lp; { boolean status = FALSE; lp->fdata = fopen_datafile_area(lib_area, lib_name, RDBMODE, DATAPREFIX); if (lp->fdata) { if (readlibdir(lp)) { status = TRUE; } else { (void) fclose(lp->fdata); lp->fdata = (FILE *) 0; } } return status; } void close_library(lp) library *lp; { (void) fclose(lp->fdata); free((genericptr_t) lp->dir); free((genericptr_t) lp->sspace); (void) memset((char *)lp, 0, sizeof(library)); } /* * Open the library file once using stdio. Keep it open, but * keep track of the file position. */ static boolean lib_dlb_init() { /* zero out array */ (void) memset((char *)&dlb_libs[0], 0, sizeof(dlb_libs)); /* To open more than one library, add open library calls here. */ if (!open_library(DLBAREA, DLBFILE, &dlb_libs[0])) return FALSE; #ifdef DLBFILE2 if (!open_library(DLBAREA2, DLBFILE2, &dlb_libs[1])) { close_library(&dlb_libs[0]); return FALSE; } #endif return TRUE; } static void lib_dlb_cleanup() { int i; /* close the data file(s) */ for (i = 0; i < MAX_LIBS && dlb_libs[i].fdata; i++) close_library(&dlb_libs[i]); } static boolean lib_dlb_fopen(dp, name, mode) dlb *dp; const char *name, *mode; { long start, size; library *lp; /* look up file in directory */ if (find_file(name, &lp, &start, &size)) { dp->lib = lp; dp->start = start; dp->size = size; dp->mark = 0; return TRUE; } return FALSE; /* failed */ } static int lib_dlb_fclose(dp) dlb *dp; { /* nothing needs to be done */ return 0; } static int lib_dlb_fread(buf, size, quan, dp) char *buf; int size, quan; dlb *dp; { long pos, nread, nbytes; /* make sure we don't read into the next file */ if ((dp->size - dp->mark) < (size * quan)) quan = (dp->size - dp->mark) / size; if (quan == 0) return 0; pos = dp->start + dp->mark; if (dp->lib->fmark != pos) { fseek(dp->lib->fdata, pos, SEEK_SET); /* check for error??? */ dp->lib->fmark = pos; } nread = fread(buf, size, quan, dp->lib->fdata); nbytes = nread * size; dp->mark += nbytes; dp->lib->fmark += nbytes; return nread; } static int lib_dlb_fseek(dp, pos, whence) dlb *dp; long pos; int whence; { long curpos; switch (whence) { case SEEK_CUR: curpos = dp->mark + pos; break; case SEEK_END: curpos = dp->size - pos; break; default: /* set */ curpos = pos; break; } if (curpos < 0) curpos = 0; if (curpos > dp->size) curpos = dp->size; dp->mark = curpos; return 0; } static char * lib_dlb_fgets(buf, len, dp) char *buf; int len; dlb *dp; { int i; char *bp, c = 0; if (len <= 0) return buf; /* sanity check */ /* return NULL on EOF */ if (dp->mark >= dp->size) return (char *) 0; len--; /* save room for null */ for (i = 0, bp = buf; i < len && dp->mark < dp->size && c != '\n'; i++, bp++) { if (dlb_fread(bp, 1, 1, dp) <= 0) break; /* EOF or error */ c = *bp; } *bp = '\0'; #if defined(MSDOS) || defined(WIN32) if ((bp = index(buf, '\r')) != 0) { *bp++ = '\n'; *bp = '\0'; } #endif return buf; } static int lib_dlb_fgetc(dp) dlb *dp; { char c; if (lib_dlb_fread(&c, 1, 1, dp) != 1) return EOF; return (int) c; } static long lib_dlb_ftell(dp) dlb *dp; { return dp->mark; } const dlb_procs_t lib_dlb_procs = { lib_dlb_init, lib_dlb_cleanup, lib_dlb_fopen, lib_dlb_fclose, lib_dlb_fread, lib_dlb_fseek, lib_dlb_fgets, lib_dlb_fgetc, lib_dlb_ftell }; #endif /* DLBLIB */ #ifdef DLBRSRC const dlb_procs_t rsrc_dlb_procs = { rsrc_dlb_init, rsrc_dlb_cleanup, rsrc_dlb_fopen, rsrc_dlb_fclose, rsrc_dlb_fread, rsrc_dlb_fseek, rsrc_dlb_fgets, rsrc_dlb_fgetc, rsrc_dlb_ftell }; #endif /* Global wrapper functions ------------------------------------------------ */ #define do_dlb_init (*dlb_procs->dlb_init_proc) #define do_dlb_cleanup (*dlb_procs->dlb_cleanup_proc) #define do_dlb_fopen (*dlb_procs->dlb_fopen_proc) #define do_dlb_fclose (*dlb_procs->dlb_fclose_proc) #define do_dlb_fread (*dlb_procs->dlb_fread_proc) #define do_dlb_fseek (*dlb_procs->dlb_fseek_proc) #define do_dlb_fgets (*dlb_procs->dlb_fgets_proc) #define do_dlb_fgetc (*dlb_procs->dlb_fgetc_proc) #define do_dlb_ftell (*dlb_procs->dlb_ftell_proc) static const dlb_procs_t *dlb_procs; static boolean dlb_initialized = FALSE; boolean dlb_init() { if (!dlb_initialized) { #ifdef DLBLIB dlb_procs = &lib_dlb_procs; #endif #ifdef DLBRSRC dlb_procs = &rsrc_dlb_procs; #endif if (dlb_procs) dlb_initialized = do_dlb_init(); } return dlb_initialized; } void dlb_cleanup() { if (dlb_initialized) { do_dlb_cleanup(); dlb_initialized = FALSE; } } dlb * #ifndef FILE_AREAS dlb_fopen(name, mode) const char *name, *mode; #else dlb_fopen_area(area, name, mode) const char *area, *name, *mode; #endif { FILE *fp; dlb *dp; if (!dlb_initialized) return (dlb *) 0; dp = (dlb *) alloc(sizeof(dlb)); if (do_dlb_fopen(dp, name, mode)) dp->fp = (FILE *) 0; #ifndef FILE_AREAS else if ((fp = fopen_datafile(name, mode, DATAPREFIX)) != 0) #else else if ((fp = fopen_datafile_area(area, name, mode, DATAPREFIX)) != 0) #endif dp->fp = fp; else { /* can't find anything */ free((genericptr_t) dp); dp = (dlb *) 0; } return dp; } int dlb_fclose(dp) dlb *dp; { int ret = 0; if (dlb_initialized) { if (dp->fp) ret = fclose(dp->fp); else ret = do_dlb_fclose(dp); free((genericptr_t) dp); } return ret; } int dlb_fread(buf, size, quan, dp) char *buf; int size, quan; dlb *dp; { if (!dlb_initialized || size <= 0 || quan <= 0) return 0; if (dp->fp) return (int) fread(buf, size, quan, dp->fp); return do_dlb_fread(buf, size, quan, dp); } int dlb_fseek(dp, pos, whence) dlb *dp; long pos; int whence; { if (!dlb_initialized) return EOF; if (dp->fp) return fseek(dp->fp, pos, whence); return do_dlb_fseek(dp, pos, whence); } char * dlb_fgets(buf, len, dp) char *buf; int len; dlb *dp; { if (!dlb_initialized) return (char *) 0; if (dp->fp) return fgets(buf, len, dp->fp); return do_dlb_fgets(buf, len, dp); } int dlb_fgetc(dp) dlb *dp; { if (!dlb_initialized) return EOF; if (dp->fp) return fgetc(dp->fp); return do_dlb_fgetc(dp); } long dlb_ftell(dp) dlb *dp; { if (!dlb_initialized) return 0; if (dp->fp) return ftell(dp->fp); return do_dlb_ftell(dp); } #endif /* DLB */ /*dlb.c*/ slashem-0.0.7E7F3/src/mapglyph.c0000664000076400007640000001577210545462317014444 0ustar aliali/* SCCS Id: @(#)mapglyph.c 3.4 2003/01/08 */ /* 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" #define HI_DOMESTIC CLR_WHITE /* monst.c */ 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; #if defined(TEXTCOLOR) || defined(ROGUE_COLOR) int color = NO_COLOR; #endif 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 #ifdef TEXTCOLOR /* provide a visible difference if normal and lit corridor * use the same symbol */ if (iflags.use_color && offset == S_litcorr && ch == showsyms[S_corr]) color = CLR_WHITE; 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 COIN_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); /* special case the hero for `showrace' option */ #ifdef TEXTCOLOR if (iflags.use_color && x == u.ux && y == u.uy && iflags.showrace && !Upolyd) color = HI_DOMESTIC; #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; #endif *ochar = (int)ch; *ospecial = special; #ifdef TEXTCOLOR *ocolor = color; #endif return; } /*mapglyph.c*/ slashem-0.0.7E7F3/src/detect.c0000664000076400007640000010511610545462317014063 0ustar aliali/* SCCS Id: @(#)detect.c 3.4 2003/08/13 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ /* * Detection routines, including crystal ball, magic mapping, and search * command. */ #include "hack.h" #include "artifact.h" 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)); STATIC_PTR void FDECL(openone,(int,int,genericptr_t)); /* Recursively search obj for an object in class oclass and return 1st found */ struct obj * o_in(obj, oclass) struct obj* obj; char oclass; { register struct obj* otmp; struct obj *temp; if (obj->oclass == oclass) return obj; /* * Pills inside medical kits are specially handled (see apply.c). * We don't want them to detect as food because then they will be * shown as pink pills, which are something quite different. In * practice the only other possible contents of medical kits are * bandages and phials, neither of which is detectable by any * means so we can simply avoid looking in medical kits. */ if (Has_contents(obj) && obj->otyp != MEDICAL_KIT) { for (otmp = obj->cobj; otmp; otmp = otmp->nobj) if (otmp->oclass == oclass) return otmp; else if (Has_contents(otmp) && otmp->otyp != MEDICAL_KIT && (temp = o_in(otmp, oclass))) return temp; } 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; { struct obj *otmp; obj->dknown = 1; if (Has_contents(obj)) { for(otmp = obj->cobj; otmp; otmp = otmp->nobj) do_dknown_of(otmp); } } /* 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; register struct monst *mtmp; glyph = glyph_at(x,y); if (glyph_is_object(glyph)) { /* there's some object shown here */ 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 == COIN_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; } /* When doing detection, remove stale data from the map display (corpses rotted away, objects carried away by monsters, etc) so that it won't reappear after the detection has completed. Return true if noticeable 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; } return change_made; } /* look for gold, on the floor or in monsters' possession */ int gold_detect(sobj) register struct obj *sobj; { register struct obj *obj; register struct monst *mtmp; int uw = u.uinwater; struct obj *temp; boolean stale; known = stale = clear_stale_map(COIN_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, COIN_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, COIN_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 */ if (stale) docrt(); You("notice some gold between your %s.", makeplural(body_part(FOOT))); return(0); outgoldmap: cls(); 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, COIN_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; gold.ox = mtmp->mx; 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, COIN_CLASS))) { temp->ox = mtmp->mx; temp->oy = mtmp->my; map_object(temp,1); break; } } newsym(u.ux,u.uy); You_feel("very greedy, and sense gold!"); exercise(A_WIS, TRUE); display_nhwindow(WIN_MAP, TRUE); docrt(); u.uinwater = uw; if (Underwater) under_water(2); if (u.uburied) under_ground(2); return(0); } /* returns 1 if nothing was detected */ /* returns 0 if something was detected */ int food_detect(sobj) register struct obj *sobj; { register struct obj *obj; register struct monst *mtmp; register int ct = 0, ctu = 0; boolean confused = (Confusion || (sobj && sobj->cursed)), stale; char oclass = confused ? POTION_CLASS : FOOD_CLASS; 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)) { if (obj->ox == u.ux && obj->oy == u.uy) ctu++; else ct++; } for (mtmp = fmon; mtmp && !ct; mtmp = mtmp->nmon) { /* no DEADMONSTER(mtmp) check needed since dmons never have inventory */ for (obj = mtmp->minvent; obj; obj = obj->nobj) if (o_in(obj, oclass)) { ct++; break; } } if (!ct && !ctu) { known = stale && !confused; 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; cls(); u.uinwater = 0; for (obj = fobj; obj; obj = obj->nobj) if ((temp = o_in(obj, oclass)) != 0) { if (temp != obj) { temp->ox = obj->ox; temp->oy = obj->oy; } map_object(temp,1); } for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) /* no DEADMONSTER(mtmp) check needed since dmons never have inventory */ for (obj = mtmp->minvent; obj; obj = obj->nobj) if ((temp = o_in(obj, oclass)) != 0) { temp->ox = mtmp->mx; temp->oy = mtmp->my; map_object(temp,1); 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); docrt(); u.uinwater = uw; if (Underwater) under_water(2); if (u.uburied) under_ground(2); } return(0); } /* * Used for scrolls, potions, spells, and crystal balls. Returns: * * 1 - nothing was detected * 0 - something was detected */ int object_detect(detector, class) struct obj *detector; /* object doing the detecting */ int class; /* an object class, 0 for all */ { register int x, y; char stuff[BUFSZ]; int is_cursed = (detector && detector->cursed); int do_dknown = (detector && (detector->oclass == POTION_CLASS || detector->oclass == SPBOOK_CLASS) && detector->blessed); int ct = 0, ctu = 0; register struct obj *obj, *otmp = (struct obj *)0; register struct monst *mtmp; int uw = u.uinwater; int sym, boulder = 0; if (class < 0 || class >= MAXOCLASSES) { impossible("object_detect: illegal class %d", class); class = 0; } /* Special boulder symbol check - does the class symbol happen * to match iflags.bouldersym which is a user-defined? * If so, that means we aren't sure what they really wanted to * detect. Rather than trump anything, show both possibilities. * We can exclude checking the buried obj chain for boulders below. */ sym = class ? def_oc_syms[class] : 0; if (sym && iflags.bouldersym && sym == iflags.bouldersym) boulder = ROCK_CLASS; if (Hallucination || (Confusion && class == SCROLL_CLASS)) Strcpy(stuff, something); else Strcpy(stuff, class ? oclass_names[class] : "objects"); if (boulder && class != ROCK_CLASS) Strcat(stuff, " and/or large stones"); if (do_dknown) for(obj = invent; obj; obj = obj->nobj) do_dknown_of(obj); for (obj = fobj; obj; obj = obj->nobj) { if ((!class && !boulder) || o_in(obj, class) || o_in(obj, boulder)) { if (obj->ox == u.ux && obj->oy == u.uy) ctu++; else ct++; } if (do_dknown) do_dknown_of(obj); } for (obj = level.buriedobjlist; obj; obj = obj->nobj) { if (!class || o_in(obj, class)) { if (obj->ox == u.ux && obj->oy == u.uy) ctu++; else ct++; } if (do_dknown) do_dknown_of(obj); } for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) { if (DEADMONSTER(mtmp)) continue; for (obj = mtmp->minvent; obj; obj = obj->nobj) { if ((!class && !boulder) || o_in(obj, class) || o_in(obj, boulder)) ct++; if (do_dknown) do_dknown_of(obj); } if ((is_cursed && mtmp->m_ap_type == M_AP_OBJECT && (!class || class == objects[mtmp->mappearance].oc_class)) || #ifndef GOLDOBJ (mtmp->mgold && (!class || class == COIN_CLASS))) { #else (findgold(mtmp->minvent) && (!class || class == COIN_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."); return 1; } You("sense %s nearby.", stuff); return 0; } cls(); u.uinwater = 0; /* * Map all buried objects first. */ for (obj = level.buriedobjlist; obj; obj = obj->nobj) if (!class || (otmp = o_in(obj, class))) { if (class) { if (otmp != obj) { otmp->ox = obj->ox; otmp->oy = obj->oy; } map_object(otmp, 1); } else map_object(obj, 1); } /* * If we are mapping all objects, map only the top object of a pile or * the first object in a monster's inventory. Otherwise, go looking * for a matching object class and display the first one encountered * at each location. * * Objects on the floor override buried objects. */ for (x = 1; x < COLNO; x++) for (y = 0; y < ROWNO; y++) for (obj = level.objects[x][y]; obj; obj = obj->nexthere) if ((!class && !boulder) || (otmp = o_in(obj, class)) || (otmp = o_in(obj, boulder))) { if (class || boulder) { if (otmp != obj) { otmp->ox = obj->ox; otmp->oy = obj->oy; } map_object(otmp, 1); } else map_object(obj, 1); break; } /* Objects in the monster's inventory override floor objects. */ for (mtmp = fmon ; mtmp ; mtmp = mtmp->nmon) { if (DEADMONSTER(mtmp)) continue; for (obj = mtmp->minvent; obj; obj = obj->nobj) if ((!class && !boulder) || (otmp = o_in(obj, class)) || (otmp = o_in(obj, boulder))) { if (!class && !boulder) otmp = obj; otmp->ox = mtmp->mx; /* at monster location */ otmp->oy = mtmp->my; map_object(otmp, 1); break; } /* Allow a mimic to override the detected objects it is carrying. */ if (is_cursed && mtmp->m_ap_type == M_AP_OBJECT && (!class || class == objects[mtmp->mappearance].oc_class)) { struct obj temp; temp.otyp = mtmp->mappearance; /* needed for obj_to_glyph() */ temp.ox = mtmp->mx; temp.oy = mtmp->my; temp.corpsenm = PM_TENGU; /* if mimicing a corpse */ map_object(&temp, 1); #ifndef GOLDOBJ } else if (mtmp->mgold && (!class || class == COIN_CLASS)) { #else } else if (findgold(mtmp->minvent) && (!class || class == COIN_CLASS)) { #endif struct obj gold; gold.otyp = GOLD_PIECE; gold.ox = mtmp->mx; gold.oy = mtmp->my; map_object(&gold, 1); } } newsym(u.ux,u.uy); You("detect the %s of %s.", ct ? "presence" : "absence", stuff); display_nhwindow(WIN_MAP, TRUE); /* * What are we going to do when the hero does an object detect while blind * and the detected object covers a known pool? */ docrt(); /* this will correctly reset vision */ u.uinwater = uw; if (Underwater) under_water(2); if (u.uburied) under_ground(2); return 0; } /* * Used by: crystal balls, potions, fountains * * Returns 1 if nothing was detected. * Returns 0 if something was detected. */ int monster_detect(otmp, mclass) register struct obj *otmp; /* detecting object (if any) */ int mclass; /* monster class, 0 for all */ { register struct monst *mtmp; int mcnt = 0; /* Note: This used to just check fmon for a non-zero value * but in versions since 3.3.0 fmon can test TRUE due to the * presence of dmons, so we have to find at least one * with positive hit-points to know for sure. */ for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) if (!DEADMONSTER(mtmp)) { mcnt++; break; } if (!mcnt) { if (otmp) strange_feeling(otmp, Hallucination ? "You get the heebie jeebies." : "You feel threatened."); return 1; } else { boolean woken = FALSE; cls(); for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) { if (DEADMONSTER(mtmp)) continue; if (!mclass || mtmp->data->mlet == mclass || (mtmp->data == &mons[PM_LONG_WORM] && mclass == S_WORM_TAIL)) if (mtmp->mx > 0) { if (mclass && def_monsyms[mclass] == ' ') show_glyph(mtmp->mx,mtmp->my, detected_mon_to_glyph(mtmp)); else show_glyph(mtmp->mx,mtmp->my,mon_to_glyph(mtmp)); /* don't be stingy - display entire worm */ if (mtmp->data == &mons[PM_LONG_WORM]) detect_wsegs(mtmp,0); } if (otmp && otmp->cursed && (mtmp->msleeping || !mtmp->mcanmove)) { mtmp->msleeping = mtmp->mfrozen = 0; mtmp->mcanmove = 1; woken = TRUE; } } display_self(); You("sense the presence of monsters."); if (woken) pline("Monsters sense the presence of you."); display_nhwindow(WIN_MAP, TRUE); docrt(); if (Underwater) under_water(2); if (u.uburied) under_ground(2); } return 0; } STATIC_OVL void sense_trap(trap, x, y, src_cursed) struct trap *trap; xchar x, y; int src_cursed; { if (Hallucination || src_cursed) { struct obj obj; /* fake object */ if (trap) { obj.ox = trap->tx; obj.oy = trap->ty; } else { obj.ox = x; obj.oy = y; } obj.otyp = (src_cursed) ? GOLD_PIECE : random_object(); obj.corpsenm = random_monster(); /* if otyp == CORPSE */ map_object(&obj,1); } else if (trap) { map_trap(trap,1); trap->tseen = 1; } else { struct trap temp_trap; /* fake trap */ temp_trap.tx = x; temp_trap.ty = y; temp_trap.ttyp = BEAR_TRAP; /* some kind of trap */ map_trap(&temp_trap,1); } } /* the detections are pulled out so they can */ /* also be used in the crystal ball routine */ /* returns 1 if nothing was detected */ /* returns 0 if something was detected */ int trap_detect(sobj) register struct obj *sobj; /* sobj is null if crystal ball, *scroll if gold detection scroll */ { register struct trap *ttmp; register struct obj *obj; register int door; int uw = u.uinwater; boolean found = FALSE; int x, y; for (ttmp = ftrap; ttmp; ttmp = ttmp->ntrap) { if (ttmp->tx != u.ux || ttmp->ty != u.uy) goto outtrapmap; else found = TRUE; } for (obj = fobj; obj; obj = obj->nobj) { if ((obj->otyp==LARGE_BOX || obj->otyp==CHEST) && obj->otrapped) { if (obj->ox != u.ux || obj->oy != u.uy) goto outtrapmap; else found = TRUE; } } for (door = 0; door < doorindex; door++) { x = doors[door].x; y = doors[door].y; if (levl[x][y].doormask & D_TRAPPED) { if (x != u.ux || y != u.uy) goto outtrapmap; else found = TRUE; } } if (!found) { char buf[42]; Sprintf(buf, "Your %s stop itching.", makeplural(body_part(TOE))); strange_feeling(sobj,buf); return(1); } /* traps exist, but only under me - no separate display required */ Your("%s itch.", makeplural(body_part(TOE))); return(0); outtrapmap: cls(); u.uinwater = 0; for (ttmp = ftrap; ttmp; ttmp = ttmp->ntrap) sense_trap(ttmp, 0, 0, sobj && sobj->cursed); for (obj = fobj; obj; obj = obj->nobj) 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++) { x = doors[door].x; y = doors[door].y; if (levl[x][y].doormask & D_TRAPPED) sense_trap((struct trap *)0, x, y, sobj && sobj->cursed); } newsym(u.ux,u.uy); You_feel("%s.", sobj && sobj->cursed ? "very greedy" : "entrapped"); display_nhwindow(WIN_MAP, TRUE); docrt(); u.uinwater = uw; if (Underwater) under_water(2); if (u.uburied) under_ground(2); return(0); } const char * level_distance(where) d_level *where; { register schar ll = depth(&u.uz) - depth(where); register boolean indun = (u.uz.dnum == where->dnum); if (ll < 0) { if (ll < (-8 - rn2(3))) { if (!indun) return "far away"; else return "far below"; } else if (ll < -1) { if (!indun) return "away below you"; else return "below you"; } else if (!indun) return "in the distance"; else return "just below"; } else if (ll > 0) { if (ll > (8 + rn2(3))) { if (!indun) return "far away"; else return "far above"; } else if (ll > 1) { if (!indun) return "away above you"; else return "above you"; } else if (!indun) return "in the distance"; else return "just above"; } else if (!indun) return "in the distance"; else return "near you"; } static const struct { const char *what; d_level *where; } level_detects[] = { { "Delphi", &oracle_level }, { "Medusa's lair", &medusa_level }, { "a castle", &stronghold_level }, { "the Wizard of Yendor's tower", &wiz1_level }, }; void use_crystal_ball(obj) struct obj *obj; { 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")); (void) make_hallucinated(HHallucination + rnd(100),FALSE,0L); break; case 5 : pline("%s!", Tobjnam(obj, "explode")); useup(obj); obj = 0; /* it's gone */ losehp(rnd(30), "exploding crystal ball", KILLED_BY_AN); break; } if (obj) consume_obj_charge(obj, TRUE); return; } if (Hallucination) { if (!obj->spe) { pline("All you see is funky %s haze.", hcolor((char *)0)); } else { switch(rnd(6)) { case 1 : You("grok some groovy globs of incandescent lava."); break; case 2 : pline("Whoa! Psychedelic colors, %s!", poly_gender() == 1 ? "babe" : "dude"); break; case 3 : pline_The("crystal pulses with sinister %s light!", hcolor((char *)0)); break; case 4 : You("see goldfish swimming above fluorescent rocks."); break; case 5 : You("see tiny snowflakes spinning around a miniature farmhouse."); break; default: pline("Oh wow... like a kaleidoscope!"); break; } consume_obj_charge(obj, TRUE); } return; } /* read a single character */ if (flags.verbose) You("may look for an object or monster symbol."); ch = yn_function("What do you look for?", (char *)0, '\0'); /* Don't filter out ' ' here; it has a use */ if ((ch != def_monsyms[S_GHOST]) && index(quitchars,ch)) { if (flags.verbose) pline(Never_mind); return; } You("peer into %s...", the(xname(obj))); nomul(-rnd(10)); nomovemsg = ""; if (obj->spe <= 0) pline_The("vision is unclear."); else { int class; int ret = 0; makeknown(CRYSTAL_BALL); consume_obj_charge(obj, TRUE); /* special case: accept ']' as synonym for mimic * we have to do this before the def_char_to_objclass check */ if (ch == DEF_MIMIC_DEF) ch = DEF_MIMIC; if ((class = def_char_to_objclass(ch)) != MAXOCLASSES) ret = object_detect((struct obj *)0, class); else if ((class = def_char_to_monclass(ch)) != MAXMCLASSES) ret = monster_detect((struct obj *)0, class); else if (iflags.bouldersym && (ch == iflags.bouldersym)) ret = object_detect((struct obj *)0, ROCK_CLASS); else switch(ch) { case '^': ret = trap_detect((struct obj *)0); break; default: { int i = rn2(SIZE(level_detects)); You("see %s, %s.", level_detects[i].what, level_distance(level_detects[i].where)); } ret = 0; break; } if (ret) { if (!rn2(100)) /* make them nervous */ You("see the Wizard of Yendor gazing out at you."); else pline_The("vision is unclear."); } } return; } STATIC_OVL void show_map_spot(x, y) register int x, y; { register struct rm *lev; if (Confusion && rn2(7)) return; lev = &levl[x][y]; lev->seenv = SVALL; /* Secret corridors are found, but not secret doors. */ if (lev->typ == SCORR) { lev->typ = CORR; unblock_point(x,y); } /* if we don't remember an object or trap there, map it */ #ifdef DISPLAY_LAYERS if (!lev->mem_obj && !lev->mem_trap) { #else if (lev->typ == ROOM ? (glyph_is_cmap(lev->glyph) && !glyph_is_trap(lev->glyph) && glyph_to_cmap(lev->glyph) != ROOM) : (!glyph_is_object(lev->glyph) && !glyph_is_trap(lev->glyph))) { #endif if (level.flags.hero_memory) { magic_map_background(x,y,0); newsym(x,y); /* show it, if not blocked */ } else { magic_map_background(x,y,1); /* display it */ } } } void do_mapping() { register int zx, zy; int uw = u.uinwater; u.uinwater = 0; for (zx = 1; zx < COLNO; zx++) for (zy = 0; zy < ROWNO; zy++) show_map_spot(zx, zy); exercise(A_WIS, TRUE); u.uinwater = uw; if (!level.flags.hero_memory || Underwater) { flush_screen(1); /* flush temp screen */ display_nhwindow(WIN_MAP, TRUE); /* wait */ docrt(); } } void do_vicinity_map() { register int zx, zy; int lo_y = (u.uy-5 < 0 ? 0 : u.uy-5), hi_y = (u.uy+6 > ROWNO ? ROWNO : u.uy+6), lo_x = (u.ux-9 < 1 ? 1 : u.ux-9), /* avoid column 0 */ hi_x = (u.ux+10 > COLNO ? COLNO : u.ux+10); for (zx = lo_x; zx < hi_x; zx++) for (zy = lo_y; zy < hi_y; zy++) show_map_spot(zx, zy); if (!level.flags.hero_memory || Underwater) { flush_screen(1); /* flush temp screen */ display_nhwindow(WIN_MAP, TRUE); /* wait */ docrt(); } } /* convert a secret door into a normal door */ void cvt_sdoor_to_door(lev) struct rm *lev; { int newmask = lev->doormask & ~WM_MASK; #ifdef REINCARNATION if (Is_rogue_level(&u.uz)) /* rogue didn't have doors, only doorways */ newmask = D_NODOOR; else #endif /* newly exposed door is closed */ if (!(newmask & D_LOCKED)) newmask |= D_CLOSED; lev->typ = DOOR; lev->doormask = newmask; } STATIC_PTR void findone(zx,zy,num) int zx,zy; genericptr_t num; { register struct trap *ttmp; register struct monst *mtmp; 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) { if(!ttmp->tseen && ttmp->ttyp != STATUE_TRAP) { ttmp->tseen = 1; newsym(zx,zy); (*(int*)num)++; } } else if ((mtmp = m_at(zx, zy)) != 0) { if(mtmp->m_ap_type) { seemimic(mtmp); (*(int*)num)++; } if (mtmp->mundetected && (is_hider(mtmp->data) || mtmp->data->mlet == S_EEL)) { mtmp->mundetected = 0; newsym(zx, zy); (*(int*)num)++; } if (!canspotmon(mtmp) && !memory_is_invisible(zx, zy)) map_invisible(zx, zy); } else if (memory_is_invisible(zx, zy)) { unmap_object(zx, zy); newsym(zx, zy); (*(int*)num)++; } } STATIC_PTR void openone(zx,zy,num) int zx,zy; genericptr_t num; { register struct trap *ttmp; register struct obj *otmp; if(OBJ_AT(zx, zy)) { for(otmp = level.objects[zx][zy]; otmp; otmp = otmp->nexthere) { if(Is_box(otmp) && otmp->olocked) { otmp->olocked = 0; (*(int*)num)++; } } /* let it fall to the next cases. could be on trap. */ } if(levl[zx][zy].typ == SDOOR || (levl[zx][zy].typ == DOOR && (levl[zx][zy].doormask & (D_CLOSED|D_LOCKED)))) { if(levl[zx][zy].typ == SDOOR) cvt_sdoor_to_door(&levl[zx][zy]); /* .typ = DOOR */ if(levl[zx][zy].doormask & D_TRAPPED) { if(distu(zx, zy) < 3) b_trapped("door", 0); else Norep("You %s an explosion!", cansee(zx, zy) ? "see" : (flags.soundok ? "hear" : "feel the shock of")); wake_nearto(zx, zy, 11*11); 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) { if (!ttmp->tseen && ttmp->ttyp != STATUE_TRAP) { ttmp->tseen = 1; newsym(zx,zy); (*(int*)num)++; } } else if (find_drawbridge(&zx, &zy)) { /* make sure it isn't an open drawbridge */ open_drawbridge(zx, zy); (*(int*)num)++; } } int findit() /* returns number of things found */ { int num = 0; if(u.uswallow) return(0); do_clear_area(u.ux, u.uy, BOLT_LIM, findone, (genericptr_t) &num); return(num); } int openit() /* returns number of things found and opened */ { int num = 0; if(u.uswallow) { if (is_animal(u.ustuck->data)) { if (Blind) pline("Its mouth opens!"); else pline("%s opens its mouth!", Monnam(u.ustuck)); } expels(u.ustuck, u.ustuck->data, TRUE); return(-1); } do_clear_area(u.ux, u.uy, BOLT_LIM, openone, (genericptr_t) &num); return(num); } void find_trap(trap) 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); #ifdef DISPLAY_LAYERS if (levl[trap->tx][trap->ty].mem_obj || memory_is_invisible(trap->tx, trap->ty)) { #else if (levl[trap->tx][trap->ty].glyph != trap_to_glyph(trap)) { #endif /* 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 dosearch0(aflag) register int aflag; { #ifdef GCC_BUG /* some versions of gcc seriously muck up nested loops. if you get strange crashes while searching in a version compiled with gcc, try putting #define GCC_BUG in *conf.h (or adding -DGCC_BUG to CFLAGS in the makefile). */ volatile xchar x, y; #else register xchar x, y; #endif register struct trap *trap; register struct monst *mtmp; if(u.uswallow) { if (!aflag) pline("What are you looking for? The exit?"); } 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; if(x != u.ux || y != u.uy) { if (Blind && !aflag) feel_location(x,y); if(levl[x][y].typ == SDOOR) { if(rnl(7-fund)) continue; cvt_sdoor_to_door(&levl[x][y]); /* .typ = DOOR */ exercise(A_WIS, TRUE); nomul(0); if (Blind && !aflag) feel_location(x,y); /* make sure it shows up */ else newsym(x,y); } else if(levl[x][y].typ == SCORR) { if(rnl(7-fund)) continue; levl[x][y].typ = CORR; unblock_point(x,y); /* vision */ exercise(A_WIS, TRUE); nomul(0); newsym(x,y); } else { /* Be careful not to find anything in an SCORR or SDOOR */ if((mtmp = m_at(x, y)) && !aflag) { if(mtmp->m_ap_type) { seemimic(mtmp); find: exercise(A_WIS, TRUE); if (!canspotmon(mtmp)) { if (memory_is_invisible(x, y)) { /* found invisible monster in a square * which already has an 'I' in it. * Logically, this should still take * time and lead to a return(1), but if * we did that the player would keep * finding the same monster every turn. */ continue; } else { 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, * feel_location() already did it */ if (!aflag && !mtmp && !Blind && memory_is_invisible(x, y)) { unmap_object(x,y); newsym(x,y); } if ((trap = t_at(x,y)) && !trap->tseen && !rnl(8)) { nomul(0); if (trap->ttyp == STATUE_TRAP) { mtmp = activate_statue_trap(trap, x, y, FALSE); if (mtmp != (struct monst *)0) exercise(A_WIS, TRUE); return(1); } else { find_trap(trap); } } } } } } return(1); } /* Pre-map the sokoban levels */ void sokoban_detect() { register int x, y; register struct trap *ttmp; register struct obj *obj; /* Map the background and boulders */ for (x = 1; x < COLNO; x++) for (y = 0; y < ROWNO; y++) { levl[x][y].seenv = SVALL; levl[x][y].waslit = TRUE; map_background(x, y, 1); for (obj = level.objects[x][y]; obj; obj = obj->nexthere) if (obj->otyp == BOULDER) map_object(obj, 1); } /* Map the traps */ for (ttmp = ftrap; ttmp; ttmp = ttmp->ntrap) { ttmp->tseen = 1; map_trap(ttmp, 1); } } int dosearch() { return(dosearch0(0)); } /*detect.c*/ slashem-0.0.7E7F3/src/apply.c0000644000076400007640000030722010545462317013736 0ustar aliali/* SCCS Id: @(#)apply.c 3.4 2003/11/18 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" #include "edog.h" #ifdef OVLB static const char tools[] = { TOOL_CLASS, WEAPON_CLASS, WAND_CLASS, 0 }; static const char all_count[] = { ALLOW_COUNT, ALL_CLASSES, 0 }; static const char tools_too[] = { ALL_CLASSES, TOOL_CLASS, POTION_CLASS, WEAPON_CLASS, WAND_CLASS, GEM_CLASS, 0 }; static const char tinnables[] = { ALLOW_FLOOROBJ, FOOD_CLASS, 0 }; #ifdef TOURIST STATIC_DCL int FDECL(use_camera, (struct obj *)); #endif STATIC_DCL int FDECL(use_towel, (struct obj *)); STATIC_DCL boolean FDECL(its_dead, (int,int,int *)); STATIC_DCL int FDECL(use_stethoscope, (struct obj *)); STATIC_DCL void FDECL(use_whistle, (struct obj *)); STATIC_DCL void FDECL(use_magic_whistle, (struct obj *)); STATIC_DCL void FDECL(use_leash, (struct obj *)); STATIC_DCL int FDECL(use_mirror, (struct obj *)); STATIC_DCL void FDECL(use_bell, (struct obj **)); STATIC_DCL void FDECL(use_candelabrum, (struct obj *)); STATIC_DCL void FDECL(use_candle, (struct obj **)); STATIC_DCL void FDECL(use_lamp, (struct obj *)); STATIC_DCL int FDECL(use_torch, (struct obj *)); STATIC_DCL void FDECL(light_cocktail, (struct obj *)); STATIC_DCL void FDECL(use_tinning_kit, (struct obj *)); 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 *)); STATIC_DCL int FDECL(use_cream_pie, (struct obj *)); STATIC_DCL int FDECL(use_grapple, (struct obj *)); 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); STATIC_DCL void FDECL(add_class, (char *, CHAR_P)); #ifdef AMIGA void FDECL( amii_speaker, ( struct obj *, char *, int ) ); #endif const char no_elbow_room[] = "don't have enough elbow-room to maneuver."; #ifdef TOURIST STATIC_OVL int use_camera(obj) struct obj *obj; { register struct monst *mtmp; if(Underwater) { pline("Using your camera underwater would void the warranty."); return(0); } if(!getdir((char *)0)) return(0); if (obj->spe <= 0) { pline(nothing_happens); return (1); } consume_obj_charge(obj, TRUE); 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)); } else if (!u.dx && !u.dy) { (void) zapyourself(obj, TRUE); } else if ((mtmp = bhit(u.dx,u.dy,COLNO,FLASHED_LIGHT, (int FDECL((*),(MONST_P,OBJ_P)))0, (int FDECL((*),(OBJ_P,OBJ_P)))0, &obj)) != 0) { obj->ox = u.ux, obj->oy = u.uy; (void) flash_hits_mon(mtmp, obj); } return 1; } #endif STATIC_OVL int use_towel(obj) struct obj *obj; { if(!freehand()) { You("have no free %s!", body_part(HAND)); return 0; } else if (obj->owornmask) { You("cannot use it while you're wearing it!"); return 0; } else if (obj->cursed) { long old; switch (rn2(3)) { case 2: old = Glib; incr_itimeout(&Glib, rn1(10, 3)); Your("%s %s!", makeplural(body_part(HAND)), (old ? "are filthier than ever" : "get slimy")); return 1; case 1: if (!ublindf) { old = u.ucreamed; u.ucreamed += rn1(10, 3); pline("Yecch! Your %s %s gunk on it!", body_part(FACE), (old ? "has more" : "now has")); make_blinded(Blinded + (long)u.ucreamed - old, TRUE); } else { const char *what = (ublindf->otyp == LENSES) ? "lenses" : "blindfold"; if (ublindf->cursed) { You("push your %s %s.", what, rn2(2) ? "cock-eyed" : "crooked"); } else { struct obj *saved_ublindf = ublindf; You("push your %s off.", what); Blindf_off(ublindf); dropx(saved_ublindf); } } return 1; case 0: break; } } if (Glib) { Glib = 0; You("wipe off your %s.", makeplural(body_part(HAND))); return 1; } else if(u.ucreamed) { Blinded -= u.ucreamed; u.ucreamed = 0; if (!Blinded) { pline("You've got the glop off."); Blinded = 1; make_blinded(0L,TRUE); } else { Your("%s feels clean now.", body_part(FACE)); } return 1; } Your("%s and %s are already clean.", body_part(FACE), makeplural(body_part(HAND))); return 0; } /* maybe give a stethoscope message based on floor objects */ STATIC_OVL boolean its_dead(rx, ry, resp) int rx, ry, *resp; { struct obj *otmp; struct trap *ttmp; if (!can_reach_floor()) return FALSE; /* additional stethoscope messages from jyoung@apanix.apana.org.au */ if (Hallucination && sobj_at(CORPSE, rx, ry)) { /* (a corpse doesn't retain the monster's sex, so we're forced to use generic pronoun here) */ You_hear("a voice say, \"It's dead, Jim.\""); *resp = 1; return TRUE; } else if (Role_if(PM_HEALER) && ((otmp = sobj_at(CORPSE, rx, ry)) != 0 || (otmp = sobj_at(STATUE, rx, ry)) != 0)) { /* possibly should check uppermost {corpse,statue} in the pile if both types are present, but it's not worth the effort */ if (vobj_at(rx, ry)->otyp == STATUE) otmp = vobj_at(rx, ry); if (otmp->otyp == CORPSE) { You("determine that %s unfortunate being is dead.", (rx == u.ux && ry == u.uy) ? "this" : "that"); } else { ttmp = t_at(rx, ry); pline("%s appears to be in %s health for a statue.", The(mons[otmp->corpsenm].mname), (ttmp && ttmp->ttyp == STATUE_TRAP) ? "extraordinary" : "excellent"); } return TRUE; } return FALSE; } static const char hollow_str[] = "a hollow sound. This must be a secret %s!"; /* Strictly speaking it makes no sense for usage of a stethoscope to not take any time; however, unless it did, the stethoscope would be almost useless. As a compromise, one use per turn is free, another uses up the turn; this makes curse status have a tangible effect. */ STATIC_OVL int use_stethoscope(obj) register struct obj *obj; { static long last_used_move = -1; static short last_used_movement = 0; struct monst *mtmp; struct rm *lev; int rx, ry, res; boolean interference = (u.uswallow && is_whirly(u.ustuck->data) && !rn2(Role_if(PM_HEALER) ? 10 : 3)); if (nohands(youmonst.data)) { /* should also check for no ears and/or deaf */ You("have no hands!"); /* not `body_part(HAND)' */ return 0; } else if (!freehand()) { You("have no free %s.", body_part(HAND)); return 0; } if (!getdir((char *)0)) return 0; res = (moves == last_used_move) && (youmonst.movement == last_used_movement); last_used_move = moves; last_used_movement = youmonst.movement; #ifdef STEED if (u.usteed && u.dz > 0) { if (interference) { pline("%s interferes.", Monnam(u.ustuck)); mstatusline(u.ustuck); } else mstatusline(u.usteed); return res; } else #endif if (u.uswallow && (u.dx || u.dy || u.dz)) { mstatusline(u.ustuck); return res; } else if (u.uswallow && interference) { pline("%s interferes.", Monnam(u.ustuck)); mstatusline(u.ustuck); return res; } else if (u.dz) { if (Underwater) You_hear("faint splashing."); else if (u.dz < 0 || !can_reach_floor()) You_cant("reach the %s.", (u.dz > 0) ? surface(u.ux,u.uy) : ceiling(u.ux,u.uy)); else if (its_dead(u.ux, u.uy, &res)) ; /* message already given */ else if (Is_stronghold(&u.uz)) You_hear("the crackling of hellfire."); else pline_The("%s seems healthy enough.", surface(u.ux,u.uy)); return res; } else if (obj->cursed && !rn2(2)) { You_hear("your heart beat."); return res; } if (Stunned || (Confusion && !rn2(5))) confdir(); if (!u.dx && !u.dy) { ustatusline(); return res; } rx = u.ux + u.dx; ry = u.uy + u.dy; if (!isok(rx,ry)) { You_hear("a faint typing noise."); return 0; } if ((mtmp = m_at(rx,ry)) != 0) { mstatusline(mtmp); if (mtmp->mundetected) { mtmp->mundetected = 0; if (cansee(rx,ry)) newsym(mtmp->mx,mtmp->my); } if (!canspotmon(mtmp)) map_invisible(rx,ry); return res; } if (memory_is_invisible(rx, ry)) { unmap_object(rx, ry); newsym(rx, ry); pline_The("invisible monster must have moved."); } lev = &levl[rx][ry]; switch(lev->typ) { case SDOOR: You_hear(hollow_str, "door"); cvt_sdoor_to_door(lev); /* ->typ = DOOR */ if (Blind) feel_location(rx,ry); else newsym(rx,ry); return res; 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; } if (!its_dead(rx, ry, &res)) You("hear nothing special."); /* not You_hear() */ return res; } static const char whistle_str[] = "produce a %s whistling sound."; STATIC_OVL void use_whistle(obj) struct obj *obj; { You(whistle_str, obj->cursed ? "shrill" : "high"); wake_nearby(); } STATIC_OVL void use_magic_whistle(obj) struct obj *obj; { register struct monst *mtmp, *nextmon; if(obj->cursed && !rn2(2)) { You("produce a high-pitched humming noise."); wake_nearby(); } else { int pet_cnt = 0; You(whistle_str, Hallucination ? "normal" : "strange"); for(mtmp = fmon; mtmp; mtmp = nextmon) { nextmon = mtmp->nmon; /* trap might kill mon */ if (DEADMONSTER(mtmp)) continue; if (mtmp->mtame) { if (mtmp->mtrapped) { /* no longer in previous trap (affects mintrap) */ mtmp->mtrapped = 0; fill_pit(mtmp->mx, mtmp->my); } mnexto(mtmp); if (canspotmon(mtmp)) ++pet_cnt; if (mintrap(mtmp) == 2) change_luck(-1); } } if (pet_cnt > 0) makeknown(obj->otyp); } } boolean um_dist(x,y,n) register xchar x, y, n; { return((boolean)(abs(u.ux - x) > n || abs(u.uy - y) > n)); } int number_leashed() { register int i = 0; register struct obj *obj; for(obj = invent; obj; obj = obj->nobj) if(obj->otyp == LEASH && obj->leashmon != 0) i++; return(i); } void o_unleash(otmp) /* otmp is about to be destroyed or stolen */ register struct obj *otmp; { register struct monst *mtmp; for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) if(mtmp->m_id == (unsigned)otmp->leashmon) mtmp->mleashed = 0; otmp->leashmon = 0; } 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) otmp->leashmon = 0; mtmp->mleashed = 0; } void unleash_all() /* player is about to die (for bones) */ { register struct obj *otmp; register struct monst *mtmp; 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 /* ARGSUSED */ STATIC_OVL void use_leash(obj) struct obj *obj; { coord cc; register struct monst *mtmp; int spotmon; if(!obj->leashmon && number_leashed() >= MAXLEASHED) { You("cannot leash any more pets."); return; } if(!get_adjacent_loc((char *)0, (char *)0, u.ux, u.uy, &cc)) return; if((cc.x == u.ux) && (cc.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; } if(!(mtmp = m_at(cc.x, cc.y))) { There("is no creature there."); return; } spotmon = canspotmon(mtmp); #ifdef STEED got_target: #endif /* KMH, balance patch -- This doesn't work properly. * Pets need extra memory for their edog structure. * Normally, this is handled by tamedog(), but that * rejects all demons. Our other alternative would * be to duplicate tamedog()'s functionality here. * Yuck. So I've merged it into the nymph code below. if (((mtmp->data == &mons[PM_SUCCUBUS]) || (mtmp->data == &mons[PM_INCUBUS])) && (!mtmp->mtame) && (spotmon) && (!mtmp->mleashed)) { pline("%s smiles seductively at the sight of this prop!", Monnam(mtmp)); mtmp->mtame = 10; mtmp->mpeaceful = 1; set_malign(mtmp); }*/ if ((mtmp->data->mlet == S_NYMPH || mtmp->data == &mons[PM_SUCCUBUS] || mtmp->data == &mons[PM_INCUBUS]) && (spotmon) && (!mtmp->mleashed)) { pline("%s looks shocked! \"I'm not that way!\"", Monnam(mtmp)); mtmp->mtame = 0; mtmp->mpeaceful = 0; mtmp->msleeping = 0; } if(!mtmp->mtame) { if(!spotmon) There("is no creature there."); else pline("%s %s leashed!", Monnam(mtmp), (!obj->leashmon) ? "cannot be" : "is not"); return; } if(!obj->leashmon) { if(mtmp->mleashed) { pline("This %s is already leashed.", spotmon ? l_monnam(mtmp) : "monster"); return; } You("slip the leash around %s%s.", spotmon ? "your " : "", l_monnam(mtmp)); mtmp->mleashed = 1; obj->leashmon = (int)mtmp->m_id; mtmp->msleeping = 0; return; } if(obj->leashmon != (int)mtmp->m_id) { pline("This leash is not attached to that creature."); return; } else { if(obj->cursed) { pline_The("leash would not come off!"); obj->bknown = TRUE; return; } mtmp->mleashed = 0; obj->leashmon = 0; You("remove the leash from %s%s.", spotmon ? "your " : "", l_monnam(mtmp)); /* KMH, balance patch -- this is okay */ if ((mtmp->data == &mons[PM_SUCCUBUS]) || (mtmp->data == &mons[PM_INCUBUS])) { pline("%s is infuriated!", Monnam(mtmp)); mtmp->mtame = 0; mtmp->mpeaceful = 0; } } return; } struct obj * get_mleash(mtmp) /* assuming mtmp->mleashed has been checked */ register struct monst *mtmp; { register struct obj *otmp; otmp = invent; while(otmp) { if(otmp->otyp == LEASH && otmp->leashmon == (int)mtmp->m_id) return(otmp); otmp = otmp->nobj; } return((struct obj *)0); } #endif /* OVLB */ #ifdef OVL1 boolean next_to_u() { register struct monst *mtmp; register struct obj *otmp; for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) { if (DEADMONSTER(mtmp)) continue; if(mtmp->mleashed) { if (distu(mtmp->mx,mtmp->my) > 2) mnexto(mtmp); if (distu(mtmp->mx,mtmp->my) > 2) { for(otmp = invent; otmp; otmp = otmp->nobj) if(otmp->otyp == LEASH && otmp->leashmon == (int)mtmp->m_id) { if(otmp->cursed) return(FALSE); You_feel("%s leash go slack.", (number_leashed() > 1) ? "a" : "the"); mtmp->mleashed = 0; otmp->leashmon = 0; } } } } #ifdef STEED /* no pack mules for the Amulet */ if (u.usteed && mon_has_amulet(u.usteed)) return FALSE; #endif return(TRUE); } #endif /* OVL1 */ #ifdef OVL0 void check_leash(x, y) register xchar x, y; { register struct obj *otmp; register struct monst *mtmp; for (otmp = invent; otmp; otmp = otmp->nobj) { if (otmp->otyp != LEASH || otmp->leashmon == 0) continue; for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) { if (DEADMONSTER(mtmp)) continue; if ((int)mtmp->m_id == otmp->leashmon) break; } if (!mtmp) { impossible("leash in use isn't attached to anything?"); otmp->leashmon = 0; continue; } if (dist2(u.ux,u.uy,mtmp->mx,mtmp->my) > dist2(x,y,mtmp->mx,mtmp->my)) { if (!um_dist(mtmp->mx, mtmp->my, 3)) { ; /* still close enough */ } else if (otmp->cursed && !breathless(mtmp->data)) { if (um_dist(mtmp->mx, mtmp->my, 5) || (mtmp->mhp -= rnd(2)) <= 0) { long save_pacifism = u.uconduct.killer; Your("leash chokes %s to death!", mon_nam(mtmp)); /* hero might not have intended to kill pet, but that's the result of his actions; gain experience, lose pacifism, take alignment and luck hit, make corpse less likely to remain tame after revival */ xkilled(mtmp, 0); /* no "you kill it" message */ /* life-saving doesn't ordinarily reset this */ if (mtmp->mhp > 0) u.uconduct.killer = save_pacifism; } else { pline("%s chokes on the leash!", Monnam(mtmp)); /* tameness eventually drops to 1 here (never 0) */ if (mtmp->mtame && rn2(mtmp->mtame)) mtmp->mtame--; } } else { if (um_dist(mtmp->mx, mtmp->my, 5)) { pline("%s leash snaps loose!", s_suffix(Monnam(mtmp))); m_unleash(mtmp, FALSE); } else { You("pull on the leash."); if (mtmp->data->msound != MS_SILENT) switch (rn2(3)) { case 0: growl(mtmp); break; case 1: yelp(mtmp); break; default: whimper(mtmp); break; } } } } } } #endif /* OVL0 */ #ifdef OVLB #define WEAK 3 /* from eat.c */ static const char look_str[] = "look %s."; STATIC_OVL int use_mirror(obj) struct obj *obj; { register struct monst *mtmp; register char mlet; #ifdef INVISIBLE_OBJECTS boolean vis = !Blind && (!obj->oinvis || See_invisible); #else boolean vis = !Blind; #endif if(!getdir((char *)0)) return 0; if(obj->cursed && !rn2(2)) { if (vis) pline_The("mirror fogs up and doesn't reflect!"); return 1; } if(!u.dx && !u.dy && !u.dz) { if(vis && !Invisible) { if (u.umonnum == PM_FLOATING_EYE) { if (!Free_action) { pline(Hallucination ? "Yow! The mirror stares back!" : "Yikes! You've frozen yourself!"); nomul(-rnd((MAXULEV+6) - u.ulevel)); nomovemsg = 0; } else You("stiffen momentarily under your gaze."); } else if (is_vampire(youmonst.data)) You("don't have a reflection."); else if (u.umonnum == PM_UMBER_HULK) { pline("Huh? That doesn't look like you!"); make_confused(HConfusion + d(3,4),FALSE); } else if (Hallucination) You(look_str, hcolor((char *)0)); else if (Sick) You(look_str, "peaked"); else if (u.uhs >= WEAK) You(look_str, "undernourished"); else You("look as %s as ever.", ACURR(A_CHA) > 14 ? (poly_gender()==1 ? "beautiful" : "handsome") : "ugly"); } else { You_cant("see your %s %s.", ACURR(A_CHA) > 14 ? (poly_gender()==1 ? "beautiful" : "handsome") : "ugly", body_part(FACE)); } return 1; } if(u.uswallow) { if (vis) You("reflect %s %s.", s_suffix(mon_nam(u.ustuck)), mbodypart(u.ustuck, STOMACH)); return 1; } if(Underwater) { #ifdef INVISIBLE_OBJECTS if (!obj->oinvis) #endif You(Hallucination ? "give the fish a chance to fix their makeup." : "reflect the murky water."); return 1; } if(u.dz) { if (vis) You("reflect the %s.", (u.dz > 0) ? surface(u.ux,u.uy) : ceiling(u.ux,u.uy)); return 1; } mtmp = bhit(u.dx, u.dy, COLNO, INVIS_BEAM, (int FDECL((*),(MONST_P,OBJ_P)))0, (int FDECL((*),(OBJ_P,OBJ_P)))0, &obj); if (!mtmp || !haseyes(mtmp->data)) return 1; vis = canseemon(mtmp); mlet = mtmp->data->mlet; if (mtmp->msleeping) { if (vis) pline ("%s is too tired to look at your mirror.", Monnam(mtmp)); } else if (!mtmp->mcansee) { if (vis) pline("%s can't see anything right now.", Monnam(mtmp)); #ifdef INVISIBLE_OBJECTS } else if (obj->oinvis && !perceives(mtmp->data)) { if (vis) pline("%s can't see your mirror.", Monnam(mtmp)); #endif /* some monsters do special things */ } else if (is_vampire(mtmp->data) || 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) pline("%s is turned to stone!", Monnam(mtmp)); stoned = TRUE; killed(mtmp); } else if(!mtmp->mcan && !mtmp->minvis && mtmp->data == &mons[PM_FLOATING_EYE]) { int tmp = d((int)mtmp->m_lev, (int)mtmp->data->mattk[0].damd); if (!rn2(4)) tmp = 120; if (vis) pline("%s is frozen by its reflection.", Monnam(mtmp)); else You_hear("%s stop moving.",something); mtmp->mcanmove = 0; 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; } else if(!mtmp->mcan && !mtmp->minvis && (mlet == S_NYMPH || mtmp->data==&mons[PM_SUCCUBUS])) { if (vis) { pline ("%s admires herself in your mirror.", Monnam(mtmp)); pline ("She takes it!"); } else pline ("It steals your mirror!"); setnotworn(obj); /* in case mirror was wielded */ freeinv(obj); (void) mpickobj(mtmp,obj); if (!tele_restrict(mtmp)) (void) rloc(mtmp, FALSE); } 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) ; else if ((mtmp->minvis && !perceives(mtmp->data)) || !haseyes(mtmp->data)) pline("%s doesn't seem to notice its reflection.", Monnam(mtmp)); else pline("%s ignores %s reflection.", Monnam(mtmp), mhis(mtmp)); } return 1; } STATIC_OVL void use_bell(optr) struct obj **optr; { register struct obj *obj = *optr; struct monst *mtmp; boolean wakem = FALSE, learno = FALSE, ordinary = (obj->otyp != BELL_OF_OPENING || !obj->spe), invoking = (obj->otyp == BELL_OF_OPENING && invocation_pos(u.ux, u.uy) && !On_stairs(u.ux, u.uy)); You("ring %s.", the(xname(obj))); if (Underwater || (u.uswallow && ordinary)) { #ifdef AMIGA amii_speaker( obj, "AhDhGqEqDhEhAqDqFhGw", AMII_MUFFLED_VOLUME ); #endif pline("But the sound is muffled."); } else if (invoking && ordinary) { /* needs to be recharged... */ pline("But it makes no sound."); learno = TRUE; /* help player figure out why */ } else if (ordinary) { #ifdef AMIGA amii_speaker( obj, "ahdhgqeqdhehaqdqfhgw", AMII_MUFFLED_VOLUME ); #endif if (obj->cursed && !rn2(4) && /* note: once any of them are gone, we stop all of them */ !(mvitals[PM_WOOD_NYMPH].mvflags & G_GONE) && !(mvitals[PM_WATER_NYMPH].mvflags & G_GONE) && !(mvitals[PM_MOUNTAIN_NYMPH].mvflags & G_GONE) && (mtmp = makemon(mkclass(S_NYMPH, 0), 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); *optr = 0; } 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 = ""; nomul(-rnd(2)); break; } } wakem = TRUE; } else { /* charged Bell of Opening */ consume_obj_charge(obj, TRUE); if (u.uswallow) { if (!obj->cursed) (void) openit(); else pline(nothing_happens); } else if (obj->cursed) { coord mm; mm.x = u.ux; mm.y = u.uy; mkundead(&mm, FALSE, NO_MINVENT); wakem = TRUE; } else if (invoking) { pline("%s an unsettling shrill sound...", Tobjnam(obj, "issue")); #ifdef AMIGA amii_speaker( obj, "aefeaefeaefeaefeaefe", AMII_LOUDER_VOLUME ); #endif obj->age = moves; learno = TRUE; wakem = TRUE; } else if (obj->blessed) { int res = 0; #ifdef AMIGA amii_speaker( obj, "ahahahDhEhCw", AMII_SOFT_VOLUME ); #endif if (uchain) { unpunish(); res = 1; } res += openit(); switch (res) { case 0: pline(nothing_happens); break; case 1: pline("%s opens...", Something); learno = TRUE; break; default: pline("Things open around you..."); learno = TRUE; break; } } else { /* uncursed */ #ifdef AMIGA amii_speaker( obj, "AeFeaeFeAefegw", AMII_OKAY_VOLUME ); #endif if (findit() != 0) learno = TRUE; else pline(nothing_happens); } } /* charged BofO */ if (learno) { makeknown(BELL_OF_OPENING); obj->known = 1; } if (wakem) wake_nearby(); } STATIC_OVL void use_candelabrum(obj) register struct obj *obj; { const 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; } begin_burn(obj, FALSE); } STATIC_OVL void use_candle(optr) struct obj **optr; { register struct obj *obj = *optr; register struct obj *otmp; const char *s = (obj->quan != 1) ? "candles" : "candle"; char qbuf[QBUFSZ]; if(u.uswallow) { You(no_elbow_room); return; } if(Underwater) { pline("Sorry, fire and water don't mix."); return; } otmp = carrying(CANDELABRUM_OF_INVOCATION); /* [ALI] Artifact candles can't be attached to candelabrum * (magic candles still can be). */ if(obj->oartifact || !otmp || otmp->spe == 7) { use_lamp(obj); return; } Sprintf(qbuf, "Attach %s", the(xname(obj))); Sprintf(eos(qbuf), " to %s?", safe_qbuf(qbuf, sizeof(" to ?"), the(xname(otmp)), the(simple_typename(otmp->otyp)), "it")); if(yn(qbuf) == 'n') { if (!obj->lamplit) You("try to light %s...", the(xname(obj))); use_lamp(obj); return; } else { if ((long)otmp->spe + obj->quan > 7L) obj = splitobj(obj, 7L - (long)otmp->spe); else *optr = 0; You("attach %ld%s %s to %s.", obj->quan, !otmp->spe ? "" : " more", s, the(xname(otmp))); if (obj->otyp == MAGIC_CANDLE) { if (obj->lamplit) pline_The("new %s %s very ordinary.", s, vtense(s, "look")); else pline("%s very ordinary.", (obj->quan > 1L) ? "They look" : "It looks"); if (!otmp->spe) otmp->age = 600L; } else 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) verbalize("You %s %s, you bought %s!", otmp->lamplit ? "burn" : "use", (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 */ if (obj->lamplit) end_burn(obj, TRUE); /* candles are now gone */ useupall(obj); } } boolean snuff_candle(otmp) /* call in drop, throw, and put in box, etc. */ register struct obj *otmp; { register boolean candle = Is_candle(otmp); if (((candle && otmp->oartifact != ART_CANDLE_OF_ETERNAL_FLAME) || otmp->otyp == CANDELABRUM_OF_INVOCATION) && otmp->lamplit) { char buf[BUFSZ]; xchar x, y; register boolean many = candle ? otmp->quan > 1L : otmp->spe > 1; (void) get_obj_location(otmp, &x, &y, 0); if (otmp->where == OBJ_MINVENT ? cansee(x,y) : !Blind) pline("%s %scandle%s flame%s extinguished.", Shk_Your(buf, otmp), (candle ? "" : "candelabrum's "), (many ? "s'" : "'s"), (many ? "s are" : " is")); end_burn(otmp, TRUE); return(TRUE); } return(FALSE); } /* called when lit lamp is hit by water or put into a container or you've been swallowed by a monster; obj might be in transit while being thrown or dropped so don't assume that its location is valid */ boolean snuff_lit(obj) struct obj *obj; { xchar x, y; if (obj->lamplit) { if (artifact_light(obj)) return FALSE; /* Artifact lights are never snuffed */ if (obj->otyp == OIL_LAMP || obj->otyp == MAGIC_LAMP || obj->otyp == BRASS_LANTERN || obj->otyp == POT_OIL || obj->otyp == TORCH) { (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; } if (snuff_candle(obj)) return TRUE; } 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 == MAGIC_LAMP || ignitable(obj))) { 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")); if (obj->otyp == POT_OIL) makeknown(obj->otyp); if (obj->unpaid && costly_spot(u.ux, u.uy) && (obj->where == OBJ_INVENT)) { /* if it catches while you have it, then it's your tough luck */ check_unpaid(obj); verbalize("That's in addition to the cost of %s %s, of course.", Yname2(obj), obj->quan == 1 ? "itself" : "themselves"); bill_dummy_object(obj); } begin_burn(obj, FALSE); return TRUE; } return FALSE; } STATIC_OVL void use_lamp(obj) struct obj *obj; { char buf[BUFSZ]; char qbuf[QBUFSZ]; if(Underwater) { pline("This is not a diving lamp."); return; } if(obj->lamplit) { if(obj->otyp == OIL_LAMP || obj->otyp == MAGIC_LAMP || obj->otyp == BRASS_LANTERN) { pline("%s lamp is now off.", Shk_Your(buf, obj)); #ifdef LIGHTSABERS } else if(is_lightsaber(obj)) { if (obj->otyp == RED_DOUBLE_LIGHTSABER) { /* Do we want to activate dual bladed mode? */ if (!obj->altmode && (!obj->cursed || rn2(4))) { You("ignite the second blade of %s.", yname(obj)); obj->altmode = TRUE; return; } else obj->altmode = FALSE; } lightsaber_deactivate(obj, TRUE); return; #endif } else if (artifact_light(obj)) { You_cant("snuff out %s.", yname(obj)); return; } else { You("snuff out %s.", yname(obj)); } end_burn(obj, TRUE); return; } /* magic lamps with an spe == 0 (wished for) cannot be lit */ if ((!Is_candle(obj) && obj->age == 0) || (obj->otyp == MAGIC_LAMP && obj->spe == 0)) { if ((obj->otyp == BRASS_LANTERN) #ifdef LIGHTSABERS || is_lightsaber(obj) #endif ) Your("%s has run out of power.", xname(obj)); else if (obj->otyp == TORCH) { Your("torch has burnt out and cannot be relit."); } else pline("This %s has no oil.", xname(obj)); 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 if (obj->otyp == TORCH) { check_unpaid(obj); pline("%s flame%s burn%s%s", s_suffix(Yname2(obj)), plur(obj->quan), obj->quan > 1L ? "" : "s", Blind ? "." : " brightly!"); #ifdef LIGHTSABERS } else if (is_lightsaber(obj)) { /* WAC -- lightsabers */ /* you can see the color of the blade */ if (!Blind) makeknown(obj->otyp); You("ignite %s.", yname(obj)); unweapon = FALSE; #endif } else { /* candle(s) */ Sprintf(qbuf, "Light all of %s?", the(xname(obj))); if (obj->quan > 1L && (yn(qbuf) == 'n')) { /* Check if player wants to light all the candles */ struct obj *rest; /* the remaining candles */ rest = splitobj(obj, obj->quan - 1L); obj_extract_self(rest); /* free from inv */ obj->spe++; /* this prevents merging */ (void)hold_another_object(rest, "You drop %s!", doname(rest), (const char *)0); obj->spe--; } 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->otyp != MAGIC_CANDLE) { const char *ithem = obj->quan > 1L ? "them" : "it"; verbalize("You burn %s, you bought %s!", ithem, ithem); bill_dummy_object(obj); } } begin_burn(obj, FALSE); } } /* MRKR: Torches */ STATIC_OVL int use_torch(obj) struct obj *obj; { struct obj *otmp = NULL; if (u.uswallow) { You(no_elbow_room); return 0; } if (Underwater) { pline("Sorry, fire and water don't mix."); return 0; } if (obj->quan > 1L) { otmp = obj; obj = splitobj(otmp, 1L); obj_extract_self(otmp); /* free from inv */ } /* You can use a torch in either wielded weapon slot */ if (obj != uwep && (obj != uswapwep || !u.twoweap)) if (!wield_tool(obj, (const char *)0)) return 0; use_lamp(obj); /* shouldn't merge */ if (otmp) otmp = hold_another_object(otmp, "You drop %s!", doname(otmp), (const char *)0); return 1; } STATIC_OVL void light_cocktail(obj) struct obj *obj; /* obj is a potion of oil or a stick of dynamite */ { char buf[BUFSZ]; const char *objnam = #ifdef FIREARMS obj->otyp == POT_OIL ? "potion" : "stick"; #else "potion"; #endif if (u.uswallow) { You(no_elbow_room); return; } if(Underwater) { You("can't light this underwater!"); return; } if (obj->lamplit) { You("snuff the lit %s.", objnam); end_burn(obj, TRUE); /* * Free & add to re-merge potion. This will average the * age of the potions. Not exactly the best solution, * but its easy. */ freeinv(obj); (void) addinv(obj); return; } else if (Underwater) { There("is not enough oxygen to sustain a fire."); return; } You("light %s %s.%s", shk_your(buf, obj), objnam, Blind ? "" : " It gives off a dim light."); if (obj->unpaid && costly_spot(u.ux, u.uy)) { /* Normally, we shouldn't both partially and fully charge * for an item, but (Yendorian Fuel) Taxes are inevitable... */ #ifdef FIREARMS if (obj->otyp != STICK_OF_DYNAMITE) { #endif check_unpaid(obj); verbalize("That's in addition to the cost of the potion, of course."); #ifdef FIREARMS } else { const char *ithem = obj->quan > 1L ? "them" : "it"; verbalize("You burn %s, you bought %s!", ithem, ithem); } #endif bill_dummy_object(obj); } makeknown(obj->otyp); #ifdef FIREARMS if (obj->otyp == STICK_OF_DYNAMITE) obj->yours=TRUE; #endif 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 */ /* shouldn't merge */ obj = hold_another_object(obj, "You drop %s!", doname(obj), (const char *)0); } else 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 || !wield_tool(obj, "rub")) return 0; /* now uwep is obj */ if (uwep->otyp == MAGIC_LAMP) { if (uwep->spe > 0 && !rn2(3)) { check_unpaid_usage(uwep, TRUE); /* unusual item use */ djinni_from_bottle(uwep); makeknown(MAGIC_LAMP); uwep->otyp = OIL_LAMP; 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); } else if (obj->otyp == BRASS_LANTERN) { /* message from Adventure */ pline("Rubbing the electric lamp is not particularly rewarding."); pline("Anyway, nothing exciting happens."); } else pline(nothing_happens); return 1; } int dojump() { /* Physical jump */ return jump(0); } int jump(magic) int magic; /* 0=Physical, otherwise skill level */ { coord cc; if (!magic && (nolimbs(youmonst.data) || slithy(youmonst.data))) { /* normally (nolimbs || slithy) implies !Jumping, but that isn't necessarily the case for knights */ You_cant("jump; you have no legs!"); return 0; } else if (!magic && !Jumping) { You_cant("jump very far."); return 0; } else if (u.uswallow) { if (magic) { You("bounce around a little."); return 1; } else { pline("You've got to be kidding!"); return 0; } return 0; } else if (u.uinwater) { if (magic) { You("swish around a little."); return 1; } else { pline("This calls for swimming, not jumping!"); return 0; } return 0; } else if (u.ustuck) { if (u.ustuck->mtame && !Conflict && !u.ustuck->mconf) { You("pull free from %s.", mon_nam(u.ustuck)); setustuck(0); return 1; } if (magic) { You("writhe a little in the grasp of %s!", mon_nam(u.ustuck)); return 1; } else { You("cannot escape from %s!", mon_nam(u.ustuck)); return 0; } return 0; } else if (Levitation || Is_airlevel(&u.uz) || Is_waterlevel(&u.uz)) { if (magic) { You("flail around a little."); return 1; } else { You("don't have enough traction to jump."); return 0; } } else if (!magic && near_capacity() > UNENCUMBERED) { You("are carrying too much to jump!"); return 0; } else if (!magic && (u.uhunger <= 100 || ACURR(A_STR) < 6)) { You("lack the strength to jump!"); return 0; } else if (Wounded_legs) { long wl = (EWounded_legs & BOTH_SIDES); const char *bp = body_part(LEG); 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.", (wl == LEFT_SIDE) ? "left " : (wl == RIGHT_SIDE) ? "right " : "", bp, (wl == BOTH_SIDES) ? "are" : "is"); return 0; } #ifdef STEED else if (u.usteed && u.utrap) { pline("%s is stuck in a trap.", Monnam(u.usteed)); return (0); } #endif pline("Where do you want to jump?"); cc.x = u.ux; cc.y = u.uy; if (getpos(&cc, TRUE, "the desired position") < 0) return 0; /* user pressed ESC */ if (!magic && !(HJumping & ~INTRINSIC) && !EJumping && distu(cc.x, cc.y) != 5) { /* The Knight jumping restriction still applies when riding a * horse. After all, what shape is the knight piece in chess? */ pline("Illegal move!"); return 0; } else if (distu(cc.x, cc.y) > (magic ? 6+magic*3 : 9)) { pline("Too far!"); return 0; } else if (!cansee(cc.x, cc.y)) { You("cannot see where to land!"); return 0; } else if (!isok(cc.x, cc.y)) { You("cannot jump there!"); return 0; } else { coord uc; int range, temp; if(u.utrap) switch(u.utraptype) { case TT_BEARTRAP: { register long side = rn2(3) ? LEFT_SIDE : RIGHT_SIDE; You("rip yourself free of the bear trap! Ouch!"); #ifdef STEED if (!u.usteed) #endif losehp(rnd(10), "jumping out of a bear trap", KILLED_BY); set_wounded_legs(side, rn1(1000,500)); break; } case TT_PIT: You("leap from the pit!"); break; case TT_WEB: You("tear the web apart as you pull yourself free!"); deltrap(t_at(u.ux,u.uy)); break; case TT_LAVA: You("pull yourself above the lava!"); u.utrap = 0; return 1; case TT_INFLOOR: You("strain your %s, but you're still stuck in the floor.", makeplural(body_part(LEG))); set_wounded_legs(LEFT_SIDE, rn1(10, 11)); set_wounded_legs(RIGHT_SIDE, rn1(10, 11)); return 1; } /* * Check the path from uc to cc, calling hurtle_step at each * location. The final position actually reached will be * in cc. */ uc.x = u.ux; uc.y = u.uy; /* calculate max(abs(dx), abs(dy)) as the range */ range = cc.x - uc.x; if (range < 0) range = -range; temp = cc.y - uc.y; if (temp < 0) temp = -temp; if (range < temp) range = temp; (void) walk_path(&uc, &cc, hurtle_step, (genericptr_t)&range); /* A little Sokoban guilt... */ if (In_sokoban(&u.uz)) change_luck(-1); teleds(cc.x, cc.y, TRUE); nomul(-1); nomovemsg = ""; morehungry(rnd(25)); return 1; } } boolean tinnable(corpse) struct obj *corpse; { if (corpse->otyp != CORPSE) return 0; if (corpse->oeaten) return 0; if (corpse->odrained) return 0; if (!mons[corpse->corpsenm].cnutrit) return 0; return 1; } STATIC_OVL void use_tinning_kit(obj) register struct obj *obj; { register struct obj *corpse, *can; /* char *badmove; */ /* This takes only 1 move. If this is to be changed to take many * moves, we've got to deal with decaying corpses... */ if (obj->spe <= 0) { You("seem to be out of tins."); return; } if (!(corpse = getobj((const char *)tinnables, "tin"))) return; if (corpse->otyp == CORPSE && (corpse->oeaten || corpse->odrained)) { You("cannot tin %s which is partly eaten.",something); return; } if (!tinnable(corpse)) { You_cant("tin that!"); return; } if (touch_petrifies(&mons[corpse->corpsenm]) && !Stone_resistance && !uarmg) { char kbuf[BUFSZ]; if (poly_when_stoned(youmonst.data)) You("tin %s without wearing gloves.", an(mons[corpse->corpsenm].mname)); else { pline("Tinning %s without wearing gloves is a fatal mistake...", an(mons[corpse->corpsenm].mname)); Sprintf(kbuf, "trying to tin %s without gloves", an(mons[corpse->corpsenm].mname)); } instapetrify(kbuf); } if (is_rider(&mons[corpse->corpsenm])) { (void) revive_corpse(corpse, FALSE); verbalize("Yes... But War does not preserve its enemies..."); return; } if (mons[corpse->corpsenm].cnutrit == 0) { pline("That's too insubstantial to tin."); return; } consume_obj_charge(obj, TRUE); if ((can = mksobj(TIN, FALSE, FALSE)) != 0) { static const char you_buy_it[] = "You tin it, you bought it!"; can->corpsenm = corpse->corpsenm; can->cursed = obj->cursed; can->blessed = obj->blessed; can->owt = weight(can); can->known = 1; #ifdef EATEN_MEMORY /* WAC You know the type of tinned corpses */ if (mvitals[corpse->corpsenm].eaten < 255) mvitals[corpse->corpsenm].eaten++; #endif can->spe = -1; /* Mark tinned tins. No spinach allowed... */ if (carried(corpse)) { if (corpse->unpaid) verbalize(you_buy_it); useup(corpse); } else if (mcarried(corpse)) { m_useup(corpse->ocarry, corpse); } else { if (costly_spot(corpse->ox, corpse->oy) && !corpse->no_charge) verbalize(you_buy_it); useupf(corpse, 1L); } can = hold_another_object(can, "You make, but cannot pick up, %s.", doname(can), (const char *)0); } else impossible("Tinning failed."); } void use_unicorn_horn(obj) struct obj *obj; { #define PROP_COUNT 6 /* number of properties we're dealing with */ #define ATTR_COUNT (A_MAX*3) /* number of attribute points we might fix */ int idx, val, val_limit, trouble_count, unfixable_trbl, did_prop, did_attr; int trouble_list[PROP_COUNT + ATTR_COUNT]; int chance; /* KMH */ if (obj && obj->cursed) { long lcount = (long) rnd(100); switch (rn2(6)) { case 0: make_sick(Sick ? Sick/3L + 1L : (long)rn1(ACURR(A_CON),20), xname(obj), TRUE, SICK_NONVOMITABLE); break; case 1: make_blinded(Blinded + lcount, TRUE); break; case 2: if (!Confusion) You("suddenly feel %s.", Hallucination ? "trippy" : "confused"); make_confused(HConfusion + lcount, TRUE); break; case 3: make_stunned(HStun + lcount, TRUE); break; case 4: (void) adjattrib(rn2(A_MAX), -1, FALSE); break; case 5: (void) make_hallucinated(HHallucination + lcount, TRUE, 0L); break; } return; } /* * Entries in the trouble list use a very simple encoding scheme. */ #define prop2trbl(X) ((X) + A_MAX) #define attr2trbl(Y) (Y) #define prop_trouble(X) trouble_list[trouble_count++] = prop2trbl(X) #define attr_trouble(Y) trouble_list[trouble_count++] = attr2trbl(Y) trouble_count = unfixable_trbl = did_prop = did_attr = 0; /* 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++) { val_limit = AMAX(idx); /* don't recover strength lost from hunger */ if (idx == A_STR && u.uhs >= WEAK) val_limit--; /* don't recover more than 3 points worth of any attribute */ if (val_limit > ABASE(idx) + 3) val_limit = ABASE(idx) + 3; for (val = ABASE(idx); val < val_limit; val++) attr_trouble(idx); /* keep track of unfixed trouble, for message adjustment below */ unfixable_trbl += (AMAX(idx) - val_limit); } if (trouble_count == 0) { pline(nothing_happens); return; } else if (trouble_count > 1) { /* shuffle */ int i, j, k; for (i = trouble_count - 1; i > 0; i--) if ((j = rn2(i + 1)) != i) { k = trouble_list[j]; trouble_list[j] = trouble_list[i]; trouble_list[i] = k; } } #if 0 /* Old NetHack success rate */ /* * Chances for number of troubles to be fixed * 0 1 2 3 4 5 6 7 * blessed: 22.7% 22.7% 19.5% 15.4% 10.7% 5.7% 2.6% 0.8% * uncursed: 35.4% 35.4% 22.9% 6.3% 0 0 0 0 */ val_limit = rn2( d(2, (obj && obj->blessed) ? 4 : 2) ); if (val_limit > trouble_count) val_limit = trouble_count; #else /* KMH's new success rate */ /* * blessed: Tries all problems, each with chance given below. * uncursed: Tries one problem, with chance given below. * ENCHANT +0 or less +1 +2 +3 +4 +5 +6 or more * CHANCE 30% 40% 50% 60% 70% 80% 90% */ val_limit = (obj && obj->blessed) ? trouble_count : 1; if (obj && obj->spe > 0) chance = (obj->spe < 6) ? obj->spe+3 : 9; else chance = 3; #endif /* fix [some of] the troubles */ for (val = 0; val < val_limit; val++) { idx = trouble_list[val]; if (rn2(10) < chance) /* KMH */ switch (idx) { case prop2trbl(SICK): make_sick(0L, (char *) 0, TRUE, SICK_ALL); did_prop++; break; case prop2trbl(BLINDED): make_blinded((long)u.ucreamed, TRUE); did_prop++; break; case prop2trbl(HALLUC): (void) make_hallucinated(0L, TRUE, 0L); did_prop++; break; case prop2trbl(VOMITING): make_vomiting(0L, TRUE); did_prop++; break; case prop2trbl(CONFUSION): make_confused(0L, TRUE); did_prop++; break; case prop2trbl(STUNNED): make_stunned(0L, TRUE); did_prop++; break; default: if (idx >= 0 && idx < A_MAX) { ABASE(idx) += 1; did_attr++; } else panic("use_unicorn_horn: bad trouble? (%d)", idx); break; } } if (did_attr) pline("This makes you feel %s!", (did_prop + did_attr) == (trouble_count + unfixable_trbl) ? "great" : "better"); else if (!did_prop) pline("Nothing seems to happen."); flags.botl = (did_attr || did_prop); #undef PROP_COUNT #undef ATTR_COUNT #undef prop2trbl #undef attr2trbl #undef prop_trouble #undef attr_trouble } /* * Timer callback routine: turn figurine into monster */ void fig_transform(arg, timeout) genericptr_t arg; long timeout; { struct obj *figurine = (struct obj *)arg; struct monst *mtmp; coord cc; boolean cansee_spot, silent, okay_spot; boolean redraw = FALSE; char monnambuf[BUFSZ], carriedby[BUFSZ]; if (!figurine) { #ifdef DEBUG pline("null figurine in fig_transform()"); #endif return; } 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) { Sprintf(monnambuf, "%s",an(m_monnam(mtmp))); switch (figurine->where) { case OBJ_INVENT: if (Blind) You_feel("%s %s from your pack!", something, locomotion(mtmp->data,"drop")); else You("see %s %s out of your pack!", monnambuf, locomotion(mtmp->data,"drop")); break; case OBJ_FLOOR: if (cansee_spot && !silent) { You("suddenly see a figurine transform into %s!", monnambuf); redraw = TRUE; /* update figurine's map location */ } break; 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", s_suffix(a_monnam(mon))); } else if (is_pool(mon->mx, mon->my)) Strcpy(carriedby, "empty water"); else Strcpy(carriedby, "thin air"); You("see %s %s out of %s!", monnambuf, locomotion(mtmp->data, "drop"), carriedby); } break; #if 0 case OBJ_MIGRATING: break; #endif default: impossible("figurine came to life where? (%d)", (int)figurine->where); break; } } /* free figurine now */ obj_extract_self(figurine); obfree(figurine, (struct obj *)0); if (redraw) newsym(cc.x, cc.y); } STATIC_OVL boolean figurine_location_checks(obj, cc, quietly) struct obj *obj; coord *cc; boolean quietly; { xchar x,y; if (carried(obj) && u.uswallow) { if (!quietly) You("don't have enough room in here."); return FALSE; } x = cc->x; y = cc->y; if (!isok(x,y)) { if (!quietly) You("cannot put the figurine there."); return FALSE; } 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]) && !throws_rocks(&mons[obj->corpsenm])) { if (!quietly) You("cannot fit the figurine on the boulder."); return FALSE; } return TRUE; } STATIC_OVL void use_figurine(optr) struct obj **optr; { register struct obj *obj = *optr; xchar x, y; coord cc; if (u.uswallow) { /* can't activate a figurine while swallowed */ if (!figurine_location_checks(obj, (coord *)0, FALSE)) return; } if(!getdir((char *)0)) { flags.move = multi = 0; return; } x = u.ux + u.dx; y = u.uy + u.dy; cc.x = x; cc.y = y; /* Passing FALSE arg here will result in messages displayed */ if (!figurine_location_checks(obj, &cc, FALSE)) return; You("%s and it transforms.", (u.dx||u.dy) ? "set the figurine beside you" : (Is_airlevel(&u.uz) || Is_waterlevel(&u.uz) || is_pool(cc.x, cc.y)) ? "release the figurine" : (u.dz < 0 ? "toss the figurine into the air" : "set the figurine on the ground")); (void) make_familiar(obj, cc.x, cc.y, FALSE); (void) stop_timer(FIG_TRANSFORM, (genericptr_t)obj); useup(obj); *optr = 0; } static NEARDATA const char lubricables[] = { ALL_CLASSES, ALLOW_NONE, 0 }; static NEARDATA const char need_to_remove_outer_armor[] = "need to remove your %s to grease your %s."; STATIC_OVL void use_grease(obj) struct obj *obj; { struct obj *otmp; char buf[BUFSZ]; if (Glib) { pline("%s from your %s.", Tobjnam(obj, "slip"), makeplural(body_part(FINGER))); dropx(obj); return; } if (obj->spe > 0) { if ((obj->cursed || Fumbling) && !rn2(2)) { consume_obj_charge(obj, TRUE); pline("%s from your %s.", Tobjnam(obj, "slip"), makeplural(body_part(FINGER))); dropx(obj); return; } otmp = getobj(lubricables, "grease"); if (!otmp) return; if ((otmp->owornmask & WORN_ARMOR) && uarmc) { Strcpy(buf, xname(uarmc)); You(need_to_remove_outer_armor, buf, xname(otmp)); return; } #ifdef TOURIST if ((otmp->owornmask & WORN_SHIRT) && (uarmc || uarm)) { Strcpy(buf, uarmc ? xname(uarmc) : ""); if (uarmc && uarm) Strcat(buf, " and "); Strcat(buf, uarm ? xname(uarm) : ""); You(need_to_remove_outer_armor, buf, xname(otmp)); return; } #endif consume_obj_charge(obj, TRUE); if (otmp != &zeroobj) { You("cover %s with a thick layer of grease.", yname(otmp)); otmp->greased = 1; if (obj->cursed && !nohands(youmonst.data)) { incr_itimeout(&Glib, rnd(15)); pline("Some of the grease gets all over your %s.", makeplural(body_part(HAND))); } } else { Glib += rnd(15); You("coat your %s with grease.", 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 { struct obj *tobj; xchar tx, ty; int time_needed; boolean force_bungle; } trapinfo; void reset_trapset() { trapinfo.tobj = 0; trapinfo.force_bungle = 0; } static struct whetstoneinfo { struct obj *tobj, *wsobj; int time_needed; } whetstoneinfo; void reset_whetstone() { whetstoneinfo.tobj = 0; whetstoneinfo.wsobj = 0; } /* occupation callback */ STATIC_PTR int set_whetstone() { struct obj *otmp = whetstoneinfo.tobj, *ows = whetstoneinfo.wsobj; int chance; if (!otmp || !ows) { reset_whetstone(); return 0; } else if (!carried(otmp) || !carried(ows)) { You("seem to have mislaid %s.", !carried(otmp) ? yname(otmp) : yname(ows)); reset_whetstone(); return 0; } if (--whetstoneinfo.time_needed > 0) { int adj = 2; if (Blind) adj--; if (Fumbling) adj--; if (Confusion) adj--; if (Stunned) adj--; if (Hallucination) adj--; if (adj > 0) whetstoneinfo.time_needed -= adj; return 1; } chance = 4 - (ows->blessed) + (ows->cursed*2) + (otmp->oartifact ? 3 : 0); if (!rn2(chance) && (ows->otyp == WHETSTONE)) { /* Remove rust first, then sharpen dull edges */ if (otmp->oeroded) { otmp->oeroded--; pline("%s %s%s now.", Yname2(otmp), (Blind ? "probably " : (otmp->oeroded ? "almost " : "")), otense(otmp, "shine")); } else if (otmp->spe < 0) { otmp->spe++; pline("%s %s %ssharper now.%s", Yname2(otmp), otense(otmp, Blind ? "feel" : "look"), (otmp->spe >= 0 ? "much " : ""), Blind ? " (Ow!)" : ""); } makeknown(WHETSTONE); reset_whetstone(); } else { if (Hallucination) pline("%s %s must be faulty!", is_plural(ows) ? "These" : "This", xname(ows)); else pline("%s", Blind ? "Pheww! This is hard work!" : "There are no visible effects despite your efforts."); reset_whetstone(); } return 0; } /* use stone on obj. the stone doesn't necessarily need to be a whetstone. */ STATIC_OVL void use_whetstone(stone, obj) struct obj *stone, *obj; { boolean fail_use = TRUE; const char *occutext = "sharpening"; int tmptime = 130 + (rnl(13) * 5); if (u.ustuck && sticks(youmonst.data)) { You("should let go of %s first.", mon_nam(u.ustuck)); } else if ((welded(uwep) && (uwep != stone)) || (uswapwep && u.twoweap && welded(uswapwep) && (uswapwep != obj))) { You("need both hands free."); } else if (nohands(youmonst.data)) { You("can't handle %s with your %s.", an(xname(stone)), makeplural(body_part(HAND))); } else if (verysmall(youmonst.data)) { You("are too small to use %s effectively.", an(xname(stone))); } else #ifdef GOLDOBJ if (obj == &goldobj) { pline("Shopkeepers would spot the lighter coin%s immediately.", obj->quan > 1 ? "s" : ""); } else #endif if (!is_pool(u.ux, u.uy) && !IS_FOUNTAIN(levl[u.ux][u.uy].typ) #ifdef SINKS && !IS_SINK(levl[u.ux][u.uy].typ) && !IS_TOILET(levl[u.ux][u.uy].typ) #endif ) { if (carrying(POT_WATER) && objects[POT_WATER].oc_name_known) { pline("Better not waste bottled water for that."); } else You("need some water when you use that."); } else if (Levitation && !Lev_at_will && !u.uinwater) { You("can't reach the water."); } else fail_use = FALSE; if (fail_use) { reset_whetstone(); return; } if (stone == whetstoneinfo.wsobj && obj == whetstoneinfo.tobj && carried(obj) && carried(stone)) { You("resume %s %s.", occutext, yname(obj)); set_occupation(set_whetstone, occutext, 0); return; } if (obj) { int ttyp = obj->otyp; boolean isweapon = (obj->oclass == WEAPON_CLASS || is_weptool(obj)); boolean isedged = (is_pick(obj) || (objects[ttyp].oc_dir & (PIERCE|SLASH))); if (obj == &zeroobj) { You("file your nails."); } else if (!isweapon || !isedged) { pline("%s sharp enough already.", is_plural(obj) ? "They are" : "It is"); } else if (stone->quan > 1) { pline("Using one %s is easier.", singular(stone, xname)); } else if (obj->quan > 1) { You("can apply %s only on one %s at a time.", the(xname(stone)), (obj->oclass == WEAPON_CLASS ? "weapon" : "item")); } else if (!is_metallic(obj)) { pline("That would ruin the %s %s.", materialnm[objects[ttyp].oc_material], xname(obj)); } else if (((obj->spe >= 0) || !obj->known) && !obj->oeroded) { pline("%s %s sharp and pointy enough.", is_plural(obj) ? "They" : "It", otense(obj, Blind ? "feel" : "look")); } else { if (stone->cursed) tmptime *= 2; whetstoneinfo.time_needed = tmptime; whetstoneinfo.tobj = obj; whetstoneinfo.wsobj = stone; You("start %s %s.", occutext, yname(obj)); set_occupation(set_whetstone, occutext, 0); if (IS_FOUNTAIN(levl[u.ux][u.uy].typ)) whetstone_fountain_effects(obj); #ifdef SINKS else if (IS_SINK(levl[u.ux][u.uy].typ)) whetstone_sink_effects(obj); else if (IS_TOILET(levl[u.ux][u.uy].typ)) whetstone_toilet_effects(obj); #endif } } else You("wave %s in the %s.", the(xname(stone)), (IS_POOL(levl[u.ux][u.uy].typ) && Underwater) ? "water" : "air"); } /* touchstones - by Ken Arnold */ STATIC_OVL void use_stone(tstone) struct obj *tstone; { struct obj *obj; boolean do_scratch; const char *streak_color, *choices; char stonebuf[QBUFSZ]; static const char scritch[] = "\"scritch, scritch\""; static const char allowall[3] = { COIN_CLASS, ALL_CLASSES, 0 }; static const char justgems[3] = { ALLOW_NONE, GEM_CLASS, 0 }; #ifndef GOLDOBJ struct obj goldobj; #endif /* in case it was acquired while blinded */ if (!Blind) tstone->dknown = 1; /* when the touchstone is fully known, don't bother listing extra junk as likely candidates for rubbing */ choices = (tstone->otyp == TOUCHSTONE && tstone->dknown && objects[TOUCHSTONE].oc_name_known) ? justgems : allowall; Sprintf(stonebuf, "rub on the stone%s", plur(tstone->quan)); if ((obj = getobj(choices, stonebuf)) == 0) return; #ifndef GOLDOBJ if (obj->oclass == COIN_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 WEAPON_CLASS: case TOOL_CLASS: use_whetstone(tstone, obj); return; 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) struct obj *otmp; { int ttyp, tmp; const char *what = (char *)0; char buf[BUFSZ]; const char *occutext = "setting the trap"; if (nohands(youmonst.data)) what = "without hands"; else if (Stunned) what = "while stunned"; else if (u.uswallow) what = is_animal(u.ustuck->data) ? "while swallowed" : "while engulfed"; else if (Underwater) what = "underwater"; else if (Levitation) what = "while levitating"; else if (is_pool(u.ux, u.uy)) what = "in water"; else if (is_lava(u.ux, u.uy)) what = "in lava"; else if (On_stairs(u.ux, u.uy)) what = (u.ux == xdnladder || u.ux == xupladder) ? "on the ladder" : "on the stairs"; else if (IS_FURNITURE(levl[u.ux][u.uy].typ) || IS_ROCK(levl[u.ux][u.uy].typ) || closed_door(u.ux, u.uy) || t_at(u.ux, u.uy)) what = "here"; if (what) { You_cant("set a trap %s!",what); reset_trapset(); return; } ttyp = (otmp->otyp == LAND_MINE) ? LANDMINE : BEAR_TRAP; if (otmp == trapinfo.tobj && u.ux == trapinfo.tx && u.uy == trapinfo.ty) { You("resume setting %s %s.", shk_your(buf, otmp), defsyms[trap_to_defsym(what_trap(ttyp))].explanation); set_occupation(set_trap, occutext, 0); return; } trapinfo.tobj = otmp; trapinfo.tx = u.ux, trapinfo.ty = u.uy; tmp = ACURR(A_DEX); trapinfo.time_needed = (tmp > 17) ? 2 : (tmp > 12) ? 3 : (tmp > 7) ? 4 : 5; if (Blind) trapinfo.time_needed *= 2; tmp = ACURR(A_STR); if (ttyp == BEAR_TRAP && tmp < 18) trapinfo.time_needed += (tmp > 12) ? 1 : (tmp > 7) ? 2 : 4; /*[fumbling and/or confusion and/or cursed object check(s) should be incorporated here instead of in set_trap]*/ #ifdef STEED if (u.usteed && P_SKILL(P_RIDING) < P_BASIC) { boolean chance; if (Fumbling || otmp->cursed) chance = (rnl(10) > 3); else chance = (rnl(10) > 5); You("aren't very skilled at reaching from %s.", mon_nam(u.usteed)); Sprintf(buf, "Continue your attempt to set %s?", the(defsyms[trap_to_defsym(what_trap(ttyp))].explanation)); if(yn(buf) == 'y') { if (chance) { switch(ttyp) { case LANDMINE: /* set it off */ trapinfo.time_needed = 0; trapinfo.force_bungle = TRUE; break; case BEAR_TRAP: /* drop it without arming it */ reset_trapset(); You("drop %s!", the(defsyms[trap_to_defsym(what_trap(ttyp))].explanation)); dropx(otmp); return; } } } else { reset_trapset(); return; } } #endif You("begin setting %s %s.", shk_your(buf, otmp), defsyms[trap_to_defsym(what_trap(ttyp))].explanation); set_occupation(set_trap, occutext, 0); return; } STATIC_PTR int set_trap() { struct obj *otmp = trapinfo.tobj; struct trap *ttmp; int ttyp; if (!otmp || !carried(otmp) || u.ux != trapinfo.tx || u.uy != trapinfo.ty) { /* ?? */ reset_trapset(); return 0; } if (--trapinfo.time_needed > 0) return 1; /* still busy */ ttyp = (otmp->otyp == LAND_MINE) ? LANDMINE : BEAR_TRAP; ttmp = maketrap(u.ux, u.uy, ttyp); if (ttmp) { ttmp->tseen = 1; ttmp->madeby_u = 1; newsym(u.ux, u.uy); /* if our hero happens to be invisible */ if (*in_rooms(u.ux,u.uy,SHOPBASE)) { add_damage(u.ux, u.uy, 0L); /* schedule removal */ } if (!trapinfo.force_bungle) You("finish arming %s.", the(defsyms[trap_to_defsym(what_trap(ttyp))].explanation)); if (((otmp->cursed || Fumbling) && (rnl(10) > 5)) || trapinfo.force_bungle) dotrap(ttmp, (unsigned)(trapinfo.force_bungle ? FORCEBUNGLE : 0)); } else { /* this shouldn't happen */ Your("trap setting attempt fails."); } useup(otmp); reset_trapset(); return 0; } STATIC_OVL int use_whip(obj) struct obj *obj; { char buf[BUFSZ]; struct monst *mtmp; struct obj *otmp; int rx, ry, proficient, res = 0; const char *msg_slipsfree = "The bullwhip slips free."; const char *msg_snap = "Snap!"; if (obj != uwep) { if (!wield_tool(obj, "lash")) return 0; else res = 1; } if (!getdir((char *)0)) return res; if (Stunned || (Confusion && !rn2(5))) confdir(); rx = u.ux + u.dx; ry = u.uy + u.dy; mtmp = m_at(rx, ry); /* fake some proficiency checks */ proficient = 0; if (Role_if(PM_ARCHEOLOGIST)) ++proficient; if (ACURR(A_DEX) < 6) proficient--; else if (ACURR(A_DEX) >= 14) proficient += (ACURR(A_DEX) - 14); if (Fumbling) --proficient; if (proficient > 3) proficient = 3; if (proficient < 0) proficient = 0; if (u.uswallow && attack(u.ustuck)) { There("is not enough room to flick your bullwhip."); } else if (Underwater) { There("is too much resistance to flick your bullwhip."); } else if (u.dz < 0) { You("flick a bug off of the %s.",ceiling(u.ux,u.uy)); } else if ((!u.dx && !u.dy) || (u.dz > 0)) { int dam; #ifdef STEED /* Sometimes you hit your steed by mistake */ if (u.usteed && !rn2(proficient + 2)) { You("whip %s!", mon_nam(u.usteed)); kick_steed(); return 1; } #endif if (Levitation #ifdef STEED || u.usteed #endif ) { /* Have a shot at snaring something on the floor */ otmp = level.objects[u.ux][u.uy]; if (otmp && otmp->otyp == CORPSE && otmp->corpsenm == PM_HORSE) { pline("Why beat a dead horse?"); return 1; } if (otmp && proficient) { You("wrap your bullwhip around %s on the %s.", an(singular(otmp, xname)), surface(u.ux, u.uy)); if (rnl(6) || pickup_object(otmp, 1L, TRUE) < 1) pline(msg_slipsfree); return 1; } } 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) { /* * Assumptions: * * if you're in a pit * - you are attempting to get out of the pit * - or, if you are applying it towards a small * monster then it is assumed that you are * trying to hit it. * else if the monster is wielding a weapon * - you are attempting to disarm a monster * else * - you are attempting to hit the monster * * if you're confused (and thus off the mark) * - you only end up hitting. * */ const char *wrapped_what = (char *)0; if (mtmp) { if (bigmonst(mtmp->data)) { wrapped_what = strcpy(buf, mon_nam(mtmp)); } else if (proficient) { if (attack(mtmp)) return 1; else pline(msg_snap); } } if (!wrapped_what) { if (IS_FURNITURE(levl[rx][ry].typ)) wrapped_what = something; else if (sobj_at(BOULDER, rx, ry)) wrapped_what = "a boulder"; } if (wrapped_what) { coord cc; cc.x = rx; cc.y = ry; You("wrap your bullwhip around %s.", wrapped_what); if (proficient && rn2(proficient + 2)) { if (!mtmp || enexto(&cc, rx, ry, youmonst.data)) { You("yank yourself out of the pit!"); teleds(cc.x, cc.y, TRUE); u.utrap = 0; vision_full_recalc = 1; } } else { pline(msg_slipsfree); } if (mtmp) wakeup(mtmp); } else pline(msg_snap); } else if (mtmp) { if (!canspotmon(mtmp) && !memory_is_invisible(rx, ry)) { pline("A monster is there that you couldn't see."); map_invisible(rx, ry); } otmp = MON_WEP(mtmp); /* can be null */ if (otmp) { char onambuf[BUFSZ]; 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); } else mon_hand = 0; /* lint suppression */ You("wrap your bullwhip around %s %s.", s_suffix(mon_nam(mtmp)), onambuf); 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 */ } if (gotit) { obj_extract_self(otmp); possibly_unwield(mtmp, FALSE); 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; case 3: /* right to you */ #if 0 if (!rn2(25)) { /* proficient with whip, but maybe not so proficient at catching weapons */ int hitu, hitvalu; hitvalu = 8 + otmp->spe; hitu = thitu(hitvalu, 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); stackobj(otmp); break; } #endif /* 0 */ /* right into your inventory */ You("snatch %s %s!", s_suffix(mon_nam(mtmp)), onambuf); if (otmp->otyp == CORPSE && touch_petrifies(&mons[otmp->corpsenm]) && !uarmg && !Stone_resistance && !(poly_when_stoned(youmonst.data) && polymon(PM_STONE_GOLEM))) { char kbuf[BUFSZ]; Sprintf(kbuf, "%s corpse", an(mons[otmp->corpsenm].mname)); pline("Snatching %s is a fatal mistake.", kbuf); instapetrify(kbuf); } otmp = hold_another_object(otmp, "You drop %s!", doname(otmp), (const char *)0); break; default: /* 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; } } else { pline(msg_slipsfree); } 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); } } } else if (Is_airlevel(&u.uz) || Is_waterlevel(&u.uz)) { /* it must be air -- water checked above */ You("snap your whip through thin air."); } else { pline(msg_snap); } return 1; } static const char not_enough_room[] = "There's not enough room here to use that.", where_to_hit[] = "Where do you want to hit?", cant_see_spot[] = "won't hit anything if you can't see that spot.", cant_reach[] = "can't reach that spot from here."; /* Distance attacks by pole-weapons */ STATIC_OVL int use_pole (obj) struct obj *obj; { int res = 0, typ, max_range; int min_range = obj->otyp == FISHING_POLE ? 1 : 4; coord cc; struct monst *mtmp; struct obj *otmp; boolean fishing; /* Are you allowed to use the pole? */ if (u.uswallow) { pline(not_enough_room); return (0); } if (obj != uwep) { if (!wield_tool(obj, "swing")) return(0); else res = 1; } /* Prompt for a location */ pline(where_to_hit); cc.x = u.ux; cc.y = u.uy; if (getpos(&cc, TRUE, "the spot to hit") < 0) return 0; /* user pressed ESC */ #ifdef WEAPON_SKILLS /* Calculate range */ typ = weapon_type(obj); if (typ == P_NONE || P_SKILL(typ) <= P_BASIC) max_range = 4; else if (P_SKILL(typ) <= P_SKILLED) max_range = 5; else max_range = 8; #else max_range = 8; #endif if (distu(cc.x, cc.y) > max_range) { pline("Too far!"); return (res); } else if (distu(cc.x, cc.y) < min_range) { pline("Too close!"); return (res); } else if (!cansee(cc.x, cc.y) && ((mtmp = m_at(cc.x, cc.y)) == (struct monst *)0 || !canseemon(mtmp))) { You(cant_see_spot); return (res); } else if (!couldsee(cc.x, cc.y)) { /* Eyes of the Overworld */ You(cant_reach); return res; } /* What is there? */ mtmp = m_at(cc.x, cc.y); if (obj->otyp == FISHING_POLE) { fishing = is_pool(cc.x, cc.y); /* Try a random effect */ switch (rnd(6)) { case 1: /* Snag yourself */ You("hook yourself!"); losehp(rn1(10,10), "a fishing hook", KILLED_BY); return 1; case 2: /* Reel in a fish */ if (mtmp) { if ((bigmonst(mtmp->data) || strongmonst(mtmp->data)) && !rn2(2)) { You("are yanked toward the %s", surface(cc.x,cc.y)); hurtle(sgn(cc.x-u.ux), sgn(cc.y-u.uy), 1, TRUE); return 1; } else if (enexto(&cc, u.ux, u.uy, 0)) { You("reel in %s!", mon_nam(mtmp)); mtmp->mundetected = 0; rloc_to(mtmp, cc.x, cc.y); return 1; } } break; case 3: /* Snag an existing object */ if ((otmp = level.objects[cc.x][cc.y]) != (struct obj *)0) { You("snag an object from the %s!", surface(cc.x, cc.y)); pickup_object(otmp, 1, FALSE); /* If pickup fails, leave it alone */ newsym(cc.x, cc.y); return 1; } break; case 4: /* Snag some garbage */ if (fishing && flags.boot_count < 1 && (otmp = mksobj(LOW_BOOTS, TRUE, FALSE)) != (struct obj *)0) { flags.boot_count++; You("snag some garbage from the %s!", surface(cc.x, cc.y)); if (pickup_object(otmp, 1, FALSE) <= 0) { obj_extract_self(otmp); place_object(otmp, u.ux, u.uy); newsym(u.ux, u.uy); } return 1; } #ifdef SINKS /* Or a rat in the sink/toilet */ if (!(mvitals[PM_SEWER_RAT].mvflags & G_GONE) && (IS_SINK(levl[cc.x][cc.y].typ) || IS_TOILET(levl[cc.x][cc.y].typ))) { mtmp = makemon(&mons[PM_SEWER_RAT], cc.x, cc.y, NO_MM_FLAGS); pline("Eek! There's %s there!", Blind ? "something squirmy" : a_monnam(mtmp)); return 1; } #endif break; case 5: /* Catch your dinner */ if (fishing && (otmp = mksobj(CRAM_RATION, TRUE, FALSE)) != (struct obj *)0) { You("catch tonight's dinner!"); if (pickup_object(otmp, 1, FALSE) <= 0) { obj_extract_self(otmp); place_object(otmp, u.ux, u.uy); newsym(u.ux, u.uy); } return 1; } break; default: case 6: /* Untrap */ /* FIXME -- needs to deal with non-adjacent traps */ break; } } /* The effect didn't apply. Attack the monster there. */ if (mtmp) { int oldhp = mtmp->mhp; bhitpos = cc; check_caitiff(mtmp); (void) thitmonst(mtmp, uwep, 1); /* 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); } STATIC_OVL int use_cream_pie(obj) struct obj *obj; { boolean wasblind = Blind; boolean wascreamed = u.ucreamed; boolean several = FALSE; if (obj->quan > 1L) { several = TRUE; obj = splitobj(obj, 1L); } if (Hallucination) You("give yourself a facial."); else pline("You immerse your %s in %s%s.", body_part(FACE), several ? "one of " : "", several ? makeplural(the(xname(obj))) : the(xname(obj))); if(can_blnd((struct monst*)0, &youmonst, AT_WEAP, obj)) { int blindinc = rnd(25); u.ucreamed += blindinc; make_blinded(Blinded + (long)blindinc, FALSE); if (!Blind || (Blind && wasblind)) pline("There's %ssticky goop all over your %s.", wascreamed ? "more " : "", body_part(FACE)); else /* Blind && !wasblind */ You_cant("see through all the sticky goop on your %s.", body_part(FACE)); } if (obj->unpaid) { verbalize("You used it, you bought it!"); bill_dummy_object(obj); } obj_extract_self(obj); delobj(obj); return(0); } STATIC_OVL int use_grapple (obj) struct obj *obj; { int res = 0, typ, max_range = 4, tohit; coord cc; struct monst *mtmp; struct obj *otmp; /* Are you allowed to use the hook? */ if (u.uswallow) { pline(not_enough_room); return (0); } if (obj != uwep) { if (!wield_tool(obj, "cast")) return(0); else res = 1; } /* assert(obj == uwep); */ /* Prompt for a location */ pline(where_to_hit); cc.x = u.ux; cc.y = u.uy; if (getpos(&cc, TRUE, "the spot to hit") < 0) return 0; /* user pressed ESC */ /* Calculate range */ typ = uwep_skill_type(); if (typ == P_NONE || P_SKILL(typ) <= P_BASIC) max_range = 4; else if (P_SKILL(typ) == P_SKILLED) max_range = 5; else max_range = 8; if (distu(cc.x, cc.y) > max_range) { pline("Too far!"); return (res); } else if (!cansee(cc.x, cc.y)) { You(cant_see_spot); return (res); } /* What do you want to hit? */ tohit = rn2(5); if (typ != P_NONE && P_SKILL(typ) >= P_SKILLED) { winid tmpwin = create_nhwindow(NHW_MENU); anything any; char buf[BUFSZ]; menu_item *selected; any.a_void = 0; /* set all bits to zero */ any.a_int = 1; /* use index+1 (cant use 0) as identifier */ start_menu(tmpwin); any.a_int++; Sprintf(buf, "an object on the %s", surface(cc.x, cc.y)); add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, MENU_UNSELECTED); any.a_int++; add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, "a monster", MENU_UNSELECTED); any.a_int++; Sprintf(buf, "the %s", surface(cc.x, cc.y)); add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, MENU_UNSELECTED); end_menu(tmpwin, "Aim for what?"); tohit = rn2(4); if (select_menu(tmpwin, PICK_ONE, &selected) > 0 && rn2(P_SKILL(typ) > P_SKILLED ? 20 : 2)) tohit = selected[0].item.a_int - 1; free((genericptr_t)selected); destroy_nhwindow(tmpwin); } /* What did you hit? */ switch (tohit) { case 0: /* Trap */ /* FIXME -- untrap needs to deal with non-adjacent traps */ break; case 1: /* Object */ if ((otmp = level.objects[cc.x][cc.y]) != 0) { You("snag an object from the %s!", surface(cc.x, cc.y)); (void) pickup_object(otmp, 1L, FALSE); /* If pickup fails, leave it alone */ newsym(cc.x, cc.y); return (1); } break; case 2: /* Monster */ if ((mtmp = m_at(cc.x, cc.y)) == (struct monst *)0) break; if (verysmall(mtmp->data) && !rn2(4) && enexto(&cc, u.ux, u.uy, (struct permonst *)0)) { You("pull in %s!", mon_nam(mtmp)); mtmp->mundetected = 0; rloc_to(mtmp, cc.x, cc.y); return (1); } else if ((!bigmonst(mtmp->data) && !strongmonst(mtmp->data)) || rn2(4)) { (void) thitmonst(mtmp, uwep, 1); return (1); } /* 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) { You("hook yourself!"); losehp(rn1(10,10), "a grappling hook", KILLED_BY); return (1); } break; } pline(nothing_happens); return (1); } #define BY_OBJECT ((struct monst *)0) /* return 1 if the wand is broken, hence some time elapsed */ STATIC_OVL int do_break_wand(obj) struct obj *obj; { char confirm[QBUFSZ], the_wand[BUFSZ]; Strcpy(the_wand, yname(obj)); Sprintf(confirm, "Are you really sure you want to break %s?", safe_qbuf("", sizeof("Are you really sure you want to break ?"), the_wand, ysimple_name(obj), "the wand")); if (yn(confirm) == 'n' ) return 0; if (nohands(youmonst.data)) { You_cant("break %s without hands!", the_wand); return 0; } else if (ACURR(A_STR) < 10) { You("don't have the strength to break %s!", the_wand); return 0; } pline("Raising %s high above your %s, you break it in two!", the_wand, body_part(HEAD)); return wand_explode(obj, TRUE); } /* This function takes care of the effects wands exploding, via * user-specified 'applying' as well as wands exploding by accident * during use (called by backfire() in zap.c) * * If the effect is directly recognisable as pertaining to a * specific wand, the wand should be makeknown() * Otherwise, if there is an ambiguous or indirect but visible effect * the wand should be allowed to be named by the user. * * If there is no obvious effect, do nothing. (Should this be changed * to letting the user call that type of wand?) * * hero_broke is nonzero if the user initiated the action that caused * the wand to explode (zapping or applying). */ int wand_explode(obj, hero_broke) struct obj *obj; boolean hero_broke; { static const char nothing_else_happens[] = "But nothing else happens..."; register int i, x, y; register struct monst *mon; int dmg, damage; boolean affects_objects; boolean shop_damage = FALSE; int expltype = EXPL_MAGICAL; char buf[BUFSZ]; /* [ALI] Do this first so that wand is removed from bill. Otherwise, * the freeinv() below also hides it from setpaid() which causes problems. */ if (carried(obj) ? obj->unpaid : !obj->no_charge && costly_spot(obj->ox, obj->oy)) { if (hero_broke) 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 */ if (obj->spe <= 0) { pline(nothing_else_happens); goto discard_broken_wand; } obj->ox = u.ux; obj->oy = u.uy; dmg = obj->spe * 4; affects_objects = FALSE; switch (obj->otyp) { case WAN_WISHING: case WAN_NOTHING: case WAN_LOCKING: case WAN_PROBING: case WAN_ENLIGHTENMENT: case WAN_OPENING: case WAN_SECRET_DOOR_DETECTION: pline(nothing_else_happens); goto discard_broken_wand; case WAN_DEATH: case WAN_LIGHTNING: dmg *= 4; goto wanexpl; case WAN_COLD: expltype = EXPL_FROSTY; dmg *= 2; case WAN_MAGIC_MISSILE: wanexpl: explode(u.ux, u.uy, ZT_MAGIC_MISSILE, dmg, WAND_CLASS, expltype); makeknown(obj->otyp); /* explode described the effect */ goto discard_broken_wand; /*WAC for wands of fireball- no double damage * As well, effect is the same as fire, so no makeknown */ case WAN_FIRE: dmg *= 2; case WAN_FIREBALL: expltype = EXPL_FIERY; explode(u.ux, u.uy, ZT_FIRE, dmg, WAND_CLASS, expltype); if (obj->dknown && !objects[obj->otyp].oc_name_known && !objects[obj->otyp].oc_uname) docall(obj); goto discard_broken_wand; case WAN_STRIKING: /* we want this before the explosion instead of at the very end */ pline("A wall of force smashes down around you!"); dmg = d(1 + obj->spe,6); /* normally 2d12 */ case WAN_CANCELLATION: case WAN_POLYMORPH: case WAN_UNDEAD_TURNING: case WAN_DRAINING: /* KMH */ affects_objects = TRUE; break; case WAN_TELEPORTATION: /* WAC make tele trap if you broke a wand of teleport */ /* But make sure the spot is valid! */ if ((obj->spe > 2) && rn2(obj->spe - 2) && !level.flags.noteleport && !u.uswallow && !On_stairs(u.ux, u.uy) && (!IS_FURNITURE(levl[u.ux][u.uy].typ) && !IS_ROCK(levl[u.ux][u.uy].typ) && !closed_door(u.ux, u.uy) && !t_at(u.ux, u.uy))) { struct trap *ttmp; ttmp = maketrap(u.ux, u.uy, TELEP_TRAP); if (ttmp) { ttmp->madeby_u = 1; newsym(u.ux, u.uy); /* if our hero happens to be invisible */ if (*in_rooms(u.ux,u.uy,SHOPBASE)) { /* shopkeeper will remove it */ add_damage(u.ux, u.uy, 0L); } } } affects_objects = TRUE; break; case WAN_CREATE_HORDE: /* More damage than Create monster */ dmg *= 2; break; case WAN_HEALING: case WAN_EXTRA_HEALING: dmg = 0; break; default: break; } /* magical explosion and its visual effect occur before specific effects */ explode(obj->ox, obj->oy, ZT_MAGIC_MISSILE, dmg ? rnd(dmg) : 0, WAND_CLASS, EXPL_MAGICAL); /* this makes it hit us last, so that we can see the action first */ for (i = 0; i <= 8; i++) { bhitpos.x = x = obj->ox + xdir[i]; bhitpos.y = y = obj->oy + ydir[i]; if (!isok(x,y)) continue; if (obj->otyp == WAN_DIGGING) { if(dig_check(BY_OBJECT, FALSE, x, y)) { if (IS_WALL(levl[x][y].typ) || IS_DOOR(levl[x][y].typ)) { /* normally, pits and holes don't anger guards, but they * do if it's a wall or door that's being dug */ watch_dig((struct monst *)0, x, y, TRUE); if (*in_rooms(x,y,SHOPBASE)) shop_damage = TRUE; } digactualhole(x, y, BY_OBJECT, (rn2(obj->spe) < 3 || !Can_dig_down(&u.uz)) ? PIT : HOLE); } continue; /* WAC catch Create Horde wands too */ /* MAR make the monsters around you */ } else if(obj->otyp == WAN_CREATE_MONSTER || obj->otyp == WAN_CREATE_HORDE) { /* u.ux,u.uy creates it near you--x,y might create it in rock */ (void) makemon((struct permonst *)0, u.ux, u.uy, NO_MM_FLAGS); continue; } else { if (x == u.ux && y == u.uy) { /* teleport objects first to avoid race with tele control and autopickup. Other wand/object effects handled after possible wand damage is assessed */ if (obj->otyp == WAN_TELEPORTATION && affects_objects && level.objects[x][y]) { (void) bhitpile(obj, bhito, x, y); if (flags.botl) bot(); /* potion effects */ /* makeknown is handled in zapyourself */ } damage = zapyourself(obj, FALSE); if (damage) { if (hero_broke) { Sprintf(buf, "killed %sself by breaking a wand", uhim()); losehp(damage, buf, NO_KILLER_PREFIX); } else losehp(damage, "exploding wand", KILLED_BY_AN); } if (flags.botl) bot(); /* blindness */ } else if ((mon = m_at(x, y)) != 0 && !DEADMONSTER(mon)) { (void) bhitm(mon, obj); /* if (flags.botl) bot(); */ } if (affects_objects && level.objects[x][y]) { (void) bhitpile(obj, bhito, x, y); if (flags.botl) bot(); /* potion effects */ } } } /* Note: if player fell thru, this call is a no-op. Damage is handled in digactualhole in that case */ if (shop_damage) pay_for_damage("dig into", FALSE); if (obj->otyp == WAN_LIGHT) litroom(TRUE, obj); /* only needs to be done once */ 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; } STATIC_OVL void add_class(cl, class) char *cl; char class; { char tmp[2]; tmp[0] = class; tmp[1] = '\0'; Strcat(cl, tmp); } int doapply() { struct obj *obj; register int res = 1; register boolean can_use = FALSE; char class_list[MAXOCLASSES+2]; if(check_capacity((char *)0)) return (0); if (carrying(POT_OIL) || uhave_graystone()) Strcpy(class_list, tools_too); else Strcpy(class_list, tools); if (carrying(CREAM_PIE) || carrying(EUCALYPTUS_LEAF)) add_class(class_list, FOOD_CLASS); obj = getobj(class_list, "use or apply"); if(!obj) return 0; if (obj->oartifact && !touch_artifact(obj, &youmonst)) return 1; /* evading your grasp costs a turn; just be grateful that you don't drop it as well */ if (obj->oclass == WAND_CLASS) return do_break_wand(obj); switch(obj->otyp){ case BLINDFOLD: case LENSES: if (obj == ublindf) { if (!cursed(obj)) Blindf_off(obj); } 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; case CREAM_PIE: res = use_cream_pie(obj); break; case BULLWHIP: res = use_whip(obj); break; case GRAPPLING_HOOK: res = use_grapple(obj); break; case LARGE_BOX: case CHEST: case ICE_BOX: case SACK: case BAG_OF_HOLDING: case OILSKIN_SACK: res = use_container(&obj, 1); break; case BAG_OF_TRICKS: bagotricks(obj); break; case CAN_OF_GREASE: use_grease(obj); break; #ifdef TOURIST case CREDIT_CARD: #endif case LOCK_PICK: case SKELETON_KEY: (void) pick_lock(&obj); break; case PICK_AXE: case DWARVISH_MATTOCK: /* KMH, balance patch -- the mattock is a pick, too */ res = use_pick_axe(obj); break; case FISHING_POLE: res = use_pole(obj); break; case TINNING_KIT: use_tinning_kit(obj); break; case LEASH: use_leash(obj); break; #ifdef STEED case SADDLE: res = use_saddle(obj); break; #endif case MAGIC_WHISTLE: use_magic_whistle(obj); break; case TIN_WHISTLE: use_whistle(obj); break; case EUCALYPTUS_LEAF: /* MRKR: Every Australian knows that a gum leaf makes an */ /* excellent whistle, especially if your pet is a */ /* tame kangaroo named Skippy. */ if (obj->blessed) { use_magic_whistle(obj); /* sometimes the blessing will be worn off */ if (!rn2(49)) { if (!Blind) { char buf[BUFSZ]; pline("%s %s %s.", Shk_Your(buf, obj), aobjnam(obj, "glow"), hcolor("brown")); obj->bknown = 1; } unbless(obj); } } else { use_whistle(obj); } break; case STETHOSCOPE: res = use_stethoscope(obj); break; case MIRROR: res = use_mirror(obj); break; # ifdef P_SPOON case SPOON: pline("It's a finely crafted antique spoon; what do you want to do with it?"); break; # endif /* P_SPOON */ case BELL: case BELL_OF_OPENING: use_bell(&obj); break; case CANDELABRUM_OF_INVOCATION: use_candelabrum(obj); break; case WAX_CANDLE: /* STEPHEN WHITE'S NEW CODE */ case MAGIC_CANDLE: case TALLOW_CANDLE: use_candle(&obj); break; #ifdef LIGHTSABERS case GREEN_LIGHTSABER: #ifdef D_SABER case BLUE_LIGHTSABER: #endif case RED_LIGHTSABER: case RED_DOUBLE_LIGHTSABER: if (uwep != obj && !wield_tool(obj, (const char *)0)) break; /* Fall through - activate via use_lamp */ #endif case OIL_LAMP: case MAGIC_LAMP: case BRASS_LANTERN: use_lamp(obj); break; case TORCH: res = use_torch(obj); break; case POT_OIL: light_cocktail(obj); break; #ifdef TOURIST case EXPENSIVE_CAMERA: res = use_camera(obj); break; #endif case TOWEL: res = use_towel(obj); break; case CRYSTAL_BALL: use_crystal_ball(obj); break; /* STEPHEN WHITE'S NEW CODE */ /* KMH, balance patch -- source of abuse */ #if 0 case ORB_OF_ENCHANTMENT: if(obj->spe > 0) { check_unpaid(obj); if(uwep && (uwep->oclass == WEAPON_CLASS || uwep->otyp == PICK_AXE || uwep->otyp == UNICORN_HORN)) { if (uwep->spe < 5) { if (obj->blessed) { if (!Blind) pline("Your %s glows silver.",xname(uwep)); uwep->spe += rnd(2); } else if (obj->cursed) { if (!Blind) pline("Your %s glows black.",xname(uwep)); uwep->spe -= rnd(2); } else { if (rn2(3)) { if (!Blind) pline("Your %s glows bright for a moment." ,xname(uwep)); uwep->spe += 1; } else { if (!Blind) pline("Your %s glows dark for a moment." ,xname(uwep)); uwep->spe -= 1; } } } else pline("Nothing seems to happen."); if (uwep->spe > 5) uwep->spe = 5; } else pline("The orb glows for a moment, then fades."); consume_obj_charge(obj, FALSE); } else pline("This orb is burnt out."); break; case ORB_OF_CHARGING: if(obj->spe > 0) { register struct obj *otmp; makeknown(ORB_OF_CHARGING); consume_obj_charge(obj, TRUE); otmp = getobj(all_count, "charge"); if (!otmp) break; recharge(otmp, obj->cursed ? -1 : (obj->blessed ? 1 : 0)); } else pline("This orb is burnt out."); break; case ORB_OF_DESTRUCTION: useup(obj); pline("As you activate the orb, it explodes!"); explode(u.ux, u.uy, ZT_SPELL(ZT_MAGIC_MISSILE), d(12,6), WAND_CLASS); check_unpaid(obj); break; #endif case MAGIC_MARKER: res = dowrite(obj); break; case TIN_OPENER: if(!carrying(TIN)) { You("have no tin to open."); goto xit; } You("cannot open a tin without eating or discarding its contents."); if(flags.verbose) pline("In order to eat, use the 'e' command."); if(obj != uwep) pline("Opening the tin will be much easier if you wield the tin opener."); goto xit; case FIGURINE: use_figurine(&obj); break; case UNICORN_HORN: use_unicorn_horn(obj); break; case WOODEN_FLUTE: case MAGIC_FLUTE: case TOOLED_HORN: case FROST_HORN: case FIRE_HORN: case WOODEN_HARP: case MAGIC_HARP: case BUGLE: case LEATHER_DRUM: case DRUM_OF_EARTHQUAKE: /* KMH, balance patch -- removed case PAN_PIPE_OF_SUMMONING: case PAN_PIPE_OF_THE_SEWERS: case PAN_PIPE:*/ res = do_play_instrument(obj); break; case MEDICAL_KIT: if (Role_if(PM_HEALER)) can_use = TRUE; else if ((Role_if(PM_PRIEST) || Role_if(PM_MONK) || Role_if(PM_UNDEAD_SLAYER) || Role_if(PM_SAMURAI)) && !rn2(2)) can_use = TRUE; else if(!rn2(4)) can_use = TRUE; if (obj->cursed && rn2(3)) can_use = FALSE; if (obj->blessed && rn2(3)) can_use = TRUE; makeknown(MEDICAL_KIT); if (obj->cobj) { struct obj *otmp; for (otmp = obj->cobj; otmp; otmp = otmp->nobj) if (otmp->otyp == PILL) break; if (!otmp) You_cant("find any more pills in %s.", yname(obj)); else if (!is_edible(otmp)) You("find, but cannot eat, a white pill in %s.", yname(obj)); else { check_unpaid(obj); if (otmp->quan > 1L) { otmp->quan--; obj->owt = weight(obj); } else { obj_extract_self(otmp); obfree(otmp, (struct obj *)0); } /* * Note that while white and pink pills share the * same otyp value, they are quite different. */ You("take a white pill from %s and swallow it.", yname(obj)); if (can_use) { if (Sick) make_sick(0L, (char *) 0,TRUE ,SICK_ALL); else if (Blinded > (long)(u.ucreamed+1)) make_blinded(u.ucreamed ? (long)(u.ucreamed+1) : 0L, TRUE); else if (HHallucination) make_hallucinated(0L, TRUE, 0L); else if (Vomiting) make_vomiting(0L, TRUE); else if (HConfusion) make_confused(0L, TRUE); else if (HStun) make_stunned(0L, TRUE); else if (u.uhp < u.uhpmax) { u.uhp += rn1(10,10); if (u.uhp > u.uhpmax) u.uhp = u.uhpmax; You_feel("better."); flags.botl = TRUE; } else pline(nothing_happens); } else if (!rn2(3)) pline("Nothing seems to happen."); else if (!Sick) make_sick(rn1(10,10), "bad pill", TRUE, SICK_VOMITABLE); else { You("seem to have made your condition worse!"); losehp(rn1(10,10), "a drug overdose", KILLED_BY); } } } else You("seem to be out of medical supplies"); break; case HORN_OF_PLENTY: /* not a musical instrument */ if (obj->spe > 0) { struct obj *otmp; const char *what; consume_obj_charge(obj, TRUE); if (!rn2(13)) { otmp = mkobj(POTION_CLASS, FALSE); /* KMH, balance patch -- rewritten */ while ((otmp->otyp == POT_SICKNESS) || objects[otmp->otyp].oc_magic) otmp->otyp = rnd_class(POT_BOOZE, POT_WATER); what = "A potion"; } else { otmp = mkobj(FOOD_CLASS, FALSE); if (otmp->otyp == FOOD_RATION && !rn2(7)) otmp->otyp = LUMP_OF_ROYAL_JELLY; what = "Some food"; } pline("%s spills out.", what); otmp->blessed = obj->blessed; otmp->cursed = obj->cursed; otmp->owt = weight(otmp); otmp = hold_another_object(otmp, u.uswallow ? "Oops! %s out of your reach!" : (Is_airlevel(&u.uz) || Is_waterlevel(&u.uz) || levl[u.ux][u.uy].typ < IRONBARS || levl[u.ux][u.uy].typ >= ICE) ? "Oops! %s away from you!" : "Oops! %s to the floor!", The(aobjnam(otmp, "slip")), (const char *)0); makeknown(HORN_OF_PLENTY); } else pline(nothing_happens); break; case LAND_MINE: case BEARTRAP: use_trap(obj); break; case FLINT: case LUCKSTONE: case LOADSTONE: case TOUCHSTONE: case HEALTHSTONE: case WHETSTONE: use_stone(obj); break; #ifdef FIREARMS case ASSAULT_RIFLE: /* Switch between WP_MODE_SINGLE, WP_MODE_BURST and WP_MODE_AUTO */ if (obj->altmode == WP_MODE_AUTO) { obj->altmode = WP_MODE_BURST; } else if (obj->altmode == WP_MODE_BURST) { obj->altmode = WP_MODE_SINGLE; } else { obj->altmode = WP_MODE_AUTO; } You("switch %s to %s mode.", yname(obj), ((obj->altmode == WP_MODE_SINGLE) ? "single shot" : ((obj->altmode == WP_MODE_BURST) ? "burst" : "full automatic"))); break; case AUTO_SHOTGUN: case SUBMACHINE_GUN: if (obj->altmode == WP_MODE_AUTO) obj-> altmode = WP_MODE_SINGLE; else obj->altmode = WP_MODE_AUTO; You("switch %s to %s mode.", yname(obj), (obj->altmode ? "semi-automatic" : "full automatic")); break; case FRAG_GRENADE: case GAS_GRENADE: if (!obj->oarmed) { You("arm %s.", yname(obj)); arm_bomb(obj, TRUE); } else pline("It's already armed!"); break; case STICK_OF_DYNAMITE: light_cocktail(obj); break; #endif default: /* KMH, balance patch -- polearms can strike at a distance */ if (is_pole(obj)) { res = use_pole(obj); break; } else if (is_pick(obj) || is_axe(obj)) { res = use_pick_axe(obj); break; } pline("Sorry, I don't know how to use that."); xit: nomul(0); return 0; } if (res && obj && 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 */ /*apply.c*/ slashem-0.0.7E7F3/src/botl.c0000664000076400007640000003567310545462317013565 0ustar aliali/* 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. */ #include "hack.h" #ifdef OVL0 extern const char *hu_stat[]; /* defined in eat.c */ const char *hu_abbrev_stat[] = { /* must be kept consistent with eat.c */ "Sat", "", "Hun", "Wea", "Ftg", "Ftd", "Sta" }; const char * const enc_stat[] = { "", "Burdened", "Stressed", "Strained", "Overtaxed", "Overloaded" }; const char *enc_abbrev_stat[] = { "", "Brd", "Ssd", "Snd", "Otd", "Old" }; STATIC_DCL void NDECL(bot1); STATIC_DCL void NDECL(bot2); #ifdef ALLEG_FX STATIC_DCL void FDECL(set_botl_warn, (int)); #endif #endif /* OVL0 */ /* MAXCO must hold longest uncompressed status line, and must be larger * than COLNO * * longest practical second status line at the moment is * Astral Plane $:12345 HP:700(700) Pw:111(111) AC:-127 Xp:30/123456789 * Wt:5000/1000 T:123456 Satiated Lev Conf FoodPois Ill Blind Stun Hallu * Slime Held Overloaded * -- or somewhat over 160 characters */ #if COLNO <= 170 #define MAXCO 190 #else #define MAXCO (COLNO+20) #endif #ifndef OVLB STATIC_DCL int mrank_sz; #else /* OVLB */ STATIC_OVL NEARDATA int mrank_sz = 0; /* loaded by max_rank_sz (from u_init) */ #endif /* OVLB */ STATIC_DCL const char *NDECL(rank); #ifdef OVL1 #ifdef ALLEG_FX static int botl_warn = 0; static void set_botl_warn(level) int level; { botl_warn = level; flags.botl = 1; } #endif /* convert experience level (1..30) to rank index (0..8) */ int xlev_to_rank(xlev) int xlev; { return (xlev <= 2) ? 0 : (xlev <= 30) ? ((xlev + 2) / 4) : 8; } #if 0 /* not currently needed */ /* convert rank index (0..8) to experience level (1..30) */ int rank_to_xlev(rank) int rank; { return (rank <= 0) ? 1 : (rank <= 8) ? ((rank * 4) - 2) : 30; } #endif const char * rank_of(lev, monnum, female) int lev; short monnum; boolean female; { register struct Role *role; register int i; /* Find the role */ for (role = (struct Role *) roles; role->name.m; role++) if (monnum == role->malenum || monnum == role->femalenum) break; if (!role->name.m) role = &urole; /* Find the rank */ for (i = xlev_to_rank((int)lev); i >= 0; i--) { if (female && role->rank[i].f) return (role->rank[i].f); if (role->rank[i].m) return (role->rank[i].m); } /* Try the role name, instead */ if (female && role->name.f) return (role->name.f); else if (role->name.m) return (role->name.m); return ("Player"); } STATIC_OVL const char * rank() { return(rank_of(u.ulevel, Role_switch, flags.female)); } int title_to_mon(str, rank_indx, title_length) const char *str; int *rank_indx, *title_length; { register int i, j; /* Loop through each of the roles */ for (i = 0; roles[i].name.m; i++) for (j = 0; j < 9; j++) { if (roles[i].rank[j].m && !strncmpi(str, roles[i].rank[j].m, strlen(roles[i].rank[j].m))) { if (rank_indx) *rank_indx = j; if (title_length) *title_length = strlen(roles[i].rank[j].m); return roles[i].malenum; } if (roles[i].rank[j].f && !strncmpi(str, roles[i].rank[j].f, strlen(roles[i].rank[j].f))) { if (rank_indx) *rank_indx = j; if (title_length) *title_length = strlen(roles[i].rank[j].f); return ((roles[i].femalenum != NON_PM) ? roles[i].femalenum : roles[i].malenum); } } return NON_PM; } #endif /* OVL1 */ #ifdef OVLB void max_rank_sz() { register int i, r, maxr = 0; for (i = 0; i < 9; i++) { if (urole.rank[i].m && (r = strlen(urole.rank[i].m)) > maxr) maxr = r; if (urole.rank[i].f && (r = strlen(urole.rank[i].f)) > maxr) maxr = r; } mrank_sz = maxr; return; } #endif /* OVLB */ #ifdef OVL0 #ifdef SCORE_ON_BOTL long 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); } #endif static char * botl_player() { static char player[MAXCO]; register char *nb; char mbot[MAXCO - 15]; int k = 0; Strcpy(player, plname); if ('a' <= player[0] && player[0] <= 'z') player[0] += 'A'-'a'; player[10] = 0; Sprintf(nb = eos(player)," the "); if (Upolyd) { (void) strncpy(mbot, mons[u.umonnum].mname, SIZE(mbot) - 1); mbot[SIZE(mbot) - 1] = 0; while(mbot[k] != 0) { if ((k == 0 || (k > 0 && mbot[k-1] == ' ')) && 'a' <= mbot[k] && mbot[k] <= 'z') mbot[k] += 'A' - 'a'; k++; } Sprintf(eos(nb), mbot); } else Sprintf(eos(nb), rank()); return player; } static char * botl_strength() { static char strength[6]; if (ACURR(A_STR) > 18) { if (ACURR(A_STR) > STR18(100)) Sprintf(strength, "%2d", ACURR(A_STR)-100); else if (ACURR(A_STR) < STR18(100)) Sprintf(strength, "18/%02d", ACURR(A_STR)-18); else Sprintf(strength, "18/**"); } else Sprintf(strength, "%-1d", ACURR(A_STR)); return strength; } STATIC_OVL void bot1() { char newbot1[MAXCO]; register char *nb; register int i,j; Strcpy(newbot1, botl_player()); Sprintf(nb = eos(newbot1)," "); i = mrank_sz + 15; j = (nb + 2) - newbot1; /* aka strlen(newbot1) but less computation */ if((i - j) > 0) Sprintf(nb = eos(nb),"%*s", i-j, " "); /* pad with spaces */ Sprintf(nb = eos(nb), "St:%s ", botl_strength()); Sprintf(nb = eos(nb), "Dx:%-1d Co:%-1d In:%-1d Wi:%-1d Ch:%-1d", ACURR(A_DEX), ACURR(A_CON), ACURR(A_INT), ACURR(A_WIS), ACURR(A_CHA)); Sprintf(nb = eos(nb), (u.ualign.type == A_CHAOTIC) ? " Chaotic" : (u.ualign.type == A_NEUTRAL) ? " Neutral" : " Lawful"); #ifdef SCORE_ON_BOTL if (flags.showscore) Sprintf(nb = eos(nb), " S:%ld", botl_score()); #endif curs(WIN_STATUS, 1, 0); putstr(WIN_STATUS, 0, newbot1); } /* provide the name of the current level for display by various ports */ int describe_level(buf, verbose) char *buf; int verbose; { int ret = 1; /* TODO: Add in dungeon name */ if (Is_knox(&u.uz)) Sprintf(buf, "%s ", dungeons[u.uz.dnum].dname); else if (In_quest(&u.uz)) Sprintf(buf, "Home %d ", dunlev(&u.uz)); else if (In_endgame(&u.uz)) Sprintf(buf, Is_astralevel(&u.uz) ? "Astral Plane " : "End Game "); else { if (verbose) Sprintf(buf, "%s, level %d ", dungeons[u.uz.dnum].dname, depth(&u.uz)); else Sprintf(buf, "Dlvl:%-2d ", depth(&u.uz)); ret = 0; } return ret; } /* [ALI] Line 2 abbreviation levels: * 0 - No abbreviation * 1 - Omit gold * 2 - Abbreviated status tags * 3 - Disable show options * 4 - Omit dungeon level * * We omit gold first since the '$' command is always available. * * While the abbreviated status tags are very difficult to interpret, we use * these before disabling the show options on the basis that the user always * has the choice of turning the show options off if that would be preferable. * * Last to go is the dungeon level on the basis that there is no way of * finding this information other than via the status line. */ static int bot2_abbrev = 0; /* Line 2 abbreviation level (max 4) */ STATIC_OVL void bot2str(char *newbot2) { register char *nb; int hp, hpmax; int cap = near_capacity(); #ifdef ALLEG_FX int w; #endif hp = Upolyd ? u.mh : u.uhp; hpmax = Upolyd ? u.mhmax : u.uhpmax; if(hp < 0) hp = 0; if (bot2_abbrev < 4) (void) describe_level(newbot2, FALSE); else newbot2[0] = '\0'; if (bot2_abbrev < 1) Sprintf(nb = eos(newbot2), "%c:%-2ld ", oc_syms[COIN_CLASS], #ifndef GOLDOBJ u.ugold #else money_cnt(invent) #endif ); else nb = newbot2; Sprintf(nb = eos(nb), "HP:%d(%d) Pw:%d(%d) AC:%-2d", hp, hpmax, u.uen, u.uenmax, u.uac); if (Upolyd) Sprintf(nb = eos(nb), " HD:%d", ((u.ulycn == u.umonnum) ? u.ulevel : mons[u.umonnum].mlevel)); #ifdef EXP_ON_BOTL else if(flags.showexp && bot2_abbrev < 3) Sprintf(nb = eos(nb), " Xp:%u/%-1ld", u.ulevel,u.uexp); #endif else Sprintf(nb = eos(nb), " Exp:%u", u.ulevel); #ifdef SHOW_WEIGHT if (flags.showweight && bot2_abbrev < 3) Sprintf(nb = eos(nb), " Wt:%ld/%ld", (long)(inv_weight()+weight_cap()), (long)weight_cap()); #endif if(flags.time && bot2_abbrev < 3) Sprintf(nb = eos(nb), " T:%ld ", moves); #ifdef ALLEG_FX if(iflags.usealleg && botl_warn && !Hallucination) { Sprintf(nb = eos(nb), " "); for(w = 0; w < botl_warn; w++) Sprintf(nb = eos(nb), "!"); } #endif if (bot2_abbrev >= 2) { if (hu_abbrev_stat[u.uhs][0]!='\0') { Sprintf(nb = eos(nb), " "); Strcat(newbot2, hu_abbrev_stat[u.uhs]); } } else if(strcmp(hu_stat[u.uhs], " ")) { Sprintf(nb = eos(nb), " "); Strcat(newbot2, hu_stat[u.uhs]); } /* WAC further Up #ifdef SCORE_ON_BOTL if (flags.showscore) Sprintf(nb,"%c:%-2ld Score:%ld", oc_syms[COIN_CLASS], u.ugold, botl_score()); #endif */ /* KMH -- changed to Lev */ if (Levitation) Sprintf(nb = eos(nb), " Lev"); if(Confusion) Sprintf(nb = eos(nb), bot2_abbrev >= 2 ? " Cnf" : " Conf"); if(Sick) { if (u.usick_type & SICK_VOMITABLE) Sprintf(nb = eos(nb), bot2_abbrev >= 2 ? " FPs" : " FoodPois"); if (u.usick_type & SICK_NONVOMITABLE) Sprintf(nb = eos(nb), " Ill"); } if(Blind) Sprintf(nb = eos(nb), bot2_abbrev >= 2 ? " Bnd" : " Blind"); if(Stunned) Sprintf(nb = eos(nb), bot2_abbrev >= 2 ? " Stn" : " Stun"); if(Hallucination) Sprintf(nb = eos(nb), bot2_abbrev >= 2 ? " Hal" : " Hallu"); if(Slimed) Sprintf(nb = eos(nb), bot2_abbrev >= 2 ? " Slm" : " Slime"); if(u.ustuck && !u.uswallow && !sticks(youmonst.data)) Sprintf(nb = eos(nb), " Held"); if(cap > UNENCUMBERED) Sprintf(nb = eos(nb), " %s", bot2_abbrev >= 2 ? enc_abbrev_stat[cap] : enc_stat[cap]); } STATIC_OVL void bot2() { char newbot2[MAXCO]; bot2str(newbot2); curs(WIN_STATUS, 1, 1); putstr(WIN_STATUS, 0, newbot2); return; } /* WAC -- Shorten bot1 to fit in len spaces. * Not currently used * Longest string past Str: is * ". Str:18/99 Dx:11 Co:13 In:12 Wi:14 Ch:14 Neutral" or 49 Chars long. */ #if 0 const char* shorten_bot1(str, len) const char *str; int len; { static char cbuf[BUFSZ]; register const char *bp0 = str; register char *bp1 = cbuf; int k = 0; do { *bp1++ = *bp0; k++; } while(*bp0++ && k < (len - 49)); cbuf[k] = '.'; bp1++; bp0 = index(str, ':') - 3; do { *bp1++ = *bp0; } while(*bp0++); return cbuf; } #endif /* 0 */ /* ALI -- Shorten bot2 to fit in len spaces. * Currently only used by tty port * After the forth attempt the longest practical bot2 becomes: * HP:700(700) Pw:111(111) AC:-127 Exp:30 * Sat Lev Cnf FPs Ill Bnd Stn Hal Slm Old * -- or just under 80 characters */ #ifdef TTY_GRAPHICS const char* shorten_bot2(str, len) const char *str; unsigned int len; { static char cbuf[MAXCO]; for(bot2_abbrev = 1; bot2_abbrev <= 4; bot2_abbrev++) { bot2str(cbuf); if (strlen(cbuf) <= len) break; } if (bot2_abbrev > 4) cbuf[len] = '\0'; /* If all else fails, truncate the line */ bot2_abbrev = 0; return cbuf; } #endif /* TTY_GRAPHICS */ static void (*raw_handler)(); static void bot_raw(reconfig) boolean reconfig; { const char *botl_raw_values[24], **rv = botl_raw_values; char dex[3], con[3], itl[3], wis[3], cha[3], score[21]; int uhp; char dlevel[BUFSZ]; char hp[21], hpmax[21], pw[21], pwmax[21], gold[21], ac[21], elevel[21]; char expr[21], iweight[21], capacity[21], flgs[21], tim[21]; *rv++ = reconfig ? "player" : botl_player(); *rv++ = reconfig ? "strength" : botl_strength(); *rv++ = reconfig ? "dexterity" : (Sprintf(dex, "%d", ACURR(A_DEX)), dex); *rv++ = reconfig ? "constitution" : (Sprintf(con, "%d", ACURR(A_CON)), con); *rv++ = reconfig ? "intelligence" : (Sprintf(itl, "%d", ACURR(A_INT)), itl); *rv++ = reconfig ? "wisdom" : (Sprintf(wis, "%d", ACURR(A_WIS)), wis); *rv++ = reconfig ? "charisma" : (Sprintf(cha, "%d", ACURR(A_CHA)), cha); *rv++ = reconfig ? "alignment" : u.ualign.type == A_CHAOTIC ? "Chaotic" : u.ualign.type == A_NEUTRAL ? "Neutral" : "Lawful"; #ifdef SCORE_ON_BOTL if (flags.showscore) *rv++ = reconfig ? "score" : (Sprintf(score, "%ld", botl_score()), score); #endif uhp = Upolyd ? u.mh : u.uhp; if (uhp < 0) uhp = 0; (void) describe_level(dlevel, TRUE); eos(dlevel)[-1] = 0; *rv++ = reconfig ? "dlevel" : dlevel; *rv++ = reconfig ? "gold" : (Sprintf(gold, "%ld", #ifndef GOLDOBJ u.ugold #else money_cnt(invent) #endif ), gold); *rv++ = reconfig ? "hp" : (Sprintf(hp, "%d", uhp), hp); *rv++ = reconfig ? "hpmax" : (Sprintf(hpmax, "%d", Upolyd ? u.mhmax : u.uhpmax), hpmax); *rv++ = reconfig ? "pw" : (Sprintf(pw, "%d", u.uen), pw); *rv++ = reconfig ? "pwmax" : (Sprintf(pwmax, "%d", u.uenmax), pwmax); *rv++ = reconfig ? "ac" : (Sprintf(ac, "%d", u.uac), ac); Sprintf(elevel, "%u", Upolyd && u.ulycn != u.umonnum ? mons[u.umonnum].mlevel : u.ulevel); *rv++ = reconfig ? (Upolyd ? "hitdice" : "elevel") : elevel; #ifdef EXP_ON_BOTL if (flags.showexp) *rv++ = reconfig ? "experience" : (Sprintf(expr, "%ld", u.uexp), expr); #endif #ifdef SHOW_WEIGHT if (flags.showweight) { *rv++ = reconfig ? "weight" : (Sprintf(iweight, "%ld", (long)(inv_weight() + weight_cap())), iweight); *rv++ = reconfig ? "capacity" : (Sprintf(capacity, "%ld", (long)weight_cap()), capacity); } #endif if (flags.time) *rv++ = reconfig ? "time" : (Sprintf(tim, "%ld", moves), tim); *rv++ = reconfig ? "hunger" : strcmp(hu_stat[u.uhs], " ") ? hu_stat[u.uhs] : ""; *rv++ = reconfig ? "encumberance" : enc_stat[near_capacity()]; *rv++ = reconfig ? "flags" : (Sprintf(flgs, "%lX", (Levitation ? RAW_STAT_LEVITATION : 0) | (Confusion ? RAW_STAT_CONFUSION : 0) | (Sick && (u.usick_type & SICK_VOMITABLE) ? RAW_STAT_FOODPOIS : 0) | (Sick && (u.usick_type & SICK_NONVOMITABLE) ? RAW_STAT_ILL : 0) | (Blind ? RAW_STAT_BLIND : 0) | (Stunned ? RAW_STAT_STUNNED : 0) | (Hallucination ? RAW_STAT_HALLUCINATION : 0) | (Slimed ? RAW_STAT_SLIMED : 0)), flgs); (*raw_handler)(reconfig, rv - botl_raw_values, botl_raw_values); } void bot_reconfig() { if (raw_handler) bot_raw(TRUE); flags.botl = 1; } void bot_set_handler(handler) void (*handler)(); { raw_handler = handler; bot_reconfig(); } void bot() { /* * ALI: Cope with the fact that u_init may not have been * called yet. This happens if the player selection menus * are long enough to overwite the status line. In this * case we will be called when the menu is removed while * youmonst.data is still NULL. */ if (!youmonst.data) return; if (raw_handler) bot_raw(FALSE); else { bot1(); bot2(); } flags.botl = flags.botlx = 0; } #endif /* OVL0 */ /*botl.c*/ slashem-0.0.7E7F3/src/shk.c0000664000076400007640000044131310545462317013402 0ustar aliali/* SCCS Id: @(#)shk.c 3.4 2003/12/04 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" #include "eshk.h" /*#define DEBUG*/ #define PAY_SOME 2 #define PAY_BUY 1 #define PAY_CANT 0 /* too poor */ #define PAY_SKIP (-1) #define PAY_BROKE (-2) #ifdef KOPS STATIC_DCL void FDECL(makekops, (coord *)); STATIC_DCL void FDECL(call_kops, (struct monst *,BOOLEAN_P)); # ifdef OVLB STATIC_DCL void FDECL(kops_gone, (BOOLEAN_P)); # endif /* OVLB */ #endif /* KOPS */ #define IS_SHOP(x) (rooms[x].rtype >= SHOPBASE) #define no_cheat ((ACURR(A_CHA) - rnl(3)) > 7) extern const struct shclass shtypes[]; /* defined in shknam.c */ extern struct obj *thrownobj; /* defined in dothrow.c */ STATIC_VAR NEARDATA long int followmsg; /* last time of follow message */ STATIC_DCL void FDECL(setpaid, (struct monst *)); STATIC_DCL long FDECL(addupbill, (struct monst *)); STATIC_DCL void FDECL(pacify_shk, (struct monst *)); STATIC_DCL struct bill_x *FDECL(onbill, (struct obj *, struct monst *, BOOLEAN_P)); STATIC_DCL struct monst *FDECL(next_shkp, (struct monst *, BOOLEAN_P)); STATIC_DCL long FDECL(shop_debt, (struct eshk *)); STATIC_DCL char *FDECL(shk_owns, (char *,struct obj *)); STATIC_DCL char *FDECL(mon_owns, (char *,struct obj *)); STATIC_DCL void FDECL(clear_unpaid,(struct obj *)); STATIC_DCL long FDECL(check_credit, (long, struct monst *)); STATIC_DCL void FDECL(pay, (long, struct monst *)); STATIC_DCL long FDECL(get_cost, (struct obj *, struct monst *)); STATIC_DCL long FDECL(set_cost, (struct obj *, struct monst *)); STATIC_DCL const char *FDECL(shk_embellish, (struct obj *, long)); STATIC_DCL long FDECL(cost_per_charge, (struct monst *,struct obj *,BOOLEAN_P)); STATIC_DCL long FDECL(cheapest_item, (struct monst *)); STATIC_DCL int FDECL(dopayobj, (struct monst *, struct bill_x *, struct obj **, int, BOOLEAN_P)); STATIC_DCL long FDECL(stolen_container, (struct obj *, struct monst *, long, BOOLEAN_P, BOOLEAN_P)); STATIC_DCL long FDECL(getprice, (struct obj *,BOOLEAN_P)); STATIC_DCL void FDECL(shk_names_obj, (struct monst *,struct obj *,const char *,long,const char *)); STATIC_DCL struct obj *FDECL(bp_to_obj, (struct bill_x *)); STATIC_DCL boolean FDECL(inherits, (struct monst *,int,int)); STATIC_DCL void FDECL(set_repo_loc, (struct eshk *)); STATIC_DCL boolean NDECL(angry_shk_exists); STATIC_DCL void FDECL(rile_shk, (struct monst *)); STATIC_DCL void FDECL(rouse_shk, (struct monst *,BOOLEAN_P)); STATIC_DCL void FDECL(remove_damage, (struct monst *, BOOLEAN_P)); STATIC_DCL void FDECL(sub_one_frombill, (struct obj *, struct monst *)); STATIC_DCL void FDECL(add_one_tobill, (struct obj *, BOOLEAN_P)); STATIC_DCL void FDECL(dropped_container, (struct obj *, struct monst *, BOOLEAN_P)); 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 boolean FDECL(rob_shop, (struct monst *)); #endif #ifdef OTHER_SERVICES #define NOBOUND (-1) /* No lower/upper limit to charge */ static void NDECL(shk_other_services); static void FDECL(shk_identify, (char *, struct monst *)); static void FDECL(shk_uncurse, (char *, struct monst *)); static void FDECL(shk_appraisal, (char *, struct monst *)); static void FDECL(shk_weapon_works, (char *, struct monst *)); static void FDECL(shk_armor_works, (char *, struct monst *)); static void FDECL(shk_charge, (char *, struct monst *)); static boolean FDECL(shk_obj_match, (struct obj *, struct monst *)); /*static int FDECL(shk_class_match, (long class, struct monst *shkp));*/ static boolean FDECL(shk_offer_price, (char *, long, struct monst *)); static void FDECL(shk_smooth_charge, (int *, int, int)); #endif #ifdef OVLB /* invariants: obj->unpaid iff onbill(obj) [unless bp->useup] 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, FALSE); /* 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; register boolean withbill; { for (; shkp; shkp = shkp->nmon) { if (DEADMONSTER(shkp)) continue; if (shkp->isshk && (ESHK(shkp)->billct || !withbill)) break; } if (shkp) { if (NOTANGRY(shkp)) { if (ESHK(shkp)->surcharge) pacify_shk(shkp); } else { if (!ESHK(shkp)->surcharge) rile_shk(shkp); } } return(shkp); } char * shkname(mtmp) /* called in do_name.c */ register struct monst *mtmp; { return(ESHK(mtmp)->shknam); } 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); } } } void set_residency(shkp, zero_out) register struct monst *shkp; register boolean zero_out; { if (on_level(&(ESHK(shkp)->shoplevel), &u.uz)) rooms[ESHK(shkp)->shoproom - ROOMOFFSET].resident = (zero_out)? (struct monst *)0 : shkp; } void replshk(mtmp,mtmp2) register struct monst *mtmp, *mtmp2; { rooms[ESHK(mtmp2)->shoproom - ROOMOFFSET].resident = mtmp2; if (inhishop(mtmp) && *u.ushops == ESHK(mtmp)->shoproom) { ESHK(mtmp2)->bill_p = &(ESHK(mtmp2)->bill[0]); } } /* do shopkeeper specific structure munging -dlc */ void restshk(shkp, ghostly) struct monst *shkp; boolean ghostly; { if (u.uz.dlevel) { struct eshk *eshkp = ESHK(shkp); if (eshkp->bill_p != (struct bill_x *) -1000) eshkp->bill_p = &eshkp->bill[0]; /* shoplevel can change as dungeons move around */ /* savebones guarantees that non-homed shk's will be gone */ if (ghostly) { assign_level(&eshkp->shoplevel, &u.uz); if (ANGRY(shkp) && strncmpi(eshkp->customer, plname, PL_NSIZ)) pacify_shk(shkp); } } } #endif /* OVLB */ #ifdef OVL3 /* Clear the unpaid bit on all of the objects in the list. */ STATIC_OVL void clear_unpaid(list) register struct obj *list; { while (list) { if (Has_contents(list)) clear_unpaid(list->cobj); list->unpaid = 0; list = list->nobj; } } #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); if (thrownobj) thrownobj->unpaid = 0; for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) clear_unpaid(mtmp->minvent); for(mtmp = migrating_mons; mtmp; mtmp = mtmp->nmon) clear_unpaid(mtmp->minvent); while ((obj = billobjs) != 0) { obj_extract_self(obj); dealloc_obj(obj); } if(shkp) { ESHK(shkp)->billct = 0; ESHK(shkp)->credit = 0L; ESHK(shkp)->debit = 0L; ESHK(shkp)->loan = 0L; } } STATIC_OVL long addupbill(shkp) register struct monst *shkp; { register int ct = ESHK(shkp)->billct; register struct bill_x *bp = ESHK(shkp)->bill_p; register long total = 0L; while(ct--){ total += bp->price * bp->bquan; bp++; } return(total); } #endif /* OVLB */ #ifdef OVL1 #ifdef KOPS STATIC_OVL void call_kops(shkp, nearshop) register struct monst *shkp; register boolean nearshop; { /* Keystone Kops srt@ucla */ register boolean nokops; char kopname[20]; Strcpy(kopname, "Keystone Kops"); if(!shkp) return; if (flags.soundok) pline("An alarm sounds!"); nokops = ((mvitals[PM_KEYSTONE_KOP].mvflags & G_GONE) && (mvitals[PM_KOP_SERGEANT].mvflags & G_GONE) && (mvitals[PM_KOP_LIEUTENANT].mvflags & G_GONE) && (mvitals[PM_KOP_KAPTAIN].mvflags & G_GONE)); #ifdef BLACKMARKET if (Is_blackmarket(&u.uz)) { nokops = ((mvitals[PM_SOLDIER].mvflags & G_GONE) && (mvitals[PM_SERGEANT].mvflags & G_GONE) && (mvitals[PM_LIEUTENANT].mvflags & G_GONE) && (mvitals[PM_CAPTAIN].mvflags & G_GONE)); Strcpy(kopname, "guards"); } #endif /* defined(BLACKMARKET) */ if(!angry_guards(!flags.soundok) && nokops) { if(flags.verbose && flags.soundok) pline("But no one seems to respond to it."); return; } if(nokops) return; { coord mm; if (nearshop) #ifdef BLACKMARKET if (!Is_blackmarket(&u.uz)) #endif /* BLACKMARKET */ { /* Create swarm around you, if you merely "stepped out" */ if (flags.verbose) pline_The("%s appear!", kopname); mm.x = u.ux; mm.y = u.uy; makekops(&mm); return; } if (flags.verbose) pline_The("%s are after you!", kopname); /* Create swarm near down staircase (hinders return to level) */ #ifdef BLACKMARKET if (Is_blackmarket(&u.uz)) { struct trap *trap = ftrap; while (trap) { if (trap->ttyp == MAGIC_PORTAL) { mm.x = trap->tx; mm.y = trap->ty; } trap = trap->ntrap; } } else { mm.x = xdnstair; mm.y = ydnstair; } #else /* BLACKMARKET */ mm.x = xdnstair; mm.y = ydnstair; #endif /* BLACKMARKET */ makekops(&mm); /* Create swarm near shopkeeper (hinders return to shop) */ mm.x = shkp->mx; mm.y = shkp->my; makekops(&mm); } } #endif /* KOPS */ #ifdef BLACKMARKET void blkmar_guards(shkp) register struct monst *shkp; { register struct monst *mt; register struct eshk *eshkp = ESHK(shkp); boolean mesg_given = FALSE; /* Only give message if assistants peaceful */ static boolean rlock = FALSE; /* Prevent recursive calls (via wakeup) */ if (rlock) return; rlock = TRUE; /* wake up assistants */ for (mt = fmon; mt; mt = mt->nmon) { if (DEADMONSTER(mt)) continue; /* non-tame named monsters are presumably * black marketeer's assistants */ if (!mt->mtame && NAME(mt) && *NAME(mt) && mt->mpeaceful && mt != shkp && inside_shop(mt->mx, mt->my) == eshkp->shoproom) { if (!mesg_given) { pline("%s calls for %s assistants!", noit_Monnam(shkp), mhis(shkp)); mesg_given = TRUE; } wakeup(mt); } } rlock = FALSE; } #endif /* BLACKMARKET */ /* x,y is strictly inside shop */ char inside_shop(x, y) register xchar x, y; { register char rno; rno = levl[x][y].roomno; if ((rno < ROOMOFFSET) || levl[x][y].edge || !IS_SHOP(rno-ROOMOFFSET)) return(NO_ROOM); else return(rno); } void u_left_shop(leavestring, newlev) char *leavestring; boolean newlev; { struct monst *shkp; struct eshk *eshkp; /* * IF player * ((didn't leave outright) AND * ((he is now strictly-inside the shop) OR * (he wasn't strictly-inside last turn anyway))) * THEN (there's nothing to do, so just return) */ if(!*leavestring && (!levl[u.ux][u.uy].edge || levl[u.ux0][u.uy0].edge)) 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) { /* * Player just stepped onto shop-boundary (known from above logic). * Try to intimidate him into paying his bill */ verbalize(NOTANGRY(shkp) ? "%s! Please pay before leaving." : "%s! Don't you leave without paying!", plname); return; } if (rob_shop(shkp)) { #ifdef BLACKMARKET if (Is_blackmarket(&u.uz)) blkmar_guards(shkp); #endif #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; if (rob_shop(shkp)) { #ifdef BLACKMARKET if (Is_blackmarket(&u.uz)) blkmar_guards(shkp); #endif #ifdef KOPS /*[might want to set 2nd arg based on distance from shop doorway]*/ call_kops(shkp, FALSE); #else (void) angry_guards(FALSE); #endif } } /* shop merchandise has been taken; pay for it with any credit available; return false if the debt is fully covered by credit, true otherwise */ static boolean rob_shop(shkp) struct monst *shkp; { struct eshk *eshkp; long total; eshkp = ESHK(shkp); rouse_shk(shkp, TRUE); 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!"); total -= eshkp->credit; } setpaid(shkp); if (!total) return FALSE; /* 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)); You("feel like an evil rogue."); } hot_pursuit(shkp); return TRUE; } void u_entered_shop(enterstring) register char *enterstring; { register int rt; register struct monst *shkp; register struct eshk *eshkp; static const char no_shk[] = "This shop appears to be deserted."; static char empty_shops[5]; if(!*enterstring) return; if(!(shkp = shop_keeper(*enterstring))) { if (!index(empty_shops, *enterstring) && in_rooms(u.ux, u.uy, SHOPBASE) != in_rooms(u.ux0, u.uy0, SHOPBASE)) pline(no_shk); Strcpy(empty_shops, u.ushops); u.ushops[0] = '\0'; return; } eshkp = ESHK(shkp); if (!inhishop(shkp)) { /* dump core when referenced */ eshkp->bill_p = (struct bill_x *) -1000; if (!index(empty_shops, *enterstring)) pline(no_shk); Strcpy(empty_shops, u.ushops); u.ushops[0] = '\0'; return; } eshkp->bill_p = &(eshkp->bill[0]); if ((!eshkp->visitct || *eshkp->customer) && strncmpi(eshkp->customer, plname, PL_NSIZ)) { /* You seem to be new here */ eshkp->visitct = 0; eshkp->following = 0; (void) strncpy(eshkp->customer,plname,PL_NSIZ); pacify_shk(shkp); } if (shkp->msleeping || !shkp->mcanmove || eshkp->following) return; /* no dialog */ if (Invis) { pline("%s senses your presence.", shkname(shkp)); #ifdef BLACKMARKET if (!Is_blackmarket(&u.uz)) { verbalize("Invisible customers are not welcome!"); return; } #else /* BLACKMARKET */ verbalize("Invisible customers are not welcome!"); return; #endif /* BLACKMARKET */ } #ifdef BLACKMARKET if (Is_blackmarket(&u.uz) && u.umonnum>0 && mons[u.umonnum].mlet != S_HUMAN) { verbalize("Non-human customers are not welcome!"); return; } #endif /* BLACKMARKET */ rt = rooms[*enterstring - ROOMOFFSET].rtype; if (ANGRY(shkp)) { verbalize("So, %s, you dare return to %s %s?!", plname, s_suffix(shkname(shkp)), shtypes[rt - SHOPBASE].name); } else if (eshkp->robbed) { pline("%s mutters imprecations against shoplifters.", shkname(shkp)); } else { verbalize("%s, %s! Welcome%s to %s %s!", Hello(shkp), plname, eshkp->visitct++ ? " again" : "", s_suffix(shkname(shkp)), shtypes[rt - SHOPBASE].name); } /* can't do anything about blocking if teleported in */ if (!inside_shop(u.ux, u.uy)) { boolean should_block; int cnt; const char *tool; struct obj *pick = carrying(PICK_AXE), *mattock = carrying(DWARVISH_MATTOCK); if (pick || mattock) { cnt = 1; if (pick && mattock) { /* carrying both types */ tool = "digging tool"; cnt = 2; /* `more than 1' is all that matters */ } else if (pick) { tool = "pick-axe"; /* hack: `pick' already points somewhere into inventory */ while ((pick = pick->nobj) != 0) if (pick->otyp == PICK_AXE) ++cnt; } else { /* assert(mattock != 0) */ tool = "mattock"; while ((mattock = mattock->nobj) != 0) if (mattock->otyp == DWARVISH_MATTOCK) ++cnt; /* [ALI] Shopkeeper indicates mattock(s) */ if (!Blind) makeknown(DWARVISH_MATTOCK); } verbalize(NOTANGRY(shkp) ? "Will you please leave your %s%s outside?" : "Leave the %s%s outside.", tool, plur(cnt)); should_block = TRUE; #ifdef STEED } else if (u.usteed) { verbalize(NOTANGRY(shkp) ? "Will you please leave %s outside?" : "Leave %s outside.", y_monnam(u.usteed)); should_block = TRUE; #endif } else { should_block = (Fast && (sobj_at(PICK_AXE, u.ux, u.uy) || sobj_at(DWARVISH_MATTOCK, u.ux, u.uy))); } if (should_block) (void) dochug(shkp); /* shk gets extra move */ } return; } /* Decide whether two unpaid items are mergable; caller is responsible for making sure they're unpaid and the same type of object; we check the price quoted by the shopkeeper and also that they both belong to the same shk. */ boolean same_price(obj1, obj2) struct obj *obj1, *obj2; { register struct monst *shkp1, *shkp2; register struct bill_x *bp1 = 0, *bp2 = 0; register boolean are_mergable = FALSE; /* 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; } if (!bp1 || !bp2) impossible("same_price: object wasn't on any bill!"); else are_mergable = (shkp1 == shkp2 && bp1->price == bp2->price); return are_mergable; } /* * Figure out how much is owed to a given shopkeeper. * At present, we ignore any amount robbed from the shop, to avoid * turning the `$' command into a way to discover that the current * level is bones data which has a shk on the warpath. */ STATIC_OVL long shop_debt(eshkp) struct eshk *eshkp; { struct bill_x *bp; int ct; long debt = eshkp->debit; for (bp = eshkp->bill_p, ct = eshkp->billct; ct > 0; bp++, ct--) debt += bp->price * bp->bquan; return debt; } /* called in response to the `$' command */ void shopper_financial_report() { struct monst *shkp, *this_shkp = shop_keeper(inside_shop(u.ux, u.uy)); struct eshk *eshkp; long amt; int pass; if (this_shkp && !(ESHK(this_shkp)->credit || shop_debt(ESHK(this_shkp)))) { You("have no credit or debt in here."); this_shkp = 0; /* skip first pass */ } /* pass 0: report for the shop we're currently in, if any; pass 1: report for all other shops on this level. */ for (pass = this_shkp ? 0 : 1; pass <= 1; pass++) for (shkp = next_shkp(fmon, FALSE); shkp; shkp = next_shkp(shkp->nmon, FALSE)) { 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."); } } #endif /* OVL1 */ #ifdef OVLB int inhishop(mtmp) register struct monst *mtmp; { return(index(in_rooms(mtmp->mx, mtmp->my, SHOPBASE), ESHK(mtmp)->shoproom) && on_level(&(ESHK(mtmp)->shoplevel), &u.uz)); } struct monst * shop_keeper(rmno) register char rmno; { struct monst *shkp = rmno >= ROOMOFFSET ? rooms[rmno - ROOMOFFSET].resident : 0; if (shkp) { if (NOTANGRY(shkp)) { if (ESHK(shkp)->surcharge) pacify_shk(shkp); } else { if (!ESHK(shkp)->surcharge) rile_shk(shkp); } } return shkp; } boolean tended_shop(sroom) register struct mkroom *sroom; { register struct monst *mtmp = sroom->resident; if (!mtmp) return(FALSE); else return((boolean)(inhishop(mtmp))); } STATIC_OVL struct bill_x * onbill(obj, shkp, silent) register struct obj *obj; register struct monst *shkp; register boolean silent; { if (shkp) { register struct bill_x *bp = ESHK(shkp)->bill_p; register int ct = ESHK(shkp)->billct; while (--ct >= 0) if (bp->bo_id == obj->o_id) { if (!obj->unpaid) pline("onbill: paid obj on bill?"); return bp; } else bp++; } if(obj->unpaid & !silent) pline("onbill: unpaid obj not on bill?"); return (struct bill_x *)0; } /* Delete the contents of the given object. */ void delete_contents(obj) register struct obj *obj; { register struct obj *curr; while ((curr = obj->cobj) != 0) { if (Has_contents(curr)) delete_contents(curr); obj_extract_self(curr); if (evades_destruction(curr)) { switch (obj->where) { case OBJ_FREE: case OBJ_ONBILL: impossible("indestructible object %s", obj->where == OBJ_FREE ? "free" : "on bill"); obfree(curr, (struct obj *)0); break; case OBJ_FLOOR: place_object(curr, obj->ox, obj->oy); /* No indestructible objects currently stack */ break; case OBJ_CONTAINED: add_to_container(obj->ocontainer, curr); break; case OBJ_INVENT: if (!flooreffects(curr, u.ux, u.uy, "fall")) place_object(curr, u.ux, u.uy); break; case OBJ_MINVENT: if (!flooreffects(curr, obj->ocarry->mx, obj->ocarry->my, "fall")) place_object(curr, obj->ocarry->mx, obj->ocarry->my); break; case OBJ_MIGRATING: add_to_migration(curr); /* Copy migration destination */ curr->ox = obj->ox; curr->oy = obj->oy; curr->owornmask = obj->owornmask; break; case OBJ_BURIED: add_to_buried(curr); curr->ox = obj->ox; curr->oy = obj->oy; break; default: panic("delete_contents"); break; } } else obfree(curr, (struct obj *)0); } } /* called with two args on merge */ void obfree(obj, merge) register struct obj *obj, *merge; { register struct bill_x *bp; register struct bill_x *bpm; register struct monst *shkp; #ifdef STEED if (obj == usaddle) dismount_steed(DISMOUNT_GENERIC); #endif if (obj->otyp == LEASH && obj->leashmon) o_unleash(obj); if (obj->oclass == SPBOOK_CLASS) book_disappears(obj); if (obj->oclass == FOOD_CLASS) food_disappears(obj); /* [ALI] Enforce new rules: Containers must have their contents * deleted while still in situ so that we can place any * indestructible objects they may contain. */ if (Has_contents(obj)) { FILE *fp; int known; xchar x, y; struct obj *otmp; pline("BUG: obfree() called on non-empty container. See buglog for details."); fp = fopen_datafile("buglog", "a", TROUBLEPREFIX); if (fp) { (void) fprintf(fp, "%08ld: BUG: obfree() called on non-empty container.\n", yyyymmdd((time_t)0L)); known = objects[obj->otyp].oc_name_known; objects[obj->otyp].oc_name_known = 1; obj->known = obj->bknown = obj->dknown = obj->rknown = 1; (void) fprintf(fp, "Container: %s\n", doname(obj)); objects[obj->otyp].oc_name_known = known; (void) fprintf(fp, "ID: %d\n", obj->o_id); (void) fprintf(fp, "Contents of %s:\n", the(xname(obj))); for(otmp = obj->cobj; otmp; otmp = obj->nobj) { known = objects[otmp->otyp].oc_name_known; objects[otmp->otyp].oc_name_known = 1; otmp->known = otmp->bknown = otmp->dknown = otmp->rknown = 1; (void) fprintf(fp, "\t%s\n", doname(otmp)); objects[otmp->otyp].oc_name_known = known; } switch (obj->where) { case OBJ_FREE: (void) fprintf(fp, "Container is on free list.\n"); break; case OBJ_FLOOR: (void) fprintf(fp, "Container is on the floor at (%d, %d)\n", obj->ox, obj->oy); break; case OBJ_CONTAINED: otmp = obj->ocontainer; known = objects[otmp->otyp].oc_name_known; objects[otmp->otyp].oc_name_known = 1; otmp->known = otmp->bknown = otmp->dknown = otmp->rknown = 1; get_obj_location(otmp, &x, &y, BURIED_TOO | CONTAINED_TOO); (void) fprintf(fp, "Container is contained in %s at (%d, %d)\n", doname(otmp), x, y); objects[otmp->otyp].oc_name_known = known; break; case OBJ_INVENT: (void) fprintf(fp, "Container is in hero's inventory\n"); break; case OBJ_MINVENT: get_obj_location(otmp, &x, &y, 0); (void) fprintf(fp, "Container is in %s's inventory at (%d, %d)\n", s_suffix(noit_mon_nam(obj->ocarry)), x, y); break; case OBJ_MIGRATING: (void) fprintf(fp, "Container is migrating to level %d of %s\n", otmp->oy, dungeons[otmp->ox].dname); break; case OBJ_BURIED: (void) fprintf(fp, "Container is buried at (%d, %d)\n", obj->ox, obj->oy); break; case OBJ_ONBILL: (void) fprintf(fp, "Container is on shopping bill.\n"); break; default: (void) fprintf(fp, "Container is nowhere (%d).\n", obj->where); break; } (void) fprintf(fp, "\n"); fclose(fp); } } 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 */ if (!shkp) shkp = shop_keeper(*u.ushops); /* * Note: `shkp = shop_keeper(*u.ushops)' used to be * unconditional. But obfree() is used all over * the place, so making its behavior be dependent * upon player location doesn't make much sense. */ if ((bp = onbill(obj, shkp, FALSE)) != 0) { if(!merge){ bp->useup = 1; obj->unpaid = 0; /* only for doinvbill */ add_to_billobjs(obj); return; } bpm = onbill(merge, shkp, FALSE); if(!bpm){ /* this used to be a rename */ impossible("obfree: not on bill??"); return; } else { /* this was a merger */ bpm->bquan += bp->bquan; ESHK(shkp)->billct--; #ifdef DUMB { /* DRS/NS 2.2.6 messes up -- Peter Kendell */ int indx = ESHK(shkp)->billct; *bp = ESHK(shkp)->bill_p[indx]; } #else *bp = ESHK(shkp)->bill_p[ESHK(shkp)->billct]; #endif } } dealloc_obj(obj); } #endif /* OVLB */ #ifdef OVL3 STATIC_OVL long check_credit(tmp, shkp) long tmp; register struct monst *shkp; { long credit = ESHK(shkp)->credit; if(credit == 0L) return(tmp); if(credit >= tmp) { pline_The("price is deducted from your credit."); ESHK(shkp)->credit -=tmp; tmp = 0L; } else { pline_The("price is partially covered by your credit."); ESHK(shkp)->credit = 0L; tmp -= credit; } return(tmp); } STATIC_OVL void pay(tmp,shkp) long tmp; register struct monst *shkp; { 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; if(robbed < 0) robbed = 0L; ESHK(shkp)->robbed = robbed; } } #endif /*OVL3*/ #ifdef OVLB /* return shkp to home position */ void home_shk(shkp, killkops) register struct monst *shkp; register boolean killkops; { register xchar x = ESHK(shkp)->shk.x, y = ESHK(shkp)->shk.y; (void) mnearto(shkp, x, y, TRUE); level.flags.has_shop = 1; if (killkops) { #ifdef KOPS kops_gone(TRUE); #else You_feel("vaguely apprehensive."); #endif pacify_guards(); } after_shk_move(shkp); } STATIC_OVL boolean angry_shk_exists() { register struct monst *shkp; for (shkp = next_shkp(fmon, FALSE); shkp; shkp = next_shkp(shkp->nmon, FALSE)) if (ANGRY(shkp)) return(TRUE); return(FALSE); } /* remove previously applied surcharge from all billed items */ STATIC_OVL void pacify_shk(shkp) register struct monst *shkp; { NOTANGRY(shkp) = TRUE; /* make peaceful */ if (ESHK(shkp)->surcharge) { register struct bill_x *bp = ESHK(shkp)->bill_p; register int ct = ESHK(shkp)->billct; ESHK(shkp)->surcharge = FALSE; while (ct-- > 0) { register long reduction = (bp->price + 3L) / 4L; bp->price -= reduction; /* undo 33% increase */ bp++; } } } /* add aggravation surcharge to all billed items */ STATIC_OVL void rile_shk(shkp) register struct monst *shkp; { NOTANGRY(shkp) = FALSE; /* make angry */ if (!ESHK(shkp)->surcharge) { register struct bill_x *bp = ESHK(shkp)->bill_p; register int ct = ESHK(shkp)->billct; ESHK(shkp)->surcharge = TRUE; while (ct-- > 0) { register long surcharge = (bp->price + 2L) / 3L; bp->price += surcharge; bp++; } } } /* wakeup and/or unparalyze shopkeeper */ STATIC_OVL void rouse_shk(shkp, verbosely) struct monst *shkp; boolean verbosely; { if (!shkp->mcanmove || shkp->msleeping) { /* greed induced recovery... */ if (verbosely && canspotmon(shkp)) pline("%s %s.", Monnam(shkp), shkp->msleeping ? "wakes up" : "can move again"); shkp->msleeping = 0; shkp->mfrozen = 0; shkp->mcanmove = 1; } } void make_happy_shk(shkp, silentkops) register struct monst *shkp; register boolean silentkops; { boolean wasmad = ANGRY(shkp); struct eshk *eshkp = ESHK(shkp); boolean guilty = wasmad || eshkp->surcharge || eshkp->following || eshkp->robbed; pacify_shk(shkp); eshkp->following = 0; eshkp->robbed = 0L; if (guilty && !Role_if(PM_ROGUE)) { adjalign(sgn(u.ualign.type)); You("feel your guilt vanish."); } if(!inhishop(shkp)) { char shk_nam[BUFSZ]; boolean vanished = canseemon(shkp); Strcpy(shk_nam, mon_nam(shkp)); if (on_level(&eshkp->shoplevel, &u.uz)) { home_shk(shkp, FALSE); /* didn't disappear if shk can still be seen */ if (canseemon(shkp)) vanished = FALSE; } else { /* if sensed, does disappear regardless whether seen */ if (sensemon(shkp)) vanished = TRUE; /* can't act as porter for the Amulet, even if shk happens to be going farther down rather than up */ mdrop_special_objs(shkp); /* arrive near shop's door */ migrate_to_level(shkp, ledger_no(&eshkp->shoplevel), MIGR_APPROX_XY, &eshkp->shd); } if (vanished) pline("Satisfied, %s suddenly disappears!", shk_nam); } else if(wasmad) pline("%s calms down.", Monnam(shkp)); if(!angry_shk_exists()) { #ifdef KOPS kops_gone(silentkops); #endif pacify_guards(); } } void hot_pursuit(shkp) register struct monst *shkp; { if(!shkp->isshk) return; rile_shk(shkp); (void) strncpy(ESHK(shkp)->customer, plname, PL_NSIZ); ESHK(shkp)->following = 1; } /* used when the shkp is teleported or falls (ox == 0) out of his shop, * or when the player is not on a costly_spot and he * damages something inside the shop. these conditions * must be checked by the calling function. */ void make_angry_shk(shkp, ox, oy) register struct monst *shkp; register xchar ox,oy; { xchar sx, sy; struct eshk *eshkp = ESHK(shkp); /* all pending shop transactions are now "past due" */ if (eshkp->billct || eshkp->debit || eshkp->loan || eshkp->credit) { eshkp->robbed += (addupbill(shkp) + eshkp->debit + eshkp->loan); eshkp->robbed -= eshkp->credit; if (eshkp->robbed < 0L) eshkp->robbed = 0L; /* billct, debit, loan, and credit will be cleared by setpaid */ setpaid(shkp); } /* If you just used a wand of teleportation to send the shk away, you might not be able to see her any more. Monnam would yield "it", which makes this message look pretty silly, so temporarily restore her original location during the call to Monnam. */ sx = shkp->mx, sy = shkp->my; if (isok(ox, oy) && cansee(ox, oy) && !cansee(sx, sy)) shkp->mx = ox, shkp->my = oy; pline("%s %s!", Monnam(shkp), !ANGRY(shkp) ? "gets angry" : "is furious"); shkp->mx = sx, shkp->my = sy; hot_pursuit(shkp); } STATIC_VAR const char no_money[] = "Moreover, you%s have no money."; STATIC_VAR const char not_enough_money[] = "Besides, you don't have enough to interest %s."; #else STATIC_VAR const char no_money[]; STATIC_VAR const char not_enough_money[]; #endif /*OVLB*/ #ifdef OVL3 STATIC_OVL long cheapest_item(shkp) /* delivers the cheapest item on the list */ register struct monst *shkp; { register int ct = ESHK(shkp)->billct; register struct bill_x *bp = ESHK(shkp)->bill_p; register long gmin = (bp->price * bp->bquan); while(ct--){ if(bp->price * bp->bquan < gmin) gmin = bp->price * bp->bquan; bp++; } return(gmin); } #endif /*OVL3*/ #ifdef OVL0 int dopay() { register struct eshk *eshkp; 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; /* find how many shk's there are, how many are in */ /* sight, and are you in a shop room with one. */ nxtm = resident = 0; for (shkp = next_shkp(fmon, FALSE); shkp; shkp = next_shkp(shkp->nmon, FALSE)) { sk++; if (ANGRY(shkp) && distu(shkp->mx, shkp->my) <= 2) nxtm = shkp; if (canspotmon(shkp)) seensk++; if (inhishop(shkp) && (*u.ushops == ESHK(shkp)->shoproom)) resident = shkp; } if (nxtm) { /* Player should always appease an */ shkp = nxtm; /* irate shk standing next to them. */ goto proceed; } /* KMH -- Permit paying adjacent gypsies */ for (nxtm = fmon; nxtm; nxtm = nxtm->nmon) { if (!nxtm->isgyp || !nxtm->mpeaceful || distu(nxtm->mx, nxtm->my) > 2 || !canspotmon(nxtm)) continue; shkp = nxtm; sk++; seensk++; } if ((!sk && (!Blind || Blind_telepat)) || (!Blind && !seensk)) { There("appears to be no shopkeeper here to receive your payment."); return(0); } if(!seensk) { You_cant("see..."); return(0); } /* the usual case. allow paying at a distance when */ /* inside a tended shop. should we change that? */ if(sk == 1 && resident) { shkp = resident; goto proceed; } if (seensk == 1) { /* KMH -- Permit paying gypsies */ if (shkp && shkp->isgyp) { gypsy_chat(shkp); return (1); } for (shkp = next_shkp(fmon, FALSE); shkp; shkp = next_shkp(shkp->nmon, FALSE)) if (canspotmon(shkp)) break; if (shkp != resident && distu(shkp->mx, shkp->my) > 2) { pline("%s is not near enough to receive your payment.", Monnam(shkp)); return(0); } } else { struct monst *mtmp; coord cc; int cx, cy; pline("Pay whom?"); cc.x = u.ux; cc.y = u.uy; if (getpos(&cc, TRUE, "the creature you want to pay") < 0) return 0; /* player pressed ESC */ cx = cc.x; cy = cc.y; if(cx < 0) { pline("Try again..."); return(0); } if(u.ux == cx && u.uy == cy) { You("are generous to yourself."); return(0); } mtmp = m_at(cx, cy); if(!mtmp) { There("is no one there to receive your payment."); return(0); } /* KMH -- Permit paying gypsies */ if (mtmp->isgyp && mtmp->mpeaceful) { if (distu(mtmp->mx, mtmp->my) <= 2) { gypsy_chat(mtmp); return (1); } } else if(!mtmp->isshk) { pline("%s is not interested in your payment.", Monnam(mtmp)); return(0); } if (mtmp != resident && distu(mtmp->mx, mtmp->my) > 2) { pline("%s is too far to receive your payment.", Monnam(mtmp)); return(0); } shkp = mtmp; } if(!shkp) { #ifdef DEBUG pline("dopay: null shkp."); #endif return(0); } proceed: eshkp = ESHK(shkp); ltmp = eshkp->robbed; /* wake sleeping shk when someone who owes money offers payment */ if (ltmp || eshkp->billct || eshkp->debit) rouse_shk(shkp, TRUE); if (!shkp->mcanmove || shkp->msleeping) { /* still asleep/paralyzed */ pline("%s %s.", Monnam(shkp), rn2(2) ? "seems to be napping" : "doesn't respond"); return 0; } 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) #ifndef GOLDOBJ pline("But you have some gold stashed away."); #else pline("But you have some money stashed away."); #endif } 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 { #ifndef GOLDOBJ You("give %s all your%s gold.", mon_nam(shkp), #else You("give %s all your%s money.", mon_nam(shkp), #endif stashed_gold ? " openly kept" : ""); #ifndef GOLDOBJ pay(u.ugold, shkp); if (stashed_gold) pline("But you have hidden gold!"); #else pay(umoney, shkp); if (stashed_gold) pline("But you have hidden money!"); #endif } #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); } return(1); } /* 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" : ""); #ifdef OTHER_SERVICES /* else */ shk_other_services(); #endif } 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); else pline("But %s is as angry as ever.", mon_nam(shkp)); } return(1); } if(shkp != resident) { 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."); else Strcat(sbuf, "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) { pline("But you don't%s have enough gold%s.", #else if (umoney + eshkp->credit < dtmp) { pline("But you don't%s have enough money%s.", #endif stashed_gold ? " seem to" : "", eshkp->credit ? " or credit" : ""); return(1); } else { if (eshkp->credit >= dtmp) { eshkp->credit -= dtmp; eshkp->debit = 0L; 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."); flags.botl = 1; } 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."); You("pay the remainder."); flags.botl = 1; } paid = TRUE; } } /* 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) #ifndef GOLDOBJ pline("Maybe you have some gold stashed away?"); #else pline("Maybe you have some money stashed away?"); #endif return(0); } /* this isn't quite right; it itemizes without asking if the * single item on the bill is partly used up and partly unpaid */ itemize = (eshkp->billct > 1 ? yn("Itemized billing?") == 'y' : 1); for (pass = 0; pass <= 1; pass++) { tmp = 0; while (tmp < eshkp->billct) { struct obj *otmp; register struct bill_x *bp = &(eshkp->bill_p[tmp]); /* find the object on one of the lists */ if ((otmp = bp_to_obj(bp)) != 0) { /* if completely used up, object quantity is stale; restoring it to its original value here avoids making the partly-used-up code more complicated */ if (bp->useup) otmp->quan = bp->bquan; } else { impossible("Shopkeeper administration out of order."); setpaid(shkp); /* be nice to the player */ return 1; } if (pass == bp->useup && otmp->quan == bp->bquan) { /* pay for used-up items on first pass and others * on second, so player will be stuck in the store * less often; things which are partly used up * are processed on both passes */ tmp++; } else { switch (dopayobj(shkp, bp, &otmp, pass, itemize)) { case PAY_CANT: return 1; /*break*/ case PAY_BROKE: paid = TRUE; goto thanks; /*break*/ case PAY_SKIP: tmp++; continue; /*break*/ case PAY_SOME: paid = TRUE; if (itemize) bot(); continue; /*break*/ case PAY_BUY: paid = TRUE; break; } if (itemize) bot(); *bp = eshkp->bill_p[--eshkp->billct]; } } } thanks: if (!itemize) update_inventory(); /* Done in dopayobj() if itemize. */ } if(!ANGRY(shkp) && paid) verbalize("Thank you for shopping in %s %s!", s_suffix(shkname(shkp)), shtypes[eshkp->shoptype - SHOPBASE].name); return(1); } #ifdef OTHER_SERVICES /* ** FUNCTION shk_other_services ** ** Called when you don't owe any money. Called after all checks have been ** made (in shop, not angry shopkeeper, etc.) */ static void shk_other_services() { char *slang; /* What shk calls you */ struct monst *shkp; /* The shopkeeper */ /*WAC - Windowstuff*/ winid tmpwin; anything any; menu_item *selected; int n; /* Do you want to use other services */ if (yn("Do you wish to try our other services?") != 'y' ) return; /* Init your name */ if (!is_human(youmonst.data)) slang = "ugly"; else slang = (flags.female) ? "lady" : "buddy"; /* Init the shopkeeper */ shkp = shop_keeper(/* roomno= */*u.ushops); if (!ESHK(shkp)->services) return; /* ** Figure out what services he offers ** ** i = identify ** a = appraise weapon's worth ** u = uncurse ** w = weapon-works (including poison) ** p = poison weapon ** r = armor-works ** c = charge wands */ /*WAC - did this using the windowing system...*/ any.a_void = 0; /* zero out all bits */ tmpwin = create_nhwindow(NHW_MENU); start_menu(tmpwin); /* All shops can identify (some better than others) */ any.a_int = 1; if (ESHK(shkp)->services & (SHK_ID_BASIC|SHK_ID_PREMIUM)) add_menu(tmpwin, NO_GLYPH, &any , 'i', 0, ATR_NONE, "Identify", MENU_UNSELECTED); /* All shops can uncurse */ any.a_int = 2; if (ESHK(shkp)->services & (SHK_UNCURSE)) add_menu(tmpwin, NO_GLYPH, &any , 'u', 0, ATR_NONE, "Uncurse", MENU_UNSELECTED); /* Weapon appraisals. Weapon & general stores can do this. */ if ((ESHK(shkp)->services & (SHK_UNCURSE)) && (shk_class_match(WEAPON_CLASS, shkp))) { any.a_int = 3; add_menu(tmpwin, NO_GLYPH, &any , 'a', 0, ATR_NONE, "Appraise", MENU_UNSELECTED); } /* Weapon-works! Only a weapon store. */ if ((ESHK(shkp)->services & (SHK_SPECIAL_A|SHK_SPECIAL_B|SHK_SPECIAL_C)) && (shk_class_match(WEAPON_CLASS, shkp) == SHK_MATCH)) { any.a_int = 4; if (ESHK(shkp)->services & (SHK_SPECIAL_A|SHK_SPECIAL_B)) add_menu(tmpwin, NO_GLYPH, &any , 'w', 0, ATR_NONE, "Weapon-works", MENU_UNSELECTED); else add_menu(tmpwin, NO_GLYPH, &any , 'p', 0, ATR_NONE, "Poison", MENU_UNSELECTED); } /* Armor-works */ if ((ESHK(shkp)->services & (SHK_SPECIAL_A|SHK_SPECIAL_B)) && (shk_class_match(ARMOR_CLASS, shkp) == SHK_MATCH)) { any.a_int = 5; add_menu(tmpwin, NO_GLYPH, &any , 'r', 0, ATR_NONE, "Armor-works", MENU_UNSELECTED); } /* Charging: / ( = */ if ((ESHK(shkp)->services & (SHK_SPECIAL_A|SHK_SPECIAL_B)) && ((shk_class_match(WAND_CLASS, shkp) == SHK_MATCH) || (shk_class_match(TOOL_CLASS, shkp) == SHK_MATCH) || (shk_class_match(SPBOOK_CLASS, shkp) == SHK_MATCH) || (shk_class_match(RING_CLASS, shkp) == SHK_MATCH))) { any.a_int = 6; add_menu(tmpwin, NO_GLYPH, &any , 'c', 0, ATR_NONE, "Charge", MENU_UNSELECTED); } end_menu(tmpwin, "Services Available:"); n = select_menu(tmpwin, PICK_ONE, &selected); destroy_nhwindow(tmpwin); if (n > 0) switch (selected[0].item.a_int) { case 1: shk_identify(slang, shkp); break; case 2: shk_uncurse(slang, shkp); break; case 3: shk_appraisal(slang, shkp); break; case 4: shk_weapon_works(slang, shkp); break; case 5: shk_armor_works(slang, shkp); break; case 6: shk_charge(slang, shkp); break; default: pline ("Unknown Service"); break; } } #endif /* OTHER_SERVICES */ #endif /*OVL0*/ #ifdef OVL3 /* return 2 if used-up portion paid */ /* 1 if paid successfully */ /* 0 if not enough money */ /* -1 if skip this object */ /* -2 if no money/credit left */ STATIC_OVL int dopayobj(shkp, bp, obj_p, which, itemize) register struct monst *shkp; register struct bill_x *bp; struct obj **obj_p; int which; /* 0 => used-up item, 1 => other (unpaid or lost) */ boolean itemize; { 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); if(!obj->unpaid && !bp->useup){ 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; } /* we may need to temporarily adjust the object, if part of the original quantity has been used up but part remains unpaid */ save_quan = obj->quan; if (consumed) { /* either completely used up (simple), or split needed */ quan = bp->bquan; if (quan > obj->quan) /* difference is amount used up */ quan -= obj->quan; } else { /* dealing with ordinary unpaid item */ quan = obj->quan; } obj->quan = quan; /* to be used by doname() */ obj->unpaid = 0; /* ditto */ ltmp = bp->price * quan; buy = PAY_BUY; /* flag; if changed then return early */ 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 */ obj->quan = bp->bquan - save_quan; /* used up amount */ verbalize("%s for the other %s before buying %s.", ANGRY(shkp) ? "Pay" : "Please pay", xname(obj), save_quan > 1L ? "these" : "this one"); buy = PAY_SKIP; /* shk won't sell */ } } #ifndef GOLDOBJ if (buy == PAY_BUY && u.ugold + ESHK(shkp)->credit < ltmp) { You("don't%s have gold%s enough to pay for %s.", #else if (buy == PAY_BUY && umoney + ESHK(shkp)->credit < ltmp) { You("don't%s have money%s enough to pay for %s.", #endif stashed_gold ? " seem to" : "", (ESHK(shkp)->credit > 0L) ? " or credit" : "", doname(obj)); buy = itemize ? PAY_SKIP : PAY_CANT; } if (buy != PAY_BUY) { /* restore unpaid object to original state */ obj->quan = save_quan; obj->unpaid = 1; return buy; } pay(ltmp, shkp); shk_names_obj(shkp, obj, consumed ? "paid for %s at a cost of %ld gold piece%s.%s" : "bought %s for %ld gold piece%s.%s", ltmp, ""); obj->quan = save_quan; /* restore original count */ /* quan => amount just bought, save_quan => remaining unpaid count */ if (consumed) { if (quan != bp->bquan) { /* eliminate used-up portion; remainder is still unpaid */ bp->bquan = obj->quan; obj->unpaid = 1; bp->useup = 0; buy = PAY_SOME; } else { /* completely used-up, so get rid of it */ obj_extract_self(obj); /* assert( obj == *obj_p ); */ dealloc_obj(obj); *obj_p = 0; /* destroy pointer to freed object */ } } else if (itemize) update_inventory(); /* Done just once in dopay() if !itemize. */ return buy; } #endif /*OVL3*/ #ifdef OVLB static coord repo_location; /* repossession context */ /* routine called after dying (or quitting) */ boolean paybill(croaked) int croaked; /* -1: escaped dungeon; 0: quit; 1: died */ { register struct monst *mtmp, *mtmp2, *resident= (struct monst *)0; register boolean taken = FALSE; register int numsk = 0; /* if we escaped from the dungeon, shopkeepers can't reach us; shops don't occur on level 1, but this could happen if hero level teleports out of the dungeon and manages not to die */ if (croaked < 0) return FALSE; /* this is where inventory will end up if any shk takes it */ repo_location.x = repo_location.y = 0; /* give shopkeeper first crack */ if ((mtmp = shop_keeper(*u.ushops)) && inhishop(mtmp)) { numsk++; resident = mtmp; taken = inherits(resident, numsk, croaked); } for (mtmp = next_shkp(fmon, FALSE); mtmp; mtmp = next_shkp(mtmp2, FALSE)) { mtmp2 = mtmp->nmon; if (mtmp != resident) { /* for bones: we don't want a shopless shk around */ if(!on_level(&(ESHK(mtmp)->shoplevel), &u.uz)) mongone(mtmp); else { numsk++; taken |= inherits(mtmp, numsk, croaked); } } } if(numsk == 0) return(FALSE); return(taken); } STATIC_OVL boolean inherits(shkp, numsk, croaked) struct monst *shkp; int numsk; int 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. */ if (numsk > 1) { if (cansee(shkp->mx, shkp->my) && croaked) pline("%s %slooks at your corpse%s and %s.", Monnam(shkp), (!shkp->mcanmove || shkp->msleeping) ? "wakes up, " : "", !rn2(2) ? (shkp->female ? ", shakes her head," : ", shakes his head,") : "", !inhishop(shkp) ? "disappears" : "sighs"); rouse_shk(shkp, FALSE); /* wake shk for bones */ taken = (roomno == eshkp->shoproom); goto skip; } /* get one case out of the way: you die in the shop, the */ /* shopkeeper is peaceful, nothing stolen, nothing owed. */ if(roomno == eshkp->shoproom && inhishop(shkp) && !eshkp->billct && !eshkp->robbed && !eshkp->debit && NOTANGRY(shkp) && !eshkp->following) { if (invent) pline("%s gratefully inherits all your possessions.", shkname(shkp)); set_repo_loc(eshkp); goto clear; } if (eshkp->billct || eshkp->debit || eshkp->robbed) { if(roomno == eshkp->shoproom && inhishop(shkp)) loss = addupbill(shkp) + eshkp->debit; if (loss < eshkp->robbed) loss = eshkp->robbed; take = TRUE; } 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->mcanmove || shkp->msleeping) 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; if (umoney > 0) 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"); /* shopkeeper has now been paid in full */ pacify_shk(shkp); eshkp->following = 0; eshkp->robbed = 0L; } skip: /* in case we create bones */ rouse_shk(shkp, FALSE); /* wake up */ if(!inhishop(shkp)) home_shk(shkp, FALSE); } clear: setpaid(shkp); return(taken); } STATIC_OVL void set_repo_loc(eshkp) struct eshk *eshkp; { register xchar ox, oy; /* if you're not in this shk's shop room, or if you're in its doorway or entry spot, then your gear gets dumped all the way inside */ if (*u.ushops != eshkp->shoproom || IS_DOOR(levl[u.ux][u.uy].typ) || (u.ux == eshkp->shk.x && u.uy == eshkp->shk.y)) { /* shk.x,shk.y is the position immediately in * front of the door -- move in one more space */ ox = eshkp->shk.x; oy = eshkp->shk.y; ox += sgn(ox - eshkp->shd.x); oy += sgn(oy - eshkp->shd.y); } else { /* already inside this shk's shop */ ox = u.ux; oy = u.uy; } /* finish_paybill will deposit invent here */ repo_location.x = ox; repo_location.y = oy; } /* called at game exit, after inventory disclosure but before making bones */ void finish_paybill() { register struct obj *otmp; int ox = repo_location.x, oy = repo_location.y; #if 0 /* don't bother */ if (ox == 0 && oy == 0) impossible("finish_paybill: no location"); #endif /* normally done by savebones(), but that's too late in this case */ unleash_all(); /* transfer all of the character's inventory to the shop floor */ while ((otmp = invent) != 0) { otmp->owornmask = 0L; /* perhaps we should call setnotworn? */ otmp->lamplit = 0; /* avoid "goes out" msg from freeinv */ if (rn2(5)) curse(otmp); /* normal bones treatment for invent */ obj_extract_self(otmp); place_object(otmp, ox, oy); } } /* find obj on one of the lists */ STATIC_OVL struct obj * bp_to_obj(bp) register struct bill_x *bp; { register struct obj *obj; register unsigned int id = bp->bo_id; if(bp->useup) obj = o_on(id, billobjs); else obj = find_oid(id); return obj; } /* * Look for o_id on all lists but billobj. Return obj or NULL if not found. * Its OK for restore_timers() to call this function, there should not * be any timeouts on the billobjs chain. */ struct obj * find_oid(id) unsigned id; { struct obj *obj; struct monst *mon, *mmtmp[3]; int i; /* first check various obj lists directly */ if ((obj = o_on(id, invent)) != 0) return obj; if ((obj = o_on(id, fobj)) != 0) return obj; if ((obj = o_on(id, level.buriedobjlist)) != 0) return obj; if ((obj = o_on(id, migrating_objs)) != 0) return obj; /* not found yet; check inventory for members of various monst lists */ mmtmp[0] = fmon; mmtmp[1] = migrating_mons; mmtmp[2] = mydogs; /* for use during level changes */ for (i = 0; i < 3; i++) for (mon = mmtmp[i]; mon; mon = mon->nmon) if ((obj = o_on(id, mon->minvent)) != 0) return obj; /* not found at all */ return (struct obj *)0; } #endif /*OVLB*/ #ifdef OVL3 /* calculate the value that the shk will charge for [one of] an object */ STATIC_OVL long get_cost(obj, shkp) register struct obj *obj; register struct monst *shkp; /* if angry, impose a surcharge */ { register long tmp = getprice(obj, FALSE); if (!tmp) tmp = 5L; /* 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)) || ((uarmu && !uarmu->oinvis) && (!uarm || uarm->oinvis) && (!uarmc || uarmc->oinvis))) /* touristy shirt visible */ tmp += tmp / 3L; else #endif if (uarmh && !uarmh->oinvis && uarmh->otyp == DUNCE_CAP) tmp += tmp / 3L; if (ACURR(A_CHA) > 18) tmp /= 2L; else if (ACURR(A_CHA) > 17) tmp -= tmp / 3L; else if (ACURR(A_CHA) > 15) tmp -= tmp / 4L; else if (ACURR(A_CHA) < 6) tmp *= 2L; else if (ACURR(A_CHA) < 8) tmp += tmp / 2L; else if (ACURR(A_CHA) < 11) tmp += tmp / 3L; if (tmp <= 0L) tmp = 1L; else if (obj->oartifact) tmp *= 4L; /* character classes who are discriminated against... */ /* barbarians are gullible... */ if (Role_if(PM_BARBARIAN)) tmp *= 3L; /* rogues are untrustworthy... */ if (Role_if(PM_ROGUE)) tmp *= 2L; /* samurais are from out of town... */ if (Role_if(PM_SAMURAI)) tmp *= 2L; /* anger surcharge should match rile_shk's */ if (shkp && ESHK(shkp)->surcharge) tmp += (tmp + 2L) / 3L; #ifdef BLACKMARKET /* KMH, balance patch -- healthstone replaces rotting/health */ if (Is_blackmarket(&u.uz)) { if (obj->oclass==RING_CLASS || obj->oclass==AMULET_CLASS || obj->oclass==POTION_CLASS || obj->oclass==SCROLL_CLASS || obj->oclass==SPBOOK_CLASS || obj->oclass==WAND_CLASS || obj->otyp==LUCKSTONE || obj->otyp==LOADSTONE || obj->otyp==HEALTHSTONE || objects[obj->otyp].oc_magic) { tmp *= 50; } else { tmp *= 25; } } #endif /* BLACKMARKET */ return tmp; } #endif /*OVL3*/ #ifdef OVLB /* returns the price of a container's content. the price * of the "top" container is added in the calling functions. * 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; /* the price of contained objects */ for (otmp = obj->cobj; otmp; otmp = otmp->nobj) { if (otmp->oclass == COIN_CLASS) continue; /* the "top" container is evaluated by caller */ if (usell) { if (saleable(shkp, otmp) && !otmp->unpaid && otmp->oclass != BALL_CLASS && #if defined(UNPOLYPILE) !is_hazy(otmp) && #endif !(otmp->oclass == FOOD_CLASS && otmp->oeaten) && !(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); } long contained_gold(obj) register struct obj *obj; { register struct obj *otmp; register long value = 0L; /* accumulate contained gold */ for (otmp = obj->cobj; otmp; otmp = otmp->nobj) if (otmp->oclass == COIN_CLASS) value += otmp->quan; else if (Has_contents(otmp)) value += contained_gold(otmp); return(value); } STATIC_OVL void dropped_container(obj, shkp, sale) register struct obj *obj; register struct monst *shkp; register boolean sale; { register struct obj *otmp; /* the "top" container is treated in the calling fn */ for (otmp = obj->cobj; otmp; otmp = otmp->nobj) { if (otmp->oclass == COIN_CLASS) continue; if (!otmp->unpaid && !(sale && saleable(shkp, otmp))) otmp->no_charge = 1; if (Has_contents(otmp)) dropped_container(otmp, shkp, sale); } } void picked_container(obj) register struct obj *obj; { register struct obj *otmp; /* the "top" container is treated in the calling fn */ for (otmp = obj->cobj; otmp; otmp = otmp->nobj) { if (otmp->oclass == COIN_CLASS) continue; if (otmp->no_charge) otmp->no_charge = 0; if (Has_contents(otmp)) picked_container(otmp); } } #endif /*OVLB*/ #ifdef OVL3 /* calculate how much the shk will pay when buying [all of] an object */ STATIC_OVL long set_cost(obj, shkp) register struct obj *obj; register struct monst *shkp; { long tmp = getprice(obj, TRUE) * obj->quan; #ifdef TOURIST if ((Role_if(PM_TOURIST) && u.ulevel < (MAXULEV/2)) || ((uarmu && !uarmu->oinvis) && (!uarm || uarm->oinvis) && (!uarmc || uarmc->oinvis))) /* touristy shirt visible */ tmp /= 3L; else #endif if (uarmh && !uarmh->oinvis && uarmh->otyp == DUNCE_CAP) tmp /= 3L; else tmp /= 2L; /* 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) { /* different shop keepers give different prices */ if (objects[obj->otyp].oc_material == GEMSTONE || objects[obj->otyp].oc_material == GLASS) { tmp = (obj->otyp % (6 - shkp->m_id % 3)); tmp = (tmp + 3) * obj->quan; } } else if (tmp > 1L && !rn2(4)) tmp -= tmp / 4L; } return tmp; } #endif /*OVL3*/ #ifdef OVLB /* called from doinv(invent.c) for inventory of unpaid objects */ long unpaid_cost(unp_obj) register struct obj *unp_obj; /* known to be unpaid */ { register struct bill_x *bp = (struct bill_x *)0; register struct monst *shkp; for(shkp = next_shkp(fmon, TRUE); shkp; shkp = next_shkp(shkp->nmon, TRUE)) if ((bp = onbill(unp_obj, shkp, TRUE)) != 0) break; /* onbill() gave no message if unexpected problem occurred */ if(!bp) impossible("unpaid_cost: object wasn't on any bill!"); return bp ? unp_obj->quan * bp->price : 0L; } STATIC_OVL void add_one_tobill(obj, dummy) register struct obj *obj; register boolean dummy; { register struct monst *shkp; register struct bill_x *bp; register int bct; register char roomno = *u.ushops; if (!roomno) return; if (!(shkp = shop_keeper(roomno))) return; if (!inhishop(shkp)) return; if (onbill(obj, shkp, FALSE) || /* perhaps thrown away earlier */ (obj->oclass == FOOD_CLASS && obj->oeaten)) return; if (ESHK(shkp)->billct == BILLSZ) { You("got that for free!"); return; } /* To recognize objects the shopkeeper is not interested in. -dgk */ if (obj->no_charge) { obj->no_charge = 0; return; } bct = ESHK(shkp)->billct; bp = &(ESHK(shkp)->bill_p[bct]); bp->bo_id = obj->o_id; bp->bquan = obj->quan; if(dummy) { /* a dummy object must be inserted into */ bp->useup = 1; /* the billobjs chain here. crucial for */ add_to_billobjs(obj); /* eating floorfood in shop. see eat.c */ } else bp->useup = 0; bp->price = get_cost(obj, shkp); ESHK(shkp)->billct++; obj->unpaid = 1; } STATIC_OVL void add_to_billobjs(obj) struct obj *obj; { if (obj->where != OBJ_FREE) panic("add_to_billobjs: obj not free"); if (obj->timed) obj_stop_timers(obj); obj->nobj = billobjs; billobjs = obj; obj->where = OBJ_ONBILL; } /* recursive billing of objects within containers. */ STATIC_OVL void bill_box_content(obj, ininv, dummy, shkp) register struct obj *obj; register boolean ininv, dummy; register struct monst *shkp; { register struct obj *otmp; for (otmp = obj->cobj; otmp; otmp = otmp->nobj) { if (otmp->oclass == COIN_CLASS) continue; /* the "top" box is added in addtobill() */ if (!otmp->no_charge) add_one_tobill(otmp, dummy); if (Has_contents(otmp)) bill_box_content(otmp, ininv, dummy, shkp); } } /* shopkeeper tells you what you bought or sold, sometimes partly IDing it */ STATIC_OVL void shk_names_obj(shkp, obj, fmt, amt, arg) struct monst *shkp; struct obj *obj; const char *fmt; /* "%s %ld %s %s", doname(obj), amt, plur(amt), arg */ long amt; const char *arg; { char *obj_name, fmtbuf[BUFSZ]; boolean was_unknown = !obj->dknown; obj->dknown = TRUE; /* Use real name for ordinary weapons/armor, and spell-less * scrolls/books (that is, blank and mail), but only if the * object is within the shk's area of interest/expertise. */ if (!objects[obj->otyp].oc_magic && saleable(shkp, obj) && (obj->oclass == WEAPON_CLASS || obj->oclass == ARMOR_CLASS || obj->oclass == SCROLL_CLASS || obj->oclass == SPBOOK_CLASS || obj->otyp == MIRROR)) { was_unknown |= !objects[obj->otyp].oc_name_known; makeknown(obj->otyp); } obj_name = doname(obj); /* Use an alternate message when extra information is being provided */ if (was_unknown) { Sprintf(fmtbuf, "%%s; you %s", fmt); obj_name[0] = highc(obj_name[0]); pline(fmtbuf, obj_name, (obj->quan > 1) ? "them" : "it", amt, plur(amt), arg); } else { You(fmt, obj_name, amt, plur(amt), arg); } } void addtobill(obj, ininv, dummy, silent) register struct obj *obj; register boolean ininv, dummy, silent; { register struct monst *shkp; register char roomno = *u.ushops; long ltmp = 0L, cltmp = 0L, gltmp = 0L; register boolean container = Has_contents(obj); if(!*u.ushops) return; if(!(shkp = shop_keeper(roomno))) return; if(!inhishop(shkp)) return; if(/* perhaps we threw it away earlier */ onbill(obj, shkp, FALSE) || (obj->oclass == FOOD_CLASS && obj->oeaten) ) return; if(ESHK(shkp)->billct == BILLSZ) { You("got that for free!"); return; } if(obj->oclass == COIN_CLASS) { costly_gold(obj->ox, obj->oy, obj->quan); return; } if(!obj->no_charge) ltmp = get_cost(obj, shkp); if (obj->no_charge && !container) { obj->no_charge = 0; return; } if(container) { if(obj->cobj == (struct obj *)0) { if(obj->no_charge) { obj->no_charge = 0; return; } else { add_one_tobill(obj, dummy); goto speak; } } else { cltmp += contained_cost(obj, shkp, cltmp, FALSE, FALSE); gltmp += contained_gold(obj); } if(ltmp) add_one_tobill(obj, dummy); if(cltmp) bill_box_content(obj, ininv, dummy, shkp); picked_container(obj); /* reset contained obj->no_charge */ ltmp += cltmp; if(gltmp) { costly_gold(obj->ox, obj->oy, gltmp); if(!ltmp) return; } if(obj->no_charge) obj->no_charge = 0; } else /* i.e., !container */ add_one_tobill(obj, dummy); speak: if (shkp->mcanmove && !shkp->msleeping && !silent) { char buf[BUFSZ]; if(!ltmp) { pline("%s has no interest in %s.", Monnam(shkp), the(xname(obj))); return; } Strcpy(buf, "\"For you, "); if (ANGRY(shkp)) Strcat(buf, "scum "); else { static const char *honored[5] = { "good", "honored", "most gracious", "esteemed", "most renowned and sacred" }; Strcat(buf, honored[rn2(4) + u.uevent.udemigod]); if (!is_human(youmonst.data)) Strcat(buf, " creature"); else Strcat(buf, (flags.female) ? " lady" : " sir"); } if(ininv) { long quan = obj->quan; obj->quan = 1L; /* fool xname() into giving singular */ pline("%s; only %ld %s %s.\"", buf, ltmp, (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)); } } void splitbill(obj, otmp) register struct obj *obj, *otmp; { /* otmp has been split off from obj */ register struct bill_x *bp; register long tmp; register struct monst *shkp = shop_keeper(*u.ushops); if(!shkp || !inhishop(shkp)) { impossible("splitbill: no resident shopkeeper??"); return; } bp = onbill(obj, shkp, FALSE); if(!bp) { impossible("splitbill: not on bill?"); return; } if(bp->bquan < otmp->quan) { impossible("Negative quantity on bill??"); } if(bp->bquan == otmp->quan) { impossible("Zero quantity on bill??"); } bp->bquan -= otmp->quan; if(ESHK(shkp)->billct == BILLSZ) otmp->unpaid = 0; else { tmp = bp->price; bp = &(ESHK(shkp)->bill_p[ESHK(shkp)->billct]); bp->bo_id = otmp->o_id; bp->bquan = otmp->quan; bp->useup = 0; bp->price = tmp; ESHK(shkp)->billct++; } } STATIC_OVL void sub_one_frombill(obj, shkp) register struct obj *obj; register struct monst *shkp; { register struct bill_x *bp; if((bp = onbill(obj, shkp, FALSE)) != 0) { register struct obj *otmp; obj->unpaid = 0; if(bp->bquan > obj->quan){ otmp = newobj(0); *otmp = *obj; bp->bo_id = otmp->o_id = flags.ident++; otmp->where = OBJ_FREE; otmp->quan = (bp->bquan -= obj->quan); otmp->owt = 0; /* superfluous */ otmp->onamelth = 0; otmp->oxlth = 0; otmp->oattached = OATTACHED_NOTHING; bp->useup = 1; add_to_billobjs(otmp); return; } ESHK(shkp)->billct--; #ifdef DUMB { /* DRS/NS 2.2.6 messes up -- Peter Kendell */ int indx = ESHK(shkp)->billct; *bp = ESHK(shkp)->bill_p[indx]; } #else *bp = ESHK(shkp)->bill_p[ESHK(shkp)->billct]; #endif return; } else if (obj->unpaid) { impossible("sub_one_frombill: unpaid object not on bill"); obj->unpaid = 0; } } /* recursive check of unpaid objects within nested containers. */ void subfrombill(obj, shkp) register struct obj *obj; register struct monst *shkp; { register struct obj *otmp; sub_one_frombill(obj, shkp); if (Has_contents(obj)) for(otmp = obj->cobj; otmp; otmp = otmp->nobj) { if(otmp->oclass == COIN_CLASS) continue; if (Has_contents(otmp)) subfrombill(otmp, shkp); else sub_one_frombill(otmp, shkp); } } #endif /*OVLB*/ #ifdef OVL3 STATIC_OVL long stolen_container(obj, shkp, price, ininv, destruction) register struct obj *obj; register struct monst *shkp; long price; register boolean ininv, destruction; { register struct obj *otmp; if (!(destruction && evades_destruction(obj))) { if(ininv && obj->unpaid) price += get_cost(obj, shkp); else { if(!obj->no_charge) price += get_cost(obj, shkp); obj->no_charge = 0; } } /* the price of contained objects, if any */ for(otmp = obj->cobj; otmp; otmp = otmp->nobj) { if(otmp->oclass == COIN_CLASS) continue; if (!Has_contents(otmp)) { if (!(destruction && evades_destruction(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; } } } else price += stolen_container(otmp, shkp, price, ininv, destruction); } return(price); } #endif /*OVL3*/ #ifdef OVLB long stolen_value(obj, x, y, peaceful, silent, destruction) register struct obj *obj; register xchar x, y; register boolean peaceful, silent, destruction; { register long value = 0L, gvalue = 0L; register struct monst *shkp = shop_keeper(*in_rooms(x, y, SHOPBASE)); if (!shkp || !inhishop(shkp)) return (0L); if(obj->oclass == COIN_CLASS) { gvalue += obj->quan; } else if (Has_contents(obj)) { register boolean ininv = !!count_unpaid(obj->cobj); value += stolen_container(obj, shkp, value, ininv, destruction); if(!ininv) gvalue += contained_gold(obj); } else if (!obj->no_charge && saleable(shkp, obj) && !(destruction && evades_destruction(obj))) { value += get_cost(obj, shkp); } if(gvalue + value == 0L) return(0L); value += gvalue; if(peaceful) { boolean credit_use = !!ESHK(shkp)->credit; value = check_credit(value, shkp); /* 'peaceful' affects general treatment, but doesn't affect * the fact that other code expects that all charges after the * shopkeeper is angry are included in robbed, not debit */ if (ANGRY(shkp)) ESHK(shkp)->robbed += value; else ESHK(shkp)->debit += value; if(!silent) { const 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 == COIN_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 { ESHK(shkp)->robbed += value; if(!silent) { if(cansee(shkp->mx, shkp->my)) { Norep("%s booms: \"%s, you are a thief!\"", Monnam(shkp), plname); } else Norep("You hear a scream, \"Thief!\""); } hot_pursuit(shkp); (void) angry_guards(FALSE); } return(value); } /* 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 sellobj(obj, x, y) register struct obj *obj; xchar x, y; { register struct monst *shkp; register struct eshk *eshkp; long ltmp = 0L, cltmp = 0L, gltmp = 0L, offer; boolean saleitem, cgold = FALSE, container = Has_contents(obj); boolean isgold = (obj->oclass == COIN_CLASS); boolean only_partially_your_contents = FALSE; if(!(shkp = shop_keeper(*in_rooms(x, y, SHOPBASE))) || !inhishop(shkp)) return; if(!costly_spot(x, y)) return; if(!*u.ushops) return; if(obj->unpaid && !container && !isgold) { sub_one_frombill(obj, shkp); return; } 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); } saleitem = saleable(shkp, obj); if(!isgold && !obj->unpaid && saleitem) ltmp = set_cost(obj, shkp); 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))); if(container) { dropped_container(obj, shkp, FALSE); if(!obj->unpaid && !saleitem) obj->no_charge = 1; if(obj->unpaid || count_unpaid(obj->cobj)) subfrombill(obj, shkp); } else obj->no_charge = 1; if(!unpaid && (sell_how != SELL_DONTSELL)) pline("%s seems uninterested.", Monnam(shkp)); return; } /* you dropped something of your own - probably want to sell it */ rouse_shk(shkp, TRUE); /* wake up sleeping or paralyzed shk */ eshkp = ESHK(shkp); if (ANGRY(shkp)) { /* they become shop-objects, no pay */ pline("Thank you, scum!"); subfrombill(obj, shkp); return; } if(eshkp->robbed) { /* shkp is not angry? */ if(isgold) offer = obj->quan; else if(cgold) offer += cgold; if((eshkp->robbed -= offer < 0L)) eshkp->robbed = 0L; if(offer) verbalize( "Thank you for your contribution to restock this recently plundered shop."); subfrombill(obj, shkp); return; } if(isgold || cgold) { if(!cgold) gltmp = obj->quan; if(eshkp->debit >= gltmp) { if(eshkp->loan) { /* you carry shop's gold */ if(eshkp->loan >= gltmp) eshkp->loan -= gltmp; else eshkp->loan = 0L; } eshkp->debit -= gltmp; Your("debt is %spaid off.", eshkp->debit ? "partially " : ""); } else { long delta = gltmp - eshkp->debit; eshkp->credit += delta; if(eshkp->debit) { eshkp->debit = 0L; 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 { if(!isgold) { if (container) dropped_container(obj, shkp, FALSE); if (!obj->unpaid && !saleitem) obj->no_charge = 1; subfrombill(obj, shkp); } return; } } move_on: if((!saleitem && !(container && cltmp > 0L)) || eshkp->billct == BILLSZ || obj->oclass == BALL_CLASS || obj->oclass == CHAIN_CLASS || offer == 0L #if defined(UNPOLYPILE) || is_hazy(obj) #endif || (obj->oclass == FOOD_CLASS && obj->oeaten) || (Is_candle(obj) && obj->age < 20L * (long)objects[obj->otyp].oc_cost)) { pline("%s seems uninterested%s.", Monnam(shkp), cgold ? " in the rest" : ""); if (container) dropped_container(obj, shkp, FALSE); 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, (eshkp->credit > 0L) ? "additional " : ""); eshkp->credit += tmpcr; subfrombill(obj, shkp); } else { if (c == 'q') sell_response = 'n'; if (container) dropped_container(obj, shkp, FALSE); if (!obj->unpaid) obj->no_charge = 1; subfrombill(obj, shkp); } } 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)) { case 'q': sell_response = 'n'; case 'n': if (container) dropped_container(obj, shkp, FALSE); if (!obj->unpaid) obj->no_charge = 1; subfrombill(obj, shkp); break; case 'a': sell_response = 'y'; case 'y': if (container) dropped_container(obj, shkp, TRUE); 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, ""); break; default: impossible("invalid sell response"); } } } int doinvbill(mode) int mode; /* 0: deliver count 1: paged */ { #ifdef __SASC void sasc_bug(struct obj *, unsigned); #endif struct monst *shkp; struct eshk *eshkp; struct bill_x *bp, *end_bp; struct obj *obj; long totused; char *buf_p; winid datawin; shkp = shop_keeper(*u.ushops); if (!shkp || !inhishop(shkp)) { if (mode != 0) impossible("doinvbill: no shopkeeper?"); return 0; } eshkp = ESHK(shkp); if (mode == 0) { /* count expended items, so that the `I' command can decide whether to include 'x' in its prompt string */ int cnt = !eshkp->debit ? 0 : 1; for (bp = eshkp->bill_p, end_bp = &eshkp->bill_p[eshkp->billct]; bp < end_bp; bp++) if (bp->useup || ((obj = bp_to_obj(bp)) != 0 && obj->quan < bp->bquan)) cnt++; return cnt; } datawin = create_nhwindow(NHW_MENU); putstr(datawin, 0, "Unpaid articles already used up:"); putstr(datawin, 0, ""); totused = 0L; for (bp = eshkp->bill_p, end_bp = &eshkp->bill_p[eshkp->billct]; bp < end_bp; bp++) { obj = bp_to_obj(bp); if(!obj) { impossible("Bad shopkeeper administration."); goto quit; } if(bp->useup || bp->bquan > obj->quan) { long oquan, uquan, thisused; unsigned save_unpaid; save_unpaid = obj->unpaid; oquan = obj->quan; 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); #else obj->unpaid = save_unpaid; #endif putstr(datawin, 0, buf_p); } } if (eshkp->debit) { /* additional shop debt which has no itemization available */ if (totused) putstr(datawin, 0, ""); 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); quit: destroy_nhwindow(datawin); return(0); } #define HUNGRY 2 STATIC_OVL long getprice(obj, shk_buying) register struct obj *obj; boolean shk_buying; { 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 */ if (u.uhs >= HUNGRY && !shk_buying) tmp *= (long) u.uhs; if (obj->oeaten) tmp = 0L; break; case WAND_CLASS: if (obj->spe == -1) tmp = 0L; break; case POTION_CLASS: if (obj->otyp == POT_WATER && !obj->blessed && !obj->cursed) tmp = 0L; break; case ARMOR_CLASS: case WEAPON_CLASS: if (obj->spe > 0) tmp += 10L * (long) obj->spe; #ifdef FIREARMS /* Don't buy activated explosives! */ if (is_grenade(obj) && obj->oarmed) tmp = 0L; #endif break; case TOOL_CLASS: if (Is_candle(obj) && obj->age < 20L * (long)objects[obj->otyp].oc_cost) tmp /= 2L; else if (obj->otyp == TORCH) { if (obj->age == 0) { tmp = 0L; } else if (obj->age < 25) { tmp /= 4L; } else if (obj->age < 50) { tmp /= 2L; } } break; } return tmp; } /* shk catches thrown pick-axe */ struct monst * shkcatch(obj, x, y) register struct obj *obj; register xchar x, y; { register struct monst *shkp; if (!(shkp = shop_keeper(inside_shop(x, y))) || !inhishop(shkp)) return(0); if (shkp->mcanmove && !shkp->msleeping && (*u.ushops != ESHK(shkp)->shoproom || !inside_shop(u.ux, u.uy)) && dist2(shkp->mx, shkp->my, x, y) < 3 && /* if it is the shk's pos, you hit and anger him */ (shkp->mx != x || shkp->my != y)) { 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(); mark_synch(); } subfrombill(obj, shkp); (void) mpickobj(shkp, obj); return shkp; } return (struct monst *)0; } void add_damage(x, y, cost) register xchar x, y; long cost; { struct damage *tmp_dam; char *shops; if (IS_DOOR(levl[x][y].typ)) { struct monst *mtmp; /* Don't schedule for repair unless it's a real shop entrance */ for (shops = in_rooms(x, y, SHOPBASE); *shops; shops++) if ((mtmp = shop_keeper(*shops)) != 0 && x == ESHK(mtmp)->shd.x && y == ESHK(mtmp)->shd.y) break; if (!*shops) return; } for (tmp_dam = level.damagelist; tmp_dam; tmp_dam = tmp_dam->next) if (tmp_dam->place.x == x && tmp_dam->place.y == y) { tmp_dam->cost += cost; return; } tmp_dam = (struct damage *)alloc((unsigned)sizeof(struct damage)); tmp_dam->when = monstermoves; tmp_dam->place.x = x; tmp_dam->place.y = y; tmp_dam->cost = cost; tmp_dam->typ = levl[x][y].typ; tmp_dam->next = level.damagelist; level.damagelist = tmp_dam; /* If player saw damage, display as a wall forever */ if (cansee(x, y)) levl[x][y].seenv = SVALL; } #endif /*OVLB*/ #ifdef OVL0 /* * Do something about damage. Either (!croaked) try to repair it, or * (croaked) just discard damage structs for non-shared locations, since * they'll never get repaired. Assume that shared locations will get * repaired eventually by the other shopkeeper(s). This might be an erroneous * assumption (they might all be dead too), but we have no reasonable way of * telling that. */ STATIC_OVL void remove_damage(shkp, croaked) register struct monst *shkp; register boolean croaked; { register struct damage *tmp_dam, *tmp2_dam; register boolean did_repair = FALSE, saw_door = FALSE; register boolean saw_floor = FALSE, stop_picking = FALSE; register boolean saw_untrap = FALSE; uchar saw_walls = 0; tmp_dam = level.damagelist; tmp2_dam = 0; while (tmp_dam) { register xchar x = tmp_dam->place.x, y = tmp_dam->place.y; char shops[5]; int disposition; disposition = 0; Strcpy(shops, in_rooms(x, y, SHOPBASE)); if (index(shops, ESHK(shkp)->shoproom)) { if (croaked) disposition = (shops[1])? 0 : 1; else if (stop_picking) disposition = repair_damage(shkp, tmp_dam, FALSE); else { /* Defer the stop_occupation() until after repair msgs */ if (closed_door(x, y)) stop_picking = picking_at(x, y); disposition = repair_damage(shkp, tmp_dam, FALSE); if (!disposition) stop_picking = FALSE; } } if (!disposition) { tmp2_dam = tmp_dam; tmp_dam = tmp_dam->next; continue; } if (disposition > 1) { did_repair = TRUE; if (cansee(x, y)) { if (IS_WALL(levl[x][y].typ)) saw_walls++; else if (IS_DOOR(levl[x][y].typ)) saw_door = TRUE; else if (disposition == 3) /* untrapped */ saw_untrap = TRUE; else saw_floor = TRUE; } } tmp_dam = tmp_dam->next; if (!tmp2_dam) { free((genericptr_t)level.damagelist); level.damagelist = tmp_dam; } else { free((genericptr_t)tmp2_dam->next); tmp2_dam->next = tmp_dam; } } if (!did_repair) return; if (saw_walls) { pline("Suddenly, %s section%s of wall close%s up!", (saw_walls == 1) ? "a" : (saw_walls <= 3) ? "some" : "several", (saw_walls == 1) ? "" : "s", (saw_walls == 1) ? "s" : ""); if (saw_door) pline_The("shop door reappears!"); if (saw_floor) pline_The("floor is repaired!"); } else { if (saw_door) pline("Suddenly, the shop door reappears!"); else if (saw_floor) pline("Suddenly, the floor damage is gone!"); else if (saw_untrap) pline("Suddenly, the trap is removed from the floor!"); else if (inside_shop(u.ux, u.uy) == ESHK(shkp)->shoproom) You_feel("more claustrophobic than before."); else if (flags.soundok && !rn2(10)) Norep("The dungeon acoustics noticeably change."); } if (stop_picking) stop_occupation(); } /* * 0: repair postponed, 1: silent repair (no messages), 2: normal repair * 3: untrap */ int repair_damage(shkp, tmp_dam, catchup) register struct monst *shkp; register struct damage *tmp_dam; boolean catchup; /* restoring a level */ { register xchar x, y, i; xchar litter[9]; register struct monst *mtmp; register struct obj *otmp; register struct trap *ttmp; if ((monstermoves - tmp_dam->when) < REPAIR_DELAY) return(0); if (shkp->msleeping || !shkp->mcanmove || ESHK(shkp)->following) return(0); x = tmp_dam->place.x; y = tmp_dam->place.y; if (!IS_ROOM(tmp_dam->typ)) { if (x == u.ux && y == u.uy) if (!Passes_walls) return(0); if (x == shkp->mx && y == shkp->my) return(0); if ((mtmp = m_at(x, y)) && (!passes_walls(mtmp->data))) return(0); } if ((ttmp = t_at(x, y)) != 0) { if (x == u.ux && y == u.uy) if (!Passes_walls) return(0); if (ttmp->ttyp == LANDMINE || ttmp->ttyp == BEAR_TRAP) { /* convert to an object */ otmp = mksobj((ttmp->ttyp == LANDMINE) ? LAND_MINE : BEARTRAP, TRUE, FALSE); otmp->quan= 1; otmp->owt = weight(otmp); (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); levl[x][y].typ = tmp_dam->typ; (void) memset((genericptr_t)litter, 0, sizeof(litter)); if ((otmp = level.objects[x][y]) != 0) { /* Scatter objects haphazardly into the shop */ #define NEED_UPDATE 1 #define OPEN 2 #define INSHOP 4 #define horiz(i) ((i%3)-1) #define vert(i) ((i/3)-1) for (i = 0; i < 9; i++) { if ((i == 4) || (!ZAP_POS(levl[x+horiz(i)][y+vert(i)].typ))) continue; litter[i] = OPEN; if (inside_shop(x+horiz(i), y+vert(i)) == ESHK(shkp)->shoproom) litter[i] |= INSHOP; } if (Punished && !u.uswallow && ((uchain->ox == x && uchain->oy == y) || (uball->ox == x && uball->oy == y))) { /* * Either the ball or chain is in the repair location. * * Take the easy way out and put ball&chain under hero. */ verbalize("Get your junk out of my wall!"); unplacebc(); /* pick 'em up */ placebc(); /* put 'em down */ } while ((otmp = level.objects[x][y]) != 0) /* Don't mess w/ boulders -- just merge into wall */ if ((otmp->otyp == BOULDER) || (otmp->otyp == ROCK)) { obj_extract_self(otmp); obfree(otmp, (struct obj *)0); } else { while (!(litter[i = rn2(9)] & INSHOP)); remove_object(otmp); place_object(otmp, x+horiz(i), y+vert(i)); litter[i] |= NEED_UPDATE; } } if (catchup) return 1; /* repair occurred while off level */ block_point(x, y); if(IS_DOOR(tmp_dam->typ)) { levl[x][y].doormask = D_CLOSED; /* arbitrary */ newsym(x, y); } else { /* don't set doormask - it is (hopefully) the same as it was */ /* if not, perhaps save it with the damage array... */ if (IS_WALL(tmp_dam->typ) && cansee(x, y)) { /* Player sees actual repair process, so they KNOW it's a wall */ levl[x][y].seenv = SVALL; newsym(x, y); } /* Mark this wall as "repaired". There currently is no code */ /* to do anything about repaired walls, so don't do it. */ } for (i = 0; i < 9; i++) if (litter[i] & NEED_UPDATE) newsym(x+horiz(i), y+vert(i)); return(2); #undef NEED_UPDATE #undef OPEN #undef INSHOP #undef vert #undef horiz } #endif /*OVL0*/ #ifdef OVL3 /* * shk_move: return 1: moved 0: didn't -1: let m_move do it -2: died */ int shk_move(shkp) register struct monst *shkp; { register xchar gx,gy,omx,omy; register int udist; register schar appr; register struct eshk *eshkp = ESHK(shkp); int z; boolean uondoor = FALSE, satdoor, avoid = FALSE, badinv; omx = shkp->mx; omy = shkp->my; if (inhishop(shkp)) remove_damage(shkp, FALSE); if((udist = distu(omx,omy)) < 3 && (shkp->data != &mons[PM_GRID_BUG] || (omx==u.ux || omy==u.uy))) { if(ANGRY(shkp) || (Conflict && !resist(shkp, RING_CLASS, 0, 0))) { if(Displaced) Your("displaced image doesn't fool %s!", mon_nam(shkp)); (void) mattacku(shkp); return(0); } if(eshkp->following) { if(strncmp(eshkp->customer, plname, PL_NSIZ)) { verbalize("%s, %s! I was looking for %s.", Hello(shkp), plname, eshkp->customer); eshkp->following = 0; return(0); } if(moves > followmsg+4) { verbalize("%s, %s! Didn't you forget to pay?", Hello(shkp), plname); followmsg = moves; if (!rn2(9)) { pline("%s doesn't like customers who don't pay.", Monnam(shkp)); rile_shk(shkp); } } if(udist < 2) return(0); } } appr = 1; gx = eshkp->shk.x; 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 && !eshkp->billct) return(-1); /* leave it to m_move */ gx = u.ux; gy = u.uy; } else if(ANGRY(shkp)) { /* Move towards the hero if the shopkeeper can see him. */ if(shkp->mcansee && m_canseeu(shkp)) { gx = u.ux; gy = u.uy; } avoid = FALSE; } else { #define GDIST(x,y) (dist2(x,y,gx,gy)) #ifdef BLACKMARKET if ((Is_blackmarket(&u.uz) && u.umonnum>0 && mons[u.umonnum].mlet != S_HUMAN) || /* WAC Let you out if you're stuck inside */ (!Is_blackmarket(&u.uz) && (Invis #ifdef STEED || u.usteed #endif ) && !inside_shop(u.ux, u.uy))) #else /* BLACKMARKET */ if(Invis #ifdef STEED || u.usteed #endif ) #endif /* BLACKMARKET */ { avoid = FALSE; } else { uondoor = (u.ux == eshkp->shd.x && u.uy == eshkp->shd.y); if(uondoor) { badinv = (carrying(PICK_AXE) || carrying(DWARVISH_MATTOCK) || (Fast && (sobj_at(PICK_AXE, u.ux, u.uy) || sobj_at(DWARVISH_MATTOCK, u.ux, u.uy)))); if(satdoor && badinv) return(0); avoid = !badinv; } else { avoid = (*u.ushops && distu(gx,gy) > 8); badinv = FALSE; } if(((!eshkp->robbed && !eshkp->billct && !eshkp->debit) || avoid) && GDIST(omx,omy) < 3) { if (!badinv && !onlineu(omx,omy)) return(0); if(satdoor) appr = gx = gy = 0; } } } z = move_special(shkp,inhishop(shkp),appr,uondoor,avoid,omx,omy,gx,gy); if (z > 0) after_shk_move(shkp); return z; } /* called after shopkeeper moves, in case the move causes re-entry into shop */ void after_shk_move(shkp) struct monst *shkp; { struct eshk *eshkp = ESHK(shkp); if (eshkp->bill_p == (struct bill_x *) -1000 && inhishop(shkp)) { /* reset bill_p, need to re-calc player's occupancy too */ eshkp->bill_p = &eshkp->bill[0]; check_special_room(FALSE); } } #endif /*OVL3*/ #ifdef OVLB /* for use in levl_follower (mondata.c) */ boolean is_fshk(mtmp) register struct monst *mtmp; { return((boolean)(mtmp->isshk && ESHK(mtmp)->following)); } /* You are digging in the shop. */ void shopdig(fall) register int fall; { register struct monst *shkp = shop_keeper(*u.ushops); int lang; const char *grabs = "grabs"; if(!shkp) return; /* 0 == can't speak, 1 == makes animal noises, 2 == speaks */ lang = 0; if (shkp->msleeping || !shkp->mcanmove || is_silent(shkp->data)) ; /* lang stays 0 */ else if (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."); adjalign(-sgn(u.ualign.type)); } /* WAC He may not be here now, but... */ make_angry_shk(shkp, 0, 0); /* No spot in particular*/ return; } 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)); } } else if(!um_dist(shkp->mx, shkp->my, 5) && !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; if (obj == current_wand) continue; setnotworn(obj); freeinv(obj); subfrombill(obj, shkp); (void) add_to_minv(shkp, obj); /* may free obj */ } } else /* WAC He may not be here now, but... */ rile_shk(shkp); } #ifdef KOPS /* modified by M. Campostrini (campo@sunthpi3.difi.unipi.it) */ /* to allow for multiple choices of kops */ STATIC_OVL void makekops(mm) coord *mm; { int kop_cnt[5]; int kop_pm[5]; int ik, cnt; coord *mc; kop_pm[0] = PM_KEYSTONE_KOP; kop_pm[1] = PM_KOP_SERGEANT; kop_pm[2] = PM_KOP_LIEUTENANT; kop_pm[3] = PM_KOP_KAPTAIN; kop_pm[4] = 0; cnt = abs(depth(&u.uz)) + rnd(5); #ifdef BLACKMARKET if (Is_blackmarket(&u.uz)) { kop_pm[0] = PM_SOLDIER; kop_pm[1] = PM_SERGEANT; kop_pm[2] = PM_LIEUTENANT; kop_pm[3] = PM_CAPTAIN; kop_pm[4] = 0; cnt = 7 + rnd(10); } #endif /* BLACKMARKET */ kop_cnt[0] = cnt; kop_cnt[1] = (cnt / 3) + 1; /* at least one sarge */ kop_cnt[2] = (cnt / 6); /* maybe a lieutenant */ kop_cnt[3] = (cnt / 9); /* and maybe a kaptain */ mc = (coord *)alloc(cnt * sizeof(coord)); for (ik=0; kop_pm[ik]; ik++) { if (!(mvitals[kop_pm[ik]].mvflags & G_GONE)) { cnt = epathto(mc, kop_cnt[ik], mm->x, mm->y, &mons[kop_pm[ik]]); while(--cnt >= 0) (void) makemon(&mons[kop_pm[ik]], mc[cnt].x, mc[cnt].y, NO_MM_FLAGS); } } free((genericptr_t)mc); } #endif /* KOPS */ void pay_for_damage(dmgstr, cant_mollify) const char *dmgstr; boolean cant_mollify; { register struct monst *shkp = (struct monst *)0; char shops_affected[5]; register boolean uinshp = (*u.ushops != '\0'); char qbuf[80]; register xchar x, y; boolean dugwall = !strcmp(dmgstr, "dig into") || /* wand */ !strcmp(dmgstr, "damage"); /* pick-axe */ struct damage *tmp_dam, *appear_here = 0; /* any number >= (80*80)+(24*24) would do, actually */ long cost_of_damage = 0L; unsigned int nearest_shk = 7000, nearest_damage = 7000; int picks = 0; for (tmp_dam = level.damagelist; (tmp_dam && (tmp_dam->when == monstermoves)); tmp_dam = tmp_dam->next) { char *shp; if (!tmp_dam->cost) continue; cost_of_damage += tmp_dam->cost; Strcpy(shops_affected, in_rooms(tmp_dam->place.x, tmp_dam->place.y, SHOPBASE)); for (shp = shops_affected; *shp; shp++) { struct monst *tmp_shk; unsigned int shk_distance; if (!(tmp_shk = shop_keeper(*shp))) continue; if (tmp_shk == shkp) { unsigned int damage_distance = distu(tmp_dam->place.x, tmp_dam->place.y); if (damage_distance < nearest_damage) { nearest_damage = damage_distance; appear_here = tmp_dam; } continue; } if (!inhishop(tmp_shk)) continue; shk_distance = distu(tmp_shk->mx, tmp_shk->my); if (shk_distance > nearest_shk) continue; if ((shk_distance == nearest_shk) && picks) { if (rn2(++picks)) continue; } else picks = 1; shkp = tmp_shk; nearest_shk = shk_distance; appear_here = tmp_dam; nearest_damage = distu(tmp_dam->place.x, tmp_dam->place.y); } } if (!cost_of_damage || !shkp) return; x = appear_here->place.x; y = appear_here->place.y; /* not the best introduction to the shk... */ (void) strncpy(ESHK(shkp)->customer,plname,PL_NSIZ); /* if the shk is already on the war path, be sure it's all out */ if(ANGRY(shkp) || ESHK(shkp)->following) { hot_pursuit(shkp); return; } /* if the shk is not in their shop.. */ if(!*in_rooms(shkp->mx,shkp->my,SHOPBASE)) { if(!cansee(shkp->mx, shkp->my)) return; goto getcad; } if(uinshp) { if(um_dist(shkp->mx, shkp->my, 1) && !um_dist(shkp->mx, shkp->my, 3)) { pline("%s leaps towards you!", shkname(shkp)); mnexto(shkp); } if(um_dist(shkp->mx, shkp->my, 1)) goto getcad; } else { /* * Make shkp show up at the door. Effect: If there is a monster * in the doorway, have the hero hear the shopkeeper yell a bit, * pause, then have the shopkeeper appear at the door, having * yanked the hapless critter out of the way. */ if (MON_AT(x, y)) { if(flags.soundok) { You_hear("an angry voice:"); verbalize("Out of my way, scum!"); wait_synch(); #if defined(UNIX) || defined(VMS) # if defined(SYSV) || defined(ULTRIX) || defined(VMS) (void) # endif sleep(1); #endif } } (void) mnearto(shkp, x, y, TRUE); } if((um_dist(x, y, 1) && !uinshp) || cant_mollify || #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)); verbalize("Who dared %s my %s?", dmgstr, dugwall ? "shop" : "door"); } else { getcad: verbalize("How dare you %s my %s?", dmgstr, dugwall ? "shop" : "door"); } hot_pursuit(shkp); 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)); /* move shk back to his home loc */ home_shk(shkp, FALSE); pacify_shk(shkp); } else { verbalize("Oh, yes! You'll pay!"); hot_pursuit(shkp); adjalign(-sgn(u.ualign.type)); } } #endif /*OVLB*/ #ifdef OVL0 /* called in dokick.c when we kick an object that might be in a store */ boolean costly_spot(x, y) register xchar x, y; { register struct monst *shkp; if (!level.flags.has_shop) return FALSE; shkp = shop_keeper(*in_rooms(x, y, SHOPBASE)); if(!shkp || !inhishop(shkp)) return(FALSE); return((boolean)(inside_shop(x, y) && !(x == ESHK(shkp)->shk.x && y == ESHK(shkp)->shk.y))); } #endif /*OVL0*/ #ifdef OVLB /* called by dotalk(sounds.c) when #chatting; returns obj if location contains shop goods and shopkeeper is willing & able to speak */ struct obj * shop_object(x, y) register xchar x, y; { register struct obj *otmp; register struct monst *shkp; if(!(shkp = shop_keeper(*in_rooms(x, y, SHOPBASE))) || !inhishop(shkp)) return(struct obj *)0; for (otmp = level.objects[x][y]; otmp; otmp = otmp->nexthere) if (otmp->oclass != COIN_CLASS) break; /* note: otmp might have ->no_charge set, but that's ok */ return (otmp && costly_spot(x, y) && NOTANGRY(shkp) && shkp->mcanmove && !shkp->msleeping) ? otmp : (struct obj *)0; } /* give price quotes for all objects linked to this one (ie, on this spot) */ void price_quote(first_obj) register struct obj *first_obj; { register struct obj *otmp; char buf[BUFSZ], price[40]; long cost; int cnt = 0; winid tmpwin; struct monst *shkp = shop_keeper(inside_shop(u.ux, u.uy)); tmpwin = create_nhwindow(NHW_MENU); putstr(tmpwin, 0, "Fine goods for sale:"); putstr(tmpwin, 0, ""); for (otmp = first_obj; otmp; otmp = otmp->nexthere) { if (otmp->oclass == COIN_CLASS) continue; 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); putstr(tmpwin, 0, buf), cnt++; } if (cnt > 1) { display_nhwindow(tmpwin, TRUE); } else if (cnt == 1) { if (first_obj->no_charge || first_obj == uball || first_obj == uchain){ pline("%s!", buf); /* buf still contains the string */ } else { /* 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)); } } destroy_nhwindow(tmpwin); } #endif /*OVLB*/ #ifdef OVL3 STATIC_OVL const char * shk_embellish(itm, cost) register struct obj *itm; long cost; { if (!rn2(3)) { register int o, choice = rn2(5); if (choice == 0) choice = (cost < 100L ? 1 : cost < 500L ? 2 : 3); switch (choice) { case 4: if (cost < 10L) break; else o = itm->oclass; if (o == FOOD_CLASS) return ", gourmets' delight!"; if (objects[itm->otyp].oc_name_known ? objects[itm->otyp].oc_magic : (o == AMULET_CLASS || o == RING_CLASS || o == WAND_CLASS || o == POTION_CLASS || o == SCROLL_CLASS || o == SPBOOK_CLASS)) return ", painstakingly developed!"; return ", superb craftsmanship!"; case 3: return ", finest quality."; case 2: return ", an excellent choice."; case 1: return ", a real bargain."; default: break; } } else if (itm->oartifact) { return ", one of a kind!"; } return "."; } #endif /*OVL3*/ #ifdef OVLB /* First 4 supplied by Ronen and Tamar, remainder by development team */ const char *Izchak_speaks[]={ "%s says: 'These shopping malls give me a headache.'", "%s says: 'Slow down. Think clearly.'", "%s says: 'You need to take things one at a time.'", "%s says: 'I don't like poofy coffee... give me Columbian Supremo.'", "%s says that getting the devteam's agreement on anything is difficult.", "%s says that he has noticed those who serve their deity will prosper.", "%s says: 'Don't try to steal from me - I have friends in high places!'", "%s says: 'You may well need something from this shop in the future.'", "%s comments about the Valley of the Dead as being a gateway." }; 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)) { verbalize("%s %s! I was looking for %s.", 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)); else pline("%s talks about the problem of shoplifters.",shkname(shkp)); } #ifdef KOPS STATIC_OVL void kops_gone(silent) register boolean silent; { register int cnt = 0; register struct monst *mtmp, *mtmp2; for (mtmp = fmon; mtmp; mtmp = mtmp2) { mtmp2 = mtmp->nmon; if (mtmp->data->mlet == S_KOP) { if (canspotmon(mtmp)) cnt++; mongone(mtmp); } } if (cnt && !silent) pline_The("Kop%s (disappointed) vanish%s into thin air.", plur(cnt), cnt == 1 ? "es" : ""); } #endif /* KOPS */ #endif /*OVLB*/ #ifdef OVL3 STATIC_OVL long cost_per_charge(shkp, otmp, altusage) struct monst *shkp; struct obj *otmp; boolean altusage; /* some items have an "alternate" use with different cost */ { long tmp = 0L; if(!shkp || !inhishop(shkp)) return(0L); /* insurance */ tmp = get_cost(otmp, shkp); /* The idea is to make the exhaustive use of */ /* an unpaid item more expensive than buying */ /* it outright. */ /* KMH, balance patch -- removed abusive orbs */ if(otmp->otyp == MAGIC_LAMP /*|| otmp->otyp == ORB_OF_DESTRUCTION*/) { /* 1 */ /* normal use (ie, as light source) of a magic lamp never degrades its value, but not charging anything would make identifcation too easy; charge an amount comparable to what is charged for an ordinary lamp (don't bother with angry shk surchage) */ if (!altusage) tmp = (long) objects[OIL_LAMP].oc_cost; else tmp += tmp / 3L; /* djinni is being released */ } else if(otmp->otyp == MAGIC_MARKER) { /* 70 - 100 */ /* no way to determine in advance */ /* how many charges will be wasted. */ /* so, arbitrarily, one half of the */ /* price per use. */ tmp /= 2L; } else if(otmp->otyp == BAG_OF_TRICKS || /* 1 - 20 */ otmp->otyp == MEDICAL_KIT || otmp->otyp == HORN_OF_PLENTY) { tmp /= 5L; } else if(otmp->otyp == CRYSTAL_BALL || /* 1 - 5 */ /*otmp->otyp == ORB_OF_ENCHANTMENT || otmp->otyp == ORB_OF_CHARGING ||*/ otmp->otyp == OIL_LAMP || /* 1 - 10 */ otmp->otyp == BRASS_LANTERN || (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->otyp == TORCH) { tmp /= 2L; } else if (otmp->oclass == SPBOOK_CLASS) { /* Normal use is studying. Alternate use is using up a charge */ if (altusage) tmp /= 10L; /* 2 - 4 */ else tmp -= tmp / 5L; } else if (otmp->otyp == CAN_OF_GREASE || otmp->otyp == TINNING_KIT #ifdef TOURIST || otmp->otyp == EXPENSIVE_CAMERA #endif ) { tmp /= 10L; } else if (otmp->otyp == POT_OIL) { tmp /= 5L; } return(tmp); } #endif /*OVL3*/ #ifdef OVLB /* Charge the player for partial use of an unpaid object. * * Note that bill_dummy_object() should be used instead * when an object is completely used. */ void check_unpaid_usage(otmp, altusage) struct obj *otmp; boolean altusage; { struct monst *shkp; const char *fmt, *arg1, *arg2; long tmp; /* MRKR: Torches are a special case. As weapons they can have */ /* a 'charge' == plus value, which is independent of their */ /* use as a light source. */ /* WAC - now checks for items that aren't carried */ if ((!otmp->unpaid || !*u.ushops || (otmp->spe <= 0 && objects[otmp->otyp].oc_charged && otmp->otyp != TORCH)) && (carried(otmp) || !costly_spot(otmp->ox, otmp->oy) || otmp->no_charge)) return; if (!(shkp = shop_keeper(*u.ushops)) || !inhishop(shkp)) return; if ((tmp = cost_per_charge(shkp, otmp, altusage)) == 0L) return; arg1 = arg2 = ""; if (otmp->oclass == SPBOOK_CLASS && !altusage) { 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 */ } /* for using charges of unpaid objects "used in the normal manner" */ void check_unpaid(otmp) struct obj *otmp; { check_unpaid_usage(otmp, FALSE); /* normal item use */ } void costly_gold(x, y, amount) register xchar x, y; register long amount; { register long delta; register struct monst *shkp; register struct eshk *eshkp; if(!costly_spot(x, y)) return; /* shkp now guaranteed to exist by costly_spot() */ shkp = shop_keeper(*in_rooms(x, y, SHOPBASE)); 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 { delta = amount - eshkp->credit; 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; } } /* used in domove to block diagonal shop-exit */ /* x,y should always be a door */ boolean block_door(x,y) register xchar x, y; { register int roomno = *in_rooms(x, y, SHOPBASE); register struct monst *shkp; if(roomno < 0 || !IS_SHOP(roomno)) return(FALSE); if(!IS_DOOR(levl[x][y].typ)) return(FALSE); if(roomno != *u.ushops) return(FALSE); if(!(shkp = shop_keeper((char)roomno)) || !inhishop(shkp)) return(FALSE); if(shkp->mx == ESHK(shkp)->shk.x && shkp->my == ESHK(shkp)->shk.y /* Actually, the shk should be made to block _any_ * door, including a door the player digs, if the * shk is within a 'jumping' distance. */ && ESHK(shkp)->shd.x == x && ESHK(shkp)->shd.y == y && shkp->mcanmove && !shkp->msleeping && (ESHK(shkp)->debit || ESHK(shkp)->billct || ESHK(shkp)->robbed)) { pline("%s%s blocks your way!", shkname(shkp), Invis ? " senses your motion and" : ""); return(TRUE); } return(FALSE); } /* used in domove to block diagonal shop-entry */ /* u.ux, u.uy should always be a door */ boolean block_entry(x,y) register xchar x, y; { register xchar sx, sy; register int roomno; register struct monst *shkp; if(!(IS_DOOR(levl[u.ux][u.uy].typ) && levl[u.ux][u.uy].doormask == D_BROKEN)) return(FALSE); roomno = *in_rooms(x, y, SHOPBASE); if(roomno < 0 || !IS_SHOP(roomno)) return(FALSE); if(!(shkp = shop_keeper((char)roomno)) || !inhishop(shkp)) return(FALSE); if(ESHK(shkp)->shd.x != u.ux || ESHK(shkp)->shd.y != u.uy) return(FALSE); sx = ESHK(shkp)->shk.x; sy = ESHK(shkp)->shk.y; /* KMH, balacne patch -- allow other picks */ if(shkp->mx == sx && shkp->my == sy && shkp->mcanmove && !shkp->msleeping && (x == sx-1 || x == sx+1 || y == sy-1 || y == sy+1) && (Invis || carrying(PICK_AXE) || carrying(DWARVISH_MATTOCK) #ifdef STEED || u.usteed #endif )) { pline("%s%s blocks your way!", shkname(shkp), Invis ? " senses your motion and" : ""); return(TRUE); } return(FALSE); } #endif /* OVLB */ #ifdef OVL2 char * shk_your(buf, obj) char *buf; struct obj *obj; { if (!shk_owns(buf, obj) && !mon_owns(buf, obj)) Strcpy(buf, carried(obj) ? "your" : "the"); return buf; } char * Shk_Your(buf, obj) char *buf; struct obj *obj; { (void) shk_your(buf, obj); *buf = highc(*buf); return buf; } STATIC_OVL char * shk_owns(buf, obj) char *buf; struct obj *obj; { struct monst *shkp; xchar x, y; if (get_obj_location(obj, &x, &y, 0) && (obj->unpaid || (obj->where==OBJ_FLOOR && !obj->no_charge && costly_spot(x,y)))) { shkp = shop_keeper(inside_shop(x, y)); return strcpy(buf, shkp ? s_suffix(shkname(shkp)) : "the"); } return (char *)0; } STATIC_OVL char * mon_owns(buf, obj) char *buf; struct obj *obj; { if (obj->where == OBJ_MINVENT) return strcpy(buf, s_suffix(mon_nam(obj->ocarry))); return (char *)0; } #endif /* OVL2 */ #ifdef OVLB #ifdef __SASC void sasc_bug(struct obj *op, unsigned x){ op->unpaid=x; } #endif #ifdef OTHER_SERVICES static NEARDATA const char identify_types[] = { ALL_CLASSES, 0 }; static NEARDATA const char weapon_types[] = { WEAPON_CLASS, TOOL_CLASS, 0 }; static NEARDATA const char armor_types[] = { ARMOR_CLASS, 0 }; /* ** FUNCTION shk_identify ** ** Pay the shopkeeper to identify an item. */ static NEARDATA const char ident_chars[] = "bp"; static void shk_identify(slang, shkp) char *slang; struct monst *shkp; { register struct obj *obj; /* The object to identify */ int charge, mult; /* Cost to identify */ /* char sbuf[BUFSZ]; */ boolean guesswork; /* Will shkp be guessing? */ boolean ripoff=FALSE; /* Shkp ripping you off? */ char ident_type; /* Pick object */ if ( !(obj = getobj(identify_types, "have identified"))) return; /* Will shk be guessing? */ if ((guesswork = !shk_obj_match(obj, shkp))) { verbalize("I don't handle that sort of item, but I could try..."); } /* Here we go */ /* KMH -- fixed */ if (ESHK(shkp)->services & (SHK_ID_BASIC|SHK_ID_PREMIUM) == SHK_ID_BASIC|SHK_ID_PREMIUM) { ident_type = yn_function("[B]asic service or [P]remier", ident_chars, '\0'); if (ident_type == '\0') return; } else if (ESHK(shkp)->services & SHK_ID_BASIC) { verbalize("I only offer basic identification."); ident_type = 'b'; } else if (ESHK(shkp)->services & SHK_ID_PREMIUM) { verbalize("I only make complete identifications."); ident_type = 'p'; } /* ** Shopkeeper is ripping you off if: ** Basic service and object already known. ** Premier service, object known, + know blessed/cursed and ** rustproof, etc. */ if (obj->dknown && objects[obj->otyp].oc_name_known) { if (ident_type=='b') ripoff=TRUE; if (ident_type=='p' && obj->bknown && obj->rknown && obj->known) ripoff=TRUE; } /* Compute the charge */ if (ripoff) { if (no_cheat) { verbalize("That item's already identified!"); return; } /* Object already identified: Try and cheat the customer. */ pline("%s chuckles greedily...", mon_nam(shkp)); mult = 1; /* basic */ } else if (ident_type=='b') mult = 1; /* premier */ else mult = 2; switch (obj->oclass) { case AMULET_CLASS: charge = 375 * mult; break; case WEAPON_CLASS: charge = 75 * mult; break; case ARMOR_CLASS: charge = 100 * mult; break; case FOOD_CLASS: charge = 25 * mult; break; case SCROLL_CLASS: charge = 150 * mult; break; case SPBOOK_CLASS: charge = 250 * mult; break; case POTION_CLASS: charge = 150 * mult; break; case RING_CLASS: charge = 300 * mult; break; case WAND_CLASS: charge = 200 * mult; break; case TOOL_CLASS: charge = 50 * mult; break; case GEM_CLASS: charge = 500 * mult; break; default: charge = 75 * mult; break; } /* Artifacts cost more to deal with */ /* KMH -- Avoid floating-point */ if (obj->oartifact) charge = charge * 3 / 2; /* Smooth out the charge a bit (lower bound only) */ shk_smooth_charge(&charge, 25, 750); /* Go ahead? */ if (shk_offer_price(slang, charge, shkp) == FALSE) return; /* Shopkeeper deviousness */ if (ident_type == 'b') { if (Hallucination) { pline("You hear %s tell you it's a pot of flowers.", mon_nam(shkp)); return; } else if (Confusion) { pline("%s tells you but you forget.", mon_nam(shkp)); return; } } /* Is shopkeeper guessing? */ if (guesswork) { /* ** Identify successful if rn2() < #. */ if (!rn2(ident_type == 'b' ? 4 : 2)) { verbalize("Success!"); /* Rest of msg will come from identify(); */ } else { verbalize("Sorry. I guess it's not your lucky day."); return; } } /* Premier service */ if (ident_type == 'p') { identify(obj); } else { /* Basic */ makeknown(obj->otyp); obj->dknown = 1; prinv((char *)0, obj, 0L); /* Print result */ } } /* ** FUNCTION shk_uncurse ** ** Uncurse an item for the customer */ static void shk_uncurse(slang, shkp) char *slang; struct monst *shkp; { struct obj *obj; /* The object picked */ int charge; /* How much to uncurse */ /* Pick object */ if ( !(obj = getobj(identify_types, "uncurse"))) return; /* Charge is same as cost */ charge = get_cost(obj, shop_keeper(/* roomno= */*u.ushops)); /* Artifacts cost more to deal with */ /* KMH -- Avoid floating-point */ if (obj->oartifact) charge = charge * 3 / 2; /* Smooth out the charge a bit */ shk_smooth_charge(&charge, 50, 250); /* Go ahead? */ if (shk_offer_price(slang, charge, shkp) == FALSE) return; /* Shopkeeper responses */ /* KMH -- fixed bknown, curse(), bless(), uncurse() */ if (!obj->bknown && !Role_if(PM_PRIEST) && !Role_if(PM_NECROMANCER) && !no_cheat) { /* Not identified! */ pline("%s snickers and says \"See, nice and uncursed!\"", mon_nam(shkp)); obj->bknown = FALSE; } else if (Confusion) { /* Curse the item! */ You("accidentally ask for the item to be cursed"); curse(obj); } else if (Hallucination) { /* ** Let's have some fun: If you're hallucinating, ** then there's a chance for the object to be blessed! */ if (!rn2(4)) { pline("Distracted by your blood-shot %s, the shopkeeper", makeplural(body_part(EYE))); pline("accidentally blesses the item!"); bless(obj); } else { You("can't see straight and point to the wrong item"); } } else { verbalize("All done - safe to handle, now!"); uncurse(obj); } } /* ** FUNCTION shk_appraisal ** ** Appraise a weapon or armor */ static const char basic_damage[] = "Basic damage against small foes %s, against large foes %s."; static void shk_appraisal(slang, shkp) char *slang; struct monst *shkp; { struct obj *obj; /* The object picked */ int charge; /* How much for appraisal */ boolean guesswork; /* Shopkeeper unsure? */ char ascii_wsdam[5]; /* Ascii form of damage */ char ascii_wldam[5]; /* Pick object */ if ( !(obj = getobj(weapon_types, "appraise"))) return; charge = get_cost(obj, shop_keeper(/* roomno= */*u.ushops)) / 3; /* Smooth out the charge a bit */ shk_smooth_charge(&charge, 5, 50); /* If not identified, complain. */ /* KMH -- Why should it matter? */ /* if ( ! (obj->known && objects[obj->otyp].oc_name_known) ) { verbalize("This weapon needs to be identified first!"); return; } else */ if (shk_class_match(WEAPON_CLASS, shkp) == SHK_MATCH) { verbalize("Ok, %s, let's see what we have here.", slang); guesswork = FALSE; } else { verbalize("Mind you, I'm not an expert in this field."); guesswork = TRUE; } /* Go ahead? */ if (shk_offer_price(slang, charge, shkp) == FALSE) return; /* Shopkeeper deviousness */ if (Confusion) { pline("The numbers get all mixed up in your head."); return; } else if (Hallucination) { You("hear %s say it'll \"knock 'em dead\"", mon_nam(shkp)); return; } /* Convert damage to ascii */ Sprintf(ascii_wsdam, "%d", objects[obj->otyp].oc_wsdam); Sprintf(ascii_wldam, "%d", objects[obj->otyp].oc_wldam); /* Will shopkeeper be unsure? */ if (guesswork) { switch (rn2(10)) { case 1: /* Shkp's an idiot */ verbalize("Sorry, %s, but I'm not certain.", slang); break; case 2: /* Not sure about large foes */ verbalize(basic_damage, ascii_wsdam, "?"); break; case 3: /* Not sure about small foes */ verbalize(basic_damage, "?", ascii_wldam); break; default: verbalize(basic_damage, ascii_wsdam, ascii_wldam); break; } } else { verbalize(basic_damage, ascii_wsdam, ascii_wldam); } } /* ** FUNCTION shk_weapon_works ** ** Perform ops on weapon for customer */ static const char we_offer[] = "We offer the finest service available!"; static void shk_weapon_works(slang, shkp) char *slang; struct monst *shkp; { struct obj *obj; int charge; winid tmpwin; anything any; menu_item *selected; int service; int n; /* Pick weapon */ if (ESHK(shkp)->services & (SHK_SPECIAL_A | SHK_SPECIAL_B)) obj = getobj(weapon_types, "improve"); else obj = getobj(weapon_types, "poison"); if (!obj) return; /* Check if you asked for a non weapon tool to be improved */ if (obj->oclass == TOOL_CLASS && !is_weptool(obj)) pline("%s grins greedily...", mon_nam(shkp)); if (ESHK(shkp)->services & (SHK_SPECIAL_A | SHK_SPECIAL_B)) { any.a_void = 0; /* zero out all bits */ tmpwin = create_nhwindow(NHW_MENU); start_menu(tmpwin); if (ESHK(shkp)->services & SHK_SPECIAL_A) { any.a_int = 1; add_menu(tmpwin, NO_GLYPH, &any , 'w', 0, ATR_NONE, "Ward against damage", MENU_UNSELECTED); } if (ESHK(shkp)->services & SHK_SPECIAL_B) { any.a_int = 2; add_menu(tmpwin, NO_GLYPH, &any , 'e', 0, ATR_NONE, "Enchant", MENU_UNSELECTED); } /* Can object be poisoned? */ if (is_poisonable(obj) && (ESHK(shkp)->services & SHK_SPECIAL_C)) { any.a_int = 3; add_menu(tmpwin, NO_GLYPH, &any , 'p', 0, ATR_NONE, "Poison", MENU_UNSELECTED); } end_menu(tmpwin, "Weapon-works:"); n = select_menu(tmpwin, PICK_ONE, &selected); destroy_nhwindow(tmpwin); if (n > 0) service = selected[0].item.a_int; else service = 0; } else service = 3; /* Here we go */ if (service > 0) verbalize(we_offer); else pline(Never_mind); switch(service) { case 0: break; case 1: verbalize("This'll leave your %s untouchable!", xname(obj)); /* Costs more the more eroded it is (oeroded 0-3 * 2) */ charge = 500 * (obj->oeroded + obj->oeroded2 + 1); if (obj->oeroded + obj->oeroded2 > 2) verbalize("This thing's in pretty sad condition, %s", slang); /* Another warning if object is naturally rustproof */ if (obj->oerodeproof || !is_damageable(obj)) pline("%s gives you a suspciously happy smile...", mon_nam(shkp)); /* Artifacts cost more to deal with */ if (obj->oartifact) charge = charge * 3 / 2; /* Smooth out the charge a bit */ shk_smooth_charge(&charge, 200, 1500); if (shk_offer_price(slang, charge, shkp) == FALSE) return; /* Have some fun, but for this $$$ it better work. */ if (Confusion) You("fall over in appreciation"); else if (Hallucination) Your(" - tin roof, un-rusted!"); obj->oeroded = obj->oeroded2 = 0; obj->rknown = TRUE; obj->oerodeproof = TRUE; break; case 2: verbalize("Guaranteed not to harm your weapon, or your money back!"); /* ** The higher the enchantment, the more costly! ** Gets to the point where you need to rob fort ludios ** in order to get it to +5!! */ charge = (obj->spe+1) * (obj->spe+1) * 625; if (obj->spe < 0) charge = 100; /* Artifacts cost more to deal with */ if (obj->oartifact) charge *= 2; /* Smooth out the charge a bit (lower bound only) */ shk_smooth_charge(&charge, 50, NOBOUND); if (shk_offer_price(slang, charge, shkp) == FALSE) return; if (obj->spe+1 > 5) { verbalize("I can't enchant this any higher!"); charge = 0; break; } /* Have some fun! */ if (Confusion) Your("%s unexpectedly!", aobjnam(obj, "vibrate")); else if (Hallucination) Your("%s to evaporate into thin air!", aobjnam(obj, "seem")); /* ...No actual vibrating and no evaporating */ if (obj->otyp == WORM_TOOTH) { obj->otyp = CRYSKNIFE; Your("weapon seems sharper now."); obj->cursed = 0; break; } obj->spe++; break; case 3: verbalize("Just imagine what poisoned %s can do!", xname(obj)); charge = 10 * obj->quan; if (shk_offer_price(slang, charge, shkp) == FALSE) return; obj->opoisoned = TRUE; break; default: impossible("Unknown Weapon Enhancement"); break; } } /* ** FUNCTION shk_armor_works ** ** Perform ops on armor for customer */ static void shk_armor_works(slang, shkp) char *slang; struct monst *shkp; { struct obj *obj; int charge; /*WAC - Windowstuff*/ winid tmpwin; anything any; menu_item *selected; int n; /* Pick armor */ if ( !(obj = getobj(armor_types, "improve"))) return; /* Here we go */ /*WAC - did this using the windowing system...*/ any.a_void = 0; /* zero out all bits */ tmpwin = create_nhwindow(NHW_MENU); start_menu(tmpwin); any.a_int = 1; if (ESHK(shkp)->services & (SHK_SPECIAL_A)) add_menu(tmpwin, NO_GLYPH, &any , 'r', 0, ATR_NONE, "Rust/Fireproof", MENU_UNSELECTED); any.a_int = 2; if (ESHK(shkp)->services & (SHK_SPECIAL_B)) add_menu(tmpwin, NO_GLYPH, &any , 'e', 0, ATR_NONE, "Enchant", MENU_UNSELECTED); end_menu(tmpwin, "Armor-works:"); n = select_menu(tmpwin, PICK_ONE, &selected); destroy_nhwindow(tmpwin); verbalize(we_offer); if (n > 0) switch(selected[0].item.a_int) { case 1: if (!flags.female && is_human(youmonst.data)) verbalize("They'll call you the man of stainless steel!"); /* Costs more the more rusty it is (oeroded 0-3) */ charge = 300 * (obj->oeroded+1); if (obj->oeroded > 2) verbalize("Yikes! This thing's a mess!"); /* Artifacts cost more to deal with */ /* KMH -- Avoid floating-point */ if (obj->oartifact) charge = charge * 3 / 2; /* Smooth out the charge a bit */ shk_smooth_charge(&charge, 100, 1000); if (shk_offer_price(slang, charge, shkp) == FALSE) return; /* Have some fun, but for this $$$ it better work. */ if (Confusion) You("forget how to put your %s back on!", xname(obj)); else if (Hallucination) You("mistake your %s for a pot and...", xname(obj)); obj->oeroded = 0; obj->rknown = TRUE; obj->oerodeproof = TRUE; break; case 2: verbalize("Nobody will ever hit on you again."); /* Higher enchantment levels cost more. */ charge = (obj->spe+1) * (obj->spe+1) * 500; if (obj->spe < 0) charge = 100; /* Artifacts cost more to deal with */ if (obj->oartifact) charge *= 2; /* Smooth out the charge a bit */ shk_smooth_charge(&charge, 50, NOBOUND); if (shk_offer_price(slang, charge, shkp) == FALSE) return; if (obj->spe+1 > 3) { verbalize("I can't enchant this any higher!"); charge = 0; break; } /* Have some fun! */ if (Hallucination) Your("%s looks dented.", xname(obj)); if (obj->otyp >= GRAY_DRAGON_SCALES && obj->otyp <= YELLOW_DRAGON_SCALES) { /* dragon scales get turned into dragon scale mail */ Your("%s merges and hardens!", xname(obj)); setworn((struct obj *)0, W_ARM); /* assumes same order */ obj->otyp = GRAY_DRAGON_SCALE_MAIL + obj->otyp - GRAY_DRAGON_SCALES; obj->cursed = 0; obj->known = 1; setworn(obj, W_ARM); break; } obj->spe++; adj_abon(obj, 1); break; default: pline ("Unknown Armor Enhancement"); break; } } /* ** FUNCTION shk_charge ** ** Charge something (for a price!) */ static NEARDATA const char wand_types[] = { WAND_CLASS, 0 }; static NEARDATA const char tool_types[] = { TOOL_CLASS, 0 }; static NEARDATA const char ring_types[] = { RING_CLASS, 0 }; static NEARDATA const char spbook_types[] = { SPBOOK_CLASS, 0 }; static void shk_charge(slang, shkp) char *slang; struct monst *shkp; { struct obj *obj = NULL; /* The object picked */ struct obj *tobj; /* Temp obj */ char type; /* Basic/premier service */ int charge; /* How much to charge customer */ char invlet; /* Inventory letter */ /* What type of shop are we? */ if (shk_class_match(WAND_CLASS, shkp) == SHK_MATCH) obj = getobj(wand_types, "charge"); else if (shk_class_match(TOOL_CLASS, shkp) == SHK_MATCH) obj = getobj(tool_types, "charge"); else if (shk_class_match(RING_CLASS, shkp) == SHK_MATCH) obj = getobj(ring_types, "charge"); else if (shk_class_match(SPBOOK_CLASS, shkp) == SHK_MATCH) obj = getobj(spbook_types, "charge"); if (!obj) return; /* ** Wand shops can offer special service! ** Extra charges (for a lot of extra money!) */ if (obj->oclass == WAND_CLASS) { /* What type of service? */ if ((ESHK(shkp)->services & (SHK_SPECIAL_A|SHK_SPECIAL_B)) == (SHK_SPECIAL_A|SHK_SPECIAL_B)) { type = yn_function("[B]asic service or [P]remier", ident_chars, '\0'); if (type == '\0') return; } else if (ESHK(shkp)->services & SHK_SPECIAL_A) { pline ("I only perform basic charging."); type = 'b'; } else if (ESHK(shkp)->services & SHK_SPECIAL_B) { pline ("I only perform complete charging."); type = 'p'; } } else { type = 'b'; } /* Compute charge */ if (type == 'b') charge = 300; else charge = 1000; /* Wands of wishing should be hard to get recharged */ if (/*obj->oclass == WAND_CLASS &&*/ obj->otyp == WAN_WISHING) charge *= 3; else /* Smooth out the charge a bit */ shk_smooth_charge(&charge, 100, 1000); /* Go for it? */ if (shk_offer_price(slang, charge, shkp) == FALSE) return; /* Shopkeeper deviousness */ if ((Confusion || Hallucination) && !no_cheat) { pline("%s says it's charged and pushes you toward the door", Monnam(shkp)); return; } /* Do it */ invlet = obj->invlet; recharge(obj, (type=='b') ? 0 : 1); /* ** Did the object blow up? We need to check this in a way ** that has nothing to do with dereferencing the obj pointer. ** We saved the inventory letter of this item; now cycle ** through all objects and see if there is an object ** with that letter. */ for(obj=0, tobj=invent; tobj; tobj=tobj->nobj) if(tobj->invlet == invlet) { obj = tobj; break; } if (!obj) { verbalize("Oops! Sorry about that..."); return; } /* Wands get special treatment */ if (obj->oclass == WAND_CLASS) { /* Wand of wishing? */ if (obj->otyp == WAN_WISHING) { /* Premier gives you ONE more charge */ /* KMH -- Okay, but that's pretty generous */ if (type == 'p') obj->spe++; /* Fun */ verbalize("Since you'll have everything you always wanted,"); verbalize("...How about loaning me some money?"); #ifndef GOLDOBJ shkp->mgold += u.ugold; u.ugold = 0; #else money2mon(shkp, money_cnt(invent)); #endif makeknown(obj->otyp); bot(); } else { /* ** Basic: recharge() will have given 1 charge. ** Premier: recharge() will have given 5-10, say. ** Add a few more still. */ if (obj->spe < 16) obj->spe += rn1(5,5); else if (obj->spe < 20) obj->spe += 1; } } } /* ** FUNCTION shk_obj_match ** ** Does object "obj" match the type of shop? */ static boolean shk_obj_match(obj, shkp) struct obj *obj; struct monst *shkp; { /* object matches type of shop? */ return(saleable(shkp, obj)); } /* ** FUNCTION shk_offer_price ** ** Tell customer how much it'll cost, ask if he wants to pay, ** and deduct from $$ if agreable. */ static boolean shk_offer_price(slang, charge, shkp) char *slang; long charge; struct monst *shkp; { char sbuf[BUFSZ]; long credit = ESHK(shkp)->credit; /* Ask y/n if player wants to pay */ Sprintf(sbuf, "It'll cost you %ld zorkmid%s. Interested?", charge, plur(charge)); if ( yn(sbuf) != 'y' ) { verbalize("It's your call, %s.", slang); return(FALSE); } /* Player _wants_ to pay, but can he? */ /* WAC -- Check the credit: but don't use check_credit * since we don't want to charge him for part of it if he can't pay for all * of it */ #ifndef GOLDOBJ if (charge > (u.ugold + credit)) { #else if (charge > (money_cnt(invent) + credit)) { #endif verbalize("Cash on the spot, %s, and you ain't got the dough!", slang); return(FALSE); } /* Charge the customer */ charge = check_credit (charge, shkp); /* Deduct the credit first */ #ifndef GOLDOBJ u.ugold -= charge; shkp->mgold += charge; #else money2mon(shkp, charge); #endif bot(); return(TRUE); } /* ** FUNCTION shk_smooth_charge ** ** Smooth out the lower/upper bounds on the price to get something ** done. Make sure that it (1) varies depending on charisma and ** (2) is constant. */ static void shk_smooth_charge(pcharge, lower, upper) int *pcharge; int lower; int upper; { int charisma; int bonus; /* KMH -- Avoid using floating-point arithmetic */ if(ACURR(A_CHA) > 21) *pcharge *= 11; else if(ACURR(A_CHA) > 18) *pcharge *= 12; else if(ACURR(A_CHA) > 15) *pcharge *= 13; else if(ACURR(A_CHA) > 12) *pcharge *= 14; else if(ACURR(A_CHA) > 10) *pcharge *= 15; else if(ACURR(A_CHA) > 8) *pcharge *= 16; else if(ACURR(A_CHA) > 7) *pcharge *= 17; else if(ACURR(A_CHA) > 6) *pcharge *= 18; else if(ACURR(A_CHA) > 5) *pcharge *= 19; else if(ACURR(A_CHA) > 4) *pcharge *= 20; else *pcharge *= 21; *pcharge /= 10; #ifdef BLACKMARKET if (Is_blackmarket(&u.uz)) *pcharge *= 3; #endif /* Skip upper stuff? */ if (upper == NOBOUND) goto check_lower; /* This should give us something like a charisma of 5 to 25. */ charisma = ABASE(A_CHA) + ABON(A_CHA) + ATEMP(A_CHA); /* Now: 0 to 10 = 0. 11 and up = 1 to whatever. */ if (charisma <= 10) charisma = 0; else charisma -= 10; /* Charismatic players get smaller upper bounds */ bonus=((upper/50)*charisma); /* Adjust upper. Upper > lower! */ upper -= bonus; upper = (upper>=lower) ? upper : lower; /* Ok, do the min/max stuff */ if (*pcharge > upper) *pcharge=upper; check_lower: if (*pcharge < lower) *pcharge=lower; } #endif /* OTHER_SERVICES */ #endif /* OVLB */ #ifdef DEBUG int wiz_debug_cmd() /* in this case, display your bill(s) */ { int win, special = 0; struct obj *obj; struct monst *shkp, *ushkp; struct bill_x *bp; int ct; char buf[BUFSIZ]; char buf2[BUFSIZ]; win = create_nhwindow(NHW_MENU); ushkp = shop_keeper(*u.ushops); shkp = next_shkp(fmon, TRUE); if (!shkp) { shkp = ushkp; special++; } if (!shkp) putstr(win, 0, "No shopkeepers with bills"); else for (; shkp; ) { bp = ESHK(shkp)->bill_p; ct = ESHK(shkp)->billct; if (ct) { Sprintf(buf, "Your bill with %s", noit_mon_nam(shkp)); if (shkp == ushkp) { Strcat(buf, " (here)"); ushkp = NULL; } Strcat(buf, ":"); putstr(win, 0, buf); putstr(win, 0, "Price Quan Used? Object"); while (--ct >= 0) { obj = bp_to_obj(bp); if (obj) { if (!obj->unpaid) *buf2='*'; /* Bad entry */ Strcpy(obj->unpaid ? buf2 : buf2 + 1, xname(obj)); } else Sprintf(buf2, "Unknown, with ID %d", bp->bo_id); Sprintf(buf, "%-7d %-7d %-7s %s", bp->price, bp->bquan, bp->useup ? "Yes" : "No", buf2); putstr(win, 0, buf); bp++; } } else { Sprintf(buf, "You do not owe %s anything.", noit_mon_nam(shkp)); putstr(win, 0, buf); } if (special) break; shkp = next_shkp(shkp->nmon, TRUE); if (!shkp) { shkp = ushkp; special++; } if (shkp) putstr(win, 0, ""); } display_nhwindow(win, FALSE); destroy_nhwindow(win); return 0; } #endif /* DEBUG */ /*shk.c*/ slashem-0.0.7E7F3/src/steal.c0000664000076400007640000004456210545462317013732 0ustar aliali/* SCCS Id: @(#)steal.c 3.4 2003/12/04 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" STATIC_PTR int NDECL(stealarm); #ifdef OVLB STATIC_DCL const char *FDECL(equipname, (struct obj *)); STATIC_DCL void FDECL(mdrop_obj, (struct monst *,struct obj *,BOOLEAN_P)); STATIC_OVL const char * equipname(otmp) register struct obj *otmp; { return ( #ifdef TOURIST (otmp == uarmu) ? "shirt" : #endif (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() { #ifdef LINT /* long conv. ok */ return(0L); #else return (long)( (u.ugold < 100) ? u.ugold : (u.ugold > 10000) ? rnd(10000) : rnd((int) u.ugold) ); #endif } void stealgold(mtmp) register struct monst *mtmp; { register struct obj *gold = g_at(u.ux, u.uy); register long tmp; if (gold && ( !u.ugold || gold->quan > u.ugold || !rn2(5))) { mtmp->mgold += gold->quan; delobj(gold); newsym(u.ux, u.uy); pline("%s quickly snatches some gold from between your %s!", Monnam(mtmp), makeplural(body_part(FOOT))); if(!u.ugold || !rn2(5)) { if (!tele_restrict(mtmp)) (void) rloc(mtmp, FALSE); /* do not set mtmp->mavenge here; gold on the floor is fair game */ monflee(mtmp, 0, FALSE, FALSE); } } else if(u.ugold) { u.ugold -= (tmp = somegold()); Your("purse feels lighter."); mtmp->mgold += tmp; if (!tele_restrict(mtmp)) (void) rloc(mtmp, FALSE); mtmp->mavenge = 1; 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)) (void) rloc(mtmp, FALSE); 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)) (void) rloc(mtmp, FALSE); 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 */ unsigned int stealmid; /* monster doing the stealing */ STATIC_PTR int stealarm() { register struct monst *mtmp; register struct obj *otmp; for(otmp = invent; otmp; otmp = otmp->nobj) { if(otmp->o_id == stealoid) { for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) { if(mtmp->m_id == stealmid) { if(DEADMONSTER(mtmp)) impossible("stealarm(): dead monster stealing"); if(!dmgtype(mtmp->data, AD_SITM)) /* polymorphed */ goto botm; if(otmp->unpaid) subfrombill(otmp, shop_keeper(*u.ushops)); freeinv(otmp); pline("%s steals %s!", Monnam(mtmp), doname(otmp)); (void) mpickobj(mtmp,otmp); /* may free otmp */ /* Implies seduction, "you gladly hand over ..." so we don't set mavenge bit here. */ monflee(mtmp, 0, FALSE, FALSE); if (!tele_restrict(mtmp)) (void) rloc(mtmp, FALSE); break; } } break; } } botm: stealoid = 0; 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, unchain_ball) struct obj *obj; boolean unchain_ball; /* whether to unpunish or just unwield */ { if (donning(obj)) cancel_don(); 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(); else if (obj == uarmg) (void) Gloves_off(); else if (obj == uarmh) (void) Helmet_off(); else if (obj == uarms) (void) Shield_off(); #ifdef TOURIST else if (obj == uarmu) (void) Shirt_off(); #endif /* catchall -- should never happen */ 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_WEP|W_SWAPWEP|W_QUIVER)) { if (obj == uwep) uwepgone(); if (obj == uswapwep) uswapwepgone(); if (obj == uquiver) uqwepgone(); } if (obj->owornmask & (W_BALL|W_CHAIN)) { if (unchain_ball) unpunish(); } else if (obj->owornmask) { /* catchall */ setnotworn(obj); } } /* Returns 1 when something was stolen (or at least, when N should flee now) * Returns -1 if the monster died in the attempt * 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 */ int do_charm = is_neuter(mtmp->data) || flags.female == mtmp->female; 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. */ if(Blind) pline("Somebody tries to rob you, but finds nothing to steal."); else pline("%s tries to rob you, but there is nothing to steal!", Monnam(mtmp)); return(1); /* let thief 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) { otmp = uright; goto gotobj; } tmp = 0; for(otmp = invent; otmp; otmp = otmp->nobj) if ((!uarm || otmp != uarmc) && otmp != uskin #ifdef INVISIBLE_OBJECTS && (!otmp->oinvis || perceives(mtmp->data)) #endif ) tmp += ((otmp->owornmask & (W_ARMOR | W_RING | W_AMUL | W_TOOL)) ? 5 : 1); if (!tmp) goto nothing_to_steal; tmp = rn2(tmp); for(otmp = invent; otmp; otmp = otmp->nobj) if ((!uarm || otmp != uarmc) && otmp != uskin #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; if(!otmp) { impossible("Steal fails!"); return(0); } /* can't steal gloves while wielding - so steal the wielded item. */ if (otmp == uarmg && uwep) otmp = uwep; /* can't steal armor while wearing cloak - so steal the cloak. */ else if(otmp == uarm && uarmc) otmp = uarmc; #ifdef TOURIST else if(otmp == uarmu && uarmc) otmp = uarmc; else if(otmp == uarmu && uarm) otmp = uarm; #endif gotobj: if(otmp->o_id == stealoid) return(0); #ifdef STEED if (otmp == usaddle) dismount_steed(DISMOUNT_FELL); #endif /* 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 * const 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) { case TOOL_CLASS: case AMULET_CLASS: case RING_CLASS: case FOOD_CLASS: /* meat ring */ remove_worn_item(otmp, TRUE); break; case ARMOR_CLASS: armordelay = objects[otmp->otyp].oc_delay; /* Stop putting on armor which has been stolen. */ if (donning(otmp) || is_animal(mtmp->data)) { remove_worn_item(otmp, TRUE); 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, TRUE); break; } else { int curssv = otmp->cursed; int slowly; boolean seen = canspotmon(mtmp); char pronoun[4]; if (!seen) { strcpy(pronoun, mhe(mtmp)); pronoun[0] = highc(pronoun[0]); } 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 (do_charm) { char action[15]; if (curssv) sprintf(action, "let %s take", mhis(mtmp)); else strcpy(action, slowly ? "start removing" : "hand over"); pline("%s charms you. You gladly %s your %s.", !seen ? pronoun : Monnam(mtmp), action, equipname(otmp)); } else pline("%s seduces you and %s off your %s.", !seen ? pronoun : Adjmonnam(mtmp, mtmp->female ? "beautiful" : "handsome"), 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); nomovemsg = 0; remove_worn_item(otmp, TRUE); otmp->cursed = curssv; if(multi < 0){ /* multi = 0; nomovemsg = 0; afternmv = 0; */ stealoid = otmp->o_id; stealmid = mtmp->m_id; afternmv = stealarm; return(0); } } break; default: impossible("Tried to steal a strange worn thing. [%d]", otmp->oclass); } } else if (otmp->owornmask) remove_worn_item(otmp, TRUE); /* do this before removing it from inventory */ if (objnambuf) Strcpy(objnambuf, yname(otmp)); /* set mavenge bit so knights won't suffer an * alignment penalty during retaliation; */ mtmp->mavenge = 1; freeinv(otmp); pline("%s stole %s.", named ? "It" : 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); return -1; } return((multi < 0) ? 0 : 1); } #endif /* OVLB */ #ifdef OVL1 /* Returns 1 if otmp is free'd, 0 otherwise. */ int mpickobj(mtmp,otmp) register struct monst *mtmp; register struct obj *otmp; { int freed_otmp; #ifndef GOLDOBJ if (otmp->oclass == COIN_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(mtmp, 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; } #endif /* OVL1 */ #ifdef OVLB void stealamulet(mtmp) struct monst *mtmp; { struct obj *otmp = (struct obj *)0; int real=0, fake=0; /* select the artifact to steal */ if(u.uhave.amulet) { real = AMULET_OF_YENDOR; fake = FAKE_AMULET_OF_YENDOR; } else if(u.uhave.questart) { for(otmp = invent; otmp; otmp = otmp->nobj) if(is_quest_artifact(otmp)) break; if (!otmp) return; /* should we panic instead? */ } else if(u.uhave.bell) { real = BELL_OF_OPENING; fake = BELL; } else if(u.uhave.book) { real = SPE_BOOK_OF_THE_DEAD; } else if(u.uhave.menorah) { real = CANDELABRUM_OF_INVOCATION; } else return; /* you have nothing of special interest */ if (!otmp) { /* If we get here, real and fake have been set up. */ for(otmp = invent; otmp; otmp = otmp->nobj) if(otmp->otyp == real || (otmp->otyp == fake && !mtmp->iswiz)) break; } if (otmp) { /* we have something to snatch */ if (otmp->owornmask) remove_worn_item(otmp, TRUE); freeinv(otmp); /* mpickobj wont merge otmp because none of the above things to steal are mergable */ (void) mpickobj(mtmp,otmp); /* may merge and free otmp */ pline("%s stole %s!", Monnam(mtmp), doname(otmp)); if (can_teleport(mtmp->data) && !tele_restrict(mtmp)) (void) rloc(mtmp, FALSE); } } #endif /* OVLB */ #ifdef OVL0 /* drop one object taken from a (possibly dead) monster's inventory */ STATIC_OVL void mdrop_obj(mon, obj, verbosely) struct monst *mon; struct obj *obj; boolean verbosely; { int omx = mon->mx, omy = mon->my; if (obj->owornmask) { /* perform worn item handling if the monster is still alive */ if (mon->mhp > 0) { mon->misc_worn_check &= ~obj->owornmask; update_mon_intrinsics(mon, obj, FALSE, TRUE); /* obj_no_longer_held(obj); -- done by place_object */ if (obj->owornmask & W_WEP) setmnotwielded(mon, obj); #ifdef STEED /* don't charge for an owned saddle on dead steed */ } else if (mon->mtame && (obj->owornmask & W_SADDLE) && !obj->unpaid && costly_spot(omx, omy)) { obj->no_charge = 1; #endif } obj->owornmask = 0L; } if (verbosely && cansee(omx, omy)) pline("%s drops %s.", Monnam(mon), distant_name(obj, doname)); if (!flooreffects(obj, omx, omy, "fall")) { place_object(obj, omx, omy); stackobj(obj); } } /* some monsters bypass the normal rules for moving between levels or even leaving the game entirely; when that happens, prevent them from taking the Amulet or invocation tools with them */ void mdrop_special_objs(mon) struct monst *mon; { struct obj *obj, *otmp; for (obj = mon->minvent; obj; obj = otmp) { otmp = obj->nobj; /* the Amulet, invocation tools, and Rider corpses resist even when artifacts and ordinary objects are given 0% resistance chance */ if (obj_resists(obj, 0, 0)) { obj_extract_self(obj); mdrop_obj(mon, obj, FALSE); } } } /* release the objects the creature is carrying */ void relobj(mtmp,show,is_pet) register struct monst *mtmp; register int show; boolean is_pet; /* If true, pet should keep wielded/worn items */ { register struct obj *otmp; register int omx = mtmp->mx, omy = mtmp->my; struct obj *keepobj = 0; struct obj *wep = MON_WEP(mtmp); boolean item1 = FALSE, item2 = FALSE; if (!is_pet || mindless(mtmp->data) || is_animal(mtmp->data)) item1 = item2 = TRUE; if (!tunnels(mtmp->data) || !needspick(mtmp->data)) item1 = TRUE; while ((otmp = mtmp->minvent) != 0) { obj_extract_self(otmp); /* special case: pick-axe and unicorn horn are non-worn */ /* items that we also want pets to keep 1 of */ /* (It is a coincidence that these can also be wielded.) */ if (otmp->owornmask || otmp == wep || ((!item1 && otmp->otyp == PICK_AXE) || (!item2 && otmp->otyp == UNICORN_HORN && !otmp->cursed))) { if (is_pet) { /* dont drop worn/wielded item */ if (otmp->otyp == PICK_AXE) item1 = TRUE; if (otmp->otyp == UNICORN_HORN && !otmp->cursed) item2 = TRUE; otmp->nobj = keepobj; keepobj = otmp; continue; } } mdrop_obj(mtmp, otmp, is_pet && flags.verbose); } /* put kept objects back */ while ((otmp = keepobj) != (struct obj *)0) { keepobj = otmp->nobj; (void) add_to_minv(mtmp, otmp); } #ifndef GOLDOBJ if (mtmp->mgold) { register long g = mtmp->mgold; (void) mkgold(g, omx, omy); if (is_pet && cansee(omx, omy) && flags.verbose) pline("%s drops %ld gold piece%s.", Monnam(mtmp), g, plur(g)); mtmp->mgold = 0L; } #endif if (show & cansee(omx, omy)) newsym(omx, omy); } #endif /* OVL0 */ /*steal.c*/ slashem-0.0.7E7F3/src/fountain.c0000664000076400007640000005453610545462317014447 0ustar aliali/* SCCS Id: @(#)fountain.c 3.4 2003/03/23 */ /* Copyright Scott R. Turner, srt@ucla, 10/27/86 */ /* NetHack may be freely redistributed. See license for details. */ /* Code for drinking from fountains. */ #include "hack.h" STATIC_DCL void NDECL(dowatersnakes); STATIC_DCL void NDECL(dowaterdemon); STATIC_DCL void NDECL(dowaternymph); STATIC_PTR void FDECL(gush, (int,int,genericptr_t)); STATIC_DCL void NDECL(dofindgem); void floating_above(what) const char *what; { You("are floating high above the %s.", what); } STATIC_OVL void dowatersnakes() /* Fountain of snakes! */ { register int num = rn1(5,2); struct monst *mtmp; if (!(mvitals[PM_WATER_MOCCASIN].mvflags & G_GONE)) { if (!Blind) pline("An endless stream of %s pours forth!", Hallucination ? makeplural(rndmonnam()) : "snakes"); else You_hear("%s hissing!", something); while(num-- > 0) if((mtmp = makemon(&mons[PM_WATER_MOCCASIN], u.ux, u.uy, NO_MM_FLAGS)) && t_at(mtmp->mx, mtmp->my)) (void) mintrap(mtmp); } else pline_The("fountain bubbles furiously for a moment, then calms."); } STATIC_OVL void dowaterdemon() /* Water demon */ { register struct monst *mtmp; if(!(mvitals[PM_WATER_DEMON].mvflags & G_GONE)) { if((mtmp = makemon(&mons[PM_WATER_DEMON],u.ux,u.uy, NO_MM_FLAGS))) { if (!Blind) You("unleash %s!", a_monnam(mtmp)); else You_feel("the presence of evil."); /* ------------===========STEPHEN WHITE'S NEW CODE============------------ */ /* Give those on low levels a (slightly) better chance of survival */ /* 35% at level 1, 30% at level 2, 25% at level 3, etc... */ if (rnd(100) > (60 + 5*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)) (void) mintrap(mtmp); } } else pline_The("fountain bubbles furiously for a moment, then calms."); } STATIC_OVL void dowaternymph() /* Water Nymph */ { register struct monst *mtmp; if(!(mvitals[PM_WATER_NYMPH].mvflags & G_GONE) && (mtmp = makemon(&mons[PM_WATER_NYMPH],u.ux,u.uy, NO_MM_FLAGS))) { if (!Blind) You("attract %s!", a_monnam(mtmp)); else You_hear("a seductive voice."); mtmp->msleeping = 0; if (t_at(mtmp->mx, mtmp->my)) (void) mintrap(mtmp); } else if (!Blind) pline("A large bubble rises to the surface and pops."); else You_hear("a loud pop."); } void dogushforth(drinking) /* Gushing forth along LOS from (u.ux, u.uy) */ int drinking; { int madepool = 0; do_clear_area(u.ux, u.uy, 7, gush, (genericptr_t)&madepool); if (!madepool) { if (drinking) Your("thirst is quenched."); else pline("Water sprays all over you."); } } STATIC_PTR void gush(x, y, poolcnt) int x, y; genericptr_t poolcnt; { register struct monst *mtmp; register struct trap *ttmp; if (((x+y)%2) || (x == u.ux && y == u.uy) || (rn2(1 + distmin(u.ux, u.uy, x, y))) || (levl[x][y].typ != ROOM) || (sobj_at(BOULDER, x, y)) || nexttodoor(x, y)) return; if ((ttmp = t_at(x, y)) != 0 && !delfloortrap(ttmp)) return; if (!((*(int *)poolcnt)++)) pline("Water gushes forth from the overflowing fountain!"); /* Put a pool at x, y */ levl[x][y].typ = POOL; /* No kelp! */ del_engr_at(x, y); water_damage(level.objects[x][y], FALSE, TRUE); if ((mtmp = m_at(x, y)) != 0) (void) minliquid(mtmp); else newsym(x,y); } STATIC_OVL void 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); SET_FOUNTAIN_LOOTED(u.ux,u.uy); newsym(u.ux, u.uy); exercise(A_WIS, TRUE); /* a discovery! */ } void dryup(x, y, isyou) xchar x, y; boolean isyou; { if (IS_FOUNTAIN(levl[x][y].typ) && (!rn2(3) || FOUNTAIN_IS_WARNED(x,y))) { if(isyou && in_town(x, y) && !FOUNTAIN_IS_WARNED(x,y)) { struct monst *mtmp; SET_FOUNTAIN_WARNED(x,y); /* Warn about future fountain use. */ for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) { if (DEADMONSTER(mtmp)) continue; if ((mtmp->data == &mons[PM_WATCHMAN] || mtmp->data == &mons[PM_WATCH_CAPTAIN]) && couldsee(mtmp->mx, mtmp->my) && mtmp->mpeaceful) { pline("%s yells:", Amonnam(mtmp)); verbalize("Hey, stop using that fountain!"); break; } } /* You can see or hear this effect */ if(!mtmp) pline_The("flow reduces to a trickle."); return; } #ifdef WIZARD if (isyou && wizard) { if (yn("Dry up fountain?") == 'n') return; } #endif /* replace the fountain with ordinary floor */ levl[x][y].typ = ROOM; levl[x][y].looted = 0; levl[x][y].blessedftn = 0; if (cansee(x,y)) pline_The("fountain dries up!"); /* The location is seen if the hero/monster is invisible */ /* or felt if the hero is blind. */ newsym(x, y); level.flags.nfountains--; if(isyou && in_town(x, y)) (void) angry_guards(FALSE); } } void drinkfountain() { /* What happens when you drink from a fountain? */ register boolean mgkftn = (levl[u.ux][u.uy].blessedftn == 1); register int fate = rnd(30); if (Levitation) { floating_above("fountain"); return; } if (mgkftn && u.uluck >= 0 && fate >= 10) { int i, ii, littleluck = (u.uluck < 4); pline("Wow! This makes you feel great!"); /* blessed restore ability */ for (ii = 0; ii < A_MAX; ii++) if (ABASE(ii) < AMAX(ii)) { ABASE(ii) = AMAX(ii); flags.botl = 1; } /* gain ability, blessed if "natural" luck is high */ i = rn2(A_MAX); /* start at a random attribute */ for (ii = 0; ii < A_MAX; ii++) { if (adjattrib(i, 1, littleluck ? -1 : 0) && littleluck) break; if (++i >= A_MAX) i = 0; } display_nhwindow(WIN_MESSAGE, FALSE); pline("A wisp of vapor escapes the fountain..."); exercise(A_WIS, TRUE); levl[u.ux][u.uy].blessedftn = 0; return; } if (fate < 10) { pline_The("cool draught refreshes you."); u.uhunger += rnd(10); /* don't choke on water */ newuhs(FALSE); if(mgkftn) return; } else { switch (fate) { case 19: /* Self-knowledge */ You_feel("self-knowledgeable..."); display_nhwindow(WIN_MESSAGE, FALSE); enlightenment(0); exercise(A_WIS, TRUE); pline_The("feeling subsides."); break; case 20: /* Foul water */ pline_The("water is foul! You gag and vomit."); morehungry(rn1(20, 11)); vomit(); break; case 21: /* Poisonous */ pline_The("water is contaminated!"); if (Poison_resistance) { pline( "Perhaps it is runoff from the nearby %s farm.", fruitname(FALSE)); losehp(rnd(4),"unrefrigerated sip of juice", KILLED_BY_AN); break; } losestr(rn1(4,3)); losehp(rnd(10),"contaminated water", KILLED_BY); exercise(A_CON, FALSE); break; case 22: /* Fountain of snakes! */ dowatersnakes(); break; case 23: /* Water demon */ dowaterdemon(); break; case 24: /* Curse an item */ { register struct obj *obj; pline("This water's no good!"); morehungry(rn1(20, 11)); exercise(A_CON, FALSE); for(obj = invent; obj ; obj = obj->nobj) if (!rn2(5)) curse(obj); break; } case 25: /* See invisible */ if (Blind) { if (Invisible) { You("feel transparent."); } else { You("feel very self-conscious."); pline("Then it passes."); } } else { You("see an image of someone stalking you."); pline("But it disappears."); } HSee_invisible |= FROMOUTSIDE; newsym(u.ux,u.uy); exercise(A_WIS, TRUE); break; case 26: /* See Monsters */ (void) monster_detect((struct obj *)0, 0); exercise(A_WIS, TRUE); break; case 27: /* Find a gem in the sparkling waters. */ if (!FOUNTAIN_IS_LOOTED(u.ux,u.uy)) { dofindgem(); break; } case 28: /* Water Nymph */ dowaternymph(); break; case 29: /* Scare */ { register struct monst *mtmp; pline("This water gives you bad breath!"); for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) if(!DEADMONSTER(mtmp)) monflee(mtmp, 0, FALSE, FALSE); } break; case 30: /* Gushing forth in this room */ dogushforth(TRUE); break; default: pline("This tepid water is tasteless."); break; } } dryup(u.ux, u.uy, TRUE); } void dipfountain(obj) register struct obj *obj; { if (Levitation) { floating_above("fountain"); return; } /* Don't grant Excalibur when there's more than one object. */ /* (quantity could be > 1 if merged daggers got polymorphed) */ if (obj->otyp == LONG_SWORD && obj->quan == 1L && u.ulevel > 4 && !rn2(8) && !obj->oartifact && !exist_artifact(LONG_SWORD, artiname(ART_EXCALIBUR))) { if (u.ualign.type != A_LAWFUL) { /* Ha! Trying to cheat her. */ pline("A freezing mist rises from the water and envelopes the sword."); pline_The("fountain disappears!"); curse(obj); if (obj->spe > -6 && !rn2(3)) obj->spe--; obj->oerodeproof = FALSE; exercise(A_WIS, FALSE); } else { /* The lady of the lake acts! - Eric Backus */ /* Be *REAL* nice */ pline("From the murky depths, a hand reaches up to bless the sword."); pline("As the hand retreats, the fountain disappears!"); obj = oname(obj, artiname(ART_EXCALIBUR)); discover_artifact(ART_EXCALIBUR); bless(obj); obj->oeroded = obj->oeroded2 = 0; obj->oerodeproof = TRUE; exercise(A_WIS, TRUE); } update_inventory(); levl[u.ux][u.uy].typ = ROOM; levl[u.ux][u.uy].looted = 0; newsym(u.ux, u.uy); level.flags.nfountains--; if(in_town(u.ux, u.uy)) (void) angry_guards(FALSE); return; } else if (get_wet(obj, FALSE) && !rn2(2)) return; /* Acid and water don't mix */ if (obj->otyp == POT_ACID) { useup(obj); return; } switch (rnd(30)) { case 10: /* Curse the item */ curse(obj); break; case 11: case 12: case 13: case 14: /* Uncurse the item */ if(obj->cursed) { if (!Blind) pline_The("water glows for a moment."); uncurse(obj); } else { pline("A feeling of loss comes over you."); } break; case 15: case 16: /* Water Demon */ dowaterdemon(); break; case 17: case 18: /* Water Nymph */ dowaternymph(); break; case 19: case 20: /* an Endless Stream of Snakes */ dowatersnakes(); break; case 21: case 22: case 23: /* Find a gem */ if (!FOUNTAIN_IS_LOOTED(u.ux,u.uy)) { dofindgem(); break; } case 24: case 25: /* Water gushes forth */ dogushforth(FALSE); break; case 26: /* Strange feeling */ pline("A strange tingling runs up your %s.", body_part(ARM)); break; case 27: /* Strange feeling */ You_feel("a sudden chill."); 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!"); CLEAR_FOUNTAIN_LOOTED(u.ux,u.uy); 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 == COIN_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!"); CLEAR_FOUNTAIN_LOOTED(u.ux,u.uy); exercise(A_WIS, FALSE); } } #endif break; case 29: /* You see coins */ /* We make fountains have more coins the closer you are to the * surface. After all, there will have been more people going * by. Just like a shopping mall! Chris Woodbury */ if (FOUNTAIN_IS_LOOTED(u.ux,u.uy)) break; SET_FOUNTAIN_LOOTED(u.ux,u.uy); (void) mkgold((long) (rnd((dunlevs_in_dungeon(&u.uz)-dunlev(&u.uz)+1)*2)+5), u.ux, u.uy); if (!Blind) pline("Far below you, you see coins glistening in the water."); exercise(A_WIS, TRUE); newsym(u.ux,u.uy); break; } update_inventory(); dryup(u.ux, u.uy, TRUE); } #ifdef SINKS void diptoilet(obj) register struct obj *obj; { if (Levitation) { floating_above("toilet"); return; } (void) get_wet(obj, FALSE); /* KMH -- acid and water don't mix */ if (obj->otyp == POT_ACID) { useup(obj); return; } if(is_poisonable(obj)) { if (flags.verbose) You("cover it in filth."); obj->opoisoned = TRUE; } if (obj->oclass == FOOD_CLASS) { if (flags.verbose) pline("My! It certainly looks tastier now..."); obj->orotten = TRUE; } if (flags.verbose) pline("Yuck!"); } void breaksink(x,y) int x, y; { if(cansee(x,y) || (x == u.ux && y == u.uy)) pline_The("pipes break! Water spurts out!"); level.flags.nsinks--; levl[x][y].doormask = 0; levl[x][y].typ = FOUNTAIN; level.flags.nfountains++; newsym(x,y); } void breaktoilet(x,y) int x, y; { register int num = rn1(5,2); struct monst *mtmp; pline("The toilet suddenly shatters!"); level.flags.nsinks--; levl[x][y].typ = FOUNTAIN; level.flags.nfountains++; newsym(x,y); if (!rn2(3)) { if (!(mvitals[PM_BABY_CROCODILE].mvflags & G_GONE)) { if (!Blind) { if (!Hallucination) pline("Oh no! Crocodiles come out from the pipes!"); else pline("Oh no! Tons of poopies!"); } else You("hear something scuttling around you!"); while(num-- > 0) if((mtmp = makemon(&mons[PM_BABY_CROCODILE],u.ux,u.uy, NO_MM_FLAGS)) && t_at(mtmp->mx, mtmp->my)) (void) mintrap(mtmp); } else pline("The sewers seem strangely quiet."); } } void drinksink() { struct obj *otmp; struct monst *mtmp; if (Levitation) { floating_above("sink"); return; } switch(rn2(20)) { case 0: You("take a sip of very cold water."); break; case 1: You("take a sip of very warm water."); break; case 2: You("take a sip of scalding hot water."); if (Fire_resistance) pline("It seems quite tasty."); else losehp(rnd(6), "sipping boiling water", KILLED_BY); break; case 3: if (mvitals[PM_SEWER_RAT].mvflags & G_GONE) pline_The("sink seems quite dirty."); else { mtmp = makemon(&mons[PM_SEWER_RAT], u.ux, u.uy, NO_MM_FLAGS); if (mtmp) pline("Eek! There's %s in the sink!", (Blind || !canspotmon(mtmp)) ? "something squirmy" : a_monnam(mtmp)); } break; case 4: do { otmp = mkobj(POTION_CLASS,FALSE); if (otmp->otyp == POT_WATER) { obfree(otmp, (struct obj *)0); otmp = (struct obj *) 0; } } while(!otmp); otmp->cursed = otmp->blessed = 0; pline("Some %s liquid flows from the faucet.", Blind ? "odd" : hcolor(OBJ_DESCR(objects[otmp->otyp]))); otmp->dknown = !(Blind || Hallucination); otmp->fromsink = 1; /* kludge for docall() */ /* dopotion() deallocs dummy potions */ (void) dopotion(otmp); break; case 5: if (!(levl[u.ux][u.uy].looted & S_LRING)) { You("find a ring in the sink!"); (void) mkobj_at(RING_CLASS, u.ux, u.uy, TRUE); levl[u.ux][u.uy].looted |= S_LRING; exercise(A_WIS, TRUE); newsym(u.ux,u.uy); } else pline("Some dirty water backs up in the drain."); break; case 6: breaksink(u.ux,u.uy); break; case 7: pline_The("water moves as though of its own will!"); if ((mvitals[PM_WATER_ELEMENTAL].mvflags & G_GONE) || !makemon(&mons[PM_WATER_ELEMENTAL], u.ux, u.uy, NO_MM_FLAGS)) pline("But it quiets down."); break; case 8: pline("Yuk, this water tastes awful."); more_experienced(1,0); newexplevel(); break; case 9: pline("Gaggg... this tastes like sewage! You vomit."); morehungry(rn1(30-ACURR(A_CON), 11)); vomit(); break; case 10: /* KMH, balance patch -- new intrinsic */ pline("This water contains toxic wastes!"); if (!Unchanging) { if (!Unchanging) { You("undergo a freakish metamorphosis!"); polyself(FALSE); } } break; /* more odd messages --JJB */ case 11: You_hear("clanking from the pipes..."); break; case 12: You_hear("snatches of song from among the sewers..."); break; case 19: if (Hallucination) { pline("From the murky drain, a hand reaches up... --oops--"); break; } default: You("take a sip of %s water.", rn2(3) ? (rn2(2) ? "cold" : "warm") : "hot"); } } void drinktoilet() { if (Levitation) { floating_above("toilet"); return; } if ((youmonst.data->mlet == S_DOG) && (rn2(5))){ pline("The toilet water is quite refreshing!"); u.uhunger += 10; return; } switch(rn2(9)) { /* static NEARDATA struct obj *otmp; */ case 0: if (mvitals[PM_SEWER_RAT].mvflags & G_GONE) pline("The toilet seems quite dirty."); else { static NEARDATA struct monst *mtmp; mtmp = makemon(&mons[PM_SEWER_RAT], u.ux, u.uy, NO_MM_FLAGS); pline("Eek! There's %s in the toilet!", Blind ? "something squirmy" : a_monnam(mtmp)); } break; case 1: breaktoilet(u.ux,u.uy); break; case 2: pline("Something begins to crawl out of the toilet!"); if (mvitals[PM_BROWN_PUDDING].mvflags & G_GONE || !makemon(&mons[PM_BROWN_PUDDING], u.ux, u.uy, NO_MM_FLAGS)) pline("But it slithers back out of sight."); break; case 3: case 4: if (mvitals[PM_BABY_CROCODILE].mvflags & G_GONE) pline("The toilet smells fishy."); else { static NEARDATA struct monst *mtmp; mtmp = makemon(&mons[PM_BABY_CROCODILE], u.ux, u.uy, NO_MM_FLAGS); pline("Egad! There's %s in the toilet!", Blind ? "something squirmy" : a_monnam(mtmp)); } break; default: pline("Gaggg... this tastes like sewage! You vomit."); morehungry(rn1(30-ACURR(A_CON), 11)); vomit(); } } #endif /* SINKS */ void whetstone_fountain_effects(obj) register struct obj *obj; { if (Levitation) { floating_above("fountain"); return; } switch (rnd(30)) { case 10: /* Curse the item */ curse(obj); break; case 11: case 12: case 13: case 14: /* Uncurse the item */ if(obj->cursed) { if (!Blind) pline_The("water glows for a moment."); uncurse(obj); } else { pline("A feeling of loss comes over you."); } break; case 15: case 16: /* Water Demon */ dowaterdemon(); break; case 17: case 18: /* Water Nymph */ dowaternymph(); break; case 19: case 20: /* an Endless Stream of Snakes */ dowatersnakes(); break; case 21: case 22: case 23: /* Find a gem */ if (!FOUNTAIN_IS_LOOTED(u.ux,u.uy)) { dofindgem(); break; } case 24: case 25: /* Water gushes forth */ dogushforth(FALSE); break; case 26: /* Strange feeling */ pline("A strange tingling runs up your %s.", body_part(ARM)); break; case 27: /* Strange feeling */ You_feel("a sudden chill."); 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!"); CLEAR_FOUNTAIN_LOOTED(u.ux,u.uy); 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 == COIN_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 */ /* We make fountains have more coins the closer you are to the * surface. After all, there will have been more people going * by. Just like a shopping mall! Chris Woodbury */ if (levl[u.ux][u.uy].looted) break; levl[u.ux][u.uy].looted |= F_LOOTED; (void) mkgold((long) (rnd((dunlevs_in_dungeon(&u.uz)-dunlev(&u.uz)+1)*2)+5), u.ux, u.uy); if (!Blind) pline("Far below you, you see coins glistening in the water."); exercise(A_WIS, TRUE); newsym(u.ux,u.uy); break; } update_inventory(); dryup(u.ux, u.uy, TRUE); } #ifdef SINKS void whetstone_toilet_effects(obj) register struct obj *obj; { if (Levitation) { floating_above("toilet"); return; } if(is_poisonable(obj)) { if (flags.verbose) You("cover it in filth."); obj->opoisoned = TRUE; } if (flags.verbose) pline("Yuck!"); } void whetstone_sink_effects(obj) register struct obj *obj; { struct monst *mtmp; if (Levitation) { floating_above("sink"); return; } switch(rn2(20)) { case 0: if (mvitals[PM_SEWER_RAT].mvflags & G_GONE) pline_The("sink seems quite dirty."); else { mtmp = makemon(&mons[PM_SEWER_RAT], u.ux, u.uy, NO_MM_FLAGS); pline("Eek! There's %s in the sink!", Blind ? "something squirmy" : a_monnam(mtmp)); } break; case 1: if (!(levl[u.ux][u.uy].looted & S_LRING)) { You("find a ring in the sink!"); (void) mkobj_at(RING_CLASS, u.ux, u.uy, TRUE); levl[u.ux][u.uy].looted |= S_LRING; exercise(A_WIS, TRUE); newsym(u.ux,u.uy); } else pline("Some dirty water backs up in the drain."); break; case 2: breaksink(u.ux,u.uy); break; case 3: pline_The("water moves as though of its own will!"); if ((mvitals[PM_WATER_ELEMENTAL].mvflags & G_GONE) || !makemon(&mons[PM_WATER_ELEMENTAL], u.ux, u.uy, NO_MM_FLAGS)) pline("But it quiets down."); break; case 4: pline("This water contains toxic wastes!"); obj = poly_obj(obj, STRANGE_OBJECT); u.uconduct.polypiles++; break; case 5: You_hear("clanking from the pipes..."); break; case 6: You_hear("snatches of song from among the sewers..."); break; case 19: if (Hallucination) { pline("From the murky drain, a hand reaches up... --oops--"); break; } default: break; } } #endif /* SINKS */ /*fountain.c*/ slashem-0.0.7E7F3/src/sit.c0000664000076400007640000002671210545462317013416 0ustar aliali/* SCCS Id: @(#)sit.c 3.4 2002/09/21 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" #include "artifact.h" void take_gold() { #ifndef GOLDOBJ if (u.ugold <= 0) { You_feel("a strange sensation."); } else { You("notice you have no gold!"); u.ugold = 0; flags.botl = 1; } #else struct obj *otmp, *nobj; int lost_money = 0; for (otmp = invent; otmp; otmp = nobj) { nobj = otmp->nobj; if (otmp->oclass == COIN_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 dosit() { static const char sit_message[] = "sit on the %s."; register struct trap *trap; register int typ = levl[u.ux][u.uy].typ; #ifdef STEED if (u.usteed) { You("are already sitting on %s.", mon_nam(u.usteed)); return (0); } #endif if(!can_reach_floor()) { if (Levitation) You("tumble in place."); 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)) { register struct obj *obj; 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 || (u.utrap && (u.utraptype >= TT_LAVA))) { if (u.utrap) { exercise(A_WIS, FALSE); /* you're getting stuck longer */ if(u.utraptype == TT_BEARTRAP) { You_cant("sit down with your %s in the bear trap.", body_part(FOOT)); u.utrap++; } else if(u.utraptype == TT_PIT) { if(trap->ttyp == SPIKED_PIT) { You("sit down on a spike. Ouch!"); losehp(1, "sitting on an iron spike", KILLED_BY); exercise(A_STR, FALSE); } else You("sit down in the pit."); u.utrap += rn2(5); } else if(u.utraptype == TT_WEB) { You("sit in the spider web and get entangled further!"); u.utrap += rn1(10, 5); } else if(u.utraptype == TT_LAVA) { /* Must have fire resistance or they'd be dead already */ You("sit in the lava!"); u.utrap += rnd(4); losehp(d(2,10), "sitting in lava", KILLED_BY); } else if(u.utraptype == TT_INFLOOR) { You_cant("maneuver to sit!"); u.utrap++; } } else { You("sit down."); dotrap(trap, 0); } } else if(Underwater || Is_waterlevel(&u.uz)) { if (Is_waterlevel(&u.uz)) There("are no cushions floating nearby."); 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); else if (!rn2(10) && uarmf && uarmf->otyp != WATER_WALKING_BOOTS) (void) rust_dmg(uarm, "armor", 1, TRUE, &youmonst); #ifdef SINKS } else if(IS_SINK(typ)) { You(sit_message, defsyms[S_sink].explanation); Your("%s gets wet.", humanoid(youmonst.data) ? "rump" : "underside"); } else if(IS_TOILET(typ)) { You(sit_message, defsyms[S_toilet].explanation); if ((!Sick) && (u.uhs > 0)) You("don't have to go..."); else { if (Role_if(PM_BARBARIAN) || Role_if(PM_CAVEMAN)) You("miss..."); else You("grunt."); if (Sick) make_sick(0L, (char *)0, TRUE, SICK_ALL); if (u.uhs == 0) morehungry(rn2(400)+200); } #endif } else if(IS_ALTAR(typ)) { You(sit_message, defsyms[S_altar].explanation); altar_wrath(u.ux, u.uy); } else if(IS_GRAVE(typ)) { You(sit_message, defsyms[S_grave].explanation); } else if(typ == STAIRS) { You(sit_message, "stairs"); } else if(typ == LADDER) { You(sit_message, "ladder"); } else if (is_lava(u.ux, u.uy)) { /* must be WWalking */ You(sit_message, "lava"); burn_away_slime(); if (likes_lava(youmonst.data)) { pline_The("lava feels warm."); return 1; } pline_The("lava burns you!"); if (Slimed) { pline("The slime is burned away!"); Slimed = 0; } losehp(d((Fire_resistance ? 2 : 10), 10), "sitting on lava", KILLED_BY); } else if (is_ice(u.ux, u.uy)) { You(sit_message, defsyms[S_ice].explanation); if (!Cold_resistance) pline_The("ice feels cold."); } else if (typ == DRAWBRIDGE_DOWN) { You(sit_message, "drawbridge"); } else if(IS_THRONE(typ)) { You(sit_message, defsyms[S_throne].explanation); if (rnd(6) > 4) { switch (rnd(13)) { case 1: (void) adjattrib(rn2(A_MAX), -rn1(4,3), FALSE); losehp(rnd(10), "cursed throne", KILLED_BY_AN); break; case 2: (void) adjattrib(rn2(A_MAX), 1, FALSE); break; case 3: pline("A%s electric shock shoots through your body!", (Shock_resistance) ? "n" : " massive"); losehp(Shock_resistance ? rnd(6) : rnd(30), "electric chair", KILLED_BY_AN); exercise(A_CON, FALSE); break; case 4: You_feel("much, much better!"); if (Upolyd) { if (u.mh >= (u.mhmax - 5)) u.mhmax += 4; u.mh = u.mhmax; } if(u.uhp >= (u.uhpmax - 5)) u.uhpmax += 4; u.uhp = u.uhpmax; make_blinded(0L,TRUE); make_sick(0L, (char *) 0, FALSE, SICK_ALL); heal_legs(); flags.botl = 1; break; case 5: take_gold(); break; case 6: /* ------------===========STEPHEN WHITE'S NEW CODE============------------ */ if(u.uluck < 7) { You_feel("your luck is changing."); change_luck(5); } else makewish(); break; case 7: { register int cnt = rnd(10); pline("A voice echoes:"); verbalize("Thy audience hath been summoned, %s!", flags.female ? "Dame" : "Sire"); while(cnt--) (void) makemon(courtmon(), u.ux, u.uy, NO_MM_FLAGS); break; } case 8: 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:"); verbalize("A curse upon thee for sitting upon this most holy throne!"); if (Luck > 0) { make_blinded(Blinded + rn1(100,250),TRUE); } else rndcurse(); break; case 10: if (Luck < 0 || (HSee_invisible & INTRINSIC)) { if (level.flags.nommap) { pline( "A terrible drone fills your head!"); make_confused(HConfusion + rnd(30), FALSE); } else { pline("An image forms in your mind."); do_mapping(); } } else { Your("vision becomes clear."); HSee_invisible |= FROMOUTSIDE; newsym(u.ux, u.uy); } break; case 11: if (Luck < 0) { You_feel("threatened."); aggravate(); } else { You_feel("a wrenching sensation."); tele(); /* teleport him */ } break; case 12: You("are granted an insight!"); if (invent) { /* rn2(5) agrees w/seffects() */ identify_pack(rn2(5)); } break; case 13: Your("mind turns into a pretzel!"); make_confused(HConfusion + rn1(7,16),FALSE); break; 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 */ levl[u.ux][u.uy].typ = ROOM; pline_The("throne vanishes in a puff of logic."); newsym(u.ux,u.uy); } } else if (lays_eggs(youmonst.data)) { struct obj *uegg; if (!flags.female) { pline("Males can't lay eggs!"); return 0; } if (u.uhunger < (int)objects[EGG].oc_nutrition) { You("don't have enough energy to lay an egg."); return 0; } uegg = mksobj(EGG, FALSE, FALSE); uegg->spe = 1; uegg->quan = 1; uegg->owt = weight(uegg); uegg->corpsenm = egg_type_from_parent(u.umonnum, FALSE); uegg->known = uegg->dknown = 1; attach_egg_hatch_timeout(uegg); You("lay an egg."); dropy(uegg); stackobj(uegg); morehungry((int)objects[EGG].oc_nutrition); } else if (u.uswallow) There("are no seats in here!"); else pline("Having fun sitting on the %s?", surface(u.ux,u.uy)); return(1); } void rndcurse() /* curse a few inventory items at random! */ { int nobj = 0; int cnt, onum; struct obj *otmp; static const char mal_aura[] = "feel a malignant aura surround %s."; if (uwep && (uwep->oartifact == ART_MAGICBANE) && rn2(20)) { You(mal_aura, "the magic-absorbing blade"); return; } if(Antimagic) { shieldeff(u.ux, u.uy); You(mal_aura, "you"); } for (otmp = invent; otmp; otmp = otmp->nobj) { #ifdef GOLDOBJ /* gold isn't subject to being cursed or blessed */ if (otmp->oclass == COIN_CLASS) continue; #endif nobj++; } if (nobj) { for (cnt = rnd(6/((!!Antimagic) + (!!Half_spell_damage) + 1)); cnt > 0; cnt--) { onum = rnd(nobj); for (otmp = invent; otmp; otmp = otmp->nobj) { #ifdef GOLDOBJ /* as above */ if (otmp->oclass == COIN_CLASS) continue; #endif if (--onum == 0) break; /* found the target */ } /* the !otmp case should never happen; picking an already cursed item happens--avoid "resists" message in that case */ if (!otmp || otmp->cursed) continue; /* next target */ if(otmp->oartifact && spec_ability(otmp, SPFX_INTEL) && rn2(10) < 8) { pline("%s!", Tobjnam(otmp, "resist")); continue; } if(otmp->blessed) unbless(otmp); else curse(otmp); } update_inventory(); } #ifdef STEED /* treat steed's saddle as extended part of hero's inventory */ if (u.usteed && !rn2(4) && (otmp = which_armor(u.usteed, W_SADDLE)) != 0 && !otmp->cursed) { /* skip if already cursed */ if (otmp->blessed) unbless(otmp); else curse(otmp); if (!Blind) { pline("%s %s %s.", s_suffix(upstart(y_monnam(u.usteed))), aobjnam(otmp, "glow"), hcolor(otmp->cursed ? NH_BLACK : (const char *)"brown")); otmp->bknown = TRUE; } } #endif /*STEED*/ } void attrcurse() /* remove a random INTRINSIC ability */ { switch(rnd(11)) { case 1 : if (HFire_resistance & INTRINSIC) { HFire_resistance &= ~INTRINSIC; You_feel("warmer."); break; } case 2 : if (HTeleportation & INTRINSIC) { HTeleportation &= ~INTRINSIC; You_feel("less jumpy."); break; } case 3 : if (HPoison_resistance & INTRINSIC) { HPoison_resistance &= ~INTRINSIC; You_feel("a little sick!"); break; } case 4 : if (HTelepat & INTRINSIC) { HTelepat &= ~INTRINSIC; if (Blind && !Blind_telepat) see_monsters(); /* Can't sense mons anymore! */ Your("senses fail!"); break; } case 5 : if (HCold_resistance & INTRINSIC) { HCold_resistance &= ~INTRINSIC; You_feel("cooler."); break; } case 6 : if (HInvis & INTRINSIC) { HInvis &= ~INTRINSIC; You_feel("paranoid."); break; } case 7 : if (HSee_invisible & INTRINSIC) { HSee_invisible &= ~INTRINSIC; You("%s!", Hallucination ? "tawt you taw a puttie tat" : "thought you saw something"); break; } case 8 : if (HFast & INTRINSIC) { HFast &= ~INTRINSIC; You_feel("slower."); break; } case 9 : if (HStealth & INTRINSIC) { HStealth &= ~INTRINSIC; You_feel("clumsy."); break; } case 10: if (HProtection & INTRINSIC) { HProtection &= ~INTRINSIC; You_feel("vulnerable."); break; } case 11: if (HAggravate_monster & INTRINSIC) { HAggravate_monster &= ~INTRINSIC; You_feel("less attractive."); break; } default: break; } } /*sit.c*/ slashem-0.0.7E7F3/src/spell.c0000664000076400007640000012066610545462317013741 0ustar aliali/* SCCS Id: @(#)spell.c 3.4 2003/01/17 */ /* Copyright (c) M. Stephenson 1988 */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" #include "edog.h" /* Are now ints */ static NEARDATA int delay; /* moves left for this spell */ static NEARDATA int end_delay; /* when to stop studying */ static NEARDATA struct obj *book; /* last/current book being xscribed */ /* spellmenu arguments; 0 thru n-1 used as spl_book[] index when swapping */ #define SPELLMENU_CAST (-2) #define SPELLMENU_VIEW (-1) #define KEEN 10000 /* memory increase reading the book */ #define CAST_BOOST 500 /* memory increase for successful casting */ #define MAX_KNOW 70000 /* Absolute Max timeout */ #define MAX_CAN_STUDY 60000 /* Can study while timeout is less than */ #define MAX_STUDY_TIME 300 /* Max time for one study session */ #define MAX_SPELL_STUDY 30 /* Uses before spellbook crumbles */ #define spellknow(spell) spl_book[spell].sp_know #define incrnknow(spell) spl_book[spell].sp_know = ((spl_book[spell].sp_know < 1) ? KEEN \ : ((spl_book[spell].sp_know + KEEN) > MAX_KNOW) ? MAX_KNOW \ : spl_book[spell].sp_know + KEEN) #define boostknow(spell,boost) spl_book[spell].sp_know = ((spl_book[spell].sp_know + boost > MAX_KNOW) ? MAX_KNOW \ : spl_book[spell].sp_know + boost) #define spellev(spell) spl_book[spell].sp_lev #define spellid(spell) spl_book[spell].sp_id #define spellname(spell) OBJ_NAME(objects[spellid(spell)]) #define spellet(spell) \ ((char)((spell < 26) ? ('a' + spell) : \ (spell < 52) ? ('A' + spell - 26) : \ (spell < 62) ? ('0' + spell - 52) : 0 )) STATIC_DCL int FDECL(spell_let_to_idx, (CHAR_P)); STATIC_DCL boolean FDECL(cursed_book, (struct obj *bp)); STATIC_DCL boolean FDECL(confused_book, (struct obj *)); STATIC_DCL void FDECL(deadbook, (struct obj *)); STATIC_PTR int NDECL(learn); STATIC_DCL void NDECL(do_reset_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 void NDECL(cast_protection); STATIC_DCL void FDECL(spell_backfire, (int)); 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(). * * Reasoning: * splcaster, special: * Arc are aware of magic through historical research * Bar abhor magic (Conan finds it "interferes with his animal instincts") * Cav are ignorant to magic * Hea are very aware of healing magic through medical research * Kni are moderately aware of healing from Paladin training * Mon use magic to attack and defend in lieu of weapons and armor * Pri are very aware of healing magic through theological research * Ran avoid magic, preferring to fight unseen and unheard * Rog are moderately aware of magic through trickery * Sam have limited magical awareness, prefering meditation to conjuring * Tou are aware of magic from all the great films they have seen * Val have limited magical awareness, prefering fighting * Wiz are trained mages * * 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. * * spelspec, spelsbon: * Arc map masters (SPE_MAGIC_MAPPING) * Bar fugue/berserker (SPE_HASTE_SELF) * Cav born to dig (SPE_DIG) * Hea to heal (SPE_CURE_SICKNESS) * Kni to turn back evil (SPE_TURN_UNDEAD) * Mon to preserve their abilities (SPE_RESTORE_ABILITY) * Pri to bless (SPE_REMOVE_CURSE) * Ran to hide (SPE_INVISIBILITY) * Rog to find loot (SPE_DETECT_TREASURE) * Sam to be At One (SPE_CLAIRVOYANCE) * Tou to smile (SPE_CHARM_MONSTER) * Val control lightning (SPE_LIGHTNING) * Wiz all really, but SPE_MAGIC_MISSILE is their party trick * Yeo guard doors (SPE_KNOCK) * * See percent_success() below for more comments. * * uarmbon, uarmsbon, uarmhbon, uarmgbon, uarmfbon: * Fighters find body armour & shield a little less limiting. * Headgear, Gauntlets and Footwear are not role-specific (but * still have an effect, except helm of brilliance, which is designed * to permit magic-use). */ #define uarmhbon 4 /* Metal helmets interfere with the mind */ #define uarmgbon 6 /* Casting channels through the hands */ #define uarmfbon 2 /* All metal interferes to some degree */ /* since the spellbook itself doesn't blow up, don't say just "explodes" */ static const char explodes[] = "radiates explosive energy"; /* convert an alnum into a number in the range 0..61, or -1 if not an alnum */ STATIC_OVL int spell_let_to_idx(ilet) char ilet; { int indx; indx = ilet - 'a'; if (indx >= 0 && indx < 26) return indx; indx = ilet - 'A'; if (indx >= 0 && indx < 26) return indx + 26; indx = ilet - '0'; if (indx >= 0 && indx < 10) return indx + 52; return -1; } /* TRUE: book should be destroyed by caller */ STATIC_OVL boolean cursed_book(bp) struct obj *bp; { int lev = objects[bp->otyp].oc_level; switch(rn2(lev)) { case 0: You_feel("a wrenching sensation."); tele(); /* teleport him */ break; case 1: You_feel("threatened."); aggravate(); break; case 2: /* [Tom] lowered this (used to be 100,250) */ make_blinded(Blinded + rn1(50,25),TRUE); break; case 3: take_gold(); break; case 4: pline("These runes were just too much to comprehend."); make_confused(HConfusion + rn1(7,16),FALSE); break; case 5: pline_The("book was coated with contact poison!"); if (uarmg) { 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"); break; } /* temp disable in_use; death should not destroy the book */ bp->in_use = FALSE; losestr(Poison_resistance ? rn1(2,1) : rn1(4,3)); losehp(rnd(Poison_resistance ? 6 : 10), "contact-poisoned spellbook", KILLED_BY_AN); bp->in_use = TRUE; break; case 6: if(Antimagic) { shieldeff(u.ux, u.uy); pline_The("book %s, but you are unharmed!", explodes); } else { pline("As you read the book, it %s in your %s!", explodes, body_part(FACE)); losehp(2*rnd(10)+5, "exploding rune", KILLED_BY_AN); } return TRUE; default: rndcurse(); break; } return FALSE; } /* study while confused: returns TRUE if the book is destroyed */ STATIC_OVL boolean confused_book(spellbook) struct obj *spellbook; { boolean gone = FALSE; if (!rn2(3) && spellbook->otyp != SPE_BOOK_OF_THE_DEAD) { spellbook->in_use = TRUE; /* in case called from learn */ pline( "Being confused you have difficulties in controlling your actions."); display_nhwindow(WIN_MESSAGE, FALSE); You("accidentally tear the spellbook to pieces."); if (!objects[spellbook->otyp].oc_name_known && !objects[spellbook->otyp].oc_uname) docall(spellbook); if (carried(spellbook)) useup(spellbook); else useupf(spellbook, 1L); gone = TRUE; } else { You("find yourself reading the %s line over and over again.", spellbook == book ? "next" : "first"); } return gone; } /* special effects for The Book of the Dead */ STATIC_OVL void deadbook(book2) struct obj *book2; { struct monst *mtmp, *mtmp2; coord mm; You("turn the pages of the Book of the Dead..."); makeknown(SPE_BOOK_OF_THE_DEAD); /* KMH -- Need ->known to avoid "_a_ Book of the Dead" */ book2->known = 1; if(invocation_pos(u.ux, u.uy) && !On_stairs(u.ux, u.uy)) { register struct obj *otmp; register boolean arti1_primed = FALSE, arti2_primed = FALSE, arti_cursed = FALSE; if(book2->cursed) { pline_The("runes appear scrambled. You can't read them!"); return; } if(!u.uhave.bell || !u.uhave.menorah) { pline("A chill runs down your %s.", body_part(SPINE)); if(!u.uhave.bell) You_hear("a faint chime..."); if(!u.uhave.menorah) pline("Vlad's doppelganger is amused."); return; } for(otmp = invent; otmp; otmp = otmp->nobj) { if(otmp->otyp == CANDELABRUM_OF_INVOCATION && otmp->spe == 7 && otmp->lamplit) { if(!otmp->cursed) arti1_primed = TRUE; else arti_cursed = TRUE; } if(otmp->otyp == BELL_OF_OPENING && (moves - otmp->age) < 5L) { /* you rang it recently */ if(!otmp->cursed) arti2_primed = TRUE; else arti_cursed = TRUE; } } if(arti_cursed) { pline_The("invocation fails!"); pline("At least one of your artifacts is cursed..."); } else if(arti1_primed && arti2_primed) { unsigned soon = (unsigned) d(2,6); /* time til next intervene() */ /* successful invocation */ mkinvokearea(); u.uevent.invoked = 1; /* in case you haven't killed the Wizard yet, behave as if you just did */ u.uevent.udemigod = 1; /* wizdead() */ if (!u.udg_cnt || u.udg_cnt > soon) u.udg_cnt = soon; } else { /* at least one artifact not prepared properly */ You("have a feeling that %s is amiss...", something); goto raise_dead; } return; } /* when not an invocation situation */ if (book2->cursed) { raise_dead: You("raised the dead!"); /* first maybe place a dangerous adversary */ if (!rn2(3) && ((mtmp = makemon(&mons[PM_MASTER_LICH], u.ux, u.uy, NO_MINVENT)) != 0 || (mtmp = makemon(&mons[PM_NALFESHNEE], u.ux, u.uy, NO_MINVENT)) != 0)) { mtmp->mpeaceful = 0; set_malign(mtmp); } /* next handle the affect on things you're carrying */ (void) unturn_dead(&youmonst); /* last place some monsters around you */ mm.x = u.ux; mm.y = u.uy; mkundead(&mm, TRUE, NO_MINVENT); } 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) if (mtmp->mtame) { if (mtmp->mtame < 20) mtmp->mtame++; } else (void) tamedog(mtmp, (struct obj *)0); else monflee(mtmp, 0, FALSE, TRUE); } } } else { switch(rn2(3)) { case 0: Your("ancestors are annoyed with you!"); break; case 1: pline_The("headstones in the cemetery begin to move!"); break; default: pline("Oh my! Your name appears in the book!"); } } return; } STATIC_PTR int learn() { int i; short booktype; char splname[BUFSZ]; boolean costly = TRUE; if (!book || !(carried(book) || (book->where == OBJ_FLOOR && book->ox == u.ux && book->oy == u.uy))) { /* maybe it was stolen or polymorphed? */ do_reset_learn(); return(0); } /* JDS: lenses give 50% faster reading; 33% smaller read time */ if (delay < end_delay && ublindf && ublindf->otyp == LENSES && rn2(2)) delay++; if (Confusion) { /* became confused while learning */ (void) confused_book(book); book = 0; /* no longer studying */ nomul(delay - end_delay); /* remaining delay is uninterrupted */ delay = end_delay; return(0); } if (delay < end_delay) { /* not if (delay++), so at end delay == 0 */ delay++; return(1); /* still busy */ } exercise(A_WIS, TRUE); /* you're studying. */ booktype = book->otyp; if(booktype == SPE_BOOK_OF_THE_DEAD) { deadbook(book); return(0); } Sprintf(splname, objects[booktype].oc_name_known ? "\"%s\"" : "the \"%s\" spell", OBJ_NAME(objects[booktype])); for (i = 0; i < MAXSPELL; i++) { if (spellid(i) == booktype) { if (book->spestudied > MAX_SPELL_STUDY) { pline("This spellbook is too faint to be read anymore."); book->otyp = booktype = SPE_BLANK_PAPER; } else if (spellknow(i) <= MAX_CAN_STUDY) { Your("knowledge of that spell is keener."); incrnknow(i); book->spestudied++; if (end_delay) { boostknow(i, end_delay * (book->spe > 0 ? 20 : 10)); use_skill(spell_skilltype(book->otyp), end_delay / (book->spe > 0 ? 10 : 20)); } exercise(A_WIS, TRUE); /* extra study */ } else { /* MAX_CAN_STUDY < spellknow(i) <= MAX_SPELL_STUDY */ You("know %s quite well already.", splname); costly = FALSE; } /* make book become known even when spell is already known, in case amnesia made you forget the book */ makeknown((int)booktype); break; } else if (spellid(i) == NO_SPELL) { spl_book[i].sp_id = booktype; spl_book[i].sp_lev = objects[booktype].oc_level; incrnknow(i); book->spestudied++; You("have keen knowledge of the spell."); You(i > 0 ? "add %s to your repertoire." : "learn %s.", splname); makeknown((int)booktype); break; } } if (i == MAXSPELL) impossible("Too many spells memorized!"); if (book->cursed) { /* maybe a demon cursed it */ if (cursed_book(book)) { if (carried(book)) useup(book); else useupf(book, 1L); book = 0; return 0; } } if (costly) check_unpaid(book); book = 0; return(0); } int study_book(spellbook) register struct obj *spellbook; { register int booktype = spellbook->otyp; register boolean confused = (Confusion != 0); boolean too_hard = FALSE; if (delay && !confused && spellbook == book && /* handle the sequence: start reading, get interrupted, have book become erased somehow, resume reading it */ booktype != SPE_BLANK_PAPER) { You("continue your efforts to memorize the spell."); } else { /* KMH -- Simplified this code */ if (booktype == SPE_BLANK_PAPER) { pline("This spellbook is all blank."); makeknown(booktype); return(1); } if (spellbook->spe && confused) { check_unpaid_usage(spellbook, TRUE); consume_obj_charge(spellbook, FALSE); pline_The("words on the page seem to glow faintly purple."); You_cant("quite make them out."); return 1; } switch (objects[booktype].oc_level) { case 1: case 2: delay = -objects[booktype].oc_delay; break; case 3: case 4: delay = -(objects[booktype].oc_level - 1) * objects[booktype].oc_delay; break; case 5: case 6: delay = -objects[booktype].oc_level * objects[booktype].oc_delay; break; case 7: delay = -8 * objects[booktype].oc_delay; break; default: impossible("Unknown spellbook level %d, book %d;", objects[booktype].oc_level, booktype); return 0; } /* 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 && !confused && !spellbook->spe) { 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 && (spellbook->cursed || !spellbook->spe)) { boolean gone = cursed_book(spellbook); nomul(delay); /* study time */ delay = 0; if(gone || !rn2(3)) { if (!gone) pline_The("spellbook crumbles to dust!"); if (!objects[spellbook->otyp].oc_name_known && !objects[spellbook->otyp].oc_uname) docall(spellbook); if (carried(spellbook)) useup(spellbook); else useupf(spellbook, 1L); } else spellbook->in_use = FALSE; return(1); } else if (confused) { if (!confused_book(spellbook)) { spellbook->in_use = FALSE; } nomul(delay); delay = 0; return(1); } spellbook->in_use = FALSE; /* The glowing words make studying easier */ if (spellbook->otyp != SPE_BOOK_OF_THE_DEAD) { delay *= 2; if (spellbook->spe) { check_unpaid_usage(spellbook, TRUE); consume_obj_charge(spellbook, FALSE); pline_The("words on the page seem to glow faintly."); if (!too_hard) delay /= 3; } } end_delay = 0; /* Changed if multi != 0 */ #ifdef DEBUG pline("Delay: %i", delay); #endif if (multi) { /* Count == practice reading :) */ char qbuf[QBUFSZ]; if (multi + 1 > MAX_STUDY_TIME) multi = MAX_STUDY_TIME - 1; Sprintf(qbuf, "Study for at least %i turns?", (multi+1)); if (ynq(qbuf) != 'y') { multi = 0; return(1); } if ((--multi) > (-delay)) end_delay = multi + delay; multi = 0; #ifdef DEBUG pline("end_delay: %i", end_delay); #endif } You("begin to %s the runes.", spellbook->otyp == SPE_BOOK_OF_THE_DEAD ? "recite" : "memorize"); } book = spellbook; set_occupation(learn, "studying", 0); 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 */ void book_substitution(old_obj, new_obj) struct obj *old_obj, *new_obj; { if (old_obj == book) book = new_obj; } static void do_reset_learn() { stop_occupation(); } /* called from moveloop() */ void age_spells() { int i; /* * The time relative to the hero (a pass through move * loop) causes all spell knowledge to be decremented. * The hero's speed, rest status, conscious status etc. * does not alter the loss of memory. */ for (i = 0; i < MAXSPELL && spellid(i) != NO_SPELL; i++) if (spellknow(i)) decrnknow(i); return; } /* * 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; { int nspells, idx; char ilet, lets[BUFSZ], qbuf[QBUFSZ]; if (spellid(0) == NO_SPELL) { You("don't know any spells right now."); return FALSE; } if (flags.menu_style == MENU_TRADITIONAL) { /* we know there is at least 1 known spell */ for (nspells = 1; nspells < MAXSPELL && spellid(nspells) != NO_SPELL; nspells++) continue; if (nspells == 1) Strcpy(lets, "a"); else if (nspells < 27) Sprintf(lets, "a-%c", 'a' + nspells - 1); else if (nspells == 27) Sprintf(lets, "a-z A"); else if (nspells < 53) Sprintf(lets, "a-z A-%c", 'A' + nspells - 27); else if (nspells == 53) Sprintf(lets, "a-z A-Z 0"); else if (nspells < 62) Sprintf(lets, "a-z A-Z 0-%c", '0' + nspells - 53); else Sprintf(lets, "a-z A-Z 0-9"); for(;;) { Sprintf(qbuf, "Cast which spell? [%s ?]", lets); if ((ilet = yn_function(qbuf, (char *)0, '\0')) == '?') break; if (index(quitchars, ilet)) return FALSE; idx = spell_let_to_idx(ilet); if (idx >= 0 && idx < nspells) { *spell_no = idx; return TRUE; } else You("don't know that spell."); } } return dospellmenu("Choose which spell to cast", SPELLMENU_CAST, spell_no); } /* the 'Z' command -- cast a spell */ int docast() { int spell_no; if (getspell(&spell_no)) return spelleffects(spell_no, FALSE); return 0; } STATIC_OVL const char* spelltypemnemonic(int skill) { switch (skill) { case P_ATTACK_SPELL: return " attack"; case P_HEALING_SPELL: return "healing"; case P_DIVINATION_SPELL: return " divine"; case P_ENCHANTMENT_SPELL: return "enchant"; case P_PROTECTION_SPELL: return "protect"; case P_BODY_SPELL: return " body"; case P_MATTER_SPELL: return " matter"; default: impossible("Unknown spell skill, %d;", skill); return ""; } } int spell_skilltype(booktype) int booktype; { return (objects[booktype].oc_skill); } STATIC_OVL void cast_protection() { int loglev = 0; int l = u.ulevel; int natac = u.uac - u.uspellprot; int gain; /* loglev=log2(u.ulevel)+1 (1..5) */ while (l) { loglev++; l /= 2; } /* The more u.uspellprot you already have, the less you get, * and the better your natural ac, the less you get. * * LEVEL AC SPELLPROT from sucessive SPE_PROTECTION casts * 1 10 0, 1, 2, 3, 4 * 1 0 0, 1, 2, 3 * 1 -10 0, 1, 2 * 2-3 10 0, 2, 4, 5, 6, 7, 8 * 2-3 0 0, 2, 4, 5, 6 * 2-3 -10 0, 2, 3, 4 * 4-7 10 0, 3, 6, 8, 9, 10, 11, 12 * 4-7 0 0, 3, 5, 7, 8, 9 * 4-7 -10 0, 3, 5, 6 * 7-15 -10 0, 3, 5, 6 * 8-15 10 0, 4, 7, 10, 12, 13, 14, 15, 16 * 8-15 0 0, 4, 7, 9, 10, 11, 12 * 8-15 -10 0, 4, 6, 7, 8 * 16-30 10 0, 5, 9, 12, 14, 16, 17, 18, 19, 20 * 16-30 0 0, 5, 9, 11, 13, 14, 15 * 16-30 -10 0, 5, 8, 9, 10 */ gain = loglev - (int)u.uspellprot / (4 - min(3,(10 - natac)/10)); if (gain > 0) { if (!Blind) { const char *hgolden = hcolor(NH_GOLDEN); if (u.uspellprot) pline_The("%s haze around you becomes more dense.", hgolden); else pline_The("%s around you begins to shimmer with %s haze.", /*[ what about being inside solid rock while polyd? ]*/ (Underwater || Is_waterlevel(&u.uz)) ? "water" : "air", an(hgolden)); } u.uspellprot += gain; u.uspmtime = P_SKILL(spell_skilltype(SPE_PROTECTION)) == P_EXPERT ? 20 : 10; if (!u.usptime) u.usptime = u.uspmtime; find_ac(); } else { Your("skin feels warm for a moment."); } } /* attempting to cast a forgotten spell will cause disorientation */ STATIC_OVL void spell_backfire(spell) int spell; { long duration = (long)((spellev(spell) + 1) * 3); /* 6..24 */ /* prior to 3.4.1, the only effect was confusion; it still predominates */ switch (rn2(10)) { case 0: case 1: case 2: case 3: make_confused(duration, FALSE); /* 40% */ break; case 4: case 5: case 6: make_confused(2L * duration / 3L, FALSE); /* 30% */ make_stunned(duration / 3L, FALSE); break; case 7: case 8: make_stunned(2L * duration / 3L, FALSE); /* 20% */ make_confused(duration / 3L, FALSE); break; case 9: make_stunned(duration, FALSE); /* 10% */ break; } return; } int spelleffects(spell, atme) int spell; boolean atme; { int energy, damage, chance, n, intell; int hungr; int skill, role_skill; boolean confused = (Confusion != 0); struct obj *pseudo; /* * Find the skill the hero has in a spell type category. * See spell_skilltype for categories. */ skill = spell_skilltype(spellid(spell)); role_skill = P_SKILL(skill); /* * Spell casting no longer affects knowledge of the spell. A * decrement of spell knowledge is done every turn. */ if (spellknow(spell) <= 0) { Your("knowledge of this spell is twisted."); pline("It invokes nightmarish images in your mind..."); spell_backfire(spell); return(0); } else if (spellknow(spell) <= 100) { You("strain to recall the spell."); } else if (spellknow(spell) <= 1000) { Your("knowledge of this spell is growing faint."); } energy = (spellev(spell) * 5); /* 5 <= energy <= 35 */ if (u.uhunger <= 10 && spellid(spell) != SPE_DETECT_FOOD) { You("are too hungry to cast that spell."); return(0); } else if (ACURR(A_STR) < 4) { You("lack the strength to cast spells."); return(0); } else if(check_capacity( "Your concentration falters while carrying so much stuff.")) { return (1); } else if (!freehand()) { Your("arms are not free to cast!"); return (0); } if (u.uhave.amulet) { You_feel("the amulet draining your energy away."); energy += rnd(2*energy); } if (spellid(spell) != SPE_DETECT_FOOD) { hungr = energy * 2; /* If hero is a wizard, their current intelligence * (bonuses + temporary + current) * affects hunger reduction in casting a spell. * 1. int = 17-18 no reduction * 2. int = 16 1/4 hungr * 3. int = 15 1/2 hungr * 4. int = 1-14 normal reduction * The reason for this is: * a) Intelligence affects the amount of exertion * in thinking. * b) Wizards have spent their life at magic and * understand quite well how to cast spells. */ intell = acurr(A_INT); if (!Role_if(PM_WIZARD)) intell = 10; switch (intell) { case 25: case 24: case 23: case 22: case 21: case 20: case 19: case 18: case 17: hungr = 0; break; case 16: hungr /= 4; break; case 15: hungr /= 2; break; } } else hungr = 0; /* don't put player (quite) into fainting from * casting a spell, particularly since they might * not even be hungry at the beginning; however, * this is low enough that they must eat before * casting anything else except detect food */ if (hungr > u.uhunger-3) hungr = u.uhunger-3; if (energy > u.uen) { You("don't have enough energy to cast that spell."); /* WAC/ALI Experts can override with HP/hunger loss */ if ((role_skill >= P_SKILLED) && (yn("Continue?") == 'y')) { energy -= u.uen; hungr += energy * 2; if (hungr > u.uhunger - 1) hungr = u.uhunger - 1; losehp(energy,"spellcasting exhaustion", KILLED_BY); if (role_skill < P_EXPERT) exercise(A_WIS, FALSE); energy = u.uen; } else return 0; } morehungry(hungr); chance = percent_success(spell); if (confused || (rnd(100) > chance)) { pline("You fail to cast the spell correctly."); #ifdef ALLEG_FX if (iflags.usealleg) alleg_aura(u.ux, u.uy, P_ATTACK_SPELL-1); #endif u.uen -= (energy / 2); flags.botl = 1; return(1); } u.uen -= energy; flags.botl = 1; exercise(A_WIS, TRUE); /* pseudo is a temporary "false" object containing the spell stats. */ pseudo = mksobj(spellid(spell), FALSE, FALSE); pseudo->blessed = pseudo->cursed = 0; pseudo->quan = 20L; /* do not let useup get it */ /* WAC -- If skilled enough, will act like a blessed version */ if (role_skill >= P_SKILLED) pseudo->blessed = 1; #ifdef ALLEG_FX if (iflags.usealleg) alleg_aura(u.ux, u.uy, skill); #endif switch(pseudo->otyp) { /* * At first spells act as expected. As the hero increases in skill * with the appropriate spell type, some spells increase in their * effects, e.g. more damage, further distance, and so on, without * additional cost to the spellcaster. */ case SPE_MAGIC_MISSILE: case SPE_FIREBALL: case SPE_CONE_OF_COLD: case SPE_LIGHTNING: case SPE_ACID_STREAM: case SPE_POISON_BLAST: if (tech_inuse(T_SIGIL_TEMPEST)) { weffects(pseudo); break; } /* else fall through... */ /* these spells are all duplicates of wand effects */ case SPE_FORCE_BOLT: case SPE_SLEEP: case SPE_KNOCK: case SPE_SLOW_MONSTER: case SPE_WIZARD_LOCK: case SPE_DIG: case SPE_TURN_UNDEAD: case SPE_POLYMORPH: case SPE_TELEPORT_AWAY: case SPE_CANCELLATION: case SPE_FINGER_OF_DEATH: case SPE_LIGHT: case SPE_DETECT_UNSEEN: case SPE_HEALING: case SPE_EXTRA_HEALING: case SPE_DRAIN_LIFE: case SPE_STONE_TO_FLESH: if (!(objects[pseudo->otyp].oc_dir == NODIR)) { if (atme) u.dx = u.dy = u.dz = 0; else if (!getdir((char *)0)) { /* getdir cancelled, re-use previous direction */ pline_The("magical energy is released!"); } 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 */ case SPE_REMOVE_CURSE: case SPE_CONFUSE_MONSTER: case SPE_DETECT_FOOD: case SPE_CAUSE_FEAR: #if 0 /* high skill yields effect equivalent to blessed scroll */ if (role_skill >= P_SKILLED) pseudo->blessed = 1; #endif /* fall through */ case SPE_CHARM_MONSTER: case SPE_MAGIC_MAPPING: case SPE_CREATE_MONSTER: case SPE_IDENTIFY: case SPE_COMMAND_UNDEAD: case SPE_SUMMON_UNDEAD: (void) seffects(pseudo); break; case SPE_ENCHANT_WEAPON: case SPE_ENCHANT_ARMOR: if (role_skill >= P_EXPERT) n = 8; else if (role_skill >= P_SKILLED) n = 10; else if (role_skill >= P_BASIC) n = 12; else n = 14; /* Unskilled or restricted */ if (!rn2(n)) { pseudo->blessed = 0; (void) seffects(pseudo); } else Your("enchantment failed!"); break; /* these are all duplicates of potion effects */ case SPE_HASTE_SELF: case SPE_DETECT_TREASURE: case SPE_DETECT_MONSTERS: case SPE_LEVITATION: case SPE_RESTORE_ABILITY: #if 0 /* high skill yields effect equivalent to blessed potion */ if (role_skill >= P_SKILLED) pseudo->blessed = 1; #endif /* fall through */ case SPE_INVISIBILITY: (void) peffects(pseudo); break; case SPE_CURE_BLINDNESS: healup(0, 0, FALSE, TRUE); break; case SPE_CURE_SICKNESS: if (Sick) You("are no longer ill."); if (Slimed) { pline_The("slime disappears!"); Slimed = 0; /* flags.botl = 1; -- healup() handles this */ } healup(0, 0, TRUE, FALSE); break; case SPE_CREATE_FAMILIAR: (void) make_familiar((struct obj *)0, u.ux, u.uy, FALSE); break; case SPE_CLAIRVOYANCE: if (!BClairvoyant) do_vicinity_map(); /* at present, only one thing blocks clairvoyance */ else if (uarmh && uarmh->otyp == CORNUTHAUM) You("sense a pointy hat on top of your %s.", body_part(HEAD)); break; case SPE_PROTECTION: cast_protection(); break; case SPE_JUMPING: if (!jump(max(role_skill,1))) pline(nothing_happens); break; case SPE_RESIST_POISON: if(!(HPoison_resistance & INTRINSIC)) { You("feel healthy ..... for the moment at least."); incr_itimeout(&HPoison_resistance, rn1(1000, 500) + spell_damage_bonus(spellid(spell))*100); } else pline(nothing_happens); /* Already have as intrinsic */ break; case SPE_RESIST_SLEEP: if(!(HSleep_resistance & INTRINSIC)) { if (Hallucination) pline("Too much coffee!"); else You("no longer feel tired."); incr_itimeout(&HSleep_resistance, rn1(1000, 500) + spell_damage_bonus(spellid(spell))*100); } else pline(nothing_happens); /* Already have as intrinsic */ break; case SPE_ENDURE_COLD: if(!(HCold_resistance & INTRINSIC)) { You("feel warmer."); incr_itimeout(&HCold_resistance, rn1(1000, 500) + spell_damage_bonus(spellid(spell))*100); } else pline(nothing_happens); /* Already have as intrinsic */ break; case SPE_ENDURE_HEAT: if(!(HFire_resistance & INTRINSIC)) { if (Hallucination) pline("Excellent! You feel, like, totally cool!"); else You("feel colder."); incr_itimeout(&HFire_resistance, rn1(1000, 500) + spell_damage_bonus(spellid(spell))*100); } else pline(nothing_happens); /* Already have as intrinsic */ break; case SPE_INSULATE: if(!(HShock_resistance & INTRINSIC)) { if (Hallucination) pline("Bummer! You've been grounded!"); else You("are not at all shocked by this feeling."); incr_itimeout(&HShock_resistance, rn1(1000, 500) + spell_damage_bonus(spellid(spell))*100); } else pline(nothing_happens); /* Already have as intrinsic */ break; case SPE_ENLIGHTEN: You("feel self-knowledgeable..."); display_nhwindow(WIN_MESSAGE, FALSE); enlightenment(FALSE); pline("The feeling subsides."); exercise(A_WIS, TRUE); break; /* WAC -- new spells */ case SPE_FLAME_SPHERE: case SPE_FREEZE_SPHERE: { register int cnt = 1; struct monst *mtmp; if (role_skill >= P_SKILLED) cnt += (role_skill - P_BASIC); while(cnt--) { mtmp = make_helper((pseudo->otyp == SPE_FLAME_SPHERE) ? PM_FLAMING_SPHERE : PM_FREEZING_SPHERE, u.ux, u.uy); if (!mtmp) continue; mtmp->mtame = 10; mtmp->mhpmax = mtmp->mhp = 1; mtmp->isspell = mtmp->uexp = TRUE; } /* end while... */ break; } /* KMH -- new spells */ case SPE_PASSWALL: if (!Passes_walls) You_feel("ethereal."); incr_itimeout(&HPasses_walls, rn1(100, 50)); break; default: impossible("Unknown spell %d attempted.", spell); obfree(pseudo, (struct obj *)0); return(0); } /* gain skill for successful cast */ use_skill(skill, spellev(spell)); /* WAC successful casting increases solidity of knowledge */ boostknow(spell,CAST_BOOST); obfree(pseudo, (struct obj *)0); /* now, get rid of it */ return(1); } void losespells() { boolean confused = (Confusion != 0); int n, nzap, i; book = 0; for (n = 0; n < MAXSPELL && spellid(n) != NO_SPELL; n++) continue; if (n) { nzap = rnd(n) + confused ? 1 : 0; if (nzap > n) nzap = n; for (i = n - nzap; i < n; i++) { spellid(i) = NO_SPELL; exercise(A_WIS, FALSE); /* ouch! */ } } } /* the '+' command -- view known spells */ int dovspell() { char qbuf[QBUFSZ]; int splnum, othnum; struct spell spl_tmp; if (spellid(0) == NO_SPELL) You("don't know any spells right now."); else { while (dospellmenu("Currently known spells", SPELLMENU_VIEW, &splnum)) { Sprintf(qbuf, "Reordering spells; swap '%s' with", spellname(splnum)); if (!dospellmenu(qbuf, splnum, &othnum)) break; spl_tmp = spl_book[splnum]; spl_book[splnum] = spl_book[othnum]; spl_book[othnum] = spl_tmp; } } return 0; } STATIC_OVL boolean dospellmenu(prompt, splaction, spell_no) const char *prompt; int splaction; /* SPELLMENU_CAST, SPELLMENU_VIEW, or spl_book[] index */ int *spell_no; { winid tmpwin; int i, n, how; char buf[BUFSZ]; menu_item *selected; anything any; tmpwin = create_nhwindow(NHW_MENU); start_menu(tmpwin); any.a_void = 0; /* zero out all bits */ /* * The correct spacing of the columns depends on the * following that (1) the font is monospaced and (2) * that selection letters are pre-pended to the given * string and are of the form "a - ". * * 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"); if (flags.menu_style == MENU_TRADITIONAL) Strcat(buf, iflags.menu_tab_sep ? "\tKey" : " Key"); add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_BOLD, 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))), 100 - percent_success(i)); if (flags.menu_style == MENU_TRADITIONAL) Sprintf(eos(buf), iflags.menu_tab_sep ? "\t%c" : "%4c ", spellet(i) ? spellet(i) : ' '); any.a_int = i+1; /* must be non-zero */ add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, (i == splaction) ? MENU_SELECTED : MENU_UNSELECTED); } end_menu(tmpwin, prompt); how = PICK_ONE; if (splaction == SPELLMENU_VIEW && spellid(1) == NO_SPELL) how = PICK_NONE; /* only one spell => nothing to swap with */ n = select_menu(tmpwin, how, &selected); destroy_nhwindow(tmpwin); if (n > 0) { *spell_no = selected[0].item.a_int - 1; /* menu selection for `PICK_ONE' does not de-select any preselected entry */ if (n > 1 && *spell_no == splaction) *spell_no = selected[1].item.a_int - 1; free((genericptr_t)selected); /* default selection of preselected spell means that user chose not to swap it with anything */ if (*spell_no == splaction) return FALSE; return TRUE; } else if (splaction >= 0) { /* explicit de-selection of preselected spell means that user is still swapping but not for the current spell */ *spell_no = splaction; return TRUE; } return FALSE; } /* Integer square root function without using floating point. */ STATIC_OVL int isqrt(val) int val; { int rt = 0; int odd = 1; while(val >= odd) { val = val-odd; odd = odd+2; rt = rt + 1; } return rt; } STATIC_OVL int percent_success(spell) int spell; { /* Intrinsic and learned ability are combined to calculate * the probability of player's success at cast a given spell. */ int chance, splcaster, special, statused; int difficulty; int skill; splcaster = urole.spelbase; special = urole.spelheal; statused = ACURR(urole.spelstat); /* Calculate armor penalties */ if (uarm && !(uarm->otyp == ROBE || uarm->otyp == ROBE_OF_POWER || uarm->otyp == ROBE_OF_PROTECTION)) splcaster += 5; /* Robes are body armour in SLASH'EM */ if (uarm && is_metallic(uarm)) splcaster += /*(uarmc && uarmc->otyp == ROBE) ? urole.spelarmr/2 : */urole.spelarmr; else if (uarmc && uarmc->otyp == ROBE) splcaster -= urole.spelarmr; if (uarms) splcaster += urole.spelshld; if (uarmh && is_metallic(uarmh) && uarmh->otyp != HELM_OF_BRILLIANCE) splcaster += uarmhbon; if (uarmg && is_metallic(uarmg)) splcaster += uarmgbon; if (uarmf && is_metallic(uarmf)) splcaster += uarmfbon; if (spellid(spell) == urole.spelspec) splcaster += urole.spelsbon; /* `healing spell' bonus */ if (spell_skilltype(spellid(spell)) == P_HEALING_SPELL) splcaster += special; if (uarm && uarm->otyp == ROBE_OF_POWER) splcaster -= 3; if (splcaster < 5) splcaster = 5; if (splcaster > 20) splcaster = 20; /* Calculate learned ability */ /* Players basic likelihood of being able to cast any spell * is based of their `magic' statistic. (Int or Wis) */ chance = 11 * statused / 2; /* * High level spells are harder. Easier for higher level casters. * 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) { /* Player is too low level or unskilled. */ chance -= isqrt(900 * difficulty + 2000); } else { /* Player is above level. Learning continues, but the * law of diminishing returns sets in quickly for * low-level spells. That is, a player quickly gains * no advantage for raising level. */ int learning = 15 * -difficulty / spellev(spell); chance += learning > 20 ? 20 : learning; } /* Clamp the chance: >18 stat and advanced learning only help * to a limit, while chances below "hopeless" only raise the * specter of overflowing 16-bit ints (and permit wearing a * shield to raise the chances :-). */ if (chance < 0) chance = 0; if (chance > 120) chance = 120; /* Wearing anything but a light shield makes it very awkward * to cast a spell. The penalty is not quite so bad for the * player's class-specific spell. */ if (uarms && weight(uarms) > (int) objects[SMALL_SHIELD].oc_weight) { if (spellid(spell) == urole.spelspec) { chance /= 2; } else { chance /= 4; } } /* 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; /* Clamp to percentile */ if (chance > 100) chance = 100; if (chance < 0) chance = 0; return chance; } /* Learn a spell during creation of the initial inventory */ void initialspell(obj) struct obj *obj; { int i; for (i = 0; i < MAXSPELL; i++) { if (spellid(i) == obj->otyp) { pline("Error: Spell %s already known.", OBJ_NAME(objects[obj->otyp])); return; } if (spellid(i) == NO_SPELL) { spl_book[i].sp_id = obj->otyp; spl_book[i].sp_lev = objects[obj->otyp].oc_level; incrnknow(i); return; } } impossible("Too many spells memorized!"); return; } boolean studyspell() { /*Vars are for studying spells 'W', 'F', 'I', 'N'*/ int spell_no; if (getspell(&spell_no)) { if (spellknow(spell_no) <= 0) { You("are unable to focus your memory of the spell."); return (FALSE); } else if (spellknow(spell_no) <= 1000) { Your("focus and reinforce your memory of the spell."); incrnknow(spell_no); exercise(A_WIS, TRUE); /* extra study */ return (TRUE); } else /* 1000 < spellknow(spell_no) <= 5000 */ You("know that spell quite well already."); } return (FALSE); } /*spell.c*/ slashem-0.0.7E7F3/src/mklev.c0000664000076400007640000012334610545462317013736 0ustar aliali/* 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. */ #include "hack.h" /* #define DEBUG */ /* uncomment to enable code debugging */ #ifdef DEBUG # ifdef WIZARD #define debugpline if (wizard) pline # else #define debugpline pline # endif #endif /* for UNIX, Rand #def'd to (long)lrand48() or (long)random() */ /* croom->lx etc are schar (width <= int), so % arith ensures that */ /* conversion of result to int is reasonable */ STATIC_DCL void FDECL(mkfount,(int,struct mkroom *)); #ifdef SINKS STATIC_DCL void FDECL(mksink,(struct mkroom *)); STATIC_DCL void FDECL(mktoilet,(struct mkroom *)); #endif STATIC_DCL void FDECL(mkaltar,(struct mkroom *)); STATIC_DCL void FDECL(mkgrave,(struct mkroom *)); STATIC_DCL void NDECL(makevtele); STATIC_DCL void NDECL(clear_level_structures); STATIC_DCL void NDECL(makelevel); STATIC_DCL void NDECL(mineralize); STATIC_DCL boolean FDECL(bydoor,(XCHAR_P,XCHAR_P)); STATIC_DCL struct mkroom *FDECL(find_branch_room, (coord *)); STATIC_DCL struct mkroom *FDECL(pos_to_room, (XCHAR_P, XCHAR_P)); 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( CFDECLSPEC 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, BOOLEAN_P,SCHAR_P,BOOLEAN_P,BOOLEAN_P)); STATIC_DCL void NDECL(makerooms); STATIC_DCL void FDECL(finddpos,(coord *,XCHAR_P,XCHAR_P,XCHAR_P,XCHAR_P)); STATIC_DCL void FDECL(mkinvpos, (XCHAR_P,XCHAR_P,int)); STATIC_DCL void FDECL(mk_knox_portal, (XCHAR_P,XCHAR_P)); #define create_vault() create_room(-1, -1, 2, 2, -1, -1, VAULT, TRUE) #define init_vault() vault_x = -1 #define do_vault() (vault_x != -1) static xchar vault_x, vault_y; boolean goldseen; static boolean made_branch; /* used only during level creation */ /* Args must be (const genericptr) so that qsort will always be happy. */ STATIC_PTR int CFDECLSPEC do_comp(vx,vy) const genericptr vx; const genericptr vy; { #ifdef LINT /* lint complains about possible pointer alignment problems, but we know that vx and vy are always properly aligned. Hence, the following bogus definition: */ return (vx == vy) ? 0 : -1; #else register const struct mkroom *x, *y; x = (const struct mkroom *)vx; y = (const struct mkroom *)vy; if(x->lx < y->lx) return(-1); return(x->lx > y->lx); #endif /* LINT */ } STATIC_OVL void finddpos(cc, xl,yl,xh,yh) coord *cc; xchar xl,yl,xh,yh; { register xchar x, y; x = (xl == xh) ? xl : (xl + rn2(xh-xl+1)); y = (yl == yh) ? yl : (yl + rn2(yh-yl+1)); if(okdoor(x, y)) goto gotit; for(x = xl; x <= xh; x++) for(y = yl; y <= yh; y++) if(okdoor(x, y)) goto gotit; for(x = xl; x <= xh; x++) for(y = yl; y <= yh; y++) if(IS_DOOR(levl[x][y].typ) || levl[x][y].typ == SDOOR) goto gotit; /* cannot find something reasonable -- strange */ x = xl; y = yh; gotit: cc->x = x; cc->y = y; return; } void sort_rooms() { #if defined(SYSV) || defined(DGUX) qsort((genericptr_t) rooms, (unsigned)nroom, sizeof(struct mkroom), do_comp); #else qsort((genericptr_t) rooms, nroom, sizeof(struct mkroom), do_comp); #endif } STATIC_OVL void do_room_or_subroom(croom, lowx, lowy, hix, hiy, lit, rtype, special, is_room) register struct mkroom *croom; int lowx, lowy; register int hix, hiy; boolean lit; schar rtype; boolean special; boolean is_room; { register int x, y; struct rm *lev; /* locations might bump level edges in wall-less rooms */ /* add/subtract 1 to allow for edge locations */ if(!lowx) lowx++; if(!lowy) lowy++; if(hix >= COLNO-1) hix = COLNO-2; if(hiy >= ROWNO-1) hiy = ROWNO-2; if(lit) { for(x = lowx-1; x <= hix+1; x++) { lev = &levl[x][max(lowy-1,0)]; for(y = lowy-1; y <= hiy+1; y++) lev++->lit = 1; } croom->rlit = 1; } else croom->rlit = 0; croom->lx = lowx; croom->hx = hix; croom->ly = lowy; croom->hy = hiy; croom->rtype = rtype; croom->doorct = 0; /* if we're not making a vault, doorindex will still be 0 * if we are, we'll have problems adding niches to the previous room * unless fdoor is at least doorindex */ croom->fdoor = doorindex; croom->irregular = FALSE; croom->nsubrooms = 0; croom->sbrooms[0] = (struct mkroom *) 0; if (!special) { for(x = lowx-1; x <= hix+1; x++) for(y = lowy-1; y <= hiy+1; y += (hiy-lowy+2)) { levl[x][y].typ = HWALL; levl[x][y].horizontal = 1; /* For open/secret doors. */ } for(x = lowx-1; x <= hix+1; x += (hix-lowx+2)) for(y = lowy; y <= hiy; y++) { levl[x][y].typ = VWALL; levl[x][y].horizontal = 0; /* For open/secret doors. */ } for(x = lowx; x <= hix; x++) { lev = &levl[x][lowy]; for(y = lowy; y <= hiy; y++) lev++->typ = ROOM; } if (is_room) { levl[lowx-1][lowy-1].typ = TLCORNER; levl[hix+1][lowy-1].typ = TRCORNER; levl[lowx-1][hiy+1].typ = BLCORNER; levl[hix+1][hiy+1].typ = BRCORNER; } else { /* a subroom */ wallification(lowx-1, lowy-1, hix+1, hiy+1, FALSE); } } } void add_room(lowx, lowy, hix, hiy, lit, rtype, special) register int lowx, lowy, hix, hiy; boolean lit; schar rtype; boolean special; { register struct mkroom *croom; croom = &rooms[nroom]; do_room_or_subroom(croom, lowx, lowy, hix, hiy, lit, rtype, special, (boolean) TRUE); croom++; croom->hx = -1; nroom++; } void add_subroom(proom, lowx, lowy, hix, hiy, lit, rtype, special) struct mkroom *proom; register int lowx, lowy, hix, hiy; boolean lit; schar rtype; boolean special; { register struct mkroom *croom; croom = &subrooms[nsubroom]; do_room_or_subroom(croom, lowx, lowy, hix, hiy, lit, rtype, special, (boolean) FALSE); proom->sbrooms[proom->nsubrooms++] = croom; croom++; croom->hx = -1; nsubroom++; } STATIC_OVL void makerooms() { boolean tried_vault = FALSE; /* make rooms until satisfied */ /* rnd_rect() will returns 0 if no more rects are available... */ while(nroom < MAXNROFROOMS && rnd_rect()) { if(nroom >= (MAXNROFROOMS/6) && rn2(2) && !tried_vault) { tried_vault = TRUE; if (create_vault()) { vault_x = rooms[nroom].lx; vault_y = rooms[nroom].ly; rooms[nroom].hx = -1; } } else if (!create_room(-1, -1, -1, -1, -1, -1, OROOM, -1)) return; } return; } STATIC_OVL void join(a,b,nxcor) register int a, b; boolean nxcor; { coord cc,tt, org, dest; register xchar tx, ty, xx, yy; register struct mkroom *croom, *troom; register int dx, dy; croom = &rooms[a]; troom = &rooms[b]; /* find positions cc and tt for doors in croom and troom and direction for a corridor between them */ if(troom->hx < 0 || croom->hx < 0 || doorindex >= DOORMAX) return; if(troom->lx > croom->hx) { dx = 1; dy = 0; xx = croom->hx+1; tx = troom->lx-1; finddpos(&cc, xx, croom->ly, xx, croom->hy); finddpos(&tt, tx, troom->ly, tx, troom->hy); } else if(troom->hy < croom->ly) { dy = -1; dx = 0; yy = croom->ly-1; finddpos(&cc, croom->lx, yy, croom->hx, yy); ty = troom->hy+1; finddpos(&tt, troom->lx, ty, troom->hx, ty); } else if(troom->hx < croom->lx) { dx = -1; dy = 0; xx = croom->lx-1; tx = troom->hx+1; finddpos(&cc, xx, croom->ly, xx, croom->hy); finddpos(&tt, tx, troom->ly, tx, troom->hy); } else { dy = 1; dx = 0; yy = croom->hy+1; ty = troom->ly-1; finddpos(&cc, croom->lx, yy, croom->hx, yy); finddpos(&tt, troom->lx, ty, troom->hx, ty); } xx = cc.x; yy = cc.y; tx = tt.x - dx; ty = tt.y - dy; if(nxcor && levl[xx+dx][yy+dy].typ) return; if (okdoor(xx,yy) || !nxcor) dodoor(xx,yy,croom); org.x = xx+dx; org.y = yy+dy; dest.x = tx; dest.y = ty; /* KMH -- Support for arboreal levels */ if (!dig_corridor(&org, &dest, nxcor, level.flags.arboreal ? ROOM : CORR, STONE)) return; /* we succeeded in digging the corridor */ if (okdoor(tt.x, tt.y) || !nxcor) dodoor(tt.x, tt.y, troom); if(smeq[a] < smeq[b]) smeq[b] = smeq[a]; else smeq[a] = smeq[b]; } void makecorridors() { int a, b, i; boolean any = TRUE; for(a = 0; a < nroom-1; a++) { join(a, a+1, FALSE); if(!rn2(50)) break; /* allow some randomness */ } for(a = 0; a < nroom-2; a++) if(smeq[a] != smeq[a+2]) join(a, a+2, FALSE); for(a = 0; any && a < nroom; a++) { any = FALSE; for(b = 0; b < nroom; b++) if(smeq[a] != smeq[b]) { join(a, b, FALSE); any = TRUE; } } if(nroom > 2) for(i = rn2(nroom) + 4; i; i--) { a = rn2(nroom); b = rn2(nroom-2); if(b >= a) b += 2; join(a, b, TRUE); } } /* ALI - Artifact doors: Track doors in maze levels as well */ int add_door(x,y,aroom) register int x, y; register struct mkroom *aroom; { register struct mkroom *broom; register int tmp; if (doorindex == DOORMAX) return -1; if (aroom) { aroom->doorct++; broom = aroom+1; } else /* ALI * Roomless doors must go right at the beginning of the list */ broom = &rooms[0]; if(broom->hx < 0) tmp = doorindex; else for(tmp = doorindex; tmp > broom->fdoor; tmp--) doors[tmp] = doors[tmp-1]; doorindex++; doors[tmp].x = x; doors[tmp].y = y; for( ; broom->hx >= 0; broom++) broom->fdoor++; doors[tmp].arti_key = 0; return tmp; } STATIC_OVL void dosdoor(x,y,aroom,type) register xchar x, y; register struct mkroom *aroom; register int type; { boolean shdoor = ((*in_rooms(x, y, SHOPBASE))? TRUE : FALSE); if(!IS_WALL(levl[x][y].typ)) /* avoid SDOORs on already made doors */ type = DOOR; levl[x][y].typ = type; if(type == DOOR) { if(!rn2(3)) { /* is it a locked door, closed, or a doorway? */ if(!rn2(5)) levl[x][y].doormask = D_ISOPEN; else if(!rn2(6)) levl[x][y].doormask = D_LOCKED; else levl[x][y].doormask = D_CLOSED; if (levl[x][y].doormask != D_ISOPEN && !shdoor && level_difficulty() >= 5 && !rn2(25)) levl[x][y].doormask |= D_TRAPPED; } else #ifdef STUPID if (shdoor) levl[x][y].doormask = D_ISOPEN; else levl[x][y].doormask = D_NODOOR; #else levl[x][y].doormask = (shdoor ? D_ISOPEN : D_NODOOR); #endif if(levl[x][y].doormask & D_TRAPPED) { struct monst *mtmp; if (level_difficulty() >= 9 && !rn2(5) && !((mvitals[PM_SMALL_MIMIC].mvflags & G_GONE) && (mvitals[PM_LARGE_MIMIC].mvflags & G_GONE) && (mvitals[PM_GIANT_MIMIC].mvflags & G_GONE))) { /* make a mimic instead */ levl[x][y].doormask = D_NODOOR; mtmp = makemon(mkclass(S_MIMIC,0), x, y, NO_MM_FLAGS); if (mtmp) set_mimic_sym(mtmp); } } /* newsym(x,y); */ } else { /* SDOOR */ if(shdoor || !rn2(5)) levl[x][y].doormask = D_LOCKED; else levl[x][y].doormask = D_CLOSED; if(!shdoor && level_difficulty() >= 4 && !rn2(20)) levl[x][y].doormask |= D_TRAPPED; } add_door(x,y,aroom); } STATIC_OVL boolean place_niche(aroom,dy,xx,yy) register struct mkroom *aroom; int *dy, *xx, *yy; { coord dd; if(rn2(2)) { *dy = 1; finddpos(&dd, aroom->lx, aroom->hy+1, aroom->hx, aroom->hy+1); } else { *dy = -1; finddpos(&dd, aroom->lx, aroom->ly-1, aroom->hx, aroom->ly-1); } *xx = dd.x; *yy = dd.y; return((boolean)((isok(*xx,*yy+*dy) && levl[*xx][*yy+*dy].typ == STONE) && (isok(*xx,*yy-*dy) && !IS_POOL(levl[*xx][*yy-*dy].typ) && !IS_FURNITURE(levl[*xx][*yy-*dy].typ)))); } /* there should be one of these per trap, in the same order as trap.h */ static NEARDATA const char *trap_engravings[TRAPNUM] = { (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, /* 14..16: trap door, teleport, level-teleport */ "Vlad was here", "ad aerarium", "ad aerarium", (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, }; STATIC_OVL void makeniche(trap_type) int trap_type; { register struct mkroom *aroom; register struct rm *rm; register int vct = 8; int dy, xx, yy; register struct trap *ttmp; if(doorindex < DOORMAX) while(vct--) { aroom = &rooms[rn2(nroom)]; if(aroom->rtype != OROOM) continue; /* not an ordinary room */ if(aroom->doorct == 1 && rn2(5)) continue; if(!place_niche(aroom,&dy,&xx,&yy)) continue; rm = &levl[xx][yy+dy]; if(trap_type || !rn2(4)) { rm->typ = SCORR; if(trap_type) { if((trap_type == HOLE || trap_type == TRAPDOOR) && !Can_fall_thru(&u.uz)) trap_type = ROCKTRAP; ttmp = maketrap(xx, yy+dy, trap_type); if (ttmp) { if (trap_type != ROCKTRAP) ttmp->once = 1; if (trap_engravings[trap_type]) { make_engr_at(xx, yy-dy, trap_engravings[trap_type], 0L, DUST); wipe_engr_at(xx, yy-dy, 5); /* age it a little */ } } } dosdoor(xx, yy, aroom, SDOOR); } else { rm->typ = CORR; if(rn2(7)) 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; } } STATIC_OVL void make_niches() { register int ct = rnd((nroom>>1) + 1), dep = depth(&u.uz); boolean ltptr = (!level.flags.noteleport && dep > 15), vamp = (dep > 5 && dep < 25); while(ct--) { if (ltptr && !rn2(6)) { ltptr = FALSE; makeniche(LEVEL_TELEP); } else if (vamp && !rn2(6)) { vamp = FALSE; makeniche(TRAPDOOR); } else makeniche(NO_TRAP); } } STATIC_OVL void makevtele() { makeniche(TELEP_TRAP); } /* clear out various globals that keep information on the current level. * some of this is only necessary for some types of levels (maze, normal, * special) but it's easier to put it all in one place than make sure * each type initializes what it needs to separately. */ STATIC_OVL void clear_level_structures() { #ifdef DISPLAY_LAYERS static struct rm zerorm = { S_stone, 0, 0, 0, 0, 0, #else static struct rm zerorm = { cmap_to_glyph(S_stone), #endif 0, 0, 0, 0, 0, 0, 0, 0 }; register int x,y; register struct rm *lev; for(x=0; xproto); return; } else if (dungeons[u.uz.dnum].proto[0]) { makemaz(""); return; } else if (In_mines(&u.uz)) { makemaz("minefill"); return; } else if (In_quest(&u.uz)) { char fillname[16]; s_level *loc_lev; Sprintf(fillname, "%s-loca", urole.filecode); loc_lev = find_level(fillname); Sprintf(fillname, "%s-fil", urole.filecode); Strcat(fillname, (u.uz.dlevel < loc_lev->dlevel.dlevel) ? "a" : "b"); makemaz(fillname); return; } else if(In_hell(&u.uz) || (rn2(5) && u.uz.dnum == medusa_level.dnum && depth(&u.uz) > depth(&medusa_level))) { makemaz(""); return; } } /* otherwise, fall through - it's a "regular" level. */ #ifdef REINCARNATION if (Is_rogue_level(&u.uz)) { makeroguerooms(); makerogueghost(); } else #endif makerooms(); sort_rooms(); /* construct stairs (up and down in different rooms if possible) */ croom = &rooms[rn2(nroom)]; if (!Is_botlevel(&u.uz)) mkstairs(somex(croom), somey(croom), 0, croom); /* down */ if (nroom > 1) { troom = croom; croom = &rooms[rn2(nroom-1)]; if (croom == troom) croom++; } if (u.uz.dlevel != 1) { xchar sx, sy; do { sx = somex(croom); sy = somey(croom); } while(occupied(sx, sy)); mkstairs(sx, sy, 1, croom); /* up */ } branchp = Is_branchlev(&u.uz); /* possible dungeon branch */ room_threshold = branchp ? 4 : 3; /* minimum number of rooms needed to allow a random special room */ #ifdef REINCARNATION if (Is_rogue_level(&u.uz)) goto skip0; #endif makecorridors(); make_niches(); /* make a secret treasure vault, not connected to the rest */ if(do_vault()) { xchar w,h; #ifdef DEBUG debugpline("trying to make a vault..."); #endif w = 1; h = 1; if (check_room(&vault_x, &w, &vault_y, &h, TRUE)) { fill_vault: add_room(vault_x, vault_y, vault_x+w, vault_y+h, TRUE, VAULT, FALSE); level.flags.has_vault = 1; ++room_threshold; fill_room(&rooms[nroom - 1], FALSE); mk_knox_portal(vault_x+w, vault_y+h); if(!level.flags.noteleport && !rn2(3)) makevtele(); } else if(rnd_rect() && create_vault()) { vault_x = rooms[nroom].lx; vault_y = rooms[nroom].ly; if (check_room(&vault_x, &w, &vault_y, &h, TRUE)) goto fill_vault; else rooms[nroom].hx = -1; } } { register int u_depth = depth(&u.uz); #ifdef WIZARD if(wizard && nh_getenv("SHOPTYPE")) mkroom(SHOPBASE); else #endif if (u_depth > 1 && u_depth < depth(&medusa_level) && nroom >= room_threshold && rn2(u_depth) < 3) mkroom(SHOPBASE); /* [Tom] totally reorganized this into categories... used to be only one special room on a level... now allows one of each major type */ else { /* courtrooms & barracks */ if(depth(&u.uz) > 4 && !rn2(12)) mkroom(COURT); else if (u_depth > 5 && !rn2(8) && !(mvitals[PM_LEPRECHAUN].mvflags & G_GONE)) mkroom(LEPREHALL); else if(depth(&u.uz) > 14 && !rn2(12)) mkroom(GIANTCOURT); else if(depth(&u.uz) > 14 && !rn2(7) && (mvitals[PM_SOLDIER].mvflags & G_GONE)) mkroom(BARRACKS); /* hives */ if(depth(&u.uz) > 9 && !rn2(12) && (mvitals[PM_KILLER_BEE].mvflags & G_GONE)) mkroom(BEEHIVE); else if (u_depth > 12 && !rn2(8)) mkroom(ANTHOLE); /* zoos */ if(depth(&u.uz) > 6 && !rn2(12)) mkroom(ZOO); /* fungus farms are rare... */ else if (u_depth > 7 && !rn2(25)) mkroom(FUNGUSFARM); else if(depth(&u.uz) > 9 && !rn2(15)) mkroom(REALZOO); /* neat rooms */ if(depth(&u.uz) > 8 && !rn2(13)) mkroom(TEMPLE); else if(depth(&u.uz) > 11 && !rn2(14)) mkroom(MORGUE); else if(depth(&u.uz) > 13 && !rn2(15)) mkroom(BADFOODSHOP); else if(depth(&u.uz) > 18 && !rn2(7)) mkroom(SWAMP); /* dangerous ones */ if (u_depth > 16 && !rn2(8) && !(mvitals[PM_COCKATRICE].mvflags & G_GONE)) mkroom(COCKNEST); else if(depth(&u.uz) > 20 && !rn2(20)) mkroom(DRAGONLAIR); else if (u_depth > 25 && !rn2(20) && !(mvitals[PM_MIGO_DRONE].mvflags & G_GONE)) mkroom(MIGOHIVE); /* [DS] the restriction of lemure pits to Gehennom means they're * never going to show up randomly (no random room+corridor * levels in Gehennom). Perhaps this should be removed? */ else if (In_hell(&u.uz) && !rn2(12) && !(mvitals[PM_LEMURE].mvflags & G_GONE)) mkroom(LEMUREPIT); } #ifdef REINCARNATION skip0: #endif /* Place multi-dungeon branch. */ place_branch(branchp, 0, 0); /* for each room: put things inside */ for(croom = rooms; croom->hx > 0; croom++) { if(croom->rtype != OROOM) continue; /* put a sleeping monster inside */ /* Note: monster may be on the stairs. This cannot be avoided: maybe the player fell through a trap door while a monster was on the stairs. Conclusion: we have to check for monsters on the stairs anyway. */ if(u.uhave.amulet || !rn2(3)) { 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; x = 8 - (level_difficulty()/6); if (x <= 1) x = 2; while (!rn2(x)) mktrap(0,0,croom,(coord*)0); if (!goldseen && !rn2(3)) (void) mkgold(0L, somex(croom), somey(croom)); #ifdef REINCARNATION x = 80 - (depth(&u.uz) * 2); if (x < 2) x = 2; if(!rn2(x)) mkgrave(croom); if(Is_rogue_level(&u.uz)) goto skip_nonrogue; #endif if(!rn2(10)) mkfount(0,croom); #ifdef SINKS if(!rn2(60)) { mksink(croom); if(!rn2(3)) mktoilet(croom); } #endif x = 80 - (depth(&u.uz) * 2); if (x < 2) x = 2; if(!rn2(x)) mkgrave(croom); if(!rn2(60)) mkaltar(croom); /* put statues inside */ if(!rn2(20)) (void) mkcorpstat(STATUE, (struct monst *)0, (struct permonst *)0, somex(croom), somey(croom), TRUE); /* put box/chest inside; * 40% chance for at least 1 box, regardless of number * of rooms; about 5 - 7.5% for 2 boxes, least likely * when few rooms; chance for 3 or more is neglible. */ 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)))) { char buf[BUFSZ]; const char *mesg = random_engraving(buf); if (mesg) { do { x = somex(croom); y = somey(croom); } while(levl[x][y].typ != ROOM && !rn2(40)); if (!(IS_POOL(levl[x][y].typ) || IS_FURNITURE(levl[x][y].typ))) make_engr_at(x, y, mesg, 0L, MARK); } } #ifdef REINCARNATION skip_nonrogue: #endif /* STEPHEN WHITE'S NEW CODE */ if(!rn2(5)) { (void) mkobj_at(0, somex(croom), somey(croom), TRUE); tryct = 0; while(!rn2(4)) { if(++tryct > 100) { impossible("tryct overflow4"); break; } (void) mkobj_at(0, somex(croom), somey(croom), TRUE); } } } } } /* * Place deposits of minerals (gold and misc gems) in the stone * surrounding the rooms on the map. * Also place kelp in water. */ STATIC_OVL void mineralize() { s_level *sp; struct obj *otmp; int goldprob, gemprob, x, y, cnt; /* Place kelp, except on the plane of water */ if (In_endgame(&u.uz)) return; for (x = 2; x < (COLNO - 2); x++) 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 */ if (In_hell(&u.uz) || In_V_tower(&u.uz) || #ifdef REINCARNATION Is_rogue_level(&u.uz) || #endif level.flags.arboreal || ((sp = Is_special(&u.uz)) != 0 && !Is_oracle_level(&u.uz) && (!In_mines(&u.uz) || sp->flags.town) )) return; /* basic level-related probabilities */ goldprob = 20 + depth(&u.uz) / 3; gemprob = goldprob / 4; /* mines have ***MORE*** goodies - otherwise why mine? */ if (In_mines(&u.uz)) { goldprob *= 2; gemprob *= 3; } else if (In_quest(&u.uz)) { goldprob /= 4; gemprob /= 6; } /* * Seed rock areas with gold and/or gems. * We use fairly low level object handling to avoid unnecessary * overhead from placing things in the floor chain prior to burial. */ for (x = 2; x < (COLNO - 2); x++) for (y = 1; y < (ROWNO - 1); y++) if (levl[x][y+1].typ != STONE) { /* spot not eligible */ y += 2; /* next two spots aren't eligible either */ } else if (levl[x][y].typ != STONE) { /* this spot not eligible */ y += 1; /* next spot isn't eligible either */ } else if (!(levl[x][y].wall_info & W_NONDIGGABLE) && levl[x][y-1].typ == STONE && levl[x+1][y-1].typ == STONE && levl[x-1][y-1].typ == STONE && levl[x+1][y].typ == STONE && levl[x-1][y].typ == STONE && levl[x+1][y+1].typ == STONE && levl[x-1][y+1].typ == STONE) { if (rn2(1000) < goldprob) { if ((otmp = mksobj(GOLD_PIECE, FALSE, FALSE)) != 0) { otmp->ox = x, otmp->oy = y; otmp->quan = 1L + rnd(goldprob * 3); otmp->owt = weight(otmp); if (!rn2(3)) add_to_buried(otmp); else place_object(otmp, x, y); } } if (rn2(1000) < gemprob) { for (cnt = rnd(2 + dunlev(&u.uz) / 3); cnt > 0; cnt--) if ((otmp = mkobj(GEM_CLASS, FALSE)) != 0) { if (otmp->otyp == ROCK) { dealloc_obj(otmp); /* discard it */ } else { otmp->ox = x, otmp->oy = y; if (!rn2(3)) add_to_buried(otmp); else place_object(otmp, x, y); } } } } } void mklev() { struct mkroom *croom; if(getbones()) return; in_mklev = TRUE; makelevel(); bound_digging(); mineralize(); in_mklev = FALSE; /* has_morgue gets cleared once morgue is entered; graveyard stays set (graveyard might already be set even when has_morgue is clear [see fixup_special()], so don't update it unconditionally) */ if (level.flags.has_morgue) level.flags.graveyard = 1; if(!level.flags.is_maze_lev) { for (croom = &rooms[0]; croom != &rooms[nroom]; croom++) #ifdef SPECIALIZATION topologize(croom, FALSE); #else topologize(croom); #endif } set_wall_state(); } void #ifdef SPECIALIZATION topologize(croom, do_ordinary) register struct mkroom *croom; boolean do_ordinary; #else topologize(croom) register struct mkroom *croom; #endif { register int x, y, roomno = (croom - rooms) + ROOMOFFSET; register int lowx = croom->lx, lowy = croom->ly; register int hix = croom->hx, hiy = croom->hy; #ifdef SPECIALIZATION register schar rtype = croom->rtype; #endif register int subindex, nsubrooms = croom->nsubrooms; /* skip the room if already done; i.e. a shop handled out of order */ /* also skip if this is non-rectangular (it _must_ be done already) */ if ((int) levl[lowx][lowy].roomno == roomno || croom->irregular) return; #ifdef SPECIALIZATION # ifdef REINCARNATION if (Is_rogue_level(&u.uz)) do_ordinary = TRUE; /* vision routine helper */ # endif if ((rtype != OROOM) || do_ordinary) #endif { /* do innards first */ for(x = lowx; x <= hix; x++) for(y = lowy; y <= hiy; y++) #ifdef SPECIALIZATION if (rtype == OROOM) levl[x][y].roomno = NO_ROOM; else #endif levl[x][y].roomno = roomno; /* top and bottom edges */ for(x = lowx-1; x <= hix+1; x++) for(y = lowy-1; y <= hiy+1; y += (hiy-lowy+2)) { levl[x][y].edge = 1; if (levl[x][y].roomno) levl[x][y].roomno = SHARED; else levl[x][y].roomno = roomno; } /* sides */ for(x = lowx-1; x <= hix+1; x += (hix-lowx+2)) for(y = lowy; y <= hiy; y++) { levl[x][y].edge = 1; if (levl[x][y].roomno) levl[x][y].roomno = SHARED; else levl[x][y].roomno = roomno; } } /* subrooms */ for (subindex = 0; subindex < nsubrooms; subindex++) #ifdef SPECIALIZATION topologize(croom->sbrooms[subindex], (rtype != OROOM)); #else topologize(croom->sbrooms[subindex]); #endif } /* Find an unused room for a branch location. */ STATIC_OVL struct mkroom * find_branch_room(mp) coord *mp; { struct mkroom *croom = 0; if (nroom == 0) { mazexy(mp); /* already verifies location */ } else { /* not perfect - there may be only one stairway */ if(nroom > 2) { int tryct = 0; do croom = &rooms[rn2(nroom)]; while((croom == dnstairs_room || croom == upstairs_room || croom->rtype != OROOM) && (++tryct < 100)); } else croom = &rooms[rn2(nroom)]; do { if (!somexy(croom, mp)) impossible("Can't place branch!"); } while(occupied(mp->x, mp->y) || (levl[mp->x][mp->y].typ != CORR && levl[mp->x][mp->y].typ != ROOM)); } return croom; } /* Find the room for (x,y). Return null if not in a room. */ STATIC_OVL struct mkroom * pos_to_room(x, y) xchar x, y; { int i; struct mkroom *curr; for (curr = rooms, i = 0; i < nroom; curr++, i++) if (inside_room(curr, x, y)) return curr;; return (struct mkroom *) 0; } /* If given a branch, randomly place a special stair or portal. */ void place_branch(br, x, y) branch *br; /* branch to place */ xchar x, y; /* location */ { coord m; d_level *dest; boolean make_stairs; struct mkroom *br_room; /* * Return immediately if there is no branch to make or we have * already made one. This routine can be called twice when * a special level is loaded that specifies an SSTAIR location * as a favored spot for a branch. */ if (!br || made_branch) return; if (!x) { /* find random coordinates for branch */ br_room = find_branch_room(&m); x = m.x; y = m.y; } else { br_room = pos_to_room(x, y); } if (on_level(&br->end1, &u.uz)) { /* we're on end1 */ make_stairs = br->type != BR_NO_END1; dest = &br->end2; } else { /* we're on end2 */ make_stairs = br->type != BR_NO_END2; dest = &br->end1; } if (br->type == BR_PORTAL) { mkportal(x, y, dest->dnum, dest->dlevel); } else if (make_stairs) { sstairs.sx = x; sstairs.sy = y; sstairs.up = (char) on_level(&br->end1, &u.uz) ? br->end1_up : !br->end1_up; assign_level(&sstairs.tolev, dest); sstairs_room = br_room; levl[x][y].ladder = sstairs.up ? LA_UP : LA_DOWN; levl[x][y].typ = STAIRS; } /* * Set made_branch to TRUE even if we didn't make a stairwell (i.e. * make_stairs is false) since there is currently only one branch * per level, if we failed once, we're going to fail again on the * next call. */ made_branch = TRUE; } STATIC_OVL boolean bydoor(x, y) register xchar x, y; { register int typ; if (isok(x+1, y)) { typ = levl[x+1][y].typ; if (IS_DOOR(typ) || typ == SDOOR) return TRUE; } if (isok(x-1, y)) { typ = levl[x-1][y].typ; if (IS_DOOR(typ) || typ == SDOOR) return TRUE; } if (isok(x, y+1)) { typ = levl[x][y+1].typ; if (IS_DOOR(typ) || typ == SDOOR) return TRUE; } if (isok(x, y-1)) { typ = levl[x][y-1].typ; if (IS_DOOR(typ) || typ == SDOOR) return TRUE; } return FALSE; } /* see whether it is allowable to create a door at [x,y] */ int okdoor(x,y) register xchar x, y; { register boolean near_door = bydoor(x, y); return((levl[x][y].typ == HWALL || levl[x][y].typ == VWALL) && doorindex < DOORMAX && !near_door); } void dodoor(x,y,aroom) register int x, y; register struct mkroom *aroom; { if(doorindex >= DOORMAX) { impossible("DOORMAX exceeded?"); return; } dosdoor(x,y,aroom,rn2(8) ? DOOR : SDOOR); } boolean occupied(x, y) register xchar x, y; { return((boolean)(t_at(x, y) || IS_FURNITURE(levl[x][y].typ) || is_lava(x,y) || is_pool(x,y) || invocation_pos(x,y) )); } /* make a trap somewhere (in croom if mazeflag = 0 && !tm) */ /* if tm != null, make trap at that location */ void mktrap(num, mazeflag, croom, tm) register int num, mazeflag; register struct mkroom *croom; coord *tm; { register int kind; coord m; /* no traps in pools */ if (tm && is_pool(tm->x,tm->y)) return; if (num > 0 && num < TRAPNUM) { kind = num; #ifdef REINCARNATION } else if (Is_rogue_level(&u.uz)) { switch (rn2(7)) { default: kind = BEAR_TRAP; break; /* 0 */ case 1: kind = ARROW_TRAP; break; case 2: kind = DART_TRAP; break; case 3: kind = TRAPDOOR; break; case 4: kind = PIT; break; case 5: kind = SLP_GAS_TRAP; break; case 6: kind = RUST_TRAP; break; } #endif } else if (Inhell && !rn2(5)) { /* bias the frequency of fire traps in Gehennom */ kind = FIRE_TRAP; } else { unsigned lvl = level_difficulty(); do { kind = rnd(TRAPNUM-1); /* reject "too hard" traps */ switch (kind) { case MAGIC_PORTAL: kind = NO_TRAP; break; case ROLLING_BOULDER_TRAP: case SLP_GAS_TRAP: if (lvl < 2) kind = NO_TRAP; break; case LEVEL_TELEP: if (lvl < 5 || level.flags.noteleport) kind = NO_TRAP; break; case SPIKED_PIT: if (lvl < 5) kind = NO_TRAP; break; case LANDMINE: if (lvl < 6) kind = NO_TRAP; break; case WEB: if (lvl < 7) kind = NO_TRAP; break; case STATUE_TRAP: case POLY_TRAP: if (lvl < 8) kind = NO_TRAP; break; case FIRE_TRAP: if (!Inhell) kind = NO_TRAP; break; case TELEP_TRAP: if (level.flags.noteleport) kind = NO_TRAP; break; case HOLE: /* make these much less often than other traps */ if (rn2(7)) kind = NO_TRAP; break; } } while (kind == NO_TRAP); } if ((kind == TRAPDOOR || kind == HOLE) && !Can_fall_thru(&u.uz)) kind = ROCKTRAP; if (tm) m = *tm; else { register int tryct = 0; boolean avoid_boulder = (kind == PIT || kind == SPIKED_PIT || kind == TRAPDOOR || kind == HOLE); do { if (++tryct > 200) return; if (mazeflag) mazexy(&m); else if (!somexy(croom,&m)) return; } while (occupied(m.x, m.y) || (avoid_boulder && sobj_at(BOULDER, m.x, m.y))); } (void) maketrap(m.x, m.y, kind); if (kind == WEB) (void) makemon(&mons[PM_GIANT_SPIDER], m.x, m.y, NO_MM_FLAGS); } void mkstairs(x, y, up, croom) xchar x, y; char up; struct mkroom *croom; { if (!x) { impossible("mkstairs: bogus stair attempt at <%d,%d>", x, y); return; } /* * We can't make a regular stair off an end of the dungeon. This * attempt can happen when a special level is placed at an end and * has an up or down stair specified in its description file. */ if ((dunlev(&u.uz) == 1 && up) || (dunlev(&u.uz) == real_dunlevs_in_dungeon(&u.uz) && !up)) return; if(up) { xupstair = x; yupstair = y; upstairs_room = croom; } else { xdnstair = x; ydnstair = y; dnstairs_room = croom; } levl[x][y].typ = STAIRS; levl[x][y].ladder = up ? LA_UP : LA_DOWN; } STATIC_OVL void mkfount(mazeflag,croom) register int mazeflag; register struct mkroom *croom; { coord m; register int tryct = 0; do { if(++tryct > 200) return; if(mazeflag) mazexy(&m); else if (!somexy(croom, &m)) return; } while(occupied(m.x, m.y) || bydoor(m.x, m.y)); /* Put a fountain at m.x, m.y */ levl[m.x][m.y].typ = FOUNTAIN; /* Is it a "blessed" fountain? (affects drinking from fountain) */ if(!rn2(7)) levl[m.x][m.y].blessedftn = 1; level.flags.nfountains++; } #ifdef SINKS STATIC_OVL void mksink(croom) register struct mkroom *croom; { coord m; register int tryct = 0; do { if(++tryct > 200) return; if (!somexy(croom, &m)) return; } while(occupied(m.x, m.y) || bydoor(m.x, m.y)); /* Put a sink at m.x, m.y */ levl[m.x][m.y].typ = SINK; level.flags.nsinks++; } static void mktoilet(croom) register struct mkroom *croom; { coord m; register int tryct = 0; do { if(++tryct > 200) return; if (!somexy(croom, &m)) return; } while(occupied(m.x, m.y) || bydoor(m.x, m.y)); /* Put a toilet at m.x, m.y */ levl[m.x][m.y].typ = TOILET; level.flags.nsinks++; /* counted as a sink for sounds.c */ } #endif /* SINKS */ STATIC_OVL void mkaltar(croom) register struct mkroom *croom; { coord m; register int tryct = 0; aligntyp al; if(croom->rtype != OROOM) return; do { if(++tryct > 200) return; if (!somexy(croom, &m)) return; } while(occupied(m.x, m.y) || bydoor(m.x, m.y)); /* Put an altar at m.x, m.y */ levl[m.x][m.y].typ = ALTAR; /* -1 - A_CHAOTIC, 0 - A_NEUTRAL, 1 - A_LAWFUL */ al = rn2((int)A_LAWFUL+2) - 1; levl[m.x][m.y].altarmask = Align2amask( al ); } static void mkgrave(croom) struct mkroom *croom; { coord m; register int tryct = 0; register struct obj *otmp; boolean dobell = !rn2(10); if(croom->rtype != OROOM) return; do { if(++tryct > 200) return; if (!somexy(croom, &m)) return; } while (occupied(m.x, m.y) || bydoor(m.x, m.y)); /* Put a grave at m.x, m.y */ make_grave(m.x, m.y, dobell ? "Saved by the bell!" : (char *) 0); /* Possibly fill it with objects */ if (!rn2(3)) (void) mkgold(0L, m.x, m.y); for (tryct = rn2(5); tryct; tryct--) { otmp = mkobj(RANDOM_CLASS, TRUE); if (!otmp) return; curse(otmp); otmp->ox = m.x; otmp->oy = m.y; add_to_buried(otmp); } /* Leave a bell, in case we accidentally buried someone alive */ if (dobell) (void) mksobj_at(BELL, m.x, m.y, TRUE, FALSE); return; } /* maze levels have slightly different constraints from normal levels */ #define x_maze_min 2 #define y_maze_min 2 /* * Major level transmutation: add a set of stairs (to the Sanctum) after * an earthquake that leaves behind a a new topology, centered at inv_pos. * Assumes there are no rooms within the invocation area and that inv_pos * is not too close to the edge of the map. Also assume the hero can see, * which is guaranteed for normal play due to the fact that sight is needed * to read the Book of the Dead. */ void mkinvokearea() { int dist; xchar xmin = inv_pos.x, xmax = inv_pos.x; xchar ymin = inv_pos.y, ymax = inv_pos.y; register xchar i; pline_The("floor shakes violently under you!"); pline_The("walls around you begin to bend and crumble!"); display_nhwindow(WIN_MESSAGE, TRUE); mkinvpos(xmin, ymin, 0); /* middle, before placing stairs */ for(dist = 1; dist < 7; dist++) { xmin--; xmax++; /* top and bottom */ if(dist != 3) { /* the area is wider that it is high */ ymin--; ymax++; for(i = xmin+1; i < xmax; i++) { mkinvpos(i, ymin, dist); mkinvpos(i, ymax, dist); } } /* left and right */ for(i = ymin; i <= ymax; i++) { mkinvpos(xmin, i, dist); mkinvpos(xmax, i, dist); } flush_screen(1); /* make sure the new glyphs shows up */ delay_output(); } You("are standing at the top of a stairwell leading down!"); mkstairs(u.ux, u.uy, 0, (struct mkroom *)0); /* down */ newsym(u.ux, u.uy); vision_full_recalc = 1; /* everything changed */ } /* Change level topology. Boulders in the vicinity are eliminated. * Temporarily overrides vision in the name of a nice effect. */ STATIC_OVL void mkinvpos(x,y,dist) xchar x,y; int dist; { struct trap *ttmp; struct obj *otmp; boolean make_rocks; register struct rm *lev = &levl[x][y]; /* clip at existing map borders if necessary */ if (!within_bounded_area(x, y, x_maze_min + 1, y_maze_min + 1, x_maze_max - 1, y_maze_max - 1)) { /* only outermost 2 columns and/or rows may be truncated due to edge */ if (dist < (7 - 2)) panic("mkinvpos: <%d,%d> (%d) off map edge!", x, y, dist); return; } /* clear traps */ if ((ttmp = t_at(x,y)) != 0) deltrap(ttmp); /* clear boulders; leave some rocks for non-{moat|trap} locations */ make_rocks = (dist != 1 && dist != 4 && dist != 5) ? TRUE : FALSE; while ((otmp = sobj_at(BOULDER, x, y)) != 0) { if (make_rocks) { fracture_rock(otmp); make_rocks = FALSE; /* don't bother with more rocks */ } else { obj_extract_self(otmp); obfree(otmp, (struct obj *)0); } } unblock_point(x,y); /* make sure vision knows this location is open */ /* fake out saved state */ lev->seenv = 0; lev->doormask = 0; if(dist < 6) lev->lit = TRUE; lev->waslit = TRUE; lev->horizontal = FALSE; viz_array[y][x] = (dist < 6 ) ? (IN_SIGHT|COULD_SEE) : /* short-circuit vision recalc */ COULD_SEE; switch(dist) { case 1: /* fire traps */ if (is_pool(x,y)) break; lev->typ = ROOM; ttmp = maketrap(x, y, FIRE_TRAP); if (ttmp) ttmp->tseen = TRUE; break; case 0: /* lit room locations */ case 2: case 3: case 6: /* unlit room locations */ lev->typ = ROOM; break; case 4: /* pools (aka a wide moat) */ case 5: lev->typ = MOAT; /* No kelp! */ break; default: impossible("mkinvpos called with dist %d", dist); break; } /* display new value of position; could have a monster/object on it */ newsym(x,y); } /* * The portal to Ludios is special. The entrance can only occur within a * vault in the main dungeon at a depth greater than 10. The Ludios branch * structure reflects this by having a bogus "source" dungeon: the value * of n_dgns (thus, Is_branchlev() will never find it). * * Ludios will remain isolated until the branch is corrected by this function. */ STATIC_OVL void mk_knox_portal(x, y) xchar x, y; { extern int n_dgns; /* from dungeon.c */ d_level *source; branch *br; schar u_depth; br = dungeon_branch("Fort Ludios"); if (on_level(&knox_level, &br->end1)) { source = &br->end2; } else { /* disallow Knox branch on a level with one branch already */ if(Is_branchlev(&u.uz)) return; source = &br->end1; } /* Already set or 2/3 chance of deferring until a later level. */ if (source->dnum < n_dgns || (rn2(3) #ifdef WIZARD && !wizard #endif )) return; if (! (u.uz.dnum == oracle_level.dnum /* in main dungeon */ && !at_dgn_entrance("The Quest") /* but not Quest's entry */ && (u_depth = depth(&u.uz)) > 10 /* beneath 10 */ && u_depth < depth(&medusa_level))) /* and above Medusa */ return; /* Adjust source to be current level and re-insert branch. */ *source = u.uz; insert_branch(br, TRUE); #ifdef DEBUG pline("Made knox portal."); #endif place_branch(br, x, y); } /*mklev.c*/ slashem-0.0.7E7F3/src/artifact.c0000644000076400007640000015501310545462317014407 0ustar aliali/* SCCS Id: @(#)artifact.c 3.4 2003/08/11 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" #include "artifact.h" #ifdef OVLB #include "artilist.h" #else STATIC_DCL struct artifact artilist[]; #endif /* * Note: both artilist[] and artiexist[] have a dummy element #0, * so loops over them should normally start at #1. The primary * exception is the save & restore code, which doesn't care about * the contents, just the total size. */ extern boolean notonhead; /* for long worms */ #define get_artifact(o) \ (((o)&&(o)->oartifact) ? &artilist[(int) (o)->oartifact] : 0) STATIC_DCL int FDECL(spec_applies, (const struct artifact *,struct monst *)); STATIC_DCL int FDECL(arti_invoke, (struct obj*)); STATIC_DCL boolean FDECL(Mb_hit, (struct monst *magr,struct monst *mdef, struct obj *,int *,int,BOOLEAN_P,char *)); /* 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; STATIC_DCL xchar artidisco[NROFARTIFACTS]; #else /* OVLB */ /* coordinate effects from spec_dbon() with messages in artifact_hit() */ STATIC_OVL int spec_dbon_applies = 0; /* flags including which artifacts have already been created */ static boolean artiexist[1+NROFARTIFACTS+1]; /* and a discovery list for them (no dummy first entry here) */ STATIC_OVL xchar artidisco[NROFARTIFACTS]; STATIC_DCL void NDECL(hack_artifacts); STATIC_DCL boolean FDECL(attacks, (int,struct obj *)); /* handle some special cases; must be called after role_init() */ STATIC_OVL void hack_artifacts() { struct artifact *art; int alignmnt = aligns[flags.initalign].value; /* Fix up the alignments of "gift" artifacts */ for (art = artilist+1; art->otyp; art++) if (art->role == Role_switch && art->alignment != A_NONE) art->alignment = alignmnt; /* Excalibur can be used by any lawful character, not just knights */ if (!Role_if(PM_KNIGHT)) artilist[ART_EXCALIBUR].role = NON_PM; #if 0 /* Fix up the gifts */ if (urole.gift1arti) { artilist[urole.gift1arti].alignment = alignmnt; artilist[urole.gift1arti].role = Role_switch; } if (urole.gift2arti) { artilist[urole.gift2arti].alignment = alignmnt; artilist[urole.gift2arti].role = Role_switch; } #endif /* Fix up the quest artifact */ if (urole.questarti) { artilist[urole.questarti].alignment = alignmnt; artilist[urole.questarti].role = Role_switch; } return; } /* zero out the artifact existence list */ void init_artifacts() { (void) memset((genericptr_t) artiexist, 0, sizeof artiexist); (void) memset((genericptr_t) artidisco, 0, sizeof artidisco); hack_artifacts(); } /* Post u_init() initialization */ void init_artifacts1() { #if 0 /* KMH -- Should be at least skilled in first artifact gifts */ if (urole.gift1arti && (objects[artilist[urole.gift1arti].otyp].oc_class == WEAPON_CLASS || objects[artilist[urole.gift1arti].otyp].oc_class == TOOL_CLASS)) { int skill = objects[artilist[urole.gift1arti].otyp].oc_skill; if (skill > P_NONE && P_SKILL(skill) < P_UNSKILLED) P_SKILL(skill) = P_UNSKILLED; if (skill > P_NONE && P_MAX_SKILL(skill) < P_SKILLED) { pline("Warning: %s should be at least skilled. Fixing...", artilist[urole.gift1arti].name); P_MAX_SKILL(skill) = P_SKILLED; } } if (urole.gift2arti && (objects[artilist[urole.gift2arti].otyp].oc_class == WEAPON_CLASS || objects[artilist[urole.gift2arti].otyp].oc_class == TOOL_CLASS)) { int skill = objects[artilist[urole.gift2arti].otyp].oc_skill; if (skill > P_NONE && P_SKILL(skill) < P_UNSKILLED) P_SKILL(skill) = P_UNSKILLED; if (skill > P_NONE && P_MAX_SKILL(skill) < P_SKILLED) { pline("Warning: %s should be at least skilled. Fixing...", artilist[urole.gift1arti].name); P_MAX_SKILL(skill) = P_SKILLED; } } #endif /* KMH -- Should be expert in quest artifact */ if (urole.questarti && (objects[artilist[urole.questarti].otyp].oc_class == WEAPON_CLASS || objects[artilist[urole.questarti].otyp].oc_class == TOOL_CLASS)) { int skill = objects[artilist[urole.questarti].otyp].oc_skill; if (skill > P_NONE && P_SKILL(skill) < P_UNSKILLED) P_SKILL(skill) = P_UNSKILLED; if (skill > P_NONE && P_MAX_SKILL(skill) < P_EXPERT) { pline("Warning: %s should be at least expert. Fixing...", artilist[urole.questarti].name); P_MAX_SKILL(skill) = P_EXPERT; } } } void save_artifacts(fd) int fd; { bwrite(fd, (genericptr_t) artiexist, sizeof artiexist); bwrite(fd, (genericptr_t) artidisco, sizeof artidisco); } void restore_artifacts(fd) int fd; { mread(fd, (genericptr_t) artiexist, sizeof artiexist); mread(fd, (genericptr_t) artidisco, sizeof artidisco); hack_artifacts(); /* redo non-saved special cases */ } const char * artiname(artinum) int artinum; { if (artinum <= 0 || artinum > NROFARTIFACTS) return(""); return(artilist[artinum].name); } /* Make an artifact. If a specific alignment is specified, then an object of the appropriate alignment is created from scratch, or 0 is returned if none is available. (If at least one aligned artifact has already been given, then unaligned ones also become eligible for this.) If no alignment is given, then 'otmp' is converted into an artifact of matching type, or returned as-is if that's not possible. For the 2nd case, caller should use ``obj = mk_artifact(obj, A_NONE);'' for the 1st, ``obj = mk_artifact((struct obj *)0, some_alignment);''. */ struct obj * mk_artifact(otmp, alignment) struct obj *otmp; /* existing object; ignored if alignment specified */ aligntyp alignment; /* target alignment, or A_NONE */ { const struct artifact *a; int n, m; boolean by_align = (alignment != A_NONE); short o_typ = (by_align || !otmp) ? 0 : otmp->otyp; boolean unique = !by_align && otmp && objects[o_typ].oc_unique; short eligible[NROFARTIFACTS]; #if 0 /* KMH, role patch -- Try first or second gift */ m = urole.gift1arti; if (by_align && m && !artiexist[m]) { a = (struct artifact *)&artilist[m]; goto make_artif; } m = urole.gift2arti; if (by_align && m && !artiexist[m]) { a = (struct artifact *)&artilist[m]; goto make_artif; } #endif /* gather eligible artifacts */ for (n = 0, a = artilist+1, m = 1; a->otyp; a++, m++) if ((!by_align ? a->otyp == o_typ : (a->alignment == alignment || (a->alignment == A_NONE && u.ugifts > 0))) && (!(a->spfx & SPFX_NOGEN) || unique) && !artiexist[m]) { /* * [ALI] The determination of whether an artifact is * hostile to the player is a little more complex in * Slash'EM than Vanilla since there are artifacts * which are hostile to humans (eg., Deathsword) which * aren't aligned to any race. * Nevertheless, the rule remains the same: Gods don't * grant artifacts which would be hostile to the player * _in their normal form_. */ boolean hostile = FALSE; if (by_align) { if (a->race != NON_PM && race_hostile(&mons[a->race])) hostile = TRUE; /* enemies' equipment */ else if (a->spfx & SPFX_DBONUS) { struct artifact tmp; tmp = *a; tmp.spfx &= SPFX_DBONUS; if (Upolyd) set_mon_data(&youmonst, &upermonst, 0); if (spec_applies(&tmp, &youmonst)) hostile = TRUE; /* can blast unpolyd player */ if (Upolyd) set_mon_data(&youmonst, &mons[u.umonnum], 0); } } if (hostile) continue; if (by_align && Role_if(a->role)) goto make_artif; /* 'a' points to the desired one */ else eligible[n++] = m; } if (n) { /* found at least one candidate */ m = eligible[rn2(n)]; /* [0..n-1] */ a = &artilist[m]; /* make an appropriate object if necessary, then christen it */ make_artif: if (by_align) otmp = mksobj((int)a->otyp, TRUE, FALSE); otmp = oname(otmp, a->name); otmp->oartifact = m; artiexist[m] = TRUE; } else { /* nothing appropriate could be found; return the original object */ if (by_align) otmp = 0; /* (there was no original object) */ } return otmp; } /* * Returns the full name (with articles and correct capitalization) of an * artifact named "name" if one exists, or NULL, it not. * The given name must be rather close to the real name for it to match. * The object type of the artifact is returned in otyp if the return value * is non-NULL. */ const char* artifact_name(name, otyp) const char *name; short *otyp; { register const struct artifact *a; register const char *aname; if(!strncmpi(name, "the ", 4)) name += 4; if(!strncmpi(name, "poisoned ", 9)) name += 9; for (a = artilist+1; a->otyp; a++) { aname = a->name; if(!strncmpi(aname, "the ", 4)) aname += 4; if(!strcmpi(name, aname)) { *otyp = a->otyp; return a->name; } } return (char *)0; } boolean exist_artifact(otyp, name) register int otyp; register const char *name; { register const struct artifact *a; register boolean *arex; if (otyp && *name) for (a = artilist+1,arex = artiexist+1; a->otyp; a++,arex++) if ((int) a->otyp == otyp && !strcmp(a->name, name)) return *arex; return FALSE; } void artifact_exists(otmp, name, mod) register struct obj *otmp; register const char *name; register boolean mod; { register const struct artifact *a; if (otmp && *name) for (a = artilist+1; a->otyp; a++) if (a->otyp == otmp->otyp && !strcmp(a->name, name)) { register int m = a - artilist; otmp->oartifact = (char)(mod ? m : 0); if (mod) { /* Light up Candle of Eternal Flame and * Holy Spear of Light on creation. */ if (!artiexist[m] && artifact_light(otmp) && otmp->oartifact != ART_SUNSWORD) begin_burn(otmp, FALSE); otmp->quan = 1; /* guarantee only one of this artifact */ #ifdef UNPOLYPILE /* Artifacts are immune to unpolypile --ALI */ if (is_hazy(otmp)) { (void) stop_timer(UNPOLY_OBJ, (genericptr_t) otmp); otmp->oldtyp = STRANGE_OBJECT; } #endif } otmp->age = 0; if(otmp->otyp == RIN_INCREASE_DAMAGE) otmp->spe = 0; artiexist[m] = mod; break; } return; } int nartifact_exist() { int a = 0; int n = SIZE(artiexist); while(n > 1) if(artiexist[--n]) a++; return a; } #endif /* OVLB */ #ifdef OVL0 boolean spec_ability(otmp, abil) struct obj *otmp; unsigned long abil; { const struct artifact *arti = get_artifact(otmp); return((boolean)(arti && (arti->spfx & abil))); } /* used so that callers don't need to known about SPFX_ codes */ boolean confers_luck(obj) struct obj *obj; { /* might as well check for this too */ if (obj->otyp == LUCKSTONE) return TRUE; if (obj->otyp == FEDORA && obj == uarmh) return TRUE; return (obj->oartifact && spec_ability(obj, SPFX_LUCK)); } /* used to check whether a monster is getting reflection from an artifact */ boolean arti_reflects(obj) struct obj *obj; { const struct artifact *arti = get_artifact(obj); if (arti) { /* while being worn */ if ((obj->owornmask & ~W_ART) && (arti->spfx & SPFX_REFLECT)) return TRUE; /* just being carried */ if (arti->cspfx & SPFX_REFLECT) return TRUE; } return FALSE; } #endif /* OVL0 */ #ifdef OVLB boolean restrict_name(otmp, name) /* returns 1 if name is restricted for otmp->otyp */ register struct obj *otmp; register const char *name; { register const struct artifact *a; register const char *aname; if (!*name) return FALSE; if (!strncmpi(name, "the ", 4)) name += 4; /* Since almost every artifact is SPFX_RESTR, it doesn't cost us much to do the string comparison before the spfx check. Bug fix: don't name multiple elven daggers "Sting". */ for (a = artilist+1; a->otyp; a++) { if (a->otyp != otmp->otyp) continue; aname = a->name; if (!strncmpi(aname, "the ", 4)) aname += 4; if (!strcmp(aname, name)) return ((boolean)((a->spfx & (SPFX_NOGEN|SPFX_RESTR)) != 0 || otmp->quan > 1L)); } return FALSE; } STATIC_OVL boolean attacks(adtyp, otmp) register int adtyp; register struct obj *otmp; { register const struct artifact *weap; if ((weap = get_artifact(otmp)) != 0) return((boolean)(weap->attk.adtyp == adtyp)); return FALSE; } boolean defends(adtyp, otmp) register int adtyp; register struct obj *otmp; { register const struct artifact *weap; if ((weap = get_artifact(otmp)) != 0) return((boolean)(weap->defn.adtyp == adtyp)); return FALSE; } /* used for monsters */ boolean protects(adtyp, otmp) int adtyp; struct obj *otmp; { register const struct artifact *weap; if ((weap = get_artifact(otmp)) != 0) return (boolean)(weap->cary.adtyp == adtyp); return FALSE; } /* * a potential artifact has just been worn/wielded/picked-up or * unworn/unwielded/dropped. Pickup/drop only set/reset the W_ART mask. */ void set_artifact_intrinsic(otmp,on,wp_mask) register struct obj *otmp; boolean on; long wp_mask; { long *mask = 0; register const struct artifact *oart = get_artifact(otmp); uchar dtyp; long spfx; if (!oart) return; /* effects from the defn field */ dtyp = (wp_mask != W_ART) ? oart->defn.adtyp : oart->cary.adtyp; if (dtyp == AD_FIRE) mask = &EFire_resistance; else if (dtyp == AD_COLD) mask = &ECold_resistance; else if (dtyp == AD_ELEC) mask = &EShock_resistance; else if (dtyp == AD_MAGM) mask = &EAntimagic; else if (dtyp == AD_DISN) mask = &EDisint_resistance; else if (dtyp == AD_DRST) mask = &EPoison_resistance; if (mask && wp_mask == W_ART && !on) { /* find out if some other artifact also confers this intrinsic */ /* if so, leave the mask alone */ register struct obj* obj; for(obj = invent; obj; obj = obj->nobj) if(obj != otmp && obj->oartifact) { register const struct artifact *art = get_artifact(obj); if(art->cary.adtyp == dtyp) { mask = (long *) 0; break; } } } if(mask) { if (on) *mask |= wp_mask; else *mask &= ~wp_mask; } /* intrinsics from the spfx field; there could be more than one */ spfx = (wp_mask != W_ART) ? oart->spfx : oart->cspfx; if(spfx && wp_mask == W_ART && !on) { /* don't change any spfx also conferred by other artifacts */ register struct obj* obj; for(obj = invent; obj; obj = obj->nobj) if(obj != otmp && obj->oartifact) { register const struct artifact *art = get_artifact(obj); spfx &= ~art->cspfx; } } if (spfx & SPFX_SEARCH) { if(on) ESearching |= wp_mask; else ESearching &= ~wp_mask; } if (spfx & SPFX_HALRES) { /* make_hallucinated must (re)set the mask itself to get * the display right */ /* restoring needed because this is the only artifact intrinsic * that can print a message--need to guard against being printed * when restoring a game */ (void) make_hallucinated((long)!on, restoring ? FALSE : TRUE, wp_mask); } if (spfx & SPFX_ESP) { if(on) ETelepat |= wp_mask; else ETelepat &= ~wp_mask; see_monsters(); } if (spfx & SPFX_STLTH) { if (on) EStealth |= wp_mask; else EStealth &= ~wp_mask; } if (spfx & SPFX_REGEN) { if (on) ERegeneration |= wp_mask; else ERegeneration &= ~wp_mask; } if (spfx & SPFX_TCTRL) { if (on) ETeleport_control |= wp_mask; else ETeleport_control &= ~wp_mask; } /* weapon warning is specially handled in mon.c */ if (spfx & SPFX_WARN) { if (spec_m2(otmp)) { if (on) { EWarn_of_mon |= wp_mask; flags.warntype |= spec_m2(otmp); } else { EWarn_of_mon &= ~wp_mask; flags.warntype &= ~spec_m2(otmp); } see_monsters(); } else { if (on) EWarning |= wp_mask; else EWarning &= ~wp_mask; } } if (spfx & SPFX_EREGEN) { if (on) EEnergy_regeneration |= wp_mask; else EEnergy_regeneration &= ~wp_mask; } if (spfx & SPFX_HSPDAM) { if (on) EHalf_spell_damage |= wp_mask; else EHalf_spell_damage &= ~wp_mask; } if (spfx & SPFX_HPHDAM) { if (on) EHalf_physical_damage |= wp_mask; else EHalf_physical_damage &= ~wp_mask; } if (spfx & SPFX_XRAY) { /* this assumes that no one else is using xray_range */ if (on) u.xray_range = 3; else u.xray_range = -1; vision_full_recalc = 1; } /* KMH -- Reflection when wielded */ if ((spfx & SPFX_REFLECT) && (wp_mask & W_WEP)) { if (on) EReflecting |= wp_mask; else EReflecting &= ~wp_mask; } if(wp_mask == W_ART && !on && oart->inv_prop) { /* might have to turn off invoked power too */ if (oart->inv_prop <= LAST_PROP && (u.uprops[oart->inv_prop].extrinsic & W_ARTI)) (void) arti_invoke(otmp); } } /* * creature (usually player) tries to touch (pick up or wield) an artifact obj. * Returns 0 if the object refuses to be touched. * This routine does not change any object chains. * Ignores such things as gauntlets, assuming the artifact is not * fooled by such trappings. */ int touch_artifact(obj,mon) struct obj *obj; struct monst *mon; { register const struct artifact *oart = get_artifact(obj); boolean badclass, badalign, self_willed, yours; if(!oart) return 1; /* [ALI] Thiefbane has a special affinity with shopkeepers */ if (mon->isshk && obj->oartifact == ART_THIEFBANE) return 1; yours = (mon == &youmonst); /* 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; } /* weapons which attack specific categories of monsters are bad for them even if their alignments happen to match */ if (!badalign && (oart->spfx & SPFX_DBONUS) != 0) { struct artifact tmp; tmp = *oart; tmp.spfx &= SPFX_DBONUS; badalign = !!spec_applies(&tmp, mon); } if (((badclass || badalign) && self_willed) || (badalign && (!yours || !rn2(4)))) { int dmg; char buf[BUFSZ]; if (!yours) return 0; You("are blasted by %s power!", s_suffix(the(xname(obj)))); dmg = d((Antimagic ? 6 : 8), (self_willed ? 10 : 6)); Sprintf(buf, "touching %s", oart->name); losehp(dmg, buf, KILLED_BY); exercise(A_WIS, FALSE); } /* 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; } return 1; } #endif /* OVLB */ #ifdef OVL1 /* decide whether an artifact's special attacks apply against mtmp */ STATIC_OVL int spec_applies(weap, mtmp) register const struct artifact *weap; struct monst *mtmp; { int retval = TRUE; struct permonst *ptr; boolean yours; if(!(weap->spfx & (SPFX_DBONUS | SPFX_ATTK))) return(weap->attk.adtyp == AD_PHYS); yours = (mtmp == &youmonst); ptr = mtmp->data; /* [ALI] Modified to support multiple DBONUS and ATTK flags set. * Not all combinations are possible because many DBONUS flags * use mtype and would conflict. Where combinations are possible, * both checks must pass in order for the special attack to * apply against mtmp. */ if (weap->spfx & SPFX_DMONS) { retval &= (ptr == &mons[(int)weap->mtype]); } else if (weap->spfx & SPFX_DCLAS) { retval &= (weap->mtype == (unsigned long)ptr->mlet); } else if (weap->spfx & SPFX_DFLAG1) { retval &= ((ptr->mflags1 & weap->mtype) != 0L); } else if (weap->spfx & SPFX_DFLAG2) { retval &= ((ptr->mflags2 & weap->mtype) || (yours && ((!Upolyd && (urace.selfmask & weap->mtype)) || ((weap->mtype & M2_WERE) && u.ulycn >= LOW_PM)))); } if (weap->spfx & SPFX_DALIGN) { retval &= yours ? (u.ualign.type != weap->alignment) : (ptr->maligntyp == A_NONE || sgn(ptr->maligntyp) != weap->alignment); } if (weap->spfx & SPFX_ATTK) { struct obj *defending_weapon = (yours ? uwep : MON_WEP(mtmp)); if (defending_weapon && defending_weapon->oartifact && defends((int)weap->attk.adtyp, defending_weapon)) return FALSE; switch(weap->attk.adtyp) { case AD_FIRE: if (yours ? Fire_resistance : resists_fire(mtmp)) retval = FALSE; break; case AD_COLD: if (yours ? Cold_resistance : resists_cold(mtmp)) retval = FALSE; break; case AD_ELEC: if (yours ? Shock_resistance : resists_elec(mtmp)) retval = FALSE; break; case AD_MAGM: case AD_STUN: if (yours ? Antimagic : (rn2(100) < ptr->mr)) retval = FALSE; break; case AD_DRST: if (yours ? Poison_resistance : resists_poison(mtmp)) retval = FALSE; break; case AD_DRLI: if (yours ? Drain_resistance : resists_drli(mtmp)) retval = FALSE; break; case AD_STON: if (yours ? Stone_resistance : resists_ston(mtmp)) retval = FALSE; break; default: impossible("Weird weapon special attack."); } } return retval; } /* return the M2 flags of monster that an artifact's special attacks apply against */ long spec_m2(otmp) struct obj *otmp; { register const struct artifact *artifact = get_artifact(otmp); if (artifact) return artifact->mtype; return 0L; } /* special attack bonus */ int spec_abon(otmp, mon) struct obj *otmp; struct monst *mon; { 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 (int)weap->attk.damn; return 0; } /* special damage bonus */ int spec_dbon(otmp, mon, tmp) struct obj *otmp; struct monst *mon; int tmp; { 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 ? (int)weap->attk.damd : /* [ALI] Unlike melee weapons, damd == 0 means no * bonus for launchers. */ is_launcher(otmp) ? 0 : max(tmp,1); return 0; } /* add identified artifact to discoveries list */ void discover_artifact(m) xchar m; { int i; /* look for this artifact in the discoveries list; if we hit an empty slot then it's not present, so add it */ for (i = 0; i < NROFARTIFACTS; i++) if (artidisco[i] == 0 || artidisco[i] == m) { artidisco[i] = m; return; } /* there is one slot per artifact, so we should never reach the end without either finding the artifact or an empty slot... */ impossible("couldn't discover artifact (%d)", (int)m); } /* used to decide whether an artifact has been fully identified */ boolean undiscovered_artifact(m) xchar m; { int i; /* look for this artifact in the discoveries list; if we hit an empty slot then it's undiscovered */ for (i = 0; i < NROFARTIFACTS; i++) if (artidisco[i] == m) return FALSE; else if (artidisco[i] == 0) break; return TRUE; } /* display a list of discovered artifacts; return their count */ int disp_artifact_discoveries(tmpwin) winid tmpwin; /* supplied by dodiscover() */ { int i, m, otyp; char buf[BUFSZ]; anything any; any.a_void = 0; for (i = 0; i < NROFARTIFACTS; i++) { if (artidisco[i] == 0) break; /* empty slot implies end of list */ if (i == 0) add_menu(tmpwin, NO_GLYPH, &any, 0, 0, iflags.menu_headings, "Artifacts", MENU_UNSELECTED); m = artidisco[i]; otyp = artilist[m].otyp; Sprintf(buf, " %s [%s %s]", artiname(m), align_str(artilist[m].alignment), simple_typename(otyp)); add_menu(tmpwin, objnum_to_glyph(otyp), &any, 0, 0, ATR_NONE, buf, MENU_UNSELECTED); } return i; } #endif /* OVL1 */ #ifdef OVLB /* * Magicbane's intrinsic magic is incompatible with normal * enchantment magic. Thus, its effects have a negative * dependence on spe. Against low mr victims, it typically * does "double athame" damage, 2d4. Occasionally, it will * cast unbalancing magic which effectively averages out to * 4d4 damage (3d4 against high mr victims), for spe = 0. * * Prior to 3.4.1, the cancel (aka purge) effect always * included the scare effect too; now it's one or the other. * Likewise, the stun effect won't be combined with either * of those two; it will be chosen separately or possibly * used as a fallback when scare or cancel fails. * * [Historical note: a change to artifact_hit() for 3.4.0 * unintentionally made all of Magicbane's special effects * be blocked if the defender successfully saved against a * stun attack. As of 3.4.1, those effects can occur but * will be slightly less likely than they were in 3.3.x.] */ #define MB_MAX_DIEROLL 8 /* rolls above this aren't magical */ static const char * const mb_verb[2][4] = { { "probe", "stun", "scare", "cancel" }, { "prod", "amaze", "tickle", "purge" }, }; #define MB_INDEX_PROBE 0 #define MB_INDEX_STUN 1 #define MB_INDEX_SCARE 2 #define MB_INDEX_CANCEL 3 /* called when someone is being hit by Magicbane */ STATIC_OVL boolean Mb_hit(magr, mdef, mb, dmgptr, dieroll, vis, hittee) struct monst *magr, *mdef; /* attacker and defender */ struct obj *mb; /* Magicbane */ int *dmgptr; /* extra damage target will suffer */ int dieroll; /* d20 that has already scored a hit */ boolean vis; /* whether the action can be seen */ char *hittee; /* target's name: "you" or mon_nam(mdef) */ { struct permonst *old_uasmon; const char *verb; boolean youattack = (magr == &youmonst), youdefend = (mdef == &youmonst), resisted = FALSE, do_stun, do_confuse, result; int attack_indx, scare_dieroll = MB_MAX_DIEROLL / 2; result = FALSE; /* no message given yet */ /* the most severe effects are less likely at higher enchantment */ if (mb->spe >= 3) scare_dieroll /= (1 << (mb->spe / 3)); /* if target successfully resisted the artifact damage bonus, reduce overall likelihood of the assorted special effects */ if (!spec_dbon_applies) dieroll += 1; /* might stun even when attempting a more severe effect, but in that case it will only happen if the other effect fails; extra damage will apply regardless; 3.4.1: sometimes might just probe even when it hasn't been enchanted */ do_stun = (max(mb->spe,0) < rn2(spec_dbon_applies ? 11 : 7)); /* the special effects also boost physical damage; increments are generally cumulative, but since the stun effect is based on a different criterium its damage might not be included; the base damage is either 1d4 (athame) or 2d4 (athame+spec_dbon) depending on target's resistance check against AD_STUN (handled by caller) [note that a successful save against AD_STUN doesn't actually prevent the target from ending up stunned] */ attack_indx = MB_INDEX_PROBE; *dmgptr += rnd(4); /* (2..3)d4 */ if (do_stun) { attack_indx = MB_INDEX_STUN; *dmgptr += rnd(4); /* (3..4)d4 */ } if (dieroll <= scare_dieroll) { attack_indx = MB_INDEX_SCARE; *dmgptr += rnd(4); /* (3..5)d4 */ } if (dieroll <= (scare_dieroll / 2)) { attack_indx = MB_INDEX_CANCEL; *dmgptr += rnd(4); /* (4..6)d4 */ } /* give the hit message prior to inflicting the effects */ verb = mb_verb[!!Hallucination][attack_indx]; if (youattack || youdefend || vis) { result = TRUE; pline_The("magic-absorbing blade %s %s!", vtense((const char *)0, verb), hittee); /* assume probing has some sort of noticeable feedback even if it is being done by one monster to another */ if (attack_indx == MB_INDEX_PROBE && !canspotmon(mdef)) map_invisible(mdef->mx, mdef->my); } /* now perform special effects */ switch (attack_indx) { case MB_INDEX_CANCEL: old_uasmon = youmonst.data; /* No mdef->mcan check: even a cancelled monster can be polymorphed * into a golem, and the "cancel" effect acts as if some magical * energy remains in spellcasting defenders to be absorbed later. */ if (!cancel_monst(mdef, mb, youattack, FALSE, FALSE)) { resisted = TRUE; } else { do_stun = FALSE; if (youdefend) { if (youmonst.data != old_uasmon) *dmgptr = 0; /* rehumanized, so no more damage */ if (u.uenmax > 0) { You("lose magical energy!"); u.uenmax--; if (u.uen > 0) u.uen--; flags.botl = 1; } } else { if (mdef->data == &mons[PM_CLAY_GOLEM]) mdef->mhp = 1; /* cancelled clay golems will die */ if (youattack && attacktype(mdef->data, AT_MAGC)) { You("absorb magical energy!"); u.uenmax++; u.uen++; flags.botl = 1; } } } break; case MB_INDEX_SCARE: if (youdefend) { if (Antimagic) { resisted = TRUE; } else { nomul(-3); nomovemsg = ""; if (magr && magr == u.ustuck && sticks(youmonst.data)) { setustuck((struct monst *)0); You("release %s!", mon_nam(magr)); } } } else { if (rn2(2) && resist(mdef, WEAPON_CLASS, 0, NOTELL)) resisted = TRUE; else monflee(mdef, 3, FALSE, (mdef->mhp > *dmgptr)); } if (!resisted) do_stun = FALSE; break; case MB_INDEX_STUN: do_stun = TRUE; /* (this is redundant...) */ break; case MB_INDEX_PROBE: if (youattack && (mb->spe == 0 || !rn2(3 * abs(mb->spe)))) { pline_The("%s is insightful.", verb); /* pre-damage status */ probe_monster(mdef); } break; } /* stun if that was selected and a worse effect didn't occur */ if (do_stun) { if (youdefend) make_stunned((HStun + 3), FALSE); else mdef->mstun = 1; /* avoid extra stun message below if we used mb_verb["stun"] above */ if (attack_indx == MB_INDEX_STUN) do_stun = FALSE; } /* lastly, all this magic can be confusing... */ do_confuse = !rn2(12); if (do_confuse) { if (youdefend) make_confused(HConfusion + 4, FALSE); else mdef->mconf = 1; } if (youattack || youdefend || vis) { (void) upstart(hittee); /* capitalize */ if (resisted) { pline("%s %s!", hittee, vtense(hittee, "resist")); shieldeff(youdefend ? u.ux : mdef->mx, youdefend ? u.uy : mdef->my); } if ((do_stun || do_confuse) && flags.verbose) { char buf[BUFSZ]; buf[0] = '\0'; if (do_stun) Strcat(buf, "stunned"); if (do_stun && do_confuse) Strcat(buf, " and "); if (do_confuse) Strcat(buf, "confused"); pline("%s %s %s%c", hittee, vtense(hittee, "are"), buf, (do_stun && do_confuse) ? '!' : '.'); } } return result; } /* Function used when someone attacks someone else with an artifact * weapon. Only adds the special (artifact) damage, and returns a 1 if it * did something special (in which case the caller won't print the normal * hit message). This should be called once upon every artifact attack; * dmgval() no longer takes artifact bonuses into account. Possible * extension: change the killer so that when an orc kills you with * Stormbringer it's "killed by Stormbringer" instead of "killed by an orc". */ boolean artifact_hit(magr, mdef, otmp, dmgptr, dieroll) struct monst *magr, *mdef; struct obj *otmp; int *dmgptr; int dieroll; /* needed for Magicbane and vorpal blades */ { boolean youattack = (magr == &youmonst); boolean youdefend = (mdef == &youmonst); boolean vis = (!youattack && magr && cansee(magr->mx, magr->my)) || (!youdefend && cansee(mdef->mx, mdef->my)) || (youattack && u.uswallow && mdef == u.ustuck && !Blind); boolean realizes_damage; const char *wepdesc; static const char you[] = "you"; char hittee[BUFSIZ]; boolean special_applies; 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 * handled. Messages are done in this function, however. */ *dmgptr += spec_dbon(otmp, mdef, *dmgptr); if (spec_dbon_applies) special_applies = TRUE; else { const struct artifact *weap = get_artifact(otmp); special_applies = weap && spec_applies(weap, mdef); } if (youattack && youdefend) { impossible("attacking yourself with weapon?"); return FALSE; } realizes_damage = (youdefend || vis || /* feel the effect even if not seen */ (youattack && mdef == u.ustuck)); /* 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) pline_The("massive hammer hits%s %s%c", !spec_dbon_applies ? "" : "! Lightning strikes", hittee, !spec_dbon_applies ? '.' : '!'); 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) pline_The("imaginary widget hits%s %s%c", !spec_dbon_applies ? "" : "! A hail of magic missiles strikes", hittee, !spec_dbon_applies ? '.' : '!'); return realizes_damage; } if (attacks(AD_STUN, otmp) && dieroll <= MB_MAX_DIEROLL) { /* Magicbane's special attacks (possibly modifies hittee[]) */ return Mb_hit(magr, mdef, otmp, dmgptr, dieroll, vis, hittee); } if (!spec_dbon_applies && !spec_ability(otmp, SPFX_BEHEAD) || !special_applies) { /* since damage bonus didn't apply, nothing more to do; no further attacks have side-effects on inventory */ /* [ALI] The Tsurugi of Muramasa has no damage bonus but is handled below so avoid early exit if SPFX_BEHEAD set and the defender is vulnerable */ return FALSE; } /* STEPHEN WHITE'S NEW CODE */ if (otmp->oartifact == ART_SERPENT_S_TONGUE) { otmp->dknown = TRUE; pline_The("twisted blade poisons %s!", youdefend ? "you" : mon_nam(mdef)); if (youdefend ? Poison_resistance : resists_poison(mdef)) { if (youdefend) You("are not affected by the poison."); else pline("%s seems unaffected by the poison.", Monnam(mdef)); return TRUE; } switch (rnd(10)) { case 1: case 2: case 3: case 4: *dmgptr += d(1,6) + 2; break; case 5: case 6: case 7: *dmgptr += d(2,6) + 4; break; case 8: case 9: *dmgptr += d(3,6) + 6; break; case 10: pline_The("poison was deadly..."); *dmgptr = 2 * (youdefend ? Upolyd ? u.mh : u.uhp : mdef->mhp) + FATAL_DAMAGE_MODIFIER; break; } return TRUE; } if (otmp->oartifact == ART_DOOMBLADE && dieroll < 6) { if (youattack) You("plunge the Doomblade deeply into %s!", mon_nam(mdef)); else pline("%s plunges the Doomblade deeply into %s!", Monnam(magr), hittee); *dmgptr += rnd(4) * 5; return TRUE; } /* END OF STEPHEN WHITE'S NEW CODE */ #if 0 if (otmp->oartifact == ART_SCALPEL && dieroll < 5) { /* faster than a speeding bullet is the Gray Mouser... */ pline("There is a flurry of blows!"); /* I suppose this could theoretically continue forever... */ while (dieroll < 5) { *dmgptr += rnd(8) + 1 + otmp->spe; dieroll = rn2(11); } } if (otmp->oartifact == ART_HEARTSEEKER && dieroll < 3) { /* this weapon just sounds nasty... yuck... */ if (!youdefend) { You("plunge Heartseeker into %s!",mon_nam(mdef)); } else { pline("%s plunges Heartseeker into you!",mon_nam(mdef)); } *dmgptr += rnd(6)+rnd(6)+rnd(6)+rnd(6)+4; } #endif /* We really want "on a natural 20" but Nethack does it in */ /* reverse from AD&D. */ if (spec_ability(otmp, SPFX_BEHEAD)) { if (otmp->oartifact == ART_TSURUGI_OF_MURAMASA && dieroll < 3) { 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) { /* allow normal cutworm() call to add extra damage */ if(notonhead) return FALSE; if (bigmonst(mdef->data)) { if (youattack) You("slice deeply into %s!", 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 { /* Invulnerable player won't be bisected */ if (bigmonst(youmonst.data) || Invulnerable) { pline("%s cuts deeply into you!", magr ? Monnam(magr) : wepdesc); *dmgptr *= 2; return TRUE; } /* Players with negative AC's take less damage instead * of just not getting hit. We must add a large enough * 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; } } else if (dieroll < 3 || otmp->oartifact == ART_VORPAL_BLADE && mdef->data == &mons[PM_JABBERWOCK]) { static const char * const behead_msg[2] = { "%s beheads %s!", "%s decapitates %s!" }; if (youattack && u.uswallow && mdef == u.ustuck) return FALSE; wepdesc = artilist[otmp->oartifact].name; if (!youdefend) { if (!has_head(mdef->data) || notonhead || u.uswallow) { if (youattack) pline("Somehow, you miss %s wildly.", mon_nam(mdef)); else if (vis) pline("Somehow, %s misses wildly.", mon_nam(magr)); *dmgptr = 0; 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; if (Invulnerable) { pline("%s slices into your %s.", wepdesc, body_part(NECK)); return TRUE; } pline(behead_msg[rn2(SIZE(behead_msg))], wepdesc, "you"); otmp->dknown = TRUE; /* Should amulets fall off? */ return TRUE; } } } if (spec_ability(otmp, SPFX_DRLI)) { if (!youdefend) { if (!resists_drli(mdef)) { if (vis) { if(otmp->oartifact == ART_STORMBRINGER) pline_The("%s blade draws the life from %s!", hcolor(NH_BLACK), mon_nam(mdef)); #if 0 /* OBSOLETE */ else if(otmp->oartifact == ART_TENTACLE_STAFF) pline("The writhing tentacles draw the life from %s!", mon_nam(mdef)); #endif else pline("%s draws the life from %s!", The(distant_name(otmp, xname)), mon_nam(mdef)); } if (mdef->m_lev == 0) { *dmgptr = 2 * mdef->mhp + FATAL_DAMAGE_MODIFIER; } else { int drain = rnd(8); *dmgptr += drain; mdef->mhpmax -= drain; mdef->m_lev--; drain /= 2; if (drain) healup(drain, 0, FALSE, FALSE); } return vis; } } else if (!Drain_resistance) { /* youdefend */ int oldhpmax = u.uhpmax; if (Blind) You_feel("an %s drain your life!", otmp->oartifact == ART_STORMBRINGER ? "unholy blade" : "object"); else if (otmp->oartifact == ART_STORMBRINGER) pline_The("%s blade drains your life!", hcolor(NH_BLACK)); else pline("%s drains your life!", The(distant_name(otmp, xname))); losexp("life drainage", FALSE); if (magr && magr->mhp < magr->mhpmax) { magr->mhp += (oldhpmax - u.uhpmax)/2; if (magr->mhp > magr->mhpmax) magr->mhp = magr->mhpmax; } return TRUE; } } /* WAC -- 1/6 chance of cancellation with foobane weapons */ if (otmp->oartifact == ART_GIANTKILLER || otmp->oartifact == ART_ORCRIST || otmp->oartifact == ART_DRAGONBANE || otmp->oartifact == ART_DEMONBANE || otmp->oartifact == ART_WEREBANE || otmp->oartifact == ART_TROLLSBANE || #ifdef BLACKMARKET otmp->oartifact == ART_THIEFBANE || #endif otmp->oartifact == ART_OGRESMASHER || otmp->oartifact == ART_ELFRIST) { if (dieroll < 4) { if (realizes_damage) { pline("%s %s!", The(distant_name(otmp, xname)), Blind ? "roars deafeningly" : "shines brilliantly"); pline("It strikes %s!", hittee); } cancel_monst(mdef, otmp, youattack, TRUE, magr == mdef); return TRUE; } } return FALSE; } static NEARDATA const char recharge_type[] = { ALLOW_COUNT, ALL_CLASSES, 0 }; static NEARDATA const char invoke_types[] = { ALL_CLASSES, 0 }; /* #invoke: an "ugly check" filters out most objects */ int doinvoke() { register struct obj *obj; obj = getobj(invoke_types, "invoke"); if (!obj) return 0; if (obj->oartifact && !touch_artifact(obj, &youmonst)) return 1; return arti_invoke(obj); } STATIC_OVL int arti_invoke(obj) register struct obj *obj; { register const struct artifact *oart = get_artifact(obj); register struct monst *mtmp; register struct monst *mtmp2; register struct permonst *pm; int summon_loop; int unseen; /* int kill_loop; */ if(!oart || !oart->inv_prop) { if(obj->otyp == CRYSTAL_BALL) use_crystal_ball(obj); else pline(nothing_happens); return 1; } if(oart->inv_prop > LAST_PROP) { /* It's a special power, not "just" a property */ if(obj->age > monstermoves) { /* the artifact is tired :-) */ You_feel("that %s %s ignoring you.", the(xname(obj)), otense(obj, "are")); /* and just got more so; patience is essential... */ obj->age += (long) d(3,10); return 1; } obj->age = monstermoves + rnz(100); 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 || Slimed || Blinded > creamed) You_feel("better."); else goto nothing_special; if (healamt > 0) { if (Upolyd) u.mh += healamt; else u.uhp += healamt; } 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; } case ENERGY_BOOST: { int epboost = (u.uenmax + 1 - u.uen) / 2; if (epboost > 120) epboost = 120; /* arbitrary */ else if (epboost < 12) epboost = u.uenmax - u.uen; if(epboost) { You_feel("re-energized."); u.uen += epboost; flags.botl = 1; } else goto nothing_special; break; } case UNTRAP: { if(!untrap(TRUE)) { obj->age = 0; /* don't charge for changing their mind */ return 0; } break; } case CHARGE_OBJ: { struct obj *otmp = getobj(recharge_type, "charge"); boolean b_effect; if (!otmp) { 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: level_tele(); break; case LIGHT_AREA: if (!Blind) pline("%s shines brightly for an instant!", The(xname(obj))); else pline("%s grows warm for a second!", The(xname(obj))); litroom(TRUE, obj); vision_recalc(0); if (is_undead(youmonst.data)) { You("burn in the radiance!"); /* This is ground zero. Not good news ... */ u.uhp /= 100; if (u.uhp < 1) { u.uhp = 0; killer_format = KILLED_BY; killer = "the Holy Spear of Light"; done(DIED); } } /* Undead and Demonics can't stand the light */ unseen = 0; for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) { if (DEADMONSTER(mtmp)) continue; if (distu(mtmp->mx, mtmp->my) > 9*9) continue; if (couldsee(mtmp->mx, mtmp->my) && (is_undead(mtmp->data) || is_demon(mtmp->data)) && !resist(mtmp, '\0', 0, TELL)) { if (canseemon(mtmp)) pline("%s burns in the radiance!", Monnam(mtmp)); else unseen++; /* damage depends on distance, divisor ranges from 10 to 2 */ mtmp->mhp /= (10 - (distu(mtmp->mx, mtmp->my) / 10)); if (mtmp->mhp < 1) mtmp->mhp = 1; } } if (unseen) You_hear("%s of intense pain!", unseen > 1 ? "cries" : "a cry"); break; case DEATH_GAZE: if (u.uluck < -9) { pline_The("Eye turns on you!"); u.uhp = 0; killer_format = KILLED_BY; killer = "the Eye of the Beholder"; done(DIED); } pline_The("Eye looks around with its icy gaze!"); for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) { if (DEADMONSTER(mtmp)) continue; /* The eye is never blind ... */ if (couldsee(mtmp->mx, mtmp->my) && !is_undead(mtmp->data)) { pline("%s screams in agony!", Monnam(mtmp)); mtmp->mhp /= 3; if (mtmp->mhp < 1) mtmp->mhp = 1; } } /* Tsk,tsk.. */ adjalign(-3); u.uluck -= 3; break; case SUMMON_UNDEAD: if (u.uluck < -9) { u.uhp -= rn2(20) + 5; pline_The("Hand claws you with its icy nails!"); if (u.uhp <= 0) { killer_format = KILLED_BY; killer="the Hand of Vecna"; done(DIED); } } summon_loop = rn2(4) + 4; pline("Creatures from the grave surround you!"); do { switch (rn2(6) + 1) { case 1: pm = mkclass(S_VAMPIRE, 0); break; case 2: case 3: pm = mkclass(S_ZOMBIE, 0); break; case 4: pm = mkclass(S_MUMMY, 0); break; case 5: pm = mkclass(S_GHOST, 0); break; default: pm = mkclass(S_WRAITH, 0); break; } mtmp = makemon(pm, u.ux, u.uy, NO_MM_FLAGS); if ((mtmp2 = tamedog(mtmp, (struct obj *)0)) != 0) mtmp = mtmp2; mtmp->mtame = 30; summon_loop--; } while (summon_loop); /* Tsk,tsk.. */ adjalign(-3); u.uluck -= 3; break; case PROT_POLY: You("feel more observant."); rescham(); break; case SUMMON_FIRE_ELEMENTAL: pm = &mons[PM_FIRE_ELEMENTAL]; mtmp = makemon(pm, u.ux, u.uy, NO_MM_FLAGS); pline("You summon an elemental."); if ((mtmp2 = tamedog(mtmp, (struct obj *)0)) != 0) mtmp = mtmp2; mtmp->mtame = 30; break; case SUMMON_WATER_ELEMENTAL: pm = &mons[PM_WATER_ELEMENTAL]; mtmp = makemon(pm, u.ux, u.uy, NO_MM_FLAGS); pline("You summon an elemental."); if ((mtmp2 = tamedog(mtmp, (struct obj *)0)) != 0) mtmp = mtmp2; mtmp->mtame = 30; break; case OBJ_DETECTION: (void)object_detect(obj, 0); break; case CREATE_PORTAL: { int i, num_ok_dungeons, last_ok_dungeon = 0; d_level newlev; extern int n_dgns; /* from dungeon.c */ winid tmpwin = create_nhwindow(NHW_MENU); anything any; any.a_void = 0; /* set all bits to zero */ #ifdef BLACKMARKET if (Is_blackmarket(&u.uz) && *u.ushops) { You("feel very disoriented for a moment."); break; } #endif start_menu(tmpwin); /* use index+1 (cant use 0) as identifier */ for (i = num_ok_dungeons = 0; i < n_dgns; i++) { if (!dungeons[i].dunlev_ureached) continue; any.a_int = i+1; add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, dungeons[i].dname, MENU_UNSELECTED); num_ok_dungeons++; last_ok_dungeon = i; } end_menu(tmpwin, "Open a portal to which dungeon?"); if (num_ok_dungeons > 1) { /* more than one entry; display menu for choices */ menu_item *selected; int n; n = select_menu(tmpwin, PICK_ONE, &selected); if (n <= 0) { destroy_nhwindow(tmpwin); goto nothing_special; } i = selected[0].item.a_int - 1; free((genericptr_t)selected); } else i = last_ok_dungeon; /* also first & only OK dungeon */ destroy_nhwindow(tmpwin); /* * i is now index into dungeon structure for the new dungeon. * Find the closest level in the given dungeon, open * a use-once portal to that dungeon and go there. * The closest level is either the entry or dunlev_ureached. */ newlev.dnum = i; if(dungeons[i].depth_start >= depth(&u.uz)) newlev.dlevel = dungeons[i].entry_lev; else newlev.dlevel = dungeons[i].dunlev_ureached; if(u.uhave.amulet || In_endgame(&u.uz) || In_endgame(&newlev) || newlev.dnum == u.uz.dnum) { You_feel("very disoriented for a moment."); } else { if(!Blind) You("are surrounded by a shimmering sphere!"); else You_feel("weightless for a moment."); goto_level(&newlev, FALSE, FALSE, FALSE); } break; } case ENLIGHTENING: enlightenment(0); break; case CREATE_AMMO: { struct obj *otmp = mksobj(ARROW, TRUE, FALSE); if (!otmp) goto nothing_special; otmp->blessed = obj->blessed; otmp->cursed = obj->cursed; otmp->bknown = obj->bknown; if (obj->blessed) { if (otmp->spe < 0) otmp->spe = 0; otmp->quan += rnd(10); } else if (obj->cursed) { if (otmp->spe > 0) otmp->spe = 0; } else otmp->quan += rnd(5); otmp->owt = weight(otmp); otmp = hold_another_object(otmp, "Suddenly %s out.", aobjnam(otmp, "fall"), (const char *)0); break; } } } else { long eprop = (u.uprops[oart->inv_prop].extrinsic ^= W_ARTI), iprop = u.uprops[oart->inv_prop].intrinsic; boolean on = (eprop & W_ARTI) != 0; /* true if invoked prop just set */ if(on && obj->age > monstermoves) { /* the artifact is tired :-) */ u.uprops[oart->inv_prop].extrinsic ^= W_ARTI; You_feel("that %s %s ignoring you.", the(xname(obj)), otense(obj, "are")); /* can't just keep repeatedly trying */ obj->age += (long) d(3,10); return 1; } else if(!on) { /* when turning off property, determine downtime */ /* arbitrary for now until we can tune this -dlc */ obj->age = monstermoves + rnz(100); } if ((eprop & ~W_ARTI) || iprop) { nothing_special: /* you had the property from some other source too */ if (carried(obj)) You_feel("a surge of power, but nothing seems to happen."); return 1; } switch(oart->inv_prop) { case CONFLICT: if(on) You_feel("like a rabble-rouser."); 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 (BInvis || Blind) goto nothing_special; newsym(u.ux, u.uy); if (on) Your("body takes on a %s transparency...", Hallucination ? "normal" : "strange"); else Your("body seems to unfade..."); break; } } return 1; } /* * Artifact is dipped into water * -1 not handled here (not used up here) * 0 no effect but used up * else return * AD_FIRE, etc. * Note caller should handle what happens to the medium in these cases. * This only prints messages about the actual artifact. */ int artifact_wet(obj, silent) struct obj *obj; boolean silent; { if (!obj->oartifact) return (-1); switch (artilist[(int) (obj)->oartifact].attk.adtyp) { case AD_FIRE: if (!silent) { pline("A cloud of steam rises."); pline("%s is untouched.", The(xname(obj))); } return (AD_FIRE); case AD_COLD: if (!silent) { pline("Icicles form and fall from the freezing %s.", the(xname(obj))); } return (AD_COLD); case AD_ELEC: if (!silent) { pline_The("humid air crackles with electricity from %s.", the(xname(obj))); } return (AD_ELEC); case AD_DRLI: if (!silent) { pline("%s absorbs the water!", The(xname(obj))); } return (AD_DRLI); default: break; } return (-1); } /* WAC return TRUE if artifact is always lit */ boolean artifact_light(obj) struct obj *obj; { return get_artifact(obj) && (obj->oartifact == ART_SUNSWORD || obj->oartifact == ART_HOLY_SPEAR_OF_LIGHT || obj->oartifact == ART_CANDLE_OF_ETERNAL_FLAME); } /* KMH -- Talking artifacts are finally implemented */ void arti_speak(obj) struct obj *obj; { register const struct artifact *oart = get_artifact(obj); const char *line; char buf[BUFSZ]; /* Is this a speaking artifact? */ if (!oart || !(oart->spfx & SPFX_SPEAK)) return; line = getrumor(bcsign(obj), buf, TRUE); if (!*line) line = "Slash'EM 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 */ /*artifact.c*/ slashem-0.0.7E7F3/src/read.c0000664000076400007640000017236110545462317013534 0ustar aliali/* SCCS Id: @(#)read.c 3.4 2003/10/22 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" /* KMH -- Copied from pray.c; this really belongs in a header file */ #define DEVOUT 14 #define STRIDENT 4 #define Your_Own_Role(mndx) \ ((mndx) == urole.malenum || \ (urole.femalenum != NON_PM && (mndx) == urole.femalenum)) #define Your_Own_Race(mndx) \ ((mndx) == urace.malenum || \ (urace.femalenum != NON_PM && (mndx) == urace.femalenum)) #ifdef OVLB boolean known; static NEARDATA const char readable[] = { SCROLL_CLASS, SPBOOK_CLASS, RING_CLASS, 0 }; static const char all_count[] = { ALLOW_COUNT, ALL_CLASSES, 0 }; #if 0 static const char *warnings[] = { "white", "pink", "red", "ruby", "purple", "black" }; #endif #if 0 static void FDECL(wand_explode, (struct obj *)); #endif static void NDECL(do_class_genocide); static void FDECL(stripspe,(struct obj *)); static void FDECL(p_glow1,(struct obj *)); static void FDECL(p_glow2,(struct obj *,const char *)); static void FDECL(randomize,(int *, int)); static void FDECL(forget_single_object, (int)); static void FDECL(maybe_tame, (struct monst *,struct obj *)); STATIC_PTR void FDECL(set_lit, (int,int,genericptr_t)); int doread() { register struct obj *scroll; register boolean confused; char class_list[SIZE(readable) + 3]; char *cp = class_list; struct engr *ep = engr_at(u.ux, u.uy); boolean cant_see = Blind; struct obj otemp; *cp++ = ALL_CLASSES; *cp++ = ALLOW_FLOOROBJ; if (!u.uswallow && ep && ep->engr_txt[0]) *cp++ = ALLOW_THISPLACE; Strcpy(cp, readable); known = FALSE; if(check_capacity((char *)0)) return (0); scroll = getobj(class_list, "read"); if(!scroll) return(0); if (scroll == &thisplace) { (void) sense_engr_at(u.ux, u.uy, TRUE); return 0; } #ifdef INVISIBLE_OBJECTS if (scroll->oinvis && !See_invisible) cant_see = TRUE; #endif /* KMH -- some rings can be read, even while illiterate */ if (scroll->oclass == RING_CLASS) { const char *clr = (char *)0; if (cant_see) { You("cannot see it!"); return 0; } if (scroll->where != OBJ_INVENT || !(scroll->owornmask & W_RING)) { pline("Perhaps you should put it on first."); return 0; } if (scroll->dknown && objects[scroll->otyp].oc_name_known) switch (scroll->otyp) { #if 0 /* Not yet supported under 3.3.1 style warning system */ case RIN_WARNING: if (warnlevel >= 100) clr = "light blue"; else if (warnlevel >= SIZE(warnings)) clr = warnings[SIZE(warnings)-1]; else clr = warnings[warnlevel]; break; #endif case RIN_MOOD: if (u.ualign.record >= DEVOUT) clr = "green"; /* well-pleased */ else if (u.ualign.record >= STRIDENT) clr = "yellow"; /* pleased */ else if (u.ualign.record > 0) clr = "orange"; /* satisfied */ else clr = "red"; /* you've been naughty */ break; default: break; } if (!clr) pline("There seems to be nothing special about this ring."); else if (scroll->cursed) pline("It appears dark."); else pline("It glows %s!", hcolor(clr)); return 1; } /* outrumor has its own blindness check */ if(scroll->otyp == FORTUNE_COOKIE) { long save_Blinded = Blinded; if(flags.verbose) You("break up the cookie and throw away the pieces."); Blinded = cant_see; /* Treat invisible fortunes as if blind */ outrumor(bcsign(scroll), BY_COOKIE); Blinded = save_Blinded; if (!cant_see) u.uconduct.literate++; if (carried(scroll)) useup(scroll); else useupf(scroll, 1L); 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; if (cant_see) { You_cant("feel any Braille writing."); return 0; } 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, (int)(strlen(buf) * erosion / (2*MAX_ERODE)), scroll->o_id ^ (unsigned)u.ubirthday); pline("\"%s\"", buf); return 1; #endif /* TOURIST */ } else if (scroll->oclass != SCROLL_CLASS && scroll->oclass != SPBOOK_CLASS) { pline(silly_thing_to, "read"); return(0); } else if (Blind) { const char *what = 0; if (scroll->oclass == SPBOOK_CLASS) what = "mystic runes"; else if (!scroll->dknown) what = "formula on the scroll"; if (what) { pline("Being blind, you cannot read the %s.", what); return(0); } } else if (cant_see) { if (scroll->oclass == SPBOOK_CLASS) { You_cant("read the mystic runes in the invisible spellbook."); return(0); } else if (!scroll->dknown) { You_cant("read the formula on the invisible scroll."); return(0); } } /* Actions required to win the game aren't counted towards conduct */ if (scroll->otyp != SPE_BOOK_OF_THE_DEAD && scroll->otyp != SPE_BLANK_PAPER && scroll->otyp != SCR_BLANK_PAPER) u.uconduct.literate++; confused = (Confusion != 0); #ifdef MAIL if (scroll->otyp == SCR_MAIL) confused = FALSE; #endif if(scroll->oclass == SPBOOK_CLASS) { return(study_book(scroll)); } 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"); } } /* * When reading scrolls of teleportation off the floor special * care needs to be taken so that the scroll is used up before * a potential level teleport occurs. */ if (scroll->otyp == SCR_TELEPORTATION) { otemp = *scroll; otemp.where = OBJ_FREE; otemp.nobj = (struct obj *)0; if (carried(scroll)) useup(scroll); else if (mcarried(scroll)) m_useup(scroll->ocarry, scroll); else useupf(scroll, 1L); scroll = &otemp; } if(!seffects(scroll)) { if(!objects[scroll->otyp].oc_name_known) { if(known) { makeknown(scroll->otyp); more_experienced(0,10); } else if(!objects[scroll->otyp].oc_uname) docall(scroll); } if (spell_skilltype(scroll->otyp) != P_NONE) { use_skill(spell_skilltype(scroll->otyp), (scroll->blessed ? 2 : 1)); } if(scroll->otyp != SCR_BLANK_PAPER && scroll->otyp != SCR_TELEPORTATION) { if (carried(scroll)) useup(scroll); else if (mcarried(scroll)) m_useup(scroll->ocarry, scroll); else useupf(scroll, 1L); } else scroll->in_use = FALSE; } return(1); } static void stripspe(obj) register struct obj *obj; { if (obj->blessed) pline(nothing_happens); else { if (obj->spe > 0) { 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); } } static void p_glow1(otmp) register struct obj *otmp; { Your("%s %s briefly.", xname(otmp), otense(otmp, Blind ? "vibrate" : "glow")); } static void p_glow2(otmp,color) 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 */ /* possible to be able to charge things for which this returns FALSE. */ boolean is_chargeable(obj) struct obj *obj; { if (obj->oclass == WAND_CLASS || obj->oclass == SPBOOK_CLASS) return TRUE; /* known && !uname is possible after amnesia/mind flayer */ if (obj->oclass == RING_CLASS) return (boolean)(objects[obj->otyp].oc_charged && (obj->known || objects[obj->otyp].oc_uname)); #ifdef LIGHTSABERS if (is_lightsaber(obj)) return TRUE; #endif if (is_weptool(obj)) /* specific check before general tools */ return FALSE; if (obj->oclass == TOOL_CLASS) return (boolean)(objects[obj->otyp].oc_charged); return FALSE; /* why are weapons/armor considered charged anyway? */ } /* * recharge an object; curse_bless is -1 if the recharging implement * was cursed, +1 if blessed, 0 otherwise. */ void recharge(obj, curse_bless) struct obj *obj; int curse_bless; { register int n; boolean is_cursed, is_blessed; is_cursed = curse_bless < 0; is_blessed = curse_bless > 0; if (obj->oclass == WAND_CLASS) { /* undo any prior cancellation, even when is_cursed */ if (obj->spe == -1) obj->spe = 0; /* * Recharging might cause wands to explode. * v = number of previous recharges * v = percentage chance to explode on this attempt * v = cumulative odds for exploding * 0 : 0 0 * 1 : 0.29 0.29 * 2 : 2.33 2.62 * 3 : 7.87 10.28 * 4 : 18.66 27.02 * 5 : 36.44 53.62 * 6 : 62.97 82.83 * 7 : 100 100 */ n = (int)obj->recharged; if (n > 0 && (obj->otyp == WAN_WISHING || (n * n * n > rn2(7*7*7)))) { /* recharge_limit */ Your("%s vibrates violently, and explodes!",xname(obj)); wand_explode(obj, FALSE); return; } /* didn't explode, so increment the recharge count */ obj->recharged = (unsigned)(n + 1); /* now handle the actual recharging */ if (is_cursed) { stripspe(obj); } else { int lim = (obj->otyp == WAN_WISHING) ? 3 : (objects[obj->otyp].oc_dir != NODIR) ? 8 : 15; n = (lim == 3) ? 3 : rn1(5, lim + 1 - 5); if (!is_blessed) n = rnd(n); if (obj->spe < n) obj->spe = n; else obj->spe++; if (obj->otyp == WAN_WISHING && obj->spe > 3) { Your("%s vibrates violently, and explodes!",xname(obj)); wand_explode(obj, FALSE); return; } if (obj->spe >= lim) p_glow2(obj, NH_BLUE); else p_glow1(obj); } } else if (obj->oclass == SPBOOK_CLASS) { if (obj->otyp == SPE_BOOK_OF_THE_DEAD) { pline(nothing_happens); return; } /* * Recharging might cause spellbooks to crumble. * v = number of previous recharges * v = percentage chance to crumble on this attempt * v = cumulative odds for crumbling * 0 : 0 0 * 1 : 0.15 0.15 * 2 : 0.73 0.87 * 3 : 1.97 2.82 * 4 : 4.08 6.79 * 5 : 7.29 13.58 * 6 : 11.81 23.79 * 7 : 17.86 37.40 * 8 : 25.17 53.16 * 9 : 33.03 68.63 * 10 : 40.68 81.39 * 11 : 47.64 90.26 * 12 : 53.72 95.49 * 13 : 58.90 98.15 * 14 : 63.29 99.32 */ n = (int)obj->recharged; if (n > 0 && (n * n * n > rn2(7*7*7))) { /* recharge_limit */ Your("%s crumbles to dust!", xname(obj)); useup(obj); return; } /* didn't crumble, so possibly increment the recharge count */ if (!rn2(2)) obj->recharged = (unsigned)(n + 1); /* now handle the actual recharging */ if (is_cursed) { stripspe(obj); } else { int lim = (objects[obj->otyp].oc_dir != NODIR) ? 8 : 15; n = rn1(5, lim + 1 - 5); if (!is_blessed) n = rnd(n); if (obj->spe < n) obj->spe = n; else obj->spe++; if (obj->spe >= lim) p_glow2(obj, NH_BLUE); else p_glow1(obj); } } else if (obj->oclass == RING_CLASS && objects[obj->otyp].oc_charged) { /* charging does not affect ring's curse/bless status */ int s = is_blessed ? rnd(3) : is_cursed ? -rnd(2) : 1; boolean is_on = (obj == uleft || obj == uright); /* 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); losehp(s, "exploding ring", KILLED_BY_AN); } else { long mask = is_on ? (obj == uleft ? LEFT_RING : RIGHT_RING) : 0L; Your("%s spins %sclockwise for a moment.", xname(obj), s < 0 ? "counter" : ""); /* cause attributes and/or properties to be updated */ if (is_on) Ring_off(obj); obj->spe += s; /* update the ring while it's off */ if (is_on) setworn(obj, mask), Ring_on(obj); /* oartifact: if a touch-sensitive artifact ring is ever created the above will need to be revised */ } } else if (obj->oclass == TOOL_CLASS) { int rechrg = (int)obj->recharged; if (objects[obj->otyp].oc_charged) { /* tools don't have a limit, but the counter used does */ if (rechrg < 7) /* recharge_limit */ obj->recharged++; } switch(obj->otyp) { case BELL_OF_OPENING: if (is_cursed) stripspe(obj); else if (is_blessed) obj->spe += rnd(3); else obj->spe += 1; if (obj->spe > 5) obj->spe = 5; break; case MAGIC_MARKER: case TINNING_KIT: #ifdef TOURIST case EXPENSIVE_CAMERA: #endif if (is_cursed) stripspe(obj); else if (rechrg && obj->otyp == MAGIC_MARKER) { /* previously recharged */ obj->recharged = 1; /* override increment done above */ if (obj->spe < 3) Your("marker seems permanently dried out."); else pline(nothing_happens); } else if (is_blessed) { n = rn1(16,15); /* 15..30 */ if (obj->spe + n <= 50) obj->spe = 50; else if (obj->spe + n <= 75) obj->spe = 75; else { int chrg = (int)obj->spe; if ((chrg + n) > 127) obj->spe = 127; else obj->spe += n; } p_glow2(obj, NH_BLUE); } else { n = rn1(11,10); /* 10..20 */ if (obj->spe + n <= 50) obj->spe = 50; else { int chrg = (int)obj->spe; if ((chrg + n) > 127) obj->spe = 127; else obj->spe += n; } p_glow2(obj, NH_WHITE); } break; case OIL_LAMP: case BRASS_LANTERN: if (is_cursed) { stripspe(obj); if (obj->lamplit) { if (!Blind) pline("%s out!", Tobjnam(obj, "go")); end_burn(obj, TRUE); } } else if (is_blessed) { obj->spe = 1; obj->age = 1500; p_glow2(obj, NH_BLUE); } else { obj->spe = 1; obj->age += 750; if (obj->age > 1500) obj->age = 1500; p_glow1(obj); } break; #ifdef LIGHTSABERS case GREEN_LIGHTSABER: #ifdef D_SABER case BLUE_LIGHTSABER: #endif case RED_LIGHTSABER: case RED_DOUBLE_LIGHTSABER: if (is_cursed) { if (obj->lamplit) { end_burn(obj, TRUE); obj->age = 0; if (!Blind) pline("%s deactivates!", The(xname(obj))); } else obj->age = 0; } else if (is_blessed) { obj->age = 1500; p_glow2(obj, NH_BLUE); } else { obj->age += 750; if (obj->age > 1500) obj->age = 1500; p_glow1(obj); } break; #endif case CRYSTAL_BALL: if (is_cursed) stripspe(obj); else if (is_blessed) { obj->spe = 6; p_glow2(obj, NH_BLUE); } else { if (obj->spe < 5) { obj->spe++; p_glow1(obj); } else pline(nothing_happens); } break; case HORN_OF_PLENTY: case BAG_OF_TRICKS: case CAN_OF_GREASE: if (is_cursed) stripspe(obj); else if (is_blessed) { if (obj->spe <= 10) obj->spe += rn1(10, 6); else obj->spe += rn1(5, 6); if (obj->spe > 50) obj->spe = 50; p_glow2(obj, NH_BLUE); } else { obj->spe += rnd(5); if (obj->spe > 50) obj->spe = 50; p_glow1(obj); } break; case MAGIC_FLUTE: case MAGIC_HARP: case FROST_HORN: case FIRE_HORN: case DRUM_OF_EARTHQUAKE: if (is_cursed) { stripspe(obj); } else if (is_blessed) { obj->spe += d(2,4); if (obj->spe > 20) obj->spe = 20; p_glow2(obj, NH_BLUE); } else { obj->spe += rnd(4); if (obj->spe > 20) obj->spe = 20; p_glow1(obj); } break; default: goto not_chargable; /*NOTREACHED*/ break; } /* switch */ } else { not_chargable: You("have a feeling of loss."); } } /* Forget known information about this object class. */ static void forget_single_object(obj_id) int obj_id; { 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? */ } #if 0 /* here if anyone wants it.... */ /* Forget everything known about a particular object class. */ static void forget_objclass(oclass) int oclass; { int i; for (i=bases[oclass]; i < NUM_OBJECTS && objects[i].oc_class==oclass; i++) forget_single_object(i); } #endif /* randomize the given list of numbers 0 <= i < count */ static void randomize(indices, count) int *indices; int count; { int i, iswap, temp; for (i = count - 1; i > 0; i--) { if ((iswap = rn2(i + 1)) == i) continue; temp = indices[i]; indices[i] = indices[iswap]; indices[iswap] = temp; } } /* Forget % of known objects. */ void forget_objects(percent) int percent; { int i, count; int indices[NUM_OBJECTS]; if (percent == 0) return; if (percent <= 0 || percent > 100) { impossible("forget_objects: bad percent %d", percent); return; } for (count = 0, i = 1; i < NUM_OBJECTS; i++) if (OBJ_DESCR(objects[i]) && (objects[i].oc_name_known || objects[i].oc_uname)) indices[count++] = i; randomize(indices, count); /* forget first % of randomized indices */ count = ((count * percent) + 50) / 100; for (i = 0; i < count; i++) forget_single_object(indices[i]); } /* Forget some or all of map (depends on parameters). */ void forget_map(howmuch) int howmuch; { register int zx, zy; if (In_sokoban(&u.uz)) return; known = TRUE; for(zx = 0; zx < COLNO; zx++) for(zy = 0; zy < ROWNO; zy++) if (howmuch & ALL_MAP || rn2(7)) { /* Zonk all memory of this location. */ levl[zx][zy].seenv = 0; levl[zx][zy].waslit = 0; clear_memory_glyph(zx, zy, S_stone); } } /* Forget all traps on the level. */ void forget_traps() { register struct trap *trap; /* forget all traps (except the one the hero is in :-) */ for (trap = ftrap; trap; trap = trap->ntrap) if ((trap->tx != u.ux || trap->ty != u.uy) && (trap->ttyp != HOLE)) trap->tseen = 0; } /* * Forget given % of all levels that the hero has visited and not forgotten, * except this one. */ void forget_levels(percent) int percent; { int i, count; xchar maxl, this_lev; int indices[MAXLINFO]; if (percent == 0) return; if (percent <= 0 || percent > 100) { impossible("forget_levels: bad percent %d", percent); return; } this_lev = ledger_no(&u.uz); maxl = maxledgerno(); /* count & save indices of non-forgotten visited levels */ /* Sokoban levels are pre-mapped for the player, and should stay * so, or they become nearly impossible to solve. But try to * shift the forgetting elsewhere by fiddling with percent * instead of forgetting fewer levels. */ for (count = 0, i = 0; i <= maxl; i++) if ((level_info[i].flags & VISITED) && !(level_info[i].flags & FORGOTTEN) && i != this_lev) { if (ledger_to_dnum(i) == sokoban_dnum) percent += 2; else indices[count++] = i; } if (percent > 100) percent = 100; randomize(indices, count); /* forget first % of randomized indices */ count = ((count * percent) + 50) / 100; for (i = 0; i < count; i++) { level_info[indices[i]].flags |= FORGOTTEN; } } /* * Forget some things (e.g. after reading a scroll of amnesia). When called, * the following are always forgotten: * * - felt ball & chain * - traps * - part (6 out of 7) of the map * * Other things are subject to flags: * * howmuch & ALL_MAP = forget whole map * howmuch & ALL_SPELLS = forget all spells */ void forget(howmuch) int howmuch; { if (Punished) u.bc_felt = 0; /* forget felt ball&chain */ forget_map(howmuch); forget_traps(); /* 1 in 3 chance of forgetting some levels */ if (!rn2(3)) forget_levels(rn2(25)); /* 1 in 3 chance of forgeting some objects */ if (!rn2(3)) forget_objects(rn2(25)); if (howmuch & ALL_SPELLS) losespells(); /* * Make sure that what was seen is restored correctly. To do this, * we need to go blind for an instant --- turn off the display, * then restart it. All this work is needed to correctly handle * walls which are stone on one side and wall on the other. Turning * off the seen bits above will make the wall revert to stone, but * there are cases where we don't want this to happen. The easiest * thing to do is to run it through the vision system again, which * is always correct. */ 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; { #ifdef BLACKMARKET if (sobj->cursed || Is_blackmarket(&u.uz)) { #else if (sobj->cursed) { #endif 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; { register int cval; register boolean confused = (Confusion != 0); register struct obj *otmp; if (objects[sobj->otyp].oc_magic) exercise(A_WIS, TRUE); /* just for trying */ switch(sobj->otyp) { #ifdef MAIL case SCR_MAIL: known = TRUE; if (sobj->spe) pline("This seems to be junk mail addressed to the finder of the Eye of Larn."); /* note to the puzzled: the game Larn actually sends you junk * mail if you win! */ else readmail(sobj); break; #endif case SPE_ENCHANT_ARMOR: case SCR_ENCHANT_ARMOR: { register schar s; boolean special_armor; boolean same_color; otmp = some_armor(&youmonst); if(!otmp) { strange_feeling(sobj, !Blind ? "Your skin glows then fades." : "Your skin feels warm for a moment."); exercise(A_CON, !sobj->cursed); exercise(A_STR, !sobj->cursed); return(1); } if(confused) { 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 ? NH_BLACK : NH_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; } /* elven armor vibrates warningly when enchanted beyond a limit */ special_armor = is_elven_armor(otmp) || (Role_if(PM_WIZARD) && otmp->otyp == CORNUTHAUM) || (Role_if(PM_VALKYRIE) && otmp->otyp == GAUNTLETS_OF_POWER); if (sobj->cursed) same_color = (otmp->otyp == BLACK_DRAGON_SCALE_MAIL || otmp->otyp == BLACK_DRAGON_SCALES); else same_color = (otmp->otyp == SILVER_DRAGON_SCALE_MAIL || otmp->otyp == SILVER_DRAGON_SCALES || otmp->otyp == SHIELD_OF_REFLECTION); if (Blind) same_color = FALSE; /* 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 ? NH_BLACK : NH_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(); if(is_gloves(otmp)) (void) Gloves_off(); if(is_shield(otmp)) (void) Shield_off(); if(otmp == uarm) (void) Armor_gone(); useup(otmp); break; } /* KMH, balance patch -- Restore the NetHack success rate */ /* We'll introduce a disenchantment attack later */ s = sobj->cursed ? -1 : otmp->spe >= 9 ? (rn2(otmp->spe) == 0) : sobj->blessed ? rnd(3-otmp->spe/3) : 1; /* s = sobj->cursed ? -rnd(2) : otmp->spe >= 3 ? (rn2(otmp->spe) == 0) : sobj->blessed ? rnd(2) : 1;*/ if (s >= 0 && otmp->otyp >= GRAY_DRAGON_SCALES && otmp->otyp <= YELLOW_DRAGON_SCALES) { /* dragon scales get turned into dragon scale mail */ Your("%s merges and hardens!", xname(otmp)); setworn((struct obj *)0, W_ARM); /* assumes same order */ otmp->otyp = GRAY_DRAGON_SCALE_MAIL + otmp->otyp - GRAY_DRAGON_SCALES; otmp->cursed = 0; if (sobj->blessed) { otmp->spe++; otmp->blessed = 1; } otmp->known = 1; setworn(otmp, W_ARM); break; } 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 ? NH_BLACK : NH_SILVER), (s*s>1) ? "while" : "moment"); otmp->cursed = sobj->cursed; if (!otmp->blessed || sobj->cursed) otmp->blessed = sobj->blessed; if (s) { otmp->spe += s; adj_abon(otmp, s); known = otmp->known; } 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; } case SCR_DESTROY_ARMOR: { otmp = some_armor(&youmonst); if(confused) { if(!otmp) { strange_feeling(sobj,"Your bones itch."); exercise(A_STR, FALSE); exercise(A_CON, FALSE); return(1); } otmp->oerodeproof = sobj->cursed; p_glow2(otmp, NH_PURPLE); break; } if(!sobj->cursed || !otmp || !otmp->cursed) { if(!destroy_arm(otmp)) { strange_feeling(sobj,"Your skin itches."); exercise(A_STR, FALSE); exercise(A_CON, FALSE); return(1); } 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); } } break; case SCR_CONFUSE_MONSTER: case SPE_CONFUSE_MONSTER: if(youmonst.data->mlet != S_HUMAN || sobj->cursed) { if(!HConfusion) You_feel("confused."); make_confused(HConfusion + rnd(100),FALSE); } else if(confused) { if(!sobj->blessed) { Your("%s begin to %s%s.", makeplural(body_part(HAND)), Blind ? "tingle" : "glow ", Blind ? nul : hcolor(NH_PURPLE)); make_confused(HConfusion + rnd(100),FALSE); } else { pline("A %s%s surrounds your %s.", Blind ? nul : hcolor(NH_RED), Blind ? "faint buzz" : " glow", body_part(HEAD)); make_confused(0L,TRUE); } } else { if (!sobj->blessed) { Your("%s%s %s%s.", makeplural(body_part(HAND)), Blind ? "" : " begin to glow", Blind ? (const char *)"tingle" : hcolor(NH_RED), u.umconf ? " even more" : ""); u.umconf++; } else { if (Blind) Your("%s tingle %s sharply.", makeplural(body_part(HAND)), u.umconf ? "even more" : "very"); else Your("%s glow a%s brilliant %s.", makeplural(body_part(HAND)), u.umconf ? "n even more" : "", hcolor(NH_RED)); /* after a while, repeated uses become less effective */ if (u.umconf >= 40) u.umconf++; else u.umconf += rn1(8, 2); } } break; case SCR_SCARE_MONSTER: case SPE_CAUSE_FEAR: { register int ct = 0; register struct monst *mtmp; for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) { if (DEADMONSTER(mtmp)) continue; if(cansee(mtmp->mx,mtmp->my)) { if(confused || sobj->cursed) { mtmp->mflee = mtmp->mfrozen = mtmp->msleeping = 0; 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 */ } } if(!ct) You_hear("%s in the distance.", (confused || sobj->cursed) ? "sad wailing" : "maniacal laughter"); else if(sobj->otyp == SCR_SCARE_MONSTER) You_hear("%s close by.", (confused || sobj->cursed) ? "sad wailing" : "maniacal laughter"); break; } case SCR_BLANK_PAPER: if (Blind) You("don't remember there being any magic words on this scroll."); else pline("This scroll seems to be blank."); known = TRUE; break; /* KMH, balance patch -- removed case SCR_TRAP_DETECTION: if (!sobj->cursed) return(trap_detect(sobj)); break;*/ case SCR_REMOVE_CURSE: case SPE_REMOVE_CURSE: { register struct obj *obj; if(confused) { if (Hallucination) You_feel("the power of the Force against you!"); else You_feel("like you need some help."); } else if (Hallucination) You_feel("in touch with the Universal Oneness."); else You_feel("like someone is helping you."); if (sobj->cursed) { pline_The("scroll disintegrates."); } else { for (obj = invent; obj; obj = obj->nobj) { long wornmask; #ifdef GOLDOBJ /* gold isn't subject to cursing and blessing */ if (obj->oclass == COIN_CLASS) continue; #endif wornmask = (obj->owornmask & ~(W_BALL|W_ART|W_ARTI)); if (wornmask && !sobj->blessed) { /* handle a couple of special cases; we don't allow auxiliary weapon slots to be used to artificially increase number of worn items */ if (obj == uswapwep) { if (!u.twoweap) wornmask = 0L; } else if (obj == uquiver) { if (obj->oclass == WEAPON_CLASS) { /* mergeable weapon test covers ammo, missiles, spears, daggers & knives */ if (!objects[obj->otyp].oc_merge) wornmask = 0L; } else if (obj->oclass == GEM_CLASS) { /* possibly ought to check whether alternate weapon is a sling... */ if (!uslinging()) wornmask = 0L; } else { /* weptools don't merge and aren't reasonable quivered weapons */ wornmask = 0L; } } } if (sobj->blessed || wornmask || obj->otyp == LOADSTONE || obj->otyp == HEALTHSTONE || (obj->otyp == LEASH && obj->leashmon)) { if(confused) blessorcurse(obj, 2); else uncurse(obj); } } } if(Punished && !confused) unpunish(); update_inventory(); break; } case SCR_CREATE_MONSTER: case SPE_CREATE_MONSTER: if (create_critters(1 + ((confused || sobj->cursed) ? 12 : 0) + ((sobj->blessed || rn2(73)) ? 0 : rnd(4)), confused ? &mons[PM_ACID_BLOB] : (struct permonst *)0)) known = TRUE; /* no need to flush monsters; we ask for identification only if the * monsters are not visible */ break; case SPE_SUMMON_UNDEAD: { int cnt = 1, oldmulti = multi; struct monst *mtmp; multi = 0; if(!rn2(73) && !sobj->blessed) cnt += rnd(4); if(confused || sobj->cursed) cnt += 12; while(cnt--) { #ifdef WIZARD if(!wizard || !(mtmp = create_particular())) #endif switch (rn2(10)+1) { case 1: mtmp = makemon(mkclass(S_VAMPIRE,0), u.ux, u.uy, NO_MM_FLAGS); break; case 2: case 3: case 4: case 5: mtmp = makemon(mkclass(S_ZOMBIE,0), u.ux, u.uy, NO_MM_FLAGS); break; case 6: case 7: case 8: mtmp = makemon(mkclass(S_MUMMY,0), u.ux, u.uy, NO_MM_FLAGS); break; case 9: mtmp = makemon(mkclass(S_GHOST,0), u.ux, u.uy, NO_MM_FLAGS); break; case 10: mtmp = makemon(mkclass(S_WRAITH,0), u.ux, u.uy, NO_MM_FLAGS); break; } /* WAC Give N a shot at controlling the beasties * (if not cursed ). Check curse status in case * this ever becomes a scroll */ if (mtmp) if (!sobj->cursed && Role_if(PM_NECROMANCER)) { if (!resist(mtmp, sobj->oclass, 0, TELL)) { mtmp = tamedog(mtmp, (struct obj *) 0); if (mtmp) You("dominate %s!", mon_nam(mtmp)); } } else setmangry(mtmp); } multi = oldmulti; /* WAC Give those who know command undead a shot at control. * Since spell is area affect, do this after all undead * are summoned */ if (!Role_if(PM_NECROMANCER) && !(sobj->cursed)) { if (objects[SPE_COMMAND_UNDEAD].oc_name_known) { int sp_no; for (sp_no = 0; sp_no < MAXSPELL; sp_no++) if (spl_book[sp_no].sp_id == SPE_COMMAND_UNDEAD) { You("try to command %s", mon_nam(mtmp)); spelleffects(sp_no, TRUE); break; } if (sp_no == MAXSPELL) You("don't seem to have the spell command undead memorized!"); } else You("don't know how to command undead..."); } /* flush monsters before asking for identification */ flush_screen(0); break; } case SPE_ENCHANT_WEAPON: case SCR_ENCHANT_WEAPON: if(uwep && (uwep->oclass == WEAPON_CLASS || is_weptool(uwep)) && confused) { /* oclass check added 10/25/86 GAN */ uwep->oerodeproof = !(sobj->cursed); if (Blind) { uwep->rknown = FALSE; Your("weapon feels warm for a moment."); } else { uwep->rknown = TRUE; Your("%s covered by a %s %s %s!", aobjnam(uwep, "are"), sobj->cursed ? "mottled" : "shimmering", hcolor(sobj->cursed ? NH_PURPLE : NH_GOLDEN), sobj->cursed ? "glow" : "shield"); } if (uwep->oerodeproof && (uwep->oeroded || uwep->oeroded2)) { uwep->oeroded = uwep->oeroded2 = 0; Your("%s as good as new!", aobjnam(uwep, Blind ? "feel" : "look")); } /* KMH, balance patch -- Restore the NetHack success rate */ } else return !chwepon(sobj, sobj->cursed ? -1 : !uwep ? 1 : uwep->spe >= 9 ? (rn2(uwep->spe) == 0) : sobj->blessed ? rnd(3-uwep->spe/3) : 1); /* else return !chwepon(sobj, sobj->cursed ? -rnd(2) : !uwep ? 1 : uwep->spe >= 3 ? (rn2(uwep->spe) == 0) : sobj->blessed ? rnd(2) : 1);*/ 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 SPE_COMMAND_UNDEAD: if (u.uswallow) { if (is_undead(u.ustuck->data)) 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 && is_undead(mtmp->data)) maybe_tame(mtmp, sobj); } } break; case SCR_GENOCIDE: You("have found a scroll of genocide!"); known = TRUE; if (sobj->blessed) do_class_genocide(); else do_genocide(!sobj->cursed | (2 * !!Confusion)); break; case SCR_LIGHT: if(!Blind) known = TRUE; litroom(!confused && !sobj->cursed, sobj); break; case SCR_TELEPORTATION: if(confused || sobj->cursed) level_tele(); else { if (sobj->blessed && !Teleport_control) { known = TRUE; HTeleport_control = 2; /* if (yn("Do you wish to teleport?")=='n') * break; */ } tele(); if(Teleport_control || !couldsee(u.ux0, u.uy0) || (distu(u.ux0, u.uy0) >= 16)) known = TRUE; } break; case SCR_GOLD_DETECTION: if (confused || sobj->cursed) return(trap_detect(sobj)); else return(gold_detect(sobj)); case SCR_FOOD_DETECTION: case SPE_DETECT_FOOD: if (food_detect(sobj)) return(1); /* nothing detected */ break; case SPE_IDENTIFY: cval = rn2(5); goto id; case SCR_IDENTIFY: /* known = TRUE; */ if(confused) You("identify this as an identify scroll."); else pline("This is an identify scroll."); if (sobj->blessed || (!sobj->cursed && !rn2(5))) { cval = rn2(5); /* 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); if (carried(sobj)) useup(sobj); else useupf(sobj, 1L); makeknown(SCR_IDENTIFY); id: if(invent && !confused) { identify_pack(cval); } return(1); case SCR_CHARGING: if (confused) { You_feel("charged up!"); if (u.uen < u.uenmax) u.uen = u.uenmax; else u.uen = (u.uenmax += d(5,4)); flags.botl = 1; break; } known = TRUE; pline("This is a charging scroll."); otmp = getobj(all_count, "charge"); if (!otmp) break; recharge(otmp, sobj->cursed ? -1 : (sobj->blessed ? 1 : 0)); break; case SCR_MAGIC_MAPPING: if (level.flags.nommap) { Your("mind is filled with crazy lines!"); if (Hallucination) pline("Wow! Modern art."); else Your("%s spins in bewilderment.", body_part(HEAD)); make_confused(HConfusion + rnd(30), FALSE); break; } if (sobj->blessed) { register int x, y; for (x = 1; x < COLNO; x++) for (y = 0; y < ROWNO; y++) if (levl[x][y].typ == SDOOR) cvt_sdoor_to_door(&levl[x][y]); /* do_mapping() already reveals secret passages */ } known = TRUE; case SPE_MAGIC_MAPPING: if (level.flags.nommap) { Your("%s spins as %s blocks the spell!", body_part(HEAD), something); make_confused(HConfusion + rnd(30), FALSE); break; } pline("A map coalesces in your mind!"); cval = (sobj->cursed && !confused); if(cval) HConfusion = 1; /* to screw up map */ do_mapping(); if (sobj->blessed && !cval) /* objects, too, pal! */ object_detect(sobj,0); if(cval) { HConfusion = 0; /* restore */ pline("Unfortunately, you can't grasp the details."); } break; case SCR_AMNESIA: known = TRUE; forget( (!sobj->blessed ? ALL_SPELLS : 0) | (!confused || sobj->cursed ? ALL_MAP : 0) ); if (Hallucination) /* Ommmmmm! */ Your("mind releases itself from mundane concerns."); else if (!strncmpi(plname, "Maud", 4)) pline("As your mind turns inward on itself, you forget everything else."); else if (rn2(2)) pline("Who was that Maud person anyway?"); else pline("Thinking of Maud you forget everything else."); exercise(A_WIS, FALSE); break; case SCR_FIRE: /* * Note: Modifications have been made as of 3.0 to allow for * some damage under all potential cases. */ cval = bcsign(sobj); if(!objects[sobj->otyp].oc_name_known) more_experienced(0,10); if (carried(sobj)) useup(sobj); else useupf(sobj, 1L); makeknown(SCR_FIRE); if(confused) { if(Fire_resistance) { shieldeff(u.ux, u.uy); if(!Blind) pline("Oh, look, what a pretty fire in your %s.", makeplural(body_part(HAND))); else You_feel("a pleasant warmth in your %s.", makeplural(body_part(HAND))); } else { pline_The("scroll catches fire and you burn your %s.", makeplural(body_part(HAND))); losehp(1, "scroll of fire", KILLED_BY_AN); } return(1); } if (Underwater) pline_The("water around you vaporizes violently!"); else { pline_The("scroll erupts in a tower of flame!"); burn_away_slime(); } explode(u.ux, u.uy, ZT_SPELL(ZT_FIRE), (2*(rn1(3, 3) + 2 * cval) + 1)/3, SCROLL_CLASS, EXPL_FIERY); return(1); case SCR_EARTH: /* TODO: handle steeds */ if ( #ifdef REINCARNATION !Is_rogue_level(&u.uz) && #endif (!In_endgame(&u.uz) || Is_earthlevel(&u.uz))) { register int x, y; /* Identify the scroll */ pline_The("%s rumbles %s you!", ceiling(u.ux,u.uy), sobj->blessed ? "around" : "above"); known = 1; if (In_sokoban(&u.uz)) change_luck(-1); /* Sokoban guilt */ /* Loop through the surrounding squares */ if (!sobj->cursed) for (x = u.ux-1; x <= u.ux+1; x++) { for (y = u.uy-1; y <= u.uy+1; y++) { /* Is this a suitable spot? */ if (isok(x, y) && !closed_door(x, y) && !IS_ROCK(levl[x][y].typ) && !IS_AIR(levl[x][y].typ) && (x != u.ux || y != u.uy)) { register struct obj *otmp2; register struct monst *mtmp; /* Make the object(s) */ otmp2 = mksobj(confused ? ROCK : BOULDER, FALSE, FALSE); if (!otmp2) continue; /* Shouldn't happen */ otmp2->quan = confused ? rn1(5,2) : 1; otmp2->owt = weight(otmp2); /* Find the monster here (won't be player) */ mtmp = m_at(x, y); if (mtmp && !amorphous(mtmp->data) && !passes_walls(mtmp->data) && !noncorporeal(mtmp->data) && !unsolid(mtmp->data)) { struct obj *helmet = which_armor(mtmp, W_ARMH); int mdmg; if (cansee(mtmp->mx, mtmp->my)) { pline("%s is hit by %s!", Monnam(mtmp), doname(otmp2)); if (mtmp->minvis && !canspotmon(mtmp)) map_invisible(mtmp->mx, mtmp->my); } mdmg = dmgval(otmp2, mtmp) * otmp2->quan; if (helmet) { if(is_metallic(helmet)) { if (canspotmon(mtmp)) pline("Fortunately, %s is wearing a hard helmet.", mon_nam(mtmp)); else if (flags.soundok) You_hear("a clanging sound."); if (mdmg > 2) mdmg = 2; } else { if (canspotmon(mtmp)) pline("%s's %s does not protect %s.", Monnam(mtmp), xname(helmet), mhim(mtmp)); } } mtmp->mhp -= mdmg; if (mtmp->mhp <= 0) xkilled(mtmp, 1); } /* Drop the rock/boulder to the floor */ if (!flooreffects(otmp2, x, y, "fall")) { place_object(otmp2, x, y); stackobj(otmp2); newsym(x, y); /* map the rock */ } } } } /* Attack the player */ if (!sobj->blessed) { int dmg; struct obj *otmp2; /* Okay, _you_ write this without repeating the code */ otmp2 = mksobj(confused ? ROCK : BOULDER, FALSE, FALSE); if (!otmp2) break; otmp2->quan = confused ? rn1(5,2) : 1; otmp2->owt = weight(otmp2); if (!amorphous(youmonst.data) && !Passes_walls && !noncorporeal(youmonst.data) && !unsolid(youmonst.data)) { You("are hit by %s!", doname(otmp2)); dmg = dmgval(otmp2, &youmonst) * otmp2->quan; if (uarmh && !sobj->cursed) { if(is_metallic(uarmh)) { pline("Fortunately, you are wearing a hard helmet."); if (dmg > 2) dmg = 2; } else if (flags.verbose) { Your("%s does not protect you.", xname(uarmh)); } } } else dmg = 0; /* Must be before the losehp(), for bones files */ if (!flooreffects(otmp2, u.ux, u.uy, "fall")) { place_object(otmp2, u.ux, u.uy); stackobj(otmp2); newsym(u.ux, u.uy); } if (dmg) losehp(dmg, "scroll of earth", KILLED_BY_AN); } } break; case SCR_PUNISHMENT: known = TRUE; if(confused || sobj->blessed) { You_feel("guilty."); break; } punish(sobj); break; case SCR_STINKING_CLOUD: { coord cc; You("have found a scroll of stinking cloud!"); known = TRUE; pline("Where do you want to center the cloud?"); cc.x = u.ux; cc.y = u.uy; if (getpos(&cc, TRUE, "the desired position") < 0) { pline(Never_mind); return 0; } if (!cansee(cc.x, cc.y) || distu(cc.x, cc.y) >= 32) { You("smell rotten eggs."); return 0; } (void) create_gas_cloud(cc.x, cc.y, 3+bcsign(sobj), 8+4*bcsign(sobj)); break; } default: impossible("What weird effect is this? (%u)", sobj->otyp); } return(0); } #if 0 static void wand_explode(obj) register struct obj *obj; { obj->in_use = TRUE; /* in case losehp() is fatal */ Your("%s vibrates violently, and explodes!",xname(obj)); nhbell(); losehp(rnd(2*(u.uhpmax+1)/3), "exploding wand", KILLED_BY_AN); useup(obj); exercise(A_STR, FALSE); } #endif /* * Low-level lit-field update routine. */ STATIC_PTR void set_lit(x,y,val) int x, y; genericptr_t val; { if (val) levl[x][y].lit = 1; else { levl[x][y].lit = 0; snuff_light_source(x, y); } } void litroom(on,obj) register boolean on; struct obj *obj; { char is_lit; /* value is irrelevant; we use its address as a `not null' flag for set_lit() */ /* first produce the text (provided you're not blind) */ if(!on) { register struct obj *otmp; if (!Blind) { if(u.uswallow) { 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 */ for(otmp = invent; otmp; otmp = otmp->nobj) if (otmp->lamplit) (void) snuff_lit(otmp); if (Blind) goto do_it; } else { 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.", Monnam(u.ustuck)); else pline("%s glistens.", Monnam(u.ustuck)); return; } pline("A lit field surrounds you!"); } do_it: /* No-op in water - can only see the adjacent squares and that's it! */ if (Underwater || Is_waterlevel(&u.uz)) return; /* * If we are darkening the room and the hero is punished but not * blind, then we have to pick up and replace the ball and chain so * that we don't remember them if they are out of sight. */ if (Punished && !on && !Blind) move_bc(1, 0, uball->ox, uball->oy, uchain->ox, uchain->oy); #ifdef REINCARNATION if (Is_rogue_level(&u.uz)) { /* Can't use do_clear_area because MAX_RADIUS is too small */ /* rogue lighting must light the entire room */ int rnum = levl[u.ux][u.uy].roomno - ROOMOFFSET; int rx, ry; if(rnum >= 0) { for(rx = rooms[rnum].lx-1; rx <= rooms[rnum].hx+1; rx++) for(ry = rooms[rnum].ly-1; ry <= rooms[rnum].hy+1; ry++) set_lit(rx, ry, (genericptr_t)(on ? &is_lit : (char *)0)); rooms[rnum].rlit = on; } /* hallways remain dark on the rogue level */ } else #endif do_clear_area(u.ux,u.uy, obj->oartifact ? 12 : (obj && obj->oclass==SCROLL_CLASS && obj->blessed) ? 9 : 5, set_lit, (genericptr_t)(on ? &is_lit : (char *)0)); /* * If we are not blind, then force a redraw on all positions in sight * by temporarily blinding the hero. The vision recalculation will * correctly update all previously seen positions *and* correctly * set the waslit bit [could be messed up from above]. */ if (!Blind) { vision_recalc(2); /* replace ball&chain */ if (Punished && !on) move_bc(0, 0, uball->ox, uball->oy, uchain->ox, uchain->oy); } vision_full_recalc = 1; /* delayed vision recalculation */ } static void do_class_genocide() { /*WAC adding windowstuff*/ winid tmpwin; anything any; int n; menu_item *selected; int i, j, immunecnt, gonecnt, goodcnt, class, feel_dead = 0; char buf[BUFSZ]; boolean gameover = FALSE; /* true iff killed self */ for(j=0; ; j++) { if (j >= 5) { pline(thats_enough_tries); return; } do { getlin("What class of monsters do you wish to genocide? [? for help]", buf); (void)mungspaces(buf); } while (buf[0]=='\033' || !buf[0]); /* choosing "none" preserves genocideless conduct */ if (!strcmpi(buf, "none") || !strcmpi(buf, "nothing")) return; if (strlen(buf) == 1) { /*WAC adding "help" for those who use graphical displays*/ if (buf[0]=='?'){ tmpwin = create_nhwindow(NHW_MENU); start_menu(tmpwin); any.a_void = 0; /* zero out all bits */ for (i = 1; i < (MAXMCLASSES - MISCMCLASSES); i++) { any.a_int = i; /* must be non-zero */ if (monexplain[i]) add_menu(tmpwin, NO_GLYPH, &any, def_monsyms[i], 0, ATR_NONE, an(monexplain[i]), MENU_UNSELECTED); } end_menu(tmpwin, "Monster Types"); n = 0; while (n == 0) n = select_menu(tmpwin, PICK_ONE, &selected); destroy_nhwindow(tmpwin); if (n== -1) continue; /*user hit escape*/ class = selected[0].item.a_int; } else { if (buf[0] == ILLOBJ_SYM) buf[0] = def_monsyms[S_MIMIC]; class = def_char_to_monclass(buf[0]); } } else { char buf2[BUFSZ]; class = 0; Strcpy(buf2, makesingular(buf)); Strcpy(buf, buf2); } immunecnt = gonecnt = goodcnt = 0; for (i = LOW_PM; i < NUMMONS; i++) { if (class == 0 && strstri(monexplain[(int)mons[i].mlet], buf) != 0) class = mons[i].mlet; if (mons[i].mlet == class) { if (!(mons[i].geno & G_GENO)) immunecnt++; else if(mvitals[i].mvflags & G_GENOD) gonecnt++; else goodcnt++; } } /* * TODO[?]: If user's input doesn't match any class * description, check individual species names. */ if (!goodcnt && class != mons[urole.malenum].mlet && class != mons[urace.malenum].mlet) { if (gonecnt) pline("All such monsters are already nonexistent."); else if (immunecnt || (buf[0] == DEF_INVISIBLE && buf[1] == '\0')) You("aren't permitted to genocide such monsters."); else #ifdef WIZARD /* to aid in topology testing; remove pesky monsters */ if (wizard && buf[0] == '*') { register struct monst *mtmp, *mtmp2; gonecnt = 0; for (mtmp = fmon; mtmp; mtmp = mtmp2) { mtmp2 = mtmp->nmon; if (DEADMONSTER(mtmp)) continue; mongone(mtmp); gonecnt++; } pline("Eliminated %d monster%s.", gonecnt, plur(gonecnt)); return; } else #endif pline("That symbol does not represent any monster."); continue; } for (i = LOW_PM; i < NUMMONS; i++) { if(mons[i].mlet == class) { char nam[BUFSZ]; Strcpy(nam, makeplural(mons[i].mname)); /* Although "genus" is Latin for race, the hero benefits * from both race and role; thus genocide affects either. */ if (Your_Own_Role(i) || Your_Own_Race(i) || ((mons[i].geno & G_GENO) && !(mvitals[i].mvflags & G_GENOD))) { /* This check must be first since player monsters might * have G_GENOD or !G_GENO. */ mvitals[i].mvflags |= (G_GENOD|G_NOCORPSE); reset_rndmonst(i); kill_genocided_monsters(); update_inventory(); /* eggs & tins */ pline("Wiped out all %s.", nam); if (Upolyd && i == u.umonnum) { u.mh = -1; if (Unchanging) { if (!feel_dead++) You("die."); /* finish genociding this class of monsters before ultimately dying */ gameover = TRUE; } else rehumanize(); } /* Self-genocide if it matches either your race or role. Assumption: male and female forms share same monster class. */ if (i == urole.malenum || i == urace.malenum) { u.uhp = -1; if (Upolyd) { if (!feel_dead++) You_feel("dead inside."); } else { if (!feel_dead++) You("die."); gameover = TRUE; } } } else if (mvitals[i].mvflags & G_GENOD) { if (!gameover) pline("All %s are already nonexistent.", nam); } else if (!gameover) { /* suppress feedback about quest beings except for those applicable to our own role */ if ((mons[i].msound != MS_LEADER || quest_info(MS_LEADER) == i) && (mons[i].msound != MS_NEMESIS || quest_info(MS_NEMESIS) == i) && (mons[i].msound != MS_GUARDIAN || quest_info(MS_GUARDIAN) == i) /* non-leader/nemesis/guardian role-specific monster */ && (i != PM_NINJA || /* nuisance */ Role_if(PM_SAMURAI))) { boolean named, uniq; named = type_is_pname(&mons[i]) ? TRUE : FALSE; uniq = (mons[i].geno & G_UNIQ) ? TRUE : FALSE; /* one special case */ if (i == PM_HIGH_PRIEST) uniq = FALSE; You("aren't permitted to genocide %s%s.", (uniq && !named) ? "the " : "", (uniq || named) ? mons[i].mname : nam); } } } } if (gameover || u.uhp == -1) { killer_format = KILLED_BY_AN; killer = "scroll of genocide"; if (gameover) done(GENOCIDED); } return; } } #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; register int mndx; register struct permonst *ptr; const char *which; if (how & PLAYER) { mndx = u.umonster; /* non-polymorphed mon num */ ptr = &mons[mndx]; Strcpy(buf, ptr->mname); killplayer++; } else { for(i = 0; ; i++) { if(i >= 5) { pline(thats_enough_tries); return; } getlin("What monster do you want to genocide? [type the name]", buf); (void)mungspaces(buf); /* choosing "none" preserves genocideless conduct */ if (!strcmpi(buf, "none") || !strcmpi(buf, "nothing")) { /* ... 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)) { pline("Such creatures %s exist in this world.", (mndx == NON_PM) ? "do not" : "no longer"); continue; } ptr = &mons[mndx]; /* Although "genus" is Latin for race, the hero benefits * from both race and role; thus genocide affects either. */ if (Your_Own_Role(mndx) || Your_Own_Race(mndx)) { killplayer++; break; } if (is_human(ptr)) adjalign(-sgn(u.ualign.type)); if (is_demon(ptr)) adjalign(sgn(u.ualign.type)); if(!(ptr->geno & G_GENO)) { if(flags.soundok) { /* fixme: unconditional "caverns" will be silly in some circumstances */ if(flags.verbose) pline("A thunderous voice booms through the caverns:"); verbalize("No, mortal! That will not be done."); } continue; } /* KMH -- Unchanging prevents rehumanization */ if (Unchanging && ptr == youmonst.data) killplayer++; break; } } which = "all "; if (Hallucination) { if (Upolyd) Strcpy(buf,youmonst.data->mname); else { Strcpy(buf, (flags.female && urole.name.f) ? urole.name.f : urole.name.m); buf[0] = lowc(buf[0]); } } else { Strcpy(buf, ptr->mname); /* make sure we have standard singular */ if ((ptr->geno & G_UNIQ) && ptr != &mons[PM_HIGH_PRIEST]) which = !type_is_pname(ptr) ? "the " : ""; } if (how & REALLY) { /* setting no-corpse affects wishing and random tin generation */ mvitals[mndx].mvflags |= (G_GENOD | G_NOCORPSE); pline("Wiped out %s%s.", which, (*which != 'a') ? buf : makeplural(buf)); if (killplayer) { /* might need to wipe out dual role */ if (urole.femalenum != NON_PM && mndx == urole.malenum) mvitals[urole.femalenum].mvflags |= (G_GENOD | G_NOCORPSE); if (urole.femalenum != NON_PM && mndx == urole.femalenum) mvitals[urole.malenum].mvflags |= (G_GENOD | G_NOCORPSE); if (urace.femalenum != NON_PM && mndx == urace.malenum) mvitals[urace.femalenum].mvflags |= (G_GENOD | G_NOCORPSE); if (urace.femalenum != NON_PM && mndx == urace.femalenum) 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 */ if (Upolyd && ptr != youmonst.data) { delayed_killer = killer; killer = 0; You_feel("dead inside."); } else done(GENOCIDED); } else if (ptr == youmonst.data) { rehumanize(); } reset_rndmonst(mndx); kill_genocided_monsters(); update_inventory(); /* in case identified eggs were affected */ } else { int cnt = 0; if (!(mons[mndx].geno & G_UNIQ) && !(mvitals[mndx].mvflags & (G_GENOD | G_EXTINCT))) for (i = rn1(3, 4); i > 0; i--) { if (!makemon(ptr, u.ux, u.uy, NO_MINVENT)) break; /* couldn't make one */ ++cnt; if (mvitals[mndx].mvflags & G_EXTINCT) break; /* just made last one */ } if (cnt) pline("Sent in some %s.", makeplural(buf)); else pline(nothing_happens); } } void punish(sobj) register struct obj *sobj; { /* KMH -- Punishment is still okay when you are riding */ /* KMH -- Punishment is still okay when you are riding */ You("are being punished for your misbehavior!"); if(Punished){ Your("iron ball gets heavier."); uball->owt += 160 * (1 + sobj->cursed); return; } if (amorphous(youmonst.data) || is_whirly(youmonst.data) || unsolid(youmonst.data)) { pline("A ball and chain appears, then falls away."); dropy(mkobj(BALL_CLASS, TRUE)); return; } setworn(mkobj(CHAIN_CLASS, TRUE), W_CHAIN); setworn(mkobj(BALL_CLASS, TRUE), W_BALL); uball->spe = 1; /* special ball (see save) */ /* * Place ball & chain if not swallowed. If swallowed, the ball & * chain variables will be set at the next call to placebc(). */ if (!u.uswallow) { placebc(); if (Blind) set_bc(1); /* set up ball and chain variables */ newsym(u.ux,u.uy); /* see ball&chain if can't see self */ } } void unpunish() { /* remove the ball and chain */ struct obj *savechain = uchain; obj_extract_self(uchain); newsym(uchain->ox,uchain->oy); setworn((struct obj *)0, W_CHAIN); dealloc_obj(savechain); uball->spe = 0; setworn((struct obj *)0, W_BALL); } /* some creatures have special data structures that only make sense in their * normal locations -- if the player tries to create one elsewhere, or to revive * one, the disoriented creature becomes a zombie */ boolean cant_create(mtype, revival) int *mtype; boolean revival; { /* SHOPKEEPERS can be revived now */ if (*mtype==PM_GUARD || (*mtype==PM_SHOPKEEPER && !revival) || *mtype==PM_ALIGNED_PRIEST || *mtype==PM_ANGEL) { *mtype = PM_HUMAN_ZOMBIE; return TRUE; } else if (*mtype==PM_LONG_WORM_TAIL) { /* for create_particular() */ *mtype = PM_LONG_WORM; return TRUE; } return FALSE; } #ifdef WIZARD /* * Make a new monster with the type controlled by the user. * * Note: when creating a monster by class letter, specifying the * "strange object" (']') symbol produces a random monster rather * than a mimic; this behavior quirk is useful so don't "fix" it... */ struct monst * create_particular() { char buf[BUFSZ], *bufp, monclass = MAXMCLASSES; int which, tries, i; struct permonst *whichpm; struct monst *mtmp = (struct monst *)0; boolean maketame, makepeaceful, makehostile; tries = 0; do { which = urole.malenum; /* an arbitrary index into mons[] */ maketame = makepeaceful = makehostile = FALSE; getlin("Create what kind of monster? [type the name or symbol]", buf); bufp = mungspaces(buf); if (*bufp == '\033') return (struct monst *)0; /* allow the initial disposition to be specified */ if (!strncmpi(bufp, "tame ", 5)) { bufp += 5; maketame = TRUE; } else if (!strncmpi(bufp, "peaceful ", 9)) { bufp += 9; makepeaceful = TRUE; } else if (!strncmpi(bufp, "hostile ", 8)) { bufp += 8; makehostile = TRUE; } /* decide whether a valid monster was chosen */ if (strlen(bufp) == 1) { monclass = def_char_to_monclass(*bufp); if (monclass != MAXMCLASSES) break; /* got one */ } else { which = name_to_mon(bufp); if (which >= LOW_PM) break; /* got one */ } /* no good; try again... */ pline("I've never heard of such monsters."); } while (++tries < 5); if (tries == 5) { pline(thats_enough_tries); } else { (void) cant_create(&which, FALSE); whichpm = &mons[which]; 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 ((makepeaceful || makehostile) && mtmp) { mtmp->mtame = 0; /* sanity precaution */ mtmp->mpeaceful = makepeaceful ? 1 : 0; set_malign(mtmp); } } } } return mtmp; } #endif /* WIZARD */ #endif /* OVLB */ /*read.c*/ slashem-0.0.7E7F3/src/decl.c0000664000076400007640000002457210545462317013530 0ustar aliali/* 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. */ #include "hack.h" int NDECL((*afternmv)); int NDECL((*occupation)); /* from xxxmain.c */ const char *hname = 0; /* name of the game (argv[0] of main) */ int hackpid = 0; /* current process id */ #if defined(UNIX) || defined(VMS) int locknum = 0; /* max num of simultaneous users */ #endif #ifdef DEF_PAGER char *catmore = 0; /* default pager */ #endif NEARDATA int bases[MAXOCLASSES] = DUMMY; NEARDATA int multi = 0; NEARDATA boolean multi_one = FALSE; /* used by dofire() and throw_the_obj() */ #if 0 NEARDATA int warnlevel = 0; /* used by movemon and dochugw */ #endif NEARDATA int nroom = 0; NEARDATA int nsubroom = 0; NEARDATA int occtime = 0; int x_maze_max, y_maze_max; /* initialized in main, used in mkmaze.c */ int otg_temp; /* used by object_to_glyph() [otg] */ #ifdef REDO NEARDATA int in_doagain = 0; #endif /* * The following structure will be initialized at startup time with * the level numbers of some "important" things in the game. */ struct dgn_topology dungeon_topology = {DUMMY}; #include "quest.h" struct q_score quest_status = DUMMY; NEARDATA int smeq[MAXNROFROOMS+1] = DUMMY; NEARDATA int doorindex = 0; NEARDATA char *save_cm = 0; 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 */ NEARDATA char plname[PL_NSIZ] = DUMMY; /* player name */ NEARDATA char pl_character[PL_CSIZ] = DUMMY; NEARDATA char pl_race = '\0'; NEARDATA char pl_fruit[PL_FSIZ] = DUMMY; NEARDATA int current_fruit = 0; NEARDATA struct fruit *ffruit = (struct fruit *)0; NEARDATA char tune[6] = DUMMY; const char *occtxt = DUMMY; const char quitchars[] = " \r\n\033"; const char vowels[] = "aeiouAEIOU"; const char ynchars[] = "yn"; const char ynqchars[] = "ynq"; const char ynaqchars[] = "ynaq"; const char ynNaqchars[] = "yn#aq"; NEARDATA long yn_number = 0L; const char disclosure_options[] = "iavgc"; #if defined(MICRO) || defined(WIN32) char hackdir[PATHLEN]; /* where rumors, help, record are */ # ifdef MICRO char levels[PATHLEN]; /* where levels are */ # endif #endif /* MICRO || WIN32 */ #ifdef MFLOPPY char permbones[PATHLEN]; /* where permanent copy of bones go */ int ramdisk = FALSE; /* whether to copy bones to levels or not */ int saveprompt = TRUE; const char *alllevels = "levels.*"; const char *allbones = "bones*.*"; #endif struct linfo level_info[MAXLINFO]; NEARDATA struct sinfo program_state; /* 'rogue'-like direction commands (cmd.c) */ const char sdir[] = "hykulnjb><"; const char ndir[] = "47896321><"; /* number pad mode */ const schar xdir[10] = { -1,-1, 0, 1, 1, 1, 0,-1, 0, 0 }; const schar ydir[10] = { 0,-1,-1,-1, 0, 1, 1, 1, 0, 0 }; const schar zdir[10] = { 0, 0, 0, 0, 0, 0, 0, 0, 1,-1 }; 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() */ NEARDATA s_level *sp_levchn; NEARDATA stairway upstair = { 0, 0 }, dnstair = { 0, 0 }; NEARDATA stairway upladder = { 0, 0 }, dnladder = { 0, 0 }; NEARDATA stairway sstairs = { 0, 0 }; NEARDATA dest_area updest = { 0, 0, 0, 0, 0, 0, 0, 0 }; NEARDATA dest_area dndest = { 0, 0, 0, 0, 0, 0, 0, 0 }; NEARDATA coord inv_pos = { 0, 0 }; NEARDATA boolean defer_see_monsters = FALSE; NEARDATA boolean in_mklev = FALSE; NEARDATA boolean stoned = FALSE; /* done to monsters hit by 'c' */ NEARDATA boolean unweapon = FALSE; NEARDATA boolean mrg_to_wielded = FALSE; /* weapon picked is merged with wielded one */ NEARDATA struct obj *current_wand = 0; /* wand currently zapped/applied */ NEARDATA boolean in_steed_dismounting = FALSE; NEARDATA coord bhitpos = DUMMY; NEARDATA struct door doors[DOORMAX] = {DUMMY}; NEARDATA struct mkroom rooms[(MAXNROFROOMS+1)*2] = {DUMMY}; NEARDATA struct mkroom* subrooms = &rooms[MAXNROFROOMS+1]; struct mkroom *upstairs_room, *dnstairs_room, *sstairs_room; dlevel_t level; /* level map */ struct trap *ftrap = (struct trap *)0; NEARDATA struct monst youmonst = DUMMY; NEARDATA struct permonst upermonst = DUMMY; NEARDATA struct flag flags = DUMMY; NEARDATA struct instance_flags iflags = DUMMY; NEARDATA struct you u = DUMMY; NEARDATA struct obj *invent = (struct obj *)0, *uwep = (struct obj *)0, *uarm = (struct obj *)0, *uswapwep = (struct obj *)0, *uquiver = (struct obj *)0, /* quiver */ #ifdef TOURIST *uarmu = (struct obj *)0, /* under-wear, so to speak */ #endif *uskin = (struct obj *)0, /* dragon armor, if a dragon */ *uarmc = (struct obj *)0, *uarmh = (struct obj *)0, *uarms = (struct obj *)0, *uarmg = (struct obj *)0, *uarmf = (struct obj *)0, *uamul = (struct obj *)0, *uright = (struct obj *)0, *uleft = (struct obj *)0, *ublindf = (struct obj *)0, #ifdef STEED *usaddle = (struct obj *)0, #endif *uchain = (struct obj *)0, *uball = (struct obj *)0; #ifdef TEXTCOLOR /* * This must be the same order as used for buzz() in zap.c. */ const int zapcolors[NUM_ZAP] = { HI_ZAP, /* 0 - missile */ CLR_ORANGE, /* 1 - fire */ CLR_WHITE, /* 2 - frost */ HI_ZAP, /* 3 - sleep */ CLR_BLACK, /* 4 - death */ CLR_WHITE, /* 5 - lightning */ CLR_YELLOW, /* 6 - poison gas */ CLR_GREEN, /* 7 - acid */ }; #endif /* text color */ const int shield_static[SHIELD_COUNT] = { S_ss1, S_ss2, S_ss3, S_ss2, S_ss1, S_ss2, S_ss4, /* 7 per row */ S_ss1, S_ss2, S_ss3, S_ss2, S_ss1, S_ss2, S_ss4, S_ss1, S_ss2, S_ss3, S_ss2, S_ss1, S_ss2, S_ss4, }; NEARDATA struct spell spl_book[MAXSPELL + 1] = {DUMMY}; NEARDATA struct tech tech_list[MAXTECH + 1] = {DUMMY}; NEARDATA long moves = 1L, monstermoves = 1L; /* These diverge when player is Fast or Very_fast */ NEARDATA long wailmsg = 0L; /* objects that are moving to another dungeon level */ NEARDATA struct obj *migrating_objs = (struct obj *)0; /* objects not yet paid for */ NEARDATA struct obj *billobjs = (struct obj *)0; /* used to zero all elements of a struct obj */ NEARDATA struct obj zeroobj = DUMMY; /* used as an address returned by getobj() */ NEARDATA struct obj thisplace = DUMMY; /* originally from dog.c */ NEARDATA char dogname[PL_PSIZ] = DUMMY; NEARDATA char catname[PL_PSIZ] = DUMMY; NEARDATA char ghoulname[PL_PSIZ] = DUMMY; NEARDATA char horsename[PL_PSIZ] = DUMMY; NEARDATA char wolfname[PL_PSIZ] = DUMMY; #if 0 NEARDATA char batname[PL_PSIZ] = DUMMY; NEARDATA char snakename[PL_PSIZ] = DUMMY; NEARDATA char ratname[PL_PSIZ] = DUMMY; NEARDATA char badgername[PL_PSIZ] = DUMMY; NEARDATA char reddragonname[PL_PSIZ] = DUMMY; NEARDATA char whitedragonname[PL_PSIZ] = DUMMY; #endif 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 */ NEARDATA struct monst *migrating_mons = (struct monst *)0; NEARDATA struct mvitals mvitals[NUMMONS]; NEARDATA struct c_color_names c_color_names = { "black", "amber", "golden", "light blue", "red", "green", "silver", "blue", "purple", "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 */ }; #ifdef MENU_COLOR struct menucoloring *menu_colorings = 0; #endif 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.", {"the", "your"} }; /* NOTE: the order of these words exactly corresponds to the order of oc_material values #define'd in objclass.h. */ const char *materialnm[] = { "mysterious", "liquid", "wax", "organic", "flesh", "paper", "cloth", "leather", "wooden", "bone", "dragonhide", "iron", "metal", "copper", "silver", "gold", "platinum", "mithril", "plastic", "glass", "gemstone", "stone" }; /* Vision */ NEARDATA boolean vision_full_recalc = 0; NEARDATA char **viz_array = 0;/* used in cansee() and couldsee() macros */ /* Global windowing data, defined here for multi-window-system support */ NEARDATA winid WIN_MESSAGE = WIN_ERR, WIN_STATUS = WIN_ERR; NEARDATA winid WIN_MAP = WIN_ERR, WIN_INVEN = WIN_ERR; char toplines[TBUFSZ]; /* Windowing stuff that's really tty oriented, but present for all ports */ struct tc_gbl_data tc_gbl_data = { 0,0, 0,0 }; /* AS,AE, LI,CO */ struct authentication authentication = { "", "" }; struct tileset tilesets[MAXNOTILESETS]; int no_tilesets = 0; struct tileset def_tilesets[] = { #if defined(X11_GRAPHICS) || defined(QT_GRAPHICS) || defined(GTK_GRAPHICS) || \ defined(GNOME_GRAPHICS) || defined(GL_GRAPHICS) || defined(SDL_GRAPHICS) { "Small tiles", "x11tiles", 0 }, { "Big tiles", "x11bigtiles", TILESET_TRANSPARENT }, #endif #if defined(GTK_GRAPHICS) { "Big 3D tiles", "x11big3dtiles", TILESET_TRANSPARENT | TILESET_PSEUDO3D }, #endif #if defined(GEM_GRAPHICS) { "Monochrome tiles", "nh2.img", 0 }, { "Colour tiles", "nh16.img", 0 }, #endif #if defined(MSDOS) { "Planer style tiles", "slashem1.tib", 0 }, #endif #if defined(ALLEG_FX) { "Small tiles", "slam16.bmp", 0 }, { "Big tiles", "slam32.bmp", TILESET_TRANSPARENT }, { "Big 3D tiles", "slam3D.bmp", TILESET_TRANSPARENT | TILESET_PSEUDO3D }, #endif { "", "", 0, } }; char tileset[PL_PSIZ] = DUMMY; char *fqn_prefix[PREFIX_COUNT] = { (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, (char *)0 }; #ifdef PREFIXES_IN_USE char *fqn_prefix_names[PREFIX_COUNT] = { "hackdir", "leveldir", "savedir", "bonesdir", "datadir", "scoredir", "lockdir", "configdir", "troubledir" }; #endif /* dummy routine used to force linkage */ void decl_init() { return; } /*decl.c*/ slashem-0.0.7E7F3/src/allmain.c0000664000076400007640000004465110545462317014236 0ustar aliali/* SCCS Id: @(#)allmain.c 3.4 2003/04/02 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ /* various code that was replicated in *main.c */ #include "hack.h" #ifndef NO_SIGNAL #include #endif #ifdef SHORT_FILENAMES #include "patchlev.h" #else #include "patchlevel.h" #endif #ifdef POSITIONBAR STATIC_DCL void NDECL(do_positionbar); #endif #define decrnknow(spell) spl_book[spell].sp_know-- #define spellid(spell) spl_book[spell].sp_id #define spellknow(spell) spl_book[spell].sp_know #ifdef OVL0 void moveloop() { #if defined(MICRO) || defined(WIN32) char ch; int abort_lev; #endif int moveamt = 0, wtcap = 0, change = 0; boolean didmove = FALSE, monscanmove = FALSE; flags.moonphase = phase_of_the_moon(); if(flags.moonphase == FULL_MOON) { You("are lucky! Full moon tonight."); change_luck(1); } else if(flags.moonphase == NEW_MOON) { pline("Be careful! New moon tonight."); } flags.friday13 = friday_13th(); if (flags.friday13) { pline("Watch out! Bad things can happen on Friday the 13th."); change_luck(-1); } /* KMH -- February 2 */ flags.groundhogday = groundhog_day(); if (flags.groundhogday) pline("Happy Groundhog Day!"); initrack(); /* Note: these initializers don't do anything except guarantee that we're linked properly. */ decl_init(); monst_init(); monstr_init(); /* monster strengths */ objects_init(); #ifdef WIZARD if (wizard) add_debug_extended_commands(); #endif (void) encumber_msg(); /* in case they auto-picked up something */ if (defer_see_monsters) { defer_see_monsters = FALSE; see_monsters(); } u.uz0.dlevel = u.uz.dlevel; youmonst.movement = NORMAL_SPEED; /* give the hero some movement points */ for(;;) { get_nh_event(); #ifdef POSITIONBAR do_positionbar(); #endif didmove = flags.move; if(didmove) { /* actual time passed */ youmonst.movement -= NORMAL_SPEED; do { /* hero can't move this turn loop */ wtcap = encumber_msg(); flags.mon_moving = TRUE; do { monscanmove = movemon(); if (youmonst.movement > NORMAL_SPEED) break; /* it's now your turn */ } while (monscanmove); flags.mon_moving = FALSE; if (!monscanmove && youmonst.movement < NORMAL_SPEED) { /* both you and the monsters are out of steam this round */ /* set up for a new turn */ struct monst *mtmp; mcalcdistress(); /* adjust monsters' trap, blind, etc */ /* reallocate movement rations to monsters */ for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) mtmp->movement += mcalcmove(mtmp); if(!rn2(u.uevent.udemigod ? 25 : (depth(&u.uz) > depth(&stronghold_level)) ? 50 : 70)) (void) makemon((struct permonst *)0, 0, 0, NO_MM_FLAGS); /* calculate how much time passed. */ #ifdef STEED if (u.usteed && u.umoved) { /* your speed doesn't augment steed's speed */ moveamt = mcalcmove(u.usteed); } else #endif { moveamt = youmonst.data->mmove; if (Very_fast) { /* speed boots or potion */ /* average movement is 1.67 times normal */ moveamt += NORMAL_SPEED / 2; if (rn2(3) == 0) moveamt += NORMAL_SPEED / 2; } else if (Fast) { /* average movement is 1.33 times normal */ if (rn2(3) != 0) moveamt += NORMAL_SPEED / 2; } if (tech_inuse(T_BLINK)) { /* TECH: Blinking! */ /* Case Average Variance * ------------------------- * Normal 12 0 * Fast 16 12 * V fast 20 12 * Blinking 24 12 * F & B 28 18 * V F & B 30 18 */ moveamt += NORMAL_SPEED * 2 / 3; if (rn2(3) == 0) moveamt += NORMAL_SPEED / 2; } } switch (wtcap) { case UNENCUMBERED: break; case SLT_ENCUMBER: moveamt -= (moveamt / 4); break; case MOD_ENCUMBER: moveamt -= (moveamt / 2); break; case HVY_ENCUMBER: moveamt -= ((moveamt * 3) / 4); break; case EXT_ENCUMBER: moveamt -= ((moveamt * 7) / 8); break; default: break; } youmonst.movement += moveamt; if (youmonst.movement < 0) youmonst.movement = 0; settrack(); monstermoves++; moves++; /********************************/ /* once-per-turn things go here */ /********************************/ if (flags.bypasses) clear_bypasses(); if(Glib) glibr(); nh_timeout(); run_regions(); #ifdef DUNGEON_GROWTH dgn_growths(TRUE, TRUE); #endif if (u.ublesscnt) u.ublesscnt--; if(flags.time && !flags.run) flags.botl = 1; /* One possible result of prayer is healing. Whether or * not you get healed depends on your current hit points. * If you are allowed to regenerate during the prayer, the * end-of-prayer calculation messes up on this. * Another possible result is rehumanization, which requires * that encumbrance and movement rate be recalculated. */ 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)) { /* * KMH, balance patch -- New regeneration code * Healthstones have been added, which alter your effective * experience level and constitution (-2 cursed, +1 uncursed, * +2 blessed) for the basis of regeneration calculations. */ int efflev = u.ulevel + u.uhealbonus; int effcon = ACURR(A_CON) + u.uhealbonus; int heal = 1; if (efflev > 9 && !(moves % 3)) { if (effcon <= 12) { heal = 1; } else { heal = rnd(effcon); if (heal > efflev-9) heal = efflev-9; } flags.botl = 1; u.uhp += heal; if(u.uhp > u.uhpmax) u.uhp = u.uhpmax; } else if (Regeneration || (efflev <= 9 && !(moves % ((MAXULEV+12) / (u.ulevel+2) + 1)))) { flags.botl = 1; u.uhp++; } } if (!u.uinvulnerable && u.uen > 0 && u.uhp < u.uhpmax && tech_inuse(T_CHI_HEALING)) { u.uen--; u.uhp++; flags.botl = 1; } /* 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--; } else if (!Upolyd && u.uhp > 1) { u.uhp--; } else { You("pass out from exertion!"); exercise(A_CON, FALSE); fall_asleep(-10, FALSE); } } } /* KMH -- OK to regenerate if you don't move */ if ((u.uen < u.uenmax) && (Energy_regeneration || ((wtcap < MOD_ENCUMBER || !flags.mv) && (!(moves%((MAXULEV + 15 - u.ulevel) * (Role_if(PM_WIZARD) ? 3 : 4) / 6)))))) { u.uen += rn1((int)(ACURR(A_WIS) + ACURR(A_INT)) / 15 + 1,1); #ifdef WIZ_PATCH_DEBUG pline("mana was = %d now = %d",temp,u.uen); #endif if (u.uen > u.uenmax) u.uen = u.uenmax; flags.botl = 1; } if(!u.uinvulnerable) { if(Teleportation && !rn2(85)) { xchar old_ux = u.ux, old_uy = u.uy; tele(); if (u.ux != old_ux || u.uy != old_uy) { if (!next_to_u()) { check_leash(old_ux, old_uy); } #ifdef REDO /* clear doagain keystrokes */ pushch(0); savech(0); #endif } } /* delayed change may not be valid anymore */ if ((change == 1 && !Polymorph) || (change == 2 && u.ulycn == NON_PM)) change = 0; if(Polymorph && !rn2(100)) change = 1; else if (u.ulycn >= LOW_PM && !Upolyd && !rn2(80 - (20 * night()))) change = 2; if (change && !Unchanging) { if (multi >= 0) { if (occupation) stop_occupation(); else nomul(0); if (change == 1) polyself(FALSE); else you_were(); change = 0; } } } /* !u.uinvulnerable */ if(Searching && multi >= 0) (void) dosearch0(1); dosounds(); do_storms(); gethungry(); age_spells(); exerchk(); invault(); if (u.uhave.amulet) amulet(); if (!rn2(40+(int)(ACURR(A_DEX)*3))) u_wipe_engr(rnd(3)); if (u.uevent.udemigod && !u.uinvulnerable) { if (u.udg_cnt) u.udg_cnt--; if (!u.udg_cnt) { intervene(); u.udg_cnt = rn1(200, 50); } } restore_attrib(); /* underwater and waterlevel vision are done here */ if (Is_waterlevel(&u.uz)) movebubbles(); else if (Underwater) under_water(0); /* vision while buried done here */ else if (u.uburied) under_ground(0); /* when immobile, count is in turns */ if(multi < 0) { if (++multi == 0) { /* finished yet? */ unmul((char *)0); /* if unmul caused a level change, take it now */ if (u.utotype) deferred_goto(); } } } } while (youmonst.movement= 0 && occupation) { #if defined(MICRO) || defined(WIN32) abort_lev = 0; if (kbhit()) { if ((ch = Getchar()) == ABORT) abort_lev++; # ifdef REDO else pushch(ch); # endif /* REDO */ } if (!abort_lev && (*occupation)() == 0) #else if ((*occupation)() == 0) #endif occupation = 0; if( #if defined(MICRO) || defined(WIN32) abort_lev || #endif monster_nearby()) { stop_occupation(); reset_eat(); } #if defined(MICRO) || defined(WIN32) if (!(++occtime % 7)) display_nhwindow(WIN_MAP, FALSE); #endif continue; } if ((u.uhave.amulet || Clairvoyant) && !In_endgame(&u.uz) && !BClairvoyant && !(moves % 15) && !rn2(2)) do_vicinity_map(); if(u.utrap && u.utraptype == TT_LAVA) { if(!is_lava(u.ux,u.uy)) u.utrap = 0; else if (!u.uinvulnerable) { u.utrap -= 1<<8; if(u.utrap < 1<<8) { killer_format = KILLED_BY; killer = "molten lava"; You("sink below the surface and die."); done(DISSOLVED); } else if(didmove && !u.umoved) { Norep("You sink deeper into the lava."); u.utrap += rnd(4); } } } #ifdef WIZARD if (iflags.sanity_check) sanity_check(); #elif defined(OBJ_SANITY) if (iflags.sanity_check) obj_sanity_check(); #endif #ifdef CLIPPING /* just before rhack */ cliparound(u.ux, u.uy); #endif u.umoved = FALSE; if (multi > 0) { lookaround(); 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 = iflags.travel1 = flags.mv = flags.run = 0; domove(); } else { --multi; rhack(save_cm); } } else if (multi == 0) { #ifdef MAIL ckmailstatus(); #endif rhack((char *)0); } if (u.utotype) /* change dungeon level */ deferred_goto(); /* after rhack() */ /* !flags.move here: multiple movement command stopped */ else if (flags.time && (!flags.move || !flags.mv)) flags.botl = 1; if (vision_full_recalc) vision_recalc(0); /* vision! */ /* when running in non-tport mode, this gets done through domove() */ if ((!flags.run || iflags.runmode == RUN_TPORT) && (multi && (!flags.travel ? !(multi % 7) : !(moves % 7L)))) { if (flags.time && flags.run) flags.botl = 1; display_nhwindow(WIN_MAP, FALSE); } } } #endif /* OVL0 */ #ifdef OVL1 void 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(); */ #ifdef REDO nomul(0); pushch(0); #endif } } #endif /* OVL1 */ #ifdef OVLB void display_gamewindows() { WIN_MESSAGE = create_nhwindow(NHW_MESSAGE); WIN_STATUS = create_nhwindow(NHW_STATUS); WIN_MAP = create_nhwindow(NHW_MAP); WIN_INVEN = create_nhwindow(NHW_MENU); #ifdef MAC /* * This _is_ the right place for this - maybe we will * have to split display_gamewindows into create_gamewindows * and show_gamewindows to get rid of this ifdef... */ if ( ! strcmp ( windowprocs . name , "mac" ) ) { SanePositions ( ) ; } #endif /* * The mac port is not DEPENDENT on the order of these * displays, but it looks a lot better this way... */ display_nhwindow(WIN_STATUS, FALSE); display_nhwindow(WIN_MESSAGE, FALSE); clear_glyph_buffer(); display_nhwindow(WIN_MAP, FALSE); } void newgame() { int i; #ifdef MFLOPPY gameDiskPrompt(); #endif flags.ident = 1; for (i = 0; i < NUMMONS; i++) mvitals[i].mvflags = mons[i].geno & G_NOCORPSE; init_objects(); /* must be before u_init() */ flags.pantheon = -1; /* role_init() will reset this */ role_init(); /* must be before init_dungeons(), u_init(), * and init_artifacts() */ init_dungeons(); /* must be before u_init() to avoid rndmonst() * creating odd monsters for any tins and eggs * in hero's initial inventory */ init_artifacts(); /* before u_init() in case $WIZKIT specifies * any artifacts */ u_init(); init_artifacts1(); /* must be after u_init() */ #ifndef NO_SIGNAL (void) signal(SIGINT, (SIG_RET_TYPE) done1); #endif #ifdef NEWS if(iflags.news) display_file_area(NEWS_AREA, NEWS, FALSE); #endif load_qtlist(); /* load up the quest text info */ /* quest_init();*/ /* Now part of role_init() */ mklev(); u_on_upstairs(); vision_reset(); /* set up internals for level (after mklev) */ check_special_room(FALSE); flags.botlx = 1; /* Move the monster from under you or else * makedog() will fail when it calls makemon(). * - ucsfcgl!kneller */ if(MON_AT(u.ux, u.uy)) mnexto(m_at(u.ux, u.uy)); (void) makedog(); docrt(); if (flags.legacy) { flush_screen(1); com_pager(1); } #ifdef INSURANCE save_currentstate(); #endif program_state.something_worth_saving++; /* useful data now exists */ /* Success! */ welcome(TRUE); return; } /* show "welcome [back] to nethack" message at program startup */ void welcome(new_game) boolean new_game; /* false => restoring an old game */ { char buf[BUFSZ]; boolean currentgend = Upolyd ? u.mfemale : flags.female; /* * The "welcome back" message always describes your innate form * even when polymorphed or wearing a helm of opposite alignment. * Alignment is shown unconditionally for new games; for restores * it's only shown if it has changed from its original value. * Sex is shown for new games except when it is redundant; for * restores it's only shown if different from its original value. */ *buf = '\0'; if (new_game || u.ualignbase[A_ORIGINAL] != u.ualignbase[A_CURRENT]) Sprintf(eos(buf), " %s", align_str(u.ualignbase[A_ORIGINAL])); if (!urole.name.f && (new_game ? (urole.allow & ROLE_GENDMASK) == (ROLE_MALE|ROLE_FEMALE) : currentgend != flags.initgend)) Sprintf(eos(buf), " %s", genders[currentgend].adj); #if 0 pline(new_game ? "%s %s, welcome to NetHack! You are a%s %s %s." : "%s %s, the%s %s %s, welcome back to NetHack!", Hello((struct monst *) 0), plname, buf, urace.adj, (currentgend && urole.name.f) ? urole.name.f : urole.name.m); #endif if (new_game) pline("%s %s, welcome to %s! You are a%s %s %s.", Hello((struct monst *) 0), plname, DEF_GAME_NAME, buf, urace.adj, (currentgend && urole.name.f) ? urole.name.f : urole.name.m); else pline("%s %s, the%s %s %s, welcome back to %s!", Hello((struct monst *) 0), plname, buf, urace.adj, (currentgend && urole.name.f) ? urole.name.f : urole.name.m, DEF_GAME_NAME); } #ifdef POSITIONBAR STATIC_DCL void do_positionbar() { static char pbar[COLNO]; char *p; p = pbar; /* up stairway */ if (upstair.sx && #ifdef DISPLAY_LAYERS (level.locations[upstair.sx][upstair.sy].mem_bg == S_upstair || level.locations[upstair.sx][upstair.sy].mem_bg == S_upladder)) { #else (glyph_to_cmap(level.locations[upstair.sx][upstair.sy].glyph) == S_upstair || glyph_to_cmap(level.locations[upstair.sx][upstair.sy].glyph) == S_upladder)) { #endif *p++ = '<'; *p++ = upstair.sx; } if (sstairs.sx && #ifdef DISPLAY_LAYERS (level.locations[sstairs.sx][sstairs.sy].mem_bg == S_upstair || level.locations[sstairs.sx][sstairs.sy].mem_bg == S_upladder)) { #else (glyph_to_cmap(level.locations[sstairs.sx][sstairs.sy].glyph) == S_upstair || glyph_to_cmap(level.locations[sstairs.sx][sstairs.sy].glyph) == S_upladder)) { #endif *p++ = '<'; *p++ = sstairs.sx; } /* down stairway */ if (dnstair.sx && #ifdef DISPLAY_LAYERS (level.locations[dnstair.sx][dnstair.sy].mem_bg == S_dnstair || level.locations[dnstair.sx][dnstair.sy].mem_bg == S_dnladder)) { #else (glyph_to_cmap(level.locations[dnstair.sx][dnstair.sy].glyph) == S_dnstair || glyph_to_cmap(level.locations[dnstair.sx][dnstair.sy].glyph) == S_dnladder)) { #endif *p++ = '>'; *p++ = dnstair.sx; } if (sstairs.sx && #ifdef DISPLAY_LAYERS (level.locations[sstairs.sx][sstairs.sy].mem_bg == S_dnstair || level.locations[sstairs.sx][sstairs.sy].mem_bg == S_dnladder)) { #else (glyph_to_cmap(level.locations[sstairs.sx][sstairs.sy].glyph) == S_dnstair || glyph_to_cmap(level.locations[sstairs.sx][sstairs.sy].glyph) == S_dnladder)) { #endif *p++ = '>'; *p++ = sstairs.sx; } /* hero location */ if (u.ux) { *p++ = '@'; *p++ = u.ux; } /* fence post */ *p = 0; update_positionbar(pbar); } #endif #endif /* OVLB */ /*allmain.c*/ slashem-0.0.7E7F3/src/pray.c0000664000076400007640000017677210545462317013606 0ustar aliali/* SCCS Id: @(#)pray.c 3.4 2003/03/23 */ /* Copyright (c) Benson I. Margulies, Mike Stephenson, Steve Linhart, 1989. */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" #include "epri.h" STATIC_PTR int NDECL(prayer_done); STATIC_DCL struct obj *NDECL(worst_cursed_item); 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)); STATIC_DCL void FDECL(fry_by_god,(ALIGNTYP_P)); STATIC_DCL void FDECL(gods_angry,(ALIGNTYP_P)); STATIC_DCL void FDECL(gods_upset,(ALIGNTYP_P)); STATIC_DCL void FDECL(consume_offering,(struct obj *)); STATIC_DCL boolean FDECL(water_prayer,(BOOLEAN_P)); STATIC_DCL boolean FDECL(blocked_boulder,(int,int)); static void NDECL(lawful_god_gives_angel); static void FDECL(god_gives_pet,(ALIGNTYP_P)); static int FDECL(offer_oracle,(struct monst *, struct obj *)); static void FDECL(god_gives_benefit,(ALIGNTYP_P)); /* simplify a few tests */ #define Cursed_obj(obj,typ) ((obj) && (obj)->otyp == (typ) && (obj)->cursed) /* * Logic behind deities and altars and such: * + prayers are made to your god if not on an altar, and to the altar's god * if you are on an altar * + If possible, your god answers all prayers, which is why bad things happen * if you try to pray on another god's altar * + sacrifices work basically the same way, but the other god may decide to * accept your allegiance, after which they are your god. If rejected, * your god takes over with your punishment. * + if you're in Gehennom, all messages come from Moloch */ /* * Moloch, who dwells in Gehennom, is the "renegade" cruel god * responsible for the theft of the Amulet from Marduk, the Creator. * Moloch is unaligned. */ static const char *Moloch = "Moloch"; static const char *godvoices[] = { "booms out", "thunders", "rings out", "booms", }; /* values calculated when prayer starts, and used when completed */ static aligntyp p_aligntyp; static int p_trouble; static int p_type; /* (-1)-3: (-1)=really naughty, 3=really good */ #define PIOUS 20 #define DEVOUT 14 #define FERVENT 9 #define STRIDENT 4 /* * The actual trouble priority is determined by the order of the * checks performed in in_trouble() rather than by these numeric * values, so keep that code and these values synchronized in * order to have the values be meaningful. */ #define TROUBLE_STONED 13 #define TROUBLE_SLIMED 12 #define TROUBLE_STRANGLED 11 #define TROUBLE_LAVA 10 #define TROUBLE_SICK 9 #define TROUBLE_STARVING 8 #define TROUBLE_HIT 7 #define TROUBLE_LYCANTHROPE 6 #define TROUBLE_COLLAPSING 5 #define TROUBLE_STUCK_IN_WALL 4 #define TROUBLE_CURSED_LEVITATION 3 #define TROUBLE_UNUSEABLE_HANDS 2 #define TROUBLE_CURSED_BLINDFOLD 1 #define TROUBLE_PUNISHED (-1) #define TROUBLE_FUMBLING (-2) #define TROUBLE_CURSED_ITEMS (-3) #define TROUBLE_SADDLE (-4) #define TROUBLE_BLIND (-5) #define TROUBLE_POISONED (-6) #define TROUBLE_WOUNDED_LEGS (-7) #define TROUBLE_HUNGRY (-8) #define TROUBLE_STUNNED (-9) #define TROUBLE_CONFUSED (-10) #define TROUBLE_HALLUCINATION (-11) #define TROUBLE_LOW_ENERGY (-12) /* We could force rehumanize of polyselfed people, but we can't tell unintentional shape changes from the other kind. Oh well. 3.4.2: make an exception if polymorphed into a form which lacks hands; that's a case where the ramifications override this doubt. */ /* Return 0 if nothing particular seems wrong, positive numbers for serious trouble, and negative numbers for comparative annoyances. This returns the worst problem. There may be others, and the gods may fix more than one. This could get as bizarre as noting surrounding opponents, (or hostile dogs), but that's really hard. */ #define ugod_is_angry() (u.ualign.record < 0) #define on_altar() IS_ALTAR(levl[u.ux][u.uy].typ) #define on_shrine() ((levl[u.ux][u.uy].altarmask & AM_SHRINE) != 0) #define a_align(x,y) ((aligntyp)Amask2align(levl[x][y].altarmask & AM_MASK)) STATIC_OVL int in_trouble() { struct obj *otmp; int i, j, count=0; /* Borrowed from eat.c */ #define SATIATED 0 #define NOT_HUNGRY 1 #define HUNGRY 2 #define WEAK 3 #define FAINTING 4 #define FAINTED 5 #define STARVED 6 /* * major troubles */ if(Stoned) return(TROUBLE_STONED); if(Slimed) return(TROUBLE_SLIMED); if(Strangled) return(TROUBLE_STRANGLED); if(u.utrap && u.utraptype == TT_LAVA) return(TROUBLE_LAVA); if(Sick) return(TROUBLE_SICK); if(u.uhs >= WEAK) return(TROUBLE_STARVING); if (Upolyd ? (u.mh <= 5 || u.mh*7 <= u.mhmax) : (u.uhp <= 5 || u.uhp*7 <= u.uhpmax)) return(TROUBLE_HIT); if(u.ulycn >= LOW_PM && !Race_if(PM_HUMAN_WEREWOLF)) return(TROUBLE_LYCANTHROPE); if(near_capacity() >= EXT_ENCUMBER && AMAX(A_STR)-ABASE(A_STR) > 3) return(TROUBLE_COLLAPSING); for (i= -1; i<=1; i++) for(j= -1; j<=1; j++) { if (!isok(u.ux+i, u.uy+j) || IS_ROCK(levl[u.ux+i][u.uy+j].typ) || (blocked_boulder(i,j) && !throws_rocks(youmonst.data))) count++; } if (count == 8 && !Passes_walls) return(TROUBLE_STUCK_IN_WALL); if (Cursed_obj(uarmf, LEVITATION_BOOTS) || stuck_ring(uleft, RIN_LEVITATION) || stuck_ring(uright, RIN_LEVITATION)) return(TROUBLE_CURSED_LEVITATION); if (nohands(youmonst.data) || !freehand()) { /* for bag/box access [cf use_container()]... make sure it's a case that we know how to handle; otherwise "fix all troubles" would get stuck in a loop */ if (welded(uwep)) return TROUBLE_UNUSEABLE_HANDS; if (Upolyd && nohands(youmonst.data) && (!Unchanging || ((otmp = unchanger()) != 0 && otmp->cursed))) return TROUBLE_UNUSEABLE_HANDS; } if(Blindfolded && ublindf->cursed) return(TROUBLE_CURSED_BLINDFOLD); /* * minor troubles */ if(Punished) return(TROUBLE_PUNISHED); if (Cursed_obj(uarmg, GAUNTLETS_OF_FUMBLING) || Cursed_obj(uarmf, FUMBLE_BOOTS)) return TROUBLE_FUMBLING; if (worst_cursed_item()) return TROUBLE_CURSED_ITEMS; #ifdef STEED if (u.usteed) { /* can't voluntarily dismount from a cursed saddle */ otmp = which_armor(u.usteed, W_SADDLE); if (Cursed_obj(otmp, SADDLE)) return TROUBLE_SADDLE; } #endif if (Blinded > 1 && haseyes(youmonst.data)) return(TROUBLE_BLIND); for(i=0; i= HUNGRY) return(TROUBLE_HUNGRY); if(HStun) return (TROUBLE_STUNNED); if(HConfusion) return (TROUBLE_CONFUSED); if(Hallucination) return(TROUBLE_HALLUCINATION); if((u.uen <= 5 || u.uen*7 <= u.uenmax) && (u.uen < u.uenmax)) return(TROUBLE_LOW_ENERGY); return(0); } /* select an item for TROUBLE_CURSED_ITEMS */ STATIC_OVL struct obj * worst_cursed_item() { register struct obj *otmp; /* if strained or worse, check for loadstone first */ if (near_capacity() >= HVY_ENCUMBER) { for (otmp = invent; otmp; otmp = otmp->nobj) if (Cursed_obj(otmp, LOADSTONE)) return otmp; } /* weapon takes precedence if it is interfering with taking off a ring or putting on a shield */ if (welded(uwep) && (uright || bimanual(uwep))) { /* weapon */ otmp = uwep; /* gloves come next, due to rings */ } else if (uarmg && uarmg->cursed) { /* gloves */ otmp = uarmg; /* then shield due to two handed weapons and spells */ } else if (uarms && uarms->cursed) { /* shield */ otmp = uarms; /* then cloak due to body armor */ } else if (uarmc && uarmc->cursed) { /* cloak */ otmp = uarmc; } else if (uarm && uarm->cursed) { /* suit */ otmp = uarm; } else if (uarmh && uarmh->cursed) { /* helmet */ otmp = uarmh; } else if (uarmf && uarmf->cursed) { /* boots */ otmp = uarmf; #ifdef TOURIST } else if (uarmu && uarmu->cursed) { /* shirt */ otmp = uarmu; #endif } else if (uamul && uamul->cursed) { /* amulet */ otmp = uamul; } else if (uleft && uleft->cursed) { /* left ring */ otmp = uleft; } else if (uright && uright->cursed) { /* right ring */ otmp = uright; } else if (ublindf && ublindf->cursed) { /* eyewear */ otmp = ublindf; /* must be non-blinding lenses */ /* if weapon wasn't handled above, do it now */ } else if (welded(uwep)) { /* weapon */ otmp = uwep; /* active secondary weapon even though it isn't welded */ } else if (uswapwep && uswapwep->cursed && u.twoweap) { otmp = uswapwep; /* all worn items ought to be handled by now */ } else { for (otmp = invent; otmp; otmp = otmp->nobj) { if (!otmp->cursed) continue; if (otmp->otyp == LOADSTONE || otmp->otyp==HEALTHSTONE || confers_luck(otmp)) break; } } return otmp; } STATIC_OVL void fix_worst_trouble(trouble) register int trouble; { int i; struct obj *otmp = 0; const char *what = (const char *)0; static NEARDATA const char leftglow[] = "left ring softly glows", rightglow[] = "right ring softly glows"; switch (trouble) { 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: if (uamul && uamul->otyp == AMULET_OF_STRANGULATION) { Your("amulet vanishes!"); useup(uamul); } You("can breathe again."); Strangled = 0; flags.botl = 1; break; case TROUBLE_LAVA: You("are back on solid ground."); /* teleport should always succeed, but if not, * just untrap them. */ if(!safe_teleds(FALSE)) u.utrap = 0; break; case TROUBLE_STARVING: losestr(-1); /* fall into... */ case TROUBLE_HUNGRY: Your("%s feels content.", body_part(STOMACH)); init_uhunger (); flags.botl = 1; break; case TROUBLE_SICK: You_feel("better."); make_sick(0L, (char *) 0, FALSE, SICK_ALL); break; case TROUBLE_HIT: /* "fix all troubles" will keep trying if hero has 5 or less hit points, so make sure they're always boosted to be more than that */ You_feel("much better."); if (Upolyd) { u.mhmax += rnd(5); if (u.mhmax <= 5) u.mhmax = 5+1; u.mh = u.mhmax; } if (u.uhpmax < u.ulevel * 5 + 11) u.uhpmax += rnd(5); if (u.uhpmax <= 5) u.uhpmax = 5+1; u.uhp = u.uhpmax; flags.botl = 1; break; case TROUBLE_COLLAPSING: ABASE(A_STR) = AMAX(A_STR); flags.botl = 1; break; case TROUBLE_STUCK_IN_WALL: Your("surroundings change."); /* no control, but works on no-teleport levels */ (void) safe_teleds(FALSE); break; case TROUBLE_CURSED_LEVITATION: if (Cursed_obj(uarmf, LEVITATION_BOOTS)) { otmp = uarmf; } else if ((otmp = stuck_ring(uleft,RIN_LEVITATION)) !=0) { if (otmp == uleft) what = leftglow; } else if ((otmp = stuck_ring(uright,RIN_LEVITATION))!=0) { if (otmp == uright) what = rightglow; } goto decurse; case TROUBLE_UNUSEABLE_HANDS: if (welded(uwep)) { otmp = uwep; goto decurse; } if (Upolyd && nohands(youmonst.data)) { if (!Unchanging) { Your("shape becomes uncertain."); rehumanize(); /* "You return to {normal} form." */ } else if ((otmp = unchanger()) != 0 && otmp->cursed) { /* otmp is an amulet of unchanging */ goto decurse; } } if (nohands(youmonst.data) || !freehand()) impossible("fix_worst_trouble: couldn't cure hands."); break; case TROUBLE_CURSED_BLINDFOLD: otmp = ublindf; goto decurse; case TROUBLE_LYCANTHROPE: you_unwere(TRUE); break; /* */ case TROUBLE_PUNISHED: Your("chain disappears."); unpunish(); break; case TROUBLE_FUMBLING: if (Cursed_obj(uarmg, GAUNTLETS_OF_FUMBLING)) otmp = uarmg; else if (Cursed_obj(uarmf, FUMBLE_BOOTS)) otmp = uarmf; goto decurse; /*NOTREACHED*/ break; case TROUBLE_CURSED_ITEMS: otmp = worst_cursed_item(); if (otmp == uright) what = rightglow; else if (otmp == uleft) what = leftglow; decurse: if (!otmp) { impossible("fix_worst_trouble: nothing to uncurse."); return; } uncurse(otmp); if (!Blind) { Your("%s %s.", what ? what : (const char *)aobjnam(otmp, "softly glow"), hcolor(NH_AMBER)); otmp->bknown = TRUE; } update_inventory(); break; case TROUBLE_POISONED: if (Hallucination) pline("There's a tiger in your tank."); else You_feel("in good health again."); for(i=0; ibknown = TRUE; } break; #endif } } /* "I am sometimes shocked by... the nuns who never take a bath without * wearing a bathrobe all the time. When asked why, since no man can see them, * they reply 'Oh, but you forget the good God'. Apparently they conceive of * the Deity as a Peeping Tom, whose omnipotence enables Him to see through * bathroom walls, but who is foiled by bathrobes." --Bertrand Russell, 1943 * Divine wrath, dungeon walls, and armor follow the same principle. */ STATIC_OVL void god_zaps_you(resp_god) aligntyp resp_god; { if (u.uswallow) { pline("Suddenly a bolt of lightning comes down at you from the heavens!"); pline("It strikes %s!", mon_nam(u.ustuck)); if (!resists_elec(u.ustuck)) { pline("%s fries to a crisp!", Monnam(u.ustuck)); /* Yup, you get experience. It takes guts to successfully * pull off this trick on your god, anyway. */ xkilled(u.ustuck, 0); } else pline("%s seems unaffected.", Monnam(u.ustuck)); } else { pline("Suddenly, a bolt of lightning strikes you!"); if (Reflecting) { shieldeff(u.ux, u.uy); if (Blind) pline("For some reason you're unaffected."); else (void) ureflects("%s reflects from your %s.", "It"); } else if (Shock_resistance) { shieldeff(u.ux, u.uy); pline("It seems not to affect you."); } else fry_by_god(resp_god); } pline("%s is not deterred...", align_gname(resp_god)); if (u.uswallow) { pline("A wide-angle disintegration beam aimed at you hits %s!", mon_nam(u.ustuck)); if (!resists_disint(u.ustuck)) { pline("%s fries to a crisp!", Monnam(u.ustuck)); xkilled(u.ustuck, 2); /* no corpse */ } else pline("%s seems unaffected.", Monnam(u.ustuck)); } else { pline("A wide-angle disintegration beam hits you!"); /* disintegrate shield and body armor before disintegrating * the impudent mortal, like black dragon breath -3. */ if (uarms && !(EReflecting & W_ARMS) && !(EDisint_resistance & W_ARMS)) (void) destroy_arm(uarms); if (uarmc && !(EReflecting & W_ARMC) && !(EDisint_resistance & W_ARMC)) (void) destroy_arm(uarmc); if (uarm && !(EReflecting & W_ARM) && !(EDisint_resistance & W_ARM) && !uarmc) (void) destroy_arm(uarm); #ifdef TOURIST if (uarmu && !uarm && !uarmc) (void) destroy_arm(uarmu); #endif if (!Disint_resistance) fry_by_god(resp_god); else { You("bask in its %s glow for a minute...", NH_BLACK); godvoice(resp_god, "You have further angered me!"); } if (Is_astralevel(&u.uz) || Is_sanctum(&u.uz)) { /* one more try for high altars */ verbalize("Thou cannot escape my wrath, mortal!"); summon_minion(resp_god, FALSE); summon_minion(resp_god, FALSE); summon_minion(resp_god, FALSE); summon_minion(resp_god, FALSE); summon_minion(resp_god, FALSE); summon_minion(resp_god, FALSE); summon_minion(resp_god, FALSE); summon_minion(resp_god, FALSE); verbalize("Annihilate %s, my servants!", uhim()); } else { verbalize("Thou cannot escape my wrath, mortal!"); summon_minion(resp_god, FALSE); summon_minion(resp_god, FALSE); summon_minion(resp_god, FALSE); summon_minion(resp_god, FALSE); verbalize("Destroy %s, my servants!", uhim()); } } } STATIC_OVL void fry_by_god(resp_god) aligntyp resp_god; { char killerbuf[64]; You("fry to a crisp."); killer_format = KILLED_BY; Sprintf(killerbuf, "the wrath of %s", align_gname(resp_god)); killer = killerbuf; done(DIED); } STATIC_OVL void angrygods(resp_god) aligntyp resp_god; { register int maxanger; if(Inhell) resp_god = A_NONE; u.ublessed = 0; /* changed from tmp = u.ugangr + abs (u.uluck) -- rph */ /* added test for alignment diff -dlc */ if(resp_god != u.ualign.type) maxanger = u.ualign.record/2 + (Luck > 0 ? -Luck/3 : -Luck); else maxanger = 3*u.ugangr + ((Luck > 0 || u.ualign.record >= STRIDENT) ? -Luck/3 : -Luck); if (maxanger < 1) maxanger = 1; /* possible if bad align & good luck */ else if (maxanger > 15) maxanger = 15; /* be reasonable */ switch (rn2(maxanger)) { case 0: case 1: You_feel("that %s is %s.", align_gname(resp_god), Hallucination ? "bummed" : "displeased"); break; case 2: case 3: godvoice(resp_god,(char *)0); pline("\"Thou %s, %s.\"", (ugod_is_angry() && resp_god == u.ualign.type) ? "hast strayed from the path" : "art arrogant", youmonst.data->mlet == S_HUMAN ? "mortal" : "creature"); verbalize("Thou must relearn thy lessons!"); (void) adjattrib(A_WIS, -3, FALSE); losexp((char *)0, FALSE); break; case 6: if (!Punished) { gods_angry(resp_god); punish((struct obj *)0); break; } /* else fall thru */ case 4: case 5: gods_angry(resp_god); if (!Blind && !Antimagic) pline("%s glow surrounds you.", An(hcolor(NH_BLACK))); rndcurse(); break; case 7: case 8: godvoice(resp_god,(char *)0); verbalize("Thou durst %s me?", (on_altar() && (a_align(u.ux,u.uy) != resp_god)) ? "scorn":"call upon"); pline("\"Then die, %s!\"", youmonst.data->mlet == S_HUMAN ? "mortal" : "creature"); summon_minion(resp_god, FALSE); break; default: gods_angry(resp_god); god_zaps_you(resp_god); break; } #ifdef NOARTIFACTWISH u.usacrifice = 0; #endif u.ublesscnt = rnz(300); 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(NH_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; /* STEPHEN WHITE'S NEW CODE */ if (u.ualign.type == A_LAWFUL) { if (obj->spe < 3) obj->spe = 3; else if (obj->spe > 2) obj->spe += 1; } else 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), u.ualign.record >= DEVOUT ? Hallucination ? "pleased as punch" : "well-pleased" : u.ualign.record >= STRIDENT ? Hallucination ? "ticklish" : "pleased" : Hallucination ? "full" : "satisfied"); /* not your deity */ if (on_altar() && p_aligntyp != u.ualign.type) { adjalign(-1); return; } else if (u.ualign.record < 2 && trouble <= 0) adjalign(1); /* depending on your luck & align level, the god you prayed to will: - fix your worst problem if it's major. - fix all your major problems. - fix your worst problem if it's minor. - fix all of your problems. - do you a gratuitous favor. if you make it to the the last category, you roll randomly again to see what they do for you. 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(Luck + (on_altar() ? 3 + on_shrine() : 2), 1); if (!on_altar()) action = min(action, 3); if (u.ualign.record < STRIDENT) action = (u.ualign.record > 0 || !rnl(2)) ? 1 : 0; /* pleased Lawful gods often send you a helpful angel if you're getting the crap beat out of you */ if ((u.uhp < 5 || (u.uhp*7 < u.uhpmax)) && u.ualign.type == A_LAWFUL && rn2(3)) lawful_god_gives_angel(); switch(min(action,5)) { case 5: pat_on_head = 1; case 4: do fix_worst_trouble(trouble); while ((trouble = in_trouble()) != 0); break; case 3: fix_worst_trouble(trouble); case 2: while ((trouble = in_trouble()) > 0) fix_worst_trouble(trouble); break; case 1: if (trouble > 0) fix_worst_trouble(trouble); case 0: break; /* your god blows you off, too bad */ } } /* note: can't get pat_on_head unless all troubles have just been fixed or there were no troubles to begin with; hallucination won't be in effect so special handling for it is superfluous */ if(pat_on_head) switch(rn2((Luck + 6)>>1)) { case 0: break; case 1: if (uwep && (welded(uwep) || uwep->oclass == WEAPON_CLASS || is_weptool(uwep))) { char repair_buf[BUFSZ]; *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); uwep->bknown = TRUE; if (!Blind) Your("%s %s%s.", aobjnam(uwep, "softly glow"), hcolor(NH_AMBER), repair_buf); else You_feel("the power of %s over your %s.", u_gname(), xname(uwep)); *repair_buf = '\0'; } else if (!uwep->blessed) { bless(uwep); uwep->bknown = TRUE; if (!Blind) Your("%s with %s aura%s.", aobjnam(uwep, "softly glow"), an(hcolor(NH_LIGHT_BLUE)), repair_buf); else You_feel("the blessing of %s over your %s.", u_gname(), xname(uwep)); *repair_buf = '\0'; } /* fix any rust/burn/rot damage, but don't protect against future damage */ if (uwep->oeroded || uwep->oeroded2) { uwep->oeroded = uwep->oeroded2 = 0; /* only give this message if we didn't just bless or uncurse (which has already given a message) */ if (*repair_buf) Your("%s as good as new!", aobjnam(uwep, Blind ? "feel" : "look")); } update_inventory(); } break; case 3: /* takes 2 hints to get the music to enter the stronghold */ if (!u.uevent.uopened_dbridge) { if (u.uevent.uheard_tune < 1) { godvoice(g_align,(char *)0); verbalize("Hark, %s!", youmonst.data->mlet == S_HUMAN ? "mortal" : "creature"); verbalize( "To enter the castle, thou must play the right tune!"); u.uevent.uheard_tune++; break; } else if (u.uevent.uheard_tune < 2) { You_hear("a divine music..."); pline("It sounds like: \"%s\".", tune); u.uevent.uheard_tune++; break; } } /* Otherwise, falls into next case */ case 2: if (!Blind) You("are surrounded by %s glow.", an(hcolor(NH_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; make_blinded(0L,TRUE); flags.botl = 1; break; case 4: { register struct obj *otmp; int any = 0; if (Blind) You_feel("the power of %s.", u_gname()); else You("are surrounded by %s aura.", an(hcolor(NH_LIGHT_BLUE))); for(otmp=invent; otmp; otmp=otmp->nobj) { if (otmp->cursed) { uncurse(otmp); if (!Blind) { Your("%s %s.", aobjnam(otmp, "softly glow"), hcolor(NH_AMBER)); otmp->bknown = TRUE; ++any; } } } if (any) update_inventory(); break; } case 7: case 8: 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; } otmp->otyp = rnd_class(bases[SPBOOK_CLASS], SPE_BLANK_PAPER); } bless(otmp); place_object(otmp, u.ux, u.uy); break; } case 5: { const char *msg="\"and thus I grant thee the gift of %s!\""; godvoice(u.ualign.type, "Thou hast pleased me with thy progress,"); if (!(HTelepat & INTRINSIC)) { HTelepat |= FROMOUTSIDE; pline(msg, "Telepathy"); if (Blind) see_monsters(); } else if (!(HFast & INTRINSIC)) { HFast |= FROMOUTSIDE; pline(msg, "Speed"); } else if (!(HStealth & INTRINSIC)) { HStealth |= FROMOUTSIDE; pline(msg, "Stealth"); } else { if (!(HProtection & INTRINSIC)) { HProtection |= FROMOUTSIDE; if (!u.ublessed) u.ublessed = rn1(3, 2); } else u.ublessed++; pline(msg, "my protection"); } verbalize("Use it wisely in my name!"); break; } default: impossible("Confused deity!"); break; } u.ublesscnt = rnz(350); kick_on_butt = u.uevent.udemigod ? 1 : 0; #ifdef ELBERETH if (u.uevent.uhand_of_elbereth) kick_on_butt++; #endif if (kick_on_butt) u.ublesscnt += kick_on_butt * rnz(1000); return; } /* either blesses or curses water on the altar, * returns true if it found any water here. */ STATIC_OVL boolean water_prayer(bless_water) boolean bless_water; { register struct obj* otmp; register long changed = 0; boolean other = FALSE, bc_known = !(Blind || Hallucination); 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; changed += otmp->quan; } else if(otmp->oclass == POTION_CLASS) other = TRUE; } if(!Blind && changed) { pline("%s potion%s on the altar glow%s %s for a moment.", ((other && changed > 1L) ? "Some of the" : (other ? "One of the" : "The")), ((other || changed > 1L) ? "s" : ""), (changed > 1L ? "" : "s"), (bless_water ? hcolor(NH_LIGHT_BLUE) : hcolor(NH_BLACK))); } return((boolean)(changed > 0L)); } STATIC_OVL void godvoice(g_align, words) aligntyp g_align; const char *words; { const char *quot = ""; if(words) quot = "\""; else words = ""; pline_The("voice of %s %s: %s%s%s", align_gname(g_align), godvoices[rn2(SIZE(godvoices))], quot, words, quot); } STATIC_OVL void gods_angry(g_align) aligntyp g_align; { godvoice(g_align, "Thou hast angered me."); } /* The g_align god is upset with you. */ STATIC_OVL void gods_upset(g_align) aligntyp g_align; { if(g_align == u.ualign.type) u.ugangr++; else if(u.ugangr) u.ugangr--; angrygods(g_align); } static NEARDATA const char sacrifice_types[] = { FOOD_CLASS, AMULET_CLASS, 0 }; static NEARDATA const char ext_sacrifice_types[] = { ALLOW_FLOOROBJ, FOOD_CLASS, AMULET_CLASS, 0 }; STATIC_OVL void consume_offering(otmp) register struct obj *otmp; { if (Hallucination) switch (rn2(3)) { case 0: Your("sacrifice sprouts wings and a propeller and roars away!"); break; case 1: Your("sacrifice puffs up, swelling bigger and bigger, and pops!"); break; case 2: Your("sacrifice collapses into a cloud of dancing particles and fades away!"); break; } else if (Blind && u.ualign.type == A_LAWFUL) Your("sacrifice disappears!"); else Your("sacrifice is consumed in a %s!", u.ualign.type == A_LAWFUL ? "flash of light" : "burst of flame"); if (carried(otmp)) useup(otmp); else useupf(otmp, 1L); exercise(A_WIS, TRUE); } void god_gives_pet(alignment) aligntyp alignment; { /* register struct monst *mtmp2; register struct permonst *pm; */ int mnum; int mon; switch ((int)alignment) { case A_LAWFUL: mnum = lawful_minion(u.ulevel); break; case A_NEUTRAL: mnum = neutral_minion(u.ulevel); break; case A_CHAOTIC: case A_NONE: mnum = chaotic_minion(u.ulevel); break; default: impossible("unaligned player?"); mnum = ndemon(A_NONE); break; } mon = make_pet_minion(mnum,alignment); if (mon) { switch ((int)alignment) { case A_LAWFUL: pline("%s", Blind ? "You feel the presence of goodness." : "There is a puff of white fog!"); break; case A_NEUTRAL: pline("%s", Blind ? "You hear the earth rumble..." : "A cloud of gray smoke gathers around you!"); break; case A_CHAOTIC: case A_NONE: pline("%s", Blind ? "You hear an evil chuckle!" : "A miasma of stinking vapors coalesces around you!"); break; } godvoice(u.ualign.type, "My minion shall serve thee!"); return; } } static void lawful_god_gives_angel() { /* register struct monst *mtmp2; register struct permonst *pm; */ int mnum; int mon; mnum = lawful_minion(u.ulevel); mon = make_pet_minion(mnum,A_LAWFUL); pline("%s", Blind ? "You feel the presence of goodness." : "There is a puff of white fog!"); if (u.uhp > (u.uhpmax / 10)) godvoice(u.ualign.type, "My minion shall serve thee!"); else godvoice(u.ualign.type, "My minion shall save thee!"); } /* KMH -- offerings to Oracle */ static int offer_oracle (mtmp, otmp) struct monst *mtmp; struct obj *otmp; { /* The Oracle doesn't care about the age or species of the corpse, * except for the dreaded woodchuck. */ boolean woodchuck = (otmp->corpsenm == PM_WOODCHUCK); /* Make sure it's a corpse */ if (otmp->otyp != CORPSE) { pline(nothing_happens); return (1); } /* you're handling this corpse, even if it was killed upon the altar */ feel_cockatrice(otmp, TRUE); pline("%s looks at you %sfully.", Monnam(mtmp), woodchuck ? "scorn" : "thought"); outrumor(woodchuck ? -1 : 0, FALSE); consume_offering(otmp); adjalign(-1); /* Your god is jealous */ if (woodchuck) { /* You are annoying the Oracle */ change_luck(-1); exercise(A_WIS, FALSE); exercise(A_WIS, FALSE); /* outrumor() exercised */ exercise(A_WIS, FALSE); /* consume_offering() exercised */ } return (1); } int dosacrifice() { register struct obj *otmp; int value = 0; int pm; aligntyp altaralign = a_align(u.ux,u.uy); struct monst *orac = NULL; /* KMH -- offerings to Oracle */ if (Is_oracle_level(&u.uz) && !u.uswallow) { for(orac = fmon; orac; orac = orac->nmon) if (orac->data == &mons[PM_ORACLE]) break; if (!orac || distu(orac->mx, orac->my) > 2 || !mon_visible(orac)) { pline("I see no one next to you to take a sacrifice."); return 0; } } if (!orac && (!on_altar() || u.uswallow)) { You("are not standing on an altar."); return 0; } if (In_endgame(&u.uz)) { if (!(otmp = getobj(sacrifice_types, "sacrifice"))) return 0; } else { if (!(otmp = getobj(ext_sacrifice_types, "sacrifice"))) return 0; } /* KMH -- offerings to Oracle */ if (orac) return (offer_oracle(orac, otmp)); /* Was based on nutritional value and aging behavior (< 50 moves). Sacrificing a food ration got you max luck instantly, making the gods as easy to please as an angry dog! Now only accepts corpses, based on the game's evaluation of their toughness. Human and pet sacrifice, as well as sacrificing unicorns of your alignment, is strongly discouraged. */ #define MAXVALUE 24 /* Highest corpse value (besides Wiz) */ /* sacrificing the eye and/or hand of Vecna is a special case */ if (otmp->oartifact == ART_EYE_OF_THE_BEHOLDER || otmp->oartifact == ART_HAND_OF_VECNA) { You("offer this evil thing to %s...", a_gname()); value = MAXVALUE; /* holy crap! */ u.uconduct.gnostic++; /* KMH, ethics */ } if (otmp->otyp == CORPSE) { register struct permonst *ptr = &mons[otmp->corpsenm]; struct monst *mtmp; extern const int monstr[]; /* KMH, conduct */ u.uconduct.gnostic++; /* you're handling this corpse, even if it was killed upon the altar */ feel_cockatrice(otmp, TRUE); if (otmp->corpsenm == PM_ACID_BLOB || (monstermoves <= peek_at_iced_corpse_age(otmp) + 50)) { value = monstr[otmp->corpsenm] + 1; } if (otmp->oeaten) value = eaten_stat(value, otmp); if (your_race(ptr)) { if (is_demon(youmonst.data) || Race_if(PM_HUMAN_WEREWOLF)) { You("find the idea very satisfying."); exercise(A_WIS, TRUE); } else if (u.ualign.type != A_CHAOTIC) { pline("You'll regret this infamous offense!"); exercise(A_WIS, FALSE); } if (altaralign != A_CHAOTIC && altaralign != A_NONE) { /* curse the lawful/neutral altar */ int race = mrace2race(ptr->mflags2); if (race != ROLE_NONE) pline_The("altar is stained with %s blood.", races[race].adj); else impossible("Bad monster race?"); if(!Is_astralevel(&u.uz)) levl[u.ux][u.uy].altarmask = AM_CHAOTIC; angry_priest(); } else { struct monst *dmon; const char *demonless_msg; register struct obj *octmp; /* Human sacrifice on a chaotic or unaligned altar */ /* is equivalent to demon summoning */ if (altaralign == A_CHAOTIC && u.ualign.type != A_CHAOTIC) { pline( "The blood floods the altar, which vanishes in %s cloud!", an(hcolor(NH_BLACK))); levl[u.ux][u.uy].typ = ROOM; levl[u.ux][u.uy].altarmask = 0; newsym(u.ux, u.uy); angry_priest(); demonless_msg = "cloud dissipates"; } else { /* either you're chaotic or altar is Moloch's or both */ pline_The("blood covers the altar, and a dark cloud forms!"); change_luck(altaralign == A_NONE ? -2 : 2); demonless_msg = "blood coagulates"; } if ((pm = dlord(altaralign)) != NON_PM && (dmon = makemon(&mons[pm], u.ux, u.uy, NO_MM_FLAGS))) { /* here to be seen */ dmon->minvis = FALSE; You("have summoned %s!", a_monnam(dmon)); if (sgn(u.ualign.type) == sgn(dmon->data->maligntyp)) { dmon->mpeaceful = TRUE; } else if (is_dprince(dmon->data)) { switch (rn2(5)) { case 0: pline("He is furious!"); dmon->mpeaceful = FALSE; break; case 1: pline("Angered at your summons, he curses you!"); /* but not angry enough to whup yer ass */ for(octmp = invent; octmp ; octmp = octmp->nobj) if (!rn2(6)) curse(octmp); break; case 2: case 3: You("are terrified, and unable to move."); nomul(-3); nomovemsg = 0; break; case 4: pline("Amused, he grants you a wish!"); makewish(); break; } } } else pline_The("%s.", demonless_msg); } if (u.ualign.type != A_CHAOTIC) { adjalign(-5); u.ugangr += 3; (void) adjattrib(A_WIS, -1, TRUE); if (!Inhell) angrygods(u.ualign.type); change_luck(-5); } else adjalign(5); if (carried(otmp)) useup(otmp); else useupf(otmp, 1L); return(1); } else if (otmp->oxlth && otmp->oattached == OATTACHED_MONST && ((mtmp = get_mtraits(otmp, FALSE)) != (struct monst *)0) && mtmp->mtame) { /* mtmp is a temporary pointer to a tame monster's attributes, * not a real monster */ pline("So this is how you repay loyalty?"); adjalign(-3); value = -1; HAggravate_monster |= FROMOUTSIDE; } else if (is_undead(ptr)) { /* Not demons--no demon corpses */ if (u.ualign.type != A_CHAOTIC) value += 1; } else if (is_unicorn(ptr)) { int unicalign = sgn(ptr->maligntyp); /* If same as altar, always a very bad action. */ if (unicalign == altaralign) { pline("Such an action is an insult to %s!", (unicalign == A_CHAOTIC) ? "chaos" : unicalign ? "law" : "balance"); (void) adjattrib(A_WIS, -1, TRUE); value = -5; } else if (u.ualign.type == altaralign) { /* If different from altar, and altar is same as yours, */ /* it's a very good action */ if (u.ualign.record < ALIGNLIM) You_feel("appropriately %s.", align_str(u.ualign.type)); else You_feel("you are thoroughly on the right path."); adjalign(5); #ifdef NOARTIFACTWISH u.usacrifice += 5; #endif value += 3; } else /* If sacrificing unicorn of your alignment to altar not of */ /* your alignment, your god gets angry and it's a conversion */ if (unicalign == u.ualign.type) { u.ualign.record = -1; value = 1; } else value += 3; } } /* corpse */ if (otmp->otyp == AMULET_OF_YENDOR) { if (!Is_astralevel(&u.uz)) { if (Hallucination) You_feel("homesick."); else You_feel("an urge to return to the surface."); return 1; } else { /* The final Test. Did you win? */ if(uamul == otmp) Amulet_off(); u.uevent.ascended = 1; if(carried(otmp)) useup(otmp); /* well, it's gone now */ else useupf(otmp, 1L); You("offer the Amulet of Yendor to %s...", a_gname()); if (u.ualign.type != altaralign) { /* And the opposing team picks you up and carries you off on their shoulders */ adjalign(-99); pline("%s accepts your gift, and gains dominion over %s...", a_gname(), u_gname()); pline("%s is enraged...", u_gname()); pline("Fortunately, %s permits you to live...", a_gname()); pline("A cloud of %s smoke surrounds you...", hcolor((const char *)"orange")); done(ESCAPED); } else { /* super big win */ adjalign(10); pline("An invisible choir sings, and you are bathed in radiance..."); godvoice(altaralign, "Congratulations, mortal!"); display_nhwindow(WIN_MESSAGE, FALSE); verbalize("In return for thy service, I grant thee the gift of Immortality!"); You("ascend to the status of Demigod%s...", flags.female ? "dess" : ""); done(ASCENDED); } } } /* real Amulet */ if (otmp->otyp == FAKE_AMULET_OF_YENDOR) { if (flags.soundok) You_hear("a nearby thunderclap."); if (!otmp->known) { You("realize you have made a %s.", Hallucination ? "boo-boo" : "mistake"); otmp->known = TRUE; change_luck(-1); return 1; } else { /* don't you dare try to fool the gods */ change_luck(-3); adjalign(-1); u.ugangr += 3; #ifdef NOARTIFACTWISH u.usacrifice = 0; #endif value = -3; } } /* fake Amulet */ if (value == 0) { pline(nothing_happens); return (1); } if (altaralign != u.ualign.type && (Is_astralevel(&u.uz) || Is_sanctum(&u.uz))) { /* * REAL BAD NEWS!!! High altars cannot be converted. Even an attempt * gets the god who owns it truely pissed off. */ You_feel("the air around you grow charged..."); pline("Suddenly, you realize that %s has noticed you...", a_gname()); godvoice(altaralign, "So, mortal! You dare desecrate my High Temple!"); /* Throw everything we have at the player */ god_zaps_you(altaralign); } else if (value < 0) { /* I don't think the gods are gonna like this... */ gods_upset(altaralign); } else { int saved_anger = u.ugangr; int saved_cnt = u.ublesscnt; int saved_luck = u.uluck; /* Sacrificing at an altar of a different alignment */ if (u.ualign.type != altaralign) { /* Is this a conversion ? */ /* An unaligned altar in Gehennom will always elicit rejection. */ if (ugod_is_angry() || (altaralign == A_NONE && Inhell)) { if(u.ualignbase[A_CURRENT] == u.ualignbase[A_ORIGINAL] && altaralign != A_NONE) { You("have a strong feeling that %s is angry...", u_gname()); consume_offering(otmp); pline("%s accepts your allegiance.", a_gname()); /* The player wears a helm of opposite alignment? */ if (uarmh && uarmh->otyp == HELM_OF_OPPOSITE_ALIGNMENT) u.ualignbase[A_CURRENT] = altaralign; else u.ualign.type = u.ualignbase[A_CURRENT] = altaralign; u.ublessed = 0; flags.botl = 1; You("have a sudden sense of a new direction."); /* Beware, Conversion is costly */ change_luck(-3); u.ublesscnt += 300; adjalign((int)(u.ualignbase[A_ORIGINAL] * (ALIGNLIM / 2))); } else { u.ugangr += 3; adjalign(-5); #ifdef NOARTIFACTWISH u.usacrifice = 0; #endif pline("%s rejects your sacrifice!", a_gname()); godvoice(altaralign, "Suffer, infidel!"); change_luck(-5); (void) adjattrib(A_WIS, -2, TRUE); if (!Inhell) angrygods(u.ualign.type); } return(1); } else { consume_offering(otmp); You("sense a conflict between %s and %s.", u_gname(), a_gname()); if (rn2(8 + u.ulevel) > 5) { struct monst *pri; You_feel("the power of %s increase.", u_gname()); if (rnl(u.ulevel) > 3) { /* KMH -- Only a chance of this happening */ You("feel %s is very angry at you!", a_gname()); summon_minion(altaralign, FALSE); summon_minion(altaralign, FALSE); } u.ublesscnt = 0; /* WAC You deserve this ... */ exercise(A_WIS, TRUE); #ifdef NOARTIFACTWISH u.usacrifice += 5; #endif change_luck(1); /* Yes, this is supposed to be &=, not |= */ levl[u.ux][u.uy].altarmask &= AM_SHRINE; /* the following accommodates stupid compilers */ levl[u.ux][u.uy].altarmask = levl[u.ux][u.uy].altarmask | (Align2amask(u.ualign.type)); if (!Blind) pline_The("altar glows %s.", hcolor( u.ualign.type == A_LAWFUL ? NH_WHITE : u.ualign.type ? NH_BLACK : (const char *)"gray")); if (rnl(u.ulevel) > 6 && u.ualign.record > 0 && rnd(u.ualign.record) > (3*ALIGNLIM)/4) summon_minion(altaralign, TRUE); /* anger priest; test handles bones files */ if((pri = findpriest(temple_occupied(u.urooms))) && !p_coaligned(pri)) angry_priest(); } else { pline("Unluckily, you feel the power of %s decrease.", u_gname()); change_luck(-1); #ifdef NOARTIFACTWISH u.usacrifice = 0; #endif exercise(A_WIS, FALSE); if (rnl(u.ulevel) > 6 && u.ualign.record > 0 && rnd(u.ualign.record) > (7*ALIGNLIM)/8) summon_minion(altaralign, TRUE); } return(1); } } consume_offering(otmp); /* OK, you get brownie points. */ if(u.ugangr) { u.ugangr -= ((value * (u.ualign.type == A_CHAOTIC ? 2 : 3)) / MAXVALUE); if(u.ugangr < 0) u.ugangr = 0; if(u.ugangr != saved_anger) { if (u.ugangr) { pline("%s seems %s.", u_gname(), Hallucination ? "groovy" : "slightly mollified"); if ((int)u.uluck < 0) change_luck(1); } else { pline("%s seems %s.", u_gname(), Hallucination ? "cosmic (not a new fact)" : "mollified"); if ((int)u.uluck < 0) u.uluck = 0; } } else { /* not satisfied yet */ if (Hallucination) pline_The("gods seem tall."); else You("have a feeling of inadequacy."); } } else if(ugod_is_angry()) { if(value > MAXVALUE) value = MAXVALUE; if(value > -u.ualign.record) value = -u.ualign.record; adjalign(value); You_feel("partially absolved."); } else if (u.ublesscnt > 0) { u.ublesscnt -= ((value * (u.ualign.type == A_CHAOTIC ? 500 : 300)) / MAXVALUE); if(u.ublesscnt < 0) u.ublesscnt = 0; if(u.ublesscnt != saved_cnt) { if (u.ublesscnt) { if (Hallucination) You("realize that the gods are not like you and I."); else You("have a hopeful feeling."); if ((int)u.uluck < 0) change_luck(1); } else { if (Hallucination) pline("Overall, there is a smell of fried onions."); else You("have a feeling of reconciliation."); if ((int)u.uluck < 0) u.uluck = 0; } } } else { int nartifacts = nartifact_exist(); /* 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)); exercise(A_WIS, TRUE); /* make sure we can use this weapon */ unrestrict_weapon_skill(weapon_type(otmp)); discover_artifact(otmp->oartifact); return(1); } else { pline("A spellbook appears at your %s!", makeplural(body_part(FOOT))); bless(mkobj_at(SPBOOK_CLASS, u.ux, u.uy, TRUE)); #ifdef NOARTIFACTWISH u.usacrifice = 0; #endif return(1); } } else if (!rnl(30 + u.ulevel)) { /* no artifact, but maybe a helpful pet? */ /* WAC is now some generic benefit (includes pets) */ god_gives_benefit(altaralign); #ifdef NOARTIFACTWISH u.usacrifice = 0; #endif return(1); } 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)); else You(Hallucination ? "see crabgrass at your %s. A funny thing in a dungeon." : "glimpse a four-leaf clover at your %s.", makeplural(body_part(FOOT))); } } } return(1); } /* determine prayer results in advance; also used for enlightenment */ boolean can_pray(praying) boolean praying; /* false means no messages should be given */ { int alignment; p_aligntyp = on_altar() ? a_align(u.ux,u.uy) : u.ualign.type; p_trouble = in_trouble(); if (is_demon(youmonst.data) && (p_aligntyp != A_CHAOTIC)) { if (praying) pline_The("very idea of praying to a %s god is repugnant to you.", p_aligntyp ? "lawful" : "neutral"); return FALSE; } if (praying) You("begin praying to %s.", align_gname(p_aligntyp)); if (u.ualign.type && u.ualign.type == -p_aligntyp) alignment = -u.ualign.record; /* Opposite alignment altar */ else if (u.ualign.type != p_aligntyp) alignment = u.ualign.record / 2; /* Different alignment altar */ else alignment = u.ualign.record; if ((p_trouble > 0) ? (u.ublesscnt > 200) : /* big trouble */ (p_trouble < 0) ? (u.ublesscnt > 100) : /* minor difficulties */ (u.ublesscnt > 0)) /* not in trouble */ p_type = 0; /* too soon... */ else if ((int)Luck < 0 || u.ugangr || alignment < 0) p_type = 1; /* too naughty... */ else /* alignment >= 0 */ { if(on_altar() && u.ualign.type != p_aligntyp) p_type = 2; else p_type = 3; } if (is_undead(youmonst.data) && !Inhell && (p_aligntyp == A_LAWFUL || (p_aligntyp == A_NEUTRAL && !rn2(10)))) p_type = -1; /* Note: when !praying, the random factor for neutrals makes the return value a non-deterministic approximation for enlightenment. This case should be uncommon enough to live with... */ return !praying ? (boolean)(p_type == 3 && !Inhell) : TRUE; } 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; if (IS_TOILET(levl[u.ux][u.uy].typ)) { pline("You pray to the Porcelain God."); if (!Sick && !HConfusion && !HStun) { pline("He ignores your pleas."); return(1); } pline("He smiles upon you."); if (Sick) make_sick(0L, (char *)0, TRUE, SICK_ALL); if (HConfusion) make_confused(0L, TRUE); if (HStun) make_stunned(0L, TRUE); return(1); } /* set up p_type and p_alignment */ if (!can_pray(TRUE)) return 0; #ifdef WIZARD if (wizard && p_type >= 0) { if (yn("Force the gods to be pleased?") == 'y') { u.ublesscnt = 0; if (u.uluck < 0) u.uluck = 0; if (u.ualign.record <= 0) u.ualign.record = 1; u.ugangr = 0; if(p_type < 2) p_type = 3; } } #endif nomul(-3); nomovemsg = "You finish your prayer."; afternmv = prayer_done; /* if you've been true to your god you can't die while you pray */ if(p_type == 3 && !Inhell) { if (!Blind) You("are surrounded by a shimmering light."); u.uinvulnerable = TRUE; } return(1); } STATIC_PTR int prayer_done() /* M. Stephenson (1.0.3b) */ { aligntyp alignment = p_aligntyp; u.uinvulnerable = FALSE; if(p_type == -1) { godvoice(alignment, alignment == A_LAWFUL ? "Vile creature, thou durst call upon me?" : "Walk no more, perversion of nature!"); You_feel("like you are falling apart."); if (Upolyd) { /* KMH, balance patch -- Gods have mastery over unchanging */ rehumanize(); } /* ALI, Racially undead (ie., vampires) get the same penalties */ else if (rn2(20) > ACURR(A_CON)) u.uhp = (u.uhp/2) + 1; losehp(rnd(20), "residual undead turning effect", KILLED_BY_AN); exercise(A_CON, FALSE); return(1); } if (Inhell) { pline("Since you are in Gehennom, %s won't help you.", align_gname(alignment)); /* haltingly aligned is least likely to anger */ if (u.ualign.record <= 0 || rnl(u.ualign.record)) angrygods(u.ualign.type); return(0); } if (p_type == 0) { if(on_altar() && u.ualign.type != alignment) (void) water_prayer(FALSE); u.ublesscnt += rnz(250); change_luck(-3); gods_upset(u.ualign.type); } else if(p_type == 1) { if(on_altar() && u.ualign.type != alignment) (void) water_prayer(FALSE); angrygods(u.ualign.type); /* naughty */ } else if(p_type == 2) { if(water_prayer(FALSE)) { /* attempted water prayer on a non-coaligned altar */ u.ublesscnt += rnz(250); change_luck(-3); gods_upset(u.ualign.type); } else pleased(alignment); } else { /* coaligned */ if(on_altar()) (void) water_prayer(TRUE); pleased(alignment); /* nice */ } return(1); } int doturn() { /* WAC doturn is now a technique */ /* Try to use turn undead spell if you don't know the tech. */ /* if (!Role_if(PM_PRIEST) && !Role_if(PM_KNIGHT) && !Role_if(PM_UNDEAD_SLAYER)) {*/ if (!tech_known(T_TURN_UNDEAD)) { if (objects[SPE_TURN_UNDEAD].oc_name_known) { register int sp_no; for (sp_no = 0; sp_no < MAXSPELL && spl_book[sp_no].sp_id != NO_SPELL && spl_book[sp_no].sp_id != SPE_TURN_UNDEAD; sp_no++); if (sp_no < MAXSPELL && spl_book[sp_no].sp_id == SPE_TURN_UNDEAD) return spelleffects(sp_no, TRUE); } You("don't know how to turn undead!"); return(0); } return(turn_undead()); } int turn_undead() { struct monst *mtmp, *mtmp2; int once, range, xlev; u.uconduct.gnostic++; if ((u.ualign.type != A_CHAOTIC && (is_demon(youmonst.data) || is_undead(youmonst.data))) || u.ugangr > 6 /* "Die, mortal!" */) { pline("For some reason, %s seems to ignore you.", u_gname()); aggravate(); exercise(A_WIS, FALSE); return(0); } if (Inhell) { pline("Since you are in Gehennom, %s won't help you.", u_gname()); aggravate(); return(0); } pline("Calling upon %s, you chant an arcane formula.", u_gname()); exercise(A_WIS, TRUE); /* note: does not perform unturn_dead() on victims' inventories */ range = BOLT_LIM + (u.ulevel / 5); /* 5 to 11 */ range *= range; once = 0; for(mtmp = fmon; mtmp; mtmp = mtmp2) { mtmp2 = mtmp->nmon; if (DEADMONSTER(mtmp)) continue; if (!cansee(mtmp->mx,mtmp->my) || distu(mtmp->mx,mtmp->my) > range) continue; if (!mtmp->mpeaceful && (is_undead(mtmp->data) || (is_demon(mtmp->data) && (u.ulevel > (MAXULEV/2))))) { mtmp->msleeping = 0; if (Confusion) { if (!once++) pline("Unfortunately, your voice falters."); mtmp->mflee = 0; mtmp->mfrozen = 0; mtmp->mcanmove = 1; } else if (!resist(mtmp, '\0', 0, TELL)) { xlev = 6; switch (mtmp->data->mlet) { /* this is intentional, lichs are tougher than zombies. */ /* ToDo - catch vampire bats */ 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; } } } } nomul(-2); nomovemsg = 0; return(1); } const char * a_gname() { return(a_gname_at(u.ux, u.uy)); } const char * a_gname_at(x,y) /* returns the name of an altar's deity */ xchar x, y; { if(!IS_ALTAR(levl[x][y].typ)) return((char *)0); return align_gname(a_align(x,y)); } const char * u_gname() /* returns the name of the player's deity */ { return align_gname(u.ualign.type); } const char * align_gname(alignment) aligntyp alignment; { const char *gnam; switch (alignment) { case A_NONE: gnam = Moloch; break; case A_LAWFUL: gnam = urole.lgod; break; case A_NEUTRAL: gnam = urole.ngod; break; case A_CHAOTIC: gnam = urole.cgod; break; default: impossible("unknown alignment."); gnam = "someone"; break; } if (*gnam == '_') ++gnam; return gnam; } /* hallucination handling for priest/minion names: select a random god iff character is hallucinating */ const char * halu_gname(alignment) aligntyp alignment; { const char *gnam; int which; if (!Hallucination) return align_gname(alignment); which = randrole(); switch (rn2(3)) { case 0: gnam = roles[which].lgod; break; case 1: gnam = roles[which].ngod; break; case 2: gnam = roles[which].cgod; break; default: gnam = 0; break; /* lint suppression */ } if (!gnam) gnam = Moloch; if (*gnam == '_') ++gnam; return gnam; } /* deity's title */ const char * align_gtitle(alignment) aligntyp alignment; { const char *gnam, *result = "god"; switch (alignment) { case A_LAWFUL: gnam = urole.lgod; break; case A_NEUTRAL: gnam = urole.ngod; break; case A_CHAOTIC: gnam = urole.cgod; break; default: gnam = 0; break; } if (gnam && *gnam == '_') result = "goddess"; return result; } void altar_wrath(x, y) register int x, y; { aligntyp altaralign = a_align(x,y); if(!strcmp(align_gname(altaralign), u_gname())) { godvoice(altaralign, "How darest thou desecrate my altar!"); (void) adjattrib(A_WIS, -1, FALSE); } else { pline("A voice (could it be %s?) whispers:", align_gname(altaralign)); verbalize("Thou shalt pay, infidel!"); change_luck(-1); } } /* assumes isok() at one space away, but not necessarily at two */ STATIC_OVL boolean blocked_boulder(dx,dy) int dx,dy; { register struct obj *otmp; long count = 0L; for(otmp = level.objects[u.ux+dx][u.uy+dy]; otmp; otmp = otmp->nexthere) { if(otmp->otyp == BOULDER) count += otmp->quan; } switch(count) { case 0: return FALSE; /* no boulders--not blocked */ case 1: break; /* possibly blocked depending on if it's pushable */ default: return TRUE; /* >1 boulder--blocked after they push the top one; don't force them to push it first to find out */ } if (!isok(u.ux+2*dx, u.uy+2*dy)) return TRUE; if (IS_ROCK(levl[u.ux+2*dx][u.uy+2*dy].typ)) return TRUE; if (sobj_at(BOULDER, u.ux+2*dx, u.uy+2*dy)) return TRUE; return FALSE; } /* Give away something */ void god_gives_benefit(alignment) aligntyp alignment; { register struct obj *otmp; const char *what = (const char *)0; if (!rnl(30 + u.ulevel)) god_gives_pet(alignment); else { switch (rnl(4)) { /* increase weapon bonus */ case 0: /* randomly charge an object */ case 1: /* randomly identify items in the backpack */ case 2: /* do magic mapping */ case 3: /* give some food */ case 4: /* randomly bless items */ /* weapon takes precedence if it interferes with taking off a ring or shield */ if (uwep && !uwep->blessed) /* weapon */ otmp = uwep; else if (uswapwep && !uswapwep->blessed) /* secondary weapon */ otmp = uswapwep; /* gloves come next, due to rings */ else if (uarmg && !uarmg->blessed) /* gloves */ otmp = uarmg; /* then shield due to two handed weapons and spells */ else if (uarms && !uarms->blessed) /* shield */ otmp = uarms; /* then cloak due to body armor */ else if (uarmc && !uarmc->blessed) /* cloak */ otmp = uarmc; else if (uarm && !uarm->blessed) /* armor */ otmp = uarm; else if (uarmh && !uarmh->blessed) /* helmet */ otmp = uarmh; else if (uarmf && !uarmf->blessed) /* boots */ otmp = uarmf; #ifdef TOURIST else if (uarmu && !uarmu->blessed) /* shirt */ otmp = uarmu; #endif /* (perhaps amulet should take precedence over rings?) */ else if (uleft && !uleft->blessed) otmp = uleft; else if (uright && !uright->blessed) otmp = uright; else if (uamul && !uamul->blessed) /* amulet */ otmp = uamul; else { for(otmp=invent; otmp; otmp=otmp->nobj) if (!otmp->blessed) break; return; /* Nothing to do! */ } bless(otmp); otmp->bknown = TRUE; if (!Blind) Your("%s %s.", what ? what : (const char *)aobjnam (otmp, "softly glow"), hcolor(NH_AMBER)); break; } } } /*pray.c*/ slashem-0.0.7E7F3/src/were.c0000664000076400007640000001356110545462317013557 0ustar aliali/* SCCS Id: @(#)were.c 3.4 2002/11/07 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" #ifdef OVL0 void were_change(mon) register struct monst *mon; { if (!is_were(mon->data)) return; if (is_human(mon->data)) { if (!Protection_from_shape_changers && !rn2(night() ? (flags.moonphase == FULL_MOON ? 3 : 30) : (flags.moonphase == FULL_MOON ? 10 : 50))) { new_were(mon); /* change into animal form */ if (flags.soundok && !canseemon(mon)) { const char *howler; switch (monsndx(mon->data)) { case PM_HUMAN_WEREWOLF: howler = "wolf"; break; case PM_HUMAN_WEREJACKAL: howler = "jackal"; break; case PM_HUMAN_WEREPANTHER: howler = "panther"; break; case PM_HUMAN_WERETIGER: howler = "tiger"; break; default: howler = (char *)0; break; } if (howler) You_hear("a %s howling at the moon.", howler); } } } else if (!rn2(30) || Protection_from_shape_changers) { new_were(mon); /* change back into human form */ } } #endif /* OVL0 */ #ifdef OVLB int counter_were(pm) int pm; { switch(pm) { case PM_WEREWOLF: return(PM_HUMAN_WEREWOLF); case PM_HUMAN_WEREWOLF: return(PM_WEREWOLF); case PM_WEREJACKAL: return(PM_HUMAN_WEREJACKAL); case PM_HUMAN_WEREJACKAL: return(PM_WEREJACKAL); case PM_WERERAT: return(PM_HUMAN_WERERAT); case PM_HUMAN_WERERAT: return(PM_WERERAT); case PM_WEREPANTHER: return(PM_HUMAN_WEREPANTHER); case PM_HUMAN_WEREPANTHER:return(PM_WEREPANTHER); case PM_WERETIGER: return(PM_HUMAN_WERETIGER); case PM_HUMAN_WERETIGER: return(PM_WERETIGER); case PM_WERESNAKE: return(PM_HUMAN_WERESNAKE); case PM_HUMAN_WERESNAKE: return(PM_WERESNAKE); case PM_WERESPIDER: return(PM_HUMAN_WERESPIDER); case PM_HUMAN_WERESPIDER: return(PM_WERESPIDER); default: return(0); } } void new_were(mon) register struct monst *mon; { register int pm; pm = counter_were(monsndx(mon->data)); if(!pm) { impossible("unknown lycanthrope %s.", mon->data->mname); return; } if(canseemon(mon) && !Hallucination) pline("%s changes into a %s.", Monnam(mon), is_human(&mons[pm]) ? "human" : mons[pm].mname+4); set_mon_data(mon, &mons[pm], 0); if (mon->msleeping || !mon->mcanmove) { /* transformation wakens and/or revitalizes */ mon->msleeping = 0; mon->mfrozen = 0; /* not asleep or paralyzed */ mon->mcanmove = 1; } /* 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, FALSE); (void) stop_timer(UNPOLY_MON, (genericptr_t) mon); (void) start_timer(rn1(1000,1000), TIMER_MONSTER, UNPOLY_MON, (genericptr_t) mon); } int were_summon(ptr,yours,visible,genbuf) /* were-creature (even you) summons a horde */ register struct permonst *ptr; register boolean yours; int *visible; /* number of visible helpers created */ char *genbuf; { register int i, typ, pm = monsndx(ptr); register struct monst *mtmp; int total = 0; *visible = 0; if(Protection_from_shape_changers && !yours) return 0; /* * Allow lycanthropes in normal form to summon hordes as well. --ALI */ if (pm == PM_PLAYERMON) pm = urace.malenum; for(i = rnd(2); i > 0; i--) { switch(pm) { case PM_WERERAT: case PM_HUMAN_WERERAT: typ = rn2(3) ? PM_SEWER_RAT : rn2(3) ? PM_GIANT_RAT : PM_RABID_RAT ; if (genbuf) Strcpy(genbuf, "rat"); break; case PM_WEREJACKAL: case PM_HUMAN_WEREJACKAL: typ = PM_JACKAL; if (genbuf) Strcpy(genbuf, "jackal"); break; case PM_WEREWOLF: case PM_HUMAN_WEREWOLF: typ = rn2(5) ? PM_WOLF : PM_WINTER_WOLF ; if (genbuf) Strcpy(genbuf, "wolf"); break; case PM_WEREPANTHER: case PM_HUMAN_WEREPANTHER: typ = rn2(5) ? PM_JAGUAR : PM_PANTHER ; if (genbuf) Strcpy(genbuf, "large cat"); break; case PM_WERETIGER: case PM_HUMAN_WERETIGER: typ = rn2(5) ? PM_JAGUAR : PM_TIGER ; if (genbuf) Strcpy(genbuf, "large cat"); break; case PM_WERESNAKE: case PM_HUMAN_WERESNAKE: typ = rn2(5) ? PM_SNAKE : PM_PIT_VIPER ; if (genbuf) Strcpy(genbuf, "snake"); break; case PM_WERESPIDER: case PM_HUMAN_WERESPIDER: typ = rn2(5) ? PM_CAVE_SPIDER : PM_RECLUSE_SPIDER ; if (genbuf) Strcpy(genbuf, "spider"); break; default: continue; } mtmp = makemon(&mons[typ], u.ux, u.uy, NO_MM_FLAGS); if (mtmp) { total++; if (canseemon(mtmp)) *visible += 1; } if (yours && mtmp) (void) tamedog(mtmp, (struct obj *) 0); } return total; } void you_were() { char qbuf[QBUFSZ]; if (Unchanging || (u.umonnum == u.ulycn)) return; if (Polymorph_control) { /* `+4' => skip "were" prefix to get name of beast */ Sprintf(qbuf, "Do you want to change into %s? ", an(mons[u.ulycn].mname+4)); if(yn(qbuf) == 'n') return; } (void) polymon(u.ulycn); } void you_unwere(purify) boolean purify; { boolean in_wereform = (u.umonnum == u.ulycn); if (purify) { if (Race_if(PM_HUMAN_WEREWOLF)) { /* An attempt to purify you has been made! */ if (in_wereform && Unchanging) { killer_format = NO_KILLER_PREFIX; killer = "purified while stuck in creature form"; pline_The("purification was deadly..."); done(DIED); } else { You_feel("very bad!"); if (in_wereform) rehumanize(); (void) adjattrib(A_STR, -rn1(3,3), 2); (void) adjattrib(A_CON, -rn1(3,3), 1); losehp(u.uhp - (u.uhp > 10 ? rnd(5) : 1), "purification", KILLED_BY); } return; } You_feel("purified."); u.ulycn = NON_PM; /* cure lycanthropy */ upermonst.mflags2 &= ~M2_WERE; } if (!Unchanging && in_wereform && (!Polymorph_control || yn("Remain in beast form?") == 'n')) rehumanize(); } #endif /* OVLB */ /*were.c*/ slashem-0.0.7E7F3/src/display.c0000664000076400007640000020374010545462317014262 0ustar aliali/* SCCS Id: @(#)display.c 3.4 2003/02/19 */ /* Copyright (c) Dean Luick, with acknowledgements to Kevin Darcy */ /* and Dave Cohrs, 1990. */ /* NetHack may be freely redistributed. See license for details. */ /* * THE NEW DISPLAY CODE * * The old display code has been broken up into three parts: vision, display, * and drawing. Vision decides what locations can and cannot be physically * seen by the hero. Display decides _what_ is displayed at a given location. * Drawing decides _how_ to draw a monster, fountain, sword, etc. * * The display system uses information from the vision system to decide * what to draw at a given location. The routines for the vision system * can be found in vision.c and vision.h. The routines for display can * be found in this file (display.c) and display.h. The drawing routines * are part of the window port. See doc/window.doc for the drawing * interface. * * The display system deals with an abstraction called a glyph. Anything * that could possibly be displayed has a unique glyph identifier. * * What is seen on the screen is a combination of what the hero remembers * and what the hero currently sees. Objects and dungeon features (walls * doors, etc) are remembered when out of sight. Monsters and temporary * effects are not remembered. Each location on the level has an * associated glyph. This is the hero's _memory_ of what he or she has * seen there before. * * Display rules: * * If the location is in sight, display in order: * visible (or sensed) monsters * visible objects * known traps * background * * If the location is out of sight, display in order: * sensed monsters (telepathy) * memory * * * * Here is a list of the major routines in this file to be used externally: * * newsym * * Possibly update the screen location (x,y). This is the workhorse routine. * It is always correct --- where correct means following the in-sight/out- * of-sight rules. **Most of the code should use this routine.** This * routine updates the map and displays monsters. * * * map_background * map_object * map_trap * map_invisible * unmap_object * * If you absolutely must override the in-sight/out-of-sight rules, there * are two possibilities. First, you can mess with vision to force the * location in sight then use newsym(), or you can use the map_* routines. * The first has not been tried [no need] and the second is used in the * detect routines --- detect object, magic mapping, etc. The map_* * routines *change* what the hero remembers. All changes made by these * routines will be sticky --- they will survive screen redraws. Do *not* * use these for things that only temporarily change the screen. These * routines are also used directly by newsym(). unmap_object is used to * clear a remembered object when/if detection reveals it isn't there. * * * show_glyph * * This is direct (no processing in between) buffered access to the screen. * Temporary screen effects are run through this and its companion, * flush_screen(). There is yet a lower level routine, print_glyph(), * but this is unbuffered and graphic dependent (i.e. it must be surrounded * by graphic set-up and tear-down routines). Do not use print_glyph(). * * * see_monsters * see_objects * see_traps * * These are only used when something affects all of the monsters or * objects or traps. For objects and traps, the only thing is hallucination. * For monsters, there are hallucination and changing from/to blindness, etc. * * * tmp_at * * This is a useful interface for displaying temporary items on the screen. * Its interface is different than previously, so look at it carefully. * * * * Parts of the rm structure that are used: * * typ - What is really there. * glyph - What the hero remembers. This will never be a monster. * Monsters "float" above this. * lit - True if the position is lit. An optimization for * lit/unlit rooms. * waslit - True if the position was *remembered* as lit. * seenv - A vector of bits representing the directions from which the * hero has seen this position. The vector's primary use is * determining how walls are seen. E.g. a wall sometimes looks * like stone on one side, but is seen as a wall from the other. * Other uses are for unmapping detected objects and felt * locations, where we need to know if the hero has ever * seen the location. * flags - Additional information for the typ field. Different for * each typ. * horizontal - Indicates whether the wall or door is horizontal or * vertical. */ #include "hack.h" #include "region.h" STATIC_DCL void FDECL(display_monster,(XCHAR_P,XCHAR_P,struct monst *,int,XCHAR_P)); STATIC_DCL int FDECL(swallow_to_glyph, (int, int)); STATIC_DCL void FDECL(display_warning,(struct monst *)); STATIC_DCL int FDECL(check_pos, (int, int, int)); #ifdef WA_VERBOSE STATIC_DCL boolean FDECL(more_than_one, (int, int, int, int, int)); #endif STATIC_DCL int FDECL(set_twall, (int,int, int,int, int,int, int,int)); STATIC_DCL int FDECL(set_wall, (int, int, int)); STATIC_DCL int FDECL(set_corn, (int,int, int,int, int,int, int,int)); STATIC_DCL int FDECL(set_crosswall, (int, int)); STATIC_DCL void FDECL(set_seenv, (struct rm *, int, int, int, int)); STATIC_DCL void FDECL(t_warn, (struct rm *)); STATIC_DCL int FDECL(wall_angle, (struct rm *)); STATIC_DCL int FDECL(back_to_cmap, (XCHAR_P, XCHAR_P)); STATIC_VAR boolean transp; /* cached transparency flag for current tileset */ #ifdef INVISIBLE_OBJECTS /* * vobj_at() * * Returns a pointer to an object if the hero can see an object at the * given location. This takes care of invisible objects. NOTE, this * assumes that the hero is not blind and on top of the object pile. * It does NOT take into account that the location is out of sight, or, * say, one can see blessed, etc. */ struct obj * vobj_at(x,y) xchar x,y; { register struct obj *obj = level.objects[x][y]; while (obj) { if (!obj->oinvis || See_invisible) return obj; obj = obj->nexthere; } return ((struct obj *) 0); } #endif /* else vobj_at() is defined in display.h */ /* * magic_map_background() * * This function is similar to map_background (see below) except we pay * attention to and correct unexplored, lit ROOM and CORR spots. */ void magic_map_background(x, y, show) xchar x,y; int show; { int cmap = back_to_cmap(x,y); /* assumes hero can see x,y */ struct rm *lev = &levl[x][y]; /* * Correct for out of sight lit corridors and rooms that the hero * doesn't remember as lit. */ if (!cansee(x,y) && !lev->waslit) { /* Floor spaces are dark if unlit. Corridors are dark if unlit. */ if (lev->typ == ROOM && cmap == S_room) cmap = S_stone; else if (lev->typ == CORR && cmap == S_litcorr) cmap = S_corr; } if (level.flags.hero_memory) #ifdef DISPLAY_LAYERS lev->mem_bg = cmap; #else lev->glyph = cmap_to_glyph(cmap); #endif if (show || transp) show_glyph(x,y, cmap_to_glyph(cmap)); } /* * The routines map_background(), map_object(), and map_trap() could just * as easily be: * * map_glyph(x,y,glyph,show) * * Which is called with the xx_to_glyph() in the call. Then I can get * rid of 3 routines that don't do very much anyway. And then stop * having to create fake objects and traps. However, I am reluctant to * make this change. */ /* FIXME: some of these use xchars for x and y, and some use ints. Make * this consistent. */ /* * map_background() * * Make the real background part of our map. This routine assumes that * the hero can physically see the location. Update the screen if directed. */ void map_background(x, y, show) register xchar x,y; register int show; { register int cmap = back_to_cmap(x,y); if (level.flags.hero_memory) #ifdef DISPLAY_LAYERS levl[x][y].mem_bg = cmap; #else levl[x][y].glyph = cmap_to_glyph(cmap); #endif if (show || transp) show_glyph(x,y, cmap_to_glyph(cmap)); } /* * map_trap() * * Map the trap and print it out if directed. This routine assumes that the * hero can physically see the location. */ void map_trap(trap, show) register struct trap *trap; register int show; { register int x = trap->tx, y = trap->ty; register int cmap = trap_to_cmap(trap); if (level.flags.hero_memory) #ifdef DISPLAY_LAYERS levl[x][y].mem_trap = 1 + cmap - MAXDCHARS; #else levl[x][y].glyph = cmap_to_glyph(cmap); #endif if (show || transp) show_glyph(x, y, cmap_to_glyph(cmap)); } /* * map_object() * * Map the given object. This routine assumes that the hero can physically * see the location of the object. Update the screen if directed. */ void map_object(obj, show) register struct obj *obj; register int show; { register int x = obj->ox, y = obj->oy; register int glyph = obj_to_glyph(obj); if (level.flags.hero_memory) #ifdef DISPLAY_LAYERS if ((levl[x][y].mem_corpse = glyph_is_body(glyph))) levl[x][y].mem_obj = 1 + glyph_to_body(glyph); else levl[x][y].mem_obj = 1 + glyph_to_obj(glyph); #else levl[x][y].glyph = glyph; #endif if (show) show_glyph(x, y, glyph); } /* * map_invisible() * * Make the hero remember that a square contains an invisible monster. * This is a special case in that the square will continue to be displayed * this way even when the hero is close enough to see it. To get rid of * this and display the square's actual contents, use unmap_object() followed * by newsym() if necessary. */ void map_invisible(x, y) register xchar x, y; { if (x != u.ux || y != u.uy) { /* don't display I at hero's location */ if (level.flags.hero_memory) #ifdef DISPLAY_LAYERS levl[x][y].mem_invis = 1; #else levl[x][y].glyph = GLYPH_INVISIBLE; #endif show_glyph(x, y, GLYPH_INVISIBLE); } } /* * unmap_object() * * Remove something from the map when the hero realizes it's not there any * more. Replace it with background or known trap, but not with any other * If this is used for detection, a full screen update is imminent anyway; * if this is used to get rid of an invisible monster notation, we might have * to call newsym(). */ void unmap_object(x, y) register int x, y; { #ifndef DISPLAY_LAYERS register struct trap *trap; #endif if (!level.flags.hero_memory) return; #ifdef DISPLAY_LAYERS levl[x][y].mem_invis = levl[x][y].mem_corpse = levl[x][y].mem_obj = 0; #else if ((trap = t_at(x,y)) != 0 && trap->tseen && !covers_traps(x,y)) map_trap(trap, 0); else if (levl[x][y].seenv) { struct rm *lev = &levl[x][y]; map_background(x, y, 0); /* turn remembered dark room squares dark */ if (!lev->waslit && lev->glyph == cmap_to_glyph(S_room) && lev->typ == ROOM) lev->glyph = cmap_to_glyph(S_stone); } else levl[x][y].glyph = cmap_to_glyph(S_stone); /* default val */ #endif } #define DETECTED 2 #define PHYSICALLY_SEEN 1 #define is_worm_tail(mon) ((mon) && ((x != (mon)->mx) || (y != (mon)->my))) /* * map_location() * * Make whatever at this location show up. This is only for non-living * things. This will not handle feeling invisible objects correctly. * * Internal to display.c, this is a #define for speed. */ #ifdef DISPLAY_LAYERS #define _map_location(x,y,show) \ { \ register struct obj *obj; \ register struct trap *trap; \ \ if (level.flags.hero_memory) { \ if ((obj = vobj_at(x, y)) && !covers_objects(x, y)) \ map_object(obj, FALSE); \ else \ levl[x][y].mem_corpse = levl[x][y].mem_obj = 0; \ if ((trap = t_at(x, y)) && trap->tseen && !covers_traps(x, y)) \ map_trap(trap, FALSE); \ else \ levl[x][y].mem_trap = 0; \ map_background(x, y, FALSE); \ if (show) show_glyph(x, y, memory_glyph(x, y)); \ } else if ((obj = vobj_at(x,y)) && !covers_objects(x,y)) \ map_object(obj,show); \ else if ((trap = t_at(x,y)) && trap->tseen && !covers_traps(x,y)) \ map_trap(trap,show); \ else \ map_background(x,y,show); \ } #else /* DISPLAY_LAYERS */ #define _map_location(x,y,show) \ { \ register struct obj *obj; \ register struct trap *trap; \ \ if ((obj = vobj_at(x,y)) && !covers_objects(x,y)) \ map_object(obj,show); \ else if ((trap = t_at(x,y)) && trap->tseen && !covers_traps(x,y)) \ map_trap(trap,show); \ else \ map_background(x,y,show); \ } #endif /* DISPLAY_LAYERS */ void map_location(x,y,show) int x, y, show; { _map_location(x,y,show); } int memory_glyph(x, y) int x, y; { #ifdef DISPLAY_LAYERS if (levl[x][y].mem_invis) return GLYPH_INVISIBLE; else if (levl[x][y].mem_obj) if (levl[x][y].mem_corpse) return body_to_glyph(levl[x][y].mem_obj - 1); else return objnum_to_glyph(levl[x][y].mem_obj - 1); else if (levl[x][y].mem_trap) return cmap_to_glyph(levl[x][y].mem_trap - 1 + MAXDCHARS); else return cmap_to_glyph(levl[x][y].mem_bg); #else return levl[x][y].glyph; #endif } void clear_memory_glyph(x, y, to) int x, y, to; { #ifdef DISPLAY_LAYERS levl[x][y].mem_bg = to; levl[x][y].mem_trap = 0; levl[x][y].mem_obj = 0; levl[x][y].mem_corpse = 0; levl[x][y].mem_invis = 0; #else levl[x][y].glyph = cmap_to_glyph(to); #endif } /* * display_monster() * * Note that this is *not* a map_XXXX() function! Monsters sort of float * above everything. * * Yuck. Display body parts by recognizing that the display position is * not the same as the monster position. Currently the only body part is * a worm tail. * */ 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); register int sensed = mon_mimic && (Protection_from_shape_changers || sensemon(mon)); /* * We must do the mimic check first. If the mimic is mimicing something, * and the location is in sight, we have to change the hero's memory * so that when the position is out of sight, the hero remembers what * the mimic was mimicing. */ if (mon_mimic && (sightflags == PHYSICALLY_SEEN)) { switch (mon->m_ap_type) { default: impossible("display_monster: bad m_ap_type value [ = %d ]", (int) mon->m_ap_type); case M_AP_NOTHING: show_glyph(x, y, mon_to_glyph(mon)); break; case M_AP_FURNITURE: { /* * This is a poor man's version of map_background(). I can't * use map_background() because we are overriding what is in * the 'typ' field. Maybe have map_background()'s parameters * be (x,y,glyph) instead of just (x,y). * * mappearance is currently set to an S_ index value in * makemon.c. */ register int glyph = cmap_to_glyph(mon->mappearance); #ifdef DISPLAY_LAYERS levl[x][y].mem_bg = mon->mappearance; #else levl[x][y].glyph = glyph; #endif if (!sensed) show_glyph(x,y, glyph); break; } case M_AP_OBJECT: { struct obj obj; /* Make a fake object to send */ /* to map_object(). */ obj.ox = x; obj.oy = y; obj.otyp = mon->mappearance; obj.corpsenm = PM_TENGU; /* if mimicing a corpse */ map_object(&obj,!sensed); break; } case M_AP_MONSTER: show_glyph(x,y, monnum_to_glyph(what_mon((int)mon->mappearance))); break; } } /* If the mimic is unsucessfully mimicing something, display the monster */ 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 num = detected_mon_to_glyph(mon); } else if (mon->mtame && !Hallucination) { if (worm_tail) num = petnum_to_glyph(PM_LONG_WORM_TAIL); else num = pet_to_glyph(mon); } else { if (worm_tail) num = monnum_to_glyph(what_mon(PM_LONG_WORM_TAIL)); else num = mon_to_glyph(mon); } show_glyph(x,y,num); } } /* * display_warning() * * This is also *not* a map_XXXX() function! Monster warnings float * above everything just like monsters do, but only if the monster * is not showing. * * Do not call for worm tails. */ STATIC_OVL void display_warning(mon) register struct monst *mon; { int x = mon->mx, y = mon->my; int wl = (int) (mon->m_lev / 4); int glyph; if (mon_warning(mon)) { if (wl > WARNCOUNT - 1) wl = WARNCOUNT - 1; /* 3.4.1: this really ought to be rn2(WARNCOUNT), but value "0" isn't handled correctly by the what_is routine so avoid it */ if (Hallucination) wl = rn1(WARNCOUNT-1,1); glyph = warning_to_glyph(wl); } else if (MATCH_WARN_OF_MON(mon)) { glyph = mon_to_glyph(mon); } else { impossible("display_warning did not match warning type?"); return; } show_glyph(x, y, glyph); } /* * feel_location() * * Feel the given location. This assumes that the hero is blind and that * the given position is either the hero's or one of the eight squares * adjacent to the hero (except for a boulder push). */ void feel_location(x, y) xchar x, y; { struct rm *lev = &(levl[x][y]); struct obj *boulder; register struct monst *mon; /* If the hero's memory of an invisible monster is accurate, we want to keep * him from detecting the same monster over and over again on each turn. * We must return (so we don't erase the monster). (We must also, in the * search function, be sure to skip over previously detected 'I's.) */ if (memory_is_invisible(x,y) && m_at(x,y)) return; /* The hero can't feel non pool locations while under water. */ if (Underwater && !Is_waterlevel(&u.uz) && ! is_pool(x,y)) return; /* Set the seen vector as if the hero had seen it. It doesn't matter */ /* if the hero is levitating or not. */ set_seenv(lev, u.ux, u.uy, x, y); if (Levitation && !Is_airlevel(&u.uz) && !Is_waterlevel(&u.uz)) { /* * Levitation Rules. It is assumed that the hero can feel the state * of the walls around herself and can tell if she is in a corridor, * room, or doorway. Boulders are felt because they are large enough. * Anything else is unknown because the hero can't reach the ground. * This makes things difficult. * * Check (and display) in order: * * + Stone, walls, and closed doors. * + Boulders. [see a boulder before a doorway] * + Doors. * + Room/water positions * + Everything else (hallways!) */ if (IS_ROCK(lev->typ) || (IS_DOOR(lev->typ) && (lev->doormask & (D_LOCKED | D_CLOSED)))) { map_background(x, y, 1); } else if ((boulder = sobj_at(BOULDER,x,y)) != 0) { map_object(boulder, 1); } else if (IS_DOOR(lev->typ)) { map_background(x, y, 1); } else if (IS_ROOM(lev->typ) || IS_POOL(lev->typ)) { /* * An open room or water location. Normally we wouldn't touch * this, but we have to get rid of remembered boulder symbols. * This will only occur in rare occations when the hero goes * blind and doesn't find a boulder where expected (something * came along and picked it up). We know that there is not a * boulder at this location. Show fountains, pools, etc. * underneath if already seen. Otherwise, show the appropriate * floor symbol. * * Similarly, if the hero digs a hole in a wall or feels a location * that used to contain an unseen monster. In these cases, * there's no reason to assume anything was underneath, so * just show the appropriate floor symbol. If something was * embedded in the wall, the glyph will probably already * reflect that. Don't change the symbol in this case. * * This isn't quite correct. If the boulder was on top of some * other objects they should be seen once the boulder is removed. * However, we have no way of knowing that what is there now * was there then. So we let the hero have a lapse of memory. * We could also just display what is currently on the top of the * object stack (if anything). */ if (remembered_object(x, y) == BOULDER) { if (lev->typ != ROOM && lev->seenv) { map_background(x, y, 1); } else { #ifdef DISPLAY_LAYERS lev->mem_bg = lev->waslit ? S_room : S_stone; #else lev->glyph = lev->waslit ? cmap_to_glyph(S_room) : cmap_to_glyph(S_stone); #endif show_glyph(x, y, memory_glyph(x, y)); } #ifdef DISPLAY_LAYERS } else if ((lev->mem_bg >= S_stone && lev->mem_bg < S_room) || memory_is_invisible(x, y)) { lev->mem_bg = lev->waslit ? S_room : S_stone; #else } else if ((lev->glyph >= cmap_to_glyph(S_stone) && lev->glyph < cmap_to_glyph(S_room)) || glyph_is_invisible(levl[x][y].glyph)) { lev->glyph = lev->waslit ? cmap_to_glyph(S_room) : cmap_to_glyph(S_stone); #endif show_glyph(x, y, memory_glyph(x, y)); } } else { /* We feel it (I think hallways are the only things left). */ map_background(x, y, 1); /* Corridors are never felt as lit (unless remembered that way) */ /* (lit_corridor only). */ #ifdef DISPLAY_LAYERS if (lev->typ == CORR && lev->mem_bg == S_litcorr && !lev->waslit) show_glyph(x, y, cmap_to_glyph(lev->mem_bg = S_corr)); #else if (lev->typ == CORR && lev->glyph == cmap_to_glyph(S_litcorr) && !lev->waslit) show_glyph(x, y, lev->glyph = cmap_to_glyph(S_corr)); #endif } } else { _map_location(x, y, 1); if (Punished) { /* * A ball or chain is only felt if it is first on the object * location list. Otherwise, we need to clear the felt bit --- * something has been dropped on the ball/chain. If the bit is * not cleared, then when the ball/chain is moved it will drop * the wrong glyph. */ if (uchain->ox == x && uchain->oy == y) { if (level.objects[x][y] == uchain) u.bc_felt |= BC_CHAIN; else u.bc_felt &= ~BC_CHAIN; /* do not feel the chain */ } if (!carried(uball) && uball->ox == x && uball->oy == y) { if (level.objects[x][y] == uball) u.bc_felt |= BC_BALL; else u.bc_felt &= ~BC_BALL; /* do not feel the ball */ } } /* Floor spaces are dark if unlit. Corridors are dark if unlit. */ #ifdef DISPLAY_LAYERS if (lev->typ == ROOM && lev->mem_bg == S_room && !lev->waslit) { lev->mem_bg = S_stone; show_glyph(x,y, memory_glyph(x, y)); } else if (lev->typ == CORR && lev->mem_bg == S_litcorr && !lev->waslit) { lev->mem_bg = S_corr; show_glyph(x,y, memory_glyph(x, y)); } #else if (lev->typ == ROOM && lev->glyph == cmap_to_glyph(S_room) && !lev->waslit) show_glyph(x,y, lev->glyph = cmap_to_glyph(S_stone)); else if (lev->typ == CORR && lev->glyph == cmap_to_glyph(S_litcorr) && !lev->waslit) show_glyph(x,y, lev->glyph = cmap_to_glyph(S_corr)); #endif } /* 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)); } /* * newsym() * * Possibly put a new glyph at the given location. */ void newsym(x,y) register int x,y; { register struct monst *mon; register struct rm *lev = &(levl[x][y]); register int see_it; register xchar worm_tail; if (in_mklev) return; /* only permit updating the hero when swallowed */ if (u.uswallow) { if (x == u.ux && y == u.uy) display_self(); return; } if (Underwater && !Is_waterlevel(&u.uz)) { /* don't do anything unless (x,y) is an adjacent underwater position */ int dx, dy; if (!is_pool(x,y)) return; dx = x - u.ux; if (dx < 0) dx = -dx; dy = y - u.uy; if (dy < 0) dy = -dy; if (dx > 1 || dy > 1) return; } /* Can physically see the location. */ if (cansee(x,y)) { NhRegion* reg = visible_region_at(x,y); /* * Don't use templit here: E.g. * * lev->waslit = !!(lev->lit || templit(x,y)); * * Otherwise we have the "light pool" problem, where non-permanently * lit areas just out of sight stay remembered as lit. They should * re-darken. * * Perhaps ALL areas should revert to their "unlit" look when * out of sight. */ lev->waslit = (lev->lit!=0); /* remember lit condition */ if (reg != NULL && ACCESSIBLE(lev->typ)) { show_region(reg,x,y); return; } if (x == u.ux && y == u.uy) { if (senseself()) { _map_location(x,y,0); /* map *under* self */ display_self(); } else /* we can see what is there */ _map_location(x,y,1); } 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 (memory_is_invisible(x,y)) map_invisible(x, y); else _map_location(x,y,1); /* map the location */ } } /* Can't see the location. */ else { if (x == u.ux && y == u.uy) { feel_location(u.ux, u.uy); /* forces an update */ if (senseself()) 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); } /* * If the location is remembered as being both dark (waslit is false) * and lit (glyph is a lit room or lit corridor) then it was either: * * (1) A dark location that the hero could see through night * vision. * * (2) Darkened while out of the hero's sight. This can happen * when cursed scroll of light is read. * * In either case, we have to manually correct the hero's memory to * match waslit. Deciding when to change waslit is non-trivial. * * Note: If flags.lit_corridor is set, then corridors act like room * squares. That is, they light up if in night vision range. * If flags.lit_corridor is not set, then corridors will * remain dark unless lit by a light spell and may darken * again, as discussed above. * * These checks and changes must be here and not in back_to_glyph(). * They are dependent on the position being out of sight. */ else if (!lev->waslit) { #ifdef DISPLAY_LAYERS if (lev->mem_bg == S_litcorr && lev->typ == CORR) { lev->mem_bg = S_corr; show_glyph(x, y, memory_glyph(x, y)); } else if (lev->mem_bg == S_room && lev->typ == ROOM) { lev->mem_bg = S_stone; show_glyph(x, y, memory_glyph(x, y)); } #else /* DISPLAY_LAYERS */ if (lev->glyph == cmap_to_glyph(S_litcorr) && lev->typ == CORR) show_glyph(x, y, lev->glyph = cmap_to_glyph(S_corr)); else if (lev->glyph == cmap_to_glyph(S_room) && lev->typ == ROOM) show_glyph(x, y, lev->glyph = cmap_to_glyph(S_stone)); #endif /* DISPLAY_LAYERS */ else goto show_mem; } else { show_mem: show_glyph(x, y, memory_glyph(x, y)); } } } #undef is_worm_tail /* * shieldeff() * * Put magic shield pyrotechnics at the given location. This *could* be * pulled into a platform dependent routine for fancier graphics if desired. */ void shieldeff(x,y) xchar x,y; { register int i; if (!flags.sparkle) return; if (cansee(x,y)) { /* Don't see anything if can't see the location */ #ifdef ALLEG_FX if (iflags.usealleg) { newsym(x,y); if(alleg_shield(x,y)) return; } #endif for (i = 0; i < SHIELD_COUNT; i++) { show_glyph(x, y, cmap_to_glyph(shield_static[i])); flush_screen(1); /* make sure the glyph shows up */ delay_output(); } newsym(x,y); /* restore the old information */ } } /* * tmp_at() * * Temporarily place glyphs on the screen. Do not call delay_output(). It * is up to the caller to decide if it wants to wait [presently, everyone * but explode() wants to delay]. * * Call: * (DISP_BEAM, glyph) open, initialize glyph * (DISP_BEAM_ALWAYS, glyph) open, initialize glyph * (DISP_FLASH, glyph) open, initialize glyph * (DISP_ALWAYS, glyph) open, initialize glyph * (DISP_CHANGE, glyph) change glyph * (DISP_END, 0) close & clean up (second argument doesn't * matter) * (DISP_FREEMEM, 0) only used to prevent memory leak during * exit) * (x, y) display the glyph at the location * * DISP_BEAM - Display the given glyph at each location, but do not erase * any until the close call. * WAC added beam_always for lightning strikes * DISP_BEAM_ALWAYS- Like DISP_BEAM, but vision is not taken into account. * DISP_FLASH - Display the given glyph at each location, but erase the * previous location's glyph. * DISP_ALWAYS- Like DISP_FLASH, but vision is not taken into account. */ static struct tmp_glyph { coord saved[COLNO]; /* previously updated positions */ int sidx; /* index of next unused slot in saved[] */ int style; /* either DISP_BEAM or DISP_FLASH or DISP_ALWAYS */ int glyph; /* glyph to use when printing */ struct tmp_glyph *cont; /* Used if saved[] is full */ struct tmp_glyph *prev; } tgfirst; static struct tmp_glyph *tglyph = (struct tmp_glyph *)0; void tmp_at(x, y) int x, y; { struct tmp_glyph *tmp, *cont; switch (x) { case DISP_BEAM: case DISP_BEAM_ALWAYS: case DISP_FLASH: case DISP_ALWAYS: if (!tglyph) tmp = &tgfirst; else /* nested effect; we need dynamic memory */ tmp = (struct tmp_glyph *)alloc(sizeof (struct tmp_glyph)); tmp->prev = tglyph; tglyph = tmp; tglyph->sidx = 0; tglyph->style = x; tglyph->glyph = y; tglyph->cont = (struct tmp_glyph *)0; flush_screen(0); /* flush buffered glyphs */ return; case DISP_FREEMEM: /* in case game ends with tmp_at() in progress */ while (tglyph) { cont = tglyph->cont; while (cont) { tmp = cont->cont; if (cont != &tgfirst) free((genericptr_t)cont); cont = tmp; } tmp = tglyph->prev; if (tglyph != &tgfirst) free((genericptr_t)tglyph); tglyph = tmp; } return; default: break; } if (!tglyph) panic("tmp_at: tglyph not initialized"); switch (x) { case DISP_CHANGE: tglyph->glyph = y; break; case DISP_END: if (tglyph->style == DISP_BEAM || tglyph->style == DISP_BEAM_ALWAYS) { register int i; /* Erase (reset) from source to end */ for (i = 0; i < tglyph->sidx; i++) newsym(tglyph->saved[i].x, tglyph->saved[i].y); cont = tglyph->cont; while (cont) { for (i = 0; i < cont->sidx; i++) newsym(cont->saved[i].x, cont->saved[i].y); tmp = cont->cont; if (cont != &tgfirst) free((genericptr_t)cont); cont = tmp; } /* tglyph->cont = (struct tmp_glyph *)0; */ } else { /* DISP_FLASH or DISP_ALWAYS */ if (tglyph->sidx) /* been called at least once */ newsym(tglyph->saved[0].x, tglyph->saved[0].y); } /* tglyph->sidx = 0; -- about to be freed, so not necessary */ tmp = tglyph->prev; if (tglyph != &tgfirst) free((genericptr_t)tglyph); tglyph = tmp; break; default: /* do it */ if (tglyph->style == DISP_BEAM || tglyph->style == DISP_BEAM_ALWAYS) { if (!cansee(x,y) && tglyph->style == DISP_BEAM) break; /* save pos for later erasing */ if (tglyph->sidx >= SIZE(tglyph->saved)) { tmp = (struct tmp_glyph *)alloc(sizeof (struct tmp_glyph)); *tmp = *tglyph; tglyph->prev = (struct tmp_glyph *)0; tmp->cont = tglyph; tglyph = tmp; tglyph->sidx = 0; } tglyph->saved[tglyph->sidx].x = x; tglyph->saved[tglyph->sidx].y = y; tglyph->sidx += 1; } else { /* DISP_FLASH/ALWAYS */ if (tglyph->sidx) { /* not first call, so reset previous pos */ newsym(tglyph->saved[0].x, tglyph->saved[0].y); tglyph->sidx = 0; /* display is presently up to date */ } if (!cansee(x,y) && tglyph->style != DISP_ALWAYS) break; tglyph->saved[0].x = x; tglyph->saved[0].y = y; tglyph->sidx = 1; } show_glyph(x, y, tglyph->glyph); /* show it */ flush_screen(0); /* make sure it shows up */ break; } /* end case */ } #ifdef DISPLAY_LAYERS int glyph_is_floating(glyph) int glyph; { return glyph_is_monster(glyph) || glyph_is_explosion(glyph) || glyph_is_zap_beam(glyph) || glyph_is_swallow(glyph) || glyph_is_warning(glyph) || tglyph && glyph == tglyph->glyph; } #endif /* * swallowed() * * The hero is swallowed. Show a special graphics sequence for this. This * bypasses all of the display routines and messes with buffered screen * directly. This method works because both vision and display check for * being swallowed. */ void swallowed(first) int first; { static xchar lastx, lasty; /* last swallowed position */ int swallower, left_ok, rght_ok; if (first) cls(); else { register int x, y; /* Clear old location */ for (y = lasty-1; y <= lasty+1; y++) for (x = lastx-1; x <= lastx+1; x++) if (isok(x,y)) show_glyph(x,y,cmap_to_glyph(S_stone)); } #ifdef ALLEG_FX if(!iflags.usealleg || !alleg_swallowed(u.ux,u.uy)) { #endif swallower = monsndx(u.ustuck->data); /* assume isok(u.ux,u.uy) */ left_ok = isok(u.ux-1,u.uy); rght_ok = isok(u.ux+1,u.uy); /* * Display the hero surrounded by the monster's stomach. */ if(isok(u.ux, u.uy-1)) { if (left_ok) show_glyph(u.ux-1, u.uy-1, swallow_to_glyph(swallower, S_sw_tl)); show_glyph(u.ux , u.uy-1, swallow_to_glyph(swallower, S_sw_tc)); if (rght_ok) show_glyph(u.ux+1, u.uy-1, swallow_to_glyph(swallower, S_sw_tr)); } if (left_ok) show_glyph(u.ux-1, u.uy , swallow_to_glyph(swallower, S_sw_ml)); display_self(); if (rght_ok) show_glyph(u.ux+1, u.uy , swallow_to_glyph(swallower, S_sw_mr)); if(isok(u.ux, u.uy+1)) { if (left_ok) show_glyph(u.ux-1, u.uy+1, swallow_to_glyph(swallower, S_sw_bl)); show_glyph(u.ux , u.uy+1, swallow_to_glyph(swallower, S_sw_bc)); if (rght_ok) show_glyph(u.ux+1, u.uy+1, swallow_to_glyph(swallower, S_sw_br)); } #ifdef ALLEG_FX } #endif /* Update the swallowed position. */ lastx = u.ux; lasty = u.uy; } /* * under_water() * * Similar to swallowed() in operation. Shows hero when underwater * except when in water level. Special routines exist for that. */ void under_water(mode) int mode; { static xchar lastx, lasty; static boolean dela; register int x, y; /* swallowing has a higher precedence than under water */ if (Is_waterlevel(&u.uz) || u.uswallow) return; /* full update */ if (mode == 1 || dela) { cls(); dela = FALSE; } /* delayed full update */ else if (mode == 2) { dela = TRUE; return; } /* limited update */ else { for (y = lasty-1; y <= lasty+1; y++) for (x = lastx-1; x <= lastx+1; x++) if (isok(x,y)) show_glyph(x,y,cmap_to_glyph(S_stone)); } for (x = u.ux-1; x <= u.ux+1; x++) for (y = u.uy-1; y <= u.uy+1; y++) if (isok(x,y) && is_pool(x,y)) { if (Blind && !(x == u.ux && y == u.uy)) show_glyph(x,y,cmap_to_glyph(S_stone)); else newsym(x,y); } lastx = u.ux; lasty = u.uy; } /* * under_ground() * * Very restricted display. You can only see yourself. */ void under_ground(mode) int mode; { static boolean dela; /* swallowing has a higher precedence than under ground */ if (u.uswallow) return; /* full update */ if (mode == 1 || dela) { cls(); dela = FALSE; } /* delayed full update */ else if (mode == 2) { dela = TRUE; return; } /* limited update */ else newsym(u.ux,u.uy); } /* ========================================================================= */ /* * Loop through all of the monsters and update them. Called when: * + going blind & telepathic * + regaining sight & telepathic * + getting and losing infravision * + hallucinating * + doing a full screen redraw * + see invisible times out or a ring of see invisible is taken off * + when a potion of see invisible is quaffed or a ring of see * invisible is put on * + gaining telepathy when blind [givit() in eat.c, pleased() in pray.c] * + losing telepathy while blind [xkilled() in mon.c, attrcurse() in * sit.c] */ void see_monsters() { register struct monst *mon; if (defer_see_monsters) return; for (mon = fmon; mon; mon = mon->nmon) { if (DEADMONSTER(mon)) continue; newsym(mon->mx,mon->my); if (mon->wormno) see_wsegs(mon); } #ifdef STEED /* when mounted, hero's location gets caught by monster loop */ if (!u.usteed) #endif newsym(u.ux, u.uy); } /* * Block/unblock light depending on what a mimic is mimicing and if it's * invisible or not. Should be called only when the state of See_invisible * changes. */ void set_mimic_blocking() { register struct monst *mon; for (mon = fmon; mon; mon = mon->nmon) { if (DEADMONSTER(mon)) continue; if (mon->minvis && ((mon->m_ap_type == M_AP_FURNITURE && (mon->mappearance == S_vcdoor || mon->mappearance == S_hcdoor)) || (mon->m_ap_type == M_AP_OBJECT && mon->mappearance == BOULDER))) { if(See_invisible) block_point(mon->mx, mon->my); else unblock_point(mon->mx, mon->my); } } } /* * Loop through all of the object *locations* and update them. Called when * + hallucinating. */ void see_objects() { register struct obj *obj; for(obj = fobj; obj; obj = obj->nobj) if (vobj_at(obj->ox,obj->oy) == obj) newsym(obj->ox, obj->oy); } /* * Update hallucinated traps. */ void see_traps() { struct trap *trap; int glyph; for (trap = ftrap; trap; trap = trap->ntrap) { glyph = glyph_at(trap->tx, trap->ty); if (glyph_is_trap(glyph)) newsym(trap->tx, trap->ty); } } /* * Put the cursor on the hero. Flush all accumulated glyphs before doing it. */ void curs_on_u() { flush_screen(1); /* Flush waiting glyphs & put cursor on hero */ } int doredraw() { docrt(); return 0; } void docrt() { register int x,y; register struct rm *lev; int i, glyph; if (!u.ux) return; /* display isn't ready yet */ transp = FALSE; if (tileset[0]) for(i = 0; i < no_tilesets; ++i) if (!strcmpi(tileset, tilesets[i].name)) { transp = !!(tilesets[i].flags & TILESET_TRANSPARENT); break; } if (u.uswallow) { swallowed(1); return; } if (Underwater && !Is_waterlevel(&u.uz)) { under_water(1); return; } if (u.uburied) { under_ground(1); return; } /* shut down vision */ vision_recalc(2); /* * This routine assumes that cls() does the following: * + fills the physical screen with the symbol for rock * + clears the glyph buffer */ cls(); /* display memory */ for (x = 1; x < COLNO; x++) { lev = &levl[x][0]; for (y = 0; y < ROWNO; y++, lev++) if ((glyph = memory_glyph(x,y)) != cmap_to_glyph(S_stone)) show_glyph(x,y,glyph); } /* see what is to be seen */ vision_recalc(0); /* overlay with monsters */ see_monsters(); flags.botlx = 1; /* force a redraw of the bottom line */ } /* ========================================================================= */ /* Glyph Buffering (3rd screen) ============================================ */ typedef struct { xchar new; /* perhaps move this bit into the rm strucure. */ int glyph; } gbuf_entry; static gbuf_entry gbuf[ROWNO][COLNO]; static char gbuf_start[ROWNO]; static char gbuf_stop[ROWNO]; /* * Store the glyph in the 3rd screen for later flushing. */ void show_glyph(x,y,glyph) int x, y, glyph; { /* * Check for bad positions and glyphs. */ if (!isok(x, y)) { const char *text; int offset; /* column 0 is invalid, but it's often used as a flag, so ignore it */ if (x == 0) return; /* * This assumes an ordering of the offsets. See display.h for * the definition. */ if (glyph >= GLYPH_WARNING_OFF) { /* a warning */ text = "warning"; offset = glyph - GLYPH_WARNING_OFF; } else if (glyph >= GLYPH_SWALLOW_OFF) { /* swallow border */ 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 */ text = "object"; offset = glyph - GLYPH_OBJ_OFF; } else if (glyph >= GLYPH_RIDDEN_OFF) { /* ridden mon */ text = "ridden mon"; offset = glyph - GLYPH_RIDDEN_OFF; } else if (glyph >= GLYPH_BODY_OFF) { /* a corpse */ text = "corpse"; offset = glyph - GLYPH_BODY_OFF; } else if (glyph >= GLYPH_DETECT_OFF) { /* detected mon */ text = "detected mon"; offset = glyph - GLYPH_DETECT_OFF; } else if (glyph >= GLYPH_INVIS_OFF) { /* invisible mon */ text = "invisible mon"; offset = glyph - GLYPH_INVIS_OFF; } else if (glyph >= GLYPH_PET_OFF) { /* a pet */ text = "pet"; offset = glyph - GLYPH_PET_OFF; } else { /* a monster */ text = "monster"; offset = glyph; } impossible("show_glyph: bad pos %d %d with glyph %d [%s %d].", x, y, glyph, text, offset); return; } if (glyph >= MAX_GLYPH) { impossible("show_glyph: bad glyph %d [max %d] at (%d,%d).", glyph, MAX_GLYPH, x, y); return; } /* [ALI] In transparent mode it is not sufficient just to consider * the foreground glyph, we also need to consider the background. * Rather than extend the display module to do this, for the time * being we just turn off optimization and rely on the windowing port * to ignore redundant calls to print_glyph(). */ if (transp || gbuf[y][x].glyph != glyph) { gbuf[y][x].glyph = glyph; gbuf[y][x].new = 1; if (gbuf_start[y] > x) gbuf_start[y] = x; if (gbuf_stop[y] < x) gbuf_stop[y] = x; } } /* * Reset the changed glyph borders so that none of the 3rd screen has * changed. */ #define reset_glyph_bbox() \ { \ int i; \ \ for (i = 0; i < ROWNO; i++) { \ gbuf_start[i] = COLNO-1; \ gbuf_stop[i] = 0; \ } \ } static gbuf_entry nul_gbuf = { 0, cmap_to_glyph(S_stone) }; /* * Turn the 3rd screen into stone. */ void clear_glyph_buffer() { register int x, y; register gbuf_entry *gptr; for (y = 0; y < ROWNO; y++) { gptr = &gbuf[y][0]; for (x = COLNO; x; x--) { *gptr++ = nul_gbuf; } } reset_glyph_bbox(); } /* * Assumes that the indicated positions are filled with S_stone glyphs. */ void row_refresh(start,stop,y) int start,stop,y; { register int x; for (x = start; x <= stop; x++) if (gbuf[y][x].glyph != cmap_to_glyph(S_stone)) print_glyph(WIN_MAP,x,y,gbuf[y][x].glyph); } void cls() { display_nhwindow(WIN_MESSAGE, FALSE); /* flush messages */ flags.botlx = 1; /* force update of botl window */ clear_nhwindow(WIN_MAP); /* clear physical screen */ clear_glyph_buffer(); /* this is sort of an extra effort, but OK */ } /* * Synch the third screen with the display. */ void flush_screen(cursor_on_u) int cursor_on_u; { /* Prevent infinite loops on errors: * flush_screen->print_glyph->impossible->pline->flush_screen */ static boolean flushing = 0; static boolean delay_flushing = 0; register int x,y; if (cursor_on_u == -1) delay_flushing = !delay_flushing; if (delay_flushing) return; if (flushing) return; /* if already flushing then return */ flushing = 1; for (y = 0; y < ROWNO; y++) { register gbuf_entry *gptr = &gbuf[y][x = gbuf_start[y]]; for (; x <= gbuf_stop[y]; gptr++, x++) if (gptr->new) { print_glyph(WIN_MAP,x,y,gptr->glyph); gptr->new = 0; } } if (cursor_on_u) curs(WIN_MAP, u.ux,u.uy); /* move cursor to the hero */ display_nhwindow(WIN_MAP, FALSE); reset_glyph_bbox(); #ifdef ALLEG_FX if (iflags.usealleg) alleg_vid_refresh(); #endif flushing = 0; if(flags.botl || flags.botlx) bot(); } /* ========================================================================= */ /* * back_to_cmap() * * Use the information in the rm structure at the given position to create * a glyph of a background. * * I had to add a field in the rm structure (horizontal) so that we knew * if open doors and secret doors were horizontal or vertical. Previously, * the screen symbol had the horizontal/vertical information set at * level generation time. * * I used the 'ladder' field (really doormask) for deciding if stairwells * were up or down. I didn't want to check the upstairs and dnstairs * variables. */ STATIC_OVL int back_to_cmap(x,y) xchar x,y; { int idx; struct rm *ptr = &(levl[x][y]); switch (ptr->typ) { /* KMH -- support arboreal levels */ case SCORR: case STONE: idx = level.flags.arboreal ? S_tree : S_stone; break; case ROOM: idx = S_room; break; case CORR: idx = (ptr->waslit || flags.lit_corridor) ? S_litcorr : S_corr; break; case HWALL: case VWALL: case TLCORNER: case TRCORNER: case BLCORNER: case BRCORNER: case CROSSWALL: case TUWALL: case TDWALL: case TLWALL: case TRWALL: case SDOOR: idx = ptr->seenv ? wall_angle(ptr) : S_stone; break; case IRONBARS: idx = S_bars; break; case DOOR: if (ptr->doormask) { if (ptr->doormask & D_BROKEN) idx = S_ndoor; else if (ptr->doormask & D_ISOPEN) idx = (ptr->horizontal) ? S_hodoor : S_vodoor; else /* else is closed */ idx = (ptr->horizontal) ? S_hcdoor : S_vcdoor; } else idx = S_ndoor; break; case TREE: idx = S_tree; break; case POOL: case MOAT: idx = S_pool; break; case STAIRS: idx = (ptr->ladder & LA_DOWN) ? S_dnstair : S_upstair; break; case LADDER: idx = (ptr->ladder & LA_DOWN) ? S_dnladder : S_upladder; break; case FOUNTAIN: idx = S_fountain; break; case SINK: idx = S_sink; break; case TOILET: idx = S_toilet; break; case GRAVE: idx = S_grave; break; case ALTAR: idx = S_altar; break; case THRONE: idx = S_throne; break; case LAVAPOOL: idx = S_lava; break; case ICE: idx = S_ice; break; case AIR: idx = S_air; break; case CLOUD: idx = S_cloud; break; case WATER: idx = S_water; break; case DBWALL: idx = (ptr->horizontal) ? S_hcdbridge : S_vcdbridge; break; case DRAWBRIDGE_UP: switch(ptr->drawbridgemask & DB_UNDER) { case DB_MOAT: idx = S_pool; break; case DB_LAVA: idx = S_lava; break; case DB_ICE: idx = S_ice; break; case DB_FLOOR: idx = S_room; break; default: impossible("Strange db-under: %d", ptr->drawbridgemask & DB_UNDER); idx = S_room; /* something is better than nothing */ break; } break; case DRAWBRIDGE_DOWN: idx = (ptr->horizontal) ? S_hodbridge : S_vodbridge; break; default: impossible("back_to_glyph: unknown level type [ = %d ]",ptr->typ); idx = S_room; break; } return idx; } int back_to_glyph(x,y) xchar x,y; { return cmap_to_glyph(back_to_cmap(x,y)); } /* * swallow_to_glyph() * * Convert a monster number and a swallow location into the correct glyph. * If you don't want a patchwork monster while hallucinating, decide on * a random monster in swallowed() and don't use what_mon() here. */ STATIC_OVL int swallow_to_glyph(mnum, loc) int mnum; int loc; { if (loc < S_sw_tl || S_sw_br < loc) { impossible("swallow_to_glyph: bad swallow location"); loc = S_sw_br; } return ((int) (what_mon(mnum)<<3) | (loc - S_sw_tl)) + GLYPH_SWALLOW_OFF; } /* * zapdir_to_glyph() * * Change the given zap direction and beam type into a glyph. Each beam * type has four glyphs, one for each of the symbols below. The order of * the zap symbols [0-3] as defined in rm.h are: * * | S_vbeam ( 0, 1) or ( 0,-1) * - S_hbeam ( 1, 0) or (-1, 0) * \ S_lslant ( 1, 1) or (-1,-1) * / S_rslant (-1, 1) or ( 1,-1) */ int zapdir_to_glyph(dx, dy, beam_type) register int dx, dy; int beam_type; { if (beam_type >= NUM_ZAP) { impossible("zapdir_to_glyph: illegal beam type"); beam_type = 0; } dx = (dx == dy) ? 2 : (dx && dy) ? 3 : dx ? 1 : 0; return ((int) ((beam_type << 2) | dx)) + GLYPH_ZAP_OFF; } /* * Utility routine for dowhatis() used to find out the glyph displayed at * the location. This isn't necessarily the same as the glyph in the levl * structure, so we must check the "third screen". */ int glyph_at(x, y) xchar x,y; { if(x < 0 || y < 0 || x >= COLNO || y >= ROWNO) return cmap_to_glyph(S_room); /* XXX */ return gbuf[y][x].glyph; } /* ------------------------------------------------------------------------- */ /* Wall Angle -------------------------------------------------------------- */ /*#define WA_VERBOSE*/ /* give (x,y) locations for all "bad" spots */ #ifdef WA_VERBOSE static const char *FDECL(type_to_name, (int)); static void FDECL(error4, (int,int,int,int,int,int)); static int bad_count[MAX_TYPE]; /* count of positions flagged as bad */ static const char *type_names[MAX_TYPE] = { "STONE", "VWALL", "HWALL", "TLCORNER", "TRCORNER", "BLCORNER", "BRCORNER", "CROSSWALL", "TUWALL", "TDWALL", "TLWALL", "TRWALL", "DBWALL", "SDOOR", "SCORR", "POOL", "MOAT", "WATER", "DRAWBRIDGE_UP","LAVAPOOL", "DOOR", "CORR", "ROOM", "STAIRS", "LADDER", "FOUNTAIN", "THRONE", "SINK", "ALTAR", "ICE", "DRAWBRIDGE_DOWN","AIR", "CLOUD" }; static const char * type_to_name(type) int type; { return (type < 0 || type > MAX_TYPE) ? "unknown" : type_names[type]; } STATIC_OVL void error4(x, y, a, b, c, dd) int x, y, a, b, c, dd; { pline("set_wall_state: %s @ (%d,%d) %s%s%s%s", type_to_name(levl[x][y].typ), x, y, a ? "1":"", b ? "2":"", c ? "3":"", dd ? "4":""); bad_count[levl[x][y].typ]++; } #endif /* WA_VERBOSE */ /* * Return 'which' if position is implies an unfinshed exterior. Return * zero otherwise. Unfinished implies outer area is rock or a corridor. * * Things that are ambigious: lava */ STATIC_OVL int check_pos(x, y, which) int x, y, which; { int type; if (!isok(x,y)) return which; type = levl[x][y].typ; if (IS_ROCK(type) || type == CORR || type == SCORR) return which; return 0; } /* Return TRUE if more than one is non-zero. */ /*ARGSUSED*/ #ifdef WA_VERBOSE STATIC_OVL boolean more_than_one(x, y, a, b, c) int x, y, a, b, c; { #if defined(MAC_MPW) # pragma unused ( x,y ) #endif if ((a && (b|c)) || (b && (a|c)) || (c && (a|b))) { error4(x,y,a,b,c,0); return TRUE; } return FALSE; } #else #define more_than_one(x, y, a, b, c) (((a) && ((b)|(c))) || ((b) && ((a)|(c))) || ((c) && ((a)|(b)))) #endif /* Return the wall mode for a T wall. */ STATIC_OVL int set_twall(x0,y0, x1,y1, x2,y2, x3,y3) int x0,y0, x1,y1, x2,y2, x3,y3; { int wmode, is_1, is_2, is_3; is_1 = check_pos(x1, y1, WM_T_LONG); is_2 = check_pos(x2, y2, WM_T_BL); is_3 = check_pos(x3, y3, WM_T_BR); if (more_than_one(x0, y0, is_1, is_2, is_3)) { wmode = 0; } else { wmode = is_1 + is_2 + is_3; } return wmode; } /* Return wall mode for a horizontal or vertical wall. */ STATIC_OVL int set_wall(x, y, horiz) int x, y, horiz; { int wmode, is_1, is_2; if (horiz) { is_1 = check_pos(x,y-1, WM_W_TOP); is_2 = check_pos(x,y+1, WM_W_BOTTOM); } else { is_1 = check_pos(x-1,y, WM_W_LEFT); is_2 = check_pos(x+1,y, WM_W_RIGHT); } if (more_than_one(x, y, is_1, is_2, 0)) { wmode = 0; } else { wmode = is_1 + is_2; } return wmode; } /* * If an invisible monster has gone away, that will be discovered. If an * invisible monster has appeared, this will _not_ be discovered since * searching only finds one monster per turn so we must check that separately. * * Return a wall mode for a corner wall. (x4,y4) is the "inner" position. */ STATIC_OVL int set_corn(x1,y1, x2,y2, x3,y3, x4,y4) int x1, y1, x2, y2, x3, y3, x4, y4; { int wmode, is_1, is_2, is_3, is_4; is_1 = check_pos(x1, y1, 1); is_2 = check_pos(x2, y2, 1); is_3 = check_pos(x3, y3, 1); is_4 = check_pos(x4, y4, 1); /* inner location */ /* * All 4 should not be true. So if the inner location is rock, * use it. If all of the outer 3 are true, use outer. We currently * can't cover the case where only part of the outer is rock, so * we just say that all the walls are finished (if not overridden * by the inner section). */ if (is_4) { wmode = WM_C_INNER; } else if (is_1 && is_2 && is_3) wmode = WM_C_OUTER; else wmode = 0; /* finished walls on all sides */ return wmode; } /* Return mode for a crosswall. */ STATIC_OVL int set_crosswall(x, y) int x, y; { int wmode, is_1, is_2, is_3, is_4; is_1 = check_pos(x-1, y-1, 1); is_2 = check_pos(x+1, y-1, 1); is_3 = check_pos(x+1, y+1, 1); is_4 = check_pos(x-1, y+1, 1); wmode = is_1+is_2+is_3+is_4; if (wmode > 1) { if (is_1 && is_3 && (is_2+is_4 == 0)) { wmode = WM_X_TLBR; } else if (is_2 && is_4 && (is_1+is_3 == 0)) { wmode = WM_X_BLTR; } else { #ifdef WA_VERBOSE error4(x,y,is_1,is_2,is_3,is_4); #endif wmode = 0; } } else if (is_1) wmode = WM_X_TL; else if (is_2) wmode = WM_X_TR; else if (is_3) wmode = WM_X_BR; else if (is_4) wmode = WM_X_BL; return wmode; } /* Called from mklev. Scan the level and set the wall modes. */ void set_wall_state() { int x, y; int wmode; struct rm *lev; #ifdef WA_VERBOSE for (x = 0; x < MAX_TYPE; x++) bad_count[x] = 0; #endif for (x = 0; x < COLNO; x++) for (lev = &levl[x][0], y = 0; y < ROWNO; y++, lev++) { switch (lev->typ) { case SDOOR: wmode = set_wall(x, y, (int) lev->horizontal); break; case VWALL: wmode = set_wall(x, y, 0); break; case HWALL: wmode = set_wall(x, y, 1); break; case TDWALL: wmode = set_twall(x,y, x,y-1, x-1,y+1, x+1,y+1); break; case TUWALL: wmode = set_twall(x,y, x,y+1, x+1,y-1, x-1,y-1); break; case TLWALL: wmode = set_twall(x,y, x+1,y, x-1,y-1, x-1,y+1); break; case TRWALL: wmode = set_twall(x,y, x-1,y, x+1,y+1, x+1,y-1); break; case TLCORNER: wmode = set_corn(x-1,y-1, x,y-1, x-1,y, x+1,y+1); break; case TRCORNER: wmode = set_corn(x,y-1, x+1,y-1, x+1,y, x-1,y+1); break; case BLCORNER: wmode = set_corn(x,y+1, x-1,y+1, x-1,y, x+1,y-1); break; case BRCORNER: wmode = set_corn(x+1,y, x+1,y+1, x,y+1, x-1,y-1); break; case CROSSWALL: wmode = set_crosswall(x, y); break; default: wmode = -1; /* don't set wall info */ break; } if (wmode >= 0) lev->wall_info = (lev->wall_info & ~WM_MASK) | wmode; } #ifdef WA_VERBOSE /* check if any bad positions found */ for (x = y = 0; x < MAX_TYPE; x++) if (bad_count[x]) { if (y == 0) { y = 1; /* only print once */ pline("set_wall_type: wall mode problems with: "); } pline("%s %d;", type_names[x], bad_count[x]); } #endif /* WA_VERBOSE */ } /* ------------------------------------------------------------------------- */ /* This matrix is used here and in vision.c. */ unsigned char seenv_matrix[3][3] = { {SV2, SV1, SV0}, {SV3, SVALL, SV7}, {SV4, SV5, SV6} }; #define sign(z) ((z) < 0 ? -1 : ((z) > 0 ? 1 : 0)) /* Set the seen vector of lev as if seen from (x0,y0) to (x,y). */ STATIC_OVL void set_seenv(lev, x0, y0, x, y) struct rm *lev; int x0, y0, x, y; /* from, to */ { int dx = x-x0, dy = y0-y; lev->seenv |= seenv_matrix[sign(dy)+1][sign(dx)+1]; } /* ------------------------------------------------------------------------- */ /* T wall types, one for each row in wall_matrix[][]. */ #define T_d 0 #define T_l 1 #define T_u 2 #define T_r 3 /* * These are the column names of wall_matrix[][]. They are the "results" * of a tdwall pattern match. All T walls are rotated so they become * a tdwall. Then we do a single pattern match, but return the * correct result for the original wall by using different rows for * each of the wall types. */ #define T_stone 0 #define T_tlcorn 1 #define T_trcorn 2 #define T_hwall 3 #define T_tdwall 4 static const int wall_matrix[4][5] = { { S_stone, S_tlcorn, S_trcorn, S_hwall, S_tdwall }, /* tdwall */ { S_stone, S_trcorn, S_brcorn, S_vwall, S_tlwall }, /* tlwall */ { S_stone, S_brcorn, S_blcorn, S_hwall, S_tuwall }, /* tuwall */ { S_stone, S_blcorn, S_tlcorn, S_vwall, S_trwall }, /* trwall */ }; /* Cross wall types, one for each "solid" quarter. Rows of cross_matrix[][]. */ #define C_bl 0 #define C_tl 1 #define C_tr 2 #define C_br 3 /* * These are the column names for cross_matrix[][]. They express results * in C_br (bottom right) terms. All crosswalls with a single solid * quarter are rotated so the solid section is at the bottom right. * We pattern match on that, but return the correct result depending * on which row we'ere looking at. */ #define C_trcorn 0 #define C_brcorn 1 #define C_blcorn 2 #define C_tlwall 3 #define C_tuwall 4 #define C_crwall 5 static const int cross_matrix[4][6] = { { S_brcorn, S_blcorn, S_tlcorn, S_tuwall, S_trwall, S_crwall }, { S_blcorn, S_tlcorn, S_trcorn, S_trwall, S_tdwall, S_crwall }, { S_tlcorn, S_trcorn, S_brcorn, S_tdwall, S_tlwall, S_crwall }, { S_trcorn, S_brcorn, S_blcorn, S_tlwall, S_tuwall, S_crwall }, }; /* Print out a T wall warning and all interesting info. */ STATIC_OVL void t_warn(lev) struct rm *lev; { static const char warn_str[] = "wall_angle: %s: case %d: seenv = 0x%x"; const char *wname; if (lev->typ == TUWALL) wname = "tuwall"; else if (lev->typ == TLWALL) wname = "tlwall"; else if (lev->typ == TRWALL) wname = "trwall"; else if (lev->typ == TDWALL) wname = "tdwall"; else wname = "unknown"; impossible(warn_str, wname, lev->wall_info & WM_MASK, (unsigned int) lev->seenv); } /* * Return the correct graphics character index using wall type, wall mode, * and the seen vector. It is expected that seenv is non zero. * * All T-wall vectors are rotated to be TDWALL. All single crosswall * blocks are rotated to bottom right. All double crosswall are rotated * to W_X_BLTR. All results are converted back. * * The only way to understand this is to take out pen and paper and * draw diagrams. See rm.h for more details on the wall modes and * seen vector (SV). */ STATIC_OVL int wall_angle(lev) struct rm *lev; { register unsigned int seenv = lev->seenv & 0xff; const int *row; int col, idx; #define only(sv, bits) (((sv) & (bits)) && ! ((sv) & ~(bits))) switch (lev->typ) { case TUWALL: row = wall_matrix[T_u]; seenv = (seenv >> 4 | seenv << 4) & 0xff;/* rotate to tdwall */ goto do_twall; case TLWALL: row = wall_matrix[T_l]; seenv = (seenv >> 2 | seenv << 6) & 0xff;/* rotate to tdwall */ goto do_twall; case TRWALL: row = wall_matrix[T_r]; seenv = (seenv >> 6 | seenv << 2) & 0xff;/* rotate to tdwall */ goto do_twall; case TDWALL: row = wall_matrix[T_d]; do_twall: switch (lev->wall_info & WM_MASK) { case 0: if (seenv == SV4) { col = T_tlcorn; } else if (seenv == SV6) { col = T_trcorn; } else if (seenv & (SV3|SV5|SV7) || ((seenv & SV4) && (seenv & SV6))) { col = T_tdwall; } else if (seenv & (SV0|SV1|SV2)) { col = (seenv & (SV4|SV6) ? T_tdwall : T_hwall); } else { t_warn(lev); col = T_stone; } break; case WM_T_LONG: if (seenv & (SV3|SV4) && !(seenv & (SV5|SV6|SV7))) { col = T_tlcorn; } else if (seenv&(SV6|SV7) && !(seenv&(SV3|SV4|SV5))) { col = T_trcorn; } else if ((seenv & SV5) || ((seenv & (SV3|SV4)) && (seenv & (SV6|SV7)))) { col = T_tdwall; } else { /* only SV0|SV1|SV2 */ if (! only(seenv, SV0|SV1|SV2) ) t_warn(lev); col = T_stone; } break; case WM_T_BL: #if 0 /* older method, fixed */ if (only(seenv, SV4|SV5)) { col = T_tlcorn; } else if ((seenv & (SV0|SV1|SV2)) && only(seenv, SV0|SV1|SV2|SV6|SV7)) { col = T_hwall; } else if (seenv & SV3 || ((seenv & (SV0|SV1|SV2)) && (seenv & (SV4|SV5)))) { col = T_tdwall; } else { if (seenv != SV6) t_warn(lev); col = T_stone; } #endif /* 0 */ if (only(seenv, SV4|SV5)) col = T_tlcorn; else if ((seenv & (SV0|SV1|SV2|SV7)) && !(seenv & (SV3|SV4|SV5))) col = T_hwall; else if (only(seenv, SV6)) col = T_stone; else col = T_tdwall; break; case WM_T_BR: #if 0 /* older method, fixed */ if (only(seenv, SV5|SV6)) { col = T_trcorn; } else if ((seenv & (SV0|SV1|SV2)) && only(seenv, SV0|SV1|SV2|SV3|SV4)) { col = T_hwall; } else if (seenv & SV7 || ((seenv & (SV0|SV1|SV2)) && (seenv & (SV5|SV6)))) { col = T_tdwall; } else { if (seenv != SV4) t_warn(lev); col = T_stone; } #endif /* 0 */ if (only(seenv, SV5|SV6)) col = T_trcorn; else if ((seenv & (SV0|SV1|SV2|SV3)) && !(seenv & (SV5|SV6|SV7))) col = T_hwall; else if (only(seenv, SV4)) col = T_stone; else col = T_tdwall; break; default: impossible("wall_angle: unknown T wall mode %d", lev->wall_info & WM_MASK); col = T_stone; break; } idx = row[col]; break; case SDOOR: if (lev->horizontal) goto horiz; /* fall through */ case VWALL: switch (lev->wall_info & WM_MASK) { case 0: idx = seenv ? S_vwall : S_stone; break; case 1: idx = seenv & (SV1|SV2|SV3|SV4|SV5) ? S_vwall : S_stone; break; case 2: idx = seenv & (SV0|SV1|SV5|SV6|SV7) ? S_vwall : S_stone; break; default: impossible("wall_angle: unknown vwall mode %d", lev->wall_info & WM_MASK); idx = S_stone; break; } break; case HWALL: horiz: switch (lev->wall_info & WM_MASK) { case 0: idx = seenv ? S_hwall : S_stone; break; case 1: idx = seenv & (SV3|SV4|SV5|SV6|SV7) ? S_hwall : S_stone; break; case 2: idx = seenv & (SV0|SV1|SV2|SV3|SV7) ? S_hwall : S_stone; break; default: impossible("wall_angle: unknown hwall mode %d", lev->wall_info & WM_MASK); idx = S_stone; break; } break; #define set_corner(idx, lev, which, outer, inner, name) \ switch ((lev)->wall_info & WM_MASK) { \ case 0: idx = which; break; \ case WM_C_OUTER: idx = seenv & (outer) ? which : S_stone; break; \ case WM_C_INNER: idx = seenv & ~(inner) ? which : S_stone; break; \ default: \ impossible("wall_angle: unknown %s mode %d", name, \ (lev)->wall_info & WM_MASK); \ idx = S_stone; \ break; \ } case TLCORNER: set_corner(idx, lev, S_tlcorn, (SV3|SV4|SV5), SV4, "tlcorn"); break; case TRCORNER: set_corner(idx, lev, S_trcorn, (SV5|SV6|SV7), SV6, "trcorn"); break; case BLCORNER: set_corner(idx, lev, S_blcorn, (SV1|SV2|SV3), SV2, "blcorn"); break; case BRCORNER: set_corner(idx, lev, S_brcorn, (SV7|SV0|SV1), SV0, "brcorn"); break; case CROSSWALL: switch (lev->wall_info & WM_MASK) { case 0: if (seenv == SV0) idx = S_brcorn; else if (seenv == SV2) idx = S_blcorn; else if (seenv == SV4) idx = S_tlcorn; else if (seenv == SV6) idx = S_trcorn; else if (!(seenv & ~(SV0|SV1|SV2)) && (seenv & SV1 || seenv == (SV0|SV2))) idx = S_tuwall; else if (!(seenv & ~(SV2|SV3|SV4)) && (seenv & SV3 || seenv == (SV2|SV4))) idx = S_trwall; else if (!(seenv & ~(SV4|SV5|SV6)) && (seenv & SV5 || seenv == (SV4|SV6))) idx = S_tdwall; else if (!(seenv & ~(SV0|SV6|SV7)) && (seenv & SV7 || seenv == (SV0|SV6))) idx = S_tlwall; else idx = S_crwall; break; case WM_X_TL: row = cross_matrix[C_tl]; seenv = (seenv >> 4 | seenv << 4) & 0xff; goto do_crwall; case WM_X_TR: row = cross_matrix[C_tr]; seenv = (seenv >> 6 | seenv << 2) & 0xff; goto do_crwall; case WM_X_BL: row = cross_matrix[C_bl]; seenv = (seenv >> 2 | seenv << 6) & 0xff; goto do_crwall; case WM_X_BR: row = cross_matrix[C_br]; do_crwall: if (seenv == SV4) idx = S_stone; else { seenv = seenv & ~SV4; /* strip SV4 */ if (seenv == SV0) { col = C_brcorn; } else if (seenv & (SV2|SV3)) { if (seenv & (SV5|SV6|SV7)) col = C_crwall; else if (seenv & (SV0|SV1)) col = C_tuwall; else col = C_blcorn; } else if (seenv & (SV5|SV6)) { if (seenv & (SV1|SV2|SV3)) col = C_crwall; else if (seenv & (SV0|SV7)) col = C_tlwall; else col = C_trcorn; } else if (seenv & SV1) { col = seenv & SV7 ? C_crwall : C_tuwall; } else if (seenv & SV7) { col = seenv & SV1 ? C_crwall : C_tlwall; } else { impossible( "wall_angle: bottom of crwall check"); col = C_crwall; } idx = row[col]; } break; case WM_X_TLBR: if ( only(seenv, SV1|SV2|SV3) ) idx = S_blcorn; else if ( only(seenv, SV5|SV6|SV7) ) idx = S_trcorn; else if ( only(seenv, SV0|SV4) ) idx = S_stone; else idx = S_crwall; break; case WM_X_BLTR: if ( only(seenv, SV0|SV1|SV7) ) idx = S_brcorn; else if ( only(seenv, SV3|SV4|SV5) ) idx = S_tlcorn; else if ( only(seenv, SV2|SV6) ) idx = S_stone; else idx = S_crwall; break; default: impossible("wall_angle: unknown crosswall mode"); idx = S_stone; break; } break; default: impossible("wall_angle: unexpected wall type %d", lev->typ); idx = S_stone; } return idx; } /*display.c*/ slashem-0.0.7E7F3/src/ball.c0000664000076400007640000005431710545462317013533 0ustar aliali/* SCCS Id: @(#)ball.c 3.4 2003/02/03 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ /* Ball & Chain =============================================================*/ #include "hack.h" STATIC_DCL int NDECL(bc_order); STATIC_DCL void NDECL(litter); #ifdef DISPLAY_LAYERS #define memory_object(x, y) (levl[x][y].mem_obj) #else #define memory_object(x, y) (levl[x][y].glyph) #endif void ballfall() { boolean gets_hit; gets_hit = (((uball->ox != u.ux) || (uball->oy != u.uy)) && ((uwep == uball)? FALSE : (boolean)rn2(5))); if (carried(uball)) { pline("Startled, you drop the iron ball."); if (uwep == uball) setuwep((struct obj *)0, FALSE); if (uswapwep == uball) setuswapwep((struct obj *)0, FALSE); if (uquiver == uball) setuqwep((struct obj *)0);; if (uwep != uball) freeinv(uball); } if(gets_hit){ int dmg = rn1(7,25); pline_The("iron ball falls on your %s.", body_part(HEAD)); if (uarmh) { if(is_metallic(uarmh)) { pline("Fortunately, you are wearing a hard helmet."); dmg = 3; } else if (flags.verbose) Your("%s does not protect you.", xname(uarmh)); } losehp(dmg, "crunched in the head by an iron ball", NO_KILLER_PREFIX); } } /* * To make this work, we have to mess with the hero's mind. The rules for * ball&chain are: * * 1. If the hero can see them, fine. * 2. If the hero can't see either, it isn't seen. * 3. If either is felt it is seen. * 4. If either is felt and moved, it disappears. * * If the hero can see, then when a move is done, the ball and chain are * first picked up, the positions under them are corrected, then they * are moved after the hero moves. Not too bad. * * If the hero is blind, then she can "feel" the ball and/or chain at any * time. However, when the hero moves, the felt ball and/or chain become * unfelt and whatever was felt "under" the ball&chain appears. Pretty * nifty, but it requires that the ball&chain "remember" what was under * them --- i.e. they pick-up glyphs when they are felt and drop them when * moved (and felt). When swallowed, the ball&chain are pulled completely * off of the dungeon, but are still on the object chain. They are placed * under the hero when she is expelled. */ /* * from you.h * int u.bglyph glyph under the ball * int u.cglyph glyph under the chain * int u.bc_felt mask for ball/chain being felt * #define BC_BALL 0x01 bit mask in u.bc_felt for ball * #define BC_CHAIN 0x02 bit mask in u.bc_felt for chain * int u.bc_order ball & chain order * * u.bc_felt is also manipulated in display.c and read.c, the others only * in this file. None of these variables are valid unless the player is * Blind. */ /* values for u.bc_order */ #define BCPOS_DIFFER 0 /* ball & chain at different positions */ #define BCPOS_CHAIN 1 /* chain on top of ball */ #define BCPOS_BALL 2 /* ball on top of chain */ /* * Place the ball & chain under the hero. Make sure that the ball & chain * variables are set (actually only needed when blind, but what the heck). * It is assumed that when this is called, the ball and chain are NOT * attached to the object list. * * Should not be called while swallowed. */ void placebc() { if (!uchain || !uball) { impossible("Where are your ball and chain?"); return; } (void) flooreffects(uchain, u.ux, u.uy, ""); /* chain might rust */ if (carried(uball)) /* the ball is carried */ u.bc_order = BCPOS_DIFFER; else { /* ball might rust -- already checked when carried */ (void) flooreffects(uball, u.ux, u.uy, ""); place_object(uball, u.ux, u.uy); u.bc_order = BCPOS_CHAIN; } place_object(uchain, u.ux, u.uy); u.bglyph = u.cglyph = memory_object(u.ux, u.uy); /* pick up glyph */ newsym(u.ux,u.uy); } void unplacebc() { if (u.uswallow) return; /* ball&chain not placed while swallowed */ if (!carried(uball)) { obj_extract_self(uball); if (Blind && (u.bc_felt & BC_BALL)) /* drop glyph */ memory_object(uball->ox, uball->oy) = u.bglyph; newsym(uball->ox,uball->oy); } obj_extract_self(uchain); if (Blind && (u.bc_felt & BC_CHAIN)) /* drop glyph */ memory_object(uchain->ox, uchain->oy) = u.cglyph; newsym(uchain->ox,uchain->oy); u.bc_felt = 0; /* feel nothing */ } /* * Return the stacking of the hero's ball & chain. This assumes that the * hero is being punished. */ STATIC_OVL int bc_order() { struct obj *obj; if (uchain->ox != uball->ox || uchain->oy != uball->oy || carried(uball) || u.uswallow) return BCPOS_DIFFER; for (obj = level.objects[uball->ox][uball->oy]; obj; obj = obj->nexthere) { if (obj == uchain) return BCPOS_CHAIN; if (obj == uball) return BCPOS_BALL; } impossible("bc_order: ball&chain not in same location!"); return BCPOS_DIFFER; } /* * set_bc() * * The hero is either about to go blind or already blind and just punished. * Set up the ball and chain variables so that the ball and chain are "felt". */ void set_bc(already_blind) int already_blind; { int ball_on_floor = !carried(uball); u.bc_order = bc_order(); /* get the order */ u.bc_felt = ball_on_floor ? BC_BALL|BC_CHAIN : BC_CHAIN; /* felt */ if (already_blind || u.uswallow) { u.cglyph = u.bglyph = memory_object(u.ux, u.uy); return; } /* * Since we can still see, remove the ball&chain and get the glyph that * would be beneath them. Then put the ball&chain back. This is pretty * disgusting, but it will work. */ remove_object(uchain); if (ball_on_floor) remove_object(uball); newsym(uchain->ox, uchain->oy); u.cglyph = memory_object(uchain->ox, uchain->oy); if (u.bc_order == BCPOS_DIFFER) { /* different locations */ place_object(uchain, uchain->ox, uchain->oy); newsym(uchain->ox, uchain->oy); if (ball_on_floor) { newsym(uball->ox, uball->oy); /* see under ball */ u.bglyph = memory_object(uball->ox, uball->oy); place_object(uball, uball->ox, uball->oy); newsym(uball->ox, uball->oy); /* restore ball */ } } else { u.bglyph = u.cglyph; if (u.bc_order == BCPOS_CHAIN) { place_object(uball, uball->ox, uball->oy); place_object(uchain, uchain->ox, uchain->oy); } else { place_object(uchain, uchain->ox, uchain->oy); place_object(uball, uball->ox, uball->oy); } newsym(uball->ox, uball->oy); } } /* * move_bc() * * Move the ball and chain. This is called twice for every move. The first * time to pick up the ball and chain before the move, the second time to * place the ball and chain after the move. If the ball is carried, this * function should never have BC_BALL as part of its control. * * Should not be called while swallowed. */ void move_bc(before, control, ballx, bally, chainx, chainy) int before, control; xchar ballx, bally, chainx, chainy; /* only matter !before */ { if (Blind) { /* * The hero is blind. Time to work hard. The ball and chain that * are attached to the hero are very special. The hero knows that * they are attached, so when they move, the hero knows that they * aren't at the last position remembered. This is complicated * by the fact that the hero can "feel" the surrounding locations * at any time, hence, making one or both of them show up again. * So, we have to keep track of which is felt at any one time and * act accordingly. */ if (!before) { if ((control & BC_CHAIN) && (control & BC_BALL)) { /* * Both ball and chain moved. If felt, drop glyph. */ if (u.bc_felt & BC_BALL) memory_object(uball->ox, uball->oy) = u.bglyph; if (u.bc_felt & BC_CHAIN) memory_object(uchain->ox, uchain->oy) = u.cglyph; u.bc_felt = 0; /* Pick up glyph at new location. */ u.bglyph = memory_object(ballx, bally); u.cglyph = memory_object(chainx, chainy); movobj(uball,ballx,bally); movobj(uchain,chainx,chainy); } else if (control & BC_BALL) { if (u.bc_felt & BC_BALL) { if (u.bc_order == BCPOS_DIFFER) { /* ball by itself */ memory_object(uball->ox, uball->oy) = u.bglyph; } else if (u.bc_order == BCPOS_BALL) { if (u.bc_felt & BC_CHAIN) { /* know chain is there */ map_object(uchain, 0); } else { memory_object(uball->ox, uball->oy) = u.bglyph; } } u.bc_felt &= ~BC_BALL; /* no longer feel the ball */ } /* Pick up glyph at new position. */ u.bglyph = (ballx != chainx || bally != chainy) ? memory_object(ballx, bally) : u.cglyph; movobj(uball,ballx,bally); } else if (control & BC_CHAIN) { if (u.bc_felt & BC_CHAIN) { if (u.bc_order == BCPOS_DIFFER) { memory_object(uchain->ox, uchain->oy) = u.cglyph; } else if (u.bc_order == BCPOS_CHAIN) { if (u.bc_felt & BC_BALL) { map_object(uball, 0); } else { memory_object(uchain->ox, uchain->oy) = u.cglyph; } } u.bc_felt &= ~BC_CHAIN; } /* Pick up glyph at new position. */ u.cglyph = (ballx != chainx || bally != chainy) ? memory_object(chainx, chainy) : u.bglyph; movobj(uchain,chainx,chainy); } u.bc_order = bc_order(); /* reset the order */ } } else { /* * The hero is not blind. To make this work correctly, we need to * pick up the ball and chain before the hero moves, then put them * in their new positions after the hero moves. */ if (before) { if (!control) { /* * Neither ball nor chain is moving, so remember which was * on top until !before. Use the variable u.bc_order * since it is only valid when blind. */ u.bc_order = bc_order(); } remove_object(uchain); newsym(uchain->ox, uchain->oy); if (!carried(uball)) { remove_object(uball); newsym(uball->ox, uball->oy); } } else { int on_floor = !carried(uball); if ((control & BC_CHAIN) || (!control && u.bc_order == BCPOS_CHAIN)) { /* If the chain moved or nothing moved & chain on top. */ if (on_floor) place_object(uball, ballx, bally); place_object(uchain, chainx, chainy); /* chain on top */ } else { place_object(uchain, chainx, chainy); if (on_floor) place_object(uball, ballx, bally); /* ball on top */ } newsym(chainx, chainy); if (on_floor) newsym(ballx, bally); } } } /* return TRUE if the caller needs to place the ball and chain down again * * 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. * * It is called if we are moving. It is also called if we are teleporting * *if* the ball doesn't move and we thus must drag the chain. It is not * called for ordinary teleportation. * * allow_drag is only used in the ugly special case where teleporting must * drag the chain, while an identical-looking movement must drag both the ball * and chain. */ boolean drag_ball(x, y, bc_control, ballx, bally, chainx, chainy, cause_delay, allow_drag) xchar x, y; int *bc_control; xchar *ballx, *bally, *chainx, *chainy; boolean *cause_delay; boolean allow_drag; { struct trap *t = (struct trap *)0; boolean already_in_rock; *ballx = uball->ox; *bally = uball->oy; *chainx = uchain->ox; *chainy = uchain->oy; *bc_control = 0; *cause_delay = FALSE; if (dist2(x, y, uchain->ox, uchain->oy) <= 2) { /* nothing moved */ move_bc(1, *bc_control, *ballx, *bally, *chainx, *chainy); return TRUE; } /* only need to move the chain? */ if (carried(uball) || distmin(x, y, uball->ox, uball->oy) <= 2) { xchar oldchainx = uchain->ox, oldchainy = uchain->oy; *bc_control = BC_CHAIN; move_bc(1, *bc_control, *ballx, *bally, *chainx, *chainy); if (carried(uball)) { /* move chain only if necessary */ 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) #define IS_CHAIN_ROCK(x,y) \ (IS_ROCK(levl[x][y].typ) || (IS_DOOR(levl[x][y].typ) && \ (levl[x][y].doormask & (D_CLOSED|D_LOCKED)))) /* Don't ever move the chain into solid rock. If we have to, then instead * undo the move_bc() and jump to the drag ball code. Note that this also * means the "cannot carry and drag" message will not appear, since unless we * moved at least two squares there is no possibility of the chain position * being in solid rock. */ #define SKIP_TO_DRAG { *chainx = oldchainx; *chainy = oldchainy; \ move_bc(0, *bc_control, *ballx, *bally, *chainx, *chainy); \ goto drag; } if (IS_CHAIN_ROCK(u.ux, u.uy) || IS_CHAIN_ROCK(*chainx, *chainy) || IS_CHAIN_ROCK(uball->ox, uball->oy)) already_in_rock = TRUE; else already_in_rock = FALSE; 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; if (IS_CHAIN_ROCK(*chainx, *chainy) && !already_in_rock) SKIP_TO_DRAG; 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 (IS_CHAIN_ROCK(tempx, tempy) && !IS_CHAIN_ROCK(tempx2, tempy2) && !already_in_rock) { if (allow_drag) { /* Avoid pathological case *if* not teleporting: * 0 0_ * _X move northeast -----> X@ * @ */ if (dist2(u.ux, u.uy, uball->ox, uball->oy) == 5 && dist2(x, y, tempx, tempy) == 1) SKIP_TO_DRAG; /* Avoid pathological case *if* not teleporting: * 0 0 * _X move east -----> X_ * @ @ */ if (dist2(u.ux, u.uy, uball->ox, uball->oy) == 4 && dist2(x, y, tempx, tempy) == 2) SKIP_TO_DRAG; } *chainx = tempx2; *chainy = tempy2; } else if (!IS_CHAIN_ROCK(tempx, tempy) && IS_CHAIN_ROCK(tempx2, tempy2) && !already_in_rock) { if (allow_drag) { if (dist2(u.ux, u.uy, uball->ox, uball->oy) == 5 && dist2(x, y, tempx2, tempy2) == 1) SKIP_TO_DRAG; if (dist2(u.ux, u.uy, uball->ox, uball->oy) == 4 && dist2(x, y, tempx2, tempy2) == 2) SKIP_TO_DRAG; } *chainx = tempx; *chainy = tempy; } else if (IS_CHAIN_ROCK(tempx, tempy) && IS_CHAIN_ROCK(tempx2, tempy2) && !already_in_rock) { SKIP_TO_DRAG; } else 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 + uball->ox)/2; *chainy = (y + uball->oy)/2; if (IS_CHAIN_ROCK(*chainx, *chainy) && !already_in_rock) SKIP_TO_DRAG; 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; if (IS_CHAIN_ROCK(*chainx, *chainy) && !already_in_rock) SKIP_TO_DRAG; 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 SKIP_TO_DRAG #undef IS_CHAIN_ROCK #undef CHAIN_IN_MIDDLE return TRUE; } drag: if (near_capacity() > SLT_ENCUMBER && dist2(x, y, u.ux, u.uy) <= 2) { You("cannot %sdrag the heavy iron ball.", invent ? "carry all that and also " : ""); nomul(0); return FALSE; } if ((is_pool(uchain->ox, uchain->oy) && /* water not mere continuation of previous water */ (levl[uchain->ox][uchain->oy].typ == POOL || !is_pool(uball->ox, uball->oy) || levl[uball->ox][uball->oy].typ == POOL)) || ((t = t_at(uchain->ox, uchain->oy)) && (t->ttyp == PIT || t->ttyp == SPIKED_PIT || t->ttyp == HOLE || t->ttyp == TRAPDOOR)) ) { if (Levitation) { You_feel("a tug from the iron ball."); if (t) t->tseen = 1; } else { struct monst *victim; You("are jerked back by the iron ball!"); if ((victim = m_at(uchain->ox, uchain->oy)) != 0) { int tmp; tmp = -2 + Luck + find_mac(victim); tmp += omon_adj(victim, uball, TRUE); if (tmp >= rnd(20)) (void) hmon(victim,uball,3); else miss(xname(uball), victim); } /* now check again in case mon died */ if (!m_at(uchain->ox, uchain->oy)) { u.ux = uchain->ox; u.uy = uchain->oy; newsym(u.ux0, u.uy0); } nomul(0); *bc_control = BC_BALL; move_bc(1, *bc_control, *ballx, *bally, *chainx, *chainy); *ballx = uchain->ox; *bally = uchain->oy; move_bc(0, *bc_control, *ballx, *bally, *chainx, *chainy); spoteffects(TRUE); return FALSE; } } *bc_control = BC_BALL|BC_CHAIN; move_bc(1, *bc_control, *ballx, *bally, *chainx, *chainy); if (dist2(x, y, u.ux, u.uy) > 2) { /* Awful case: we're still in range of the ball, so we thought we * could only move the chain, but it turned out that the target * square for the chain was rock, so we had to drag it instead. * But we can't drag it either, because we teleported and are more * than one square from our old position. Revert to the teleport * behavior. */ *ballx = *chainx = x; *bally = *chainy = y; } else { *ballx = uchain->ox; *bally = uchain->oy; *chainx = u.ux; *chainy = u.uy; } *cause_delay = TRUE; return TRUE; } /* * drop_ball() * * The punished hero drops or throws her iron ball. If the hero is * blind, we must reset the order and glyph. Check for side effects. * This routine expects the ball to be already placed. * * Should not be called while swallowed. */ void drop_ball(x, y) xchar x, y; { if (Blind) { u.bc_order = bc_order(); /* get the order */ /* pick up glyph */ u.bglyph = (u.bc_order) ? u.cglyph : memory_object(x, y); } if (x != u.ux || y != u.uy) { struct trap *t; const char *pullmsg = "The ball pulls you out of the %s!"; if (u.utrap && u.utraptype != TT_INFLOOR) { switch(u.utraptype) { case TT_PIT: pline(pullmsg, "pit"); break; case TT_WEB: pline(pullmsg, "web"); pline_The("web is destroyed!"); deltrap(t_at(u.ux,u.uy)); break; case TT_LAVA: pline(pullmsg, "lava"); break; case TT_BEARTRAP: { register long side = rn2(3) ? LEFT_SIDE : RIGHT_SIDE; pline(pullmsg, "bear trap"); set_wounded_legs(side, rn1(1000, 500)); #ifdef STEED if (!u.usteed) #endif { Your("%s %s is severely damaged.", (side == LEFT_SIDE) ? "left" : "right", body_part(LEG)); losehp(2, "leg damage from being pulled out of a bear trap", KILLED_BY); } break; } } u.utrap = 0; fill_pit(u.ux, u.uy); } u.ux0 = u.ux; u.uy0 = u.uy; if (!Levitation && !MON_AT(x, y) && !u.utrap && (is_pool(x, y) || ((t = t_at(x, y)) && (t->ttyp == PIT || t->ttyp == SPIKED_PIT || t->ttyp == TRAPDOOR || t->ttyp == HOLE)))) { u.ux = x; u.uy = y; } else { u.ux = x - u.dx; u.uy = y - u.dy; } vision_full_recalc = 1; /* hero has moved, recalculate vision later */ if (Blind) { /* drop glyph under the chain */ if (u.bc_felt & BC_CHAIN) memory_object(uchain->ox, uchain->oy) = u.cglyph; u.bc_felt = 0; /* feel nothing */ /* pick up new glyph */ u.cglyph = (u.bc_order) ? u.bglyph : memory_object(u.ux, u.uy); } movobj(uchain,u.ux,u.uy); /* has a newsym */ if (Blind) { u.bc_order = bc_order(); } newsym(u.ux0,u.uy0); /* clean up old position */ if (u.ux0 != u.ux || u.uy0 != u.uy) { spoteffects(TRUE); if (In_sokoban(&u.uz)) change_luck(-1); /* Sokoban guilt */ } } } STATIC_OVL void litter() { struct obj *otmp = invent, *nextobj; int capacity = weight_cap(); 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); } } otmp = nextobj; } } void drag_down() { boolean forward; uchar dragchance = 3; /* * Assume that the ball falls forward if: * * a) the character is wielding it, or * b) the character has both hands available to hold it (i.e. is * not wielding any weapon), or * c) (perhaps) it falls forward out of his non-weapon hand */ forward = carried(uball) && (uwep == uball || !uwep || !rn2(3)); if (carried(uball)) You("lose your grip on the iron ball."); if (forward) { if(rn2(6)) { pline_The("iron ball drags you downstairs!"); losehp(rnd(6), "dragged downstairs by an iron ball", NO_KILLER_PREFIX); litter(); } } else { if(rn2(2)) { pline_The("iron ball smacks into you!"); losehp(rnd(20), "iron ball collision", KILLED_BY_AN); exercise(A_STR, FALSE); dragchance -= 2; } if( (int) dragchance >= rnd(6)) { pline_The("iron ball drags you downstairs!"); losehp(rnd(3), "dragged downstairs by an iron ball", NO_KILLER_PREFIX); exercise(A_STR, FALSE); litter(); } } } /*ball.c*/ slashem-0.0.7E7F3/src/dungeon.c0000664000076400007640000013634410545462317014261 0ustar aliali/* 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. */ #include "hack.h" #include "dgn_file.h" #include "dlb.h" #ifdef OVL1 #define DUNGEON_AREA FILE_AREA_UNSHARE #define DUNGEON_FILE "dungeon" #define X_START "x-strt" #define X_LOCATE "x-loca" #define X_GOAL "x-goal" struct proto_dungeon { struct tmpdungeon tmpdungeon[MAXDUNGEON]; struct tmplevel tmplevel[LEV_LIMIT]; s_level *final_lev[LEV_LIMIT]; /* corresponding level pointers */ struct tmpbranch tmpbranch[BRANCH_LIMIT]; int tmpparent[BRANCH_LIMIT]; int start; /* starting index of current dungeon sp levels */ int n_levs; /* number of tmplevel entries */ int n_brs; /* number of tmpbranch entries */ }; int n_dgns; /* number of dungeons (used here, */ /* and mklev.c) */ static branch *branches = (branch *) 0; /* dungeon branch list */ struct lchoice { int idx; schar lev[MAXLINFO]; schar playerlev[MAXLINFO]; xchar dgn[MAXLINFO]; char menuletter; }; static void FDECL(Fread, (genericptr_t, int, int, dlb *)); STATIC_DCL xchar FDECL(dname_to_dnum, (const char *)); STATIC_DCL int FDECL(find_branch, (const char *, struct proto_dungeon *)); STATIC_DCL int FDECL(level_range, (XCHAR_P,int,int,int,struct proto_dungeon *,int *)); STATIC_DCL xchar FDECL(parent_dlevel, (int, struct proto_dungeon *)); STATIC_DCL int FDECL(correct_branch_type, (struct tmpbranch *)); STATIC_DCL branch *FDECL(add_branch, (int, int, struct proto_dungeon *)); STATIC_DCL void FDECL(add_level, (s_level *)); STATIC_DCL void FDECL(init_level, (int,int,struct proto_dungeon *)); STATIC_DCL int FDECL(possible_places, (int, boolean *, struct proto_dungeon *)); STATIC_DCL xchar FDECL(pick_level, (boolean *, int)); STATIC_DCL boolean FDECL(place_level, (int, struct proto_dungeon *)); #ifdef WIZARD STATIC_DCL const char *FDECL(br_string, (int)); STATIC_DCL void FDECL(print_branch, (winid, int, int, int, BOOLEAN_P, struct lchoice *)); #endif #if defined(DEBUG) || defined(DEBUG_420942) #define DD dungeons[i] STATIC_DCL void NDECL(dumpit); STATIC_OVL void dumpit() { int i; s_level *x; branch *br; for(i = 0; i < n_dgns; i++) { fprintf(stderr, "\n#%d \"%s\" (%s):\n", i, DD.dname, DD.proto); fprintf(stderr, " num_dunlevs %d, dunlev_ureached %d\n", DD.num_dunlevs, DD.dunlev_ureached); fprintf(stderr, " depth_start %d, ledger_start %d\n", DD.depth_start, DD.ledger_start); fprintf(stderr, " flags:%s%s%s\n", DD.flags.rogue_like ? " rogue_like" : "", DD.flags.maze_like ? " maze_like" : "", DD.flags.hellish ? " hellish" : ""); getchar(); } fprintf(stderr,"\nSpecial levels:\n"); for(x = sp_levchn; x; x = x->next) { fprintf(stderr, "%s (%d): ", x->proto, x->rndlevs); fprintf(stderr, "on %d, %d; ", x->dlevel.dnum, x->dlevel.dlevel); fprintf(stderr, "flags:%s%s%s%s\n", x->flags.rogue_like ? " rogue_like" : "", x->flags.maze_like ? " maze_like" : "", x->flags.hellish ? " hellish" : "", x->flags.town ? " town" : ""); getchar(); } fprintf(stderr,"\nBranches:\n"); for (br = branches; br; br = br->next) { fprintf(stderr, "%d: %s, end1 %d %d, end2 %d %d, %s\n", br->id, br->type == BR_STAIR ? "stair" : br->type == BR_NO_END1 ? "no end1" : br->type == BR_NO_END2 ? "no end2" : br->type == BR_PORTAL ? "portal" : "unknown", br->end1.dnum, br->end1.dlevel, br->end2.dnum, br->end2.dlevel, br->end1_up ? "end1 up" : "end1 down"); } getchar(); fprintf(stderr,"\nDone\n"); getchar(); } #endif /* Save the dungeon structures. */ void save_dungeon(fd, perform_write, free_data) int fd; boolean perform_write, free_data; { branch *curr, *next; int count; if (perform_write) { bwrite(fd, (genericptr_t) &n_dgns, sizeof n_dgns); bwrite(fd, (genericptr_t) dungeons, sizeof(dungeon) * (unsigned)n_dgns); bwrite(fd, (genericptr_t) &dungeon_topology, sizeof dungeon_topology); bwrite(fd, (genericptr_t) tune, sizeof tune); for (count = 0, curr = branches; curr; curr = curr->next) count++; bwrite(fd, (genericptr_t) &count, sizeof(count)); for (curr = branches; curr; curr = curr->next) bwrite(fd, (genericptr_t) curr, sizeof (branch)); count = maxledgerno(); bwrite(fd, (genericptr_t) &count, sizeof count); bwrite(fd, (genericptr_t) level_info, (unsigned)count * sizeof (struct linfo)); bwrite(fd, (genericptr_t) &inv_pos, sizeof inv_pos); } if (free_data) { for (curr = branches; curr; curr = next) { next = curr->next; free((genericptr_t) curr); } branches = 0; } } /* Restore the dungeon structures. */ void restore_dungeon(fd) int fd; { branch *curr, *last; int count, i; mread(fd, (genericptr_t) &n_dgns, sizeof(n_dgns)); mread(fd, (genericptr_t) dungeons, sizeof(dungeon) * (unsigned)n_dgns); mread(fd, (genericptr_t) &dungeon_topology, sizeof dungeon_topology); mread(fd, (genericptr_t) tune, sizeof tune); last = branches = (branch *) 0; mread(fd, (genericptr_t) &count, sizeof(count)); for (i = 0; i < count; i++) { curr = (branch *) alloc(sizeof(branch)); mread(fd, (genericptr_t) curr, sizeof(branch)); curr->next = (branch *) 0; if (last) last->next = curr; else branches = curr; last = curr; } mread(fd, (genericptr_t) &count, sizeof(count)); if (count >= MAXLINFO) panic("level information count larger (%d) than allocated size", count); mread(fd, (genericptr_t) level_info, (unsigned)count*sizeof(struct linfo)); mread(fd, (genericptr_t) &inv_pos, sizeof inv_pos); } static void Fread(ptr, size, nitems, stream) genericptr_t ptr; int size, nitems; dlb *stream; { int cnt; if((cnt = dlb_fread(ptr, size, nitems, stream)) != nitems) { panic( "Premature EOF on dungeon description file!\r\nExpected %d bytes - got %d.", (size * nitems), (size * cnt)); terminate(EXIT_FAILURE); } } STATIC_OVL xchar dname_to_dnum(s) const char *s; { xchar i; for (i = 0; i < n_dgns; i++) if (!strcmp(dungeons[i].dname, s)) return i; panic("Couldn't resolve dungeon number for name \"%s\".", s); /*NOT REACHED*/ return (xchar)0; } s_level * find_level(s) const char *s; { s_level *curr; for(curr = sp_levchn; curr; curr = curr->next) if (!strcmpi(s, curr->proto)) break; return curr; } /* Find the branch that links the named dungeon. */ STATIC_OVL int find_branch(s, pd) const char *s; /* dungeon name */ struct proto_dungeon *pd; { int i; if (pd) { for (i = 0; i < pd->n_brs; i++) if (!strcmp(pd->tmpbranch[i].name, s)) break; if (i == pd->n_brs) panic("find_branch: can't find %s", s); } else { /* support for level tport by name */ branch *br; const char *dnam; for (br = branches; br; br = br->next) { dnam = dungeons[br->end2.dnum].dname; if (!strcmpi(dnam, s) || (!strncmpi(dnam, "The ", 4) && !strcmpi(dnam + 4, s))) break; } i = br ? ((ledger_no(&br->end1) << 8) | ledger_no(&br->end2)) : -1; } return i; } /* * Return a starting point and number of successive positions a level * or dungeon entrance can occupy. * * Note: This follows the acouple (instead of the rcouple) rules for a * negative random component (rand < 0). These rules are found * in dgn_comp.y. The acouple [absolute couple] section says that * a negative random component means from the (adjusted) base to the * end of the dungeon. */ STATIC_OVL int level_range(dgn, base, rand, chain, pd, adjusted_base) xchar dgn; int base, rand, chain; struct proto_dungeon *pd; int *adjusted_base; { int lmax = dungeons[dgn].num_dunlevs; if (chain >= 0) { /* relative to a special level */ s_level *levtmp = pd->final_lev[chain]; if (!levtmp) panic("level_range: empty chain level!"); base += levtmp->dlevel.dlevel; } else { /* absolute in the dungeon */ /* from end of dungeon */ if (base < 0) base = (lmax + base + 1); } if (base < 1 || base > lmax) panic("level_range: base value out of range"); *adjusted_base = base; if (rand == -1) { /* from base to end of dungeon */ return (lmax - base + 1); } else if (rand) { /* make sure we don't run off the end of the dungeon */ return (((base + rand - 1) > lmax) ? lmax-base+1 : rand); } /* else only one choice */ return 1; } STATIC_OVL xchar parent_dlevel(i, pd) int i; struct proto_dungeon *pd; { int j, num, base, dnum = pd->tmpparent[i]; branch *curr; num = level_range(dnum, pd->tmpbranch[i].lev.base, pd->tmpbranch[i].lev.rand, pd->tmpbranch[i].chain, pd, &base); /* KMH -- Try our best to find a level without an existing branch */ i = j = rn2(num); do { if (++i >= num) i = 0; for (curr = branches; curr; curr = curr->next) if ((curr->end1.dnum == dnum && curr->end1.dlevel == base+i) || (curr->end2.dnum == dnum && curr->end2.dlevel == base+i)) break; } while (curr && i != j); return (base + i); } /* Convert from the temporary branch type to the dungeon branch type. */ STATIC_OVL int correct_branch_type(tbr) struct tmpbranch *tbr; { switch (tbr->type) { case TBR_STAIR: return BR_STAIR; case TBR_NO_UP: return tbr->up ? BR_NO_END1 : BR_NO_END2; case TBR_NO_DOWN: return tbr->up ? BR_NO_END2 : BR_NO_END1; case TBR_PORTAL: return BR_PORTAL; } impossible("correct_branch_type: unknown branch type"); return BR_STAIR; } /* * Add the given branch to the branch list. The branch list is ordered * by end1 dungeon and level followed by end2 dungeon and level. If * extract_first is true, then the branch is already part of the list * but needs to be repositioned. */ void insert_branch(new_branch, extract_first) branch *new_branch; boolean extract_first; { branch *curr, *prev; long new_val, curr_val, prev_val; if (extract_first) { for (prev = 0, curr = branches; curr; prev = curr, curr = curr->next) if (curr == new_branch) break; if (!curr) panic("insert_branch: not found"); if (prev) prev->next = curr->next; else branches = curr->next; } 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. */ prev = (branch *) 0; prev_val = -1; new_val = branch_val(new_branch); for (curr = branches; curr; prev_val = curr_val, prev = curr, curr = curr->next) { curr_val = branch_val(curr); if (prev_val < new_val && new_val <= curr_val) break; } if (prev) { new_branch->next = curr; prev->next = new_branch; } else { new_branch->next = branches; branches = new_branch; } } /* Add a dungeon branch to the branch list. */ STATIC_OVL branch * add_branch(dgn, branch_num, pd) int dgn, branch_num; struct proto_dungeon *pd; { static int branch_id = 0; branch *new_branch; int entry_lev; new_branch = (branch *) alloc(sizeof(branch)); new_branch->next = (branch *) 0; new_branch->id = branch_id++; new_branch->type = correct_branch_type(&pd->tmpbranch[branch_num]); new_branch->end1.dnum = pd->tmpparent[branch_num]; new_branch->end1.dlevel = parent_dlevel(branch_num, pd); new_branch->end2.dnum = dgn; /* * Calculate the entry level for target dungeon. The pd.tmpbranch entry * value means: * < 0 from bottom (-1 == bottom level) * 0 default (top) * > 0 actual level (1 = top) */ if (pd->tmpbranch[branch_num].entry_lev < 0) { entry_lev = dungeons[dgn].num_dunlevs + pd->tmpbranch[branch_num].entry_lev + 1; if (entry_lev <= 0) entry_lev = 1; } else if (pd->tmpbranch[dgn].entry_lev > 0) { entry_lev = pd->tmpbranch[branch_num].entry_lev; if (entry_lev > dungeons[dgn].num_dunlevs) entry_lev = dungeons[dgn].num_dunlevs; } else entry_lev = 1; /* defaults to top level */ new_branch->end2.dlevel = entry_lev; new_branch->end1_up = pd->tmpbranch[branch_num].up ? TRUE : FALSE; insert_branch(new_branch, FALSE); return new_branch; } /* * Add new level to special level chain. Insert it in level order with the * other levels in this dungeon. This assumes that we are never given a * level that has a dungeon number less than the dungeon number of the * last entry. */ STATIC_OVL void add_level(new_lev) s_level *new_lev; { s_level *prev, *curr; prev = (s_level *) 0; for (curr = sp_levchn; curr; curr = curr->next) { if (curr->dlevel.dnum == new_lev->dlevel.dnum && curr->dlevel.dlevel > new_lev->dlevel.dlevel) break; prev = curr; } if (!prev) { new_lev->next = sp_levchn; sp_levchn = new_lev; } else { new_lev->next = curr; prev->next = new_lev; } } STATIC_OVL void init_level(dgn, proto_index, pd) int dgn, proto_index; struct proto_dungeon *pd; { s_level *new_level; struct tmplevel *tlevel = &pd->tmplevel[proto_index]; pd->final_lev[proto_index] = (s_level *) 0; /* no "real" level */ #ifdef WIZARD /* if (!wizard) */ #endif if (tlevel->chance <= rn2(100)) return; pd->final_lev[proto_index] = new_level = (s_level *) alloc(sizeof(s_level)); /* load new level with data */ Strcpy(new_level->proto, tlevel->name); new_level->boneid = tlevel->boneschar; new_level->dlevel.dnum = dgn; new_level->dlevel.dlevel = 0; /* for now */ new_level->flags.town = !!(tlevel->flags & TOWN); new_level->flags.hellish = !!(tlevel->flags & HELLISH); new_level->flags.maze_like = !!(tlevel->flags & MAZELIKE); new_level->flags.rogue_like = !!(tlevel->flags & ROGUELIKE); new_level->flags.align = ((tlevel->flags & D_ALIGN_MASK) >> 4); if (!new_level->flags.align) new_level->flags.align = ((pd->tmpdungeon[dgn].flags & D_ALIGN_MASK) >> 4); new_level->rndlevs = tlevel->rndlevs; new_level->next = (s_level *) 0; } STATIC_OVL int possible_places(idx, map, pd) int idx; /* prototype index */ boolean *map; /* array MAXLEVEL+1 in length */ struct proto_dungeon *pd; { int i, start, count; s_level *lev = pd->final_lev[idx]; /* init level possibilities */ for (i = 0; i <= MAXLEVEL; i++) map[i] = FALSE; /* get base and range and set those entried to true */ count = level_range(lev->dlevel.dnum, pd->tmplevel[idx].lev.base, pd->tmplevel[idx].lev.rand, pd->tmplevel[idx].chain, pd, &start); for (i = start; i < start+count; i++) map[i] = TRUE; /* mark off already placed levels */ for (i = pd->start; i < idx; i++) { if (pd->final_lev[i] && map[pd->final_lev[i]->dlevel.dlevel]) { map[pd->final_lev[i]->dlevel.dlevel] = FALSE; --count; } } return count; } /* Pick the nth TRUE entry in the given boolean array. */ STATIC_OVL xchar pick_level(map, nth) boolean *map; /* an array MAXLEVEL+1 in size */ int nth; { int i; for (i = 1; i <= MAXLEVEL; i++) if (map[i] && !nth--) return (xchar) i; panic("pick_level: ran out of valid levels"); return 0; } #ifdef DDEBUG static void FDECL(indent,(int)); static void indent(d) int d; { while (d-- > 0) fputs(" ", stderr); } #endif /* * Place a level. First, find the possible places on a dungeon map * template. Next pick one. Then try to place the next level. If * sucessful, we're done. Otherwise, try another (and another) until * all possible places have been tried. If all possible places have * been exausted, return false. */ STATIC_OVL boolean place_level(proto_index, pd) int proto_index; struct proto_dungeon *pd; { boolean map[MAXLEVEL+1]; /* valid levels are 1..MAXLEVEL inclusive */ s_level *lev; int npossible; #ifdef DDEBUG int i; #endif if (proto_index == pd->n_levs) return TRUE; /* at end of proto levels */ lev = pd->final_lev[proto_index]; /* No level created for this prototype, goto next. */ if (!lev) return place_level(proto_index+1, pd); npossible = possible_places(proto_index, map, pd); for (; npossible; --npossible) { lev->dlevel.dlevel = pick_level(map, rn2(npossible)); #ifdef DDEBUG indent(proto_index-pd->start); fprintf(stderr,"%s: trying %d [ ", lev->proto, lev->dlevel.dlevel); for (i = 1; i <= MAXLEVEL; i++) if (map[i]) fprintf(stderr,"%d ", i); fprintf(stderr,"]\n"); #endif if (place_level(proto_index+1, pd)) return TRUE; map[lev->dlevel.dlevel] = FALSE; /* this choice didn't work */ } #ifdef DDEBUG indent(proto_index-pd->start); fprintf(stderr,"%s: failed\n", lev->proto); #endif return FALSE; } struct level_map { const char *lev_name; d_level *lev_spec; } level_map[] = { { "air", &air_level }, { "asmodeus", &asmodeus_level }, { "demogorg", &demogorgon_level }, { "geryon", &geryon_level }, { "dispater", &dispater_level }, { "yeenoghu", &yeenoghu_level }, { "astral", &astral_level }, { "baalz", &baalzebub_level }, { "bigroom", &bigroom_level }, { "castle", &stronghold_level }, { "earth", &earth_level }, { "fakewiz1", &portal_level }, { "fire", &fire_level }, { "juiblex", &juiblex_level }, { "knox", &knox_level }, #ifdef BLACKMARKET { "blkmar", &blackmarket_level }, #endif /* BLACKMARKET */ { "medusa", &medusa_level }, { "mine_end", &mineend_level }, { "oracle", &oracle_level }, { "orcus", &orcus_level }, #ifdef REINCARNATION { "rogue", &rogue_level }, #endif { "sanctum", &sanctum_level }, { "valley", &valley_level }, { "water", &water_level }, { "wizard1", &wiz1_level }, { "wizard2", &wiz2_level }, { "wizard3", &wiz3_level }, { "nightmar", &lawful_quest_level }, { "beholder", &neutral_quest_level }, { "lich", &chaotic_quest_level }, { X_START, &qstart_level }, { X_LOCATE, &qlocate_level }, { X_GOAL, &nemesis_level }, { "", (d_level *)0 } }; void init_dungeons() { dlb *dgn_file; register int i, cl = 0, cb = 0; register s_level *x; struct proto_dungeon pd; struct level_map *lev_map; struct version_info vers_info; /* [ALI] Cope with being called more than once. The GTK interface * can currently do this, although it really should use popen(). */ free_dungeons(); pd.n_levs = pd.n_brs = 0; dgn_file = dlb_fopen_area(DUNGEON_AREA, DUNGEON_FILE, RDBMODE); if (!dgn_file) { char tbuf[BUFSZ]; Sprintf(tbuf, "Cannot open dungeon description - \"%s", DUNGEON_FILE); #ifdef DLBRSRC /* using a resource from the executable */ Strcat(tbuf, "\" resource!"); #else /* using a file or DLB file */ # if defined(DLB) Strcat(tbuf, "\" from "); # ifdef PREFIXES_IN_USE Strcat(tbuf, "\n\""); if (fqn_prefix[DATAPREFIX]) Strcat(tbuf, fqn_prefix[DATAPREFIX]); # else Strcat(tbuf, "\""); # endif Strcat(tbuf, DLBFILE); # endif Strcat(tbuf, "\" file!"); #endif #ifdef WIN32 interject_assistance(1, INTERJECT_PANIC, (genericptr_t)tbuf, (genericptr_t)fqn_prefix[DATAPREFIX]); #endif panic(tbuf); } /* 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."); /* * Read in each dungeon and transfer the results to the internal * dungeon arrays. */ sp_levchn = (s_level *) 0; Fread((genericptr_t)&n_dgns, sizeof(int), 1, dgn_file); if (n_dgns >= MAXDUNGEON) panic("init_dungeons: too many dungeons"); for (i = 0; i < n_dgns; i++) { Fread((genericptr_t)&pd.tmpdungeon[i], sizeof(struct tmpdungeon), 1, dgn_file); #ifdef WIZARD if(!wizard) #endif if(pd.tmpdungeon[i].chance && (pd.tmpdungeon[i].chance <= rn2(100))) { int j; /* skip over any levels or branches */ for(j = 0; j < pd.tmpdungeon[i].levels; j++) Fread((genericptr_t)&pd.tmplevel[cl], sizeof(struct tmplevel), 1, dgn_file); for(j = 0; j < pd.tmpdungeon[i].branches; j++) Fread((genericptr_t)&pd.tmpbranch[cb], sizeof(struct tmpbranch), 1, dgn_file); n_dgns--; i--; continue; } Strcpy(dungeons[i].dname, pd.tmpdungeon[i].name); Strcpy(dungeons[i].proto, pd.tmpdungeon[i].protoname); dungeons[i].boneid = pd.tmpdungeon[i].boneschar; if(pd.tmpdungeon[i].lev.rand) dungeons[i].num_dunlevs = (xchar)rn1(pd.tmpdungeon[i].lev.rand, pd.tmpdungeon[i].lev.base); else dungeons[i].num_dunlevs = (xchar)pd.tmpdungeon[i].lev.base; if(!i) { dungeons[i].ledger_start = 0; dungeons[i].depth_start = 1; dungeons[i].dunlev_ureached = 1; } else { dungeons[i].ledger_start = dungeons[i-1].ledger_start + dungeons[i-1].num_dunlevs; dungeons[i].dunlev_ureached = 0; if (dungeons[i].ledger_start + dungeons[i].num_dunlevs > 127) panic("init_dungeons: too many levels"); } dungeons[i].flags.hellish = !!(pd.tmpdungeon[i].flags & HELLISH); dungeons[i].flags.maze_like = !!(pd.tmpdungeon[i].flags & MAZELIKE); dungeons[i].flags.rogue_like = !!(pd.tmpdungeon[i].flags & ROGUELIKE); dungeons[i].flags.align = ((pd.tmpdungeon[i].flags & D_ALIGN_MASK) >> 4); dungeons[i].entry_lev = 1; /* defaults to top level */ if (i) { /* set depth */ branch *br; schar from_depth; boolean from_up; int branch_num; for (branch_num = 0; branch_num < pd.n_brs; branch_num++) if (!strcmp(pd.tmpbranch[branch_num].name, dungeons[i].dname)) { br = add_branch(i, branch_num, &pd); break; } /* Set the dungeon entry level from the first branch */ dungeons[i].entry_lev = br->end2.dlevel; /* Get the depth of the connecting end. */ if (br->end1.dnum == i) { from_depth = depth(&br->end2); from_up = !br->end1_up; } else { from_depth = depth(&br->end1); from_up = br->end1_up; } /* * Calculate the depth of the top of the dungeon via * its branch. First, the depth of the entry point: * * depth of branch from "parent" dungeon * + -1 or 1 depending on a up or down stair or * 0 if portal * * Followed by the depth of the top of the dungeon: * * - (entry depth - 1) * * We'll say that portals stay on the same depth. */ dungeons[i].depth_start = from_depth + (br->type == BR_PORTAL ? 0 : (from_up ? -1 : 1)) - (dungeons[i].entry_lev - 1); } /* this is redundant - it should have been flagged by dgn_comp */ if(dungeons[i].num_dunlevs > MAXLEVEL) dungeons[i].num_dunlevs = MAXLEVEL; pd.start = pd.n_levs; /* save starting point */ pd.n_levs += pd.tmpdungeon[i].levels; if (pd.n_levs > LEV_LIMIT) panic("init_dungeon: too many special levels"); /* * Read in the prototype special levels. Don't add generated * special levels until they are all placed. */ for(; cl < pd.n_levs; cl++) { Fread((genericptr_t)&pd.tmplevel[cl], sizeof(struct tmplevel), 1, dgn_file); init_level(i, cl, &pd); } /* * Recursively place the generated levels for this dungeon. This * routine will attempt all possible combinations before giving * up. */ if (!place_level(pd.start, &pd)) panic("init_dungeon: couldn't place levels"); #ifdef DDEBUG fprintf(stderr, "--- end of dungeon %d ---\n", i); fflush(stderr); getchar(); #endif for (; pd.start < pd.n_levs; pd.start++) if (pd.final_lev[pd.start]) add_level(pd.final_lev[pd.start]); pd.n_brs += pd.tmpdungeon[i].branches; if (pd.n_brs > BRANCH_LIMIT) panic("init_dungeon: too many branches"); for(; cb < pd.n_brs; cb++) { int dgn; Fread((genericptr_t)&pd.tmpbranch[cb], sizeof(struct tmpbranch), 1, dgn_file); pd.tmpparent[cb] = i; for (dgn = 0; dgn < i; dgn++) if (!strcmp(pd.tmpbranch[cb].name, dungeons[dgn].dname)) { (void)add_branch(dgn, cb, &pd); break; } } } (void) dlb_fclose(dgn_file); for (i = 0; i < 5; i++) tune[i] = 'A' + rn2(7); tune[5] = 0; /* * Find most of the special levels and dungeons so we can access their * locations quickly. */ for (lev_map = level_map; lev_map->lev_name[0]; lev_map++) { x = find_level(lev_map->lev_name); if (x) { assign_level(lev_map->lev_spec, &x->dlevel); if (!strncmp(lev_map->lev_name, "x-", 2)) { /* This is where the name substitution on the * levels of the quest dungeon occur. */ Sprintf(x->proto, "%s%s", urole.filecode, &lev_map->lev_name[1]); } else if (lev_map->lev_spec == &knox_level) { branch *br; /* * Kludge to allow floating Knox entrance. We * specify a floating entrance by the fact that * its entrance (end1) has a bogus dnum, namely * n_dgns. */ for (br = branches; br; br = br->next) if (on_level(&br->end2, &knox_level)) break; if (br) br->end1.dnum = n_dgns; /* adjust the branch's position on the list */ insert_branch(br, TRUE); } } } /* * I hate hardwiring these names. :-( */ quest_dnum = dname_to_dnum("The Quest"); sokoban_dnum = dname_to_dnum("Sokoban"); mines_dnum = dname_to_dnum("The Gnomish Mines"); spiders_dnum = dname_to_dnum("The Spider Caves"); tower_dnum = dname_to_dnum("Vlad's Tower"); /* #ifdef BLACKMARKET blackmarket_dnum = dname_to_dnum("The Black Market"); #endif */ /* one special fixup for dummy surface level */ if ((x = find_level("dummy")) != 0) { i = x->dlevel.dnum; /* the code above puts earth one level above dungeon level #1, making the dummy level overlay level 1; but the whole reason for having the dummy level is to make earth have depth -1 instead of 0, so adjust the start point to shift endgame up */ if (dunlevs_in_dungeon(&x->dlevel) > 1 - dungeons[i].depth_start) dungeons[i].depth_start -= 1; /* TO DO: strip "dummy" out all the way here, so that it's hidden from feedback. */ } #ifdef DEBUG dumpit(); #endif } xchar dunlev(lev) /* return the level number for lev in *this* dungeon */ d_level *lev; { return(lev->dlevel); } xchar dunlevs_in_dungeon(lev) /* return the lowest level number for *this* dungeon*/ d_level *lev; { /* lowest level of Gnome Mines is gone for Gnomes */ if (Role_if(PM_GNOME) && lev->dnum == mines_dnum) { return((dungeons[lev->dnum].num_dunlevs)-1); } else return(dungeons[lev->dnum].num_dunlevs); } xchar real_dunlevs_in_dungeon(lev) /* return the lowest level number for *this* dungeon*/ d_level *lev; { /* this one is not altered for Gnomes */ return(dungeons[lev->dnum].num_dunlevs); } xchar deepest_lev_reached(noquest) /* return the lowest level explored in the game*/ boolean noquest; { /* this function is used for three purposes: to provide a factor * of difficulty in monster generation; to provide a factor of * difficulty in experience calculations (botl.c and end.c); and * to insert the deepest level reached in the game in the topten * display. the 'noquest' arg switch is required for the latter. * * from the player's point of view, going into the Quest is _not_ * going deeper into the dungeon -- it is going back "home", where * the dungeon starts at level 1. given the setup in dungeon.def, * the depth of the Quest (thought of as starting at level 1) is * never lower than the level of entry into the Quest, so we exclude * the Quest from the topten "deepest level reached" display * calculation. _However_ the Quest is a difficult dungeon, so we * include it in the factor of difficulty calculations. */ register int i; d_level tmp; register schar ret = 0; for(i = 0; i < n_dgns; i++) { if((tmp.dlevel = dungeons[i].dunlev_ureached) == 0) continue; if(!strcmp(dungeons[i].dname, "The Quest") && noquest) continue; tmp.dnum = i; if(depth(&tmp) > ret) ret = depth(&tmp); } return((xchar) ret); } /* return a bookkeeping level number for purpose of comparisons and * save/restore */ xchar ledger_no(lev) d_level *lev; { return((xchar)(lev->dlevel + dungeons[lev->dnum].ledger_start)); } /* * The last level in the bookkeeping list of level is the bottom of the last * dungeon in the dungeons[] array. * * Maxledgerno() -- which is the max number of levels in the bookkeeping * list, should not be confused with dunlevs_in_dungeon(lev) -- which * returns the max number of levels in lev's dungeon, and both should * not be confused with deepest_lev_reached() -- which returns the lowest * depth visited by the player. */ xchar maxledgerno() { return (xchar) (dungeons[n_dgns-1].ledger_start + dungeons[n_dgns-1].num_dunlevs); } /* return the dungeon that this ledgerno exists in */ xchar ledger_to_dnum(ledgerno) xchar ledgerno; { register int i; /* find i such that (i->base + 1) <= ledgerno <= (i->base + i->count) */ for (i = 0; i < n_dgns; i++) if (dungeons[i].ledger_start < ledgerno && ledgerno <= dungeons[i].ledger_start + dungeons[i].num_dunlevs) return (xchar)i; panic("level number out of range [ledger_to_dnum(%d)]", (int)ledgerno); /*NOT REACHED*/ return (xchar)0; } /* return the level of the dungeon this ledgerno exists in */ xchar ledger_to_dlev(ledgerno) xchar ledgerno; { return((xchar)(ledgerno - dungeons[ledger_to_dnum(ledgerno)].ledger_start)); } #endif /* OVL1 */ #ifdef OVL0 /* returns the depth of a level, in floors below the surface */ /* (note levels in different dungeons can have the same depth). */ schar depth(lev) d_level *lev; { return((schar)( dungeons[lev->dnum].depth_start + lev->dlevel - 1)); } boolean on_level(lev1, lev2) /* are "lev1" and "lev2" actually the same? */ d_level *lev1, *lev2; { return((boolean)((lev1->dnum == lev2->dnum) && (lev1->dlevel == lev2->dlevel))); } #endif /* OVL0 */ #ifdef OVL1 /* is this level referenced in the special level chain? */ s_level * Is_special(lev) d_level *lev; { s_level *levtmp; for (levtmp = sp_levchn; levtmp; levtmp = levtmp->next) if (on_level(lev, &levtmp->dlevel)) return(levtmp); return((s_level *)0); } /* * Is this a multi-dungeon branch level? If so, return a pointer to the * branch. Otherwise, return null. */ branch * Is_branchlev(lev) d_level *lev; { branch *curr; for (curr = branches; curr; curr = curr->next) { if (on_level(lev, &curr->end1) || on_level(lev, &curr->end2)) return curr; } return (branch *) 0; } /* goto the next level (or appropriate dungeon) */ void next_level(at_stairs) boolean at_stairs; { if (at_stairs && u.ux == sstairs.sx && u.uy == sstairs.sy) { /* Taking a down dungeon branch. */ goto_level(&sstairs.tolev, at_stairs, FALSE, FALSE); } else { /* Going down a stairs or jump in a trap door. */ d_level newlevel; newlevel.dnum = u.uz.dnum; newlevel.dlevel = u.uz.dlevel + 1; goto_level(&newlevel, at_stairs, !at_stairs, FALSE); } } /* goto the previous level (or appropriate dungeon) */ void prev_level(at_stairs) boolean at_stairs; { if (at_stairs && u.ux == sstairs.sx && u.uy == sstairs.sy) { /* Taking an up dungeon branch. */ /* KMH -- Upwards branches are okay if not level 1 */ /* (Just make sure it doesn't go above depth 1) */ if(!u.uz.dnum && u.uz.dlevel == 1 && !u.uhave.amulet) done(ESCAPED); else goto_level(&sstairs.tolev, at_stairs, FALSE, FALSE); } else { /* Going up a stairs or rising through the ceiling. */ d_level newlevel; newlevel.dnum = u.uz.dnum; newlevel.dlevel = u.uz.dlevel - 1; goto_level(&newlevel, at_stairs, FALSE, FALSE); } } void u_on_newpos(x, y) int x, y; { u.ux = x; u.uy = y; #ifdef CLIPPING cliparound(u.ux, u.uy); #endif #ifdef STEED /* ridden steed always shares hero's location */ if (u.usteed) u.usteed->mx = u.ux, u.usteed->my = u.uy; #endif } void u_on_sstairs() { /* place you on the special staircase */ if (sstairs.sx) { u_on_newpos(sstairs.sx, sstairs.sy); } else { /* code stolen from goto_level */ int trycnt = 0; xchar x, y; #ifdef DEBUG pline("u_on_sstairs: picking random spot"); #endif #define badspot(x,y) ((levl[x][y].typ != ROOM && levl[x][y].typ != CORR) || MON_AT(x, y)) do { x = rnd(COLNO-1); y = rn2(ROWNO); if (!badspot(x, y)) { u_on_newpos(x, y); return; } } while (++trycnt <= 500); panic("u_on_sstairs: could not relocate player!"); #undef badspot } } void u_on_upstairs() /* place you on upstairs (or special equivalent) */ { if (xupstair) { u_on_newpos(xupstair, yupstair); } else u_on_sstairs(); } void u_on_dnstairs() /* place you on dnstairs (or special equivalent) */ { if (xdnstair) { u_on_newpos(xdnstair, ydnstair); } else u_on_sstairs(); } boolean On_stairs(x, y) xchar x, y; { return((boolean)((x == xupstair && y == yupstair) || (x == xdnstair && y == ydnstair) || (x == xdnladder && y == ydnladder) || (x == xupladder && y == yupladder) || (x == sstairs.sx && y == sstairs.sy))); } boolean Is_botlevel(lev) d_level *lev; { return((boolean)(lev->dlevel == dungeons[lev->dnum].num_dunlevs)); } boolean Can_dig_down(lev) d_level *lev; { return((boolean)(!level.flags.hardfloor && !Is_botlevel(lev) && !Invocation_lev(lev))); } /* * Like Can_dig_down (above), but also allows falling through on the * stronghold level. Normally, the bottom level of a dungeon resists * both digging and falling. */ boolean Can_fall_thru(lev) d_level *lev; { return((boolean)(Can_dig_down(lev) || Is_stronghold(lev))); } /* * True if one can rise up a level (e.g. cursed gain level). * This happens on intermediate dungeon levels or on any top dungeon * level that has a stairwell style branch to the next higher dungeon. * Checks for amulets and such must be done elsewhere. */ boolean Can_rise_up(x, y, lev) int x, y; d_level *lev; { /* can't rise up from inside the top of the Wizard's tower */ /* KMH -- or in sokoban */ if (In_endgame(lev) || In_sokoban(lev) || (Is_wiz1_level(lev) && In_W_tower(x, y, lev))) return FALSE; return (boolean)(lev->dlevel > 1 || (dungeons[lev->dnum].entry_lev == 1 && ledger_no(lev) != 1 && sstairs.sx && sstairs.up)); } /* * It is expected that the second argument of get_level is a depth value, * either supplied by the user (teleport control) or randomly generated. * But more than one level can be at the same depth. If the target level * is "above" the present depth location, get_level must trace "up" from * the player's location (through the ancestors dungeons) the dungeon * within which the target level is located. With only one exception * which does not pass through this routine (see level_tele), teleporting * "down" is confined to the current dungeon. At present, level teleport * in dungeons that build up is confined within them. */ void get_level(newlevel, levnum) d_level *newlevel; int levnum; { branch *br; xchar dgn = u.uz.dnum; if (levnum <= 0) { /* can only currently happen in endgame */ levnum = u.uz.dlevel; } else if (levnum > dungeons[dgn].depth_start + dungeons[dgn].num_dunlevs - 1) { /* beyond end of dungeon, jump to last level */ levnum = dungeons[dgn].num_dunlevs; } else { /* The desired level is in this dungeon or a "higher" one. */ /* * Branch up the tree until we reach a dungeon that contains the * levnum. */ if (levnum < dungeons[dgn].depth_start) { do { /* * Find the parent dungeon of this dungeon. * * This assumes that end2 is always the "child" and it is * unique. */ for (br = branches; br; br = br->next) if (br->end2.dnum == dgn) break; if (!br) panic("get_level: can't find parent dungeon"); dgn = br->end1.dnum; } while (levnum < dungeons[dgn].depth_start); } /* We're within the same dungeon; calculate the level. */ levnum = levnum - dungeons[dgn].depth_start + 1; } newlevel->dnum = dgn; newlevel->dlevel = levnum; } #endif /* OVL1 */ #ifdef OVL0 boolean In_quest(lev) /* are you in the quest dungeon? */ d_level *lev; { return((boolean)(lev->dnum == quest_dnum)); } #endif /* OVL0 */ #ifdef OVL1 boolean In_mines(lev) /* are you in the mines dungeon? */ d_level *lev; { return((boolean)(lev->dnum == mines_dnum)); } boolean In_spiders(lev) /* are you in the spider dungeon? */ d_level *lev; { return((boolean)(lev->dnum == spiders_dnum)); } /* * Return the branch for the given dungeon. * * This function assumes: * + This is not called with "Dungeons of Doom". * + There is only _one_ branch to a given dungeon. * + Field end2 is the "child" dungeon. */ branch * dungeon_branch(s) const char *s; { branch *br; xchar dnum; dnum = dname_to_dnum(s); /* Find the branch that connects to dungeon i's branch. */ for (br = branches; br; br = br->next) if (br->end2.dnum == dnum) break; if (!br) panic("dgn_entrance: can't find entrance to %s", s); return br; } /* * This returns true if the hero is on the same level as the entrance to * the named dungeon. * * Called from do.c and mklev.c. * * Assumes that end1 is always the "parent". */ boolean at_dgn_entrance(s) const char *s; { branch *br; br = dungeon_branch(s); return((boolean)(on_level(&u.uz, &br->end1) ? TRUE : FALSE)); } boolean In_V_tower(lev) /* is `lev' part of Vlad's tower? */ d_level *lev; { return((boolean)(lev->dnum == tower_dnum)); } boolean On_W_tower_level(lev) /* is `lev' a level containing the Wizard's tower? */ d_level *lev; { return (boolean)(Is_wiz1_level(lev) || Is_wiz2_level(lev) || Is_wiz3_level(lev)); } boolean In_W_tower(x, y, lev) /* is of `lev' inside the Wizard's tower? */ int x, y; d_level *lev; { if (!On_W_tower_level(lev)) return FALSE; /* * Both of the exclusion regions for arriving via level teleport * (from above or below) define the tower's boundary. * assert( updest.nIJ == dndest.nIJ for I={l|h},J={x|y} ); */ if (dndest.nlx > 0) return (boolean)within_bounded_area(x, y, dndest.nlx, dndest.nly, dndest.nhx, dndest.nhy); else impossible("No boundary for Wizard's Tower?"); return FALSE; } #endif /* OVL1 */ #ifdef OVL0 boolean In_hell(lev) /* are you in one of the Hell levels? */ d_level *lev; { return((boolean)(dungeons[lev->dnum].flags.hellish)); } #endif /* OVL0 */ #ifdef OVL1 void find_hell(lev) /* sets *lev to be the gateway to Gehennom... */ d_level *lev; { lev->dnum = valley_level.dnum; lev->dlevel = 1; } void goto_hell(at_stairs, falling) /* go directly to hell... */ boolean at_stairs, falling; { d_level lev; find_hell(&lev); goto_level(&lev, at_stairs, falling, FALSE); } void assign_level(dest, src) /* equivalent to dest = source */ d_level *dest, *src; { dest->dnum = src->dnum; dest->dlevel = src->dlevel; } void assign_rnd_level(dest, src, range) /* dest = src + rn1(range) */ d_level *dest, *src; int range; { dest->dnum = src->dnum; dest->dlevel = src->dlevel + ((range > 0) ? rnd(range) : -rnd(-range)) ; if(dest->dlevel > dunlevs_in_dungeon(dest)) dest->dlevel = dunlevs_in_dungeon(dest); else if(dest->dlevel < 1) dest->dlevel = 1; } #endif /* OVL1 */ #ifdef OVL0 int induced_align(pct) int pct; { s_level *lev = Is_special(&u.uz); aligntyp al; if (lev && lev->flags.align) if(rn2(100) < pct) return(lev->flags.align); if(dungeons[u.uz.dnum].flags.align) if(rn2(100) < pct) return(dungeons[u.uz.dnum].flags.align); al = rn2(3) - 1; return(Align2amask(al)); } #endif /* OVL0 */ #ifdef OVL1 boolean Invocation_lev(lev) d_level *lev; { return((boolean)(In_hell(lev) && lev->dlevel == (dungeons[lev->dnum].num_dunlevs - 1))); } /* use instead of depth() wherever a degree of difficulty is made * dependent on the location in the dungeon (eg. monster creation). */ xchar level_difficulty() { if (In_endgame(&u.uz)) return((xchar)(depth(&sanctum_level) + u.ulevel/2)); else if (u.uhave.amulet) return(deepest_lev_reached(FALSE)); else return((xchar) depth(&u.uz)); } /* Take one word and try to match it to a level. * Recognized levels are as shown by print_dungeon(). */ schar lev_by_name(nam) const char *nam; { schar lev = 0; s_level *slev; d_level dlev; const char *p; int idx, idxtoo; char buf[BUFSZ]; /* allow strings like "the oracle level" to find "oracle" */ if (!strncmpi(nam, "the ", 4)) nam += 4; if ((p = strstri(nam, " level")) != 0 && p == eos((char*)nam) - 6) { nam = strcpy(buf, nam); *(eos(buf) - 6) = '\0'; } /* hell is the old name, and wouldn't match; gehennom would match its branch, yielding the castle level instead of the valley of the dead */ if (!strcmpi(nam, "gehennom") || !strcmpi(nam, "hell")) { if (In_V_tower(&u.uz)) nam = " to Vlad's tower"; /* branch to... */ else nam = "valley"; } if ((slev = find_level(nam)) != 0) { dlev = slev->dlevel; idx = ledger_no(&dlev); if ((dlev.dnum == u.uz.dnum || /* within same branch, or else main dungeon <-> gehennom */ (u.uz.dnum == valley_level.dnum && dlev.dnum == medusa_level.dnum) || (u.uz.dnum == medusa_level.dnum && dlev.dnum == valley_level.dnum)) && ( /* either wizard mode or else seen and not forgotten */ #ifdef WIZARD wizard || #endif (level_info[idx].flags & (FORGOTTEN|VISITED)) == VISITED)) { lev = depth(&slev->dlevel); } } else { /* not a specific level; try branch names */ idx = find_branch(nam, (struct proto_dungeon *)0); /* " to Xyzzy" */ if (idx < 0 && (p = strstri(nam, " to ")) != 0) idx = find_branch(p + 4, (struct proto_dungeon *)0); if (idx >= 0) { idxtoo = (idx >> 8) & 0x00FF; idx &= 0x00FF; if ( /* either wizard mode, or else _both_ sides of branch seen */ #ifdef WIZARD wizard || #endif ((level_info[idx].flags & (FORGOTTEN|VISITED)) == VISITED && (level_info[idxtoo].flags & (FORGOTTEN|VISITED)) == VISITED)) { if (ledger_to_dnum(idxtoo) == u.uz.dnum) idx = idxtoo; dlev.dnum = ledger_to_dnum(idx); dlev.dlevel = ledger_to_dlev(idx); lev = depth(&dlev); } } } return lev; } #ifdef WIZARD /* Convert a branch type to a string usable by print_dungeon(). */ STATIC_OVL const char * br_string(type) int type; { switch (type) { case BR_PORTAL: return "Portal"; case BR_NO_END1: return "Connection"; case BR_NO_END2: return "One way stair"; case BR_STAIR: return "Stair"; } return " (unknown)"; } /* Print all child branches between the lower and upper bounds. */ STATIC_OVL void print_branch(win, dnum, lower_bound, upper_bound, bymenu, lchoices) winid win; int dnum; int lower_bound; int upper_bound; boolean bymenu; struct lchoice *lchoices; { branch *br; char buf[BUFSZ]; anything any; /* This assumes that end1 is the "parent". */ for (br = branches; br; br = br->next) { if (br->end1.dnum == dnum && lower_bound < br->end1.dlevel && br->end1.dlevel <= upper_bound) { Sprintf(buf," %s to %s: %d", br_string(br->type), dungeons[br->end2.dnum].dname, depth(&br->end1)); if (bymenu) { lchoices->lev[lchoices->idx] = br->end1.dlevel; lchoices->dgn[lchoices->idx] = br->end1.dnum; lchoices->playerlev[lchoices->idx] = depth(&br->end1); any.a_void = 0; any.a_int = lchoices->idx + 1; add_menu(win, NO_GLYPH, &any, lchoices->menuletter, 0, ATR_NONE, buf, MENU_UNSELECTED); if (lchoices->menuletter == 'z') lchoices->menuletter = 'A'; else lchoices->menuletter++; lchoices->idx++; } else putstr(win, 0, buf); } } } /* Print available dungeon information. */ schar print_dungeon(bymenu, rlev, rdgn) boolean bymenu; schar *rlev; xchar *rdgn; { int i, last_level, nlev; char buf[BUFSZ]; boolean first; s_level *slev; dungeon *dptr; branch *br; anything any; struct lchoice lchoices; winid win = create_nhwindow(NHW_MENU); if (bymenu) { start_menu(win); lchoices.idx = 0; lchoices.menuletter = 'a'; } for (i = 0, dptr = dungeons; i < n_dgns; i++, dptr++) { nlev = dptr->num_dunlevs; if (nlev > 1) Sprintf(buf, "%s: levels %d to %d", dptr->dname, dptr->depth_start, dptr->depth_start + nlev - 1); else Sprintf(buf, "%s: level %d", dptr->dname, dptr->depth_start); /* Most entrances are uninteresting. */ if (dptr->entry_lev != 1) { if (dptr->entry_lev == nlev) Strcat(buf, ", entrance from below"); else Sprintf(eos(buf), ", entrance on %d", dptr->depth_start + dptr->entry_lev - 1); } if (bymenu) { any.a_void = 0; add_menu(win, NO_GLYPH, &any, 0, 0, iflags.menu_headings, buf, MENU_UNSELECTED); } else putstr(win, 0, buf); /* * Circle through the special levels to find levels that are in * this dungeon. */ for (slev = sp_levchn, last_level = 0; slev; slev = slev->next) { if (slev->dlevel.dnum != i) continue; /* print any branches before this level */ print_branch(win, i, last_level, slev->dlevel.dlevel, bymenu, &lchoices); Sprintf(buf, " %s: %d", slev->proto, depth(&slev->dlevel)); if (Is_stronghold(&slev->dlevel)) Sprintf(eos(buf), " (tune %s)", tune); if (bymenu) { /* If other floating branches are added, this will need to change */ if (i != knox_level.dnum) { lchoices.lev[lchoices.idx] = slev->dlevel.dlevel; lchoices.dgn[lchoices.idx] = i; } else { lchoices.lev[lchoices.idx] = depth(&slev->dlevel); lchoices.dgn[lchoices.idx] = 0; } lchoices.playerlev[lchoices.idx] = depth(&slev->dlevel); any.a_void = 0; any.a_int = lchoices.idx + 1; add_menu(win, NO_GLYPH, &any, lchoices.menuletter, 0, ATR_NONE, buf, MENU_UNSELECTED); if (lchoices.menuletter == 'z') lchoices.menuletter = 'A'; else lchoices.menuletter++; lchoices.idx++; } else putstr(win, 0, buf); last_level = slev->dlevel.dlevel; } /* print branches after the last special level */ print_branch(win, i, last_level, MAXLEVEL, bymenu, &lchoices); } /* Print out floating branches (if any). */ for (first = TRUE, br = branches; br; br = br->next) { if (br->end1.dnum == n_dgns) { if (first) { if (!bymenu) { putstr(win, 0, ""); putstr(win, 0, "Floating branches"); } first = FALSE; } Sprintf(buf, " %s to %s", br_string(br->type), dungeons[br->end2.dnum].dname); if (!bymenu) putstr(win, 0, buf); } } if (bymenu) { int n; menu_item *selected; int idx; end_menu(win, "Level teleport to where:"); n = select_menu(win, PICK_ONE, &selected); destroy_nhwindow(win); if (n > 0) { idx = selected[0].item.a_int - 1; free((genericptr_t)selected); if (rlev && rdgn) { *rlev = lchoices.lev[idx]; *rdgn = lchoices.dgn[idx]; return lchoices.playerlev[idx]; } } return 0; } /* I hate searching for the invocation pos while debugging. -dean */ if (Invocation_lev(&u.uz)) { putstr(win, 0, ""); Sprintf(buf, "Invocation position @ (%d,%d), hero @ (%d,%d)", inv_pos.x, inv_pos.y, u.ux, u.uy); putstr(win, 0, buf); } /* * The following is based on the assumption that the inter-level portals * created by the level compiler (not the dungeon compiler) only exist * one per level (currently true, of course). */ else if (Is_earthlevel(&u.uz) || Is_waterlevel(&u.uz) || Is_firelevel(&u.uz) || Is_airlevel(&u.uz)) { struct trap *trap; for (trap = ftrap; trap; trap = trap->ntrap) if (trap->ttyp == MAGIC_PORTAL) break; putstr(win, 0, ""); if (trap) Sprintf(buf, "Portal @ (%d,%d), hero @ (%d,%d)", trap->tx, trap->ty, u.ux, u.uy); else Sprintf(buf, "No portal found."); putstr(win, 0, buf); } display_nhwindow(win, TRUE); destroy_nhwindow(win); return 0; } #endif /* WIZARD */ #endif /* OVL1 */ /*dungeon.c*/ slashem-0.0.7E7F3/src/mhitu.c0000664000076400007640000025644610545462317013756 0ustar aliali/* SCCS Id: @(#)mhitu.c 3.4 2003/11/26 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" #include "artifact.h" #include "edog.h" STATIC_VAR NEARDATA struct obj *otmp; STATIC_DCL void FDECL(urustm, (struct monst *, struct obj *)); # ifdef OVL1 STATIC_DCL boolean FDECL(u_slip_free, (struct monst *,struct attack *)); STATIC_DCL int FDECL(passiveum, (struct permonst *,struct monst *,struct attack *)); # endif /* OVL1 */ #ifdef OVLB # ifdef SEDUCE STATIC_DCL void FDECL(mayberem, (struct obj *, const char *)); # endif #endif /* OVLB */ STATIC_DCL boolean FDECL(diseasemu, (struct permonst *)); STATIC_DCL int FDECL(hitmu, (struct monst *,struct attack *)); STATIC_DCL int FDECL(gulpmu, (struct monst *,struct attack *)); STATIC_DCL int FDECL(explmu, (struct monst *,struct attack *,BOOLEAN_P)); STATIC_DCL void FDECL(missmu,(struct monst *,int,int,struct attack *)); STATIC_DCL void FDECL(mswings,(struct monst *,struct obj *)); STATIC_DCL void FDECL(wildmiss, (struct monst *,struct attack *)); STATIC_DCL void FDECL(hurtarmor,(int)); STATIC_DCL void FDECL(hitmsg,(struct monst *,struct attack *)); /* See comment in mhitm.c. If we use this a lot it probably should be */ /* changed to a parameter to mhitu. */ static int dieroll; #ifdef OVL1 STATIC_OVL void hitmsg(mtmp, mattk) register struct monst *mtmp; register struct attack *mattk; { int compat; /* Note: if opposite gender, "seductively" */ /* If same gender, "engagingly" for nymph, normal msg for others */ if((compat = could_seduce(mtmp, &youmonst, mattk)) && !mtmp->mcan && !mtmp->mspec_used) { pline("%s %s you %s.", Monnam(mtmp), Blind ? "talks to" : "smiles at", compat == 2 ? "engagingly" : "seductively"); } else switch (mattk->aatyp) { case AT_CLAW: pline("%s claws you!", Monnam(mtmp)); break; case AT_BITE: pline("%s bites!", Monnam(mtmp)); break; case AT_KICK: pline("%s kicks%c", Monnam(mtmp), thick_skinned(youmonst.data) ? '.' : '!'); break; case AT_STNG: pline("%s stings!", Monnam(mtmp)); break; case AT_BUTT: pline("%s butts!", Monnam(mtmp)); break; case AT_TUCH: pline("%s touches you!", Monnam(mtmp)); break; case AT_TENT: pline("%s tentacles suck you!", s_suffix(Monnam(mtmp))); break; case AT_EXPL: case AT_BOOM: pline("%s explodes!", Monnam(mtmp)); break; case AT_MULTIPLY: /* No message. */ break; default: pline("%s hits!", Monnam(mtmp)); } } STATIC_OVL void missmu(mtmp, target, roll, mattk) /* monster missed you */ register struct monst *mtmp; register int target; register int roll; register struct attack *mattk; { register boolean nearmiss = (target == roll); register struct obj *blocker = (struct obj *)0; /* 3 values for blocker * No blocker: (struct obj *) 0 * Piece of armour: object * magical: &zeroobj */ if (target < roll) { /* get object responsible * Work from the closest to the skin outwards */ #ifdef TOURIST /* Try undershirt if tourist */ if (uarmu && target <= roll) { target += ARM_BONUS(uarmu); if (target > roll) blocker = uarmu; } #endif /* Try body armour */ if (uarm && target <= roll) { target += ARM_BONUS(uarm); if (target > roll) blocker = uarm; } if (uarmg && !rn2(10)) { /* Try gloves */ target += ARM_BONUS(uarmg); if (target > roll) blocker = uarmg; } if (uarmf && !rn2(10)) { /* Try boots */ target += ARM_BONUS(uarmf); if (target > roll) blocker = uarmf; } if (uarmh && !rn2(5)) { /* Try helm */ target += ARM_BONUS(uarmh); if (target > roll) blocker = uarmh; } if (uarmc && target <= roll) { /* Try cloak */ target += ARM_BONUS(uarmc); if (target > roll) blocker = uarmc; } if (uarms && target <= roll) { /* Try shield */ target += ARM_BONUS(uarms); if (target > roll) blocker = uarms; } if (target <= roll) { /* Try spell protection */ target += u.uspellprot; if (target > roll) blocker = &zeroobj; } } if (!canspotmon(mtmp)) map_invisible(mtmp->mx, mtmp->my); if(could_seduce(mtmp, &youmonst, mattk) && !mtmp->mcan) pline("%s pretends to be friendly.", Monnam(mtmp)); else { if (!flags.verbose || !nearmiss && !blocker) pline("%s misses.", Monnam(mtmp)); else if (!blocker) pline("%s just misses!", Monnam(mtmp)); else if (blocker == &zeroobj) pline("%s is stopped by the golden haze.", Monnam(mtmp)); else Your("%s %s%s %s attack.", simple_typename(blocker->otyp), rn2(2) ? "block" : "deflect", (blocker == uarmg || blocker == uarmf) ? "" : "s", s_suffix(mon_nam(mtmp))); if (MON_WEP(mtmp)) { struct obj *obj = MON_WEP(mtmp); obj->owornmask &= ~W_WEP; if (rnd(100) < (obj->oeroded * 5 / 2)) { if (obj->spe > -5) { obj->spe--; pline("%s %s is damaged further!", s_suffix(Monnam(mtmp)), xname(obj)); } else pline("%s %s is badly battered!", s_suffix(Monnam(mtmp)), xname(obj)); } } } stop_occupation(); } STATIC_OVL void mswings(mtmp, otemp) /* monster swings obj */ register struct monst *mtmp; register struct obj *otemp; { if (!flags.verbose || Blind || !mon_visible(mtmp)) 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 */ const char * mpoisons_subj(mtmp, mattk) struct monst *mtmp; struct attack *mattk; { if (mattk->aatyp == AT_WEAP) { struct obj *mwep = (mtmp == &youmonst) ? uwep : MON_WEP(mtmp); /* "Foo's attack was poisoned." is pretty lame, but at least it's better than "sting" when not a stinging attack... */ return (!mwep || !mwep->opoisoned) ? "attack" : "weapon"; } else { return (mattk->aatyp == AT_TUCH) ? "contact" : (mattk->aatyp == AT_GAZE) ? "gaze" : (mattk->aatyp == AT_BITE) ? "bite" : "sting"; } } /* called when your intrinsic speed is taken away */ void u_slow_down() { HFast = 0L; if (!Fast) You("slow down."); /* speed boots */ else Your("quickness feels less natural."); exercise(A_DEX, FALSE); } #endif /* OVL1 */ #ifdef OVLB STATIC_OVL void wildmiss(mtmp, mattk) /* monster attacked your displaced image */ register struct monst *mtmp; register struct attack *mattk; { int compat; /* no map_invisible() -- no way to tell where _this_ is coming from */ if (!flags.verbose) return; if (!cansee(mtmp->mx, mtmp->my)) return; /* maybe it's attacking an image around the corner? */ compat = (mattk->adtyp == AD_SEDU || mattk->adtyp == AD_SSEX) && could_seduce(mtmp, &youmonst, (struct attack *)0); if (!mtmp->mcansee || (Invis && !perceives(mtmp->data))) { const char *swings = mattk->aatyp == AT_BITE ? "snaps" : mattk->aatyp == AT_KICK ? "kicks" : (mattk->aatyp == AT_STNG || mattk->aatyp == AT_BUTT || nolimbs(mtmp->data)) ? "lunges" : "swings"; if (compat) pline("%s tries to touch you and misses!", Monnam(mtmp)); else switch(rn2(3)) { case 0: pline("%s %s wildly and misses!", Monnam(mtmp), swings); break; case 1: pline("%s attacks a spot beside you.", Monnam(mtmp)); break; case 2: pline("%s strikes at %s!", Monnam(mtmp), levl[mtmp->mux][mtmp->muy].typ == WATER ? "empty water" : "thin air"); break; default:pline("%s %s wildly!", Monnam(mtmp), swings); break; } } else if (Displaced) { if (compat) pline("%s smiles %s at your %sdisplaced image...", Monnam(mtmp), compat == 2 ? "engagingly" : "seductively", Invis ? "invisible " : ""); else pline("%s strikes at your %sdisplaced image and misses you!", /* Note: if you're both invisible and displaced, * only monsters which see invisible will attack your * displaced image, since the displaced image is also * invisible. */ Monnam(mtmp),Invis ? "invisible " : ""); } else if (Underwater) { /* monsters may miss especially on water level where bubbles shake the player here and there */ if (compat) pline("%s reaches towards your distorted image.",Monnam(mtmp)); else pline("%s is fooled by water reflections and misses!",Monnam(mtmp)); } else impossible("%s attacks you without knowing your location?", Monnam(mtmp)); } void expels(mtmp, mdat, message) register struct monst *mtmp; register struct permonst *mdat; /* if mtmp is polymorphed, mdat != mtmp->data */ boolean message; { if (message) { if (is_animal(mdat)) You("get regurgitated!"); else { char blast[40]; register int i; blast[0] = '\0'; for(i = 0; i < NATTK; i++) if(mdat->mattk[i].aatyp == AT_ENGL) break; if (mdat->mattk[i].aatyp != AT_ENGL) impossible("Swallower has no engulfing attack?"); else { if (is_whirly(mdat)) { switch (mdat->mattk[i].adtyp) { case AD_ELEC: Strcpy(blast, " in a shower of sparks"); break; case AD_COLD: Strcpy(blast, " in a blast of frost"); break; } } else Strcpy(blast, " with a squelch"); You("get expelled from %s%s!",mon_nam(mtmp), blast); } } } unstuck(mtmp); /* ball&chain returned in unstuck() */ mnexto(mtmp); newsym(u.ux,u.uy); spoteffects(TRUE); /* to cover for a case where mtmp is not in a next square */ if(um_dist(mtmp->mx,mtmp->my,1)) pline("Brrooaa... You land hard at some distance."); } #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; } /* Intelligent monsters try and avoid "blue on blue" incidents. */ STATIC_OVL int blue_on_blue(mtmp) struct monst *mtmp; { int x, y; struct monst *mon; if (!mtmp->mconf && !Conflict && !mtmp->mflee && !mindless(mtmp->data)) { if (!lined_up(mtmp)) return FALSE; /* Irrelevant; monster won't attack anyway */ x = mtmp->mx + sgn(tbx); y = mtmp->my + sgn(tby); while(x != mtmp->mux || y != mtmp->muy) { mon = m_at(x, y); if (mon && m_cansee(mtmp, x, y) && !mon->mundetected && (!mon->minvis || perceives(mtmp->data))) return TRUE; x += sgn(tbx); y += sgn(tby); } } return FALSE; } /* * mattacku: monster attacks you * returns 1 if monster dies (e.g. "yellow light"), 0 otherwise * Note: if you're displaced or invisible the monster might attack the * wrong position... * Assumption: it's attacking you or an empty square; if there's another * monster which it attacks by mistake, the caller had better * take care of it... */ int 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); /* Is it near you? Affects your actions */ boolean range2 = !monnear(mtmp, mtmp->mux, mtmp->muy); /* Does it think it's near you? Affects its actions */ boolean foundyou = (mtmp->mux==u.ux && mtmp->muy==u.uy); /* Is it attacking you or your image? */ boolean youseeit = canseemon(mtmp); /* Might be attacking your image around the corner, or * invisible, or you might be blind.... */ if(!ranged) nomul(0); if(mtmp->mhp <= 0 || (Underwater && !is_swimmer(mtmp->data))) return(0); /* If swallowed, can only be affected by u.ustuck */ if(u.uswallow) { if(mtmp != u.ustuck) return(0); u.ustuck->mux = u.ux; u.ustuck->muy = u.uy; range2 = 0; foundyou = 1; if(u.uinvulnerable) return (0); /* stomachs can't hurt you! */ } #ifdef STEED else if (u.usteed) { if (mtmp == u.usteed) /* Your steed won't attack you */ return (0); /* Orcs like to steal and eat horses and the like */ if (!rn2(is_orc(mtmp->data) ? 2 : 4) && distu(mtmp->mx, mtmp->my) <= 2) { /* Attack your steed instead */ 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)); } } #endif if (u.uundetected && !range2 && foundyou && !u.uswallow) { u.uundetected = 0; if (is_hider(youmonst.data)) { coord cc; /* maybe we need a unexto() function? */ struct obj *obj; You("fall from the %s!", ceiling(u.ux,u.uy)); if (enexto(&cc, u.ux, u.uy, youmonst.data)) { remove_monster(mtmp->mx, mtmp->my); newsym(mtmp->mx,mtmp->my); place_monster(mtmp, u.ux, u.uy); if(mtmp->wormno) worm_move(mtmp); teleds(cc.x, cc.y, TRUE); set_apparxy(mtmp); 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; else return 1; } if (youmonst.data->mlet != S_PIERCER) return(0); /* trappers don't attack */ obj = which_armor(mtmp, WORN_HELMET); if (obj && is_metallic(obj)) { Your("blow glances off %s helmet.", s_suffix(mon_nam(mtmp))); } else { if (3 + find_mac(mtmp) <= rnd(20)) { pline("%s is hit by a falling piercer (you)!", Monnam(mtmp)); if ((mtmp->mhp -= d(3,6)) < 1) killed(mtmp); } else pline("%s is almost hit by a falling piercer (you)!", Monnam(mtmp)); } } else { if (!youseeit) pline("It tries to move where you are hiding."); else { /* Ugly kludge for eggs. The message is phrased so as * to be directed at the monster, not the player, * which makes "laid by you" wrong. For the * parallelism to work, we can't rephrase it, so we * zap the "laid by you" momentarily instead. */ struct obj *obj = level.objects[u.ux][u.uy]; if (obj || (youmonst.data->mlet == S_EEL && is_pool(u.ux, u.uy))) { int save_spe = 0; /* suppress warning */ if (obj) { save_spe = obj->spe; if (obj->otyp == EGG) obj->spe = 0; } if (youmonst.data->mlet == S_EEL) pline("Wait, %s! There's a hidden %s named %s there!", m_monnam(mtmp), youmonst.data->mname, plname); else pline("Wait, %s! There's a %s named %s hiding under %s!", m_monnam(mtmp), youmonst.data->mname, plname, doname(level.objects[u.ux][u.uy])); if (obj) obj->spe = save_spe; } else impossible("hiding under nothing?"); } newsym(u.ux,u.uy); } 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); setustuck(mtmp); youmonst.m_ap_type = M_AP_NOTHING; youmonst.mappearance = 0; newsym(u.ux,u.uy); return(0); } /* player might be mimicking an object */ if (youmonst.m_ap_type == M_AP_OBJECT && !range2 && foundyou && !u.uswallow) { if (!youseeit) pline("%s %s!", Something, (likes_gold(mtmp->data) && youmonst.mappearance == GOLD_PIECE) ? "tries to pick you up" : "disturbs you"); else pline("Wait, %s! That %s is really %s named %s!", m_monnam(mtmp), mimic_obj_name(&youmonst), an(mons[u.umonnum].mname), plname); if (multi < 0) { /* this should always be the case */ char buf[BUFSZ]; Sprintf(buf, "You appear to be %s again.", Upolyd ? (const char *) an(youmonst.data->mname) : (const char *) "yourself"); unmul(buf); /* immediately stop mimicking */ } return 0; } /* Work out the armor class differential */ tmp = AC_VALUE(u.uac) + 10; /* tmp ~= 0 - 20 */ tmp += mtmp->m_lev; if(multi < 0) tmp += 4; if((Invis && !perceives(mdat)) || !mtmp->mcansee) tmp -= 2; if(mtmp->mtrapped) tmp -= 2; if(tmp <= 0) tmp = 1; /* make eels visible the moment they hit/miss us */ if(mdat->mlet == S_EEL && mtmp->minvis && cansee(mtmp->mx,mtmp->my)) { mtmp->minvis = 0; newsym(mtmp->mx,mtmp->my); } /* Make Star Vampires visible the moment they hit/miss us */ if(mtmp->data == &mons[PM_STAR_VAMPIRE] && mtmp->minvis && cansee(mtmp->mx, mtmp->my)) { mtmp->minvis = 0; newsym(mtmp->mx, mtmp->my); } /* Special demon handling code */ if(!mtmp->cham && is_demon(mdat) && !range2 && mtmp->data != &mons[PM_BALROG] && mtmp->data != &mons[PM_SUCCUBUS] && mtmp->data != &mons[PM_INCUBUS]) if(!mtmp->mcan && !rn2(13)) msummon(mtmp); /* Special lycanthrope handling code */ if(!mtmp->cham && is_were(mdat) && !range2) { if(is_human(mdat)) { if(!rn2(5 - (night() * 2)) && !mtmp->mcan) new_were(mtmp); } else if(!rn2(30) && !mtmp->mcan) new_were(mtmp); mdat = mtmp->data; if(!rn2(4) && !mtmp->mcan) { int numseen, numhelp; char buf[BUFSZ], genericwere[BUFSZ]; Strcpy(genericwere, "creature"); numhelp = were_summon(mdat, FALSE, &numseen, genericwere); if (youseeit) { pline("%s summons help!", Monnam(mtmp)); if (numhelp > 0) { if (numseen == 0) You_feel("hemmed in."); } else pline("But none comes."); } else { const char *from_nowhere; if (flags.soundok) { pline("%s %s!", Something, makeplural(growl_sound(mtmp))); from_nowhere = ""; } else from_nowhere = " from nowhere"; if (numhelp > 0) { if (numseen < 1) You_feel("hemmed in."); else { if (numseen == 1) Sprintf(buf, "%s appears", an(genericwere)); else Sprintf(buf, "%s appear", makeplural(genericwere)); pline("%s%s!", upstart(buf), from_nowhere); } } /* else no help came; but you didn't know it tried */ } } } 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 You_feel("%s move nearby.", something); } return (0); } /* Unlike defensive stuff, don't let them use item _and_ attack. */ if(!blue_on_blue(mtmp) && find_offensive(mtmp)) { int foo = use_offensive(mtmp); if (foo != 0) return(foo==1); } 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) { case AT_CLAW: /* "hand to hand" attacks */ case AT_KICK: case AT_BITE: case AT_STNG: case AT_TUCH: case AT_BUTT: case AT_TENT: if(!range2 && (!MON_WEP(mtmp) || mtmp->mconf || Conflict || !touch_petrifies(youmonst.data))) { if (foundyou) { if(tmp > (j = rnd(20+i))) { if (mattk->aatyp != AT_KICK || !thick_skinned(youmonst.data)) sum[i] = hitmu(mtmp, mattk); } else missmu(mtmp, tmp, j, mattk); } else wildmiss(mtmp, mattk); } break; case AT_HUGS: /* automatic if prev two attacks succeed */ /* Note: if displaced, prev attacks never succeeded */ if((!range2 && i>=2 && sum[i-1] && sum[i-2]) || mtmp == u.ustuck) sum[i]= hitmu(mtmp, mattk); break; case AT_GAZE: /* can affect you either ranged or not */ /* Medusa gaze already operated through m_respond in * dochug(); don't gaze more than once per round. */ if (mdat != &mons[PM_MEDUSA]) sum[i] = gazemu(mtmp, mattk); break; case AT_EXPL: /* automatic hit if next to, and aimed at you */ if(!range2) sum[i] = explmu(mtmp, mattk, foundyou); break; case AT_ENGL: if (!range2) { if(foundyou) { if(u.uswallow || tmp > (j = rnd(20+i))) { /* Force swallowing monster to be * displayed even when player is * moving away */ flush_screen(1); sum[i] = gulpmu(mtmp, mattk); } 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: if (range2 && !blue_on_blue(mtmp)) sum[i] = breamu(mtmp, mattk); /* Note: breamu takes care of displacement */ break; case AT_SPIT: if (range2 && !blue_on_blue(mtmp)) sum[i] = spitmu(mtmp, mattk); /* Note: spitmu takes care of displacement */ break; case AT_MULTIPLY: /* * Monster multiplying is an AT_ for the following * reasons: * 1. Monsters will only multiply when they're close * to you. The whole level will not become clogged * up with giant lice from monsters multiplying * where you can't see them. * 2. Tame monsters won't multiply. Too bad! (unless * they are conflicted or confused from hunger. * A bit of a "tactic" -- but then you'll have to * let them bite you, and anyway who really wants * a dozen pet fleas to feed?) * 3. Monsters have to be next to you to multiply. * This makes the inevitable altar abuse a little * harder. * 4. Elbereth will stop monsters multiplying. * Otherwise a ring of conflict would crowd out a * whole level in no time. * 5. It is a hack. (Shrug) * * Multiplying monsters must be low-level and * low-frequency, so as to minimise altar/experience * abuse. Any multiplying monsters above about * level 5 should be G_NOCORPSE. * * RJ */ if (!range2) clone_mon(mtmp, 0, 0); break; case AT_WEAP: if(range2) { #ifdef REINCARNATION if (!Is_rogue_level(&u.uz)) #endif if (!blue_on_blue(mtmp)) thrwmu(mtmp); } else { int hittmp = 0; /* Rare but not impossible. Normally the monster * wields when 2 spaces away, but it can be * teleported or whatever.... */ if (mtmp->weapon_check == NEED_WEAPON || !MON_WEP(mtmp)) { mtmp->weapon_check = NEED_HTH_WEAPON; /* mon_wield_item resets weapon_check as * appropriate */ if (mon_wield_item(mtmp) != 0) break; } if (foundyou) { otmp = MON_WEP(mtmp); if (otmp) { hittmp = hitval(otmp, &youmonst); tmp += hittmp; mswings(mtmp, otmp); } if(tmp > (j = dieroll = rnd(20+i))) sum[i] = hitmu(mtmp, mattk); else missmu(mtmp, tmp , j, mattk); /* KMH -- Don't accumulate to-hit bonuses */ if (otmp) tmp -= hittmp; } else wildmiss(mtmp, mattk); } break; case AT_MAGC: if (range2) { if (!blue_on_blue(mtmp)) 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 */ break; } if(flags.botl) bot(); /* give player a chance of waking up before dying -kaa */ if(sum[i] == 1) { /* successful attack */ if (u.usleep && u.usleep < monstermoves && !rn2(10)) { multi = -1; nomovemsg = "The combat suddenly awakens you."; } } if(sum[i] == 2) return 1; /* attacker dead */ if(sum[i] == 3) break; /* attacker teleported, no more attacks */ /* sum[i] == 0: unsuccessful attack */ } return(0); } #endif /* OVL0 */ #ifdef OVLB /* * helper function for some compilers that have trouble with hitmu */ STATIC_OVL void hurtarmor(attk) int attk; { int hurt; 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 * finds a target for the rust monster. * Head, feet, etc... not covered by metal, or covered by * rusty metal, are not targets. However, your body always * is, no matter what covers it. * * WAC fixed code so that it keeps looping until it either hits * your body or finds a rustable item * changed the last parm of !rust_dmg for non-body targets to FALSE */ while (1) { switch(rn2(5)) { case 0: if (!uarmh || !rust_dmg(uarmh, xname(uarmh), hurt, FALSE, &youmonst)) continue; break; case 1: if (uarmc) { (void)rust_dmg(uarmc, xname(uarmc), hurt, TRUE, &youmonst); break; } /* Note the difference between break and continue; * break means it was hit and didn't rust; continue * means it wasn't a target and though it didn't rust * something else did. */ if (uarm) (void)rust_dmg(uarm, xname(uarm), hurt, TRUE, &youmonst); #ifdef TOURIST else if (uarmu) (void)rust_dmg(uarmu, xname(uarmu), hurt, TRUE, &youmonst); #endif break; case 2: if (!uarms || !rust_dmg(uarms, xname(uarms), hurt, FALSE, &youmonst)) continue; break; case 3: if (!uarmg || !rust_dmg(uarmg, xname(uarmg), hurt, FALSE, &youmonst)) continue; break; case 4: if (!uarmf || !rust_dmg(uarmf, xname(uarmf), hurt, FALSE, &youmonst)) continue; break; } break; /* Out of while loop */ } } #endif /* OVLB */ #ifdef OVL1 STATIC_OVL boolean diseasemu(mdat) struct permonst *mdat; { if (Sick_resistance) { You_feel("a slight illness."); return FALSE; } else { make_sick(Sick ? Sick/3L + 1L : (long)rn1(ACURR(A_CON), 20), mdat->mname, TRUE, SICK_NONVOMITABLE); return TRUE; } } /* check whether slippery clothing protects from hug or wrap attack */ STATIC_OVL boolean u_slip_free(mtmp, mattk) struct monst *mtmp; struct attack *mattk; { struct obj *obj = (uarmc ? uarmc : uarm); #ifdef TOURIST if (!obj) obj = uarmu; #endif if (mattk->adtyp == AD_DRIN) obj = uarmh; /* if your cloak/armor is greased, monster slips off; this protection might fail (33% chance) when the armor is cursed */ if (obj && (obj->greased || obj->otyp == OILSKIN_CLOAK) && (!obj->cursed || rn2(3))) { pline("%s %s your %s %s!", Monnam(mtmp), (mattk->adtyp == AD_WRAP) ? "slips off of" : "grabs you, but cannot hold onto", obj->greased ? "greased" : "slippery", /* 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."); obj->greased = 0; update_inventory(); } return TRUE; /* 50% chance (with a luck bonus) of slipping free with free action */ } else if (Free_action && (rnl(10) < 5)) { pline("%s %s you, but you quickly free yourself!", Monnam(mtmp), (mattk->adtyp == AD_WRAP) ? "swings itself around of" : "grabs"); return TRUE; } return FALSE; } /* armor that sufficiently covers the body might be able to block magic */ int magic_negation(mon) struct monst *mon; { struct obj *armor; int armpro = 0; armor = (mon == &youmonst) ? uarm : which_armor(mon, W_ARM); if (armor && armpro < objects[armor->otyp].a_can) armpro = objects[armor->otyp].a_can; armor = (mon == &youmonst) ? uarmc : which_armor(mon, W_ARMC); if (armor && armpro < objects[armor->otyp].a_can) armpro = objects[armor->otyp].a_can; armor = (mon == &youmonst) ? uarmh : which_armor(mon, W_ARMH); if (armor && armpro < objects[armor->otyp].a_can) armpro = objects[armor->otyp].a_can; /* armor types for shirt, gloves, shoes, and shield don't currently provide any magic cancellation but we might as well be complete */ #ifdef TOURIST armor = (mon == &youmonst) ? uarmu : which_armor(mon, W_ARMU); if (armor && armpro < objects[armor->otyp].a_can) armpro = objects[armor->otyp].a_can; #endif armor = (mon == &youmonst) ? uarmg : which_armor(mon, W_ARMG); if (armor && armpro < objects[armor->otyp].a_can) armpro = objects[armor->otyp].a_can; armor = (mon == &youmonst) ? uarmf : which_armor(mon, W_ARMF); if (armor && armpro < objects[armor->otyp].a_can) armpro = objects[armor->otyp].a_can; armor = (mon == &youmonst) ? uarms : which_armor(mon, W_ARMS); if (armor && armpro < objects[armor->otyp].a_can) armpro = objects[armor->otyp].a_can; #ifdef STEED /* this one is really a stretch... */ armor = (mon == &youmonst) ? 0 : which_armor(mon, W_SADDLE); if (armor && armpro < objects[armor->otyp].a_can) armpro = objects[armor->otyp].a_can; #endif return armpro; } /* * hitmu: monster hits you * returns 2 if monster dies (e.g. "yellow light"), 1 otherwise * 3 if the monster lives but teleported/paralyzed, so it can't keep * attacking you */ STATIC_OVL int hitmu(mtmp, mattk) register struct monst *mtmp; register struct attack *mattk; { register struct permonst *mdat = mtmp->data; register int uncancelled, ptmp; int dmg, armpro, permdmg; char buf[BUFSZ]; struct permonst *olduasmon = youmonst.data; int res; boolean burnmsg = FALSE; if (!canspotmon(mtmp)) map_invisible(mtmp->mx, mtmp->my); /* If the monster is undetected & hits you, you should know where * the attack came from. */ if(mtmp->mundetected && (hides_under(mdat) || mdat->mlet == S_EEL)) { mtmp->mundetected = 0; if (!(Blind ? Blind_telepat : Unblind_telepat)) { struct obj *obj; const char *what; if ((obj = level.objects[mtmp->mx][mtmp->my]) != 0) { if (Blind && !obj->dknown) what = something; else if (is_pool(mtmp->mx, mtmp->my) && !Underwater) what = "the water"; else what = doname(obj); pline("%s was hidden under %s!", Amonnam(mtmp), what); } newsym(mtmp->mx, mtmp->my); } } /* First determine the base damage done */ dmg = d((int)mattk->damn, (int)mattk->damd); if(is_undead(mdat) && midnight()) dmg += d((int)mattk->damn, (int)mattk->damd); /* extra damage */ /* Next a cancellation factor */ /* Use uncancelled when the cancellation factor takes into account certain * armor's special magic protection. Otherwise just use !mtmp->mcan. */ armpro = magic_negation(&youmonst); uncancelled = !mtmp->mcan && ((rn2(3) >= armpro) || !rn2(50)); permdmg = 0; /* Now, adjust damages via resistances or specific attacks */ switch(mattk->adtyp) { case AD_PHYS: if (mattk->aatyp == AT_HUGS && !sticks(youmonst.data)) { if(!u.ustuck && rn2(2)) { if (u_slip_free(mtmp, mattk)) { dmg = 0; } else { setustuck(mtmp); pline("%s grabs you!", Monnam(mtmp)); } } else if(u.ustuck == mtmp) { exercise(A_STR, FALSE); if (mtmp->data == &mons[PM_ROPE_GOLEM] && Breathless) { You("are being strangled."); dmg = (dmg+1) / 2; } else You("are being %s.", (mtmp->data == &mons[PM_ROPE_GOLEM]) ? "choked" : "crushed"); } } else { /* hand to hand weapon */ if(mattk->aatyp == AT_WEAP && otmp) { int nopoison = (10 - (otmp->owt/10)); if (otmp->otyp == CORPSE && touch_petrifies(&mons[otmp->corpsenm])) { dmg = 1; pline("%s hits you with the %s corpse.", Monnam(mtmp), mons[otmp->corpsenm].mname); if (!Stoned) goto do_stone; } /* MRKR: If hit with a burning torch, */ /* then do an extra point of damage */ /* but save the message till after */ /* the hitmsg() */ if (otmp->otyp == TORCH && otmp->lamplit && !Fire_resistance) { burnmsg = TRUE; dmg++; } /* WAC -- Real weapon? * Could be stuck with a cursed bow/polearm it wielded */ if (/* if you strike with a bow... */ is_launcher(otmp) || /* or strike with a missile in your hand... */ (is_missile(otmp) || is_ammo(otmp)) || #ifdef LIGHTSABERS /* lightsaber that isn't lit ;) */ (is_lightsaber(otmp) && !otmp->lamplit) || #endif /* WAC -- or using a pole at short range... */ (is_pole(otmp))) { /* then do only 1-2 points of damage */ if (u.umonnum == PM_SHADE && otmp->otyp != SILVER_ARROW) dmg = 0; else dmg = rnd(2); #if 0 /* Monsters don't wield boomerangs */ if (otmp->otyp == BOOMERANG /* && !rnl(3) */) { pline("As %s hits you, %s breaks into splinters.", mon_nam(mtmp), the(xname(otmp))); useup(otmp); otmp = (struct obj *) 0; possibly_unwield(mtmp); if (u.umonnum != PM_SHADE) dmg++; } #endif } else dmg += dmgval(otmp, &youmonst); if (objects[otmp->otyp].oc_material == SILVER && hates_silver(youmonst.data)) { pline("The silver sears your flesh!"); } /* Stakes do extra dmg agains vamps */ if (otmp->otyp == WOODEN_STAKE && is_vampire(youmonst.data)) { if (otmp->oartifact == ART_STAKE_OF_VAN_HELSING) { if (!rn2(10)) { pline("%s plunges the stake into your heart.", Monnam(mtmp)); killer = "a wooden stake in the heart."; killer_format = KILLED_BY_AN; u.ugrave_arise = NON_PM; /* No corpse */ done(DIED); } else { pline("%s drives the stake into you.", Monnam(mtmp)); dmg += rnd(6) + 2; } } else { pline("%s drives the stake into you.", Monnam(mtmp)); dmg += rnd(6); } } if (otmp->opoisoned) { poisoned(simple_typename(otmp->otyp), A_STR, killer_xname(otmp), 10); if (nopoison < 2) nopoison = 2; if (!rn2(nopoison)) { otmp->opoisoned = FALSE; pline("%s %s no longer poisoned.", s_suffix(Monnam(mtmp)), aobjnam(otmp, "are")); } } if (dmg <= 0) dmg = 1; if (!otmp->oartifact || !artifact_hit(mtmp, &youmonst, otmp, &dmg, dieroll)) hitmsg(mtmp, mattk); if (burnmsg) { boolean plural = (Blind ? FALSE : otmp->quan > 1L); boolean water = (youmonst.data == &mons[PM_WATER_ELEMENTAL]); pline("%s %s%s %syou!", (Blind ? "It" : Yname2(otmp)), (water ? "vaporize" : "burn"), (plural ? "" : "s"), (water ? "part of " : "")); if (!rn2(2) && burnarmor(&youmonst)) { dmg++; /* Torch flame is not hot enough to guarantee */ /* burning away slime */ if (!rn2(4)) burn_away_slime(); if (!rn2(3)) (void)destroy_item(POTION_CLASS, AD_FIRE); if (!rn2(3)) (void)destroy_item(SCROLL_CLASS, AD_FIRE); if (!rn2(5)) (void)destroy_item(SPBOOK_CLASS, AD_FIRE); } burn_faster(otmp, 1); } 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 * take the damage _before_ being cloned. */ if (u.uac < 0) dmg += u.uac; if (dmg < 1) dmg = 1; if (dmg > 1) exercise(A_STR, FALSE); u.mh -= dmg; flags.botl = 1; dmg = 0; if(cloneu()) You("divide as %s hits you!",mon_nam(mtmp)); } urustm(mtmp, otmp); } else if (mattk->aatyp != AT_TUCH || dmg != 0 || mtmp != u.ustuck) hitmsg(mtmp, mattk); } break; case AD_DISE: hitmsg(mtmp, mattk); if (!diseasemu(mdat) || Invulnerable) dmg = 0; break; case AD_FIRE: hitmsg(mtmp, mattk); if (uncancelled) { pline("You're %s!", on_fire(youmonst.data, mattk)); if (youmonst.data == &mons[PM_STRAW_GOLEM] || youmonst.data == &mons[PM_PAPER_GOLEM]) { You("roast!"); /* KMH -- this is okay with unchanging */ rehumanize(); break; } else if (Fire_resistance) { pline_The("fire doesn't feel hot!"); dmg = 0; } else if (u.umonnum == PM_STRAW_GOLEM || u.umonnum == PM_PAPER_GOLEM || u.umonnum == PM_WAX_GOLEM) { /* This code ASSUMES that you are polymorphed * Code will need to be changed if we ever implement * Golems as a class. */ You("burn up!"); u.uhp -= mons[u.umonnum].mlevel; u.uhpmax -= mons[u.umonnum].mlevel; if (u.uhpmax < 1) u.uhpmax = 1; /* KMH, balance patch -- this is okay with unchanging */ u.mh = 0; /* Kill monster form */ rehumanize(); break; } 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); burn_away_slime(); } else dmg = 0; break; case AD_COLD: hitmsg(mtmp, mattk); if (uncancelled) { pline("You're covered in frost!"); if (Cold_resistance) { pline_The("frost doesn't seem cold!"); dmg = 0; } if((int) mtmp->m_lev > rn2(20)) destroy_item(POTION_CLASS, AD_COLD); } else dmg = 0; break; case AD_ELEC: hitmsg(mtmp, mattk); if (uncancelled) { You("get zapped!"); if (Shock_resistance) { pline_The("zap doesn't shock you!"); dmg = 0; } if((int) mtmp->m_lev > rn2(20)) destroy_item(WAND_CLASS, AD_ELEC); if((int) mtmp->m_lev > rn2(20)) destroy_item(RING_CLASS, AD_ELEC); } else dmg = 0; break; case AD_SLEE: hitmsg(mtmp, mattk); if (uncancelled && multi >= 0 && !rn2(5)) { if (Sleep_resistance) break; fall_asleep(-rnd(10), TRUE); if (Blind) You("are put to sleep!"); else You("are put to sleep by %s!", mon_nam(mtmp)); } break; case AD_BLND: 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; case AD_DRST: ptmp = A_STR; goto dopois; case AD_DRDX: ptmp = A_DEX; goto dopois; case AD_DRCO: ptmp = A_CON; dopois: hitmsg(mtmp, mattk); if (uncancelled && !rn2(8)) { Sprintf(buf, "%s %s", s_suffix(Monnam(mtmp)), mpoisons_subj(mtmp, mattk)); poisoned(buf, ptmp, mdat->mname, 30); } break; case AD_DRIN: 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; if (uarmh && rn2(8)) { /* not body_part(HEAD) */ Your("helmet blocks the attack to your head."); break; } /* conflicted dog, perhaps? */ if (mtmp->mtame && !mtmp->isminion) { EDOG(mtmp)->hungrytime += rnd(60); mtmp->mconf = 0; } if (Half_physical_damage) dmg = (dmg+1) / 2; mdamageu(mtmp, dmg); if (!uarmh || uarmh->otyp != DUNCE_CAP) { Your("brain is eaten!"); /* No such thing as mindless players... */ if (ABASE(A_INT) <= ATTRMIN(A_INT)) { int lifesaved = 0; struct obj *wore_amulet = uamul; while(1) { /* avoid looping on "die(y/n)?" */ if (lifesaved && (discover || wizard)) { if (wore_amulet && !uamul) { /* used up AMULET_OF_LIFE_SAVING; still subject to dying from brainlessness */ wore_amulet = 0; } else { /* explicitly chose not to die; arbitrarily boost intelligence */ ABASE(A_INT) = ATTRMIN(A_INT) + 2; You_feel("like a scarecrow."); break; } } if (lifesaved) pline("Unfortunately your brain is still gone."); else Your("last thought fades away."); killer = "brainlessness"; killer_format = KILLED_BY; done(DIED); lifesaved++; } } } /* adjattrib gives dunce cap message when appropriate */ (void) adjattrib(A_INT, -rnd(2), FALSE); forget_levels(25); /* lose memory of 25% of levels */ forget_objects(25); /* lose memory of 25% of objects */ exercise(A_WIS, FALSE); break; case AD_PLYS: hitmsg(mtmp, mattk); if (uncancelled && multi >= 0 && !rn2(3)) { if (Free_action) { You("momentarily stiffen."); } else { if (Blind) You("are frozen!"); else You("are frozen by %s!", mon_nam(mtmp)); nomovemsg = 0; /* default: "you can move again" */ nomul(-rnd(10)); exercise(A_DEX, FALSE); } } break; case AD_TCKL: hitmsg(mtmp, mattk); if (uncancelled && multi >= 0 && !rn2(3)) { if (Free_action) You_feel("horrible tentacles probing your flesh!"); else { if (Blind) You("are mercilessly tickled!"); else You("are mercilessly tickled by %s!", mon_nam(mtmp)); nomovemsg = 0; /* default: "you can move again" */ nomul(-rnd(10)); exercise(A_DEX, FALSE); exercise(A_CON, FALSE); } } break; case AD_DRLI: hitmsg(mtmp, mattk); /* if vampire biting (and also a pet) */ if (is_vampire(mtmp->data) && mattk->aatyp == AT_BITE && has_blood(youmonst.data)) { Your("blood is being drained!"); /* Get 1/20th of full corpse value * Therefore 4 bites == 1 drink */ if (mtmp->mtame && !mtmp->isminion) EDOG(mtmp)->hungrytime += ((int)((youmonst.data)->cnutrit / 20) + 1); } if (uncancelled && !rn2(3) && !Drain_resistance) { losexp("life drainage", FALSE); } break; case AD_LEGS: { register long side = rn2(2) ? RIGHT_SIDE : LEFT_SIDE; const char *sidestr = (side == RIGHT_SIDE) ? "right" : "left"; /* This case is too obvious to ignore, but Nethack is not in * general very good at considering height--most short monsters * still _can_ attack you when you're flying or mounted. * [FIXME: why can't a flying attacker overcome this?] */ if ( #ifdef STEED u.usteed || #endif Levitation || Flying) { pline("%s tries to reach your %s %s!", Monnam(mtmp), sidestr, body_part(LEG)); dmg = 0; } else if (mtmp->mcan) { pline("%s nuzzles against your %s %s!", Monnam(mtmp), sidestr, body_part(LEG)); dmg = 0; } else { if (uarmf) { if (rn2(2) && (uarmf->otyp == LOW_BOOTS || uarmf->otyp == IRON_SHOES)) pline("%s pricks the exposed part of your %s %s!", Monnam(mtmp), sidestr, body_part(LEG)); else if (!rn2(5)) pline("%s pricks through your %s boot!", Monnam(mtmp), sidestr); else { pline("%s scratches your %s boot!", Monnam(mtmp), sidestr); dmg = 0; break; } } else pline("%s pricks your %s %s!", Monnam(mtmp), sidestr, body_part(LEG)); set_wounded_legs(side, rnd(60-ACURR(A_DEX))); exercise(A_STR, FALSE); exercise(A_DEX, FALSE); } break; } 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)); } else { if (flags.soundok) You_hear("%s hissing!", s_suffix(mon_nam(mtmp))); 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; delayed_killer = mtmp->data->mname; if (mtmp->data->geno & G_UNIQ) { if (!type_is_pname(mtmp->data)) { static char kbuf[BUFSZ]; /* "the" buffer may be reallocated */ Strcpy(kbuf, the(delayed_killer)); delayed_killer = kbuf; } killer_format = KILLED_BY; } else killer_format = KILLED_BY_AN; return(1); /* You("turn to stone..."); */ /* done_in_by(mtmp); */ } } } } break; case AD_STCK: hitmsg(mtmp, mattk); if (uncancelled && !u.ustuck && !sticks(youmonst.data)) setustuck(mtmp); break; case AD_WRAP: if ((!mtmp->mcan || u.ustuck == mtmp) && !sticks(youmonst.data)) { if (!u.ustuck && !rn2(10)) { if (u_slip_free(mtmp, mattk)) { dmg = 0; } else { pline("%s swings itself around you!", Monnam(mtmp)); setustuck(mtmp); } } else if(u.ustuck == mtmp) { if (is_pool(mtmp->mx,mtmp->my) && !Swimming && !Amphibious) { boolean moat = (levl[mtmp->mx][mtmp->my].typ != POOL) && (levl[mtmp->mx][mtmp->my].typ != WATER) && !Is_medusa_level(&u.uz) && !Is_waterlevel(&u.uz); pline("%s drowns you...", Monnam(mtmp)); killer_format = KILLED_BY_AN; Sprintf(buf, "%s by %s", moat ? "moat" : "pool of water", an(mtmp->data->mname)); killer = buf; done(DROWNING); } else if(mattk->aatyp == AT_HUGS) You("are being crushed."); } else { dmg = 0; if(flags.verbose) pline("%s brushes against your %s.", Monnam(mtmp), body_part(LEG)); } } else dmg = 0; break; case AD_WERE: hitmsg(mtmp, mattk); if (uncancelled && !rn2(4) && u.ulycn == NON_PM && !Protection_from_shape_changers && !is_were(youmonst.data) && !defends(AD_WERE,uwep)) { You_feel("feverish."); exercise(A_CON, FALSE); u.ulycn = monsndx(mdat); upermonst.mflags2 |= (M2_WERE); } break; case AD_SGLD: hitmsg(mtmp, mattk); if (youmonst.data->mlet == mdat->mlet) break; if(!mtmp->mcan) stealgold(mtmp); break; case AD_SITM: /* for now these are the same */ case AD_SEDU: if (is_animal(mtmp->data)) { hitmsg(mtmp, mattk); if (mtmp->mcan) break; /* Continue below */ } else if (dmgtype(youmonst.data, AD_SEDU) #ifdef SEDUCE || dmgtype(youmonst.data, AD_SSEX) #endif ) { pline("%s %s.", Monnam(mtmp), mtmp->minvent ? "brags about the goods some dungeon explorer provided" : "makes some remarks about how difficult theft is lately"); if (!tele_restrict(mtmp)) (void) rloc(mtmp, FALSE); return 3; } else if (mtmp->mcan) { if (!Blind) { /* * We use flags.female here on the basis that the * monster chooses whether to charm or to seduce * based on your visible gender. --ALI */ int do_charm = is_neuter(mdat) || \ flags.female == mtmp->female; pline("%s tries to %s you, but you seem %s.", Adjmonnam(mtmp, "plain"), do_charm ? "charm" : "seduce", do_charm ? "unaffected" : "uninterested"); } if(rn2(3)) { if (!tele_restrict(mtmp)) (void) rloc(mtmp, FALSE); return 3; } break; } buf[0] = '\0'; switch (steal(mtmp, buf)) { case -1: return 2; case 0: break; default: if (!is_animal(mtmp->data) && !tele_restrict(mtmp)) (void) rloc(mtmp, FALSE); if (is_animal(mtmp->data) && *buf) { 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; #ifdef SEDUCE case AD_SSEX: if(could_seduce(mtmp, &youmonst, mattk) == 1 && !mtmp->mcan) if (doseduce(mtmp)) return 3; break; #endif case AD_SAMU: hitmsg(mtmp, mattk); /* when the Wiz hits, 1/20 steals the amulet */ if (u.uhave.amulet || u.uhave.bell || u.uhave.book || u.uhave.menorah || u.uhave.questart) /* carrying the Quest Artifact */ if (!rn2(20)) stealamulet(mtmp); break; case AD_TLPT: hitmsg(mtmp, mattk); if (uncancelled) { if(flags.verbose) Your("position suddenly seems very uncertain!"); tele(); } break; case AD_RUST: hitmsg(mtmp, mattk); if (mtmp->mcan) break; if (u.umonnum == PM_IRON_GOLEM) { You("rust!"); u.uhp -= mons[u.umonnum].mlevel; u.uhpmax -= mons[u.umonnum].mlevel; if (u.uhpmax < 1) u.uhpmax = 1; /* KMH, balance patch -- this is okay with unchanging */ u.mh = 0; rehumanize(); break; } hurtarmor(AD_RUST); break; case AD_CORR: hitmsg(mtmp, mattk); if (mtmp->mcan) break; hurtarmor(AD_CORR); break; case AD_DCAY: hitmsg(mtmp, mattk); if (mtmp->mcan) break; if (u.umonnum == PM_WOOD_GOLEM || u.umonnum == PM_LEATHER_GOLEM) { You("rot!"); u.uhp -= mons[u.umonnum].mlevel; u.uhpmax -= mons[u.umonnum].mlevel; if (u.uhpmax < 1) u.uhpmax = 1; u.mh = 0; /* KMH, balance patch -- this is okay with unchanging */ rehumanize(); break; } hurtarmor(AD_DCAY); break; case AD_HEAL: /* a cancelled nurse is just an ordinary monster */ if (mtmp->mcan) { hitmsg(mtmp, mattk); break; } if(!uwep #ifdef TOURIST && !uarmu #endif && !uarm && !uarmh && !uarms && !uarmg && !uarmc && !uarmf) { boolean goaway = FALSE; pline("%s hits! (I hope you don't mind.)", Monnam(mtmp)); if (Upolyd) { u.mh += rnd(7); /* STEPHEN WHITE'S NEW CODE */ if (!rn2(7)) { /* no upper limit necessary; effect is temporary */ u.mhmax++; if (!rn2(13)) goaway = TRUE; } if (u.mh > u.mhmax) u.mh = u.mhmax; } else { u.uhp += rnd(7); if (!rn2(7)) { /* hard upper limit via nurse care: 25 * ulevel */ if (u.uhpmax < 5 * u.ulevel + d(2 * u.ulevel, 10)) { u.uhpmax++; } if (!rn2(13)) goaway = TRUE; } if (u.uhp > u.uhpmax) u.uhp = u.uhpmax; } if (!rn2(3)) exercise(A_STR, TRUE); if (!rn2(3)) exercise(A_CON, TRUE); if (Sick) make_sick(0L, (char *) 0, FALSE, SICK_ALL); flags.botl = 1; if (goaway) { mongone(mtmp); return 2; } else if (!rn2(33)) { if (!tele_restrict(mtmp)) (void) rloc(mtmp, FALSE); monflee(mtmp, d(3, 6), TRUE, FALSE); return 3; } dmg = 0; } else { if (Role_if(PM_HEALER)) { if (flags.soundok && !(moves % 5)) verbalize("Doc, I can't help you unless you cooperate."); dmg = 0; } else hitmsg(mtmp, mattk); } break; case AD_CURS: hitmsg(mtmp, mattk); if(!night() && mdat == &mons[PM_GREMLIN]) break; if(!mtmp->mcan && !rn2(10)) { if (flags.soundok) { if (Blind) You_hear("laughter."); else pline("%s chuckles.", Monnam(mtmp)); } if (u.umonnum == PM_CLAY_GOLEM) { pline("Some writing vanishes from your head!"); u.uhp -= mons[u.umonnum].mlevel; u.uhpmax -= mons[u.umonnum].mlevel; if (u.uhpmax < 1) u.uhpmax = 1; /* KMH, balance patch -- this is okay with unchanging */ u.mh = 0; rehumanize(); break; } attrcurse(); } break; case AD_STUN: hitmsg(mtmp, mattk); if(!mtmp->mcan && !rn2(4)) { make_stunned(HStun + dmg, TRUE); dmg /= 2; } break; case AD_ACID: hitmsg(mtmp, mattk); if(!mtmp->mcan && !rn2(3)) { if (Acid_resistance) { pline("You're covered in acid, but it seems harmless."); dmg = 0; } else { pline("You're covered in acid! It burns!"); exercise(A_STR, FALSE); } } else dmg = 0; break; case AD_SLOW: hitmsg(mtmp, mattk); if (uncancelled && HFast && !defends(AD_SLOW, uwep) && !rn2(4)) u_slow_down(); break; case AD_DREN: hitmsg(mtmp, mattk); if (uncancelled && !rn2(4)) drain_en(dmg); dmg = 0; break; case AD_CONF: hitmsg(mtmp, mattk); if(!mtmp->mcan && !rn2(4) && !mtmp->mspec_used) { mtmp->mspec_used = mtmp->mspec_used + (dmg + rn2(6)); if(Confusion) You("are getting even more confused."); 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)) { /* Still does normal damage */ 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: pline("%s reaches out, and you feel fever and chills.", Monnam(mtmp)); (void) diseasemu(mdat); /* plus the normal damage */ /* No damage if invulnerable; setting dmg zero prevents * "You are unharmed!" after a sickness inducing attack */ if (Invulnerable) dmg = 0; break; case AD_FAMN: pline("%s reaches out, and your body shrivels.", Monnam(mtmp)); exercise(A_CON, FALSE); if (!is_fainted()) morehungry(rn1(40,40)); /* plus the normal damage */ break; case AD_CALM: /* KMH -- koala attack */ hitmsg(mtmp, mattk); if (uncancelled) docalm(); break; case AD_POLY: hitmsg(mtmp, mattk); if (uncancelled && !Unchanging && !Antimagic) { if (flags.verbose) You("undergo a freakish metamorphosis!"); polyself(FALSE); } break; case AD_SLIM: hitmsg(mtmp, mattk); if (!uncancelled) break; if (flaming(youmonst.data)) { 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; } if(u.uhp < 1) done_in_by(mtmp); /* Negative armor class reduces damage done instead of fully protecting * against hits. */ if (dmg && u.uac < -10) { int tempval; tempval = rnd(-(10 + u.uac)/5+1); if (tempval < 1) tempval = 1; if (tempval > 10) tempval = 10; dmg -= tempval; if (dmg < 1) dmg = 1; } if(dmg) { if (Half_physical_damage /* Mitre of Holiness */ || (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 (DEADMONSTER(mtmp)) res = 2; else if (dmg) res = passiveum(olduasmon, mtmp, mattk); else res = 1; stop_occupation(); return res; } #endif /* OVL1 */ #ifdef OVLB STATIC_OVL int gulpmu(mtmp, mattk) /* monster swallows you, or damage if u.uswallow */ register struct monst *mtmp; register struct attack *mattk; { struct trap *t = t_at(u.ux, u.uy); int tmp = d((int)mattk->damn, (int)mattk->damd); int tim_tmp; register struct obj *otmp2; int i; if (!u.uswallow) { /* swallows you */ if (youmonst.data->msize >= MZ_HUGE) return(0); if ((t && ((t->ttyp == PIT) || (t->ttyp == SPIKED_PIT))) && sobj_at(BOULDER, u.ux, u.uy)) return(0); if (Punished) unplacebc(); /* ball&chain go away */ remove_monster(mtmp->mx, mtmp->my); mtmp->mtrapped = 0; /* no longer on old trap */ place_monster(mtmp, u.ux, u.uy); newsym(mtmp->mx,mtmp->my); #ifdef STEED if (is_animal(mtmp->data) && u.usteed) { char buf[BUFSZ]; /* Too many quirks presently if hero and steed * are swallowed. Pretend purple worms don't * like horses for now :-) */ Strcpy(buf, mon_nam(u.usteed)); pline ("%s lunges forward and plucks you off %s!", Monnam(mtmp), buf); dismount_steed(DISMOUNT_ENGULFED); } else #endif pline("%s engulfs you!", Monnam(mtmp)); stop_occupation(); reset_occupations(); /* behave as if you had moved */ if (u.utrap) { You("are released from the %s!", u.utraptype==TT_WEB ? "web" : "trap"); u.utrap = 0; } i = number_leashed(); if (i > 0) { const 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)) { minstapetrify(mtmp, TRUE); if (mtmp->mhp > 0) return 0; else return 2; } display_nhwindow(WIN_MESSAGE, FALSE); vision_recalc(2); /* hero can't see anything */ u.uswallow = 1; setustuck(mtmp); /* u.uswldtim always set > 1 */ tim_tmp = 25 - (int)mtmp->m_lev; if (tim_tmp > 0) tim_tmp = rnd(tim_tmp) / 2; else if (tim_tmp < 0) tim_tmp = -(rnd(-tim_tmp) / 2); tim_tmp += -u.uac + 10; u.uswldtim = (unsigned)((tim_tmp < 2) ? 2 : tim_tmp); swallowed(1); for (otmp2 = invent; otmp2; otmp2 = otmp2->nobj) (void) snuff_lit(otmp2); } if (mtmp != u.ustuck) return(0); if (u.uswldtim > 0) u.uswldtim -= 1; switch(mattk->adtyp) { case AD_DGST: if (Slow_digestion) { /* Messages are handled below */ u.uswldtim = 0; tmp = 0; } else if (u.uswldtim == 0) { pline("%s totally digests you!", Monnam(mtmp)); tmp = u.uhp; if (Half_physical_damage) tmp *= 2; /* sorry */ } else { pline("%s%s digests you!", Monnam(mtmp), (u.uswldtim == 2) ? " thoroughly" : (u.uswldtim == 1) ? " utterly" : ""); exercise(A_STR, FALSE); } break; case AD_PHYS: if (mtmp->data == &mons[PM_FOG_CLOUD]) { You("are laden with moisture and %s", flaming(youmonst.data) ? "are smoldering out!" : Breathless ? "find it mildly uncomfortable." : amphibious(youmonst.data) ? "feel comforted." : "can barely breathe!"); /* NB: Amphibious includes Breathless */ if (Amphibious && !flaming(youmonst.data)) tmp = 0; } else { You("are pummeled with debris!"); exercise(A_STR, FALSE); } break; case AD_ACID: if (Acid_resistance) { You("are covered with a seemingly harmless goo."); tmp = 0; } else { if (Hallucination) pline("Ouch! You've been slimed!"); else You("are covered in slime! It burns!"); exercise(A_STR, FALSE); } /* Mik: Go corrode a few things... */ if (mtmp->data == &mons[PM_SHOGGOTH] || mtmp->data == &mons[PM_GIANT_SHOGGOTH]) { for (otmp2 = invent; otmp2; otmp2 = otmp2->nobj) if (is_corrodeable(otmp2)) (void) rust_dmg(otmp2, xname(otmp2), 3, FALSE, &youmonst); } else { for (otmp2 = invent; otmp2; otmp2 = otmp2->nobj) if (is_corrodeable(otmp2) && !rn2(9)) (void) rust_dmg(otmp2, xname(otmp2), 3, FALSE, &youmonst); } break; case AD_BLND: if (can_blnd(mtmp, &youmonst, mattk->aatyp, (struct obj*)0)) { 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); } tmp = 0; break; case AD_ELEC: if(!mtmp->mcan && rn2(2)) { pline_The("air around you crackles with electricity."); if (Shock_resistance) { shieldeff(u.ux, u.uy); You("seem unhurt."); ugolemeffects(AD_ELEC,tmp); tmp = 0; } } else tmp = 0; break; case AD_COLD: if(!mtmp->mcan && rn2(2)) { if (Cold_resistance) { shieldeff(u.ux, u.uy); You_feel("mildly chilly."); ugolemeffects(AD_COLD,tmp); tmp = 0; } else You("are freezing to death!"); } else tmp = 0; break; case AD_FIRE: if(!mtmp->mcan && rn2(2)) { if (Fire_resistance) { shieldeff(u.ux, u.uy); You_feel("mildly hot."); ugolemeffects(AD_FIRE,tmp); tmp = 0; } else You("are burning to a crisp!"); burn_away_slime(); } else tmp = 0; break; case AD_DISE: if (!diseasemu(mtmp->data)) tmp = 0; break; default: tmp = 0; break; } if (Half_physical_damage) tmp = (tmp+1) / 2; mdamageu(mtmp, tmp); if (tmp) stop_occupation(); if (touch_petrifies(youmonst.data) && !resists_ston(mtmp)) { pline("%s very hurriedly %s you!", Monnam(mtmp), is_animal(mtmp->data)? "regurgitates" : "expels"); expels(mtmp, mtmp->data, FALSE); } else if (!u.uswldtim || youmonst.data->msize >= MZ_HUGE) { You("get %s!", is_animal(mtmp->data)? "regurgitated" : "expelled"); if (flags.verbose && (is_animal(mtmp->data) || (dmgtype(mtmp->data, AD_DGST) && Slow_digestion))) pline("Obviously %s doesn't like your taste.", mon_nam(mtmp)); expels(mtmp, mtmp->data, FALSE); } return(1); } STATIC_OVL int explmu(mtmp, mattk, ufound) /* monster explodes in your face */ register struct monst *mtmp; register struct attack *mattk; boolean ufound; { if (mtmp->mcan) return(0); if (!ufound) pline("%s explodes at a spot in %s!", canseemon(mtmp) ? Monnam(mtmp) : "It", levl[mtmp->mux][mtmp->muy].typ == WATER ? "empty water" : "thin air"); else { register int tmp = d((int)mattk->damn, (int)mattk->damd); register boolean not_affected = defends((int)mattk->adtyp, uwep); hitmsg(mtmp, mattk); switch (mattk->adtyp) { case AD_COLD: not_affected |= Cold_resistance; goto common; case AD_FIRE: not_affected |= Fire_resistance; goto common; case AD_ELEC: not_affected |= Shock_resistance; common: if (!not_affected) { if (ACURR(A_DEX) > rnd(20)) { You("duck some of the blast."); tmp = (tmp+1) / 2; } else { if (flags.verbose) You("get blasted!"); } if (mattk->adtyp == AD_FIRE) burn_away_slime(); if (Half_physical_damage) tmp = (tmp+1) / 2; mdamageu(mtmp, tmp); } break; case AD_BLND: not_affected = resists_blnd(&youmonst); if (!not_affected) { /* sometimes you're affected even if it's invisible */ 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."); } break; case AD_HALU: not_affected |= Blind || (u.umonnum == PM_BLACK_LIGHT || u.umonnum == PM_VIOLET_FUNGUS || dmgtype(youmonst.data, AD_STUN)); if (!not_affected) { boolean chg; if (!Hallucination) You("are caught in a blast of kaleidoscopic light!"); chg = make_hallucinated(HHallucination + (long)tmp,FALSE,0L); You("%s.", chg ? "are freaked out" : "seem unaffected"); } break; default: break; } if (not_affected) { You("seem unaffected by it."); ugolemeffects((int)mattk->adtyp, tmp); } } mondead(mtmp); wake_nearto(mtmp->mx, mtmp->my, 7*7); if (mtmp->mhp > 0) return(0); return(2); /* it dies */ } int gazemu(mtmp, mattk) /* monster gazes at you */ register struct monst *mtmp; register struct attack *mattk; { switch(mattk->adtyp) { case AD_STON: if (mtmp->mcan || !mtmp->mcansee) { if (!canseemon(mtmp)) break; /* silently */ pline("%s %s.", Monnam(mtmp), (mtmp->data == &mons[PM_MEDUSA] && mtmp->mcan) ? "doesn't look all that ugly" : "gazes ineffectually"); break; } if (Reflecting && couldsee(mtmp->mx, mtmp->my) && mtmp->data == &mons[PM_MEDUSA]) { /* hero has line of sight to Medusa and she's not blind */ boolean useeit = canseemon(mtmp); if (useeit) (void) ureflects("%s gaze is reflected by your %s.", s_suffix(Monnam(mtmp))); if (mon_reflects(mtmp, !useeit ? (char *)0 : "The gaze is reflected away by %s %s!")) break; if (!m_canseeu(mtmp)) { /* probably you're invisible */ if (useeit) pline( "%s doesn't seem to notice that %s gaze was reflected.", Monnam(mtmp), mhis(mtmp)); break; } if (useeit) pline("%s is turned to stone!", Monnam(mtmp)); stoned = TRUE; killed(mtmp); 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)); if(!Confusion) pline("%s gaze confuses you!", s_suffix(Monnam(mtmp))); 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)); pline("%s stares piercingly at you!", Monnam(mtmp)); make_stunned(HStun + stun, TRUE); 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 */ #if 0 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))); } break; #endif case AD_SLOW: if(!mtmp->mcan && canseemon(mtmp) && mtmp->mcansee && (HFast & (INTRINSIC|TIMEOUT)) && !defends(AD_SLOW, uwep) && !rn2(4)) u_slow_down(); stop_occupation(); break; #endif case AD_SLEE: if(!mtmp->mcan && canseemon(mtmp) && mtmp->mcansee && !mtmp->mspec_used && rn2(3)) { if (Displaced && rn2(3)) { if (!Blind) pline("%s gazes at your displaced image!",Monnam(mtmp)); break; } if ((Invisible && rn2(3)) || rn2(4)) { if (!Blind) pline("%s gazes around, but misses you!",Monnam(mtmp)); break; } if (!Blind) pline("%s gazes directly at you!",Monnam(mtmp)); if(Reflecting && m_canseeu(mtmp) && !mtmp->mcan) { if(!Blind) { (void) ureflects("%s gaze is reflected by your %s.", s_suffix(Monnam(mtmp))); if (mon_reflects(mtmp, "The gaze is reflected away by %s %s!")) break; } if (sleep_monst(mtmp, rnd(10), -1) && !Blind) pline("%s is put to sleep!", Monnam(mtmp)); break; } else if (Sleep_resistance) { pline("You yawn."); } else { nomul(-rnd(10)); u.usleep = 1; nomovemsg = "You wake up."; if (Blind) You("are put to sleep!"); else You("are put to sleep by %s!",mon_nam(mtmp)); } } break; case AD_DETH: if(!mtmp->mcan && canseemon(mtmp) && mtmp->mcansee && !mtmp->mspec_used && rn2(4)) { if (Displaced && rn2(3)) { if (!Blind) pline("%s gazes at your displaced image!",Monnam(mtmp)); break; } if ((Invisible && rn2(3)) || rn2(4)) { if (!Blind) pline("%s gazes around, but misses you!",Monnam(mtmp)); break; } if (!Blind) pline("%s gazes directly at you!",Monnam(mtmp)); if(Reflecting && m_canseeu(mtmp) && !mtmp->mcan) { if(!Blind) { (void) ureflects("%s gaze is reflected by your %s.", s_suffix(Monnam(mtmp))); if (mon_reflects(mtmp, "The gaze is reflected away by %s %s!")) break; pline("%s is killed by its own gaze of death!", Monnam(mtmp)); } killed(mtmp); if (mtmp->mhp > 0) break; return 2; } else if (is_undead(youmonst.data)) { /* Still does normal damage */ pline("Was that the gaze of death?"); break; } else if (Antimagic) { You("shudder momentarily..."); } else { You("die..."); killer_format = KILLED_BY_AN; killer = "gaze of death"; done(DIED); } } break; case AD_PHYS: if(!mtmp->mcan && canseemon(mtmp) && mtmp->mcansee && !mtmp->mspec_used && rn2(3)) { if (Displaced && rn2(3)) { if (!Blind) pline("%s gazes at your displaced image!",Monnam(mtmp)); break; } if ((Invisible && rn2(3)) || rn2(4)) { if (!Blind) pline("%s gazes around, but misses you!",Monnam(mtmp)); break; } if (!Blind) pline("%s gazes directly at you!",Monnam(mtmp)); pline("You are wracked with pains!"); mdamageu(mtmp, d(3,8)); } break; case AD_DRST: if(!mtmp->mcan && canseemon(mtmp) && mtmp->mcansee && !mtmp->mspec_used && rn2(5)) { pline("%s stares into your eyes...", Monnam(mtmp)); poisoned("The gaze", A_STR, mtmp->data->mname, 30); } break; case AD_PLYS: if(!mtmp->mcan && multi >= 0 && canseemon(mtmp) && mtmp->mcansee && !mtmp->mspec_used && rn2(5)) { pline("%s stares at you!", Monnam(mtmp)); if (Free_action) You("stiffen momentarily."); else { You("are frozen by %s!", mon_nam(mtmp)); nomovemsg = 0; nomul(-rnd(4)); exercise(A_DEX, FALSE); } } break; case AD_TLPT: if(!mtmp->mcan && canseemon(mtmp) && mtmp->mcansee && !mtmp->mspec_used && rn2(5)) { pline("%s stares blinkingly at you!", Monnam(mtmp)); if(flags.verbose) Your("position suddenly seems very uncertain!"); tele(); } break; default: impossible("Gaze attack %d?", mattk->adtyp); break; } return(0); } #endif /* OVLB */ #ifdef OVL1 void mdamageu(mtmp, n) /* mtmp hits you for n points damage */ register struct monst *mtmp; register int n; { if (Invulnerable) n=0; if (n == 0) { pline("You are unharmed."); return; } /* WAC For consistency...DO be careful using techniques ;B */ if (mtmp->mtame != 0 && tech_inuse(T_PRIMAL_ROAR)) { n *= 2; /* Double Damage! */ } #ifdef SHOW_DMG if (flags.showdmg) pline("[%d pts.]", n); #endif flags.botl = 1; /* This needs to be AFTER the pline for botl to be * updated correctly -- Kelly Bailey */ if (Upolyd) { u.mh -= n; if (u.mh < 1) { if (Polymorph_control || !rn2(3)) { u.uhp -= mons[u.umonnum].mlevel; u.uhpmax -= mons[u.umonnum].mlevel; if (u.uhpmax < 1) u.uhpmax = 1; } rehumanize(); } } else { u.uhp -= n; if(u.uhp < 1) done_in_by(mtmp); } } #endif /* OVL1 */ #ifdef OVLB STATIC_OVL void urustm(mon, obj) register struct monst *mon; register struct obj *obj; { boolean vis; 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; else return; vis = cansee(mon->mx, mon->my); if ((is_acid ? is_corrodeable(obj) : is_rustprone(obj)) && (is_acid ? obj->oeroded2 : obj->oeroded) < MAX_ERODE) { if (obj->greased || obj->oerodeproof || (obj->blessed && rn2(3))) { if (vis) pline("Somehow, %s weapon is not affected.", s_suffix(mon_nam(mon))); if (obj->greased && !rn2(2)) obj->greased = 0; } else { if (vis) pline("%s %s%s!", s_suffix(Monnam(mon)), aobjnam(obj, (is_acid ? "corrode" : "rust")), (is_acid ? obj->oeroded2 : obj->oeroded) ? " further" : ""); if (is_acid) obj->oeroded2++; else obj->oeroded++; } } } #endif /* OVLB */ #ifdef OVL1 int could_seduce(magr,mdef,mattk) struct monst *magr, *mdef; struct attack *mattk; /* returns 0 if seduction impossible, * 1 if fine, * 2 if wrong gender for nymph */ { register struct permonst *pagr; boolean agrinvis, defperc; xchar genagr, gendef; if (is_animal(magr->data)) return (0); if(magr == &youmonst) { pagr = youmonst.data; agrinvis = (Invis != 0); genagr = poly_gender(); } else { pagr = magr->data; agrinvis = magr->minvis; genagr = gender(magr); } if(mdef == &youmonst) { defperc = (See_invisible != 0); gendef = poly_gender(); } else { defperc = perceives(mdef->data); gendef = gender(mdef); } if(agrinvis && !defperc #ifdef SEDUCE && mattk && mattk->adtyp != AD_SSEX #endif ) return 0; if(pagr->mlet != S_NYMPH && ((pagr != &mons[PM_INCUBUS] && pagr != &mons[PM_SUCCUBUS]) #ifdef SEDUCE || (mattk && mattk->adtyp != AD_SSEX) #endif )) return 0; if(genagr == 1 - gendef) return 1; else return (pagr->mlet == S_NYMPH) ? 2 : 0; } #endif /* OVL1 */ #ifdef OVLB #ifdef SEDUCE /* Returns 1 if monster teleported */ int doseduce(mon) register struct monst *mon; { register struct obj *ring, *nring; boolean fem = (mon->data == &mons[PM_SUCCUBUS]); /* otherwise incubus */ char qbuf[QBUFSZ]; 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; } if (unconscious()) { pline("%s seems dismayed at your lack of response.", Monnam(mon)); return 0; } if (Blind) pline("It caresses you..."); else You_feel("very attracted to %s.", mon_nam(mon)); for(ring = invent; ring; ring = nring) { nring = ring->nobj; if (ring->otyp != RIN_ADORNMENT) continue; if (fem) { if (rn2(20) < ACURR(A_CHA)) { Sprintf(qbuf, "\"That %s looks pretty. May I have it?\"", safe_qbuf("",sizeof("\"That looks pretty. May I have it?\""), xname(ring), simple_typename(ring->otyp), "ring")); makeknown(RIN_ADORNMENT); if (yn(qbuf) == 'n') continue; } else pline("%s decides she'd like your %s, and takes it.", Blind ? "She" : Monnam(mon), xname(ring)); makeknown(RIN_ADORNMENT); if (ring==uleft || ring==uright) Ring_gone(ring); if (ring==uwep) setuwep((struct obj *)0, FALSE); if (ring==uswapwep) setuswapwep((struct obj *)0, FALSE); if (ring==uquiver) setuqwep((struct obj *)0); freeinv(ring); (void) mpickobj(mon,ring); } else { char buf[BUFSZ]; if (uleft && uright && uleft->otyp == RIN_ADORNMENT && uright->otyp==RIN_ADORNMENT) break; if (ring==uleft || ring==uright) continue; if (rn2(20) < ACURR(A_CHA)) { Sprintf(qbuf,"\"That %s looks pretty. Would you wear it for me?\"", safe_qbuf("", sizeof("\"That looks pretty. Would you wear it for me?\""), xname(ring), simple_typename(ring->otyp), "ring")); makeknown(RIN_ADORNMENT); if (yn(qbuf) == 'n') continue; } else { pline("%s decides you'd look prettier wearing your %s,", Blind ? "He" : Monnam(mon), xname(ring)); pline("and puts it on your finger."); } makeknown(RIN_ADORNMENT); if (!uright) { pline("%s puts %s on your right %s.", Blind ? "He" : Monnam(mon), the(xname(ring)), body_part(HAND)); setworn(ring, RIGHT_RING); } else if (!uleft) { pline("%s puts %s on your left %s.", Blind ? "He" : Monnam(mon), the(xname(ring)), body_part(HAND)); setworn(ring, LEFT_RING); } else if (uright && uright->otyp != RIN_ADORNMENT) { Strcpy(buf, xname(uright)); pline("%s replaces your %s with your %s.", Blind ? "He" : Monnam(mon), buf, xname(ring)); Ring_gone(uright); setworn(ring, RIGHT_RING); } else if (uleft && uleft->otyp != RIN_ADORNMENT) { Strcpy(buf, xname(uleft)); pline("%s replaces your %s with your %s.", Blind ? "He" : Monnam(mon), buf, xname(ring)); Ring_gone(uleft); setworn(ring, LEFT_RING); } else impossible("ring replacement"); Ring_on(ring); prinv((char *)0, ring, 0L); } } if (!uarmc && !uarmf && !uarmg && !uarms && !uarmh #ifdef TOURIST && !uarmu #endif ) pline("%s murmurs sweet nothings into your ear.", Blind ? (fem ? "She" : "He") : Monnam(mon)); 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"); if(!uwep || !welded(uwep)) mayberem(uarmg, "gloves"); /* * STEPHEN WHITE'S NEW CODE * * This will cause a game crash should the if statment be removed. * It will try to de-referance a pointer that doesn't exist should * the player not have a shield */ if (uarms) mayberem(uarms, "shield"); mayberem(uarmh, "helmet"); #ifdef TOURIST if(!uarmc && !uarm) mayberem(uarmu, "shirt"); #endif if (uarm || uarmc) { verbalize("You're such a %s; I wish...", flags.female ? "sweet lady" : "nice guy"); if (!tele_restrict(mon)) (void) rloc(mon, FALSE); return 1; } if (u.ualign.type == A_CHAOTIC) adjalign(1); /* 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)); /* Well, IT happened ... */ u.uconduct.celibacy++; 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; u.uenmax -= rnd(Half_physical_damage ? 5 : 10); exercise(A_CON, FALSE); if (u.uenmax < 0) u.uenmax = 0; break; case 1: You("are down in the dumps."); (void) adjattrib(A_CON, -1, TRUE); exercise(A_CON, FALSE); flags.botl = 1; break; case 2: Your("senses are dulled."); (void) adjattrib(A_WIS, -1, TRUE); exercise(A_WIS, FALSE); flags.botl = 1; break; case 3: if (!Drain_resistance) { You_feel("out of shape."); losexp("overexertion", FALSE); } else { You("have a curious feeling..."); } break; case 4: { int tmp; You_feel("exhausted."); exercise(A_STR, FALSE); tmp = rn1(10, 6); if(Half_physical_damage) tmp = (tmp+1) / 2; losehp(tmp, "exhaustion", KILLED_BY); break; } } } 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) cost = (long) rnd(LARGEST_INT) + 500L; else cost = (long) rnd((int)u.ugold + 10) + 500L; if (mon->mpeaceful) { cost /= 5L; if (!cost) cost = 1L; } 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)) (void) rloc(mon, FALSE); return 1; } STATIC_OVL void mayberem(obj, str) register struct obj *obj; const char *str; { char qbuf[QBUFSZ]; if (!obj || !obj->owornmask) return; if (rn2(20) < ACURR(A_CHA)) { Sprintf(qbuf,"\"Shall I remove your %s, %s?\"", str, (!rn2(2) ? "lover" : !rn2(2) ? "dear" : "sweetheart")); if (yn(qbuf) == 'n') return; } else { char hairbuf[BUFSZ]; Sprintf(hairbuf, "let me run my fingers through your %s", body_part(HAIR)); verbalize("Take off your %s; %s.", str, (obj == uarm) ? "let's get a little closer" : (obj == uarmc || obj == uarms) ? "it's in the way" : (obj == uarmf) ? "let me rub your feet" : (obj == uarmg) ? "they're too clumsy" : #ifdef TOURIST (obj == uarmu) ? "let me massage you" : #endif /* obj == uarmh */ hairbuf); } remove_worn_item(obj, TRUE); } #endif /* SEDUCE */ #endif /* OVLB */ #ifdef OVL1 STATIC_OVL int passiveum(olduasmon,mtmp,mattk) struct permonst *olduasmon; register struct monst *mtmp; register struct attack *mattk; { int i, tmp; for(i = 0; ; i++) { if(i >= NATTK) return 1; if (olduasmon->mattk[i].aatyp == AT_NONE || olduasmon->mattk[i].aatyp == AT_BOOM) break; } if (olduasmon->mattk[i].damn) tmp = d((int)olduasmon->mattk[i].damn, (int)olduasmon->mattk[i].damd); else if(olduasmon->mattk[i].damd) tmp = d((int)olduasmon->mlevel+1, (int)olduasmon->mattk[i].damd); else tmp = 0; /* These affect the enemy even if you were "killed" (rehumanized) */ switch(olduasmon->mattk[i].adtyp) { case AD_ACID: if (!rn2(2)) { pline("%s is splashed by your acid!", Monnam(mtmp)); if (resists_acid(mtmp)) { pline("%s is not affected.", Monnam(mtmp)); tmp = 0; } } 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 */ { long protector = attk_protection((int)mattk->aatyp), wornitems = mtmp->misc_worn_check; /* wielded weapon gives same protection as gloves here */ if (MON_WEP(mtmp) != 0) wornitems |= W_ARMG; if (!resists_ston(mtmp) && (protector == 0L || (protector != ~0L && (wornitems & protector) != protector))) { if (poly_when_stoned(mtmp->data)) { mon_to_stone(mtmp); return (1); } pline("%s turns to stone!", Monnam(mtmp)); stoned = 1; xkilled(mtmp, 0); if (mtmp->mhp > 0) return 1; return 2; } return 1; } case AD_ENCH: /* KMH -- remove enchantment (disenchanter) */ if (otmp) { (void) drain_item(otmp); /* No message */ } return (1); default: break; } if (!Upolyd) return 1; /* These affect the enemy only if you are still a monster */ if (rn2(3)) switch(youmonst.data->mattk[i].adtyp) { case AD_PHYS: if (youmonst.data->mattk[i].aatyp == AT_BOOM) { You("explode!"); /* KMH, balance patch -- this is okay with unchanging */ rehumanize(); goto assess_dmg; } break; case AD_PLYS: /* Floating eye */ if (tmp > 127) tmp = 127; if (u.umonnum == PM_FLOATING_EYE) { if (!rn2(4)) tmp = 127; if (mtmp->mcansee && haseyes(mtmp->data) && rn2(3) && (perceives(mtmp->data) || !Invis)) { if (Blind) pline("As a blind %s, you cannot defend yourself.", youmonst.data->mname); else { if (mon_reflects(mtmp, "Your gaze is reflected by %s %s.")) return 1; pline("%s is frozen by your gaze!", Monnam(mtmp)); mtmp->mcanmove = 0; mtmp->mfrozen = tmp; return 3; } } } else { /* gelatinous cube */ pline("%s is frozen by you.", Monnam(mtmp)); mtmp->mcanmove = 0; mtmp->mfrozen = tmp; return 3; } return 1; case AD_COLD: /* Brown mold or blue jelly */ if (resists_cold(mtmp)) { shieldeff(mtmp->mx, mtmp->my); pline("%s is mildly chilly.", Monnam(mtmp)); golemeffects(mtmp, AD_COLD, tmp); tmp = 0; break; } pline("%s is suddenly very cold!", Monnam(mtmp)); u.mh += tmp / 2; if (u.mhmax < u.mh) u.mhmax = u.mh; if (u.mhmax > ((youmonst.data->mlevel+1) * 8)) (void)split_mon(&youmonst, mtmp); break; case AD_STUN: /* Yellow mold */ if (!mtmp->mstun) { mtmp->mstun = 1; pline("%s %s.", Monnam(mtmp), makeplural(stagger(mtmp->data, "stagger"))); } tmp = 0; break; case AD_FIRE: /* Red mold */ if (resists_fire(mtmp)) { shieldeff(mtmp->mx, mtmp->my); pline("%s is mildly warm.", Monnam(mtmp)); golemeffects(mtmp, AD_FIRE, tmp); tmp = 0; break; } pline("%s is suddenly very hot!", Monnam(mtmp)); break; case AD_ELEC: if (resists_elec(mtmp)) { shieldeff(mtmp->mx, mtmp->my); pline("%s is slightly tingled.", Monnam(mtmp)); golemeffects(mtmp, AD_ELEC, tmp); tmp = 0; break; } pline("%s is jolted with your electricity!", Monnam(mtmp)); break; default: tmp = 0; break; } else tmp = 0; assess_dmg: if((mtmp->mhp -= tmp) <= 0) { pline("%s dies!", Monnam(mtmp)); xkilled(mtmp,0); if (mtmp->mhp > 0) return 1; return 2; } return 1; } #endif /* OVL1 */ #ifdef OVLB #include "edog.h" struct monst * cloneu() { register struct monst *mon; int mndx = monsndx(youmonst.data); if (u.mh <= 1) return(struct monst *)0; if (mvitals[mndx].mvflags & G_EXTINCT) return(struct monst *)0; mon = makemon(youmonst.data, u.ux, u.uy, NO_MINVENT|MM_EDOG); mon = christen_monst(mon, plname); initedog(mon); mon->m_lev = youmonst.data->mlevel; mon->mhpmax = u.mhmax; mon->mhp = u.mh / 2; u.mh -= mon->mhp; flags.botl = 1; return(mon); } #endif /* OVLB */ /*mhitu.c*/ slashem-0.0.7E7F3/src/rnd.c0000664000076400007640000000451710545462317013401 0ustar aliali/* SCCS Id: @(#)rnd.c 3.4 1996/02/07 */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" /* "Rand()"s definition is determined by [OS]conf.h */ #if defined(LINT) && defined(UNIX) /* rand() is long... */ extern int NDECL(rand); #define RND(x) (rand() % x) #else /* LINT */ # if defined(UNIX) || defined(RANDOM) #define RND(x) (int)(Rand() % (long)(x)) # else /* Good luck: the bottom order bits are cyclic. */ #define RND(x) (int)((Rand()>>3) % (x)) # endif #endif /* LINT */ #ifdef OVL0 int rn2(x) /* 0 <= rn2(x) < x */ register int x; { #ifdef DEBUG if (x <= 0) { impossible("rn2(%d) attempted", x); return(0); } x = RND(x); return(x); #else return(RND(x)); #endif } #endif /* OVL0 */ #ifdef OVLB int rnl(x) /* 0 <= rnl(x) < x; sometimes subtracting Luck */ register int x; /* good luck approaches 0, bad luck approaches (x-1) */ { register int i; #ifdef DEBUG if (x <= 0) { impossible("rnl(%d) attempted", x); return(0); } #endif i = RND(x); if (Luck && rn2(50 - Luck)) { i -= (x <= 15 && Luck >= -5 ? Luck/3 : Luck); if (i < 0) i = 0; else if (i >= x) i = x-1; } return i; } #endif /* OVLB */ #ifdef OVL0 int rnd(x) /* 1 <= rnd(x) <= x */ register int x; { #ifdef DEBUG if (x <= 0) { impossible("rnd(%d) attempted", x); return(1); } x = RND(x)+1; return(x); #else return(RND(x)+1); #endif } #endif /* OVL0 */ #ifdef OVL1 int d(n,x) /* n <= d(n,x) <= (n*x) */ register int n, x; { register int tmp = n; #ifdef DEBUG if (x < 0 || n < 0 || (x == 0 && n != 0)) { impossible("d(%d,%d) attempted", n, x); return(1); } #endif while(n--) tmp += RND(x); return(tmp); /* Alea iacta est. -- J.C. */ } #endif /* OVL1 */ #ifdef OVLB int rne(x) register int x; { register int tmp, utmp; utmp = (u.ulevel < 15) ? 5 : u.ulevel/3; tmp = 1; while (tmp < utmp && !rn2(x)) tmp++; return tmp; /* was: * tmp = 1; * while(!rn2(x)) tmp++; * return(min(tmp,(u.ulevel < 15) ? 5 : u.ulevel/3)); * which is clearer but less efficient and stands a vanishingly * small chance of overflowing tmp */ } int rnz(i) int i; { #ifdef LINT int x = i; int tmp = 1000; #else register long x = i; register long tmp = 1000; #endif tmp += rn2(1000); tmp *= rne(4); if (rn2(2)) { x *= tmp; x /= 1000; } else { x *= 1000; x /= tmp; } return((int)x); } #endif /* OVLB */ /*rnd.c*/ slashem-0.0.7E7F3/src/trap.c0000664000076400007640000034676310545462317013600 0ustar aliali/* SCCS Id: @(#)trap.c 3.4 2003/10/20 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" extern const char * const destroy_strings[]; /* from zap.c */ STATIC_DCL void FDECL(dofiretrap, (struct obj *)); STATIC_DCL void NDECL(domagictrap); STATIC_DCL boolean FDECL(emergency_disrobe,(boolean *)); STATIC_DCL int FDECL(untrap_prob, (struct trap *ttmp)); STATIC_DCL void FDECL(cnv_trap_obj, (int, int, struct trap *)); 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_rust_trap, (struct trap *)); STATIC_DCL int FDECL(disarm_fire_trap, (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)); STATIC_DCL int FDECL(try_lift, (struct monst *, struct trap *, int, BOOLEAN_P)); STATIC_DCL int FDECL(help_monster_out, (struct monst *, struct trap *)); STATIC_DCL boolean FDECL(thitm, (int,struct monst *,struct obj *,int,BOOLEAN_P)); 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 *)); STATIC_OVL boolean FDECL(keep_saddle_with_steedcorpse, (unsigned, struct obj *, struct obj *)); #endif #ifndef OVLB STATIC_VAR const char *a_your[2]; STATIC_VAR const char *A_Your[2]; STATIC_VAR const char tower_of_flame[]; STATIC_VAR const char *A_gush_of_water_hits; STATIC_VAR const char * const blindgas[6]; #else STATIC_VAR const char * const a_your[2] = { "a", "your" }; STATIC_VAR const char * const A_Your[2] = { "A", "Your" }; STATIC_VAR const char tower_of_flame[] = "tower of flame"; STATIC_VAR const char * const A_gush_of_water_hits = "A gush of water hits"; STATIC_VAR const char * const blindgas[6] = {"humid", "odorless", "pungent", "chilling", "acrid", "biting"}; #endif /* OVLB */ #ifdef OVLB /* called when you're hit by fire (dofiretrap,buzz,zapyourself,explode) */ boolean /* returns TRUE if hit on torso */ burnarmor(victim) struct monst *victim; { struct obj *item; char buf[BUFSZ]; int mat_idx; if (!victim) return 0; #define burn_dmg(obj,descr) rust_dmg(obj, descr, 0, FALSE, victim) while (1) { switch (rn2(5)) { case 0: item = (victim == &youmonst) ? uarmh : which_armor(victim, W_ARMH); if (item) { mat_idx = objects[item->otyp].oc_material; Sprintf(buf,"%s helmet", materialnm[mat_idx] ); } if (!burn_dmg(item, item ? buf : "helmet")) continue; break; 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); if (item) { (void) burn_dmg(item, xname(item)); return TRUE; } #ifdef TOURIST item = (victim == &youmonst) ? uarmu : which_armor(victim, W_ARMU); if (item) (void) burn_dmg(item, "shirt"); #endif return TRUE; case 2: item = (victim == &youmonst) ? uarms : which_armor(victim, W_ARMS); if (!burn_dmg(item, "wooden shield")) continue; break; case 3: item = (victim == &youmonst) ? uarmg : which_armor(victim, W_ARMG); if (!burn_dmg(item, "gloves")) continue; break; case 4: item = (victim == &youmonst) ? uarmf : which_armor(victim, W_ARMF); if (!burn_dmg(item, "boots")) continue; break; } break; /* Out of while loop */ } return FALSE; #undef burn_dmg } /* Generic rust-armor function. Returns TRUE if a message was printed; * "print", if set, means to print a message (and thus to return TRUE) even * if the item could not be rusted; otherwise a message is printed and TRUE is * returned only for rustable items. */ boolean rust_dmg(otmp, ostr, type, print, victim) register struct obj *otmp; register const char *ostr; int type; boolean print; struct monst *victim; { static NEARDATA const char * const action[] = { "smoulder", "rust", "rot", "corrode" }; static NEARDATA const char * const msg[] = { "burnt", "rusted", "rotten", "corroded" }; boolean vulnerable = FALSE; boolean grprot = FALSE; boolean is_primary = TRUE; boolean vismon = (victim != &youmonst) && canseemon(victim); int erosion; if (!otmp) return(FALSE); switch(type) { case 0: vulnerable = is_flammable(otmp); break; case 1: vulnerable = is_rustprone(otmp); grprot = TRUE; break; case 2: vulnerable = is_rottable(otmp); is_primary = FALSE; break; case 3: vulnerable = is_corrodeable(otmp); grprot = TRUE; is_primary = FALSE; break; } erosion = is_primary ? otmp->oeroded : otmp->oeroded2; 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); else if (vismon) 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(); } } } struct trap * maketrap(x,y,typ) register int x, y, typ; { register struct trap *ttmp; register struct rm *lev; register boolean oldplace; if ((ttmp = t_at(x,y)) != 0) { if (ttmp->ttyp == MAGIC_PORTAL) return (struct trap *)0; oldplace = TRUE; if (u.utrap && (x == u.ux) && (y == u.uy) && ((u.utraptype == TT_BEARTRAP && typ != BEAR_TRAP) || (u.utraptype == TT_WEB && typ != WEB) || (u.utraptype == TT_PIT && typ != PIT && typ != SPIKED_PIT))) u.utrap = 0; } else { oldplace = FALSE; ttmp = newtrap(); ttmp->tx = x; ttmp->ty = y; ttmp->launch.x = -1; /* force error if used before set */ ttmp->launch.y = -1; } ttmp->ttyp = typ; switch(typ) { case STATUE_TRAP: /* create a "living" statue */ { struct monst *mtmp; struct obj *otmp, *statue; statue = mkcorpstat(STATUE, (struct monst *)0, &mons[rndmonnum()], x, y, FALSE); mtmp = makemon(&mons[statue->corpsenm], 0, 0, NO_MM_FLAGS); if (!mtmp) break; /* should never happen */ while(mtmp->minvent) { otmp = mtmp->minvent; otmp->owornmask = 0; obj_extract_self(otmp); (void) add_to_container(statue, otmp); } statue->owt = weight(statue); mongone(mtmp); break; } case ROLLING_BOULDER_TRAP: /* boulder will roll towards trigger */ (void) mkroll_launch(ttmp, x, y, BOULDER, 1L); break; case HOLE: case PIT: case SPIKED_PIT: case TRAPDOOR: lev = &levl[x][y]; if (*in_rooms(x, y, SHOPBASE) && ((typ == HOLE || typ == TRAPDOOR) || IS_DOOR(lev->typ) || IS_WALL(lev->typ))) add_damage(x, y, /* schedule repair */ ((IS_DOOR(lev->typ) || IS_WALL(lev->typ)) && !flags.mon_moving) ? 200L : 0L); lev->doormask = 0; /* subsumes altarmask, icedpool... */ if (IS_ROOM(lev->typ)) /* && !IS_AIR(lev->typ) */ lev->typ = ROOM; /* * some cases which can happen when digging * down while phazing thru solid areas */ else if (lev->typ == STONE || lev->typ == SCORR) lev->typ = CORR; else if (IS_WALL(lev->typ) || lev->typ == SDOOR) lev->typ = level.flags.is_maze_lev ? ROOM : level.flags.is_cavernous_lev ? CORR : DOOR; unearth_objs(x, y); break; } if (ttmp->ttyp == HOLE) ttmp->tseen = 1; /* You can't hide a hole */ else ttmp->tseen = 0; ttmp->once = 0; ttmp->madeby_u = 0; ttmp->dst.dnum = -1; ttmp->dst.dlevel = -1; if (!oldplace) { ttmp->ntrap = ftrap; ftrap = ttmp; } return(ttmp); } void fall_through(td) boolean td; /* td == TRUE : trap door or hole */ { d_level dtmp; char msgbuf[BUFSZ]; const char *dont_fall = 0; register int newlevel = dunlev(&u.uz); /* KMH -- You can't escape the Sokoban level traps */ if(Blind && Levitation && !In_sokoban(&u.uz)) return; do { newlevel++; } while(!rn2(4) && newlevel < dunlevs_in_dungeon(&u.uz)); if(td) { struct trap *t=t_at(u.ux,u.uy); seetrap(t); if (!In_sokoban(&u.uz)) { if (t->ttyp == TRAPDOOR) pline("A trap door opens up under you!"); else pline("There's a gaping hole under you!"); } } else pline_The("%s opens up under you!", surface(u.ux,u.uy)); if (In_sokoban(&u.uz) && Can_fall_thru(&u.uz)) ; /* KMH -- You can't escape the Sokoban level traps */ else if(Levitation || u.ustuck || !Can_fall_thru(&u.uz) || Flying || is_clinger(youmonst.data) || (Role_if(PM_ARCHEOLOGIST) && uwep && uwep->otyp == BULLWHIP) || (Inhell && !u.uevent.invoked && newlevel == dunlevs_in_dungeon(&u.uz)) ) { if (Role_if(PM_ARCHEOLOGIST) && uwep && uwep->otyp == BULLWHIP) pline("But thanks to your trusty whip ..."); dont_fall = "don't fall in."; } else if (youmonst.data->msize >= MZ_HUGE) { dont_fall = "don't fit through."; } else if (!next_to_u()) { dont_fall = "are jerked back by your pet!"; } if (dont_fall) { You(dont_fall); /* hero didn't fall through, but any objects here might */ impact_drop((struct obj *)0, u.ux, u.uy, 0); if (!td) { display_nhwindow(WIN_MESSAGE, FALSE); pline_The("opening under you closes up."); } return; } if(*u.ushops) shopdig(1); if (Is_stronghold(&u.uz)) { find_hell(&dtmp); } else { dtmp.dnum = u.uz.dnum; dtmp.dlevel = newlevel; } if (!td) Sprintf(msgbuf, "The hole in the %s above you closes up.", ceiling(u.ux,u.uy)); schedule_goto(&dtmp, FALSE, TRUE, 0, (char *)0, !td ? msgbuf : (char *)0); } /* * Animate the given statue. May have been via shatter attempt, trap, * or stone to flesh spell. Return a monster if successfully animated. * If the monster is animated, the object is deleted. If fail_reason * is non-null, then fill in the reason for failure (or success). * * The cause of animation is: * * ANIMATE_NORMAL - hero "finds" the monster * ANIMATE_SHATTER - hero tries to destroy the statue * ANIMATE_SPELL - stone to flesh spell hits the statue * * Perhaps x, y is not needed if we can use get_obj_location() to find * the statue's location... ??? */ struct monst * animate_statue(statue, x, y, cause, fail_reason) struct obj *statue; xchar x, y; int cause; int *fail_reason; { struct permonst *mptr; struct monst *mon = 0; struct obj *item; coord cc; boolean historic = (Role_if(PM_ARCHEOLOGIST) && !flags.mon_moving && (statue->spe & STATUE_HISTORIC)); char statuename[BUFSZ]; Strcpy(statuename,the(xname(statue))); if (statue->oxlth && statue->oattached == OATTACHED_MONST) { cc.x = x, cc.y = y; mon = montraits(statue, &cc); if (mon && mon->mtame && !mon->isminion) wary_dog(mon, TRUE); } else { /* statue of any golem hit with stone-to-flesh becomes flesh golem */ if (is_golem(&mons[statue->corpsenm]) && cause == ANIMATE_SPELL) mptr = &mons[PM_FLESH_GOLEM]; else mptr = &mons[statue->corpsenm]; /* * Guard against someone wishing for a statue of a unique monster * (which is allowed in normal play) and then tossing it onto the * [detected or guessed] location of a statue trap. Normally the * uppermost statue is the one which would be activated. */ if ((mptr->geno & G_UNIQ) && cause != ANIMATE_SPELL) { if (fail_reason) *fail_reason = AS_MON_IS_UNIQUE; return (struct monst *)0; } if (cause == ANIMATE_SPELL && ((mptr->geno & G_UNIQ) || mptr->msound == MS_GUARDIAN)) { /* Statues of quest guardians or unique monsters * will not stone-to-flesh as the real thing. */ mon = makemon(&mons[PM_DOPPELGANGER], x, y, NO_MINVENT|MM_NOCOUNTBIRTH|MM_ADJACENTOK); if (mon) { /* makemon() will set mon->cham to * CHAM_ORDINARY if hero is wearing * ring of protection from shape changers * when makemon() is called, so we have to * check the field before calling newcham(). */ if (mon->cham == CHAM_DOPPELGANGER) (void) newcham(mon, mptr, FALSE, FALSE); } } else mon = makemon(mptr, x, y, (cause == ANIMATE_SPELL) ? (NO_MINVENT | MM_ADJACENTOK) : NO_MINVENT); } if (!mon) { if (fail_reason) *fail_reason = AS_NO_MON; return (struct monst *)0; } /* in case statue is wielded and hero zaps stone-to-flesh at self */ if (statue->owornmask) remove_worn_item(statue, TRUE); /* allow statues to be of a specific gender */ if (statue->spe & STATUE_MALE) mon->female = FALSE; else if (statue->spe & STATUE_FEMALE) mon->female = TRUE; /* if statue has been named, give same name to the monster */ if (statue->onamelth) mon = christen_monst(mon, ONAME(statue)); /* transfer any statue contents to monster's inventory */ while ((item = statue->cobj) != 0) { obj_extract_self(item); (void) add_to_minv(mon, item); } m_dowear(mon, TRUE); delobj(statue); /* mimic statue becomes seen mimic; other hiders won't be hidden */ if (mon->m_ap_type) seemimic(mon); else mon->mundetected = FALSE; if ((x == u.ux && y == u.uy) || cause == ANIMATE_SPELL) { const char *comes_to_life = nonliving(mon->data) ? "moves" : "comes to life"; if (cause == ANIMATE_SPELL) pline("%s %s!", upstart(statuename), canspotmon(mon) ? comes_to_life : "disappears"); else pline_The("statue %s!", canspotmon(mon) ? comes_to_life : "disappears"); if (historic) { You_feel("guilty that the historic statue is now gone."); adjalign(-1); } } else if (cause == ANIMATE_SHATTER) pline("Instead of shattering, the statue suddenly %s!", canspotmon(mon) ? "comes to life" : "disappears"); else { /* cause == ANIMATE_NORMAL */ You("find %s posing as a statue.", canspotmon(mon) ? a_monnam(mon) : something); stop_occupation(); } /* avoid hiding under nothing */ if (x == u.ux && y == u.uy && Upolyd && hides_under(youmonst.data) && !OBJ_AT(x, y)) u.uundetected = 0; if (fail_reason) *fail_reason = AS_OK; return mon; } /* * You've either stepped onto a statue trap's location or you've triggered a * statue trap by searching next to it or by trying to break it with a wand * or pick-axe. */ struct monst * activate_statue_trap(trap, x, y, shatter) struct trap *trap; xchar x, y; boolean shatter; { struct monst *mtmp = (struct monst *)0; struct obj *otmp = sobj_at(STATUE, x, y); int fail_reason; /* * Try to animate the first valid statue. Stop the loop when we * actually create something or the failure cause is not because * the mon was unique. */ deltrap(trap); while (otmp) { mtmp = animate_statue(otmp, x, y, shatter ? ANIMATE_SHATTER : ANIMATE_NORMAL, &fail_reason); if (mtmp || fail_reason != AS_MON_IS_UNIQUE) break; while ((otmp = otmp->nexthere) != 0) if (otmp->otyp == STATUE) break; } if (Blind) feel_location(x, y); else newsym(x, y); return mtmp; } #ifdef STEED STATIC_OVL boolean keep_saddle_with_steedcorpse(steed_mid, objchn, saddle) unsigned steed_mid; struct obj *objchn, *saddle; { if (!saddle) return FALSE; while(objchn) { if(objchn->otyp == CORPSE && objchn->oattached == OATTACHED_MONST && objchn->oxlth) { struct monst *mtmp = (struct monst *)objchn->oextra; if (mtmp->m_id == steed_mid) { /* move saddle */ xchar x,y; if (get_obj_location(objchn, &x, &y, 0)) { obj_extract_self(saddle); place_object(saddle, x, y); stackobj(saddle); } return TRUE; } } if (Has_contents(objchn) && keep_saddle_with_steedcorpse(steed_mid, objchn->cobj, saddle)) return TRUE; objchn = objchn->nobj; } return FALSE; } #endif /*STEED*/ 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)); boolean forcebungle = (trflags & FORCEBUNGLE); nomul(0); /* KMH -- You can't escape the Sokoban level traps */ if (In_sokoban(&u.uz) && (ttype == PIT || ttype == SPIKED_PIT || ttype == HOLE || ttype == TRAPDOOR)) { /* The "air currents" message is still appropriate -- even when * the hero isn't flying or levitating -- because it conveys the * reason why the player cannot escape the trap with a dexterity * check, clinging to the ceiling, etc. */ pline("Air currents pull you down into %s %s!", a_your[trap->madeby_u], defsyms[trap_to_defsym(ttype)].explanation); /* then proceed to normal trap effect */ } else if (already_seen) { if ((Levitation || Flying) && (ttype == PIT || ttype == SPIKED_PIT || ttype == HOLE || ttype == BEAR_TRAP)) { You("%s over %s %s.", Levitation ? "float" : "fly", a_your[trap->madeby_u], defsyms[trap_to_defsym(ttype)].explanation); return; } if(!Fumbling && ttype != MAGIC_PORTAL && ttype != ANTI_MAGIC && !forcebungle && (!rn2(5) || ((ttype == PIT || ttype == SPIKED_PIT) && is_clinger(youmonst.data)))) { You("escape %s %s.", (ttype == ARROW_TRAP && !trap->madeby_u) ? "an" : a_your[trap->madeby_u], defsyms[trap_to_defsym(ttype)].explanation); return; } } #ifdef STEED if (u.usteed) u.usteed->mtrapseen |= (1 << (ttype-1)); #endif switch(ttype) { case ARROW_TRAP: if (trap->once && trap->tseen && !rn2(15)) { You_hear("a loud click!"); deltrap(trap); newsym(u.ux,u.uy); break; } trap->once = 1; seetrap(trap); pline("An arrow shoots out at you!"); 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 { place_object(otmp, u.ux, u.uy); if (!Blind) otmp->dknown = 1; stackobj(otmp); newsym(u.ux, u.uy); } break; case DART_TRAP: if (trap->once && trap->tseen && !rn2(15)) { You_hear("a soft click."); deltrap(trap); newsym(u.ux,u.uy); break; } trap->once = 1; seetrap(trap); pline("A little dart shoots out at you!"); otmp = mksobj(DART, TRUE, FALSE); 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, "little dart", -10); obfree(otmp, (struct obj *)0); } else { place_object(otmp, u.ux, u.uy); if (!Blind) otmp->dknown = 1; stackobj(otmp); newsym(u.ux, u.uy); } break; case ROCKTRAP: if (trap->once && trap->tseen && !rn2(15)) { pline("A trap door in %s opens, but nothing falls out!", the(ceiling(u.ux,u.uy))); deltrap(trap); newsym(u.ux,u.uy); } else { int dmg = d(2,6); /* should be std ROCK dmg? */ trap->once = 1; seetrap(trap); otmp = mksobj_at(ROCK, u.ux, u.uy, TRUE, FALSE); otmp->quan = 1L; otmp->owt = weight(otmp); pline("A trap door in %s opens and %s falls on your %s!", the(ceiling(u.ux,u.uy)), an(xname(otmp)), body_part(HEAD)); if (uarmh) { if(is_metallic(uarmh)) { pline("Fortunately, you are wearing a hard helmet."); dmg = 2; } else if (flags.verbose) { Your("%s does not protect you.", xname(uarmh)); } } if (!Blind) otmp->dknown = 1; stackobj(otmp); newsym(u.ux,u.uy); /* map the rock */ losehp(dmg, "falling rock", KILLED_BY_AN); exercise(A_STR, FALSE); } break; case SQKY_BOARD: /* stepped on a squeaky board */ if (Levitation || Flying) { if (!Blind) { seetrap(trap); if (Hallucination) You("notice a crease in the linoleum."); else You("notice a loose board below you."); } } else { seetrap(trap); pline("A board beneath you squeaks loudly."); wake_nearby(); } break; case BEAR_TRAP: if(Levitation || Flying) break; seetrap(trap); if(amorphous(youmonst.data) || is_whirly(youmonst.data) || unsolid(youmonst.data)) { pline("%s bear trap closes harmlessly through you.", 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; } u.utrap = rn1(4, 4); u.utraptype = TT_BEARTRAP; #ifdef STEED 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 { pline("%s bear trap closes on your %s!", A_Your[trap->madeby_u], body_part(FOOT)); if(u.umonnum == PM_OWLBEAR || u.umonnum == PM_BUGBEAR) You("howl in anger!"); } exercise(A_DEX, FALSE); break; case SLP_GAS_TRAP: seetrap(trap); if(Sleep_resistance || breathless(youmonst.data)) { You("are enveloped in a cloud of gas!"); break; } pline("A cloud of gas puts you to sleep!"); fall_asleep(-rnd(25), TRUE); #ifdef STEED (void) steedintrap(trap, (struct obj *)0); #endif break; case RUST_TRAP: seetrap(trap); if (u.umonnum == PM_IRON_GOLEM) { int dam = u.mhmax; pline("%s you!", A_gush_of_water_hits); You("are covered with rust!"); if (Half_physical_damage) dam = (dam+1) / 2; losehp(dam, "rusting away", KILLED_BY); break; } else if (u.umonnum == PM_FLAMING_SPHERE) { int dam = u.mhmax; pline("%s you!", A_gush_of_water_hits); You("are extinguished!"); if (Half_physical_damage) dam = (dam+1) / 2; losehp(dam, "drenching", KILLED_BY); break; } else if (u.umonnum == PM_GREMLIN && rn2(3)) { pline("%s you!", A_gush_of_water_hits); (void)split_mon(&youmonst, (struct monst *)0); break; } /* Unlike monsters, traps cannot aim their rust attacks at * you, so instead of looping through and taking either the * first rustable one or the body, we take whatever we get, * even if it is not rustable. */ switch (rn2(5)) { case 0: pline("%s you on the %s!", A_gush_of_water_hits, body_part(HEAD)); (void) rust_dmg(uarmh, "helmet", 1, TRUE, &youmonst); break; case 1: pline("%s your left %s!", A_gush_of_water_hits, body_part(ARM)); if (rust_dmg(uarms, "shield", 1, TRUE, &youmonst)) break; if (u.twoweap || (uwep && bimanual(uwep))) { otmp = u.twoweap ? uswapwep : uwep; if (otmp && !snuff_lit(otmp)) erode_obj(otmp, 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 */ break; case 2: pline("%s your right %s!", A_gush_of_water_hits, body_part(ARM)); if (uwep && !snuff_lit(uwep)) 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 else if (uarmu) (void) rust_dmg(uarmu, "shirt", 1, TRUE, &youmonst); #endif } update_inventory(); break; case FIRE_TRAP: seetrap(trap); dofiretrap((struct obj *)0); break; case PIT: case SPIKED_PIT: /* 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 " : ""); } else { pline("%s pit %sopens up under you!", A_Your[trap->madeby_u], ttype == SPIKED_PIT ? "full of spikes " : ""); You("don't fall in!"); } break; } if (!In_sokoban(&u.uz)) { char verbbuf[BUFSZ]; #ifdef STEED if (u.usteed) { if ((trflags & RECURSIVETRAP) != 0) Sprintf(verbbuf, "and %s fall", x_monnam(u.usteed, u.usteed->mnamelth ? ARTICLE_NONE : ARTICLE_THE, (char *)0, SUPPRESS_SADDLE, FALSE)); else 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)) { pline("Fortunately it has a bottom after all..."); trap->once = 1; } else if (u.umonnum == PM_PIT_VIPER || u.umonnum == PM_PIT_FIEND) pline("How pitiful. Isn't that the pits?"); if (ttype == SPIKED_PIT) { const 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); if (!rn2(6)) poisoned("spikes", A_STR, "fall onto poison spikes", 8); } else losehp(rnd(6),"fell into a pit", NO_KILLER_PREFIX); if (Punished && !carried(uball)) { unplacebc(); ballfall(); placebc(); } selftouch("Falling, you"); vision_full_recalc = 1; /* vision limits change */ exercise(A_STR, FALSE); exercise(A_DEX, FALSE); #ifdef STEED } #endif break; case HOLE: case TRAPDOOR: if (!Can_fall_thru(&u.uz)) { seetrap(trap); /* normally done in fall_through */ impossible("dotrap: %ss cannot exist on this level.", defsyms[trap_to_defsym(ttype)].explanation); break; /* don't activate it after all */ } fall_through(TRUE); break; case TELEP_TRAP: seetrap(trap); tele_trap(trap); break; case LEVEL_TELEP: seetrap(trap); level_tele_trap(trap); break; case WEB: /* Our luckless player has stumbled into a web. */ seetrap(trap); if (amorphous(youmonst.data) || is_whirly(youmonst.data) || 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/steed strength. */ { register int str = ACURR(A_STR); #ifdef STEED /* If mounted, the steed gets trapped. Use mintrap * to do all the work. If mtrapped is set as a result, * unset it and set utrap instead. In the case of a * strongmonst and mintrap said it's trapped, use a * short but non-zero trap time. Otherwise, monsters * have no specific strength, so use player strength. * This gets skipped for webmsgok, which implies that * the steed isn't a factor. */ if (u.usteed && webmsgok) { /* mtmp location might not be up to date */ u.usteed->mx = u.ux; u.usteed->my = u.uy; /* mintrap currently does not return 2(died) for webs */ if (mintrap(u.usteed)) { u.usteed->mtrapped = 0; if (strongmonst(u.usteed->data)) str = 17; } else { break; } webmsgok = FALSE; /* mintrap printed the messages */ } #endif if (str <= 3) u.utrap = rn1(6,6); else if (str < 6) u.utrap = rn1(6,4); else if (str < 9) u.utrap = rn1(4,4); else if (str < 12) u.utrap = rn1(4,2); else if (str < 15) u.utrap = rn1(2,2); else if (str < 18) u.utrap = rnd(2); 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 */ } } break; case STATUE_TRAP: activate_statue_trap(trap, u.ux, u.uy, FALSE); break; case MAGIC_TRAP: /* A magic trap. */ seetrap(trap); if (!rn2(30)) { deltrap(trap); newsym(u.ux,u.uy); /* update position */ You("are caught in a magical explosion!"); losehp(rnd(10), "magical explosion", KILLED_BY_AN); 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: seetrap(trap); if(Antimagic) { shieldeff(u.ux, u.uy); You_feel("momentarily lethargic."); } 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: { #ifdef STEED unsigned steed_mid = 0; struct obj *saddle = 0; #endif if (Levitation || Flying) { if (!already_seen && rn2(3)) break; seetrap(trap); pline("%s %s in a pile of soil below you.", already_seen ? "There is" : "You discover", trap->madeby_u ? "the trigger of your mine" : "a trigger"); if (already_seen && rn2(3)) break; pline("KAABLAMM!!! %s %s%s off!", forcebungle ? "Your inept attempt sets" : "The air currents set", 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 if (u.usteed) steed_mid = u.usteed->m_id; recursive_mine = TRUE; (void) steedintrap(trap, (struct obj *)0); recursive_mine = FALSE; saddle = sobj_at(SADDLE,u.ux, u.uy); #endif set_wounded_legs(LEFT_SIDE, rn1(35, 41)); set_wounded_legs(RIGHT_SIDE, rn1(35, 41)); exercise(A_DEX, FALSE); } blow_up_landmine(trap); #ifdef STEED if (steed_mid && saddle && !u.usteed) (void)keep_saddle_with_steedcorpse(steed_mid, fobj, saddle); #endif 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, RECURSIVETRAP); fill_pit(u.ux, u.uy); break; } case ROLLING_BOULDER_TRAP: { int style = ROLL | (trap->tseen ? LAUNCH_KNOWN : 0); seetrap(trap); pline("Click! You trigger a rolling boulder trap!"); if(!launch_obj(BOULDER, trap->launch.x, trap->launch.y, trap->launch2.x, trap->launch2.y, style)) { deltrap(trap); newsym(u.ux,u.uy); /* get rid of trap symbol */ pline("Fortunately for you, no boulder was released."); } break; } case MAGIC_PORTAL: seetrap(trap); #if defined(BLACKMARKET) && defined(STEED) if (u.usteed && (Is_blackmarket(&trap->dst) || Is_blackmarket(&u.uz))) pline("%s seems to shimmer for a moment.", Monnam(u.usteed)); else #endif domagicportal(trap); break; default: seetrap(trap); impossible("You hit a trap of type %u", trap->ttyp); } } #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, FALSE)) 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, FALSE)) 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), FALSE)) 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), FALSE)) trapkilled = TRUE; steedhit = TRUE; break; case POLY_TRAP: if (!resists_magm(mtmp)) { if (!resist(mtmp, WAND_CLASS, 0, NOTELL)) { (void) mon_spec_poly(mtmp, (struct permonst *)0, 0L, FALSE, FALSE, FALSE, TRUE); 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; { (void)scatter(trap->tx, trap->ty, 4, MAY_DESTROY | MAY_HIT | MAY_FRACTURE | VIS_EFFECTS, (struct obj *)0); del_engr_at(trap->tx, trap->ty); wake_nearto(trap->tx, trap->ty, 400); /* ALI - artifact doors */ if (IS_DOOR(levl[trap->tx][trap->ty].typ) && !artifact_door(trap->tx, trap->ty)) 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 */ seetrap(trap); /* and it isn't concealed */ } #endif /* OVLB */ #ifdef OVL3 /* * Move obj from (x1,y1) to (x2,y2) * * Return 0 if no object was launched. * 1 if an object was launched and placed somewhere. * 2 if an object was launched, but used up. */ int launch_obj(otyp, x1, y1, x2, y2, style) short otyp; register int x1,y1,x2,y2; int style; { register struct monst *mtmp; register struct obj *otmp, *otmp2; register int dx,dy; struct obj *singleobj; boolean used_up = FALSE; boolean otherside = FALSE; int dist; int tmp; int delaycnt = 0; otmp = sobj_at(otyp, x1, y1); /* Try the other side too, for rolling boulder traps */ if (!otmp && otyp == BOULDER) { otherside = TRUE; otmp = sobj_at(otyp, x2, y2); } if (!otmp) return 0; if (otherside) { /* swap 'em */ int tx, ty; tx = x1; ty = y1; x1 = x2; y1 = y2; x2 = tx; y2 = ty; } if (otmp->quan == 1L) { obj_extract_self(otmp); singleobj = otmp; otmp = (struct obj *) 0; } else { singleobj = splitobj(otmp, 1L); obj_extract_self(singleobj); } newsym(x1,y1); /* in case you're using a pick-axe to chop the boulder that's being launched (perhaps a monster triggered it), destroy context so that next dig attempt never thinks you're resuming previous effort */ if ((otyp == BOULDER || otyp == STATUE) && singleobj->ox == digging.pos.x && singleobj->oy == digging.pos.y) (void) memset((genericptr_t)&digging, 0, sizeof digging); dist = distmin(x1,y1,x2,y2); bhitpos.x = x1; bhitpos.y = y1; dx = sgn(x2 - x1); dy = sgn(y2 - y1); switch (style) { case ROLL|LAUNCH_UNSEEN: if (otyp == BOULDER) { You_hear(Hallucination ? "someone bowling." : "rumbling in the distance."); } style &= ~LAUNCH_UNSEEN; goto roll; case ROLL|LAUNCH_KNOWN: /* use otrapped as a flag to ohitmon */ singleobj->otrapped = 1; style &= ~LAUNCH_KNOWN; /* fall through */ roll: case ROLL: delaycnt = 2; /* fall through */ default: if (!delaycnt) delaycnt = 1; if (!cansee(bhitpos.x,bhitpos.y)) curs_on_u(); tmp_at(DISP_FLASH, obj_to_glyph(singleobj)); tmp_at(bhitpos.x, bhitpos.y); } /* Set the object in motion */ while(dist-- > 0 && !used_up) { struct trap *t; tmp_at(bhitpos.x, bhitpos.y); tmp = delaycnt; /* dstage@u.washington.edu -- Delay only if hero sees it */ if (cansee(bhitpos.x, bhitpos.y)) while (tmp-- > 0) delay_output(); 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)) { if (cansee(bhitpos.x, bhitpos.y)) pline("%s snatches the boulder.", Monnam(mtmp)); else You_hear("a rumbling stop abruptly."); singleobj->otrapped = 0; (void) mpickobj(mtmp, singleobj); used_up = TRUE; break; } } if (ohitmon((struct monst *) 0, mtmp,singleobj, (style==ROLL) ? -1 : dist, FALSE)) { used_up = TRUE; break; } } else if (bhitpos.x == u.ux && bhitpos.y == u.uy) { if (multi) nomul(0); if (thitu(9 + singleobj->spe, dmgval(singleobj, &youmonst), singleobj, (char *)0)) stop_occupation(); } if (style == ROLL) { if (down_gate(bhitpos.x, bhitpos.y) != -1) { if(ship_object(singleobj, bhitpos.x, bhitpos.y, FALSE)){ used_up = TRUE; 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); singleobj->otrapped = 0; fracture_rock(singleobj); (void)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."); singleobj->otrapped = 0; 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; case PIT: case SPIKED_PIT: case HOLE: case TRAPDOOR: /* the boulder won't be used up if there is a monster in the trap; stop rolling anyway */ x2 = bhitpos.x, y2 = bhitpos.y; /* stops here */ if (flooreffects(singleobj, x2, y2, "fall")) used_up = TRUE; dist = -1; /* stop rolling immediately */ break; } if (used_up || dist == -1) 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) { const char *bmsg = " as one boulder sets another in motion"; if (!isok(bhitpos.x + dx, bhitpos.y + dy) || !dist || IS_ROCK(levl[bhitpos.x + dx][bhitpos.y + dy].typ)) bmsg = " as one boulder hits another"; You_hear("a loud crash%s!", cansee(bhitpos.x, bhitpos.y) ? bmsg : ""); obj_extract_self(otmp2); /* pass off the otrapped flag to the next boulder */ otmp2->otrapped = singleobj->otrapped; singleobj->otrapped = 0; 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); } /* if about to hit iron bars, do so now */ if (dist > 0 && isok(bhitpos.x + dx,bhitpos.y + dy) && levl[bhitpos.x + dx][bhitpos.y + dy].typ == IRONBARS) { x2 = bhitpos.x, y2 = bhitpos.y; /* object stops here */ if (hits_bars(&singleobj, x2, y2, !rn2(20), 0)) { if (!singleobj) used_up = TRUE; break; } } } tmp_at(DISP_END, 0); if (!used_up) { singleobj->otrapped = 0; place_object(singleobj, x2,y2); newsym(x2,y2); return 1; } else return 2; } #endif /* OVL3 */ #ifdef OVLB void seetrap(trap) register struct trap *trap; { if(!trap->tseen) { trap->tseen = 1; newsym(trap->tx, trap->ty); } } #endif /* OVLB */ #ifdef OVL3 STATIC_OVL int mkroll_launch(ttmp, x, y, otyp, ocount) struct trap *ttmp; xchar x,y; short otyp; long ocount; { struct obj *otmp; register int tmp; schar dx,dy; int distance; coord cc; coord bcc; int trycount = 0; boolean success = FALSE; int mindist = 4; if (ttmp->ttyp == ROLLING_BOULDER_TRAP) mindist = 2; distance = rn1(5,4); /* 4..8 away */ tmp = rn2(8); /* randomly pick a direction to try first */ while (distance >= mindist) { dx = xdir[tmp]; dy = ydir[tmp]; cc.x = x; cc.y = y; /* Prevent boulder from being placed on water */ if (ttmp->ttyp == ROLLING_BOULDER_TRAP && is_pool(x+distance*dx,y+distance*dy)) success = FALSE; else success = isclearpath(&cc, distance, dx, dy); if (ttmp->ttyp == ROLLING_BOULDER_TRAP) { boolean success_otherway; bcc.x = x; bcc.y = y; success_otherway = isclearpath(&bcc, distance, -(dx), -(dy)); if (!success_otherway) success = FALSE; } if (success) break; if (++tmp > 7) tmp = 0; if ((++trycount % 8) == 0) --distance; } if (!success) { /* create the trap without any ammo, launch pt at trap location */ cc.x = bcc.x = x; cc.y = bcc.y = y; } else { otmp = mksobj(otyp, TRUE, FALSE); otmp->quan = ocount; otmp->owt = weight(otmp); place_object(otmp, cc.x, cc.y); stackobj(otmp); } ttmp->launch.x = cc.x; ttmp->launch.y = cc.y; if (ttmp->ttyp == ROLLING_BOULDER_TRAP) { ttmp->launch2.x = bcc.x; ttmp->launch2.y = bcc.y; } else ttmp->launch_otyp = otyp; newsym(ttmp->launch.x, ttmp->launch.y); return 1; } STATIC_OVL boolean isclearpath(cc,distance,dx,dy) coord *cc; int distance; schar dx,dy; { uchar typ; xchar x, y; x = cc->x; y = cc->y; while (distance-- > 0) { x += dx; y += dy; typ = levl[x][y].typ; if (!isok(x,y) || !ZAP_POS(typ) || closed_door(x,y)) return FALSE; } cc->x = x; cc->y = y; return TRUE; } #endif /* OVL3 */ #ifdef OVL1 void mon_drain_en(mtmp, n) struct monst *mtmp; register int n; { if (!mtmp->m_enmax) return; if (canseemon(mtmp)) pline("%s looks less powerful!", Monnam(mtmp)); mtmp->m_en -= n; if(mtmp->m_en < 0) { mtmp->m_enmax += mtmp->m_en; if(mtmp->m_enmax < 0) mtmp->m_enmax = 0; mtmp->m_en = 0; } } int mintrap(mtmp) register struct monst *mtmp; { register struct trap *trap = t_at(mtmp->mx, mtmp->my); boolean trapkilled = FALSE; struct permonst *mptr = mtmp->data; struct obj *otmp; 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)) { if (!rn2(2)) { mtmp->mtrapped = 0; if (canseemon(mtmp)) pline("%s pulls free...", Monnam(mtmp)); fill_pit(mtmp->mx, mtmp->my); } } else { mtmp->mtrapped = 0; } } else if (metallivorous(mptr)) { if (trap->ttyp == BEAR_TRAP) { if (canseemon(mtmp)) pline("%s eats a bear trap!", Monnam(mtmp)); deltrap(trap); mtmp->meating = 5; mtmp->mtrapped = 0; } else if (trap->ttyp == SPIKED_PIT) { if (canseemon(mtmp)) pline("%s munches on some spikes!", Monnam(mtmp)); trap->ttyp = PIT; mtmp->meating = 5; } } } else { register int tt = trap->ttyp; boolean in_sight, tear_web, see_it, inescapable = ((tt == HOLE || tt == PIT) && In_sokoban(&u.uz) && !trap->madeby_u); const char *fallverb; #ifdef STEED /* true when called from dotrap, inescapable is not an option */ if (mtmp == u.usteed) inescapable = TRUE; #endif if (!inescapable && ((mtmp->mtrapseen & (1 << (tt-1))) != 0 || (tt == HOLE && !mindless(mtmp->data)))) { /* it has been in such a trap - perhaps it escapes */ if(rn2(4)) return(0); } else { mtmp->mtrapseen |= (1 << (tt-1)); } /* Monster is aggravated by being trapped by you. Recognizing who made the trap isn't completely unreasonable; everybody has their own style. */ if (trap->madeby_u && rnl(5)) setmangry(mtmp); in_sight = canseemon(mtmp); see_it = cansee(mtmp->mx, mtmp->my); #ifdef STEED /* assume hero can tell what's going on for the steed */ if (mtmp == u.usteed) in_sight = TRUE; #endif switch (tt) { case ARROW_TRAP: if (trap->once && trap->tseen && !rn2(15)) { if (in_sight && see_it) pline("%s triggers a trap but nothing happens.", Monnam(mtmp)); deltrap(trap); newsym(mtmp->mx, mtmp->my); break; } trap->once = 1; 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, FALSE)) trapkilled = TRUE; break; case DART_TRAP: if (trap->once && trap->tseen && !rn2(15)) { if (in_sight && see_it) pline("%s triggers a trap but nothing happens.", Monnam(mtmp)); deltrap(trap); newsym(mtmp->mx, mtmp->my); break; } trap->once = 1; otmp = mksobj(DART, TRUE, FALSE); otmp->quan = 1L; otmp->owt = weight(otmp); if (!rn2(6)) otmp->opoisoned = 1; if (in_sight) seetrap(trap); if (thitm(7, mtmp, otmp, 0, FALSE)) trapkilled = TRUE; break; case ROCKTRAP: if (trap->once && trap->tseen && !rn2(15)) { if (in_sight && see_it) pline("A trap door above %s opens, but nothing falls out!", mon_nam(mtmp)); deltrap(trap); newsym(mtmp->mx, mtmp->my); break; } trap->once = 1; otmp = mksobj(ROCK, TRUE, FALSE); otmp->quan = 1L; otmp->owt = weight(otmp); otmp->opoisoned = 0; if (in_sight) seetrap(trap); if (thitm(0, mtmp, otmp, d(2, 6), FALSE)) trapkilled = TRUE; break; case SQKY_BOARD: if(is_flyer(mptr)) break; /* stepped on a squeaky board */ if (in_sight) { pline("A board beneath %s squeaks loudly.", mon_nam(mtmp)); seetrap(trap); } else You_hear("a distant squeak."); /* wake up nearby monsters */ wake_nearto(mtmp->mx, mtmp->my, 40); break; case BEAR_TRAP: if(mptr->msize > MZ_SMALL && !amorphous(mptr) && !is_flyer(mptr) && !is_whirly(mptr) && !unsolid(mptr)) { mtmp->mtrapped = 1; if(in_sight) { pline("%s is caught in %s bear trap!", Monnam(mtmp), a_your[trap->madeby_u]); seetrap(trap); } else { if((mptr == &mons[PM_OWLBEAR] || mptr == &mons[PM_BUGBEAR]) && flags.soundok) You_hear("the roaring of an angry bear!"); } } 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)); seetrap(trap); } } break; case RUST_TRAP: { struct obj *target; if (in_sight) seetrap(trap); switch (rn2(5)) { case 0: if (in_sight) pline("%s %s on the %s!", A_gush_of_water_hits, mon_nam(mtmp), mbodypart(mtmp, HEAD)); target = which_armor(mtmp, W_ARMH); (void) rust_dmg(target, "helmet", 1, TRUE, mtmp); break; case 1: if (in_sight) pline("%s %s's left %s!", A_gush_of_water_hits, mon_nam(mtmp), mbodypart(mtmp, ARM)); target = which_armor(mtmp, W_ARMS); if (rust_dmg(target, "shield", 1, TRUE, mtmp)) 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; case 2: if (in_sight) pline("%s %s's right %s!", A_gush_of_water_hits, mon_nam(mtmp), mbodypart(mtmp, ARM)); if (MON_WEP(mtmp) && !snuff_lit(MON_WEP(mtmp))) erode_obj(MON_WEP(mtmp), FALSE, TRUE); goto glovecheck; default: if (in_sight) pline("%s %s!", A_gush_of_water_hits, mon_nam(mtmp)); for (otmp=mtmp->minvent; otmp; otmp = otmp->nobj) (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) (void) rust_dmg(target, "armor", 1, TRUE, mtmp); #ifdef TOURIST else { target = which_armor(mtmp, W_ARMU); (void) rust_dmg(target, "shirt", 1, TRUE, mtmp); } #endif } } if (mptr == &mons[PM_IRON_GOLEM]) { if (in_sight) pline("%s falls to pieces!", Monnam(mtmp)); else if(mtmp->mtame) pline("May %s rust in peace.", mon_nam(mtmp)); mondied(mtmp); if (mtmp->mhp <= 0) trapkilled = TRUE; } else if (mptr == &mons[PM_FLAMING_SPHERE]) { if (in_sight) pline("%s is extinguished!", Monnam(mtmp)); mondied(mtmp); if (mtmp->mhp <= 0) trapkilled = TRUE; } else if (mptr == &mons[PM_GREMLIN] && rn2(3)) { (void)split_mon(mtmp, (struct monst *)0); } break; } case FIRE_TRAP: mfiretrap: if (in_sight) pline("A %s erupts from the %s under %s!", tower_of_flame, surface(mtmp->mx,mtmp->my), mon_nam(mtmp)); else if (see_it) /* evidently `mtmp' is invisible */ You("see a %s erupt from the %s!", tower_of_flame, surface(mtmp->mx,mtmp->my)); if (Slimed) { pline("The slime that covers you is burned away!"); Slimed = 0; } if (resists_fire(mtmp)) { if (in_sight) { shieldeff(mtmp->mx,mtmp->my); pline("%s is uninjured.", Monnam(mtmp)); } } else { int num = d(2,4), alt; boolean immolate = FALSE; /* paper burns very fast, assume straw is tightly * packed and burns a bit slower */ switch (monsndx(mtmp->data)) { case PM_PAPER_GOLEM: immolate = TRUE; alt = mtmp->mhpmax; break; case PM_STRAW_GOLEM: alt = mtmp->mhpmax / 2; break; case PM_WOOD_GOLEM: alt = mtmp->mhpmax / 4; break; case PM_LEATHER_GOLEM: alt = mtmp->mhpmax / 8; break; default: alt = 0; break; } if (alt > num) num = alt; if (thitm(0, mtmp, (struct obj *)0, num, immolate)) trapkilled = TRUE; else /* we know mhp is at least `num' below mhpmax, so no (mhp > mhpmax) check is needed here */ mtmp->mhpmax -= rn2(num + 1); } if (burnarmor(mtmp) || rn2(3)) { (void) destroy_mitem(mtmp, SCROLL_CLASS, AD_FIRE); (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)) melt_ice(mtmp->mx,mtmp->my); if (see_it) seetrap(trap); break; case PIT: case SPIKED_PIT: fallverb = "falls"; if (is_flyer(mptr) || is_floater(mptr) || (mtmp->wormno && count_wsegs(mtmp) > 5) || is_clinger(mptr)) { if (!inescapable) break; /* avoids trap */ fallverb = "is dragged"; /* sokoban pit */ } if (!passes_walls(mptr)) mtmp->mtrapped = 1; if(in_sight) { 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, rnd((tt == PIT) ? 6 : 10), FALSE)) trapkilled = TRUE; break; case HOLE: case TRAPDOOR: if (!Can_fall_thru(&u.uz)) { impossible("mintrap: %ss cannot exist on this level.", defsyms[trap_to_defsym(tt)].explanation); break; /* don't activate it after all */ } if (is_flyer(mptr) || is_floater(mptr) || mptr == &mons[PM_WUMPUS] || (mtmp->wormno && count_wsegs(mtmp) > 5) || mptr->msize >= MZ_HUGE) { if (inescapable) { /* sokoban hole */ if (in_sight) { pline("%s seems to be yanked down!", Monnam(mtmp)); /* suppress message in mlevel_tele_trap() */ in_sight = FALSE; seetrap(trap); } } else break; } /* Fall through */ case LEVEL_TELEP: case MAGIC_PORTAL: { int mlev_res; mlev_res = mlevel_tele_trap(mtmp, trap, inescapable, in_sight); if (mlev_res) return(mlev_res); } break; case TELEP_TRAP: mtele_trap(mtmp, trap, in_sight); break; case WEB: /* Monster in a web. */ if (webmaker(mptr)) break; if (amorphous(mptr) || is_whirly(mptr) || unsolid(mptr)){ if(acidic(mptr) || mptr == &mons[PM_GELATINOUS_CUBE] || mptr == &mons[PM_FIRE_ELEMENTAL]) { if (in_sight) pline("%s %s %s spider web!", Monnam(mtmp), (mptr == &mons[PM_FIRE_ELEMENTAL]) ? "burns" : "dissolves", a_your[trap->madeby_u]); deltrap(trap); newsym(mtmp->mx, mtmp->my); break; } if (in_sight) { pline("%s flows through %s spider web.", Monnam(mtmp), a_your[trap->madeby_u]); seetrap(trap); } break; } tear_web = FALSE; switch (monsndx(mptr)) { case PM_OWLBEAR: /* Eric Backus */ case PM_BUGBEAR: if (!in_sight) { You_hear("the roaring of a confused bear!"); mtmp->mtrapped = 1; break; } /* fall though */ default: if (mptr->mlet == S_GIANT || (mptr->mlet == S_DRAGON && extra_nasty(mptr)) || /* excl. babies */ (mtmp->wormno && count_wsegs(mtmp) > 5)) { tear_web = TRUE; } else if (in_sight) { pline("%s is caught in %s spider web.", Monnam(mtmp), a_your[trap->madeby_u]); seetrap(trap); } mtmp->mtrapped = tear_web ? 0 : 1; break; /* this list is fairly arbitrary; it deliberately excludes wumpus & giant/ettin zombies/mummies */ case PM_TITANOTHERE: case PM_BALUCHITHERIUM: case PM_PURPLE_WORM: case PM_JABBERWOCK: case PM_IRON_GOLEM: case PM_BALROG: case PM_KRAKEN: case PM_MASTODON: tear_web = TRUE; break; } if (tear_web) { if (in_sight) pline("%s tears through %s spider web!", Monnam(mtmp), a_your[trap->madeby_u]); deltrap(trap); newsym(mtmp->mx, mtmp->my); } break; case STATUE_TRAP: break; case MAGIC_TRAP: /* A magic trap. Monsters usually immune. */ if (!rn2(30)) { deltrap(trap); newsym(mtmp->mx, mtmp->my); if (in_sight) pline("%s is caught in a magical explosion.", Monnam(mtmp)); if (thitm(0, mtmp, (struct obj *)0, rnd(10), FALSE)) trapkilled = TRUE; else { if (in_sight) pline("%s looks filled with power.", Monnam(mtmp)); mtmp->m_en = (mtmp->m_enmax += 2); } } else if (!rn2(21)) goto mfiretrap; break; case ANTI_MAGIC: if (in_sight) seetrap(trap); if (resists_magm(mtmp)) { if (in_sight) { shieldeff(mtmp->mx,mtmp->my); pline("%s is uninjured.", Monnam(mtmp)); } } else { mon_drain_en(mtmp, ((mtmp->m_lev > 0) ? (rnd(mtmp->m_lev)) : 0) + 1); } break; case LANDMINE: if(rn2(3)) break; /* monsters usually don't set it off */ if(is_flyer(mptr)) { boolean already_seen = trap->tseen; if (in_sight && !already_seen) { pline("A trigger appears in a pile of soil below %s.", mon_nam(mtmp)); seetrap(trap); } if (rn2(3)) break; if (in_sight) { newsym(mtmp->mx, mtmp->my); pline_The("air currents set %s off!", already_seen ? "a land mine" : "it"); } } else if(in_sight) { newsym(mtmp->mx, mtmp->my); pline("KAABLAMM!!! %s triggers %s land mine!", Monnam(mtmp), a_your[trap->madeby_u]); } if (!in_sight) pline("Kaablamm! You hear an explosion in the distance!"); blow_up_landmine(trap); if (thitm(0, mtmp, (struct obj *)0, rnd(16), FALSE)) trapkilled = TRUE; else { /* 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!"; } break; case POLY_TRAP: if (resists_magm(mtmp)) { shieldeff(mtmp->mx, mtmp->my); } else if (!resist(mtmp, WAND_CLASS, 0, NOTELL)) { /* (void) newcham(mtmp, (struct permonst *)0, FALSE);*/ /* WAC use polymorph code from zap.c*/ #if 0 if (!rn2(25) || !mon_poly(mtmp)) { if (in_sight) { pline("%s shudders!", Monnam(mtmp)); seetrap(trap); } /* no corpse after system shock */ mtmp->mhp -= rnd(30); if (mtmp->mhp < 0) mondead(mtmp); } else { #endif mon_poly(mtmp, FALSE, "%s changes!"); if (in_sight) seetrap(trap); } break; case ROLLING_BOULDER_TRAP: if (!is_flyer(mptr)) { int style = ROLL | (in_sight ? 0 : LAUNCH_UNSEEN); newsym(mtmp->mx,mtmp->my); if (in_sight) pline("Click! %s triggers %s.", Monnam(mtmp), trap->tseen ? "a rolling boulder trap" : something); if (launch_obj(BOULDER, trap->launch.x, trap->launch.y, trap->launch2.x, trap->launch2.y, style)) { if (in_sight) trap->tseen = TRUE; if (mtmp->mhp <= 0) trapkilled = TRUE; } else { deltrap(trap); newsym(mtmp->mx,mtmp->my); } } break; default: impossible("Some monster encountered a strange trap of type %d.", tt); } } if(trapkilled) return 2; return mtmp->mtrapped; } #endif /* OVL1 */ #ifdef OVLB /* Combine cockatrice checks into single functions to avoid repeating code. */ void instapetrify(str) const char *str; { if (Stone_resistance) return; if (poly_when_stoned(youmonst.data) && polymon(PM_STONE_GOLEM)) return; You("turn to stone..."); killer_format = KILLED_BY_AN; killer = str; done(STONING); } void minstapetrify(mon,byplayer) struct monst *mon; boolean byplayer; { if (resists_ston(mon)) return; if (poly_when_stoned(mon->data)) { mon_to_stone(mon); return; } /* give a " is slowing down" message and also remove intrinsic speed (comparable to similar effect on the hero) */ mon_adjust_speed(mon, -3, (struct obj *)0); if (cansee(mon->mx, mon->my)) pline("%s turns to stone.", Monnam(mon)); if (byplayer) { stoned = TRUE; xkilled(mon,0); } else monstone(mon); } void selftouch(arg) const char *arg; { char kbuf[BUFSZ]; if(uwep && uwep->otyp == CORPSE && touch_petrifies(&mons[uwep->corpsenm]) && !Stone_resistance) { pline("%s touch the %s corpse.", arg, mons[uwep->corpsenm].mname); Sprintf(kbuf, "%s corpse", an(mons[uwep->corpsenm].mname)); instapetrify(kbuf); } /* Or your secondary weapon, if wielded */ if(u.twoweap && uswapwep && uswapwep->otyp == CORPSE && touch_petrifies(&mons[uswapwep->corpsenm]) && !Stone_resistance){ pline("%s touch the %s corpse.", arg, mons[uswapwep->corpsenm].mname); Sprintf(kbuf, "%s corpse", an(mons[uswapwep->corpsenm].mname)); instapetrify(kbuf); } } void mselftouch(mon,arg,byplayer) struct monst *mon; const char *arg; boolean byplayer; { struct obj *mwep = MON_WEP(mon); if (mwep && mwep->otyp == CORPSE && touch_petrifies(&mons[mwep->corpsenm])) { if (cansee(mon->mx, mon->my)) { pline("%s%s touches the %s corpse.", arg ? arg : "", arg ? mon_nam(mon) : Monnam(mon), mons[mwep->corpsenm].mname); } minstapetrify(mon, byplayer); } } /* KMH, balance patch -- several ways for the player to fix stoning */ int uunstone() { if (Stoned) { Stoned = 0; if (!Hallucination) You_feel("limber!"); else pline("What a pity - you just ruined a future piece of %sart!", ACURR(A_CHA) > 15 ? "fine " : ""); /* The problem was fixed */ return (1); } /* No problem to fix */ return (0); } void float_up() { if(u.utrap) { if(u.utraptype == TT_PIT) { u.utrap = 0; You("float up, out of the pit!"); vision_full_recalc = 1; /* vision limits change */ fill_pit(u.ux, u.uy); } else if (u.utraptype == TT_INFLOOR) { Your("body pulls upward, but your %s are still stuck.", makeplural(body_part(LEG))); } else { You("float up, only your %s is still stuck.", body_part(LEG)); } } else if(Is_waterlevel(&u.uz)) pline("It feels as though you've lost some weight."); else if(u.uinwater) spoteffects(TRUE); else if(u.uswallow) You(is_animal(u.ustuck->data) ? "float away from the %s." : "spiral up into %s.", is_animal(u.ustuck->data) ? surface(u.ux, u.uy) : mon_nam(u.ustuck)); else if (Hallucination) pline("Up, up, and awaaaay! You're walking on air!"); else if(Is_airlevel(&u.uz)) You("gain control over your movements."); else You("start to float in the air!"); #ifdef STEED if (u.usteed && !is_floater(u.usteed->data) && !is_flyer(u.usteed->data)) { if (Lev_at_will) pline("%s magically floats up!", Monnam(u.usteed)); else { You("cannot stay on %s.", mon_nam(u.usteed)); dismount_steed(DISMOUNT_GENERIC); } } #endif return; } void fill_pit(x, y) int x, y; { struct obj *otmp; struct trap *t; if ((t = t_at(x, y)) && ((t->ttyp == PIT) || (t->ttyp == SPIKED_PIT)) && (otmp = sobj_at(BOULDER, x, y))) { obj_extract_self(otmp); (void) flooreffects(otmp, x, y, "settle"); } } int float_down(hmask, emask) long hmask, emask; /* might cancel timeout */ { register struct trap *trap = (struct trap *)0; d_level current_dungeon_level; boolean no_msg = FALSE; HLevitation &= ~hmask; ELevitation &= ~emask; if(Levitation) return(0); /* maybe another ring/potion/boots */ if(u.uswallow) { You("float down, but you are still %s.", is_animal(u.ustuck->data) ? "swallowed" : "engulfed"); return(1); } if (Punished && !carried(uball) && (is_pool(uball->ox, uball->oy) || ((trap = t_at(uball->ox, uball->oy)) && ((trap->ttyp == PIT) || (trap->ttyp == SPIKED_PIT) || (trap->ttyp == TRAPDOOR) || (trap->ttyp == HOLE))))) { u.ux0 = u.ux; u.uy0 = u.uy; u.ux = uball->ox; u.uy = uball->oy; movobj(uchain, uball->ox, uball->oy); newsym(u.ux0, u.uy0); vision_full_recalc = 1; /* in case the hero moved. */ } /* check for falling into pool - added by GAN 10/20/86 */ if(!Flying) { if (!u.uswallow && u.ustuck) { if (sticks(youmonst.data)) You("aren't able to maintain your hold on %s.", mon_nam(u.ustuck)); else pline("Startled, %s can no longer hold you!", mon_nam(u.ustuck)); u.ustuck = 0; } /* kludge alert: * drown() and lava_effects() print various messages almost * every time they're called which conflict with the "fall * into" message below. Thus, we want to avoid printing * confusing, duplicate or out-of-order messages. * Use knowledge of the two routines as a hack -- this * should really be handled differently -dlc */ if(is_pool(u.ux,u.uy) && !Wwalking && !Swimming && !u.uinwater) no_msg = drown(); if(is_lava(u.ux,u.uy)) { (void) lava_effects(); no_msg = TRUE; } } 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; it gets changed to reflect the new level before we can check it */ assign_level(¤t_dungeon_level, &u.uz); if(trap) switch(trap->ttyp) { case STATUE_TRAP: break; case HOLE: case TRAPDOOR: if(!Can_fall_thru(&u.uz) || u.ustuck) 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 && /* falling through trap door calls goto_level, and goto_level does its own pickup() call */ on_level(&u.uz, ¤t_dungeon_level)) (void) pickup(1); return 1; } STATIC_OVL void dofiretrap(box) struct obj *box; /* null for floor trap */ { boolean see_it = !Blind; int num, alt; /* Bug: for box case, the equivalent of burn_floor_paper() ought * to be done upon its contents. */ if ((box && !carried(box)) ? is_pool(box->ox, box->oy) : Underwater) { pline("A cascade of steamy bubbles erupts from %s!", the(box ? xname(box) : surface(u.ux,u.uy))); if (Fire_resistance) You("are uninjured."); else losehp(rnd(3), "boiling water", KILLED_BY); return; } pline("A %s %s from %s!", tower_of_flame, box ? "bursts" : "erupts", the(box ? xname(box) : surface(u.ux,u.uy))); if (Slimed) { pline("The slime that covers you is burned away!"); Slimed = 0; } if (Fire_resistance) { shieldeff(u.ux, u.uy); num = rn2(2); } else if (Upolyd) { num = d(2,4); switch (u.umonnum) { case PM_PAPER_GOLEM: alt = u.mhmax; break; case PM_STRAW_GOLEM: alt = u.mhmax / 2; break; case PM_WOOD_GOLEM: alt = u.mhmax / 4; break; case PM_LEATHER_GOLEM: alt = u.mhmax / 8; break; default: alt = 0; break; } if (alt > num) num = alt; if (u.mhmax > mons[u.umonnum].mlevel) u.mhmax -= rn2(min(u.mhmax,num + 1)), flags.botl = 1; } else { num = d(2,4); if (u.uhpmax > u.ulevel) u.uhpmax -= rn2(min(u.uhpmax,num + 1)), flags.botl = 1; } if (!num) You("are uninjured."); else losehp(num, tower_of_flame, KILLED_BY_AN); burn_away_slime(); if (burnarmor(&youmonst) || rn2(3)) { destroy_item(SCROLL_CLASS, AD_FIRE); 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); } STATIC_OVL void domagictrap() { register int fate = rnd(20); /* What happened to the poor sucker? */ if (fate < 10) { /* Most of the time, it creates some monsters. */ register int cnt = rnd(4); 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 You_hear("a deafening roar!"); while(cnt--) (void) makemon((struct permonst *) 0, u.ux, u.uy, NO_MM_FLAGS); } else switch (fate) { case 10: case 11: /* sometimes nothing happens */ break; case 12: /* a flash of fire */ dofiretrap((struct obj *)0); break; /* odd feelings */ case 13: pline("A shiver runs up and down your %s!", body_part(SPINE)); break; case 14: You_hear(Hallucination ? "the moon howling at you." : "distant howling."); break; case 15: if (on_level(&u.uz, &qstart_level)) You_feel("%slike the prodigal son.", (flags.female || (Upolyd && is_neuter(youmonst.data))) ? "oddly " : ""); else You("suddenly yearn for %s.", Hallucination ? "Cleveland" : (In_quest(&u.uz) || at_dgn_entrance("The Quest")) ? "your nearby homeland" : "your distant homeland"); break; case 16: { int dmg; Your("pack shakes violently!"); /* KMH, balance patch -- Idea by Wolfgang von Hansen */ dmg = jumble_pack(); if (dmg) losehp(dmg, "violence", KILLED_BY); break; } case 17: You(Hallucination ? "smell hamburgers." : "smell charred flesh."); break; case 18: You_feel("tired."); break; /* very occasionally something nice happens. */ case 19: /* tame nearby monsters */ { register int i,j; register struct monst *mtmp; (void) adjattrib(A_CHA,1,FALSE); for(i = -1; i <= 1; i++) for(j = -1; j <= 1; j++) { if(!isok(u.ux+i, u.uy+j)) continue; mtmp = m_at(u.ux+i, u.uy+j); if(mtmp) (void) tamedog(mtmp, (struct obj *)0); } break; } 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; register boolean force, here; { /* Dips in the Lethe are a very poor idea */ int luckpenalty = level.flags.lethe? 7 : 0; struct obj *otmp; /* Scrolls, spellbooks, potions, weapons and pieces of armor may get affected by the water */ for (; obj; obj = otmp) { otmp = here ? obj->nexthere : obj->nobj; (void) snuff_lit(obj); if(obj->otyp == CAN_OF_GREASE && obj->spe > 0) { continue; } else if(obj->greased) { if (force || !rn2(2)) obj->greased = 0; } else if(Is_container(obj) && !Is_box(obj) && (obj->otyp != OILSKIN_SACK || (obj->cursed && !rn2(3)))) { water_damage(obj->cobj, force, FALSE); } else if (!force && (Luck - luckpenalty + 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% * If this is the Lethe, things are much worse. */ continue; /* An oil skin cloak protects your body armor */ } else if( obj->oclass == ARMOR_CLASS && obj == uarm && uarmc && uarmc->otyp == OILSKIN_CLOAK && (!uarmc->cursed || rn2(3))) { continue; } else { /* The Lethe strips blessed and cursed status... */ if (level.flags.lethe) { uncurse(obj); unbless(obj); } switch (obj->oclass) { case SCROLL_CLASS: #ifdef MAIL if (obj->otyp != SCR_MAIL) #endif { /* The Lethe sometimes does a little rewrite */ obj->otyp = (level.flags.lethe && !rn2(10)) ? SCR_AMNESIA : SCR_BLANK_PAPER; obj->spe = 0; } break; case SPBOOK_CLASS: /* Spell books get blanked... */ if (obj->otyp == SPE_BOOK_OF_THE_DEAD) pline("Steam rises from %s.", the(xname(obj))); else obj->otyp = SPE_BLANK_PAPER; break; case POTION_CLASS: if (obj->otyp == POT_ACID) { /* damage player/monster? */ pline("A potion explodes!"); delobj(obj); continue; } else /* Potions turn to water or amnesia... */ if (level.flags.lethe) { if (obj->otyp == POT_WATER) obj->otyp = POT_AMNESIA; else if (obj->otyp != POT_AMNESIA) { obj->otyp = POT_WATER; obj->odiluted = 0; } } else if (obj->odiluted || obj->otyp == POT_AMNESIA) { obj->otyp = POT_WATER; obj->blessed = obj->cursed = 0; obj->odiluted = 0; } else if (obj->otyp != POT_WATER) obj->odiluted++; break; case GEM_CLASS: if (level.flags.lethe && (obj->otyp == LUCKSTONE || obj->otyp == LOADSTONE || obj->otyp == HEALTHSTONE || obj->otyp == TOUCHSTONE)) obj->otyp = FLINT; break; case TOOL_CLASS: if (level.flags.lethe) { switch (obj->otyp) { case MAGIC_LAMP: obj->otyp = OIL_LAMP; break; case MAGIC_CANDLE: obj->otyp = rn2(2)? WAX_CANDLE : TALLOW_CANDLE; break; case MAGIC_WHISTLE: obj->otyp = TIN_WHISTLE; break; case MAGIC_FLUTE: obj->otyp = WOODEN_FLUTE; obj->spe = 0; break; case MAGIC_HARP: obj->otyp = WOODEN_HARP; obj->spe = 0; break; case FIRE_HORN: case FROST_HORN: case HORN_OF_PLENTY: obj->otyp = TOOLED_HORN; obj->spe = 0; break; case DRUM_OF_EARTHQUAKE: obj->otyp = LEATHER_DRUM; obj->spe = 0; break; } } /* Drop through */ /* Weapons, armor and tools may be disenchanted... */ /* Wands and rings lose a charge... */ case WEAPON_CLASS: case ARMOR_CLASS: case WAND_CLASS: case RING_CLASS: if ( level.flags.lethe && ( obj->oclass == WEAPON_CLASS || obj->oclass == ARMOR_CLASS || obj->oclass == WAND_CLASS || obj->oclass == RING_CLASS || is_weptool(obj) )) { /* Shift enchantment one step closer to 0 */ if (obj->spe > 0) drain_item(obj); } /* Magic markers run... */ if ( level.flags.lethe && obj->otyp == MAGIC_MARKER ) { obj->spe -= (3 + rn2(10)); if (obj->spe < 0) obj->spe = 0; } /* Drop through for rusting effects... */ /* Weapons, armor, tools and other things may rust... */ default: if (is_rustprone(obj) && obj->oeroded < MAX_ERODE && !(obj->oerodeproof || (obj->blessed && !rnl(4)))) obj->oeroded++; /* The Lethe may unfooproof the item... */ if (level.flags.lethe && obj->oerodeproof && !rn2(5)) obj->oerodeproof = FALSE; } } } } /* * This function is potentially expensive - rolling * inventory list multiple times. Luckily it's seldom needed. * Returns TRUE if disrobing made player unencumbered enough to * crawl out of the current predicament. */ STATIC_OVL boolean emergency_disrobe(lostsome) boolean *lostsome; { int invc = inv_cnt(); while (near_capacity() > (Punished ? UNENCUMBERED : SLT_ENCUMBER)) { register struct obj *obj, *otmp = (struct obj *)0; register int i; /* Pick a random object */ if (invc > 0) { i = rn2(invc); for (obj = invent; obj; obj = obj->nobj) { /* * Undroppables are: body armor, boots, gloves, * amulets, and rings because of the time and effort * in removing them + loadstone and other cursed stuff * for obvious reasons. */ if (!((obj->otyp == LOADSTONE && obj->cursed) || obj == uamul || obj == uleft || obj == uright || obj == ublindf || obj == uarm || obj == uarmc || obj == uarmg || obj == uarmf || #ifdef TOURIST obj == uarmu || #endif (obj->cursed && (obj == uarmh || obj == uarms)) || welded(obj))) otmp = obj; /* reached the mark and found some stuff to drop? */ if (--i < 0 && otmp) break; /* else continue */ } } #ifndef GOLDOBJ if (!otmp) { /* Nothing available left to drop; try gold */ if (u.ugold) { pline("In desperation, you drop your purse."); /* Hack: gold is not in the inventory, so make a gold object * and put it at the head of the inventory list. */ obj = mkgoldobj(u.ugold); /* removes from u.ugold */ obj->in_use = TRUE; u.ugold = obj->quan; /* put the gold back */ 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) remove_worn_item(otmp, FALSE); *lostsome = TRUE; dropx(otmp); invc--; } return(TRUE); } /* * return(TRUE) == player relocated */ boolean drown() { boolean inpool_ok = FALSE, crawl_ok; int i, x, y; const char *sparkle = level.flags.lethe? "sparkling " : ""; /* happily wading in the same contiguous pool */ if (u.uinwater && is_pool(u.ux-u.dx,u.uy-u.dy) && (Swimming || Amphibious)) { /* water effects on objects every now and then */ if (!rn2(5)) inpool_ok = TRUE; else return(FALSE); } if (!u.uinwater) { You("%s into the %swater%c", Is_waterlevel(&u.uz) ? "plunge" : "fall", sparkle, Amphibious || Swimming ? '.' : '!'); if (!Swimming && !Is_waterlevel(&u.uz)) You("sink like %s.", Hallucination ? "the Titanic" : "a rock"); } if (level.flags.lethe) { /* Bad idea */ You_feel("the sparkling waters of the Lethe sweep away your " "cares!"); forget(25); } water_damage(invent, FALSE, FALSE); if (u.umonnum == PM_GREMLIN && rn2(3)) (void)split_mon(&youmonst, (struct monst *)0); else if (u.umonnum == PM_IRON_GOLEM) { You("rust!"); i = d(2,6); if (u.mhmax > i) u.mhmax -= i; losehp(i, "rusting away", KILLED_BY); } if (inpool_ok) return(FALSE); if ((i = number_leashed()) > 0) { pline_The("leash%s slip%s loose.", (i > 1) ? "es" : "", (i > 1) ? "" : "s"); unleash_all(); } if (Amphibious || Swimming) { if (Amphibious) { if (flags.verbose) pline("But you aren't drowning."); if (!Is_waterlevel(&u.uz)) { if (Hallucination) Your("keel hits the bottom."); else You("touch bottom."); } } if (Punished) { unplacebc(); placebc(); } vision_recalc(2); /* unsee old position */ u.uinwater = 1; under_water(1); vision_full_recalc = 1; return(FALSE); } else if (Swimming && !Is_waterlevel(&u.uz)) { if (Punished) { unplacebc(); placebc(); } u.uinwater = 1; under_water(1); vision_full_recalc = 1; return(FALSE); } if ((Teleportation || can_teleport(youmonst.data)) && !u.usleep && (Teleport_control || rn2(3) < Luck+2)) { You("attempt a teleport spell."); /* utcsri!carroll */ if (!level.flags.noteleport) { (void) dotele(); if(!is_pool(u.ux,u.uy)) return(TRUE); } else pline_The("attempted teleport spell fails."); } #ifdef STEED if (u.usteed) { dismount_steed(DISMOUNT_GENERIC); if(!is_pool(u.ux,u.uy)) return(TRUE); } #endif crawl_ok = FALSE; x = y = 0; /* lint suppression */ /* if sleeping, wake up now so that we don't crawl out of water while still asleep; we can't do that the same way that waking due to combat is handled; note unmul() clears u.usleep */ if (u.usleep) unmul("Suddenly you wake up!"); /* can't crawl if unable to move (crawl_ok flag stays false) */ if (multi < 0 || (Upolyd && !youmonst.data->mmove)) goto crawl; /* look around for a place to crawl to */ for (i = 0; i < 100; i++) { x = rn1(3,u.ux - 1); y = rn1(3,u.uy - 1); if (goodpos(x, y, &youmonst, 0)) { crawl_ok = TRUE; goto crawl; } } /* one more scan */ for (x = u.ux - 1; x <= u.ux + 1; x++) for (y = u.uy - 1; y <= u.uy + 1; y++) if (goodpos(x, y, &youmonst, 0)) { crawl_ok = TRUE; goto crawl; } crawl: if (crawl_ok) { boolean lost = FALSE; /* time to do some strip-tease... */ boolean succ = Is_waterlevel(&u.uz) ? TRUE : emergency_disrobe(&lost); You("try to crawl out of the water."); if (lost) You("dump some of your gear to lose weight..."); if (succ) { pline("Pheew! That was close."); teleds(x,y,TRUE); return(TRUE); } /* still too much weight */ pline("But in vain."); } u.uinwater = 1; You("drown."); /* [ALI] Vampires return to vampiric form on drowning. */ if (Upolyd && !Unchanging && Race_if(PM_VAMPIRE)) { rehumanize(); u.uinwater = 0; You("fly up out of the water!"); return (TRUE); } killer_format = KILLED_BY_AN; killer = (levl[u.ux][u.uy].typ == POOL || Is_medusa_level(&u.uz)) ? "pool of water" : "moat"; done(DROWNING); /* oops, we're still alive. better get out of the water. */ while (!safe_teleds(TRUE)) { pline("You're still drowning."); done(DROWNING); } if (u.uinwater) { u.uinwater = 0; You("find yourself back %s.", Is_waterlevel(&u.uz) ? "in an air bubble" : "on land"); } return(TRUE); } void drain_en(n) register int n; { if (!u.uenmax) return; You_feel("your magical energy drain away!"); u.uen -= n; if(u.uen < 0) { u.uenmax += u.uen; if(u.uenmax < 0) u.uenmax = 0; u.uen = 0; } flags.botl = 1; } int dountrap() /* disarm a trap */ { if (near_capacity() >= HVY_ENCUMBER) { 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)) { pline("You'll have to let go of %s first.", mon_nam(u.ustuck)); return 0; } if (u.ustuck || (welded(uwep) && bimanual(uwep))) { Your("%s seem to be too busy for that.", makeplural(body_part(HAND))); return 0; } return untrap(FALSE); } #endif /* OVLB */ #ifdef OVL2 /* Probability of disabling a trap. Helge Hafting */ STATIC_OVL int untrap_prob(ttmp) struct trap *ttmp; { 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; if (Fumbling) chance *= 2; /* Your own traps are better known than others. */ if (ttmp && ttmp->madeby_u) chance--; 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); } /* Replace trap with object(s). Helge Hafting */ STATIC_OVL void cnv_trap_obj(otyp, cnt, ttmp) int otyp; int cnt; struct trap *ttmp; { struct obj *otmp = mksobj(otyp, TRUE, FALSE); /* [ALI] Only dart traps are capable of being poisonous */ if (otyp != DART) otmp->opoisoned = 0; 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); stackobj(otmp); newsym(ttmp->tx, ttmp->ty); deltrap(ttmp); } /* while attempting to disarm an adjacent trap, we've fallen into it */ STATIC_OVL void move_into_trap(ttmp) struct trap *ttmp; { int bc; xchar x = ttmp->tx, y = ttmp->ty, bx, by, cx, cy; boolean unused; /* we know there's no monster in the way, and we're not trapped */ if (!Punished || drag_ball(x, y, &bc, &bx, &by, &cx, &cy, &unused, TRUE)) { u.ux0 = u.ux, u.uy0 = u.uy; u.ux = x, u.uy = y; u.umoved = TRUE; newsym(u.ux0, u.uy0); vision_recalc(1); check_leash(u.ux0, u.uy0); if (Punished) move_bc(0, bc, bx, by, cx, cy); spoteffects(FALSE); /* dotrap() */ exercise(A_WIS, FALSE); } } /* 0: doesn't even try * 1: tries and fails * 2: succeeds */ STATIC_OVL int try_disarm(ttmp, force_failure) struct trap *ttmp; boolean force_failure; { 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; } /* We might be forced to move onto the trap's location. */ if (sobj_at(BOULDER, ttmp->tx, ttmp->ty) && !Passes_walls && !under_u) { There("is a boulder in your way."); return 0; } /* duplicate tight-space checks from test_move */ if (u.dx && u.dy && bad_rock(&youmonst, u.ux, ttmp->ty) && bad_rock(&youmonst, 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 if (u.usteed && P_SKILL(P_RIDING) < P_BASIC) You("aren't skilled enough to reach from %s.", mon_nam(u.usteed)); else #endif You("are unable to reach the %s!", defsyms[trap_to_defsym(ttype)].explanation); return 0; } /* Will our hero succeed? */ 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); #ifdef STEED if (u.usteed && u.utrap) { /* you, not steed, are trapped */ dismount_steed(DISMOUNT_FELL); } #endif } } 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; } return 2; } STATIC_OVL void reward_untrap(ttmp, mtmp) struct trap *ttmp; struct monst *mtmp; { if (!ttmp->madeby_u) { if (rnl(10) < 8 && !mtmp->mpeaceful && !mtmp->msleeping && !mtmp->mfrozen && !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; int fails = try_disarm(ttmp, FALSE); if (fails < 2) return fails; /* ok, disarm it. */ /* untrap the monster, if any. 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; } STATIC_OVL int disarm_landmine(ttmp) /* Helge Hafting */ struct trap *ttmp; { int fails = try_disarm(ttmp, FALSE); if (fails < 2) return fails; You("disarm %s land mine.", the_your[ttmp->madeby_u]); cnv_trap_obj(LAND_MINE, 1, ttmp); return 1; } STATIC_OVL int disarm_rust_trap(ttmp) /* Paul Sonier */ struct trap *ttmp; { xchar trapx = ttmp->tx, trapy = ttmp->ty; int fails = try_disarm(ttmp, FALSE); if (fails < 2) return fails; You("disarm the water trap!"); deltrap(ttmp); levl[trapx][trapy].typ = FOUNTAIN; newsym(trapx, trapy); level.flags.nfountains++; return 1; } /* getobj will filter down to cans of grease and known potions of oil */ static NEARDATA const char oil[] = { ALL_CLASSES, TOOL_CLASS, POTION_CLASS, 0 }; static NEARDATA const char disarmpotion[] = { ALL_CLASSES, POTION_CLASS, 0 }; /* water disarms, oil will explode */ STATIC_OVL int disarm_fire_trap(ttmp) /* Paul Sonier */ struct trap *ttmp; { int fails; struct obj *obj; boolean bad_tool; obj = getobj(disarmpotion, "untrap with"); if (!obj) return 0; if (obj->otyp == POT_OIL) { Your("potion of oil explodes!"); splatter_burning_oil(ttmp->tx,ttmp->ty); delobj(obj); return 1; } bad_tool = (obj->cursed || (obj->otyp != POT_WATER)); fails = try_disarm(ttmp, bad_tool); if (fails < 2) return fails; useup(obj); makeknown(POT_WATER); You("manage to extinguish the pilot light!"); cnv_trap_obj(POT_OIL, 4 - rnl(4), ttmp); more_experienced(1, 5); newexplevel(); return 1; } /* it may not make much sense to use grease on floor boards, but so what? */ STATIC_OVL int disarm_squeaky_board(ttmp) struct trap *ttmp; { struct obj *obj; boolean bad_tool; int fails, trapx = ttmp->tx, trapy = ttmp->ty; obj = getobj(oil, "untrap with"); if (!obj) return 0; bad_tool = (obj->cursed || ((obj->otyp != POT_OIL || obj->lamplit) && (obj->otyp != CAN_OF_GREASE || !obj->spe))); fails = try_disarm(ttmp, bad_tool); if (fails < 2) return fails; /* successfully used oil or grease to fix squeaky board */ if (obj->otyp == CAN_OF_GREASE) { consume_obj_charge(obj, TRUE); } else { useup(obj); /* oil */ makeknown(POT_OIL); } You("repair the squeaky board."); /* no madeby_u */ deltrap(ttmp); newsym(trapx, trapy); more_experienced(1, 5); return 1; } /* removes traps that shoot arrows, darts, etc. */ STATIC_OVL int disarm_shooting_trap(ttmp, otyp) struct trap *ttmp; int otyp; { int fails = try_disarm(ttmp, FALSE); if (fails < 2) return fails; You("disarm %s trap.", the_your[ttmp->madeby_u]); cnv_trap_obj(otyp, 50-rnl(50), ttmp); return 1; } /* Is the weight too heavy? * Formula as in near_capacity() & check_capacity() */ STATIC_OVL int try_lift(mtmp, ttmp, wt, stuff) struct monst *mtmp; struct trap *ttmp; int wt; boolean stuff; { 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; } /* Help trapped monster (out of a (spiked) pit) */ STATIC_OVL int help_monster_out(mtmp, ttmp) struct monst *mtmp; struct trap *ttmp; { int wt; struct obj *otmp; boolean uprob; /* * This works when levitating too -- consistent with the ability * to hit monsters while levitating. * * Should perhaps check that our hero has arms/hands at the * moment. Helping can also be done by engulfing... * * Test the monster first - monsters are displayed before traps. */ if (!mtmp->mtrapped) { pline("%s isn't trapped.", Monnam(mtmp)); return 0; } /* Do you have the necessary capacity to lift anything? */ 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)); return 1; } /* is it a cockatrice?... */ if (touch_petrifies(mtmp->data) && !uarmg && !Stone_resistance) { You("grab the trapped %s using your bare %s.", mtmp->data->mname, makeplural(body_part(HAND))); if (poly_when_stoned(youmonst.data) && polymon(PM_STONE_GOLEM)) display_nhwindow(WIN_MESSAGE, FALSE); else { char kbuf[BUFSZ]; Sprintf(kbuf, "trying to help %s out of a pit", an(mtmp->data->mname)); instapetrify(kbuf); 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; /* is the monster with inventory too heavy? */ for (otmp = mtmp->minvent; otmp; otmp = otmp->nobj) wt += otmp->owt; if (!try_lift(mtmp, ttmp, wt, TRUE)) return 1; You("pull %s out of the pit.", mon_nam(mtmp)); mtmp->mtrapped = 0; fill_pit(mtmp->mx, mtmp->my); reward_untrap(ttmp, mtmp); return 1; } int untrap(force) boolean force; { register struct obj *otmp; register boolean confused = (Confusion > 0 || Hallucination > 0); register int x,y; int ch; struct trap *ttmp; struct monst *mtmp; boolean trap_skipped = FALSE; boolean box_here = FALSE; boolean deal_with_floor_trap = FALSE; char the_trap[BUFSZ], qbuf[QBUFSZ]; int containercnt = 0; if(!getdir((char *)0)) return(0); x = u.ux + u.dx; y = u.uy + u.dy; for(otmp = level.objects[x][y]; otmp; otmp = otmp->nexthere) { if(Is_box(otmp) && !u.dx && !u.dy) { box_here = TRUE; containercnt++; if (containercnt > 1) break; } } if ((ttmp = t_at(x,y)) && ttmp->tseen) { deal_with_floor_trap = TRUE; Strcpy(the_trap, the(defsyms[trap_to_defsym(ttmp->ttyp)].explanation)); if (box_here) { if (ttmp->ttyp == PIT || ttmp->ttyp == SPIKED_PIT) { You_cant("do much about %s%s.", the_trap, u.utrap ? " that you're stuck in" : " while standing on the edge of it"); trap_skipped = TRUE; deal_with_floor_trap = FALSE; } else { Sprintf(qbuf, "There %s and %s here. %s %s?", (containercnt == 1) ? "is a container" : "are containers", an(defsyms[trap_to_defsym(ttmp->ttyp)].explanation), ttmp->ttyp == WEB ? "Remove" : "Disarm", the_trap); switch (ynq(qbuf)) { case 'q': return(0); case 'n': trap_skipped = TRUE; deal_with_floor_trap = FALSE; break; } } } if (deal_with_floor_trap) { if (u.utrap) { You("cannot deal with %s while trapped%s!", the_trap, (x == u.ux && y == u.uy) ? " in it" : ""); return 1; } switch(ttmp->ttyp) { case BEAR_TRAP: case WEB: return disarm_holdingtrap(ttmp); case LANDMINE: return disarm_landmine(ttmp); case SQKY_BOARD: return disarm_squeaky_board(ttmp); case DART_TRAP: return disarm_shooting_trap(ttmp, DART); case ARROW_TRAP: return disarm_shooting_trap(ttmp, ARROW); case RUST_TRAP: return disarm_rust_trap(ttmp); case FIRE_TRAP: return disarm_fire_trap(ttmp); case PIT: case SPIKED_PIT: if (!u.dx && !u.dy) { You("are already on the edge of the pit."); return 0; } if (!(mtmp = m_at(x,y))) { pline("Try filling the pit instead."); return 0; } return help_monster_out(mtmp, ttmp); default: You("cannot disable %s trap.", (u.dx || u.dy) ? "that" : "this"); return 0; } } } /* end if */ if(!u.dx && !u.dy) { for(otmp = level.objects[x][y]; otmp; otmp = otmp->nexthere) if(Is_box(otmp)) { Sprintf(qbuf, "There is %s here. Check it for traps?", safe_qbuf("", sizeof("There is here. Check it for traps?"), doname(otmp), an(simple_typename(otmp->otyp)), "a box")); switch (ynq(qbuf)) { case 'q': return(0); case 'n': continue; } #ifdef STEED if (u.usteed && P_SKILL(P_RIDING) < P_BASIC) { You("aren't skilled enough to reach from %s.", mon_nam(u.usteed)); return(0); } #endif if((otmp->otrapped && (force || (!confused && rn2(MAXULEV + 1 - u.ulevel) < 10))) || (!force && confused && !rn2(3))) { You("find a trap on %s!", the(xname(otmp))); if (!confused) exercise(A_WIS, TRUE); switch (ynq("Disarm it?")) { case 'q': return(1); case 'n': trap_skipped = TRUE; continue; } if(otmp->otrapped) { exercise(A_DEX, TRUE); ch = ACURR(A_DEX) + u.ulevel; if (Role_if(PM_ROGUE)) ch *= 2; if(!force && (confused || Fumbling || rnd(75+level_difficulty()/2) > ch)) { (void) chest_trap(otmp, FINGER, TRUE); } else { You("disarm it!"); otmp->otrapped = 0; } } else pline("That %s was not trapped.", xname(otmp)); return(1); } else { You("find no traps on %s.", the(xname(otmp))); return(1); } } You(trap_skipped ? "find no other traps here." : "know of no traps here."); return(0); } if ((mtmp = m_at(x,y)) && mtmp->m_ap_type == M_AP_FURNITURE && (mtmp->mappearance == S_hcdoor || mtmp->mappearance == S_vcdoor) && !Protection_from_shape_changers) { stumble_onto_mimic(mtmp); return(1); } if (!IS_DOOR(levl[x][y].typ)) { if ((ttmp = t_at(x,y)) && ttmp->tseen) You("cannot disable that trap."); else You("know of no traps there."); return(0); } switch (levl[x][y].doormask) { case D_NODOOR: You("%s no door there.", Blind ? "feel" : "see"); return(0); case D_ISOPEN: pline("This door is safely open."); return(0); case D_BROKEN: pline("This door is broken."); return(0); } if ((levl[x][y].doormask & D_TRAPPED && (force || (!confused && rn2(MAXULEV - u.ulevel + 11) < 10))) || (!force && confused && !rn2(3))) { You("find a trap on the door!"); exercise(A_WIS, TRUE); if (ynq("Disarm it?") != 'y') return(1); if (levl[x][y].doormask & D_TRAPPED) { ch = 15 + (Role_if(PM_ROGUE) ? u.ulevel*3 : u.ulevel); exercise(A_DEX, TRUE); if(!force && (confused || Fumbling || rnd(75+level_difficulty()/2) > ch)) { You("set it off!"); b_trapped("door", FINGER); levl[x][y].doormask = D_NODOOR; unblock_point(x, y); newsym(x, y); /* (probably ought to charge for this damage...) */ if (*in_rooms(x, y, SHOPBASE)) add_damage(x, y, 0L); } else { You("disarm it!"); levl[x][y].doormask &= ~D_TRAPPED; } } else pline("This door was not trapped."); return(1); } else { You("find no traps on the door."); return(1); } } #endif /* OVL2 */ #ifdef OVLB /* only called when the player is doing something to the chest directly */ boolean chest_trap(obj, bodypart, disarm) register struct obj *obj; register int bodypart; boolean disarm; { register struct obj *otmp = obj, *otmp2; char buf[80]; const char *msg; coord cc; if (get_obj_location(obj, &cc.x, &cc.y, 0)) /* might be carried */ obj->ox = cc.x, obj->oy = cc.y; otmp->otrapped = 0; /* trap is one-shot; clear flag first in case chest kills you and ends up in bones file */ You(disarm ? "set it off!" : "trigger a trap!"); display_nhwindow(WIN_MESSAGE, FALSE); if (Luck > -13 && rn2(13+Luck) > 7) { /* saved by luck */ /* trap went off, but good luck prevents damage */ switch (rn2(13)) { case 12: case 11: msg = "explosive charge is a dud"; break; case 10: case 9: msg = "electric charge is grounded"; break; case 8: case 7: msg = "flame fizzles out"; break; case 6: case 5: case 4: msg = "poisoned needle misses"; break; case 3: case 2: case 1: case 0: msg = "gas cloud blows away"; break; default: impossible("chest disarm bug"); msg = (char *)0; break; } if (msg) pline("But luckily the %s!", msg); } else { switch(rn2(20) ? ((Luck >= 13) ? 0 : rn2(13-Luck)) : rn2(26)) { case 25: case 24: case 23: case 22: case 21: { struct monst *shkp = 0; long loss = 0L; boolean costly, insider; register xchar ox = obj->ox, oy = obj->oy; /* the obj location need not be that of player */ costly = (costly_spot(ox, oy) && (shkp = shop_keeper(*in_rooms(ox, oy, SHOPBASE))) != (struct monst *)0); 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) loss += stolen_value(obj, ox, oy, (boolean)shkp->mpeaceful, TRUE, TRUE); delete_contents(obj); /* we're about to delete all things at this location, * which could include the ball & chain. * If we attempt to call unpunish() in the * for-loop below we can end up with otmp2 * being invalid once the chain is gone. * Deal with ball & chain right now instead. */ if (Punished && !carried(uball) && ((uchain->ox == u.ux && uchain->oy == u.uy) || (uball->ox == u.ux && uball->oy == u.uy))) unpunish(); for(otmp = level.objects[u.ux][u.uy]; otmp; otmp = otmp2) { otmp2 = otmp->nexthere; if(costly) loss += stolen_value(otmp, otmp->ox, otmp->oy, (boolean)shkp->mpeaceful, TRUE, TRUE); delobj(otmp); } wake_nearby(); losehp(d(6,6), buf, KILLED_BY_AN); 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); } } return TRUE; } case 20: case 19: case 18: case 17: pline("A cloud of noxious gas billows from %s.", the(xname(obj))); poisoned("gas cloud", A_STR, "cloud of poison gas",15); exercise(A_CON, FALSE); break; case 16: case 15: case 14: case 13: You_feel("a needle prick your %s.",body_part(bodypart)); poisoned("needle", A_CON, "poisoned needle",10); exercise(A_CON, FALSE); break; case 12: case 11: case 10: case 9: dofiretrap(obj); break; case 8: case 7: case 6: { int dmg; You("are jolted by a surge of electricity!"); if(Shock_resistance) { shieldeff(u.ux, u.uy); You("don't seem to be affected."); dmg = 0; } else dmg = d(4, 4); destroy_item(RING_CLASS, AD_ELEC); destroy_item(WAND_CLASS, AD_ELEC); if (dmg) losehp(dmg, "electric shock", KILLED_BY_AN); break; } case 5: case 4: case 3: if (!Free_action) { if (!Free_action) { pline("Suddenly you are frozen in place!"); nomul(-d(5, 6)); exercise(A_DEX, FALSE); nomovemsg = You_can_move_again; } else You("momentarily stiffen."); } else You("momentarily stiffen."); break; case 2: case 1: case 0: pline("A cloud of %s gas billows from %s.", Blind ? blindgas[rn2(SIZE(blindgas))] : rndcolor(), the(xname(obj))); if(!Stunned) { 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); (void) make_hallucinated(HHallucination + rn1(5, 16),FALSE,0L); break; default: impossible("bad chest trap"); break; } bot(); /* to get immediate botl re-display */ } return FALSE; } #endif /* OVLB */ #ifdef OVL0 struct trap * t_at(x,y) register int x, y; { register struct trap *trap = ftrap; while(trap) { if(trap->tx == x && trap->ty == y) return(trap); trap = trap->ntrap; } return((struct trap *)0); } #endif /* OVL0 */ #ifdef OVLB void deltrap(trap) register struct trap *trap; { register struct trap *ttmp; if(trap == ftrap) ftrap = ftrap->ntrap; else { for(ttmp = ftrap; ttmp->ntrap != trap; ttmp = ttmp->ntrap) ; ttmp->ntrap = trap->ntrap; } dealloc_trap(trap); } boolean delfloortrap(ttmp) register struct trap *ttmp; { /* Destroy a trap that emanates from the floor. */ /* some of these are arbitrary -dlc */ if (ttmp && ((ttmp->ttyp == SQKY_BOARD) || (ttmp->ttyp == BEAR_TRAP) || (ttmp->ttyp == LANDMINE) || (ttmp->ttyp == FIRE_TRAP) || (ttmp->ttyp == PIT) || (ttmp->ttyp == SPIKED_PIT) || (ttmp->ttyp == HOLE) || (ttmp->ttyp == TRAPDOOR) || (ttmp->ttyp == TELEP_TRAP) || (ttmp->ttyp == LEVEL_TELEP) || (ttmp->ttyp == WEB) || (ttmp->ttyp == MAGIC_TRAP) || (ttmp->ttyp == ANTI_MAGIC))) { register struct monst *mtmp; if (ttmp->tx == u.ux && ttmp->ty == u.uy) { u.utrap = 0; u.utraptype = 0; } else if ((mtmp = m_at(ttmp->tx, ttmp->ty)) != 0) { mtmp->mtrapped = 0; } deltrap(ttmp); return TRUE; } else return FALSE; } /* used for doors (also tins). can be used for anything else that opens. */ void b_trapped(item, bodypart) register const char *item; register int bodypart; { register int lvl = level_difficulty(); int dmg = rnd(5 + (lvl < 5 ? lvl : 2+lvl/2)); pline("KABOOM!! %s was booby-trapped!", The(item)); wake_nearby(); losehp(dmg, "explosion", KILLED_BY_AN); exercise(A_STR, FALSE); if (bodypart) exercise(A_CON, FALSE); make_stunned(HStun + dmg, TRUE); } /* Monster is hit by trap. */ /* Note: doesn't work if both obj and d_override are null */ STATIC_OVL boolean thitm(tlev, mon, obj, d_override, nocorpse) int tlev; struct monst *mon; struct obj *obj; int d_override; boolean nocorpse; { int strike; boolean trapkilled = FALSE; if (d_override) strike = 1; else if (obj) strike = (find_mac(mon) + tlev + obj->spe <= rnd(20)); else strike = (find_mac(mon) + tlev <= rnd(20)); /* Actually more accurate than thitu, which doesn't take * 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; if (obj && cansee(mon->mx, mon->my)) pline("%s is hit by %s!", Monnam(mon), doname(obj)); if (d_override) dam = d_override; else if (obj) { dam = dmgval(obj, mon); if (dam < 1) dam = 1; } if ((mon->mhp -= dam) <= 0) { int xx = mon->mx; int yy = mon->my; monkilled(mon, "", nocorpse ? -AD_RBRE : AD_PHYS); if (mon->mhp <= 0) { newsym(xx, yy); trapkilled = TRUE; } } } if (obj && (!strike || d_override)) { place_object(obj, mon->mx, mon->my); stackobj(obj); } else if (obj) dealloc_obj(obj); return trapkilled; } boolean unconscious() { return((boolean)(multi < 0 && (!nomovemsg || u.usleep || !strncmp(nomovemsg,"You regain con", 14) || !strncmp(nomovemsg,"You are consci", 14)))); } static const char lava_killer[] = "molten lava"; boolean lava_effects() { register struct obj *obj, *obj2; int dmg; boolean usurvive; burn_away_slime(); if (likes_lava(youmonst.data)) return FALSE; if (Slimed) { pline("The slime boils away!"); Slimed = 0; } if (!Fire_resistance) { if(Wwalking) { dmg = d(6,6); pline_The("lava here burns you!"); if(dmg < u.uhp) { losehp(dmg, lava_killer, KILLED_BY); goto burn_stuff; } } else You("fall into the lava!"); usurvive = Lifesaved || discover; #ifdef WIZARD if (wizard) usurvive = TRUE; #endif for(obj = invent; obj; obj = obj2) { obj2 = obj->nobj; if(is_organic(obj) && !obj->oerodeproof) { if(obj->owornmask) { if (usurvive) Your("%s into flame!", aobjnam(obj, "burst")); if(obj == uarm) (void) Armor_gone(); else if(obj == uarmc) (void) Cloak_off(); else if(obj == uarmh) (void) Helmet_off(); else if(obj == uarms) (void) Shield_off(); else if(obj == uarmg) (void) Gloves_off(); else if(obj == uarmf) (void) Boots_off(); #ifdef TOURIST else if(obj == uarmu) setnotworn(obj); #endif else if(obj == uleft) Ring_gone(obj); else if(obj == uright) Ring_gone(obj); else if(obj == ublindf) Blindf_off(obj); else if(obj == uamul) Amulet_off(); else if(obj == uwep) uwepgone(); else if (obj == uquiver) uqwepgone(); else if (obj == uswapwep) uswapwepgone(); } useupall(obj); } } /* s/he died... */ u.uhp = -1; killer_format = KILLED_BY; killer = lava_killer; You("burn to a crisp..."); done(BURNING); while (!safe_teleds(TRUE)) { pline("You're still burning."); done(BURNING); } You("find yourself back on solid %s.", surface(u.ux, u.uy)); return(TRUE); } if (!Wwalking) { u.utrap = rn1(4, 4) + (rn1(4, 12) << 8); u.utraptype = TT_LAVA; You("sink into the lava, but it only burns slightly!"); if (u.uhp > 1) losehp(1, lava_killer, KILLED_BY); } /* just want to burn boots, not all armor; destroy_item doesn't work on armor anyway */ burn_stuff: if(uarmf && !uarmf->oerodeproof && is_organic(uarmf)) { /* save uarmf value because Boots_off() sets uarmf to null */ obj = uarmf; Your("%s bursts into flame!", xname(obj)); (void) Boots_off(); useup(obj); } destroy_item(SCROLL_CLASS, AD_FIRE); destroy_item(SPBOOK_CLASS, AD_FIRE); destroy_item(POTION_CLASS, AD_FIRE); return(FALSE); } #endif /* OVLB */ /*trap.c*/ slashem-0.0.7E7F3/src/eat.c0000644000076400007640000024754110545462317013373 0ustar aliali/* SCCS Id: @(#)eat.c 3.4 2003/02/13 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" /* #define DEBUG */ /* uncomment to enable new eat code debugging */ #ifdef DEBUG # ifdef WIZARD #define debugpline if (wizard) pline # else #define debugpline pline # endif #endif STATIC_PTR int NDECL(eatmdone); STATIC_PTR int NDECL(eatfood); STATIC_PTR void FDECL(costly_tin, (const char*)); STATIC_PTR int NDECL(opentin); STATIC_PTR int NDECL(unfaint); #ifdef OVLB STATIC_DCL const char *FDECL(food_xname, (struct obj *,BOOLEAN_P)); STATIC_DCL void FDECL(choke, (struct obj *)); STATIC_DCL void NDECL(recalc_wt); STATIC_DCL struct obj *FDECL(touchfood, (struct obj *)); STATIC_DCL void NDECL(do_reset_eat); STATIC_DCL void FDECL(done_eating, (BOOLEAN_P)); STATIC_DCL void FDECL(cprefx, (int)); STATIC_DCL int FDECL(intrinsic_possible, (int,struct permonst *)); STATIC_DCL void FDECL(givit, (int,struct permonst *)); STATIC_DCL void FDECL(cpostfx, (int)); STATIC_DCL void FDECL(start_tin, (struct obj *)); STATIC_DCL int FDECL(eatcorpse, (struct obj *)); STATIC_DCL void FDECL(start_eating, (struct obj *)); STATIC_DCL void FDECL(fprefx, (struct obj *)); STATIC_DCL void FDECL(accessory_has_effect, (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 *)); STATIC_DCL boolean FDECL(maybe_cannibal, (int,BOOLEAN_P)); STATIC_DCL struct obj *FDECL(floorfood, (const char *)); char msgbuf[BUFSZ]; #endif /* OVLB */ /* hunger texts used on bottom line (each 8 chars long) */ #define SATIATED 0 #define NOT_HUNGRY 1 #define HUNGRY 2 #define WEAK 3 #define FAINTING 4 #define FAINTED 5 #define STARVED 6 /* also used to see if you're allowed to eat cats and dogs */ #define CANNIBAL_ALLOWED() (Role_if(PM_CAVEMAN) || Race_if(PM_ORC) || \ Race_if(PM_HUMAN_WEREWOLF) || Race_if(PM_VAMPIRE)) #ifndef OVLB STATIC_DCL NEARDATA const char comestibles[]; STATIC_DCL NEARDATA const char allobj[]; STATIC_DCL boolean force_save_hs; #else STATIC_OVL NEARDATA const char comestibles[] = { FOOD_CLASS, 0 }; /* Gold must come first for getobj(). */ STATIC_OVL NEARDATA const char allobj[] = { COIN_CLASS, ALLOW_FLOOROBJ, WEAPON_CLASS, ARMOR_CLASS, POTION_CLASS, SCROLL_CLASS, WAND_CLASS, RING_CLASS, AMULET_CLASS, FOOD_CLASS, TOOL_CLASS, GEM_CLASS, ROCK_CLASS, BALL_CLASS, CHAIN_CLASS, SPBOOK_CLASS, 0 }; STATIC_OVL boolean force_save_hs = FALSE; const char *hu_stat[] = { "Satiated", " ", "Hungry ", "Weak ", "Fainting", "Fainted ", "Starved " }; #endif /* OVLB */ #ifdef OVL1 /* * Decide whether a particular object can be eaten by the possibly * polymorphed character. Not used for monster checks. */ boolean is_edible(obj) register struct obj *obj; { /* protect invocation tools but not Rider corpses (handled elsewhere)*/ /* if (obj->oclass != FOOD_CLASS && obj_resists(obj, 0, 0)) */ if (evades_destruction(obj)) return FALSE; if (objects[obj->otyp].oc_unique) return FALSE; /* 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; /* KMH -- Taz likes organics, too! */ if ((u.umonnum == PM_GELATINOUS_CUBE || u.umonnum == PM_TASMANIAN_DEVIL) && is_organic(obj) && /* [g.cubes can eat containers and retain all contents as engulfed items, but poly'd player can't do that] */ !Has_contents(obj)) return TRUE; /* Koalas only eat Eucalyptus leaves */ if (u.umonnum == PM_KOALA) return (boolean)(obj->otyp == EUCALYPTUS_LEAF); /* Ghouls, ghasts only eat corpses */ if (u.umonnum == PM_GHOUL || u.umonnum == PM_GHAST) return (boolean)(obj->otyp == CORPSE); /* Vampires drink the blood of meaty corpses */ /* [ALI] (fully) drained food is not presented as an option, * but partly eaten food is (even though you can't drain it). */ if (is_vampire(youmonst.data)) return (boolean)(obj->otyp == CORPSE && has_blood(&mons[obj->corpsenm]) && (!obj->odrained || obj->oeaten > drainlevel(obj))); /* return((boolean)(!!index(comestibles, obj->oclass))); */ return (boolean)(obj->oclass == FOOD_CLASS); } #endif /* OVL1 */ #ifdef OVLB void init_uhunger() { u.uhunger = 900; u.uhs = NOT_HUNGRY; } static const struct { const char *txt; int nut; } tintxts[] = { {"deep fried", 60}, {"pickled", 40}, {"soup made from", 20}, {"pureed", 500}, #define ROTTEN_TIN 4 {"rotten", -50}, #define HOMEMADE_TIN 5 {"homemade", 50}, {"stir fried", 80}, {"candied", 100}, {"boiled", 50}, {"dried", 55}, {"szechuan", 70}, #define FRENCH_FRIED_TIN 11 {"french fried", 40}, {"sauteed", 95}, {"broiled", 80}, {"smoked", 50}, /* [Tom] added a few new styles */ {"stir fried", 80}, {"candied", 100}, {"boiled", 50}, {"dried", 55}, {"szechuan", 70}, {"french fried", 40}, {"sauteed", 95}, {"broiled", 80}, {"smoked", 50}, {"", 0} }; #define TTSZ SIZE(tintxts) static NEARDATA struct { struct obj *tin; int usedtime, reqtime; } tin; static NEARDATA struct { struct obj *piece; /* the thing being eaten, or last thing that * was partially eaten, unless that thing was * a tin, which uses the tin structure above, * in which case this should be 0 */ /* doeat() initializes these when piece is valid */ int usedtime, /* turns spent eating */ reqtime; /* turns required to eat */ int nmod; /* coded nutrition per turn */ Bitfield(canchoke,1); /* was satiated at beginning */ /* start_eating() initializes these */ Bitfield(fullwarn,1); /* have warned about being full */ Bitfield(eating,1); /* victual currently being eaten */ Bitfield(doreset,1); /* stop eating at end of turn */ } victual; static char *eatmbuf = 0; /* set by cpostfx() */ STATIC_PTR int eatmdone() /* called after mimicing is over */ { /* release `eatmbuf' */ if (eatmbuf) { if (nomovemsg == eatmbuf) nomovemsg = 0; free((genericptr_t)eatmbuf), eatmbuf = 0; } /* update display */ if (youmonst.m_ap_type) { youmonst.m_ap_type = M_AP_NOTHING; newsym(u.ux,u.uy); } return 0; } /* ``[the(] singular(food, xname) [)]'' with awareness of unique monsters */ STATIC_OVL const char * food_xname(food, the_pfx) struct obj *food; boolean the_pfx; { const char *result; int mnum = food->corpsenm; if (food->otyp == CORPSE && (mons[mnum].geno & G_UNIQ) && !Hallucination) { /* grab xname()'s modifiable return buffer for our own use */ char *bufp = xname(food); Sprintf(bufp, "%s%s corpse", (the_pfx && !type_is_pname(&mons[mnum])) ? "the " : "", s_suffix(mons[mnum].mname)); result = bufp; } else { /* the ordinary case */ result = singular(food, xname); if (the_pfx) result = the(result); } return result; } /* Created by GAN 01/28/87 * Amended by AKP 09/22/87: if not hard, don't choke, just vomit. * Amended by 3. 06/12/89: if not hard, sometimes choke anyway, to keep risk. * 11/10/89: if hard, rarely vomit anyway, for slim chance. */ STATIC_OVL void choke(food) /* To a full belly all food is bad. (It.) */ register struct obj *food; { /* 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 */ You("feel like a glutton!"); } exercise(A_CON, FALSE); if (Breathless || (!Strangled && !rn2(20))) { /* choking by eating AoS doesn't involve stuffing yourself */ /* ALI - nor does other non-food nutrition (eg., life-blood) */ if (!food || food->otyp == AMULET_OF_STRANGULATION) { nomovemsg = "You recover your composure."; You("choke over it."); nomul(-2); return; } You("stuff yourself and then vomit voluminously."); morehungry(1000); /* you just got *very* sick! */ nomovemsg = 0; vomit(); } else { killer_format = KILLED_BY_AN; /* * Note all "killer"s below read "Choked on %s" on the * high score list & tombstone. So plan accordingly. */ if(food) { You("choke over your %s.", foodword(food)); if (food->oclass == COIN_CLASS) { killer = "a very rich meal"; } else { killer = food_xname(food, FALSE); if (food->otyp == CORPSE && (mons[food->corpsenm].geno & G_UNIQ)) { if (!type_is_pname(&mons[food->corpsenm])) killer = the(killer); killer_format = KILLED_BY; } } } else { You("choke over it."); killer = "quick snack"; } You("die..."); done(CHOKING); } } /* 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 } void reset_eat() /* called when eating interrupted by an event */ { /* we only set a flag here - the actual reset process is done after * the round is spent eating. */ if(victual.eating && !victual.doreset) { #ifdef DEBUG debugpline("reset_eat..."); #endif victual.doreset = TRUE; } return; } STATIC_OVL struct obj * touchfood(otmp) register struct obj *otmp; { if (otmp->quan > 1L) { if(!carried(otmp)) (void) splitobj(otmp, otmp->quan - 1L); else otmp = splitobj(otmp, 1L); #ifdef DEBUG debugpline("split object,"); #endif } if (!otmp->oeaten) { if(((!carried(otmp) && costly_spot(otmp->ox, otmp->oy) && !otmp->no_charge) || otmp->unpaid)) { /* create a dummy duplicate to put on bill */ verbalize("You bit it, you bought it!"); bill_dummy_object(otmp); } otmp->oeaten = (otmp->otyp == CORPSE ? mons[otmp->corpsenm].cnutrit : objects[otmp->otyp].oc_nutrition); } 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); } /* When food decays, in the middle of your meal, we don't want to dereference * any dangling pointers, so set it to null (which should still trigger * do_reset_eat() at the beginning of eatfood()) and check for null pointers * in do_reset_eat(). */ void food_disappears(obj) register struct obj *obj; { if (obj == victual.piece) victual.piece = (struct obj *)0; if (obj->timed) obj_stop_timers(obj); } /* renaming an object usually results in it having a different address; so the sequence start eating/opening, get interrupted, name the food, resume eating/opening would restart from scratch */ void food_substitution(old_obj, new_obj) struct obj *old_obj, *new_obj; { if (old_obj == victual.piece) victual.piece = new_obj; if (old_obj == tin.tin) tin.tin = new_obj; } STATIC_OVL void do_reset_eat() { #ifdef DEBUG debugpline("do_reset_eat..."); #endif if (victual.piece) { victual.piece = touchfood(victual.piece); recalc_wt(); } victual.fullwarn = victual.eating = victual.doreset = FALSE; /* Do not set canchoke to FALSE; if we continue eating the same object * we need to know if canchoke was set when they started eating it the * previous time. And if we don't continue eating the same object * canchoke always gets recalculated anyway. */ stop_occupation(); newuhs(FALSE); } STATIC_PTR int eatfood() /* called each move during eating process */ { if(!victual.piece || (!carried(victual.piece) && !obj_here(victual.piece, u.ux, u.uy))) { /* maybe it was stolen? */ do_reset_eat(); return(0); } if (is_vampire(youmonst.data) != victual.piece->odrained) { /* Polymorphed while eating/draining */ do_reset_eat(); return(0); } if(!victual.eating) return(0); if(++victual.usedtime <= victual.reqtime) { if(bite()) return(0); return(1); /* still busy */ } else { /* done */ int crumbs = victual.piece->oeaten; /* The last crumbs */ if (victual.piece->odrained) crumbs -= drainlevel(victual.piece); if (crumbs > 0) { lesshungry(crumbs); victual.piece->oeaten -= crumbs; } done_eating(TRUE); return(0); } } STATIC_OVL void done_eating(message) boolean message; { victual.piece->in_use = TRUE; occupation = 0; /* do this early, so newuhs() knows we're done */ newuhs(FALSE); if (nomovemsg) { if (message) pline(nomovemsg); nomovemsg = 0; } else if (message) You("finish %s %s.", victual.piece->odrained ? "draining" : "eating", food_xname(victual.piece, TRUE)); if(victual.piece->otyp == CORPSE) { if (!victual.piece->odrained || Race_if(PM_VAMPIRE) && !rn2(5)) cpostfx(victual.piece->corpsenm); } else fpostfx(victual.piece); if (victual.piece->odrained) victual.piece->in_use = FALSE; else if (carried(victual.piece)) useup(victual.piece); else useupf(victual.piece, 1L); victual.piece = (struct obj *) 0; victual.fullwarn = victual.eating = victual.doreset = FALSE; } STATIC_OVL boolean maybe_cannibal(pm, allowmsg) int pm; boolean allowmsg; { if (your_race(&mons[pm])) { if (!CANNIBAL_ALLOWED()) { if (allowmsg) { if (Upolyd) You("have a bad feeling deep inside."); You("cannibal! You will regret this!"); } HAggravate_monster |= FROMOUTSIDE; change_luck(-rn1(4,2)); /* -5..-2 */ } else if (Role_if(PM_CAVEMAN)) { adjalign(sgn(u.ualign.type)); You("honour the dead."); } else { adjalign(-sgn(u.ualign.type)); You_feel("evil and fiendish!"); } return TRUE; } return FALSE; } STATIC_OVL void cprefx(pm) register int pm; { (void) maybe_cannibal(pm,TRUE); if (touch_petrifies(&mons[pm]) || pm == PM_MEDUSA) { if (!Stone_resistance && !(poly_when_stoned(youmonst.data) && polymon(PM_STONE_GOLEM))) { Sprintf(killer_buf, "tasting %s meat", mons[pm].mname); killer_format = KILLED_BY; killer = killer_buf; You("turn to stone."); done(STONING); if (victual.piece) victual.eating = FALSE; return; /* lifesaved */ } } switch(pm) { case PM_LITTLE_DOG: case PM_DOG: case PM_LARGE_DOG: case PM_KITTEN: case PM_HOUSECAT: case PM_LARGE_CAT: if (!CANNIBAL_ALLOWED()) { You_feel("that %s the %s%s was a bad idea.", victual.eating ? "eating" : "biting", occupation == opentin ? "tinned " : "", mons[pm].mname); HAggravate_monster |= FROMOUTSIDE; } break; case PM_LIZARD: if (Stoned) fix_petrification(); break; case PM_DEATH: case PM_PESTILENCE: case PM_FAMINE: { char buf[BUFSZ]; pline("Eating that is instantly fatal."); Sprintf(buf, "unwisely ate the body of %s", mons[pm].mname); killer = buf; killer_format = NO_KILLER_PREFIX; done(DIED); /* It so happens that since we know these monsters */ /* cannot appear in tins, victual.piece will always */ /* be what we want, which is not generally true. */ if (revive_corpse(victual.piece, FALSE)) victual.piece = (struct obj *)0; return; } case PM_GREEN_SLIME: if (!Slimed && !Unchanging && !flaming(youmonst.data) && 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(); break; } } /* * Called when a vampire bites a monster. * Returns TRUE if hero died and was lifesaved. */ boolean bite_monster(mon) struct monst *mon; { switch(monsndx(mon->data)) { case PM_LIZARD: if (Stoned) fix_petrification(); break; case PM_DEATH: case PM_PESTILENCE: case PM_FAMINE: pline("Unfortunately, eating any of it is fatal."); done_in_by(mon); return TRUE; /* lifesaved */ 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(mon->data) && Stoned) fix_petrification(); break; } return FALSE; } void fix_petrification() { Stoned = 0; delayed_killer = 0; if (Hallucination) pline("What a pity - you just ruined a future piece of %sart!", ACURR(A_CHA) > 15 ? "fine " : ""); else You_feel("limber!"); } /* * If you add an intrinsic that can be gotten by eating a monster, add it * to intrinsic_possible() and givit(). (It must already be in prop.h to * be an intrinsic property.) * It would be very easy to make the intrinsics not try to give you one * that you already had by checking to see if you have it in * intrinsic_possible() instead of givit(). */ /* intrinsic_possible() returns TRUE if a monster can give an intrinsic. */ STATIC_OVL int intrinsic_possible(type, ptr) int type; register struct permonst *ptr; { switch (type) { case FIRE_RES: #ifdef DEBUG if (ptr->mconveys & MR_FIRE) { debugpline("can get fire resistance"); return(TRUE); } else return(FALSE); #else return(ptr->mconveys & MR_FIRE); #endif case SLEEP_RES: #ifdef DEBUG if (ptr->mconveys & MR_SLEEP) { debugpline("can get sleep resistance"); return(TRUE); } else return(FALSE); #else return(ptr->mconveys & MR_SLEEP); #endif case COLD_RES: #ifdef DEBUG if (ptr->mconveys & MR_COLD) { debugpline("can get cold resistance"); return(TRUE); } else return(FALSE); #else return(ptr->mconveys & MR_COLD); #endif case DISINT_RES: #ifdef DEBUG if (ptr->mconveys & MR_DISINT) { debugpline("can get disintegration resistance"); return(TRUE); } else return(FALSE); #else return(ptr->mconveys & MR_DISINT); #endif case SHOCK_RES: /* shock (electricity) resistance */ #ifdef DEBUG if (ptr->mconveys & MR_ELEC) { debugpline("can get shock resistance"); return(TRUE); } else return(FALSE); #else return(ptr->mconveys & MR_ELEC); #endif case POISON_RES: #ifdef DEBUG if (ptr->mconveys & MR_POISON) { debugpline("can get poison resistance"); return(TRUE); } else return(FALSE); #else return(ptr->mconveys & MR_POISON); #endif case TELEPORT: #ifdef DEBUG if (can_teleport(ptr)) { debugpline("can get teleport"); return(TRUE); } else return(FALSE); #else return(can_teleport(ptr)); #endif case TELEPORT_CONTROL: #ifdef DEBUG if (control_teleport(ptr)) { debugpline("can get teleport control"); return(TRUE); } else return(FALSE); #else return(control_teleport(ptr)); #endif case TELEPAT: #ifdef DEBUG if (telepathic(ptr)) { debugpline("can get telepathy"); return(TRUE); } else return(FALSE); #else return(telepathic(ptr)); #endif default: return(FALSE); } /*NOTREACHED*/ } /* givit() tries to give you an intrinsic based on the monster's level * and what type of intrinsic it is trying to give you. */ /* KMH, balance patch -- eliminated temporary intrinsics from * corpses, and restored probabilities to NetHack levels. * * There were several ways to deal with this issue: * 1. Let corpses convey permanent intrisics (as implemented in * vanilla NetHack). This is the easiest method for players * to understand and has the least player frustration. * 2. Provide a temporary intrinsic if you don't already have it, * a give the permanent intrinsic if you do have it (Slash's * method). This is probably the most realistic solution, * but players were extremely annoyed by it. * 3. Let certain intrinsics be conveyed one way and the rest * conveyed the other. However, there would certainly be * arguments about which should be which, and it would * certainly become yet another FAQ. * 4. Increase the timeouts. This is limited by the number of * bits reserved for the timeout. * 5. Convey a permanent intrinsic if you have _ever_ been * given the temporary intrinsic. This is a nice solution, * but it would use another bit, and probably isn't worth * the effort. * 6. Give the player better notice when the timeout expires, * and/or some method to check on intrinsics that is not as * revealing as enlightenment. * 7. Some combination of the above. * * In the end, I decided that the simplest solution would be the * best solution. */ STATIC_OVL void givit(type, ptr) int type; register struct permonst *ptr; { register int chance; #ifdef DEBUG debugpline("Attempting to give intrinsic %d", type); #endif /* some intrinsics are easier to get than others */ switch (type) { case POISON_RES: if ((ptr == &mons[PM_KILLER_BEE] || ptr == &mons[PM_SCORPION]) && !rn2(4)) chance = 1; else chance = 15; break; case TELEPORT: chance = 10; break; case TELEPORT_CONTROL: chance = 12; break; case TELEPAT: chance = 1; break; default: chance = 15; break; } if (ptr->mlevel <= rn2(chance)) return; /* failed die roll */ switch (type) { case FIRE_RES: #ifdef DEBUG debugpline("Trying to give fire resistance"); #endif if(!(HFire_resistance & FROMOUTSIDE)) { You(Hallucination ? "be chillin'." : "feel a momentary chill."); HFire_resistance |= FROMOUTSIDE; } break; case SLEEP_RES: #ifdef DEBUG debugpline("Trying to give sleep resistance"); #endif if(!(HSleep_resistance & FROMOUTSIDE)) { You_feel("wide awake."); HSleep_resistance |= FROMOUTSIDE; } break; case COLD_RES: #ifdef DEBUG debugpline("Trying to give cold resistance"); #endif if(!(HCold_resistance & FROMOUTSIDE)) { You_feel("full of hot air."); HCold_resistance |= FROMOUTSIDE; } break; case DISINT_RES: #ifdef DEBUG debugpline("Trying to give disintegration resistance"); #endif if(!(HDisint_resistance & FROMOUTSIDE)) { You_feel(Hallucination ? "totally together, man." : "very firm."); HDisint_resistance |= FROMOUTSIDE; } break; case SHOCK_RES: /* shock (electricity) resistance */ #ifdef DEBUG debugpline("Trying to give shock resistance"); #endif if(!(HShock_resistance & FROMOUTSIDE)) { if (Hallucination) You_feel("grounded in reality."); else Your("health currently feels amplified!"); HShock_resistance |= FROMOUTSIDE; } break; case POISON_RES: #ifdef DEBUG debugpline("Trying to give poison resistance"); #endif if(!(HPoison_resistance & FROMOUTSIDE)) { You_feel(Poison_resistance ? "especially healthy." : "healthy."); HPoison_resistance |= FROMOUTSIDE; } break; case TELEPORT: #ifdef DEBUG debugpline("Trying to give teleport"); #endif if(!(HTeleportation & FROMOUTSIDE)) { You_feel(Hallucination ? "diffuse." : "very jumpy."); HTeleportation |= FROMOUTSIDE; } break; case TELEPORT_CONTROL: #ifdef DEBUG debugpline("Trying to give teleport control"); #endif if(!(HTeleport_control & FROMOUTSIDE)) { You_feel(Hallucination ? "centered in your personal space." : "in control of yourself."); HTeleport_control |= FROMOUTSIDE; } break; case TELEPAT: #ifdef DEBUG debugpline("Trying to give telepathy"); #endif if(!(HTelepat & FROMOUTSIDE)) { You_feel(Hallucination ? "in touch with the cosmos." : "a strange mental acuity."); HTelepat |= FROMOUTSIDE; /* If blind, make sure monsters show up. */ if (Blind) see_monsters(); } break; default: #ifdef DEBUG debugpline("Tried to give an impossible intrinsic"); #endif break; } } STATIC_OVL void cpostfx(pm) /* called after completely consuming a corpse */ register int pm; { register int tmp = 0; boolean catch_lycanthropy = FALSE; /* in case `afternmv' didn't get called for previously mimicking gold, clean up now to avoid `eatmbuf' memory leak */ if (eatmbuf) (void)eatmdone(); switch(pm) { case PM_NEWT: /* MRKR: "eye of newt" may give small magical energy boost */ if (rn2(3) || 3 * u.uen <= 2 * u.uenmax) { int old_uen = u.uen; u.uen += rnd(3); if (u.uen > u.uenmax) { if (!rn2(3)) u.uenmax++; u.uen = u.uenmax; } if (old_uen != u.uen) { You_feel("a mild buzz."); flags.botl = 1; } } break; case PM_WRAITH: switch(rnd(10)) { case 1: You("feel that was a bad idea."); losexp("eating a wraith corpse", FALSE); break; case 2: You("don't feel so good ..."); if (Upolyd) { u.mhmax -= 4; if (u.mhmax < 1) u.mhmax = 1; } else { u.uhpmax -= 4; if (u.uhpmax < 1) u.uhpmax = 1; } u.uenmax -= 8; if (u.uenmax < 1) u.uenmax = 1; u.uen -= 8; if (u.uen < 0) u.uen = 0; losehp(4, "eating a wraith corpse", KILLED_BY); break; case 3: case 4: You("feel something strange for a moment."); break; case 5: You("feel physically and mentally stronger!"); if (Upolyd) { u.mhmax += 4; u.mh = u.mhmax; } else { u.uhpmax += 4; u.uhp = u.uhpmax; } u.uenmax += 8; u.uen = u.uenmax; break; case 6: case 7: case 8: case 9: case 10: You("feel that was a smart thing to do."); pluslvl(FALSE); break; default: break; } flags.botl = 1; break; case PM_HUMAN_WERERAT: catch_lycanthropy = TRUE; if (!Race_if(PM_HUMAN_WEREWOLF)) u.ulycn = PM_WERERAT; break; case PM_HUMAN_WEREJACKAL: catch_lycanthropy = TRUE; if (!Race_if(PM_HUMAN_WEREWOLF)) u.ulycn = PM_WEREJACKAL; break; case PM_HUMAN_WEREWOLF: catch_lycanthropy = TRUE; if (!Race_if(PM_HUMAN_WEREWOLF)) u.ulycn = PM_WEREWOLF; break; case PM_HUMAN_WEREPANTHER: catch_lycanthropy = TRUE; if (!Race_if(PM_HUMAN_WEREWOLF)) u.ulycn = PM_WEREPANTHER; break; case PM_HUMAN_WERETIGER: catch_lycanthropy = TRUE; if (!Race_if(PM_HUMAN_WEREWOLF)) u.ulycn = PM_WERETIGER; break; case PM_HUMAN_WERESNAKE: catch_lycanthropy = TRUE; if (!Race_if(PM_HUMAN_WEREWOLF)) u.ulycn = PM_WERESNAKE; break; case PM_HUMAN_WERESPIDER: catch_lycanthropy = TRUE; if (!Race_if(PM_HUMAN_WEREWOLF)) u.ulycn = PM_WERESPIDER; break; case PM_NURSE: if (Upolyd) u.mh = u.mhmax; else u.uhp = u.uhpmax; flags.botl = 1; break; case PM_STALKER: if(!Invis) { set_itimeout(&HInvis, (long)rn1(100, 50)); if (!Blind && !BInvis) self_invis_message(); } else { if (!(HInvis & INTRINSIC)) You_feel("hidden!"); HInvis |= FROMOUTSIDE; HSee_invisible |= FROMOUTSIDE; } newsym(u.ux, u.uy); /* fall into next case */ case PM_YELLOW_LIGHT: /* fall into next case */ case PM_GIANT_BAT: make_stunned(HStun + 30,FALSE); /* fall into next case */ case PM_BAT: make_stunned(HStun + 30,FALSE); break; case PM_GIANT_MIMIC: tmp += 10; /* fall into next case */ case PM_LARGE_MIMIC: tmp += 20; /* fall into next case */ case PM_SMALL_MIMIC: tmp += 20; if (youmonst.data->mlet != S_MIMIC && !Unchanging) { char buf[BUFSZ]; You_cant("resist the temptation to mimic %s.", Hallucination ? "an orange" : "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, Hallucination ? "You suddenly dread being peeled and mimic %s again!" : "You now prefer mimicking %s again.", an(Upolyd ? youmonst.data->mname : urace.noun)); eatmbuf = strcpy((char *) alloc(strlen(buf) + 1), buf); nomovemsg = eatmbuf; afternmv = eatmdone; /* ??? what if this was set before? */ youmonst.m_ap_type = M_AP_OBJECT; youmonst.mappearance = Hallucination ? ORANGE : GOLD_PIECE; newsym(u.ux,u.uy); curs_on_u(); /* make gold symbol show up now */ display_nhwindow(WIN_MAP, TRUE); } break; case PM_QUANTUM_MECHANIC: Your("velocity suddenly seems very uncertain!"); if (HFast & INTRINSIC) { HFast &= ~INTRINSIC; You("seem slower."); } else { HFast |= FROMOUTSIDE; You("seem faster."); } break; case PM_LIZARD: if (HStun > 2) make_stunned(2L,FALSE); if (HConfusion > 2) make_confused(2L,FALSE); break; case PM_CHAMELEON: case PM_DOPPELGANGER: /* case PM_SANDESTIN: */ if (!Unchanging) { You_feel("a change coming over you."); polyself(FALSE); } break; case PM_GENETIC_ENGINEER: /* Robin Johnson -- special msg */ if (!Unchanging) { You("undergo a freakish metamorphosis!"); polyself(FALSE); } break; /* WAC all mind flayers as per mondata.h have to be here */ case PM_MASTER_MIND_FLAYER: case PM_MIND_FLAYER: { #if 0 int temp; temp = urole.attrmax[A_INT]; #endif if (ABASE(A_INT) < ATTRMAX(A_INT)) { if (!rn2(2)) { pline("Yum! That was real brain food!"); (void) adjattrib(A_INT, 1, FALSE); break; /* don't give them telepathy, too */ } } else { pline("For some reason, that tasted bland."); } } /* fall through to default case */ default: { register struct permonst *ptr = &mons[pm]; int i, count; if (dmgtype(ptr, AD_STUN) || dmgtype(ptr, AD_HALU) || pm == PM_VIOLET_FUNGUS) { pline ("Oh wow! Great stuff!"); make_hallucinated(HHallucination + 200,FALSE,0L); } if(is_giant(ptr) && !rn2(4)) gainstr((struct obj *)0, 0); /* Check the monster for all of the intrinsics. If this * monster can give more than one, pick one to try to give * from among all it can give. * * If a monster can give 4 intrinsics then you have * a 1/1 * 1/2 * 2/3 * 3/4 = 1/4 chance of getting the first, * a 1/2 * 2/3 * 3/4 = 1/4 chance of getting the second, * a 1/3 * 3/4 = 1/4 chance of getting the third, * and a 1/4 chance of getting the fourth. * * And now a proof by induction: * it works for 1 intrinsic (1 in 1 of getting it) * for 2 you have a 1 in 2 chance of getting the second, * otherwise you keep the first * for 3 you have a 1 in 3 chance of getting the third, * otherwise you keep the first or the second * for n+1 you have a 1 in n+1 chance of getting the (n+1)st, * otherwise you keep the previous one. * Elliott Kleinrock, October 5, 1990 */ count = 0; /* number of possible intrinsics */ tmp = 0; /* which one we will try to give */ for (i = 1; i <= LAST_PROP; i++) { if (intrinsic_possible(i, ptr)) { count++; /* a 1 in count chance of replacing the old * one with this one, and a count-1 in count * chance of keeping the old one. (note * that 1 in 1 and 0 in 1 are what we want * for the first one */ if (!rn2(count)) { #ifdef DEBUG debugpline("Intrinsic %d replacing %d", i, tmp); #endif tmp = i; } } } /* if any found try to give them one */ if (count) givit(tmp, ptr); } break; } if (!Race_if(PM_HUMAN_WEREWOLF) && catch_lycanthropy && defends(AD_WERE, uwep)) { if (!touch_artifact(uwep, &youmonst)) { dropx(uwep); uwepgone(); } } return; } void violated_vegetarian() { u.uconduct.unvegetarian++; if (Role_if(PM_MONK)) { You_feel("guilty."); adjalign(-1); } return; } /* common code to check and possibly charge for 1 context.tin.tin, * will split() context.tin.tin if necessary */ STATIC_PTR void costly_tin(verb) const char* verb; /* if 0, the verb is "open" */ { if(((!carried(tin.tin) && costly_spot(tin.tin->ox, tin.tin->oy) && !tin.tin->no_charge) || tin.tin->unpaid)) { verbalize("You %s it, you bought it!", verb ? verb : "open"); if(tin.tin->quan > 1L) tin.tin = splitobj(tin.tin, 1L); bill_dummy_object(tin.tin); } } STATIC_PTR int opentin() /* called during each move whilst opening a tin */ { register int r; const char *what; int which; if(!carried(tin.tin) && !obj_here(tin.tin, u.ux, u.uy)) /* perhaps it was stolen? */ return(0); /* %% probably we should use tinoid */ if(tin.usedtime++ >= 50) { You("give up your attempt to open the tin."); return(0); } if(tin.usedtime < tin.reqtime) return(1); /* still busy */ if(tin.tin->otrapped || (tin.tin->cursed && tin.tin->spe != -1 && !rn2(8))) { b_trapped("tin", 0); costly_tin("destroyed"); goto use_me; } You("succeed in opening the tin."); if(tin.tin->spe != 1) { if (tin.tin->corpsenm == NON_PM) { pline("It turns out to be empty."); tin.tin->dknown = tin.tin->known = TRUE; costly_tin((const char*)0); goto use_me; } r = tin.tin->cursed ? ROTTEN_TIN : /* always rotten if cursed */ (tin.tin->spe == -1) ? HOMEMADE_TIN : /* player made it */ rn2(TTSZ-1); /* else take your pick */ if (r == ROTTEN_TIN && (tin.tin->corpsenm == PM_LIZARD || tin.tin->corpsenm == PM_LICHEN)) r = HOMEMADE_TIN; /* lizards don't rot */ else if (tin.tin->spe == -1 && !tin.tin->blessed && !rn2(7)) r = ROTTEN_TIN; /* some homemade tins go bad */ which = 0; /* 0=>plural, 1=>as-is, 2=>"the" prefix */ if (Hallucination) { what = rndmonnam(); } else { what = mons[tin.tin->corpsenm].mname; if (mons[tin.tin->corpsenm].geno & G_UNIQ) which = type_is_pname(&mons[tin.tin->corpsenm]) ? 1 : 2; } if (which == 0) what = makeplural(what); #ifdef EATEN_MEMORY /* ALI - you already know the type of the tinned meat */ if (tin.tin->known && mvitals[tin.tin->corpsenm].eaten < 255) mvitals[tin.tin->corpsenm].eaten++; /* WAC - you only recognize if you've eaten this before */ if (!mvitals[tin.tin->corpsenm].eaten && !Hallucination) { if (rn2(2)) pline ("It smells kind of like %s.", monexplain[mons[tin.tin->corpsenm].mlet]); else pline_The("smell is unfamiliar."); } else #endif pline("It smells like %s%s.", (which == 2) ? "the " : "", what); if (yn("Eat it?") == 'n') { #ifdef EATEN_MEMORY /* ALI - you know the tin iff you recognized the contents */ if (mvitals[tin.tin->corpsenm].eaten) #endif if (!Hallucination) tin.tin->dknown = tin.tin->known = TRUE; if (flags.verbose) You("discard the open tin."); costly_tin((const char*)0); goto use_me; } /* in case stop_occupation() was called on previous meal */ victual.piece = (struct obj *)0; victual.fullwarn = victual.eating = victual.doreset = FALSE; #ifdef EATEN_MEMORY /* WAC - you only recognize if you've eaten this before */ You("consume %s %s.", tintxts[r].txt, mvitals[tin.tin->corpsenm].eaten ? mons[tin.tin->corpsenm].mname : "food"); #else You("consume %s %s.", tintxts[r].txt, mons[tin.tin->corpsenm].mname); #endif /* KMH, conduct */ u.uconduct.food++; if (!vegan(&mons[tin.tin->corpsenm])) u.uconduct.unvegan++; if (!vegetarian(&mons[tin.tin->corpsenm])) violated_vegetarian(); #ifdef EATEN_MEMORY if (mvitals[tin.tin->corpsenm].eaten) #endif tin.tin->dknown = tin.tin->known = TRUE; cprefx(tin.tin->corpsenm); cpostfx(tin.tin->corpsenm); /* charge for one at pre-eating cost */ costly_tin((const char*)0); /* 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.", makeplural(body_part(FINGER))); } } else { if (tin.tin->cursed) pline("It contains some decaying%s%s substance.", Blind ? "" : " ", Blind ? "" : hcolor(NH_GREEN)); else pline("It contains spinach."); if (yn("Eat it?") == 'n') { if (!Hallucination && !tin.tin->cursed) tin.tin->dknown = tin.tin->known = TRUE; if (flags.verbose) You("discard the open tin."); costly_tin((const char*)0); goto use_me; } tin.tin->dknown = tin.tin->known = TRUE; costly_tin((const char*)0); if (!tin.tin->cursed) pline("This makes you feel like %s!", Hallucination ? "Swee'pea" : "Popeye"); lesshungry(600); gainstr(tin.tin, 0); u.uconduct.food++; } use_me: if (carried(tin.tin)) useup(tin.tin); else useupf(tin.tin, 1L); tin.tin = (struct obj *) 0; return(0); } STATIC_OVL void start_tin(otmp) /* called when starting to open a tin */ register struct obj *otmp; { register int tmp; if (metallivorous(youmonst.data)) { You("bite right into the metal tin..."); tmp = 1; } else if (nolimbs(youmonst.data)) { You("cannot handle the tin properly to open it."); return; } else if (otmp->blessed) { pline_The("tin opens like magic!"); tmp = 1; } else if(uwep) { switch(uwep->otyp) { case TIN_OPENER: tmp = 1; break; case DAGGER: case SILVER_DAGGER: case ELVEN_DAGGER: case ORCISH_DAGGER: case ATHAME: case CRYSKNIFE: case DARK_ELVEN_DAGGER: case GREAT_DAGGER: tmp = 3; break; case PICK_AXE: case AXE: tmp = 6; break; default: goto no_opener; } pline("Using your %s you try to open the tin.", aobjnam(uwep, (char *)0)); } else { no_opener: pline("It is not so easy to open this tin."); if(Glib) { 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); return; } tmp = rn1(1 + 500/((int)(ACURR(A_DEX) + ACURRSTR)), 10); } tin.reqtime = tmp; tin.usedtime = 0; tin.tin = otmp; set_occupation(opentin, "opening the tin", 0); return; } int Hear_again() /* called when waking up after fainting */ { flags.soundok = 1; return 0; } /* called on the "first bite" of rotten food */ STATIC_OVL int rottenfood(obj) struct obj *obj; { pline("Blecch! Rotten %s!", foodword(obj)); if(!rn2(4)) { if (Hallucination) You_feel("rather trippy."); else You_feel("rather %s.", body_part(LIGHT_HEADED)); make_confused(HConfusion + d(2,4),FALSE); } 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) what = "goes", where = "dark"; else if (Levitation || Is_airlevel(&u.uz) || 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)); nomovemsg = "You are conscious again."; afternmv = Hear_again; return(1); } return(0); } /* [ALI] Return codes: * * 0 - Ready to start eating * 1 - Corpse partly eaten, but don't start occupation * 2 - Corpse completely consumed, victual.piece left dangling * 3 - Corpse was inedible */ STATIC_OVL int eatcorpse(otmp) /* called when a corpse is selected as food */ register struct obj *otmp; { int tp = 0, mnum = otmp->corpsenm; long rotted = 0L; boolean uniq = !!(mons[mnum].geno & G_UNIQ); int retcode = 0; 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); rotted = (monstermoves - age)/(10L + rn2(20)); if (otmp->cursed) rotted += 2L; else if (otmp->blessed) rotted -= 2L; } /* Vampires only drink the blood of very young, meaty corpses * is_edible only allows meaty corpses here * Blood is assumed to be 1/5 of the nutrition * Thus happens before the conduct checks intentionally - should it be after? * Blood is assumed to be meat and flesh. */ if (is_vampire(youmonst.data)) { /* oeaten is set up by touchfood */ if (otmp->odrained ? otmp->oeaten <= drainlevel(otmp) : otmp->oeaten < mons[otmp->corpsenm].cnutrit) { pline("There is no blood left in this corpse!"); return 3; } else if (rotted <= 0 && (peek_at_iced_corpse_age(otmp) + 5) >= monstermoves) { char buf[BUFSZ]; /* Generate the name for the corpse */ if (!uniq || Hallucination) Sprintf(buf, "%s", the(corpse_xname(otmp,TRUE))); else Sprintf(buf, "%s%s corpse", !type_is_pname(&mons[mnum]) ? "the " : "", s_suffix(mons[mnum].mname)); pline("You drain the blood from %s.", buf); otmp->odrained = 1; } else { pline("The blood in this corpse has coagulated!"); return 3; } } else otmp->odrained = 0; /* Very rotten corpse will make you sick unless you are a ghoul or a ghast */ if (mnum != PM_ACID_BLOB && !stoneable && rotted > 5L) { boolean cannibal = maybe_cannibal(mnum, FALSE); if (u.umonnum == PM_GHOUL || u.umonnum == PM_GHAST) { pline("Yum - that %s was well aged%s!", mons[mnum].mlet == S_FUNGUS ? "fungoid vegetation" : !vegetarian(&mons[mnum]) ? "meat" : "protoplasm", cannibal ? ", cannibal" : ""); } else { pline("Ulch - that %s was tainted%s!", mons[mnum].mlet == S_FUNGUS ? "fungoid vegetation" : !vegetarian(&mons[mnum]) ? "meat" : "protoplasm", cannibal ? ", cannibal" : ""); if (Sick_resistance) { pline("It doesn't seem at all sickening, though..."); } else { char buf[BUFSZ]; long sick_time; sick_time = (long) rn1(10, 10); /* make sure new ill doesn't result in improvement */ if (Sick && (sick_time > Sick)) sick_time = (Sick > 1L) ? Sick - 1L : 1L; if (!uniq || Hallucination) Sprintf(buf, "rotted %s", corpse_xname(otmp,TRUE)); else Sprintf(buf, "%s%s rotted corpse", !type_is_pname(&mons[mnum]) ? "the " : "", 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 (youmonst.data == &mons[PM_GHOUL] || youmonst.data == &mons[PM_GHAST]) { pline ("This corpse is too fresh!"); return 3; } 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++; pline("Ecch - that must have been poisonous!"); if(!Poison_resistance) { losestr(rnd(4)); losehp(rnd(15), "poisonous corpse", KILLED_BY_AN); } else You("seem unaffected by the poison."); /* now any corpse left too long will make you mildly ill */ } else if ((rotted > 5L || (rotted > 3L && rn2(5))) && !Sick_resistance) { tp++; You_feel("%ssick.", (Sick) ? "very " : ""); losehp(rnd(8), "cadaver", KILLED_BY_AN); } /* delay is weight dependent */ victual.reqtime = 3 + (mons[mnum].cwt >> 6); if (otmp->odrained) victual.reqtime = rounddiv(victual.reqtime, 5); if (!tp && mnum != PM_LIZARD && mnum != PM_LICHEN && (otmp->orotten || !rn2(7))) { if (rottenfood(otmp)) { 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 */ if (retcode<2 && otmp->odrained && otmp->oeaten < drainlevel(otmp)) otmp->oeaten = drainlevel(otmp); } else if (!is_vampire(youmonst.data)) { 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"); } #ifdef EATEN_MEMORY /* WAC Track food types eaten */ if (mvitals[mnum].eaten < 255) mvitals[mnum].eaten++; #endif return(retcode); } STATIC_OVL void start_eating(otmp) /* called as you start to eat */ register struct obj *otmp; { #ifdef DEBUG debugpline("start_eating: %lx (victual = %lx)", otmp, victual.piece); debugpline("reqtime = %d", victual.reqtime); debugpline("(original reqtime = %d)", objects[otmp->otyp].oc_delay); debugpline("nmod = %d", victual.nmod); debugpline("oeaten = %d", otmp->oeaten); #endif victual.fullwarn = victual.doreset = FALSE; victual.eating = TRUE; if (otmp->otyp == CORPSE) { cprefx(victual.piece->corpsenm); if (!victual.piece || !victual.eating) { /* rider revived, or died and lifesaved */ return; } } if (bite()) return; if (++victual.usedtime >= victual.reqtime) { /* print "finish eating" message if they just resumed -dlc */ done_eating(victual.reqtime > 1 ? TRUE : FALSE); return; } Sprintf(msgbuf, "%s %s", otmp->odrained ? "draining" : "eating", food_xname(otmp, TRUE)); set_occupation(eatfood, msgbuf, 0); } /* * called on "first bite" of (non-corpse) food. * used for non-rotten non-tin non-corpse food */ STATIC_OVL void fprefx(otmp) struct obj *otmp; { 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)) || u.ulycn != NON_PM && carnivorous(&mons[u.ulycn]) && !humanoid(&mons[u.ulycn])) /* Symptom of lycanthropy is starting to like your * alternative form's food! */ 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; case PILL: You("swallow the little pink pill."); switch(rn2(7)) { case 0: /* [Tom] wishing pills are from the Land of Oz */ pline ("The pink sugar coating hid a silver wishing pill!"); makewish(); break; case 1: if(!Poison_resistance) { You("feel your stomach twinge."); losestr(rnd(4)); losehp(rnd(15), "poisonous pill", KILLED_BY_AN); } else You("seem unaffected by the poison."); break; case 2: pline ("Everything begins to get blurry."); make_stunned(HStun + 30,FALSE); break; case 3: pline ("Oh wow! Look at the lights!"); make_hallucinated(HHallucination + 150,FALSE,0L); break; case 4: pline("That tasted like vitamins..."); lesshungry(600); break; case 5: if(Sleep_resistance) { pline("Hmm. Nothing happens."); } else { pline("You feel drowsy..."); nomul(-rn2(50)); u.usleep = 1; nomovemsg = "You wake up."; } break; case 6: pline("Wow... everything is moving in slow motion..."); /* KMH, balance patch -- Use incr_itimeout() instead of += */ incr_itimeout(&HFast, rn1(10,200)); break; } break; case MUSHROOM: pline("This %s is %s", singular(otmp, xname), otmp->cursed ? (Hallucination ? "far-out!" : "terrible!") : Hallucination ? "groovy!" : "delicious!"); switch(rn2(10)) { case 0: case 1: if(!Poison_resistance) { You("feel rather ill...."); losestr(rnd(4)); losehp(rnd(15), "poisonous mushroom", KILLED_BY_AN); } else You("burp loudly."); break; case 2: pline ("That mushroom tasted a little funny."); make_stunned(HStun + 30,FALSE); break; case 3: pline ("Whoa! Everything looks groovy!"); make_hallucinated(HHallucination + 150,FALSE,0L); break; case 4: gainstr(otmp, 1); pline ("You feel stronger!"); break; case 5: case 6: case 7: case 8: case 9: break; } break; case MEATBALL: case MEAT_STICK: case HUGE_CHUNK_OF_MEAT: case MEAT_RING: goto give_feedback; /* break; */ case CLOVE_OF_GARLIC: if (is_undead(youmonst.data)) { make_vomiting((long)rn1(victual.reqtime, 5), FALSE); break; } /* Fall through otherwise */ default: if (otmp->otyp == SLIME_MOLD && !otmp->cursed && otmp->spe == current_fruit) pline("My, that was a %s %s!", Hallucination ? "primo" : "yummy", singular(otmp, xname)); else #ifdef UNIX if (otmp->otyp == APPLE || otmp->otyp == PEAR) { if (!Hallucination) pline("Core dumped."); else { /* This is based on an old Usenet joke, a fake a.out manual page */ int x = rnd(100); if (x <= 75) pline("Segmentation fault -- core dumped."); else if (x <= 99) pline("Bus error -- core dumped."); else pline("Yo' mama -- core dumped."); } } else #endif #ifdef MAC /* KMH -- Why should Unix have all the fun? */ if (otmp->otyp == APPLE) { pline("This Macintosh is wonderful!"); } else #endif if (otmp->otyp == EGG && stale_egg(otmp)) { pline("Ugh. Rotten egg."); /* perhaps others like it */ make_vomiting(Vomiting+d(10,4), TRUE); } else { boolean bad_for_you; give_feedback: bad_for_you = otmp->cursed || (Race_if(PM_HUMAN_WEREWOLF) && otmp->otyp == SPRIG_OF_WOLFSBANE); pline("This %s is %s", singular(otmp, xname), bad_for_you ? (Hallucination ? "grody!" : "terrible!") : (otmp->otyp == CRAM_RATION || otmp->otyp == K_RATION || otmp->otyp == C_RATION) ? "bland." : Hallucination ? "gnarly!" : "delicious!"); } break; } } STATIC_OVL void accessory_has_effect(otmp) struct obj *otmp; { pline("Magic spreads through your body as you digest the %s.", otmp->oclass == RING_CLASS ? "ring" : "amulet"); } STATIC_OVL void eataccessory(otmp) 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?) */ /* KMH, intrinsic patch -- several changes below */ 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 */ } otmp->known = otmp->dknown = 1; /* by taste */ if (!rn2(otmp->oclass == RING_CLASS ? 3 : 5)) { switch (otmp->otyp) { default: if (!objects[typ].oc_oprop) break; /* should never happen */ if (!(u.uprops[objects[typ].oc_oprop].intrinsic & FROMOUTSIDE)) accessory_has_effect(otmp); u.uprops[objects[typ].oc_oprop].intrinsic |= FROMOUTSIDE; switch (typ) { case RIN_SEE_INVISIBLE: 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...", Hallucination ? "normal" : "strange"); makeknown(typ); } break; case RIN_PROTECTION_FROM_SHAPE_CHAN: 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)); makeknown(typ); } break; } break; case RIN_ADORNMENT: accessory_has_effect(otmp); if (adjattrib(A_CHA, otmp->spe, -1)) makeknown(typ); break; case RIN_GAIN_STRENGTH: accessory_has_effect(otmp); if (adjattrib(A_STR, otmp->spe, -1)) makeknown(typ); break; case RIN_GAIN_CONSTITUTION: accessory_has_effect(otmp); if (adjattrib(A_CON, otmp->spe, -1)) makeknown(typ); break; case RIN_GAIN_INTELLIGENCE: accessory_has_effect(otmp); if (adjattrib(A_INT, otmp->spe, -1)) makeknown(typ); break; case RIN_GAIN_WISDOM: accessory_has_effect(otmp); if (adjattrib(A_WIS, otmp->spe, -1)) makeknown(typ); break; case RIN_GAIN_DEXTERITY: accessory_has_effect(otmp); if (adjattrib(A_DEX, otmp->spe, -1)) makeknown(typ); break; case RIN_INCREASE_ACCURACY: accessory_has_effect(otmp); u.uhitinc += otmp->spe; break; case RIN_INCREASE_DAMAGE: accessory_has_effect(otmp); u.udaminc += otmp->spe; break; case RIN_PROTECTION: accessory_has_effect(otmp); HProtection |= FROMOUTSIDE; u.ublessed += otmp->spe; flags.botl = 1; break; case RIN_FREE_ACTION: /* Give sleep resistance instead */ if (!(HSleep_resistance & FROMOUTSIDE)) accessory_has_effect(otmp); if (!Sleep_resistance) You_feel("wide awake."); HSleep_resistance |= FROMOUTSIDE; break; case AMULET_OF_CHANGE: accessory_has_effect(otmp); makeknown(typ); change_sex(); You("are suddenly very %s!", flags.female ? "feminine" : "masculine"); flags.botl = 1; break; case AMULET_OF_UNCHANGING: /* un-change: it's a pun */ if (!Unchanging && Upolyd) { accessory_has_effect(otmp); makeknown(typ); rehumanize(); } break; case AMULET_OF_STRANGULATION: /* bad idea! */ /* no message--this gives no permanent effect */ choke(otmp); break; case AMULET_OF_RESTFUL_SLEEP: /* another bad idea! */ case RIN_SLEEPING: if (!(HSleeping & FROMOUTSIDE)) accessory_has_effect(otmp); HSleeping = FROMOUTSIDE | rnd(100); break; case AMULET_VERSUS_STONE: /* no message--this gives no permanent effect */ (void)uunstone(); break; case RIN_SUSTAIN_ABILITY: case AMULET_OF_FLYING: /* Intrinsic flying not supported --ALI */ case AMULET_OF_LIFE_SAVING: case AMULET_OF_REFLECTION: /* nice try */ case AMULET_OF_DRAIN_RESISTANCE: /* can't eat Amulet of Yendor or fakes, * and no oc_prop even if you could -3. */ break; } } } STATIC_OVL void eatspecial() /* called after eating non-food */ { register struct obj *otmp = victual.piece; /* lesshungry wants an occupation to handle choke messages correctly */ set_occupation(eatfood, "eating non-food", 0); lesshungry(victual.nmod); occupation = 0; victual.piece = (struct obj *)0; victual.eating = 0; if (otmp->oclass == COIN_CLASS) { #ifdef GOLDOBJ if (carried(otmp)) useupall(otmp); #else if (otmp->where == OBJ_FREE) dealloc_obj(otmp); #endif else useupf(otmp, otmp->quan); return; } if (otmp->oclass == POTION_CLASS) { otmp->quan++; /* dopotion() does a useup() */ (void)dopotion(otmp); } if (otmp->oclass == RING_CLASS || otmp->oclass == AMULET_CLASS) eataccessory(otmp); else if (otmp->otyp == LEASH && otmp->leashmon) o_unleash(otmp); /* KMH -- idea by "Tommy the Terrorist" */ if ((otmp->otyp == TRIDENT) && !otmp->cursed) { pline(Hallucination ? "Four out of five dentists agree." : "That was pure chewing satisfaction!"); exercise(A_WIS, TRUE); } if ((otmp->otyp == FLINT) && !otmp->cursed) { pline("Yabba-dabba delicious!"); exercise(A_CON, TRUE); } if (otmp == uwep && otmp->quan == 1L) uwepgone(); if (otmp == uquiver && otmp->quan == 1L) uqwepgone(); if (otmp == uswapwep && otmp->quan == 1L) uswapwepgone(); if (otmp == uball) unpunish(); if (otmp == uchain) unpunish(); /* but no useup() */ else if (carried(otmp)) useup(otmp); else useupf(otmp, 1L); } /* NOTE: the order of these words exactly corresponds to the order of oc_material values #define'd in objclass.h. */ static const char *foodwords[] = { "meal", "liquid", "wax", "food", "meat", "paper", "cloth", "leather", "wood", "bone", "scale", "metal", "metal", "metal", "silver", "gold", "platinum", "mithril", "plastic", "glass", "rich food", "stone" }; STATIC_OVL const char * foodword(otmp) register struct obj *otmp; { if (otmp->oclass == FOOD_CLASS) return "food"; if (otmp->oclass == GEM_CLASS && objects[otmp->otyp].oc_material == GLASS && otmp->dknown) makeknown(otmp->otyp); return foodwords[objects[otmp->otyp].oc_material]; } STATIC_OVL void fpostfx(otmp) /* called after consuming (non-corpse) food */ register struct obj *otmp; { switch(otmp->otyp) { case SPRIG_OF_WOLFSBANE: if (u.ulycn >= LOW_PM || is_were(youmonst.data) || Race_if(PM_HUMAN_WEREWOLF)) you_unwere(TRUE); break; case HOLY_WAFER: if (u.ualign.type == A_LAWFUL) { if (u.uhp < u.uhpmax) { You("feel warm inside."); u.uhp += rn1(20,20); if (u.uhp > u.uhpmax) u.uhp = u.uhpmax; } } if (Sick) make_sick(0L, (char *)0, TRUE, SICK_ALL); if (u.ulycn != -1) { you_unwere(TRUE); } if (u.ualign.type == A_CHAOTIC) { You("feel a burning inside!"); u.uhp -= rn1(10,10); /* KMH, balance patch 2 -- should not have 0 hp */ if (u.uhp < 1) u.uhp = 1; } break; case CARROT: make_blinded((long)u.ucreamed,TRUE); break; /* body parts -- now checks for artifact and name*/ case EYEBALL: if (!otmp->oartifact) break; You("feel a burning inside!"); u.uhp -= rn1(50,150); if (u.uhp <= 0) { killer_format = KILLED_BY; killer = food_xname(otmp, TRUE); done(CHOKING); } break; case SEVERED_HAND: if (!otmp->oartifact) break; You("feel the hand scrabbling around inside of you!"); u.uhp -= rn1(50,150); if (u.uhp <= 0) { killer_format = KILLED_BY; killer = food_xname(otmp, TRUE); done(CHOKING); } break; case FORTUNE_COOKIE: if (yn("Read the fortune?") == 'y') { outrumor(bcsign(otmp), BY_COOKIE); if (!Blind) u.uconduct.literate++; } break; /* STEHPEN WHITE'S NEW CODE */ case LUMP_OF_ROYAL_JELLY: /* This stuff seems to be VERY healthy! */ gainstr(otmp, 1); if (Upolyd) { u.mh += otmp->cursed ? -rnd(20) : rnd(20); if (u.mh > u.mhmax) { if (!rn2(17)) u.mhmax++; u.mh = u.mhmax; } else if (u.mh <= 0) { rehumanize(); } } else { u.uhp += otmp->cursed ? -rnd(20) : rnd(20); if (u.uhp > u.uhpmax) { if(!rn2(17)) u.uhpmax++; u.uhp = u.uhpmax; } else if(u.uhp <= 0) { killer_format = KILLED_BY_AN; killer = "rotten lump of royal jelly"; done(POISONING); } } if(!otmp->cursed) heal_legs(); break; case EGG: if (touch_petrifies(&mons[otmp->corpsenm])) { if (!Stone_resistance && !(poly_when_stoned(youmonst.data) && polymon(PM_STONE_GOLEM))) { if (!Stoned) Stoned = 5; killer_format = KILLED_BY_AN; Sprintf(killer_buf, "%s egg", mons[otmp->corpsenm].mname); delayed_killer = killer_buf; } } break; case EUCALYPTUS_LEAF: if (Sick && !otmp->cursed) make_sick(0L, (char *)0, TRUE, SICK_ALL); if (Vomiting && !otmp->cursed) make_vomiting(0L, TRUE); break; } 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], it_or_they[QBUFSZ], eat_it_anyway[QBUFSZ]; boolean cadaver = (otmp->otyp == CORPSE), stoneorslime = FALSE; int material = objects[otmp->otyp].oc_material, mnum = otmp->corpsenm; long rotted = 0L; Strcpy(foodsmell, Tobjnam(otmp, "smell")); Strcpy(it_or_they, (otmp->quan == 1L) ? "it" : "they"); Sprintf(eat_it_anyway, "Eat %s anyway?", (otmp->quan == 1L) ? "it" : "one"); if (cadaver || otmp->otyp == EGG || otmp->otyp == TIN) { /* 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 && !flaming(youmonst.data) && 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 %s could be tainted! %s", foodsmell, it_or_they, eat_it_anyway); if (yn_function(buf,ynchars,'n')=='n') return 1; else return 2; } if (stoneorslime) { Sprintf(buf, "%s like %s could be something very dangerous! %s", foodsmell, it_or_they, eat_it_anyway); if (yn_function(buf,ynchars,'n')=='n') return 1; else return 2; } if (otmp->orotten || (cadaver && rotted > 3L)) { /* Rotten */ Sprintf(buf, "%s like %s could be rotten! %s", foodsmell, it_or_they, eat_it_anyway); if (yn_function(buf,ynchars,'n')=='n') return 1; else return 2; } if (cadaver && poisonous(&mons[mnum]) && !Poison_resistance) { /* poisonous */ Sprintf(buf, "%s like %s might be poisonous! %s", foodsmell, it_or_they, eat_it_anyway); if (yn_function(buf,ynchars,'n')=='n') return 1; 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 == EYEBALL || material == SEVERED_HAND || 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 == EYEBALL || material == SEVERED_HAND || 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 %s could be tainted! %s", foodsmell, it_or_they, 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 */ int nutrit; /* nutrition available */ char qbuf[QBUFSZ]; char c; boolean dont_start = FALSE; if (Strangled) { pline("If you can't breathe air, how can you consume solids?"); return 0; } if (!(otmp = floorfood("eat"))) 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 * metallic meal, etc.... */ if (!is_edible(otmp)) { You("cannot eat that!"); return 0; } else if ((otmp->owornmask & (W_ARMOR|W_TOOL|W_AMUL #ifdef STEED |W_SADDLE #endif )) != 0) { /* let them eat rings */ You_cant("eat %s you're wearing.", something); return 0; } if (is_metallic(otmp) && 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 */ otmp->oerodeproof = 0; make_stunned(HStun + rn2(10), TRUE); You("spit %s out onto the %s.", the(xname(otmp)), surface(u.ux, u.uy)); if (carried(otmp)) { freeinv(otmp); dropy(otmp); } stackobj(otmp); return 1; } if (otmp->otyp == EYEBALL || otmp->otyp == SEVERED_HAND) { Strcpy(qbuf,"Are you sure you want to eat that?"); if ((c = yn_function(qbuf, ynqchars, 'n')) != 'y') return 0; } /* KMH -- Slow digestion is... indigestible */ if (otmp->otyp == RIN_SLOW_DIGESTION) { pline("This ring is indigestible!"); (void) rottenfood(otmp); if (otmp->dknown && !objects[otmp->otyp].oc_name_known && !objects[otmp->otyp].oc_uname) docall(otmp); 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 */ victual.usedtime = 0; victual.canchoke = (u.uhs == SATIATED); /* Note: gold weighs 1 pt. for each 1000 pieces (see */ /* pickup.c) so gold and non-gold is consistent. */ if (otmp->oclass == COIN_CLASS) basenutrit = ((otmp->quan > 200000L) ? 2000 : (int)(otmp->quan/100L)); else if(otmp->oclass == BALL_CLASS || otmp->oclass == CHAIN_CLASS) basenutrit = weight(otmp); /* oc_nutrition is usually weight anyway */ else basenutrit = objects[otmp->otyp].oc_nutrition; victual.nmod = basenutrit; victual.eating = TRUE; /* needed for lesshungry() */ material = objects[otmp->otyp].oc_material; if (material == LEATHER || material == EYEBALL || material == SEVERED_HAND || 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); if (otmp->oclass == WEAPON_CLASS && otmp->opoisoned) { pline("Ecch - that must have been poisonous!"); if(!Poison_resistance) { losestr(rnd(4)); losehp(rnd(15), xname(otmp), KILLED_BY_AN); } else You("seem unaffected by the poison."); } else if (!otmp->cursed) pline("This %s is delicious!", otmp->oclass == COIN_CLASS ? foodword(otmp) : singular(otmp, xname)); eatspecial(); return 1; } /* [ALI] Hero polymorphed in the meantime. */ if (otmp == victual.piece && is_vampire(youmonst.data) != otmp->odrained) victual.piece = (struct obj *)0; /* Can't resume */ /* [ALI] Blood can coagulate during the interruption * but not during the draining process. */ if(otmp == victual.piece && otmp->odrained && (peek_at_iced_corpse_age(otmp) + victual.usedtime + 5) < monstermoves) victual.piece = (struct obj *)0; /* Can't resume */ if(otmp == victual.piece) { /* If they weren't able to choke, they don't suddenly become able to * choke just because they were interrupted. On the other hand, if * they were able to choke before, if they lost food it's possible * 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); } /* nothing in progress - so try to find something. */ /* tins are a special case */ /* tins must also check conduct separately in case they're discarded */ if(otmp->otyp == TIN) { start_tin(otmp); return(1); } /* KMH, conduct */ u.uconduct.food++; victual.piece = otmp = touchfood(otmp); victual.usedtime = 0; /* Now we need to calculate delay and nutritional info. * The base nutrition calculated here and in eatcorpse() accounts * for normal vs. rotten food. The reqtime and nutrit values are * then adjusted in accordance with the amount of food left. */ if(otmp->otyp == CORPSE) { int tmp = eatcorpse(otmp); if (tmp == 3) { /* inedible */ victual.piece = (struct obj *)0; /* * The combination of odrained == TRUE and oeaten == cnutrit * represents the case of starting to drain a corpse but not * getting any further (eg., loosing consciousness due to * rotten food). We must preserve this case to avoid corpses * changing appearance after a failed attempt to eat. */ if (!otmp->odrained && otmp->oeaten == mons[otmp->corpsenm].cnutrit) otmp->oeaten = 0; /* ALI, conduct: didn't eat it after all */ u.uconduct.food--; return 0; } else if (tmp == 2) { /* used up */ victual.piece = (struct obj *)0; return(1); } else if (tmp) dont_start = TRUE; /* if not used up, eatcorpse sets up reqtime and may modify * oeaten */ } else { /* No checks for WAX, LEATHER, BONE, DRAGON_HIDE. These are * all handled in the != FOOD_CLASS case, above */ switch (objects[otmp->otyp].oc_material) { case FLESH: u.uconduct.unvegan++; if (otmp->otyp != EGG && otmp->otyp != CHEESE) { violated_vegetarian(); } break; default: if (otmp->otyp == PANCAKE || otmp->otyp == FORTUNE_COOKIE || /* eggs */ otmp->otyp == CREAM_PIE || otmp->otyp == CANDY_BAR || /* milk */ otmp->otyp == LUMP_OF_ROYAL_JELLY) u.uconduct.unvegan++; break; } victual.reqtime = objects[otmp->otyp].oc_delay; if (otmp->otyp != FORTUNE_COOKIE && (otmp->cursed || (((monstermoves - otmp->age) > (int) otmp->blessed ? 50:30) && (otmp->orotten || !rn2(7))))) { if (rottenfood(otmp)) { otmp->orotten = TRUE; dont_start = TRUE; } if (otmp->oeaten < 2) { victual.piece = (struct obj *)0; if (carried(otmp)) useup(otmp); else useupf(otmp, 1L); return 1; } else consume_oeaten(otmp, 1); /* oeaten >>= 1 */ } else fprefx(otmp); } /* re-calc the nutrition */ if (otmp->otyp == CORPSE) basenutrit = mons[otmp->corpsenm].cnutrit; else basenutrit = objects[otmp->otyp].oc_nutrition; nutrit = otmp->oeaten; if (otmp->otyp == CORPSE && otmp->odrained) { nutrit -= drainlevel(otmp); basenutrit -= drainlevel(otmp); } #ifdef DEBUG debugpline("before rounddiv: victual.reqtime == %d", victual.reqtime); debugpline("oeaten == %d, basenutrit == %d", otmp->oeaten, basenutrit); debugpline("nutrit == %d, cnutrit == %d", nutrit, otmp->otyp == CORPSE ? mons[otmp->corpsenm].cnutrit : objects[otmp->otyp].oc_nutrition); #endif victual.reqtime = (basenutrit == 0 ? 0 : rounddiv(victual.reqtime * (long)nutrit, basenutrit)); #ifdef DEBUG debugpline("after rounddiv: victual.reqtime == %d", victual.reqtime); #endif /* calculate the modulo value (nutrit. units per round eating) * [ALI] Note: although this is not exact, the remainder is * now dealt with in done_eating(). */ if (victual.reqtime == 0 || nutrit == 0) /* possible if most has been eaten before */ victual.nmod = 0; else if (nutrit >= victual.reqtime) victual.nmod = -(nutrit / victual.reqtime); else victual.nmod = victual.reqtime % nutrit; victual.canchoke = (u.uhs == SATIATED); if (!dont_start) start_eating(otmp); return(1); } /* Take a single bite from a piece of food, checking for choking and * modifying usedtime. Returns 1 if they choked and survived, 0 otherwise. */ STATIC_OVL int bite() { if(victual.canchoke && u.uhunger >= 2000) { choke(victual.piece); return 1; } if (victual.doreset) { do_reset_eat(); return 0; } 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(); return 0; } #endif /* OVLB */ #ifdef OVL0 void gethungry() /* as time goes by - called by moveloop() and domove() */ { if (u.uinvulnerable) return; /* you don't feel hungrier */ if ((!u.usleep || !rn2(10)) /* slow metabolic rate while asleep */ && (carnivorous(youmonst.data) || herbivorous(youmonst.data)) && !Slow_digestion) u.uhunger--; /* ordinary food consumption */ if (moves % 2) { /* odd turns */ /* Regeneration uses up food, unless due to an artifact */ if (HRegeneration || ((ERegeneration & (~W_ART)) && (ERegeneration != W_WEP || !uwep->oartifact))) u.uhunger--; if (near_capacity() > SLT_ENCUMBER) u.uhunger--; } else { /* even turns */ if (Hunger) u.uhunger--; /* Conflict uses up food too */ if (HConflict || (EConflict & (~W_ARTI))) u.uhunger--; /* +0 charged rings don't do anything, so don't affect hunger */ /* Slow digestion still uses ring hunger */ switch ((int)(moves % 20)) { /* note: use even cases only */ case 4: if (uleft && (uleft->spe || !objects[uleft->otyp].oc_charged)) u.uhunger--; break; case 8: if (uamul) u.uhunger--; break; case 12: if (uright && (uright->spe || !objects[uright->otyp].oc_charged)) u.uhunger--; break; case 16: if (u.uhave.amulet) u.uhunger--; break; default: break; } } newuhs(TRUE); } #endif /* OVL0 */ #ifdef OVLB void morehungry(num) /* called after vomiting and after performing feats of magic */ register int num; { u.uhunger -= num; newuhs(TRUE); } void 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 { /* Have lesshungry() report when you're nearly full so all eating * warns when you're about to choke. */ if (u.uhunger >= 1500) { if (!victual.eating || (victual.eating && !victual.fullwarn)) { pline("You're having a hard time getting all of it down."); nomovemsg = "You're finally finished."; if (!victual.eating) multi = -2; else { victual.fullwarn = TRUE; if (victual.canchoke && victual.reqtime > 1) { /* a one-gulp food will not survive a stop */ if (yn_function("Stop eating?",ynchars,'y')=='y') { reset_eat(); nomovemsg = (char *)0; } } } } } } newuhs(FALSE); } STATIC_PTR int unfaint() { (void) Hear_again(); if(u.uhs > FAINTING) u.uhs = FAINTING; stop_occupation(); flags.botl = 1; return 0; } #endif /* OVLB */ #ifdef OVL0 boolean is_fainted() { return((boolean)(u.uhs == FAINTED)); } void reset_faint() /* call when a faint must be prematurely terminated */ { if(is_fainted()) nomul(0); } #if 0 void sync_hunger() { if(is_fainted()) { flags.soundok = 0; nomul(-10+(u.uhunger/10)); nomovemsg = "You regain consciousness."; afternmv = unfaint; } } #endif void newuhs(incr) /* compute and comment on your (new?) hunger status */ boolean incr; { unsigned newhs; static unsigned save_hs; static boolean saved_hs = FALSE; int h = u.uhunger; newhs = (h > 1000) ? SATIATED : (h > 150) ? NOT_HUNGRY : (h > 50) ? HUNGRY : (h > 0) ? WEAK : FAINTING; /* While you're eating, you may pass from WEAK to HUNGRY to NOT_HUNGRY. * This should not produce the message "you only feel hungry now"; * that message should only appear if HUNGRY is an endpoint. Therefore * we check to see if we're in the middle of eating. If so, we save * the first hunger status, and at the end of eating we decide what * message to print based on the _entire_ meal, not on each little bit. */ /* It is normally possible to check if you are in the middle of a meal * by checking occupation == eatfood, but there is one special case: * start_eating() can call bite() for your first bite before it * sets the occupation. * Anyone who wants to get that case to work _without_ an ugly static * force_save_hs variable, feel free. */ /* Note: If you become a certain hunger status in the middle of the * meal, and still have that same status at the end of the meal, * this will incorrectly print the associated message at the end of * the meal instead of the middle. Such a case is currently * impossible, but could become possible if a message for SATIATED * were added or if HUNGRY and WEAK were separated by a big enough * gap to fit two bites. */ if (occupation == eatfood || force_save_hs) { if (!saved_hs) { save_hs = u.uhs; saved_hs = TRUE; } u.uhs = newhs; return; } else { if (saved_hs) { u.uhs = save_hs; saved_hs = FALSE; } } if(newhs == FAINTING) { if(is_fainted()) newhs = FAINTED; if(u.uhs <= WEAK || rn2(20-u.uhunger/10) >= 19) { if(!is_fainted() && multi >= 0 /* %% */) { /* stop what you're doing, then faint */ stop_occupation(); You("faint from lack of food."); flags.soundok = 0; nomul(-10+(u.uhunger/10)); nomovemsg = "You regain consciousness."; afternmv = unfaint; newhs = FAINTED; } } else if(u.uhunger < -(int)(200 + 20*ACURR(A_CON))) { u.uhs = STARVED; flags.botl = 1; bot(); You("die from starvation."); killer_format = KILLED_BY; killer = "starvation"; done(STARVING); /* if we return, we lifesaved, and that calls newuhs */ return; } } if(newhs != u.uhs) { if(newhs >= WEAK && u.uhs < WEAK) losestr(1); /* this may kill you -- see below */ else if(newhs < WEAK && u.uhs >= WEAK) losestr(-1); switch(newhs){ case HUNGRY: if (Hallucination) { You((!incr) ? "now have a lesser case of the munchies." : "are getting the munchies."); } else You((!incr) ? "only feel hungry now." : (u.uhunger < 145) ? "feel hungry." : "are beginning to feel hungry."); if (incr && occupation && (occupation != eatfood && occupation != opentin)) stop_occupation(); break; case WEAK: if (Hallucination) pline((!incr) ? "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." : "are beginning to feel weak."); if (incr && occupation && (occupation != eatfood && occupation != opentin)) stop_occupation(); break; } u.uhs = newhs; flags.botl = 1; bot(); if ((Upolyd ? u.mh : u.uhp) < 1) { You("die from hunger and exhaustion."); killer_format = KILLED_BY; killer = "exhaustion"; done(STARVING); return; } } } #endif /* OVL0 */ #ifdef OVLB boolean can_reach_floorobj() { return can_reach_floor() && !((is_pool(u.ux, u.uy) || is_lava(u.ux, u.uy)) && (Wwalking || is_clinger(youmonst.data) || (Flying && !Breathless))); } /* Returns an object representing food. Object may be either on floor or * in inventory. */ STATIC_OVL struct obj * floorfood(verb) /* get food from floor or pack */ const char *verb; { register struct obj *otmp; /* We cannot use ALL_CLASSES since that causes getobj() to skip its * "ugly checks" and we need to check for inedible items. */ const char *edibles = (const char *)allobj; char qbuf[QBUFSZ]; char c; #ifdef STEED if (u.usteed) /* can't eat off floor while riding */ edibles++; else #endif if (metallivorous(youmonst.data)) { struct trap *ttmp = t_at(u.ux, u.uy); if (ttmp && ttmp->tseen && ttmp->ttyp == BEAR_TRAP) { /* If not already stuck in the trap, perhaps there should be a chance to becoming trapped? Probably not, because then the trap would just get eaten on the _next_ turn... */ Sprintf(qbuf, "There is a bear trap here (%s); eat it?", (u.utrap && u.utraptype == TT_BEARTRAP) ? "holding you" : "armed"); if ((c = yn_function(qbuf, ynqchars, 'n')) == 'y') { u.utrap = u.utraptype = 0; deltrap(ttmp); return mksobj(BEARTRAP, TRUE, FALSE); } else if (c == 'q') { return (struct obj *)0; } } } otmp = getobj(edibles, verb); if (otmp && otmp->oclass == COIN_CLASS) obj_extract_self(otmp); return otmp; } /* Side effects of vomiting */ /* added nomul (MRS) - it makes sense, you're too busy being sick! */ void vomit() /* A good idea from David Neves */ { make_sick(0L, (char *) 0, TRUE, SICK_VOMITABLE); nomul(-2); nomovemsg = 0; } int eaten_stat(base, obj) register int base; register struct obj *obj; { long uneaten_amt, full_amount; 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*/ slashem-0.0.7E7F3/src/borg.c0000664000076400007640000000155710545462317013550 0ustar aliali/* the nethack cyborg! */ /* by proudft@ccnet.com */ #include "hack.h" #include "func_tab.h" #ifdef BORG #define HP_TRACK 25 #define HP_TREND 3 char borg_on=0; char borg_line[80] = {0}; int predicted_hp; void adjust_hp_list(void) { static int hp_list[HP_TRACK] = {0}; int l; int hp_diff; for (l=0;lmx * != x || mtmp->my != y, we'd miss the case where we're called * to place the worm segment and the worm's head is at x,y. */ if (mtmp2 && (mtmp2 != mtmp || mtmp->wormno)) is_badpos = 1; mdat = mtmp->data; pool = is_pool(x,y); if (mdat->mlet == S_EEL && !pool && rn2(13) && !ignorewater) is_badpos = 1; if (pool && !ignorewater) { if (mtmp == &youmonst) return (HLevitation || Flying || Wwalking || Swimming || Amphibious) ? is_badpos : -1; else return (is_flyer(mdat) || is_swimmer(mdat) || is_clinger(mdat)) ? is_badpos : -1; } else if (is_lava(x,y)) { if (mtmp == &youmonst) return HLevitation ? is_badpos : -1; else return (is_flyer(mdat) || likes_lava(mdat)) ? is_badpos : -1; } if (passes_walls(mdat) && may_passwall(x,y)) return is_badpos; } if (!ACCESSIBLE(levl[x][y].typ)) { if (!(is_pool(x,y) && ignorewater)) return -1; } if (closed_door(x, y) && (!mdat || !amorphous(mdat))) return mdat && (nohands(mdat) || verysmall(mdat)) ? -1 : 1; if (sobj_at(BOULDER, x, y) && (!mdat || !throws_rocks(mdat))) return mdat ? -1 : 1; return is_badpos; } /* * Is (x,y) a good position of mtmp? If mtmp is NULL, then is (x,y) good * for an object? * * This function will only look at mtmp->mdat, so makemon, mplayer, etc can * call it to generate new monster positions with fake monster structures. */ boolean goodpos(x, y, mtmp, gpflags) int x,y; struct monst *mtmp; unsigned gpflags; { if (!isok(x, y)) return FALSE; return !badpos(x, y, mtmp, gpflags); } /* * "entity next to" * * Attempt to find a good place for the given monster type in the closest * position to (xx,yy). Do so in successive square rings around (xx,yy). * If there is more than one valid positon in the ring, choose one randomly. * Return TRUE and the position chosen when successful, FALSE otherwise. */ boolean enexto(cc, xx, yy, mdat) coord *cc; register xchar xx, yy; struct permonst *mdat; { return enexto_core(cc, xx, yy, mdat, 0); } boolean enexto_core(cc, xx, yy, mdat, entflags) coord *cc; register xchar xx, yy; struct permonst *mdat; unsigned entflags; { #define MAX_GOOD 15 coord good[MAX_GOOD], *good_ptr; int x, y, range, i; int xmin, xmax, ymin, ymax; struct monst fakemon; /* dummy monster */ if (!mdat) { #ifdef DEBUG pline("enexto() called with mdat==0"); #endif /* default to player's original monster type */ mdat = &mons[u.umonster]; } fakemon.data = mdat; /* set up for goodpos */ good_ptr = good; range = 1; /* * Walk around the border of the square with center (xx,yy) and * radius range. Stop when we find at least one valid position. */ do { xmin = max(1, xx-range); xmax = min(COLNO-1, xx+range); ymin = max(0, yy-range); ymax = min(ROWNO-1, yy+range); for (x = xmin; x <= xmax; x++) if (goodpos(x, ymin, &fakemon, entflags)) { good_ptr->x = x; good_ptr->y = ymin ; /* beware of accessing beyond segment boundaries.. */ if (good_ptr++ == &good[MAX_GOOD-1]) goto full; } for (x = xmin; x <= xmax; x++) if (goodpos(x, ymax, &fakemon, entflags)) { good_ptr->x = x; good_ptr->y = ymax ; /* beware of accessing beyond segment boundaries.. */ if (good_ptr++ == &good[MAX_GOOD-1]) goto full; } for (y = ymin+1; y < ymax; y++) if (goodpos(xmin, y, &fakemon, entflags)) { good_ptr->x = xmin; good_ptr-> y = y ; /* beware of accessing beyond segment boundaries.. */ if (good_ptr++ == &good[MAX_GOOD-1]) goto full; } for (y = ymin+1; y < ymax; y++) if (goodpos(xmax, y, &fakemon, entflags)) { good_ptr->x = xmax; good_ptr->y = y ; /* beware of accessing beyond segment boundaries.. */ if (good_ptr++ == &good[MAX_GOOD-1]) goto full; } range++; /* return if we've grown too big (nothing is valid) */ if (range > ROWNO && range > COLNO) return FALSE; } while (good_ptr == good); full: i = rn2((int)(good_ptr - good)); cc->x = good[i].x; cc->y = good[i].y; return TRUE; } /* * "entity path to" * * Attempt to find nc good places for the given monster type with the shortest * path to (xx,yy). Where there is more than one valid set of positions, one * will be chosen at random. Return the number of positions found. * Warning: This routine is much slower than enexto and should be used * with caution. */ #define EPATHTO_UNSEEN 0x0 #define EPATHTO_INACCESSIBLE 0x1 #define EPATHTO_DONE 0x2 #define EPATHTO_TAIL(n) (0x3 + ((n) & 1)) #define EPATHTO_XY(x,y) (((y) + 1) * COLNO + (x)) #define EPATHTO_Y(xy) ((xy) / COLNO - 1) #define EPATHTO_X(xy) ((xy) % COLNO) #ifdef DEBUG coord epathto_debug_cc[100]; #endif int epathto(cc, nc, xx, yy, mdat) coord *cc; int nc; register xchar xx, yy; struct permonst *mdat; { int i, j, dir, ndirs, xy, x, y, r; int path_len, postype; int first_col, last_col; int nd, n; unsigned char *map; static const int dirs[8] = /* N, S, E, W, NW, NE, SE, SW */ { -COLNO, COLNO, 1, -1, -COLNO-1, -COLNO+1, COLNO+1, COLNO-1}; struct monst fakemon; /* dummy monster */ fakemon.data = mdat; /* set up for badpos */ map = (unsigned char *)alloc(COLNO * (ROWNO + 2)); (void) memset((genericptr_t)map, EPATHTO_INACCESSIBLE, COLNO * (ROWNO + 2)); for(i = 1; i < COLNO; i++) for(j = 0; j < ROWNO; j++) map[EPATHTO_XY(i, j)] = EPATHTO_UNSEEN; map[EPATHTO_XY(xx, yy)] = EPATHTO_TAIL(0); if (badpos(xx, yy, &fakemon, 0) == 0) { cc[0].x = xx; cc[0].y = yy; nd = n = 1; } else nd = n = 0; for(path_len = 0; nd < nc; path_len++) { first_col = max(1, xx - path_len); last_col = min(COLNO - 1, xx + path_len); for(j = max(0, yy - path_len); j <= min(ROWNO - 1, yy + path_len); j++) for(i = first_col; i <= last_col; i++) if (map[EPATHTO_XY(i, j)] == EPATHTO_TAIL(path_len)) { map[EPATHTO_XY(i, j)] = EPATHTO_DONE; ndirs = mdat == &mons[PM_GRID_BUG] ? 4 : 8; for(dir = 0; dir < ndirs; dir++) { xy = EPATHTO_XY(i, j) + dirs[dir]; if (map[xy] == EPATHTO_UNSEEN) { x = EPATHTO_X(xy); y = EPATHTO_Y(xy); postype = badpos(x, y, &fakemon, 0); map[xy] = postype < 0 ? EPATHTO_INACCESSIBLE : EPATHTO_TAIL(path_len + 1); if (postype == 0) { if (n < nc) { cc[n].x = x; cc[n].y = y; } else if (rn2(n - nd + 1) < nc - nd) { r = rn2(nc - nd) + nd; cc[r].x = x; cc[r].y = y; } ++n; } } } } if (nd == n) break; /* No more positions */ else nd = n; } if (nd > nc) nd = nc; #ifdef DEBUG if (cc == epathto_debug_cc) { winid win; int glyph; char row[COLNO+1]; win = create_nhwindow(NHW_TEXT); putstr(win, 0, ""); for (y = 0; y < ROWNO; y++) { for (x = 1; x < COLNO; x++) { xy = EPATHTO_XY(x, y); if (map[xy] == EPATHTO_INACCESSIBLE) { glyph = back_to_glyph(x, y); row[x] = showsyms[glyph_to_cmap(glyph)]; } else row[x] = ' '; } for (i = 0; i < nd; i++) if (cc[i].y == y) row[cc[i].x] = i < 10 ? '0' + i : i < 36 ? 'a' + i - 10 : i < 62 ? 'A' + i - 36 : '?'; /* remove trailing spaces */ for (x = COLNO-1; x >= 1; x--) if (row[x] != ' ') break; row[x+1] = '\0'; putstr(win, 0, &row[1]); } display_nhwindow(win, TRUE); destroy_nhwindow(win); } #endif free((genericptr_t)map); return nd; } /* * func should return 1 if the location should be counted as inaccessible * (path won't continue through this point) or 0 if it is accessible. */ void xpathto(r, xx, yy, func, data) int r; register xchar xx, yy; int (*func)(genericptr_t, int, int); genericptr_t data; { int i, j, dir, xy, x, y; int path_len, postype; int first_col, last_col; int nd, n; unsigned char *map; static const int dirs[8] = /* N, S, E, W, NW, NE, SE, SW */ { -COLNO, COLNO, 1, -1, -COLNO-1, -COLNO+1, COLNO+1, COLNO-1}; map = (unsigned char *)alloc(COLNO * (ROWNO + 2)); (void) memset((genericptr_t)map, EPATHTO_INACCESSIBLE, COLNO * (ROWNO + 2)); for(i = 1; i < COLNO; i++) for(j = 0; j < ROWNO; j++) map[EPATHTO_XY(i, j)] = EPATHTO_UNSEEN; map[EPATHTO_XY(xx, yy)] = EPATHTO_TAIL(0); if (func(data, xx, yy) == 0) nd = n = 1; else nd = n = 0; for(path_len = 0; path_len < r; path_len++) { first_col = max(1, xx - path_len); last_col = min(COLNO - 1, xx + path_len); for(j = max(0, yy - path_len); j <= min(ROWNO - 1, yy + path_len); j++) for(i = first_col; i <= last_col; i++) if (map[EPATHTO_XY(i, j)] == EPATHTO_TAIL(path_len)) { map[EPATHTO_XY(i, j)] = EPATHTO_DONE; for(dir = 0; dir < 8; dir++) { xy = EPATHTO_XY(i, j) + dirs[dir]; if (map[xy] == EPATHTO_UNSEEN) { x = EPATHTO_X(xy); y = EPATHTO_Y(xy); postype = func(data, x, y); map[xy] = postype ? EPATHTO_INACCESSIBLE : EPATHTO_TAIL(path_len + 1); if (postype == 0) ++n; } } } if (nd == n) break; /* No more positions */ else nd = n; } free((genericptr_t)map); } #ifdef DEBUG void wiz_debug_cmd() /* in this case, run epathto on arbitary monster & goal */ { struct permonst *ptr; int mndx, i; coord cc; char buf[BUFSIZ]; for(i = 0; ; i++) { if(i >= 5) { pline(thats_enough_tries); return; } getlin("What monster do you want to test? [type the name]", buf); mndx = name_to_mon(buf); if (mndx == NON_PM) { pline("Such creatures do not exist in this world."); continue; } ptr = &mons[mndx]; pline("Which position do you want to aim for?"); cc.x = u.ux; cc.y = u.uy; if (getpos(&cc, TRUE, "the goal position") < 0) return; /* abort */ epathto(epathto_debug_cc, SIZE(epathto_debug_cc), cc.x, cc.y, ptr); break; } } #endif /* DEBUG */ /* * Check for restricted areas present in some special levels. (This might * need to be augmented to allow deliberate passage in wizard mode, but * only for explicitly chosen destinations.) */ STATIC_OVL boolean tele_jump_ok(x1, y1, x2, y2) int x1, y1, x2, y2; { if (dndest.nlx > 0) { /* if inside a restricted region, can't teleport outside */ if (within_bounded_area(x1, y1, dndest.nlx, dndest.nly, dndest.nhx, dndest.nhy) && !within_bounded_area(x2, y2, dndest.nlx, dndest.nly, dndest.nhx, dndest.nhy)) # ifdef WIZARD if (!wizard) # endif /* WIZARD */ return FALSE; /* and if outside, can't teleport inside */ if (!within_bounded_area(x1, y1, dndest.nlx, dndest.nly, dndest.nhx, dndest.nhy) && within_bounded_area(x2, y2, dndest.nlx, dndest.nly, dndest.nhx, dndest.nhy)) # ifdef WIZARD if (!wizard) # endif /* WIZARD */ return FALSE; } if (updest.nlx > 0) { /* ditto */ if (within_bounded_area(x1, y1, updest.nlx, updest.nly, updest.nhx, updest.nhy) && !within_bounded_area(x2, y2, updest.nlx, updest.nly, updest.nhx, updest.nhy)) # ifdef WIZARD if (!wizard) # endif /* WIZARD */ return FALSE; if (!within_bounded_area(x1, y1, updest.nlx, updest.nly, updest.nhx, updest.nhy) && within_bounded_area(x2, y2, updest.nlx, updest.nly, updest.nhx, updest.nhy)) # ifdef WIZARD if (!wizard) # endif /* WIZARD */ return FALSE; } return TRUE; } STATIC_OVL boolean teleok(x, y, trapok) register int x, y; boolean trapok; { if (!trapok && t_at(x, y)) return FALSE; if (!goodpos(x, y, &youmonst, 0)) return FALSE; if (!tele_jump_ok(u.ux, u.uy, x, y)) return FALSE; if (!in_out_region(x, y)) return FALSE; return TRUE; } void teleds(nux, nuy, allow_drag) register int nux,nuy; boolean allow_drag; { boolean ball_active = (Punished && uball->where != OBJ_FREE), ball_still_in_range = FALSE; /* If they have to move the ball, then drag if allow_drag is true; * otherwise they are teleporting, so unplacebc(). * If they don't have to move the ball, then always "drag" whether or * not allow_drag is true, because we are calling that function, not * to drag, but to move the chain. *However* there are some dumb * special cases: * 0 0 * _X move east -----> X_ * @ @ * These are permissible if teleporting, but not if dragging. As a * result, drag_ball() needs to know about allow_drag and might end * up dragging the ball anyway. Also, drag_ball() might find that * dragging the ball is completely impossible (ball in range but there's * rock in the way), in which case it teleports the ball on its own. */ if (ball_active) { if (!carried(uball) && distmin(nux, nuy, uball->ox, uball->oy) <= 2) ball_still_in_range = TRUE; /* don't have to move the ball */ else { /* have to move the ball */ if (!allow_drag || distmin(u.ux, u.uy, nux, nuy) > 1) { /* we should not have dist > 1 and allow_drag at the same * time, but just in case, we must then revert to teleport. */ allow_drag = FALSE; unplacebc(); } } } u.utrap = 0; setustuck(0); u.ux0 = u.ux; u.uy0 = u.uy; if (hides_under(youmonst.data)) u.uundetected = OBJ_AT(nux, nuy); else if (youmonst.data->mlet == S_EEL) u.uundetected = is_pool(nux, nuy); else { u.uundetected = 0; /* mimics stop being unnoticed */ if (youmonst.data->mlet == S_MIMIC) youmonst.m_ap_type = M_AP_NOTHING; } if (u.uswallow) { u.uswldtim = u.uswallow = 0; if (Punished && !ball_active) { /* ensure ball placement, like unstuck */ ball_active = TRUE; allow_drag = FALSE; } docrt(); } if (ball_active) { if (ball_still_in_range || allow_drag) { int bc_control; xchar ballx, bally, chainx, chainy; boolean cause_delay; if (drag_ball(nux, nuy, &bc_control, &ballx, &bally, &chainx, &chainy, &cause_delay, allow_drag)) move_bc(0, bc_control, ballx, bally, chainx, chainy); } } /* must set u.ux, u.uy after drag_ball(), which may need to know the old position if allow_drag is true... */ u.ux = nux; u.uy = nuy; fill_pit(u.ux0, u.uy0); if (ball_active) { if (!ball_still_in_range && !allow_drag) placebc(); } initrack(); /* teleports mess up tracking monsters without this */ update_player_regions(); #ifdef STEED /* Move your steed, too */ if (u.usteed) { u.usteed->mx = nux; u.usteed->my = nuy; } #endif /* * Make sure the hero disappears from the old location. This will * not happen if she is teleported within sight of her previous * location. Force a full vision recalculation because the hero * is now in a new location. */ newsym(u.ux0,u.uy0); see_monsters(); vision_full_recalc = 1; nomul(0); vision_recalc(0); /* vision before effects */ spoteffects(TRUE); invocation_message(); } boolean safe_teleds(allow_drag) boolean allow_drag; { register int nux, nuy, tcnt = 0; do { nux = rnd(COLNO-1); nuy = rn2(ROWNO); } while (!teleok(nux, nuy, (boolean)(tcnt > 200)) && ++tcnt <= 400); if (tcnt <= 400) { teleds(nux, nuy, allow_drag); return TRUE; } else return FALSE; } STATIC_OVL void vault_tele() { register struct mkroom *croom = search_special(VAULT); coord c; if (croom && somexy(croom, &c) && teleok(c.x,c.y,FALSE)) { teleds(c.x,c.y,FALSE); return; } tele(); } boolean teleport_pet(mtmp, force_it) register struct monst *mtmp; boolean force_it; { register struct obj *otmp; #ifdef STEED if (mtmp == u.usteed) return (FALSE); #endif if (mtmp->mleashed) { otmp = get_mleash(mtmp); if (!otmp) { impossible("%s is leashed, without a leash.", Monnam(mtmp)); goto release_it; } if (otmp->cursed && !force_it) { yelp(mtmp); return FALSE; } else { Your("leash goes slack."); release_it: m_unleash(mtmp, FALSE); return TRUE; } } return TRUE; } void tele() { coord cc; /* Disable teleportation in stronghold && Vlad's Tower */ if (level.flags.noteleport) { #ifdef WIZARD if (!wizard) { #endif pline("A mysterious force prevents you from teleporting!"); return; #ifdef WIZARD } #endif } /* don't show trap if "Sorry..." */ if (!Blinded) make_blinded(0L,FALSE); if #ifdef WIZARD ( #endif (u.uhave.amulet || On_W_tower_level(&u.uz) #ifdef STEED || (u.usteed && mon_has_amulet(u.usteed)) #endif ) #ifdef WIZARD && (!wizard) ) #endif { You_feel("disoriented for a moment."); return; } if ((Teleport_control && !Stunned) #ifdef WIZARD || wizard #endif ) { if (unconscious()) { pline("Being unconscious, you cannot control your teleport."); } else { #ifdef STEED char buf[BUFSZ]; if (u.usteed) Sprintf(buf," and %s", mon_nam(u.usteed)); #endif pline("To what position do you%s want to be teleported?", #ifdef STEED u.usteed ? buf : #endif ""); cc.x = u.ux; cc.y = u.uy; if (getpos(&cc, TRUE, "the desired position") < 0) return; /* abort */ /* possible extensions: introduce a small error if magic power is low; allow transfer to solid rock */ if (teleok(cc.x, cc.y, FALSE)) { teleds(cc.x, cc.y, FALSE); return; } pline("Sorry..."); } } (void) safe_teleds(FALSE); } int dotele() { struct trap *trap; trap = t_at(u.ux, u.uy); if (trap && (!trap->tseen || trap->ttyp != TELEP_TRAP)) trap = 0; if (trap) { if (trap->once) { pline("This is a vault teleport, usable once only."); if (yn("Jump in?") == 'n') trap = 0; else { deltrap(trap); newsym(u.ux, u.uy); } } if (trap) You("%s onto the teleportation trap.", locomotion(youmonst.data, "jump")); } if (!trap) { boolean castit = FALSE; register int sp_no = 0, energy = 0; if (!Teleportation || (u.ulevel < (Role_if(PM_WIZARD) ? 8 : 12) && !can_teleport(youmonst.data))) { /* Try to use teleport away spell. */ if (objects[SPE_TELEPORT_AWAY].oc_name_known && !Confusion) for (sp_no = 0; sp_no < MAXSPELL; sp_no++) if (spl_book[sp_no].sp_id == SPE_TELEPORT_AWAY) { castit = TRUE; break; } #ifdef WIZARD if (!wizard) { #endif if (!castit) { if (!Teleportation) You("don't know that spell."); else You("are not able to teleport at will."); return(0); } #ifdef WIZARD } #endif } if (u.uhunger <= 10 || ACURR(A_STR) < 6) { #ifdef WIZARD if (!wizard) { #endif You("lack the strength %s.", castit ? "for a teleport spell" : "to teleport"); return 1; #ifdef WIZARD } #endif } energy = objects[SPE_TELEPORT_AWAY].oc_level * 5; if (u.uen <= energy) { #ifdef WIZARD if (wizard) energy = u.uen; else #endif { You("lack the energy %s.", castit ? "for a teleport spell" : "to teleport"); return 1; } } if (check_capacity( "Your concentration falters from carrying so much.")) return 1; if (castit) { exercise(A_WIS, TRUE); if (spelleffects(sp_no, TRUE)) return(1); else #ifdef WIZARD if (!wizard) #endif return(0); } else { u.uen -= energy; flags.botl = 1; } } if (next_to_u()) { if (trap && trap->once) vault_tele(); else tele(); (void) next_to_u(); } else { You(shudder_for_moment); return(0); } if (!trap) morehungry(10); return(1); } void level_tele() { register int newlev; d_level newlevel; const char *escape_by_flying = 0; /* when surviving dest of -N */ char buf[BUFSZ]; boolean force_dest = FALSE; if ((u.uhave.amulet || In_endgame(&u.uz) || In_sokoban(&u.uz) #ifdef STEED || (u.usteed && mon_has_amulet(u.usteed)) #endif ) #ifdef WIZARD && !wizard #endif ) { You_feel("very disoriented for a moment."); return; } if ((Teleport_control && !Stunned) #ifdef WIZARD || wizard #endif ) { char qbuf[BUFSZ]; int trycnt = 0; Strcpy(qbuf, "To what level do you want to teleport?"); do { if (++trycnt == 2) { #ifdef WIZARD if (wizard) Strcat(qbuf, " [type a number or ? for a menu]"); else #endif Strcat(qbuf, " [type a number]"); } getlin(qbuf, buf); if (!strcmp(buf,"\033")) { /* cancelled */ if (Confusion && rnl(5)) { pline("Oops..."); goto random_levtport; } return; } else if (!strcmp(buf,"*")) { goto random_levtport; } else if (Confusion && rnl(5)) { pline("Oops..."); goto random_levtport; } #ifdef WIZARD if (wizard && !strcmp(buf,"?")) { schar destlev = 0; xchar destdnum = 0; if ((newlev = (int)print_dungeon(TRUE, &destlev, &destdnum))) { newlevel.dnum = destdnum; newlevel.dlevel = destlev; if (In_endgame(&newlevel) && !In_endgame(&u.uz)) { Sprintf(buf, "Destination is earth level"); if (!u.uhave.amulet) { struct obj *obj; obj = mksobj(AMULET_OF_YENDOR, TRUE, FALSE); if (obj) { obj = addinv(obj); Strcat(buf, " with the amulet"); } } assign_level(&newlevel, &earth_level); pline("%s.", buf); } force_dest = TRUE; } else return; } else #endif if ((newlev = lev_by_name(buf)) == 0) { #ifdef WIZARD s_level *slev; /* if you're using wizard mode, you shouldn't really need * the game to interpret things like `mine town level' */ if (wizard && (slev = find_level(buf))) { schedule_goto(&slev->dlevel, FALSE, FALSE, 0, (char *)0, (char *)0); return; } #endif newlev = atoi(buf); } } while (!newlev && !digit(buf[0]) && (buf[0] != '-' || !digit(buf[1])) && trycnt < 10); /* no dungeon escape via this route */ if (newlev == 0) { 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."); if (invent) Your("possessions land on the %s with a thud.", surface(u.ux, u.uy)); killer_format = NO_KILLER_PREFIX; killer = "committed suicide"; done(DIED); pline("An energized cloud of dust begins to coalesce."); Your("body rematerializes%s.", invent ? ", and you gather up all your possessions" : ""); return; } /* if in Knox and the requested level > 0, stay put. * we let negative values requests fall into the "heaven" loop. * [ALI] Add other single level dungeons entered via portal. */ if ((Is_knox(&u.uz) || #ifdef BLACKMARKET Is_blackmarket(&u.uz) || #endif Is_aligned_quest(&u.uz)) && newlev > 0) { You(shudder_for_moment); return; } /* if in Quest, the player sees "Home 1", etc., on the status * line, instead of the logical depth of the level. controlled * level teleport request is likely to be relativized to the * status line, and consequently it should be incremented to * the value of the logical depth of the target level. * * we let negative values requests fall into the "heaven" loop. */ if (In_quest(&u.uz) && newlev > 0) newlev = newlev + dungeons[u.uz.dnum].depth_start - 1; } else { /* involuntary level tele */ random_levtport: newlev = random_teleport_level(); if (newlev == depth(&u.uz)) { You(shudder_for_moment); return; } } if (!next_to_u()) { You(shudder_for_moment); return; } #ifdef WIZARD if (In_endgame(&u.uz)) { /* must already be wizard */ int llimit = dunlevs_in_dungeon(&u.uz); if (newlev >= 0 || newlev <= -llimit) { You_cant("get there from here."); return; } newlevel.dnum = u.uz.dnum; newlevel.dlevel = llimit + newlev; schedule_goto(&newlevel, FALSE, FALSE, 0, (char *)0, (char *)0); return; } #endif killer = 0; /* still alive, so far... */ if (newlev < 0 && !force_dest) { if (*u.ushops0) { /* take unpaid inventory items off of shop bills */ in_mklev = TRUE; /* suppress map update */ u_left_shop(u.ushops0, TRUE); /* you're now effectively out of the shop */ *u.ushops0 = *u.ushops = '\0'; in_mklev = FALSE; } if (newlev <= -10) { You("arrive in heaven."); verbalize("Thou art early, but we'll admit thee."); killer_format = NO_KILLER_PREFIX; killer = "went to heaven prematurely"; } else if (newlev == -9) { You_feel("deliriously happy. "); pline("(In fact, you're on Cloud 9!) "); display_nhwindow(WIN_MESSAGE, FALSE); } else You("are now high above the clouds..."); if (killer) { ; /* arrival in heaven is pending */ } else if (Levitation) { escape_by_flying = "float gently down to earth"; } else if (Flying) { escape_by_flying = "fly down to the ground"; } 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; } } if (killer) { /* the chosen destination was not survivable */ d_level lsav; /* set specific death location; this also suppresses bones */ lsav = u.uz; /* save current level, see below */ u.uz.dnum = 0; /* main dungeon */ u.uz.dlevel = (newlev <= -10) ? -10 : 0; /* heaven or surface */ done(DIED); /* can only get here via life-saving (or declining to die in explore|debug mode); the hero has now left the dungeon... */ escape_by_flying = "find yourself back on the surface"; u.uz = lsav; /* restore u.uz so escape code works */ } /* calls done(ESCAPED) if newlevel==0 */ if (escape_by_flying) { You("%s.", escape_by_flying); newlevel.dnum = 0; /* specify main dungeon */ newlevel.dlevel = 0; /* escape the dungeon */ /* [dlevel used to be set to 1, but it doesn't make sense to teleport out of the dungeon and float or fly down to the surface but then actually arrive back inside the dungeon] */ } else if (u.uz.dnum == medusa_level.dnum && newlev >= dungeons[u.uz.dnum].depth_start + dunlevs_in_dungeon(&u.uz)) { #ifdef WIZARD if (!(wizard && force_dest)) #endif find_hell(&newlevel); } else { /* if invocation did not yet occur, teleporting into * the last level of Gehennom is forbidden. */ #ifdef WIZARD if (!wizard) #endif if (Inhell && !u.uevent.invoked && newlev >= (dungeons[u.uz.dnum].depth_start + dunlevs_in_dungeon(&u.uz) - 1)) { # ifdef WIZARD if (!wizard) { # endif /* WIZARD */ newlev = dungeons[u.uz.dnum].depth_start + dunlevs_in_dungeon(&u.uz) - 2; pline("Sorry..."); # ifdef WIZARD } # endif /* WIZARD */ } /* no teleporting out of quest dungeon */ if # ifdef WIZARD ((!wizard) && # endif /* WIZARD */ (In_quest(&u.uz) && newlev < depth(&qstart_level)) # ifdef WIZARD ) # endif /* WIZARD */ newlev = depth(&qstart_level); /* the player thinks of levels purely in logical terms, so * we must translate newlev to a number relative to the * current dungeon. */ #ifdef WIZARD if (!(wizard && force_dest)) #endif get_level(&newlevel, newlev); } schedule_goto(&newlevel, FALSE, FALSE, 0, (char *)0, (char *)0); /* in case player just read a scroll and is about to be asked to call it something, we can't defer until the end of the turn */ if (u.utotype && !flags.mon_moving) deferred_goto(); } void domagicportal(ttmp) register struct trap *ttmp; { struct d_level target_level; if (!next_to_u()) { You(shudder_for_moment); return; } /* if landed from another portal, do nothing */ /* problem: level teleport landing escapes the check */ if (!on_level(&u.uz, &u.uz0)) return; You("activated a magic portal!"); /* prevent the poor shnook, whose amulet was stolen while in * the endgame, from accidently triggering the portal to the * next level, and thus losing the game */ if (In_endgame(&u.uz) && !u.uhave.amulet) { You_feel("dizzy for a moment, but nothing happens..."); return; } target_level = ttmp->dst; schedule_goto(&target_level, FALSE, FALSE, 1, "You feel dizzy for a moment, but the sensation passes.", (char *)0); } void tele_trap(trap) struct trap *trap; { if (In_endgame(&u.uz) || Antimagic) { if (Antimagic) shieldeff(u.ux, u.uy); You_feel("a wrenching sensation."); } else if (!next_to_u()) { You(shudder_for_moment); } else if (trap->once) { deltrap(trap); newsym(u.ux,u.uy); /* get rid of trap symbol */ vault_tele(); } else tele(); } void level_tele_trap(trap) struct trap *trap; { You("%s onto a level teleport trap!", Levitation ? (const char *)"float" : locomotion(youmonst.data, "step")); if (Antimagic) { shieldeff(u.ux, u.uy); } if (Antimagic || In_endgame(&u.uz)) { You_feel("a wrenching sensation."); return; } if (!Blind) You("are momentarily blinded by a flash of light."); else You("are momentarily disoriented."); deltrap(trap); newsym(u.ux,u.uy); /* get rid of trap symbol */ level_tele(); } /* check whether monster can arrive at location via Tport (or fall) */ STATIC_OVL boolean rloc_pos_ok(x, y, mtmp) register int x, y; /* coordinates of candidate location */ struct monst *mtmp; { register int xx, yy; if (!goodpos(x, y, mtmp, 0)) return FALSE; /* * Check for restricted areas present in some special levels. * * `xx' is current column; if 0, then `yy' will contain flag bits * rather than row: bit #0 set => moving upwards; bit #1 set => * inside the Wizard's tower. */ xx = mtmp->mx; yy = mtmp->my; if (!xx) { /* no current location (migrating monster arrival) */ if (dndest.nlx && On_W_tower_level(&u.uz)) return ((yy & 2) != 0) ^ /* inside xor not within */ !within_bounded_area(x, y, dndest.nlx, dndest.nly, dndest.nhx, dndest.nhy); if (updest.lx && (yy & 1) != 0) /* moving up */ return (within_bounded_area(x, y, updest.lx, updest.ly, updest.hx, updest.hy) && (!updest.nlx || !within_bounded_area(x, y, updest.nlx, updest.nly, updest.nhx, updest.nhy))); if (dndest.lx && (yy & 1) == 0) /* moving down */ return (within_bounded_area(x, y, dndest.lx, dndest.ly, dndest.hx, dndest.hy) && (!dndest.nlx || !within_bounded_area(x, y, dndest.nlx, dndest.nly, dndest.nhx, dndest.nhy))); } else { /* current location is */ if (!tele_jump_ok(xx, yy, x, y)) return FALSE; } /* is ok */ return TRUE; } /* * rloc_to() * * Pulls a monster from its current position and places a monster at * a new x and y. If oldx is 0, then the monster was not in the levels.monsters * array. However, if oldx is 0, oldy may still have a value because mtmp is a * migrating_mon. Worm tails are always placed randomly around the head of * the worm. */ void rloc_to(mtmp, x, y) struct monst *mtmp; register int x, y; { register int oldx = mtmp->mx, oldy = mtmp->my; boolean resident_shk = mtmp->isshk && inhishop(mtmp); if (x == mtmp->mx && y == mtmp->my) /* that was easy */ return; if (oldx) { /* "pick up" monster */ if (mtmp->wormno) remove_worm(mtmp); else { remove_monster(oldx, oldy); newsym(oldx, oldy); /* update old location */ } } place_monster(mtmp, x, y); /* put monster down */ update_monster_region(mtmp); if (mtmp->wormno) /* now put down tail */ place_worm_tail_randomly(mtmp, x, y); if (u.ustuck == mtmp) { if (u.uswallow) { u.ux = x; u.uy = y; docrt(); } else setustuck(0); } 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 */ /* return TRUE if successful, FALSE if not */ boolean rloc(mtmp, suppress_impossible) struct monst *mtmp; /* mx==0 implies migrating monster arrival */ boolean suppress_impossible; { register int x, y, trycount; #ifdef STEED if (mtmp == u.usteed) { tele(); return TRUE; } #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 */ x = xupladder, y = yupladder; else x = xdnladder, y = ydnladder; /* if the wiz teleports away to heal, try the up staircase, to block the player's escaping before he's healed (deliberately use `goodpos' rather than `rloc_pos_ok' here) */ if (goodpos(x, y, mtmp, 0)) goto found_xy; } trycount = 0; do { x = rn1(COLNO-3,2); y = rn2(ROWNO); if ((trycount < 500) ? rloc_pos_ok(x, y, mtmp) : goodpos(x, y, mtmp, 0)) goto found_xy; } while (++trycount < 1000); /* last ditch attempt to find a good place */ for (x = 2; x < COLNO - 1; x++) for (y = 0; y < ROWNO; y++) if (goodpos(x, y, mtmp, 0)) goto found_xy; /* level either full of monsters or somehow faulty */ if (!suppress_impossible) impossible("rloc(): couldn't relocate monster"); return FALSE; found_xy: rloc_to(mtmp, x, y); return TRUE; } STATIC_OVL void mvault_tele(mtmp) struct monst *mtmp; { register struct mkroom *croom = search_special(VAULT); coord c; if (croom && somexy(croom, &c) && goodpos(c.x, c.y, mtmp, 0)) { rloc_to(mtmp, c.x, c.y); return; } (void) rloc(mtmp, FALSE); } boolean tele_restrict(mon) struct monst *mon; { if (level.flags.noteleport) { if (canseemon(mon)) pline("A mysterious force prevents %s from teleporting!", mon_nam(mon)); return TRUE; } return FALSE; } void mtele_trap(mtmp, trap, in_sight) struct monst *mtmp; struct trap *trap; int in_sight; { char *monname; if (tele_restrict(mtmp)) return; if (teleport_pet(mtmp, FALSE)) { /* save name with pre-movement visibility */ monname = Monnam(mtmp); /* Note: don't remove the trap if a vault. Other- * wise the monster will be stuck there, since * the guard isn't going to come for it... */ if (trap->once) mvault_tele(mtmp); else (void) rloc(mtmp, FALSE); if (in_sight) { if (canseemon(mtmp)) pline("%s seems disoriented.", monname); else pline("%s suddenly disappears!", monname); seetrap(trap); } } } /* return 0 if still on level, 3 if not */ int mlevel_tele_trap(mtmp, trap, force_it, in_sight) struct monst *mtmp; struct trap *trap; boolean force_it; int in_sight; { int tt = trap->ttyp; struct permonst *mptr = mtmp->data; if (mtmp == u.ustuck) /* probably a vortex */ return 0; /* temporary? kludge */ if (teleport_pet(mtmp, force_it)) { d_level tolevel; int migrate_typ = MIGR_RANDOM; if ((tt == HOLE || tt == TRAPDOOR)) { if (Is_stronghold(&u.uz)) { assign_level(&tolevel, &valley_level); } else if (Is_botlevel(&u.uz)) { if (in_sight && trap->tseen) pline("%s avoids the %s.", Monnam(mtmp), (tt == HOLE) ? "hole" : "trap"); return 0; } else { get_level(&tolevel, depth(&u.uz) + 1); } } else if (tt == MAGIC_PORTAL) { if (In_endgame(&u.uz) && (mon_has_amulet(mtmp) || is_home_elemental(mptr))) { if (in_sight && mptr->mlet != S_ELEMENTAL) { pline("%s seems to shimmer for a moment.", Monnam(mtmp)); seetrap(trap); } return 0; } #ifdef BLACKMARKET else if (mtmp->mtame && (Is_blackmarket(&trap->dst) || Is_blackmarket(&u.uz))) { if (in_sight) { pline("%s seems to shimmer for a moment.", Monnam(mtmp)); seetrap(trap); } return 0; } #endif /* BLACKMARKET */ else { assign_level(&tolevel, &trap->dst); migrate_typ = MIGR_PORTAL; } } else { /* (tt == LEVEL_TELEP) */ int nlev; if (mon_has_amulet(mtmp) || In_endgame(&u.uz)) { if (in_sight) pline("%s seems very disoriented for a moment.", Monnam(mtmp)); return 0; } nlev = random_teleport_level(); if (nlev == depth(&u.uz)) { if (in_sight) pline("%s shudders for a moment.", Monnam(mtmp)); return 0; } get_level(&tolevel, nlev); } if (in_sight) { pline("Suddenly, %s disappears out of sight.", mon_nam(mtmp)); seetrap(trap); } migrate_to_level(mtmp, ledger_no(&tolevel), migrate_typ, (coord *)0); return 3; /* no longer on this level */ } return 0; } void rloco(obj) register struct obj *obj; { register xchar tx, ty, otx, oty; boolean restricted_fall; int try_limit = 4000; if (obj->otyp == CORPSE && is_rider(&mons[obj->corpsenm])) { if (revive_corpse(obj, FALSE)) return; } obj_extract_self(obj); otx = obj->ox; oty = obj->oy; restricted_fall = (otx == 0 && dndest.lx); do { tx = rn1(COLNO-3,2); ty = rn2(ROWNO); if (!--try_limit) break; } while (!goodpos(tx, ty, (struct monst *)0, 0) || /* bug: this lacks provision for handling the Wizard's tower */ (restricted_fall && (!within_bounded_area(tx, ty, dndest.lx, dndest.ly, dndest.hx, dndest.hy) || (dndest.nlx && within_bounded_area(tx, ty, dndest.nlx, dndest.nly, dndest.nhx, dndest.nhy))))); if (flooreffects(obj, tx, ty, "fall")) { return; } else if (otx == 0 && oty == 0) { ; /* fell through a trap door; no update of old loc needed */ } else { if (costly_spot(otx, oty) && (!costly_spot(tx, ty) || !index(in_rooms(tx, ty, 0), *in_rooms(otx, oty, 0)))) { if (costly_spot(u.ux, u.uy) && index(u.urooms, *in_rooms(otx, oty, 0))) addtobill(obj, FALSE, FALSE, FALSE); else (void)stolen_value(obj, otx, oty, FALSE, FALSE, FALSE); } newsym(otx, oty); /* update old location */ } place_object(obj, tx, ty); newsym(tx, ty); } /* Returns an absolute depth */ int random_teleport_level() { int nlev, max_depth, min_depth, cur_depth = (int)depth(&u.uz); if (!rn2(5) || Is_knox(&u.uz) || #ifdef BLACKMARKET Is_blackmarket(&u.uz) || #endif Is_aligned_quest(&u.uz)) return cur_depth; /* What I really want to do is as follows: * -- If in a dungeon that goes down, the new level is to be restricted * to [top of parent, bottom of current dungeon] * -- If in a dungeon that goes up, the new level is to be restricted * to [top of current dungeon, bottom of parent] * -- If in a quest dungeon or similar dungeon entered by portals, * the new level is to be restricted to [top of current dungeon, * bottom of current dungeon] * The current behavior is not as sophisticated as that ideal, but is * still better what we used to do, which was like this for players * but different for monsters for no obvious reason. Currently, we * must explicitly check for special dungeons. We check for Knox * above; endgame is handled in the caller due to its different * message ("disoriented"). * --KAA * [ALI] Also check for Sam's blackmarket and the three aligned quests * above. * 3.4.2: explicitly handle quest here too, to fix the problem of * monsters sometimes level teleporting out of it into main dungeon. * Also prevent monsters reaching the Sanctum prior to invocation. */ min_depth = In_quest(&u.uz) ? dungeons[u.uz.dnum].depth_start : 1; max_depth = dunlevs_in_dungeon(&u.uz) + (dungeons[u.uz.dnum].depth_start - 1); /* can't reach the Sanctum if the invocation hasn't been performed */ if (Inhell && !u.uevent.invoked) max_depth -= 1; /* Get a random value relative to the current dungeon */ /* Range is 1 to current+3, current not counting */ nlev = rn2(cur_depth + 3 - min_depth) + min_depth; if (nlev >= cur_depth) nlev++; if (nlev > max_depth) { nlev = max_depth; /* teleport up if already on bottom */ if (Is_botlevel(&u.uz)) nlev -= rnd(3); } if (nlev < min_depth) { nlev = min_depth; if (nlev == cur_depth) { nlev += rnd(3); if (nlev > max_depth) nlev = max_depth; } } return nlev; } /* you teleport a monster (via wand, spell, or poly'd q.mechanic attack); return false iff the attempt fails */ boolean u_teleport_mon(mtmp, give_feedback) struct monst *mtmp; boolean give_feedback; { coord cc; if (mtmp->ispriest && *in_rooms(mtmp->mx, mtmp->my, TEMPLE)) { 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, 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 { #ifdef WIZARD if (wizard && Teleport_control) { /* * [ALI] This code will only allow monsters to be * teleported to positions acceptable to rloc_pos_ok(). * We could use goodpos() which would allow more * locations but, in my view, is less informative. */ xchar omx, omy; pline("To what position do you want %s to be teleported?", mon_nam(mtmp)); cc.x = omx = mtmp->mx; cc.y = omy = mtmp->my; if (getpos(&cc, TRUE, "the desired position") < 0) rloc(mtmp, FALSE); /* abort */ else if (rloc_pos_ok(cc.x, cc.y, mtmp)) { rloc_to(mtmp, cc.x, cc.y); /* As rloc() ... */ if (mtmp->isshk && !inhishop(mtmp)) make_angry_shk(mtmp, omx, omy); } else { pline("Sorry..."); rloc(mtmp, FALSE); } } else #endif /* WIZARD */ rloc(mtmp, FALSE); } return TRUE; } /*teleport.c*/ slashem-0.0.7E7F3/src/sp_lev.c0000664000076400007640000021162410545462317014105 0ustar aliali/* 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. */ /* * This file contains the various functions that are related to the special * levels. * It contains also the special level loader. * */ #include "hack.h" #include "dlb.h" /* #define DEBUG */ /* uncomment to enable code debugging */ #ifdef DEBUG # ifdef WIZARD #define debugpline if (wizard) pline # else #define debugpline pline # endif #endif #include "sp_lev.h" #include "rect.h" extern void FDECL(mkmap, (lev_init *)); STATIC_DCL void FDECL(get_room_loc, (schar *, schar *, struct mkroom *)); STATIC_DCL void FDECL(get_free_room_loc, (schar *, schar *, struct mkroom *)); STATIC_DCL void FDECL(create_trap, (trap *, struct mkroom *)); STATIC_DCL int FDECL(noncoalignment, (ALIGNTYP_P)); STATIC_DCL void FDECL(create_monster, (monster *, struct mkroom *)); STATIC_DCL void FDECL(create_object, (object *, struct mkroom *)); STATIC_DCL void FDECL(create_engraving, (engraving *,struct mkroom *)); STATIC_DCL void FDECL(create_stairs, (stair *, struct mkroom *)); STATIC_DCL void FDECL(create_altar, (altar *, struct mkroom *)); STATIC_DCL void FDECL(create_gold, (gold *, struct mkroom *)); STATIC_DCL void FDECL(create_feature, (int,int,struct mkroom *,int)); STATIC_DCL boolean FDECL(search_door, (struct mkroom *, xchar *, xchar *, XCHAR_P, int)); STATIC_DCL void NDECL(fix_stair_rooms); STATIC_DCL void FDECL(create_corridor, (corridor *)); STATIC_DCL boolean FDECL(create_subroom, (struct mkroom *, XCHAR_P, XCHAR_P, XCHAR_P, XCHAR_P, XCHAR_P, XCHAR_P)); #define LEFT 1 #define H_LEFT 2 #define CENTER 3 #define H_RIGHT 4 #define RIGHT 5 #define TOP 1 #define BOTTOM 5 #define sq(x) ((x)*(x)) #define XLIM 4 #define YLIM 3 #define Fread (void)dlb_fread #define Fgetc (schar)dlb_fgetc #define New(type) (type *) alloc(sizeof(type)) #define NewTab(type, size) (type **) alloc(sizeof(type *) * (unsigned)size) #define Free(ptr) if(ptr) free((genericptr_t) (ptr)) static NEARDATA walk walklist[50]; extern int min_rx, max_rx, min_ry, max_ry; /* from mkmap.c */ static char Map[COLNO][ROWNO]; static char robjects[10], rloc_x[10][10], rloc_y[10][10], rmonst[10]; static aligntyp ralign[3] = { AM_CHAOTIC, AM_NEUTRAL, AM_LAWFUL }; static NEARDATA xchar xstart, ystart; static NEARDATA char xsize, ysize; static lev_region rarea[10]; STATIC_DCL void FDECL(set_wall_property, (XCHAR_P,XCHAR_P,XCHAR_P,XCHAR_P,int)); STATIC_DCL int NDECL(rnddoor); STATIC_DCL int NDECL(rndtrap); STATIC_DCL boolean FDECL(get_location, (schar *,schar *,int)); STATIC_DCL void FDECL(sp_lev_shuffle, (char *,char *,int)); STATIC_DCL void FDECL(light_region, (region *)); STATIC_DCL void FDECL(load_common_data, (dlb *,int)); STATIC_DCL void FDECL(load_one_monster, (dlb *,monster *)); STATIC_DCL void FDECL(load_one_object, (dlb *,object *)); STATIC_DCL void FDECL(load_one_engraving, (dlb *,engraving *)); STATIC_DCL boolean FDECL(load_rooms, (dlb *)); STATIC_DCL void FDECL(maze1xy, (coord *,int)); STATIC_DCL boolean FDECL(load_maze, (dlb *)); STATIC_DCL void FDECL(create_door, (room_door *, struct mkroom *)); STATIC_DCL void FDECL(free_rooms,(room **, int)); STATIC_DCL void FDECL(build_room, (room *, room*)); char *lev_message = 0; lev_region *lregions = 0; int num_lregions = 0; lev_init init_lev; /* * Make walls of the area (x1, y1, x2, y2) non diggable/non passwall-able */ STATIC_OVL void set_wall_property(x1,y1,x2,y2, prop) xchar x1, y1, x2, y2; int prop; { register xchar x, y; for(y = y1; y <= y2; y++) for(x = x1; x <= x2; x++) if(IS_STWALL(levl[x][y].typ)) levl[x][y].wall_info |= prop; } /* * Choose randomly the state (nodoor, open, closed or locked) for a door */ STATIC_OVL int rnddoor() { int i = 1 << rn2(5); i >>= 1; return i; } /* * Select a random trap */ STATIC_OVL int rndtrap() { int rtrap; do { rtrap = rnd(TRAPNUM-1); switch (rtrap) { case HOLE: /* no random holes on special levels */ case MAGIC_PORTAL: rtrap = NO_TRAP; break; case TRAPDOOR: if (!Can_dig_down(&u.uz)) rtrap = NO_TRAP; break; case LEVEL_TELEP: case TELEP_TRAP: if (level.flags.noteleport) rtrap = NO_TRAP; break; case ROLLING_BOULDER_TRAP: case ROCKTRAP: if (In_endgame(&u.uz)) rtrap = NO_TRAP; break; } } while (rtrap == NO_TRAP); return rtrap; } /* * Coordinates in special level files are handled specially: * * if x or y is -11, we generate a random coordinate. * if x or y is between -1 and -10, we read one from the corresponding * register (x0, x1, ... x9). * if x or y is nonnegative, we convert it from relative to the local map * to global coordinates. * The "humidity" flag is used to insure that engravings aren't * created underwater, or eels on dry land. */ #define DRY 0x1 #define WET 0x2 #define MOLTEN 0x4 STATIC_DCL boolean FDECL(is_ok_location, (SCHAR_P, SCHAR_P, int)); STATIC_OVL boolean get_location(x, y, humidity) schar *x, *y; int humidity; { int cpt = 0; if (*x >= 0) { /* normal locations */ *x += xstart; *y += ystart; } else if (*x > -11) { /* special locations */ char ry = rloc_y[ - *x - 1][ - *y - 1]; char rx = rloc_x[ - *x - 1][ - *y - 1]; if (ry == (char)-1 || rx == (char)-1) return FALSE; /* nowhere */ else { *y = ystart + ry; *x = xstart + rx; } } else if (*x > -12) { /* within random region */ schar t = - *y - 1; do { *x = rn2(rarea[t].inarea.x2 - rarea[t].inarea.x1 + 1) + rarea[t].inarea.x1; *y = rn2(rarea[t].inarea.y2 - rarea[t].inarea.y1 + 1) + rarea[t].inarea.y1; if (!rarea[t].in_islev) { *x += xstart; *y += ystart; } if (is_ok_location(*x,*y,humidity)) { int x1 = rarea[t].delarea.x1; int x2 = rarea[t].delarea.x2; int y1 = rarea[t].delarea.y1; int y2 = rarea[t].delarea.y2; if (!rarea[t].del_islev) { x1 += xstart; x2 += xstart; y1 += ystart; y2 += ystart; } if (!within_bounded_area(*x,*y,x1,y1,x2,y2)) break; } } while (++cpt < 100); if (cpt >= 100) { register int xx, yy; for (xx = rarea[t].inarea.x1; xx < rarea[t].inarea.x2; xx++) for (yy = rarea[t].inarea.y1; yy < rarea[t].inarea.y2; yy++) { *x = xx; *y = yy; if (!rarea[t].in_islev) { *x += xstart; *y += ystart; } if (is_ok_location(*x,*y,humidity)) { int x1 = rarea[t].delarea.x1; int x2 = rarea[t].delarea.x2; int y1 = rarea[t].delarea.y1; int y2 = rarea[t].delarea.y2; if (!rarea[t].del_islev) { x1 += xstart; x2 += xstart; y1 += ystart; y2 += ystart; } if (!within_bounded_area(*x,*y,x1,y1,x2,y2)) goto found_it; } } panic("get_location: can't find a place!"); } } else { /* random location */ do { *x = xstart + rn2((int)xsize); *y = ystart + rn2((int)ysize); if (is_ok_location(*x,*y,humidity)) break; } while (++cpt < 100); if (cpt >= 100) { register int xx, yy; /* last try */ for (xx = 0; xx < xsize; xx++) for (yy = 0; yy < ysize; yy++) { *x = xstart + xx; *y = ystart + yy; if (is_ok_location(*x,*y,humidity)) goto found_it; } panic("get_location: can't find a place!"); } } found_it:; if (!isok(*x,*y)) { impossible("get_location: (%d,%d) out of bounds", *x, *y); *x = x_maze_max; *y = y_maze_max; } return TRUE; } STATIC_OVL boolean is_ok_location(x, y, humidity) register schar x, y; register int humidity; { register int typ; if (Is_waterlevel(&u.uz)) return TRUE; /* accept any spot */ if (humidity & DRY) { typ = levl[x][y].typ; if (typ == ROOM || typ == AIR || typ == CLOUD || typ == ICE || typ == CORR) return TRUE; } if (humidity & WET) { if (is_pool(x,y)) return TRUE; } if (humidity & MOLTEN) { if (is_lava(x,y)) return TRUE; } return FALSE; } /* * Shuffle the registers for locations, objects or monsters */ STATIC_OVL void sp_lev_shuffle(list1, list2, n) char list1[], list2[]; int n; { register int i, j; register char k; for (i = n - 1; i > 0; i--) { if ((j = rn2(i + 1)) == i) continue; k = list1[j]; list1[j] = list1[i]; list1[i] = k; if (list2) { k = list2[j]; list2[j] = list2[i]; list2[i] = k; } } } /* * Get a relative position inside a room. * negative values for x or y means RANDOM! */ STATIC_OVL void get_room_loc(x,y, croom) schar *x, *y; struct mkroom *croom; { coord c; if (*x <0 && *y <0) { if (somexy(croom, &c)) { *x = c.x; *y = c.y; } else panic("get_room_loc : can't find a place!"); } else { if (*x < 0) *x = rn2(croom->hx - croom->lx + 1); if (*y < 0) *y = rn2(croom->hy - croom->ly + 1); *x += croom->lx; *y += croom->ly; } } /* * Get a relative position inside a room. * negative values for x or y means RANDOM! */ STATIC_OVL void get_free_room_loc(x,y, croom) schar *x, *y; struct mkroom *croom; { schar try_x, try_y; register int trycnt = 0; do { try_x = *x, try_y = *y; get_room_loc(&try_x, &try_y, croom); } while (levl[try_x][try_y].typ != ROOM && ++trycnt <= 100); if (trycnt > 100) panic("get_free_room_loc: can't find a place!"); *x = try_x, *y = try_y; } boolean check_room(lowx, ddx, lowy, ddy, vault) xchar *lowx, *ddx, *lowy, *ddy; boolean vault; { register int x,y,hix = *lowx + *ddx, hiy = *lowy + *ddy; register struct rm *lev; int xlim, ylim, ymax; xlim = XLIM + (vault ? 1 : 0); ylim = YLIM + (vault ? 1 : 0); if (*lowx < 3) *lowx = 3; if (*lowy < 2) *lowy = 2; if (hix > COLNO-3) hix = COLNO-3; if (hiy > ROWNO-3) hiy = ROWNO-3; chk: if (hix <= *lowx || hiy <= *lowy) return FALSE; /* check area around room (and make room smaller if necessary) */ for (x = *lowx - xlim; x<= hix + xlim; x++) { if(x <= 0 || x >= COLNO) continue; y = *lowy - ylim; ymax = hiy + ylim; if(y < 0) y = 0; if(ymax >= ROWNO) ymax = (ROWNO-1); lev = &levl[x][y]; for (; y <= ymax; y++) { if (lev++->typ) { #ifdef DEBUG if(!vault) debugpline("strange area [%d,%d] in check_room.",x,y); #endif if (!rn2(3)) return FALSE; if (x < *lowx) *lowx = x + xlim + 1; else hix = x - xlim - 1; if (y < *lowy) *lowy = y + ylim + 1; else hiy = y - ylim - 1; goto chk; } } } *ddx = hix - *lowx; *ddy = hiy - *lowy; return TRUE; } /* * Create a new room. * This is still very incomplete... */ boolean create_room(x,y,w,h,xal,yal,rtype,rlit) xchar x,y; xchar w,h; xchar xal,yal; xchar rtype, rlit; { xchar xabs, yabs; int wtmp, htmp, xaltmp, yaltmp, xtmp, ytmp; NhRect *r1 = 0, r2; int trycnt = 0; boolean vault = FALSE; int xlim = XLIM, ylim = YLIM; if (rtype == -1) /* Is the type random ? */ rtype = OROOM; if (rtype == VAULT) { vault = TRUE; xlim++; ylim++; } /* on low levels the room is lit (usually) */ /* some other rooms may require lighting */ /* is light state random ? */ if (rlit == -1) rlit = (rnd(1+abs(depth(&u.uz))) < 11 && rn2(77)) ? TRUE : FALSE; /* * Here we will try to create a room. If some parameters are * random we are willing to make several try before we give * it up. */ do { xchar xborder, yborder; wtmp = w; htmp = h; xtmp = x; ytmp = y; xaltmp = xal; yaltmp = yal; /* First case : a totaly random room */ if((xtmp < 0 && ytmp <0 && wtmp < 0 && xaltmp < 0 && yaltmp < 0) || vault) { xchar hx, hy, lx, ly, dx, dy; r1 = rnd_rect(); /* Get a random rectangle */ if (!r1) { /* No more free rectangles ! */ #ifdef DEBUG debugpline("No more rects..."); #endif return FALSE; } hx = r1->hx; hy = r1->hy; lx = r1->lx; ly = r1->ly; if (vault) dx = dy = 1; else { dx = 2 + rn2((hx-lx > 28) ? 12 : 8); dy = 2 + rn2(4); if(dx*dy > 50) dy = 50/dx; } xborder = (lx > 0 && hx < COLNO -1) ? 2*xlim : xlim+1; yborder = (ly > 0 && hy < ROWNO -1) ? 2*ylim : ylim+1; if(hx-lx < dx + 3 + xborder || hy-ly < dy + 3 + yborder) { r1 = 0; continue; } xabs = lx + (lx > 0 ? xlim : 3) + rn2(hx - (lx>0?lx : 3) - dx - xborder + 1); yabs = ly + (ly > 0 ? ylim : 2) + rn2(hy - (ly>0?ly : 2) - dy - yborder + 1); if (ly == 0 && hy >= (ROWNO-1) && (!nroom || !rn2(nroom)) && (yabs+dy > ROWNO/2)) { yabs = rn1(3, 2); if(nroom < 4 && dy>1) dy--; } if (!check_room(&xabs, &dx, &yabs, &dy, vault)) { r1 = 0; continue; } wtmp = dx+1; htmp = dy+1; r2.lx = xabs-1; r2.ly = yabs-1; r2.hx = xabs + wtmp; r2.hy = yabs + htmp; } else { /* Only some parameters are random */ int rndpos = 0; if (xtmp < 0 && ytmp < 0) { /* Position is RANDOM */ xtmp = rnd(5); ytmp = rnd(5); rndpos = 1; } if (wtmp < 0 || htmp < 0) { /* Size is RANDOM */ wtmp = rn1(15, 3); htmp = rn1(8, 2); } if (xaltmp == -1) /* Horizontal alignment is RANDOM */ xaltmp = rnd(3); if (yaltmp == -1) /* Vertical alignment is RANDOM */ yaltmp = rnd(3); /* Try to generate real (absolute) coordinates here! */ xabs = (((xtmp-1) * COLNO) / 5) + 1; yabs = (((ytmp-1) * ROWNO) / 5) + 1; switch (xaltmp) { case LEFT: break; case RIGHT: xabs += (COLNO / 5) - wtmp; break; case CENTER: xabs += ((COLNO / 5) - wtmp) / 2; break; } switch (yaltmp) { case TOP: break; case BOTTOM: yabs += (ROWNO / 5) - htmp; break; case CENTER: yabs += ((ROWNO / 5) - htmp) / 2; break; } if (xabs + wtmp - 1 > COLNO - 2) xabs = COLNO - wtmp - 3; if (xabs < 2) xabs = 2; if (yabs + htmp - 1> ROWNO - 2) yabs = ROWNO - htmp - 3; if (yabs < 2) yabs = 2; /* Try to find a rectangle that fit our room ! */ r2.lx = xabs-1; r2.ly = yabs-1; r2.hx = xabs + wtmp + rndpos; r2.hy = yabs + htmp + rndpos; r1 = get_rect(&r2); } } while (++trycnt <= 100 && !r1); if (!r1) { /* creation of room failed ? */ return FALSE; } split_rects(r1, &r2); if (!vault) { smeq[nroom] = nroom; add_room(xabs, yabs, xabs+wtmp-1, yabs+htmp-1, rlit, rtype, FALSE); } else { rooms[nroom].lx = xabs; rooms[nroom].ly = yabs; } return TRUE; } /* * Create a subroom in room proom at pos x,y with width w & height h. * x & y are relative to the parent room. */ STATIC_OVL boolean create_subroom(proom, x, y, w, h, rtype, rlit) struct mkroom *proom; xchar x,y; xchar w,h; xchar rtype, rlit; { xchar width, height; width = proom->hx - proom->lx + 1; height = proom->hy - proom->ly + 1; /* There is a minimum size for the parent room */ if (width < 4 || height < 4) return FALSE; /* Check for random position, size, etc... */ if (w == -1) w = rnd(width - 3); if (h == -1) h = rnd(height - 3); if (x == -1) x = rnd(width - w - 1) - 1; if (y == -1) y = rnd(height - h - 1) - 1; if (x == 1) x = 0; if (y == 1) y = 0; if ((x + w + 1) == width) x++; if ((y + h + 1) == height) y++; if (rtype == -1) rtype = OROOM; if (rlit == -1) rlit = (rnd(1+abs(depth(&u.uz))) < 11 && rn2(77)) ? TRUE : FALSE; add_subroom(proom, proom->lx + x, proom->ly + y, proom->lx + x + w - 1, proom->ly + y + h - 1, rlit, rtype, FALSE); return TRUE; } /* * Create a new door in a room. * It's placed on a wall (north, south, east or west). */ STATIC_OVL void create_door(dd, broom) room_door *dd; struct mkroom *broom; { int x, y; int trycnt = 0; int i; if (dd->secret == -1) dd->secret = rn2(2); if (dd->mask == -1) { /* is it a locked door, closed, or a doorway? */ if (!dd->secret) { if(!rn2(3)) { if(!rn2(5)) dd->mask = D_ISOPEN; else if(!rn2(6)) dd->mask = D_LOCKED; else dd->mask = D_CLOSED; if (dd->mask != D_ISOPEN && !rn2(25)) dd->mask |= D_TRAPPED; } else dd->mask = D_NODOOR; } else { if(!rn2(5)) dd->mask = D_LOCKED; else dd->mask = D_CLOSED; if(!rn2(20)) dd->mask |= D_TRAPPED; } } do { register int dwall, dpos; dwall = dd->wall; if (dwall == -1) /* The wall is RANDOM */ dwall = 1 << rn2(4); dpos = dd->pos; if (dpos == -1) /* The position is RANDOM */ dpos = rn2((dwall == W_WEST || dwall == W_EAST) ? (broom->hy - broom->ly) : (broom->hx - broom->lx)); /* Convert wall and pos into an absolute coordinate! */ switch (dwall) { case W_NORTH: y = broom->ly - 1; x = broom->lx + dpos; break; case W_SOUTH: y = broom->hy + 1; x = broom->lx + dpos; break; case W_WEST: x = broom->lx - 1; y = broom->ly + dpos; break; case W_EAST: x = broom->hx + 1; y = broom->ly + dpos; break; default: x = y = 0; panic("create_door: No wall for door!"); break; } if (okdoor(x,y)) break; } while (++trycnt <= 100); if (trycnt > 100) { impossible("create_door: Can't find a proper place!"); return; } i = add_door(x,y,broom); doors[i].arti_key = dd->arti_key; levl[x][y].typ = (dd->secret ? SDOOR : DOOR); levl[x][y].doormask = dd->mask; } /* * Create a secret door in croom on any one of the specified walls. */ void create_secret_door(croom, walls) struct mkroom *croom; xchar walls; /* any of W_NORTH | W_SOUTH | W_EAST | W_WEST (or W_ANY) */ { xchar sx, sy; /* location of the secret door */ int count; for(count = 0; count < 100; count++) { sx = rn1(croom->hx - croom->lx + 1, croom->lx); sy = rn1(croom->hy - croom->ly + 1, croom->ly); switch(rn2(4)) { case 0: /* top */ if(!(walls & W_NORTH)) continue; sy = croom->ly-1; break; case 1: /* bottom */ if(!(walls & W_SOUTH)) continue; sy = croom->hy+1; break; case 2: /* left */ if(!(walls & W_EAST)) continue; sx = croom->lx-1; break; case 3: /* right */ if(!(walls & W_WEST)) continue; sx = croom->hx+1; break; } if(okdoor(sx,sy)) { levl[sx][sy].typ = SDOOR; levl[sx][sy].doormask = D_CLOSED; add_door(sx,sy,croom); return; } } impossible("couldn't create secret door on any walls 0x%x", walls); } /* * Create a trap in a room. */ STATIC_OVL void create_trap(t,croom) trap *t; struct mkroom *croom; { schar x,y; coord tm; if (rn2(100) < t->chance) { x = t->x; y = t->y; if (croom) get_free_room_loc(&x, &y, croom); else if (!get_location(&x, &y, DRY)) return; tm.x = x; tm.y = y; mktrap(t->type, 1, (struct mkroom*) 0, &tm); } } /* * Create a monster in a room. */ STATIC_OVL int noncoalignment(alignment) aligntyp alignment; { int k; k = rn2(2); if (!alignment) return(k ? -1 : 1); return(k ? -alignment : 0); } STATIC_OVL void create_monster(m,croom) monster *m; struct mkroom *croom; { struct monst *mtmp; schar x, y; char class; aligntyp amask; coord cc; struct permonst *pm; unsigned g_mvflags; if (rn2(100) < m->chance) { if (m->class >= 0) class = (char) def_char_to_monclass((char)m->class); else if (m->class > -11) class = (char) def_char_to_monclass(rmonst[- m->class - 1]); else class = 0; if (class == MAXMCLASSES) panic("create_monster: unknown monster class '%c'", m->class); amask = (m->align == AM_SPLEV_CO) ? Align2amask(u.ualignbase[A_ORIGINAL]) : (m->align == AM_SPLEV_NONCO) ? Align2amask(noncoalignment(u.ualignbase[A_ORIGINAL])) : (m->align <= -11) ? induced_align(80) : (m->align < 0 ? ralign[-m->align-1] : m->align); if (!class) pm = (struct permonst *) 0; else if (m->id != NON_PM) { #if 0 /* OBSOLETE */ if (flags.female && Role_if(PM_ELF) /*&& !u.uelf_drow*/ && m->id == PM_EARENDIL) m->id = PM_ELWING; #endif /* in the Gnome Mines, make the gnomes & dwarves into orcs, ogres, & zombies (because gnomes & dwarves are friendly... the mines would be hella easy otherwise) */ if (In_mines(&u.uz) && ( #ifdef DWARF Race_if(PM_DWARF) || #endif Race_if(PM_GNOME))) { switch (m->id) { case PM_GNOME: m->id = PM_GNOME_ZOMBIE; break; case PM_GNOMISH_WIZARD: m->id = PM_ORC_SHAMAN; break; case PM_GNOME_LORD: m->id = PM_GNOME_MUMMY; break; case PM_GNOME_KING: m->id = PM_OGRE; break; #ifdef DWARF case PM_DWARF: m->id = PM_DWARF_ZOMBIE; break; case PM_DWARF_LORD: m->id = PM_DWARF_MUMMY; break; case PM_DWARF_KING: m->id = PM_WAR_ORC; break; #endif } } pm = &mons[m->id]; g_mvflags = (unsigned) mvitals[monsndx(pm)].mvflags; if ((pm->geno & G_UNIQ) && (g_mvflags & G_EXTINCT)) goto m_done; else if (g_mvflags & G_GONE) /* genocided or extinct */ pm = (struct permonst *) 0; /* make random monster */ } else { pm = mkclass(class,G_NOGEN|MKC_ULIMIT); /* if we can't get a specific monster type (pm == 0) then all the monsters of acceptable difficulty in the given class have been genocided, so settle for a random monster */ } x = m->x; y = m->y; if (croom) get_room_loc(&x, &y, croom); else { boolean found; if (!pm || !is_swimmer(pm) && !likes_lava(pm)) found = get_location(&x, &y, DRY); else if (pm->mlet == S_EEL) found = get_location(&x, &y, WET); else if (likes_lava(pm)) found = get_location(&x, &y, DRY|MOLTEN); else found = get_location(&x, &y, DRY|WET); if (!found) goto m_done; /* nowhere */ } /* try to find a close place if someone else is already there */ if (MON_AT(x,y) && enexto(&cc, x, y, pm)) x = cc.x, y = cc.y; if(m->align != -12) mtmp = mk_roamer(pm, Amask2align(amask), x, y, m->peaceful); else if(PM_ARCHEOLOGIST <= m->id && m->id <= PM_WIZARD) mtmp = mk_mplayer(pm, x, y, FALSE); else mtmp = makemon(pm, x, y, NO_MM_FLAGS); if (mtmp) { /* handle specific attributes for some special monsters */ if (m->name.str) mtmp = christen_monst(mtmp, m->name.str); /* * This is currently hardwired for mimics only. It should * eventually be expanded. */ if (m->appear_as.str && mtmp->data->mlet == S_MIMIC) { int i; switch (m->appear) { case M_AP_NOTHING: impossible( "create_monster: mon has an appearance, \"%s\", but no type", m->appear_as.str); break; case M_AP_FURNITURE: for (i = 0; i < MAXPCHARS; i++) if (!strcmp(defsyms[i].explanation, m->appear_as.str)) break; if (i == MAXPCHARS) { impossible( "create_monster: can't find feature \"%s\"", m->appear_as.str); } else { mtmp->m_ap_type = M_AP_FURNITURE; mtmp->mappearance = i; } break; 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( "create_monster: can't find object \"%s\"", m->appear_as.str); } else { mtmp->m_ap_type = M_AP_OBJECT; mtmp->mappearance = i; } break; case M_AP_MONSTER: /* note: mimics don't appear as monsters! */ /* (but chameleons can :-) */ default: impossible( "create_monster: unimplemented mon appear type [%d,\"%s\"]", m->appear, m->appear_as.str); break; } if (does_block(x, y, &levl[x][y])) block_point(x, y); } if (m->peaceful >= 0) { mtmp->mpeaceful = m->peaceful; /* changed mpeaceful again; have to reset malign */ set_malign(mtmp); } if (m->asleep >= 0) { #ifdef UNIXPC /* optimizer bug strikes again */ if (m->asleep) mtmp->msleeping = 1; else mtmp->msleeping = 0; #else mtmp->msleeping = m->asleep; #endif } } } /* if (rn2(100) < m->chance) */ m_done: Free(m->name.str); Free(m->appear_as.str); } /* * Create an object in a room. */ STATIC_OVL void create_object(o,croom) object *o; struct mkroom *croom; { 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) get_room_loc(&x, &y, croom); else if (!get_location(&x, &y, DRY)) /* nowhere */ goto o_done; if (o->class >= 0) c = o->class; else if (o->class > -11) c = robjects[ -(o->class+1)]; else 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 * class characters. We must convert them to the internal format. */ char oclass = (char) def_char_to_objclass(c); if (oclass == MAXOCLASSES) panic("create_object: unexpected object class '%c'",c); /* KMH -- Create piles of gold properly */ /* Bruce Cox/WAC - some clean ups */ if (oclass == COIN_CLASS && !o->containment) { mkgold(0L, x, y); otmp = g_at(x,y); } else otmp = mkobj_at(oclass, x, y, !named); } if (o->spe != -127) /* That means NOT RANDOM! */ otmp->spe = (schar)o->spe; switch (o->curse_state) { case 1: bless(otmp); break; /* BLESSED */ case 2: unbless(otmp); uncurse(otmp); break; /* uncursed */ case 3: curse(otmp); break; /* CURSED */ default: break; /* Otherwise it's random and we're happy * with what mkobj gave us! */ } /* corpsenm is "empty" if -1, random if -2, otherwise specific */ if (o->corpsenm != NON_PM) { if (o->corpsenm == NON_PM - 1) otmp->corpsenm = rndmonnum(); else otmp->corpsenm = o->corpsenm; otmp->owt = weight(otmp); } if (otmp->otyp == EGG && In_spiders(&u.uz)) { otmp->corpsenm = PM_GIANT_SPIDER; otmp->age = monstermoves; } /* assume we wouldn't be given an egg corpsenm unless it was hatchable */ if (otmp->otyp == EGG && otmp->corpsenm != NON_PM) { if (dead_species(otmp->otyp, TRUE)) kill_egg(otmp); /* make sure nothing hatches */ else 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; /* contents */ case 1: if (!container) { impossible("create_object: no container"); break; } remove_object(otmp); (void) add_to_container(container, otmp); goto o_done; /* don't stack, but do other cleanup */ /* container */ case 2: delete_contents(otmp); container = otmp; break; /* nothing */ case 0: break; default: impossible("containment type %d?", (int) o->containment); } /* Medusa level special case: statues are petrified monsters, so they * are not stone-resistant and have monster inventory. They also lack * other contents, but that can be specified as an empty container. */ if (o->id == STATUE && Is_medusa_level(&u.uz) && o->corpsenm == NON_PM) { struct monst *was; struct obj *obj; int wastyp; /* Named random statues are of player types, and aren't stone- * resistant (if they were, we'd have to reset the name as well as * setting corpsenm). */ for (wastyp = otmp->corpsenm; ; wastyp = rndmonnum()) { /* makemon without rndmonst() might create a group */ was = makemon(&mons[wastyp], 0, 0, NO_MM_FLAGS); if (!resists_ston(was)) break; mongone(was); } otmp->corpsenm = wastyp; while(was->minvent) { obj = was->minvent; obj->owornmask = 0; obj_extract_self(obj); (void) add_to_container(otmp, obj); } otmp->owt = weight(otmp); mongone(was); } stackobj(otmp); if (o->oflags & OBJF_LIT) begin_burn(otmp, FALSE); if (o->oflags & OBJF_BURIED) otmp = bury_an_obj(otmp); } /* if (rn2(100) < o->chance) */ o_done: Free(o->name.str); } /* * Randomly place a specific engraving, then release its memory. */ STATIC_OVL void create_engraving(e, croom) engraving *e; struct mkroom *croom; { xchar x, y; boolean found = TRUE; x = e->x, y = e->y; if (croom) get_room_loc(&x, &y, croom); else found = get_location(&x, &y, DRY); if (found) make_engr_at(x, y, e->engr.str, 0L, e->etype); free((genericptr_t) e->engr.str); } /* * Create stairs in a room. * */ STATIC_OVL void create_stairs(s,croom) stair *s; struct mkroom *croom; { schar x,y; x = s->x; y = s->y; get_free_room_loc(&x, &y, croom); mkstairs(x,y,(char)s->up, croom); } /* * Create an altar in a room. */ STATIC_OVL void create_altar(a, croom) altar *a; struct mkroom *croom; { schar sproom,x,y; aligntyp amask; boolean croom_is_temple = TRUE; int oldtyp; x = a->x; y = a->y; if (croom) { get_free_room_loc(&x, &y, croom); if (croom->rtype != TEMPLE) croom_is_temple = FALSE; } else { if (!get_location(&x, &y, DRY)) return; /* nowhere */ if ((sproom = (schar) *in_rooms(x, y, TEMPLE)) != 0) croom = &rooms[sproom - ROOMOFFSET]; else croom_is_temple = FALSE; } /* check for existing features */ oldtyp = levl[x][y].typ; if (oldtyp == STAIRS || oldtyp == LADDER) return; a->x = x; a->y = y; /* Is the alignment random ? * If so, it's an 80% chance that the altar will be co-aligned. * * The alignment is encoded as amask values instead of alignment * values to avoid conflicting with the rest of the encoding, * shared by many other parts of the special level code. */ amask = (a->align == AM_SPLEV_CO) ? Align2amask(u.ualignbase[A_ORIGINAL]) : (a->align == AM_SPLEV_NONCO) ? Align2amask(noncoalignment(u.ualignbase[A_ORIGINAL])) : (a->align == -11) ? induced_align(80) : (a->align < 0 ? ralign[-a->align-1] : a->align); 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--; else if (oldtyp == SINK) level.flags.nsinks--; if (!croom_is_temple || !a->shrine) return; if (a->shrine) { /* Is it a shrine or sanctum? */ priestini(&u.uz, croom, x, y, (a->shrine > 1)); levl[x][y].altarmask |= AM_SHRINE; level.flags.has_temple = TRUE; } } /* * Create a gold pile in a room. */ STATIC_OVL void create_gold(g,croom) gold *g; struct mkroom *croom; { schar x,y; x = g->x; y= g->y; if (croom) get_room_loc(&x, &y, croom); else if (!get_location(&x, &y, DRY)) return; /* nowhere */ if (g->amount == -1) g->amount = rnd(200); (void) mkgold((long) g->amount, x, y); } /* * Create a feature (e.g a fountain) in a room. */ STATIC_OVL void create_feature(fx, fy, croom, typ) int fx, fy; struct mkroom *croom; int typ; { schar x,y; int trycnt = 0; x = fx; y = fy; if (croom) { if (x < 0 && y < 0) do { x = -1; y = -1; get_room_loc(&x, &y, croom); } while (++trycnt <= 200 && occupied(x,y)); else get_room_loc(&x, &y, croom); if(trycnt > 200) return; } else { if (!get_location(&x, &y, DRY)) return; /* nowhere */ } /* Don't cover up an existing feature (particularly randomly placed stairs). However, if the _same_ feature is already here, it came from the map drawing and we still need to update the special counters. */ if (IS_FURNITURE(levl[x][y].typ) && levl[x][y].typ != typ) return; levl[x][y].typ = typ; if (typ == FOUNTAIN) level.flags.nfountains++; else if (typ == SINK) level.flags.nsinks++; /* else if (typ == TOILET) level.flags.nsinks++;*/ } /* * Search for a door in a room on a specified wall. */ STATIC_OVL boolean search_door(croom,x,y,wall,cnt) struct mkroom *croom; xchar *x, *y; xchar wall; int cnt; { int dx, dy; int xx,yy; switch(wall) { case W_NORTH: dy = 0; dx = 1; xx = croom->lx; yy = croom->hy + 1; break; case W_SOUTH: dy = 0; dx = 1; xx = croom->lx; yy = croom->ly - 1; break; case W_EAST: dy = 1; dx = 0; xx = croom->hx + 1; yy = croom->ly; break; case W_WEST: dy = 1; dx = 0; xx = croom->lx - 1; yy = croom->ly; break; default: dx = dy = xx = yy = 0; panic("search_door: Bad wall!"); break; } while (xx <= croom->hx+1 && yy <= croom->hy+1) { if (IS_DOOR(levl[xx][yy].typ) || levl[xx][yy].typ == SDOOR) { *x = xx; *y = yy; if (cnt-- <= 0) return TRUE; } xx += dx; yy += dy; } return FALSE; } /* * Dig a corridor between two points. */ boolean dig_corridor(org,dest,nxcor,ftyp,btyp) coord *org, *dest; boolean nxcor; schar ftyp, btyp; { register int dx=0, dy=0, dix, diy, cct; register struct rm *crm; register int tx, ty, xx, yy; xx = org->x; yy = org->y; tx = dest->x; ty = dest->y; if (xx <= 0 || yy <= 0 || tx <= 0 || ty <= 0 || xx > COLNO-1 || tx > COLNO-1 || yy > ROWNO-1 || ty > ROWNO-1) { #ifdef DEBUG debugpline("dig_corridor: bad coords : (%d,%d) (%d,%d).", xx,yy,tx,ty); #endif return FALSE; } if (tx > xx) dx = 1; else if (ty > yy) dy = 1; else if (tx < xx) dx = -1; else dy = -1; xx -= dx; yy -= dy; cct = 0; while(xx != tx || yy != ty) { /* loop: dig corridor at [xx,yy] and find new [xx,yy] */ if(cct++ > 500 || (nxcor && !rn2(35))) return FALSE; xx += dx; yy += dy; if(xx >= COLNO-1 || xx <= 0 || yy <= 0 || yy >= ROWNO-1) return FALSE; /* impossible */ crm = &levl[xx][yy]; if(crm->typ == btyp) { if(ftyp != CORR || rn2(100)) { crm->typ = ftyp; if(nxcor && !rn2(50)) (void) mksobj_at(BOULDER, xx, yy, TRUE, FALSE); } else { crm->typ = SCORR; } } else if(crm->typ != ftyp && crm->typ != SCORR) { /* strange ... */ return FALSE; } /* find next corridor position */ dix = abs(xx-tx); diy = abs(yy-ty); /* do we have to change direction ? */ if(dy && dix > diy) { register int ddx = (xx > tx) ? -1 : 1; crm = &levl[xx+ddx][yy]; if(crm->typ == btyp || crm->typ == ftyp || crm->typ == SCORR) { dx = ddx; dy = 0; continue; } } else if(dx && diy > dix) { register int ddy = (yy > ty) ? -1 : 1; crm = &levl[xx][yy+ddy]; if(crm->typ == btyp || crm->typ == ftyp || crm->typ == SCORR) { dy = ddy; dx = 0; continue; } } /* continue straight on? */ crm = &levl[xx+dx][yy+dy]; if(crm->typ == btyp || crm->typ == ftyp || crm->typ == SCORR) continue; /* no, what must we do now?? */ if(dx) { dx = 0; dy = (ty < yy) ? -1 : 1; } else { dy = 0; dx = (tx < xx) ? -1 : 1; } crm = &levl[xx+dx][yy+dy]; if(crm->typ == btyp || crm->typ == ftyp || crm->typ == SCORR) continue; dy = -dy; dx = -dx; } return TRUE; } /* * Disgusting hack: since special levels have their rooms filled before * sorting the rooms, we have to re-arrange the speed values upstairs_room * and dnstairs_room after the rooms have been sorted. On normal levels, * stairs don't get created until _after_ sorting takes place. */ STATIC_OVL void fix_stair_rooms() { int i; struct mkroom *croom; if(xdnstair && !((dnstairs_room->lx <= xdnstair && xdnstair <= dnstairs_room->hx) && (dnstairs_room->ly <= ydnstair && ydnstair <= dnstairs_room->hy))) { for(i=0; i < nroom; i++) { croom = &rooms[i]; if((croom->lx <= xdnstair && xdnstair <= croom->hx) && (croom->ly <= ydnstair && ydnstair <= croom->hy)) { dnstairs_room = croom; break; } } if(i == nroom) panic("Couldn't find dnstair room in fix_stair_rooms!"); } if(xupstair && !((upstairs_room->lx <= xupstair && xupstair <= upstairs_room->hx) && (upstairs_room->ly <= yupstair && yupstair <= upstairs_room->hy))) { for(i=0; i < nroom; i++) { croom = &rooms[i]; if((croom->lx <= xupstair && xupstair <= croom->hx) && (croom->ly <= yupstair && yupstair <= croom->hy)) { upstairs_room = croom; break; } } if(i == nroom) panic("Couldn't find upstair room in fix_stair_rooms!"); } } /* * Corridors always start from a door. But it can end anywhere... * Basically we search for door coordinates or for endpoints coordinates * (from a distance). */ STATIC_OVL void create_corridor(c) corridor *c; { coord org, dest; if (c->src.room == -1) { sort_rooms(); fix_stair_rooms(); makecorridors(); return; } if( !search_door(&rooms[c->src.room], &org.x, &org.y, c->src.wall, c->src.door)) return; if (c->dest.room != -1) { if(!search_door(&rooms[c->dest.room], &dest.x, &dest.y, c->dest.wall, c->dest.door)) return; switch(c->src.wall) { case W_NORTH: org.y--; break; case W_SOUTH: org.y++; break; case W_WEST: org.x--; break; case W_EAST: org.x++; break; } switch(c->dest.wall) { case W_NORTH: dest.y--; break; case W_SOUTH: dest.y++; break; case W_WEST: dest.x--; break; case W_EAST: dest.x++; break; } (void) dig_corridor(&org, &dest, FALSE, CORR, STONE); } } /* * Fill a room (shop, zoo, etc...) with appropriate stuff. */ void fill_room(croom, prefilled) struct mkroom *croom; boolean prefilled; { if (!croom || croom->rtype == OROOM) return; if (!prefilled) { int x,y; /* Shop ? */ if (croom->rtype >= SHOPBASE) { stock_room(croom->rtype - SHOPBASE, croom); level.flags.has_shop = TRUE; return; } switch (croom->rtype) { case VAULT: for (x=croom->lx;x<=croom->hx;x++) for (y=croom->ly;y<=croom->hy;y++) (void) mkgold((long)rn1(abs(depth(&u.uz))*100, 51), x, y); break; case COURT: case ZOO: case BEEHIVE: case LEMUREPIT: case MIGOHIVE: case FUNGUSFARM: case MORGUE: case BARRACKS: fill_zoo(croom); break; } } switch (croom->rtype) { case VAULT: level.flags.has_vault = TRUE; break; case ZOO: level.flags.has_zoo = TRUE; break; case COURT: level.flags.has_court = TRUE; break; case MORGUE: level.flags.has_morgue = TRUE; break; case BEEHIVE: level.flags.has_beehive = TRUE; break; case LEMUREPIT: level.flags.has_lemurepit = TRUE; break; case MIGOHIVE: level.flags.has_migohive = TRUE; break; case FUNGUSFARM: level.flags.has_fungusfarm = TRUE; break; case BARRACKS: level.flags.has_barracks = TRUE; break; case TEMPLE: level.flags.has_temple = TRUE; break; case SWAMP: level.flags.has_swamp = TRUE; break; } } STATIC_OVL void free_rooms(ro, n) room **ro; int n; { short j; room *r; while(n--) { r = ro[n]; Free(r->name); Free(r->parent); if ((j = r->ndoor) != 0) { while(j--) Free(r->doors[j]); Free(r->doors); } if ((j = r->nstair) != 0) { while(j--) Free(r->stairs[j]); Free(r->stairs); } if ((j = r->naltar) != 0) { while (j--) Free(r->altars[j]); Free(r->altars); } if ((j = r->nfountain) != 0) { while(j--) Free(r->fountains[j]); Free(r->fountains); } if ((j = r->nsink) != 0) { while(j--) Free(r->sinks[j]); Free(r->sinks); } if ((j = r->npool) != 0) { while(j--) Free(r->pools[j]); Free(r->pools); } if ((j = r->ntrap) != 0) { while (j--) Free(r->traps[j]); Free(r->traps); } if ((j = r->nmonster) != 0) { while (j--) Free(r->monsters[j]); Free(r->monsters); } if ((j = r->nobject) != 0) { while (j--) Free(r->objects[j]); Free(r->objects); } if ((j = r->ngold) != 0) { while(j--) Free(r->golds[j]); Free(r->golds); } if ((j = r->nengraving) != 0) { while (j--) Free(r->engravings[j]); Free(r->engravings); } Free(r); } Free(ro); } STATIC_OVL void build_room(r, pr) room *r, *pr; { boolean okroom; struct mkroom *aroom; short i; xchar rtype = (!r->chance || rn2(100) < r->chance) ? r->rtype : OROOM; if(pr) { aroom = &subrooms[nsubroom]; okroom = create_subroom(pr->mkr, r->x, r->y, r->w, r->h, rtype, r->rlit); } else { aroom = &rooms[nroom]; okroom = create_room(r->x, r->y, r->w, r->h, r->xalign, r->yalign, rtype, r->rlit); r->mkr = aroom; } if (okroom) { /* Create subrooms if necessary... */ for(i=0; i < r->nsubroom; i++) build_room(r->subrooms[i], r); /* And now we can fill the room! */ /* Priority to the stairs */ for(i=0; i nstair; i++) create_stairs(r->stairs[i], aroom); /* Then to the various elements (sinks, etc..) */ for(i = 0; insink; i++) create_feature(r->sinks[i]->x, r->sinks[i]->y, aroom, SINK); /* for(i = 0; intoilet; i++) create_feature(r->toilets[i]->x, r->toilets[i]->y, aroom, TOILET);*/ for(i = 0; inpool; i++) create_feature(r->pools[i]->x, r->pools[i]->y, aroom, POOL); for(i = 0; infountain; i++) create_feature(r->fountains[i]->x, r->fountains[i]->y, aroom, FOUNTAIN); for(i = 0; inaltar; i++) create_altar(r->altars[i], aroom); for(i = 0; indoor; i++) create_door(r->doors[i], aroom); /* The traps */ for(i = 0; intrap; i++) create_trap(r->traps[i], aroom); /* The monsters */ for(i = 0; inmonster; i++) create_monster(r->monsters[i], aroom); /* The objects */ for(i = 0; inobject; i++) create_object(r->objects[i], aroom); /* The gold piles */ for(i = 0; ingold; i++) create_gold(r->golds[i], aroom); /* The engravings */ for (i = 0; i < r->nengraving; i++) create_engraving(r->engravings[i], aroom); #ifdef SPECIALIZATION topologize(aroom,FALSE); /* set roomno */ #else topologize(aroom); /* set roomno */ #endif /* MRS - 07/04/91 - This is temporary but should result * in proper filling of shops, etc. * DLC - this can fail if corridors are added to this room * at a later point. Currently no good way to fix this. */ if(aroom->rtype != OROOM && r->filled) fill_room(aroom, FALSE); } } /* * set lighting in a region that will not become a room. */ STATIC_OVL void light_region(tmpregion) region *tmpregion; { register boolean litstate = tmpregion->rlit ? 1 : 0; register int hiy = tmpregion->y2; register int x, y; register struct rm *lev; int lowy = tmpregion->y1; int lowx = tmpregion->x1, hix = tmpregion->x2; if(litstate) { /* adjust region size for walls, but only if lighted */ lowx = max(lowx-1,1); hix = min(hix+1,COLNO-1); lowy = max(lowy-1,0); hiy = min(hiy+1, ROWNO-1); } for(x = lowx; x <= hix; x++) { lev = &levl[x][lowy]; for(y = lowy; y <= hiy; y++) { if (lev->typ != LAVAPOOL) /* this overrides normal lighting */ lev->lit = litstate; lev++; } } } /* initialization common to all special levels */ STATIC_OVL void load_common_data(fd, typ) dlb *fd; int typ; { uchar n; long lev_flags; int i; { aligntyp atmp; /* shuffle 3 alignments; can't use sp_lev_shuffle() on aligntyp's */ i = rn2(3); atmp=ralign[2]; ralign[2]=ralign[i]; ralign[i]=atmp; if (rn2(2)) { atmp=ralign[1]; ralign[1]=ralign[0]; ralign[0]=atmp; } } level.flags.is_maze_lev = typ == SP_LEV_MAZE; /* Read the level initialization data */ Fread((genericptr_t) &init_lev, 1, sizeof(lev_init), fd); if(init_lev.init_present) { if(init_lev.lit < 0) init_lev.lit = rn2(2); mkmap(&init_lev); } /* Read the per level flags */ Fread((genericptr_t) &lev_flags, 1, sizeof(lev_flags), fd); if (lev_flags & NOTELEPORT) level.flags.noteleport = 1; if (lev_flags & HARDFLOOR) level.flags.hardfloor = 1; if (lev_flags & NOMMAP) level.flags.nommap = 1; if (lev_flags & SHORTSIGHTED) level.flags.shortsighted = 1; if (lev_flags & ARBOREAL) level.flags.arboreal = 1; if (lev_flags & SPOOKY) level.flags.spooky = 1; if (lev_flags & LETHE) level.flags.lethe = 1; /* Read message */ Fread((genericptr_t) &n, 1, sizeof(n), fd); if (n) { lev_message = (char *) alloc(n + 1); Fread((genericptr_t) lev_message, 1, (int) n, fd); lev_message[n] = 0; } } STATIC_OVL void load_one_monster(fd, m) dlb *fd; monster *m; { int size; Fread((genericptr_t) m, 1, sizeof *m, fd); if ((size = m->name.len) != 0) { m->name.str = (char *) alloc((unsigned)size + 1); Fread((genericptr_t) m->name.str, 1, size, fd); m->name.str[size] = '\0'; } else m->name.str = (char *) 0; if ((size = m->appear_as.len) != 0) { m->appear_as.str = (char *) alloc((unsigned)size + 1); Fread((genericptr_t) m->appear_as.str, 1, size, fd); m->appear_as.str[size] = '\0'; } else m->appear_as.str = (char *) 0; } STATIC_OVL void load_one_object(fd, o) dlb *fd; object *o; { int size; Fread((genericptr_t) o, 1, sizeof *o, fd); if ((size = o->name.len) != 0) { o->name.str = (char *) alloc((unsigned)size + 1); Fread((genericptr_t) o->name.str, 1, size, fd); o->name.str[size] = '\0'; } else o->name.str = (char *) 0; } STATIC_OVL void load_one_engraving(fd, e) dlb *fd; engraving *e; { int size; Fread((genericptr_t) e, 1, sizeof *e, fd); size = e->engr.len; e->engr.str = (char *) alloc((unsigned)size+1); Fread((genericptr_t) e->engr.str, 1, size, fd); e->engr.str[size] = '\0'; } STATIC_OVL boolean load_rooms(fd) dlb *fd; { xchar nrooms, ncorr; char n; short size; corridor tmpcor; room** tmproom; int i, j; load_common_data(fd, SP_LEV_ROOMS); Fread((genericptr_t) &n, 1, sizeof(n), fd); /* nrobjects */ if (n) { Fread((genericptr_t)robjects, sizeof(*robjects), n, fd); sp_lev_shuffle(robjects, (char *)0, (int)n); } Fread((genericptr_t) &n, 1, sizeof(n), fd); /* nrmonst */ if (n) { Fread((genericptr_t)rmonst, sizeof(*rmonst), n, fd); sp_lev_shuffle(rmonst, (char *)0, (int)n); } Fread((genericptr_t) &nrooms, 1, sizeof(nrooms), fd); /* Number of rooms to read */ tmproom = NewTab(room,nrooms); for (i=0;i 0) { /* Yup, it does! */ r->name = (char *) alloc((unsigned)size + 1); Fread((genericptr_t) r->name, 1, size, fd); r->name[size] = 0; } else r->name = (char *) 0; /* Let's see if this room has a parent */ Fread((genericptr_t) &size, 1, sizeof(size), fd); if (size > 0) { /* Yup, it does! */ r->parent = (char *) alloc((unsigned)size + 1); Fread((genericptr_t) r->parent, 1, size, fd); r->parent[size] = 0; } else r->parent = (char *) 0; Fread((genericptr_t) &r->x, 1, sizeof(r->x), fd); /* x pos on the grid (1-5) */ Fread((genericptr_t) &r->y, 1, sizeof(r->y), fd); /* y pos on the grid (1-5) */ Fread((genericptr_t) &r->w, 1, sizeof(r->w), fd); /* width of the room */ Fread((genericptr_t) &r->h, 1, sizeof(r->h), fd); /* height of the room */ Fread((genericptr_t) &r->xalign, 1, sizeof(r->xalign), fd); /* horizontal alignment */ Fread((genericptr_t) &r->yalign, 1, sizeof(r->yalign), fd); /* vertical alignment */ Fread((genericptr_t) &r->rtype, 1, sizeof(r->rtype), fd); /* type of room (zoo, shop, etc.) */ Fread((genericptr_t) &r->chance, 1, sizeof(r->chance), fd); /* chance of room being special. */ Fread((genericptr_t) &r->rlit, 1, sizeof(r->rlit), fd); /* lit or not ? */ Fread((genericptr_t) &r->filled, 1, sizeof(r->filled), fd); /* to be filled? */ r->nsubroom= 0; /* read the doors */ Fread((genericptr_t) &r->ndoor, 1, sizeof(r->ndoor), fd); if ((n = r->ndoor) != 0) r->doors = NewTab(room_door, n); while(n--) { r->doors[(int)n] = New(room_door); Fread((genericptr_t) r->doors[(int)n], 1, sizeof(room_door), fd); } /* read the stairs */ Fread((genericptr_t) &r->nstair, 1, sizeof(r->nstair), fd); if ((n = r->nstair) != 0) r->stairs = NewTab(stair, n); while (n--) { r->stairs[(int)n] = New(stair); Fread((genericptr_t) r->stairs[(int)n], 1, sizeof(stair), fd); } /* read the altars */ Fread((genericptr_t) &r->naltar, 1, sizeof(r->naltar), fd); if ((n = r->naltar) != 0) r->altars = NewTab(altar, n); while (n--) { r->altars[(int)n] = New(altar); Fread((genericptr_t) r->altars[(int)n], 1, sizeof(altar), fd); } /* read the fountains */ Fread((genericptr_t) &r->nfountain, 1, sizeof(r->nfountain), fd); if ((n = r->nfountain) != 0) r->fountains = NewTab(fountain, n); while (n--) { r->fountains[(int)n] = New(fountain); Fread((genericptr_t) r->fountains[(int)n], 1, sizeof(fountain), fd); } /* read the sinks */ Fread((genericptr_t) &r->nsink, 1, sizeof(r->nsink), fd); if ((n = r->nsink) != 0) r->sinks = NewTab(sink, n); while (n--) { r->sinks[(int)n] = New(sink); Fread((genericptr_t) r->sinks[(int)n], 1, sizeof(sink), fd); } /* read the pools */ Fread((genericptr_t) &r->npool, 1, sizeof(r->npool), fd); if ((n = r->npool) != 0) r->pools = NewTab(pool,n); while (n--) { r->pools[(int)n] = New(pool); Fread((genericptr_t) r->pools[(int)n], 1, sizeof(pool), fd); } /* read the traps */ Fread((genericptr_t) &r->ntrap, 1, sizeof(r->ntrap), fd); if ((n = r->ntrap) != 0) r->traps = NewTab(trap, n); while(n--) { r->traps[(int)n] = New(trap); Fread((genericptr_t) r->traps[(int)n], 1, sizeof(trap), fd); } /* read the monsters */ Fread((genericptr_t) &r->nmonster, 1, sizeof(r->nmonster), fd); if ((n = r->nmonster) != 0) { r->monsters = NewTab(monster, n); while(n--) { r->monsters[(int)n] = New(monster); load_one_monster(fd, r->monsters[(int)n]); } } else r->monsters = 0; /* read the objects, in same order as mazes */ Fread((genericptr_t) &r->nobject, 1, sizeof(r->nobject), fd); if ((n = r->nobject) != 0) { r->objects = NewTab(object, n); for (j = 0; j < n; ++j) { r->objects[j] = New(object); load_one_object(fd, r->objects[j]); } } else r->objects = 0; /* read the gold piles */ Fread((genericptr_t) &r->ngold, 1, sizeof(r->ngold), fd); if ((n = r->ngold) != 0) r->golds = NewTab(gold, n); while (n--) { r->golds[(int)n] = New(gold); Fread((genericptr_t) r->golds[(int)n], 1, sizeof(gold), fd); } /* read the engravings */ Fread((genericptr_t) &r->nengraving, 1, sizeof(r->nengraving), fd); if ((n = r->nengraving) != 0) { r->engravings = NewTab(engraving,n); while (n--) { r->engravings[(int)n] = New(engraving); load_one_engraving(fd, r->engravings[(int)n]); } } else r->engravings = 0; } /* Now that we have loaded all the rooms, search the * subrooms and create the links. */ for (i = 0; iparent) { /* Search the parent room */ for(j=0; jname && !strcmp(tmproom[j]->name, tmproom[i]->parent)) { n = tmproom[j]->nsubroom++; tmproom[j]->subrooms[(int)n] = tmproom[i]; break; } } /* * Create the rooms now... */ for (i=0; i < nrooms; i++) if(!tmproom[i]->parent) build_room(tmproom[i], (room *) 0); free_rooms(tmproom, nrooms); /* read the corridors */ Fread((genericptr_t) &ncorr, sizeof(ncorr), 1, fd); for (i=0; ix = (xchar)x, m->y = (xchar)y; } /* * The Big Thing: special maze loader * * Could be cleaner, but it works. */ STATIC_OVL boolean load_maze(fd) dlb *fd; { xchar x, y, typ; boolean prefilled, room_not_needed; char n, numpart = 0; xchar nwalk = 0, nwalk_sav; schar filling; char halign, valign; int xi, dir, size; coord mm; int mapcount, mapcountmax, mapfact; lev_region tmplregion; region tmpregion; door tmpdoor; trap tmptrap; monster tmpmons; object tmpobj; drawbridge tmpdb; walk tmpwalk; digpos tmpdig; lad tmplad; stair tmpstair, prevstair; altar tmpaltar; gold tmpgold; fountain tmpfountain; engraving tmpengraving; xchar mustfill[(MAXNROFROOMS+1)*2]; struct trap *badtrap; boolean has_bounds; (void) memset((genericptr_t)&Map[0][0], 0, sizeof Map); load_common_data(fd, SP_LEV_MAZE); /* Initialize map */ Fread((genericptr_t) &filling, 1, sizeof(filling), fd); if (!init_lev.init_present) { /* don't init if mkmap() has been called */ for(x = 2; x <= x_maze_max; x++) for(y = 0; y <= y_maze_max; y++) if (filling == -1) { #ifndef WALLIFIED_MAZE levl[x][y].typ = STONE; #else levl[x][y].typ = (y < 2 || ((x % 2) && (y % 2))) ? STONE : HWALL; #endif } else { levl[x][y].typ = filling; } } /* Start reading the file */ Fread((genericptr_t) &numpart, 1, sizeof(numpart), fd); /* Number of parts */ if (!numpart || numpart > 9) panic("load_maze error: numpart = %d", (int) numpart); while (numpart--) { Fread((genericptr_t) &halign, 1, sizeof(halign), fd); /* Horizontal alignment */ Fread((genericptr_t) &valign, 1, sizeof(valign), fd); /* Vertical alignment */ Fread((genericptr_t) &xsize, 1, sizeof(xsize), fd); /* size in X */ Fread((genericptr_t) &ysize, 1, sizeof(ysize), fd); /* size in Y */ switch((int) halign) { case LEFT: xstart = 3; break; case H_LEFT: xstart = 2+((x_maze_max-2-xsize)/4); break; case CENTER: xstart = 2+((x_maze_max-2-xsize)/2); break; case H_RIGHT: xstart = 2+((x_maze_max-2-xsize)*3/4); break; case RIGHT: xstart = x_maze_max-xsize-1; break; } switch((int) valign) { case TOP: ystart = 3; break; case CENTER: ystart = 2+((y_maze_max-2-ysize)/2); break; case BOTTOM: ystart = y_maze_max-ysize-1; break; } if (!(xstart % 2)) xstart++; if (!(ystart % 2)) ystart++; if ((ystart < 0) || (ystart + ysize > ROWNO)) { /* try to move the start a bit */ ystart += (ystart > 0) ? -2 : 2; if(ysize == ROWNO) ystart = 0; if(ystart < 0 || ystart + ysize > ROWNO) panic("reading special level with ysize too large"); } /* * If any CROSSWALLs are found, must change to ROOM after REGION's * are laid out. CROSSWALLS are used to specify "invisible" * boundaries where DOOR syms look bad or aren't desirable. */ has_bounds = FALSE; if(init_lev.init_present && xsize <= 1 && ysize <= 1) { xstart = 1; ystart = 0; xsize = COLNO-1; ysize = ROWNO; } else { /* Load the map */ for(y = ystart; y < ystart+ysize; y++) for(x = xstart; x < xstart+xsize; x++) { levl[x][y].typ = Fgetc(fd); levl[x][y].lit = FALSE; /* clear out levl: load_common_data may set them */ levl[x][y].flags = 0; levl[x][y].horizontal = 0; levl[x][y].roomno = 0; levl[x][y].edge = 0; /* * Note: Even though levl[x][y].typ is type schar, * lev_comp.y saves it as type char. Since schar != char * all the time we must make this exception or hack * through lev_comp.y to fix. */ /* * Set secret doors to closed (why not trapped too?). Set * the horizontal bit. */ if (levl[x][y].typ == SDOOR || IS_DOOR(levl[x][y].typ)) { if(levl[x][y].typ == SDOOR) levl[x][y].doormask = D_CLOSED; /* * If there is a wall to the left that connects to a * (secret) door, then it is horizontal. This does * not allow (secret) doors to be corners of rooms. */ 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; else if(levl[x][y].typ == CROSSWALL) has_bounds = TRUE; Map[x][y] = 1; } if (init_lev.init_present && init_lev.joined) remove_rooms(xstart, ystart, xstart+xsize, ystart+ysize); } Fread((genericptr_t) &n, 1, sizeof(n), fd); /* Number of level regions */ if(n) { if(num_lregions) { /* realloc the lregion space to add the new ones */ /* don't really free it up until the whole level is done */ lev_region *newl = (lev_region *) alloc(sizeof(lev_region) * (unsigned)(n+num_lregions)); (void) memcpy((genericptr_t)(newl+n), (genericptr_t)lregions, sizeof(lev_region) * num_lregions); Free(lregions); num_lregions += n; lregions = newl; } else { num_lregions = n; lregions = (lev_region *) alloc(sizeof(lev_region) * (unsigned)n); } } while(n--) { boolean found = TRUE; Fread((genericptr_t) &tmplregion, sizeof(tmplregion), 1, fd); if ((size = tmplregion.rname.len) != 0) { tmplregion.rname.str = (char *) alloc((unsigned)size + 1); Fread((genericptr_t) tmplregion.rname.str, size, 1, fd); tmplregion.rname.str[size] = '\0'; } else tmplregion.rname.str = (char *) 0; if(!tmplregion.in_islev) { found &= get_location(&tmplregion.inarea.x1, &tmplregion.inarea.y1, DRY|WET); found &= get_location(&tmplregion.inarea.x2, &tmplregion.inarea.y2, DRY|WET); } if(!tmplregion.del_islev) { found &= get_location(&tmplregion.delarea.x1, &tmplregion.delarea.y1, DRY|WET); found &= get_location(&tmplregion.delarea.x2, &tmplregion.delarea.y2, DRY|WET); } if (!found) panic("reading special level with region located nowhere"); lregions[(int)n] = tmplregion; } /* random level region registers */ Fread((genericptr_t) &n, 1, sizeof(n), fd); if (n) { int tmpn = n; while(n--) { boolean found = TRUE; Fread((genericptr_t) &tmplregion, sizeof(tmplregion), 1, fd); if ((size = tmplregion.rname.len) != 0) { tmplregion.rname.str = (char *) alloc((unsigned)size + 1); Fread((genericptr_t) tmplregion.rname.str, size, 1, fd); tmplregion.rname.str[size] = '\0'; } else tmplregion.rname.str = (char *) 0; if (!found) panic("reading special level with random region located nowhere"); (void) memcpy((genericptr_t)&rarea[(int)tmpn - n - 1], (genericptr_t)&tmplregion, sizeof(lev_region)); } } Fread((genericptr_t) &n, 1, sizeof(n), fd); /* Random objects */ if(n) { Fread((genericptr_t)robjects, sizeof(*robjects), (int) n, fd); sp_lev_shuffle(robjects, (char *)0, (int)n); } Fread((genericptr_t) &n, 1, sizeof(n), fd); /* Random locations */ if(n) { char nloc[10]; Fread((genericptr_t)nloc, sizeof(*nloc), (int) n, fd); for(xi = 0; xi < n; xi++) { Fread((genericptr_t)rloc_x[xi], sizeof(*rloc_x[xi]), (int) nloc[xi], fd); Fread((genericptr_t)rloc_y[xi], sizeof(*rloc_y[xi]), (int) nloc[xi], fd); sp_lev_shuffle(rloc_x[xi], rloc_y[xi], (int)nloc[xi]); } } Fread((genericptr_t) &n, 1, sizeof(n), fd); /* Random monsters */ if(n) { Fread((genericptr_t)rmonst, sizeof(*rmonst), (int) n, fd); sp_lev_shuffle(rmonst, (char *)0, (int)n); } (void) memset((genericptr_t)mustfill, 0, sizeof(mustfill)); Fread((genericptr_t) &n, 1, sizeof(n), fd); /* Number of subrooms */ while(n--) { register struct mkroom *troom; Fread((genericptr_t)&tmpregion, 1, sizeof(tmpregion), fd); if(tmpregion.rtype > MAXRTYPE) { tmpregion.rtype -= MAXRTYPE+1; prefilled = TRUE; } else prefilled = FALSE; if(tmpregion.rlit < 0) tmpregion.rlit = (rnd(1+abs(depth(&u.uz))) < 11 && rn2(77)) ? TRUE : FALSE; if (!get_location(&tmpregion.x1, &tmpregion.y1, DRY|WET) || !get_location(&tmpregion.x2, &tmpregion.y2, DRY|WET)) panic("reading special level with region located nowhere"); /* for an ordinary room, `prefilled' is a flag to force an actual room to be created (such rooms are used to control placement of migrating monster arrivals) */ room_not_needed = (tmpregion.rtype == OROOM && !tmpregion.rirreg && !prefilled); if (room_not_needed || nroom >= MAXNROFROOMS) { if (!room_not_needed) impossible("Too many rooms on new level!"); light_region(&tmpregion); continue; } troom = &rooms[nroom]; /* mark rooms that must be filled, but do it later */ if (tmpregion.rtype != OROOM) mustfill[nroom] = (prefilled ? 2 : 1); if(tmpregion.rirreg) { min_rx = max_rx = tmpregion.x1; min_ry = max_ry = tmpregion.y1; flood_fill_rm(tmpregion.x1, tmpregion.y1, nroom+ROOMOFFSET, tmpregion.rlit, TRUE); add_room(min_rx, min_ry, max_rx, max_ry, FALSE, tmpregion.rtype, TRUE); troom->rlit = tmpregion.rlit; troom->irregular = TRUE; } else { add_room(tmpregion.x1, tmpregion.y1, tmpregion.x2, tmpregion.y2, tmpregion.rlit, tmpregion.rtype, TRUE); #ifdef SPECIALIZATION topologize(troom,FALSE); /* set roomno */ #else topologize(troom); /* set roomno */ #endif } } Fread((genericptr_t) &n, 1, sizeof(n), fd); /* Number of doors */ while(n--) { struct mkroom *croom = &rooms[0]; Fread((genericptr_t)&tmpdoor, 1, sizeof(tmpdoor), fd); x = tmpdoor.x; y = tmpdoor.y; typ = tmpdoor.mask == -1 ? rnddoor() : tmpdoor.mask; if (get_location(&x, &y, DRY)) { if(levl[x][y].typ != SDOOR) levl[x][y].typ = DOOR; else { if(typ < D_CLOSED) typ = D_CLOSED; /* force it to be closed */ } levl[x][y].doormask = typ; /* Fix random door alignment */ if (y > 0 && (IS_WALL(levl[x][y-1].typ) || levl[x][y-1].horizontal)) levl[x][y].horizontal = 0; } /* Now the complicated part, list it with each subroom */ /* The dog move and mail daemon routines use this */ xi = -1; while(croom->hx >= 0 && doorindex < DOORMAX) { if(croom->hx >= x-1 && croom->lx <= x+1 && croom->hy >= y-1 && croom->ly <= y+1) { /* Found it */ xi = add_door(x, y, croom); doors[xi].arti_key = tmpdoor.arti_key; } croom++; } if (xi < 0) { /* Not in any room */ if (doorindex >= DOORMAX) impossible("Too many doors?"); else { xi = add_door(x, y, (struct mkroom *)0); doors[xi].arti_key = tmpdoor.arti_key; } } } /* now that we have rooms _and_ associated doors, fill the rooms */ for(n = 0; n < SIZE(mustfill); n++) if(mustfill[(int)n]) fill_room(&rooms[(int)n], (mustfill[(int)n] == 2)); /* if special boundary syms (CROSSWALL) in map, remove them now */ if(has_bounds) { for(x = xstart; x < xstart+xsize; x++) for(y = ystart; y < ystart+ysize; y++) if(levl[x][y].typ == CROSSWALL) levl[x][y].typ = ROOM; } Fread((genericptr_t) &n, 1, sizeof(n), fd); /* Number of drawbridges */ while(n--) { Fread((genericptr_t)&tmpdb, 1, sizeof(tmpdb), fd); x = tmpdb.x; y = tmpdb.y; if (get_location(&x, &y, DRY|WET)) { if (!create_drawbridge(x, y, tmpdb.dir, tmpdb.db_open)) impossible("Cannot create drawbridge."); } } Fread((genericptr_t) &n, 1, sizeof(n), fd); /* Number of mazewalks */ while(n--) { Fread((genericptr_t)&tmpwalk, 1, sizeof(tmpwalk), fd); if (get_location(&tmpwalk.x, &tmpwalk.y, DRY|WET)) walklist[nwalk++] = tmpwalk; } Fread((genericptr_t) &n, 1, sizeof(n), fd); /* Number of non_diggables */ while(n--) { Fread((genericptr_t)&tmpdig, 1, sizeof(tmpdig), fd); get_location(&tmpdig.x1, &tmpdig.y1, DRY|WET); get_location(&tmpdig.x2, &tmpdig.y2, DRY|WET); set_wall_property(tmpdig.x1, tmpdig.y1, tmpdig.x2, tmpdig.y2, W_NONDIGGABLE); } Fread((genericptr_t) &n, 1, sizeof(n), fd); /* Number of non_passables */ while(n--) { Fread((genericptr_t)&tmpdig, 1, sizeof(tmpdig), fd); get_location(&tmpdig.x1, &tmpdig.y1, DRY|WET); get_location(&tmpdig.x2, &tmpdig.y2, DRY|WET); set_wall_property(tmpdig.x1, tmpdig.y1, tmpdig.x2, tmpdig.y2, W_NONPASSWALL); } Fread((genericptr_t) &n, 1, sizeof(n), fd); /* Number of ladders */ while(n--) { Fread((genericptr_t)&tmplad, 1, sizeof(tmplad), fd); x = tmplad.x; y = tmplad.y; if (get_location(&x, &y, DRY)) { levl[x][y].typ = LADDER; if (tmplad.up == 1) { xupladder = x; yupladder = y; levl[x][y].ladder = LA_UP; } else { xdnladder = x; ydnladder = y; levl[x][y].ladder = LA_DOWN; } } } prevstair.x = prevstair.y = 0; Fread((genericptr_t) &n, 1, sizeof(n), fd); /* Number of stairs */ while(n--) { boolean found; Fread((genericptr_t)&tmpstair, 1, sizeof(tmpstair), fd); xi = 0; do { x = tmpstair.x; y = tmpstair.y; found = get_location(&x, &y, DRY); } while(found && prevstair.x && xi++ < 100 && distmin(x,y,prevstair.x,prevstair.y) <= 8); if (!found) continue; if ((badtrap = t_at(x,y)) != 0) deltrap(badtrap); mkstairs(x, y, (char)tmpstair.up, (struct mkroom *)0); prevstair.x = x; prevstair.y = y; } Fread((genericptr_t) &n, 1, sizeof(n), fd); /* Number of altars */ while(n--) { Fread((genericptr_t)&tmpaltar, 1, sizeof(tmpaltar), fd); create_altar(&tmpaltar, (struct mkroom *)0); } Fread((genericptr_t) &n, 1, sizeof(n), fd); /* Number of fountains */ while (n--) { Fread((genericptr_t)&tmpfountain, 1, sizeof(tmpfountain), fd); create_feature(tmpfountain.x, tmpfountain.y, (struct mkroom *)0, FOUNTAIN); } Fread((genericptr_t) &n, 1, sizeof(n), fd); /* Number of traps */ while(n--) { Fread((genericptr_t)&tmptrap, 1, sizeof(tmptrap), fd); create_trap(&tmptrap, (struct mkroom *)0); } Fread((genericptr_t) &n, 1, sizeof(n), fd); /* Number of monsters */ while(n--) { load_one_monster(fd, &tmpmons); create_monster(&tmpmons, (struct mkroom *)0); } Fread((genericptr_t) &n, 1, sizeof(n), fd); /* Number of objects */ while(n--) { load_one_object(fd, &tmpobj); create_object(&tmpobj, (struct mkroom *)0); } Fread((genericptr_t) &n, 1, sizeof(n), fd); /* Number of gold piles */ while (n--) { Fread((genericptr_t)&tmpgold, 1, sizeof(tmpgold), fd); create_gold(&tmpgold, (struct mkroom *)0); } Fread((genericptr_t) &n, 1, sizeof(n), fd); /* Number of engravings */ while(n--) { load_one_engraving(fd, &tmpengraving); create_engraving(&tmpengraving, (struct mkroom *)0); } } /* numpart loop */ nwalk_sav = nwalk; while(nwalk--) { x = (xchar) walklist[nwalk].x; y = (xchar) walklist[nwalk].y; dir = walklist[nwalk].dir; /* don't use move() - it doesn't use W_NORTH, etc. */ switch (dir) { case W_NORTH: --y; break; case W_SOUTH: y++; break; case W_EAST: x++; break; case W_WEST: --x; break; default: panic("load_maze: bad MAZEWALK direction"); } if(!IS_DOOR(levl[x][y].typ)) { #ifndef WALLIFIED_MAZE levl[x][y].typ = CORR; #else levl[x][y].typ = ROOM; #endif levl[x][y].flags = 0; } /* * We must be sure that the parity of the coordinates for * walkfrom() is odd. But we must also take into account * what direction was chosen. */ if(!(x % 2)) { if (dir == W_EAST) x++; else x--; /* no need for IS_DOOR check; out of map bounds */ #ifndef WALLIFIED_MAZE levl[x][y].typ = CORR; #else levl[x][y].typ = ROOM; #endif levl[x][y].flags = 0; } if (!(y % 2)) { if (dir == W_SOUTH) y++; else y--; } walkfrom(x, y); } wallification(1, 0, COLNO-1, ROWNO-1, FALSE); /* * If there's a significant portion of maze unused by the special level, * we don't want it empty. * * Makes the number of traps, monsters, etc. proportional * to the size of the maze. */ mapcountmax = mapcount = (x_maze_max - 2) * (y_maze_max - 2); for(x = 2; x < x_maze_max; x++) for(y = 0; y < y_maze_max; y++) if(Map[x][y]) mapcount--; if (nwalk_sav && (mapcount > (int) (mapcountmax / 10))) { mapfact = (int) ((mapcount * 100L) / mapcountmax); for(x = rnd((int) (20 * mapfact) / 100); x; x--) { maze1xy(&mm, DRY); (void) mkobj_at(rn2(2) ? GEM_CLASS : RANDOM_CLASS, mm.x, mm.y, TRUE); } 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); (void) makemon(&mons[PM_MINOTAUR], mm.x, mm.y, NO_MM_FLAGS); } for(x = rnd((int) (12 * mapfact) / 100); x; x--) { maze1xy(&mm, WET|DRY); (void) makemon((struct permonst *) 0, mm.x, mm.y, NO_MM_FLAGS); } for(x = rn2((int) (15 * mapfact) / 100); x; x--) { maze1xy(&mm, DRY); (void) mkgold(0L,mm.x,mm.y); } for(x = rn2((int) (15 * mapfact) / 100); x; x--) { int trytrap; maze1xy(&mm, DRY); trytrap = rndtrap(); if (sobj_at(BOULDER, mm.x, mm.y)) while (trytrap == PIT || trytrap == SPIKED_PIT || trytrap == TRAPDOOR || trytrap == HOLE) trytrap = rndtrap(); (void) maketrap(mm.x, mm.y, trytrap); } } return TRUE; } /* * General loader */ boolean load_special(name) const char *name; { dlb *fd; boolean result = FALSE; char c; struct version_info vers_info; fd = dlb_fopen_area(FILE_AREA_UNSHARE, name, RDBMODE); if (!fd) return FALSE; Fread((genericptr_t) &vers_info, sizeof vers_info, 1, fd); if (!check_version(&vers_info, name, TRUE)) goto give_up; Fread((genericptr_t) &c, sizeof c, 1, fd); /* c Header */ switch (c) { case SP_LEV_ROOMS: result = load_rooms(fd); break; case SP_LEV_MAZE: result = load_maze(fd); break; default: /* ??? */ result = FALSE; } give_up: (void)dlb_fclose(fd); return result; } /*sp_lev.c*/ slashem-0.0.7E7F3/src/uhitm.c0000664000076400007640000030377110545462317013750 0ustar aliali/* SCCS Id: @(#)uhitm.c 3.4 2003/02/18 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" STATIC_DCL boolean FDECL(known_hitum, (struct monst *,int,int *,struct attack *)); STATIC_DCL void FDECL(steal_it, (struct monst *, struct attack *)); #if 0 STATIC_DCL boolean FDECL(hitum, (struct monst *,int,int,struct attack *)); #endif STATIC_DCL boolean FDECL(hmon_hitmon, (struct monst *,struct obj *,int)); #ifdef STEED STATIC_DCL int FDECL(joust, (struct monst *,struct obj *)); #endif STATIC_DCL void NDECL(demonpet); STATIC_DCL boolean FDECL(m_slips_free, (struct monst *mtmp,struct attack *mattk)); STATIC_DCL int FDECL(explum, (struct monst *,struct attack *)); STATIC_DCL void FDECL(start_engulf, (struct monst *)); STATIC_DCL void NDECL(end_engulf); STATIC_DCL int FDECL(gulpum, (struct monst *,struct attack *)); STATIC_DCL boolean FDECL(hmonas, (struct monst *,int)); STATIC_DCL void FDECL(nohandglow, (struct monst *)); STATIC_DCL boolean FDECL(shade_aware, (struct obj *)); static int NDECL(martial_dmg); extern boolean notonhead; /* for long worms */ /* The below might become a parameter instead if we use it a lot */ static int dieroll; static int rolls[2][2]; #define dice(x) rolls[0][x] #define tohit(x) rolls[1][x] #define UWEP_ROLL 0 #define USWAPWEP_ROLL 1 /* Used to flag attacks caused by Stormbringer's maliciousness. */ static boolean override_confirmation = 0; /* Used to control whether Drow's sleep attack should succeed. */ static boolean barehanded_hit = 0; /* WAC for mhit, two weapon attacking */ #define HIT_UWEP 1 #define HIT_USWAPWEP 2 #define HIT_BODY 4 /* Hit with other body part */ #define HIT_OTHER 8 /* Hit without touching */ #define HIT_FATAL 16 #define PROJECTILE(obj) ((obj) && is_ammo(obj)) /* modified from hurtarmor() in mhitu.c */ /* This is not static because it is also used for monsters rusting monsters */ void hurtmarmor(mdef, attk) struct monst *mdef; int attk; { int hurt; struct obj *target; 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 * finds a target for the rust monster. * Head, feet, etc... not covered by metal, or covered by * rusty metal, are not targets. However, your body always * is, no matter what covers it. */ while (1) { switch(rn2(5)) { case 0: target = which_armor(mdef, W_ARMH); if (!target || !rust_dmg(target, xname(target), hurt, FALSE, mdef)) continue; break; case 1: target = which_armor(mdef, W_ARMC); if (target) { (void)rust_dmg(target, xname(target), hurt, TRUE, mdef); break; } if ((target = which_armor(mdef, W_ARM)) != (struct obj *)0) { (void)rust_dmg(target, xname(target), hurt, TRUE, mdef); #ifdef TOURIST } else if ((target = which_armor(mdef, W_ARMU)) != (struct obj *)0) { (void)rust_dmg(target, xname(target), hurt, TRUE, mdef); #endif } break; case 2: target = which_armor(mdef, W_ARMS); if (!target || !rust_dmg(target, xname(target), hurt, FALSE, mdef)) continue; break; case 3: target = which_armor(mdef, W_ARMG); if (!target || !rust_dmg(target, xname(target), hurt, FALSE, mdef)) continue; break; case 4: target = which_armor(mdef, W_ARMF); if (!target || !rust_dmg(target, xname(target), hurt, FALSE, mdef)) continue; break; } break; /* Out of while loop */ } } /* * Now returns a bit mask of attacks that may proceed. Note that barehanded * returns HIT_UWEP. -ALI */ int attack_checks(mtmp, barehanded) register struct monst *mtmp; boolean barehanded; { int retval; char qbuf[QBUFSZ]; if (barehanded || !u.twoweap || !uswapwep) retval = HIT_UWEP; else retval = HIT_UWEP | HIT_USWAPWEP; /* if you're close enough to attack, alert any waiting monster */ mtmp->mstrategy &= ~STRAT_WAITMASK; if (u.uswallow && mtmp == u.ustuck) return retval; if (flags.forcefight) { /* Do this in the caller, after we checked that the monster * didn't die from the blow. Reason: putting the 'I' there * causes the hero to forget the square's contents since * both 'I' and remembered contents are stored in .glyph. * If the monster dies immediately from the blow, the 'I' will * not stay there, so the player will have suddenly forgotten * the square's contents for no apparent reason. if (!canspotmon(mtmp) && !memory_is_invisible(u.ux+u.dx, u.uy+u.dy)) map_invisible(u.ux+u.dx, u.uy+u.dy); */ return retval; } /* 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)) && !memory_is_invisible(u.ux+u.dx, u.uy+u.dy) && !(!Blind && mtmp->mundetected && hides_under(mtmp->data))) { pline("Wait! There's %s there you can't see!", something); map_invisible(u.ux+u.dx, u.uy+u.dy); /* if it was an invisible mimic, treat it as if we stumbled * onto a visible mimic */ if(mtmp->m_ap_type && !Protection_from_shape_changers) { if(!u.ustuck && !mtmp->mflee && dmgtype(mtmp->data,AD_STCK)) setustuck(mtmp); } wakeup(mtmp); /* always necessary; also un-mimics mimics */ return 0; } 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. */ if (memory_is_invisible(mtmp->mx, mtmp->my)) { seemimic(mtmp); return retval; } stumble_onto_mimic(mtmp); return 0; } 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); if (memory_is_invisible(mtmp->mx, mtmp->my)) { seemimic(mtmp); return retval; } if (!(Blind ? Blind_telepat : Unblind_telepat)) { struct obj *obj; if (Blind || (is_pool(mtmp->mx,mtmp->my) && !Underwater)) pline("Wait! There's a hidden monster there!"); else if ((obj = level.objects[mtmp->mx][mtmp->my]) != 0) pline("Wait! There's %s hiding under %s!", an(l_monnam(mtmp)), doname(obj)); return 0; } } /* * 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 */ if (!barehanded && uwep && uwep->oartifact == ART_STORMBRINGER) { override_confirmation = HIT_UWEP; return retval; } if (canspotmon(mtmp)) { Sprintf(qbuf, "Really attack %s?", mon_nam(mtmp)); if (yn(qbuf) != 'y') { /* Stormbringer is not tricked so easily */ if (!barehanded && u.twoweap && uswapwep && uswapwep->oartifact == ART_STORMBRINGER) { override_confirmation = HIT_USWAPWEP; /* Lose primary attack */ return HIT_USWAPWEP; } flags.move = 0; return 0; } } } return retval; } /* * It is unchivalrous for a knight to attack the defenseless or from behind. */ void check_caitiff(mtmp) struct monst *mtmp; { 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); } } schar find_roll_to_hit(mtmp) register struct monst *mtmp; { schar tmp; int tmp2; tmp = 1 + Luck + abon() + find_mac(mtmp) + u.uhitinc + maybe_polyd(youmonst.data->mlevel, u.ulevel); check_caitiff(mtmp); /* attacking peaceful creatures is bad for the samurai's giri */ if (Role_if(PM_SAMURAI) && mtmp->mpeaceful && u.ualign.record > -10) { You("dishonorably attack the innocent!"); adjalign(-1); } /* Adjust vs. (and possibly modify) monster state. */ if(mtmp->mstun) tmp += 2; if(mtmp->mflee) tmp += 2; if (mtmp->msleeping) { mtmp->msleeping = 0; tmp += 2; } if(!mtmp->mcanmove) { tmp += 4; if(!rn2(10)) { mtmp->mcanmove = 1; mtmp->mfrozen = 0; } } if (is_orc(mtmp->data) && maybe_polyd(is_elf(youmonst.data), Race_if(PM_ELF))) tmp++; #if 0 if(Role_if(PM_MONK) && !Upolyd) { if (uarm) { Your("armor is rather cumbersome..."); tmp -= urole.spelarmr; } else if (!uwep && !uarms) { tmp += (u.ulevel / 3) + 2; } } #endif if(Role_if(PM_MONK) && !Upolyd) { if(!uwep && (!u.twoweap || !uswapwep) && !uarms && (!uarm || (uarm && uarm->otyp >= ROBE && uarm->otyp <= ROBE_OF_WEAKNESS))) tmp += (u.ulevel / 3) + 2; else if (!uwep && (!u.twoweap || !uswapwep)) { pline("Your armor is rather cumbersome..."); tmp += (u.ulevel / 9) + 1; } } /* special class effect uses... */ if (tech_inuse(T_KIII)) tmp += 4; if (tech_inuse(T_BERSERK)) tmp += 2; /* with a lot of luggage, your agility diminishes */ if ((tmp2 = near_capacity()) != 0) tmp -= (tmp2*2) - 1; if (u.utrap) tmp -= 3; /* Some monsters have a combination of weapon attacks and non-weapon * attacks. It is therefore wrong to add hitval to tmp; we must add * it only for the specific attack (in hmonas()). */ /* WAC This is now taken care of later in player's case - for twoweapon */ /* if (uwep && !Upolyd) { tmp += hitval(uwep, mtmp); tmp += weapon_hit_bonus(uwep); } */ return tmp; } /* try to attack; return FALSE if monster evaded */ /* u.dx and u.dy must be set */ boolean attack(mtmp) register struct monst *mtmp; { schar tmp; register struct permonst *mdat = mtmp->data; int mhit; /* This section of code provides protection against accidentally * hitting peaceful (like '@') and tame (like 'd') monsters. * Protection is provided as long as player is not: blind, confused, * hallucinating or stunned. * changes by wwp 5/16/85 * More changes 12/90, -dkh-. if its tame and safepet, (and protected * 07/92) then we assume that you're not trying to attack. Instead, * you'll usually just swap places if this is a movement command */ /* Intelligent chaotic weapons (Stormbringer) want blood */ if (is_safepet(mtmp) && !flags.forcefight) { if ((!uwep || uwep->oartifact != ART_STORMBRINGER) && (!u.twoweap || !uswapwep || uswapwep->oartifact != ART_STORMBRINGER)){ /* there are some additional considerations: this won't work * if in a shop or Punished or you miss a random roll or * if you can walk thru walls and your pet cannot (KAA) or * if your pet is a long worm (unless someone does better). * 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); return(TRUE); } else if ((mtmp->mfrozen || (! mtmp->mcanmove) || (mtmp->data->mmove == 0)) && rn2(6)) { pline("%s doesn't seem to move!", Monnam(mtmp)); return(TRUE); } else return(FALSE); } } /* possibly set in attack_checks; examined in known_hitum, called via hitum or hmonas below */ override_confirmation = 0; mhit = attack_checks(mtmp, !uwep); if (!mhit) return(TRUE); if (Upolyd) { /* certain "pacifist" monsters don't attack */ if(noattacks(youmonst.data)) { You("have no way to attack monsters physically."); mtmp->mstrategy &= ~STRAT_WAITMASK; goto atk_done; } } if(check_capacity("You cannot fight while so heavily loaded.")) goto atk_done; if (u.twoweap && !can_twoweapon()) untwoweapon(); if(unweapon) { unweapon = FALSE; if(flags.verbose) { if(uwep) You("begin bashing monsters with your %s.", aobjnam(uwep, (char *)0)); else if (tech_inuse(T_EVISCERATE)) You("begin slashing monsters with your claws."); else if (!cantwield(youmonst.data)) { if (P_SKILL(P_MARTIAL_ARTS) >= P_EXPERT) You("assume a martial arts stance."); else You("begin %sing monsters with your %s %s.", Role_if(PM_MONK) ? "strik" : "bash", uarmg ? "gloved" : "bare", /* Del Lamb */ makeplural(body_part(HAND))); } } } exercise(A_STR, TRUE); /* you're exercising muscles */ /* andrew@orca: prevent unlimited pick-axe attacks */ u_wipe_engr(3); /* Is the "it died" check actually correct? */ if(mdat->mlet == S_LEPRECHAUN && !mtmp->mfrozen && !mtmp->msleeping && !mtmp->mconf && mtmp->mcansee && !rn2(7) && (m_move(mtmp, 0) == 2 || /* it died */ mtmp->mx != u.ux+u.dx || mtmp->my != u.uy+u.dy)) /* it moved */ return(FALSE); tmp = find_roll_to_hit(mtmp); (void) hmonas(mtmp, tmp); /* hmonas handles all attacks now */ /* berserk lycanthropes calm down after the enemy is dead */ if (mtmp->mhp <= 0) repeat_hit = 0; /* if (Upolyd) (void) hmonas(mtmp, tmp); else (void) hitum(mtmp, tmp, mhit, youmonst.data->mattk); */ mtmp->mstrategy &= ~STRAT_WAITMASK; atk_done: /* see comment in attack_checks() */ /* we only need to check for this if we did an attack_checks() * and it returned 0 (it's okay to attack), and the monster didn't * evade. */ if (flags.forcefight && mtmp->mhp > 0 && !canspotmon(mtmp) && !memory_is_invisible(u.ux+u.dx, u.uy+u.dy) && !(u.uswallow && mtmp == u.ustuck)) map_invisible(u.ux+u.dx, u.uy+u.dy); return(TRUE); } STATIC_OVL boolean known_hitum(mon, mattack, mhit, uattk) /* returns TRUE if monster still lives */ register struct monst *mon; int mattack; /* Which weapons you attacked with -ALI */ register int *mhit; struct attack *uattk; { register boolean malive = TRUE; if (override_confirmation) { /* this may need to be generalized if weapons other than Stormbringer acquire similar anti-social behavior... */ if (flags.verbose) if (override_confirmation == HIT_UWEP) Your("bloodthirsty blade attacks!"); else pline("The black blade will not be thwarted!"); } if(!*mhit) { if (mattack & HIT_UWEP) missum(mon, tohit(UWEP_ROLL), dice(UWEP_ROLL), uattk); if (mattack & HIT_USWAPWEP) missum(mon, tohit(USWAPWEP_ROLL), dice(USWAPWEP_ROLL), uattk); } else { int oldhp = mon->mhp, x = u.ux + u.dx, y = u.uy + u.dy; /* we hit the monster; be careful: it might die or be knocked into a different location */ notonhead = (mon->mx != x || mon->my != y); if (*mhit & HIT_UWEP) { /* KMH, conduct */ if (uwep && (uwep->oclass == WEAPON_CLASS || is_weptool(uwep))) u.uconduct.weaphit++; dieroll = dice(UWEP_ROLL); malive = hmon(mon, uwep, 0); } else if (mattack & HIT_UWEP) missum(mon, tohit(UWEP_ROLL), dice(UWEP_ROLL), uattk); if ((mattack & HIT_USWAPWEP) && malive && m_at(x, y) == mon) { /* KMH, ethics */ if (*mhit & HIT_USWAPWEP) { if (uswapwep) u.uconduct.weaphit++; dieroll = dice(USWAPWEP_ROLL); malive = hmon(mon, uswapwep, 0); } else missum(mon, tohit(USWAPWEP_ROLL), dice(USWAPWEP_ROLL), uattk); } 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)) setustuck(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) { int dohit = *mhit; if (!u.twoweap || (dohit & HIT_UWEP)) { if (cutworm(mon, x, y, uwep)) dohit = 0; /* Don't try and cut a worm twice */ } if (u.twoweap && (dohit & HIT_USWAPWEP)) (void) cutworm(mon, x, y, uswapwep); } } /* Lycanthropes sometimes go a little berserk! * If special is on, they will multihit and stun! */ if ((Race_if(PM_HUMAN_WEREWOLF) && (mon->mhp > 0)) || tech_inuse(T_EVISCERATE)) { if (tech_inuse(T_EVISCERATE)) { /*make slashing message elsewhere*/ if (repeat_hit == 0) { /* [max] limit to 4 (0-3) */ repeat_hit = (tech_inuse(T_EVISCERATE) > 5) ? 4 : (tech_inuse(T_EVISCERATE) - 2); /* [max] limit to 4 */ mon->mfrozen = (tech_inuse(T_EVISCERATE) > 5) ? 4 : (tech_inuse(T_EVISCERATE) - 2); } mon->mstun = 1; mon->mcanmove = 0; } else if (!rn2(24)) { repeat_hit += rn2(4)+1; /* Length of growl depends on how angry you get */ switch (repeat_hit) { case 0: /* This shouldn't be possible, but... */ case 1: pline("Grrrrr!"); break; case 2: pline("Rarrrgh!"); break; case 3: pline("Grrarrgh!"); break; case 4: pline("Rarggrrgh!"); break; case 5: pline("Raaarrrrrr!"); break; case 6: default:pline("Grrrrrrarrrrg!"); break; } } } } return(malive); } #if 0 /* Obsolete */ STATIC_OVL boolean hitum(mon, tmp, mhit, uattk) /* returns TRUE if monster still lives */ struct monst *mon; int tmp; int mhit; struct attack *uattk; { boolean malive; int mattack = mhit; int tmp1 = tmp, tmp2 = tmp; if (mhit & HIT_UWEP) { if (uwep) tmp1 += hitval(uwep, mon); tohit(UWEP_ROLL) = tmp1; if (tmp1 <= (dice(UWEP_ROLL) = rnd(20)) && !u.uswallow) mhit &= ~HIT_UWEP; if (tmp1 > dice(UWEP_ROLL)) exercise(A_DEX, TRUE); #ifdef DEBUG pline("(%i/20)", tmp1); #endif } if (mhit & HIT_USWAPWEP && u.twoweap) { if (uswapwep) tmp2 += hitval(uswapwep, mon) - 2; tohit(USWAPWEP_ROLL) = tmp2; if (tmp2 <= (dice(USWAPWEP_ROLL) = rnd(20)) && !u.uswallow) mhit &= ~HIT_USWAPWEP; if (tmp2 > dice(USWAPWEP_ROLL)) exercise(A_DEX, TRUE); #ifdef DEBUG pline("((%i/20))", tmp2); #endif } malive = known_hitum(mon, mattack, &mhit, uattk); (void) passive(mon, mhit, malive, AT_WEAP); /* berserk lycanthropes calm down after the enemy is dead */ if (!malive) repeat_hit = 0; return(malive); } #endif /* WAC Seperate martial arts damage function */ int martial_dmg() { int damage; /* WAC plateau at 16 if Monk and Grand Master (6d4) 13 if Grand Master 11 if Master 9 if Expert 7 if Skilled 5 if Basic (1d4) */ if ((Role_if(PM_MONK) && !Upolyd) && (P_SKILL(P_MARTIAL_ARTS) == P_GRAND_MASTER) && (u.ulevel > 16)) damage = d(6,2); else if (u.ulevel > (2*(P_SKILL(P_MARTIAL_ARTS) - P_BASIC) + 5)) damage = d((int) (P_SKILL(P_MARTIAL_ARTS) - P_UNSKILLED),2); else damage = d((int) ((u.ulevel+2)/3),2); if((!uarm || (uarm && (uarm->otyp >= ROBE && uarm->otyp <= ROBE_OF_WEAKNESS))) && (!uarms)) damage *= 2; else damage += 2; return (damage); } boolean /* general "damage monster" routine */ hmon(mon, obj, thrown) /* return TRUE if mon still alive */ struct monst *mon; struct obj *obj; int thrown; /* 0: not thrown, 1: launched with uwep, 2: launched with uswapwep, 3: thrown by some other means */ { boolean result, anger_guards; anger_guards = (mon->mpeaceful && (mon->ispriest || mon->isshk || mon->data == &mons[PM_WATCHMAN] || mon->data == &mons[PM_WATCH_CAPTAIN])); result = hmon_hitmon(mon, obj, thrown); if (mon->ispriest && !rn2(2)) ghod_hitsu(mon); if (anger_guards) (void)angry_guards(!flags.soundok); return result; } /* guts of hmon() */ STATIC_OVL boolean hmon_hitmon(mon, obj, thrown) struct monst *mon; struct obj *obj; int thrown; { int tmp, canhitmon = 0, objenchant; struct permonst *mdat = mon->data; int barehand_silver_rings = 0; /* The basic reason we need all these booleans is that we don't want * a "hit" message when a monster dies, so we have to know how much * damage it did _before_ outputting a hit message, but any messages * associated with the damage don't come out until _after_ outputting * a hit message. */ boolean hittxt = FALSE, destroyed = FALSE, already_killed = FALSE; boolean get_dmg_bonus = TRUE; boolean ispoisoned = FALSE, needpoismsg = FALSE, poiskilled = FALSE; boolean silvermsg = FALSE, silverobj = FALSE; boolean valid_weapon_attack = FALSE; boolean unarmed = !uwep && !uarm && !uarms; #ifdef STEED int jousting = 0; #endif boolean vapekilled = FALSE; /* WAC added boolean for vamps vaporize */ boolean burnmsg = FALSE; boolean no_obj = !obj; /* since !obj can change if weapon breaks, etc. */ boolean noeffect; int wtype; struct obj *monwep; struct obj *launcher; char yourbuf[BUFSZ]; char unconventional[BUFSZ]; /* substituted for word "attack" in msg */ char saved_oname[BUFSZ]; if (thrown == 1) launcher = uwep; else if (thrown == 2) launcher = uswapwep; else launcher = 0; objenchant = !thrown && no_obj || obj->spe < 0 ? 0 : obj->spe; if (need_one(mon)) canhitmon = 1; if (need_two(mon)) canhitmon = 2; if (need_three(mon)) canhitmon = 3; if (need_four(mon)) canhitmon = 4; /* * If you are a creature that can hit as a +2 weapon, then YOU can * hit as a +2 weapon. - SW */ if (Upolyd) { /* Is Upolyd correct? */ /* a monster that needs a +1 weapon to hit it hits as a +1 weapon... */ if (need_one(&youmonst)) objenchant = 1; if (need_two(&youmonst)) objenchant = 2; if (need_three(&youmonst)) objenchant = 3; if (need_four(&youmonst)) objenchant = 4; /* overridden by specific flags */ if (hit_as_one(&youmonst)) objenchant = 1; if (hit_as_two(&youmonst)) objenchant = 2; if (hit_as_three(&youmonst)) objenchant = 3; if (hit_as_four(&youmonst)) objenchant = 4; } unconventional[0] = '\0'; saved_oname[0] = '\0'; wakeup(mon); if(!thrown && no_obj) { /* attack with bare hands */ if (Role_if(PM_MONK) && !Upolyd && u.ulevel/4 > objenchant) objenchant = u.ulevel/4; noeffect = objenchant < canhitmon; if (martial_bonus()) { if (mdat == &mons[PM_SHADE]) { tmp = rn2(3); } else { tmp = martial_dmg(); } } else { if (mdat == &mons[PM_SHADE]) tmp = 0; else tmp = rnd(2); } valid_weapon_attack = (tmp > 1); /* blessed gloves give bonuses when fighting 'bare-handed' */ if (uarmg && uarmg->blessed && (is_undead(mdat) || is_demon(mdat))) tmp += rnd(4); if (uarmg && uarmg->spe) tmp += uarmg->spe; /* WAC plusses from gloves */ /* So do silver rings. Note: rings are worn under gloves, so you * don't get both bonuses. */ if (!uarmg) { if (uleft && objects[uleft->otyp].oc_material == SILVER) barehand_silver_rings++; if (uright && objects[uright->otyp].oc_material == SILVER) barehand_silver_rings++; if (barehand_silver_rings && hates_silver(mdat)) { tmp += rnd(20); silvermsg = TRUE; } } /* WAC - Hand-to-Hand Combat Techniques */ if ((tech_inuse(T_CHI_STRIKE)) && (u.uen > 0)) { You("feel a surge of force."); tmp += (u.uen > (10 + (u.ulevel / 5)) ? (10 + (u.ulevel / 5)) : u.uen); u.uen -= (10 + (u.ulevel / 5)); if (u.uen < 0) u.uen = 0; } if (tech_inuse(T_E_FIST)) { int dmgbonus = 0; hittxt = TRUE; dmgbonus = noeffect ? 0 : d(2,4); switch (rn2(4)) { case 0: /* Fire */ if (!Blind) pline("%s is on fire!", Monnam(mon)); dmgbonus += destroy_mitem(mon, SCROLL_CLASS, AD_FIRE); dmgbonus += destroy_mitem(mon, SPBOOK_CLASS, AD_FIRE); if (noeffect || resists_fire(mon)) { if (!noeffect) shieldeff(mon->mx, mon->my); if (!Blind) pline_The("fire doesn't heat %s!", mon_nam(mon)); golemeffects(mon, AD_FIRE, dmgbonus); if (!noeffect) dmgbonus = 0; else noeffect = 0; } /* only potions damage resistant players in destroy_item */ dmgbonus += destroy_mitem(mon, POTION_CLASS, AD_FIRE); break; case 1: /* Cold */ if (!Blind) pline("%s is covered in frost!", Monnam(mon)); if (noeffect || resists_cold(mon)) { if (!noeffect) shieldeff(mon->mx, mon->my); if (!Blind) pline_The("frost doesn't chill %s!", mon_nam(mon)); golemeffects(mon, AD_COLD, dmgbonus); dmgbonus = 0; noeffect = 0; } dmgbonus += destroy_mitem(mon, POTION_CLASS, AD_COLD); break; case 2: /* Elec */ if (!Blind) pline("%s is zapped!", Monnam(mon)); dmgbonus += destroy_mitem(mon, WAND_CLASS, AD_ELEC); if (noeffect || resists_elec(mon)) { if (!noeffect) shieldeff(mon->mx, mon->my); if (!Blind) pline_The("zap doesn't shock %s!", mon_nam(mon)); golemeffects(mon, AD_ELEC, dmgbonus); if (!noeffect) dmgbonus = 0; else noeffect = 0; } /* only rings damage resistant players in destroy_item */ dmgbonus += destroy_mitem(mon, RING_CLASS, AD_ELEC); break; case 3: /* Acid */ if (!Blind) pline("%s is covered in acid!", Monnam(mon)); if (noeffect || resists_acid(mon)) { if (!Blind) pline_The("acid doesn't burn %s!", Monnam(mon)); dmgbonus = 0; noeffect = 0; } break; } if (dmgbonus > 0) tmp += dmgbonus; } /* Techinuse Elemental Fist */ } else { if (obj->oartifact == ART_MAGICBANE) objenchant = 4; else if (obj->oartifact) objenchant += 2; #ifdef LIGHTSABERS if (is_lightsaber(obj)) objenchant = 4; #endif if (is_poisonable(obj) && obj->opoisoned) ispoisoned = TRUE; noeffect = objenchant < canhitmon && !ispoisoned; Strcpy(saved_oname, cxname(obj)); if(obj->oclass == WEAPON_CLASS || is_weptool(obj) || obj->oclass == GEM_CLASS) { /* is it not a melee weapon? */ /* KMH, balance patch -- new macros */ if (/* if you strike with a bow... */ is_launcher(obj) || /* or strike with a missile in your hand... */ (!thrown && (is_missile(obj) || is_ammo(obj))) || /* or use a pole at short range and not mounted... */ (!thrown && #ifdef STEED !u.usteed && #endif is_pole(obj)) || #ifdef LIGHTSABERS /* lightsaber that isn't lit ;) */ (is_lightsaber(obj) && !obj->lamplit) || #endif /* or throw a missile without the proper bow... */ (thrown == 1 && is_ammo(obj) && !ammo_and_launcher(obj, launcher)) || /* This case isn't actually needed so far since * you can only throw in two-weapon mode when both * launchers take the same ammo */ (thrown == 2 && is_ammo(obj) && !ammo_and_launcher(obj, launcher))) { /* then do only 1-2 points of damage */ if (mdat == &mons[PM_SHADE] && obj->otyp != SILVER_ARROW) tmp = 0; else tmp = rnd(2); if (!thrown && (obj == uwep || obj == uswapwep) && obj->otyp == BOOMERANG && !rnl(4) == 4-1) { boolean more_than_1 = (obj->quan > 1L); pline("As you hit %s, %s%s %s breaks into splinters.", mon_nam(mon), more_than_1 ? "one of " : "", shk_your(yourbuf, obj), xname(obj)); if (!more_than_1) { if (obj == uwep) uwepgone(); /* set unweapon */ else setuswapwep((struct obj *)0, FALSE); } useup(obj); if (!more_than_1) obj = (struct obj *) 0; hittxt = TRUE; if (mdat != &mons[PM_SHADE]) tmp++; } } else { tmp = dmgval(obj, mon); /* a minimal hit doesn't exercise proficiency */ valid_weapon_attack = (tmp > 1); #if 0 if (!valid_weapon_attack || mon == u.ustuck || u.twoweap) { #endif if (!valid_weapon_attack || mon == u.ustuck) { ; /* no special bonuses */ } else if (mon->mflee && Role_if(PM_ROGUE) && !Upolyd) { You("strike %s from behind!", mon_nam(mon)); tmp += rnd(u.ulevel); hittxt = TRUE; } else if (dieroll == 2 && obj == uwep && !u.twoweap && obj->oclass == WEAPON_CLASS && (bimanual(obj) || (Role_if(PM_SAMURAI) && obj->otyp == KATANA && !uarms)) && ((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. * [dieroll == 2 is most successful non-beheading or * -bisecting hit, in case of special artifact damage; * the percentage chance is (1/20)*(50/100).] * WAC. Bimanual, or samurai and Katana without shield. * No twoweapon. */ 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; } if (obj->oartifact && artifact_hit(&youmonst, mon, obj, &tmp, dieroll)) { if(mon->mhp <= 0) /* artifact killed monster */ return FALSE; if (tmp == 0) return TRUE; hittxt = TRUE; } if (objects[obj->otyp].oc_material == SILVER && hates_silver(mdat)) { silvermsg = TRUE; silverobj = TRUE; } #ifdef STEED if (u.usteed && !thrown && tmp > 0 && weapon_type(obj) == P_LANCE && mon != u.ustuck) { jousting = joust(mon, obj); /* exercise skill even for minimal damage hits */ if (jousting) valid_weapon_attack = TRUE; } #endif if (thrown && (is_ammo(obj) || is_missile(obj))) { #ifdef P_SPOON if (obj->oartifact == ART_HOUCHOU) { pline("There is a bright flash as it hits %s.", the(mon_nam(mon))); tmp = dmgval(obj, mon); } #endif /* P_SPOON */ if (ammo_and_launcher(obj, launcher)) { if (launcher->oartifact) tmp += spec_dbon(launcher, mon, tmp); /* Elves and Samurai do extra damage using * their bows&arrows; they're highly trained. * WAC Only elves get dmg bonus from flurry. Change? */ if (Role_if(PM_SAMURAI) && obj->otyp == YA && launcher->otyp == YUMI) tmp++; else if (Race_if(PM_ELF)) { if (obj->otyp == ELVEN_ARROW && launcher->otyp == ELVEN_BOW) { tmp++; /* WAC Extra damage if in special ability*/ if (tech_inuse(T_FLURRY)) tmp += 2; } else if (objects[obj->otyp].oc_skill == P_BOW && tech_inuse(T_FLURRY)) { tmp++; } } else if (Race_if(PM_DROW)) { if (obj->otyp == DARK_ELVEN_ARROW && launcher->otyp == DARK_ELVEN_BOW) { tmp += 2; /* WAC Mucho damage if in special ability*/ if (tech_inuse(T_FLURRY)) tmp *= 2; } else if (objects[obj->otyp].oc_skill == P_BOW && tech_inuse(T_FLURRY)) { tmp++; } } } } /* MRKR: Hitting with a lit torch does extra */ /* fire damage, but uses up the torch */ /* more quickly. */ if(obj->otyp == TORCH && obj->lamplit && !resists_fire(mon)) { burnmsg = TRUE; tmp++; if (resists_cold(mon)) tmp += rnd(3); /* Additional damage due to burning armor */ /* & equipment is delayed to below, after */ /* the hit messages are printed. */ } } } else if(obj->oclass == POTION_CLASS) { if (!u.twoweap || obj == uwep) { if (obj->quan > 1L) obj = splitobj(obj, 1L); else setuwep((struct obj *)0, FALSE); } else if (u.twoweap && obj == uswapwep) { if (obj->quan > 1L) setworn(splitobj(obj, 1L), W_SWAPWEP); else setuswapwep((struct obj *)0, FALSE); } freeinv(obj); potionhit(mon, obj, TRUE); if (mon->mhp <= 0) return FALSE; /* killed */ hittxt = TRUE; /* in case potion effect causes transformation */ mdat = mon->data; tmp = (mdat == &mons[PM_SHADE]) ? 0 : 1; } else { if (mdat == &mons[PM_SHADE] && !shade_aware(obj)) { tmp = 0; Strcpy(unconventional, cxname(obj)); } else { switch(obj->otyp) { case BOULDER: /* 1d20 */ case HEAVY_IRON_BALL: /* 1d25 */ case IRON_CHAIN: /* 1d4+1 */ tmp = dmgval(obj, mon); break; case MIRROR: if (breaktest(obj)) { You("break %s mirror. That's bad luck!", shk_your(yourbuf, obj)); change_luck(-2); useup(obj); obj = (struct obj *) 0; unarmed = FALSE; /* avoid obj==0 confusion */ get_dmg_bonus = FALSE; hittxt = TRUE; } tmp = 1; break; #ifdef TOURIST case EXPENSIVE_CAMERA: You("succeed in destroying %s camera. Congratulations!", shk_your(yourbuf, obj)); useup(obj); return(TRUE); /*NOTREACHED*/ break; #endif case CORPSE: /* fixed by polder@cs.vu.nl */ if (touch_petrifies(&mons[obj->corpsenm])) { static const char withwhat[] = "corpse"; tmp = 1; hittxt = TRUE; You("hit %s with %s %s.", mon_nam(mon), obj->dknown ? the(mons[obj->corpsenm].mname) : an(mons[obj->corpsenm].mname), (obj->quan > 1) ? makeplural(withwhat) : withwhat); if (!munstone(mon, TRUE)) minstapetrify(mon, TRUE); if (resists_ston(mon)) break; /* note: hp may be <= 0 even if munstoned==TRUE */ return (boolean) (mon->mhp > 0); #if 0 } else if (touch_petrifies(mdat)) { /* maybe turn the corpse into a statue? */ #endif } tmp = (obj->corpsenm >= LOW_PM ? mons[obj->corpsenm].msize : 0) + 1; break; case EGG: { #define useup_eggs(o) { if (thrown) obfree(o,(struct obj *)0); \ else useupall(o); \ o = (struct obj *)0; } /* now gone */ long cnt = obj->quan; tmp = 1; /* nominal physical damage */ get_dmg_bonus = FALSE; hittxt = TRUE; /* message always given */ /* egg is always either used up or transformed, so next hand-to-hand attack should yield a "bashing" mesg */ if (obj == uwep) unweapon = TRUE; if (obj->spe && obj->corpsenm >= LOW_PM) { if (obj->quan < 5) change_luck((schar) -(obj->quan)); else change_luck(-5); } if (touch_petrifies(&mons[obj->corpsenm])) { /*learn_egg_type(obj->corpsenm);*/ pline("Splat! You hit %s with %s %s egg%s!", mon_nam(mon), obj->known ? "the" : cnt > 1L ? "some" : "a", obj->known ? mons[obj->corpsenm].mname : "petrifying", plur(cnt)); #if 0 obj->known = 1; /* (not much point...) */ #endif useup_eggs(obj); if (!munstone(mon, TRUE)) minstapetrify(mon, TRUE); if (resists_ston(mon)) break; return (boolean) (mon->mhp > 0); } else { /* ordinary egg(s) */ const char *eggp = (obj->corpsenm != NON_PM && obj->known) ? the(mons[obj->corpsenm].mname) : (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"); if (obj->timed) obj_stop_timers(obj); obj->otyp = ROCK; obj->oclass = GEM_CLASS; obj->oartifact = 0; obj->spe = 0; obj->known = obj->dknown = obj->bknown = 0; obj->owt = weight(obj); if (thrown) place_object(obj, mon->mx, mon->my); } else { pline("Splat!"); useup_eggs(obj); exercise(A_WIS, FALSE); } } break; #undef useup_eggs } case CLOVE_OF_GARLIC: /* no effect against demons */ if (is_undead(mdat)) { monflee(mon, d(2, 4), FALSE, TRUE); } tmp = 1; break; case CREAM_PIE: case BLINDING_VENOM: mon->msleeping = 0; if (can_blnd(&youmonst, mon, (uchar) (obj->otyp == BLINDING_VENOM ? AT_SPIT : AT_WEAP), obj)) { if (Blind) { pline(obj->otyp == CREAM_PIE ? "Splat!" : "Splash!"); } else if (obj->otyp == BLINDING_VENOM) { pline_The("venom blinds %s%s!", mon_nam(mon), mon->mcansee ? "" : " further"); } else { char *whom = mon_nam(mon); char *what = The(xname(obj)); if (!thrown && obj->quan > 1) what = An(singular(obj, xname)); /* note: s_suffix returns a modifiable buffer */ if (haseyes(mdat) && mdat != &mons[PM_FLOATING_EYE]) whom = strcat(strcat(s_suffix(whom), " "), mbodypart(mon, FACE)); pline("%s %s over %s!", what, vtense(what, "splash"), whom); } setmangry(mon); mon->mcansee = 0; tmp = rn1(25, 21); if(((int) mon->mblinded + tmp) > 127) mon->mblinded = 127; else mon->mblinded += tmp; } else { pline(obj->otyp==CREAM_PIE ? "Splat!" : "Splash!"); setmangry(mon); } if (thrown) obfree(obj, (struct obj *)0); else useup(obj); hittxt = TRUE; get_dmg_bonus = FALSE; tmp = 0; break; case ACID_VENOM: /* thrown (or spit) */ if (resists_acid(mon)) { Your("venom hits %s harmlessly.", mon_nam(mon)); tmp = 0; } else { Your("venom burns %s!", mon_nam(mon)); tmp = dmgval(obj, mon); } if (thrown) obfree(obj, (struct obj *)0); else useup(obj); hittxt = TRUE; get_dmg_bonus = FALSE; break; default: /* non-weapons can damage because of their weight */ /* (but not too much) */ tmp = obj->owt/100; if(tmp < 1) tmp = 1; else tmp = rnd(tmp); if(tmp > 6) tmp = 6; /* * Things like silver wands can arrive here so * so we need another silver check. */ if (objects[obj->otyp].oc_material == SILVER && hates_silver(mdat)) { tmp += rnd(20); silvermsg = TRUE; silverobj = TRUE; } } } } } /****** NOTE: perhaps obj is undefined!! (if !thrown && BOOMERANG) * *OR* if attacking bare-handed!! */ if (get_dmg_bonus && tmp > 0) { tmp += u.udaminc; /* If you throw using a propellor, you don't get a strength * bonus but you do get an increase-damage bonus. */ if(!thrown || !obj || !uwep || !ammo_and_launcher(obj, launcher)) tmp += dbon(); } /* * Ki special ability, see cmd.c in function special_ability. * In this case, we do twice damage! Wow! * * Berserk special ability only does +4 damage. - SW */ /*Lycanthrope claws do +level bare hands dmg (multi-hit, stun/freeze)..- WAC*/ if (tech_inuse(T_KIII)) tmp *= 2; if (tech_inuse(T_BERSERK)) tmp += 4; if (tech_inuse(T_EVISCERATE)) { tmp += rnd((int) (u.ulevel/2 + 1)) + (u.ulevel/2); /* [max] was only + u.ulevel */ You("slash %s!", mon_nam(mon)); hittxt = TRUE; } if (valid_weapon_attack) { struct obj *wep; /* to be valid a projectile must have had the correct projector */ wep = PROJECTILE(obj) ? launcher : obj; tmp += weapon_dam_bonus(wep); /* [this assumes that `!thrown' implies wielded...] */ wtype = weapon_type(wep); if (thrown || !u.twoweap || !rn2(2)) use_skill(wtype, 1); else if (u.twoweap) use_skill(P_TWO_WEAPON_COMBAT,1); } if (ispoisoned) { int nopoison = (10 - (obj->owt/10)); if(nopoison < 2) nopoison = 2; if Role_if(PM_SAMURAI) { You("dishonorably use a poisoned weapon!"); adjalign(-sgn(u.ualign.type)); } else if ((u.ualign.type == A_LAWFUL) && (u.ualign.record > -10)) { You_feel("like an evil coward for using a poisoned weapon."); adjalign(-1); } if (obj && !rn2(nopoison)) { obj->opoisoned = FALSE; Your("%s %s no longer poisoned.", xname(obj), otense(obj, "are")); } if (resists_poison(mon)) needpoismsg = TRUE; else if (rn2(10)) tmp += rnd(6); else poiskilled = TRUE; } if (tmp < 1) { /* make sure that negative damage adjustment can't result in inadvertently boosting the victim's hit points */ tmp = 0; if (mdat == &mons[PM_SHADE]) { if (!hittxt) { const char *what = unconventional[0] ? unconventional : "attack"; Your("%s %s harmlessly through %s.", what, vtense(what, "pass"), mon_nam(mon)); hittxt = TRUE; } } else { if (get_dmg_bonus) tmp = 1; } } #ifdef STEED if (jousting) { tmp += d(2, (obj == uwep) ? 10 : 2); /* [was in dmgval()] */ You("joust %s%s", mon_nam(mon), canseemon(mon) ? exclam(tmp) : "."); if (jousting < 0) { Your("%s shatters on impact!", xname(obj)); /* (must be either primary or secondary weapon to get here) */ u.twoweap = FALSE; /* untwoweapon() is too verbose here */ if (obj == uwep) uwepgone(); /* set unweapon */ /* minor side-effect: broken lance won't split puddings */ useup(obj); obj = 0; } /* avoid migrating a dead monster */ if (mon->mhp > tmp) { mhurtle(mon, u.dx, u.dy, 1); mdat = mon->data; /* in case of a polymorph trap */ if (DEADMONSTER(mon)) already_killed = TRUE; } hittxt = TRUE; } else #endif /* VERY small chance of stunning opponent if unarmed. */ if (unarmed && tmp > 1 && !thrown && !obj && !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"))); /* avoid migrating a dead monster */ if (mon->mhp > tmp) { mhurtle(mon, u.dx, u.dy, 1); mdat = mon->data; /* in case of a polymorph trap */ if (DEADMONSTER(mon)) already_killed = TRUE; } hittxt = TRUE; } } if (tmp && noeffect) { if (silvermsg) tmp = 8; else { Your("attack doesn't seem to harm %s.", mon_nam(mon)); hittxt = TRUE; tmp = 0; } } /* WAC Added instant kill from wooden stakes vs vampire */ /* based off Poison Code */ /* fixed stupid mistake - check that obj exists before comparing...*/ if (obj && obj->otyp == WOODEN_STAKE && is_vampire(mdat)) { if (Role_if(PM_UNDEAD_SLAYER) || (P_SKILL(weapon_type(obj)) >= P_EXPERT) || obj->oartifact == ART_STAKE_OF_VAN_HELSING) { if (!rn2(10)) { You("plunge your stake into the heart of %s.", mon_nam(mon)); vapekilled = TRUE; } else { You("drive your stake into %s.", mon_nam(mon)); tmp += rnd(6) + 2; hittxt = TRUE; } } else { You("drive your stake into %s.", mon_nam(mon)); tmp += rnd(6); hittxt = TRUE; } } /* Special monk strikes */ if (Role_if(PM_MONK) && !Upolyd && !thrown && no_obj && (!uarm || (uarm && uarm->otyp >= ROBE && uarm->otyp <= ROBE_OF_WEAKNESS)) && !uarms && distu(mon->mx, mon->my) <= 2) { /* just so we don't need another variable ... */ canhitmon = rnd(100); if (canhitmon < u.ulevel / 8 && !thick_skinned(mdat)) { if (canspotmon(mon)) You("strike %s extremely hard!", mon_nam(mon)); tmp *= 2; hittxt = TRUE; } else if (canhitmon < u.ulevel / 4 && !thick_skinned(mdat)) { if (canspotmon(mon)) You("strike %s very hard!", mon_nam(mon)); tmp += tmp / 2; hittxt = TRUE; } else if (canhitmon < u.ulevel / 2 && !bigmonst(mon->data) && !thick_skinned(mdat)) { if (canspotmon(mon)) pline("%s %s from your powerful strike!", Monnam(mon), makeplural(stagger(mon->data, "stagger"))); /* avoid migrating a dead monster */ if (mon->mhp > tmp) { mhurtle(mon, u.dx, u.dy, 1); mdat = mon->data; /* in case of a polymorph trap */ if (DEADMONSTER(mon)) already_killed = TRUE; } hittxt = TRUE; } } if (!already_killed) mon->mhp -= tmp; /* adjustments might have made tmp become less than what a level draining artifact has already done to max HP */ if (mon->mhp > mon->mhpmax) mon->mhp = mon->mhpmax; if (mon->mhp < 1) destroyed = TRUE; /* fixed bug with hitting tame monster with non-magic weapon */ 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 -- !thrown and obj == weapon */ && !thrown && objects[obj->otyp].oc_material == IRON && mon->mhp > 1 && !thrown && !mon->mcan /* && !destroyed -- guaranteed by mhp > 1 */ ) { if (clone_mon(mon, 0, 0)) { pline("%s divides as you hit it!", Monnam(mon)); hittxt = TRUE; } } 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) : "."); } if (burnmsg) { /* A chance of setting the monster's */ /* armour + equipment on fire */ /* (this does not do any extra damage) */ if (!Blind) { Your("%s %s %s.", xname(obj), (mon->data == &mons[PM_WATER_ELEMENTAL]) ? "vaporizes part of" : "burns", mon_nam(mon)); } if (!rn2(2) && burnarmor(mon)) { if (!rn2(3)) (void)destroy_mitem(mon, POTION_CLASS, AD_FIRE); if (!rn2(3)) (void)destroy_mitem(mon, SCROLL_CLASS, AD_FIRE); if (!rn2(5)) (void)destroy_mitem(mon, SPBOOK_CLASS, AD_FIRE); } if (mon->data == &mons[PM_WATER_ELEMENTAL]) { if (!Blind) { Your("%s goes out.", xname(obj)); } end_burn(obj, TRUE); } else { /* use up the torch more quickly */ burn_faster(obj, 1); } } if (silvermsg) { const char *fmt; char *whom = mon_nam(mon); char silverobjbuf[BUFSZ]; if (canspotmon(mon)) { if (barehand_silver_rings == 1) fmt = "Your silver ring sears %s!"; else if (barehand_silver_rings == 2) fmt = "Your silver rings sear %s!"; else if (silverobj && saved_oname[0]) { Sprintf(silverobjbuf, "Your %s%s %s %%s!", strstri(saved_oname, "silver") ? "" : "silver ", saved_oname, vtense(saved_oname, "sear")); fmt = silverobjbuf; } else fmt = "The silver sears %s!"; } else { *whom = highc(*whom); /* "it" -> "It" */ fmt = "%s is seared!"; } /* note: s_suffix returns a modifiable buffer */ if (!noncorporeal(mdat)) whom = strcat(s_suffix(whom), " flesh"); pline(fmt, whom); } if (needpoismsg) pline_The("poison doesn't seem to affect %s.", mon_nam(mon)); if (poiskilled) { pline_The("poison was deadly..."); if (!already_killed) xkilled(mon, 0); return FALSE; /* For vamps */ } else if (vapekilled) { if (cansee(mon->mx, mon->my)) pline("%s%ss body vaporizes!", Monnam(mon), canseemon(mon) ? "'" : ""); if (!already_killed) xkilled(mon, 2); return FALSE; } else if (destroyed) { if (!already_killed) killed(mon); /* takes care of most messages */ } else if(u.umconf && !thrown) { nohandglow(mon); if (!mon->mconf && !resist(mon, SPBOOK_CLASS, 0, NOTELL)) { mon->mconf = 1; if (!mon->mstun && mon->mcanmove && !mon->msleeping && canseemon(mon)) pline("%s appears confused.", Monnam(mon)); } } #ifdef SHOW_DMG if (!destroyed) showdmg(tmp); #endif return((boolean)(destroyed ? FALSE : TRUE)); } STATIC_OVL boolean shade_aware(obj) struct obj *obj; { if (!obj) return FALSE; /* * The things in this list either * 1) affect shades. * OR * 2) are dealt with properly by other routines * when it comes to shades. */ if (obj->otyp == BOULDER || obj->otyp == HEAVY_IRON_BALL || obj->otyp == IRON_CHAIN /* dmgval handles those first three */ || obj->otyp == MIRROR /* silver in the reflective surface */ || obj->otyp == CLOVE_OF_GARLIC /* causes shades to flee */ || objects[obj->otyp].oc_material == SILVER) return TRUE; return FALSE; } /* check whether slippery clothing protects from hug or wrap attack */ /* [currently assumes that you are the attacker] */ STATIC_OVL boolean m_slips_free(mdef, mattk) struct monst *mdef; struct attack *mattk; { struct obj *obj; if (mattk->adtyp == AD_DRIN) { /* intelligence drain attacks the head */ obj = which_armor(mdef, W_ARMH); } else { /* grabbing attacks the body */ obj = which_armor(mdef, W_ARMC); /* cloak */ if (!obj) obj = which_armor(mdef, W_ARM); /* suit */ #ifdef TOURIST if (!obj) obj = which_armor(mdef, W_ARMU); /* shirt */ #endif } /* if your cloak/armor is greased, monster slips off; this protection might fail (33% chance) when the armor is cursed */ if (obj && (obj->greased || obj->otyp == OILSKIN_CLOAK) && (!obj->cursed || rn2(3))) { You("%s %s %s %s!", mattk->adtyp == AD_WRAP ? "slip off of" : "grab, but cannot hold onto", s_suffix(mon_nam(mdef)), obj->greased ? "greased" : "slippery", /* 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."); obj->greased = 0; } return TRUE; } return FALSE; } /* used when hitting a monster with a lance while mounted */ STATIC_OVL int /* 1: joust hit; 0: ordinary hit; -1: joust but break lance */ joust(mon, obj) struct monst *mon; /* target */ struct obj *obj; /* weapon */ { int skill_rating, joust_dieroll; if (Fumbling || Stunned) return 0; /* sanity check; lance must be wielded in order to joust */ if (obj != uwep && (obj != uswapwep || !u.twoweap)) return 0; /* if using two weapons, use worse of lance and two-weapon skills */ skill_rating = P_SKILL(weapon_type(obj)); /* lance skill */ if (u.twoweap && P_SKILL(P_TWO_WEAPON_COMBAT) < skill_rating) skill_rating = P_SKILL(P_TWO_WEAPON_COMBAT); if (skill_rating == P_ISRESTRICTED) skill_rating = P_UNSKILLED; /* 0=>1 */ /* odds to joust are expert:80%, skilled:60%, basic:40%, unskilled:20% */ if ((joust_dieroll = rn2(5)) < skill_rating) { if (joust_dieroll == 0 && rnl(50) == (50-1) && !unsolid(mon->data) && !obj_resists(obj, 0, 100)) return -1; /* hit that breaks lance */ return 1; /* successful joust */ } return 0; /* no joust bonus; revert to ordinary attack */ } /* * Send in a demon pet for the hero. Exercise wisdom. * * This function used to be inline to damageum(), but the Metrowerks compiler * (DR4 and DR4.5) screws up with an internal error 5 "Expression Too Complex." * Pulling it out makes it work. */ 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); } /* * Player uses theft attack against monster. * * If the target is wearing body armor, take all of its possesions; * otherwise, take one object. [Is this really the behavior we want?] * * This routine implicitly assumes that there is no way to be able to * resist petfication (ie, be polymorphed into a xorn or golem) at the * same time as being able to steal (poly'd into nymph or succubus). * If that ever changes, the check for touching a cockatrice corpse * will need to be smarter about whether to break out of the theft loop. */ STATIC_OVL void steal_it(mdef, mattk) struct monst *mdef; struct attack *mattk; { struct obj *otmp, *stealoid, **minvent_ptr; long unwornmask; if (!mdef->minvent) return; /* nothing to take */ /* look for worn body armor */ stealoid = (struct obj *)0; if (could_seduce(&youmonst, mdef, mattk)) { /* find armor, and move it to end of inventory in the process */ minvent_ptr = &mdef->minvent; while ((otmp = *minvent_ptr) != 0) if (otmp->owornmask & W_ARM) { if (stealoid) panic("steal_it: multiple worn suits"); *minvent_ptr = otmp->nobj; /* take armor out of minvent */ stealoid = otmp; stealoid->nobj = (struct obj *)0; } else { minvent_ptr = &otmp->nobj; } *minvent_ptr = stealoid; /* put armor back into minvent */ } if (stealoid) { /* we will be taking everything */ if (gender(mdef) == (int) u.mfemale && youmonst.data->mlet == S_NYMPH) You("charm %s. She gladly hands over her possessions.", 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) { if (!Upolyd) break; /* no longer have ability to steal */ /* take the object away from the monster */ obj_extract_self(otmp); if ((unwornmask = otmp->owornmask) != 0L) { mdef->misc_worn_check &= ~unwornmask; if (otmp->owornmask & W_WEP) { setmnotwielded(mdef,otmp); MON_NOWEP(mdef); } otmp->owornmask = 0L; update_mon_intrinsics(mdef, otmp, FALSE, 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 snatched but dropped %s.", doname(otmp), "You steal: "); if (otmp->where != OBJ_INVENT) continue; if (otmp->otyp == CORPSE && touch_petrifies(&mons[otmp->corpsenm]) && !uarmg) { char kbuf[BUFSZ]; Sprintf(kbuf, "stolen %s corpse", mons[otmp->corpsenm].mname); instapetrify(kbuf); break; /* stop the theft even if hero survives */ } /* more take-away handling, after theft message */ if (unwornmask & W_WEP) { /* stole wielded weapon */ possibly_unwield(mdef, FALSE); } else if (unwornmask & W_ARMG) { /* stole worn gloves */ mselftouch(mdef, (const char *)0, TRUE); if (mdef->mhp <= 0) /* it's now a statue */ return; /* can't continue stealing */ } if (!stealoid) break; /* only taking one item */ } } int damageum(mdef, mattk) register struct monst *mdef; register struct attack *mattk; { register struct permonst *pd = mdef->data; register int tmp = d((int)mattk->damn, (int)mattk->damd); int armpro; boolean negated; register int enchantlvl = 0; boolean noeffect = FALSE; armpro = magic_negation(mdef); /* since hero can't be cancelled, only defender's armor applies */ negated = !((rn2(3) >= armpro) || !rn2(50)); if (hit_as_one(&youmonst)) enchantlvl = 1; if (hit_as_two(&youmonst)) enchantlvl = 2; if (hit_as_three(&youmonst)) enchantlvl = 3; if (hit_as_four(&youmonst)) enchantlvl = 4; if (need_one(mdef) && enchantlvl < 1) noeffect = TRUE; if (need_two(mdef) && enchantlvl < 2) noeffect = TRUE; if (need_three(mdef) && enchantlvl < 3) noeffect = TRUE; if (need_four(mdef) && enchantlvl < 4) noeffect = TRUE; if (is_demon(youmonst.data) && !rn2(13) && !uwep && u.umonnum != PM_SUCCUBUS && u.umonnum != PM_INCUBUS && u.umonnum != PM_BALROG) { demonpet(); return(0); } switch(mattk->adtyp) { case AD_STUN: if(!Blind) pline("%s %s for a moment.", Monnam(mdef), makeplural(stagger(mdef->data, "stagger"))); mdef->mstun = 1; goto physical; case AD_LEGS: /* if (u.ucancelled) { */ /* tmp = 0; */ /* break; */ /* } */ goto physical; case AD_WERE: /* no special effect on monsters */ case AD_HEAL: /* likewise */ case AD_PHYS: physical: if(mattk->aatyp == AT_WEAP) { if(uwep) tmp = 0; } else if(mattk->aatyp == AT_KICK) { if(thick_skinned(mdef->data)) tmp = 0; if(mdef->data == &mons[PM_SHADE]) { if (!(uarmf && uarmf->blessed)) { impossible("bad shade attack function flow?"); tmp = 0; } else tmp = rnd(4); /* bless damage */ } } else if(mattk->aatyp == AT_HUGS && u.umonnum == PM_ROPE_GOLEM) { if (breathless(mdef->data)) tmp = (tmp + 1) / 2; } break; case AD_FIRE: if (negated) { tmp = 0; break; } if (!Blind) pline("%s is %s!", Monnam(mdef), on_fire(mdef->data, mattk)); if (pd == &mons[PM_STRAW_GOLEM] || pd == &mons[PM_PAPER_GOLEM]) { if (!Blind) pline("%s burns completely!", Monnam(mdef)); xkilled(mdef,2); tmp = 0; break; /* Don't return yet; keep hp<1 and tmp=0 for pet msg */ } if (pd == &mons[PM_STRAW_GOLEM] || pd == &mons[PM_PAPER_GOLEM] || pd == &mons[PM_WAX_GOLEM]) { if (!Blind) pline("%s falls to pieces!", Monnam(mdef)); xkilled(mdef,3); return(2); } tmp += destroy_mitem(mdef, SCROLL_CLASS, AD_FIRE); tmp += destroy_mitem(mdef, SPBOOK_CLASS, AD_FIRE); if (resists_fire(mdef)) { if (!Blind) pline_The("fire doesn't heat %s!", mon_nam(mdef)); golemeffects(mdef, AD_FIRE, tmp); shieldeff(mdef->mx, mdef->my); tmp = 0; } /* only potions damage resistant players in destroy_item */ tmp += destroy_mitem(mdef, POTION_CLASS, AD_FIRE); break; case AD_COLD: if (negated) { tmp = 0; break; } if (!Blind) pline("%s is covered in frost!", Monnam(mdef)); if (resists_cold(mdef)) { shieldeff(mdef->mx, mdef->my); if (!Blind) pline_The("frost doesn't chill %s!", mon_nam(mdef)); golemeffects(mdef, AD_COLD, tmp); tmp = 0; } tmp += destroy_mitem(mdef, POTION_CLASS, AD_COLD); break; case AD_ELEC: if (negated) { tmp = 0; break; } if (!Blind) pline("%s is zapped!", Monnam(mdef)); tmp += destroy_mitem(mdef, WAND_CLASS, AD_ELEC); if (resists_elec(mdef)) { if (!Blind) pline_The("zap doesn't shock %s!", mon_nam(mdef)); golemeffects(mdef, AD_ELEC, tmp); shieldeff(mdef->mx, mdef->my); tmp = 0; } /* only rings damage resistant players in destroy_item */ tmp += destroy_mitem(mdef, RING_CLASS, AD_ELEC); break; case AD_ACID: if (resists_acid(mdef)) tmp = 0; break; case AD_STON: if (!munstone(mdef, TRUE)) minstapetrify(mdef, TRUE); tmp = 0; break; #ifdef SEDUCE case AD_SSEX: #endif case AD_SEDU: case AD_SITM: steal_it(mdef, mattk); 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; case AD_TLPT: if (tmp <= 0) tmp = 1; if (!negated && tmp < mdef->mhp) { char nambuf[BUFSZ]; boolean u_saw_mon = canseemon(mdef) || (u.uswallow && u.ustuck == mdef); /* record the name before losing sight of monster */ Strcpy(nambuf, Monnam(mdef)); if (u_teleport_mon(mdef, FALSE) && u_saw_mon && !canseemon(mdef)) pline("%s suddenly disappears!", nambuf); } break; case AD_BLND: if (can_blnd(&youmonst, mdef, mattk->aatyp, (struct obj*)0)) { if(!Blind && mdef->mcansee) pline("%s is blinded.", Monnam(mdef)); mdef->mcansee = 0; tmp += mdef->mblinded; if (tmp > 127) tmp = 127; mdef->mblinded = tmp; } tmp = 0; break; case AD_CURS: if (night() && !rn2(10) && !mdef->mcan) { if (mdef->data == &mons[PM_CLAY_GOLEM]) { if (!Blind) pline("Some writing vanishes from %s head!", s_suffix(mon_nam(mdef))); xkilled(mdef, 0); /* Don't return yet; keep hp<1 and tmp=0 for pet msg */ } else { mdef->mcan = 1; You("chuckle."); } } tmp = 0; break; case AD_DRLI: if (!negated && !rn2(3) && !resists_drli(mdef)) { int xtmp = d(2,6); if (mdef->mhp < xtmp) xtmp = mdef->mhp; if (maybe_polyd(is_vampire(youmonst.data), Race_if(PM_VAMPIRE)) && mattk->aatyp == AT_BITE && has_blood(pd)) { /* For the life of a creature is in the blood (Lev 17:11) */ if (flags.verbose) You("feed on the lifeblood."); /* [ALI] Biting monsters does not count against eating conducts. The draining of life is considered to be primarily a non-physical effect */ lesshungry(xtmp * 6); } pline("%s suddenly seems weaker!", Monnam(mdef)); mdef->mhpmax -= xtmp; #ifdef SHOW_DMG if (xtmp < mdef->mhp) showdmg(xtmp); #endif if ((mdef->mhp -= xtmp) <= 0 || !mdef->m_lev) { pline("%s dies!", Monnam(mdef)); xkilled(mdef,0); } else mdef->m_lev--; tmp = 0; } break; case AD_RUST: if (pd == &mons[PM_IRON_GOLEM]) { pline("%s falls to pieces!", Monnam(mdef)); xkilled(mdef,0); } hurtmarmor(mdef, AD_RUST); tmp = 0; break; case AD_CORR: hurtmarmor(mdef, AD_CORR); tmp = 0; break; case AD_DCAY: if (pd == &mons[PM_WOOD_GOLEM] || pd == &mons[PM_LEATHER_GOLEM]) { pline("%s falls to pieces!", Monnam(mdef)); xkilled(mdef,0); } hurtmarmor(mdef, AD_DCAY); tmp = 0; break; case AD_DRST: case AD_DRDX: case AD_DRCO: if (!negated && !rn2(8)) { Your("%s was poisoned!", mpoisons_subj(&youmonst, mattk)); if (resists_poison(mdef)) pline_The("poison doesn't seem to affect %s.", mon_nam(mdef)); else { if (!rn2(10)) { Your("poison was deadly..."); tmp = mdef->mhp; } else tmp += rn1(10,6); } } break; case AD_DRIN: 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)) violated_vegetarian(); if (mindless(mdef->data)) { pline("%s doesn't notice.", Monnam(mdef)); break; } tmp += rnd(10); morehungry(-rnd(30)); /* cannot choke */ if (ABASE(A_INT) < AMAX(A_INT)) { ABASE(A_INT) += rnd(4); if (ABASE(A_INT) > AMAX(A_INT)) ABASE(A_INT) = AMAX(A_INT); flags.botl = 1; } exercise(A_WIS, TRUE); break; case AD_STCK: if (!negated && !sticks(mdef->data)) setustuck(mdef); /* it's now stuck to you */ break; case AD_WRAP: if (!sticks(mdef->data)) { if (!u.ustuck && !rn2(10)) { if (m_slips_free(mdef, mattk)) { tmp = 0; } else { You("swing yourself around %s!", mon_nam(mdef)); setustuck(mdef); } } else if(u.ustuck == mdef) { /* Monsters don't wear amulets of magical breathing */ if (is_pool(u.ux,u.uy) && !is_swimmer(mdef->data) && !amphibious(mdef->data)) { You("drown %s...", mon_nam(mdef)); tmp = mdef->mhp; } else if(mattk->aatyp == AT_HUGS) pline("%s is being crushed.", Monnam(mdef)); } else { tmp = 0; if (flags.verbose) You("brush against %s %s.", s_suffix(mon_nam(mdef)), mbodypart(mdef, LEG)); } } else tmp = 0; break; case AD_PLYS: if (!negated && mdef->mcanmove && !rn2(3) && tmp < mdef->mhp) { if (!Blind) pline("%s is frozen by you!", Monnam(mdef)); mdef->mcanmove = 0; mdef->mfrozen = rnd(10); } break; case AD_TCKL: if (!negated && mdef->mcanmove && !rn2(3) && tmp < mdef->mhp) { if (!Blind) You("mercilessly tickle %s!", mon_nam(mdef)); mdef->mcanmove = 0; mdef->mfrozen = rnd(10); } break; case AD_SLEE: if (mattk->aatyp == AT_GAZE && mon_reflects(mdef, (char *)0)) { tmp = 0; (void) mon_reflects(mdef, "But it reflects from %s %s!"); if (Sleep_resistance || Free_action) { pline("You yawn."); break; } else { nomul(-rnd(10)); u.usleep = 1; nomovemsg = "You wake up."; if (Blind) You("are put to sleep!"); else You("are put to sleep by your reflected gaze!"); break; } } if (!negated && !mdef->msleeping && (mattk->aatyp != AT_WEAP || barehanded_hit) && sleep_monst(mdef, rnd(10), -1)) { if (!Blind) pline("%s is put to sleep by you!", Monnam(mdef)); slept_monst(mdef); } else tmp = 0; break; case AD_SLIM: if (negated) break; /* physical damage only */ if (!rn2(4) && !flaming(mdef->data) && mdef->data != &mons[PM_GREEN_SLIME]) { You("turn %s into slime.", mon_nam(mdef)); (void) newcham(mdef, &mons[PM_GREEN_SLIME], FALSE, !Blind); tmp = 0; } break; case AD_ENCH: /* KMH -- remove enchantment (disenchanter) */ /* There's no msomearmor() function, so just do damage */ /* if (negated) break; */ break; case AD_SLOW: if (!negated && mdef->mspeed != MSLOW) { unsigned int oldspeed = mdef->mspeed; mon_adjust_speed(mdef, -1, (struct obj *)0); if (mdef->mspeed != oldspeed && canseemon(mdef)) pline("%s slows down.", Monnam(mdef)); } break; case AD_CONF: if (!mdef->mconf) { if (canseemon(mdef)) pline("%s looks confused.", Monnam(mdef)); mdef->mconf = 1; } else { if (canseemon(mdef)) pline("%s is getting more and more confused.", Monnam(mdef)); mdef->mconf++; } break; case AD_POLY: if (tmp < mdef->mhp) { if (resists_magm(mdef)) { /* magic resistance protects from polymorph traps, * so make it guard against involuntary polymorph * attacks too... */ shieldeff(mdef->mx, mdef->my); #if 0 } else if (!rn2(25) || !mon_poly(mdef)) { if (canseemon(mdef)) { pline("%s shudders!", Monnam(mdef)); } /* no corpse after system shock */ tmp = rnd(30); #endif } else if (!mon_poly(mdef, TRUE, "%s undergoes a freakish metamorphosis!")) /* prevent killing the monster again - * could be killed in mon_poly */ tmp = 0; } break; /* WAC -- for death gazes - but all messages should be generic */ case AD_DETH: if (rn2(16)) { /* Just damage */ break; } if (mattk->aatyp == AT_GAZE) You("look directly at %s!", mon_nam(mdef)); if ((mattk->aatyp == AT_GAZE) && (mon_reflects(mdef, (char *)0))) { /* WAC reflected gaze * Oooh boy...that was a bad move :B */ tmp = 0; shieldeff(mdef->mx, mdef->my); (void) mon_reflects(mdef, "But it reflects from %s %s!"); if (Antimagic) { You("shudder momentarily..."); break; } You("die..."); killer_format = KILLED_BY; killer = "a reflected gaze of death"; done(DIED); } else if (is_undead(mdef->data)) { /* Still does normal damage */ if (!Blind) pline("Something didn't work..."); break; } else if (resists_magm(mdef)) { if (!Blind) pline("%s shudders momentarily...", Monnam(mdef)); } else { tmp = mdef->mhp; } break; case AD_DREN: if (resists_magm(mdef)) { if (!Blind) { shieldeff(mdef->mx,mdef->my); pline("%s is unaffected.", Monnam(mdef)); } } else { mon_drain_en(mdef, ((mdef->m_lev > 0) ? (rnd(mdef->m_lev)) : 0) + 1); } break; case AD_CALM: /* KMH -- koala attack */ /* Certain monsters aren't even made peaceful. */ if (!mdef->iswiz && mdef->data != &mons[PM_MEDUSA] && !(mdef->data->mflags3 & M3_COVETOUS) && !(mdef->data->geno & G_UNIQ)) { pline("You calm %s.", mon_nam(mdef)); mdef->mpeaceful = 1; mdef->mtame = 0; tmp = 0; } break; default: tmp = 0; break; } mdef->mstrategy &= ~STRAT_WAITFORU; /* in case player is very fast */ if (tmp && noeffect && !DEADMONSTER(mdef)) { You("don't seem to harm %s.", mon_nam(mdef)); tmp = 0; return 1; } #ifdef SHOW_DMG if (tmp < mdef->mhp) showdmg(tmp); #endif /* if tmp == 0, DON'T xkilled/killed the monster even if hp < 1 * - xkilled/killed via other method... */ if((mdef->mhp -= tmp) < 1) { if (mdef->mtame && !cansee(mdef->mx,mdef->my)) { You_feel("embarrassed for a moment."); if (tmp) xkilled(mdef, 0); /* !tmp but hp<1: already killed */ } else if (!flags.verbose) { You("destroy it!"); if (tmp) xkilled(mdef, 0); } else if (tmp) killed(mdef); return(2); } return(1); } STATIC_OVL int explum(mdef, mattk) register struct monst *mdef; register struct attack *mattk; { register int tmp = d((int)mattk->damn, (int)mattk->damd); You("explode!"); switch(mattk->adtyp) { boolean resistance; /* only for cold/fire/elec */ case AD_BLND: if (!resists_blnd(mdef)) { pline("%s is blinded by your flash of light!", Monnam(mdef)); mdef->mblinded = min((int)mdef->mblinded + tmp, 127); mdef->mcansee = 0; } break; case AD_HALU: if (haseyes(mdef->data) && mdef->mcansee) { pline("%s is affected by your flash of light!", Monnam(mdef)); mdef->mconf = 1; } break; case AD_COLD: resistance = resists_cold(mdef); goto common; case AD_FIRE: resistance = resists_fire(mdef); goto common; case AD_ELEC: resistance = resists_elec(mdef); common: if (!resistance) { pline("%s gets blasted!", Monnam(mdef)); mdef->mhp -= tmp; if (mdef->mhp <= 0) { killed(mdef); return(2); } } else { shieldeff(mdef->mx, mdef->my); if (is_golem(mdef->data)) golemeffects(mdef, (int)mattk->adtyp, tmp); else pline_The("blast doesn't seem to affect %s.", mon_nam(mdef)); } break; default: break; } return(1); } STATIC_OVL void start_engulf(mdef) struct monst *mdef; { if (!Invisible) { map_location(u.ux, u.uy, TRUE); tmp_at(DISP_ALWAYS, mon_to_glyph(&youmonst)); tmp_at(mdef->mx, mdef->my); } You("engulf %s!", mon_nam(mdef)); delay_output(); delay_output(); } STATIC_OVL void end_engulf() { if (!Invisible) { tmp_at(DISP_END, 0); newsym(u.ux, u.uy); } } STATIC_OVL int gulpum(mdef,mattk) register struct monst *mdef; register struct attack *mattk; { register int tmp; register int dam = d((int)mattk->damn, (int)mattk->damd); struct obj *otmp; /* Not totally the same as for real monsters. Specifically, these * don't take multiple moves. (It's just too hard, for too little * result, to program monsters which attack from inside you, which * would be necessary if done accurately.) Instead, we arbitrarily * kill the monster immediately for AD_DGST and we regurgitate them * after exactly 1 round of attack otherwise. -KAA */ if(mdef->data->msize >= MZ_HUGE) return 0; if(u.uhunger < 1500 && !u.uswallow) { 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 static char msgbuf[BUFSZ]; #endif start_engulf(mdef); switch(mattk->adtyp) { case AD_DGST: /* eating a Rider or its corpse is fatal */ if (is_rider(mdef->data)) { pline("Unfortunately, digesting any of it is fatal."); end_engulf(); Sprintf(msgbuf, "unwisely tried to eat %s", mdef->data->mname); killer = msgbuf; killer_format = NO_KILLER_PREFIX; done(DIED); return 0; /* lifesaved */ } if (Slow_digestion) { dam = 0; break; } /* KMH, conduct */ u.uconduct.food++; if (!vegan(mdef->data)) u.uconduct.unvegan++; if (!vegetarian(mdef->data)) violated_vegetarian(); /* Use up amulet of life saving */ if (!!(otmp = mlifesaver(mdef))) m_useup(mdef, otmp); 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 * if his See_invisible wears off */ You("digest %s.", mon_nam(mdef)); if (Slow_digestion) tmp *= 2; nomul(-tmp); nomovemsg = msgbuf; } else pline("%s", msgbuf); if (mdef->data == &mons[PM_GREEN_SLIME]) { Sprintf(msgbuf, "%s isn't sitting well with you.", The(mdef->data->mname)); if (!Unchanging) { Slimed = 5L; flags.botl = 1; } } else exercise(A_CON, TRUE); } end_engulf(); return(2); case AD_PHYS: if (youmonst.data == &mons[PM_FOG_CLOUD]) { pline("%s is laden with your moisture.", Monnam(mdef)); if (amphibious(mdef->data) && !flaming(mdef->data)) { dam = 0; pline("%s seems unharmed.", Monnam(mdef)); } } else pline("%s is pummeled with your debris!", Monnam(mdef)); break; case AD_ACID: pline("%s is covered with your goo!", Monnam(mdef)); if (resists_acid(mdef)) { pline("It seems harmless to %s.", mon_nam(mdef)); dam = 0; } break; case AD_BLND: if (can_blnd(&youmonst, mdef, mattk->aatyp, (struct obj *)0)) { if (mdef->mcansee) pline("%s can't see in there!", Monnam(mdef)); mdef->mcansee = 0; dam += mdef->mblinded; if (dam > 127) dam = 127; mdef->mblinded = dam; } dam = 0; break; case AD_ELEC: if (rn2(2)) { pline_The("air around %s crackles with electricity.", mon_nam(mdef)); if (resists_elec(mdef)) { pline("%s seems unhurt.", Monnam(mdef)); dam = 0; } golemeffects(mdef,(int)mattk->adtyp,dam); } else dam = 0; break; case AD_COLD: if (rn2(2)) { if (resists_cold(mdef)) { pline("%s seems mildly chilly.", Monnam(mdef)); dam = 0; } else pline("%s is freezing to death!",Monnam(mdef)); golemeffects(mdef,(int)mattk->adtyp,dam); } else dam = 0; break; case AD_FIRE: if (rn2(2)) { if (resists_fire(mdef)) { pline("%s seems mildly hot.", Monnam(mdef)); dam = 0; } else pline("%s is burning to a crisp!",Monnam(mdef)); golemeffects(mdef,(int)mattk->adtyp,dam); } else dam = 0; break; } end_engulf(); if ((mdef->mhp -= dam) <= 0) { killed(mdef); if (mdef->mhp <= 0) /* not lifesaved */ return(2); } You("%s %s!", is_animal(youmonst.data) ? "regurgitate" : "expel", mon_nam(mdef)); if (Slow_digestion || is_animal(youmonst.data)) { pline("Obviously, you didn't like %s taste.", s_suffix(mon_nam(mdef))); } } else { char kbuf[BUFSZ]; You("bite into %s.", mon_nam(mdef)); Sprintf(kbuf, "swallowing %s whole", an(mdef->data->mname)); instapetrify(kbuf); } } return(0); } void missum(mdef, target, roll, mattk) register struct monst *mdef; register struct attack *mattk; register int target; register int roll; { register boolean nearmiss = (target == roll); register struct obj *blocker = (struct obj *)0; long mwflags = mdef->misc_worn_check; /* 3 values for blocker * No blocker: (struct obj *) 0 * Piece of armour: object */ /* This is a hack, since there is no fast equivalent for uarm, uarms, etc. * Technically, we really should check from the inside out... */ if (target < roll) { for (blocker = mdef->minvent; blocker; blocker = blocker->nobj) { if (blocker->owornmask & mwflags) { target += ARM_BONUS(blocker); if (target > roll) break; } } } if (could_seduce(&youmonst, mdef, mattk)) { You("pretend to be friendly to %s.", mon_nam(mdef)); } else if(canspotmon(mdef) && flags.verbose) { if (nearmiss || !blocker) { You("%smiss %s.", (nearmiss ? "just " : ""),mon_nam(mdef)); } else { /* Blocker */ pline("%s %s %s your attack.", s_suffix(Monnam(mdef)), aobjnam(blocker, (char *)0), (rn2(2) ? "blocks" : "deflects")); } } else { You("%smiss it.", ((flags.verbose && nearmiss) ? "just " : "")); } if (!mdef->msleeping && mdef->mcanmove) wakeup(mdef); } /* * [WAC] This code now handles twoweapon in the following way: * -monster with one or 2 AT_WEAP can get primary and secondary attacks * -monster with AT_WEAP and another hand attack(s) will lose one * of the other hand attacks * -monster with several hand attacks will do primary weapon and secondary * weapon attacks with the first 2 hand attacks, then claw attacks * for the rest * -Code assumes that a single AT_WEAP or 2 AT_WEAP entries still mean * at most 1 or 2 hands attack. i.e. 1 handed monsters with AT_WEAP * or monsters with 3+ handed monsters where more than 2 hands are * AT_WEAP are not handled properly * (I don't think any exist yet) * This code now handles ALL hand to hand whether you are poly'ed or not * (uses your current race as the monster type) * * [ALI] Returns TRUE if you hit (and maybe killed) the monster. */ STATIC_OVL boolean hmonas(mon, tmp) /* attack monster as a monster. */ register struct monst *mon; register int tmp; { struct attack *mattk, alt_attk; int i, sum[NATTK]; #if 0 int hittmp = 0; #endif int nsum = 0; int dhit = 0; int mhit = 0; /* Used to pass the attacks used */ int tmp1, tmp2; boolean Old_Upolyd = Upolyd; static const int hit_touch[] = {0, HIT_BODY, HIT_BODY|HIT_FATAL}; static const int hit_notouch[] = {0, HIT_OTHER, HIT_OTHER|HIT_FATAL}; /* Keeps track of which weapon hands have been used */ boolean used_uwep = FALSE; for(i = 0; i < NATTK; i++) { mhit = 0; /* Clear all previous attacks */ sum[i] = 0; mattk = getmattk(youmonst.data, i, sum, &alt_attk); switch(mattk->aatyp) { case AT_WEAP: use_weapon: /* Certain monsters don't use weapons when encountered as enemies, * but players who polymorph into them have hands or claws and thus * should be able to use weapons. This shouldn't prohibit the use * of most special abilities, either. */ /* Potential problem: if the monster gets multiple weapon attacks, * we currently allow the player to get each of these as a weapon * attack. Is this really desirable? * [WAC] See Above ... anyways, this was changed in 3.3.0 so that * only attack 0 would give a weapon attack... * [ALI] Most monsters should get multiple weapon attacks since they * only have two hands. There are exceptions such as mariliths which * should get two weapon attacks and four barehanded attacks. Such * monsters should be special cased in AT_CLAW below. */ mhit = used_uwep ? HIT_USWAPWEP : HIT_UWEP; used_uwep = !used_uwep; if (mhit == HIT_USWAPWEP && !u.twoweap) continue; /* Skip this attack */ /* WAC if attacking cockatrice/etc, player is smart if wielding a weapon. So don't let him touch the monster */ if ((uwep || u.twoweap && uswapwep) && (mhit == HIT_UWEP && !uwep || mhit == HIT_USWAPWEP && !uswapwep) && (touch_petrifies(mon->data) || mon->data == &mons[PM_MEDUSA])) break; dhit = mhit; /* Clear the miss counter as attacks miss */ tmp1 = tmp2 = tmp; #ifdef DEBUG pline("%i/20", tmp); #endif if (mhit & HIT_UWEP) { if (uwep) tmp1 = tmp + hitval(uwep, mon); tohit(UWEP_ROLL) = tmp1; if (tmp1 <= (dice(UWEP_ROLL) = rnd(20)) && !u.uswallow) dhit &= ~HIT_UWEP; /* missed */ if (tmp1 > dice(UWEP_ROLL)) exercise(A_DEX, TRUE); #ifdef DEBUG pline("(%i/20)", tmp1); #endif } if (mhit & HIT_USWAPWEP) { if (uswapwep) tmp2 = tmp + hitval(uswapwep, mon) - 2; tohit(USWAPWEP_ROLL) = tmp2; if (tmp2 <= (dice(USWAPWEP_ROLL) = rnd(20)) && !u.uswallow) dhit &= ~HIT_USWAPWEP; if (tmp2 > dice(USWAPWEP_ROLL)) exercise(A_DEX, TRUE); #ifdef DEBUG pline("((%i/20))", tmp2); #endif } if (dhit && mattk->adtyp == AD_SLEE) barehanded_hit = (dhit & HIT_UWEP) && !uwep || (dhit & HIT_USWAPWEP) && !uswapwep; #if 0 /* Old code */ if (uwep) { hittmp = hitval(uwep, mon); hittmp += weapon_hit_bonus(uwep); tmp += hittmp; } if (tmp > (dice(UWEP_ROLL) = rnd(20)) || u.uswallow) dhit = HIT_UWEP; else dhit = 0; /* KMH -- Don't accumulate to-hit bonuses */ if (uwep) tmp -= hittmp; #endif /* Enemy dead, before any special abilities used */ if (!known_hitum(mon,mhit,&dhit,mattk)) { sum[i] = dhit | HIT_FATAL; 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 * already did it. */ if (dhit && mattk->adtyp != AD_SPEL && mattk->adtyp != AD_PHYS) if (damageum(mon,mattk) == 2) sum[i] |= HIT_FATAL; break; case AT_CLAW: if (!cantwield(youmonst.data) && u.umonnum != PM_MARILITH) goto use_weapon; #ifdef SEDUCE #if 0 /* Shouldn't matter where the first AT_CLAW is anymore /* succubi/incubi are humanoid, but their _second_ * attack is AT_CLAW, not their first... */ if (i==1 && uwep && (u.umonnum == PM_SUCCUBUS || u.umonnum == PM_INCUBUS)) goto use_weapon; #endif #endif case AT_BITE: /* [ALI] Vampires are also smart. They avoid biting monsters if doing so would be fatal */ if ((uwep || u.twoweap && uswapwep) && is_vampire(youmonst.data) && (is_rider(mon->data) || mon->data == &mons[PM_GREEN_SLIME])) break; case AT_STNG: case AT_TUCH: case AT_BUTT: case AT_TENT: if (i==0 && uwep && (youmonst.data->mlet==S_LICH)) goto use_weapon; if ((uwep || u.twoweap && uswapwep) && (touch_petrifies(mon->data) || mon->data == &mons[PM_MEDUSA])) break; case AT_KICK: if ((dhit = (tmp > (dieroll = rnd(20)) || u.uswallow)) != 0) { int compat; if (!u.uswallow && (compat=could_seduce(&youmonst, mon, mattk))) { You("%s %s %s.", mon->mcansee && haseyes(mon->data) ? "smile at" : "talk to", mon_nam(mon), compat == 2 ? "engagingly":"seductively"); /* doesn't anger it; no wakeup() */ sum[i] = hit_notouch[damageum(mon, mattk)]; break; } wakeup(mon); /* maybe this check should be in damageum()? */ if (mon->data == &mons[PM_SHADE] && !(mattk->aatyp == AT_KICK && uarmf && uarmf->blessed)) { Your("attack passes harmlessly through %s.", mon_nam(mon)); break; } if (mattk->aatyp == AT_KICK) You("kick %s.", mon_nam(mon)); else if (mattk->aatyp == AT_BITE) You("bite %s.", mon_nam(mon)); else if (mattk->aatyp == AT_STNG) You("sting %s.", mon_nam(mon)); else if (mattk->aatyp == AT_BUTT) You("butt %s.", mon_nam(mon)); else if (mattk->aatyp == AT_TUCH) You("touch %s.", mon_nam(mon)); else if (mattk->aatyp == AT_TENT) Your("tentacles suck %s.", mon_nam(mon)); else You("hit %s.", mon_nam(mon)); sum[i] = hit_touch[damageum(mon, mattk)]; } else missum(mon, tmp, dieroll, mattk); break; case AT_HUGS: /* automatic if prev two attacks succeed, or if * already grabbed in a previous attack */ dhit = 1; wakeup(mon); if (mon->data == &mons[PM_SHADE]) Your("hug passes harmlessly through %s.", mon_nam(mon)); else if (!sticks(mon->data) && !u.uswallow) { if (mon==u.ustuck) { pline("%s is being %s.", Monnam(mon), u.umonnum==PM_ROPE_GOLEM ? breathless(mon->data) ? "strangled" : "choked" : "crushed"); sum[i] = hit_touch[damageum(mon, mattk)]; } else if(i >= 2 && sum[i-1] && sum[i-2]) { You("grab %s!", mon_nam(mon)); setustuck(mon); sum[i] = hit_touch[damageum(mon, mattk)]; } } break; case AT_EXPL: /* automatic hit if next to */ dhit = -1; wakeup(mon); sum[i] = hit_notouch[explum(mon, mattk)]; break; case AT_ENGL: if((dhit = (tmp > (dieroll = rnd(20+i))))) { wakeup(mon); if (mon->data == &mons[PM_SHADE]) Your("attempt to surround %s is harmless.", mon_nam(mon)); else { sum[i]= hit_touch[gulpum(mon,mattk)]; if (sum[i] & HIT_FATAL && (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, tmp, dieroll, mattk); break; case AT_MAGC: /* No check for uwep; if wielding nothing we want to * do the normal 1-2 points bare hand damage... */ if (i == 0 && (youmonst.data->mlet==S_KOBOLD || youmonst.data->mlet==S_ORC || youmonst.data->mlet==S_GNOME )) goto use_weapon; case AT_NONE: case AT_BOOM: continue; /* Not break--avoid passive attacks from enemy */ case AT_BREA: case AT_SPIT: dhit = 0; break; case AT_GAZE: /* WAC -- can be either ranged attack OR close */ if (Blind) { dhit = 0; break; } if (!canseemon(mon) && rn2(3)) { You("gaze around, but miss!"); dhit = 0; break; } You("gaze at %s...", mon_nam(mon)); if ((mon->data==&mons[PM_MEDUSA]) && !mon->mcan) { pline("Gazing at the awake Medusa is not a very good idea."); /* as if gazing at a sleeping anything is fruitful... */ You("turn to stone..."); killer_format = KILLED_BY; killer = "deliberately gazing at Medusa's hideous countenance"; done(STONING); } else if (!mon->mcansee || mon->msleeping) { pline("But nothing happens."); dhit = 0; break; } else if (Invis && !perceives(mon->data)) { pline("%s seems not to notice your gaze.", Monnam(mon)); break; } sum[i] = hit_notouch[damageum(mon, mattk)]; break; case AT_MULTIPLY: /* Not a #monster ability -- this is something that the * player must figure out -RJ */ cloneu(); break; default: /* Strange... */ impossible("strange attack of yours (%d)", mattk->aatyp); } if (dhit == -1) { u.mh = -1; /* dead in the current form */ rehumanize(); } if (sum[i] & HIT_FATAL) return((boolean)passive(mon, sum[i], 0, mattk->aatyp)); /* defender dead */ else { (void) passive(mon, sum[i], 1, mattk->aatyp); nsum |= sum[i]; } if (Upolyd != Old_Upolyd) break; /* No extra attacks if no longer a monster */ if (multi < 0) break; /* If paralyzed while attacking, i.e. floating eye */ } return((boolean)(nsum != 0)); } /* Special (passive) attacks on you by monsters done here. */ int passive(mon, mhit, malive, aatyp) register struct monst *mon; register int mhit; register int malive; uchar aatyp; { register struct permonst *ptr = mon->data; register int i, tmp; struct obj *target = mhit & HIT_UWEP ? uwep : mhit & HIT_USWAPWEP ? uswapwep : (struct obj *)0; /* char buf[BUFSZ]; */ if (mhit && aatyp == AT_BITE && is_vampire(youmonst.data)) { if (bite_monster(mon)) return 2; /* lifesaved */ } for(i = 0; ; i++) { if(i >= NATTK) return(malive | mhit); /* no passive attacks */ if(ptr->mattk[i].aatyp == AT_NONE /*|| ptr->mattk[i].aatyp == AT_BOOM*/) break; /* try this one */ } /* Note: tmp not always used */ if (ptr->mattk[i].damn) tmp = d((int)ptr->mattk[i].damn, (int)ptr->mattk[i].damd); else if(ptr->mattk[i].damd) tmp = d((int)mon->m_lev+1, (int)ptr->mattk[i].damd); else tmp = 0; /* These affect you even if they just died */ switch(ptr->mattk[i].adtyp) { case AD_ACID: if(mhit && rn2(2)) { if (Blind || !flags.verbose) You("are splashed!"); else You("are splashed by %s acid!", s_suffix(mon_nam(mon))); if (!Acid_resistance) 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, target, &(ptr->mattk[i])); } exercise(A_STR, FALSE); break; case AD_STON: if (mhit) { /* successful attack */ long protector = attk_protection((int)aatyp); boolean barehanded = mhit & HIT_BODY || mhit & HIT_UWEP && !uwep || mhit & HIT_USWAPWEP && !uswapwep; /* hero using monsters' AT_MAGC attack is hitting hand to hand rather than casting a spell */ if (aatyp == AT_MAGC) protector = W_ARMG; if (protector == 0L || /* no protection */ (protector == W_ARMG && !uarmg && barehanded) || (protector == W_ARMF && !uarmf) || (protector == W_ARMH && !uarmh) || (protector == (W_ARMC|W_ARMG) && (!uarmc || !uarmg))) { if (!Stone_resistance && !(poly_when_stoned(youmonst.data) && polymon(PM_STONE_GOLEM))) { You("turn to stone..."); done_in_by(mon); return 2; } } } 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, target, &(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, target, &(ptr->mattk[i])); } break; case AD_MAGM: /* wrath of gods for attacking Oracle */ if(Antimagic) { shieldeff(u.ux, u.uy); pline("A hail of magic missiles narrowly misses you!"); } else { You("are hit by magic missiles appearing from thin air!"); mdamageu(mon, tmp); } break; default: break; } /* These only affect you if they still live */ if(malive && !mon->mcan && rn2(3)) { switch(ptr->mattk[i].adtyp) { case AD_DRST: if (!Strangled && !Breathless) { pline("You inhale a cloud of spores!"); poisoned("spores", A_STR, "spore cloud", 30); } else { pline("A cloud of spores surrounds you!"); } break; case AD_PLYS: if(ptr == &mons[PM_FLOATING_EYE]) { if (!canseemon(mon)) { break; } if(mon->mcansee) { if (ureflects("%s gaze is reflected by your %s.", s_suffix(Monnam(mon)))) ; else if (Free_action) You("momentarily stiffen under %s gaze!", s_suffix(mon_nam(mon))); else { You("are frozen by %s gaze!", s_suffix(mon_nam(mon))); nomul((ACURR(A_WIS) > 12 || rn2(4)) ? -tmp : -127); } } else { pline("%s cannot defend itself.", Adjmonnam(mon,"blind")); if(!rn2(500)) change_luck(-1); } } else if (Free_action) { 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); } break; case AD_COLD: /* brown mold or blue jelly */ if(monnear(mon, u.ux, u.uy)) { if(Cold_resistance) { shieldeff(u.ux, u.uy); You_feel("a mild chill."); ugolemeffects(AD_COLD, tmp); break; } You("are suddenly very cold!"); mdamageu(mon, tmp); /* monster gets stronger with your heat! */ mon->mhp += tmp / 2; if (mon->mhpmax < mon->mhp) mon->mhpmax = mon->mhp; /* at a certain point, the monster will reproduce! */ if(mon->mhpmax > ((int) (mon->m_lev+1) * 8)) (void)split_mon(mon, &youmonst); } break; case AD_STUN: /* specifically yellow mold */ if(!Stunned) make_stunned((long)tmp, TRUE); break; case AD_FIRE: if(monnear(mon, u.ux, u.uy)) { if(Fire_resistance) { shieldeff(u.ux, u.uy); You_feel("mildly warm."); ugolemeffects(AD_FIRE, tmp); break; } You("are suddenly very hot!"); mdamageu(mon, tmp); } break; case AD_ELEC: if(Shock_resistance) { shieldeff(u.ux, u.uy); You_feel("a mild tingle."); ugolemeffects(AD_ELEC, tmp); break; } You("are jolted with electricity!"); mdamageu(mon, tmp); break; case AD_ENCH: /* KMH -- remove enchantment (disenchanter) */ if (mhit) { struct obj *obj = target; if (aatyp == AT_KICK) { obj = uarmf; if (!obj) break; } else if (aatyp == AT_BITE || aatyp == AT_BUTT || (aatyp >= AT_STNG && aatyp < AT_WEAP)) { break; /* no object involved */ } else if (!obj && mhit & (HIT_UWEP | HIT_USWAPWEP)) obj = uarmg; passive_obj(mon, obj, &(ptr->mattk[i])); } break; default: break; } } 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 0 /* 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 */ } #else /* In Slash'EM, the caller always specifies the object */ if (!obj) return; /* no object to affect */ #endif /* 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) struct monst *mtmp; { const char *fmt = "Wait! That's %s!", *generic = "a monster", *what = 0; if(!u.ustuck && !mtmp->mflee && dmgtype(mtmp->data,AD_STCK)) setustuck(mtmp); if (Blind) { if (!Blind_telepat) what = generic; /* with default fmt */ else if (mtmp->m_ap_type == M_AP_MONSTER) what = a_monnam(mtmp); /* differs from what was sensed */ } else { #ifdef DISPLAY_LAYERS if (levl[u.ux+u.dx][u.uy+u.dy].mem_bg == S_hcdoor || levl[u.ux+u.dx][u.uy+u.dy].mem_bg == S_vcdoor) fmt = "The door actually was %s!"; else if (levl[u.ux+u.dx][u.uy+u.dy].mem_obj == GOLD_PIECE) fmt = "That gold was %s!"; #else int glyph = levl[u.ux+u.dx][u.uy+u.dy].glyph; if (glyph_is_cmap(glyph) && (glyph_to_cmap(glyph) == S_hcdoor || glyph_to_cmap(glyph) == S_vcdoor)) fmt = "The door actually was %s!"; else if (glyph_is_object(glyph) && glyph_to_obj(glyph) == GOLD_PIECE) fmt = "That gold was %s!"; #endif /* cloned Wiz starts out mimicking some other monster and might make himself invisible before being revealed */ if (mtmp->minvis && !See_invisible) what = generic; else what = a_monnam(mtmp); } if (what) pline(fmt, what); wakeup(mtmp); /* clears mimicking */ } STATIC_OVL void nohandglow(mon) struct monst *mon; { char *hands=makeplural(body_part(HAND)); if (!u.umconf || mon->mconf) return; if (u.umconf == 1) { if (Blind) Your("%s stop tingling.", hands); else Your("%s stop glowing %s.", hands, hcolor(NH_RED)); } else { if (Blind) pline_The("tingling in your %s lessens.", hands); else Your("%s no longer glow so brightly %s.", hands, hcolor(NH_RED)); } u.umconf--; } int flash_hits_mon(mtmp, otmp) struct monst *mtmp; struct obj *otmp; /* source of flash */ { int tmp, amt, res = 0, useeit = canseemon(mtmp); if (mtmp->msleeping) { mtmp->msleeping = 0; if (useeit) { pline_The("flash awakens %s.", mon_nam(mtmp)); res = 1; } } else if (mtmp->data->mlet != S_LIGHT) { if (!resists_blnd(mtmp)) { tmp = dist2(otmp->ox, otmp->oy, mtmp->mx, mtmp->my); if (useeit) { pline("%s is blinded by the flash!", Monnam(mtmp)); res = 1; } if (mtmp->data == &mons[PM_GREMLIN]) { /* Rule #1: Keep them out of the light. */ amt = otmp->otyp == WAN_LIGHT ? d(1 + otmp->spe, 4) : rn2(min(mtmp->mhp,4)); pline("%s %s!", Monnam(mtmp), amt > mtmp->mhp / 2 ? "wails in agony" : "cries out in pain"); if ((mtmp->mhp -= amt) <= 0) { if (flags.mon_moving) monkilled(mtmp, (char *)0, AD_BLND); else killed(mtmp); } else if (cansee(mtmp->mx,mtmp->my) && !canspotmon(mtmp)){ map_invisible(mtmp->mx, mtmp->my); } } 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); } } } return res; } /*uhitm.c*/ slashem-0.0.7E7F3/src/mhitm.c0000644000076400007640000017007210545462317013732 0ustar aliali/* SCCS Id: @(#)mhitm.c 3.4 2003/01/02 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" #include "artifact.h" #include "edog.h" extern boolean notonhead; extern const char *breathwep[]; /* from mthrowu.c */ #define POLE_LIM 5 /* How far monsters can use pole-weapons */ #ifdef OVLB static NEARDATA boolean vis, far_noise; static NEARDATA long noisetime; static NEARDATA struct obj *otmp; static const char brief_feeling[] = "have a %s feeling for a moment, then it passes."; STATIC_DCL char *FDECL(mon_nam_too, (char *,struct monst *,struct monst *)); STATIC_DCL void FDECL(mrustm, (struct monst *, struct monst *, struct obj *)); STATIC_DCL int FDECL(breamm, (struct monst *, struct monst *, struct attack *)); STATIC_DCL int FDECL(spitmm, (struct monst *, struct monst *, struct attack *)); STATIC_DCL int FDECL(thrwmm, (struct monst *, struct monst *)); STATIC_DCL int FDECL(hitmm, (struct monst *,struct monst *,struct attack *)); STATIC_DCL int FDECL(gazemm, (struct monst *,struct monst *,struct attack *)); STATIC_DCL int FDECL(gulpmm, (struct monst *,struct monst *,struct attack *)); STATIC_DCL int FDECL(explmm, (struct monst *,struct monst *,struct attack *)); STATIC_DCL int FDECL(mdamagem, (struct monst *,struct monst *,struct attack *)); STATIC_DCL void FDECL(mswingsm, (struct monst *, struct monst *, struct obj *)); STATIC_DCL void FDECL(noises,(struct monst *,struct attack *)); STATIC_DCL void FDECL(missmm,(struct monst *,struct monst *, int, int, struct attack *)); STATIC_DCL int FDECL(passivemm, (struct monst *, struct monst *, BOOLEAN_P, int)); /* Needed for the special case of monsters wielding vorpal blades (rare). * If we use this a lot it should probably be a parameter to mdamagem() * instead of a global variable. */ static int dieroll; /* returns mon_nam(mon) relative to other_mon; normal name unless they're the same, in which case the reference is to {him|her|it} self */ STATIC_OVL char * mon_nam_too(outbuf, mon, other_mon) char *outbuf; struct monst *mon, *other_mon; { Strcpy(outbuf, mon_nam(mon)); if (mon == other_mon) switch (pronoun_gender(mon)) { case 0: Strcpy(outbuf, "himself"); break; case 1: Strcpy(outbuf, "herself"); break; default: Strcpy(outbuf, "itself"); break; } return outbuf; } STATIC_OVL void noises(magr, mattk) register struct monst *magr; register struct attack *mattk; { boolean farq = (distu(magr->mx, magr->my) > 15); if(flags.soundok && (farq != far_noise || moves-noisetime > 10)) { far_noise = farq; noisetime = moves; You_hear("%s%s.", (mattk->aatyp == AT_EXPL) ? "an explosion" : "some noises", farq ? " in the distance" : ""); } } STATIC_OVL void missmm(magr, mdef, target, roll, mattk) register struct monst *magr, *mdef; struct attack *mattk; int target, roll; { boolean nearmiss = (target == roll); const char *fmt; char buf[BUFSZ], mon_name[BUFSZ]; register struct obj *blocker = (struct obj *)0; long mwflags = mdef->misc_worn_check; /* 3 values for blocker * No blocker: (struct obj *) 0 * Piece of armour: object */ /* This is a hack, since there is no fast equivalent for uarm, uarms, etc. * Technically, we really should check from the inside out... */ if (target < roll) { for (blocker = mdef->minvent; blocker; blocker = blocker->nobj) { if (blocker->owornmask & mwflags) { target += ARM_BONUS(blocker); if (target > roll) break; } } } if (vis) { if (!canspotmon(magr)) map_invisible(magr->mx, magr->my); if (!canspotmon(mdef)) map_invisible(mdef->mx, mdef->my); if (mdef->m_ap_type) seemimic(mdef); if (magr->m_ap_type) seemimic(magr); if (flags.verbose && !nearmiss && blocker) { fmt = "%s %s blocks"; Sprintf(buf,fmt, s_suffix(Monnam(mdef)), aobjnam(blocker, (char *)0)); pline("%s %s.", buf, mon_nam_too(mon_name, magr, mdef)); } else { fmt = (could_seduce(magr,mdef,mattk) && !magr->mcan) ? "%s pretends to be friendly to" : ((flags.verbose && nearmiss) ? "%s just misses" : "%s misses"); Sprintf(buf, fmt, Monnam(magr)); pline("%s %s.", buf, mon_nam_too(mon_name, mdef, magr)); } } else noises(magr, mattk); } /* * fightm() -- fight some other monster * * Returns: * 0 - Monster did nothing. * 1 - If the monster made an attack. The monster might have died. * * There is an exception to the above. If mtmp has the hero swallowed, * then we report that the monster did nothing so it will continue to * digest the hero. */ int fightm(mtmp) /* have monsters fight each other */ register struct monst *mtmp; { register struct monst *mon, *nmon; int result, has_u_swallowed; #ifdef LINT nmon = 0; #endif /* perhaps the monster will resist Conflict */ if(resist(mtmp, RING_CLASS, 0, 0)) return(0); if(u.ustuck == mtmp) { /* perhaps we're holding it... */ if(itsstuck(mtmp)) return(0); } has_u_swallowed = (u.uswallow && (mtmp == u.ustuck)); for(mon = fmon; mon; mon = nmon) { nmon = mon->nmon; if(nmon == mtmp) nmon = mtmp->nmon; /* Be careful to ignore monsters that are already dead, since we * might be calling this before we've cleaned them up. This can * happen if the monster attacked a cockatrice bare-handedly, for * instance. */ if(mon != mtmp && !DEADMONSTER(mon)) { if(monnear(mtmp,mon->mx,mon->my)) { if(!u.uswallow && (mtmp == u.ustuck)) { if(!rn2(4)) { pline("%s releases you!", Monnam(mtmp)); setustuck(0); } else break; } /* mtmp can be killed */ bhitpos.x = mon->mx; bhitpos.y = mon->my; notonhead = 0; result = mattackm(mtmp,mon); if (result & MM_AGR_DIED) return 1; /* mtmp died */ /* * If mtmp has the hero swallowed, lie and say there * was no attack (this allows mtmp to digest the hero). */ if (has_u_swallowed) return 0; /* Allow attacked monsters a chance to hit back. Primarily * to allow monsters that resist conflict to respond. */ if ((result & MM_HIT) && !(result & MM_DEF_DIED) && rn2(4) && mon->movement >= NORMAL_SPEED) { mon->movement -= NORMAL_SPEED; notonhead = 0; (void) mattackm(mon, mtmp); /* return attack */ } return ((result & MM_HIT) ? 1 : 0); } } } return 0; } /* * mattackm() -- a monster attacks another monster. * * This function returns a result bitfield: * * --------- aggressor died * / ------- defender died * / / ----- defender was hit * / / / * x x x * * 0x4 MM_AGR_DIED * 0x2 MM_DEF_DIED * 0x1 MM_HIT * 0x0 MM_MISS * * Each successive attack has a lower probability of hitting. Some rely on the * success of previous attacks. ** this doen't seem to be implemented -dl ** * * In the case of exploding monsters, the monster dies as well. */ int mattackm(magr, mdef) register struct monst *magr,*mdef; { int i, /* loop counter */ tmp, /* amour class difference */ strike, /* hit this attack */ 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; /* * Pets don't use "ranged" attacks for fear of hitting their master */ boolean range; if (!magr || !mdef) return(MM_MISS); /* mike@genat */ if (!magr->mcanmove || magr->msleeping) return(MM_MISS); pa = magr->data; pd = mdef->data; /* Grid bugs cannot attack at an angle. */ if (pa == &mons[PM_GRID_BUG] && magr->mx != mdef->mx && magr->my != mdef->my) return(MM_MISS); range = !magr->mtame && !monnear(magr, mdef->mx, mdef->my); /* Calculate the armour class differential. */ tmp = find_mac(mdef) + magr->m_lev; if (mdef->mconf || !mdef->mcanmove || mdef->msleeping) { tmp += 4; mdef->msleeping = 0; } /* undetect monsters become un-hidden if they are attacked */ if (mdef->mundetected) { mdef->mundetected = 0; newsym(mdef->mx, mdef->my); if(canseemon(mdef) && !sensemon(mdef)) { if (u.usleep) You("dream of %s.", (mdef->data->geno & G_UNIQ) ? a_monnam(mdef) : makeplural(m_monnam(mdef))); else pline("Suddenly, you notice %s.", a_monnam(mdef)); } } /* Elves hate orcs. */ if (is_elf(pa) && is_orc(pd)) tmp++; /* Set up the visibility of action */ vis = (cansee(magr->mx,magr->my) && cansee(mdef->mx,mdef->my) && (canspotmon(magr) || canspotmon(mdef))); /* Set flag indicating monster has moved this turn. Necessary since a * monster might get an attack out of sequence (i.e. before its move) in * some cases, in which case this still counts as its move for the round * and it shouldn't move again. */ magr->mlstmv = monstermoves; /* 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) { case AT_BREA: case AT_SPIT: if (range) { if (mattk->aatyp == AT_BREA) res[i] = breamm(magr, mdef, mattk); else res[i] = spitmm(magr, mdef, mattk); /* We can't distinguish no action from failed attack * so assume defender doesn't waken unless actually hit. */ strike = res[i] & MM_HIT; } else strike = 0; attk = 0; break; case AT_MAGC: /* [ALI] Monster-on-monster spell casting always fails. This * is partly for balance reasons and partly because the * amount of code required to implement it is prohibitive. */ strike = 0; attk = 0; if (canseemon(magr) && couldsee(magr->mx, magr->my)) { char buf[BUFSZ]; Strcpy(buf, Monnam(magr)); if (vis) pline("%s points at %s, then curses.", buf, mon_nam(mdef)); else pline("%s points and curses at something.", buf); } else if (flags.soundok) Norep("You hear a mumbled curse."); break; case AT_WEAP: /* "ranged" attacks */ #ifdef REINCARNATION if (!Is_rogue_level(&u.uz) && range) { #else if (range) { #endif res[i] = thrwmm(magr, mdef); attk = 0; strike = res[i] & MM_HIT; break; } /* "hand to hand" attacks */ if (magr->weapon_check == NEED_WEAPON || !MON_WEP(magr)) { magr->weapon_check = NEED_HTH_WEAPON; if (mon_wield_item(magr) != 0) return 0; } possibly_unwield(magr, FALSE); otmp = MON_WEP(magr); if (otmp) { if (vis) mswingsm(magr, mdef, otmp); tmp += hitval(otmp, mdef); } /* fall through */ case AT_CLAW: case AT_KICK: case AT_BITE: case AT_STNG: case AT_TUCH: case AT_BUTT: case AT_TENT: /* Nymph that teleported away on first attack? */ if (distmin(magr->mx,magr->my,mdef->mx,mdef->my) > 1) return MM_MISS; /* Monsters won't attack cockatrices physically if they * have a weapon instead. This instinct doesn't work for * players, or under conflict or confusion. */ if (!magr->mconf && !Conflict && otmp && mattk->aatyp != AT_WEAP && touch_petrifies(mdef->data)) { strike = 0; break; } dieroll = rnd(20 + i); strike = (tmp > dieroll); 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, 0, 0)) { if (vis) { char buf[BUFSZ]; Strcpy(buf, Monnam(mdef)); pline("%s divides as %s hits it!", buf, mon_nam(magr)); } } } } else missmm(magr, mdef, tmp, dieroll, mattk); /* KMH -- don't accumulate to-hit bonuses */ if (otmp) tmp -= hitval(otmp, mdef); break; case AT_HUGS: /* automatic if prev two attacks succeed */ strike = (i >= 2 && res[i-1] == MM_HIT && res[i-2] == MM_HIT); if (strike) res[i] = hitmm(magr, mdef, mattk); break; case AT_GAZE: strike = 0; /* will not wake up a sleeper */ res[i] = gazemm(magr, mdef, mattk); break; case AT_EXPL: res[i] = explmm(magr, mdef, mattk); if (res[i] == MM_MISS) { /* cancelled--no attack */ strike = 0; attk = 0; } else strike = 1; /* automatic hit */ break; case AT_ENGL: #ifdef STEED if (u.usteed && (mdef == u.usteed)) { strike = 0; break; } #endif /* Engulfing attacks are directed at the hero if * possible. -dlc */ if (u.uswallow && magr == u.ustuck) strike = 0; else { if ((strike = (tmp > (dieroll = rnd(20+i))))) res[i] = gulpmm(magr, mdef, mattk); else missmm(magr, mdef, tmp, dieroll, mattk); } break; default: /* no attack */ strike = 0; attk = 0; break; } if (attk && !(res[i] & MM_AGR_DIED)) res[i] = passivemm(magr, mdef, strike, res[i] & MM_DEF_DIED); if (res[i] & MM_DEF_DIED) return res[i]; /* * Wake up the defender. NOTE: this must follow the check * to see if the defender died. We don't want to modify * unallocated monsters! */ if (strike) mdef->msleeping = 0; if (res[i] & MM_AGR_DIED) return res[i]; /* return if aggressor can no longer attack */ if (!magr->mcanmove || magr->msleeping) return res[i]; if (res[i] & MM_HIT) struck = 1; /* at least one hit */ } return(struck ? MM_HIT : MM_MISS); } /* monster attempts breath attack against another monster */ STATIC_OVL int breamm(magr, mdef, mattk) struct monst *magr, *mdef; struct attack *mattk; { /* if new breath types are added, change AD_ACID to max type */ int typ = mattk->adtyp == AD_RBRE ? rnd(AD_ACID) : mattk->adtyp; int mhp; if (linedup(mdef->mx, mdef->my, magr->mx, magr->my)) { if (magr->mcan) { if (flags.soundok) { if (canseemon(magr)) pline("%s coughs.", Monnam(magr)); else You_hear("a cough."); } } else if (!magr->mspec_used && rn2(3)) { if (typ >= AD_MAGM && typ <= AD_ACID) { if (canseemon(magr)) pline("%s breathes %s!", Monnam(magr), breathwep[typ-1]); mhp = mdef->mhp; buzz((int)(-20 - (typ-1)), (int)mattk->damn, magr->mx, magr->my, sgn(tbx), sgn(tby)); nomul(0); /* breath runs out sometimes. */ if (!rn2(3)) magr->mspec_used = 10+rn2(20); return (mdef->mhp < 1 ? MM_DEF_DIED : 0) | (mdef->mhp < mhp ? MM_HIT : 0) | (magr->mhp < 1 ? MM_AGR_DIED : 0); } else impossible("Breath weapon %d used", typ-1); } } return MM_MISS; } /* monster attempts spit attack against another monster */ STATIC_OVL int spitmm(magr, mdef, mattk) struct monst *magr, *mdef; struct attack *mattk; { register struct obj *obj; int mhp; if (magr->mcan) { if (flags.soundok) { if (canseemon(magr)) pline("A dry rattle comes from %s throat.", s_suffix(mon_nam(magr))); else You_hear("a dry rattle."); } return MM_MISS; } if (linedup(mdef->mx, mdef->my, magr->mx, magr->my)) { switch (mattk->adtyp) { case AD_BLND: case AD_DRST: obj = mksobj(BLINDING_VENOM, TRUE, FALSE); break; default: impossible("bad attack type in spitmm"); /* fall through */ case AD_ACID: obj = mksobj(ACID_VENOM, TRUE, FALSE); break; } if (!rn2(BOLT_LIM - distmin(magr->mx, magr->my, mdef->mx, mdef->my))) { if (canseemon(magr)) pline("%s spits venom!", Monnam(magr)); mhp = mdef->mhp; m_throw(magr, magr->mx, magr->my, sgn(tbx), sgn(tby), distmin(magr->mx, magr->my, mdef->mx, mdef->my), obj); nomul(0); return (mdef->mhp < 1 ? MM_DEF_DIED : 0) | (mdef->mhp < mhp ? MM_HIT : 0) | (magr->mhp < 1 ? MM_AGR_DIED : 0); } } return MM_MISS; } /* monster attempts ranged weapon attack against another monster */ STATIC_OVL int thrwmm(magr, mdef) struct monst *magr, *mdef; { struct obj *obj, *mwep; schar skill; int multishot, mhp; const char *onm; /* Rearranged beginning so monsters can use polearms not in a line */ if (magr->weapon_check == NEED_WEAPON || !MON_WEP(magr)) { magr->weapon_check = NEED_RANGED_WEAPON; /* mon_wield_item resets weapon_check as appropriate */ if(mon_wield_item(magr) != 0) return MM_MISS; } /* Pick a weapon */ obj = select_rwep(magr); if (!obj) return MM_MISS; if (is_pole(obj)) { int dam, hitv, vis = canseemon(magr); if (dist2(magr->mx, magr->my, mdef->mx, mdef->my) > POLE_LIM || !m_cansee(magr, mdef->mx, mdef->my)) return MM_MISS; /* Out of range, or intervening wall */ if (vis) { onm = xname(obj); pline("%s thrusts %s.", Monnam(magr), obj_is_pname(obj) ? the(onm) : an(onm)); } dam = dmgval(obj, mdef); hitv = 3 - distmin(mdef->mx, mdef->my, magr->mx, magr->my); if (hitv < -4) hitv = -4; if (bigmonst(mdef->data)) hitv++; hitv += 8 + obj->spe; if (dam < 1) dam = 1; if (find_mac(mdef) + hitv <= rnd(20)) { if (flags.verbose && canseemon(mdef)) pline("It misses %s.", mon_nam(mdef)); else if (vis) pline("It misses."); return MM_MISS; } else { if (flags.verbose && canseemon(mdef)) pline("It hits %s%s", a_monnam(mdef), exclam(dam)); else if (vis) pline("It hits."); if (objects[obj->otyp].oc_material == SILVER && hates_silver(mdef->data) && canseemon(mdef)) { if (vis) pline_The("silver sears %s flesh!", s_suffix(mon_nam(mdef))); else pline("%s flesh is seared!", s_suffix(Monnam(mdef))); } mdef->mhp -= dam; if (mdef->mhp < 1) { if (canseemon(mdef)) pline("%s is %s!", Monnam(mdef), (nonliving(mdef->data) || !canspotmon(mdef)) ? "destroyed" : "killed"); mondied(mdef); return MM_DEF_DIED | MM_HIT; } else return MM_HIT; } } if (!linedup(mdef->mx, mdef->my, magr->mx, magr->my)) return MM_MISS; skill = objects[obj->otyp].oc_skill; mwep = MON_WEP(magr); /* wielded weapon */ if (ammo_and_launcher(obj, mwep) && objects[mwep->otyp].oc_range && dist2(magr->mx, magr->my, mdef->mx, mdef->my) > objects[mwep->otyp].oc_range * objects[mwep->otyp].oc_range) return MM_MISS; /* Out of range */ /* Multishot calculations */ multishot = 1; if ((ammo_and_launcher(obj, mwep) || skill == P_DAGGER || skill == -P_DART || skill == -P_SHURIKEN) && !magr->mconf) { /* Assumes lords are skilled, princes are expert */ if (is_prince(magr->data)) multishot += 2; else if (is_lord(magr->data)) multishot++; /* Elven Craftsmanship makes for light, quick bows */ if (obj->otyp == ELVEN_ARROW && !obj->cursed) multishot++; if (mwep && mwep->otyp == ELVEN_BOW && !mwep->cursed) multishot++; /* 1/3 of object enchantment */ if (mwep && mwep->spe > 1) multishot += rounddiv(mwep->spe, 3); /* Some randomness */ if (multishot > 1) multishot = rnd(multishot); #ifdef FIREARMS if (mwep && objects[mwep->otyp].oc_rof && is_launcher(mwep)) multishot += objects[mwep->otyp].oc_rof; #endif switch (monsndx(magr->data)) { case PM_RANGER: multishot++; break; case PM_ROGUE: if (skill == P_DAGGER) multishot++; break; case PM_NINJA: case PM_SAMURAI: if (obj->otyp == YA && mwep && mwep->otyp == YUMI) multishot++; break; default: break; } /* racial bonus */ if ((is_elf(magr->data) && obj->otyp == ELVEN_ARROW && mwep && mwep->otyp == ELVEN_BOW) || (is_orc(magr->data) && obj->otyp == ORCISH_ARROW && mwep && mwep->otyp == ORCISH_BOW)) multishot++; if ((long)multishot > obj->quan) multishot = (int)obj->quan; if (multishot < 1) multishot = 1; /* else multishot = rnd(multishot); */ } if (canseemon(magr)) { char onmbuf[BUFSZ]; if (multishot > 1) { /* "N arrows"; multishot > 1 implies obj->quan > 1, so xname()'s result will already be pluralized */ Sprintf(onmbuf, "%d %s", multishot, xname(obj)); onm = onmbuf; } else { /* "an arrow" */ onm = singular(obj, xname); onm = obj_is_pname(obj) ? the(onm) : an(onm); } m_shot.s = ammo_and_launcher(obj,mwep) ? TRUE : FALSE; pline("%s %s %s!", Monnam(magr), #ifdef FIREARMS m_shot.s ? is_bullet(obj) ? "fires" : "shoots" : "throws", onm); #else m_shot.s ? "shoots" : "throws", onm); #endif m_shot.o = obj->otyp; } else { m_shot.o = STRANGE_OBJECT; /* don't give multishot feedback */ } mhp = mdef->mhp; m_shot.n = multishot; for (m_shot.i = 1; m_shot.i <= m_shot.n; m_shot.i++) m_throw(magr, magr->mx, magr->my, sgn(tbx), sgn(tby), distmin(magr->mx, magr->my, mdef->mx, mdef->my), obj); m_shot.n = m_shot.i = 0; m_shot.o = STRANGE_OBJECT; m_shot.s = FALSE; nomul(0); return (mdef->mhp < 1 ? MM_DEF_DIED : 0) | (mdef->mhp < mhp ? MM_HIT : 0) | (magr->mhp < 1 ? MM_AGR_DIED : 0); } /* Returns the result of mdamagem(). */ STATIC_OVL int hitmm(magr, mdef, mattk) register struct monst *magr,*mdef; struct attack *mattk; { if(vis){ int compat; char buf[BUFSZ], mdef_name[BUFSZ]; if (!canspotmon(magr)) map_invisible(magr->mx, magr->my); if (!canspotmon(mdef)) map_invisible(mdef->mx, mdef->my); if(mdef->m_ap_type) seemimic(mdef); if(magr->m_ap_type) seemimic(magr); if((compat = could_seduce(magr,mdef,mattk)) && !magr->mcan) { Sprintf(buf, "%s %s", Monnam(magr), mdef->mcansee ? "smiles at" : "talks to"); pline("%s %s %s.", buf, mon_nam(mdef), compat == 2 ? "engagingly" : "seductively"); } else { char magr_name[BUFSZ]; Strcpy(magr_name, Monnam(magr)); switch (mattk->aatyp) { case AT_BITE: Sprintf(buf,"%s bites", magr_name); break; case AT_STNG: Sprintf(buf,"%s stings", magr_name); break; case AT_BUTT: Sprintf(buf,"%s butts", magr_name); break; case AT_TUCH: Sprintf(buf,"%s touches", magr_name); break; case AT_TENT: Sprintf(buf, "%s tentacles suck", s_suffix(magr_name)); break; case AT_HUGS: if (magr != u.ustuck) { Sprintf(buf,"%s squeezes", magr_name); break; } case AT_MULTIPLY: /* No message. */ break; 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)); } /* Returns the same values as mdamagem(). */ STATIC_OVL int gazemm(magr, mdef, mattk) register struct monst *magr, *mdef; struct attack *mattk; { char buf[BUFSZ]; if(vis) { Sprintf(buf,"%s gazes at", Monnam(magr)); 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)); } /* Returns the same values as mattackm(). */ STATIC_OVL int gulpmm(magr, mdef, mattk) register struct monst *magr, *mdef; register struct attack *mattk; { xchar ax, ay, dx, dy; int status; char buf[BUFSZ]; struct obj *obj; if (mdef->data->msize >= MZ_HUGE) return MM_MISS; if (vis) { Sprintf(buf,"%s swallows", Monnam(magr)); pline("%s %s.", buf, mon_nam(mdef)); } for (obj = mdef->minvent; obj; obj = obj->nobj) (void) snuff_lit(obj); /* * All of this maniuplation is needed to keep the display correct. * There is a flush at the next pline(). */ ax = magr->mx; ay = magr->my; dx = mdef->mx; dy = mdef->my; /* * Leave the defender in the monster chain at it's current position, * but don't leave it on the screen. Move the agressor to the def- * ender's position. */ remove_monster(ax, ay); place_monster(magr, dx, dy); newsym(ax,ay); /* erase old position */ newsym(dx,dy); /* update new position */ status = mdamagem(magr, mdef, mattk); if ((status & MM_AGR_DIED) && (status & MM_DEF_DIED)) { ; /* both died -- do nothing */ } else if (status & MM_DEF_DIED) { /* defender died */ /* * Note: remove_monster() was called in relmon(), wiping out * magr from level.monsters[mdef->mx][mdef->my]. We need to * put it back and display it. -kd */ place_monster(magr, dx, dy); newsym(dx, dy); } else if (status & MM_AGR_DIED) { /* agressor died */ place_monster(mdef, dx, dy); newsym(dx, dy); } else { /* both alive, put them back */ if (cansee(dx, dy)) pline("%s is regurgitated!", Monnam(mdef)); place_monster(magr, ax, ay); place_monster(mdef, dx, dy); newsym(ax, ay); newsym(dx, dy); } return status; } STATIC_OVL int explmm(magr, mdef, mattk) register struct monst *magr, *mdef; register struct attack *mattk; { int result; if (magr->mcan) return MM_MISS; if(cansee(magr->mx, magr->my)) pline("%s explodes!", Monnam(magr)); else noises(magr, mattk); remove_monster(magr->mx, magr->my); /* MAR */ result = mdamagem(magr, mdef, mattk); place_monster(magr,magr->mx, magr->my); /* MAR */ /* Kill off agressor if it didn't die. */ if (!(result & MM_AGR_DIED)) { mondead(magr); if (magr->mhp > 0) return result; /* life saved */ result |= MM_AGR_DIED; } /* KMH -- Player gets blame for flame/freezing sphere */ if (magr->isspell && !(result & MM_DEF_DIED)) setmangry(mdef); /* give this one even if it was visible, except for spell creatures */ if (magr->mtame && !magr->isspell) You(brief_feeling, "melancholy"); return result; } /* * See comment at top of mattackm(), for return values. */ STATIC_OVL int mdamagem(magr, mdef, mattk) register struct monst *magr, *mdef; register struct attack *mattk; { struct obj *obj; char buf[BUFSZ]; struct permonst *pa = magr->data, *pd = mdef->data; int armpro, num, tmp = d((int)mattk->damn, (int)mattk->damd); boolean cancelled; int canhitmon, objenchant; boolean nohit = FALSE; if (touch_petrifies(pd) && !resists_ston(magr)) { long protector = attk_protection((int)mattk->aatyp), wornitems = magr->misc_worn_check; /* wielded weapon gives same protection as gloves here */ if (otmp != 0) wornitems |= W_ARMG; if (protector == 0L || (protector != ~0L && (wornitems & protector) != protector)) { if (poly_when_stoned(pa)) { mon_to_stone(magr); return MM_HIT; /* no damage during the polymorph */ } if (vis) pline("%s turns to stone!", Monnam(magr)); monstone(magr); if (magr->mhp > 0) return 0; else if (magr->mtame && !vis) You(brief_feeling, "peculiarly sad"); return MM_AGR_DIED; } } canhitmon = 0; if (need_one(mdef)) canhitmon = 1; if (need_two(mdef)) canhitmon = 2; if (need_three(mdef)) canhitmon = 3; if (need_four(mdef)) canhitmon = 4; if (mattk->aatyp == AT_WEAP && otmp) { objenchant = otmp->spe; if (objenchant < 0) objenchant = 0; if (otmp->oartifact) { if (otmp->spe < 2) objenchant += 1; else objenchant = 2; } #ifdef LIGHTSABERS if (is_lightsaber(otmp)) objenchant = 4; #endif } else objenchant = 0; /* a monster that needs a +1 weapon to hit it hits as a +1 weapon... */ if (need_one(magr)) objenchant = 1; if (need_two(magr)) objenchant = 2; if (need_three(magr)) objenchant = 3; if (need_four(magr)) objenchant = 4; /* overridden by specific flags */ if (hit_as_one(magr)) objenchant = 1; if (hit_as_two(magr)) objenchant = 2; if (hit_as_three(magr)) objenchant = 3; if (hit_as_four(magr)) objenchant = 4; if (objenchant < canhitmon) nohit = TRUE; /* cancellation factor is the same as when attacking the hero */ armpro = magic_negation(mdef); cancelled = magr->mcan || !((rn2(3) >= armpro) || !rn2(50)); switch(mattk->adtyp) { case AD_DGST: if (nohit) nohit = FALSE; /* eating a Rider or its corpse is fatal */ if (is_rider(mdef->data)) { if (vis) pline("%s %s!", Monnam(magr), mdef->data == &mons[PM_FAMINE] ? "belches feebly, shrivels up and dies" : mdef->data == &mons[PM_PESTILENCE] ? "coughs spasmodically and collapses" : "vomits violently and drops dead"); mondied(magr); if (magr->mhp > 0) return 0; /* lifesaved */ else if (magr->mtame && !vis) You(brief_feeling, "queasy"); return MM_AGR_DIED; } if(flags.verbose && flags.soundok) verbalize("Burrrrp!"); 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; goto physical; case AD_LEGS: if (magr->mcan) { tmp = 0; break; } goto physical; case AD_WERE: case AD_HEAL: case AD_PHYS: physical: if (mattk->aatyp == AT_WEAP && otmp) { if (otmp->otyp == CORPSE && touch_petrifies(&mons[otmp->corpsenm]) && nohit) nohit = FALSE; } else if(nohit) break; if (mattk->aatyp == AT_KICK && thick_skinned(pd)) { tmp = 0; } else if(mattk->aatyp == AT_WEAP) { if(otmp) { if (otmp->otyp == CORPSE && touch_petrifies(&mons[otmp->corpsenm])) goto do_stone; /* WAC -- Real weapon? * Could be stuck with a cursed bow/polearm it wielded */ if (/* if you strike with a bow... */ is_launcher(otmp) || /* or strike with a missile in your hand... */ (is_missile(otmp) || is_ammo(otmp)) || #ifdef LIGHTSABERS /* lightsaber that isn't lit ;) */ (is_lightsaber(otmp) && !otmp->lamplit) || #endif /* WAC -- or using a pole at short range... */ (is_pole(otmp))) { /* then do only 1-2 points of damage */ if (pd == &mons[PM_SHADE] && otmp->otyp != SILVER_ARROW) tmp = 0; else tmp = rnd(2); #if 0 /* Monsters don't wield boomerangs */ if(otmp->otyp == BOOMERANG /* && !rnl(3) */) { pline("As %s hits you, %s breaks into splinters.", mon_nam(mtmp), the(xname(otmp))); useup(otmp); otmp = (struct obj *) 0; possibly_unwield(mtmp); if (pd != &mons[PM_SHADE]) tmp++; } #endif } else tmp += dmgval(otmp, mdef); /* MRKR: Handling damage when hitting with */ /* a burning torch */ if(otmp->otyp == TORCH && otmp->lamplit && !resists_fire(mdef)) { if (!Blind) { static char outbuf[BUFSZ]; char *s = Shk_Your(outbuf, otmp); boolean water = (mdef->data == &mons[PM_WATER_ELEMENTAL]); pline("%s %s %s%s %s%s.", s, xname(otmp), (water ? "vaporize" : "burn"), (otmp->quan > 1L ? "" : "s"), (water ? "part of " : ""), mon_nam(mdef)); } burn_faster(otmp, 1); tmp++; if (resists_cold(mdef)) tmp += rnd(3); if (!rn2(2) && burnarmor(mdef)) { if (!rn2(3)) (void)destroy_mitem(mdef, POTION_CLASS, AD_FIRE); if (!rn2(3)) (void)destroy_mitem(mdef, SCROLL_CLASS, AD_FIRE); if (!rn2(5)) (void)destroy_mitem(mdef, SPBOOK_CLASS, AD_FIRE); } } /* WAC Weres get seared */ if(otmp && objects[otmp->otyp].oc_material == SILVER && (hates_silver(pd))) { tmp += 8; if (vis) pline("The silver sears %s!", mon_nam(mdef)); } /* Stakes do extra dmg agains vamps */ if (otmp && otmp->otyp == WOODEN_STAKE && is_vampire(pd)) { if(otmp->oartifact == ART_STAKE_OF_VAN_HELSING) { if (!rn2(10)) { if (vis) { Strcpy(buf, Monnam(magr)); pline("%s plunges the stake into the heart of %s.", buf, mon_nam(mdef)); pline("%s's body vaporizes!", Monnam(mdef)); } mondead(mdef); /* no corpse */ if (mdef->mhp < 0) return (MM_DEF_DIED | (grow_up(magr,mdef) ? 0 : MM_AGR_DIED)); } else { if (vis) { Strcpy(buf, Monnam(magr)); pline("%s drives the stake into %s.", buf, mon_nam(mdef)); } tmp += rnd(6) + 2; } } else { if (vis) { Strcpy(buf, Monnam(magr)); pline("%s drives the stake into %s.", buf, mon_nam(mdef)); } tmp += rnd(6); } } if (otmp && otmp->oartifact) { (void)artifact_hit(magr,mdef, otmp, &tmp, dieroll); if (mdef->mhp <= 0) return (MM_DEF_DIED | (grow_up(magr,mdef) ? 0 : MM_AGR_DIED)); } if (otmp && tmp) mrustm(magr, mdef, otmp); } } else if (magr->data == &mons[PM_PURPLE_WORM] && mdef->data == &mons[PM_SHRIEKER]) { /* hack to enhance mm_aggression(); we don't want purple worm's bite attack to kill a shrieker because then it won't swallow the corpse; but if the target survives, the subsequent engulf attack should accomplish that */ if (tmp >= mdef->mhp) tmp = mdef->mhp - 1; } break; case AD_FIRE: if (nohit) break; if (cancelled) { tmp = 0; break; } if (vis) pline("%s is %s!", Monnam(mdef), on_fire(mdef->data, mattk)); if (pd == &mons[PM_STRAW_GOLEM] || pd == &mons[PM_WAX_GOLEM] || pd == &mons[PM_PAPER_GOLEM]) { if (vis) pline("%s burns completely!", Monnam(mdef)); mondied(mdef); if (mdef->mhp > 0) return 0; else if (mdef->mtame && !vis) pline("May %s roast in peace.", mon_nam(mdef)); return (MM_DEF_DIED | (grow_up(magr,mdef) ? 0 : MM_AGR_DIED)); } tmp += destroy_mitem(mdef, SCROLL_CLASS, AD_FIRE); tmp += destroy_mitem(mdef, SPBOOK_CLASS, AD_FIRE); if (resists_fire(mdef)) { if (vis) pline_The("fire doesn't seem to burn %s!", mon_nam(mdef)); shieldeff(mdef->mx, mdef->my); golemeffects(mdef, AD_FIRE, tmp); tmp = 0; } /* only potions damage resistant players in destroy_item */ tmp += destroy_mitem(mdef, POTION_CLASS, AD_FIRE); break; case AD_COLD: if (nohit) break; if (cancelled) { tmp = 0; break; } if (vis) pline("%s is covered in frost!", Monnam(mdef)); if (resists_cold(mdef)) { if (vis) pline_The("frost doesn't seem to chill %s!", mon_nam(mdef)); shieldeff(mdef->mx, mdef->my); golemeffects(mdef, AD_COLD, tmp); tmp = 0; } tmp += destroy_mitem(mdef, POTION_CLASS, AD_COLD); break; case AD_ELEC: if (nohit) break; if (cancelled) { tmp = 0; break; } if (vis) pline("%s gets zapped!", Monnam(mdef)); tmp += destroy_mitem(mdef, WAND_CLASS, AD_ELEC); if (resists_elec(mdef)) { if (vis) pline_The("zap doesn't shock %s!", mon_nam(mdef)); shieldeff(mdef->mx, mdef->my); golemeffects(mdef, AD_ELEC, tmp); tmp = 0; } /* only rings damage resistant players in destroy_item */ tmp += destroy_mitem(mdef, RING_CLASS, AD_ELEC); break; case AD_ACID: if (nohit) break; if (magr->mcan) { tmp = 0; break; } if (resists_acid(mdef)) { if (vis) pline("%s is covered in acid, but it seems harmless.", Monnam(mdef)); tmp = 0; } else if (vis) { pline("%s is covered in acid!", Monnam(mdef)); 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) break; if (pd == &mons[PM_IRON_GOLEM]) { if (vis) pline("%s falls to pieces!", Monnam(mdef)); mondied(mdef); if (mdef->mhp > 0) return 0; else if (mdef->mtame && !vis) pline("May %s rust in peace.", mon_nam(mdef)); return (MM_DEF_DIED | (grow_up(magr,mdef) ? 0 : MM_AGR_DIED)); } hurtmarmor(mdef, AD_RUST); mdef->mstrategy &= ~STRAT_WAITFORU; tmp = 0; break; case AD_CORR: if (magr->mcan) break; hurtmarmor(mdef, AD_CORR); mdef->mstrategy &= ~STRAT_WAITFORU; tmp = 0; break; case AD_DCAY: if (magr->mcan) break; if (pd == &mons[PM_WOOD_GOLEM] || pd == &mons[PM_LEATHER_GOLEM]) { if (vis) pline("%s falls to pieces!", Monnam(mdef)); mondied(mdef); if (mdef->mhp > 0) return 0; else if (mdef->mtame && !vis) pline("May %s rot in peace.", mon_nam(mdef)); return (MM_DEF_DIED | (grow_up(magr,mdef) ? 0 : MM_AGR_DIED)); } hurtmarmor(mdef, AD_DCAY); tmp = 0; break; case AD_STON: if (magr->mcan) break; if (mattk->aatyp == AT_GAZE && mon_reflects(mdef, (char *)0)) { tmp = 0; (void) mon_reflects(mdef, "But it reflects from %s %s!"); if (poly_when_stoned(pa)) { mon_to_stone(magr); break; } if (!resists_ston(magr)) { if (vis) pline("%s turns to stone!", Monnam(magr)); monstone(magr); if (magr->mhp > 0) return 0; else if (magr->mtame && !vis) You(brief_feeling, "peculiarly sad"); return MM_AGR_DIED; } } do_stone: /* may die from the acid if it eats a stone-curing corpse */ if (munstone(mdef, FALSE)) goto post_stone; if (poly_when_stoned(pd)) { mon_to_stone(mdef); tmp = 0; break; } if (!resists_ston(mdef)) { if (vis) pline("%s turns to stone!", Monnam(mdef)); monstone(mdef); post_stone: if (mdef->mhp > 0) return 0; else if (mdef->mtame && !vis) You(brief_feeling, "peculiarly sad"); return (MM_DEF_DIED | (grow_up(magr,mdef) ? 0 : MM_AGR_DIED)); } tmp = (mattk->adtyp == AD_STON ? 0 : 1); break; case AD_TLPT: if (!cancelled && tmp < mdef->mhp && !tele_restrict(mdef)) { char mdef_Monnam[BUFSZ]; /* save the name before monster teleports, otherwise we'll get "it" in the suddenly disappears message */ if (vis) Strcpy(mdef_Monnam, Monnam(mdef)); mdef->mstrategy &= ~STRAT_WAITFORU; (void) rloc(mdef, FALSE); if (vis && !canspotmon(mdef) #ifdef STEED && mdef != u.usteed #endif ) pline("%s suddenly disappears!", mdef_Monnam); } break; case AD_SLEE: if (nohit) break; if (cancelled) break; if (mattk->aatyp == AT_GAZE && mon_reflects(mdef, (char *)0)) { tmp = 0; (void) mon_reflects(mdef, "But it reflects from %s %s!"); if (sleep_monst(magr, rnd(10), -1)) if (vis) pline("%s is put to sleep!", Monnam(magr)); break; } if (!cancelled && !mdef->msleeping && sleep_monst(mdef, rnd(10), -1)) { if (vis) { Strcpy(buf, Monnam(mdef)); pline("%s is put to sleep by %s.", buf, mon_nam(magr)); } mdef->mstrategy &= ~STRAT_WAITFORU; slept_monst(mdef); } break; /* WAC DEATH (gaze) */ case AD_DETH: if (rn2(16)) { /* No death, but still cause damage */ break; } if (vis && mattk->aatyp == AT_GAZE) pline("%s gazes intently!", Monnam(magr)); if (mattk->aatyp == AT_GAZE && mon_reflects(mdef, (char *)0)) { /* WAC reflected gaze * Oooh boy...that was a bad move :B */ tmp = 0; if (vis) { shieldeff(mdef->mx, mdef->my); (void) mon_reflects(mdef, "But it reflects from %s %s!"); } if (resists_magm(magr)) { if (vis) pline("%s shudders momentarily...", Monnam(magr)); break; } if (vis) pline("%s dies!", Monnam(magr)); mondied(magr); if (magr->mhp > 0) return 0; /* lifesaved */ else if (magr->mtame && !vis) You(brief_feeling, "peculiarly sad"); return MM_AGR_DIED; } else if (is_undead(mdef->data)) { /* Still does normal damage */ if (vis) pline("Something didn't work..."); break; } else if (resists_magm(mdef)) { if (vis) pline("%s shudders momentarily...", Monnam(mdef)); } else { tmp = mdef->mhp; } break; case AD_PLYS: if (nohit) break; if(!cancelled && mdef->mcanmove) { if (vis) { Strcpy(buf, Monnam(mdef)); pline("%s is frozen by %s.", buf, mon_nam(magr)); } mdef->mcanmove = 0; mdef->mfrozen = rnd(10); mdef->mstrategy &= ~STRAT_WAITFORU; } break; case AD_TCKL: if(!cancelled && mdef->mcanmove) { if (vis) { Strcpy(buf, Monnam(magr)); pline("%s mercilessly tickles %s.", buf, mon_nam(mdef)); } mdef->mcanmove = 0; mdef->mfrozen = rnd(10); mdef->mstrategy &= ~STRAT_WAITFORU; } break; case AD_SLOW: if (nohit) break; if(!cancelled && vis && mdef->mspeed != MSLOW) { unsigned int oldspeed = mdef->mspeed; mon_adjust_speed(mdef, -1, (struct obj *)0); mdef->mstrategy &= ~STRAT_WAITFORU; if (mdef->mspeed != oldspeed && vis) pline("%s slows down.", Monnam(mdef)); } break; case AD_CONF: if (nohit) break; /* Since confusing another monster doesn't have a real time * limit, setting spec_used would not really be right (though * we still should check for it). */ if (!magr->mcan && !mdef->mconf && !magr->mspec_used) { if (vis) pline("%s looks confused.", Monnam(mdef)); mdef->mconf = 1; mdef->mstrategy &= ~STRAT_WAITFORU; } break; case AD_DREN: if (nohit) break; if (resists_magm(mdef)) { if (vis) { shieldeff(mdef->mx,mdef->my); pline("%s is unaffected.", Monnam(mdef)); } } else { mon_drain_en(mdef, ((mdef->m_lev > 0) ? (rnd(mdef->m_lev)) : 0) + 1); } case AD_BLND: if (nohit) break; if (can_blnd(magr, mdef, mattk->aatyp, (struct obj*)0)) { register unsigned rnd_tmp; if (vis && mdef->mcansee) pline("%s is blinded.", Monnam(mdef)); rnd_tmp = d((int)mattk->damn, (int)mattk->damd); if ((rnd_tmp += mdef->mblinded) > 127) rnd_tmp = 127; mdef->mblinded = rnd_tmp; mdef->mcansee = 0; mdef->mstrategy &= ~STRAT_WAITFORU; } tmp = 0; break; case AD_HALU: if (!magr->mcan && haseyes(pd) && mdef->mcansee) { if (vis) pline("%s looks %sconfused.", Monnam(mdef), mdef->mconf ? "more " : ""); mdef->mconf = 1; mdef->mstrategy &= ~STRAT_WAITFORU; } tmp = 0; break; case AD_CURS: if (nohit) break; if (!night() && (pa == &mons[PM_GREMLIN])) break; if (!magr->mcan && !rn2(10)) { mdef->mcan = 1; /* cancelled regardless of lifesave */ mdef->mstrategy &= ~STRAT_WAITFORU; if (is_were(pd) && pd->mlet != S_HUMAN) were_change(mdef); if (pd == &mons[PM_CLAY_GOLEM]) { if (vis) { pline("Some writing vanishes from %s head!", s_suffix(mon_nam(mdef))); pline("%s is destroyed!", Monnam(mdef)); } mondied(mdef); if (mdef->mhp > 0) return 0; else if (mdef->mtame && !vis) You(brief_feeling, "strangely sad"); return (MM_DEF_DIED | (grow_up(magr,mdef) ? 0 : MM_AGR_DIED)); } if (flags.soundok) { if (!vis) You_hear("laughter."); else pline("%s chuckles.", Monnam(magr)); } } 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 mdef->mstrategy &= ~STRAT_WAITFORU; if (vis) { Strcpy(buf, Monnam(magr)); pline("%s steals some gold from %s.", buf, mon_nam(mdef)); } if (!tele_restrict(magr)) { (void) rloc(magr, FALSE); if (vis && !canspotmon(magr)) pline("%s suddenly disappears!", buf); } break; case AD_DRLI: if (nohit) break; if (!cancelled && magr->mtame && !magr->isminion && is_vampire(pa) && mattk->aatyp == AT_BITE && has_blood(pd)) EDOG(magr)->hungrytime += ((int)((mdef->data)->cnutrit / 20) + 1); if (!cancelled && rn2(2) && !resists_drli(mdef)) { tmp = d(2,6); if (vis) pline("%s suddenly seems weaker!", Monnam(mdef)); mdef->mhpmax -= tmp; if (mdef->m_lev == 0) tmp = mdef->mhp; else mdef->m_lev--; /* Automatic kill if drained past level 0 */ } break; #ifdef SEDUCE case AD_SSEX: #endif case AD_SITM: /* for now these are the same */ case AD_SEDU: if (magr->mcan) break; /* 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 (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)) /* "You can no longer ride ." */ dismount_steed(DISMOUNT_POLY); #endif 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, FALSE); } /* add_to_minv() might free otmp [if it merges] */ if (vis) Strcpy(onambuf, doname(otmp)); (void) add_to_minv(magr, otmp); if (vis) { Strcpy(buf, Monnam(magr)); pline("%s steals %s from %s!", buf, onambuf, mdefnambuf); } possibly_unwield(mdef, FALSE); mdef->mstrategy &= ~STRAT_WAITFORU; mselftouch(mdef, (const char *)0, FALSE); if (mdef->mhp <= 0) return (MM_DEF_DIED | (grow_up(magr,mdef) ? 0 : MM_AGR_DIED)); if (magr->data->mlet == S_NYMPH && !tele_restrict(magr)) { (void) rloc(magr, FALSE); if (vis && !canspotmon(magr)) pline("%s suddenly disappears!", buf); } } tmp = 0; break; case AD_DRST: case AD_DRDX: case AD_DRCO: if (nohit) break; if (!cancelled && !rn2(8)) { if (vis) pline("%s %s was poisoned!", s_suffix(Monnam(magr)), mpoisons_subj(magr, mattk)); if (resists_poison(mdef)) { if (vis) pline_The("poison doesn't seem to affect %s.", mon_nam(mdef)); } else { if (rn2(10)) tmp += rn1(10,6); else { if (vis) pline_The("poison was deadly..."); tmp = mdef->mhp; } } } break; 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; } if ((mdef->misc_worn_check & W_ARMH) && rn2(8)) { if (vis) { Strcpy(buf, s_suffix(Monnam(mdef))); pline("%s helmet blocks %s attack to %s head.", buf, s_suffix(mon_nam(magr)), mhis(mdef)); } break; } if (vis) pline("%s brain is eaten!", s_suffix(Monnam(mdef))); if (mindless(pd)) { if (vis) pline("%s doesn't notice.", Monnam(mdef)); break; } tmp += rnd(10); /* fakery, since monsters lack INT scores */ if (magr->mtame && !magr->isminion) { EDOG(magr)->hungrytime += rnd(60); magr->mconf = 0; } if (tmp >= mdef->mhp && vis) pline("%s last thought fades away...", s_suffix(Monnam(mdef))); break; case AD_SLIM: if (cancelled) break; /* physical damage only */ if (!rn2(4) && !flaming(mdef->data) && mdef->data != &mons[PM_GREEN_SLIME]) { if (newcham(mdef, &mons[PM_GREEN_SLIME], FALSE, vis)) { mdef->oldmonnm = PM_GREEN_SLIME; (void) stop_timer(UNPOLY_MON, (genericptr_t) mdef); } mdef->mstrategy &= ~STRAT_WAITFORU; tmp = 0; } break; case AD_STCK: if (cancelled) tmp = 0; break; case AD_WRAP: /* monsters cannot grab one another, it's too hard */ if (magr->mcan) tmp = 0; break; case AD_ENCH: /* There's no msomearmor() function, so just do damage */ /* if (cancelled) break; */ break; case AD_POLY: if (!magr->mcan && tmp < mdef->mhp) { if (resists_magm(mdef)) { /* magic resistance protects from polymorph traps, so * make it guard against involuntary polymorph attacks * too... */ if (vis) shieldeff(mdef->mx, mdef->my); break; } #if 0 if (!rn2(25) || !mon_poly(mdef)) { if (vis) pline("%s shudders!", Monnam(mdef)); /* no corpse after system shock */ tmp = rnd(30); } else #endif (void) mon_poly(mdef, FALSE, "%s undergoes a freakish metamorphosis!"); } break; case AD_CALM: /* KMH -- koala attack */ /* Certain monsters aren't even made peaceful. */ if (!mdef->iswiz && mdef->data != &mons[PM_MEDUSA] && !(mdef->data->mflags3 & M3_COVETOUS) && !(mdef->data->geno & G_UNIQ) && (magr->mtame || mdef->mtame)) { if (vis) pline("%s looks calmer.", Monnam(mdef)); if (mdef == u.usteed) dismount_steed(DISMOUNT_THROWN); mdef->mpeaceful = 1; mdef->mtame = 0; tmp = 0; } break; default: tmp = 0; break; } if(!tmp) return(MM_MISS); /* STEPHEN WHITE'S NEW CODE */ if (objenchant < canhitmon && vis) { Strcpy(buf, Monnam(magr)); pline("%s doesn't seem to harm %s.", buf, mon_nam(mdef)); return(MM_HIT); } /* WAC -- Caveman Primal Roar ability */ if (magr->mtame != 0 && tech_inuse(T_PRIMAL_ROAR)) { tmp *= 2; /* Double Damage! */ } if((mdef->mhp -= tmp) < 1) { if (m_at(mdef->mx, mdef->my) == magr) { /* see gulpmm() */ remove_monster(mdef->mx, mdef->my); mdef->mhp = 1; /* otherwise place_monster will complain */ place_monster(mdef, mdef->mx, mdef->my); mdef->mhp = 0; } /* get experience from spell creatures */ if (magr->uexp) mon_xkilled(mdef, "", (int)mattk->adtyp); else monkilled(mdef, "", (int)mattk->adtyp); if (mdef->mhp > 0) return 0; /* mdef lifesaved */ if (mattk->adtyp == AD_DGST) { /* various checks similar to dog_eat and meatobj. * after monkilled() to provide better message ordering */ if (mdef->cham != CHAM_ORDINARY) { (void) newcham(magr, (struct permonst *)0, FALSE, TRUE); } else if (mdef->data == &mons[PM_GREEN_SLIME]) { (void) newcham(magr, &mons[PM_GREEN_SLIME], FALSE, TRUE); } else if (mdef->data == &mons[PM_WRAITH]) { (void) grow_up(magr, (struct monst *)0); /* don't grow up twice */ return (MM_DEF_DIED | (magr->mhp > 0 ? 0 : MM_AGR_DIED)); } else if (mdef->data == &mons[PM_NURSE]) { magr->mhp = magr->mhpmax; } } return (MM_DEF_DIED | ((magr->mhp > 0 && grow_up(magr,mdef)) ? 0 : MM_AGR_DIED)); } return(MM_HIT); } #endif /* OVLB */ #ifdef OVL0 int noattacks(ptr) /* returns 1 if monster doesn't attack */ struct permonst *ptr; { int i; for(i = 0; i < NATTK; i++) if(ptr->mattk[i].aatyp) return(0); return(1); } /* `mon' is hit by a sleep attack; return 1 if it's affected, 0 otherwise */ int sleep_monst(mon, amt, how) struct monst *mon; int amt, how; { if (resists_sleep(mon) || (how >= 0 && resist(mon, (char)how, 0, NOTELL))) { shieldeff(mon->mx, mon->my); } else if (mon->mcanmove) { amt += (int) mon->mfrozen; if (amt > 0) { /* sleep for N turns */ mon->mcanmove = 0; mon->mfrozen = min(amt, 127); } else { /* sleep until awakened */ mon->msleeping = 1; } return 1; } return 0; } /* sleeping grabber releases, engulfer doesn't; don't use for paralysis! */ void slept_monst(mon) struct monst *mon; { if ((mon->msleeping || !mon->mcanmove) && mon == u.ustuck && !sticks(youmonst.data) && !u.uswallow) { pline("%s grip relaxes.", s_suffix(Monnam(mon))); unstuck(mon); } } #endif /* OVL0 */ #ifdef OVLB STATIC_OVL void mrustm(magr, mdef, obj) register struct monst *magr, *mdef; register struct obj *obj; { boolean is_acid; 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; else return; if (!mdef->mcan && (is_acid ? is_corrodeable(obj) : is_rustprone(obj)) && (is_acid ? obj->oeroded2 : obj->oeroded) < MAX_ERODE) { if (obj->greased || obj->oerodeproof || (obj->blessed && rn2(3))) { if (cansee(mdef->mx, mdef->my) && flags.verbose) pline("%s weapon is not affected.", s_suffix(Monnam(magr))); if (obj->greased && !rn2(2)) obj->greased = 0; } else { if (cansee(mdef->mx, mdef->my)) { pline("%s %s%s!", s_suffix(Monnam(magr)), aobjnam(obj, (is_acid ? "corrode" : "rust")), (is_acid ? obj->oeroded2 : obj->oeroded) ? " further" : ""); } if (is_acid) obj->oeroded2++; else obj->oeroded++; } } } STATIC_OVL void mswingsm(magr, mdef, otemp) register struct monst *magr, *mdef; 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); } /* * Passive responses by defenders. Does not replicate responses already * handled above. Returns same values as mattackm. */ STATIC_OVL int passivemm(magr,mdef,mhit,mdead) register struct monst *magr, *mdef; boolean mhit; int mdead; { register struct permonst *mddat = mdef->data; register struct permonst *madat = magr->data; char buf[BUFSZ]; int i, tmp; for(i = 0; ; i++) { if(i >= NATTK) return (mdead | mhit); /* no passive attacks */ if(mddat->mattk[i].aatyp == AT_NONE /*|| mddat->mattk[i].aatyp == AT_BOOM*/) break; } if (mddat->mattk[i].damn) tmp = d((int)mddat->mattk[i].damn, (int)mddat->mattk[i].damd); else if(mddat->mattk[i].damd) tmp = d((int)mddat->mlevel+1, (int)mddat->mattk[i].damd); else tmp = 0; /* These affect the enemy even if defender killed */ switch(mddat->mattk[i].adtyp) { case AD_ACID: if (mhit && !rn2(2)) { Strcpy(buf, Monnam(magr)); if(canseemon(magr)) pline("%s is splashed by %s acid!", buf, s_suffix(mon_nam(mdef))); if (resists_acid(magr)) { if(canseemon(magr)) pline("%s is not affected.", Monnam(magr)); tmp = 0; } } else tmp = 0; goto assess_dmg; case AD_MAGM: /* wrath of gods for attacking Oracle */ if(resists_magm(magr)) { if(canseemon(magr)) { shieldeff(magr->mx, magr->my); pline("A hail of magic missiles narrowly misses %s!",mon_nam(magr)); } } else { if(canseemon(magr)) pline(magr->data == &mons[PM_WOODCHUCK] ? "ZOT!" : "%s is hit by magic missiles appearing from thin air!",Monnam(magr)); goto assess_dmg; } break; case AD_ENCH: /* KMH -- remove enchantment (disenchanter) */ if (mhit && !mdef->mcan && otmp) { drain_item(otmp); /* No message */ } break; default: break; } if (mdead || mdef->mcan) return (mdead|mhit); /* These affect the enemy only if defender is still alive */ if (rn2(3)) switch(mddat->mattk[i].adtyp) { case AD_PLYS: /* Floating eye */ if (tmp > 127) tmp = 127; if (mddat == &mons[PM_FLOATING_EYE]) { if (!rn2(4)) tmp = 127; if (magr->mcansee && haseyes(madat) && mdef->mcansee && (perceives(madat) || !mdef->minvis)) { Sprintf(buf, "%s gaze is reflected by %%s %%s.", s_suffix(mon_nam(mdef))); if (mon_reflects(magr, canseemon(magr) ? buf : (char *)0)) return(mdead|mhit); Strcpy(buf, Monnam(magr)); if(canseemon(magr)) pline("%s is frozen by %s gaze!", buf, s_suffix(mon_nam(mdef))); magr->mcanmove = 0; magr->mfrozen = tmp; return (mdead|mhit); } } else { /* gelatinous cube */ Strcpy(buf, Monnam(magr)); if(canseemon(magr)) pline("%s is frozen by %s.", buf, mon_nam(mdef)); magr->mcanmove = 0; magr->mfrozen = tmp; return (mdead|mhit); } return 1; case AD_COLD: if (resists_cold(magr)) { if (canseemon(magr)) { pline("%s is mildly chilly.", Monnam(magr)); golemeffects(magr, AD_COLD, tmp); } tmp = 0; break; } if(canseemon(magr)) pline("%s is suddenly very cold!", Monnam(magr)); mdef->mhp += tmp / 2; if (mdef->mhpmax < mdef->mhp) mdef->mhpmax = mdef->mhp; if (mdef->mhpmax > ((int) (mdef->m_lev+1) * 8)) (void)split_mon(mdef, magr); break; case AD_STUN: if (!magr->mstun) { magr->mstun = 1; if (canseemon(magr)) pline("%s %s...", Monnam(magr), makeplural(stagger(magr->data, "stagger"))); } tmp = 0; break; case AD_FIRE: if (resists_fire(magr)) { if (canseemon(magr)) { pline("%s is mildly warmed.", Monnam(magr)); golemeffects(magr, AD_FIRE, tmp); } tmp = 0; break; } if(canseemon(magr)) pline("%s is suddenly very hot!", Monnam(magr)); break; case AD_ELEC: if (resists_elec(magr)) { if (canseemon(magr)) { pline("%s is mildly tingled.", Monnam(magr)); golemeffects(magr, AD_ELEC, tmp); } tmp = 0; break; } if(canseemon(magr)) pline("%s is jolted with electricity!", Monnam(magr)); break; default: tmp = 0; break; } else tmp = 0; assess_dmg: if((magr->mhp -= tmp) <= 0) { /* get experience from spell creatures */ if (mdef->uexp) mon_xkilled(magr, "", (int)mddat->mattk[i].adtyp); else monkilled(magr, "", (int)mddat->mattk[i].adtyp); return (mdead | mhit | MM_AGR_DIED); } return (mdead | mhit); } /* "aggressive defense"; what type of armor prevents specified attack from touching its target? */ long attk_protection(aatyp) int aatyp; { long w_mask = 0L; switch (aatyp) { case AT_NONE: case AT_SPIT: case AT_EXPL: case AT_BOOM: case AT_GAZE: case AT_BREA: case AT_MAGC: w_mask = ~0L; /* special case; no defense needed */ break; case AT_CLAW: case AT_TUCH: case AT_WEAP: w_mask = W_ARMG; /* caller needs to check for weapon */ break; case AT_KICK: w_mask = W_ARMF; break; case AT_BUTT: w_mask = W_ARMH; break; case AT_HUGS: w_mask = (W_ARMC|W_ARMG); /* attacker needs both to be protected */ break; case AT_BITE: case AT_STNG: case AT_ENGL: case AT_TENT: default: w_mask = 0L; /* no defense available */ break; } return w_mask; } #endif /* OVLB */ /*mhitm.c*/ slashem-0.0.7E7F3/src/mail.c0000664000076400007640000003744010545462317013541 0ustar aliali/* 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. */ #include "hack.h" #ifdef MAIL #include "mail.h" /* * Notify user when new mail has arrived. Idea by Merlyn Leroy. * * The mail daemon can move with less than usual restraint. It can: * - move diagonally from a door * - use secret and closed doors * - run through a monster ("Gangway!", etc.) * - run over pools & traps * * Possible extensions: * - Open the file MAIL and do fstat instead of stat for efficiency. * (But sh uses stat, so this cannot be too bad.) * - Examine the mail and produce a scroll of mail named "From somebody". * - Invoke MAILREADER in such a way that only this single letter is read. * - Do something to the text when the scroll is enchanted or cancelled. * - Make the daemon always appear at a stairwell, and have it find a * path to the hero. * * Note by Olaf Seibert: On the Amiga, we usually don't get mail. So we go * through most of the effects at 'random' moments. * Note by Paul Winner: The MSDOS port also 'fakes' the mail daemon at * random intervals. */ STATIC_DCL boolean FDECL(md_start,(coord *)); STATIC_DCL boolean FDECL(md_stop,(coord *, coord *)); STATIC_DCL boolean FDECL(md_rush,(struct monst *,int,int)); STATIC_DCL void FDECL(newmail, (struct mail_info *)); extern char *viz_rmin, *viz_rmax; /* line-of-sight limits (vision.c) */ #ifdef OVL0 # if !defined(UNIX) && !defined(VMS) && !defined(LAN_MAIL) int mustgetmail = -1; # endif #endif /* OVL0 */ #ifdef OVLB # ifdef UNIX #include #include /* DON'T trust all Unices to declare getpwuid() in */ # if !defined(_BULL_SOURCE) && !defined(__sgi) && !defined(_M_UNIX) # if !defined(SUNOS4) && !(defined(ULTRIX) && defined(__GNUC__)) # if !defined(LINUX) /* DO trust all SVR4 to typedef uid_t in (probably to a long) */ # if defined(POSIX_TYPES) || defined(SVR4) || defined(HPUX) extern struct passwd *FDECL(getpwuid,(uid_t)); # else extern struct passwd *FDECL(getpwuid,(int)); # endif # endif # endif # endif static struct stat omstat,nmstat; static char *mailbox = (char *)0; static long laststattime; # if !defined(MAILPATH) && defined(AMS) /* Just a placeholder for AMS */ # define MAILPATH "/dev/null" # endif # if !defined(MAILPATH) && (defined(LINUX) || defined(__osf__)) # define MAILPATH "/var/spool/mail/" # endif # if !defined(MAILPATH) && defined(__FreeBSD__) # define MAILPATH "/var/mail/" # endif # if !defined(MAILPATH) && (defined(BSD) || defined(ULTRIX)) # define MAILPATH "/usr/spool/mail/" # endif # if !defined(MAILPATH) && (defined(SYSV) || defined(HPUX)) # define MAILPATH "/usr/mail/" # endif void getmailstatus() { if(!mailbox && !(mailbox = nh_getenv("MAIL"))) { # ifdef MAILPATH # ifdef AMS struct passwd ppasswd; (void) memcpy(&ppasswd, getpwuid(getuid()), sizeof(struct passwd)); if (ppasswd.pw_dir) { mailbox = (char *) alloc((unsigned) strlen(ppasswd.pw_dir)+sizeof(AMS_MAILBOX)); Strcpy(mailbox, ppasswd.pw_dir); Strcat(mailbox, AMS_MAILBOX); } else return; # else const char *pw_name = getpwuid(getuid())->pw_name; mailbox = (char *) alloc(sizeof(MAILPATH)+strlen(pw_name)); Strcpy(mailbox, MAILPATH); Strcat(mailbox, pw_name); # endif /* AMS */ # else return; # endif } if(stat(mailbox, &omstat)){ # ifdef PERMANENT_MAILBOX pline("Cannot get status of MAIL=\"%s\".", mailbox); mailbox = 0; # else omstat.st_mtime = 0; # endif } } # endif /* UNIX */ #endif /* OVLB */ #ifdef OVL0 /* * Pick coordinates for a starting position for the mail daemon. Called * from newmail() and newphone(). */ STATIC_OVL boolean md_start(startp) coord *startp; { coord testcc; /* scratch coordinates */ int row; /* current row we are checking */ int lax; /* if TRUE, pick a position in sight. */ int dd; /* distance to current point */ int max_distance; /* max distance found so far */ /* * If blind and not telepathic, then it doesn't matter what we pick --- * the hero is not going to see it anyway. So pick a nearby position. */ if (Blind && !Blind_telepat) { if (!enexto(startp, u.ux, u.uy, (struct permonst *) 0)) return FALSE; /* no good posiitons */ return TRUE; } /* * Arrive at an up or down stairwell if it is in line of sight from the * hero. */ if (couldsee(upstair.sx, upstair.sy)) { startp->x = upstair.sx; startp->y = upstair.sy; return TRUE; } if (couldsee(dnstair.sx, dnstair.sy)) { startp->x = dnstair.sx; startp->y = dnstair.sy; return TRUE; } /* * Try to pick a location out of sight next to the farthest position away * from the hero. If this fails, try again, just picking the farthest * position that could be seen. What we really ought to be doing is * finding a path from a stairwell... * * The arrays viz_rmin[] and viz_rmax[] are set even when blind. These * are the LOS limits for each row. */ lax = 0; /* be picky */ max_distance = -1; retry: for (row = 0; row < ROWNO; row++) { if (viz_rmin[row] < viz_rmax[row]) { /* There are valid positions on this row. */ dd = distu(viz_rmin[row],row); if (dd > max_distance) { if (lax) { max_distance = dd; startp->y = row; startp->x = viz_rmin[row]; } else if (enexto(&testcc, (xchar)viz_rmin[row], row, (struct permonst *) 0) && !cansee(testcc.x, testcc.y) && couldsee(testcc.x, testcc.y)) { max_distance = dd; *startp = testcc; } } dd = distu(viz_rmax[row],row); if (dd > max_distance) { if (lax) { max_distance = dd; startp->y = row; startp->x = viz_rmax[row]; } else if (enexto(&testcc, (xchar)viz_rmax[row], row, (struct permonst *) 0) && !cansee(testcc.x,testcc.y) && couldsee(testcc.x, testcc.y)) { max_distance = dd; *startp = testcc; } } } } if (max_distance < 0) { if (!lax) { lax = 1; /* just find a position */ goto retry; } return FALSE; } return TRUE; } /* * Try to choose a stopping point as near as possible to the starting * position while still adjacent to the hero. If all else fails, try * enexto(). Use enexto() as a last resort because enexto() chooses * its point randomly, which is not what we want. */ STATIC_OVL boolean md_stop(stopp, startp) coord *stopp; /* stopping position (we fill it in) */ coord *startp; /* starting positon (read only) */ { int x, y, distance, min_distance = -1; 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)) { distance = dist2(x,y,startp->x,startp->y); if (min_distance < 0 || distance < min_distance || (distance == min_distance && rn2(2))) { stopp->x = x; stopp->y = y; min_distance = distance; } } } /* If we didn't find a good spot, try enexto(). */ if (min_distance < 0 && !enexto(stopp, u.ux, u.uy, &mons[PM_MAIL_DAEMON])) return FALSE; return TRUE; } /* Let the mail daemon have a larger vocabulary. */ static NEARDATA const char *mail_text[] = { "Gangway!", "Look out!", "Pardon me!" }; #define md_exclamations() (mail_text[rn2(3)]) /* * Make the mail daemon run through the dungeon. The daemon will run over * any monsters that are in its path, but will replace them later. Return * FALSE if the md gets stuck in a position where there is a monster. Return * TRUE otherwise. */ STATIC_OVL boolean md_rush(md,tx,ty) struct monst *md; register int tx, ty; /* destination of mail daemon */ { struct monst *mon; /* displaced monster */ register int dx, dy; /* direction counters */ int fx = md->mx, fy = md->my; /* current location */ int nfx = fx, nfy = fy, /* new location */ d1, d2; /* shortest distances */ /* * It is possible that the monster at (fx,fy) is not the md when: * the md rushed the hero and failed, and is now starting back. */ if (m_at(fx, fy) == md) { remove_monster(fx, fy); /* pick up from orig position */ newsym(fx, fy); } /* * At the beginning and exit of this loop, md is not placed in the * dungeon. */ while (1) { /* Find a good location next to (fx,fy) closest to (tx,ty). */ d1 = dist2(fx,fy,tx,ty); for (dx = -1; dx <= 1; dx++) for(dy = -1; dy <= 1; dy++) if ((dx || dy) && isok(fx+dx,fy+dy) && !IS_STWALL(levl[fx+dx][fy+dy].typ)) { d2 = dist2(fx+dx,fy+dy,tx,ty); if (d2 < d1) { d1 = d2; nfx = fx+dx; nfy = fy+dy; } } /* Break if the md couldn't find a new position. */ if (nfx == fx && nfy == fy) break; fx = nfx; /* this is our new position */ fy = nfy; /* Break if the md reaches its destination. */ if (fx == tx && fy == ty) break; if ((mon = m_at(fx,fy)) != 0) /* save monster at this position */ verbalize(md_exclamations()); else if (fx == u.ux && fy == u.uy) verbalize("Excuse me."); place_monster(md,fx,fy); /* put md down */ newsym(fx,fy); /* see it */ flush_screen(0); /* make sure md shows up */ delay_output(); /* wait a little bit */ /* Remove md from the dungeon. Restore original mon, if necessary. */ if (mon) { if ((mon->mx != fx) || (mon->my != fy)) place_worm_seg(mon, fx, fy); else place_monster(mon, fx, fy); } else remove_monster(fx, fy); newsym(fx,fy); } /* * Check for a monster at our stopping position (this is possible, but * very unlikely). If one exists, then have the md leave in disgust. */ if ((mon = m_at(fx, fy)) != 0) { place_monster(md, fx, fy); /* display md with text below */ newsym(fx, fy); verbalize("This place's too crowded. I'm outta here."); if ((mon->mx != fx) || (mon->my != fy)) /* put mon back */ place_worm_seg(mon, fx, fy); else place_monster(mon, fx, fy); newsym(fx, fy); return FALSE; } place_monster(md, fx, fy); /* place at final spot */ newsym(fx, fy); flush_screen(0); delay_output(); /* wait a little bit */ return TRUE; } /* Deliver a scroll of mail. */ /*ARGSUSED*/ STATIC_OVL void newmail(info) struct mail_info *info; { struct monst *md; coord start, stop; boolean message_seen = FALSE; /* Try to find good starting and stopping places. */ if (!md_start(&start) || !md_stop(&stop,&start)) goto give_up; /* Make the daemon. Have it rush towards the hero. */ if (!(md = makemon(&mons[PM_MAIL_DAEMON], start.x, start.y, NO_MM_FLAGS))) goto give_up; if (!md_rush(md, stop.x, stop.y)) goto go_back; message_seen = TRUE; verbalize("%s, %s! %s.", Hello(md), plname, info->display_txt); if (info->message_typ) { struct obj *obj = mksobj(SCR_MAIL, FALSE, FALSE); if (distu(md->mx,md->my) > 2) verbalize("Catch!"); display_nhwindow(WIN_MESSAGE, FALSE); if (info->object_nam) { obj = oname(obj, info->object_nam); if (info->response_cmd) { /*(hide extension of the obj name)*/ int namelth = info->response_cmd - info->object_nam - 1; if ( namelth <= 0 || namelth >= (int) obj->onamelth ) impossible("mail delivery screwed up"); else *(ONAME(obj) + namelth) = '\0'; /* Note: renaming object will discard the hidden command. */ } } obj = hold_another_object(obj, "Oops!", (const char *)0, (const char *)0); } /* zip back to starting location */ go_back: (void) md_rush(md, start.x, start.y); mongone(md); /* deliver some classes of messages even if no daemon ever shows up */ give_up: if (!message_seen && info->message_typ == MSG_OTHER) pline("Hark! \"%s.\"", info->display_txt); } # if !defined(UNIX) && !defined(VMS) && !defined(LAN_MAIL) void ckmailstatus() { if (u.uswallow || !flags.biff) return; if (mustgetmail < 0) { #if defined(AMIGA) || defined(MSDOS) || defined(TOS) || defined(OS2) mustgetmail=(moves<2000)?(100+rn2(2000)):(2000+rn2(3000)); #endif return; } if (--mustgetmail <= 0) { static struct mail_info deliver = {MSG_MAIL,"I have some mail for you",0,0}; newmail(&deliver); mustgetmail = -1; } } /*ARGSUSED*/ void readmail(otmp) struct obj *otmp; { const char *line; char buf[BUFSZ]; line = getrumor(bcsign(otmp), buf, TRUE); if (!*line) line = "NetHack rumors file closed for renovation."; if (Blind) { pline("Unfortunately you cannot see what it says."); } else pline("It reads: \"%s\"", line); } # endif /* !UNIX && !VMS */ # ifdef UNIX void ckmailstatus() { if(!mailbox || u.uswallow || !flags.biff # ifdef MAILCKFREQ || moves < laststattime + MAILCKFREQ # endif ) return; laststattime = moves; if(stat(mailbox, &nmstat)){ # ifdef PERMANENT_MAILBOX pline("Cannot get status of MAIL=\"%s\" anymore.", mailbox); mailbox = 0; # else nmstat.st_mtime = 0; # endif } else if(nmstat.st_mtime > omstat.st_mtime) { if (nmstat.st_size) { static struct mail_info deliver = { # ifndef NO_MAILREADER MSG_MAIL, "I have some mail for you", # else /* suppress creation and delivery of scroll of mail */ MSG_OTHER, "You have some mail in the outside world", # endif 0, 0 }; newmail(&deliver); } getmailstatus(); /* might be too late ... */ } } /*ARGSUSED*/ void readmail(otmp) struct obj *otmp; { # ifdef DEF_MAILREADER /* This implies that UNIX is defined */ register const char *mr = 0; display_nhwindow(WIN_MESSAGE, FALSE); if(!(mr = nh_getenv("MAILREADER"))) mr = DEF_MAILREADER; if(child(1)){ (void) execl(mr, mr, (char *)0); terminate(EXIT_FAILURE); } # else # ifndef AMS /* AMS mailboxes are directories */ display_file_area(NULL, mailbox, TRUE); # endif /* AMS */ # endif /* DEF_MAILREADER */ /* get new stat; not entirely correct: there is a small time window where we do not see new mail */ getmailstatus(); } # endif /* UNIX */ # ifdef VMS extern NDECL(struct mail_info *parse_next_broadcast); volatile int broadcasts = 0; void ckmailstatus() { struct mail_info *brdcst; if(u.uswallow || !flags.biff) return; while (broadcasts > 0) { /* process all trapped broadcasts [until] */ broadcasts--; if ((brdcst = parse_next_broadcast()) != 0) { newmail(brdcst); break; /* only handle one real message at a time */ } } } void readmail(otmp) struct obj *otmp; { # ifdef SHELL /* can't access mail reader without spawning subprocess */ const char *txt, *cmd; char *p, buf[BUFSZ], qbuf[BUFSZ]; int len; /* there should be a command hidden beyond the object name */ txt = otmp->onamelth ? ONAME(otmp) : ""; len = strlen(txt); cmd = (len + 1 < otmp->onamelth) ? txt + len + 1 : (char *) 0; if (!cmd || !*cmd) cmd = "SPAWN"; Sprintf(qbuf, "System command (%s)", cmd); getlin(qbuf, buf); if (*buf != '\033') { for (p = eos(buf); p > buf; *p = '\0') if (*--p != ' ') break; /* strip trailing spaces */ if (*buf) cmd = buf; /* use user entered command */ if (!strcmpi(cmd, "SPAWN") || !strcmp(cmd, "!")) cmd = (char *) 0; /* interactive escape */ vms_doshell(cmd, TRUE); (void) sleep(1); } # endif /* SHELL */ } # endif /* VMS */ # ifdef LAN_MAIL void ckmailstatus() { static int laststattime = 0; if(u.uswallow || !flags.biff # ifdef MAILCKFREQ || moves < laststattime + MAILCKFREQ # endif ) return; laststattime = moves; if (lan_mail_check()) { static struct mail_info deliver = { # ifndef NO_MAILREADER MSG_MAIL, "I have some mail for you", # else /* suppress creation and delivery of scroll of mail */ MSG_OTHER, "You have some mail in the outside world", # endif 0, 0 }; newmail(&deliver); } } /*ARGSUSED*/ void readmail(otmp) struct obj *otmp; { lan_mail_read(otmp); } # endif /* LAN_MAIL */ #endif /* OVL0 */ #endif /* MAIL */ /*mail.c*/ slashem-0.0.7E7F3/src/dothrow.c0000664000076400007640000016275610545462317014316 0ustar aliali/* SCCS Id: @(#)dothrow.c 3.4 2003/12/04 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ /* Contains code for 't' (throw) */ #include "hack.h" #include "edog.h" STATIC_DCL int FDECL(throw_obj, (struct obj *, int, 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)); STATIC_DCL void FDECL(breakmsg, (struct obj *,BOOLEAN_P)); 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 void NDECL(autoquiver); /* KMH -- automatically fill quiver */ static NEARDATA const char toss_objs[] = { ALLOW_COUNT, COIN_CLASS, ALL_CLASSES, WEAPON_CLASS, 0 }; /* different default choices when wielding a sling (gold must be included) */ static NEARDATA const char bullets[] = { ALLOW_COUNT, COIN_CLASS, ALL_CLASSES, GEM_CLASS, 0 }; struct obj *thrownobj = 0; /* tracks an object until it lands */ extern boolean notonhead; /* for long worms */ #define THROW_UWEP 1 #define THROW_USWAPWEP 2 /* Split this object off from its slot */ struct obj * splitoneoff(pobj) struct obj **pobj; { struct obj *obj = *pobj; struct obj *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), FALSE); else setuswapwep((struct obj *)0, FALSE); } else if (obj == uwep) { if (obj->quan > 1L) setworn(otmp = splitobj(obj, 1L), W_WEP); /* not setuwep; do not change unweapon */ else { setuwep((struct obj *)0, FALSE); if (uwep) return (struct obj *)0; /* unwielded, died, rewielded */ } } else if (obj->quan > 1L) otmp = splitobj(obj, 1L); *pobj = otmp; return obj; } /* Throw the selected object, asking for direction */ STATIC_OVL int throw_obj(obj, shotlimit, thrown) register struct obj *obj; int shotlimit; int thrown; { struct obj *otmp; struct obj *launcher; int multishot = 1; schar skill; long wep_mask; boolean twoweap; multi = 0; /* reset; it's been used up */ if (thrown == 1 && uwep && ammo_and_launcher(obj, uwep)) launcher = uwep; else if (thrown == 2 && uswapwep && ammo_and_launcher(obj, uswapwep)) launcher = uswapwep; else launcher = (struct obj *)0; /* ask "in what direction?" */ #ifndef GOLDOBJ if (!getdir((char *)0)) { if (obj->oclass == COIN_CLASS) { u.ugold += obj->quan; flags.botl = 1; dealloc_obj(obj); } return(0); } if(obj->oclass == COIN_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 == COIN_CLASS && obj != uquiver) return(throw_gold(obj)); #endif if(!canletgo(obj,"throw")) return(0); if(obj == uwep && welded(obj)) { weldmsg(obj); return(1); } if (obj->oartifact == ART_MJOLLNIR && obj != uwep) { pline("%s must be wielded before it can be thrown.", The(xname(obj))); return(0); } if ((obj->oartifact == ART_MJOLLNIR && ACURR(A_STR) < STR19(25)) || (obj->otyp == BOULDER && !throws_rocks(youmonst.data))) { pline("It's too heavy."); return(1); } if(!u.dx && !u.dy && !u.dz) { 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.", mons[obj->corpsenm].mname, body_part(HAND)); Sprintf(killer_buf, "%s corpse", an(mons[obj->corpsenm].mname)); instapetrify(killer_buf); } if (welded(obj)) { weldmsg(obj); return 1; } /* Multishot calculations */ skill = objects[obj->otyp].oc_skill; if ((ammo_and_launcher(obj, uwep) || skill == P_DAGGER || skill == -P_DART || skill == -P_SHURIKEN) && !(Confusion || Stunned)) { /* Bonus if the player is proficient in this weapon... */ switch (P_SKILL(weapon_type(obj))) { default: break; /* No bonus */ case P_SKILLED: multishot++; break; case P_EXPERT: multishot += 2; break; } /* ...or is using a good weapon... */ /* Elven Craftsmanship makes for light, quick bows */ if (obj->otyp == ELVEN_ARROW && !obj->cursed && !rn2(3)) multishot++; if (launcher && launcher->otyp == ELVEN_BOW && !launcher->cursed && !rn2(3)) multishot++; /* 1/3 of object enchantment */ if (launcher && launcher->spe > 1) multishot += (long) rounddiv(launcher->spe,3); /* ...or is using a special weapon for their role... */ switch (Role_switch) { case PM_RANGER: multishot++; break; case PM_ROGUE: if (skill == P_DAGGER) multishot++; break; case PM_SAMURAI: if (obj->otyp == YA && launcher && launcher->otyp == YUMI) multishot++; break; default: break; /* No bonus */ } /* ...or using their race's special bow */ switch (Race_switch) { case PM_ELF: if (obj->otyp == ELVEN_ARROW && launcher && launcher->otyp == ELVEN_BOW) multishot++; break; case PM_ORC: if (obj->otyp == ORCISH_ARROW && uwep && uwep->otyp == ORCISH_BOW) multishot++; break; default: break; /* No bonus */ } if ((long)multishot > obj->quan) multishot = (int)obj->quan; if (multishot > 0) multishot = rnd(multishot); /* Some randomness */ else multishot = 1; /* Tech: Flurry */ if (objects[obj->otyp].oc_skill == -P_BOW && tech_inuse(T_FLURRY)) { multishot += 1; /* Let'em rip! */ /* more than usual == volley */ if (((shotlimit <= 0) || (shotlimit >= multishot)) && (obj->quan >= multishot)) You("let fly a volley of %s!", xname(obj)); } /* Shotlimit controls your rate of fire */ if ((shotlimit > 0) && (multishot > shotlimit)) multishot = shotlimit; #ifdef FIREARMS /* Rate of fire is intrinsic to the weapon - cannot be user selected * except via altmode * Only for valid launchers * (currently oc_rof conflicts with wsdam) */ if (launcher && is_launcher(launcher)) { if (objects[(launcher->otyp)].oc_rof) multishot += (objects[(launcher->otyp)].oc_rof - 1); if (launcher->altmode == WP_MODE_SINGLE) /* weapons switchable b/w full/semi auto */ multishot = 1; else if (launcher->altmode == WP_MODE_BURST) multishot = ((multishot > 3) ? (multishot / 3) : 1); /* else it is auto == no change */ } if ((long)multishot > obj->quan) multishot = (int)obj->quan; #endif } if (multishot < 1) multishot = 1; 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) remove_worn_item(otmp, FALSE); } freeinv(otmp); throwit(otmp, wep_mask, twoweap, thrown); } m_shot.n = m_shot.i = 0; m_shot.o = STRANGE_OBJECT; m_shot.s = FALSE; return 1; } int dothrow() { register struct obj *obj; int oldmulti = multi, result, shotlimit; char *oldsave_cm = save_cm; /* * Since some characters shoot multiple missiles at one time, * allow user to specify a count prefix for 'f' or or select * a number of items in the item selection for 't' to limit * number of items thrown (to avoid possibly hitting something * behind target after killing it, or perhaps to conserve ammo). * * Nethack 3.3.0 uses prefixes for all - should this revert to that? * * Prior to 3.3.0, command ``3t'' meant ``t(shoot) t(shoot) t(shoot)'' * and took 3 turns. Now it means ``t(shoot at most 3 missiles)''. */ if (notake(youmonst.data)) { You("are physically incapable of throwing anything."); return 0; } if(check_capacity((char *)0)) return(0); obj = getobj(uslinging() ? bullets : toss_objs, "throw"); /* it is also possible to throw food */ /* (or jewels, or iron balls... ) */ if (!obj) return(0); /* kludge to work around parse()'s pre-decrement of 'multi' */ shotlimit = (multi || save_cm) ? multi + 1 : 0; result = throw_obj(obj, shotlimit, THROW_UWEP); /* * [ALI] Bug fix: Temporary paralysis (eg., from hurtle) cancels * any count for the throw command. */ if (multi >= 0) multi = oldmulti; save_cm = oldsave_cm; return (result); } /* KMH -- automatically fill quiver */ /* Suggested by Jeffrey Bay */ static void autoquiver() { struct obj *otmp, *oammo = 0, *omissile = 0, *omisc = 0, *altammo = 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 (ammo_and_launcher(otmp, uswapwep)) altammo = 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 if (ammo_and_launcher(otmp, uswapwep)) altammo = 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 (altammo) setuqwep(altammo); else if (omisc) setuqwep(omisc); return; } int dofire() { int result, shotlimit; if (notake(youmonst.data)) { You("are physically incapable of doing that."); return 0; } if(check_capacity((char *)0)) return(0); if (!uquiver) { if (!flags.autoquiver) { /* Don't automatically fill the quiver */ You("have no ammunition readied!"); return(dothrow()); } autoquiver(); if (!uquiver) { You("have nothing appropriate for your quiver!"); return(dothrow()); } else { You("fill your quiver:"); prinv((char *)0, uquiver, 0L); } } /* * Since some characters shoot multiple missiles at one time, * allow user to specify a count prefix for 'f' or 't' to limit * number of items thrown (to avoid possibly hitting something * behind target after killing it, or perhaps to conserve ammo). * * The number specified can never increase the number of missiles. * Using ``5f'' when the shooting skill (plus RNG) dictates launch * of 3 projectiles will result in 3 being shot, not 5. */ /* kludge to work around parse()'s pre-decrement of `multi' */ shotlimit = (multi || save_cm) ? multi + 1 : 0; multi = 0; /* reset; it's been used up */ if (u.twoweap) { if (!can_twoweapon()) untwoweapon(); else if (ammo_and_launcher(uquiver,uwep) && ammo_and_launcher(uquiver, uswapwep)){ result = throw_obj(uquiver, shotlimit, THROW_UWEP); if ((result == 1) && uquiver) result += throw_obj(uquiver, shotlimit, THROW_USWAPWEP); if (result > 1) result--; return(result); } } result = (throw_obj(uquiver, shotlimit, THROW_UWEP)); return result; } /* * Object hits floor at hero's feet. Called from drop() and throwit(). */ void hitfloor(obj) register struct obj *obj; { if (IS_SOFT(levl[u.ux][u.uy].typ) || u.uinwater) { dropy(obj); return; } if (IS_ALTAR(levl[u.ux][u.uy].typ)) doaltarobj(obj); else pline("%s hit%s the %s.", Doname2(obj), (obj->quan == 1L) ? "s" : "", surface(u.ux,u.uy)); if (hero_breaks(obj, u.ux, u.uy, TRUE)) return; if (ship_object(obj, u.ux, u.uy, FALSE)) return; dropy(obj); if (!u.uswallow) container_impact_dmg(obj); } /* * Walk a path from src_cc to dest_cc, calling a proc for each location * except the starting one. If the proc returns FALSE, stop walking * and return FALSE. If stopped early, dest_cc will be the location * before the failed callback. */ boolean walk_path(src_cc, dest_cc, check_proc, arg) coord *src_cc; coord *dest_cc; boolean FDECL((*check_proc), (genericptr_t, int, int)); genericptr_t arg; { int x, y, dx, dy, x_change, y_change, err, i, prev_x, prev_y; boolean keep_going = TRUE; /* Use Bresenham's Line Algorithm to walk from src to dest */ dx = dest_cc->x - src_cc->x; dy = dest_cc->y - src_cc->y; prev_x = x = src_cc->x; prev_y = y = src_cc->y; if (dx < 0) { x_change = -1; dx = -dx; } else x_change = 1; if (dy < 0) { y_change = -1; dy = -dy; } else y_change = 1; i = err = 0; if (dx < dy) { while (i++ < dy) { prev_x = x; prev_y = y; y += y_change; err += dx; if (err >= dy) { x += x_change; err -= dy; } /* check for early exit condition */ if (!(keep_going = (*check_proc)(arg, x, y))) break; } } else { while (i++ < dx) { prev_x = x; prev_y = y; x += x_change; err += dy; if (err >= dx) { y += y_change; err -= dx; } /* check for early exit condition */ if (!(keep_going = (*check_proc)(arg, x, y))) break; } } if (keep_going) return TRUE; /* successful */ dest_cc->x = prev_x; dest_cc->y = prev_y; return FALSE; } /* * 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 * your movements at the time. * * Possible additions/changes: * o really attack monster if we hit one * o set stunned if we hit a wall or door * o reset nomul when we stop * o creepy feeling if pass through monster (if ever implemented...) * o bounce off walls * o let jumps go over boulders */ boolean hurtle_step(arg, x, y) genericptr_t arg; int x, y; { int ox, oy, *range = (int *)arg; 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; } else if (!in_out_region(x, y)) { return FALSE; } else if (*range == 0) { return FALSE; /* previous step wants to stop now */ } if (!Passes_walls || !(may_pass = may_passwall(x, y))) { if (IS_ROCK(levl[x][y].typ) || closed_door(x,y)) { const 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) { You("crash into some iron bars. Ouch!"); losehp(rnd(2+*range), "crashing into iron bars", KILLED_BY); return FALSE; } if ((obj = sobj_at(BOULDER,x,y)) != 0) { You("bump into a %s. Ouch!", xname(obj)); losehp(rnd(2+*range), "bumping into a boulder", KILLED_BY); return FALSE; } if (!may_pass) { /* did we hit a no-dig non-wall position? */ You("smack into something!"); losehp(rnd(2+*range), "touching the edge of the universe", KILLED_BY); return FALSE; } if ((u.ux - x) && (u.uy - y) && bad_rock(&youmonst,u.ux,y) && bad_rock(&youmonst,x,u.uy)) { boolean too_much = (invent && (inv_weight() + weight_cap() > 600)); /* Move at a diagonal. */ if (bigmonst(youmonst.data) || too_much) { You("%sget forcefully wedged into a crevice.", too_much ? "and all your belongings " : ""); losehp(rnd(2+*range), "wedging into a narrow crevice", KILLED_BY); return FALSE; } } } if ((mon = m_at(x, y)) != 0) { You("bump into %s.", a_monnam(mon)); wakeup(mon); return FALSE; } if ((u.ux - x) && (u.uy - y) && bad_rock(&youmonst, u.ux, y) && bad_rock(&youmonst, 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; u.ux = x; u.uy = y; 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); *range = 0; return TRUE; } 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) delay_output(); 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, 0) && 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. * * dx and dy should be the direction of the hurtle, not of the original * kick or throw and be only. */ void hurtle(dx, dy, range, verbose) int dx, dy, range; boolean verbose; { coord uc, cc; /* The chain is stretched vertically, so you shouldn't be able to move * very far diagonally. The premise that you should be able to move one * spot leads to calculations that allow you to only move one spot away * from the ball, if you are levitating over the ball, or one spot * towards the ball, if you are at the end of the chain. Rather than * bother with all of that, assume that there is no slack in the chain * for diagonal movement, give the player a message and return. */ if(Punished && !carried(uball)) { You_feel("a tug from the iron ball."); nomul(0); return; } else if (u.utrap) { You("are anchored by the %s.", u.utraptype == TT_WEB ? "web" : u.utraptype == TT_LAVA ? "lava" : u.utraptype == TT_INFLOOR ? surface(u.ux,u.uy) : "trap"); nomul(0); return; } /* make sure dx and dy are [-1,0,1] */ dx = sgn(dx); dy = sgn(dy); if(!range || (!dx && !dy) || u.ustuck) return; /* paranoia */ nomul(-range); nomovemsg = 0; 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; uc.y = u.uy; /* this setting of cc is only correct if dx and dy are [-1,0,1] only */ cc.x = u.ux + (dx * range); cc.y = u.uy + (dy * range); (void) walk_path(&uc, &cc, hurtle_step, (genericptr_t)&range); teleds(cc.x, cc.y, FALSE); } /* 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; register xchar x, y; register boolean broken; { struct monst *shkp = shop_keeper(*u.ushops); if(!shkp) return; if(broken) { if (obj->unpaid) { (void)stolen_value(obj, u.ux, u.uy, (boolean)shkp->mpeaceful, FALSE, TRUE); subfrombill(obj, shkp); } obj->no_charge = 1; return; } if (!costly_spot(x, y) || *in_rooms(x, y, SHOPBASE) != *u.ushops) { /* thrown out of a shop or into a different shop */ if (obj->unpaid) { (void)stolen_value(obj, u.ux, u.uy, (boolean)shkp->mpeaceful, FALSE, FALSE); subfrombill(obj, shkp); } } else { if (costly_spot(u.ux, u.uy) && costly_spot(x, y)) { if(obj->unpaid) subfrombill(obj, shkp); else if(!(x == shkp->mx && y == shkp->my)) sellobj(obj, x, y); } } } /* * Hero tosses an object upwards with appropriate consequences. * * Returns FALSE if the object is gone. */ STATIC_OVL boolean toss_up(obj, hitsroof) struct obj *obj; boolean hitsroof; { const char *almost; /* note: obj->quan == 1 */ if (hitsroof) { if (breaktest(obj)) { pline("%s hits the %s.", Doname2(obj), ceiling(u.ux, u.uy)); breakmsg(obj, !Blind); breakobj(obj, u.ux, u.uy, TRUE, TRUE); return FALSE; } almost = ""; } else { almost = " almost"; } pline("%s%s hits the %s, then falls back on top of your %s.", Doname2(obj), almost, ceiling(u.ux,u.uy), body_part(HEAD)); /* object now hits you */ if (obj->oclass == POTION_CLASS) { potionhit(&youmonst, obj, TRUE); } else if (breaktest(obj)) { 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 */ switch (otyp) { case EGG: if (touch_petrifies(&mons[ocorpsenm]) && !uarmh && !Stone_resistance && !(poly_when_stoned(youmonst.data) && polymon(PM_STONE_GOLEM))) goto petrify; 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: break; } 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; else if (dmg > 6) dmg = 6; if (youmonst.data == &mons[PM_SHADE] && objects[obj->otyp].oc_material != SILVER) dmg = 0; } 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])) { if (!Stone_resistance && !(poly_when_stoned(youmonst.data) && polymon(PM_STONE_GOLEM))) { petrify: killer_format = KILLED_BY; killer = "elementary physics"; /* "what goes up..." */ You("turn to stone."); if (obj) dropy(obj); /* bypass most of hitfloor() */ done(STONING); return obj ? TRUE : FALSE; } } hitfloor(obj); losehp(dmg, "falling object", KILLED_BY_AN); } return TRUE; } /* return true for weapon meant to be thrown; excludes ammo */ STATIC_OVL boolean throwing_weapon(obj) struct obj *obj; { return (is_missile(obj) || is_spear(obj) || /* daggers and knife (excludes scalpel) */ (is_blade(obj) && !is_sword(obj) && (objects[obj->otyp].oc_dir & PIERCE)) || /* special cases [might want to add AXE] */ obj->otyp == WAR_HAMMER || obj->otyp == AKLYS); } /* the currently thrown object is returning to you (not for boomerangs) */ STATIC_OVL void sho_obj_return_to_u(obj) struct obj *obj; { /* might already be our location (bounced off a wall) */ if (bhitpos.x != u.ux || bhitpos.y != u.uy) { int x = bhitpos.x - u.dx, y = bhitpos.y - u.dy; tmp_at(DISP_FLASH, obj_to_glyph(obj)); while(x != u.ux || y != u.uy) { tmp_at(x, y); delay_output(); x -= u.dx; y -= u.dy; } tmp_at(DISP_END, 0); } } void throwit(obj, wep_mask, twoweap, thrown) struct obj *obj; long wep_mask; /* used to re-equip returning boomerang */ boolean twoweap; /* used to restore twoweapon mode if wielded weapon returns */ int thrown; { register struct monst *mon; register int range, urange; struct obj *launcher = (struct obj*) 0; boolean impaired = (Confusion || Stunned || Blind || Hallucination || Fumbling); if (thrown == 1) launcher = uwep; else if (thrown == 2) launcher = uswapwep; /* KMH -- Handle Plague here */ if (launcher && launcher->oartifact == ART_PLAGUE && ammo_and_launcher(obj, launcher) && is_poisonable(obj)) obj->opoisoned = 1; obj->was_thrown = 1; if ((obj->cursed || obj->greased) && (u.dx || u.dy) && !rn2(7)) { boolean slipok = TRUE; if (ammo_and_launcher(obj, launcher)) 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) { u.dx = rn2(3)-1; u.dy = rn2(3)-1; if (!u.dx && !u.dy) u.dz = 1; impaired = TRUE; } } 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; } thrownobj = obj; if(u.uswallow) { mon = u.ustuck; bhitpos.x = mon->mx; bhitpos.y = mon->my; } 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, TRUE); u.twoweap = twoweap; /* if (!fire_weapon) setuwep(obj); else setuqwep(obj);*/ return; } #ifdef FIREARMS /* [ALI] * Grenades are armed but are then processed by toss_up/hitfloor * as normal. * * Bullets just disappear with no message. * * Rockets hit the ceiling/floor and explode. */ else if (is_grenade(obj)) arm_bomb(obj, TRUE); else if (is_bullet(obj) && ammo_and_launcher(obj, launcher)) { if (!Is_airlevel(&u.uz) && !Is_waterlevel(&u.uz) && !Underwater && (objects[obj->otyp].oc_dir & EXPLOSION)) { pline("%s hit%s the %s and explodes in a ball of fire!", Doname2(obj), (obj->quan == 1L) ? "s" : "", u.dz < 0 ? ceiling(u.ux, u.uy) : surface(u.ux, u.uy)); explode(u.ux, u.uy, ZT_SPELL(ZT_FIRE), d(3, 8), WEAPON_CLASS, EXPL_FIERY); } check_shop_obj(obj, u.ux, u.uy, TRUE); obfree(obj, (struct obj *)0); return; } #endif if (u.dz < 0 && !Is_airlevel(&u.uz) && !Underwater && !Is_waterlevel(&u.uz)) { (void) toss_up(obj, rn2(5)); } else { hitfloor(obj); } thrownobj = (struct obj*)0; return; } else if(obj->otyp == BOOMERANG && !Underwater) { if(Is_airlevel(&u.uz) || Levitation) hurtle(-u.dx, -u.dy, 1, TRUE); mon = boomhit(u.dx, u.dy); if(mon == &youmonst) { /* the thing was caught */ exercise(A_DEX, TRUE); obj = addinv(obj); (void) encumber_msg(); if (wep_mask && !(obj->owornmask & wep_mask)) { setworn(obj, wep_mask); u.twoweap = twoweap; } thrownobj = (struct obj*)0; return; } } else { urange = (int)(ACURRSTR)/2; /* balls are easy to throw or at least roll */ /* also, this insures the maximum range of a ball is greater * than 1, so the effects from throwing attached balls are * actually possible */ if (obj->otyp == HEAVY_IRON_BALL) range = urange - (int)(obj->owt/100); else range = urange - (int)(obj->owt/40); if (obj == uball) { if (u.ustuck) range = 1; else if (range >= 5) range = 5; } if (range < 1) range = 1; /* KMH, balance patch -- new macros */ if (is_ammo(obj)) { if (ammo_and_launcher(obj, launcher)) { #ifdef FIREARMS if (is_launcher(launcher) && objects[(launcher->otyp)].oc_range) range = objects[(launcher->otyp)].oc_range; else #endif range++; } else if (obj->oclass != GEM_CLASS) range /= 2; } if (Is_airlevel(&u.uz) || Levitation) { /* action, reaction... */ urange -= range; if(urange < 1) urange = 1; range -= urange; if(range < 1) range = 1; } if (obj->otyp == BOULDER) range = 20; /* you must be giant */ else if (obj->oartifact == ART_MJOLLNIR) range = (range + 1) / 2; /* it's heavy */ else if (obj == uball && u.utrap && u.utraptype == TT_INFLOOR) range = 1; if (Underwater) range = 1; mon = bhit(u.dx,u.dy,range,THROWN_WEAPON, (int FDECL((*),(MONST_P,OBJ_P)))0, (int FDECL((*),(OBJ_P,OBJ_P)))0, &obj); /* have to do this after bhit() so u.ux & u.uy are correct */ if(Is_airlevel(&u.uz) || Levitation) hurtle(-u.dx, -u.dy, urange, TRUE); if (!obj) { thrownobj = (struct obj *)0; return; } } if(mon) { boolean obj_gone; if (mon->isshk && obj->where == OBJ_MINVENT && obj->ocarry == mon) { thrownobj = (struct obj*)0; return; /* alert shk caught it */ } (void) snuff_candle(obj); notonhead = (bhitpos.x != mon->mx || bhitpos.y != mon->my); obj_gone = thitmonst(mon, obj, thrown); /* Monster may have been tamed; this frees old mon */ mon = m_at(bhitpos.x, bhitpos.y); /* [perhaps this should be moved into thitmonst or hmon] */ if (mon && mon->isshk && (!inside_shop(u.ux, u.uy) || !index(in_rooms(mon->mx, mon->my, SHOPBASE), *u.ushops))) hot_pursuit(mon); if (obj_gone) return; } #ifdef FIREARMS /* Handle grenades or rockets */ if (is_grenade(obj)) { arm_bomb(obj, TRUE); } else if (ammo_and_launcher(obj, launcher) && (objects[obj->otyp].oc_dir & EXPLOSION)) { if (cansee(bhitpos.x,bhitpos.y)) pline("%s explodes in a ball of fire!", Doname2(obj)); else You_hear("an explosion"); explode(bhitpos.x, bhitpos.y, ZT_SPELL(ZT_FIRE), d(3,8), WEAPON_CLASS, EXPL_FIERY); } if (is_bullet(obj) && (ammo_and_launcher(obj, launcher) && !is_grenade(obj))) { check_shop_obj(obj, bhitpos.x,bhitpos.y, TRUE); obfree(obj, (struct obj *)0); return; } #endif if (u.uswallow) { /* ball is not picked up by monster */ if (obj != uball) (void) mpickobj(u.ustuck,obj); } else { /* the code following might become part of dropy() */ if (obj->oartifact == ART_MJOLLNIR && Role_if(PM_VALKYRIE) && rn2(100)) { /* we must be wearing Gauntlets of Power to get here */ 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, TRUE); 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), obj_is_pname(obj) ? KILLED_BY : KILLED_BY_AN); } if (ship_object(obj, u.ux, u.uy, FALSE)) { thrownobj = (struct obj*)0; return; } dropy(obj); } thrownobj = (struct obj*)0; return; } if (!IS_SOFT(levl[bhitpos.x][bhitpos.y].typ) && breaktest(obj)) { tmp_at(DISP_FLASH, obj_to_glyph(obj)); tmp_at(bhitpos.x, bhitpos.y); delay_output(); tmp_at(DISP_END, 0); breakmsg(obj, cansee(bhitpos.x, bhitpos.y)); breakobj(obj, bhitpos.x, bhitpos.y, TRUE, TRUE); 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.", Monnam(mon), the(xname(obj))); if(*u.ushops) check_shop_obj(obj, bhitpos.x, bhitpos.y, FALSE); (void) mpickobj(mon, obj); /* may merge and free obj */ thrownobj = (struct obj*)0; return; } (void) snuff_candle(obj); if (!mon && ship_object(obj, bhitpos.x, bhitpos.y, FALSE)) { thrownobj = (struct obj*)0; return; } thrownobj = (struct obj*)0; place_object(obj, bhitpos.x, bhitpos.y); if(*u.ushops && obj != uball) check_shop_obj(obj, bhitpos.x, bhitpos.y, FALSE); stackobj(obj); if (obj == uball) drop_ball(bhitpos.x, bhitpos.y); if (cansee(bhitpos.x, bhitpos.y)) newsym(bhitpos.x,bhitpos.y); if (obj_sheds_light(obj)) vision_full_recalc = 1; if (!IS_SOFT(levl[bhitpos.x][bhitpos.y].typ)) container_impact_dmg(obj); } } /* an object may hit a monster; various factors adjust the chance of hitting */ int omon_adj(mon, obj, mon_notices) struct monst *mon; struct obj *obj; boolean mon_notices; { int tmp = 0; /* size of target affects the chance of hitting */ tmp += (mon->data->msize - MZ_MEDIUM); /* -2..+5 */ /* sleeping target is more likely to be hit */ if (mon->msleeping) { tmp += 2; if (mon_notices) mon->msleeping = 0; } /* ditto for immobilized target */ if (!mon->mcanmove || !mon->data->mmove) { tmp += 4; if (mon_notices && mon->data->mmove && !rn2(10)) { mon->mcanmove = 1; mon->mfrozen = 0; } } /* some objects are more likely to hit than others */ switch (obj->otyp) { case HEAVY_IRON_BALL: if (obj != uball) tmp += 2; break; case BOULDER: tmp += 6; break; default: if (obj->oclass == WEAPON_CLASS || is_weptool(obj) || obj->oclass == GEM_CLASS) tmp += hitval(obj, mon); break; } return tmp; } /* thrown object misses target monster */ STATIC_OVL void tmiss(obj, mon) 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 %s.", The(missile), otense(obj, "miss")); else miss(missile, mon); if (!rn2(3)) wakeup(mon); return; } #define quest_arti_hits_leader(obj,mon) \ (obj->oartifact && is_quest_artifact(obj) && (mon->data->msound == MS_LEADER)) /* * Object thrown by player arrives at monster's location. * Return 1 if obj has disappeared or otherwise been taken care of, * 0 if caller must take care of it. */ int thitmonst(mon, obj, thrown) register struct monst *mon; register struct obj *obj; int thrown; { register int tmp; /* Base chance to hit */ register int disttmp; /* distance modifier */ struct obj *launcher; int otyp = obj->otyp; boolean guaranteed_hit = (u.uswallow && mon == u.ustuck); /* Differences from melee weapons: * * Dex still gives a bonus, but strength does not. * Polymorphed players lacking attacks may still throw. * There's a base -1 to hit. * No bonuses for fleeing or stunned targets (they don't dodge * melee blows as readily, but dodging arrows is hard anyway). * Not affected by traps, etc. * Certain items which don't in themselves do damage ignore tmp. * Distance and monster size affect chance to hit. */ /* KMH -- added ring of increase accuracy */ if (thrown == 1) launcher = uwep; else if (thrown == 2) launcher = uswapwep; else launcher = (struct obj *)0; tmp = -1 + Luck + find_mac(mon) + u.uhitinc + maybe_polyd(youmonst.data->mlevel, u.ulevel); if (ACURR(A_DEX) < 4) tmp -= 3; else if (ACURR(A_DEX) < 6) tmp -= 2; else if (ACURR(A_DEX) < 8) tmp -= 1; else if (ACURR(A_DEX) >= 14) tmp += (ACURR(A_DEX) - 14); /* Modify to-hit depending on distance; but keep it sane. * Polearms get a distance penalty even when wielded; it's * hard to hit at a distance. */ disttmp = 3 - distmin(u.ux, u.uy, mon->mx, mon->my); if(disttmp < -4) disttmp = -4; tmp += disttmp; /* gloves are a hinderance to proper use of bows */ if (uarmg && launcher && objects[launcher->otyp].oc_skill == P_BOW) { switch (uarmg->otyp) { case GAUNTLETS_OF_POWER: /* metal */ tmp -= 2; break; case GAUNTLETS_OF_FUMBLING: tmp -= 3; break; case LEATHER_GLOVES: case GAUNTLETS_OF_SWIMMING: case GAUNTLETS_OF_DEXTERITY: break; default: impossible("Unknown type of gloves (%d)", uarmg->otyp); break; } } tmp += omon_adj(mon, obj, TRUE); if (is_orc(mon->data) && maybe_polyd(is_elf(youmonst.data), Race_if(PM_ELF))) tmp++; if (guaranteed_hit) { tmp += 1000; /* Guaranteed hit */ } /* sleeping unicorns don't catch gems */ if (obj->oclass == GEM_CLASS && is_unicorn(mon->data) && !mon->msleeping) { if (mon->mtame) { pline("%s catches and drops %s.", Monnam(mon), the(xname(obj))); return 0; } else { pline("%s catches %s.", Monnam(mon), the(xname(obj))); return gem_accept(mon, obj); } } /* don't make game unwinnable if naive player throws artifact at leader.... */ if (quest_arti_hits_leader(obj, mon)) { /* not wakeup(), which angers non-tame monsters */ mon->msleeping = 0; mon->mstrategy &= ~STRAT_WAITMASK; if (mon->mcanmove) { pline("%s catches %s.", Monnam(mon), the(xname(obj))); if (mon->mpeaceful) { boolean next2u = monnear(mon, u.ux, u.uy); finish_quest(obj); /* acknowledge quest completion */ pline("%s %s %s back to you.", Monnam(mon), (next2u ? "hands" : "tosses"), the(xname(obj))); if (!next2u) sho_obj_return_to_u(obj); obj = addinv(obj); /* back into your inventory */ (void) encumber_msg(); } else { /* angry leader caught it and isn't returning it */ (void) mpickobj(mon, obj); } return 1; /* caller doesn't need to place it */ } return(0); } if (obj->oclass == WEAPON_CLASS || is_weptool(obj) || obj->oclass == GEM_CLASS) { if (is_ammo(obj)) { if (!ammo_and_launcher(obj, launcher)) { tmp -= 4; } else { tmp += launcher->spe - greatest_erosion(launcher); tmp += weapon_hit_bonus(launcher); if (launcher->oartifact) tmp += spec_abon(launcher, 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) || Race_if(PM_DROW) || Role_if(PM_SAMURAI)) && (!Upolyd || your_race(youmonst.data)) && objects[launcher->otyp].oc_skill == P_BOW) { tmp++; if (Race_if(PM_ELF) && launcher->otyp == ELVEN_BOW) tmp++; else if (Race_if(PM_DROW) && launcher->otyp == DARK_ELVEN_BOW) tmp++; else if (Role_if(PM_SAMURAI) && launcher->otyp == YUMI) tmp++; } } } else { if (otyp == BOOMERANG) /* arbitrary */ tmp += 4; else if (throwing_weapon(obj)) /* meant to be thrown */ tmp += 2; else /* not meant to be thrown */ tmp -= 2; /* we know we're dealing with a weapon or weptool handled by WEAPON_SKILLS once ammo objects have been excluded */ tmp += weapon_hit_bonus(obj); } #ifdef DEBUG pline("(%i/20)", tmp); #endif if (tmp >= rnd(20)) { if (hmon(mon,obj,thrown?thrown:3)) { /* mon still alive */ (void) cutworm(mon, bhitpos.x, bhitpos.y, obj); } exercise(A_DEX, TRUE); /* Detonate bolts shot by Hellfire */ if (ammo_and_launcher(obj, launcher) && (launcher->oartifact == ART_HELLFIRE)) { if (cansee(bhitpos.x,bhitpos.y)) pline("%s explodes in a ball of fire!", Doname2(obj)); else You_hear("an explosion"); explode(bhitpos.x, bhitpos.y, ZT_SPELL(ZT_FIRE), d(2,6), WEAPON_CLASS, EXPL_FIERY); } /* projectiles other than magic stones * sometimes disappear when thrown * WAC - Spoon always disappears after doing damage */ if (((objects[otyp].oc_skill < P_NONE && objects[otyp].oc_skill > -P_BOOMERANG) || (obj->oclass == GEM_CLASS && !objects[otyp].oc_magic)) # ifdef P_SPOON || (obj->oartifact == ART_HOUCHOU) # endif /* WAC catch Hellfire */ || (launcher && launcher->oartifact == ART_HELLFIRE && is_ammo(obj) && ammo_and_launcher(obj, launcher)) ) { /* we were breaking 2/3 of everything unconditionally. * we still don't want anything to survive unconditionally, * but we need ammo to stay around longer on average. */ int broken, chance; chance = 3 + greatest_erosion(obj) - obj->spe; if (chance > 1) broken = rn2(chance); else broken = !rn2(4); if (obj->blessed && !rnl(4)) broken = 0; if (broken) { if (*u.ushops) check_shop_obj(obj, bhitpos.x,bhitpos.y, TRUE); #ifdef FIREARMS /* * Thrown grenades and explosive ammo used with the * relevant launcher explode rather than simply * breaking. */ if ((thrown == 1 || thrown == 2) && is_grenade(obj)) { grenade_explode(obj, bhitpos.x, bhitpos.y, TRUE, 0); } else if (ammo_and_launcher(obj, launcher) && (objects[obj->otyp].oc_dir & EXPLOSION)) { if (cansee(bhitpos.x,bhitpos.y)) pline("%s explodes in a ball of fire!", Doname2(obj)); else You_hear("an explosion"); explode(bhitpos.x, bhitpos.y, ZT_SPELL(ZT_FIRE), d(3,8), WEAPON_CLASS, EXPL_FIERY); obfree(obj, (struct obj *)0); } else #endif obfree(obj, (struct obj *)0); return 1; } } passive_obj(mon, obj, (struct attack *)0); } else { tmiss(obj, mon); } } else if (otyp == HEAVY_IRON_BALL) { exercise(A_STR, TRUE); if (tmp >= rnd(20)) { int was_swallowed = guaranteed_hit; exercise(A_DEX, TRUE); if (!hmon(mon,obj,thrown?thrown:3)) { /* mon killed */ if (was_swallowed && !u.uswallow && obj == uball) return 1; /* already did placebc() */ } } else { tmiss(obj, mon); } } else if (otyp == BOULDER) { exercise(A_STR, TRUE); if (tmp >= rnd(20)) { exercise(A_DEX, TRUE); (void) hmon(mon,obj,thrown?thrown:3); } else { tmiss(obj, mon); } } else if ((otyp == EGG || otyp == CREAM_PIE || otyp == BLINDING_VENOM || otyp == ACID_VENOM) && (guaranteed_hit || ACURR(A_DEX) > rnd(25))) { (void) hmon(mon, obj, thrown?thrown:3); return 1; /* hmon used it up */ } else if (obj->oclass == POTION_CLASS && (guaranteed_hit || ACURR(A_DEX) > rnd(25))) { potionhit(mon, obj, TRUE); return 1; } else if (befriend_with_obj(mon->data, obj) || (mon->mtame && dogfood(mon, obj) <= ACCFOOD)) { 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); } return 0; } STATIC_OVL int gem_accept(mon, obj) register struct monst *mon; register struct obj *obj; { char buf[BUFSZ]; boolean is_buddy = sgn(mon->data->maligntyp) == sgn(u.ualign.type); boolean is_gem = objects[obj->otyp].oc_material == GEMSTONE; int ret = 0; static NEARDATA const char nogood[] = " is not interested in your junk."; static NEARDATA const char acceptgift[] = " accepts your gift."; static NEARDATA const char maybeluck[] = " hesitatingly"; static NEARDATA const char noluck[] = " graciously"; static NEARDATA const char addluck[] = " gratefully"; Strcpy(buf,Monnam(mon)); mon->mpeaceful = 1; mon->mavenge = 0; /* object properly identified */ if(obj->dknown && objects[obj->otyp].oc_name_known) { if(is_gem) { if(is_buddy) { Strcat(buf,addluck); change_luck(5); } else { Strcat(buf,maybeluck); change_luck(rn2(7)-3); } } else { Strcat(buf,nogood); goto nopick; } /* making guesses */ } else if(obj->onamelth || objects[obj->otyp].oc_uname) { if(is_gem) { if(is_buddy) { Strcat(buf,addluck); change_luck(2); } else { Strcat(buf,maybeluck); change_luck(rn2(3)-1); } } else { Strcat(buf,nogood); goto nopick; } /* value completely unknown to @ */ } else { if(is_gem) { if(is_buddy) { Strcat(buf,addluck); change_luck(1); } else { Strcat(buf,maybeluck); change_luck(rn2(3)-1); } } else { Strcat(buf,noluck); } } Strcat(buf,acceptgift); if(*u.ushops) check_shop_obj(obj, mon->mx, mon->my, TRUE); (void) mpickobj(mon, obj); /* may merge and free obj */ ret = 1; nopick: if(!Blind) pline("%s", buf); if (!tele_restrict(mon)) (void) rloc(mon, FALSE); return(ret); } /* * Comments about the restructuring of the old breaks() routine. * * There are now three distinct phases to object breaking: * breaktest() - which makes the check/decision about whether the * object is going to break. * breakmsg() - which outputs a message about the breakage, * appropriate for that particular object. Should * only be called after a positve breaktest(). * on the object and, if it going to be called, * it must be called before calling breakobj(). * Calling breakmsg() is optional. * breakobj() - which actually does the breakage and the side-effects * of breaking that particular object. This should * only be called after a positive breaktest() on the * object. * * Each of the above routines is currently static to this source module. * There are two routines callable from outside this source module which * perform the routines above in the correct sequence. * * hero_breaks() - called when an object is to be broken as a result * of something that the hero has done. (throwing it, * kicking it, etc.) * breaks() - called when an object is to be broken for some * reason other than the hero doing something to it. */ /* * The hero causes breakage of an object (throwing, dropping it, etc.) * Return 0 if the object didn't break, 1 if the object broke. */ int hero_breaks(obj, x, y, from_invent) struct obj *obj; xchar x, y; /* object location (ox, oy may not be right) */ boolean from_invent; /* thrown or dropped by player; maybe on shop bill */ { boolean in_view = !Blind; if (!breaktest(obj)) return 0; breakmsg(obj, in_view); breakobj(obj, x, y, TRUE, from_invent); return 1; } /* * The object is going to break for a reason other than the hero doing * something to it. * Return 0 if the object doesn't break, 1 if the object broke. */ int breaks(obj, x, y) struct obj *obj; xchar x, y; /* object location (ox, oy may not be right) */ { boolean in_view = Blind ? FALSE : cansee(x, y); if (!breaktest(obj)) return 0; breakmsg(obj, in_view); breakobj(obj, x, y, FALSE, FALSE); return 1; } /* * Unconditionally break an object. Assumes all resistance checks * and break messages have been delivered prior to getting here. */ STATIC_OVL void breakobj(obj, x, y, hero_caused, from_invent) struct obj *obj; xchar x, y; /* object location (ox, oy may not be right) */ boolean hero_caused; /* is this the hero's fault? */ boolean from_invent; { int am; if (IS_ALTAR(levl[x][y].typ)) am = levl[x][y].altarmask & AM_MASK; else am = AM_NONE; switch (obj->oclass == POTION_CLASS ? POT_WATER : obj->otyp) { case MIRROR: if (hero_caused) change_luck(-2); break; case POT_WATER: /* really, all potions */ if (obj->otyp == POT_OIL && obj->lamplit) { splatter_burning_oil(x,y); } else if ((obj->otyp == POT_VAMPIRE_BLOOD || obj->otyp == POT_BLOOD) && am != AM_CHAOTIC && am != AM_NONE) { /* ALI: If blood is spilt on a lawful or * neutral altar the effect is similar to * human sacrifice. There's no effect on * chaotic or unaligned altars since it is * not sufficient to summon a demon. */ if (hero_caused) { /* Regardless of your race/alignment etc. * Lawful and neutral gods really _dont_ * like vampire or (presumed) human blood * on their altars. */ pline("You'll regret this infamous offense!"); exercise(A_WIS, FALSE); } /* curse the lawful/neutral altar */ pline_The("altar is stained with blood."); if (!Is_astralevel(&u.uz)) levl[x][y].altarmask = AM_CHAOTIC; angry_priest(); } 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; case EGG: /* breaking your own eggs is bad luck */ if (hero_caused && obj->spe && obj->corpsenm >= LOW_PM) change_luck((schar) -min(obj->quan, 5L)); break; } if (hero_caused) { if (from_invent) { if (*u.ushops) check_shop_obj(obj, x, y, TRUE); } else if (!obj->no_charge && costly_spot(x, y)) { /* it is assumed that the obj is a floor-object */ char *o_shop = in_rooms(x, y, SHOPBASE); struct monst *shkp = shop_keeper(*o_shop); if (shkp) { /* (implies *o_shop != '\0') */ static NEARDATA long lastmovetime = 0L; static NEARDATA boolean peaceful_shk = FALSE; /* We want to base shk actions on her peacefulness at start of this turn, so that "simultaneous" multiple breakage isn't drastically worse than single breakage. (ought to be done via ESHK) */ if (moves != lastmovetime) peaceful_shk = shkp->mpeaceful; if (stolen_value(obj, x, y, peaceful_shk, FALSE, TRUE) > 0L && (*o_shop != u.ushops[0] || !inside_shop(u.ux, u.uy)) && moves != lastmovetime) make_angry_shk(shkp, x, y); lastmovetime = moves; } } } delobj(obj); } /* * Check to see if obj is going to break, but don't actually break it. * Return 0 if the object isn't going to break, 1 if it is. */ boolean breaktest(obj) 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 case POT_WATER: /* really, all potions */ case EGG: case CREAM_PIE: case MELON: case ACID_VENOM: case BLINDING_VENOM: return 1; default: return 0; } } STATIC_OVL void breakmsg(obj, in_view) struct obj *obj; boolean in_view; { const char *to_pieces; 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 case EXPENSIVE_CAMERA: #endif to_pieces = " into a thousand pieces"; /*FALLTHRU*/ case POT_WATER: /* really, all potions */ if (!in_view) You_hear("%s shatter!", something); else pline("%s shatter%s%s!", Doname2(obj), (obj->quan==1) ? "s" : "", to_pieces); break; case EGG: case MELON: pline("Splat!"); break; case CREAM_PIE: if (in_view) pline("What a mess!"); break; case ACID_VENOM: case BLINDING_VENOM: pline("Splash!"); break; } } STATIC_OVL int throw_gold(obj) 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) { #ifndef GOLDOBJ u.ugold += obj->quan; flags.botl = 1; dealloc_obj(obj); #endif 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); } if(u.dz) { if (u.dz < 0 && !Is_airlevel(&u.uz) && !Underwater && !Is_waterlevel(&u.uz)) { pline_The("gold hits the %s, then falls back on top of your %s.", ceiling(u.ux,u.uy), body_part(HEAD)); /* some self damage? */ if(uarmh) pline("Fortunately, you are wearing a helmet!"); } bhitpos.x = u.ux; bhitpos.y = u.uy; } else { /* consistent with range for normal objects */ range = (int)((ACURRSTR)/2 - obj->owt/40); /* see if the gold has a place to move into */ odx = u.ux + u.dx; ody = u.uy + u.dy; if(!ZAP_POS(levl[odx][ody].typ) || closed_door(odx, ody)) { bhitpos.x = u.ux; bhitpos.y = u.uy; } else { mon = bhit(u.dx, u.dy, range, THROWN_WEAPON, (int FDECL((*),(MONST_P,OBJ_P)))0, (int FDECL((*),(OBJ_P,OBJ_P)))0, &obj); if (!obj) return 1; if(mon) { if (ghitm(mon, obj)) /* was it caught? */ return 1; } else { if(ship_object(obj, bhitpos.x, bhitpos.y, FALSE)) return 1; } } } if(flooreffects(obj,bhitpos.x,bhitpos.y,"fall")) return(1); if(u.dz > 0) pline_The("gold hits the %s.", surface(bhitpos.x,bhitpos.y)); place_object(obj,bhitpos.x,bhitpos.y); if(*u.ushops) sellobj(obj, bhitpos.x, bhitpos.y); stackobj(obj); newsym(bhitpos.x,bhitpos.y); return(1); } /*dothrow.c*/ slashem-0.0.7E7F3/src/questpgr.c0000664000076400007640000002333010545462317014462 0ustar aliali/* SCCS Id: @(#)questpgr.c 3.4 2000/05/05 */ /* Copyright 1991, M. Stephenson */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" #include "dlb.h" /* quest-specific pager routines. */ #include "qtext.h" #define QTEXT_AREA FILE_AREA_SHARE #define QTEXT_FILE "quest.dat" /* #define DEBUG */ /* uncomment for debugging */ static void FDECL(Fread, (genericptr_t,int,int,dlb *)); STATIC_DCL struct qtmsg * FDECL(construct_qtlist, (long)); STATIC_DCL const char * NDECL(intermed); STATIC_DCL const char * NDECL(neminame); STATIC_DCL const char * NDECL(guardname); STATIC_DCL const char * NDECL(homebase); STATIC_DCL struct qtmsg * FDECL(msg_in, (struct qtmsg *,int)); STATIC_DCL void FDECL(convert_arg, (CHAR_P)); STATIC_DCL void NDECL(convert_line); STATIC_DCL void FDECL(deliver_by_pline, (struct qtmsg *)); STATIC_DCL void FDECL(deliver_by_window, (struct qtmsg *,int)); static char in_line[80], cvt_buf[64], out_line[128]; static struct qtlists qt_list; static dlb *msg_file; /* used by ldrname() and neminame(), then copied into cvt_buf */ static char nambuf[sizeof cvt_buf]; #ifdef DEBUG static void NDECL(dump_qtlist); static void dump_qtlist() /* dump the character msg list to check appearance */ { struct qtmsg *msg; long size; for (msg = qt_list.chrole; msg->msgnum > 0; msg++) { pline("msgnum %d: delivery %c", msg->msgnum, msg->delivery); more(); (void) dlb_fseek(msg_file, msg->offset, SEEK_SET); deliver_by_window(msg, NHW_TEXT); } } #endif /* DEBUG */ static void Fread(ptr, size, nitems, stream) genericptr_t ptr; int size, nitems; dlb *stream; { int cnt; if ((cnt = dlb_fread(ptr, size, nitems, stream)) != nitems) { panic("PREMATURE EOF ON QUEST TEXT FILE! Expected %d bytes, got %d", (size * nitems), (size * cnt)); } } STATIC_OVL struct qtmsg * construct_qtlist(hdr_offset) long hdr_offset; { struct qtmsg *msg_list; int n_msgs; (void) dlb_fseek(msg_file, hdr_offset, SEEK_SET); Fread(&n_msgs, sizeof(int), 1, msg_file); msg_list = (struct qtmsg *) alloc((unsigned)(n_msgs+1)*sizeof(struct qtmsg)); /* * Load up the list. */ Fread((genericptr_t)msg_list, n_msgs*sizeof(struct qtmsg), 1, msg_file); msg_list[n_msgs].msgnum = -1; return(msg_list); } void load_qtlist() { int n_classes, i; char qt_classes[N_HDR][LEN_HDR]; long qt_offsets[N_HDR]; msg_file = dlb_fopen_area(QTEXT_AREA, QTEXT_FILE, RDBMODE); if (!msg_file) panic("CANNOT OPEN QUEST TEXT FILE %s.", QTEXT_FILE); /* * Read in the number of classes, then the ID's & offsets for * each header. */ Fread(&n_classes, sizeof(int), 1, msg_file); Fread(&qt_classes[0][0], sizeof(char)*LEN_HDR, n_classes, msg_file); Fread(qt_offsets, sizeof(long), n_classes, msg_file); /* * Now construct the message lists for quick reference later * on when we are actually paging the messages out. */ qt_list.common = qt_list.chrole = (struct qtmsg *)0; for (i = 0; i < n_classes; i++) { if (!strncmp(COMMON_ID, qt_classes[i], LEN_HDR)) qt_list.common = construct_qtlist(qt_offsets[i]); else if (!strncmp(urole.filecode, qt_classes[i], LEN_HDR)) qt_list.chrole = construct_qtlist(qt_offsets[i]); #if 0 /* UNUSED but available */ else if (!strncmp(urace.filecode, qt_classes[i], LEN_HDR)) qt_list.chrace = construct_qtlist(qt_offsets[i]); #endif } if (!qt_list.common || !qt_list.chrole) impossible("load_qtlist: cannot load quest text."); #ifdef DEBUG dump_qtlist(); #endif return; /* no ***DON'T*** close the msg_file */ } /* called at program exit */ void unload_qtlist() { if (msg_file) (void) dlb_fclose(msg_file), msg_file = 0; if (qt_list.common) free((genericptr_t) qt_list.common), qt_list.common = 0; if (qt_list.chrole) free((genericptr_t) qt_list.chrole), qt_list.chrole = 0; return; } short quest_info(typ) int typ; { switch (typ) { case 0: return (urole.questarti); case MS_LEADER: return (urole.ldrnum); case MS_NEMESIS: return (urole.neminum); case MS_GUARDIAN: return (urole.guardnum); default: impossible("quest_info(%d)", typ); } return 0; } const char * ldrname() /* return your role leader's name */ { int i = urole.ldrnum; Sprintf(nambuf, "%s%s", type_is_pname(&mons[i]) ? "" : "the ", mons[i].mname); return nambuf; } STATIC_OVL const char * intermed() /* return your intermediate target string */ { return (urole.intermed); } boolean is_quest_artifact(otmp) struct obj *otmp; { return((boolean)(otmp->oartifact == urole.questarti)); } STATIC_OVL const char * neminame() /* return your role nemesis' name */ { int i = urole.neminum; Sprintf(nambuf, "%s%s", type_is_pname(&mons[i]) ? "" : "the ", mons[i].mname); return nambuf; } STATIC_OVL const char * guardname() /* return your role leader's guard monster name */ { int i = urole.guardnum; return(mons[i].mname); } STATIC_OVL const char * homebase() /* return your role leader's location */ { return(urole.homebase); } STATIC_OVL struct qtmsg * msg_in(qtm_list, msgnum) struct qtmsg *qtm_list; int msgnum; { struct qtmsg *qt_msg; for (qt_msg = qtm_list; qt_msg->msgnum > 0; qt_msg++) if (qt_msg->msgnum == msgnum) return(qt_msg); return((struct qtmsg *)0); } STATIC_OVL void convert_arg(c) char c; { register const char *str; switch (c) { case 'p': str = plname; break; case 'c': str = (flags.female && urole.name.f) ? urole.name.f : urole.name.m; break; case 'r': str = rank_of(u.ulevel, Role_switch, flags.female); break; case 'R': str = rank_of(MIN_QUEST_LEVEL, Role_switch, flags.female); break; case 's': str = (flags.female) ? "sister" : "brother"; break; case 'S': str = (flags.female) ? "daughter" : "son"; break; case 'l': str = ldrname(); break; case 'i': str = intermed(); break; case 'o': str = the(artiname(urole.questarti)); break; case 'n': str = neminame(); break; case 'g': str = guardname(); break; case 'G': str = align_gtitle(u.ualignbase[A_ORIGINAL]); break; case 'H': str = homebase(); break; case 'a': str = align_str(u.ualignbase[A_ORIGINAL]); break; case 'A': str = align_str(u.ualign.type); break; case 'd': str = align_gname(u.ualignbase[A_ORIGINAL]); break; case 'D': str = align_gname(A_LAWFUL); break; case 'C': str = "chaotic"; break; case 'N': str = "neutral"; break; case 'L': str = "lawful"; break; case 'x': str = Blind ? "sense" : "see"; break; case 'Z': str = dungeons[0].dname; break; case '%': str = "%"; break; default: str = ""; break; } Strcpy(cvt_buf, str); } STATIC_OVL void convert_line() { char *c, *cc; char xbuf[BUFSZ]; cc = out_line; for (c = xcrypt(in_line, xbuf); *c; c++) { *cc = 0; switch(*c) { case '\r': case '\n': *(++cc) = 0; return; case '%': if (*(c+1)) { convert_arg(*(++c)); switch (*(++c)) { /* insert "a"/"an" prefix */ case 'A': Strcat(cc, An(cvt_buf)); cc += strlen(cc); continue; /* for */ case 'a': Strcat(cc, an(cvt_buf)); cc += strlen(cc); continue; /* for */ /* capitalize */ case 'C': cvt_buf[0] = highc(cvt_buf[0]); break; /* pluralize */ case 'P': cvt_buf[0] = highc(cvt_buf[0]); case 'p': Strcpy(cvt_buf, makeplural(cvt_buf)); break; /* append possessive suffix */ case 'S': cvt_buf[0] = highc(cvt_buf[0]); case 's': Strcpy(cvt_buf, s_suffix(cvt_buf)); break; /* strip any "the" prefix */ case 't': if (!strncmpi(cvt_buf, "the ", 4)) { Strcat(cc, &cvt_buf[4]); cc += strlen(cc); continue; /* for */ } break; default: --c; /* undo switch increment */ break; } Strcat(cc, cvt_buf); cc += strlen(cvt_buf); break; } /* else fall through */ default: *cc++ = *c; break; } } if (cc >= out_line + sizeof out_line) panic("convert_line: overflow"); *cc = 0; return; } STATIC_OVL void deliver_by_pline(qt_msg) struct qtmsg *qt_msg; { long size; for (size = 0; size < qt_msg->size; size += (long)strlen(in_line)) { (void) dlb_fgets(in_line, 80, msg_file); convert_line(); pline(out_line); } } STATIC_OVL void deliver_by_window(qt_msg, how) struct qtmsg *qt_msg; int how; { long size; winid datawin = create_nhwindow(how); for (size = 0; size < qt_msg->size; size += (long)strlen(in_line)) { (void) dlb_fgets(in_line, 80, msg_file); convert_line(); putstr(datawin, 0, out_line); } display_nhwindow(datawin, TRUE); destroy_nhwindow(datawin); } void com_pager(msgnum) int msgnum; { struct qtmsg *qt_msg; if (!(qt_msg = msg_in(qt_list.common, msgnum))) { impossible("com_pager: message %d not found.", msgnum); return; } (void) dlb_fseek(msg_file, qt_msg->offset, SEEK_SET); if (qt_msg->delivery == 'p') deliver_by_pline(qt_msg); else if (msgnum == 1) deliver_by_window(qt_msg, NHW_MENU); else deliver_by_window(qt_msg, NHW_TEXT); return; } void qt_pager(msgnum) int msgnum; { struct qtmsg *qt_msg; if (!(qt_msg = msg_in(qt_list.chrole, msgnum))) { impossible("qt_pager: message %d not found.", msgnum); return; } (void) dlb_fseek(msg_file, qt_msg->offset, SEEK_SET); if (qt_msg->delivery == 'p' && strcmp(windowprocs.name, "X11")) deliver_by_pline(qt_msg); else deliver_by_window(qt_msg, NHW_TEXT); return; } struct permonst * qt_montype() { int qpm; if (rn2(5)) { qpm = urole.enemy1num; if (qpm != NON_PM && rn2(5) && !(mvitals[qpm].mvflags & G_GENOD)) return (&mons[qpm]); return (mkclass(urole.enemy1sym, 0)); } qpm = urole.enemy2num; if (qpm != NON_PM && rn2(5) && !(mvitals[qpm].mvflags & G_GENOD)) return (&mons[qpm]); return (mkclass(urole.enemy2sym, 0)); } /*questpgr.c*/ slashem-0.0.7E7F3/src/drawing.c0000664000076400007640000006372210545462317014254 0ustar aliali/* SCCS Id: @(#)drawing.c 3.4 1999/12/02 */ /* Copyright (c) NetHack Development Team 1992. */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" #include "tcap.h" /* Relevent header information in rm.h and objclass.h. */ #ifdef C #undef C #endif #ifdef TEXTCOLOR #define C(n) n #else #define C(n) #endif #define g_FILLER(symbol) 0 uchar oc_syms[MAXOCLASSES] = DUMMY; /* the current object display symbols */ uchar showsyms[MAXPCHARS] = DUMMY; /* the current feature display symbols */ uchar monsyms[MAXMCLASSES] = DUMMY; /* the current monster display symbols */ uchar warnsyms[WARNCOUNT] = DUMMY; /* the current warning display symbols */ /* Default object class symbols. See objclass.h. */ const char def_oc_syms[MAXOCLASSES] = { /* 0*/ '\0', /* placeholder for the "random class" */ ILLOBJ_SYM, WEAPON_SYM, ARMOR_SYM, RING_SYM, /* 5*/ AMULET_SYM, TOOL_SYM, FOOD_SYM, POTION_SYM, SCROLL_SYM, /*10*/ SPBOOK_SYM, WAND_SYM, GOLD_SYM, GEM_SYM, ROCK_SYM, /*15*/ BALL_SYM, CHAIN_SYM, VENOM_SYM }; const char invisexplain[] = "remembered, unseen, creature"; /* Object descriptions. Used in do_look(). */ const char * const objexplain[] = { /* these match def_oc_syms, above */ /* 0*/ 0, "strange object", "weapon", "suit or piece of armor", "ring", /* 5*/ "amulet", "useful item (pick-axe, key, lamp...)", "piece of food", "potion", "scroll", /*10*/ "spell book", "wand", "pile of coins", "gem or rock", "boulder or statue", /*15*/ "iron ball", "iron chain", "splash of venom" }; /* Object class names. Used in object_detect(). */ const char * const oclass_names[] = { /* 0*/ 0, "illegal objects", "weapons", "armor", "rings", /* 5*/ "amulets", "tools", "food", "potions", "scrolls", /*10*/ "spell books", "wands", "coins", "rocks", "large stones", /*15*/ "iron balls", "chains", "venoms" }; /* Default monster class symbols. See monsym.h. */ const char def_monsyms[MAXMCLASSES] = { '\0', /* holder */ DEF_ANT, DEF_BLOB, DEF_COCKATRICE, DEF_DOG, DEF_EYE, DEF_FELINE, DEF_GREMLIN, DEF_HUMANOID, DEF_IMP, DEF_JELLY, /* 10 */ DEF_KOBOLD, DEF_LEPRECHAUN, DEF_MIMIC, DEF_NYMPH, DEF_ORC, DEF_PIERCER, DEF_QUADRUPED, DEF_RODENT, DEF_SPIDER, DEF_TRAPPER, /* 20 */ DEF_UNICORN, DEF_VORTEX, DEF_WORM, DEF_XAN, DEF_LIGHT, DEF_ZRUTY, DEF_ANGEL, DEF_BAT, DEF_CENTAUR, DEF_DRAGON, /* 30 */ DEF_ELEMENTAL, DEF_FUNGUS, DEF_GNOME, DEF_GIANT, '\0', DEF_JABBERWOCK, DEF_KOP, DEF_LICH, DEF_MUMMY, DEF_NAGA, /* 40 */ DEF_OGRE, DEF_PUDDING, DEF_QUANTMECH, DEF_RUSTMONST, DEF_SNAKE, DEF_TROLL, DEF_UMBER, DEF_VAMPIRE, DEF_WRAITH, DEF_XORN, /* 50 */ DEF_YETI, DEF_ZOMBIE, DEF_HUMAN, DEF_GHOST, DEF_GOLEM, DEF_DEMON, DEF_EEL, DEF_LIZARD, DEF_BAD_FOOD, DEF_BAD_COINS, /* 60 */ DEF_WORM_TAIL, DEF_MIMIC_DEF, }; /* The explanations below are also used when the user gives a string * for blessed genocide, so no text should wholly contain any later * text. They should also always contain obvious names (eg. cat/feline). */ /* KMH -- changed u and z */ /* Robin Johnson - changed Q */ const char * const monexplain[MAXMCLASSES] = { 0, "ant or other insect", "blob", "cockatrice", "dog or other canine", "eye or sphere", "cat or other feline", "gremlin", "humanoid", "imp or minor demon", "jelly", "kobold", "leprechaun", "mimic", "nymph", "orc", "piercer", "quadruped", "rodent", "arachnid or centipede", "trapper or lurker above", "unicorn or horse", "vortex", "worm", "xan or other mythical/fantastic insect", "light", "Zouthern animal", #if 0 "light", "zruty", #endif "angelic being", "bat or bird", "centaur", "dragon", "elemental", "fungus or mold", "gnome", "giant humanoid", 0, "jabberwock", "Keystone Kop", "lich", "mummy", "naga", "ogre", "pudding or ooze", "quantum mechanic or other scientist", "rust monster or disenchanter", "snake", "troll", "umber hulk", "vampire", "wraith", "xorn", "apelike creature", "zombie", "human or elf", "ghost", "golem", "major demon", "sea monster", "lizard", "piece of food", "pile of coins", "long worm tail", "mimic" }; const struct symdef def_warnsyms[WARNCOUNT] = { {'0', "unknown creature causing you worry", C(CLR_WHITE)}, /* white warning */ {'1', "unknown creature causing you concern", C(CLR_RED)}, /* pink warning */ {'2', "unknown creature causing you anxiety", C(CLR_RED)}, /* red warning */ {'3', "unknown creature causing you disquiet", C(CLR_RED)}, /* ruby warning */ {'4', "unknown creature causing you alarm", C(CLR_MAGENTA)}, /* purple warning */ {'5', "unknown creature causing you dread", C(CLR_BRIGHT_MAGENTA)} /* black warning */ }; /* * Default screen symbols with explanations and colors. * Note: {ibm|dec|mac}_graphics[] arrays also depend on this symbol order. */ const struct symdef defsyms[MAXPCHARS] = { /* 0*/ {' ', "dark part of a room",C(NO_COLOR)}, /* stone */ {'|', "wall", C(CLR_GRAY)}, /* vwall */ {'-', "wall", C(CLR_GRAY)}, /* hwall */ {'-', "wall", C(CLR_GRAY)}, /* tlcorn */ {'-', "wall", C(CLR_GRAY)}, /* trcorn */ {'-', "wall", C(CLR_GRAY)}, /* blcorn */ {'-', "wall", C(CLR_GRAY)}, /* brcorn */ {'-', "wall", C(CLR_GRAY)}, /* crwall */ {'-', "wall", C(CLR_GRAY)}, /* tuwall */ {'-', "wall", C(CLR_GRAY)}, /* tdwall */ /*10*/ {'|', "wall", C(CLR_GRAY)}, /* tlwall */ {'|', "wall", C(CLR_GRAY)}, /* trwall */ {'.', "doorway", C(CLR_GRAY)}, /* ndoor */ {'-', "open door", C(CLR_BROWN)}, /* vodoor */ {'|', "open door", C(CLR_BROWN)}, /* hodoor */ {'+', "closed door", C(CLR_BROWN)}, /* vcdoor */ {'+', "closed door", C(CLR_BROWN)}, /* hcdoor */ {'#', "iron bars", C(HI_METAL)}, /* bars */ {'#', "tree", C(CLR_GREEN)}, /* tree */ {'.', "floor of a room",C(CLR_GRAY)}, /* room */ /*20*/ {'#', "corridor", C(CLR_BLACK)}, /* dark corr */ {'#', "lit corridor", C(CLR_GRAY)}, /* lit corr (see mapglyph.c) */ {'<', "staircase up", C(CLR_WHITE)}, /* upstair */ {'>', "staircase down", C(CLR_WHITE)}, /* dnstair */ {'<', "ladder up", C(CLR_BROWN)}, /* upladder */ {'>', "ladder down", C(CLR_BROWN)}, /* dnladder */ {'_', "altar", C(CLR_GRAY)}, /* altar */ {'|', "grave", C(CLR_GRAY)}, /* grave */ {'\\', "opulent throne",C(HI_GOLD)}, /* throne */ #ifdef SINKS {'#', "sink", C(CLR_GRAY)}, /* sink */ /*30*/ {'#', "toilet", C(CLR_WHITE)}, /* toilet */ #else {'#', "", C(CLR_GRAY)}, /* sink */ /*30*/ {'\\', "", C(CLR_WHITE)}, /* toilet */ #endif {'{', "fountain", C(CLR_BLUE)}, /* fountain */ {'}', "water", C(CLR_BLUE)}, /* pool */ {'.', "ice", C(CLR_CYAN)}, /* ice */ {'}', "molten lava", C(CLR_RED)}, /* lava */ {'.', "lowered drawbridge",C(CLR_BROWN)}, /* vodbridge */ {'.', "lowered drawbridge",C(CLR_BROWN)}, /* hodbridge */ {'#', "raised drawbridge",C(CLR_BROWN)},/* vcdbridge */ {'#', "raised drawbridge",C(CLR_BROWN)},/* hcdbridge */ {' ', "air", C(CLR_CYAN)}, /* open air */ /*40*/ {'#', "cloud", C(CLR_GRAY)}, /* [part of] a cloud */ {'}', "water", C(CLR_BLUE)}, /* under water */ {'^', "arrow trap", C(HI_METAL)}, /* trap */ {'^', "dart trap", C(HI_METAL)}, /* trap */ {'^', "falling rock trap",C(CLR_GRAY)}, /* trap */ {'^', "squeaky board", C(CLR_BROWN)}, /* trap */ {'^', "bear trap", C(HI_METAL)}, /* trap */ {'^', "land mine", C(CLR_RED)}, /* trap */ {'^', "rolling boulder trap", C(CLR_GRAY)}, /* trap */ {'^', "sleeping gas trap",C(HI_ZAP)}, /* trap */ /*50*/ {'^', "rust trap", C(CLR_BLUE)}, /* trap */ {'^', "fire trap", C(CLR_ORANGE)}, /* trap */ {'^', "pit", C(CLR_BLACK)}, /* trap */ {'^', "spiked pit", C(CLR_BLACK)}, /* trap */ {'^', "hole", C(CLR_BROWN)}, /* trap */ {'^', "trap door", C(CLR_BROWN)}, /* trap */ {'^', "teleportation trap", C(CLR_MAGENTA)}, /* trap */ {'^', "level teleporter", C(CLR_MAGENTA)}, /* trap */ {'^', "magic portal", C(CLR_BRIGHT_MAGENTA)}, /* trap */ {'"', "web", C(CLR_GRAY)}, /* web */ /*60*/ {'^', "statue trap", C(CLR_GRAY)}, /* trap */ {'^', "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 */ {'\\',"wall", C(CLR_GRAY)}, /* lslant */ {'/', "wall", C(CLR_GRAY)}, /* rslant */ {'*', "", C(CLR_WHITE)}, /* dig beam */ {'!', "", C(CLR_WHITE)}, /* camera flash beam */ /*70*/ {')', "", C(HI_WOOD)}, /* boomerang open left */ {'(', "", C(HI_WOOD)}, /* boomerang open right */ {'0', "", C(HI_ZAP)}, /* 4 magic shield symbols */ {'#', "", C(HI_ZAP)}, {'@', "", C(HI_ZAP)}, {'*', "", C(HI_ZAP)}, {'/', "", C(CLR_GREEN)}, /* swallow top left */ {'-', "", C(CLR_GREEN)}, /* swallow top center */ {'\\', "", C(CLR_GREEN)}, /* swallow top right */ {'|', "", C(CLR_GREEN)}, /* swallow middle left */ /*80*/ {'|', "", C(CLR_GREEN)}, /* swallow middle right */ {'\\', "", C(CLR_GREEN)}, /* swallow bottom left */ {'-', "", C(CLR_GREEN)}, /* swallow bottom center*/ {'/', "", C(CLR_GREEN)}, /* swallow bottom right */ {'/', "", C(CLR_ORANGE)}, /* explosion top left */ {'-', "", C(CLR_ORANGE)}, /* explosion top center */ {'\\', "", C(CLR_ORANGE)}, /* explosion top right */ {'|', "", C(CLR_ORANGE)}, /* explosion middle left */ {' ', "", C(CLR_ORANGE)}, /* explosion middle center*/ {'|', "", C(CLR_ORANGE)}, /* explosion middle right */ /*90*/ {'\\', "", C(CLR_ORANGE)}, /* explosion bottom left */ {'-', "", C(CLR_ORANGE)}, /* explosion bottom center*/ {'/', "", C(CLR_ORANGE)}, /* explosion bottom right */ /* * Note: Additions to this array should be reflected in the * {ibm,dec,mac}_graphics[] arrays below. */ }; #undef C #ifdef ASCIIGRAPH #ifdef PC9800 void NDECL((*ibmgraphics_mode_callback)) = 0; /* set in tty_start_screen() */ #endif /* PC9800 */ static uchar ibm_graphics[MAXPCHARS] = { /* 0*/ g_FILLER(S_stone), 0xb3, /* S_vwall: meta-3, vertical rule */ 0xc4, /* S_hwall: meta-D, horizontal rule */ 0xda, /* S_tlcorn: meta-Z, top left corner */ 0xbf, /* S_trcorn: meta-?, top right corner */ 0xc0, /* S_blcorn: meta-@, bottom left */ 0xd9, /* S_brcorn: meta-Y, bottom right */ 0xc5, /* S_crwall: meta-E, cross */ 0xc1, /* S_tuwall: meta-A, T up */ 0xc2, /* S_tdwall: meta-B, T down */ /*10*/ 0xb4, /* S_tlwall: meta-4, T left */ 0xc3, /* S_trwall: meta-C, T right */ 0xfa, /* S_ndoor: meta-z, centered dot */ 0xfe, /* S_vodoor: meta-~, small centered square */ 0xfe, /* S_hodoor: meta-~, small centered square */ g_FILLER(S_vcdoor), g_FILLER(S_hcdoor), 240, /* S_bars: equivalency, courtesy Sascha */ 241, /* S_tree: plus or minus symbol */ 0xfa, /* S_room: meta-z, centered dot */ /*20*/ 0xb0, /* S_corr: meta-0, light shading */ 0xb1, /* S_litcorr: meta-1, medium shading */ g_FILLER(S_upstair), g_FILLER(S_dnstair), g_FILLER(S_upladder), g_FILLER(S_dnladder), g_FILLER(S_altar), g_FILLER(S_grave), g_FILLER(S_throne), g_FILLER(S_sink), /*30*/ g_FILLER(S_toilet), 0xf4, /* S_fountain: meta-t, integral top half */ 0xf7, /* S_pool: meta-w, approx. equals */ 0xfa, /* S_ice: meta-z, centered dot */ 0xf7, /* S_lava: meta-w, approx. equals */ 0xfa, /* S_vodbridge: meta-z, centered dot */ 0xfa, /* S_hodbridge: meta-z, centered dot */ g_FILLER(S_vcdbridge), g_FILLER(S_hcdbridge), g_FILLER(S_air), /*40*/ g_FILLER(S_cloud), 0xf7, /* S_water: meta-w, approx. equals */ g_FILLER(S_arrow_trap), g_FILLER(S_dart_trap), g_FILLER(S_falling_rock_trap), g_FILLER(S_squeaky_board), g_FILLER(S_bear_trap), g_FILLER(S_land_mine), g_FILLER(S_rolling_boulder_trap), g_FILLER(S_sleeping_gas_trap), /*50*/ g_FILLER(S_rust_trap), g_FILLER(S_fire_trap), g_FILLER(S_pit), g_FILLER(S_spiked_pit), g_FILLER(S_hole), g_FILLER(S_trap_door), g_FILLER(S_teleportation_trap), g_FILLER(S_level_teleporter), g_FILLER(S_magic_portal), g_FILLER(S_web), /*60*/ g_FILLER(S_statue_trap), g_FILLER(S_magic_trap), g_FILLER(S_anti_magic_trap), g_FILLER(S_polymorph_trap), 0xb3, /* S_vbeam: meta-3, vertical rule */ 0xc4, /* S_hbeam: meta-D, horizontal rule */ g_FILLER(S_lslant), g_FILLER(S_rslant), g_FILLER(S_digbeam), g_FILLER(S_flashbeam), /*70*/ g_FILLER(S_boomleft), g_FILLER(S_boomright), g_FILLER(S_ss1), g_FILLER(S_ss2), g_FILLER(S_ss3), g_FILLER(S_ss4), g_FILLER(S_sw_tl), g_FILLER(S_sw_tc), g_FILLER(S_sw_tr), 0xb3, /* S_sw_ml: meta-3, vertical rule */ /*80*/ 0xb3, /* S_sw_mr: meta-3, vertical rule */ g_FILLER(S_sw_bl), g_FILLER(S_sw_bc), g_FILLER(S_sw_br), g_FILLER(S_explode1), g_FILLER(S_explode2), g_FILLER(S_explode3), 0xb3, /* S_explode4: meta-3, vertical rule */ g_FILLER(S_explode5), 0xb3, /* S_explode6: meta-3, vertical rule */ /*90*/ g_FILLER(S_explode7), g_FILLER(S_explode8), g_FILLER(S_explode9), }; #endif /* ASCIIGRAPH */ #ifdef TERMLIB void NDECL((*decgraphics_mode_callback)) = 0; /* set in tty_start_screen() */ static uchar dec_graphics[MAXPCHARS] = { /* 0*/ g_FILLER(S_stone), 0xf8, /* S_vwall: meta-x, vertical rule */ 0xf1, /* S_hwall: meta-q, horizontal rule */ 0xec, /* S_tlcorn: meta-l, top left corner */ 0xeb, /* S_trcorn: meta-k, top right corner */ 0xed, /* S_blcorn: meta-m, bottom left */ 0xea, /* S_brcorn: meta-j, bottom right */ 0xee, /* S_crwall: meta-n, cross */ 0xf6, /* S_tuwall: meta-v, T up */ 0xf7, /* S_tdwall: meta-w, T down */ /*10*/ 0xf5, /* S_tlwall: meta-u, T left */ 0xf4, /* S_trwall: meta-t, T right */ 0xfe, /* S_ndoor: meta-~, centered dot */ 0xe1, /* S_vodoor: meta-a, solid block */ 0xe1, /* S_hodoor: meta-a, solid block */ g_FILLER(S_vcdoor), g_FILLER(S_hcdoor), 0xfb, /* S_bars: meta-{, small pi, courtesy Pat Rankin */ 0xe7, /* S_tree: meta-g, plus-or-minus, courtesy Pat Rankin */ 0xfe, /* S_room: meta-~, centered dot */ /*20*/ g_FILLER(S_corr), g_FILLER(S_litcorr), g_FILLER(S_upstair), g_FILLER(S_dnstair), 0xf9, /* S_upladder: meta-y, greater-than-or-equals */ 0xfa, /* S_dnladder: meta-z, less-than-or-equals */ g_FILLER(S_altar), /* 0xc3, \E)3: meta-C, dagger */ g_FILLER(S_grave), g_FILLER(S_throne), g_FILLER(S_sink), /*30*/ g_FILLER(S_toilet), g_FILLER(S_fountain), /* 0xdb, \E)3: meta-[, integral top half */ 0xe0, /* S_pool: meta-\, diamond */ 0xfe, /* S_ice: meta-~, centered dot */ 0xe0, /* S_lava: meta-\, diamond */ 0xfe, /* S_vodbridge: meta-~, centered dot */ 0xfe, /* S_hodbridge: meta-~, centered dot */ g_FILLER(S_vcdbridge), g_FILLER(S_hcdbridge), g_FILLER(S_air), /*40*/ g_FILLER(S_cloud), 0xe0, /* S_water: meta-\, diamond */ g_FILLER(S_arrow_trap), g_FILLER(S_dart_trap), g_FILLER(S_falling_rock_trap), g_FILLER(S_squeaky_board), g_FILLER(S_bear_trap), g_FILLER(S_land_mine), g_FILLER(S_rolling_boulder_trap), g_FILLER(S_sleeping_gas_trap), /*50*/ g_FILLER(S_rust_trap), g_FILLER(S_fire_trap), g_FILLER(S_pit), g_FILLER(S_spiked_pit), g_FILLER(S_hole), g_FILLER(S_trap_door), g_FILLER(S_teleportation_trap), g_FILLER(S_level_teleporter), g_FILLER(S_magic_portal), g_FILLER(S_web), /* 0xbd, \E)3: meta-=, int'l currency */ /*60*/ g_FILLER(S_statue_trap), g_FILLER(S_magic_trap), g_FILLER(S_anti_magic_trap), g_FILLER(S_polymorph_trap), 0xf8, /* S_vbeam: meta-x, vertical rule */ 0xf1, /* S_hbeam: meta-q, horizontal rule */ g_FILLER(S_lslant), g_FILLER(S_rslant), g_FILLER(S_digbeam), g_FILLER(S_flashbeam), /*70*/ g_FILLER(S_boomleft), g_FILLER(S_boomright), g_FILLER(S_ss1), g_FILLER(S_ss2), g_FILLER(S_ss3), g_FILLER(S_ss4), g_FILLER(S_sw_tl), 0xef, /* S_sw_tc: meta-o, high horizontal line */ g_FILLER(S_sw_tr), 0xf8, /* S_sw_ml: meta-x, vertical rule */ /*80*/ 0xf8, /* S_sw_mr: meta-x, vertical rule */ g_FILLER(S_sw_bl), 0xf3, /* S_sw_bc: meta-s, low horizontal line */ g_FILLER(S_sw_br), g_FILLER(S_explode1), 0xef, /* S_explode2: meta-o, high horizontal line */ g_FILLER(S_explode3), 0xf8, /* S_explode4: meta-x, vertical rule */ g_FILLER(S_explode5), 0xf8, /* S_explode6: meta-x, vertical rule */ /*90*/ g_FILLER(S_explode7), 0xf3, /* S_explode8: meta-s, low horizontal line */ g_FILLER(S_explode9), }; #endif /* TERMLIB */ #ifdef MAC_GRAPHICS_ENV static uchar mac_graphics[MAXPCHARS] = { /* 0*/ g_FILLER(S_stone), 0xba, /* S_vwall */ 0xcd, /* S_hwall */ 0xc9, /* S_tlcorn */ 0xbb, /* S_trcorn */ 0xc8, /* S_blcorn */ 0xbc, /* S_brcorn */ 0xce, /* S_crwall */ 0xca, /* S_tuwall */ 0xcb, /* S_tdwall */ /*10*/ 0xb9, /* S_tlwall */ 0xcc, /* S_trwall */ 0xb0, /* S_ndoor */ 0xee, /* S_vodoor */ 0xee, /* S_hodoor */ 0xef, /* S_vcdoor */ 0xef, /* S_hcdoor */ 0xf0, /* S_bars: equivalency symbol */ 0xf1, /* S_tree: plus-or-minus */ g_FILLER(S_Room), /*20*/ 0xB0, /* S_corr */ g_FILLER(S_litcorr), g_FILLER(S_upstair), g_FILLER(S_dnstair), g_FILLER(S_upladder), g_FILLER(S_dnladder), g_FILLER(S_altar), 0xef, /* S_grave: same as open door */ g_FILLER(S_throne), g_FILLER(S_sink), /*30*/ g_FILLER(S_toilet), g_FILLER(S_fountain), 0xe0, /* S_pool */ g_FILLER(S_ice), g_FILLER(S_lava), g_FILLER(S_vodbridge), g_FILLER(S_hodbridge), g_FILLER(S_vcdbridge), g_FILLER(S_hcdbridge), g_FILLER(S_air), /*40*/ g_FILLER(S_cloud), g_FILLER(S_water), g_FILLER(S_arrow_trap), g_FILLER(S_dart_trap), g_FILLER(S_falling_rock_trap), g_FILLER(S_squeaky_board), g_FILLER(S_bear_trap), g_FILLER(S_land_mine), g_FILLER(S_rolling_boulder_trap), g_FILLER(S_sleeping_gas_trap), /*50*/ g_FILLER(S_rust_trap), g_FILLER(S_fire_trap), g_FILLER(S_pit), g_FILLER(S_spiked_pit), g_FILLER(S_hole), g_FILLER(S_trap_door), g_FILLER(S_teleportation_trap), g_FILLER(S_level_teleporter), g_FILLER(S_magic_portal), g_FILLER(S_web), /*60*/ g_FILLER(S_statue_trap), g_FILLER(S_magic_trap), g_FILLER(S_anti_magic_trap), g_FILLER(S_polymorph_trap), g_FILLER(S_vbeam), g_FILLER(S_hbeam), g_FILLER(S_lslant), g_FILLER(S_rslant), g_FILLER(S_digbeam), g_FILLER(S_flashbeam), /*70*/ g_FILLER(S_boomleft), g_FILLER(S_boomright), g_FILLER(S_ss1), g_FILLER(S_ss2), g_FILLER(S_ss3), g_FILLER(S_ss4), g_FILLER(S_sw_tl), g_FILLER(S_sw_tc), g_FILLER(S_sw_tr), g_FILLER(S_sw_ml), /*80*/ g_FILLER(S_sw_mr), g_FILLER(S_sw_bl), g_FILLER(S_sw_bc), g_FILLER(S_sw_br), g_FILLER(S_explode1), g_FILLER(S_explode2), g_FILLER(S_explode3), g_FILLER(S_explode4), g_FILLER(S_explode5), g_FILLER(S_explode6), /*90*/ g_FILLER(S_explode7), g_FILLER(S_explode8), g_FILLER(S_explode9), }; #endif /* MAC_GRAPHICS_ENV */ #ifdef PC9800 void NDECL((*ascgraphics_mode_callback)) = 0; /* set in tty_start_screen() */ #endif /* * Convert the given character to an object class. If the character is not * recognized, then MAXOCLASSES is returned. Used in detect.c invent.c, * options.c, pickup.c, sp_lev.c, and lev_main.c. */ int def_char_to_objclass(ch) char ch; { int i; for (i = 1; i < MAXOCLASSES; i++) if (ch == def_oc_syms[i]) break; return i; } /* * Convert a character into a monster class. This returns the _first_ * match made. If there are are no matches, return MAXMCLASSES. */ int def_char_to_monclass(ch) char ch; { int i; for (i = 1; i < MAXMCLASSES; i++) if (def_monsyms[i] == ch) break; return i; } void assign_graphics(graph_chars, glth, maxlen, offset) register uchar *graph_chars; int glth, maxlen, offset; { register int i; for (i = 0; i < maxlen; i++) showsyms[i+offset] = (((i < glth) && graph_chars[i]) ? graph_chars[i] : defsyms[i+offset].sym); } void switch_graphics(gr_set_flag) int gr_set_flag; { switch (gr_set_flag) { default: case ASCII_GRAPHICS: assign_graphics((uchar *)0, 0, MAXPCHARS, 0); #ifdef PC9800 if (ascgraphics_mode_callback) (*ascgraphics_mode_callback)(); #endif break; #ifdef ASCIIGRAPH case IBM_GRAPHICS: /* * Use the nice IBM Extended ASCII line-drawing characters (codepage 437). * * OS/2 defaults to a multilingual character set (codepage 850, corresponding * to the ISO 8859 character set. We should probably do a VioSetCp() call to * set the codepage to 437. */ iflags.IBMgraphics = TRUE; iflags.DECgraphics = FALSE; assign_graphics(ibm_graphics, SIZE(ibm_graphics), MAXPCHARS, 0); #ifdef PC9800 if (ibmgraphics_mode_callback) (*ibmgraphics_mode_callback)(); #endif break; #endif /* ASCIIGRAPH */ #ifdef TERMLIB case DEC_GRAPHICS: /* * Use the VT100 line drawing character set. */ iflags.DECgraphics = TRUE; iflags.IBMgraphics = FALSE; assign_graphics(dec_graphics, SIZE(dec_graphics), MAXPCHARS, 0); if (decgraphics_mode_callback) (*decgraphics_mode_callback)(); break; #endif /* TERMLIB */ #ifdef MAC_GRAPHICS_ENV case MAC_GRAPHICS: assign_graphics(mac_graphics, SIZE(mac_graphics), MAXPCHARS, 0); break; #endif } return; } #ifdef REINCARNATION /* * saved display symbols for objects & features. */ static uchar save_oc_syms[MAXOCLASSES] = DUMMY; static uchar save_showsyms[MAXPCHARS] = DUMMY; static uchar save_monsyms[MAXPCHARS] = DUMMY; static const uchar r_oc_syms[MAXOCLASSES] = { /* 0*/ '\0', ILLOBJ_SYM, WEAPON_SYM, ']', /* armor */ RING_SYM, /* 5*/ ',', /* amulet */ TOOL_SYM, ':', /* food */ POTION_SYM, SCROLL_SYM, /*10*/ SPBOOK_SYM, WAND_SYM, GEM_SYM, /* gold -- yes it's the same as gems */ GEM_SYM, ROCK_SYM, /*15*/ BALL_SYM, CHAIN_SYM, VENOM_SYM }; # ifdef ASCIIGRAPH /* Rogue level graphics. Under IBM graphics mode, use the symbols that were * used for Rogue on the IBM PC. Unfortunately, this can't be completely * done because some of these are control characters--armor and rings under * DOS, and a whole bunch of them under Linux. Use the TTY Rogue characters * for those cases. */ 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 */ /* 5*/ 0x0c, /* amulet: "female" symbol */ TOOL_SYM, 0x05, /* food: club (as in cards) */ 0xad, /* potion: upside down '!' */ 0x0e, /* scroll: musical note */ /*10*/ SPBOOK_SYM, 0xe7, /* wand: greek tau */ 0x0f, /* gold: yes it's the same as gems */ 0x0f, /* gems: fancy '*' */ # else ')', /* weapon */ ARMOR_SYM, /* armor */ RING_SYM, /* ring */ /* 5*/ ',', /* amulet */ TOOL_SYM, ':', /* food */ 0xad, /* potion: upside down '!' */ SCROLL_SYM, /* scroll */ /*10*/ SPBOOK_SYM, 0xe7, /* wand: greek tau */ GEM_SYM, /* gold: yes it's the same as gems */ GEM_SYM, /* gems */ # endif ROCK_SYM, /*15*/ BALL_SYM, CHAIN_SYM, VENOM_SYM }; # endif /* ASCIIGRAPH */ void assign_rogue_graphics(is_rlevel) boolean is_rlevel; { /* Adjust graphics display characters on Rogue levels */ if (is_rlevel) { register int i; (void) memcpy((genericptr_t)save_showsyms, (genericptr_t)showsyms, sizeof showsyms); (void) memcpy((genericptr_t)save_oc_syms, (genericptr_t)oc_syms, sizeof oc_syms); (void) memcpy((genericptr_t)save_monsyms, (genericptr_t)monsyms, sizeof monsyms); /* 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++) showsyms[i] = defsyms[i].sym; /* * Some day if these rogue showsyms get much more extensive than this, * we may want to create r_showsyms, and IBM_r_showsyms arrays to hold * all of this info and to simply initialize it via a for() loop like r_oc_syms. */ # ifdef ASCIIGRAPH if (!iflags.IBMgraphics # if defined(USE_TILES) && defined(MSDOS) || iflags.grmode # endif ) { # endif showsyms[S_vodoor] = showsyms[S_hodoor] = showsyms[S_ndoor] = '+'; showsyms[S_upstair] = showsyms[S_dnstair] = '%'; # ifdef ASCIIGRAPH } else { /* a la EPYX Rogue */ showsyms[S_vwall] = 0xba; /* all walls now use */ showsyms[S_hwall] = 0xcd; /* double line graphics */ showsyms[S_tlcorn] = 0xc9; showsyms[S_trcorn] = 0xbb; showsyms[S_blcorn] = 0xc8; showsyms[S_brcorn] = 0xbc; showsyms[S_crwall] = 0xce; showsyms[S_tuwall] = 0xca; showsyms[S_tdwall] = 0xcb; showsyms[S_tlwall] = 0xb9; showsyms[S_trwall] = 0xcc; showsyms[S_ndoor] = 0xce; showsyms[S_vodoor] = 0xce; showsyms[S_hodoor] = 0xce; showsyms[S_room] = 0xfa; /* centered dot */ showsyms[S_corr] = 0xb1; 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; showsyms[S_squeaky_board] = 0x04; showsyms[S_bear_trap] = 0x04; showsyms[S_land_mine] = 0x04; showsyms[S_rolling_boulder_trap] = 0x04; showsyms[S_sleeping_gas_trap] = 0x04; showsyms[S_rust_trap] = 0x04; showsyms[S_fire_trap] = 0x04; showsyms[S_pit] = 0x04; showsyms[S_spiked_pit] = 0x04; showsyms[S_hole] = 0x04; showsyms[S_trap_door] = 0x04; showsyms[S_teleportation_trap] = 0x04; showsyms[S_level_teleporter] = 0x04; showsyms[S_magic_portal] = 0x04; showsyms[S_web] = 0x04; showsyms[S_statue_trap] = 0x04; showsyms[S_magic_trap] = 0x04; showsyms[S_anti_magic_trap] = 0x04; showsyms[S_polymorph_trap] = 0x04; #endif } #endif /* ASCIIGRAPH */ for (i = 0; i < MAXOCLASSES; i++) { #if defined(ASCIIGRAPH) && !defined(LINUX) if (iflags.IBMgraphics # if defined(USE_TILES) && defined(MSDOS) && !iflags.grmode # endif ) oc_syms[i] = IBM_r_oc_syms[i]; else #endif /* ASCIIGRAPH && !LINUX */ oc_syms[i] = r_oc_syms[i]; } #if defined(MSDOS) && defined(USE_TILES) if (iflags.grmode) tileview(TRUE); #endif } else { (void) memcpy((genericptr_t)showsyms, (genericptr_t)save_showsyms, sizeof showsyms); (void) memcpy((genericptr_t)oc_syms, (genericptr_t)save_oc_syms, sizeof oc_syms); (void) memcpy((genericptr_t)monsyms, (genericptr_t)save_monsyms, sizeof monsyms); #if defined(MSDOS) && defined(USE_TILES) if (iflags.grmode) tileview(TRUE); #endif } } #endif /* REINCARNATION */ /*drawing.c*/ slashem-0.0.7E7F3/src/hacklib.c0000664000076400007640000003432310545462317014211 0ustar aliali/* SCCS Id: @(#)hacklib.c 3.4 2002/12/13 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* Copyright (c) Robert Patrick Rankin, 1991 */ /* NetHack may be freely redistributed. See license for details. */ /* We could include only config.h, except for the overlay definitions... */ #include "hack.h" /*= Assorted 'small' utility routines. They're virtually independent of NetHack, except that rounddiv may call panic(). return type routine name argument type(s) boolean digit (char) boolean letter (char) char highc (char) char lowc (char) char * lcase (char *) char * upstart (char *) char * mungspaces (char *) char * eos (char *) char * strkitten (char *,char) char * s_suffix (const char *) char * xcrypt (const char *, char *) boolean onlyspace (const char *) char * tabexpand (char *) char * visctrl (char) const char * ordin (int) char * sitoa (int) int sgn (int) int rounddiv (long, int) int distmin (int, int, int, int) int dist2 (int, int, int, int) boolean online2 (int, int) boolean pmatch (const char *, const char *) int strncmpi (const char *, const char *, int) char * strstri (const char *, const char *) boolean fuzzymatch (const char *,const char *,const char *,boolean) void setrandom (void) int getyear (void) char * yymmdd (time_t) long yyyymmdd (time_t) int phase_of_the_moon (void) boolean friday_13th (void) int night (void) int midnight (void) =*/ #ifdef LINT # define Static /* pacify lint */ #else # define Static static #endif #ifdef OVLB boolean digit(c) /* is 'c' a digit? */ char c; { return((boolean)('0' <= c && c <= '9')); } boolean letter(c) /* is 'c' a letter? note: '@' classed as letter */ char c; { return((boolean)(('@' <= c && c <= 'Z') || ('a' <= c && c <= 'z'))); } #endif /* OVLB */ #ifdef OVL1 char highc(c) /* force 'c' into uppercase */ char c; { return((char)(('a' <= c && c <= 'z') ? (c & ~040) : c)); } char lowc(c) /* force 'c' into lowercase */ char c; { return((char)(('A' <= c && c <= 'Z') ? (c | 040) : c)); } #endif /* OVL1 */ #ifdef OVLB char * lcase(s) /* convert a string into all lowercase */ char *s; { register char *p; for (p = s; *p; p++) if ('A' <= *p && *p <= 'Z') *p |= 040; 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) char *bp; { register char c, *p, *p2; boolean was_space = TRUE; for (p = p2 = bp; (c = *p) != '\0'; p++) { if (c == '\t') c = ' '; if (c != ' ' || !was_space) *p2++ = c; was_space = (c == ' '); } if (was_space && p2 > bp) p2--; *p2 = '\0'; return bp; } #endif /* OVLB */ #ifdef OVL0 char * eos(s) /* return the end of a string (pointing at '\0') */ register char *s; { while (*s) s++; /* s += strlen(s); */ return s; } /* strcat(s, {c,'\0'}); */ char * strkitten(s, c) /* append a character to a string (in place) */ char *s; char c; { char *p = eos(s); *p++ = c; *p = '\0'; return s; } char * s_suffix(s) /* return a name converted to possessive */ const char *s; { Static char buf[BUFSZ]; Strcpy(buf, s); if(!strcmpi(buf, "it")) Strcat(buf, "s"); else if(*(eos(buf)-1) == 's') Strcat(buf, "'"); else Strcat(buf, "'s"); return buf; } char * xcrypt(str, buf) /* trivial text encryption routine (see makedefs) */ const char *str; char *buf; { register const char *p; register char *q; register int bitmask; for (bitmask = 1, p = str, q = buf; *p; q++) { *q = *p++; if (*q & (32|64)) *q ^= bitmask; if ((bitmask <<= 1) >= 32) bitmask = 1; } *q = '\0'; return buf; } #endif /* OVL0 */ #ifdef OVL2 boolean onlyspace(s) /* is a string entirely whitespace? */ const char *s; { for (; *s; s++) if (*s != ' ' && *s != '\t') return FALSE; return TRUE; } #endif /* OVL2 */ #ifdef OVLB char * tabexpand(sbuf) /* expand tabs into proper number of spaces */ char *sbuf; { char buf[BUFSZ]; register char *bp, *s = sbuf; register int idx; if (!*s) return sbuf; /* warning: no bounds checking performed */ for (bp = buf, idx = 0; *s; s++) if (*s == '\t') { do *bp++ = ' '; while (++idx % 8); } else { *bp++ = *s; idx++; } *bp = 0; return strcpy(sbuf, buf); } char * visctrl(c) /* make a displayable string from a character */ char c; { Static char ccc[3]; c &= 0177; ccc[2] = '\0'; if (c < 040) { ccc[0] = '^'; ccc[1] = c | 0100; /* letter */ } else if (c == 0177) { ccc[0] = '^'; ccc[1] = c & ~0100; /* '?' */ } else { ccc[0] = c; /* printable character */ ccc[1] = '\0'; } return ccc; } #endif /* OVLB */ #ifdef OVL2 const char * ordin(n) /* return the ordinal suffix of a number */ int n; /* note: should be non-negative */ { register int dd = n % 10; return (dd == 0 || dd > 3 || (n % 100) / 10 == 1) ? "th" : (dd == 1) ? "st" : (dd == 2) ? "nd" : "rd"; } #endif /* OVL2 */ #ifdef OVL1 char * sitoa(n) /* make a signed digit string from a number */ int n; { Static char buf[13]; Sprintf(buf, (n < 0) ? "%d" : "+%d", n); return buf; } int sgn(n) /* return the sign of a number: -1, 0, or 1 */ int n; { return (n < 0) ? -1 : (n != 0); } #endif /* OVL1 */ #ifdef OVLB int rounddiv(x, y) /* calculate x/y, rounding as appropriate */ long x; int y; { int r, m; int divsgn = 1; if (y == 0) panic("division by zero in rounddiv"); else if (y < 0) { divsgn = -divsgn; y = -y; } if (x < 0) { divsgn = -divsgn; x = -x; } r = x / y; m = x % y; if (2*m >= y) r++; return divsgn * r; } #endif /* OVLB */ #ifdef OVL0 int distmin(x0, y0, x1, y1) /* distance between two points, in moves */ int x0, y0, x1, y1; { register int dx = x0 - x1, dy = y0 - y1; if (dx < 0) dx = -dx; if (dy < 0) dy = -dy; /* The minimum number of moves to get from (x0,y0) to (x1,y1) is the : larger of the [absolute value of the] two deltas. */ return (dx < dy) ? dy : dx; } int dist2(x0, y0, x1, y1) /* square of euclidean distance between pair of pts */ int x0, y0, x1, y1; { register int dx = x0 - x1, dy = y0 - y1; return dx * dx + dy * dy; } boolean online2(x0, y0, x1, y1) /* are two points lined up (on a straight line)? */ int x0, y0, x1, y1; { int dx = x0 - x1, dy = y0 - y1; /* If either delta is zero then they're on an orthogonal line, * else if the deltas are equal (signs ignored) they're on a diagonal. */ return((boolean)(!dy || !dx || (dy == dx) || (dy + dx == 0))); /* (dy == -dx) */ } #endif /* OVL0 */ #ifdef OVLB boolean pmatch(patrn, strng) /* match a string against a pattern */ const char *patrn, *strng; { char s, p; /* : Simple pattern matcher: '*' matches 0 or more characters, '?' matches : any single character. Returns TRUE if 'strng' matches 'patrn'. */ pmatch_top: s = *strng++; p = *patrn++; /* get next chars and pre-advance */ if (!p) /* end of pattern */ return((boolean)(s == '\0')); /* matches iff end of string too */ else if (p == '*') /* wildcard reached */ return((boolean)((!*patrn || pmatch(patrn, strng-1)) ? TRUE : s ? pmatch(patrn-1, strng) : FALSE)); else if (p != s && (p != '?' || !s)) /* check single character */ return FALSE; /* doesn't match */ else /* return pmatch(patrn, strng); */ goto pmatch_top; /* optimize tail recursion */ } #endif /* OVLB */ #ifdef OVL2 #ifndef STRNCMPI int strncmpi(s1, s2, n) /* case insensitive counted string comparison */ register const char *s1, *s2; register int n; /*(should probably be size_t, which is usually unsigned)*/ { /*{ aka strncasecmp }*/ register char t1, t2; while (n--) { if (!*s2) return (*s1 != 0); /* s1 >= s2 */ else if (!*s1) return -1; /* s1 < s2 */ t1 = lowc(*s1++); t2 = lowc(*s2++); if (t1 != t2) return (t1 > t2) ? 1 : -1; } return 0; /* s1 == s2 */ } #endif /* STRNCMPI */ #endif /* OVL2 */ #ifdef OVLB #ifndef STRSTRI char * strstri(str, sub) /* case insensitive substring search */ const char *str; const char *sub; { register const char *s1, *s2; register int i, k; # define TABSIZ 0x20 /* 0x40 would be case-sensitive */ char tstr[TABSIZ], tsub[TABSIZ]; /* nibble count tables */ # if 0 assert( (TABSIZ & ~(TABSIZ-1)) == TABSIZ ); /* must be exact power of 2 */ assert( &lowc != 0 ); /* can't be unsafe macro */ # endif /* special case: empty substring */ if (!*sub) return (char *) str; /* do some useful work while determining relative lengths */ for (i = 0; i < TABSIZ; i++) tstr[i] = tsub[i] = 0; /* init */ for (k = 0, s1 = str; *s1; k++) tstr[*s1++ & (TABSIZ-1)]++; for ( s2 = sub; *s2; --k) tsub[*s2++ & (TABSIZ-1)]++; /* evaluate the info we've collected */ if (k < 0) return (char *) 0; /* sub longer than str, so can't match */ for (i = 0; i < TABSIZ; i++) /* does sub have more 'x's than str? */ if (tsub[i] > tstr[i]) return (char *) 0; /* match not possible */ /* now actually compare the substring repeatedly to parts of the string */ for (i = 0; i <= k; i++) { s1 = &str[i]; s2 = sub; while (lowc(*s1++) == lowc(*s2++)) if (!*s2) return (char *) &str[i]; /* full match */ } return (char *) 0; /* not found */ } #endif /* STRSTRI */ /* compare two strings for equality, ignoring the presence of specified characters (typically whitespace) and possibly ignoring case */ boolean fuzzymatch(s1, s2, ignore_chars, caseblind) const char *s1, *s2; const char *ignore_chars; boolean caseblind; { register char c1, c2; do { while ((c1 = *s1++) != '\0' && index(ignore_chars, c1) != 0) continue; while ((c2 = *s2++) != '\0' && index(ignore_chars, c2) != 0) continue; if (!c1 || !c2) break; /* stop when end of either string is reached */ if (caseblind) { c1 = lowc(c1); c2 = lowc(c2); } } while (c1 == c2); /* match occurs only when the end of both strings has been reached */ return (boolean)(!c1 && !c2); } #endif /* OVLB */ #ifdef OVL2 /* * Time routines * * The time is used for: * - seed for rand() * - year on tombstone and yyyymmdd in record file * - phase of the moon (various monsters react to NEW_MOON or FULL_MOON) * - night and midnight (the undead are dangerous at midnight) * - 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); void setrandom() { /* the types are different enough here that sweeping the different * routine names into one via #defines is even more confusing */ #ifdef RANDOM /* srandom() from sys/share/random.c */ srandom((unsigned int) time((time_t *)0)); #else # if defined(BSD) || defined(LINUX) || defined(ULTRIX) || defined(CYGWIN32) /* system srandom() */ # if defined(BSD) && !defined(POSIX_TYPES) # if defined(SUNOS4) (void) # endif srandom((int) time((long *)0)); # else srandom((int) time((time_t *)0)); # endif # else # ifdef UNIX /* system srand48() */ srand48((long) time((time_t *)0)); # else /* poor quality system routine */ srand((int) time((time_t *)0)); # endif # endif #endif } static struct tm * getlt() { time_t date; #if defined(BSD) && !defined(POSIX_TYPES) (void) time((long *)(&date)); #else (void) time(&date); #endif #if (defined(ULTRIX) && !(defined(ULTRIX_PROTO) || defined(NHSTDC))) || (defined(BSD) && !defined(POSIX_TYPES)) return(localtime((long *)(&date))); #else return(localtime(&date)); #endif } int getyear() { return(1900 + getlt()->tm_year); } /* KMH -- Used by gypsies */ int getmonth() { return (getlt()->tm_mon); } #if 0 /* This routine is no longer used since in 2000 it will yield "100mmdd". */ char * yymmdd(date) time_t date; { Static char datestr[10]; struct tm *lt; if (date == 0) lt = getlt(); else #if (defined(ULTRIX) && !(defined(ULTRIX_PROTO) || defined(NHSTDC))) || defined(BSD) lt = localtime((long *)(&date)); #else lt = localtime(&date); #endif Sprintf(datestr, "%02d%02d%02d", lt->tm_year, lt->tm_mon + 1, lt->tm_mday); return(datestr); } #endif long yyyymmdd(date) time_t date; { long datenum; struct tm *lt; if (date == 0) lt = getlt(); else #if (defined(ULTRIX) && !(defined(ULTRIX_PROTO) || defined(NHSTDC))) || (defined(BSD) && !defined(POSIX_TYPES)) lt = localtime((long *)(&date)); #else lt = localtime(&date); #endif /* just in case somebody's localtime supplies (year % 100) rather than the expected (year - 1900) */ if (lt->tm_year < 70) datenum = (long)lt->tm_year + 2000L; else datenum = (long)lt->tm_year + 1900L; /* yyyy --> yyyymm */ datenum = datenum * 100L + (long)(lt->tm_mon + 1); /* yyyymm --> yyyymmdd */ datenum = datenum * 100L + (long)lt->tm_mday; return datenum; } /* * moon period = 29.53058 days ~= 30, year = 365.2422 days * days moon phase advances on first day of year compared to preceding year * = 365.2422 - 12*29.53058 ~= 11 * years in Metonic cycle (time until same phases fall on the same days of * the month) = 18.6 ~= 19 * moon phase on first day of year (epact) ~= (11*(year%19) + 29) % 30 * (29 as initial condition) * current phase in days = first day phase + days elapsed in year * 6 moons ~= 177 days * 177 ~= 8 reported phases * 22 * + 11/22 for rounding */ int phase_of_the_moon() /* 0-7, with 0: new, 4: full */ { register struct tm *lt = getlt(); register int epact, diy, goldn; diy = lt->tm_yday; goldn = (lt->tm_year % 19) + 1; epact = (11 * goldn + 18) % 30; if ((epact == 25 && goldn > 11) || epact == 24) epact++; return( (((((diy + epact) * 6) + 11) % 177) / 22) & 7 ); } boolean friday_13th() { register struct tm *lt = getlt(); return((boolean)(lt->tm_wday == 5 /* friday */ && lt->tm_mday == 13)); } boolean groundhog_day() { register struct tm *lt = getlt(); /* KMH -- Groundhog Day is February 2 */ return((boolean)(lt->tm_mon == 1 && lt->tm_mday == 2)); } int night() { register int hour = getlt()->tm_hour; return(hour < 6 || hour > 21); } int midnight() { return(getlt()->tm_hour == 0); } #endif /* OVL2 */ /*hacklib.c*/ slashem-0.0.7E7F3/src/polyself.c0000664000076400007640000015107110545462317014451 0ustar aliali/* SCCS Id: @(#)polyself.c 3.4 2003/01/08 */ /* Copyright (C) 1987, 1988, 1989 by Ken Arromdee */ /* NetHack may be freely redistributed. See license for details. */ /* * Polymorph self routine. * * Note: the light source handling code assumes that both youmonst.m_id * and youmonst.mx will always remain 0 when it handles the case of the * player polymorphed into a light-emitting monster. */ #include "hack.h" #ifdef OVLB 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(uunstick); STATIC_DCL int FDECL(armor_to_dragon,(int)); STATIC_DCL void NDECL(newman); STATIC_DCL void NDECL(merge_with_armor); /* Not Used static void NDECL(special_poly); */ /* Assumes u.umonster is set up already */ /* Use u.umonster since we might be restoring and you may be polymorphed */ void init_uasmon() { int i; upermonst = mons[u.umonster]; /* Fix up the flags */ /* Default flags assume human, so replace with your race's flags */ upermonst.mflags1 &= ~(mons[PM_HUMAN].mflags1); upermonst.mflags1 |= (mons[urace.malenum].mflags1); upermonst.mflags2 &= ~(mons[PM_HUMAN].mflags2); upermonst.mflags2 |= (mons[urace.malenum].mflags2); upermonst.mflags3 &= ~(mons[PM_HUMAN].mflags3); upermonst.mflags3 |= (mons[urace.malenum].mflags3); /* Fix up the attacks */ for(i = 0; i < NATTK; i++) { upermonst.mattk[i] = mons[urace.malenum].mattk[i]; } set_uasmon(); } /* update the youmonst.data structure pointer */ void set_uasmon() { set_mon_data(&youmonst, ((u.umonnum == u.umonster) ? &upermonst : &mons[u.umonnum]), 0); bot_reconfig(); } /* make a (new) human out of the player */ STATIC_OVL void polyman(fmt, arg) const char *fmt, *arg; { boolean sticky = sticks(youmonst.data) && u.ustuck && !u.uswallow, was_mimicking = (youmonst.m_ap_type == M_AP_OBJECT); boolean could_pass_walls = Passes_walls; boolean was_blind = !!Blind; if (Upolyd) { u.acurr = u.macurr; /* restore old attribs */ u.amax = u.mamax; u.umonnum = u.umonster; flags.female = u.mfemale; } set_uasmon(); u.mh = u.mhmax = 0; u.mtimedone = 0; skinback(FALSE); u.uundetected = 0; newsym(u.ux,u.uy); if (sticky) uunstick(); find_ac(); if (was_mimicking) { if (multi < 0) unmul(""); youmonst.m_ap_type = M_AP_NOTHING; } newsym(u.ux,u.uy); You(fmt, arg); /* check whether player foolishly genocided self while poly'd */ if ((mvitals[urole.malenum].mvflags & G_GENOD) || (urole.femalenum != NON_PM && (mvitals[urole.femalenum].mvflags & G_GENOD)) || (mvitals[urace.malenum].mvflags & G_GENOD) || (urace.femalenum != NON_PM && (mvitals[urace.femalenum].mvflags & G_GENOD))) { /* intervening activity might have clobbered genocide info */ killer = delayed_killer; if (!killer || !strstri(killer, "genocid")) { killer_format = KILLED_BY; killer = "self-genocide"; } done(GENOCIDED); } if (u.twoweap && !could_twoweap(youmonst.data)) untwoweapon(); if (u.utraptype == TT_PIT) { if (could_pass_walls) { /* player forms cannot pass walls */ u.utrap = rn1(6,2); } } if (was_blind && !Blind) { /* reverting from eyeless */ Blinded = 1L; make_blinded(0L, TRUE); /* remove blindness */ } if(!Levitation && !u.ustuck && (is_pool(u.ux,u.uy) || is_lava(u.ux,u.uy))) spoteffects(TRUE); see_monsters(); } void change_sex() { /* setting u.umonster for caveman/cavewoman or priest/priestess swap unintentionally makes `Upolyd' appear to be true */ 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); u.umonster = ((already_polyd ? u.mfemale : flags.female) && urole.femalenum != NON_PM) ? urole.femalenum : urole.malenum; 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(); } STATIC_OVL void newman() { int tmp, oldlvl; if (Race_if(PM_DOPPELGANGER)) { if (!rn2(10)) change_sex(); } else { 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(FALSE); /* 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 * gain) * 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 #ifdef LINT u.uhp = u.uhp + tmp; #else u.uhp = u.uhp * (long)u.uhpmax/tmp; #endif 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 u.uen = (tmp ? u.uen * (long)u.uenmax / tmp : u.uenmax); #endif } redist_attr(); u.uhunger = rn1(500,500); if (Sick) make_sick(0L, (char *) 0, FALSE, SICK_ALL); Sick = 0; Stoned = 0; delayed_killer = 0; if (Race_if(PM_DOPPELGANGER)) { if (u.uhp <= 10) u.uhp = 10; if (u.uhpmax <= 10) u.uhpmax = 10; if (u.uen <= u.ulevel) u.uen = u.ulevel; if (u.uenmax <= u.ulevel) u.uenmax = u.ulevel; } if (u.uhp <= 0 || u.uhpmax <= 0) { if (Polymorph_control) { 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); if (Slimed) { Your("body transforms, but there is still slime on you."); Slimed = 10L; } flags.botl = 1; vision_full_recalc = 1; (void) encumber_msg(); see_monsters(); } void polyself(forcecontrol) boolean forcecontrol; { char buf[BUFSZ]; int old_light, new_light; int mntmp = NON_PM; int tries=0; boolean draconian = (uarm && uarm->otyp >= GRAY_DRAGON_SCALE_MAIL && uarm->otyp <= YELLOW_DRAGON_SCALES); boolean iswere = (u.ulycn >= LOW_PM || is_were(youmonst.data)); boolean isvamp = (is_vampire(youmonst.data)); boolean was_floating = (Levitation || Flying); /* [Tom] I made the chance of dying from Con check only possible for really weak people (it was out of 20) */ if(!Polymorph_control && !forcecontrol && !draconian && !iswere && !isvamp && !Race_if(PM_DOPPELGANGER)) { if (rn2(12) > ACURR(A_CON)) { You(shudder_for_moment); losehp(rnd(30), "system shock", KILLED_BY_AN); exercise(A_CON, FALSE); return; } } old_light = Upolyd ? emits_light(youmonst.data) : 0; if (Polymorph_control || forcecontrol) { do { getlin("Become what kind of monster? [type the name]", buf); mntmp = name_to_mon(buf); if (mntmp < LOW_PM) pline("I've never heard of such monsters."); /* Note: humans are illegal as monsters, but an * illegal monster forces newman(), which is what we * want if they specified a human.... */ else if (!polyok(&mons[mntmp]) && !your_race(&mons[mntmp])) You("cannot polymorph into that."); else break; } while(++tries < 5); if (tries==5) pline(thats_enough_tries); /* allow skin merging, even when polymorph is controlled */ if (draconian && (mntmp == armor_to_dragon(uarm->otyp) || tries == 5)) goto do_merge; } else if (Race_if(PM_DOPPELGANGER)) { /* Not an experienced Doppelganger yet */ do { /* Slightly different wording */ getlin("Attempt to become what kind of monster? [type the name]", buf); mntmp = name_to_mon(buf); if (mntmp < LOW_PM) pline("I've never heard of such monsters."); /* Note: humans are illegal as monsters, but an * illegal monster forces newman(), which is what we * want if they specified a human.... */ else if (!polyok(&mons[mntmp]) && !your_race(&mons[mntmp])) You("cannot polymorph into that."); #ifdef EATEN_MEMORY else if (!mvitals[mntmp].eaten) { You("attempt an unfamiliar polymorph."); if ((rn2(5) + u.ulevel) < mons[mntmp].mlevel) mntmp = LOW_PM - 1; /* Didn't work for sure */ /* Either way, give it a shot */ break; } #else else if (rn2((u.ulevel + 25)) < 20) { mntmp = LOW_PM - 1; break; } #endif else break; } while(++tries < 5); if (tries==5) pline(thats_enough_tries); /* allow skin merging, even when polymorph is controlled */ if (draconian && (mntmp == armor_to_dragon(uarm->otyp) || tries == 5)) goto do_merge; } else if (draconian || iswere || isvamp) { /* special changes that don't require polyok() */ if (draconian) { do_merge: mntmp = armor_to_dragon(uarm->otyp); if (!(mvitals[mntmp].mvflags & G_GENOD)) { /* Code that was here is now in merge_with_armor */ merge_with_armor(); } } else if (iswere) { if (is_were(youmonst.data)) mntmp = PM_HUMAN; /* Illegal; force newman() */ else mntmp = u.ulycn; } else if (isvamp) { if (u.umonnum != PM_VAMPIRE_BAT) mntmp = PM_VAMPIRE_BAT; else mntmp = PM_HUMAN; /* newman() */ } /* if polymon fails, "you feel" message has been given so don't follow up with another polymon or newman */ if (mntmp == PM_HUMAN) newman(); /* werecritter */ else (void) polymon(mntmp); goto made_change; /* maybe not, but this is right anyway */ } if (mntmp < LOW_PM) { tries = 0; do { /* randomly pick an "ordinary" monster */ mntmp = rn1(SPECIAL_PM - LOW_PM, LOW_PM); } while((!polyok(&mons[mntmp]) || is_placeholder(&mons[mntmp])) && tries++ < 200); } /* The below polyok() fails either if everything is genocided, or if * we deliberately chose something illegal to force newman(). */ /* WAC Doppelgangers go through a 1/20 check rather than 1/5 */ if (!polyok(&mons[mntmp]) || (Race_if(PM_DOPPELGANGER) ? ( ((u.ulevel < mons[mntmp].mlevel) #ifdef EATEN_MEMORY || !mvitals[mntmp].eaten #endif ) && !rn2(20)) : !rn2(5)) || your_race(&mons[mntmp])) newman(); else if(!polymon(mntmp)) return; if (!uarmg) selftouch("No longer petrify-resistant, you"); made_change: new_light = Upolyd ? emits_light(youmonst.data) : 0; if (old_light != new_light) { if (old_light) del_light_source(LS_MONSTER, (genericptr_t)&youmonst); if (new_light == 1) ++new_light; /* otherwise it's undetectable */ if (new_light) new_light_source(u.ux, u.uy, new_light, LS_MONSTER, (genericptr_t)&youmonst); } if (is_pool(u.ux,u.uy) && was_floating && !(Levitation || Flying) && !breathless(youmonst.data) && !amphibious(youmonst.data) && !Swimming) drown(); } /* (try to) make a mntmp monster out of the player */ int polymon(mntmp) /* returns 1 if polymorph successful */ int mntmp; { boolean sticky = sticks(youmonst.data) && u.ustuck && !u.uswallow, was_blind = !!Blind, dochange = FALSE; boolean could_pass_walls = Passes_walls; int mlvl; if (mvitals[mntmp].mvflags & G_GENOD) { /* allow G_EXTINCT */ You_feel("rather %s-ish.",mons[mntmp].mname); exercise(A_WIS, TRUE); return(0); } /* STEPHEN WHITE'S NEW CODE */ /* If your an Undead Slayer, you can't become undead! */ if (is_undead(&mons[mntmp]) && Role_if(PM_UNDEAD_SLAYER)) { if (Polymorph_control) { You("hear a voice boom out: \"How dare you take such a form!\""); u.ualign.record -= 5; #ifdef NOARTIFACTWISH u.usacrifice = 0; #endif exercise(A_WIS, FALSE); } else { You("start to change into %s, but a voice booms out:", an(mons[mntmp].mname)); pline("\"No, I will not allow such a change!\""); } return(0); } /* KMH, conduct */ u.uconduct.polyselfs++; if (!Upolyd) { /* Human to monster; save human stats */ u.macurr = u.acurr; u.mamax = u.amax; u.mfemale = flags.female; } else { /* Monster to monster; restore human stats, to be * immediately changed to provide stats for the new monster */ u.acurr = u.macurr; u.amax = u.mamax; flags.female = u.mfemale; } if (youmonst.m_ap_type) { /* stop mimicking immediately */ if (multi < 0) unmul(""); } else if (mons[mntmp].mlet != S_MIMIC) { /* as in polyman() */ youmonst.m_ap_type = M_AP_NOTHING; } if (is_male(&mons[mntmp])) { if(flags.female) dochange = TRUE; } else if (is_female(&mons[mntmp])) { if(!flags.female) dochange = TRUE; } else if (!is_neuter(&mons[mntmp]) && mntmp != u.ulycn) { if(!rn2(10)) dochange = TRUE; } if (dochange) { flags.female = !flags.female; You("%s %s%s!", (u.umonnum != mntmp) ? "turn into a" : "feel like a new", (is_male(&mons[mntmp]) || is_female(&mons[mntmp])) ? "" : flags.female ? "female " : "male ", mons[mntmp].mname); } else { if (u.umonnum != mntmp) You("turn into %s!", an(mons[mntmp].mname)); else You_feel("like a new %s!", mons[mntmp].mname); } if (Stoned && poly_when_stoned(&mons[mntmp])) { /* poly_when_stoned already checked stone golem genocide */ You("turn to stone!"); mntmp = PM_STONE_GOLEM; Stoned = 0; delayed_killer = 0; } u.mtimedone = rn1(500, 500); u.umonnum = mntmp; set_uasmon(); /* New stats for monster, to last only as long as polymorphed. * Currently only strength gets changed. */ if(strongmonst(&mons[mntmp])) ABASE(A_STR) = AMAX(A_STR) = STR18(100); if (Stone_resistance && Stoned) { /* parnes@eniac.seas.upenn.edu */ Stoned = 0; delayed_killer = 0; You("no longer seem to be petrifying."); } if (Sick_resistance && Sick) { make_sick(0L, (char *) 0, FALSE, SICK_ALL); You("no longer feel sick."); } if (Slimed) { if (flaming(youmonst.data)) { 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; /* mlvl = adj_lev(&mons[mntmp]); * We can't do the above, since there's no such thing as an * "experience level of you as a monster" for a polymorphed character. */ mlvl = ((mntmp == u.ulycn) ? u.ulevel : (int)mons[mntmp].mlevel); if (youmonst.data->mlet == S_DRAGON && mntmp >= PM_GRAY_DRAGON) { u.mhmax = In_endgame(&u.uz) ? (8*mlvl) : (4*mlvl + d(mlvl,4)); } else if (is_golem(youmonst.data)) { u.mhmax = golemhp(mntmp); } else { if (!mlvl) u.mhmax = rnd(4); else u.mhmax = d(mlvl, 8); if (is_home_elemental(&mons[mntmp])) u.mhmax *= 3; } u.mh = u.mhmax; if (u.ulevel < mlvl) { /* Low level characters can't become high level monsters for long */ #ifdef DUMB /* DRS/NS 2.2.6 messes up -- Peter Kendell */ int mtd = u.mtimedone, ulv = u.ulevel; u.mtimedone = mtd * ulv / mlvl; #else u.mtimedone = u.mtimedone * u.ulevel / mlvl; #endif } #ifdef EATEN_MEMORY /* WAC Doppelgangers can stay much longer in a form they know well */ if (Race_if(PM_DOPPELGANGER) && mvitals[mntmp].eaten) { u.mtimedone *= 2; u.mtimedone += mvitals[mntmp].eaten; } #endif if (uskin && mntmp != armor_to_dragon(uskin->otyp)) skinback(FALSE); break_armor(); drop_weapon(1); if (hides_under(youmonst.data)) u.uundetected = OBJ_AT(u.ux, u.uy); else if (youmonst.data->mlet == S_EEL) u.uundetected = is_pool(u.ux, u.uy); else u.uundetected = 0; if (u.utraptype == TT_PIT) { if (could_pass_walls && !Passes_walls) { u.utrap = rn1(6,2); } else if (!could_pass_walls && Passes_walls) { u.utrap = 0; } } if (was_blind && !Blind) { /* previous form was eyeless */ Blinded = 1L; make_blinded(0L, TRUE); /* remove blindness */ } newsym(u.ux,u.uy); /* Change symbol */ if (!sticky && !u.uswallow && u.ustuck && sticks(youmonst.data)) setustuck(0); else if (sticky && !sticks(youmonst.data)) uunstick(); #ifdef STEED if (u.usteed) { if (touch_petrifies(u.usteed->data) && !Stone_resistance && rnl(3)) { char buf[BUFSZ]; pline("No longer petrifying-resistant, you touch %s.", mon_nam(u.usteed)); Sprintf(buf, "riding %s", an(u.usteed->data->mname)); instapetrify(buf); } if (!can_ride(u.usteed)) dismount_steed(DISMOUNT_POLY); } #endif if (flags.verbose) { static const char use_thec[] = "Use the command #%s to %s."; static const char monsterc[] = "monster"; if (can_breathe(youmonst.data)) pline(use_thec,monsterc,"use your breath weapon"); if (attacktype(youmonst.data, AT_SPIT)) 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)) pline(use_thec,monsterc,"summon help"); if (webmaker(youmonst.data)) pline(use_thec,monsterc,"spin a web"); if (u.umonnum == PM_GREMLIN) pline(use_thec,monsterc,"multiply in a fountain"); if (is_unicorn(youmonst.data)) pline(use_thec,monsterc,"use your horn"); if (is_mind_flayer(youmonst.data)) pline(use_thec,monsterc,"emit a mental blast"); if (youmonst.data->msound == MS_SHRIEK) /* worthless, actually */ pline(use_thec,monsterc,"shriek"); if (lays_eggs(youmonst.data) && flags.female) pline(use_thec,"sit","lay an egg"); } /* you now know what an egg of your type looks like */ if (lays_eggs(youmonst.data)) { /* make queen bees recognize killer bee eggs */ learn_egg_type(egg_type_from_parent(u.umonnum, TRUE)); } find_ac(); if((!Levitation && !u.ustuck && !Flying && (is_pool(u.ux,u.uy) || is_lava(u.ux,u.uy))) || (Underwater && !Swimming)) spoteffects(TRUE); if (Passes_walls && u.utrap && u.utraptype == TT_INFLOOR) { u.utrap = 0; pline_The("rock seems to no longer trap you."); } else if (likes_lava(youmonst.data) && u.utrap && u.utraptype == TT_LAVA) { u.utrap = 0; pline_The("lava now feels soothing."); } if (amorphous(youmonst.data) || is_whirly(youmonst.data) || unsolid(youmonst.data)) { if (Punished) { You("slip out of the iron chain."); unpunish(); } } if (u.utrap && (u.utraptype == TT_WEB || u.utraptype == TT_BEARTRAP) && (amorphous(youmonst.data) || is_whirly(youmonst.data) || unsolid(youmonst.data) || (youmonst.data->msize <= MZ_SMALL && u.utraptype == TT_BEARTRAP))) { You("are no longer stuck in the %s.", u.utraptype == TT_WEB ? "web" : "bear trap"); /* probably should burn webs too if PM_FIRE_ELEMENTAL */ u.utrap = 0; } if (webmaker(youmonst.data) && u.utrap && u.utraptype == TT_WEB) { You("orient yourself on the web."); u.utrap = 0; } flags.botl = 1; vision_full_recalc = 1; see_monsters(); exercise(A_CON, FALSE); exercise(A_WIS, TRUE); (void) encumber_msg(); return(1); } STATIC_OVL void break_armor() { register struct obj *otmp; boolean controlled_change = (Race_if(PM_DOPPELGANGER) || (Race_if(PM_HUMAN_WEREWOLF) && u.umonnum == PM_WEREWOLF)); if (breakarm(youmonst.data)) { if ((otmp = uarm) != 0) { if(otmp->oartifact) { if (donning(otmp)) cancel_don(); Your("armor falls off!"); (void) Armor_gone(); dropx(otmp); /*WAC Drop instead of destroy*/ } else if (controlled_change && !otmp->cursed) { if (donning(otmp)) cancel_don(); You("quickly remove your armor as you start to change."); (void) Armor_gone(); dropx(otmp); /*WAC Drop instead of destroy*/ } else { if (donning(otmp)) cancel_don(); You("break out of your armor!"); exercise(A_STR, FALSE); (void) Armor_gone(); useup(otmp); } } if ((otmp = uarmc) != 0) { if(otmp->oartifact) { Your("%s falls off!", cloak_simple_name(otmp)); (void) Cloak_off(); dropx(otmp); } else if (controlled_change && !otmp->cursed) { You("remove your %s before you transform.", cloak_simple_name(otmp)); (void) Cloak_off(); dropx(otmp); } else { Your("%s tears apart!", cloak_simple_name(otmp)); (void) Cloak_off(); useup(otmp); } } #ifdef TOURIST if ((otmp = uarmu) != 0) { if (controlled_change && !otmp->cursed && !uskin) { You("take off your shirt just before it starts to rip."); setworn((struct obj *)0, otmp->owornmask & W_ARMU); dropx(otmp); } else { Your("shirt rips to shreds!"); useup(uarmu); } } #endif } else if (sliparm(youmonst.data)) { if (((otmp = uarm) != 0) && (racial_exception(&youmonst, otmp) < 1)) { if (donning(otmp)) cancel_don(); Your("armor falls around you!"); (void) Armor_gone(); dropx(otmp); } 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); } #ifdef TOURIST if ((otmp = uarmu) != 0) { if (is_whirly(youmonst.data)) You("seep right through your shirt!"); else You("become much too small for your shirt!"); setworn((struct obj *)0, otmp->owornmask & W_ARMU); dropx(otmp); } #endif } if (has_horns(youmonst.data)) { if ((otmp = uarmh) != 0) { if (is_flimsy(otmp) && !donning(otmp)) { char hornbuf[BUFSZ], yourbuf[BUFSZ]; /* Future possiblities: This could damage/destroy helmet */ Sprintf(hornbuf, "horn%s", plur(num_horns(youmonst.data))); Your("%s %s through %s %s.", hornbuf, vtense(hornbuf, "pierce"), shk_your(yourbuf, otmp), xname(otmp)); } else { if (donning(otmp)) cancel_don(); Your("helmet falls to the %s!", surface(u.ux, u.uy)); (void) Helmet_off(); dropx(otmp); } } } if (nohands(youmonst.data) || verysmall(youmonst.data)) { if ((otmp = uarmg) != 0) { if (donning(otmp)) cancel_don(); /* Drop weapon along with gloves */ You("drop your gloves%s!", uwep ? " and weapon" : ""); drop_weapon(0); (void) Gloves_off(); dropx(otmp); } if ((otmp = uarms) != 0) { You("can no longer hold your shield!"); (void) Shield_off(); dropx(otmp); } if ((otmp = uarmh) != 0) { if (donning(otmp)) cancel_don(); Your("helmet falls to the %s!", surface(u.ux, u.uy)); (void) Helmet_off(); dropx(otmp); } } if (nohands(youmonst.data) || verysmall(youmonst.data) || slithy(youmonst.data) || youmonst.data->mlet == S_CENTAUR) { if ((otmp = uarmf) != 0) { if (donning(otmp)) cancel_don(); if (is_whirly(youmonst.data)) Your("boots fall away!"); else Your("boots %s off your feet!", verysmall(youmonst.data) ? "slide" : "are pushed"); (void) Boots_off(); dropx(otmp); } } } STATIC_OVL void drop_weapon(alone) 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 * wear gloves but can wield weapons */ if (!alone || cantwield(youmonst.data)) { struct obj *wep = uwep; 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(); } else if (!could_twoweap(youmonst.data)) { untwoweapon(); } } else if (cantwield(youmonst.data)) untwoweapon(); } void rehumanize() { boolean forced = (u.mh < 1); /* KMH, balance patch -- you can't revert back while unchanging */ if (Unchanging && forced) { killer_format = NO_KILLER_PREFIX; killer = "killed while stuck in creature form"; done(DIED); } if (emits_light(youmonst.data)) del_light_source(LS_MONSTER, (genericptr_t)&youmonst); polyman("return to %s form!", urace.adj); if (u.uhp < 1) { char kbuf[256]; Sprintf(kbuf, "reverting to unhealthy %s form", urace.adj); killer_format = KILLED_BY; killer = kbuf; done(DIED); } if (forced || (!Race_if(PM_DOPPELGANGER) && (rn2(20) > ACURR(A_CON)))) { /* Exhaustion for "forced" rehumaization & must pass con chack for * non-doppelgangers * Don't penalize doppelgangers/polymorph running out */ /* WAC Polymorph Exhaustion 1/2 HP to prevent abuse */ u.uhp = (u.uhp/2) + 1; } if (!uarmg) selftouch("No longer petrify-resistant, you"); nomul(0); flags.botl = 1; vision_full_recalc = 1; (void) encumber_msg(); } /* WAC -- MUHAHAHAAHA - Gaze attacks! * Note - you can only gaze at one monster at a time, to keep this * from getting out of hand ;B Also costs 20 energy. */ int dogaze() { coord cc; struct monst *mtmp; if (Blind) { You("can't see a thing!"); return(0); } if (u.uen < 20) { You("lack the energy to use your special gaze!"); return(0); } pline("Where do you wish to look?"); cc.x = u.ux; cc.y = u.uy; getpos(&cc, TRUE, "the spot to look"); if (cc.x == -10) return (0); /* user pressed esc */ mtmp = m_at(cc.x, cc.y); if (!mtmp || !canseemon(mtmp)) { You("don't see a monster there!"); return (0); } if ((flags.safe_dog && !Confusion && !Hallucination && mtmp->mtame) || (flags.confirm && mtmp->mpeaceful && !Confusion && !Hallucination)) { char qbuf[QBUFSZ]; Sprintf(qbuf, "Really gaze at %s?", mon_nam(mtmp)); if (yn(qbuf) != 'y') return (0); if (mtmp->mpeaceful) setmangry(mtmp); } u.uen -= 20; You("gaze at %s...", mon_nam(mtmp)); if ((mtmp->data==&mons[PM_MEDUSA]) && !mtmp->mcan) { pline("Gazing at the awake Medusa is not a very good idea."); /* as if gazing at a sleeping anything is fruitful... */ You("turn to stone..."); killer_format = KILLED_BY; killer = "deliberately gazing at Medusa's hideous countenance"; done(STONING); } else if (!mtmp->mcansee || mtmp->msleeping) { pline("But nothing happens."); return (1); } else if (Invis && !perceives(mtmp->data)) { pline("%s seems not to notice your gaze.", Monnam(mtmp)); return (1); } else { register struct attack *mattk; register int i; for(i = 0; i < NATTK; i++) { mattk = &(youmonst.data->mattk[i]); if (mattk->aatyp == AT_GAZE) { damageum(mtmp, mattk); break; } } } return(1); } int dobreathe() { struct attack *mattk; int energy = 0; if (Strangled) { You_cant("breathe. Sorry."); return(0); } /* WAC -- no more belching. Use up energy instead */ if (Race_if(PM_DOPPELGANGER) || (Role_if(PM_FLAME_MAGE) && u.umonnum == PM_RED_DRAGON) || (Role_if(PM_ICE_MAGE) && u.umonnum == PM_WHITE_DRAGON)) energy = 10; else energy = 15; if (u.uen < energy) { You("don't have enough energy to breathe!"); return(0); } if (!getdir((char *)0)) return(0); u.uen -= energy; flags.botl = 1; mattk = attacktype_fordmg(youmonst.data, AT_BREA, AD_ANY); if (!mattk) impossible("bad breath attack?"); /* mouthwash needed... */ else { /* Extra handling for AD_RBRE - player might poly into a crystal * golem. */ uchar adtyp; adtyp = mattk->adtyp == AD_RBRE ? rnd(AD_ACID) : mattk->adtyp; buzz((int) (20 + adtyp - 1), (int)mattk->damn, u.ux, u.uy, u.dx, u.dy); } return(1); } int dospit() { struct obj *otmp; struct attack *mattk; if (!getdir((char *)0)) return(0); mattk = attacktype_fordmg(youmonst.data, AT_SPIT, AD_ANY); if (!mattk) impossible("bad spit attack?"); else { switch (mattk->adtyp) { case AD_BLND: case AD_DRST: otmp = mksobj(BLINDING_VENOM, TRUE, FALSE); break; default: impossible("bad attack type in do_spit"); /* fall through */ case AD_ACID: otmp = mksobj(ACID_VENOM, TRUE, FALSE); break; } otmp->spe = 1; /* to indicate it's yours */ throwit(otmp, 0L, FALSE, 0); } return(1); } int doremove() { if (!Punished) { You("are not chained to anything!"); return(0); } unpunish(); return(1); } int dospinweb() { register struct trap *ttmp = t_at(u.ux,u.uy); if (Levitation || Is_airlevel(&u.uz) || Underwater || Is_waterlevel(&u.uz)) { You("must be on the ground to spin a web."); return(0); } if (u.uswallow) { You("release web fluid inside %s.", mon_nam(u.ustuck)); if (is_animal(u.ustuck->data)) { expels(u.ustuck, u.ustuck->data, TRUE); return(0); } if (is_whirly(u.ustuck->data)) { int i; for (i = 0; i < NATTK; i++) if (u.ustuck->data->mattk[i].aatyp == AT_ENGL) break; if (i == NATTK) impossible("Swallower has no engulfing attack?"); else { char sweep[30]; sweep[0] = '\0'; switch(u.ustuck->data->mattk[i].adtyp) { case AD_FIRE: Strcpy(sweep, "ignites and "); break; case AD_ELEC: Strcpy(sweep, "fries and "); break; case AD_COLD: Strcpy(sweep, "freezes, shatters and "); break; } pline_The("web %sis swept away!", sweep); } return(0); } /* default: a nasty jelly-like creature */ pline_The("web dissolves into %s.", mon_nam(u.ustuck)); return(0); } if (u.utrap) { You("cannot spin webs while stuck in a trap."); return(0); } exercise(A_DEX, TRUE); if (ttmp) switch (ttmp->ttyp) { case PIT: case SPIKED_PIT: You("spin a web, covering up the pit."); deltrap(ttmp); bury_objs(u.ux, u.uy); newsym(u.ux, u.uy); return(1); case SQKY_BOARD: pline_The("squeaky board is muffled."); deltrap(ttmp); newsym(u.ux, u.uy); return(1); case TELEP_TRAP: case LEVEL_TELEP: case MAGIC_PORTAL: Your("webbing vanishes!"); return(0); case WEB: You("make the web thicker."); return(1); case HOLE: case TRAPDOOR: You("web over the %s.", (ttmp->ttyp == TRAPDOOR) ? "trap door" : "hole"); deltrap(ttmp); newsym(u.ux, u.uy); return 1; case ROLLING_BOULDER_TRAP: You("spin a web, jamming the trigger."); deltrap(ttmp); 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: case MAGIC_TRAP: 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); return(0); } else if (On_stairs(u.ux, u.uy)) { /* cop out: don't let them hide the stairs */ Your("web fails to impede access to the %s.", (levl[u.ux][u.uy].typ == STAIRS) ? "stairs" : "ladder"); return(1); } ttmp = maketrap(u.ux, u.uy, WEB); if (ttmp) { ttmp->tseen = 1; ttmp->madeby_u = 1; } newsym(u.ux, u.uy); return(1); } int dosummon() { int placeholder; if (u.uen < 10) { You("lack the energy to send forth a call for help!"); return(0); } u.uen -= 10; flags.botl = 1; You("call upon your brethren for help!"); exercise(A_WIS, TRUE); if (!were_summon(youmonst.data, TRUE, &placeholder, (char *)0)) pline("But none arrive."); return(1); } #if 0 /* WAC supplanted by dogaze (). */ 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!"); return(0); } u.uen -= 15; flags.botl = 1; 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)); else if (mtmp->minvis && !See_invisible) You_cant("see where to gaze at %s.", Monnam(mtmp)); else if (mtmp->m_ap_type == M_AP_FURNITURE || mtmp->m_ap_type == M_AP_OBJECT) { looked--; continue; } else if (flags.safe_dog && !Confusion && !Hallucination && mtmp->mtame) { You("avoid gazing at %s.", y_monnam(mtmp)); } 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); } if (!mtmp->mcanmove || mtmp->mstun || mtmp->msleeping || !mtmp->mcansee || !haseyes(mtmp->data)) { 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))); nomul((u.ulevel > 6 || rn2(4)) ? -d((int)mtmp->m_lev+1, (int)mtmp->data->mattk[0].damd) : -200); return 1; } else 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)); /* as if gazing at a sleeping anything is fruitful... */ You("turn to stone..."); killer_format = KILLED_BY; killer = "deliberately meeting Medusa's gaze"; done(STONING); } } } } if (!looked) You("gaze at no place in particular."); return 1; } #endif int dohide() { boolean ismimic = youmonst.data->mlet == S_MIMIC; if (u.uundetected || (ismimic && youmonst.m_ap_type != M_AP_NOTHING)) { You("are already hiding."); return(0); } if (ismimic) { /* should bring up a dialog "what would you like to imitate?" */ youmonst.m_ap_type = M_AP_OBJECT; youmonst.mappearance = STRANGE_OBJECT; } else u.uundetected = 1; newsym(u.ux,u.uy); return(1); } int domindblast() { struct monst *mtmp, *nmon; if (u.uen < 10) { You("concentrate but lack the energy to maintain doing so."); return(0); } u.uen -= 10; flags.botl = 1; pline("A wave of psychic energy pours out."); for(mtmp=fmon; mtmp; mtmp = nmon) { int u_sen; nmon = mtmp->nmon; if (DEADMONSTER(mtmp)) continue; if (distu(mtmp->mx, mtmp->my) > BOLT_LIM * BOLT_LIM) continue; if(mtmp->mpeaceful) continue; u_sen = telepathic(mtmp->data) && !mtmp->mcansee; if (u_sen || (telepathic(mtmp->data) && rn2(3)) || !rn2(2)) { You("lock in on %s %s.", s_suffix(mon_nam(mtmp)), u_sen ? "telepathy" : telepathic(mtmp->data) ? "latent telepathy" : "mind"); mtmp->mhp -= rn1(4,4); if (mtmp->mhp <= 0) killed(mtmp); } } return 1; } STATIC_OVL void uunstick() { pline("%s is no longer in your clutches.", Monnam(u.ustuck)); setustuck(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 */ uarm->owornmask &= ~I_SPECIAL; } } #endif /* OVLB */ #ifdef OVL1 const char * mbodypart(mon, part) struct monst *mon; int part; { 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" }, *bird_parts[] = { "wing", "eye", "face", "wing", "wing tip", "foot", "wing", "winged", "head", "leg", "light headed", "neck", "spine", "toe", "feathers", "blood", "lung", "bill", "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[] = { S_HUMAN, S_MUMMY, S_ZOMBIE, S_ANGEL, S_NYMPH, S_LEPRECHAUN, S_QUANTMECH, S_VAMPIRE, S_ORC, S_GIANT, /* quest nemeses */ '\0' /* string terminator; assert( S_xxx != 0 ); */ }; struct permonst *mptr = mon->data; if (part == HAND || part == HANDED) { /* some special cases */ if (mptr->mlet == S_DOG || mptr->mlet == S_FELINE || mptr->mlet == S_YETI) return part == HAND ? "paw" : "pawed"; if (humanoid(mptr) && attacktype(mptr, AT_CLAW) && !index(not_claws, mptr->mlet) && mptr != &mons[PM_STONE_GOLEM] && 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)) return humanoid_parts[part]; if (mptr == &mons[PM_RAVEN]) return bird_parts[part]; if (mptr->mlet == S_CENTAUR || mptr->mlet == S_UNICORN || (mptr == &mons[PM_ROTHE] && part != HAIR)) return horse_parts[part]; if (mptr->mlet == S_LIGHT) { if (part == HANDED) return "rayed"; else if (part == ARM || part == FINGER || part == FINGERTIP || part == HAND) return "ray"; else return "beam"; } 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]; if (mptr->mlet == S_JELLY || mptr->mlet == S_PUDDING || mptr->mlet == S_BLOB || mptr == &mons[PM_JELLYFISH]) return jelly_parts[part]; if (mptr->mlet == S_VORTEX || mptr->mlet == S_ELEMENTAL) return vortex_parts[part]; if (mptr->mlet == S_FUNGUS) return fungus_parts[part]; if (humanoid(mptr)) return humanoid_parts[part]; return animal_parts[part]; } const char * body_part(part) int part; { return mbodypart(&youmonst, part); } #endif /* OVL1 */ #ifdef OVL0 int poly_gender() { /* Returns gender of polymorphed player; 0/1=same meaning as flags.female, * 2=none. */ if (is_neuter(youmonst.data) || !humanoid(youmonst.data)) return 2; return flags.female; } #endif /* OVL0 */ #ifdef OVLB void ugolemeffects(damtype, dam) int damtype, dam; { int heal = 0; /* We won't bother with "slow"/"haste" since players do not * have a monster-specific slow/haste so there is no way to * restore the old velocity once they are back to human. */ if (u.umonnum != PM_FLESH_GOLEM && u.umonnum != PM_IRON_GOLEM) return; switch (damtype) { case AD_ELEC: if (u.umonnum == PM_FLESH_GOLEM) heal = dam / 6; /* Approx 1 per die */ break; case AD_FIRE: if (u.umonnum == PM_IRON_GOLEM) heal = dam; break; } if (heal && (u.mh < u.mhmax)) { u.mh += heal; if (u.mh > u.mhmax) u.mh = u.mhmax; flags.botl = 1; pline("Strangely, you feel better than before."); exercise(A_STR, TRUE); } } STATIC_OVL int armor_to_dragon(atyp) int atyp; { switch(atyp) { case GRAY_DRAGON_SCALE_MAIL: case GRAY_DRAGON_SCALES: return PM_GRAY_DRAGON; case SILVER_DRAGON_SCALE_MAIL: case SILVER_DRAGON_SCALES: return PM_SILVER_DRAGON; case SHIMMERING_DRAGON_SCALE_MAIL: case SHIMMERING_DRAGON_SCALES: return PM_SHIMMERING_DRAGON; case DEEP_DRAGON_SCALE_MAIL: case DEEP_DRAGON_SCALES: return PM_DEEP_DRAGON; case RED_DRAGON_SCALE_MAIL: case RED_DRAGON_SCALES: return PM_RED_DRAGON; case ORANGE_DRAGON_SCALE_MAIL: case ORANGE_DRAGON_SCALES: return PM_ORANGE_DRAGON; case WHITE_DRAGON_SCALE_MAIL: case WHITE_DRAGON_SCALES: return PM_WHITE_DRAGON; case BLACK_DRAGON_SCALE_MAIL: case BLACK_DRAGON_SCALES: return PM_BLACK_DRAGON; case BLUE_DRAGON_SCALE_MAIL: case BLUE_DRAGON_SCALES: return PM_BLUE_DRAGON; case GREEN_DRAGON_SCALE_MAIL: case GREEN_DRAGON_SCALES: return PM_GREEN_DRAGON; case YELLOW_DRAGON_SCALE_MAIL: case YELLOW_DRAGON_SCALES: return PM_YELLOW_DRAGON; default: return -1; } } static struct { int mon; int reqtime; boolean merge; } draconic; STATIC_PTR int mage_transform() /* called each move during transformation process */ { if (--draconic.reqtime) return 1; if (draconic.merge) merge_with_armor(); polymon(draconic.mon); return 0; } int polyatwill() /* Polymorph under conscious control (#youpoly) */ { #define EN_DOPP 20 /* This is the "base cost" for a polymorph * Actual cost is this base cost + 5 * monster level * of the final form you actually assume. * Energy will be taken first, then you will get * more hungry if you do not have enough energy. */ #define EN_WERE 10 #define EN_BABY_DRAGON 10 #define EN_ADULT_DRAGON 15 boolean scales = ((uarm && uarm->otyp == RED_DRAGON_SCALES && Role_if(PM_FLAME_MAGE)) || (uarm && uarm->otyp == WHITE_DRAGON_SCALES && Role_if(PM_ICE_MAGE))); boolean scale_mail = ((uarm && uarm->otyp == RED_DRAGON_SCALE_MAIL && Role_if(PM_FLAME_MAGE)) || (uarm && uarm->otyp == WHITE_DRAGON_SCALE_MAIL && Role_if(PM_ICE_MAGE))); /* KMH, balance patch -- new intrinsic */ if (Unchanging) { pline("You cannot change your form."); return 0; } /* First, if in correct polymorphed form, rehumanize (for free) * Omit Lycanthropes, who need to spend energy to change back and forth */ if (Upolyd && (Race_if(PM_DOPPELGANGER) || (Role_if(PM_FLAME_MAGE) && (u.umonnum == PM_RED_DRAGON || u.umonnum == PM_BABY_RED_DRAGON)) || (Role_if(PM_ICE_MAGE) && (u.umonnum == PM_WHITE_DRAGON || u.umonnum == PM_BABY_WHITE_DRAGON)))) { rehumanize(); return 1; } if ((Role_if(PM_ICE_MAGE) || Role_if(PM_FLAME_MAGE)) && (u.ulevel > 6 || scale_mail)) { /* [ALI] * I've rewritten the logic here to fix the failure messages, * but the requirements for polymorphing into the two dragon * forms remains the same: * * Polymorph into adult dragon form if one of: * * - Wearing scale mail (no charge). * - Wearing scales and experience level 7 and * energy level 11 or more (charge is 10). * - Not wearing scales or scale mail and experience level 14 and * energy level 16 or more (charge is 15). * * Polymorph into baby dragon form if one of: * * - Wearing scales and experience level 7 and * energy level 10 or less (no charge). * - Not wearing scales or scale mail and experience level 14 and * energy level 11-15 (charge is 10). * - Not wearing scales or scale mail and experience level 7-13 and * energy level 11 or more (charge is 10). * * Fail if one of: * * - Not wearing scales or scale mail and experience level 7 and * energy level 10 or less (not enough energy). * - Not wearing scale mail and experience level 6 or less * (not experienced enough). * * The transformation takes a few turns. If interrupted during this * period then the ritual must be begun again from the beginning. * We deliberately don't say what form the ritual takes since it * is unaffected by blindness, confusion, stun etc. */ if (yn("Transform into your draconic form?") == 'n') return 0; else if (!scales && !scale_mail && u.uen <= EN_BABY_DRAGON) { You("don't have the energy to polymorph."); return 0; } else { /* Check if you can do the adult form */ if (u.ulevel > 13 && u.uen > EN_ADULT_DRAGON || scales && u.uen > EN_BABY_DRAGON || scale_mail) { /* If you have scales, energy cost is less */ /* If you have scale mail, there is no cost! */ if (!scale_mail) { if (scales) u.uen -= EN_BABY_DRAGON; else u.uen -= EN_ADULT_DRAGON; } draconic.mon = Role_if(PM_FLAME_MAGE) ? PM_RED_DRAGON : PM_WHITE_DRAGON; draconic.merge = scales || scale_mail; /* Otherwise use the baby form */ } else { if (!scales) u.uen -= EN_BABY_DRAGON; draconic.mon = Role_if(PM_FLAME_MAGE) ? PM_BABY_RED_DRAGON : PM_BABY_WHITE_DRAGON; draconic.merge = scales; } draconic.reqtime = 2; if (mvitals[draconic.mon].mvflags & G_GENOD) draconic.merge = FALSE; set_occupation(mage_transform, "transforming into your draconic form", 0); You("begin the transformation ritual."); return 1; } } if (Race_if(PM_DOPPELGANGER)) { if (yn("Polymorph at will?") == 'n') return 0; else if (u.uen < EN_DOPP) { You("don't have the energy to polymorph!"); return 0; } else { u.uen -= EN_DOPP; if (multi >= 0) { if (occupation) stop_occupation(); else nomul(0); } polyself(FALSE); if (Upolyd) { /* You actually polymorphed */ u.uen -= 5 * mons[u.umonnum].mlevel; if (u.uen < 0) { morehungry(-u.uen); u.uen = 0; } } return 1; } } else if (Race_if(PM_HUMAN_WEREWOLF) && (!Upolyd || u.umonnum == u.ulycn)) { if (yn("Change form?") == 'n') return 0; else if (u.ulycn == NON_PM) { /* Very serious */ You("are no longer a lycanthrope!"); } else if (u.ulevel <= 2) { You("can't invoke the change at will yet."); return 0; } else if (u.uen < EN_WERE) { You("don't have the energy to change form!"); return 0; } else { /* Committed to the change now */ u.uen -= EN_WERE; if (!Upolyd) { if (multi >= 0) { if (occupation) stop_occupation(); else nomul(0); } you_were(); } else { rehumanize(); } return 1; } } else { pline("You can't polymorph at will%s.", ((Role_if(PM_FLAME_MAGE) || Role_if(PM_ICE_MAGE) || Race_if(PM_HUMAN_WEREWOLF) || Race_if(PM_DOPPELGANGER)) ? " yet" : "")); return 0; } flags.botl = 1; return 1; } static void merge_with_armor() { /* This function does hides the armor being worn * It currently assumes that you are changing into a dragon * Should check that monster being morphed into is not genocided * see do_merge above for correct use */ if (Race_if(PM_DOPPELGANGER) && !uarm->cursed && uarmu && !uarmu->cursed) { struct obj *otmp = uarmu; You("quickly remove your shirt as you start to change."); setworn((struct obj *)0, otmp->owornmask & W_ARMU); dropx(otmp); } You("merge with your scaly armor."); uskin = uarm; uarm = (struct obj *)0; /* save/restore hack */ uskin->owornmask |= I_SPECIAL; } #if 0 /* What the f*** is this for? -- KMH */ static void special_poly() { char buf[BUFSZ]; int old_light, new_light; int mntmp = NON_PM; int tries=0; old_light = (u.umonnum >= LOW_PM) ? emits_light(youmonst.data) : 0; do { getlin("Become what kind of monster? [type the name]", buf); mntmp = name_to_mon(buf); if (mntmp < LOW_PM) pline("I've never heard of such monsters."); /* Note: humans are illegal as monsters, but an * illegal monster forces newman(), which is what we * want if they specified a human.... */ /* [Tom] gnomes are polyok, so this doesn't apply for player gnomes */ /* WAC but we want to catch player gnomes and not so add an extra check */ else if (!polyok(&mons[mntmp]) && (Role_elven ? !is_elf(&mons[mntmp]) : #ifdef DWARF Role_if(PM_DWARF) ? !is_gnome(&mons[mntmp]) : #endif /* WAC * should always fail (for now) gnome check * unless gnomes become not polyok. Then, it'll * still work ;B */ Role_if(PM_GNOME) ? !is_gnome(&mons[mntmp]) : !is_human(&mons[mntmp]))) You("cannot polymorph into that."); #ifdef EATEN_MEMORY else if (!mvitals[mntmp].eaten && (rn2((u.ulevel + 25)) < 20)) { You("don't have the knowledge to polymorph into that."); return; /* Nice try */ } else { You("attempt an unfamiliar polymorph."); break; } #endif } while(++tries < 5); if (tries==5) { pline(thats_enough_tries); return; } else if (polymon(mntmp)) { /* same as made_change above */ new_light = (u.umonnum >= LOW_PM) ? emits_light(youmonst.data) : 0; if (old_light != new_light) { if (old_light) del_light_source(LS_MONSTER, (genericptr_t)&youmonst); if (new_light == 1) ++new_light; /* otherwise it's undetectable */ if (new_light) new_light_source(u.ux, u.uy, new_light, LS_MONSTER, (genericptr_t)&youmonst); } } return; } #endif #endif /* OVLB */ /*polyself.c*/ slashem-0.0.7E7F3/src/sounds.c0000664000076400007640000007366010545462317014136 0ustar aliali/* SCCS Id: @(#)sounds.c 3.4 2002/05/06 */ /* 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 # ifdef USER_SOUNDS_REGEX #include # endif #endif /* Hmm.... in working on SHOUT I started thinking about things. * I think something like this should be set up: * You_hear_mon(mon,loud, msg) - You_hear(msg); monnoise(mon,loud); * monnoise(mon,loud) - wake_nearto(mon->mx,mon->my,mon->data->mlevel*loud) * and stuff like that * mon_say(mon,loud,msg) - verbalize(msg); sayeffects(mon,loud,msg); * sayeffects(mon,loud,msg) - monnoise(mon,loud); + the pet stuff et al * In fact, I think will set this up, but as a diff, not actually modifying the * files. * If I knew something about branches I might do that. * But anyway, I should be working on petcommands now... maybe later... * -- JRN */ #ifdef OVLB static int FDECL(domonnoise,(struct monst *)); static int NDECL(dochat); static const char *FDECL(yelp_sound,(struct monst *)); static const char *FDECL(whimper_sound,(struct monst *)); #endif /* OVLB */ #ifdef OVL0 #ifdef DUMB static int FDECL(mon_in_room, (struct monst *,int)); /* this easily could be a macro, but it might overtax dumb compilers */ static int mon_in_room(mon, rmtyp) struct monst *mon; int rmtyp; { int rno = levl[mon->mx][mon->my].roomno; return rooms[rno - ROOMOFFSET].rtype == rmtyp; } #else /* JRN: converted above to macro */ # define mon_in_room(mon,rmtype) (rooms[ levl[(mon)->mx][(mon)->my].roomno \ - ROOMOFFSET].rtype == (rmtype)) #endif void dosounds() { register struct mkroom *sroom; register int hallu, vx, vy; #if defined(AMIGA) && defined(AZTEC_C_WORKAROUND) int xx; #endif struct monst *mtmp; if (!flags.soundok || u.uswallow || Underwater) return; hallu = Hallucination ? 1 : 0; if (level.flags.nfountains && !rn2(400)) { static const char * const fountain_msg[4] = { "bubbling water.", "water falling on coins.", "the splashing of a naiad.", "a soda fountain!", }; You_hear(fountain_msg[rn2(3)+hallu]); } #ifdef SINK if (level.flags.nsinks && !rn2(300)) { static const char * const sink_msg[3] = { "a slow drip.", "a gurgling noise.", "dishes being washed!", }; You_hear(sink_msg[rn2(2)+hallu]); } #endif if (level.flags.has_court && !rn2(200)) { static const char * const throne_msg[4] = { "the tones of courtly conversation.", "a sceptre pounded in judgment.", "Someone shouts \"Off with %s head!\"", "Queen Beruthiel's cats!", }; for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) { if (DEADMONSTER(mtmp)) continue; if ((mtmp->msleeping || is_lord(mtmp->data) || is_prince(mtmp->data)) && !is_animal(mtmp->data) && mon_in_room(mtmp, COURT)) { /* finding one is enough, at least for now */ int which = rn2(3)+hallu; if (which != 2) You_hear(throne_msg[which]); else pline(throne_msg[2], uhis()); return; } } } if (level.flags.has_swamp && !rn2(200)) { static const char * const swamp_msg[3] = { "hear mosquitoes!", "smell marsh gas!", /* so it's a smell...*/ "hear Donald Duck!", }; You(swamp_msg[rn2(2)+hallu]); return; } if (level.flags.spooky && !rn2(200)) { static const char *spooky_msg[24] = { "hear screaming in the distance!", "hear a faint whisper: \"Please leave your measurements for your custom-made coffin.\"", "hear a door creak ominously.", "hear hard breathing just a few steps behind you!", "hear dragging footsteps coming closer!", "hear anguished moaning and groaning coming out of the walls!", "hear mad giggling directly behind you!", "smell rotting corpses.", "smell chloroform!", "feel ice cold fingers stroking your neck.", "feel a ghostly touch caressing your face.", "feel somebody dancing on your grave.", "feel something breathing down your neck.", "feel as if the walls were closing in on you.", "just stepped on something squishy.", "hear a strong voice pronouncing: \"There can only be one!\"", "hear a voice booming all around you: \"Warning: self-destruction sequence activated!\"", "smell your mother-in-law's cooking!", "smell horse dung.", "hear someone shouting: \"Who ordered the burger?\"", "can faintly hear the Twilight Zone theme.", "hear an outraged customer complaining: \"I'll be back!\"", "hear someone praising your valor!", "hear someone singing: \"Jingle bells, jingle bells...\"", }; You(spooky_msg[rn2(15)+hallu*9]); return; } if (level.flags.has_vault && !rn2(200)) { if (!(sroom = search_special(VAULT))) { /* strange ... */ level.flags.has_vault = 0; return; } if(gd_sound()) switch (rn2(2)+hallu) { case 1: { boolean gold_in_vault = FALSE; for (vx = sroom->lx;vx <= sroom->hx; vx++) for (vy = sroom->ly; vy <= sroom->hy; vy++) if (g_at(vx, vy)) gold_in_vault = TRUE; #if defined(AMIGA) && defined(AZTEC_C_WORKAROUND) /* Bug in aztec assembler here. Workaround below */ xx = ROOM_INDEX(sroom) + ROOMOFFSET; xx = (xx != vault_occupied(u.urooms)); if(xx) #else if (vault_occupied(u.urooms) != (ROOM_INDEX(sroom) + ROOMOFFSET)) #endif /* AZTEC_C_WORKAROUND */ { if (gold_in_vault) You_hear(!hallu ? "someone counting money." : "the quarterback calling the play."); else You_hear("someone searching."); break; } /* fall into... (yes, even for hallucination) */ } case 0: You_hear("the footsteps of a guard on patrol."); break; case 2: You_hear("Ebenezer Scrooge!"); break; } return; } if (level.flags.has_beehive && !rn2(200)) { for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) { if (DEADMONSTER(mtmp)) continue; if ((mtmp->data->mlet == S_ANT && is_flyer(mtmp->data)) && mon_in_room(mtmp, BEEHIVE)) { switch (rn2(2)+hallu) { case 0: You_hear("a low buzzing."); break; case 1: You_hear("an angry drone."); break; case 2: You_hear("bees in your %sbonnet!", uarmh ? "" : "(nonexistent) "); break; } return; } } } if (level.flags.has_morgue && !rn2(200)) { for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) { if (DEADMONSTER(mtmp)) continue; if (is_undead(mtmp->data) && mon_in_room(mtmp, MORGUE)) { switch (rn2(2)+hallu) { case 0: You("suddenly realize it is unnaturally quiet."); break; case 1: pline_The("%s on the back of your %s stands up.", body_part(HAIR), body_part(NECK)); break; case 2: pline_The("%s on your %s seems to stand up.", body_part(HAIR), body_part(HEAD)); break; } return; } } } if (level.flags.has_barracks && !rn2(200)) { static const char * const barracks_msg[4] = { "blades being honed.", "loud snoring.", "dice being thrown.", "General MacArthur!", }; int count = 0; for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) { if (DEADMONSTER(mtmp)) continue; if (is_mercenary(mtmp->data) && #if 0 /* don't bother excluding these */ !strstri(mtmp->data->mname, "watch") && !strstri(mtmp->data->mname, "guard") && #endif mon_in_room(mtmp, BARRACKS) && /* sleeping implies not-yet-disturbed (usually) */ (mtmp->msleeping || ++count > 5)) { You_hear(barracks_msg[rn2(3)+hallu]); return; } } } if (level.flags.has_zoo && !rn2(200)) { static const char * const zoo_msg[3] = { "a sound reminiscent of an elephant stepping on a peanut.", "a sound reminiscent of a seal barking.", "Doctor Doolittle!", }; for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) { if (DEADMONSTER(mtmp)) continue; if ((mtmp->msleeping || is_animal(mtmp->data)) && mon_in_room(mtmp, ZOO)) { You_hear(zoo_msg[rn2(2)+hallu]); return; } } } if (level.flags.has_shop && !rn2(200)) { if (!(sroom = search_special(ANY_SHOP))) { /* strange... */ level.flags.has_shop = 0; return; } if (tended_shop(sroom) && !index(u.ushops, ROOM_INDEX(sroom) + ROOMOFFSET)) { static const char * const shop_msg[3] = { "someone cursing shoplifters.", "the chime of a cash register.", "Neiman and Marcus arguing!", }; You_hear(shop_msg[rn2(2)+hallu]); } return; } if (Is_oracle_level(&u.uz) && !rn2(400)) { /* make sure the Oracle is still here */ for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) if (!DEADMONSTER(mtmp) && mtmp->data == &mons[PM_ORACLE]) break; /* and don't produce silly effects when she's clearly visible */ if (mtmp && (hallu || !canseemon(mtmp))) { static const char * const ora_msg[5] = { "a strange wind.", /* Jupiter at Dodona */ "convulsive ravings.", /* Apollo at Delphi */ "snoring snakes.", /* AEsculapius at Epidaurus */ "someone say \"No more woodchucks!\"", "a loud ZOT!" /* both rec.humor.oracle */ }; /* KMH -- Give funny messages on Groundhog Day */ if (flags.groundhogday) hallu = 1; You_hear(ora_msg[rn2(3)+hallu*2]); } return; } #ifdef BLACKMARKET if (!Is_blackmarket(&u.uz) && at_dgn_entrance("One-eyed Sam's Market") && !rn2(200)) { static const char *blkmar_msg[3] = { "You hear someone complaining about the prices.", "Somebody whispers: \"Food rations? Only 900 zorkmids.\"", "You feel like searching for more gold.", }; pline(blkmar_msg[rn2(2)+hallu]); } #endif /* BLACKMARKET */ } #endif /* OVL0 */ #ifdef OVLB static const char * const h_sounds[] = { "beep", "boing", "sing", "belche", "creak", "cough", "rattle", "ululate", "pop", "jingle", "sniffle", "tinkle", "eep" }; /* make the sounds of a pet in any level of distress */ /* (1 = "whimper", 2 = "yelp", 3 = "growl") */ void pet_distress(mtmp, lev) register struct monst *mtmp; int lev; { const char *verb; if (mtmp->msleeping || !mtmp->mcanmove || !mtmp->data->msound) return; /* presumably nearness and soundok checks have already been made */ if (Hallucination) verb = h_sounds[rn2(SIZE(h_sounds))]; else if (lev == 3) verb = growl_sound(mtmp); else if (lev == 2) verb = yelp_sound(mtmp); else if (lev == 1) verb = whimper_sound(mtmp); else panic("strange level of distress"); if (verb) { pline("%s %s%c", Monnam(mtmp), vtense((char *)0, verb), lev>1?'!':'.'); if (flags.run) nomul(0); wake_nearto(mtmp->mx,mtmp->my,mtmp->data->mlevel*6*lev); } } /* the sounds of a seriously abused pet, including player attacking it */ /* in extern.h: #define growl(mon) pet_distess((mon),3) */ const char * growl_sound(mtmp) register struct monst *mtmp; { const char *ret; switch (mtmp->data->msound) { case MS_MEW: case MS_HISS: ret = "hiss"; break; case MS_BARK: case MS_GROWL: ret = "growl"; break; case MS_ROAR: ret = "roar"; break; case MS_BUZZ: ret = "buzz"; break; case MS_SQEEK: ret = "squeal"; break; case MS_SQAWK: ret = "screech"; break; case MS_NEIGH: ret = "neigh"; break; case MS_WAIL: ret = "wail"; break; case MS_SILENT: ret = "commotion"; break; case MS_PARROT: ret = "squaark"; break; default: ret = "scream"; } return ret; } /* the sounds of mistreated pets */ /* in extern.h: #define yelp(mon) pet_distress((mon),2) */ static const char * yelp_sound(mtmp) register struct monst *mtmp; { const char *ret; switch(mtmp->data->msound) { case MS_MEW: ret = "yowl"; break; case MS_BARK: case MS_GROWL: ret = "yelp"; break; case MS_ROAR: ret = "snarl"; break; case MS_SQEEK: ret = "squeal"; break; case MS_SQAWK: ret = "screak"; break; case MS_WAIL: ret = "wail"; break; default: ret = (const char*) 0; } return ret; } /* the sounds of distressed pets */ /* in extern.h: #define whimper(mon) pet_distress((mon),1) */ static const char * whimper_sound(mtmp) register struct monst *mtmp; { const char *ret; switch (mtmp->data->msound) { case MS_MEW: case MS_GROWL: ret = "whimper"; break; case MS_BARK: ret = "whine"; break; case MS_SQEEK: ret = "squeal"; break; default: ret = (const char *)0; } return ret; } /* pet makes "I'm hungry" noises */ void beg(mtmp) register struct monst *mtmp; { if (mtmp->msleeping || !mtmp->mcanmove || !(carnivorous(mtmp->data) || herbivorous(mtmp->data))) 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)) map_invisible(mtmp->mx, mtmp->my); verbalize("I'm hungry."); } } static int domonnoise(mtmp) register struct monst *mtmp; { register const char *pline_msg = 0, /* Monnam(mtmp) will be prepended */ *verbl_msg = 0; /* verbalize() */ struct permonst *ptr = mtmp->data; char verbuf[BUFSZ]; /* presumably nearness and sleep checks have already been made */ if (!flags.soundok) return(0); if (is_silent(ptr)) return(0); /* Make sure its your role's quest quardian; adjust if not */ if (ptr->msound == MS_GUARDIAN && ptr != &mons[urole.guardnum]) { int mndx = monsndx(ptr); ptr = &mons[genus(mndx,1)]; } /* be sure to do this before talking; the monster might teleport away, in * which case we want to check its pre-teleport position */ if (!canspotmon(mtmp)) map_invisible(mtmp->mx, mtmp->my); switch (ptr->msound) { case MS_ORACLE: return doconsult(mtmp); case MS_PRIEST: priest_talk(mtmp); break; case MS_LEADER: case MS_NEMESIS: case MS_GUARDIAN: quest_chat(mtmp); break; case MS_SELL: /* pitch, pay, total */ shk_chat(mtmp); break; case MS_VAMPIRE: { /* vampire messages are varied by tameness, peacefulness, and time of night */ boolean isnight = night(); boolean kindred = maybe_polyd(u.umonnum == PM_VAMPIRE || u.umonnum == PM_VAMPIRE_LORD || u.umonnum == PM_VAMPIRE_MAGE, Race_if(PM_VAMPIRE)); boolean nightchild = (Upolyd && (u.umonnum == PM_WOLF || u.umonnum == PM_SHADOW_WOLF || u.umonnum == PM_MIST_WOLF || u.umonnum == PM_WINTER_WOLF || u.umonnum == PM_WINTER_WOLF_CUB)); const char *racenoun = (flags.female && urace.individual.f) ? urace.individual.f : (urace.individual.m) ? urace.individual.m : urace.noun; if (mtmp->mtame) { if (kindred) { Sprintf(verbuf, "Good %s to you Master%s", isnight ? "evening" : "day", isnight ? "!" : ". Why do we not rest?"); verbl_msg = verbuf; } else { Sprintf(verbuf,"%s%s", nightchild ? "Child of the night, " : "", midnight() ? "I can stand this craving no longer!" : isnight ? "I beg you, help me satisfy this growing craving!" : "I find myself growing a little weary."); verbl_msg = verbuf; } } else if (mtmp->mpeaceful) { if (kindred && isnight) { Sprintf(verbuf, "Good feeding %s!", flags.female ? "sister" : "brother"); verbl_msg = verbuf; } else if (nightchild && isnight) { Sprintf(verbuf, "How nice to hear you, child of the night!"); verbl_msg = verbuf; } else verbl_msg = "I only drink... potions."; } else { int vampindex; static const char * const vampmsg[] = { /* These first two (0 and 1) are specially handled below */ "I vant to suck your %s!", "I vill come after %s without regret!", /* other famous vampire quotes can follow here if desired */ }; 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)); verbl_msg = verbuf; } else if (vampindex == 1) { Sprintf(verbuf, vampmsg[vampindex], Upolyd ? an(mons[u.umonnum].mname) : an(racenoun)); verbl_msg = verbuf; } else verbl_msg = vampmsg[vampindex]; } } } break; 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 pline_msg = "whispers inaudibly. All you can make out is \"moon\"."; break; case MS_BARK: if (flags.moonphase == FULL_MOON && night()) { pline_msg = "howls."; } else if (mtmp->mpeaceful) { if (mtmp->mtame && (mtmp->mconf || mtmp->mflee || mtmp->mtrapped || moves > EDOG(mtmp)->hungrytime || mtmp->mtame < 5)) pline_msg = "whines."; else if (mtmp->mtame && EDOG(mtmp)->hungrytime > moves + 1000) pline_msg = "yips."; else { if (mtmp->data != &mons[PM_DINGO]) /* dingos do not actually bark */ pline_msg = "barks."; } } else { pline_msg = "growls."; } break; case MS_MEW: if (mtmp->mtame) { if (mtmp->mconf || mtmp->mflee || mtmp->mtrapped || mtmp->mtame < 5) pline_msg = "yowls."; else if (moves > EDOG(mtmp)->hungrytime) pline_msg = "meows."; else if (EDOG(mtmp)->hungrytime > moves + 1000) pline_msg = "purrs."; else pline_msg = "mews."; break; } /* else FALLTHRU */ case MS_GROWL: pline_msg = mtmp->mpeaceful ? "snarls." : "growls!"; break; case MS_ROAR: pline_msg = mtmp->mpeaceful ? "snarls." : "roars!"; break; case MS_SQEEK: pline_msg = "squeaks."; break; case MS_PARROT: switch (rn2(8)) { default: case 0: pline_msg = "squaarks louldly!"; break; case 1: pline_msg = "says 'Polly want a lembas wafer!'"; break; case 2: pline_msg = "says 'Nobody expects the Spanish Inquisition!'"; break; case 3: pline_msg = "says 'Who's a good boy, then?'"; break; case 4: pline_msg = "says 'Show us yer knickers!'"; break; case 5: pline_msg = "says 'You'll never make it!'"; break; case 6: pline_msg = "whistles suggestively!"; break; case 7: pline_msg = "says 'What sort of a sword do you call that!'"; break; } break; case MS_SQAWK: if (ptr == &mons[PM_RAVEN] && !mtmp->mpeaceful) verbl_msg = "Nevermore!"; else pline_msg = "squawks."; break; case MS_HISS: if (!mtmp->mpeaceful) pline_msg = "hisses!"; else return 0; /* no sound */ break; case MS_BUZZ: pline_msg = mtmp->mpeaceful ? "drones." : "buzzes angrily."; break; case MS_GRUNT: pline_msg = "grunts."; break; case MS_NEIGH: if (mtmp->mtame < 5) pline_msg = "neighs."; else if (moves > EDOG(mtmp)->hungrytime) pline_msg = "whinnies."; else pline_msg = "whickers."; break; case MS_WAIL: pline_msg = "wails mournfully."; break; case MS_GURGLE: pline_msg = "gurgles."; break; case MS_BURBLE: pline_msg = "burbles."; break; case MS_SHRIEK: pline_msg = "shrieks."; aggravate(); break; case MS_IMITATE: pline_msg = "imitates you."; break; case MS_SHEEP: pline_msg = "baaaas."; break; case MS_CHICKEN: pline_msg = "clucks."; break; case MS_COW: pline_msg = "bellows."; break; case MS_BONES: pline("%s rattles noisily.", Monnam(mtmp)); You("freeze for a moment."); nomul(-2); nomovemsg = 0; break; case MS_LAUGH: { static const char * const laugh_msg[4] = { "giggles.", "chuckles.", "snickers.", "laughs.", }; pline_msg = laugh_msg[rn2(4)]; } break; case MS_MUMBLE: pline_msg = "mumbles incomprehensibly."; break; case MS_DJINNI: if (mtmp->mtame) { verbl_msg = "Sorry, I'm all out of wishes."; } else if (mtmp->mpeaceful) { if (ptr == &mons[PM_WATER_DEMON]) pline_msg = "gurgles."; else verbl_msg = "I'm free!"; } else verbl_msg = "This will teach you not to disturb me!"; break; case MS_BOAST: /* giants */ 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; default: pline_msg = "shouts \"Fee Fie Foe Foo!\" and guffaws."; wake_nearto(mtmp->mx, mtmp->my, 7*7); break; } break; } /* else FALLTHRU */ case MS_HUMANOID: if (!mtmp->mpeaceful) { if (In_endgame(&u.uz) && is_mplayer(ptr)) { mplayer_talk(mtmp); break; } else return 0; /* no sound */ } /* Generic peaceful humanoid behaviour. */ if (mtmp->mflee) pline_msg = "wants nothing to do with you."; else if (mtmp->mhp < mtmp->mhpmax/4) pline_msg = "moans."; else if (mtmp->mconf || mtmp->mstun) verbl_msg = !rn2(3) ? "Huh?" : rn2(2) ? "What?" : "Eh?"; else if (!mtmp->mcansee) verbl_msg = "I can't see!"; else if (mtmp->mtrapped) { struct trap *t = t_at(mtmp->mx, mtmp->my); if (t) t->tseen = 1; verbl_msg = "I'm trapped!"; } else if (mtmp->mhp < mtmp->mhpmax/2) pline_msg = "asks for a potion of healing."; else if (mtmp->mtame && !mtmp->isminion && moves > EDOG(mtmp)->hungrytime) verbl_msg = "I'm hungry."; /* Specific monsters' interests */ else if (is_elf(ptr)) pline_msg = "curses orcs."; else if (is_dwarf(ptr)) pline_msg = "talks about mining."; else if (likes_magic(ptr)) pline_msg = "talks about spellcraft."; else if (ptr->mlet == S_CENTAUR) pline_msg = "discusses hunting."; else switch (monsndx(ptr)) { case PM_HOBBIT: pline_msg = (mtmp->mhpmax - mtmp->mhp >= 10) ? "complains about unpleasant dungeon conditions." : "asks you about the One Ring."; break; #if 0 /* OBSOLETE */ case PM_FARMER_MAGGOT: pline_msg = "mumbles something about Morgoth."; break; #endif case PM_ARCHEOLOGIST: pline_msg = "describes a recent article in \"Spelunker Today\" magazine."; break; #ifdef TOURIST case PM_TOURIST: verbl_msg = "Aloha."; break; #endif default: pline_msg = "discusses dungeon exploration."; break; } break; case MS_SEDUCE: #ifdef SEDUCE if (ptr->mlet != S_NYMPH && could_seduce(mtmp, &youmonst, (struct attack *)0) == 1) { (void) doseduce(mtmp); break; } switch ((poly_gender() != (int) mtmp->female) ? rn2(3) : 0) #else switch ((poly_gender() == 0) ? rn2(3) : 0) #endif { case 2: verbl_msg = "Hello, sailor."; break; case 1: pline_msg = "comes on to you."; break; default: pline_msg = "cajoles you."; } break; #ifdef KOPS case MS_ARREST: if (mtmp->mpeaceful) verbalize("Just the facts, %s.", flags.female ? "Ma'am" : "Sir"); else { static const char * const arrest_msg[3] = { "Anything you say can be used against you.", "You're under arrest!", "Stop in the name of the Law!", }; verbl_msg = arrest_msg[rn2(3)]; } break; #endif case MS_BRIBE: if (mtmp->mpeaceful && !mtmp->mtame) { (void) demon_talk(mtmp); break; } /* fall through */ case MS_CUSS: if (!mtmp->mpeaceful) cuss(mtmp); break; case MS_GYPSY: /* KMH */ if (mtmp->mpeaceful) { gypsy_chat(mtmp); break; } /* fall through */ case MS_SPELL: /* deliberately vague, since it's not actually casting any spell */ pline_msg = "seems to mutter a cantrip."; break; case MS_NURSE: if (uwep && (uwep->oclass == WEAPON_CLASS || is_weptool(uwep)) || (u.twoweap && uswapwep && (uswapwep->oclass == WEAPON_CLASS || is_weptool(uswapwep)))) verbl_msg = "Put that weapon away before you hurt someone!"; else if (uarmc || uarm || uarmh || uarms || uarmg || uarmf) verbl_msg = Role_if(PM_HEALER) ? "Doc, I can't help you unless you cooperate." : "Please undress so I can examine you."; #ifdef TOURIST else if (uarmu) verbl_msg = "Take off your shirt, please."; #endif 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."; break; case MS_SOLDIER: { static const char * const soldier_foe_msg[3] = { "Resistance is useless!", "You're dog meat!", "Surrender!", }, * const soldier_pax_msg[3] = { "What lousy pay we're getting here!", "The food's not fit for Orcs!", "My feet hurt, I've been on them all day!", }; verbl_msg = mtmp->mpeaceful ? soldier_pax_msg[rn2(3)] : soldier_foe_msg[rn2(3)]; } break; case MS_RIDER: if (ptr == &mons[PM_DEATH] && !rn2(10)) pline_msg = "is busy reading a copy of Sandman #8."; else verbl_msg = "Who do you think you are, War?"; break; } if (pline_msg) pline("%s %s", Monnam(mtmp), pline_msg); else if (verbl_msg) verbalize(verbl_msg); return(1); } int dotalk() { int result; boolean save_soundok = flags.soundok; flags.soundok = 1; /* always allow sounds while chatting */ result = dochat(); flags.soundok = save_soundok; return result; } static int dochat() { register struct monst *mtmp; register int tx,ty; struct obj *otmp; if (is_silent(youmonst.data)) { pline("As %s, you cannot speak.", an(youmonst.data->mname)); return(0); } if (Strangled) { You_cant("speak. You're choking!"); return(0); } if (u.uswallow) { pline("They won't hear you out there."); return(0); } if (Underwater) { Your("speech is unintelligible underwater."); return(0); } if (!Blind && (otmp = shop_object(u.ux, u.uy)) != (struct obj *)0) { /* standing on something in a shop and chatting causes the shopkeeper to describe the price(s). This can inhibit other chatting inside a shop, but that shouldn't matter much. shop_object() returns an object iff inside a shop and the shopkeeper is present and willing (not angry) and able (not asleep) to speak and the position contains any objects other than just gold. */ price_quote(otmp); return(1); } if (!getdir("Talk to whom? (in what direction)")) { /* decided not to chat */ return(0); } #ifdef STEED if (u.usteed && u.dz > 0) return (domonnoise(u.usteed)); #endif if (u.dz) { pline("They won't hear you %s there.", u.dz < 0 ? "up" : "down"); return(0); } if (u.dx == 0 && u.dy == 0) { /* * Let's not include this. It raises all sorts of questions: can you wear * 2 helmets, 2 amulets, 3 pairs of gloves or 6 rings as a marilith, * etc... --KAA if (u.umonnum == PM_ETTIN) { You("discover that your other head makes boring conversation."); return(1); } */ pline("Talking to yourself is a bad habit for a dungeoneer."); return(0); } tx = u.ux+u.dx; ty = u.uy+u.dy; mtmp = m_at(tx, ty); if (!mtmp || mtmp->mundetected || mtmp->m_ap_type == M_AP_FURNITURE || mtmp->m_ap_type == M_AP_OBJECT) return(0); /* sleeping monsters won't talk, except priests (who wake up) */ if ((!mtmp->mcanmove || mtmp->msleeping) && !mtmp->ispriest) { /* If it is unseen, the player can't tell the difference between not noticing him and just not existing, so skip the message. */ if (canspotmon(mtmp)) pline("%s seems not to notice you.", Monnam(mtmp)); return(0); } /* if this monster is waiting for something, prod it into action */ mtmp->mstrategy &= ~STRAT_WAITMASK; if (mtmp->mtame && mtmp->meating) { if (!canspotmon(mtmp)) map_invisible(mtmp->mx, mtmp->my); pline("%s is eating noisily.", Monnam(mtmp)); return (0); } return domonnoise(mtmp); } #ifdef USER_SOUNDS extern void FDECL(play_usersound, (const char*, int)); typedef struct audio_mapping_rec { #ifdef USER_SOUNDS_REGEX struct re_pattern_buffer regex; #else char *pattern; #endif 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)); #ifdef USER_SOUNDS_REGEX 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; #else new_map->pattern = (char *)alloc(strlen(text) + 1); Strcpy(new_map->pattern, text); #endif new_map->filename = strdup(filespec); new_map->volume = volume; new_map->next = soundmap; #ifdef USER_SOUNDS_REGEX err = re_compile_pattern(text, strlen(text), &new_map->regex); #else err = 0; #endif 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) { #ifdef USER_SOUNDS_REGEX if (re_search(&cursor->regex, msg, strlen(msg), 0, 9999, 0) >= 0) { #else if (pmatch(cursor->pattern, msg)) { #endif play_usersound(cursor->filename, cursor->volume); } cursor = cursor->next; } } #endif /* USER_SOUNDS */ #endif /* OVLB */ /*sounds.c*/ slashem-0.0.7E7F3/src/do.c0000644000076400007640000014263110545462317013216 0ustar aliali/* SCCS Id: @(#)do.c 3.4 2003/12/02 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ /* Contains code for 'd', 'D' (drop), '>', '<' (up, down) */ #include "hack.h" #include "lev.h" #ifdef SINKS # ifdef OVLB STATIC_DCL void FDECL(trycall, (struct obj *)); # endif /* OVLB */ STATIC_DCL void FDECL(dosinkring, (struct obj *)); #endif /* SINKS */ STATIC_PTR int FDECL(drop, (struct obj *)); STATIC_PTR int NDECL(wipeoff); #ifdef OVL0 STATIC_DCL int FDECL(menu_drop, (int)); #endif #ifdef OVL2 STATIC_DCL int NDECL(currentlevel_rewrite); STATIC_DCL void NDECL(final_level); /* static boolean FDECL(badspot, (XCHAR_P,XCHAR_P)); */ #endif #ifdef OVLB static NEARDATA const char drop_types[] = { ALLOW_COUNT, COIN_CLASS, ALL_CLASSES, 0 }; /* 'd' command: drop one inventory item */ 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; } #endif /* OVLB */ #ifdef OVL0 /* Called when a boulder is dropped, thrown, or pushed. If it ends up * in a pool, it either fills the pool up or sinks away. In either case, * it's gone for good... If the destination is not a pool, returns FALSE. */ boolean boulder_hits_pool(otmp, rx, ry, pushing) struct obj *otmp; register int rx, ry; boolean pushing; { if (!otmp || otmp->otyp != BOULDER) impossible("Not a boulder?"); else if (!Is_waterlevel(&u.uz) && (is_pool(rx,ry) || is_lava(rx,ry))) { boolean lava = is_lava(rx,ry), fills_up; const char *what = waterbody_name(rx,ry); schar ltyp = levl[rx][ry].typ; int chance = rn2(10); /* water: 90%; lava: 10% */ fills_up = lava ? chance == 0 : chance != 0; if (fills_up) { struct trap *ttmp = t_at(rx, ry); if (ltyp == DRAWBRIDGE_UP) { levl[rx][ry].drawbridgemask &= ~DB_UNDER; /* clear lava */ levl[rx][ry].drawbridgemask |= DB_FLOOR; } else levl[rx][ry].typ = ROOM; if (ttmp) (void) delfloortrap(ttmp); bury_objs(rx, ry); newsym(rx,ry); if (pushing) { You("push %s into the %s.", the(xname(otmp)), what); if (flags.verbose && !Blind) pline("Now you can cross it!"); /* no splashing in this case */ } } if (!fills_up || !pushing) { /* splashing occurs */ if (!u.uinwater) { if (pushing ? !Blind : cansee(rx,ry)) { There("is a large splash as %s %s the %s.", the(xname(otmp)), fills_up? "fills":"falls into", what); } else if (flags.soundok) You_hear("a%s splash.", lava ? " sizzling" : ""); wake_nearto(rx, ry, 40); } if (fills_up && u.uinwater && distu(rx,ry) == 0) { u.uinwater = 0; docrt(); vision_full_recalc = 1; You("find yourself on dry land again!"); } else if (lava && distu(rx,ry) <= 2) { You("are hit by molten lava%c", Fire_resistance ? '.' : '!'); burn_away_slime(); if (Slimed) { pline("The slime is burned off!"); Slimed =0; } losehp(d((Fire_resistance ? 1 : 3), 6), "molten lava", KILLED_BY); } else if (!fills_up && flags.verbose && (pushing ? !Blind : cansee(rx,ry))) pline("It sinks without a trace!"); } /* boulder is now gone */ if (pushing) delobj(otmp); else obfree(otmp, (struct obj *)0); return TRUE; } return FALSE; } /* Used for objects which sometimes do special things when dropped; must be * called with the object not in any chain. Returns TRUE if the object goes * away. */ boolean flooreffects(obj,x,y,verb) struct obj *obj; int x,y; const char *verb; { struct trap *t; struct monst *mtmp; if (obj->where != OBJ_FREE) panic("flooreffects: obj not free"); /* make sure things like water_damage() have no pointers to follow */ obj->nobj = obj->nexthere = (struct obj *)0; if (obj->otyp == BOULDER && boulder_hits_pool(obj, x, y, FALSE)) return TRUE; else if (obj->otyp == BOULDER && (t = t_at(x,y)) != 0 && (t->ttyp==PIT || t->ttyp==SPIKED_PIT || t->ttyp==TRAPDOOR || t->ttyp==HOLE)) { 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, 3) && !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", NO_KILLER_PREFIX); return FALSE; /* player remains trapped */ } else u.utrap = 0; } } if (*verb) { if (Blind) { if ((x == u.ux) && (y == u.uy)) You_hear("a CRASH! beneath you."); else You_hear("the boulder %s.", verb); } else if (cansee(x, y)) { pline_The("boulder %s%s.", t->tseen ? "" : "triggers and ", t->ttyp == TRAPDOOR ? "plugs a trap door" : t->ttyp == HOLE ? "plugs a hole" : "fills a pit"); } } deltrap(t); obfree(obj, (struct obj *)0); 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)) { /* Reasonably bulky objects (arbitrary) splash when dropped. * If you're floating above the water even small things make noise. * Stuff dropped near fountains always misses */ if ((Blind || (Levitation || Flying)) && flags.soundok && ((x == u.ux) && (y == u.uy))) { if (!Underwater) { if (weight(obj) > 9) { pline("Splash!"); } else if (Levitation || Flying) { pline("Plop!"); } } map_background(x, y, 0); newsym(x, y); } water_damage(obj, FALSE, FALSE); } else if (u.ux == x && u.uy == y && (!u.utrap || u.utraptype != TT_PIT) && (t = t_at(x,y)) != 0 && t->tseen && (t->ttyp==PIT || t->ttyp==SPIKED_PIT)) { /* you escaped a pit and are standing on the precipice */ if (Blind && flags.soundok) You_hear("%s %s downwards.", The(xname(obj)), otense(obj, "tumble")); else pline("%s %s into %s pit.", The(xname(obj)), otense(obj, "tumble"), the_your[t->madeby_u]); } #ifdef LIGHTSABERS if (is_lightsaber(obj) && obj->lamplit) { if (cansee(x, y)) You("see %s deactivate.", an(xname(obj))); lightsaber_deactivate(obj, TRUE); } #endif return FALSE; } #endif /* OVL0 */ #ifdef OVLB void 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) && obj->oclass != COIN_CLASS) { There("is %s flash as %s %s the altar.", an(hcolor(obj->blessed ? NH_AMBER : NH_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; } } #ifdef SINKS STATIC_OVL void trycall(obj) register struct obj *obj; { if(!objects[obj->otyp].oc_name_known && !objects[obj->otyp].oc_uname) docall(obj); } STATIC_OVL void dosinkring(obj) /* obj is a ring being dropped over a kitchen sink */ register struct obj *obj; { register struct obj *otmp,*otmp2; register boolean ideed = TRUE; You("drop %s down the drain.", doname(obj)); obj->in_use = TRUE; /* block free identification via interrupt */ switch(obj->otyp) { /* effects that can be noticed without eyes */ case RIN_SEARCHING: You("thought your %s got lost in the sink, but there it is!", xname(obj)); goto giveback; case RIN_SLOW_DIGESTION: pline_The("ring is regurgitated!"); giveback: obj->in_use = FALSE; dropx(obj); trycall(obj); return; case RIN_LEVITATION: pline_The("sink quivers upward for a moment."); break; case RIN_POISON_RESISTANCE: You("smell rotten %s.", makeplural(fruitname(FALSE))); break; case RIN_AGGRAVATE_MONSTER: pline("Several flies buzz angrily around the sink."); break; case RIN_SHOCK_RESISTANCE: pline("Static electricity surrounds the sink."); break; /* KMH, balance patch -- now an amulet case RIN_DRAIN_RESISTANCE: pline("The sink looks weaker for a moment, but it passes."); break; */ case RIN_CONFLICT: You_hear("loud noises coming from the drain."); break; case RIN_SLEEPING: /* ALI */ You_hear("loud snores coming from the drain."); break; case RIN_SUSTAIN_ABILITY: /* KMH */ pline_The("water flow seems fixed."); break; case RIN_GAIN_STRENGTH: pline_The("water flow seems %ser now.", (obj->spe<0) ? "weak" : "strong"); break; case RIN_GAIN_CONSTITUTION: pline_The("water flow seems %ser now.", (obj->spe<0) ? "less" : "great"); break; case RIN_GAIN_INTELLIGENCE: case RIN_GAIN_WISDOM: pline("The water flow seems %ser now.", (obj->spe<0) ? "dull" : "quick"); break; case RIN_GAIN_DEXTERITY: pline("The water flow seems %ser now.", (obj->spe<0) ? "slow" : "fast"); break; case RIN_INCREASE_ACCURACY: /* KMH */ pline_The("water flow %s the drain.", (obj->spe<0) ? "misses" : "hits"); break; case RIN_INCREASE_DAMAGE: pline_The("water's force seems %ser now.", (obj->spe<0) ? "small" : "great"); break; case RIN_HUNGER: ideed = FALSE; for(otmp = level.objects[u.ux][u.uy]; otmp; otmp = otmp2) { otmp2 = otmp->nexthere; 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); } } break; case MEAT_RING: /* Not the same as aggravate monster; besides, it's obvious. */ pline("Several flies buzz around the sink."); break; default: ideed = FALSE; break; } if(!Blind && !ideed && obj->otyp != RIN_HUNGER) { ideed = TRUE; switch(obj->otyp) { /* effects that need eyes */ case RIN_ADORNMENT: pline_The("faucets flash brightly for a moment."); break; case RIN_REGENERATION: pline_The("sink looks as good as new."); break; case RIN_INVISIBILITY: You("don't see anything happen to the sink."); break; case RIN_FREE_ACTION: You("see the ring slide right down the drain!"); break; case RIN_SEE_INVISIBLE: You("see some air in the sink."); break; case RIN_STEALTH: pline_The("sink seems to blend into the floor for a moment."); break; case RIN_FIRE_RESISTANCE: pline_The("hot water faucet flashes brightly for a moment."); break; case RIN_COLD_RESISTANCE: pline_The("cold water faucet flashes brightly for a moment."); break; case RIN_PROTECTION_FROM_SHAPE_CHAN: pline_The("sink looks nothing like a fountain."); break; case RIN_PROTECTION: pline_The("sink glows %s for a moment.", hcolor((obj->spe<0) ? NH_BLACK : NH_SILVER)); break; case RIN_WARNING: pline_The("sink glows %s for a moment.", hcolor(NH_WHITE)); break; case RIN_MOOD: pline_The("sink looks groovy."); break; case RIN_TELEPORTATION: pline_The("sink momentarily vanishes."); break; case RIN_TELEPORT_CONTROL: pline_The("sink looks like it is being beamed aboard somewhere."); break; case RIN_POLYMORPH: pline_The("sink momentarily looks like a fountain."); break; case RIN_POLYMORPH_CONTROL: pline_The("sink momentarily looks like a regularly erupting geyser."); break; } } if(ideed) trycall(obj); else You_hear("the ring bouncing down the drainpipe."); if (!rn2(20)) { pline_The("sink backs up, leaving %s.", doname(obj)); obj->in_use = FALSE; dropx(obj); } else useup(obj); } #endif #endif /* OVLB */ #ifdef OVL0 /* some common tests when trying to drop or throw items */ boolean canletgo(obj,word) register struct obj *obj; register const char *word; { if(obj->owornmask & (W_ARMOR | W_RING | W_AMUL | W_TOOL)){ if (*word) Norep("You cannot %s %s you are wearing.",word, something); return(FALSE); } /* KMH, balance patch -- removed stone of rotting */ if (obj->otyp == LOADSTONE && obj->cursed) { /* getobj() kludge sets corpsenm to user's specified count when refusing to split a stack of cursed loadstones */ if (*word) { /* getobj() ignores a count for throwing since that is implicitly forced to be 1; replicate its kludge... */ if (!strcmp(word, "throw") && obj->quan > 1L) obj->corpsenm = 1; pline("For some reason, you cannot %s%s the stone%s!", word, obj->corpsenm ? " any of" : "", plur(obj->quan)); } obj->corpsenm = 0; /* reset */ obj->bknown = 1; return(FALSE); } if (obj->otyp == LEASH && obj->leashmon != 0) { if (*word) pline_The("leash is tied around your %s.", body_part(HAND)); return(FALSE); } #ifdef STEED if (obj->owornmask & W_SADDLE) { if (*word) You("cannot %s %s you are sitting on.", word, something); return (FALSE); } #endif return(TRUE); } STATIC_PTR int drop(obj) register struct obj *obj; { if(!obj) return(0); if(!canletgo(obj,"drop")) return(0); if(obj == uwep) { if(welded(uwep)) { weldmsg(obj); return(0); } setuwep((struct obj *)0, FALSE); } if (obj == uswapwep) { setuswapwep((struct obj *)0, FALSE); } if(obj == uquiver) { setuqwep((struct obj *)0); } 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) && IS_SINK(levl[u.ux][u.uy].typ)) { dosinkring(obj); return(1); } #endif if (!can_reach_floor()) { if(flags.verbose) You("drop %s.", doname(obj)); #ifndef GOLDOBJ if (obj->oclass != COIN_CLASS || obj == invent) freeinv(obj); #else /* Ensure update when we drop gold objects */ if (obj->oclass == COIN_CLASS) flags.botl = 1; freeinv(obj); #endif hitfloor(obj); return(1); } if (!IS_ALTAR(levl[u.ux][u.uy].typ) && flags.verbose) You("drop %s.", doname(obj)); } dropx(obj); return(1); } /* Called in several places - may produce output */ /* eg ship_object() and dropy() -> sellobj() both produce output */ void dropx(obj) register struct obj *obj; { #ifndef GOLDOBJ if (obj->oclass != COIN_CLASS || obj == invent) freeinv(obj); #else /* Ensure update when we drop gold objects */ if (obj->oclass == COIN_CLASS) flags.botl = 1; freeinv(obj); #endif if (!u.uswallow) { if (ship_object(obj, u.ux, u.uy, FALSE)) return; if (IS_ALTAR(levl[u.ux][u.uy].typ)) doaltarobj(obj); /* set bknown */ } dropy(obj); } void dropy(obj) register struct obj *obj; { if (obj == uwep) setuwep((struct obj *)0, FALSE); if (obj == uquiver) setuqwep((struct obj *)0); if (obj == uswapwep) setuswapwep((struct obj *)0, FALSE); 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 = FALSE; boolean could_poly = FALSE; boolean could_slime = FALSE; boolean could_grow = FALSE; boolean could_heal = FALSE; if (obj != uball) { /* mon doesn't pick up ball */ if (obj->otyp == CORPSE) { could_petrify = touch_petrifies(&mons[obj->corpsenm]); could_poly = polyfodder(obj); could_slime = (obj->corpsenm == PM_GREEN_SLIME); could_grow = (obj->corpsenm == PM_WRAITH); could_heal = (obj->corpsenm == PM_NURSE); } (void) mpickobj(u.ustuck,obj); if (is_animal(u.ustuck->data)) { if (could_poly || could_slime) { (void) newcham(u.ustuck, could_poly ? (struct permonst *)0 : &mons[PM_GREEN_SLIME], FALSE, could_slime); delobj(obj); /* corpse is digested */ } else if (could_petrify) { minstapetrify(u.ustuck, TRUE); /* Don't leave a cockatrice corpse in a statue */ if (!u.uswallow) delobj(obj); } else if (could_grow) { (void) grow_up(u.ustuck, (struct monst *)0); delobj(obj); /* corpse is digested */ } else if (could_heal) { u.ustuck->mhp = u.ustuck->mhpmax; delobj(obj); /* corpse is digested */ } } } } 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; } } /* 'D' command: drop several things */ int doddrop() { 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; } /* Drop things from the hero's inventory, using a menu. */ STATIC_OVL int menu_drop(retry) int retry; { 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. */ u_gold = mkgoldobj(u.ugold); /* removes from u.ugold */ u_gold->in_use = TRUE; u.ugold = u_gold->quan; /* put the gold back */ assigninvlet(u_gold); /* might end up as NOINVSYM */ 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++) { if (pick_list[i].item.a_int == ALL_TYPES_SELECTED) all_categories = TRUE; else if (pick_list[i].item.a_int == 'A') drop_everything = TRUE; else add_valid_menu_class(pick_list[i].item.a_int); } 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) { for(otmp = invent; otmp; otmp = otmp2) { otmp2 = otmp->nobj; n_dropped += drop(otmp); } } else { /* should coordinate with perm invent, maybe not show worn items */ n = query_objlist("What would you like to drop?", invent, USE_INVLET|INVORDER_SORT, &pick_list, PICK_ANY, all_categories ? allow_all : allow_category); if (n > 0) { for (i = 0; i < n; i++) { otmp = pick_list[i].item.a_obj; cnt = pick_list[i].count; if (cnt < otmp->quan) { if (welded(otmp)) { ; /* don't split */ } else if (otmp->otyp == LOADSTONE && otmp->cursed) { /* same kludge as getobj(), for canletgo()'s use */ otmp->corpsenm = (int) cnt; /* don't split */ } else { #ifndef GOLDOBJ if (otmp->oclass == COIN_CLASS) (void) splitobj(otmp, otmp->quan - cnt); else #endif otmp = splitobj(otmp, cnt); } } n_dropped += drop(otmp); } free((genericptr_t) pick_list); } } drop_done: #ifndef GOLDOBJ if (u_gold && invent && invent->oclass == COIN_CLASS) { /* didn't drop [all of] it */ u_gold = invent; invent = u_gold->nobj; u_gold->in_use = FALSE; dealloc_obj(u_gold); update_inventory(); } #endif return n_dropped; } #endif /* OVL0 */ #ifdef OVL2 /* on a ladder, used in goto_level */ static NEARDATA boolean at_ladder = FALSE; int dodown() { struct trap *trap = 0; boolean stairs_down = ((u.ux == xdnstair && u.uy == ydnstair) || (u.ux == sstairs.sx && u.uy == sstairs.sy && !sstairs.up)), ladder_down = (u.ux == xdnladder && u.uy == ydnladder); if (Role_if(PM_GNOME) && on_level(&mineend_level,&u.uz)) { pline("The staircase is filled with tons of rubble and debris."); pline("Poor Ruggo!"); 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 (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)); return (0); /* didn't move */ } if (!stairs_down && !ladder_down) { if (!(trap = t_at(u.ux,u.uy)) || (trap->ttyp != TRAPDOOR && trap->ttyp != HOLE) || !Can_fall_thru(&u.uz) || !trap->tseen) { if (flags.autodig && !flags.nopick && uwep && is_pick(uwep)) { return use_pick_axe2(uwep); } else { You_cant("go down here."); return(0); } } } 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) { You("are standing at the gate to Gehennom."); pline("Unspeakable cruelty and harm lurk down there."); if (yn("Are you sure you want to enter?") != 'y') return(0); else pline("So be it."); u.uevent.gehennom_entered = 1; /* don't ask again */ } if(!next_to_u()) { You("are held back by your pet!"); return(0); } if (trap) You("%s %s.", locomotion(youmonst.data, "jump"), trap->ttyp == HOLE ? "down the hole" : "through the trap door"); if (trap && Is_stronghold(&u.uz)) { goto_hell(FALSE, TRUE); } else { at_ladder = (boolean) (levl[u.ux][u.uy].typ == LADDER); next_level(!trap); at_ladder = FALSE; } return(1); } int doup() { if( (u.ux != xupstair || u.uy != yupstair) && (!xupladder || u.ux != xupladder || u.uy != yupladder) && (!sstairs.sx || u.ux != sstairs.sx || u.uy != sstairs.sy || !sstairs.up) ) { 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) { /* No levitation check; inv_weight() already allows for it */ Your("load is too heavy to climb the %s.", levl[u.ux][u.uy].typ == STAIRS ? "stairs" : "ladder"); return(1); } if(ledger_no(&u.uz) == 1) { if (yn("Beware, there will be no return! Still climb?") != 'y') return(0); } if(!next_to_u()) { You("are held back by your pet!"); return(0); } at_ladder = (boolean) (levl[u.ux][u.uy].typ == LADDER); prev_level(TRUE); at_ladder = FALSE; return(1); } d_level save_dlevel = {0, 0}; /* check that we can write out the current level */ STATIC_OVL int currentlevel_rewrite() { register int fd; char whynot[BUFSZ]; /* since level change might be a bit slow, flush any buffered screen * output (like "you fall through a trap door") */ mark_synch(); fd = create_levelfile(ledger_no(&u.uz), whynot); if (fd < 0) { /* * This is not quite impossible: e.g., we may have * exceeded our quota. If that is the case then we * cannot leave this level, and cannot save either. * Another possibility is that the directory was not * writable. */ pline("%s", whynot); return -1; } #ifdef MFLOPPY if (!savelev(fd, ledger_no(&u.uz), COUNT_SAVE)) { (void) close(fd); delete_levelfile(ledger_no(&u.uz)); pline("Slash'EM is out of disk space for making levels!"); You("can save, quit, or continue playing."); return -1; } #endif return fd; } #ifdef INSURANCE void save_currentstate() { int fd; if (flags.ins_chkpt) { /* write out just-attained level, with pets and everything */ fd = currentlevel_rewrite(); if(fd < 0) return; bufon(fd); savelev(fd,ledger_no(&u.uz), WRITE_SAVE); bclose(fd); } /* write out non-level state */ savestateinlock(); } #endif /* static boolean badspot(x, y) register xchar x, y; { return((levl[x][y].typ != ROOM && levl[x][y].typ != AIR && levl[x][y].typ != CORR) || MON_AT(x, y)); } */ #ifdef BLACKMARKET d_level new_dlevel = {0, 0}; #endif void goto_level(newlevel, at_stairs, falling, portal) d_level *newlevel; boolean at_stairs, falling, portal; { int fd, l_idx; xchar new_ledger; boolean cant_go_back, up = (depth(newlevel) < depth(&u.uz)), newdungeon = (u.uz.dnum != newlevel->dnum), was_in_W_tower = In_W_tower(u.ux, u.uy, &u.uz), familiar = FALSE; boolean new = FALSE; /* made a new level? */ struct monst *mtmp; char whynot[BUFSZ]; if (dunlev(newlevel) > dunlevs_in_dungeon(newlevel)) newlevel->dlevel = dunlevs_in_dungeon(newlevel); if (newdungeon && In_endgame(newlevel)) { /* 1st Endgame Level !!! */ if (u.uhave.amulet) assign_level(newlevel, &earth_level); else return; } new_ledger = ledger_no(newlevel); if (new_ledger <= 0) done(ESCAPED); /* in fact < 0 is impossible */ #ifdef BLACKMARKET assign_level(&new_dlevel, newlevel); #endif /* If you have the amulet and are trying to get out of Gehennom, going * up a set of stairs sometimes does some very strange things! * Biased against law and towards chaos, but not nearly as strongly * as it used to be (prior to 3.2.0). * Odds: old new * "up" L N C "up" L N C * +1 75.0 75.0 75.0 +1 75.0 75.0 75.0 * 0 0.0 12.5 25.0 0 6.25 8.33 12.5 * -1 8.33 4.17 0.0 -1 6.25 8.33 12.5 * -2 8.33 4.17 0.0 -2 6.25 8.33 0.0 * -3 8.33 4.17 0.0 -3 6.25 0.0 0.0 * [Tom] I removed this... it's indescribably annoying. * * if (Inhell && up && u.uhave.amulet && !newdungeon && !portal && * (dunlev(&u.uz) < dunlevs_in_dungeon(&u.uz)-3)) { * if (!rn2(4)) { * int odds = 3 + (int)u.ualign.type, * 2..4 * * diff = odds <= 1 ? 0 : rn2(odds); * paranoia * * * if (diff != 0) { * assign_rnd_level(newlevel, &u.uz, diff); * * if inside the tower, stay inside * * if (was_in_W_tower && * !On_W_tower_level(newlevel)) diff = 0; * } * if (diff == 0) * assign_level(newlevel, &u.uz); * * new_ledger = ledger_no(newlevel); * * pline("A mysterious force momentarily surrounds you..."); * if (on_level(newlevel, &u.uz)) { * (void) safe_teleds(FALSE); * (void) next_to_u(); * return; * } else * at_stairs = at_ladder = FALSE; * } }*/ /* Prevent the player from going past the first quest level unless * (s)he has been given the go-ahead by the leader. */ if (on_level(&u.uz, &qstart_level) && !newdungeon && !ok_to_quest()) { pline("A mysterious force prevents you from descending."); return; } if (on_level(newlevel, &u.uz)) return; /* this can happen */ fd = currentlevel_rewrite(); if (fd < 0) return; if (falling) /* assuming this is only trap door or hole */ impact_drop((struct obj *)0, u.ux, u.uy, newlevel->dlevel); check_special_room(TRUE); /* probably was a trap door */ if (Punished) unplacebc(); u.utrap = 0; /* needed in level_tele */ fill_pit(u.ux, u.uy); setustuck(0); /* idem */ u.uinwater = 0; u.uundetected = 0; /* not hidden, even if means are available */ keepdogs(FALSE); if (u.uswallow) /* idem */ u.uswldtim = u.uswallow = 0; /* * We no longer see anything on the level. Make sure that this * follows u.uswallow set to null since uswallow overrides all * normal vision. */ vision_recalc(2); /* * Save the level we're leaving. If we're entering the endgame, * we can get rid of all existing levels because they cannot be * reached any more. We still need to use savelev()'s cleanup * for the level being left, to recover dynamic memory in use and * to avoid dangling timers and light sources. */ cant_go_back = (newdungeon && In_endgame(newlevel)); if (!cant_go_back) { update_mlstmv(); /* current monsters are becoming inactive */ bufon(fd); /* use buffered output */ } savelev(fd, ledger_no(&u.uz), cant_go_back ? FREE_SAVE : (WRITE_SAVE | FREE_SAVE)); bclose(fd); if (cant_go_back) { /* discard unreachable levels; keep #0 */ for (l_idx = maxledgerno(); l_idx > 0; --l_idx) delete_levelfile(l_idx); } #ifdef REINCARNATION if (Is_rogue_level(newlevel) || Is_rogue_level(&u.uz)) assign_rogue_graphics(Is_rogue_level(newlevel)); #endif #ifdef USE_TILES substitute_tiles(newlevel); #endif assign_level(&u.uz0, &u.uz); assign_level(&u.uz, newlevel); assign_level(&u.utolev, newlevel); u.utotype = 0; if (dunlev_reached(&u.uz) < dunlev(&u.uz)) dunlev_reached(&u.uz) = dunlev(&u.uz); reset_rndmonst(NON_PM); /* u.uz change affects monster generation */ /* set default level change destination areas */ /* the special level code may override these */ (void) memset((genericptr_t) &updest, 0, sizeof updest); (void) memset((genericptr_t) &dndest, 0, sizeof dndest); if (!(level_info[new_ledger].flags & LFILE_EXISTS)) { /* entering this level for first time; make it now */ if (level_info[new_ledger].flags & (FORGOTTEN|VISITED)) { impossible("goto_level: returning to discarded level?"); level_info[new_ledger].flags &= ~(FORGOTTEN|VISITED); } mklev(); new = TRUE; /* made the level */ } else { /* returning to previously visited level; reload it */ fd = open_levelfile(new_ledger, whynot); if (fd < 0) { pline("%s", whynot); pline("Probably someone removed it."); killer = whynot; done(TRICKED); /* we'll reach here if running in wizard mode */ error("Cannot continue this game."); } minit(); /* ZEROCOMP */ getlev(fd, hackpid, new_ledger, FALSE); (void) close(fd); } #ifdef ALLEG_FX if (iflags.usealleg) nh_fade_out(portal); #endif /* do this prior to level-change pline messages */ vision_reset(); /* clear old level's line-of-sight */ vision_full_recalc = 0; /* don't let that reenable vision yet */ flush_screen(-1); /* ensure all map flushes are postponed */ if (portal && !In_endgame(&u.uz)) { /* find the portal on the new level */ register struct trap *ttrap; for (ttrap = ftrap; ttrap; ttrap = ttrap->ntrap) if (ttrap->ttyp == MAGIC_PORTAL) break; if (!ttrap) panic("goto_level: no corresponding portal!"); seetrap(ttrap); u_on_newpos(ttrap->tx, ttrap->ty); } else if (at_stairs && !In_endgame(&u.uz)) { if (up) { if (at_ladder) { u_on_newpos(xdnladder, ydnladder); } else { if (newdungeon) { if (Is_stronghold(&u.uz)) { register xchar x, y; do { x = (COLNO - 2 - rnd(5)); y = rn1(ROWNO - 4, 3); } while(occupied(x, y) || IS_WALL(levl[x][y].typ)); u_on_newpos(x, y); } else u_on_sstairs(); } else u_on_dnstairs(); } /* Remove bug which crashes with levitation/punishment KAA */ if (Punished && !Levitation) { pline("With great effort you climb the %s.", at_ladder ? "ladder" : "stairs"); } else if (at_ladder) You("climb up the ladder."); } else { /* down */ if (at_ladder) { u_on_newpos(xupladder, yupladder); } else { if (newdungeon) u_on_sstairs(); else u_on_upstairs(); } if (u.dz && Flying) You("fly down along the %s.", at_ladder ? "ladder" : "stairs"); else if (u.dz && (near_capacity() > UNENCUMBERED || Punished || Fumbling)) { You("fall down the %s.", at_ladder ? "ladder" : "stairs"); if (Punished) { drag_down(); if (carried(uball)) { if (uswapwep == uball) setuswapwep((struct obj *)0, FALSE); if (uquiver == uball) setuqwep((struct obj *)0); if (uwep == uball) setuwep((struct obj *)0, FALSE); freeinv(uball); } } #ifdef STEED /* falling off steed has its own losehp() call */ if (u.usteed) dismount_steed(DISMOUNT_FELL); else #endif losehp(rnd(3), "falling downstairs", KILLED_BY); selftouch("Falling, you"); } else if (u.dz && at_ladder) You("climb down the ladder."); } } else { /* trap door or level_tele or In_endgame */ if (was_in_W_tower && On_W_tower_level(&u.uz)) /* Stay inside the Wizard's tower when feasible. */ /* Note: up vs down doesn't really matter in this case. */ place_lregion(dndest.nlx, dndest.nly, dndest.nhx, dndest.nhy, 0,0, 0,0, LR_DOWNTELE, (d_level *) 0); else if (up) place_lregion(updest.lx, updest.ly, updest.hx, updest.hy, updest.nlx, updest.nly, updest.nhx, updest.nhy, LR_UPTELE, (d_level *) 0); else place_lregion(dndest.lx, dndest.ly, dndest.hx, dndest.hy, dndest.nlx, dndest.nly, dndest.nhx, dndest.nhy, LR_DOWNTELE, (d_level *) 0); if (falling) { if (Punished) ballfall(); selftouch("Falling, you"); } } if (Punished) placebc(); obj_delivery(); /* before killing geno'd monsters' eggs */ losedogs(); kill_genocided_monsters(); /* for those wiped out while in limbo */ /* * Expire all timers that have gone off while away. Must be * after migrating monsters and objects are delivered * (losedogs and obj_delivery). */ run_timers(); initrack(); if ((mtmp = m_at(u.ux, u.uy)) != 0 #ifdef STEED && mtmp != u.usteed #endif ) { /* There's a monster at your target destination; it might be one which accompanied you--see mon_arrive(dogmove.c)--or perhaps it was already here. Randomly move you to an adjacent spot or else the monster to any nearby location. Prior to 3.3.0 the latter was done unconditionally. */ coord cc; if (!rn2(2) && enexto(&cc, u.ux, u.uy, youmonst.data) && distu(cc.x, cc.y) <= 2) u_on_newpos(cc.x, cc.y); /*[maybe give message here?]*/ else mnexto(mtmp); if ((mtmp = m_at(u.ux, u.uy)) != 0) { impossible("mnexto failed (do.c)?"); (void) rloc(mtmp, FALSE); } } /* initial movement of bubbles just before vision_recalc */ if (Is_waterlevel(&u.uz)) movebubbles(); if (level_info[new_ledger].flags & FORGOTTEN) { forget_map(ALL_MAP); /* forget the map */ forget_traps(); /* forget all traps too */ familiar = TRUE; level_info[new_ledger].flags &= ~FORGOTTEN; } /* Reset the screen. */ vision_reset(); /* reset the blockages */ docrt(); /* does a full vision recalc */ flush_screen(-1); #ifdef ALLEG_FX if (iflags.usealleg) nh_fade_in(portal); #endif /* * Move all plines beyond the screen reset. */ /* give room entrance message, if any */ check_special_room(FALSE); /* Check whether we just entered Gehennom. */ if (!In_hell(&u.uz0) && Inhell) { if (Is_valley(&u.uz)) { You("arrive at the Valley of the Dead..."); pline_The("odor of burnt flesh and decay pervades the air."); #ifdef MICRO display_nhwindow(WIN_MESSAGE, FALSE); #endif You_hear("groans and moans everywhere."); } else pline("It is hot here. You smell smoke..."); } if (familiar) { static const char * const 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 * const 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); } #ifdef REINCARNATION if (new && Is_rogue_level(&u.uz)) You("enter what seems to be an older, more primitive world."); #endif /* Final confrontation */ if (In_endgame(&u.uz) && newdungeon && u.uhave.amulet) resurrect(); if (newdungeon && In_V_tower(&u.uz) && In_hell(&u.uz0)) pline_The("heat and smoke are gone."); /* 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); } else { com_pager(2); u.uevent.qcalled = TRUE; } } /* once Croesus is dead, his alarm doesn't work any more */ if (Is_knox(&u.uz) && (new || !mvitals[PM_CROESUS].died)) { You("penetrated a high security area!"); pline("An alarm sounds!"); for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) if (!DEADMONSTER(mtmp) && mtmp->msleeping) mtmp->msleeping = 0; } if (on_level(&u.uz, &astral_level)) final_level(); else onquest(); assign_level(&u.uz0, &u.uz); /* reset u.uz0 */ #ifdef INSURANCE save_currentstate(); #endif /* assume this will always return TRUE when changing level */ (void) in_out_region(u.ux, u.uy); (void) pickup(1); } STATIC_OVL void final_level() { struct monst *mtmp; struct obj *otmp; coord mm; int i; /* reset monster hostility relative to player */ for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) if (!DEADMONSTER(mtmp)) reset_hostility(mtmp); /* create some player-monsters */ create_mplayers(rn1(4, 3), TRUE); /* create a guardian angel next to player, if worthy */ if (Conflict) { pline( "A voice booms: \"Thy desire for conflict shall be fulfilled!\""); for (i = rnd(4); i > 0; --i) { mm.x = u.ux; mm.y = u.uy; if(enexto(&mm, mm.x, mm.y, &mons[PM_ANGEL])) (void) mk_roamer(&mons[PM_ANGEL], u.ualign.type, mm.x, mm.y, FALSE); } } else if (u.ualign.record > 8) { /* fervent */ pline("A voice whispers: \"Thou hast been worthy of me!\""); mm.x = u.ux; mm.y = u.uy; if (enexto(&mm, mm.x, mm.y, &mons[PM_ANGEL])) { if ((mtmp = mk_roamer(&mons[PM_ANGEL], u.ualign.type, mm.x, mm.y, TRUE)) != 0) { if (!Blind) pline("An angel appears near you."); else You_feel("the presence of a friendly angel near you."); /* guardian angel -- the one case mtame doesn't * imply an edog structure, so we don't want to * call tamedog(). */ mtmp->mtame = 10; /* make him strong enough vs. endgame foes */ mtmp->m_lev = rn1(8,15); mtmp->mhp = mtmp->mhpmax = d((int)mtmp->m_lev,10) + 30 + rnd(30); if ((otmp = select_hwep(mtmp)) == 0) { otmp = mksobj(SILVER_SABER, FALSE, FALSE); if (mpickobj(mtmp, otmp)) panic("merged weapon?"); } bless(otmp); if (otmp->spe < 4) otmp->spe += rnd(4); if ((otmp = which_armor(mtmp, W_ARMS)) == 0 || otmp->otyp != SHIELD_OF_REFLECTION) { (void) mongets(mtmp, AMULET_OF_REFLECTION); m_dowear(mtmp, TRUE); } } } } } static char *dfr_pre_msg = 0, /* pline() before level change */ *dfr_post_msg = 0; /* pline() after level change */ /* change levels at the end of this turn, after monsters finish moving */ void schedule_goto(tolev, at_stairs, falling, portal_flag, pre_msg, post_msg) d_level *tolev; boolean at_stairs, falling; int portal_flag; const char *pre_msg, *post_msg; { int typmask = 0100; /* non-zero triggers `deferred_goto' */ /* destination flags (`goto_level' args) */ if (at_stairs) typmask |= 1; if (falling) typmask |= 2; if (portal_flag) typmask |= 4; if (portal_flag < 0) typmask |= 0200; /* flag for portal removal */ u.utotype = typmask; /* destination level */ assign_level(&u.utolev, tolev); if (pre_msg) dfr_pre_msg = strcpy((char *)alloc(strlen(pre_msg) + 1), pre_msg); if (post_msg) dfr_post_msg = strcpy((char *)alloc(strlen(post_msg)+1), post_msg); } /* handle something like portal ejection */ void deferred_goto() { if (!on_level(&u.uz, &u.utolev)) { d_level dest; int typmask = u.utotype; /* save it; goto_level zeroes u.utotype */ assign_level(&dest, &u.utolev); if (dfr_pre_msg) pline(dfr_pre_msg); goto_level(&dest, !!(typmask&1), !!(typmask&2), !!(typmask&4)); if (typmask & 0200) { /* remove portal */ struct trap *t = t_at(u.ux, u.uy); if (t) { deltrap(t); newsym(u.ux, u.uy); } } if (dfr_post_msg) pline(dfr_post_msg); } u.utotype = 0; /* our caller keys off of this */ if (dfr_pre_msg) free((genericptr_t)dfr_pre_msg), dfr_pre_msg = 0; if (dfr_post_msg) free((genericptr_t)dfr_post_msg), dfr_post_msg = 0; } #endif /* OVL2 */ #ifdef OVL3 /* * Return TRUE if we created a monster for the corpse. If successful, the * corpse is gone. */ boolean revive_corpse(corpse, moldy) struct obj *corpse; boolean moldy; { struct monst *mtmp, *mcarry; 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 && quan == 1 */ if (mtmp) { /* * [ALI] Override revive's HP calculation. The HP that a mold starts * with do not depend on the HP of the monster whose corpse it grew on. */ if (moldy) mtmp->mhp = mtmp->mhpmax; chewed = !moldy && (mtmp->mhp < mtmp->mhpmax); if (chewed) cname = cname_buf; /* include "bite-covered" prefix */ switch (where) { case OBJ_INVENT: if (is_uwep) { if (moldy) { Your("weapon goes moldy."); pline("%s writhes out of your grasp!", Monnam(mtmp)); } else pline_The("%s writhes out of your grasp!", cname); } else You_feel("squirming in your backpack!"); break; case OBJ_FLOOR: if (cansee(mtmp->mx, mtmp->my)) { if (moldy) pline("%s grows on a moldy corpse!", Amonnam(mtmp)); else pline("%s rises from the dead!", chewed ? Adjmonnam(mtmp, "bite-covered") : Monnam(mtmp)); } break; case OBJ_MINVENT: /* probably a nymph's */ if (cansee(mtmp->mx, mtmp->my)) { if (canseemon(mcarry)) pline("Startled, %s drops %s as it %s!", mon_nam(mcarry), moldy ? "a corpse" : an(cname), moldy ? "goes moldy" : "revives"); else pline("%s suddenly appears!", chewed ? 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 %ss 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); break; } return TRUE; } return FALSE; } /* Revive the corpse via a timeout. */ /*ARGSUSED*/ void revive_mon(arg, timeout) genericptr_t arg; long timeout; { #if defined(MAC_MPW) # pragma unused ( timeout ) #endif struct obj *body = (struct obj *) arg; /* if we succeed, the corpse is gone, otherwise, rot it away */ if (!revive_corpse(body, FALSE)) { if (is_rider(&mons[body->corpsenm])) You_feel("less hassled."); (void) start_timer(250L - (monstermoves-body->age), TIMER_OBJECT, ROT_CORPSE, arg); } } /* Revive the corpse as a mold via a timeout. */ /*ARGSUSED*/ void moldy_corpse(arg, timeout) genericptr_t arg; long timeout; { int pmtype, oldtyp, oldquan, oldnamelth; struct obj *body = (struct obj *) arg; /* Turn the corpse into a mold corpse if molds are available */ oldtyp = body->corpsenm; oldnamelth = body->onamelth; /* Weight towards non-motile fungi. */ pmtype = pm_mkclass(S_FUNGUS, 0); if ((pmtype != -1) && (mons[pmtype].mmove)) pmtype = pm_mkclass(S_FUNGUS, 0); /* [ALI] Molds don't grow in adverse conditions. If it ever * becomes possible for molds to grow in containers we should * check for iceboxes here as well. */ if ((body->where == OBJ_FLOOR || body->where==OBJ_BURIED) && (is_pool(body->ox, body->oy) || is_lava(body->ox, body->oy) || is_ice(body->ox, body->oy))) pmtype = -1; if (pmtype != -1) { /* We don't want special case revivals */ if (cant_create(&pmtype, TRUE) || (body->oxlth && (body->oattached == OATTACHED_MONST))) pmtype = -1; /* cantcreate might have changed it so change it back */ else { body->corpsenm = pmtype; body->onamelth = 0; /* Molds shouldn't be named */ /* oeaten isn't used for hp calc here, and zeroing it * prevents eaten_stat() from worrying when you've eaten more * from the corpse than the newly grown mold's nutrition * value. */ body->oeaten = 0; /* [ALI] If we allow revive_corpse() to get rid of revived * corpses from hero's inventory then we run into problems * with unpaid corpses. */ if (body->where == OBJ_INVENT) body->quan++; oldquan = body->quan; if (revive_corpse(body, TRUE)) { if (oldquan != 1) { /* Corpse still valid */ body->corpsenm = oldtyp; if (body->where == OBJ_INVENT) { useup(body); oldquan--; } } if (oldquan == 1) body = (struct obj *)0; /* Corpse gone */ } } } /* If revive_corpse succeeds, it handles the reviving corpse. * If there was more than one corpse, or the revive failed, * set the remaining corpse(s) to rot away normally. * Revive_corpse handles genocides */ if (body) { body->corpsenm = oldtyp; /* Fixup corpse after (attempted) revival */ body->onamelth = oldnamelth; body->owt = weight(body); (void) start_timer(250L - (monstermoves-peek_at_iced_corpse_age(body)), TIMER_OBJECT, ROT_CORPSE, arg); } } int donull() { return(1); /* Do nothing, but let other things happen */ } #endif /* OVL3 */ #ifdef OVLB STATIC_PTR int wipeoff() { if(u.ucreamed < 4) u.ucreamed = 0; else u.ucreamed -= 4; if (Blinded < 4) Blinded = 0; else Blinded -= 4; if (!Blinded) { pline("You've got the glop off."); u.ucreamed = 0; Blinded = 1; make_blinded(0L,TRUE); return(0); } else if (!u.ucreamed) { Your("%s feels clean now.", body_part(FACE)); return(0); } return(1); /* still busy */ } int dowipe() { if(u.ucreamed) { static NEARDATA char buf[39]; Sprintf(buf, "wiping off your %s", body_part(FACE)); set_occupation(wipeoff, buf, 0); /* Not totally correct; what if they change back after now * but before they're finished wiping? */ return(1); } Your("%s is already clean.", body_part(FACE)); return(1); } void set_wounded_legs(side, timex) register long side; register int timex; { /* KMH -- STEED * If you are riding, your steed gets the wounded legs instead. * You still call this function, but don't lose hp. * Caller is also responsible for adjusting messages. */ if(!Wounded_legs) { ATEMP(A_DEX)--; flags.botl = 1; } /* KMH, intrinsics patch */ if(!Wounded_legs || (HWounded_legs & TIMEOUT)) HWounded_legs = timex; EWounded_legs = side; (void)encumber_msg(); } void heal_legs() { if(Wounded_legs) { if (ATEMP(A_DEX) < 0) { ATEMP(A_DEX)++; flags.botl = 1; } #ifdef STEED if (!u.usteed) #endif { /* KMH, intrinsics patch */ if((EWounded_legs & BOTH_SIDES) == BOTH_SIDES) { Your("%s feel somewhat better.", makeplural(body_part(LEG))); } else { Your("%s feels somewhat better.", body_part(LEG)); } } HWounded_legs = EWounded_legs = 0; } (void)encumber_msg(); } #endif /* OVLB */ /*do.c*/ slashem-0.0.7E7F3/src/version.c0000664000076400007640000000732610545462317014304 0ustar aliali/* SCCS Id: @(#)version.c 3.4 2003/12/06 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" #include "date.h" /* * All the references to the contents of patchlevel.h have been moved * into makedefs.... */ #ifdef SHORT_FILENAMES #include "patchlev.h" #else #include "patchlevel.h" #endif /* #define BETA_INFO "" */ /* "[ beta n]" */ /* fill buffer with short version (so caller can avoid including date.h) */ char * version_string(buf) char *buf; { return strcpy(buf, VERSION_STRING); } /* fill and return the given buffer with the long nethack version string */ char * getversionstring(buf) char *buf; { Strcpy(buf, VERSION_ID); #if defined(BETA) && defined(BETA_INFO) Sprintf(eos(buf), " %s", BETA_INFO); #endif #if defined(RUNTIME_PORT_ID) append_port_id(buf); #endif return buf; } int doversion() { char buf[BUFSZ]; pline("%s", getversionstring(buf)); return 0; } int doextversion() { display_file_area(NH_OPTIONS_USED_AREA, NH_OPTIONS_USED, TRUE); return 0; } #ifdef MICRO boolean comp_times(filetime) long filetime; { return((boolean)(filetime < BUILD_TIME)); } #endif boolean check_version(version_data, filename, complain) struct version_info *version_data; const char *filename; boolean complain; { if ( #ifdef VERSION_COMPATIBILITY version_data->incarnation < VERSION_COMPATIBILITY || version_data->incarnation > VERSION_NUMBER #else version_data->incarnation != VERSION_NUMBER #endif ) { if (complain) pline("Version mismatch for file \"%s\".", filename); return FALSE; } else if ( #ifndef IGNORED_FEATURES version_data->feature_set != VERSION_FEATURES || #else (version_data->feature_set & ~IGNORED_FEATURES) != (VERSION_FEATURES & ~IGNORED_FEATURES) || #endif version_data->entity_count != VERSION_SANITY1 || version_data->struct_sizes != VERSION_SANITY2) { if (complain) pline("Configuration incompatibility for file \"%s\".", filename); return FALSE; } return TRUE; } /* this used to be based on file date and somewhat OS-dependant, but now examines the initial part of the file's contents */ boolean uptodate(fd, name) int fd; const char *name; { int rlen; struct version_info vers_info; boolean verbose = name ? TRUE : FALSE; rlen = read(fd, (genericptr_t) &vers_info, sizeof vers_info); minit(); /* ZEROCOMP */ if (rlen == 0) { if (verbose) { pline("File \"%s\" is empty?", name); wait_synch(); } return FALSE; } if (!check_version(&vers_info, name, verbose)) { if (verbose) wait_synch(); return FALSE; } return TRUE; } void store_version(fd) int fd; { const static struct version_info version_data = { VERSION_NUMBER, VERSION_FEATURES, VERSION_SANITY1, VERSION_SANITY2 }; bufoff(fd); /* bwrite() before bufon() uses plain write() */ bwrite(fd,(genericptr_t)&version_data,(unsigned)(sizeof version_data)); bufon(fd); return; } #ifdef AMIGA const char amiga_version_string[] = AMIGA_VERSION_STRING; #endif unsigned long get_feature_notice_ver(str) char *str; { char buf[BUFSZ]; int ver_maj, ver_min, patch; char *istr[3]; int j = 0; if (!str) return 0L; str = strcpy(buf, str); istr[j] = str; while (*str) { if (*str == '.') { *str++ = '\0'; j++; istr[j] = str; if (j == 2) break; } else if (index("0123456789", *str) != 0) { str++; } else return 0L; } if (j != 2) return 0L; ver_maj = atoi(istr[0]); ver_min = atoi(istr[1]); patch = atoi(istr[2]); return FEATURE_NOTICE_VER(ver_maj,ver_min,patch); /* macro from hack.h */ } unsigned long get_current_feature_ver() { return FEATURE_NOTICE_VER(VERSION_MAJOR,VERSION_MINOR,PATCHLEVEL); } /*version.c*/ slashem-0.0.7E7F3/src/explode.c0000664000076400007640000007516310545462317014263 0ustar aliali/* SCCS Id: @(#)explode.c 3.4 2002/11/10 */ /* Copyright (C) 1990 by Ken Arromdee */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" #ifdef OVL0 /* ExplodeRegions share some commonalities with NhRegions, but not enough to * make it worth trying to create a common implementation. */ typedef struct { xchar x, y; xchar blast; /* blast symbol */ xchar shielded; /* True if this location is shielded */ } ExplodeLocation; typedef struct { ExplodeLocation *locations; short nlocations, alocations; } ExplodeRegion; STATIC_DCL ExplodeRegion * create_explode_region() { ExplodeRegion *reg; reg = (ExplodeRegion *)alloc(sizeof(ExplodeRegion)); reg->locations = (ExplodeLocation *)0; reg->nlocations = 0; reg->alocations = 0; return reg; } STATIC_DCL void add_location_to_explode_region(reg, x, y) ExplodeRegion *reg; xchar x, y; { int i; ExplodeLocation *new; for(i = 0; i < reg->nlocations; i++) if (reg->locations[i].x == x && reg->locations[i].y == y) return; if (reg->nlocations == reg->alocations) { reg->alocations = reg->alocations ? 2 * reg->alocations : 32; new = (ExplodeLocation *) alloc(reg->alocations * sizeof(ExplodeLocation)); (void) memcpy((genericptr_t)new, (genericptr_t)reg->locations, reg->nlocations * sizeof(ExplodeLocation)); free((genericptr_t)reg->locations); reg->locations = new; } reg->locations[reg->nlocations].x = x; reg->locations[reg->nlocations].y = y; /* reg->locations[reg->nlocations].blast = 0; */ /* reg->locations[reg->nlocations].shielded = 0; */ reg->nlocations++; } STATIC_DCL int compare_explode_location(loc1, loc2) ExplodeLocation *loc1, *loc2; { return loc1->y == loc2->y ? loc1->x - loc2->x : loc1->y - loc2->y; } STATIC_DCL void set_blast_symbols(reg) ExplodeRegion *reg; { int i, j, bitmask; /* The index into the blast symbol array is a bitmask containing 4 bits: * bit 3: True if the location immediately to the north is present * bit 2: True if the location immediately to the south is present * bit 1: True if the location immediately to the east is present * bit 0: True if the location immediately to the west is present */ static int blast_symbols[16] = { S_explode5, S_explode6, S_explode4, S_explode5, S_explode2, S_explode3, S_explode1, S_explode2, S_explode8, S_explode9, S_explode7, S_explode8, S_explode5, S_explode6, S_explode4, S_explode5, }; /* Sort in order of North -> South, West -> East */ qsort(reg->locations, reg->nlocations, sizeof(ExplodeLocation), compare_explode_location); /* Pass 1: Build the bitmasks in the blast field */ for(i = 0; i < reg->nlocations; i++) reg->locations[i].blast = 0; for(i = 0; i < reg->nlocations; i++) { bitmask = 0; if (i && reg->locations[i-1].y == reg->locations[i].y && reg->locations[i-1].x == reg->locations[i].x-1) { reg->locations[i].blast |= 1; /* Location to the west */ reg->locations[i-1].blast |= 2; /* Location to the east */ } for(j = i-1; j >= 0; j--) { if (reg->locations[j].y < reg->locations[i].y-1) break; else if (reg->locations[j].y == reg->locations[i].y-1 && reg->locations[j].x == reg->locations[i].x) { reg->locations[i].blast |= 8; /* Location to the north */ reg->locations[j].blast |= 4; /* Location to the south */ break; } } } /* Pass 2: Set the blast symbols */ for(i = 0; i < reg->nlocations; i++) reg->locations[i].blast = blast_symbols[reg->locations[i].blast]; } STATIC_DCL void free_explode_region(reg) ExplodeRegion *reg; { free((genericptr_t)reg->locations); free((genericptr_t)reg); } /* This is the "do-it-all" explosion command */ STATIC_DCL void FDECL(do_explode, (int,int,ExplodeRegion *,int,int,CHAR_P,int,int,BOOLEAN_P)); /* Note: I had to choose one of three possible kinds of "type" when writing * this function: a wand type (like in zap.c), an adtyp, or an object type. * Wand types get complex because they must be converted to adtyps for * determining such things as fire resistance. Adtyps get complex in that * they don't supply enough information--was it a player or a monster that * did it, and with a wand, spell, or breath weapon? Object types share both * these disadvantages.... * * Explosions derived from vanilla NetHack: * * src nature olet expl Comment * Your wand MAGIC_MISSILE WAND FROSTY Exploding wands of cold * Your wand MAGIC_MISSILE WAND FIERY Exploding wands of fire/ * fireball * Your wand MAGIC_MISSILE WAND MAGICAL Other explosive wands * Your spell FIRE BURNING_OIL FIERY Splattered buring oil * Mon's ? - MON_EXPLODE NOXIOUS Exploding gas spore * Your spell FIRE 0 FIERY Filling a lamp with oil * when lit * Your spell FIRE SCROLL FIERY Reading a scroll of fire * Your spell FIRE WAND FIERY Zap yourself with wand/ * spell of fireball * Your spell FIRE 0 FIERY Your fireball * * Slash'EM specific explosions: * * src nature olet expl Comment * Your spell FIRE WEAPON FIERY Explosive projectile * Your spell FIRE WEAPON FIERY Bolts shot by Hellfire * Mon's spell FIRE FIERY WEAPON Explosive projectile (BUG) * Mon's spell FIRE FIERY WEAPON Bolts shot by Hellfire (BUG) * Your spell MAGIC_MISSILE WAND MAGICAL Spirit bomb technique * Mon's spell FIRE 0 FIERY Monster's fireball * * Sigil of tempest: * * src nature olet expl Comment * Your spell MAGIC_MISSILE 0 MAGICAL Hero casts magic missile * Your spell DEATH 0 MAGICAL Hero casts finger of death * Your spell FIRE 0 FIERY Hero casts fireball * Your spell LIGHTNING 0 FIERY Hero casts lightning * Your spell COLD 0 FROSTY Hero casts cone of cold * Your spell SLEEP 0 NOXIOUS Hero casts sleep * Your spell POISON_GAS 0 NOXIOUS Hero casts poison blast * Your spell ACID 0 NOXIOUS Hero casts acid stream * * Mega spells: * * src nature olet expl Comment * Your mega FIRE 0 FIERY * Your mega COLD 0 FROSTY * Your mega MAGIC_MISSLE 0 MAGICAL * * Notes: * Nature is encoded as (abs(type) % 10) and src is determined using the * following table: * Types Src * -30 - -39 Mon's wand * -20 - -29 Mon's breath * -10 - -19 Mon's spell * -1 - -9 Special * 0 - 9 Your wand * 10 - 19 Your spell * 20 - 29 Your breath * 30 - 39 Your mega * There is only one special type currently defined: * -1 Exploding gas spore */ void explode(x, y, type, dam, olet, expltype) xchar x, y; /* WAC was int...i think it's supposed to be xchar */ int type; /* the same as in zap.c */ int dam; char olet; int expltype; { int i, j; ExplodeRegion *area; area = create_explode_region(); for(i = 0; i < 3; i++) for(j = 0; j < 3; j++) if (isok(i+x-1,j+y-1) && ZAP_POS((&levl[i+x-1][j+y-1])->typ)) add_location_to_explode_region(area, i+x-1, j+y-1); do_explode(x, y, area, type, dam, olet, expltype, 0, !flags.mon_moving); free_explode_region(area); } void do_explode(x, y, area, type, dam, olet, expltype, dest, yours) xchar x, y; /* WAC was int...i think it's supposed to be xchar */ ExplodeRegion *area; int type; /* the same as in zap.c */ int dam; char olet; int expltype; int dest; /* 0 = normal, 1 = silent, 2 = silent/remote */ boolean yours; /* is it your fault (for killing monsters) */ { int i, k, damu = dam; boolean starting = 1; boolean visible, any_shield; int uhurt = 0; /* 0=unhurt, 1=items damaged, 2=you and items damaged */ const char *str; int idamres, idamnonres; struct monst *mtmp; uchar adtyp; boolean explmask; boolean shopdamage = FALSE; boolean generic = FALSE; boolean silent = FALSE, remote = FALSE; xchar xi, yi; if (dest > 0) silent = TRUE; if (dest == 2) remote = TRUE; if (olet == WAND_CLASS) /* retributive strike */ switch (Role_switch) { case PM_PRIEST: /*WAC add Flame, Ice mages, Necromancer */ case PM_FLAME_MAGE: case PM_ICE_MAGE: case PM_NECROMANCER: case PM_WIZARD: damu /= 5; break; case PM_HEALER: case PM_KNIGHT: damu /= 2; break; default: break; } if (olet == MON_EXPLODE) { str = killer; killer = 0; /* set again later as needed */ adtyp = AD_PHYS; } else switch (abs(type) % 10) { case 0: str = "magical blast"; adtyp = AD_MAGM; break; case 1: str = olet == BURNING_OIL ? "burning oil" : olet == SCROLL_CLASS ? "tower of flame" : "fireball"; adtyp = AD_FIRE; break; case 2: str = "ball of cold"; adtyp = AD_COLD; break; /* Assume that wands are death, others are disintegration */ case 4: str = (olet == WAND_CLASS) ? "death field" : "disintegration field"; adtyp = AD_DISN; break; case 5: str = "ball of lightning"; adtyp = AD_ELEC; break; case 6: str = "poison gas cloud"; adtyp = AD_DRST; break; case 7: str = "splash of acid"; adtyp = AD_ACID; break; default: impossible("explosion base type %d?", type); return; } /*WAC add light source for fire*/ #ifdef LIGHT_SRC_SPELL if ((!remote) && ((adtyp == AD_FIRE) || (adtyp == AD_ELEC))) { new_light_source(x, y, 2, LS_TEMP, (genericptr_t) 1); vision_recalc(0); } #endif any_shield = visible = FALSE; for(i = 0; i < area->nlocations; i++) { explmask = FALSE; xi = area->locations[i].x; yi = area->locations[i].y; if (xi == u.ux && yi == u.uy) { switch(adtyp) { case AD_PHYS: break; case AD_MAGM: explmask = !!Antimagic; break; case AD_FIRE: explmask = !!Fire_resistance; break; case AD_COLD: explmask = !!Cold_resistance; break; case AD_DISN: explmask = (olet == WAND_CLASS) ? !!(nonliving(youmonst.data) || is_demon(youmonst.data)) : !!Disint_resistance; break; case AD_ELEC: explmask = !!Shock_resistance; break; case AD_DRST: explmask = !!Poison_resistance; break; case AD_ACID: explmask = !!Acid_resistance; break; default: impossible("explosion type %d?", adtyp); break; } } mtmp = m_at(xi, yi); #ifdef STEED if (!mtmp && xi == u.ux && yi == u.uy) mtmp = u.usteed; #endif if (mtmp) { switch(adtyp) { case AD_PHYS: break; case AD_MAGM: explmask |= resists_magm(mtmp); break; case AD_FIRE: explmask |= resists_fire(mtmp); break; case AD_COLD: explmask |= resists_cold(mtmp); break; case AD_DISN: explmask |= (olet == WAND_CLASS) ? (nonliving(mtmp->data) || is_demon(mtmp->data)) : resists_disint(mtmp); break; case AD_ELEC: explmask |= resists_elec(mtmp); break; case AD_DRST: explmask |= resists_poison(mtmp); break; case AD_ACID: explmask |= resists_acid(mtmp); break; default: impossible("explosion type %d?", adtyp); break; } } if (mtmp && cansee(xi,yi) && !canspotmon(mtmp)) map_invisible(xi, yi); else if (!mtmp && memory_is_invisible(xi, yi)) { unmap_object(xi, yi); newsym(xi, yi); } if (cansee(xi, yi)) visible = TRUE; if (explmask) any_shield = TRUE; area->locations[i].shielded = explmask; } /* Not visible if remote */ if (remote) visible = FALSE; if (visible) { #ifdef ALLEG_FX if (iflags.usealleg) { alleg_explode(x, y, adtyp); if (any_shield) /* simulate a shield effect */ for(i = 0; i < area->nlocations; i++) { if (area->locations[i].shielded) shieldeff(area->locations[i].x, area->locations[i].y); } } else { #endif set_blast_symbols(area); /* Start the explosion */ for(i = 0; i < area->nlocations; i++) { tmp_at(starting ? DISP_BEAM : DISP_CHANGE, explosion_to_glyph(expltype, area->locations[i].blast)); tmp_at(area->locations[i].x, area->locations[i].y); starting = 0; } curs_on_u(); /* will flush screen and output */ if (any_shield && flags.sparkle) { /* simulate shield effect */ for (k = 0; k < SHIELD_COUNT; k++) { for(i = 0; i < area->nlocations; i++) { if (area->locations[i].shielded) /* * Bypass tmp_at() and send the shield glyphs * directly to the buffered screen. tmp_at() * will clean up the location for us later. */ show_glyph(area->locations[i].x, area->locations[i].y, cmap_to_glyph(shield_static[k])); } curs_on_u(); /* will flush screen and output */ delay_output(); } /* Cover last shield glyph with blast symbol. */ for(i = 0; i < area->nlocations; i++) { if (area->locations[i].shielded) show_glyph(area->locations[i].x, area->locations[i].y, explosion_to_glyph(expltype, area->locations[i].blast)); } } else { /* delay a little bit. */ delay_output(); delay_output(); } tmp_at(DISP_END, 0); /* clear the explosion */ #ifdef ALLEG_FX } #endif } else if (!remote) { if (olet == MON_EXPLODE) { str = "explosion"; generic = TRUE; } if (flags.soundok) You_hear(is_pool(x, y) ? "a muffled explosion." : "a blast."); } if (dam) for(i = 0; i < area->nlocations; i++) { xi = area->locations[i].x; yi = area->locations[i].y; if (xi == u.ux && yi == u.uy) uhurt = area->locations[i].shielded ? 1 : 2; idamres = idamnonres = 0; /* DS: Allow monster induced explosions also */ if (type >= 0 || type <= -10) (void)zap_over_floor(xi, yi, type, &shopdamage); mtmp = m_at(xi, yi); #ifdef STEED if (!mtmp && xi == u.ux && yi == u.uy) mtmp = u.usteed; #endif if (!mtmp) continue; if (DEADMONSTER(mtmp)) continue; if (u.uswallow && mtmp == u.ustuck) { if (is_animal(u.ustuck->data)) if (!silent) pline("%s gets %s!", Monnam(u.ustuck), (adtyp == AD_FIRE) ? "heartburn" : (adtyp == AD_COLD) ? "chilly" : (adtyp == AD_DISN) ? ((olet == WAND_CLASS) ? "irradiated by pure energy" : "perforated") : (adtyp == AD_ELEC) ? "shocked" : (adtyp == AD_DRST) ? "poisoned" : (adtyp == AD_ACID) ? "an upset stomach" : "fried"); else if (!silent) pline("%s gets slightly %s!", Monnam(u.ustuck), (adtyp == AD_FIRE) ? "toasted" : (adtyp == AD_COLD) ? "chilly" : (adtyp == AD_DISN) ? ((olet == WAND_CLASS) ? "overwhelmed by pure energy" : "perforated") : (adtyp == AD_ELEC) ? "shocked" : (adtyp == AD_DRST) ? "intoxicated" : (adtyp == AD_ACID) ? "burned" : "fried"); } else if (!silent && cansee(xi, yi)) { if(mtmp->m_ap_type) seemimic(mtmp); 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); idamnonres += destroy_mitem(mtmp, POTION_CLASS, (int) adtyp); idamnonres += destroy_mitem(mtmp, WAND_CLASS, (int) adtyp); idamnonres += destroy_mitem(mtmp, RING_CLASS, (int) adtyp); if (area->locations[i].shielded) { golemeffects(mtmp, (int) adtyp, dam + idamres); mtmp->mhp -= idamnonres; } else { /* call resist with 0 and do damage manually so 1) we can * get out the message before doing the damage, and 2) we can * call mondied, not killed, if it's not your blast */ int mdam = dam; if (resist(mtmp, olet, 0, FALSE)) { if (!silent && cansee(xi,yi)) pline("%s resists the %s!", Monnam(mtmp), str); mdam = dam/2; } if (mtmp == u.ustuck) mdam *= 2; if (resists_cold(mtmp) && adtyp == AD_FIRE) mdam *= 2; else if (resists_fire(mtmp) && adtyp == AD_COLD) mdam *= 2; mtmp->mhp -= mdam; mtmp->mhp -= (idamres + idamnonres); #ifdef SHOW_DMG if (mtmp->mhp > 0 && !remote) showdmg(mdam + idamres + idamnonres); #endif } if (mtmp->mhp <= 0) { /* KMH -- Don't blame the player for pets killing gas spores */ if (yours) xkilled(mtmp, (silent ? 0 : 1)); else monkilled(mtmp, "", (int)adtyp); } else if (!flags.mon_moving && yours) setmangry(mtmp); } #ifdef LIGHT_SRC_SPELL /*WAC kill the light source*/ if ((!remote) && ((adtyp == AD_FIRE) || (adtyp == AD_ELEC))) { del_light_source(LS_TEMP, (genericptr_t) 1); } #endif /* Do your injury last */ /* You are not hurt if this is remote */ if (remote) uhurt = FALSE; if (uhurt) { /* [ALI] Give message if it's a weapon (grenade) exploding */ if ((type >= 0 || adtyp == AD_PHYS || olet == WEAPON_CLASS) && /* gas spores */ flags.verbose && olet != SCROLL_CLASS) You("are caught in the %s!", str); /* do property damage first, in case we end up leaving bones */ if (adtyp == AD_FIRE) burn_away_slime(); if (Invulnerable) { damu = 0; You("are unharmed!"); } else if (Half_physical_damage && adtyp == AD_PHYS) damu = (damu+1) / 2; if (adtyp == AD_FIRE) (void) burnarmor(&youmonst); destroy_item(SCROLL_CLASS, (int) adtyp); destroy_item(SPBOOK_CLASS, (int) adtyp); destroy_item(POTION_CLASS, (int) adtyp); destroy_item(RING_CLASS, (int) adtyp); 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; #ifdef SHOW_DMG if (flags.showdmg) pline("[%d pts.]", damu); #endif } if (u.uhp <= 0 || (Upolyd && u.mh <= 0)) { if (Upolyd) { if (Polymorph_control || !rn2(3)) { u.uhp -= mons[u.umonnum].mlevel; u.uhpmax -= mons[u.umonnum].mlevel; if (u.uhpmax < 1) u.uhpmax = 1; } 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 && yours) { killer_format = NO_KILLER_PREFIX; Sprintf(killer_buf, "caught %sself in %s own %s", uhim(), uhis(), str); } else if (olet != BURNING_OIL) { killer_format = KILLED_BY_AN; Strcpy(killer_buf, str); } else { killer_format = KILLED_BY; Strcpy(killer_buf, str); } killer = killer_buf; /* 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); } if (shopdamage) { pay_for_damage(adtyp == AD_FIRE ? "burn away" : adtyp == AD_COLD ? "shatter" : adtyp == AD_DISN ? "disintegrate" : "destroy", FALSE); } /* explosions are noisy */ i = dam * dam; if (i < 50) i = 50; /* in case random damage is very small */ wake_nearto(x, y, i); #ifdef ALLEG_FX if (iflags.usealleg) cleanup_explosions(); #endif } #endif /* OVL0 */ #ifdef OVL1 struct scatter_chain { struct scatter_chain *next; /* pointer to next scatter item */ struct obj *obj; /* pointer to the object */ xchar ox; /* location of */ xchar oy; /* item */ schar dx; /* direction of */ schar dy; /* travel */ int range; /* range of object */ boolean stopped; /* flag for in-motion/stopped */ }; /* * scflags: * VIS_EFFECTS Add visual effects to display * MAY_HITMON Objects may hit monsters * MAY_HITYOU Objects may hit hero * MAY_HIT Objects may hit you or monsters * MAY_DESTROY Objects may be destroyed at random * MAY_FRACTURE Stone objects can be fractured (statues, boulders) */ /* returns number of scattered objects */ long scatter(sx,sy,blastforce,scflags, obj) int sx,sy; /* location of objects to scatter */ int blastforce; /* force behind the scattering */ unsigned int scflags; struct obj *obj; /* only scatter this obj */ { register struct obj *otmp; register int tmp; int farthest = 0; uchar typ; long qtmp; boolean used_up; boolean individual_object = obj ? TRUE : FALSE; struct monst *mtmp; struct scatter_chain *stmp, *stmp2 = 0; struct scatter_chain *schain = (struct scatter_chain *)0; long total = 0L; while ((otmp = individual_object ? obj : level.objects[sx][sy]) != 0) { if (otmp->quan > 1L) { qtmp = otmp->quan - 1; if (qtmp > LARGEST_INT) qtmp = LARGEST_INT; qtmp = (long)rnd((int)qtmp); otmp = splitobj(otmp, qtmp); } else { obj = (struct obj *)0; /* all used */ } obj_extract_self(otmp); used_up = FALSE; /* 9 in 10 chance of fracturing boulders or statues */ if ((scflags & MAY_FRACTURE) && ((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); 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 */ } used_up = TRUE; /* 1 in 10 chance of destruction of obj; glass, egg destruction */ } else if ((scflags & MAY_DESTROY) && (!rn2(10) || (objects[otmp->otyp].oc_material == GLASS || otmp->otyp == EGG))) { if (breaks(otmp, (xchar)sx, (xchar)sy)) used_up = TRUE; } if (!used_up) { stmp = (struct scatter_chain *) alloc(sizeof(struct scatter_chain)); stmp->next = (struct scatter_chain *)0; stmp->obj = otmp; stmp->ox = sx; stmp->oy = sy; tmp = rn2(8); /* get the direction */ stmp->dx = xdir[tmp]; stmp->dy = ydir[tmp]; tmp = blastforce - (otmp->owt/40); if (tmp < 1) tmp = 1; stmp->range = rnd(tmp); /* anywhere up to that determ. by wt */ if (farthest < stmp->range) farthest = stmp->range; stmp->stopped = FALSE; if (!schain) schain = stmp; else stmp2->next = stmp; stmp2 = stmp; } } while (farthest-- > 0) { for (stmp = schain; stmp; stmp = stmp->next) { if ((stmp->range-- > 0) && (!stmp->stopped)) { bhitpos.x = stmp->ox + stmp->dx; bhitpos.y = stmp->oy + stmp->dy; typ = levl[bhitpos.x][bhitpos.y].typ; if(!isok(bhitpos.x, bhitpos.y)) { bhitpos.x -= stmp->dx; bhitpos.y -= stmp->dy; stmp->stopped = TRUE; } else if(!ZAP_POS(typ) || closed_door(bhitpos.x, bhitpos.y)) { bhitpos.x -= stmp->dx; bhitpos.y -= stmp->dy; stmp->stopped = TRUE; } else if ((mtmp = m_at(bhitpos.x, bhitpos.y)) != 0) { if (scflags & MAY_HITMON) { stmp->range--; if (ohitmon((struct monst *)0, mtmp, stmp->obj, 1, FALSE)) { stmp->obj = (struct obj *)0; stmp->stopped = TRUE; } } } else if (bhitpos.x==u.ux && bhitpos.y==u.uy) { if (scflags & MAY_HITYOU) { int hitvalu, hitu; if (multi) nomul(0); hitvalu = 8 + stmp->obj->spe; if (bigmonst(youmonst.data)) hitvalu++; hitu = thitu(hitvalu, dmgval(stmp->obj, &youmonst), stmp->obj, (char *)0); if (hitu) { stmp->range -= 3; stop_occupation(); } } } else { if (scflags & VIS_EFFECTS) { /* tmp_at(bhitpos.x, bhitpos.y); */ /* delay_output(); */ } } stmp->ox = bhitpos.x; stmp->oy = bhitpos.y; } } } for (stmp = schain; stmp; stmp = stmp2) { int x,y; stmp2 = stmp->next; x = stmp->ox; y = stmp->oy; if (stmp->obj) { if ( x!=sx || y!=sy ) total += stmp->obj->quan; place_object(stmp->obj, x, y); stackobj(stmp->obj); } free((genericptr_t)stmp); newsym(x,y); } return total; } /* * Splatter burning oil from x,y to the surrounding area. * * This routine should really take a how and direction parameters. * The how is how it was caused, e.g. kicked verses thrown. The * direction is which way to spread the flaming oil. Different * "how"s would give different dispersal patterns. For example, * kicking a burning flask will splatter differently from a thrown * flask hitting the ground. * * For now, just perform a "regular" explosion. */ void splatter_burning_oil(x, y) int x, y; { explode(x, y, ZT_SPELL(ZT_FIRE), d(4,4), BURNING_OIL, EXPL_FIERY); } #ifdef FIREARMS #define BY_OBJECT ((struct monst *)0) STATIC_DCL int dp(n, p) /* 0 <= dp(n, p) <= n */ int n, p; { int tmp = 0; while (n--) tmp += !rn2(p); return tmp; } #define GRENADE_TRIGGER(obj) \ if ((obj)->otyp == FRAG_GRENADE) { \ delquan = dp((obj)->quan, 10); \ no_fiery += delquan; \ } else if ((obj)->otyp == GAS_GRENADE) { \ delquan = dp((obj)->quan, 10); \ no_gas += delquan; \ } else if ((obj)->otyp == STICK_OF_DYNAMITE) { \ delquan = (obj)->quan; \ no_fiery += (obj)->quan * 2; \ no_dig += (obj)->quan; \ } else if (is_bullet(obj)) \ delquan = (obj)->quan; \ else \ delquan = 0 struct grenade_callback { ExplodeRegion *fiery_area, *gas_area, *dig_area; boolean isyou; }; STATIC_DCL void FDECL(grenade_effects, (struct obj *,XCHAR_P,XCHAR_P, ExplodeRegion *,ExplodeRegion *,ExplodeRegion *,BOOLEAN_P)); STATIC_DCL int grenade_fiery_callback(data, x, y) genericptr_t data; int x, y; { int is_accessible = ZAP_POS(levl[x][y].typ); struct grenade_callback *gc = (struct grenade_callback *)data; if (is_accessible) { add_location_to_explode_region(gc->fiery_area, x, y); grenade_effects((struct obj *)0, x, y, gc->fiery_area, gc->gas_area, gc->dig_area, gc->isyou); } return !is_accessible; } STATIC_DCL int grenade_gas_callback(data, x, y) genericptr_t data; int x, y; { int is_accessible = ZAP_POS(levl[x][y].typ); struct grenade_callback *gc = (struct grenade_callback *)data; if (is_accessible) add_location_to_explode_region(gc->gas_area, x, y); return !is_accessible; } STATIC_DCL int grenade_dig_callback(data, x, y) genericptr_t data; int x, y; { struct grenade_callback *gc = (struct grenade_callback *)data; if (dig_check(BY_OBJECT, FALSE, x, y)) add_location_to_explode_region(gc->dig_area, x, y); return !ZAP_POS(levl[x][y].typ); } STATIC_DCL void grenade_effects(source, x, y, fiery_area, gas_area, dig_area, isyou) struct obj *source; xchar x, y; ExplodeRegion *fiery_area, *gas_area, *dig_area; boolean isyou; { int i, r; struct obj *obj, *obj2; struct monst *mon; /* * Note: These count explosive charges in arbitary units. Grenades * are counted as 1 and sticks of dynamite as 2 fiery and 1 dig. */ int no_gas = 0, no_fiery = 0, no_dig = 0; int delquan; boolean shielded = FALSE, redraw; struct grenade_callback gc; if (source) { if (source->otyp == GAS_GRENADE) no_gas += source->quan; else if (source->otyp == FRAG_GRENADE) no_fiery += source->quan; else if (source->otyp == STICK_OF_DYNAMITE) { no_fiery += source->quan * 2; no_dig += source->quan; } redraw = source->where == OBJ_FLOOR; obj_extract_self(source); obfree(source, (struct obj *)0); if (redraw) newsym(x, y); } mon = m_at(x, y); #ifdef STEED if (!mon && x == u.ux && y == u.uy) mon = u.usteed; #endif if (mon && !DEADMONSTER(mon)) if (resists_fire(mon)) shielded = TRUE; else for(obj = mon->minvent; obj; obj = obj2) { obj2 = obj->nobj; GRENADE_TRIGGER(obj); for(i = 0; i < delquan; i++) m_useup(mon, obj); } if (x == u.ux && y == u.uy) if (Fire_resistance) shielded = TRUE; else for(obj = invent; obj; obj = obj2) { obj2 = obj->nobj; GRENADE_TRIGGER(obj); for(i = 0; i < delquan; i++) useup(obj); } if (!shielded) for(obj = level.objects[x][y]; obj; obj = obj2) { obj2 = obj->nexthere; GRENADE_TRIGGER(obj); if (delquan) { if (isyou) useupf(obj, delquan); else if (delquan < obj->quan) obj->quan -= delquan; else delobj(obj); } } gc.fiery_area = fiery_area; gc.gas_area = gas_area; gc.dig_area = dig_area; gc.isyou = isyou; if (no_gas) { /* r = floor(log2(n))+1 */ r = 0; while(no_gas) { r++; no_gas /= 2; } xpathto(r, x, y, grenade_gas_callback, (genericptr_t)&gc); } if (no_fiery) { /* r = floor(log2(n))+1 */ r = 0; while(no_fiery) { r++; no_fiery /= 2; } xpathto(r, x, y, grenade_fiery_callback, (genericptr_t)&gc); } if (no_dig) { /* r = floor(log2(n))+1 */ r = 0; while(no_dig) { r++; no_dig /= 2; } xpathto(r, x, y, grenade_dig_callback, (genericptr_t)&gc); } } /* * Note: obj is not valid after return */ void grenade_explode(obj, x, y, isyou, dest) struct obj *obj; int x, y; boolean isyou; int dest; { int i, ztype; boolean shop_damage = FALSE; int ox, oy; ExplodeRegion *fiery_area, *gas_area, *dig_area; struct trap *trap; fiery_area = create_explode_region(); gas_area = create_explode_region(); dig_area = create_explode_region(); grenade_effects(obj, x, y, fiery_area, gas_area, dig_area, isyou); if (fiery_area->nlocations) { ztype = isyou ? ZT_SPELL(ZT_FIRE) : -ZT_SPELL(ZT_FIRE); do_explode(x, y, fiery_area, ztype, d(3,6), WEAPON_CLASS, EXPL_FIERY, dest, isyou); } wake_nearto(x, y, 400); /* Like cartoons - the explosion first, then * the world deals with the holes produced ;) */ for(i = 0; i < dig_area->nlocations; i++) { ox = dig_area->locations[i].x; oy = dig_area->locations[i].y; if (IS_WALL(levl[ox][oy].typ) || IS_DOOR(levl[ox][oy].typ)) { watch_dig((struct monst *)0, ox, oy, TRUE); if (*in_rooms(ox, oy, SHOPBASE)) shop_damage = TRUE; } digactualhole(ox, oy, BY_OBJECT, PIT); } free_explode_region(dig_area); for(i = 0; i < fiery_area->nlocations; i++) { ox = fiery_area->locations[i].x; oy = fiery_area->locations[i].y; if ((trap = t_at(ox, oy)) != 0 && trap->ttyp == LANDMINE) blow_up_landmine(trap); } free_explode_region(fiery_area); if (gas_area->nlocations) { ztype = isyou ? ZT_SPELL(ZT_POISON_GAS) : -ZT_SPELL(ZT_POISON_GAS); do_explode(x, y, gas_area, ztype, d(3,6), WEAPON_CLASS, EXPL_NOXIOUS, dest, isyou); } free_explode_region(gas_area); if (shop_damage) pay_for_damage("damage", FALSE); } void arm_bomb(obj, yours) struct obj *obj; boolean yours; { if (is_grenade(obj)) { attach_bomb_blow_timeout(obj, (obj->cursed ? rn2(5) + 2 : obj->blessed ? 4 : rn2(2) + 3) , yours); } /* Otherwise, do nothing */ } #endif /* FIREARMS */ #endif /* OVL1 */ /*explode.c*/ slashem-0.0.7E7F3/src/quest.c0000664000076400007640000002361110545462317013753 0ustar aliali/* SCCS Id: @(#)quest.c 3.4 2000/05/05 */ /* Copyright 1991, M. Stephenson */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" /* quest dungeon branch routines. */ #include "quest.h" #include "qtext.h" #define Not_firsttime (on_level(&u.uz0, &u.uz)) #define Qstat(x) (quest_status.x) STATIC_DCL void NDECL(on_start); STATIC_DCL void NDECL(on_locate); STATIC_DCL void NDECL(on_goal); STATIC_DCL boolean NDECL(not_capable); STATIC_DCL int FDECL(is_pure, (BOOLEAN_P)); STATIC_DCL void FDECL(expulsion, (BOOLEAN_P)); STATIC_DCL void NDECL(chat_with_leader); STATIC_DCL void NDECL(chat_with_nemesis); STATIC_DCL void NDECL(chat_with_guardian); STATIC_DCL void FDECL(prisoner_speaks, (struct monst *)); STATIC_OVL void on_start() { if(!Qstat(first_start)) { qt_pager(QT_FIRSTTIME); Qstat(first_start) = TRUE; } else if((u.uz0.dnum != u.uz.dnum) || (u.uz0.dlevel < u.uz.dlevel)) { if(Qstat(not_ready) <= 2) qt_pager(QT_NEXTTIME); else qt_pager(QT_OTHERTIME); } } STATIC_OVL void on_locate() { if(!Qstat(first_locate)) { qt_pager(QT_FIRSTLOCATE); Qstat(first_locate) = TRUE; } else if(u.uz0.dlevel < u.uz.dlevel && !Qstat(killed_nemesis)) qt_pager(QT_NEXTLOCATE); } STATIC_OVL void on_goal() { if (Qstat(killed_nemesis)) { return; } else if (!Qstat(made_goal)) { qt_pager(QT_FIRSTGOAL); Qstat(made_goal) = 1; } else { qt_pager(QT_NEXTGOAL); if(Qstat(made_goal) < 7) Qstat(made_goal)++; } } void onquest() { if(u.uevent.qcompleted || Not_firsttime) return; if(!Is_special(&u.uz)) return; if(Is_qstart(&u.uz)) on_start(); else if(Is_qlocate(&u.uz) && u.uz.dlevel > u.uz0.dlevel) on_locate(); else if(Is_nemesis(&u.uz)) on_goal(); return; } void nemdead() { if(!Qstat(killed_nemesis)) { Qstat(killed_nemesis) = TRUE; qt_pager(QT_KILLEDNEM); } } void artitouch() { if(!Qstat(touched_artifact)) { Qstat(touched_artifact) = TRUE; qt_pager(QT_GOTIT); exercise(A_WIS, TRUE); } } /* external hook for do.c (level change check) */ boolean ok_to_quest() { return((boolean)((Qstat(got_quest) || Qstat(got_thanks))) && (is_pure(FALSE) > 0)); } STATIC_OVL boolean not_capable() { return((boolean)(u.ulevel < MIN_QUEST_LEVEL)); } STATIC_OVL int is_pure(talk) boolean talk; { int purity; aligntyp original_alignment = u.ualignbase[A_ORIGINAL]; #ifdef WIZARD if (wizard && talk) { if (u.ualign.type != original_alignment) { You("are currently %s instead of %s.", align_str(u.ualign.type), align_str(original_alignment)); } else if (u.ualignbase[A_CURRENT] != original_alignment) { You("have converted."); } else if (u.ualign.record < MIN_QUEST_ALIGN) { You("are currently %d and require %d.", u.ualign.record, MIN_QUEST_ALIGN); if (yn_function("adjust?", (char *)0, 'y') == 'y') u.ualign.record = MIN_QUEST_ALIGN; } } #endif purity = (u.ualign.record >= MIN_QUEST_ALIGN && u.ualign.type == original_alignment && u.ualignbase[A_CURRENT] == original_alignment) ? 1 : (u.ualignbase[A_CURRENT] != original_alignment) ? -1 : 0; return purity; } /* * Expell the player to the stairs on the parent of the quest dungeon. * * This assumes that the hero is currently _in_ the quest dungeon and that * there is a single branch to and from it. */ STATIC_OVL void expulsion(seal) boolean seal; { branch *br; d_level *dest; struct trap *t; int portal_flag; br = dungeon_branch("The Quest"); dest = (br->end1.dnum == u.uz.dnum) ? &br->end2 : &br->end1; portal_flag = u.uevent.qexpelled ? 0 : /* returned via artifact? */ !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. If monster movement is in progress, any who haven't moved yet will now miss out on a chance to wander through it... */ 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?"); } } /* Either you've returned to quest leader while carrying the quest artifact or you've just thrown it to/at him or her. If quest completion text hasn't been given yet, give it now. Otherwise give another message about the character keeping the artifact and using the magic portal to return to the dungeon. */ void finish_quest(obj) struct obj *obj; /* quest artifact; possibly null if carrying Amulet */ { struct obj *otmp; if (u.uhave.amulet) { /* unlikely but not impossible */ qt_pager(QT_HASAMULET); /* leader IDs the real amulet but ignores any fakes */ if ((otmp = carrying(AMULET_OF_YENDOR)) != 0) fully_identify_obj(otmp); } else { qt_pager(!Qstat(got_thanks) ? QT_OFFEREDIT : QT_OFFEREDIT2); /* should have obtained bell during quest; if not, suggest returning for it now */ if ((otmp = carrying(BELL_OF_OPENING)) == 0) com_pager(5); } Qstat(got_thanks) = TRUE; if (obj) { u.uevent.qcompleted = 1; /* you did it! */ /* behave as if leader imparts sufficient info about the quest artifact */ fully_identify_obj(obj); update_inventory(); } } STATIC_OVL void chat_with_leader() { /* Rule 0: Cheater checks. */ if(u.uhave.questart && !Qstat(met_nemesis)) Qstat(cheater) = TRUE; /* It is possible for you to get the amulet without completing * the quest. If so, try to induce the player to quest. */ if(Qstat(got_thanks)) { /* Rule 1: You've gone back with/without the amulet. */ if(u.uhave.amulet) finish_quest((struct obj *)0); /* Rule 2: You've gone back before going for the amulet. */ else qt_pager(QT_POSTHANKS); } /* Rule 3: You've got the artifact and are back to return it. */ else if(u.uhave.questart) { struct obj *otmp; for (otmp = invent; otmp; otmp = otmp->nobj) if (is_quest_artifact(otmp)) break; finish_quest(otmp); /* Rule 4: You haven't got the artifact yet. */ } else if(Qstat(got_quest)) { qt_pager(rn1(10, QT_ENCOURAGE)); /* Rule 5: You aren't yet acceptable - or are you? */ } else { if(!Qstat(met_leader)) { qt_pager(QT_FIRSTLEADER); Qstat(met_leader) = TRUE; Qstat(not_ready) = 0; } else qt_pager(QT_NEXTLEADER); /* the quest leader might have passed through the portal into the regular dungeon; none of the remaining make sense there */ if (!on_level(&u.uz, &qstart_level)) return; if(not_capable()) { qt_pager(QT_BADLEVEL); exercise(A_WIS, TRUE); expulsion(FALSE); } else if(is_pure(TRUE) < 0) { com_pager(QT_BANISHED); expulsion(TRUE); } else if(is_pure(TRUE) == 0) { qt_pager(QT_BADALIGN); if(Qstat(not_ready) == MAX_QUEST_TRIES) { qt_pager(QT_LASTLEADER); expulsion(TRUE); } else { Qstat(not_ready)++; exercise(A_WIS, TRUE); expulsion(FALSE); } } else { /* You are worthy! */ qt_pager(QT_ASSIGNQUEST); exercise(A_WIS, TRUE); Qstat(got_quest) = TRUE; } } } void leader_speaks(mtmp) register struct monst *mtmp; { /* maybe you attacked leader? */ if(!mtmp->mpeaceful) { Qstat(pissed_off) = TRUE; mtmp->mstrategy &= ~STRAT_WAITMASK; /* end the inaction */ } /* the quest leader might have passed through the portal into the regular dungeon; if so, mustn't perform "backwards expulsion" */ if (!on_level(&u.uz, &qstart_level)) return; if(Qstat(pissed_off)) { qt_pager(QT_LASTLEADER); expulsion(TRUE); } else chat_with_leader(); } STATIC_OVL void chat_with_nemesis() { /* The nemesis will do most of the talking, but... */ qt_pager(rn1(10, QT_DISCOURAGE)); if(!Qstat(met_nemesis)) Qstat(met_nemesis++); } void nemesis_speaks() { 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)); if(Qstat(made_goal) < 7) Qstat(made_goal)++; Qstat(met_nemesis) = TRUE; } else /* he will spit out random maledictions */ if(!rn2(5)) qt_pager(rn1(10, QT_DISCOURAGE)); } STATIC_OVL void 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 prisoner_speaks (mtmp) register struct monst *mtmp; { if (mtmp->data == &mons[PM_PRISONER] && (mtmp->mstrategy & STRAT_WAITMASK)) { /* Awaken the prisoner */ if (canseemon(mtmp)) pline("%s speaks:", Monnam(mtmp)); verbalize("I'm finally free!"); mtmp->mstrategy &= ~STRAT_WAITMASK; mtmp->mpeaceful = 1; /* Your god is happy... */ adjalign(3); /* ...But the guards are not */ (void) angry_guards(FALSE); } return; } void 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.", mon_nam(mtmp)); } } void 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; } } void quest_stat_check(mtmp) struct monst *mtmp; { if(mtmp->data->msound == MS_NEMESIS) Qstat(in_battle) = (mtmp->mcanmove && !mtmp->msleeping && monnear(mtmp, u.ux, u.uy)); } /*quest.c*/ slashem-0.0.7E7F3/src/wizard.c0000664000076400007640000004077410545462317014123 0ustar aliali/* SCCS Id: @(#)wizard.c 3.4 2003/02/18 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ /* wizard code - inspired by rogue code from Merlyn Leroy (digi-g!brian) */ /* - heavily modified to give the wiz balls. (genat!mike) */ /* - dewimped and given some maledictions. -3. */ /* - generalized for 3.1 (mike@bullns.on01.bull.ca) */ #include "hack.h" #include "qtext.h" #include "epri.h" extern const int monstr[]; #ifdef OVLB STATIC_DCL short FDECL(which_arti, (int)); STATIC_DCL boolean FDECL(mon_has_arti, (struct monst *,SHORT_P)); STATIC_DCL struct monst *FDECL(other_mon_has_arti, (struct monst *,SHORT_P)); STATIC_DCL struct obj *FDECL(on_ground, (SHORT_P)); STATIC_DCL boolean FDECL(you_have, (int)); STATIC_DCL long FDECL(target_on, (int,struct monst *)); STATIC_DCL long FDECL(strategy, (struct monst *)); static NEARDATA const int nasties[] = { PM_COCKATRICE, PM_ETTIN, PM_STALKER, PM_MINOTAUR, PM_RED_DRAGON, PM_BLACK_DRAGON, PM_GREEN_DRAGON, PM_OWLBEAR, PM_PURPLE_WORM, PM_ROCK_TROLL, PM_XAN, PM_GREMLIN, PM_UMBER_HULK, /* PM_VAMPIRE_LORD,*/ /* WAC replaced vamp lords with mages :) */ PM_VAMPIRE_MAGE, PM_XORN, /*PM_ZRUTY,*/ PM_ELF_LORD, PM_ELVENKING, PM_YELLOW_DRAGON, PM_LEOCROTTA, PM_BALUCHITHERIUM, PM_CARNIVOROUS_APE, PM_FIRE_GIANT, PM_COUATL, PM_CAPTAIN, PM_WINGED_GARGOYLE, PM_MASTER_MIND_FLAYER, PM_FIRE_ELEMENTAL, PM_JABBERWOCK, PM_MASTER_LICH, PM_OGRE_KING, PM_OLOG_HAI, PM_IRON_GOLEM, PM_OCHRE_JELLY, /* [Tom] added my "worst" monsters... heh heh */ PM_RHAUMBUSUN, PM_BASILISK, PM_PYROLISK, PM_GREEN_SLIME, PM_DEMON_ORC, PM_MASTODON, PM_ROT_WORM, PM_SNOW_ORC, PM_SILVER_DRAGON, PM_DISENCHANTER }; static NEARDATA const unsigned wizapp[] = { PM_HUMAN, PM_WATER_DEMON, PM_VAMPIRE, PM_RED_DRAGON, PM_TROLL, PM_UMBER_HULK, PM_XORN, PM_XAN, PM_COCKATRICE, PM_FLOATING_EYE, PM_GUARDIAN_NAGA, PM_TRAPPER }; #endif /* OVLB */ #ifdef OVL0 /* If you've found the Amulet, make the Wizard appear after some time */ /* Also, give hints about portal locations, if amulet is worn/wielded -dlc */ void amulet() { struct monst *mtmp; struct trap *ttmp; struct obj *amu; #if 0 /* caller takes care of this check */ if (!u.uhave.amulet) return; #endif if ((((amu = uamul) != 0 && amu->otyp == AMULET_OF_YENDOR) || ((amu = uwep) != 0 && amu->otyp == AMULET_OF_YENDOR)) && !rn2(15)) { for(ttmp = ftrap; ttmp; ttmp = ttmp->ntrap) { 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; } } } if (!flags.no_of_wizards) return; /* find Wizard, and wake him if necessary */ for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) if (!DEADMONSTER(mtmp) && mtmp->iswiz && mtmp->msleeping && !rn2(40)) { mtmp->msleeping = 0; if (distu(mtmp->mx,mtmp->my) > 2) You( "get the creepy feeling that somebody noticed your taking the Amulet." ); return; } } #endif /* OVL0 */ #ifdef OVLB int mon_has_amulet(mtmp) register struct monst *mtmp; { register struct obj *otmp; for(otmp = mtmp->minvent; otmp; otmp = otmp->nobj) if(otmp->otyp == AMULET_OF_YENDOR) return(1); return(0); } int mon_has_special(mtmp) register struct monst *mtmp; { register struct obj *otmp; for(otmp = mtmp->minvent; otmp; otmp = otmp->nobj) if (evades_destruction(otmp) || is_quest_artifact(otmp)) return 1; return(0); } /* * New for 3.1 Strategy / Tactics for the wiz, as well as other * monsters that are "after" something (defined via mflag3). * * The strategy section decides *what* the monster is going * to attempt, the tactics section implements the decision. */ #define STRAT(w, x, y, typ) (w | ((long)(x)<<16) | ((long)(y)<<8) | (long)typ) #define M_Wants(mask) (mtmp->data->mflags3 & (mask)) STATIC_OVL short which_arti(mask) register int mask; { switch(mask) { case M3_WANTSAMUL: return(AMULET_OF_YENDOR); case M3_WANTSBELL: return(BELL_OF_OPENING); case M3_WANTSCAND: return(CANDELABRUM_OF_INVOCATION); case M3_WANTSBOOK: return(SPE_BOOK_OF_THE_DEAD); default: break; /* 0 signifies quest artifact */ } return(0); } /* * If "otyp" is zero, it triggers a check for the quest_artifact, * since bell, book, candle, and amulet are all objects, not really * artifacts right now. [MRS] */ STATIC_OVL boolean mon_has_arti(mtmp, otyp) register struct monst *mtmp; register short otyp; { register struct obj *otmp; for(otmp = mtmp->minvent; otmp; otmp = otmp->nobj) { if(otyp) { if(otmp->otyp == otyp) return(1); } else if(is_quest_artifact(otmp)) return(1); } return(0); } STATIC_OVL struct monst * other_mon_has_arti(mtmp, otyp) register struct monst *mtmp; register short otyp; { register struct monst *mtmp2; for(mtmp2 = fmon; mtmp2; mtmp2 = mtmp2->nmon) /* no need for !DEADMONSTER check here since they have no inventory */ if(mtmp2 != mtmp) if(mon_has_arti(mtmp2, otyp)) return(mtmp2); return((struct monst *)0); } STATIC_OVL struct obj * on_ground(otyp) register short otyp; { register struct obj *otmp; for (otmp = fobj; otmp; otmp = otmp->nobj) if (otyp) { if (otmp->otyp == otyp) return(otmp); } else if (is_quest_artifact(otmp)) return(otmp); return((struct obj *)0); } STATIC_OVL boolean you_have(mask) register int mask; { switch(mask) { case M3_WANTSAMUL: return(boolean)(u.uhave.amulet); case M3_WANTSBELL: return(boolean)(u.uhave.bell); case M3_WANTSCAND: return(boolean)(u.uhave.menorah); case M3_WANTSBOOK: return(boolean)(u.uhave.book); case M3_WANTSARTI: return(boolean)(u.uhave.questart); default: break; } return(0); } STATIC_OVL long target_on(mask, mtmp) register int mask; register struct monst *mtmp; { register short otyp; register struct obj *otmp; register struct monst *mtmp2; if(!M_Wants(mask)) return(STRAT_NONE); otyp = which_arti(mask); if(!mon_has_arti(mtmp, otyp)) { if(you_have(mask)) return(STRAT(STRAT_PLAYER, u.ux, u.uy, mask)); else if((otmp = on_ground(otyp))) return(STRAT(STRAT_GROUND, otmp->ox, otmp->oy, mask)); else if((mtmp2 = other_mon_has_arti(mtmp, otyp))) return(STRAT(STRAT_MONSTR, mtmp2->mx, mtmp2->my, mask)); } return(STRAT_NONE); } STATIC_OVL long strategy(mtmp) register struct monst *mtmp; { 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 */ default: case 0: /* panic time - mtmp is almost snuffed */ return(STRAT_HEAL); case 1: /* the wiz is less cautious */ if(mtmp->data != &mons[PM_WIZARD_OF_YENDOR]) return(STRAT_HEAL); /* else fall through */ case 2: dstrat = STRAT_HEAL; break; case 3: dstrat = STRAT_NONE; break; } if(flags.made_amulet) if((strat = target_on(M3_WANTSAMUL, mtmp)) != STRAT_NONE) return(strat); if(u.uevent.invoked) { /* priorities change once gate opened */ if((strat = target_on(M3_WANTSARTI, mtmp)) != STRAT_NONE) return(strat); if((strat = target_on(M3_WANTSBOOK, mtmp)) != STRAT_NONE) return(strat); if((strat = target_on(M3_WANTSBELL, mtmp)) != STRAT_NONE) return(strat); if((strat = target_on(M3_WANTSCAND, mtmp)) != STRAT_NONE) return(strat); } else { if((strat = target_on(M3_WANTSBOOK, mtmp)) != STRAT_NONE) return(strat); if((strat = target_on(M3_WANTSBELL, mtmp)) != STRAT_NONE) return(strat); if((strat = target_on(M3_WANTSCAND, mtmp)) != STRAT_NONE) return(strat); if((strat = target_on(M3_WANTSARTI, mtmp)) != STRAT_NONE) return(strat); } return(dstrat); } int tactics(mtmp) register struct monst *mtmp; { long strat = strategy(mtmp); mtmp->mstrategy = (mtmp->mstrategy & STRAT_WAITMASK) | strat; switch (strat) { case STRAT_HEAL: /* hide and recover */ /* if wounded, hole up on or near the stairs (to block them) */ /* unless, of course, there are no stairs (e.g. endlevel) */ mtmp->mavenge = 1; /* covetous monsters attack while fleeing */ if (In_W_tower(mtmp->mx, mtmp->my, &u.uz) || (mtmp->iswiz && !xupstair && !mon_has_amulet(mtmp))) { if (!rn2(3 + mtmp->mhp/10)) (void) rloc(mtmp, FALSE); } else if (xupstair && (mtmp->mx != xupstair || mtmp->my != yupstair)) { (void) mnearto(mtmp, xupstair, yupstair, TRUE); } /* if you're not around, cast healing spells */ if (distu(mtmp->mx,mtmp->my) > (BOLT_LIM * BOLT_LIM)) if(mtmp->mhp <= mtmp->mhpmax - 8) { mtmp->mhp += rnd(8); return(1); } /* fall through :-) */ case STRAT_NONE: /* harrass */ if (!rn2(!mtmp->mflee ? 5 : 33)) mnexto(mtmp); return(0); default: /* kill, maim, pillage! */ { long where = (strat & STRAT_STRATMASK); xchar tx = STRAT_GOALX(strat), ty = STRAT_GOALY(strat); int targ = strat & STRAT_GOAL; struct obj *otmp; if(!targ) { /* simply wants you to close */ return(0); } if((u.ux == tx && u.uy == ty) || where == STRAT_PLAYER) { /* player is standing on it (or has it) */ mnexto(mtmp); 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->mx, 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, FALSE); return(0); } } } /*NOTREACHED*/ return(0); } void aggravate() { register struct monst *mtmp; for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) if (!DEADMONSTER(mtmp)) { mtmp->msleeping = 0; if(!mtmp->mcanmove && !rn2(5)) { mtmp->mfrozen = 0; mtmp->mcanmove = 1; } } } void clonewiz() { register struct monst *mtmp2; if ((mtmp2 = makemon(&mons[PM_WIZARD_OF_YENDOR], u.ux, u.uy, NO_MM_FLAGS)) != 0) { mtmp2->msleeping = mtmp2->mtame = mtmp2->mpeaceful = 0; if (!u.uhave.amulet && rn2(2)) { /* give clone a fake */ (void) add_to_minv(mtmp2, mksobj(FAKE_AMULET_OF_YENDOR, TRUE, FALSE)); } mtmp2->m_ap_type = M_AP_MONSTER; mtmp2->mappearance = wizapp[rn2(SIZE(wizapp))]; newsym(mtmp2->mx,mtmp2->my); } } /* also used by newcham() */ int pick_nasty() { /* To do? Possibly should filter for appropriate forms when in the elemental planes or surrounded by water or lava. */ return nasties[rn2(SIZE(nasties))]; } /* 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((struct monst *) 0); /* summons like WoY */ 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++) { int makeindex; /* Don't create more spellcasters of the monsters' level or * higher--avoids chain summoners filling up the level. */ do { makeindex = pick_nasty(); } while(mcast && attacktype(&mons[makeindex], AT_MAGC) && monstr[makeindex] >= monstr[mcast->mnum]); /* do this after picking the monster to place */ if (mcast && !enexto(&bypos, mcast->mux, mcast->muy, &mons[makeindex])) continue; if ((mtmp = makemon(&mons[makeindex], 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. */ void resurrect() { struct monst *mtmp, **mmtmp; long elapsed; const char *verb; if (!flags.no_of_wizards) { /* make a new Wizard */ verb = "kill"; mtmp = makemon(&mons[PM_WIZARD_OF_YENDOR], u.ux, u.uy, MM_NOWAIT); } else { /* look for a migrating Wizard */ verb = "elude"; mmtmp = &migrating_mons; while ((mtmp = *mmtmp) != 0) { if (mtmp->iswiz && /* if he has the Amulet, he won't bring it to you */ !mon_has_amulet(mtmp) && (elapsed = monstermoves - mtmp->mlstmv) > 0L) { mon_catchup_elapsed_time(mtmp, elapsed); if (elapsed >= LARGEST_INT) elapsed = LARGEST_INT - 1; elapsed /= 50L; if (mtmp->msleeping && rn2((int)elapsed + 1)) mtmp->msleeping = 0; if (mtmp->mfrozen == 1) /* would unfreeze on next move */ mtmp->mfrozen = 0, mtmp->mcanmove = 1; if (mtmp->mcanmove && !mtmp->msleeping) { *mmtmp = mtmp->nmon; mon_arrive(mtmp, TRUE); /* note: there might be a second Wizard; if so, he'll have to wait til the next resurrection */ break; } } mmtmp = &mtmp->nmon; } } if (mtmp) { mtmp->msleeping = mtmp->mtame = mtmp->mpeaceful = 0; set_malign(mtmp); pline("A voice booms out..."); verbalize("So thou thought thou couldst %s me, fool.", verb); } } /* Here, we make trouble for the poor shmuck who actually */ /* managed to do in the Wizard. */ void intervene() { int which = Is_astralevel(&u.uz) ? rnd(4) : rn2(6); /* cases 0 and 5 don't apply on the Astral level */ switch (which) { case 0: case 1: You_feel("vaguely nervous."); break; case 2: if (!Blind) You("notice a %s glow surrounding you.", hcolor(NH_BLACK)); rndcurse(); break; case 3: aggravate(); break; case 4: (void)nasty((struct monst *)0); break; case 5: resurrect(); break; } } void wizdead() { flags.no_of_wizards--; if (!u.uevent.udemigod) { u.uevent.udemigod = TRUE; u.udg_cnt = rn1(250, 50); } } const char * const random_insult[] = { "antic", "blackguard", "caitiff", "chucklehead", "coistrel", "craven", "cretin", "cur", "dastard", "demon fodder", "dimwit", "dolt", "fool", "footpad", "imbecile", "knave", "maledict", "miscreant", "niddering", "poltroon", "rattlepate", "reprobate", "scapegrace", "varlet", "villein", /* (sic.) */ "wittol", "worm", "wretch", }; const char * const random_malediction[] = { "Hell shall soon claim thy remains,", "I chortle at thee, thou pathetic", "Prepare to die, thou", "Resistance is useless,", "Surrender or die, thou", "There shall be no mercy, thou", "Thou shalt repent of thy cunning,", "Thou art as a flea to me,", "Thou art doomed,", "Thy fate is sealed,", "Verily, thou shalt be one dead" }; /* Insult or intimidate the player */ void cuss(mtmp) register struct monst *mtmp; { if (mtmp->iswiz) { if (!rn2(5)) /* typical bad guy action */ pline("%s laughs fiendishly.", Monnam(mtmp)); else if (u.uhave.amulet && !rn2(SIZE(random_insult))) verbalize("Relinquish the amulet, %s!", random_insult[rn2(SIZE(random_insult))]); else if (u.uhp < 5 && !rn2(2)) /* Panic */ verbalize(rn2(2) ? "Even now thy life force ebbs, %s!" : "Savor thy breath, %s, it be thy last!", random_insult[rn2(SIZE(random_insult))]); else if (mtmp->mhp < 5 && !rn2(2)) /* Parthian shot */ verbalize(rn2(2) ? "I shall return." : "I'll be back."); else verbalize("%s %s!", random_malediction[rn2(SIZE(random_malediction))], random_insult[rn2(SIZE(random_insult))]); } else if(is_lminion(mtmp)) { com_pager(rn2(QTN_ANGELIC - 1 + (Hallucination ? 1 : 0)) + QT_ANGELIC); } else { if (!rn2(5)) pline("%s casts aspersions on your ancestry.", Monnam(mtmp)); else com_pager(rn2(QTN_DEMONIC) + QT_DEMONIC); } } #endif /* OVLB */ /*wizard.c*/ slashem-0.0.7E7F3/src/exper.c0000664000076400007640000002474710545462317013750 0ustar aliali/* SCCS Id: @(#)exper.c 3.4 2002/11/20 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" /*STATIC_DCL*/ long FDECL(newuexp, (int)); STATIC_DCL int FDECL(enermod, (int)); /*STATIC_OVL*/ long newuexp(lev) int lev; { /* KMH, balance patch -- changed again! */ if (lev < 9) return (20L * (1L << lev)); if (lev < 13) return (10000L * (1L << (lev - 9))); if (lev == 13) return (150000L); return (50000L * ((long)(lev - 9))); /* Old XP routine */ /* if (lev < 10) return (10L * (1L << lev)); */ /* if (lev < 20) return (10000L * (1L << (lev - 10))); */ /* return (10000000L * ((long)(lev - 19))); */ /* if (lev == 1) return (75L); if (lev == 2) return (150L); if (lev == 3) return (300L); if (lev == 4) return (600L); if (lev == 5) return (1200L); */ #if 0 if (lev == 1) return (50L); /* need 50 */ if (lev == 2) return (100L); /* need 50 */ if (lev == 3) return (200L); /* need 100 */ if (lev == 4) return (500L); /* need 300 */ if (lev == 5) return (1000L); /* need 500 */ if (lev == 6) return (1750L); /* need 750 */ if (lev == 7) return (2750L); /* need 1000 */ if (lev == 8) return (4250L); /* need 1500 */ if (lev == 9) return (6250L); /* need 2000 */ if (lev == 10) return (8750L); /* need 2500 */ if (lev == 11) return (11750L); /* need 3000 */ if (lev == 12) return (15500L); /* need 3750 */ if (lev == 13) return (20000L); /* need 4500 */ if (lev == 14) return (25000L); /* need 5000 */ if (lev == 15) return (31000L); /* need 6000 */ if (lev == 16) return (38500L); /* need 7500 */ if (lev == 17) return (48000L); /* need 9500 */ if (lev == 18) return (60000L); /* need 12000 */ if (lev == 19) return (76000L); /* need 16000 */ if (lev == 20) return (97000L); /* need 21000 */ if (lev == 21) return (125000L); /* need 28000 +7 */ if (lev == 22) return (163000L); /* need 38000 +10 */ if (lev == 23) return (213000L); /* need 50000 +12 */ if (lev == 24) return (279000L); /* need 66000 +16 */ if (lev == 25) return (365000L); /* need 86000 + 20 */ if (lev == 26) return (476000L); /* need 111000 + 25 */ if (lev == 27) return (617000L); /* need 141000+ 30 */ if (lev == 28) return (798000L); /* need 181000 + 40 */ if (lev == 29) return (1034000L); /* need 236000 + 55 */ return (1750000L); #endif } STATIC_OVL int enermod(en) int en; { switch (Role_switch) { /* WAC 'F' and 'I' get bonus similar to 'W' */ case PM_FLAME_MAGE: case PM_ICE_MAGE: case PM_PRIEST: case PM_WIZARD: return(2 * en); case PM_HEALER: case PM_KNIGHT: return((3 * en) / 2); case PM_BARBARIAN: case PM_VALKYRIE: return((3 * en) / 4); default: return (en); } } int experience(mtmp, nk) /* return # of exp points for mtmp after nk killed */ register struct monst *mtmp; register int nk; #if defined(MAC_MPW) # pragma unused(nk) #endif { register struct permonst *ptr = mtmp->data; int i, tmp, tmp2; tmp = 1 + mtmp->m_lev * mtmp->m_lev; /* For higher ac values, give extra experience */ if ((i = find_mac(mtmp)) < 3) tmp += (7 - i) * ((i < 0) ? 2 : 1); /* For very fast monsters, give extra experience */ if (ptr->mmove > NORMAL_SPEED) tmp += (ptr->mmove > (3*NORMAL_SPEED/2)) ? 5 : 3; /* For each "special" attack type give extra experience */ for(i = 0; i < NATTK; i++) { tmp2 = ptr->mattk[i].aatyp; if(tmp2 > AT_BUTT) { if(tmp2 == AT_WEAP) tmp += 5; else if(tmp2 == AT_MAGC) tmp += 10; else tmp += 3; } } /* For each "special" damage type give extra experience */ for(i = 0; i < NATTK; i++) { tmp2 = ptr->mattk[i].adtyp; if(tmp2 > AD_PHYS && tmp2 < AD_BLND) tmp += 2*mtmp->m_lev; else if((tmp2 == AD_DRLI) || (tmp2 == AD_STON) || (tmp2 == AD_SLIM)) tmp += 50; else if(tmp != AD_PHYS) tmp += mtmp->m_lev; /* extra heavy damage bonus */ if((int)(ptr->mattk[i].damd * ptr->mattk[i].damn) > 23) tmp += mtmp->m_lev; if (tmp2 == AD_WRAP && ptr->mlet == S_EEL && !Amphibious) tmp += 1000; } /* For certain "extra nasty" monsters, give even more */ if (extra_nasty(ptr)) tmp += (7 * mtmp->m_lev); /* For higher level monsters, an additional bonus is given */ if(mtmp->m_lev > 8) tmp += 50; #ifdef MAIL /* Mail daemons put up no fight. */ if(mtmp->data == &mons[PM_MAIL_DAEMON]) tmp = 1; #endif return(tmp); } void more_experienced(exp, rexp) register int exp, rexp; { u.uexp += exp; u.urexp += 4*exp + rexp; if(exp #ifdef SCORE_ON_BOTL || flags.showscore #endif ) flags.botl = 1; if (u.urexp >= (Role_if(PM_WIZARD) ? 1000 : 2000)) flags.beginner = 0; } void losexp(drainer,force) /* e.g., hit by drain life attack */ const char *drainer; /* cause of death, if drain should be fatal */ boolean force; /* Force the loss of an experience level */ { register int num; #ifdef WIZARD /* explicit wizard mode requests to reduce level are never fatal. */ if (drainer && !strcmp(drainer, "#levelchange")) drainer = 0; #endif if (!force && Drain_resistance) return; if (u.ulevel > 1) { pline("%s level %d.", Goodbye(), u.ulevel--); /* remove intrinsic abilities */ adjabil(u.ulevel + 1, u.ulevel); reset_rndmonst(NON_PM); /* new monster selection */ } else { if (drainer) { killer_format = KILLED_BY; killer = drainer; done(DIED); } /* no drainer or lifesaved */ u.uexp = 0; } num = newhp(); u.uhpmax -= num; if (u.uhpmax < 1) u.uhpmax = 1; u.uhp -= num; if (u.uhp < 1) u.uhp = 1; 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; u.uen -= num; if (u.uen < 0) u.uen = 0; else if (u.uen > u.uenmax) u.uen = u.uenmax; if (u.uexp > 0) u.uexp = newuexp(u.ulevel) - 1; flags.botl = 1; } /* * Make experience gaining similar to AD&D(tm), whereby you can at most go * up by one level at a time, extra expr possibly helping you along. * After all, how much real experience does one get shooting a wand of death * at a dragon created with a wand of polymorph?? */ void newexplevel() { if (u.ulevel < MAXULEV && u.uexp >= newuexp(u.ulevel)) pluslvl(TRUE); } #if 0 /* The old newexplevel() */ { register int tmp; if(u.ulevel < MAXULEV && u.uexp >= newuexp(u.ulevel)) { u.ulevel++; if (u.ulevelmax < u.ulevel) u.ulevelmax = u.ulevel; /* KMH */ if (u.uexp >= newuexp(u.ulevel)) u.uexp = newuexp(u.ulevel) - 1; pline("Welcome to experience level %d.", u.ulevel); /* give new intrinsics */ adjabil(u.ulevel - 1, u.ulevel); reset_rndmonst(NON_PM); /* new monster selection */ /* STEPHEN WHITE'S NEW CODE */ tmp = newhp(); u.uhpmax += tmp; u.uhp += tmp; switch (Role_switch) { case PM_ARCHEOLOGIST: u.uenbase += rnd(4) + 1; break; case PM_BARBARIAN: u.uenbase += rnd(2); break; case PM_CAVEMAN: u.uenbase += rnd(2); break; case PM_DOPPELGANGER: u.uenbase += rnd(5) + 1; break; case PM_ELF: case PM_DROW: u.uenbase += rnd(5) + 1; break; case PM_FLAME_MAGE: u.uenbase += rnd(6) + 2; break; case PM_GNOME: u.uenbase += rnd(3); break; case PM_HEALER: u.uenbase += rnd(6) + 2; break; case PM_ICE_MAGE: u.uenbase += rnd(6) + 2; break; #ifdef YEOMAN case PM_YEOMAN: #endif case PM_KNIGHT: u.uenbase += rnd(3); break; case PM_HUMAN_WEREWOLF: u.uenbase += rnd(5) + 1; break; case PM_MONK: u.uenbase += rnd(5) + 1; break; case PM_NECROMANCER: u.uenbase += rnd(6) + 2; break; case PM_PRIEST: u.uenbase += rnd(6) + 2; break; case PM_ROGUE: u.uenbase += rnd(4) + 1; break; case PM_SAMURAI: u.uenbase += rnd(2); break; #ifdef TOURIST case PM_TOURIST: u.uenbase += rnd(4) + 1; break; #endif case PM_UNDEAD_SLAYER: u.uenbase += rnd(3); break; case PM_VALKYRIE: u.uenbase += rnd(2); break; case PM_WIZARD: u.uenbase += rnd(6) + 2; break; default: u.uenbase += rnd(2) + 1; break; } flags.botl = 1; } } #endif /* old newexplevel() */ void pluslvl(incr) boolean incr; /* true iff via incremental experience growth */ { /* (false for potion of gain level) */ register int num; if (!incr) You_feel("more experienced."); 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; if(u.ulevel < MAXULEV) { if (incr) { long tmp = newuexp(u.ulevel + 1); if (u.uexp >= tmp) u.uexp = tmp - 1; } else { u.uexp = newuexp(u.ulevel); } ++u.ulevel; if (u.ulevelmax < u.ulevel) u.ulevelmax = u.ulevel; pline("Welcome to experience level %d.", u.ulevel); adjabil(u.ulevel - 1, u.ulevel); /* give new intrinsics */ reset_rndmonst(NON_PM); /* new monster selection */ } flags.botl = 1; } /* compute a random amount of experience points suitable for the hero's experience level: base number of points needed to reach the current level plus a random portion of what it takes to get to the next level */ long rndexp(gaining) boolean gaining; /* gaining XP via potion vs setting XP for polyself */ { long minexp, maxexp, diff, factor, result; minexp = (u.ulevel == 1) ? 0L : newuexp(u.ulevel - 1); maxexp = newuexp(u.ulevel); diff = maxexp - minexp, factor = 1L; /* make sure that `diff' is an argument which rn2() can handle */ while (diff >= (long)LARGEST_INT) diff /= 2L, factor *= 2L; result = minexp + factor * (long)rn2((int)diff); /* 3.4.1: if already at level 30, add to current experience points rather than to threshold needed to reach the current level; otherwise blessed potions of gain level can result in lowering the experience points instead of raising them */ if (u.ulevel == MAXULEV && gaining) { result += (u.uexp - minexp); /* avoid wrapping (over 400 blessed potions needed for that...) */ if (result < u.uexp) result = u.uexp; } return result; } /*exper.c*/ slashem-0.0.7E7F3/src/do_wear.c0000644000076400007640000016741710545462317014245 0ustar aliali/* SCCS Id: @(#)do_wear.c 3.4 2003/11/14 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" #ifndef OVLB STATIC_DCL long takeoff_mask, taking_off; #else /* OVLB */ STATIC_OVL NEARDATA long takeoff_mask = 0L; static NEARDATA long 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)"; static NEARDATA const char c_armor[] = "armor", c_suit[] = "suit", #ifdef TOURIST c_shirt[] = "shirt", #endif c_cloak[] = "cloak", c_gloves[] = "gloves", c_boots[] = "boots", c_helmet[] = "helmet", c_shield[] = "shield", c_weapon[] = "weapon", c_sword[] = "sword", c_axe[] = "axe", c_that_[] = "that"; static NEARDATA const long takeoff_order[] = { WORN_BLINDF, W_WEP, WORN_SHIELD, WORN_GLOVES, LEFT_RING, RIGHT_RING, WORN_CLOAK, WORN_HELMET, WORN_AMUL, WORN_ARMOR, #ifdef TOURIST WORN_SHIRT, #endif WORN_BOOTS, W_SWAPWEP, W_QUIVER, 0L }; STATIC_DCL void FDECL(on_msg, (struct obj *)); STATIC_DCL void FDECL(Ring_off_or_gone, (struct obj *, BOOLEAN_P)); STATIC_PTR int FDECL(select_off, (struct obj *)); STATIC_DCL struct obj *NDECL(do_takeoff); STATIC_PTR int NDECL(take_off); STATIC_DCL int FDECL(menu_remarm, (int)); STATIC_DCL void FDECL(already_wearing, (const char*)); STATIC_DCL void FDECL(already_wearing2, (const char*, const char*)); void off_msg(otmp) register struct obj *otmp; { if(flags.verbose) You("were wearing %s.", doname(otmp)); } /* for items that involve no delay */ STATIC_OVL void 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); } } /* * The Type_on() functions should be called *after* setworn(). * The Type_off() functions call setworn() themselves. */ int Boots_on() { long oldprop = u.uprops[objects[uarmf->otyp].oc_oprop].extrinsic & ~WORN_BOOTS; switch(uarmf->otyp) { case LOW_BOOTS: case IRON_SHOES: case HIGH_BOOTS: case JUMPING_BOOTS: case KICKING_BOOTS: break; case WATER_WALKING_BOOTS: if (u.uinwater) spoteffects(TRUE); break; case SPEED_BOOTS: /* Speed boots are still better than intrinsic speed, */ /* though not better than potion speed */ if (!oldprop && !(HFast & TIMEOUT)) { makeknown(uarmf->otyp); You_feel("yourself speed up%s.", (oldprop || HFast) ? " a bit more" : ""); } break; case ELVEN_BOOTS: if (!oldprop && !HStealth && !BStealth) { makeknown(uarmf->otyp); You("walk very quietly."); } break; case FUMBLE_BOOTS: if (!oldprop && !(HFumbling & ~TIMEOUT)) incr_itimeout(&HFumbling, rnd(20)); break; case LEVITATION_BOOTS: if (!oldprop && !HLevitation) { makeknown(uarmf->otyp); float_up(); spoteffects(FALSE); } break; default: impossible(unknown_type, c_boots, uarmf->otyp); } return 0; } int Boots_off() { int otyp = uarmf->otyp; long oldprop = u.uprops[objects[otyp].oc_oprop].extrinsic & ~WORN_BOOTS; takeoff_mask &= ~W_ARMF; /* For levitation, float_down() returns if Levitation, so we * must do a setworn() _before_ the levitation case. */ 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."); } break; case FUMBLE_BOOTS: if (!oldprop && !(HFumbling & ~TIMEOUT)) HFumbling = EFumbling = 0; break; case LEVITATION_BOOTS: if (!oldprop && !HLevitation && !cancelled_don) { (void) float_down(0L, 0L); makeknown(otyp); } break; case LOW_BOOTS: case IRON_SHOES: case HIGH_BOOTS: case JUMPING_BOOTS: case KICKING_BOOTS: break; default: impossible(unknown_type, c_boots, otyp); } cancelled_don = FALSE; return 0; } int Cloak_on() { long oldprop = u.uprops[objects[uarmc->otyp].oc_oprop].extrinsic & ~WORN_CLOAK; switch(uarmc->otyp) { case ELVEN_CLOAK: case CLOAK_OF_PROTECTION: case CLOAK_OF_DISPLACEMENT: makeknown(uarmc->otyp); break; case ORCISH_CLOAK: case DWARVISH_CLOAK: case CLOAK_OF_MAGIC_RESISTANCE: case ROBE: case LEATHER_CLOAK: /* KMH, balance patch -- removed case CLOAK_OF_DRAIN_RESISTANCE: */ break; /* KMH, balance patch -- lab coat gives poison _and_ acid resistance */ case LAB_COAT: EAcid_resistance |= WORN_CLOAK; break; case MUMMY_WRAPPING: /* Note: it's already being worn, so we have to cheat here. */ if ((HInvis || EInvis || pm_invisible(youmonst.data)) && !Blind) { newsym(u.ux,u.uy); You("can %s!", See_invisible ? "no longer see through yourself" : see_yourself); } break; case CLOAK_OF_INVISIBILITY: /* since cloak of invisibility was worn, we know mummy wrapping wasn't, so no need to check `oldprop' against blocked */ if (!oldprop && !HInvis && !Blind) { makeknown(uarmc->otyp); newsym(u.ux,u.uy); pline("Suddenly you can%s yourself.", See_invisible ? " see through" : "not see"); } break; case POISONOUS_CLOAK: if (Poison_resistance) pline("This cloak feels a little itchy."); else { makeknown(uarmc->otyp); poisoned("cloak",A_STR,"poisonous cloak",3); } break; case OILSKIN_CLOAK: pline("%s very tightly.", Tobjnam(uarmc, "fit")); break; /* Alchemy smock gives poison _and_ acid resistance */ #if 0 case ALCHEMY_SMOCK: EAcid_resistance |= WORN_CLOAK; break; #endif default: impossible(unknown_type, c_cloak, uarmc->otyp); } return 0; } int Cloak_off() { int otyp = uarmc->otyp; long oldprop = u.uprops[objects[otyp].oc_oprop].extrinsic & ~WORN_CLOAK; takeoff_mask &= ~W_ARMC; /* For mummy wrapping, taking it off first resets `Invisible'. */ setworn((struct obj *)0, W_ARMC); switch (otyp) { case ELVEN_CLOAK: case ORCISH_CLOAK: case DWARVISH_CLOAK: case CLOAK_OF_PROTECTION: case CLOAK_OF_MAGIC_RESISTANCE: case CLOAK_OF_DISPLACEMENT: case POISONOUS_CLOAK: case OILSKIN_CLOAK: case ROBE: case LEATHER_CLOAK: /* KMH, balance patch -- removed case CLOAK_OF_DRAIN_RESISTANCE: */ break; /* KMH, balance patch -- lab coat gives poison _and_ acid resistance */ case LAB_COAT: EAcid_resistance &= ~WORN_CLOAK; break; case MUMMY_WRAPPING: if (Invis && !Blind) { newsym(u.ux,u.uy); You("can %s.", See_invisible ? "see through yourself" : "no longer see yourself"); } break; case CLOAK_OF_INVISIBILITY: if (!oldprop && !HInvis && !Blind) { makeknown(CLOAK_OF_INVISIBILITY); newsym(u.ux,u.uy); pline("Suddenly you can %s.", See_invisible ? "no longer see through yourself" : see_yourself); } break; #if 0 /* Alchemy smock gives poison _and_ acid resistance */ case ALCHEMY_SMOCK: EAcid_resistance &= ~WORN_CLOAK; break; #endif default: impossible(unknown_type, c_cloak, otyp); } return 0; } int Helmet_on() { switch(uarmh->otyp) { case FEDORA: set_moreluck(); flags.botl = 1; break; case HELMET: case DENTED_POT: case ELVEN_LEATHER_HELM: case DWARVISH_IRON_HELM: case ORCISH_HELM: /* KMH, balance patch -- removed case FIRE_HELMET: */ case HELM_OF_TELEPATHY: break; case HELM_OF_BRILLIANCE: adj_abon(uarmh, uarmh->spe); break; case CORNUTHAUM: /* people think marked wizards know what they're talking * about, but it takes trained arrogance to pull it off, * and the actual enchantment of the hat is irrelevant. */ ABON(A_CHA) += (Role_if(PM_WIZARD) ? 1 : -1); flags.botl = 1; makeknown(uarmh->otyp); break; case HELM_OF_OPPOSITE_ALIGNMENT: if (u.ualign.type == A_NEUTRAL) u.ualign.type = rn2(2) ? A_CHAOTIC : A_LAWFUL; else u.ualign.type = -(u.ualign.type); u.ublessed = 0; /* lose your god's protection */ /* makeknown(uarmh->otyp); -- moved below, after xname() */ /*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(NH_BLACK)); curse(uarmh); } flags.botl = 1; /* reveal new alignment or INT & WIS */ if (Hallucination) { pline("My brain hurts!"); /* Monty Python's Flying Circus */ } else if (uarmh->otyp == DUNCE_CAP) { You_feel("%s.", /* track INT change; ignore WIS */ ACURR(A_INT) <= (ABASE(A_INT) + ABON(A_INT) + ATEMP(A_INT)) ? "like sitting in a corner" : "giddy"); } else { Your("mind oscillates briefly."); makeknown(HELM_OF_OPPOSITE_ALIGNMENT); } break; default: impossible(unknown_type, c_helmet, uarmh->otyp); } return 0; } int Helmet_off() { takeoff_mask &= ~W_ARMH; switch(uarmh->otyp) { case FEDORA: setworn((struct obj *)0, W_ARMH); set_moreluck(); flags.botl = 1; return 0; case HELMET: case DENTED_POT: case ELVEN_LEATHER_HELM: case DWARVISH_IRON_HELM: case ORCISH_HELM: /* KMH, balance patch -- removed case FIRE_HELMET: */ 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; } int Gloves_on() { long oldprop = u.uprops[objects[uarmg->otyp].oc_oprop].extrinsic & ~WORN_GLOVES; switch(uarmg->otyp) { case LEATHER_GLOVES: break; case GAUNTLETS_OF_SWIMMING: if (u.uinwater) { pline("Hey! You can swim!"); spoteffects(TRUE); } break; case GAUNTLETS_OF_FUMBLING: if (!oldprop && !(HFumbling & ~TIMEOUT)) incr_itimeout(&HFumbling, rnd(20)); 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); } return 0; } int Gloves_off() { long oldprop = u.uprops[objects[uarmg->otyp].oc_oprop].extrinsic & ~WORN_GLOVES; takeoff_mask &= ~W_ARMG; switch(uarmg->otyp) { case LEATHER_GLOVES: break; case GAUNTLETS_OF_SWIMMING: if (u.uinwater) { You("begin to thrash about!"); spoteffects(TRUE); } 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; (void) encumber_msg(); /* immediate feedback for GoP */ /* 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(killer_cxname(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(killer_cxname(uswapwep, TRUE))); instapetrify(kbuf); uswapwepgone(); /* lifesaved still doesn't allow touching cockatrice */ } return 0; } int Shield_on() { /* switch (uarms->otyp) { case SMALL_SHIELD: case ELVEN_SHIELD: case URUK_HAI_SHIELD: case ORCISH_SHIELD: case DWARVISH_ROUNDSHIELD: case LARGE_SHIELD: case SHIELD_OF_REFLECTION: break; default: impossible(unknown_type, c_shield, uarms->otyp); } */ return 0; } int Shield_off() { takeoff_mask &= ~W_ARMS; /* switch (uarms->otyp) { case SMALL_SHIELD: case ELVEN_SHIELD: case URUK_HAI_SHIELD: case ORCISH_SHIELD: case DWARVISH_ROUNDSHIELD: case LARGE_SHIELD: case SHIELD_OF_REFLECTION: break; default: impossible(unknown_type, c_shield, uarms->otyp); } */ setworn((struct obj *)0, W_ARMS); return 0; } #ifdef TOURIST int Shirt_on() { /* switch (uarmu->otyp) { case HAWAIIAN_SHIRT: case T_SHIRT: break; default: impossible(unknown_type, c_shirt, uarmu->otyp); } */ return 0; } int Shirt_off() { takeoff_mask &= ~W_ARMU; /* switch (uarmu->otyp) { case HAWAIIAN_SHIRT: case T_SHIRT: break; default: impossible(unknown_type, c_shirt, uarmu->otyp); } */ setworn((struct obj *)0, W_ARMU); return 0; } #endif /*TOURIST*/ /* This must be done in worn.c, because one of the possible intrinsics conferred * is fire resistance, and we have to immediately set HFire_resistance in worn.c * since worn.c will check it before returning. */ int Armor_on() { /* KMH -- certain armor is obvious when worn */ switch (uarm->otyp) { case ROBE_OF_PROTECTION: case ROBE_OF_WEAKNESS: makeknown(uarm->otyp); break; } return 0; } int Armor_off() { takeoff_mask &= ~W_ARM; setworn((struct obj *)0, W_ARM); cancelled_don = FALSE; return 0; } /* The gone functions differ from the off functions in that if you die from * taking it off and have life saving, you still die. */ int Armor_gone() { takeoff_mask &= ~W_ARM; setnotworn(uarm); cancelled_don = FALSE; return 0; } void Amulet_on() { switch(uamul->otyp) { case AMULET_OF_ESP: #if 0 /* OBSOLETE */ if(uamul->oartifact == ART_MEDALLION_OF_SHIFTERS) rescham(); #endif case AMULET_OF_LIFE_SAVING: case AMULET_VERSUS_POISON: case AMULET_OF_DRAIN_RESISTANCE: case AMULET_OF_REFLECTION: case AMULET_OF_MAGICAL_BREATHING: /* KMH, balance patch -- removed case AMULET_OF_REGENERATION: case AMULET_OF_CONFLICT:*/ case FAKE_AMULET_OF_YENDOR: break; case AMULET_OF_UNCHANGING: if (Slimed) { Slimed = 0; flags.botl = 1; } break; case AMULET_OF_CHANGE: { int orig_sex = poly_gender(); if (Unchanging) break; change_sex(); /* Don't use same message as polymorph */ if (orig_sex != poly_gender()) { makeknown(AMULET_OF_CHANGE); You("are suddenly very %s!", flags.female ? "feminine" : "masculine"); flags.botl = 1; } else /* already polymorphed into single-gender monster; only 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; } /* KMH, balance patch -- removed case AMULET_OF_POLYMORPH: makeknown(AMULET_OF_POLYMORPH); You("feel rather strange."); polyself(); flags.botl = 1; pline("The amulet disintegrates!"); useup(uamul); break;*/ case AMULET_OF_STRANGULATION: makeknown(AMULET_OF_STRANGULATION); pline("It constricts your throat!"); Strangled = 6; break; case AMULET_OF_RESTFUL_SLEEP: if(uamul->blessed) { char buf[BUFSZ]; int sleeptime; makeknown(AMULET_OF_RESTFUL_SLEEP); do { getlin("How many moves do you wish to sleep for? [1-500]", buf); sleeptime = (!*buf || *buf=='\033') ? 0 : atoi(buf); } while (sleeptime < 1 || sleeptime > 500); if (sleeptime > 0) { You("sit down and fall asleep."); nomul(-sleeptime); u.usleep = 1; nomovemsg = "You wake up from your refreshing nap."; HSleeping = rnd(100); } } else HSleeping = rnd(100); break; case AMULET_OF_YENDOR: break; /* KMH, balance patch -- added */ case AMULET_VERSUS_STONE: uunstone(); break; case AMULET_OF_FLYING: if (!(EFlying & ~W_AMUL) && !is_flyer(youmonst.data)) { You_feel("like flying!"); if (!Levitation) float_up(); makeknown(AMULET_OF_FLYING); } break; } } void Amulet_off() { takeoff_mask &= ~W_AMUL; switch(uamul->otyp) { case AMULET_OF_ESP: /* need to update ability before calling see_monsters() */ #if 0 /* OBSOLETE */ if(uamul->oartifact == ART_MEDALLION_OF_SHIFTERS) restartcham(); #endif setworn((struct obj *)0, W_AMUL); see_monsters(); return; case AMULET_OF_LIFE_SAVING: case AMULET_VERSUS_POISON: case AMULET_OF_DRAIN_RESISTANCE: /* KMH, balance patch -- removed case AMULET_OF_REGENERATION: case AMULET_OF_CONFLICT:*/ /* KMH, balance patch -- added */ case AMULET_VERSUS_STONE: case AMULET_OF_REFLECTION: case AMULET_OF_CHANGE: case AMULET_OF_UNCHANGING: case FAKE_AMULET_OF_YENDOR: 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; case AMULET_OF_STRANGULATION: if (Strangled) { You("can breathe more easily!"); Strangled = 0; } break; case AMULET_OF_RESTFUL_SLEEP: setworn((struct obj *)0, W_AMUL); if (!ESleeping) HSleeping = 0; return; /* KMH, balance patch -- added */ case AMULET_OF_FLYING: setworn((struct obj *)0, W_AMUL); (void) float_down(0L, 0L); return; case AMULET_OF_YENDOR: break; } setworn((struct obj *)0, W_AMUL); return; } void Ring_on(obj) register struct obj *obj; { long oldprop = u.uprops[objects[obj->otyp].oc_oprop].extrinsic; int old_attrib, which; if (obj == uwep) setuwep((struct obj *) 0, TRUE); if (obj == uswapwep) setuswapwep((struct obj *) 0, TRUE); 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 */ if ((oldprop & W_RING) != W_RING) oldprop &= ~W_RING; switch(obj->otyp){ case RIN_TELEPORTATION: case RIN_REGENERATION: case RIN_SEARCHING: case RIN_STEALTH: case RIN_HUNGER: case RIN_AGGRAVATE_MONSTER: case RIN_POISON_RESISTANCE: case RIN_FIRE_RESISTANCE: case RIN_COLD_RESISTANCE: case RIN_SHOCK_RESISTANCE: case RIN_CONFLICT: case RIN_TELEPORT_CONTROL: case RIN_POLYMORPH: case RIN_POLYMORPH_CONTROL: /* KMH, balance patch -- now an amulet case RIN_DRAIN_RESISTANCE: */ /* KMH -- added */ case RIN_MOOD: case RIN_FREE_ACTION: case RIN_SLOW_DIGESTION: case RIN_SUSTAIN_ABILITY: case MEAT_RING: break; case RIN_SLEEPING: HSleeping = rnd(100); break; #if 0 case RIN_INDIGESTION: incr_itimeout(&HIndigestion, rnd(20)); break; #endif case RIN_WARNING: see_monsters(); break; case RIN_SEE_INVISIBLE: /* can now see invisible monsters */ set_mimic_blocking(); /* do special mimic handling */ see_monsters(); #ifdef INVISIBLE_OBJECTS see_objects(); #endif if (Invis && !oldprop && !HSee_invisible && !perceives(youmonst.data) && !Blind) { newsym(u.ux,u.uy); pline("Suddenly you are transparent, but there!"); makeknown(RIN_SEE_INVISIBLE); } break; case RIN_INVISIBILITY: if (!oldprop && !HInvis && !BInvis && !Blind) { makeknown(RIN_INVISIBILITY); newsym(u.ux,u.uy); self_invis_message(); } break; case RIN_LEVITATION: if (!oldprop && !HLevitation) { float_up(); makeknown(RIN_LEVITATION); spoteffects(FALSE); /* for sinks */ } break; case RIN_GAIN_STRENGTH: which = A_STR; goto adjust_attrib; case RIN_GAIN_CONSTITUTION: which = A_CON; goto adjust_attrib; case RIN_ADORNMENT: which = A_CHA; adjust_attrib: old_attrib = ACURR(which); ABON(which) += obj->spe; if (ACURR(which) != old_attrib || (objects[obj->otyp].oc_name_known && old_attrib != 25 && old_attrib != 3)) { flags.botl = 1; makeknown(obj->otyp); obj->known = 1; update_inventory(); } break; case RIN_GAIN_INTELLIGENCE: ABON(A_INT) += obj->spe; flags.botl = 1; if (obj->spe || objects[RIN_GAIN_INTELLIGENCE].oc_name_known) { makeknown(RIN_GAIN_INTELLIGENCE); obj->known = TRUE; } break; case RIN_GAIN_WISDOM: ABON(A_WIS) += obj->spe; flags.botl = 1; if (obj->spe || objects[RIN_GAIN_WISDOM].oc_name_known) { makeknown(RIN_GAIN_WISDOM); obj->known = TRUE; } break; case RIN_GAIN_DEXTERITY: ABON(A_DEX) += obj->spe; flags.botl = 1; if (obj->spe || objects[RIN_GAIN_DEXTERITY].oc_name_known) { makeknown(RIN_GAIN_DEXTERITY); obj->known = TRUE; } break; case RIN_INCREASE_ACCURACY: /* KMH */ u.uhitinc += obj->spe; break; case RIN_INCREASE_DAMAGE: u.udaminc += obj->spe; break; case RIN_PROTECTION_FROM_SHAPE_CHAN: rescham(); break; case RIN_PROTECTION: if (obj->spe || objects[RIN_PROTECTION].oc_name_known) { flags.botl = 1; makeknown(RIN_PROTECTION); obj->known = 1; update_inventory(); } break; } } STATIC_OVL void Ring_off_or_gone(obj,gone) register struct obj *obj; boolean gone; { long mask = (obj->owornmask & W_RING); int old_attrib, which; takeoff_mask &= ~mask; if(!(u.uprops[objects[obj->otyp].oc_oprop].extrinsic & mask)) impossible("Strange... I didn't know you had that ring."); if(gone) setnotworn(obj); else setworn((struct obj *)0, obj->owornmask); switch(obj->otyp) { case RIN_TELEPORTATION: case RIN_REGENERATION: case RIN_SEARCHING: case RIN_STEALTH: case RIN_HUNGER: case RIN_AGGRAVATE_MONSTER: case RIN_POISON_RESISTANCE: case RIN_FIRE_RESISTANCE: case RIN_COLD_RESISTANCE: case RIN_SHOCK_RESISTANCE: case RIN_CONFLICT: case RIN_TELEPORT_CONTROL: case RIN_POLYMORPH: case RIN_POLYMORPH_CONTROL: /* KMH, balance patch -- now an amulet case RIN_DRAIN_RESISTANCE: */ /* KMH, balance patch -- added */ case RIN_MOOD: case RIN_FREE_ACTION: case RIN_SLOW_DIGESTION: case RIN_SUSTAIN_ABILITY: case MEAT_RING: break; case RIN_SLEEPING: if (!ESleeping) HSleeping = 0; break; #if 0 case RIN_INDIGESTION: if (!EIndigestion) HIndigestion = 0; break; #endif case RIN_WARNING: see_monsters(); break; case RIN_SEE_INVISIBLE: /* Make invisible monsters go away */ if (!See_invisible) { set_mimic_blocking(); /* do special mimic handling */ see_monsters(); #ifdef INVISIBLE_OBJECTS see_objects(); #endif } if (Invisible && !Blind) { newsym(u.ux,u.uy); pline("Suddenly you cannot see yourself."); makeknown(RIN_SEE_INVISIBLE); } break; case RIN_INVISIBILITY: if (!Invis && !BInvis && !Blind) { newsym(u.ux,u.uy); Your("body seems to unfade%s.", See_invisible ? " completely" : ".."); makeknown(RIN_INVISIBILITY); } break; case RIN_LEVITATION: (void) float_down(0L, 0L); if (!Levitation) makeknown(RIN_LEVITATION); break; case RIN_GAIN_STRENGTH: which = A_STR; goto adjust_attrib; case RIN_GAIN_INTELLIGENCE: which = A_INT; goto adjust_attrib; case RIN_GAIN_WISDOM: which = A_WIS; goto adjust_attrib; case RIN_GAIN_DEXTERITY: which = A_DEX; goto adjust_attrib; case RIN_GAIN_CONSTITUTION: which = A_CON; goto adjust_attrib; case RIN_ADORNMENT: which = A_CHA; adjust_attrib: old_attrib = ACURR(which); ABON(which) -= obj->spe; if (ACURR(which) != old_attrib) { flags.botl = 1; makeknown(obj->otyp); obj->known = 1; update_inventory(); } break; case RIN_INCREASE_ACCURACY: /* KMH */ u.uhitinc -= obj->spe; break; case RIN_INCREASE_DAMAGE: u.udaminc -= obj->spe; break; case RIN_PROTECTION: /* might have forgotten it due to amnesia */ if (obj->spe) { flags.botl = 1; makeknown(RIN_PROTECTION); obj->known = 1; update_inventory(); } case RIN_PROTECTION_FROM_SHAPE_CHAN: /* If you're no longer protected, let the chameleons * change shape again -dgk */ restartcham(); break; } } void Ring_off(obj) struct obj *obj; { Ring_off_or_gone(obj,FALSE); } void Ring_gone(obj) struct obj *obj; { Ring_off_or_gone(obj,TRUE); } void Blindf_on(otmp) register struct obj *otmp; { long already_blind = Blind, changed = FALSE; if (otmp == uwep) setuwep((struct obj *) 0, TRUE); if (otmp == uswapwep) setuswapwep((struct obj *) 0, TRUE); 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; } } void Blindf_off(otmp) register struct obj *otmp; { boolean was_blind = Blind, changed = FALSE; takeoff_mask &= ~W_TOOL; 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 */ void set_wear() { #ifdef TOURIST if (uarmu) (void) Shirt_on(); #endif if (uarm) (void) Armor_on(); if (uarmc) (void) Cloak_on(); if (uarmf) (void) Boots_on(); if (uarmg) (void) Gloves_on(); if (uarmh) (void) Helmet_on(); if (uarms) (void) Shield_on(); } /* check whether the target object is currently being put on (or taken off) */ boolean donning(otmp) /* also checks for doffing */ register struct obj *otmp; { /* long what = (occupation == take_off) ? taking_off : 0L; */ long what = taking_off; /* if nonzero, occupation is implied */ boolean result = FALSE; if (otmp == uarm) result = (afternmv == Armor_on || afternmv == Armor_off || what == WORN_ARMOR); #ifdef TOURIST else if (otmp == uarmu) result = (afternmv == Shirt_on || afternmv == Shirt_off || what == WORN_SHIRT); #endif else if (otmp == uarmc) result = (afternmv == Cloak_on || afternmv == Cloak_off || what == WORN_CLOAK); else if (otmp == uarmf) result = (afternmv == Boots_on || afternmv == Boots_off || what == WORN_BOOTS); else if (otmp == uarmh) result = (afternmv == Helmet_on || afternmv == Helmet_off || what == WORN_HELMET); else if (otmp == uarmg) result = (afternmv == Gloves_on || afternmv == Gloves_off || what == WORN_GLOVES); else if (otmp == uarms) result = (afternmv == Shield_on || afternmv == Shield_off || what == WORN_SHIELD); return result; } void cancel_don() { /* the piece of armor we were donning/doffing has vanished, so stop * 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; todelay = 0; taking_off = 0L; } static NEARDATA const char clothes[] = {ARMOR_CLASS, 0}; static NEARDATA const char accessories[] = {RING_CLASS, AMULET_CLASS, TOOL_CLASS, FOOD_CLASS, 0}; /* the 'T' command */ int dotakeoff() { register struct obj *otmp = (struct obj *)0; int armorpieces = 0; #define MOREARM(x) if (x) { armorpieces++; otmp = x; } MOREARM(uarmh); MOREARM(uarms); MOREARM(uarmg); MOREARM(uarmf); if (uarmc) { armorpieces++; otmp = uarmc; } else if (uarm) { armorpieces++; otmp = uarm; #ifdef TOURIST } else if (uarmu) { armorpieces++; otmp = uarmu; #endif } if (!armorpieces) { /* assert( GRAY_DRAGON_SCALES > YELLOW_DRAGON_SCALE_MAIL ); */ if (uskin) pline_The("%s merged with your skin!", uskin->otyp >= GRAY_DRAGON_SCALES ? "dragon scales are" : "dragon scale mail is"); else pline("Not wearing any armor.%s", (iflags.cmdassist && (uleft || uright || uamul || ublindf)) ? " Use 'R' command to remove accessories." : ""); return 0; } if (armorpieces > 1) otmp = getobj(clothes, "take off"); if (otmp == 0) return(0); if (!(otmp->owornmask & W_ARMOR)) { You("are not wearing that."); return(0); } /* note: the `uskin' case shouldn't be able to happen here; dragons can't wear any armor so will end up with `armorpieces == 0' above */ if (otmp == uskin || ((otmp == uarm) && uarmc) #ifdef TOURIST || ((otmp == uarmu) && (uarmc || uarm)) #endif ) { You_cant("take that off."); return 0; } reset_remarm(); /* clear takeoff_mask and taking_off */ (void) select_off(otmp); if (!takeoff_mask) return 0; reset_remarm(); /* armoroff() doesn't use takeoff_mask */ (void) armoroff(otmp); return(1); } /* the 'R' command */ int doremring() { register struct obj *otmp = 0; int Accessories = 0; #define MOREACC(x) if (x) { Accessories++; otmp = x; } MOREACC(uleft); MOREACC(uright); MOREACC(uamul); MOREACC(ublindf); if(!Accessories) { pline("Not wearing any accessories.%s", (iflags.cmdassist && (uarm || uarmc || #ifdef TOURIST uarmu || #endif uarms || uarmh || uarmg || uarmf)) ? " Use 'T' command to take off armor." : ""); 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."); return(0); } reset_remarm(); /* clear takeoff_mask and taking_off */ (void) select_off(otmp); if (!takeoff_mask) return 0; reset_remarm(); /* not used by Ring_/Amulet_/Blindf_off() */ if (otmp == uright || otmp == uleft) { /* Sometimes we want to give the off_msg before removing and * sometimes after; for instance, "you were wearing a moonstone * ring (on right hand)" is desired but "you were wearing a * square amulet (being worn)" is not because of the redundant * "being worn". */ off_msg(otmp); Ring_off(otmp); } else if (otmp == uamul) { Amulet_off(); off_msg(otmp); } else if (otmp == ublindf) { Blindf_off(otmp); /* does its own off_msg */ } else { impossible("removing strange accessory?"); } return(1); } /* Check if something worn is cursed _and_ unremovable. */ int cursed(otmp) register struct obj *otmp; { /* Curses, like chickens, come home to roost. */ if((otmp == uwep) ? welded(otmp) : (int)otmp->cursed) { You("can't. %s cursed.", (is_boots(otmp) || is_gloves(otmp) || otmp->quan > 1L) ? "They are" : "It is"); otmp->bknown = TRUE; return(1); } return(0); } int armoroff(otmp) register struct obj *otmp; { register int delay = -objects[otmp->otyp].oc_delay; if(cursed(otmp)) return(0); if(delay) { nomul(delay); if (is_helmet(otmp)) { nomovemsg = "You finish taking off your helmet."; afternmv = Helmet_off; } else if (is_gloves(otmp)) { nomovemsg = "You finish taking off your gloves."; afternmv = Gloves_off; } else if (is_boots(otmp)) { nomovemsg = "You finish taking off your boots."; afternmv = Boots_off; } else { nomovemsg = "You finish taking off your suit."; afternmv = Armor_off; } } else { /* Be warned! We want off_msg after removing the item to * avoid "You were wearing ____ (being worn)." However, an * item which grants fire resistance might cause some trouble * if removed in Hell and lifesaving puts it back on; in this * case the message will be printed at the wrong time (after * the messages saying you died and were lifesaved). Luckily, * no cloak, shield, or fast-removable armor grants fire * resistance, so we can safely do the off_msg afterwards. * Rings do grant fire resistance, but for rings we want the * off_msg before removal anyway so there's no problem. Take * care in adding armors granting fire resistance; this code * might need modification. * 3.2 (actually 3.1 even): this comment is obsolete since * fire resistance is not needed for Gehennom. */ if(is_cloak(otmp)) (void) Cloak_off(); else if(is_shield(otmp)) (void) Shield_off(); else if (is_helmet(otmp)) /* [Finn E. Theodorsen] For fedoras */ (void) Helmet_off(); else setworn((struct obj *)0, otmp->owornmask & W_ARMOR); off_msg(otmp); } takeoff_mask = taking_off = 0L; return(1); } STATIC_OVL void already_wearing(cc) const char *cc; { You("are already wearing %s%c", cc, (cc == c_that_) ? '!' : '.'); } STATIC_OVL void already_wearing2(cc1, cc2) const char *cc1, *cc2; { You_cant("wear %s because you're wearing %s there already.", cc1, cc2); } /* * canwearobj checks to see whether the player can wear a piece of armor * * inputs: otmp (the piece of armor) * noisy (if TRUE give error messages, otherwise be quiet about it) * output: mask (otmp's armor type) */ int canwearobj(otmp,mask,noisy) struct obj *otmp; long *mask; boolean noisy; { int err = 0; const char *which; which = is_cloak(otmp) ? c_cloak : #ifdef TOURIST is_shirt(otmp) ? c_shirt : #endif is_suit(otmp) ? c_suit : 0; if (which && cantweararm(youmonst.data) && /* same exception for cloaks as used in m_dowear() */ (which != c_cloak || youmonst.data->msize != MZ_SMALL) && (racial_exception(&youmonst, otmp) < 1)) { if (noisy) pline_The("%s will not fit on your body.", which); return 0; } else if (otmp->owornmask & W_ARMOR) { if (noisy) already_wearing(c_that_); return 0; } if (welded(uwep) && bimanual(uwep) && (is_suit(otmp) #ifdef TOURIST || is_shirt(otmp) #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)); err++; } else if (Upolyd && has_horns(youmonst.data) && !is_flimsy(otmp)) { /* (flimsy exception matches polyself handling) */ if (noisy) pline_The("%s won't fit over your horn%s.", c_helmet, plur(num_horns(youmonst.data))); err++; } else *mask = W_ARMH; } else if (is_shield(otmp)) { if (uarms) { if (noisy) already_wearing(an(c_shield)); err++; } else if (uwep && bimanual(uwep)) { if (noisy) You("cannot wear a shield while wielding a two-handed %s.", is_sword(uwep) ? c_sword : (uwep->otyp == BATTLE_AXE) ? c_axe : c_weapon); err++; } else if (u.twoweap) { if (noisy) { if (uwep && uswapwep) You("cannot wear a shield while wielding two weapons."); else You("cannot wear a shield while fighting with two %s.", makeplural(body_part(HAND))); } err++; } else *mask = W_ARMS; } else if (is_boots(otmp)) { if (uarmf) { if (noisy) already_wearing(c_boots); err++; } else if (Upolyd && slithy(youmonst.data)) { if (noisy) You("have no feet..."); /* not body_part(FOOT) */ err++; } else if (Upolyd && youmonst.data->mlet == S_CENTAUR) { /* break_armor() pushes boots off for centaurs, so don't let dowear() put them back on... */ if (noisy) pline("You have too many hooves to wear %s.", c_boots); /* makeplural(body_part(FOOT)) yields "rear hooves" which sounds odd */ err++; } else if (u.utrap && (u.utraptype == TT_BEARTRAP || u.utraptype == TT_INFLOOR)) { if (u.utraptype == TT_BEARTRAP) { if (noisy) Your("%s is trapped!", body_part(FOOT)); } else { if (noisy) Your("%s are stuck in the %s!", makeplural(body_part(FOOT)), surface(u.ux, u.uy)); } err++; } else *mask = W_ARMF; } else if (is_gloves(otmp)) { if (uarmg) { if (noisy) already_wearing(c_gloves); err++; } else if (welded(uwep)) { if (noisy) You("cannot wear gloves over your %s.", is_sword(uwep) ? c_sword : c_weapon); err++; } else *mask = W_ARMG; #ifdef TOURIST } else if (is_shirt(otmp)) { if (uarm || uarmc || uarmu) { if (uarmu) { 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 *mask = W_ARMU; #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"); err++; } else *mask = W_ARM; } else { /* getobj can't do this after setting its allow_all flag; that happens if you have armor for slots that are covered up or extra armor for slots that are filled */ if (noisy) silly_thing("wear", otmp); err++; } /* Unnecessary since now only weapons and special items like pick-axes get * welded to your hand, not armor if (welded(otmp)) { if (!err++) { if (noisy) weldmsg(otmp); } } */ return !err; } /* the 'W' command */ int dowear() { struct obj *otmp; int delay; long mask = 0; /* cantweararm checks for suits of armor */ /* verysmall or nohands checks for shields, gloves, etc... */ if ((verysmall(youmonst.data) || nohands(youmonst.data))) { pline("Don't even bother."); return(0); } otmp = getobj(clothes, "wear"); if(!otmp) return(0); if (!canwearobj(otmp,&mask,TRUE)) return(0); if (otmp->oartifact && !touch_artifact(otmp, &youmonst)) return 1; /* costs a turn even though it didn't get worn */ if (otmp->otyp == HELM_OF_OPPOSITE_ALIGNMENT && qstart_level.dnum == u.uz.dnum) { /* in quest */ if (u.ualignbase[A_CURRENT] == u.ualignbase[A_ORIGINAL]) You("narrowly avoid losing all chance at your goal."); else /* converted */ You("are suddenly overcome with shame and change your mind."); u.ublessed = 0; /* lose your god's protection */ makeknown(otmp->otyp); flags.botl = 1; return 1; } otmp->known = TRUE; if(otmp == uwep) setuwep((struct obj *)0, TRUE); if (otmp == uswapwep) setuswapwep((struct obj *) 0, TRUE); if (otmp == uquiver) setuqwep((struct obj *) 0); setworn(otmp, mask); delay = -objects[otmp->otyp].oc_delay; if(delay){ nomul(delay); if(is_boots(otmp)) afternmv = Boots_on; if(is_helmet(otmp)) afternmv = Helmet_on; if(is_gloves(otmp)) afternmv = Gloves_on; if(otmp == uarm) afternmv = Armor_on; nomovemsg = "You finish your dressing maneuver."; } else { if(is_cloak(otmp)) (void) Cloak_on(); if (is_shield(otmp)) (void) Shield_on(); #ifdef TOURIST if (is_shirt(otmp)) (void) Shirt_on(); #endif if (is_helmet(otmp)) (void) Helmet_on(); /* fedoras */ on_msg(otmp); } takeoff_mask = taking_off = 0L; return(1); } int doputon() { register struct obj *otmp; long mask = 0L; if(uleft && uright && uamul && ublindf) { Your("%s%s are full, and you're already wearing an amulet and %s.", humanoid(youmonst.data) ? "ring-" : "", makeplural(body_part(FINGER)), 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_); return(0); } if(welded(otmp)) { weldmsg(otmp); return(0); } if(otmp == uwep) setuwep((struct obj *)0, TRUE); if(otmp == uswapwep) setuswapwep((struct obj *) 0, TRUE); 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."); return(0); } if(uleft && uright){ There("are no more %s%s to fill.", humanoid(youmonst.data) ? "ring-" : "", makeplural(body_part(FINGER))); return(0); } if(uleft) mask = RIGHT_RING; else if(uright) mask = LEFT_RING; else do { char qbuf[QBUFSZ]; char answer; Sprintf(qbuf, "Which %s%s, Right or Left?", humanoid(youmonst.data) ? "ring-" : "", body_part(FINGER)); if(!(answer = yn_function(qbuf, "rl", '\0'))) return(0); switch(answer){ case 'l': case 'L': mask = LEFT_RING; break; case 'r': case 'R': mask = RIGHT_RING; break; } } while(!mask); if (uarmg && uarmg->cursed) { uarmg->bknown = TRUE; You("cannot remove your gloves to put on the ring."); return(0); } if (welded(uwep) && bimanual(uwep)) { /* welded will set bknown */ You("cannot free your weapon hands to put on the ring."); return(0); } if (welded(uwep) && mask==RIGHT_RING) { /* welded will set bknown */ You("cannot free your weapon hand to put on the ring."); return(0); } if (otmp->oartifact && !touch_artifact(otmp, &youmonst)) return 1; /* costs a turn even though it didn't get worn */ setworn(otmp, mask); Ring_on(otmp); } else if (otmp->oclass == AMULET_CLASS) { if(uamul) { already_wearing("an amulet"); return(0); } if (otmp->oartifact && !touch_artifact(otmp, &youmonst)) return 1; setworn(otmp, W_AMUL); if (otmp->otyp == AMULET_OF_CHANGE) { Amulet_on(); /* Don't do a prinv() since the amulet is now gone */ return(1); } Amulet_on(); } else { /* it's a blindfold, towel, or lenses */ if (ublindf) { if (ublindf->otyp == TOWEL) Your("%s is already covered by a towel.", body_part(FACE)); else if (ublindf->otyp == BLINDFOLD) { if (otmp->otyp == LENSES) already_wearing2("lenses", "a blindfold"); else already_wearing("a blindfold"); } else if (ublindf->otyp == LENSES) { if (otmp->otyp == BLINDFOLD) already_wearing2("a blindfold", "some lenses"); else already_wearing("some lenses"); } else already_wearing(something); /* ??? */ return(0); } if (otmp->otyp != BLINDFOLD && otmp->otyp != TOWEL && otmp->otyp != LENSES) { You_cant("wear that!"); return(0); } if (otmp->oartifact && !touch_artifact(otmp, &youmonst)) return 1; Blindf_on(otmp); return(1); } if (is_worn(otmp)) prinv((char *)0, otmp, 0L); return(1); } #endif /* OVLB */ #ifdef OVL0 /* Limits of uac (conveniently equal to the limits of an schar ;) */ #define UAC_MIN (-128) #define UAC_LIM 127 void find_ac() { int uac = mons[u.umonnum].ac; if(uarm) uac -= ARM_BONUS(uarm); if(uarmc) uac -= ARM_BONUS(uarmc); if(uarmh) uac -= ARM_BONUS(uarmh); if(uarmf) uac -= ARM_BONUS(uarmf); if(uarms) uac -= ARM_BONUS(uarms); if(uarmg) uac -= ARM_BONUS(uarmg); #ifdef TOURIST if(uarmu) uac -= ARM_BONUS(uarmu); #endif if(uleft && uleft->otyp == RIN_PROTECTION) uac -= uleft->spe; if(uright && uright->otyp == RIN_PROTECTION) uac -= uright->spe; if (HProtection & INTRINSIC) uac -= u.ublessed; uac -= u.uspellprot; /* STEPHEN WHITE'S NEW CODE */ /* Dexterity now affects AC */ if (ACURR(A_DEX) < 4) uac += 3; else if (ACURR(A_DEX) < 6) uac += 2; else if (ACURR(A_DEX) < 8) uac += 1; else if (ACURR(A_DEX) < 14) uac -= 0; else if (ACURR(A_DEX) < 21) uac -= ACURR(A_DEX)-14; else if (ACURR(A_DEX) < 22) uac -= 6; else if (ACURR(A_DEX) < 24) uac -= 7; else uac -= 8; if (Role_if(PM_MONK) && !uwep && (!uarm || uarm->otyp==ROBE || uarm->otyp==ROBE_OF_POWER || uarm->otyp==ROBE_OF_WEAKNESS || uarm->otyp==ROBE_OF_PROTECTION) && !uarms) { /*WAC cap off the Monk's ac bonus to -11 */ if (u.ulevel > 18) uac -= 11; else uac -= (u.ulevel / 2) + 2; } if (Race_if(PM_DOPPELGANGER) && !uarm) uac -= (u.ulevel / 4) + 1; if (Race_if(PM_HUMAN_WEREWOLF) && !uarm) uac -= (u.ulevel / 4) + 1; /* Harlow - make sure it doesn't wrap around ;) */ uac = (uac < UAC_MIN ? UAC_MIN : (uac > UAC_LIM ? UAC_LIM : uac)); if(uac != u.uac){ u.uac = uac; flags.botl = 1; } } #endif /* OVL0 */ #ifdef OVLB void glibr() { register struct obj *otmp; int xfl = 0; boolean leftfall, rightfall; const char *otherwep = 0; leftfall = (uleft && !uleft->cursed && (!uwep || !welded(uwep) || !bimanual(uwep))); rightfall = (uright && !uright->cursed && (!welded(uwep))); if (!uarmg && (leftfall || rightfall) && !nolimbs(youmonst.data)) { /* changed so cursed rings don't fall off, GAN 10/30/86 */ Your("%s off your %s.", (leftfall && rightfall) ? "rings slip" : "ring slips", (leftfall && rightfall) ? makeplural(body_part(FINGER)) : body_part(FINGER)); xfl++; if (leftfall) { otmp = uleft; Ring_off(uleft); dropx(otmp); } if (rightfall) { otmp = uright; Ring_off(uright); dropx(otmp); } } otmp = uswapwep; if (u.twoweap && otmp) { otherwep = is_sword(otmp) ? c_sword : makesingular(oclass_names[(int)otmp->oclass]); Your("%s %sslips from your %s.", otherwep, xfl ? "also " : "", makeplural(body_part(HAND))); setuswapwep((struct obj *)0, FALSE); xfl++; if (otmp->otyp != LOADSTONE || !otmp->cursed) dropx(otmp); } otmp = uwep; if (otmp && !welded(otmp)) { const char *thiswep; /* nice wording if both weapons are the same type */ thiswep = is_sword(otmp) ? c_sword : makesingular(oclass_names[(int)otmp->oclass]); if (otherwep && strcmp(thiswep, otherwep)) otherwep = 0; /* changed so cursed weapons don't fall, GAN 10/30/86 */ Your("%s%s %sslips from your %s.", otherwep ? "other " : "", thiswep, xfl ? "also " : "", makeplural(body_part(HAND))); setuwep((struct obj *)0, FALSE); if (otmp->otyp != LOADSTONE || !otmp->cursed) dropx(otmp); } } struct obj * some_armor(victim) struct monst *victim; { register struct obj *otmph, *otmp; otmph = (victim == &youmonst) ? uarmc : which_armor(victim, W_ARMC); if (!otmph) otmph = (victim == &youmonst) ? uarm : which_armor(victim, W_ARM); #ifdef TOURIST if (!otmph) otmph = (victim == &youmonst) ? uarmu : which_armor(victim, W_ARMU); #endif otmp = (victim == &youmonst) ? uarmh : which_armor(victim, W_ARMH); if(otmp && (!otmph || !rn2(4))) otmph = otmp; otmp = (victim == &youmonst) ? uarmg : which_armor(victim, W_ARMG); if(otmp && (!otmph || !rn2(4))) otmph = otmp; otmp = (victim == &youmonst) ? uarmf : which_armor(victim, W_ARMF); if(otmp && (!otmph || !rn2(4))) otmph = otmp; otmp = (victim == &youmonst) ? uarms : which_armor(victim, W_ARMS); if(otmp && (!otmph || !rn2(4))) otmph = otmp; 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(); } } /* used for praying to check and fix levitation trouble */ struct obj * stuck_ring(ring, otyp) struct obj *ring; int otyp; { if (ring != uleft && ring != uright) { impossible("stuck_ring: neither left nor right?"); return (struct obj *)0; } if (ring && ring->otyp == otyp) { /* reasons ring can't be removed match those checked by select_off(); limbless case has extra checks because ordinarily it's temporary */ if (nolimbs(youmonst.data) && uamul && uamul->otyp == AMULET_OF_UNCHANGING && uamul->cursed) return uamul; if (welded(uwep) && (ring == uright || bimanual(uwep))) return uwep; if (uarmg && uarmg->cursed) return uarmg; if (ring->cursed) return ring; } /* either no ring or not right type or nothing prevents its removal */ return (struct obj *)0; } /* also for praying; find worn item that confers "Unchanging" attribute */ struct obj * unchanger() { if (uamul && uamul->otyp == AMULET_OF_UNCHANGING) return uamul; return 0; } /* occupation callback for 'A' */ STATIC_PTR int select_off(otmp) register struct obj *otmp; { struct obj *why; char buf[BUFSZ]; if (!otmp) return 0; *buf = '\0'; /* lint suppresion */ /* special ring checks */ if (otmp == uright || otmp == uleft) { if (nolimbs(youmonst.data)) { pline_The("ring is stuck."); return 0; } why = 0; /* the item which prevents ring removal */ if (welded(uwep) && (otmp == uright || bimanual(uwep))) { Sprintf(buf, "free a weapon %s", body_part(HAND)); why = uwep; } else if (uarmg && uarmg->cursed) { Sprintf(buf, "take off your %s", c_gloves); why = uarmg; } if (why) { You("cannot %s to remove the ring.", buf); why->bknown = TRUE; return 0; } } /* special glove checks */ if (otmp == uarmg) { if (welded(uwep)) { You("are unable to take off your %s while wielding that %s.", c_gloves, is_sword(uwep) ? c_sword : c_weapon); uwep->bknown = TRUE; return 0; } else if (Glib) { You_cant("take off the slippery %s with your slippery %s.", c_gloves, makeplural(body_part(FINGER))); return 0; } } /* special boot checks */ if (otmp == uarmf) { if (u.utrap && u.utraptype == TT_BEARTRAP) { pline_The("bear trap prevents you from pulling your %s out.", body_part(FOOT)); return 0; } else if (u.utrap && u.utraptype == TT_INFLOOR) { You("are stuck in the %s, and cannot pull your %s out.", surface(u.ux, u.uy), makeplural(body_part(FOOT))); return 0; } } /* special suit and shirt checks */ if (otmp == uarm #ifdef TOURIST || otmp == uarmu #endif ) { why = 0; /* the item which prevents disrobing */ if (uarmc && uarmc->cursed) { Sprintf(buf, "remove your %s", cloak_simple_name(uarmc)); why = uarmc; #ifdef TOURIST } else if (otmp == uarmu && uarm && uarm->cursed) { Sprintf(buf, "remove your %s", c_suit); why = uarm; #endif } else if (welded(uwep) && bimanual(uwep)) { Sprintf(buf, "release your %s", is_sword(uwep) ? c_sword : (uwep->otyp == BATTLE_AXE) ? c_axe : c_weapon); why = uwep; } if (why) { You("cannot %s to take off %s.", buf, the(xname(otmp))); why->bknown = TRUE; return 0; } } /* basic curse check */ if (otmp == uquiver || (otmp == uswapwep && !u.twoweap)) { ; /* some items can be removed even when cursed */ } else { /* otherwise, this is fundamental */ if (cursed(otmp)) return 0; } if(otmp == uarm) takeoff_mask |= WORN_ARMOR; else if(otmp == uarmc) takeoff_mask |= WORN_CLOAK; else if(otmp == uarmf) takeoff_mask |= WORN_BOOTS; else if(otmp == uarmg) takeoff_mask |= WORN_GLOVES; else if(otmp == uarmh) takeoff_mask |= WORN_HELMET; else if(otmp == uarms) takeoff_mask |= WORN_SHIELD; #ifdef TOURIST else if(otmp == uarmu) takeoff_mask |= WORN_SHIRT; #endif else if(otmp == uleft) takeoff_mask |= LEFT_RING; else if(otmp == uright) takeoff_mask |= RIGHT_RING; else if(otmp == uamul) takeoff_mask |= WORN_AMUL; else if(otmp == ublindf) takeoff_mask |= WORN_BLINDF; else if(otmp == uwep) takeoff_mask |= W_WEP; else if(otmp == uswapwep) takeoff_mask |= W_SWAPWEP; else if(otmp == uquiver) takeoff_mask |= W_QUIVER; else impossible("select_off: %s???", doname(otmp)); return(0); } STATIC_OVL struct obj * do_takeoff() { register struct obj *otmp = (struct obj *)0; if (taking_off == W_WEP) { if(!cursed(uwep)) { setuwep((struct obj *) 0, TRUE); You("are empty %s.", body_part(HANDED)); u.twoweap = FALSE; } } else if (taking_off == W_SWAPWEP) { setuswapwep((struct obj *) 0, TRUE); You("no longer have a second weapon readied."); u.twoweap = FALSE; } else if (taking_off == W_QUIVER) { setuqwep((struct obj *) 0); You("no longer have ammunition readied."); } else if (taking_off == WORN_ARMOR) { otmp = uarm; if(!cursed(otmp)) (void) Armor_off(); } else if (taking_off == WORN_CLOAK) { otmp = uarmc; if(!cursed(otmp)) (void) Cloak_off(); } else if (taking_off == WORN_BOOTS) { otmp = uarmf; if(!cursed(otmp)) (void) Boots_off(); } else if (taking_off == WORN_GLOVES) { otmp = uarmg; if(!cursed(otmp)) (void) Gloves_off(); } else if (taking_off == WORN_HELMET) { otmp = uarmh; if(!cursed(otmp)) (void) Helmet_off(); } else if (taking_off == WORN_SHIELD) { otmp = uarms; if(!cursed(otmp)) (void) Shield_off(); #ifdef TOURIST } else if (taking_off == WORN_SHIRT) { otmp = uarmu; if (!cursed(otmp)) (void) Shirt_off(); #endif } else if (taking_off == WORN_AMUL) { otmp = uamul; if(!cursed(otmp)) Amulet_off(); } else if (taking_off == LEFT_RING) { otmp = uleft; if(!cursed(otmp)) Ring_off(uleft); } else if (taking_off == RIGHT_RING) { 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); } static const char *disrobing = ""; STATIC_PTR int take_off() { register int i; register struct obj *otmp; if (taking_off) { if (todelay > 0) { todelay--; return(1); /* still busy */ } else { if ((otmp = do_takeoff())) off_msg(otmp); } takeoff_mask &= ~taking_off; taking_off = 0L; } for(i = 0; takeoff_order[i]; i++) if(takeoff_mask & takeoff_order[i]) { taking_off = takeoff_order[i]; break; } otmp = (struct obj *) 0; todelay = 0; if (taking_off == 0L) { You("finish %s.", disrobing); return 0; } else if (taking_off == W_WEP) { todelay = 1; } else if (taking_off == W_SWAPWEP) { todelay = 1; } else if (taking_off == W_QUIVER) { todelay = 1; } else if (taking_off == WORN_ARMOR) { otmp = uarm; /* If a cloak is being worn, add the time to take it off and put * it back on again. Kludge alert! since that time is 0 for all * known cloaks, add 1 so that it actually matters... */ if (uarmc) todelay += 2 * objects[uarmc->otyp].oc_delay + 1; } else if (taking_off == WORN_CLOAK) { otmp = uarmc; } else if (taking_off == WORN_BOOTS) { otmp = uarmf; } else if (taking_off == WORN_GLOVES) { otmp = uarmg; } else if (taking_off == WORN_HELMET) { otmp = uarmh; } else if (taking_off == WORN_SHIELD) { otmp = uarms; #ifdef TOURIST } else if (taking_off == WORN_SHIRT) { otmp = uarmu; /* add the time to take off and put back on armor and/or cloak */ if (uarm) todelay += 2 * objects[uarm->otyp].oc_delay; if (uarmc) todelay += 2 * objects[uarmc->otyp].oc_delay + 1; #endif } else if (taking_off == WORN_AMUL) { todelay = 1; } else if (taking_off == LEFT_RING) { todelay = 1; } else if (taking_off == RIGHT_RING) { todelay = 1; } else if (taking_off == WORN_BLINDF) { todelay = 2; } else { impossible("take_off: taking off %lx", taking_off); return 0; /* force done */ } if (otmp) todelay += objects[otmp->otyp].oc_delay; /* Since setting the occupation now starts the counter next move, that * would always produce a delay 1 too big per item unless we subtract * 1 here to account for it. */ if (todelay > 0) todelay--; set_occupation(take_off, disrobing, 0); return(1); /* get busy */ } /* clear saved context to avoid inappropriate resumption of interrupted 'A' */ void reset_remarm() { taking_off = takeoff_mask = 0L; disrobing = nul; } /* the 'A' command -- remove multiple worn items */ int doddoremarm() { int result = 0; if (taking_off || takeoff_mask) { You("continue %s.", disrobing); set_occupation(take_off, disrobing, 0); return 0; } else if (!uwep && !uswapwep && !uquiver && !uamul && !ublindf && !uleft && !uright && !wearing_armor()) { You("are not wearing anything."); return 0; } 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) { /* default activity for armor and/or accessories, possibly combined with weapons */ disrobing = "disrobing"; /* specific activity when handling weapons only */ if (!(takeoff_mask & ~(W_WEP|W_SWAPWEP|W_QUIVER))) disrobing = "disarming"; (void) take_off(); } /* The time to perform the command is already completely accounted for * in take_off(); if we return 1, that would add an extra turn to each * disrobe. */ return 0; } STATIC_OVL int menu_remarm(retry) int retry; { int n, i = 0; menu_item *pick_list; boolean all_worn_categories = TRUE; if (retry) { all_worn_categories = (retry == -2); } else if (flags.menu_style == MENU_FULL) { all_worn_categories = FALSE; n = query_category("What type of things do you want to take off?", invent, WORN_TYPES|ALL_TYPES, &pick_list, PICK_ANY); if (!n) return 0; for (i = 0; i < n; i++) { if (pick_list[i].item.a_int == ALL_TYPES_SELECTED) all_worn_categories = TRUE; else add_valid_menu_class(pick_list[i].item.a_int); } 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; } n = query_objlist("What do you want to take off?", invent, SIGNAL_NOMENU|USE_INVLET|INVORDER_SORT, &pick_list, PICK_ANY, all_worn_categories ? is_worn : is_worn_by_type); if (n > 0) { 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; } /* hit by destroy armor scroll/black dragon breath/monster spell */ int destroy_arm(atmp) register struct obj *atmp; { register struct obj *otmp; #define DESTROY_ARM(o) ((otmp = (o)) != 0 && \ (!atmp || atmp == otmp) && \ (!obj_resists(otmp, 0, 90))) if (DESTROY_ARM(uarmc)) { if (donning(otmp)) cancel_don(); Your("%s crumbles and turns to dust!", cloak_simple_name(uarmc)); (void) Cloak_off(); useup(otmp); } else if (DESTROY_ARM(uarm)) { if (donning(otmp)) cancel_don(); Your("armor turns to dust and falls to the %s!", surface(u.ux,u.uy)); (void) Armor_gone(); useup(otmp); #ifdef TOURIST } else if (DESTROY_ARM(uarmu)) { if (donning(otmp)) cancel_don(); Your("shirt crumbles into tiny threads and falls apart!"); (void) Shirt_off(); useup(otmp); #endif } else if (DESTROY_ARM(uarmh)) { if (donning(otmp)) cancel_don(); Your("helmet turns to dust and is blown away!"); (void) Helmet_off(); useup(otmp); } else if (DESTROY_ARM(uarmg)) { if (donning(otmp)) cancel_don(); Your("gloves vanish!"); (void) Gloves_off(); useup(otmp); selftouch("You"); } else if (DESTROY_ARM(uarmf)) { if (donning(otmp)) cancel_don(); Your("boots disintegrate!"); (void) Boots_off(); useup(otmp); } else if (DESTROY_ARM(uarms)) { if (donning(otmp)) cancel_don(); Your("shield crumbles away!"); (void) Shield_off(); useup(otmp); } else { return 0; /* could not destroy anything */ } #undef DESTROY_ARM stop_occupation(); return(1); } void adj_abon(otmp, delta) register struct obj *otmp; register schar delta; { if (uarmg && uarmg == otmp && otmp->otyp == GAUNTLETS_OF_DEXTERITY) { if (delta) { makeknown(uarmg->otyp); ABON(A_DEX) += (delta); } flags.botl = 1; } if (uarmh && uarmh == otmp && otmp->otyp == HELM_OF_BRILLIANCE) { if (delta) { makeknown(uarmh->otyp); ABON(A_INT) += (delta); ABON(A_WIS) += (delta); } flags.botl = 1; } } #endif /* OVLB */ /*do_wear.c*/ slashem-0.0.7E7F3/src/role.c0000664000076400007640000014531210545462317013556 0ustar aliali/* SCCS Id: @(#)role.c 3.4 2003/01/08 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985-1999. */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" /*** Table of all roles ***/ /* According to AD&D, HD for some classes (ex. Wizard) should be smaller * (4-sided for wizards). But this is not AD&D, and using the AD&D * rule here produces an unplayable character. Thus I have used a minimum * of an 10-sided hit die for everything. Another AD&D change: wizards get * a minimum strength of 4 since without one you can't teleport or cast * spells. --KAA * * As the wizard has been updated (wizard patch 5 jun '96) their HD can be * brought closer into line with AD&D. This forces wizards to use magic more * and distance themselves from their attackers. --LSZ * * With the introduction of races, some hit points and energy * has been reallocated for each race. The values assigned * to the roles has been reduced by the amount allocated to * humans. --KMH * * God names use a leading underscore to flag goddesses. */ const struct Role roles[] = { { {"Archeologist", 0}, { {"Digger", 0}, {"Field Worker",0}, {"Investigator",0}, {"Exhumer", 0}, {"Excavator", 0}, {"Spelunker", 0}, {"Speleologist",0}, {"Collector", 0}, {"Curator", 0} }, "Quetzalcoatl", "Camaxtli", "Huhetotl", /* Central American */ "Arc", "the College of Archeology", "the Tomb of the Toltec Kings", PM_ARCHEOLOGIST, NON_PM, NON_PM, PM_LORD_CARNARVON, PM_STUDENT, PM_MINION_OF_HUHETOTL, NON_PM, PM_HUMAN_MUMMY, S_SNAKE, S_MUMMY, #if 0 ART_WEREBANE, ART_GRAYSWANDIR, #endif ART_ORB_OF_DETECTION, MH_HUMAN|MH_ELF|MH_DWARF|MH_GNOME|MH_HOBBIT|MH_VAMPIRE | ROLE_MALE|ROLE_FEMALE | ROLE_LAWFUL|ROLE_NEUTRAL, /* Str Int Wis Dex Con Cha */ { 7, 10, 10, 7, 7, 7 }, { 20, 20, 20, 10, 20, 10 }, /* Init Lower Higher */ { 11, 0, 0, 8, 1, 0 }, /* Hit points */ { 1, 0, 0, 1, 0, 1 },14, /* Energy */ 10, 5, 0, 2, 10, A_INT, SPE_MAGIC_MAPPING, -4 }, { {"Barbarian", 0}, { {"Plunderer", "Plunderess"}, {"Pillager", 0}, {"Bandit", 0}, {"Brigand", 0}, {"Raider", 0}, {"Reaver", 0}, {"Slayer", 0}, {"Chieftain", "Chieftainess"}, {"Conqueror", "Conqueress"} }, "Mitra", "Crom", "Set", /* Hyborian */ "Bar", "the Camp of the Duali Tribe", "the Duali Oasis", PM_BARBARIAN, NON_PM, NON_PM, PM_PELIAS, PM_CHIEFTAIN, PM_THOTH_AMON, PM_OGRE, PM_TROLL, S_OGRE, S_TROLL, #if 0 ART_CLEAVER, ART_DEATHSWORD, #endif ART_HEART_OF_AHRIMAN, MH_HUMAN|MH_ELF|MH_ORC|MH_WERE|MH_VAMPIRE | ROLE_MALE|ROLE_FEMALE | ROLE_NEUTRAL|ROLE_CHAOTIC, /* Str Int Wis Dex Con Cha */ { 16, 7, 7, 15, 16, 6 }, { 30, 6, 7, 20, 30, 7 }, /* Init Lower Higher */ { 14, 0, 0,10, 2, 0 }, /* Hit points */ { 1, 0, 0, 1, 0, 1 },10, /* Energy */ 10, 14, 0, 0, 8, A_INT, SPE_HASTE_SELF, -4 }, { {"Caveman", "Cavewoman"}, { {"Troglodyte", 0}, {"Aborigine", 0}, {"Wanderer", 0}, {"Vagrant", 0}, {"Wayfarer", 0}, {"Roamer", 0}, {"Nomad", 0}, {"Rover", 0}, {"Pioneer", 0} }, "Anu", "_Ishtar", "Anshar", /* Babylonian */ "Cav", "the Caves of the Ancestors", "the Dragon's Lair", PM_CAVEMAN, PM_CAVEWOMAN, PM_LITTLE_DOG, PM_SHAMAN_KARNOV, PM_NEANDERTHAL, PM_CHROMATIC_DRAGON, PM_BUGBEAR, PM_HILL_GIANT, S_HUMANOID, S_GIANT, #if 0 ART_GIANTKILLER, ART_SKULLCRUSHER, #endif ART_SCEPTRE_OF_MIGHT, MH_HUMAN|MH_DWARF|MH_GNOME|MH_VAMPIRE | ROLE_MALE|ROLE_FEMALE | ROLE_LAWFUL|ROLE_NEUTRAL, /* Str Int Wis Dex Con Cha */ { 10, 7, 7, 7, 8, 6 }, { 30, 6, 7, 20, 30, 7 }, /* Init Lower Higher */ { 14, 0, 0, 8, 2, 0 }, /* Hit points */ { 1, 0, 0, 1, 0, 1 },10, /* Energy */ 0, 12, 0, 1, 8, A_INT, SPE_DIG, -4 }, { {"Flame Mage", 0}, { {"Spark", 0}, /* WAC was Igniter */ {"Igniter", 0}, {"Broiler", 0}, /* WAC was Igniter */ {"Combuster", 0}, /* WAC was Torcher */ {"Torcher", 0}, {"Scorcher", 0}, /* WAC was Torcher */ {"Incinerator", 0}, {"Disintegrator", 0}, /* WAC was Incinerator */ {"Flame-Master", 0} }, "Earth", "Fire", "Ash", /* Special */ "Fla", "the great Circle of Flame", "the Water Mage's Cave", PM_FLAME_MAGE, NON_PM, PM_HELL_HOUND_PUP, PM_HIGH_FLAME_MAGE, PM_IGNITER, PM_WATER_MAGE, PM_WATER_ELEMENTAL, PM_RUST_MONSTER, S_ELEMENTAL, S_RUSTMONST, #if 0 ART_FIREWALL, ART_FIRE_BRAND, #endif ART_CANDLE_OF_ETERNAL_FLAME, MH_HUMAN|MH_ELF|MH_GNOME|MH_ORC|MH_HOBBIT | ROLE_MALE|ROLE_FEMALE|ROLE_LAWFUL|ROLE_NEUTRAL|ROLE_CHAOTIC, /* Str Int Wis Dex Con Cha */ /* Direct copy from Wizard */ { 7, 10, 7, 7, 7, 7 }, { 10, 30, 10, 20, 20, 10 }, /* Init Lower Higher */ { 10, 0, 0, 8, 1, 0 }, /* Hit points */ { 4, 3, 0, 2, 0, 3 },12, /* Energy */ 0, 1, 0, 2, 10, A_INT, SPE_FIREBALL, -4 /* From old role.c */ }, { {"Healer", 0}, { {"Rhizotomist", 0}, {"Empiric", 0}, {"Embalmer", 0}, {"Dresser", 0}, {"Medicus ossium", "Medica ossium"}, {"Herbalist", 0}, {"Magister", "Magistra"}, {"Physician", 0}, {"Chirurgeon", 0} }, "_Athena", "Hermes", "Poseidon", /* Greek */ "Hea", "the Temple of Epidaurus", "the Temple of Coeus", PM_HEALER, NON_PM, NON_PM, PM_HIPPOCRATES, PM_ATTENDANT, PM_CYCLOPS, PM_GIANT_RAT, PM_SNAKE, S_RODENT, S_YETI, #if 0 ART_DELUDER, ART_MIRRORBRIGHT, #endif ART_STAFF_OF_AESCULAPIUS, MH_HUMAN|MH_GNOME|MH_ELF|MH_HOBBIT | 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 */ 10, 3,-3, 2, 10, A_WIS, SPE_CURE_SICKNESS, -4 }, { {"Ice Mage", 0}, { {"Cooler", 0}, /* WAC was Chiller */ {"Condenser", 0}, /* WAC was Chiller */ {"Chiller", 0}, {"Froster", 0}, {"Permafroster", 0}, /* WAC was Froster */ {"Icer", 0}, /* WAC was Froster */ {"Freezer", 0}, {"Sublimer", 0}, /* WAC was Freezer */ {"Ice-Master", 0} }, "Air", "Frost", "Smoke", /* Special */ "Ice", "the great Ring of Ice", "the Earth Mage's Cave", PM_ICE_MAGE, NON_PM, PM_WINTER_WOLF_CUB, PM_HIGH_ICE_MAGE, PM_FROSTER, PM_EARTH_MAGE, PM_RUST_MONSTER, PM_XORN, S_RUSTMONST, S_XORN, #if 0 ART_DEEP_FREEZE, ART_FROST_BRAND, #endif ART_STORM_WHISTLE, MH_HUMAN|MH_ELF|MH_GNOME|MH_ORC|MH_HOBBIT|MH_VAMPIRE | ROLE_MALE|ROLE_FEMALE|ROLE_LAWFUL|ROLE_NEUTRAL|ROLE_CHAOTIC, /* Str Int Wis Dex Con Cha */ /* Direct copy from Wizard */ { 7, 10, 7, 7, 7, 7 }, { 10, 30, 10, 20, 20, 10 }, /* Init Lower Higher */ { 10, 0, 0, 8, 1, 0 }, /* Hit points */ { 4, 3, 0, 2, 0, 3 },12, /* Energy */ 0, 1, 0, 2, 10, A_INT, SPE_CONE_OF_COLD, -4 /* From old role.c */ }, { {"Knight", 0}, { {"Gallant", 0}, {"Esquire", 0}, {"Bachelor", 0}, {"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", PM_KNIGHT, NON_PM, PM_PONY, PM_KING_ARTHUR, PM_PAGE, PM_IXOTH, PM_QUASIT, PM_OCHRE_JELLY, S_IMP, S_JELLY, #if 0 ART_DRAGONBANE, ART_DEMONBANE, #endif ART_MAGIC_MIRROR_OF_MERLIN, 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 */ 10, 8,-2, 0, 9, A_WIS, SPE_TURN_UNDEAD, -4 }, { {"Monk", 0}, { {"Candidate", 0}, {"Novice", 0}, {"Initiate", 0}, {"Student of Stones", 0}, {"Student of Waters", 0}, {"Student of Metals", 0}, {"Student of Winds", 0}, {"Student of Fire", 0}, {"Master", 0} }, "Shan Lai Ching", "Chih Sung-tzu", "Huan Ti", /* Chinese */ "Mon", "the Monastery of Chan-Sune", "the Monastery of the Earth-Lord", PM_MONK, NON_PM, NON_PM, PM_GRAND_MASTER, PM_ABBOT, PM_MASTER_KAEN, PM_EARTH_ELEMENTAL, PM_XORN, S_ELEMENTAL, S_XORN, #if 0 ART_GAUNTLETS_OF_DEFENSE, ART_WHISPERFEET, #endif ART_EYES_OF_THE_OVERWORLD, MH_HUMAN|MH_HOBBIT | ROLE_MALE|ROLE_FEMALE | ROLE_LAWFUL|ROLE_NEUTRAL|ROLE_CHAOTIC, /* Str Int Wis Dex Con Cha */ { 10, 7, 8, 8, 7, 7 }, { 25, 10, 20, 20, 15, 10 }, /* Init Lower Higher */ { 12, 0, 0, 8, 1, 0 }, /* Hit points */ { 2, 2, 0, 2, 0, 2 },10, /* Energy */ 10, 8,-2, 2, 20, A_WIS, SPE_RESTORE_ABILITY, -4 }, { {"Necromancer", 0}, { {"Gravedigger", 0}, {"Embalmer", 0}, {"Mortician", 0}, {"Zombie Lord", 0}, {"Ghoul Master",0}, {"Necromancer", 0}, {"Necromancer", 0}, {"Undead Master", 0}, {"Lich Lord", 0} }, "Nharlotep", "Zugguthobal", "Gothuulbe", /* Assorted slimy things */ "Nec", "the Tower of the Dark Lord", "the Lair of Maugneshaagar", PM_NECROMANCER, NON_PM, PM_GHOUL, PM_DARK_LORD, PM_EMBALMER, PM_MAUGNESHAAGAR, PM_NUPPERIBO, PM_MONGBAT, S_BAT, S_IMP, #if 0 ART_SERPENT_S_TONGUE, ART_GRIMTOOTH, #endif ART_GREAT_DAGGER_OF_GLAURGNAA, MH_HUMAN|MH_ELF|MH_ORC|MH_VAMPIRE | ROLE_MALE|ROLE_FEMALE|ROLE_CHAOTIC, /* Str Int Wis Dex Con Cha */ /* Direct copy from Wizard */ { 7, 10, 7, 7, 7, 7 }, { 10, 30, 10, 20, 20, 10 }, /* Init Lower Higher */ { 10, 0, 0, 8, 1, 0 }, /* Hit points */ { 4, 3, 0, 2, 0, 3 },12, /* Energy */ 0, 1, 0, 2, 10, A_INT, SPE_SUMMON_UNDEAD, -4 }, { {"Priest", "Priestess"}, { {"Aspirant", 0}, {"Acolyte", 0}, {"Adept", 0}, {"Priest", "Priestess"}, {"Curate", 0}, {"Canon", "Canoness"}, {"Lama", 0}, {"Patriarch", "Matriarch"}, {"High Priest", "High Priestess"} }, 0, 0, 0, /* chosen randomly from among the other roles */ "Pri", "the Great Temple", "the Temple of Nalzok", PM_PRIEST, PM_PRIESTESS, NON_PM, PM_ARCH_PRIEST, PM_ACOLYTE, PM_NALZOK, PM_HUMAN_ZOMBIE, PM_WRAITH, S_ZOMBIE, S_WRAITH, #if 0 ART_DISRUPTER, ART_SUNSWORD, #endif ART_MITRE_OF_HOLINESS, MH_HUMAN|MH_ELF|MH_HOBBIT | ROLE_MALE|ROLE_FEMALE | ROLE_LAWFUL|ROLE_NEUTRAL|ROLE_CHAOTIC, /* Str Int Wis Dex Con Cha */ { 7, 7, 10, 7, 7, 7 }, { 15, 10, 30, 15, 20, 10 }, /* Init Lower Higher */ { 12, 0, 0, 8, 1, 0 }, /* Hit points */ { 4, 3, 0, 2, 0, 2 },10, /* Energy */ 0, 3,-2, 2, 10, A_WIS, SPE_REMOVE_CURSE, -4 }, /* Note: Rogue precedes Ranger so that use of `-R' on the command line retains its traditional meaning. */ { {"Rogue", 0}, { {"Footpad", 0}, {"Cutpurse", 0}, {"Rogue", 0}, {"Pilferer", 0}, {"Robber", 0}, {"Burglar", 0}, {"Filcher", 0}, {"Magsman", "Magswoman"}, {"Thief", 0} }, "Issek", "Mog", "Kos", /* Nehwon */ "Rog", "the Thieves' Guild Hall", "the Assassins' Guild Hall", PM_ROGUE, NON_PM, NON_PM, PM_MASTER_OF_THIEVES, PM_THUG, PM_MASTER_ASSASSIN, PM_LEPRECHAUN, PM_GUARDIAN_NAGA, S_NYMPH, S_NAGA, #if 0 ART_DOOMBLADE, ART_BAT_FROM_HELL, #endif ART_MASTER_KEY_OF_THIEVERY, MH_HUMAN|MH_ORC|MH_WERE|MH_VAMPIRE | ROLE_MALE|ROLE_FEMALE | ROLE_CHAOTIC, /* Str Int Wis Dex Con Cha */ { 7, 7, 7, 10, 7, 6 }, { 20, 10, 10, 30, 20, 10 }, /* Init Lower Higher */ { 10, 0, 0, 8, 1, 0 }, /* Hit points */ { 1, 0, 0, 1, 0, 1 },11, /* Energy */ 10, 8, 0, 1, 9, A_INT, SPE_DETECT_TREASURE, -4 }, { {"Ranger", 0}, { #if 0 /* OBSOLETE */ {"Edhel", "Elleth"}, {"Edhel", "Elleth"}, /* elf-maid */ {"Ohtar", "Ohtie"}, /* warrior */ {"Kano", /* commander (Q.) ['a] */ "Kanie"}, /* educated guess, until further research- SAC */ {"Arandur", /* king's servant, minister (Q.) - guess */ "Aranduriel"}, /* educated guess */ {"Hir", "Hiril"}, /* lord, lady (S.) ['ir] */ {"Aredhel", "Arwen"}, /* noble elf, maiden (S.) */ {"Ernil", "Elentariel"}, /* prince (S.), elf-maiden (Q.) */ {"Elentar", "Elentari"}, /* Star-king, -queen (Q.) */ "Solonor Thelandira", "Aerdrie Faenya", "Lolth", /* Elven */ #endif {"Tenderfoot", 0}, {"Lookout", 0}, {"Trailblazer", 0}, {"Reconnoiterer", "Reconnoiteress"}, {"Scout", 0}, {"Arbalester", 0}, /* One skilled at crossbows */ {"Archer", 0}, {"Sharpshooter", 0}, {"Marksman", "Markswoman"} }, "Mercury", "_Venus", "Mars", /* Roman/planets */ "Ran", "Orion's camp", "the cave of the wumpus", PM_RANGER, NON_PM, PM_LITTLE_DOG /* Orion & canis major */, PM_ORION, PM_HUNTER, PM_SCORPIUS, PM_FOREST_CENTAUR, PM_SCORPION, S_CENTAUR, S_SPIDER, #if 0 0, 0, #endif ART_LONGBOW_OF_DIANA, MH_HUMAN|MH_ELF|MH_GNOME|MH_ORC|MH_WERE|MH_HOBBIT | ROLE_MALE|ROLE_FEMALE | ROLE_NEUTRAL|ROLE_CHAOTIC, /* Str Int Wis Dex Con Cha */ { 13, 13, 13, 9, 13, 7 }, { 30, 10, 10, 20, 20, 10 }, /* Init Lower Higher */ { 13, 0, 0, 6, 1, 0 }, /* Hit points */ { 1, 0, 0, 1, 0, 1 },12, /* Energy */ 10, 9, 2, 1, 10, A_INT, SPE_INVISIBILITY, -4 }, { {"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 */ {"Daimyo", 0}, /* a samurai lord */ {"Kuge", 0}, /* Noble of the Court */ {"Shogun", 0} },/* supreme commander, warlord */ "_Amaterasu Omikami", "Raijin", "Susanowo", /* Japanese */ "Sam", "the Castle of the Taro Clan", "the Shogun's Castle", PM_SAMURAI, NON_PM, PM_LITTLE_DOG, PM_LORD_SATO, PM_ROSHI, PM_ASHIKAGA_TAKAUJI, PM_WOLF, PM_STALKER, S_DOG, S_ELEMENTAL, #if 0 ART_SNICKERSNEE, ART_DRAGONBANE, #endif ART_TSURUGI_OF_MURAMASA, 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 */ 10, 10, 0, 0, 8, A_INT, SPE_CLAIRVOYANCE, -4 }, #ifdef TOURIST { {"Tourist", 0}, { {"Rambler", 0}, {"Sightseer", 0}, {"Excursionist",0}, {"Peregrinator","Peregrinatrix"}, {"Traveler", 0}, {"Journeyer", 0}, {"Voyager", 0}, {"Explorer", 0}, {"Adventurer", 0} }, "Blind Io", "_The Lady", "Offler", /* Discworld */ "Tou", "Ankh-Morpork", "the Thieves' Guild Hall", PM_TOURIST, NON_PM, NON_PM, PM_TWOFLOWER, PM_GUIDE, PM_MASTER_OF_THIEVES, PM_GIANT_SPIDER, PM_FOREST_CENTAUR, S_SPIDER, S_CENTAUR, #if 0 ART_WHISPERFEET, ART_LUCKBLADE, #endif ART_YENDORIAN_EXPRESS_CARD, MH_HUMAN|MH_HOBBIT | ROLE_MALE|ROLE_FEMALE | ROLE_NEUTRAL, /* Str Int Wis Dex Con Cha */ { 7, 10, 6, 7, 7, 10 }, { 15, 10, 10, 15, 30, 20 }, /* Init Lower Higher */ { 8, 0, 0, 8, 0, 0 }, /* Hit points */ { 1, 0, 0, 1, 0, 1 },14, /* Energy */ 0, 5, 1, 2, 10, A_INT, SPE_CHARM_MONSTER, -4 }, #endif { {"Undead Slayer", 0}, { {"Assistant", 0}, {"Eliminator", 0}, {"Eliminator", 0}, {"Exterminator", 0}, {"Exterminator", 0}, {"Destroyer", 0}, {"Vindicator", 0}, {"Vindicator", 0}, {"Undead Slayer", 0} }, "Seeker", "Osiris", "Seth", /* Egyptian */ "Und", "the Temple of Light", "the Crypt of Dracula", PM_UNDEAD_SLAYER, NON_PM, NON_PM, PM_VAN_HELSING, PM_EXTERMINATOR, PM_COUNT_DRACULA, PM_HUMAN_MUMMY, PM_VAMPIRE, S_MUMMY, S_VAMPIRE, #if 0 ART_HOLY_SPEAR_OF_LIGHT, ART_SUNSWORD, #endif ART_STAKE_OF_VAN_HELSING, MH_HUMAN|MH_ELF|MH_GNOME|MH_ORC|MH_WERE|MH_HOBBIT | ROLE_MALE|ROLE_FEMALE | ROLE_LAWFUL|ROLE_NEUTRAL|ROLE_CHAOTIC, /* Str Int Wis Dex Con Cha */ /* Modified from Knight */ { 13, 7, 14, 8, 10, 10 }, { 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 */ 10, 8,-2, 0, 9, A_WIS, SPE_TURN_UNDEAD, -4 }, { {"Valkyrie", 0}, { {"Stripling", 0}, {"Skirmisher", 0}, {"Fighter", 0}, {"Man-at-arms", "Woman-at-arms"}, {"Warrior", 0}, {"Swashbuckler",0}, {"Hero", "Heroine"}, {"Champion", 0}, {"Lord", "Lady"} }, "Tyr", "Odin", "Loki", /* Norse */ "Val", "the Shrine of Destiny", "the cave of Surtur", PM_VALKYRIE, NON_PM, NON_PM /*PM_WINTER_WOLF_CUB*/, PM_NORN, PM_WARRIOR, PM_LORD_SURTUR, PM_FIRE_ANT, PM_FIRE_GIANT, S_ANT, S_GIANT, #if 0 ART_MJOLLNIR, ART_FROST_BRAND, #endif ART_ORB_OF_FATE, MH_HUMAN|MH_DWARF | ROLE_FEMALE | ROLE_LAWFUL|ROLE_NEUTRAL, /* Str Int Wis Dex Con Cha */ { 10, 7, 7, 7, 12, 7 }, { 30, 6, 7, 20, 30, 7 }, /* Init Lower Higher */ { 14, 0, 0, 8, 2, 0 }, /* Hit points */ { 1, 0, 0, 1, 0, 1 },10, /* Energy */ 0, 10,-2, 0, 9, A_WIS, SPE_LIGHTNING, -4 }, { {"Wizard", 0}, { {"Evoker", 0}, {"Conjurer", 0}, {"Thaumaturge", 0}, {"Magician", 0}, {"Warlock", "Witch"}, {"Enchanter", "Enchantress"}, {"Sorcerer", "Sorceress"}, {"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, #if 0 ART_MAGICBANE, ART_DELUDER, #endif ART_EYE_OF_THE_AETHIOPICA, MH_HUMAN|MH_ELF|MH_GNOME|MH_ORC|MH_HOBBIT|MH_VAMPIRE | ROLE_MALE|ROLE_FEMALE | ROLE_NEUTRAL|ROLE_CHAOTIC, /* Str Int Wis Dex Con Cha */ { 7, 10, 7, 7, 7, 7 }, { 10, 30, 10, 20, 20, 10 }, /* Init Lower Higher */ { 10, 0, 0, 8, 1, 0 }, /* Hit points */ { 4, 3, 0, 2, 0, 3 },12, /* Energy */ 0, 1, 0, 3, 10, A_INT, SPE_MAGIC_MISSILE, -4 }, #ifdef YEOMAN { {"Yeoman", 0}, { /* Landowner titles, naval ranks and positions */ /* We intentionally avoid Lieutenant and Captain */ {"Usher", 0}, {"Steward", "Stewardess"}, {"Keeper", 0}, {"Marshal", 0}, {"Master Steward", "Master Stewardess"}, {"Chamberlain", 0}, {"Constable", 0}, {"Chancellor", 0}, {"Regent", 0} }, "His Majesty", "His Holiness", "The Commons", /* The three estates */ "Yeo", "London", "the inner ward", PM_YEOMAN, NON_PM, PM_PONY, PM_CHIEF_YEOMAN_WARDER, PM_YEOMAN_WARDER, PM_COLONEL_BLOOD, PM_RAVEN, PM_WEREWOLF, S_RODENT, S_DOG, #if 0 ART_REAPER, ART_SWORD_OF_JUSTICE, #endif ART_CROWN_OF_SAINT_EDWARD, MH_HUMAN|MH_ELF|MH_HOBBIT | ROLE_MALE|ROLE_LAWFUL, /* Str Int Wis Dex Con Cha */ { 12, 7, 10, 12, 12, 7 }, { 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 */ 10, 8,-2, 0, 9, A_WIS, SPE_KNOCK, -4 }, #endif /* Array terminator */ {{0, 0}} }; /* The player's role, created at runtime from initial * choices. This may be munged in role_init(). */ struct Role urole = { {"Undefined", 0}, { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} }, "L", "N", "C", "Xxx", "home", "locate", NON_PM, NON_PM, NON_PM, NON_PM, NON_PM, NON_PM, NON_PM, NON_PM, 0, 0, #if 0 0, 0, #endif 0, 0, /* Str Int Wis Dex Con Cha */ { 7, 7, 7, 7, 7, 7 }, { 20, 15, 15, 20, 20, 10 }, /* Init Lower Higher */ { 10, 0, 0, 8, 1, 0 }, /* Hit points */ { 2, 0, 0, 2, 0, 3 },14, /* Energy */ 0, 10, 0, 0, 4, A_INT, 0, -3 }; /* Table of all races */ const struct Race races[] = { { "doppelganger", "doppelganger", "doppelganger-kind", "Dop", {0, 0}, PM_DOPPELGANGER, NON_PM, PM_HUMAN_MUMMY, PM_HUMAN_ZOMBIE, MH_HUMAN | ROLE_MALE|ROLE_FEMALE | ROLE_NEUTRAL|ROLE_CHAOTIC, MH_HUMAN, MH_WERE, MH_ELF|MH_GNOME|MH_DWARF, /* Str Int Wis Dex Con Cha */ { 1, 3, 3, 1, 1, 1 }, { STR18(100), 20, 20, 20, 20, 15 }, /* Init Lower Higher */ { 0, 0, 0, 1, 1, 0 }, /* Hit points */ { 7, 0, 5, 0, 5, 0 } /* Energy */ }, { "drow", "droven", "drovenkind", "Dro", {0, 0}, PM_DROW, NON_PM, PM_ELF_MUMMY, PM_ELF_ZOMBIE, MH_ELF | ROLE_MALE|ROLE_FEMALE | ROLE_CHAOTIC, MH_ELF, MH_ELF, MH_ORC, /* Str Int Wis Dex Con Cha */ { 3, 3, 3, 3, 3, 3 }, { 18, 20, 20, 18, 16, 18 }, /* Init Lower Higher */ { 1, 0, 0, 1, 1, 0 }, /* Hit points */ { 2, 0, 3, 0, 3, 0 } /* Energy */ }, { "dwarf", "dwarven", "dwarvenkind", "Dwa", {0, 0}, PM_DWARF, NON_PM, PM_DWARF_MUMMY, PM_DWARF_ZOMBIE, MH_DWARF | ROLE_MALE|ROLE_FEMALE | ROLE_LAWFUL, MH_DWARF, MH_DWARF|MH_GNOME, MH_ORC, /* Str Int Wis Dex Con Cha */ { 3, 3, 3, 3, 3, 3 }, { STR18(100), 16, 16, 20, 20, 16 }, /* Init Lower Higher */ { 4, 0, 0, 3, 2, 0 }, /* Hit points */ { 0, 0, 0, 0, 0, 0 } /* Energy */ }, { "elf", "elven", "elvenkind", "Elf", {0, 0}, PM_ELF, NON_PM, PM_ELF_MUMMY, PM_ELF_ZOMBIE, MH_ELF | ROLE_MALE|ROLE_FEMALE | ROLE_LAWFUL|ROLE_NEUTRAL, MH_ELF, MH_ELF, MH_ORC, /* Str Int Wis Dex Con Cha */ { 3, 3, 3, 3, 3, 3 }, { 18, 20, 20, 18, 16, 18 }, /* Init Lower Higher */ { 1, 0, 0, 1, 1, 0 }, /* Hit points */ { 2, 0, 3, 0, 3, 0 } /* Energy */ }, { "gnome", "gnomish", "gnomehood", "Gno", {0, 0}, PM_GNOME, NON_PM, PM_GNOME_MUMMY, PM_GNOME_ZOMBIE, MH_GNOME | ROLE_MALE|ROLE_FEMALE | ROLE_NEUTRAL, MH_GNOME, MH_DWARF|MH_GNOME, MH_HUMAN|MH_HOBBIT, /* Str Int Wis Dex Con Cha */ { 3, 3, 3, 3, 3, 3 }, {STR18(50),19, 18, 18, 18, 18 }, /* Init Lower Higher */ { 1, 0, 0, 1, 0, 0 }, /* Hit points */ { 2, 0, 2, 0, 2, 0 } /* Energy */ }, { "hobbit", "hobbit", "hobbit-kind", "Hob", {0, 0}, PM_HOBBIT, NON_PM, NON_PM, NON_PM, MH_HOBBIT | ROLE_MALE|ROLE_FEMALE | ROLE_LAWFUL|ROLE_NEUTRAL, MH_HOBBIT, MH_HOBBIT, MH_GNOME|MH_ORC, /* Str Int Wis Dex Con Cha */ { 3, 3, 3, 3, 3, 3 }, { 18, 16, 18, 18, 20, 20 }, /* Init Lower Higher */ { 2, 0, 0, 2, 1, 0 }, /* Hit points */ { 2, 0, 2, 1, 2, 0 } /* Energy */ }, { "human", "human", "humanity", "Hum", {"man", "woman"}, PM_HUMAN, NON_PM, PM_HUMAN_MUMMY, PM_HUMAN_ZOMBIE, MH_HUMAN | ROLE_MALE|ROLE_FEMALE | ROLE_LAWFUL|ROLE_NEUTRAL|ROLE_CHAOTIC, MH_HUMAN, 0, MH_GNOME|MH_ORC, /* Str Int Wis Dex Con Cha */ { 3, 3, 3, 3, 3, 3 }, { STR18(100), 18, 18, 18, 18, 18 }, /* Init Lower Higher */ { 2, 0, 0, 2, 1, 0 }, /* Hit points */ { 1, 0, 2, 0, 2, 0 } /* Energy */ }, { "lycanthrope", "lycanthropic", "lycanthropehood", "Lyc", {0, 0}, PM_HUMAN_WEREWOLF, NON_PM, PM_HUMAN_MUMMY, PM_HUMAN_ZOMBIE, MH_WERE | ROLE_MALE|ROLE_FEMALE | ROLE_CHAOTIC, MH_WERE, 0, MH_ELF|MH_GNOME|MH_DWARF, /* Str Int Wis Dex Con Cha */ { 4, 1, 1, 4, 4, 2 }, { STR19(19), 15, 15, 20, 19, 15 }, /* Init Lower Higher */ { 4, 0, 0, 2, 2, 0 }, /* Hit points */ { 5, 0, 4, 0, 4, 0 } /* Energy */ }, { "orc", "orcish", "orcdom", "Orc", {0, 0}, PM_ORC, NON_PM, PM_ORC_MUMMY, PM_ORC_ZOMBIE, MH_ORC | ROLE_MALE|ROLE_FEMALE | ROLE_CHAOTIC, MH_ORC, 0, MH_HUMAN|MH_ELF|MH_DWARF|MH_HOBBIT, /* Str Int Wis Dex Con Cha */ { 3, 3, 3, 3, 3, 3 }, {STR18(50),16, 16, 18, 18, 16 }, /* Init Lower Higher */ { 1, 0, 0, 1, 0, 0 }, /* Hit points */ { 1, 0, 1, 0, 1, 0 } /* Energy */ }, { "vampire", "vampiric", "vampirehood", "Vam", {0, 0}, PM_VAMPIRE, NON_PM, PM_HUMAN_MUMMY, PM_HUMAN_ZOMBIE, MH_VAMPIRE | ROLE_MALE|ROLE_FEMALE | ROLE_CHAOTIC, MH_VAMPIRE, 0, MH_ELF|MH_GNOME|MH_HOBBIT|MH_DWARF|MH_ORC, /* Str Int Wis Dex Con Cha */ { 4, 0, 0, 4, 3, 4 }, { STR19(19), 18, 18, 20, 20, 20 }, /* Init Lower Higher */ { 3, 0, 0, 3, 2, 0 }, /* Hit points */ { 3, 0, 4, 0, 4, 0 } /* Energy */ }, /* Array terminator */ { 0, 0, 0, 0 }}; /* The player's race, created at runtime from initial * choices. This may be munged in role_init(). */ struct Race urace = { "something", "undefined", "something", "Xxx", {0, 0}, NON_PM, NON_PM, NON_PM, NON_PM, 0, 0, 0, 0, /* Str Int Wis Dex Con Cha */ { 3, 3, 3, 3, 3, 3 }, { STR18(100), 18, 18, 18, 18, 18 }, /* Init Lower Higher */ { 2, 0, 0, 2, 1, 0 }, /* Hit points */ { 1, 0, 2, 0, 2, 0 } /* Energy */ }; /* Table of all genders */ const struct Gender genders[] = { {"male", "he", "him", "his", "Mal", ROLE_MALE}, {"female", "she", "her", "her", "Fem", ROLE_FEMALE}, {"neuter", "it", "it", "its", "Ntr", ROLE_NEUTER} }; #ifdef MAC_MPW const size_t maxGender = sizeof genders/sizeof genders[0]; #endif /* MAC_MPW */ /* Table of all alignments */ const struct Align aligns[] = { {"law", "lawful", "Law", ROLE_LAWFUL, A_LAWFUL}, {"balance", "neutral", "Neu", ROLE_NEUTRAL, A_NEUTRAL}, {"chaos", "chaotic", "Cha", ROLE_CHAOTIC, A_CHAOTIC}, {"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"; #ifdef MAC_MPW const size_t maxAlign = sizeof aligns/sizeof aligns[0]; #endif /* MAC_MPW */ boolean validrole(rolenum) int rolenum; { return (rolenum >= 0 && rolenum < SIZE(roles)-1); } int randrole() { return (rn2(SIZE(roles)-1)); } int str2role(str) char *str; { int i, len; /* Is str valid? */ if (!str || !str[0]) return ROLE_NONE; /* Match as much of str as is provided */ len = strlen(str); for (i = 0; roles[i].name.m; i++) { /* Does it match the male name? */ if (!strncmpi(str, roles[i].name.m, len)) return i; /* Or the female name? */ if (roles[i].name.f && !strncmpi(str, roles[i].name.f, len)) return i; /* Or the filecode? */ if (!strcmpi(str, roles[i].filecode)) return i; } if ((len == 1 && (*str == '*' || *str == '@')) || !strncmpi(str, randomstr, len)) return ROLE_RANDOM; /* Couldn't find anything appropriate */ return ROLE_NONE; } boolean validrace(rolenum, racenum) int rolenum, racenum; { /* Assumes validrole */ /* WAC -- checks ROLE_GENDMASK and ROLE_ALIGNMASK as well (otherwise, there * might not be an allowed gender or alignment for that role */ return (racenum >= 0 && racenum < SIZE(races)-1 && (roles[rolenum].allow & races[racenum].allow & ROLE_RACEMASK) && (roles[rolenum].allow & races[racenum].allow & ROLE_GENDMASK) && (roles[rolenum].allow & races[racenum].allow & ROLE_ALIGNMASK)); } int randrace(rolenum) int rolenum; { int i, n = 0; /* Count the number of valid races */ for (i = 0; races[i].noun; i++) /* if (roles[rolenum].allow & races[i].allow & ROLE_RACEMASK)*/ if (validrace(rolenum,i)) n++; /* Pick a random race */ /* Use a factor of 100 in case of bad random number generators */ if (n) n = rn2(n*100)/100; for (i = 0; races[i].noun; i++) /* if (roles[rolenum].allow & races[i].allow & ROLE_RACEMASK) {*/ if (validrace(rolenum,i)) { if (n) n--; else return (i); } /* This role has no permitted races? */ return (rn2(SIZE(races)-1)); } /* * [ALI] Find the player equivalent race for a monster from its M2 flags. */ int mrace2race(mflags2) int mflags2; { int i; /* Look for a race with the correct selfmask */ for (i = 0; races[i].noun; i++) if (mflags2 & races[i].selfmask) { /* Where more than one player race has the same monster race, * return the base race. */ if (mflags2 & MH_HUMAN && races[i].malenum != PM_HUMAN) continue; if (mflags2 & MH_ELF && races[i].malenum != PM_ELF) continue; return i; } return ROLE_NONE; } int str2race(str) char *str; { int i, len; /* Is str valid? */ if (!str || !str[0]) return ROLE_NONE; /* Match as much of str as is provided */ len = strlen(str); for (i = 0; races[i].noun; i++) { /* Does it match the noun? */ if (!strncmpi(str, races[i].noun, len)) return i; /* Or the filecode? */ if (!strcmpi(str, races[i].filecode)) return i; } if ((len == 1 && (*str == '*' || *str == '@')) || !strncmpi(str, randomstr, len)) return ROLE_RANDOM; /* Couldn't find anything appropriate */ return ROLE_NONE; } boolean validgend(rolenum, racenum, gendnum) int rolenum, racenum, gendnum; { /* Assumes validrole and validrace */ return (gendnum >= 0 && gendnum < ROLE_GENDERS && (roles[rolenum].allow & races[racenum].allow & genders[gendnum].allow & ROLE_GENDMASK)); } int randgend(rolenum, racenum) int rolenum, racenum; { int i, n = 0; /* Count the number of valid genders */ for (i = 0; i < ROLE_GENDERS; i++) /* if (roles[rolenum].allow & races[racenum].allow & genders[i].allow & ROLE_GENDMASK) */ if (validgend(rolenum, racenum, i)) n++; /* Pick a random gender */ if (n) n = rn2(n); for (i = 0; i < ROLE_GENDERS; i++) /* if (roles[rolenum].allow & races[racenum].allow & genders[i].allow & ROLE_GENDMASK) {*/ if (validgend(rolenum, racenum, i)) { if (n) n--; else return (i); } /* This role/race has no permitted genders? */ return (rn2(ROLE_GENDERS)); } int str2gend(str) char *str; { int i, len; /* Is str valid? */ if (!str || !str[0]) return ROLE_NONE; /* Match as much of str as is provided */ len = strlen(str); for (i = 0; i < ROLE_GENDERS; i++) { /* Does it match the adjective? */ if (!strncmpi(str, genders[i].adj, len)) return i; /* Or the filecode? */ if (!strcmpi(str, genders[i].filecode)) return i; } if ((len == 1 && (*str == '*' || *str == '@')) || !strncmpi(str, randomstr, len)) return ROLE_RANDOM; /* Couldn't find anything appropriate */ return ROLE_NONE; } boolean validalign(rolenum, racenum, alignnum) int rolenum, racenum, alignnum; { /* Assumes validrole and validrace */ return (alignnum >= 0 && alignnum < ROLE_ALIGNS && (roles[rolenum].allow & races[racenum].allow & aligns[alignnum].allow & ROLE_ALIGNMASK)); } int randalign(rolenum, racenum) int rolenum, racenum; { int i, n = 0; /* Count the number of valid alignments */ for (i = 0; i < ROLE_ALIGNS; i++) if (roles[rolenum].allow & races[racenum].allow & aligns[i].allow & ROLE_ALIGNMASK) n++; /* Pick a random alignment */ if (n) n = rn2(n); for (i = 0; i < ROLE_ALIGNS; i++) if (roles[rolenum].allow & races[racenum].allow & aligns[i].allow & ROLE_ALIGNMASK) { if (n) n--; else return (i); } /* This role/race has no permitted alignments? */ return (rn2(ROLE_ALIGNS)); } int str2align(str) char *str; { int i, len; /* Is str valid? */ if (!str || !str[0]) return ROLE_NONE; /* Match as much of str as is provided */ len = strlen(str); for (i = 0; i < ROLE_ALIGNS; i++) { /* Does it match the adjective? */ if (!strncmpi(str, aligns[i].adj, len)) return i; /* Or the filecode? */ if (!strcmpi(str, aligns[i].filecode)) return i; } if ((len == 1 && (*str == '*' || *str == '@')) || !strncmpi(str, randomstr, len)) return ROLE_RANDOM; /* Couldn't find anything appropriate */ return ROLE_NONE; } /* is rolenum compatible with any racenum/gendnum/alignnum constraints? */ boolean ok_role(rolenum, racenum, gendnum, alignnum) int rolenum, racenum, gendnum, alignnum; { int i; short allow; if (rolenum >= 0 && rolenum < SIZE(roles)-1) { allow = roles[rolenum].allow; if (racenum >= 0 && racenum < SIZE(races)-1) allow &= races[racenum].allow; if (gendnum >= 0 && gendnum < ROLE_GENDERS && !(allow & genders[gendnum].allow & ROLE_GENDMASK)) return FALSE; if (alignnum >= 0 && alignnum < ROLE_ALIGNS && !(allow & aligns[alignnum].allow & ROLE_ALIGNMASK)) return FALSE; if (!(allow & ROLE_RACEMASK) || !(allow & ROLE_GENDMASK) || !(allow & ROLE_ALIGNMASK)) return FALSE; return TRUE; } else { for (i = 0; i < SIZE(roles)-1; i++) { allow = roles[i].allow; if (racenum >= 0 && racenum < SIZE(races)-1) allow &= races[racenum].allow; if (gendnum >= 0 && gendnum < ROLE_GENDERS && !(allow & genders[gendnum].allow & ROLE_GENDMASK)) continue; if (alignnum >= 0 && alignnum < ROLE_ALIGNS && !(allow & aligns[alignnum].allow & ROLE_ALIGNMASK)) continue; if (!(allow & ROLE_RACEMASK) || !(allow & ROLE_GENDMASK) || !(allow & ROLE_ALIGNMASK)) continue; return TRUE; } return FALSE; } } /* 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; for (i = 0; i < SIZE(roles)-1; i++) { 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++) { if (ok_role(i, racenum, gendnum, alignnum)) { if (roles_ok == 0) return i; else roles_ok--; } } return ROLE_NONE; } /* is racenum compatible with any rolenum/gendnum/alignnum constraints? */ boolean ok_race(rolenum, racenum, gendnum, alignnum) int rolenum, racenum, gendnum, alignnum; { int i; short allow; if (racenum >= 0 && racenum < SIZE(races)-1) { allow = races[racenum].allow; if (rolenum >= 0 && rolenum < SIZE(roles)-1) allow &= roles[rolenum].allow; if (gendnum >= 0 && gendnum < ROLE_GENDERS && !(allow & genders[gendnum].allow & ROLE_GENDMASK)) return FALSE; if (alignnum >= 0 && alignnum < ROLE_ALIGNS && !(allow & aligns[alignnum].allow & ROLE_ALIGNMASK)) return FALSE; if (!(allow & ROLE_RACEMASK) || !(allow & ROLE_GENDMASK) || !(allow & ROLE_ALIGNMASK)) return FALSE; return TRUE; } else { for (i = 0; i < SIZE(races)-1; i++) { allow = races[i].allow; if (rolenum >= 0 && rolenum < SIZE(roles)-1) allow &= roles[rolenum].allow; if (gendnum >= 0 && gendnum < ROLE_GENDERS && !(allow & genders[gendnum].allow & ROLE_GENDMASK)) continue; if (alignnum >= 0 && alignnum < ROLE_ALIGNS && !(allow & aligns[alignnum].allow & ROLE_ALIGNMASK)) continue; if (!(allow & ROLE_RACEMASK) || !(allow & ROLE_GENDMASK) || !(allow & ROLE_ALIGNMASK)) continue; return TRUE; } return FALSE; } } /* 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; for (i = 0; i < SIZE(races)-1; i++) { 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++) { if (ok_race(rolenum, i, gendnum, alignnum)) { if (races_ok == 0) return i; else races_ok--; } } return ROLE_NONE; } /* is gendnum compatible with any rolenum/racenum/alignnum constraints? */ /* gender and alignment are not comparable (and also not constrainable) */ boolean ok_gend(rolenum, racenum, gendnum, alignnum) int rolenum, racenum, gendnum, alignnum; { int i; short allow; if (gendnum >= 0 && gendnum < ROLE_GENDERS) { allow = genders[gendnum].allow; if (rolenum >= 0 && rolenum < SIZE(roles)-1) allow &= roles[rolenum].allow; if (racenum >= 0 && racenum < SIZE(races)-1) allow &= races[racenum].allow; if (!(allow & ROLE_GENDMASK)) return FALSE; return TRUE; } else { for (i = 0; i < ROLE_GENDERS; i++) { allow = genders[i].allow; if (rolenum >= 0 && rolenum < SIZE(roles)-1) allow &= roles[rolenum].allow; if (racenum >= 0 && racenum < SIZE(races)-1) allow &= races[racenum].allow; if (allow & ROLE_GENDMASK) return TRUE; } return FALSE; } } /* 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; for (i = 0; i < ROLE_GENDERS; i++) { 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++) { if (ok_gend(rolenum, racenum, i, alignnum)) { if (gends_ok == 0) return i; else gends_ok--; } } return ROLE_NONE; } /* is alignnum compatible with any rolenum/racenum/gendnum constraints? */ /* alignment and gender are not comparable (and also not constrainable) */ boolean ok_align(rolenum, racenum, gendnum, alignnum) int rolenum, racenum, gendnum, alignnum; { int i; short allow; if (alignnum >= 0 && alignnum < ROLE_ALIGNS) { allow = aligns[alignnum].allow; if (rolenum >= 0 && rolenum < SIZE(roles)-1) allow &= roles[rolenum].allow; if (racenum >= 0 && racenum < SIZE(races)-1) allow &= races[racenum].allow; if (!(allow & ROLE_ALIGNMASK)) return FALSE; return TRUE; } else { for (i = 0; i < ROLE_ALIGNS; i++) { allow = races[i].allow; if (rolenum >= 0 && rolenum < SIZE(roles)-1) allow &= roles[rolenum].allow; if (racenum >= 0 && racenum < SIZE(races)-1) allow &= races[racenum].allow; if (allow & ROLE_ALIGNMASK) return TRUE; } return FALSE; } } /* 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; for (i = 0; i < ROLE_ALIGNS; i++) { 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++) { if (ok_align(rolenum, racenum, gendnum, i)) { if (aligns_ok == 0) return i; else aligns_ok--; } } 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]; static 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() { char *sptr, *eptr; int i; /* Look for tokens delimited by '-' */ if ((eptr = index(plname, '-')) != (char *) 0) *eptr++ = '\0'; while (eptr) { /* Isolate the next token */ sptr = eptr; if ((eptr = index(sptr, '-')) != (char *)0) *eptr++ = '\0'; /* Try to match it to something */ if ((i = str2role(sptr)) != ROLE_NONE) flags.initrole = i; else if ((i = str2race(sptr)) != ROLE_NONE) flags.initrace = i; else if ((i = str2gend(sptr)) != ROLE_NONE) flags.initgend = i; else if ((i = str2align(sptr)) != ROLE_NONE) flags.initalign = i; } if(!plname[0]) { askname(); plnamesuffix(); } /* commas in the plname confuse the record file, convert to spaces */ for (sptr = plname; *sptr; sptr++) { if (*sptr == ',') *sptr = ' '; } } /* * Special setup modifications here: * * Unfortunately, this is going to have to be done * on each newgame or restore, because you lose the permonst mods * across a save/restore. :-) * * 1 - The Rogue Leader is the Tourist Nemesis. * 2 - Priests start with a random alignment - convert the leader and * guardians here. * 3 - Elves can have one of two different leaders, but can't work it * out here because it requires hacking the level file data (see * sp_lev.c). * * This code also replaces quest_init(). */ void role_init() { int alignmnt; /* Strip the role letter out of the player name. * This is included for backwards compatibility. */ plnamesuffix(); /* Check for a valid role. Try flags.initrole first. */ if (!validrole(flags.initrole)) { /* Try the player letter second */ if ((flags.initrole = str2role(pl_character)) < 0) /* None specified; pick a random role */ flags.initrole = randrole(); } /* We now have a valid role index. Copy the role name back. */ /* This should become OBSOLETE */ Strcpy(pl_character, roles[flags.initrole].name.m); pl_character[PL_CSIZ-1] = '\0'; /* Check for a valid race */ if (!validrace(flags.initrole, flags.initrace)) flags.initrace = randrace(flags.initrole); /* Check for a valid gender. If new game, check both initgend * and female. On restore, assume flags.female is correct. */ if (flags.pantheon == -1) { /* new game */ if (!validgend(flags.initrole, flags.initrace, flags.female)) flags.female = !flags.female; } if (!validgend(flags.initrole, flags.initrace, flags.initgend)) /* Note that there is no way to check for an unspecified gender. */ flags.initgend = flags.female; /* Check for a valid alignment */ if (!validalign(flags.initrole, flags.initrace, flags.initalign)) /* Pick a random alignment */ flags.initalign = randalign(flags.initrole, flags.initrace); alignmnt = aligns[flags.initalign].value; /* Initialize urole and urace */ urole = roles[flags.initrole]; urace = races[flags.initrace]; /* Fix up the quest leader */ if (urole.ldrnum != NON_PM) { mons[urole.ldrnum].msound = MS_LEADER; mons[urole.ldrnum].mflags2 |= (M2_PEACEFUL); mons[urole.ldrnum].mflags3 |= M3_CLOSE; mons[urole.ldrnum].maligntyp = alignmnt * 3; } /* Fix up the quest guardians */ if (urole.guardnum != NON_PM) { mons[urole.guardnum].mflags2 |= (M2_PEACEFUL); mons[urole.guardnum].maligntyp = alignmnt * 3; } /* Fix up the quest nemesis */ if (urole.neminum != NON_PM) { mons[urole.neminum].msound = MS_NEMESIS; mons[urole.neminum].mflags2 &= ~(M2_PEACEFUL); mons[urole.neminum].mflags2 |= (M2_NASTY|M2_STALK|M2_HOSTILE); mons[urole.neminum].mflags3 |= M3_WANTSARTI | M3_WAITFORU; } /* Fix up the god names */ if (flags.pantheon == -1) { /* new game */ flags.pantheon = flags.initrole; /* use own gods */ while (!roles[flags.pantheon].lgod) /* unless they're missing */ flags.pantheon = randrole(); } if (!urole.lgod) { urole.lgod = roles[flags.pantheon].lgod; urole.ngod = roles[flags.pantheon].ngod; urole.cgod = roles[flags.pantheon].cgod; } #if 0 /* Now in polyself.c, init_uasmon() */ /* Fix up infravision */ if (mons[urace.malenum].mflags3 & M3_INFRAVISION) { /* although an infravision intrinsic is possible, infravision * is purely a property of the physical race. This means that we * must put the infravision flag in the player's current race * (either that or have separate permonst entries for * elven/non-elven members of each class). The side effect is that * all NPCs of that class will have (probably bogus) infravision, * but since infravision has no effect for NPCs anyway we can * ignore this. */ mons[urole.malenum].mflags3 |= M3_INFRAVISION; if (urole.femalenum != NON_PM) mons[urole.femalenum].mflags3 |= M3_INFRAVISION; } #endif /* Artifacts are fixed in hack_artifacts() */ /* Success! */ return; } const char * Hello(mtmp) struct monst *mtmp; { switch (Role_switch) { case PM_KNIGHT: return ("Salutations"); /* Olde English */ case PM_SAMURAI: return (mtmp && mtmp->data == &mons[PM_SHOPKEEPER] ? "Irasshaimase" : "Konnichi wa"); /* Japanese */ #ifdef TOURIST case PM_TOURIST: return ("Aloha"); /* Hawaiian */ #endif case PM_VALKYRIE: return ( #ifdef MAIL mtmp && mtmp->data == &mons[PM_MAIL_DAEMON] ? "Hallo" : #endif "Velkommen"); /* Norse */ default: return ("Hello"); } } const char * Goodbye() { switch (Role_switch) { case PM_KNIGHT: return ("Fare thee well"); /* Olde English */ case PM_SAMURAI: return ("Sayonara"); /* Japanese */ #ifdef TOURIST case PM_TOURIST: return ("Aloha"); /* Hawaiian */ #endif case PM_VALKYRIE: return ("Farvel"); /* Norse */ default: return ("Goodbye"); } } /* role.c */ slashem-0.0.7E7F3/src/files.c0000664000076400007640000020422110545462317013712 0ustar aliali/* SCCS Id: @(#)files.c 3.4 2003/11/14 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" #include "dlb.h" /* WAC for config file */ #include "filename.h" /* needs to be after hack.h. Caused .slashemrc to never be read on UNIX */ #ifdef TTY_GRAPHICS #include "wintty.h" /* more() */ #endif #if defined(GL_GRAPHICS) || defined(SDL_GRAPHICS) #include "winGL.h" /* Sdlgl_parse_options */ #endif #ifdef PROXY_GRAPHICS #include "winproxy.h" /* proxy_config_open() */ #endif #include #if !defined(MAC) && !defined(O_WRONLY) && !defined(AZTEC_C) #include #endif #include #ifdef _MSC_VER /* MSC 6.0 defines errno quite differently */ # if (_MSC_VER >= 600) # define SKIP_ERRNO # endif #else # ifdef NHSTDC # define SKIP_ERRNO # endif #endif #ifndef SKIP_ERRNO # ifdef _DCC const # endif extern int errno; #endif #if defined(UNIX) && defined(QT_GRAPHICS) #include #endif #if defined(UNIX) || defined(VMS) #include #endif #ifndef NO_SIGNAL #include #endif /* WAC moved to below #include */ /* ALI: For compatibility */ #ifndef FILE_AREAS #define compress(file) compress_area(NULL, file) #define uncompress(file) uncompress_area(NULL, file) #endif #if defined(MSDOS) || defined(OS2) || defined(TOS) || defined(WIN32) # ifndef GNUDOS #include # else #include # endif #endif #ifndef O_BINARY /* used for micros, no-op for others */ # define O_BINARY 0 #endif #ifdef PREFIXES_IN_USE #define FQN_NUMBUF 4 static char fqn_filename_buffer[FQN_NUMBUF][FQN_MAX_FILENAME]; #endif #if !defined(MFLOPPY) && !defined(VMS) && !defined(WIN32) char bones[] = "bonesnn.xxx"; char lock[PL_NSIZ+14] = "1lock"; /* long enough for uid+name+.99 */ #else # if defined(MFLOPPY) char bones[FILENAMELEN]; /* pathname of bones files */ char lock[FILENAMELEN]; /* pathname of level files */ # endif # if defined(VMS) char bones[] = "bonesnn.xxx;1"; char lock[PL_NSIZ+17] = "1lock"; /* long enough for _uid+name+.99;1 */ # endif # if defined(WIN32) char bones[] = "bonesnn.xxx"; char lock[PL_NSIZ+25]; /* long enough for username+-+name+.99 */ # endif #endif #if defined(UNIX) || defined(__BEOS__) #define SAVESIZE (PL_NSIZ + 13) /* save/99999player.e */ #else # ifdef VMS #define SAVESIZE (PL_NSIZ + 22) /* [.save]player.e;1 */ # else # if defined(WIN32) #define SAVESIZE (PL_NSIZ + 40) /* username-player.NetHack-saved-game */ # else #define SAVESIZE FILENAMELEN /* from macconf.h or pcconf.h */ # endif # endif #endif char SAVEF[SAVESIZE]; /* holds relative path of save file from playground */ #ifdef MICRO char SAVEP[SAVESIZE]; /* holds path of directory for save file */ #endif #ifdef HOLD_LOCKFILE_OPEN struct level_ftrack { int init; int fd; /* file descriptor for level file */ int oflag; /* open flags */ boolean nethack_thinks_it_is_open; /* Does NetHack think it's open? */ } lftrack; # if defined(WIN32) #include # endif #endif /*HOLD_LOCKFILE_OPEN*/ #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[]; static int lockptr; # ifdef __SASC_60 #include # endif #include extern void FDECL(amii_set_text_font, ( char *, int )); #endif #if defined(WIN32) || defined(MSDOS) static int lockptr; # ifdef MSDOS #define Delay(a) msleep(a) # endif #define Close close #ifndef WIN_CE #define DeleteFile unlink #endif #endif #ifdef MAC # define unlink macunlink #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 *,const char *, FILE *,BOOLEAN_P)); STATIC_DCL void FDECL(docompress_file, (const char *,const char *,BOOLEAN_P)); #endif #ifndef FILE_AREAS STATIC_DCL char *FDECL(make_lockname, (const char *,char *)); #endif STATIC_DCL FILE *FDECL(fopen_config_file, (const char *)); STATIC_DCL int FDECL(get_uchars, (FILE *,char *,char *,uchar *,BOOLEAN_P,int,const char *)); int FDECL(parse_config_line, (FILE *,char *,char *,char *)); #ifdef NOCWD_ASSUMPTIONS STATIC_DCL void FDECL(adjust_prefix, (char *, int)); #endif #ifdef SELF_RECOVER STATIC_DCL boolean FDECL(copy_bytes, (int, int)); #endif #ifdef HOLD_LOCKFILE_OPEN STATIC_DCL int FDECL(open_levelfile_exclusively, (const char *, int, int)); #endif /* * fname_encode() * * Args: * legal zero-terminated list of acceptable file name characters * quotechar lead-in character used to quote illegal characters as hex digits * s string to encode * callerbuf buffer to house result * bufsz size of callerbuf * * Notes: * The hex digits 0-9 and A-F are always part of the legal set due to * their use in the encoding scheme, even if not explicitly included in 'legal'. * * Sample: * The following call: * (void)fname_encode("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", * '%', "This is a % test!", buf, 512); * results in this encoding: * "This%20is%20a%20%25%20test%21" */ char * fname_encode(legal, quotechar, s, callerbuf, bufsz) const char *legal; char quotechar; char *s, *callerbuf; int bufsz; { char *sp, *op; int cnt = 0; static char hexdigits[] = "0123456789ABCDEF"; sp = s; op = callerbuf; *op = '\0'; while (*sp) { /* Do we have room for one more character or encoding? */ if ((bufsz - cnt) <= 4) return callerbuf; if (*sp == quotechar) { (void)sprintf(op, "%c%02X", quotechar, *sp); op += 3; cnt += 3; } else if ((index(legal, *sp) != 0) || (index(hexdigits, *sp) != 0)) { *op++ = *sp; *op = '\0'; cnt++; } else { (void)sprintf(op,"%c%02X", quotechar, *sp); op += 3; cnt += 3; } sp++; } return callerbuf; } /* * fname_decode() * * Args: * quotechar lead-in character used to quote illegal characters as hex digits * s string to decode * callerbuf buffer to house result * bufsz size of callerbuf */ char * fname_decode(quotechar, s, callerbuf, bufsz) char quotechar; char *s, *callerbuf; int bufsz; { char *sp, *op; int k,calc,cnt = 0; static char hexdigits[] = "0123456789ABCDEF"; sp = s; op = callerbuf; *op = '\0'; calc = 0; while (*sp) { /* Do we have room for one more character? */ if ((bufsz - cnt) <= 2) return callerbuf; if (*sp == quotechar) { sp++; for (k=0; k < 16; ++k) if (*sp == hexdigits[k]) break; if (k >= 16) return callerbuf; /* impossible, so bail */ calc = k << 4; sp++; for (k=0; k < 16; ++k) if (*sp == hexdigits[k]) break; if (k >= 16) return callerbuf; /* impossible, so bail */ calc += k; sp++; *op++ = calc; *op = '\0'; } else { *op++ = *sp++; *op = '\0'; } cnt++; } return callerbuf; } #ifndef PREFIXES_IN_USE /*ARGSUSED*/ #endif const char * fqname(basename, whichprefix, buffnum) const char *basename; int whichprefix, buffnum; { #ifndef PREFIXES_IN_USE return basename; #else if (!basename || whichprefix < 0 || whichprefix >= PREFIX_COUNT) return basename; if (!fqn_prefix[whichprefix]) return basename; if (buffnum < 0 || buffnum >= FQN_NUMBUF) { impossible("Invalid fqn_filename_buffer specified: %d", buffnum); buffnum = 0; } if (strlen(fqn_prefix[whichprefix]) + strlen(basename) >= FQN_MAX_FILENAME) { impossible("fqname too long: %s + %s", fqn_prefix[whichprefix], basename); return basename; /* XXX */ } Strcpy(fqn_filename_buffer[buffnum], fqn_prefix[whichprefix]); return strcat(fqn_filename_buffer[buffnum], basename); #endif } /* reasonbuf must be at least BUFSZ, supplied by caller */ /*ARGSUSED*/ int validate_prefix_locations(reasonbuf) char *reasonbuf; { #if defined(NOCWD_ASSUMPTIONS) FILE *fp; const char *filename; int prefcnt, failcount = 0; char panicbuf1[BUFSZ], panicbuf2[BUFSZ], *details; if (reasonbuf) reasonbuf[0] = '\0'; for (prefcnt = 1; prefcnt < PREFIX_COUNT; prefcnt++) { /* don't test writing to configdir or datadir; they're readonly */ if (prefcnt == CONFIGPREFIX || prefcnt == DATAPREFIX) continue; filename = fqname("validate", prefcnt, 3); if ((fp = fopen(filename, "w"))) { fclose(fp); (void) unlink(filename); } else { if (reasonbuf) { if (failcount) Strcat(reasonbuf,", "); Strcat(reasonbuf, fqn_prefix_names[prefcnt]); } /* the paniclog entry gets the value of errno as well */ Sprintf(panicbuf1,"Invalid %s", fqn_prefix_names[prefcnt]); #if defined (NHSTDC) && !defined(NOTSTDC) if (!(details = strerror(errno))) #endif details = ""; Sprintf(panicbuf2,"\"%s\", (%d) %s", fqn_prefix[prefcnt], errno, details); paniclog(panicbuf1, panicbuf2); failcount++; } } if (failcount) return 0; else #endif return 1; } /* * When file areas are in use, fopen_datafile_area is used instead. */ #ifndef FILE_AREA /* fopen a file, with OS-dependent bells and whistles */ /* NOTE: a simpler version of this routine also exists in util/dlb_main.c */ FILE * fopen_datafile(filename, mode, prefix) const char *filename, *mode; int prefix; { FILE *fp; filename = fqname(filename, prefix, prefix == TROUBLEPREFIX ? 3 : 0); #ifdef VMS /* essential to have punctuation, to avoid logical names */ { char tmp[BUFSIZ]; if (!index(filename, '.') && !index(filename, ';')) filename = strcat(strcpy(tmp, filename), ";0"); fp = fopen(filename, mode, "mbc=16"); } #else fp = fopen(filename, mode); #endif return fp; } #endif /* FILE_AREA */ /* ---------- BEGIN LEVEL FILE HANDLING ----------- */ #ifdef MFLOPPY /* Set names for bones[] and lock[] */ void set_lock_and_bones() { if (!ramdisk) { Strcpy(levels, permbones); Strcpy(bones, permbones); } append_slash(permbones); append_slash(levels); #ifdef AMIGA strncat(levels, bbs_id, PATHLEN); #endif append_slash(bones); Strcat(bones, "bonesnn.*"); Strcpy(lock, levels); #ifndef AMIGA Strcat(lock, alllevels); #endif return; } #endif /* MFLOPPY */ /* Construct a file name for a level-type file, which is of the form * something.level (with any old level stripped off). * This assumes there is space on the end of 'file' to append * a two digit number. This is true for 'level' * but be careful if you use it for other things -dgk */ void set_levelfile_name(file, lev) char *file; int lev; { char *tf; tf = rindex(file, '.'); if (!tf) tf = eos(file); Sprintf(tf, ".%d", lev); #ifdef VMS Strcat(tf, ";1"); #endif return; } int create_levelfile(lev, errbuf) int lev; char errbuf[]; { int fd; #ifndef FILE_AREAS const char *fq_lock; #endif if (errbuf) *errbuf = '\0'; set_levelfile_name(lock, lev); #ifndef FILE_AREAS fq_lock = fqname(lock, LEVELPREFIX, 0); #endif #if defined(MICRO) || defined(WIN32) /* Use O_TRUNC to force the file to be shortened if it already * exists and is currently longer. */ # ifdef FILE_AREAS fd = open_area(FILE_AREA_LEVL, lock, O_WRONLY |O_CREAT | O_TRUNC | O_BINARY, FCMASK); # else # ifdef HOLD_LOCKFILE_OPEN if (lev == 0) fd = open_levelfile_exclusively(fq_lock, lev, O_WRONLY |O_CREAT | O_TRUNC | O_BINARY); else # endif fd = open(fq_lock, O_WRONLY |O_CREAT | O_TRUNC | O_BINARY, FCMASK); # endif #else /* MICRO */ # ifdef FILE_AREAS fd = creat_area(FILE_AREA_LEVL, lock, FCMASK); # else # ifdef MAC fd = maccreat(fq_lock, LEVL_TYPE); # else fd = creat(fq_lock, FCMASK); # endif # endif /* FILE_AREAS */ #endif /* MICRO || WIN32 */ if (fd >= 0) level_info[lev].flags |= LFILE_EXISTS; else if (errbuf) /* failure explanation */ Sprintf(errbuf, "Cannot create file \"%s\" for level %d (errno %d).", lock, lev, errno); return fd; } int open_levelfile(lev, errbuf) int lev; char errbuf[]; { int fd; #ifndef FILE_AREAS const char *fq_lock; #endif if (errbuf) *errbuf = '\0'; set_levelfile_name(lock, lev); #ifndef FILE_AREAS fq_lock = fqname(lock, LEVELPREFIX, 0); #endif #ifdef MFLOPPY /* If not currently accessible, swap it in. */ if (level_info[lev].where != ACTIVE) swapin_file(lev); #endif #ifdef FILE_AREAS fd = open_area(FILE_AREA_LEVL, lock, O_RDONLY | O_BINARY, 0); #else # ifdef MAC fd = macopen(fq_lock, O_RDONLY | O_BINARY, LEVL_TYPE); # else # ifdef HOLD_LOCKFILE_OPEN if (lev == 0) fd = open_levelfile_exclusively(fq_lock, lev, O_RDONLY | O_BINARY ); else # endif fd = open(fq_lock, O_RDONLY | O_BINARY, 0); # endif #endif /* FILE_AREAS */ /* for failure, return an explanation that our caller can use; settle for `lock' instead of `fq_lock' because the latter might end up being too big for nethack's BUFSZ */ if (fd < 0 && errbuf) Sprintf(errbuf, "Cannot open file \"%s\" for level %d (errno %d).", lock, lev, errno); return fd; } void delete_levelfile(lev) int lev; { /* * Level 0 might be created by port specific code that doesn't * call create_levfile(), so always assume that it exists. */ if (lev == 0 || (level_info[lev].flags & LFILE_EXISTS)) { set_levelfile_name(lock, lev); #ifdef FILE_AREAS (void) remove_area(FILE_AREA_LEVL, lock, 0); #else # ifdef HOLD_LOCKFILE_OPEN if (lev == 0) really_close(); # endif (void) unlink(fqname(lock, LEVELPREFIX, 0)); #endif level_info[lev].flags &= ~LFILE_EXISTS; } } void clearlocks() { /* [Tom] Watcom..... #if !defined(PC_LOCKING) && defined(MFLOPPY) && !defined(AMIGA) eraseall(levels, alllevels); if (ramdisk) eraseall(permbones, alllevels); #else register int x; # if defined(UNIX) || defined(VMS) (void) signal(SIGHUP, SIG_IGN); # endif */ /* can't access maxledgerno() before dungeons are created -dlc */ int x; for (x = (n_dgns ? maxledgerno() : 0); x >= 0; x--) delete_levelfile(x); /* not all levels need be present */ /* #endif*/ } #ifdef HOLD_LOCKFILE_OPEN STATIC_OVL int open_levelfile_exclusively(name, lev, oflag) const char *name; int lev, oflag; { int reslt, fd; if (!lftrack.init) { lftrack.init = 1; lftrack.fd = -1; } if (lftrack.fd >= 0) { /* check for compatible access */ if (lftrack.oflag == oflag) { fd = lftrack.fd; reslt = lseek(fd, 0L, SEEK_SET); if (reslt == -1L) panic("open_levelfile_exclusively: lseek failed %d", errno); lftrack.nethack_thinks_it_is_open = TRUE; } else { really_close(); fd = sopen(name, oflag,SH_DENYRW, FCMASK); lftrack.fd = fd; lftrack.oflag = oflag; lftrack.nethack_thinks_it_is_open = TRUE; } } else { fd = sopen(name, oflag,SH_DENYRW, FCMASK); lftrack.fd = fd; lftrack.oflag = oflag; if (fd >= 0) lftrack.nethack_thinks_it_is_open = TRUE; } return fd; } void really_close() { int fd = lftrack.fd; lftrack.nethack_thinks_it_is_open = FALSE; lftrack.fd = -1; lftrack.oflag = 0; (void)_close(fd); return; } int close(fd) int fd; { if (lftrack.fd == fd) { really_close(); /* close it, but reopen it to hold it */ fd = open_levelfile(0, (char *)0); lftrack.nethack_thinks_it_is_open = FALSE; return 0; } return _close(fd); } #endif /* ---------- END LEVEL FILE HANDLING ----------- */ /* ---------- BEGIN BONES FILE HANDLING ----------- */ /* set up "file" to be file name for retrieving bones, and return a * bonesid to be read/written in the bones file. */ STATIC_OVL char * set_bonesfile_name(file, lev) char *file; d_level *lev; { s_level *sptr; char *dptr; Sprintf(file, "bon%c%s", dungeons[lev->dnum].boneid, In_quest(lev) ? urole.filecode : "0"); dptr = eos(file); if ((sptr = Is_special(lev)) != 0) Sprintf(dptr, ".%c", sptr->boneid); else Sprintf(dptr, ".%d", lev->dlevel); #ifdef VMS Strcat(dptr, ";1"); #endif return(dptr-2); } /* set up temporary file name for writing bones, to avoid another game's * trying to read from an uncompleted bones file. we want an uncontentious * name, so use one in the namespace reserved for this game's level files. * (we are not reading or writing level files while writing bones files, so * the same array may be used instead of copying.) */ STATIC_OVL char * set_bonestemp_name() { char *tf; tf = rindex(lock, '.'); if (!tf) tf = eos(lock); Sprintf(tf, ".bn"); #ifdef VMS Strcat(tf, ";1"); #endif return lock; } int create_bonesfile(lev, bonesid, errbuf) d_level *lev; char **bonesid; char errbuf[]; { const char *file; int fd; if (errbuf) *errbuf = '\0'; *bonesid = set_bonesfile_name(bones, lev); file = set_bonestemp_name(); #ifndef FILE_AREAS file = fqname(file, BONESPREFIX, 0); #endif #if defined(MICRO) || defined(WIN32) /* Use O_TRUNC to force the file to be shortened if it already * exists and is currently longer. */ # ifdef FILE_AREAS fd = open_area(FILE_AREA_BONES, file, O_WRONLY |O_CREAT | O_TRUNC | O_BINARY, FCMASK); # else fd = open(file, O_WRONLY |O_CREAT | O_TRUNC | O_BINARY, FCMASK); # endif #else # ifdef FILE_AREAS fd = creat_area(FILE_AREA_BONES, file, FCMASK); # else # ifdef MAC fd = maccreat(file, BONE_TYPE); # else fd = creat(file, FCMASK); # endif # endif /* FILE_AREAS */ #endif if (fd < 0 && errbuf) /* failure explanation */ Sprintf(errbuf, "Cannot create bones \"%s\", id %s (errno %d).", lock, *bonesid, errno); # if defined(VMS) && !defined(SECURE) /* Re-protect bones file with world:read+write+execute+delete access. umask() doesn't seem very reliable; also, vaxcrtl won't let us set delete access without write access, which is what's really wanted. Can't simply create it with the desired protection because creat ANDs the mask with the user's default protection, which usually denies some or all access to world. */ # ifndef FILE_AREAS (void) chmod(file, FCMASK | 007); /* allow other users full access */ # else (void) chmod_area(FILE_AREA_BONES, file, FCMASK | 007); # endif # endif /* VMS && !SECURE */ return fd; } #ifdef MFLOPPY /* remove partial bonesfile in process of creation */ void cancel_bonesfile() { const char *tempname; tempname = set_bonestemp_name(); # ifdef FILE_AREAS (void) remove_area(FILE_AREA_BONES, tempname); # else tempname = fqname(tempname, BONESPREFIX, 0); (void) unlink(tempname); # endif } #endif /* MFLOPPY */ /* move completed bones file to proper name */ void commit_bonesfile(lev) d_level *lev; { const char *fq_bones, *tempname; int ret; (void) set_bonesfile_name(bones, lev); #ifndef FILE_AREAS fq_bones = fqname(bones, BONESPREFIX, 0); #endif tempname = set_bonestemp_name(); #ifndef FILE_AREAS tempname = fqname(tempname, BONESPREFIX, 1); #endif #ifdef FILE_AREAS ret = rename_area(FILE_AREA_BONES, tempname, bones); #else # if (defined(SYSV) && !defined(SVR4)) || defined(GENIX) /* old SYSVs don't have rename. Some SVR3's may, but since they * also have link/unlink, it doesn't matter. :-) */ (void) unlink(fq_bones); ret = link(tempname, fq_bones); ret += unlink(tempname); # else ret = rename(tempname, fq_bones); # endif #endif /* FILE_AREAS */ #ifdef WIZARD if (wizard && ret != 0) #ifdef FILE_AREAS pline("couldn't rename %s to %s.", tempname, bones); #else pline("couldn't rename %s to %s.", tempname, fq_bones); #endif #endif } int open_bonesfile(lev, bonesid) d_level *lev; char **bonesid; { const char *fq_bones; int fd; *bonesid = set_bonesfile_name(bones, lev); #ifdef FILE_AREAS uncompress_area(FILE_AREA_BONES, bones); /* no effect if nonexistent */ fd = open_area(FILE_AREA_BONES, bones, O_RDONLY | O_BINARY, 0); #else fq_bones = fqname(bones, BONESPREFIX, 0); uncompress(fq_bones); /* no effect if nonexistent */ # ifdef MAC fd = macopen(fq_bones, O_RDONLY | O_BINARY, BONE_TYPE); # else fd = open(fq_bones, O_RDONLY | O_BINARY, 0); # endif #endif /* FILE_AREAS */ return fd; } int delete_bonesfile(lev) d_level *lev; { (void) set_bonesfile_name(bones, lev); #ifdef FILE_AREAS return !(remove_area(FILE_AREA_BONES, bones) < 0); #else return !(unlink(fqname(bones, BONESPREFIX, 0)) < 0); #endif } /* assume we're compressing the recently read or created bonesfile, so the * file name is already set properly */ void compress_bonesfile() { #ifdef FILE_AREAS compress_area(FILE_AREA_BONES, bones); #else compress(fqname(bones, BONESPREFIX, 0)); #endif } /* ---------- END BONES FILE HANDLING ----------- */ /* ---------- BEGIN SAVE FILE HANDLING ----------- */ /* set savefile name in OS-dependent manner from pre-existing plname, * avoiding troublesome characters */ void set_savefile_name() { #if defined(WIN32) char fnamebuf[BUFSZ], encodedfnamebuf[BUFSZ]; #endif #ifdef VMS #ifndef FILE_AREAS Sprintf(SAVEF, "[.save]%d%s", getuid(), plname); regularize(SAVEF+7); #else Sprintf(SAVEF, "%d%s", getuid(), plname); regularize(SAVEF); #endif Strcat(SAVEF, ";1"); #else # if defined(MICRO) Strcpy(SAVEF, SAVEP); # ifdef AMIGA strncat(SAVEF, bbs_id, PATHLEN); # endif { int i = strlen(SAVEP); # ifdef AMIGA /* plname has to share space with SAVEP and ".sav" */ (void)strncat(SAVEF, plname, FILENAME - i - 4); # else (void)strncat(SAVEF, plname, 8); # endif regularize(SAVEF+i); } Strcat(SAVEF, ".sav"); # else # ifndef FILE_AREAS # if defined(WIN32) /* Obtain the name of the logged on user and incorporate * it into the name. */ Sprintf(fnamebuf, "%s-%s", get_username(0), plname); (void)fname_encode("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_-.", '%', fnamebuf, encodedfnamebuf, BUFSZ); Sprintf(SAVEF, "%s.NetHack-saved-game", encodedfnamebuf); # else Sprintf(SAVEF, "save/%d%s", (int)getuid(), plname); regularize(SAVEF+5); /* avoid . or / in name */ # endif /* WIN32 */ # else Sprintf(SAVEF, "%d%s", (int)getuid(), plname); regularize(SAVEF); /* avoid . or / in name */ # endif # endif /* MICRO */ #endif /* VMS */ } #ifdef INSURANCE void save_savefile_name(fd) int fd; { (void) write(fd, (genericptr_t) SAVEF, sizeof(SAVEF)); } #endif #if defined(WIZARD) && !defined(MICRO) /* change pre-existing savefile name to indicate an error savefile */ void set_error_savefile() { # ifdef VMS { char *semi_colon = rindex(SAVEF, ';'); if (semi_colon) *semi_colon = '\0'; } Strcat(SAVEF, ".e;1"); # else # ifdef MAC Strcat(SAVEF, "-e"); # else Strcat(SAVEF, ".e"); # endif # endif } #endif /* create save file, overwriting one if it already exists */ int create_savefile() { #ifndef FILE_AREAS const char *fq_save; #endif int fd; #ifdef FILE_AREAS # ifdef MICRO fd = open_area(FILE_AREA_SAVE, SAVEF, O_WRONLY | O_BINARY | O_CREAT | O_TRUNC, FCMASK); # else fd = creat_area(FILE_AREA_SAVE, SAVEF, FCMASK); # endif #else /* FILE_AREAS */ fq_save = fqname(SAVEF, SAVEPREFIX, 0); # if defined(MICRO) || defined(WIN32) 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 # endif /* MICRO */ #endif /* FILE_AREAS */ #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 # ifdef FILE_AREAS (void) chown_area(FILE_AREA_SAVE, SAVEF, getuid(), getgid()); # else (void) chown(fq_save, getuid(), getgid()); # endif #endif /* VMS && !SECURE */ return fd; } /* open savefile for reading */ int open_savefile() { int fd; #ifdef FILE_AREAS fd = open_area(FILE_AREA_SAVE, SAVEF, O_RDONLY | O_BINARY, 0); #else const char *fq_save; 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 /* FILE_AREAS */ return fd; } /* delete savefile */ int delete_savefile() { /*WAC OK...this is probably a contreversial addition. It's an option tho*/ #ifdef KEEP_SAVE /* Wizard mode already has prompt*/ if (flags.keep_savefile && !wizard) { # ifdef AMIGA /*WAC If Amiga is ever supported*/ preserve_icon(); # endif return 1; /*Should this return 0?*/ } #endif #ifdef FILE_AREAS (void) remove_area(FILE_AREA_SAVE, SAVEF); #else (void) unlink(fqname(SAVEF, SAVEPREFIX, 0)); #endif return 0; /* for restore_saved_game() (ex-xxxmain.c) test */ } /* try to open up a save file and prepare to restore it */ int restore_saved_game() { #ifndef FILE_AREAS const char *fq_save; #endif int fd; set_savefile_name(); #ifdef MFLOPPY if (!saveDiskPrompt(1)) return -1; #endif /* MFLOPPY */ #ifndef FILE_AREAS fq_save = fqname(SAVEF, SAVEPREFIX, 0); uncompress(fq_save); #else uncompress_area(FILE_AREA_SAVE, SAVEF); #endif if ((fd = open_savefile()) < 0) return fd; #ifndef FILE_AREAS if (!uptodate(fd, fq_save)) { #else if (!uptodate(fd, SAVEF)) { #endif (void) close(fd), fd = -1; (void) delete_savefile(); } return fd; } #if defined(UNIX) && defined(QT_GRAPHICS) /*ARGSUSED*/ static char* plname_from_file(filename) const char* filename; { #ifdef STORE_PLNAME_IN_FILE int fd; char* result = 0; Strcpy(SAVEF,filename); #ifdef COMPRESS_EXTENSION SAVEF[strlen(SAVEF)-strlen(COMPRESS_EXTENSION)] = '\0'; #endif uncompress(SAVEF); if ((fd = open_savefile()) >= 0) { if (uptodate(fd, filename)) { char tplname[PL_NSIZ]; mread(fd, (genericptr_t) tplname, PL_NSIZ); result = strdup(tplname); } (void) close(fd); } compress(SAVEF); return result; #else # if defined(UNIX) && defined(QT_GRAPHICS) /* Name not stored in save file, so we have to extract it from the filename, which loses information (eg. "/", "_", and "." characters are lost. */ int k; int uid; char name[64]; /* more than PL_NSIZ */ #ifdef COMPRESS_EXTENSION #define EXTSTR COMPRESS_EXTENSION #else #define EXTSTR "" #endif if ( sscanf( filename, "%*[^/]/%d%63[^.]" EXTSTR, &uid, name ) == 2 ) { #undef EXTSTR /* "_" most likely means " ", which certainly looks nicer */ for (k=0; name[k]; k++) if ( name[k]=='_' ) name[k]=' '; return strdup(name); } else # endif { return 0; } #endif } #endif /* defined(UNIX) && defined(QT_GRAPHICS) */ char** get_saved_games() { #if defined(UNIX) && defined(QT_GRAPHICS) int myuid=getuid(); struct dirent **namelist; int n = scandir("save", &namelist, 0, alphasort);; if ( n > 0 ) { int i,j=0; char** result = (char**)alloc((n+1)*sizeof(char*)); /* at most */ for (i=0; id_name, "%d%63s", &uid, name ) == 2 ) { if ( uid == myuid ) { char filename[BUFSZ]; char* r; Sprintf(filename,"save/%d%s",uid,name); r = plname_from_file(filename); if ( r ) result[j++] = r; } } } result[j++] = 0; return result; } else #endif { return 0; } } void free_saved_games(saved) char** saved; { if ( saved ) { int i=0; while (saved[i]) free((genericptr_t)saved[i++]); free((genericptr_t)saved); } } /* ---------- END SAVE FILE HANDLING ----------- */ /* ---------- BEGIN FILE COMPRESSION HANDLING ----------- */ #ifdef COMPRESS STATIC_OVL void redirect(filearea, filename, mode, stream, uncomp) const char *filearea, *filename, *mode; FILE *stream; boolean uncomp; { #ifndef FILE_AREAS if (freopen(filename, mode, stream) == (FILE *)0) { #else if (freopen_area(filearea, filename, mode, stream) == (FILE *)0) { #endif (void) fprintf(stderr, "redirect of %s for %scompress failed\n", filename, uncomp ? "un" : ""); terminate(EXIT_FAILURE); } } /* * using system() is simpler, but opens up security holes and causes * problems on at least Interactive UNIX 3.0.1 (SVR3.2), where any * setuid is renounced by /bin/sh, so the files cannot be accessed. * * cf. child() in unixunix.c. */ STATIC_OVL void docompress_file(filearea, filename, uncomp) const char *filearea, *filename; boolean uncomp; { char cfn[80]; FILE *cf; const char *args[10]; # ifdef COMPRESS_OPTIONS char opts[80]; # endif int i = 0; int f; # ifdef TTY_GRAPHICS boolean istty = !strncmpi(windowprocs.name, "tty", 3); # endif Strcpy(cfn, filename); # ifdef COMPRESS_EXTENSION Strcat(cfn, COMPRESS_EXTENSION); # endif /* when compressing, we know the file exists */ if (uncomp) { if ((cf = fopen_datafile_area(filearea, cfn, RDBMODE, FALSE)) == (FILE *)0) return; (void) fclose(cf); } args[0] = COMPRESS; if (uncomp) args[++i] = "-d"; /* uncompress */ # ifdef COMPRESS_OPTIONS { /* we can't guarantee there's only one additional option, sigh */ char *opt; boolean inword = FALSE; Strcpy(opts, COMPRESS_OPTIONS); opt = opts; while (*opt) { if ((*opt == ' ') || (*opt == '\t')) { if (inword) { *opt = '\0'; inword = FALSE; } } else if (!inword) { args[++i] = opt; inword = TRUE; } opt++; } } # endif args[++i] = (char *)0; # 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 f = fork(); 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. */ /* assume all compressors will compress stdin to stdout * without explicit filenames. this is true of at least * compress and gzip, those mentioned in config.h. */ if (uncomp) { redirect(filearea, cfn, RDBMODE, stdin, uncomp); redirect(filearea, filename, WRBMODE, stdout, uncomp); } else { redirect(filearea, filename, RDBMODE, stdin, uncomp); redirect(filearea, cfn, WRBMODE, stdout, uncomp); } (void) setgid(getgid()); (void) setuid(getuid()); (void) execv(args[0], (char *const *) args); perror((char *)0); (void) fprintf(stderr, "Exec to %scompress %s failed.\n", uncomp ? "un" : "", filename); terminate(EXIT_FAILURE); } else if (f == -1) { perror((char *)0); pline("Fork to %scompress %s failed.", uncomp ? "un" : "", filename); return; } # ifndef NO_SIGNAL (void) signal(SIGINT, SIG_IGN); (void) signal(SIGQUIT, SIG_IGN); # endif (void) wait((int *)&i); # ifndef NO_SIGNAL (void) signal(SIGINT, (SIG_RET_TYPE) done1); # endif # ifdef WIZARD if (wizard) (void) signal(SIGQUIT, SIG_DFL); # endif if (i == 0) { /* (un)compress succeeded: remove file left behind */ if (uncomp) #ifndef FILE_AREAS (void) unlink(cfn); #else (void) remove_area(filearea, cfn); #endif else #ifndef FILE_AREAS (void) unlink(filename); #else (void) remove_area(filearea, filename); #endif } else { /* (un)compress failed; remove the new, bad file */ if (uncomp) { raw_printf("Unable to uncompress %s", filename); (void) unlink(filename); } else { /* 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 */ /* compress file */ void compress_area(filearea, filename) const char *filearea, *filename; { #ifndef COMPRESS #if defined(MAC_MPW) || defined(__MWERKS__) # pragma unused(filename) #endif #else docompress_file(filearea, filename, FALSE); #endif } /* uncompress file if it exists */ void uncompress_area(filearea, filename) const char *filearea, *filename; { #ifndef COMPRESS #if defined(MAC_MPW) || defined(__MWERKS__) # pragma unused(filename) #endif #else docompress_file(filearea, filename, TRUE); #endif } /* ---------- END FILE COMPRESSION HANDLING ----------- */ /* * When file areas are in use, (un)lock_file_area are used instead. */ #ifndef FILE_AREAS /* ---------- BEGIN FILE LOCKING HANDLING ----------- */ static int nesting = 0; #ifdef NO_FILE_LINKS /* implies UNIX */ static int lockfd; /* for lock_file() to pass to unlock_file() */ #endif #define HUP if (!program_state.done_hup) STATIC_OVL char * make_lockname(filename, lockname) const char *filename; char *lockname; { #if defined(MAC_MPW) || defined(__MWERKS__) # pragma unused(filename,lockname) return (char*)0; #else # if defined(UNIX) || defined(VMS) || defined(AMIGA) || defined(WIN32) || defined(MSDOS) # ifdef NO_FILE_LINKS Strcpy(lockname, LOCKDIR); Strcat(lockname, "/"); Strcat(lockname, filename); # else Strcpy(lockname, filename); # endif # ifdef VMS { char *semi_colon = rindex(lockname, ';'); if (semi_colon) *semi_colon = '\0'; } Strcat(lockname, ".lock;1"); # else Strcat(lockname, "_lock"); # endif return lockname; # else lockname[0] = '\0'; return (char*)0; # endif /* UNIX || VMS || AMIGA || WIN32 || MSDOS */ #endif } /* lock a file */ boolean lock_file(filename, whichprefix, retryct) const char *filename; int whichprefix; int retryct; { #if defined(MAC_MPW) || defined(__MWERKS__) # pragma unused(filename, retryct) #endif char locknambuf[BUFSZ]; const char *lockname; nesting++; if (nesting > 1) { impossible("TRIED TO NEST LOCKS"); return TRUE; } lockname = make_lockname(filename, locknambuf); filename = fqname(filename, whichprefix, 0); #ifndef NO_FILE_LINKS /* LOCKDIR should be subsumed by LOCKPREFIX */ lockname = fqname(lockname, LOCKPREFIX, 2); #endif #if defined(UNIX) || defined(VMS) # ifdef NO_FILE_LINKS while ((lockfd = open(lockname, O_RDWR|O_CREAT|O_EXCL, 0666)) == -1) { # else while (link(filename, lockname) == -1) { # endif register int errnosv = errno; switch (errnosv) { /* George Barbanis */ case EEXIST: if (retryct--) { HUP raw_printf( "Waiting for access to %s. (%d retries left).", filename, retryct); # if defined(SYSV) || defined(ULTRIX) || defined(VMS) (void) # endif sleep(1); } else { HUP (void) raw_print("I give up. Sorry."); HUP raw_printf("Perhaps there is an old %s around?", lockname); nesting--; return FALSE; } break; case ENOENT: HUP raw_printf("Can't find file %s to lock!", filename); nesting--; return FALSE; case EACCES: HUP raw_printf("No write permission to lock %s!", filename); nesting--; return FALSE; # ifdef VMS /* c__translate(vmsfiles.c) */ case EPERM: /* could be misleading, but usually right */ HUP raw_printf("Can't lock %s due to directory protection.", filename); nesting--; return FALSE; # endif default: HUP perror(lockname); HUP raw_printf( "Cannot lock %s for unknown reason (%d).", filename, errnosv); nesting--; return FALSE; } } #endif /* UNIX || VMS */ #if defined(AMIGA) || defined(WIN32) || defined(MSDOS) # ifdef AMIGA #define OPENFAILURE(fd) (!fd) lockptr = 0; # else #define OPENFAILURE(fd) (fd < 0) lockptr = -1; # endif while (--retryct && OPENFAILURE(lockptr)) { # if defined(WIN32) && !defined(WIN_CE) lockptr = sopen(lockname, O_RDWR|O_CREAT, SH_DENYRW, S_IWRITE); # else (void)DeleteFile(lockname); /* in case dead process was here first */ # ifdef AMIGA lockptr = Open(lockname,MODE_NEWFILE); # else lockptr = open(lockname, O_RDWR|O_CREAT|O_EXCL, S_IWRITE); # endif # endif if (OPENFAILURE(lockptr)) { raw_printf("Waiting for access to %s. (%d retries left).", filename, retryct); Delay(50); } } if (!retryct) { raw_printf("I give up. Sorry."); nesting--; return FALSE; } #endif /* AMIGA || WIN32 || MSDOS */ return TRUE; } #ifdef VMS /* for unlock_file, use the unlink() routine in vmsunix.c */ # ifdef unlink # undef unlink # endif # define unlink(foo) vms_unlink(foo) #endif /* unlock file, which must be currently locked by lock_file */ void unlock_file(filename) const char *filename; { char locknambuf[BUFSZ]; const char *lockname; if (nesting == 1) { lockname = make_lockname(filename, locknambuf); #ifndef NO_FILE_LINKS /* LOCKDIR should be subsumed by LOCKPREFIX */ lockname = fqname(lockname, LOCKPREFIX, 2); #endif #if defined(UNIX) || defined(VMS) if (unlink(lockname) < 0) HUP raw_printf("Can't unlink %s.", lockname); # ifdef NO_FILE_LINKS (void) close(lockfd); # endif #endif /* UNIX || VMS */ #if defined(AMIGA) || defined(WIN32) || defined(MSDOS) if (lockptr) Close(lockptr); DeleteFile(lockname); lockptr = 0; #endif /* AMIGA || WIN32 || MSDOS */ } nesting--; } /* ---------- END FILE LOCKING HANDLING ----------- */ #endif /* FILE_AREAS */ /* ---------- BEGIN CONFIG FILE HANDLING ----------- */ const char *configfile = NH_CONFIG_FILE; /* WAC This stuff is in filename.h now #ifdef UNIX ".nethackrc"; #else # if defined(MAC) || defined(__BEOS__) "NetHack Defaults"; # if defined(MSDOS) || defined(WIN32) "defaults.nh"; # else "NetHack.cnf"; # endif # endif #endif */ #ifdef MSDOS /* conflict with speed-dial under windows * for XXX.cnf file so support of NetHack.cnf * is for backward compatibility only. * Preferred name (and first tried) is now defaults.nh but * the game will try the old name if there * is no defaults.nh. */ const char *backward_compat_configfile = "nethack.cnf"; #endif #ifndef MFLOPPY #define fopenp fopen #endif STATIC_OVL FILE * fopen_config_file(filename) const char *filename; { FILE *fp; #if defined(UNIX) || defined(VMS) char tmp_config[BUFSZ]; char *envp; #endif /* "filename" is an environment variable, so it should hang around */ /* if set, it is expected to be a full path name (if relevant) */ if (filename) { #ifdef UNIX if (access(filename, 4) == -1) { /* 4 is R_OK on newer systems */ /* nasty sneaky attempt to read file through * NetHack's setuid permissions -- this is the only * place a file name may be wholly under the player's * control */ raw_printf("Access to %s denied (%d).", filename, errno); wait_synch(); /* fall through to standard names */ } else #endif if ((fp = fopenp(filename, "r")) != (FILE *)0) { configfile = filename; 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).", filename, errno); wait_synch(); /* fall through to standard names */ #endif } } #if defined(MICRO) || defined(MAC) || defined(__BEOS__) || defined(WIN32) if ((fp = fopenp(fqname(configfile, CONFIGPREFIX, 0), "r")) != (FILE *)0) return(fp); # ifdef MSDOS else if ((fp = fopenp(fqname(backward_compat_configfile, CONFIGPREFIX, 0), "r")) != (FILE *)0) return(fp); # endif #else /* constructed full path names don't need fqname() */ # ifdef VMS if ((fp = fopenp(fqname(NH_CONFIG_FILE, CONFIGPREFIX, 0), "r")) != (FILE *)0) { configfile = NH_CONFIG_FILE; return(fp); } if ((fp = fopenp(NH_CONFIG_FILE2, "r")) != (FILE *)0) { configfile = index(NH_CONFIG_FILE2, ':'); if (configfile) configfile++; else configfile = NH_CONFIG_FILE2; return(fp); } envp = nh_getenv("HOME"); if (!envp) Strcpy(tmp_config, NH_CONFIG_FILE3); else Sprintf(tmp_config, "%s%s", envp, NH_CONFIG_FILE3); if ((fp = fopenp(tmp_config, "r")) != (FILE *)0) return(fp); # else /* should be only UNIX left */ envp = nh_getenv("HOME"); if (!envp) Strcpy(tmp_config, configfile); else Sprintf(tmp_config, "%s/%s", envp, configfile); if ((fp = fopenp(tmp_config, "r")) != (FILE *)0) return(fp); # if defined(__APPLE__) /* try an alternative */ if (envp) { Sprintf(tmp_config, "%s/%s", envp, "Library/Preferences/NetHack Defaults"); if ((fp = fopenp(tmp_config, "r")) != (FILE *)0) return(fp); Sprintf(tmp_config, "%s/%s", envp, "Library/Preferences/NetHack Defaults.txt"); if ((fp = fopenp(tmp_config, "r")) != (FILE *)0) return(fp); } # endif if (errno != ENOENT) { char *details; /* e.g., problems when setuid NetHack can't search home * directory restricted to user */ #if defined (NHSTDC) && !defined(NOTSTDC) if ((details = strerror(errno)) == 0) #endif details = ""; raw_printf("Couldn't open default config file %s %s(%d).", tmp_config, details, errno); wait_synch(); } else if (!strncmp(windowprocs.name, "proxy/", 6)) { fp = fopenp("/etc/slashem/proxy.slashemrc", "r"); if (fp != (FILE *)0) return(fp); else if (errno != ENOENT) { raw_printf("Couldn't open /etc/slashem/proxy.slashemrc (%d).", errno); wait_synch(); } } # endif #endif return (FILE *)0; } /* * Retrieve a list of integers from a file into a uchar array. * * NOTE: zeros are inserted unless modlist is TRUE, in which case the list * location is unchanged. Callers must handle zeros if modlist is FALSE. */ STATIC_OVL int get_uchars(fp, buf, bufp, list, modlist, size, name) FILE *fp; /* input file pointer */ char *buf; /* read buffer, must be of size BUFSZ */ char *bufp; /* current pointer */ uchar *list; /* return list */ boolean modlist; /* TRUE: list is being modified in place */ int size; /* return list size */ const char *name; /* name of option for error message */ { unsigned int num = 0; int count = 0; boolean havenum = FALSE; while (1) { switch(*bufp) { case ' ': case '\0': case '\t': case '\n': if (havenum) { /* if modifying in place, don't insert zeros */ if (num || !modlist) list[count] = num; count++; num = 0; havenum = FALSE; } if (count == size || !*bufp) return count; bufp++; break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': havenum = TRUE; num = num*10 + (*bufp-'0'); bufp++; break; case '\\': if (fp == (FILE *)0) goto gi_error; do { if (!fgets(buf, BUFSZ, fp)) goto gi_error; } while (buf[0] == '#'); bufp = buf; break; default: gi_error: raw_printf("Syntax error in %s", name); wait_synch(); return count; } } /*NOTREACHED*/ } #ifdef NOCWD_ASSUMPTIONS STATIC_OVL void adjust_prefix(bufp, prefixid) char *bufp; int prefixid; { char *ptr; if (!bufp) return; /* Backward compatibility, ignore trailing ;n */ if ((ptr = index(bufp, ';')) != 0) *ptr = '\0'; if (strlen(bufp) > 0) { fqn_prefix[prefixid] = (char *)alloc(strlen(bufp)+2); Strcpy(fqn_prefix[prefixid], bufp); append_slash(fqn_prefix[prefixid]); } } #endif #define match_varname(INP,NAM,LEN) match_optname(INP, NAM, LEN, TRUE) /*ARGSUSED*/ int parse_config_line(fp, buf, tmp_ramdisk, tmp_levels) FILE *fp; char *buf; char *tmp_ramdisk; char *tmp_levels; { #if defined(MAC_MPW) || defined(__MWERKS__) # pragma unused(tmp_ramdisk,tmp_levels) #endif char *bufp, *altp; uchar translate[MAXPCHARS]; int len; if (*buf == '#') return 1; /* remove trailing whitespace */ bufp = eos(buf); while (--bufp > buf && isspace((int)*bufp)) continue; if (bufp <= buf) return 1; /* skip all-blank lines */ else *(bufp + 1) = '\0'; /* terminate line */ /* find the '=' or ':' */ bufp = index(buf, '='); altp = index(buf, ':'); if (!bufp || (altp && altp < bufp)) bufp = altp; if (!bufp) return 0; /* skip whitespace between '=' and value */ do { ++bufp; } while (isspace((int)*bufp)); /* Go through possible variables */ /* some of these (at least LEVELS and SAVE) should now set the * appropriate fqn_prefix[] rather than specialized variables */ if (match_varname(buf, "OPTIONS", 4)) { parseoptions(bufp, TRUE, TRUE); if (plname[0]) /* If a name was given */ plnamesuffix(); /* set the character class */ } else if (match_varname(buf, "TILESETS", 7)) { parsetileset(bufp); #ifdef AUTOPICKUP_EXCEPTIONS } else if (match_varname(buf, "AUTOPICKUP_EXCEPTION", 5)) { add_autopickup_exception(bufp); #endif #ifdef NOCWD_ASSUMPTIONS } else if (match_varname(buf, "HACKDIR", 4)) { adjust_prefix(bufp, HACKPREFIX); } else if (match_varname(buf, "LEVELDIR", 4) || match_varname(buf, "LEVELS", 4)) { adjust_prefix(bufp, LEVELPREFIX); } else if (match_varname(buf, "SAVEDIR", 4)) { adjust_prefix(bufp, SAVEPREFIX); } else if (match_varname(buf, "BONESDIR", 5)) { adjust_prefix(bufp, BONESPREFIX); } else if (match_varname(buf, "DATADIR", 4)) { adjust_prefix(bufp, DATAPREFIX); } else if (match_varname(buf, "SCOREDIR", 4)) { adjust_prefix(bufp, SCOREPREFIX); } else if (match_varname(buf, "LOCKDIR", 4)) { adjust_prefix(bufp, LOCKPREFIX); } else if (match_varname(buf, "CONFIGDIR", 4)) { adjust_prefix(bufp, CONFIGPREFIX); } else if (match_varname(buf, "TROUBLEDIR", 4)) { adjust_prefix(bufp, TROUBLEPREFIX); #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 extern int saveprompt; # endif char *ptr; if ((ptr = index(bufp, ';')) != 0) { *ptr = '\0'; # ifdef MFLOPPY if (*(ptr+1) == 'n' || *(ptr+1) == 'N') { saveprompt = FALSE; } # endif } # ifdef MFLOPPY else saveprompt = flags.asksavedisk; # endif (void) strncpy(SAVEP, bufp, SAVESIZE-1); append_slash(SAVEP); # endif /* MICRO */ #endif /*NOCWD_ASSUMPTIONS*/ } else if (match_varname(buf, "NAME", 4)) { (void) strncpy(plname, bufp, PL_NSIZ-1); plnamesuffix(); } else if (match_varname(buf, "ROLE", 4) || match_varname(buf, "CHARACTER", 4)) { if ((len = str2role(bufp)) >= 0) flags.initrole = len; } else if (match_varname(buf, "DOGNAME", 3)) { (void) strncpy(dogname, bufp, PL_PSIZ-1); } else if (match_varname(buf, "CATNAME", 3)) { (void) strncpy(catname, bufp, PL_PSIZ-1); } else if (match_varname(buf, "WOLFNAME", 3)) { (void) strncpy(wolfname, bufp, PL_PSIZ-1); } else if (match_varname(buf, "GHOULNAME", 3)) { (void) strncpy(ghoulname, bufp, PL_PSIZ-1); #if 0 } else if (match_varname(buf, "BATNAME", 3)) { (void) strncpy(batname, bufp, PL_PSIZ-1); } else if (match_varname(buf, "SNAKENAME", 3)) { (void) strncpy(batname, bufp, PL_PSIZ-1); } else if (match_varname(buf, "RATNAME", 3)) { (void) strncpy(batname, bufp, PL_PSIZ-1); } else if (match_varname(buf, "BADGERNAME", 3)) { (void) strncpy(batname, bufp, PL_PSIZ-1); } else if (match_varname(buf, "REDDRAGONNAME", 3)) { (void) strncpy(batname, bufp, PL_PSIZ-1); } else if (match_varname(buf, "WHITEDRAGONNAME", 3)) { (void) strncpy(batname, bufp, PL_PSIZ-1); #endif } else if (match_varname(buf, "BOULDER", 3)) { (void) get_uchars(fp, buf, bufp, &iflags.bouldersym, TRUE, 1, "BOULDER"); } else if (match_varname(buf, "MENUCOLOR", 9)) { #ifdef MENU_COLOR add_menu_coloring(bufp); #endif } else if (match_varname(buf, "GRAPHICS", 4)) { len = get_uchars(fp, buf, bufp, translate, FALSE, MAXPCHARS, "GRAPHICS"); assign_graphics(translate, len, MAXPCHARS, 0); } else if (match_varname(buf, "DUNGEON", 4)) { len = get_uchars(fp, buf, bufp, translate, FALSE, MAXDCHARS, "DUNGEON"); assign_graphics(translate, len, MAXDCHARS, 0); } else if (match_varname(buf, "TRAPS", 4)) { len = get_uchars(fp, buf, bufp, translate, FALSE, MAXTCHARS, "TRAPS"); assign_graphics(translate, len, MAXTCHARS, MAXDCHARS); } else if (match_varname(buf, "EFFECTS", 4)) { len = get_uchars(fp, buf, bufp, translate, FALSE, MAXECHARS, "EFFECTS"); assign_graphics(translate, len, MAXECHARS, MAXDCHARS+MAXTCHARS); } else if (match_varname(buf, "OBJECTS", 3)) { /* oc_syms[0] is the RANDOM object, unused */ (void) get_uchars(fp, buf, bufp, &(oc_syms[1]), TRUE, MAXOCLASSES-1, "OBJECTS"); } else if (match_varname(buf, "MONSTERS", 3)) { /* monsyms[0] is unused */ (void) get_uchars(fp, buf, bufp, &(monsyms[1]), TRUE, MAXMCLASSES-1, "MONSTERS"); } else if (match_varname(buf, "WARNINGS", 5)) { (void) get_uchars(fp, buf, bufp, translate, TRUE, 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, ':' ) ) { *t = 0; amii_set_text_font( buf+5, atoi( t + 1 ) ); *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 ); amii_numcolors = 1L << min( DEPTH, val ); } else if (match_varname(buf, "DRIPENS", 7)) { int i, val; char *t; for (i = 0, t = strtok(bufp, ",/"); t != (char *)0; i < 20 && (t = strtok((char*)0, ",/")), ++i) { sscanf(t, "%d", &val ); flags.amii_dripens[i] = val; } } 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, ",/"); if( t ) { sscanf(t, "%d", &amii_msgAPen); if( t = strtok((char*)0, ",/") ) sscanf(t, "%d", &amii_msgBPen); } } else if (match_varname(buf, "TEXTPENS", 8)) { extern int amii_textAPen, amii_textBPen; char *t = strtok(bufp, ",/"); if( t ) { sscanf(t, "%d", &amii_textAPen); if( t = strtok((char*)0, ",/") ) sscanf(t, "%d", &amii_textBPen); } } else if (match_varname(buf, "MENUPENS", 8)) { extern int amii_menuAPen, amii_menuBPen; char *t = strtok(bufp, ",/"); if( t ) { sscanf(t, "%d", &amii_menuAPen); if( t = strtok((char*)0, ",/") ) sscanf(t, "%d", &amii_menuBPen); } } else if (match_varname(buf, "STATUSPENS", 10)) { extern int amii_statAPen, amii_statBPen; char *t = strtok(bufp, ",/"); if( t ) { sscanf(t, "%d", &amii_statAPen); if( t = strtok((char*)0, ",/") ) sscanf(t, "%d", &amii_statBPen); } } else if (match_varname(buf, "OTHERPENS", 9)) { extern int amii_otherAPen, amii_otherBPen; char *t = strtok(bufp, ",/"); if( t ) { sscanf(t, "%d", &amii_otherAPen); if( t = strtok((char*)0, ",/") ) sscanf(t, "%d", &amii_otherBPen); } } else if (match_varname(buf, "PENS", 4)) { extern unsigned short amii_init_map[ 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, "%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 /* These should move to wc_ options */ } else if (match_varname(buf, "QT_TILEWIDTH", 12)) { extern char *qt_tilewidth; if (qt_tilewidth == NULL) qt_tilewidth=(char *)strdup(bufp); } else if (match_varname(buf, "QT_TILEHEIGHT", 13)) { extern char *qt_tileheight; if (qt_tileheight == NULL) qt_tileheight=(char *)strdup(bufp); } else if (match_varname(buf, "QT_FONTSIZE", 11)) { 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 #if defined(GL_GRAPHICS) || defined(SDL_GRAPHICS) } else if (match_varname(buf, "GL_OPTIONS", 10)) { Sdlgl_parse_options(bufp, TRUE, TRUE); #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; { #define tmp_levels (char *)0 #define tmp_ramdisk (char *)0 #if defined(MICRO) || defined(WIN32) #undef tmp_levels char tmp_levels[PATHLEN]; # ifdef MFLOPPY # ifndef AMIGA #undef tmp_ramdisk char tmp_ramdisk[PATHLEN]; # endif # endif #endif char buf[4*BUFSZ]; FILE *fp; int i; #ifdef PROXY_GRAPHICS int found = FALSE; if (!(fp = fopen_config_file(filename))) goto clnt_process; else found = TRUE; #else if (!(fp = fopen_config_file(filename))) goto post_process; #endif #if defined(MICRO) || defined(WIN32) # ifdef MFLOPPY # ifndef AMIGA tmp_ramdisk[0] = 0; # endif # 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); #ifdef PROXY_GRAPHICS clnt_process: /* * When acting as a proxy server, allow the client to provide * its own config file which overrides values in our config file. * Note: We don't want to warn of values being present in both * files, but we do want to warn of duplicates within each file. */ if (!strncmp(windowprocs.name, "proxy/", 6) && (fp = proxy_config_file_open())) { found = TRUE; set_duplicate_opt_detection(1); while (fgets(buf, 4*BUFSZ, fp)) { if (match_varname(buf, "TILESETS", 7) || match_varname(buf, "HACKDIR", 4) || match_varname(buf, "LEVELDIR", 4) || match_varname(buf, "LEVELS", 4) || match_varname(buf, "SAVEDIR", 4) || match_varname(buf, "BONESDIR", 5) || match_varname(buf, "DATADIR", 4) || match_varname(buf, "SCOREDIR", 4) || match_varname(buf, "LOCKDIR", 4) || match_varname(buf, "CONFIGDIR", 4) || match_varname(buf, "TROUBLEDIR", 4) || match_varname(buf, "SOUNDDIR", 8) || match_varname(buf, "SOUND", 5)) { /* Quietly ignore many commands. There's no sense in * the client configuring these and some introduce * potential security breachs. */ continue; } if (!parse_config_line(fp, buf, tmp_ramdisk, tmp_levels)) { pline("Bad option line: \"%.50s\"", buf); wait_synch(); } } proxy_config_file_close(fp); set_duplicate_opt_detection(0); } if (!found) goto post_process; #endif #if defined(MICRO) && !defined(NOCWD_ASSUMPTIONS) /* should be superseded by fqn_prefix[] */ # ifdef MFLOPPY Strcpy(permbones, tmp_levels); # ifndef AMIGA if (tmp_ramdisk[0]) { Strcpy(levels, tmp_ramdisk); if (strcmp(permbones, levels)) /* if not identical */ ramdisk = TRUE; } else # endif /* AMIGA */ Strcpy(levels, tmp_levels); Strcpy(bones, levels); # endif /* MFLOPPY */ #endif /* MICRO */ post_process: if (!no_tilesets) { for(i = 0; strlen(def_tilesets[i].name); i++) { strcpy(tilesets[i].name, def_tilesets[i].name); strcpy(tilesets[i].file, def_tilesets[i].file); tilesets[i].flags = def_tilesets[i].flags; } no_tilesets = i; } if (tileset[0] != '\0') { unsigned int len = strlen(tileset); for(i = 0; i < no_tilesets; i++) if (len == strlen(tilesets[i].name) && !strncmpi(tilesets[i].name, tileset, len)) break; if (i == no_tilesets) { pline("Tileset %s not defined.", tileset); tileset[0] = '\0'; } else strcpy(tileset, tilesets[i].name); } 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; boolean bad_items = FALSE, skip = FALSE; if (!wizard || !(fp = fopen_wizkit_file())) return; while (fgets(buf, (int)(sizeof buf), fp)) { ep = index(buf, '\n'); if (skip) { /* in case previous line was too long */ if (ep) skip = FALSE; /* found newline; next line is normal */ } else { if (!ep) skip = TRUE; /* newline missing; discard next fgets */ else *ep = '\0'; /* remove newline */ if (buf[0]) { otmp = readobjnam(buf, (struct obj *)0, FALSE); if (otmp) { if (otmp != &zeroobj) otmp = addinv(otmp); } else { /* .60 limits output line width to 79 chars */ raw_printf("Bad wizkit item: \"%.60s\"", buf); bad_items = TRUE; } } } } if (bad_items) wait_synch(); (void) fclose(fp); return; } #endif /*WIZARD*/ /* ---------- END CONFIG FILE HANDLING ----------- */ /* ---------- BEGIN SCOREBOARD CREATION ----------- */ /* verify that we can write to the scoreboard file; if not, try to create one */ void check_recordfile(dir) const char *dir; { #if defined(MAC_MPW) || defined(__MWERKS__) # pragma unused(dir) #endif int fd; #ifndef FILE_AREAS const char *fq_record; #endif #if defined(UNIX) || defined(VMS) # ifdef FILE_AREAS fd = open_area(NH_RECORD_AREA, NH_RECORD, O_RDWR, 0); # else fq_record = fqname(NH_RECORD, SCOREPREFIX, 0); fd = open(fq_record, O_RDWR, 0); # endif if (fd >= 0) { # ifdef VMS /* must be stream-lf to use UPDATE_RECORD_IN_PLACE */ if (!file_is_stmlf(fd)) { raw_printf( "Warning: scoreboard file %s is not in stream_lf format", fq_record); wait_synch(); } # endif (void) close(fd); /* NH_RECORD is accessible */ # ifdef FILE_AREAS } else if ((fd = open_area(NH_RECORD_AREA, NH_RECORD, O_CREAT|O_RDWR, FCMASK)) >= 0) { # else } else if ((fd = open(fq_record, O_CREAT|O_RDWR, FCMASK)) >= 0) { # endif (void) close(fd); /* NH_RECORD newly created */ # if defined(VMS) && !defined(SECURE) /* Re-protect NH_RECORD with world:read+write+execute+delete access. */ # ifdef FILE_AREAS (void) chmod_area(NH_RECORD_AREA, NH_RECORD, FCMASK | 007); # else (void) chmod(fq_record, FCMASK | 007); # endif # endif /* VMS && !SECURE */ } else { # ifdef FILE_AREAS raw_printf("Warning: cannot write scoreboard file %s", NH_RECORD); # else raw_printf("Warning: cannot write scoreboard file %s", fq_record); # endif wait_synch(); } #endif /* !UNIX && !VMS */ #if defined(MICRO) || defined(WIN32) char tmp[PATHLEN]; # ifdef OS2_CODEVIEW /* explicit path on opening for OS/2 */ /* how does this work when there isn't an explicit path or fopenp * for later access to the file via fopen_datafile? ? */ (void) strncpy(tmp, dir, PATHLEN - 1); tmp[PATHLEN-1] = '\0'; if ((strlen(tmp) + 1 + strlen(NH_RECORD)) < (PATHLEN - 1)) { append_slash(tmp); Strcat(tmp, NH_RECORD); } # ifndef FILE_AREAS fq_record = tmp; # endif # else Strcpy(tmp, NH_RECORD); # ifndef FILE_AREAS fq_record = fqname(NH_RECORD, SCOREPREFIX, 0); # endif # endif # ifdef FILE_AREAS if ((fd = open_area(NH_RECORD_AREA, tmp, O_RDWR)) < 0) { # else if ((fd = open(fq_record, O_RDWR)) < 0) { # endif /* try to create empty record */ # if defined(FILE_AREAS) if ((fd = open_area(NH_RECORD_AREA, tmp, O_CREAT|O_RDWR, S_IREAD|S_IWRITE)) < 0) { # elif 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) { # else if ((fd = open(fq_record, O_CREAT|O_RDWR, S_IREAD|S_IWRITE)) < 0) { # endif raw_printf("Warning: cannot write record %s", tmp); wait_synch(); } else /* create succeeded */ (void) close(fd); } else /* open succeeded */ (void) close(fd); #else /* MICRO || WIN32*/ # ifdef MAC /* Create the record file, if necessary */ fq_record = fqname(NH_RECORD, SCOREPREFIX, 0); fd = macopen (fq_record, O_RDWR | O_CREAT, LOGF_TYPE); if (fd != -1) macclose (fd); /* Create the logfile, if necessary */ fq_record = fqname(LOGFILE, SCOREPREFIX, 0); fd = macopen (fq_record, O_RDWR | O_CREAT, LOGF_TYPE); if (fd != -1) macclose (fd); # endif /* MAC */ #endif /* MICRO || WIN32*/ } /* ---------- END SCOREBOARD CREATION ----------- */ /* ---------- BEGIN PANIC/IMPOSSIBLE LOG ----------- */ /*ARGSUSED*/ void paniclog(type, reason) const char *type; /* panic, impossible, trickery */ const char *reason; /* explanation */ { #ifdef PANICLOG FILE *lfile; char buf[BUFSZ]; if (!program_state.in_paniclog) { program_state.in_paniclog = 1; lfile = fopen_datafile(PANICLOG, "a", TROUBLEPREFIX); if (lfile) { (void) fprintf(lfile, "%s %08ld: %s %s\n", version_string(buf), yyyymmdd((time_t)0L), type, reason); (void) fclose(lfile); } program_state.in_paniclog = 0; } #endif /* PANICLOG */ return; } /* ---------- END PANIC/IMPOSSIBLE LOG ----------- */ #ifdef SELF_RECOVER /* ---------- BEGIN INTERNAL RECOVER ----------- */ boolean recover_savefile() { int gfd, lfd, sfd; int lev, savelev, hpid; xchar levc; struct version_info version_data; int processed[256]; char savename[SAVESIZE], errbuf[BUFSZ]; for (lev = 0; lev < 256; lev++) processed[lev] = 0; /* level 0 file contains: * pid of creating process (ignored here) * level number for current level of save file * name of save file nethack would have created * and game state */ gfd = open_levelfile(0, errbuf); if (gfd < 0) { raw_printf("%s\n", errbuf); return FALSE; } if (read(gfd, (genericptr_t) &hpid, sizeof hpid) != sizeof hpid) { raw_printf( "\nCheckpoint data incompletely written or subsequently clobbered. Recovery impossible."); (void)close(gfd); return FALSE; } if (read(gfd, (genericptr_t) &savelev, sizeof(savelev)) != sizeof(savelev)) { raw_printf("\nCheckpointing was not in effect for %s -- recovery impossible.\n", lock); (void)close(gfd); return FALSE; } if ((read(gfd, (genericptr_t) savename, sizeof savename) != sizeof savename) || (read(gfd, (genericptr_t) &version_data, sizeof version_data) != sizeof version_data)) { raw_printf("\nError reading %s -- can't recover.\n", lock); (void)close(gfd); return FALSE; } /* save file should contain: * version info * current level (including pets) * (non-level-based) game state * other levels */ set_savefile_name(); sfd = create_savefile(); if (sfd < 0) { raw_printf("\nCannot recover savefile %s.\n", SAVEF); (void)close(gfd); return FALSE; } lfd = open_levelfile(savelev, errbuf); if (lfd < 0) { raw_printf("\n%s\n", errbuf); (void)close(gfd); (void)close(sfd); delete_savefile(); return FALSE; } if (write(sfd, (genericptr_t) &version_data, sizeof version_data) != sizeof version_data) { raw_printf("\nError writing %s; recovery failed.", SAVEF); (void)close(gfd); (void)close(sfd); delete_savefile(); return FALSE; } if (!copy_bytes(lfd, sfd)) { (void) close(lfd); (void) close(sfd); delete_savefile(); return FALSE; } (void)close(lfd); processed[savelev] = 1; if (!copy_bytes(gfd, sfd)) { (void) close(lfd); (void) close(sfd); delete_savefile(); return FALSE; } (void)close(gfd); processed[0] = 1; for (lev = 1; lev < 256; lev++) { /* level numbers are kept in xchars in save.c, so the * maximum level number (for the endlevel) must be < 256 */ if (lev != savelev) { lfd = open_levelfile(lev, (char *)0); if (lfd >= 0) { /* any or all of these may not exist */ levc = (xchar) lev; write(sfd, (genericptr_t) &levc, sizeof(levc)); if (!copy_bytes(lfd, sfd)) { (void) close(lfd); (void) close(sfd); delete_savefile(); return FALSE; } (void)close(lfd); processed[lev] = 1; } } } (void)close(sfd); #ifdef HOLD_LOCKFILE_OPEN really_close(); #endif /* * We have a successful savefile! * Only now do we erase the level files. */ for (lev = 0; lev < 256; lev++) { if (processed[lev]) { const char *fq_lock; set_levelfile_name(lock, lev); fq_lock = fqname(lock, LEVELPREFIX, 3); (void) unlink(fq_lock); } } return TRUE; } boolean copy_bytes(ifd, ofd) int ifd, ofd; { char buf[BUFSIZ]; int nfrom, nto; do { nfrom = read(ifd, buf, BUFSIZ); nto = write(ofd, buf, nfrom); if (nto != nfrom) return FALSE; } while (nfrom == BUFSIZ); return TRUE; } /* ---------- END INTERNAL RECOVER ----------- */ #endif /*SELF_RECOVER*/ /*files.c*/ slashem-0.0.7E7F3/src/rumors.c0000664000076400007640000002540310545462317014142 0ustar aliali/* 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. */ #include "hack.h" #include "lev.h" #include "dlb.h" /* [note: this comment is fairly old, but still accurate for 3.1] * Rumors have been entirely rewritten to speed up the access. This is * essential when working from floppies. Using fseek() the way that's done * here means rumors following longer rumors are output more often than those * following shorter rumors. Also, you may see the same rumor more than once * in a particular game (although the odds are highly against it), but * this also happens with real fortune cookies. -dgk */ /* 3.1 * The rumors file consists of a "do not edit" line, a hexadecimal number * giving the number of bytes of useful/true rumors, followed by those * true rumors (one per line), followed by the useless/false/misleading/cute * rumors (also one per line). Number of bytes of untrue rumors is derived * via fseek(EOF)+ftell(). * * The oracles file consists of a "do not edit" comment, a decimal count N * and set of N+1 hexadecimal fseek offsets, followed by N multiple-line * records, separated by "---" lines. The first oracle is a special case, * and placed there by 'makedefs'. */ STATIC_DCL void FDECL(init_rumors, (dlb *)); STATIC_DCL void FDECL(init_oracles, (dlb *)); static long true_rumor_start, true_rumor_size, true_rumor_end, false_rumor_start, false_rumor_size, false_rumor_end; static int oracle_flg = 0; /* -1=>don't use, 0=>need init, 1=>init done */ static unsigned oracle_cnt = 0; static long *oracle_loc = 0; STATIC_OVL void init_rumors(fp) dlb *fp; { char line[BUFSZ]; (void) dlb_fgets(line, sizeof line, fp); /* skip "don't edit" comment */ (void) dlb_fgets(line, sizeof line, fp); if (sscanf(line, "%6lx\n", &true_rumor_size) == 1 && true_rumor_size > 0L) { (void) dlb_fseek(fp, 0L, SEEK_CUR); true_rumor_start = dlb_ftell(fp); true_rumor_end = true_rumor_start + true_rumor_size; (void) dlb_fseek(fp, 0L, SEEK_END); false_rumor_end = dlb_ftell(fp); false_rumor_start = true_rumor_end; /* ok, so it's redundant... */ false_rumor_size = false_rumor_end - false_rumor_start; } else true_rumor_size = -1L; /* init failed */ } /* exclude_cookie is a hack used because we sometimes want to get rumors in a * context where messages such as "You swallowed the fortune!" that refer to * cookies should not appear. This has no effect for true rumors since none * of them contain such references anyway. */ char * getrumor(truth, rumor_buf, exclude_cookie) int truth; /* 1=true, -1=false, 0=either */ char *rumor_buf; boolean exclude_cookie; { dlb *rumors; long tidbit, beginning; char *endp, line[BUFSZ], xbuf[BUFSZ]; rumor_buf[0] = '\0'; if (true_rumor_size < 0L) /* we couldn't open NH_RUMORFILE */ return rumor_buf; rumors = dlb_fopen_area(NH_RUMORAREA, NH_RUMORFILE, "r"); if (rumors) { int count = 0; int adjtruth; do { rumor_buf[0] = '\0'; if (true_rumor_size == 0L) { /* if this is 1st outrumor() */ init_rumors(rumors); if (true_rumor_size < 0L) { /* init failed */ Sprintf(rumor_buf, "Error reading \"%.80s\".", NH_RUMORFILE); return rumor_buf; } } /* * input: 1 0 -1 * rn2 \ +1 2=T 1=T 0=F * adj./ +0 1=T 0=F -1=F */ switch (adjtruth = truth + rn2(2)) { case 2: /*(might let a bogus input arg sneak thru)*/ case 1: beginning = true_rumor_start; tidbit = Rand() % true_rumor_size; break; case 0: /* once here, 0 => false rather than "either"*/ case -1: beginning = false_rumor_start; tidbit = Rand() % false_rumor_size; break; default: impossible("strange truth value for rumor"); return strcpy(rumor_buf, "Oops..."); } (void) dlb_fseek(rumors, beginning + tidbit, SEEK_SET); (void) dlb_fgets(line, sizeof line, rumors); if (!dlb_fgets(line, sizeof line, rumors) || (adjtruth > 0 && dlb_ftell(rumors) > true_rumor_end)) { /* reached end of rumors -- go back to beginning */ (void) dlb_fseek(rumors, beginning, SEEK_SET); (void) dlb_fgets(line, sizeof line, rumors); } if ((endp = index(line, '\n')) != 0) *endp = 0; Strcat(rumor_buf, xcrypt(line, xbuf)); } while(count++ < 50 && exclude_cookie && (strstri(rumor_buf, "fortune") || strstri(rumor_buf, "pity"))); (void) dlb_fclose(rumors); if (count >= 50) impossible("Can't find non-cookie rumor?"); else exercise(A_WIS, (adjtruth > 0)); } else { pline("Can't open rumors file!"); true_rumor_size = -1; /* don't try to open it again */ } return rumor_buf; } void outrumor(truth, mechanism) int truth; /* 1=true, -1=false, 0=either */ int mechanism; { static const char fortune_msg[] = "This cookie has a scrap of paper inside."; const char *line; char buf[BUFSZ]; 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) line = "NetHack rumors file closed for renovation."; switch (mechanism) { case BY_ORACLE: /* Oracle delivers the rumor */ pline("True to her word, the Oracle %ssays: ", (!rn2(4) ? "offhandedly " : (!rn2(3) ? "casually " : (rn2(2) ? "nonchalantly " : "")))); verbalize("%s", line); exercise(A_WIS, TRUE); return; case BY_COOKIE: pline(fortune_msg); /* FALLTHRU */ case BY_PAPER: pline("It reads:"); break; } pline("%s", line); } STATIC_OVL void init_oracles(fp) dlb *fp; { register int i; char line[BUFSZ]; int cnt = 0; /* this assumes we're only called once */ (void) dlb_fgets(line, sizeof line, fp); /* skip "don't edit" comment*/ (void) dlb_fgets(line, sizeof line, fp); if (sscanf(line, "%5d\n", &cnt) == 1 && cnt > 0) { oracle_cnt = (unsigned) cnt; oracle_loc = (long *) alloc((unsigned)cnt * sizeof (long)); for (i = 0; i < cnt; i++) { (void) dlb_fgets(line, sizeof line, fp); (void) sscanf(line, "%5lx\n", &oracle_loc[i]); } } return; } void save_oracles(fd, mode) int fd, mode; { if (perform_bwrite(mode)) { bwrite(fd, (genericptr_t) &oracle_cnt, sizeof oracle_cnt); if (oracle_cnt) bwrite(fd, (genericptr_t)oracle_loc, oracle_cnt*sizeof (long)); } if (release_data(mode)) { if (oracle_cnt) { free((genericptr_t)oracle_loc); oracle_loc = 0, oracle_cnt = 0, oracle_flg = 0; } } } void restore_oracles(fd) int fd; { mread(fd, (genericptr_t) &oracle_cnt, sizeof oracle_cnt); if (oracle_cnt) { oracle_loc = (long *) alloc(oracle_cnt * sizeof (long)); mread(fd, (genericptr_t) oracle_loc, oracle_cnt * sizeof (long)); oracle_flg = 1; /* no need to call init_oracles() */ } } void outoracle(special, delphi) boolean special; boolean delphi; { char line[COLNO]; char *endp; dlb *oracles; int oracle_idx; char xbuf[BUFSZ]; if(oracle_flg < 0 || /* couldn't open NH_ORACLEFILE */ (oracle_flg > 0 && oracle_cnt == 0)) /* oracles already exhausted */ return; oracles = dlb_fopen_area(NH_ORACLEAREA, NH_ORACLEFILE, "r"); if (oracles) { winid tmpwin; if (oracle_flg == 0) { /* if this is the first outoracle() */ init_oracles(oracles); oracle_flg = 1; if (oracle_cnt == 0) return; } /* oracle_loc[0] is the special oracle; */ /* oracle_loc[1..oracle_cnt-1] are normal ones */ if (oracle_cnt <= 1 && !special) return; /*(shouldn't happen)*/ oracle_idx = special ? 0 : rnd((int) oracle_cnt - 1); (void) dlb_fseek(oracles, oracle_loc[oracle_idx], SEEK_SET); if (!special) oracle_loc[oracle_idx] = oracle_loc[--oracle_cnt]; tmpwin = create_nhwindow(NHW_TEXT); if (delphi) putstr(tmpwin, 0, special ? "The Oracle scornfully takes all your money and says:" : "The Oracle meditates for a moment and then intones:"); else putstr(tmpwin, 0, "The message reads:"); putstr(tmpwin, 0, ""); while(dlb_fgets(line, COLNO, oracles) && strcmp(line,"---\n")) { if ((endp = index(line, '\n')) != 0) *endp = 0; putstr(tmpwin, 0, xcrypt(line, xbuf)); } display_nhwindow(tmpwin, TRUE); destroy_nhwindow(tmpwin); (void) dlb_fclose(oracles); } else { pline("Can't open oracles file!"); oracle_flg = -1; /* don't try to open it again */ } } int 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]; multi = 0; if (!oracl) { There("is no one here to consult."); return 0; } 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) { outrumor(1, BY_ORACLE); if (!u.uevent.minor_oracle) add_xpts = u_pay / (u.uevent.major_oracle ? 25 : 10); /* 5 pts if very 1st, or 2 pts if major already done */ u.uevent.minor_oracle = TRUE; } else { boolean cheapskate = u_pay < major_cost; outoracle(cheapskate, TRUE); if (!cheapskate && !u.uevent.major_oracle) add_xpts = u_pay / (u.uevent.minor_oracle ? 25 : 10); /* ~100 pts if very 1st, ~40 pts if minor already done */ u.uevent.major_oracle = TRUE; exercise(A_WIS, !cheapskate); } if (add_xpts) { more_experienced(add_xpts, u_pay/50); newexplevel(); } return 1; } /*rumors.c*/ slashem-0.0.7E7F3/src/restore.c0000664000076400007640000007061210545462317014300 0ustar aliali/* SCCS Id: @(#)restore.c 3.4 2003/09/06 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" #include "lev.h" #include "tcap.h" /* for TERMLIB and ASCIIGRAPH */ #if defined(MICRO) extern int dotcnt; /* shared with save */ extern int dotrow; /* shared with save */ #endif #ifdef USE_TILES extern void FDECL(substitute_tiles, (d_level *)); /* from tile.c */ #endif #ifdef ZEROCOMP static int NDECL(mgetc); #endif STATIC_DCL void NDECL(find_lev_obj); STATIC_DCL void FDECL(restlevchn, (int)); STATIC_DCL void FDECL(restdamage, (int,BOOLEAN_P)); STATIC_DCL struct obj *FDECL(restobjchn, (int,BOOLEAN_P,BOOLEAN_P)); STATIC_DCL struct monst *FDECL(restmonchn, (int,BOOLEAN_P)); STATIC_DCL struct fruit *FDECL(loadfruitchn, (int)); STATIC_DCL void FDECL(freefruitchn, (struct fruit *)); STATIC_DCL void FDECL(ghostfruit, (struct obj *)); STATIC_DCL boolean FDECL(restgamestate, (int, unsigned int *, unsigned int *)); STATIC_DCL void FDECL(restlevelstate, (unsigned int, unsigned int)); STATIC_DCL int FDECL(restlevelfile, (int,XCHAR_P)); STATIC_DCL void FDECL(reset_oattached_mids, (BOOLEAN_P)); /* * Save a mapping of IDs from ghost levels to the current level. This * map is used by the timer routines when restoring ghost levels. */ #define N_PER_BUCKET 64 struct bucket { struct bucket *next; struct { unsigned gid; /* ghost ID */ unsigned nid; /* new ID */ } map[N_PER_BUCKET]; }; STATIC_DCL void NDECL(clear_id_mapping); STATIC_DCL void FDECL(add_id_mapping, (unsigned, unsigned)); static int n_ids_mapped = 0; static struct bucket *id_map = 0; #ifdef AMII_GRAPHICS void FDECL( amii_setpens, (int) ); /* use colors from save file */ extern int amii_numcolors; #endif #include "quest.h" boolean restoring = FALSE; static NEARDATA struct fruit *oldfruit; static NEARDATA long omoves; #define Is_IceBox(o) ((o)->otyp == ICE_BOX ? TRUE : FALSE) /* Recalculate level.objects[x][y], since this info was not saved. */ STATIC_OVL void find_lev_obj() { register struct obj *fobjtmp = (struct obj *)0; register struct obj *otmp; int x,y; for(x=0; xnobj; otmp->nobj = fobjtmp; otmp->where = OBJ_FREE; fobjtmp = otmp; } /* fobj should now be empty */ /* Set level.objects (as well as reversing the chain back again) */ while ((otmp = fobjtmp) != 0) { fobjtmp = otmp->nobj; place_object(otmp, otmp->ox, otmp->oy); } } /* Things that were marked "in_use" when the game was saved (ex. via the * infamous "HUP" cheat) get used up here. */ void inven_inuse(quietly) boolean quietly; { register struct obj *otmp, *otmp2; for (otmp = invent; otmp; otmp = otmp2) { otmp2 = otmp->nobj; #ifndef GOLDOBJ if (otmp->oclass == COIN_CLASS) { /* in_use gold is created by some menu operations */ if (!otmp->in_use) { impossible("inven_inuse: !in_use gold in inventory"); } extract_nobj(otmp, &invent); otmp->in_use = FALSE; dealloc_obj(otmp); } else #endif /* GOLDOBJ */ if (otmp->in_use) { if (!quietly) pline("Finishing off %s...", xname(otmp)); useup(otmp); } } } STATIC_OVL void restlevchn(fd) register int fd; { int cnt; s_level *tmplev, *x; sp_levchn = (s_level *) 0; mread(fd, (genericptr_t) &cnt, sizeof(int)); for(; cnt > 0; cnt--) { tmplev = (s_level *)alloc(sizeof(s_level)); mread(fd, (genericptr_t) tmplev, sizeof(s_level)); if(!sp_levchn) sp_levchn = tmplev; else { for(x = sp_levchn; x->next; x = x->next); x->next = tmplev; } tmplev->next = (s_level *)0; } } STATIC_OVL void restdamage(fd, ghostly) int fd; boolean ghostly; { int counter; struct damage *tmp_dam; mread(fd, (genericptr_t) &counter, sizeof(counter)); if (!counter) return; tmp_dam = (struct damage *)alloc(sizeof(struct damage)); while (--counter >= 0) { char damaged_shops[5], *shp = (char *)0; mread(fd, (genericptr_t) tmp_dam, sizeof(*tmp_dam)); if (ghostly) tmp_dam->when += (monstermoves - omoves); Strcpy(damaged_shops, in_rooms(tmp_dam->place.x, tmp_dam->place.y, SHOPBASE)); if (u.uz.dlevel) { /* when restoring, there are two passes over the current * level. the first time, u.uz isn't set, so neither is * shop_keeper(). just wait and process the damage on * the second pass. */ for (shp = damaged_shops; *shp; shp++) { struct monst *shkp = shop_keeper(*shp); if (shkp && inhishop(shkp) && repair_damage(shkp, tmp_dam, TRUE)) break; } } if (!shp || !*shp) { tmp_dam->next = level.damagelist; level.damagelist = tmp_dam; tmp_dam = (struct damage *)alloc(sizeof(*tmp_dam)); } } free((genericptr_t)tmp_dam); } STATIC_OVL struct obj * restobjchn(fd, ghostly, frozen) register int fd; boolean ghostly, frozen; { register struct obj *otmp, *otmp2 = 0; register struct obj *first = (struct obj *)0; int xl; while(1) { mread(fd, (genericptr_t) &xl, sizeof(xl)); if(xl == -1) break; otmp = newobj(xl); if(!first) first = otmp; else otmp2->nobj = otmp; mread(fd, (genericptr_t) otmp, (unsigned) xl + sizeof(struct obj)); if (ghostly) { unsigned nid = flags.ident++; add_id_mapping(otmp->o_id, nid); otmp->o_id = nid; } if (ghostly && otmp->otyp == SLIME_MOLD) ghostfruit(otmp); /* Ghost levels get object age shifted from old player's clock * to new player's clock. Assumption: new player arrived * immediately after old player died. */ if (ghostly && !frozen && !age_is_relative(otmp)) otmp->age = monstermoves - omoves + otmp->age; /* get contents of a container or statue */ if (Has_contents(otmp)) { struct obj *otmp3; otmp->cobj = restobjchn(fd, ghostly, Is_IceBox(otmp)); /* restore container back pointers */ for (otmp3 = otmp->cobj; otmp3; otmp3 = otmp3->nobj) otmp3->ocontainer = otmp; } if (otmp->bypass) otmp->bypass = 0; otmp2 = otmp; } if(first && otmp2->nobj){ impossible("Restobjchn: error reading objchn."); otmp2->nobj = 0; } return(first); } STATIC_OVL struct monst * restmonchn(fd, ghostly) register int fd; boolean ghostly; { register struct monst *mtmp, *mtmp2 = 0; register struct monst *first = (struct monst *)0; int xl; struct permonst *monbegin; boolean moved; /* get the original base address */ mread(fd, (genericptr_t)&monbegin, sizeof(monbegin)); moved = (monbegin != mons); while(1) { mread(fd, (genericptr_t) &xl, sizeof(xl)); if(xl == -1) break; mtmp = newmonst(xl); if(!first) first = mtmp; else mtmp2->nmon = mtmp; mread(fd, (genericptr_t) mtmp, (unsigned) xl + sizeof(struct monst)); if (ghostly) { unsigned nid = flags.ident++; add_id_mapping(mtmp->m_id, nid); mtmp->m_id = nid; } if (moved && mtmp->data) { int offset = mtmp->data - monbegin; /*(ptrdiff_t)*/ mtmp->data = mons + offset; /* new permonst location */ } if (ghostly) { int mndx = monsndx(mtmp->data); if (propagate(mndx, TRUE, ghostly) == 0) { /* cookie to trigger purge in getbones() */ mtmp->mhpmax = DEFUNCT_MONSTER; } } if(mtmp->minvent) { struct obj *obj; mtmp->minvent = restobjchn(fd, ghostly, FALSE); /* restore monster back pointer */ for (obj = mtmp->minvent; obj; obj = obj->nobj) obj->ocarry = mtmp; } if (mtmp->mw) { struct obj *obj; for(obj = mtmp->minvent; obj; obj = obj->nobj) if (obj->owornmask & W_WEP) break; if (obj) mtmp->mw = obj; else { MON_NOWEP(mtmp); /* KMH -- this is more an annoyance than a bug */ /* impossible("bad monster weapon restore"); */ } } if (mtmp->isshk) restshk(mtmp, ghostly); if (mtmp->ispriest) restpriest(mtmp, ghostly); if (mtmp->isgyp && ghostly) gypsy_init(mtmp); mtmp2 = mtmp; } if(first && mtmp2->nmon){ impossible("Restmonchn: error reading monchn."); mtmp2->nmon = 0; } return(first); } STATIC_OVL struct fruit * loadfruitchn(fd) int fd; { register struct fruit *flist, *fnext; flist = 0; while (fnext = newfruit(), mread(fd, (genericptr_t)fnext, sizeof *fnext), fnext->fid != 0) { fnext->nextf = flist; flist = fnext; } dealloc_fruit(fnext); return flist; } STATIC_OVL void freefruitchn(flist) register struct fruit *flist; { register struct fruit *fnext; while (flist) { fnext = flist->nextf; dealloc_fruit(flist); flist = fnext; } } STATIC_OVL void ghostfruit(otmp) register struct obj *otmp; { register struct fruit *oldf; for (oldf = oldfruit; oldf; oldf = oldf->nextf) if (oldf->fid == otmp->spe) break; if (!oldf) impossible("no old fruit?"); else otmp->spe = fruitadd(oldf->fname); } STATIC_OVL boolean restgamestate(fd, stuckid, steedid) register int fd; unsigned int *stuckid, *steedid; /* STEED */ { /* discover is actually flags.explore */ boolean remember_discover = discover; struct obj *otmp; int uid; mread(fd, (genericptr_t) &uid, sizeof uid); if (uid != getuid()) { /* strange ... */ /* for wizard mode, issue a reminder; for others, treat it as an attempt to cheat and refuse to restore this file */ pline("Saved game was not yours."); #ifdef WIZARD if(!wizard) #endif return FALSE; } mread(fd, (genericptr_t) &flags, sizeof(struct flag)); flags.bypasses = 0; /* never use the saved value of bypasses */ if (remember_discover) discover = remember_discover; role_init(); /* Reset the initial role, gender, and alignment */ #ifdef AMII_GRAPHICS amii_setpens(amii_numcolors); /* use colors from save file */ #endif mread(fd, (genericptr_t) &u, sizeof(struct you)); init_uasmon(); #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 * uninitialized, so we only have to set it and not the other stuff. */ wiz1_level.dlevel = 0; u.uz.dnum = 0; u.uz.dlevel = 1; return(FALSE); } /* this stuff comes after potential aborted restore attempts */ restore_timers(fd, RANGE_GLOBAL, FALSE, 0L); restore_light_sources(fd); invent = restobjchn(fd, FALSE, FALSE); migrating_objs = restobjchn(fd, FALSE, FALSE); migrating_mons = restmonchn(fd, FALSE); mread(fd, (genericptr_t) mvitals, sizeof(mvitals)); /* * There are some things after this that can have unintended display * side-effects too early in the game. * Disable see_monsters() here, re-enable it at the top of moveloop() */ defer_see_monsters = TRUE; /* this comes after inventory has been loaded */ for(otmp = invent; otmp; otmp = otmp->nobj) if(otmp->owornmask) #ifdef DEBUG { pline ("obj(%s),", xname(otmp)); #endif setworn(otmp, otmp->owornmask); #ifdef DEBUG } #endif /* reset weapon so that player will get a reminder about "bashing" during next fight when bare-handed or wielding an unconventional item; for pick-axe, we aren't able to distinguish between having applied or wielded it, so be conservative and assume the former */ otmp = uwep; /* `uwep' usually init'd by setworn() in loop above */ uwep = 0; /* clear it and have setuwep() reinit */ setuwep(otmp,FALSE); /* (don't need any null check here) */ /* KMH, balance patch -- added fishing pole */ if (!uwep || uwep->otyp == PICK_AXE || uwep->otyp == GRAPPLING_HOOK || uwep->otyp == FISHING_POLE) unweapon = TRUE; restore_dungeon(fd); restlevchn(fd); mread(fd, (genericptr_t) &moves, sizeof moves); mread(fd, (genericptr_t) &monstermoves, sizeof monstermoves); mread(fd, (genericptr_t) &quest_status, sizeof(struct q_score)); mread(fd, (genericptr_t) spl_book, sizeof(struct spell) * (MAXSPELL + 1)); mread(fd, (genericptr_t) tech_list, sizeof(struct tech) * (MAXTECH + 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)); mread(fd, (genericptr_t) pl_fruit, sizeof pl_fruit); mread(fd, (genericptr_t) ¤t_fruit, sizeof current_fruit); freefruitchn(ffruit); /* clean up fruit(s) made by initoptions() */ ffruit = loadfruitchn(fd); restnames(fd); restore_waterlevel(fd); /* must come after all mons & objs are restored */ relink_timers(FALSE); relink_light_sources(FALSE); return(TRUE); } /* update game state pointers to those valid for the current level (so we * 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."); setustuck(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."); u.usteed = mtmp; remove_monster(mtmp->mx, mtmp->my); } #endif } /*ARGSUSED*/ /* fd used in MFLOPPY only */ STATIC_OVL int restlevelfile(fd, ltmp) register int fd; xchar ltmp; { #ifdef MAC_MPW # pragma unused(fd) #endif register int nfd; char whynot[BUFSZ]; nfd = create_levelfile(ltmp, whynot); if (nfd < 0) { /* BUG: should suppress any attempt to write a panic save file if file creation is now failing... */ panic("restlevelfile: %s", whynot); } #ifdef MFLOPPY if (!savelev(nfd, ltmp, COUNT_SAVE)) { /* The savelev can't proceed because the size required * is greater than the available disk space. */ pline("Not enough space on `%s' to restore your game.", levels); /* Remove levels and bones that may have been created. */ (void) close(nfd); # ifdef AMIGA clearlocks(); # else eraseall(levels, alllevels); eraseall(levels, allbones); /* Perhaps the person would like to play without a * RAMdisk. */ /* Maybe not [Tom] */ #if 0 if (ramdisk) { /* PlaywoRAMdisk may not return, but if it does * it is certain that ramdisk will be 0. */ playwoRAMdisk(); /* Rewind save file and try again */ (void) lseek(fd, (off_t)0, 0); (void) uptodate(fd, (char *)0); /* skip version */ return dorecover(fd); /* 0 or 1 */ } else #endif { # endif pline("Be seeing you..."); terminate(EXIT_SUCCESS); # ifndef AMIGA } # endif } #endif bufon(nfd); savelev(nfd, ltmp, WRITE_SAVE | FREE_SAVE); bclose(nfd); return(2); } int dorecover(fd) register int fd; { unsigned int stuckid = 0, steedid = 0; /* not a register */ xchar ltmp; int rtmp; struct obj *otmp; #ifdef STORE_PLNAME_IN_FILE mread(fd, (genericptr_t) plname, PL_NSIZ); #endif 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); (void) delete_savefile(); 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 */ setustuck((struct monst *)0); #ifdef STEED u.usteed = (struct monst *)0; #endif #ifdef MICRO # ifdef AMII_GRAPHICS { extern struct window_procs amii_procs; if(windowprocs.win_init_nhwindows== amii_procs.win_init_nhwindows){ extern winid WIN_BASE; clear_nhwindow(WIN_BASE); /* hack until there's a hook for this */ } } # else clear_nhwindow(WIN_MAP); # endif clear_nhwindow(WIN_MESSAGE); /* moved lower */ curs(WIN_MAP, 1, 1); dotcnt = 0; dotrow = 2; # ifdef TTY_GRAPHICS if (!strncmpi("tty", windowprocs.name, 3)) putstr(WIN_MAP, 0, "Restoring:"); # endif #endif while(1) { #ifdef ZEROCOMP if(mread(fd, (genericptr_t) <mp, sizeof ltmp) < 0) #else if(read(fd, (genericptr_t) <mp, sizeof ltmp) != sizeof ltmp) #endif break; getlev(fd, 0, ltmp, FALSE); #if defined(MICRO) && defined(TTY_GRAPHICS) if (!strncmpi("tty", windowprocs.name, 3)) { curs(WIN_MAP, 1+dotcnt++, dotrow); if (dotcnt >= (COLNO - 1)) { dotrow++; dotcnt = 0; } putstr(WIN_MAP, 0, "."); mark_synch(); } #endif rtmp = restlevelfile(fd, ltmp); if (rtmp < 2) return(rtmp); /* dorecover called recursively */ } #ifdef BSD (void) lseek(fd, 0L, 0); #else (void) lseek(fd, 0L, 0); /* (void) lseek(fd, (off_t)0, 0); */ #endif (void) uptodate(fd, (char *)0); /* skip version info */ #ifdef STORE_PLNAME_IN_FILE mread(fd, (genericptr_t) plname, PL_NSIZ); #endif getlev(fd, 0, (xchar)0, FALSE); (void) close(fd); if (!wizard && !discover) (void) delete_savefile(); #ifdef REINCARNATION if (Is_rogue_level(&u.uz)) assign_rogue_graphics(TRUE); #endif #ifdef USE_TILES substitute_tiles(&u.uz); #endif restlevelstate(stuckid, steedid); /* WAC -- This needs to be after the second restlevelstate * You() writes to the message line, which also updates the * status line. However, u.usteed needs to be corrected or else * weight/carrying capacities will be calculated by dereferencing * garbage pointers. * Side effect of this is that you don't see this message until after the * all the levels are loaded */ You("return to level %d in %s%s.", depth(&u.uz), dungeons[u.uz.dnum].dname, flags.debug ? " while in debug mode" : flags.explore ? " while in explore mode" : ""); #ifdef MFLOPPY gameDiskPrompt(); #endif max_rank_sz(); /* to recompute mrank_sz (botl.c) */ /* take care of iron ball & chain */ for(otmp = fobj; otmp; otmp = otmp->nobj) if(otmp->owornmask) setworn(otmp, otmp->owornmask); /* in_use processing must be after: * + The inventory has been read so that freeinv() works. * + The current level has been restored so billing information * is available. */ inven_inuse(FALSE); load_qtlist(); /* re-load the quest text info */ reset_attribute_clock(); /* Set up the vision internals, after levl[] data is loaded */ /* but before docrt(). */ vision_reset(); vision_full_recalc = 1; /* recompute vision (not saved) */ run_timers(); /* expire all timers that have gone off while away */ docrt(); restoring = FALSE; clear_nhwindow(WIN_MESSAGE); program_state.something_worth_saving++; /* useful data now exists */ /* Success! */ welcome(FALSE); return(1); } void trickery(reason) char *reason; { pline("Strange, this map is not as I remember it."); pline("Somebody is trying some trickery here..."); pline("This game is void."); killer = reason; done(TRICKED); } void getlev(fd, pid, lev, ghostly) int fd, pid; xchar lev; boolean ghostly; { register struct trap *trap; register struct monst *mtmp; branch *br; int hpid; xchar dlvl; int x, y; #ifdef TOS short tlev; #endif if (ghostly) clear_id_mapping(); #if defined(MSDOS) || defined(OS2) setmode(fd, O_BINARY); #endif /* Load the old fruit info. We have to do it first, so the * information is available when restoring the objects. */ if (ghostly) oldfruit = loadfruitchn(fd); /* First some sanity checks */ mread(fd, (genericptr_t) &hpid, sizeof(hpid)); /* CHECK: This may prevent restoration */ #ifdef TOS mread(fd, (genericptr_t) &tlev, sizeof(tlev)); dlvl=tlev&0x00ff; #else mread(fd, (genericptr_t) &dlvl, sizeof(dlvl)); #endif if ((pid && pid != hpid) || (lev && dlvl != lev)) { char trickbuf[BUFSZ]; if (pid && pid != hpid) Sprintf(trickbuf, "PID (%d) doesn't match saved PID (%d)!", hpid, pid); else Sprintf(trickbuf, "This is level %d, not %d!", dlvl, lev); #ifdef WIZARD if (wizard) pline(trickbuf); #endif trickery(trickbuf); } #ifdef RLECOMP { short i, j; uchar len; struct rm r; #if defined(MAC) /* Suppress warning about used before set */ (void) memset((genericptr_t) &r, 0, sizeof(r)); #endif i = 0; j = 0; len = 0; while(i < ROWNO) { while(j < COLNO) { if(len > 0) { levl[j][i] = r; len -= 1; j += 1; } else { mread(fd, (genericptr_t)&len, sizeof(uchar)); mread(fd, (genericptr_t)&r, sizeof(struct rm)); } } j = 0; i += 1; } } #else mread(fd, (genericptr_t) levl, sizeof(levl)); #endif /* RLECOMP */ mread(fd, (genericptr_t)&omoves, sizeof(omoves)); mread(fd, (genericptr_t)&upstair, sizeof(stairway)); mread(fd, (genericptr_t)&dnstair, sizeof(stairway)); mread(fd, (genericptr_t)&upladder, sizeof(stairway)); mread(fd, (genericptr_t)&dnladder, sizeof(stairway)); mread(fd, (genericptr_t)&sstairs, sizeof(stairway)); mread(fd, (genericptr_t)&updest, sizeof(dest_area)); mread(fd, (genericptr_t)&dndest, sizeof(dest_area)); mread(fd, (genericptr_t)&level.flags, sizeof(level.flags)); mread(fd, (genericptr_t)doors, sizeof(doors)); rest_rooms(fd); /* No joke :-) */ /* ALI - regenerate doorindex */ if (nroom) doorindex = rooms[nroom - 1].fdoor + rooms[nroom - 1].doorct; else { doorindex = 0; for (y = 0; y < ROWNO; y++) for (x = 0; x < COLNO; x++) if (IS_DOOR(levl[x][y].typ)) doorindex++; } restore_timers(fd, RANGE_LEVEL, ghostly, monstermoves - omoves); restore_light_sources(fd); fmon = restmonchn(fd, ghostly); /* regenerate animals while on another level */ if (u.uz.dlevel) { register struct monst *mtmp2; for(mtmp = fmon; mtmp; mtmp = mtmp2) { mtmp2 = mtmp->nmon; if (ghostly) { /* reset peaceful/malign relative to new character */ if(!mtmp->isshk) /* shopkeepers will reset based on name */ mtmp->mpeaceful = peace_minded(mtmp->data); set_malign(mtmp); } else if (monstermoves > omoves) mon_catchup_elapsed_time(mtmp, monstermoves - omoves); /* update shape-changers in case protection against them is different now than when the level was saved */ restore_cham(mtmp); } } rest_worm(fd); /* restore worm information */ ftrap = 0; while (trap = newtrap(), mread(fd, (genericptr_t)trap, sizeof(struct trap)), trap->tx != 0) { /* need "!= 0" to work around DICE 3.0 bug */ trap->ntrap = ftrap; ftrap = trap; } dealloc_trap(trap); fobj = restobjchn(fd, ghostly, FALSE); find_lev_obj(); /* restobjchn()'s `frozen' argument probably ought to be a callback routine so that we can check for objects being buried under ice */ level.buriedobjlist = restobjchn(fd, ghostly, FALSE); billobjs = restobjchn(fd, ghostly, FALSE); rest_engravings(fd); /* reset level.monsters for new level */ for (x = 0; x < COLNO; x++) for (y = 0; y < ROWNO; y++) level.monsters[x][y] = (struct monst *) 0; for (mtmp = level.monlist; mtmp; mtmp = mtmp->nmon) { if (mtmp->isshk) set_residency(mtmp, FALSE); place_monster(mtmp, mtmp->mx, mtmp->my); if (mtmp->wormno) place_wsegs(mtmp); } restdamage(fd, ghostly); rest_regions(fd, ghostly); if (ghostly) { /* Now get rid of all the temp fruits... */ freefruitchn(oldfruit), oldfruit = 0; if (lev > ledger_no(&medusa_level) && lev < ledger_no(&stronghold_level) && xdnstair == 0) { coord cc; mazexy(&cc); xdnstair = cc.x; ydnstair = cc.y; levl[cc.x][cc.y].typ = STAIRS; } br = Is_branchlev(&u.uz); if (br && u.uz.dlevel == 1) { d_level ltmp; if (on_level(&u.uz, &br->end1)) assign_level(<mp, &br->end2); else assign_level(<mp, &br->end1); switch(br->type) { case BR_STAIR: case BR_NO_END1: case BR_NO_END2: /* OK to assign to sstairs if it's not used */ assign_level(&sstairs.tolev, <mp); break; case BR_PORTAL: /* max of 1 portal per level */ { register struct trap *ttmp; for(ttmp = ftrap; ttmp; ttmp = ttmp->ntrap) if (ttmp->ttyp == MAGIC_PORTAL) break; if (!ttmp) panic("getlev: need portal but none found"); assign_level(&ttmp->dst, <mp); } break; } } else if (!br) { /* Remove any dangling portals. */ register struct trap *ttmp; for (ttmp = ftrap; ttmp; ttmp = ttmp->ntrap) if (ttmp->ttyp == MAGIC_PORTAL) { deltrap(ttmp); break; /* max of 1 portal/level */ } } } /* must come after all mons & objs are restored */ relink_timers(ghostly); relink_light_sources(ghostly); reset_oattached_mids(ghostly); #ifdef DUNGEON_GROWTH if (!ghostly) catchup_dgn_growths((monstermoves - omoves) / 5); #endif if (ghostly) clear_id_mapping(); } /* Clear all structures for object and monster ID mapping. */ STATIC_OVL void clear_id_mapping() { struct bucket *curr; while ((curr = id_map) != 0) { id_map = curr->next; free((genericptr_t) curr); } n_ids_mapped = 0; } /* Add a mapping to the ID map. */ STATIC_OVL void add_id_mapping(gid, nid) unsigned gid, nid; { int idx; idx = n_ids_mapped % N_PER_BUCKET; /* idx is zero on first time through, as well as when a new bucket is */ /* needed */ if (idx == 0) { struct bucket *gnu = (struct bucket *) alloc(sizeof(struct bucket)); gnu->next = id_map; id_map = gnu; } id_map->map[idx].gid = gid; id_map->map[idx].nid = nid; n_ids_mapped++; } /* * Global routine to look up a mapping. If found, return TRUE and fill * in the new ID value. Otherwise, return false and return -1 in the new * ID. */ boolean lookup_id_mapping(gid, nidp) unsigned gid, *nidp; { int i; struct bucket *curr; if (n_ids_mapped) for (curr = id_map; curr; curr = curr->next) { /* first bucket might not be totally full */ if (curr == id_map) { i = n_ids_mapped % N_PER_BUCKET; if (i == 0) i = N_PER_BUCKET; } else i = N_PER_BUCKET; while (--i >= 0) if (gid == curr->map[i].gid) { *nidp = curr->map[i].nid; return TRUE; } } return FALSE; } STATIC_OVL void reset_oattached_mids(ghostly) boolean ghostly; { 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; mtmp->mpeaceful = mtmp->mtame = 0; /* pet's owner died! */ } if (ghostly && otmp->oattached == OATTACHED_M_ID) { (void) memcpy((genericptr_t)&oldid, (genericptr_t)otmp->oextra, sizeof(oldid)); if (lookup_id_mapping(oldid, &nid)) (void) memcpy((genericptr_t)otmp->oextra, (genericptr_t)&nid, sizeof(nid)); else otmp->oattached = OATTACHED_NOTHING; } } } #ifdef ZEROCOMP #define RLESC '\0' /* Leading character for run of RLESC's */ #ifndef ZEROCOMP_BUFSIZ #define ZEROCOMP_BUFSIZ BUFSZ #endif static NEARDATA unsigned char inbuf[ZEROCOMP_BUFSIZ]; static NEARDATA unsigned short inbufp = 0; static NEARDATA unsigned short inbufsz = 0; static NEARDATA short inrunlength = -1; static NEARDATA int mreadfd; static int mgetc() { if (inbufp >= inbufsz) { inbufsz = read(mreadfd, (genericptr_t)inbuf, sizeof inbuf); if (!inbufsz) { if (inbufp > sizeof inbuf) error("EOF on file #%d.\n", mreadfd); inbufp = 1 + sizeof inbuf; /* exactly one warning :-) */ return -1; } inbufp = 0; } return inbuf[inbufp++]; } void minit() { inbufsz = 0; inbufp = 0; inrunlength = -1; } int mread(fd, buf, len) int fd; genericptr_t buf; register unsigned len; { /*register int readlen = 0;*/ if (fd < 0) error("Restore error; mread attempting to read file %d.", fd); mreadfd = fd; while (len--) { if (inrunlength > 0) { inrunlength--; *(*((char **)&buf))++ = '\0'; } else { register short ch = mgetc(); if (ch < 0) return -1; /*readlen;*/ if ((*(*(char **)&buf)++ = (char)ch) == RLESC) { inrunlength = mgetc(); } } /*readlen++;*/ } return 0; /*readlen;*/ } #else /* ZEROCOMP */ void minit() { return; } void mread(fd, buf, len) register int fd; register genericptr_t buf; register unsigned int len; { register int rlen; #if defined(BSD) || defined(ULTRIX) rlen = read(fd, buf, (int) len); if(rlen != len){ #else /* e.g. SYSV, __TURBOC__ */ rlen = read(fd, buf, (unsigned) len); if((unsigned)rlen != len){ #endif pline("Read %d instead of %u bytes.", rlen, len); if(restoring) { (void) close(fd); (void) delete_savefile(); error("Error restoring old game."); } panic("Error reading level file."); } } #endif /* ZEROCOMP */ /*restore.c*/ slashem-0.0.7E7F3/src/bones.c0000664000076400007640000003466310545462317013731 0ustar aliali/* SCCS Id: @(#)bones.c 3.4 2003/09/06 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985,1993. */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" #include "lev.h" extern char bones[]; /* from files.c */ #ifdef MFLOPPY extern long bytes_counted; #endif STATIC_DCL boolean FDECL(no_bones_level, (d_level *)); STATIC_DCL void FDECL(goodfruit, (int)); STATIC_DCL void FDECL(resetobjs,(struct obj *,BOOLEAN_P)); STATIC_DCL void FDECL(drop_upon_death, (struct monst *, struct obj *)); STATIC_OVL boolean no_bones_level(lev) d_level *lev; { extern d_level save_dlevel; /* in do.c */ s_level *sptr; if (ledger_no(&save_dlevel)) assign_level(lev, &save_dlevel); return (boolean)(((sptr = Is_special(lev)) != 0 && !sptr->boneid) || !dungeons[lev->dnum].boneid /* no bones on the last or multiway branch levels */ /* in any dungeon (level 1 isn't multiway). */ || Is_botlevel(lev) || (Is_branchlev(lev) && lev->dlevel > 1) || (lev->dlevel < 2) /* no bones on 1st level */ /* no bones in the invocation level */ || (In_hell(lev) && lev->dlevel == dunlevs_in_dungeon(lev) - 1) ); } /* Call this function for each fruit object saved in the bones level: it marks * that particular type of fruit as existing (the marker is that that type's * ID is positive instead of negative). This way, when we later save the * chain of fruit types, we know to only save the types that exist. */ STATIC_OVL void goodfruit(id) int id; { register struct fruit *f; for(f=ffruit; f; f=f->nextf) { if(f->fid == -id) { f->fid = id; return; } } } STATIC_OVL void resetobjs(ochain,restore) struct obj *ochain; boolean restore; { struct obj *otmp; for (otmp = ochain; otmp; otmp = otmp->nobj) { if (otmp->cobj) resetobjs(otmp->cobj,restore); if (((otmp->otyp != CORPSE || otmp->corpsenm < SPECIAL_PM) && otmp->otyp != STATUE) && (!otmp->oartifact || (restore && (exist_artifact(otmp->otyp, ONAME(otmp)) || is_quest_artifact(otmp))))) { otmp->oartifact = 0; otmp->onamelth = 0; *ONAME(otmp) = '\0'; } else if (otmp->oartifact && restore) artifact_exists(otmp,ONAME(otmp),TRUE); if (!restore) { /* do not zero out o_ids for ghost levels anymore */ if(objects[otmp->otyp].oc_uses_known) otmp->known = 0; otmp->dknown = otmp->bknown = 0; otmp->rknown = 0; otmp->invlet = 0; otmp->no_charge = 0; otmp->was_thrown = 0; if (otmp->otyp == SLIME_MOLD) goodfruit(otmp->spe); #ifdef MAIL else if (otmp->otyp == SCR_MAIL) otmp->spe = 1; #endif else if (otmp->otyp == EGG) otmp->spe = 0; else if (otmp->otyp == TIN) { /* make tins of unique monster's meat be empty */ if (otmp->corpsenm >= LOW_PM && (mons[otmp->corpsenm].geno & G_UNIQ)) otmp->corpsenm = NON_PM; } else if (otmp->otyp == AMULET_OF_YENDOR) { /* no longer the real Amulet */ otmp->otyp = FAKE_AMULET_OF_YENDOR; curse(otmp); } else if (otmp->otyp == CANDELABRUM_OF_INVOCATION) { if (otmp->lamplit) end_burn(otmp, TRUE); otmp->otyp = WAX_CANDLE; otmp->age = 50L; /* assume used */ if (otmp->spe > 0) otmp->quan = (long)otmp->spe; otmp->spe = 0; otmp->owt = weight(otmp); curse(otmp); } else if (otmp->otyp == BELL_OF_OPENING) { otmp->otyp = BELL; curse(otmp); } else if (otmp->otyp == SPE_BOOK_OF_THE_DEAD) { otmp->otyp = SPE_BLANK_PAPER; curse(otmp); } else if (otmp->oartifact == ART_KEY_OF_LAW || otmp->oartifact == ART_KEY_OF_NEUTRALITY || otmp->oartifact == ART_KEY_OF_CHAOS || otmp->oartifact == ART_NIGHTHORN || otmp->oartifact == ART_EYE_OF_THE_BEHOLDER || otmp->oartifact == ART_HAND_OF_VECNA || otmp->oartifact == ART_THIEFBANE) { /* Guaranteed artifacts become ordinary objects */ otmp->oartifact = 0; otmp->onamelth = 0; *ONAME(otmp) = '\0'; } } } } STATIC_OVL void drop_upon_death(mtmp, cont) struct monst *mtmp; struct obj *cont; { struct obj *otmp; uswapwep = 0; /* ensure curse() won't cause swapwep to drop twice */ 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); if(rn2(5)) curse(otmp); 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 */ boolean can_make_bones() { register struct trap *ttmp; #ifdef NO_BONES return FALSE; #endif if (ledger_no(&u.uz) <= 0 || ledger_no(&u.uz) > maxledgerno()) return FALSE; if (no_bones_level(&u.uz)) return FALSE; /* no bones for specific levels */ if (u.uswallow) { return FALSE; /* no bones when swallowed */ } if (!Is_branchlev(&u.uz)) { /* no bones on non-branches with portals */ for(ttmp = ftrap; ttmp; ttmp = ttmp->ntrap) if (ttmp->ttyp == MAGIC_PORTAL) return FALSE; } /* Several variant authors have experimented with bones probabilities */ /* KMH -- Restored to NetHack's chances, to limit abuse and for fairness */ /* to both low-level and high-level characters */ if(depth(&u.uz) <= 0 || /* bulletproofing for endgame */ (!rn2(1 + (depth(&u.uz)>>2)) /* fewer ghosts on low levels */ #ifdef WIZARD && !wizard #endif )) return FALSE; /* don't let multiple restarts generate multiple copies of objects * in bones files */ if (discover) return FALSE; return TRUE; } /* save bones and possessions of a deceased adventurer */ void savebones(corpse) struct obj *corpse; { int fd, x, y; struct trap *ttmp; struct monst *mtmp; struct permonst *mptr; struct fruit *f; char c, *bonesid; char whynot[BUFSZ]; /* caller has already checked `can_make_bones()' */ clear_bypasses(); fd = open_bonesfile(&u.uz, &bonesid); if (fd >= 0) { (void) close(fd); compress_bonesfile(); #ifdef WIZARD if (wizard) { if (yn("Bones file already exists. Replace it?") == 'y') { if (delete_bonesfile(&u.uz)) goto make_bones; else pline("Cannot unlink old bones."); } } #endif 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) { if (DEADMONSTER(mtmp)) continue; mptr = mtmp->data; if (mtmp->iswiz || mptr == &mons[PM_MEDUSA] || mptr->msound == MS_NEMESIS || mptr->msound == MS_LEADER || mptr == &mons[PM_VLAD_THE_IMPALER] || mptr == &mons[PM_NIGHTMARE] || mptr == &mons[PM_BEHOLDER] || mptr == &mons[PM_VECNA] || mptr == &mons[PM_CTHULHU]) { /* Since these monsters may be carrying indestructible * artifacts, free inventory specifically here to avoid * the indestructible sanity check in discard_minvent. * Similar considerations cause the necessity to avoid * calling delete_contents on containers which are * directly in a monster's inventory (indestructable * objects would be dropped on the floor). */ struct obj *otmp, *curr; while ((otmp = mtmp->minvent) != 0) { while (Has_contents(otmp)) { while (Has_contents(otmp->cobj)) delete_contents(otmp->cobj); curr = otmp->cobj; obj_extract_self(curr); obfree(curr, (struct obj *)0); } obj_extract_self(otmp); obfree(otmp, (struct obj *)0); } mongone(mtmp); } } #ifdef STEED if (u.usteed) dismount_steed(DISMOUNT_BONES); #endif dmonsfree(); /* discard dead or gone monsters */ /* mark all fruits as nonexistent; when we come to them we'll mark * them as existing (using goodfruit()) */ for(f=ffruit; f; f=f->nextf) f->fid = -f->fid; /* check iron balls separately--maybe they're not carrying it */ if (uball) uball->owornmask = uchain->owornmask = 0; /* dispose of your possessions, usually cursed */ if (u.ugrave_arise == (NON_PM - 1)) { struct obj *otmp; /* embed your possessions in your statue */ otmp = mk_named_object(STATUE, &mons[u.umonnum], u.ux, u.uy, plname); drop_upon_death((struct monst *)0, otmp); if (!otmp) return; /* couldn't make statue */ mtmp = (struct monst *)0; } else if (u.ugrave_arise < LOW_PM) { /* drop everything */ drop_upon_death((struct monst *)0, (struct obj *)0); /* trick makemon() into allowing monster creation * on your location */ in_mklev = TRUE; mtmp = makemon(&mons[PM_GHOST], u.ux, u.uy, MM_NONAME); in_mklev = FALSE; if (!mtmp) return; mtmp = christen_monst(mtmp, plname); if (corpse) (void) obj_attach_mid(corpse, mtmp->m_id); } else { /* give your possessions to the monster you become */ in_mklev = TRUE; mtmp = makemon(&mons[u.ugrave_arise], u.ux, u.uy, NO_MM_FLAGS); in_mklev = FALSE; if (!mtmp) { drop_upon_death((struct monst *)0, (struct obj *)0); return; } mtmp = christen_monst(mtmp, plname); newsym(u.ux, u.uy); Your("body rises from the dead as %s...", an(mons[u.ugrave_arise].mname)); display_nhwindow(WIN_MESSAGE, FALSE); drop_upon_death(mtmp, (struct obj *)0); m_dowear(mtmp, TRUE); } if (mtmp) { mtmp->m_lev = (u.ulevel ? u.ulevel : 1); mtmp->mhp = mtmp->mhpmax = u.uhpmax; mtmp->female = flags.female; mtmp->msleeping = 1; } for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) { resetobjs(mtmp->minvent,FALSE); /* do not zero out m_ids for bones levels any more */ mtmp->mlstmv = 0L; if(mtmp->mtame) mtmp->mtame = mtmp->mpeaceful = 0; } for(ttmp = ftrap; ttmp; ttmp = ttmp->ntrap) { ttmp->madeby_u = 0; ttmp->tseen = (ttmp->ttyp == HOLE); } resetobjs(fobj,FALSE); resetobjs(level.buriedobjlist, FALSE); /* Hero is no longer on the map. */ u.ux = u.uy = 0; /* Clear all memory from the level. */ for(x=0; x freediskspace(bones)) { /* not enough room */ # ifdef WIZARD if (wizard) pline("Insufficient space to create bones file."); # endif (void) close(fd); cancel_bonesfile(); return; } co_false(); /* make sure stuff before savelev() gets written */ } #endif /* MFLOPPY */ store_version(fd); bwrite(fd, (genericptr_t) &c, sizeof c); bwrite(fd, (genericptr_t) bonesid, (unsigned) c); /* DD.nnn */ savefruitchn(fd, WRITE_SAVE | FREE_SAVE); update_mlstmv(); /* update monsters for eventual restoration */ savelev(fd, ledger_no(&u.uz), WRITE_SAVE | FREE_SAVE); bclose(fd); commit_bonesfile(&u.uz); compress_bonesfile(); } int getbones() { register int fd; register int ok; char c, *bonesid, oldbonesid[10]; #ifdef NO_BONES return(0); #endif if(discover) /* save bones files for real games */ return(0); /* wizard check added by GAN 02/05/87 */ if(rn2(3) /* only once in three times do we find bones */ #ifdef WIZARD && !wizard #endif ) return(0); if(no_bones_level(&u.uz)) return(0); fd = open_bonesfile(&u.uz, &bonesid); if (fd < 0) return(0); if ((ok = uptodate(fd, bones)) == 0) { #ifdef WIZARD if (!wizard) #endif pline("Discarding unuseable bones; no need to panic..."); } else { #ifdef WIZARD if(wizard) { if(yn("Get bones?") == 'n') { (void) close(fd); compress_bonesfile(); return(0); } } #endif mread(fd, (genericptr_t) &c, sizeof c); /* length incl. '\0' */ mread(fd, (genericptr_t) oldbonesid, (unsigned) c); /* DD.nnn */ if (strcmp(bonesid, oldbonesid) != 0) { char errbuf[BUFSZ]; Sprintf(errbuf, "This is bones level '%s', not '%s'!", oldbonesid, bonesid); #ifdef WIZARD if (wizard) { pline("%s", errbuf); ok = FALSE; /* won't die of trickery */ } #endif trickery(errbuf); } else { register struct monst *mtmp; getlev(fd, 0, 0, TRUE); /* Note that getlev() now keeps tabs on unique * monsters such as demon lords, and tracks the * birth counts of all species just as makemon() * does. If a bones monster is extinct or has been * subject to genocide, their mhpmax will be * set to the magic DEFUNCT_MONSTER cookie value. */ for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) { if (mtmp->mhpmax == DEFUNCT_MONSTER) { #if defined(DEBUG) && defined(WIZARD) if (wizard) pline("Removing defunct monster %s from bones.", mtmp->data->mname); #endif mongone(mtmp); } else /* to correctly reset named artifacts on the level */ resetobjs(mtmp->minvent,TRUE); } resetobjs(fobj,TRUE); resetobjs(level.buriedobjlist,TRUE); } } (void) close(fd); #ifdef WIZARD if(wizard) { if(yn("Unlink bones?") == 'n') { compress_bonesfile(); return(ok); } } #endif if (!delete_bonesfile(&u.uz)) { /* When N games try to simultaneously restore the same * bones file, N-1 of them will fail to delete it * (the first N-1 under AmigaDOS, the last N-1 under UNIX). * So no point in a mysterious message for a normal event * -- just generate a new level for those N-1 games. */ /* pline("Cannot unlink bones."); */ return(0); } return(ok); } /*bones.c*/ slashem-0.0.7E7F3/src/dig.c0000664000076400007640000013541010545462317013356 0ustar aliali/* SCCS Id: @(#)dig.c 3.4 2003/03/23 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" #include "edog.h" /* #define DEBUG */ /* turn on for diagnostics */ #ifdef OVLB static NEARDATA boolean did_dig_msg; STATIC_DCL boolean NDECL(rm_waslit); STATIC_DCL void FDECL(mkcavepos, (XCHAR_P,XCHAR_P,int,BOOLEAN_P,BOOLEAN_P)); STATIC_DCL void FDECL(mkcavearea, (BOOLEAN_P)); STATIC_DCL int FDECL(dig_typ, (struct obj *,XCHAR_P,XCHAR_P)); STATIC_DCL int NDECL(dig); STATIC_DCL schar FDECL(fillholetyp, (int, int)); STATIC_DCL void NDECL(dig_up_grave); /* Indices returned by dig_typ() */ #define DIGTYP_UNDIGGABLE 0 #define DIGTYP_ROCK 1 #define DIGTYP_STATUE 2 #define DIGTYP_BOULDER 3 #define DIGTYP_DOOR 4 #define DIGTYP_TREE 5 STATIC_OVL boolean rm_waslit() { register xchar x, y; if(levl[u.ux][u.uy].typ == ROOM && levl[u.ux][u.uy].waslit) return(TRUE); for(x = u.ux-2; x < u.ux+3; x++) for(y = u.uy-1; y < u.uy+2; y++) if(isok(x,y) && levl[x][y].waslit) return(TRUE); return(FALSE); } /* Change level topology. Messes with vision tables and ignores things like * boulders in the name of a nice effect. Vision will get fixed up again * immediately after the effect is complete. */ STATIC_OVL void mkcavepos(x, y, dist, waslit, rockit) xchar x,y; int dist; boolean waslit, rockit; { register struct rm *lev; if(!isok(x,y)) return; lev = &levl[x][y]; if(rockit) { register struct monst *mtmp; if(IS_ROCK(lev->typ)) return; if(t_at(x, y)) return; /* don't cover the portal */ if ((mtmp = m_at(x, y)) != 0) /* make sure crucial monsters survive */ if(!passes_walls(mtmp->data)) (void) rloc(mtmp, FALSE); } else if(lev->typ == ROOM) return; unblock_point(x,y); /* make sure vision knows this location is open */ /* fake out saved state */ lev->seenv = 0; lev->doormask = 0; if(dist < 3) lev->lit = (rockit ? FALSE : TRUE); if(waslit) lev->waslit = (rockit ? FALSE : TRUE); lev->horizontal = FALSE; viz_array[y][x] = (dist < 3 ) ? (IN_SIGHT|COULD_SEE) : /* short-circuit vision recalc */ COULD_SEE; lev->typ = (rockit ? STONE : ROOM); if(dist >= 3) impossible("mkcavepos called with dist %d", dist); if(Blind) feel_location(x, y); else newsym(x,y); } STATIC_OVL void mkcavearea(rockit) register boolean rockit; { int dist; xchar xmin = u.ux, xmax = u.ux; xchar ymin = u.uy, ymax = u.uy; register xchar i; register boolean waslit = rm_waslit(); if(rockit) pline("Crash! The ceiling collapses around you!"); else pline("A mysterious force %s cave around you!", (levl[u.ux][u.uy].typ == CORR) ? "creates a" : "extends the"); display_nhwindow(WIN_MESSAGE, TRUE); for(dist = 1; dist <= 2; dist++) { xmin--; xmax++; /* top and bottom */ if(dist < 2) { /* the area is wider that it is high */ ymin--; ymax++; for(i = xmin+1; i < xmax; i++) { mkcavepos(i, ymin, dist, waslit, rockit); mkcavepos(i, ymax, dist, waslit, rockit); } } /* left and right */ for(i = ymin; i <= ymax; i++) { mkcavepos(xmin, i, dist, waslit, rockit); mkcavepos(xmax, i, dist, waslit, rockit); } flush_screen(1); /* make sure the new glyphs shows up */ delay_output(); } if(!rockit && levl[u.ux][u.uy].typ == CORR) { levl[u.ux][u.uy].typ = ROOM; if(waslit) levl[u.ux][u.uy].waslit = TRUE; newsym(u.ux, u.uy); /* in case player is invisible */ } vision_full_recalc = 1; /* everything changed */ } /* When digging into location , what are you actually digging into? */ STATIC_OVL int dig_typ(otmp, x, y) struct obj *otmp; xchar x, y; { boolean ispick = is_pick(otmp); return (ispick && sobj_at(STATUE, x, y) ? DIGTYP_STATUE : ispick && sobj_at(BOULDER, x, y) ? DIGTYP_BOULDER : closed_door(x, y) ? DIGTYP_DOOR : IS_TREE(levl[x][y].typ) ? (ispick ? DIGTYP_UNDIGGABLE : DIGTYP_TREE) : ispick && IS_ROCK(levl[x][y].typ) && (!level.flags.arboreal || IS_WALL(levl[x][y].typ)) ? DIGTYP_ROCK : DIGTYP_UNDIGGABLE); } boolean is_digging() { if (occupation == dig) { return TRUE; } return FALSE; } #define BY_YOU (&youmonst) #define BY_OBJECT ((struct monst *)0) boolean dig_check(madeby, verbose, x, y) struct monst *madeby; boolean verbose; int x, y; { struct trap *ttmp = t_at(x, y); const char *verb = (madeby != BY_YOU || !uwep || is_pick(uwep)) ? "dig in" : #ifdef LIGHTSABERS is_lightsaber(uwep) ? "cut" : #endif "chop"; if (On_stairs(x, y)) { if (x == xdnladder || x == xupladder) { if(verbose) pline_The("ladder resists your effort."); } else if(verbose) pline_The("stairs are too hard to %s.", verb); return(FALSE); /* ALI - Artifact doors */ } else if (IS_DOOR(levl[x][y].typ) && artifact_door(x, y)) { if(verbose) pline_The("%s here is too hard to dig in.", surface(x,y)); return(FALSE); } else if (IS_THRONE(levl[x][y].typ) && madeby != BY_OBJECT) { if(verbose) pline_The("throne is too hard to break apart."); return(FALSE); } else if (IS_ALTAR(levl[x][y].typ) && (madeby != BY_OBJECT || Is_astralevel(&u.uz) || Is_sanctum(&u.uz))) { if(verbose) pline_The("altar is too hard to break apart."); return(FALSE); } else if (Is_airlevel(&u.uz)) { if(verbose) You("cannot %s thin air.", verb); return(FALSE); } else if (Is_waterlevel(&u.uz)) { if(verbose) pline_The("water splashes and subsides."); return(FALSE); } else if ((IS_ROCK(levl[x][y].typ) && levl[x][y].typ != SDOOR && (levl[x][y].wall_info & W_NONDIGGABLE) != 0) || (ttmp && (ttmp->ttyp == MAGIC_PORTAL || !Can_dig_down(&u.uz)))) { if(verbose) pline_The("%s here is too hard to %s.", surface(x,y), verb); return(FALSE); } else if (sobj_at(BOULDER, x, y)) { if(verbose) There("isn't enough room to %s here.", verb); return(FALSE); } else if (madeby == BY_OBJECT && /* the block against existing traps is mainly to prevent broken wands from turning holes into pits */ (ttmp || is_pool(x,y) || is_lava(x,y))) { /* digging by player handles pools separately */ return FALSE; } return(TRUE); } STATIC_OVL int dig() { register struct rm *lev; register xchar dpx = digging.pos.x, dpy = digging.pos.y; register boolean ispick = uwep && is_pick(uwep); const char *verb = (!uwep || is_pick(uwep)) ? "dig into" : #ifdef LIGHTSABERS is_lightsaber(uwep) ? "cut through" : #endif "chop through"; int bonus; lev = &levl[dpx][dpy]; /* perhaps a nymph stole your pick-axe while you were busy digging */ /* or perhaps you teleported away */ /* WAC allow lightsabers */ if (u.uswallow || !uwep || (!ispick && #ifdef LIGHTSABERS (!is_lightsaber(uwep) || !uwep->lamplit) && #endif !is_axe(uwep)) || !on_level(&digging.level, &u.uz) || ((digging.down ? (dpx != u.ux || dpy != u.uy) : (distu(dpx,dpy) > 2)))) return(0); if (digging.down) { if(!dig_check(BY_YOU, TRUE, u.ux, u.uy)) return(0); } else { /* !digging.down */ if (IS_TREE(lev->typ) && !may_dig(dpx,dpy) && dig_typ(uwep, dpx, dpy) == DIGTYP_TREE) { pline("This tree seems to be petrified."); return(0); } /* ALI - Artifact doors */ if (IS_ROCK(lev->typ) && !may_dig(dpx,dpy) && dig_typ(uwep, dpx, dpy) == DIGTYP_ROCK || IS_DOOR(lev->typ) && artifact_door(dpx, dpy)) { pline("This %s is too hard to %s.", IS_DOOR(lev->typ) ? "door" : "wall", verb); return(0); } } if(Fumbling && #ifdef LIGHTSABERS /* Can't exactly miss holding a lightsaber to the wall */ !is_lightsaber(uwep) && #endif !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); } bonus = 10 + rn2(5) + abon() + uwep->spe - greatest_erosion(uwep) + u.udaminc; if (Race_if(PM_DWARF)) bonus *= 2; #ifdef LIGHTSABERS if (is_lightsaber(uwep)) bonus -= rn2(20); /* Melting a hole takes longer */ #endif digging.effort += bonus; if (digging.down) { register struct trap *ttmp; if (digging.effort > 250) { (void) dighole(FALSE); (void) memset((genericptr_t)&digging, 0, sizeof digging); return(0); /* done with digging */ } if (digging.effort <= 50 || #ifdef LIGHTSABERS is_lightsaber(uwep) || #endif ((ttmp = t_at(dpx,dpy)) != 0 && (ttmp->ttyp == PIT || ttmp->ttyp == SPIKED_PIT || ttmp->ttyp == TRAPDOOR || ttmp->ttyp == HOLE))) return(1); if (IS_ALTAR(lev->typ)) { altar_wrath(dpx, dpy); angry_priest(); } if (dighole(TRUE)) { /* make pit at */ digging.level.dnum = 0; digging.level.dlevel = -1; } return(0); } if (digging.effort > 100) { register const char *digtxt, *dmgtxt = (const char*) 0; register struct obj *obj; register boolean shopedge = *in_rooms(dpx, dpy, SHOPBASE); if ((obj = sobj_at(STATUE, dpx, dpy)) != 0) { if (break_statue(obj)) digtxt = "The statue shatters."; else /* it was a statue trap; break_statue() * printed a message and updated the screen */ 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)) { if(Is_earthlevel(&u.uz)) { if(uwep->blessed && !rn2(3)) { mkcavearea(FALSE); goto cleanup; } else if((uwep->cursed && !rn2(4)) || (!uwep->blessed && !rn2(6))) { mkcavearea(TRUE); goto cleanup; } } if (IS_TREE(lev->typ)) { digtxt = "You cut down the tree."; lev->typ = ROOM; if (!rn2(5)) (void) rnd_treefruit_at(dpx, dpy); } else { digtxt = "You succeed in cutting away some rock."; lev->typ = CORR; } } else if(IS_WALL(lev->typ)) { if(shopedge) { add_damage(dpx, dpy, 10L * ACURRSTR); dmgtxt = "damage"; } if (level.flags.is_maze_lev) { lev->typ = ROOM; } else if (level.flags.is_cavernous_lev && !in_town(dpx, dpy)) { lev->typ = CORR; } else { lev->typ = DOOR; lev->doormask = D_NODOOR; } digtxt = "You make an opening in the wall."; } else if(lev->typ == SDOOR) { cvt_sdoor_to_door(lev); /* ->typ = DOOR */ digtxt = "You break through a secret door!"; if(!(lev->doormask & D_TRAPPED)) lev->doormask = D_BROKEN; } else if(closed_door(dpx, dpy)) { digtxt = "You break through the door."; if(shopedge) { add_damage(dpx, dpy, 400L); dmgtxt = "break"; } if(!(lev->doormask & D_TRAPPED)) 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, FALSE); if(Is_earthlevel(&u.uz) && !rn2(3)) { register struct monst *mtmp; switch(rn2(2)) { case 0: mtmp = makemon(&mons[PM_EARTH_ELEMENTAL], dpx, dpy, NO_MM_FLAGS); break; default: mtmp = makemon(&mons[PM_XORN], dpx, dpy, NO_MM_FLAGS); break; } if(mtmp) pline_The("debris reassembles and comes to life!"); } if(IS_DOOR(lev->typ) && (lev->doormask & D_TRAPPED)) { lev->doormask = D_NODOOR; b_trapped("door", 0); newsym(dpx, dpy); } cleanup: digging.lastdigtime = moves; digging.quiet = FALSE; digging.level.dnum = 0; digging.level.dlevel = -1; return(0); } else { /* not enough effort has been spent yet */ static const char *const d_target[6] = { "", "rock", "statue", "boulder", "door", "tree" }; int dig_target = dig_typ(uwep, dpx, dpy); if (IS_WALL(lev->typ) || dig_target == DIGTYP_DOOR) { if(*in_rooms(dpx, dpy, SHOPBASE)) { pline("This %s seems too hard to %s.", IS_DOOR(lev->typ) ? "door" : "wall", verb); return(0); } } else if (!IS_ROCK(lev->typ) && dig_target == DIGTYP_ROCK) return(0); /* statue or boulder got taken */ if(!did_dig_msg) { #ifdef LIGHTSABERS if (is_lightsaber(uwep)) You("burn steadily through %s.", the(d_target[dig_target])); else #endif You("hit the %s with all your might.", d_target[dig_target]); did_dig_msg = TRUE; } } return(1); } /* When will hole be finished? Very rough indication used by shopkeeper. */ int holetime() { if(occupation != dig || !*u.ushops) return(-1); return ((250 - digging.effort) / 20); } /* Return typ of liquid to fill a hole with, or ROOM, if no liquid nearby */ STATIC_OVL schar fillholetyp(x,y) int x, y; { register int x1, y1; int lo_x = max(1,x-1), hi_x = min(x+1,COLNO-1), lo_y = max(0,y-1), hi_y = min(y+1,ROWNO-1); int pool_cnt = 0, moat_cnt = 0, lava_cnt = 0; for (x1 = lo_x; x1 <= hi_x; x1++) for (y1 = lo_y; y1 <= hi_y; y1++) if (levl[x1][y1].typ == POOL) pool_cnt++; else if (levl[x1][y1].typ == MOAT || (levl[x1][y1].typ == DRAWBRIDGE_UP && (levl[x1][y1].drawbridgemask & DB_UNDER) == DB_MOAT)) moat_cnt++; else if (levl[x1][y1].typ == LAVAPOOL || (levl[x1][y1].typ == DRAWBRIDGE_UP && (levl[x1][y1].drawbridgemask & DB_UNDER) == DB_LAVA)) lava_cnt++; pool_cnt /= 3; /* not as much liquid as the others */ if (lava_cnt > moat_cnt + pool_cnt && rn2(lava_cnt + 1)) return LAVAPOOL; else if (moat_cnt > 0 && rn2(moat_cnt + 1)) return MOAT; else if (pool_cnt > 0 && rn2(pool_cnt + 1)) return POOL; else return ROOM; } void digactualhole(x, y, madeby, ttyp) register int x, y; struct monst *madeby; int ttyp; { struct obj *oldobjs, *newobjs; register struct trap *ttmp; char surface_type[BUFSZ]; struct rm *lev = &levl[x][y]; boolean shopdoor; struct monst *mtmp = m_at(x, y); /* may be madeby */ boolean madeby_u = (madeby == BY_YOU); boolean madeby_obj = (madeby == BY_OBJECT); boolean at_u = (x == u.ux) && (y == u.uy); boolean wont_fall = Levitation || Flying; if (u.utrap && u.utraptype == TT_INFLOOR) u.utrap = 0; /* these furniture checks were in dighole(), but wand breaking bypasses that routine and calls us directly */ if (IS_FOUNTAIN(lev->typ)) { dogushforth(FALSE); SET_FOUNTAIN_WARNED(x,y); /* force dryup */ dryup(x, y, madeby_u); return; #ifdef SINKS } else if (IS_SINK(lev->typ)) { breaksink(x, y); return; } else if (IS_TOILET(lev->typ)) { breaktoilet(u.ux,u.uy); #endif } else if (lev->typ == DRAWBRIDGE_DOWN || (is_drawbridge_wall(x, y) >= 0)) { int bx = x, by = y; /* if under the portcullis, the bridge is adjacent */ (void) find_drawbridge(&bx, &by); destroy_drawbridge(bx, by); return; } if (ttyp != PIT && !Can_dig_down(&u.uz)) { impossible("digactualhole: can't dig %s on this level.", defsyms[trap_to_defsym(ttyp)].explanation); 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); if (!ttmp) return; newobjs = level.objects[x][y]; ttmp->tseen = (madeby_u || cansee(x,y)); ttmp->madeby_u = madeby_u; newsym(ttmp->tx,ttmp->ty); if (ttyp == PIT) { if(madeby_u) { You("dig a pit in the %s.", surface_type); if (shopdoor) pay_for_damage("ruin", FALSE); } else if (!madeby_obj && canseemon(madeby)) pline("%s digs a pit in the %s.", Monnam(madeby), surface_type); else if (cansee(x, y) && flags.verbose) pline("A pit appears in the %s.", surface_type); if(at_u) { if (!wont_fall) { if (!Passes_walls) u.utrap = rn1(4,2); u.utraptype = TT_PIT; vision_full_recalc = 1; /* vision limits change */ } else u.utrap = 0; if (oldobjs != newobjs) /* something unearthed */ (void) pickup(1); /* detects pit */ } else if(mtmp) { if(is_flyer(mtmp->data) || is_floater(mtmp->data)) { if(canseemon(mtmp)) pline("%s %s over the pit.", Monnam(mtmp), (is_flyer(mtmp->data)) ? "flies" : "floats"); } else if(mtmp != madeby) (void) mintrap(mtmp); } } else { /* was TRAPDOOR now a HOLE*/ if(madeby_u) You("dig a hole through the %s.", surface_type); else if(!madeby_obj && canseemon(madeby)) pline("%s digs a hole through the %s.", Monnam(madeby), surface_type); else if(cansee(x, y) && flags.verbose) pline("A hole appears in the %s.", surface_type); if (at_u) { if (!u.ustuck && !wont_fall && !next_to_u()) { You("are jerked back by your pet!"); wont_fall = TRUE; } /* Floor objects get a chance of falling down. The case where * the hero does NOT fall down is treated here. The case * where the hero does fall down is treated in goto_level(). */ if (u.ustuck || wont_fall) { if (newobjs) impact_drop((struct obj *)0, x, y, 0); if (oldobjs != newobjs) (void) pickup(1); if (shopdoor && madeby_u) pay_for_damage("ruin", FALSE); } else { d_level newlevel; const char *You_fall = "You fall through..."; if (*u.ushops && madeby_u) shopdig(1); /* shk might snatch pack */ /* handle earlier damage, eg breaking wand of digging */ else if (!madeby_u) pay_for_damage("dig into", TRUE); /* Earlier checks must ensure that the destination * level exists and is in the present dungeon. */ newlevel.dnum = u.uz.dnum; newlevel.dlevel = u.uz.dlevel + 1; /* Cope with holes caused by monster's actions -- ALI */ if (flags.mon_moving) { schedule_goto(&newlevel, FALSE, TRUE, FALSE, You_fall, (char *)0); } else { pline(You_fall); goto_level(&newlevel, FALSE, TRUE, FALSE); /* messages for arriving in special rooms */ spoteffects(FALSE); } } } else { if (shopdoor && madeby_u) pay_for_damage("ruin", FALSE); if (newobjs) impact_drop((struct obj *)0, x, y, 0); if (mtmp) { /*[don't we need special sokoban handling here?]*/ if (is_flyer(mtmp->data) || is_floater(mtmp->data) || mtmp->data == &mons[PM_WUMPUS] || (mtmp->wormno && count_wsegs(mtmp) > 5) || mtmp->data->msize >= MZ_HUGE) return; if (mtmp == u.ustuck) /* probably a vortex */ return; /* temporary? kludge */ if (teleport_pet(mtmp, FALSE)) { d_level tolevel; if (Is_stronghold(&u.uz)) { assign_level(&tolevel, &valley_level); } else if (Is_botlevel(&u.uz)) { if (canseemon(mtmp)) pline("%s avoids the trap.", Monnam(mtmp)); return; } else { get_level(&tolevel, depth(&u.uz) + 1); } if (mtmp->isshk) make_angry_shk(mtmp, 0, 0); migrate_to_level(mtmp, ledger_no(&tolevel), MIGR_RANDOM, (coord *)0); } } } } } /* return TRUE if digging succeeded, FALSE otherwise */ boolean dighole(pit_only) boolean pit_only; { register struct trap *ttmp = t_at(u.ux, u.uy); struct rm *lev = &levl[u.ux][u.uy]; struct obj *boulder_here; schar typ; boolean nohole = !Can_dig_down(&u.uz); if ((ttmp && (ttmp->ttyp == MAGIC_PORTAL || nohole)) || /* ALI - artifact doors */ IS_DOOR(levl[u.ux][u.uy].typ) && artifact_door(u.ux, u.uy) || (IS_ROCK(lev->typ) && lev->typ != SDOOR && (lev->wall_info & W_NONDIGGABLE) != 0)) { pline_The("%s here is too hard to dig in.", surface(u.ux,u.uy)); } else if (is_pool(u.ux, u.uy) || is_lava(u.ux, u.uy)) { pline_The("%s sloshes furiously for a moment, then subsides.", is_lava(u.ux, u.uy) ? "lava" : "water"); wake_nearby(); /* splashing */ } else if (lev->typ == DRAWBRIDGE_DOWN || (is_drawbridge_wall(u.ux, u.uy) >= 0)) { /* drawbridge_down is the platform crossing the moat when the bridge is extended; drawbridge_wall is the open "doorway" or closed "door" where the portcullis/mechanism is located */ if (pit_only) { pline_The("drawbridge seems too hard to dig through."); return FALSE; } else if (IS_GRAVE(lev->typ)) { digactualhole(u.ux, u.uy, BY_YOU, PIT); dig_up_grave(); return TRUE; } else { int x = u.ux, y = u.uy; /* if under the portcullis, the bridge is adjacent */ (void) find_drawbridge(&x, &y); destroy_drawbridge(x, y); return TRUE; } } else if ((boulder_here = sobj_at(BOULDER, u.ux, u.uy)) != 0) { if (ttmp && (ttmp->ttyp == PIT || ttmp->ttyp == SPIKED_PIT) && rn2(2)) { pline_The("boulder settles into the pit."); ttmp->ttyp = PIT; /* crush spikes */ } else { /* * digging makes a hole, but the boulder immediately * fills it. Final outcome: no hole, no boulder. */ pline("KADOOM! The boulder falls in!"); (void) delfloortrap(ttmp); } delobj(boulder_here); return TRUE; } else if (IS_GRAVE(lev->typ)) { dig_up_grave(); digactualhole(u.ux, u.uy, BY_YOU, PIT); return TRUE; } else if (lev->typ == DRAWBRIDGE_UP) { /* must be floor or ice, other cases handled above */ /* dig "pit" and let fluid flow in (if possible) */ typ = fillholetyp(u.ux,u.uy); if (typ == ROOM) { /* * We can't dig a hole here since that will destroy * the drawbridge. The following is a cop-out. --dlc */ pline_The("%s here is too hard to dig in.", surface(u.ux, u.uy)); return FALSE; } lev->drawbridgemask &= ~DB_UNDER; lev->drawbridgemask |= (typ == LAVAPOOL) ? DB_LAVA : DB_MOAT; liquid_flow: if (ttmp) (void) delfloortrap(ttmp); /* if any objects were frozen here, they're released now */ unearth_objs(u.ux, u.uy); pline("As you dig, the hole fills with %s!", typ == LAVAPOOL ? "lava" : "water"); /* KMH, balance patch -- new intrinsic */ if (!Levitation && !Flying) { if (typ == LAVAPOOL) (void) lava_effects(); else if (!Wwalking && !Swimming) (void) drown(); } return TRUE; /* the following two are here for the wand of digging */ } else if (IS_THRONE(lev->typ)) { pline_The("throne is too hard to break apart."); } else if (IS_ALTAR(lev->typ)) { pline_The("altar is too hard to break apart."); } else { typ = fillholetyp(u.ux,u.uy); if (typ != ROOM) { lev->typ = typ; goto liquid_flow; } /* finally we get to make a hole */ if (nohole || pit_only) digactualhole(u.ux, u.uy, BY_YOU, PIT); else digactualhole(u.ux, u.uy, BY_YOU, HOLE); return TRUE; } return FALSE; } STATIC_OVL void dig_up_grave() { struct obj *otmp; /* Grave-robbing is frowned upon... */ exercise(A_WIS, FALSE); if (Role_if(PM_ARCHEOLOGIST)) { adjalign(-sgn(u.ualign.type)*3); You_feel("like a despicable grave-robber!"); } else if (Role_if(PM_SAMURAI)) { adjalign(-sgn(u.ualign.type)); You("disturb the honorable dead!"); } else if ((u.ualign.type == A_LAWFUL) && (u.ualign.record > -10)) { adjalign(-sgn(u.ualign.type)); You("have violated the sanctity of this grave!"); } switch (rn2(5)) { case 0: case 1: You("unearth a corpse."); if (!!(otmp = mk_tt_object(CORPSE, u.ux, u.uy))) otmp->age -= 100; /* this is an *OLD* corpse */; break; case 2: if (!Blind) pline(Hallucination ? "Dude! The living dead!" : "The grave's owner is very upset!"); (void) makemon(mkclass(S_ZOMBIE,0), u.ux, u.uy, NO_MM_FLAGS); break; case 3: if (!Blind) pline(Hallucination ? "I want my mummy!" : "You've disturbed a tomb!"); (void) makemon(mkclass(S_MUMMY,0), u.ux, u.uy, NO_MM_FLAGS); break; default: /* No corpse */ pline_The("grave seems unused. Strange...."); break; } levl[u.ux][u.uy].typ = ROOM; del_engr_at(u.ux, u.uy); newsym(u.ux,u.uy); return; } int use_pick_axe(obj) struct obj *obj; { boolean ispick; char dirsyms[12]; char qbuf[QBUFSZ]; register char *dsp = dirsyms; register int rx, ry; int res = 0; register const char *sdp, *verb; if(iflags.num_pad) sdp = ndir; else sdp = sdir; /* DICE workaround */ /* Check tool */ if (obj != uwep) { if (!wield_tool(obj, "swing")) return 0; else res = 1; } ispick = is_pick(obj); verb = ispick ? "dig" : "chop"; if (u.utrap && u.utraptype == TT_WEB) { pline("%s you can't %s while entangled in a web.", /* res==0 => no prior message; res==1 => just got "You now wield a pick-axe." message */ !res ? "Unfortunately," : "But", verb); return res; } while(*sdp) { (void) movecmd(*sdp); /* sets u.dx and u.dy and u.dz */ rx = u.ux + u.dx; ry = u.uy + u.dy; /* Include down even with axe, so we have at least one direction */ if (u.dz > 0 || (u.dz == 0 && isok(rx, ry) && dig_typ(obj, rx, ry) != DIGTYP_UNDIGGABLE)) *dsp++ = *sdp; sdp++; } *dsp = 0; Sprintf(qbuf, "In what direction do you want to %s? [%s]", verb, dirsyms); if(!getdir(qbuf)) return(res); return (use_pick_axe2(obj)); } /* general dig through doors/etc. function * Handles pickaxes/lightsabers/axes * called from doforce and use_pick_axe */ /* 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, digtyp; boolean ispick = is_pick(obj); const char *verbing = ispick ? "digging" : #ifdef LIGHTSABERS is_lightsaber(uwep) ? "cutting" : #endif "chopping"; /* 0 = pick, 1 = lightsaber, 2 = axe */ digtyp = (is_pick(uwep) ? 0 : #ifdef LIGHTSABERS is_lightsaber(uwep) ? 1 : #endif 2); if (u.uswallow && attack(u.ustuck)) { ; /* return(1) */ } else if (Underwater) { pline("Turbulence torpedoes your %s attempts.", verbing); } else if(u.dz < 0) { if(Levitation) if (digtyp == 1) pline_The("ceiling is too hard to cut through."); else You("don't have enough leverage."); else You_cant("reach the %s.",ceiling(u.ux,u.uy)); } else if(!u.dx && !u.dy && !u.dz) { /* NOTREACHED for lightsabers/axes called from doforce */ char buf[BUFSZ]; int dam; 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) { if(Stunned || (Confusion && !rn2(5))) confdir(); rx = u.ux + u.dx; ry = u.uy + u.dy; if(!isok(rx, ry)) { if (digtyp == 1) pline("Your %s bounces off harmlessly.", aobjnam(obj, (char *)0)); else pline("Clash!"); return(1); } lev = &levl[rx][ry]; if(MON_AT(rx, ry) && attack(m_at(rx, ry))) return(1); dig_target = dig_typ(obj, rx, ry); if (dig_target == DIGTYP_UNDIGGABLE) { /* ACCESSIBLE or POOL */ struct trap *trap = t_at(rx, ry); if (trap && trap->ttyp == WEB) { if (!trap->tseen) { 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)); nomovemsg = "You pull free."; } else if (lev->typ == IRONBARS) { pline("Clang!"); wake_nearby(); } else if (IS_TREE(lev->typ)) You("need an axe to cut down a tree."); else if (IS_ROCK(lev->typ)) You("need a pick to dig rock."); else if (!ispick && (sobj_at(STATUE, rx, ry) || sobj_at(BOULDER, rx, ry))) { boolean vibrate = !rn2(3); pline("Sparks fly as you whack the %s.%s", sobj_at(STATUE, rx, ry) ? "statue" : "boulder", vibrate ? " The axe-handle vibrates violently!" : ""); if (vibrate) losehp(2, "axing a hard object", KILLED_BY); } else You("swing your %s through thin air.", aobjnam(obj, (char *)0)); } else { static const char * const d_action[6][2] = { {"swinging","slicing the air"}, {"digging","cutting through the wall"}, {"chipping the statue","cutting the statue"}, {"hitting the boulder","cutting through the boulder"}, {"chopping at the door","burning through the door"}, {"cutting the tree","razing 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 == DIGTYP_ROCK && !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][digtyp == 1]); } else { You("%s %s.", digging.chew ? "begin" : "continue", d_action[dig_target][digtyp == 1]); digging.chew = FALSE; } set_occupation(dig, verbing, 0); } } else if (Is_airlevel(&u.uz) || Is_waterlevel(&u.uz)) { /* it must be air -- water checked above */ You("swing your %s through thin air.", aobjnam(obj, (char *)0)); } else if (!can_reach_floor()) { You_cant("reach the %s.", surface(u.ux,u.uy)); } else if (is_pool(u.ux, u.uy) || is_lava(u.ux, u.uy)) { /* Monsters which swim also happen not to be able to dig */ You("cannot stay under%s long enough.", is_pool(u.ux, u.uy) ? "water" : " the lava"); } else if (digtyp == 2) { Your("%s merely scratches the %s.", aobjnam(obj, (char *)0), surface(u.ux,u.uy)); u_wipe_engr(3); } else { if (digging.pos.x != u.ux || digging.pos.y != u.uy || !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); digging.effort = 0; You("start %s downward.", verbing); if (*u.ushops) shopdig(0); } else You("continue %s downward.", verbing); did_dig_msg = FALSE; set_occupation(dig, verbing, 0); } return(1); } /* * Town Watchmen frown on damage to the town walls, trees 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; { struct rm *lev = &levl[x][y]; if (in_town(x, y) && (closed_door(x, y) || lev->typ == SDOOR || IS_WALL(lev->typ) || IS_FOUNTAIN(lev->typ) || IS_TREE(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 { const char *str; if (IS_DOOR(lev->typ)) str = "door"; else if (IS_TREE(lev->typ)) str = "tree"; else if (IS_ROCK(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 /* Return TRUE if monster died, FALSE otherwise. Called from m_move(). */ boolean mdig_tunnel(mtmp) register struct monst *mtmp; { register struct rm *here; int pile = rnd(12); here = &levl[mtmp->mx][mtmp->my]; if (here->typ == SDOOR) cvt_sdoor_to_door(here); /* ->typ = DOOR */ /* Eats away door if present & closed or locked */ if (closed_door(mtmp->mx, mtmp->my)) { if (*in_rooms(mtmp->mx, mtmp->my, SHOPBASE)) add_damage(mtmp->mx, mtmp->my, 0L); unblock_point(mtmp->mx, mtmp->my); /* vision */ if (here->doormask & D_TRAPPED) { here->doormask = D_NODOOR; if (mb_trapped(mtmp)) { /* mtmp is killed */ newsym(mtmp->mx, mtmp->my); return TRUE; } } else { if (!rn2(3) && flags.verbose) /* not too often.. */ You_feel("an unexpected draft."); here->doormask = D_BROKEN; } newsym(mtmp->mx, mtmp->my); return FALSE; } else if (!IS_ROCK(here->typ) && !IS_TREE(here->typ)) /* no dig */ return FALSE; /* Only rock, trees, and walls fall through to this point. */ if ((here->wall_info & W_NONDIGGABLE) != 0) { impossible("mdig_tunnel: %s at (%d,%d) is undiggable", (IS_WALL(here->typ) ? "wall" : "stone"), (int) mtmp->mx, (int) mtmp->my); return FALSE; /* still alive */ } if (IS_WALL(here->typ)) { /* KMH -- Okay on arboreal levels (room walls are still stone) */ if (flags.soundok && flags.verbose && !rn2(5)) /* KMH -- Okay on arboreal levels (room walls are still stone) */ You_hear("crashing rock."); if (*in_rooms(mtmp->mx, mtmp->my, SHOPBASE)) add_damage(mtmp->mx, mtmp->my, 0L); if (level.flags.is_maze_lev) { here->typ = ROOM; } else if (level.flags.is_cavernous_lev && !in_town(mtmp->mx, mtmp->my)) { here->typ = CORR; } else { here->typ = DOOR; here->doormask = D_NODOOR; } } else if (IS_TREE(here->typ)) { here->typ = ROOM; if (pile && pile < 5) (void) rnd_treefruit_at(mtmp->mx, mtmp->my); } else { here->typ = CORR; if (pile && pile < 5) (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 */ return FALSE; } #endif /* OVL0 */ #ifdef OVL3 /* digging via wand zap or spell cast */ void zap_dig() { struct rm *room; struct monst *mtmp; /* struct obj *otmp;*/ register struct obj *otmp, *next_obj; int zx, zy, digdepth; boolean shopdoor, shopwall, maze_dig; /* * Original effect (approximately): * from CORR: dig until we pierce a wall * from ROOM: pierce wall and dig until we reach * an ACCESSIBLE place. * Currently: dig for digdepth positions; * also down on request of Lennart Augustsson. */ if (u.uswallow) { mtmp = u.ustuck; 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)); } return; } /* swallowed */ if (u.dz) { if (!Is_airlevel(&u.uz) && !Is_waterlevel(&u.uz) && !Underwater) { if (u.dz < 0 || On_stairs(u.ux, u.uy)) { if (On_stairs(u.ux, u.uy)) pline_The("beam bounces off the %s and hits the %s.", (u.ux == xdnladder || u.ux == xupladder) ? "ladder" : "stairs", ceiling(u.ux, u.uy)); You("loosen a rock from the %s.", ceiling(u.ux, u.uy)); 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); } newsym(u.ux, u.uy); } else { watch_dig((struct monst *)0, u.ux, u.uy, TRUE); (void) dighole(FALSE); } } return; } /* up or down */ /* normal case: digging across the level */ shopdoor = shopwall = FALSE; maze_dig = level.flags.is_maze_lev && !Is_earthlevel(&u.uz); zx = u.ux + u.dx; zy = u.uy + u.dy; digdepth = rn1(18, 8); tmp_at(DISP_BEAM, cmap_to_glyph(S_digbeam)); while (--digdepth >= 0) { if (!isok(zx,zy)) break; room = &levl[zx][zy]; tmp_at(zx,zy); delay_output(); /* wait a little bit */ /* WAC check for monster, boulder */ if ((mtmp = m_at(zx, zy)) != 0) { if (made_of_rock(mtmp->data)) { You("gouge a hole in %s!", mon_nam(mtmp)); mtmp->mhp /= 2; if (mtmp->mhp < 1) mtmp->mhp = 1; setmangry(mtmp); } else pline("%s is unaffected!", Monnam(mtmp)); } for(otmp = level.objects[zx][zy]; otmp; otmp = next_obj) { next_obj = otmp->nexthere; /* vaporize boulders */ if (otmp->otyp == BOULDER) { delobj(otmp); /* A little Sokoban guilt... */ if (In_sokoban(&u.uz)) change_luck(-1); unblock_point(zx, zy); newsym(zx, zy); pline_The("boulder is vaporized!"); } break; } if (closed_door(zx, zy) || room->typ == SDOOR) { /* ALI - Artifact doors */ if (artifact_door(zx, zy)) { if (cansee(zx, zy)) pline_The("door glows then fades."); break; } if (*in_rooms(zx,zy,SHOPBASE)) { add_damage(zx, zy, 400L); shopdoor = TRUE; } if (room->typ == SDOOR) 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; if (maze_dig) break; } else if (maze_dig) { if (IS_WALL(room->typ)) { if (!(room->wall_info & W_NONDIGGABLE)) { if (*in_rooms(zx,zy,SHOPBASE)) { add_damage(zx, zy, 200L); shopwall = TRUE; } room->typ = ROOM; unblock_point(zx,zy); /* vision */ } else if (!Blind) pline_The("wall glows then fades."); break; } else if (IS_TREE(room->typ)) { /* check trees before stone */ if (!(room->wall_info & W_NONDIGGABLE)) { room->typ = ROOM; unblock_point(zx,zy); /* vision */ } else if (!Blind) pline_The("tree shudders but is unharmed."); break; } else if (room->typ == STONE || room->typ == SCORR) { if (!(room->wall_info & W_NONDIGGABLE)) { room->typ = CORR; unblock_point(zx,zy); /* vision */ } else if (!Blind) pline_The("rock glows then fades."); break; } } else if (IS_ROCK(room->typ)) { if (!may_dig(zx,zy)) break; if (IS_WALL(room->typ) || room->typ == SDOOR) { if (*in_rooms(zx,zy,SHOPBASE)) { add_damage(zx, zy, 200L); shopwall = TRUE; } watch_dig((struct monst *)0, zx, zy, TRUE); if (level.flags.is_cavernous_lev && !in_town(zx, zy)) { room->typ = CORR; } else { room->typ = DOOR; room->doormask = D_NODOOR; } digdepth -= 2; } else if (IS_TREE(room->typ)) { room->typ = ROOM; digdepth -= 2; } else { /* IS_ROCK but not IS_WALL or SDOOR */ room->typ = CORR; digdepth--; } unblock_point(zx,zy); /* vision */ } zx += u.dx; zy += u.dy; } /* while */ tmp_at(DISP_END,0); /* closing call */ if (shopdoor || shopwall) pay_for_damage(shopdoor ? "destroy" : "dig into", FALSE); return; } /* move objects from fobj/nexthere lists to buriedobjlist, keeping position */ /* information */ struct obj * bury_an_obj(otmp) struct obj *otmp; { struct obj *otmp2; boolean under_ice; #ifdef DEBUG pline("bury_an_obj: %s", xname(otmp)); #endif if (otmp == uball) unpunish(); /* after unpunish(), or might get deallocated chain */ otmp2 = otmp->nexthere; /* * obj_resists(,0,0) prevents Rider corpses from being buried. * It also prevents The Amulet and invocation tools from being * buried. Since they can't be confined to bags and statues, * it makes sense that they can't be buried either, even though * the real reason there (direct accessibility when carried) is * completely different. */ if (otmp == uchain || obj_resists(otmp, 0, 0)) return(otmp2); if (otmp->otyp == LEASH && otmp->leashmon != 0) o_unleash(otmp); #ifdef STEED if (otmp == usaddle) dismount_steed(DISMOUNT_GENERIC); #endif if (otmp->lamplit && otmp->otyp != POT_OIL) end_burn(otmp, TRUE); obj_extract_self(otmp); under_ice = is_ice(otmp->ox, otmp->oy); if (otmp->otyp == ROCK && !under_ice) { /* merges into burying material */ obfree(otmp, (struct obj *)0); return(otmp2); } /* * Start a rot on organic material. Not corpses -- they * are already handled. */ if (otmp->otyp == CORPSE) { ; /* should cancel timer if under_ice */ } else if ((under_ice ? otmp->oclass == POTION_CLASS : is_organic(otmp)) && !obj_resists(otmp, 5, 95)) { (void) start_timer((under_ice ? 0L : 250L) + (long)rnd(250), TIMER_OBJECT, ROT_ORGANIC, (genericptr_t)otmp); } add_to_buried(otmp); return(otmp2); } void bury_objs(x, y) int x, y; { struct obj *otmp, *otmp2; #ifdef DEBUG if(level.objects[x][y] != (struct obj *)0) pline("bury_objs: at %d, %d", x, y); #endif for (otmp = level.objects[x][y]; otmp; otmp = otmp2) otmp2 = bury_an_obj(otmp); /* don't expect any engravings here, but just in case */ del_engr_at(x, y); newsym(x, y); } /* move objects from buriedobjlist to fobj/nexthere lists */ void unearth_objs(x, y) int x, y; { struct obj *otmp, *otmp2; #ifdef DEBUG pline("unearth_objs: at %d, %d", x, y); #endif for (otmp = level.buriedobjlist; otmp; otmp = otmp2) { otmp2 = otmp->nobj; if (otmp->ox == x && otmp->oy == y) { obj_extract_self(otmp); if (otmp->timed) (void) stop_timer(ROT_ORGANIC, (genericptr_t)otmp); place_object(otmp, x, y); stackobj(otmp); } } del_engr_at(x, y); newsym(x, y); } /* * The organic material has rotted away while buried. As an expansion, * we could add add partial damage. A damage count is kept in the object * and every time we are called we increment the count and reschedule another * timeout. Eventually the object rots away. * * This is used by buried objects other than corpses. When a container rots * away, any contents become newly buried objects. */ /* ARGSUSED */ void rot_organic(arg, timeout) genericptr_t arg; long timeout; /* unused */ { #if defined(MAC_MPW) # pragma unused ( timeout ) #endif struct obj *obj = (struct obj *) arg; while (Has_contents(obj)) { /* We don't need to place contained object on the floor first, but we do need to update its map coordinates. */ obj->cobj->ox = obj->ox, obj->cobj->oy = obj->oy; /* Everything which can be held in a container can also be buried, so bury_an_obj's use of obj_extract_self insures that Has_contents(obj) will eventually become false. */ (void)bury_an_obj(obj->cobj); } obj_extract_self(obj); obfree(obj, (struct obj *) 0); } /* * Called when a corpse has rotted completely away. */ void rot_corpse(arg, timeout) genericptr_t arg; long timeout; /* unused */ { xchar x = 0, y = 0; struct obj *obj = (struct obj *) arg; boolean on_floor = obj->where == OBJ_FLOOR, in_minvent = obj->where == OBJ_MINVENT, in_invent = obj->where == OBJ_INVENT; if (on_floor) { x = obj->ox; y = obj->oy; } else if (in_minvent) { /* WAC unwield if wielded */ if (MON_WEP(obj->ocarry) && MON_WEP(obj->ocarry) == obj) { obj->owornmask &= ~W_WEP; MON_NOWEP(obj->ocarry); } } else if (in_invent) { if (flags.verbose) { char *cname = corpse_xname(obj, FALSE); Your("%s%s %s away%c", obj == uwep ? "wielded " : nul, cname, otense(obj, "rot"), obj == uwep ? '!' : '.'); } if (obj == uwep) { uwepgone(); /* now bare handed */ stop_occupation(); } else if (obj == uswapwep) { uswapwepgone(); stop_occupation(); } else if (obj == uquiver) { uqwepgone(); stop_occupation(); } else if (obj == uswapwep) { uswapwepgone(); stop_occupation(); } else if (obj == uquiver) { uqwepgone(); stop_occupation(); } } else if (obj->where == OBJ_MINVENT && obj->owornmask) { if (obj == MON_WEP(obj->ocarry)) { setmnotwielded(obj->ocarry,obj); MON_NOWEP(obj->ocarry); } } rot_organic(arg, timeout); if (on_floor) newsym(x, y); else if (in_invent) update_inventory(); } #if 0 void bury_monst(mtmp) struct monst *mtmp; { #ifdef DEBUG pline("bury_monst: %s", mon_nam(mtmp)); #endif if(canseemon(mtmp)) { if(is_flyer(mtmp->data) || is_floater(mtmp->data)) { pline_The("%s opens up, but %s is not swallowed!", surface(mtmp->mx, mtmp->my), mon_nam(mtmp)); return; } else pline_The("%s opens up and swallows %s!", surface(mtmp->mx, mtmp->my), mon_nam(mtmp)); } mtmp->mburied = TRUE; wakeup(mtmp); /* at least give it a chance :-) */ newsym(mtmp->mx, mtmp->my); } void bury_you() { #ifdef DEBUG pline("bury_you"); #endif /* KMH, balance patch -- new intrinsic */ if (!Levitation && !Flying) { if(u.uswallow) You_feel("a sensation like falling into a trap!"); else pline_The("%s opens beneath you and you fall in!", surface(u.ux, u.uy)); u.uburied = TRUE; if(!Strangled && !Breathless) Strangled = 6; under_ground(1); } } void unearth_you() { #ifdef DEBUG pline("unearth_you"); #endif u.uburied = FALSE; under_ground(0); if(!uamul || uamul->otyp != AMULET_OF_STRANGULATION) Strangled = 0; vision_recalc(0); } void escape_tomb() { #ifdef DEBUG pline("escape_tomb"); #endif if ((Teleportation || can_teleport(youmonst.data)) && (Teleport_control || rn2(3) < Luck+2)) { You("attempt a teleport spell."); (void) dotele(); /* calls unearth_you() */ } else if(u.uburied) { /* still buried after 'port attempt */ boolean good; if(amorphous(youmonst.data) || Passes_walls || noncorporeal(youmonst.data) || unsolid(youmonst.data) || (tunnels(youmonst.data) && !needspick(youmonst.data))) { You("%s up through the %s.", (tunnels(youmonst.data) && !needspick(youmonst.data)) ? "try to tunnel" : (amorphous(youmonst.data)) ? "ooze" : "phase", surface(u.ux, u.uy)); if(tunnels(youmonst.data) && !needspick(youmonst.data)) good = dighole(TRUE); else good = TRUE; if(good) unearth_you(); } } } void bury_obj(otmp) struct obj *otmp; { #ifdef DEBUG pline("bury_obj"); #endif if(cansee(otmp->ox, otmp->oy)) pline_The("objects on the %s tumble into a hole!", surface(otmp->ox, otmp->oy)); bury_objs(otmp->ox, otmp->oy); } #endif #ifdef DEBUG int wiz_debug_cmd() /* in this case, bury everything at your loc and around */ { int x, y; for (x = u.ux - 1; x <= u.ux + 1; x++) for (y = u.uy - 1; y <= u.uy + 1; y++) if (isok(x,y)) bury_objs(x,y); return 0; } #endif /* DEBUG */ #endif /* OVL3 */ /*dig.c*/ slashem-0.0.7E7F3/src/gypsy.c0000664000076400007640000005046210545462317013771 0ustar aliali/*** gypsy.c ***/ #include "hack.h" #include "egyp.h" #include "qtext.h" /* To do: * fortune_lev() * Fourtunes for suited cards * On-line help */ /*** Money-related functions ***/ static void gypsy_charge (mtmp, amount) struct monst *mtmp; long amount; { #ifdef GOLDOBJ struct obj *gypgold; #endif /* Take from credit first */ if (amount > EGYP(mtmp)->credit) { /* Do in several steps, for broken compilers */ amount -= EGYP(mtmp)->credit; EGYP(mtmp)->credit = 0; #ifdef GOLDOBJ money2mon(mtmp, amount); #else u.ugold -= amount; #endif flags.botl = 1; } else EGYP(mtmp)->credit -= amount; /* The gypsy never carries cash; it might get stolen! */ #ifdef GOLDOBJ gypgold = findgold(mtmp->minvent); if (gypgold) m_useup(mtmp, gypgold); #endif return; } static boolean gypsy_offer (mtmp, cost, txt) struct monst *mtmp; long cost; char *txt; { #ifdef GOLDOBJ long umoney; umoney = money_cnt(invent); #endif verbalize("For %ld credit I will %s!", cost, txt); if (EGYP(mtmp)->credit >= cost) { if (yn("Accept this offer?") == 'y') { EGYP(mtmp)->credit -= cost; return (TRUE); } #ifndef GOLDOBJ } else if (EGYP(mtmp)->credit + u.ugold >= cost) verbalize("What a pity that I can't accept gold!"); #else } else if (EGYP(mtmp)->credit + umoney >= cost) verbalize("What a pity that I can't accept money!"); #endif /* Maybe you could try gambling some of it for credit... */ else verbalize("What a pity that you don't have enough!"); return (FALSE); } static long gypsy_bet (mtmp, minimum) struct monst *mtmp; long minimum; { char prompt[BUFSZ], buf[BUFSZ]; long bet = 0L; #ifdef GOLDOBJ long umoney; umoney = money_cnt(invent); #endif if (minimum > EGYP(mtmp)->credit + #ifndef GOLDOBJ u.ugold) { #else umoney) { #endif You("don't have enough money for the minimum bet."); return (0L); } /* Prompt for an amount */ Sprintf(prompt, "Bet how much (%ld to %ld)?", minimum, EGYP(mtmp)->credit + #ifndef GOLDOBJ u.ugold); #else umoney); #endif getlin(prompt, buf); (void) sscanf(buf, "%ld", &bet); /* Validate the amount */ if (bet == 0L) { pline("Never mind."); return (0L); } if (bet < minimum) { You("must bet at least %ld.", minimum); return (0L); } if (bet > EGYP(mtmp)->credit + #ifndef GOLDOBJ u.ugold) { #else umoney) { #endif You("don't have that much money to bet!"); return (0L); } return (bet); } /*** Card-related functions ***/ static const char *suits[CARD_SUITS] = { "swords", "wands", "shields", "rings" }; /* Special */ /* swords wands/rods roses/cups pentacles/disks/coins Tarot */ /* spade bastoni coppe denari Italian */ /* swords batons cups coins (translated) */ /* spades clubs hearts diamonds French */ static const char *ranks[CARD_RANKS] = { "ace", "2", "3", "4", "5", "6", "7", "8", "9", "10", /*none*/ "jack", "queen", "king" }; /* French */ /* page/princess knight/prince queen king Tarot */ static const char *trumps[CARD_TRUMPS] = { "the Fool", /* This is NOT a Joker */ "the Magician", /* same as the Magus */ "the High Priestess", /* sometimes placed after the Emperor */ #if 0 "the Empress", /* not included here */ "the Emperor", /* not included here */ #endif "the Oracle", /* same as the Hierophant */ "the Lovers", "the Chariot", "Strength", /* sometimes Adjustment */ "the Hermit", "the Wheel of Fortune", /* sometimes Fortune */ "Justice", /* sometimes Lust */ "Punishment", /* replaces the Hanged Man */ "the Devil", /* normally #15 */ "Sorcery", /* replaces Art or Temperance */ "Death", /* swapped with the Devil so it remains #13 */ "the Tower", /* really! */ "the Star", "the Moon", "the Sun", "Judgement", /* sometimes Aeon */ "Infinity" /* replaces the World or the Universe */ }; static void card_shuffle (mtmp) struct monst *mtmp; { xchar *cards = &EGYP(mtmp)->cards[0]; int i, j, k; pline("%s shuffles the cards.", Monnam(mtmp)); for (i = 0; i < CARD_TOTAL; i++) /* Initialize the value */ cards[i] = i; for (i = 0; i < CARD_TOTAL; i++) { /* Swap this value with another randomly chosen one */ j = rn2(CARD_TOTAL); k = cards[j]; cards[j] = cards[i]; cards[i] = k; } EGYP(mtmp)->top = CARD_TOTAL; } static xchar card_draw (mtmp) struct monst *mtmp; { if (EGYP(mtmp)->top <= 0) /* The deck is empty */ return (-1); return (EGYP(mtmp)->cards[--EGYP(mtmp)->top]); } static void card_name (num, buf) xchar num; char *buf; { int r, s; if (!buf) return; if (Hallucination) num = rn2(CARD_TOTAL); if (num < 0 || num >= CARD_TOTAL) { /* Invalid card */ impossible("no such card %d", num); Strcpy(buf, "a card"); } else if (card_istrump(num)) { /* Handle trump cards */ r = card_trump(num); if (!r) Sprintf(buf, "the zero of trumps (%s)", trumps[r]); else Sprintf(buf, "the %d of trumps (%s)", r, trumps[r]); } else { /* Handle suited cards */ r = card_rank(num); s = card_suit(num); Sprintf(buf, "the %s of %s", ranks[r], suits[s]); } return; } /*** Fortunes ***/ #define FORTUNE_COST 50 /* Cost to play */ static short birthstones[12] = { /* Jan */ GARNET, /* Feb */ AMETHYST, /* Mar */ AQUAMARINE, /* Apr */ DIAMOND, /* May */ EMERALD, /* Jun */ OPAL, /* Jul */ RUBY, /* Aug */ CHRYSOBERYL, /* Sep */ SAPPHIRE, /* Oct */ BLACK_OPAL, /* Nov */ TOPAZ, /* Dec */ TURQUOISE }; static void fortune_lev (mtmp, name, txt) struct monst *mtmp; char *name, *txt; { /*** FIXME -- still very buggy ***/ /* d_level *lev;*/ schar dep; dep = lev_by_name(name); if (!dep) { /* Perhaps the level doesn't exist? */ verbalize("The vision is hazy."); return; } if (dep == depth(&u.uz)) verbalize("I see %s here.", txt); else { verbalize("I see %s on level %d.", txt, (int)dep); /* if (gypsy_offer(mtmp, 5000L, "teleport you there")) ;*/ } return; } static void fortune (mtmp) struct monst *mtmp; { xchar card; char buf[BUFSZ]; short otyp; struct obj *otmp; /* Shuffle the deck, if neccessary, and draw a card */ gypsy_charge(mtmp, FORTUNE_COST); if (EGYP(mtmp)->top <= 0) card_shuffle(mtmp); card = card_draw(mtmp); #ifdef WIZARD if (wizard) { long t = -1; getlin("Which trump?", buf); (void) sscanf(buf, "%ld", &t); if (t >= 0) card = t + CARD_SUITED; } #endif card_name(card, buf); verbalize("You have drawn %s.", buf); if (card_istrump(card)) switch (card_trump(card)) { case 0: /* the Fool */ adjattrib(A_WIS, -1, 0); change_luck(-3); break; case 1: /* the Magician */ if (u.uevent.udemigod) resurrect(); else fortune_lev(mtmp, "fakewiz1", "an entrance to the Wizard's tower"); /*fortune_lev(mtmp, &portal_level);*/ break; case 2: /* the High Priestess */ if (u.uhave.amulet) verbalize("I see a high altar in the heavens."); /* Can only get there by ascending... */ else verbalize("I see a high altar on level %d.", depth(&sanctum_level)); /* Can only get there by invocation... */ break; case 3: /* the Oracle */ fortune_lev(mtmp, "oracle", "the Oracle"); /*fortune_lev(mtmp, &oracle_level);*/ break; case 4: /* the Lovers */ makemon(&mons[flags.female ? PM_INCUBUS : PM_SUCCUBUS], u.ux, u.uy, 0); break; case 5: /* the Chariot */ if (gypsy_offer(mtmp, 5000L, "teleport you to a level of your choosing")) { incr_itimeout(&HTeleport_control, 1); level_tele(); } break; case 6: /* Strength */ adjattrib(A_STR, 1, 0); incr_itimeout(&HHalf_physical_damage, rn1(500, 500)); break; case 7: /* the Hermit */ You_feel("like hiding!"); incr_itimeout(&HTeleportation, rn1(300, 300)); incr_itimeout(&HInvis, rn1(500, 500)); newsym(u.ux, u.uy); break; case 8: /* the Wheel of Fortune */ if (Hallucination) pline("Where is Vanna?"); else You_feel("lucky!"); if (u.uluck < 0) u.uluck = 0; else change_luck(3); break; case 9: /* Justice */ makemon(&mons[PM_ERINYS], u.ux, u.uy, 0); break; case 10: /* Punishment */ if (!Punished) punish((struct obj *)0); else rndcurse(); break; case 11: /* the Devil */ summon_minion(A_NONE, TRUE); break; case 12: /* Sorcery */ adjattrib(urole.spelstat, 1, 0); incr_itimeout(&HHalf_spell_damage, rn1(500, 500)); break; case 13: /* Death */ if (nonliving(youmonst.data) || is_demon(youmonst.data) || Antimagic) shieldeff(u.ux, u.uy); else if(Hallucination) You("have an out of body experience."); else { killer_format = KILLED_BY; killer = "the card of Death"; done(DIED); } break; case 14: /* the Tower */ fortune_lev(mtmp, "vlad\'s tower", "Vlad the Impaler"); /* fortune_lev(mtmp, &vlad_level); */ break; case 15: /* the Star */ otyp = birthstones[getmonth()]; makeknown(otyp); if ((otmp = mksobj(otyp, TRUE, FALSE)) != (struct obj *)0) { pline("%s reaches behind your %s and pulls out %s.", Monnam(mtmp), body_part(HEAD), doname(otmp)); if (pickup_object(otmp, otmp->quan, FALSE) <= 0) { obj_extract_self(otmp); place_object(otmp, u.ux, u.uy); newsym(u.ux, u.uy); } } break; case 16: /* the Moon */ /* Reset the old moonphase */ if (flags.moonphase == FULL_MOON) change_luck(-1); /* Set the new moonphase */ flags.moonphase = phase_of_the_moon(); switch (flags.moonphase) { case NEW_MOON: pline("Be careful! New moon tonight."); break; case 1: case 2: case 3: pline_The("moon is waxing tonight."); break; case FULL_MOON: You("are lucky! Full moon tonight."); change_luck(1); break; case 5: case 6: case 7: pline_The("moon is waning tonight."); break; default: impossible("wierd moonphase %d", flags.moonphase); break; } break; case 17: /* the Sun */ if (midnight()) verbalize("It is the witching hour. Beware of the undead!"); else if (night()) verbalize("It is nighttime. Beware of creatures of the night!"); else verbalize("It is daytime. Shouldn't you be working?"); break; case 18: /* Judgement */ fortune_lev(mtmp, "portal to quest", "a portal to a quest"); /* fortune_lev(mtmp, &quest_level); */ break; case 19: /* Infinity */ if (mtmp->mcan) { verbalize("I wish I wasn't here!"); mongone(mtmp); } else if (gypsy_offer(mtmp, 10000L, "grant you a wish")) { mtmp->mcan = TRUE; makewish(); } break; default: impossible("unknown trump %d", card_trump(card)); break; } /* End trumps */ else /* Suited card */ com_pager(QT_GYPSY + card); return; } /*** Three-card monte ***/ #define MONTE_COST 1 /* Minimum bet */ #define MONTE_MAX 10 /* Maximum value of monteluck */ static void monte (mtmp) struct monst *mtmp; { long bet, n; char buf[BUFSZ]; winid win; anything any; menu_item *selected; int delta; /* Get the bet */ bet = gypsy_bet(mtmp, MONTE_COST); if (!bet) return; /* Shuffle and pick */ if (flags.verbose) pline("%s places three cards and rearranges them.", Monnam(mtmp)); any.a_void = 0; /* zero out all bits */ win = create_nhwindow(NHW_MENU); start_menu(win); any.a_char = 'l'; add_menu(win, NO_GLYPH, &any , 'l', 0, ATR_NONE, "Left card", MENU_UNSELECTED); any.a_char = 'c'; add_menu(win, NO_GLYPH, &any , 'c', 0, ATR_NONE, "Center card", MENU_UNSELECTED); any.a_char = 'r'; add_menu(win, NO_GLYPH, &any , 'r', 0, ATR_NONE, "Right card", MENU_UNSELECTED); end_menu(win, "Pick a card:"); while (select_menu(win, PICK_ONE, &selected) != 1) ; destroy_nhwindow(win); /* Calculate the change in odds for next time */ /* Start out easy, but get harder once the player is suckered */ delta = rnl(4) - 3; /* Luck helps */ if (u.umontelast == selected[0].item.a_char) /* Only suckers keep picking the same card */ delta++; u.umontelast = selected[0].item.a_char; for (n = bet; n > 0; n /= 10L) /* Penalize big bets */ delta++; /* pline("luck = %d; delta = %d", u.umonteluck, delta);*/ /* Did we win? */ if (u.umonteluck <= rn2(MONTE_MAX)) { if (u.umonteluck == 0) verbalize("You win! Wasn't that easy?"); else verbalize("You win!"); EGYP(mtmp)->credit += bet; /* Make it harder for next time */ if (delta > 0) u.umonteluck += delta; if (u.umonteluck > MONTE_MAX) u.umonteluck = MONTE_MAX; } else { card_name(rn1(2, 1), buf); verbalize("Sorry, you picked %s. Try again.", buf); gypsy_charge(mtmp, bet); /* Make it a little easier for next time */ if (delta < 0) u.umonteluck += delta; if (u.umonteluck < 0) u.umonteluck = 0; } return; } /*** Ninety-nine ***/ #define NINETYNINE_COST 1 /* Minimum bet */ #define NINETYNINE_HAND 3 /* Number of cards in hand */ #define NINETYNINE_GOAL 99 /* Limit of the total */ static boolean nn_playable (card, total) xchar card; int total; { if (card_istrump(card)) /* The fool always loses; other trumps are always playable */ return (card != CARD_SUITED); switch (card_rank(card)+1) { case 11: /* Jack */ case 12: /* Queen */ return (total >= 10); case 13: /* King */ return (TRUE); default: /* Ace through 10 */ return ((total + card_rank(card) + 1) <= NINETYNINE_GOAL); } } static int nn_play (card, total) xchar card; int total; { if (card_istrump(card)) { if (card == CARD_SUITED) /* The Fool always loses */ return (NINETYNINE_GOAL+1); else /* Other trumps leave the total unchanged */ return (total); } switch (card_rank(card)+1) { case 11: /* Jack */ case 12: /* Queen */ return (total - 10); case 13: /* King */ return (NINETYNINE_GOAL); default: /* Ace through 10 */ return (total + card_rank(card) + 1); } } static int nn_pref (card) xchar card; { /* Computer's preferences for playing cards: * 3. Get rid of Ace through 10 whenever we can. Highest priority. * 2. King will challenge the player. High priority. * 1. Jack and queen may help us, or the hero. Low priority. * 0. Trumps can always be played (except the fool). Lowest priority. */ if (card_istrump(card)) /* The fool always loses; other trumps are always playable */ return (0); switch (card_rank(card)+1) { case 11: /* Jack */ case 12: /* Queen */ return (1); case 13: /* King */ return (2); default: /* Ace through 10 */ return (3); } } static void ninetynine (mtmp) struct monst *mtmp; { long bet; int i, n, which, total = 0; xchar uhand[NINETYNINE_HAND], ghand[NINETYNINE_HAND]; char buf[BUFSZ]; winid win; anything any; menu_item *selected; /* Get the bet */ bet = gypsy_bet(mtmp, NINETYNINE_COST); if (!bet) return; /* Shuffle the deck and deal */ card_shuffle(mtmp); for (i = 0; i < NINETYNINE_HAND; i++) { uhand[i] = card_draw(mtmp); ghand[i] = card_draw(mtmp); } while (1) { /* Let the user pick a card */ any.a_void = 0; /* zero out all bits */ win = create_nhwindow(NHW_MENU); start_menu(win); for (i = 0; i < NINETYNINE_HAND; i++) { any.a_int = (nn_playable(uhand[i], total) ? i+1 : 0); card_name(uhand[i], buf); add_menu(win, NO_GLYPH, &any , 0, 0, ATR_NONE, buf, MENU_UNSELECTED); } any.a_int = NINETYNINE_HAND + 1; add_menu(win, NO_GLYPH, &any , 'q', 0, ATR_NONE, "Forfeit", MENU_UNSELECTED); end_menu(win, "Play a card:"); while (select_menu(win, PICK_ONE, &selected) != 1) ; destroy_nhwindow(win); /* Play the card */ which = selected[0].item.a_int-1; if (which >= NINETYNINE_HAND) { You("forfeit."); gypsy_charge(mtmp, bet); return; } card_name(uhand[which], buf); total = nn_play(uhand[which], total); You("play %s for a total of %d.", buf, total); if (total < 0 || total > NINETYNINE_GOAL) { You("lose!"); gypsy_charge(mtmp, bet); return; } /* Draw a new card */ uhand[which] = card_draw(mtmp); if (uhand[which] < 0) { pline_The("deck is empty. You win!"); EGYP(mtmp)->credit += bet; return; } /* Let the gypsy pick a card */ n = 0; for (i = 0; i < NINETYNINE_HAND; i++) if (nn_playable(ghand[i], total)) { /* The card is playable, but is it the best? */ if (!n++ || nn_pref(ghand[i]) > nn_pref(ghand[which])) which = i; } if (!n) { /* No playable cards */ pline("%s forfeits. You win!", Monnam(mtmp)); EGYP(mtmp)->credit += bet; return; } /* Play the card */ card_name(ghand[which], buf); total = nn_play(ghand[which], total); pline("%s plays %s for a total of %d.", Monnam(mtmp), buf, total); /* Draw a new card */ ghand[which] = card_draw(mtmp); if (ghand[which] < 0) { pline_The("deck is empty. You win!"); EGYP(mtmp)->credit += bet; return; } } return; } /*** Pawn gems ***/ STATIC_OVL NEARDATA const char pawnables[] = { ALLOW_COUNT, GEM_CLASS, 0 }; static void pawn (mtmp) struct monst *mtmp; { struct obj *otmp; long value; /* Prompt for an item */ otmp = getobj((const char *)pawnables, "pawn"); /* Is the item valid? */ if (!otmp) return; if (!objects[otmp->otyp].oc_name_known) { /* Reject unknown objects */ verbalize("Is this merchandise authentic?"); return; } if (otmp->otyp < DILITHIUM_CRYSTAL || otmp->otyp > LAST_GEM) { /* Reject glass */ verbalize("Don\'t bother with that junk!"); return; } /* Give the credit */ value = otmp->quan * objects[otmp->otyp].oc_cost; pline("%s gives you %ld zorkmid%s credit.", Monnam(mtmp), value, plur(value)); EGYP(mtmp)->credit += value; /* Gypsies don't keep merchandise; it could get stolen! */ otmp->quan = 1L; useup(otmp); return; } /*** Yendorian Tarocchi ***/ #define TAROCCHI_COST 500 /* Cost to play */ #define TAROCCHI_HAND 10 /* Number of cards in hand */ static void tarocchi (mtmp) struct monst *mtmp; { int turn; /* Shuffle the deck and deal */ gypsy_charge(mtmp, TAROCCHI_COST); card_shuffle(mtmp); /* Play the given number of turns */ for (turn = TAROCCHI_HAND; turn > 0; turn--) { } return; } /*** Monster-related functions ***/ void gypsy_init (mtmp) struct monst *mtmp; { mtmp->isgyp = TRUE; mtmp->mpeaceful = TRUE; mtmp->msleeping = 0; mtmp->mtrapseen = ~0; /* traps are known */ EGYP(mtmp)->credit = 0L; EGYP(mtmp)->top = 0; return; } void gypsy_chat (mtmp) struct monst *mtmp; { long money; winid win; anything any; menu_item *selected; #ifdef GOLDOBJ long umoney; #endif int n; #ifdef GOLDOBJ umoney = money_cnt(invent); #endif /* Sanity checks */ if (!mtmp || !mtmp->mpeaceful || !mtmp->isgyp || !humanoid(mtmp->data)) return; /* Add up your available money */ You("have %ld zorkmid%s credit and are carrying %ld zorkmid%s.", EGYP(mtmp)->credit, plur(EGYP(mtmp)->credit), #ifndef GOLDOBJ u.ugold, plur(u.ugold)); #else umoney, plur(umoney)); #endif money = EGYP(mtmp)->credit + #ifndef GOLDOBJ u.ugold; #else umoney; #endif /* Create the menu */ any.a_void = 0; /* zero out all bits */ win = create_nhwindow(NHW_MENU); start_menu(win); /* Fortune */ any.a_char = 'f'; if (money >= FORTUNE_COST) add_menu(win, NO_GLYPH, &any , 'f', 0, ATR_NONE, "Read your fortune", MENU_UNSELECTED); /* Three-card monte */ any.a_char = 'm'; if (money >= MONTE_COST) add_menu(win, NO_GLYPH, &any , 'm', 0, ATR_NONE, "Three-card monte", MENU_UNSELECTED); /* Ninety-nine */ any.a_char = 'n'; if (money >= NINETYNINE_COST) add_menu(win, NO_GLYPH, &any , 'n', 0, ATR_NONE, "Ninety-nine", MENU_UNSELECTED); /* Pawn gems (always available) */ any.a_char = 'p'; add_menu(win, NO_GLYPH, &any , 'p', 0, ATR_NONE, "Pawn gems", MENU_UNSELECTED); /* Yendorian Tarocchi */ any.a_char = 't'; /* if (money >= TAROCCHI_COST) add_menu(win, NO_GLYPH, &any , 't', 0, ATR_NONE, "Yendorian Tarocchi", MENU_UNSELECTED);*/ /* Help */ any.a_char = '?'; add_menu(win, NO_GLYPH, &any , '?', 0, ATR_NONE, "Help", MENU_UNSELECTED); /* Display the menu */ end_menu(win, "Play which game?"); n = select_menu(win, PICK_ONE, &selected); destroy_nhwindow(win); if (n > 0) switch (selected[0].item.a_char) { case 'f': fortune(mtmp); break; case 'm': monte(mtmp); break; case 'n': ninetynine(mtmp); break; case 'p': pawn(mtmp); break; case 't': tarocchi(mtmp); break; case '?': display_file_area(FILE_AREA_SHARE, "gypsy.txt", TRUE); break; } return; } slashem-0.0.7E7F3/src/dog.c0000664000076400007640000007464210545462317013375 0ustar aliali/* SCCS Id: @(#)dog.c 3.4 2002/09/08 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" #include "edog.h" #include "emin.h" #include "epri.h" #ifdef OVLB STATIC_DCL int NDECL(pet_type); void initedog(mtmp) register struct monst *mtmp; { 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; EDOG(mtmp)->droptime = 0; EDOG(mtmp)->dropdist = 10000; EDOG(mtmp)->apport = 10; EDOG(mtmp)->whistletime = 0; EDOG(mtmp)->hungrytime = 1000 + monstermoves; EDOG(mtmp)->ogoal.x = -1; /* force error if used before set */ EDOG(mtmp)->ogoal.y = -1; EDOG(mtmp)->abuse = 0; EDOG(mtmp)->revivals = 0; EDOG(mtmp)->mhpmax_penalty = 0; EDOG(mtmp)->killed_by_u = 0; } STATIC_OVL int pet_type() { if (urole.petnum != NON_PM) return (urole.petnum); else if (preferred_pet == 'c') return (PM_KITTEN); else if (preferred_pet == 'd') return (PM_LITTLE_DOG); else return (rn2(2) ? PM_KITTEN : PM_LITTLE_DOG); } struct monst * make_familiar(otmp,x,y,quietly) register struct obj *otmp; xchar x, y; boolean quietly; { struct permonst *pm; struct monst *mtmp = 0; int chance, trycnt = 100; do { if (otmp) { /* figurine; otherwise spell */ int mndx = otmp->corpsenm; pm = &mons[mndx]; /* activating a figurine provides one way to exceed the maximum number of the target critter created--unless it has a special limit (erinys, Nazgul) */ if ((mvitals[mndx].mvflags & G_EXTINCT) && mbirth_limit(mndx) != MAXMONNO) { if (!quietly) /* have just been given "You the figurine and it transforms." message */ pline("... into a pile of dust."); break; /* mtmp is null */ } } else if (!rn2(3)) { pm = &mons[pet_type()]; } else { pm = rndmonst(); if (!pm) { if (!quietly) There("seems to be nothing available for a familiar."); break; } } mtmp = makemon(pm, x, y, MM_EDOG|MM_IGNOREWATER); if (otmp && !mtmp) { /* monster was genocided or square occupied */ if (!quietly) pline_The("figurine writhes and then shatters into pieces!"); break; } } while (!mtmp && --trycnt > 0); if (!mtmp) return (struct monst *)0; if (is_pool(mtmp->mx, mtmp->my) && minliquid(mtmp)) return (struct monst *)0; initedog(mtmp); mtmp->msleeping = 0; if (otmp) { /* figurine; resulting monster might not become a pet */ chance = rn2(10); /* 0==tame, 1==peaceful, 2==hostile */ if (chance > 2) chance = otmp->blessed ? 0 : !otmp->cursed ? 1 : 2; /* 0,1,2: b=80%,10,10; nc=10%,80,10; c=10%,10,80 */ if (chance > 0) { mtmp->mtame = 0; /* not tame after all */ if (chance == 2) { /* hostile (cursed figurine) */ 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 */ if (otmp->onamelth) mtmp = christen_monst(mtmp, ONAME(otmp)); } set_malign(mtmp); /* more alignment changes */ newsym(mtmp->mx, mtmp->my); /* must wield weapon immediately since pets will otherwise drop it */ if (mtmp->mtame && attacktype(mtmp->data, AT_WEAP)) { mtmp->weapon_check = NEED_HTH_WEAPON; (void) mon_wield_item(mtmp); } return mtmp; } struct monst * make_helper(mnum,x,y) int mnum; xchar x, y; { struct permonst *pm; struct monst *mtmp = 0; int trycnt = 100; do { pm = &mons[mnum]; pm->pxlth += sizeof (struct edog); mtmp = makemon(pm, x, y, NO_MM_FLAGS); pm->pxlth -= sizeof (struct edog); } while (!mtmp && --trycnt > 0); if(!mtmp) return((struct monst *) 0); /* genocided */ initedog(mtmp); mtmp->msleeping = 0; set_malign(mtmp); /* more alignment changes */ newsym(mtmp->mx, mtmp->my); /* must wield weapon immediately since pets will otherwise drop it */ if (mtmp->mtame && attacktype(mtmp->data, AT_WEAP)) { mtmp->weapon_check = NEED_HTH_WEAPON; (void) mon_wield_item(mtmp); } return (mtmp); } struct monst * makedog() { register struct monst *mtmp; #ifdef STEED register struct obj *otmp; #endif const char *petname; int pettype, petsym; static int petname_used = 0; if (preferred_pet == 'n') return((struct monst *) 0); pettype = pet_type(); petsym = mons[pettype].mlet; if (pettype == PM_WINTER_WOLF_CUB) petname = wolfname; else if (pettype == PM_GHOUL) petname = ghoulname; else if (pettype == PM_PONY) petname = horsename; #if 0 else if (petsym == S_BAT) petname = batname; else if (petsym == S_SNAKE) petname = snakename; else if (petsym == S_RODENT) petname = ratname; else if (pettype == PM_GIANT_BADGER) petname = badgername; else if (pettype == PM_BABY_RED_DRAGON) petname = reddragonname; else if (pettype == PM_BABY_WHITE_DRAGON) petname = whitedragonname; #endif else if (petsym == S_DOG) petname = dogname; else petname = catname; /* default pet names */ if (!*petname && pettype == PM_LITTLE_DOG) { /* All of these names were for dogs. */ if(Role_if(PM_CAVEMAN)) petname = "Slasher"; /* The Warrior */ if(Role_if(PM_SAMURAI)) petname = "Hachi"; /* Shibuya Station */ if(Role_if(PM_BARBARIAN)) petname = "Idefix"; /* Obelix */ if(Role_if(PM_RANGER)) petname = "Sirius"; /* Orion's dog */ } mtmp = makemon(&mons[pettype], u.ux, u.uy, MM_EDOG); if(!mtmp) return((struct monst *) 0); /* pets were genocided */ #ifdef STEED /* Horses already wear a saddle */ if (pettype == PM_PONY && !!(otmp = mksobj(SADDLE, TRUE, FALSE))) { if (mpickobj(mtmp, otmp)) panic("merged saddle?"); mtmp->misc_worn_check |= W_SADDLE; otmp->dknown = otmp->bknown = otmp->rknown = 1; otmp->owornmask = W_SADDLE; otmp->leashmon = mtmp->m_id; update_mon_intrinsics(mtmp, otmp, TRUE, TRUE); } #endif if (!petname_used++ && *petname) mtmp = christen_monst(mtmp, petname); initedog(mtmp); return(mtmp); } /* record `last move time' for all monsters prior to level save so that mon_arrive() can catch up for lost time when they're restored later */ void update_mlstmv() { struct monst *mon; /* monst->mlstmv used to be updated every time `monst' actually moved, but that is no longer the case so we just do a blanket assignment */ for (mon = fmon; mon; mon = mon->nmon) if (!DEADMONSTER(mon)) mon->mlstmv = monstermoves; } void losedogs() { register struct monst *mtmp, *mtmp0 = 0, *mtmp2; while ((mtmp = mydogs) != 0) { mydogs = mtmp->nmon; mon_arrive(mtmp, TRUE); } for(mtmp = migrating_mons; mtmp; mtmp = mtmp2) { mtmp2 = mtmp->nmon; if (mtmp->mux == u.uz.dnum && mtmp->muy == u.uz.dlevel) { if(mtmp == migrating_mons) migrating_mons = mtmp->nmon; else mtmp0->nmon = mtmp->nmon; mon_arrive(mtmp, FALSE); } else mtmp0 = mtmp; } } /* called from resurrect() in addition to losedogs() */ void mon_arrive(mtmp, with_you) struct monst *mtmp; boolean with_you; { struct trap *t; xchar xlocale, ylocale, xyloc, xyflags, wander; int num_segs; mtmp->nmon = fmon; fmon = mtmp; if (mtmp->isshk) set_residency(mtmp, FALSE); num_segs = mtmp->wormno; /* baby long worms have no tail so don't use is_longworm() */ if ((mtmp->data == &mons[PM_LONG_WORM]) && #ifdef DCC30_BUG (mtmp->wormno = get_wormno(), mtmp->wormno != 0)) #else (mtmp->wormno = get_wormno()) != 0) #endif { initworm(mtmp, num_segs); /* tail segs are not yet initialized or displayed */ } else mtmp->wormno = 0; /* some monsters might need to do something special upon arrival _after_ the current level has been fully set up; see dochug() */ mtmp->mstrategy |= STRAT_ARRIVE; /* make sure mnexto(rloc_to(set_apparxy())) doesn't use stale data */ mtmp->mux = u.ux, mtmp->muy = u.uy; xyloc = mtmp->mtrack[0].x; xyflags = mtmp->mtrack[0].y; xlocale = mtmp->mtrack[1].x; ylocale = mtmp->mtrack[1].y; mtmp->mtrack[0].x = mtmp->mtrack[0].y = 0; mtmp->mtrack[1].x = mtmp->mtrack[1].y = 0; #ifdef STEED if (mtmp == u.usteed) return; /* don't place steed on the map */ #endif if (with_you) { /* When a monster accompanies you, sometimes it will arrive at your intended destination and you'll end up next to that spot. This code doesn't control the final outcome; goto_level(do.c) decides who ends up at your target spot when there is a monster there too. */ if (!MON_AT(u.ux, u.uy) && !rn2(mtmp->mtame ? 10 : mtmp->mpeaceful ? 5 : 2)) rloc_to(mtmp, u.ux, u.uy); else mnexto(mtmp); return; } /* * The monster arrived on this level independently of the player. * Its coordinate fields were overloaded for use as flags that * specify its final destination. */ if (mtmp->mlstmv < monstermoves - 1L) { /* heal monster for time spent in limbo */ long nmv = monstermoves - 1L - mtmp->mlstmv; mon_catchup_elapsed_time(mtmp, nmv); mtmp->mlstmv = monstermoves - 1L; /* let monster move a bit on new level (see placement code below) */ wander = (xchar) min(nmv, 8); } else wander = 0; switch (xyloc) { case MIGR_APPROX_XY: /* {x,y}locale set above */ break; case MIGR_EXACT_XY: wander = 0; break; case MIGR_NEAR_PLAYER: xlocale = u.ux, ylocale = u.uy; break; case MIGR_STAIRS_UP: xlocale = xupstair, ylocale = yupstair; break; case MIGR_STAIRS_DOWN: xlocale = xdnstair, ylocale = ydnstair; break; case MIGR_LADDER_UP: xlocale = xupladder, ylocale = yupladder; break; case MIGR_LADDER_DOWN: xlocale = xdnladder, ylocale = ydnladder; break; case MIGR_SSTAIRS: xlocale = sstairs.sx, ylocale = sstairs.sy; break; case MIGR_PORTAL: if (In_endgame(&u.uz)) { /* there is no arrival portal for endgame levels */ /* BUG[?]: for simplicity, this code relies on the fact that we know that the current endgame levels always build upwards and never have any exclusion subregion inside their TELEPORT_REGION settings. */ xlocale = rn1(updest.hx - updest.lx + 1, updest.lx); ylocale = rn1(updest.hy - updest.ly + 1, updest.ly); break; } /* find the arrival portal */ for (t = ftrap; t; t = t->ntrap) if (t->ttyp == MAGIC_PORTAL) break; if (t) { xlocale = t->tx, ylocale = t->ty; break; } else impossible("mon_arrive: no corresponding portal?"); /*FALLTHRU*/ default: case MIGR_RANDOM: xlocale = ylocale = 0; break; } if (xlocale && wander) { /* monster moved a bit; pick a nearby location */ /* mnearto() deals w/stone, et al */ char *r = in_rooms(xlocale, ylocale, 0); if (r && *r) { coord c; /* somexy() handles irregular rooms */ if (somexy(&rooms[*r - ROOMOFFSET], &c)) xlocale = c.x, ylocale = c.y; else xlocale = ylocale = 0; } else { /* not in a room */ int i, j; i = max(1, xlocale - wander); j = min(COLNO-1, xlocale + wander); xlocale = rn1(j - i, i); i = max(0, ylocale - wander); j = min(ROWNO-1, ylocale + wander); ylocale = rn1(j - i, i); } } /* moved a bit */ mtmp->mx = 0; /*(already is 0)*/ mtmp->my = xyflags; if (xlocale) (void) mnearto(mtmp, xlocale, ylocale, FALSE); else { if (!rloc(mtmp,TRUE)) { /* * Failed to place migrating monster, * probably because the level is full. * Dump the monster's cargo and leave the monster dead. */ struct obj *obj, *corpse; while ((obj = mtmp->minvent) != 0) { obj_extract_self(obj); obj_no_longer_held(obj); if (obj->owornmask & W_WEP) setmnotwielded(mtmp,obj); obj->owornmask = 0L; if (xlocale && ylocale) place_object(obj, xlocale, ylocale); else { rloco(obj); get_obj_location(obj, &xlocale, &ylocale, 0); } } corpse = mkcorpstat(CORPSE, (struct monst *)0, mtmp->data, xlocale, ylocale, FALSE); #ifndef GOLDOBJ if (mtmp->mgold) { if (xlocale == 0 && ylocale == 0 && corpse) { (void) get_obj_location(corpse, &xlocale, &ylocale, 0); (void) mkgold(mtmp->mgold, xlocale, ylocale); } mtmp->mgold = 0L; } #endif mongone(mtmp); } } } /* heal monster for time spent elsewhere */ void mon_catchup_elapsed_time(mtmp, nmv) struct monst *mtmp; long nmv; /* number of moves */ { int imv = 0; /* avoid zillions of casts and lint warnings */ #if defined(DEBUG) || defined(BETA) if (nmv < 0L) { /* crash likely... */ panic("catchup from future time?"); /*NOTREACHED*/ return; } else if (nmv == 0L) { /* safe, but should'nt happen */ impossible("catchup from now?"); } else #endif if (nmv >= LARGEST_INT) /* paranoia */ imv = LARGEST_INT - 1; else imv = (int)nmv; /* might stop being afraid, blind or frozen */ /* set to 1 and allow final decrement in movemon() */ if (mtmp->mblinded) { if (imv >= (int) mtmp->mblinded) mtmp->mblinded = 1; else mtmp->mblinded -= imv; } if (mtmp->mfrozen) { if (imv >= (int) mtmp->mfrozen) mtmp->mfrozen = 1; else mtmp->mfrozen -= imv; } if (mtmp->mfleetim) { if (imv >= (int) mtmp->mfleetim) mtmp->mfleetim = 1; else mtmp->mfleetim -= imv; } /* might recover from temporary trouble */ if (mtmp->mtrapped && rn2(imv + 1) > 40/2) mtmp->mtrapped = 0; if (mtmp->mconf && rn2(imv + 1) > 50/2) mtmp->mconf = 0; if (mtmp->mstun && rn2(imv + 1) > 10/2) mtmp->mstun = 0; /* might finish eating or be able to use special ability again */ if (imv > mtmp->meating) mtmp->meating = 0; else mtmp->meating -= imv; if (imv > mtmp->mspec_used) mtmp->mspec_used = 0; else mtmp->mspec_used -= imv; /* * M1_MINDLESS __ * M2_UNDEAD | * M2_WERE |-- These types will go ferral * M2_DEMON | * M1_ANIMAL -- */ if (is_animal(mtmp->data) || mindless(mtmp->data) || is_demon(mtmp->data) || is_undead(mtmp->data) || is_were(mtmp->data)) { /* reduce tameness for every * 150 moves you are away */ if (mtmp->mtame > nmv/150) mtmp->mtame -= nmv/150; else mtmp->mtame = 0; } /* check to see if it would have died as a pet; if so, go wild instead * of dying the next time we call dog_move() */ if (mtmp->mtame && !mtmp->isminion && (carnivorous(mtmp->data) || herbivorous(mtmp->data))) { struct edog *edog = EDOG(mtmp); if ((monstermoves > edog->hungrytime + 500 && mtmp->mhp < 3) || (monstermoves > edog->hungrytime + 750)) 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) mtmp->mhp = mtmp->mhpmax; else mtmp->mhp += imv; } #endif /* OVLB */ #ifdef OVL2 /* called when you move to another level */ void keepdogs(pets_only) boolean pets_only; /* true for ascension or final escape */ { register struct monst *mtmp, *mtmp2; register struct obj *obj; int num_segs; boolean stay_behind; #ifdef BLACKMARKET extern d_level new_dlevel; /* in do.c */ #endif /* BLACKMARKET */ for (mtmp = fmon; mtmp; mtmp = mtmp2) { mtmp2 = mtmp->nmon; if (DEADMONSTER(mtmp)) continue; if (pets_only && !mtmp->mtame) continue; if (((monnear(mtmp, u.ux, u.uy) && levl_follower(mtmp)) || #ifdef STEED (mtmp == u.usteed) || #endif /* the wiz will level t-port from anywhere to chase 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) #ifdef STEED /* eg if level teleport or new trap, steed has no control to avoid following */ || (mtmp == u.usteed) #endif ) /* 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)) pline("%s is still eating.", Monnam(mtmp)); stay_behind = TRUE; #ifdef BLACKMARKET } else if (mtmp->mtame && (Is_blackmarket(&new_dlevel) || Is_blackmarket(&u.uz))) { pline("%s can't follow you %s.", Monnam(mtmp), Is_blackmarket(&u.uz) ? "through the portal" : "into the Black Market"); stay_behind = TRUE; #endif /* BLACKMARKET */ } else if (mon_has_amulet(mtmp)) { if (canseemon(mtmp)) 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; } if (mtmp->isshk) set_residency(mtmp, TRUE); if (mtmp->wormno) { register int cnt; /* NOTE: worm is truncated to # segs = max wormno size */ cnt = count_wsegs(mtmp); num_segs = min(cnt, MAX_NUM_WORMS - 1); wormgone(mtmp); } else num_segs = 0; /* set minvent's obj->no_charge to 0 */ for(obj = mtmp->minvent; obj; obj = obj->nobj) { if (Has_contents(obj)) picked_container(obj); /* does the right thing */ obj->no_charge = 0; } relmon(mtmp); newsym(mtmp->mx,mtmp->my); mtmp->mx = mtmp->my = 0; /* avoid mnexto()/MON_AT() problem */ mtmp->wormno = num_segs; mtmp->mlstmv = monstermoves; mtmp->nmon = mydogs; mydogs = mtmp; } else if (mtmp->iswiz) { /* we want to be able to find him when his next resurrection chance comes up, but have him resume his present location if player returns to this level before that time */ migrate_to_level(mtmp, ledger_no(&u.uz), MIGR_EXACT_XY, (coord *)0); } else if (mtmp->mleashed) { /* 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); } } } #endif /* OVL2 */ #ifdef OVLB void migrate_to_level(mtmp, tolev, xyloc, cc) register struct monst *mtmp; xchar tolev; /* destination level */ xchar xyloc; /* MIGR_xxx destination xy location: */ coord *cc; /* optional destination coordinates */ { register struct obj *obj; d_level new_lev; xchar xyflags; int num_segs = 0; /* count of worm segments */ if (mtmp->isshk) set_residency(mtmp, TRUE); if (mtmp->wormno) { register int cnt; /* **** NOTE: worm is truncated to # segs = max wormno size **** */ cnt = count_wsegs(mtmp); num_segs = min(cnt, MAX_NUM_WORMS - 1); wormgone(mtmp); } /* set minvent's obj->no_charge to 0 */ for(obj = mtmp->minvent; obj; obj = obj->nobj) { if (Has_contents(obj)) picked_container(obj); /* does the right thing */ 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); new_lev.dlevel = ledger_to_dlev((xchar)tolev); /* overload mtmp->[mx,my], mtmp->[mux,muy], and mtmp->mtrack[] as */ /* destination codes (setup flag bits before altering mx or my) */ xyflags = (depth(&new_lev) < depth(&u.uz)); /* 1 => up */ if (In_W_tower(mtmp->mx, mtmp->my, &u.uz)) xyflags |= 2; mtmp->wormno = num_segs; mtmp->mlstmv = monstermoves; mtmp->mtrack[1].x = cc ? cc->x : mtmp->mx; mtmp->mtrack[1].y = cc ? cc->y : mtmp->my; mtmp->mtrack[0].x = xyloc; mtmp->mtrack[0].y = xyflags; mtmp->mux = new_lev.dnum; mtmp->muy = new_lev.dlevel; mtmp->mx = mtmp->my = 0; /* this implies migration */ } #endif /* OVLB */ #ifdef OVL1 /* return quality of food; the lower the better */ /* fungi will eat even tainted food */ int dogfood(mon,obj) struct monst *mon; register struct obj *obj; { boolean carni = carnivorous(mon->data); boolean herbi = herbivorous(mon->data); struct permonst *fptr = &mons[obj->corpsenm]; boolean starving; if (is_quest_artifact(obj) || obj_resists(obj, 0, 95)) return (obj->cursed ? TABU : APPORT); /* KMH -- Koalas can only eat eucalyptus */ if (mon->data == &mons[PM_KOALA]) return (obj->otyp == EUCALYPTUS_LEAF ? DOGFOOD : APPORT); switch(obj->oclass) { case FOOD_CLASS: if (obj->otyp == CORPSE && ((touch_petrifies(&mons[obj->corpsenm]) && !resists_ston(mon)) || is_rider(fptr))) return TABU; /* Ghouls only eat old corpses... yum! */ if (mon->data == &mons[PM_GHOUL] || mon->data == &mons[PM_GHAST]) { return (obj->otyp == CORPSE && obj->corpsenm != PM_ACID_BLOB && peek_at_iced_corpse_age(obj) + 5*rn1(20,10) <= monstermoves) ? DOGFOOD : TABU; } /* vampires only "eat" very fresh corpses ... * Assume meat -> blood */ if (is_vampire(mon->data)) { return (obj->otyp == CORPSE && has_blood(&mons[obj->corpsenm]) && !obj->oeaten && peek_at_iced_corpse_age(obj) + 5 >= monstermoves) ? DOGFOOD : TABU; } if (!carni && !herbi) return (obj->cursed ? UNDEF : APPORT); /* a starving pet will eat almost anything */ starving = (mon->mtame && !mon->isminion && EDOG(mon)->mhpmax_penalty); switch (obj->otyp) { case TRIPE_RATION: case MEATBALL: case MEAT_RING: case MEAT_STICK: case HUGE_CHUNK_OF_MEAT: return (carni ? DOGFOOD : MANFOOD); case EGG: if (touch_petrifies(&mons[obj->corpsenm]) && !resists_ston(mon)) return POISON; return (carni ? CADAVER : MANFOOD); case CORPSE: /* WAC add don't eat own class*/ if (mons[obj->corpsenm].mlet == mon->data->mlet) return (starving && carni ? ACCFOOD : TABU); else if ((peek_at_iced_corpse_age(obj) + 50L <= monstermoves && obj->corpsenm != PM_LIZARD && obj->corpsenm != PM_LICHEN && mon->data->mlet != S_FUNGUS) || (acidic(&mons[obj->corpsenm]) && !resists_acid(mon)) || (poisonous(&mons[obj->corpsenm]) && !resists_poison(mon))) return POISON; else if (vegan(fptr)) return (herbi ? CADAVER : MANFOOD); else return (carni ? CADAVER : MANFOOD); case CLOVE_OF_GARLIC: return (is_undead(mon->data) ? TABU : ((herbi || starving) ? ACCFOOD : MANFOOD)); case TIN: return (metallivorous(mon->data) ? ACCFOOD : MANFOOD); case APPLE: case CARROT: return (herbi ? DOGFOOD : starving ? ACCFOOD : MANFOOD); case BANANA: return ((mon->data->mlet == S_YETI) ? DOGFOOD : ((herbi || starving) ? ACCFOOD : MANFOOD)); default: if (starving) return ACCFOOD; return (obj->otyp > SLIME_MOLD ? (carni ? ACCFOOD : MANFOOD) : (herbi ? ACCFOOD : MANFOOD)); } default: if (obj->otyp == AMULET_OF_STRANGULATION || obj->otyp == RIN_SLOW_DIGESTION) return TABU; if (hates_silver(mon->data) && objects[obj->otyp].oc_material == SILVER) return(TABU); /* KMH -- Taz likes organics, too! */ if ((mon->data == &mons[PM_GELATINOUS_CUBE] || mon->data == &mons[PM_SHOGGOTH] || mon->data == &mons[PM_GIANT_SHOGGOTH] || mon->data == &mons[PM_TASMANIAN_DEVIL]) && 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); /* fall into next case */ case ROCK_CLASS: return(UNDEF); } } #endif /* OVL1 */ #ifdef OVLB struct monst * tamedog(mtmp, obj) register struct monst *mtmp; register struct obj *obj; { register struct monst *mtmp2; /* The Wiz, Medusa and the quest nemeses aren't even made peaceful. */ if (mtmp->iswiz || mtmp->data == &mons[PM_MEDUSA] || (mtmp->data->mflags3 & M3_WANTSARTI)) return((struct monst *)0); /* worst case, at least it'll be peaceful. */ mtmp->mpeaceful = 1; mtmp->mtraitor = 0; /* No longer a traitor */ set_malign(mtmp); if(flags.moonphase == FULL_MOON && night() && rn2(6) && obj && mtmp->data->mlet == S_DOG) return((struct monst *)0); /* If we cannot tame it, at least it's no longer afraid. */ mtmp->mflee = 0; mtmp->mfleetim = 0; /* make grabber let go now, whether it becomes tame or not */ if (mtmp == u.ustuck) { if (u.uswallow) expels(mtmp, mtmp->data, TRUE); else if (!(Upolyd && sticks(youmonst.data))) unstuck(mtmp); } /* feeding it treats makes it tamer */ if (mtmp->mtame && obj) { int tasty; if (mtmp->mcanmove && !mtmp->mconf && !mtmp->meating && ((tasty = dogfood(mtmp, obj)) == DOGFOOD || (tasty <= ACCFOOD && EDOG(mtmp)->hungrytime <= monstermoves))) { /* pet will "catch" and eat this thrown food */ if (canseemon(mtmp)) { boolean big_corpse = (obj->otyp == CORPSE && obj->corpsenm >= LOW_PM && mons[obj->corpsenm].msize > mtmp->data->msize); pline("%s catches %s%s", 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); /* eating might have killed it, but that doesn't matter here; a non-null result suppresses "miss" message for thrown food and also implies that the object has been deleted */ return mtmp; } else return (struct monst *)0; } if (mtmp->mtame || !mtmp->mcanmove || /* monsters with conflicting structures cannot be tamed */ mtmp->isshk || mtmp->isgd || mtmp->ispriest || mtmp->isminion || /* KMH -- Added gypsy */ mtmp->isgyp || is_covetous(mtmp->data) || is_human(mtmp->data) || (is_demon(mtmp->data) && !is_demon(youmonst.data)) || /* Mik -- New flag to indicate which things cannot be tamed... */ cannot_be_tamed(mtmp->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; mtmp2->mxlth = sizeof(struct edog); if (mtmp->mnamelth) Strcpy(NAME(mtmp2), NAME(mtmp)); initedog(mtmp2); replmon(mtmp, mtmp2); /* `mtmp' is now obsolete */ if (obj) { /* thrown food */ /* defer eating until the edog extension has been set up */ place_object(obj, mtmp2->mx, mtmp2->my); /* put on floor */ /* devour the food (might grow into larger, genocided monster) */ if (dog_eat(mtmp2, obj, mtmp2->mx, mtmp2->my, TRUE) == 2) return mtmp2; /* oops, it died... */ /* `obj' is now obsolete */ } newsym(mtmp2->mx, mtmp2->my); if (attacktype(mtmp2->data, AT_WEAP)) { mtmp2->weapon_check = NEED_HTH_WEAPON; (void) mon_wield_item(mtmp2); } return(mtmp2); } int make_pet_minion(mnum,alignment) int mnum; aligntyp alignment; { register struct monst *mon; register struct monst *mtmp2; mon = makemon(&mons[mnum], u.ux, u.uy, NO_MM_FLAGS); if (!mon) return 0; /* now tame that puppy... */ mtmp2 = newmonst(sizeof(struct edog) + mon->mnamelth); *mtmp2 = *mon; mtmp2->mxlth = sizeof(struct edog); if(mon->mnamelth) Strcpy(NAME(mtmp2), NAME(mon)); initedog(mtmp2); replmon(mon,mtmp2); newsym(mtmp2->mx, mtmp2->my); mtmp2->mpeaceful = 1; set_malign(mtmp2); mtmp2->mtame = 10; /* this section names the creature "of ______" */ if (mons[mnum].pxlth == 0) { mtmp2->isminion = TRUE; EMIN(mtmp2)->min_align = alignment; } else if (mnum == PM_ANGEL) { mtmp2->isminion = TRUE; EPRI(mtmp2)->shralign = alignment; } return 1; } /* * Called during pet revival or pet life-saving. * If you killed the pet, it revives wild. * If you abused the pet a lot while alive, it revives wild. * If you abused the pet at all while alive, it revives untame. * If the pet wasn't abused and was very tame, it might revive tame. */ void wary_dog(mtmp, was_dead) struct monst *mtmp; boolean was_dead; { struct edog *edog; boolean quietly = was_dead; mtmp->meating = 0; if (!mtmp->mtame) return; edog = !mtmp->isminion ? EDOG(mtmp) : 0; /* if monster was starving when it died, undo that now */ if (edog && edog->mhpmax_penalty) { mtmp->mhpmax += edog->mhpmax_penalty; mtmp->mhp += edog->mhpmax_penalty; /* heal it */ edog->mhpmax_penalty = 0; } if (edog && (edog->killed_by_u == 1 || edog->abuse > 2)) { mtmp->mpeaceful = mtmp->mtame = 0; if (edog->abuse >= 0 && edog->abuse < 10) if (!rn2(edog->abuse + 1)) mtmp->mpeaceful = 1; if(!quietly && cansee(mtmp->mx, mtmp->my)) { if (haseyes(youmonst.data)) { if (haseyes(mtmp->data)) pline("%s %s to look you in the %s.", Monnam(mtmp), mtmp->mpeaceful ? "seems unable" : "refuses", body_part(EYE)); else pline("%s avoids your gaze.", Monnam(mtmp)); } } } else { /* chance it goes wild anyway - Pet Semetary */ if (!rn2(mtmp->mtame)) { 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 (edog && mtmp->mtame) { edog->revivals++; edog->killed_by_u = 0; edog->abuse = 0; edog->ogoal.x = edog->ogoal.y = -1; if (was_dead || edog->hungrytime < monstermoves + 500L) edog->hungrytime = monstermoves + 500L; if (was_dead) { edog->droptime = 0L; edog->dropdist = 10000; edog->whistletime = 0L; edog->apport = 5; } /* else lifesaved, so retain current values */ } } void abuse_dog(mtmp) struct monst *mtmp; { if (!mtmp->mtame) return; if (Aggravate_monster || Conflict) mtmp->mtame /=2; 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 */ /* Give monster a chance to betray you now */ if (mtmp->mtame) betrayed(mtmp); if (!mtmp->mtame) newsym(mtmp->mx, mtmp->my); } } #endif /* OVLB */ /*dog.c*/ slashem-0.0.7E7F3/src/mkmaze.c0000664000076400007640000011336310545462317014102 0ustar aliali/* SCCS Id: @(#)mkmaze.c 3.4 2002/04/04 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" #include "sp_lev.h" #include "lev.h" /* save & restore info */ /* from sp_lev.c, for fixup_special() */ extern char *lev_message; extern lev_region *lregions; extern int num_lregions; STATIC_DCL boolean FDECL(iswall,(int,int)); STATIC_DCL boolean FDECL(iswall_or_stone,(int,int)); STATIC_DCL boolean FDECL(is_solid,(int,int)); STATIC_DCL int FDECL(extend_spine, (int [3][3], int, int, int)); STATIC_DCL boolean FDECL(okay,(int,int,int)); STATIC_DCL void FDECL(maze0xy,(coord *)); STATIC_DCL boolean FDECL(put_lregion_here,(XCHAR_P,XCHAR_P,XCHAR_P, XCHAR_P,XCHAR_P,XCHAR_P,XCHAR_P,BOOLEAN_P,d_level *)); STATIC_DCL void NDECL(fixup_special); STATIC_DCL void FDECL(move, (int *,int *,int)); STATIC_DCL void NDECL(setup_waterlevel); STATIC_DCL void NDECL(unsetup_waterlevel); STATIC_OVL boolean iswall(x,y) int x,y; { register int type; if (!isok(x,y)) return FALSE; type = levl[x][y].typ; return (IS_WALL(type) || IS_DOOR(type) || type == SDOOR || type == IRONBARS); } STATIC_OVL boolean iswall_or_stone(x,y) int x,y; { register int type; /* out of bounds = stone */ if (!isok(x,y)) return TRUE; type = levl[x][y].typ; return (type == STONE || IS_WALL(type) || IS_DOOR(type) || type == SDOOR || type == IRONBARS); } /* return TRUE if out of bounds, wall or rock */ STATIC_OVL boolean is_solid(x,y) int x, y; { return (!isok(x,y) || IS_STWALL(levl[x][y].typ)); } /* * Return 1 (not TRUE - we're doing bit vectors here) if we want to extend * a wall spine in the (dx,dy) direction. Return 0 otherwise. * * To extend a wall spine in that direction, first there must be a wall there. * Then, extend a spine unless the current position is surrounded by walls * in the direction given by (dx,dy). E.g. if 'x' is our location, 'W' * a wall, '.' a room, 'a' anything (we don't care), and our direction is * (0,1) - South or down - then: * * a a a * W x W This would not extend a spine from x down * W W W (a corridor of walls is formed). * * a a a * W x W This would extend a spine from x down. * . W W */ STATIC_OVL int extend_spine(locale, wall_there, dx, dy) int locale[3][3]; int wall_there, dx, dy; { int spine, nx, ny; nx = 1 + dx; ny = 1 + dy; if (wall_there) { /* wall in that direction */ if (dx) { if (locale[ 1][0] && locale[ 1][2] && /* EW are wall/stone */ locale[nx][0] && locale[nx][2]) { /* diag are wall/stone */ spine = 0; } else { spine = 1; } } else { /* dy */ if (locale[0][ 1] && locale[2][ 1] && /* NS are wall/stone */ locale[0][ny] && locale[2][ny]) { /* diag are wall/stone */ spine = 0; } else { spine = 1; } } } else { spine = 0; } return spine; } /* * Walls to surprise jaded Gehennom-haters :) * * Wall cleanup. This function turns all wall squares into 'floortype' squares. */ STATIC_OVL void wallify_special(x1, y1, x2, y2, floortype) int x1, y1, x2, y2; int floortype; /* The 'wall' floortype */ { uchar type; register int x,y; struct rm *lev; /* sanity check on incoming variables */ if (x1<0 || x2>=COLNO || x1>x2 || y1<0 || y2>=ROWNO || y1>y2) panic("wallify_fire: bad bounds (%d,%d) to (%d,%d)",x1,y1,x2,y2); /* Translate the maze... */ for(x = x1; x <= x2; x++) for(y = y1; y <= y2; y++) { lev = &levl[x][y]; type = lev->typ; if IS_WALL(type) lev->typ = floortype; /* Doors become room squares. Does this make sense? */ else if (IS_DOOR(type)) lev->typ = ROOM; else if (type == SDOOR) lev->typ = ROOM; else if (type == SCORR) lev->typ = ROOM; } return; } /* * Wall cleanup. This function has two purposes: (1) remove walls that * are totally surrounded by stone - they are redundant. (2) correct * the types so that they extend and connect to each other. */ STATIC_OVL void wallify_stone(x1, y1, x2, y2) /* [Lethe] Classic stone walls */ int x1, y1, x2, y2; { uchar type; register int x,y; struct rm *lev; int bits; int locale[3][3]; /* rock or wall status surrounding positions */ /* * Value 0 represents a free-standing wall. It could be anything, * so even though this table says VWALL, we actually leave whatever * typ was there alone. */ static xchar spine_array[16] = { VWALL, HWALL, HWALL, HWALL, VWALL, TRCORNER, TLCORNER, TDWALL, VWALL, BRCORNER, BLCORNER, TUWALL, VWALL, TLWALL, TRWALL, CROSSWALL }; /* sanity check on incoming variables */ if (x1<0 || x2>=COLNO || x1>x2 || y1<0 || y2>=ROWNO || y1>y2) panic("wallify_stone: bad bounds (%d,%d) to (%d,%d)",x1,y1,x2,y2); /* Step 1: change walls surrounded by rock to rock. */ for(x = x1; x <= x2; x++) for(y = y1; y <= y2; y++) { lev = &levl[x][y]; type = lev->typ; if (IS_WALL(type) && type != DBWALL) { if (is_solid(x-1,y-1) && is_solid(x-1,y ) && is_solid(x-1,y+1) && is_solid(x, y-1) && is_solid(x, y+1) && is_solid(x+1,y-1) && is_solid(x+1,y ) && is_solid(x+1,y+1)) lev->typ = STONE; } } /* * Step 2: set the correct wall type. We can't combine steps * 1 and 2 into a single sweep because we depend on knowing if * the surrounding positions are stone. */ for(x = x1; x <= x2; x++) for(y = y1; y <= y2; y++) { lev = &levl[x][y]; type = lev->typ; if ( !(IS_WALL(type) && type != DBWALL)) continue; /* set the locations TRUE if rock or wall or out of bounds */ locale[0][0] = iswall_or_stone(x-1,y-1); locale[1][0] = iswall_or_stone( x,y-1); locale[2][0] = iswall_or_stone(x+1,y-1); locale[0][1] = iswall_or_stone(x-1, y); locale[2][1] = iswall_or_stone(x+1, y); locale[0][2] = iswall_or_stone(x-1,y+1); locale[1][2] = iswall_or_stone( x,y+1); locale[2][2] = iswall_or_stone(x+1,y+1); /* determine if wall should extend to each direction NSEW */ bits = (extend_spine(locale, iswall(x,y-1), 0, -1) << 3) | (extend_spine(locale, iswall(x,y+1), 0, 1) << 2) | (extend_spine(locale, iswall(x+1,y), 1, 0) << 1) | extend_spine(locale, iswall(x-1,y), -1, 0); /* don't change typ if wall is free-standing */ if (bits) lev->typ = spine_array[bits]; } } /* * Wall cleanup. This selects an appropriate function to sort out the * dungeon walls. */ void wallification(x1, y1, x2, y2, initial) int x1, y1, x2, y2; boolean initial; { /* Wallify normally unless creating a full maze level */ if (!initial) { wallify_stone(x1, y1, x2, y2); return; } /* Put in the walls... */ { int wallchoice = rn2(20); if (wallchoice < 4) wallify_stone(x1, y1, x2, y2); else if (wallchoice < 6) wallify_special(x1, y1, x2, y2, CLOUD); else if (wallchoice < 10) wallify_special(x1, y1, x2, y2, MOAT); else if (wallchoice < 14) wallify_special(x1, y1, x2, y2, ICE); else if (wallchoice < 17) wallify_special(x1, y1, x2, y2, LAVAPOOL); else wallify_special(x1, y1, x2, y2, IRONBARS); } return; } STATIC_OVL boolean okay(x,y,dir) int x,y; register int dir; { move(&x,&y,dir); move(&x,&y,dir); if(x<3 || y<3 || x>x_maze_max || y>y_maze_max || levl[x][y].typ != 0) return(FALSE); return(TRUE); } STATIC_OVL void maze0xy(cc) /* find random starting point for maze generation */ coord *cc; { cc->x = 3 + 2*rn2((x_maze_max>>1) - 1); cc->y = 3 + 2*rn2((y_maze_max>>1) - 1); return; } /* * Bad if: * pos is occupied OR * pos is inside restricted region (lx,ly,hx,hy) OR * NOT (pos is corridor and a maze level OR pos is a room OR pos is air) */ boolean bad_location(x, y, lx, ly, hx, hy) xchar x, y; xchar lx, ly, hx, hy; { return((boolean)(occupied(x, y) || within_bounded_area(x,y, lx,ly, hx,hy) || !((levl[x][y].typ == CORR && level.flags.is_maze_lev) || levl[x][y].typ == ROOM || levl[x][y].typ == AIR))); } /* pick a location in area (lx, ly, hx, hy) but not in (nlx, nly, nhx, nhy) */ /* and place something (based on rtype) in that region */ void place_lregion(lx, ly, hx, hy, nlx, nly, nhx, nhy, rtype, lev) xchar lx, ly, hx, hy; xchar nlx, nly, nhx, nhy; xchar rtype; d_level *lev; { int trycnt; boolean oneshot; xchar x, y; if(!lx) { /* default to whole level */ /* * if there are rooms and this a branch, let place_branch choose * the branch location (to avoid putting branches in corridors). */ if(rtype == LR_BRANCH && nroom) { place_branch(Is_branchlev(&u.uz), 0, 0); return; } lx = 1; hx = COLNO-1; ly = 1; hy = ROWNO-1; } /* first a probabilistic approach */ oneshot = (lx == hx && ly == hy); for (trycnt = 0; trycnt < 200; trycnt++) { x = rn1((hx - lx) + 1, lx); y = rn1((hy - ly) + 1, ly); if (put_lregion_here(x,y,nlx,nly,nhx,nhy,rtype,oneshot,lev)) return; } /* then a deterministic one */ oneshot = TRUE; for (x = lx; x <= hx; x++) for (y = ly; y <= hy; y++) if (put_lregion_here(x,y,nlx,nly,nhx,nhy,rtype,oneshot,lev)) return; impossible("Couldn't place lregion type %d!", rtype); } STATIC_OVL boolean put_lregion_here(x,y,nlx,nly,nhx,nhy,rtype,oneshot,lev) xchar x, y; xchar nlx, nly, nhx, nhy; xchar rtype; boolean oneshot; d_level *lev; { if (bad_location(x, y, nlx, nly, nhx, nhy)) { if (!oneshot) { return FALSE; /* caller should try again */ } else { /* Must make do with the only location possible; avoid failure due to a misplaced trap. It might still fail if there's a dungeon feature here. */ struct trap *t = t_at(x,y); if (t && t->ttyp != MAGIC_PORTAL) deltrap(t); if (bad_location(x, y, nlx, nly, nhx, nhy)) return FALSE; } } switch (rtype) { case LR_TELE: case LR_UPTELE: case LR_DOWNTELE: /* "something" means the player in this case */ if(MON_AT(x, y)) { /* move the monster if no choice, or just try again */ if(oneshot) (void) rloc(m_at(x,y), FALSE); else return(FALSE); } u_on_newpos(x, y); break; case LR_PORTAL: mkportal(x, y, lev->dnum, lev->dlevel); break; case LR_DOWNSTAIR: case LR_UPSTAIR: mkstairs(x, y, (char)rtype, (struct mkroom *)0); break; case LR_BRANCH: place_branch(Is_branchlev(&u.uz), x, y); break; } return(TRUE); } static boolean was_waterlevel; /* ugh... this shouldn't be needed */ /* this is special stuff that the level compiler cannot (yet) handle */ STATIC_OVL void fixup_special() { register lev_region *r = lregions; struct d_level lev; register int x, y; struct mkroom *croom; boolean added_branch = FALSE; if (was_waterlevel) { was_waterlevel = FALSE; u.uinwater = 0; unsetup_waterlevel(); } else if (Is_waterlevel(&u.uz)) { level.flags.hero_memory = 0; was_waterlevel = TRUE; /* water level is an odd beast - it has to be set up before calling place_lregions etc. */ setup_waterlevel(); } for(x = 0; x < num_lregions; x++, r++) { switch(r->rtype) { case LR_BRANCH: added_branch = TRUE; goto place_it; case LR_PORTAL: if(*r->rname.str >= '0' && *r->rname.str <= '9') { /* "chutes and ladders" */ lev = u.uz; lev.dlevel = atoi(r->rname.str); } else { s_level *sp = find_level(r->rname.str); lev = sp->dlevel; } /* fall into... */ case LR_UPSTAIR: case LR_DOWNSTAIR: place_it: place_lregion(r->inarea.x1, r->inarea.y1, r->inarea.x2, r->inarea.y2, r->delarea.x1, r->delarea.y1, r->delarea.x2, r->delarea.y2, r->rtype, &lev); break; case LR_TELE: case LR_UPTELE: case LR_DOWNTELE: /* save the region outlines for goto_level() */ if(r->rtype == LR_TELE || r->rtype == LR_UPTELE) { updest.lx = r->inarea.x1; updest.ly = r->inarea.y1; updest.hx = r->inarea.x2; updest.hy = r->inarea.y2; updest.nlx = r->delarea.x1; updest.nly = r->delarea.y1; updest.nhx = r->delarea.x2; updest.nhy = r->delarea.y2; } if(r->rtype == LR_TELE || r->rtype == LR_DOWNTELE) { dndest.lx = r->inarea.x1; dndest.ly = r->inarea.y1; dndest.hx = r->inarea.x2; dndest.hy = r->inarea.y2; dndest.nlx = r->delarea.x1; dndest.nly = r->delarea.y1; dndest.nhx = r->delarea.x2; dndest.nhy = r->delarea.y2; } /* place_lregion gets called from goto_level() */ break; } if (r->rname.str) free((genericptr_t) r->rname.str), r->rname.str = 0; } /* place dungeon branch if not placed above */ if (!added_branch && Is_branchlev(&u.uz)) { place_lregion(0,0,0,0,0,0,0,0,LR_BRANCH,(d_level *)0); } /* KMH -- arboreal levels */ /* if (level.flags.arboreal) for(x = 2; x < x_maze_max; x++) for(y = 2; y < y_maze_max; y++) if (levl[x][y].typ == STONE) levl[x][y].typ = TREE;*/ /* KMH -- Sokoban levels */ if(In_sokoban(&u.uz)) sokoban_detect(); /* Still need to add some stuff to level file */ if (Is_medusa_level(&u.uz)) { struct obj *otmp; int tryct; croom = &rooms[0]; /* only one room on the medusa level */ for (tryct = rnd(4); tryct; tryct--) { x = somex(croom); y = somey(croom); if (goodpos(x, y, (struct monst *)0, 0)) { otmp = mk_tt_object(STATUE, x, y); while (otmp && (poly_when_stoned(&mons[otmp->corpsenm]) || pm_resistance(&mons[otmp->corpsenm],MR_STONE))) { otmp->corpsenm = rndmonnum(); otmp->owt = weight(otmp); } } } if (rn2(2)) otmp = mk_tt_object(STATUE, somex(croom), somey(croom)); else /* Medusa statues don't contain books */ otmp = mkcorpstat(STATUE, (struct monst *)0, (struct permonst *)0, somex(croom), somey(croom), FALSE); if (otmp) { while (pm_resistance(&mons[otmp->corpsenm],MR_STONE) || poly_when_stoned(&mons[otmp->corpsenm])) { otmp->corpsenm = rndmonnum(); otmp->owt = weight(otmp); } } } else if(Is_wiz1_level(&u.uz)) { croom = search_special(MORGUE); create_secret_door(croom, W_SOUTH|W_EAST|W_WEST); } else if(Is_knox(&u.uz)) { /* using an unfilled morgue for rm id */ croom = search_special(MORGUE); /* avoid inappropriate morgue-related messages */ level.flags.graveyard = level.flags.has_morgue = 0; croom->rtype = OROOM; /* perhaps it should be set to VAULT? */ /* stock the main vault */ for(x = croom->lx; x <= croom->hx; x++) for(y = croom->ly; y <= croom->hy; y++) { (void) mkgold((long) rn1(300, 600), x, y); if (!rn2(3) && !is_pool(x,y)) (void)maketrap(x, y, rn2(3) ? LANDMINE : SPIKED_PIT); } } else if (Role_if(PM_PRIEST) && In_quest(&u.uz)) { /* less chance for undead corpses (lured from lower morgues) */ level.flags.graveyard = 1; } else if (Is_stronghold(&u.uz)) { level.flags.graveyard = 1; } else if(Is_sanctum(&u.uz)) { croom = search_special(TEMPLE); create_secret_door(croom, W_ANY); } else if(on_level(&u.uz, &orcus_level)) { register struct monst *mtmp, *mtmp2; /* it's a ghost town, get rid of shopkeepers */ for(mtmp = fmon; mtmp; mtmp = mtmp2) { mtmp2 = mtmp->nmon; if(mtmp->isshk) mongone(mtmp); } } if(lev_message) { char *str, *nl; for(str = lev_message; (nl = index(str, '\n')) != 0; str = nl+1) { *nl = '\0'; pline("%s", str); } if(*str) pline("%s", str); free((genericptr_t)lev_message); lev_message = 0; } if (lregions) free((genericptr_t) lregions), lregions = 0; num_lregions = 0; } void makemaz(s) register const char *s; { int x,y; char protofile[20]; s_level *sp = Is_special(&u.uz); coord mm; if(*s) { if(sp && sp->rndlevs) Sprintf(protofile, "%s-%d", s, rnd((int) sp->rndlevs)); else Strcpy(protofile, s); } else if(*(dungeons[u.uz.dnum].proto)) { if(dunlevs_in_dungeon(&u.uz) > 1) { if(sp && sp->rndlevs) Sprintf(protofile, "%s%d-%d", dungeons[u.uz.dnum].proto, dunlev(&u.uz), rnd((int) sp->rndlevs)); else Sprintf(protofile, "%s%d", dungeons[u.uz.dnum].proto, dunlev(&u.uz)); } else if(sp && sp->rndlevs) { Sprintf(protofile, "%s-%d", dungeons[u.uz.dnum].proto, rnd((int) sp->rndlevs)); } else Strcpy(protofile, dungeons[u.uz.dnum].proto); } else Strcpy(protofile, ""); #ifdef WIZARD /* SPLEVTYPE format is "level-choice,level-choice"... */ if (wizard && *protofile && sp && sp->rndlevs) { 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 */ } impossible("Couldn't load \"%s\" - making a maze.", protofile); } level.flags.is_maze_lev = TRUE; #ifndef WALLIFIED_MAZE for(x = 2; x < x_maze_max; x++) for(y = 2; y < y_maze_max; y++) levl[x][y].typ = STONE; #else for(x = 2; x <= x_maze_max; x++) for(y = 2; y <= y_maze_max; y++) levl[x][y].typ = ((x % 2) && (y % 2)) ? STONE : HWALL; #endif 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, TRUE); #endif mazexy(&mm); mkstairs(mm.x, mm.y, 1, (struct mkroom *)0); /* up */ if (!Invocation_lev(&u.uz)) { mazexy(&mm); mkstairs(mm.x, mm.y, 0, (struct mkroom *)0); /* down */ } else { /* choose "vibrating square" location */ #define x_maze_min 2 #define y_maze_min 2 /* * Pick a position where the stairs down to Moloch's Sanctum * level will ultimately be created. At that time, an area * will be altered: walls removed, moat and traps generated, * boulders destroyed. The position picked here must ensure * that that invocation area won't extend off the map. * * We actually allow up to 2 squares around the usual edge of * the area to get truncated; see mkinvokearea(mklev.c). */ #define INVPOS_X_MARGIN (6 - 2) #define INVPOS_Y_MARGIN (5 - 2) #define INVPOS_DISTANCE 11 int x_range = x_maze_max - x_maze_min - 2*INVPOS_X_MARGIN - 1, y_range = y_maze_max - y_maze_min - 2*INVPOS_Y_MARGIN - 1; #ifdef DEBUG if (x_range <= INVPOS_X_MARGIN || y_range <= INVPOS_Y_MARGIN || (x_range * y_range) <= (INVPOS_DISTANCE * INVPOS_DISTANCE)) panic("inv_pos: maze is too small! (%d x %d)", x_maze_max, y_maze_max); #endif inv_pos.x = inv_pos.y = 0; /*{occupied() => invocation_pos()}*/ do { x = rn1(x_range, x_maze_min + INVPOS_X_MARGIN + 1); y = rn1(y_range, y_maze_min + INVPOS_Y_MARGIN + 1); /* we don't want it to be too near the stairs, nor to be on a spot that's already in use (wall|trap) */ } while (x == xupstair || y == yupstair || /*(direct line)*/ abs(x - xupstair) == abs(y - yupstair) || distmin(x, y, xupstair, yupstair) <= INVPOS_DISTANCE || !SPACE_POS(levl[x][y].typ) || occupied(x, y)); inv_pos.x = x; inv_pos.y = y; #undef INVPOS_X_MARGIN #undef INVPOS_Y_MARGIN #undef INVPOS_DISTANCE #undef x_maze_min #undef y_maze_min } /* place branch stair or portal */ place_branch(Is_branchlev(&u.uz), 0, 0); for(x = rn1(8,11); x; x--) { mazexy(&mm); (void) mkobj_at(rn2(2) ? GEM_CLASS : 0, mm.x, mm.y, TRUE); } 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); (void) makemon(&mons[PM_MINOTAUR], mm.x, mm.y, NO_MM_FLAGS); } for(x = rn1(5,7); x; x--) { mazexy(&mm); (void) makemon((struct permonst *) 0, mm.x, mm.y, NO_MM_FLAGS); } for(x = rn1(6,7); x; x--) { mazexy(&mm); (void) mkgold(0L,mm.x,mm.y); } for(x = rn1(6,7); x; x--) mktrap(0,1,(struct mkroom *) 0, (coord*) 0); } #ifdef MICRO /* Make the mazewalk iterative by faking a stack. This is needed to * ensure the mazewalk is successful in the limited stack space of * the program. This iterative version uses the minimum amount of stack * that is totally safe. */ void walkfrom(x,y) int x,y; { #define CELLS (ROWNO * COLNO) / 4 /* a maze cell is 4 squares */ char mazex[CELLS + 1], mazey[CELLS + 1]; /* char's are OK */ int q, a, dir, pos; int dirs[4]; pos = 1; mazex[pos] = (char) x; mazey[pos] = (char) y; while (pos) { x = (int) mazex[pos]; y = (int) mazey[pos]; if(!IS_DOOR(levl[x][y].typ)) { /* might still be on edge of MAP, so don't overwrite */ #ifndef WALLIFIED_MAZE levl[x][y].typ = CORR; #else levl[x][y].typ = ROOM; #endif levl[x][y].flags = 0; } q = 0; for (a = 0; a < 4; a++) if(okay(x, y, a)) dirs[q++]= a; if (!q) pos--; else { dir = dirs[rn2(q)]; move(&x, &y, dir); #ifndef WALLIFIED_MAZE levl[x][y].typ = CORR; #else levl[x][y].typ = ROOM; #endif move(&x, &y, dir); pos++; if (pos > CELLS) panic("Overflow in walkfrom"); mazex[pos] = (char) x; mazey[pos] = (char) y; } } } #else void walkfrom(x,y) int x,y; { register int q,a,dir; int dirs[4]; if(!IS_DOOR(levl[x][y].typ)) { /* might still be on edge of MAP, so don't overwrite */ #ifndef WALLIFIED_MAZE levl[x][y].typ = CORR; #else levl[x][y].typ = ROOM; #endif levl[x][y].flags = 0; } while(1) { q = 0; for(a = 0; a < 4; a++) if(okay(x,y,a)) dirs[q++]= a; if(!q) return; dir = dirs[rn2(q)]; move(&x,&y,dir); #ifndef WALLIFIED_MAZE levl[x][y].typ = CORR; #else levl[x][y].typ = ROOM; #endif move(&x,&y,dir); walkfrom(x,y); } } #endif /* MICRO */ STATIC_OVL void move(x,y,dir) register int *x, *y; register int dir; { switch(dir){ case 0: --(*y); break; case 1: (*x)++; break; case 2: (*y)++; break; case 3: --(*x); break; default: panic("move: bad direction"); } } void mazexy(cc) /* find random point in generated corridors, so we don't create items in moats, bunkers, or walls */ coord *cc; { int cpt=0; do { cc->x = 3 + 2*rn2((x_maze_max>>1) - 1); cc->y = 3 + 2*rn2((y_maze_max>>1) - 1); cpt++; } while (cpt < 100 && levl[cc->x][cc->y].typ != #ifdef WALLIFIED_MAZE ROOM #else CORR #endif ); if (cpt >= 100) { register int x, y; /* last try */ for (x = 0; x < (x_maze_max>>1) - 1; x++) for (y = 0; y < (y_maze_max>>1) - 1; y++) { cc->x = 3 + 2 * x; cc->y = 3 + 2 * y; if (levl[cc->x][cc->y].typ == #ifdef WALLIFIED_MAZE ROOM #else CORR #endif ) return; } panic("mazexy: can't find a place!"); } return; } void bound_digging() /* put a non-diggable boundary around the initial portion of a level map. * assumes that no level will initially put things beyond the isok() range. * * we can't bound unconditionally on the last line with something in it, * because that something might be a niche which was already reachable, * so the boundary would be breached * * we can't bound unconditionally on one beyond the last line, because * that provides a window of abuse for WALLIFIED_MAZE special levels */ { register int x,y; register unsigned typ; register struct rm *lev; boolean found, nonwall; int xmin,xmax,ymin,ymax; if(Is_earthlevel(&u.uz)) return; /* everything diggable here */ found = nonwall = FALSE; for(xmin=0; !found; xmin++) { lev = &levl[xmin][0]; for(y=0; y<=ROWNO-1; y++, lev++) { typ = lev->typ; if(typ != STONE) { found = TRUE; if(!IS_WALL(typ)) nonwall = TRUE; } } } xmin -= (nonwall || !level.flags.is_maze_lev) ? 2 : 1; if (xmin < 0) xmin = 0; found = nonwall = FALSE; for(xmax=COLNO-1; !found; xmax--) { lev = &levl[xmax][0]; for(y=0; y<=ROWNO-1; y++, lev++) { typ = lev->typ; if(typ != STONE) { found = TRUE; if(!IS_WALL(typ)) nonwall = TRUE; } } } xmax += (nonwall || !level.flags.is_maze_lev) ? 2 : 1; if (xmax >= COLNO) xmax = COLNO-1; found = nonwall = FALSE; for(ymin=0; !found; ymin++) { lev = &levl[xmin][ymin]; for(x=xmin; x<=xmax; x++, lev += ROWNO) { typ = lev->typ; if(typ != STONE) { found = TRUE; if(!IS_WALL(typ)) nonwall = TRUE; } } } ymin -= (nonwall || !level.flags.is_maze_lev) ? 2 : 1; found = nonwall = FALSE; for(ymax=ROWNO-1; !found; ymax--) { lev = &levl[xmin][ymax]; for(x=xmin; x<=xmax; x++, lev += ROWNO) { typ = lev->typ; if(typ != STONE) { found = TRUE; if(!IS_WALL(typ)) nonwall = TRUE; } } } ymax += (nonwall || !level.flags.is_maze_lev) ? 2 : 1; for (x = 0; x < COLNO; x++) for (y = 0; y < ROWNO; y++) if (y <= ymin || y >= ymax || x <= xmin || x >= xmax) { #ifdef DCC30_BUG lev = &levl[x][y]; lev->wall_info |= W_NONDIGGABLE; #else levl[x][y].wall_info |= W_NONDIGGABLE; #endif } } void mkportal(x, y, todnum, todlevel) register xchar x, y, todnum, todlevel; { /* a portal "trap" must be matched by a */ /* portal in the destination dungeon/dlevel */ register struct trap *ttmp = maketrap(x, y, MAGIC_PORTAL); if (!ttmp) { impossible("portal on top of portal??"); return; } #ifdef DEBUG pline("mkportal: at (%d,%d), to %s, level %d", x, y, dungeons[todnum].dname, todlevel); #endif ttmp->dst.dnum = todnum; ttmp->dst.dlevel = todlevel; return; } /* * Special waterlevel stuff in endgame (TH). * * Some of these functions would probably logically belong to some * other source files, but they are all so nicely encapsulated here. */ /* 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 */ /* bubble movement boundaries */ #define bxmin (xmin + 1) #define bymin (ymin + 1) #define bxmax (xmax - 1) #define bymax (ymax - 1) STATIC_DCL void NDECL(set_wportal); STATIC_DCL void FDECL(mk_bubble, (int,int,int)); STATIC_DCL void FDECL(mv_bubble, (struct bubble *,int,int,BOOLEAN_P)); void movebubbles() { static boolean up; register struct bubble *b; register int x, y, i, j; struct trap *btrap; static const struct rm water_pos = #ifdef DISPLAY_LAYERS { S_water, 0, 0, 0, 0, 0, #else { cmap_to_glyph(S_water), #endif WATER, 0, 0, 0, 0, 0, 0, 0 }; /* set up the portal the first time bubbles are moved */ if (!wportal) set_wportal(); vision_recalc(2); /* * Pick up everything inside of a bubble then fill all bubble * locations. */ for (b = up ? bbubbles : ebubbles; b; b = up ? b->next : b->prev) { if (b->cons) panic("movebubbles: cons != null"); for (i = 0, x = b->x; i < (int) b->bm[0]; i++, x++) for (j = 0, y = b->y; j < (int) b->bm[1]; j++, y++) if (b->bm[j + 2] & (1 << i)) { if (!isok(x,y)) { impossible("movebubbles: bad pos (%d,%d)", x,y); continue; } /* pick up objects, monsters, hero, and traps */ if (OBJ_AT(x,y)) { struct obj *olist = (struct obj *) 0, *otmp; struct container *cons = (struct container *) alloc(sizeof(struct container)); while ((otmp = level.objects[x][y]) != 0) { remove_object(otmp); otmp->ox = otmp->oy = 0; otmp->nexthere = olist; olist = otmp; } cons->x = x; cons->y = y; cons->what = CONS_OBJ; cons->list = (genericptr_t) olist; cons->next = b->cons; b->cons = cons; } if (MON_AT(x,y)) { struct monst *mon = m_at(x,y); struct container *cons = (struct container *) alloc(sizeof(struct container)); cons->x = x; cons->y = y; cons->what = CONS_MON; cons->list = (genericptr_t) mon; cons->next = b->cons; b->cons = cons; if(mon->wormno) remove_worm(mon); else remove_monster(x, y); newsym(x,y); /* clean up old position */ mon->mx = mon->my = 0; } if (!u.uswallow && x == u.ux && y == u.uy) { struct container *cons = (struct container *) alloc(sizeof(struct container)); cons->x = x; cons->y = y; cons->what = CONS_HERO; cons->list = (genericptr_t) 0; cons->next = b->cons; b->cons = cons; } if ((btrap = t_at(x,y)) != 0) { struct container *cons = (struct container *) alloc(sizeof(struct container)); cons->x = x; cons->y = y; cons->what = CONS_TRAP; cons->list = (genericptr_t) btrap; cons->next = b->cons; b->cons = cons; } levl[x][y] = water_pos; block_point(x,y); } } /* * Every second time traverse down. This is because otherwise * all the junk that changes owners when bubbles overlap * would eventually end up in the last bubble in the chain. */ up = !up; for (b = up ? bbubbles : ebubbles; b; b = up ? b->next : b->prev) { register int rx = rn2(3), ry = rn2(3); mv_bubble(b,b->dx + 1 - (!b->dx ? rx : (rx ? 1 : 0)), b->dy + 1 - (!b->dy ? ry : (ry ? 1 : 0)), FALSE); } /* put attached ball&chain back */ if (Punished) placebc(); vision_full_recalc = 1; } /* when moving in water, possibly (1 in 3) alter the intended destination */ void water_friction() { register int x, y, dx, dy; register boolean eff = FALSE; if (Swimming && rn2(4)) return; /* natural swimmers have advantage */ if (u.dx && !rn2(!u.dy ? 3 : 6)) { /* 1/3 chance or half that */ /* cancel delta x and choose an arbitrary delta y value */ x = u.ux; do { dy = rn2(3) - 1; /* -1, 0, 1 */ y = u.uy + dy; } while (dy && (!isok(x,y) || !is_pool(x,y))); u.dx = 0; u.dy = dy; eff = TRUE; } else if (u.dy && !rn2(!u.dx ? 3 : 5)) { /* 1/3 or 1/5*(5/6) */ /* cancel delta y and choose an arbitrary delta x value */ y = u.uy; do { dx = rn2(3) - 1; /* -1 .. 1 */ x = u.ux + dx; } while (dx && (!isok(x,y) || !is_pool(x,y))); u.dy = 0; u.dx = dx; eff = TRUE; } if (eff) pline("Water turbulence affects your movements."); } void save_waterlevel(fd, mode) int fd, mode; { register struct bubble *b; if (!Is_waterlevel(&u.uz)) return; if (perform_bwrite(mode)) { int n = 0; for (b = bbubbles; b; b = b->next) ++n; bwrite(fd, (genericptr_t)&n, sizeof (int)); bwrite(fd, (genericptr_t)&xmin, sizeof (int)); bwrite(fd, (genericptr_t)&ymin, sizeof (int)); bwrite(fd, (genericptr_t)&xmax, sizeof (int)); bwrite(fd, (genericptr_t)&ymax, sizeof (int)); for (b = bbubbles; b; b = b->next) bwrite(fd, (genericptr_t)b, sizeof (struct bubble)); } if (release_data(mode)) unsetup_waterlevel(); } void restore_waterlevel(fd) register int fd; { register struct bubble *b = (struct bubble *)0, *btmp; register int i; int n; if (!Is_waterlevel(&u.uz)) return; set_wportal(); mread(fd,(genericptr_t)&n,sizeof(int)); mread(fd,(genericptr_t)&xmin,sizeof(int)); mread(fd,(genericptr_t)&ymin,sizeof(int)); mread(fd,(genericptr_t)&xmax,sizeof(int)); mread(fd,(genericptr_t)&ymax,sizeof(int)); for (i = 0; i < n; i++) { btmp = b; b = (struct bubble *)alloc(sizeof(struct bubble)); mread(fd,(genericptr_t)b,sizeof(struct bubble)); if (bbubbles) { btmp->next = b; b->prev = btmp; } else { bbubbles = b; b->prev = (struct bubble *)0; } mv_bubble(b,0,0,TRUE); } ebubbles = b; b->next = (struct bubble *)0; was_waterlevel = TRUE; } const char *waterbody_name(x, y) xchar x,y; { register struct rm *lev; schar ltyp; if (!isok(x,y)) return "drink"; /* should never happen */ lev = &levl[x][y]; ltyp = lev->typ; if (is_lava(x,y)) return "lava"; else if (ltyp == ICE || (ltyp == DRAWBRIDGE_UP && (levl[x][y].drawbridgemask & DB_UNDER) == DB_ICE)) return "ice"; else if (((ltyp != POOL) && (ltyp != WATER) && !Is_medusa_level(&u.uz) && !Is_waterlevel(&u.uz) && !Is_juiblex_level(&u.uz)) || (ltyp == DRAWBRIDGE_UP && (levl[x][y].drawbridgemask & DB_UNDER) == DB_MOAT)) return "moat"; else if ((ltyp != POOL) && (ltyp != WATER) && Is_juiblex_level(&u.uz)) return "swamp"; else if (ltyp == POOL) return "pool of water"; else return "water"; } STATIC_OVL void set_wportal() { /* there better be only one magic portal on water level... */ for (wportal = ftrap; wportal; wportal = wportal->ntrap) if (wportal->ttyp == MAGIC_PORTAL) return; impossible("set_wportal(): no portal!"); } STATIC_OVL void setup_waterlevel() { register int x, y; register int xskip, yskip; /* ouch, hardcoded... */ xmin = 3; ymin = 1; xmax = 78; ymax = 20; /* set hero's memory to water */ for (x = xmin; x <= xmax; x++) for (y = ymin; y <= ymax; y++) clear_memory_glyph(x, y, S_water); /* make bubbles */ xskip = 10 + rn2(10); yskip = 4 + rn2(4); for (x = bxmin; x <= bxmax; x += xskip) for (y = bymin; y <= bymax; y += yskip) mk_bubble(x,y,rn2(7)); } STATIC_OVL void unsetup_waterlevel() { register struct bubble *b, *bb; /* free bubbles */ for (b = bbubbles; b; b = bb) { bb = b->next; free((genericptr_t)b); } bbubbles = ebubbles = (struct bubble *)0; } STATIC_OVL void mk_bubble(x,y,n) register int x, y, n; { /* * These bit masks make visually pleasing bubbles on a normal aspect * 25x80 terminal, which naturally results in them being mathematically * anything but symmetric. For this reason they cannot be computed * in situ, either. The first two elements tell the dimensions of * the bubble's bounding box. */ static uchar bm2[] = {2,1,0x3}, bm3[] = {3,2,0x7,0x7}, bm4[] = {4,3,0x6,0xf,0x6}, bm5[] = {5,3,0xe,0x1f,0xe}, bm6[] = {6,4,0x1e,0x3f,0x3f,0x1e}, bm7[] = {7,4,0x3e,0x7f,0x7f,0x3e}, bm8[] = {8,4,0x7e,0xff,0xff,0x7e}, *bmask[] = {bm2,bm3,bm4,bm5,bm6,bm7,bm8}; register struct bubble *b; if (x >= bxmax || y >= bymax) return; if (n >= SIZE(bmask)) { impossible("n too large (mk_bubble)"); n = SIZE(bmask) - 1; } b = (struct bubble *)alloc(sizeof(struct bubble)); if ((x + (int) bmask[n][0] - 1) > bxmax) x = bxmax - bmask[n][0] + 1; if ((y + (int) bmask[n][1] - 1) > bymax) y = bymax - bmask[n][1] + 1; b->x = x; b->y = y; b->dx = 1 - rn2(3); b->dy = 1 - rn2(3); b->bm = bmask[n]; b->cons = 0; if (!bbubbles) bbubbles = b; if (ebubbles) { ebubbles->next = b; b->prev = ebubbles; } else b->prev = (struct bubble *)0; b->next = (struct bubble *)0; ebubbles = b; mv_bubble(b,0,0,TRUE); } /* * The player, the portal and all other objects and monsters * float along with their associated bubbles. Bubbles may overlap * freely, and the contents may get associated with other bubbles in * the process. Bubbles are "sticky", meaning that if the player is * in the immediate neighborhood of one, he/she may get sucked inside. * This property also makes leaving a bubble slightly difficult. */ STATIC_OVL void mv_bubble(b,dx,dy,ini) register struct bubble *b; register int dx, dy; register boolean ini; { register int x, y, i, j, colli = 0; struct container *cons, *ctemp; /* move bubble */ if (dx < -1 || dx > 1 || dy < -1 || dy > 1) { /* pline("mv_bubble: dx = %d, dy = %d", dx, dy); */ dx = sgn(dx); dy = sgn(dy); } /* * collision with level borders? * 1 = horizontal border, 2 = vertical, 3 = corner */ if (b->x <= bxmin) colli |= 2; if (b->y <= bymin) colli |= 1; if ((int) (b->x + b->bm[0] - 1) >= bxmax) colli |= 2; if ((int) (b->y + b->bm[1] - 1) >= bymax) colli |= 1; if (b->x < bxmin) { pline("bubble xmin: x = %d, xmin = %d", b->x, bxmin); b->x = bxmin; } if (b->y < bymin) { pline("bubble ymin: y = %d, ymin = %d", b->y, bymin); b->y = bymin; } if ((int) (b->x + b->bm[0] - 1) > bxmax) { pline("bubble xmax: x = %d, xmax = %d", b->x + b->bm[0] - 1, bxmax); b->x = bxmax - b->bm[0] + 1; } if ((int) (b->y + b->bm[1] - 1) > bymax) { pline("bubble ymax: y = %d, ymax = %d", b->y + b->bm[1] - 1, bymax); b->y = bymax - b->bm[1] + 1; } /* bounce if we're trying to move off the border */ if (b->x == bxmin && dx < 0) dx = -dx; if (b->x + b->bm[0] - 1 == bxmax && dx > 0) dx = -dx; if (b->y == bymin && dy < 0) dy = -dy; if (b->y + b->bm[1] - 1 == bymax && dy > 0) dy = -dy; b->x += dx; b->y += dy; /* void positions inside bubble */ for (i = 0, x = b->x; i < (int) b->bm[0]; i++, x++) for (j = 0, y = b->y; j < (int) b->bm[1]; j++, y++) if (b->bm[j + 2] & (1 << i)) { levl[x][y].typ = AIR; levl[x][y].lit = 1; unblock_point(x,y); } /* replace contents of bubble */ for (cons = b->cons; cons; cons = ctemp) { ctemp = cons->next; cons->x += dx; cons->y += dy; switch(cons->what) { case CONS_OBJ: { struct obj *olist, *otmp; for (olist=(struct obj *)cons->list; olist; olist=otmp) { otmp = olist->nexthere; place_object(olist, cons->x, cons->y); } break; } case CONS_MON: { struct monst *mon = (struct monst *) cons->list; (void) mnearto(mon, cons->x, cons->y, TRUE); break; } case CONS_HERO: { int ux0 = u.ux, uy0 = u.uy; /* change u.ux0 and u.uy0? */ u.ux = cons->x; u.uy = cons->y; newsym(ux0, uy0); /* clean up old position */ if (MON_AT(cons->x, cons->y)) { mnexto(m_at(cons->x,cons->y)); } /* WAC removed this. The ball and chain is moved * as a CONS_OBJECT by the bubble */ #if 0 if (Punished) placebc(); /* do this for now */ #endif break; } case CONS_TRAP: { struct trap *btrap = (struct trap *) cons->list; btrap->tx = cons->x; btrap->ty = cons->y; break; } default: impossible("mv_bubble: unknown bubble contents"); break; } free((genericptr_t)cons); } b->cons = 0; /* boing? */ switch (colli) { case 1: b->dy = -b->dy; break; case 3: b->dy = -b->dy; /* fall through */ case 2: b->dx = -b->dx; break; default: /* sometimes alter direction for fun anyway (higher probability for stationary bubbles) */ if (!ini && ((b->dx || b->dy) ? !rn2(20) : !rn2(5))) { b->dx = 1 - rn2(3); b->dy = 1 - rn2(3); } } } /*mkmaze.c*/ slashem-0.0.7E7F3/src/wield.c0000644000076400007640000006160110545462317013715 0ustar aliali/* SCCS Id: @(#)wield.c 3.4 2003/01/29 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" /* KMH -- Differences between the three weapon slots. * * The main weapon (uwep): * 1. Is filled by the (w)ield command. * 2. Can be filled with any type of item. * 3. May be carried in one or both hands. * 4. Is used as the melee weapon and as the launcher for * ammunition. * 5. Only conveys intrinsics when it is a weapon, weapon-tool, * or artifact. * 6. Certain cursed items will weld to the hand and cannot be * unwielded or dropped. See erodeable_wep() and will_weld() * below for the list of which items apply. * * The secondary weapon (uswapwep): * 1. Is filled by the e(x)change command, which swaps this slot * with the main weapon. If the "pushweapon" option is set, * the (w)ield command will also store the old weapon in the * secondary slot. * 2. Can be field with anything that will fit in the main weapon * slot; that is, any type of item. * 3. Is usually NOT considered to be carried in the hands. * That would force too many checks among the main weapon, * second weapon, shield, gloves, and rings; and it would * further be complicated by bimanual weapons. A special * exception is made for two-weapon combat. * 4. Is used as the second weapon for two-weapon combat, and as * a convenience to swap with the main weapon. * 5. Never conveys intrinsics. * 6. Cursed items never weld (see #3 for reasons), but they also * prevent two-weapon combat. * * The quiver (uquiver): * 1. Is filled by the (Q)uiver command. * 2. Can be filled with any type of item. * 3. Is considered to be carried in a special part of the pack. * 4. Is used as the item to throw with the (f)ire command. * This is a convenience over the normal (t)hrow command. * 5. Never conveys intrinsics. * 6. Cursed items never weld; their effect is handled by the normal * throwing code. * * No item may be in more than one of these slots. */ STATIC_DCL int FDECL(ready_weapon, (struct obj *, BOOLEAN_P)); /* used by will_weld() */ /* probably should be renamed */ #define erodeable_wep(optr) ((optr)->oclass == WEAPON_CLASS \ || is_weptool(optr) \ || (optr)->otyp == HEAVY_IRON_BALL \ || (optr)->otyp == IRON_CHAIN) /* used by welded(), and also while wielding */ #define will_weld(optr) ((optr)->cursed \ && (erodeable_wep(optr) \ || (optr)->otyp == TIN_OPENER)) /*** Functions that place a given item in a slot ***/ /* Proper usage includes: * 1. Initializing the slot during character generation or a * restore. * 2. Setting the slot due to a player's actions. * 3. If one of the objects in the slot are split off, these * functions can be used to put the remainder back in the slot. * 4. Putting an item that was thrown and returned back into the slot. * 5. Emptying the slot, by passing a null object. NEVER pass * zeroobj! * * 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. * * MRKR: It now takes an extra flag put_away which is true if the * unwielded weapon is being put back into the inventory * (rather than dropped, destroyed, etc) */ void setuwep(obj, put_away) register struct obj *obj; boolean put_away; { 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 && olduwep && olduwep->oartifact == ART_SUNSWORD && 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. */ 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 */ /* MRKR: Handle any special effects of unwielding a weapon */ if (olduwep && olduwep != uwep) unwield(olduwep, put_away); update_inventory(); } STATIC_OVL int ready_weapon(wep, put_away) struct obj *wep; boolean put_away; { /* Separated function so swapping works easily */ int res = 0; if (!wep) { /* No weapon */ if (uwep) { You("are empty %s.", body_part(HANDED)); setuwep((struct obj *) 0, put_away); res++; } else You("are already empty %s.", body_part(HANDED)); } else if (!uarmg && !Stone_resistance && wep->otyp == CORPSE && touch_petrifies(&mons[wep->corpsenm])) { /* Prevent wielding cockatrice when not wearing gloves --KAA */ char kbuf[BUFSZ]; You("wield the %s corpse in your bare %s.", mons[wep->corpsenm].mname, makeplural(body_part(HAND))); Sprintf(kbuf, "%s corpse", an(mons[wep->corpsenm].mname)); instapetrify(kbuf); } else if (uarms && bimanual(wep)) You("cannot wield a two-handed %s while wearing a shield.", is_sword(wep) ? "sword" : wep->otyp == BATTLE_AXE ? "axe" : "weapon"); else if (wep->oartifact && !touch_artifact(wep, &youmonst)) { res++; /* takes a turn even though it doesn't get wielded */ } else if (tech_inuse(T_EVISCERATE)) { /* WAC - if you have 'L' has claws out and wields weapon, * can't retract claws */ You("can't retract your claws!"); } else { /* Weapon WILL be wielded after this point */ res++; if (will_weld(wep)) { const char *tmp = xname(wep), *thestr = "The "; if (strncmp(tmp, thestr, 4) && !strncmp(The(tmp),thestr,4)) tmp = thestr; else tmp = ""; pline("%s%s %s to your %s!", tmp, aobjnam(wep, "weld"), (wep->quan == 1L) ? "itself" : "themselves", /* a3 */ bimanual(wep) ? (const char *)makeplural(body_part(HAND)) : body_part(HAND)); wep->bknown = TRUE; } else { /* The message must be printed before setuwep (since * you might die and be revived from changing weapons), * and the message must be before the death message and * Lifesaved rewielding. Yet we want the message to * say "weapon in hand", thus this kludge. */ long dummy = wep->owornmask; wep->owornmask |= W_WEP; prinv((char *)0, wep, 0L); wep->owornmask = dummy; } setuwep(wep, put_away); /* KMH -- Talking artifacts are finally implemented */ arti_speak(wep); if (wep->oartifact == ART_SUNSWORD && !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 && objects[wep->otyp].oc_material == IRON) { /* Elves are averse to wielding cold iron */ You("have an uneasy feeling about wielding cold iron."); change_luck(-1); } #endif if (wep->unpaid) { struct monst *this_shkp; if ((this_shkp = shop_keeper(inside_shop(u.ux, u.uy))) != (struct monst *)0) { pline("%s says \"You be careful with my %s!\"", shkname(this_shkp), xname(wep)); } } } return(res); } void setuqwep(obj) register struct obj *obj; { setworn(obj, W_QUIVER); update_inventory(); } void setuswapwep(obj, put_away) register struct obj *obj; boolean put_away; { struct obj *oldswapwep = uswapwep; setworn(obj, W_SWAPWEP); if (oldswapwep && oldswapwep != uswapwep) unwield(oldswapwep, put_away); update_inventory(); } /*** Commands to change particular slot(s) ***/ static NEARDATA const char wield_objs[] = { ALL_CLASSES, ALLOW_NONE, WEAPON_CLASS, TOOL_CLASS, 0 }; static NEARDATA const char ready_objs[] = { ALL_CLASSES, ALLOW_NONE, WEAPON_CLASS, 0 }; static NEARDATA const char bullets[] = /* (note: different from dothrow.c) */ { ALL_CLASSES, ALLOW_NONE, GEM_CLASS, WEAPON_CLASS, 0 }; int dowield() { register struct obj *wep, *oldwep; int result; /* May we attempt this? */ multi = 0; if (cantwield(youmonst.data)) { pline("Don't be ridiculous!"); return(0); } /* Prompt for a new weapon */ if (!(wep = getobj(wield_objs, "wield"))) /* Cancelled */ return (0); else if (wep == uwep) { You("are already wielding that!"); if (is_weptool(wep)) unweapon = FALSE; /* [see setuwep()] */ return (0); } else if (welded(uwep)) { weldmsg(uwep); /* previously interrupted armor removal mustn't be resumed */ reset_remarm(); return (0); } /* Handle no object, or object in other slot */ if (wep == &zeroobj) wep = (struct obj *) 0; else if (wep == uswapwep) return (doswapweapon()); else if (wep == uquiver) setuqwep((struct obj *) 0); else if (wep->owornmask & (W_ARMOR | W_RING | W_AMUL | W_TOOL #ifdef STEED | W_SADDLE #endif )) { You("cannot wield that!"); return (0); } /* Set your new primary weapon */ oldwep = uwep; result = ready_weapon(wep, TRUE); if (flags.pushweapon && oldwep && uwep != oldwep) setuswapwep(oldwep, TRUE); untwoweapon(); return (result); } int doswapweapon() { register struct obj *oldwep, *oldswap; int result = 0; /* May we attempt this? */ multi = 0; if (cantwield(youmonst.data)) { pline("Don't be ridiculous!"); return(0); } if (welded(uwep)) { weldmsg(uwep); return (0); } /* Unwield your current secondary weapon */ oldwep = uwep; oldswap = uswapwep; if (uswapwep) unwield(uswapwep, FALSE); u.twoweap = 0; setuswapwep((struct obj *) 0, FALSE); /* Set your new primary weapon */ result = ready_weapon(oldswap, TRUE); /* Set your new secondary weapon */ if (uwep == oldwep) /* Wield failed for some reason */ setuswapwep(oldswap, FALSE); else { setuswapwep(oldwep, FALSE); if (uswapwep) prinv((char *)0, uswapwep, 0L); else You("have no secondary weapon readied."); } if (u.twoweap && !can_twoweapon()) untwoweapon(); return (result); } int dowieldquiver() { register struct obj *newquiver; const char *quivee_types = (uslinging() || (uswapwep && objects[uswapwep->otyp].oc_skill == P_SLING)) ? bullets : ready_objs; /* Since the quiver isn't in your hands, don't check cantwield(), */ /* will_weld(), touch_petrifies(), etc. */ multi = 0; /* Slash'EM has used Q for quiver since it started */ /* Because 'Q' used to be quit... */ if (flags.suppress_alert < FEATURE_NOTICE_VER(0,0,0)) pline("Note: Please use #quit if you wish to exit the game."); /* Prompt for a new quiver */ if (!(newquiver = getobj(quivee_types, "ready"))) /* Cancelled */ return (0); /* Handle no object, or object in other slot */ /* Any type is okay, since we give no intrinsics anyways */ if (newquiver == &zeroobj) { /* Explicitly nothing */ if (uquiver) { You("now have no ammunition readied."); setuqwep(newquiver = (struct obj *) 0); } else { You("already have no ammunition readied!"); return(0); } } else if (newquiver == uquiver) { pline("That ammunition is already readied!"); return(0); } 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 | W_SADDLE #endif )) { You("cannot ready that!"); return (0); } else { long dummy; /* Check if it's the secondary weapon */ if (newquiver == uswapwep) { setuswapwep((struct obj *) 0, TRUE); untwoweapon(); } /* Okay to put in quiver; print it */ dummy = newquiver->owornmask; newquiver->owornmask |= W_QUIVER; prinv((char *)0, newquiver, 0L); newquiver->owornmask = dummy; } /* Finally, place it in the quiver */ setuqwep(newquiver); /* Take no time since this is a convenience slot */ return (0); } /* used for #rub and for applying pick-axe, whip, grappling hook, or polearm */ /* (moved from apply.c) */ boolean wield_tool(obj, verb) struct obj *obj; const char *verb; /* "rub",&c */ { const char *what; boolean more_than_1; if (obj == uwep) return TRUE; /* nothing to do if already wielding it */ if (!verb) verb = "wield"; what = xname(obj); more_than_1 = (obj->quan > 1L || strstri(what, "pair of ") != 0 || strstri(what, "s of ") != 0); if (obj->owornmask & (W_ARMOR|W_RING|W_AMUL|W_TOOL)) { char yourbuf[BUFSZ]; You_cant("%s %s %s while wearing %s.", verb, shk_your(yourbuf, obj), what, more_than_1 ? "them" : "it"); return FALSE; } if (welded(uwep)) { if (flags.verbose) { const char *hand = body_part(HAND); if (bimanual(uwep)) hand = makeplural(hand); if (strstri(what, "pair of ") != 0) more_than_1 = FALSE; pline( "Since your weapon is welded to your %s, you cannot %s %s %s.", hand, verb, more_than_1 ? "those" : "that", xname(obj)); } else { You_cant("do that."); } return FALSE; } if (cantwield(youmonst.data)) { You_cant("hold %s strongly enough.", more_than_1 ? "them" : "it"); return FALSE; } /* check shield */ if (uarms && bimanual(obj)) { You("cannot %s a two-handed %s while wearing a shield.", verb, (obj->oclass == WEAPON_CLASS) ? "weapon" : "tool"); return FALSE; } if (uquiver == obj) setuqwep((struct obj *)0); if (uswapwep == obj) { (void) doswapweapon(); /* doswapweapon might fail */ if (uswapwep == obj) return FALSE; } else { You("now wield %s.", doname(obj)); setuwep(obj, TRUE); } if (uwep != obj) return FALSE; /* rewielded old object after dying */ /* applying weapon or tool that gets wielded ends two-weapon combat */ if (u.twoweap) untwoweapon(); if (obj->oclass != WEAPON_CLASS && !is_weptool(obj)) unweapon = TRUE; return TRUE; } /* WAC * For the purposes of SLASH'EM, artifacts should be wieldable in either hand */ int can_twoweapon() { char buf[BUFSZ]; const char *what; boolean disallowed_by_race; boolean disallowed_by_role; struct obj *otmp; #define NOT_WEAPON(obj) (obj && !is_weptool(obj) && obj->oclass != WEAPON_CLASS) if (!could_twoweap(youmonst.data) && (uwep || uswapwep)) { what = uwep && uswapwep ? "two weapons" : "more than one weapon"; if (cantwield(youmonst.data)) pline("Don't be ridiculous!"); else if (Upolyd) You_cant("use %s in your current form.", what); else { disallowed_by_role = P_MAX_SKILL(P_TWO_WEAPON_COMBAT) < P_BASIC; disallowed_by_race = youmonst.data->mattk[1].aatyp != AT_WEAP; *buf = '\0'; if (!disallowed_by_role) Strcpy(buf, disallowed_by_race ? urace.noun : urace.adj); if (disallowed_by_role || !disallowed_by_race) { if (!disallowed_by_role) Strcat(buf, " "); Strcat(buf, (flags.female && urole.name.f) ? urole.name.f : urole.name.m); } pline("%s aren't able to use %s at once.", makeplural(upstart(buf)), what); } } else if (cantwield(youmonst.data)) pline("Don't be ridiculous!"); else if (youmonst.data->mattk[1].aatyp != AT_WEAP && youmonst.data->mattk[1].aatyp != AT_CLAW) { if (Upolyd) You_cant("fight with two %s in your current form.", makeplural(body_part(HAND))); else pline("%s aren't able to fight two-handed.", upstart(makeplural(urace.noun))); } 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 ((uwep && bimanual(uwep)) || (uswapwep && bimanual(uswapwep))) { otmp = (uwep && bimanual(uwep)) ? uwep : uswapwep; pline("%s isn't one-handed.", Yname2(otmp)); } else if (uarms) { if (uwep || uswapwep) what = uwep && uswapwep ? "use two weapons" : "use more than one weapon"; else { sprintf(buf, "fight with two %s", makeplural(body_part(HAND))); what = buf; } You_cant("%s while wearing a shield.", what); } /* WAC: TODO: cannot wield conflicting alignment artifacts*/ #if 0 else if (uswapwep->oartifact && ...) pline("%s resists being held second to another weapon!", Yname2(uswapwep)); #endif else if (!uarmg && !Stone_resistance && (uswapwep && uswapwep->otyp == CORPSE && (touch_petrifies(&mons[uswapwep->corpsenm])))) { char kbuf[BUFSZ]; You("wield the %s corpse with your bare %s.", mons[uswapwep->corpsenm].mname, body_part(HAND)); Sprintf(kbuf, "%s corpse", an(mons[uswapwep->corpsenm].mname)); instapetrify(kbuf); } else if (uswapwep && (Glib || uswapwep->cursed)) { if (!Glib) uswapwep->bknown = TRUE; drop_uswapwep(); } else return (TRUE); /* Passes all the checks */ /* Otherwise */ return (FALSE); } void drop_uswapwep() { 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); setuswapwep((struct obj *) 0, FALSE); dropx(obj); } int dotwoweapon() { /* You can always toggle it off */ if (u.twoweap) { if (uwep) You("switch to your primary weapon."); else if (uswapwep) { You("are empty %s.", body_part(HANDED)); unweapon = TRUE; } else You("switch to your right %s.", body_part(HAND)); if (uswapwep) unwield(uswapwep, TRUE); u.twoweap = 0; update_inventory(); return (0); } /* May we use two weapons? */ if (can_twoweapon()) { /* Success! */ if (uwep && uswapwep) You("begin two-weapon combat."); else if (uwep || uswapwep) { You("begin fighting with a weapon and your %s %s.", uwep ? "left" : "right", body_part(HAND)); unweapon = FALSE; } else if (Upolyd) You("begin fighting with two %s.", makeplural(body_part(HAND))); else You("begin two-handed combat."); u.twoweap = 1; update_inventory(); return (rnd(20) > ACURR(A_DEX)); } return (0); } /*** Functions to empty a given slot ***/ /* These should be used only when the item can't be put back in * the slot by life saving. Proper usage includes: * 1. The item has been eaten, stolen, burned away, or rotted away. * 2. Making an item disappear for a bones pile. */ void uwepgone() { if (uwep) { if (artifact_light(uwep) && uwep->lamplit) { end_burn(uwep, FALSE); if (!Blind) pline("%s glowing.", Tobjnam(uwep, "stop")); } unwield(uwep, FALSE); setworn((struct obj *)0, W_WEP); unweapon = TRUE; update_inventory(); } } void uswapwepgone() { if (uswapwep) { setworn((struct obj *)0, W_SWAPWEP); update_inventory(); } } void uqwepgone() { if (uquiver) { setworn((struct obj *)0, W_QUIVER); update_inventory(); } } void untwoweapon() { if (u.twoweap) { if (uwep && uswapwep) You("can no longer use two weapons at once."); else if (cantwield(youmonst.data)) You("can no longer control which %s to fight with.", body_part(HAND)); else You("can no longer use two %s to fight.", makeplural(body_part(HAND))); if (uswapwep) unwield(uswapwep, TRUE); u.twoweap = FALSE; update_inventory(); } 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) Your("%s.", aobjnam(target, "fade")); 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; } } else if (target->oerodeproof || (acid_dmg ? !is_corrodeable(target) : !is_rustprone(target))) { if (flags.verbose || !(target->oerodeproof && target->rknown)) { if (victim == &youmonst) Your("%s not affected.", aobjnam(target, "are")); 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) { if (victim == &youmonst) Your("%s%s!", aobjnam(target, acid_dmg ? "corrode" : "rust"), erosion+1 == MAX_ERODE ? " completely" : erosion ? " further" : ""); else if (vismon) pline("%s's %s%s!", Monnam(victim), 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 target->oeroded++; } else { if (flags.verbose) { if (victim == &youmonst) Your("%s completely %s.", aobjnam(target, Blind ? "feel" : "look"), acid_dmg ? "corroded" : "rusty"); else if (vismon) 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"); } } } int chwepon(otmp, amount) register struct obj *otmp; register int amount; { const char *color = hcolor((amount < 0) ? NH_BLACK : NH_BLUE); const char *xtime; int otyp = STRANGE_OBJECT; if(!uwep || (uwep->oclass != WEAPON_CLASS && !is_weptool(uwep))) { char buf[BUFSZ]; Sprintf(buf, "Your %s %s.", makeplural(body_part(HAND)), (amount >= 0) ? "twitch" : "itch"); strange_feeling(otmp, buf); exercise(A_DEX, (boolean) (amount >= 0)); return(0); } if (otmp && otmp->oclass == SCROLL_CLASS) otyp = otmp->otyp; if(uwep->otyp == WORM_TOOTH && amount >= 0) { uwep->otyp = CRYSKNIFE; uwep->oerodeproof = 0; Your("weapon seems sharper now."); uwep->cursed = 0; if (otyp != STRANGE_OBJECT) makeknown(otyp); return(1); } if(uwep->otyp == CRYSKNIFE && amount < 0) { uwep->otyp = WORM_TOOTH; uwep->oerodeproof = 0; Your("weapon seems duller now."); if (otyp != STRANGE_OBJECT && otmp->bknown) makeknown(otyp); return(1); } if (amount < 0 && uwep->oartifact && restrict_name(uwep, ONAME(uwep))) { if (!Blind) Your("%s %s.", aobjnam(uwep, "faintly glow"), color); return(1); } /* there is a (soft) upper and lower limit to uwep->spe */ 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")); useupall(uwep); /* let all of them disappear */ return(1); } if (!Blind) { xtime = (amount*amount == 1) ? "moment" : "while"; Your("%s %s for a %s.", aobjnam(uwep, amount == 0 ? "violently glow" : "glow"), color, xtime); if (otyp != STRANGE_OBJECT && uwep->known && (amount > 0 || (amount < 0 && otmp->bknown))) makeknown(otyp); } uwep->spe += amount; if(amount > 0) uwep->cursed = 0; /* * Enchantment, which normally improves a weapon, has an * addition adverse reaction on Magicbane whose effects are * spe dependent. Give an obscure clue here. */ if (uwep->oartifact == ART_MAGICBANE && uwep->spe >= 0) { Your("right %s %sches!", body_part(HAND), (((amount > 1) && (uwep->spe > 1)) ? "flin" : "it")); } /* an elven magic clue, cookie@keebler */ /* elven weapons vibrate warningly when enchanted beyond a limit */ if ((uwep->spe > 5) && (is_elven_weapon(uwep) || uwep->oartifact || !rn2(7))) Your("%s unexpectedly.", aobjnam(uwep, "suddenly vibrate")); return(1); } int welded(obj) register struct obj *obj; { if (obj && obj == uwep && will_weld(obj)) { obj->bknown = TRUE; return 1; } return 0; } void weldmsg(obj) register struct obj *obj; { long savewornmask; 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; } void unwield(obj, put_away) register struct obj *obj; boolean put_away; { /* MRKR: Extinguish torches when they are put away */ if (put_away && obj->otyp == TORCH && obj->lamplit) { You("extinguish %s before putting it away.", yname(obj)); end_burn(obj, TRUE); } } /*wield.c*/ slashem-0.0.7E7F3/make_anh.txt0000664000076400007640000000145410545462317014164 0ustar aliali To compile Nethack for the allegro interface: First, follow the instructions in the sys\msdos directory to compile a non-allegro binary and all the game datafiles. Then, rename "makefile.alg" to "makefile" and run make. The Allegro makefile DOES NOT automatically create the neccesary tile files. To create them manually, run "tile2bmp.exe" in the src\ directory, tile2bmp is created automatically by make. Then create an index for these tiles with "tileidx > index", "move index ..\tiles". Alternately, if your version of nethack has all the same monsters/objects/traps/terrain types as 3.3.0, you can just download a tileset. (currently only available with the binaries.) slashem-0.0.7E7F3/README.340000664000076400007640000002761110545462317012770 0ustar aliali NetHack 3.4.3 -- General information NetHack 3.4 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. NetHack 3.4.3 is a bugfix release for NetHack 3.4.2. * Several dozen general bug fixes including at least one fatal bug * Correct several inconsistencies * Handle level completely filled with monsters better * win32tty performance enhancements when playing on Windows 98 and Windows Me * win32gui player selection fixes * X11 player selection fixes, one of which could be fatal * Eliminated a gold-in-shop-container cheat * Include bones file version compatibility info in options file A fuller list of changes for this release can be found in the file doc/fixes34.3 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. The internal structure of bones and save files has not changed between NetHack 3.4.0, 3.4.1, 3.4.2 and now 3.4.3. That means that if you use the same compiler, the same compiler version and compiler switches, the same NetHack compile-time options, and you have not incorporated any additional source code patches that altered the save file format on your system, then bones and save files from 3.4.0 through 3.4.3 should be compatible. - - - - - - - - - - - Please read items (1), (2) and (3) BEFORE doing anything with your new code. 1. Unpack the code in a dedicated new directory. We will refer to that directory as the 'Top' directory. It makes no difference what you call it. 2. If there is no flaw in the packaging, many sub-directories will be automatically created, and files will be deposited in them: a. A 'dat' directory, which contains a variety of data files. b. A 'doc' directory, which contains various documentation. c. An 'include' directory, which contains *.h files. d. A 'src' directory, which contains game *.c files used by all versions. e. A 'util' directory, which contains files for utility programs. f. A 'sys' directory, which contains subdirectories for files that are operating-system specific. g. A 'sys/share' subdirectory, which contains files shared by some OSs. 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/wince' subdirectory, which contains files specific to Windows CE. s. A 'sys/winnt' subdirectory, which contains files specific to Windows NT. t. A 'win' directory, which contains subdirectories for files that are windowing-system specific (but not operating-system specific). u. A 'win/share' subdirectory, which contains files shared by some windowing systems. v. A 'win/Qt' subdirectory, which contains files specific to Qt. w. A 'win/X11' subdirectory, which contains files specific to X11. x. A 'win/gem' subdirectory, which contains files specific to GEM. y. A 'win/gnome' subdirectory, which contains files specific to GNOME. z. A 'win/tty' subdirectory, which contains files specific to ttys. A. 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 all the directory references in them. 3. Having unpacked, you should have a file called 'Files' in your Top directory. This file contains the list of all the files you now SHOULD have in each directory. Please check the files in each directory against this list to make sure that you have a complete set. 4. Before you do anything else, please read carefully the file called "license" in the 'dat' subdirectory. It is expected that you comply with the terms of that license, and we are very serious about it. 5. If everything is in order, you can now turn to trying to get the program 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. The files sys/*/Install.* were written to guide you in configuring the program for your operating system. The files win/*/Install.* are available, where necessary, to help you in configuring the program 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 Commodore Amiga running AmigaDOS 3.0 or higher with SAS/C 6.x (but see Makefile.ami about DICE and Manx) DEC Alpha/VMS (aka OpenVMS AXP), running V1.x through V7.1 DEC VAX/VMS, running V4.6 through V7.1 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, or BSDI. Intel 80386 or greater (or clone) boxes running Windows 95/98/Me. Intel 80386 or greater (or clone) boxes running Windows NT/2000/XP/2003. Intel Pentium or better (or clone) running BeOS 4.5 Sun SPARC based machine running SunOS 4.x, Solaris 2.x, or Solaris 7 NetHack 3.4 will also run on the following, but a cross-compiler hosted on another platform, such as win32, is required to build from source. Pocket PC devices running Windows CE 3.0 and higher H/PC Pro devices running Windows CE 2.11 and higher. Palm Size PC 1.1 devices running Windows CE 2.11 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 AT&T 3B2/1000 Model 80 running System V R3.2.2 AT&T 3B4000 running System V AT&T 6386 running System V R3.2 Data General AViiON systems running DG/UX DEC vaxen running BSD, Ultrix Decstations running Ultrix 3.1, 4.x Encore Multimax running UMAX 4.2 Gould NP1 running UTX 3/2 HP 9000s300 running HP-UX HP 9000s700 running HP-UX 9.x IBM PC/RT and RS/6000 running AIX 3.x IBM PS/2 and AT compatibles running OS/2 1.1 - 2.0 (and probably Warp) with Microsoft 6.0, and OS/2 2.0 and up with IBM CSet++ 2.0. Intel 80386 or greater (or clone) running 386BSD Mips M2000 running RiscOS 4.1 NeXT running Mach (using BSD configuration) Pyramid 9820x running OSx 4.4c SGI Iris running IRIX Stardent Vistra 800 running SysV R4.0 Stride 460 running UniStride 2.1 Sun-3s, -4s, and -386is running SunOS 3.x Sun-3s and -386is running SunOS 4.x Valid Logic Systems SCALD-System 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.3 on that platform. Windows 98/Me have been the most problematic Windows platforms for running NetHack so far. Patches for 3.4.2 (courtesy Michael Lehotay) have been incorporated into 3.4.3 to help make them work better. Your results may vary. A build for Intel 80286 machines and DOS "real mode" overlaid versions has not been produced for 3.4.3. 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. - - - - - - - - - - - If you have problems building the game, or you find bugs in it, we recommend filing a bug report from our "Contact Us" web page at: http://www.nethack.org/ When sending correspondence, please observe the following: o Please be sure to include your machine type, OS, and patchlevel. o Never send us binary files (e.g. save files or bones files). Whichever platform you are using, only a small minority of the development team has access to it, and you will rapidly annoy the others. If you have found a bug and think that your save file would aid in solving the problem, send us a description in words of the problem, your machine type, your operating system, and the version of NetHack. Tell us that you have a save file, but do not actually send it. In the rare case that we think your save file would be helpful, you will be contacted by a member of the development team with the address of a specific person to send the save file to. o Though we make an effort to reply to each bug report, it may take some time before you receive feedback. This is especially true during the period immediately after a new release, when we get the most bug reports. o We don't give hints for playing the game. o Don't bother to ask when the next version will be out. You will not get a reply. If you don't have access to the world wide web, or if you want to submit a patch for the NetHack source code via email directly, you can direct it to this address: nethack-bugs (at) nethack.org 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 require more code than we consider they're worth. If we reject your feature, you are free, of course, to post the patches to the net yourself and let the 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 -- slashem-0.0.7E7F3/slamfaq.txt0000664000076400007640000015523510545462317014054 0ustar aliali+------------------------------------------------------------------------+ | SLAMFAQ.TXT | +------------------------------------------------------------------------+ | SLASH'EM ver 0.0.7 | | Super Lotsa Added Stuff Hack - Extended Magic | | A Nethack Variant | | Courtesy of the Slash'EM development team with the efforts and support | | of countless others, especially the slashem-devel mailing list. | | (1997-2003)| +------------------------------------------------------------------------+ | Nethack is Copyright 1985-2003 | | By Stichting Mathematisch Centrum and M. Stephenson. | | SLASH'EM and NetHack may be freely redistributed. | | See license for details. | +------------------------------------------------------------------------+ Contents -------- Q. What is SLASH'EM Q. What is SLASH? Q. What is the Wizard Patch? Q. What are the new commands? Q. Where did feature xxx come from? Q. What is SLASH'EM ------------------------ At its very heart and core, it's still good ol' vanilla Nethack, by the illustrious DevTeam (http://www.nethack.org/). The code base from which this was started is SuperLotsaAddedStuffHack (SLASH) 4.1.2E8, ported by Enrico Horn. He took the old SLASH V6 (a variant for Nethack 3.1.3) code by Tom Proudfoot, and ported it to use the Nethack 3.2.2 code. SLASH was probably the most popular variant of Nethack. On top of this is added the Wizard Patch 0.7 by Larry Stewart-Zerba and Warwick Allison (also known for the Qt Nethack port). Enriched with additional tiles by Dirk Schönberger. Knead in Kevin Hugo's Balance Patch. Add half a pound of bugfixes, new spells, tweaked/new special abilities and features as they came to Warren Cheung. Finally, factor in several years worth of development by the Slash'EM dev-team. Q. What is SLASH? ---------------------- SLASH originally by Tom Proudfoot SLASH 4.1.2E8 by Enrico Horn SLASH is Super-Lotso-Added-Stuff-Hack. Pretty much, it's Nethack with more spells, monsters, artifacts, character classes and other added features. Originally by Tom Proudfoot. See Ali's source archive for more details: http://avrc.city.ac.uk/nethack/source.html Q. What is the Wizard Patch? --------------------------------- Wizard Patch 1.0 by Larry Stewart-Zerba and Warwick Allison. The Wizard Patch took the skills system in Nethack 3.2.2 and extended it to include spellcasting abilities. It also added some spells. As a note, Warren chose not to include the decreased power regeneration code. Q. What are the new commands? ---------------------------------- Please consult the guidebook, a copy of which should be included with all distributions. Q. Where did feature xxx come from? ---------------------------------------- Many of the changes from vanilla NetHack are the result of continuing development and improvement of Slash'EM but many others date back to earlier variants and patches. Here is the original documentation of the various bits that went into the original creation of Slash'EM. From SLASHV6 ------------ (Quoted directly from a news post by Tom Proudfoot) The changes from Nethack Plus, except for: * you _can_ wish for artifacts, except there is a chance it doesn't work * the hit point regeneration is completely changed, and is now based on your Con and Max Hp. A side affect of this is a ring/amulet of regeneration is not so easily identified, because it doubles your healing rate, and that may or may not be 1 point/turn. * the magic-weapon-to-hit-a-monster thing is still in there, but significantly toned down * the Doppelganger no longer prompts you "want to change (y/n)?" every couple of dozen turns. This drove me up the wall! If you want to polymorph, use alt-Y and 10 energy. * Warning is now actually useful, instead of annoying. -shopkeepers have extra services -class specials -new character classes About 150 new monsters. Some of the more, um, interesting ones: * rot worm -- Causes sickness, and is a low level monster. Fortunately, it's kinda slow. Unfortunately, it hides under things. * rhambusun -- Has a paralyzation gaze (lasts for only a couple of turns) * pyrolisk -- Has a fire-damage gaze * green slime -- Touch causes you to slowly turn into slime unless you burn it away. The grand ol' list: a: snow ant, yellow jacket, tsetse fly, giant wasp, black wasp, army ant, spitting beetle, assassin bug, killer beetle b: jiggling blob, lava blob, crackling blob, burbling blob c: chickatrice, pyrolisk d: dingo, fox, coyote, pit bull, rabid wolf, hyena, wolverine, shadow wolf, mist wolf, death dog e: glowing eye, flaming sphere, shocking sphere, bloodshot eye, blinking eye, beholder, gas spore f: lynx, panther, werepanther, weretiger, sabre-toothed cat, displacer beast, hellcat, caterwaul, kamadan g: galltrit, jermlaine h: dwarf thief, duergar, master mind flayer, gnoll i: dretch, rutterkin, nupperibo, blood imp, larva j: red jelly, orange jelly, black jelly k: swamp kobold, rock kobold, kobold wizard, kobold warrior, Kroo l: leprechaun wizard, brownie, quickling, pixie n: Aphrodite o: orc, war orc, great orc, Grund, snow orc, demon orc p: glass piercer, roper q: scramper, squealer, mangler, mastodon, Jumbo, juggernaut, catoblepas r: rabbit, black rat, pack rat, rabid rabbit, hellrat, the Rat King s: centipede, recluse spider, barking spider, nickelpede, giant scorpion, Girtab, Shelob, werespider, carrion crawler, phase spider u: nightmare w: maggot, dung worm, acid worm, tunnel worm, rot worm, bloodworm x: arc bug, spark bug, lightning bug y: red light, blue light A: Solar B: rhumbat, athol, hellbat, mongbat, mobat, harpy D: shimmering dragon, silver dragon, wyvern, hydra F: disgusting mold, black mold G: gnome thief, deep gnome, gnome warrior, Ruggo H: storm giant, the Largest Giant I: sneaker, squeaker J: vorpal jabberwock L: arch-lich, Vecna M: troll mummy O: ogre mage, shadow ogre P: moldy pudding, green slime S: king cobra, weresnake, asphynx T: black troll, two-headed troll U: water hulk V: vampire mage W: wight Y: monkey Z: ghoul, ghast ': gargoyle @: mugger, thief, character classes (at all different levels), jackalwere, gibberling, grimlock, drow : shadow &: efreeti, dao, marid ;: shark, giant crab :: gila monster, salamander, rhaumbusun, basilisk, komodo dragon There are new spells for the monsters to cast, and they will use a lot of the new items, so be careful of the original monsters as well! I tried to color the new monsters appropriately, and colored people according to their clothing. There are some duplicated colors, now, though, so be careful. The characters are colored now, according to their preferred dress, so the Tourist is purple, Elf green, Rogue black, Wizard blue, and so on. Call me stupid, but this helps remind me which class I am, since I die so often... Pets only pick up 5 gold pieces out of a pile, and won't pick up a whole bunch of arrows. New terrain types: graves (you can 'r'ead the headstone, or dig it up) toilets (um, you can sit, kick, drink, all sorts of stuff) New artifacts, like the Eye/Hand of Vecna. I wouldn't use either one of these too often, if I were you. There's also Mirrorbright the silver shield, Whisperfeet the speed boots, and Deluder the displacement cloak. Also, a bunch of weapons, which I don't remember too well. Buncha special levels, like the Rat King level, the Kobold King level, Orc level, Giant level, spider level, etc. Some are side-dungeons, others aren't. New rooms, like a Real Zoo (with zoo-like monsters), Leprechaun Throne Room, Giant Throne Room, and stuff like that. Buncha items. I remember these: armor: silver dragon scale mail (reflection) shimmering dragon scale mail (displacement) gauntlets of swimming cloak of poisonousness (don't wear this) lab coat (poison res) asbestos jacket, fire helmet (left over from my Fireman class) kicking boots amulets: regeneration conflict polymorph rings: free action (no paralyzing! cool item!) gain Con/Dex/Wis/Int sleeping potions: full healing invulnerability (for a few turns, anyway) polymorph clairvoyance ESP fire resistance wands: healing fear extra healing create horde (don't use this, unless you're studly) fireball (fortunately, monsters won't zap this one because I couldn't get it to work right) I feel like an idiot. There are certainly more items than these, but I can't remember them. Oh well. Good luck, and try not to get killed by a horde of snow orcs! From the Wizard Patch: (Copied from the Wizard Patch Homepage) -------------------------------------------------------------- * Wizard Patch 0.7 o A read of a spellbook now lasts 5000 turns o A spellbook can now only be read 3 times. o Spell Energy (mana) regeneration has been lowered. o Minor bug fix with spell damage. o Added ifdefs for debugging code. o A binary with Qt NetHack is available on Warwick's home page. * Wizard Patch 0.4 o Wizard's starting weapon is now blessed +1 quarterstaff. o Added spell hit bonus and spell damage bonus, similar to weapon hit and damage bonuses. o Skill gained in a spell class is now based on the level of the spell. o Some minor bug fixes. * Wizard Patch 0.3.1 o The percent success of casting a spell is now based heavily on your skill level, and the level of a spellbook. * Wizard Patch 0.3 o Protection spell added. o Jump spell added. o Minor bug fixes. * Wizard Patch 0.2 o Spell casting now has skills and slots (like weapon skills) o Spell Skill advancement uses nethack 3.2.1 advancement menus. o See below for table of classes, starting and maximum skill level. * Wizard Patch 0.1 the start of it all. Nethack Plus ------------ (from the spoiler file included with the source) -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- SEMI-SPOILER FILE FOR NETHACK PLUS Source & Spoiler by: Stephen White (swhite@cs.mun.ca) Release Date: 06/27/94 Release Version: 1.0 This file contains information on the following topics: (1) CLASSES: Abilities, Intrinsics and Maximum Stats. (2) OBJECTS: New items list. (3) SHOPS: List of "Special Services" and info on Shopkeepers. (4) ARTIFACTS: List of new artifacts and info on how to get them. (5) GENERAL: Anything not covered above. (6) SPECIAL NOTES: Discalmers and information on Patches and Bugs -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- SECTION 1: CLASSES -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- A lot of the classes (new and old) have special abilites as of now, I'll list as many as I can remember: "A" -> Heheh ... when wielding you bullwhip try walking over a trapdoor some time :) That fedora you are wearing .. there's something special about it ... see if you can find out (Hint: Watch your stats) "B" -> This already is a very powerful class! However, you now get the ability to eat rotted corpses with no ill effect. (Note: You are NOT immune to sickness, you can just eat ANYTHING!) "C" -> Nothing too special, JUST infravision! (You'll know what I mean next time you play. "D" -> Well, the ability to polymorph with out risk of level change or system shock is good enough, in addition you get the ability to polymorph at will (costs 10 energy) at level 6. "E" -> Pretty standard really, High Dexterity and Infravision. "F" -> Ability to polymorph into a baby red dragon gained at level 7, at level 15 you can poly into a full red dragon. Baby dragon costs 25 mana, full costs 50. If you wear red dragon scale mail you can polymorph into a full red dragon at level 7 and above for a cost of 35 energy. "H" -> Spell casting suffers if a shield or body armor is worn. "I" -> See "F" except it's a white dragon. "K" -> Can get Excalibur via dipping a long sword into a fountain. (All other lawful classes have a MUCH lower chanch) "L" -> Hehe .. is EVIL! Can eat humans without penelty (actually, it's GOOD to eat them :), ability to poly into a werewolf at level 3. Is immune to other forms of Lycanropy and doesn't randomly change, you must use the CTRL-Y command (costs 10 energy to transform into/out of werewolf form) "M" -> Definatly has the most benifits (and hinderances :). You do 1d3 / 5 levels + 1 / level until 20 damage when not using any weapon (ie, you bare hands), -1 Ac per 2 levels and a chanch of stuning or seriously maiming an opponent with bare hand attacks. Can hit monsters hit only by + level/4 weapons. Hinderances, can not wear body armor or a shield (well, you CAN but it's not recomended ... you bonuses are severly diminished) may not eat ANYTHING he kills, if he uses any form of weapon, he suffers a -4 hit and -2 damage (and gets no bonus) "P" -> What can I say? Their good enough as is :) "R" -> MUCH better chanch of successfully Stealing gold form someone. It's a good idea to wear light (or no) armor while doing so. "S" -> No change. "T" -> Couldn't think of anything ... "V" -> Their good enough already! "W" -> Best spellcasters in the game! See Healer armor restrictions on spell casting. As you may have noticed if you have played the game, the usual stat maximums of 18 have been altered for some classes allowing them to go as high as 21 in one case and as low as 7 in another. Here is a chart containing the information for each class. CLASS: STR: INT: WIS: DEX: CON: CHR: NOTE: Some classes may have "A" 18 19 18 19 17 19 higher maximum averages "B" 20 12 16 18 20 10 than others. This is "C" 20 14 16 18 20 15 done to reduce the power "D" 18/** 18 18 18 18 18 of really powerful "E" 18/50 19 16 21 13 19 classes (Like Barbarian) "F" 15/50 19 17 19 16 18 and to increase weak "H" 14 19 19 19 19 18 ones (Like Healer) "I" 18/50 19 17 19 16 18 "K" 19 17 19 13 18 19 Also, minimum for all classes "L" 20 20 18 18 20 7 are 3 for each stat. "M" 10 20 20 18 20 18 "P" 18/** 17 20 15 18 18 "R" 18/** 17 17 20 17 16 "S" 19 15 15 20 19 15 "T" 18/50 19 19 15 18 19 "V" 20 12 17 16 20 16 "W" 12 20 20 19 16 18 Finally, Intrinsics. Well, their self explanitory so here's the list. CLASS: LEVEL: INTRINSIC GAINED: "A" 1 Stealth 1 Fast 5 See Invisible 10 Searching "B" 1 Poison Resistance 4 Stealth 7 Fast "C" 7 Fast 15 Warning "D" 1 Polymorph 9 Polymorph Control "E" 1 Sleep Resistance 1 See Invisible 1 Searching 7 Fast "F" 1 Fire Resistance 7 Shock Resistance 13 Cold Resistance "H" 1 Poison Resistance 15 Warning "I" 1 Cold Resistance 7 Shock Resistance 13 Fire Resistance "K" 7 Fast "L" 1 Poison Resistance 7 Fast 13 Sleep Resistance "M" 1 Fast 1 Sleep Resistance 1 See Invisible 3 Poison Resistance 5 Stealth 7 Warning 9 Searching 11 Fire Resistance 13 Cold Resistance 15 Shock Resistance 17 Teleport Control "P" 1 Shock Resistance 15 Warning 20 Fire Resistance "R" 1 Stealth 10 Searching "S" 1 Fast 15 Stealth "T" 10 Searching 20 Poison Resistance "V" 1 Cold Resistance 1 Stealth 7 Fast "W" 15 Warning 17 Teleport Control -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- SECTION 2: OBJECTS -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- A list of new items: WEAPONS: silver dagger ------. silver short sword | silver long sword |- Pretty standard really, just new silver weapons. silver mace | silver spear ------' heavy hammer (This one is special, like the runesword ... just for Mjollnir) ARMOR: robe (Yup, just a robe. Wizards can wear this and cast spells) robe of protection (Gives Protection and same AC bonus as Cloak of Prot.) robe of power (Makes spellcasting easier for all classes) robe of weakness (Hehe ... Nasty one :) RINGS: gain constitution (As per ring of gain strength ... only for constitution) TOOLS: magic candle (Doesn't give a wish, but gives infinite light) orb of enchantment (REALLY powerful and rare, enchants weapons. 2-5 charges) orb of charging (Charges things, but can't be charged :) orb of destruction (I'm not going to tell you, Ha!) SPELLBOOKS: resist poison (Temperary imunity to poison) resist sleep (Temperary imunity to sleep) endure heat (Temperary imunity to fire) endure cold (Temperary imunity to cold) insolate (Temperary imunity to electricity) enlighten (As per potion of enlightenment) enchant weapon (Rarely works, and cost A LOT of energy, but sometimes...) enchant armor (Rarely works, and cost A LOT of energy, but sometimes...) WANDS: enlightenment (As per potion of enlightenment) STONES: stone of health (Lets you naturally heal at a faster rate) stone of rotting (Lets you naturally heal at a slower rate) -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- SECTION 3: SHOPS -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- Shops and Shopkeepers: SPECIAL SERVICES: All shops now have "Special Services" avaliable to the kind player who may want to purchase them. I will only give a list of them so you know they are there, I want to leave the actual discovery of them to you :) For starters, to "activate" them simply try to pay for something when you owe nothing (in case you wondering, this is done so you just don't pick up everything in the shop and identify it BEFORE paying for it :) Services: (Varies with shop) Identify, Rustproofing/Enchant Weapons, Rustproofing/Enchant Armor, Charge Wand/Ring/Tool, Poison Weapons, Remove Curse, Apprase (This doesn't work very well) PLEASE NOTE: I didn't write this code, but I can not find the name of person who did anywhere in the source he gave me (It's been about 6 months since I talked to him and I lost his address when my systems mail was purged). However, I have done MAJOR revisions to it in my source to help balance this version, so please refere all question and comments to me. SHOPKEEPERS: A brief note on shopkeepers, they are CONSIDERABLY more powerful now. This was done because of possable shopkeeper abuse due to the "Special Services" they provide. You will now find it nearly impossable to kill these buggers, they are now level 24 rather then level 10, have an 4 attacks per round, are very fast AND immune to sleep, poison and death rays (Ha!) If you can kill one now, you TRULY deserve the abuse you can extract from them :) This power enhancement is also done to ensure fewer pets can kill shopkeeper by themselves. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- SECTION 4: ARTIFACTS -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- New Artifacts: WEAPONS: Serpants Tongue: TYPE: Dagger ALIGN: Chaotic CLASS: Rogue Doomblade: TYPE: Orcish Short Sword ALIGN: Chaotic CLASS: Lycanthrope Elfslayer: TYPE: Orcish Spear ALIGN: Chaotic CLASS: None Disrupter: TYPE: Mace ALIGN: Neutral CLASS: Priest Luckblade: TYPE: Short Sword ALIGN: Neutral CLASS: Tourist Giantkiller: TYPE: Dwarvish Mattock ALIGN: Neutral CLASS: None Skullcrusher TYPE: Club ALIGN: Lawful CLASS: Cave Man Quick Blade TYPE: Elven Short Sword ALIGN: Lawful CLASS: Elf Fire Dagger TYPE: Dagger ALIGN: Lawful CLASS: Healer Holy Sword TYPE: Long Sword ALIGN: Lawful CLASS: None ARMOR: Gauntlets of TYPE: Gauntlets of Dex. ALIGN: Neutral CLASS: Monk Defense QUEST: Medallion of Shifters (Doppelgangers) Candle of Ever Burning (Flame Mage) Storm Whistle (Ice mage) Staff of Withering (Lycanthrope) The Mantle of Knowledge (Monk) Sacrificing for artifacts: This are has been changed to make it harder to obtain artifacts through sacrifice. My reasoning for this is all the people who say "Aww ... Dragonbane! Thats junk! I'll throw that away and wait for something better" or "Hmm ... Magicbane is good for a Wizard, but I'd rather have Mjollnir" Now if you get an artifact, be happy! I mean, think about it ... to get something SO powerful from just sacrificing a newt on level 2 is crazy! The gods don't have an infinite supply of artifacts to throw around, if you are good enough to get one you deserve it but you HAVE to be GOOD enough There's only one Mjollnir, only the mightiest will get it! Ok, here's how it works: If you make a sacrifice and it qualifies to give you an artifact as it used to (ie. high luck, high align) you get 1 point. If that sacrifice just converted an altar, you get 5 points. The same applies to sacrificing a unicorn of an opposing color. You then have a chanch, based on the number of points you have obtained and the number of artifacts in the game, of being granted an artifact. A number from 1 to 100 + 25 per artifact in existance, (ie. no artifacts -> 1 to 100, 1 artifact -> 26 - 125, etc) is compared to your points. If your number is higher than the number picked, you get an artifact! Now, this may seem like a good deal _BUT_ it has a few drawbacks. If you piss your god off, your points are reset to 0. (This of course includes changing alignments) Every 200 moves one point is deducted from your points. In other words, the gods like it when you constantly sacrifice ... not just a sacrifice now and then. So there you have it! Simple isn't it? Mind you, this is about the only way to get artifacts in the game at present. There are four others: (1) Find them. (Yes, it DOES happen :) (2) Become the Hand/Envoy/Soul Taker (or #dip for Excalibur) (3) Kill something that has one (like an Archon) (4) Wish for them (However, most generaly powerful ones have been disabled, such as Vorpal Blade, Stormbringer. But "minor" ones such as Dragonbane or Ogresmasher are still avaliable via wish) -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- SECTION 5: GENERAL -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- (1) Spells and Spellcasting: I have totally overhalled the spellcasting system, certain classes are better than others and use different stats in determining sucess (ie. Wizard uses INT, Priest uses WIS). Instead of a flat success or fail, there is now a percent chanch of casting a spell based on class, level, spell level and for some classes armor worn. (2) Magical Creatures: Certain creatures can only be hit by magic weapons (or spells) of various power. Simallarly, some powerful creatures strike as if they had magical weapons of various power. Ex: Unicorns are now +2 or better to hit, and stike as if they had a +1 weapon. Another "common" monster hit only by +2 or better weapon is the Ghost (3) Monster Improvements: Powerfull monsters are now harded to kill, including Shopkeepers. Some important monster may be immune to Wands of Death (new monster intrinsic, no Mr. Barbarian you CAN'T get it by eating him! :) ... players arn't the ONLY all-powerful force in THIS dungeon! (4) Two New Commands: There are two new commands avaliable in the game now, Steal (CRTL-B) and Polymorph (CTRL-Y). Anybody can attemp to steal, but the chanchs of a non-Rogue succeding is very low. Only four classes can attempt to Polymorph: Doppelgangers (of course!), Flame Mages, Ice Mages and Lycanthropes (Duh!) (5) XP and Levels: There has been a drastic change in the ammount of experence you need to gain a level, you now need a lot more. Many people have asked "Why so much? It's TOO hard!", the answer is simple: Power. There are two main reasons this was done: (A) To offset the powerful affects gain at the higher levels, like with Barbarians with a 20 con ... they could have ~50 HP at level 4! So I made advancement slower to curb the rate of power increase, you will still have ~50 HP at level four, but it will take a long time to get there. (B) You will now appriciate gaining a level, rather than "Oh, great. Level 7" it will be "YESSSS! I finally made Level 6 and it only took me three days, that must be a new record!" ... (Well, maybe not THAT bad :) -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- SECTION 6: SPECIAL NOTES -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- The Patch fo the "Special Services" has been included in this version but has been drastically altared. If the author is out there reading this, please contact me. Also the Patch for the "Black Market" has been INCLUDED but not enabled in both the source and the executable. It turns out that it's a weee bit too buggy (Well, anything that has even ONE bug is too buggy. But thats another topic all together) to be used in my version. Again, if the author is out there please contact me. There is (as far as my vast knowledge can see) only ONE bug contained within the source code. It have to do with dwarves with pick-axes not being restored properly, you will run into this problem. Just ignore it, the game will tell you the program is in disorder any perhapes you should quit but you don't need to as the problem is very minor and will have no effect on the outcome of the game. If anyone knows what might cause this, PLEASE let me know DISCLAMER: I am NOT responsable for any damages this program may cause on you computer, socal life, job or sanity. It is mostly bug free and shouldn't have any major problems, however if you descover what you think may be a bug, please report it to me, Stephen White (swhite@cs.mun.ca). -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- Tsanth's Modifications ---------------------- .\APPLY.C Lines 2075-2077 Added code to support CONTAINER(silver wallet). Bounded by "# ifdef WALLET_O_P". Lines 2128-2132 Added code to handle WEPTOOL(spoon). Bounded by "# ifdef P_SPOON". .\ARTIFACT.C - WAC not added. Undergoing modification Lines 1043-1051 Added code to make the chance to behead with the Vorpal Blade increase with your level. (The Vorpal Blade gets more user-friendly when used by more experienced adventurers. ;) Bounded by "# ifdef TSANTH". ..\INCLUDE\ARTILIST.H Lines 243-250 Added Wallet of Perseus From the mythology - Perseus, when sent to kill Medusa, was given a silver wallet that could hold anything put into it; I've modified it somewhat, to be able to hold anything, multiplying by 4 the weight of everything in it if cursed, reducing by 1/8 the weight of everything in it if uncursed, and _negating_ the weight of everything put into it if blessed. Bounded by "# ifdef WALLET_O_P". .\CMD.C Lines 119-123 Added prototypes for wiz_gain_ac(), wiz_gain_level(), and wiz_toggle_invulnerability(). Bounded by /* xxx TSANTH'S CODE */ Lines 790-828 Added code to allow wizard mode users to increase their AC. Bounded by /* xxx TSANTH'S CODE */ Lines 1360-1362 Added code to handle the control-sequence for increasing AC in wizard mode. (Ctrl-A) Bounded by /* xxx TSANTH'S CODE */ Lines 1371-1373 Added code to handle the control-sequence for toggling invulnerability in wizard mode. (Ctrl-N) Bounded by /* xxx TSANTH'S CODE */ .\DOTHROW.C /* WAC */ Lines 768-773 destroy spoon after hit. ..\INCLUDE\CONFIG.H Lines 478-482 Added #define's for various mods. .\ENGRAVE.C Lines 31-47 Added several quotes, just for fun. .\MAKEFILE Line 120 Added a line to support 4DOS I had some minor trouble compiling SLASH (the levels would not compile correctly with and without DLB enabled), due to 4DOS's DIR; it lists two columns of data, unless you add the /z switch. So I added it. Unbounded ..\DAT\MEDUSA.DES Line 59 Added code to support Wallet of Perseus, no comments. .\MKOBJ.C Lines 775-795 Added code to support Wallet of Perseus, comments. Bounded by "# ifdef WALLET_O_P". .\OBJECTS.C Lines 186-194, 208-211 Added WEAPON(dimsaber). Bounded by "# ifdef D_SABER". Lines 668-673 Added CONTAINER(silver wallet) to support Wallet of Perseus, no comments. Bounded by "# ifdef WALLET_O_P". Line 674 Made CONTAINER(sack) probability == 40. To fix the 1005% over problem. Lines 753-762 Added WEPTOOL(spoon). (In homage to Final Fantasy 2.) Bounded by "# ifdef P_SPOON". .\PICKUP.C - WAC Lines 45-48 Weight correction calculation Lines 806-812 Added weight correction for WALLET OF P Lines 837-843 Added weight correction for WALLET OF P ..\WIN\SHARE\OBJECTS.TXT Lines 891-909 Edited tile for WEAPON(lightsaber); I made it green. (Tile 46) Lines 910-928 Added tile for WEAPON(dimsaber). (Tile 46) Lines 929-947 Edited tile for WEAPON(darksaber); I made it red. (Tile 47) Lines 4273-4291 Added tile for CONTAINER(silver wallet). (Tile 222) Lines 5223-5241 Added tile for WEPTOOL(spoon). (Tile 271) .\OBJNAM.C Lines 2032-2034, 2037-2039 Added code to allow wishing for unique monster tins in wizard mode. Bounded by "# ifdef WIZARD". Lines 2044-2046, 2049-2051 Added code to allow wishing for unique monster corpses in wizard mode. Bounded by "# ifdef WIZARD". Lines 2062-2064, 2067-2069 Added code to allow wishing for unique monster figurines in wizard mode. Bounded by "# ifdef WIZARD". ..\INCLUDE\PATCHLEV.H Line 42 Changed VERSION_COMPATIBILITY to 0x0000020AL (was previously 0x00000209L). .\TELEPORT.C Lines 145-147, 154-156, 164-166, 172-174, 309-311, 313-315, 601-604, 608-610, 615-617, 619-621 Added code to handle teleportation in wizard (debug) mode; you should now be able to teleport anywhere, anywhen, provided you're in wizard mode. Bounded by "# ifdef WIZARD". ..\WIN\SHARE\TILEMAP.C Lines 75-83 Added conditional statements to support WEAPON(dimsaber). Bounded by "# ifndef D_SABER". Added conditional statements to support CONTAINER(silver wallet). Bounded by "# ifndef WALLET_O_P". Added conditional statements to support WEPTOOL(spoon). Bounded by "# ifndef P_SPOON". .\UHITM.C Lines 519-525 Added code to make WEPTOOL(spoon) "flash brightly" when hitting any monster. Bounded by "# ifdef P_SPOON". .\WEAPON.C Lines 171-174 Added code to handle WEPTOOL(spoon) damage; it does 9999 damage. Bounded by "# ifdef P_SPOON". Lines 1063-1065 Added code to make throwing WEPTOOL(spoon) count toward DART skills. Bounded by "# ifdef P_SPOON". .\WEILD.C Lines 202-210 Added code to support WEAPON(dimsaber). Bounded by "# ifdef D_SABER". ..\WIN\TTY\WINTTY.C - WAC removed Lines 306-309 Added text to the opening screen. Bounded by "# ifdef TSANTH". ..\DAT\WIZHELP Line 3 Added text to the wizard-mode help screen. Unbounded Line 9 Added text to the wizard-mode help screen. Unbounded Additions from Kevin Hugo's Balance Patch ----------------------------------------- New Objects ~~~~~~~~~~~ amulet of flying [tile from removed amulet] (instead of amulet of free action, which is a ring again) Worn: You can fly at will. Eaten: No effect. Coded and tested. amulet of unchanging [tile from removed amulet] Worn or eaten: You won't change into the form of another creature, whether accidentally, intentionally, or periodically. This includes polymorph traps and rays, the polymorph intrinsic, lycanthropy (were-creatures), turning to slime, becoming a "new man", or returning to your normal form. If you were polymorphed, you stay polymorphed and will permanently die when you lose all hit points. Lycanthropy may be purified, but you will remain in creature form. However, you can turn into another material; namely, turning to stone, mimicing gold, or conversion/destruction as a golem. It also does *not* stop the sliming process once it has started. Note: Magic resistance and/or polymorph control sometimes serve the same purpose. You have to be a metallivore (xorn would be best) to eat it. Then you would be stuck in that form, which probably isn't a good idea. ? Should the Doppleganager's quest artifact be this type of amulet? Fully coded but partially tested. amulet versus stone [tile from removed amulet] Worn: You are resistant to turning to stone. ? Each time you are stoned, the blessing changes from blessed -> uncursed -> cursed -> turns to dust. The stoning process stops if it has started. Eaten: Stops a stoning process which has already started. Coded and tested. kiwifruit [standin from asian pear] (Intended for starting inventory of new Zoutherner class) Same cost ($7), weight (2), and nutrition (50) as an apple. Random probability 3/1000. Coded and tested. eucalyptus leaf [standin from sprig of wolfsbane] (Intended for starting inventory of new Zoutherner class) Cost $6, weight 1, nutrition 30, random probability 4. Cures food poisoning, sickness, and nausea. Koalas (a future creature) will only be able to eat this food. Coded and tested. You can even wish for them in plural! scroll of earth [standin from another scroll] (Derived from an idea by Virtanen ) Blessed: Drops one rock on your head. Uncursed: Drops 2 to 6 rocks on your head. Cursed: Drops a boulder on your head. Confused: Drops the objects as above on the 8 surrounding squares instead of on you. Note: No effect on the Rogue level or in the endgame (except Plane of Earth). The objects aren't dropped where the terrain won't permit it (e.g., no objects will be stuck in walls). Amorphous, unsolid, and wall-passing monsters are undamaged. Cost $200, random probability 15/1000, marker charges 8. Coded and tested. potion of acid [tile from removed potion] If acid-resistant, "This tastes sour." (non-hallucinating) "This tastes tangy." (hallucinating) Blessed: d4 damage and abuse constitution if not acid-resistant. "This burns a little!" Uncursed: d8 damage and abuse constitution if not acid-resistant. "This burns!" Cursed: 2d8 damage and abuse constitution if not acid-resistant. "This burns a lot!" Hits monster: Same damage as above. Vapors: Abuse constitution. Can be quaffed by players and monsters to stop the stoning process. Thrown by monsters as an attack. Cancels to water. # Dip: Non-blessed removes erosionproofing. Explodes with d10 damage when dipped into any water or mixed with other potions. Cost $250, probability 20/1000. Coded and tested. ring of sustain ability [tile from removed ring] Worn: Your statistics (Str, Con, Dex, ...) will neither increase nor decrease (e.g., by attack, poison, gain ability, or restore ability). The adjustments are lost forever, and they don't appear after you remove the ring. Does not affect changes due to worn items (e.g., ring of adornment, gauntlets of power). Eaten: No effect. (Would be too powerful late in the game.) Sink message: "The water flow seems fixed." Notes: You can still accumulate exercise and abuse, although it won't result in changes in your attributes while the ring is worn. # You are not protected from other attack effects such as mind flayer amnesia or instant-kill poison. Cost $100. Fully coded but partially tested. saddle (tool) [no tile] Can be found randomly and in pet stores. You can ride certain pets. Try the following: Apply a saddle to various monsters. Kick or whip your steed. Try the above at various experience levels and monster tameness. Try getting on when polymorphed or impaired. Move around while riding. Try picking up or manipulating objects in the floor. Polymorph yourself (or your steed). Climb or descend stairs. Generate a bones file. # You are considered flying when you ride a flying monster. Dismount by applying the saddle. Partially coded and tested. I don't think there are any game- stopping bugs, but there are several known inconsistencies: Your steed does not yet attack or get attacked. ? Use your steed to carry things as a pack animal? Although I have attempted to compensate for the speed of the saddled pet, it is far from perfect. To do an adequate job, I would have to completely rehaul NetHack's speed system. Traps, pools, and wounded legs are not properly handled. More inconsistencies as they are discovered. Conditionally coded by #ifdef YEOMAN, which is commented out be default. You may experiment with it if you like, but the game should be distributed with it commented out for now. In the future, Knights and Yeomen will start with a pony, a saddle, 10+ apples, and 10+ carrots. fishing pole (weapon-tool in polearm category) [standin from pickax] (Idea by StarChaser) When you apply any polearm, You can't use apply a polearm if swallowed. You try to wield the polearm. If you can't, no further effect. You are asked to select a square within a 3 square radius. You have to see the spot (hence no barriers permitted). There is a 1/6 chance of each of the following: 1. If using a fishing pole, you hook yourself with 10+d10 damage. 2. If using a fishing pole to attack a monster in water, you reel it in adjacent to you. 3. If you are using a fishing pole and there is an object on the floor of that spot, you snag the topmost object. 4. If using a fishing pole in water, you snag a low boot. # (Only occurs once per game.) 5. If using a fishing pole in water, you snag a cram ration. 6. Untraps (not yet implemented because the untrap code currently assumes you're on or adjacent to the trap). If the action selected above does not apply, but there is a monster on the square, it is attacked. Otherwise, nothing happens. Coded and tested. healthstone [tile from removed stone of health] (Replaces stones of health and rotting) Each stone in your main inventory adds a bonus (+2 blessed, +1 uncursed, -2 cursed) to the experience level and constitution used in determining your healing rate. In no case will the effective experience level or constitution exceed their natural ranges. Regeneration is still a better effect. Same cost ($60), weight (10), and probability (10/1000) as a luckstone. Always generated cursed; a target for uncursed scrolls of remove curse. Coded and tested. Deleted objects ~~~~~~~~~~~~~~~ These following objects each convey a property that is obtainable in another way. This reduces the chance of getting a useful item in the same item class, and none of these contribute _new_ ways to solve situations. They have been eliminated for the balance patch. amulet of conflict amulet of polymorph amulet of regeneration asbestos jacket fire helmet scroll of trap detection potion of fire resistance I see little use for pan pipes. Although some of them generate monsters which could be helpful for sacrificing, the probability of other methods (bags of tricks, wands of create monster) have been reduced. In the balance patch, pan pipes have been eliminated and the probability of the other methods have been restored. pan pipe pan pipe of summoning pan pipe of the sewers These new orbs make crystal balls more difficult to identify (they're already not very useful), and I consider them a potential source of charging/polypiling abuse. Apparently they make up for the lower probabilities and chance of success of their respective scrolls. Why not just keep the old scroll mechanism, which seemed to work well? orb of charging orb of destruction orb of enchantment The following items now exist in a different form. See above. cloak of drain resistance ring of drain resistance stone of health stone of rotting Internal changes ~~~~~~~~~~~~~~~~ Mixed case is now supported for the automatically-generated file names (i.e., you can use "Slash-EM", "SLASH-EM", or "slash-em"). See patchlevel.h, makedefs.c, and file.h. Added "skills.h" and moved code into it. Zero is used to represent no skill; positive numbers represents wielded items, launchers, and spells; negative numbers are used for ammunition and projectiles. Note that weapon_type() converts negative skill numbers into positive ones, and spell_skilltype() never returns a negative skill. Skills are now embedded in the object table, using the oc_subtyp field. The field size was increased to an schar. This also makes the order of items (esp. weapons) in the object table less critical. Updated the following macros to reflect the above changes: is_sword() is_blade() is_weptool() Added new macros: is_pole() is_spear() is_launcher() is_ammo() is_missile() is_multigen() is_poisonable() is_weptool() is_pick() ammo_and_launcher() Incorporated these macros into the code as an alternative to the WEP_ and WP_ constants. Fixed some prototypes and invalid string constants. Consolidated all worn and intrinsic bits to obj.h, and rewrote them in hexadecimal for readability. We have now exhausted all 32 bits. Needed to move blkmar_guards() within shk.c so it will compile for older 68k Macintoshes. Repaired two bugs from NetHack. If you carry nothing but gold, are stressed, and fall into water, the game will no longer crash with a divide-by-zero bug. A line in uhitm.c, steal_it() had read mdef->misc_worn_check &= !otmp->owornmask; and now reads mdef->misc_worn_check &= ~otmp->owornmask; The Macintosh distribution is built with a fat binary. This means it will run on both 68k and PowerPC machines. Other changes ~~~~~~~~~~~~~ Entrance to Gnomish Mines moved to levels 2-4 (same as NetHack). # You once again have 7 chances to start your quest, not one. The Silver Wallet of Perseus now has an 85% chance of appearing in either variation of Medusa's isle. It used to only appear in one of the variations. Chance of generating a bones level increases with dungeon depth (same as NetHack), not decreases. No bones levels at depth 1 to 3. You are once again asked if you want to create bones files in debug mode (you couldn't make any at all, which made testing difficult). If "your pack shakes violently" while stepping on a magic trap, some of your inventory letters are jumbled. Totally harmless to the character, yet deliciously evil. (Idea by Wolfgang von Hansen ) # If fixed inventory letters are set, you instead get 2 hp damage for each item that would have been jumbled. # The number of experience points needed for each level, and the level required to start the quest (*), has been adjusted again: LEV NETHACK SLASH BALANCE : LEV NETHACK SLASH BALANCE ~~~ ~~~~~~~ ~~~~~~ ~~~~~~~ : ~~~ ~~~~~~~~~~~ ~~~~~~~~~ ~~~~~~~ 1 0 0 0 : 16 320 000 31 000 300 000 2 20 50 40 : 17 640 000 38 500 350 000 3 40 100 80 : 18 1 280 000 48 000 400 000 4 80 200 160 : 19 2 560 000 60 000 450 000 5 160 500 320 : 20 5 120 000 76 000 500 000 6 320 1 000* 640 : 21 10 000 000 97 000 550 000 7 640 1 750 1 280 : 22 20 000 000 125 000 600 000 8 1 280 2 750 2 560 : 23 30 000 000 163 000 650 000 9 2 560 4 250 5 120 : 24 40 000 000 213 000 700 000 10 5 120 6 250 10 000*: 25 50 000 000 279 000 750 000 11 10 000 8 750 20 000 : 26 60 000 000 365 000 800 000 12 20 000 11 750 40 000 : 27 70 000 000 476 000 850 000 13 40 000 15 500 80 000 : 28 80 000 000 617 000 900 000 14 80 000* 20 000 150 000 : 29 90 000 000 798 000 950 000 15 160 000 25 000 250 000 : 30 100 000 000 1 034 000 1 000 000 Hit-point healing algorithm now the same as NetHack's, with addition of healthstones and a healing limit of 15: LEVEL TURNS HEAL RANGE : LEVEL TURNS HEAL RANGE ~~~~~ ~~~~~ ~~~~~~~~~~ : ~~~~~ ~~~~~ ~~~~~~~~~~ POLY 20 1 : 13 3 1 to 4 1 15 1 : 14 3 1 to 5 2 11 1 : 15 3 1 to 6 3 9 1 : 16 3 1 to 7 4 8 1 : 17 3 1 to 8 5 7 1 : 18 3 1 to 9 6 6 1 : 19 3 1 to 10 7 5 1 : 20 3 1 to 11 8 5 1 : 21 3 1 to 12 9 4 1 : 22 3 1 to 13 10 3 1 : 23 3 1 to 14 11 3 1 to 2 : 24+ 3 1 to 15 12 3 1 to 3 : Your healing rate depends upons your experience LEVEL, plus any bonuses/penalties due to healthstones in your main inventory. The POLY rate applies if you are polymorphed into another creature or if your effective level is less than one. You regain your hit points once every given number of TURNS, or every turn if you have regeneration. However, you don't heal if you are stressed or worse, don't have regeneration, and try to move that turn. The amount of healing is a random number between 1 and (effective constitution - 12); this value is adjusted so that it falls within the HEAL RANGE for your effective level. You won't heal beyond your maximum number of hit points. Many changes to the cost, probability, armor bonus, and marker charges of many items. Many have been restored to the values found in vanilla NetHack. Some points of interest: Polearms are about 1/3 as likely. Ammunition is more likely. This works well with Warren's improvements to ammunition. Magical armor was very rare and gave no AC bonus. Restored. Containers and unlocking tools are more common. Musical instruments are now very rare. (Note: Soldiers often carry bugles anyways.) Tin openers are less common. Scrolls (especially enchant ___) were too expensive. Restored. Potions were too cheap. Restored. The most useful spells are now the most common books. Amulets are no longer randomly generated on the main dungeon floor, although their probability in boxes and Gehennom are increased. # Note that they will still be found in shops, boxes, chests, monster starting inventories, and preplaced locations -- just not on the floor before Gehennom. Their effects generally do not overlap with other worn objects. This means that some of the rarer intrinsics won't appear until later in the game. # Free action is once again (only) a ring, since it is most useful earlier in the game. Eating it conveys only sleep resistance. # You cannot get drain resistance by eating its amulet. Polearms can be applied to attack within a 3-square radius. Monsters do not yet take advantage of this feature. You can no longer apply a bullwhip at an incubus/succubus to make it your pet. This variant code didn't allocate memory for the pet information, which will eventually crash the program. Since there is no easy fix for this "feature", it was simply eliminated. # A dwarvish mattock can be used to dig, by players and monsters. Shopkeepers also recognize them as picks. Talking artifacts (e.g., Magic Mirror of Merlin) are finally implemented. Robes are the preferred dress of the clergy. They are not generated randomly, but priest(esse)s are found wearing them (they used to wear cloaks instead). Lab coat gives _both_ poison and acid resistance. (Idea by Manzilla ) # Note that yellow dragon armor still gives a better AC, but NOT acid resistance. Yellow dragon corpses are still acidic, but do NOT grant acid resistance. The player must make the critical decision between better AC or getting an intrinsic. # The extremely unpopular effect of getting temporary intrinsics from corpses is discontinued; all effects are permanent. Although several alternatives were proposed, this solution is least likely to lead to arguments or misunderstandings by players. Eating a non-cursed, non-rustproof trident is "pure chewing satisfaction" (idea from "Tommy the Terrorist") and exercises wisdom. Eating a non-cursed flint stone is "Yabba-dabba delicious" and exercises constitution. # Scrolls of enchant armor/weapon have the same success rate as in vanilla NetHack. To offset this, there will be a new disenchantment attack; it is not yet implemented and will only be used by monsters generated only in Gehennom (see below). Engraving with a wand of enlightenment now zaps the wand, as expected. Zapping yourself with wands of invisibility and speed monster behave as in vanilla NetHack. Invisibility is temporary if not yet invisible, or permanent if you already are. Speed monster is permanent, but note that it does not convey "very fast". Unlocking tools no longer break in locks when they are blessed or are any artifact. Dipping a tool in a potion of gain level upgrades it to another tool: OLD NEW ~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ sack bag of holding (20%) or oilskin sack (80%) oilskin sack bag of holding bag of holding oilskin sack blindfold towel towel blindfold lock pick, credit card skeleton key skeleton key lock pick tallow candle wax candle wax candle tallow candle oil lamp brass lantern brass lantern oil lamp tin whistle magic whistle magic whistle tin whistle wooden flute magic flute magic flute wooden flute tooled horn fire/frost horn, horn of plenty (equal chances) other horns tooled horn wooden harp magic harp magic harp wooden harp leash saddle saddle leash tin opener tinning kit tinning kit tin opener crystal ball magic marker magic marker crystal ball (Based on an idea by Dylan O'Donnell ) # Note that gain level is now the only potion that causes these transformations, and the transformations work both ways. Some classes (mostly BCVS) had significantly reduced chances of using magic items such as scrolls, spellbooks, potions, and wands. This penalized the classes that newer players are likely to play (BVS). Caveman (a moderately difficult class) is now the only class restricted from using magic items, and all classes can quaff potions. Of course, players can still voluntarily place their own restrictions on their play. Statistic maxima for all classes are now no less than 18 strength, 12 intelligence and wisdom, 18 dexterity and constitution, and 12 charisma. New intrinsics include unchanging and fixed abilities. Flying, stone resistance, and acid resistance previously existed for some polymorph forms and are now a full intrinsic. Pets now pick up 10 times their level in gold, not just simply $5. Tsetse flies changed from level 1 to level 3, so they appear later. There are no new attacks or monsters. However, some will be added in the future Zoutherner class. True rumors: A life saver is not the fresh maker. As Crom is my witness, I'll never go hungry again! # The pen is mightier than the sword. False rumor: They say that archeologists find more bones piles. slashem-0.0.7E7F3/history.txt0000664000076400007640000060002310545462317014117 0ustar aliali+------------------------------------------------------------------------+ | HISTORY.TXT | +------------------------------------------------------------------------+ | SLASH'EM ver 0.0.7 | | Super Lotsa Added Stuff Hack - Extended Magic | | A Nethack Variant | | Courtesy of the Slash'EM development team with the efforts and support | | of countless others, especially the slashem-devel mailing list. | | (1997-2004)| +------------------------------------------------------------------------+ | Nethack is Copyright 1985-2003 | | By Stichting Mathematisch Centrum and M. Stephenson. | | SLASH'EM and NetHack may be freely redistributed. | | See license for details. | +------------------------------------------------------------------------+ +-------+ | Index | +-------+ 1 - Yesterday's News 2 - Warren's storytime 3 - Warren's doomed agenda 3.1 The Messy TODO/TOFIX List 3.2 What's NEW 3.3 Other Ideas +-----------------------------+ | Section 1: Yesterday's News | +-----------------------------+ ver 0.0.7E7F2 [December 4/2005] [Released by Ali] -fixed bug 1232707: engraving with lightsabers -fixed bug 1237780: gtk window port fails to build with gcc-4.0 -fixed bug 1239041: engrave dialog doesn't show lightsabers -fixed bug 1231766: Food shown in Medical Kits -fixed bug 1238060: grammatical error when burning through a door (Benjamin Schieder) -fixed bug 1104713: Pet and Frozen food stores can charge -fixed bug 988827: Monster wearing CoI left invisible corpse -fixed bug 934078: Mold "wiggle" out of bag -fixed bug 933587: One-Eyed Sam referred to as "it" -fixed bug 1240794: Pets don't grow up properly -fixed bug 1240799: Steed ridden onto poly trap polymorphs permanently -fixed bug 1243904: chameleon as statue trap -fixed bug 1223226: Some creatures are missing horns -fixed bug 1223222: Female Bulls?? -fixed bug 1244470: shopkeeper don't have shotgun -fixed bug 215062: no black color Extends videocolors option, see Guidebook for details. -fixed bug 1244468: different spitting venom when polymorph -fixed bug 1179557: Found egg marked (laid by you) -fixed bug 1206099: Torches are not extinguished with rust traps -fixed bug 1294907: 'Raise Zombies' technique cannot raise dwarf zombies! (Xeno) -fixed bug 1355972: Monsters Don't gain Drain resistance due to worn items! (Xeno) ver 0.0.7E7F1 [July 2/2005] [Released by Ali] -fixed bug 1155634: charm spell or command undead spell invoke genocide -fixed incorrect #ifdef resulting in compilation failure on ANSI only DOS builds -fixed bug 1193070: Engraving with a wand of draining keeps illiterate conduct (Nico Kist) -fixed bug 924811: Fire vampires leave corpses -fixed bug 1028948: casting stone to flesh on a gargoyle -fixed bug 1213881: Lieutenants lack Firearms -fixed bug 1212903: Int and Wis stats not correct (in obscure case) -fixed bug 1175912: Deity-gifted pets should not attack like aligned unicorns (Nico Kist) -fixed bug 1205563: suppress_alert still says NetHack -fixed bug 1157414: Do not "loose" faith -fixed bug 1197822: necromancer zombie's hp -fixed bug 1185759: Shopkeeper "looks at corpse" through wall ver 0.0.7E7 [February 19/2005] [Released by Ali] -Fixed build of proxy tests -fixed bug 1071688: cannot compile on FreeBSD (termcap) -fixed bug 1071623: Cannot compile on FreeBSD due to menucolor inclusion -fixed bug 993420: Crashes when typing symbols on drop menu -fixed bug 1087609: Some platforms fails to compile win/proxy/nhext.c -fixed bug 1084366: ghoul queen don't has M2_FEMALE -fixed bug 1066530: Fired/thrown items get new inventory letter when retrieved -fixed bug 992244: Alt Gr key doesn't work -fixed bug 1076125: Unsuccessful use of medical kits -fixed bug 1076123: Vampires can eat white pills -fixed bug 994993: when polying, you take off T-shirt after scales merge -fixed bug 961914: Deep dragons should resist their own breath -fixed bug 963344: Stat exercise effects calculated while polymorphed -fixed bug 1097792: Duplicate message when hit by sleep gaze -fixed bug 1065927: Should bars stop bullets? -fixed bug 947009: Scroll of taming exercises skill in healing spells -fixed bug 1077355: game crashes with: "panic monsndx - could not index monster" -fixed bug 1098686: Restoring a mounted character wielding Sting can fail -fixed bug 1105100: Escaping from pits by polymorphing into a mind flayer -fixed bug 1107123: GTK Accepts any keypress as the default response to question -fixed bug 1110081: in_container() uses obj->quan after deallocatin obj -fixed bug 1116877: Dereferencing freed memory when applying bags which explode -fixed bug 951483: Wands of cancellation can be held in a bag of holding ver 0.0.7E6F3 [November 13/2004] [Released by Ali] -fixed bug 923003: Invisible mirrors can be applied -fixed bug 916544: Wrong weight of corpses on Nightmare level -fixed bug 947369: Crash when multiple wands explode -fixed bug 950120: crash when wishing for Wallet of Perseus -fixed bug 933365: wand of draining does not interrupt ctrl-run -fixed bug 933379: weird behaviour with polyself into monsters like migo drone -fixed bug 929546: Flaming spheres won't attack acid blobs -fixed bug 951991: Reading spellbooks not safe for wizards -fixed bug 914894: "Beautiful" gnome thief seduced female character -fixed bug 918178: Double message "You are suddenly very hot/cold!" -fixed bug 921810: Invisible books can be read (?!) -fixed bug 934076: Dipping amnesia into amnesia gives water -fixed bug 946306: do_look: bad glyph 3726 at (7, 16) -fixed bug 929220: Prayer and chi healing -fixed bug 946157: Water elementals created over lava on Flame mage quest -fixed bug 946161: Bad message when two-weaponing against a rust monster -fixed bug 946566: Partly eaten more nutritious while raising drained corpses -fixed bug 946984: arch-liches are not MR_HITAS* -fixed bug 949016: Draining a rotten corpse -fixed bug 951439: Invisible Corpses and Ressurection -fixed bug 941453: Grand slam against monsters needing +n weapons -fixed bug 962515: Disarming fire trap doesn't use up water -fixed bug 1001167: Is this a Gray Stone bug? -fixed bug 992247: wolfname & ghoulname in default.nh doesn't work -fixed bug 931679: Space Bar not working as rest -fixed bug 912588: Molds stagger from your powerful strike -fixed bug 962574: Display bug when setting OPTIONS=tiles:Small tiles -fixed bug 1011313: SEGV using technique "raise zombies" -fixed bug 1018229: impossible splitbill: no resident shopkeeper?? -fixed bug 1018447: Game crash when Hero with ball displace displacer beast -fixed bug 1020983: Typo in doc/sources.txt (cloack) -fixed bug 956891: Breeders are explosive -fixed bug 1007127: diluted potion of water -fixed bug 1010421: Thiefbane drains your levels even if you aren't hit -fixed bug 976157: Dipping into !oAmnesia didn't use up potion -fixed bug 982331: Can't name Cursed scrolls of teleport after reading them -fixed some theoretical bugs thrown up by valgrind -fixed bug 980258: Guidebook doesn't describe showdmg option accurately (Andy Ruse) -fixed bug 926202: Gnome thieves don't eat (Andy Ruse) -fixed bug 926200: Dwarf thieves have M2_NOPOLY (Andy Ruse) -fixed bug 962568: Mjollnir can't be thrown - code comment incorrect (Andy Ruse) -fixed bug 1005587: Beholder killed by "it's" own gaze (Andy Ruse) -fixed bug 1022460: [C343-8] The plural of Nazgul is Nazgul (Andy Ruse) -fixed bug 1039689: malloc_consolidate hang after using cursed bag of holding -fixed bug 1028955: Surgery technique doesn't work with polymorph -fixed bug 1035356: God gave Deathsword to "human" character -fixed bug 1024200: Problems about Thiefbane -fixed bug 1024202: Dipping a loadstone into a potion of amnesia -fixed bug 1038151: Power surge becomes permanent if lost -fixed bug 1025486: Pets can't follow lvl telep from Blk Mkt -fixed bug 1029750: Lycanthropes and eating wolfsbane while polymorphed -fixed bug 1030725: Doppelganger liquid leap does not release from chain -fixed bug 1032419: Eviscerate tech should not work while wearing gloves -fixed bug 1055724: Raise Zombies gives tame troll -fixed bug 1020980: Objects are forgotten when you search blind -fixed bug 954414: pickup_thrown option includes some non-throw weapons -fixed bug 937239: Wrong cause of death from exploding wands -fixed bug 962572: Inventory item prints to console instead of chat buffer -fixed bug 936167: Started with empty medical kit (Pasi Kallinen) -fixed bug 934077: Wrote an invisible scroll (Pasi Kallinen) -fixed bug 1015079: Spurious "it snatches the boulder" message (Pasi Kallinen) -fixed bug 1062624: GTK Interface is not resizable -fixed bug 931684: Inventory window behaving strangely ver 0.0.7E6F2 [May 3/2004] [Released by Ali] -fixed bug 910334: Vampire blood and foodless conduct -fixed bug 924384: Inconsistency with shoggoth corroding items -Macintosh: Include fix-level in about-box version -fixed bug 924277: Monsters can retaliate against themselves -fixed bug 925892: Vampire corpse on early bones level -fixed bug 922320: Grenade thrown by soldier angered monster -fixed bug 929873: Crash while reading spellbook off floor -fixed bug 932788: Permanent inventory window not updated immediately -fixed bug 932791: Permanent inventory window not closed immediately -fixed bug 932800: [GTK] Changing hilite_pet from "more options" not immed. -fixed bug 932801: [GTK] Changing hilite_pet from options not immed. honoured -fixed bug 932816: Disabled radar window appears (but isn't updated) on startup -fixed bug 932818: [GTK] Can't close main window before starting game -fixed bug 932827: [win32] Session windows slowly creep right and down -fixed bug 932832: [GTK] Can't cancel at "Who are you?" prompt -fixed bug 932905: [GTK] Apparently random crashes -NhExt: Added support for authentication (eg., for dgamelaunch) -fixed bug 938859: Rate of fire affected by non-launcher weapon -fixed bug 929876: Monsters can pass between Sokoban bars -fixed bug 934073: Spurious "don't seem to harm" messages for Drow -fixed bug 926829: Vampires "don't seem to harm" when draining levels -fixed bug 939133: dmonsfree error after exploding /WoPoly -fixed bug 911485: Monk techniques and vampire lords -fixed bug 935175: monsters cheating to use polearm -fixed bug 938871: Izchak does not appear -fixed bug 938864: Bad message when using flurry and limiting shots -fixed bug 931200: Gnolls in Gnomish Mines ver 0.0.7E6F1 [March 20/2004] [Released by Ali] -fixed bug 909623: Surgery technique causes crash -fixed bug 909397: Windows help|about twice crashes -New branding for MS-Windows native GUI port -fixed bug 907789: "The poisoned runed dagger was poisoned!" (Nico Kist) -fixed bug 908187: Excessive prompts when reading graffiti (Nico Kist) -fixed bug 910891: Overly terse description of bones/save file compatibility -fixed bug 908983: "The large kobold turns into it!" (Nico Kist) -fixed bug 911457: Macintosh dungeon creation not random -fixed bug 912586: Crashes in Grund's Stronghold -fixed bug 907565: Unidentified tin auto-ided when eaten -fixed bug 908189: "The wererat turns into a wererat!" -fixed bug 914897: Wrong AC displayed at start of game -fixed bug 911335: Monster polymorph permanent? -fixed bug 874318: Partly eaten food more nutrious than untouched food -fixed bug 911845: "The poison was poisoned!" (Nico Kist) -fixed bug 915683: Shopkeeper doesn't handle timed objects correctly ver 0.0.7E6 [February 28/2004] [Released by Ali] -fixed bug 876092: Wrong filename in message during build process (Clive Crous) -fixed bug 876094: Tiles are miscoloured in allegro port (Clive Crous) -fixed bug 876096: Tiles are misdrawn/cropped in allegro port (Clive Crous) -fixed bug 510249: poisoned frag grenade (Nico Kist) -fixed bug 873349: should be at least expert. Fixing... -fixed bug 878808: Build of gtkhack fails under win32 -fixed bug 872666: [0.0.7e4f1] Xorns + Sokoban = cake walk -fixed bug 878813: GtkHack/win32: #portdebug crashes -Mac: Update Install.mpw to require yacc/lex -fixed bug 883643: Crash when throwing potions at monsters behind iron bars -fixed bug 854779: Unknown tin auto-IDed as dog when eaten -fixed bug 878951: [winnt] tiles32.bmp not in makefile -fixed bug 879237: [winnt] stdout & stderr prints dont show -fixed bug 879242: tile2bmp does not abort if no tiles created -fixed bug 879243: [unix] nhtiles.bmp build info error in makefile.dat -fixed bug 879244: tile2bmp draws stripes instead of checks -fixed bug 878815: GtkHack: bad handling of text fields set via "more options" -fixed bug 890801: two entrances to mines -fixed bug 858838: Stake of Van Helsing mis-listed in score detail -fixed bug 846930: [0.0.7E2]Strange msg order when swallowed by a poly'ed mnstr -fixed bug 869958: GTK handling of unexpected game exits -fixed bug 878816: Bad button label in "more options" confirm dialog -fixed bug 878817: More options confirmation: No button does nothing -fixed bug 878812: Duplicates in list of game commands -Support gentoo configuration system -fixed bug 901798: gtkhack 7E5 crashes if it can't write to cache -Documented configuration for proxy servers -fixed bug 908980: allgrohack crashes on startup ver 0.0.7E5 [January 10/2004] [Released by Ali] -fixed bug 854683: gtkhack produces many warnings on start-up -fixed bug 846444: [0.0.7e3] Negative disarm skill -fixed bug 583464: Uncharged use of spellbooks -fixed bug 436054: Striking unusual monsters' vital organs -fixed bug 731772: Two-weapon skill categorization -GtkHack: Added provision for disabling asynchronous NhExt -Merged vanilla 3.4.3 codebase. -fixed bug 857644: Gnome: tty_raw_print should be removed -fixed bug 857488: gtkprogress not handled in proxified build -GtkHack: Added user-level logging -fixed bug 858984: GTK: Dialogs don't open until after the next game command -Gtk: Smother scrolling -Gtk: Upgrade file display window to use GtkTextView instead of broken GtkText -Gtk: Add facility to change font used in help windows -Improved tile2png to use paletted images where possible -Winnt: Add support for png tilesets and build them by default -fixed bug 456453: Deep dragon resistances -fixed bug 662821: magic candles burn in the candelabrum of invocation -fixed bug 863646: Fails to compile under Gtk 2.0 -fixed bug 863679: GTK interface fails to build as an internal port -Winnt: Use pkg-config in build (for Gtk+ and libpng) based on cc-gtk -fixed bug 864193: Using Arrow keys in win32 GTK -fixed bug 866750: The number_pad windowing API is not called correctly -fixed bug 821864: [0.0.7e2] Recharge lightsaber loses enchantment -fixed bug 790120: Wolf form can't hold Torch but can if already holding -fixed bug 603184: Stacking explosives -fixed bug 857651: Gnome: tileset refreshing -fixed bug 567573: Killed lichen corpses don't merge -fixed bug 575178: Fighting with a weapon and a bare fist -fixed bug 869951: Random crashes shortly after restore -fixed bug 870027: GTK: Closing main window has no effect until after next cmd -fixed bug 870762: Lighting a candle from a stack lights the remainder (Nico Kist) -fixed bug 857492: gtkrc not removed by make spotless (Clive Crous) -fixed bug 873593: runtime delta showweight doesn't reconfig status (Clive Crous) -fixed bug 788895: [X11] showweight option not supported (Clive Crous) -GtkHack: Profile versioning ver 0.0.7E4F1 [December 2/2003] [Released by Ali] -fixed bug 852547: UNIX: make install can't find license ver 0.0.7E4 [December 1/2003] [Released by Ali] -fixed bug 782005: Menu generated which picking objects up should scroll -GTK/proxy: Added caching of mapping between glyphs and tiles. -Proxy: Add asynchronous support. -fixed bug 821865: Invisible boulders in Sokoban -fixed bug 821098: Eating Gargoyles "evil and fiendish" for Vamps? -fixed bug 822137: Tin of Hand of Vecna meat -fixed bug 831267: Weapon works offering no services -fixed bug 817700: Vampires choked by rope golems -fixed bug 811177: Fire Vamps not real vamps? -fixed bug 822120: Star Vampires not vampires? -fixed bug 808070: uhitm AD_DREN also produces AD_CALM effect -fixed bug 806071: panic("obj_extract_self") when drawing blood -refixed bug 790230: BUG: obfree() called on non-empty container -fixed bug 841965: hallucinating vampire eats normal food -fixed bug 843535: Disasm technique kills game -fixed bug 846684: X11 port crashes on start-up in tile mode -fixed bug 805499: Walking dead -fixed bug 846662: UNIX Makefiles call for NetHack.ad instead of SlashEM.ad -fixed bug 799278: "Finally Finished" when Turning Undead -Merged vanilla 3.4.2 codebase. -fixed bug 795549: IBM / ASCII graphics not working on Win XP ver 0.0.7E3 [September 5/2003] [Released by Ali] -fixed bug 781959: GTK: Message window auto-scrolling fails after a short time. -fixed bug 781972: Proxified gtk crashes if run without a player's name. -fixed bug 781974: GTK crashes when maximum magic power drops to zero. -fixed bug 781978: GTK: Memory corruption in win32 (RtlFreeHeap). -fixed bug 781991: GTK: Duplicate text windows. -fixed bug 781994: GTK interface crashes on exit from a restored game. -fixed bug 781997: GTK's concept of the initial value of number_pad is wrong. -fixed bug 781998: No confirmation of exit when main window closed. -fixed bug 782002: Gdk errors: window unexpectedly destroyed. -fixed bug 454798: Program in Disorder - No door at (50,12). -Macintosh: revise binary package -Macintosh: add missing version resources -Macintosh: make record and logfile read-only -Macintosh: allow logfile to be deleted -Macintosh: open Slash'EM when save files are double-clicked -Macintosh: windows no longer disappear when Reposition is selected -fixed bug 782004: Poor transparency in tiles imported from Mitsuhiro Itakura. -fixed bug 603181: Problems with dynamite -fixed bug 789073: pickup_thrown and bones -fixed bug 790230: BUG: obfree() called on non-empty container -fixed bug 782892: gtk startup problem when no tiles defined -fixed bug 782881: NumPad doesn't work with gtk -fixed bug 787697: GUI works, no tile graphics, just text -fixed bug 782906: compiling fails when FILE_AREAS is defined -fixed bug 793135: some broken text at completing flame mage quest -fixed bug 795384: some typos -fixed bug 793132: excessive magic by gnoll shamans -fixed bug 793144: putting corpses in ice box -fixed bug 789310: Lyc Rogues can't two-weapon -fixed bug 731767: Tsurugi of Muramasa special attack inoperative -Actioned feature request 783244: Add some/all of these new 32x32 tiles. -GTK: Added visual feedback when selecting tilesets. -GTK/proxy: Added caching of tileset data downloaded from remote servers. ver 0.0.7E2 [July 5/2003] [Released by Ali] -fixed bug 759709: Some orcs get unwarranted food. -fixed bug 754921: won't compile pure gtk. -fixed bug 653195: Level teleport out of Black Market. -fixed bug 707053: Poly in shop causes crash. -fixed bug 620074: Spitting #monster collapses dungeon. -Proxy: Add md5sum callback to support file caching by external interfaces. -Proxy: Fix minor syntax errors in ext_protocol.html. -Proxy: Relax limits on buffer sizes to improve download speed. ver 0.0.7E1 [June 2/2003] [Released by Ali] -Actioned feature request 414274: Lazy yn_function(). -GTK: Added profile for saving eg., session data: [UNIX] stored in ~/.gtkhackrc [WIN32] stored in registry -Actioned feature request 492518: resize inventory window. -Actioned feature request 421535: shop keepers are too dumb. -Applied patch 687552: Grund's stronghold. -GTK: Ported to Gtk+ 2.2.x -GTK: Replaced obsolete 1.2 interface with new 2.x version. -Actioned feature request 487616: Put lightsabers under config control. -fixed bug 733338: Crash when monster attacks an empty space (Rich Walker). -Actioned feature request 454805: cloak of "poisonousness"? -Actioned feature request 513881: Count Dracula/Vlad the Impaler race. -Actioned feature request 538741: Multiple random place arrays. -Actioned feature request 457867: blocks (Lars Huttar). -Actioned feature request 459915: displacer beast appearance. -Actioned feature request 422908: Flame Sphere+ water blast trap. -Actioned feature request 616101: Cannibalism and Cavemen. -Actioned feature request 513873: skill in Spell of Enchant . -Actioned feature request 459902: YAFM suggestion: good vibes. -Actioned feature request 709525: ki-rin are humanoid. -fixed bug 729024: Sokoban dead end. -fixed bug 617219: data.base has many redundant entries. -fixed bug 604681: MR_PLUSONE etc unimplemented. -fixed bug 734765: level-draining Thiefbane. -fixed bug 737751: Thiefbane referred to as vorpal blade. -fixed bug 466802: Items which count as magic. -fixed bug 575210: Invisible mummy wrappings. -fixed bug 405815: Invisible gold is inconsistent. -fixed bug 609748: Elfrist should be PM_ORC. -fixed bug 603179: Holy wafers in und.slayer starting inv. -Proxy: Added window interface capabilities. -GTK: Added preferences dialog. -Actioned feature request 710544: Rename Fuzzy Spellbook. -Actioned feature request 716698: rothe color is different from 3.4.1 -fixed bug 739987: impossible boolean condition. -Actioned feature request 464475: recentering view with gtk: optional. -Actioned feature request 421203: Mages' draconic polymorph. -Updated tilesets to use latest version of Mitsuhiro Itakura's tiles. -Applied patch 467847 (updated): Prettier GTK buttons & status highlight. -GtkHack: Added connections dialogs. -fixed bug 731418: #twoweaponing? -fixed bug 742693: Cannot read engravings without spending a turn. -GtkHack: Connections are now stored in profile. -GtkHack: Now reads local config file & uploads to proxy server. ver 0.0.7E0 [April 1/2003] [Released by Ali] -Actioned feature request 575146: Improvements to gypsy fortune messages. -All situations where a monster flees now generate a message. -Merged Sam Dennis's more intelligent autocomplete patch -Merged Roderick Schertler's held status flag patch -fixed bug 603350: Display layers: floating glyphs missing -Actioned feature request 520961: Specifying lamplit flag in level files (Pasi Kallinen) -Merged Pasi Kallinen's whetstone patch -Merged Malcolm Ryan's Torch patch -Merged Pasi Kallinen's coloured menus patch -Actioned feature request 538738: Random placement regions (Pasi Kallinen) -fixed bug 603180: Armed and unarmed grenades merge (Pasi Kallinen) -fixed bug 689957: Security breach in slashem -s -fixed bug 603555: DISPLAY_LAYERS when hero_memory reset -Merged vanilla 3.4.1 codebase. -Actioned feature request 595646: Pasi's alternate Medusa and Sokoban. -Actioned feature request 536690: return pickaxes to 1handed. -Actioned feature request 494753: Restore probability of PYEC invocation. -Actioned feature request 422158: so painful to read, etc. from inventory. -fixed bug 704203: Finishing off drained corpse. -Actioned feature request 563965: Reduce gypsy wishes. -Actioned feature request 594639: Monsters which should be bloodless. -fixed bug 230857: Wrong location given for death. -Removed test dungeon (A Short but Boring Road). -Finished implementation of potions of blood and changes to medical kits. -Merged DOS and UNIX source distributions. ver 0.0.6E8 [January 24/2003] [Released by Ali] -fixed bug 233901: Gtk-Critical errors from gtk_main_quit. -Proxy: Implement proxified GTK interface. -Proxy: Add formal versioning of NhExt standards. -Proxy: Add support for callback extensions. -Merged Scott Bigham's blocked boulder patch -Merged Sam Dennis's extended wizard-mode ^V command -Merged Roderick Schertler's pickup thrown patch -Merged Dylan O'Donnell's rumors of mail patch -Merged Eric Wright's and Dylan O'Donnell's #vanquished patch -Merged Aardvark Joe's record kept conducts patch -Added compile time option to disable bones files -Merged Malcolm Ryan's enhanced alchemy patch -Merged Pasi Kallinen's dungeon growth patch -Merged Nephi's grudge patch ver 0.0.6E7 [December 6/2002] [Released by Ali] -Lethe: Treacherous pets; Cthulhu revivification; monsters use of potions of amnesia & wands of cancellation; reflecting golems (Darshan Shaligram). -Implemented gtkhack, a Gtk 2.0 external window interface for UNIX and win32. -add support for multiple routes through the dungeon -Lethe: Special rooms (Darshan Shaligram). -Proxy: Switch to buffered I/O to remove packet length limitations. -Proxy: Implement sub-protocol 0. ver 0.0.6E6 [September 13/2002] [Released by Ali] -Implemented "none" as a possible random place in level compiler. -fixed bug 500833: Spellbook learn. -fixed bug 456805: Baby dragons don't grow up. -fixed bug 531179: Beheading when invulnerable. -fixed bug 499439: Fireballs don't explode on hitting you. -fixed bug 528174: having shopkeepers enchant daggers crash. -fixed bug 499055: Bug in power-draining trap. -refixed bug 459699: Oops. add_to_billobjs: obj is timed. -applied patches 457587, 457592, 457593 & 457601: Building with Makefile.nt -fixed bug 524758: #borrow on pets exercises dexterity. -fixed bug 525461: Can't compile without UNPOLYPILE. -fixed bug 479068: Bones can contain guaranteed artifacts. -fixed bug 479067: Bones can contain aligned nemeses. -Implemented NhExt sub-protocol 1. -Proxy: Added support for callbacks. -Proxy: Add display inventory callback. -Proxy: Add dlb callbacks. -Proxy: Add redraw callbacks. -Proxy: Add status mode callback. -Proxy: Add option callbacks. -fixed bug 468049: Ronin should be removed. -Implemented first cut at display layers. -Merged vanilla 3.4.0 codebase. -New lawful quest (nightmare) level (Tina Hall). -OS/2: Added support for big tiles to X11 port (Pekka Rousu). -OS/2: Enabled use of lex and yacc by default (Pekka Rousu). -fixed bug 552677: "ask before hidding peaceful monsters". -fixed bug 537214: /oDig at earth Es should anger them. -Macintosh: added support for Meta key -fixed bug 562517: Can't wish for vampire blood. -fixed bug 561043: " is suddenly moving faster" mesg. -fixed bug 558228: Liquid leap should anger peacefulls. -fixed bug 558229: Bad input in techinque menu. -fixed bug 566538: zero payment in money2mon! -fixed bug 566564: Monk breaking the vegetarian conduct. -fixed bug 557603: Vanishing items on display. -fixed bug 567591: Shooting through closed door. -fixed bug 567598: Firing more shells than exist. -fixed bug 562550: Blank graves on priest quest. -fixed bug 558230: Sokoban penalty for liquid leap. -fixed bug 570738: Tame arch-lich summons hostiles. -fixed bug 571086: C340-29: couldn't place lregion. -fixed bug 570756: Firing assault rifles takes no time. -Proxy: Add get player choices callback. -Proxy: Add is valid selection callback. -Proxy: Add quit game callback. -Proxy: Add display score callback. -Proxy: Add doset callback. -Proxy: Add get extended commands callback. -Proxy: Add map menu cmd callback. -Proxy: Add get standard winid callback. -Proxy: Add support for display layers. -fixed bug 575250: Priest creation crash -Proxy: Add support for tilesets. -Actioned feature request 457998: Inconsistencies in monster polymorph -fixed bug 580276: Stoning polyed monsters leaves statue. -fixed bug 576543: Wands of draining should boing! -fixed bug 582459: High Lycanthrope -Added Lethe monsters (Darshan Shaligram). -fixed bug 583448: No apply with healtstone. -Added new SDL/GL windowing port. -Added spooky sounds to nightmare level (Tina Hall). -fixed bug 542027: Drained corpse gets moldy (Darshan Shaligram). -Added potions of amnesia and Lethe water effects (Darshan Shaligram). -Proxy: Add support for mapping between glyphs and tiles. -Proxy: Add support for mapping between glyphs and symbols. -fixed bug 570743: Plane of water full of spider webs. ver 0.0.6E5F2 [November 30/2001] [Released by Ali] -Implemented NhExt XDR (low level protocol for proxy window). -Implemented support routines for NhExt sub-protocol 1. -Upgraded GTK 2.0 interface to support Gtk+ version 1.3.9 -Actioned feature request 455676: Invulnerability & casting without power. -Actioned feature request 469036: Thiefbane should drain levels. -fixed bug 457682: Steal from black market - militia gen. -Actioned feature request 476860: No wishing for guaranteed artifacts. -Actioned feature request 476867: Indestructable aligned keys. -fixed bug 470314: Sting and Orcrist should be lawful. ver 0.0.6E5F1 [August 31/2001] [Released by Ali] -New messages when engraving with wand of draining. -Partially implemented first cut of proxy window interface support -fixed bug 424479: Dipping into potions of gain level. -Full support for Kevin Hugo's aligned keys. -fixed bug 436639: Polyself in the Black Market. -Actioned feature request 454655: Fuzzy object and shopkeepers. ver 0.0.6E5 [May 3/2001] [Released by Warren] -Basic support for Kevin Hugo's aligned keys -Basic support for GTK 2.0 (currently as a seperate window port) -fixed bug 232030: GTK: Can't start in character mode. -fixed bug 417384: Shopkeeper services. -fixed bug 225227: Vampires start with food rations. ver 0.0.6E4F7 [February 28/2002] [Released by Ali] -Improvements to database (Lars Huttar) -fixed bug 488069: Magic lamps/candles can't be turned off. -fixed bug 488589: Burned-out lamps cannot be turned off. -fixed bug 490478: obj_is_local. -fixed bug 490405: Eating merged food still buggy. -fixed bug 460578: Macintosh window mode broken -fixed bug 486268: holy spear of light doesn't burn player. -fixed bug 480578: Hellfire/Plague don't work for monsters. -fixed bug 493892: messages for lighting dynamite, inventory (lit) indicator. -fixed bug 499368: Dynamite causes crash after detonation. -fixed bug 504740: Serpent's Tongue gives bad message. -fixed bug 491808: leashed hostile creatures. -fixed bug 493896: Bullets not used up when fired upwards. -fixed bug 520950: Level generator doesn't support scrawls. -fixed bug 520412: Level generator doesn't support toilets. -fixed bug 490400: Riders and revivification. -fixed bug 516027: dlb utility program crashes on query. -fixed bug 513831: (armed) tag doesn't work for grenades. -fixed bug 519441: "pack shakes violently" does nothing. ver 0.0.6E4F6 [November 30/2001] [Released by Ali] -fixed bug 453246: Genetic engineers attacking monsters. -fixed bug 458121: Vanishing corpses in ice boxes. -fixed bug 458085: Zap wands of healing at steed. -fixed bug 457238: Flame mage quest text mixup. -fixed bug 458093: Free action bonus against grabs too high. -fixed bug 456794: "doppelgangen". -fixed bug 458336: Rings of sleeping and sinks. -fixed bug 456335: Can't wish for bat from hell. -fixed bug 454129: Wrong weight of piles of meatballs. -fixed bug 455393: Confusing shk credit messages. -fixed bug 456137: Pets and Sam's portal. -fixed bug 456803: Riding through Sam's portal. -fixed bug 457683: Crash: lost gas grenades. -fixed bug 462512: Tight loop in blessed genocide menu. -fixed bug 462513: GTK: getline crashes on close. -fixed bug 459396: crash when entering Sam's portal. -fixed bug 457864: enlightenment & versus stone. -fixed bug 459954: slight missing wall in spiders.des map. -fixed bug 455563: Shopkeeper refers to mattock. -fixed bug 420942: two entrances to mines. -fixed bug 452172: Penalty for drowning pets. -fixed bug 452130: Odd message when charming shopkeeper. -fixed bug 461443: Frankenstein is vegan. -refixed bug 437609: No Caveman quest artifact? -fixed bug 459778: Fuzzy and non-fuzzy object merging. -fixed bug 458130: More spiders should be web-spinners. -fixed bug 467477: HSoL #invoke message incomplete. -fixed bug 468235: Upgrading wooden harps causes oddities. -fixed bug 465183: black mold has two attk's and speed 0. -fixed bug 460122: upgrade code blocks alchemy. -fixed bug 459699: Oops. add_to_billobjs: obj is timed. -fixed bug 450234: GTK: Taking n items out of a bag. -fixed bug 459878: cut_worm: no segment at (45,14). -fixed bug 465188: Deathsword's special attack impossible. -fixed bug 469519: Cannibal checks for potential pets. -fixed bug 469533: Luck bonuses of fedoras. -fixed bug 462046: compile error in qt_win.cpp RH7.1, Qt2.3 -fixed bug 453628: You are warned of undead. -fixed bug 469034: Thiefbane doesn't decapitate. -fixed bug 469764: Great Dagger ignores drain resistance. -fixed bug 450138: compilation errors in Winnt. -fixed bug 465181: silver mace sdam should be d6+1. -fixed bug 458625: Potion effects from sinks crash. -fixed bug 453100: Papyrus spellbooks. -fixed bug 475774: Dipping into potion of acid message. -fixed bug 469282: vampire race to vampire chat problem. -fixed bug 458134: character does't fall after a dash. -fixed bug 482191: m_useup() messes up weight. -fixed bug 480638: Doomblade uses bad messages. -fixed bug 469033: Artifact missile launcher bonuses. -fixed bug 469529: Throwing unacceptable food at monsters. -fixed bug 482204: wielded/quivered food. -fixed bug 482201: Eating merged partly eaten food. -fixed bug 470817: Problem learning foodtype form tin. -fixed bug 482196: weight() for partly eaten objects wrong. -fixed bug 480547: Storm Whistle isn't intelligent. ver 0.0.6E4F5 [August 31/2001] [Released by Ali] -fixed bug 420517: Yellow dragon scale mail. -fixed bug 420519: Unicorn horns, sliming, and bad message. -fixed bug 421136: engraving with wands of draining. -fixed bug 420947: remembered map ignores transparency. -fixed bug 421733: Monster on monster attacks. -fixed bug 422154: passwall makes you "etheral". -fixed bug 422161: player's demon summoning may cause crash. -fixed bug 420545: Steed galloping while asleep. -fixed bug 424455: Tame ghouls and shopkeepers. -fixed bug 422157: twoweapon status not saved? -fixed bug 422163: passwall and "carrying too much..." -fixed bug 422155: sigil of discharge kills multiple times. -fixed bug 423715: Candle of Eternal Flame is buggy. -fixed bug 422540: Succubi interaction while unconscious. -fixed bug 420941: inventory won't scroll. -fixed bug 425997: Exploding wands of healing. -fixed bug 422880: Sleep ray kills monsters? Bug? -fixed bug 422153: inaccessible spells after first 52. -fixed bug 424394: Summon Undead causes crash. -fixed bug 423686: Steed resisting and hilite_pet. -fixed bug 430975: "the the Dark Lord". -fixed bug 431283: Sleeping monsters can evade disarm tech. -fixed bug 433019: Shopkeeper rustproofing and corrosion. -fixed bug 433694: Holy Spear of Light blasts Yeoman. -fixed bug 433695: Wrong weight of old corpses? -fixed bug 436049: Rogues striking twice from behind. -fixed bug 436047: Can't polymorph into dwarf or gnome. -fixed bug 436055: Altar stained with doppelgangen blood. -fixed bug 436056: Cavewomen and amulets of change. -fixed bug 437609: No Caveman quest artifact? -fixed bug 437840: "The curate turns into a curate!" -fixed bug 422165: Slow screen update on vaporizing boulders. -fixed bug 423217: "Silent" grenade blasts. -fixed bug 440005: Call a wand of polymorph. -fixed bug 440052: Making Sam angry. -fixed bug 440159: Doppelgangers and save/restore. -fixed bug 443827: New monsters and eating. -Added debugging for bug 420942: Two entrances to mines. -fixed bug 450316: Sting isn't listed as poisoned. -fixed bug 436375: X11 Text windows too small. -Put lex/yacc files in separate folder in mac build -Direct bugs to SourceForge not hurtley in mac build -Merge mac patches into SourceForge sources -fixed bug 454954: Stealing iron balls. -fixed bug 452244: Command undead causes crash. -fixed bug 454800: a hang in sink-drinking. -fixed bug 450229: Tame solars drop Sunsword. -fixed bug 450119: Ice mage quest text mixup. -fixed bug 450460: The plural of drow should be drow. -fixed bug 452167: Rust from toilet water. -fixed bug 455511: Finishing off scrolls on restore. -fixed bug 455390: rogue quest message. -Restore original NetHack copyright date in readme.txt -Change strchr back to index in role.c -Don't create 600-byte automatic in makedefs.c -Support Mac build with Guidebook in doc directory -fixed bug 453083: Vecna doesn't always leave his hand. -fixed bug 455346: onbill: unpaid obj not on bill? -fixed bug 456459: Weak steeds can jump into poly traps. -fixed bug 425541: 'Blink' hobbit tech doesn't do anything. ver 0.0.6E4F4mac0 [May 13/2001] [Released by Paul] -built Mac 68K port -fix bug: version garbled in Mac About box -fix bug: crash selecting Help/Options/Macgraphics -fix bug: Guidebook not displayed when selecting Help/Help/Guidebook. For now, only the first 10000 characters are displayed ver 0.0.6E4F4 [May 2/2001] [Released by Ali] -fixed bug 404825: wands of teleportation that explode/zapped at yourself -Integrated Mac port -Subverted setguid check in GTK+ version 1.2.9 and above -fixed bug 405091: Contact poison corrodes greased gloves. -fixed bug 409695: Bad fruit after polymorph. -fixed bug 409699: Falling polymorphed objects cause crash. -fixed bug 409906: No eucalyptus leaves from trees. -fixed bug 409694: Polypiling instability. -fixed bug 409984: Off-by-one error in coyote naming. -fixed bug 410588: Caveman quest artifact non-existant. -fixed bug 410583: Polymorphing spellbooks loose charges. -fixed bug 410582: your foo seems less fuzzy. -fixed bug 410402: Unpolymorph only remembers previous form. -fixed bug 407857: Some wizard-mode commands don't work. -fixed bug 409196: (DOS?) display bug with & command. -fixed bug 409905: Drow don't recognize droven objects. -fixed bug 405649: Messages about unseen pet's activities. -fixed bug 411278: "Couldn't place lregion...". -fixed bug 411282: arrow traps can't poison? -fixed bug 411279: New demon lords won't wait. -fixed bug 411340: Some racial intrinsics are missing. -fixed bug 412250: Shopkeeper uncursing and Necromancers. -fixed bug 412251: Shopkeeper charging and spellbooks. -fixed bug 409198: underwater vampires. -fixed bug 411277: strange charging messages. -fixed bug 413366: Couldn't eat fortune cookie. -fixed bug 413243: eating amulets of flying. -Tweaked winnt makefile to make Win2K build easier for Ali. -fixed bug 413537: Expensive camera malfunction. -fixed bug 414101: Crash when asking for Help at prompt. -Preliminary work on bug 405663: Port internal malloc to win32 platform. -fixed bug 414291: GTK/win32 hide_privileges. -fixed bug 227942: Crash when picking up a stack of objects. -fixed bug 414674: Crash when walking over items. -fixed bug 414673: Crash with exploding rings and wands. -fixed bug 414152: W32 interface: directions. -fixed bug 411280: Dragon Caves full of babies. -fixed bug 415213: Yeenoghu touch of death.. bug? -fixed bug 412289: Spellbook charging abuse. -fixed bug 413966: Colours in map style ignored. -fixed bug 418310: handling of vampire mage corpse. -fixed bug 419866: Qt: Can't load "rip.xpm". -fixed bug 419867: Gnome: Couldn't load required xpmFile. -fixed bug 419918: X11: Map resize confusions. ver 0.0.6E4F3 [February 28/2001] [Released by Ali] -DOS VGA and Allegro videosystems now compile with REINCARNATION not defined -fixed bug 127211: Pet vampires leave corpses partly eaten. -fixed bug 127798: Eating a wraith corpse while polymorphed is buggy. -fixed bug 128019: Player can eat corpses which are underwater. -fixed bug 130386: Unused candles merge with partly used ones. -fixed bug 130263: Polymorphing into a new version of yourself seems buggy. -quick fix for bug 130857: Wrong location given for death. -fixed bug 130957: Zapping wand of healing angers peaceful monsters. -added FIXMEs for two bugs relating to wands of (extra) healing. -fixed bug 131665: Wrong cause of death when cursed wands explode. -added FIXME for bug relating to cause of death from magical explosions. -fixed bug 132026: Transparent tiles: not updating when fountains dry up. -fixed bug 128018: Frag grenades explode in water. -fixed bug 132405: Increasing Intelligence. -fixed bug 132521: #version lists the Qt windowing system twice. -fixed bug 132163: Special properties of items show up while hallucinating. -fixed bug 132033: GTK/win32: Esc not working. -fixed bug 132029: Pseudo 3D tiles not suitable for menu images. -fixed bug 132027: PgUp and PgDown not supported in scrolled menus. -fixed bug 132818: Monster detection and hilite_pet. -fixed bug 132819: Charged for wrong corpse in shop. -fixed bug 132028: Unnecessary vertical spacing in GTK menus. -fixed bug 133159: GTK: tile/description mapping is being lost. -fixed bug 133666: Gdk-Critical errors. -GTK: improved move & fight key handling. -fixed bug 124233: Win: messages are drawn on top of each other. -Integrated changes to cmdhelp from Mac port. -Fixed a number of prototype problems. ver 0.0.6E4F2 [December 30/2000] [Released by Ali] -DOS: Allegro window port adapted to display the ground underneath walls (vidalleg.c) -Win32: binaries now compiled with the Oct/2000 build of Win GTK libs -fixed bug 122396: Bottom line slow to refresh. -fixed bug 122397: "Eating" an inedible corple leaves it partly eaten. -fixed bug 122966: Dwarf's rage technique should not heal as well. -fixed bug 122999: Can't wish for The Key of Chaos. -fixed bug 121596: GTK widget options reverting after "more options". -fixed bug 123287: AllegroHack based tileset is out of date. -fixed bug 124048: Antimagic traps not displayed when monster triggers them. -fixed bug 124049: Missing "a" in magical explosion message. -fixed bug 121723: Dialog boxes appear at the mouse pointer. -fixed bug 123175: Vampire over-indulgement crashed game. -fixed bug 124232: windows GTK port unable to load savefiles beyond level 1. -vampires no longer allowed to be flame magi. -fixed bug 123468: Inconsistent messages engraved on headstones -fixed bug 123387: slashem-0.0.6E4F1-1 can't locate tiles for X. -fixed bug 124064: gtk/win32 port can't display non-ASCII chars. -fixed bug 124069: gtk/win32: Inventory screen non-closeable. -fixed bug 123915: Bags of holding can be identified by weight. -fixed bug 124967: Pick axe ceiling. -fixed bug 124070: GTK port doesn't support variable width map fonts. -fixed bug 124168: Win: Repaint after mode change. -extended SHOPTYPE wizard mode control. -fixed bug 123490: Drained lichen corpses? -fixed bug 125230: Wrong weight displayed for gold in bag of holding. -fixed bug 125472: slashem-0.0.6E4F1-1 source RPM fails on RedHat 7. -extended heap monitoring under LINUX -plugged some leaks for bug 124143: Win Version - Slowdown/Hangup/Memory leaks? -fixed bug 126097: Misleading "You can't polymorph at will yet" message. -fixed bug 123491: Extra messages when lycanthropes eat wolfsbane. -fixed bug 124968: Vampires, helms of opposite alignment, and prayer. -fixed bug 117420: Gauntlets of Power not functioning properly. -fixed bug 121595: REINCARNATION defined but not supported. -fixed bug 124920: GTK: inv_weight slow update. -fixed bug 125228: Priest: attack spells should be at least skilled. -fixed bug 126037: Manpage is outdated. -fixed bug 115064: WINNT: RNG seed problems. -fixed bug 113620: hilite_pet uses colour even if colour is off. ver 0.0.6E4F1 [November 10/2000] [Released by Ali] -GTK: status window stats columns should never be too small -GTK: deactivated the unimplemented Fight command -GTK: made the menus able to "tear-off" -GTK: move menu works with num_pad TRUE -GTK: message window now word wraps -GTK: mesage window takes up all available horizontal space minus that of status bar -GTK: map window takes up all available vertical space minus status bar/message bar space -GTK: MP/HP bars are initialized to black at startup -GTK: Default map size is now 50% of screen rather than 66% -GTK: Screen automatically centers -GTK: Scrollbars now disappear when map screen is large enough -GTK: Added two more common monospaced Windows Fonts for the map -GTK: Replaced NH_WIDTH and NH_HEIGHT in gtkmap.c with ROWNO, COLNO -fixed bug 113053: gnome windowing port now supported -fixed gnome multishot bonus (dothrow.c) and show_damage ability (hack.c) -removed unnecessary "uncursed" tags for necromancer role (to match priest) -GTK: Added graphical glyphs to the menus, switched in winGTK.h -GTK: extended commands via menus work again. -upgrading enhanced arrow types (elven, ya, dark elven) arrows results in an arrow, not a bow (potion.c) -saving/restoring now only enables the [...] effect in tty -berserk technique now takes time to "recharge" like most other techs -archeologists can become skilled at matter spells (was basic) -fixed bug 115271: nhwin.a should be deleted by make clean -fixed bug 115347: Guidebook incorrect re. reading engravings and conduct. -fixed bug 113621: GTK port now supports 3D tileset. -fixed bug 113813: Update tileset. -fixed bug 115554: Primal roar technique can cause crash. -fixed bug 115292: Better grammar in draining blood message (vampires). -fixed bug 115380: Avoid critical GTK errors from status bars. -fixed bug 114401: GTK port is no longer dependant on TTY port. -fixed bug 115301: Discovery list now has a scrollbar and menu images. -fixed bug 115348: Dwarf thieves "seduce" players of same gender. -fixed bug 115656: Player can start with ring of sleeping. -fixed bug 115471: Shopkeepers mistakenly think items are fully identified. -fixed bug 115837: Double "your" in messages. -fixed bug 115475: Eating identified tins should add to eaten memories. -fixed bug 115657: Encumber messages during initialization. -Win32 GTK port uses the new tilesets -fixed bug 113618: Can now specify tile sets in configuration file. -fixed bug 116500: #monster no longer panics if lycanthrope in normal form. -Allegro DOS port verified to use the new tilesets -Allegro: scroll_lim read properly from config file -fixed default tileset declaration in decl.c -fixed bug 115821: Molds grow from corpses underwater. -fixed bug 115598: Gtk-WARNING if you kill the "more options" window. -fixed bug 115765: Inappropriate messages when corpses go moldy. -fixed bug 115297: Vampires can feed off monsters without penalty -Vampire feeding revamp: ATTACKS -biting living monsters gets appropriate penalties/benefits -don't bite monster if it would lead to death -drain lifeblood (6 nutrition points per HP drained) -does not count against conduct EATING -now multi-turn occupation -corpses marked as (partly) drained -can continue draining if blood hasn't coagulated -can't drain partly eaten corpses -Vampire race gets 20% chance of cpostfx() -Vampires are exempt for cannibalism penalties. -fixed bug 116403: Pets can follow you into the Black Market. -fixed bug 116356: Lighting one of a stack of candles is buggy. -fixed bug 116587: Molds can have HP above their max HP. -fixed bug 117371: Wands of create horde should auto-identify. -fixed bug 116266: Grenades carried by monsters set HP to 2d5. -fixed bug 117480: Amulets versus stone last forever. -fixed bug 115210: Kiii technique can be used again immediately. -fixed bug 119758: Various interactions of moldy corpses and ice. -fixed bug 115764: Attempting to eat inedible corpses should not affect conduct. -fixed bug 117663: Weight of partly eaten corpses wrongly displayed. -fixed bug 117483: Lycanthrope's berserk behaviour doesn't work. -fixed bug 115779: Bottom line doesn't show all information. -fixed bug 114768: GTK character mode doesn't support IBMgraphics. -fixed bug 121216: Crashes when kicking a stack of objects. -fixed bug 116922: Bug with vampire race and self-polymorph. -fixed bug 115780: Missing messages when grenades explode. -fixed bug 115908: Spurious "the" in messages about invisible mplayers. -fixed bug 119480: Error: Tech already known (berserk). -fixed bug 121719: Options in defaults.nh are not supported? -fixed bug 115822: Elves are peaceful to drows. -fixed bug 119856: GTK port takes a turn to set options. -fixed bug 114646: Role-selection broken. -fixed bug 122139: GTK interface doesn't support FILE_AREAS. ver 0.0.6E4F0 [September 15/2000] -changed some checks in tech.c to use DEADMONSTER() -updated Guidebook -fixed bug 112478: game crashes whenever the Amulet of Yendor is referred to -fixed bug 112489: #twoweapon while no secondary weapon seg. faults -fixed bug 112520: game crashes when beams reflect diagonally -the ')' command now prints varying messages depending on twoweap status and mentions empty hands if needed. (invent.c) -Monks starting with the sleep spell no longer get warnings on startup (u_init.c) -the "use #quit to quit message" only occurs if you comment out suppress_alert -time before next use shows up in wizard mode tech menu (tech.c) -added the use of technique limit breaks. When HP drops below 10%, there is a random chance each turn that you are in LIMIT mode. In limit mode, all your known techniques are useable (even the ones usually Not Prepared) (tech.c) -fixed bug 112553: GTK interface failed to compile -fixed bug 112554: UNIX/VMS default config file was wrong -fixed bug 112566: Qt port 3.3.1 integration was broken -fixed bug 112616: Dazzle in a direction with no adjacent monster crashed -fixed bug 112545: Gnomish mines generated without stuff -Removed X11 dependencies from GTK port (switched in winGTK.h) -fixed bug 113031: Qt port did not support showweight option -fixed bug 112789: GTK port now supports perm_invent option -fixed bug 113396: X11 port was crashing when displaying rip.xpm -fixed unlogged bug: X11 port wouldn't compile if USE_XPM wasn't defined -fixed bug 113523: Couldn't compile if UNPOLYPILE not defined -fixed bug 112108: can now select between human and hobbit archeologists -fixed bug 112614: rage eruption no longer drains energy -fixed bug 112616: dazzle no longer causes segfault, has limited range -integrated changes from Allegrohack 1.5 -fixed bug 113366: GTK: Checking your scores before starting a game panics -fixed bug 113947: can't compile without #define FIREARMS -alpha compile of win32 with gtk windowsystem. -prompts for name (gtk.c) [possibly change to be more general than just WIN32?] -win32 port uses different fonts (but can't draw walls properly :P) -GTK: barebones error checking before destroying window widgets (gtkmenu.c) -GTK: directional dialog works with number_pad true -GTK: hitting 'enter' while in a yn dialog chooses default choice ver 0.0.6E3F1 [August 21/2000] [Released by Ali] -fixed some bugs in the zap/cast code for magic missile, fire, cold, fireball, etc. -tmp_at was being called incorrectly (new tmp_at handles nested tmp_at calls) (zap.c, explode.c, display.c) -changed all the file names in global.h to be prefixed with NH_ (DATAFILE, HELP, RECORD, ORACLE, RUMOUR, etc.) -changed #define FILENAME (macconf.h, pcconf.h) to FILENAMELEN since FILENAME is #defined by dir.h, used by Allegro WIP -fixed dereferencing NULL pointer when monster throwing items (mthrowu.c) -did the uppercase for conflicting races - TODO: Reimplement F. Theoderson's selection system or something similar while maintaining current capabilities (wintty.c) -fixed status bar in Allegro modes when screen Height was not 480. Initial status bar was drawn correctly, but updates were incorrectly printed. (wintty.c) -cleaned up the DOS makefile to allow easy building of TTY+VGA+Allegro binary (makefile.gcc) ver 0.0.6E3F0 [August 12/2000] -Nethack 3.3.1 Integration Preliminary done -flag.h - remove possibly unused vars initrole, etc... -changed position of TREE ... -eating tripe rations may have problems -uwep_skill_type returns P_TWOWEAPON for u.twoweap -increase penalties for two weapon combat -possible light source not removed problem in bhit() (zap.c) -*.rej files left over from incomplete merging of the diffs (i.e. the non-trivial changes) -notably all the system/window ports I can't compile myself -technique power surge == rage for energy -tempered rage technique to give less HP bonus -given to flame mages, necromancers, ice mages, wizards and monks -monk technique - blitz, ground slam, pummel -can chain together various techniques to do more damage (tech.h, tech.c) -vampire technique - dazzle -vision based freezing of an enemy (depends on relative level of tech and enemy) (tech.c) -should be able to #twoweapon in polymorphed forms (wield.c) -can now get 6 attacks if #twoweapon and a marilith -new ghoul, ghast, larva 32x32 tiles from Andrew Walker -can now take screenshots in 8-bit color mode (vidalleg.c) -you can now force 3d tile drawing (so you can resize the tiles to 32x32 and still draw in 3d mode) (alginit.h) -substitute tiles are now resized correctly for 3D mode (no more giant female priests) (alginit.h) -reduced memory consumption for the minimap ;) (alginit.h) (80x24 pixels, not tiles :) -preliminary support for 2xSaI - thanks to Kreed for source code -prevented some unnecessary screen mode changes in the Allegro code -silly bad merging with werewolf summoning brethren code (polyself.c) -fixed a bug with help of someone whose e-mail message got lost -raising zombies no longer causes odd domination messages (tech.c) -some modifications that enable better graphics mode switching -Integrated AllegroHack 1.4 tiles and code -hopefully fixed incorrectly crediting player for monster thrown grenades (explode.c) -some types of partially identified objects weren't recognized as not fully identified by shopkeepers (shk.c) -cancellation of mind flayers no longer disables their brain eating (mhitu.c) -quaffing potions of gain energy no longer allows current energy to go above max -DOS binaries now building with DJGPP 2.03 -Some modifications courtesy of JRNieder -additions/rearrange rumours.tru/fal -cleaned up commenting in pcvideo.h, makedefs.c -added comment when building allegfx.h (file is obsolete) (txt2bmp.c) -cleaned up makefile, made it easier to config (makefile.gcc) -moved status bar manipulations out of botl.c and into vidalleg.c, wintty.c -removed exclamation point in "you are celibate" -when you are a vampire and you get hit by a polymorph beam you become a vampire bat (polyself.c) -sanity checks for repeat_hit, no repeat_hit chain ever goes above 10. (cmd.c) -lose berserk status when you retract your claws (tech.c) -can no longer purify oneself with sprigs of wolfbane when a werewolf -causes hp loss, etc but you are still a werewolf -updated credits with Jonathan Nieder (for icon in win32 exe and more I don't remember :) -basic 8bit color mode support -known issues - fade out on death doesn't work properly -various color blending problems -all the files in the tiles directory are now 8-bit -updated rog_fem.bmp in tiles/subs from allegrohack 1.31 -fixed vampire bite attacks drinking from golems, undead (drinking from other vampires is still ok) (eat.c, uhitm.c, mhitm.c, mhitu.c) -monsters attacking other monsters only get less hungry during drain life attack only if attacker is a vampire, defender has blood (mhitm.c) ver 0.0.6E2F1 [July 2/2000] -zap.c mtmp->mtame dereference without check fixed (courtesy of r.r.g.n) -merged in allegrohack 1.3 tiles -(obj-alg.txt, oth-alg.txt, mon-alg.txt, makefile.gcc) -merge_colormap now does a fuzzy merge if there are too many colors -checks for the "closest" color -reduce the max of the pixel value differences -then minimize total of pixel valu differences *cmap remap the explosions -magic candles are now the same as regular candles in 32x32 tilemode (objse.txt) -the slam??.bmp files are now 8bpp .bmp files as they use less than 256 colors (much smaller files!) (txt2bmp.c) -vampires have 1/5 chance of having a corpse effect (gaining intrinsic, etc.) when drinking (eat.c) -vampires who drink are no longer vegetarian, vegan (eat.c) -auto checks for slam3d, slam32 and slam16 tiles -nh2k tiles merged in (mon-2kmi.txt, etc.) -3D tile support -xputg places the tiles properly -clipping, minimap, cursor work modified to work properly -optimized xputg -overview mode not available with 3D tiles -walls that cover tiles are now drawn semi-transparent -fadeout on death centers properly (approximately) -swallowing works properly -explosion centered properly -uspellprotection works properly -spell_aura works properly -shieldeffect works properly *Optimize tile_subscreen to actual size -allegrohack should work under pure dos (alginit.h, vidalleg.c) -fixed dereferencing null pointers in the init, xputg functions fixed -fixed bug where slashem wouldn't load extremely large tiles due to progress bar being too big - progress bar is now completely screen size independent (alginit.h, vidalleg.c) -started work on bmp2txt, but that's probably going to be pretty hard -easier to use a bmp2gif program, then use gif2txt -merged in chnages from allegrohack 1.31 (minimap+hud combo mode) -idx2bmp.exe generates a "large bmp" from an index of smaller ones (idx2bmp.c) -use textout without stretching to speed up traditional tile mode (vidalleg.c) -support "traditional mode" -redraws properly -seperate subscreen for tiles and text (alginit.h, vidalleg.c) -progress bar is now a fixed size (alleginit.h, vidalleg.c) -alleg.cnf now supports specifying tile files, tile_width and tile_height (alleginit.h) -vidalleg.c now supports (hopefully) any size tile (reasonably speaking) -tile2bmp is now txt2bmp (since that is more accurate) -Now processes backgrounds properly on dragons and some other tiles -can now build a '32tile.bmp' that holds all the tiles simultaneously -changed alleg_traditional(boolean) to the more informative alleg_screenshot() -tile2bmp.exe creates the index, allegfx.h and *.bmp -select behaviour using -i (index), -h (header), -f (files) -no need to redirect output - all relevent output goes to files directly -fixed tile2bmp.o not building automatically (depends on portio.h) (msdos/makefile.gcc) ver 0.0.6E1F4 [June 21/2000] [Released by Warren] -default (DOS) makefiles are set up to now build TTY-Allegro -add in AllegroHack support (ifdef ALLEG_FX) -detect function now detects whether it is possible to enable Allegro -pcvideo.h contains prototypes -can now compile a binary that can use tiles VGA, tiles allegro and tty -video:autodetect and video:alleg enable allegro -video:vga enables the old tiles -no video:foo gives the tty interface -To compile ALLEGRO, enable it in the makefile and pcconf.h -basic support appears to be working after some minor alterations -src (botl.c, display.c, end.c, explode.c, spell.c, makefile.gcc) -msdos (alfuncs.h, alginit.h, alnames.h, loadfont.h, pckeys.c, tile2bmp.c, vidalleg.c) -botl.c - why split the botl here? can it be done separately? -Need tiles in \sys\msdos\tiles as well as autogenerated tiles to create distrib -tile2bmp.c changed work with new tile code -uses magtile and txtmerge -all moving, etc handled in makefile -the following should no longer cause SEGFAULTS (which drove me up a wall hunting down) if not present -must have anethack.fnt in the gamedir (fixed) -must have tiles directory -must have all the monster, object, other tiles in the tiles directory -must have upt-to-date index in the tiles directory -must have other misc tiles (credits, etc) in the tiles directory -mind flayer pet attacking you now becomes less hungry (mhitu.c) -player polymorphed as koala can only eat eucalyptus leaves (eat.c) -fixed bug where you don't use your kick attack on monsters when attacking without a weapon (uhitm.c) -vampires as player class -level drain== eating (uhitm.c, mhitm.c, mhitu.c) -drinking blood from corpses -need to eat the corpse within 5 monstermoves of the kill -takes one turn -you get 1/5 normal nutrition, but you can still eat the rest if you poly into normal carnivore -same for pets (dog.c, dogmove.c) -bonus strength, charisma, dexterity, constitution, -no bonus to intelligence or wisdom -high max strength, charisma, dexterity, constitution, normal max intelligence and wisdom -lower starting hit points, but raises quickly -starts off with a -5 alignment penalty, -1 luck penalty (from original values) -is_vampire() macro now used (catches vampire bats) -not having a reflection (apply.c) -creating vampires (end.c) -take extra damage from stakes (mhitm.c, mhitu.c, uhitm.c) -afraid of altars (monmove.c) -ghouls and ghast are carnivores -when you poly into them, you still get hungry (side effect of being carnivorous) -only eat old corpses - synchronized with dogfood (dog.c, eat.c) -fixed possible bug in dogfood() for cannibilism (eating same letter class) -EDOG struct was used before checking has_edog -not-so-preliminary work done on WinNT with GTK (src/winnt/makefile.gcc, tiletext.c) -I've gotten the tile creation code working, all that remains is getting the gtk window-port code working -seems that some X11 dependencies remain :P ver 0.0.6E1F3 [June 13/2000] [Released by Warren] -NH004 Fixed panic caused by monster summons failing. -fixed some corpses randomly reviving (mkobj.c) -fixed spelling error - "bloodcurdling roar" (tech.c) -toilets seen by ':' look command (invent.c) -reworked the cost of #youpoly for the flame/ice mage (minimum level, energy) -no special armour: adult form level 13 and 15 energy baby form level 6 and 10 energy -scales adult form level 6 and 10 energy baby form level 6 and no energy -scale mail adult form level 6 and no energy baby form any level and no energy -fixed bug in #youpoly where you broke out of your armour when you should have merged with (polyself.c) -WIN32: icon is now embedded into the exe makefile, slashem.ico in sys/share, slashem.rc Courtesty of Jonathan Nieder -fixed bug where projectiles that are their own launcher (spears, daggers) had incorrect range and rate of fire (dothrow.c) ver 0.0.6E1F2 [April 23/2000] [Released by Ali] -SE065 Fix broken FILE_AREAS support in GTK interface (Fred Richardson). -SE066 Put tile.o into a library for ease of configuration. -SE067 GTK niggles: yn_function confusion, showweight option, slower animations, setuid -operation, gender buttons, !color support, segmentation faults, spurious gtk errors, score option, ... -SE068 Fix broken tinning code (Maciej Kalisiak). -SE069 Honour horsename option. -SE070 The adjective for the hobbit race is hobbit and not bobbit! -SE071 Fix database entries for Shelob and Stormbringer. -SE072 Provide Slash'EM specific example slashem.rc for X11 interface. -SE073 Don't give miss messages for weapons if you've chosen not to attack with them. ver 0.0.6E1F1 [April 23/2000] [Released by Warren] -fixed a minor bug in tile thinning (DOS port affected only AFAIK) -a similar bug in the tile magnifying code is also present, but has no effect since currently tile width and height are the same (magtile.c, thintile.c) -now uses nhshare, nhushare for shared and unshared files (makefile, dlb.h) -DOS now uses nhshare and nhushare instead of nhdat -fixed a minor bug - if a monster is drained below zero energy, YOU lose max energy rather than the monster (trap.c) -fixed a crash bug when monsters get power drained -some RNG can't do RND(0) (uhitm.c, mhitm.c, trap.c) -dipping a potion of acid while flying should no longer cause a crash -tried to useup() the potion twice (potion.c) ver 0.0.6E1 [April 13/2000] [Released by Ali] -SE040: Fix X11 interface Slash'EM/3.3 merge problems -SE041: Use new format (3.3) record & logfile entries and understand old format (0.0.5) entries -SE042: Fix bad error message when eggs hatch from pack -SE043: No longer crashes when throwing darts, daggers etc. when not wielding a weapon -SE044: New Qt interface (v2.0.0) from NetHack 3.3.0 -NH002: Add dialog on closing Qt interface main window -SE045: Add GTK interface from JNetHack v1.1.4 -SE046: eraseoldlocks() now supports file areas -SE047: Tiles can be displayed by the Qt interface at up to 64x64 pixels -SE048: Add support for 256-colour tile sets -NH003: Fixes panic/crash if polymorphed objects are placed in a container or are carried by a monster -GTK002:Allocate read-only (shareable) colours rather than writeable ones -SE049: Add support for Mitsuhiro Itakura's 32x32 tile set -SE050: Installer can now choose which tile sets to build simply from the top level Makefile -SE051: Add support for tile sets other than 16x16 to Qt interface -SE052: Remove ROLE_PATCH configuration switch and fix duplicate entries for role, align and gender in the options list -SE053: Add GTK interface to the list of supported windowing systems produced by the #version command -SE054: Remove inappropriate references to "NetHack" rather than "Slash'EM" -SE055: Remove redundant include/Window.h and include/WindowP.h -SE056: Add ability to wish for visible objects -SE057: Upgrade GTK interface to version 1.1.5 -GTK003:Honour menu mapping options (eg., menu_select_all) -SE058: Seperate YEOMAN and STEED configuration switches -SE059: Don't compile redundant quests: Dopp, Dwarf and Elf and restore hobbits -SE060: Bring guidebook up to date -SE061: Upgrade GTK player selection for 3.3 codebase -SE062: Fix a number of niggles: nested comments, README.33, Qt in #version, obsolete pet name options, duplicate gender option, glyph confusion -SE063: Add Slash'EM specific commands to GTK menus -SE064: Remove redundant WEAPON_SKILLS configuration switch ver 0.0.6E0 [January 15/2000] -fixed a fairly significant saving bug. (restore.c) -Mingw32 compiled version. No mail capabilities. -incorporated SE033, SE034, SE035, SE039 -cleared up some molding problems (theoretically) (do.c) -stores will always have at least one service (shknam.c) -the "HD" of your assumed lycanthropic form depends on your experience level (botl.c, polyself.c) -you now suffer silver damage, etc. if your race is werewolf in human form and also when you get infected (but still in human form) (u_init.c, polyself.c, restore.c, mhitu.c, were.c) -reimplemented Blink (allmain.c) -kicking green mold no longer causes damage to weapon (dokick.c) -redid the technique code - rage eruption no longer causes massive HP loss when you have speed ;) (tech.c, timeout.c) -fixed up odd race/role combinations (eg. elven necromancers) (role.c) -fixed bug involving drinking potions of (foo) healing when at max HP (potion.c) -mindless monsters aren't afraid of attacking higher level opponents (monmove.c) ver 0.0.5E9 [January 6/2000] -fixed a bug involving Drows, Doppelgangers gaining levels -Remove obsolete references to uhpbase, uenbase -removed extra energy bonuses from classes and races! -elves are now lawful/neutral, drows are chaotic -drows start with dark elven bows, arrows -most elven equipment is now wooden -fixed skills for casting spells (no more crashing as well) -changed charging of spellbooks so that they crumble rather than explode -incorporated the new wintty.c code from Finn Theoderson -modified to use it also for race selection -statues no longer rot -wizard mode identify and mapping should work as expected -Yeomen don't start with a saddle (it's already on their pony) -reenabled KEEP_SAVE and SCORE_ON_BOTL -fixed up sokoban level names in dungeon.def. Had to increase LEV_LIMIT from 50 (made it 99) since there were too many special levels! -fixed up dungeon.def with new sokoban -undead slayer is now before valkyrie on role selection list -fixed "invisible invisible" objects -fixed doubled options - pushweapon, role, gender, align, autoquiver, pickup_burden -pickup_burden should work like it does in vanilla ver 0.0.5E8 [December 20/1999] [NH330 integration version!] -hobbits should now be races... -fixup quest artys - artilist.h -change /* #define foo /* remark */ to /* #define foo */ /* remark */ -oddity - u.umonnum is set to your ROLE not your race. Which makes checks to youmonst.data (which is set to &mons[u.umonnum] when !Upolyd) give odd results when checking for whether you are a were (or an elf, a dwarf...) -should make u.umonnum = your race monster number (fixup affected code) -made race selection do the uppercase lowercase thing to resolve clashes (doppelgangers vs dwarves) -doppelgangers have been added -fixed doppelgangers changing back to normal form -amulets of unchanging should no longer polymorph -moved around M2_WERE to allow for lycanthropes -weapon enchantment helps in #forcing chests -Mantle of knowledge disabled... -termcap.h is now tcap.h -fixed difficulty in generating vampires with opera cloaks under WinNT -fixed explosion bug -fixed minor problem with file areas ver 0.0.5E7 [November 30/1999] -setting twoweapon without a secondary weapon while having greasy hands caused a crash - fixed :) (wield.c) -polymorph untameable - then make tame? -use mfnpos to set allow_m for mon to mon attks? (only doable when you're not nearby) -should now be able to restore while mounted on a steed. (restore.c) -monsters now have energy: -mindless monsters don't have energy -monsters regenerate energy (dependant on level of monster) -pets/others gain power along with HP -Pw shows up on probing -monsters use up energy when casting spells -affected by drain energy attacks, by magic traps and antimagic traps -wishing for grenade, gun, firearm now gives out a random weapon of that class -assault rifle now has 3 fire modes - burst, auto, single shot. Burst is 1/3 normal. -apply the rifle to change modes -added stick of dynamite. Has ~15 turn fuse. Extremely strong explosion. -There are now messages "Your foo blocks foo's attack", etc. for monster vs monster you vs monster, monster vs you (when verbose option is TRUE) (mhitu.c, uhitm.c, dokick.c, mhitm.c) -You get the disarm tech when your ability in a combat skill reaches Skilled. (weapon.c, tech.h, tech.c) -monks get Chi Healing -converts chi (power) to health for a short period of time (tech.c, tech.h, allmain.c, timeout.c) -most "error messages" for techs no longer cost a turn (unless information is given) (tech.c) -Most spellcasters (except Necromancers) have a new tech - draw energy -gets energy from surroundings (tech.c, tech.h) -Necromancers also detect bless/curse status of objects (invent.c) -throwing a single item should no longer cause a crash (invent.c) -incorporated variant of SE023.txt (being able to throw welded objects) (dothrow.c) -now prompts if you only want to light a single candle rather than assuming you want them all lit if several candles are merged (apply.c) -fixed buglet involving dragged down stairs by an iron ball and having quivered objects follow you -invoking Sunsword, Holy spear of light will burn nearby undead and demons -causes 50% monster HP damage, no outright killing though. (artifact.c) -stairs are bright white (to stand out), unlit corridors are darker (differentiate b/w lit/seen and unlit corridors) (Kelly Bailey) -definitions from Dave and Edward Walker -a little bit of randomness in the movement code -prevent generation of multiple arkenstones (artifact.c) -fixed problem with generating gold on Yeoman Quest Home (sp_lev.c) -Kelly Bailey found out why the hitpoints weren't always being updated properly! -molding. Molds will tend to revive like trolls. ~50% chance of normal corpses becoming "moldy" after a while. Hopefully, this will act as "emergency food" for beginning adventureres, although most fungi cause hallucination. Could generate more shriekers == more purple worms. Let me know if resurrecting molds becomes perilous to adventurer's health -removed debugging code in msdos.c -ethic: chastity. Invalidated by encounters with *ubbi. -Added an X11 workaround (SE022) -Added Ali's workaround/ESC callable wizard menu, fixed some obscure bugs 1. If a lycanthrope who is currently eviscerating (if that's a word!) attempts to apply a pick axe, which also happens to be his secondary weapons, then he will be allowed to dig even though he can't retract his claws. A segmentation fault may then follow. 2. Dipping Sunsword into a potion of uncursed water will cause it to be used up while dipping a long sword will not. 3. If you're mounted on a frozen stead while levitating or flying, time stands still for it unless you get off. Thus it will never respond. -autoquiver looks for spears now -rocks and like are not valid unless you have a sling -dice rolling counted separately for each weapon in 2 weapon combat -all known problems with 2weapon offhand artifacts have been dealt with AFAIK -PLEASE let me know if there are any more issues to deal with ;) Warning has been removed -throwing grenades/bullets up/down results in regular throwing, not firing the gun, arming the grenade, etc... -Fixed game getting caught in an infinite loop when wands wands of digging are caused to explode by wands of lightning AND you fall down a level. Game kept trying to save the same light again and again and... (light.c) -Monks get a new Tech Chi Strike - for a couple turns, you get extra hand to hand dmg (this is dependant on how much power you have left) -vampires now get opera cloaks ;) -grenades now have a small timeout before exploding -partial implementation of remote explosions (drop grenade, leave level, come back later) -Let me know if odd messages happen when you come back -apply arms a grenade -can't put armed grenades in containers -grenades armed when thrown -cursed may or may not arm, have more varied timeout -blessed exactly 3 turns -uncursed slight variation (+-1) -direct hit == explosion, otherwise timer takes over -arming an unpaid grenade makes it yours (you're billed for it) -added grenade launcher -fairly inaccurate (-3 to hit), slow to reload (-3 penalty) -fires grenades -One-Eyed Sam will get all those reinforcements he calls for... (shk.c) -can no longer level teleport when riding a steed a steed that's carrying the amulet of yendor. Pretty sneaky trick ;) (teleport.c) -TTY colormode - walls of gnomish mines, knox are brown, hell is red. -code will compile again with FIREARMS commented out - I have to stop breaking this! -DOS, VGA mode - now has a little "heart petmark" seen in X11 -set hilite_pet to see it ;) -and now I know what a pain it is to program video adapters ;) -tech: Blink for Hobbits freezes all monsters for a short period of time. Rage Eruption for Dwarves - You gain hp and maxhp, but it all bleeds off one pt/turn at a time -Finn Thoederson - fixed up monsters coming out of toilets -Karl Gerrison - fixed some prototyping/type buglets. Win32 compile! -fixed mistake involving putting some but not all of a wielded/quiver/secondary object into a container. (Eg. putting 5 out of 10 cursed wielded arrows into a bag results in two entries of 5 cursed arrows - both wielded!) (pickup.c) -lightsaber "melting through" door now has correct finishing statement (lock.c) (thanks marvin!) -someone on the newsgroup (lost your name!) mentioned that a period is missing from cancelled spitters... (dothrow.c) -fixed buglet that was miscalculating strength of an object when prying open doors, causing crashes (lock.c) -fixed possible bugs with monsters firing slow firearms (shotgun, rocket launcher, sniper rifle) (mthrowu.c) -monsters will toss grenades (weapon.c) ver 0.0.5E6 [October 25/1999] -all polymorphed objects will now revert unless "fixed" -fixed bug where you got many more objects after polypiling -can now wish for Ogresmasher (I'm not really sure if you'd ever WANT to, but that's another question entirely ;) (objnam.c) -the foobane weapons will cancel with a dieroll of 2 or 3 (artifact.c) [Adam Clarke] includes: Orcrist, Elfrist, Ogresmasher, Werebane, Dragonbane, Thiefbane Demonbane, Trollsbane, Giantkiller -Ralf Engels - added more special cases of extra dmg (weapon.c) -polearm vs flyer -cutting worms -piercing blobs -slashing jellies -can use counts in the throw command object prompt to control # of projectiles thrown, can use count directly on the fire command to do the same -ie "n 1 f" will fire 1 arrow "t 3 a" will attempt to fire 3 of item a "3 t" will still go into 3 consecutive throw prompts (should this change to act the same as fire?) -gas, frag grenades added -Added (Thanks J. Ali Harlow ;) SE007: Window resize code fixed SE008: Linux colour problems solved SE009: Incompatability between X11 port and GNU libc removed SE010: Fix monsters' multishot ability bug SE013: Now compiles with YEOMAN commented out SE014: Better error message if non-XPM tile file cannot be opened SE015: X11 port without tiles no longer causes divide by zero -finished removing remaining spell skill errors on startup by giving Dark Elves specified spellbooks. -master mindflayer, mindflayer recognized as alternate spelling of mind flayer -added auto shotgun, assault rifle, sniper rifle -these, like most of the specialty weapons, are VERY expensive -need to be balanced, most probably -added rocket launcher -okay, this thing weighs a TON (750) . Plus rockets (200). -Big ouches for getting hit. (d45/d60). -Rockets explode for 6d6 dmg -captains might carry -added heavy machine gun. Monsters should use guns properly. -Monsters were throwing (?!) bullets even though message said "fires" -Heavy machine gun has -4 to hit, but eats ammo like a house on fire ;) -Higher ranking soldiers may carry the heavy machine gun -bimanual. Weighs a bit less than a chest (500) -Qt compilation instructions included, minor bugfixes (Ralf Engels) ver 0.0.5E5 [October 18/1999] -shopkeep code - Black market has all shopkeep services -fixed nasty little sacrifice blessing error -thanks to Bruce Cox, who somehow hasn't been mentioned in this file yet?! ==>BTW, if you've ever submitted something and aren't mentioned here, bug me! -shocking/freezing/flaming spheres are now M2_NOPOLY -ring of polymorph control will resist polymorph -fixed Elf starting spellbooks -kicking objects at monsters should no longer cause seg faults -should compile with FIREARMS commented out -fixed tilemap.c exclusion code -fixed monster multiwep firing code -frozen steeds really won't move anymore! ver 0.0.5E4 [August 14/1999] -patches for linux -will stop twoweapon if you wield a bimanual tool -reworded some of the twoweapon stuff -fixed bugs with untrapping rust traps -untrapping fire traps with water into potions of oil. Oil will explode. -updated makefile.nt - winnt should build properly ;) -can no longer force without weapon -rust trap disarming into fountain should work properly -option menu_on_esc - show menu on hitting esc? -all liches are now g_nocorpse -can now untrap rust traps to fountains -fixes to wintty.c, winmap.c -confused steed will move randomly, frozen/sleeping steed won't move (when you're riding) (hack.c) -wallet of perseus no longer #name-able ver 0.0.5E3 [July 27/1999] -removed some floating point math operations (spell.c, mhitu.c) -monster with weapon missing -failing to cast a spell so Blackmarket has all services -fixed drinking off floor - used to be you could only drink off the floor when floating above it! -doc/guidebook.mn fixed typo slash'emoptions -> slashemoptions -util/levcomp.l now has a %n of 1000 -sys/unix/makefile.dat now compiles the hobbit.des -objects.txt has been cleaned up ;) -can no longer light potions of oil underwater -golems no longer regenerate. Now have 2x the HP to compensate. (monmove.c, makemon.c) ver 0.0.5E2 [July 18/1999] -OOOPS! Forgot to remove the debugging code that put lightsabers in all the humanoids' inventories (for a while, monsters wouldn't pick up lightsabers) -shotgun, rifle added. Shotguns take shotgun shells, are short ranged, do lots of damage, +3 tohit. Rifles have longer range, +1 tohit. -zruty has been moved to yeti (green) -yellow jelly is now yellow -Gnome technique typo fix - nible to nimble -only quest artifacts are now blast for "wrong class" -shopkeepers premium identify now fully identifies, basic only partial id (name only). ver 0.0.5E1 [July 16/1999] -#2weapon (ie #2) extended command (same as twoweapon, but quicker to type) -showweight only does status line weight display , invweight does inventory/pickup weight display -monsters that wield weapons now pick up weptools (muse.c) -black mold no longer moves (monst.c) -lit objects thrown down hallways have short-range light effects (zap.c) -Arkenstone luck working properly (artilist.h) -monsters striking with non-weapons do piddle damage (1-2) (mhitm.c, mhitu.c) -you know contents of tins you make yourself (eat.c) -starving herbivores will no longer eat their own kind (dog.c) -lightsaber code reworked -burn engraving only works with lightsaber on. -bashing messages -no more Force flowing business when wielding -lightsabers are now green,red, blue -apply to turn them on -deactivate when they hit the floor -deactivate after a turn if unwielded -lightsabers are a separate skill -damage has been increased - they all have the same average damage - -3 to hit, one-handed -charge lightsabers via scrolls of charging -red double lightsabers -4 tohit, double the dice damage of red lightsabers -can also be used in single blade mode (same damage as red lightsaber, but tohit still -4) -cursed lightsabers may randomly deactivate, harder to activate -can force chests with lightsaber (but you might end up cutting the chest to pieces by accident ;) -#force command to open doors, walls -monsters wield and use lightsabers -#force allows bashing/prying open doors with weapons (use . to force chests) -pickax will dig normally through walls/doors (but can bash chests with #force) -axes can chop through doors -minor lighting code cleanup (light.c) ver 0.0.5E0 [July 07/1999] -fixed minor pager printing bug -- Myers (pager.c) -you no longer learn the contents of tins you discard (eat.c) -sleeping unicorns don't catch gems (dothrow.c) -spheres are now sleep-resistant (monster.c) ver 0.0.4E9/E8 fixed [June 12/1999] -Fixed the wand explosion bug AGAIN...typo broke the code again...(zap.c) -only forced rehumanization should result in possible HP loss via exhaustion ie dopps should be able to consciously revert without substantial HP loss ?? make this proportional? Cause hpbase burn ALWAYS on forced rehum? -You as wax, straw, paper golems will burn (instead of rot) when hit by fire attacks. (msg error) Unchanging will result in death when in poly'ed golem form hit by susceptible attack. (mhitu.c) -genociding species while Unchanging, polymorphed into that species will kill you (read.c) -wraiths will now leave corpses (monst.c) -SLASH'EM now checks SLASHEMOPTIONS, then NETHACKOPTIONS, then HACKOPTIONS -will use whichever is defined in environment first -hpmax now should never drop below 1. -fixed up the wraith corpse eating code - Thanks to Chris! (eat.c) ver 0.0.4E8 [June 6/1999] -reworked a bit of the monster unpolymorph/polymorph code -fixed up monsters using traps, self using wands not calling new poly code -message order should be better for armour bursting, etc. -fixed ifdefs for TOURIST, YEOMAN, FIREARMS - Thanks to Jake Kesinger! -Added some CUA conventions -ctrl-Q quits -ctrl-S saves -hitting 'esc' brings up the menu (for people who are panicking :) (cmd.c) -cleaned up some code in uhitm.c to prevent some crashes when hitting with potions. Boomerangs should now shatter properly when wielded (uhitm.c) -yet another attempt to patch the keep_save code. Doesn't really work though...I'm hoping this will stop the file bloat, but it causes lots of error messages. Might consider rewriting the keep_save routines completely instead of patching through the normal save routines... -spellbooks should no longer always come with charges labelled :) (objects.c) -Thanks to Christian Bressler/Marvin again :) -cleaner fix to wands exploding -no prompt for engravings if you're literate -fixed monsters in wall from exploding create monster wand -wand of striking affects objects again ver 0.0.4E7 [May 29/1999] -Added fixes from Christian Bressler -fixed tool selection code. Using the '(' key to display tools, select tools, etc, works properly now. -liquify now displays error "cannot flow there" instead of jump there -god-given minions should attack properly now -correct range calculation for kicking an object off the top of a stack -fixed "You hear _an_ Asmodeus reading foo" -artifacts are excluded again from the two-weapon code until they get fixed ... either only eliminate sentient artifacts, or something :) (wield.c) -removed the debugging code for the spellbooks...didn't hear any problems ;B (spell.c) -fixed god revitalising (pray.c) -killed by a telepathy detected monster will now show that the monster name ver 0.0.4E6 [April 12/1999] -fixed up some linux related stuff. Hopefully things will compile better now -wands exploding via a lightning attack (external) will also call wand_explode (so be careful with those wands 'o cancellation when facing them zappy dragons :) -reading scrolls increases related spellcasting skill (objects.c, read.c) -give out less pets - will now bless objects in your inventory (pray.c) -zapping spell increases memory by 500 (spell.c) -can use the n### command to extend study time up to 300 turns - extra study == longer memory timeout (spell.c) -spellbooks issued now correlate to basic skill in that spell type. (weapon.c) -reading spellbooks "exercises" the skill. (So even if you can't cast the spell, you can study to improve your skills) (spell.c) -spellbooks now last for 30 full readings. However, they are now charged - lose a charge for every reading. Uncharged spellbooks can be read, but take 2x as long. (spell.c) -no longer see monster name of corpses when hallucinating (objnam.c) -should now work with WEAPON_SKILLS turned off -fixed getting strange neutral minions (minion.c) -You get a 50% (+luck) chance of escaping a grab attack if you have Free Action (mhitu.c) -stoning death messages corrected. Is now back to "petrified by (end.c, trap.c) -revised the "extra message line" code. Hopefully, bottom line updates more reliably (wintty.c) -time flag now works again. (botl.c) -made the Necromancer's random spellbook more applicable (force bolt, knock magic missile, create monster, wizard lock) (u_init.c) -will now contract the 1st bottom line such that you get to see some of your name -old bug from Nethack vanilla - try turning into a guardian naga hatchling (extern.h, wintty.c, botl.c) -turn undead is limited to the classes that can actually turn undead :) (pray.c, tech.c, extern.h) -larva can no longer open doors, etc. (no more limbs, now animal, slithy) (monst.c) -potions hitting monsters thrown by monsters won't credit you for the kill. (potion.c, dothrow.c, extern.h, mthrowu.c, uhitm.c) -breaking wand of teleport will create a teleport trap (wand needs more than 2 charges) (apply.c) -shopkeepers are now level 24, AC -6. One-eyed Sam has an AC of -8 now. -you won't notice the effects of dipping objects in potions of see invis/invis if you're blind (potion.c) -division by zero error fixed in monster throwing/polearm code (mthrowu.c) -fixed vanilla Nethack bug where if you save more than 80 level files, you get lots of "bad curs pos" errors (since you went off the screen) (save.c, restore.c) -forgot to put frnknstn in makefile. Frankenstein level should be fine again :) (makefile) -engraving counts as literacy (engrave.c) -fixed a bug when your steed teleports without you, and is "cloned" :) (teleport.c) -fixed a silly bug that allowed monsters to not quite die when they should have from scroll of earth (read.c) -fixed some odd messages during practice (tech.c) -all skills can reach Grand Master/Legendary/Wizard status. Restricted can be promoted to Unskilled. Of course, doing such things takes lots and lots of practice... (weapon.c) -tin smells - "smells like " when eaten before "smells kind of like " sometimes when unknown "smells unfamiliar" rest of the time (eat.c) -fixed the funny monsters shooting arrows without bow behaviour (weapon.c) -bullets never "persist" -- always used up after fired (dothrow.c, mthrowu.c) -using UPX 0.61 to compress DOS binary -guns akimbo mode (ie. one handed ranged weapons are now handled). This uses the 'f'ire command, and both weapons need to use the ammo in your quiver. If this breaks things, I NEED TO KNOW!!! (dothrow.c, uhitm.c, extern.h) -made chests, large boxes, ice boxes two handed weapons (well, they're kinda bulky :) (objects.c) -most bows, etc. are now bimanual (objects.c) -two weapon combat now calculates hits/misses for each weapon separately -artifacts are no longer excluded -no longer drop out of twoweapon when wielding new weapons (uhitm.c) -submachine gun added. Slightly heavier than the pistol, but fires 3 bullets for each pull of the trigger :) (dothrow.c, objects.txt, objects.c, mthrowu.c) -cleaned up dothrow.c a bit ;) All the indents should hopefully not be as off :) -you are prompted whether or not to read the fortune after having the cookie -literacy updated properly now (eat.c) -lances give +4 dmg bonus when used astride (weapon.c) -changed the practice message to be "You cannot increase your skill in FOO" since you can be restricted and try to practice, etc. (weapon.c) -silver hating monsters won't pick up silver things (noted by Chris Bevan) (mon.c) -fixed Axe of Durin giving error messages on use. (artilist.h) -shopkeepers use up credit before gold for services (shk.c) -fixed rogue levels not being generated properly. Level files were labelled Rou-XXXXX.lev instead of Rog-XXXX.lev (rogue.des) -fixed Hobbit's eating hobbit corpses and not getting the aggravation (and eating human corpses and getting aggravated!) and related bugs. Creation of #define is_hobbit (role.h, mondata.h) -max_dlb_files is now up to 400 (dlb_main.c) ver 0.0.4E5 [February 24/1999] -Gnomish tinkering -more upgrades -bows and arrows orcish -> normal normal <-> elven or dark elven or yumi/ya -daggers - orcish -> normal -> (dark) elven <-> great -axe <==> battle axe -pickax <==> dwarvish mattock -short swords - orish to normal to dwarvish to (dark)elven -broadsword <==> elven broadsword -club <==> aklys -hammer <==> heavy hammer -elven mithril <==> dark elven mithril -orcish chain mail <==> chain mail -leather jacket -> armour <=> studded armour -orcish/dwarvish cloak -> elven/oilskin <-> protection/displacement/magic resist/invis -fedora <-> elven leather helm -dented pot -> orcish helm -> dwarvish <-> telepathy/brilliance -dunce cap <-> cornuthaum -leather gloves <-> swimming/dexterity -orcish/Uruk-Hai shield <-> elven shield -large shield <-> dwarvish roundshield -low boots <-> high boots -large box -> chest <-> ice box -C/K ration -> food/cram ration <-> lembas wafer -loadstone -> flint <-> luckstone/healthstone -more gun code -range is now 20 regardless of strength -New artifact - crossbow named Hellfire (dothrow.c, artilist.h) -crossbow bolts hitting monsters will explode in a ball of fire -Fire Resistance when wielded -pet minions/angels won't attack minions/angels/priests of same alignment (pet vs other) (dogmove.c) -fixed the "infinite uses out of a wand" bug ;B (zap.c) Aligned quests Coded and tested (4E5): Nightmare, the Beholder, and Vecna now have special quests. To do: Finish implementation of artifact doors. Dwarf Coded and tested (4E5): Now includes the Dwarf Patch by Osku Salerma . e gas spore Coded (4E5): The player is not blamed for pets killed by attacking gas spores. & efreeti, dao, marid Removed (4E5): These existed purely as alternatives to djinn. Since they were messing up the chance of a djinni, but have no substantial difference, they were removed. Disenchantment Coded and tested (4E5): Objects can resist this attack. Fire Coded (4E5): Most fire attacks will immediately destroy straw, paper, and wax golems. Artifacts Coded and tested (4E5): Now start with nonzero charges (if appropriate). Artifacts have been balanced out among the alignments and roles. Added aligned quest artifacts (Eye of the Beholder, Nighthorn). Added Hellfire (WAC, chaotic crossbow). kicking boots Coded (4E5): Kicking boots will always succeed at breaking doors. Book of the Dead Coded and tested (4E5): Fixed a bug that displayed "a Book of the Dead" instead of "the Book of the Dead". potion of restore ability Coded and tested (4E5): Objects destined to unpolypile can be #dipped to stop the process. potion of see invisible Coded and tested (4E5): Invisible objects can be #dipped to become visible. Wands Coded and tested (4E5): Fixed the inexhaustible wand bug. Unpolypiling Coded and tested (4E5): Unpolypiling now works properly. Dipping in a potion of restore ability stops unpolypiling. Now Y2K compliant! (4E5) Picking up an object from another square is "there", not "here". (4E5) Intrinsic AC (such as by protection) is now calculated properly. (4E5) Fixed a comment at the start of pray.c that incorrectly stated: "if you're in Gehennom, all messages come from the chaotic god". (4E5) Fixed a typo in dgn_comp.y, check_level() that sometimes prevented a valid dungeon file from compiling. (4E5) The record file is now closed properly upon failure. (4E5) weapon.c, enhance_weapon_skill() now properly initializes "any". (4E5) Pets won't pick up zero items. (4E5) Killing a glass golem won't crash the game. (4E5) Fixed some problems with exploding monsters. (4E5) show_dmg() has been centralized. (4E5) Gypsies and shopkeeper services use %ld in printf's. (4E5) False rumor (4E5): Beware of the little people. ver 0.0.4E4 [December 24/1998] -UPX is used instead of DJP as the executable compressor (makefile) - DOS port Options ~~~~~~~ autoquiver Defaults to true. (4E4) Map features ~~~~~~~~~~~~ trees Coded and tested (4E4): "Digging" is now appropriately "cutting". Monsters don't leave rocks. shopkeeper services Coded (4E4): Removed identify requirement for some services. [Requested by Nathan T Moore ] Code clean-up; spelling and grammar fixes. Roles ~~~~~ New role system (the "role patch") Coded and tested (4E4): The 26-letter limitation is now fixed. Replaced Role_is() with Role_if(), u.role with Role_switch. Quest level files and text upgraded to new system. Bones and record files upgraded to new system. Barbarian Coded (4E4): Shouldn't get "Barbarian needs food, badly!" Gnome Coded and tested (4E4): Now start with only 3 weapons (1 wielded + 2 ranged) instead of a half-dozen. Hobbit Added (4E4). Does NOT replace the Healer role. To do: Revise skills, quest locate level, quest messages. Ice Mage Coded (4E4): Polymorph into white dragon (not blue). Knight Coded (4E4): Some quest text is now appropriately delivered by window instead of by pline(). Necromancer Coded and tested (4E4): Start with wand of draining. Yeoman Coded (4E4): More nemesis maledictions. Quest leader and guardian equipment. Monsters ~~~~~~~~ z koala Coded and tested (4E4): "You calm down" only when appropriate. I enchanted beast Coded and tested (4E4): Now works as it should. L Vecna Coded and tested (4E4): You can now properly offer his body parts. @ gypsy Added (4E4). Attacks ~~~~~~~ Calm Coded and tested (4E4): "You calm down" only when appropriate. Disenchantment Coded and tested (4E4): Armor cancellation factor applies. Removes positive enchantments from weapon/armor. Kicking Coded and tested (4E4): Damage calculations are now more consistent with weapons. Objects ~~~~~~~ Artifacts Coded and tested (4E4): The limitations to getting artifacts added by Stephen White are now #ifdef NOARTIFACTWISH, and are disabled by default. This means that getting an artifact through sacrificing or wishing is as likely as in vanilla NetHack. Added Plague (chaotic Drow dark elven bow). amulet versus stone Coded and tested (4E4): Each time you are stoned, the blessing changes from blessed -> uncursed -> cursed -> turns to dust. Polearms Coded and tested (4E4): Monsters can no longer use them through walls. New skill categories Coded and tested (4E4): Riding skill. kicking boots Coded and tested (4E4): Damage was too high. [Reported by Nathan T Moore .] Damage calculations are now more consistent with weapons. Spellbooks Coded (4E4): Now last 20 000 turns, up from 5000. [Requested by Dave .] spell of drain life Coded and tested (4E4): Rewrote code. Now affects objects. spells of flame/freeze sphere Coded and tested (4E4): Attacking peaceful monsters makes them angry. ring of indigestion Coded (4E4): Nausea frequency decreased to every 100 to 199 turns. wand of draining Coded and tested (4E4): Hits monster or player: Drains level, if not resistant. Hits object: Removes enchantment/charging, but leaves blessed/cursed status and other properties intact. Cost $175, probability 15/1000, "ceramic". Monsters know how to use it. saddle Coded and tested (4E4): Riding skill. You can reach the floor at basic riding skill. Your steed can now be attacked at close range, and will attack back. Traps, pools, and wounded legs are now properly handled. fishing pole (weapon-tool in polearm category) Coded and tested (4E4): Large/strong monsters have a chance of pulling you in. [Idea by Aaron .] Sinks and toilets have effects. unicorn horn Coded and tested (4E4): blessed: Tries multiple problems, each with chance given below. uncursed: Tries one problem, with chance given below. cursed: Causes one problem. ENCHANT +0 or less +1 +2 +3 +4 +5 +6 or more CHANCE 30% 40% 50% 60% 70% 80% 90% Internal changes ~~~~~~~~~~~~~~~~ end.c, done() had references to the wizard flag without bracketing them in #ifdef WIZARD. (4E4) zap.c, cancel_item() had missing cases for gauntlets of dexterity and for several variant objects. (4E4) Enlightenment now properly reports being very fast. (4E4) Fixed a Macintosh bug that would crash the entire system with a bus error if there was a bad option in the Slashem Defaults file. (4E4) Rumors and Help ~~~~~~~~~~~~~~~ True rumor (4E4): You can't get gold from a gypsy. ver 0.0.4E3 [November XX/1998] -techniques - replaces special class effects (cmd.c) (dothrow.c, timeout.c, tech.c, tech.h, makefile, u_init.c, uhitm.c, cmd.c, mhitu.c, allmain.c, spell.c, wield.c) -access using Meta-t, or #techniques -turn undead is now a technique (Priests and Wizards start with it) -Current tech allotments: Research (A), KIII (S), Healing Hands (K), Surgery (H), Reinforce Memory (FINW), Berserk (B), Practice (UV), Psycho Slash (L), Missile Flurry (E), -Sigil of Tempest shouldn' crash anymore...(spell.c, zap.c) -you only recognize tin types which you've eaten the corresponding corpses (eat.c) -added poison blast explosion tiles, poison blast discharge/tempest modes (spell.c, zap.c) -Frankenstein's monster now makes an OLD corpse (mon.c) -Doppelgangers can usually only polymorph into foes it has already eaten. You can try others, but there's a good chance (esp. at lower levels) that you'll fail. (cmd.c, polymorph.c) -flag for whether type has been eaten (decl.h, decl.c, eat.c) -New Techs: gave Monks Ward against burning, against ice, against lightning instead of intrinsic resists. If you want the resist "permanently", you'll need to wear stuff... -added a hallu message for casting endure cold (spell.c) -made monster/object unpoly messages a bit more generic. (mon.c, timeout.c) -can drown, etc. when monsters cast create pool on you ;B (mcastu.c) -fixed zapping drain life on yourself. I don't recommend it though... (zap.c) -Added Robin Johnson's glass, gold, wax golems -Added Acid Explosion, and Discharge/Tempest varieties working explosion glyphs by Robin Johnson (drawing.c, rm.h, explode.c, zap.c, spell.c) -Added Dr Frankenstein, genetic engineers, Frankenstein's Monster co: Robin Johnson -New Level: In Gehemmon, there is now Dr. Frankenstein's Lab. co: Robin Johnson -New Tech: Revivification: Healers get this at level 20 - can revive a corpse! (costs 100 HP) (tech.c, tech.h, invent.c) -Ice Mage def'n from Drew Curtis -New Tech: Raise Zombies: Necromancers can transform corpses into zombies. Must be humanoidish to work (tech.c, tech.h) -Necromancer starting spell is now Drain Life (need I mention that drain life - NEW SPELL - has been added :B) causes HP loss (some) and level drain (zap.c, objects.c, objects.txt, spell.c) -minor compile error fixed for shops (mkroom.h) -spells that get bonus duration from skill -resist poison, resist sleep, endure cold, endure heat, insulate -fixed Mojo to be one-handed again. Double checked the mythological version and the handle wasn't quite finished. [Heiko Niemeier] (object.c) -invisible monsters leave invisible corpses ;B (mon.c) -mon hit mon gaze attack reflection implemented (mhitm.c) -monsters using death gaze on each other implemented ;B -gaze attacks when polymorphed are now implemented ;B -takes 20 energy, attacks only one monster (cmd.c, polyself.c) -fixed an errant if statement that made dragon breath *harder* for doppelgangers and Flame/Ice mages (polyself.c) -Flame/Ice mages only get easier breath attacks when poly'ed into red/blue dragons -All this doesn't matter anymore because monster breath attacks use energy (10 if doppel, flame/ice as respective dragon, 15 otherwise) -Monster inventory starts: (makemon.c) Gnolls: might get Bardiche, Voulge or Halberd, Leather armour 1/3 Trolls: might get Spetum, Partisan, Glaive or Ranseur -Flame/Ice mages start with more Power, gain more every level (closer to Wizards) (u_init.c, exper.c) -Monsters can now use polearms at a distance (weapon.c, mthrowu.c) -verb should now be "shoot" for monsters launching dark elven arrows, ya (mthrowu.c) -premier and basic identification service now cost different amounts in shops (shk.c) -fixed bug where mounting a steed that is carrying an object causes a crash (dogmove.c) -should no longer get "maybe_write_ls" errors on high score lists Unconfirmed bug - oh well, the fix is in anyways :B (light.c) -unpolymorph messages for monsters and items (timeout.c) "foo becomes foo" -Robin Johnson's Frozen Foods Store ;B (shknam.c) -wolf pups are now wolf cubs for accuracy ;B (monst.c, mondata.c, role.c) -explore mode can also be accessed via #explore (cmd.c) -menu accesible via apostrophe and tilde ;B (cmd.c) -objects will now unpolymorph! (timeout.c, timeout.h, zap.c, potion.c) -Spell damage bonus now also depends on Spell Skill. normal beams also get spell damage bonus (zap.c) -Fixed : Checking your symbol (Hitting ;.) now gives correct response (mondata.c) -Fixed crashing bug: flame/freeze sphere exploding and killing gas spore (mhitm.c) -Fixed bug: Getting 2 messages when eating a slime mold (eat.c) -New Techs: Sigil of Tempest, Sigil of Control, Sigil of Discharge Sigil of Tempest - invoked causes magic missile/lightning/fire/cold to be cast as storms (also uses 50 PW) Sigil of Control - you can control the direction of the beam (in-flight!) (30 PW) Sigil of Discharge - Megablasts. (100! PW) Combinations - Tempest & Control: You choose where the storm is centered at Tempest & Mega: storm, but lasts 2x longer Control & Mega: can change dir of beam in midflight All 3: storm, selected center, 2x longer ;B (tech.h, tech.c, spell.c, zap.c) -New Tech: Cutthroat for Rogues. Possible insta-kill, otherwise 50% damage Acquired at level 15 (tech.c) -Techniques can be gained and lost (like intrinsics) with levels ;B -New Tech: Liquid Leap for Doppelgangers. Doppelgangers can liquify, and acid bolt a couple spaces *through* enemies before reforming. They're invulnerable while doing it, too ;B -fixed typo with the "Your knowledge of the spell is twisted...It invokes nightmarish yadda!" (spell.c) -all spell effects that duplicate objects will act like blessed version ;B (spell.c) -new spellbook tiles (note these get shuffled ;B) tartan, psychedelic, spiral-bound, rainbow striped, left handed spotty spellbooks -junk mail should no longer give version number (since I'm too lazy to change it ;B" -Yeoman corpses should be properly generated in graves (topten.c) -New Tech: Primal Roar for Cavepeople : Gains Fast, aggravates monsters around nearby (range 5) pets nearby grow up temporarily. Did I forget to mention pets do double damage for the duration ;B (tech.c, tech.h, extern.h,timeout.c) -Killer bees shouldn't grow into queens anymore (mondata.c) -New Tech: Elemental fist for Monks : Punches inflict a random fire/cold/elec/acid/poison dmg bonus (tech.c, tech.h, uhitm.c) -Yeoman now have a "special spell" - knock (spell.c) -New Tech: Blessing for Priests (tech.c) -winter wolf cubs should grow up properly now (mondata.c) -fixed wrong glyph being displayed when zapping a gas spore and it explodes (zap.c) -this should slow things down...I really need to get feedback about the efficiency of SLASH'EM (probably not good ) -klutzes (not dex enough) really should now take a turn when swapping weapons (wield.c) -New Tech: Critical Strike for Rogues - weapon + 50% + techlevel damage against humanoids (+25% instead of +50% if non-humanoid) (tech.c, tech.h, u_init.c) -spheres should attack monsters of any level (dogmove.c) -slime warning on bottom line (botl.c) -push back effect from blessed wands of striking only happen 1/3. Monsters using wands of striking will also get push back effect (on you and other mons) now (muse.c, zap.c, dothrow.c, dokick.c) -weight on bottom line is linked to the showweight option (botl.c) -New Tech: Vanish for Gnomes - short term speed and invisibility (tech.c, u_init.c, tech.h) -level names for flame mage and ice mage are back. (role.c) -flaming sphere now likes fire. flaming and shocking spheres emit light (range 1) (mondata.h) -Meta-e is back to "enhance weapon skills". M-k still works for now. -DOS version runs in tile mode under Pure DOS (botl.c) My Additions ~~~~~~~~~~~~ autoquiver If you use the (f)ire command when the quiver is empty, and this option is set, a suitable weapon will be placed in your quiver. You must still remember to wield your bow if you plan to fire arrows (or other launcher/ammo combination). You may still use the (Q)uiver command manually, if desired. (4E3) Medusa level Coded and tested (4E3): The Wallet of Perseus is now an artifact bag of holding. Rolling boulder traps Coded (4E3): No delay when the boulder is out of your sight. [Code provided by D. Stage .] New role system (the "role patch") Coded and tested (4E3): Game engine makes complete use of urole. Fixed "This game you will be a chaotic knight" bug. Voluntary challenges Coded and tested (4E3): Pacifist. Pets Coded and tested (4E3): Winter wolf pup now "cub" and grows up properly. u pony, horse, thoroughbred Coded (4E3): is_unicorn() macro. No longer treated like a unicorn. Spellcasting monsters Coded (4E3): The create pool effect is now harder for monsters to cast. Wielded, secondary, and quiver weapon slots Coded and tested (4E3): "autoquiver" option. [Suggested by Jeffrey Bay .] Two-weapon combat Coded and tested (4E3): Cannot use artifact in second weapon slot. Multiple attacks Coded (4E3): Weapon to-hit (hitval()) bonuses no longer accumulate with each attack round. For example, a +1 weapon acted like a +6 weapon for a marilith's sixth attack! Fixed. Artifacts Coded (WAC, 4E3): Mjollnir is once again a one-handed weapon. darts Coded and tested (4E3): Monsters will now throw darts. [Reported by .] Polearms Coded (WAC, 4E3): Monsters know how to use from a distance. New skill categories Coded (4E1): Category titles (weapon.c) Coded and tested (4E3): Paddles Firearms (#ifdef'd) apple Coded and tested (4E3): Macintosh users get an appropriate special message. spell of drain life Coded (WAC, 4E3): Effect: See wand of draining. Attack spell, level 7, cost $700, chance /1000, "velvet". spell of passwall Coded and tested (4E3): Effect: You can pass through walls for 50 to 149 turns. Body spell, level 6, cost $600, chance /1000, "ochre". potion of full healing Coded and tested (4E3): Blessed restores lost experience levels. Reading rings Coded and tested (4E3): Rings can be read when they are worn. Applicable rings: mood ring, warning. mood ring Coded and tested (4E3): Worn: If identified, you can (r)ead it. A non-cursed ring glows red, yellow, or green if your god is angry, pleased, or well-pleased. A cursed ring appears dark. Eaten: No effect. Sink message: "The sink looks groovy." Cost $100, "ridged". ring of increase accuracy Coded and tested (4E3): Worn or eaten: Confers a to-hit bonus. Sink message: "The water flow hits/misses the drain." Cost $150, has enchantment, "clay". ring of indigestion Coded and tested (4E3): Worn: You are immune to digestion attacks. You cannot use a digestion attack. Causes hunger. Induces nausea every 50-80 turns. Eaten: "This ring is indigestible!" and you choke. Sink effect: "The ring is regurgitated!" and does not disappear. (If wearing the ring doesn't make you naseous, the bad puns will.) Cost $150, usually cursed, "steel". bag of holding Coded and tested (4E3): Artifacts behave 4x cursed, 1/6 x blessed, 1/3 x uncursed. Wallet of Perseus is an artifact bag of holding. silver wallet Deleted (4E3). saddle Coded and tested (4E3): Riding a strong monster maximizes your carrying capacity. Fixed divide-by-zero bug when steed carries an item. Fixed magic whistle bug. Monsters won't be placed under you when not riding. Weapon-tools are no longer displayed as chargeable (4E3). You cannot auto-identify items while hallucinating. Coded (4E3). [Reported by Nick .] Added the macro is_unicorn(). (4E3, mondata.h) Repaired a bug while praying during a full moon. Add "case 9:" after "case 8": in pray.c, pleased(). Also, cases 7 to 9 should be placed before case 6, in case ELBERETH is not defined. (4E3) spell.c, spelleffects() once again directly calls percent_success() (4E3). False rumors (4E3): Waltz, dumb nymph, for quick jigs vex. [A pangram (sentence with all 26 letters of the alphabet), from the rec.puzzles archive, by Gyles Brandreth and Stephen Smith.] Major Oracularities (4E3): Upon a level before all maze There lies a woman who kills with gaze. Should she be killed, not petrified, You will receive a magical ride. [Pegasus] ver 0.0.4E2 [October 29/1998] -Database entries updated thanks to many people ;B Thanks folks! -Check out the new features! -BIG Thanks to Kevin Hugo and Robin Johnson! THEY made SLASH'EM 0.0.4E2! Options ~~~~~~~ role Your starting role (e.g., role:Barbarian, role:Elf). Although you can specify just the first letter, for future compatibility, it is recommended that you spell out the entire role name. You can also still denote your role by appending it to the "name" option (e.g., name:Vic-V), but the "role" option will take precedence. 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" options, the "gender" option will take precedence. align Your starting alignment (align:lawful, align:neutral, or align:chaotic). You may specify just the first letter. pushweapon If true, then using the (w)ield command will push your old main weapon (if there is one) into the secondary weapon slot. Map features ~~~~~~~~~~~~ Sokoban branch New addition (4E1). Coded (4E2): Can no longer cheat with cursed potion of gain level. Oracle level Coded and tested (4E2): #offering corpses to the Oracle. Groundhog day. Medusa level Coded and tested (4E2): Pegasus is created when Medusa is killed and leaves a corpse. Smarter handling of overlapping branch levels. Coded and tested (4E2). (dungeon.c, dungeon.def) trees Coded and tested (4E2): Glyphs for tile, IBM, DEC, and Mac graphics. Gold and gems aren't be deposited on arboreal levels. Documentation of new map features To do. Roles ~~~~~ New role system (the "role patch") Coded and tested (4E2): "role", "gender", "align" options. Centralized structure containing role information. Less dependeny on using letters to specify roles. Role, gender, and alignment selection now dynamic (no longer hard-coded). References to urole (partially done). Hello() and Goodbye() functions. To do: References to urole. Voluntary challenges Coded and tested (4E2): (Genocideless is already apparent) Wishless, no artifact wishes, polypileless, polyselfless Vegetarian, vegan, foodless Athiest, illiterate, non-weapon-using Reported by #ethics command and at game end. To do: Adjust final score based on challenges? Yeoman class Coded (4E2): Quest levels. Mac role selection dialog box. To do: Nemesis maledictions need some work. Quest features Coded (4E2): All quests have at least one guaranteed altar. If one had to be added, it was placed under the nemesis. The Wizard start level has a large bookstore. [Suggested by Aaron Eichelberger .] quest.txt, %Cc R 00070, should not be in quotes. Skills Coded and tested (4E2): Your maximum skill of your first artifact gifts is at least skilled. Your maximum skill of your quest artifact is expert. Spellcasting roles have at least basic maximum skill in all of the spell skills. Pets Fixed some of the pets (4E2): Flame mage hell hound pup Gnome ? Ice mage ice wolf pup Knight pony Lycanthrope wolf pup Necromancer zombie Yeoman pony [Suggested by Aaron .] All 'd' use dogname, etc. Monsters ~~~~~~~~ gas spore Coded and tested (4E2): No longer explode when genocided. [Reported by Julian Bell .] koala Coded and tested (4E2): Calm attack. Eats only eucalyptus. Tasmanian devil Coded and tested (4E2): Eats organics (like gelatinous cubes). Attacks ~~~~~~~ Acid, rust, rot damage Coded and tested (4E2): Acid has a 5% chance of removing your weapon's erosionproofing. Your weapon or armor can no longer be completely destroyed by a rust or rot attack. Calm Coded and tested (4E2): Turns the defender peaceful. Only applies when attacker is tame and defender is hostile, or vice versa. Some defenders can resist. Wielded, secondary, and quiver weapon slots Coded and tested (4E2): Overhauled and aggresively tested. "pushweapon" option. Secondary and quiver no longer weld or convey intrinsics. "Corpse in quiver" bug fixed. To do: Did this fix the bad monster weapon restore bug? Two-weapon combat Coded and tested (4E2): #twoweapon command implemented. Necessary checks are made. Damage for both primary and secondary weapons. Weapon skill is used and can be advanced. To do: As it is now, you either hit with both weapons, or with neither. The to-hit code either needs a kludge, or an overhaul (uhitm.c). Objects ~~~~~~~ Artifacts Coded and tested (4E2): Each role has a designated first and second gifts. Automatically change alignment of quest artifact and first and second gifts. crysknife Done (4E2): Can "fix" it by reading a scroll of enchant weapon while confused. A fixed crysknife has a 10% chance of reverting to a worm tooth when dropped. [Requested by Nick Number .] Robes Coded and tested (4E2): Putting on a robe of weakness and/or protection automatically identifies it. eucalyptus leaf Coded and tested (4E2): Koalas can only eat this food. saddle Coded (4E2): Finally enabled by default! Knights and Yeomen start with a pony, a saddle, 10+ apples, and 10+ carrots. #sitting tells you about your steed. Internal changes ~~~~~~~~~~~~~~~~ Added "role.c". (4E2) spell.c, study_book() condensed by using oc_level. (4E2) Rumors and Help ~~~~~~~~~~~~~~~ False rumors (4E2): You can make holy water by boiling the hell out of it. On Groundhog Day, you should play the same game over and over and over... -3 line bottom line for systems that support it ;B -minor fixes to the slashem.txt file -updated history sections ingame and in guidebook (guideboo.mn, history) -added Robin Johnson's new tiles! more than 50 at the last count!: intern, lightning explosion Lareth, Maagnashagar, athol, rhaumbusan, necromancer, nightmare shifter, page, Sir Lorimar, Master Kaen, Transmuter, enchanted beast, dao, wombat, Aleax, healer, Hippocrates, attendant, Nalzok, hydra, giant crab, pony, horse, thoroughbred, doppelganger, Master Shifter, wyvern, prisoner, monkey, arc bug, spark bug, undead slayer, van helsing, pegasus, winter wolf pup, exterminator dingo pup, large dingo, tasmanian devil, kangaroo, wallaby wallaroo, platypus, woodchuck, giant spider, largest giant iron bars, tree fishing pole, eucalyptus leaf -new zap beams -new explosions -this guy deserves eternal gratitude. -database additions -bottle Matthew B. Ryan -2 more stormbringer quotes... -added lembas wafer, elven cloak, Stormbringer to data.bas - thanks to Nick Number -added Shelob's description from "The Two Towers" (Tolkien) for giant spider -Earth (Mostly Harmless ;B) from HHGTG -silver (Webster's) -rodney now links to WoY -added in sokoban level for DOS port -made it so if the screen is long enough, TTY port will allow a 3 line status line (best of ALL worlds ;B) (wintty.c) -yellow jelly is now yellow in tiles ;B (other.txt) -renumbered the tile files. (objects.txt, monsters.txt, other.txt) -a new look for the readme.txt, slamfaq.txt, history.txt ver 0.0.4E1 [October 09/1998] -DOS binaries compressed with DJP 1.07 -a couple extra touches to the Oracle level -lots of tweaks on the old monsters (monst.c) -A new branch! Look for a stairway up early in the game... -new monsters - enchanted beast, Taz devil, kangaroo, wallaby, wallaroo, echidna, platypus -polymorphing/unpolymorphing monsters will give messages if it suffers a system shock/doesn't survive the polymorph (timeout.c) -range of polearms increase with skill (apply.c) -healing potions have same effect on monsters as on humans (almost) rather than always completely healing. (potion.c) -chance that a shopkeeper won't cheat you (depends a bit on luck and quite a bit on Charisma) (shk.c) -wraiths are 50% likely to get a robe (read the database entry ;B) (makemon.c) -Ice Mages get Expert in Enchantment as well as Matter, Skilled in Protection and Healing, Basic in others. (U_init.c) -Flame Mages get Expert in Divination as well as Matter, Skilled in Body and Attack, Basic in others. (U_init.c) -Wizards can only get Expert in Attack Spells - rest can only go to Skilled They are still the "jack of all trades" for magic. (u_init.c) -new spells: Flame Sphere, Freeze Sphere for Flame and Ice Mages! Now these Mages have something to call their own, instead of having to rely on the out of category (therefore, less effective) force bolt. Pretty much, you can summon Flaming/Freezing Spheres, who will follow you around and attack enemies (well, that's the plan ;B) You also get the experience ;B Disadvantages: Relatively short range, not directable, can't hit multiple enemies. Advantages: You can generate and save for a rainy day ;B (dog.c, spell.c, objects.c, objects.txt, doname.c, mon.c, mhitm.c monst.h) -bashing message when hitting monsters in melee with polearms (wield.c) -attacking with pole-weapons in melee does bashing damage (uhitm.c) -minimum range for applying pole-weapons (apply.c) -priests now start with a +2 robe and +2 small shield (blessed, of course ;B) (u_init.c) -dragons should blast open doors properly ;B (monmove.c, mthrowu.c) -rechecked/cleaned up part of the wielding code (again :B) (wield.c) -fixed bug - wielding quivered item then throwing used to crash (wield.c) -all magic candles should no longer show up partly used when unidentified, not just the Candle of Eternal Flame. (objnam.c) -gas spores should always explode when dying. There should no longer be any gas spore corpses left behind (explode.c, mon.c) -force bolt at Skilled and blessed wands of striking will push back enemies (zap.c) -no longer charged for reading a spellbook of a spell you already know well in a shop (spell.c) -fixed free reading of spellbooks off floor (shk.c) -fixed game crashing when reading off the floor, spellbook is destroyed and game crashes. (spell.c) -fixed ordering of spells to accomodate assumptions in zap.c (objects.txt, objects.c) ver 0.0.4E0 [September 09/1998] -balance patch additions merged in thanks to Kevin Hugo (many) -there are a good many changes ;B Check out slamfaq.txt if you haven't read his post yet -some rearranging of the objects.txt to work with the tile code (objects.txt) ver 0.0.3E9 [August XX/1998] -fixed game crashing bug. All machines should be able to get past the selection screen without crashing now. (save.c) ver 0.0.3E8 [August 10/1998] -no longer get " gets angry!" if monster is not visible (mon.c) -fixed game crashing when kicking stoning corpse with bare feet (dokick.c) -Wallet of Perseus should now explode if you put a wand of cancellation, etc. in it (obj.h) -Game Crashing bug fix: Fatal error when drowning while carrying no inventory and a lot of gold (trap.c) -cancellation now eliminates sliming, drain exp attacks from harming you (mhitu.c) -removed extra carriage returns in 'A' special ability (cmd.c) -Barbarians can read spellbooks again, albeit unreliably (their "Magic! Bah!" comes up often) (read.c) -blessed keys, credit cards, etc. break off less often in locks. (lock.c) -it is no longer as difficult to open tins using dark elven daggers, great dagger, silver dagger (eat.c) -if you try to fire with no ammo, will go to standard throw prompt (dothrow.c) -having strength 18/91-18/99 no longer gives +11 damage bonus - is now +3 (weapon.c) -Ice Mage now has levels Cooler, Condenser, Chiller, Froster, Permafroster, Icer, Freezer, Sublimer, Ice-Master (botl.c) -Flame Mage now goes through named levels Spark, Igniter, Broiler, Combuster, Torcher, Scorcher, Incinerator, Disintegrator, Flame_master. (botl.c) -Player's with Con > 15 also have a chance of getting the "Strange....no etc." msg (potion.c) -fixed a silly bug...Barbarians can drink potions successfully again (potion.c) -Turn condensed back to T:, Levitate is now Float on status bar (botl.c) -now runs in 24 lines (rather than 25) for compatability with other platforms (botl.c) -made getting djinni's from smoky potions more frequent. Used to be one in 200+ chance... (potion.c) -recompiled using gcc 2.8.1 for more stability -fire/frost/etc weapons now have interesting effects when dipped/etc. -"bad monster weapon restore" bug should be fixed (crude hack here) (restore.c) -updated slashem.6 -you can also drink objects on the ground (see reading) (potion.c) -you can now read objects off the ground (like eating) (read.c) -shopkeepers get services randomly (eshk.h, shk.c, shknam.c) -shopkeeper services should now be #ifdef OTHER_SERVICES (shk.c, config.h) -there is now premium service available for identification (shk.c) -all 'foo'sabers are now bimanual. (objects.c) -'--help' command line option should invoke command-line help (pcmain.c) -spoon is now a "whacking" weapon, rather than piercing (objects.c) -rapier is now classed as a saber (weapon.c) -new option {pickup_burden} lets you specify when the game should start prompting you about lifting heavy things. (options.c, flag.h, pickup.c, guideboo.mn, guideboo.tex) -can no longer get endure cold/heat if flame or ice mage -hopefully fixed doubled spellbook bug in initial inventory (u_init.c, spell.c) -You get messages when dipping frost/fire weapons into water (potion.c, artifact.c) -prayer timeout is reset to zero right after successful altar conversion (pray.c) -fixed (hopefully) the swapwep problem for good. Really. (I hope). So I don't read all the comments :) As a matter of note, I've finally discovered that the bitfields are in octal form. And a long being only guaranteed to have 32 bits, it's interesting to note that there's been a use made of 31 of them... (obj.h) -changed typename() to obj_typename() -fixed naming a known wand of fireball/fire when breaking/exploding (apply.c) -fixed naming known potion in blackmarket (potion.c) ver 0.0.3E7 [June 11/1998] -fixed a couple typos in the 'D' quest (quest.txt) -fixed undeleted light source when artifacts are destroyed (extern.h, mkobj.c, artifact.c, light.c) -fixed PYEC doing a level teleport when "nothing happens" (artifact.c) -Elves/Drow now have expert quarterstaff skill - quest arty for Drow is Tentacle Staff (u_init.c) -Gnomes now have expert pickaxe skill - their quest arty was a pickaxe, no less! (u_init.c) -dragons and other monsters with door destroying breath weapons will use their breath weapon do destroy doors (monmove.c, mthrowu.c, extern.h) -acid will melt away doors (zap.c) -rings of strength can now counter robe of weakness (attrib.c) -gauntlets of power and rings of strength can now work in tandem. (attrib.c) -gauntlets of power will now only counteract effect of robe of weakness. (attrib.c) -pickaxes now have a bonus against statue gargoyles and stone golems (weapon.c) -wands of digging now affect earth elementals, xorns, statue gargoyles, stone golems and boulders. (dig.c, zap.c) -can now quiver secondary weapons and wield quivered weapons (wield.c) -spell cure sickness, Healers' and Knights' special ability will remove slime. (spell.c, cmd.c) -not penalized for trying to reinforce a spell that doesn't need to be. (spell.c) -did all kinds of funny things to hopefully fix the "bad monsndx" bug. -removed messages -changed variable from a permonst pointer to an int PM array # -moved variable...was conflicting with mextra array (timeout.c, makemon.c, monst.h) -eroded and other adjetives can have funny caps now when wishing (objnam.c) -Thiefbane should now exist as an artifact weaponand wishable (objnam.c, artilist.h) -changed Lord Vlad the Impaler to Count Dracula. Yes, I know they are related, but one is fiction, the other is real. Plus, this helps keep them slightly apart. (monst.c, monsters.txt, slayer.des, questpgr.c) -spoon named Houchou is a chaotic artifact - 9999 damage when thrown and hits :) (uhitm.c, dothrow.c, weapon.c, mthrowu.c) -spoon is now normal object - no special abilities. -'\' shows intrinsic and discoveries on same screen - intrinsic knowledge is prefixed with a "*" (o_init.c) ver 0.0.3E6 [June 04/1998] -will no longer see correct name for priests, minions, angels when hallucinating (do_name.c) -valkyries now get a +1 spear rather than a long sword (u_init.c) -monks no longer get spellbooks of sleep - spellbooks of resist sickness instead (u_init.c) -'\' command now also shows "Intrinsic" knowledge -can now wish for Graywand, Staff of Withering, Hand/Eye of Vecna, Stake of Van Helsing, Wallet of Perseus, Medallion of Shifters (objnam.c) -can now wish for an aklys (objnam.c) -made w_swapwep and w_quiver 0200000000L and 0400000000L hopefully remove problem of randomly occurring (secondary weapon) and (in quiver) (obj.h) -removed tempwep - unused (wield.c, worn.c, decl.c, decl.h, obj.h) -added keyboard accelerators to slamfaq.txt -"bad monster weapon" bug when corpse wielded by a monster rots away fixed (dig.c) -exploding wands of polymorph and drinking potions of polymorph no longer cause polymorphing on Blackmarket level (potion.c, apply.c) -"let me run run my fingers through your hair" succubus message fixed (mhitu.c) -the "Strange...nothing much happens" when 'B' quaff potions no longer id's the potion. Message is now standard nothing happening message (potion.c) -only burning explosion destroys player corpse (explode.c) -death by exploding monster is now recorded correctly (explode.c, mon.c) -problem with petshop shopkeeper's names fixed? (shknam.c) -dipping objects into potions of polymorph now causes object polymorphing (potion.c) -version (normal and extended) now display game name as per DEF_GAME_NAME (defined in patchlev.h (or patchlevel.h)) (makedefs.c) -pc versions now have "Welcome to DEF_GAME_NAME" as defined in patchlev.h (pcmain.c) -made guidebook short name #ifdef SHORT_FILENAMES (global.h) -added Title bar changing for DOS boxes under Win95 (pcmain.c, msdos.c) -system shock now does damage to monsters rather than just killing outright -polymorph traps can now cause system shock (trap.c, zap.c) -polymorphed monsters will revert to old forms after a period of time -potions, spells/zaps, traps (extern.h, timeout.c, zap.c, light.c, trap.c) -graves should no longer in "unique" rooms (mklev.c) -save_prompt has been merged with keep_save...however, use with caution. It seems that there are buglets in the save/restore code... (save.c) -bullwhip won't be able to yank out cursed weapons (apply.c, muse.c) -replaced mine levels with 3.2.2 levels. Removed minefill.des and mineend.des (mines.des, dungeon.def) -monsters will no longer wield non-petrifying corpses. (weapon.c) -troll mummies leave troll corpses (mon.c) -eating petrification egg now results in correct final screen message -artifact wishing is back the way it used to be (objnam.c) -the inventory accessible by the '*' key now has the right appendages when polymorphed (invent.c) -monster casting spells will no longer create pools of water on top of pools of water, altars, clouds or in the air. (mcastu.c) -wands of create horde will act similarly to wands of create monster if applied/exploded (explosive blast will be 2x stronger though) (apply.c) -let you loot a chest on top of a grave (pickup.c) -characters with intrinsic/automatic special powers no longer lose a turn. (cmd.c) -monsters hitting monsters take silver, stake damage (mhitm.c) -monsters hitting you with stakes do bonus damage if you're vampire (mhitu.c) -fixed bug where monster name and corpse name were mixed up with monster hitting you with corpse (mhitu.c) -monsters use stakes (weapon.c) -Stake of Van Helsing always has 1/20 chance of vaporizing vampires (uhitm.c) -Ogre king is now level 9 (monst.c) - used to be 7 (same as Ogre Lord!) -removed save_prompt as it was causing savefile problems (save.c) -'B' should no longer get spellbooks from praying. (pray.c) -chickatrice grows into cockatrice, hatches from cockatrice eggs. (mondata.c) -master mind flayer get mental blast and telepathy (polyself.c, cmd.c, monmove.c, allmain.c) -Rodney summons -vamp mages rather than lords -master mind flayers rather than mind flayers (wizard.c) -vampire mages leave human corpses (mon.c) -piles of killer coins will "grow up" to large and huge piles (mondata.c) -fixed applying wands of enlightenment (apply.c) -fixed inventories so ice mage/flame mages can't have doubled spellbooks (u_init.c) -more fixes from Max -fixed spell % success inconsistencies (spell.c) -fixed bracketing and casting (apply.c, artifact.c, ball.c, botl.c, cmd.c, detect.c, do_wear.c, dog.c, dogmove.c, do_throw.c, eat.c, engrave.c, explode.c, files.c, fountain.c, hacklib.c, invent.c, makemon.c, mhitu.c, mkobj.c, mon.c, music.c, objnam.c, options.c, potion.c, pray.c, read.c, sp_lev.c, trap.c, uhitm.c, wield.c, worn.c, zap.c -limited "chain combo" of 'L' to 4 hits (give the enemy a chance to dodge) (uhitm.c) -added more extern fcns (extern.h) -prototypes (hack.h) -added SVR4 to machines that need msleep(k) redefined (unixconf.h) -tweaked special ability durations again (cmd.c) -fixed turning to stone when engulfing. Forgot a ! in an if statement ;B (uhitm.c) -remove extra period in "caught himself in his own ...." (explode.c) -'c' is always lawful (u_init.c) -'u', 'v' weapon id special ability no longer crashes when attempting to id non-weapons (cmd.c) -optimization has been dropped to O2 to prevent compile errors (makefile) -snuffing out candle of eternal flame - used wrong object variable (apply.c) ver 0.0.3E5 [Apr 30/1998] -Doppelgangers have a 1:20 chance of becoming a "new man" rather than 1:5 (polyself.c) -can no longer wield a pickaxe by applying if holding a shield. (apply.c) -made all character classes level 10, and just G_NOGEN -change to no special gen flags? (monst.c) -bad food has been moved before worm tail so that it will be randomly generated in the dungeon (monst.c) -if you are polymorphed as green slime, sliming has no effect -you get to passively respond to sliming -if fire elemental, fire vortex - Immunity (mhitu.c) -ghouls will no longer eat stoning corpses, riders(!!) (eat.c) -fix cockatrice, basilisk, chickatrice and pyrolisk (and eggs) -eat corpse: pyrolisk no longer stones, basilisk stones -eating eggs: basilisk, chickatrice, asphynx now stone (eat.c) -throwing: eggs, corpses - basilisk, chickatrice, asphynx now stone at self (dothrow.c) -pets will no longer eat corpses, eggs (dog.c, dogmove.c) -touching corpses (invent.c) -monsters attacking each other with corpses (mhitm.c) -tinning (apply.c) -wielding (do_wear.c) -monsters picking up without gloves, eating (mon.c) -monsters regurgitating, attacking you with corpse swallowing (mhitu.c) -picking up corpses (pickup.c) -monsters stealing corpses (steal.c) -no killer == by petrification (timeout.c) -touching after falling -players and monsters -untrapping (trap.c) -gloved monsters will look for petrifying corpses (muse.c) -monsters will wield all petrifying corpses (weapon.c) -wielding petrifying corpse w/o gloves == stoning (wield.c) -kicking petrifying corpse stones (dokick.c) -eating petrifiers, throwing eggs, hitting with corpse (uhitm.c) -if polymorphed in to a biter/tentacle/kicker, will not use touch attack if wielding a weapon and attacking a cockatrice. Same for monsters wielding weapon but also having hth attacks. (eg. mind flayers) (uhitm.c, mhitm.c, mhitu.c) -fixed selfpolymorph into silver dragon not giving reflection silver dragon armor gives protection from god lightning and monster defensive gaze attacks (mhitu.c, zap.c, pray.c, uhitm.c, youprop.h) -for some reason, Wizard Patch made the probability of being hit by a wand always 15/20. Now based on AC (zap.c) -you will now die if polymorphed and hit by a wand of death/disintegration blast. Fixed bug in losehp that 'return' before the check for negative hp if poly'ed (hack.c) -losehp no longer does damage to your original hp if polymorphed (hack.c) -eating mimick corpse used to always end with " prefer mimicking a human" even when polymorphed. Will also catch gnomes as well now (eat.c) -dark elven equip do MUCHO more damage in the hands of elves - especially during special ability... (uhitm.c) -fixing the dropping some of quiver/secondary weapon unwields all standard 'd'rop and traditional 'D' (invent.c) -bugfixes (A big thanks to Max for sending me a patch containing almost all of this of this - all I did was check do a couple small corrections or changes!) function declarations, unused variables, typedefs variables not correctly casted, brackets - major code cleanup!... -fixed/added some prototypes (extern.h, system.h) -removed unused var temp (allmain.c) -fixed casts -fixed brackets (apply.c) -corrected prototyping, sprintf syntax, casts (botl.c) -corrected fcn declarations -removed unused variable res in makemenu -junk_char in parse is now ifdef BORG (cmd.c) -cast fix (dokick.c) -volley count fix -cast fix -fcn declaration (dothrow.c) -fixed ambiguous brackets (eat.c) -made resist message nonambiguous resistance type -now showdmg as per uhitm (explode.c) -added prototypes for redirect, docompress -made filename, mode in redirect and docompress const char (files.c) -losehp does no dmg if invulnerable (hack.c) -missed check for accessing null variable in new menu access UI (invent.c) -bracketing (makemon.c) -survive poisin if invulnerable (mon.c) -fixed casting in askchain (pickup.c) -monsters can resist !oPoly (potion.c) -added a declare for god_gives_pet (pray.c) -added fcn declare for read_grave -made epitaph a const char (read.c) -made variable fd in dosave ifdef KEEP_SAVE (save.c) -removed unused variables -added correct casting for various variables, arguments (shk.c) -removed unused vars cl, buf (shknam.c) -added declares -removed unused variables (spell.c) -added declare for write_timer (timeout.c) -made *fmt static const char from static char (topten.c) -added fcn typedefs -fixed martial_dmg - doesn't need params -added ifdef SHOW_DMG to polymorphed player attacks -fixed monster damage taken twice. (uhitm.c) -fixed casting for null argument of view_from (vision.c) -added some typedefs -fixed "no ammunition" message -rearranged readyweapon to catch null wep first (wield.c) -removed unnecessary variable buf -replaced long string of if comparison with strchr with (u_init.c) -bracketing, static fcn declare -removed unused variable int i in zapping fcns -explosions now show monster dmg -survive disintegration/death zaps if invulnerable (zap.c) -removed unused variable (char buf) (wintty.c) -fixed prototypes (unixmain.c) -added prototypes (unixunix.c) -removed unused variable (makedefs.c) -added SHOW_WEIGHT option (flag.h, options.c, objnam.c) -should have fixed the problem with encumber messages appearing at the beginning. (attrib.c) Tough nut to crack - one of the things that only appears every now and then, and you can't tell that it's broken until it appears again. Pink Elephant. -added grave, toilet symbol positions to dungeon option definition (guideboo.txt, guideboo.mn, guideboo.tex, nethack.cnf) -monsters using unicorn horn message fixed. Is now "xxx uses a unicorn horn" rather than "xxx uses a unicorn horns" (muse.c) -you will at least throw one of an object when you throw. Unskilled used to be completely unable to throw objects. (dothrow.c) -gas spores no longer explode as wands (as food;B) (mon.c) -fixed damage sustained in retributive strike ('a'pplying wands) and double damage in explosions. (explode.c) -armor falling off will no longer disappear (polyself.c) -fixed config file not detecting system properly (file.h) -added more tiles courtesy of Dirk! -monadic deva, astral deva, Planetar, Solar, storm giant, ghast, bar-igura, chasme, babau, nabassu, gila monster, basilisk, komodo dragon, High Lycanthrope have tiles!! (monsters.txt) ver 0.0.3E4 [Mar 31/1998] -fixed the god giving gift (spellbook/sword) messages. (pray.c) -Tsanth code patches: -dimasber now exercises twohanded sword skill (weapon.c) -dimsaber now acts as a +4 weapon (uhitm.c, mhitm.c) -dimsaber now burns engravings (engrave.c) -'D' or 'L' no longer destroy armor when taking it off - the message said the 'D' or 'L' took off the armor quickly, but the code destroyed it ;B (polyself.c) -the duration for 'L' and 'B' is quite reduced at higher levels (used to be 30+ turns long at high levels!). Increased length of 'E' and 'S' specials slightly (cmd.c) -Doomblade, Staff of Withering are now aligned to starting 'L' base. (artifact.c) -"MU GETSU NO RAIGUMI!", Shermie from King of Fighters '97, is now the lightning yell. -"RUPUSHI KAMUI EMUSHI-TOITOI!", Rimururu from Samurai Shodown is now the cone of cold yell. Hope I got it right ;B (zap.c) -Gauntlets of Power no longer make you weaker if you had base 19+ strength (attrib.c) -acid worms are now stone resistant, and confer stone resistance. (monst.c) -proper removal of wielded secondary weapons/quiver when you eat, it rots away, etc. (dig.c, eat.c, steal.c, trap.c) -you can also multithrow daggers now when skilled or up (dothrow.c) -fixed bug where dropping some but not all of a wielded item (in quiver or secondary weapon) unwielded it. (do.c) -updated the dedication (Pillars of Strength) in this document -fixed the filename for the guidebook. Is now guideboo.txt for msdos (problem accessing from menu) (global.h) -fixed wrong message appearing when Envoy of Balance and receiving objects (pray.c) -changed the elven damage during special use is +1 if using normal arrows +2 if using elven (uhitm.c) -monsters casting lightning strike now call lightning strike special fx code (mcastu.c) -[xx pts.] damage display does not show up for explosions if option is not set anymore. (explode.c) -Valkyries can now go to Expert with Matter spells (u_init.c) -slashem website can now be reached at http://slashem.home.ml.org -fixed bug that caused a crash when firing arrows and running out of ammo ;B (dothrow.c) -strength adjustment really is quiet now ;B (u_init.c) -removed leftover debugging code that was putting "6" at the beginning of message history. (dungeon.c) -New STORM capability for lightning, fireball, and cone of cold If you are skilled, or have the respective resistance, or are of the class type V, F or I respectively, if you Zap the spell at yourself (hit '.') you cast the "storm" variant of the spell. Pretty much, instead of a beam, you get a whole bunch of explosions in the area around you. (zap.c) -when "unpolymorph", you have 1/2 full hp (polyself.c) -fixed bug that made gold show up only when showscore is on (botl.c) ver 0.0.3E3 [Mar 04/1998] -Acknowledgements added. Let me know if I spelled your name wrong, or I forgot someone ;B To all those people who bothered to tell me SLASH'EM is broken. -Linux support is officially included! Go to the sys/unix and follow directions in there for setting up for Unix. Don't forget to uncomment the right unix type in unixconf.h (namely LINUX, although other Unices should be fine too...) I don't personally have any way of verifying whether this works, but I hear that it should be fine ;B (whole bunch of directories) Also includes Qt and X windows support. -fixed problem where not wearing gloves when hitting monsters caused a page fault. I'm learning a bit late to be careful with NULL pointers... (uhitm.c) -fixed problem causing bigroom from not being created properly (dungeon.def) -Undead Slayers starting with 2 wooden stakes bug corrected (u_init.c) -Elves have a new special ability - they do +2 damage on arrows and shoot 2 extra arrows for 1-3 turns. (elven equip.) or 1 extra shot if non elven bow and arrows. Replaces weapon practice. (dothrow.c, cmd.c, uhitm.c) -added spoon handling code just in case monsters decide to throw it (mthrowu.c) -monsters will now use dark elven arrows, short swords and bows silver dagger given more priority (was after rocks!) (weapon.c) -monster elves, samurais get multiple shots with their special weapons elven bows and arrow, yumi and ya. Monsters using elven equip get extra shots as per players (mthrowu.c) -fixed bug that kept monsters from shooting ya (bamboo arrows) -fixed bug that crashed shopkeepers' menus if you hit 'esc' to quit them (shk.c) -reworked the throwing code. Added multiple bow/weapon throws for anyone with more than basic skill. You throw an extra object for every level above basic, and another extra one if you're a samurai using yumi and ya or an elf with elven bow and arrow. Extra throws for using elven equip (dothrow.c) -fixed bug where dropping secondary weapon when polymorphing caused a crash -redid the hallucination objects code (objnam.c) to be more reasonable -added Tsanth's modifications: Perseus' Silver Wallet: Artifact super BoH 4x wt cursed /3 wt normal /6 wt blessed with rudimentary tile the dimsaber - neutral lightsaber new tiles for dark, light and dimsaber the spoon - FF2 thrown weapon that does 9999 dmg (with tile) wizard mode AC gain, invulnerability Exact modifications are in slamfaq.txt -added Tsanth's petname code. Now you can specify the name of your first badger, bat, ghoul.... (opthelp, opthelp.des, decl.h, decl.c, dog.c, files.c, options.c guideboo.tex, guideboo.mn, guideboo.txt) -fixed a bug I caused by commenting stuff out in mkobj.c that was creating double corpses. And I thought I was being smart ;B ver 0.0.3E2 [Feb 21/1998] -redid and updated the menusystem (cmd.c) -fixed silly bug in hmon() (uhitm.c) that caused DPMI crashes under DOS DPMI -skillled spellcasters can cast spells without enough power by suffering hp loss. This will abuse wisdom if you're not Expert level (spell.c) -updated the docs (guideboo.mn, guideboo.tex, hh, cmdhelp, help) with the new '`' and '*' commands -hitting esc in a submenu brings you back a menu (func_tab.h, cmd.c) -bug fixes: -fixed damage showing up during kicks even if showdmg isn't on (dokick.c) -fixed polymorphing into new man not updating vision (polyself.c) -fixed dmg display for kicking (dokick.c) -got rid of the "musical notes" in command help. cmdhelp needs to be flip -u (unix style end of line rather than DOS style carriage returns and linefeeds) -fixed problems with boulders, hallucination is better (objnam.c) -fixed Monks dmg going down to 10 pts at reaching grand master of martal arts before exp level 16 (uhitm.c) -made patch file using diff -c -r -N. All future source code releases will probably be in this format. ver 0.0.3E1 [Feb 16/1998] -there is a "more" at the end of the firing of a beam weapon to let you enjoy the effects ;B (and take in the damage) (zap.c) -adding menu system accessible by the ~ or ` key (cmd.c, func_tab.h) -the weapon selection screen removes swapwep and quivered weapons from wield list, like the primary weapon is normally removed (invent.c) -adding Angband style inventory done by "body part" Currently an elaborate hack ;B (cmd.c, invent.c, do_wear.c) -the FPU coprocessor emulator is now linked into the executable. -added -lemu to the linker flags -should now allow 486sx and lower machines to handle things properly (makefile.gcc) -enchanted gloves +ses (and -ses) add to barehanded combat damage -added alternate spellings to pick-axe - pickaxe and pickax the right way to spell it IMHO ;B (objnam.c) -enchant armour catches negative enchantments as per positive enchants for those silly people who try to enchant beyond -127. Now paralels the +ve case. (read.c) -Since everyone should be in the credits, I've shortened the intro screen and and modified the copyright banners (wintty.c, patchlev.h) -added Nathan La to the credits. Reordered the credits properly so that SLASH'EM came after SLASH (silly boo-boo) (guideboo.mn, guideboo.tex, guideboo.txt) -mall level now has at least one guaranteed (random) shop. (mall-1.des, mall-2.des) -bug fix: if polymorphed into a form that hates silver or a lycanthrope, "silver sears your flesh" and dmg bonus done properly (mhitu.c) [used to be only class 'L' players were checked, and only for lycanthrope. Now follows hates_silver and lycanthrope check] -breaking wand of death will create a "sphere of death" rather than disintegration field (explode.c) -Fixed the stat.h reference in files.c - should fix a Linux bug -replaced nethack references/e-mail in junk mail with my e-mail and SLASH'EM ver number (mail.c) -wishing now accepts abbreviations (BoH == Bag of Holding) (objnam.c) -minor update to text documentation (guideboo.txt, slashem.txt) -hit messages for monsters using beam weapons fixed e.g. yellow dragon acid breath (zap.c) -monks can start with a spellbook of protection rather than force bolt (u_init.c) -generic direction prompt has a list of possible directions, to match the digging prompt. (cmd.c) -fixed the score display on the bottom line. Score should now show up only once, and only if showscore is TRUE in the config -fixed the Xp display. the showexp option is now active again -the [xx dmg] and (xx dmg) are now activated by the showdmg config option (hack.c, uhitm.c, mhitu.c, options.c, flag.h, makedefs.c, config.h guideboo.tex, guideboo.mn, guideboo.txt) ver 0.0.3E0 [Jan 30 1998] -Added new names for various Doppelganger levels -Copier x3, Shifter x2, Changer x2, Adept Changer, Master Changer -now Copier, Duplicator, Modifier, Shifter, Clone, Reshaper, Manipulator, Adept Changer, Master/Mistress of Forms (botl.c) -Monsters have more (default) inventory (makemon.c) -Hobbits (monster) with slings also have rocks to throw now ;B -have a chance of wearing leather armour if not wearing elven mithril -Ogres get clubs if they don't have axes -All orcs have at least an orcish dagger -Mordor Orcs get 1:3 chance of getting orcish spears -Goblins get orcish shortsword 1:3 -Hobgoblins get either morning star 1:3 or 1:3 orcish short sword -kobolds get javelins 1:4 or darts, short sword 1:4 or dagger -mind flayers get robes 1:2 -master mind flayers get robes of protection 1:10, robes of power 1:10 or else robes -you get the [xx pts.] damage report from all calls to losehp() eg thrown weapon damage (hack.c) -if invisible and teleported into a shop, you are allowed to leave (shk.c) -when polymorphing - "feel like a new elf/man/woman" now added gnomes -as well, gnomes polymorphing into gnomes become new gnomes (polyself.c) -Reworked the monk attack code again. (uhitm.c) -Bug fix: Monks should now gain experience in martial arts -All martial arts users get extra damage, Monks can just do more damage (eventually) Martial Arts and: Monk and Grand Master 6d4 Grand Master 5d4 Master 4d4 etc.... Basic 1d4 -Undead Slayer inventory changed (u_init.c) -now starts with wooden stakes -matched with whip +2 or silver spear [Castlevania] 25%/25% or crossbow [Buffy] 50% -silver daggers or crossbow bolts -helmet or low boots +1 -chain mail or leather jacket +1 -reworked kicking damage -includes bonuses due to +ses on boot -kicking boots, rings of damage, +ses will do (some) damage against thickskinned animals (eg dragons) (dokick.c) -made bare handed combat and martial arts separate skills (you.h, weapon.c) -wooden stakes now use the dagger weapon skill, and are piercing weapons. -if you are an expert with the dagger or an undead slayer have a chance at plunging the stake into the heart of the vampire, which will kill it instantly and vape the corpse (uhitm.c) -Gnomes start with more equipment: -short sword, aklys, hammer -crossbow or sling w/ bolts or rocks -Flame/Ice Mages, Necromancers start with +1 blessed quarterstaves, spellbook force bolt (u_init.c) -pets will no longer eat own species unless starving. (dog.c) -reworked the weapon swapping code -quiver, secondary weapons init properly (u_init.c) -no weird inventory names when failing to swap to a 2-handed weapon from a single weapon and shield (wield.c) -DOS binaries now compiled using PGCC 1.0.1 -the tile files are now "absorbed" into NHDAT. The files *.tib are redundant now ;B. (dlb.c, dlb.h, pctiles.c) -bug fix: -FATAL BUG fixed: ball and chain on Water Level (Endgame) used to cause crashing (dungeon collapsing) Fixed. (mkmaze.c) -MAJOR bug:-The game used to crash if you hit esc, space in the spelluser's special ability menu. Fixed (spell.c) -spellusers' special abilities should no longer crash/ cause errors. (spell.c, cmd.c) -fixed healing spells showing up with a class "restore" in Zap menu. now "healing" (spell.c) -bug fix: Shopkeeper will get mad at people escaping the shop even if unable to stop them from leaving or grabbing their backpacks (shk.c) -Wearing a wielded ring will take it out of your hand You used to be able to both wield and wear a ring (do_wear.c) -the "new strength" message has been disabled (u_init.c) -Candle of Eternal Flame now has an eternal flame -fixed the "partly used" in description (artifact.c, apply.c) -In the shopkeeper's menu, 'uncurse' is now spelled correctly (shk.c) -noartifactwish (defined by default) now stops ALL artifact wishing -undefining noartifactwish will let you wish for limited artifacts (objnam.c) ver 0.0.2E9 [Jan 17 1997] -included CWSDPMI (for the pure DOS users) -binaries now compiled with PGCC 1.0 -NOTE to PGCC users: -To get this going, I had to stubedit the PGCC cc1.exe to a stack size of 768k from 256k -The stack size of the the DJGPP cc1.exe is 768k -This binary is now Pentium optimized, with an optimization level of O6 (for those of you who don't use PGCC, that's the maximum optimization. To compare, gcc was optimizing before at O2. The original makefile optimized at O1) (makefile.gcc) -Added Skill type headings in the skills list (weapon.c) -wand beams will now clear when bouncing back, so that you can see the bounce (zap.c) -wands of lightning will always explode if used underwater, except if the wand is blessed. (zap.c) -cursed wands will blow up MUCH more frequently -explosion is done similar to breaking the wand (zap.c, apply.c) -Sunsword, Holy Spear of light are now a light source -slight bug - once created, they are NEVER deleted (just hidden) -It's not really a problem, as you can't turn them off ;B -only minor thing is if there end up being a lot of artifact lights, this could become quite draining on resources for slower comps. (artifact.c, mkobj.c, light.c) -Toned down the monk. He got to be a bit powerful at high levels. -His base damage is maxxed at level 16 (6d4 + 2) (uhitm.c) -max AC bonus of -11 (due to level) (do_wear.c) -fixed makedefs -f to not use strlwr. Changed some defines.(makedefs.c) -weapons/objects with names that have "holy" in them can be wished for (mostly artifacts). Holy no longer means blessed (objnam.c) -old feature: changed the name of some constants -weapon.c, you.h, spell.c, u_init.c -added explosion tiles/colored chars for lightning and death/disintegration (lightning is white, death is grey on tty nontile) (other.txt, explode.c, rm.h, drawing.c) -Necromancers start with quarterstaff (u_init.c) -redid the bouncing code so that bounzing 'zaps' don't go into walls. Looks nicer ;B (zap.c) -bug fix: -plugged up an object leak in studyspell (spell.c) -make spotless now deletes the filename.h (since it will be generated automatically by makedefs) (makefile) -problem with spellcasters starting with a blank spell read.(u_init.c) -explosions are properly clipped for walls/corridors (explode.c) -Flame Mages, Ice Mages, Necromancer get Wizard bonus for breaking wands -(damage /10) (explode.c) -light sourcing for effects -light sourced zap, explosion for lightning and fire spells -light sourced camera flash -could be computer intensive, so I made it a compile-time option -#define LIGHT_SRC_SPELL in config.h -this had better work...tough to implement! -I had to add another light source type - LS_TEMP -BTW, I went to the elemental plane of fire and stressed tested the light sourcing code. Thing still flies on the Pentium. I do have to note that the "on-the-fly" light sourcing is very neat. Kudos to the person who did the vision system ;B (vision.c, zap.c, explode.c, config.h, vision.h, display.c) -executables now compressed with DJP - exe is a little less than half previous size! (makefile) -when invoked from cmd line with -?, etc, usage no longer includes .exe after game name -stubedit now supplies an argv0 w/o .exe argv0=$(GAME) [in (makefile)] -when blind, differentiates between nearby and distant zaps (muse.c) ver 0.0.2E8 [Jan/07/1998] -Flame/Ice Mages have weapon skills severely curtailed. -Flame Mages now use primarily small-medium blades -Ice mages use stabbing(piercing) weapons -neither have any more ability in bows, etc. (u_init.c) -fireballs are now bolts rather than streams (spell.c) -the FAQ has been updated with the NHPlus changes. It should now cover nearly all the changes due to SLASH (and its predecessor NHPLus) and Wizard patch. (slamfaq.txt) -increased lights/fire vortex to cast light at range 3, fire elementals at range of 2. Since my computer just zips through SLASHEM, mail me if you encounter performance problems. (mondata.h) -The vision tables are now defined. Supposed Performance boost (I can't tell...This game always flew on this comp) (config.h) -config file is now SLASHEM.cnf. -makedefs now constructs filename.h using -f which defines filenames -actual game name is in patchlev.h -affects the config file, tile files (filename.h [new file in \include], file.h (new file in [\include], files.c, makedefs.c, patchlev.h) -blessed scrolls of genocide now have menusystem. access by typing '?' (read.c) -added message for monsters clawing- now "claws you!" rather than just "hits!" (mhitu.c) -bug squash: (mostly from reading old r.g.r.n news) -'a'pplying wand of fireball now has correct effect as well, applying a wand of fire or fireball does NOT identify the wand, but does as if you wish to name it (apply.c) -genocided monsters wearing amulet of lifesaving but not visible no longer generate a message. (mon.c [lifesaved_monster]) -rust monsters now work properly - will only attack nonmetal items or your main body. (mhitu.c [hurtarmor]) -elbereth engraving now repels monsters again. If you don't want to use it, just remove the define elbereth/don't use it ;B (mon.c, monmove.c) -"pile of coins" message for evil food and "piece of food" for evil food mixup fixed. (drawing.c) -handling of riders and disintegration (especially Death) improved -riders were absorbing disintegration blasts -Death was getting HP reduced to 1 -Death now gains HP as per original code (zap.c) -F1 now invokes help (pckeys.c) -setup.bat now copies makefile.doc to the doc directory (setup.bat) -optimized compiling now. Compiler uses -O2 compiling rather than -O -Linker uses -s, removing symbol tables -.exes are smaller, supposedly faster. (makefile.gcc/makefile) -failed stealing, most special abilities now take a turn (cmd.c) -silver daggers are now piercing weapons ie. can now be thrown w/o penalty. (objects.c) -players start with spells in spellbooks memorized. (spell.c, u_init.c) -players now start with secondary weapons wielded, ammunition in quiver (u_init.c) -pressing ^P twice consecutively will bring up message history tty port only. (topl.c) -the shell was accidentally commented out (PC ports) Can now shell out to commmand.com, etc. (pcconf.h) -executable is now slashem.exe, with a corresponding slashem.txt based off nethack.txt,command line help, etc. (makefile.doc, slashem.6, makefile, pcmain.c) -can access guidebook from help menu (pager.c, global.h) -monsters can now use wand of fireball (zap.c, muse.c) -makefile now moves the readme to the game dir (makefile) ver 0.0.2E7 [Dec/20/1997] -added history of SLASH'EM and predecessors -SLASH, Wizard, Nethack Plus, Nethack--(history, guidebook.mn) -begun updating documentation -added keyboard commands (M-b, M-e, M-k, M-q, M-y, Q, x, f) -synchronized with help files -Options (keep_savefile, save_prompt) -Character bios for the slash classes -added more info on #enhance (weapon+spells) -weapon swapping, quiver/fire (guidebook.mn, guidebook.tex, help, cmdhelp, hh, msdoshlp.txt) -Added makefiles for the documentation. Note that to compile the .txt docs you either need GNU Groff (DJGPP has a port) or nroff and col (makefile.doc) -discovered that makefiles require real tabs, and EDIT doesn't do tabs. Looks like a job for NOTEPAD ;B -version display registers borg, invisible objects, keep_save and noartifactwish compile-time options (makedefs.c) -changed the prompt in monster special power to "You aren't a monster" rather than "you don't have a special ability" since SLASH characters have special class effects.(cmd.c) -keep savefile compile time option -grouped under #define KEEP_SAVE (config.h) comment out to compile without this option. -keep_savefiles [FALSE] This is a bit controversial, but it defaults to FALSE and purists will play it that way, for the true challenge. (files.c, options.c, flag.h, opthelp) -save_prompt [FALSE] Only useful with above defined TRUE. Prompts for quit after save. (save.c, options.c, flag.h, opthelp) NOTE: This is experimental, so I wouldn't mind feedback on whether it works. Mail me! (wac@intergate.bc.ca) -Changed some skills for Undead Slayer class (u_init.c) -made spear skill Expert rather than Skilled Slayer artifact is a spear, after all -made dagger skill expert too, since it's a starting weapon -made crossbow skill Expert - Dracula movies -changed bare handed basic to martial arts master - Buffy the Vampire Slayer -Added whip Expert - Castlevania -made club, flail, mace, morning star, hammer, quarterstaff Skilled from Expert to balance -removed Trident skill - from Skilled to Restricted -removed Lance skill - from Basic to Restricted -fixed the offsets for #enhance skills screen (added missing brackets). #enhance screen should be now properly aligned even when there are some skills available to advance. (weapon.c) -fixed the engulfing colors (my mistake..i turned some of them blue) (other.txt) -when summoning undead, people who know how to command undead will automatically cast that as well. (read.c) -'E','U','V' special ability also practices the with weapon. Increased the delay between uses as balance. (cmd.c, weapon.c) -'A' now has the identification ability. (the old spellcaster special ability). He recognises objects from past research. (cmd.c) -'N','F','I' and 'W' special ability is now study spells. Saves wear and tear on those spellbooks. (cmd.c) -bug fixes for 'Slashing ability' - you can't extend claws when 'L' and polymorphed. Think of it as needing your "human" bone structure. (cmd.c) -retract claws when swapping to a weapon. (wield.c) -message is now "fingernails extending to claws" Thanks Ben Newall (ben@eki.com) (cmd.c) -In #enhance skills menu - will keep calling the menu if you can enhance more than one skill. Saw a comment at the top and implemented it. (weapon.c) -Added "yell" preceding successful megafireball cast. "Kamehameha" for magic missile, "Shinkuu Hadouken" for fireball and "Gessho Suityaha" for cone of cold. (Now, where could these have come from. Haven't been playing SF vs Xmen/Samurai Shodown ;B ) (zap.c) Actually, I wouldn't mind more appropriate "yells" (esp for cone of cold). Feel free to submit. -In Wizard MODE: can now advance skills without practice. For debugging the fireballs (Yeah right ;B) #enhance will now prompt for whether you want to advance skills without practice. (weapon.c) ver 0.0.2E6 [Dec/09/97] -fixed the wand of fireball zapping green. It should now be a more "normal" red. (zap.c) -Added a magenta magical explosion. Note that the cold explosion, magical explosions are also visible as different colored ASCII characters for those of you who use colored IBM char set. If you use b&w, this won't change much. (explode.c, rm.h, drawing.c) -fixed some silly glyph things: whenever a shield glpyh/tile came on during an explosion, Nethack would replace it with a normal explosion glyph - even if it was a cold explosion. (explode.c) -Added Mega Magic Missile/Fireball/Cone of cold: For those who complain that spells just aren't powerful enough, here's the spells for you. When a wizard is skilled in matter spells, he will no longer cast wimpy wandlike bolts of fire/cold/magic missiles. He will fire a blast 3 times as large and 3x as strong. These are powerful spells - do not play with these! --As a technical note, what I've done is taken a standard fire/cold bolt/magmissile and caused it to explode every step of the way... (spell.c, zap.c, explode.c) As a matter of note, I hope to add "enhanced" versions of all the spells, but I wouldn't mind any suggestions. I'll probably put the old super fireball/cones in as spells. -fixed the explosions...I had accidentally replaced the normal fire explosions with the cold explosion tiles. (other.txt) -'L' now has a new special ability - slash! Based loosely off Wolverine's Berserker Barrage (arcade ;B), you have to be empty handed to use. When you attack your next enemy, you will go into a similar state as when you go berserk, except the enemy can't hit you back. Note that you have to land a hit before the barrage starts, and while you're attacking, you can still be hit by other monsters. If you wield a weapon, you will retract your claws. (timeout.c, uhitm.c, cmd.c, wield.c) -Added timeout message for special abilities 'S', 'B', 'L' (timeout.c) -Dirk Schönberger is proud to present you with another set of tiles! (monsters.txt) ver 0.0.2E5 [Nov/22/97] -Added even more of Dirk Schönberger (shoenberger@signsoft.com)'s monster tiles! The ghouls no longer look like ogres! As a bonus, dotted the o in his name now! (monsters.txt) -Magic users' special class effect now calls the standard identify routines (cmd.c) -undead can now resist Command Undead spell - message now for successful commanding (read.c) -Necronomancers have a chance to command undead when summoning undead -spell + scroll (read.c) ver 0.0.2E4 [Nov/15/97] -Shopkeepers can now improve your tool-weapons (ie unicorn horns, pick-axes can be enchanted/rustproofed/poisoned) (shk.c, invent.c) -Added Dirk Schönberger (shoenberger@signsoft.com)'s new monster tiles! LOTS and LOTS of additions - Thanks Dirk!! (monster.txt) -Added poison blast [attack], acid stream spells [matter] (objects.txt, objects.c, spell.c, zap.c) -Valkyries' special spell is now Lightning, rather than cone of cold (u_init.c) -Master key of Thievery should not break off in locks anymore! (Side Note: This ISN'T true of the Platinum Yendorian Express Card...) (lock.c) ver 0.0.2E3 [Nov/08/1997] -Added bolt of lightning spell/tile for spellbook (HI_PAPER spellbook)! (Side note - to prevent problems in recompile whenever new tiles or objects are added, touch *.* in the src/ directory) (objects.c, spell.c, zap.c, objects.txt) -'W'ear command now puts on amulets, rings and blindfolds. -Once you are "skilled" in a certain spell class, all effects paralleling scrolls act the same as blessed scrolls (all spells, rather than just remove curse) (spell.c) -healing spell class bonus applied to the general healing spell class rather than specific spells -Fixed credits again! Added Warwick Allison (warwick@cs.uq.edu.au) (readme.txt - this file!, wintty.c) -Changed version number to fit Nethack scheme (patchlev.h) -fixed keys in dos help file - added/fixed alt keys for quit, skills, class effects(msdoshlp.txt) (you may need to delete nhdat to force a recompile of the help file) ver 0.22 [Nov/05/1997] -made menu accelerators for character class, alignment and gender lowercase (wintty.c, u_init.c) -added menu for Shopkeepers for other services (shk.c) -Necromancers are now Chaotic - raising the dead isn't exactly "neutral" (u_init.c) -Necromancers now have force bolt rather than turn undead. (u_init.c) -fixed a bug in the new menus - forgot to dismiss the windows. (u_init.c, wintty.c) ver 0.21 [Nov/04/1997] -Added tiles for cone of cold explosion. (drawing.c, other.txt, rm.h, explode.c) -Knights are given Alignment Lawful. used to be Neutral?? (u_init.c) -Figured out how the menus work! Now you get a nice menu for choosing character class (wintty.c), gender and alignment (u_init.c). -Added initial spell skills for Flame, Ice Mage, Monk and Necronomancer (weapon.c) ver 0.2 [Nov/02/1997] -Added and Revised spell skills for all the classes - skills should now make sense. (u_init.c) -Added spell skills for Caveman - stupid omission (u_init.c) -reorganised spells - hopefully the organisation is more understandable (spell.c) -"fixed" offsets for "Z"ap columns - do they look right? (spell.c) -fixed the credits. The e-mail for bug reports is now corrected on the main screen (wintty.c) ver 0.1 [Nov/01/1997] -Just released! -As far as I know, I've pretty much implemented all the features of the Wizard patch onto Slash E8 (except for the decreased power regeneration) -Changed files (from SLASH E8): extern.h, spell.h, you.h, allmain.c, apply.c, attrib.c , do_wear.c, dokick.c, objects.c, pray.c, spell.c, u_init.c, uhitm.c, weapon.c, zap.c +-------------------------------+ | Section 2: Warren's Storytime | +-------------------------------+ The tale of Nethack and I really doesn't go too far back. I remember downloading an old version of Nethack off some BBS way back in my early high school years. Played it a couple times, was wiped out really fast most of the time. Made it to the Gnomish mines. Must have been 3.1.3. Ran into Alphaman and a couple other roguelikes. Got deleted sometime. Early in Grade 11, I was poking around and I stumbled upon BW's (no, I'm not going to spell it wrong ;B) Nethack pages. Found 3.2.2, and played it for a while. Good fun, and the tiles let me know at a glance I was pounding away at, but I was playing around with QuakeC, so I figured I may as well put my little install of DJGPP to good use. Downloaded the sources, figured out how to fix the DOS makefile. Made one change, got bored, and it got lost the next time my HD needed pruning. Sometime at the beginning of 1997 (my graduating year), I ran into Nethack again. BW's page was still standing, and I got the game and the source. Ran amok a couple links, and came across Darren Hebden's Roguelike News page. Was reading some news items, and thought to myself "Hey! How come it's all this Angband stuff? I can't even stand playing Angband for more than 30 seconds. (Must have been that runin with the room filled with lice). Where's the Nethack mods?" So with a little poking around, I came across SLASH V6 4.1.2E8 and the Wizard Patch. They both looked neat. I wanted both. Correction. I wanted both, AND I wanted myself on the news page. Phew! Finally got that off my conscience. Yes, this labour of love was also spurred by an odd initial self-centered desire to get some fame. So I made SLASH'EM. Actually, I tried patching the Wizard Patch onto the SLASH ported to Nethack 3.2.2 source. Failure. Sources were too different. About a hundred incompatible chunks. Gave up, and put it away. Then, one strange night, I was REALLY BORED. So I did the patch by hand. By the end of it, I was almost 100% sure it would explode. I had to fix a couple typos. It compiled. It ran. SLASH'EM was born. This was probably where SLASH'EM probably would have died. With an incredible dash of luck, it all somehow worked. Despite the fact the two weren't designed to mix. Despite the fact that I'd never done C programming before. Yes. Nethack was actually my pounding block for learning the C programming language. Scary, neh? I learned a lot. Not much terminology - but it's come to the point that most things work all right. New features actually being implemented. For those wondering, before Nethack and real C, I did BASIC programming (various versions) and some QuakeC. Not too long after, I was actually adding features. Original stuff. Spur of the moment additions. Bug fixes. Sometimes, things were touch and go. There was the time I was trying to add light sourced spells. That was supposed to be a couple hours. I broke the entire zap code. But the thing is - if I'm halfway in, I'll generally finish the job. Just because it would be a waste of my time if I gave up. Then, somewhere along the way, other people actually played it. I started getting bug reports. People actually saying good things. People telling me every other version that yes - the boulder bug is back ;B Actually, if it hadn't been for the fact I'd get a message every week or so from someone different telling me about some bug, thanking me for making the game, this probably would have died eons ago. The SLASH'EM page gets tons more hits than my actual personal webpage ;B It taught me C programming. It taught me that there is actually a community of people out there who are awfully nice, even though half a dozen posts a week to their message board concern computer hacking. I'm now a 2nd year university student at the University of British Columbia. Looks like I'm going to do an Honours in Microbiology - Immunology Option. Haven't ever taken a computer course yet, although I plan on doing the 1st year Compsci courses this summer. I play SLASH'EM in the time I should probably be studying and doing homework. I've never gotten to Medusa, let alone ascended, without using Wizard mode. Anyhow, this ended up awfully longwinded and probably very boring. But hopefully, this'll encourage anybody with their little Nethack dream to never stop suggesting their ideas, or going out and making their patch. It could happen. Plus, now you know why every other SLASH'EM version crashes terribly :B Happy Hacking! +-----------------------------------+ | Section 3: Warren's doomed agenda | +-----------------------------------+ This section contains Warren's ideas, unchanged since he last updated them. It seems unlikely that many of them will ever come to fruition, but you never know... 3.1 Messy TODO/TOFIX list ------------------------- Please note that these are current ideas that may make no sense in their current note form, but *may* be implemented at a future date. -monster players? -trample with jump? -push splat with boulder -allow lifesaving if in high favor with god? -pull dog through closed doors with leash -Angband easy patch stuffs add? -hypernutritious food? -sleep -force door - shoulder -chatting == buy and sell? -some way of determining weapon alignment for artys? -probing? -appraisal? -bug? pack rats stealing large objs? -wish for intrinsics -make sleep resist quest nemeses? -monster infight (eg. elves & orcs) -mixed type monster groups -id stones from stones on ring? -'_' multirest? -more accurate appraisal? -shopkeepers cheating when shouldn't? -engulfers picking up candle of eternal flame will put it out :( -eating nutritious food exercise con? -Chocobo's (for Darren Hebden ;B) -fishing pole hitting toilets, etc. special cases ;B -applying spellbooks ripping into scrolls -pantheons - more elaborate pray/etc.? Selectable? -text parsing conversations? Improved #chatting -smell object trail? -docs revamp/help system -Allegro library port in progress. Need to figure out how to draw tiles... -mouse code started (pckeys.c, video.c) -vampire <==> vampire bat -gnome - always slip through cracks? innate digging? tame related creatures? -gas spores killing - leaving corspses that can sprout gas spores? -skilled at polearms - no close combat penalty? -bloodblade - weapon that draws blood every X turns when wielded -celebrity bones piles -sewars/pipes access through sinks.. -arc lightning! (radial, random dir) -shatter weapon spell? -pet integration... -scroll of genocide -> ungenocide... -tinning kits not charging? -gas spore explosions are now poison gas (explode.c, monst.c, mon.c) -sometimes able to choose aligns for roles that shouldn't allow align choose? -Tourist - no techs? -zap spells centered on player? -succubi msgs? Commented out code? -monks -disarm? -eggs of winter wolf?!! -SIGIL - damage -veggies? Grow? Garden :B -Hmm...timing out players turned into undead? -anti teleport? -Jedi, orc classes? -do the race class thing? -Use tech menu to invoke monster attacks -incorrect random align chosen? -shout "Spoon, evildoers!" -drain life to actually drain life - uhitm, mhitm, mhitu, spell ? -heat eye beams ;B F-mage start tech? -#helper -do wax golems melting via fire? Monsters special AD hit effects? -AD_FIRE attack? -check unicorns catching glass -glass golem glass launcher? -D -poly weapons -monks/martial arts - severe penalties for encumberance -use percent-success in spell.c for chance/ combine with mods.... -make spellcasting easier, but harder on power -wizards might need to get their spellcasting base fixed... -meteor (use scroll of earth code)/armageddon -fix monsters jumping through doors -save ==> use the leve change paranoia stuff? Just a few things I'd like to see. Take the suggestions as you will. Feel free to comment. Have becoming Grand Master in martial arts give something extra. As far as I know it does not besides increasing unarmed damage. Perhaps the occaisional stunning blow at Master level, and at Grand Master, perhaps the Touch of Death, usable about as often as one can invoke artifacts, but only performable while bare-handed. (orlando de la cruz) -Have Japanese versions of pancake be okonomiyaki, and club be bokken (wooden practice sword). -Have Offler become angry with you if you sacrifice a crocodile corpse (he is the crocodile god, after all). -unicorns ==> _horse corpse_ and horn? Then what about sacrificing unicorns? -how about unicorn corpse can be applied to obtain to get horse corpse and horn -Dopp and item generation - on existing items?? Or self generate? -boots of kicking should bust down chests, etc. -weapons will "advance"? Class change thing from FF? -make race a separate field - get rid of all those is_foo()... -make modifiers to movement keys do different strength attacks -auto-enhance skills? Prompt? -make it possible to finish the game - no "dead ends", more choices. -eg. ignore quest - ironman mode ;) -invisible blindfold -spellbooks still need tiles (ochre) and 3 others... should get -get tiles == description thing working again. Monster Tiles : Smaug, Thorin -fix tamed water demon chat (??? How?) -finish prayer upgrades -detonate wands via spell - random aps in all dirs :) -wish for attributes (str, luck, dex, etc.) -use 'n' for multi-dig -statuetraps activate multiple statues? -stairs /w lots of items at base need "stairway here" message. -more shop types? Jewellers, magic shop... -elemental/demon/angel summoning - time-limited summoning? Use poly code? -check for monster bullwhip and adjacent -spells - summon lights -Give small dmg bonus for wearing rings in H to H combat? -cleanup -dropx, useupf -check for donning - foo_off, foo_gone, etc... -check rehumanize -generate animals as upset pets (that need to tamed?) ? -priests for quest altars? -implement magical armors (eg BDSM) for monsters -one-eyed sam comes back? Who takes care of blackmarket after he passes on? -frozen steed easier to mount? -food distrib? Make corpses have variable timeouts rather than prob of corpse? -limit # of Titans to 12? (6 male, 6 female, minus Prometheus and Atlas) There appear to be many many Titans.... -Cronus, Rhea -Iapetus and Themis, -Oceanus and Tethys, -Hyperion and Theia, -Crius and Mnemosyne, -Coeus and Phoebe ------------------------ -TODO:finish god_gives_benefit code ;) -TODO-make ROPoly timed? charges? -TODO make all lightsaber code ifdef -FIXUP - Dark Elves - dual scimitars? Crossbow? -monster read scroll of taming vs pets ;) -Bug? pools of water kills DEATH?/riders -Tourist tech - detect stairwells -more endgames - journey to center of the earth (end with throwing the amulet away à la Lord of the Rings) -kill a rider and take its place. -"Arcadia" instead of Gehemmon -use obj->spe for spell level? -tone down dmg for gun weapons? -C4, plastique -woodchucks passing through walls(intentional), xorn passing through trees! ;) -Xorn tunnelling up/down? -timeout genocide...monsters come back (explaining why people keep writing dem scrolls ;) Angrier? -"*" + "c" == doswapwep or twoweapon? -artifact trident vs water -monsters laying eggs in spare time? -Hobbit "Teleportitis" -instant_death, quick_death...?? -body armors - Kevlar(R), Twaron(R), Spectra Shield(R), Gold Flex(TM) -dragon scale shields -key redefinition -use energy to absorb damage -file of character stats at death/ingame -list inventory, stats -ethics(death only) genocides (death only) -fainted == can't see -vampire bat needs to be a vampire - how are weres handled? -god sends monadic deva - bug? -map PMs, Onames to strings? - would involve finding all the PM refs -corpses, monster type, your monster type -unpoly mon & obj -eaten corpses coming back with mucho HP -weapons progression? Different types of normal attacks? apply gems onto weapons? -apply gems == crush for effects? -DILITHIUM_CRYSTAL Energy source in Star Trek -DIAMOND -Invulnerable vs Undead -RUBY -good luck -JACINTH -luck in travelling, vs plague, ward vs fire -SAPPHIRE -aids understanding problems, kills spiders -BLACK_OPAL ? (Death) -EMERALD ? (Nature? Regen? Heal?) -TURQUOISE -aids horses in all ways, shatters when used. -CITRINE ? -neutral attitude, rational thought. Cheerful (vs Mind attack?) -AQUAMARINE ? (Water - Magical breathing?) -AMBER vs disease -TOPAZ vs evil spells -JET soul object -OPAL ? -CHRYSOBERYL wards off foes (Warning?) -GARNET ? -AMETHYST prevent drunkenness, drugging -JASPER vs venom -FLUORITE ? -OBSIDIAN ? -AGATE -restful, safe sleep. -JADE skill at music, musical instruments Color relations? Black The Void, darkness, negation, blindness. Brown The Earth, fertility, comfort, sleep. Blue The Heavens, the sky, air, truth, spirituality, calmness. Clear The Sun, luck, awareness, insight. Green Venus, reproduction, sexuality, sight, resurrection, jealousy Orange Mercury, heat, quickness, wisdom. Red Mars, blood, war, fire, madness. Violet Royalty, health, friendliness. White The Moon, purity, virginity, hope, enigmas. Yellow Secrecy, homeopathy, jaundice, diseases, cowardice. -splinter attack -races - vampires, liches (like elf but low char), demons... -make all source files 8.3 so that SHORT_FILENAMES so no truncating filenames -stackwep (e.g. marilith wield 6 daggers) 3.2 What's NEW -------------- Bug - able to kick things out of an unseen pit? Bug - mold from molded corpse should no longer have the name of corpse? Bug - obj_is_local problem? Bug - flame spheres attack cause crash? -flame spheres and shopkeepers... Bug - throwing or wielding silver while a were doesn't affect you / monsters? Bug - not getting "you hear noises" when pet attacks but can see with telepathy? Bug - graves in barracks? No goodies when not randomly generated? Bug - cockatrice lairs no longer have "goodies"? -ToAdd: Control amount of eating with 'n' -are meat-foo always delicious to any non hervivore? (eg jackals, undead, oozes?!) -more rigorous check - make "has_blood" macro? -should food be allowed to merge back in touchfood()? -allow vampires to bite via #monster, turn into bats -do the allegro botl split in the allegro code? -undead should not be drinkable except vamps? What about zombies, Frankenstein... -sleep spell locking up - giving "sleepray hits newt?" -Giantkiller - destroys boulders -Thiefbane - extra damage based on stolen items -unpaid if shopkeeper -has your invlet if you wield... -go through and do spfx for all the artis -go through and do specials for (all) the monsters -move the expanded tile detection to the txt library and use it to do on the fly interpolation when generating bitmap -shops restock. Black market has at least 1 of every item -can feel invisible objects when searching, blind -remove encumber messges on startup -fake object names for hallucinated objects (like monsters) -mail daemon getting stuck? Too many monsters crowding? -'%' command displays eaten corpses -need to track corpses known and eaten -give dopps a message to let them know they "remember" this polymorph -use this as a menu for polymorphing... -implement gunblade -gunblade -two handed -gun aspect of a revolver (shorter range), slightly weaker than a two handed sword -has own weapon skill -use apply to fire bullets AND slash (low bullet hit rate) -throw fires bullets alone -attack slashes alone -reading invisible scrolls? -"wizard need food badly" => different for vampires? -turning into a werewolf in a shop -> shouldn't sell equip? -back option for character creation TTY? - pretty tough, I think -monsters should use "techniques" against you...pets using techniques -pet unicorns remove ailments, etc... -Buy items via a menu - #chat with shopkeeper -Limit Break based on HP loss? (see howling code) -redo/add sound system using allegro -split allegro into separate windowsystem after implementing use of GUI -OR merge allegro to TTY / separate from DOS code TODO: -Do the Role/Race/Align/Gender Menusystem (WAC) -alleg_xputs should use const char (Strcpy then put up?) *[In Progress] (Trying to) compile with Allegro WIP 3.9.32 -anticipating using allegro on other systems -currently need to redo the font loading code (at least) -it appears to be segfaulting (randomly?) -tofix: using the nethack config files. -vampires shouldn't be allowed to become Flame Mages 3.3 Other Ideas --------------- More things. These are probably long-term goals... -make all of slash'em ifdef! Probably not until Nethack 4.0 comes out ;B -christmas! New Quests? -trap doors lead to same place? -Different sized levels (for custom levs) -more quests (randomized - wipe out the xxx, save the xxx, etc.) -scoring bonuses for /w pets based on # turns? -OPTIONAL haggling -pool of water, psi bolt, destroy armour (directable ) confusion, curse items -Cleric: insects/snake summon?, blindness, wounding, hold -Drain life spell for Necromancer? -more holidays, special days? (Thanksgiving, Christmas) -level generator problem of 2 special levels on same level one of them unavailable - in the .des file? -due to .des file - overlapping branches -"you caitliff" message from knights final blow try knights vs mimics -change dungeon map size (global.h ROWNO, COLNO) -new map types? -arena -library -polymorph abusive? -training hall -bar? hiring "pets" -food with different timers in same slot? -holy hand grenade of antioch? -pets getting intrinsics/stun from corpses? -"i see nobody there" when chatting + blind -should still be able to chat? -various different types of lycanthropes? (u_init.c) -do splash directions for oil -burning fires -eating...stop...attack gelat cube...frozen ... finally finished msg? -score list: average score, by player, total score, etc., by class (topten.c) -not averaging age of food on pickup? (invent.c) -various were types for Lycanthrope? -shopkeepers blocking mons w/ pickaxes -defending players in shops -watchmen defending players in towns? -martial artists being able to catch projectiles at Expert skill? shield deflect shots? -shopkeepers repair pits? -druid, illusion -gnome animal affinity, go through cracks? from balance.txt ~~~~~~~~~~~~~~~~ The following will probably not be implemented until the command patch. Each role will have designated first and second artifact gifts, and they will be as easy to get as in NetHack. The first gift should be a weak artifact weapon or a non-weapon; the second should be a strong artifact weapon. # A different strategy could be used to make it harder to get a strong artifact. Instead of altering the algorithm used for wishing and sacrificing in NetHack, more weak artifacts could be placed in well-defined places, making it harder to get an artifact later in the game. # Spellcasting classes should get at least basic skill in all of the spell skills. I should examine the newer monsters more carefully and modify or eliminate the unbalancing ones. # Some of the newer creatures should be assigned to the appropriate special level (e.g. rot worms only in the Wyrm Caverns), or to Gehennom. # Introduce a disenchantment attack (affects your armor) and defense (affects your weapon). This would be prevented by cancelling the monster or wearing a high cancellation factor, but not by magic resistance. Available only to monsters generated only in Gehennom, so it wouldn't appear until very late in the game. # Acid attacks should have a chance of removing erosionproofing. # Eliminate the "plus required to hit" and "hits as if plus" for various monsters. That's already covered by other factors (AC, hit dice, damage ranges). Pets. Some have gone just too far. ? Is there a compelling reason for having more than one pet name option (e.g., dogname, catname, badgername)? # Bullwhips may get a radius of 2. # Silver wallets should only carry money and unlocking tools. No changes are proposed for other containers. Mummy wrappings, potions of see invisible, and probably some other objects should not be allowed to be invisible objects. A blessed potion of full healing should restore lost experience levels. Many additions which I do not intend to discuss here, since they do not relate to game balance. I am not considering any more new items or monsters for this patch. slashem-0.0.7E7F3/dat/0000775000076400007640000000000010545462317012424 5ustar alialislashem-0.0.7E7F3/dat/help0000664000076400007640000002534410545462317013307 0ustar aliali 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, reputed to be hidden somewhere below the twentieth level. You begin your adventure with a pet that can help you in many ways, and can be trained to do all sorts of things. On the way you will find useful (or useless) items, quite possibly with magic properties, and assorted monsters. You can attack a monster by trying to move onto the space a monster is on (but often it is much wiser to leave it alone). Unlike most adventure games, which give you a verbal description of your location, NetHack gives you a visual image of the dungeon level you are on. NetHack uses the following symbols: - and | The walls of a room, possibly also open doors or a grave. . The floor of a room or a 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. < Stairs up: a way to the previous level. @ You (usually), or another human. ) A weapon of some sort. [ A suit or piece of armor. % Something edible (not necessarily healthy). / A wand. = A ring. ? A scroll. ! A potion. ( Some other useful object (pick-axe, key, lamp...) $ A pile of gold. * A gem or rock (possibly valuable, possibly worthless). + A closed door, or a spell book containing a spell you can learn. ^ A trap (once you detect it). " An amulet, or a spider web. 0 An iron ball. _ An altar, or an iron chain. { A fountain. } A pool of water or moat or a pool of lava. \ 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 to the symbol in question. For instance, a 'd' may turn out to be a dog. y k u 7 8 9 Move commands: \|/ \|/ yuhjklbn: go one step in specified direction h-.-l 4-.-6 YUHJKLBN: go in specified direction until you /|\ /|\ hit a wall or run into something 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: ? Help menu. ` Main Menu. / Tell what a symbol represents. You may choose to specify a location or give a symbol argument. & Tell what a command does. < 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 ^B Steal c Close a door. C Call (name) an individual monster. d Drop something. d7a: drop seven items of object a. D Drop multiple items. This command is implemented in two different ways. One way is: "D" displays a list of all of your items, from which you can pick and choose what to drop. A "+" next to an item means that it will be dropped, a "-" means that it will not be dropped. Toggle an item to be selected/deselected by typing the letter adjacent to its description. Select all items with "+", deselect all items with "=". The moves you from one page of the listing to the next. The other way is: "D" will ask the question "What kinds of things do you want to drop? [!%= au]". You should type zero or more object symbols possibly followed by 'a' and/or 'u'. Da - drop all objects, without asking for confirmation. Du - drop only unpaid objects (when in a shop). D%u - drop only unpaid food. ^D Kick (for doors, usually). f Fire ammunition from quiver. F Followed by direction, fight a monster (even if you don't sense it). e Eat food. Vampires cannot eat as such. However, they can gain nutrition by draining blood from fresh corpses using this command. E Engrave a message on the floor. E- - write in the dust with your fingers. f Fire ammunition from quiver. i Display your inventory. I Display selected parts of your inventory, as in 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. n# repeat next command N name or classify an item o Open a door. O Review current options and possibly change them. A menu displaying the option settings will be displayed and most can be changed by simply selecting their entry. Options are usually set before the game with a NETHACKOPTIONS environment variable, or via a config file (defaults.nh, Slash'EM Defaults, nethack.cnf, .nethackrc, etc.), not with the 'O' command. p Pay your shopping bill/Shopkeeper services. P Put on an accessory (ring, amulet, etc). ^P Repeat last message (subsequent ^P's repeat earlier messages). The behavior can be varied via the msg_window option. q Drink (quaff) something (potion, water, etc). Q Select ammunition for quiver. r Read a scroll or spell book. R Remove an accessory (ring, amulet, etc). ^R Redraw the screen. s Search for secret doors and traps around you. S Save the game. t Throw an object or shoot a projectile. T Take off armor. ^T Teleport, if you are able. v Displays the version number. V Display a longer identification of the version, including the history of the game. w Wield weapon. w- means wield nothing, use bare hands. W Wear armor. x Switch weapon slots. X List the spells you know (same as '+'). ^X Show your attributes. ^Y polymorph (if possible) z Zap a wand. Z Cast a spell. ^Z Suspend the game. : Look at what is here. ; Look at what is somewhere else. , Pick up some things. @ Toggle the pickup option. ^ Ask for the type of a trap you found earlier. ) Tell what weapon you are wielding. [ Tell what armor you are wearing. = Tell what rings you are wearing. " Tell what amulet you are wearing. ( Tell what tools you are using. * List and change items in use. * Tell what equipment you are using; combines the preceding five. $ Count your gold pieces. + List the spells you know; also rearrange them if desired. \ Show what types of objects have been discovered. ! Escape to a shell, if supported in your version and OS. # Introduces one of the "extended" commands. To get a list of the commands you can use with "#" type "#?". The extended commands you can use depends upon what options the game was compiled with, along with your class and what type of monster you most closely resemble at a given moment. If your keyboard 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). K List vanquished monsters (whether by you or not). 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, as in "40." or "20s.". If you have the number_pad option set, you 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, and the state of your stomach. Optionally, you may or may not see other information such as spell points, how much gold you have, etc. Have Fun, and Happy Hacking! slashem-0.0.7E7F3/dat/sea.des0000664000076400007640000000715010545462317013674 0ustar aliali# SCCS Id: @(#)sea.des 3.4 1993/02/23 # Copyright (c) 1989 by Jean-Christophe Collet # Copyright (c) 1991 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 above. # # This is the Sunless Sea... home of sharks, squids, and underwater # treasure. Hope you brought your amulet of magical breathing! # # MAZE: "sea",' ' MESSAGE:"You hear the roar of the sea. That can't be right...." GEOMETRY: center,center #0 1 2 3 4 5 6 #1234567890123456789012345678901234567890123456789012345678901234567890 MAP }}}}}}}} }}}}}}}}}} }}}}}}}}}}}}}}}} }}}}}}}}}}}}}}}}}}} .......}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} ...........}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} .............}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} .............}}}}}}}}}}}}}}}}}}}}}}}}}}}}}...}}}}}}}}}}}}}}}}} ..............}}}}}}}}}}}}}}}}}}}}}}}}}}}.....}}}}}}}}}}}}}}}}}}} ...........}}}}}}}}}}}}}}}}}}}}}}}}}}}}}.....}}}}}}}}}}}}}}}}}} ............}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}...}}}}}}}}}}}}}}} ...........}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} ..........}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} ........}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} ..........}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} .......}}}}}}}}}}}}}}}}}}}}}}}}}}}} }}}}}}}}}}}}}}}}} ....}}}}}}}} }}} }}}}}}}}}}} }}}}}}}}}}}}}}}} }}}}}}} }}}}}}} ENDMAP RANDOM_PLACES:(40,06),(49,05),(46,10),(30,07) RANDOM_MONSTERS: ';',':' REGION:(00,00,66,15),unlit,"ordinary" STAIR:(05,12),up BRANCH:(05,12,05,12),(0,0,0,0) # the treasure island! OBJECT:'(',"chest",(45,6) OBJECT: random, random, (45,6) OBJECT: random, random, (45,6) OBJECT: random, random, (45,6) OBJECT: '/', random, (45,6) OBJECT: '/', random, (45,6) OBJECT: '"', random, (45,6) OBJECT: '"', random, (45,6) OBJECT: '=', random, (45,6) OBJECT: '=', random, (45,6) OBJECT: '*', random, (45,6) OBJECT: '*', random, (45,6) OBJECT: '*', random, (45,6) # beach junk... OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random # the missing magic lamp! OBJECT:'(',"magic lamp",place[0] # the beach-combing committee MONSTER: ';',"giant crab",(10,6),hostile MONSTER: ';',"giant crab",(11,7),hostile MONSTER: ';',"giant crab",(10,8),hostile MONSTER: ';',"giant crab",(12,9),hostile MONSTER: ';',"giant crab",(10,11),hostile # lurking offshore... MONSTER: ';',"shark",(26,05),hostile MONSTER: ';',"shark",(28,05),hostile MONSTER: ';',"shark",(30,06),hostile MONSTER: ';',"shark",(27,07),hostile MONSTER: ';',"shark",(26,09),hostile MONSTER: ';',"shark",(30,09),hostile MONSTER: ';',"shark",(31,11),hostile MONSTER: ';',"shark",random,hostile MONSTER: ';',"shark",random,hostile MONSTER: ';',"shark",random,hostile MONSTER: ';',"shark",random,hostile MONSTER: ';',"shark",random,hostile MONSTER: ';',"shark",random,hostile MONSTER: ';',random,random,hostile MONSTER: ';',random,random,hostile MONSTER: ';',random,random,hostile MONSTER: ';',random,random,hostile MONSTER: ';',random,random,hostile MONSTER: ';',random,random,hostile MONSTER: ';',random,random,hostile ENGRAVING:(11,03),burn,"The lamp washed into the sea while I slept! Woe and damnnation!" OBJECT: random,random,(11,03) slashem-0.0.7E7F3/dat/oracles.txt0000664000076400007640000001263410545462317014623 0ustar aliali----- If thy wand hath run out of charges, thou mayst zap it again and again; though naught will happen at first, verily, thy persistence shall be rewarded, as one last charge may yet be wrested from it! ----- Though the shopkeepers be wary, thieves have nevertheless stolen much by using their digging wands to hasten exits through the pavement. ----- If thou hast had trouble with rust on thine armor or weapons, thou shouldst know that thou canst prevent this by, while in a confused state, reading the magical parchments which normally are used to cause their enchantment. Unguents of lubrication may provide similar protection, albeit of a transitory nature. ----- Behold the cockatrice, whose diminutive stature belies its hidden might. The cockatrice can petrify any ordinary being it contacts--save those wise adventurers who eat a dead lizard or blob of acid when they feel themselves slowly turning to stone. ----- While some wayfarers rely on scrounging finished armour in the dungeon, the resourceful know the mystical means by which mail may be fashioned out of scales from a dragon's hide. ----- It is customarily known among travelers that extra-healing draughts may clear thy senses when thou art addled by delusory visions. But never forget, the lowly potion which makes one sick may be used for the same purpose. ----- While the consumption of lizard flesh or water beloved of the gods may clear the muddled head, the application of the horn of a creature of utmost purity can alleviate many other afflictions as well. ----- If thou wouldst travel quickly between distant locations, thou must be able to control thy teleports, and in a confused state misread the scroll which usually teleports thyself locally. Daring adventurers have also performed the same feat sans need for scrolls or potions by stepping into a particular ambuscade. ----- Almost all adventurers who come this way hope to pass the dread Medusa. To do this, the best advice is to keep thine eyes blindfolded and to cause the creature to espy its own reflection in a mirror. ----- And where it is written "ad aerarium", diligent searching will often reveal the way to a trap which sends one to the Magic Memory Vault, where the riches of Croesus are stored; however, escaping from the vault with its gold is much harder than getting in. ----- It is well known that wily shopkeepers raise their prices whene'er they espy the garish apparel of the approaching tourist or the countenance of a disfavored patron. They favor the gentle of manner and the fair of face. The boor may expect unprofitable transactions. ----- SINKS The cliche of the kitchen sink swallowing any unfortunate rings that contact its pernicious surface reflecteth greater truth than many homilies, yet even so, few have developed the skill to identify enchanted rings by the transfigurations effected upon the voracious device's frame. ----- The meat of enchanted creatures ofttimes conveyeth magical properties unto the consumer. A fresh corpse of floating eye doth fetch a high price among wizards for its utility in conferring Telepathy, by which the sightless may locate surrounding minds. ----- The detection of blessings and curses is in the domain of the gods. They will make this information available to mortals who request it at their places of worship, or elsewhere for those mortals who devote themselves to the service of the gods. ----- At times, the gods may favor worthy supplicants with named blades whose powers echo throughout legend. Learned wayfarers can reproduce blades of elven lineage, hated of the orcs, without the need for such intervention. ----- There are many stories of a mighty amulet, the origins of which are said to be ancient Yendor. This amulet doth have awesome power, and the gods desire it greatly. Mortals mayst tap only portions of its terrible abilities. The stories tell of mortals seeing what their eyes cannot see and seeking places of magical transportation, while having this amulet in their possession. Others say a mortal must wear the amulet to obtain these powers. But verily, such power comes at great cost, to preserve the balance. ----- It is said that thou mayst gain entry to Moloch's sanctuary, if thou darest, from a place where the ground vibrateth in the deepest depths of Gehennom. Thou needs must have the aid of three magical items. The pure sound of a silver bell shall announce thee. The terrible runes, read from Moloch's book, shall cause the earth to tremble mightily. The light of an enchanted candelabrum shall show thee the way. ----- In the deepest recesses of the Dungeons of Doom, guarding access to the nether regions, there standeth a castle, wherein lieth a wand of wishes. If thou wouldst gain entry, bear with thee an instrument of music, for the pontlevis may be charmed down with the proper melody. What notes comprise it only the gods know, but a musical mastermind may yet succeed by witful improvisation. However, the less perspicacious are not without recourse, should they be prepared to circumambulate the castle to the postern. ----- Upon a level before all maze There lies a woman who kills with gaze. Should she be killed, not petrified, You will receive a magical ride. ----- ELBERETH The name of Elbereth may strike fear into the hearts of thine enemies, if thou dost write it upon the ground at thy feet. If thou maintainest the utmost calm, thy safety will be aided greatly, but beware lest thy clumsy feet scuff the inscription, cancelling its potence. ----- slashem-0.0.7E7F3/dat/Valkyrie.des0000664000076400007640000002354410545462317014717 0ustar aliali# SCCS Id: @(#)Valkyrie.des 3.4 2002/05/02 # Copyright (c) 1989 by Jean-Christophe Collet # Copyright (c) 1991-2 by M. Stephenson # NetHack may be freely redistributed. See license for details. # # The "start" level for the quest. # # Here you meet your (besieged) class leader, the Norn, # and receive your quest assignment. # MAZE: "Val-strt",' ' FLAGS: noteleport,hardfloor GEOMETRY:center,center MAP IIIIIIPPPIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIPPPPPIIIIIIII..IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...IIIIIIIIIIIIIIIIIIIII IIIIPLLPPIIIIIII..IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII..{..IIIIIIIIIIIIIIIIIIII IIIIPLPPIIIIIII..IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII.....IIIIIIPPPIIIIIIIIII IIIPPPPPIIIIII..IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII.IIIIIPPLPIIIIIIIIII IIIIPIIIIIIII..IIIIPPPIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII.IIIIIPLPPIIIIIIIIII IIIIIIIIIIII..IIIIIPLPPIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII..IIIIIPPPIIIIIIIIIII IIIIIIII.....IIIIIIPPPIIII|----------------|IIIIIPPPIII.IIIIIIIIIIIIIIIIIIII IIIIIII..III...IIIIIIIIIII|................|IIIIIPLPII..IIIIIIIIIIIIIIIIIIII IIIIII..IIIIII......IIIII.|................|.IIIIPPPII.IIIIIIIIIIIIIIIIIIIII IIIII..IIIIIIIIIIII.......+................+...IIIIIII.IIIIIIIIIIIIIIIIIIIII IIII..IIIIIIIII.....IIIII.|................|.I...IIIII.IIIIIIIIIIIIIIIIIIIII III..IIIIIIIII..IIIIIIIIII|................|IIII.......IIIIIIIIIIIIIIIIIIIII IIII..IIIIIII..IIIIIIIIIII|----------------|IIIIIIIIII...IIIIIIIIIIIIIIIIIII IIIIII..IIII..IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIPPPPIIII...IIIIIIIIIIIIIIIII IIIIIII......IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIPLLPPIIIII...IIIIIIIIIIIIIII IIIIPPPIP...IIIIIIIIIIIPIIIIIIIIIIIIIIIIIIIIIIIIPPPPIIIIIIII...I......IIIIII IIIPPLPPIIIIIIIIIIIIIIPPPIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII.........IIIII IIIIPPPIIIIIIIIIIIIIIPPLPIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII.......IIIIII IIIIIIIIIIIIIIIIIIIIIIPPPIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII ENDMAP # Dungeon Description REGION:(00,00,75,19),lit,"ordinary" REGION:(27,08,42,12),lit,"ordinary" # Portal arrival point BRANCH:(66,17,66,17),(0,0,0,0) # Stairs STAIR:(18,01),down FOUNTAIN:(53,02) # Doors DOOR:locked,(26,10) DOOR:locked,(43,10) # Norn MONSTER:'@',"Norn",(35,10) # The treasure of the Norn OBJECT:'(',"chest",(36,10) # valkyrie guards for the audience chamber MONSTER:'@',"warrior",(27,08) MONSTER:'@',"warrior",(27,09) MONSTER:'@',"warrior",(27,11) MONSTER:'@',"warrior",(27,12) MONSTER:'@',"warrior",(42,08) MONSTER:'@',"warrior",(42,09) MONSTER:'@',"warrior",(42,11) MONSTER:'@',"warrior",(42,12) # Non diggable walls NON_DIGGABLE:(26,07,43,13) # Random traps TRAP:"fire",random TRAP:"fire",random TRAP:"fire",random TRAP:"fire",random TRAP:"fire",random TRAP:"fire",random # Monsters on siege duty. MONSTER: 'a',"fire ant",(04,12) MONSTER: 'a',"fire ant",(08,08) MONSTER: 'a',"fire ant",(14,04) MONSTER: 'a',"fire ant",(17,11) MONSTER: 'a',"fire ant",(24,10) MONSTER: 'a',"fire ant",(45,10) MONSTER: 'a',"fire ant",(54,02) MONSTER: 'a',"fire ant",(55,07) MONSTER: 'a',"fire ant",(58,14) MONSTER: 'a',"fire ant",(63,17) MONSTER: 'H',"fire giant",(18,01),hostile MONSTER: 'H',"fire giant",(10,16),hostile # # The "locate" level for the quest. # # Here you have to find the cave of Surtur to go # further towards your assigned quest. # MAZE: "Val-loca",' ' FLAGS: hardfloor INIT_MAP: '.' , 'I' , true , true , lit , false GEOMETRY:center,center MAP PPPP.... ....PPPPP. PLP... .PPLLLPP PPP ....................... PPPLLP .. ............................ PPPP . ............................... .... ................................. .. .................................... . ................................... . .................................. . .. .............................. PP .PPP .......................... PLP .PLLP ..PLLP .PPPP.. ....PPPP ENDMAP # Dungeon Description REGION:(00,00,39,12),lit,"ordinary" # Stairs STAIR:(48,14),up STAIR:(20,06),down # Non diggable walls NON_DIGGABLE:(00,00,39,12) # Objects OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random # Random traps TRAP:"fire",random TRAP:"fire",random TRAP:"fire",random TRAP:"fire",random TRAP:random,random TRAP:random,random # Random monsters. MONSTER:'a',"fire ant",random MONSTER:'a',"fire ant",random MONSTER:'a',"fire ant",random MONSTER:'a',"fire ant",random MONSTER:'a',"fire ant",random MONSTER:'a',"fire ant",random MONSTER:'a',"fire ant",random MONSTER:'a',"fire ant",random MONSTER:'a',"fire ant",random MONSTER:'a',"fire ant",random MONSTER:'a',"fire ant",random MONSTER:'a',"fire ant",random MONSTER:'a',"fire ant",random MONSTER:'a',"fire ant",random MONSTER:'a',"fire ant",random MONSTER:'a',"fire ant",random MONSTER:'a',"fire ant",random MONSTER:'a',random,random MONSTER:'H',random,random,hostile MONSTER:'H',"fire giant",random,hostile MONSTER:'H',"fire giant",random,hostile MONSTER:'H',"fire giant",random,hostile MONSTER:'H',"fire giant",random,hostile MONSTER:'H',"fire giant",random,hostile MONSTER:'H',"fire giant",random,hostile MONSTER:'H',"fire giant",random,hostile MONSTER:'H',random,random,hostile # # The "goal" level for the quest. # # Here you meet Lord Surtur your nemesis monster. You have to # defeat Lord Surtur in combat to gain the artifact you have # been assigned to retrieve. # MAZE: "Val-goal", 'L' INIT_MAP: '.' , 'L' , true , true , lit , false GEOMETRY:center,center MAP .L............................LLLLL LLL.........LLLLL.LLLLL.........LLL .LLL......LLLLLLLLLLLLLLL.......LL. .LLL.....LLL|---------|LLL.....L... ..LL....LL|--.........--|LL.....LLL .......LL|-...LLLLLLL...-|LL.....L. .......LL|...LL.....LL...|LL....... ......LL|-..LL.......LL..-|LL...... ......LL|.................|LL...... ......LL|-..LL.......LL..-|LL...... .......LL|...LL.....LL...|LL....... .......LL|-...LLLLLLL...-|LL....... ..L.....LL|--.........--|LL.....LL. ..LL.....LLL|---------|LLL....LLLL. ..LLL.....LLLLLLLLLLLLLLL...LLLLL.. .LLLL.......LLLLL.LLLLL.....LLLL... ..LL............................... ENDMAP # Dungeon Description REGION:(00,00,34,16),lit,"ordinary" # Stairs # Note: The up stairs are *intentionally* off of the map. STAIR:(45,10),up # Non diggable walls NON_DIGGABLE:(00,00,34,16) # Drawbridges DRAWBRIDGE:(17,02),south,open DRAWBRIDGE:(17,14),north,open # Objects OBJECT:'(',"crystal ball",(17,08),blessed,5,"The Orb of Fate" OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random # Traps TRAP:"board",(13,08) TRAP:"board",(21,08) # Random traps TRAP:"fire",random TRAP:"fire",random TRAP:"fire",random TRAP:"fire",random TRAP:"board",random TRAP:random,random TRAP:random,random # Random monsters. MONSTER:'H',"Lord Surtur",(17,08) MONSTER:'a',"fire ant",random MONSTER:'a',"fire ant",random MONSTER:'a',"fire ant",random MONSTER:'a',"fire ant",random MONSTER:'a',random,random MONSTER:'a',random,random MONSTER:'H',"fire giant",(10,06),hostile MONSTER:'H',"fire giant",(10,07),hostile MONSTER:'H',"fire giant",(10,08),hostile MONSTER:'H',"fire giant",(10,09),hostile MONSTER:'H',"fire giant",(10,10),hostile MONSTER:'H',"fire giant",(24,06),hostile MONSTER:'H',"fire giant",(24,07),hostile MONSTER:'H',"fire giant",(24,08),hostile MONSTER:'H',"fire giant",(24,09),hostile MONSTER:'H',"fire giant",(24,10),hostile MONSTER:'H',"fire giant",random,hostile MONSTER:'H',"fire giant",random,hostile MONSTER:'H',random,random,hostile # # The "fill" levels for the quest. # # These levels are used to fill out any levels not occupied by specific # levels as defined above. "filla" is the upper filler, between the # start and locate levels, and "fillb" the lower between the locate # and goal levels. # MAZE: "Val-fila" , 'I' INIT_MAP: '.' , 'I' , true , true , lit, false NOMAP # STAIR: random, up STAIR: random, down # OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random # MONSTER: 'a', "fire ant", random MONSTER: 'a', "fire ant", random MONSTER: 'a', "fire ant", random MONSTER: 'a', "fire ant", random MONSTER: 'a', "fire ant", random MONSTER: 'a', random, random MONSTER: 'H', "fire giant", random, hostile # TRAP: random, random TRAP: random, random TRAP: random, random TRAP: random, random TRAP: random, random TRAP: random, random TRAP: random, random MAZE: "Val-filb" , 'L' INIT_MAP: '.' , 'L' , true , true , lit, false NOMAP # STAIR: random, up STAIR: random, down # OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random # MONSTER: 'a', "fire ant", random MONSTER: 'a', "fire ant", random MONSTER: 'a', "fire ant", random MONSTER: 'a', random, random MONSTER: 'H', "fire giant", random, hostile MONSTER: 'H', "fire giant", random, hostile MONSTER: 'H', "fire giant", random, hostile # TRAP: "fire", random TRAP: "fire", random TRAP: "fire", random TRAP: "fire", random TRAP: "fire", random TRAP: random, random TRAP: random, random slashem-0.0.7E7F3/dat/Rogue.des0000664000076400007640000004112210545462317014202 0ustar aliali# SCCS Id: @(#)Rogue.des 3.4 2002/02/15 # Copyright (c) 1992 by Dean Luick # NetHack may be freely redistributed. See license for details. # # The "start" level for the quest. # # Here you meet your (besieged) class leader, Master of Thieves # and receive your quest assignment. # 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-.|..| |........|.|.....|........----------.----.......---.--..|-.|....|.-----.|..| |----....+.|.....----+---............|..|--------.+.|...SS.|....|.......|..| |...--+-----.....|......|.------------............---...||.------+--+----..| |..........S.....|......|.|..........S............|.....||...|.....|....|..| -------------------------.-------------------------------------------------- ENDMAP # Dungeon Description #REGION:(00,00,75,20),lit,"ordinary" # The down stairs is at one of the 4 "exits". The others are mimics, # mimicing stairwells. RANDOM_PLACES: (33,0), (0,12), (25,20), (75,05) STAIR:place[0],down MONSTER:'m',"giant mimic", place[1], m_feature "staircase down" MONSTER:'m',"large mimic", place[2], m_feature "staircase down" MONSTER:'m',"small mimic", place[3], m_feature "staircase down" # Portal arrival point BRANCH:(19,09,19,09),(0,0,0,0) # Doors (secret) #DOOR:locked|closed|open,(xx,yy) DOOR: locked, (32, 2) DOOR: locked, (63, 9) DOOR: locked, (27,10) DOOR: locked, (31,12) DOOR: locked, (35,13) DOOR: locked, (69,15) DOOR: locked, (56,17) 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) DOOR: closed, (20, 2) DOOR: closed, (65, 2) DOOR: closed, (67, 2) DOOR: closed, ( 6, 3) DOOR: closed, (21, 5) DOOR: closed, (38, 5) DOOR: closed, (69, 6) DOOR: closed, ( 4, 7) DOOR: closed, (39, 7) DOOR: closed, (58, 7) DOOR: closed, (60, 7) DOOR: closed, (18, 8) DOOR: closed, (20, 9) DOOR: closed, (48,10) DOOR: closed, (46,12) DOOR: closed, (62,12) DOOR: closed, (74,12) DOOR: closed, (23,14) DOOR: closed, (23,14) DOOR: closed, (50,14) DOOR: closed, (68,14) DOOR: closed, (74,14) DOOR: closed, (14,15) DOOR: closed, (63,15) DOOR: closed, ( 9,17) DOOR: closed, (21,17) DOOR: closed, (50,17) DOOR: closed, ( 6,18) DOOR: closed, (65,18) DOOR: closed, (68,18) # Master of Thieves MONSTER:'@',"Master of Thieves",(36,11) # The treasure of Master of Thieves OBJECT:'(',"chest",(36,11) # thug guards, room #1 MONSTER:'@',"thug",(28,10) MONSTER:'@',"thug",(29,11) MONSTER:'@',"thug",(30,09) MONSTER:'@',"thug",(31,07) # thug guards, room #2 MONSTER:'@',"thug",(31,13) MONSTER:'@',"thug",(33,14) MONSTER:'@',"thug",(30,15) #thug guards, room #3 MONSTER:'@',"thug",(35,09) MONSTER:'@',"thug",(36,13) # Non diggable walls NON_DIGGABLE:(00,00,75,20) # Random traps TRAP:random,random TRAP:random,random TRAP:random,random TRAP:random,random TRAP:random,random TRAP:random,random TRAP:random,random TRAP:random,random TRAP:random,random TRAP:random,random TRAP:random,random TRAP:random,random TRAP:random,random TRAP:random,random TRAP:random,random TRAP:random,random # # Monsters to get in the way. # # West exit MONSTER: 'l',"leprechaun",(01,12),hostile MONSTER: 'n',"water nymph",(02,12),hostile # North exit MONSTER: 'n',"water nymph",(33,01),hostile MONSTER: 'l',"leprechaun",(33,02),hostile # East exit MONSTER: 'n',"water nymph",(74,05),hostile MONSTER: 'l',"leprechaun",(74,04),hostile # South exit MONSTER: 'l',"leprechaun",(25,19),hostile MONSTER: 'n',"water nymph",(25,18),hostile # Wandering the streets. What I'd really like for this is a random # location, but make sure we're on a given type, e.g. street (if they # existed, of course). MONSTER: 'n',"water nymph",(07,05),hostile MONSTER: 'l',"leprechaun",(28,06),hostile MONSTER: 'n',"water nymph",(38,07),hostile MONSTER: 'l',"leprechaun",(45,01),hostile MONSTER: 'n',"water nymph",(59,07),hostile MONSTER: 'l',"leprechaun",(62,14),hostile MONSTER: 'n',"water nymph",(71,14),hostile MONSTER: 'l',"leprechaun",(39,13),hostile MONSTER: 'n',"water nymph",(18,14),hostile MONSTER: ':',"chameleon",(19,08),hostile MONSTER: ':',"chameleon",(22,08),hostile MONSTER: ':',"chameleon",(16,08),hostile MONSTER: ':',"chameleon",random,hostile MONSTER: ':',"chameleon",random,hostile MONSTER: ':',"chameleon",random,hostile MONSTER: ':',"chameleon",random,hostile MONSTER: ':',"chameleon",random,hostile # # The "locate" level for the quest. # # Here you have to find the entrance to the Assassins' Guild to go # further towards your assigned quest. # MAZE: "Rog-loca",' ' GEOMETRY:center,center # 1 2 3 4 5 6 7 #123456789012345678901234567890123456789012345678901234567890123456789012345 MAP ---------------------------------------------------- -------- ---.................................................- --.....| ---...--------........-------.......................--- ---...| ---.....- ---......- ---..................---- --.-- ---.....---- -------- --..................-- --..| ---...----- ----.----.....----.....--- --..|| ----..---- -----..--- |...--- |.......--- --...| |...--- ----....--- |.--- |.........-- --...|| |...- ----.....--- ---- |..........---....| |...---- ----......--- | |...|.......-....|| |......----- ---.........- | -----...|............| |..........----- ----...........--- -------......||...........|| |..............-----................--- |............|||..........| |------...............................--- |...........|| |.........|| |.....|..............------.............-----..........|| ||........| |.....|.............-- ---.........................|| |.......|| |.....|.............- ---.....................--| ||......| |-S----------.......---- --.................---- |.....|| |...........|..........--------..............----- ||....| |...........|............................----- |....| ------------------------------------------ ------ ENDMAP # Dungeon Description REGION:(00,00,75,20),lit,"ordinary" # Doors #DOOR:locked|closed|open,(xx,yy) # Stairs STAIR:random,up STAIR:random,down # 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 OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,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:'l',"leprechaun",random,hostile MONSTER:'l',"leprechaun",random,hostile MONSTER:'l',"leprechaun",random,hostile MONSTER:'l',"leprechaun",random,hostile MONSTER:'l',"leprechaun",random,hostile MONSTER:'l',"leprechaun",random,hostile MONSTER:'l',"leprechaun",random,hostile MONSTER:'l',"leprechaun",random,hostile MONSTER:'l',"leprechaun",random,hostile MONSTER:'l',"leprechaun",random,hostile MONSTER:'l',"leprechaun",random,hostile MONSTER:'l',"leprechaun",random,hostile MONSTER:'l',"leprechaun",random,hostile MONSTER:'l',"leprechaun",random,hostile MONSTER:'l',"leprechaun",random,hostile MONSTER:'l',"leprechaun",random,hostile MONSTER:'l',"leprechaun",random,hostile MONSTER:'l',random,random,hostile MONSTER:'N',"guardian naga",random,hostile MONSTER:'N',"guardian naga",random,hostile MONSTER:'N',"guardian naga",random,hostile MONSTER:'N',"guardian naga",random,hostile MONSTER:'N',"guardian naga",random,hostile MONSTER:'N',"guardian naga",random,hostile MONSTER:'N',"guardian naga",random,hostile MONSTER:'N',random,random,hostile MONSTER:'N',random,random,hostile MONSTER:'N',random,random,hostile MONSTER: ':',"chameleon",random,hostile MONSTER: ':',"chameleon",random,hostile MONSTER: ':',"chameleon",random,hostile MONSTER: ':',"chameleon",random,hostile 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-------|.....|..-----..| ---------------------------------------- ...... ---------- ---- ENDMAP # 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) # One trap to keep the gnomes at bay. 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 OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,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 TRAP:random,random TRAP:random,random TRAP:random,random TRAP:random,random TRAP:random,random # Random monsters. MONSTER:'@',"Master Assassin",(38,10),hostile MONSTER:'l',"leprechaun",random,hostile MONSTER:'l',"leprechaun",random,hostile MONSTER:'l',"leprechaun",random,hostile MONSTER:'l',"leprechaun",random,hostile MONSTER:'l',"leprechaun",random,hostile MONSTER:'l',"leprechaun",random,hostile MONSTER:'l',"leprechaun",random,hostile MONSTER:'l',"leprechaun",random,hostile MONSTER:'l',"leprechaun",random,hostile MONSTER:'l',"leprechaun",random,hostile MONSTER:'l',"leprechaun",random,hostile MONSTER:'l',"leprechaun",random,hostile MONSTER:'l',"leprechaun",random,hostile MONSTER:'l',"leprechaun",random,hostile MONSTER:'l',"leprechaun",random,hostile MONSTER:'l',"leprechaun",random,hostile MONSTER:'l',random,random,hostile MONSTER:'l',random,random,hostile MONSTER:'N',"guardian naga",random,hostile MONSTER:'N',"guardian naga",random,hostile MONSTER:'N',"guardian naga",random,hostile MONSTER:'N',"guardian naga",random,hostile MONSTER:'N',"guardian naga",random,hostile MONSTER:'N',"guardian naga",random,hostile MONSTER:'N',"guardian naga",random,hostile MONSTER:'N',"guardian naga",random,hostile MONSTER:'N',random,random,hostile MONSTER:'N',random,random,hostile MONSTER:'N',random,random,hostile MONSTER: ':',"chameleon",random,hostile MONSTER: ':',"chameleon",random,hostile 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. # # This level is used to fill out any levels not occupied by specific # levels as defined above. # LEVEL: "Rog-fila" # ROOM: "ordinary" , random, random, random, random STAIR: random, up OBJECT: random,random,random MONSTER: 'l', "leprechaun", random, hostile ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random OBJECT: random,random,random MONSTER: 'l', "leprechaun", random, hostile MONSTER: 'N', "guardian naga", random, hostile ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random TRAP: random, random TRAP: random, random OBJECT: random,random,random MONSTER: 'n', "water nymph", random, hostile ROOM: "ordinary" , random, random, random, random STAIR: random, down OBJECT: random, random, random TRAP: random, random TRAP: random, random MONSTER: 'l', random, random, hostile MONSTER: 'N', "guardian naga", random, hostile ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random OBJECT: random, random, random TRAP: random, random TRAP: random, random MONSTER: 'l', "leprechaun", random, hostile ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random TRAP: random, random TRAP: random, random MONSTER: 'l', "leprechaun", random, hostile MONSTER: 'n', "water nymph", random, hostile RANDOM_CORRIDORS # # currently a & b are the same. # LEVEL: "Rog-filb" # ROOM: "ordinary" , random, random, random, random STAIR: random, up OBJECT: random,random,random MONSTER: 'l', "leprechaun", random, hostile ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random OBJECT: random,random,random MONSTER: 'l', "leprechaun", random, hostile MONSTER: 'N', "guardian naga", random, hostile ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random TRAP: random, random TRAP: random, random OBJECT: random,random,random MONSTER: 'n', "water nymph", random, hostile ROOM: "ordinary" , random, random, random, random STAIR: random, down OBJECT: random, random, random TRAP: random, random TRAP: random, random MONSTER: 'l', random, random, hostile MONSTER: 'N', "guardian naga", random, hostile ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random OBJECT: random, random, random TRAP: random, random TRAP: random, random MONSTER: 'l', "leprechaun", random, hostile ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random TRAP: random, random TRAP: random, random MONSTER: 'l', "leprechaun", random, hostile MONSTER: 'n', "water nymph", random, hostile RANDOM_CORRIDORS slashem-0.0.7E7F3/dat/Tourist.des0000664000076400007640000004075710545462317014607 0ustar aliali# 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. # # The "start" level for the quest. # # Here you meet your (besieged) class leader, Twoflower # and receive your quest assignment. # MAZE: "Tou-strt",' ' FLAGS: noteleport,hardfloor GEOMETRY:center,center MAP .......}}....---------..-------------------------------------------------... ........}}...|.......|..|.-------------------------------------------...|... .........}}..|.......|..|.|......|......|.............|......|......|...|... ..........}}.|.......|..|.|......+......+.............+......+..\...|...|... ...........}}}..........|.|......|......|.............|......|......|...|... .............}}.........|.|----S-|--S---|S----------S-|---S--|------|...|... ..............}}}.......|...............................................|... ................}}}.....----S------++--S----------S----------S-----------... ..................}}........... .. ................................... ......-------......}}}}........}}}}..}}}}..}}}}..}}}}....................... ......|.....|.......}}}}}}..}}}} .. }}}}..}}}}..}}}..................... ......|.....+...........}}}}}}........................}}}..}}}}..}}}..}}}... ......|.....|...........................................}}}}..}}}..}}}}.}}}} ......-------............................................................... ............................................................................ ...-------......-------..................................................... ...|.....|......|.....|..................................................... ...|.....+......+.....|..................................................... ...|.....|......|.....|..................................................... ...-------......-------..................................................... ENDMAP # Dungeon Description REGION:(00,00,75,19),lit,"ordinary" REGION:(14,01,20,03),unlit,"morgue" REGION:(07,10,11,12),unlit,"ordinary" REGION:(04,16,08,18),unlit,"ordinary" REGION:(17,16,21,18),unlit,"ordinary" REGION:(27,02,32,04),unlit,"ordinary" REGION:(34,02,39,04),unlit,"ordinary" REGION:(41,02,53,04),unlit,"ordinary" REGION:(55,02,60,04),unlit,"ordinary" REGION:(62,02,67,04),lit,"ordinary" # Stairs STAIR:(66,03),down # Portal arrival point BRANCH:(68,14,68,14),(0,0,0,0) # Non diggable walls NON_DIGGABLE:(00,00,75,19) # Doors DOOR:locked,(31,05) DOOR:locked,(36,05) DOOR:locked,(41,05) DOOR:locked,(52,05) DOOR:locked,(58,05) DOOR:locked,(28,07) DOOR:locked,(39,07) DOOR:locked,(50,07) DOOR:locked,(61,07) DOOR:closed,(33,03) DOOR:closed,(40,03) DOOR:closed,(54,03) DOOR:closed,(61,03) DOOR:open,(12,11) DOOR:open,(09,17) DOOR:open,(16,17) DOOR:locked,(35,07) DOOR:locked,(36,07) # Monsters on siege duty. MONSTER: 's',"giant spider",random MONSTER: 's',"giant spider",random MONSTER: 's',"giant spider",random MONSTER: 's',"giant spider",random MONSTER: 's',"giant spider",random MONSTER: 's',"giant spider",random MONSTER: 's',"giant spider",random MONSTER: 's',"giant spider",random MONSTER: 's',"giant spider",random MONSTER: 's',"giant spider",random MONSTER: 's',"giant spider",random MONSTER: 's',"giant spider",random MONSTER: 's',random,random MONSTER: 's',random,random MONSTER: 'C',"forest centaur",random MONSTER: 'C',"forest centaur",random MONSTER: 'C',"forest centaur",random MONSTER: 'C',"forest centaur",random MONSTER: 'C',"forest centaur",random MONSTER: 'C',"forest centaur",random MONSTER: 'C',"forest centaur",random MONSTER: 'C',"forest centaur",random MONSTER: 'C',random,random # Twoflower MONSTER:'@',"Twoflower",(64,03) # The treasure of Twoflower OBJECT:'(',"chest",(64,03) # guides for the audience chamber MONSTER:'@',"guide",(29,03) MONSTER:'@',"guide",(32,04) MONSTER:'@',"guide",(35,02) MONSTER:'@',"guide",(38,03) MONSTER:'@',"guide",(45,03) MONSTER:'@',"guide",(48,02) MONSTER:'@',"guide",(49,04) MONSTER:'@',"guide",(51,03) MONSTER:'@',"guide",(57,03) MONSTER:'@',"guide",(62,04) MONSTER:'@',"guide",(66,04) # path guards MONSTER:'@',"watchman",(35,08) MONSTER:'@',"watchman",(36,08) # river monsters MONSTER:';',"giant eel",(62,12) MONSTER:';',"piranha",(47,10) MONSTER:';',"piranha",(29,11) MONSTER:';',"kraken",(34,09) MONSTER:';',"kraken",(37,09) # Random traps TRAP:random,random TRAP:random,random TRAP:random,random TRAP:random,random TRAP:random,random TRAP:random,random TRAP:random,random TRAP:random,random TRAP:random,random # # The "locate" level for the quest. # # Here you have to find the Thieves' Guild Hall to go # further towards your assigned quest. # MAZE: "Tou-loca",' ' FLAGS: hardfloor GEOMETRY:center,center MAP ---------------------------------------------------------------------------- |....|......|..........|......|......|...|....|.....|......|...............| |....|......|.|------|.|......|......|.|.|....|..}..|......|.|----------|..| |....|--+----.|......|.|-S---+|+-----|.|.S....|.....|---+--|.|..........+..| |....|........|......|.|...|.........|.|------|..............|..........|-+| |....+...}}...+......|.|...|.|-----|.|..............|--+----------------|..| |----|........|------|.|---|.|.....|......|-----+-|.|.......|...........|--| |............................|.....|.|--+-|.......|.|.......|...........|..| |----|.....|-------------|...|--+--|.|....|.......|.|-----------+-------|..| |....+.....+.........S...|...........|....|-------|........................| |....|.....|.........|...|.|---------|....|.........|-------|.|----------|.| |....|.....|---------|---|.|......|..+....|-------|.|.......|.+......S.\.|.| |....|.....+.........S...|.|......|..|....|.......|.|.......|.|......|...|.| |-------|..|.........|---|.|+-------------------+-|.|.......+.|----------|.| |.......+..|---------|.........|.........|..........|.......|.|..........|.| |.......|..............|--+--|.|.........|.|----+-----------|.|..........|.| |---------+-|--+-----|-|.....|.|.........|.|........|.|.....+.|..........+.| |...........|........|.S.....|.|----+----|.|--------|.|.....|.|----------|.| |...........|........|.|.....|........................|.....|..............| ---------------------------------------------------------------------------- ENDMAP # Dungeon Description REGION:(00,00,75,19),lit,"ordinary" NON_DIGGABLE:(00,00,75,19) # REGION:(01,01,04,05),unlit,"morgue" REGION:(15,03,20,05),lit,"shop" REGION:(62,03,71,04),lit,"shop" REGION:(01,17,11,18),lit,"barracks" REGION:(12,09,20,10),lit,"barracks" REGION:(53,11,59,14),lit,"zoo" REGION:(63,14,72,16),lit,"barracks" REGION:(32,14,40,16),lit,"temple" # REGION:(06,01,11,02),random,"ordinary" REGION:(24,01,29,02),random,"ordinary" REGION:(31,01,36,02),random,"ordinary" REGION:(42,01,45,03),random,"ordinary" REGION:(53,01,58,02),random,"ordinary" REGION:(24,04,26,05),random,"ordinary" REGION:(30,06,34,07),random,"ordinary" REGION:(73,05,74,05),unlit,"ordinary" REGION:(01,09,04,12),random,"ordinary" REGION:(01,14,07,15),random,"ordinary" REGION:(12,12,20,13),random,"ordinary" REGION:(13,17,20,18),random,"ordinary" REGION:(22,09,24,10),random,"ordinary" REGION:(22,12,24,12),random,"ordinary" REGION:(24,16,28,18),random,"ordinary" REGION:(28,11,33,12),random,"ordinary" REGION:(35,11,36,12),lit,"ordinary" REGION:(38,08,41,12),random,"ordinary" REGION:(43,07,49,08),random,"ordinary" REGION:(43,12,49,12),random,"ordinary" REGION:(44,16,51,16),random,"ordinary" REGION:(53,06,59,07),random,"ordinary" REGION:(61,06,71,07),random,"ordinary" REGION:(55,16,59,18),random,"ordinary" REGION:(63,11,68,12),random,"ordinary" REGION:(70,11,72,12),random,"ordinary" # Stairs STAIR:(10,04),up STAIR:(73,05),down # Non diggable walls NON_DIGGABLE:(00,00,75,19) DOOR:closed,(05,05) DOOR:closed,(05,09) DOOR:closed,(08,14) DOOR:closed,(08,03) DOOR:closed,(11,09) DOOR:closed,(11,12) DOOR:closed,(10,16) DOOR:closed,(14,05) DOOR:closed,(15,16) DOOR:locked,(21,09) DOOR:locked,(21,12) DOOR:closed,(23,17) DOOR:closed,(25,03) DOOR:closed,(26,15) DOOR:closed,(29,03) DOOR:closed,(28,13) DOOR:closed,(31,03) DOOR:closed,(32,08) DOOR:closed,(37,11) DOOR:closed,(36,17) DOOR:locked,(41,03) DOOR:closed,(40,07) DOOR:closed,(48,06) DOOR:closed,(48,13) DOOR:closed,(48,15) DOOR:closed,(56,03) DOOR:closed,(55,05) DOOR:closed,(72,03) DOOR:locked,(74,04) DOOR:closed,(64,08) DOOR:closed,(62,11) DOOR:closed,(69,11) DOOR:closed,(60,13) DOOR:closed,(60,16) DOOR:closed,(73,16) # Objects OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random # Toilet paper OBJECT:'?',"blank paper",(71,12) OBJECT:'?',"blank paper",(71,12) # Random traps TRAP:random,random TRAP:random,random TRAP:random,random TRAP:random,random TRAP:random,random TRAP:random,random TRAP:random,random TRAP:random,random TRAP:random,random # Random monsters. MONSTER:'s',"giant spider",random MONSTER:'s',"giant spider",random MONSTER:'s',"giant spider",random MONSTER:'s',"giant spider",random MONSTER:'s',"giant spider",random MONSTER:'s',"giant spider",random MONSTER:'s',"giant spider",random MONSTER:'s',"giant spider",random MONSTER:'s',"giant spider",random MONSTER:'s',"giant spider",random MONSTER:'s',"giant spider",random MONSTER:'s',"giant spider",random MONSTER:'s',"giant spider",random MONSTER:'s',"giant spider",random MONSTER:'s',"giant spider",random MONSTER:'s',"giant spider",random MONSTER:'s',random,random MONSTER:'s',random,random # # The "goal" level for the quest. # # Here you meet the Master of Thieves your nemesis monster. You have to # defeat the Master of Thieves in combat to gain the artifact you have # been assigned to retrieve. # MAZE: "Tou-goal", ' ' GEOMETRY:center,center MAP ---------------------------------------------------------------------------- |.........|.........|..........|..| |.................|........|........|..| |.........|.........|..........|..| |....--------.....|........|........|..| |------S--|--+-----------+------..| |....|......|.....|........|........|..| |.........|.......................| |....|......+.....--+-------------+--..| |.........|.......................| |....|......|..........................| |-S-----S-|......----------.......| |....|......|..........................| |..|..|...|......|........|.......| |....-----------.........----..........| |..+..+...|......|........|.......| |....|.........|.........|}}|..........| |..|..|...|......+........|.......| |....|.........+.........|}}|..........| |..|..|...|......|........|.......S.S....|.........|.........----..........| |---..----|......|........|.......| |....|.........|.......................| |.........+......|+F-+F-+F|.......| |....-----------.......................| |---..----|......|..|..|..|.......| |......................--------------..| |..|..|...|......--F-F--F--.......| |......................+............|..| |..+..+...|.......................| |--.---...-----+-----..|............|..| |--|..----|--+-----------+------..| |.....|...|.........|..|------------|..| |..+..+...|.........|..........|..| |.....|...|.........|..+............|..| |..|..|...|.........|..........|..| |.....|...|.........|..|............|..| ---------------------------------------------------------------------------- ENDMAP # Dungeon Description REGION:(00,00,75,19),lit,"ordinary" # The Inn REGION:(01,01,09,02),lit,"ordinary" REGION:(01,04,09,05),lit,"barracks" REGION:(01,07,02,10),unlit,"ordinary" REGION:(07,07,09,10),unlit,"ordinary" REGION:(01,14,02,15),unlit,"ordinary" REGION:(07,14,09,15),unlit,"ordinary" REGION:(01,17,02,18),unlit,"ordinary" REGION:(07,17,09,18),unlit,"ordinary" # REGION:(11,01,19,02),unlit,"barracks" REGION:(21,01,30,02),unlit,"ordinary" REGION:(11,17,19,18),unlit,"barracks" REGION:(21,17,30,18),unlit,"ordinary" # Police Station REGION:(18,07,25,11),lit,"ordinary" REGION:(18,13,19,13),unlit,"ordinary" REGION:(21,13,22,13),unlit,"ordinary" REGION:(24,13,25,13),unlit,"ordinary" # The town itself REGION:(42,03,47,06),unlit,"ordinary" REGION:(42,08,50,11),unlit,"ordinary" REGION:(37,16,41,18),unlit,"morgue" REGION:(47,16,55,18),unlit,"ordinary" REGION:(55,01,62,03),unlit,"ordinary" REGION:(64,01,71,03),unlit,"ordinary" REGION:(60,14,71,15),lit,"shop" REGION:(60,17,71,18),lit,"shop" # Non diggable walls NON_DIGGABLE:(00,00,75,19) # Stairs STAIR:(70,08),up # Doors DOOR:locked,(07,03) DOOR:locked,(02,06) DOOR:locked,(08,06) DOOR:closed,(03,08) DOOR:closed,(06,08) DOOR:open,(10,12) DOOR:closed,(03,15) DOOR:closed,(06,15) DOOR:closed,(03,17) DOOR:closed,(06,17) DOOR:closed,(13,03) DOOR:random,(25,03) DOOR:closed,(13,16) DOOR:random,(25,16) DOOR:locked,(17,09) DOOR:locked,(18,12) DOOR:locked,(21,12) DOOR:locked,(24,12) DOOR:locked,(34,10) DOOR:locked,(36,10) DOOR:random,(48,04) DOOR:random,(56,04) DOOR:random,(70,04) DOOR:random,(51,09) DOOR:random,(51,15) DOOR:open,(59,14) DOOR:open,(59,17) # Objects OBJECT:'(',"credit card",(04,01),blessed,0,"The Platinum Yendorian Express Card" OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,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:'@',"Master of Thieves",(04,01),hostile MONSTER:'s',"giant spider",random MONSTER:'s',"giant spider",random MONSTER:'s',"giant spider",random MONSTER:'s',"giant spider",random MONSTER:'s',"giant spider",random MONSTER:'s',"giant spider",random MONSTER:'s',"giant spider",random MONSTER:'s',"giant spider",random MONSTER:'s',"giant spider",random MONSTER:'s',"giant spider",random MONSTER:'s',"giant spider",random MONSTER:'s',"giant spider",random MONSTER:'s',"giant spider",random MONSTER:'s',"giant spider",random MONSTER:'s',"giant spider",random MONSTER:'s',"giant spider",random MONSTER:'s',random,random MONSTER:'s',random,random # ladies of the evening MONSTER:'&',"succubus",(02,08) MONSTER:'&',"succubus",(08,08) MONSTER:'&',"incubus",(02,14) MONSTER:'&',"incubus",(08,14) MONSTER:'&',"incubus",(02,17) MONSTER:'&',"incubus",(08,17) # Police station (with drunken prisoners) MONSTER:'K',"Kop Kaptain",(24,09),hostile MONSTER:'K',"Kop Lieutenant",(20,09),hostile MONSTER:'K',"Kop Lieutenant",(22,11),hostile MONSTER:'K',"Kop Lieutenant",(22,07),hostile MONSTER:'K',"Keystone Kop",(19,07),hostile MONSTER:'K',"Keystone Kop",(19,08),hostile MONSTER:'K',"Keystone Kop",(22,09),hostile MONSTER:'K',"Keystone Kop",(24,11),hostile MONSTER:'K',"Keystone Kop",(19,11),hostile MONSTER:'@',"prisoner",(19,13) MONSTER:'@',"prisoner",(21,13) MONSTER:'@',"prisoner",(24,13) # MONSTER:'@',"watchman",(33,10),hostile WALLIFY # # The "fill" level for the quest. # # This level is used to fill out any levels not occupied by specific # levels as defined above. # MAZE: "Tou-fila" , ' ' INIT_MAP: '.' , ' ', true, true, random, true NOMAP # STAIR: random, up STAIR: random, down # OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, 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 # MONSTER: '@', "soldier", random, hostile MONSTER: '@', "soldier", random, hostile MONSTER: '@', "soldier", random, hostile MONSTER: '@', "soldier", random, hostile MONSTER: '@', "soldier", random, hostile MONSTER: 'H', random, random, hostile MONSTER: 'C', random, random, hostile MAZE: "Tou-filb" , ' ' INIT_MAP: '.' , ' ', true, true, random, true NOMAP # STAIR: random, up STAIR: random, down # OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, 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 # MONSTER: '@', "soldier", random, hostile MONSTER: '@', "captain", random, hostile MONSTER: '@', "captain", random, hostile MONSTER: 'H', random, random, hostile MONSTER: 'H', random, random, hostile MONSTER: 'C', random, random, hostile MONSTER: 's', random, random slashem-0.0.7E7F3/dat/oracle.des0000664000076400007640000000301610545462317014366 0ustar aliali# SCCS Id: @(#)oracle.des 3.4 1995/10/07 # NetHack may be freely redistributed. See license for details. # # Oracle level # LEVEL: "oracle" ROOM: "ordinary" , lit, (3,3), (center,center), (11,9) NAME: "central" OBJECT:'`',"statue",(0,0),"forest centaur",1 OBJECT:'`',"statue",(0,8),"mountain centaur",1 OBJECT:'`',"statue",(10,0),"mountain centaur",1 OBJECT:'`',"statue",(10,8),"forest centaur",1 OBJECT:'`',"statue",(5,1),"plains centaur",1 OBJECT:'`',"statue",(5,7),"plains centaur",1 OBJECT:'`',"statue",(2,4),"plains centaur",1 OBJECT:'`',"statue",(8,4),"plains centaur",1 MONSTER: random, random, random MONSTER: random, random, random SUBROOM: "delphi" , lit , (4,3) , (3,3), "central" FOUNTAIN: (0, 1) FOUNTAIN: (1, 0) FOUNTAIN: (1, 2) FOUNTAIN: (2, 1) MONSTER: '@', "Oracle", (1,1) DOOR: false , nodoor , random, random ROOM: "ordinary" , random, random, random, random STAIR: random, up OBJECT: random,random,random ROOM: "ordinary" , random, random, random, random STAIR: random, down OBJECT: random, random, random TRAP: random, random MONSTER: random, random, random MONSTER: random, random, random ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random OBJECT: random, random, random MONSTER: random, random, random ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random TRAP: random, random MONSTER: random, random, random ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random TRAP: random, random MONSTER: random, random, random RANDOM_CORRIDORS slashem-0.0.7E7F3/dat/Necro.des0000664000076400007640000003327410545462317014200 0ustar aliali# SCCS Id: @(#)Necro.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. # # [Tom] -- the necromancer quest # MAZE: "Nec-strt",' ' FLAGS: noteleport,hardfloor GEOMETRY:center,center # # # # # #0 1 2 3 4 5 6 #1234567890123456789012345678901234567890123456789012345678901234567890 MAP .LLLLLLLL...............................C................................... ...LLLLLLLL..........................C.C.CCC................................ ....LLLLLLLLLL.........................C..CCCC.............................. ......LLLLLLLLLL......LLLLLLLLLLLLLL........CC...............CCCCC.......... .....LLLLLLLLLLLLLL...L|----------|L.......CCCC............CCC...CC......... .........LLLLLLLLLLLLLL|..........|LLLL...CCCCCC..........CCC.....CCC....... ..............LLLLLL|--|..........|--|L...C...............CC........CC...... ..........LLLLLL...L|................|...CCC...............CC......CC....... ............LLL....L|....\...........S.....CCC............CCCC....C......... .............LLL...L|................|..................C.CCCCC.CCC......... ..............LLL..L|--|..........|--|L...CC...........CCCCCCC.............. ...................LLLL|..........|LLLL...CCCCC.........C...CCC............. ......................L|----------|L.........CCCCC......C...C............... ......................LLLLLLLLLLLLLL..........CC............................ .........................................CCC..................C............. ................................C....C.....CCC.............................. ...........................CCCC........CCCCC................................ ..............................C....CCCC..................................... ......................CCC................................................... ............................................................................ ENDMAP # Random Monsters RANDOM_MONSTERS: 'B', 'i' # Dungeon Description REGION:(00,00,75,19),unlit,"ordinary" # Stairs STAIR:(16,07),down # Portal arrival point BRANCH:(63,06,63,06),(0,0,0,0) # Dark Lord MONSTER:'@',"Dark Lord",(25,08) # The treasure of the Dark Lord OBJECT:'(',"chest",(25,09) # apprentice guards for the audience chamber MONSTER:'@',"embalmer",(24,07) MONSTER:'@',"embalmer",(25,07) MONSTER:'@',"embalmer",(26,07) MONSTER:'@',"embalmer",(24,09) MONSTER:'@',"embalmer",(25,09) MONSTER:'@',"embalmer",(26,09) MONSTER:'@',"embalmer",(24,11) MONSTER:'@',"embalmer",(25,11) MONSTER:'@',"embalmer",(26,11) # Non diggable walls NON_DIGGABLE:(00,00,75,19) # Monsters on siege duty. MONSTER: 'B',"mongbat",(60,09),hostile MONSTER: 'B',"mongbat",(60,10),hostile MONSTER: 'B',"mongbat",(60,11),hostile MONSTER: 'B',"mongbat",(60,12),hostile MONSTER: 'i',"nupperibo",(60,13),hostile MONSTER: 'B',"mongbat",(61,10),hostile MONSTER: 'B',"mongbat",(61,11),hostile MONSTER: 'B',"mongbat",(61,12),hostile MONSTER: 'B',random,(35,03),hostile MONSTER: 'i',random,(35,17),hostile MONSTER: 'B',random,(36,17),hostile MONSTER: 'B',random,(34,16),hostile MONSTER: 'i',random,(34,17),hostile MONSTER: 'B',random,(10,19),hostile # # The "locate" level for the quest. # # Here you have to find the Entrance to the Lair of Maugneshaagar to go # further towards your assigned quest. # MAZE: "Nec-loca",' ' FLAGS: hardfloor GEOMETRY:center,center MAP ..... ......... ............. ............ ................. .............. ....................... ...CC.. ................. ....................... ....C.......C ..L...L..LLL..... ...................... .............. LLL.......LLL..... .................... ......L..L..... ...................L ..................... ............L..CC................L..L .................. .............. .................L .................. ....L..L..... ......C.C.......L .............. ........L.. ..CCC... CCC.... ........... ... ..... .C.C..C....C........ ........ ... .C..CCC...C......... --S-- .... ........................ ..... ......C.C............ .... .................. ........ ENDMAP # Random Monsters RANDOM_MONSTERS: '&', 'i' # Dungeon Description REGION:(00,00,66,20),unlit,"ordinary" # Stairs STAIR:(03,17),up STAIR:(54,05),down # Non diggable walls NON_DIGGABLE:(00,00,66,20) # Objects OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random # Random traps TRAP:"spiked pit",random TRAP:"spiked pit",random TRAP:"spiked pit",random TRAP:"spiked pit",random TRAP:"spiked pit",random TRAP:"spiked pit",random TRAP:"spiked pit",random TRAP:"spiked pit",random TRAP:"spiked pit",random TRAP:"magic",random TRAP:"dart",random TRAP:"dart",random TRAP:"dart",random # Random monsters. MONSTER:'B',"mongbat",random,hostile MONSTER:'B',"mongbat",random,hostile MONSTER:'B',"mongbat",random,hostile MONSTER:'B',"mongbat",random,hostile MONSTER:'B',"mongbat",random,hostile MONSTER:'B',"mongbat",random,hostile MONSTER:'B',"mongbat",random,hostile MONSTER:'B',"mongbat",random,hostile MONSTER:'B',"mongbat",random,hostile MONSTER:'B',"mongbat",random,hostile MONSTER:'B',random,random,hostile MONSTER:'B',random,random,hostile MONSTER:'B',random,random,hostile MONSTER:'i',"nupperibo",random,hostile MONSTER:'i',"nupperibo",random,hostile MONSTER:'i',"nupperibo",random,hostile MONSTER:'i',"nupperibo",random,hostile MONSTER:'i',"nupperibo",random,hostile MONSTER:'i',"nupperibo",random,hostile MONSTER:'i',"nupperibo",random,hostile MONSTER:'i',"nupperibo",random,hostile MONSTER:'i',"blood imp",random,hostile MONSTER:'i',"blood imp",random,hostile MONSTER:'i',"blood imp",random,hostile MONSTER:'i',"blood imp",random,hostile MONSTER:'i',"blood imp",random,hostile MONSTER:'i',"blood imp",random,hostile MONSTER:'i',"blood imp",random,hostile MONSTER:'i',random,random,hostile MONSTER:'i',random,random,hostile MONSTER:'i',random,random,hostile MONSTER:'i',random,random,hostile MONSTER:'i',random,random,hostile # # The "goal" level for the quest. # # Here you meet Maugneshaagar, your nemesis monster. You have to # defeat Maugneshaagar in combat to gain the artifact you have # been assigned to retrieve. # MAZE: "Nec-goal", ' ' GEOMETRY:center,center MAP ------------- ------------- |...........| |...........| -------|...........-------------------...........| |......S...........|..|..|..|..|..|..|...........| |......|...........|..|..|..|..|..|..|...........| |......|...........--+--+--+--+--+--+-...........| --S----|...........S.................+...........| |......|...........--+--+--+--+--+--+-...........| |......|...........|..|..|..|..|..|..|...........| |......|...........|..|..|..|..|..|..|...........| -------|...........-------------------...........| |...........| |...........| ------------- ------------- ENDMAP # Random Monsters RANDOM_MONSTERS: 'B', 'i' # Dungeon Description REGION:(13,10,18,12),unlit,"temple" REGION:(13,06,18,08),lit,"ordinary" REGION:(20,04,30,14),unlit,"ordinary" REGION:(32,06,33,07),unlit,"ordinary" REGION:(35,06,36,07),unlit,"ordinary" REGION:(38,06,39,07),unlit,"ordinary" REGION:(41,06,42,07),unlit,"ordinary" REGION:(44,06,45,07),unlit,"ordinary" REGION:(47,06,48,07),unlit,"ordinary" REGION:(32,09,48,09),unlit,"ordinary" REGION:(32,11,33,12),unlit,"ordinary" REGION:(35,11,36,12),unlit,"ordinary" REGION:(38,11,39,12),unlit,"ordinary" REGION:(41,11,42,12),unlit,"ordinary" REGION:(44,11,45,12),unlit,"ordinary" REGION:(47,11,48,12),unlit,"ordinary" REGION:(50,04,60,14),lit,"ordinary" # Doors DOOR:locked,(19,06) DOOR:locked,(14,09) DOOR:locked,(31,09) DOOR:locked,(33,08) DOOR:locked,(36,08) DOOR:locked,(39,08) DOOR:locked,(42,08) DOOR:locked,(45,08) DOOR:locked,(48,08) DOOR:locked,(33,10) DOOR:locked,(36,10) DOOR:locked,(39,10) DOOR:locked,(42,10) DOOR:locked,(45,10) DOOR:locked,(48,10) DOOR:locked,(49,09) # Stairs STAIR:(55,05),up # Non diggable walls NON_DIGGABLE:(00,00,75,19) # The altar of Moloch. This is not a shrine. ALTAR:(16,11),noalign,altar # Objects OBJECT:')',"great dagger",(16,11),blessed,0,"The Great Dagger of Glaurgnaa" OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,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:'&',"Maugneshaagar",(16,11) MONSTER:'B',"mongbat",random,hostile MONSTER:'B',"mongbat",random,hostile MONSTER:'B',"mongbat",random,hostile MONSTER:'B',"mongbat",random,hostile MONSTER:'&',random,random,hostile MONSTER:'&',random,random,hostile MONSTER:'&',random,random,hostile MONSTER:'&',random,random,hostile MONSTER:'&',random,random,hostile MONSTER:'&',random,random,hostile MONSTER:'&',random,random,hostile MONSTER:'&',random,random,hostile MONSTER:'&',random,random,hostile MONSTER:'i',"nupperibo",random,hostile MONSTER:'i',"nupperibo",random,hostile MONSTER:'i',"nupperibo",random,hostile MONSTER:'i',"nupperibo",random,hostile MONSTER:'i',"nupperibo",random,hostile MONSTER:'i',"nupperibo",random,hostile MONSTER:'i',"nupperibo",random,hostile MONSTER:'i',"nupperibo",random,hostile MONSTER:'i',"blood imp",random,hostile MONSTER:'i',"blood imp",random,hostile MONSTER:'i',"blood imp",random,hostile MONSTER:'i',"blood imp",random,hostile MONSTER:'i',"blood imp",random,hostile MONSTER:'i',"blood imp",random,hostile MONSTER:'i',"blood imp",random,hostile # Captive Monsters in the dungeon #MONSTER:'@',"rogue",(35,06),peaceful,"Pug" #MONSTER:'Y',"owlbear",(47,06),peaceful,asleep #MONSTER:'@',"wizard",(32,11),peaceful,asleep,"Newt" #MONSTER:'@',"Grey-elf",(44,11),peaceful #MONSTER:'H',"hill giant",(47,11),peaceful,asleep #MONSTER:'G',"gnomish wizard",(38,06),peaceful # # The "fill" levels for the quest. # # These levels are used to fill out any levels not occupied by specific # levels as defined above. "filla" is the upper filler, between the # start and locate levels, and "fillb" the lower between the locate # and goal levels. # LEVEL: "Nec-fila" # Random Monsters RANDOM_MONSTERS: 'B', 'i' # ROOM: "ordinary" , random, random, random, random STAIR: random, up OBJECT: random,random,random MONSTER: 'i', random, random, hostile ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random OBJECT: random,random,random MONSTER: 'i', random, random, hostile ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random TRAP: random, random OBJECT: random,random,random MONSTER: 'B', "mongbat", random MONSTER: 'B', "mongbat", random ROOM: "ordinary" , random, random, random, random STAIR: random, down OBJECT: random, random, random TRAP: random, random MONSTER: 'i', random, random, hostile MONSTER: 'B', "mongbat", random ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random OBJECT: random, random, random TRAP: random, random MONSTER: 'i', random, random, hostile ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random TRAP: random, random MONSTER: 'B', "mongbat", random RANDOM_CORRIDORS LEVEL: "Nec-filb" # Random Monsters RANDOM_MONSTERS: 'B', 'i' # ROOM: "ordinary" , random, random, random, random STAIR: random, up OBJECT: random,random,random MONSTER: 'i', random, random, hostile ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random OBJECT: random,random,random MONSTER: 'i', random, random, hostile ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random TRAP: random, random OBJECT: random,random,random MONSTER: 'i', random, random, hostile ROOM: "ordinary" , random, random, random, random STAIR: random, down OBJECT: random, random, random TRAP: random, random MONSTER: 'i', random, random, hostile MONSTER: 'B', "mongbat", random ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random OBJECT: random, random, random TRAP: random, random MONSTER: 'i', random, random, hostile ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random TRAP: random, random MONSTER: 'B', "mongbat", random RANDOM_CORRIDORS slashem-0.0.7E7F3/dat/quest.txt0000664000076400007640000041720410545462317014336 0ustar aliali# SCCS Id: @(#)quest.txt 3.4 2002/03/26 # Copyright (c) 1991 by M. Stephenson # NetHack may be freely redistributed. See license for details. # # The quest text file for Slash'em (NH3.4.0 version). # # These are the "standard" message numbers from qtext.h. All class # dialogue must have at least these entries. # # QT_FIRSTTIME 1 # 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 # # QT_FIRSTNEMESIS 50 # QT_NEXTNEMESIS 51 # QT_OTHERNEMESIS 52 # QT_NEMWANTSIT 53 /* you somehow got the artifact */ # # QT_DISCOURAGE 60 /* 1-10 random maledictive messages */ # # QT_GOTIT 70 # # QT_KILLEDNEM 80 # QT_OFFEREDIT 81 # QT_OFFEREDIT2 82 /* if you throw artifact to leader after #81 */ # # QT_POSTHANKS 90 # QT_HASAMULET 91 # # # Archeologist # %Cc Arc 00001 You are suddenly in familiar surroundings. The buildings in the distance appear to be those of your old alma mater, but something is wrong. It looks as if there has been a riot recently, or %H has been under siege. All of the windows are boarded up, and there are objects scattered around the entrance. Strange forbidding shapes seem to be moving in the distance. %E %Cp Arc 00002 Once again, you are back at %H. %E %Cp Arc 00003 You are back at %H. You have an odd feeling this may be the last time you ever come here. %E %Cp Arc 00005 "Did you see Lash LaRue in 'Song of Old Wyoming' the other night?" %E %Cp Arc 00006 "Hey man, got any potions of hallucination for sale?" %E %Cp Arc 00007 "Did you see the artifact %l brought back from the last dig?" %E %Cp Arc 00008 "So what species do *you* think we evolved from?" %E %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. "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 close this college. "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 A strange feeling washes over you, and you think back to things you learned during the many lectures of %l. You realize the feeling must be the presence of %o. %E %Cp Arc 00041 The familiar presence of %o is in the ether. %E %Cc Arc 00050 "So, %p, you think that you can succeed in recovering %o, when your teacher, %l, has already failed. "Come, try your best! I shall destroy you, and gnaw on your bones." %E %Cc Arc 00051 "Again you try to best me, eh %p? Well, you shall fail again. "You shall never recover %o. "I shall bear your soul to the Plane of Origins for my master's pleasure." %E %Cp Arc 00052 "You persist yet %p! Good. Now, you shall die!" %E %Cp Arc 00053 "I shall have %o from you, %p, then feast upon your entrails!" %E %Cp Arc 00060 "Try your best, %p. You cannot defeat me." %E %Cp Arc 00061 "I shall rend the flesh from your body whilst you still breathe!" %E %Cp Arc 00062 "First you, %p, then I shall destroy your mentor, %l." %E %Cp Arc 00063 "Tiring yet, %p? I draw my power from my master and cannot falter!" %E %Cp Arc 00064 "I shall rend thy soul from thy body and consume it!" %E %Cp Arc 00065 "You are far too %a -- it weakens you. You shall die in this place." %E %Cp Arc 00066 "%d has forsaken you! You are lost now!" %E %Cp Arc 00067 "A mere %r cannot hope to defeat me!" %E %Cp Arc 00068 "If you are the best %l can send, I have nothing to fear." %E %Cp Arc 00069 "Die %c! I shall exhibit your carcass as a trophy." %E %Cc Arc 00070 The power of %o flows through your body! You feel as if you could now take on the Wizard of Yendor himself and win, but you know you must return %o to %l. %E %Cp Arc 00080 The body of %n dissipates in a cloud of noxious fumes. %E %Cc Arc 00081 %lC touches %o briefly, gazes into it, then smiles at you and says: "Well done, %p. You have defeated %n and recovered %o. But I fear that it shall never be safe here. Please take %o with you. You, %p, can guard it now far better than I. May the blessings of %d follow you and guard you." %E # assumes Orb of Detection (glass object) %Cc Arc 00082 "Careful, %p! %oC might break, and that would be a tragic loss. You are its keeper now, and the time has come to resume your search for the Amulet. %Z await your return through the magic portal that brought you here." %E %Cc Arc 00090 "Welcome back, %p. Have you progressed with your quest to regain the Amulet of Yendor for %d?" %E %Cc Arc 00091 "Congratulations, %p. I wondered if anyone could prevail against the Wizard and the minions of Moloch. Now, you must embark on one final adventure. "Take the Amulet, and find your way onto the astral plane. There you must find the altar of %d and sacrifice the Amulet on that altar to fulfill your destiny. "Remember, your path now should always be upwards." %E # # Barbarian # %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? Suddenly, the hairs on your neck stand on end as you detect the aura of evil magic in the air. Without thought, you ready your weapon, and mutter under your breath: "By %d, there will be blood spilt today." %E %Cp Bar 00002 Once again, you near %H. You know that %l will be waiting. %E %Cp Bar 00003 Again, and you think possibly for the last time, you approach %H. %E %Cp Bar 00005 "The battles here have been good -- our enemies' blood soaks the soil!" %E %Cp Bar 00006 "Remember that glory is crushing your enemies beneath your feet!" %E %Cp Bar 00007 "There has been little treasure to loot, since the horde arrived." %E %Cp Bar 00008 "The horde is mighty in numbers, but they have little courage." %E %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. "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 as %n, had begun to gather a large group of cutthroats and brigands about him. "At about the same time, these people you once rode with `liberated' a potent magical talisman, %o, from a Turanian caravan. "%nC and his Black Horde swept down upon %i and defeated the people there, driving them out into the desert. He has taken %o, and seeks to bend it to his will. I detected the subtle changes in the currents of fate, and joined these people. Then I sent forth a summons for you. "If %n can bend %o to his will, he will become almost indestructible. He will then be able to enslave the minds of men across the world. You are the only hope. The gods smile upon you, and with %d behind you, you alone can defeat %n. "You must go to %i. From there, you can track down %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 The hairs on the nape of your neck lift as you sense an energy in the very air around you. You fight down a primordial panic that seeks to make you turn and run. This is surely the lair of %n. %E %Cp Bar 00041 Yet again you feel the air around you heavy with malevolent magical energy. %E %Cc Bar 00050 "So. This is what that second rate sorcerer %l sends to do his bidding. I have slain many before you. You shall give me little sport. "Prepare to die, %c." %E %Cp Bar 00051 "I have wasted too much time on you already. Now, you shall die." %E %Cp Bar 00052 "You return yet again, %c! Are you prepared for death now?" %E %Cp Bar 00053 "I shall have %o back, you pitiful excuse for %ca. And your life as well." %E %Cp Bar 00060 "My pets will dine on your carcass tonight!" %E %Cp Bar 00061 "You are a sorry excuse for %ra." %E %Cp Bar 00062 "Run while you can, %c. My next spell will be your last." %E %Cp Bar 00063 "I shall use your very skin to bind my next grimoire." %E %Cp Bar 00064 "%d cannot protect you now. Here, you die." %E %Cp Bar 00065 "Your %a nature makes you weak. You cannot defeat me." %E %Cp Bar 00066 "Come, %c. I shall kill you, then unleash the horde on your tribe." %E %Cp Bar 00067 "Once you are dead, my horde shall finish off %l, and your tribe." %E %Cp Bar 00068 "Fight, %c, or are you afraid of the mighty %n?" %E %Cp Bar 00069 "You have failed, %c. Now, my victory is complete." %E %Cc Bar 00070 As you pick up %o, you feel the power of it flowing through your hands. It seems to be in two or more places at once, even though you are holding it. %E %Cc Bar 00080 %nC falls to the ground, and utters a last curse at you. Then his body fades slowly, seemingly dispersing into the air around you. You slowly become aware that the overpowering aura of magic in the air has begun to fade. %E %Cc Bar 00081 When %l sees %o, he smiles, and says: Well done, %p. You have saved the world from certain doom. What, now, should be done with %o? These people, brave as they are, cannot hope to guard it from other sorcerers who will detect it, as surely as %n did. Take %o with you, %p. It will guard you in your adventures, and you can best guard it. You embark on a quest far greater than you realize. Remember me, %p, and return when you have triumphed. I will tell you then of what you must do. You will understand when the time comes. %E %Cc Bar 00082 %l gazes reverently at %o, then back at you. "You are its keeper now, and the time has come to resume your search for the Amulet. %Z await your return through the magic portal which brought you here." %E %Cp Bar 00090 "Tell us, %p, have you fared well on your great quest?" %E %Cc Bar 00091 "This is wondrous, %p. I feared that you could not possibly succeed in your quest, but here you are in possession of the Amulet of Yendor! "I have studied the texts of the magi constantly since you left. In the Book of Skelos, I found this: %d will cause a child to be sent into the world. This child is to be made strong by trial of battle and magic, for %d has willed it so. It is said that the child of %d will recover the Amulet of Yendor that was stolen from the Creator at the beginning of time. "As you now possess the amulet, %p, I suspect that the Book speaks of you. The child of %d will take the Amulet, and travel to the Astral Plane, where the Great Temple of %d is to be found. The Amulet will be sacrificed to %d, there on His altar. Then the child will stand by %d as champion of all %cP for eternity. "This is all I know, %p. I hope it will help you." %E # # Cave(wo)man # %Cc Cav 00001 You descend through a barely familiar stairwell that you remember %l showing you when you embarked upon your vision quest. You arrive back at %H, but something seems wrong here. The usual smoke and glowing light of the fires of the outer caves are absent, and an uneasy quiet fills the damp air. %E %Cp Cav 00002 Once again, you arrive back at %H. %E %Cp Cav 00003 For some reason, you think that this may be the last time you will enter %H. %E %Cp Cav 00005 "We have not been able to gather as much food since the Giants sealed off our access to the outer world." %E %Cp Cav 00006 "Since %n sent her minions, we have been constantly fighting." %E %Cp Cav 00007 "I have heard your vision quest was successful. Is this so?" %E %Cp Cav 00008 "So, tell me, %p, how have you fared?" %E %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. "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. "Begone from %H! You have betrayed us by choosing the path of the %C over the true path of the %L. "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. "%rA could not possibly survive the rigors demanded to find %i, never mind to confront %n herself. "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: "Shortly after you left on your vision quest, the caves were invaded by the creatures sent against us by %n. "She, herself, could not attack us due to her great size, but her minions have harassed us ever since. In the first attacks, many died, and the minions of %n managed to steal %o. They took it to %i and there, none of our %g warriors have been able to go. "You must find %i, and within it wrest %o from %n. She guards it as jealously as she guards all treasures she attains. But with it, we can make our caves safe once more. "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. 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 You find yourself in a large cavern, with neatly polished walls, that nevertheless show signs of being scorched by fire. Bones litter the floor, and there are objects scattered everywhere. The air is close with the stench of sulphurous fumes. %nC is clearly visible, but she seems to be asleep. %E %Cp Cav 00041 Once again, you find yourself in the lair of %n. %E %Cc Cav 00050 "So, follower of %l, you seek to invade the lair of %n. Only my meals are allowed down here. Prepare to be eaten!" %E %Cp Cav 00051 "So, again you face me, %c. No one has ever before escaped me. Now I shall kill you." %E %Cp Cav 00052 "You are getting annoying, %c. Prepare to die." %E %Cp Cav 00053 "I'll have %o from you, %c. You shall die." %E %Cp Cav 00060 "You are weak, %c. No challenge for the Mother of all Dragons." %E %Cp Cav 00061 "I grow hungry, %r. You look like a nice appetizer!" %E %Cp Cav 00062 "Join me for lunch? You're the main course, %c." %E %Cp Cav 00063 "With %o, I am invincible! You cannot succeed." %E %Cp Cav 00064 "Your mentor, %l has failed. You are nothing to fear." %E %Cp Cav 00065 "You shall die here, %c. %rA cannot hope to defeat me." %E %Cp Cav 00066 "You, a mere %r challenge the might of %n? Hah!" %E %Cp Cav 00067 "I am the Mother of all Dragons! You cannot hope to defeat me." %E %Cp Cav 00068 "My claws are sharp now. I shall rip you to shreds!" %E %Cp Cav 00069 "%d has deserted you, %c. This is my domain." %E %Cc Cav 00070 As you pick up %o it seems heavy at first, but as you hold it strength flows into your arms. You suddenly feel full of power, as if nothing could possibly stand in your path. %E %Cp Cav 00080 %nC sinks to the ground, her heads flailing about. As she dies, a cloud of noxious fumes billows about her. %E %Cc Cav 00081 %lC glimpses %o in your possession. He smiles and says: You have done it! We are saved. But I fear that %o will always be a target for %C forces who will want it for their own. To prevent further trouble, I would like you, %p, to take %o away with you. It will help you as you quest for the Amulet of Yendor. %E %Cc Cav 00082 %l grasps %o proudly for a moment, then looks at you. "You are its keeper now, and the time has come to resume your search for the Amulet. %Z await your return through the magic portal which brought you here." %E %Cp Cav 00090 "%pC! Welcome back. How goes your quest to recover the Amulet for %d?" %E %Cc Cav 00091 "You have been successful, I see, %p. "Now that the Amulet of Yendor is yours, here is what you must do: "Journey upwards to the open air. The Amulet you carry will then take you into the Astral Planes, where the Great Temple of %d casts its influence throughout our world. "Sacrifice the Amulet on the altar. Thus shall %d become supreme!" %E # # Flame Mage # %Cc Fla 00001 Waves of blistering heat ripple off of the lava-covered landscape that surrounds you. Off in the distance, you can see the craggy rocks of %H. Suddenly, the hairs on your neck stand on end as you detect a faint hint of evil moisture in the air. %E %Cp Fla 00002 Once again, you near %H. You know that %l will be waiting. %E %Cp Fla 00003 Again, and you think possibly for the last time, you approach %H. %E %Cp Fla 00005 "The battles here have been good -- our enemies' blood has boiled away!" %E %Cp Fla 00006 "May your days always be warm!" %E %Cp Fla 00007 "We have had trouble concentrating on our studies!" %E %Cp Fla 00008 "The water elementals are fierce, but they boil away under our fire!" %E %Cp Fla 00009 "%lC is a strange one, but he has helped defend us." %E %Cp Fla 00010 "The battles here have been good -- our enemies' blood has boiled away!" %E %Cp Fla 00011 "May your days always be warm!" %E %Cp Fla 00012 "Since the defeat of the hoarde, all can concentrate fully on our studies!" %E %Cp Fla 00013 "I'm taking my holidays in Gehennom this year - very warm there, supposedly" %E %Cp Fla 00014 "Have you noticed how much stronger %l is since %o was recovered?" %E %Cc Fla 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 Fla 00016 "%p, you are back. Are you ready now for the challenge?" %E %Cp Fla 00017 "Again, you stand before me, %p. Surely you have prepared yourself." %E %Cc Fla 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. "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 Fla 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 %Cp Fla 00020 "%p! 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 Fla 00021 "The world is in great need of your assistance, %p. "About six months ago, I learned that a mysterious sorcerer, known as %n, had begun to summon horrible elementals from the plane of Water. "%nC and his hordes of elementals swept down upon %H and stole %o, and seeks to bend it to his will. After many brave wizards were slain by his watery servants, I sent forth a summons for you! "If %n can bend %o to his will, he will become almost indestructible. He will then be able to enslave our elementals, and destroy us. You are our only hope. The gods smile upon you, and with %d behind you, you alone can defeat %n. "You must go to %i. From there, you can track down %n, defeat him, and return %o to us. Only then will the world be safe." %E %Cp Fla 00025 "%n is strong in the dark arts, but not immune to cold steel." %E %Cp Fla 00026 "Remember that %n is a great sorcerer. He lived in the time of Atlantis." %E %Cp Fla 00027 "If you fail, %p, I will not be able to protect these people long." %E %Cp Fla 00028 "To enter %i, you must be very stealthy. The elementals will be on guard." %E %Cp Fla 00029 "Call upon %d in your time of need." %E %Cp Fla 00030 "May %d protect you, and guide your steps." %E %Cp Fla 00031 "If you can lay hands upon %o, carry it for good fortune." %E %Cp Fla 00032 "I cannot stand against %ns sorcery. But %d will help you." %E %Cp Fla 00033 "Do not fear %n. I know you can defeat him." %E %Cp Fla 00034 "You have a great road to travel, %p, but only after you defeat %n." %E %Cc Fla 00035 The soggy scent of water comes to you in the breeze. You know that you have located %i. %E %Cp Fla 00036 Yet again you have a chance to infiltrate %i. %E %Cc Fla 00040 You sense an evil energy in the very air around you. You fight down a primordial panic that seeks to make you turn and run. This is surely the lair of %n. %E %Cp Fla 00041 Yet again you feel the air around you heavy with malevolent magical energy. %E %Cc Fla 00050 "So. This is what that second rate sorcerer %l sends to do his bidding. I have slain many before you. You shall give me little sport. "Prepare to die, %c." %E %Cp Fla 00051 "I have wasted too much time on you already. Now, you shall die." %E %Cp Fla 00052 "You return yet again, %c! Are you prepared for death now?" %E %Cp Fla 00053 "I shall have %o back, you pitiful excuse for %ca. And your life as well." %E %Cp Fla 00060 "My pets will dine on your carcass tonight!" %E %Cp Fla 00061 "You are a sorry excuse for %ra." %E %Cp Fla 00062 "Run while you can, %c. My next spell will be your last." %E %Cp Fla 00063 "I shall use your very skin to bind my next grimoire." %E %Cp Fla 00064 "%d cannot protect you now. Here, you die." %E %Cp Fla 00065 "Your %a nature makes you weak. You cannot defeat me." %E %Cp Fla 00066 "Come, %c. I shall kill you, then unleash the horde on your people." %E %Cp Fla 00067 "Once you are dead, my horde shall finish off %l, and your people." %E %Cp Fla 00068 "Fight, %c, or are you afraid of the mighty %nt?" %E %Cp Fla 00069 "You have failed, %c. Now, my victory is complete." %E %Cc Fla 00070 As you pick up %o, you feel the power of it flowing through your hands. It seems to be in two or more places at once, even though you are holding it. %E %Cp Fla 00080 %n falls to the ground, and utters a last curse at you. Then his body fades slowly, seemingly dispersing into the air around you. You slowly become aware that the overpowering aura of magic in the air has begun to fade. %E %Cc Fla 00081 When %l sees %o, he smiles, and says: Well done, %p. You have saved the world from certain doom. What, now, should be done with %o? These wizards, brave as they are, cannot hope to guard it from other sorcerers who will detect it, as surely as %n did. Take %o with you, %p. It will guard you in your adventures, and you can best guard it. You embark on a quest far greater than you realize. Remember me, %p, and return when you have triumphed. I will tell you then of what you must do. You will understand when the time comes. %E %Cc Fla 00082 %l gazes at %o warmly for a moment, then looks at you. "You are its keeper now, and the time has come to resume your search for the Amulet. %Z await your return through the magic portal which brought you here." %E %Cp Fla 00090 "Tell us, %p, have you fared well on your great quest?" %E %Cc Fla 00091 "This is wondrous, %p. I feared that you could not possibly succeed in your quest, but here you are in possession of the Amulet of Yendor! "I have studied the texts of the magi constantly since you left. In the Book of Skelos, I found this: %d will cause a child to be sent into the world. This child is to be made strong by trial of battle and magic, for %d has willed it so. It is said that the child of %d will recover the Amulet of Yendor that was stolen from the Creator at the beginning of time. "As you now possess the amulet, %p, I suspect that the Book speaks of you. The child of %d will take the Amulet, and travel to the Astral Plane, where the Great Temple of %d is to be found. The Amulet will be sacrificed to %d, there on His altar. Then the child will stand by %d as champion of all %cP for eternity. "This is all I know, %p. I hope it will help you." %E # # Healer # %Cc Hea 00001 What sorcery has brought you back to %H? The smell of fresh funeral pyres tells you that something is amiss with the healing powers that used to practice here. No rhizotomists are tending the materia medica gardens, and where are the common folk who used to come for the cures? You know that you must quickly make your way to the collegium, and %ls iatreion, and find out what has happened in your absence. %E %Cp Hea 00002 After your last experience you expected to be here, but you certainly did not expect to see things so much worse. This time you must succeed. %E %Cp Hea 00003 Again, you %x %H in the distance. The smell of death and disease permeates the air. You do not have to be %Ra to know that %n is on the verge of victory. %E %Cp Hea 00005 "Did you read that new treatise on the therapeutic use of leeches?" %E %Cp Hea 00006 "Paint a red caduceus on your shield and monsters won't hit you." %E %Cp Hea 00007 "I passed handwriting so they are demoting me a rank." %E %Cp Hea 00008 "I've heard that even %l has not been able to cure Chiron." %E %Cp Hea 00009 "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 eyes, but do not worry for me. I am not ready for Hades yet. We have exhausted much of our healing powers holding off %n. I need your fresh strength to carry on our work. "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 conscience. "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 for this task. Let me tell you what I know of the symptoms and hope that you can provide a cure. A short while ago, the dreaded %nt was fooled by the gods into thinking that he could use %o to find a cure for old age. Think of it, eternal youth! But his good health is accomplished by drawing the health from those around him. He has exhausted his own supply of healthy people and now he seeks to extend his influence into our world. You must recover from him %o and break the spell. 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 You stand within sight of the infamous Isle of %n. Even the words of %l had not prepared you for this. Steeling yourself against the wails of the ill that pierce your ears, you hurry on your task. Maybe with %o you can heal them on your return, but not now. %E %Cp Hea 00041 Once again, you %x the Isle of %n in the distance. %E %Cc Hea 00050 "They have made a mistake in sending you, %p. "When I add your youth to mine, it will just make it easier for me to defeat %l." %E %Cp Hea 00051 "Unlike your patients, you seem to keep coming back, %p!" %E %Cp Hea 00052 "Which would you like, %p? Boils, pleurisy, convulsions?" %E %Cp Hea 00053 "I'll have %o back from you, %r. You are not going to live to escape this place." %E %Cp Hea 00060 "They might as well give scalpels to wizards as to let you try to use %o!" %E %Cp Hea 00061 "If I could strike %l, surrounded by his %gP, imagine what I can do to you here by yourself." %E %Cp Hea 00062 "I will put my %Rp to work making a physic out of your ashes." %E %Cp Hea 00063 "As we speak, Hades gathers your patients to join you." %E %Cp Hea 00064 "After I'm done with you, I'll destroy %l as well." %E %Cp Hea 00065 "You will have to kill me if you ever hope to leave this place." %E %Cp Hea 00066 "I will impale your head on my caduceus for all to see." %E %Cp Hea 00067 "There is no materia medica in your sack which will cure you of me!" %E %Cp Hea 00068 "Do not fight too hard, I want your soul strong, not weakened!" %E %Cp Hea 00069 "You should have stopped studying at vetenary." %E %Cc Hea 00070 As you pick up %o, you feel its healing begin to warm your soul. You curse Zeus for taking it from its rightful owner, but at least you hope that %l can put it to good use once again. %E %Cc Hea 00080 The battered body of %n slumps to the ground and gasps out one last curse: You have defeated me, %p, but I shall have my revenge. How, I shall not say, but this curse shall be like a cancer on you. With that %n dies. %E %Cc Hea 00081 As soon as %l sees %o he summons his %gP. Gently, %l reaches out and touches %o. He instructs each of the assembled to do the same. When everyone has finished he speaks to you. Now that we have been replenished we can defeat this plague. You must take %o with you and replenish the worlds you have been called upon to travel next. I wish you could ride Chiron to the end of your journey, but I need him to help me spread the cure. Go now and continue your journey. %E %Cc Hea 00082 %l cautiously handles %o while watching you. "You are its keeper now, and the time has come to resume your search for the Amulet. %Z await your return through the magic portal which brought you here." %E %Cp Hea 00090 "You have again returned to us, %p. We have done well in your absence, yes? How fare you upon your quest for the Amulet?" %E %Cc Hea 00091 "Ah, you have recovered the Amulet, %p. Well done! "Now, you should know that you must travel through the elemental planes to the astral, and there return the Amulet to %d. Go forth and may our prayers be as a wind upon your back." %E # # Ice Mage # %Cc Ice 00001 The howling arctic wind is like a welcome home for you. Off in the distance, you can see the familiar ice crags that surround %H. Suddenly, the hairs on your neck stand on end as you detect the aura of evil magic in the air. %E %Cp Ice 00002 Once again, you near %H. You know that %l will be waiting. %E %Cp Ice 00003 Again, and you think possibly for the last time, you approach %H. %E %Cp Ice 00005 "Our enemies come from beneath the earth itself!" %E %Cp Ice 00006 "Remember to pack a pick-axe!" %E %Cp Ice 00007 "There has been little studying accomplished since the horde arrived." %E %Cp Ice 00008 "The horde is mighty in numbers, but they have little courage." %E %Cp Ice 00009 "%lC has helped defend us, but our strength is fading." %E %Cp Ice 00010 "Remember to pack a pick-axe!" %E %Cp Ice 00011 "Since the defeat of the hoarde, all can concentrate fully on our studies!" %E %Cp Ice 00012 "The frozen lake looks beautiful today" %E %Cp Ice 00013 "I always knew %n was too warm blooded to defeat us!" %E %Cp Ice 00014 "I've been trying to alter cone of cold from Vanilla to Chocolate - yum!" %E %Cc Ice 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 Ice 00016 "%p, you are back. Are you ready now for the challenge?" %E %Cp Ice 00017 "Again, you stand before me, %p. Surely you have prepared yourself." %E %Cc Ice 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. "I will protect my people as best I can, but soon %n will overcome me and destroy all who once called you %s. Now begone!" %E %Cc Ice 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 %Cp Ice 00020 "%p! 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 are ready." %E %Cc Ice 00021 "The world is in great need of your assistance, %p. "About six months ago, I learned that a mysterious sorcerer, known as %n, had begun to summon a large group of elementals and monsters. "%nC and his horde swept down upon %H and stole %o. He seeks to bend it to his will. After we regrouped, I sent forth a summons for you. "If %n can bend %o to his will, he will become almost indestructible. He will then be able to summon our elementals to him. You are the only hope. The gods smile upon you, and with %d behind you, you alone can defeat %n. "You must go to %i. From there, you can track down %n, defeat him, and return %o to us. Only then will the world be safe." %E %Cp Ice 00025 "%nC is strong in the dark arts, but not immune to cold steel." %E %Cp Ice 00026 "Remember that %n is a great sorcerer. He has lived for a thousand years." %E %Cp Ice 00027 "If you fail, %p, I will not be able to protect these people long." %E %Cp Ice 00028 "To enter %i, you must be very stealthy. The horde will be on guard." %E %Cp Ice 00029 "Call upon %d in your time of need." %E %Cp Ice 00030 "May %d protect you, and guide your steps." %E %Cp Ice 00031 "If you can lay hands upon %o, carry it for good fortune." %E %Cp Ice 00032 "I cannot stand against %ns sorcery. But %d will help you." %E %Cp Ice 00033 "Do not fear %n. I know you can defeat him." %E %Cp Ice 00034 "You have a great road to travel, %p, but only after you defeat %n." %E %Cc Ice 00035 The air is heavy and claustrophobic. You know that you have located %i. %E %Cp Ice 00036 Yet again you have a chance to infiltrate %i. %E %Cc Ice 00040 The hairs on the nape of your neck lift as you sense an energy in the very air around you. You fight down a primordial panic that seeks to make you turn and run. This is surely the lair of %n. %E %Cp Ice 00041 Yet again you feel the air around you heavy with malevolent magical energy. %E %Cc Ice 00050 "So. This is what that second rate sorcerer %l sends to do his bidding. I have slain many before you. You shall give me little sport. "Prepare to die, %c." %E %Cp Ice 00051 "I have wasted too much time on you already. Now, you shall die." %E %Cp Ice 00052 "You return yet again, %c! Are you prepared for death now?" %E %Cp Ice 00053 "I shall have %o back, you pitiful excuse for %ca. And your life as well." %E %Cp Ice 00060 "My pets will dine on your carcass tonight!" %E %Cp Ice 00061 "You are a sorry excuse for %ra." %E %Cp Ice 00062 "Run while you can, %c. My next spell will be your last." %E %Cp Ice 00063 "I shall use your very skin to bind my next grimoire." %E %Cp Ice 00064 "%d cannot protect you now. Here, you die." %E %Cp Ice 00065 "Your %a nature makes you weak. You cannot defeat me." %E %Cp Ice 00066 "Come, %c. I shall kill you, then unleash the horde on your people." %E %Cp Ice 00067 "Once you are dead, my horde shall finish off %l, and your people." %E %Cp Ice 00068 "Fight, %c, or are you afraid of the mighty %n?" %E %Cp Ice 00069 "You have failed, %c. Now, my victory is complete." %E %Cc Ice 00070 As you pick up %o, you feel the power of it flowing through your hands. It seems to be in two or more places at once, even though you are holding it. %E %Cp Ice 00080 %nC falls to the ground, and utters a last curse at you. Then his body fades slowly, seemingly dispersing into the air around you. You slowly become aware that the overpowering aura of magic in the air has begun to fade. %E %Cc Ice 00081 When %l sees %o, he smiles, and says: Well done, %p. You have saved the world from certain doom. What, now, should be done with %o? Our people, brave as they are, cannot hope to guard it from other sorcerers who will detect it, as surely as %n did. Take %o with you, %p. It will guard you in your adventures, and you can best guard it. You embark on a quest far greater than you realize. Remember me, %p, and return when you have triumphed. I will tell you then of what you must do. You will understand when the time comes. %E %Cc Ice 00082 %l handles %o for a moment, then looks at you. "You are its keeper now, and the time has come to resume your search for the Amulet. %Z await your return through the magic portal which brought you here." %E %Cp Ice 00090 "Tell us, %p, have you fared well on your great quest?" %E %Cc Ice 00091 "This is wondrous, %p. I feared that you could not possibly succeed in your quest, but here you are in possession of the Amulet of Yendor! "I have studied the texts of the magi constantly since you left. In the Book of Skelos, I found this: %dC will cause a child to be sent into the world. This child is to be made strong by trial of battle and magic, for %d has willed it so. It is said that the child of %d will recover the Amulet of Yendor that was stolen from the Creator at the beginning of time. "As you now possess the amulet, %p, I suspect that the Book speaks of you. The child of %d will take the Amulet, and travel to the Astral Plane, where the Great Temple of %d is to be found. The Amulet will be sacrificed to %d, there on His altar. Then the child will stand by %d as champion of all %cP for eternity. "This is all I know, %p. I hope it will help you." %E # # Knight # %Cc Kni 00001 You materialize in the shadows of %H. Immediately, you notice that something is wrong. The fields around the castle are trampled and withered, as if some great battle has been recently fought. Looking closer, you %x long gouges in the walls of %H. You know of only one creature that makes those kinds of marks... %E %Cp Kni 00002 Once again you stand in the shadows of %H. %E %Cp Kni 00003 Again, you stand before %H. You vaguely sense that this may be the last time you stand before %l. %E %Cp Kni 00005 "Hail, %p! Verily, thou lookest well." %E %Cp Kni 00006 "There is word, %p, that %n hath been sighted in the fens near %i." %E %Cp Kni 00007 "Thou art our only hope now, %p." %E %Cp Kni 00008 "Verily, %l could have no better champion, %p." %E %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 pure, could never hope to defeat the foul %n. "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: "As thou noticed as thou approached %H, a great battle hath been fought recently in these fields. Know thou that Merlin himself came to aid Us here as We battled the foul %n. In the midst of that battle, %n struck Merlin a great blow, felling him. Then, as Our forces were pressed back, %n stole %o. "We eventually turned the tide, but lost many %cP in doing so. Merlin was taken off by his apprentice, but hath not recovered. We have been told that so long as %n possesseth %o, Merlin will not regain his health. "We hereby charge thee with this most important of duties: "Go forth from this place, to the fens, and there thou wilt find %i. From there, thou must track down %n. Destroy the 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 As you exit the swamps, you %x before you a huge, gaping hole in the side of a hill. From within, you smell the foul stench of carrion. The pools on either side of the entrance are fouled with blood, and pieces of rusted metal and broken weapons show above the surface. %E %Cp Kni 00041 Again, you stand at the entrance to %ns lair. %E %Cc Kni 00050 "Hah! Another puny %c seeks death. I shall dine well tonight, then tomorrow, %H shall fall!" %E %Cp Kni 00051 "Again, thou challengest me, %r? So be it. Thou wilt die here." %E %Cp Kni 00052 "Thou art truly foolish, %r. I shall dispatch thee anon." %E %Cp Kni 00053 "So, thou darest touch MY property! I shall have that bauble back, puny %r. Thou wilt die in agony!" %E %Cp Kni 00060 "A mere %r can never withstand me!" %E %Cp Kni 00061 "I shall kill thee now, and feast!" %E %Cp Kni 00062 "Puny %c. What manner of death dost thou wish?" %E %Cp Kni 00063 "First thee, %p, then I shall feast upon %l." %E %Cp Kni 00064 "Hah! Thou hast failed, %r. Now thou shalt die." %E %Cp Kni 00065 "Die, %c. Thou art as nothing against my might." %E %Cp Kni 00066 "I shall suck the marrow from thy bones, %c." %E %Cp Kni 00067 "Let's see... Broiled? No. Fried? Nay. Baked? Yea verily, that is the way I like my %c for dinner." %E %Cp Kni 00068 "Thy strength waneth, %p. The time of thy death draweth near." %E %Cp Kni 00069 "Call upon thy precious %d, %p. It shall not avail thee." %E %Cc Kni 00070 As you pick up %o, you feel its protective fields form around your body. You also feel a faint stirring in your mind, as if you are in two places at once, and in the second, you are waking from a long sleep. %E %Cc Kni 00080 As %n sinks to the ground, blood gushing from his open mouth, he defiantly curses you and %l: Thou hast not won yet, %r. By the gods, I shall return and dog thy steps to the grave! His tail flailing madly, %n tries to crawl towards you, but slumps to the ground and dies in a pool of his own blood. %E %Cc Kni 00081 As you approach %l, he beams at you and says: Well done! Thou art truly the Champion of %H. We have received word that Merlin is recovering, and shall soon rejoin Us. He hath instructed Us that thou art now to be the guardian of %o. He feeleth that thou mayst have need of its powers in thine adventures. It is Our wish that thou keepest %o with thee as thou searchest for the fabled Amulet of Yendor. %E # assumes Magic Mirror of Merlin (glass object) %Cc Kni 00082 "Careful, %p! %oC might break, and that would be a tragic loss. Thou art its keeper now, and the time hath come to resume thy search for the Amulet. %Z await thy return through the magic portal that brought thee here." %E %Cp Kni 00090 "Well met, %p. How goeth thy search for the Amulet of Yendor?" %E %Cc Kni 00091 "Thou hast succeeded, We see, %p! Now thou art commanded to take the Amulet to be sacrificed to %d in the plane of the astral. "Merlin hath counseled Us that thou must travel always upwards through the planes of the elements, to achieve this goal. "Go with %d, %p." %E # # Monk # # The quest artifact is "The Eyes of the Overworld", hence needs # to be treated as plural by messages which use %o. # %Cc Mon 00001 You find yourself standing in sight of %H. Something is obviously wrong here. Strange shapes lumber around outside %H! You realize that the %l needs your assistance! %E %Cp Mon 00002 Once again, you stand before %H. %E %Cp Mon 00003 Again you face %H. Your intuition hints that this may be the final time you come here. %E %Cp Mon 00005 "Greetings, honorable %r. It is good to see you." %E %Cp Mon 00006 "Ah, %p! Surely you can help us in our hour of need." %E %Cp Mon 00007 "Greetings, %s. %lC has great need of your help." %E %Cp Mon 00008 "Alas, it seems as if even %d has deserted us." %E %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. "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: "During one of the Great Meditations a short time ago, %n and a legion of elementals invaded %H. Many %gP were killed, including the one bearing %o. Now, there are barely enough %gP left to keep the elementals at bay. "We need you to find %i, then, from there, travel to %ns lair. If you can manage to defeat %n and return %o here, we can then drive off the legions of elementals that slay our students. "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 to 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 The stench of brimstone is all about you, and the elementals close in from all sides! Ahead, there is a small clearing amidst the bubbling pits of lava... %E %Cp Mon 00041 Again, you have invaded %ns domain. %E %Cc Mon 00050 "Ah, so %l has sent another %g to retrieve %o. "No, I see you are no %g. Perhaps I shall have some fun today after all. Prepare to die, %r! You shall never regain %o." %E %Cp Mon 00051 "So, %r. Again you challenge me." %E %Cp Mon 00052 "Die now, %r. %d has no power here to aid you." %E %Cp Mon 00053 "You shall die, %r, and I will have %o back." %E %Cp Mon 00060 "Submit to my will, %c, and I shall spare you." %E %Cp Mon 00061 "Your puny powers are no match for me, %c." %E %Cp Mon 00062 "I shall have you turned into a zombie for my pleasure!" %E %Cp Mon 00063 "Despair now, %r. %d cannot help you." %E %Cp Mon 00064 "I shall feast upon your soul for many days, %c." %E %Cp Mon 00065 "Your death will be slow and painful. That I promise!" %E %Cp Mon 00066 "You cannot defeat %n, you fool. I shall kill you now." %E %Cp Mon 00067 "Your precious %lt will be my next victim." %E %Cp Mon 00068 "I feel your powers failing you, %r. You shall die now." %E %Cp Mon 00069 "With %o, nothing can stand in my way." %E %Cc Mon 00070 As you pick up %o, you feel the essence of %d fill your soul. You know now why %n stole them from %H, for with them, %ca of %d could easily defeat his plans. You sense a message from %d. Though not verbal, you get the impression that you must return to %l as soon as possible. %E %Cc Mon 00080 %nC gasps: "You have only defeated this mortal body. Know this: my spirit is strong. I shall return and reclaim what is mine!" With that, %n expires. %E %Cc Mon 00081 "You have returned, %p. And with %o, I see. Congratulations. "I have been in meditation, and have received direction from a minion of %d. %d commands that you retain %o. With them, you must recover the Amulet of Yendor. "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 %Cc Mon 00091 "You have prevailed, %p! %d is surely with you. Now, you must take the amulet, and sacrifice it on %ds altar on the Astral plane. I suspect that I shall never see you again in this life, but I hope to at %ds feet." %E # # Necromancer # %Cc Nec 00001 You are suddenly surrounded by stinking mists. Ah! The smell of home! However, things are not the same as when you were last here. You hear demoniac cackling from all around, and the dry, rustling flap of leathery wings. You know %l would never allow such creatures to approach the tower... unless something were dreadfully wrong! %E %Cp Nec 00002 Once again, you are back at %H. %E %Cp Nec 00003 You are back at %H. You have an odd feeling this may be the last time you ever come here. %E %Cp Nec 00005 "Would you happen to have some eye of newt in that overstuffed pack, %s?" %E %Cp Nec 00006 "Ah, the spell to create the magic portal worked. Outstanding!" %E %Cp Nec 00007 "Hurry! %lC may not survive that casting of the portal spell!!" %E %Cp Nec 00008 "We must strive to destroy that bloodless demon, or all is lost." %E %Cp Nec 00009 "I, too, will venture into the world, because %n is but one of many demons to be vanquished." %E %Cp Nec 00010 "Would you happen to have some eye of newt in that overstuffed pack, %s?" %E %Cp Nec 00011 "Ah, the spell to create the magic portal worked. Outstanding!" %E %Cp Nec 00012 "I, too, will venture into the world, because %n was but one of many demons to be vanquished." %E %Cp Nec 00013 "Yes! I have been rostered the graveyard shift this week!" %E %Cp Nec 00014 "I wonder how Doctor Frankenstein's work progresses?" %E %Cc Nec 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 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 Nec 00016 "Well, %p, you have returned. Perhaps you are now ready..." %E %Cp Nec 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 Nec 00018 "You fool, %p! Why did I waste all of those years teaching you the dark arts? Get out of here! I shall find another." %E %Cc Nec 00019 "Alas, %p, you have not yet shown your proficiency as a worthy necromancer. 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 Nec 00020 "You amaze me, %p! How many times did I tell you that sorcery requires care. One must maintain the balance of darkness within oneself, 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 Nec 00021 "Yes, %p, you truly are ready for this dire task. Listen, carefully, for what I tell you now will be of vital importance. "Since you left us to hone your skills in the world, we unexpectedly came under attack by the forces of %n. As you know, we thought he had perished at the end of the last age, but, alas, this was not the case. "%nC sent an army of abominations against us. Among them was a minion, mindless and ensorcelled, and thus, in the confusion, it was able to penetrate our defenses. Alas, this creature has stolen %o and I fear it has delivered it to %n. "You must travel to %i, and within its dungeons, find and overcome %n, and return %o to me. "Go now, with %d, and return freedom to our tower." %E %Cp Nec 00025 "Beware, for %n is immune to most magical attacks." %E %Cp Nec 00026 "To enter %i you must pass many traps." %E %Cp Nec 00027 "%nC may be vulnerable to physical attacks." %E %Cp Nec 00028 "%d will come to your aid when you call." %E %Cp Nec 00029 "You must utterly destroy %n. He will pursue you otherwise." %E %Cp Nec 00030 "%oC is a mighty artifact. With it you can destroy %n." %E %Cp Nec 00031 "Go forth with the blessings of %d." %E %Cp Nec 00032 "I will have my %gP watch for your return." %E %Cp Nec 00033 "Feel free to take any items in that chest that might aid you." %E %Cp Nec 00034 "You will know when %o is near. Proceed with care!" %E %Cp Nec 00035 Wisps of dark mist swirl nearby. You feel that %ns lair is close. %E %Cp Nec 00036 You believe that you may once again invade %i. %E %Cp Nec 00040 You feel your mentor's presence; perhaps %o is nearby. %E %Cp Nec 00041 The aura of %o tingles at the edge of your perception. %E %Cc Nec 00050 "Ah, I recognize you, %p. So, %l has sent you to steal %o from me, hmmm? Well, %l is a fool to send such a mental weakling against me. "Your destruction, however, should make for good sport. In the end, you shall beg me to kill you!" %E %Cc Nec 00051 "How nice of you to return, %p! I enjoyed our last meeting. Are you still hungry for more pain? "Come! Your soul, like %o, shall soon be mine to command." %E %Cp Nec 00052 "I'm sure that your perseverance shall be the subject of innumerable ballads, but you shall not be around to hear them, I fear!" %E %Cp Nec 00053 "Thief! %o belongs to me, now. I shall feed your living flesh to my minions." %E %Cp Nec 00060 "Your puny powers are no match for me, fool!" %E %Cp Nec 00061 "When you are defeated, your torment will last for a thousand years." %E %Cp Nec 00062 "After your downfall, %p, I shall devour %l for dessert!" %E %Cp Nec 00063 "Are you ready yet to beg for mercy? I could be lenient..." %E %Cp Nec 00064 "Your soul shall join the enslaved multitude I command!" %E %Cp Nec 00065 "Your lack of will is evident, and you shall die as a result." %E %Cp Nec 00066 "Your faith in %d is for naught! Come, submit to me now!" %E %Cp Nec 00067 "A mere %r is nothing compared to my skill!" %E %Cp Nec 00068 "So, you are the best hope of %l? How droll." %E %Cp Nec 00069 "Feel my power, %c! My victory is imminent!" %E %Cc Nec 00070 As you touch %o, its comforting power infuses you with new energy. Although you yearn to use %o to attack the Wizard of Yendor, you know you must return it to its rightful owner, %l. %E %Cc Nec 00080 %nC croaks out, as his body begins to shrivel up: I shall haunt your progress until the end of time. A thousand curses on you and %l. Then, the body bursts into a cloud of choking dust, and blows away. %E %Cc Nec 00081 %lC notices %o in your possession, beams at you and says: I knew you could defeat %n and retrieve %o. Good... Take %o with you in your quest for the Amulet of Yendor. I can sense that it has attuned its dark mind to yours already. May %d guide you in your quest, and keep you from harm. %E %Cc Nec 00082 %l handles %o for a moment, then looks at you. "You are its keeper now, and the time has come to resume your search for the Amulet. %Z await your return through the magic portal which brought you here." %E %Cc Nec 00090 "Come near, my %S, and share your adventures with me. So, have you succeeded in your quest for the Amulet of Yendor?" %E %Cc Nec 00091 "Congratulations, %p. I always knew that if anyone could succeed in defeating the Wizard of Yendor and his minions, it would be you. "Go now, and take the Amulet to the astral plane. Once there, present the Amulet on the altar of %d. Along the way you shall pass through the four elemental planes. These planes are like nothing you have ever experienced before, so be prepared! "For this you were born, %s! I am very proud of you." %E # # Priest # %Cc Pri 00001 You find yourself standing in sight of %H. Something is obviously wrong here. The doors to %H, which usually stand open, are closed. Strange human shapes shamble around outside. You realize that %l needs your assistance! %E %Cp Pri 00002 Once again, you stand before %H. %E %Cp Pri 00003 Again you face %H. Your intuition hints that this may be the final time you come here. %E %Cp Pri 00005 "Greetings, honored %r. It is good to see you." %E %Cp Pri 00006 "Ah, %p! Surely you can help us in our hour of need." %E %Cp Pri 00007 "Greetings, %s. %lC has great need of your help." %E %Cp Pri 00008 "Alas, it seems as if even %d has deserted us." %E %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. "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: "At one of the Great Festivals a short time ago, %n and a legion of undead invaded %H. Many %gP were killed, including the one carrying %o. "As a final act of vengefulness, %n desecrated the altar here. Without it, we could not mount a counter-attack. Now, there are barely enough %gP left to keep the undead at bay. "We need you to find %i, then, from there, travel to %ns lair. If you can manage to defeat %n and return %o here, we can then drive off the legions of undead that befoul the land. "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. 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 The stench of brimstone is all about you, and the shrieks and moans of tortured souls assault your psyche. Ahead, there is a small clearing amidst the bubbling pits of lava... %E %Cp Pri 00041 Again, you have invaded %ns domain. %E %Cc Pri 00050 "Ah, so %lC has sent another %g to retrieve %o. "No, I see you are no %g. Perhaps I shall have some fun today after all. Prepare to die, %r! You shall never regain %o." %E %Cp Pri 00051 "So, %r. Again you challenge me." %E %Cp Pri 00052 "Die now, %r. %d has no power here to aid you." %E %Cp Pri 00053 "You shall die, %r, and I will have %o back." %E %Cp Pri 00060 "Submit to my will, %c, and I shall spare you." %E %Cp Pri 00061 "Your puny powers are no match for me, %c." %E %Cp Pri 00062 "I shall have you turned into a zombie for my pleasure!" %E %Cp Pri 00063 "Despair now, %r. %d cannot help you." %E %Cp Pri 00064 "I shall feast upon your soul for many days, %c." %E %Cp Pri 00065 "Your death will be slow and painful. That I promise!" %E %Cp Pri 00066 "You cannot defeat %n, you fool. I shall kill you now." %E %Cp Pri 00067 "Your precious %lt will be my next victim." %E %Cp Pri 00068 "I feel your powers failing you, %r. You shall die now." %E %Cp Pri 00069 "With %o, nothing can stand in my way." %E %Cc Pri 00070 As you pick up %o, you feel the essence of %d fill your soul. You know now why %n stole it from %H, for with it, %ca of %d could easily defeat his plans. You sense a message from %d. Though not verbal, you get the impression that you must return to %lC as soon as possible. %E %Cc Pri 00080 You feel a wrenching shift in the ether as %ns body dissolves into a cloud of noxious gas. Suddenly, a voice booms out: Thou hast defeated the least of my minions, %r. Know now that Moloch is aware of thy presence. As for thee, %n, I shall deal with thy failure at my leisure. You then hear the voice of %n, screaming in terror... %E %Cc Pri 00081 "You have returned, %p. And with %o, I see. Congratulations. "I have been in meditation, and have received direction from a minion of %d. %d commands that you retain %o. With it, you must recover the Amulet of Yendor. "Go forth, and let %d guide your steps." %E %Cc Pri 00082 %l reiterates that %o is yours now. "The time has come to resume your search for the Amulet. %Z await your return through the magic portal that brought you here." %E %Cp Pri 00090 "Welcome back, %p. How is your quest for the Amulet going?" %E %Cc Pri 00091 "You have prevailed, %p! %d is surely with you. Now, you must take the amulet, and sacrifice it on %ds altar on the Astral plane. I suspect that I shall never see you again in this life, but I hope to at %ds feet." %E # # Ranger # %Cc Ran 00001 You arrive in familiar surroundings. In the distance, you %x the ancient forest grove, the place of worship to %d. Something is wrong, though. Surrounding the grove are centaurs! And they've noticed you! %E %Cp Ran 00002 Once again, you stand before %H. %E %Cp Ran 00003 You have the oddest feeling that this may be the last time you are to enter %H. %E %Cp Ran 00005 "%pC! I have not seen you in many moons. How do you fare?" %E %Cp Ran 00006 "%nC continues to threaten the grove. But we hold fast." %E %Cp Ran 00007 "%lC is growing weak. The magic required to defend the grove drains us." %E %Cp Ran 00008 "Remember %i is hard to enter. Beware the distraction of leatherwings." %E %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: "A short time ago, the mountain centaurs to the east invaded and enslaved the plains centaurs in this area. The local leader is now only a figurehead, and serves %n. "During our last gathering of worship here, we were beset by hordes of hostile centaurs, as you witnessed. In the first onslaught a group, headed by %n himself, managed to breach the grove and steal %o. "Since then, we have been besieged. We do not know how much longer we will be able to maintain our magical barriers. "If we are to survive, you, %p, must infiltrate %i. There, you will find a pathway down, to the underground cavern of %n. He has always coveted %o, and will surely keep it. "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 by tunnels. Your quest is to find and shoot the evil wumpus that resides elsewhere in the cave without running into any bottomless pits or using up your limited supply of arrows. Good luck. You are in room 9 of the cave. There are tunnels to rooms 5, 8, and 10. *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). *rustle* *rustle* (must be bats nearby) %E %Cc Ran 00040 You descend into a weird place, in which roughly cut cave-like walls join with smooth, finished ones, as if someone was in the midst of finishing off the construction of a subterranean complex. Off in the distance, you hear a sound like the clattering of many hooves on rock. %E %Cp Ran 00041 Once again, you enter the distorted castle of %n. %E %Cc Ran 00050 "So, %c. %lC has sent you to recover %o. "Well, I shall keep that bauble. It pleases me. You, %c, shall die." %E %Cp Ran 00051 "Back again, eh? Well, a mere %r is no threat to me! Die, %c!" %E %Cp Ran 00052 "You haven't learned your lesson, %c. You can't kill me! You shall die now." %E %Cp Ran 00053 "I shall have %o from you, %r. Then I shall kill you." %E %Cp Ran 00060 "Your %d is nothing, %c. You are mine now!" %E %Cp Ran 00061 "Run away little %c! You can never hope to defeat %n!" %E %Cp Ran 00062 "My servants will rip you to shreds!" %E %Cp Ran 00063 "I shall display your head as a trophy. What do you think about that wall?" %E %Cp Ran 00064 "I shall break your %ls grove, and destroy all the %gP!" %E %Cp Ran 00065 "%d has abandoned you, %c. You are doomed." %E %Cp Ran 00066 "%rA? %lC sends a mere %r against me? Hah!" %E %Cp Ran 00067 "%lC has failed, %c. %oC will never leave here." %E %Cp Ran 00068 "You really think you can defeat me, eh %c? You are wrong!" %E %Cp Ran 00069 "You weaken, %c. I shall kill you now." %E %Cc Ran 00070 As you pick up %o, it seems to glow, and a warmth fills you completely. You realize that its power is what has protected your %sp against their enemies for so long. You must now return it to %l without delay -- their lives depend on your speed. %E %Cc Ran 00080 %nC collapses to the ground, cursing you and %l, then says: You have defeated me, %r! But I curse you one final time, with my dying breath! You shall die before you leave my castle! %E %Cc Ran 00081 "%pC! You have succeeded! I feared it was not possible! "You have returned with %o! "I fear, now, that the Centaurs will regroup and plot yet another raid. This will take some time, but if you can recover the Amulet of Yendor for %d before that happens, we will be eternally safe. "Take %o with you. It will aid in your quest for the Amulet." %E # assumes The Longbow of Diana %Cc Ran 00082 %l flexs %o reverently. "With this wondrous bow, one need never run out of arrows. You are its keeper now, and the time has come to resume your search for the Amulet. %Z await your return through the magic portal that brought you here." %E %Cp Ran 00090 "Welcome, %p. How have you fared on your quest for the Amulet of Yendor?" %E %Cc Ran 00091 "You have it! You have recovered the Amulet of Yendor! Now attend to me, %p, and I will tell you what must be done: "The Amulet has within it magic, the capability to transport you to the Astral Plane, where the primary circle of %d resides. "To activate this magic, you must travel upwards as far as you can. When you reach the temple, sacrifice the Amulet to %d. "Thus will you fulfill your destiny." %E # # Rogue (with apologies to all Norsk speakers -dean) # %Cc Rog 00001 Unexpectedly, you find yourself back in Ransmannsby, where you trained to be a thief. Quickly you make the guild sign, hoping that you AND word of your arrival reach %ls den. %E %Cp Rog 00002 Once again, you find yourself back in Ransmannsby. Fond memories are replaced by fear, knowing that %l is waiting for you. %E %Cp Rog 00003 You rub your hands through your hair, hoping that the little ones on the back of your neck stay down, and prepare yourself for your meeting with %l. %E %Cp Rog 00005 "I hear that Lady Tyvefelle's household is lightly guarded." %E %Cp Rog 00006 "You're back? Even the Twain don't come back anymore." %E %Cp Rog 00007 "Can you spare an old cutpurse a zorkmid for some grog?" %E %Cp Rog 00008 "Fritz tried to join the other side, and now he's hell-hound chow." %E %Cp Rog 00009 "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!" 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 are too valuable to me. "Here's the deal. I want %o, %n has %o. You are going to get %o 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 %Cc Rog 00040 You feel a great swelling up of courage, sensing the presence of %o. Or is it fear? %E %Cp Rog 00041 The hairs on the back of your neck whisper -- it's fear. %E %Cc Rog 00050 "Ah! You must be %ls ... er, `hero'. A pleasure to meet you." %E %Cp Rog 00051 "We meet again. Please reconsider your actions." %E %Cp Rog 00052 "Surely, %p, you have learned that you cannot trust any bargains that %l has made. I can show you how to continue on your quest without having to run into him again." %E %Cp Rog 00053 "Please, think for a moment about what you are doing. Do you truly believe that %d would want %l to have %o?" %E %Cp Rog 00060 "May I suggest a compromise. Are you interested in gold or gems?" %E %Cp Rog 00061 "Please don't force me to kill you." %E %Cp Rog 00062 "Grim times are upon us all. Will you not see reason?" %E %Cp Rog 00063 "I knew %l, and you're no %lt, thankfully." %E %Cp Rog 00064 "It is a shame that we are not meeting under more pleasant circumstances." %E %Cp Rog 00065 "I was once like you are now, %p. Believe in me -- our way is better." %E %Cp Rog 00066 "Stay with me, and I will make you %os guardian." %E %Cp Rog 00067 "When you return, with or without %o, %l will have you killed." %E %Cp Rog 00068 "Do not be fooled; I am prepared to kill to defend %o." %E %Cp Rog 00069 "I can reunite you with the Twain. Oh, the stories you can swap." %E %Cc Rog 00070 As you pick up %o, the hairs on the back of your neck fall out. At once you realize why %n was willing to die to keep it out of %ls hands. Somehow you know that you must do likewise. %E %Cc Rog 00080 "I know what you are thinking, %p. It is not too late for you to use %o wisely. For the sake of your guild %sp, do what is right." You sit and wait for death to come for %n, and then you brace yourself for your next meeting with %l! %E %Cc Rog 00081 "Well, I'll be damned. You got it. I am proud of you, a fine %r you've turned out to be. "While you were gone I got to thinking, you and %o together could bring me more treasure than either of you apart, so why don't you take it with you. All I ask is a cut of whatever loot you come by. That is a better deal than I offered %n. "But, you see what happened to %n when he refused. Don't make me find another to send after you this time." %E # assumes Master Key of Thievery (small object) %Cc Rog 00082 %l seems tempted to swap %o for the mundane one you detect in his pocket, but noticing your alertness, evidently chickens out. "Go filch the Amulet before someone else beats you to it. %Z are back the way you came, through the magic portal." %E %Cc Rog 00090 "Quite the little thief, aren't we, %p. Can I interest you in a swap for %o. Look around, anything in the keep is yours for the asking." %E %Cc Rog 00091 "I see that with your abilities, and my brains, we could rule this world. "All that we would need to be all-powerful is for you to take that little trinket you've got there up to the Astral plane. From there, %d will show you what to do with it. Once that's done, we will be invincible!" %E # # Samurai # %Cc Sam 00001 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. %E %Cp Sam 00002 Once again, you are back at %H. %E %Cp Sam 00003 You are back at %H. Instantly you sense a subtle change in your karma. You seem to know that if you do not succeed in your quest, %n will have destroyed the kami of %H before you return again. %E %Cp Sam 00005 "To succeed, you must walk like a butterfly on the wind." %E %Cp Sam 00006 "Ikaga desu ka?" %E %Cp Sam 00007 "I fear for The Land of The Gods." %E %Cp Sam 00008 "%nC has hired the Ninja -- be careful." %E %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. "The daimyo, %n, has betrayed us. He has stolen from us %o and taken it to his donjon deep within %i. "If I cannot show the emperor %o when he comes for the festival he will know that I have failed in my duty, and request that I commit seppuku. "You must gain entrance to %i and retrieve the emperor's property. Be quick! The emperor will be here for the cha-no-you in 5 sticks. "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 %Cc Sam 00040 In your mind, you hear the taunts of %n. You become like the rice plant and bend to the ground, offering a prayer to %d. But when the wind has passed, you stand proudly again. Putting your kami in the hands of fate, you advance. %E %Cp Sam 00041 As you arrive once again at the home of %n, your thoughts turn only to %o. %E %Cc Sam 00050 "Ah, so it is to be you, %p-san. I offer you seppuku. I will be your second if you wish." %E %Cp Sam 00051 "I have offered you the honorable exit. Now I will have your head to send unwashed to %l." %E %Cp Sam 00052 "After I have dispatched you, I will curse your kami." %E %Cp Sam 00053 "You have fought my samurai; surely you must know that you will not be able to take %o back to %H." %E %Cp Sam 00060 "Ahh, I finally meet the daimyo of the kyokaku!" %E %Cp Sam 00061 "There is no honor for me in your death." %E %Cp Sam 00062 "You know that I cannot resash my swords until they have killed." %E %Cp Sam 00063 "Your presence only compounds the dishonor of %l in not coming himself." %E %Cp Sam 00064 "I will make tea with your hair and serve it to %l." %E %Cp Sam 00065 "Your fear shows in your eyes, coward!" %E %Cp Sam 00066 "I have not heard of you, %p-san; has your life been that unworthy?" %E %Cp Sam 00067 "If you will not obey me, you will die." %E %Cp Sam 00068 "Kneel now and make the two cuts of honor. I will tell your %sp of your honorable death." %E %Cp Sam 00069 "Your master was a poor teacher. You will pay for his mistakes in your teaching." %E %Cc Sam 00070 As you pick up %o, you feel the strength of its karma. You realize at once why so many good samurai had to die to defend it. You are humbled knowing that you hold one of the artifacts of the sun goddess. %E %Cc Sam 00080 Your healing skills tell you that %ns wounds are mortal. You know that the bushido tells you to finish him and let his kami die with honor, but the thought of so many samurai dead due to this man's dishonor prevents you from giving the final blow. You order that his unwashed head be given to the crows and his body thrown into the sea. %E %Cc Sam 00081 As you bow before %l, he welcomes you: You have brought your family great honor, %p-sama. While you have been gone the emperor's advisors have discovered in the ancient texts that the karma of the samurai who seeks to recover the amulet and the karma of %o are joined as the seasons join to make a year. Because you have shown such fidelity, the emperor requests that you take leave of other obligations and continue on the road that fate has set your feet upon. I would consider it an honor if you would allow me to watch your household until you return with the amulet. With that, %l bows, and places his sword atop %o. %E %Cc Sam 00082 %l holds %o tightly for a moment, then returns his gaze to you. "The time is ripe to recover the Amulet. Return to %Z through the magic portal that transported you here so that you may achieve the destiny which awaits you." %E %Cp Sam 00090 %lC bows. "%p-sama, tell us of your search for the Amulet." %E %Cc Sam 00091 "Ah, %p-sama. You have wasted your efforts returning home. Now that you are in possession of the Amulet, you are honor-bound to finish the quest you have undertaken. There will be plenty of time for saki and stories when you have finished. "Go now, and may our prayers be a wind at your back." %E # # Tourist # %Cc Tou 00001 You breathe a sigh of relief as you find yourself back in the familiar surroundings of %H. You quickly notice that things do not appear the way they did when you left. The town is dark and quiet. There are no sounds coming from behind the town walls, and no campfires burning in the fields. As a matter of fact, you do not %x any movement in the fields at all, and the crops look as though they have been untended for many weeks. %E %Cp Tou 00002 Once again, you are back at %H. %E %Cp Tou 00003 You are back at %H. Things appear to have become so bad that you fear that soon %H will not be here to return to. %E %Cp Tou 00005 "Gehennom on 5 zorkmids a day -- more like 500 a day if you ask me." %E %Cp Tou 00006 "Do you know where I could find some nice postcards of The Gnomish Mines?" %E %Cp Tou 00007 "Have you tried the weird toilets?" %E %Cp Tou 00008 "Don't stay at the Inn, I hear the food is terrible and it has rats." %E %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. "You must not return to us until you have purified yourself of these 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 "You have indeed proven yourself a worthy %c, %p. "But now your kinfolk and I must ask you to put aside your travels and help us in our time of need. After you left us we elected a new mayor, %n. He proved to be a most heinous and vile creature. "Soon after taking office he absconded with %o and fled town, leaving behind his henchmen to rule over us. In order for us to regain control of our town, you must enter %i and recover %o. "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." %E %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 You sense the presence of %o. %E %Cp Tou 00041 You gain confidence, knowing that you may soon be united with %o. %E %Cc Tou 00050 "So, %p, %l thinks that you can wrest %o from me! "It only proves how desperate he has become that he sends %ra to try and defeat me. When this day is over, I will have you enslaved in the mines where you will rue the day that you ever entered %i." %E %Cp Tou 00051 "I let you live the last time because it gave me pleasure. This time I will destroy you, %p." %E %Cc Tou 00052 "These meetings come to bore me. You disturb my workings with %o. "If you do not run away now, I will inflict so much suffering on you that %l will feel guilty for ever having sent his %S to me!" %E %Cc Tou 00053 "You fool. You do not know how to call upon the powers of %o. "Return it to me and I will teach you how to use it, and together we will rule %H. But do so now, as my patience grows thin." %E %Cp Tou 00060 "I defeated %l and I will defeat you, %p." %E %Cp Tou 00061 "Where is %d now! You must realize no one can help you here." %E %Cp Tou 00062 "Beg for mercy now and I may be lenient on you." %E %Cp Tou 00063 "If you were not so %a, you might have stood a chance." %E %Cp Tou 00064 "Vengeance is mine at last, %p." %E %Cp Tou 00065 "I only wish that %l had a more worthy %r to send against me." %E %Cp Tou 00066 "With %o in my possession you cannot hope to defeat me." %E %Cp Tou 00067 "%nC has never been defeated, NEVER!" %E %Cp Tou 00068 "Are you truly the best %H has to send against me? I pity %l." %E %Cp Tou 00069 "How do you spell %p? I want to ensure the marker on your grave is correct as a warning to your %sp." %E %Cc Tou 00070 As you pick up %o, you feel a great weight has been lifted from your shoulders. Your only thoughts are to quickly return to %H and find %l. %E %Cc Tou 00080 You turn in the direction of %n. As his earthly body begins to vanish before your eyes, you hear him curse: You shall never be rid of me, %p! I will find you where ever you go and regain what is rightly mine. %E %Cc Tou 00081 As %l detects the presence of %o, he almost smiles for the first time in many a full moon. As he looks up from %o he says: You have recovered %o. You are its owner now, but not its master. Let it work with you as you continue your journey. With its help, and %d to guide you on the %a path, you may yet recover the Amulet of Yendor. %E %Cc Tou 00082 "%oC is yours now. %Z await your return through the magic portal that brought you here." %E %Cp Tou 00090 "I could not be more proud than if you were my own %S, %p! Tell me of your adventures in quest of the Amulet of Yendor." %E %Cc Tou 00091 "Stand back and let me look at you, %p. Now that you have recovered the Amulet of Yendor, I'm afraid living out your days in %H would seem pretty tame. "You have come too far to stop now, for there are still more tasks that our oral history foretells for you. Forever more, though, your name shall be spoken by the %gP with awe. You are truly an inspiration to your %sp!" %E # # Undead Slayer # %Cc Und 00001 You find yourself standing in sight of %H. Something is obviously wrong here. The holy light that usually fills the sky is gone, and strange human shapes shamble around outside. You realize that %l needs your assistance! %E %Cp Und 00002 Once again, you stand before %H. %E %Cp Und 00003 Again you face %H. Your intuition hints that this may be the final time you come here. %E %Cp Und 00005 "Greetings, %r. It is good to see you." %E %Cp Und 00006 "Ah, %p! Surely you can help us in our hour of need." %E %Cp Und 00007 "Greetings, %s. %lC has great need of your help." %E %Cp Und 00008 "Alas, it seems as if even %d has deserted us." %E %Cp Und 00009 "May %d be with you, %s." %E %Cp Und 00010 "Greetings, %r. It is good to see you." %E %Cp Und 00011 "May %d be with you, %s." %E %Cp Und 00012 "Have you heard the rumors about the vampire known as 'The Day Walker' that stalks his own breed?" %E %Cp Und 00013 "With %n destroyed, we are safe once more!" %E %Cp Und 00014 "I hear you are to be nominated as next leader of the order!" %E %Cc Und 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 Und 00016 "Again, my %S, you stand before me. Are you ready now to help us?" %E %Cp Und 00017 "Once more, %p, you stand within the sanctum. Are you ready now?" %E %Cc Und 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 Und 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 Und 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. "Go from here, atone for your sins against %d. Return only when you have purified yourself." %E %Cc Und 00021 "Yes, %p. You are truly ready now. Attend to me and I shall tell you of what has transpired: "Recently, %n and a legion of undead invaded %H. Many %gP were killed, and %o was stolen from us! "Now, there are barely enough %gP left to keep the undead at bay. "We need you to find %i, and then, from there, travel to %ns lair. If you can manage to defeat %n and return %o here, we can then drive off the legions of undead that befoul the land. "Go with %d as your guide, %p." %E %Cp Und 00025 "You can prevail, if you rely on %d." %E %Cp Und 00026 "Remember that %n has great magic at his command." %E %Cp Und 00027 "Be pure, my %S." %E %Cp Und 00028 "Beware, %i is surrounded by a great graveyard." %E %Cp Und 00029 "Remember, no mercy for the evil!" %E %Cp Und 00030 "Acquire and wield %o if you can. It will aid you against %n." %E %Cp Und 00031 "Call upon %d when your need is greatest. You will be answered." %E %Cp Und 00032 "The undead legions are weakest during the daylight hours." %E %Cp Und 00033 "Do not lose faith, %p. If you do so, %n will grow stronger." %E %Cp Und 00034 "Wear %o. It will assist you against the undead." %E %Cc Und 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. You remember the descriptions of %i, given to you by %l. It is ahead that you will find %ns trail. %E %Cp Und 00036 Again, you stand before %i. %E %Cc Und 00040 The stench of brimstone is all about you, and the shrieks and moans of tortured souls assault your psyche. Ahead, there is a small clearing amidst the bubbling pits of lava... %E %Cp Und 00041 Again, you have invaded %ns domain. %E %Cc Und 00050 "Ah, so %l has sent another %g to retrieve %o. "No, I see you are no %g. Perhaps I shall have some fun today after all. Prepare to die, %r! You shall never regain %o." %E %Cp Und 00051 "So, %r. Again you challenge me." %E %Cp Und 00052 "Die now, %r. %d has no power here to aid you." %E %Cp Und 00053 "You shall die, %r, and I will have %o back." %E %Cp Und 00060 "Submit to my will, %c, and I shall spare you." %E %Cp Und 00061 "Your puny powers are no match for me, %c." %E %Cp Und 00062 "I shall have you turned into a zombie for my pleasure!" %E %Cp Und 00063 "Despair now, %r. %d cannot help you." %E %Cp Und 00064 "I shall feast upon your soul for many days, %c." %E %Cp Und 00065 "Your death will be slow and painful. That I promise!" %E %Cp Und 00066 "You cannot defeat %n, you fool. I shall kill you now." %E %Cp Und 00067 "Your precious %l will be my next victim." %E %Cp Und 00068 "I feel your powers failing you, %r. You shall die now." %E %Cp Und 00069 "With %o, nothing can stand in my way." %E %Cc Und 00070 As you pick up %o, you feel the essence of %d fill your soul. You know now why %n stole it from %H, for with it, %ca of %d could easily defeat his plans. You sense a message from %d. Though not verbal, you get the impression that you must return to %l as soon as possible. %E %Cc Und 00080 You feel a wrenching shift in the ether as %ns body dissolves into a cloud of noxious gas. Suddenly, a voice booms out: Mark my words, niggling! I shall return! You then hear the voice of %n, laughing insanely... %E %Cc Und 00081 "You have returned, %p. And with %o, I see. Congratulations. "I have been in meditation, and have received direction from a minion of %d. %d commands that you retain %o. With it, you must recover the Amulet of Yendor. "Go forth, and let %d guide your steps." %E %Cc Und 00082 %l reiterates that %o is yours now. "The time has come to resume your search for the Amulet. %Z await your return through the magic portal which brought you here." %E %Cp Und 00090 "Welcome back, %p. How is your quest for the Amulet going?" %E %Cc Und 00091 "You have prevailed, %p! %d is surely with you. Now, you must take the amulet, and sacrifice it on %ds altar on the Astral plane. I suspect that I shall never see you again in this life, but I hope to at %ds feet." %E # # Valkyrie # %Cc Val 00001 You materialize at the base of a snowy hill. Atop the hill sits a place you know well, %H. You immediately realize that something here is very wrong! In places, the snow and ice have been melted into steaming pools of water. Fumaroles and pools of bubbling lava surround the hill. The stench of sulphur is carried through the air, and you %x creatures that should not be able to live in this environment moving towards you. %E %Cp Val 00002 Once again, you are near the abode of %l. %E %Cp Val 00003 Again you materialize near %ls abode. You have a nagging feeling that this may be the last time you come here. %E %Cp Val 00005 "Hail, and well met, brave %c." %E %Cp Val 00006 "May %d guide your steps, %p." %E %Cp Val 00007 "%lC weakens. Without %o, her foresight is dim." %E %Cp Val 00008 "You must hurry, %p, else Ragnarok may well come." %E %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. "A short time ago, %n and his minions attacked this place. They opened the huge volcanic vents you %x about the hill, and attacked. I knew that this was to come to pass, and had asked %d for a group of %gP to help defend this place. The few you %x here are the mightiest of Valhalla's own, and are all that are left of one hundred %d sent. "Despite the great and glorious battle we fought, %n managed at last to steal %o. This has upset the balance of the universe, and unless %o is returned into my care, %n may start Ragnarok. "You must find the entrance to %i. Travel downward 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 Through clouds of sulphurous gasses, you %x a rock palisade surrounded with a moat of bubbling lava. You remember the description from something that %l said. This is the lair of %n. %E %Cp Val 00041 Once again, you stand in sight of %ns lair. %E %Cc Val 00050 "So! %lC has finally sent %ca to challenge me! "I thought that mastering %o would enable me to challenge %d, but it has shown me that first I must kill you! So come, little %s. Once I defeat you, I can at last begin the final battle with %d." %E %Cp Val 00051 "Again you challenge me, %r. Good. I will kill you now." %E %Cp Val 00052 "Have you not learned yet? You cannot defeat %n!" %E %Cp Val 00053 "I will kill you, %c, and wrest %o from your mangled hands." %E %Cp Val 00060 "I am your death, %c." %E %Cp Val 00061 "You cannot prevail, %r. I have foreseen your every move." %E %Cp Val 00062 "With you out of the way, Valhalla will be mine for the taking." %E %Cp Val 00063 "I killed scores of %ds best when I took %o. Do you really think that one %c can stand against me?" %E %Cp Val 00064 "Who bears the souls of %cP to Valhalla, %r?" %E %Cp Val 00065 "No, %d cannot help you here." %E %Cp Val 00066 "Some instrument of %d you are, %p. You are a weakling!" %E %Cp Val 00067 "Never have I seen %ca so clumsy in battle." %E %Cp Val 00068 "You die now, little %s." %E %Cp Val 00069 "Your body I destroy now, your soul when my hordes overrun Valhalla!" %E %Cc Val 00070 As you pick up %o, your mind is suddenly filled with images, and you perceive all of the possibilities of each potential choice you could make. As you begin to control and channel your thoughts, you realize that you must return %o to %lC immediately. %E %Cc Val 00080 A look of surprise and horror appears on %ns face. No!!! %o has lied to me! I have been misled! Suddenly, %n grasps his head and screams in agony, then dies. %E %Cc Val 00081 As you approach, %lC rises and touches %o. "You may take %o with you, %p. I have removed from it the power to foretell the future, for that power no mortal should have. Its other abilities, however, you have at your disposal. "You must now begin in %ds name to search for the Amulet of Yendor. May your steps be guided by %d, my %S." %E # assumes Orb of Fate (glass object) %Cc Val 00082 "Careful, %p! %oC might break, and that would be a tragic loss. You are its keeper now, and the time has come to resume your search for the Amulet. %Z await your return through the magic portal that brought you here." %E %Cp Val 00090 "Greetings, %p. I have not been able to pay as much attention to your search for the Amulet as I have wished. How do you fare?" %E %Cc Val 00091 "Excellent, %p. I see you have recovered the Amulet! "You must take the Amulet to the Great Temple of %d, on the Astral plane. There you must offer the Amulet to %d. "Go now, my %S. I cannot tell you your fate, as the power of the Amulet interferes with mine. I hope for your success." %E # # Yeoman # %Cc Yeo 00001 The forbidding fortress that lay before you is a landmark of one of the greatest cities in the world: %H. For nearly six centuries, the Tower has kept a solemn watch over the city. Yet something is wrong today. The streets are abandoned and overrun with vermin. Ravens fly ominously overhead. It is your duty seek out %l and offer him any assistance you can provide. %E %Cp Yeo 00002 You are once again in %H. %E %Cp Yeo 00003 You have once more returned to %H. This may be your last chance to redeem your honour. %E %Cp Yeo 00005 "Halt! Who goes there?" %E %Cp Yeo 00006 "An escort for the Keys!" %E %Cp Yeo 00007 "Whose Keys does thou bring?" %E %Cp Yeo 00008 "God preserve Queen Elizabeth!" %E %Cp Yeo 00009 "A Beefeater is more than a bottle of spirits!" %E %Cp Yeo 00010 "Halt! Who goes there?" %E %Cp Yeo 00011 "An escort for the Keys!" %E %Cp Yeo 00012 "Whose Keys does thou bring?" %E %Cp Yeo 00013 "God preserve Queen Elizabeth!" %E %Cp Yeo 00014 "A Beefeater is more than a bottle of spirits!" %E %Cc Yeo 00015 %lC turns to you with a troubled expression on his face. "The Tower is in danger. We are in need of loyal and gallant subjects who can serve %d. Are you prepared for what lies ahead?" %E %Cp Yeo 00016 "I see you have returned, %p. Are you now ready to fulfill your duty to %d?" %E %Cp Yeo 00017 "Time is growing short, %p. Are you finally prepared to serve %d?" %E %Cp Yeo 00018 "%pC, you disgrace the good name of %d. I must now seek another to serve in your place. Leave %H in shame, and never return!" %E %Cc Yeo 00019 "Alas, %p, you are but %ra. Such a %c could not succeed in bringing justice against %n. Continue your adventures and revisit me when you have attained the rank of %R." %E %Cc Yeo 00020 "Woe, dear %p. You have not yet proven your devotion to %d. Go forth in his service and return when you have proven yourself %a." %E %Cc Yeo 00021 "I see that you are a worthy %c, %p. Perhaps you can aide us in our predicament..." "It was but a few moments ago that the Assistant Keeper of the Crown Jewels, Talbot Edwards, was found dead. It must have been a robbery, since the Crown Jewels are missing, including %o. They are normally kept in Martin Tower, safe inside %i." "The Crown Jewels are the most sacred symbols of %d. It was a great loss when Cromwell and his band of thugs desecrated the monarchy by selling the Jewels during the Commonwealth period. Fortunately, many were reconstructed for the coronation of Charles II. We must never let such vandalism happen again!" "We suspect that the culprit is no other than %n. He surely is deceitful enough to pull such a heist. Do you remember how he fought on both sides during the Civil War against Parliament? His plot to seize Dublin Castle? Or his attempt to kidnap the Lord High Steward? There is quite a ransom already on that rogue's head!" "I have barely enough men to watch the outer ward, and I am unable to call for more, since it appears that our warning bell has also been stolen. Would you help me by searching %i? Please bring back %o and our warning bell when you find the Jewels." "Thank you, and Godspeed!" %E %Cp Yeo 00025 "We must find %o soon!" %E %Cp Yeo 00026 "Please bring back our bell, too!" %E %Cp Yeo 00027 "Go forth and do justice!" %E %Cp Yeo 00028 "Go forth and stop the growth of iniquity!" %E %Cp Yeo 00029 "Go forth and protect the holy church of %d!" %E %Cp Yeo 00030 "Go forth to help and defend widows and orphans!" %E %Cp Yeo 00031 "Go forth and restore the things that are gone to decay!" %E %Cp Yeo 00032 "Go forth and maintain the things that are restored!" %E %Cp Yeo 00033 "Go forth to punish and reform what is amiss!" %E %Cp Yeo 00034 "Go forth and confirm what is in good order!" %E %Cc Yeo 00035 You stand in reverence as you catch a glimpse of the courtyard before you. This is %i of the Tower of London, for centuries the home of kings and queens. But since the overthrow of Charles I during the Civil War and the subsequent return of Charles II, the fortress is now mostly used as a treasury, museum, and political prison. The Crown Jewels must be here. But where? %E %Cp Yeo 00036 Once again, you are in %i. You know that the Crown Jewels are here -- somewhere. %E %Cc Yeo 00040 This must be the Sword Room, home of the famous Knights of the Bath. Two of the honoured knights are soaking in the tubs before you. One of them turns to you to whisper something: "There is a stranger in the banquet hall. And he has %o!" %E %Cp Yeo 00041 You are certain that %o is here. %E %Cc Yeo 00050 "Greetings, friend. Were you looking for %o? I think I saw it in Bowyer Tower. Now begone." "What, you are still here? Then I will make with you as I did with Talbot Edwards!" %E %Cp Yeo 00051 %nC points at you and shouts: "Stop, thief!" But the tower inhabitants are not fooled by his diversion. %E %Cp Yeo 00052 "You must have been sent by %l to recover %o. I have no choice but to kill you." %E %Cp Yeo 00053 "How did you get %o? It's mine, I say, mine!" %E %Cp Yeo 00060 "I shall sell %o for a handsome profit!" %E %Cp Yeo 00061 "Don't bother looking for %o. It isn't here." %E %Cp Yeo 00062 "Stop hitting me. Can't you see that I am just a poor priest?" %E %Cp Yeo 00063 "You'll never catch me alive!" %E %Cp Yeo 00064 "I saw someone with %o over there." %E %Cp Yeo 00065 "Did you see what I did to Talbot Edwards?" %E %Cp Yeo 00066 "My accomplices have already escaped." %E %Cp Yeo 00067 "I do not fear silly %c." %E %Cp Yeo 00068 "I am wanted dead or alive." %E %Cp Yeo 00069 "There is a reward on my head, but you will not live to receive it." %E %Cc Yeo 00070 As you hold %o, you can %x why it is more than a mere artifact. Perhaps you should return it to %l. %E %Cc Yeo 00080 As %n collapses to the floor, he issues a final retort. "I cannot believe that I have been apprehended by a mere %r. Go back to that cowardly %lt and gloat of your victory." %E %Cc Yeo 00081 "You have found %o! The monarchy is once again secure." "Behold, %p, I have one more duty for you to fulfill: finding the Amulet of Yendor, and sacrificing it in the name of %d. This is not an easy task, but until then I can permit you to keep %o. You may find its powers useful." "Take our bell with you. When blessed, it can open the drawbridges of the Tower. You may find other uses for it, as well." "God preserve %d!" %E %Cc Yeo 00082 %l handles %o reverently for a moment, then looks at you. "You are its keeper now, and the time has come to resume your search for the Amulet. %Z await your return through the magic portal which brought you here." %E %Cp Yeo 00090 "Greetings, %p. How is your quest for the Amulet of Yendor?" %E %Cc Yeo 00091 "How admirable, %p! You have recovered the Amulet of Yendor!" "With the Amulet, %d will build an empire more mighty than the world will ever see. Go quickly, return to the dungeon, and climb upward until you meet the elemental planes. Find the Astral Plane, and sacrifice the Amulet on the high altar to %d." "Now, would you please return our bell and %o?" %E # # Wizard # %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 Once again, you are back at %H. %E %Cp Wiz 00003 You are back at %H. You have an odd feeling this may be the last time you ever come here. %E %Cp Wiz 00005 "Would you happen to have some eye of newt in that overstuffed pack, %s?" %E %Cp Wiz 00006 "Ah, the spell to create the magic portal worked. Outstanding!" %E %Cp Wiz 00007 "Hurry! %lC may not survive that casting of the portal spell!!" %E %Cp Wiz 00008 "The spells of %n were just too 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 "Yes, %p, you truly are ready for this dire task. Listen, carefully, for what I tell you now will be of vital importance. "Since you left us to hone your skills in the world, we unexpectedly came under attack by the forces of %n. As you know, we thought %n had perished at the end of the last age, but, alas, this was not the case. "%nC sent an army of abominations against us. Among them was a minion, mindless and ensorcelled, and thus, in the confusion, it was able to penetrate our defenses. Alas, this creature has stolen %o and I fear it has delivered %o to %n. "Over the years, I had woven most of my power into this amulet, and thus, without it, I have but a shadow of my former power, and I fear that I shall soon perish. "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." %E %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 You feel your mentor's presence; perhaps %o is nearby. %E %Cp Wiz 00041 The aura of %o tingles at the edge of your perception. %E %Cc Wiz 00050 "Ah, I recognize you, %p. So, %l has sent you to steal %o from me, hmmm? Well, %l is a fool to send such a mental weakling against me. "Your destruction, however, should make for good sport. In the end, you shall beg me to kill you!" %E %Cc Wiz 00051 "How nice of you to return, %p! I enjoyed our last meeting. Are you still hungry for more pain? "Come! Your soul, like %o, shall soon be mine to command." %E %Cp Wiz 00052 "I'm sure that your perseverance shall be the subject of innumerable ballads, but you shall not be around to hear them, I fear!" %E %Cp Wiz 00053 "Thief! %o belongs to me, now. I shall feed your living flesh to my minions." %E %Cp Wiz 00060 "Your puny powers are no match for me, fool!" %E %Cp Wiz 00061 "When you are defeated, your torment will last for a thousand years." %E %Cp Wiz 00062 "After your downfall, %p, I shall devour %l for dessert!" %E %Cp Wiz 00063 "Are you ready yet to beg for mercy? I could be lenient..." %E %Cp Wiz 00064 "Your soul shall join the enslaved multitude I command!" %E %Cp Wiz 00065 "Your lack of will is evident, and you shall die as a result." %E %Cp Wiz 00066 "Your faith in %d is for naught! Come, submit to me now!" %E %Cp Wiz 00067 "A mere %r is nothing compared to my skill!" %E %Cp Wiz 00068 "So, you are the best hope of %l? How droll." %E %Cp Wiz 00069 "Feel my power, %c! My victory is imminent!" %E %Cc Wiz 00070 As you touch %o, its comforting power infuses you with new energy. You feel as if you can detect others' thoughts flowing through it. Although you yearn to wear %o and attack the Wizard of Yendor, you know you must return it to its rightful owner, %l. %E %Cc Wiz 00080 %nC croaks out, as his body begins to shrivel up: I shall haunt your progress until the end of time. A thousand curses on you and %l. Then, the body bursts into a cloud of choking dust, and blows away. %E %Cc Wiz 00081 %lC notices %o in your possession, beams at you and says: I knew you could defeat %n and retrieve %o. We shall never forget this brave service. Take %o with you in your quest for the Amulet of Yendor. I can sense that it has attuned itself to you already. May %d guide you in your quest, and keep you from harm. %E %Cc Wiz 00082 "You are the keeper of %o now. It is time to recover the /other/ Amulet. %Z await your return through the magic portal which brought you here." %E %Cp Wiz 00090 "Come near, my %S, and share your adventures with me. So, have you succeeded in your quest for the Amulet of Yendor?" %E %Cc Wiz 00091 "Congratulations, %p. I always knew that if anyone could succeed in defeating the Wizard of Yendor and his minions, it would be you. "Go now, and take the Amulet to the astral plane. Once there, present the Amulet on the altar of %d. Along the way you shall pass through the four elemental planes. These planes are like nothing you have ever experienced before, so be prepared! "For this you were born, %s! I am very proud of you." %E # # General # %Cc - 00001 It is written in the Book of %d: After the Creation, the cruel god Moloch rebelled against the authority of Marduk the Creator. Moloch stole from Marduk the most powerful of all the artifacts of the gods, the Amulet of Yendor, and he hid it in the dark cavities of Gehennom, the Under World, where he now lurks, and bides his time. Your %G %d seeks to possess the Amulet, and with it to gain deserved ascendance over the other gods. You, a newly trained %r, have been heralded from birth as the instrument of %d. You are destined to recover the Amulet for your deity, or die in the attempt. Your hour of destiny has come. For the sake of us all: Go bravely with %d! %E %Cp - 00002 You receive a faint telepathic message from %l: Your help is urgently needed at %H! Look for a ...ic transporter. You couldn't quite make out that last message. %E %Cp - 00003 You again sense %l pleading for help. %E %Cp - 00004 You again sense %l demanding your attendance. %E # Completed the quest by returning with artifact, but not carrying # the Bell of Opening; quest leader lets you know that it is needed. #[ Should this be role-specific so that each leader has variant text? ] %Cp - 00005 "The silver bell which was hoarded by %n will be essential in locating the Amulet of Yendor." %E # # Angelic maledictions. # %Cp - 00010 "Repent, and thou shalt be saved!" %E %Cp - 00011 "Thou shalt pay for thine insolence!" %E %Cp - 00012 "Very soon, my child, thou shalt meet thy maker." %E %Cp - 00013 "The great %D has sent me to make you pay for your sins!" %E %Cp - 00014 "The wrath of %D is now upon you!" %E %Cp - 00015 "Thy life belongs to %D now!" %E %Cp - 00016 "Dost thou wish to receive thy final blessing?" %E %Cp - 00017 "Thou art but a godless void." %E %Cp - 00018 "Thou art not worthy to seek the Amulet." %E %Cp - 00019 "No one expects the Spanish Inquisition!" %E # # Demonic maledictions. # %Cp - 00030 "I first mistook thee for a statue, when I regarded thy head of stone." %E %Cp - 00031 "Come here often?" %E %Cp - 00032 "Doth pain excite thee? Wouldst thou prefer the whip?" %E %Cp - 00033 "Thinkest thou it shall tickle as I rip out thy lungs?" %E %Cp - 00034 "Eat slime and die!" %E %Cp - 00035 "Go ahead, fetch thy mama! I shall wait." %E %Cp - 00036 "Go play leapfrog with a herd of unicorns!" %E %Cp - 00037 "Hast thou been drinking, or art thou always so clumsy?" %E %Cp - 00038 "This time I shall let thee off with a spanking, but let it not happen again." %E %Cp - 00039 "I've met smarter (and prettier) acid blobs." %E %Cp - 00040 "Look! Thy bootlace is undone!" %E %Cp - 00041 "Mercy! Dost thou wish me to die of laughter?" %E %Cp - 00042 "Run away! Live to flee another day!" %E %Cp - 00043 "Thou hadst best fight better than thou canst dress!" %E %Cp - 00044 "Twixt thy cousin and thee, Medusa is the prettier." %E %Cp - 00045 "Methinks thou wert unnaturally stirred by yon corpse back there, eh, varlet?" %E %Cp - 00046 "Up thy nose with a rubber hose!" %E %Cp - 00047 "Verily, thy corpse could not smell worse!" %E %Cp - 00048 "Wait! I shall polymorph into a grid bug to give thee a fighting chance!" %E %Cp - 00049 "Why search for the Amulet? Thou wouldst but lose it, cretin." %E # # Banishment message (for converted hero) # %Cc - 00060 "You have betrayed all those who hold allegiance to %d, as you once did. My allegiance to %d holds fast and I cannot condone or accept what you have done. Leave this place. You shall never set foot at %H again. That which you seek is now lost forever, for without the Bell of Opening, you will never be able to enter the place where he who has the Amulet resides. Go now! You are banished from this place. %E # # Gypsy fortunes # Thanks to Mike Gribble for submissions. # %Cc - 00100 Ace of Swords. %E %Cc - 00101 2 of Swords, Peace. %E %Cc - 00102 3 of Swords, Sorrow. Your relationships will be shaky. %E %Cc - 00103 4 of Swords, Truce. %E %Cc - 00104 5 of Swords, Defeat. %E %Cc - 00105 6 of Swords, Science. Your intellect will aid you soon. %E %Cc - 00106 7 of Swords, Futility. You should stop trying to bend fate. %E %Cc - 00107 8 of Swords, Interference. %E %Cc - 00108 9 of Swords, Cruelty. The cards are stacked against you. %E %Cc - 00109 10 of Swords, Ruin. When the full moon rises terrible things will happen to you. %E %Cc - 00110 Jack of Swords. %E %Cc - 00111 Queen of Swords. %E %Cc - 00112 King of Swords. %E %Cc - 00113 Ace of Wands. %E %Cc - 00114 2 of Wands, Dominion. You must not let evil overcome you. %E %Cc - 00115 3 of Wands, Virtue. Keep active or woe will overcome you. %E %Cc - 00116 4 of Wands, Completion. You should stick to your path. %E %Cc - 00117 5 of Wands, Strife. When Mars is out, it will be a time of bloodshed for you. %E %Cc - 00118 6 of Wands, Victory. If you stick to your path, great things will happen to you. %E %Cc - 00119 7 of Wands, Valour. Your strength will be put to the test in coming times. %E %Cc - 00120 8 of Wands, Swiftness. You will have to be fast in coming times. %E %Cc - 00121 9 of Wands, Adjustment. Beware, it will not be a safe time for you next full moon. %E %Cc - 00122 10 of Wands, Oppression. %E %Cc - 00123 Jack of Wands. %E %Cc - 00124 Queen of Wands. %E %Cc - 00125 King of Wands. %E %Cc - 00126 Ace of Shields. %E %Cc - 00127 2 of Shields, Love. You should work on your relationships. %E %Cc - 00128 3 of Shields, Abundance. %E %Cc - 00129 4 of Shields, Luxury. %E %Cc - 00130 5 of Shields, Disappointment. Disappointment waits for you round the corner... %E %Cc - 00131 6 of Shields, Pleasure. The full moon is the time for you to develop relationships. %E %Cc - 00132 7 of Shields, Debauch. You will meet someone tall, dark, and handsome. %E %Cc - 00133 8 of Shields, Indolence. Your god will be short tempered during the new moon. %E %Cc - 00134 9 of Shields, Happiness. Your dreams will come true. %E %Cc - 00135 10 of Shields, Satiety. %E %Cc - 00136 Jack of Shields. %E %Cc - 00137 Queen of Shields. %E %Cc - 00138 King of Shields. %E %Cc - 00139 Ace of Rings. %E %Cc - 00140 2 of Rings, Change. Your powers will be put to the test soon... %E %Cc - 00141 3 of Rings, Works. You will meet new challenges. %E %Cc - 00142 4 of Rings, Power. Your strength will aid you greatly in times to come. %E %Cc - 00143 5 of Rings, Worry. Your worst nightmares will come true. %E %Cc - 00144 6 of Rings, Success. %E %Cc - 00145 7 of Rings, Failure. You have had many close shaves with death, you will have more... %E %Cc - 00146 8 of Rings, Prudence. Next full moon is an excellent time to try to please your god. %E %Cc - 00147 9 of Rings, Gain. Your wishes will come true. %E %Cc - 00148 10 of Rings, Wealth. %E %Cc - 00149 Jack of Rings. %E %Cc - 00150 Queen of Rings. %E %Cc - 00151 King of Rings. %E # # TEST PATTERN # %Cc - 00099 %p: return(plname); %c: return(pl_character); %r: return((char *)rank_of(u.ulevel)); %R: return((char *)rank_of(MIN_QUEST_LEVEL)); %s: return((flags.female) ? "sister" : "brother" ); %S: return((flags.female) ? "daughter" : "son" ); %l: return((char *)ldrname()); %i: return(intermed()); %o: return(artiname()); %n: return((char *)neminame()); %g: return((char *)guardname()); %G: return((char *)align_gtitle(u.ualignbase[1])); %H: return((char *)homebase()); %a: return(Alignnam(u.ualignbase[1])); %A: return(Alignnam(u.ualign.type)); %d: return((char *)align_gname(u.ualignbase[1])); %D: return((char *)align_gname(A_LAWFUL)); %C: return("chaotic"); %N: return("neutral"); %L: return("lawful"); %x: return((Blind) ? "sense" : "see"); %Z: return("The Dungeons of Doom"); %%: return(percent_sign); a suffix: return an(root); A suffix: return An(root); C suffix: return capitalized(root); p suffix: return makeplural(root); P suffix: return makeplural(capitalized(root)); s suffix: return s_suffix(root); S suffix: return s_suffix(capitalized(root)); t suffix: return strip_the_prefix(root); %E slashem-0.0.7E7F3/dat/guild.des0000664000076400007640000000527610545462317014237 0ustar aliali# # The guild of disgruntled adventurers. # LEVEL: "guild" ROOM: "ordinary", lit, random, random, (12,6) NAME: "central" # stuff for them to use on you... 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 OBJECT: random,random,random OBJECT: random,random,random OBJECT: random,random,random OBJECT: random,random,random OBJECT: random,random,random OBJECT: random,random,random OBJECT: random,random,random MONSTER: '@', "archeologist", random, hostile MONSTER: '@', "archeologist", random, hostile MONSTER: '@', "barbarian", random, hostile MONSTER: '@', "barbarian", random, hostile MONSTER: '@', "caveman", random, hostile MONSTER: '@', "cavewoman", random, hostile MONSTER: '@', "doppelganger", random, hostile MONSTER: '@', "doppelganger", random, hostile MONSTER: '@', "elf", random, hostile MONSTER: '@', "elf", random, hostile MONSTER: '@', "flame mage", random, hostile MONSTER: '@', "flame mage", random, hostile MONSTER: '@', "healer", random, hostile MONSTER: '@', "healer", random, hostile MONSTER: '@', "ice mage", random, hostile MONSTER: '@', "ice mage", random, hostile MONSTER: '@', "knight", random, hostile MONSTER: '@', "knight", random, hostile MONSTER: '@', "monk", random, hostile MONSTER: '@', "monk", random, hostile MONSTER: '@', "necromancer", random, hostile MONSTER: '@', "necromancer", random, hostile MONSTER: '@', "priest", random, hostile MONSTER: '@', "priestess", random, hostile MONSTER: '@', "rogue", random, hostile MONSTER: '@', "rogue", random, hostile MONSTER: '@', "samurai", random, hostile MONSTER: '@', "samurai", random, hostile MONSTER: '@', "tourist", random, hostile MONSTER: '@', "tourist", random, hostile MONSTER: '@', "undead slayer", random, hostile MONSTER: '@', "undead slayer", random, hostile MONSTER: '@', "valkyrie", random, hostile MONSTER: '@', "valkyrie", random, hostile MONSTER: '@', "wizard", random, hostile MONSTER: '@', "wizard", random, hostile ROOM: "ordinary" , random, random, random, random STAIR: random, up OBJECT: random,random,random ROOM: "ordinary" , random, random, random, random STAIR: random, down OBJECT: random, random, random TRAP: random, random ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random OBJECT: random, random, random ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random TRAP: random, random ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random TRAP: random, random RANDOM_CORRIDORS slashem-0.0.7E7F3/dat/kobold-1.des0000664000076400007640000000416110545462317014533 0ustar aliali# # Kobold level # LEVEL: "kobold-1" RANDOM_MONSTERS: 'k' ROOM: "ordinary" , lit, random, random, (11,9) NAME: "central" OBJECT:'(',"chest",random OBJECT:'(',"chest",random OBJECT:'(',"chest",random OBJECT:'(',"chest",random OBJECT: ')',random,(4,4) OBJECT: ')',random,(4,4) OBJECT: '/',random,(4,4) OBJECT: '[',random,(4,4) OBJECT: '[',random,(4,4) OBJECT: '!',random,(4,4) OBJECT: '!',random,(4,4) MONSTER: 'k', random, random, hostile MONSTER: 'k', random, random, hostile MONSTER: 'k', random, random, hostile MONSTER: 'k', random, random, hostile MONSTER: 'k', random, random, hostile MONSTER: 'k', "large kobold", random, hostile MONSTER: 'k', "large kobold", random, hostile MONSTER: 'k', "large kobold", random, hostile MONSTER: 'k', "kobold lord", random, hostile MONSTER: 'k', "kobold lord", random, hostile MONSTER: 'k', "swamp kobold", random, hostile MONSTER: 'k', "swamp kobold", random, hostile MONSTER: 'k', "swamp kobold", random, hostile MONSTER: 'k', "rock kobold", random, hostile MONSTER: 'k', "rock kobold", random, hostile MONSTER: 'k', "rock kobold", random, hostile MONSTER: 'k', "Kroo the Kobold King", (4,4), hostile ROOM: "ordinary" , random, random, random, random STAIR: random, up OBJECT: random,random,random MONSTER: 'k', random, random, hostile MONSTER: 'k', random, random, hostile ROOM: "ordinary" , random, random, random, random STAIR: random, down OBJECT: random, random, random TRAP: random, random MONSTER: 'k', random, random, hostile MONSTER: 'k', random, random, hostile MONSTER: 'k', random, random, hostile MONSTER: 'k', random, random, hostile ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random OBJECT: random, random, random MONSTER: 'k', random, random, hostile MONSTER: 'k', random, random, hostile ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random TRAP: random, random MONSTER: 'k', random, random, hostile MONSTER: 'k', random, random, hostile ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random TRAP: random, random MONSTER: 'k', random, random, hostile MONSTER: 'k', random, random, hostile RANDOM_CORRIDORS slashem-0.0.7E7F3/dat/credit.xpm0000664000076400007640000032411010545462317014425 0ustar aliali/* XPM */ static char * credit_xpm[] = { "202 256 257 2", " c None", ". c #B08077", "+ c #C2786D", "@ c #BD9494", "# c #B59F9C", "$ c #BD9784", "% c #C6948C", "& c #CE8C7B", "* c #B78C84", "= c #C69484", "- c #C68C7B", "; c #CE8C84", "> c #C6A58C", ", c #C6A594", "' c #B59B94", ") c #AD9884", "! c #B88C7B", "~ c #C28472", "{ c #A18377", "] c #CE9C94", "^ c #CE9C8C", "/ c #BD9E8C", "( c #CE7F6D", "_ c #CE948C", ": c #C68C84", "< c #C6999C", "[ c #CF9C81", "} c #CE9475", "| c #CE8C6C", "1 c #CEA59C", "2 c #BF8C94", "3 c #C68C8C", "4 c #C69494", "5 c #CE848E", "6 c #CE807B", "7 c #CE9484", "8 c #CE8C8C", "9 c #C69C8C", "0 c #B68C9D", "a c #9E9786", "b c #BF646D", "c c #B78C8C", "d c #C69472", "e c #A69B94", "f c #B5988C", "g c #C69C94", "h c #C6A59C", "i c #CE9C9C", "j c #BA8C65", "k c #908077", "l c #A06B62", "m c #9D7E64", "n c #98808C", "o c #BE8492", "p c #BD948C", "q c #C56A48", "r c #B2646A", "s c #BD8C73", "t c #B5987B", "u c #CE778F", "v c #976C76", "w c #746D78", "x c #BA8084", "y c #A89D9C", "z c #B07C64", "A c #CE9494", "B c #968084", "C c #CE8C98", "D c #BDA09C", "E c #C69E84", "F c #CE949C", "G c #897C94", "H c #C69F74", "I c #BE7693", "J c #BD9F94", "K c #CEA594", "L c #BD9873", "M c #B799A5", "N c #CE98A5", "O c #C69CA5", "P c #CEA5A5", "Q c #7D5A52", "R c #7A524E", "S c #795A5F", "T c #7B505D", "U c #846A63", "V c #675560", "W c #735A4C", "X c #6B524F", "Y c #6B4A48", "Z c #8F6B5E", "` c #97505F", " . c #6E6662", ".. c #211818", "+. c #291821", "@. c #212118", "#. c #291818", "$. c #212121", "%. c #523939", "&. c #201821", "*. c #292118", "=. c #292121", "-. c #504231", ";. c #4A3939", ">. c #936B6B", ",. c #423131", "'. c #A15D62", "). c #5A404D", "!. c #FFEDED", "~. c #FAD9D8", "{. c #524239", "]. c #D0ABB2", "^. c #40392F", "/. c #806652", "(. c #997364", "_. c #A0674E", ":. c #3C313C", "<. c #524242", "[. c #5E524E", "}. c #634044", "|. c #5A4242", "1. c #4A3931", "2. c #393129", "3. c #312121", "4. c #5A3F39", "5. c #5D4A4E", "6. c #D8BBBD", "7. c #C2A4AD", "8. c #D6B5B5", "9. c #E7BDBD", "0. c #E0C0C6", "a. c #EFC6C6", "b. c #FBCFCB", "c. c #5A3942", "d. c #846F78", "e. c #332129", "f. c #392929", "g. c #7B5237", "h. c #4A4239", "i. c #423129", "j. c #F4F7F6", "k. c #303129", "l. c #5B4A42", "m. c #905F61", "n. c #312921", "o. c #4F3843", "p. c #422929", "q. c #FFFEFD", "r. c #8F694F", "s. c #7B6962", "t. c #4D3131", "u. c #634039", "v. c #312929", "w. c #665A4C", "x. c #8A7DA7", "y. c #AC7B4B", "z. c #292921", "A. c #392921", "B. c #4E3139", "C. c #403D3E", "D. c #4A4242", "E. c #372934", "F. c #DFD1C4", "G. c #373131", "H. c #7A4A49", "I. c #5A3C31", "J. c #795242", "K. c #805A45", "L. c #523931", "M. c #6B523E", "N. c #B38B4D", "O. c #9F5F3E", "P. c #6B3C2D", "Q. c #733F38", "R. c #82403C", "S. c #8F5536", "T. c #F2CE84", "U. c #E8B87C", "V. c #DC9C64", "W. c #CB904F", "X. c #EB974E", "Y. c #E28C60", "Z. c #E19462", "`. c #D5A871", " + c #B16747", ".+ c #BCA9A5", "++ c #6B413F", "@+ c #8F5B42", "#+ c #D4A789", "$+ c #C9814C", "%+ c #4A3129", "&+ c #816745", "*+ c #EFA968", "=+ c #DA8648", "-+ c #744A36", ";+ c #EE8A48", ">+ c #523129", ",+ c #633A2C", "'+ c #8F5450", ")+ c #422921", "!+ c #4D281F", "~+ c #AF5765", "{+ c #312118", "]+ c #E2D9DA", "^+ c #5A3527", "/+ c #4F3A28", "(+ c #5D4A37", "_+ c #F3D79A", ":+ c #181818", "<+ c #E19484", "[+ c #5E5240", "}+ c #311818", "|+ c #3E2A18", "1+ c #B8AEC2", "2+ c #4D292C", "3+ c #3B2121", "4+ c #CEBDB2", "5+ c #7C6077", "6+ c #50424C", "7+ c #311821", "8+ c #C1B3AD", "9+ c #DCC1D3", "0+ c #292929", "a+ c #4E3120", "b+ c #EEE5EC", "c+ c #DC9C8C", "d+ c #605976", "e+ c #181810", "f+ c #3C2018", "g+ c #3E3221", "h+ c #514C60", "i+ c #DAB49B", "j+ c #6B664C", "k+ c #6F6684", "l+ c #6F6A8C", "m+ c #1A1018", "n+ c #211810", "o+ c #181010", "p+ c #504A4E", "q+ c #312918", "r+ c #272129", "s+ c #311E10", "t+ c #E5C0B1", "u+ c #212929", "v+ c #291E36", "w+ c #182118", "x+ c #182121", "y+ c #101010", "z+ c #291A10", "A+ c #101818", "B+ c #313121", "C+ c #E27668", "D+ c #D8999E", "E+ c #DBA599", "F+ c #DB9A94", "G+ c #D7948C", "H+ c #F7C6C6", ". + @ # $ % & * = - ; > , ' ) . ! ~ . { $ ] ] ^ / ( & _ : $ ; = @ < > [ } } ^ % _ } | ( ; ] 1 2 { { 3 4 5 6 { 7 7 ; % 8 7 7 ~ * ' 4 9 0 a = 7 7 [ ^ 7 & 6 b + + c d 7 ( - ! ~ ( ~ e f g $ ; h i i ] ] ( 7 _ ] _ c + ~ j { = ) a k l m n / 8 i o c ) f % o c p q r s } _ 7 & o o 6 ~ 6 8 % [ $ $ $ t ) f u 5 _ t s { { . v k . / p a w k a e > } t _ - } 7 & ~ ( 6 - ! 7 } 5 5 _ ~ 7 [ ] x { ! ! { ~ ~ _ ^ _ _ ] y ' ", "z ' < 4 9 A g o c B c g C 4 x ; ~ & ( & _ ] ] ] % | } 8 c f % @ y D > [ ^ 7 9 ^ _ & ~ p E 1 1 F x . u 7 8 $ ! - % ) / _ d | } 9 ' ' [ ] # ) ) p 7 ^ ' g % - : & % 7 9 $ = & ( & & > > g f p ' y @ A g * x ^ A ] f x . * p % = ! z l n G < D n n a f ; ^ g @ 8 b * { H E s u x ) ! 7 _ @ 2 g 1 9 . a e 0 I I x f s a { k { * % _ % : ) t a a D ^ ^ ] 7 } 7 & ~ ~ & . ) p = t - } j [ E } $ t - ~ } | } ] ] $ * 1 D # ", "! D 0 . 3 0 < I I f @ i i g 3 } & & ~ - g J ' ] ^ } [ ^ ] ' c 4 1 1 K ] _ ~ $ g ^ ; ^ / ' 1 i 2 o 6 u [ ^ 7 + . p a < ] [ = ) 9 f , A h ] = c ' 9 1 h D g 7 & 7 ^ ] ] g p * ! 9 % [ K ] ] - t e < ] ] p % _ ] ] * c t E 9 p * ~ & ) 0 y < @ n c a ! _ ] ] ] _ = ! . < ; . o a * s E ^ J D g K > 3 e a 0 I I 8 c { a . z : _ 7 7 g ] p s a a y y e ' 4 : _ 7 & 6 ( f % $ p [ d - L H | 7 ] _ _ 4 _ 7 $ g i 2 p i h F ", "> < 2 + e 2 M e f @ g 5 4 ] ] _ ; ; ~ * K E ] ] _ 7 ^ ] g i @ M K 1 1 g & ~ e ' ] _ ] ^ > > ) n x 8 8 K A 8 b ( A g 2 ] ] g / @ h D i h < % y g ] 1 1 4 ' % & 7 ^ 1 4 4 < $ ' g 9 ^ g i ] H s [ K ] g 8 _ ^ A ] 9 ^ % % f * ! = _ ' h # # = . a ! * ^ ] ] ] 7 p ) n # 6 & t t s - 9 h D ] g K 1 h D D A f ] _ ; - t ~ + 5 % = $ H 9 9 7 f ) e # g @ c * % * { { ~ _ ^ d 9 ^ H / g _ 7 A ^ ^ ^ J g _ 9 4 A F ] i K K ", "> J 9 - y D ' y y e ' ^ p f F A ; 7 ( _ K K ] ] 8 _ g h < i N 1 K > > $ . ; ' 1 ] ] ] g ] 9 a 0 : _ 8 ] g 8 + ( _ ] A ] g 1 1 i 1 1 A ] D @ @ 4 < < i 1 i 3 c 9 K 1 h i 1 < i i _ ; E > K ] = } F 1 A ] ^ f p ' / f f ) x ~ - 9 > / ) e x : B k t f ^ ] ] ] = ! : ' 0 K K } | j 9 A F i , D A 4 < i g ' f 3 3 = t z $ 2 I o ; & ^ J g _ / / D 1 ] $ ' 7 % ) { { - p % $ 9 _ ^ [ ^ & ^ g ' 9 _ 1 1 ] i 4 8 i > / i K ", "K ' 9 ] h 1 / J D ' 9 [ H 4 A ] ; 8 * 2 8 i ] ] A _ ] 1 h D 1 1 1 1 E ~ 7 @ f ^ ] ' i 1 h ' h ] 7 3 2 F i _ ( l 5 A ' 9 7 , h h 1 1 ] K D h < i h ] 4 ' ] c f 9 1 1 D h 1 1 i A : 5 , K [ } H 4 i ] _ ] % ) a / g / / * s j a a / , t ) ) * B B % p _ 5 A : . . x y ' > / s t s / F i 1 J 4 2 2 1 i A g g $ * ) j d - 3 3 8 $ ~ ] h 1 g ] 7 ] ' ^ s ' 7 7 ' * s ! $ / g $ f y a ~ ^ g ' e @ 8 ] F C C i i ] D ' ^ E ", "K ' ' 1 K 4 / < 1 7 9 [ H ] i g 8 _ % 2 C ] [ ^ _ 4 i 1 h 1 ] i < ] > s $ o ' h g D 4 1 ] J h c ! - g 1 A 6 + + 5 _ * $ $ ' y # D D g 1 1 < D D 1 [ ' a , A A ] ] 1 1 O 1 h i p . 2 D D A H _ 4 i K } ^ 7 7 c _ ] , $ . s ! a e y , ) a a t ) e c o 8 5 _ + b x I C K / . { t p ' > ' D ) f < _ , ^ ^ ^ H d ! { * d d f 5 5 ~ x K y # # & | [ g $ ! E } & ^ p . { ' ' e f e e k a e e e a g p $ < C u A K K K E > / ", "9 i < i < D % ] 1 K ^ 9 ^ 4 < 2 c f ] ] i > _ } & 8 F h P 1 1 < h ] ] 7 ' E > ] i 1 i 8 ] ' ] f = : ] ] 9 $ 6 = = = $ % A , D i < D < i P 0 4 2 ] ^ 9 ' c A A 1 1 O P P P 1 2 o x I A ] F < D @ ] ^ H ^ } } ~ ; 8 4 3 x { y y y y , e a * 7 / f 4 4 4 8 7 6 b u C C A ( ~ 7 = ] 9 / ' 9 H f h ] e H > [ L | ( - = [ H % _ ( = = ' y D @ : = ] _ p * 7 7 } _ _ ~ x f e e y y e a y y # ' y ' * t ] 1 8 u 5 F i E ' ' ", "^ 1 1 i 1 g _ ] 1 < c - c @ < c f @ ^ K 1 A v Q R Q S T S S S S S S U A ' ) $ V W S T X S Q Q W S . < D # % ; = a ! c p ^ > , @ 8 K K P K A F 5 F ] F 1 A i A i 1 O i K i < I I r Y S S S S S S S W Q Z A % $ 4 ` Y R X T V .V V .W . p 8 @ y 3 4 # p ~ ~ + u C F | ~ - % g , g ] g ^ p h P D e ' , ] ^ } - ; & } 7 % & 7 $ f ' y D ' ^ % 9 9 e / 7 _ } } 7 ; u 8 g h D @ 4 O 1 h h ' ' e / p ; 6 ^ C I C F K F < ", "] h h g ] g : g ' 0 @ * y O D # J F F i K > Q ..+...+.@.#.@.#.$...@.%.2 D e g #.&...*.+...=...+...l f y e ^ _ _ $ * c J h 1 A g A O D P 5 2 5 C C F C F , 1 ] 8 1 i i ] @ 0 u u v +...#...+.@...@.+...-.A 5 = ] ;.+.+.#.$.#.@.=.@.#.+.>.I u o o 6 4 , 9 ~ r d ^ A 6 ( & $ ' F F _ 9 ] ] h P 1 / J h i 9 g = E [ : } 7 x & 7 * a e y D J ' g ] [ ^ _ | [ ; 7 } 5 5 _ % F C A i 1 1 1 < K g a f 7 & & } 1 F C C 1 i 1 ", "J J , % @ 9 - ' 0 y e e D < h i e D g ' ^ > Q =.v n n n G n n n v ,.%.1 A < g &.,.>.0 M M M >.S =.m f f @ ] ] : 7 * e D D h & p ' { v '.v '.'.'.2 M F 1 4 1 h F < i F A C u '.v T #.).P !.~.!.!.!.c ,.{.h _ ; ] ;.*.v ~.~.~.~.~.].).@.v 5 2 9 } A O h $ z } ^ ^ > } + & ] i F ] 6 g ' ] P P h K , 1 e y / ^ 7 [ ] ] ; ( : 8 E p / # h ' J , _ } ^ _ ~ _ ; ; ^ ] : u u 5 u u C i ] F < < K ' f $ & & 7 A 8 C P 1 h D ", "D J 9 ~ ' ) s e a e G c / 4 J > J K 9 9 < h S *.=.n n n n n n n . &.^.i K K ] ..+.>.M 0 M M >.&.#./.k >.{ v v Z l l { { { (._.k m :.+.+.+.+.$.&.v { { B { { { B { { v v v v +.+.#.$.*.>.~.!.~.!.~.).#.<.i _ 8 ] %.=.=.~.~.~.~.~.>...=.{ D ' _ _ f { { (.l k { { { m l . ^ K ] 6 % _ ^ 8 ] < E * { . .S S .>.. ] [ ( 7 x >.m v m { { { k k l = 7 . Z l l l l { k '.v '.5 i F A , D 0 < 9 ^ ) $ ~ ( ( u I C N 4 O # ", "3 = c { ] 9 - f y y e e ' / ) < h , f * , < D ...n n n n n n n n S +.[.1 ] , k #.>.0 M M M >.+.$.+...=.#.=.*.$.*.$...&.&.+...#.&.#.$.).#.$.}.=.+.&.+.#.+.&.+.#.&.#.=.+.+.+.$.,.,.#.&.>.!.~.!.!.!.|.<.i @ % % _ C ;.+.!.~.~.~.~.>.+.v 3 $ t 8 i .+...=.=.#.&.#.&.+.@.1.^ ] = 6 5 [ ^ 2 c S 2.=.&.#.&.@...#.$.&.3.4.X ;.5.#.+.*.+...&.&.+.+...& ; ;.+.$.+.@.=.#.+.=.+.+.C F C 4 ' / J F 4 ' / % = 7 & 8 o C C N C i ", "x 6 + * g ^ ! a e y f < ] 9 e g ' ' : : g D D .+.n n n n n n n e n S #.[.1 g (.&.>.M M M M >.&.#.{ O M O D O O M O O O O D O D O D ].>.&.#.O D O O D O D O D O O D O D O D O 6.|.&.*.>.!.!.!.!.!.|.%.1 F 7 g g > {...!.~.~.~.~.>.+.k 2 c 4 K , Q ,.f O M O O D O f +.1.^ ^ ! ; A 9 E S 3.&.,.U f O ].7.7.7.O v S ,...+.#.$.S 0 e 0 e 0 { ,.+.( & %...v n n n n n n ,.&.M M < C I x > A ] A % [ t = = 6 I C C g 4 C ", "0 o d : 4 p + a e e D 4 _ ] , g ] % x g 1 K ] R &.n n n n n n n n 0 n }.+.U g (.#.>.0 M M M >.+.&.+.7.7.P ].].].].].8.8.8.8.8.8.6.6.9.>.+.$.0.a.a.a.a.a.a.a.a.b.a.~.~.~.~.~.~.~.).*.&.>.!.!.!.!.!.).{.h i 7 K > > %.#.!.~.!.~.~.>.+.k J a a J J W +.].a.a.a.a.a.0.f &.%._ - = $ $ - ^.#.).O ].].].P 7.P 7.7.7.7.M M M O $.#...e 0 e 0 e c.+.$.6 x %.=.}.n n G d.n e...=.P O D < 0 I A i i A ^ ^ / c _ & 8 C F ^ 4 M ", "C u E % ^ $ s { ) / x i A i h g ] 8 8 A F 1 ^ W =.n n n n n n n n e n 0 ;.+.U (.&.>.M M M M >.&.[.#.7.7.7.].].].].].].8.8.8.8.8.9.6.9.>.&.#.a.a.a.a.a.a.a.a.b.b.b.b.~.~.~.~.~.~.}.&.*.>.!.!.!.!.!.|.f.W W g.Q Q W 2...!.!.~.~.~.>.&.d.c y G a e h.,.a.a.a.a.a.a.9.0.,.3.s | H E j i.+.{ ].].].].].].7.7.7.7.7.O M M M S #.f.+.e 0 e n 0 )...l ( X &.%.n n n n n ..=./.m 1 h ' # D 9 A _ p / h ] A 2 = % 4 p g H 9 I ", "C o < ^ g $ - 3 7 [ o 2 8 < < ) % 8 8 A ] h 1 S ..n n n n n n n n 0 n 0 e %.&.X +.>.0 M M M >.+.S &.7.P ].].].>.>.>.>.>.>.>.>.>.>.>.v >.=.&.a.9.a.a.a.a.a.a.b.b.b.b.~.~.~.~.~.~.).*.&.>.!.!.!.!.j.}.+.$.#.$.&.@.+...+.!.~.!.~.~.>.+.d.* y a ' { @.c a.a.a.a.a.a.9.a.. &.Q [ K > [.+.v 8.8.].].].].P ].7.7.7.O M M M M #.k.X +.e 0 0 0 e c.=.c l.&.%.n n n n m.&.n.m } } > < K > > $ : x x : D A D ' / ) g / E } _ i ", "F 0 0 9 E } d 8 % ' 2 5 2 y y a o 5 _ ] > h h Q $.n n n n n Y n e n 0 e 0 e %.+.@.>.M M M M >.&.S ..7.7.P ].].&.+.&.+.&.+.&.+.&.+.=.=.).#.=.U &...&.#.&.>.a.b.b.b.O ..#.&.#.+.).%.&.*.>.!.!.!.j.j.].D O D O O O D O D !.!.~.!.~.>.&.(.= a G x l.e.0.a.a.a.6.6.a.9.0.0.,.3.! _ * ..}.8.8.].].].].v X ,.#.&.,.T . 7.M Y $.U T ..0 e e n 0 )...;...}.n G n n T $.,.. , > } ! x ] ^ = s ( 6 x 8 f 0 # ) f @ J / H K F P ", "F 0 0 D } } 7 _ ' f c o f y e a 8 5 8 D g 1 h S #.n n n n n +.o.n n n 0 e 0 y p.+.>.0 M M M >.+.X =.7.7.].].]...=.#.$.#.$.#.$.,...,.#.*.&.#.&.#.%.{.,.=.>.a.b.b.b.M =.,.%.;.&.*.&.*.&.>.!.!.j.j.j.q.q.q.q.q.q.j.j.!.!.!.!.!.~.~.>.=.{ C o B r $.>.a.a.a.a.T S a.a.0.9.. &.r.t s.+.f 8.].8.].P ,.=.&.,.%.{.f.$.&.%.M +.f.D W +.e 0 0 0 e |.+...S n n n n T @.t.* g 9 H | z ~ - f 9 7 6 6 u o ' ' e 9 ] i 0 t d e < 1 ", "g M < D 9 / g 4 4 3 e n y e a t a f f ' D i g Q $.n n n n n &.+.}.e 0 n 0 e 0 y e.>.M M M M >.&.X ..7.P 7.].].>.>.>.>.>.>.>.v >.=.v l v /.W Q S D 9 l $.>.a.b.b.b.O ..{ A 8 T X X u.=.>.!.!.j.j.q.q.q.q.q.q.q.j.j.!.!.!.!.~.!.~.>.&.(.| { w [.#.6.a.a.a.6...#.6.0.a.0.].v.f.1 o.$.8.8.8.].8.v.&.w.c ^ ] < ] * ,.v.%.&.r.e S ..0 y e e n }.v.m.n n n n >.&.:.< h ' > H } j ~ ( | = 7 6 x o c ' g 2 ' K 1 , a ! y h 1 ", "g # D , 2 f # ] p 5 u o y x.e / p % , h E E # S #.n n n n n +.@.+.T e 0 e 0 0 y 0 v M M M M >.+.X +.7.7.P ].].].].].8.8.8.8.8.>.+._ 2 < K K 1 N % p l #.>.a.b.b.b.D +.{ ] ^ _ = | (.#.>.!.!.j.j.q.q.q.q.q.q.q.j.j.!.!.!.!.!.~.~.>.#.y.t t B z.S a.b.a.a.T =.&.S a.9.0.9.>.+.U :.}.8.8.8.].. &.[.D < ^ ] g % A S 3.&.f.a y S $.e 0 0 e 0 Y n e n n n n G A.:.< 1 , $ [ [ } ( + ( ~ % [ ^ ] ^ ^ g g A ] ] ] ! { h h D ", "K D C < N D ' h J 5 u _ ] ] ] ^ } ] ] K / ' e S @.n n n n n &.B.C...T e 0 e 0 0 0 M 0 M M M >.&.X +.7.7.P ].].].].].].8.8.8.8.>.&.^ K 1 P N N g _ - l &.>.a.b.b.b.O ..{ 7 _ ^ - 7 l $.>.!.!.j.j.q.P D O M O O O O M O !.!.~.!.~.>.&.>.) a S ..O b.a.a.6...C.f.v.0.0.9.0.].v.f.=.|.8.8.8.8.>.+.{ M 0 # 4 8 o F K U +.f.0 K Q ..0 e 0 n 0 G n n n n n n n v *.V 1 1 9 ~ ; / % x + + * 9 g g _ ] ] 4 8 _ ^ _ % c K e g ", "# D F F F F A < 4 8 8 ^ ^ g 9 $ ) h / ) % ' % S #.n n n n n +.D.2 :.#.T e 0 0 y 0 M M M M M >.+.X +.7.7.].].].M O D O D O O ].>.+.' E h P 1 9 : } } l =.>.a.b.b.b.M =.m _ ^ _ _ _ { #.>.!.!.!.j.q.).&...=...$.....*...!.!.!.~.~.>.=.m t a f.).b.a.b.a.,.+.f.2.+.>.a.9.9.9.>.&.#.).8.8.].8.c ..w.# y e 4 5 8 A U +.v.=.[.K W =.e 0 e 0 e n 0 n G n n n n n ).*.k F < % . 5 5 o b x s / g ] % ' g 3 A ^ ] ' 9 ^ 9 ) ' ", "M O C 0 N C 8 i i g H & b A ^ E > E t t ! > ] S @.n n n n n &.{.i g e...x e 0 y 0 0 M M M M >.+.R &.7.P 7.].]...$.+.@.+...&...).*.K H K 1 7 7 * ; } l @.>.a.b.b.b.O ..l ^ 7 ] ] g { &.>.!.!.!.j.j.}.f.T X V w.w. .f.+.!.!.~.!.~.>.&.l } m.... b.b.a.].|.).|.).|.Y 0.0.9.9.].v.+.*.8.8.8.].].v.+.S @ / % 8 g * |.$.>.).#.>.S ..0 e 0 e 0 n e x +.{ n n G n d.f.E.2 2 o u 6 6 5 u 6 : ) @ A g K A ] _ i i ] ^ ^ ^ p % ", "I I I I C C 2 i D < } ( ; 7 7 _ [ } H | H t 9 Q &.n n n n n +.%.D h * =.&.c 0 0 y 0 M M M M >.&.X #.7.7.P ].].&.f.S W .W ;.=.#.&.Q &.#.&.} _ 7 6 _ l =.>.a.b.b.b.D =.l | 9 9 _ ] m +.>.!.!.!.!.j.}.B.2 o 2 ' ) D ;.&.!.~.!.~.~.>.=.{ * ;.,.b.b.a.a.a.a.a.a.a.a.a.0.9.0.9.6.m.&.+.f 8.8.].].P ,.&.3.<.W S ,...=.Y M M v.3.w.&.e 0 e 0 n 0 T &.#.e.n n n n n v =.X I c % _ - 7 3 x 4 g _ [ i D 4 _ A 4 ] g ] ^ ^ ! - ", "I I I 0 M 0 g < J ^ 3 ( } _ _ F K [ - H * f J .#.n n n n n &.B.3 g 1 c =...c 0 0 M 0 M M M >.+.W &.7.7.7.P ]...=...=...=.+...=.#.&.*.).*._ * } _ = l &.>.a.b.b.b.O ..l } ^ [ } H m +.>.!.!.!.!.!.|.%.o 8 ] g / < ;.*.!.~.~.~.~.>.&.k l =.v ~.b.a.a.a.a.a.a.a.a.0.9.0.9.6.9.6...=.).8.].8.].].].v X ,.&.@.%.S M M M M f &.+.#.e 0 e n 0 U ..,.R ..).n n n n n |.&.>./ ] g ^ & = % _ % * E i < ' ^ > > ] F ] ^ _ + + ", "x.I 8 h D ' _ h ' ^ 3 7 _ _ % ' ^ ~ ^ % / J # .#.n n n n n +.%.u P P P { &...c y 0 M 0 M M >.&.S @.7.7.].].].>.>.>.>.>.>.>.>.>.>.>.f >.&._ _ A _ 6 '.+.>.a.a.b.b.M =.m } [ ^ - t m #.>.!.!.!.!.!.).;.4 % ' ] F < ;.&.!.!.~.~.~.>.+.(.5.v.F.b.b.a.c >.>.>.>.>.>.>.>.9.0.9.6.6.S ..#.c ].8.].].].].].].7.7.7.7.O M M M M Y $.+.e 0 0 e n }.+.- 6 %.*.v n n n G d.f.v.$ ] ] ^ 8 - _ E t x _ ^ > f g ] K 4 o < ] 6 x x ", "o 8 p D O J 7 h ' g _ } 7 A i < ^ } _ = ] ] ' 5.=.n n n n n &.,.. 2 < i < s.&...0 0 M M M M >.&.[.&.7.7.P ].].].].].].8.8.8.8.8.6.6.9.>.+.^ A ] _ : U ..>.a.b.a.b.O ..m.> K _ [ ^ Q =.>.!.!.!.!.!.|.,.* f c F C c G.*.!.~.~.~.~.>.&.Q #.T b.b.a.6...&.+.&.+.&.+.&.+.,.9.6.9.8.].+.&...{ ].].].].].].7.7.7.7.O M M M M M M v.#.e 0 e 0 e ).#.z 4 ! +.v.n n n n G v *.|.* p ^ % f p - H : 9 [ } o ^ ' A C C F _ ; ( u ", "] 1 g g K [ 7 h g = d } [ ] ] ] = 7 ^ 9 g ' S *.&.n n n n n +.#.&.4 4 ' h # S +.v.0 M 0 M M >.+...=.7.7.7.P ].].].].8.].8.8.8.8.8.6.6.>.&._ ] _ % o ..=.>.a.a.b.b.D +.@.^ 1 i 8 k #.&.>.!.~.!.!.!.|...;._ 2 u o C.+...~.~.~.~.~.>.+...=.6.b.b.a.S &.[.9 g ) ) ; 7 ;.#.c 8.8.8.8.Y =.+.&.|.O ].].].P 7.P 7.7.7.M M M v ,.v.#.&.0 e 0 e n }.$.&._ ; ..+.T n n G v G |.&...: 5 ^ ' , g _ i g < ; 5 4 @ i o < g 7 _ 8 ! ", "[ 8 5 ^ > = _ g - | } | } ] < ] ; % g ' 1 , .#.{ n n n n n v ,.=.# i % 9 ] >.=.|.M M M 0 M >.).*.v O O O D M O D O M O M O O O O O P >.+.% o 6 x I ..,.f O O D O M |.+.1 1 _ 5 l $.}.f O O D < M . ,.%.% 3 2 o ;.#.{ O O O O O f ).=.U M O D O U #.X J ] 9 p 6 ~ %.&.. O O O O f ,.&.|.+...,.U f M P 7.7.M O v X #.=.3.2.+.S e n 0 e 0 e p.=.3 : &.,.n n n n n n n ,.+.& ; _ D ] > > i K % 5 C F N < I + x [ ^ ^ - ", "_ o u 8 @ 9 ^ % x o E } H ] A ^ 7 g g ] i g S ..+...+...+.#.=...+.# # _ > J k #.+...+.@.=...+.*.+.=...$...+.*.&.+...=...=...&...&.&.$.).*.f p = [ c &.+.&...$.+...=.+.@.1 i _ - l =...+.....+...=.&.+.,./.).B.B.3.&.+...$...$.&.+.*.&.#.=...+.@.+.$.T D A 8 5 5 + B.=.&...&...&.+.&.*._ (.5.3.&.+.*.&.#.&.#.@.=.#.,./.% { ..#.+.=...&...+.$.#.7 * #.&...&...&...&...+.@.7 ( = 4 g e 1 i ] A u I I o 0 u x & 9 9 } 7 ", "D I I o 2 2 H / o { / J 9 ] g % _ g h , g ] { .S Q Q R Y X X S Q ] ] $ / e B .X S [.+...=.[.S S R W W R H.R Q Q S w.S |.%.Q Q Q [.#.*.&.2 2 A J f X Q %.I.H.J.J.W K.S > 9 ^ _ . T W L.I.M.W R Y 3.$.#.&.v.|.).,.#.$.3.S .S S V 3.$.#.&.v.|.).,.#.$.3.S D A 8 5 m.H.R S W S W W M.W 7 ^ / g m X w.;.{.%.l.S >.' o + ; . Q .S S S Q Q Q M.W } = S S Q Q S S S S S S S ] 8 ( ] 4 h 1 1 A ] F < 0 0 I 0 < h y f 4 ^ ", "5 u I u o @ [ 2 I # y # $ > ' $ A g 9 ^ _ 1 { #.&.+...+.=.#.+...&...&.*.&.*.@.#.=...+.@.+...+...#.$.+.&.#.3.u.c 4 U ,...+...+...,.+.$.+.*.#.&...k m.t...=.&.*.p./.E @.#.&.#.&...+.@.+.=.#.+.&.f.#.$.#.S P ~.~.~.~.].%.&.S D h 4 c.$.#.S P ~.~.~.~.].%.&.S c / p _ ; ; 6 p / 9 E } 4 $ ] / 9 ' ) = _ ] g ] ^ p ' i 8 8 ( ( A K ] < 1 ] / , H H [ ^ A 2 8 ^ } K F F K 7 ] ] A 8 _ 7 , i @ 4 , g h M 0 y n # y # ' ' g ", "u I I ~ % 5 ; g c f ) e ) / / t 9 ^ } ] ] 1 { &.%.>.>.S ..=.v.m.>.S v.,.>.>.>.>.>.>.>.>.S +.S >.>.>.>.>.>.%.&.,.5.#.,.>.O O . >.).%.+.|.>.>.).*.f.=.;.>.O O >.%.+.^.+.v.m.>.>.m.v.+.,.>.>.S #.%.4.+.f ~.~.F.O O ~.~.0.,.3.1 1 >.&.+.f ~.~.F.O O ~.~.0.,.3.3 ! t s + s + } ! g ' ' / a J f H 9 - & & p f 9 _ = f ' < D < ; ( ; ^ E K , 4 1 1 ] ] A 8 3 2 ^ ^ [ i i ] 6 A _ ^ 8 8 | h i @ P h @ N h M e y y y e D h g ", "2 0 c I A C 2 o G a a e c t f ) L t [ ' e p { #.$.n n T =...v.n n T #.&.0 e 0 0 y 0 0 0 S ..>.M M O 7.7.7.7.f &.#.X ].].8.8.8.8.O ,...}.6.9.|.+.=.v a.a.a.a.a.a.v f...+.D b.b.0.;.+...~.~.>.&.1.~ 3.,.6.T &...$.Y ~.~.>.&.n 1 i 5.3.,.6.T &...$.Y ~.~.>.&.j | j z B { z ~ ( E 9 / ^ > ^ 9 = * c * ~ ! / ' ' % f e y # D > } + ; E h N F i 1 F < 2 o ~ f g h 1 i i h 4 o 3 7 _ ^ K D 8 g D D O O 4 2 n # 1 A g D h ] ", "h 1 ' _ F i F ^ e e y g $ a D / E % ] g 9 * ' /.+.T n n e.=.T n n ..=...n 0 T |.).|.).|.Y =.>.M O &.#.&.>.7.].%.&.O ].f e...v.T >.&.=.).9.6.}.$.S a.0.f ).|.f a.a.c ..=.O a.b.~.0.v.+.~.~.>.+.Z - m...%.&.%.>.>.O ~.0.,.#.c 4 2 x m...%.&.%.>.>.O ~.0.,.#.| d H ! t ! * a ! = * / a { B ) % % x 4 4 g , y 4 D g ' ' J 1 , / # p . 7 D N 0 A F F < 2 o h h 1 N C F K A 5 3 8 7 ] ] [ ) D # D O O P ] < # # 1 4 i ] i ", "h h % ] 1 P 1 h J e f ] K h 1 ' % A A ] ^ $ % _ 3.,.n n U ..n n v =...=.0 e T ).|.}.|.=.&.#.>.M O ..=.#.Y 7.7.).*.D ].].>.Y o.@.+.*.&.}.6.9.).#.P 0.O ..#.+.&.O a.a.v.#.D b.O a.b.].v.~.~.>.&.. * . #.&.*.).~.~.~.~.. &.z.f F 2 g . #.&.*.).~.~.~.~.. &.z.+ * 2 ) { n a B U U Q S Z k { * $ ~ z ~ s f # D D 4 g ' a ' A 2 g y n x : - @ < F < F N 0 < h D P P N i ' 2 4 ] _ 8 o 0 ! % p c O F P h J # K , 1 1 A A 4 ", ", ] _ g h 1 , D K f ) ] 1 1 1 ' J g ] g - q = p 5.#.n n n ).n n ,...t.&.n 0 e 0 y 0 S ..[.&.>.M M O D O D 7.O ..+.S ].].].8.8.].>.&.*.).9.6.|.+.0.9.>.+.s.k ..>.a.a.|.+.O a.>.S b.b.].b.~.>.+.>.. X #.v.+.|.>.>.. ~.~.O &.|.X T k X #.v.+.|.>.>.. ~.~.O &.s.k U .w.[.w.w.[.l.M.Z z j j j N.z _._.O.O.y.{ o @ ) ) ) a o { $ g ' e 9 % . A P N F N i A 9 , P 1 K D D 9 ^ ] A o c D 8 C 2 @ D P i D y y f E K E / ] 9 ", "1 g ; ^ 1 D , J h ' ' h D # 1 ] g ' 4 ; = } = 3 { ..U n n n n n ..}.o.=.e n T |.).|.).*.&.*.>.M M O D D 7.v =.+.@.+.v.T >.f 8.8.8.S &.}.8.6.}.$.6.0.. $.^.,.=.c a.a.,...O a.>.&.m.a.b.b.b.>.&.X v 3.X m.&.=.&.+.&.O b.a.%.=.+.@.#.3.X m.&.=.&.+.&.O b.a.%.{.P.Q.R.S.g.y.j > T.T.T.U.V.W.X.X.X.Y.Z.`.`.H W.q +s 9 9 p x . ! c n c 2 8 / * 8 < 0 C C M < 7 ] 1 h .+P h 8 u 8 I 2 7 _ F o 0 h A 8 o M h # H > > 9 ] ] ", "] % % g 1 h ] 9 e e ) J J h h ^ ] g - ] ] ' _ _ _ f.,.n n n n Y +.{ %...n 0 S ..#.+.*.&.%.&.>.M O ..v.O 7.>.&.*.+.>.%.&.+.&.v.8.8.U #.).8.6.).#.>.0.0.m.&.=.U 9.a.M #.=.D a.>.+.$.c a.b.b.>.+.L.X #.f ~.P U ).|.S 0.a.b.,.v.f v =.#.f ~.P U ).|.S 0.a.b.,.++@+_.z H #+U.U.`.> `.H `.H W.| N. +S.O. +y.j T.T.| S.R . * * ! * a c n x ~ @ g _ : D F 0 0 D 1 7 ] 4 1 1 P 4 o x I f = 5 o o @ O i @ o O D D J E ] ^ ^ ] ", "& = ' h 1 K ^ [ , a d t e 1 / H 9 [ 9 ] i & $+@ 9 X ..n n n n &.f.{ ..+.e n 0 e 0 y 0 0 S #.>.M M =.#.S 7.7.|.+.@.O ].O D O O 8.M p.$.}.8.8.}.$.v.P 0.0.a.0.9.a.7.%.$.#.O a.>.&.#.&.c a.b.>.&.3.f.,.].a.~.b.b.b.b.a.b.>.&.>.a.a.).,.].a.~.b.b.b.b.a.b.>.&.%+M.m r.r./.W &+/.&+(.z H Z.X.X.X.*+*+Y.=+ +S. +V.T.T.`.z l . . x . * c c 3 2 ' 1 ] & 3 2 I 8 > [ = A i D 1 P y a n o 9 3 3 2 F i h D M 0 C C x - : [ ^ ] ", "= t ) ] [ - L L / f $ / D D / / g h D % . q + % ' S *.T n n T @.%.{ +.,.n 0 n n e n e n T $.m.M . v.+.,.O M f ,.v.T v O D D D c E.=.#.X O O Y +.+.$.m.O 9.0.O U #.$.#.v.. M >.+.3...Y O D >.+.=.#.&...,.v O 0.a.6.c ;.&.*.%.0.].v.&...,.v O 0.a.6.c ;.&.*.u.Y -+M.Y l.-+M.J.J.&+r.r.j | V.X.;+;+;+;+;+=+$+g.I.K.H T.z @+@+/.. . m . c o p g ' p u u u F ] 2 5 8 ] h 1 h D @ c x p $ E ] g < @ P y D I o u u C ] K ] ", "] ^ H H - s d t ] g 1 1 h ' ] 9 e # 9 = 6 | 7 _ A W &.*.&...$.+.%.{ ..+.=.&.=.+.+.+.+.+.v.#.&.=.&.+.@.+...*.&.#.+.*.=...+.&.&...=.3.$.#.&...=... .f.&...&.#.&.#.f.v *.+.&.*.&.*.3.+.&.@.+.&.*.+.3.3.3.#.=...$.+.....+.3.n.&.=...+.3.3.#.=...$.+.....+.3.n.>+z z M.,+,+u.u.M.&+'+r._.z y.z H `.X.;+;+=+=+W.S.-+)+!+,+j T.`.@+Y (.l ~+b I c # 4 2 x u 8 A % A 2 _ ] ] , < 1 ] y / * = _ 1 ' K N O .+K u I 0 , 2 F F i ", "i A E [ _ 7 = [ ^ ] < D 1 % g J e f _ $ & } = } 7 { S S S S Q Q m.. S Q W W W Q S S Q n.+.$.5.Q W R T Q Q Q Q W X z { S S S W Z $ Z W .S w.X w.{ 9 . W Q W W >.* . 5.L.%+3.{+3.A.3.=.p.f.f.f.p.%.%+p.n.*.=.A.,.V 2.,.e ]+G V [.E.#.=.f.1.t.v.3.=.$.+.+.$.t.Y H T.} s z m j z j ~ z j | L d t H W.=+=+X.=+N.S.S.!+>+!+^+(.U.m u.'.'.z r c 0 C I 6 ; ] ] % ] h g ] 9 % K # ' ' , g } 7 1 ] g O h # M I x C D o 0 F ] ", ", 1 1 ] [ $ ' $ / K g ] % ] D 2 c a c _ 7 - ( = 8 % K 1 E [ d | 7 ^ ^ 7 _ _ g , ] ^ [ ^ > E ^ | d E } 7 H H } - } A A K ] ^ & / ) ) < 0 ' ! & : c ] H } ^ * * * { S %+p.A./+u.,+Y ++(+++M.M.H.T }.Y R ++M.X M..+]+<.<..+y G d.X X [.Y 5.%.;.V a y <.$.k.^.u.M.W Z s T._+_+_+T._+U.*+U.T.U.`.j t `.U.X.X.X.X.W.g.>+u.X M.P.,+z H -+m./.R v % u C [ } g ] / g ' < h @ = _ h D ' ' ] ] 7 7 } , D K h < P 4 A 0 u 0 g g ", "< 1 K > ] ) f e e e ) = p < 1 ] x c x ; ~ ( 7 / c p g g ^ & 7 H H g 7 } _ f a e _ 8 E > E H | } j ) * / / E ^ / p 8 < i 8 - [ A f g # y f . - : A g 9 E $ ) ) k ++p.2.t.Y J.Y -.L.(+X W r.r.'+U U S '+K.Q J.i.F.{ <.d.n n d. .X W W H.d.B .B x m.%.:+G.1.L.L.M.z H.Q H _+`./ `.[ <+T._+_+T.L W.H T.T.X.X.Y.| $+!+u.>.>.Z +@+-+M.!+P.-+@+z o ] E } = } > % E K # J 9 7 _ g 0 _ ' ] ] } } h 1 , K 8 D # / 0 y 0 i K ", "h 1 1 K ] 9 / e a y * / ' ] i D / ! | ( & _ _ 9 9 ^ g s $ _ A ] ] 9 = _ ] # ) e @ 3 9 ] ] [ % ' L d ) a ) $ / e ' 1 D h _ = E i D # D ' ! | 6 % , g g @ / ) U L.p.)+4.@+Y 1.4.[+W Q X &+r.(.U S S S S Q @+M.Z h U 5.d.s. .S Y X W X T Z S T ` '+++++:+v.i.t.L.i.-.j (./.m T.H j s m `.T.U.U.U.`.j *+T.T.X.W.y.(+P.u.>.{ { . z r O.I.!+P.S.z & 8 i _ ( = g ^ s 9 , D 1 7 : 8 A ] ] ^ = } } ] % D h o M h h O # 4 F P ", "< D h h g ] p p D _ = ] ] 1 D , $ ~ | : _ 8 o 2 4 7 / t ; 8 i K ^ 7 = i i h 1 y y a ) g A ] 4 < D $ / e f f p < J # # h K > F ' h y > 7 ~ ; ; A 1 g e f * Q p.A.3.4.K.(+-.[+ .s.Z U Z m &+s. .(.d. .S Q }.i.{ s S ).W w.[.X X M.X X X S ` '+Y u.}.f.A.>+I.t.t.I.,+%+r.H Z r.U.H H r.'.+ <+7 `.#+t L U._+T.| W.O.P.Q.U k . x % ~ b r _.,+-+ +( 3 ] g ; x 9 H t = 9 < K K % - = ] _ % % _ 7 ; _ 1 h 4 u C O N O E ] 1 ", "F < g ' D , = * p 9 ^ _ ] h ' & ~ = f * ; _ 8 $ a 8 f / 7 8 8 ( $ p < 1 i i 1 h D e / * i 1 i h D e ) ) e / ] # # D D # D ] [ ' e c = ( & ; ; ] ] g f { X >+A.=.4.Q W X M.w.d.{ e y w k (.m B n n n U S X f.4.@+T }.X Y X X [.W W R X ` ` %.L.A.}+u.m.m.{ l m.Q.,+u.^+u.j j #+l _.`.z m l j j H H H `.U._+*+V.X. +|+Q (.{ * p 2 x ~ + l '+++m = 4 o 5 6 [ c f ) } % % A i 9 = d E _ 7 3 7 7 ] ] F C I o 0 O e f h K ", "i ] 4 g F A | | _ _ 8 _ ^ [ ( - = _ p ! ; 7 _ 7 % A g 9 _ - q 6 h A C D < > ' > t e ^ $ D < g g ' a a a ' A i # @ O D h < f 9 ' ) x & ( & 6 7 ] c x . R >+p.3.4.Q Q d.U w.s.a a y n y 1+y 7.# a e M y n >.%.A.p.2+}.X X X X [+X X Q T ` c.p.#.3+++. f x . . ! ! (.Y P.I.2+'+#+H u.u._.`.j Q _.z $+`.`.U.#+U.*+Y.=+g.)+R (.v * ' h g 7 + b x x p ' I I I & 5 7 - - x 2 A ] K A ( : = 7 % _ = A A C u n f M 1 K e ) f ", "] ] 2 o 2 2 5 & 9 7 | - H ~ q x = _ _ 8 6 6 ^ A ] g ] _ ( ( & ] i p x ' h > , 1 / t $ / y g _ ^ E e a y 9 H , D D D y ] 4 A = x B - & ; & ~ 3 _ * l (.t.p.*.(+J.{ s.d.k B n a # 1+1+M 1+M 1+M k y M M e v T v.f.,.T X [.[.5.5.X Q W '+` t.3.2+Q * f p * ! + z . * { m.u.,+t.m T.r.H.P.p._.W I._.| Z.`.U.& } H V.W.y.^+A.%.Z (.k ' i g 3 ~ & x I 4 8 5 8 ; 4 } _ 8 u I 8 ] g o 8 _ - ^ 7 ; _ A ] 4 < y e < < % ) H , ", "] ^ F @ @ D o u % } * d | $+( x _ ; 7 6 6 5 ] 5 C f $ ~ $+g ' 5 O ' , p ] 1 i 1 K = 9 9 > > A o 8 e G y # a ) # P P 1 F F _ = * z + - } ~ . a a k z }.i.{+t.@+w.V j.4+w d.G y y 1+1+1+1+M M M n y y e n { n w V 5+v S U Y [.6+l.X X '+}.:.7+>+Z a c E , i 4 6 + + 3 - l R.P.,+H H . l ,+2+(+I.M.z T.Z.U.<+j j V.$+V.@+u.!+L./.(.. = ] g 9 _ 8 A 8 o i % * / E % ] 5 8 8 - , A A ] ^ ^ ] _ _ % ' e ' y D i g % = E > ", "] ' J h # D 0 c } t c ( ( | } - 7 + - 7 _ g < C u b ~ = g ] J ^ 1 # h = g < < K g ' ] i < ' 0 2 4 D y y y @ # y , 1 h i 5 3 * j +. s ( ~ a k { z '+>+f.3.++J.(+U n 8+F. .V G 1+M 1+9+1+1+1+I M 0 ) a e n G G 5+n G v d.X X X <.X <.Y B.E.3.A.S a : = 9 1 F C A 6 ~ 7 & +R./+-+#+: . ~+,+^+^+J.M.U.U.Y.U.H W.V.Y.Y.V._.Y A.t.Q . ~ ~ 7 ^ _ _ - d 2 4 e * H H H K i D A $ t > 1 1 [ [ 1 4 5 5 c ) ' # < A 9 9 i ^ d ", "] h ' g h 0 ] / = 9 % 6 ~ } 7 j + - _ 9 ] ] 1 ] - z ) ' ] 8 p ] [ > $ @ # < F A A D ] ] y e e 4 D F 0 0 2 C i D h h i _ 8 3 . +$+d j } * a a z _.,+t.X 2.-+X S k V w { g G w x.1+1+9+9+1+1+1+0 M n n n n n .w d.d.d.U X w. .Q |.o.p.E.0+=.3+m.e n a # i i 2 g ] & & 7 ~ _.Q.^+H b . b ` a+!+++(+d U.Y.U.`.L V.| Y.<+*+} r.>+u.l . j ~ ! 7 E E > @ # ' d $+W.[ K 1 N C g ! > h K ^ A i 4 u I x y K f 9 _ % } ^ } ~ ", "] ] ] _ ' g p f - ^ _ $ * | j + ; 9 _ A ] ^ ] _ x 6 / ] c : ^ < _ H t ) # i g 9 ] ] ) t , _ B $ < < e I o @ F F i 1 A 7 ^ ; +z ~ j { * c B t z J.,+p.4.%+H.W k n { z.W . .V x.1+M 9+b+9+1+M y n e e 0 n s.S w.V d.d. .S U S S U o.E...v.=.I.Z a G y e o g ' ] 9 p | ~ s ~ +R.u.b o I s J.^+|+L._.c+U.`.T.L `.U.V.*+U.U.U.r.^+'+m . . s = ) H } ^ ' ] } N.j H 1 1 i i K [ g < 1 ] g g 8 5 < # ' / f ' / % & d 7 ^ ", "g ^ = x _ / f $ 7 _ 5 8 ~ W.~ & _ ] ] ] _ & 7 A c c ' 3 ; 3 c ) = [ _ 2 x I f ] i ' t f > } f # J < < o C F 4 4 C F A 8 3 6 + + ~ = ) : c ) { _.P.%.%+I./+M.X v e c G.=.6+d+w 1+9+9+]+9+]+9+a k k { n d. . .w.[.V 5+5+T d.s.V X S o.p.=...2+I.V a a y p o ^ ' p = = & . ~ & q q P.v * * % l P.P./+@+~ T.T._+H `.V.`.<+*+U.*+`.(+++Z . ~ ! ' / - - = t $ | $+$+7 < > < F h g f @ D h h , 8 F < f ' g ] g % 7 & j ; 8 ", "% 7 - - _ _ - [ 7 % 3 ; & | 7 : 9 & ] % ( + 7 ] 8 g g ~ E 7 s a f E $ $ f x 5 F h K H E 9 = % i , D 4 C i i < 4 C C F 5 o % f 3 7 % = ^ = . m R./+>+X w.I.M.Y (.y y d.5.o.G M ]+j.j.b+9+]+6.a k >.d.s. . .X X w.w 5+S d.d.S <.<.5.R ,.=.:+f.W k G y / 2 ^ ' f : * % ; j | ( ( q '+'+6 x 8 = K.-+I.W z _+_+T.U.t Z.X.*+Z.U.U.U.z a+K.z . : 4 % 6 ( | j d W.| | 4 i F C 5 @ @ e c e 0 N 1 h 4 @ g ] ] 9 ^ _ ^ - * - $ ", "% } } ^ = = } % 7 f ) - * % = ; / 3 ; ( ( } ^ ] ] ] ^ ; x | V.t ) H j | } _ u C F ] / L d _ [ 1 > @ 4 4 ] ] h D D F C 5 x 0 c 2 ] p / / ! ~ Z ^+^+i.k s.X (+++Z c y M M M 1+9+b+q.j.!.9+9+1+e d.n B w S .X X S d.S 5+d.5+V <.5.,.Y %.#.e+p.Z a ) $ : % 7 $ $ : ! % ; | $+( + ( l Q.- - p p z ++-.(+Z U._+T.T.m m =+Y.U.#+U.U.U.-+>+m.. : 4 3 * 6 + W.$ _ H } 1 i F 2 0 y @ u C 4 o 2 h J e e c _ 9 9 = % _ * * $ % ", "= 7 7 : } _ } ! % a = ; : * : ; _ & 6 & } ] ] ] ] ] * ! : E E ^ t j W.j > C C F i , E H ^ < > > E 9 K > ^ A C P P 1 4 o n 0 2 4 ] % ' ) B m H.)+^+I.y 1+U u.,+J.{ c 0 M 1+9+9+9+q.q.!.9+1+e G k k n n s.S 5.T V T 5+d.5+5.w.5.k W t.X n...f+K.{ * 6 % * - ) : - s ~ u } ( + . + z R.q ( ( % x @+4.^.m.& T.T.T.m &+N.=+V.U.U.T.T.`.^+Y >.: 3 = p x j ~ $ ' K 7 g D < A f ' 2 C F g 3 A h 1 < 0 0 ] 4 A 4 o = f a a e ", "% % 7 ! t 7 & = / * & = = { : ; & - 6 _ 7 ] g _ ] 7 q { f 9 9 & H N.W.j ] 1 O P C 8 H V.> , D K K K ] _ % 8 4 1 h # D ' e e o C 8 2 = x * l %.2+>+/.y 9+1+B I.,+j B 0 x.1+1+1+1+b+b+b+9+y 0 B d.n e n k w.5.V V 5+w d.V X [.U k L.{.t.t.{+{+,+. * . ! ! ) B ) & & 6 8 & 6 6 - z z + ~ ~ ~ 9 = U u.>+H.z _+_+_+H r._.=+=+Y.T.U._+T.y.%+/.. ! _ 9 p - - f , i A 3 f f _ ; } i 0 A o 2 4 D 1 1 o 2 ] 5 u o * ) e a G e ", "5 6 7 * a ; 7 p f x . $ - ! ; & - } 8 ^ _ ] & - = ~ z z c f $ ; [ L d } A O D F C A E H K K 1 i K 1 ] } ] < P < D h 1 ' ] ' C i 4 = - * x >.)+>+>+U M 1+j.1+X ^+_.a e 0 1+1+M 1+1+9+9+1+x.y B U { n B k w.X .w d.d.V ).V d.# l.f.R t.I.p.{+g+s.a a * a ) $ * 7 ; 6 ; 6 u c x j ~ & = * c ' o . Y 4.>+l T.T._+U.Z &+=+=+=+U.U.T._+U./+}.l . g ' / ^ _ % ] g g : ; % % * : h / g ] 2 4 P 1 h ' ] ] A I B c ' 9 ) e y ", "6 ~ ; = ; & _ / p 6 ; 7 & ~ ; & 8 _ _ _ [ & - ; t j $+r { * a 7 [ $ j ~ 9 2 u N C 4 1 1 h < h F _ K ] K F 1 1 # F 1 i , E K ' A ] E | x { S !+>+u.n M 9+b+b+e }.P.m n 0 x.M M 1+M y x.e n y k U U .d.S w. .w w s.h+5.5+n e [.|.L.R ++L.I.|+3+l.a ) ) G a { t ! 6 8 6 5 A 8 . { t ^ _ % 8 4 u 8 Z 4.I.M.U.U._+i+#+&+O.=+=+*+T.U.U.T.m )+R v 9 g p p , ] ^ g ' * ~ _ _ f * E 8 A A I 7 [ ^ K ] > & 7 o a ) H t t ' # ", "} ! 6 : - } 9 - & 6 ; } ( x 6 ; 7 _ _ _ ; & % f ) = } ( ! * t = / $ s } 2 u F C o C 1 P 1 g D i A ] K g g h ' D 1 ] [ & ^ h g 2 ] A ~ c . ++>+>+-+a M 1+9+9+].Z %+M.B B n x.y 1+N 0 B n B k s.S .w.V w.M.Q .S D.V 5+y G ).Q X 1.++R t.-+t.f+>+. t a * t * { $ ) p [ = _ } d L 9 } [ ^ ] @ x f { g.-+i.L U._+_+_+m g.=+=+=+`.T.U.`.U./+u.(.* * g g D h ] 9 ] [ | ~ ^ E H } > g 4 g - } K 1 1 H } & 4 a ) % - j E D ", "} 7 5 6 = ^ 9 7 & = = ! - & 6 7 ^ _ _ _ & 7 ^ p t } ; ( * * * f % = . = I 5 ] 5 o < h O g g < ] : i 1 1 @ ' ' 1 i ] 7 | ^ # p g g 4 . * . %.>+>+W { y M y 0 6.c Q a+V B k s.w 0 0 n d.U W j+W W . .j+[.W Q [+[. .w e 5+).U Q X ++%.R u.++u.3+3+K.$ = s * a x f a f H c : H t } K [ } & ^ ' $ $ H +-+I.Y _+T._+_+#+W y.$+=+=+T.U.`.U.&+2+'+m . 8 % e # D e 9 A = j $ } 9 p ) D 8 3 7 _ i 1 1 > E E t p f % 8 | > , ", "^ _ 7 6 A g _ - & 7 & ~ { ~ 7 _ = = % x & - p ' = _ u 6 x p 3 8 7 ! ~ = @ ] C I F 1 P F ( g , 7 g < i } 8 g 1 ] 9 p c x ; 6 3 f 2 = { * (.>+t.L.U n n v l n c 7.' u.B.5.B k j+S S S U s.s.U /. .s.S W W W X k 1+1+M G V Y T S R X L.H.H.%.l.A.7+^+x : . x c f e e e g : * / H } [ _ - ~ ] g ! - 7 ( S.++)+U.T.T._+_+t @+y.$+$+W.U.`.*+L |+u.'.{ $ _ ] J > 9 H ^ ' $ x % ] @ 3 _ ; _ 7 i 4 h i 1 > H | ^ c ' A ] ] ^ ", "^ } & ^ 4 ] - ! & : ! | ! ! $ % } $ 3 x 7 * g / 9 ] A _ _ ] 8 u ; & ~ 8 8 < C C @ , J + ~ ] ' 7 1 1 ] } F i ] p a c I I b 6 7 c o ~ { * X >+>+L.>.k k <.L.S B { .+) S l.S n n B k m k U U >.m s. .j+ .W Q 4.1+1+1+y s.X X T W S W u.H.` B.[.n.p.2+. x - { p % f e n 9 7 8 g ^ 7 } 7 f $ 7 $ * ; _ } +u.I./._+T._+_+_+r. +q N.W.*+U.*+*+/+^+X { ! p p , K g } > e / o A 2 x 8 : * 7 g i h < < ' > ! $ 9 c i 1 A 6 ; ", "_ 7 : g g = & = ; - ! ! & } p ^ % / = _ _ } 8 8 8 g ] 8 A ] _ u 6 - ; g O h F O A F % + $ 9 p _ 1 [ % 5 8 ] ^ % % 7 ! x I 6 7 g % ~ ! . u.2+>+h.s.k Q -.t.f.l./.Z c l /+X B n n B n B B k B B k . .W s.w.l.4+y G U S X X S T S '+Y ++` |.<.i.)+>+z j . g % 9 % ^ / _ ( o x = 7 7 _ f $ 7 = ) o 4 = z Q.u.g+_+_+_+_+_+U._.y.$+=+X.*+T.*+r.a+J.>.! p % g g _ } / f , $ 2 I I 8 6 ^ _ A 1 O .+1 f $ = f < C C i A u 8 ", "% ; x p ; & 7 - ! 6 | ! ! = % _ p % _ 7 _ - 6 o A A ^ 4 A ] % + u ; _ A 1 ] 4 = = ^ | | H 9 _ : 8 g 1 8 u ] / 9 _ 9 ! a ~ * s : ~ z . '+%+A.>+h. .Z J.^+..=.z.,.X W @+p.J.Z Z >.k U U k B B a k . .S W [.<.y . .S S W X X S Q S X %.` H.,.t.A.t.m.. ! _ g ' g ] ' g % : $ } 7 _ _ 8 3 * * / 4 ] ^ 6 R.u.>+&+_+_+_+_+_+j +q =+=+X.*+*+H |+H.Z ! = g ' > 4 ! E K h 1 $ I u ; 6 7 _ ] h .+h P 4 F J ' @ # < ] ] ^ 3 ", "6 x o . 6 & 7 & ( ~ & & : p _ _ _ _ % 7 _ : % o 3 8 A C o A p . 6 7 A C ] 8 ! d ^ d W.H ] 6 ( ~ I A h A 2 9 p f % / 9 ) a B ) * . m.m.u.f.p./+(+Z r.g.S #.:+..f.3.Y M.%+m.Z U &+/.Q s.Z k k U k U W W W X [+ . .W S S U V X S S Q Y ++'+'+e.%+{+>+u.r . % g h g ] p 7 _ * f % ^ % 3 _ ; : % _ ^ 7 _ 7 +u.,+%+j _+_+_+_+_+N. +q =+X.*+*+V.-.^+Z . c ' g _ o c E f D D e o ( ( 6 } 3 4 h 1 K 1 ' F , i N D 1 < D g f ", "6 u ~ ! . ; ; - & & ~ & ; _ _ ^ _ 7 _ 8 8 6 8 5 5 x 8 I C o c . I ; i 4 2 0 * ) g } 7 K i 5 ; 6 5 ] ' / 2 ' % p / ^ [ $ a a a k Y Y L.A.3.p.-.(+X r.-+U H.p.:+..3.3.p.{.m.U (.U Z U d.k k U /. .S X W M.X X <.k r.M.5+T ;.X S 5+S X }.R.` u.i.n.3.)+u.l * ) 4 A g * ~ & _ 2 g _ % _ ; 6 x x 3 _ f * d z u.u.)+M.L _+_+_+_+T.y.q =+W.X.T.*+N.i.R l * 9 ^ 5 5 7 - a y / e * W.+ * } & 8 D ] 1 P 4 N K 1 1 g F # e e e ", "! % ) x b 8 7 & ( ~ | | _ _ % _ _ _ _ _ _ ; : F g ) ' 8 F x c ~ ; 4 P O ] 5 5 n o 7 g 1 1 ] i u 7 > , g 9 = ^ @ A _ d t * . R ,+>+3.=.f.=.%+-.W W -+W X ` e.:+e+..3.3.=.,.X S U k k k U .j+W X X X W W M.(+{.l g.3.=.:+v.X S V k+T Y ++` R f.f.,.t.3+^+S k x c 4 @ ) = 8 ] ^ ^ 3 6 ; x x x . @ f { j y.^+-.I.a+r.m `._+T._+U.y.$+W.=+T.*+V.^+P.Z k $ % 8 A 8 7 f E E H H | W.+ d j * t ] K i i 7 ; ] g < i ' e y { ", "a e ) * n * - & & | & 7 9 % / % _ 8 5 ; 7 & c 1 1 / h 1 g I ! t $ K P < 4 ' g o o $ / K ] F C _ K ^ ^ g 9 7 _ _ : ~ z t Z P.u.h+d+[.Y R.3.[+(+&+R ,+U ++` &...:+......*.#...=.v.C.<.l.5.5.W X X Y Y X M.L.n.i.i.$.....#.:.W X 5.V ` ` Q.'+'+t.2.f.l.-.p.!+}.m.l . c / ) @ ] ] ] A 8 A ; 5 I c 8 5 I 6 + +!+P.)+I.M.r.m i+_+_+U.y.W.W.*+T.*+r.>+/.l ! = _ % o 5 & [ > H H - - j d t p @ < 1 i F % 8 ] , 4 2 K y D * ", "e e t a . ! | - s s ! 9 f f ) p 3 I 6 8 + 6 % K K ^ g K ] : } E g 1 h F 4 = 3 . . $ } [ K i C A ] h 9 ] ] _ 7 d - ! m H.P.5.d+ . .}.Y R.v.W (+&+r.R k ++H.=.=.@.e+#.#.f+*.*.*.3.#.*.v.2.<.X |.<.t.E.=.....*.#...........v.S w.X V ` ` Q.` ` c.3.2.<.<.h.:.2.2+R Z (.. % c * 9 g A i 8 o u I * 8 4 ; x * q S.f+,+g+S.H r.r.`._+_+`.$+W.=+*+*+W.a+Y (.z ! $ _ 7 7 + u A @ ' _ ' t ! | : 0 0 < i F E ] 1 1 A f f ' f < ", "g 9 = / g p ! s { s * f f a e a x x o 6 ~ ; _ K K ] ] h ] p } > K > K 4 4 ; x r n = [ F ] g F C 1 g g g ^ / s t j _.u.Y d+w w d.S |.}.^+t.Y l./.s.>.n }.B.)+=.@.@...*.3.f+f+{+}+#.#.#.3.3.*.=...&...@.}+#...:+..=.3.#.#.=.n .X V T ~+R.R.` }.e.G.C.D.h.D.C.:.3.%+u.'.. ! * . * % c I I I . L t g ^ $ ! x +P.3+f+@+j T.H r.t T.T.N.W.W.W.U.*+-+/+S l ~ - 7 9 ] o x 8 4 , ] ' 9 7 H $ @ ' h A 7 t / # i ] g f ' 2 4 ", "i _ / ' J _ - { ! 6 9 _ g f ) p % c x | 7 % 7 [ ] ] ] g g g g K ^ A ^ ] ] ^ 8 5 o . 8 8 o 2 C C f A ' ' E _ - l R.u.<.l+w d.d.S |.I.-+>+<.4.W Z d.n k >+!+>+)+3.@...:+....#.=.............}+{+}+*...m+e+:+:+..*.3+2+|+{+G.B U w.d+` ~+` R.` T e.G.:.C.h.<.<.;.C.,.3+!+I.Q '.r . x I b I 8 ! c t t H f c x x +P.!+L.`.t _+T.j L i+r.W.W.W.V.`.y./+J.r.l - _ E _ _ } ( 9 K g ] ] = t j * 2 p 3 @ > $ c # # 4 3 $ g ^ ", "< g > ' ^ = = / f _ _ _ ] 7 = t * * 6 : _ : } } ^ ] ] ] g , E > , F 1 h i A 4 o I { 5 5 8 3 u u 2 ] , ' p j @+u.I.3+h+d.d.5+X u.u.I.P.)+h.-.W S U n y S u.!+,+I.,+,+%+#.....+.i.v.3.#...n+......:+:+o+:+....*.*.)+^+^+{+0+B k [.V 5+~+` R.` '+h.G.G.<.<.%.%.{.{.C.h.,.3.3+,+'+'.. I I . e a a 9 H , ^ 8 x x + @+P.^+m H U._+T.H T.r.N.W.W.W.*+W.^+^+'+l + _ _ 7 [ } & ] > , ] ^ } j d f 0 / E ] % 7 } # h i 6 J > H ", "' > i ^ d a f ' g % = _ ^ ; * * c ~ . $ ; ; 7 } ^ ] i < @ ' / , J h h D 1 A i < < i o p _ _ ^ _ _ ] p + +R.u.p.G.S d.d.V {.4.,+t.)+!+{+{.h.W W S v y y S %+>+-+H.@+'.H.1.i.*.3.,.t.,.%+%+t.)+3.{+A.f.=.#.A.X @+^+'.J.f+..B k [.S ).~+` R.` '+}.2.,.<.%.1.{.%.<.<.<.<.D.,.v.3+^+H.'.r c $ t a f ^ , ^ 7 & 6 + l @+Q.(+U.i+_+_+U.#+T.N.W.W.W.W.W.@+)+H.r.z ~ ; } - $ ^ i i 1 K % H | H 3 4 g K A 8 H $ h 1 / . ' ^ 9 ", "g D ' % t ) ) ' e x = _ ; - * % ! ( ! = 7 ; 7 = 9 ] 1 D e y h K / D y e D ] 1 , 1 @ p a f 7 } 7 = % ~ J.P.L.3.p+d.d.d.k+%.;.L.3.!+f+f+#.h.[+W W S U k e e [.{.L.-+R.R R %+u.H.,+(+u.u.I.P.u.u.,+Q.>+^+H.l '+-+P.)+P.S.3+$.y d.w.S X ` ` ` ` J.g.i.v.<.{.%.h.%.%.<.%.}.l.D.|.<.B.p.)+>+-+@+r.p g g ^ ^ _ } ~ ! ~ l R.-+(+H _+_+_+_+_+H W.W.W.W.W.W./+>+'+Z z + x = H ] ] i 1 J [ H | o F 1 , 1 ] 4 ! J # g $ . 9 g J ", "] i o { a E ' ' f x 3 7 ! ! % * s ~ 7 7 7 7 [ 9 9 ' 1 , a y .+1 ' # D y @ i ] 3 4 f % f a _ 7 ; ! . l ,+A.v.d+d.d.G d.d.5.4.%.{+..:+..#.C.W S W s.s.s.k y G L.P.,+R.-+L.a+3+Y @+'+O.@+S.@+-+-+-+S.R.'.l l @+>+P.@+O.O.3+<.B k X T X ` ~+R.'+g.g.i.z.0+;.;.<.D.o.{.D.<.C.D.5.5.5.5.h.i.n.3.,+. @ 9 $ H [ _ & j . { { /.++/+`._+_+T._+T.N.W.W.W.W.W.@+f+Q.@+Z l z _ _ ] i F 1 J ^ [ d I C C 1 A 9 L t / t * * { 9 ^ e ", "] ] ; { L H y D f 7 8 9 - = ) { { : 7 f * ^ / ' E ] P D y e # ] D D D O F i i ] 3 9 % c p x x ~ l l '+%.V x.d.d.d.d.d.d.5.|.5.3.:+..#.=.;.s./.w.Q U s.U G a l+I.,+,+H.J.@+R.Q.@+O.O.O.@+@+-+-+-+'+O.O._._._. +-+@+@+-+I.V e n X T '+++` Q.H.H.R /+*.@.=.v.%.<.{.%.%.%.<.D.5.[.d+k+w d+V {.3.Z p p g K > ' o 6 ~ . . v (.M.M.U._+_+_+_+j W.W.W.W.N.W.>+^+g.'+'.$+7 _ ^ 1 1 , 1 ] C u u I I D 9 s H [ - z a ) ! ) ) e ", "_ ^ [ [ ! , K K t 9 p % p * a ~ - = } - % ' ' p g h .+y y y , D 1 O P 4 F 1 g x o % } = $ : . l m.Y [.G l+d.w s.S d.G d.S 6+5.%.o+:+#.e.;.{.W W /.s././. .G G k d.R.>+u.J.O.O.O.'+O.O.z O.R.J.-+R.'+@+l r z _.@+@+-+,.G a e n [.T T ++ +R.'+'+S u.*.e+$...=.,.%.%.C.C.D.6+V s.k+k+k+k+w l.p.>+{ ! $ K > 2 u 3 . + z m.Z m.M.@+*+T._+_+U.W.W.W.W.W.N.y.f+P.R.@+ +| A % ] h E ] g C u 8 u I o * / * 8 % + * a % ) ) 2 ", "7 ^ 9 - ! _ > ] A _ 8 _ f { - ! : p - = ^ 9 $ % 1 1 h .+/ = g # 0 0 x.I O A % 2 - H j - * . '+Y I.%.w D.d.G w V h+d.d.d.d.5.5.Y +.o+#.1.G.w.U W W U j+ .w. .B n ]+D @+1.t.R '+@+O.O.y.j z g.R.g.H.S. +z z l _.@+u.V y M w [. .[.T Y Q.~+R.` T S ++q+e+:+:+e+..n.;.C.C.;.:.d+k+k+l+d+w V %.%+*.R ! $ : ] 0 D 4 - ~ ( r @+m.W (+=+X.*+T._+W.W.W.W.W.y.y.S.|+P.R.@+( ; c ] , g _ ^ 1 1 A 8 3 6 f ] x ; & ( ! 9 A ' A 2 ", "; - / s ~ ! } < @ 8 6 ] E ! ! { 9 f : 8 % ^ } = e # .+h . ) J y 0 0 0 0 o 5 _ @ f p c . l l.t.>+t.%.h+V d.k+[.G.V .G d.G V 5.X f.....v.[.m.S j+j+U s.j+w.w.U k D a Y L.%+J.J.@+S.O.z ~ $ @+R.R.J.@+s j + @+-+<.G ]+1+w h.5.W V X H.R.~+Q.` '+` |.=.:+e+:+..z.=.:.k.r+k.d+d+w l+d+h+5.|.u.++..^+l . + I e y g % . & ~ l /.R M. +;+;+V._+V.W.W.W.W.W.&+$+P.s+f+P. +~ 5 A ' g _ ' 1 1 A 7 7 7 9 9 c x x 6 ; ] ] 7 ^ _ ", "} } = - ~ 6 H > 4 7 & 9 7 ~ ~ 7 p * = p g = 7 H # P i f ' e f 0 I 0 x.i 2 I 3 ] p c { X i.>+>+%+<.s.d.d.5+S <.,.^.5.d.k+d.d.V Y u.m+f.f. .U U Q U &+/./.w.w. .v c [.>+A.L.J.J.@+@+l z p 1+. @+@+@+l . l u.^+ .1+j.y h+l.X W T V V ` '+` 2+` T '+}.z.....@.=.v.0+G.C.D.h+d+w V V 5.}.Y R '.'.t.p.Q.r I I n < 4 5 : : : . Z R (+r.*+;+W._+`.W.W.W.$+j N.r.N.^+3+P.@++ ~ ] g / 9 g 1 1 3 I 4 ] 9 9 / % 7 - 7 4 % 7 K ] ", "f ( & - } - = ] ] 7 7 9 = } d _ ; ; = 3 % 7 } $ 0 g < o 4 f o o M x.y O 4 o i h / k %.3+%+t.=.p+d.d.G l+d.d.5.L.1.;.S k+G w d+5.++#.=.<.<.U Z /./.Z /./.W w./.w n %.f+A.I.M.J.J.r.@+'.- p m O.'+'.~ l Y >.t+]+y V V X l.X S T ` ` T T '+B.}.H.H.Y =.v.r+$.$.0+:.p+[.p+6+[.V [.l.X '+m.'.` ~+H.+.Q.` I ! E h F A ; = 3 . l '+u.M.*+Y.;+`.j W.W.W.$+$+W.| y.y.!+^+R. ++ * g g _ 8 A 7 & & i h ] 8 5 3 } 7 7 3 c ; i ] ", "$ ~ ! 7 6 : 7 ] ^ 7 _ ^ 7 ~ _ 7 ~ $ 8 5 = _ ^ 1 # < i u 5 o 3 0 P J O 1 ] < < < @ %.3+A.1.<.%+ .k+w d.G d.d.S 5.1.;.o. .l+l+d.5.Y n.:+;.S {.Z /./.U /.Q W j+s.>.y t.f+A.++J.J.M.(.r.P.l '+@+'+@+l (.Z w.]+b+n V d.S X V d+d+` ` '.T T '+H.` [.o.c.=.&.=.u+G.p+h+d+h+6+6+5.[.R '.'.m.m.'.` ` ` 7+,+Q.x f 9 E > H [ _ c f x m.Q.,+`.*+X.W.j N.W.W.q q y.Z.+ N.O.!+P.@+{ ! ^ ] _ & + + ( & i i g c x 6 - = 7 } } = ] ] ", "x ~ ; ^ 8 ; : _ % p 3 _ = d ; ; } 8 u 6 _ _ ] i F 2 F 8 8 7 ] 1 N > 1 K ] g 2 @ c I.3.G.5.R I.2+<.V p+h+5+d.d.S 1.1.;.p+d+k+w V X ,.:+@.|.W 5.Z /././.&+W w.S v n )+f+n.M.M.M.K.. _.@+^+^+,+^+l j l Z i.L.y B d.S S S s.5+d+T '.` ` T ` T T }.}.p...$.G.p+h+d+d+p+D.).R m.r r r r '.~+` ` ` ` B.p.l c e / ^ E / , : * = x l J.I.d *+X.W.j O.W.W.=+q +W.<+| y.,+P.K.. * - ^ % ! ~ + ! 2 ] < e $ ; $ = * ! _ _ $ 9 ] ", "5 & % _ 6 6 ( % % / $ = 7 } } 6 8 5 6 8 _ A C F 4 F i _ 6 g > , P P N K ^ * / ! { h.v.G.<.{.p.f.v.C.o.h+d+k+5+d.V <.^.;.p+w d+S h+{...:+:+;.Q W /.Z /.W j+W /.x.S )+{+n.l.-+-+m ~ z z l @+Y Z { t _.@+>+3+a d.U X S 5+V V V V ~+` ` ` ` R.T }.B.2.h.5.V h+h+d+h+X R '.>.'.r r b r r m.` ` ` ` }.f.R c e $ E 9 , < @ * p o . '+I.z X.X.X.W.r.N.=+=+N. +W.U.U.$+g./+@++ * c _ = * s + ) 0 e y y ) $ = = { { a g p g g ", "= 8 8 6 6 b + 6 ' % $ - 7 u u 6 u u x c 2 g # 4 @ i % : 5 ' ] ] P P 1 % : - * a m C.k.E.<.%.2.,.f.v.v+D.h+d+k+d+X /+^.t.C.V 5+h+p+X 2...@...l.Q /.m s./.W Q Q I h+!+=.i.(+++-+/.z z z l r m (.m (.r.R.^+!+B .+>.U T V S V V T ` ` ~+~+Q.c.c.c.[.5.h+d+h+h+h+h+R r b b b r b r r ~+m.'.m.` ` '.` 1.i.. 9 t ^ / ] C 2 c o = x Z ,+@+;+X.X.W.L y.$+N.W.y._.V.U.`.@+)+@+l . - _ _ f a * i y a y h = a s } : ! ! ] % < 9 ", "x 6 _ 7 6 & ( & ] @ s - o 6 6 b u u o c 2 0 e y < ^ ; : ] 1 1 N 1 1 < % { n c B U C.h+:.{.1.f.v.;.v.e.0+h+V d+w 5+<.^.^.G.o. .V p+5.(+*.#.=.3.S s.s. .j+Q W S n 6+>+*.1.(+4.,+M.W '+Z '+m.m.Z r.J.,+>+2+|+X y d.s.X T T V X [.` ` R.2+E.c.5.[.V d+l+l+d+h+Y ` ~+b b b ~+b ~+r r '.'.'.` T '.~+'.B.r+S $ 9 ' A 4 0 2 % - ! c v -+M.X.;+X.W.`.y.N.=+W.m y.W.`.U.V.a+,+J.l 7 9 f ) ' g ] e y i ] % * ! ( ~ - = ^ ^ K K ", "& 7 3 - = & ( ; A @ ~ : 8 _ ; 8 5 6 5 x 0 I ' J h 7 & _ 1 1 K 1 O D f f n n { { w.:.d+k.;.%.t...v.v.=.=.=.:.5.V d+V 1.;.^.^.D.d+p+D.<.#.3.#.3.v.U U /. .W V X n o.P...I.u.,+A.|+>+>+4.++>+t.>+^+P.-+P.Q.|+L.k s.S X X V X 5.G.p.e.e.D.[.V 5+w d+d+w X }.H.~+~+~+b r r b ~+~+~+'.~+r ` '.` '.r ~+++p.i.. p e @ x p 1 ] $ / % . R.-.X.;+X.X.H N.W.=+W.N.y.y.V.X.`.O.)+J.'.! e ) p ' g 9 e ' g # 4 ] 7 | ( ; _ ] ] K g ", ": 2 8 - = 6 = 7 4 _ % 3 8 = _ _ ; 8 I c 0 o D 9 4 : } i 1 1 1 O D D n f c d.X ;.=.w+G.d+<.%.t.=.:.E.v.=.=.v.r+p+V d+6+1.1.^.:.p+h+|.%.*.#.n.*.=.t.v >.W Q Q 5+G o.^+*.P.-+u.3+)+t.}.I.,+Q.Q.R.P.P.!+Q.S.)+%+[. . .X {.|.G.v.:+..v.V 5+s.w 5+5+d+ .l.Y ` ~+~+~+~+` ~+b r r ~+r r b '.'.'.'.'.r b ` %.{+Q { ) g % % < , $ f f x H.!+=+X.;+Z.W.N.W.=+=+W.W.y.W.Z.*+W.a+u.l (.e f ) 9 g ] g @ e y @ @ ; | $+= [ ] ] ] _ ", "4 o * ~ 6 x 8 % o _ 7 _ ; 8 % 7 ! * 2 ) f 2 D ] g _ 8 K < h h D F I e @ U %.,.E.v.G.h+G 5.;.;.=.<.^.f.f.e.C.,.=.G.[.V <.1.,.G.C.D.p+,.f.f.3.$...*.f.T Z /.Z d+G c.p.*.Q.-+u.u.!+)+|.V }.>+!+|+3+!+P.@+@+a+!+B. .S V L.{.v...=.G.6+p+[.5.Q S .[.Y '+R c.` ~+` R.` ~+r r '.r ~+b r r ` '+m.~+b b r H.2+%+. a ' ' ] 4 9 H H ! $ m.!+y.X.X.*+W.V.j =+W.N.W.N.$+X.Z.Z.O.a+m.l * ] % _ ^ F i p ) y h D g ^ ^ } = g g $ ; ", "/ c ) : _ _ 5 _ x x % = ; _ } - 9 % 4 @ f 1 D g % 3 8 ] K h # h 4 4 * { }.3.V w 5+V V w 6+%.;.G.v.;.n.E.E.v.E.C.e.=.B.V 6+1.1.1.C.D.;.;.%.=.e.7+v.=.=.o.m.X 5+k+++{+*.^+-+-+-+-+u.^+)+f+f+3+>+P.J.J.S.O.^+!+p.[.s.X ;.,.v.:+$.D.<.G.C.M.M.M.{.G.|.H.}.}.H.` '+` '.` '.r ~+b b b ~+'.'.'+` '.r b b r u.{+W ) a < A A ] ^ H - c l ^+S.X.X.X.W.=+N.X.X.W.W.N.y.Z.X.X.$+^+R.l m ] _ - % ] K E ) y h ' g i ] } } p ) ) a ", "J 9 g _ ] ] A 9 = o p : 7 9 = _ / ' < h 0 F # ' p 8 ] ^ g , , , / f { >.t.,.G d.x.V V h+<.%.{.<.;.<.D.v.v.v.v.r+G.,.v.=.:.C.t.t.G.:.;.%.{.,.7+,.G.=.:+=.e.o.k+d+c.{+3+a+Q.Q.-+@+l r.J.-+H.-+g.g.J.S.O.O.!+!+i.{.v V %+2.v...@.p+C.=.2.I.[+-.n.n.f.t.B.B.R.Y '+` r ~+'.b b r ~+` r ~+` '+m.'+r b b r ` >+)+{ @ p g ] ] ] 9 ) o { u.P.X.;+X.W.=+N.W.W.X.X.W.y.$+Z.X.=+P.^+m.'.% % 7 7 ] ' a a / ] ] A i 1 [ t s t } * ", "' e ] ] ] ] g ) e n e 3 7 % % ^ ' 9 1 D 0 # ' f p ] 9 ^ ^ ] ] g p . v S f.).d.d.G w V h+<.;.%.{.{.h.%.{.2.3.G.6+0+=.E.o.v.v.C.B.G.^.;.<.{.%.3.p.t.v.=.v.v.m+V :.,+{+>+!+P.-+Y @+z s j m l m z l +O.O.S.P.!+!+R e ).n.q+*.:+..D.;.,.2.a+/+^.:+....#.p.++++H.` ` H.` ~+r ~+'.'+'.~+r R R '.'.r r b r ~+,+{+u.! * 3 9 ^ ^ g c 2 . '+!+=+;+X.=+W.N.W.;+X.X.W.y.y.W.V.W.S.!+r.Z x p : | 7 ' ' 9 ^ [ K ] ] ] - m s | ^ H ", ") e 4 g 9 ] 7 / @ 2 o % _ ^ ^ ] ] F 2 # @ c ' p _ ] ^ ^ , [ 7 % * >.d.X r+d+d.G d.G G d.V 5.5.6+<.).5.5.5.d+p+C.,.$.r+v.v.E.).<.;.;.C.%.{.%.B.B.;.:.,.v.$...G...f+#.3+f+|+t.(+M._.m s s s j j z _.S.Q.,+!+f+A.L.w.o.*.*.:+:+:+C.C.1.^./+/+^.....@.$.G.E.}.'.` '+'+~+` '.'.'.~+r ~+'.'.'.'.r '.r b '.'.Y !+f+_.. x 3 7 8 A o @ . Q )+y.;+;+;+W.N.N.X.;+X.X.$+$+N.*+X.O.a+u.l { p = & - p / 9 7 ^ i K 9 9 H f - 7 ] % ", ") ' ' g ] ] p e a I A _ % 9 ^ ] g 7 9 E h @ A : ] 9 g ] D c s x c d.>.%.:.k+G d.d.G G G d.d.d.d.d.d.d.d.d.d.s.5.V k.:.:.E.G.).).).D.;.;.%.L.}.%.%.;.;.C.G.v.:+v.....#.{+f+*.=.)+I.J.K.@+r.r.J.^+g+=.*.}+{+#.n+..n.@.e+*.*.....0+^./+-.i.C.h+6+C.:.v+0+C.V 6+C.T '+T '.~+~+r r ~+r r r ` ` ` H.~+r H.'+H.t.}+>+R.- 3 7 9 f # a c X a+S.$+;+=+W.N.N.N.=+X.X.X.$+$+j N.y.R.a+m.>.) ; 7 6 * $ E [ 7 ] J e ) f H H } ^ 7 ", "9 ^ ] ] A g e a 0 A A A % / E ^ , D ] , g ' % _ < E 9 F F 2 g g . (./.p.5.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.5+'+S S S 5+ .5.|.|.|.).|.;.h.%.%.I.{.%.1.;.C.D.5.p+=.=...o+..3+{+{+{+3+{+3.)+t.>+n.#.....:+#...o+o+e+e+n+|+p+C.p+C.*.x+C.-.n.C.l+l+l+l+h+C.h+l+d+l+d+h+5+>.5+V h+B.,.c.H.'.` ++t.u.++H.` '.++'+u.!+}+g.. x 7 ] < h p { /.I.-.S.X.X.W.N.N.N.=+X.=+X.=+W.W.$+O. +a+'+v - : ! = - } } = _ ~ ] a ) / = = ^ ] 3 ", "] ^ ^ ^ H ] g $ - _ % / ^ h , > K h @ D , g c 2 i g ^ K _ 8 o _ z m Y 3. .d.k+l+d.d.G d.G k+d.d.5+5+w d.>.d.w d.w .5.).|.).5.{.{.%.%.{.<.%.%.4.4.<.;.,.t.}.p.*.*.o+y+o+..n+#.z+#.....n+..n+e+o+e+e+e+o+o+e+o+n+n.[.p+D.k.2.*.$.G.;.:.G.h+d+l+d+l+l+l+l+5+U 5+k+k+k+k+k+w k+d+h+<.%.Y %.3+e.e.2+u.Q.'+'.R Q.}+^+'+z s 9 K 1 ' * v -+I.M.*+X.W.W.y.N.$+;+X.;+X.Z.W.W.y. +-+,+. . - = 7 ! } E : ; _ ^ 1 h < @ _ ] 9 @ ", "g _ ] 2 p ' ' & } ! . . - > K K , 1 # y , p 3 8 A ^ H ^ A u u = m m.I.A.s.w w k+l+d.w l+k+d+l+k+w d.d.s.d.d.d.d.V 6+|.5.).).{.%.%.{.4.(+c.4.%.%.}.4.f.e.,.p...#.{+n+o+e+o+e+o+o+o+n+o+o+o+o+o+o+:+o+y+e+n.h.V B 8+8+C.n+..e+@.@.2.^.o.D.6+h+h+h+h+d+d+h+l+d+V k+k+k+k+w h+l+l+l+d+d+5.;.,.G.3.3.p.!+3.H.'.R !+3+Q.S.z / 4 ] f { * J.-+M.X.;+X.W.y.N.N.=+;+;+X.Z.W.W.=+ +S.)+l m * g ^ s L E % = % t t > i 1 g ^ ^ g ", "] ] ] 8 C ' p 6 - j v t d } K K t K h J , g 6 u i g g A 8 I ~ $ c >.%+p. .V V k+k+d.w k+w l+d+k+5+>.>.d.d.d.5+p+<.4.5.5.|.%.;.^.-.<.{.%.4.%.t.I.t.n...*.#.3.#.#.{+#.n+o+n+o+n+o+o+o+o+o+o+o+o+o+:+v.<. .k B F.1+s./+e+*.e+e+..=.{.W G.C.h+h+h+h+h+h+h+C.h+d+l+w k+k+k+5+5+k+l+d+l+k+w h+p+6+5.D.,.2+)+=.u.Y %.}+,+R._.. ~ - * * . Z -+M.Y.=+;+W.N.N.N.=+;+;+;+X.Y.W.W.X.y.f+m.j d > g $ s E , ) t $ $ 2 4 1 ' _ 7 $ ", "] ^ ^ g 4 _ $ c ! s ~ s ^ ^ > K [ ] D e ' @ I 5 P J 9 8 u x j - x . u.)+5.h+h+5.[.V h+S V d+ .S m.5+m.5+d.S <.{.o.4.{.%.1.1.1.L.%.%.1.L.L.L.1.A...:+n.2.i./+{+..#.*.o+o+o+o+:+@.=.=.......z.G.V s.B k y 8+w [.-.-.{.{+e+e+e+..*.^.-.1.z.0+C.h+h+V V h+h+h+h+h+V h+h+k+k+5+k+l+d+k+w .w k+d+h+V l.M.i.e.+.f.%.A.!+,+H.l z z + { r '+,+,+X.=+X.W.N.y.N.N.=+X.;+X.$+$+W.N.H a+g.~ } E ^ [ ^ > _ ' 7 7 $ : x ' J [ _ = ", "^ [ [ ^ : - $ ! - ! s t ] E E K A f D h D 4 n O < , % 7 b x d j z (.Y L.f.V h+5.5.5.).5.5.{.|.c.(+l.).l.<.L.%.L.{.%.L./+L.1.1./+-.^.1.1.,.3.3.@.:+=.k.i.i.q+..A.2.#.o+o+n+V G.C.p+ .w a a 4+.+e B w.<.D.h.l.{./+1.%.%+z+e+e+e+:+*.2.q+2.n...:+..=.,.6+5.h+V h+V <.v.6+V '.5+k+w w w w w w l+l+d+w.[.Y }.G.E.v.v.g+{+A.L.++R r.l l '+u.I.X.;+;+W.N._.N.N.W.X.;+;+W.$+W.j t /+P.{ @ % ; } } ^ : ^ 9 d s t a ' ] 9 [ ] ", "H d } & | & & ; : s B 2 , K 1 ^ 5 3 ' D D i y D O i _ 8 6 % = ~ y.&+u.%.n./+[.h+[.5.6+5.5.l.|.|.u.4.{.L.;.1.;.t.%.L.L.L.%.{./+/+g+z.z.&.:+*.=...:+@.=.@.@.A.a+g+i...n+o+#.A.3.A.)+)+w. .[.(+-.<.<.6+<.<.<.h.h.5.;.2.)+{+o+n+....@.g+@.n.2.2.n.=...:+..$.v.G.o.5.V 5.o.).c.}.Y V 5+d+V d+w w l+l+d+w V V V Y o.v.v.h.A.}+}+)+P.-+J.,+>+i.=+;+=+W.W.y.N.N.W.Y.;+X.W.y.$+z j j+,+Z p $ f ' } } E ] % a } - * ) : * / ' ", "H d | | : s & 7 & ! x 2 ^ K ] 7 x } ' h h i D # D ] _ 7 = = d W.$+R.,+L.=.^.|.5.5.5.5.D.<.|.{.%.-.{.1.L.1.,.,.%.%.L.L.%.{.L.1.n.@.e+A+:+=.....$.$.e+..n.g+k.i./+{+*.n+n+#.)+)+)+)+i.{.<.<.{.{.<.<.6+<.[.S s.k >.G.2.f.3.e+n+n+:+z.i.n.*.2.g+2.2.2.n.*.....&.&.=.e.o.h+).c.4.B.B.%.<.D.,.p+ .5+d+h+d+d+l+V S S ).k.V .[.1.}+#.!+P.>+t.2.=+;+X.X.W.y.y.N.N.V.X.N.V.W.y.N.m &+^+K.p f e f H d y # f m - } 6 ! s s = g ", "_ } | & $ - : & & = 9 _ > K ^ ^ 7 7 # h P ] O h J / : - p $ | | $+R.P.{+v.h+5.p+5.p+D.C.6+|.o.|.i.%.i.L.1.B.B.%.L.%.%.-.1.2.$.:+@.e+..=...:+:+e+..=.n.k.i.i.^.-.%+*.#...n+A.)+|+g+;.h.<.<.<.{.l.V d.a a >.k U s.<.f.n.A.n+o+e+..*.B+i.@.g+g+2.g+2.2.2.2.=.+.......&.=.i.%.%.1.L.L.%.%.,.G.,.o.V h+k.h+l+l+d+` d.X T w d.w S 6+3.3+>+I.>+=+;+X.W.W.y.y.N.N.W.X.W.V.j y.N.m &+^+-+{ a e e - ( c 0 9 ( - ~ | - - ! ^ % ", "7 & ~ } - & 6 & ; ^ ^ K ^ A < J % f e D 1 _ 1 K , f $ 2 f p - z S.^+{+:.p+w d+V V h+o.o.o.|.%.%.v./+n.C.%.B.B.%.{.;.,.z...&.$.r+:+$.0+=.:+e+@.=.z.z.v.2.L.}.u.Y ,+>+*.z+n+{+!+%+;.h.l.V s.w { y y n k Z Z Z j+W (+z.{+..e+e+n+#...n.g+*.*.i.g+2.g+2.A.*.n.3.=.3.3.@.@.i.4.i.f.t.%.%.;.;.L.{.h.C.d+h+C.h+l+d+l+v '.Z d.d.d.d.k+V f.3+>+>+$+;+X.V.X.N.y.N.N.N.Y.W.N.t W.N.H y./+-+(.e a e * + ~ ) 4 7 ( ( | & ! _ 9 g ", "; ( & } & | - ~ 7 _ ^ K A i D @ - g y O i ; h g J g _ 8 o - ~ O.!+z+I.w d+w .k+d+5.;.,.^.1.B.f.f.g+f.;.h.c.c.t.E.0+$.=.0+r+$.:+..0+0+:+..:+$.v.=.0+v.i.I.++M.J.J.,+3.{+#.i.%+u.4.,.r.n n a k Z @+@+/.r.K.J.M.M.i...:+o+e+....*.3.*.*.g+|+P.P.-+,+i.n.n.i.n.3.+.f.p.....*.L.i.*.t.c.<.{.;.%.%.%.{.V h+:.:.h+d+l+l+l l d.d.d.l+l+6+e.p.P.W.;+X.W.X.W.y.y.N.N.W.N.N.W.X.=+X._.a+g.(.a a e c + + * # 8 ( z + + 6 _ ] ^ ", "~ 6 | ; ; & 6 6 _ _ [ ^ _ 1 1 A ^ < D h 1 ; # e ) $ ; 3 : * . _.>+#.w.d+ .d+h+[.h.1.1.t.1.1.,.3.;.f.i.^.;.<.f.r+$.0+0+0+r+$.:+:+0+v.r+$.$.y+$.k.2.0+-.M.M.(+M.J.@+-+%+f+n+{+A.)+(+-+W '+'+'+M.Y (+Y l.}.(+-.-.1.v.e+:+:+=.A.3.#.*...*.g+^+^+O.O.S.S.-+P./+^.n.#.=.e.*.*.#.*.>+%+=.f.|.<.o.%.o.h.,.,.<.).h+v+:.h+k+k+d.>.d.d.k+l+l+C.v+p.N.;+X.X.W.W.y.y.N.N.y.W.W.W.X.=+X.j a+-+(.a f @ x r + @ g 8 + z z ( u $ % ] ", "+ 6 ! ! & - ! p = _ 8 ; ] 1 i [ ' ' # h % 9 D g ' p 6 : - $ * k l.n.6+d+[.h.h.-.t.t.1.1.1.,.=.;.;.=.=.=.0+v.0+0+u+0+r+r+$.:+..0+v.E.@.r+:+e+@.v.[+k.r.y.O.g.(+M.W &+^+3.{+#.#.A.-+-+@+@+&+@+Y u.4.(+l.4.4.{.%+f.:+o+:+#.*...#.2.i.i...n.,+j _.O.O.O.O. +O.g.^+....@.%+*.*.#.3+f.|.%+f.{.<.%.;.o.<.,.3.=.B.o.v.v.o.h+k+k+w w k+l+d+h+E.=. +;+;+X.X.;+y.y.N.N.y.y.N.N.X.W.Y.V./+,+l $ ) ) x x . p ^ _ ( + ( + + t ' ] ", ": : | s ! ! : = _ ^ % 3 D # F 4 @ e , 1 - y y e 9 & ( = * c p . }.0+:.D.C.C.1.t.t.1.1.L.1.=.,.v...:+:+@.0+r+r+r+r+0+u+$.:+:+z.0+v.=.3.$.o+:+$.v.j+M.y.$+$+ +(+(+[+&+M.3+f+3.#.}+f+A.>+a+a+/+%+2.g+2.2.f.n...:+:+:+v.n.A.)+i./+2.i.i.3...(+N.U.W.$+$+$+V.$+O.@+-.......3.*.#.*.3.f.p.;.v.%.c.B.C.;.{.%.i.+.e.p.E.f.C.p+d+l+l+w k+h+).o.=.^+O.=+;+X.X.W.y.y.N.N.y.W.$+=+N.W.Z.J.^+Q c a a % - m ! 7 7 6 ( ( 6 + s / i ", "+ - & ! - : } 7 _ % s g y y 1 i ] ] 1 , ! 1 e e 9 ~ | $ * * . Z L.$.G.;.1.t.t.1.1.L.L.1.3.=.....m+y+&.r+r+r+r+$.$.0+G.:+:+=.0+n.v...f...:+o+@.v.M.N.W.V.y.$+@+-.[+j+M./+)+A.*.#.*.t.1.1.,.2.v.0+0+=.r+v.v.v.,.o.^.1.1.i.2.g+i.i.i.1.1.A.q+W `.T.*+T.U.*+=+W.y.N.*.......{+3.#...*.3.=.3.3.2+c.;.;.B.c.}.%.f.B.%.2+v.:.p+V k+S ).Y R m.++}+f+,+O.$+X.W.y.y.N.N.y.$+=+=+=+N.X.y.^+P.c a 9 _ * z s ( 7 ! z s _ - s 9 h ", "x + & - & } } 7 7 | d > h K h g g D K = / h ^ 9 t j s p x x . R i.=.C.1.1.1.L.L.%.t.2.3+A.*.....:+$.r+e.v.v.v.v.0+0+=.:+r+0+v.f.:+=.n.:+o+e+@.{.M.L V.*+X.$+q M.l.&+W K.^+^+n.*.@.=.v.G.G.:.C.:.k.C.h.;.).5. .l.n.=.*.n.2.i.^.^.1.1.1./+z.*.-.#+T._+_+T.U.Z.V.`.(+........*.*.#...*.f.*.3.3.3.f.,.L.++H.H.}.%.H.t.t.n.G.<.h+Y '.'.'.R u.'+^+!+!+I.g.=+N.r.N.q y.N.=+;+W.N.W._./+P.. o p H ! { a = $ ! ~ + 7 ] [ p g ", "+ . ! & : = ; 6 6 - > , ' > g 4 4 4 1 = < 1 [ ^ } j ! * . . k u.*.v.L.;.%.%.%.t.,.v.p.!+3.*...:+,.}.T 5+5+5.:.t.,.0+o+$.0+..$.@...p.*.o+e+y+@.W O.`.X.;+U.W.$+q -+&+r.@+,+a+A.i.,.=.n.<.C.^.h.p+p+[.[.[. .w n e 5.i.^.^.C.2.^.2.^.i.^.i.2.n.@.{.T._+T._+_+U.T._+y.=.........#.*.=.n.#...3.=.3.3.=.3.%.H.H.T R '+` 2+t.=.f.<.T ~+` '.'+'+O.` Q.P.I.g.=+N._.y.$+_.N.=+W.W.W.=+_./+4.v ' , ' , , g 8 : = 7 6 & ] ] 8 | ", "6 . . 7 ! - ; 6 ~ % h D E [ > D i 1 ] = J K d H | j : ! k k /.t.#.,.;.%.;.{.L.%+G.v.E.!+!+!+3+C.k+l+k+k+w 5.1.L.;.=.:+0+$.:+$.:+v.E...:+:+:+..W U.*+Z.Y.`.#+=+$+ +&+r.W -+%+{+3.%+l.<.S /.&+(.t a y y y 8+y 1+8+[.^.2.2.A.2.2.v.n.n.n.n.A.2.{+@.[+T._+_+_+_+_+T.U.-...........3.3.*...A.A.*.=.3.)+3+#.e.%.}.H.T m.'+2+2+3.f.'.~+r '+m.~+~+r '+!+^+W.X.N.y.O.$+y.N.=+W.W.W.W._.g+-+Z % C 4 < D ] A - % _ _ _ ^ i ] _ ", "b + 6 : 6 6 6 ~ ! ' K E H > } e D i 8 ] h [ d H | | : ~ . >.-+)+=.;.%.<.D.t.!+k.v+$.3+3+2+2+o.l+l+l+k+w V C.%.;.1.#.v.$...$.:+..v.3.:+:+:+....&+U.*+*+`.H `.V.W.y.@+r./.&+I.A.{+L.W U k s.W K.W /.d.k y y B w .D.<.{.-.i.g+^.h.%.t.i.2.2.i.1.i.*.[+T.T._+T._+T.*+m *...*...*.3.n.3.i.3.#.n.f.#.=.p.c.A...f.B.++|.'+` t.%+v.2+'+~+'.` r +` 2+^+=+;+;+W.N.r.y.$+y.W.=+;+=+=+y.p.P.'+% A 2 I 4 4 4 ] _ A ] A A K ] A ", "r I . o ; & ( ( $ , > K ] > E 2 @ i % 3 A H } } d ! ~ z l R ,+3.,.5.h+C.p.!+v.$.&.#.A.4.2+f.d+d+l+d+d.5+p+h.%.{.f.,.1.=.@.:+......:+m+:+:+:+*.@+T.*+*+`.`.U.V.V.y.y.r._._.g.-.)+A.++Z d.(.Z /.&+/.Q S a G w U a .[.h.^./+-.<.{.i.f.2.1.-.-.-.L.%+*.[+T._+_+T.T.U.T.M.*.=.=.A.*.n.t.3.i.,.e.=.=.=.e.%.4.{.t.3.z.L.Q.` ~+++B.o.e.c.` b ~+~+Q.2+q ;+;+X.=+N.@+y.$+y.W.;+;+=+=+N.%+L.-+p % o n C C o 5 c A i h ' 9 ^ [ ", ". { I 6 ; & | - A 1 K ] ] [ E 9 0 9 E ! ~ } d W.d - . l Q P.^+!+Y C.E.p.!+0+$.:+..v.t.p.*.C.l+l+d+d.5+S D.C.C.%.=.4.3.n+e+....|+3.o+:+e+:+..*.J.T.`.Z.`.U.H V.Z.W. +_.y.y._.u.>+{+^.R v Z m U Z S >.B e M 4+1+1+ .w.w.l./+A.n.i.%.%.c.(+4.1.2.3.*.)+*.m T.#+_+_+T.U.`.g+-.=.3.t.4.=.i.}.D.o.3.3.=.v.B.|.%.Y }.p.7+B.}.` '.++}.}.2+2+H.~+r Q.>+=+X.X.V.X.N.&+r.y.y.N.;+;+;+;+W.I.2+P.! % : x @ C 8 c . 2 u C M J } [ ", "= c I x 6 + 6 c < D 1 _ 7 H > > e $ & + $+s ^ } } = l W !+^+>+!+i.E.,.!+e.$.:+=.p.t.p.*.G.d+l+d+d.d.S 5.:.C.h.%+L.n.....:+{+,+P.^+#.:+:+..*.*.-+T.U.*+U.U.`.| C+W.j y.r.r.N.@+,+3.f.<.U k m U >.Z B y 1+]+1+1+]+j.F.y [./+1.L.{.{.|.h.^.2.2.n.3.A.A.2.B+t T.#+_+_+*+*+M.W g+3.f.f.t.4.4.6+C.r+=.=.=.E.).h.}.H.Y p.=.G.}.'.'+B.H.}.t.2+u.~+'+^+$+;+X.X.;+$+y.&+y.y.N.;+;+;+=+=+J.3+P.l - ; * * < h y c & o N M , 9 ] ", "= $ * * - + x c i i ] E ^ K K J / ^ 8 u + d } } } ~ @+P.{+|+!+2+)+!+!+=...$.f.%.%.i.3.6+l+l+d+5+5+S X {.^.;.4.%+3.#.A.g+P.y.`.V.@+A.f+..#.@...I.`.T.T.U.T.T.U.*+=+V.y.r.m (.j r.i...2.M.&+Z >.U U y 1+y y ]+F.1+]+b+]+b+4+.+4+.+y 8+4+e S w.{.i.=.@.{+*.n./.T.T._+T.*+W.j+W i.3.p.Y 4.{.|.v.6+,.=.=.e.<.<.|.H.H.}.}.,.{.R '.'+2+'+H.++t.2+H.2+P.X.X.;+;+$+N.@+y.y.N.=+;+;+=+W.@+A.I.l . 6 - - ^ J J > - N P # P 1 i ", "7 = $ ! { : 9 % 2 ] K ^ > 1 K h , _ 8 ( ( | & & & +Q.^+}+!+!+!+!+3+*.:+v.G.%.p.3.f.S l+k+w d+5+V V }.{.-.{.u.)+..n.S.r.j `.`.j P.a+a+*.n.....i.d T.T.T.T.T._+U.Y.X.W.m r.(.m j K.n...^.s.k s.d.n a w y .+9+1+G F.4+!.b+F.]+]+9+].M 8+M .+y >.M.1.*...{+*.=.(+i+T.i+*+X.&+&+j+v.3.4.}.{.,.C.V 5.e.3.=.,.5.}.H.'+H.Y S |.|.'+'.H.B.'+` '+2+%.t.a+g.X.X.;+=+N.r.y.$+y.W.;+;+;+=+_.i.>+m.. b b | 3 E K > ^ ] D D P P 1 ", "$ f ! & & & [ _ 8 ] 9 J > E K < = ; + & 6 | 6 ; $+O.^+{+{+)+p.!+3+{+$.v.,.,.3.f.|. .l+k+k+d+V V V X [.%.-.h.i.#...I.j U.U.U.} r.@+a+|+A.v...$.{+m T.T.T._+T.T.T.U.Z.V.W.m z z m y.H.3.=.^.w.s.n n w k k n k 4+4+y F..+F.]+9+]+6.7.N 4+4+M 0 ) Z '+c.3...#...@.-.`.`.U.X.W.m H {.A.3.%.{.=.C.d+X B.+.e.3.<.<.Y '+T l.5+5.c.}.'.~+c.H.'+'+'+` H.r+%+N.X.;+=+W.y.O.N.@+N.;+;+=+W.y.I.2+H.o I b ( ~ - > , ' / ' 1 1 .+O ", "p 7 - { t * 7 ^ 8 _ E g H E K g = _ _ 7 ; u ( + q P.s+#.)+2+A.)+=.k.C.,.3.3.;.V w l+l+k+w V V <.).|.%.,.[.I.|+f+..!+_.y.r.@+-+++-+|+g+f+=.@.:+=.(+`.T.U.T.T.T.T.T.U.V.Z.W.z m l z _.@+..0+^.Q d.# y k . .{ k .+y w ]+b+q.q.q.b+4+f M 1+7.x k .5+T %.n.*.n+{+$.B+H V.*+X.j `.t -.3.3.f.{+c.V V ).E.+.=.f.).|.R X Y S U |.|.Y '.~+B.'+~+r H.r ++3.1.y.Y.=+$+N.O._.@+N.=+=+=+=+y.M.)+u.: 6 6 & & $ 9 K i 1 ] E ^ ' y ", "% ; - * B c % _ = _ } E 9 > , / _ % % _ 8 6 ( + O.!+}+3.p.|+)+$.C.6+:.=.v.5.5+d.k+l+l+d+V 5.,.v.1.L.J.j `.z @+A.*.!+a+^+-+-+Q.Y H.)+)+A.:+:+@.../+`.T.U.T.T.T.T.T.T.U.*+W.N.m m Z `._.>+=.G.G.Z J .+d.s.U U s.l.B ]+]+b+q.q.q.F.{ D 1+# s.X w w d.v U B.p.#.#.)+@.2.`.*+X.X.`.U./.i.3.*.p.L.6+6+o.).=.=.*.B.|.Y '+R 5.d.X |.|.R r '.P.` r '+b '.v.G.p.Z V.W.N.y.r.O._.$+;+;+=+q K.)+,+* & 2 7 - : 8 ^ 1 J g ] K K h ", "7 & ; 7 8 c * * $ = d / / / 9 _ % p _ A 5 6 ~ + ,+3+^+p.3.3.=.h.|.C.=.C.d+d.d.d.l+l+k+V V ,.,.S.j <+U.i+| m -+|+!+P.^+O.O.Q.++,+>+{.k l.@...*.$.{+m `.T.T.U.U.T.T.U.T.U.V.W.N.j (.z `.K.A.z.2.1.Z { /./.X l.j+k k 9+b+j.q.q.q.y k y F.y 4.L.<. .n 0 n Y B.3+..#.)+@.r.V.X.X.V.V.`.(+,+g+A.^.o.E.d+}.B.3.=.p.}.}.'+H.Y 5+U |.|.}.'.b '+` '+r r r H.<.Y E.R $+N.g.r.r.g.N.;+;+=+N._.1.>+. % [ t ~ - 4 ^ 1 / J h 1 g / ", "~ ; 7 _ 7 } x { p 7 E [ E ] = % % f ^ ] = 6 ! x r H.Q.%.=.v.|.|.:.r+h+l+d.d.d.l+l+k+S X M.f.M._.z j z -+S.(+g+!+P.O.P.H.,+t.t.Y x >.{ /.v...f.@.n.-.H T.U.U.T.U.U.T.T.T.U.U.| m y.m `.j Y n.2.2.-.W S (+Y U >.k d.1+1+]+]+1+y U -.F.q.]+{ &+<.p+d.0 ' m.c.>+3...m+3+*.-+=+X.;+V.`.N.;.@+3.G.1.E.d+d+|.f.=.r+).|.H.'+Y T >.R <.|.H.b ~+H.` b b '.'+'+m.` c.P.N.O.g.r.M.N.=+;+$+$+_.(+%+l $ E d H s $ } E E 9 1 g p * ", "+ 5 7 _ 7 7 : * - * H t ; 4 9 % 7 } E % : - * x '.H.++*.v.|.|.C.:.d+l+d.>.k+l+l+l+S X M.X 1.i.I.Y -+Y ++(+/+I.)+S. +8.T o ]+8.].D+F <+4.3.=.=.=.$.{+r.U.U.U.T.U._+T.T.T.T.U.U.L m m z `.K.u.n.,.i.-.-+J.Z d.k d.5+k+w e e B Z Y <.1+6.M k r.[.:. .B f >.++c.t.#.....3...i.W.;+X.*+V.H r.g.*.t.v.h+l+Y %.n.=.;.5.Y ` H.}.'.Z 5.|.c.~+r ~+` '+b ~+u.'+m.` '.++,+K.J.r.M.y.N.;+=+$+_.W )+m.. 9 > | W.} [ - ^ 1 P D 9 * ", "; ; _ 7 _ 7 ! j j m ) / E ' E 7 } & _ % ; * x { H.}.=.f.%.).h+:.d+l+k+l d.l+l+d+ .X Y X '+A.>+g.I.++-+-+J.J.J.I.!+R.' 9.~.q.F.#+#+& O.1.z.@.2.#.=.q+a+`.*+*+U.*+U.U.T.U.T.T.T.`.W.y.(.`.j M.%+v.n.e.J._.Z k d.5+5+5+d.m U Z /.W ,.y .+k l.@+<.f.V k . l H.}.,.3.:+n+*....._.X.;+X.Z.U.V.q n.f.v.6+k+m.}.;.=.C.).5.'+'+}.m.w T |.|.H.v b ` r b '.H.++r '+m.'.B.^+-././.&+$+=+;+=+$+@+3+X z $ ] H | d [ * : 2 N F A 8 ", "7 6 3 % 8 = t j t L a / y D [ } } = % ; . x . T %.e.,.).<.h+:.h+l+l+'.l k+l+d+d+w.5.l.[.4.,+g.g.M.L.%.-./+4.-+-+a+)+t.k y e V [.Y Q.%+^.3.*.v.v.*.g+{+m U.*+*+*+T.*+W.U.T.T.U.U.`.W._.j U.@+Y *.v.p.,+@+m.d.d.v v ` >.>.k >.U /.L.1.s.[+i.^.<.v.w.m.m.` ` c.2+:...m+o+*.*./+=+;+;+*+X.T.W.g.#.,.h+d.>.Y o.,.B.<.6+R '+R R 5+d.l.{.}.r b r ` b '.` '.b '.m.r ` !+^+Z r.{.V.$+=+=+$+_.%+u.z j 9 f / H } % % @ ) h , ] ", "_ _ % $ x * ! ! L t E D D / _ ; _ [ ; x . x S %.e.;.5.5.6+G.h+l+l+U '.l+l+d+w.l.l.<.C.{.>+O.Q.v ].0.b+6.8+4+. J.,+%+p.5.n n n v '.v Y v.*.=.G.=.,.n.q+A.`.U.U.T.T._+$+$+y.j U.T.U.U.W.y.`.j Y i.=.E.e.J._.U k 5+m.S 5+>.d.d.d.Z U G.<. .C.^.G.v.<.W W ` ` }.o.f.=...o+*.3...g.=+;+X.*+*+*+=+{+3.).k+5+5+D.o.E.<.).Y '+J.++>.w X |.|.'.b b '.~+'.'.` r ~+~+r ~+` ,+@+r.M.$+=+=+=+$+_.I.t.>.r g ^ g K ^ % _ _ h 1 D ^ ", "; 3 7 7 7 6 - ! j t 0 0 h D - 7 _ _ d ~ ! Z %.3+v.5.6+).k.6+l+d+w '.5+l+d+h+|.%.t.)+^+-+@+@+!+a ].]+4+8+].& +u.A.t.p.Y 0 I I I r I Y =.*.=.=.G.2.3.i.=.(+U.T.T.T._+V.$+y.r.@+j T.T.`.W.j U.M.u.A.3.3.%+@+Z w U w >.d.5+m.d.k d.>. .G.,.G.G.i.L.l.R R ` ~+++c.e.$...e+#.{+..n. +=+;+;+X.T.Y.P...B.l+l+w V o.B.C.h.4.H.'+Y S 5+s.|.|.'+~+b '.'+` '.~+b '.r '.r ` ` ,+l &+@+;+$+=+y._.++g+z ! p g 4 % > J g ^ h i < K ", "6 u u ; } & - H H ^ o N h # $ 7 % 3 j z l }.A.=.|.p+p+:.0+d+l+l+Z 5+k+l+d+).o.p.I.O.N.} } _.,+M.{ { M.I.@+z l S.)+{+%+u.r 0 I N r r R A.3.*.v.n.A.A.n.n.=.m H U.U.T.T.W.=+_.r.r.j U.T.W.j `.r.(+L.3.f...g.@+U U k 5+5+` m.m.U s.s.U W 1./+u.++++Q ` '+` ` T c.v.=.#.n+e+#.*.3.-+q =+;+;+*+*+O.|+=.d+w k+5+).<.h.h.;.R.H.T V 5+5+5.|.Y ~+r '.'+B.'.` r ~+'.'.r ~+~+P.R._.-+;+W.=+y.O.K.3+l ! f a % < 4 O h g g 1 K 1 ", "8 % 6 8 ; } } | } A F 1 O f = 7 3 . (.(.++p.3.<.5.5.C.0+d+l+l+>.d.k+l+k+).o.t.3.@+z y.&+P.&+P.)+g.&+r.m j `.( O.R.!+i.t.m.4 ~+P _. +S.3+)+{+3.f+)+A.A.i.-./+j U.T.`.U.U.V.W.l r.&+j T.U.V.`.H g.I.i...n+%+@+r.Q W U U m.` S S /.W &+/.&+J.M.@+` ` _.` ` ` ` o.0+$.{+..o+e+3.#.O.g.=+=+;+X.U.=+/+@.p+l+k+5+d+c.|.<.{.c.T R Y 5+5+` |.).'.r '.m.c.H.~+~+~+` '.r r ~+'+2+_.,+=+;+$+$+ +&+)+Z . = = * a 0 C C i 8 i , g ", "3 c _ ; ; $ = ( } [ } > H L d % * k l M.t.*.%.|.p+6+r+C.l+k+>.5+5+l+l+V |.{.%.3.a+(+-+g.@+/+a+,+/+W `.#+U.U.| R.O.g.)+g+@+- _.N b ~+R.!+f+*.{+)+>+A.i.2.g+{.(+j T.z `.T.T.*+Z.W._.M.d T.V.V.U.Q M.L.n...#.g.J.K.&+&+W r.r.&+/.&+/.&+@+@+@+r.` '.m.` ` ~+~+T C.u+=.n.:+o+:+f.#.S.=+O.$+;+;+*+X.J.e.r+l+l+5+k+h+5.|.{.h.H.T [.V 5+'.Y <.T '.'.'+R t.~+'.r ~+'.r r r ` Q.P.Q. +=+=+=+ +K.)+'+. H } + : P C N 0 I ^ ' g ", "_ u ; 7 - ! 8 6 H } ; > H t H x . (.'+t.}+;.<.5.5.G.G.d+w d.>.5+k+k+d+5.{.{.4.t.a+S.O.&+@+-+/+u.>+^+,+M.M.,+%+,+J.P.P.!+O.+ _.E+b +S.2+3+3.i.i.3.i.L.L.*.^.-.&+j l j J.z `.H z /.'+++} T.V.U.z K.++L.{+#.!+g.g.g.&+g.@+&+K.R '+/.Q Q @+r.m.` ` m.` ~+` ` ` o.u+=.f.o+o+=.{+#./+;+O.=+X.X.X.*+O.t.#.h+l+k+k+5+V [.h.C.}.T V Y m.m.5+<.X r '.m.T ).H.r ~+r '+~+r r '.` >+R.-+;+=+=+q K./+++s = ~ ( ~ i N P 0 C 6 ] ] ", "_ 7 ; & * = ; x E 9 i 1 K $ H x '.'+B.3.6+5.6+5.D.r+h+k+U '.m.5+k+d+}.c.o.%.4.P.!+P.O. +,+,+'+Q.!+R.O.g.&+M.++++u.@+P.^+S.r +i q ~+O.!+>+3.3.3.i./+L.g+*.=.-.-.M.U.U.#+O.,+@+z m r.W ++j T.W.U.W K.u.>+}+*.g+'+W g.K.&+K.K.'+R /.S .S 5+T 5+` m.~+~+` ` ` ;.0+$.n.o+o+#.#.#.-+;+;+ +;+Z.;+X.$+1.e.:.k+l+5+5+U 5.p+>+/+Y ).T T w w [.4.` '.` ` ` B.r Q.~+` ` r r ~+~+u.P.,+X.;+=+$+&+%+I.m : o ( ( ] P P C C 2 % 5 ", "8 7 ; ; 3 * = = ] i O h K = : x m.u.p.,.d+o.|.5.v.C.l+U >.w d.l+k+).o.%.B.>+)+Q.{+{+M.M.k (.l }.)+^+O. +O.(+|.++R. +,+3+S.q _.+ b +R.-+J.++|+p.^+a+)+n.n.i.*.-.!+} U.i+V.r.O.O.(+r.r.r._.j `.`.m W J.Q.p...#.!+K.K.X W T ` T T 5+S S 5+m.5+T '.'.'.` m.` T E.=...3.o+o+..#...f+=+;+=+=+X.X.*+$+<.i.&.d+5+` 5+5+5+[.-.1.c.T T H.5+d.S (+J.'.~+'.` c.'+~+~+'.'+~+r '.r ` 2+!+O.=+=+=+@+/+>+>.$ * b + ~ P P C u 0 9 _ ", "* - ; ; 5 3 ; 9 4 F O D 1 9 9 * Y t.f.h+V <.<.;.0+h+k+_.m.l+l+l+h+<.%.4.4.f.W [.^+l q.]+e k (.|.^+a+P.S.S.I.t.P.Q.R.P.P.!+@+^+ + +P.r.`.<+`._.)+A.g+A.*.n.n.*.3+^+,+z U.U.<+H V.u.;.l &+r.r.H H U.W J.J.u.#...#.i.Y R Q S T T S V m.S m.` ` >.'.'.` ` ` ` Y =...=.$.e+o+....#...O.;+;+=+;+X.;+W.,+1.*.6+m.v T k+d+h+|.t.t.H.H.H.5+d.d.l.Y r '.` ` Y 2+b ` r '+'.~+r r '.t.)+@+=+=+=+O.(+>+m.g % x b b K P N I 2 7 7 ", "% } 7 7 ; 8 _ ] F < D # / % % Z L.3.6+w ).<.<.=.D.w w _.5+k+l+l+p+%.{.{.|.n.v.d.K F.j.6.a 5+%.%+I.|+/+-+P.P.P.P.'+* p O.|+P.!+,+P.z U.} `.z P.f+g+L.A.L.*.,.i.P.,+S.g.r.y.j y.(+%+|.r.M.K.r.r.`.U.j &+R K.(+#.*.#.{+L.X U >.>.5+` 5+m.'.v v >.'.m.` ` T c.3.....#.m+o+o+..#.n.#.g+;+;+;+=+X.Y.;+@+n...:.>.5+d+d+k+d+).<.2+c.++}.T d.d. .|.'+'.'.T H.e.'+'+r ~+'+~+~+b '.c.f.++$+$+=+O.Y >+R 4 3 6 ( q < F C F , 7 7 ", "_ & 7 = = : 9 e ' h O D ! E * }.n.%.V V %.<.,.v.d+w >.d.l+d+l+d+p+<.%.{.{.i.@.*.A.i.{.v l '+R )+,+(+i.{ ^ b.P O 8.4+8+@+)+P.!+@+`.U.#+U.#+-+|+,+S.S.!+A.*.# z +P.g.O.O.O.@+/+!+K.i.u.Y Y J.R z U.U.r.W M._.g+3.{+#.*.)+}.r.m l s z z ` '.'.m.` ` ` H.t.*.3.....e+o+e+n+#.#.#...3.=+;+;+=+=+;+;+y.=...v.5+d+l+l+d+k+k+5+;.B.o.|.X w d.w 5.5.'.'.m.'+%.,+r '.r '+` '.r '.R f.{.$+=+=+O.J.(+u.x 2 x % * c I C F K ' 9 ", "^ ! 7 7 7 - 9 / ' h h J ! { Z t.p.X w S {.<.e.<.k+w w w k+l+h+[+M.t.%.%.%.E.2.n.*.2+^+'. +'+S.,+I././.F.]+q.4+O ].8.9 W ,+O.i.P.l z m M.a+a+P.P.S.O.O.>+*..+8+l | r.Y u.M.U . Z K.4.i.u.Y M.H.W U.U.m W H.J.I.{+3+....n+3.L.M.X r.m l '.m.'+` m.` }.p.*.3.@...e+o+o+e+........#...$+;+;+;+$+Y.;+q f...=.5+k+k+k+l+k+k+5+Y %.L.5.[.5+d.w S <.S '.'.T H.3.'.` ~+'+'+'+'+` '+t.f.$+=+=+ +W K.I.* % ; $ x u u C C / / > ", "1 = 7 7 _ | = ) H > , p * { X A.4.s.U l.4.t.A.S l+k+l+k+w p+-+-+Z (+t.%.p.E.f.#.#.2+>+` ~+ +R.J.)+I.J.f !.q.F.].8.].A Z [+-.a+P.g./+/+P.S.S.S.^+@+( $+g.%+e .+Z i+F..+e n O P z q L.%+p.M.R R _.N.$+y._.M.(+{.=.:+=.........{+-.4.(+I.J.'.'+H.++B.A.{+3...e+o+e+e+e+......:+#.%+*.@+;+;+;+=+=+;+q 1.=...h+l+l+d+l+k+k+k+m.{.-.p+[.V k+d.w p+H.'.'.Q T t.++` ` ` H.~+'+'.R 4.e._.=+=+$+R &+>+k I I 8 u I u u O , E E ", "h ^ 7 _ _ & ; % ] 1 K $ . Z t.p.X d.d.4.4.A.Q.l+l+l+l+d+p+R.S._.H A.>+,+!+!+*.*.*.3+2+` ` r S.S.P.3.A.>+J.k { w 5+v Q M.a+M.,+a+O.O.O.S.^+a+P.X ].c+ +-+a+ .]+X b+j.]+6.P ( q +q S.3+L.L.@+y.y._.J.z K.r.I.I.n.$.:+:+#...=...#.*...#.3.3+7+3.e.f.=.=.:+o+e+e+o+e+......:+e+A.L.3.,+;+;+=+;+=+;+$+t...*.h+k+l+l+w w w d.>.V {.<.p+h+k+w w w.(+@+'.'.'+R 2+'.++~+~+'+_.'+'+X v.w.=+=+q J.r.,+m.c o u 5 u b < P 1 > } ", "1 1 ^ 5 7 7 | ; 1 i h . . X f+}.U d.S |.L.3.S l+l+l+k+C.@+y.j U.M.A.,+!+^+)+*.3.{+)+3+Y ~ l !+R.R.q+1.A.V a e G G >.P.,+(+r.f ^+a+^+^+,+O.t 1+k h u _.a+^+,+8+e ' P z } + +q S.S.^+2+Y ++J.y.r.m j _.R J./+3.*.$.$.:+,.3.....f.3.e+e+......#.3.=.$.e+o+e+o+e+e+e+..:+....:+f.{+=.n.=+;+;+;+;+=+=+%.=.=.6+k+w d.d+d+w U w d+D.D.h+h+d+k+V X l.'+'.m.` '+|.++t.'+r ~+r '.'+X ,.t.=+q =+R r.>+'+p : _ _ ^ 5 A 1 1 K 1 ", "1 1 ^ o | _ } ^ i _ g . >.L.f.S d.l+X 4.f.:.l+l+l+d+:.(+g.z `.(.%+u.3+,+R.-+A./+)+a+g.| j ,+R.,+-+)+%+v.5.S y y G v Y A.(+t 0.>.n # M 4+F.]+9+e >.T c.I.-+-+Y /.U Q %.L.L.^+^+!+!+Q.,+P.q (+M.r.U.i+U.<+Z j+n.:+r+0+=.:+3.=.......*.=.e+:+e+..m+:+..:+e+o+:+o+:+:+..:+..........#.*. +X.;+;+;+=+=+;.v.r+:.w d.5+5+k+k+w k+l+h+C.h+h+d+ .X {.n.L.Y R R ` T G.i.R.~+'.` R '+R ,.p.q =+=+K.r./+J.3 ! p _ ] ] i # h h 1 ", "D @ - } 8 & ; 1 , 9 c . Q e.5.w k+l+}.L.3.h+l+l+l+6+k.J.r.r.g./+u.Y I.% 7 +)+^+g.j d r.,+S.O.Q.L.A.3.|+t. .e 1+w l+T )+{+U ~.F.q.~.9+b+0.F.# .;.|.(+l.^+%+,+%.L.p.I.4.u.L.)+^+P.|+/+^+@+,+p.%+z U.U.U.i+z {.:+v.v.v.0+=.:+..=.*...o+..:+:+:+$.=.=.e+o+..o+o+..:+........e+e+......&+;+=+=+=+;+=+v.,.=.0+V 5+w 5+k+k+k+l+k+l+p+p+h+d+ .X {.n.p.n.%+t.L.%.;.n.n.n.I.R H.H.R ;.A.R.q =+@+r.,+Q.x | - x ] ] 1 D O D i ", "i g } | ; ; o 2 , < c Z }.f.5+w l+d+u.i.v.d+l+l+l+h+:.C.g.-+1.u.}.g.M.P i S.^+P.O.y.(+a+u.R.@+(.m [+3.{+)+Y y ]+S x.d.!+|+i.e !.q.]+].~.8.. ) X i.4.(+m I.j (.g.Y Y I.p.i.n.)+%+{+f.|+>+>+@+++a+g.z U.E+U.m 2.#.A.0+0+v.E.v.=.........m+:+:+..$.=...e+e+..o+:+............:+....{+*.-.C+=+=+;+=+$+=.;.=.*.o.k+k+w l+l+l+l+l+l+d+).h+V V X l.3.d.y V ;.i.L.[.V W 6+i.L.d.F.<.t.2+,+q $+@+r.P.Q.+ ~ x j $ g 1 D ' i F ", "/ 9 7 - * ^ C C 4 0 . S %+6+w w l+X 4.e.6+k+d+l+l+h+:.0+,.<.u.Y -+(.0.9.+ ^+P.^+-+,+-.Y Y J.Q (.{ k ,+n.)+P.a b+k 0 ~+a+g+-.2. .]+b+F.7.7.F.n M.A.-.I.-+_.d `.#+} y.O.@+,+3+)+{+3.A.a+!+@+D J L.g.g.@+j _.P.n.g+#.v.v.v.2.2.G.l.B.,.e.=.0+$...$...n+e+e+..o+=...:+..*.......:+:+g+#.g+q =+ +;+=+=+v.<.=...G.l+k+d.l+l+l+l+l+l+l+V [.w.V X Y n.B q.q.b+6.# M e n d.X '+w.q.U >+^+)+ +$+K.@+-+P._.( * - % ' @ g h P 1 ", "p $ 9 g 2 < N C < n { Y f.d+w l+w l.1.e.d+l+l+k+d+[.5.<.,.5.Y R.i ]+q.]+R }.p.!+a+P.(+(+Y &+W m 9 ^ Z (+!+,+m.b+* [ r a+)+,.=.*./+k 6.]+e d+V 1.i.P.R.R.^+&+j } U.U.U.( _.^+f+3.q+g+|+g+{ q.i+m P.S.-+g._.S.i.%+3.@.z.v.k.k.^.K.R Y ,.v.r+=.0+v.#.n+o+..o+..@.....*.#.......n+..:+*.@. +;+ +=+=+$+e.;...f.z.d+d.k+l+l+l+l+k+k+w V Y X Y Y Y p.6+6.b+j.!.]+]+9+a ./. .[.b+w 2+>+3+S.y.W R -+,+l * - & = e # % A i P ", "g 4 ' 4 @ O O i @ { d.L.,.k+k+l+w l.p.,.d.l+l+l+V ).4.o.u.4.5.x ]+q.q.@ ).5+o.{+|+P.,+K.k U m A _ $ +J.L.I.'+]+_ & +!+A.*.{+3.%+t.d.8+X I.f.p.'+c+C+P.!+S.@+g.&+@+-+^+!+!+3.{+A.g+%+q+) b+]+F.i+s r '.r l | ,.2+..z.k.k.k.;.O.'+m.c.o.G.v.v.=.}+e+o+..e+......:+{+......#...:+=.....-+=+=+=+;+q $.,...,.v.V d.l+l+l+l+l+w w w X 5.V H.Y X t.3.S y 1+6.4+# U (.Z U V 6+j.[.f.%.f+P._.M.X Q.I.. = d ~ f @ ] _ 5 1 P ", "2 C @ f h P O 1 @ . X %+6+k+k+l+w l.3.6+k+l+l+w [.|.%.C.1.% h N j.q.@ 6+5+5+T e.f.W K.e 9+4+8+v 6.D @+'+I./+Y P 8.6 b ^+3.*.3.{+{+A.V 1+Q u.>+3.{ !.F+( ,+^+/+^+g.S.P.R.S.^+{+=.i.i./+i.n q.8+_+]+.+.+O x +s.j+f.P.n+n.G.:.<.r.'+'.` ` T G.f...:+o+o+..:+n+n+......*.......*...o+@.../+=+=+$+=+$+=.=...;.{.5.5+l+l+l+l+5+ .s.5+V [.S m.w.X ++{+n.Y U U k k m (.Z /.h.w b+5+n.@+3.i.K.H.R ,+u.. p ! t * 2 , ] A P 1 ", "i A @ A 1 O P h p v u.%+V l+l+l+ .L.3.V l+l+5+5+5.<.{.;.f.M.# F.t+~ s.5+5+}.T E.X n 8+q.q.M G v e 5.V R I.-+,+k F.+ ( ^+f+*.*.3+{+3.<.y Y u.++p.k ~.[ c+E+m.^+!+^+,+'.} ( O.{+n.i.1.i.A.n j.9+4+]+4+1+].M z W W L.&+g.%+2.^.l.Z m.` ~+` ` ++i...e+o+......@.....:+........*.....z.f.@.z.q =+=+=+q 2...=.{.5.5.k+l+l+l+l+S V V .w. ._.K.W u.l.i.{+A.4./.s.w.[.M.M.,.[.8+n B A.>+S.f.M.M.R I.Q.. f * * a n # < 5 1 > ", "i g @ 4 P .+# g p (.I.2+d+l+l+l+S f.f.k+l+l+5+V o.{.{.;.,.v.3.p.|.H.d.n 5+Y }.B.2.k 1+]+.+# G d.Y 5.o.(+n./+>+6.b+: + ,+!+*.*.!+{+n.)+4 U u.}.u.w.q.8+0.b+b+P . m z G+] 6 b g+i.i.i.n.,.2.8+q.M d.w . r ~+ +++I.g.j Q @+%+k.1./.U S ` ~+` ` f.....o+:+e+@.........:+..:+e+..)+L.3.:+:+#.O.=+=+=+$+u.*.v.o.<.6+d+l+l+l+d.S V .5+W S Q X -.n.3.n.n.*.=.f.,.<.{.-.[.k k .[+.+u.3.P.P.++M.J.^+H.. f p : ' @ F O F P ^ ", "2 2 2 h O # D D p Q I.%+k+l+k+w X =.%.w l+k+d.5.o.%.%.{.%.3.&.e.3+)+'+G 5+Y }.Y :.v.2.s.y 8+a T }.p.E.p.2.*.2+.+q.{ + P.!+{+{+{+*.i.!++ { ++u.}.u.y j.]+q.q.F.6.6.4+7.8+5 l @+>+=.3.1.1.v.V 1+6.>.S m.u.!+>+%+g.W.U.`.R @+g+2.-+X Q ~+~+~+` 2+..n+e+:+:+......#.*.:+:+:+:+f.>+f+:+..3...P.$+=+$+ +W =.G.D.D.D.d+l+l+k+V .V . .S S W (+3.n.n.{+n.*.n.n.n.n.3.q+i.2.f.l.w.y U 3+#.^+,+}.H.^+J.. 4 ' : K , 1 1 P 9 9 ", "2 F 4 h P D # ' c M.L.t.k+l+l+w %.=.[.k+l+l+s.<.<.%.%.%.p.&.@.=.f.=.++0 G Y }.X 5.f.A.M.{..+M W u.u.|.E.-.%+,+8+q..+m ,+A.A.3.*.{+)+!+ +c m.++m.T L.{ b+q.q.]+9+F.6.8+1 A + P.i.k.k.i.i.v.1+n m.m.m.T p.,+P._.| U.T.#+( _.O./+I.R H.'+~+~+~+t.........:+..|+..*.........0+=.#.*.=...e+:+g+r.;+O. +h+@.k.C.C.p+h+l+l+ . .V .5+ .S Q M.i.1.(+(+i.A.3.%+(+4.{.A.p.>+S I.l.[+S e i.)+,.u.Y ++>+'+r g $ d E ' h 1 1 - ] ", "' 1 h 1 1 C O @ . }.L.|.k+k+l+s.v.v.S l+l+k+V {.h.^.1.;.3.&.3.G.E.3.3.v ].H.}.Y 5.Y =.I.i.d.9+e ++u.u.G.%+,+!+{ ]+]+Z ,+L.-.{+*.3.)+!+S.P D '+x '.m.t. .8+]+6.6.8+t+^ '+q R.|+2.i.2.C.v.V b+v '.m.T ).f.Y O.y.*+_+_+U.<+| y.y.,+>+R.T ` ~+~+2+{+..e+e+..f+*.........=.=.:+:+*.{+..e++.*.:+g.$+g.y.D.$.C.o.<.p+h+l+d+ .S .5+ .V W X l.i.l.{ U [+++g+{+t.l.4.C.A.^+^+,+1.w.1.4.g+)+B <.++R.t.r.v f 4 7 ) h 1 1 h t _ ", "h h P 1 O P , @ (.I.>+).l+w l+V @.:.5+l+k+k+p+h.h.t.1.,...n.G.2.2.f.*.%+c+B ++++R r o.p.1.[+y 7.X -+u.p.G.!+Q.z ]+q.l M.(+f.3.A.Q.S.^+z F.]+r ]+I r '+C.h+n n n G l S.P.R.!+{+*.=.,+G.v.4+b+v '.@+Q.3.%.(+$+ +*+T.T.<+U.U.V.y.y.P.)+Q.'+~+~+c.f+#.e+o+:+#.}+....{+#.@.:+e+..{+#...*.*.e+..P.O.S.O.G.E.:.o.<.D.h+d+w V V w d+V w.X 4.2.p.Y k ]+n Z '+P.f+n.,.2.=.*.!+,+t.U ++I.g+t.X 6+p.++>+m.. 2 I : f 1 i F C 4 c ", "f # h K 1 h > f U I.>+h+k+l+k+D.@.).5+l+l+d+l.o.B.,.L.3.@.3.2.2.2.v.3.3.-+8.H.++T x ` B.p.A.U 6.U 4.u.u.%.t.Q 6.]+.+m.-+g+)+a+Y @+O. +6.q.j.C a.o r T }.V k+U S U l Q.)+{+*.*.3.{+)+i.{.b+b+'.` O.R.=.l.M.=+y.Z._+<+<+U.U.T.`.y.y.g.!+^+'+~+R.)+{+..y+A+:+{+n+..{+#...e+:+#.{+{+3.m+....:+-+$+S.O.v.:.<.D.D.6+h+ . .w.h+ . .l.1.i.n.A.q+1.U ]+j.].v '.P.f+*.f.I.f.4.^+%+{ /.A.[+e k 4.3.%+>+Q . 4 2 x c 5 C u u 0 f ", "o C < h P > / G j+%.%+V l+k+d+C.=.V 5+l+l+V <.c.t.t.p.:+n.n.2.g+n.2.,.f.)+l D (+R b b H.c.%+W P y k W ++++H.~+'..+/.Q ^+^+^+R 7 C+( ] ]+q.F.I b b r '+}.M y k+'.r v c.{+#.*.*.n.3.f+)+# 1+F.m.'.` )+f.i.M.q $+$+T.<+C+c+U.U.U.U.$+y.O.,+!+R.'+)+)+n+:+y+A+f+..#.{+#...@.....)+#.:+e+m+e+..a+y.O.@+k.%.<.D.D.6+p+V w. . . .[+i.A.i.A.n.n.n.l.e j.q.7.U ,+^+A.l.<.t.|./.n v {.[+8+# U 2+A.}+A.m.. g 3 I x u u u u 0 0 ", "5 C A 1 , , D a w.I.p.h+l+5+h+v+E.V w l+k+).<.<.1.L.=.@.*.2.2.n.n.i.=.i.>+^+, >.[+b b r ~+++>+. 1+n k Y v c.r v w.w.I.P.!+u.K G+].1+]+j.7.Y '.r I r T |.1+d.w r I r B.3.q+v.-.I.^+^+4.4+d.6.w '.R.2.2.z.J.O.q $+C+C+<+*+T.T.U.T.U.W.y. +P.!+I.)+!+f+..:+o+....#.}+{+3.......{+..e+o+:+=.z.A. +_.@+G.<.C.D.6+o.5.V V V w.[+I.q+4.l.>+*.{+n.G.w j.b+y y D J.)+4.8+;.%.X a ]+j.]+y R t.B.>+{+A./.* % % ~ 6 u C A F N F ", "u 5 8 ^ / ' y ) R.u.)+d+l+5+h+r+C.V k+k+V 6+).<.1.t...=.f.v.v.n.e.=.2.i.!+a+_.8+S m.b x ~+'.>+'.]+n 8+Q '.Y ~+~+T M.,+^+>+(.F+].x.j.1+d.W l.` '.r 5+}.1.6.d.d.I r r u.L.{.i.A.,+v n d.G 5..+B R t.o.2.v.g.J. +O.$+C+<+U.T._+T._+T.U.W._.y.-+!+!+!+!+f+o+o+o+..#.#.{+..n+..#.{+..o+..$.:+:+#. + +@+,.o.6+p+6+<.[.V V [.++++-.3.>. .1.n.n.n.z.{.1+1+]+j.9+k (+)+.+k p.3+<.U . .)+I.R.'+u.#.A.m.$ $ = ~ 6 x _ K i 4 F ", "I o x t t a y G [+Q.a+k+l+S p+$.h+V k+w [.6+p+%.1.v.$.=.z.n.v.=.n.,.=.3+f+!+R.{ a Y '.. v '.c.%.y y y c r ` T v ` }.S.!+l 9 + 9+1+9+5+}.Y ++}.T Y t.%+%+b+B a 8.r v B.,+%+>+ +].9+9+9+1+U y B '+t.:.^.)+A.H.@+y.$+$+$+$+$+$+`.U.U.U.*+V.N.y.O.)+|+!+f+m+m+:+3.f.#.#...o+o+#.}+:+=...o+m+..#.S.$+-+C.o.6+6+6+[+[+[.M.l.L./+i.q+d..+[+n.{.n.n.n.Y M q.j.j.1+d.I.y b+5.p.7+A.A.%+t.R.}.` H.}+)+Z { - - z & = 8 C g 1 i ", "I 3 { N.a a t k I.-+%+w k+V :.0+h+V . .6+<.|.1.t.@.=.=.n.3.$.v.f.*.=.f+>+O.* ]+F.Y X U U Q t.2+l+1+G 1+r ~+H.` R P.R.(+= z ( 1+1+l+5.t.t.2+2+3.e.%+O.Z q.k # ].I ~+2+R.(+X K t+6.1+j.]+S .+c '.'+o.G.A.=.^+r. +$+$+$+$+$+$+$+$+$+W.V.V.*+| $+O.^+^+!+}+m+o+=.....}+#.e+m+#.)+..:+:+o+y+..3.a+S.t.o.<.6+p+l.Y [+M.M.(+n.{+*.*.l.]+s.=.t.%+1.,.,.d.9+b+]+k v }.e j.V l.p.f.-.I.>+B.u.~+H.#.>+>.t $ 7 ~ & : % ] g h < ", "# @ t L t t d z P.Q.>+l+k+h+G.G.V d+ .[.{.{.{.1.2...=.=.*.=.2.v.#.f.{+1.m . q.q.F.W X s. .1.P.^+l+x.G 9+B r c.H.R P.P.k @+(+k p+8+[.[.L.L.3.A.>+-+z Q # b+k # ].b ` Q.P.++Q U ].9+b+q.b+k F.) ~+'.>.E.*.3.n./+M.y.$+W.`.`.| $+$+j $+$+W.;+=+$+$+_.!+^+P.m+........#.{+n+m+}+f+:+:+o+y+..n.#.!+S.,.o.D.p+|.[+[+[+(+A.3.A.(+i.z.B b+y {.3.L.A.Y A.,.y w y h >.h.y q.y a B -.*.#.p...H.b u.}+u.l 3 ^ 9 } ; x 8 ] p ] h ", "y e c f a N.W.m -+P.L.k+d+V 0+^.V d+ .l.-.{.%.1.=.$.#.*.=.z.=.@.,.n.{+{ . 6.q.q..+X X X ,.[.{ Y 5.B j.1+.+R u.-+J.P.!+B [+j+G w 8+j+j+h.n.g+M.# # ) @+6.]+k # N b H.O. +a+l.W U 9+q.9+y 9+b+k ` r '.h+=.3.=.>+-+(+g.y.W.j V.$+| $+$+$+$+W.Y.W.$+N.O.!+P.3+..#.#.:+#.s+e+n+..{+m+o+:+&.:+..{+!+S.C.;.o.5.l.M.[+-.G.a+)+I.-+i.k.G j.!.B l.}.A.%+4.3.C.1+]+y p+w.F.]+D n B+3...n.o+2+~+'.3.!+u.l y e ' 7 } 3 8 : p _ 1 ", "4 ] 4 0 J t j y.Q.P.%.k+ .D.0+p+d+w d+<./+-.1.G...=.=.=.v...:+2.,.@.-.9 >..+b+j.U Y u.^.G.B ].d.p+]+q.9+4+X ++J.W -.i.B -.j+w j+a p+k.z.g+X F.D y .+4+F.6.U .+I '. + +O. +L.h.[. .1+9+1+4+# S m.b r U L.{+3.A.S.m y._.y.N.$+$+$+<+U.Z.| $+$+$+ +$+y.@+2+!+....#...#.*...o+#.#.o+$.$.o+:+*.#.{+A.o.%.o.l.++Y I.2.I.!+n.M.W /+k.w ]+j.]+S }.4.p.}.4.A.-.w.k B ]+]+8+F.k [.p.u.>+..H.'+H.#.>+u.m 4 ' ] 5 ( E A : - c F ", "i g _ D # g s z g.^+,+k+[.D.0+V d+w d+h.;.L.1.0+..*.3.2...:+v.i.2...Q = B X b+b+Y u.i.2.,.N ]+M 5.9+q.1+1+Y u.M.[+1.^.a D.C.w k.w u+B+a+w.b+. P 9+]+b+]+.+R e '+5+ +q +O. +P.^.D.k+1+1+Y X ++R r r b (.A.q+{+P._.j V.V.H W.$+N.$+$+Z.Z.U.V.y. +$+y.$+-+#...*.3.....{+..e+..#.+...:+:+:+..3...3.D.h.<.l.M.M.L.u.^+^+n.B { 1.v.[.b+]+9+d.}.(+L.p.3+i.C.C.n q.y .+a F.{.n.o+H.R.t.` '+{+A.I.u.k < 8 o 5 & [ ] H j = g ", "] g = K K H ! m P.>+[.w h+:.v.d+k+w V ;.%.t.^.=.....z...:+v.f.2.=.=.[ ( M .+q.F.%+3+A.n.++0.b+6.G 9+1+1+d.Y ++(+{.%+1.w p+k.a ^.j+^.g+X ]+! ~ b+b+q.j.9+>.Q # Y S v ; q O.S.q P.:.:.l+G u.++X X _.~+b ~ [+3.*.)+@+r.W.Y.`.`.d $+y.y.$+| W.`.| W.$+$+N.y.!+#.........#...:+#.3+m+....o+:+=.....z.,.<.6+l.++(+A.%+)+A.n.9+y ,.z.<.6.9+F.e }.}.{.n.(+m ' a .6.]+y B F.M.1.y+p.` '+'+)+..%+/+4.m D I 5 & ; 4 ] ] - - % ", "g ] - , K % * >.u.)+X l+l.!+^.l+l+5+).B.%.t.2.#.:+$.....$.v.n.2.3.n.^ q 8+]+j.{ I.g+g+g+k !.b+9+]+x.l+l+5.,+I.,+^+%+L.k [+B+j+w.z.i.W ]+= 7 9+b+q.q.b+8+>.{ .+X V l+0 O + O.S. +t.6+E.k+Y ++M.Y '+ +~+~+{ {+#.A.++S._.| Z.`.`.`.d N.y.y.$+W.V.d W.y.$+$+g.*...........e+..........:+@.:+*.=...k.o.C.p+4.[+^.n.p.i.A.t.b+M [.*.k.1+9+F.e y k l.i./.> ]+9+x.[.n [.k 8+W u.#...~+` %+..{+L.L.X v e 2 u 3 ; 8 _ g / = 8 ", "g ^ & 1 i % ! Z ,+)+Y w ,+f+<.l+l+5+c.B.%.t.e...$.:+..$.v.3.i.2.=.{.- g.> j.F.&+|+a+/+L.# !.]+]+F.w w k+X ,+%+,+_._.4.s.C.u+k.w *.<.4+F.1 ]+]+j.q.q.b+n M 8+8+X Y d+l+0 I + O.^+,+3+z.v.-.(+u.X Q +r +. i.*.A.!+J.r.j Z.V.`.`.`.| W.| N.$+j W.| $+$+$+y.a+#...#.*.....o+e+*.:+:+@.m+..v...$.C.o.D.5.-.(+i.f.i.%+A.%.q.1+[.n.3.d.9+7.d.5+d.W f.j+) ]+9+6.D.z.-.k b+m ++*...'.'+3.o+n.t.)+R . 2 4 8 _ _ ; _ H f s % ", "4 8 ~ D ] = s r.,+p.H.U L.f+l.l+k+T B.t.%.1.$.:+:+..=.v.=.i.f.^.@. .m &+i+]+, (+|+a+(+X D ]+4+b+b+{ R Y L.u._.C+C+_.A.k ^.k.$. .2.k b+G+9+]+b+q.q.q.y Y m.B U Y Y 6+k+I e x q S.,+!+3+*.*.n.i.4.Y '+_.q +++*.{+*.Y K.l Z.V.W.`.V.W.| W.$+$+y.$+W.W.$+$+$+I.{+@.n.:+e+m+y+:+n+m+#.:+$.$.....n.{.<.l.{.1.-.A.I.{ m.p.{ q.1+[.i.@.G.h+V 1+a i.1.=.g+l.0 x.}.i.i.y b+]+r.-+@...~+` 3.e+v.f.3+^+- = + + 7 8 : } t f . x ", "F ; | $ g 7 ~ _.>+2+T U %+|+X l+k+Y B.B.B.,...m+:+$.0+$.2.G.G.3.*.U T.*+T.`.M.a+g+|+-+W D 4+k 4+]+{ '+r + ( C+ +Q.!+n.w.h.G.*.n.p+8+9+). .n 9+q.q.y S |.u.u.L.Y Y o.k+'.m.>.q q R.!+)+*.@.{+1.,.t.t.^+R. +'+{+*.n.%+K.r.W.*+V.*+W.| `.*+V.W.$+$+N.j $+$+$+O.I.n...:+o+e+m+o+..m+:+=.:+:+=...2.-.l.Y L.t.2.A.R 7.Q t.e q.1+w.{.*.n.[.1+j.s.{.=.*.g+{.|.g+n.g+2.p.f ]+u./+..{+'.r p.:+n.)+)+f+l ; b 6 & _ - } _ / 3 x ", "@ g = ' e $ ! '.t.2+'+T %+)+R l+k+<.2+t.L.n.:+:+&.=.=.2.f.i.=.1.n.(+_+*+T.*+(+a+|+|+(+W { 8+P.O.E+H+q r S.P.!+f+f+3+n.Y V ^.=.#.<.9+d+h+d+l+9+q.d.i.;.|.}.u.}.M.5.}.k+m.@+S _. + +,+/+)+..@.#.=.:.).P.^+R.@+3+@.A...J.r.$+*+X.*+U.*+V.X.Z.W.$+$+$+$+W.j $+y.g.3.e+:+o+y+y+:+e+:+e...:+$.:+..i.4.(+l.%+}.t.I.m.]+T i.y ]+1+M.(+g+2.G.7.q.w.{./+2.2.g+g+n.q+..#.t.++n U A.I.u.~+b t...*.f.2+#.>+8 5 6 ( 3 = & [ ] _ & ", "a f g , a t ~ _.^+2+` T 3+p.m.l+k+B.t.L.L.=.:+:+=.=.v.v.^.*.^.v.*.a+F.T.*+*+&+a+a+|+-.W { 1 q + +. Q.!+f+f+f+f+f+!+p.^+s.%.1.*. .9+d+d+h+h+1+y G G k+6+:.:.B.|.5.T l+'+'+Q l +q O.u.'+{+..&...+.e.Q.S._.H.{+*.A.*./+@+W.V.*+X.*+*+*+X.Y.Y.W.Y.$+W.$+y.y. +O.I.e+o+:+e+e+o+$.3.......:+$.=.{.(+|.<.t.-+)+Y >.q.X l.0 M n ^.2.-.L.A.n q. .2.;.B.,.w.g+n...=.{.)+++%.[.K.R.-+r b u...=.2+3+#.{+b u _ ~ c : x ^ i ^ & ", ") . ) , 9 ! ~ r >+>+'+'+7+a+U l+d+,.i.1.,.:+..@.=.v.3.k.$.G.z.@.{+)+m _+W.W.N.|+a+|+,+) { Q R.^+!+!+!+!+^+P.f+f+}+f+2+3+++5.i.=.s.1+h+d+l+l+1+d+d+x.1+x.1+x.x.k+d+6+h+}.u.Y _.z q r @+'.P.....m+m+&.P.S.'+H.e.#.A.n.#.Y ++r.N.$+W.W.$+$+$+=+$+$+W.Y.W.$+$+y.O.g.*.y+e+e+e+$.=.:+..m+:+r+:+v.,+(+u.<.(+u.!+Q { j.l.X { U D.y {.^.i.*.[.]+ .f.B.o.B.B k D.[.h.<.A.p.....W.J.'+r b t.*.:+%+f.n+#.Q._ ] % $ * = 7 4 ' 7 ", "o 3 , ' E - j q >+^+R.S.7+L.U l+h+t.,.;.=...$.$.=.=.3.:+:+@.....!+!+a+8+H N.N.a+a+g+-+k B -+q q ^+^+P.P.R.R.!+s+}+}+3+!+!+Q ;.@. .8+h+l+d+x.1+d+v+v+d+x.1+1+1+1+1+1+x.x.d+h+d+d+I r S.r S.....m+m+m+^+S.'+Y p...n.A...)+I.M._.$+N.$+$+$+j $+y.$+$+$+W.| $+y. +r.-+A+y+..$...:+:+:+&.r+:+:+,.(+(+u.I.-+u.f.5.y ' 1.l.[+2.w q.k n.@.*.l.k s.v.o.c.;.w 8+y k.v.#.#...../+y.~+'.r r 3.n.o+)+)+{+..f+z _ 9 ) = & ^ g 8 ; ", "o u i 1 > f . q P.,+R.S.{+L.d.l+h+L.:.t.*.:+@.&.=.n.:+e+:+..@.$.)+!+|+(+i+N.N./+a+a+(+(+8+-+C+C+~+!+P.!+R.R.!+f+f+}+3+f+P.!+w.=. .1+v+x.l+x.1+v+v+v+v+v+v+d+l+x.x.x.1+x.h+l+d+d+T Y R.. Q.*.m+m+y+m+p.,+Y T f...n.n.{+3.H.R _.=+=+$+W.| W.W.$+N.$+$+$+$+$+y.$+S.K.*.y+=...:+:+o+$.$.:+:+:+;.u.-+4.M.a+1.i.W .Q i.1.v.=.8+.+w i.2.2.{.k [.:.c.E...n.5.A.#.o+o+z+o+#./+'+r r b ++3.*.:+A.n.3.#.}+S.% $ f - & ^ ] A 8 ", "5 C 4 , D e . q R.,+,+R.{+I.l+l+<.L.t.f...:+&...r+..@.:+@.=.@.=.3.)+!+|+-.m y./+g+g.(+(+.+S C+C+C+!+R.!+R.R.!+f+}+f+!+!+!+!+^+3.p+.+:.x.x.x.x.h+v+v+v+:.:.v+v+h+h+v+h+v+v+v+h+o.o.h+R.+ P.7+:+m+m+m+B.2+m.H...*.3.n.n.#.++J.'.=+=+X.X.V.V.H W.$+$+$+$+$+$+$+$+@+g.)+y+:+:+:+:+$.=.:+$.$...%.(+(+(+u.n.A.2.l. .k ^.%.{.i.[.8+ .=.i.k.g+{.5.o.e.=.:+p.p.#.n+p.t.,.+.#.2+'.b b ~+p.i.m+:+p.3.n...{+!++ % % 7 ; [ ^ ] 7 ", "I 8 < y y c ! b R.P.P.>+{+}.l+l+%.L.%.3...&.x+$.:+n.$...@.n.=.....}+!+g+g+q+q+(+(+M.g+^. .4+( C+C+,+^+P.P.R.^+f+s+f+!+f+!+!+P.f+v.y v+l+x.x.h+v+v+v+v+:.v+v+v+d+d+l+l+v+h+h+l+x.x.x.R.I H.{+..m+m++.2+}.m.|.*.=.3.#.#.*.%+R @+W.X.;+X.X.W.W.X.$+$+=+=+W.W.W.$+@+O.I.y+:+:+:+=.$.:+$.0+:+@.4.}.l.(+,+n.%+2.i.C.4+ .2.=.2.$.w @.0+$.*.n.B+f.e.E.E.+.r+{+p.o.).H.B...p.H.b b ` ++n.n.y+=.t.=.v.*.f+f+S.3 @ ^ - [ = _ [ ", "] A g D y c + b ~+^+R.,+#.Y l+l+;.L.1.=.&.:+$.$.3.D.$...*.i.1.:+e+:+e+*.A.g+g+g+-.[+W {.(+a ].C+q R.!+P.^+R.^+f+}+f+!+f+f+R.R.P.#.1+0+v+x.l+d+v+v+v+v+v+v+v+v+v+v+d+l+h+v+h+x.x.x.x.R.. '+3+..m+m+}+}.m.T p.n.*.3.3...*.}+t.W $+X.;+;+X.W.V.X.=+=+=+=+W.V.V.$+_.O.-+*.y+:+=.$.:+$.r+0+:+=.4.l.M./+n.3.u.-.n.[.F.[.0+*.@.B+^.w+v.E.E.k.G.e.e.7++.3.E.}.c.o.` B.&.3.` ~+b '.R.3.g+:+:+v.f.=.$.e.{+f+P.. g [ V.H [ 7 _ ", "_ f f e n n + ~+~+P.R.P.}+T l+d+1.%.i.&.$.$.$.r+[.0+..v.*.A.A.2.v.$...e+:+e+@.*.n.2./+*./+w.U k R.O.!+^+!+R.^+f+s+}+!+}+!+R.R.R.3+ .V u+v+l+d+v+v+x+v+v+v+v+v+v+v+l+d+v+v+d+x.x.x.v Q.x ` {+..e.3.c.T T }...#.3.*.n.g+{+*.3.u.z ;+;+;+;+=+;+=+$+=+=+=+=+V.V.W.y.g.-+g+y+$.=...$.$.$.$.:+v.(+M.l.=.*.{+3.)+|+n.B p+e+e+e+*.*.v.B.C.V v.+.E.E.e.E.c.o.E.H.H.p.+.e.H.r '.r '+3.=.*.e+:+v.f.v...0+#.f+!+z 9 E H - } } } ", "x n a G e p r r +O.R.,+3+'+l+d+L.L.3.$.$.$.=.p+C.$.=.=.v.1.3.@.:+e+:+e+y+y+y+o+e+e+e+e+e+A.[.2.%.Y P.!+!+P.^+f+}+{+f+s+P.R.R.~+^+f.n u+x+v+v+h+v+x+v+v+v+v+v+v+d+d+l+v+h+h+x.x.` O.Q.x '+..=.f.Y c.T T *...@.3.3.^+%+i.n.#.4._.=+;+;+;+;+=+=+=+=+=+=+W.X.V.| $+J.@+/+y+$.:+=.=.$.$.$.o+,.l.X M.(+f.*.{+*.*.2.8+v.+.=.......$.+.:.:.B.E.e.e.E.E.B.R.Y o.e.e.v.++~+~+~+'+......:+e+z.A.f.f.:+=.#.f+f+@+J ] p t | d & ", "{ a a a D 3 b + $+r R.P.)+s.l+h+-.1...$.$.x+G. .C.C.=.$...o+o+:+e+........:+y+y+:+:+$.@.@.*.g+3.A.I.++^+!+^+P.f+f+f+}+}+P.R.~+'.P.{+ .D.$.v+v+h+v+x+v+v+v+e.p.c.5+5+d+v+d+B.` ` O.S.'+x Y e.v.B.%.T X =.n.=.n.=.2.>+^+>+A.{+p.'+Z.=+X.X.X.W.N.$+=+=+=+X.;+X.`.W._.@+^+@.y+..r+$.:+r+$.y+;.l.[.X [+[+1.3.#.n+*.w r+=.+.=.n+y+e.B.E.e.e.e.e.7+e.e.e.v+o.o.B.o.++'+r '.'++...:+:+*...z.n.f.g+@.:+*.{+}+P.) g p s s ! * ", "+ ! a e 9 7 : + $+q g.P.f+U k+p+;.2.:+$.$.=.D.C.G.C.D.G.@.:+&...:+:+e+:+n+..{+:+m+A+y+:+$.@...n.#.A.I.Y ,+f+!+f+!+f+s+f+R.~+r R.P.{+1.w @.u+v+h+v+v+v+v+v+v+2+` 5+d+v+d+d+R.O.O.q R.r . B.3.%.Y R o.#.:+z.v.2.=.n.p.2+t.A.#.3+W W.X.;+Y.X.W.$+N.N.N.=+$+=+X.*+Z.$+@+P.a+y+$.=.:+r+$.:+:+{.l.V V [.<.{.i.*.e+{+*.+.+.#.o+n+m++.e.+.:+e.7+e.e.e.o.).).).).T '+H.r '++++...$...m+@.i.z.{+n.n.z.m+*.3.f+^+{ < 4 7 s $ a ", ". * = ) 9 7 % - ( $+S.,+)+S k+p+1...:+r+:+v.[.$.;.h.C.D.D.k.@.:+....*.{+3.A.>+,+/+$.:+y+:+z.=...n.{+{+)+I.%+{+A.)+a+f+R.m.'.,+{+*.3.*.w.C.=.v+:.:.v+v+v+v+v+h+l+l+h+h+d+B.` O.O.O.` . m.f.n.3.f.:+@.v.v.v.0+v.$.=.p.2+,.#.#.)+@+$+=+;+X.*+=+=+$+$+=+$+=+;+X.X.*+W.@+-+,+:+&.:+r+$.$.:+:+l.V k+l+p+{.%.2.A.2.g+*.*.#.e+e+o+y+m++.r+n+E.:.o.o.).).T V Y '+'+` r '+>+m+@.r+$.@./+@.z.{+3.0+z.0+:+:+{+f+!+m < 7 7 . f ) ", ". 6 8 c = p g 7 s + S.P.3.d+k+D.G.e+x+u+v.[. .<. .[. .[.<.*.3.3.g+/+(+M.J.(+i.&+r.h.$.$.u+:+:+:+....*.*.#.{+{+3+g+^+H.R Y {+e+....@...*.[.f.$.r+r+r+&.v+v+:.h+h+v+h+d+2+Q.R.R.R.v r v %.A.n.$.m+:+:+=.v.k.v.v.$...,.W /+@+A.^+$+$+=+=+X.X.=+$+N.=+=+q $+X.X.X.X.$+@+@+O.f+:+$.$.$.$.y+$.5.d+l+l+h+;.;.f.z.n.n.n.*.*.*.*.B+z.=.E.E.3.e.e.p.).h+T o.e.}.H.'.r u.m+:+@.$.=.:+B+(+z.=.n.z.0+z.v.=.:+#.}+)+m.f / - 6 : 3 ", "6 | % f 9 f g = s j @+P.3.h+d+D.v.:+=.0+v.[.D.2.v.$.*.g+g+2./+M./.Q r.r.W u.(+/.r.k.0+u+0+:+o+:+z.0+v.v.z.=.*.{+*.*.#.{+z+..:+..$.*.=.=.2.1.p.=.=.$.r+r+:.h+h+v+v+v+v+e.2+Y ` v r v ++{+n.*.:+:+:+:+:+0+v.v.z.=.:+0+..I.r }+^+$+$+q ;+Y.X.=+N.=+$+y.=+q =+X.X.X.$+_.@+-+P.:+$.@.@.:+y+0+:.d+l+d+h+:.C.2.3.=.n.@.n+@.#.=.=.n.n.e.r+v.p.B.E.p.o.}.T '+` r ` 3.m+@...&.:+:+:+g.B+r+n.=.r+0+0+v.0+:+3.}+f+@+p H - x * ) ", "7 | 9 f p E 9 % & ( O.Q.A.h+d+D.$.:+0+0+v.B h.v.....|+g+-.W r.Z U U r.W -.4.Z Z X 0+0+r+:+:+:+..v.2.v.k.v.v.k.k...*.=.=.n.q+@...:+:+....@.=.2.n.*.....3.%.o.v+:.v+v+o.c.T m.v v T %.A./+i.n.@.v.{.M.-.^.G.z.e.$.:+=.@.@+I.{+|+O.$+=+W.X.*+X.;+=+=+=+=+$+=+;+X.;+X.@+g.-+g.3.&.:+$.:+:+0+k.h+d+d+h+D.,.,.=.@.n.k.w+*.=.*.#.A.)+3+3.3.e.p.Y H.H.T ` ` '+++p.:+:+:+:+$.$.z.[+[+B+e.n.0+0+=.v.v.0+..=.{+{+R.@ / ) 7 = ' ", "_ % f o c _ ^ 7 & + +Q.)+D.d+D.:+$.0+v. . .<. . .k k W M.M.W /.Z Z Z Z Z Z Z /.E.v.v.$.....v.v.k.^.1.^.2.k.v.v.k.=.:+=.0+v.2.v.v.v.v.k.n.@.*.@.=.n.=.....:+..=.:.Y T m.Y m.c.#.*.@...:+:+2.n.0+v.4.(+M.J.4.(+i.n.@.^+I.*.=.|+g. +$+W.`.*+X.;+=+=+O.W.N.=+;+;+;+;+V.y._.S.A.$.r+@.y+$.0+0+6+d+h+p+p+,.,.=.*...v.k...n.v.@.:+..#.=.=.+.=.+.+.3.2+3.....$.$.$.$.x+:+..$.&+&+z.n.3.3.$.r+0+v.v.z.r+$.3+f+,+B G a [ - 9 ", "i g p g ] 7 7 - - + +R.)+:.d+6+m+0+0+D.B >.w.C.[+(.Z r.r.r.m m m y.(.m l r (.[+k.k.v.0+k.=...v.2.^.(+W n.$.z.k.^.^.v...:+$.0+0+v.0+@.=.^.^.^.v.*.:+:+..*.=.n.,.G.:.;.E.o.1.v.0+=.n.=.:+e+m+:+o+:+z.M.z M.W l.-.g+..g+*...{+*.|+P. +q $+| ;+=+;+y.y.y.&+N.=+;+;+;+W.N._.@+a+$.$.:+:+r+0+v+:.h+[.[.p+C.G.3.=.=.3.f.v.A.v.=.:+:+y+y+o+o+..e.3.=.:+$.$.$.$.$.$.=...:+=.n.`.B+e.r+=.$.$.r+r+v.E.0+$.=.A.)+a+k { a a - } ", "1 h c g A 3 : $ . r z R.>+t.d+C.&.=.:+ .s.g+j+{ ) k m y.m t t j t j N.s . + l 1.v.k.$.=.=.:+=.,.++-.C.h.k.r+....$.k.2.2.2.n.0+0+0+$.:+k.h.^.G.G.v.0+v.n.=...@...*.f.n.....=.z.G.k.v.^.1.0+0+0+$.$.$.^.r.M.Z [+[+g+#./+A.n+{+#.*.{+>+@+y.$+=+;+;+;+=+y.&+&+W.X.X.=+W.W._.@+>+:+$.y+r+u+0+0+:.<.l.5.6+;.E.v.=.=.3.3.f.M.A.n.$.$.:+:+:+..:+$.$.$.$.$.=.$.$.@.+.=.:+=.$.&+B+z.0+v.$.0+$.e.0+0+i.0+$.0+v.a+A.S k ) a * A ", "4 D 3 3 5 x : ; x { . '+>+2+V v+@.:+n.U (+(.t t m m m _.N.t t t t H j z r s W 2.,.$.:+i.v.v.G.. { { r.W h.G.z.@.{+(+r.N.y.r.W {.0+:+o+..G.G.k.0+0+0+,.M.%+,.t.1.1.,.n.3.2.q+n.n.v.0+v.k.^.2.v.k.v.v.0+=.(+(.w.Q i.{+A.#...n.A.A.a+f+{+^+_.$+=+=+=+N.N.N.N.N.W.=+X.=+W.y.&+,+:+y+$.0+r+u+r+0+^.5.5.<.<.e.7+3.=.3.3.3.y.(+n.3.v...&.$.z.$.r+$.=.$.$.$.@.#.=.e.=...v.n.-+n.:+v.=.r+$.r+p.v.v.v.v.$.=.k.)+f+'+k { / : f ", "/ f E 6 8 7 & 7 } ! . _.^+!+D.$.:+..p+U /.r.m z { d `.#+`.`.i+i+_+i+c+= / { {.G.^.2.=.3.z.v./.! / > t j (.I.q+i.W m z { m m r./.-.@.:+0+0+0+v.0+z.%.M.p.M.r././.r.r.L.i.(+L.W Z h.k.k.v.n.k.G.k.G.k.0+:+0+j+k z n.^.{+n+@.n.g+,+I./+>+3.a+@+ +=+=+=+N.O.=+N.N.X.X.X.;+N.r.P.:+y+$.0+0+0+$.0+G.6+<.).<.e.3.3.=.*.n.n.(+_.J.*...z.0+=.$.r+$.=.$.$.$.@.=.=.n.0+..n.(+&+-+f.:+e.z.$.=.z.E.n.r+v.0+=.w+k.)+)+J.z t a $ % ", "^ @ [ 7 7 7 7 7 ; s z l P.{+C.=.i.2.U m /.m j z j } #+> #+j H } t+_+C > #+U <.<.G.<.w.2...n.r.s * ! j m K.g+g+g+/./ > j -.I.&+-+g+A.[+w.v.0+z.r+{.r.t.i./.Z Z Z r.W i.-.p.Q m z k (.(+1.v.k.k.G.2.G.0+:+v.v.[.Z q+ .z+3.:+z.i.(+,+(+,+/+3.!+P.@+=+=+=+y.y.=+=+;+X.X.=+=+_.g.:+:+0+0+z.r+z.$.v.D.<.<.<.,.3.e.3.=.3.2.^.W. +@+..o+=.$.r+$.r+$.=.$.@...$.=.=.=.z.3.N.T.M.n.&.z.$.=.=.=.f.f.0+z.0+0+:+v.i.!+,+(.! a * } ", "1 1 1 _ 7 7 7 : ; ~ y.l R.f+e.f.B.-.' (.m j m r.@+r.K._.s 4+8+1 #+9.D+t { Q l.<.{.W U { . m m m t z r.M.I.g+M.r.E H H @+(+K.&+I.M.++/ / j+C.C.{.l.&+/+-.m t m m r.i.g+i.[+(.(.(.k . . m /.<.G.k.v.k.$.r+v.0+0+0+ .1.{+@.n.v.i.(+I.a+/+i.n.{+!+!+g.$+=+=+ +y.y.W.X.Z.X.=+N.@+..$.$.0+v.0+$.z.0+v.<.D.o.:.e.n.v.=.=.f.2.W.j '+)+*.i.=.=.=.$.=.$.@.$.$.=.=.$.=...q+N.`.,+@.3.=.=.$.=.=.%+p.n.z.0+0+:+r+,.)+^+l . a a ) ", "F F F 5 6 & 7 * * - z l R.n.3+i.,.Z D m t t $ ~ j j @+a+a+{.-+> } E+t+> L (.Z m m m . + ! - $ t t r.a+I.++J._.r.m J.(+I./+j+[+I.M./., K K i+a Z /.Y /+{.! i+t+[ P.-.[+-.(.s.s.U a { t E+i+t w.D.k.v.:+k.G.v.k.p+k *.*.z.u+u+2.i.^.k.k.1.I.%+{+!+)+P.$+=+O.y.y.j *+X.V.=+$+@+*.:+0+0+v.r+$.r+=.v.;.<.D.;.3.v.v.=.=.v.2.^+ +'+i.-.(+p.*.z.*.@.*.=.*.z.=.=.=.o+#.g.N.N.i.=.*.=.r+0+=.=.2+%+v.r+0+0+&...C.f+!+'.. # 4 x ", "C C F u u & 7 . - | z '.'+)+=.e.U ' J > #+i+4+i+J y.P.A.q+a+)+h U.T.t+i+i+i+#+9 t s s { t . t / t J.,+y.y.y.y./.z I.(+r.r.(./+r.-.m t t f K t r.h.i.[+m H > $ r.1.1.1./.(.m k e ) t t H E / a { .^.z.G.2.G.v..+W {+{+v.$.$.$.=.z.{.(.m Z _.H.A.!+)+^+ +y.O.y.N.U.*+X.=+=+O.n.:+$.0+v.0+0+0+$.v.,.<.<.;.v.3.e.v.0+v.v.3.>+g.1.M.@+i.n.#.*.*.$.z.z.0+=.=.....g+B+y.^.M...=.r+z.$.=.=.i.p.v.0+$.r+$.:+G.!+3+'+. D u 2 ", "u C C 8 ; 5 ; ( $+( r '.'+t.=.5.4+4+i+#+P 1 i+K +R.A.e+..{+(+i+H #+_+_+t+t+t+_+4+t+i+8+, # ' > E m a+@+y.l /.Y ; r.(+#+i+m U > W s t t m Z (+1.W (.m t E $ (.i.[+i.[+(.{ , t+t+t+i+U.#+E+K ' , ) (+M.<.^.W ++4+l.)+B+B+z.g+g+M.r.'.m t t (.r.@+,.)+!+,+O. +y.m `.`.*+=+=+y.A.y+=.0+v.r+r+0+$.v.G.<.<.;.E.=.v.v.v.v.n.{+|+M./+-._.-.-...s+q+n.n.v.z.=.=...g+i.M.&+-.W.i.@.v.r+0+r+=.A.v.z.$.0+$.r+:+0+>+f+J.l 1 < 2 ", "C u < @ 7 ; 3 * ( 6 + '.H.u.2.# ' , D+i+, ) /.^+a+{+e+G.k.#.Z $ y.G+9.H+F.t+i+t+4+F._+4+4+i+t - #+> Z -.(+&+}.(.j (+U i+K / > [ z t z s.s.U { a > $ { m { z -.(+/+g+(.i+t+F._+a._+_+_+_+t+t+E+K @+w.j z { J.z P w.:+n.z.k.(+M.K.(.m m . { * 6 j _.t.n.|+-+ +y.&+&+V.*+X.=+$+f.o+$.r+v.0+0+$.0+z.k.<.<.C.E.3.v.G.v.f.n.t.^+M.i.2.'+-._.i.|+q+A.i.n.3.=.*.=.-.++u.i.`.U.&+@.v.v.$.r+v.f.v.0+u+u+u+0+:+=.L.f+P.z = J 0 ", "C C N 9 _ 7 = s ~ + + v ` u.a a B d i+i+K > 4.{+f+)+=.C...V 4+, K E+E+9.4+4+4+t+8+i+i+> > i+U.E+i+i+[ l M.(+r.H H m i+i+K J i+i+#+> H t / i+t+4+t+t+i+t m Z a+/+i.(+{ , i+_+a._+b._+i+_+_+i+H y.(+m [ m K.t / # [.$.0+=./+&+&+&+_.m k . { % E+[ s y.,+A.f+g.y.y._.&+*+X.$+$+1.:+:+u+v.r+0+r+z.$.v.|.|.h.,.=.n.f.v.f.3+u.J.N.i.L.M.2.J.p.@.f.i.f.n.=.n.n+f.W Y I.2.N.U.y.@.G.E.$.0+v.v.v.v.v.0+$.$.$.:+2.)+>+Z ) 1 i ", "C ] 1 _ x 7 s - | | ~ r ` u.w.8+a ) ~ i+i++ P.e.}+3+f.v.<..+4+4+8+8+B Z * 8+h 4+t+t+i+8+i+i+`.<+j P z y._.m m z j j j s y.m t K i+#+#+> d ~ ^ K i+i+#+E ! m &+M.Z t = > i+t+t+t+b._+_+i+i+j z W r.d | _.z / d.w.p+z.0+*.M.Z Z r.Z l z . { > i+U.> H q Y f+*.-+y.N.O.j *+W.$+(+*.:+r+0+r+0+r+r+r+v.<.5.<.{.z.=.f.v.n.p.`.U.N.-.I.2.t.-+i...#.f.n.3.n.n./+h./+R Q.=.[+`.m e+,.G.r+0+v.v.v.e.v.v+r+:+$.o+$.a+!+r.! K H ", "E E [ _ ; s L L L j t . l Q.^+h.# .+D E+E+b ~+P.}+s+..k.[.e 8+a <.f.3.%.%.4.4.1.e * { ' k a f t , 4+$ z > j z H z + +q q ++ 6 E+E+c+[ 9 f / #+#+E [ #+H z t t t t 9 > i+t+t+4+t+i+8+a r.r.s.{ s = * k w.k.:+$.n.$.z.v.m m a (.(.r.s { [ i+_+i+H > [ | @+3.{+g.$+W.M.V.V.j r.i.:+r+0+u+0+z.z.r+v.l.V <.{.f.=.n.v.3.-.U.N.^.2.,.H.O.'+y.%+'+a+/+A.A.y.U.j+i.%+f.=.2.j+s.$.,.E.=.G.E.e.e.r+0+u+0+:+..:+:+A.{+S.j } > ", "F < h E = j j H t / ) k l H.,+7+2.a 8+P 8 b ~+u.f+e+..0+e y # n.....#.^+Q V n.#.A.,.{.{+*.s+g+k 8+R m , .+D # l . m . { (.'.@+'+@+_.l ~ E E t `.#+#+E+H j j ! E i+i+i+i+i+t+t+_+t+#+m r.r.k m Z X i.*.#.o+:+=.=...0+v.W i+8+K z m r.m #+t+t+t+i+L Z , ~ z r. .n.&+V._.y.V.`.| ,+m+$.z.0+z.0+0+r+2.W V o.o.,.=.3.f.3.n./+&+i.2.2.'+q T. +I.@+&+g.K.{+W.T.&+-+=.=.$.&+[+^.@.v.v.=.,.v.r+r+0+0+0+0+$.m+$.o+{+*.,+z , H ", "P O .+D # - W.H e f $ * v '+Q.f+=.,.l.8+1 z @+R.q+e+m+..[.# .<.l.;.f+!+l t+# s.X u.Q.P.,+>+a+P.l Q.,+-+l (.@+(+a+P.P.Q.P.R.g.R.S.S.R.P.Z <+{ #+`.`.i+t+t+_+> E f i+i+i+i+U.i+i+j r.&+m # j+3.n+..:+..n+..v.v.$.$...n.* t+H+_+8+t m &+H t+i+m m { @+M.J z . e 2.2.z N.g.W.*+V.Q.:+$.=.z.0+0+0+0+o.[.5.o.<.C.*.=.v.n./+N.(+2.f.G.3+&+W._.L.R.(+&+a+g+-.g+J.,+$.=.$.k.g+A.*.f.=.r+v.v.0+r+u+0+0+0+0+:+:+:+{+{+,+l # J ", "N O .+4 y > | 7 g - * a { '+R.a+#.%+i.l.4+. -+X |+n+:+:+:+e 2.2.X >.(.m.R . 1 F.E+1 ' .+, P ' U n.#.*.*.*.{+I.P.^+>+!+)+)+f+3+a+>+^+,+-+,+@+/.B j } E i+i+_+t+i+K # H ^ > i+U.> { t a # s...m+:+:+:+*...@.*.0+v...$.n.@+i+b.b.t+i+j _._.r./+g+/+/+-+r.&+h m ' k *.w.t -+=+*+*+g.{+:+z.0+r+$.0+r+^.<.-.%.%.,.=.=.3.v.`.W.j+/+2.i.3.2._._.f.t.i.(+g+(+g+n.u.n.3.=.=.v.z.&+N.&+z.=.v.v.r+r+z.0+v.v.0+..:+=.#.{+!+K.! h ", "F M y y y h } = / a B a . '.R.^+#.*.%+L.k a Y W |+n+:+o+v.B n+f+a+z l (.B k k ' 4+c+= K 8.t+1 i+].a z ~ [ ^ E+/ { f ^ = { k { % K K K j 3+..*.g+B j+P.d i+_+i+t+_+4+8+K i+i+i+> k j+s.p+o+o+:+z.&.@.$.:+o+:+=.0+0+=.g+_.H b.H+H+_+> J.^+g+i.%+g+g+)+/+@+z h f .+v.-.m g.$+Z.*+@+f.:+0+0+0+$.0+$.^.l.1.i.1.{.3.=.3.A.M.y.^.n.f.,.2.=.p.@+f.f.2.1.i.y.&+..f.3.=.=.3.,.^.[+g.^.z.v.e.e.$.$.0+0+v.v.v.v.m+=.=.{+A.-+'.< ", "8 I x.y 4 K ] x : * o = : Z R.P.{+{+*.A.1.) m.M.|+n+:+..$.z...%+-+m Z @+@+(.B B e # P } ~ } E+8.F.0.F.]+F.F.8.i+8.6.F.F.F.6.8+# * . /.I.f+..n+A.-.# a m j j 4+i+4+t+4+i+i+i+/ { )+#.m+:+$.z.&.:+@.$.$.:+y+y+:+=.$.n.&+_.j t+_+_+_+Z -.g+i.(+M./+a+a+a+%+g. +. , .i.Z @+ +*+*+_.p.:+r+0+0+&.0+x+o.5.L.1.;.{.v.=.n.2.N.N.M.f.2.L.i.n.A.u.I.t.N.U.&+&+&+/+v.3.=.=.v.,.2.g+^.(+z.v.e.0+r+=.r+r+v.E.v.v.=.=.#.f+f+Q.S.4 ", "E @ y O o 0 F _ ~ 6 - H $ z R.-+3+{+{+z+/+k m /+*.3.:+$...:+e+{+,+m 3 ; z _._./.q.!.4+.+f f 1 F.0.F.F.4+8+8+6.4+4+8+# e B B k U U [+I.,+)+*...e+n.-.B 4+4+) j / _+_+t+t+#+} L.^+{+m+..r+0+0+v.0+$.v.$.@.:+o+y+:+..i.@+_.z i+i+i+U h.-.i.-+M.i.g+,+@+O.-+g+!+a+>.w.A.w.r.@+*+*+z %+:+r+0+:+:+0+x+o.5.;.;.%.%.2.=.3.2.-.y.N.k.f.4.%+i.g+a+A.N.T.N.&+-.-.-.#.*.=.=.v.v.f.i.&+&+B+v.v.0+r+0+0+0+v.,.E.v.r+e.=.#.{+^+R.+ ", "> ' e O o 2 % 9 ; + = = $ z R.R.>+z+q+|+{ { s.{+#.A.:+o+=.e+o+%+-+u.R.z + y.@+_.e ]+q.~.4+6.4+# a a a a * { a B B a U s.U s.s.j+X u.4.P.I.*...e+o+:+g+[+B 4+' &+! t+t+E+<+l a+|+..$.0+0+0+r+$.@.&.@.&.@.:+$.:+..z.%.@+-+@+[ i+H g+-.M.K.J./+M.t H j q _.@+a+a+P.g+*.[+y.g.Z.*+y.t.:+=.0+:+$.0+$.;.{.;.;.%.%.,.=.=.v.I.y.N.2.f.4.i.L.(+a+A.U.T.[+g+2.2.(+e+..=.n.,.G.k.i.M.B+0+v.v.0+r+0+0+0+v.p.f.v.v.v+=...}+)+Q.z ", "g ' P M C [ 3 % _ + ~ ~ ! z @+R.I.*.z+s.a ' 1...n+B+#.:+..=.e+D.(.z @+P.S._.j+r.% s.j.q..+{ k B { a a e # # e a B U [.4.-.M.K.P.u.%.(+++-+%+@.:+y+o+:+f.n.i.U .+# ! E+<+<+@+!+*.*.v.0+n.n.0+@.$.v.G.^.$.@...$.:+C.<./.g. +H } @+g+,+l _.(+Z #+#+i+E+E+6 ` M.P.a+*...L. +S.X.*+z i.n+$.0+:+$.$.&.,.<.{.1.%.{.h.=.=.n.I.N.(+i.f.{.1.{.M.%+q+W.N.B+2.r.M.*.:+n+*.A.L.1.,.*.-.$.v.G.0+$.0+0+v.0+r+E.E.v.v.e.r+n+3+}+P.l ", "g ' h P F < C c 7 6 : $ $ x '.S.P.#.[.B ) U *.q+n+g+{+o+n.v.:+D.{ ~ j +@+M.w.W @+ .]+j.# U k { { . ' # { Q M.l.-./+-+-+-+P.u.++g.X (+++,+I.f...o+y+..=.@...*.n.s.4+- q ~ ^+f+#.z.=.v.0+$.@.0+G.;.<.[.h...w+y+:+k.S (. +q j @+a+A.r.t { Z [ / { w.M.Q >.l &+-+!+%+n.3.O. +*+*+j L.e+=.=...$.:+$.i.<.{.%.%.{.|.=.=.n.,+y.M.%+2.L.m M.1.I.*.g+[+t 2.&+N.B+#./+T.&+i.{.;.k.@.$.G.,.0+0+0+0+v.0+0+E.G.v.v.v.v...3+{+a+r.", "g J ' 1 D # D * = u b I p * . R.-+3.k s.<.q+g+A.z+3.....=.@.$.h.#+} `.#+} - U /+u.F.j.!.a { s j W.y./ d M.%+I.(+-+g.-+++(+,+++J.g.K.[+u.4.I./+@.#.y+:+z.$.n...#.)+' l +l a+*...z.$.$.:+@.v.h.l.w.[.l.-.$...:+y+:+w.Z z q z ^+a+/+{ .+z z { /+w.X a+-.4.s.z S.J.>+L.{+@+X.Z.V.V.1.:+$.0+w+&...$.i.%.;.%.%.{.{.3.=.3.(+y.&+a+f.i.U.N.i.A.|+q+T.T.g+[+r.f.:+z+N.T.&+-.%.-.N.-.^.;.v.u+0+0+v.0+r+v.G.v.v.v.v...{+2+f+H.", "/ ' , h O # h % 8 x u x I x . Q Q.%+*.>+)+a+/+g+s+a+o+..:+*.v.C.K `.<+i+E+^ m -+' j.j.]+k ) H `.> m . - K.p.Y J.M.Y L.%+i.%+I.I.,+^+t.t.-.I.L.@.*.n+y+$.z.0+v.$.@.k k '+l P.#.#.$.$.$.$.0+D.{.D.p+{.{.<.^.w+:+:+$.=.U { r.@+a+f+w.D h y.s j * w.g+!+g+/+k (.^+l 1.I.{+M.X.$+Z.Z.%...$.r+$...=.=.f.h.%.{.{.%.%.f.=.=.,+N.&+I.n.i.&+(.2.%+^+*.N.T.-./+(+3.o+z.&+N.T.-.4.G.-.j+D.;.G.0+v.v.v.G.0+0+E.k.v.v.v.#.}+>+{+,+", "9 g ] K 1 K , ' % c 3 : x c . (.P.I.*.1.f+*./+z+f+^+..:+e+v.k.D., <+} c+K ^ ~ _.(+!.j.F.k # #+W.E P , , J.p.-+J.(+l.{.4.u.Y &+K.M.Y (+[.{./+i...@.#.e+:+z.0+0+$.0+U 4+Q Z a+{+:+..:+..0+G.C.D.[.[+[+[+h.h.@.$.:+A+:+C.U { Q >+*.U 8+8+&+) t [+a+g+!+!+Y ' r.^+W [+u.{+(+y.X.Z.Y.%...$.0+=.:+2.#.2.%.{.{.{.{.%.,.=.=.(+&+a+,+v.t.y.`.-.I.-.i.n+&+g.^.f.*.#.2.-.g+*+j+L.;.y.l.,.Y c.E.v.0+:.G.0+0+v.k.v.v.v.#.#.!+3+3+", "^ g 4 ] 1 K / 9 ' ' _ ~ ! f x v H.I.{+%+)+#.{+g+>+^+|+:+=.k.k.<.t #+[ c+E+#+z ,+D ]+F.~.U 4+K j K 4+> 8+@+Q.R.Q.I.i.i.i.A.n.f.i.A.A.^+2.n.A.)+)+=.@...o+:+z.0+$.0+z.[+8+s.{+n+:+$.@.G.l.[.[.p+j+l.l.[+l.{.0+@.:+y+y+:+[.k >.h.3+k 4+) k Z X ^+a+!+a+I.a (.,+^+%+S L.../+u.$+X.Z.Y #.&.r+=.:+,.*.f.{.%.{.%.%.;.,.=.=.-.N.N.-.n.t.N./+i.1.>+I.g+z+*.2.f.n.n.%.B.L.(+N.{.<.k.W o.T ` E.n.z.:.D.0+0+z.v.0+e.v.=.#.)+a+}+", "9 g g K 1 K [ g g g 7 8 2 c * { Q 1.A.)+)+n+#.[+k !+f+2.Y %.E.w.~ E+E+c+#+> m /.b+]+!.!. .8+K H y.U ) i+Z a+2+3+i.i.%+/+^.2.i.L.L.L.I.-.h.L.{.^+*.{+..{+o+e+=.z.=.v.v.k k n+o+w+v.$.[.l.p+[.j+p+[+[.[.{.k.G...$.o+:+:+:+ .d.>.g+s.# ) Q /+a+,+,+a+-.' W @+,+!+A.[.i.:+1.,+ +;+Z.J.*...r+$.:+i.3.n.%.{.%.%.;.%.;.=.=.i.&+&+2.v.1.++-.2.t.B.t.t.*.#.n.^+I.i.}.}.@+g+N.-.(+;.N.X Y ` f.n.=.:.V v.=.*.v.v.r+v.e...A.>+}+", "H [ 9 H E K , D h 1 ] g ] 2 { }.Q u.!+*.A.#.n+[.k %+)+D.@+f.v.Q ( V.U.E+G+, / z +l .+j.) 4+> t ,+2./+-.g+)+I.u.u.++g.@+j+l.u.(+l.u.u.4.(+[.[+-.*.*.@.*.e+:+o+e+e+=.v. .U e+y+v.k.k.D.[.p+p+D.^.^.C.^.-.(+{.@.=.:+:+:+:+=.w.k U l.s.s.a+!+^+O.z * / Q ^+a+!+!+i.S i.=.^.,+ +=+X.j n...0+$.:+f.2.n.{.{.;.1.1.1.L.=.=.v./+-.%+2.^.r.&+-.,.t.t.t.a+q+3+I.y.p.B.}.Y )+/+{.<.;.l.%.T T p.=.3.6+5+f.z.0+v.v.v.v.v.#.3+^+f+", "d d E 9 > > # y h 1 ] ] g 4 x S t.%.^+#.{+#.{+-.e J.M.[+@+E.v.u._.( c+E+E+i+, z +_.k !.4+4+{ t (+i.@+-+I.%+I.u.P.-+-+H.X [+(+|.l.4.4.(+j+w.[+l.L.*.*.@.*...e+&.0+i.n.^.D.o+:+v.=.z.k.k.k.C.h.[+<.l.[.M.}.[+v.@.:+:+:+$.:+:+n.=.*.L. .U 1.!+^+^+,+^+!+!+,+Q.,+[+|.f.v.e.u.R.Y.;+} n...0+$.&.n.,.=.L.{.C.1.1./+;.n.$.n.j+&+L.f.h.N.W.r.^.L.t.%+`.&+g+u.z ,+L.r.M.)+,.l.5.6+,.,.T ` E.=.=.h+w :.v.v.v.v.0+v.E.#.{+I.!+", "7 H ] ] / , D e y K 9 ] g 4 x . '+p.2+{+#.#.f+f.e z J.Q r.^.W z K.Q. +F+P i+i+( + +Z ]+F.8+m (.2.A.-+M.-+-+-+Q.%.u.g.M.M.X (+L.(+4.l.W M.[+[.4.-...{+*...n+=.0+n.f.i.2.+.=.G.k.$.B+0+D.w.[.[+[.[.[+[.}.}.l.h.$.=.:+$.:+:+:+:+..v.=...=.n...#.f+!+,+R._.O.u.4.[.1.,.v.r+I.J.=+Y.j n...0+=.$.*.1.=.L.%.;.C.1.1.1.v.*.3.f.2.,.f.2.[+y.&+^.L.t./+T.(+,+@+V.g.I.-.&+A.|.5.5.5.C.c.m.'+v.=.=.V d.{.G.e.v.v.0+0+E.#.}+t.^+", "^ _ 9 [ ' ' 1 D ' h ] A o u 2 @ v R p.#.#.#.}+*..+m J./.s.Z ~ - 6 + @+@+x , #+r + +Q F.]+8+(.s.{+1.-.I.,+++-+-+%.++J.M.l.(+v.*.=.n.2.n.B+n.n.z.0+{+*.#...*.=.=.=.z.n.v.=.=.n.k.[.s.h.C.[.[+[.w.[+w.[.l.Y [+w.0+=.=.:+:+$.:+..n.=.....@.i.t.n.n.=.f+^+>+p.<.[.p.,.2.v.v.,.g. +X.W.f.#.0+$.0+..1.*.1.%.{.%.;.t.t.f.$.3.f.f.2.1.1.(+N.[+g+L.t./+N./+P.y.*+@+,+N.-./+X 5.5.6+C.}.T ` v.=.=.V S {.^.G.v.k.0+0+G.=.#.>+,+", "^ 7 ^ > > ] 1 h F ' ^ ] A I 4 @ n m.R A.#.#.%+g+a s.P.P.r.. - 6 6 ( | . r.W @+ + +q ++]+F.8+m l.2.1.1.1.L.,+P.I.,+Y (+(+[+l.i.G.>.k # a k >. .W p+l.-.=.#.{+3+@.@.=.2.n...i.,.{ t { .$.h.h.l.h.C.C.^.1.i./+^.^.$.v.z.$...:+v.=.:+$.:+:+=.v.2.G. .[.p+[. .p+v.v.v.k.v.v.2.++@+=+=+%+..r+0+n.=.i...f.;.<.5.{.;.%+i.$.0+0+v.i.4.&+&+W.&+2.1.t.,.[+&+S.R.W.y.>+`.(+Y d+).h+6+<.|.Y ` v.=.=.V V {.-.}.Y C.v.0+0+3...%+>+", "e _ ] K A 8 g J ] 9 ] ] A 8 2 x B k Q 4.#...A.i.a .Z a+^+-.++m 6 } } { ! t Z R.O. +R.F.F.8+{ -.L.-.1.-.u.P.u.I.I.L./+-.i.2.n.2.k 4+f a t ) f 4+4+D U W w.<.^.C.G.G.^.r+f.i.&+y.I.^.p+$.=.n.2.G.^.^.1.t.L.I.I.-.h.$.=...z.r+v.3.p.C...e+=.0+0+v.0+C.<.D.2.k.v.v.v.2.v.v.k.-.-+q =+P...=.0+e.n.3.=.=.C.<.5.<.%.1./+=.r+r+v.t.h.&+`.`.(+g+L.%.B.1.O.-+S.W._.(+T.-.V d+h+p+D.<.<.Y T :.e.v.h+V l.L.;.m.c.E.0+v.0+n+2+,+", "' 9 ] c x . x g ] ' J ^ _ % 3 m <.p+W Y n...*.{+s.s.{ a l.{.J.1.}.z - $ s . + d J.S.Q.8+' .+k g+-.1.2.k.)+A.!+p.A.f./+/+(+<.(+ .4+t { -+(+(+,+(+&+U w.Z j+w././.u.=.G.2.1.-.y.r.M.X 5.*.2.[.<.[.[+[+[+Y J.W M.[+<.n.@.:+0+$.=.;.{+<.e+e+*.=.r+=.e.v.2.2.v.v.v.v.v.2.v.0+v.1.-.@+=+P...=.0+z.f.=.=...^.{.G.<.1.L.1.&.$.r+=.,.|.l.M.N.(+2.t.,.B.T ,+Q.^+ +R.[+y.^.V k+D.6+6+<.o.c.).,.v.G.[.V l.{.%.H.` G.0+0+v...A.t.", "g ] k z.u+0+u+k ] * 9 s . . & { v [.%+p.n...#.{+V w.[+! 4+B .j+M.I.l.m Z R ` | } P.0+0+0+k U n.i.2./+-.L.0+,+4.I./+I.-.M.w.w.{.' > W.j $+r.0+&+r.D.0+^.*.{+g+r.r.2.$.0+=._.y.y.@+'+m.i.0+D.C.G.^.^.-.{.{.-.-.i.1.f.i.=.@...v.0+*.<.D.e+:+0+0+0+=.f.v.v.0+v.v.z.v.,.k.v.v.1.L.g.;+R.#.$.z.v.2...=.@.G.%.{.<.<.%.2.0+$.x+0+v.|.1.z.(+++n.u+0+0+h+O.Q.,+-+N./+g.C.V h+u+:.<.<.o.c.).v.v.:.h+d+5.o.%.H.'.}.0+v.E.n+3+^+", "^ k =.q.q.q.q.r+s.$.U u+0+0+/.0+z.0+X 0+0+0+..i.<.2.0+)+0+0+z.V 0+0+0+i.0+z.z.r._.0+q.q.q.0+0+..0+1.{.1.0+q.0+(+%+0+g+0+4.X ^.e 4+t j j z z.q.0+(+0+q.0+@.$.2.a 0+A.0+q.0+r.r.j+[.r.(.4.z.z.C.h.-.-.1.^.v.0+=.0+2.<.,.4.$.$.0+q.0+{.d.e+0+q.q.q.0+A.v.0+v.0+=.0+z.2.v.k.2.2.1.M.X. +z+=.0+v.n.=.@.3.v.;.{.5.<.,.0+q.0+0+q.0+f.0+q.z./+u+q.q.q.=.r+S.Q.(+-+/+,+<.p+u+q.0+o.o.o.c.o.E.E.6+d+d+h+{.;.R '.` G.0+f.#.{+>+", "s $.!.u+0+0+0+!.$.!.u+!.!.!.u+!.!.!.u+!.!.b+0+..2.0+!.u+!.!.!.$.!.b+!.0+!.!.!.$.-+z.!.u+0+0+!.u+!.u+p.p.0+!.u+1.0+!.u+!.u+(+1.[.F.s z y.y.r+!.b+0+!.b+0+k.*.w.r+!.u+0+!.u+&+m j+[.&+l 4.z.$.2.{.[+Y l.<.0+!.u+!.u+l.v.n.C.G.0+!.u+5.s.0+!.u+0+0+..$.0+=.0+=.0+!.0+=.n.k.k.=.n.(+y.O.#.$.=.n.3.n...v.=.,.;.o.6+G.0+!.u+0+!.!.u+!.!.u+&+z.!.u+0+0+!.r+i.L.-+P.%+l.D.0+!.u+C.%.B.B.:.:.6+d+d+d+D.B.{.}.'.'+%.0+e.#.#.2+", "{ u+~.0+~.~.u+~.0+~.0+~.u+~.0+~.u+~.0+~.u+0+o+0+0+0+~.0+~.u+~.0+~.0+~.u+~.u+~.0+|+0+~.0+0+~.~.~.u+3.0+0+0+~.0+0+~.~.~.u+A.0+0+0+5.$.0+0+-+0+~.0+~.u+~.0+0+0+0+~.~.~.u+~.0+0+-.r+0+0+M.0+0+0+0+0+/+0+0+0+~.~.~.u+2.0+0+n.0+0+0+~.0+$.w.u+~.0+..0+0+0+&.0+0+0+~.~.~.u+0+$.0+$.0+g+r+r+0+0+0+=.*.0+0+0+:+0+0+0+f.0+0+~.0+0+~.u+~.u+~.0+(+0+~.0+0+~.~.~.0+0+0+>+0+0+0+0+~.0+r+2.0+0+0+v.$.u+u+C.0+u+f.0+r+0+B.0+0+0+..>+", "* 0+a.0+a.u+0+a.0+a.0+a.a.a.0+a.a.a.0+a.a.a.0+a.a.0+a.0+a.a.a.0+a.a.a.0+a.a.a.0+Q.0+a.a.a.u+a.u+a.0+a.a.0+a.a.a.u+a.u+a.0+a.a.a.z.a.a.a.0+0+a.0+u+0+a.0+a.a.a.u+a.u+0+a.a.a.0+a.a.a.0+a.a.a.a.a.u+a.a.a.u+a.u+a.0+a.a.0+a.a.0+a.a.a.u+0+a.0+0+a.a.a.0+a.a.a.u+a.u+a.a.0+a.0+a.0+a.a.a.a.a.0+0+a.a.a.0+a.a.a.0+a.a.a.0+0+a.0+u+0+a.0+/+0+a.a.a.u+a.u+a.a.a.0+a.a.a.0+a.a.a.0+a.a.a.0+a.a.a.0+a.a.0+a.a.a.0+a.a.a.0+!+", "x u+9.u+9.9.u+9.u+9.u+0+0+9.u+9.u+9.u+0+0+9.u+0+0+0+9.u+0+0+9.u+0+0+9.u+0+0+9.u+'+@+r+0+9.0+9.0+9.u+9.u+0+9.u+9.0+9.0+9.u+9.u+9.u+9.u+9.u+0+9.u+,+0+9.u+9.u+9.0+9.0+0+9.u+9.u+9.u+9.u+9.u+9.u+9.0+9.u+9.0+9.0+9.u+9.u+0+9.u+0+9.u+9.0+0+9.u+0+9.u+9.u+9.u+9.0+9.0+9.u+0+9.u+9.u+9.u+9.u+9.u+0+9.u+9.u+9.u+9.u+9.u+9.u+0+9.u+=.0+9.u+i.z.0+0+9.0+9.0+9.u+9.u+9.u+9.u+9.u+9.u+9.u+9.u+9.u+9.u+9.u+0+9.u+9.u+9.u+9.u+)+", "v r+8.r+u+0+0+8.r+8.0+/.r+8.r+8.r+8.r+0+0+8.r+#.n+0+8.r+$.0+8.r+0+0+8.r+$.0+8.r+l.l 0+0+8.r+8.0+8.r+8.r+0+8.r+8.r+8.r+8.r+8.r+8.r+8.0+8.r+0+8.0+q+0+8.r+8.0+8.r+8.$.0+8.r+8.0+8.8.].0+8.r+8.r+8.r+8.r+8.0+8.r+8.r+8.].0+8.r+0+8.r+8.r+0+8.r+0+8.].8.r+8.r+8.0+8.$.8.r+0+8.r+8.0+8.r+8.r+8.r+0+8.r+8.0+8.r+8.r+8.0+8.r+0+8.r+0+0+8.r+0+g+0+0+8.r+8.r+8.8.8.r+8.r+8.r+8.0+8.r+8.8.].0+8.r+8.0+8.].0+8.r+8.r+8.r+8.r+!+", "5 k r+7.P 7.7.r+0+7.0+v 0+7.0+7.7.7.0+7.P 7.0+!+..0+7.0+k.0+7.0+z.0+7.0+ .$.7.0+k.0+7.P 7.0+7.7.P u+P 7.7.P u+7.0+7.P 7.0+7.0+7.0+7.7.7.0+0+7.0+1.0+7.0+7.7.7.7.7.P u+7.0+7.0+7.r+0+0+7.0+7.0+7.0+7.7.P 7.7.7.7.0+r+7.0+7.7.7.P u+P u+o+0+7.7.7.0+r+0+7.0+7.0+7.P 7.0+0+7.7.7.0+7.0+7.0+7.0+0+7.7.7.7.7.0+7.0+7.P 7.0+0+7.0+$.0+7.0+7.0+7.7.P u+7.7.P $.0+0+7.7.P u+P u+7.0+7.r+0+0+7.0+7.0+r+7.0+7.7.P u+P u+P u+!+", "A F k r+0+0+0+_._.0+m < l 0+/.r+0+0+/.0+u+0+Q ,+}+G.0+w. .k.0+I.I.n.0+k.j+P.0+p+D.g+0+u+0+$.0+0+u+,+u+0+0+u+M.0+l.0+u+0+w.0+s.0+V z.0+M 0+l.0+[+w.{.0+2.0+0+0+0+0+u+g+0+2.0+0+M M M 0+0+@.0+..0+=.0+0+u+0+0+0+0+0+M M 0+0+0+0+u+=.u+z+#.n+0+0+M M M 0+0+$.0+:+0+u+0+A.f.0+0+0+t.0+)+0+..0+=.=.0+0+0+0+0+=.0+f.0+u+0++.&.0+$.0+,.0+^.0+3.0+0+u+6+0+0+M M M 0+M 0+u+C.$.G.0+0+M M M 0+0+6+0+0+M M 0+0+0+u+}.0+f.u+..>+", "_ ] 1 f I n x H } . / < ] . } s . ! } ! . l . Y !+,..+k s.i.D.@+ +/.1.2.k.P.++k.k.a+[.w.h.2.1./+%+(+-+-+g.-+g.J.r.r.m ! i+/ ^ r.0+0 e 0 u+&+&+K.r.@+Y K.M.M.M.M.(+(+(+^.k.*.*.0+0+0+*.=.n.*.=.*.*.*...*.*.$.*.@...0+0+$.z.=.@.$.k.k.{+#...e+:+0+0+0+$.$.1.L.n...e.)+M.g.1.^.g.R.Y J.a+f+=.0+f.3.f.=.#.$.=.2.%.:.;.C.v.=.x+0+0+G.c.1.(+1.^.o.V 5+T 5.0+0+0+0+0 u+%.5.h+{.1.:.0+0+0+h+d+l+h+6+0+0+;.H.Q '.'.m.H...3.>+", "% 9 1 i u 0 < / p = ' # ' ] ^ g _ ] ] % - + r M.P.#.4+ .z.0+0+u+'+(.@+-+g+)+)+k.k.)+k.[.[.k.1.A.{+*.{+q+|+3+|+g+g+a+/+-.I./+>+>+g+$.r+u+3.i.n.0+n.n.z.n.g+g+g+g+i.2.k.z.z.n.z.=.=.=.=.n.*.=.z.*.*.@.0+0+0+@.=...0+z.G.k.0+n.@.z.^.{.3.f+#.:+r+z.0+z.u+$.^.i.>+2+O. +W.N.y.y.O.O.++Y I.)++.0+=.0+f.#.0+....0+,.%.,.0+v.$.0+$.0+v.}.}.,.,.h.p+d+5+v >.5.X N.j+$.*.5.V h+(+<.D.D.6+h+w l+l+ .V <.1.H.T m.r r r c.:+3+3+", "% ] 2 8 o 0 ] g ' % < D 4 i ' @ = _ u 3 ~ +'.Y ,+*.B $.q.q.q.q.$.W u+M.0+0+0+z.0+0+0+$.u+u+0+3.L.-.*.0+:+0+0+u+@.0+u+0+..0+0+0+....0+q.0+..0+q.0+0+q.0+3.n.A.|+n.k.n.z.z.z.=.z.z.@.0+..*.=.*.*.*.0+q.q.q.0+..0+q.0+w+0+q.0+0+n. .^.i.i.....0+f.2.0+$.0+n.0+t.,+q $+W.W.N.=+ + +J.J.}.f+$.=.0+q.0+0+q.0+0+q.0+,.0+q.0+0+q.0+=.v.<.Y ;.%.{.X d.d.d.d.U }.Y z.q.0+l.5.h+l.<.D.p+h+h+w d+s.d+h+5.c.Y T '.r b r %.:+{+#.", "c A 2 o o g ] ] ] ' y y 2 N y @ 7 _ o o x q ~+'.'+3.0+q.0+0+0+0+q.0+q.0+q.q.q.0+q.q.q.0+q.q.q.0+#.*.0+q.0+q.q.q.0+q.q.q.0+q.q.q.0+..0+q.0+..0+q.q.0+q.0+@.*.{+{+*.z.$.@.@.$.*.$.@.0+q.0+@.*.*.3.=.0+q.0+0+*.n.0+q.q.0+q.q.0+q.0+i.B ^.@...=.z.2.v.=.0+q.0+q.0+>+S. +$+=+=+q +@+@+-+y.}+..+.0+q.0+0+q.q.0+q.0+t.u+q.0+0+q.0+$.z.,.Y %.1.1.5.S d.S S S U l.0+q.0+h.p+p+6+D.D.p+p+V w s.U V [.5.}.H.` r r b b ++m+..z+", "8 8 n f c 9 ] 9 g g ' < 0 M J % 6 u 8 g p + l '.m.|+0+!.u+!.!.u+!.u+!.u+!.u+!.u+!.u+!.u+0+0+!.u+0+0+0+!.u+!.u+!.u+!.u+!.u+!.u+!.u+..0+!.u+..0+!.u+!.!.u+0+*.0+*.0+0+0+0+0+z.0+0+0+!.!.b+0+0+0+f.i.0+!.u+0+n.2.0+!.u+!.u+!.u+0+:+0+ .z...0+0+0+=.0+0+:+0+!.!.b+0+0+$.&+W. +z.z.0+-+$.r+0+m+0+0+!.u+0+!.u+!.!.u+,.0+!.u+0+!.u+0+0+0+p.0+0+0+0+0+5.0+0+0+5.0+0+!.u+0+0+0+:.<.D.D.h+V k+d.5+V 5.5.Y Y ` r b r r H.m+:+#.", "J % c / @ g ] % _ ^ g 4 y y ] x 6 u _ ^ 9 . . v @+3+0+~.0+~.u+0+~.0+~.0+~.~.~.0+~.~.~.0+~.~.~.0+~.~.u+~.0+~.~.~.0+~.~.~.0+~.~.~.0+A.0+~.0+n.0+~.0+u+~.0+~.u+~.u+~.~.~.~.~.u+~.~.~.u+~.0+~.~.~.u+n.0+~.~.~.u+^.0+~.0+u+0+~.0+~.0+~.$.~.u+~.~.~.u+~.~.u+~.u+~.0+~.~.~.z.O.z.~.~.~.$.~.~.~.0+~.~.~.0+0+~.0+u+~.0+p.0+~.~.~.~.0+~.~.~.u+~.~.~.~.~.u+~.~.~.0+~.~.~.0+~.~.~.0+;.D.D.h+d+5+d.5+V 5.p+Y Y m.~+~+b r '+:+o+{+", "y f D 1 1 h A _ _ ; ; i y D g & x u 8 [ H - . { '+3+0+a.0+a.a.0+a.0+a.0+u+0+a.0+u+0+a.0+u+0+a.0+u+0+0+a.0+u+0+a.0+u+0+a.0+u+0+a.0+{.0+a.0+i.0+a.0+0+a.0+a.0+a.0+a.u+a.u+a.0+a.u+a.0+a.0+a.u+a.0+{.1.u+0+a.0+^.0+a.0+@.0+a.0+a.0+a.0+a.0+a.u+a.0+a.u+0+a.0+a.0+a.u+a.0+O.0+a.u+a.0+a.u+a.0+a.u+a.0+0+a.0+0+a.0+v.0+a.u+0+a.0+a.u+a.0+a.u+a.u+a.0+a.u+a.0+a.u+a.0+a.u+a.0+C.<.D.[.5+d.d.w X 5.<.Y }.'.m.m.b r '+m+:+)+", "< , , ^ J 1 ] _ 7 & & A D ' f x + 5 A ^ [ . s (.J.f+0+9.u+0+0+0+9.u+9.u+X z.9.u+(+0+9.u+0+0+9.u+@.t.0+9.u+h.0+9.u+1.0+9.u+3.0+9.u+t.0+9.u+0+0+9.u+0+9.u+9.u+9.u+9.0+9.0+9.u+9.0+9.u+9.u+9.0+9.u+1.-.0+0+9.u+0+0+9.u+n.0+9.u+9.u+9.u+9.u+9.0+9.u+9.9.u+9.u+9.u+9.0+9.u+g.0+9.0+9.u+9.0+9.u+9.0+9.u+0+9.u+0+9.u+0+0+9.0+0+9.u+9.0+9.u+9.0+9.0+9.u+9.0+9.u+9.0+9.u+9.0+9.u+G.D.6+5.s.5+k+>.V 6+p+Y Y '.T m.r r H.&...t.", "' h i @ D h 1 ^ 7 } } % ' J e ! 6 8 = ) e * . >.-+f+L.u+8.8.8.].0+0+8.r+l 0+8.r+++0+8.r+8.].8.r+@.L.0+8.r+{.0+8.r+-.u+8.r+L.0+8.r+n.0+8.r+8.r+8.r+0+8.r+8.8.].0+8.r+8.0+8.r+8.8.].8.8.].8.8.8.].0+u+8.8.8.r+8.r+8.r+n.0+8.r+8.r+8.8.8.r+8.8.].8.$.8.r+8.r+8.8.].8.8.8.r+0+8.].8.8.].0+8.r+8.].8.r+0+8.r+0+8.r+8.r+8.r+0+8.r+8.8.8.].8.0+8.r+8.r+8.8.].8.].8.].0+8.8.8.8.r+C.<.5.S 5+5+U 5.5.5.Y H.'.T v r v }.3.#.L.", "> / J / 3 0 1 ^ - 7 } = / e ) - j = d t k m j U P.f+L.U r+0+r+0+ .s.0+_.| _.0+J.g.Y =.^.0+0+r+-+@.4.^.r+1.[.^.0+/+}.-.r+L.(+L.0+{.l.L.r+2.r+n.0+2.k.r+z.r+0+0+*.r+n.0+n.0+n.r+0+0+0+r+0+0+r+0+0+i.i.0+r+0+k.0+z.r+^.2.G.0+3.0+..0+r+7.0+0+r+0+r+P 7.0+r+=.0+r+0+r+0+r+g.Y =.0+r+0+0+-.r+/+r+0+r+@.3.r+$.3.r+..0+z.r+o.:.0+=.0+r+0+0+0+v.r+C.=.5.0+r+0+r+0+r+0+C.r+0+r+0+G.C.D.Y 5+5+>.5+[.|.Y Y H.~+m.'.r r c.p.*.L.", "[ K h / A N F ] } E ~ : f f g 7 j p 7 E t j m j+I.f+>+f )+{ $ . / ' { ; & `.z z _.@+W w.F.y r.&+=.<.{.i.1.|.1.f.p.t.2+%+>+L.-.^.-.1.t.)+i.2.1.i.1.-.-.4.-.L.1.1.i.^.2.1.t.1.g+i.i./+-.1.-.{.^.G.i.i.G.2.G.h.G.h.C.^.v.{.@.i.*.0+M M M 0+#.:+$.$.0+0+=.z.v.g.O. +O.O.O.@+_.W @+K.@+J.Q Y W _.j Z :.f.3.=.=.A.=.v.,.D.6+6+E.f.v...r+0+v.C.1.[.V d.S '+T T '+ .<.V d+:.:.:.;.h.<.V d.d.>.k+Y ).Y H.'+~+'.b r r B.p.#.L.", "^ E ] F N P F g _ ) t f ) % A 5 + c 3 ] > ) { j+P.f+)+n /+= _ E } [ #+#+<+} } $ ~ l m k b+4+/.(+@.B+k.*.n.,.i.p.p.t.>+^+t.,.^.^.^.-.I.t.t.^.^.^.1.1.,.1.L.-.2.0+0+0+0+3.i.i.i.i.i.i.-.1.-.1.C.^.,.o.w.[.h.u+-.l.^.0+@.^.0+A...0+0+0+0+k %+:+r+v.$.*.k.v.f.-+z.S. + +O.@+r._.&+_._.&+Q M.M._.j t U C.3.#.v.=.*.G.G.;.5.5.5.2+=.=.v.v.k.G.{.5.S d.>.'.5+` m.>.V d+l+h+D.:.C.;.{.V d.d.k+w 5.|.Y H.'+'.m.r b '.,.f.#.%.", "9 i i < i h 1 K / p % a t 7 8 u 6 u 8 ' ' ' { M.P.{+3+e >+Z z - H H E E+E+[ j m } } % $ !.4+a &+#.{.[+-.h.Y |.4.-.4.Q.l.4.4.4.-.-.l.u.(+{.L.1.-.h.<.(+l.(+-.u+q.q.q.q.0+A.0+f.0+0+0+i.0+0+0+i.0+0+0+h.D.0+q.u+,.0+q.0+0+q.0+0+q.0+0+2.# n...$.v...k.v.v.n.0+q.0+O.O.z.g.R._._.r.@+r.@+Q W l V.V.H U C.*.f.=.&.n.G.G.D.h+V %+i.=.$.v.v.G.{.p+V 5+5+'.5+5+'.>.k+l+l+h+<.h.D.o.|.T >.5+5+5+5.).Y H.` m.'.'.r ` ,.3+=.4.", "^ 8 9 # D M i K % % * t ~ [ 4 _ 6 8 8 @ @ @ . H.P.{+A.e ^+` Q.K.j t `.#+i+i+[ } ( . g , b+4+a &+=.{.c.B.C.M.Y 4.u.u.-+M.[+<.|.|.l.(+M.Y u.l.%.;.<.[+l.[+l.u+q.0+0+0+0+q.0+q.0+q.q.q.0+q.q.q.0+q.q.q.0+D.u+q.0+i.0+q.0+0+q.0+0+q.0+q.0+s.h.:+&...v.v.v.n.0+0+q.0+g.z.q.z.@+'+| _.r.&+_.@+@+_.V.W.H H s.@.*.3.@.m+G.,.:.5. .%.1.=...v.v.G.;.D.w.5+5+'.S >.l d.l+l+l+d+;.h.C.<.).V m.d.d.m.5.|.R H.` '+~+b r X t.3+=.M.", "^ 9 $ c h # < K d [ t j ~ 7 ] ] 6 ; = A 4 I . Q.P.{+e.n ,+ +r.K.Y r.j H E+i+i+c+V.E K J !.F.) '+n.-.|.{.h.l.l.(+(+Y u.u.{.1.t.<.4.(+l.++[+X l.{.4.(+[+l.<.0+!.u+!.!.u+!.u+!.u+!.u+!.u+!.u+!.u+!.u+!.u+D.^.0+!.u+!.u+*.0+!.u+0+!.u+0+@.0+0+0+e+0+=.0+$.0+0+0+!.z.z.-+z.g. +@+z V.y./.K././.r.N.N.H N. .B+@.#.:+o+=.:.:.6+S M.i.,.:+=.v.E.,.[+[. .m.Q U d.l d.k+l+l+d+D.;.D.h.|.X s.k+d.m.).l.R '+'.'+r r r 5.p.3.n./.", "] [ E 5 ] P i K H * s d | - ^ ] : p ^ g ' x . Q.P.3+f.B Y l z l _.M.++_. +z E+i+U.E > H F.F.J _.i.1.|.{.h.l.l.{.<.-+J.M.l.u.o.l.{.I.t.t.^.^.^.f.i.i.1.^.G.0+~.0+~.u+0+~.0+~.0+~.~.~.0+~.~.~.0+~.~.~.0+2.2.n.0+~.u+n.$.0+~.~.~.~.0+~.0+~.~.~.u+~.u+~.0+~.~.u+~.~.~.$.~.z.O.O.r.V.V.j _.&+/._.m L W.`.m _.(+2.#.o+:+v.:.p+w U p.o...:+v.v.G.|.[.V S U 5+>.'.k+l+l+d+l+;.{.<.D.l.V w d.>.U |.|.R ` '.T r r r Y p.#.,.k ", "^ 7 7 6 [ D O 1 f a * 6 ; _ [ 9 _ % 4 4 g c z g.P.p.:.d.W m s s s z r.,+J.m } E+i+i+#+} F.F.8+y./+^.l.{.h.<.[+l.(+u.u.Y }.o.o.D.M.M.[.[+w.W R 4.4.l.l.[.<.0+a.0+a.a.0+a.0+a.0+u+0+a.0+u+0+a.0+u+0+a.0+1.(+{.0+a.0+-.@.0+a.u+0+a.0+a.0+a.u+a.0+a.0+a.0+a.u+0+a.u+a.0+a.0+O. +&+y.*+V.N./.K.@+_.L V.X.W.V.m /.3...o+0+0+C.w 5+++,.f.:+=.v.G.,.5.6+5+5+d.>.'.l+l+l+l+l+C.;.{.<.l.S w >.>.S |.|.` ` '.` ~+b '.}.)+#.l.) ", "5 3 8 ~ [ J .+1 K t j : : : ] g _ _ 8 4 4 3 z R.,+t.G.s.[+j+(.z s [ E z J.(+Z - #+! j & a.4+8+y./+^.(+-.^.{.p+l.(+++++u.%.{.{.<.++M.w.w.j+&+W l.(+M.l.[.[+0+9.u+0+0+0+9.u+9.u+,.0+9.u+p.0+9.u+i.0+9.u+{.h.^.0+9.u+@.0+0+9.0+0+9.u+9.u+9.0+9.u+9.u+9.u+9.0+0+9.0+9.u+9.$.O.y.@+r.=+X.N./.K.l._.m V.X.X.| j W.&+{+e+x+0+k.V d.m.f.;.:+:+v.G.G.D.6+5+5+5+5+` l+l+l+l+l+p+%.<.<.5.S d.>.>.V 4.|.H.~+~+~+~+r m.}.3+}+(.9 ", "; c _ ( W.K h D , H j } | ~ C A _ 8 F 9 9 $ z J.^+L.E.U [.j+p+M._.[ c+#+[ z _.P.-+/.| & t+4+8+_.(+i.4.-.1.G.k.k.^.I.[+4.u.4.{.{.++M.[+[+w.M.[+l.{.l.|.<.(+1.u+8.].8.8.$.0+8.r+k.0+8.r+n.0+8.r+k.0+8.r+v.v.$.0+8.r+0+8.r+8.u+0+8.r+8.0+8.].8.r+8.8.].0+8.].0+8.r+8.r+8.0+O.y.O.&+y.X.$+r.W K./.r.V.X.X.X.Z.Z.W.Q *.:+r+0+:.5+U c.:.=.m+$.v.v.:.5.S 5+k+5+>.l+l+l+l+k+h+%.{.<.5.S >.>.d.Y o.|.` ~+` '.v r ` ++}+f+{ K ", ": p - ( ( 9 y # D g t j | . 3 8 5 5 o 2 f p . R.a+L.G.s.L.M.s./.M.P.&+m ) > } +O.(+H.l i+4+8+m (+2.i.n.[.h.[.z.(+{.^.^.i.2.z.B+%+i.2.i.2.f.v.n.2.f.2.f.f.i.3.0+0+r+0+2.G.0+G.[+^.r+i.{./+u+^.<.:.r+i.|.[+D.$.0+-.-.r+^.0+A.{.0+M.0+i.0+0+7.0+0+r+0+3.u+0+g+r+g.$.-+0+S.=+y. +r._.Z.X.y.&+K./.W z X.;+X.Z.V.V.L 4...$.0+0+6+5+T e.2.:+..v.v.<.V S w k+d.l+l+l+d+l+l+V B.{.o.).S >.>.U 5.%.%.` ~+` ~+~+b ` u.}+}.= g ", "$ { ! 6 | - ' D h ) d - 7 7 o 5 u 5 I I ) f m @+L.i.p.u.^+a+I.V k j S.S.H.W R R.S.@+S.P.a 4+8+m -.*.,+(.h / ) <.D.l.l.[+[+[+l.++-+[.[.w.M.w.[.[.w.[.[.[+l.4.L.{.h.L.-.[.l.h.[.l.[+h.[+[+[+(+<.[.|.-.(+M.w.^.-.[+r.r.&+r.M.W { m.z W 0+M M M 0+=.2.v.i.2.i.-.O.N.r.y.O.y.$+$+q +&+W.=+y.r.K.Q W r.X.X.X.X.*+V.*+'+n...r+e.v.V '.f.G...:+v.<.5.V V 5+d.l+l+l+l+k+k+w d+h.%.c.5.m.>.d.d.}.%.|.~+~+'.r ~+r ` >+#./.p = ", "! ! ~ & ( 7 8 4 g / * x 7 _ 5 F 3 x ; 4 : x { '+%.,.!+!+!+!+!+2.h.W _.q '+q q O.R.P.^+Q./..+8+m g.M.y.j j j ! M.2.<.l.l.[+Y -+-+++[+w.W M.[.[.w.w.[.l.w.4.4.4.l.4.{.[+l.l.Y l.l.l.[+(+l.M.[+5.[.{.4.H.-+[.G.[+r._.r.r./.M.k M.R.'+_.++0+0+0+@.=.i.i.i.i.^.-.y.=+y.q + +y.$+$+$+@+y.Z.$+Q Q W W W =+W.=+Z.X.*+Y.Y.X A.#.v.0+r+T l.v.=...e.<.|.[.V 5+d.d.U d.k+l+w U d+D.<.<.X d.'.d.5+}.4.%.~+r r '.'.r '+t.3.{ = ~ ", "$ - ~ + & 3 x @ A A 9 * $ f ' > : ! 7 9 E c >.Q }.}.^+)+!+!+!+g+k.1.%.R.@+ + +q q + +S.s.# 8+m O.y.$+j j z _._.2.G.[+<.(+u.u.u.(+l.w.J.J.[+w.X w.[+[.[+4.I.|.4.I.[+[+<.l.l.l.l.l.l.l.J.[+<.h+h.(+-+R.-+}.g+-.J._.W [+w.[+p+D.l.R.@+R M.J.g.k.@.i.i.^.2.L.I.$+y._. +q q y.O.N. +_.@+| W._.Q w.&+K.$+N.W.X.*+;+=+;+$+Y e.3.E.@.=.R e.r+v...,.<.[.V 5+d.>.r '.l+k+_.w d+p+<.D.5.>.'.k+d.|.4.|.~+'.'.'.'.'.++p.i.{ ! + "}; slashem-0.0.7E7F3/dat/spiders.des0000664000076400007640000001353010545462317014574 0ustar aliali# SCCS Id: @(#)spiders.des 3.4 1993/02/23 # Copyright (c) 1989 by Jean-Christophe Collet # Copyright (c) 1991 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 above. # MAZE: "spiders" , ' ' GEOMETRY: center,center #0 1 2 3 4 5 6 #1234567890123456789012345678901234567890123456789012345678901234567890 MAP ----- ----- ----...- |...|------ ------ ----.....-- ---.......| -....------.....---- -----..--- ----.........---- |-------------.....-- -...----......----|----..............----- -.--- ------....--.......-----|------ ------- -.- --------..................|-------- ---.....- |------ --- -........---...----|..............---...----- |.....-- ---------.---- |...| |------|...........----- |----..---.........- |...| -----------.....-------- |.........-------.- |...|-| -------......- ----------- ---|---|.....| --------......----- ---------|.........---------------.........----- ------|.............|-|....................-----.....---- ---|..................---|...-----------.....--- -----....- |....----|.-----------|......| ----....----- ------ |----| |..-- |-|...|--| ---......- -|..| -----|...|-- ---..--- ---- |.......|- -.-- |-------| --- ENDMAP RANDOM_MONSTERS: 's','s' STAIR:(32,10),up BRANCH:(32,10,32,10),(0,0,0,0) # # the stuff to find here OBJECT: '!',"invulnerability",random OBJECT: '!',"invulnerability",random OBJECT: '/',"make invisible",random OBJECT: '"',"amulet versus poison",random OBJECT: '[',"speed boots",random OBJECT: '=',"conflict",random OBJECT: '/',"death",random OBJECT: '%',"egg",random OBJECT: '%',"egg",random OBJECT: '%',"egg",random OBJECT: '%',"egg",random OBJECT: '%',"egg",random OBJECT: '%',"egg",random OBJECT: '%',"egg",random OBJECT: '%',"egg",random OBJECT: '%',"egg",random OBJECT: '%',"egg",random OBJECT: '%',"egg",random OBJECT: '%',"egg",random OBJECT: '%',"egg",random OBJECT: '%',"egg",random OBJECT: '%',"egg",random OBJECT: '%',"egg",random OBJECT: '%',"egg",random OBJECT: '%',"egg",random OBJECT: '%',"egg",random OBJECT: '%',"egg",random OBJECT: '%',"egg",random OBJECT: '%',"egg",random OBJECT: '%',"egg",random OBJECT: '%',"egg",random OBJECT: '%',"egg",random OBJECT: '%',"egg",random OBJECT: '%',"egg",random OBJECT: '%',"egg",random OBJECT: '%',"egg",random OBJECT: '%',"egg",random OBJECT: '%',"egg",random OBJECT: '%',"egg",random OBJECT: '%',"egg",random OBJECT: '%',"egg",random OBJECT: '%',"egg",random OBJECT: '%',"egg",random OBJECT: '%',"egg",random OBJECT: '%',"egg",random OBJECT: '%',"egg",random OBJECT: '%',"egg",random OBJECT: '%',"egg",random OBJECT: '%',"egg",random OBJECT: '%',"egg",random OBJECT: '%',"egg",random OBJECT: '%',"egg",random OBJECT: '%',"egg",random OBJECT: '%',"egg",random OBJECT: '%',"egg",random GOLD: random, random GOLD: random, random GOLD: random, random GOLD: random, random GOLD: random, random # MONSTER: 's', random, random, hostile MONSTER: 's', random, random, hostile MONSTER: 's', random, random, hostile MONSTER: 's', random, random, hostile MONSTER: 's', random, random, hostile MONSTER: 's', random, random, hostile MONSTER: 's', random, random, hostile MONSTER: 's', random, random, hostile MONSTER: 's', random, random, hostile MONSTER: 's', random, random, hostile MONSTER: 's', "giant spider", random, hostile MONSTER: 's', "giant spider", random, hostile MONSTER: 's', "giant spider", random, hostile MONSTER: 's', "giant spider", random, hostile MONSTER: 's', "giant spider", random, hostile MONSTER: 's', "giant spider", random, hostile MONSTER: 's', "giant spider", random, hostile MONSTER: 's', "giant spider", random, hostile MONSTER: 's', "giant spider", random, hostile MONSTER: 's', "giant spider", random, hostile MONSTER: 's', "giant spider", random, hostile MONSTER: 's', "giant spider", random, hostile MONSTER: 's', "giant spider", random, hostile MONSTER: 's', "giant spider", random, hostile MONSTER: 's', "giant spider", random, hostile MONSTER: 's', "giant spider", random, hostile MONSTER: 's', "giant spider", random, hostile MONSTER: 's', "giant spider", random, hostile MONSTER: 's', "giant spider", random, hostile MONSTER: 's', "giant spider", random, hostile MONSTER: 's', "giant spider", random, hostile MONSTER: 's', "giant spider", random, hostile MONSTER: 's', "Shelob", random, hostile MONSTER: 's', "Girtab", random, hostile # TRAP: "web", random TRAP: "web", random TRAP: "web", random TRAP: "web", random TRAP: "web", random TRAP: "web", random TRAP: "web", random TRAP: "web", random TRAP: "web", random TRAP: "web", random TRAP: "web", random TRAP: "web", random TRAP: "web", random TRAP: "web", random TRAP: "web", random TRAP: "web", random TRAP: "web", random TRAP: "web", random TRAP: "web", random TRAP: "web", random TRAP: "web", random TRAP: "web", random TRAP: "web", random TRAP: "web", random TRAP: "web", random TRAP: "web", random TRAP: "web", random TRAP: "web", random TRAP: "web", random TRAP: "web", random TRAP: "web", random TRAP: "web", random TRAP: "web", random TRAP: "web", random TRAP: "web", random TRAP: "web", random TRAP: "web", random TRAP: "web", random TRAP: "web", random TRAP: "web", random TRAP: "web", random TRAP: "web", random TRAP: "web", random TRAP: "web", random TRAP: "web", random TRAP: "web", random TRAP: "web", random TRAP: "web", random slashem-0.0.7E7F3/dat/Knight.des0000664000076400007640000003057610545462317014360 0ustar aliali# 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. # # The "start" level for the quest. # # Here you meet your (besieged) class leader, King Arthur # and receive your quest assignment. # MAZE: "Kni-strt",'.' FLAGS: noteleport,hardfloor # This is a kludge to init the level as a lit field. INIT_MAP: '.' , '.' , false , false , lit , false GEOMETRY:center,center MAP .................................................. .-----......................................-----. .|...|......................................|...|. .--|+-------------------++-------------------+|--. ...|...................+..+...................|... ...|.|-----------------|++|-----------------|.|... ...|.|.................|..|.........|.......|.|... ...|.|...\.............+..+.........|.......|.|... ...|.|.................+..+.........+.......|.|... ...|.|.................|..|.........|.......|.|... ...|.|--------------------------------------|.|... ...|..........................................|... .--|+----------------------------------------+|--. .|...|......................................|...|. .-----......................................-----. .................................................. ENDMAP # Dungeon Description REGION:(00,00,49,15),lit,"ordinary" REGION:(04,04,45,11),unlit,"ordinary" REGION:(06,06,22,09),lit,"throne" , unfilled REGION:(27,06,43,09),lit,"ordinary" # Portal arrival point BRANCH:(20,14,20,14),(0,0,0,0) # Stairs STAIR:(40,7),down # Doors # Outside Doors DOOR:locked,(24,03) DOOR:locked,(25,03) # Inside Doors DOOR:closed,(23,04) DOOR:closed,(26,04) DOOR:locked,(24,05) DOOR:locked,(25,05) DOOR:closed,(23,07) DOOR:closed,(26,07) DOOR:closed,(23,08) DOOR:closed,(26,08) DOOR:closed,(36,08) # Watchroom Doors DOOR:closed,(04,03) DOOR:closed,(45,03) DOOR:closed,(04,12) DOOR:closed,(45,12) # King Arthur MONSTER:'@',"King Arthur",(09,07) # The treasure of King Arthur OBJECT:'(',"chest",(09,07) # knight guards for the watchrooms MONSTER:'@',"knight",(04,02),peaceful MONSTER:'@',"knight",(04,13),peaceful MONSTER:'@',"knight",(45,02),peaceful MONSTER:'@',"knight",(45,13),peaceful # page guards for the audience chamber MONSTER:'@',"page",(16,06) MONSTER:'@',"page",(18,06) MONSTER:'@',"page",(20,06) MONSTER:'@',"page",(16,09) MONSTER:'@',"page",(18,09) MONSTER:'@',"page",(20,09) # Non diggable walls NON_DIGGABLE:(00,00,49,15) # Random traps TRAP:"sleep gas",(24,04) TRAP:"sleep gas",(25,04) TRAP:random,random TRAP:random,random TRAP:random,random TRAP:random,random # Monsters on siege duty. MONSTER: 'i',"quasit",(14,00),hostile MONSTER: 'i',"quasit",(16,00),hostile MONSTER: 'i',"quasit",(18,00),hostile MONSTER: 'i',"quasit",(20,00),hostile MONSTER: 'i',"quasit",(22,00),hostile MONSTER: 'i',"quasit",(24,00),hostile MONSTER: 'i',"quasit",(26,00),hostile MONSTER: 'i',"quasit",(28,00),hostile MONSTER: 'i',"quasit",(30,00),hostile MONSTER: 'i',"quasit",(32,00),hostile MONSTER: 'i',"quasit",(34,00),hostile MONSTER: 'i',"quasit",(36,00),hostile # # The "locate" level for the quest. # # Here you have to find your way to the Isle of Glass to go # further towards your assigned quest. # MAZE: "Kni-loca",' ' FLAGS: hardfloor INIT_MAP: '.' , 'P' , false , true , lit , false GEOMETRY:center,center MAP ...PPP.........PPPP..............PPPP... .PPPP...........PP................PPPP.. PP.................................PPP.. ....................................PPP. .....................................PP. .......................................P ........................................ PP...................................PPP .PPP...............................PPP.. ..PP.............................PPPP... ..PPP...........................PPPPPP.. ....PPPP.........PPP.........PPPP..PP... ENDMAP # Dungeon Description # The Isle of Glass is a Tor rising out of the swamps surrounding it. REGION:(00,00,39,11),lit,"ordinary" # The top area of the Tor is a holy site. REGION:(09,02,27,09),lit,"temple" # Stairs STAIR:(38,0),up STAIR:(18,05),down # The altar atop the Tor and its attendant (creating altar makes the priest). ALTAR:(17,05),neutral,shrine # Objects OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random # Random traps # All of the avenues are guarded by magic except for the East. # South TRAP:"magic",(08,11) TRAP:"magic",(09,11) TRAP:"magic",(10,11) TRAP:"magic",(11,11) TRAP:"magic",(12,11) TRAP:"magic",(13,11) TRAP:"magic",(14,11) TRAP:"magic",(15,11) TRAP:"magic",(16,11) TRAP:"magic",(20,11) TRAP:"magic",(21,11) TRAP:"magic",(22,11) TRAP:"magic",(23,11) TRAP:"magic",(24,11) TRAP:"magic",(25,11) TRAP:"magic",(26,11) TRAP:"magic",(27,11) TRAP:"magic",(28,11) # West TRAP:"magic",(00,03) TRAP:"magic",(00,04) TRAP:"magic",(00,05) TRAP:"magic",(00,06) # North TRAP:"magic",(06,00) TRAP:"magic",(07,00) TRAP:"magic",(08,00) TRAP:"magic",(09,00) TRAP:"magic",(10,00) TRAP:"magic",(11,00) TRAP:"magic",(12,00) TRAP:"magic",(13,00) TRAP:"magic",(14,00) TRAP:"magic",(19,00) TRAP:"magic",(20,00) TRAP:"magic",(21,00) TRAP:"magic",(22,00) TRAP:"magic",(23,00) TRAP:"magic",(24,00) TRAP:"magic",(25,00) TRAP:"magic",(26,00) TRAP:"magic",(27,00) TRAP:"magic",(28,00) TRAP:"magic",(29,00) TRAP:"magic",(30,00) TRAP:"magic",(31,00) TRAP:"magic",(32,00) # Even so, there are magic "sinkholes" around. TRAP:"anti magic",random TRAP:"anti magic",random TRAP:"anti magic",random TRAP:"anti magic",random TRAP:"anti magic",random TRAP:"anti magic",random TRAP:"anti magic",random # Random monsters. MONSTER:'i',"quasit",random,hostile MONSTER:'i',"quasit",random,hostile MONSTER:'i',"quasit",random,hostile MONSTER:'i',"quasit",random,hostile MONSTER:'i',"quasit",random,hostile MONSTER:'i',"quasit",random,hostile MONSTER:'i',"quasit",random,hostile MONSTER:'i',"quasit",random,hostile MONSTER:'i',"quasit",random,hostile MONSTER:'i',"quasit",random,hostile MONSTER:'i',"quasit",random,hostile MONSTER:'i',"quasit",random,hostile MONSTER:'i',"quasit",random,hostile MONSTER:'i',"quasit",random,hostile MONSTER:'i',"quasit",random,hostile MONSTER:'i',"quasit",random,hostile MONSTER:'i',"quasit",random,hostile MONSTER:'i',random,random,hostile MONSTER:'j',random,random,hostile MONSTER:'j',"ochre jelly",random,hostile MONSTER:'j',"ochre jelly",random,hostile MONSTER:'j',"ochre jelly",random,hostile MONSTER:'j',"ochre jelly",random,hostile MONSTER:'j',"ochre jelly",random,hostile MONSTER:'j',"ochre jelly",random,hostile MONSTER:'j',"ochre jelly",random,hostile MONSTER:'j',random,random,hostile # # The "goal" level for the quest. # # Here you meet Ixoth your nemesis monster. You have to # defeat Ixoth in combat to gain the artifact you have # been assigned to retrieve. # MAZE: "Kni-goal", ' ' GEOMETRY:center,center MAP ....PPPP..PPP.. .PPPPP...PP.. .......... ................................. ..PPPPP...P.. ........... ................................... ..PPP....... ........... ...................................... ...PPP....... ......... ............... ..................... ........... ............ ............ ...................... ............ ............. ....... ..................... .............................. ......................... ............................... .................................. ............................. .................................... ......... ...................................................... .....PP... ..................................................... .....PPP.... .................................................... ......PPP.... .............. .................................... .......PPP.... ............. ..................................... ........PP... ............ ...................................... ...PPP........ .......... .................................. ..PPPPP........ .......... .............................. ....PPPPP...... ......... .......................... .......PPPP... ENDMAP # Dungeon Description REGION:(00,00,14,19),lit,"ordinary" REGION:(15,00,75,19),unlit,"ordinary" # Stairs STAIR:(03,08),up # Non diggable walls NON_DIGGABLE:(00,00,75,19) # Objects OBJECT:'(',"mirror",(50,06),blessed,0,"The Magic Mirror of Merlin" OBJECT:random,random,(33,01) OBJECT:random,random,(33,02) OBJECT:random,random,(33,03) OBJECT:random,random,(33,04) OBJECT:random,random,(33,05) OBJECT:random,random,(34,01) OBJECT:random,random,(34,02) OBJECT:random,random,(34,03) OBJECT:random,random,(34,04) OBJECT:random,random,(34,05) OBJECT:random,random,(35,01) OBJECT:random,random,(35,02) OBJECT:random,random,(35,03) OBJECT:random,random,(35,04) OBJECT:random,random,(35,05) OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random # Random traps TRAP:"spiked pit",(13,07) TRAP:"spiked pit",(12,08) TRAP:"spiked pit",(12,09) TRAP:random,random TRAP:random,random TRAP:random,random TRAP:random,random TRAP:random,random # Random monsters. MONSTER:'D',"Ixoth",(50,06),hostile MONSTER:'i',"quasit",random,hostile MONSTER:'i',"quasit",random,hostile MONSTER:'i',"quasit",random,hostile MONSTER:'i',"quasit",random,hostile MONSTER:'i',"quasit",random,hostile MONSTER:'i',"quasit",random,hostile MONSTER:'i',"quasit",random,hostile MONSTER:'i',"quasit",random,hostile MONSTER:'i',"quasit",random,hostile MONSTER:'i',"quasit",random,hostile MONSTER:'i',"quasit",random,hostile MONSTER:'i',"quasit",random,hostile MONSTER:'i',"quasit",random,hostile MONSTER:'i',"quasit",random,hostile MONSTER:'i',"quasit",random,hostile MONSTER:'i',"quasit",random,hostile MONSTER:'i',random,random,hostile MONSTER:'i',random,random,hostile MONSTER:'j',"ochre jelly",random,hostile MONSTER:'j',"ochre jelly",random,hostile MONSTER:'j',"ochre jelly",random,hostile MONSTER:'j',"ochre jelly",random,hostile MONSTER:'j',"ochre jelly",random,hostile MONSTER:'j',"ochre jelly",random,hostile MONSTER:'j',"ochre jelly",random,hostile MONSTER:'j',"ochre jelly",random,hostile MONSTER:'j',random,random,hostile # # The "fill" levels for the quest. # # These levels are used to fill out any levels not occupied by specific # levels as defined above. "filla" is the upper filler, between the # start and locate levels, and "fillb" the lower between the locate # and goal levels. # MAZE: "Kni-fila" , '.' INIT_MAP: '.' , 'P' , false , true , lit , false NOMAP # STAIR: random, up STAIR: random, down # OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random # MONSTER: 'i', "quasit", random, hostile MONSTER: 'i', "quasit", random, hostile MONSTER: 'i', "quasit", random, hostile MONSTER: 'i', "quasit", random, hostile MONSTER: 'i', random, random, hostile MONSTER: 'j', "ochre jelly", random, hostile # TRAP: random, random TRAP: random, random TRAP: random, random TRAP: random, random MAZE: "Kni-filb" , '.' INIT_MAP: '.' , 'P' , false , true , lit , false NOMAP # STAIR: random, up STAIR: random, down # OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random # MONSTER: 'i', "quasit", random, hostile MONSTER: 'i', "quasit", random, hostile MONSTER: 'i', "quasit", random, hostile MONSTER: 'i', "quasit", random, hostile MONSTER: 'i', random, random, hostile MONSTER: 'j', "ochre jelly", random, hostile MONSTER: 'j', "ochre jelly", random, hostile MONSTER: 'j', "ochre jelly", random, hostile # TRAP: random, random TRAP: random, random TRAP: random, random TRAP: random, random slashem-0.0.7E7F3/dat/cmdhelp0000664000076400007640000001246510545462317013773 0ustar aliali^ Show the type of a trap ^[ Cancel command ^A Redo the previous command ^C Quit the game ^D Kick something (usually a door, chest, or box) ^E Search a room (available in wizard mode only) ^F Map the level (available in wizard mode only) ^G Create a monster (available in wizard mode only) ^I Identify all items (available in wizard mode only) ^J go up an experience level (available in wizard mode only) ^O Show location of special levels (available in wizard mode only) ^P Toggle through previously displayed game messages ^R Redraw screen ^T Teleport around level ^V Teleport between levels (available in wizard mode only) ^W Wish (available in wizard mode only) ^X Show your attributes (intrinsic ones included in debug or explore mode) ^Y Polymorph (if you can) ^Z Suspend game (only if defined) a Apply (use) a tool A Remove all armor b Go southwest 1 space B Go southwest until you are on top of something ^B Go southwest until you are near something c Close a door C Call (name) a particular monster d Drop an item D Drop specific item types e Eat something E Engrave writing on the floor f Fire ammunition from quiver 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 I Inventory specific item types j Go south 1 space (or if number_pad is on, jump to another location) J Go south until you are on top of something ^J Go south until you are near something k Go north 1 space (or if number_pad is on, kick something) K Go north until you are on top of something (if number_pad, list kills) ^K Go north until you are near something l Go east 1 space (or if number_pad is on, loot a box on the floor) L Go east until you are on top of something ^L Go east until you are near something m Followed by direction, move without picking anything up M Followed by direction, move a distance without picking anything up n Go southeast 1 space N Go southeast until you are on something (if number_pad, name an object) ^N Go southeast until you are near something o Open a door O Set options (O? explains options) p Pay your shopping bill/Shopkeeper services P Put on an accessory (ring, amulet, etc) q Quaff (drink) something (potion, water, etc) Q Select ammunition for quiver r Read a scroll or spell book R Remove an accessory (ring, amulet, etc) s Search for traps and secret doors S Save the game t Throw something T Take off one piece of armor u Go northeast 1 space (or if number_pad is on, untrap something) U Go northeast until you are on top of something ^U Go northeast until you are near something v Show version V Show long version and game history w Wield (put in use) a weapon W Wear a piece of armor x Swap wielded and secondary weapons X List known spells y Go northwest 1 space Y Go northwest until you are on top of something ^Y Go northwest until you are near something z Zap a wand Z Zap (cast) a spell < Go up a staircase > Go down a staircase / Show what type of thing a symbol corresponds to ? Give a help message & Tell what a command does ` Access the menusystem ! 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 ; Show what type of thing a map symbol on the level corresponds to , Pick up things at the current location @ Toggle the pickup option on/off ) Show the weapon currently wielded * Show all equipment in use (combination of the ),[,=,",( commands) [ Show the armor currently worn = Show the ring(s) currently worn " Show the amulet currently worn ( Show the tools currently in use $ 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-b Steal M-c Talk to someone M-d Dip an object into something M-e Class special effect M-f Force a lock M-i Invoke an object's special powers M-j Jump to another location M-k Advance or check weapons skills M-l Loot a box on the floor M-m Use a monster's special ability M-n Name an item or type of object M-o Offer a sacrifice to the gods M-p Pray to the gods for help M-q Quit M-r Rub a lamp M-s Sit down M-t Use techniques M-u Untrap something (trap, door, or chest) M-v Print compile time options for this version of NetHack M-w Wipe off your face M-y Polymorph yourself slashem-0.0.7E7F3/dat/template.des0000664000076400007640000004116310545462317014741 0ustar aliali# SCCS Id: @(#)Template.des 3.4 1998/09/10 # Copyright (c) 1998 # NetHack may be freely redistributed. See license for details. ### The quest "start" level ### # Here you meet your (besieged) class leader, , # and receive your quest assignment. # MAZE: "Xyz-start",' ' FLAGS: noteleport,hardfloor GEOMETRY:center,center #1234567890123456789012345678901234567890123456789012345678901234567890 MAP .................................... . ..................................... ................................... ... .................................... .................................... . ..................................... ................................... ... .................................... .................................... . ..................................... ..............................}}}}}}}.}}}}}}}............................... ............................}}}|----...----|}}}............................. ...........................}}|--...........--|}}............................ .................... . . . }|-...............-|} . . . ..................... ................... . . . .}|.................|}. . . . .................... ............................................................................ ................... . . . .}|.................|}. . . . .................... .................... . . . }|-...............-|} . . . ..................... ...........................}}|--...........--|}}............................ ............................}}}|----...----|}}}............................. ..............................}}}}}}}.}}}}}}}............................... .................................... . ..................................... ................................... ... .................................... .................................... . ..................................... ................................... ... .................................... ENDMAP # Specifications for the whole level RANDOM_MONSTERS: 'a', 'b' REGION:(00,00,75,19),lit,"ordinary" BRANCH:(00,14,00,14),(0,0,0,0) STAIR:(40,13),down NON_DIGGABLE:(00,00,55,19) # Doors DOOR:closed,(02,08) # Objects OBJECT:'(',"chest",(37,10) # Leader and guardians MONSTER:'@',"Quest Leader",(37,10) MONSTER:'@',"Guardian",(38,09) MONSTER:'@',"Guardian",(38,10) MONSTER:'@',"Guardian",(38,11) MONSTER:'@',"Guardian",(36,09) MONSTER:'@',"Guardian",(36,10) MONSTER:'@',"Guardian",(36,11) MONSTER:'@',"Guardian",(37,09) MONSTER:'@',"Guardian",(37,11) # Monsters on siege duty. MONSTER: 'o',"Uruk-hai",(35,04),hostile MONSTER: 'o',"Uruk-hai",(36,03),hostile MONSTER: 'o',"goblin",(37,03),hostile MONSTER: 'o',"goblin",(38,03),hostile MONSTER: 'o',"goblin",(39,04),hostile MONSTER: 'o',"Uruk-hai",(48,09),hostile MONSTER: 'o',"goblin",(48,10),hostile MONSTER: 'o',"goblin",(48,11),hostile MONSTER: 'o',"Uruk-hai",(35,16),hostile MONSTER: 'o',"Uruk-hai",(36,17),hostile MONSTER: 'o',"goblin",(37,17),hostile MONSTER: 'o',"goblin",(38,17),hostile MONSTER: 'o',"goblin",(39,16),hostile MONSTER: 'o',"Uruk-hai",(26,09),hostile MONSTER: 'o',"goblin",(26,10),hostile MONSTER: 'o',"goblin",(26,11),hostile # Traps TRAP:"pit",(37,05) TRAP:"pit",(46,10) TRAP:"pit",(37,15) TRAP:"pit",(28,10) TRAP:random,random TRAP:random,random ### Upper filler levels ### MAZE: "Y-filla", ' ' GEOMETRY:center,center #1234567890123456789012345678901234567890123456789012345678901234567890 MAP ENDMAP # Specifications for the whole level RANDOM_MONSTERS: 'a', 'b' REGION:(00,00,20,12),lit,"ordinary" NON_DIGGABLE:(00,00,20,12) STAIR:(05,08),up STAIR:(10,08),down # Doors DOOR:closed,(02,08) DOOR:locked,(01,06) DOOR:closed,(02,04) DOOR:locked,(07,01) DOOR:closed,(10,02) DOOR:locked,(13,01) DOOR:closed,(18,04) DOOR:locked,(19,06) DOOR:closed,(18,08) DOOR:locked,(13,11) DOOR:closed,(10,10) # Objects OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random # Random monsters MONSTER:'d',"large dog",random,hostile MONSTER:'d',"large dog",random,hostile MONSTER:'d',"large dog",random,hostile MONSTER:'d',"wolf",random,hostile MONSTER:'d',"werewolf",random,hostile MONSTER:'d',"werewolf",random,hostile MONSTER:'r',"sewer rat",random,hostile MONSTER:'r',"sewer rat",random,hostile MONSTER:'r',"sewer rat",random,hostile MONSTER:'r',"rabid rat",random,hostile MONSTER:'r',"rabid rat",random,hostile # Traps TRAP:"arrow",random TRAP:"arrow",random TRAP:"arrow",random TRAP:"arrow",random TRAP:"board",random TRAP:"board",random ### The quest "locate" level ### # # The inner ward of the tower complex # MAZE: "Y-locate",' ' FLAGS: hardfloor GEOMETRY:center,center #1234567890123456789012345678901234567890123456789012345678901234567890 MAP .. .... ...... ... ....... .. .. ......S... .......... ..... ........ .... .. .. ... . ......... .. . ..... .... .. .. . ..... .. . .. ..... .... . .. .. S .. .. .... S .. .. .... .. .. ..... ... .. .. ........ .. .. ...... ...... ... .. ............ ... ... .... .. .... .... ........................S....S...... .. .. .. ... ........................ .. .. .. .. ........................ .. .... .... .. ........................ .. ...... .. .. ... .................... .. .... .... .. ..... ............ .. .. .. .. .. ... .S ............ .... ... .. .. .............. .... ............ .... .. ..... ... .. .. .... ..... .. .... .............. ...... ..... ENDMAP # Specifications for the whole level RANDOM_MONSTERS: 'a', 'b' REGION:(00,00,36,19),lit,"ordinary" NON_DIGGABLE:(00,00,36,19) # Bloody Tower # See historical comments above. STAIR:(10,16),up DOOR:open,(11,14) # Lieutenant's Lodgings (Queen's House) # A large hall built in 1530 as the lodgings for the # Lieutenant of the Tower. The Lieutenant is a military officer # who is responsible for the defense and maintenance of the # Tower. He serves under the Constable of the Tower, and oversees # the Chief Yeoman Warder. # # Anne Boleyn was tried and imprisoned in this house. Ironically, # her daughter, Elizabeth I, dined in this house during her # later incarceration. After Elizabeth became queen, the house # was renamed the Queen's House. # # Guido "Guy" Fawkes was interrogated here for his Gunpowder # Plot in 1605. Rudolph Hess was also interrogated here during # World War II. # # William Penn is currently being held here. He should be kept # alive at all costs, since he will later found the American # colony of Pennsylvania! DOOR:locked,(06,13) MONSTER:'@',"watch captain",(04,14),peaceful MONSTER:'@',"watchman",(05,14),peaceful MONSTER:'@',"watchman",(06,14),peaceful MONSTER:'@',"watchman",(07,14),peaceful MONSTER:'@',"prisoner",(08,14),"William Penn",peaceful # Bell Tower # Planned by Richard I "The Lionhearted", completed in 1200s. # Elizabeth I was held here during her imprisonment. # # This tower contains the warning bell that calls the garrison # to arms. # ...So that's where the Bell of Opening is from! ENGRAVING:(02,14),burn,"In case of trouble, ring bell." DOOR:closed,(03,14) # Gentleman Gaoler's (Jailer's) Lodgings # This is the home of the Gentleman Gaoler, who oversees the # incarceration of prisoners. Lady Jane Grey was also imprisoned # here. DOOR:locked,(05,12) MONSTER:'@',"watchman",(04,11),peaceful MONSTER:'@',"watch captain",(04,12),peaceful # Beauchamp Tower # Built by Edward I. # A prison named after victim Thomas Beauchamp. MONSTER:'@',"prisoner",(01,08),peaceful MONSTER:'@',"prisoner",(02,09),peaceful DOOR:locked,(03,09) # Tower Green # Many prisoners were beheaded on this grassy knoll. OBJECT:')',"axe",(10,09) # Devereux Tower (Robyn the Devylls Tower) # Probably built by Henry III. # Another prison, named after prisoner Robert Devereux. MONSTER:'@',"prisoner",(04,03),peaceful MONSTER:'@',"prisoner",(03,04),peaceful DOOR:locked,(04,05) # Chapel of St. Peter ad Vincula # First built by Henry I; rebuilt several times. # Many victims of execution were buried in this chapel. DOOR:open,(08,07) REGION:(06,05,11,06),unlit,"morgue" # Flint Tower # Built by Henry III. # Yet another prison -- and considered the worst. MONSTER:'@',"prisoner",(10,02),peaceful MONSTER:'@',"prisoner",(11,03),peaceful DOOR:locked,(11,04) # Bowyer Tower # Built by Henry III. # Home and workshop of the king's bow maker. # # The Tower Fire of 1841 would begin here. OBJECT:')',"silver arrow",(17,01) OBJECT:')',"arrow",(17,01) OBJECT:')',"silver arrow",(18,01) OBJECT:')',"arrow",(18,01) OBJECT:')',"silver arrow",(17,02) OBJECT:')',"arrow",(18,02) OBJECT:')',"silver arrow",(17,02) OBJECT:')',"bow",(18,02) DOOR:closed,(17,03) # Storehouses # These later burned down in the Tower Fire of 1841. # Afterwards, the Waterloo Barracks were built on the site. # Those barracks have been the home of the crown jewels # since 1967. DOOR:closed,(23,05) REGION:(19,04,22,05),lit,"shop" DOOR:closed,(25,04) REGION:(26,04,29,05),lit,"shop" # Brick Tower # Built by Henry III. # Sir Walter Ralegh was held here at one time. DOOR:closed,(24,03) # Martin Tower # Built by Henry III. # This is where the crown jewels were kept at the time of # Colonel Blood's attempted theft in 1671. Talbot Edwards # was the Assistant Keeper of the Jewels. DOOR:open,(31,03) OBJECT:'%',"corpse",(31,02),uncursed,"watchman",0,"Talbot Edwards" # Constable Tower # Built by Henry III. # This is the home of the Constable of the Tower, a lord # (NOT a policeman!) who oversees all operations at the tower # complex. This was a position of privelege appointed by the # monarch. DOOR:locked,(32,07) MONSTER:'@',"watch captain",(33,06),peaceful # Broad Arrow Tower # Built by Henry III. # Roman Catholic priests were imprisoned here in the 1500s. DOOR:closed,(33,11) # Salt Tower (Julius Caesar's Tower) # Site of an ancient Roman fortress. # Prison for Jesuits. DOOR:closed,(32,15) # Royal apartments # Built by Henry III. # This corner of the inner ward contained apartment houses # and gardens for the royal family, the royal court, and # the vast staff of servants. Many of the buildings were # ordered demolished by Oliver Cromwell during his rule as # Lord Protector (1653-1658), in an attempt to remove all # symbols of the monarchy. Only a few buildings survived, # and the royal family no longer used it as a residence. DOOR:closed,(17,14) # Lanthorn Tower # Site of the ancient Roman wall. # Part of the royal residence built by Henry III. # Abandoned at the time of the theft of the crown jewels. DOOR:closed,(24,16) # Wakefield Tower (Hall Tower, Record Tower) # Originally built by Henry III in 1221 as the dining hall # of the royal residence. # After 1360, the records of the kingdom were kept here. # The tower was renamed for William de Wakefield, King's # Clerk to Edward III. REGION:(13,15,15,17),lit,"book shop" DOOR:open,(14,14) # White Tower (the Keep) # The oldest and largest building of the tower complex. # Built by William I "the Conquerer" in 1078 as a military # garrison, to keep control over the inhabitants of London. # Used as the royal residence from 1140 to the reign of # Henry III. The walls were painted white by Henry III to # make it appear more forbidding. This building was # converted into a museum in the 1600s. DOOR:locked,(17,11) DOOR:closed,(21,09) STAIR:(23,09),down ### Lower fill levels ### # # The White Tower # See historical comments above. # MAZE: "Y-fillb", ' ' GEOMETRY:center,center #1234567890123456789012345678901234567890123456789012345678901234567890 MAP ---- ---- --..-- |..| |..-.| |..|------------|.-..| --+-.....+..........-- |.......|........--- |.......|........| |.......|........| |.......|........| |.......|........| |.......|+---------- |.......|..........-- |.......|---------..-- |.......| --..| |.......| --..| |.......|---------..-- --+-.....+..........-- |..|----------------- |..| ---- ENDMAP # Specifications for the whole level RANDOM_MONSTERS: 'd', 'r' REGION:(00,00,22,19),lit,"ordinary" NON_DIGGABLE:(00,00,22,19) STAIR:(19,01),up STAIR:(20,02),down # Barracks REGION:(10,04,17,09),lit,"barracks",filled # Council chamber DOOR:closed,(09,04) DOOR:closed,(09,16) # Chapel gallery DOOR:closed,(10,10) # Prison turrets (now empty) DOOR:locked,(02,04) DOOR:locked,(02,16) # Objects OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random # Random monsters MONSTER:'d',"large dog",random,hostile MONSTER:'d',"large dog",random,hostile MONSTER:'d',"large dog",random,hostile MONSTER:'d',"wolf",random,hostile MONSTER:'d',"werewolf",random,hostile MONSTER:'d',"werewolf",random,hostile MONSTER:'r',"sewer rat",random,hostile MONSTER:'r',"sewer rat",random,hostile MONSTER:'r',"sewer rat",random,hostile MONSTER:'r',"rabid rat",random,hostile MONSTER:'r',"rabid rat",random,hostile # Traps TRAP:"arrow",random TRAP:"arrow",random TRAP:"arrow",random TRAP:"arrow",random TRAP:"board",random TRAP:"board",random ### The quest "goal" level ### # # More of the White Tower # # Here you meet Colonel Blood, your nemesis monster. You have # to defeat him in combat to gain the artifact you have been # assigned to retrieve. # MAZE: "Y-goal", ' ' FLAGS: noteleport GEOMETRY:center,center #1234567890123456789012345678901234567890123456789012345678901234567890 MAP ---- ---- --..-- |..| |..-.| |..|------------|....| --+-.....+..........-- |.......|........--- |.......|........| |.......|..K..K..| |.......|........| |.......|........| |.\.....|+---------- |.......|..........-- |.......|-.-.-.-.-..-- |.......+.........-..| |.......+.........-..| |.......|-.-.-.-.-..-- --+-.....|..........-- |..|----------------- |..| ---- ENDMAP # Specifications for the whole level RANDOM_MONSTERS: 'd', 'r' REGION:(00,00,22,19),lit,"ordinary" NON_DIGGABLE:(00,00,22,19) STAIR:(19,01),up # The Sword Room # The Knights of the Bath were inducted on the eve # of the coronation of a new monarch. They would bathe # in tubs (the sinks) in this room. MONSTER:'@',"knight",(12,07),asleep,peaceful OBJECT:')',"broadsword",(12,08) MONSTER:'@',"knight",(15,07),asleep,peaceful OBJECT:')',"long sword",(15,08) # The banquet hall # After bathing, the Knights of the Bath would feast with # the monarch in this room. DOOR:closed,(09,04) REGION:(02,05,08,16),lit,"throne",unfilled OBJECT:'[',"helm of telepathy",(03,10),blessed,0,"The Crown of Saint Edward" MONSTER:'@',"Colonel Blood",(03,10),hostile OBJECT:'%',random,(04,06) OBJECT:'%',random,(07,07) OBJECT:'%',random,(05,09) OBJECT:'%',random,(03,12) OBJECT:'%',random,(05,15) OBJECT:'%',random,(07,13) # The Chapel of Saint John # Finally, inductees to the Knights of the Bath would # keep an all-night vigil in the chapel, with their armor # laid on the altar. REGION:(10,11,21,16),unlit,"temple",filled,true DOOR:closed,(10,10) DOOR:closed,(09,13) DOOR:closed,(09,14) ALTAR:(18,13),law,altar OBJECT:'[',"chain mail",(18,13) OBJECT:'[',"plate mail",(18,13) #OBJECT:'(',"tallow candle",(10,11),lit #OBJECT:'(',"tallow candle",(19,11),lit #OBJECT:'(',"tallow candle",(10,16),lit #OBJECT:'(',"tallow candle",(19,16),lit # Prison turrets (now empty) DOOR:locked,(02,04) DOOR:locked,(02,16) # Random monsters MONSTER:'d',"large dog",random,hostile MONSTER:'d',"large dog",random,hostile MONSTER:'d',"large dog",random,hostile MONSTER:'d',"wolf",random,hostile MONSTER:'d',"werewolf",random,hostile MONSTER:'d',"werewolf",random,hostile MONSTER:'r',"sewer rat",random,hostile MONSTER:'r',"sewer rat",random,hostile MONSTER:'r',"sewer rat",random,hostile MONSTER:'r',"rabid rat",random,hostile MONSTER:'r',"rabid rat",random,hostile # Traps TRAP:"arrow",random TRAP:"arrow",random TRAP:"arrow",random TRAP:"arrow",random TRAP:"board",random TRAP:"board",random slashem-0.0.7E7F3/dat/wizhelp0000664000076400007640000000135410545462317014034 0ustar alialiDebug-Mode Quick Reference: ^C == increase AC ^E == detect secret doors and traps. ^F == do magic mapping. ^G == create monster. ^I == identify items in pack. ^J == go up an experience level ^N == toggle invulnerability ^O == tell locations of special levels. ^T == do intra-level teleport. ^V == do trans-level teleport. ^W == make wish. ^X == show attributes including intrinsic attributes. #levelchange == change experience level #lightsources == show mobile light sources #monpolycontrol == control monster polymorphs #panic == panic test #polyself == polymorph self #seenv == show seen vectors #stats == show memory statistics #timeout == look at timeout queue #vision == show vision array #wmode == show wall modes slashem-0.0.7E7F3/dat/opthelp0000664000076400007640000004123410545462317014026 0ustar alialiBoolean options not under specific compile flags (with default values in []): (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] BIOS allow the use of IBM ROM BIOS calls [FALSE] cmdassist give help for errors on direction & other commands [TRUE] confirm ask before hitting tame or peaceful monsters [TRUE] DECgraphics use DEC/VT line-drawing characters for the dungeon [FALSE] disclose offer information at the end of the game [TRUE] eight_bit_tty send 8-bit characters straight to terminal [FALSE] extmenu use a menu for selecting extended commands (#) [FALSE] fixinv try to retain the same letter for the same object [TRUE] help print all available info when using the / command [TRUE] IBMgraphics use IBM extended characters for the dungeon [FALSE] ignintr ignore interrupt signal, including breaks [FALSE] legacy print introductory message [TRUE] lit_corridor show a dark corridor as lit if in sight [FALSE] lootabc use a/b/c rather than o/i/b when looting [FALSE] mail enable the mail daemon [TRUE] null allow nulls to be sent to your terminal [TRUE] try turning this option off (forcing NetHack to use its own delay code) if moving objects seem to teleport across rooms number_pad use the number keys to move instead of yuhjklbn [FALSE] perm_invent keep inventory in a permanent window [FALSE] pickup_thrown autopickup things you threw [TRUE] prayconfirm use confirmation prompt when #pray command issued [TRUE] pushweapon when wielding a new weapon, put your previously wielded weapon into the secondary weapon slot [FALSE] rawio allow the use of raw I/O [FALSE] rest_on_space count the space bar as a rest character [FALSE] safe_pet prevent you from (knowingly) attacking your pet(s) [TRUE] showrace show yourself by your race rather than by role [FALSE] silent don't use your terminal's bell sound [TRUE] sortpack group similar kinds of objects in inventory [TRUE] 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] toptenwin print topten in a window rather than stdout [FALSE] travel enable the command to travel to a map location via [TRUE] a shortest-path algorithm, usually invoked by '_'. verbose print more commentary during the game [TRUE] There are further boolean options controlled by compilation flags. Boolean option if INSURANCE was set at compile time: checkpoint save game state after each level change, for possible [TRUE] recovery after program crash Boolean option if NEWS was set at compile time: news print any news from game administrator on startup [TRUE] Boolean option if MFLOPPY was set at compile time: checkspace check free disk space before writing files to disk [TRUE] Boolean option if EXP_ON_BOTL was set at compile time: showexp display your accumulated experience points [FALSE] Boolean option if SCORE_ON_BOTL was set at compile time: showscore display your approximate accumulated score [FALSE] Boolean option if SHOW_DMG was set at compile time: showdmg display damage inflicted/received on message line [FALSE] Boolean options if SHOW_WEIGHT was set at compile time: invweight display weights of items in inventory in braces [FALSE] showweight display total weight in inventory on bottom line [FALSE] Boolean options if TEXTCOLOR was set at compile time: color use different colors for objects on screen [TRUE for micros] hilite_pet display pets in a highlighted manner [FALSE] Boolean option if TEXTCOLOR and MENU_COLOR were set at compile time: menucolors use different colors for menus [TRUE for micros] Boolean option if TIMED_DELAY was set at compile time (tty interface only): timed_delay on unix and VMS, use a timer instead of sending [TRUE] extra screen output when attempting to pause for display effect. on MSDOS without the termcap lib, whether or not to pause for visual effect. Boolean options if KEEP_SAVE was set at compile time: keep_savefile keep save file after restore [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 of the tile graphics, but uses more memory. [TRUE] Any Boolean option can be negated by prefixing it with a '!' or 'no'. Compound options are written as option_name:option_value. 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 [ni na nv ng nc] fruit the name of a fruit you enjoy eating [slime mold] (basically a whimsy which NetHack uses from time to time). menustyle user interface for selection of multiple objects: Traditional -- one object at a time prompting; Combination -- prompt for classes of interest, then menu; Partial -- skip class prompt, use menu of all objects; Full -- menu for classes of interest, then object menu; only the first letter ('T','C','P','F') matters; 'N' (None) is a synonym for 'T', as is boolean style negation [Full] packorder a list of default symbols for kinds of objects that gives the order in which your pack will be displayed [")[%?+!=/(*`0_] (If you specify only some kinds of items, the others from the default order will be appended to the end.) pickup_burden when you pick up an item that exceeds this encumberance level (Unburdened, Burdened, streSsed, straiNed, overTaxed, or overLoaded), you will be asked if you want to continue. [S] pickup_types a list of default symbols for kinds of objects to autopickup when that option is on [all] runmode controls how often the map window is updated when performing multi-step movement (various running modes or travel command): teleport -- don't update map until movement stops; run -- periodically update map (interval is seven steps); walk -- update map after every step; crawl -- like walk, but delay after making each step. (This only affects screen display, not actual movement.) [run] scores the parts of the score list you wish to see when the game ends You choose a combination of top scores, scores around the top scores, and all of your own scores. [!own/3 top/2 around] suppress_alert disable various version-specific warnings about changes in game play or the user interface, such as notification given for engravings that reading is now done via 'r.' (e.g., use suppress_alert:0.0.7 to stop that and any other notifications added in that version or earlier) default: [(none)] tileset the name of a predefined (with TILESET=) tileset to use. This option may be negated (eg., !tileset) or set to an emty value to disable tiles. If the windowing port does not support the named tileset then a suitable alternative will be used. [depends on windowing port] Compound options which may be set only on startup are: align Your starting alignment (align:lawful, align:neutral, or align:chaotic). You may specify just the first letter. [RANDOM] catname the name of your first cat [NONE] dogname the name of your first dog [NONE] dungeon a list of symbols to be used in place of the default ones for drawing the dungeon. The symbols are subjected to a fair amount of processing, so that you can use C-style escapes such as \n or \081 as well as indicate control characters by ^x or meta characters by \Mx. As usual, \ can force the next character to be taken literally. Since many of the default symbols are overloaded, they are given here by name instead of symbol, with some added notes: stone (solid rock, normally ' ') vwall hwall tlcorn trcorn blcorn brcorn (room boundaries) crwall tuwall tdwall tlwall trwall (wallified maze characters) nodoor vodoor hodoor (no, vertical, horizontal open door) vcdoor hcdoor (vertical, horizontal closed door) ironbars tree room darkcorr litcorr upstair dnstair upladder dnladder altar grave throne sink toilet fountain pool ice lava vodbridge hodbridge (vertical, horizontal open drawbridge) vcdbridge hcdbridge (vertical, horizontal closed drawbridge) air cloud water default: \ |--------||.-|++##.##<><>_|\\##{}.}..##\ #} effects like dungeon, but for special effects symbols vbeam hbeam lslant rslant (generic zap beams) digbeam flashbeam (special beams for digging and cameras) boomleft boomright (boomerangs) ss1 ss2 ss3 ss4 (shielding sequence) sw_topl, sw_topm, sw_topr, (swallow, top row) sw_midl, sw_midr, (swallow, middle row [no center]) sw_botl, sw_botm, sw_botr (swallow, bottom row) mextl mextm mextr (magical explosion matrix top row) mexml mexmm mexmr (magical explosion matrix middle row) mexbl mexbm mexbr (magical explosion matrix bottom row) fextl fextm fextr (fire explosion matrix top row) fexml fexmm fexmr (fire explosion matrix middle row) fexbl fexbm fexbr (fire explosion matrix bottom row) cextl cextm cextr (cold explosion matrix top row) cexml cexmm cexmr (cold explosion matrix middle row) cexbl cexbm cexbr (cold explosion matrix bottom row) dextl dextm dextr (death explosion matrix top row) dexml dexmm dexmr (death explosion matrix middle row) dexbl dexbm dexbr (death explosion matrix bottom row) lextl lextm lextr (lightning explosion matrix top row) lexml lexmm lexmr (lightning explosion matrix middle row) lexbl lexbm lexbr (lightning explosion matrix bottom row) pextl pextm pextr (poison explosion matrix top row) pexml pexmm pexmr (poison explosion matrix middle row) pexbl pexbm pexbr (poison explosion matrix bottom row) aextl aextm aextr (acid explosion matrix top row) aexml aexmm aexmr (acid explosion matrix middle row) aexbl aexbm aexbr (acid explosion matrix bottom row) default: |-\\/*!)(0#@*/-\\||\\-//-\\|\ |\\-//-\\|\ |\\-//-\\|\ |\\-/ /-\\|\ |\\-//-\\|\ |\\-//-\\|\ |\\-//-\\|\ |\\-/ 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" options, the "gender" option will take precedence. [RANDOM] horsename the name of your first horse [NONE] ghoulname the name of your first ghoul [NONE] menucolor Set colors for menus. (menucolor:"regex_string"=color) If boolean option ``menucolors'' is true, menus will be shown with different colors. For example, setting ``menucolor:" blessed "=green'' shows all lines in a menu with the text " blessed " in green. The string is matched using regular expressions. Valid values for the color are black, red, green, brown, blue, magenta, cyan, gray, orange, lightgreen, yellow, lightblue, lightmagenta, lightcyan and white. You can define menucolor as many times as you wish; those defined later will take precedence. Setting menucolor has effect only if TEXTCOLOR and MENU_COLOR were set at compile time. [NONE] menu_* create single character accelerators for menu commands. Below is a list of all commands. Each is followed by a list of window- ports that implement them: 'x' is X11, 't' is tty, 'g' is Gem, 'a' is Amiga. menu_deselect_all deselect all items in a menu [-](gxta) menu_deselect_page deselect all items on this page of a menu [\](gta) menu_first_page jump to the first page in a menu [^](gta) menu_invert_all invert all items in a menu [@](gxta) menu_invert_page invert all items on this page of a menu [~](gta) menu_last_page jump to the last page in a menu [|](gta) menu_next_page goto the next menu page [>](gta) menu_previous_page goto the previous menu page [<](gta) menu_search search for a menu item [:](gxa) menu_select_all select all items in a menu [.](gxta) menu_select_page select all items on this page of a menu [,](gta) monsters like dungeon, but for monster symbols default: abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ@\ \\&;:~] msghistory number of top line messages to save [20] name the name of your character [obtained by asking the system or the player] 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 choose only the first role it finds that matches; thus, it is recommended that you spell out as much of the role name as possible. You can also still denote your role by appending it to the "name" option (e.g., name:Vic-V), but the "role" option will take precedence. [RANDOM] traps like dungeon, but for trap symbols 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_trap polymorph_trap default: ^^^^^^^^^^^^^^^^^"^^^^ windowtype windowing system to be used [depends on operating system] wolfname the name of your first wolf [NONE] Compound option if TTY_GRAPHICS was set at compile time: msg_window the type of message window to use: single -- One message at a time full -- Full window with all saved top line messages reverse -- Same as full, but messages printed most-recent-first combination -- Two single messages, then as full default: single Some sample options lists are: !autopickup,!tombstone,name:Gandalf,scores:own/3 top/2 around female,nonews,dogname:Rover,dungeon: |--------||.-|++.##<><>_\\#{}.}..## #} rest_on_space,!verbose,menustyle:traditional slashem-0.0.7E7F3/dat/mall-2.des0000664000076400007640000000510610545462317014207 0ustar aliali# SCCS Id: @(#)mall-2.des 3.4 1993/02/23 # Copyright (c) 1989 by Jean-Christophe Collet # Copyright (c) 1991 by M. Stephenson # NetHack may be freely redistributed. See license for details. # LEVEL: "mall-2" MESSAGE: "You hear the sounds of civilization." RANDOM_MONSTERS:'@','r' ROOM: "ordinary" , lit, random, random, (48,15) NAME: "town" FOUNTAIN: (22, 7) # # The Town Watch. # MONSTER: '@', "watchman", random, peaceful MONSTER: '@', "watchman", random, peaceful MONSTER: '@', "watchman", random, peaceful MONSTER: '@', "watchman", random, peaceful MONSTER: '@', "watch captain", random, peaceful MONSTER: '@', "watch captain", random, peaceful MONSTER: '@', "watch captain", random, peaceful MONSTER: '@', "mugger", random, hostile MONSTER: '@', "mugger", random, hostile MONSTER: '@', "mugger", random, hostile MONSTER: '@', "mugger", random, hostile MONSTER: 'r', "sewer rat", random, hostile MONSTER: 'r', "sewer rat", random, hostile MONSTER: 'd', "little dog", random, hostile # from 2 to 48 across SUBROOM: "weapon shop", lit, (2,2), (5,4), "town" CHANCE: 20 DOOR: false, open, south, random SUBROOM: "ring shop", lit, (8,2), (4,4), "town" CHANCE: 12 DOOR: false, open, south, random SUBROOM: "candle shop", lit, (15,3), (5,3), "town" CHANCE: 33 DOOR: false, open, south, random SUBROOM: "armor shop", unlit, (25,2), (6,4), "town" CHANCE: 22 DOOR: false, open, south, random SUBROOM: "food shop", lit, (32,2), (14,3), "town" CHANCE: 40 DOOR: false, open, south, random SUBROOM: "scroll shop", unlit, (2,9), (6,4), "town" CHANCE: 20 DOOR: false, open, north, random SUBROOM: "potion shop", lit, (9,9), (6,4), "town" CHANCE: 30 DOOR: false, open, north, random SUBROOM: "tool shop" , lit, (19,10), (5,3), "town" CHANCE: 20 DOOR: false, open, north, random SUBROOM: "book shop", lit, (25,10), (4,3), "town" CHANCE: 12 DOOR: false, open, north, random # WAC Changed chance from 20 to 100. Should be at least 1 guaranteed shop SUBROOM: "shop", lit, (33,9), (9,4), "town" #CHANCE: 20 DOOR: false, open, west, random SUBROOM: "wand shop", lit, (43,10), (3,3), "town" CHANCE: 17 DOOR: false, open, north, random ROOM: "ordinary" , random, random, random, random STAIR: random, up STAIR: random, down MONSTER: random, random, random ROOM: "ordinary" , random, random, random, random MONSTER: random, random, random OBJECT: random, random, random ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random ROOM: "ordinary" , random, random, random, random MONSTER: random, random, random OBJECT: random, random, random TRAP: random, random RANDOM_CORRIDORS slashem-0.0.7E7F3/dat/bigroom.des0000664000076400007640000003633710545462317014573 0ustar aliali# 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. # # These are the bigroom levels: # MAZE:"bigrm-1",' ' GEOMETRY:center,center MAP --------------------------------------------------------------------------- |.........................................................................| |.........................................................................| |.........................................................................| |.........................................................................| |.........................................................................| |.........................................................................| |.........................................................................| |.........................................................................| |.........................................................................| |.........................................................................| |.........................................................................| |.........................................................................| |.........................................................................| |.........................................................................| |.........................................................................| |.........................................................................| --------------------------------------------------------------------------- ENDMAP # Dungeon Description REGION:(01,01,73,16),lit,"ordinary" # Stairs STAIR:random,up STAIR:random,down # Non diggable walls NON_DIGGABLE:(00,00,74,17) # Objects OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,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:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random # Here, just play with the lighting... MAZE:"bigrm-2",' ' GEOMETRY:center,center MAP --------------------------------------------------------------------------- |.........................................................................| |.........................................................................| |.........................................................................| |.........................................................................| |.........................................................................| |.........................................................................| |.........................................................................| |.........................................................................| |.........................................................................| |.........................................................................| |.........................................................................| |.........................................................................| |.........................................................................| |.........................................................................| |.........................................................................| |.........................................................................| --------------------------------------------------------------------------- ENDMAP # Dungeon Description REGION:(01,01,23,06),lit,"ordinary" REGION:(01,07,23,10),unlit,"ordinary" REGION:(01,11,23,16),lit,"ordinary" REGION:(24,01,50,06),unlit,"ordinary" REGION:(24,07,50,10),lit,"ordinary" REGION:(24,11,50,16),unlit,"ordinary" REGION:(51,01,73,06),lit,"ordinary" REGION:(51,07,73,10),unlit,"ordinary" REGION:(51,11,73,16),lit,"ordinary" # Stairs STAIR:random,up STAIR:random,down # Non diggable walls NON_DIGGABLE:(00,00,74,17) # Objects OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,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:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random # Now, let's get fancy... MAZE:"bigrm-3",' ' GEOMETRY:center,center MAP --------------------------------------------------------------------------- |.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.| |.........................................................................| |.........................................................................| |.........................................................................| |..............---.......................................---..............| |...............|.........................................|...............| |.....|.|.|.|.|---|.|.|.|.|...................|.|.|.|.|.|---|.|.|.|.|.....| |.....|-------- --------|...................|---------- --------|.....| |.....|.|.|.|.|---|.|.|.|.|...................|.|.|.|.|.|---|.|.|.|.|.....| |...............|.........................................|...............| |..............---.......................................---..............| |.........................................................................| |.........................................................................| |.........................................................................| |.........................................................................| |.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.| --------------------------------------------------------------------------- ENDMAP # Dungeon Description REGION:(01,01,73,16),lit,"ordinary" # Stairs STAIR:random,up STAIR:random,down # Non diggable walls NON_DIGGABLE:(00,00,74,17) # Objects OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,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:random,random,(01,01) MONSTER:random,random,(13,01) MONSTER:random,random,(25,01) MONSTER:random,random,(37,01) MONSTER:random,random,(49,01) MONSTER:random,random,(61,01) MONSTER:random,random,(73,01) MONSTER:random,random,(07,07) MONSTER:random,random,(13,07) MONSTER:random,random,(25,07) MONSTER:random,random,(37,07) MONSTER:random,random,(49,07) MONSTER:random,random,(61,07) MONSTER:random,random,(67,07) MONSTER:random,random,(07,09) MONSTER:random,random,(13,09) MONSTER:random,random,(25,09) MONSTER:random,random,(37,09) MONSTER:random,random,(49,09) MONSTER:random,random,(61,09) MONSTER:random,random,(67,09) MONSTER:random,random,(01,16) MONSTER:random,random,(13,16) MONSTER:random,random,(25,16) MONSTER:random,random,(37,16) MONSTER:random,random,(49,16) MONSTER:random,random,(61,16) MONSTER:random,random,(73,16) MAZE:"bigrm-4",' ' GEOMETRY:center,center MAP ----------- ----------- |.........| |.........| |.........|-----------| |-----------|.........| |-|...................|----------| |----------|...................|-| -|.............................|-------|.............................|- -|.................................................................|- -|...............................................................|- -|.............................................................|- -|...........................................................|- -|...........................................................|- -|.............................................................|- -|...............................................................|- -|.................................................................|- -|.............................|-------|.............................|- |-|...................|----------| |----------|...................|-| |.........|-----------| |-----------|.........| |.........| |.........| ----------- ----------- ENDMAP # Dungeon Description REGION:(01,01,73,16),lit,"ordinary" # Stairs STAIR:random,up STAIR:random,down # Non diggable walls NON_DIGGABLE:(00,00,74,17) # Fountains FOUNTAIN:(05,02) FOUNTAIN:(05,15) FOUNTAIN:(69,02) FOUNTAIN:(69,15) # Objects OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,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:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random # Try an oval room... MAZE:"bigrm-5",' ' GEOMETRY:center,center MAP ------------------ ---------................--------- -------................................------- ------............................................------ ----......................................................---- ---............................................................--- ---................................................................--- ---....................................................................--- |........................................................................| |........................................................................| |........................................................................| ---....................................................................--- ---................................................................--- ---............................................................--- ----......................................................---- ------............................................------ -------................................------- ---------................--------- ------------------ ENDMAP # Dungeon Description REGION:(00,00,72,18),lit,"ordinary" # Stairs STAIR:random,up STAIR:random,down # Non diggable walls NON_DIGGABLE:(00,00,72,18) # Objects OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,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:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random slashem-0.0.7E7F3/dat/Ice.des0000664000076400007640000002253510545462317013630 0ustar aliali# SCCS Id: @(#)Ice.des 3.4 1991/09/30 # Copyright (c) 1989 by Jean-Christophe Collet # Copyright (c) 1991-2 by M. Stephenson # NetHack may be freely redistributed. See license for details. # # The "start" level for the quest. # # Here you meet your (besieged) class leader, the High Ice Mage, # and receive your quest assignment. # MAZE: "Ice-strt",' ' FLAGS: noteleport,hardfloor GEOMETRY:center,center MAP IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIII ............... IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIII .. .. IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIII .. IIII ..... IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIII .. IIIII ..... IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIII ............ IIIII .. IIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII III .. III .. IIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII II .. IIIIIIIIIIIII .... IIIPPPPPPIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII II .. IIIIIIIIIIIII .. IIPPP....PPPII IIIIIIIIIIIIIIIIIIIIIIIIIIIIII I .... IIIIIIIIIIII .. ...IIPP........PPII IIIIIIIIIIIIIIIIIIIIIIIIIIIII I ..... IIIIIIIIII ..... IIPPP....PPPII IIIIIIIIIIIIIIIIIIIIIIIIIIIIII II ... IIIIIIIIIIII IIIPPPPPPIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIII III IIIIIIIIIIIIIIIIIIIIII IIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIII IIIIIIIIIIIIIIIIIIIIII...IIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIII.....IIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...IIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII ENDMAP # Random Monsters RANDOM_MONSTERS: 'R', 'E' # Dungeon Description REGION:(00,00,75,19),lit,"ordinary" # Portal arrival point BRANCH:(65,16,65,16),(0,0,0,0) # Stairs STAIR:(05,12),down # High Ice Mage MONSTER:'@',"High Ice Mage",(36,11) # The treasure of the High Ice Mage OBJECT:'(',"chest",(37,11) # guards for the audience chamber MONSTER:'@',"froster",(35,10) MONSTER:'@',"froster",(35,11) MONSTER:'@',"froster",random MONSTER:'@',"froster",random MONSTER:'@',"froster",random MONSTER:'@',"froster",random MONSTER:'@',"froster",random MONSTER:'D',"baby white dragon",random,peaceful MONSTER:'D',"white dragon",random,peaceful MONSTER:'D',"white dragon",random,peaceful # Non diggable NON_DIGGABLE:(00,00,75,19) # Random traps TRAP:"falling rock",random TRAP:"falling rock",random TRAP:"falling rock",random TRAP:"falling rock",random TRAP:"falling rock",random TRAP:"falling rock",random TRAP:"magic",random TRAP:"magic",random # Monsters on siege duty. MONSTER: 'E',"earth elemental",random,hostile MONSTER: 'E',"earth elemental",random,hostile MONSTER: 'E',"earth elemental",random,hostile MONSTER: 'E',"earth elemental",random,hostile MONSTER: 'E',"earth elemental",random,hostile MONSTER: 'X',"xorn",random,hostile MONSTER: 'X',"xorn",random,hostile MONSTER: 'X',"xorn",random,hostile MONSTER: 'X',"xorn",random,hostile # # The "locate" level for the quest. # # Here you have to find the stairs to go # further towards your assigned quest. # MAZE: "Ice-loca",' ' FLAGS: hardfloor INIT_MAP: '.' , ' ' , true , true , lit , false GEOMETRY:center,center MAP .... .... .. ... .. . . ...................... . .. ... ........... ............ . . . ...... ......... . ......... .. .... ........ ....... ... ....... .... .. ........... ..... ..... ..... ...... . .......... ... ....... ... ........ . .......... . ......... . ......... . .. ......... ........... ........ .. . .......................... . .. ... .... .... . ENDMAP # Random Monsters RANDOM_MONSTERS: 'E', 'R' # Dungeon Description REGION:(00,00,39,12),lit,"ordinary" # Stairs STAIR:(48,14),up STAIR:(20,06),down # Objects OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random # Random traps TRAP:"falling rock",random TRAP:"falling rock",random TRAP:"falling rock",random TRAP:"falling rock",random TRAP:random,random TRAP:random,random # Random monsters. MONSTER:'E',"earth elemental",random,hostile MONSTER:'E',"earth elemental",random,hostile MONSTER:'E',"earth elemental",random,hostile MONSTER:'E',"earth elemental",random,hostile MONSTER:'E',"earth elemental",random,hostile MONSTER:'E',"earth elemental",random,hostile MONSTER:'E',"earth elemental",random,hostile MONSTER:'E',"earth elemental",random,hostile MONSTER:'E',"earth elemental",random,hostile MONSTER:'E',"earth elemental",random,hostile MONSTER:'X',"xorn",random,hostile MONSTER:'X',"xorn",random,hostile MONSTER:'X',"xorn",random,hostile MONSTER:'X',"xorn",random,hostile # # The "goal" level for the quest. # # Here you meet the Earth Mage, your nemesis monster. You have # to defeat him in combat to gain the artifact you have # been assigned to retrieve. # MAZE: "Ice-goal", 'P' INIT_MAP: '.' , ' ' , true , true , lit , false GEOMETRY:center,center MAP ................................... ..... . ...... ... ............. ... .. ...|---------|... .. . ..|--.........--|.. . .|-... ...-|. ..|... ..... ...|.. .|-.. ....... ..-|. .|... ....... ...|. .|-.. ....... ..-|. ..|... ..... ...|.. .|-... ...-|. . ..|--.........--|.. . .. ...|---------|... .. ... ............. ... ..... . ..... ................................... ENDMAP # Random Monsters RANDOM_MONSTERS: 'E', 'R' # Dungeon Description REGION:(00,00,34,16),lit,"ordinary" # Stairs # Note: The up stairs are *intentionally* off of the map. STAIR:(45,10),up # Drawbridges DRAWBRIDGE:(17,02),south,closed DRAWBRIDGE:(17,14),north,closed # Objects OBJECT:'(',"magic whistle",(17,08),blessed,0,"The Storm Whistle" OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random # Random traps TRAP:"falling rock",random TRAP:"falling rock",random TRAP:"falling rock",random TRAP:"falling rock",random TRAP:random,random TRAP:random,random # KMH, balance patch 2 -- all quests now have an altar ALTAR:(17,08),noalign,altar # Random monsters. MONSTER:'@',"Earth Mage",(17,08) MONSTER:'E',"earth elemental",random,hostile MONSTER:'E',"earth elemental",random,hostile MONSTER:'E',"earth elemental",random,hostile MONSTER:'E',"earth elemental",random,hostile MONSTER:'E',"earth elemental",random,hostile MONSTER:'E',"earth elemental",random,hostile MONSTER:'E',"earth elemental",random,hostile MONSTER:'E',"earth elemental",random,hostile MONSTER:'X',"xorn",random,hostile MONSTER:'X',"xorn",random,hostile MONSTER:'X',"xorn",random,hostile MONSTER:'X',"xorn",random,hostile MONSTER:'X',"xorn",random,hostile # # The "fill" levels for the quest. # # These levels are used to fill out any levels not occupied by specific # levels as defined above. "filla" is the upper filler, between the # start and locate levels, and "fillb" the lower between the locate # and goal levels. # MAZE: "Ice-fila" , 'I' INIT_MAP: '.' , 'I' , true , true , lit, false NOMAP # STAIR: random, up STAIR: random, down # OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random # MONSTER: 'E', "earth elemental", random MONSTER: 'E', "earth elemental", random MONSTER: 'E', "earth elemental", random MONSTER: 'E', "earth elemental", random MONSTER: 'E', "earth elemental", random MONSTER: 'E', "earth elemental", random MONSTER: 'E', "earth elemental", random MONSTER: 'X', "xorn", random, hostile MONSTER: 'X', "xorn", random, hostile MONSTER: 'X', "xorn", random, hostile # TRAP: random, random TRAP: random, random TRAP: random, random TRAP: random, random TRAP: random, random TRAP: random, random TRAP: random, random MAZE: "Ice-filb" , ' ' INIT_MAP: '.' , ' ' , true , true , lit, false NOMAP # STAIR: random, up STAIR: random, down # OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random # MONSTER: 'E', "earth elemental", random MONSTER: 'E', "earth elemental", random MONSTER: 'E', "earth elemental", random MONSTER: 'E', "earth elemental", random MONSTER: 'E', "earth elemental", random MONSTER: 'E', "earth elemental", random MONSTER: 'E', "earth elemental", random MONSTER: 'X', "xorn", random, hostile MONSTER: 'X', "xorn", random, hostile # TRAP: "falling rock", random TRAP: "falling rock", random TRAP: "falling rock", random TRAP: "falling rock", random TRAP: "falling rock", random TRAP: random, random TRAP: random, random slashem-0.0.7E7F3/dat/dungeon.def0000664000076400007640000002173210545462317014550 0ustar aliali# SCCS Id: @(#)dungeon.def 3.3 96/03/10 # Copyright (c) 1990-92 by M. Stephenson # NetHack may be freely redistributed. See license for details. # # The dungeon description file for Slash'em. # Modified by KMH for the balance patch. # # Note: The order of the definition of dungeons in this file # reflects in their order of creation in the real dungeon. # The "Main" branch must *always* be first. # Also note that the order of the dungeons in this file # determines the order in which branch levels are assigned. # If two dungeons have overlapping ranges for their entry # points, then you should list the dungeon with the _least_ # number of choices for its branch level _first_. ### The Dungeons of Doom ### # The main dungeon is from 42 to 47 levels deep... # [Tom] stretched it out to make it a little more interesting, and # have more "normal" levels, because the special ones were more # frequent than normal ones! DUNGEON: "The Dungeons of Doom" "D" (42, 5) ALIGNMENT: unaligned # Early levels, to the Oracle # KMH -- The Gnomish Mines are an important source of essential # items for low-level characters: food, armor, and tools. Even a # short stay in the mines pays off. Slash moved the entrance # deeper, penalizing many characters. The balance patch restores # the entrance to levels 2 to 4. BRANCH: "The Gnomish Mines" @ (2, 3) # # New mall is on levels 5 to 6, 75% chance. # There shouldn't be any other special levels down to the Oracle. # This allows a weak character to plunge to the Oracle, then return # to the Mines. RNDLEVEL: "mall" "T" @ (5, 2) 75 2 LEVALIGN: lawful LEVELDESC: town # # Oracle on levels 7 to 9. LEVEL: "oracle" "O" @ (7, 3) LEVALIGN: neutral CHAINBRANCH: "Sokoban" "oracle" + (1, 0) up -1 # Levels between the Oracle and the Quest. # There's no guarantee that all will be created. LEVEL: "rats" "R" @ (10, 2) 50 RNDLEVEL: "kobold" "K" @ (11, 2) 50 2 BRANCH: "Grund's Stronghold" @ (12, 2) # The quests, on levels 15 to 19. # These levels should not be shared with other special levels # or branches, else the quests may not be generated! BRANCH: "The Quest" @ (15, 5) portal BRANCH: "Lawful Quest" @ (15, 5) portal BRANCH: "Neutral Quest" @ (15, 5) portal BRANCH: "Chaotic Quest" @ (15, 5) portal # The rogue level (if required), on levels 15 to 19. The portal to one # of the quest levels may also be on this level. The rogue level is not # defined by default in Slash'EM. The dungeon is crowded enough already. %REINCARNATION LEVEL: "rogue" "R" @ (15, 5) # Post-quest levels # Now all the branches... stretching all along the dungeon # Put the branches with the least number of choices first BRANCH: "The Wyrm Caves" @ (20, 2) BRANCH: "One-eyed Sam's Market" @ (22, 2) portal BRANCH: "The Lost Tomb" @ (21, 4) BRANCH: "The Spider Caves" @ (26, 4) BRANCH: "The Sunless Sea" @ (28, 4) BRANCH: "The Temple of Moloch" @ (32, 4) BRANCH: "The Giant Caverns" @ (32, 4) # And the levels... LEVEL: "nymph" "N" @ (23, 2) 45 RNDLEVEL: "bigrm" "B" @ (20, 7) 15 5 # Storage room (treasure) on levels 19-26, 66% of the time # "Unused 'cause they suck"? RNDLEVEL: "stor" "S" @ (19, 8) 66 3 # Rounding out the bottom levels LEVEL: "guild" "G" @ (26, 6) 50 # The famous Fort Ludios... BRANCH: "Fort Ludios" @ (23, 4) portal # Medusa and the castle. There should be nothing in between. RNDLEVEL: "medusa" "none" @ (-5, 4) 4 LEVALIGN: chaotic LEVEL: "castle" "none" @ (-1, 0) CHAINBRANCH: "Gehennom" "castle" + (0, 0) no_down # Branch to the endgame... BRANCH: "The Elemental Planes" @ (1, 0) no_down up -2 ### Gehennom ### # # Now re-worked for 3.1, hell is hopefully going to be a little # less boring. Also, in 3.1, the tower is not considered as a # part of hell, but is set up as a separate dungeon. # # Gehennom is no longer considered "hellish" as a complete dungeon. # That is, fire resistance is no longer a condition for survival in # it. However, Gehennom, and the special levels in it in particular, # is abundant with fire traps. As a result, fire resistance is still # a prudent survival strategy in Gehennom. # # Note: Gehennom *must* be the second dungeon defined so that # monsters can properly migrate here under certain # circumstances. # # [Tom] tried to remove most of the non-unique levels (i.e. lame mazes) # also tried to organize it a little -- demons before the wizard, devils # after. DUNGEON: "Gehennom" "G" (17, 0) DESCRIPTION: mazelike DESCRIPTION: hellish ALIGNMENT: noalign LEVEL: "valley" "V" @ (1, 0) LEVEL: "sanctum" "none" @ (-1, 0) # Tower before wiz, please BRANCH: "Vlad's Tower" @ (3, 10) up -1 # Dr. Frankenstein's Lab BRANCH: "Frankenstein's Lab" @ (3, 10) up # The demon levels LEVEL: "juiblex" "J" @ (2, 5) LEVEL: "yeenoghu" "E" @ (2, 5) LEVEL: "orcus" "O" @ (2, 5) LEVEL: "demogorg" "D" @ (2, 5) # Half-way down LEVEL: "wizard1" "none" @ (7, 0) CHAINLEVEL: "wizard2" "X" "wizard1" + (1, 0) CHAINLEVEL: "wizard3" "Y" "wizard1" + (2, 0) # The devil levels LEVEL: "baalz" "B" @ (10, 6) LEVEL: "geryon" "R" @ (10, 6) LEVEL: "dispater" "S" @ (10, 6) LEVEL: "asmodeus" "A" @ (10, 6) LEVEL: "fakewiz1" "F" @ (10, 6) LEVEL: "fakewiz2" "G" @ (10, 6) ### Gnomish Mines ### # (The Mines of the Gnomes of Zurich.) # DUNGEON: "The Gnomish Mines" "M" (8, 2) ALIGNMENT: lawful DESCRIPTION: mazelike RNDLEVEL: "minetn" "T" @ (3, 2) 7 LEVELDESC: town RNDLEVEL: "minend" "E" @ (-2, 0) 3 LEVEL: "mineking" "M" @ (-1, 0) ### The Quest Dungeon ### # This is a proto-dungeon. The level file names will be prepended with # the role code (eg, Arc, Val) during initialization. # Special "x-fila" and "x-filb" levels must be defined in the levels # description file. It will be used for all levels not defined explicitly # below. DUNGEON: "The Quest" "Q" (5, 2) LEVEL: "x-strt" "none" @ (1, 1) LEVEL: "x-loca" "L" @ (3, 1) LEVEL: "x-goal" "none" @ (-1, 0) ### The aligned key quests ### DUNGEON: "Lawful Quest" "none" (1, 0) ALIGNMENT: lawful DESCRIPTION: mazelike LEVEL: "nightmar" "none" @ (1, 0) DUNGEON: "Neutral Quest" "none" (1, 0) ALIGNMENT: neutral DESCRIPTION: mazelike LEVEL: "beholder" "none" @ (1, 0) DUNGEON: "Chaotic Quest" "none" (1, 0) ALIGNMENT: chaotic DESCRIPTION: mazelike LEVEL: "lich" "none" @ (1, 0) # # Sokoban # DUNGEON: "Sokoban" "none" (4, 0) DESCRIPTION: mazelike ALIGNMENT: neutral RNDLEVEL: "soko1" "none" @ (1, 0) 4 RNDLEVEL: "soko2" "none" @ (2, 0) 7 RNDLEVEL: "soko3" "none" @ (3, 0) 7 RNDLEVEL: "soko4" "none" @ (4, 0) 5 ### Grund's Stronghold ### DUNGEON: "Grund's Stronghold" "Z" (1, 0) ALIGNMENT: chaotic DESCRIPTION: mazelike RNDLEVEL: "grund" "Z" @ (1, 0) 3 ### Fort Ludios ### # (The Central Vault of Croesus.) # DUNGEON: "Fort Ludios" "K" (1, 0) DESCRIPTION: mazelike ALIGNMENT: unaligned LEVEL: "knox" "K" @ (-1, 0) ### The Wyrm Caves ### DUNGEON: "The Wyrm Caves" "D" (1, 0) ALIGNMENT: chaotic DESCRIPTION: mazelike LEVEL: "dragons" "D" @ (1, 0) ### The Black Market ### DUNGEON: "One-eyed Sam's Market" "D" (1, 0) ALIGNMENT: chaotic DESCRIPTION: mazelike LEVEL: "blkmar" "D" @ (1, 0) ### The Lost Tomb ### DUNGEON: "The Lost Tomb" "L" (1, 0) ALIGNMENT: chaotic DESCRIPTION: mazelike LEVEL: "tomb" "L" @ (1, 0) ### The Spider Caves ### DUNGEON: "The Spider Caves" "S" (1, 0) ALIGNMENT: chaotic DESCRIPTION: mazelike LEVEL: "spiders" "S" @ (1, 0) ### The Sunless Sea ### DUNGEON: "The Sunless Sea" "none" (1, 0) ALIGNMENT: chaotic DESCRIPTION: mazelike LEVEL: "sea" "none" @ (1, 0) ### The Temple of Moloch ### DUNGEON: "The Temple of Moloch" "none" (1, 0) ALIGNMENT: chaotic DESCRIPTION: mazelike LEVEL: "mtemple" "none" @ (1, 0) ### The Giant Caverns ### DUNGEON: "The Giant Caverns" "H" (1, 0) ALIGNMENT: chaotic DESCRIPTION: mazelike LEVEL: "cav2fill" "H" @ (1, 0) ### Vlad's Tower ### # It has been removed from Gehennom, and it is surrounded by stone. DUNGEON: "Vlad's Tower" "T" (3, 0) PROTOFILE: "tower" DESCRIPTION: mazelike ALIGNMENT: chaotic ### Dr Frankenstein's Lab ### DUNGEON: "Frankenstein's Lab" "none" (1, 0) ALIGNMENT: chaotic DESCRIPTION: mazelike LEVEL: "frnknstn" "none" @ (1, 0) ### The Endgame levels ### # # Enter on 2nd level from bottom; 1st (from bottom) is a # placeholder for surface level, and should be unreachable. # [Note: the name "dummy" is checked for in init_dungeons().] # DUNGEON: "The Elemental Planes" "E" (6, 0) DESCRIPTION: mazelike ALIGNMENT: unaligned LEVEL: "astral" "none" @ (1, 0) LEVEL: "water" "none" @ (2, 0) LEVEL: "fire" "none" @ (3, 0) LEVEL: "air" "none" @ (4, 0) LEVEL: "earth" "none" @ (5, 0) LEVEL: "dummy" "none" @ (6, 0) slashem-0.0.7E7F3/dat/hh0000664000076400007640000001340210545462317012746 0ustar alialiy k u 7 8 9 Move commands: \|/ \|/ yuhjklbn: go one step in specified direction h-.-l 4-.-6 YUHJKLBN: go in specified direction until you /|\ /|\ hit a wall or run into something 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 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 ` menu access the menusystem S save save the game (to be continued later) ! sh escape to some SHELL (if allowed) ^Z suspend suspend the game (independent of your current suspend char) O options set options / whatis tell what a map symbol represents \ known display list of what's been discovered v version display version number V history display game history X explore switch the game to explore (discovery) mode ^A again redo the previous command (^A denotes the keystroke CTRL-A) ^R redraw redraw the screen ^P prevmsg repeat previous message (subsequent ^P's repeat earlier ones) # introduces an extended command (#? for a list of them) Game commands: ^B bereave steal ^D kick kick (a door, or something else) ^T 'port teleport (if you can) ^X show show your attributes ^Y poly' polymorph (if possible) a apply apply or use a tool (pick-axe, key, camera, etc.) A armor take off all armor c close close a door C call name an individual monster (ex. baptize your dog) d drop drop an object. d7a: drop seven items of object 'a' D Drop drop selected types of objects e eat eat something (or drain corpse, if vampire) E engrave write a message in the dust on the floor (E- use fingers) f fire fire item from quiver F fight followed by direction, fight a monster i invent list your inventory (all objects you are carrying) I Invent list selected parts of your inventory Iu: list unpaid objects Ix: list unpaid but used up items I$: count your money n# repeat repeat next command N name name or classify an item o open open a door p pay pay your bill (in a shop)/shopkeeper services P puton put on an accessory (ring, amulet, etc) q quaff drink something (potion, water, etc) Q quiver select ammunition for quiver r read read a scroll or spell book R remove remove an accessory (ring, amulet, etc) s search search for secret doors, hidden traps and monsters t throw throw or shoot a weapon T takeoff take off some armor w wield wield a weapon (w- wield nothing) W wear put on some armor x exchange swap weapon slots X spells list the spells you know z zap zap a wand Z Zap cast a spell < up go up the stairs > down go down the stairs ^ trap_id identify a previously found trap ),[,=,",( ask for current items of specified symbol in use * items list and change items in use $ gold count your gold + spells list the spells you know _ 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 : look look at what is here ; farlook look at what is somewhere else by selecting a map symbol 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-b bereave steal M-c chat talk to someone M-d dip dip an object into something M-e enhance advance or check weapons skills M-f force force a lock M-i invoke invoke an object's special powers M-j jump jump to another location M-l loot loot a box on the floor M-m monster use a monster's special ability M-n name name an item or type of object M-o offer offer a sacrifice to the gods M-p pray pray to the gods for help M-q quit quit the game M-r rub rub a lamp or a stone M-s sit sit down M-t tech use a class specific technique M-u untrap untrap something M-y youpoly polymorph yourself M-v version print compile time options for this version M-w wipe wipe off your face 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) K kills list vanquished monsters (whether by you or not) l loot loot a box on the floor N name name an item or type of object u untrap untrap something (usually a trapped object) slashem-0.0.7E7F3/dat/beholder.des0000664000076400007640000000663710545462317014721 0ustar aliali# SCCS Id: @(#)beholder.des 3.4 1993/02/23 # Copyright (c) 1989 by Jean-Christophe Collet # Copyright (c) 1991 by M. Stephenson # NetHack may be freely redistributed. See license for details. # # The Beholder's dungeon. # MAZE: "beholder",' ' GEOMETRY: center,center #0 1 2 3 4 5 6 #1234567890123456789012345678901234567890123456789012345678901234567890 MAP |---- |--------| |-----...| |........|------------------|........| |........+...........................| |........|---------|..|-----|........| |........| |..| -------|.| --- ---------- -|..| |.| ----|.| |..-| |--- ---.|---------|.....--- |---| |---|..| -|..|-|.....................| -|-...----|......|- |.......------------........| |............--|..|-| -|....---| |........| |.....-------| -|...|--.....|- --|...---- |-----| -|...........| ----| |-----|....|- ------ ENDMAP RANDOM_MONSTERS: 'e','F' #ROOM: "ordinary" , lit, random, random, (11,09) DOOR: closed,(25,03) FOUNTAIN: (52,01) STAIR:(45,12),up BRANCH:(45,12,45,12),(0,0,0,0) TRAP: "spiked pit",(26,03) TRAP: "spiked pit",(28,03) TRAP: "spiked pit",(30,03) TRAP: random,random TRAP: random,random TRAP: random,random TRAP: random,random TRAP: random,random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT:'(',"chest",(17,4) GOLD: random,(17,4) GOLD: random,(17,4) GOLD: random,(17,4) GOLD: random,(17,4) GOLD: random,(17,4) MONSTER: 'e', "Beholder", (17,04) MONSTER: 'e', "gas spore", random MONSTER: 'e', "gas spore", random MONSTER: 'e', "gas spore", random MONSTER: 'e', "gas spore", random MONSTER: 'e', "gas spore", random MONSTER: 'e', "gas spore", random MONSTER: 'e', "gas spore", random MONSTER: 'e', "gas spore", random MONSTER: 'e', "gas spore", random MONSTER: 'e', "gas spore", random MONSTER: 'e', "gas spore", random MONSTER: 'e', "gas spore", random MONSTER: 'e', "gas spore", random MONSTER: 'e', "gas spore", random MONSTER: 'e', "gas spore", random MONSTER: 'e', "gas spore", random MONSTER: 'e', "gas spore", random MONSTER: 'e', "gas spore", random MONSTER: 'e', "gas spore", random MONSTER: 'e', "gas spore", random MONSTER: 'e', "gas spore", random MONSTER: 'e', "gas spore", random MONSTER: 'e', "gas spore", random MONSTER: 'e', "gas spore", random MONSTER: 'e', "gas spore", random MONSTER: 'e', "gas spore", random MONSTER: 'e', "gas spore", random MONSTER: 'e', "gas spore", random MONSTER: 'e', "gas spore", random MONSTER: 'e', "gas spore", random MONSTER: 'e', "gas spore", random MONSTER: 'e', "gas spore", random MONSTER: 'e', "gas spore", random MONSTER: 'e', "gas spore", random MONSTER: 'e', "gas spore", random MONSTER: 'e', "gas spore", random MONSTER: 'e', "gas spore", random MONSTER: random,random,random MONSTER: random,random,random MONSTER: random,random,random MONSTER: random,random,random slashem-0.0.7E7F3/dat/Caveman.des0000664000076400007640000002672210545462317014504 0ustar aliali# 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. # # The "start" level for the quest. # # Here you meet your (besieged) class leader, Shaman Karnov # and receive your quest assignment. # MAZE: "Cav-strt",' ' FLAGS: noteleport,hardfloor GEOMETRY:center,center MAP ...... .......................... ... .... ...... ...... .......................... ........ .... ..... ..BB ............................. ......... .... .. .. ...................... ....... .. .... .. .. .................... .. ....... .. ... .. S BB ..... ....... .... .... .. ... . .. ........ .. .. .. ... .. ...... .. ............ .. ... . .... .. ........ .. ........... ... .. .. ............. ................... ..... ..... ............................... ........... .....B................ ... ... ..... . .......... .... . ... .......... ... ... .. ............. .. ................... .... BB .. ......... BB ... .......... .. ... ... ...... ..... B ........ .. .. .... ... .......... .......... ..... ... ..... ........ .. ... . ..... .... .. ... .. ENDMAP # Dungeon Description REGION:(00,00,75,19),unlit,"ordinary" REGION:(13,01,40,05),lit,"temple",unfilled,true # The occupied rooms. REGION:(02,01,08,03),lit,"ordinary",unfilled,true REGION:(01,11,06,14),lit,"ordinary",unfilled,true REGION:(13,08,18,10),lit,"ordinary",unfilled,true REGION:(05,17,14,18),lit,"ordinary",unfilled,true REGION:(17,16,23,18),lit,"ordinary",unfilled,true REGION:(35,16,44,18),lit,"ordinary",unfilled,true # Stairs STAIR:(02,03),down # Portal arrival point BRANCH:(71,09,71,09),(0,0,0,0) # Doors DOOR:locked,(19,06) # The temple altar (this will force a priest(ess) to be created) ALTAR:(36,02),coaligned,shrine # Shaman Karnov MONSTER:'@',"Shaman Karnov",(35,02) # The treasure of Shaman Karnov OBJECT:'(',"chest",(34,02) # neanderthal guards for the audience chamber MONSTER:'@',"neanderthal",(20,03) MONSTER:'@',"neanderthal",(20,02) MONSTER:'@',"neanderthal",(20,01) MONSTER:'@',"neanderthal",(21,03) MONSTER:'@',"neanderthal",(21,02) MONSTER:'@',"neanderthal",(21,01) MONSTER:'@',"neanderthal",(22,01) MONSTER:'@',"neanderthal",(26,09) # Non diggable walls NON_DIGGABLE:(00,00,75,19) # Random traps TRAP:"pit",(47,11) TRAP:"pit",(57,10) TRAP:random,random TRAP:random,random TRAP:random,random TRAP:random,random # Monsters on siege duty (in the outer caves). MONSTER: 'h',"bugbear",(47,02),hostile MONSTER: 'h',"bugbear",(48,03),hostile MONSTER: 'h',"bugbear",(49,04),hostile MONSTER: 'h',"bugbear",(67,03),hostile MONSTER: 'h',"bugbear",(69,04),hostile MONSTER: 'h',"bugbear",(51,13),hostile MONSTER: 'h',"bugbear",(53,14),hostile MONSTER: 'h',"bugbear",(55,15),hostile MONSTER: 'h',"bugbear",(63,10),hostile MONSTER: 'h',"bugbear",(65,09),hostile MONSTER: 'h',"bugbear",(67,10),hostile MONSTER: 'h',"bugbear",(69,11),hostile WALLIFY # # The "locate" level for the quest. # # Here you have to find the lair of Tiamat to go # further towards your assigned quest. # MAZE: "Cav-loca",' ' FLAGS: hardfloor GEOMETRY:center,center MAP ............. ........... ............... ............. ............. ............... .......... ........... ............. ............... ... ... .................. ... .......... ... .................. ... ............ BBB................... ... .......... ...................... ..... .. .....B........................ .... ............... . ........B.......................... ...... .. .............S.............. .................. .... .. ........... ............... .. ... .................... .... BB................... .. .. .. ............... .. ....... .... ..... .... .. ....... S ............ ....... .. ....... ..... ... .... ....... ..... ...... ....... ENDMAP # Dungeon Description REGION:(00,00,75,19),unlit,"ordinary" REGION:(52,06,73,15),lit,"ordinary",unfilled,true # Doors DOOR:locked,(28,11) # Stairs STAIR:(04,03),up STAIR:(73,10),down # Non diggable walls NON_DIGGABLE:(00,00,75,19) # Objects OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,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:'h',"bugbear",(02,10),hostile MONSTER:'h',"bugbear",(03,11),hostile MONSTER:'h',"bugbear",(04,12),hostile MONSTER:'h',"bugbear",(02,11),hostile MONSTER:'h',"bugbear",(16,16),hostile MONSTER:'h',"bugbear",(17,17),hostile MONSTER:'h',"bugbear",(18,18),hostile MONSTER:'h',"bugbear",(19,16),hostile MONSTER:'h',"bugbear",(30,06),hostile MONSTER:'h',"bugbear",(31,07),hostile MONSTER:'h',"bugbear",(32,08),hostile MONSTER:'h',"bugbear",(33,06),hostile MONSTER:'h',"bugbear",(34,07),hostile MONSTER:'h',"bugbear",random,hostile MONSTER:'h',"bugbear",random,hostile MONSTER:'h',"bugbear",random,hostile MONSTER:'h',"bugbear",random,hostile MONSTER:'h',random,random,hostile MONSTER:'H',random,random,hostile MONSTER:'H',"hill giant",(03,12),hostile MONSTER:'H',"hill giant",(20,17),hostile MONSTER:'H',"hill giant",(35,08),hostile MONSTER:'H',"hill giant",random,hostile MONSTER:'H',"hill giant",random,hostile MONSTER:'H',"hill giant",random,hostile MONSTER:'H',"hill giant",random,hostile MONSTER:'H',random,random,hostile WALLIFY # # The "goal" level for the quest. # # Here you meet Tiamat your nemesis monster. You have to # defeat Tiamat in combat to gain the artifact you have # been assigned to retrieve. # MAZE: "Cav-goal", ' ' GEOMETRY:center,center MAP ..................... ....................... ......................... ........................... ............................. ............................... ................................. ................................... ..................................... ....................................... ..................................... ................................... ................................. ............................... ............................. ........................... ......................... ....................... ENDMAP # Dungeon Description REGION:(00,00,75,19),lit,"ordinary" # Stairs STAIR:random,up # Non diggable walls NON_DIGGABLE:(00,00,75,19) # Objects OBJECT:')',"mace",(23,10),blessed,0,"The Sceptre of Might" OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random # monsters. MONSTER:'D',"Chromatic Dragon",(23,10),asleep MONSTER:'F',"shrieker",(26,13) MONSTER:'F',"shrieker",(25,8) MONSTER:'F',"shrieker",(45,11) WALLIFY # # The "fill" levels for the quest. # # These levels are used to fill out any levels not occupied by specific # levels as defined above. "filla" is the upper filler, between the # start and locate levels, and "fillb" the lower between the locate # and goal levels. # MAZE: "Cav-fila" , ' ' INIT_MAP: '.' , ' ' , true , true , random , true NOMAP # STAIR: random, up STAIR: random, down # OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, 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 # MONSTER: 'h', "bugbear", random, hostile MONSTER: 'h', "bugbear", random, hostile MONSTER: 'h', "bugbear", random, hostile MONSTER: 'h', "bugbear", random, hostile MONSTER: 'h', "bugbear", random, hostile MONSTER: 'h', random, random, hostile MONSTER: 'H', "hill giant", random, hostile MAZE: "Cav-filb" , ' ' INIT_MAP: '.' , ' ' , true , true , random , true NOMAP # STAIR: random, up STAIR: random, down # OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, 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 # MONSTER: 'h', "bugbear", random, hostile MONSTER: 'h', "bugbear", random, hostile MONSTER: 'h', "bugbear", random, hostile MONSTER: 'h', "bugbear", random, hostile MONSTER: 'h', random, random, hostile MONSTER: 'h', random, random, hostile MONSTER: 'H', "hill giant", random, hostile MONSTER: 'H', "hill giant", random, hostile slashem-0.0.7E7F3/dat/yendor.des0000664000076400007640000001620010545462317014420 0ustar aliali# 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. # # The top (real) wizard level. # Keeping the Moat for old-time's sake MAZE:"wizard1",random FLAGS:noteleport,hardfloor GEOMETRY:center,center MAP ----------------------------. |.......|..|.........|.....|. |.......S..|.}}}}}}}.|.....|. |..--S--|..|.}}---}}.|---S-|. |..|....|..|.}--.--}.|..|..|. |..|....|..|.}|...|}.|..|..|. |..--------|.}--.--}.|..|..|. |..|.......|.}}---}}.|..|..|. |..S.......|.}}}}}}}.|..|..|. |..|.......|.........|..|..|. |..|.......|-----------S-S-|. |..|.......S...............|. ----------------------------. ENDMAP STAIR:levregion(01,00,79,20),(0,0,28,12),up STAIR:levregion(01,00,79,20),(0,0,28,12),down BRANCH:levregion(01,00,79,20),(0,0,28,12) TELEPORT_REGION:levregion(01,00,79,20),(0,0,27,12) # Make it a morgue for rm id in mkmaze.c # for the purpose of random sdoor placement REGION:(12,01,20,09),unlit,"morgue",unfilled MAZEWALK:(28,05),east LADDER:(06,05),down # Non diggable walls # Walls inside the moat stay diggable NON_DIGGABLE:(00,00,11,12) NON_DIGGABLE:(11,00,21,00) NON_DIGGABLE:(11,10,27,12) NON_DIGGABLE:(21,00,27,10) # Non passable walls NON_PASSWALL:(00,00,11,12) NON_PASSWALL:(11,00,21,00) NON_PASSWALL:(11,10,27,12) NON_PASSWALL:(21,00,27,10) # The wizard and his guards MONSTER:'@',"Wizard of Yendor",(16,05),asleep MONSTER:'d',"hell hound",(15,05) MONSTER:'V',"vampire lord",(17,05) # The local treasure OBJECT:'+',"Book of the Dead",(16,05) # Surrounding terror MONSTER:';',"kraken",(14,02) MONSTER:';',"giant eel",(17,02) MONSTER:';',"kraken",(13,04) MONSTER:';',"giant eel",(13,06) MONSTER:';',"kraken",(19,04) MONSTER:';',"giant eel",(19,06) MONSTER:';',"kraken",(15,08) MONSTER:';',"giant eel",(17,08) MONSTER:';',"piranha",(15,02) MONSTER:';',"piranha",(19,08) # Random monsters MONSTER:'D',random,random MONSTER:'H',random,random MONSTER:'&',random,random MONSTER:'&',random,random MONSTER:'&',random,random MONSTER:'&',random,random # And to make things a little harder. TRAP:"board",(16,04) TRAP:"board",(16,06) TRAP:"board",(15,05) TRAP:"board",(17,05) # Random traps. TRAP:"spiked pit",random TRAP:"sleep gas",random TRAP:"anti magic",random TRAP:"magic",random # Some random loot. OBJECT:'*',"ruby",random OBJECT:'!',random,random OBJECT:'!',random,random OBJECT:'?',random,random OBJECT:'?',random,random OBJECT:'+',random,random OBJECT:'+',random,random OBJECT:'+',random,random # The middle wizard level. MAZE:"wizard2",random FLAGS:noteleport,hardfloor GEOMETRY:center,center MAP ----------------------------. |.....|.S....|.............|. |.....|.-------S--------S--|. |.....|.|.........|........|. |..-S--S|.........|........|. |..|....|.........|------S-|. |..|....|.........|.....|..|. |-S-----|.........|.....|..|. |.......|.........|S--S--..|. |.......|.........|.|......|. |-----S----S-------.|......|. |............|....S.|......|. ----------------------------. ENDMAP STAIR:levregion(01,00,79,20),(0,0,28,12),up STAIR:levregion(01,00,79,20),(0,0,28,12),down BRANCH:levregion(01,00,79,20),(0,0,28,12) TELEPORT_REGION:levregion(01,00,79,20),(0,0,27,12) REGION:(09,03,17,09),unlit,"zoo" DOOR:closed,(15,02) DOOR:closed,(11,10) MAZEWALK:(28,05),east LADDER:(12,01),up LADDER:(14,11),down # Non diggable walls everywhere NON_DIGGABLE:(00,00,27,12) # NON_PASSWALL:(00,00,06,12) NON_PASSWALL:(06,00,27,02) NON_PASSWALL:(16,02,27,12) NON_PASSWALL:(06,12,16,12) # Random traps. TRAP:"spiked pit",random TRAP:"sleep gas",random TRAP:"anti magic",random TRAP:"magic",random # Some random loot. OBJECT:'!',random,random OBJECT:'!',random,random OBJECT:'?',random,random OBJECT:'?',random,random OBJECT:'+',random,random # treasures OBJECT:'"',random,(04,06) # The bottom wizard level. # Memorialize the fakewiz setup. MAZE:"wizard3",random FLAGS:noteleport,hardfloor GEOMETRY:center,center MAP ----------------------------. |..|............S..........|. |..|..------------------S--|. |..|..|.........|..........|. |..S..|.}}}}}}}.|..........|. |..|..|.}}---}}.|-S--------|. |..|..|.}--.--}.|..|.......|. |..|..|.}|...|}.|..|.......|. |..---|.}--.--}.|..|.......|. |.....|.}}---}}.|..|.......|. |.....S.}}}}}}}.|..|.......|. |.....|.........|..S.......|. ----------------------------. ENDMAP STAIR:levregion(01,00,79,20),(0,0,28,12),up STAIR:levregion(01,00,79,20),(0,0,28,12),down BRANCH:levregion(01,00,79,20),(0,0,28,12) TELEPORT_REGION:levregion(01,00,79,20),(0,0,27,12) PORTAL:(25,11,25,11),(0,0,0,0),"fakewiz1" MAZEWALK:(28,09),east REGION:(07,03,15,11),unlit,"morgue",unfilled REGION:(17,06,18,11),unlit,"beehive" # make the entry chamber a real room; it affects monster arrival; # `unfilled' is a kludge to force an ordinary room to remain a room REGION:(20,06,26,11),unlit,"ordinary",unfilled DOOR:closed,(18,05) DOOR:closed,(19,11) LADDER:(11,07),up # Non diggable walls # Walls inside the moat stay diggable NON_DIGGABLE:(00,00,06,12) NON_DIGGABLE:(06,00,27,02) NON_DIGGABLE:(16,02,27,12) NON_DIGGABLE:(06,12,16,12) # NON_PASSWALL:(00,00,06,12) NON_PASSWALL:(06,00,27,02) NON_PASSWALL:(16,02,27,12) NON_PASSWALL:(06,12,16,12) # MONSTER:'L',random,(10,07) MONSTER:'V',"vampire lord",(12,07) # Some surrounding horrors MONSTER:';',"kraken",(08,05) MONSTER:';',"giant eel",(08,08) MONSTER:';',"kraken",(14,05) MONSTER:';',"giant eel",(14,08) # Other monsters MONSTER:'L',random,random MONSTER:'D',random,random MONSTER:'D',random,(26,09) MONSTER:'&',random,random MONSTER:'&',random,random MONSTER:'&',random,random # And to make things a little harder. TRAP:"board",(10,07) TRAP:"board",(12,07) TRAP:"board",(11,06) TRAP:"board",(11,08) # Some loot OBJECT:')',random,random OBJECT:'!',random,random OBJECT:'?',random,random OBJECT:'?',random,random OBJECT:'(',random,random # treasures OBJECT:'"',random,(11,07) # The former decoy wizard levels. # There are two of these, and we need to # distinguish between them for the portal. MAZE:"fakewiz1",random GEOMETRY:center,center MAP ......... .}}}}}}}. .}}---}}. .}--.--}. .}|...|}. .}--.--}. .}}---}}. .}}}}}}}. ENDMAP STAIR:levregion(01,00,79,20),(0,0,8,7),up STAIR:levregion(01,00,79,20),(0,0,8,7),down BRANCH:levregion(01,00,79,20),(0,0,8,7) TELEPORT_REGION:levregion(01,00,79,20),(2,2,6,6) PORTAL:(4,4,4,4),(0,0,0,0),"wizard3" MAZEWALK:(08,05),east REGION:(04,03,06,06),unlit,"ordinary",unfilled,true MONSTER:'L',random,(04,04) MONSTER:'V',"vampire lord",(03,04) MONSTER:';',"kraken",(06,06) # And to make things a little harder. TRAP:"board",(04,03) TRAP:"board",(04,05) TRAP:"board",(03,04) TRAP:"board",(05,04) MAZE:"fakewiz2",random GEOMETRY:center,center MAP ......... .}}}}}}}. .}}---}}. .}--.--}. .}|...|}. .}--.--}. .}}---}}. .}}}}}}}. ENDMAP STAIR:levregion(01,00,79,20),(0,0,8,7),up STAIR:levregion(01,00,79,20),(0,0,8,7),down BRANCH:levregion(01,00,79,20),(0,0,8,7) TELEPORT_REGION:levregion(01,00,79,20),(2,2,6,6) MAZEWALK:(08,05),east REGION:(04,03,06,06),unlit,"ordinary",unfilled,true MONSTER:'L',random,(04,04) MONSTER:'V',"vampire lord",(03,04) MONSTER:';',"kraken",(06,06) # And to make things a little harder. TRAP:"board",(04,03) TRAP:"board",(04,05) TRAP:"board",(03,04) TRAP:"board",(05,04) # treasures OBJECT:'"',random,(04,04) slashem-0.0.7E7F3/dat/nightmar.des0000664000076400007640000003405110545462317014735 0ustar aliali# SCCS Id: @(#)nightmar.des 0.0.7 2002/03/13 # $Id: nightmar.des,v 1.6.2.1 2005/12/03 16:11:06 j_ali Exp $ # NetHack may be freely redistributed. See license for details. # # Nightmare's Nightmare World MAZE:"nightmar",' ' FLAGS:noteleport,hardfloor,nommap,shortsighted,spooky GEOMETRY:center,center MAP T. T.T CC CC #######H#H T.... ...... ...T LLL CCCCCC CCCC # H #################H. .T...TTTT.. ..T.. LL LL CCCCCC C CCC # --+---+-- # ..TTTTT. TT...T.. LL CCCCCCCC CCC # -...-...- # T.TTTT.TTTTTTTTT. CCLL CCCCCCCCCC CCCCC # +...+...+ # ... TT. T T T .T.. CCCLLLCCCCCCCCCCCCCCC # -...-...- # . . .TTTTTTTTTTTTTTT. CCCCLLLCCCCCCCCCCC # --+---+-- # .T T T T TT. T T.. CCCCCCLL-S-CCCCCC C # -...- # ..TTTTTTTTTTTTTTTT. CCCCLL--.--CCCCC CCC #H### +...+ # . H- - -H . T.TT TTT T\T T . T.. CCCCLLL-.{.-CCCC CC # # -...- # -.}}}.- .TTTT.TTTTTTTTTTT. CCLLLLL--.--CCCC CCC # .H# --+-- # }.}.} ..TT T T T T T TT.. CCLLCCCLL---LCCCCCCC # # -...- # -}}.}}- .TTTTTTT.TTTTT.T.. LLL CCCCLLLLLLCCCCCCCC ##### +...+ # }.}.} .T T . TTT . TTT.. LL CCCCCCLCCLLLCCCCC -...- # -.}}}.- .TTTTTTTTTTTTTTTT. L. CCCCCCLLCCCCLLLCCC --+---+---+-- # . H- - -H . .TT. T T T T T TT.. CCCLLLCCCCCCCLLC -...-...-...- # .TTTTTTTTTTTT..TT.. . CCLLLCCCCCCCCCCLC +...+...+...+H# ...TT T .TT TTTTTT... LLLCCCCCCCCC CCLC -...-...-...- H . . T..TTTTTT....T.TT. .LL CCCCCCCC LLCC --+---+---+-- ....TT.. ..... LL CCCCCC LL CC #H .... T. LL CC L CH############### ENDMAP RANDOM_PLACES:(25,02),(21,14),(20,20),(36,20) OBJECT[80%]:'=',"fire resistance",place[0] GEOMETRY:center,center MAP T. T.T CC CC #######H#H T.... ...... ...T LLL CCCCCC CCCC # H #################H. .T...TTTT.. ..T.. LL LL CCCCCC C CCC # --+---+-- # ..TTTTT. TT...T.. LL CCCCCCCC CCC # -...-...- # T.TTTT.TTTTTTTTT. CCLL CCCCCCCCCC CCCCC # +...+...+ # ... TT. T T T .T.. CCCLLLCCCCCCCCCCCCCCC # -...-...- # . . .TTTTTTTTTTTTTTT. CCCCLLLCCCCCCCCCCC # --+---+-- # .T T T T TT. T T.. CCCCCCLL-S-CCCCCC C # -...- # ..TTTTTTTTTTTTTTTT. CCCCLL--.--CCCCC CCC #H### +...+ # . H- - -H . T.TT TTT T\T T . T.. CCCCLLL-.{.-CCCC CC # # -...- # -.}}}.- .TTTT.TTTTTTTTTTT. CCLLLLL--.--CCCC CCC # .H# --+-- # }.}.} ..TT T T T T T TT.. CCLLCCCLL---LCCCCCCC # # -...- # -}}.}}- .TTTTTTT.TTTTT.T.. LLL CCCCLLLLLLCCCCCCCC ##### +...+ # }.}.} .T T . TTT . TTT.. LL CCCCCCLCCLLLCCCCC -...- # -.}}}.- .TTTTTTTTTTTTTTTT. L. CCCCCCLLCCCCLLLCCC --+---+---+-- # . H- - -H . .TT. T T T T T TT.. CCCLLLCCCCCCCLLC -...-...-...- # .TTTTTTTTTTTT..TT.. . CCLLLCCCCCCCCCCLC +...+...+...+H# ...TT T .TT TTTTTT... LLLCCCCCCCCC CCLC -...-...-...- H . . T..TTTTTT....T.TT. .LL CCCCCCCC LLCC --+---+---+-- ....TT.. ..... LL CCCCCC LL CC #H .... T. LL CC L CH############### ENDMAP RANDOM_PLACES:(48,04),(52,04),(52,08),(52,12),(44,16),(52,16) BRANCH:(48,16,48,16),(00,00,00,00) TELEPORT_REGION:(47,15,49,17),(00,00,00,00) NON_DIGGABLE:(00,00,75,20) NON_PASSWALL:(43,00,43,12) NON_PASSWALL:(40,13,49,13) NON_PASSWALL:(49,07,49,12) NON_PASSWALL:(45,07,48,07) NON_PASSWALL:(45,01,45,06) NON_PASSWALL:(46,01,54,01) NON_PASSWALL:(55,00,55,19) NON_PASSWALL:(42,19,54,19) NON_PASSWALL:(41,13,41,20) NON_PASSWALL:(64,08,68,08) NON_PASSWALL:(64,14,68,14) NON_PASSWALL:(63,09,63,13) NON_PASSWALL:(69,09,69,13) MAZEWALK:(74,01),south MAZEWALK:(10,09),south # entrance REGION:(47,15,49,17),lit,"ordinary" ENGRAVING:(48,16),engrave,"Beware of Dreams come true!" MONSTER:'i',"imp",(49,15),hostile TRAP[60%]:"sleep gas",(48,15) TRAP[60%]:"sleep gas",(47,16) TRAP[60%]:"sleep gas",(49,16) TRAP[60%]:"sleep gas",(48,17) # false treasure MONSTER:'$',"large pile of killer coins",place[0],asleep MONSTER[80%]:'$',"pile of killer coins",place[0],asleep MONSTER[80%]:'$',"huge pile of killer coins",place[0],asleep MONSTER[80%]:'$',"pile of killer coins",place[0],asleep MONSTER[80%]:'$',"huge pile of killer coins",place[0],asleep MONSTER[80%]:'$',"large pile of killer coins",place[0],asleep MONSTER[40%]:'$',"pile of killer coins",place[0],asleep MONSTER[40%]:'$',"large pile of killer coins",place[0],asleep MONSTER[40%]:'$',"huge pile of killer coins",place[0],asleep OBJECT[60%]:'*',"worthless piece of white glass",place[0],cursed,0 OBJECT[60%]:'*',"worthless piece of white glass",place[0],uncursed,0 OBJECT[60%]:'*',"worthless piece of white glass",place[0],blessed,0 # bad food MONSTER:'%',"killer food ration",place[1],asleep MONSTER[80%]:'%',"killer food ration",place[1],asleep MONSTER[80%]:'%',"killer food ration",place[1],asleep MONSTER[40%]:'%',"killer food ration",place[1],asleep MONSTER[40%]:'%',"killer food ration",place[1],asleep MONSTER[80%]:'%',"killer tripe ration",place[1],asleep MONSTER[80%]:'%',"bad egg",place[1],asleep MONSTER[60%]:'%',"bad egg",place[1],asleep MONSTER[40%]:'%',"bad egg",place[1],asleep OBJECT:'%',"egg",place[1],"giant louse",2 OBJECT[40%]:'%',"egg",place[1],"giant flea",0 OBJECT[20%]:'%',"mushroom",place[1],cursed,0 OBJECT[50%]:'%',"tin",place[1],"asphynx meat",0 OBJECT[50%]:'%',"tin",place[1],"green slime meat",0 # junk OBJECT[40%]:'!',"sickness",place[2],cursed,0 OBJECT[40%]:'!',"sleeping",place[2],cursed,0 OBJECT[40%]:'!',"confusion",place[2],cursed,0 OBJECT[40%]:'!',"hallucination",place[2],cursed,0 OBJECT[40%]:'!',"blindness",place[2],cursed,0 OBJECT[40%]:'!',"polymorph",place[2],cursed,0 OBJECT[40%]:'!',"sickness",place[2],cursed,0 OBJECT[40%]:'!',"acid",place[2],cursed,0 OBJECT[40%]:'!',"paralysis",place[2],cursed,0 OBJECT[40%]:'!',"polymorph",place[2],cursed,0 OBJECT[40%]:'/',"draining",place[2],cursed,0 OBJECT[60%]:'/',"opening",place[2],cursed,0 OBJECT[80%]:'/',"nothing",place[2],cursed,0 OBJECT[60%]:'/',"secret door detection",place[2],cursed,0 OBJECT[40%]:'[',"fumble boots",place[2],cursed,-2 OBJECT[40%]:'[',"gauntlets of fumbling",place[2],cursed,-4 OBJECT[40%]:'[',"poisonous cloak",place[2],cursed,-1 OBJECT[40%]:'[',"robe of weakness",place[2],cursed,0 OBJECT[40%]:')',"fly swatter",place[2],cursed,-2,"Bugshmasher" OBJECT[40%]:')',"worm tooth",place[2],cursed,-4,"Storm Brand" OBJECT[40%]:')',"short sword",place[2],cursed,-3,"Chaosbane" OBJECT[40%]:'"',"amulet of strangulation",place[2],cursed,0,"life saving" OBJECT[40%]:'=',"sleeping",place[2],cursed,0,"slow digestion" OBJECT[40%]:'=',"hunger",place[2],cursed,0,"free action" OBJECT[40%]:'=',"increase accuracy",place[2],blessed,-9,"polymorph control" OBJECT[40%]:'(',"oil lamp",place[2],cursed,0 MONSTER:'@',random,place[2],hostile MONSTER:'@',random,place[2],hostile MONSTER[80%]:'@',random,place[2],peaceful MONSTER[60%]:'@',random,place[2],asleep MONSTER[60%]:'@',random,place[2],hostile MONSTER[60%]:'@',random,place[2],peaceful MONSTER[60%]:'@',random,place[2],hostile MONSTER[40%]:'@',random,place[2],hostile MONSTER[40%]:'@',random,place[2],peaceful # such a waste... OBJECT:'(',"tinning kit",place[3],cursed,0 OBJECT:'%',"corpse",place[3],"black dragon",0 OBJECT:'%',"corpse",place[3],"deep dragon",0 OBJECT:'%',"corpse",place[3],"red dragon",0 OBJECT:'%',"corpse",place[3],"orange dragon",0 OBJECT:'%',"corpse",place[3],"yellow dragon",0 OBJECT:'%',"corpse",place[3],"green dragon",0 OBJECT:'%',"corpse",place[3],"blue dragon",0 OBJECT:'%',"corpse",place[3],"shimmering dragon",0 OBJECT:'%',"corpse",place[3],"gray dragon",0 OBJECT:'%',"corpse",place[3],"white dragon",0 MONSTER:'w',"maggot",place[3],hostile MONSTER:'w',"maggot",place[3],hostile MONSTER:'w',"maggot",place[3],hostile MONSTER:'w',"maggot",place[3],hostile MONSTER:'w',"maggot",place[3],hostile MONSTER:'w',"maggot",place[3],hostile MONSTER[50%]:'w',"maggot",place[3],hostile MONSTER[50%]:'w',"maggot",place[3],hostile MONSTER[50%]:'s',"carrion crawler",place[3],asleep # snake pit TRAP:"spiked pit",place[4] MONSTER[90%]:'S',"king cobra",place[4],hostile MONSTER[90%]:'S',"pit viper",place[4],asleep MONSTER[90%]:'S',"pit viper",place[4],hostile MONSTER:'S',random,place[4],hostile MONSTER:'S',random,place[4],asleep MONSTER[50%]:'S',random,place[4],hostile MONSTER[50%]:'S',random,place[4],asleep MONSTER:'s',random,place[4],asleep MONSTER[50%]:'s',random,place[4],hostile # no temple ALTAR:place[5],coaligned,altar MONSTER:'@',"aligned priest",place[5],coaligned,peaceful # boulder path OBJECT:'`',"boulder",(44,0) TRAP:"rolling boulder",(44,01) TRAP:"rolling boulder",(44,07) OBJECT:'/',"striking",(46,10),uncursed,2 OBJECT:')',"runesword",(46,10),cursed,0 MONSTER[60%]:' ',"ghost",(47,00),hostile MONSTER[60%]:' ',"ghost",(50,00),hostile # maze MONSTER[60%]:'w',"rot worm",(63,05),hostile MONSTER[60%]:'w',"rot worm",(69,05),hostile MONSTER[60%]:'w',"rot worm",(60,08),hostile MONSTER[60%]:'w',"rot worm",(72,08),hostile MONSTER[60%]:'w',"rot worm",(60,14),hostile MONSTER[60%]:'w',"rot worm",(72,14),hostile MONSTER[60%]:'w',"rot worm",(63,17),hostile MONSTER[60%]:'w',"rot worm",(69,17),hostile MONSTER[50%]:' ',"shade",(63,05),hostile MONSTER[50%]:' ',"shade",(69,17),hostile # room REGION:(64,09,68,13),unlit,"swamp" OBJECT:'[',"gray dragon scales",(66,11),cursed,-9 CONTAINER:'`',"statue",(66,11),"arch-lich",0 TRAP:"statue",(66,11) OBJECT:'/',"fireball",contained OBJECT:'/',"create horde",contained,uncursed,1 OBJECT:'/',"speed monster",contained,uncursed,1 OBJECT:'/',"make invisible",contained,uncursed,1 OBJECT:'%',"corpse",contained,"cockatrice",0 OBJECT:'[',"leather gloves",contained,cursed,-1 MONSTER:';',"electric eel",(66,10),hostile MONSTER:';',"electric eel",(66,12),hostile MONSTER:';',"electric eel",(65,11),hostile MONSTER:';',"electric eel",(67,11),hostile MONSTER[50%]:';',"electric eel",(64,11),hostile MONSTER[50%]:';',"electric eel",(68,11),hostile # cloud MONSTER:'E',"air elemental",(23,07),hostile MONSTER[60%]:'E',"air elemental",(24,08),hostile MONSTER:'E',"fire elemental",(32,15),hostile MONSTER[60%]:'E',"fire elemental",(33,16),hostile MONSTER:'E',"earth elemental",(40,08),hostile MONSTER[60%]:'E',"earth elemental",(39,09),hostile MONSTER:'E',"water elemental",(31,02),hostile MONSTER[60%]:'E',"water elemental",(32,03),hostile MONSTER:'E',"stalker",(40,03),hostile MONSTER[60%]:'E',"stalker",(39,04),hostile MONSTER[40%]:'E',random,(33,07),hostile MONSTER[40%]:'E',random,(34,08),hostile MONSTER[40%]:'E',random,(25,13),hostile MONSTER[40%]:'E',random,(26,14),hostile MONSTER:'g',"gremlin",(38,12),"Clown",hostile MONSTER:'h',"mind flayer",(29,09),"Ginger",hostile MONSTER[80%]:'h',"mind flayer",(30,09),"Victoria",hostile MONSTER[80%]:'h',"mind flayer",(31,09),"Emma",hostile MONSTER[60%]:'h',"master mind flayer",(30,08),"Mel C.",hostile MONSTER[60%]:'h',"master mind flayer",(30,10),"Mel B.",hostile CONTAINER:'(',"chest",(30,09) OBJECT[70%]:'"',"amulet of flying",contained OBJECT:'/',"cold",contained,uncursed,+16 OBJECT[80%]:'/',"digging",contained # forest MONSTER:'u',"Nightmare",(10,09),asleep MONSTER[60%]:'n',"pixie",(10,09),asleep MONSTER[60%]:'n',"pixie",(10,09),hostile MONSTER[60%]:'n',"quickling",(10,09),asleep MONSTER[60%]:'n',"quickling",(10,09),hostile MONSTER[60%]:'n',"pixie",(10,09),asleep MONSTER[60%]:'n',"pixie",(10,09),hostile MONSTER:'u',"black unicorn",(10,09),hostile MONSTER:'u',"gray unicorn",(10,09),hostile MONSTER:'u',"white unicorn",(10,09),hostile MONSTER:'n',"wood nymph",(10,09),hostile MONSTER:'n',"brownie",(10,09),asleep MONSTER:'n',"pixie",(10,09),asleep MONSTER:'n',"pixie",(10,09),hostile MONSTER:'n',"pixie",(10,09),asleep MONSTER:'n',"pixie",(10,09),hostile MONSTER:'n',"quickling",(10,09),asleep MONSTER:'n',"quickling",(10,09),hostile # all around # Monsters MONSTER:'y',"black light",random,hostile MONSTER:'y',"black light",random,hostile MONSTER:'y',"black light",random,hostile MONSTER:'y',"black light",random,hostile MONSTER:'y',"black light",random,hostile MONSTER:'y',"black light",random,hostile MONSTER:'y',"black light",random,hostile MONSTER:'y',"black light",random,hostile MONSTER[50%]:'y',"black light",random,hostile MONSTER[50%]:'y',"black light",random,hostile MONSTER[50%]:'y',"black light",random,hostile MONSTER[50%]:'y',"black light",random,hostile MONSTER[50%]:'y',"black light",random,hostile MONSTER[50%]:'y',"black light",random,hostile MONSTER[50%]:'y',"black light",random,hostile MONSTER[50%]:'y',"black light",random,hostile MONSTER:' ',"shadow",random,hostile MONSTER:' ',"shadow",random,hostile MONSTER:' ',"shadow",random,hostile MONSTER:' ',"shadow",random,hostile MONSTER[40%]:' ',"shadow",random,hostile MONSTER[40%]:' ',"shadow",random,hostile MONSTER[40%]:' ',"shadow",random,hostile MONSTER[40%]:' ',"shadow",random,hostile # Traps TRAP:"sleep gas",random TRAP:"sleep gas",random TRAP:"sleep gas",random TRAP:"sleep gas",random TRAP:"sleep gas",random TRAP:"sleep gas",random TRAP:"sleep gas",random TRAP:"sleep gas",random TRAP[50%]:"sleep gas",random TRAP[50%]:"sleep gas",random TRAP[50%]:"sleep gas",random TRAP[50%]:"sleep gas",random TRAP:"anti magic",random TRAP:"anti magic",random TRAP[50%]:"anti magic",random TRAP[50%]:"anti magic",random # Engravings ENGRAVING:random,random,"You can feel eyes on your back." ENGRAVING:random,random,"I can see you..." # doors DOOR:locked,(30,07) DOOR:locked,(48,02) DOOR:locked,(52,02) DOOR:locked,(46,04) DOOR:locked,(50,04) DOOR:locked,(54,04) DOOR:locked,(48,06) DOOR:locked,(52,06) DOOR:locked,(50,08) DOOR:locked,(54,08) DOOR:locked,(52,10) DOOR:locked,(50,12) DOOR:locked,(54,12) DOOR:locked,(44,14) DOOR:locked,(48,14) DOOR:locked,(52,14) DOOR:locked,(42,16) DOOR:locked,(46,16) DOOR:locked,(50,16) DOOR:locked,(54,16) DOOR:locked,(44,18) DOOR:locked,(48,18) DOOR:locked,(52,18) slashem-0.0.7E7F3/dat/lich.des0000664000076400007640000001075610545462317014051 0ustar aliali# # Vecna's dungeon # LEVEL: "lich" #MESSAGE: "You feel deathly cold." RANDOM_MONSTERS: 'L','W','V' ROOM: "ordinary" , unlit, random, random, (05,05) STAIR: random, up OBJECT: random,random,random ROOM: "ordinary" , unlit, random, random, (20,10) NAME: "central" OBJECT:'(',"chest",random OBJECT:'(',"chest",random OBJECT:'(',"chest",random OBJECT:'(',"chest",random OBJECT:'(',"chest",random OBJECT:'(',"chest",random OBJECT:'(',"chest",random OBJECT:'(',"chest",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 OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, 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 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 OBJECT: '+', random, random OBJECT: '+', random, random OBJECT: '+', random, random OBJECT: '+', random, random OBJECT: '+', random, random OBJECT: '+', random, random TRAP: random, random TRAP: random, random TRAP: random, random TRAP: random, random MONSTER: 'L', "Vecna", random, hostile MONSTER: 'L', random, random, hostile MONSTER: 'L', random, random, hostile MONSTER: 'L', random, random, hostile MONSTER: 'L', random, random, hostile MONSTER: 'L', random, random, hostile MONSTER: 'L', random, random, hostile MONSTER: 'L', random, random, hostile MONSTER: 'L', random, random, hostile MONSTER: 'L', random, random, hostile MONSTER: 'L', random, random, hostile MONSTER: 'L', random, random, hostile MONSTER: 'L', random, random, hostile MONSTER: 'L', random, random, hostile MONSTER: 'W', random, random, hostile MONSTER: 'W', random, random, hostile MONSTER: 'W', random, random, hostile MONSTER: 'W', random, random, hostile MONSTER: 'W', random, random, hostile MONSTER: 'V', random, random, hostile MONSTER: 'V', random, random, hostile MONSTER: 'V', random, random, hostile MONSTER: 'V', random, random, hostile MONSTER: 'V', random, random, hostile MONSTER: 'V', random, random, hostile MONSTER: 'V', random, random, hostile MONSTER: 'Z', random, random, hostile MONSTER: 'Z', random, random, hostile MONSTER: 'Z', random, random, hostile MONSTER: 'Z', random, random, hostile MONSTER: 'Z', random, random, hostile MONSTER: 'Z', random, random, hostile MONSTER: 'Z', random, random, hostile MONSTER: 'Z', random, random, hostile MONSTER: 'Z', random, random, hostile MONSTER: 'Z', random, random, hostile ROOM: "ordinary" , random, random, random, random #STAIR: random, down OBJECT: random, random, random TRAP: random, random MONSTER: 'L', random, random, hostile MONSTER: 'V', random, random, hostile ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random OBJECT: random, random, random MONSTER: 'L', random, random, hostile MONSTER: 'W', random, random, hostile ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random TRAP: random, random MONSTER: 'L', random, random, hostile MONSTER: 'Z', random, random, hostile MONSTER: 'Z', random, random, hostile ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random TRAP: random, random MONSTER: 'L', random, random, hostile MONSTER: 'Z', random, random, hostile MONSTER: 'Z', random, random, hostile RANDOM_CORRIDORS slashem-0.0.7E7F3/dat/kobold-2.des0000664000076400007640000001244310545462317014536 0ustar aliali# # Kobold level # MAZE: "kobold-2",' ' GEOMETRY: center,center #0 1 2 3 4 5 6 #1234567890123456789012345678901234567890123456789012345678901234567890 MAP |-------------------------------------- -------------------| ----| |....|...|.|...|......|.|......|......|----|............+.....S##+...| |S---|...|.+...|......|.+......|......|....|.|---+------|.....| |...| |....|...+.|...|......+.|......|......|....+.|..|.......|.....| |---| |....|...|.|...|......|.|......|......|....|.|..--|.....|.....S#### |--+------+------------+----------+---------.+....|.....---+--| # |.......................|.....|..............|....|.....|.....| ### |+--------------------|.|.....+.|---+-----S------------+|.....| # |.......+.+.....|.....|.|.....|.|......| # |.|.....| # |.---+---.|----.+.....|.|.....|.|......| ## |.+.....| # |.|.....|.|...|.|.....|.-------.|------| # |.|.....| #### |.|.....|.+...|+|-----|.|...|...|....| ### |+------| # |.|-----|.|...|.......|.|...|.|-|....| ### |.......| |+--| |.|.....|.|...|.......|.|...|.+K|....| |.......| |...| |.|.....|.----|...\...|.--+--.-----+------------------|.......| |...| |.+.....|.....+.......+..............S................S.......| |---| |-------------------------------------------------------------- ENDMAP RANDOM_MONSTERS: 'k' #ROOM: "ordinary" , lit, random, random, (11,9) DOOR: closed,(1,7) DOOR: closed,(2,15) DOOR: closed,(3,5) DOOR: closed,(5,9) DOOR: closed,(8,8) DOOR: closed,(9,3) DOOR: closed,(10,5) DOOR: closed,(10,11) DOOR: closed,(10,8) DOOR: closed,(11,2) DOOR: closed,(14,15) DOOR: closed,(15,11) DOOR: closed,(16,9) DOOR: closed,(22,15) DOOR: closed,(22,3) DOOR: closed,(23,5) DOOR: closed,(24,2) DOOR: closed,(26,14) DOOR: closed,(30,7) DOOR: closed,(30,13) DOOR: closed,(34,5) DOOR: closed,(35,14) DOOR: closed,(36,7) DOOR: closed,(43,3) DOOR: closed,(45,5) DOOR: closed,(49,2) DOOR: closed,(55,7) DOOR: closed,(55,11) DOOR: closed,(56,1) DOOR: closed,(56,9) DOOR: closed,(59,5) TRAP: random,random TRAP: random,random TRAP: random,random GOLD: random,random GOLD: random,random GOLD: random,random GOLD: random,random GOLD: random,random GOLD: random,random GOLD: random,random MONSTER: 'B',"rhumbat", (43,11), hostile, asleep OBJECT:'(',"chest",(45,12) GOLD: random,(45,12) GOLD: random,(45,12) GOLD: random,(45,12) OBJECT: '*',random,(45,12) OBJECT: '/',random,(45,12) OBJECT: '*',random,(45,12) MONSTER: 'B',"rhumbat", (65,13), hostile, asleep OBJECT:'(',"chest",(65,13) GOLD: random,(65,13) GOLD: random,(65,13) OBJECT: '*',random,(65,13) OBJECT: '*',random,(65,13) OBJECT: '*',random,(65,13) MONSTER: 's',"giant spider", (67,1), hostile, asleep GOLD: random,(68,2) GOLD: random,(68,2) GOLD: random,(68,2) OBJECT: '*',random,(68,2) OBJECT: '*',random,(68,2) OBJECT: '*',random,(68,2) OBJECT:'(',"chest",(68,2) OBJECT:'(',"chest",(2,1) OBJECT:'(',"chest",(3,1) OBJECT:'(',"chest",(4,1) OBJECT:'(',"chest",(18,14) OBJECT: ')',random,(18,14) OBJECT: ')',random,(18,14) OBJECT: '/',random,(18,14) OBJECT: '[',random,(18,14) OBJECT: '[',random,(18,14) OBJECT: '!',random,(18,14) OBJECT: '!',random,(18,14) MONSTER: 'k', "kobold", random, hostile MONSTER: 'k', "kobold", random, hostile MONSTER: 'k', "kobold", random, hostile MONSTER: 'k', "kobold", random, hostile MONSTER: 'k', "kobold", random, hostile MONSTER: 'k', "kobold", random, hostile MONSTER: 'k', "kobold", random, hostile MONSTER: 'k', "kobold", random, hostile MONSTER: 'k', "kobold", random, hostile MONSTER: 'k', "kobold", random, hostile MONSTER: 'k', "kobold", random, hostile MONSTER: 'k', "kobold", random, hostile MONSTER: 'k', "kobold", random, hostile MONSTER: 'k', "kobold", random, hostile MONSTER: 'k', "kobold", random, hostile MONSTER: 'k', "kobold", random, hostile MONSTER: 'k', "kobold", random, hostile MONSTER: 'k', "kobold", random, hostile MONSTER: 'k', "kobold", random, hostile MONSTER: 'k', "kobold", random, hostile MONSTER: 'k', "kobold", random, hostile MONSTER: 'k', "kobold", random, hostile MONSTER: 'k', "kobold", random, hostile MONSTER: 'k', "kobold", random, hostile MONSTER: 'k', "kobold", random, hostile MONSTER: 'k', "kobold", random, hostile MONSTER: 'k', "kobold", random, hostile MONSTER: 'k', "kobold", random, hostile MONSTER: 'k', "kobold", random, hostile MONSTER: 'k', "kobold", random, hostile MONSTER: 'k', random, random, hostile MONSTER: 'k', random, random, hostile MONSTER: 'k', random, random, hostile MONSTER: 'k', random, random, hostile MONSTER: 'k', random, random, hostile MONSTER: 'k', "large kobold", (15,12), hostile MONSTER: 'k', random, (17,12), hostile MONSTER: 'k', "large kobold", (19,12), hostile MONSTER: 'k', "rock kobold", (20,12), hostile MONSTER: 'k', random, (21,12), hostile MONSTER: 'k', "swamp kobold", (16,13), hostile MONSTER: 'k', random, (18,13), hostile MONSTER: 'k', "large kobold", (19,13), hostile MONSTER: 'k', random, (21,13), hostile MONSTER: 'k', "swamp kobold", (15,14), hostile MONSTER: 'k', "swamp kobold", (17,14), hostile MONSTER: 'k', "Kroo the Kobold King", (18,14), hostile MONSTER: 'k', "rock kobold", (20,14), hostile MONSTER: 'k', "kobold shaman", (15,15), hostile MONSTER: 'k', "kobold shaman", (16,15), hostile MONSTER: 'k', random, (20,15), hostile MONSTER: 'k', random, (21,15), hostile STAIR: (23,6), up STAIR: (19,14), down slashem-0.0.7E7F3/dat/Yeoman.des0000664000076400007640000005016710545462317014362 0ustar aliali# SCCS Id: @(#)Yeoman.des 3.4 1998/09/10 # Copyright (c) 1998 by Kevin Hugo # NetHack may be freely redistributed. See license for details. # The Yeoman quest is located at the "Royal Palace and Fortress # of London", commonly known as the Tower of London or the London # Tower. Over a period of nine centuries, it has served as a # military garrison, royal residence, fortress, prison, armory, # treasury, mint, menagerie, and museum. # # This quest is based on the 1671 theft of the crown jewels. # It may be useful to note that this is set 500 years after the # legend of Robin Hood and 1100 years after the legend of King # Arthur (who was killed circa A.D. 537). # # Much effort has been devoted to make this quest as accurate as # possible; however, some inaccuracies remain: # 1. Because NetHack quests must begin at a top level and proceed # downward, this quest is actually presented "upside-down". # 2. In many cases, objects and monsters have been substituted # with the most similar existing thing, to avoid the need # to create specialized objects. # 3. The theft of the Crown Jewels is different than is # presented here. Colonel Blood worked with three accomplices, # and all were captured alive. Assistant Keeper of the Jewels # Talbot Edwards was tied up, not killed. Blood was captured # alive, pardoned, and forced to work for the king as a spy # and informant. # 4. For our convenience, the Bell of Opening represents the # alarm bell of the Bell Tower, stolen by Colonel Blood # to prevent a call to arms. This never happened in the # real incident. # # I would especially like to thank Dylan O'Donnell # for his advice. ### The quest "start" level ### # # The outer ward of the tower complex and the surrounding city. # Most of this part of the complex was built by Henry III # (1216-1272). # # Here you meet your (besieged) class leader, the Chief Yeoman # Warder, and receive your quest assignment. # MAZE: "Yeo-strt",' ' FLAGS: noteleport,hardfloor GEOMETRY:center,center #1234567890123456789012345678901234567890123456789012345678901234567890 MAP ......................}}}}}}}}}}}}}}}}}}}}}}}}}}}}}..... ...............}}}}}}}}}}}}}}--------------------}}..... ..............}}}-------------...............| |}}}.... ..............}}}| |..........---.---.---...| |}}}.... ..............}}}| |..---.---.| |-| |-| |--.---|}}}.... ..............}}}|---..| |-| |-- |....|}}}.... .............}}}}|.....-- |-....|}}}}... .............}}}}|....--| |--...|}}}}... .....}}.}}}}}}}}}|....| |...||}}}... ....}}}}}}}}}}}}|---..--| |-....|}}}... ...}}------}}}}}|..S....| |--...|}}}... ...}}|....|---}}|..|..--- ---- -----| |...|}}}... ...}}|....+..|}}|---..| |--|..| |-| |....----...|}}}... ...}}-----|..+.}|..+..---..--S----.---...........|}}}... ...}}}}}}}----}}|..|...................-+-.---.----}}... .....}}}}}}}}}}}-----------------------|.|.+.|.+..|}.... ...........}}}}}}}}}}}}}}}}|.}.|}}}}}}}------------}}... }}}}}}.....................--+--.....}}}}}}}}}}}}}}}.... }}}}}}}}}....................}.......................... }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} ENDMAP # Specifications for the whole level RANDOM_MONSTERS: 'd', 'r' REGION:(00,00,55,19),lit,"ordinary" NON_DIGGABLE:(00,00,55,19) NON_PASSWALL:(00,00,55,19) TRAP:"arrow",random TRAP:"arrow",random TRAP:"arrow",random TRAP:"arrow",random TRAP:"board",random TRAP:"board",random # Tower Hill, the portal arrival zone # This is where public executions were held. BRANCH:(01,01,12,07),(0,0,0,0) MONSTER:'B',"raven",(16,00),hostile MONSTER:'B',"raven",(01,08),hostile MONSTER:'d',"large dog",(21,00),hostile MONSTER:'d',"large dog",(02,12),hostile MONSTER:'d',"wolf",(13,04),hostile MONSTER:'d',"wolf",(03,09),hostile MONSTER:'d',"werewolf",(18,00),hostile MONSTER:'r',"sewer rat",(14,00),hostile MONSTER:'r',"sewer rat",(19,00),hostile MONSTER:'r',"sewer rat",(00,10),hostile MONSTER:'r',"sewer rat",(02,11),hostile MONSTER:'r',"rabid rat",(13,01),hostile MONSTER:'r',"rabid rat",(01,10),hostile # Moat # The water is very filthy and filled with sewage. # It was drained and filled in 1843. # Lion's Gate # This is the entrance to the tower complex when approaching from # the city of London (to the west). DRAWBRIDGE:(07,09),south,open # Lion Tower # Built by Henry III. # This tower held the Royal Menagerie from 1264 to 1834. # It was torn down soon after the menagerie was removed. REGION:(06,11,09,12),lit,"zoo",filled # Middle Tower # Built by Edward I. # This gate is locked in the Ceremony of the Keys. DOOR:closed,(10,12) MONSTER:'@',"Yeoman Warder",(12,12) MONSTER:'@',"Yeoman Warder",(11,13) DOOR:locked,(13,13) # Byward Tower (The Tower at the Gate) # Built by Edward I. # Gatehouse to the outer ward. DRAWBRIDGE:(15,13),east,open MONSTER:'@',"Yeoman Warder",(17,13) MONSTER:'@',"Yeoman Warder",(18,13) DOOR:locked,(19,13) # The Royal Mint # Coins were engraved and stamped here from the 1100s to 1810. # A theft occurred in 1798. # The mint was later moved to Tower Hill. OBJECT:'$',random,(17,10) OBJECT:'$',random,(18,10) OBJECT:'$',random,(17,11) OBJECT:'$',random,(18,11) #REGION:(17,10,18,11),lit,"vault",filled DOOR:locked,(19,10) # Legge's Mount and Brass Mount # Built by Henry VIII. # Cannon towers, at the top corners of the map. # Inaccessable for our purposes. # The Iron Gate and its tower (later called Develin Tower) # Built by Edward I. # The eastern gate to the tower complex. # Rarely used because the city did not extend far to the east. # # Your quest leader, the Chief Yeoman Warder, is here. DRAWBRIDGE:(51,15),west,closed MONSTER:'@',"Yeoman Warder",(49,15) MONSTER:'@',"Chief Yeoman Warder",(48,15) DOOR:locked,(47,15) # Well Tower # Started by Henry III. DOOR:closed,(43,15) MONSTER:'@',"Yeoman Warder",(44,15) # Cradle Tower # Built in 1300s. # Once opened directly to the river. DOOR:closed,(40,14) MONSTER:'@',"Yeoman Warder",(40,15) # Saint Thomas' Tower # Built by Henry III. # Contains a small chapel to Thomas a` Becket. MONSTER:'@',"Yeoman Warder",(28,16) MONSTER:'@',"Yeoman Warder",(30,16) DRAWBRIDGE:(29,16),north,closed # Traitor's Gate # Southern entrance to the tower complex. # Traitors brought by ship on the River Thames came through this # entrance. DOOR:open,(29,17) # The Tower Wharf # Cargo and prisoners alike were brought up the River Thames (to # the immediate south) and unloaded at the wharf between the river # and the tower complex. OBJECT:'(',"large box",(10,17) OBJECT:'(',"large box",(18,18) OBJECT:'(',"large box",(25,18) OBJECT:'(',"large box",(34,17) OBJECT:'(',"large box",(46,18) # Bloody Tower # Started by Henry III as the Garden Tower. # # Renamed to Bloody Tower after York Princes were imprisoned # and murdered there. (See Shakespeare's Richard III) # Several other prisoners were kept there, including Sir Walter # Rale[i]gh and Sir Thomas Overbury (who was poisoned to death # by Lady Somerset). # # This tower had the only entrance to the inner ward until the 1800s. STAIR:(28,12),down MONSTER:'@',"Yeoman Warder",(28,12) MONSTER:'@',"Yeoman Warder",(29,12) ### Upper filler levels ### # # Bloody Tower # This floor plan is speculative, and may not reflect the actual # layout. # MAZE: "Yeo-fila", ' ' GEOMETRY:center,center #1234567890123456789012345678901234567890123456789012345678901234567890 MAP --------------------- |......S.....S......| |.--------+--------.| |.|....|.....|....|.| |.+....|.....|....+.| |.|....|.....|....|.| |S|---------------|S| |.|....|.....|....|.| |.+....|.....|....+.| |.|....|.....|....|.| |.--------+--------.| |......|.....S......| --------------------- ENDMAP # Specifications for the whole level RANDOM_MONSTERS: 'd', 'r' REGION:(00,00,20,12),lit,"ordinary" NON_DIGGABLE:(00,00,20,12) STAIR:(05,08),up STAIR:(10,08),down # Doors DOOR:closed,(02,08) DOOR:locked,(01,06) DOOR:closed,(02,04) DOOR:locked,(07,01) DOOR:closed,(10,02) DOOR:locked,(13,01) DOOR:closed,(18,04) DOOR:locked,(19,06) DOOR:closed,(18,08) DOOR:locked,(13,11) DOOR:closed,(10,10) # Objects OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random # Random monsters MONSTER:'d',"large dog",random,hostile MONSTER:'d',"large dog",random,hostile MONSTER:'d',"large dog",random,hostile MONSTER:'d',"wolf",random,hostile MONSTER:'d',"werewolf",random,hostile MONSTER:'d',"werewolf",random,hostile MONSTER:'r',"sewer rat",random,hostile MONSTER:'r',"sewer rat",random,hostile MONSTER:'r',"sewer rat",random,hostile MONSTER:'r',"rabid rat",random,hostile MONSTER:'r',"rabid rat",random,hostile # Traps TRAP:"arrow",random TRAP:"arrow",random TRAP:"arrow",random TRAP:"arrow",random TRAP:"board",random TRAP:"board",random ### The quest "locate" level ### # # The inner ward of the tower complex # MAZE: "Yeo-loca",' ' FLAGS: hardfloor GEOMETRY:center,center #1234567890123456789012345678901234567890123456789012345678901234567890 MAP ---- ---- ---- ---- |..| |..| |..| ---- |..| |..| |..| |..| |..| |..|----+------+------+-- |..|-----+-.....|....|.+....|.| --+-......|.....|....+.|....|.|--- |.|......|.....------.------.|..| ---|.---+----...................+..| |..|.............--------.......|--- |..+.............|...+..|........| ---|--...........|...|--|........|--- |.|...........S...| |........+..| |.+...........--------........|..| ------+---.......................|--- |..+.....|-+--+--+--------------.| |..|-----|..|...|..............|+-- ---- |..|...|-------+------|..| ---|...| |..| |..| ----- |..| ---- ---- ENDMAP # Specifications for the whole level RANDOM_MONSTERS: 'd', 'r' REGION:(00,00,36,19),lit,"ordinary" NON_DIGGABLE:(00,00,36,19) # Bloody Tower # See historical comments above. STAIR:(10,16),up DOOR:open,(11,14) # Lieutenant's Lodgings (Queen's House) # A large hall built in 1530 as the lodgings for the # Lieutenant of the Tower. The Lieutenant is a military officer # who is responsible for the defense and maintenance of the # Tower. He serves under the Constable of the Tower, and oversees # the Chief Yeoman Warder. # # Anne Boleyn was tried and imprisoned in this house. Ironically, # her daughter, Elizabeth I, dined in this house during her # later incarceration. After Elizabeth became queen, the house # was renamed the Queen's House. # # Guido "Guy" Fawkes was interrogated here for his Gunpowder # Plot in 1605. Rudolph Hess was also interrogated here during # World War II. # # William Penn is currently being held here. He should be kept # alive at all costs, since he will later found the American # colony of Pennsylvania! DOOR:locked,(06,13) MONSTER:'@',"watch captain",(04,14),peaceful MONSTER:'@',"watchman",(05,14),peaceful MONSTER:'@',"watchman",(06,14),peaceful MONSTER:'@',"watchman",(07,14),peaceful MONSTER:'@',"prisoner",(08,14),"William Penn",peaceful # Bell Tower # Planned by Richard I "The Lionhearted", completed in 1200s. # Elizabeth I was held here during her imprisonment. # # This tower contains the warning bell that calls the garrison # to arms. # ...So that's where the Bell of Opening is from! ENGRAVING:(02,14),burn,"In case of trouble, ring bell." DOOR:closed,(03,14) # Gentleman Gaoler's (Jailer's) Lodgings # This is the home of the Gentleman Gaoler, who oversees the # incarceration of prisoners. Lady Jane Grey was also imprisoned # here. DOOR:locked,(05,12) MONSTER:'@',"watchman",(04,11),peaceful MONSTER:'@',"watch captain",(04,12),peaceful # Beauchamp Tower # Built by Edward I. # A prison named after victim Thomas Beauchamp. MONSTER:'@',"prisoner",(01,08),peaceful MONSTER:'@',"prisoner",(02,09),peaceful DOOR:locked,(03,09) # Tower Green # Many prisoners were beheaded on this grassy knoll. OBJECT:')',"axe",(10,09) # Devereux Tower (Robyn the Devylls Tower) # Probably built by Henry III. # Another prison, named after prisoner Robert Devereux. MONSTER:'@',"prisoner",(04,03),peaceful MONSTER:'@',"prisoner",(03,04),peaceful DOOR:locked,(04,05) # Chapel of St. Peter ad Vincula # First built by Henry I; rebuilt several times. # Many victims of execution were buried in this chapel. DOOR:open,(08,07) REGION:(06,05,11,06),unlit,"morgue" # Flint Tower # Built by Henry III. # Yet another prison -- and considered the worst. MONSTER:'@',"prisoner",(10,02),peaceful MONSTER:'@',"prisoner",(11,03),peaceful DOOR:locked,(11,04) # Bowyer Tower # Built by Henry III. # Home and workshop of the king's bow maker. # # The Tower Fire of 1841 would begin here. OBJECT:')',"silver arrow",(17,01) OBJECT:')',"arrow",(17,01) OBJECT:')',"silver arrow",(18,01) OBJECT:')',"arrow",(18,01) OBJECT:')',"silver arrow",(17,02) OBJECT:')',"arrow",(18,02) OBJECT:')',"silver arrow",(17,02) OBJECT:')',"bow",(18,02) DOOR:closed,(17,03) # Storehouses # These later burned down in the Tower Fire of 1841. # Afterwards, the Waterloo Barracks were built on the site. # Those barracks have been the home of the crown jewels # since 1967. DOOR:closed,(23,05) REGION:(19,04,22,05),lit,"shop" DOOR:closed,(25,04) REGION:(26,04,29,05),lit,"shop" # Brick Tower # Built by Henry III. # Sir Walter Ralegh was held here at one time. DOOR:closed,(24,03) # Martin Tower # Built by Henry III. # This is where the crown jewels were kept at the time of # Colonel Blood's attempted theft in 1671. Talbot Edwards # was the Assistant Keeper of the Jewels. DOOR:open,(31,03) OBJECT:'%',"corpse",(31,02),uncursed,"watchman",0,"Talbot Edwards" # Constable Tower # Built by Henry III. # This is the home of the Constable of the Tower, a lord # (NOT a policeman!) who oversees all operations at the tower # complex. This was a position of privelege appointed by the # monarch. DOOR:locked,(32,07) MONSTER:'@',"watch captain",(33,06),peaceful # Broad Arrow Tower # Built by Henry III. # Roman Catholic priests were imprisoned here in the 1500s. DOOR:closed,(33,11) # Salt Tower (Julius Caesar's Tower) # Site of an ancient Roman fortress. # Prison for Jesuits. DOOR:closed,(32,15) # Royal apartments # Built by Henry III. # This corner of the inner ward contained apartment houses # and gardens for the royal family, the royal court, and # the vast staff of servants. Many of the buildings were # ordered demolished by Oliver Cromwell during his rule as # Lord Protector (1653-1658), in an attempt to remove all # symbols of the monarchy. Only a few buildings survived, # and the royal family no longer used it as a residence. DOOR:closed,(17,14) # Lanthorn Tower # Site of the ancient Roman wall. # Part of the royal residence built by Henry III. # Abandoned at the time of the theft of the crown jewels. DOOR:closed,(24,16) # Wakefield Tower (Hall Tower, Record Tower) # Originally built by Henry III in 1221 as the dining hall # of the royal residence. # After 1360, the records of the kingdom were kept here. # The tower was renamed for William de Wakefield, King's # Clerk to Edward III. REGION:(13,15,15,17),lit,"book shop" DOOR:open,(14,14) # White Tower (the Keep) # The oldest and largest building of the tower complex. # Built by William I "the Conquerer" in 1078 as a military # garrison, to keep control over the inhabitants of London. # Used as the royal residence from 1140 to the reign of # Henry III. The walls were painted white by Henry III to # make it appear more forbidding. This building was # converted into a museum in the 1600s. DOOR:locked,(17,11) DOOR:closed,(21,09) STAIR:(23,09),down ### Lower fill levels ### # # The White Tower # See historical comments above. # MAZE: "Yeo-filb", ' ' GEOMETRY:center,center #1234567890123456789012345678901234567890123456789012345678901234567890 MAP ---- ---- --..-- |..| |..-.| |..|------------|.-..| --+-.....+..........-- |.......|........--- |.......|........| |.......|........| |.......|........| |.......|........| |.......|+---------- |.......|..........-- |.......|---------..-- |.......| --..| |.......| --..| |.......|---------..-- --+-.....+..........-- |..|----------------- |..| ---- ENDMAP # Specifications for the whole level RANDOM_MONSTERS: 'd', 'r' REGION:(00,00,22,19),lit,"ordinary" NON_DIGGABLE:(00,00,22,19) STAIR:(19,01),up STAIR:(20,02),down # Barracks REGION:(10,04,17,09),lit,"barracks",filled # Council chamber DOOR:closed,(09,04) DOOR:closed,(09,16) # Chapel gallery DOOR:closed,(10,10) # Prison turrets (now empty) DOOR:locked,(02,04) DOOR:locked,(02,16) # Objects OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random # Random monsters MONSTER:'d',"large dog",random,hostile MONSTER:'d',"large dog",random,hostile MONSTER:'d',"large dog",random,hostile MONSTER:'d',"wolf",random,hostile MONSTER:'d',"werewolf",random,hostile MONSTER:'d',"werewolf",random,hostile MONSTER:'r',"sewer rat",random,hostile MONSTER:'r',"sewer rat",random,hostile MONSTER:'r',"sewer rat",random,hostile MONSTER:'r',"rabid rat",random,hostile MONSTER:'r',"rabid rat",random,hostile # Traps TRAP:"arrow",random TRAP:"arrow",random TRAP:"arrow",random TRAP:"arrow",random TRAP:"board",random TRAP:"board",random ### The quest "goal" level ### # # More of the White Tower # # Here you meet Colonel Blood, your nemesis monster. You have # to defeat him in combat to gain the artifact you have been # assigned to retrieve. # MAZE: "Yeo-goal", ' ' FLAGS: noteleport GEOMETRY:center,center #1234567890123456789012345678901234567890123456789012345678901234567890 MAP ---- ---- --..-- |..| |..-.| |..|------------|....| --+-.....+..........-- |.......|........--- |.......|........| |.......|..K..K..| |.......|........| |.......|........| |.\.....|+---------- |.......|..........-- |.......|-.-.-.-.-..-- |.......+.........-..| |.......+.........-..| |.......|-.-.-.-.-..-- --+-.....|..........-- |..|----------------- |..| ---- ENDMAP # Specifications for the whole level RANDOM_MONSTERS: 'd', 'r' REGION:(00,00,22,19),lit,"ordinary" NON_DIGGABLE:(00,00,22,19) STAIR:(19,01),up # The Sword Room # The Knights of the Bath were inducted on the eve # of the coronation of a new monarch. They would bathe # in tubs (the sinks) in this room. MONSTER:'@',"knight",(12,07),asleep,peaceful OBJECT:')',"broadsword",(12,08) MONSTER:'@',"knight",(15,07),asleep,peaceful OBJECT:')',"long sword",(15,08) # The banquet hall # After bathing, the Knights of the Bath would feast with # the monarch in this room. DOOR:closed,(09,04) REGION:(02,05,08,16),lit,"throne",unfilled OBJECT:'[',"helm of telepathy",(03,10),blessed,0,"The Crown of Saint Edward" MONSTER:'@',"Colonel Blood",(03,10),hostile OBJECT:'%',random,(04,06) OBJECT:'%',random,(07,07) OBJECT:'%',random,(05,09) OBJECT:'%',random,(03,12) OBJECT:'%',random,(05,15) OBJECT:'%',random,(07,13) # The Chapel of Saint John # Finally, inductees to the Knights of the Bath would # keep an all-night vigil in the chapel, with their armor # laid on the altar. REGION:(10,11,21,16),unlit,"temple",filled,true DOOR:closed,(10,10) DOOR:closed,(09,13) DOOR:closed,(09,14) ALTAR:(18,13),law,altar OBJECT:'[',"chain mail",(18,13) OBJECT:'[',"plate mail",(18,13) #OBJECT:'(',"tallow candle",(10,11),lit #OBJECT:'(',"tallow candle",(19,11),lit #OBJECT:'(',"tallow candle",(10,16),lit #OBJECT:'(',"tallow candle",(19,16),lit # Prison turrets (now empty) DOOR:locked,(02,04) DOOR:locked,(02,16) # Random monsters MONSTER:'d',"large dog",random,hostile MONSTER:'d',"large dog",random,hostile MONSTER:'d',"large dog",random,hostile MONSTER:'d',"wolf",random,hostile MONSTER:'d',"werewolf",random,hostile MONSTER:'d',"werewolf",random,hostile MONSTER:'r',"sewer rat",random,hostile MONSTER:'r',"sewer rat",random,hostile MONSTER:'r',"sewer rat",random,hostile MONSTER:'r',"rabid rat",random,hostile MONSTER:'r',"rabid rat",random,hostile # Traps TRAP:"arrow",random TRAP:"arrow",random TRAP:"arrow",random TRAP:"arrow",random TRAP:"board",random TRAP:"board",random slashem-0.0.7E7F3/dat/Slayer.des0000664000076400007640000002373310545462317014370 0ustar aliali# SCCS Id: @(#)Slayer.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. # # The "start" level for the quest. # # Here you meet your (besieged) class leader, Van Helsing # and receive your quest assignment. # MAZE: "Und-strt",' ' FLAGS: noteleport,hardfloor GEOMETRY:center,center MAP ............................................................................ ............................................................................ ............................................................................ ....................------------------------------------.................... ....................|................|.....|.....|.....|.................... ....................|..------------..|--+-----+-----+--|.................... ....................|..|..........|..|.................|.................... ....................|..|..........|..|+---+---+-----+--|.................... ..................---..|..........|......|...|...|.....|.................... ..................+....|..........+......|...|...|.....|.................... ..................+....|..........+......|...|...|.....|.................... ..................---..|..........|......|...|...|.....|.................... ....................|..|..........|..|+-----+---+---+--|.................... ....................|..|..........|..|.................|.................... ....................|..------------..|--+-----+-----+--|.................... ....................|................|.....|.....|.....|.................... ....................------------------------------------.................... ............................................................................ ............................................................................ ............................................................................ ENDMAP # Random Monsters RANDOM_MONSTERS: 'Z', 'W', 'V', 'M' # Dungeon Description REGION:(00,00,75,19),lit,"ordinary" REGION:(24,06,33,13),lit,"temple" # Portal arrival point BRANCH:(05,04,05,04),(0,0,0,0) # Stairs STAIR:(52,09),down # Doors DOOR:locked,(18,09) DOOR:locked,(18,10) DOOR:closed,(34,09) DOOR:closed,(34,10) DOOR:closed,(40,05) DOOR:closed,(46,05) DOOR:closed,(52,05) DOOR:locked,(38,07) DOOR:closed,(42,07) DOOR:closed,(46,07) DOOR:closed,(52,07) DOOR:locked,(38,12) DOOR:closed,(44,12) DOOR:closed,(48,12) DOOR:closed,(52,12) DOOR:closed,(40,14) DOOR:closed,(46,14) DOOR:closed,(52,14) # Unattended Altar - unaligned due to conflict - player must align it. ALTAR:(28,09),noalign,altar # High Priest MONSTER:'@',"Van Helsing",(28,10) # The treasure of Van Helsing OBJECT:'(',"chest",(27,10) # knight guards for the audience chamber MONSTER:'@',"exterminator",(32,07) MONSTER:'@',"exterminator",(32,08) MONSTER:'@',"exterminator",(32,11) MONSTER:'@',"exterminator",(32,12) MONSTER:'@',"exterminator",(33,07) MONSTER:'@',"exterminator",(33,08) MONSTER:'@',"exterminator",(33,11) MONSTER:'@',"exterminator",(33,12) # Non diggable walls NON_DIGGABLE:(00,00,75,19) # Random traps TRAP:"dart",(20,09) TRAP:"dart",(20,10) TRAP:random,random TRAP:random,random TRAP:random,random TRAP:random,random # Monsters on siege duty. MONSTER: 'M',"human mummy",(37,01) MONSTER: 'M',"human mummy",(37,18) MONSTER: 'M',"human mummy",(03,03) MONSTER: 'M',"human mummy",(65,04) MONSTER: 'M',"human mummy",(12,11) MONSTER: 'M',"human mummy",(60,12) MONSTER: 'M',"human mummy",(14,08) MONSTER: 'M',"human mummy",(55,00) MONSTER: 'M',"human mummy",(18,18) MONSTER: 'M',"human mummy",(59,10) MONSTER: 'M',"human mummy",(13,09) MONSTER: 'M',"human mummy",(01,17) # # The "locate" level for the quest. # # Here you have to locate the Crypt of Vlad to go # further towards your assigned quest. # MAZE: "Und-loca",' ' FLAGS: hardfloor # This is a kludge to init the level as a lit field. INIT_MAP: '.' , '.' , false , false , lit , false GEOMETRY:center,center MAP ........................................ ........................................ ..........----------+----------......... ..........|........|.|........|......... ..........|........|.|........|......... ..........|----.----.----.----|......... ..........+...................+......... ..........+...................+......... ..........|----.----.----.----|......... ..........|........|.|........|......... ..........|........|.|........|......... ..........----------+----------......... ........................................ ........................................ ENDMAP # Random Monsters RANDOM_MONSTERS: 'Z', 'W', 'V', 'M' # Dungeon Description REGION:(00,00,09,13),unlit,"morgue" REGION:(09,00,30,01),unlit,"morgue" REGION:(09,12,30,13),unlit,"morgue" REGION:(31,00,39,13),unlit,"morgue" REGION:(11,03,29,10),lit,"temple",filled,true # The altar inside the temple ALTAR:(20,07),noalign,shrine MONSTER:'@',"aligned priest",(20,07),noalign,hostile # Doors DOOR:locked,(10,06) DOOR:locked,(10,07) DOOR:locked,(20,02) DOOR:locked,(20,11) DOOR:locked,(30,06) DOOR:locked,(30,07) # Stairs # Note: The up stairs are *intentionally* off of the map. STAIR:(43,05),up STAIR:(20,06),down # Non diggable walls NON_DIGGABLE:(10,02,30,13) # Objects (inside the antechambers). OBJECT:random,random,(14,03) OBJECT:random,random,(15,03) OBJECT:random,random,(16,03) OBJECT:random,random,(14,10) OBJECT:random,random,(15,10) OBJECT:random,random,(16,10) OBJECT:random,random,(17,10) OBJECT:random,random,(24,03) OBJECT:random,random,(25,03) OBJECT:random,random,(26,03) OBJECT:random,random,(27,03) OBJECT:random,random,(24,10) OBJECT:random,random,(25,10) OBJECT:random,random,(26,10) OBJECT:random,random,(27,10) # Random traps TRAP:random,(15,04) TRAP:random,(25,04) TRAP:random,(15,09) TRAP:random,(25,09) TRAP:random,random TRAP:random,random # No random monsters - the morgue generation will put them in. # # The "goal" level for the quest. # # Here you meet Count Dracula your nemesis monster. You have to # defeat Count Dracula in combat to gain the artifact you have # been assigned to retrieve. # MAZE: "Und-goal", ' ' INIT_MAP: 'L' , '.' , false , false , unlit , false GEOMETRY:center,center MAP .L......L.LLL.......LL.... .LLL.......L......LL...... LL.LL.............L.LL.... .......................... ......................LL.. ......................LLL. LL........................ .LL....................... .LL................LL.L... ..LL.....L.LL.......LLL... .........LLL.........L.... ENDMAP # Random Monsters RANDOM_MONSTERS: 'Z', 'W', 'V', 'M' # Dungeon Description REGION:(00,00,25,10),unlit,"ordinary" # Stairs STAIR:(20,05),up # Objects OBJECT:')',"wooden stake",(13,05),blessed,0,"The Stake of Van Helsing" OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random # Random traps TRAP:"fire",random TRAP:"fire",random TRAP:"fire",random TRAP:"fire",random TRAP:"fire",random TRAP:"fire",random TRAP:"fire",random TRAP:"fire",random TRAP:"fire",random TRAP:"fire",random TRAP:"fire",random TRAP:"fire",random TRAP:random,random TRAP:random,random # Random monsters. MONSTER:'V',"Count Dracula",(13,05) MONSTER:'M',"human mummy",random MONSTER:'M',"human mummy",random MONSTER:'M',"human mummy",random MONSTER:'M',"human mummy",random MONSTER:'M',"human mummy",random MONSTER:'M',"human mummy",random MONSTER:'M',random,random MONSTER:'M',random,random MONSTER:'V',"vampire",random MONSTER:'V',"vampire",random MONSTER:'V',"vampire",random MONSTER:'V',"vampire",random MONSTER:'V',random,random MONSTER:'V',random,random MONSTER:'V',random,random # # The "fill" levels for the quest. # # These levels are used to fill out any levels not occupied by specific # levels as defined above. "filla" is the upper filler, between the # start and locate levels, and "fillb" the lower between the locate # and goal levels. # LEVEL: "Und-fila" # Random Monsters RANDOM_MONSTERS: 'Z', 'W', 'V', 'M' # ROOM: "ordinary" , random, random, random, random STAIR: random, up OBJECT: random,random,random MONSTER: 'V', "vampire", random MONSTER: 'M', "human mummy", random ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random OBJECT: random,random,random MONSTER: 'V', "vampire", random MONSTER: 'M', "human mummy", random ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random TRAP: random, random OBJECT: random,random,random MONSTER: 'V', "vampire", random MONSTER: 'M', "human mummy", random ROOM: "morgue" , random, random, random, random STAIR: random, down OBJECT: random, random, random TRAP: random, random ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random OBJECT: random, random, random TRAP: random, random MONSTER: 'V', "vampire", random MONSTER: 'M', "human mummy", random ROOM: "morgue" , random, random, random, random OBJECT: random, random, random TRAP: random, random RANDOM_CORRIDORS LEVEL: "Und-filb" # Random Monsters RANDOM_MONSTERS: 'Z', 'W', 'V', 'M' # ROOM: "ordinary" , random, random, random, random STAIR: random, up OBJECT: random,random,random MONSTER: 'M', "human mummy", random MONSTER: 'V', "vampire", random ROOM: "morgue" , random, random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random,random,random ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random TRAP: random, random OBJECT: random,random,random MONSTER: 'M', "human mummy", random MONSTER: 'V', "vampire", random ROOM: "morgue" , random, random, random, random STAIR: random, down OBJECT: random, random, random OBJECT: random, random, random TRAP: random, random ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random OBJECT: random, random, random TRAP: random, random MONSTER: 'M', "human mummy", random MONSTER: 'V', "vampire", random ROOM: "morgue" , random, random, random, random OBJECT: random, random, random TRAP: random, random RANDOM_CORRIDORS slashem-0.0.7E7F3/dat/data.base0000664000076400007640000073361610545462317014211 0ustar aliali# SCCS Id: @(#)data.base 3.4 2003/07/23 # $Id: data.base,v 1.14.2.2 2006/04/17 11:14:04 prousu Exp $ # Copyright (c) 1994, 1995, 1996 by the NetHack Development Team # Copyright (c) 1994 by Boudewijn Wayers # Copyright (c) 2002 by the Slash'EM Development Team # NetHack may be freely redistributed. See license for details. # # This is the data.base for SLASH'EM # # This is the source file for the "data" file generated by `makedefs -d'. # A line starting with a # is a comment and is ignored by makedefs. # Any other line not starting with whitespace is a creature or an item. # # Each entry should be comprised of: # the thing/person being described on a line by itself, in lowercase; # on each succeeding line a description. # # If the first character of a key field is "~", then anything which matches # the rest of that key will be treated as if it did not match any of the # following keys for that entry. For instance, `~orc ??m*' preceding `orc*' # prevents "orc mummy" and "orc zombie" from matching. # # The demons are all listed first because makedefs used to have to give # them special handling for #ifndef INFERNO; it doesn't matter any more. abbathor Abbathor is the sole evil dwarven god, the great master of the greed and avarice that plagues so many of that otherwise noble race. He is a hunched, twisted creature, warped by his own greeds, jealousies, and desires. Like many other deities, his name is often invoked by followers of other gods to keep him away from one's treasure. abbot For it had been long apparent to Count Landulf that nothing could be done with his seventh son Thomas, except to make him an Abbot or something of that kind. Born in 1226, he had from childhood a mysterious objection to becoming a predatory eagle, or even to taking an ordinary interest in falconry or tilting or any other gentlemanly pursuits. He was a large and heavy and quiet boy, and phenomenally silent, scarcely opening his mouth except to say suddenly to his schoolmaster in an explosive manner, "What is God?" The answer is not recorded but it is probable that the asker went on worrying out answers for himself. [ The Runaway Abbot, by G. K. Chesterton ] aerdrie faenya Aerdrie Faenya is the elven goddess of air and weather. As a rain- bringer, she is revered as a source of fertility. She is, however, perceived as a somewhat distant goddess, and the fact that she is also revered by some aarakocra slightly diminishes the strength of elven devotion to her (as does her definite neutral tendency in alignment). The goddess herself takes delight in the freedom of the skies, the music of wind instruments, and (sometimes) fairly severe and violent thunderstorms. She is friendly to all avians, aarakocra, ki-rin, and lammasu. [ Monster Mythology, by TSR inc. ] aclys aklys A short studded or spiked club attached to a cord allowing it to be drawn back to the wielder after having been thrown. It should not be confused with the atlatl, which is a device used to throw spears for longer distances. *leax An Aleax, according to the AD&D Fiend Folio, is a creature that looks exactly like the character, and is sent by the character's god to punish alignment violations. Obviously - and luckily - in Nethack this is not the case. *altar Altars are of three types: 1. In Temples. These are for Sacrifices [...]. The stone top will have grooves for blood, and the whole will be covered with _dry brown stains of a troubling kind_ from former Sacrifices. [ The Tough Guide to Fantasyland, by Diana Wynne Jones ] To every man upon this earth Death cometh soon or late; And how can man die better Than facing fearful odds For the ashes of his fathers And the temples of his gods? [ Lays of Ancient Rome, by Thomas B. Macaulay ] amat*rasu * The Shinto sun goddess, Amaterasu Omikami is the central figure of Shintoism and the ancestral deity of the imperial house. One of the daughters of the primordial god Izanagi and said to be his favourite offspring, she was born from his left eye. [ Encyclopedia of Gods, by Michael Jordan ] amber* "Tree sap," Wu explained, "often flows over insects and traps them. The insects are then perfectly preserved within the fossil. One finds all kinds of insects in amber - including biting insects that have sucked blood from larger animals." [ Jurassic Park, by Michael Crichton ] *amnesia maud Get thee hence, nor come again, Mix not memory with doubt, Pass, thou deathlike type of pain, Pass and cease to move about! 'Tis the blot upon the brain That will show itself without. ... For, Maud, so tender and true, As long as my life endures I feel I shall owe you a debt, That I never can hope to pay; And if ever I should forget That I owe this debt to you And for your sweet sake to yours; O then, what then shall I say? - If ever I should forget, May God make me more wretched Than ever I have been yet! [ Maud, And Other Poems by Alfred, Lord Tennyson ] ~amulet of yendor *amulet amulet of * "The complete Amulet can keep off all the things that make people unhappy -- jealousy, bad temper, pride, disagreeableness, greediness, selfishness, laziness. Evil spirits, people called them when the Amulet was made. Don't you think it would be nice to have it?" "Very," said the children, quite without enthusiasm. "And it can give you strength and courage." "That's better," said Cyril. "And virtue." "I suppose it's nice to have that," said Jane, but not with much interest. "And it can give you your heart's desire." "Now you're talking," said Robert. [ The Story of the Amulet, by Edith Nesbit ] amulet of yendor This mysterious talisman is the object of your quest. It is said to possess powers which mere mortals can scarcely comprehend, let alone utilize. The gods will grant the gift of immortality to the adventurer who can deliver it from the depths of Moloch's Sanctum and offer it on the appropriate high altar on the Astral Plane. angel* He answered and said unto them, he that soweth the good seed is the Son of man; the field is the world, and the good seed are the children of the kingdom; but the weeds are the children of the wicked one; the enemy that sowed them is the devil; the harvest is the end of the world; and the reapers are the angels. As therefore the weeds are gathered and burned in the fire; so shall it be in the end of this world. [...] So shall it be at the end of the world; the angels shall come forth, and sever the wicked from among the just, and shall cast them into the furnace of fire; there shall be wailing and gnashing of teeth. [ The Gospel According to Matthew, 13:37-42, 49-50 ] anhur An Egyptian god of war and a great hunter, few gods can match his fury. Unlike many gods of war, he is a force for good. The wrath of Anhur is slow to come, but it is inescapable once earned. Anhur is a mighty figure with four arms. He is often seen with a powerful lance that requires both of his right arms to wield and which is tipped with a fragment of the sun. He is married to Mehut, a lion-headed goddess. ankh-morpork The twin city of Ankh-Morpork, foremost of all the cities bounding the Circle Sea, was as a matter of course the home of a large number of gangs, thieves' guilds, syndicates and similar organisations. This was one of the reasons for its wealth. Most of the humbler folk on the widdershin side of the river, in Morpork's mazy alleys, supplemented their meagre incomes by filling some small role for one or other of the competing gangs. [ The Colour of Magic by Terry Pratchett ] anshar A primordial Babylonian-Akkadian deity, Anshar is mentioned in the Babylonian creation epic _Enuma Elish_ as one of a pair of offspring (with Kishar) of Lahmu and Lahamu. Anshar is linked with heaven while Kishar is identified with earth. [ Encyclopedia of Gods, by Michael Jordan ] ant * ant This giant variety of the ordinary ant will fight just as fiercely as its small, distant cousin. Various varieties exist, and they are known and feared for their relentless persecution of their victims. anu Anu was the Babylonian god of the heavens, the monarch of the north star. He was the oldest of the Babylonian gods, the father of all gods, and the ruler of heaven and destiny. Anu features strongly in the _atiku_ festival in Babylon, Uruk and other cities. ape * ape The most highly evolved of all the primates, as shown by all their anatomical characters and particularly the development of the brain. Both arboreal and terrestrial, the apes have the forelimbs much better developed than the hind limbs. Tail entirely absent. Growth is slow and sexual maturity reached at quite an advanced age. [ A Field Guide to the Larger Mammals of Africa by Dorst ] Aldo the gorilla had a plan. It was a good plan. It was right. He knew it. He smacked his lips in anticipation as he thought of it. Yes. Apes should be strong. Apes should be masters. Apes should be proud. Apes should make the Earth shake when they walked. Apes should _rule_ the Earth. [ Battle for the Planet of the Apes, by David Gerrold ] Four-handed, tailless, mammal of the order of Primates, of the sub-order of _Anthropoidea_, which of all mammals most closely resembles man (both in appearance and in behaviour). [ Van Dale's Groot Woordenboek der Nederlandse Taal ] apple NEWTONIAN, adj. Pertaining to a philosophy of the universe invented by Newton, who discovered that an apple will fall to the ground, but was unable to say why. His successors and disciples have advanced so far as to be able to say when. [ The Devil's Dictionary, by Ambrose Bierce ] archeologist * 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 evil. They are beings at peace with themselves and their surroundings. Archons are the primary inhabitants of the Seven Heavens. The five varieties of archon (Lantern, Hound, Warden, Sword, and Tome) have wholly different appearances. The various types look like spheres of light, dog-faced humanoids, bear-like humanoids, winged humanoids, and hawk-like humanoids respectively. Although there is a distinct hierarchy among the varieties, there is no rivalry or jealousy there. Each has his role to fulfil and that is recognition enough for an archon. However strange and frightening their appearance, archons never seem evil. Rather, they appear as beings at peace with themselves and their environment. [ Monstrous Compendium 8, by TSR inc. ] arioch Arioch, the patron demon of Elric's ancestors; one of the most powerful of all the Dukes of Hell, who was called Knight of the Swords, Lord of the Seven Darks, Lord of the Higher Hell and many more names besides. [ Elric of Melnibone, by Michael Moorcock ] *arrow I shot an arrow into the air, It fell to earth, I knew not where; For, so swiftly it flew, the sight Could not follow it in its flight. I breathed a song into the air, It fell to earth, I knew not where; For who has sight so keen and strong That it can follow the flight of song? Long, long afterward, in an oak I found the arrow still unbroke; And the song, from beginning to end, I found again in the heart of a friend. [ The Arrow and the Song, by Henry Wadsworth Longfellow ] arkenstone Arkenstone, Heart of the Mountain, property of the King under the Mountain, is the most valued jewel that the dwarves possess. It shines white light that can guide your steps in the darkness, and carrying it is said to increase your carrying capacity. When invoked it will reveal the gold around you. *shikaga *akauji Ashikaga Takauji was a daimyo of the Minamoto clan who joined forces with the Go-Daigo to defeat the Hojo armies. Later when Go-Daigo attempted to reduce the powers of the samurai clans he rebelled against him. He defeated Go- Daigo and established the emperor Komyo on the throne. Go-Daigo eventually escaped and established another government in the town of Yoshino. This period of dual governments was known as the Nambokucho. [ Samurai - The Story of a Warrior Tradition, by Cook ] On July 8, 1336, he and his samurai entered Kyoto, forced Go-Daigo to retire, after which he seized power himself and installed a puppet prince on the throne (the current Japanese imperial family are the descendants of this puppet emperor that Ashikaga installed). Go-Daigo escaped, though, wouldn't admit to have been defeated, and opened a new "capital" in Yoshino (south of Kyoto), where he and few of his descendants claimed to be running a government, known as the "Southern Court". The period between 1337 and 1392, when Japan was ruled by two courts, is known as the Nambokucho. That "government" disappeared, naturally, after a few generations, and Ashikaga's Muromachi regime lasted for a long time. The last Ashikaga daimyo in power was the 14th descendant of Takauji. asphynx This small, inoffensive-looking snake shares the feared power of petrification with its distant relatives the cockatrice and basilisk. Just one touch from its blunt snout can render one motionless for all eternity. [ The New Bestiary, Wizard Endlebrook ] athol In 1927, zoologist Ernst Bartels was in his home near the Tjidjenkol River in Java when he heard a strange cry louder than the other night sounds, a cry like "a-hool." Bartels heard the sound twice more before the origin of the cries moved off into the night. Bartels soon remembered a local legend of the ahool or athol, a type of huge bat reputed to live in the area. Locals described the bat as the size of a small child, with an 11-12 foot wingspan. The athol was supposedly covered in grayish fur and had a face similar to that of a monkey or a man. At times, it was seen sitting on the forest floor, with its wings folded beside it; it was also reputed to have feet which pointed backwards. During the day (like all bats, it was nocturnal), the athol's refuge was supposedly a cave somewhere near a waterfall, although at night it would fly over the river's surface in search of fish. [ "A Belfry of Crypto-bats." by Shuker, Dr. Karl P.N. Fortean Studies 1, pp. 235-245. ] asmodeus It is said that Asmodeus is the overlord over all of hell. His appearance, unlike many other demons and devils, is human apart from his horns and tail. He can freeze flesh with a touch. athame The consecrated ritual knife of a Wiccan initiate (one of four basic tools, together with the wand, chalice and pentacle). Traditionally, the athame is a double-edged, black-handled, cross-hilted dagger of between six and eighteen inches length. athen* Athene was the offspring of Zeus, and without a mother. She sprang forth from his head completely armed. Her favourite bird was the owl, and the plant sacred to her is the olive. [ Bulfinch's Mythology by Thomas Bulfinch ] Athena, the Greek goddess of war and peace, the peaceful arts, and wisdom. Patron defender of many Greek cities, Athens in particular (then called Pallas Athena), she is a major goddess of the Greek pantheon and, according to Hesiod, the daughter of Metis (Wisdom) and Zeus, born fully armed from his head. A goddess of battle and allegedly a snake goddess, she is a deity who also stands for discipline against the more unruly conduct of such as Hermes and Poseidon. Her symbol is the Aegis, the skin of a sacrificial goat. She is also associated with ship-building and domestic crafts. [ after the Encyclopedia of Gods, by Michael Jordan ] axolotl A mundane salamander, harmless. bag bag of * sack "Now, this third handkerchief," Mein Herr proceeded, "has also four edges, which you can trace continuously round and round: all you need do is to join its four edges to the four edges of the opening. The Purse is then complete, and its outer surface--" "I see!" Lady Muriel eagerly interrupted. "Its outer surface will be continuous with its inner surface! But it will take time. I'll sew it up after tea." She laid aside the bag, and resumed her cup of tea. "But why do you call it Fortunatus's Purse, Mein Herr?" The dear old man beamed upon her, with a jolly smile, looking more exactly like the Professor than ever. "Don't you see, my child--I should say Miladi? Whatever is inside that Purse, is outside it; and whatever is outside it, is inside it. So you have all the wealth of the world in that leetle Purse!" [ Sylvie and Bruno Concluded, by Lewis Carroll ] b*lzebub The "lord of the flies" is a translation of the Hebrew Ba'alzevuv (Beelzebub in Greek). It has been suggested that it was a mistranslation of a mistransliterated word which gave us this pungent and suggestive name of the Devil, a devil whose name suggests that he is devoted to decay, destruction, demoralization, hysteria and panic... [ Notes on _Lord of the Flies_, by E. L. Epstein ] balrog ... It came to the edge of the fire and the light faded as if a cloud had bent over it. Then with a rush it leaped the fissure. The flames roared up to greet it, and wreathed about it; and a black smoke swirled in the air. Its streaming mane kindled, and blazed behind it. In its right hand was a blade like a stabbing tongue of fire; in its left it held a whip of many thongs. 'Ai, ai!' wailed Legolas. 'A Balrog! A Balrog is come!' [ The Fellowship of the Ring, by J.R.R. Tolkien ] baluchitherium titanothere Extinct rhinos include a variety of forms, the most spectacular being _Baluchitherium_ from the Oligocene of Asia, which is the largest known land mammal. Its body, 18 feet high at the shoulder and carried on massive limbs, allowed the 4-foot-long head to browse on the higher branches of trees. Though not as enormous, the titanotheres of the early Tertiary were also large perissodactyls, _Brontotherium_ of the Oligocene being 8 feet high at the shoulder. [ Prehistoric Animals, by Barry Cox ] banana He took another step and she cocked her right wrist in viciously. She heard the spring click. Weight slapped into her hand. "Here!" she shrieked hysterically, and brought her arm up in a hard sweep, meaning to gut him, leaving him to blunder around the room with his intestines hanging out in steaming loops. Instead he roared laughter, hands on his hips, flaming face cocked back, squeezing and contorting with great good humor. "Oh, my dear!" he cried, and went off into another gale of laughter. She looked stupidly down at her hand. It held a firm yellow banana with a blue and white Chiquita sticker on it. She dropped it, horrified, to the carpet, where it became a sickly yellow grin, miming Flagg's own. "You'll tell," he whispered. "Oh yes indeed you will." And Dayna knew he was right. [ The Stand, by Stephen King ] barbarian * barbarian They dressed alike -- in buckskin boots, leathern breeks and deerskin shirts, with broad girdles that held axes and short swords; and they were all gaunt and scarred and hard-eyed; sinewy and taciturn. They were wild men, of a sort, yet there was still a wide gulf between them and the Cimmerian. They were sons of civilization, reverted to a semi-barbarism. He was a barbarian of a thousand generations of barbarians. They had acquired stealth and craft, but he had been born to these things. He excelled them even in lithe economy of motion. They were wolves, but he was a tiger. [ Conan - The Warrior, by Robert E. Howard ] Hrun the Barbarian crept soundlessly along the corridors, which were lit with a light so violet that it was almost black. his earlier confusion was gone. This was obviously a magical temple, and that explained everything. ... Observe Hrun, as he leaps cat-footed across a suspicious tunnel mouth. Even in this violet light his skin gleams coppery. There is much gold about his person, in the form of anklets and wristlets, but otherwise he is naked except for a leopardskin loincloth. He took that in the steaming forests of Howondaland, after killing its owner with his teeth. In his right hand he carried the magical black sword Kring, which was forged from a thunderbolt and has a soul but suffers no scabbard. Hrun had stolen it only three days before from the impregnable palace of the Archmandrite of B'Ituni, and he was already regretting it. It was beginning to get on his nerves. "I tell you it went down that last passage on the right," hissed Kring in a voice like the scrape of a blade over stone. "Be silent!" "All I said was -" "Shut up!" [ The colour of Magic, by Terry Pratchett ] barbed devil Barbed devils lack any real special abilities, though they are quite difficult to kill. ~mongbat ~vampire bat ~wombat *bat A bat, flitting in the darkness outside, took the wrong turn as it made its nightly rounds and came in through the window which had been left healthfully open. It then proceeded to circle the room in the aimless fat-headed fashion habitual with bats, who are notoriously among the less intellectually gifted of God's creatures. Show me a bat, says the old proverb, and I will show you something that ought to be in some kind of a home. [ A Pelican at Blandings, by P. G. Wodehouse ] *boot* In Fantasyland these are remarkable in that they seldom or never wear out and are suitable for riding or walking in without the need of Socks. Boots never pinch, rub, or get stones in them; nor do nails stick upwards into the feet from the soles. They are customarily mid-calf length or knee-high, slip on and off easily and never smell of feet. Unfortunately, the formula for making this splendid footwear is a closely guarded secret, possibly derived from nonhumans (see Dwarfs, Elves, and Gnomes). [ The Tough Guide to Fantasyland, by Diana Wynne Jones ] boulder I worked the lever well under, and stretched my back; the end of the stone rose up, and I kicked the fulcrum under. Then, when I was going to bear down, I remembered there was something to get out from below; when I let go of the lever, the stone would fall again. I sat down to think, on the root of the oak tree; and, seeing it stand about the ground, I saw my way. It was lucky I had brought a longer lever. It would just reach to wedge under the oak root. Bearing it down so far would have been easy for a heavy man, but was a hard fight for me. But this time I meant to do it if it killed me, because I knew it could be done. Twice I got it nearly there, and twice the weight bore it up again; but when I flung myself on it the third time, I heard in my ears the sea-sound of Poseidon. Then I knew this time I would do it; and so I did. [ The King Must Die, by Mary Renault ] ~*longbow of diana bow * bow "Stand to it, my hearts of gold," said the old bowman as he passed from knot to knot. "By my hilt! we are in luck this journey. Bear in mind the old saying of the Company." "What is that, Aylward?" cried several, leaning on their bows and laughing at him. "'Tis the master-bowyer's rede: 'Every bow well bent. Every shaft well sent. Every stave well nocked. Every string well locked.' There, with that jingle in his head, a bracer on his left hand, a shooting glove on his right, and a farthing's-worth of wax in his girdle, what more doth a bowman need?" "It would not be amiss," said Hordle John, "if under his girdle he had four farthings'-worth of wine." [ The White Company, by Sir Arthur Conan Doyle ] bec de corbin A peasant pole-arm, the bec de corbin's crow-beak blade was designed to puncture the heavy plate armor common to upper-class warriors. In this weapon the beak is the major feature. This is backed by a flat hammer head or clawed head, with a short and bladelike spike at the opposite end. *bee This giant variety of its useful normal cousin normally appears in small groups, looking for raw material to produce the royal jelly needed to feed their queen. On rare occasions, one may stumble upon a bee-hive, in which the queen bee is being well provided for, and guarded against intruders. *beetle [ The Creator ] has an inordinate fondness for beetles. [ attributed to biologist J.B.S. Haldane ] The common name for the insects with wings shaped like shields (_Coleoptera_), one of the ten sub-species into which the insects are divided. They are characterized by the shields (the front pair of wings) under which the back wings are folded. [ Van Dale's Groot Woordenboek der Nederlandse Taal ] beholder The beholder (A.K.A the eye tyrant, the sphere of many eyes) is most frequently found deep underground, although infrequently it will lair in desolate wilderness. The globular body of this monster is supported by levitation, and it floats slowly about as it wills. Atop the sphere are ten eyestalks, while in its central area are a great eleventh eye and a large mouth filled with pointed teeth. Each of the eyes is said to have a different magical property, all of which are deadly or malicious. The beholder is hateful, tricky, and avaricious and is known to have a fondness for both traps and artifacts. [ Adapted by Ben Lehman from Monstrous Manual, by TSR, Inc. ] bell of opening "A bell, book and candle job." The Bursar sighed. "We tried that, Archchancellor." The Archchancellor leaned towards him. "Eh?" he said. "I _said_, we tried that Archchancellor," said the Bursar loudly, directing his voice at the old man's ear. "After dinner, you remember? We used Humptemper's _Names of the Ants_ and rang Old Tom."* "Did we, indeed. Worked, did it?" "_No_, Archchancellor." * Old Tom was the single cracked bronze bell in the University bell tower. [ Eric, by Terry Pratchett ] blindfold The blindfolding was performed by binding a piece of the yellowish linen whereof those of the Amahagger who condescended to wear anything in particular made their dresses tightly round the eyes. This linen I afterwards discovered was taken from the tombs, and was not, as I had first supposed, of native manufacture. The bandage was then knotted at the back of the head, and finally brought down again and the ends bound under the chin to prevent its slipping. Ustane was, by the way, also blindfolded, I do not know why, unless it was from fear that she should impart the secrets of the route to us. [ She, by H. Rider Haggard ] blind io On this particular day Blind Io, by dint of constant vigilance the chief of the gods, sat with his chin on his hand and looked at the gaming board on the red marble table in front of him. Blind Io had got his name because, where his eye sockets should have been, there were nothing but two areas of blank skin. His eyes, of which he had an impressively large number, led a semi-independent life of their own. Several were currently hovering above the table. [ The Colour of Magic, by Terry Pratchett ] * blob gelatinous cube ooze * ooze * slime These giant amoeboid creatures look like nothing more than puddles of slime, but they both live and move, feeding on metal or wood as well as the occasional dungeon explorer to supplement their diet. But we were not on a station platform. We were on the track ahead as the nightmare, plastic column of fetid black iridescence oozed tightly onward through its fifteen-foot sinus, gathering unholy speed and driving before it a spiral, re-thickening cloud of the pallid abyss vapor. It was a terrible, indescribable thing vaster than any subway train -- a shapeless congeries of protoplasmic bubbles, faintly self-luminous, and with myriads of temporary eyes forming and unforming as pustules of greenish light all over the tunnel-filling front that bore down upon us, crushing the frantic penguins and slithering over the glistening floor that it and its kind had swept so evilly free of all litter. [ At the Mountains of Madness, by H.P. Lovecraft ] *pudding " It's all very fine," said the Puddin' gloomily, " singing about the joys of being penguins and pirates, but how'd you like to be a Puddin' and be eaten all day long? " And in a very gruff voice he sang as follows :-- " O, who would be a puddin', A puddin' in a pot, A puddin' which is stood on A fire which is hot ? O sad indeed the lot Of puddin's in a pot. ... " But as I am a puddin', A puddin' in a pot, I hope you get the stomachache For eatin' me a lot. I hope you get it hot, You puddin'-eatin' lot ! " " Very well sung, Albert," said Bill encouragingly, " though you're a trifle husky in your undertones, which is no doubt due to the gravy in your innards. However, as a reward for bein' a bright little feller we shall have a slice of you all round before turnin' in for the night." [ The Magic Pudding: The Adventures of Bunyip Bluegum. Norman Lindsay ] bone devil Bone devils attack with weapons and with a great hooked tail which causes a loss of strength to those they sting. book of the dead candelabrum* *candle Faustus: Come on Mephistopheles. What shall we do? Mephistopheles: Nay, I know not. We shall be cursed with bell, book, and candle. Faustus: How? Bell, book, and candle, candle, book, and bell, Forward and backward, to curse Faustus to hell. Anon you shall hear a hog grunt, a calf bleat, and an ass bray, Because it is Saint Peter's holy day. (Enter all the Friars to sing the dirge) [ Doctor Faustus and Other Plays, by Christopher Marlowe ] bottle * bottle For half a buck, a vial of luck Or a bottle of nifty breaks Or a flask of joy, or Myrna Loy For luncheon with sirloin steaks. Pour out a mug from this old jug, And you'll never get wet in rains. I've bottles of grins and racetrack wins And lotions to ease your pains. Here's bottles of imps and wet-pack shrimps From a sea unknown to man, And an elixir to banish fear, And the sap from the pipes of Pan. With the powdered horn of the unicorn You can win yourself a mate; With the rish hobnob; or get a job -- It's yours at a lowered rate. [ Shottle Bop, by Theodore Sturgeon ] brigit Brigit (Brigid, Bride, Banfile), which means the Exalted One, was the Celtic (continental European and Irish) fertility goddess. She was originally celebrated on February first in the festival of Imbolc, which coincided with the beginning of lactation in ewes and was regarded in Scotland as the date on which Brigit deposed the blue-faced hag of winter. The Christian calendar adopted the same date for the Feast of St. Brigit. There is no record that a Christian saint ever actually existed, but in Irish mythology she became the midwife to the Virgin Mary. [ Encyclopedia of Gods, by Michael Jordan ] ~stormbringer *broadsword Bring me my broadsword And clear understanding. Bring me my cross of gold, As a talisman. [ "Broadsword" (refrain) by Ian Anderson ] bugbear Bugbears are relatives of goblins, although they tend to be larger and more hairy. They are aggressive carnivores and sometimes kill just for the treasure their victims may be carrying. Bugbears are giant, hairy cousins of goblins who frequent the same areas as their smaller relatives. Bugbears are large and very muscular, standing 7' tall. Their hides range from light yellow to yellow brown and their thick coarse hair varies in colour from brown to brick red. Though vaguely humanoid in appearance, bugbears seem to contain the blood of some large carnivore. Their eyes recall those of some savage bestial animal, being greenish white with red pupils, while their ears are wedge shaped, rising from the top of their heads. A bugbear's mouth is full of long sharp fangs. Bugbears have two main goals in life: survival and treasure. They are superb carnivores, winnowing out the weak and careless adventurer, monster, and animal. Goblins are always on their toes when bugbears are present, for the weak or stupid quickly end up in the stewpot. [ Monstrous Manual, by TSR, Inc. ] bugle 'I read you by your bugle horn And by your palfrey good, I read you for a Ranger sworn To keep the King's green-wood.' 'A Ranger, Lady, winds his horn, And 'tis at peep of light; His blast is heard at merry morn, And mine at dead of night.' [ Brignall Banks, by Sir Walter Scott ] byakhee A creature of the stars, this bat like being can be summoned across the vast interstellar gulfs to serve magicians and dark powers. It is said that they will seize those who summon them and cannot best them and carry them off to whatever terrible fate awaits them on other worlds. *camaxtli A classical Mesoamerican Aztec god, also known as Mixcoatl- Camaxtli (the Cloud Serpent), Camaxtli is the god of war. He is also a deity of hunting and fire who received human sacrifice of captured prisoners. According to tradition, the sun god Tezcatlipoca transformed himself into Mixcoatl-Camaxtli to make fire by twirling the sacred fire sticks. [ Encyclopedia of Gods, by Michael Jordan ] candy bar Only once a year, on his birthday, did Charlie Bucket ever get to taste a bit of chocolate. The whole family saved up their money for that special occasion, and when the great day arrived, Charlie was always presented with one small chocolate bar to eat all by himself. And each time he received it, on those marvelous birthday mornings, he would place it carefully in a small wooden box that he owned, and treasure it as though it were a bar of solid gold; and for the next few days, he would allow himself only to look at it, but never to touch it. Then at last, when he could stand it no longer, he would peel back a tiny bit of the paper wrapping at one corner to expose a tiny bit of chocolate, and then he would take a tiny nibble - just enough to allow the lovely sweet taste to spread out slowly over his tongue. The next day, he would take another tiny nibble, and so on, and so on. And in this way, Charlie would make his ten-cent bar of birthday chocolate last him for more than a month. [ Charlie and the Chocolate Factory, by Roald Dahl ] s*d*g*r* cat Imagine a sealed container, so perfectly constructed that no physical influence can pass either inwards or outwards across its walls. Imagine that inside the container is a cat, and also a device that can be triggered by some quantum event. If that event takes place, then the device smashes a phial containing cyanide and the cat is killed. If the event does not take place, the cat lives on. In Schroedinger's original version, the quantum event was the decay of a radioactive atom. ... To the outside observer, the cat is indeed in a linear combination of being alive and dead, and only when the container is finally opened would the cat's state vector collapse into one or the other. On the other hand, to a (suitably protected) observer inside the container, the cat's state-vector would have collapsed much earlier, and the outside observer's linear combination has no relevance. [ The Emperor's New Mind, by Roger Penrose ] *cat kitten Well-known quadruped domestic animal from the family of predatory felines (_Felis ochreata domestica_), with a thick, soft pelt; often kept as a pet. Various folklores have the cat associated with magic and the gods of ancient Egypt. So Ulthar went to sleep in vain anger; and when the people awakened at dawn - behold! Every cat was back at his accustomed hearth! Large and small, black, grey, striped, yellow and white, none was missing. Very sleek and fat did the cats appear, and sonorous with purring content. [ The Cats of Ulthar, by H.P. Lovecraft ] # this one doesn't work very well for dwarven and gnomish cavemen cave*man human cave*man Now it was light enough to leave. Moon-Watcher picked up the shriveled corpse and dragged it after him as he bent under the low overhang of the cave. Once outside, he threw the body over his shoulder and stood upright - the only animal in all this world able to do so. Among his kind, Moon-Watcher was almost a giant. He was nearly five feet high, and though badly undernourished weighed over a hundred pounds. His hairy, muscular body was halfway between ape and man, but his head was already much nearer to man than ape. The forehead was low, and there were ridges over the eye sockets, yet he unmistakably held in his genes the promise of humanity. [ 2001: A Space Odyssey, by Arthur C. Clarke ] *centaur Of all the monsters put together by the Greek imagination the Centaurs (Kentauroi) constituted a class in themselves. Despite a strong streak of sensuality, in their make-up, their normal behaviour was moral, and they took a kindly thought of man's welfare. The attempted outrage of Nessos on Deianeira, and that of the whole tribe of Centaurs on the Lapith women, are more than offset by the hospitality of Pholos and by the wisdom of Cheiron, physician, prophet, lyrist, and the instructor of Achilles. Further, the Centaurs were peculiar in that their nature, which united the body of a horse with the trunk and head of a man, involved an unthinkable duplication of vital organs and important members. So grotesque a combination seems almost un-Greek. These strange creatures were said to live in the caves and clefts of the mountains, myths associating them especially with the hills of Thessaly and the range of Erymanthos. [ Mythology of all races, Vol. 1, pp. 270-271 ] centipede I observed here, what I had often seen before, that certain districts abound in centipedes. Here they have light reddish bodies and blue legs; great myriapedes are seen crawling every where. Although they do no harm, they excite in man a feeling of loathing. Perhaps our appearance produces a similar feeling in the elephant and other large animals. Where they have been much disturbed, they certainly look upon us with great distrust, as the horrid biped that ruins their peace. [ Travels and Researches in South Africa, by Dr. David Livingstone ] *erberus kerberos Cerberus, (or Kerberos in Greek), was the three-headed dog that guarded the Gates of Hell. He allowed any dead to enter, and likewise prevented them all from ever leaving. He was bested only twice: once when Orpheus put him to sleep by playing bewitching music on his lyre, and the other time when Hercules confronted him and took him to the world of the living (as his twelfth and last labor). chameleon Name of a family (_Chameleonidae_) and race (_Chameleo_) of scaly lizards, especially the _Chameleo vulgaris_ species, with a short neck, claws, a grasping tail, a long, extendible tongue and mutually independent moving eyes. When it is scared or angry, it inflates itself and its transparent skin shows its blood: the skin first appears greenish, then gradually changes color until it is a spotted red. The final color depends on the background color as well, hence the (figurative) implication of unreliability. [Capitalized:] a constellation of the southern hemisphere (Chameleo). [ Van Dale's Groot Woordenboek der Nederlandse Taal ] *haro*n When an ancient Greek died, his soul went to the nether world: the Hades. To reach the nether world, the souls had to cross the river Styx, the river that separated the living from the dead. The Styx could be crossed by ferry, whose shabby ferry- man, advanced in age, was called Charon. The deceased's next- of-kin would place a coin under his tongue, to pay the ferry- man. chest large box Dantes rapidly cleared away the earth around the chest. Soon the center lock appeared, then the handles at each end, all delicately wrought in the manner of that period when art made precious even the basest of metals. He took the chest by the two handles and tried to lift it, but it was impossible. He tried to open it; it was locked. He inserted the sharp end of his pickaxe between the chest and the lid and pushed down on the handle. The lid creaked, then flew open. Dantes was seized with a sort of giddy fever. He cocked his gun and placed it beside him. The he closed his eyes like a child, opened them and stood dumbfounded. The chest was divided into three compartments. In the first were shining gold coins. In the second, unpolished gold ingots packed in orderly stacks. From the third compartment, which was half full, Dantes picked up handfuls of diamonds, pearls and rubies. As they fell through his fingers in a glittering cascade, they gave forth the sound of hail beating against the windowpanes. [ The Count of Monte Cristo, by Alexandre Dumas ] chih*sung*tzu A Chinese rain god. *hromatic *ragon tiamat Tiamat is said to be the mother of evil dragonkind. She is extremely vain. Avaricious, supremely vain, and profoundly Lawful Evil, Tiamat proclaims herself the creator of all evil dragonkind, and certainly many evil dragons revere her as their creator and patron deity. She infests the uppermost of the Nine Hells with her consorts, each a Great Wyrm of different colour - one red, one white, one green, one blue, and one black. Tiamat's Avatar appears as a gigantic five-headed dragon with one head of each of the chromatic (evil) dragon types. Each head's colour runs the length of the neck and into the forepart of het body as stripes, gradually blending to three stripes of grey, blue-green, and purple over her back and hind-quarters, then merging into a muddy dark brown tail. Her underbelly and legs are greenish white fading into her upper body colours. [ Monster Mythology, by TSR inc. ] ~elven cloak ~oilskin cloak *cloak* Cloaks are the universal outer garb of everyone who is not a Barbarian. It is hard to see why. They are open in front and require you at most times to use one hand to hold them shut. On horseback they leave the shirt-sleeved arms and most of the torso exposed to wind and Weather. The OMTs [ Official Management Terms ] for Cloaks well express their difficulties. They are constantly _swirling and dripping_ and becoming _heavy with water_ in rainy Weather, _entangling with trees_ or _swords_, or needing to be _pulled close around her/his shivering body_. This seems to suggest they are less than practical for anyone on an arduous Tour. [ The Tough Guide to Fantasyland, by Diana Wynne Jones ] cloud* I wandered lonely as a cloud That floats on high o'er vales and hills, When all at once I saw a crowd, A host, of golden daffodils; Beside the lake, beneath the trees, Fluttering and dancing in the breeze. [ I Wandered Lonely as a Cloud, by William Wordsworth ] cobra Darzee and his wife only cowered down in the nest without answering, for from the thick grass at the foot of the bush there came a low hiss -- a horrid cold sound that made Rikki-tikki jump back two clear feet. Then inch by inch out of the grass rose up the head and spread hood of Nag, the big black cobra, and he was five feet long from tongue to tail. When he had lifted one-third of himself clear of the ground, he stayed balancing to and fro exactly as a dandelion-tuft balances in the wind, and he looked at Rikki-tikki with the wicked snake's eyes that never change their expression, whatever the snake may be thinking of. 'Who is Nag?' said he. '_I_ am Nag. The great God Brahm put his mark upon all our people, when the first cobra spread his hood to keep the sun off Brahm as he slept. Look, and be afraid!' [ Rikki-tikki-tavi, by Rudyard Kipling ] cockatrice basilisk Once in a great while, when the positions of the stars are just right, a seven-year-old rooster will lay an egg. Then, along will come a snake, to coil around the egg, or a toad, to squat upon the egg, keeping it warm and helping it to hatch. When it hatches, out comes a creature called basilisk, or cockatrice, the most deadly of all creatures. A single glance from its yellow, piercing toad's eyes will kill both man and beast. Its power of destruction is said to be so great that sometimes simply to hear its hiss can prove fatal. Its breath is so venomous that it causes all vegetation to wither. There is, however, one creature which can withstand the basilisk's deadly gaze, and this is the weasel. No one knows why this is so, but although the fierce weasel can slay the basilisk, it will itself be killed in the struggle. Perhaps the weasel knows the basilisk's fatal weakness: if it ever sees its own reflection in a mirror it will perish instantly. But even a dead basilisk is dangerous, for it is said that merely touching its lifeless body can cause a person to sicken and die. [ Mythical Beasts by Deirdre Headon (The Leprechaun Library) and other sources ] chickatrice This beastie is the recently-hatched broodling of a cockatrice, a creature feared by adventurers great and small for its petrifying peck. [ The New Bestiary, Wizard Endlebrook ] pyrolisk A single glance from this red-feathered cockatrice can cause even the bravest adventurer to burst into flames, their flesh withering and blackening and curling beneath the creature's baleful gaze. [ The New Bestiary, Wizard Endlebrook ] cornuthaum He was dressed in a flowing gown with fur tippets which had the signs of the zodiac embroidered over it, with various cabalistic signs, such as triangles with eyes in them, queer crosses, leaves of trees, bones of birds and animals, and a planetarium whose stars shone like bits of looking-glass with the sun on them. He had a pointed hat like a dunce's cap, or like the headgear worn by ladies of that time, except that the ladies were accustomed to have a bit of veil floating from the top of it. [ The Once and Future King, by T.H. White ] "A wizard!" Dooley exclaimed, astounded. "At your service, sirs," said the wizard. "How perceptive of you to notice. I suppose my hat rather gives me away. Something of a beacon, I don't doubt." His hat was pretty much that, tall and cone-shaped with stars and crescent moons all over it. All in all, it couldn't have been more wizardish. [ The Elfin Ship, James P. Blaylock ] couatl A mythical feathered serpent. The couatl are very rare. The couatl are feathered serpents of myth and lore. It is believed that they are distant relatives of dragons, though this remains unproven. So rare as to be considered legendary, the couatl are some of the most beautiful creatures in existence. A couatl has the body of a long serpent and feathered wings the colour of the rainbow. Occasionally sent as messengers from the gods to their erring servants, a couatl will always seek to punish those who deserve it. [ 2nd ed. Monstrous Compendium, by TSR, Inc. ] coyote This carnivore is known for its voracious appetite and inflated view of its own intelligence. cram* If you want to know what cram is, I can only say that I don't know the recipe; but it is biscuitish, keeps good indefinitely, is supposed to be sustaining, and is certainly not entertaining, being in fact very uninteresting except as a chewing exercise. It was made by the Lake-men for long journeys. [ The Hobbit, by J.R.R. Tolkien ] *crocodile A big animal with the appearance of a lizard, constituting an order of the reptiles (_Loricata_ or _Crocodylia_), the crocodile is a large, dangerous predator native to tropical and subtropical climes. It spends most of its time in large bodies of water. croesus kroisos creosote Croesus (in Greek: Kroisos), the wealthy last king of Lydia; his empire was destroyed when he attacked Cyrus in 549, after the Oracle of Delphi (q.v.) had told him: "if you attack the Persians, you will destroy a mighty empire". Herodotus relates of his legendary conversation with Solon of Athens, who impressed upon him that being rich does not imply being happy and that no one should be considered fortunate before his death. crom Warily Conan scanned his surroundings, all of his senses alert for signs of possible danger. Off in the distance, he could see the familiar shapes of the Camp of the Duali tribe. Suddenly, the hairs on his neck stand on end as he detects the aura of evil magic in the air. Without thought, he readies his weapon, and mutters under his breath: "By Crom, there will be blood spilt today." [ Conan the Avenger by Robert E. Howard, Bjorn Nyberg, and L. Sprague de Camp ] crossbow* "God save thee, ancient Mariner! From the fiends, that plague thee thus! - Why look'st thou so?" - With my cross-bow I shot the Albatross. [ The Rime of the Ancient Mariner, by Samuel Taylor Coleridge ] crystal ball You look into one of these and see _vapours swirling like clouds_. These shortly clear away to show a sort of video without sound of something that is going to happen to you soon. It is seldom good news. [ The Tough Guide to Fantasyland, by Diana Wynne Jones ] ct*ul*u kt*ul*u cht*ul*u kht*ul*u "The Thing cannot be described -- there is no language for such abysms of shrieking and immemorial lunacy, such eldritch contradictions of all matter, force, and cosmic order. A mountain walked or stumbled. God!... the Thing of the idols, the green, sticky spawn of the stars, had awakened to claim his own. The stars were right again... great Cthulhu was loose again, and ravening for delight." [ The Call of Cthulhu, by H.P. Lovecraft ] The exact origins of Cthulhu are lost to time, but it is known that in aeons long past a race of space faring beings came to this world and Cthulhu was amongst their number as the high priest who interceded between them and the dark gods they worshipped. Whether Cthulhu is a long lived individual or a title of office, is not known, but a creature bearing this name lives on, trapped in eternal slumber in the ruins of his great city. curse* Curses are longstanding ill-wishings which, in Fantasyland, often manifest as semisentient. They have to be broken or dispelled. The method varies according to the type and origin of the Curse: [...] 4. Curses on Rings and Swords. You have problems. Rings have to be returned whence they came, preferably at over a thousand degrees Fahrenheit, and the Curse means you won't want to do this. Swords usually resist all attempts to raise their Curses. Your best source is to hide the Sword or give it to someone you dislike. [ The Tough Guide to Fantasyland, by Diana Wynne Jones ] cwn*n A pack of snow-white, red-eared spectral hounds which sometimes took part in the kidnappings and raids the inhabitants of the underworld sometimes make on this world (the Wild Hunt). They are associated in Wales with the sounds of migrating wild geese, and are said to be leading the souls of the damned to hell. The phantom chase is usually heard or seen in midwinter and is accompanied by a howling wind. [ Encyclopedia Mythica, ed. M.F. Lindemans ] cyclops And after he had milked his cattle swiftly, he again took hold of two of my men and had them as his supper. Then I went, with a tub of red wine, to stand before the Cyclops, saying: "A drop of wine after all this human meat, so you can taste the delicious wine that is stored in our ship, Cyclops." He took the tub and emptied it. He appreciated the priceless wine that much that he promptly asked me for a second tub. "Give it", he said, "and give me your name as well". ... Thrice I filled the tub, and after the wine had clouded his mind, I said to him, in a tone as sweet as honey: "You have asked my name, Cyclops? Well, my name is very well known. I'll give it to you, if you give me the gift you promised me as a guest. My name is Nobody. All call me thus: my father and my mother and my friends." Ruthlessly he answered to this: "Nobody, I will eat you last of all; your host of friends will completely precede you. That will be my present to you, my friend." And after these words he fell down backwards, restrained by the all-restrainer Hupnos. His monstrous neck slid into the dust; the red wine squirted from his throat; the drunk vomited lumps of human flesh. [ The Odyssey, (chapter Epsilon), by Homer ] ~sting *dagger Is this a dagger which I see before me, The handle toward my hand? Come, let me clutch thee. I have thee not, and yet I see thee still. Art thou not, fatal vision, sensible To feeling as to sight? or art thou but A dagger of the mind, a false creation, Proceeding from the heat-oppressed brain? I see thee yet, in form as palpable As this which now I draw. [ Macbeth, by William Shakespeare ] dark one ... But he ruled rather by force and fear, if they might avail; and those who perceived his shadow spreading over the world called him the Dark Lord and named him the Enemy; and he gathered again under his government all the evil things of the days of Morgoth that remained on earth or beneath it, and the Orcs were at his command and multiplied like flies. Thus the Black Years began ... [ The Silmarillion, by J.R.R. Tolkien ] deep* one For eighty thousand years Pth'thya-l'yi had lived in Y'ha-nthlei, and thither she had gone back after Obed Marsh was dead. Y'ha-nthlei was not destroyed when the upper-earth men shot death into the sea. It was hurt, but not destroyed. The Deep Ones could never be destroyed, even though the palaeogean magic of the forgotten Old Ones might sometimes check them. For the present they would rest; but some day, if they remembered, they would rise again for the tribute Great Cthulhu craved. [ The Shadow Over Innsmouth, by H.P. Lovecraft ] demogorgon Demogorgon, the prince of demons, wallows in filth and can spread a quickly fatal illness to his victims while rending them. He is a mighty spellcaster, and he can drain the life of mortals with a touch of his tail. demon It is often very hard to discover what any given Demon looks like, apart from a general impression of large size, huge fangs, staring eyes, many limbs, and an odd color; but all accounts agree that Demons are very powerful, very Magic (in a nonhuman manner), and made of some substance that can squeeze through a keyhole yet not be pierced with a Sword. This makes them difficult to deal with, even on the rare occasions when they are friendly. [ The Tough Guide to Fantasyland, by Diana Wynne Jones ] *deva Devas are the descendants of plane-touched aasimon. They have feathery wings that may be vestigial or functional. Movanic devas are the most frequently seen by mortals. Their milky skin and slender build distinguishes them from the dark and muscular monadic devas. The latter are rarely encountered except in the inner planes. It is said they are able to breathe elements other than air. [ adapted from Aasimar, by David Roberts and Brynn ] planetar These Aasimar seldom associate with mortals. Planetars are hairless and tall, with green-tinted skin and a wild psionic talent. [ adapted from Aasimar, by David Roberts and Brynn ] solar Solars are near to powers in status, and their children like demipowers. Their hair and skin is metallic. Solars stay aloof from mortals, but may command them with an irresistable voice. [ adapted from Aasimar, by David Roberts and Brynn ] dingo A wolflike wild dog, Canis dingo, of Australia, having a reddish- or yellowish-brown coat, believed to have been introduced by the aborigines. [Webster's Encyclopedic Unabridged Dictionary of the English Language] disenchanter Ask not, what your magic can do to it. Ask what it can do to your magic. dispater Dispater is an arch-devil who rules the city of Dis. He is a powerful mage. djinn* The djinn are genies from the elemental plane of Air. There, among their kind, they have their own societies. They are sometimes encountered on earth and may even be summoned here to perform some service for powerful wizards. The wizards often leave them about for later service, safely tucked away in a flask or lamp. Once in a while, such a tool is found by a lucky rogue, and some djinn are known to be so grateful when released that they might grant their rescuer a wish. ~hachi ~slasher ~sirius *dog pup* A domestic animal, the _tame dog_ (_Canis familiaris_), of which numerous breeds exist. The male is called a dog, while the female is called a bitch. Because of its known 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. shadow wolf This evil creature (_canis tenebrous_) lurks in the darker, more sinister corners of the world. Its bite is known for its chilling effect upon humanoid flesh, and it is not a tameable animal. [ The New Bestiary, Wizard Endlebrook ] mist wolf This hazy canine (_canis precipitous_) is thought to have a good heart hiding somewhere within its green, silky hide. Unfortunately, the beast is usually ravenous, as its diet of mist is not very filling, at least compared to human flesh. [ The New Bestiary, Wizard Endlebrook ] *drum* Many travelers have seen the drums of the great apes, and some have heard the sounds of their beating and the noise of the wild, weird revelry of these first lords of the jungle, but Tarzan, Lord Greystoke, is, doubtless, the only human being who ever joined in the fierce, mad, intoxicating revel of the Dum-Dum. [ Tarzan of the Apes, by Edgar Rice Burroughs ] ~trap*door *door doorway Through me you pass into the city of woe: Through me you pass into eternal pain: Through me among the people lost for aye. Justice the founder of my fabric mov'd: To rear me was the task of power divine, Supremest wisdom, and primeval love. Before me things create were none, save things Eternal, and eternal I endure. All hope abandon ye who enter here. [ The Inferno, from The Divine Comedy of Dante Alighieri, translated by H.F. Cary ] doppelganger "Then we can only give thanks that this is Antarctica, where there is not one, single, solitary, living thing for it to imitate, except these animals in camp." "Us," Blair giggled. "It can imitate us. Dogs can't make four hundred miles to the sea; there's no food. There aren't any skua gulls to imitate at this season. There aren't any penguins this far inland. There's nothing that can reach the sea from this point - except us. We've got brains. We can do it. Don't you see - it's got to imitate us - it's got to be one of us - that's the only way it can fly an airplane - fly a plane for two hours, and rule - be - all Earth's inhabitants. A world for the taking - if it imitates us! [ Who Goes There?, by John W. Campbell ] 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" ] ~komodo* *dragon *xoth In the West the dragon was the natural enemy of man. Although preferring to live in bleak and desolate regions, whenever it was seen among men it left in its wake a trail of destruction and disease. Yet any attempt to slay this beast was a perilous undertaking. For the dragon's assailant had to contend not only with clouds of sulphurous fumes pouring from its fire breathing nostrils, but also with the thrashings of its tail, the most deadly part of its serpent-like body. [ Mythical Beasts by Deirdre Headon (The Leprechaun Library) ] "One whom the dragons will speak with," he said, "that is a dragonlord, or at least that is the center of the matter. It's not a trick of mastering the dragons, as most people think. Dragons have no masters. The question is always the same, with a dragon: will he talk to you or will he eat you? If you can count upon his doing the former, and not doing the latter, why then you're a dragonlord." [ The Tombs of Atuan, by Ursula K. Le Guin ] dumathoin Dumathoin of the Keeper of Secrets Under the Mountain, the god of mining, discovery, and exploration. He is called the Silent Keeper, for he never speaks, but may guide his most devoted followers and worshippers through fate and happenstance to the richest veins of ore and the greatest treasures. His symbol is a faceted gem set against a mountainous silhouette. ~dwarf ??m* dwarf* dwar* cave*man Dwarfs have faces like men (ugly men, with wrinkled, leathery skins), but are generally either flat-footed, duck-footed, or have feet pointing backwards. They are of the earth, earthy, living in the darkest of caverns and venturing forth only with the cloaks by which they can make themselves invisible, and others disguised as toads. Miners often come across them, and sometimes establish reasonably close relations with them. ... The miners of Cornwall were always delighted to hear a bucca busily mining away, for all dwarfs have an infallible nose for precious metals. Among other things, dwarfs are rightly valued for their skill as blacksmiths and jewellers: they made Odin his famous spear Gungnir, and Thor his hammer; for Freya they designed a magnificent necklace, and for Frey a golden boar. And in their spare time they are excellent bakers. Ironically, despite their odd feet, they are particularly fond of dancing. They can also see into the future, and consequently are excellent meteorologists. They can be free with presents to people they like, and a dwarvish gift is likely to turn to gold in the hand. But on the whole they are a snappish lot. [ The Immortals, by Derek and Julia Parker ] earendil elwing In after days, when because of the triumph of Morgoth Elves and Men became estranged, as he most wished, those of the Elven-race that lived still in Middle-earth waned and faded, and Men usurped the sunlight. Then the Quendi wandered in the lonely places of the great lands and the isles, and took to the moonlight and the starlight, and to the woods and the caves, becoming as shadows and memories, save those who ever and anon set sail into the West and vanished from Middle-earth. But in the dawn of years Elves and Men were allies and held themselves akin, and there were some among Men that learned the wisdom of the Eldar, and became great and valiant among the captains of the Noldor. And in the glory and beauty of the Elves, and in their fate, full share had the offspring of elf and mortal, Earendil, and Elwing, and Elrond their child. [ The Silmarillion, by J.R.R. Tolkien ] earth Mostly Harmless. [ Hitchhiker's Guide to the Galaxy, by Douglas Adams ] eel giant eel The behaviour of eels in fresh water extends the air of mystery surrounding them. They move freely into muddy, silty bottoms of lakes, lying buried in the daylight hours in summer. [...] Eels are voracious carnivores, feeding mainly at night and consuming a wide variety of fishes and invertebrate creatures. Contrary to earlier thinking, eels seek living rather than dead creatures and are not habitual eaters of carrion. [ Freshwater Fishes of Canada, by Scott and Crossman ] egg But I asked why not keep it and let the hen sit on it till it hatched, and then we could see what would come out of it. "Nothing good, I'm certain of that," Mom said. "It would probably be something horrible. But just remember, if it's a crocodile or a dragon or something like that, I won't have it in my house for one minute." [ The Enormous Egg, by Oliver Butterworth ] elbereth ... Even as they stepped over the threshold a single clear voice rose in song. 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! Frodo halted for a moment, looking back. Elrond was in his chair and the fire was on his face like summer-light upon the trees. Near him sat the Lady Arwen. [...] He stood still enchanted, while the sweet syllables of the elvish song fell like clear jewels of blended word and melody. "It is a song to Elbereth," said Bilbo. "They will sing that, and other songs of the Blessed Realm, many times tonight. Come on!" [ The Fellowship of the Ring, by J.R.R. Tolkien ] electric eel South-American fish (_Gymnotus electricus_), living in fresh water. Shaped like a serpent, it can grow up to 2 metres. This eel is known for its electrical organ which enables it to paralyse creatures up to the size of a horse. [ Van Dale's Groot Woordenboek der Nederlandse Taal ] *elemental Elementals are manifestations of the basic nature of the universe. There are four known forms of elementals: air, fire, water, and earth. Some mystics have postulated the necessity for a fifth type, the spirit elemental, but none have ever been encountered, at least on this plane of existence. ~elf ??m* ~elf* cl* *elf* elvenking The Elves sat round the fire upon the grass or upon the sawn rings of old trunks. Some went to and fro bearing cups and pouring drinks; others brought food on heaped plates and dishes. "This is poor fare," they said to the hobbits; "for we are lodging in the greenwood far from our halls. If ever you are our guests at home, we will treat you better." "It seems to me good enough for a birthday-party," said Frodo. Pippin afterwards recalled little of either food or drink, for his mind was filled with the light upon the elf-faces, and the sound of voices so various and so beautiful that he felt in a waking dream. [...] Sam could never describe in words, nor picture clearly to himself, what he felt or thought that night, though it remained in his memory as one of the chief events of his life. The nearest he ever got was to say: "Well, sir, if I could grow apples like that, I would call myself a gardener. But it was the singing that went to my heart, if you know what I mean." [ The Fellowship of the Ring, by J.R.R. Tolkien ] elf* cl* elv* cl* The Elves next unwrapped and gave to each of the Company the clothes they had brought. For each they had provided a hood and cloak, made according to his size, of the light but warm silken stuff that the Galadrim wove. It was hard to say of what colour they were: grey with the hue of twilight under the trees they seemed to be; and yet if they were moved, or set in another light, they were green as shadowed leaves, or brown as fallow fields by night, dusk-silver as water under the stars. [ The Fellowship of the Ring, by J.R.R. Tolkien ] emerald 'Put off that mask of burning gold With emerald eyes.' 'O no, my dear, you make so bold To find if hearts be wild and wise, And yet not cold.' 'I would but find what's there to find, Love or deceit.' 'It was the mask engaged your mind, And after set your heart to beat, Not what's behind.' 'But lest you are my enemy, I must enquire.' 'O no, my dear, let all that be; What matter, so there is but fire In you, in me?' [ The Mask, by W.B. Yeats ] erinys erinyes These female-seeming devils named after the Furies of mythology attack hand to hand and poison their unwary victims as well. ettin The two-headed giant, or ettin, is a vicious and unpredictable hunter that stalks by night and eats any meat it can catch. excalibur At first only its tip was visible, but then it rose, straight, proud, all that was noble and great and wondrous. The tip of the blade pointed toward the moon, as if it would cleave it in two. The blade itself gleamed like a beacon in the night. There was no light source for the sword to be reflecting from, for the moon had darted behind a cloud in fear. The sword was glowing from the intensity of its strength and power and knowledge that it was justice incarnate, and that after a slumber of uncounted years its time had again come. After the blade broke the surface, the hilt was visible, and holding the sword was a single strong, yet feminine hand, wearing several rings that bore jewels sparkling with the blue-green color of the ocean. [ Knight Life, by Peter David ] expensive camera There was a time when Rincewind had quite liked the iconoscope. He believed, against all experience, that the world was fundamentally understandable, and that if he could only equip himself with the right mental toolbox he could take the back off and see how it worked. He was, of course, dead wrong. The iconoscope didn't take pictures by letting light fall onto specially treated paper, as he had surmised, but by the far simpler method of imprisoning a small demon with a good eye for colour and a speedy hand with a paintbrush. He had been very upset to find that out. [ The Light Fantastic, by Terry Pratchett ] eye of the aethiopica This is a powerful amulet of ESP. In addition to its standard powers, it regenerates the energy of anyone who carries it, allowing them to cast spells more often. It also reduces any spell damage to the person who carries it by half, and protects from magic missiles. Finally, when invoked it has the power to instantly open a portal to any other area of the dungeon, allowing its invoker to travel quickly between areas. father dagon mother hydra "Yield up enough sacrifices an' savage knick-knacks an' harbourage in the taown when they wanted it, an' they'd let well enough alone. Wudn't bother no strangers as might bear tales aoutside - that is, withaout they got pryin'. All in the band of the faithful - Order o' Dagon - an' the children shud never die, but go back to the Mother Hydra an' Father Dagon what we all come from once ... Ia! Ia! Cthulhu ..." [ The Shadow Over Innsmouth, by H.P. Lovecraft ] fauchard This weapon is a development of the scythe or sickle. Set upon a long pole, the curving blade of a fauchard can be used for both cutting and thrusting. The weapon offers little in the way of parrying or catching/holding and has no provision for dismounting opponents, though it is quite useful for crippling their mounts. eyes of the overworld ... and finally there is "the Eyes of the Overworld". This obscure artifact pushes the wearer's view sense into the "overworld" -- another name for a segment of the Astral Plane. Usually, there is nothing to be seen. However, the wearer is also able to look back and see the area around herself, much like looking on a map. Why anyone would want to ... figurine* Then it appeared in Paris at just about the time that Paris was full of Carlists who had to get out of Spain. One of them must have brought it with him, but, whoever he was, it's likely he knew nothing about its real value. It had been -- no doubt as a precaution during the Carlist trouble in Spain -- painted or enameled over to look like nothing more than a fairly interesting black statuette. And in that disguise, sir, it was, you might say, kicked around Paris for seventy years by private owners and dealers too stupid to see what it was under the skin. [ The Maltese Falcon, by Dashiell Hammett ] fire vampire A swirling cloud of bright, burning motes, the fire vampire descends upon its victim and easily burns them to death once they are in its deadly embrace. floating eye Floating eyes, not surprisingly, are large, floating eyeballs which drift about the dungeon. Though not dangerous in and of themselves, their power to paralyse those who gaze at their large eye in combat is widely feared. Many are the tales of those who struck a floating eye, were paralysed by its mystic powers, and then nibbled to death by some other creature that lurked around nearby. flesh golem *frank*n*st*n* With an anxiety that almost amounted to agony, I collected the instruments of life around me, that I might infuse a spark of being into the lifeless thing that lay at my feet. It was already one in the morning; the rain pattered dismally against the panes, and my candle was nearly burnt out, when, by the glimmer of the half-extinguished light, I saw the dull yellow eye of the creature open; it breathed hard, and a convulsive motion agitated its limbs. How can I describe my emotions at this catastrophe, or how delineate the wretch whom with such infinite pains and care I had endeavoured to form? His limbs were in proportion, and I had selected his features as beautiful. Beautiful!--Great God! His yellow skin scarcely covered the work of muscles and arteries beneath; his hair was of a lustrous black, and flowing; his teeth of a pearly whiteness; but these luxuriances only formed a more horrid contrast with his watery eyes, that seemed almost of the same colour as the dun white sockets in which they were set, his shrivelled complexion and straight black lips. [ Frankenstein, by Mary Wollstonecraft Shelley ] *flute With this thou canst do mighty deeds And change men's passions for thy needs: A man's despair with joy allay, Turn bachelors old to lovers gay. [ The Magic Flute, by Wolfgang Amadeus Mozart ] fog cloud The fog comes on little cat feet. It sits looking over harbor and city on silent haunches and then moves on. [ Fog, by Carl Sandburg ] fountain Rest! This little Fountain runs Thus for aye: -- It never stays For the look of summer suns, Nor the cold of winter days. Whose'er shall wander near, When the Syrian heat is worst, Let him hither come, nor fear Lest he may not slake his thirst: He will find this little river Running still, as bright as ever. Let him drink, and onward hie, Bearing but in thought, that I, Erotas, bade the Naiad fall, And thank the great god Pan for all! [ For a Fountain, by Bryan Waller Procter ] fox One hot summer's day a Fox was strolling through an orchard till he came to a bunch of Grapes just ripening on a vine which had been trained over a lofty branch. "Just the thing to quench my thirst," quoth he. Drawing back a few paces, he took a run and a jump, and just missed the bunch. Turning round again with a One, Two, Three, he jumped up, but with no greater success. Again and again he tried after the tempting morsel, but at last had to give it up, and walked away with his nose in the air, saying: "I am sure they are sour." [ Aesop's Fables ] Later on, at the time of wheat harvest, Samson took a young goat and went to visit his wife. He said, "I'm going to my wife's room." But her father would not let him go in. "I was so sure you thoroughly hated her," he said, "that I gave her to your friend. Isn't her younger sister more attractive? Take her instead." Samson said to them, "This time I have a right to get even with the Philistines; I will really harm them." So he went out and caught three hundred foxes and tied them tail to tail in pairs. He then fastened a torch to every pair of tails, lit the torches and let the foxes loose in the standing grain of the Philistines. [ Judges 15:1-5, NIV ] *fung* Fungi, division of simple plants that lack chlorophyll, true stems, roots, and leaves. Unlike algae, fungi cannot photosynthesize, and live as parasites or saprophytes. The division comprises the slime molds and true fungi. True fungi are multicellular (with the exception of yeasts); the body of most true fungi consists of slender cottony filaments, or hyphae. All fungi are capable of asexual reproduction by cell division, budding, fragmentation, or spores. Those that reproduce sexually alternate a sexual generation (gametophyte) with a spore-producing one. The four classes of true fungi are the algaelike fungi (e.g., black bread mold and downy mildew), sac fungi (e.g., yeasts, powdery mildews, truffles, and blue and green molds such as Penicillium), basidium fungi (e.g., mushrooms and puffballs) and imperfect fungi (e.g., species that cause athlete's foot and ringworm). Fungi help decompose organic matter (important in soil renewal); are valuable as a source of antibiotics, vitamins, and various chemicals; and for their role in fermentation, e.g., in bread and alcoholic beverage production. [ The Concise Columbia Encyclopedia ] *gargoyle And so it came to pass that while Man ruled on Earth, the gargoyles waited, lurking, hidden from the light. Reborn every 600 years in Man's reckoning of time, the gargoyles joined battle against Man to gain dominion over the Earth. In each coming, the gargoyles were nearly destroyed by Men who flourished in greater numbers. Now it has been so many hundreds of years that it seems the ancient statues and paintings of gargoyles are just products of Man's imagination. In this year, with Man's thoughts turned toward the many ills he has brought among himself, Man has forgotten his most ancient adversary, the gargoyles. [ Excerpt from the opening narration to the movie _Gargoyles_, written by Stephen and Elinor Karpf ] gas spore* Gas spores are a vaguely intelligent fungal growth that has evolved to strongly resemble the Beholder. If they are struck with any amount of force they will explode violently. Gas spores tend to grow in groups, and legends have been written about the destruction caused by foolish adventurers who touched a single one. [ Adapted by Ben Lehman from Monstrous Manual, by TSR, Inc. ] *garlic 1 November - All day long we have travelled, and at a good speed. The horses seem to know that they are being kindly treated, for they go willingly their full stage at best speed. We have now had so many changes and find the same thing so constantly that we are encouraged to think that the journey will be an easy one. Dr. Van Helsing is laconic, he tells the farmers that he is hurrying to Bistritz, and pays them well to make the exchange of horses. We get hot soup, or coffee, or tea, and off we go. It is a lovely country. Full of beauties of all imaginable kinds, and the people are brave, and strong, and simple, and seem full of nice qualities. They are very, very superstitious. In the first house where we stopped, when the woman who served us saw the scar on my forehead, she crossed herself and put out two fingers towards me, to keep off the evil eye. I believe they went to the trouble of putting an extra amount of garlic into our food, and I can't abide garlic. Ever since then I have taken care not to take off my hat or veil, and so have escaped their suspicions. [ Dracula, by Bram Stoker ] # gas spore -- see *spore geryon Geryon is an arch-devil sometimes called the Wild Beast, attacking with his claws and poison sting. His ranking in Hell is rumored to be quite low. *ghost And now the souls of the dead who had gone below came swarming up from Erebus -- fresh brides, unmarried youths, old men with life's long suffering behind them, tender young girls still nursing this first anguish in their hearts, and a great throng of warriors killed in battle, their spear-wounds gaping yet and all their armour stained with blood. From this multitude of souls, as they fluttered to and fro by the trench, there came a moaning that was horrible to hear. Panic drained the blood from my cheeks. [ The Odyssey, (chapter Lambda), by Homer ] ghoul* The forces of the gloom know each other, and are strangely balanced by each other. Teeth and claws fear what they cannot grasp. Blood-drinking bestiality, voracious appetites, hunger in search of prey, the armed instincts of nails and jaws which have for source and aim the belly, glare and smell out uneasily the impassive spectral forms straying beneath a shroud, erect in its vague and shuddering robe, and which seem to them to live with a dead and terrible life. These brutalities, which are only matter, entertain a confused fear of having to deal with the immense obscurity condensed into an unknown being. A black figure barring the way stops the wild beast short. That which emerges from the cemetery intimidates and disconcerts that which emerges from the cave; the ferocious fear the sinister; wolves recoil when they encounter a ghoul. [ Les Miserables, by Victor Hugo ] *giant giant humanoid Giants have always walked the earth, though they are rare in these times. They range in size from little over nine feet to a towering twenty feet or more. The larger ones use huge boulders as weapons, hurling them over large distances. All types of giants share a love for men - roasted, boiled, or fried. Their table manners are legendary. gila* [Gila monsters] are stout-bodied lizards with short legs and a short, fat tail. They're covered with bright irregular markings, usually pink, yellow or white, against black or brown scales. They are shy, retiring creatures unless they're provoked. Then they can be dangerous because they secrete a neurotoxin -- a poison that destroys nerve tissue -- from their salivary glands. In humans, their bite can result in severe pain and even death. [Expedition Guide -- American Museum of Natural History] komodo* The people of Komodo call this animal "ora." Elsewhere it is known as the Komodo Island monitor or more popularly, the Komodo dragon. Oras can reach 10 feet in length and weigh 300 pounds or more -- particularly after a meal. They are the top predators in their habitat, feeding on wild boar, deer, water buffalo, dogs, goats, rats, snakes, birds, other oras, and -- once in a great while -- humans. They hunt by ambush, hiding in the scrub brush along trails and in the tall grass of the savannas. Despite their lumbering appearance, oras can move with alarming speed when they want to, lunging from their hiding places and sprinting toward their startled victims. They can't sustain a long chase, but often all they need to subdue their prey is one bite. Oras carry poisonous bacteria in their mouths so even if they don't immediately catch their prey, the attack is often fatal. Using their long forked tongues (oras and other monitor lizards are closely related to snakes), they track the scent of their prey as the wounded animal slowly weakens from the infected bite -- a process that can take several days. When the victim can no longer flee, the ora moves in for the kill. Oras are voracious eaters. They devour every bit of their prey -- bones, fur, hooves -- ripping off huge chunks with their razor-sharp serrated teeth and swallowing the pieces whole. [Expedition Guide -- American Museum of Natural History] glaive The glaive is a knife-bladed spear. It has the thrusting function of the spear, and the secondary cutting function of the convex blade of the knife. The weapon was rapidly enlarged in the blade in order to give it a greater cutting function as well as a cleaving attack. As with a spear or fauchard, however, it is not overly effective at holding opponents back, nor does it have the piercing or dismounting capabilities. deep gnome Far beneath the surface of the earth dwell the Svirfneblin, or Deep Gnomes. Small parties of these demihumans roam the Underdark's mazes of small passageways searching for gemstones. They are said to dwell in great cities consisting of a closely connected series of tunnels, buildings, and caverns in which up to a thousand of these diminutive creatures live. They keep the location of these hidden cities secret in order to protect them from their deadly foes, the kuo-toa, Drow, and mind flayers. Svirfneblin are slightly smaller than rock gnomes, but their thin, wiry, gnarled frames are just as strong. Their skin is rock-colored, usually medium brown to brownish gray, and their eyes are gray. Male svirfneblin are completely bald; female deep gnomes have stringy gray hair. The average svirfneblin life span is 250 years. [ The Underdark, by Mike Drees and Albert Foster ] # note: "gnomish wizard" is a monster; cave*man entry doesn't fit nonhumans ~gnome ??m* gnome* gnomish wizard gnom* cave*man ... And then a gnome came by, carrying a bundle, an old fellow three times as large as an imp and wearing clothes of a sort, especially a hat. And he was clearly just as frightened as the imps though he could not go so fast. Ramon Alonzo saw that there must be some great trouble that was vexing magical things; and, since gnomes speak the language of men, and will answer if spoken to gently, he raised his hat, and asked of the gnome his name. The gnome did not stop his hasty shuffle a moment as he answered 'Alaraba' and grabbed the rim 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 can tunnel and mine as well as any but the most skilled dwarves, when they take the trouble, though they are usually untidy and dirty. Hammers, axes, swords, daggers, pickaxes, tongs, and also instruments of torture, they make very well, or get other people to make to their design, prisoners and slaves that have to work till they die for want of air and light. [ The Hobbit, by J.R.R. Tolkien ] god goddess Goddesses and Gods operate in ones, threesomes, or whole pantheons of nine or more (see Religion). Most of them claim to have made the world, and this is indeed a likely claim in the case of threesomes or pantheons: Fantasyland does have the air of having been made by a committee. But all Goddesses and Gods, whether they say they made the world or not, have very detailed short-term plans for it which they are determined to carry out. Consequently they tend to push people into the required actions by the use of coincidence or Prophecy, or just by narrowing down your available choices of what to do next: if a deity is pushing you, things will go miserably badly until there is only one choice left to you. [ The Tough Guide to Fantasyland, by Diana Wynne Jones ] gold gold piece zorkmid A metal of characteristic yellow colour, the most precious metal used as a common commercial medium of exchange. Symbol, Au; at. no. 79; at. wt. 197.2. It is the most malleable and ductile of all metals, and very heavy (sp. gr., 19.3). It is quite unalterable by heat, moisture, and most corrosive agents, and therefore well suited for its use in coin and jewelry. [ Webster's New International Dictionary of the English Language, Second Edition ] gold golem The bellows he set away from the fire, and gathered all the tools wherewith he wrought into a silver chest; and with a sponge wiped he his face and his two hands withal, and his mighty neck and shaggy breast, and put upon him a tunic, and grasped a stout staff, and went forth halting; but there moved swiftly to support their lord handmaidens wrought of gold in the semblance of living maids. In them is understanding in their hearts, and in them speech and strength, and they know cunning handiwork by gift of the immortal gods. [ The Iliad, by Homer ] ~gold golem ~flesh golem *golem "The original story harks back, so they say, to the sixteenth century. Using long-lost formulas from the Kabbala, a rabbi is said to have made an artificial man -- the so-called Golem -- to help ring the bells in the Synagogue and for all kinds of other menial work. "But he hadn't made a full man, and it was animated by some sort of vegetable half-life. What life it had, too, so the story runs, was only derived from the magic charm placed behind its teeth each day, that drew down to itself what was known as the `free sidereal strength of the universe.' "One evening, before evening prayers, the rabbi forgot to take the charm out of the Golem's mouth, and it fell into a frenzy. It raged through the dark streets, smashing everything in its path, until the rabbi caught up with it, removed the charm, and destroyed it. Then the Golem collapsed, lifeless. All that was left of it was a small clay image, which you can still see in the Old Synagogue." ... [ The Golem, by Gustav Meyrink ] grave "Who'd care to dig 'em," said the old, old man, "Those six feet marked in chalk? Much I talk, more I walk; Time I were buried," said the old, old man. [ Three Songs to the Same Tune, by W.B. Yeats ] grayswandir Why had I been wearing Grayswandir? Would another weapon have affected a Logrus-ghost as strongly? Had it really been my father, then, who had brought me here? And had he felt I might need the extra edge his weapon could provide? I wanted to think so, to believe that he had been more than a Pattern-ghost. [ Knight of Shadows, by Roger Zelazny ] *grease ANOINT, v.t. To grease a king or other great functionary already sufficiently slippery. [ The Devil's Dictionary, by Ambrose Bierce ] *green glass silver ring Nymph, nymph, what are your beads? Green glass, goblin. Why do you stare at them? Give them me. No. Give them me. Give them me. No. Then I will howl all night in the reeds, Lie in the mud and howl for them. Goblin, why do you love them so? They are better than stars or water, Better than voices of winds that sing. Better than any man's fair daughter, Your green glass beads on a silver ring. Hush, I stole them out of the moon. Give me your beads, I desire them. No. I will howl in a deep lagoon For your green glass beads, I love them so. Give them me. Give them. No. [ Overheard On A Saltmarsh, by Harold Monro ] gremlin The gremlin is a highly intelligent and completely evil creature. It lives to torment other creatures and will go to great lengths to inflict pain or cause injury. Suddenly, Wilson thought about war, about the newspaper stories which recounted the alleged existence of creatures in the sky who plagued the Allied pilots in their duties. They called them gremlins, he remembered. Were there, actually, such beings? Did they, truly, exist up here, never falling, riding on the wind, apparently of bulk and weight, yet impervious to gravity? He was thinking that when the man appeared again. [ Nightmare at 20,000 Feet, by Richard Matheson ] grid bug These electronically based creatures are not native to this universe. They appear to come from a world whose laws of motion are radically different from ours. Tron looked to his mate and pilot. "I'm going to check on the beam connection, Yori. You two can keep a watch out for grid bugs." Tron paced forward along the slender catwalk that still seemed awfully insubstantial to Flynn, though he knew it to be amazingly sturdy. He gazed after Tron, asking himself what in the world a grid bug was, and hoping that the beam connection -- to which he'd given no thought whatsoever until this moment -- was healthy and sound." [ Tron, novel by Brian Daley, story by Steven Lisberger ] lightning bug arc bug spark bug "What was that?" cried Buck, rubbing his numb and tingling arm. "Nature's revenge for bug zappers," replied his companion. gug These foul creatures dwell in the endless darkness of the Gulf of N'Kai, scavenging the bones of whatever luckless intruders have stumbled into it. It is suspected that they may be some warped form of ghoul, but few have survived seeing them so information is scarce. guisarme Medieval peasants discovered that their pruning hooks made reasonably effective pole arms. The result: the guisarme. It is furnished with a sharp cutting edge along its convex side, with a reverse spike to hook. The spike can be used to penetrate armor when the weapon is swung, and the curved hook provides an ample means of pulling horsemen to the ground. gunyoki The samurai's last meal before battle. It was usually made up of cooked chestnuts, dried seaweed, and sake. hachi Hachi was a dog that went with his master, a professor, to the Shibuya train station every morning. In the afternoon, when his master was to return from work Hachi would be there waiting. One day his master died at the office, and did not return. For over ten years Hachi returned to the station every afternoon to wait for his master. When Hachi died a statue was erected on the station platform in his honor. It is said to bring you luck if you touch his statue. *harp A triangular stringed instrument, often Magic. Even when not Magic, a Harp is surprisingly portable and tough and can be carried everywhere on the back of the Bard or Harper in all weathers. A Harp seldom goes out of tune and never warps. Its strings break only in very rare instances, usually because the Harper is sulking or crossed in love. This is just as well as no one seems to make or sell spare strings. [ The Tough Guide to Fantasyland, by Diana Wynne Jones ] After breakfast was over, the ogre called out: "Wife, wife, bring me my golden harp." So she brought it and put it on the table before him. Then he said: "Sing!" and the golden harp sang most beautifully. And it went on singing till the ogre fell asleep, and commenced to snore like thunder. Then Jack lifted up the copper-lid very quietly and got down like a mouse and crept on hands and knees till he came to the table, when up he crawled, caught hold of the golden harp and dashed with it towards the door. But the harp called out quite loud: "Master! Master!" and the ogre woke up just in time to see Jack running off with his harp. [ Jack and the Beanstalk, from English Fairy Tales, by Joseph Jacobs ] halberd This form of a pole axe is seen as a convex-headed broad axe in early examples, but the head is set at a convenient angle, considering the point where the blade is most likely to impact upon an enemy. This alone makes it quite distinct from an ordinary long-hafted axe. The whole weapon reaches 8 feet in length, and is nearly always topped with a long spear point and backed by a spike, which was often angled or hooked slightly downward. The spear point is, of course, designed to keep opponents at bay and deliver a thrusting attack (this proves quite useless when opposing mounted knights armed with lances). The opposing spike was for penetration of heavy plate armor, with a secondary function as a hook for dismounting opponents. healer * healer attendant doctor physician I swear by Apollo the physician, and Aesculapius, and Health, and All-heal, and all the gods and goddesses, that, according to my ability and judgment, I will keep this Oath and this stipulation -- to reckon him who taught me this Art equally dear to me as my parents, to share my substance with him, and relieve his necessities if required; to look upon his offspring in the same footing as my own brothers, and to teach them this art, if they shall wish to learn it, without fee or stipulation; and that by precept, lecture, and every other mode of instruction, I will impart a knowledge of the Art to my own sons, and those of my teachers, and to disciples bound by a stipulation and oath according to the law of medicine, but to none others. I will follow that system of regimen which, according to my ability and judgment, I consider for the benefit of my patients, and abstain from whatever is deleterious and mischievous. [...] [ Hippocrates' Oath, translated by Francis Adams ] PHYSICIAN, n. One upon whom we set our hopes when ill and our dogs when well. [ The Devil's Dictionary, by Ambrose Bierce ] heart of ahriman The other three drew in their breath sharply, and the dark, powerful man who stood at the head of the sarcophagus whispered: "The Heart of Ahriman!" The other lifted a quick hand for silence. Somewhere a dog began howling dolefully, and a stealthy step padded outside the barred and bolted door. ... But none looked aside from the mummy case over which the man in the ermine-trimmed robe was now moving the great flaming jewel, while he muttered an incantation that was old when Atlantis sank. The glare of the gem dazzled their eyes, so that they could not be sure what they saw; but with a splintering crash, the carven lid of the sarcophagus burst outward as if from some irresistible pressure applied from within and the four men, bending eagerly forward, saw the occupant -- a huddled, withered, wizened shape, with dried brown limbs like dead wood showing through moldering bandages. "Bring that thing back?" muttered the small dark man who stood on the right, with a short, sardonic laugh. "It is ready to crumble at a touch. We are fools ---" [ Conan The Conqueror, by Robert E. Howard ] hell hound* Hell hounds are fire-breathing canines from another plane of existence brought here in the service of evil beings. A hell hound resembles a large hound with rust-red or red-brown fur, and red, glowing eyes. The markings, teeth, and tongue are soot black. It stands two to three feet high at the shoulder and has a distinct odour of smoke and sulphur. The baying sounds it makes have an eerie, hollow tone that sends a shiver through any who hear them. hermes Messenger and herald of the Olympians. Being required to do a great deal of travelling and speaking in public, he became the god of eloquence, travellers, merchants, and thieves. He was one of the most energetic of the Greek gods, a Machiavellian character full of trickery and sexual vigour. Like other Greek gods, he is endowed with not-inconsiderable sexual prowess which he directs towards countryside nymphs. He is a god of boundaries, guardian of graves and patron deity of shepherds. He is usually depicted as a handsome young man wearing winged golden sandals and holding a magical herald's staff consisting of intertwined serpents, the kerykeion. He is reputedly the only being able to find his way to the underworld ferry of Charon and back again. He is said to have invented, among other things, the lyre, Pan's Pipes, numbers, the alphabet, weights and measures, and sacrificing. hezrou "Hezrou" is the common name for the type II demon. It is among the weaker of demons, but still quite formidable. hippocrates Greek physician, recognized as the father of medicine. He is believed to have been born on the island of Cos, to have studied under his father, a physician, to have traveled for some time, perhaps studying in Athens, and to have then returned to practice, teach, and write at Cos. The Hippocratic or Coan school that formed around him was of enormous importance in separating medicine from superstition and philosophic speculation, placing it on a strictly scientific plane based on objective observation and critical deductive reasoning. [ The Columbia Encyclopedia, Sixth Edition ] hobbit Hobbits are an unobtrusive but very ancient people, more numerous formerly than they are today; for they love peace and quiet and good tilled earth: a well-ordered and well- farmed countryside was their favourite haunt. They do not and did not understand or like machines more complicated than a forge-bellows, a water-mill, or a handloom, although they were skillful with tools. Even in ancient days they were, as a rule, shy of "the Big Folk", as they call us, and now they avoid us with dismay and are becoming hard to find. [ The Fellowship of the Ring, by J.R.R. Tolkien ] hobgoblin Hobgoblin. Used by the Puritans and in later times for wicked goblin spirits, as in Bunyan's "Hobgoblin nor foul friend", but its more correct use is for the friendly spirits of the brownie type. In "A midsummer night's dream" a fairy says to Shakespeare's Puck: Those that Hobgoblin call you, and sweet Puck, You do their work, and they shall have good luck: Are you not he? and obviously Puck would not wish to be called a hobgoblin if that was an ill-omened word. Hobgoblins are on the whole, good-humoured and ready to be helpful, but fond of practical joking, and like most of the fairies rather nasty people to annoy. Boggarts hover on the verge of hobgoblindom. Bogles are just over the edge. One Hob mentioned by Henderson, was Hob Headless who haunted the road between Hurworth and Neasham, but could not cross the little river Kent, which flowed into the Tess. He was exorcised and laid under a large stone by the roadside for ninety-nine years and a day. If anyone was so unwary as to sit on that stone, he would be unable to quit it for ever. The ninety-nine years is nearly up, so trouble may soon be heard of on the road between Hurworth and Neasham. [ A Dictionary of Fairies, by Katharine Briggs ] holy water "We want a word with you," said Ligur (in a tone of voice intended to imply that "word" was synonymous with "horrifically painful eternity"), and the squat demon pushed open the office door. The bucket teetered, then fell neatly on Ligur's head. Drop a lump of sodium in water. Watch it flame and burn and spin around crazily, flaring and sputtering. This was like that, just nastier. The demon peeled and flared and flickered. Oily brown smoke oozed from it, and it screamed and it screamed and it screamed. Then it crumpled, folded in on itself, and what was left lay glistening on the burnt and blackened circle of carpet, looking like a handful of mashed slugs. "Hi," said Crowley to Hastur, who had been walking behind Ligur, and had unfortunately not been so much as splashed. There are some things that are unthinkable; there are some depths that not even demons would believe other demons would stoop to. ". . . Holy water. You bastard," said Hastur. "You complete _bastard_. He hadn't never done nothing to _you_." "Yet," corrected Crowley. [ Good Omens, by Neil Gaiman and Terry Pratchett ] hom*nculus A homunculus is a creature summoned by a mage to perform some particular task. They are particularly good at spying. They are smallish creatures, but very agile. They can put their victims to sleep with a venomous bite, but due to their size, the effect does not last long on humans. "Tothapis cut him off. 'Be still and hearken. You will travel aboard the sacred wingboat. Of it you may not have heard; but it will bear you thither in a night and a day and a night. With you will go a homunculus that can relay your words to me, and mine to you, across the leagues between at the speed of thought.'" [ Conan the Rebel, by Poul Anderson ] # also gets 'pruning hook' aka guisarme *hook But as for Queequeg -- why, Queequeg sat there among them -- at the head of the table, too, it so chanced; as cool as an icicle. To be sure I cannot say much for his breeding. His greatest admirer could not have cordially justified his bringing his harpoon into breakfast with him, and using it there without ceremony; reaching over the table with it, to the imminent jeopardy of many heads, and grappling the beefsteaks towards him. [ Moby Dick, by Herman Melville ] ~unicorn horn *horn Roland hath set the Olifant to his mouth, He grasps it well, and with great virtue sounds. High are those peaks, afar it rings and loud, Thirty great leagues they hear its echoes mount. So Charles heard, and all his comrades round; Then said that King: "Battle they do, our counts!" And Guenelun answered, contrarious: "That were a lie, in any other mouth." [ The Song of Roland ] horned devil Horned devils lack any real special abilities, though they are quite difficult to kill. ~horsem* *horse King Richard III: A horse! a horse! my kingdom for a horse! Catesby: Withdraw, my lord; I'll help you to a horse. King Richard III: Slave, I have set my life upon a cast, And I will stand the hazard of the die: I think there be six Richmonds in the field; Five have I slain to-day instead of him. A horse! a horse! my kingdom for a horse! [ King Richard III, by William Shakespeare ] *horsem* rider* death famine pestilence war hunger [Pestilence:] And I saw when the Lamb opened one of the seals, and I heard, as it were the noise of thunder, one of the four beasts saying, Come and see. And I saw, and behold a white horse: and he that sat on him had a bow; and a crown was given unto him: and he went forth conquering, and to conquer. [War:] And when he had opened the second seal, I heard the second beast say, Come and see. And there went out another horse that was red: and power was given to him that sat thereon to take peace from the earth, and that they should kill one another: and there was given unto him a great sword. [Famine:] And when he had opened the third seal, I heard the third beast say, Come and see. And I beheld, and lo a black horse; and he that sat on him had a pair of balances in his hand. And I heard a voice in the midst of the four beasts say, A measure of wheat for a penny, and three measures of barley for a penny; and see thou hurt not the oil and the wine. [Death:] And when he had opened the fourth seal, I heard the voice of the fourth beast say, Come and see. And I looked, and behold a pale horse: and his name that sat on him was Death, and Hell followed with him. And power was given unto them over the fourth part of the earth, to kill with sword, and with hunger, and with death, and with the beasts of the earth. [ Revelations of John, 6:1-8 ] huan*ti The first of five mythical Chinese emperors, Huan Ti is known as the yellow emperor. He rules the _moving_ heavens, as opposed to the _dark_ heavens. He is an inventor, said to have given mankind among other things, the wheel, armour, and the compass. He is the god of fortune telling and war. hu*h*eto*l minion of huhetotl Huehuetotl, or Huhetotl, which means Old God, was the Aztec (classical Mesoamerican) god of fire. He is generally associated with paternalism and one of the group classed as the Xiuhtecuhtli complex. He is known to send his minions to wreak havoc upon ordinary humans. [ after the Encyclopedia of Gods, by Michael Jordan ] humanoid Humanoids are all approximately the size of a human, and may be mistaken for one at a distance. They are usually of a tribal nature, and will fiercely defend their lairs. Usually hostile, they may even band together to raid and pillage human settlements. human chieftain guard ninja nurse page ronin shopkeeper student thug warrior *watch* player These strange creatures live mostly on the surface of the earth, gathering together in societies of various forms, but occasionally a stray will descend into the depths and commit mayhem among the dungeon residents who, naturally, often 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, and who can cause the traveller to feel the latter with just a touch of their tail. ice mag* Found mainly near the frozen wastes of the north, the Ice Mages are a mysterious group of individuals who are rumored to be descendants of a once great northern civilization that fell into chaos over a thousand years ago. They wield the power of elemental cold, a conglomeration of elemental air and water. They are particularly effective fighting fire-based creatures. Although they command of two of the four elements, Ice Mages have difficulty affecting undead, who are immune to cold. [ by Drew Curtis ] imp ... imps ... little creatures of two feet high that could gambol and jump prodigiously; ... [ The Charwoman's Shadow, by Lord Dunsany ] An 'imp' is an off-shoot or cutting. Thus an 'ymp tree' was a grafted tree, or one grown from a cutting, not from seed. 'Imp' properly means a small devil, an off-shoot of Satan, but the distinction between goblins or bogles and imps from hell is hard to make, and many in the Celtic countries as well as the English Puritans regarded all fairies as devils. The fairies of tradition often hover uneasily between the ghostly and the diabolic state. [ A Dictionary of Fairies, by Katharine Briggs ] incubus succubus The incubus and succubus are male and female versions of the same demon, one who lies with a human for its own purposes, usually to the detriment of the mortals who are unwise in their dealings with them. *iron ball *iron chain "You are fettered, " said Scrooge, trembling. "Tell me why?" "I wear the chain I forged in life," replied the Ghost. "I made it link by link, and yard by yard; I girded it on of my own free will, and of my own free will I wore it. Is its pattern strange to you?" Scrooge trembled more and more. "Or would you know," pursued the Ghost, "the weight and length of the strong coil you bear yourself? It was full as heavy and as long as this, seven Christmas Eves ago. You have laboured on it, since. It is a ponderous chain!" [ A Christmas Carol, by Charles Dickens ] ishtar Ishtar (the star of heaven) is the Mesopotamian goddess of fertility and war. She is usually depicted with wings and weapon cases at her shoulders, carrying a ceremonial double- headed mace-scimitar embellished with lion heads, frequently being accompanied by a lion. She is symbolized by an eight- pointed star. [ Encyclopedia of Gods, by Michael Jordan ] issek Now Issek of the Jug, whom Fafhrd chose to serve, was once of the most lowly and unsuccessful of the gods, godlets rather, in Lankhmar. He had dwelt there for about thirteen years, during which time he had traveled only two squares up the Street of the Gods and was now back again, ready for oblivion. He is not to be confused with Issek the Armless, Issek of the Burnt Legs, Flayed Issek, or any other of the numerous and colorfully mutilated divinities of that name. Indeed, his unpopularity may have been due in part to the fact that the manner of his death -- racking -- was not deemed particularly spectacular. ... However, after Fafhrd became his acolyte, things somehow began to change. [ Swords In The Mist, by Fritz Leiber ] izchak The shopkeeper of the lighting shop in the town level of the gnomish mines is a tribute to Izchak Miller, a founding member of the NetHack development team and a personal friend of a large number of us. Izchak contributed greatly to the game, coding a large amount of the shopkeep logic (hence the nature of the tribute) as well as a good part of the alignment system, the prayer code and the rewrite of "hell" in the 3.1 release. Izchak was a professor of Philosophy, who taught at many respected institutions, including MIT and Stanford, and who also worked, for a period of time, at Xerox PARC. Izchak was the first "librarian" of the NetHack project, and was a founding member of the DevTeam, joining in 1986 while he was working at the University of Pennsylvania (hence our former mailing list address). Until the 3.1.3 release, Izchak carefully kept all of the code synchronized and arbitrated disputes between members of the development teams. Izchak Miller passed away at the age of 58, in the early morning hours of April 1, 1994 from complications due to cancer. We then dedicated NetHack 3.2 in his memory. [ Mike Stephenson, for the NetHack DevTeam ] jabberwock vorpal* "Beware the Jabberwock, my son! The jaws that bite, the claws that catch! Beware the Jubjub bird, and shun The frumious Bandersnatch!" He took his vorpal sword in hand; Long time the manxome foe he sought -- So rested he by the Tumtum tree, And stood awhile in thought. And, as in uffish thought he stood, The Jabberwock, with eyes of flame, Came whiffling through the tulgey wood, And burbled as it came! One, two! One, two! And through and through The vorpal blade went snicker-snack! He left it dead, and with its head He went galumphing back. [ Jabberwocky, by Lewis Carroll ] jackal In Asiatic folktale, jackal provides for the lion; he scares up game, which the lion kills and eats, and receives what is left as reward. In stories from northern India he is sometimes termed "minister to the king," i.e. to the lion. From the legend that he does not kill his own food has arisen the legend of his cowardice. Jackal's heart must never be eaten, for instance, in the belief of peoples indigenous to the regions where the jackal abounds. ... In Hausa Negro folktale Jackal plays the role of sagacious judge and is called "O Learned One of the Forest." The Bushmen say that Jackal goes around behaving the way he does "because he is Jackal". [ Funk & Wagnalls Standard Dictionary of Folklore ] jade* Nothing grew among the ruins of the city. The streets were broken and the walls of the houses had fallen, but there were no weeds flowering in the cracks and it seemed that the city had but recently been brought down by an earthquake. Only one thing still stood intact, towering over the ruins. It was a gigantic statue of white, gray and green jade - the statue of a naked youth with a face of almost feminine beauty that turned sightless eyes toward the north. "The eyes!" Duke Avan Astran said. "They're gone!" [ The Jade Man's Eyes, by Michael Moorcock ] jaguar Large, flesh-eating animal of the cat family, of Central and South America. This feline predator (_Panthera onca_) is sometimes incorrectly called a panther. [ Van Dale's Groot Woordenboek der Nederlandse Taal ] jellyfish I do not care to share the seas With jellyfishes such as these; Particularly Portuguese. [ Lines on Meeting a Portuguese Man-o'-war while Bathing, by Michael Flanders ] juiblex jubilex Little is known about the Faceless Lord, even the correct spelling of his name. He does not have a physical form as we know it, and those who have peered into his realm claim he is a slime-like creature who swallows other creatures alive, spits acidic secretions, and causes disease in his victims which can be almost instantly fatal. kabuto The kabuto is the helmet worn by the samurai. It was characterized by a prominent beaked front which jutted out over the brow to protect the wearer's face; a feature that gives rise to their modern Japanese name of 'shokaku tsuki kabuto' (battering-ram helmet). Their main constructional element was an oval plate, the shokaku bo, slightly domed for the head with a narrow prolongation in front that curved forwards and downwards where it developed a pronounced central fold. Two horizontal strips encircling the head were riveted to this frontal strip: the lower one, the koshimaki (hip wrap), formed the lower edge of the helmet bowl; the other, the do maki (body wrap), was set at about the level of the temples. Filling the gaps between these strips and the shokaku bo were small plates, sometimes triangular but more commonly rectangular in shape. Because the front projected so far from the head, the triangular gap beneath was filled by a small plate, the shoshaku tei ita, whose rear edge bent downwards into a flange that rested against the forehead. [ Arms & Armour of the Samurai, by Bottomley & Hopson ] kamadan The kamadan is a greatly feared hunter that resembles a large leopard with six snakes sprouting from its shoulders. Sages believe it is a distant relative of the displacer beast, though how it came to be is still a matter for speculation. [ Creature Catalog by Scott Greene ] katana The katana is a long, single-edged samurai sword with a slightly curved blade. Its long handle is designed to allow it to be wielded with either one or two hands. ki-rin The ki-rin is a strange-looking flying creature. It has scales, a mane like a lion, a tail, hooves, and a horn. It is brightly colored, and can usually be found flying in the sky looking for good deeds to reward. king arthur *arthur Ector took both his sons to the church before which the anvil had been placed. There, standing before the anvil, he commanded Kay: "Put the sword back into the steel if you really think the throne is yours!" But the sword glanced off the steel. "Now it is your turn", Ector said facing Arthur. The young man lifted the sword and thrust with both arms; the blade whizzed through the air with a flash and drilled the metal as if it were mere butter. Ector and Kay dropped to their knees before Arthur. "Why, father and brother, do you bow before me?", Arthur asked with wonder in his voice. "Because now I know for sure that you are the king, not only by birth but also by law", Ector said. "You are no son of mine nor are you Kay's brother. Immediately after your birth, Merlin the Wise brought you to me to be raised safely. And though it was me that named you Arthur when you were baptized, you are really the son of brave king Uther Pendragon and queen Igraine..." And after these words, the lord rose and went to see the arch- bishop to impart to him what had passed. [ Van Gouden Tijden Zingen de Harpen, by Vladimir Hulpach, Emanuel Frynta, and Vackav Cibula ] knife stiletto Possibly perceiving an expression of dubiosity on their faces, the globetrotter went on adhering to his adventures. -- And I seen a man killed in Trieste by an Italian chap. Knife in his back. Knife like that. Whilst speaking he produced a dangerous looking clasp knife, quite in keeping with his character, and held it in the striking position. -- In a knockingshop it was count of a tryon between two smugglers. Fellow hid behind a door, come up behind him. Like that. Prepare to meet your God, says he. Chuck! It went into his back up to the butt. [ Ulysses, by James Joyce ] knight * knight Here lies the noble fearless knight, Whose valour rose to such a height; When Death at last had struck him down, His was the victory and renown. He reck'd the world of little prize, And was a bugbear in men's eyes; But had the fortune in his age To live a fool and die a sage. [ Don Quixote of La Mancha by Miquel de Cervantes Saavedra ] ~kobold ??m* *kobold* The race of kobolds are reputed to be an artificial creation of a master wizard (demi-god?). They are about 3' tall with a vaguely dog-like face. They bear a violent dislike of the Elven race, and will go out of their way to cause trouble for Elves at any time. *kop* The Kops are a brilliant concept. To take a gaggle of inept policemen and display them over and over again in a series of riotously funny physical punishments plays equally well to the peanut gallery and the expensive box seats. People hate cops. Even people who have never had anything to do with cops hate them. Of course, we count on them to keep order and to protect us when we need protecting, and we love them on television shows in which they have nerves of steel and hearts of gold, but in the abstract, as a nation, collectively we hate them. They are too much like high school principals. We're very happy to see their pants fall down, and they look good to us with pie on their faces. The Keystone Kops turn up--and they get punished for it, as they crash into each other, fall down, and suffer indignity after indignity. Here is pure movie satisfaction. The Kops are very skillfully presented. The comic originality and timing in one of their chase scenes requires imagination to think up, talent to execute, understanding of the medium, and, of course, raw courage to perform. The Kops are madmen presented as incompetents, and they're madmen rushing around in modern machines. What's more, the machines they were operating in their routines were newly invented and not yet experienced by the average moviegoer. (In the early days of automobiles, it was reported that there were only two cars registered in all of Kansas City, and they ran into each other. There is both poetry and philosophy in this fact, but most of all, there is humor. Sennett got the humor.) [ Silent Stars, by Jeanine Basinger ] kos "I am not a coward!" he cried. "I'll dare Thieves' House and fetch you Krovas' head and toss it with blood a-drip at Vlana's feet. I swear that, witness me, Kos the god of dooms, by the brown bones of Nalgron my father and by his sword Graywand here at my side!" [ Swords and Deviltry, by Fritz Leiber ] koto A Japanese harp. kraken Out from the water a long sinuous tentacle had crawled; it was pale-green and luminous and wet. Its fingered end had hold of Frodo's foot, and was dragging him into the water. Sam on his knees was now slashing at it with a knife. The arm let go of Frodo, and Sam pulled him away, crying out for help. Twenty other arms came rippling out. The dark water boiled, and there was a hideous stench. [ The Fellowship of the Ring, by J.R.R. Tolkien ] *lady offler Blind Io took up the dice-box, which was a skull whose various orifices had been stoppered with rubies, and with several of his eyes on the Lady he rolled three fives. She smiled. This was the nature of the Lady's eyes: they were bright green, lacking iris or pupil, and they glowed from within. The room was silent as she scrabbled in her box of pieces and, from the very bottom, produced a couple that she set down on the board with two decisive clicks. The rest of the players, as one God, craned forward to peer at them. "A wenegade wiffard and fome fort of clerk," said Offler the Crocodile God, hindered as usual by his tusks. "Well, weally!" With one claw he pushed a pile of bone-white tokens into the centre of the table. The Lady nodded slightly. She picked up the dice-cup and held it as steady as a rock, yet all the Gods could hear the three cubes rattling about inside. And then she sent them bouncing across the table. A six. A three. A five. Something was happening to the five, however. Battered by the chance collision of several billion molecules, the die flipped onto a point, spun gently and came down a seven. Blind Io picked up the cube and counted the sides. "Come _on_," he said wearily, "Play fair." [ The Colour of Magic, by Terry Pratchett ] *lamp When he came to himself he told his mother what had passed, and showed her the lamp and the fruits he had gathered in the garden, which were in reality precious stones. He then asked for some food. "Alas! child," she said, "I have nothing in the house, but I have spun a little cotton and will go and sell it." Aladdin bade her keep her cotton, for he would sell the lamp instead. As it was very dirty she began to rub it, that it might fetch a higher price. Instantly a hideous genie appeared, and asked what she would have. She fainted away, but Aladdin, snatching the lamp, said boldly: "Fetch me something to eat!" [ Aladdin, from The Arabian Nights, by Andrew Lang ] lance With this the wind increased, and the mill sails began to turn about; which Don Quixote espying, said, 'Although thou movest more arms than the giant Briareus thou shalt stoop to me.' And, after saying this, and commending himself most devoutly to his Lady Dulcinea, desiring her to succor him in that trance, covering himself well with his buckler, and setting his lance on his rest, he spurred on Rozinante, and encountered with the first mill that was before him, and, striking his lance into the sail, the wind swung it about with such fury, that it broke his lance into shivers, carrying him and his horse after it, and finally tumbled him a good way off from it on the field in evil plight. [ Don Quixote of La Mancha by Miquel de Cervantes Saavedra ] leash They had splendid heads, fine shoulders, strong legs, and straight tails. The spots on their bodies were jet-black and mostly the size of a two-shilling piece; they had smaller spots on their heads, legs, and tails. Their noses and eye- rims were black. Missis had a most winning expression. Pongo, though a dog born to command, had a twinkle in his eye. They walked side by side with great dignity, only putting the Dearlys on the leash to lead them over crossings. [ The Hundred and One Dalmatians, by Dodie Smith ] lembas* In the morning, as they were beginning to pack their slender goods, Elves that could speak their tongue came to them and brought them many gifts of food and clothing for their journey. The food was mostly in the form of very thin cakes, made of a meal that was baked a light brown on the outside, and inside was the colour of cream. Gimli took up one of the cakes and looked at it with a doubtful eye. 'Cram,' he said under his breath, as he broke off a crisp corner and nibbled at it. His expression quickly changed, and he ate all the rest of the cake with relish. 'No more, no more!' cried the Elves laughing. 'You have eaten enough already for a long day's march.' 'I thought it was only a kind of cram, such as the Dalemen make for journeys in the wild,' said the Dwarf. 'So it is,' they answered. 'But we call it lembas or waybread, and it is more strengthening than any foods made by Men, and it is more pleasant than cram, by all accounts.' [ The Fellowship of the Ring, by J.R.R. Tolkien ] lemba* In the morning, as they were beginning to pack their slender goods, Elves that could speak their tongue came to them and brought them many gifts of food and clothing for their journey. The food was mostly in the form of very thin cakes, made of a meal that was baked a light brown on the outside, and inside was the colour of cream. Gimli took up one of the cakes and looked at it with a doubtful eye. 'Cram,' he said under his breath, as he broke off a crisp corner and nibbled at it. His expression quickly changed, and he ate all the rest of the cake with relish. 'No more, no more!' cried the Elves laughing. 'You have eaten enough already for a long day's march.' 'I thought it was only a kind of cram, such as the Dalemen make for journeys in the wild,' said the Dwarf. 'So it is,' they answered. 'But we call it lembas or waybread, and it is more strengthening than any foods made by Men, and it is more pleasant than cram, by all accounts.' [ The Fellowship of the Ring, by J.R.R. Tolkien ] lemure The lowliest of the inhabitants of hell. leocrotta leu*otta ... the leucrocotta, a wild beast of extraordinary swiftness, the size of the wild ass, with the legs of a Stag, the neck, tail, and breast of a lion, the head of a badger, a cloven hoof, the mouth slit up as far as the ears, and one continuous bone instead of teeth; it is said, too, that this animal can imitate the human voice. [ Curious Creatures in Zoology, by John Ashton ] leprechaun The Irish Leprechaun is the Faeries' shoemaker and is known under various names in different parts of Ireland: Cluricaune in Cork, Lurican in Kerry, Lurikeen in Kildare and Lurigadaun in Tipperary. Although he works for the Faeries, the Leprechaun is not of the same species. He is small, has dark skin and wears strange clothes. His nature has something of the manic-depressive about it: first he is quite happy, whistling merrily as he nails a sole on to a shoe; a few minutes later, he is sullen and morose, drunk on his home-made heather ale. The Leprechaun's two great loves are tobacco and whiskey, and he is a first-rate con-man, impossible to out-fox. No one, no matter how clever, has ever managed to cheat him out of his hidden pot of gold or his magic shilling. At the last minute he always thinks of some way to divert his captor's attention and vanishes in the twinkling of an eye. [ A Field Guide to the Little People by Nancy Arrowsmith & George Moorse ] lethe sparkling water The Lethe is a river, slow, dark and deep, which flows from the mortal world to the forbidden lands of Gehennom. It is said that a single sip of its sparkling waters is enough to wash a man's memories away, never to return. *lich But on its heels ere the sunset faded, there came a second apparition, striding with incredible strides and halting when it loomed almost upon me in the red twilight-the monstrous mummy of some ancient king still crowned with untarnished gold but turning to my gaze a visage that more than time or the worm had wasted. Broken swathings flapped about the skeleton legs, and above the crown that was set with sapphires and orange rubies, a black something swayed and nodded horribly; but, for an instant, I did not dream what it was. Then, in its middle, two oblique and scarlet eyes opened and glowed like hellish coals, and two ophidian fangs glittered in an ape-like mouth. A squat, furless, shapeless head on a neck of disproportionate extent leaned unspeakably down and whispered in the mummy's ear. Then, with one stride, the titanic lich took half the distance between us, and from out the folds of the tattered sere-cloth a gaunt arm arose, and fleshless, taloned fingers laden with glowering gems, reached out and fumbled for my throat . . . [ The Abominations of Yondo, Clark Ashton Smith, 1926 ] lichen The chamber was of unhewn rock, round, as near as might be, eighteen or twenty feet across, and gay with rich variety of fern and moss and lichen. The fern was in its winter still, or coiling for the spring-tide; but moss was in abundant life, some feathering, and some gobleted, and some with fringe of red to it. [ Lorna Doone, by R.D. Blackmore ] ~* of light * light Strange creatures formed from energy rather than matter, lights are given to self-destructive behavior when battling foes. gecko iguana lizard Lizards, snakes and the burrowing amphisbaenids make up the order Squamata, meaning the scaly ones. The elongate, slim, long-tailed bodies of lizards have become modified to enable them to live in a wide range of habitats. Lizards can be expert burrowers, runners, swimmers and climbers, and a few can manage crude, short-distance gliding on rib-supported "wings". Most are carnivores, feeding on invertebrate and small vertebrate prey, but others feed on vegetation. [ Macmillan Illustrated Animal Encyclopedia ] loki Loki, or Lopt, is described in Snorri's _Edda_ as being "pleasing and handsome in appearance, evil in character, and very capricious in behaviour". He is the son of the giant Farbauti and of Laufey. Loki is the Norse god of cunning, evil, thieves, and fire. He hated the other gods and wanted to ruin them and overthrow the universe. He committed many murders. As a thief, he stole Freyja's necklace, Thor's belt and gauntlets of power, and the apples of youth. Able to shapechange at will, he is said to have impersonated at various times a mare, flea, fly, falcon, seal, and an old crone. As a mare he gave birth to Odin's horse Sleipnir. He also allegedly sired the serpent Midgard, the mistress of the netherworld, Hel, and the wolf Fenrir, who will devour the sun at Ragnarok. *longbow of diana This legendary bow grants ESP when carried and can reflect magical attacks when wielded. When invoked it provides a supply of arrows. # long worm -- see "worm" looking glass mirror But as Snow White grew, she became more and more beautiful, and by the time she was seven years old she was as beautiful as the day and more beautiful than the queen herself. One day when the queen said to her mirror: "Mirror, Mirror, here I stand. Who is the fairest in the land?" - the mirror replied: "You, O Queen, are the fairest here, But Snow White is a thousand times more fair." [ Snow White, by Jakob and Wilhelm Grimm ] lord carnarvon Lord Carnarvon was a personality who could have been produced nowhere but in England, a mixture of sportsman and collector, gentleman and world traveler, a realist in action and a romantic in feeling. ... In 1903 he went for the first time to Egypt in search of a mild climate and while there visited the excavation sites of several archaeological expeditions. ... In 1906 he began his own excavations. [ Gods, Graves, and Scholars, by C. W. Ceram ] lord sato Lord Sato was the family head of the Taro Clan, and a mighty daimyo. He is a loyal servant of the Emperor, and will do everything in his power to further the imperial cause. lord surt* Yet first was the world in the southern region, which was named Muspell; it is light and hot; that region is glowing and burning, and impassable to such as are outlanders and have not their holdings there. He who sits there at the land's-end, to defend the land, is called Surtr; he brandishes a flaming sword, and at the end of the world he shall go forth and harry, and overcome all the gods, and burn all the world with fire. [ The Prose Edda, by Snorri Sturluson ] lug lugh Lugh, or Lug, was the sun god of the Irish Celts. One of his weapons was a rod-sling which worshippers sometimes saw in the sky as a rainbow. As a tribal god, he was particularly skilled in the use of his massive, invincible spear, which fought on its own accord. One of his epithets is _lamfhada_ (of the long arm). He was a young and apparently more attractive deity than Dagda, the father of the gods. Being able to shapeshift, his name translates as lynx. lurker* These dungeon scavengers are very adept at blending into the surrounding walls and ceilings of the dungeon due to the stone-like coloring of their skin. lycanthrope were* human were* *were In 1573, the Parliament of Dole published a decree, permitting the inhabitants of the Franche-Comte to pursue and kill a were-wolf or loup-garou, which infested that province, "notwithstanding the existing laws concerning the chase." The people were empowered to "assemble with javelins, halberds, pikes, arquebuses and clubs, to hunt and pursue the said were-wolf in all places where they could find it, and to take, burn, and kill it, without incurring any fine or other penalty." The hunt seems to have been successful, if we may judge from the fact that the same tribunal in the following year condemned to be burned a man named Giles Garnier, who ran on all fours in the forest and fields and devoured little children, "even on Friday." The poor lycanthrope, it appears, had as slight respect for ecclesiastical feasts as the French pig, which was not restrained by any feeling of piety from eating infants on a fast day. [ The History of Vampires, by Dudley Wright ] lynx To dream of seeing a lynx, enemies are undermining your business and disrupting your home affairs. For a woman, this dream indicates that she has a wary woman rivaling her in the affections of her lover. If she kills the lynx, she will overcome her rival. [ 10,000 Dreams Interpreted, by Gustavus Hindman Miller ] magic marker The pen is mightier than the sword. [ Richelieu, by Edward Bulwer-Lytton ] magic mirror of merlin This powerful mirror was created by Merlin, the druid, in ages past, when trees sang and rocks danced. It protects all who carry it from magic missiles, and gives them ESP. mail d*emon It is rumoured that these strange creatures can be harmed by domesticated canines only. ma*annan* Normally called Manannan, Ler's son was the patron of merchants and sailors. Manannan had a sword which never failed to slay, a boat which propelled itself wherever its owner wished, a horse which was swifter than the wind, and magic armour which no sword could pierce. He later became god of the sea, beneath which he lived in Tir na nOc, the underworld. manes The gnats of the dungeon, these swarming monsters are rarely seen alone. mangler The Mangler (1995) Starring: Robert Englund, Ted Levine Director: Tobe Hooper Synopsis: An industrial laundry machine develops a taste for blood in this Stephen King adaptation. Strictly for genre fans who overlook ludicrous plot, acting, and prefer bloody gore to genuine scares. Runtime: 106 minutes [ www.reel.com ] marduk First insisting on recognition as supreme commander, Marduk defeated the Dragon, cut her body in two, and from it created heaven and earth, peopling the world with human beings who not unnaturally showed intense gratitude for their lives. The gods were also properly grateful, invested him with many titles, and eventually permitted themselves to be embodied in him, so that he became supreme god, plotting the whole course of known life from the paths of the planets to the daily events in the lives of men. [ The Immortals, by Derek and Julia Parker ] marilith The marilith has a torso shaped like that of a human female, and the lower body of a great snake. It has multiple arms, and can freely attack with all of them. Since it is intelligent enough to use weapons, this means it can cause great damage. mars The god of war, and one of the most prominent and worshipped gods. In early Roman history he was a god of spring, growth in nature, and fertility, and the protector of cattle. Mars is also mentioned as a chthonic god (earth-god) and this could explain why he became a god of death and finally a god of war. He is the son of Jupiter and Juno. [ Encyclopedia Mythica, ed. M.F. Lindemans ] master assassin He strolled down the stairs, followed by a number of assassins. When he was directly in front of Ymor he said: "I've come for the tourist." ... "One step more and you'll leave here with fewer eyeballs than you came with," said the thiefmaster. "So sit down and have a drink, Zlorf, and let's talk about this sensibly. _I_ thought we had an agreement. You don't rob -- I don't kill. Not for payment, that is," he added after a pause. Zlorf took the proffered beer. "So?" he said. "I'll kill him. Then you rob him. Is he that funny looking one over there?" "Yes." Zlorf stared at Twoflower, who grinned at him. He shrugged. He seldom wasted time wondering why people wanted other people dead. It was just a living. "Who is your client, may I ask?" said Ymor. Zlorf held up a hand. "Please!" he protested. "Professional etiquette." [ The Colour of Magic, by Terry Pratchett ] master key of thievery This skeleton key was fashioned in ages past and imbued with a powerful magic which allows it to open any lock. When carried, it grants its owner warning, teleport control, and reduces all physical damage by half. Finally, when invoked, it has the ability to disarm any trap. master of thieves There was a flutter of wings at the window. Ymor shifted his bulk out of the chair and crossed the room, coming back with a large raven. After he'd unfastened the message capsule from its leg it flew up to join its fellows lurking among the rafters. Withel regarded it without love. Ymor's ravens were notoriously loyal to their master, to the extent that Withel's one attempt to promote himself to the rank of greatest thief in Ankh-Morpork had cost their master's right hand man his left eye. But not his life, however. Ymor never grudged a man his ambitions. [ The Colour of Magic, by Terry Pratchett ] mastodon Any large, elephantlike mammal of the genera Mammut, Mastodon, etc., from the Oligocene and Pleistocene epochs, having conical projections on the molar teeth. [ Webster's Encyclopedic Unabridged Dictionary of the English Language ] Yakwawi, the Mastodon, was placed on the world to be useful to man; but the great monstrous beast was fierce, powerful and invincible. Its hide was so strong and so thick that the sharpest spears and arrows could hardly penetrate it. This terrible creature made war against all the other animals that lived in the woods and on the plains; other animals that the Creator put here to be used as meat for the Lenapé people.) [ From Legends of the Lenape Native Americans ] meat* huge chunk of meat Some hae meat and canna eat, And some would eat that want it; But we hae meat, and we can eat, Sae let the Lord be thankit. [ Grace Before Meat, by Robert Burns ] medusa Medusa, one of the three Gorgons or Graeae, is the only one of her sisters to have assumed mortal form and inhabited the dungeon world. When Perseus was grown up Polydectes sent him to attempt the conquest of Medusa, a terrible monster who had laid waste the country. She was once a beautiful maiden whose hair was her chief glory, but as she dared to vie in beauty with Minerva, the goddess deprived her of her charms and changed her beautiful ringlets into hissing serpents. She became a cruel monster of so frightful an aspect that no living thing could behold her without being turned into stone. All around the cavern where she dwelt might be seen the stony figures of men and animals which had chanced to catch a glimpse of her and had been petrified with the sight. Perseus, favoured by Minerva and Mercury, the former of whom lent him her shield and the latter his winged shoes, approached Medusa while she slept and taking care not to look directly at her, but guided by her image reflected in the bright shield which he bore, he cut off her head and gave it to Minerva, who fixed it in the middle of her Aegis. [ Bulfinch's Mythology, by Thomas Bulfinch ] melon "What is it, Umbopa, son of a fool?" I shouted in Zulu. "It is food and water, Macumazahn," and again he waved the green thing. Then I saw what he had got. It was a melon. We had hit upon a patch of wild melons, thousands of them, and dead ripe. "Melons!" I yelled to Good, who was next me; and in another second he had his false teeth fixed in one. I think we ate about six each before we had done, and, poor fruit as they were, I doubt if I ever thought anything nicer. [ King Solomon's Mines, by H. Rider Haggard ] mercury Roman god of commerce, trade and travellers. He is commonly depicted carrying a caduceus (a staff with two snakes intertwining around it) and a purse. migo* mi-go* These strange beings are visitors from another realm. An unusual symbiotic relationship exists between the intelligent fungus and the insectoid form that comprises the bulk of its body. They are said to have access to great magical powers. Their queens have been known to steal human brains, taking them back to distant Yuggoth. Migo are also known as the Fungi from Yuggoth. *mimic The ancestors of the modern day chameleon, these creatures can assume the form of anything in their surroundings. They may assume the shape of objects or dungeon features. Unlike the chameleon though, which assumes the shape of another creature and goes in hunt of food, the mimic waits patiently for its meals to come in search of it. *mind flayer This creature has a humanoid body, tentacles around its covered mouth, and three long fingers on each hand. Mind flayers are telepathic, and love to devour intelligent beings, especially humans. If they hit their victim with a tentacle, the mind flayer will slowly drain it of all intelligence, eventually killing its victim. mine* Made by Dwarfs. The Rule here is that the Mine is either long deserted or at most is inhabited by a few survivors who will make confused claims to have been driven out/decimated by humans/ other Dwarfs/Minions of the Dark Lord. Inhabited or not, this Mine will be very complex, with many levels of galleries, beautifully carved and engineered. What was being mined here is not always evident, but at least some of the time it will appear to have been Jewels, since it is customary to find unwanted emeralds, etc., still embedded in the rock of the walls. Metal will also be present, but only when made up into armor and weapons (_wondrous_). [ The Tough Guide to Fantasyland, by Diana Wynne Jones ] minotaur The Minotaur was a monster, half bull, half human, the offspring of Minos' wife Pasiphae and a wonderfully beautiful bull. ... When the Minotaur was born Minos did not kill him. He had Daedalus, a great architect and inventor, construct a place of confinement for him from which escape was impossible. Daedalus built the Labyrinth, famous throughout the world. Once inside, one would go endlessly along its twisting paths without ever finding the exit. [ Mythology, by Edith Hamilton ] mit*ra* Originating in India (Mitra), Mithra is a god of light who was translated into the attendant of the god Ahura Mazda in the light religion of Persia; from this he was adopted as the Roman deity Mithras. He is not generally regarded as a sky god but a personification of the fertilizing power of warm, light air. According to the _Avesta_, he possesses 10,000 eyes and ears and rides in a chariot drawn by white horses. Mithra, according to Zarathustra, is concerned with the endless battle between light and dark forces: he represents truth. He is responsible for the keeping of oaths and contracts. He is attributed with the creation of both plants and animals. His chief adversary is Ahriman, the power of darkness. [ The Encyclopaedia of Myths and Legends of All Nations, by Herbert Spencer Robinson and Knox Wilson ] *mithril* _Mithril_! All folk desired it. It could be beaten like copper, and polished like glass; and the Dwarves could make of it a metal, light and yet harder than tempered steel. Its beauty was like to that of common silver, but the beauty of _mithril_ did not tarnish or grow dim. [ The Fellowship of the Ring, by J.R.R. Tolkien ] *mitre of holiness This helm of brilliance performs all of the normal functions of a helm of brilliance, but also has the ability to protect anyone who carries it from fire. When invoked, it boosts the energy of the invoker, allowing them to cast more spells. mjollnir Forged by the dwarves Eitri and Brokk, in response to Loki's challenge, Mjollnir is an indestructible war hammer. It has two magical properties: when thrown it always returned to Thor's hand; and it could be made to shrink in size until it could fit inside Thor's shirt. Its only flaw is that it has a short handle. The other gods judged Mjollnir the winner of the contest because, of all the treasures created, it alone had the power to protect them from the giants. As the legends surrounding Mjollnir grew, it began to take on the quality of "vigja", or consecration. Thor used it to consecrate births, weddings, and even to raise his goats from the dead. In the Norse mythologies Mjollnir is considered to represent Thor's governance over the entire cycle of life - fertility, birth, destruction, and resurrection. ~slime mold *mold Mold, multicellular organism of the division Fungi, typified by plant bodies composed of a network of cottony filaments. The colors of molds are due to spores borne on the filaments. Most molds are saprophytes. Some species (e.g., penicillium) are used in making cheese and antibiotics. [ The Concise Columbia Encyclopedia ] mol?ch And the Lord spake unto Moses, saying, Again, thou shalt say to the children of Israel, Whosoever he be of the children of Israel, or of the strangers that sojourn in Israel, that giveth any of his seed unto Molech; he shall surely be put to death: the people of the land shall stone him with stones. And I will set my face against that man, and will cut him off from among his people; because he hath given of his seed unto Molech, to defile my sanctuary, and to profane my holy name. And if the people of the land do any ways hide their eyes from the man, when he giveth of his seed unto Molech, and kill him not: Then I will set my face against that man, and against his family, and will cut him off, and all that go a whoring after him, to commit whoredom with Molech, from among their people. [ Leviticus 20:1-5 ] moradin Moradin is the creator, the ancestral father of the dwarven race. He is an excellent craftsman and warrior, as befits the respected leader of the dwarven pantheon, and is a master of the forge. He is pictured as a tall, muscular dwarf, wearing rough blacksmith's clothing. In most representations of him, he is at the forge, working on a piece of steel. As could be expected, his symbol of worship is the anvil and hammer. mongbat In appearance, a cross between a small boy and a bat, this nimble creature is capable of quick, aerial strikes. Fortunately, a mongbat's small size renders its attack little more than a painful nuisance. [ Beyond the Serpent Pillars by Andrew Morris ] Though a novice, the warrior had riches. In finery, he assaulted the liches. An orc got his suit, A spectre one boot, And a mongbat is wearing his britches. [ Limericks, by Magus ] monk * monk grand master master kaen One day, an army general invited the Buddhist monk I-Hsiu (literally, "One Rest") to his military head office for a dinner. I-Hsiu was not accustomed to wearing luxurious clothings and so he just put on an old ordinary casual robe to go to the military base. To him, "form is void". As he approached the base, two soldiers appeared before him and shouted, "Where does this beggar came from? Identify yourself! You do not have permission to be around here!" "My name is I-Hsiu Dharma Master. I am invited by your general for a supper." The two soldiers examined the monk closely and said, "You liar. How come my general invites such a shabby monk to dinner? He invites the very solemn venerable I-Hsiu to our base for a great ceremony today, not you. Now, get out!" I-Hsiu was unable to convince the soldiers that he was indeed the invited guest, so he returned to the temple and changed to a very formal solemn ceremonial robe for the dinner. And as he returned to the military base, the soldiers observed that he was such a great Buddhist monk, let him in with honour. At the dinner, I-Hsiu sat in front of the table full of food but, instead of putting the food into his month, he picked up the food with his chopsticks and put it into his sleeves. The general was curious, and whispered to him, "This is very embarrassing. Do you want to take some food back to the temple? I will order the cook to prepare some take out orders for you." "No" replied the monk. "When I came here, I was not allowed into the base by your soldiers until I wear this ceremonial robe. You do not invite me for a dinner. You invite my robe. Therefore, my robe is eating the food, not me." [ Dining with a General - a Zen Buddhism Koan ] monkey "Listen, man-cub," said the Bear, and his voice rumbled like thunder on a hot night. "I have taught thee all the Law of the Jungle for all the peoples of the jungle--except the Monkey-Folk who live in the trees. They have no law. They are outcasts. They have no speech of their own, but use the stolen words which they overhear when they listen, and peep, and wait up above in the branches. Their way is not our way. They are without leaders. They have no remembrance. They boast and chatter and pretend that they are a great people about to do great affairs in the jungle, but the falling of a nut turns their minds to laughter and all is forgotten. We of the jungle have no dealings with them. We do not drink where the monkeys drink; we do not go where the monkeys go; we do not hunt where they hunt; we do not die where they die...." [ The Jungle Book, by Rudyard Kipling ] mumak* ... the Mumak of Harad was indeed a beast of vast bulk, and the like of him does not walk now in Middle-Earth; his kin that live still in latter days are but memories of his girth and majesty. On he came, ... his great legs like trees, enormous sail-like ears spread out, long snout upraised like a huge serpent about to strike, his small red eyes raging. His upturned hornlike tusks ... dripped with blood. [ The Two Towers, by J.R.R. Tolkien ] *mummy But for an account of the manner in which the body was bandaged, and a list of the unguents and other materials employed in the process, and the words of power which were spoken as each bandage was laid in its place, we must have recourse to a very interesting papyrus which has been edited and translated by M. Maspero under the title of Le Rituel de l'Embaumement. ... Everything that could be done to preserve the body was now done, and every member of it was, by means of the words of power which changed perishable substances into imperishable, protected to all eternity; when the final covering of purple or white linen had been fastened upon it, the body was ready for the tomb. [ Egyptian Magic, by E.A. Wallis Budge ] mummy wrapping He held a white cloth -- it was a serviette he had brought with him -- over the lower part of his face, so that his mouth and jaws were completely hidden, and that was the reason for his muffled voice. But it was not that which startled Mrs. Hall. It was the fact that all his forehead above his blue glasses was covered by a white bandage, and that another covered his ears, leaving not a scrap of his face exposed excepting only his pink, peaked nose. It was bright, pink, and shiny just as it had been at first. He wore a dark-brown velvet jacket with a high, black, linen- lined collar turned up about his neck. The thick black hair, escaping as it could below and between the cross bandages, project in curious tails and horns, giving him the strangest appearance conceivable. [ The Invisible Man, by H.G. Wells ] *naga* *naja* The naga is a mystical creature with the body of a snake and the head of a man or woman. They will fiercely protect the territory they consider their own. Some nagas can be forced to serve as guardians by a spellcaster of great power. naginata A Japanese pole-arm, fitted with a curved single-edged blade. The blades ranged in length from two to four feet, mounted on shafts about four to five feet long. The naginata were cut with a series of short grooves near to the tang, above which the back edge was thinned, but not sharpened, so that the greater part of the blade was a flattened diamond shape in section. Seen in profile, the curve is slight or non- existent near the tang, becoming more pronounced towards the point. "With his naginata he killed five, but with the sixth it snapped asunder in the midst and, flinging it away, he drew his sword, wielding it in the zigzag style, the interlacing, cross, reversed dragonfly, waterwheel, and eight-sides-at- once styles of fencing and cutting down eight men; but as he brought down the ninth with a mighty blow on the helmet, the blade snapped at the hilt." [ Story of Tsutsui no Jomio Meishu from Tales of Heike ] nalfeshnee Not only do these demons do physical damage with their claws and bite, but they are capable of using magic as well. nalzok Nalzok is Moloch's cunning and unfailingly loyal battle lieutenant, to whom he trusts the command of warfare when he does not wish to exercise it himself. Nalzok is a major demon, known to command the undead. He is hungry for power, and secretly covets Moloch's position. Moloch doesn't trust him, but, trusting his own power enough, chooses to allow Nalzok his position because he is useful. neanderthal* 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. [ Oxford's Student's Dictionary of Current English ] "Fillet of a fenny snake, In the cauldron boil and bake; Eye of newt and toe of frog, Wool of bat and tongue of dog, Adder's fork and blind-worm's sting, Lizard's leg and howlet's wing, For a charm of powerful trouble, Like a hell-broth boil and bubble." [ Macbeth, by William Shakespeare ] ninja-to A Japanese broadsword. *nkia *n'kai A vast, endless, eternally dark gulf said to lie at the bottom of Gehennom. Even daemons fear to tread there. The source of the Lethe river is said to be within the great gulf. What few tales exist of its outer reaches speak of hordes of hideous gugs that scavenge and devour the bodies of all who enter. *norn The Norns were the three Norse Fates, or the goddesses of fate. Female giants, they brought the wonderful Golden Age to an end. They cast lots over the cradle of every child that was born, and placed gifts in the cradle. Their names were Urda, Verdandi, and Skuld, representing the past, the present, and the future. Urda and Verdandi were kindly disposed, but Skuld was cruel and savage. Their tasks were to sew the web of fate, to water the sacred ash, Yggdrasil, and to keep it in good condition by placing fresh earth around it daily. In her fury, Skuld often spoiled the work of her sisters by tearing the web to shreds. [ The Encyclopedia of Myths and Legends of All Nations by Herbert Spencer Robinson and Knox Wilson ] nunchaku A Japanese flail. *nymph A female creature from Roman and Greek mythology, the nymph occupied rivers, forests, ponds, etc. A nymph's beauty is beyond words: an ever-young woman with sleek figure and long, thick hair, radiant skin and perfect teeth, full lips and gentle eyes. A nymph's scent is delightful, and her long robe glows, hemmed with golden threads and embroidered with rainbow hues of unearthly magnificence. A nymph's demeanour is graceful and charming, her mind quick and witty. "Theseus felt her voice pulling him down into fathoms of sleep. The song was the skeleton of his dream, and the dream was full of terror. Demon girls were after him, and a bull- man was goring him. Everywhere there was blood. There was pain. There was fear. But his head was in the nymph's lap and her musk was about him, her voice weaving the dream. He knew then that she had been sent to tell him of something dreadful that was to happen to him later. Her song was a warning. But she had brought him a new kind of joy, one that made him see everything differently. The boy, who was to become a hero, suddenly knew then what most heroes learn later -- and some too late -- that joy blots suffering and that the road to nymphs is beset by monsters." [ The Minotaur by Bernard Evslin ] odin Also called Sigtyr (god of Victory), Val-father (father of the slain), One-Eyed, Hanga-god (god of the hanged), Farma- god (god of cargoes), Hapta-god (god of prisoners), and Othin. He is the prime god of the Norsemen: god of war and victory, wisdom and prophecy, poetry, the dead, air and wind, hospitality, and magic. As the god of war and victory, Odin is ruler of the Valkyries, warrior-maidens who lived in the halls of Valhalla in Asgard, the hall of dead heroes where he held his court. These chosen ones will defend the realm of the gods against the Frost Giants on the final day of reckoning, Ragnarok. As god of the wind, Odin rides through the air on his eight- footed horse, Sleipnir, wielding Gungner, his spear, normally accompanied by his ravens, Hugin and Munin, who he would also use as his spies. As a god of hospitality, he enjoys visiting the earth in disguise to see how people were behaving and to see how they would treat him, not knowing who he was. Odin is usually represented as a one-eyed wise old man with a long white beard and a wide-brimmed hat (he gave one of his eyes to Mimir, the guardian of the well of wisdom in Hel, in exchange for a draught of knowledge). ogre* Anyone who has met a gluttonous, nude, angry ogre, will not easily forget this encounter -- if he survives it at all. Both male and female ogres can easily grow as tall as three metres. Build and facial expressions would remind one of a Neanderthal. Its small, pointy, keen teeth are striking. Since ogres avoid direct sunlight, their ragged, unfurry skin is as white as a sheet. They enjoy coating their body with lard and usually wear nothing but a loin-cloth. An elf would smell its rancid stench at ten metres distance. Ogres are solitary creatures: very rarely one may encounter a female with two or three young. They are the only real carnivores among the humanoids, and its favourite meal is -- not surprisingly -- human flesh. They sometimes ally with orcs or goblins, but only when they anticipate a good meaty meal. [ het Boek van de Regels; Het Oog des Meesters ] oilskin cloak During our watches below we overhauled our clothes, and made and mended everything for bad weather. Each of us had made for himself a suit of oil-cloth or tarpaulin, and these we got out, and gave thorough coatings of oil or tar, and hung upon the stays to dry. Our stout boots, too, we covered over with a thick mixture of melted grease and tar. Thus we took advantage of the warm sun and fine weather of the Pacific to prepare for its other face. [ Two Years Before the Mast, by Richard Henry Dana ] oilskin sack Summer passed all too quickly. On the last day of camp, Mr. Brickle called his counselors together and paid them what he owed them. Louis received one hundred dollars - the first money he had ever earned. He had no wallet and no pockets, so Mr. Brickle placed the money in a waterproof bag that had a drawstring. He hung this moneybag around Louis' neck, along with the trumpet, the slate, the chalk pencil, and the lifesaving medal. [ The Trumpet of the Swan, by E.B. White ] olog-hai But at the end of the Third Age a troll-race not before seen appeared in southern Mirkwood and in the mountain borders of Mordor. Olog-hai they were called in the Black Speech. That Sauron bred them none doubted, though from what stock was not known. Some held that they were not Trolls but giant Orcs; but the Olog-hai were in fashion of body and mind quite unlike even the largest of Orc-kind, whom they far surpassed in size and power. Trolls they were, but filled with the evil will of their master: a fell race, strong, agile, fierce and cunning, but harder than stone. Unlike the older race of the Twilight they could endure the Sun.... They spoke little, and the only tongue they knew was the Black Speech of Barad-dur. [ The Return of the King, by J.R.R. Tolkien ] oracle delphi p*thia Delphi under towering Parnassus, where Apollo's oracle was, plays an important part in mythology. Castalia was its sacred spring; Cephissus its river. It was held to be the center of the world, so many pilgrims came to it, from foreign countries as well as Greece. No other shrine rivaled it. The answers to the questions asked by the anxious seekers for Truth were delivered by a priestess who went into a trance before she spoke. [ Mythology, by Edith Hamilton ] orange pear What was the fruit like? Unfortunately, no one can describe a taste. All I can say is that, compared with those fruits, the freshest grapefruit you've ever eaten was dull, and the juiciest orange was dry, and the most melting pear was hard and woody, and the sweetest wild strawberry was sour. And there were no seeds or stones, and no wasps. If you had once eaten that fruit, all the nicest things in this world would taste like medicines after it. But I can't describe it. You can't find out what it is like unless you can get to that country and taste it for yourself. [ The Last Battle, by C.S. Lewis ] pyrolisk At first glance around the corner, I thought it was another cockatrice. I had encountered the wretched creatures two or three times since leaving the open area. I quickly ducked my head back and considered what to do next. My heart had begun to thump audibly as I patted my pack to make sure I still had the dead lizards at close reach. A check of my attire showed no obvious holes or damage. I had to keep moving. One deep breath, and a count of three, two, one, and around the corner I bolted. But it was no cockatrice! I felt a sudden intense searing of the skin around my face, and flames began to leap from my pack. I tossed it to the ground, and quickly retreated back, around that corner, desperately striving to get out of its sight. *orb of detection This Orb is a crystal ball of exceptional powers. When carried, it grants ESP, limits damage done by spells, and protects the carrier from magic missiles. When invoked it allows the carrier to become invisible. orb of fate Some say that Odin himself created this ancient crystal ball, although others argue that Loki created it and forged Odin's signature on the bottom. In any case, it is a powerful artifact. Anyone who carries it is granted the gift of warning, and damage, both spell and physical, is partially absorbed by the orb itself. When invoked it has the power to teleport the invoker between levels. goblin king orcrist The Great Goblin gave a truly awful howl of rage when he looked at it, and all his soldiers gnashed their teeth, clashed their shields, and stamped. They knew the sword at once. It had killed hundreds of goblins in its time, when the fair elves of Gondolin hunted them in the hills or did battle before their walls. They had called it Orcrist, Goblin-cleaver, but the goblins called it simply Biter. They hated it and hated worse any one that carried it. [ The Hobbit, by J.R.R. Tolkien ] orcus Orcus, Prince of the Undead, has a ram's head and a poison stinger. He is most feared, though, for his powerful magic abilities. His wand causes death to those he chooses. ~orc ??m* ~orcish barbarian ~orcish ranger ~orcish rogue ~orcish wizard orc* * orc Orcs, bipeds with a humanoid appearance, are related to the goblins, but much bigger and more dangerous. The average orc is only moderately intelligent, has broad, muscled shoulders, a short neck, a sloping forehead and a thick, dark fur. Their lower eye-teeth are pointing forward, like a boar's. Female orcs are more lightly built and bare-chested. Not needing any clothing, they do like to dress in variegated apparels. Suspicious by nature, orcs live in tribes or hordes. They tend to live underground as well as above ground (but they dislike sunlight). Orcs can use all weapons, tools and armours that are used by men. Since they don't have the talent to fashion these themselves, they are constantly hunting for them. There is nothing a horde of orcs cannot use. [ het Boek van de Regels; Het Oog des Meesters ] orion sirius Orion was the son of Neptune. He was a handsome giant and a mighty hunter. His father gave him the power of wading through the depths of the sea, or, as others say, of walking on its surface. He dwelt as a hunter with Diana (Artemis), with whom he was a favourite, and it is even said she was about to marry him. Her brother was highly displeased and often chid her, but to no purpose. One day, observing Orion wading through the sea with his head just above the water, Apollo pointed it out to his sister and maintained that she could not hit that black thing on the sea. The archer-goddess discharged a shaft with fatal aim. The waves rolled the dead body of Orion to the land, and bewailing her fatal error with many tears, Diana placed him among the stars, where he appears as a giant, with a girdle, sword, lion's skin, and club. Sirius, his dog, follows him, and the Pleiads fly before him. [ Bulfinch's Mythology, by Thomas Bulfinch ] osaku The osaku is a small tool for picking locks. owlbear Owlbears are probably the crossbreed creation of a demented wizard; given the lethal nature of this creation, it is quite likely the wizard who created them is no longer alive. As the name might already suggest, owlbears are a cross between a giant owl and a bear. They are covered with fur and feathers. panther And lo! almost where the ascent began, A panther light and swift exceedingly, Which with a spotted skin was covered o'er! And never moved she from before my face, Nay, rather did impede so much my way, That many times I to return had turned. [ Dante's Inferno, as translated by Henry Wadsworth Longfellow ] pelias Conan cried out sharply and recoiled, thrusting his companion back. Before them rose the great shimmering white form of Satha, an ageless hate in its eyes. Conan tensed himself for one mad berserker onslaught -- to thrust the glowing faggot into that fiendish countenance and throw his life into the ripping sword- stroke. But the snake was not looking at him. It was glaring over his shoulder at the man called Pelias, who stood with his arms folded, smiling. And in the great, cold, yellow eyes slowly the hate died out in a glitter of pure fear -- the only time Conan ever saw such an expression in a reptile's eyes. With a swirling rush like the sweep of a strong wind, the great snake was gone. "What did he see to frighten him?" asked Conan, eyeing his companion uneasily. "The scaled people see what escapes the mortal eye," answered Pelias cryptically. "You see my fleshy guise, he saw my naked soul." [ Conan the Usurper, by Robert E. Howard and L. Sprague de Camp ] phase spider Phase potion, which is related to oil of etherealness, is more useful for general combat. When imbibed, this potion allows the user to shift in and out of phase with the Prime Material plane at will, much like a phase spider. When out of phase, the user is impervious to all forms of attack except those that reach into Ethereal plane. ... Phase potions are brewed from phase-spider ichor or from the concentrated juices of rare underground fungi. [ RPG Sheets by Amalor Mymnyx ] Phase Spiders are not true Spiders, but an alien race which appear as giant spiders with humanoid shaped heads. Phase Spiders speak a whispery language which is reminiscent of the sound of the wind blowing through the trees. ... Phase Spiders are considered Enlightened creatures as they have the ability to phase in and out of our normal space-time into what most scientists would refer to as Void-Space. Phase Spiders use this ability to their great advantage in combat. [ Alien Update Lexicon by Randy Walker ] pick*ax* The mine is full of holes; With the wound of pickaxes. But look at the goldsmith's store. There, there is gold everywhere. [ Divan-i Kebir Meter 2, by Mevlana Celaleddin Rumi ] *piercer Ye Piercer doth look like unto a stalactyte, and hangeth from the roofs of caves and caverns. Unto the height of a man, and thicker than a man's thigh do they grow, and in groups do they hang. If a creature doth pass beneath them, they will by its heat and noise perceive it, and fall upon 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 idea of the coolness of the well came over my soul like balm. I rushed to its deadly brink. I threw my straining vision below. The glare from the enkindled roof illumined its inmost recesses. Yet, for a wild moment, did my spirit refuse to comprehend the meaning of what I saw. At length it forced -- it wrestled its way into my soul -- it burned itself in upon my shuddering reason. Oh! for a voice to speak! -- oh! horror! -- oh! any horror but this! [ The Pit and the Pendulum, by Edgar Allan Poe ] pit fiend Pit fiends are among the more powerful of devils, capable of attacking twice with weapons as well as grabbing and crushing the life out of those unwary enough to enter their domains. pixie* fairy fairies Do fairies live in the hedge by the lawn? With pale, violet eyes and wings that shimmer? Not in my garden of thistle and thorn, Well, not since I tidied it up with my strimmer. [ Learning to Live with Orcs by Richard A. Bartle ] platinum yendorian express card 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. pony Hey! now! Come hoy now! Whither do you wander? Up, down, near or far, here, there or yonder? Sharp-ears, Wise-nose, Swish-tail and Bumpkin, White-socks my little lad, and old Fatty Lumpkin! [...] Tom called them one by one and they climbed over the brow and stood in a line. Then Tom bowed to the hobbits. "Here are your ponies, now!" he said. "They've more sense (in some ways) than you wandering hobbits have -- more sense in their noses. For they sniff danger ahead which you walk right into; and if they run to save themselves, then they run the right way." [ The Fellowship of the Ring, by J.R.R. Tolkien ] *portal Portals can be Mirrors, Pictures, Standing Stones, Stone Circles, Windows, and special gates set up for the purpose. You will travel through them both to distant parts of the continent and to and from our own world. The precise manner of their working is a Management secret. [ The Tough Guide to Fantasyland, by Diana Wynne Jones ] poseido*n Poseido(o)n, lord of the seas and father of rivers and fountains, was the son of Chronos and Rhea, brother of Zeus, Hades, Hera, Hestia and Demeter. His rank of ruler of the waves he received by lot at the Council Meeting of the Gods, at which Zeus took the upper world for himself and gave dominion over the lower world to Hades. Poseidon is associated in many ways with horses and thus is the god of horses. He taught men how to ride and manage the animal he invented and is looked upon as the originator and guardian deity of horse races. His symbol is the familiar trident or three-pronged spear with which he can split rocks, cause or quell storms, and shake the earth, a power which makes him the god of earthquakes as well. Physically, he is shown as a strong and powerful ruler, every inch a king. [ The Encyclopedia of Myths and Legends of All Nations, by Herbert Robinson and Knox Wilson ] *potion* POTABLE, n. Suitable for drinking. Water is said to be potable; indeed, some declare it our natural beverage, although even they find it palatable only when suffering from the recurrent disorder known as thirst, for which it is a medicine. Upon nothing has so great and diligent ingenuity been brought to bear in all ages and in all countries, except the most uncivilized, as upon the invention of substitutes for water. To hold that this general aversion to that liquid has no basis in the preservative instinct of the race is to be unscientific -- and without science we are as the snakes and toads. [ The Devil's Dictionary, by Ambrose Bierce ] priest* * priest* acolyte [...] For the two priests were talking exactly like priests, piously, with learning and leisure, about the most aerial enigmas of theology. The little Essex priest spoke the more simply, with his round face turned to the strengthening stars; the other talked with his head bowed, as if he were not even worthy to look at them. But no more innocently clerical conversation could have been heard in any white Italian cloister or black Spanish cathedral. The first he heard was the tail of one of Father Brown's sentences, which ended: "... what they really meant in the Middle Ages by the heavens being incorruptible." The taller priest nodded his bowed head and said: "Ah, yes, these modern infidels appeal to their reason; but who can look at those millions of worlds and not feel that there may well be wonderful universes above us where reason is utterly unreasonable?" [ The Innocence of Father Brown, by G.K. Chesterton ] prisoner Where am I? In the Village. What do you want? Information. Whose side are you on? That would be telling. We want information ... information ... You won't get it. By hook or by crook, we will. Who are you? The new Number 2. Who is Number 1? You are Number 6. I am not a number! I am a free man! [ The Prisoner, by Patrick McGoohan ] ptah Known under various names (Nu, Neph, Cenubis, Amen-Kneph, Khery-Bakef), Ptah is the creator god and god of craftsmen. He is usually depicted as wearing a closely fitting robe with only his hands free. His most distinctive features are the invariable skull-cap exposing only his face and ears, and the _was_ or rod of domination which he holds, consisting of a staff surmounted by the _ankh_ symbol of life. He is otherwise symbolized by his sacred animal, the bull. *purple worm A gargantuan version of the harmless rain-worm, the purple worm poses a huge threat to the ordinary adventurer. It is known to swallow whole and digest its victims within only a few minutes. These worms are always on guard, sensitive to the most minute vibrations in the earth, but may also be awakened by a remote shriek. quadruped The woodlands and other regions are inhabited by multitudes of four-legged creatures which cannot be simply classified. They might not have fiery breath or deadly stings, but adventurers have nevertheless met their end numerous times due to the claws, hooves, or bites of such animals. quantum mechanic These creatures are not native to this universe; they seem to have strangely derived powers, and unknown motives. quasit Quasits are small, evil creatures, related to imps. Their talons release a very toxic poison when used in an attack. quest Many, possibly most, Tours are organized as a Quest. This is like a large-scale treasure hunt, with clues scattered all over the continent, a few false leads, Mystical Masters as game-show hosts, and the Dark Lord and the Terrain to make the Quest interestingly difficult. [...] In order to be assured of your future custom, the Management has a further Rule: Tourists, far from being rewarded for achieving their Quest Object, must then go on to conquer the Dark Lord or set about Saving the World, or both. And why not? By then you will have had a lot of practice in that sort of thing and, besides, the Quest Object is usually designed to help you do it. [ The Tough Guide to Fantasyland, by Diana Wynne Jones ] quetzalcoatl One of the principal Aztec-Toltec gods was the great and wise Quetzalcoatl, who was called Kukumatz in Guatemala, and Kukulcan in Yucatan. His image, the plumed serpent, is found on both the oldest and the most recent Indian edifices. ... The legend tells how the Indian deity Quetzalcoatl came from the "Land of the Rising Sun". He wore a long white robe and had a beard; he taught the people crafts and customs and laid down wise laws. He created an empire in which the ears of corn were as long as men are tall, and caused bolls of colored cotton to grow on cotton plants. But for some reason or other 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. ranger * ranger "Lonely men are we, Rangers of the wild, hunters -- but hunters ever of the servants of the Enemy; for they are found in many places, not in Mordor only. If Gondor, Boromir, has been a stalwart tower, we have played another part. Many evil things there are that your strong walls and bright swords do not stay. You know little of the lands beyond your bounds. Peace and freedom, do you say? The North would have known them little but for us. Fear would have destroyed them. But when dark things come from the houseless hills, or creep from sunless woods, they fly from us. What roads would any dare to tread, what safety would there be in quiet lands, or in the homes of simple men at night, if the Dunedain were asleep, or were all gone into the grave?" [ The Fellowship of the Ring, by J.R.R. Tolkien ] ranseur A variant of the pike, the ranseur has a thin, double-edged primary blade. Secondary blades are backward-hooking projections set well below the large central blade, forming a crown-shape. The spearing function of the weapon is apparent, and the deflection includes the trapping of opponent weapons in the space below the main blade, where a twist of the shaft would apply pressure from it or the secondary projections to either break the caught weapon or disarm its wielder. Additionally, the side projections provide both a means of holding an opponent at long range or of pulling mounted opponents off their steed. rat * rat Rats are long-tailed rodents. They are aggressive, omnivorous, and adaptable, often carrying diseases. "The rat," said O'Brien, still addressing his invisible audience, "although a rodent, is carnivorous. You are aware of that. You will have heard of the things that happen in the poor quarters of this town. In some streets a woman dare not leave her baby alone in the house, even for five minutes. The rats are certain to attack it. Within quite a small time they will strip it to the bones. They also attack sick or dying people. They show astonishing intelligence in knowing when a human being is helpless." [ 1984, by George Orwell ] raven But the raven, sitting lonely on the placid bust, spoke only That one word, as if his soul in that one word he did outpour. Nothing further then he uttered -- not a feather then he fluttered-- Till I scarcely more than muttered, 'other friends have flown before-- On the morrow *he* will leave me, as my hopes have flown before.' Then the bird said, 'Nevermore.' [ The Raven - Edgar Allan Poe ] *ring ring of * Three Rings for the Elven-kings under the sky, Seven for the Dwarf-lords in their halls of stone, Nine for Mortal Men doomed to die, One for the Dark Lord on his dark throne, In the Land of Mordor where the Shadows lie. One Ring to rule them all, One Ring to find them, One Ring to bring them all and in the darkness bind them In the Land of Mordor where the Shadows lie. [ The Fellowship of the Ring, by J.R.R. Tolkien ] robe Robes are the only garments, apart from Shirts, ever to have sleeves. They have three uses: 1. As the official uniform of Priests, Priestesses, Monks, Nuns (see Nunnery), and Wizards. The OMT [ Official Management Term ] prescribed for the Robes of Priests and Nuns is that they _fall in severe folds_; of Priestesses that they _float_; and of Wizards that they _swirl_. You can thus see who you are dealing with. 2. For Kings. The OMT here is _falling in stately folds_. 3. As the garb of Desert Nomads. [...] [ The Tough Guide to Fantasyland, by Diana Wynne Jones ] rock Bilbo saw that the moment had come when he must do something. He could not get up at the brutes and he had nothing to shoot with; but looking about he saw that in this place there were many stones lying in what appeared to be a now dry little watercourse. Bilbo was a pretty fair shot with a stone, and it did not take him long to find a nice smooth egg-shaped one that fitted his hand cosily. As a boy he used to practise throwing stones at things, until rabbits and squirrels, and even birds, got out of his way as quick as lightning if they saw him stoop; and even grownup he had still spent a deal of his time at quoits, dart-throwing, shooting at the wand, bowls, ninepins and other quiet games of the aiming and throwing sort - indeed he could do lots of things, besides blowing smoke-rings, asking riddles and cooking, that I haven't time to tell you about. There is no time now. While he was picking up stones, the spider had reached Bombur, and soon he would have been dead. At that moment Bilbo threw. The stone struck the spider plunk on the head, and it dropped senseless off the tree, flop to the ground, with all its legs curled up. [ The Hobbit, by J.R.R. Tolkien ] rock mole A rock mole is a member of the rodent family. They get their name from their ability to tunnel through rock in the same fashion that a mole tunnels through earth. They are known to eat anything they come across in their diggings, although it is still unknown how they convert some of these things into something of nutritional value. rogue * rogue I understand the business, I hear it: to have an open ear, a quick eye, and a nimble hand, is necessary for a cut-purse; a good nose is requisite also, to smell out work for the other senses. I see this is the time that the unjust man doth thrive. <...> The prince himself is about a piece of iniquity, stealing away from his father with his clog at his heels: if I thought it were a piece of honesty to acquaint the king withal, I would not do't: I hold it the more knavery to conceal it; and therein am I constant to my profession. [ Autolycus the Rogue, from The Winter's Tale by William Shakespeare ] rothe The rothe (pronounced roth-AY) is a musk ox-like creature with an aversion to light. It prefers to live underground near lichen and moss. Ruggo ?nome king The Nome King declared, "Cruelty is a thing I can't abide. So, as slaves must work hard, and the Queen of Ev and her children were delicate and tender, I transformed them all into articles of ornament and bric-a-brac and scattered them around the various rooms of my palace. Instead of being obliged to labor, they merely decorate my apartments, and I really think I have treated them with great kindness." [ Ozma of Oz, by L. Frank Baum ] *royal jelly "'Royal Jelly,'" he read aloud, "'must be a substance of tremendous nourishing power, for on this diet alone, the honey-bee larva increases in weight fifteen hundred times in five days!'" "How much?" "Fifteen hundred times, Mabel. And you know what that means if you put it in terms of a human being? It means," he said, lowering his voice, leaning forward, fixing her with those small pale eyes, "it means that in five days a baby weighing seven and a half pounds to start off with would increase in weight to five tons!" [ Royal Jelly, by Roald Dahl ] rust monster These strange creatures live on a diet of metals. They can turn a suit of armour into so much useless rusted scrap in no time at all. *saber *sabre Flashed all their sabres bare, Flashed as they turned in air, Sab'ring the gunners there, Charging an army, while All the world wondered: Plunged in the battery smoke, Right through the line they broke; Cossack and Russian Reeled from the sabre-stroke Shattered and sundered. Then they rode back, but not-- Not the six hundred. [ The Charge of the Light Brigade, by Alfred, Lord Tennyson ] saddle The horseman serves the horse, The neat-herd serves the neat, The merchant serves the purse, The eater serves his meat; 'Tis the day of the chattel, Web to weave, and corn to grind, Things are in the saddle, And ride mankind. [ Ode, by Ralph Waldo Emerson ] sake Japanese rice wine. salamander For hundreds of years, many people believed that salamanders were magical. In England in the Middle Ages, people thought that fire created salamanders. When they set fire to damp logs, dozens of the slimy creatures scurried out. The word salamander, in fact, comes from a Greek word meaning "fire animal". [ Salamanders, by Cherie Winner ] samurai * samurai By that time, Narahara had already slipped his arm from the sleeve of his outer robe, drew out his two-and-a-half-foot Fujiwara Tadahiro sword, and, brandishing it over his head, began barreling toward the foreigners. In less than a minute, he had charged upon them and cut one of them through the torso. The man fled, clutching his bulging guts, finally to fall from his horse at the foot of a pine tree about a thousand yards away. Kaeda Takeji finished him off. The other two Englishmen were severely wounded as they tried to flee. Only the woman managed to escape virtually unscathed. [ The Fox-horse, from Drunk as a Lord, by Ryotaro Shiba ] sandestin Ildefonse left the terrace and almost immediately sounds of contention came from the direction of the work-room. Ildefonse presently returned to the terrace, followed by Osherl and a second sandestin using the guise of a gaunt blue bird-like creature, some six feet in height. Ildefonse spoke in scathing tones: "Behold these two creatures! They can roam the chronoplex as easily as you or I can walk around the table; yet neither has the wit to announce his presence upon arrival. I found Osherl asleep in his fulgurite and Sarsem perched in the rafters." [...] "No matter," said Rhialto. "He has brought Sarsem, and this was his requirement. In the main, Osherl, you have done well!" "And my indenture point?" "Much depends upon Sarsem's testimony. Sarsem, will you sit?" "In this guise, I find it more convenient to stand." "Then why not alter to human form and join us in comfort at the table?" "That is a good idea." Sarsem became a naked young epicene in an integument of lavender scales with puffs of purple hair like pom-poms growing down his back. He seated himself at the table but declined refreshment. "This human semblance, though typical, is after all, only a guise. If I were to put such things inside myself, I might well become uneasy." [ Rhialto the Marvellous, by Jack Vance ] sasquatch The name _Sasquatch_ doesn't really become important in Canada until the 1930s, when it appeared in the works of J. W. Burns, a British Columbian writer who used a great deal of Indian lore in his stories. Burn's Sasquatch was a giant Indian who lived in the wilderness. He was hairy only in the sense that he had long hair on his head, and while this Sasquatch lived a wild and primitive life, he was fully human. Burns's character proved to be quite popular. There was a Sasquatch Inn near the town of Harrison, British Columbia, and Harrison even had a local celebration called "Sasquatch Days." The celebration which had been dormant for years was revived as part of British Columbia's centennial, and one of the events was to be a Sasquatch hunt. The hunt never took place, perhaps it was never supposed to, but the publicity about it did bring out a number of people who said they had encountered a Sasquatch -- not Burns's giant Indian, but the hairy apelike creature that we have all come to know. [ The Encyclopedia of Monsters, by Daniel Cohen ] *sceptre of might This mace was created aeons ago in some unknown cave, and has been passed down from generation to generation of cave dwellers. It is a very mighty mace indeed, and in addition will protect anyone who carries it from magic missile attacks. When invoked, it causes conflict in the area around it. scimitar Oh, how handsome, how noble was the Vizier Ali Tebelin, my father, as he stood there in the midst of the shot, his scimitar in his hand, his face black with powder! How his enemies fled before him! [ The Count of Monte Cristo, by Alexandre Dumas ] scorpio* A sub-species of the spider (_Scorpionidae_), the scorpion distinguishes itself from them by having a lower body that ends in a long, jointed tail tapering to a poisonous stinger. They have eight legs and pincers. [ Van Dale's Groot Woordenboek der Nederlandse Taal ] scorpius Since early times, the Scorpion has represented death, darkness, and evil. Scorpius is the reputed slayer of Orion the Hunter. [...] The gods put both scorpion and hunter among the stars, but on opposite sides of the sky so they would never fight again. 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, Grasping this scroll, and this same slender wand. I knelt with pain--reached out my hand--had grasp'd Those treasures--touch'd the knuckles--they unclasp'd-- I caught a finger: but the downward weight O'erpowered me--it sank. Then 'gan abate The storm, and through chill aguish gloom outburst The comfortable sun. I was athirst To search the book, and in the warming air Parted its dripping leaves with eager care. Strange matters did it treat of, and drew on My soul page after page, till well-nigh won Into forgetfulness; when, stupefied, I read these words, and read again, and tried My eyes against the heavens, and read again. [ Endymion, by John Keats ] shad* Shades are undead creatures. They differ from zombies in that a zombie is an undead animation of a corpse, while a shade is an undead creature magically created by the use of black magic. shaman karnov Making his quarters in the Caves of the Ancestors, Shaman Karnov unceasingly tries to shield his neanderthal people from Tiamat's minions' harassments. shan*lai*ching The Chinese god of Mountains and Seas, also the name of an old book (also Shan Hai Tjing), the book of mountains and 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. *shoggoth *shuggoth "... in the place of utter blasphemy, the unholy pit where the black realm begins and the watcher guards the gate - I saw a shoggoth - it changed shape ..." [ The Thing on the Doorstep, by H.P. Lovecraft ] It was a terrible, indescribable thing vaster than any subway train -- a shapeless congeries of protoplasmic bubbles, faintly self-luminous, and with myriads of temporary eyes forming and un-forming as pustules of greenish light all over the tunnel- filling front that bore down upon us, crushing the frantic penguins and slithering over the glistening floor that it and its kind had swept so evilly free of all litter. Still came that eldritch, mocking cry -- "Tekeli-li! Tekeli-li!" and at last we remembered that the demoniac Shoggoths - given life, thought, and plastic organ patterns solely by the Old Ones ... [ At the Mountains of Madness, by H.P. Lovecraft ] 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 ] silver A white, precious, metallic chemical element that is extremely ductile and malleable, capable of high polish, and an excellent conductor of heat and electricity: symbol, Ag; atomic weight, 107.880; atomic number, 47. [ Webster's New Twentieth Century Dictionary Unabridged, Second Edition] skeleton A skeleton is a magically animated undead creature. Unlike shades, only a humanoid creature can be used to create a skeleton. No one knows why this is true, but it has become an accepted fact amongst the practitioners of the black arts. slasher "That dog belonged to a settler who tried to build his cabin on the bank of the river a few miles south of the fort," grunted Conan. ... "We took him to the fort and dressed his wounds, but after he recovered he took to the woods and turned wild. -- What now, Slasher, are you hunting the men who killed your master?" ... "Let him come," muttered Conan. "He can smell the devils before we can see them." ... Slasher cleared the timbers with a bound and leaped into the bushes. They were violently shaken and then the dog slunk back to Balthus' side, his jaws crimson. ... "He was a man," said Conan. "I drink to his shade, and to the shade of the dog, who knew no fear." He quaffed part of the wine, then emptied the rest upon the floor, with a curious heathen gesture, and smashed the goblet. "The heads of ten Picts shall pay for this, and seven heads for the dog, who was a better warrior than many a man." [ Conan The Warrior, by Robert E Howard ] slime mold Slime mold or slime fungus, organism usually classified with the fungi, but showing equal affinity to the protozoa. Slime molds have complex life cycles with an animal-like motile phase, in which feeding and growth occur, and a plant-like immotile reproductive phase. The motile phase, commonly found under rotting logs and damp leaves, consists of either solitary amoebalike cells or a brightly colored multinucleate mass of protoplasm called a plasmodium, which creeps about and feeds by amoeboid movement. [ The Concise Columbia Encyclopedia ] smaug "There he lay, a vast red-golden dragon, fast asleep; a thrumming came from his jaws and nostrils, and wisps of smoke, but his fires were low in slumber. Beneath him, under all his limbs and his huge coiled tail, and about him on all sides stretching away across the unseen floors, lay countless piles of precious things, gold wrought and unwrought, gems and jewels, and silver red-stained in the ruddy light." [The Hobbit by J.R.R. Tolkien] sling And it came to pass, when the Philistine arose, and came and drew nigh to meet David, that David hasted, and ran toward the army to meet the Philistine. And David put his hand in his bag, and took thence a stone, and slang it, and smote the Philistine in his forehead, that the stone sunk into his forehead; and he fell upon his face to the earth. So David prevailed over the Philistine with a sling and with a stone, and smote the Philistine, and slew him; but there was no sword in the hand of David. [ 1 Samuel 17:48-50 ] *snake serpent water moccasin python pit viper Now the serpent was more subtle than any beast of the field which the Lord God had made. And he said unto the woman, Yea, hath God said, Ye shall not eat of every tree of the garden? And the woman said unto the serpent, We may eat of the fruit of the trees of the garden: but of the fruit of the tree which is in the midst of the garden, God hath said, Ye shall not eat of it, neither shall ye touch it, lest ye die. And the serpent said unto the woman, Ye shall not surely die: for God doth know that in the day ye eat thereof, then your eyes shall be opened, and ye shall be as gods, knowing good and evil. And when the woman saw that the tree was good for food, and that it was pleasant to the eyes, and a tree to be desired to make one wise, she took of the fruit thereof, and did eat, and gave also unto her husband with her; and he did eat. And the Lord God said unto the woman, What is this that thou hast done? And the woman said, The serpent beguiled me, and I did eat. And the Lord God said unto the serpent, Because thou hast done this, thou art cursed above all cattle, and above every beast of the field; upon thy belly shalt thou go, and dust shalt thou eat all the days of thy life: And I will put enmity between thee and the woman, and between thy seed and her seed; it shall bruise thy head, and thou shalt bruise his heel. [ Genesis 3:1-6,13-15 ] snickersnee Ah, never shall I forget the cry, or the shriek that shrieked he, As I gnashed my teeth, and from my sheath I drew my Snickersnee! --Koko, Lord high executioner of Titipu [ The Mikado, by Sir W.S. Gilbert ] sokoban Sokoban (Japanese for "warehouse person") is a puzzle-type game where the player must push around treasure to a goal area. It apparently won first prize in a Japanese programming contest. [ Xsokoban web site ] *soldier sergeant lieutenant captain The soldiers of Yendor are well-trained in the art of war, many trained by the Wizard himself. Some say the soldiers are explorers who were unfortunate enough to be captured, and put under the Wizard's spell. Those who have survived encounters with soldiers say they travel together in platoons, and are fierce fighters. Because of the load of their combat gear, however, one can usually run away from them, and doing so is considered a wise thing. *spear javelin - they come together with great random, and a spear is brast, and one party brake his shield and the other one goes down, horse and man, over his horse-tail and brake his neck, and then the next candidate comes randoming in, and brast his spear, and the other man brast his shield, and down he goes, horse and man, over his horse-tail, and brake his neck, and then there's another elected, and another and another and still another, till the material is all used up; and when you come to figure up results, you can't tell one fight from another, nor who whipped; and as a picture of living, raging, roaring battle, sho! why it's pale and noiseless - just ghosts scuffling in a fog. Dear me, what would this barren vocabulary get out of the mightiest spectacle? - the burning of Rome in Nero's time, for instance? Why, it would merely say 'Town burned down; no insurance; boy brast a window, fireman brake his neck!' Why, that ain't a picture! [ A Connecticut Yankee in King Arthur's Court, by Mark Twain ] *spellbook* The Book of Three lay closed on the table. Taran had never been allowed to read the volume for himself; now he was sure it held more than Dallben chose to tell him. In the sun- filled room, with Dallben still meditating and showing no sign of stopping, Taran rose and moved through the shimmering beams. From the forest came the monotonous tick of a beetle. His hands reached for the cover. Taran gasped in pain and snatched them away. They smarted as if each of his fingers had been stung by hornets. He jumped back, stumbled against the bench, and dropped to the floor, where he put his fingers woefully into his mouth. Dallben's eyes blinked open. He peered at Taran and yawned slowly. "You had better see Coll about a lotion for those hands," he advised. "Otherwise, I shouldn't be surprised if they blistered." [ The Book of Three, by Lloyd Alexander ] giant spider *spider Eight legged creature capable of spinning webs to trap prey. "You mean you eat flies?" gasped Wilbur. "Certainly. Flies, bugs, grasshoppers, choice beetles, moths, butterflies, tasty cockroaches, gnats, midges, daddy longlegs, centipedes, mosquitoes, crickets - anything that is careless enough to get caught in my web. I have to live, don't I?" "Why, yes, of course," said Wilbur. [ Charlotte's Web, by E.B. White ] shelob ...Great horns she had, and behind her short stalk-like neck was her huge swollen body, a vast bloated bag, swaying and sagging between her legs; its great bulk was black, blotched with livid marks, but the belley underneath was pale and luminous and gave forth a stench. Her legs were bent, with great knobbed joints high above her back, and hairs that stuck out like steel spines, and at each leg's end there was a claw. [ The Two Towers, by J.R.R. Tolkien ] spell A spell is a consciously directed act of magic which may take almost any form, depending on the laws of magic in operation. Commonly there will be a spoken element, ranging from a simple phrase or name to elaborately complex ritual incantations. [...] Hand-gestures or passes may be required -- called the "somatic element" by the scientific magic investigators in L. Sprague de Camp's and Fletcher Pratt's _Incomplete Enchanter_ series. Many spells exhaust the caster, like Gorice's arduous conjuration in _The Worm Ouroboros_ (1922) by E. R. Eddison. Jack Vance's _The Dying Earth_ (1950) has spells which must be painstakingly impressed on the mind (whose capacity is finite), and when cast are gone until re-learned. [ The Encyclopedia of Fantasy by David Langford ] *spore *sphere The attack by those who want to die -- this is the attack against which you cannot prepare a perfect defense. --Human aphorism [ The Dosadi Experiment, by Frank Herbert ] ~*aesculapius *staff So they stood, each in his place, neither moving a finger's breadth back, for one good hour, and many blows were given and received by each in that time, till here and there were sore bones and bumps, yet neither thought of crying "Enough," or seemed likely to fall from off the bridge. Now and then they stopped to rest, and each thought that he never had seen in all his life before such a hand at quarterstaff. At last Robin gave the stranger a blow upon the ribs that made his jacket smoke like a damp straw thatch in the sun. So shrewd was the stroke that the stranger came within a hair's breadth of falling off the bridge; but he regained himself right quickly, and, by a dexterous blow, gave Robin a crack on the crown that caused the blood to flow. Then Robin grew mad with anger, and smote with all his might at the other; but the stranger warded the blow, and once again thwacked Robin, and this time so fairly that he fell heels over head into the water, as the queen pin falls in a game of bowls. [ The Merry Adventures of Robin Hood, by Howard Pyle ] *staff of aesculapius This staff is considered sacred to all healers, as it truly holds the powers of life and death. When wielded, it protects its user from all life draining attacks, and additionally gives the wielder the power of regeneration. When invoked it performs healing magic. stair* Up he went -- very quickly at first -- then more slowly -- then in a little while even more slowly than that -- and finally, after many minutes of climbing up the endless stairway, one weary foot was barely able to follow the other. Milo suddenly realized that with all his effort he was no closer to the top than when he began, and not a great deal further from the bottom. But he struggled on for a while longer, until at last, completely exhausted, he collapsed onto one of the steps. "I should have known it," he mumbled, resting his tired legs and filling his lungs with air. "This is just like the line that goes on forever, and I'll never get there." "You wouldn't like it much anyway," someone replied gently. "Infinity is a dreadfully poor place. They can never manage to make ends meet." [ The Phantom Tollbooth, by Norton Juster ] Dr. Ray Stantz: Hey, where do those stairs go? Dr. Peter Venkman: They go up. [ Ghostbusters, directed by Ivan Reitman, written by Dan Ackroyd and Harold Ramis ] star vampire A creature from beyond the stars. Invisible, it floats along until it finds something to feed upon and then draws its life energy and blood into itself. It is said that they become briefly visible just after they have eaten and that this is such a terrible sight it can drive a mortal insane. ~statue trap statue* Then at last he began to wonder why the lion was standing so still - for it hadn't moved one inch since he first set eyes on it. Edmund now ventured a little nearer, still keeping in the shadow of the arch as much as he could. He now saw from the way the lion was standing that it couldn't have been looking at him at all. ("But supposing it turns its head?" thought Edmund.) In fact it was staring at something else - namely a little dwarf who stood with his back to it about four feet away. "Aha!" thought Edmund. "When it springs at the dwarf then will be my chance to escape." But still the lion never moved, nor did the dwarf. And now at last Edmund remembered what the others had said about the White Witch turning people into stone. Perhaps this was only a stone lion. And as soon as he had thought of that he noticed that the lion's back and the top of its head were covered with snow. Of course it must be only a statue! [ The Lion, the Witch and the Wardrobe by C.S. Lewis ] sting There was the usual dim grey light of the forest-day about him when he came to his senses. The spider lay dead beside him, and his sword-blade was stained black. Somehow the killing of the giant spider, all alone and by himself in the dark without the help of the wizard or the dwarves or of anyone else, made a great difference to Mr. Baggins. He felt a different person, and much fiercer and bolder in spite of an empty stomach, as he wiped his sword on the grass and put it back into its sheath. "I will give you a name," he said to it, "and I shall call you Sting." [ The Hobbit, by J.R.R. Tolkien ] stormbringer There were sounds in the distance, incongruent with the sounds of even this nameless, timeless sea: thin sounds, agonized and terrible, for all that they remained remote - yet the ship followed them, as if drawn by them; they grew louder-pain and despair were there, but terror was predominant. Elric had heard such sounds echoing from his cousin Yyrkoon's sardonically named 'Pleasure Chambers' in the days before he had fled the responsibilities of ruling all that remained of the old Melnibonean Empire. These were the voices of men whose very souls were under siege; men to whom death meant not mere extinction, but a continuation of existence, forever in thrall to some cruel and supernatural master. He had heard men cry so when his salvation and his nemesis, his great black battle-blade Stormbringer, drank their souls. [ The Lands Beyond the World, by Michael Moorcock ] Without thinking, he drew Stormbringer from its sheath. The Black Sword began to howl and the familiar black radiance spilled from it. The runes carved into its blade pulsed a vivid scarlet which slowly turned to a deep purple and then to black once more. The creatures were wading through the water on their stiltlike legs and paused when they saw the sword, glancing at one another. And they were not the only ones unnerved by the sight, for Duke Avan and his men paled too. 'Gods!' yelled Duke Avan. 'I know not which I prefer the look of - those who attack us or that which defends us!' 'Stay well away from that sword,' Smiorgan warned. 'It has the habit of killing more than its master chooses.'" [ The Sailor On the Seas of Fate, by Michael Moorcock ] The Pan Tangian strove to imitate Elric's irony. 'But you will note, Sir Demon, that we outnumber you. Considerably.' Softly the albino spoke: 'I've noticed that fact, but I'm not disturbed by it,' and he had drawn the black blade even as he finished speaking, for they had come at him with a rush. The Pan Tangian was the first to die, sliced through the side, his vertebrae sheared, and Stormbringer, having taken its first soul, began to sing. A Chalalite died next, leaping with stabbing javelin poised, on the point of the runesword, and Stormbringer murmured with pleasure. But it was not until it had sliced the head clean off a Filkharian pike-master that the sword began to croon and come fully to life, black fire flickering up and down its length, its strange runes glowing." [ The Sailor On the Seas of Fate, by Michael Moorcock ] susano*o The Shinto chthonic and weather god and brother of the sun goddess Amaterasu, he was born from the nose of the primordial creator god Izanagi and represents the physical, material world. He has been expelled from heaven and taken up residence on earth. [ Encyclopedia of Gods, by Michael Jordan ] tanko Samurai plate armor of the Yamato period (AD 300 - 710). tengu The tengu was the most troublesome creature of Japanese legend. Part bird and part man, with red beak for a nose and flashing eyes, the tengu was notorious for stirring up feuds and prolonging enmity between families. Indeed, the belligerent tengu were supposed to have been man's first instructors in the use of arms. [ Mythical Beasts, by Deirdre Headon (The Leprechaun Library) ] thorin Known as 'Thorin Oakenshield' because in the Battle of Azanulbizar he used an oak-branch as a shield and club. He is the King of Durin's folk in exile, and wears a golden necklace and a belt. thoth The Egyptian god of the moon and wisdom, Thoth is the patron deity of scribes and of knowledge, including scientific, medical and mathematical writing, and is said to have given mankind the art of hieroglyphic writing. He is important as a mediator and counsellor amongst the gods and is the scribe of the Heliopolis Ennead pantheon. According to mythology, he was born from the head of the god Seth. He may be depicted in human form with the head of an ibis, wholly as an ibis, or as a seated baboon sometimes with its torso covered in feathers. His attributes include a crown which consists of a crescent moon surmounted by a moon disc. Thoth is generally regarded as a benign deity. He is also scrupulously fair and is responsible not only for entering in the record the souls who pass to afterlife, but of adjudicating in the Hall of the Two Truths. The Pyramid Texts reveal a violent side of his nature by which he decapitates the adversaries of truth and wrenches out their hearts. [ Encyclopedia of Gods, by Michael Jordan ] thoth*amon Men say that he [Thutothmes] has opposed Thoth-Amon, who is master of all priests of Set, and dwells in Luxor, and that Thutothmes seeks hidden power [The Heart of Ahriman] to overthrow the Great One. [ Conan the Conqueror, by Robert E. Howard ] *throne Methought I saw the footsteps of a throne Which mists and vapours from mine eyes did shroud-- Nor view of who might sit thereon allowed; But all the steps and ground about were strown With sights the ruefullest that flesh and bone Ever put on; a miserable crowd, Sick, hale, old, young, who cried before that cloud, "Thou art our king, O Death! to thee we groan." Those steps I clomb; the mists before me gave Smooth way; and I beheld the face of one Sleeping alone within a mossy cave, With her face up to heaven; that seemed to have Pleasing remembrance of a thought foregone; A lovely Beauty in a summer grave! [ Sonnet, by William Wordsworth ] tiger 1. A well-known tropical predator (_Felis tigris_): a feline. It has a yellowish skin with darker spots or stripes. 2. Figurative: _a paper tiger_, something that is meant to scare, but has no really scaring effect whatsoever, (after a statement by Mao Ze Dong, August 1946). [ Van Dale's Groot Woordenboek der Nederlandse Taal ] Tyger! Tyger! burning bright In the forests of the night, What immortal hand or eye Could frame thy fearful symmetry? [ The Tyger, by William Blake ] tin tin of * tinning kit "You know salmon, Sarge," said Nobby. "It is a fish of which I am aware, yes." "You know they sell kind of slices of it in tins..." "So I am given to understand, yes." "Weell...how come all the tins are the same size? Salmon gets thinner at both ends." "Interesting point, Nobby. I think-" [ Soul Music, by Terry Pratchett ] tin opener Less than thirty Cat tribes now survived, roaming the cargo decks on their hind legs in a desperate search for food. But the food had gone. The supplies were finished. Weak and ailing, they prayed at the supply hold's silver mountains: huge towering acres of metal rocks which, in their pagan way, the mutant Cats believed watched over them. Amid the wailing and the screeching one Cat stood up and held aloft the sacred icon. The icon which had been passed down as holy, and one day would make its use known. It was a piece of V-shaped metal with a revolving handle on its head. He took down a silver rock from the silver mountain, while the other Cats cowered and screamed at the blasphemy. He placed the icon on the rim of the rock, and turned the handle. And the handle turned. And the rock opened. And inside the rock was Alphabetti spaghetti in tomato sauce. [ Red Dwarf, by Rob Grant and Doug Naylor ] titan Gaea, mother earth, arose from the Chaos and gave birth to Uranus, heaven, who became her consort. Uranus hated all their children, because he feared they might challenge his own authority. Those children, the Titans, the Gigantes, and the Cyclops, were banished to the nether world. Their enraged mother eventually released the youngest titan, Chronos (time), and encouraged him to castrate his father and rule in his place. Later, he too was challenged by his own son, Zeus, and he and his fellow titans were ousted from Mount Olympus. [ Greek Mythology, by Richard Patrick ] touch*stone "Gold is tried by a touchstone, men by gold." [ Chilon (c. 560 BC) ] tourist * tourist The road from Ankh-Morpork to Chrim is high, white and winding, a thirty-league stretch of potholes and half-buried rocks that spirals around mountains and dips into cool green valleys of citrus trees, crosses liana-webbed gorges on creaking rope bridges and is generally more picturesque than useful. Picturesque. That was a new word to Rincewind the wizard (BMgc, Unseen University [failed]). It was one of a number he had picked up since leaving the charred ruins of Ankh-Morpork. Quaint was another one. Picturesque meant -- he decided after careful observation of the scenery that inspired Twoflower to use the word -- that the landscape was horribly precipitous. Quaint, when used to describe the occasional village through which they passed, meant fever- ridden and tumbledown. Twoflower was a tourist, the first ever seen on the discworld. Tourist, Rincewind had decided, meant "idiot". [ The Colour of Magic, by Terry Pratchett ] towel The Hitchhiker's Guide to the Galaxy has a few things to say on the subject of towels. A towel, it says, is about the most massively useful thing an interstellar hitchhiker can have. Partly it has great practical value. You can wrap it around you for warmth as you bound across the cold moons of Jaglan Beta; you can lie on it on the brilliant marble-sanded beaches of Santraginus V, inhaling the heady sea vapors; you can sleep under it beneath the stars which shine so redly on the desert world of Kakrafoon; use it to sail a miniraft down down the slow heavy River Moth; wet it for use in hand-to-hand combat; wrap it round your head to ward off noxious fumes or avoid the gaze of the Ravenous Bugblatter Beast of Traal (a mind-bogglingly stupid animal, it assumes that if you can't see it, it can't see you - daft as a brush, but very very ravenous); you can wave your towel in emergencies as a distress signal, and of course dry yourself off with it if it still seems to be clean enough. [ The Hitchhiker's Guide to the Galaxy, by Douglas Adams ] *tower Towers (_brooding_, _dark_) stand alone in Waste Areas and almost always belong to Wizards. All are several stories high, round, doorless, virtually windowless, and composed of smooth blocks of masonry that make them very hard to climb. [...] You will have to go to a Tower and then break into it at some point towards the end of your Tour. [ The Tough Guide to Fantasyland, by Diana Wynne Jones ] trap*door I knew my Erik too well to feel at all comfortable on jumping into his house. I knew what he had made of a certain palace at Mazenderan. From being the most honest building conceivable, he soon turned it into a house of the very devil, where you could not utter a word but it was overheard or repeated by an echo. With his trap-doors the monster was responsible for endless tragedies of all kinds. [ The Phantom of the Opera, by Gaston Leroux ] trapper The trapper is a creature which has evolved a chameleon-like ability to blend into the dungeon surroundings. It captures its prey by remaining very still and blending into the surrounding dungeon features, until an unsuspecting creature passes by. It wraps itself around its prey and digests it. tree I think that I shall never see A poem lovely as a tree. A tree whose hungry mouth is prest Against the earth's sweet flowing breast; A tree that looks at God all day, And lifts her leafy arms to pray; A tree that may in Summer wear A nest of robins in her hair; Upon whose bosom snow has lain; Who intimately lives with rain. 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 cooking, some time-honored recipes demanding as much as 24. To prepare fresh tripe, trim if necessary. Wash it thoroughly, soaking overnight, and blanch, for 1/2 hour in salted water. Wash well again, drain and cut for cooking. When cooked, the texture of tripe should be like that of soft gristle. More often, alas, because the heat has not been kept low enough, it has the consistency of wet shoe leather. [ Joy of Cooking, by I Rombauer and M Becker ] *troll The troll shambled closer. He was perhaps eight feet tall, perhaps more. His forward stoop, with arms dangling past thick claw-footed legs to the ground, made it hard to tell. The hairless green skin moved upon his body. His head was a gash of a mouth, a yard-long nose, and two eyes which drank the feeble torchlight and never gave back a gleam. [...] Like a huge green spider, the troll's severed hand ran on its fingers. Across the mounded floor, up onto a log with one taloned forefinger to hook it over the bark, down again it scrambled, until it found the cut wrist. And there it grew fast. The troll's smashed head seethed and knit together. He clambered back on his feet and grinned at them. The waning faggot cast red light over his fangs. [ Three Hearts and Three Lions, by Poul Anderson ] *tsurugi of muramasa This most ancient of swords has been passed down through the leadership of the Samurai legions for hundreds of years. It is said to grant luck to its wielder, but its main power is terrible to behold. It has the capability to cut in half any creature it is wielded against, instantly killing them. ~*muramasa tsurugi The tsurugi, also known as the long samurai sword, is an extremely sharp, two-handed blade favored by the samurai. It is made of hardened steel, and is manufactured using a special process, causing it to never rust. The tsurugi is rumored to be so sharp that it can occasionally cut opponents in half! twoflower guide "Rincewind!" Twoflower sprang off the bed. The wizard jumped back, wrenching his features into a smile. "My dear chap, right on time! We'll just have lunch, and then I'm sure you've got a wonderful programme lined up for this afternoon!" "Er --" "That's great!" Rincewind took a deep breath. "Look," he said desperately, "let's eat somewhere else. There's been a bit of a fight down below." "A tavern brawl? Why didn't you wake me up?" "Well, you see, I - _what_?" "I thought I made myself clear this morning, Rincewind. I want to see genuine Morporkian life - the slave market, the Whore Pits, the Temple of Small Gods, the Beggar's Guild... and a genuine tavern brawl." A faint note of suspicion entered Twoflower's voice. "You _do_ have them, don't you? You know, people swinging on chandeliers, swordfights over the table, the sort of thing Hrun the Barbarian and the Weasel are always getting involved in. You know -- _excitement_." [ The Colour of Magic, by Terry Pratchett ] tyr Yet remains that one of the Aesir who is called Tyr: he is most daring, and best in stoutness of heart, and he has much authority over victory in battle; it is good for men of valor to invoke him. It is a proverb, that he is Tyr-valiant, who surpasses other men and does not waver. He is wise, so that it is also said, that he that is wisest is Tyr-prudent. This is one token of his daring: when the Aesir enticed Fenris-Wolf to take upon him the fetter Gleipnir, the wolf did not believe them, that they would loose him, until they laid Tyr's hand into his mouth as a pledge. But when the Aesir would not loose him, then he bit off the hand at the place now called 'the wolf's joint;' and Tyr is one- handed, and is not called a reconciler of men. [ The Prose Edda, by Snorri Sturluson ] *hulk Umber hulks are powerful subterranean predators whose iron-like claws allow them to burrow through solid stone in search of prey. They are tremendously strong; muscles bulge beneath their thick, scaly hides and their powerful arms and legs all end in great claws. *unicorn unicorn horn Men have always sought the elusive unicorn, for the single twisted horn which projected from its forehead was thought to be a powerful talisman. It was said that the unicorn had simply to dip the tip of its horn in a muddy pool for the water to become pure. Men also believed that to drink from this horn was a protection against all sickness, and that if the horn was ground to a powder it would act as an antidote to all poisons. Less than 200 years ago in France, the horn of a unicorn was used in a ceremony to test the royal food for poison. Although only the size of a small horse, the unicorn is a very fierce beast, capable of killing an elephant with a single thrust from its horn. Its fleetness of foot also makes this solitary creature difficult to capture. However, it can be tamed and captured by a maiden. Made gentle by the sight of a virgin, the unicorn can be lured to lay its head in her lap, and in this docile mood, the maiden may secure it with a golden rope. [ Mythical Beasts, by Deirdre Headon (The Leprechaun Library) ] Martin took a small sip of beer. "Almost ready," he said. "You hold your beer awfully well." Tlingel laughed. "A unicorn's horn is a detoxicant. Its possession is a universal remedy. I wait until I reach the warm glow stage, then I use my horn to burn off any excess and keep me right there." [ Unicorn Variations, by Roger Zelazny ] uruk*hai "Aye, we must stick together," growled Ugluk. "I don't trust you little swine. You've got no guts outside your own sties. But for us you'd all have run away. We are the fighting Uruk-Hai! We slew the great warrior. We took the prisoners. We are the servants of Saruman the Wise, the White Hand: the hand that gives us man's-flesh to eat. We came out of Isengard, and led you here, and we shall lead you back by the way we choose. I am Ugluk. I have spoken." [ The Return of the King, by J.R.R. Tolkien ] valkyrie * valkyrie The Valkyries were the thirteen choosers of the slain, the beautiful warrior-maids of Odin who rode through the air and over the sea. They watched the progress of the battle and selected the heroes who were to fall fighting. After they were dead, the maidens rewarded the heroes by kissing them and then led their souls to Valhalla, where the warriors lived happily in an ideal existence, drinking and eating without restraint and fighting over again the battles in which they died and in which they had won their deathless fame. [ The Encyclopaedia of Myths and Legends of All Nations, by Herbert Robinson and Knox Wilson ] vampire vampire bat vampire lord The Oxford English Dictionary is quite unequivocal: _vampire_ - "a preternatural being of a malignant nature (in the original and usual form of the belief, a reanimated corpse), supposed to seek nourishment, or do harm, by sucking the blood of sleeping persons. ..." venus Venus, the goddess of love and beauty, was the daughter of Jupiter and Dione. Others say that Venus sprang from the foam of the sea. The zephyr wafted her along the waves to the Isle of Cyprus, where she was received and attired by the Seasons, and then led to the assembly of the gods. All were charmed with her beauty, and each one demanded her for his wife. Jupiter gave her to Vulcan, in gratitude for the service he had rendered in forging thunderbolts. So the most beautiful of the goddesses became the wife of the most ill-favoured of gods. [ Bulfinch's Mythology, by Thomas Bulfinch ] vlad* Vlad Dracula the Impaler was a 15th-Century monarch of the Birgau region of the Carpathian Mountains, in what is now Romania. In Romanian history he is best known for two things. One was his skilled handling of the Ottoman Turks, which kept them from making further inroads into Christian Europe. The other was the ruthless manner in which he ran his fiefdom. He dealt with perceived challengers to his rule by impaling them upright on wooden stakes. Visiting dignitaries who failed to doff their hats had them nailed to their head. *vortex vortices Swirling clouds of pure elemental energies, the vortices are thought to be related to the larger elementals. Though the vortices do no damage when touched, they are noted for being able to envelop unwary travellers. The hapless fool thus swallowed by a vortex will soon perish from exposure to the element the vortex is composed of. voulge Place a hefty cleaver at the end of a long, stout shaft, and the leverage which the pole gives the wielder will enable him to cleave through armor. The voulge has no provision to keep the enemy at a distance in its basic model, but with the top front or back edge is ground down so as to provide a pointed, dagger-like tip, the weapon assumes a more complete form. vrock The vrock is one of the weaker forms of demon. It resembles a cross between a human being and a vulture and does physical damage by biting and by using the claws on both its arms and feet. wakizashi The samurai warrior traditionally wears two swords; the wakizashi is the shorter of the two. See also katana. wand of * *wand 'Saruman!' he cried, and his voice grew in power and authority. 'Behold, I am not Gandalf the Grey, whom you betrayed. I am Gandalf the White, who has returned from death. You have no colour now, and I cast you from the order and from the Council.' He raised his hand, and spoke slowly in a clear cold voice. 'Saruman, your staff is broken.' There was a crack, and the staff split asunder in Saruman's hand, and the head of it fell down at Gandalf's feet. 'Go!' said Gandalf. With a cry Saruman fell back and crawled away. [ The Two Towers, by J.R.R. Tolkien ] warg Suddenly Aragorn leapt to his feet. "How the wind howls!" he cried. "It is howling with wolf-voices. The Wargs have come west of the Mountains!" "Need we wait until morning then?" said Gandalf. "It is as I said. The hunt is up! Even if we live to see the dawn, who now will wish to journey south by night with the wild wolves on his trail?" "How far is Moria?" asked Boromir. "There was a door south-west of Caradhras, some fifteen miles as the crow flies, and maybe twenty as the wolf runs," answered Gandalf grimly. "Then let us start as soon as it is light tomorrow, if we can," said Boromir. "The wolf that one hears is worse than the orc that one fears." "True!" said Aragorn, loosening his sword in its sheath. "But where the warg howls, there also the orc prowls." [ The Fellowship of the Ring, by J.R.R. Tolkien ] ~mjollnir war*hammer They had come together at the ford of the Trident while the battle crashed around them, Robert with his warhammer and his great antlered helm, the Targaryen prince armored all in black. On his breastplate was the three-headed dragon of his House, wrought all in rubies that flashed like fire in the sunlight. The waters of the Trident ran red around the hooves of their destriers as they circled and clashed, again and again, until at last a crushing blow from Robert's hammer stove in the dragon and the chest behind it. When Ned had finally come on the scene, Rhaegar lay dead in the stream, while men of both armies scrambled in the swirling waters for rubies knocked free of his armor. [ A Game of Thrones, by George R.R. Martin ] water Day after day, day after day, We stuck, nor breath nor motion; As idle as a painted ship Upon a painted ocean. Water, water, everywhere, And all the boards did shrink; Water, water, everywhere Nor any drop to drink. [ The Rime of the Ancient Mariner, by Samuel Taylor Coleridge ] web Oh what a tangled web we weave, When first we practise to deceive! [ Marmion, by Sir Walter Scott ] # werecritter -- see "lycanthrope" *wight When he came to himself again, for a moment he could recall nothing except a sense of dread. Then suddenly he knew that he was imprisoned, caught hopelessly; he was in a barrow. A Barrow-wight had taken him, and he was probably already under the dreadful spells of the Barrow-wights about which whispered tales spoke. He dared not move, but lay as he found himself: flat on his back upon a cold stone with his hands on his breast. [ The Fellowship of the Ring, by J.R.R. Tolkien ] # note: need to convert player character "gnomish wizard" into just "wizard" # in the lookup code to avoid conflict with the monster of that same name ~gnomish wizard wizard * wizard apprentice Ebenezum walked before me along the closest thing we could find to a path in these overgrown woods. Every few paces he would pause, so that I, burdened with a pack stuffed with arcane and heavy paraphernalia, could catch up with his wizardly strides. He, as usual, carried nothing, preferring, as he often said, to keep his hands free for quick conjuring and his mind free for the thoughts of a mage. [ A Dealing with Demons, by Craig Shaw Gardner ] rodney 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 any normal man's, he grew weary of lesser mortals; and so, spurning all human company, he forsook the dwellings of men and went to live in the depths of the Earth. He took with him a dreadful artifact, the Book of the Dead, which is said to hold great power indeed. Many have sought to find the wizard and his treasure, but none have found him and lived to tell the tale. Woe be to the incautious adventurer who disturbs this mighty sorcerer! wolf *wolf *wolf cub The ancestors of the modern day domestic dog, wolves are powerful muscular animals with bushy tails. Intelligent, social animals, wolves live in family groups or packs made up of multiple family units. These packs cooperate in hunting down prey. woodchuck The Usenet Oracle requires an answer to this question! > How much wood could a woodchuck chuck if a woodchuck could > chuck wood? "Oh, heck! I'll handle *this* one!" The Oracle spun the terminal back toward himself, unlocked the ZOT-guard lock, and slid the glass guard away from the ZOT key. "Ummmm....could you turn around for a minute? ZOTs are too graphic for the uninitiated. Even *I* get a little squeamish sometimes..." The neophyte turned around, and heard the Oracle slam his finger on a computer key, followed by a loud ZZZZOTTTTT and the smell of ozone. [ Excerpted from Internet Oracularity 576.6 ] # avoid false hits for non-long worms worm long worm long worm tail worm tooth crysknife [The crysknife] is manufactured in two forms from teeth taken from dead sandworms. The two forms are "fixed" and "unfixed". An unfixed knife requires proximity to a human body's electrical field to prevent disintegration. Fixed knives are treated for storage. All are about 20 centimeters long. [ Dune, by Frank Herbert ] wraith nazgul Immediately, though everything else remained as before, dim and dark, the shapes became terribly clear. He was able to see beneath their black wrappings. There were five tall figures: two standing on the lip of the dell, three advancing. In their white faces burned keen and merciless eyes; under their mantles were long grey robes; upon their grey hairs were helms of silver; in their haggard hands were swords of steel. Their eyes fell on him and pierced him, as they rushed towards him. Desperate, he drew his own sword, and it seemed to him that it flickered red, as if it was a firebrand. Two of the figures halted. The third was taller than the others: his hair was long and gleaming and on his helm was a crown. In one hand he held a long sword, and in the other a knife; both the knife and the hand that held it glowed with a pale light. He sprang forward and bore down on Frodo. [ The Fellowship of the Ring, by J.R.R. Tolkien ] wumpus The Wumpus, by the way, is not bothered by the hazards since he has sucker feet and is too big for a bat to lift. If you try to shoot him and miss, there's also a chance that he'll up and move himself into another cave, though by nature the Wumpus is a sedentary creature. [ wump(6) -- "Hunt the Wumpus" ] xan They sent their friend the mosquito [xan] ahead of them to find out what lay ahead. "Since you are the one who sucks the blood of men walking along paths," they told the mosquito, "go and sting the men of Xibalba." The mosquito flew down the dark road to the Underworld. Entering the house of the Lords of Death, he stung the first person that he saw... The mosquito stung this man as well, and when he yelled, the man next to him asked, "Gathered Blood, what's wrong?" So he flew along the row stinging all the seated men until he knew the names of all twelve. [ Popul Vuh, as translated by Ralph Nelson ] xorn A distant cousin of the earth elemental, the xorn has the ability to shift the cells of its body around in such a way that it becomes porous to inert material. This gives it the ability to pass through any obstacle that might be between it and its next meal. ya The arrow of choice of the samurai, ya are made of very straight bamboo, and are tipped with hardened steel. yeenoghu Yeenoghu, the demon lord of gnolls, still exists although all his followers have been wiped off the face of the earth. He casts magic projectiles at those close to him, and a mere gaze into his piercing eyes may hopelessly confuse the battle-weary adventurer. yeti The Abominable Snowman, or yeti, is one of the truly great unknown animals of the twentieth century. It is a large hairy biped that lives in the Himalayan region of Asia ... The story of the Abominable Snowman is filled with mysteries great and small, and one of the most difficult of all is how it got that awful name. The creature is neither particularly abominable, nor does it necessarily live in the snows. _Yeti_ is a Tibetan word which may apply either to a real, but unknown animal of the Himalayas, or to a mountain spirit or demon -- no one is quite sure which. And after nearly half a century in which Westerners have trampled around looking for the yeti, and asking all sorts of questions, the original native traditions concerning the creature have become even more muddled and confused. [ The Encyclopedia of Monsters, by Daniel Cohen ] *yugake Japanese leather archery gloves. Gloves made for use while practicing had thumbs reinforced with horn. Those worn into battle had thumbs reinforced with a double layer of leather. yumi The samurai is highly trained with a special type of bow, the yumi. Like the ya, the yumi is made of bamboo. With the yumi-ya, the bow and arrow, the samurai is an extremely accurate and deadly warrior. *zombie The zombi... is a soulless human corpse, still dead, but taken from the grave and endowed by sorcery with a mechanical semblance of life, -- it is a dead body which is made to walk and act and move as if it were alive. [ W. B. Seabrook ] zruty The zruty are wild and gigantic beings, living in the wildernesses of the Tatra mountains. slashem-0.0.7E7F3/dat/castle.des0000664000076400007640000001724510545462317014405 0ustar aliali# SCCS Id: @(#)castle.des 3.4 2002/05/02 # Copyright (c) 1989 by Jean-Christophe Collet # NetHack may be freely redistributed. See license for details. # # This is the stronghold level : # there are several ways to enter it : # - opening the drawbridge (wand of opening, knock spell, playing # the appropriate tune) # # - enter via the back entry (this suppose a ring of levitation, boots # of water walking, etc.) # # Note : If you don't play the right tune, you get indications like in the # MasterMind game... # # To motivate the player : there are 4 storerooms (armors, weapons, food and # gems) and a wand of wishing in one of the 4 towers... MAZE:"castle",random FLAGS: noteleport, lethe GEOMETRY:center,center MAP }}}}}}}}}.............................................}}}}}}}}} }-------}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}-------} }|.....|-----------------------------------------------|.....|} }|.....+...............................................+.....|} }-------------------------------+-----------------------------} }}}}}}|........|..........+...........|.......S.S.......|}}}}}} .....}|........|..........|...........|.......|.|.......|}..... .....}|........------------...........---------S---------}..... .....}|...{....+..........+.........\.S.................+...... .....}|........------------...........---------S---------}..... .....}|........|..........|...........|.......|.|.......|}..... }}}}}}|........|..........+...........|.......S.S.......|}}}}}} }-------------------------------+-----------------------------} }|.....+...............................................+.....|} }|.....|-----------------------------------------------|.....|} }-------}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}-------} }}}}}}}}}.............................................}}}}}}}}} ENDMAP # Random registers initialisation RANDOM_OBJECTS:'[',')','*','%' RANDOM_PLACES:(04,02),(58,02),(04,14),(58,14) RANDOM_MONSTERS:'L','N','E','H','M','O','R','T','X','Z' TELEPORT_REGION:levregion(01,00,10,20),(1,1,61,15),down TELEPORT_REGION:levregion(69,00,79,20),(1,1,61,15),up STAIR:levregion(01,00,10,20),(0,0,62,16),up FOUNTAIN:(10,08) # Doors DOOR:closed,(07,03) DOOR:closed,(55,03) DOOR:locked,(32,04) DOOR:locked,(26,05) DOOR:locked,(46,05) DOOR:locked,(48,05) DOOR:locked,(47,07) DOOR:closed,(15,08) DOOR:closed,(26,08) DOOR:locked,(38,08) DOOR:locked,(56,08) DOOR:locked,(47,09) DOOR:locked,(26,11) DOOR:locked,(46,11) DOOR:locked,(48,11) DOOR:locked,(32,12) DOOR:closed,(07,13) DOOR:closed,(55,13) # The drawbridge DRAWBRIDGE:(05,08),east,closed # Storeroom number 1 OBJECT:object[0],random,(39,05) OBJECT:object[0],random,(40,05) OBJECT:object[0],random,(41,05) OBJECT:object[0],random,(42,05) OBJECT:object[0],random,(43,05) OBJECT:object[0],random,(44,05) OBJECT:object[0],random,(45,05) OBJECT:object[0],random,(39,06) OBJECT:object[0],random,(40,06) OBJECT:object[0],random,(41,06) OBJECT:object[0],random,(42,06) OBJECT:object[0],random,(43,06) OBJECT:object[0],random,(44,06) OBJECT:object[0],random,(45,06) # Storeroom number 2 OBJECT:object[1],random,(49,05) OBJECT:object[1],random,(50,05) OBJECT:object[1],random,(51,05) OBJECT:object[1],random,(52,05) OBJECT:object[1],random,(53,05) OBJECT:object[1],random,(54,05) OBJECT:object[1],random,(55,05) OBJECT:object[1],random,(49,06) OBJECT:object[1],random,(50,06) OBJECT:object[1],random,(51,06) OBJECT:object[1],random,(52,06) OBJECT:object[1],random,(53,06) OBJECT:object[1],random,(54,06) OBJECT:object[1],random,(55,06) # Storeroom number 3 OBJECT:object[2],random,(39,10) OBJECT:object[2],random,(40,10) OBJECT:object[2],random,(41,10) OBJECT:object[2],random,(42,10) OBJECT:object[2],random,(43,10) OBJECT:object[2],random,(44,10) OBJECT:object[2],random,(45,10) OBJECT:object[2],random,(39,11) OBJECT:object[2],random,(40,11) OBJECT:object[2],random,(41,11) OBJECT:object[2],random,(42,11) OBJECT:object[2],random,(43,11) OBJECT:object[2],random,(44,11) OBJECT:object[2],random,(45,11) # Storeroom number 4 OBJECT:object[3],random,(49,10) OBJECT:object[3],random,(50,10) OBJECT:object[3],random,(51,10) OBJECT:object[3],random,(52,10) OBJECT:object[3],random,(53,10) OBJECT:object[3],random,(54,10) OBJECT:object[3],random,(55,10) OBJECT:object[3],random,(49,11) OBJECT:object[3],random,(50,11) OBJECT:object[3],random,(51,11) OBJECT:object[3],random,(52,11) OBJECT:object[3],random,(53,11) OBJECT:object[3],random,(54,11) OBJECT:object[3],random,(55,11) # THE WAND OF WISHING in 1 of the 4 towers CONTAINER:'(',"chest",place[0] OBJECT:'/',"wishing",contained # Prevent monsters from eating it. (@'s never eat objects) ENGRAVING:place[0],burn,"Elbereth" # The treasure of the lord OBJECT:'(',"chest",(37,08) # Traps TRAP:"trap door",(40,08) TRAP:"trap door",(44,08) TRAP:"trap door",(48,08) TRAP:"trap door",(52,08) TRAP:"trap door",(55,08) # Soldiers guarding the entry hall MONSTER:'@',"soldier",(08,06) MONSTER:'@',"soldier",(09,05) MONSTER:'@',"soldier",(11,05) MONSTER:'@',"soldier",(12,06) MONSTER:'@',"soldier",(08,10) MONSTER:'@',"soldier",(09,11) MONSTER:'@',"soldier",(11,11) MONSTER:'@',"soldier",(12,10) MONSTER:'@',"lieutenant",(09,08) # Soldiers guarding the towers MONSTER:'@',"soldier",(03,02) MONSTER:'@',"soldier",(05,02) MONSTER:'@',"soldier",(57,02) MONSTER:'@',"soldier",(59,02) MONSTER:'@',"soldier",(03,14) MONSTER:'@',"soldier",(05,14) MONSTER:'@',"soldier",(57,14) MONSTER:'@',"soldier",(59,14) # The four dragons that are guarding the storerooms MONSTER:'D',random,(47,05) MONSTER:'D',random,(47,06) MONSTER:'D',random,(47,10) MONSTER:'D',random,(47,11) # Sea monsters in the moat MONSTER:';',"giant eel",(05,07) MONSTER:';',"giant eel",(05,09) MONSTER:';',"giant eel",(57,07) MONSTER:';',"giant eel",(57,09) MONSTER:';',"shark",(05,00) MONSTER:';',"shark",(05,16) MONSTER:';',"shark",(57,00) MONSTER:';',"shark",(57,16) # The throne room and the court monsters MONSTER:monster[0],random,(27,05) MONSTER:monster[1],random,(30,05) MONSTER:monster[2],random,(33,05) MONSTER:monster[3],random,(36,05) MONSTER:monster[4],random,(28,06) MONSTER:monster[5],random,(31,06) MONSTER:monster[6],random,(34,06) MONSTER:monster[7],random,(37,06) MONSTER:monster[8],random,(27,07) MONSTER:monster[9],random,(30,07) MONSTER:monster[0],random,(33,07) MONSTER:monster[1],random,(36,07) MONSTER:monster[2],random,(28,08) MONSTER:monster[3],random,(31,08) MONSTER:monster[4],random,(34,08) MONSTER:monster[5],random,(27,09) MONSTER:monster[6],random,(30,09) MONSTER:monster[7],random,(33,09) MONSTER:monster[8],random,(36,09) MONSTER:monster[9],random,(28,10) MONSTER:monster[0],random,(31,10) MONSTER:monster[1],random,(34,10) MONSTER:monster[2],random,(37,10) MONSTER:monster[3],random,(27,11) MONSTER:monster[4],random,(30,11) MONSTER:monster[5],random,(33,11) MONSTER:monster[6],random,(36,11) # MazeWalks MAZEWALK:(00,10),west MAZEWALK:(62,06),east # Non diggable walls NON_DIGGABLE:(00,00,62,16) # Subrooms: # Entire castle area REGION:(00,00,62,16),unlit,"ordinary" # Courtyards REGION:(00,05,05,11),lit,"ordinary" REGION:(57,05,62,11),lit,"ordinary" # Throne room REGION:(27,05,37,11),lit,"throne",unfilled # Antechamber REGION:(07,05,14,11),lit,"ordinary" # Storerooms REGION:(39,05,45,06),lit,"ordinary" REGION:(39,10,45,11),lit,"ordinary" REGION:(49,05,55,06),lit,"ordinary" REGION:(49,10,55,11),lit,"ordinary" # Corners REGION:(02,02,06,03),lit,"ordinary" REGION:(56,02,60,03),lit,"ordinary" REGION:(02,13,06,14),lit,"ordinary" REGION:(56,13,60,14),lit,"ordinary" # Barracks REGION:(16,05,25,06),lit,"barracks" REGION:(16,10,25,11),lit,"barracks" # Hallways REGION:(08,03,54,03),unlit,"ordinary" REGION:(08,13,54,13),unlit,"ordinary" REGION:(16,08,25,08),unlit,"ordinary" REGION:(39,08,55,08),unlit,"ordinary" # Storeroom alcoves REGION:(47,05,47,06),unlit,"ordinary" REGION:(47,10,47,11),unlit,"ordinary" slashem-0.0.7E7F3/dat/Wizard.des0000664000076400007640000003546110545462317014372 0ustar aliali# 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",' ' FLAGS: noteleport,hardfloor GEOMETRY:center,center MAP ............................................................................ .....................C....CC.C........................C..................... ..........CCC.....................CCC....................................... ........CC........-----------.......C.C...C...C....C........................ .......C.....---------------------...C..C..C..C............................. ......C..C...------....\....------....C.....C............................... ........C...||....|.........|....||......................................... .......C....||....|.........+....||......................................... .......C...||---+--.........|....|||........................................ ......C....||...............|--S--||........................................ ...........||--+--|++----|---|..|.SS..........C......C...................... ........C..||.....|..|...|...|--|.||..CC..C.....C..........C................ .......C...||.....|..|.--|.|.|....||.................C..C................... .....C......||....|..|.....|.|.--||..C..C..........C...........}}}.......... ......C.C...||....|..-----.|.....||...C.C.C..............C....}}}}}}........ .........C...------........|------....C..C.....C..CC.C......}}}}}}}}}}}..... .........CC..---------------------...C.C..C.....CCCCC.C.......}}}}}}}}...... .........C........-----------..........C.C.......CCC.........}}}}}}}}}...... ..........C.C.........................C............C...........}}}}}........ ......................CCC.C................................................. ENDMAP # Dungeon Description REGION:(00,00,75,19),lit,"ordinary" REGION:(35,00,49,03),unlit,"ordinary" REGION:(43,12,49,16),unlit,"ordinary" REGION:(19,11,33,15),unlit,"ordinary",unfilled,true REGION:(30,10,31,10),unlit,"ordinary" # Stairs STAIR:(30,10),down # Portal arrival point BRANCH:(63,06,63,06),(0,0,0,0) # Doors DOOR:closed,(31,09) DOOR:closed,(16,08) DOOR:closed,(28,07) DOOR:locked,(34,10) DOOR:locked,(35,10) 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) MONSTER:'@',"apprentice",(24,06) MONSTER:'@',"apprentice",(15,06) MONSTER:'@',"apprentice",(15,12) MONSTER:'@',"apprentice",(26,11) MONSTER:'@',"apprentice",(27,11) MONSTER:'@',"apprentice",(19,09) MONSTER:'@',"apprentice",(20,09) # Eels in the pond MONSTER:';',"giant eel",(62,14) MONSTER:';',"giant eel",(69,15) MONSTER:';',"giant eel",(67,17) # Non diggable walls NON_DIGGABLE:(00,00,75,19) # Random traps TRAP:random,random TRAP:random,random TRAP:random,random TRAP:random,random TRAP:random,random TRAP:random,random # Monsters on siege duty. MONSTER: 'B',random,(60,09),hostile MONSTER: 'W',random,(60,10),hostile MONSTER: 'B',random,(60,11),hostile MONSTER: 'B',random,(60,12),hostile MONSTER: 'i',random,(60,13),hostile MONSTER: 'B',random,(61,10),hostile MONSTER: 'B',random,(61,11),hostile MONSTER: 'B',random,(61,12),hostile MONSTER: 'B',random,(35,03),hostile MONSTER: 'i',random,(35,17),hostile MONSTER: 'B',random,(36,17),hostile MONSTER: 'B',random,(34,16),hostile MONSTER: 'i',random,(34,17),hostile MONSTER: 'W',random,(67,02),hostile MONSTER: 'B',random,(10,19),hostile # # The "locate" level for the quest. # # Here you have to find the Entrance to the Tower of Darkness to go # further towards your assigned quest. # MAZE: "Wiz-loca",' ' FLAGS: hardfloor GEOMETRY:center,center MAP ............. ....................................................... .............. .............}}}}}}}.}}}}}}}}}}}}}}}}}}}.}}}}}}}....... .............. ..............}.................................}....... .............. ..............}.---------S---------------------.}....... ............... .........C....}.|.............................|.}....... ............... ..........C....}.|.---------------------------.|.}....... ............... .........CCC.....|.|.........................|.|......... ................ ....C....CCC...}.|.|.---S-------------------.|.|.}....... .......C..C..... .....C....CCC...}.|.|.|......+.......+......|.|.|.}....... .............C..CC.....C....CCC...}.|.|.|......|-------|......|.|.|.}....... ................ ....C....CCC...}.|.|.|......|.......S......|.|.|.}....... ......C..C..... ....C....CCC...}.|.|.|......|-------|......|.|.|.}....... ............C.. ...C....CCC...}.|.|.|......+.......+......|.|.|.}....... ........C...... ....C....CCC...}.|.|.-----------------------.|.|.}....... ....C......C... ........CCC.....|.|.........................|.|......... ......C..C.... .........C....}.|.--------------------S------.|.}....... .............. .........C....}.|.............................|.}....... ............. ..............}.-------------------------------.}....... ............. .............}.................................}....... ............. .............}}}}}}}.}}}}}}}}}}}}}}}}}}}.}}}}}}}....... ............. ....................................................... ENDMAP # Dungeon Description REGION:(00,00,75,20),lit,"ordinary" REGION:(37,04,65,16),unlit,"ordinary" REGION:(41,08,46,12),lit,"ordinary" REGION:(56,08,61,12),lit,"ordinary" REGION:(48,08,54,08),unlit,"ordinary" REGION:(48,12,54,12),unlit,"ordinary" REGION:(48,10,54,10),unlit,"ordinary" # Doors DOOR:locked,(45,03) DOOR:locked,(43,07) DOOR:locked,(58,15) DOOR:locked,(55,10) DOOR:locked,(55,08) DOOR:locked,(55,12) DOOR:locked,(47,08) DOOR:locked,(47,12) # Stairs STAIR:(03,17),up STAIR:(48,10),down # 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 OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random # Random traps TRAP:"spiked pit",(24,02) TRAP:"spiked pit",(07,10) TRAP:"spiked pit",(23,05) TRAP:"spiked pit",(26,19) TRAP:"spiked pit",(72,02) TRAP:"spiked pit",(72,12) TRAP:"falling rock",(45,16) TRAP:"falling rock",(65,13) TRAP:"falling rock",(55,06) TRAP:"falling rock",(39,11) TRAP:"falling rock",(57,09) TRAP:"magic",random TRAP:"statue",random TRAP:"statue",random TRAP:"polymorph",random TRAP:"anti magic",(53,10) TRAP:"sleep gas",random TRAP:"sleep gas",random TRAP:"dart",random TRAP:"dart",random TRAP:"dart",random # Random monsters. MONSTER:'B',random,random,hostile MONSTER:'B',random,random,hostile MONSTER:'B',random,random,hostile MONSTER:'B',random,random,hostile MONSTER:'B',random,random,hostile MONSTER:'B',random,random,hostile MONSTER:'B',random,random,hostile MONSTER:'B',random,random,hostile MONSTER:'B',random,random,hostile MONSTER:'B',random,random,hostile MONSTER:'B',random,random,hostile MONSTER:'B',random,random,hostile MONSTER:'i',random,random,hostile MONSTER:'i',random,random,hostile MONSTER:'i',random,random,hostile MONSTER:'i',random,random,hostile MONSTER:'i',random,random,hostile MONSTER:'i',random,random,hostile MONSTER:'i',random,random,hostile MONSTER:'B',"vampire bat",random MONSTER:'B',"vampire bat",random MONSTER:'B',"vampire bat",random MONSTER:'B',"vampire bat",random MONSTER:'B',"vampire bat",random MONSTER:'B',"vampire bat",random MONSTER:'B',"vampire bat",random MONSTER:'i',random,random,hostile # # The "goal" level for the quest. # # Here you meet the Dark One, your nemesis monster. You have to # defeat the Dark One in combat to gain the artifact you have # been assigned to retrieve. # MAZE: "Wiz-goal", ' ' GEOMETRY:center,center MAP ------------- ------------- |...........| |...........| -------|...........-------------------...........| |......S...........|..|..|..|..|..|..|...........| |......|...........|..|..|..|..|..|..|...........| |......|...........-F+-F+-F+-F+-F+-F+-...........| --S----|...........S.................+...........| |......|...........-F+-F+-F+-F+-F+-F+-...........| |......|...........|..|..|..|..|..|..|...........| |......|...........|..|..|..|..|..|..|...........| -------|...........-------------------...........| |...........| |...........| ------------- ------------- ENDMAP # Dungeon Description REGION:(13,10,18,12),unlit,"temple" REGION:(13,06,18,08),lit,"ordinary" REGION:(20,04,30,14),unlit,"ordinary" REGION:(32,06,33,07),unlit,"ordinary" REGION:(35,06,36,07),unlit,"ordinary" REGION:(38,06,39,07),unlit,"ordinary" REGION:(41,06,42,07),unlit,"ordinary" REGION:(44,06,45,07),unlit,"ordinary" REGION:(47,06,48,07),unlit,"ordinary" REGION:(32,09,48,09),unlit,"ordinary" REGION:(32,11,33,12),unlit,"ordinary" REGION:(35,11,36,12),unlit,"ordinary" REGION:(38,11,39,12),unlit,"ordinary" REGION:(41,11,42,12),unlit,"ordinary" REGION:(44,11,45,12),unlit,"ordinary" REGION:(47,11,48,12),unlit,"ordinary" REGION:(50,04,60,14),lit,"ordinary" # Doors DOOR:locked,(19,06) DOOR:locked,(14,09) DOOR:locked,(31,09) DOOR:locked,(33,08) DOOR:locked,(36,08) DOOR:locked,(39,08) DOOR:locked,(42,08) DOOR:locked,(45,08) DOOR:locked,(48,08) DOOR:locked,(33,10) DOOR:locked,(36,10) DOOR:locked,(39,10) DOOR:locked,(42,10) DOOR:locked,(45,10) DOOR:locked,(48,10) DOOR:locked,(49,09) # Stairs STAIR:(55,05),up # Non diggable walls NON_DIGGABLE:(00,00,75,19) # The altar. This is not a shrine. ALTAR:(16,11),noncoaligned,altar # Objects OBJECT:'"',"amulet of ESP",(16,11),blessed,0,"The Eye of the Aethiopica" OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,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:'@',"Dark One",(16,11) MONSTER:'B',random,random,hostile MONSTER:'B',random,random,hostile MONSTER:'B',random,random,hostile MONSTER:'B',random,random,hostile MONSTER:'B',random,random,hostile MONSTER:'B',random,random,hostile MONSTER:'B',random,random,hostile MONSTER:'B',random,random,hostile MONSTER:'B',random,random,hostile MONSTER:'B',random,random,hostile MONSTER:'B',random,random,hostile MONSTER:'i',random,random,hostile MONSTER:'i',random,random,hostile MONSTER:'i',random,random,hostile MONSTER:'i',random,random,hostile MONSTER:'i',random,random,hostile MONSTER:'i',random,random,hostile MONSTER:'i',random,random,hostile MONSTER:'B',"vampire bat",random MONSTER:'B',"vampire bat",random MONSTER:'B',"vampire bat",random MONSTER:'B',"vampire bat",random MONSTER:'B',"vampire bat",random MONSTER:'B',"vampire bat",random MONSTER:'B',"vampire bat",random MONSTER:'B',"vampire bat",random MONSTER:'i',random,random,hostile # Captive Monsters in the dungeon MONSTER:'@',"rogue",(35,06),peaceful,"Pug" MONSTER:'Y',"owlbear",(47,06),peaceful,asleep MONSTER:'@',"wizard",(32,11),peaceful,asleep,"Newt" 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. # # These levels are used to fill out any levels not occupied by specific # levels as defined above. "filla" is the upper filler, between the # start and locate levels, and "fillb" the lower between the locate # and goal levels. # LEVEL: "Wiz-fila" # ROOM: "ordinary" , random, random, random, random STAIR: random, up OBJECT: random,random,random MONSTER: 'i', random, random, hostile ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random OBJECT: random,random,random MONSTER: 'i', random, random, hostile ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random TRAP: random, random OBJECT: random,random,random MONSTER: 'B', "vampire bat", random MONSTER: 'B', "vampire bat", random ROOM: "ordinary" , random, random, random, random STAIR: random, down OBJECT: random, random, random TRAP: random, random MONSTER: 'i', random, random, hostile MONSTER: 'B', "vampire bat", random ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random OBJECT: random, random, random TRAP: random, random MONSTER: 'i', random, random, hostile ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random TRAP: random, random MONSTER: 'B', "vampire bat", random RANDOM_CORRIDORS LEVEL: "Wiz-filb" # ROOM: "ordinary" , random, random, random, random STAIR: random, up OBJECT: random,random,random MONSTER: 'X', random, random, hostile ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random OBJECT: random,random,random MONSTER: 'i', random, random, hostile ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random TRAP: random, random OBJECT: random,random,random MONSTER: 'X', random, random, hostile ROOM: "ordinary" , random, random, random, random STAIR: random, down OBJECT: random, random, random TRAP: random, random MONSTER: 'i', random, random, hostile MONSTER: 'B', "vampire bat", random ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random OBJECT: random, random, random TRAP: random, random MONSTER: 'i', random, random, hostile ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random TRAP: random, random MONSTER: 'B', "vampire bat", random RANDOM_CORRIDORS slashem-0.0.7E7F3/dat/stor-1.des0000664000076400007640000000214610545462317014251 0ustar aliali# # Storage level (#1) # LEVEL: "stor-1" ROOM: "ordinary", unlit, random, random, (4,4) NAME: "central" OBJECT:'(',"chest",(2,2) OBJECT:'/',random,(2,2) OBJECT:'(',random,(2,2) OBJECT:'(',random,(2,2) OBJECT:'"',random,(2,2) OBJECT:'=',random,(2,2) ENGRAVING:(2,2),burn,"Begone! Keep Off! Shoo!" TRAP: random, random TRAP: random, random TRAP: random, random ROOM: "ordinary" , random, random, random, random STAIR: random, up OBJECT: random,random,random MONSTER: random, random, random, hostile ROOM: "ordinary" , random, random, random, random STAIR: random, down OBJECT: random, random, random TRAP: random, random MONSTER: random, random, random, hostile ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random OBJECT: random, random, random MONSTER: random, random, random, hostile ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random TRAP: random, random MONSTER: random, random, random, hostile ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random TRAP: random, random MONSTER: random, random, random, hostile RANDOM_CORRIDORS slashem-0.0.7E7F3/dat/mall-1.des0000664000076400007640000000505010545462317014204 0ustar aliali# SCCS Id: @(#)mall-1.des 3.4 1993/02/23 # Copyright (c) 1989 by Jean-Christophe Collet # Copyright (c) 1991 by M. Stephenson # NetHack may be freely redistributed. See license for details. # LEVEL: "mall-1" MESSAGE: "You hear the sounds of civilization." RANDOM_MONSTERS:'@','r' ROOM: "ordinary" , lit, random, random, (48,15) NAME: "town" FOUNTAIN: (20, 7) # # The Town Watch. # MONSTER: '@', "watchman", random, peaceful MONSTER: '@', "watchman", random, peaceful MONSTER: '@', "watchman", random, peaceful MONSTER: '@', "watchman", random, peaceful MONSTER: '@', "watch captain", random, peaceful MONSTER: '@', "watch captain", random, peaceful MONSTER: '@', "watch captain", random, peaceful MONSTER: '@', "mugger", random, hostile MONSTER: '@', "mugger", random, hostile MONSTER: '@', "mugger", random, hostile MONSTER: '@', "mugger", random, hostile MONSTER: 'r', "sewer rat", random, hostile MONSTER: 'r', "sewer rat", random, hostile MONSTER: 'f', "kitten", random, hostile SUBROOM: "tool shop" , lit, (2,2), (6,4), "town" CHANCE: 20 DOOR: false, open, south, random SUBROOM: "food shop", lit, (2,9), (6,4), "town" CHANCE: 40 DOOR: false, open, north, random SUBROOM: "scroll shop", unlit, (9,2), (6,4), "town" CHANCE: 20 DOOR: false, open, south, random SUBROOM: "potion shop", lit, (9,9), (6,4), "town" CHANCE: 30 DOOR: false, open, north, random SUBROOM: "ring shop", lit, (16,2), (4,3), "town" CHANCE: 12 DOOR: false, open, south, random SUBROOM: "candle shop", lit, (23,2), (6,3), "town" CHANCE: 33 DOOR: false, open, south, random SUBROOM: "book shop", lit, (16,10), (4,3), "town" CHANCE: 12 DOOR: false, open, east, random # WAC Changed chance from 20 to 100. Should be at least 1 guaranteed shop SUBROOM: "shop", lit, (23,9), (10,4), "town" #CHANCE: 20 DOOR: false, open, north, random SUBROOM: "wand shop", lit, (33,2), (3,3), "town" CHANCE: 17 DOOR: false, open, west, random SUBROOM: "weapon shop", lit, (39,2), (7,4), "town" CHANCE: 20 DOOR: false, open, south, random SUBROOM: "armor shop", unlit, (38,10), (7,3), "town" CHANCE: 22 DOOR: false, open, north, random ROOM: "ordinary" , random, random, random, random STAIR: random, up STAIR: random, down MONSTER: random, random, random ROOM: "ordinary" , random, random, random, random MONSTER: random, random, random OBJECT: random, random, random ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random ROOM: "ordinary" , random, random, random, random MONSTER: random, random, random OBJECT: random, random, random TRAP: random, random RANDOM_CORRIDORS slashem-0.0.7E7F3/dat/Priest.des0000664000076400007640000002355010545462317014374 0ustar aliali# SCCS Id: @(#)Priest.des 3.4 2002/04/08 # Copyright (c) 1989 by Jean-Christophe Collet # Copyright (c) 1991-2 by M. Stephenson # NetHack may be freely redistributed. See license for details. # # The "start" level for the quest. # # Here you meet your (besieged) class leader, High Priest # and receive your quest assignment. # MAZE: "Pri-strt",' ' FLAGS: noteleport,hardfloor GEOMETRY:center,center MAP ............................................................................ ............................................................................ ............................................................................ ....................------------------------------------.................... ....................|................|.....|.....|.....|.................... ....................|..------------..|--+-----+-----+--|.................... ....................|..|..........|..|.................|.................... ....................|..|..........|..|+---+---+-----+--|.................... ..................---..|..........|......|...|...|.....|.................... ..................+....|..........+......|...|...|.....|.................... ..................+....|..........+......|...|...|.....|.................... ..................---..|..........|......|...|...|.....|.................... ....................|..|..........|..|+-----+---+---+--|.................... ....................|..|..........|..|.................|.................... ....................|..------------..|--+-----+-----+--|.................... ....................|................|.....|.....|.....|.................... ....................------------------------------------.................... ............................................................................ ............................................................................ ............................................................................ ENDMAP # Dungeon Description REGION:(00,00,75,19),lit,"ordinary" REGION:(24,06,33,13),lit,"temple" # Portal arrival point BRANCH:(05,04,05,04),(0,0,0,0) # Stairs STAIR:(52,09),down # Doors DOOR:locked,(18,09) DOOR:locked,(18,10) DOOR:closed,(34,09) DOOR:closed,(34,10) DOOR:closed,(40,05) DOOR:closed,(46,05) DOOR:closed,(52,05) DOOR:locked,(38,07) DOOR:closed,(42,07) DOOR:closed,(46,07) DOOR:closed,(52,07) DOOR:locked,(38,12) DOOR:closed,(44,12) DOOR:closed,(48,12) DOOR:closed,(52,12) DOOR:closed,(40,14) DOOR:closed,(46,14) DOOR:closed,(52,14) # Unattended Altar - unaligned due to conflict - player must align it. ALTAR:(28,09),noalign,altar # High Priest MONSTER:'@',"Arch Priest",(28,10) # The treasure of High Priest OBJECT:'(',"chest",(27,10) # knight guards for the audience chamber MONSTER:'@',"acolyte",(32,07) MONSTER:'@',"acolyte",(32,08) MONSTER:'@',"acolyte",(32,11) MONSTER:'@',"acolyte",(32,12) MONSTER:'@',"acolyte",(33,07) MONSTER:'@',"acolyte",(33,08) MONSTER:'@',"acolyte",(33,11) MONSTER:'@',"acolyte",(33,12) # Non diggable walls NON_DIGGABLE:(00,00,75,19) # Random traps TRAP:"dart",(20,09) TRAP:"dart",(20,10) TRAP:random,random TRAP:random,random TRAP:random,random TRAP:random,random # Monsters on siege duty. MONSTER: 'Z',"human zombie",(37,01) MONSTER: 'Z',"human zombie",(37,18) MONSTER: 'Z',"human zombie",(03,03) MONSTER: 'Z',"human zombie",(65,04) MONSTER: 'Z',"human zombie",(12,11) MONSTER: 'Z',"human zombie",(60,12) MONSTER: 'Z',"human zombie",(14,08) MONSTER: 'Z',"human zombie",(55,00) MONSTER: 'Z',"human zombie",(18,18) MONSTER: 'Z',"human zombie",(59,10) MONSTER: 'Z',"human zombie",(13,09) MONSTER: 'Z',"human zombie",(01,17) # # The "locate" level for the quest. # # Here you have to locate the Temple of Nalzok to go # further towards your assigned quest. # MAZE: "Pri-loca",' ' FLAGS: hardfloor # This is a kludge to init the level as a lit field. INIT_MAP: '.' , '.' , false , false , lit , false GEOMETRY:center,center MAP ........................................ ........................................ ..........----------+----------......... ..........|........|.|........|......... ..........|........|.|........|......... ..........|----.----.----.----|......... ..........+...................+......... ..........+...................+......... ..........|----.----.----.----|......... ..........|........|.|........|......... ..........|........|.|........|......... ..........----------+----------......... ........................................ ........................................ ENDMAP # Dungeon Description REGION:(00,00,09,13),unlit,"morgue" REGION:(09,00,30,01),unlit,"morgue" REGION:(09,12,30,13),unlit,"morgue" REGION:(31,00,39,13),unlit,"morgue" REGION:(11,03,29,10),lit,"temple",filled,true # The altar inside the temple ALTAR:(20,07),noalign,shrine MONSTER:'@',"aligned priest",(20,07),noalign,hostile # Doors DOOR:locked,(10,06) DOOR:locked,(10,07) DOOR:locked,(20,02) DOOR:locked,(20,11) DOOR:locked,(30,06) DOOR:locked,(30,07) # Stairs # Note: The up stairs are *intentionally* off of the map. STAIR:(43,05),up STAIR:(20,06),down # Non diggable walls NON_DIGGABLE:(10,02,30,13) # Objects (inside the antechambers). OBJECT:random,random,(14,03) OBJECT:random,random,(15,03) OBJECT:random,random,(16,03) OBJECT:random,random,(14,10) OBJECT:random,random,(15,10) OBJECT:random,random,(16,10) OBJECT:random,random,(17,10) OBJECT:random,random,(24,03) OBJECT:random,random,(25,03) OBJECT:random,random,(26,03) OBJECT:random,random,(27,03) OBJECT:random,random,(24,10) OBJECT:random,random,(25,10) OBJECT:random,random,(26,10) OBJECT:random,random,(27,10) # Random traps TRAP:random,(15,04) TRAP:random,(25,04) TRAP:random,(15,09) TRAP:random,(25,09) TRAP:random,random TRAP:random,random # No random monsters - the morgue generation will put them in. # # The "goal" level for the quest. # # Here you meet Nalzok your nemesis monster. You have to # defeat Nalzok in combat to gain the artifact you have # been assigned to retrieve. # MAZE: "Pri-goal", ' ' INIT_MAP: 'L' , '.' , false , false , unlit , false GEOMETRY:center,center MAP .L......L.LLL.......LL.... .LLL.......L......LL...... LL.LL.............L.LL.... .......................... ......................LL.. ......................LLL. LL........................ .LL....................... .LL................LL.L... ..LL.....L.LL.......LLL... .........LLL.........L.... ENDMAP # Dungeon Description RANDOM_PLACES:(14,04),(13,07) REGION:(00,00,25,10),unlit,"ordinary" # Stairs STAIR:(20,05),up # Objects OBJECT:'[',"helm of brilliance",place[0],blessed,0,"The Mitre of Holiness" OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random # Random traps TRAP:"fire",random TRAP:"fire",random TRAP:"fire",random TRAP:"fire",random TRAP:random,random TRAP:random,random # Random monsters. MONSTER:'&',"Nalzok",place[0] MONSTER:'Z',"human zombie",random MONSTER:'Z',"human zombie",random MONSTER:'Z',"human zombie",random MONSTER:'Z',"human zombie",random MONSTER:'Z',"human zombie",random MONSTER:'Z',"human zombie",random MONSTER:'Z',"human zombie",random MONSTER:'Z',"human zombie",random MONSTER:'Z',"human zombie",random MONSTER:'Z',"human zombie",random MONSTER:'Z',"human zombie",random MONSTER:'Z',"human zombie",random MONSTER:'Z',"human zombie",random MONSTER:'Z',"human zombie",random MONSTER:'Z',"human zombie",random MONSTER:'Z',"human zombie",random MONSTER:'Z',random,random MONSTER:'Z',random,random MONSTER:'W',"wraith",random MONSTER:'W',"wraith",random MONSTER:'W',"wraith",random MONSTER:'W',"wraith",random MONSTER:'W',"wraith",random MONSTER:'W',"wraith",random MONSTER:'W',"wraith",random MONSTER:'W',"wraith",random MONSTER:'W',random,random # # The "fill" levels for the quest. # # These levels are used to fill out any levels not occupied by specific # levels as defined above. "filla" is the upper filler, between the # start and locate levels, and "fillb" the lower between the locate # and goal levels. # LEVEL: "Pri-fila" # ROOM: "ordinary" , random, random, random, random STAIR: random, up OBJECT: random,random,random MONSTER: 'Z', "human zombie", random ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random OBJECT: random,random,random ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random TRAP: random, random OBJECT: random,random,random MONSTER: 'Z', "human zombie", random ROOM: "morgue" , random, random, random, random STAIR: random, down OBJECT: random, random, random TRAP: random, random ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random OBJECT: random, random, random TRAP: random, random MONSTER: 'W', "wraith", random ROOM: "morgue" , random, random, random, random OBJECT: random, random, random TRAP: random, random RANDOM_CORRIDORS LEVEL: "Pri-filb" # ROOM: "ordinary" , random, random, random, random STAIR: random, up OBJECT: random,random,random MONSTER: 'Z', "human zombie", random MONSTER: 'W', "wraith", random ROOM: "morgue" , random, random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random,random,random ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random TRAP: random, random OBJECT: random,random,random MONSTER: 'Z', "human zombie", random MONSTER: 'W', "wraith", random ROOM: "morgue" , random, random, random, random STAIR: random, down OBJECT: random, random, random OBJECT: random, random, random TRAP: random, random ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random OBJECT: random, random, random TRAP: random, random MONSTER: 'Z', "human zombie", random MONSTER: 'W', "wraith", random ROOM: "morgue" , random, random, random, random OBJECT: random, random, random TRAP: random, random RANDOM_CORRIDORS slashem-0.0.7E7F3/dat/Samurai.des0000664000076400007640000003233010545462317014523 0ustar aliali# SCCS Id: @(#)Samurai.des 3.4 2002/04/08 # 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. # # The "start" level for the quest. # # Here you meet your (besieged) class leader, Lord Sato # and receive your quest assignment. # MAZE: "Sam-strt",' ' FLAGS: noteleport,hardfloor GEOMETRY:center,center MAP ..............................................................PP............ ...............................................................PP........... ..........---------------------------------------------------...PPP......... ..........|......|.........|...|..............|...|.........|....PPPPP...... ......... |......|.........S...|..............|...S.........|.....PPPP...... ..........|......|.........|---|..............|---|.........|.....PPP....... ..........+......|.........+...-------++-------...+.........|......PP....... ..........+......|.........|......................|.........|......PP....... ......... |......---------------------++--------------------|........PP..... ..........|.................................................|.........PP.... ..........|.................................................|...........PP.. ..........----------------------------------------...-------|............PP. ..........................................|.................|.............PP .............. ................. .........|.................|..............P ............. } ............... } ........|.................|............... .............. ........PP....... .........|.................|............... .....................PPP..................|.................|............... ......................PP..................-------------------............... ............................................................................ ............................................................................ ENDMAP # Dungeon Description REGION:(00,00,75,19),lit,"ordinary" REGION:(18,03,26,07),lit,"throne",unfilled # Portal arrival zone BRANCH:(62,12,70,17),(0,0,0,0) # Stairs STAIR:(29,04),down # Doors DOOR:locked,(10,06) DOOR:locked,(10,07) DOOR:closed,(27,04) DOOR:closed,(27,06) DOOR:closed,(38,06) DOOR:locked,(38,08) DOOR:closed,(39,06) DOOR:locked,(39,08) DOOR:closed,(50,04) DOOR:closed,(50,06) # Lord Sato MONSTER:'@',"Lord Sato",(20,04) # The treasure of Lord Sato OBJECT:'(',"chest",(20,04) # roshi guards for the audience chamber MONSTER:'@',"roshi",(18,04) MONSTER:'@',"roshi",(18,05) MONSTER:'@',"roshi",(18,06) MONSTER:'@',"roshi",(18,07) MONSTER:'@',"roshi",(26,04) MONSTER:'@',"roshi",(26,05) MONSTER:'@',"roshi",(26,06) MONSTER:'@',"roshi",(26,07) # Non diggable walls NON_DIGGABLE:(00,00,75,19) # Random traps TRAP:random,random TRAP:random,random TRAP:random,random TRAP:random,random TRAP:random,random TRAP:random,random # Monsters on siege duty. MONSTER: '@',"ninja",(64,00),hostile MONSTER: 'd',"wolf",(65,01) MONSTER: '@',"ninja",(67,02),hostile MONSTER: '@',"ninja",(69,05),hostile MONSTER: '@',"ninja",(69,06),hostile MONSTER: 'd',"wolf",(69,07) MONSTER: '@',"ninja",(70,06),hostile MONSTER: '@',"ninja",(70,07),hostile MONSTER: '@',"ninja",(72,01),hostile MONSTER: 'd',"wolf",(75,09) MONSTER: '@',"ninja",(73,05),hostile MONSTER: '@',"ninja",(68,02),hostile MONSTER:'E',"stalker",random # # The "locate" level for the quest. # # Here you have to invade the Shogun's Castle to go # further towards your assigned quest. # MAZE: "Sam-loca",' ' FLAGS: hardfloor GEOMETRY:center,center MAP ............................................................................ ............................................................................ ........-----..................................................-----........ ........|...|..................................................|...|........ ........|...---..}..--+------------------------------+--..}..---...|........ ........|-|...|.....|...|....|....|....|....|....|.|...|.....|...|-|........ ..........|...-------...|....|....|....|....|....S.|...-------...|.......... ..........|-|.........------+----+-+-------+-+--------.........|-|.......... ............|..--------.|}........................}|.--------..|............ ............|..+........+..........................+........+..|............ ............|..+........+..........................+........+..|............ ............|..--------.|}........................}|.--------..|............ ..........|-|.........--------+-+-------+-+----+------.........|-|.......... ..........|...-------...|.S....|....|....|....|....|...-------...|.......... ........|-|...|.....|...|.|....|....|....|....|....|...|.....|...|-|........ ........|...---..}..--+------------------------------+--..}..---...|........ ........|...|..................................................|...|........ ........-----..................................................-----........ ............................................................................ ............................................................................ ENDMAP # Dungeon Description REGION:(00,00,75,19),lit,"ordinary" # Doors DOOR:locked,(22,04) DOOR:locked,(22,15) DOOR:locked,(53,04) DOOR:locked,(53,15) DOOR:locked,(49,06) DOOR:locked,(26,13) DOOR:locked,(28,07) DOOR:locked,(30,12) DOOR:locked,(33,07) DOOR:locked,(32,12) DOOR:locked,(35,07) DOOR:locked,(40,12) DOOR:locked,(43,07) DOOR:locked,(42,12) DOOR:locked,(45,07) DOOR:locked,(47,12) DOOR:closed,(15,09) DOOR:closed,(15,10) DOOR:closed,(24,09) DOOR:closed,(24,10) DOOR:closed,(51,09) DOOR:closed,(51,10) DOOR:closed,(60,09) DOOR:closed,(60,10) # Stairs STAIR:(10,10),up STAIR:(25,14),down # Non diggable walls NON_DIGGABLE:(00,00,75,19) # Objects OBJECT:'*',random,(25,05) OBJECT:'*',random,(26,05) OBJECT:'*',random,(27,05) OBJECT:'*',random,(28,05) OBJECT:'*',random,(25,06) OBJECT:'*',random,(26,06) OBJECT:'*',random,(27,06) OBJECT:'*',random,(28,06) # OBJECT:'[',random,(40,05) OBJECT:'[',random,(41,05) OBJECT:'[',random,(42,05) OBJECT:'[',random,(43,05) OBJECT:'[',random,(40,06) OBJECT:'[',random,(41,06) OBJECT:'[',random,(42,06) OBJECT:'[',random,(43,06) # OBJECT:')',random,(27,13) OBJECT:')',random,(28,13) OBJECT:')',random,(29,13) OBJECT:')',random,(30,13) OBJECT:')',random,(27,14) OBJECT:')',random,(28,14) OBJECT:')',random,(29,14) OBJECT:')',random,(30,14) # OBJECT:'(',random,(37,13) OBJECT:'(',random,(38,13) OBJECT:'(',random,(39,13) OBJECT:'(',random,(40,13) OBJECT:'(',random,(37,14) OBJECT:'(',random,(38,14) OBJECT:'(',random,(39,14) OBJECT:'(',random,(40,14) # Random traps TRAP:random,random TRAP:random,random TRAP:random,random TRAP:random,random TRAP:random,random TRAP:random,random # Random monsters. MONSTER:'@',"ninja",(15,05),hostile MONSTER:'@',"ninja",(16,05),hostile MONSTER:'d',"wolf",(17,05) MONSTER:'d',"wolf",(18,05) MONSTER:'@',"ninja",(19,05),hostile MONSTER:'d',"wolf",(15,14) MONSTER:'d',"wolf",(16,14) MONSTER:'@',"ninja",(17,14),hostile MONSTER:'@',"ninja",(18,14),hostile MONSTER:'d',"wolf",(56,05) MONSTER:'@',"ninja",(57,05),hostile MONSTER:'d',"wolf",(58,05) MONSTER:'d',"wolf",(59,05) MONSTER:'@',"ninja",(56,14),hostile MONSTER:'d',"wolf",(57,14) MONSTER:'@',"ninja",(58,14),hostile MONSTER:'d',random,(59,14) MONSTER:'d',"wolf",(60,14) MONSTER:'E',"stalker",random MONSTER:'E',"stalker",random MONSTER:'E',"stalker",random MONSTER:'E',"stalker",random MONSTER:'E',"stalker",random MONSTER:'E',"stalker",random MONSTER:'E',"stalker",random MONSTER:'E',"stalker",random MONSTER:'E',"stalker",random # "guards" for the central courtyard. MONSTER:'@',"samurai",(30,05),hostile MONSTER:'@',"samurai",(31,05),hostile MONSTER:'@',"samurai",(32,05),hostile MONSTER:'@',"samurai",(32,14),hostile MONSTER:'@',"samurai",(33,14),hostile MONSTER:'@',"samurai",(34,14),hostile # # The "goal" level for the quest. # # Here you meet Takauji, your nemesis monster. You have to # defeat him in combat to gain the artifact you have been # assigned to retrieve. # MAZE: "Sam-goal", ' ' FLAGS: noteleport GEOMETRY:center,center MAP ....................... ......---------.---------...... ......----.................----...... ....----.....-------------.....----.... ....--.....----...........----.....--.... ...||....---....---------....---....||... ...|....--....---.......---....--....|... ....|...||...---...--+--...---...||...|.... ....|...|....|....|-...-|....|....|...|.... ....|...|....|....+.....+....|........|.... ....|...|....|....|-...-|....|....|...|.... ....|...||...---...--+--...---...||...|.... ...|....--....---.......---....--....|... ...||....---....----.----....---....||... ....--.....----...........----.....--.... ....----.....-------------.....----.... ......----.................----...... ......-------------------...... ....................... ENDMAP # Dungeon Description RANDOM_PLACES:(02,11),(42,09) REGION:(00,00,44,19),unlit,"ordinary" # Doors DOOR:closed,(19,10) DOOR:closed,(22,08) DOOR:closed,(22,12) DOOR:closed,(25,10) # Stairs STAIR:place[0],up # Non diggable walls NON_DIGGABLE:(00,00,44,19) # Objects OBJECT:')',"tsurugi",(22,10),blessed,0,"The Tsurugi of Muramasa" OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random # TRAP:"board",(22,09) TRAP:"board",(24,10) TRAP:"board",(22,11) # Random traps TRAP:random,random TRAP:random,random TRAP:random,random TRAP:random,random TRAP:random,random TRAP:random,random # Random monsters. MONSTER:'@',"Ashikaga Takauji",(22,10) MONSTER:'@',"samurai",random,hostile MONSTER:'@',"samurai",random,hostile MONSTER:'@',"samurai",random,hostile MONSTER:'@',"samurai",random,hostile MONSTER:'@',"samurai",random,hostile MONSTER:'@',"ninja",random,hostile MONSTER:'@',"ninja",random,hostile MONSTER:'@',"ninja",random,hostile MONSTER:'@',"ninja",random,hostile MONSTER:'@',"ninja",random,hostile MONSTER:'d',"wolf",random MONSTER:'d',"wolf",random MONSTER:'d',"wolf",random MONSTER:'d',"wolf",random MONSTER:'d',random,random MONSTER:'d',random,random MONSTER:'E',"stalker",random MONSTER:'E',"stalker",random MONSTER:'E',"stalker",random MONSTER:'E',"stalker",random MONSTER:'E',"stalker",random MONSTER:'E',"stalker",random MONSTER:'E',"stalker",random MONSTER:'E',"stalker",random MONSTER:'E',"stalker",random # # The "fill" levels for the quest. # # These levels are used to fill out any levels not occupied by specific # levels as defined above. "filla" is the upper filler, between the # start and locate levels, and "fillb" the lower between the locate # and goal levels. # MAZE: "Sam-fila", ' ' INIT_MAP: '.' , 'P', true, true, random, true NOMAP # STAIR: random, up STAIR: random, down # OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random # MONSTER: 'd', random, random MONSTER: 'd', "wolf", random MONSTER: 'd', "wolf", random MONSTER: 'd', "wolf", random MONSTER: 'd', "wolf", random MONSTER: 'd', "wolf", random MONSTER: 'E', "stalker", random # TRAP: random, random TRAP: random, random TRAP: random, random TRAP: random, random MAZE: "Sam-filb", ' ' GEOMETRY:center,center MAP ------------- ------------- |...........| |...........| |...-----...|----------------------------------|...-----...| |...| |...|..................................|...| |...| |...-----..........................................-----...| |...........|--S----------------------------S--|...........| ----...--------.|..........................|.--------...---- |...|........+..........................+........|...| |...|........+..........................+........|...| ----...--------.|..........................|.--------...---- |...........|--S----------------------------S--|...........| |...-----..........................................-----...| |...| |...|..................................|...| |...| |...-----...|----------------------------------|...-----...| |...........| |...........| ------------- ------------- ENDMAP REGION:(00,00,59,15),unlit,"ordinary" # Doors DOOR:closed,(16,07) DOOR:closed,(16,08) DOOR:closed,(43,07) DOOR:closed,(43,08) # STAIR: random, up STAIR: random, down # OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random # MONSTER: 'd', random, random MONSTER: 'd', "wolf", random MONSTER: 'd', "wolf", random MONSTER: 'd', "wolf", random MONSTER: 'd', "wolf", random MONSTER: 'E', "stalker", random MONSTER: 'E', "stalker", random MONSTER: 'E', "stalker", random # TRAP: random, random TRAP: random, random TRAP: random, random TRAP: random, random slashem-0.0.7E7F3/dat/rumors.fal0000664000076400007640000005571110545462317014450 0ustar aliali"So when I die, the first thing I will see in heaven is a score list?" 1st Law of Hacking: leaving is much more difficult than entering. 2nd Law of Hacking: first in, first out. 3rd Law of Hacking: the last blow counts most. 4th Law of Hacking: you will find the exit at the entrance. A babelfish lets you understand a leorotta. A chameleon imitating a mail daemon often delivers scrolls of fire. A cockatrice corpse is guaranteed to be untainted! A dead cockatrice is just a dead lizard. A dragon is just a snake that ate a scroll of fire. A fading corridor enlightens your insight. A glowing potion is too hot to drink. A good amulet may protect you against guards. A lizard corpse is a good thing to turn undead. A long worm can be defined recursively. So how should you attack it? A monstrous mind is a toy forever. A nymph will be very pleased if you call her by her real name: Lorelei. A ring of dungeon master control is a great find. A ring of extra ring finger is useless if not enchanted. A rope may form a trail in a maze. A staff may recharge if you drop it for awhile. A visit to the Zoo is very educational; you meet interesting animals. A wand of deaf is a more dangerous weapon than a wand of sheep. A wand of vibration might bring the whole cave crashing about your ears. A winner never quits. A quitter never wins. A wish? Okay, make me a fortune cookie! Afraid of mimics? Try to wear a ring of true seeing. All monsters are created evil, but some are more evil than others. Always attack a floating eye from behind! An elven cloak is always the height of fashion. Any small object that is accidentally dropped will hide under a larger object. Archeologists find more bones piles. Austin Powers says: My Mojo is back! Yeah, baby! Balrogs do not appear above level 20. Banana peels work especially well against Keystone Kops. Be careful when eating bananas. Monsters might slip on the peels. Better leave the dungeon; otherwise you might get hurt badly. Beware of the little people. Beware of the potion of nitroglycerin -- it's not for the weak of heart. Beware: there's always a chance that your wand explodes as you try to zap it! Beyond the 23rd level lies a happy retirement in a room of your own. Changing your suit without dropping your sword? You must be kidding! Close the door! You're letting the heat out! Cockatrices might turn themselves to stone faced with a mirror. Consumption of home-made food is strictly forbidden in this dungeon. Dark room? Your chance to develop your photographs! Dark rooms are not *completely* dark: just wait and let your eyes adjust... David London sez, "Hey guys, *WIELD* a lizard corpse against a cockatrice!" Death is just life's way of telling you you've been fired. Demi-gods don't need any help from the gods. Demons *HATE* Priests and Priestesses. Didn't you forget to pay? Didn't your mother tell you not to eat food off the floor? Direct a direct hit on your direct opponent, directing in the right direction. Do you want to make more money? Sure, we all do! Join the Fort Ludios guard! Does your boss know what you're doing right now? Don't bother wishing for things. You'll probably find one on the next level. Don't eat too much: you might start hiccoughing! Don't play NetHack at your work; your boss might hit you! Don't tell a soul you found a secret door, otherwise it isn't a secret anymore. Drinking potions of booze may land you in jail if you are under 21. 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! Ever lifted a dragon corpse? Ever seen a leocrotta dancing the tengu? Ever seen your weapon glow plaid? Ever tamed a shopkeeper? Ever tried digging through a Vault Guard? Ever tried enchanting a rope? Floating eyes can't stand Hawaiian shirts. For any remedy there is a misery. Giant bats turn into giant vampires. Good day for overcoming obstacles. Try a steeplechase. Half Moon tonight. (At least it's better than no Moon at all.) Help! I'm being held prisoner in a fortune cookie factory! Housecats have nine lives, kittens only one. How long can you tread water? Hungry? There is an abundance of food on the next level. I guess you've never hit a mail daemon with the Amulet of Yendor... If you are the shopkeeper, you can take things for free. If you ask really nicely, the Wizard will give you the Amulet. If you can't learn to do it well, learn to enjoy doing it badly. If you thought the Wizard was bad, just wait till you meet the Warlord! If you turn blind, don't expect your dog to be turned into a seeing-eye dog. If you want to feel great, you must eat something real big. If you want to float, you'd better eat a floating eye. If your ghost kills a player, it increases your score. Increase mindpower: Tame your own ghost! It furthers one to see the great man. It's easy to overlook a monster in a wood. Just below any trap door there may be another one. Just keep falling! Katanas are very sharp; watch you don't cut yourself. Keep a clear mind: quaff clear potions. Kicking the terminal doesn't hurt the monsters. Killer bees keep appearing till you kill their queen. Killer bunnies can be tamed with carrots only. Latest news? Put `rec.games.roguelike.nethack' in your .newsrc! Learn how to spell. Play NetHack! Leprechauns hide their gold in a secret room. Let your fingers do the walking on the yulkjhnb keys. Let's face it: this time you're not going to win. Let's have a party, drink a lot of booze. Liquor sellers do not drink; they hate to see you twice. Lunar eclipse tonight. May as well quit now! Meeting your own ghost decreases your luck considerably! Money to invest? Take it to the local branch of the Magic Memory Vault! Monsters come from nowhere to hit you everywhere. Monsters sleep because you are boring, not because they ever get tired. Most monsters prefer minced meat. That's why they are hitting you! Most of the bugs in NetHack are on the floor. Much ado Nothing Happens. Multi-player NetHack is a myth. NetHack is addictive. Too late, you're already hooked. Never ask a shopkeeper for a price list. Never burn a tree, unless you like getting whacked with a +5 shovel. Never eat with glowing hands! Never kill a Nazgul - Sauron will get terribly upset! Never mind the monsters hitting you: they just replace the charwomen. Never play leapfrog with a unicorn. Never step on a cursed engraving. Never swim with a camera: there's nothing to take pictures of. Never teach your pet rust monster to fetch. Never trust a random generator in magic fields. Never use a wand of death. No level contains two shops. The maze is no level. So... No part of this fortune may be reproduced, stored in a retrieval system, ... Not all rumors are as misleading as this one. Nymphs and nurses like beautiful rings. Nymphs are blondes. Are you a gentleman? Offering a unicorn a worthless piece of glass might prove to be fatal! Old hackers never die: young ones do. On Groundhog Day, you should play the same game over and over and over... One game to rule them all, one game to find them, one game to bring them all... One has to leave shops before closing time. One homunculus a day keeps the doctor away. One level further down somebody is getting killed, right now. Only a wizard can use a magic whistle. Only adventurers of evil alignment think of killing their dog. Only chaotic evils kill sleeping monsters. Only real trappers escape traps. Only real wizards can write scrolls. Operation OVERKILL has started now. Ouch. I hate when that happens. PLEASE ignore previous rumor. Polymorph into an ettin; meet your opponents face to face to face. Praying will frighten demons. Row (3x) that boat gently down the stream, Charon (4x), death is but a dream. Running is good for your legs. Screw up your courage! You've screwed up everything else. Scrolls fading? It's not the heat, it's the humidity. Seepage? Leaky pipes? Rising damp? Summon the plumber! Segmentation fault (core dumped). Shopkeepers are insured by Croesus himself! Shopkeepers sometimes die from old age. Some mazes (especially small ones) have no solutions, says man 6 maze. Some questions the Sphynx asks just *don't* have any answers. Sometimes "mu" is the answer. Sorry, no fortune this time. Better luck next cookie! Spare your scrolls of make-edible until it's really necessary! Stormbringer doesn't steal souls. People steal souls. Suddenly, the dungeon will collapse... Taming a mail daemon may cause a system security violation. The Ravenous Bugblatter Beast of Tralls seems to be concerned about your life. The crowd was so tough, the Stooges won't play the Dungeon anymore, nyuk nyuk. The leprechauns hide their treasure in a small hidden room. The longer the wand the better. The magic word is "XYZZY". The meek shall inherit your bones files. The mines are dark and deep, and I have levels to go before I sleep. The use of dynamite is dangerous. There are no worms in the UNIX version. There is a trap on this level! They say that Demogorgon, Asmodeus, Orcus, Yeenoghu & Juiblex is no law firm. They say that Geryon has an evil twin, beware! They say that Medusa would make a terrible pet. They say that NetHack bugs are Seldon planned. They say that NetHack comes in 256 flavors. They say that NetHack is just a computer game. They say that NetHack is more than just a computer game. They say that NetHack is never what it used to be. They say that a baby dragon is too small to hurt or help you. They say that a black pudding is simply a brown pudding gone bad. They say that a black sheep has 3 bags full of wool. They say that a blank scroll is like a blank check. They say that a cat named Morris has nine lives. They say that a desperate shopper might pay any price in a shop. They say that a diamond dog is everybody's best friend. They say that a dwarf lord can carry a pick-axe because his armor is light. They say that a floating eye can defeat Medusa. They say that a fortune only has 1 line and you can't read between it. They say that a fortune only has 1 line, but you can read between it. They say that a fountain looks nothing like a regularly erupting geyser. They say that a gold doubloon is worth more than its weight in gold. They say that a grid bug won't pay a shopkeeper for zapping you in a shop. They say that a gypsy could tell your fortune for a price. They say that a hacker named Alice once level teleported by using a mirror. They say that a hacker named David once slew a giant with a sling and a rock. They say that a hacker named Dorothy once rode a fog cloud to Oz. They say that a hacker named Mary once lost a white sheep in the mazes. They say that a helm of brilliance is not to be taken lightly. They say that a hot dog and a hell hound are the same thing. They say that a lamp named Aladdin's Lamp contains a djinni with 3 wishes. They say that a large dog named Lassie will lead you to the amulet. They say that a long sword is not a light sword. They say that a manes won't mince words with you. They say that a mind is a terrible thing to waste. They say that a plain nymph will only wear a wire ring in one ear. They say that a plumed hat could be a previously used crested helmet. They say that a potion of oil is difficult to grasp. They say that a potion of yogurt is a cancelled potion of sickness. They say that a purple worm is not a baby purple dragon. They say that a quivering blob tastes different than a gelatinous cube. They say that a runed broadsword named Stormbringer attracts vortices. They say that a scroll of summoning has other names. They say that a shaman can bestow blessings but usually doesn't. They say that a shaman will bless you for an eye of newt and wing of bat. They say that a shimmering gold shield is not a polished silver shield. They say that a spear will hit a neo-otyugh. (Do YOU know what that is?) They say that a spotted dragon is the ultimate shape changer. They say that a stethoscope is no good if you can only hear your heartbeat. They say that a succubus named Suzy will sometimes warn you of danger. They say that a wand of cancellation is not like a wand of polymorph. They say that a wood golem named Pinocchio would be easy to control. They say that after killing a dragon it's time for a change of scenery. They say that an amulet of strangulation is worse than ring around the collar. They say that an attic is the best place to hide your toys. They say that an axe named Cleaver once belonged to a hacker named Beaver. They say that an eye of newt and a wing of bat are double the trouble. They say that an incubus named Izzy sometimes makes women feel sensitive. They say that an opulent throne room is rarely a place to wish you'd be in. They say that an unlucky hacker once had a nose bleed at an altar and died. They say that and they say this but they never say never, never! They say that any quantum mechanic knows that speed kills. They say that applying a unicorn horn means you've missed the point. They say that archeologists find more bones piles. They say that blue stones are radioactive, beware. They say that building a dungeon is a team effort. They say that chaotic characters never get a kick out of altars. They say that chemical knowledge is useless without proper equipment. They say that collapsing a dungeon often creates a panic. They say that counting your eggs before they hatch shows that you care. 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. They say that everyone wanted rec.games.hack to undergo a name change. They say that finding a winning strategy is a deliberate move on your part. They say that finding worthless glass is worth something. They say that fortune cookies are food for thought. They say that gold is only wasted on a pet dragon. They say that good things come to those that wait. They say that greased objects will slip out of monsters' hands. They say that if I had a million dollars, I'd buy you a monkey. They say that if you can't spell then you'll wish you had a spell book. They say that if you live by the sword, you'll die by the sword. They say that if you play like a monster you'll have a better game. They say that if you sleep with a demon you might awake with a headache. They say that if you step on a crack you could break your mother's back. They say that if you're invisible you can still be heard! They say that if you're lucky you can feel the runes on a scroll. They say that in the big picture gold is only small change. They say that in the dungeon it's not what you know that really matters. They say that in the dungeon moon rocks are really dilithium crystals. They say that in the dungeon the boorish customer is never right. They say that in the dungeon you don't need a watch to tell time. They say that in the dungeon you need something old, new, burrowed and blue. They say that in the dungeon you should always count your blessings. They say that iron golem plate mail isn't worth wishing for. They say that it takes four quarterstaffs to make one staff. They say that it's not over till the fat ladies sing. They say that it's not over till the fat lady shouts `Off with its head'. They say that kicking a heavy statue is really a dumb move. They say that kicking a valuable gem doesn't seem to make sense. They say that leprechauns know Latin and you should too. They say that minotaurs get lost outside of the mazes. They say that most trolls are born again. They say that naming your cat Garfield will make you more attractive. They say that no one knows everything about everything in the dungeon. They say that no one plays NetHack just for the fun of it. They say that no one really subscribes to rec.games.roguelike.nethack. They say that no one will admit to starting a rumor. They say that nurses sometimes carry scalpels and never use them. They say that once you've met one wizard you've met them all. They say that one troll is worth 10,000 newts. They say that only David can find the zoo! They say that only angels play their harps for their pets. They say that only big spenders carry gold. They say that only female monsters can lay eggs. They say that orc shamans are healthy, wealthy and wise. They say that playing NetHack is like walking into a death trap. They say that problem breathing is best treated by a proper diet. They say that quaffing many potions of levitation can give you a headache. They say that queen bees get that way by eating royal jelly. They say that reading a scare monster scroll is the same as saying Elbereth. They say that real hackers always are controlled. They say that real hackers never sleep. They say that shopkeepers are insured by Croesus himself! They say that shopkeepers never carry more than 20 gold pieces, at night. They say that shopkeepers never sell blessed potions of invisibility. They say that soldiers wear kid gloves and silly helmets. They say that some Kops are on the take. They say that some guards' palms can be greased. They say that some monsters may kiss your boots to stop your drum playing. They say that sometimes you can be the hit of the party when playing a horn. They say that the NetHack gods generally welcome your sacrifices. 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. They say that the way to make a unicorn happy is to give it what it wants. They say that there are no black or white stones, only gray. They say that there are no skeletons hence there are no skeleton keys. They say that there is a clever rogue in every hacker just dying to escape. They say that there is no such thing as free advice. They say that there is only one way to win at NetHack. They say that there once was a fearsome chaotic samurai named Luk No. They say that there was a time when cursed holy water wasn't water. They say that there's no point in crying over a gray ooze. They say that there's only hope left after you've opened Pandora's box. They say that trap doors should always be marked `Caution: Trap Door'. They say that using an amulet of change isn't a difficult operation. They say that water walking boots are better if you are fast like Hermes. They say that when you wear a circular amulet you might resemble a troll. They say that when you're hungry you can get a pizza in 30 moves or it's free. They say that when your god is angry you should try another one. They say that wielding a unicorn horn takes strength. They say that with speed boots you never worry about hit and run accidents. They say that you can defeat a killer bee with a unicorn horn. They say that you can only cross the River Styx in Charon's boat. They say that you can only kill a lich once and then you'd better be careful. They say that you can only wish for things you've already had. They say that you can train a cat by talking gently to it. They say that you can train a dog by talking firmly to it. They say that you can trust your gold with the king. They say that you can't wipe your greasy bare hands on a blank scroll. They say that you cannot trust scrolls of rumor. They say that you could fall head over heels for an energy vortex. They say that you need a key in order to open locked doors. They say that you need a mirror to notice a mimic in an antique shop. They say that you really can use a pick-axe unless you really can't. They say that you should always store your tools in the cellar. They say that you should be careful while climbing the ladder to success. They say that you should call your armor `rustproof'. They say that you should name your dog Spuds to have a cool pet. They say that you should name your weapon after your first monster kill. They say that you should not bother flaming USENETers; they're fire resistant. They say that you should never introduce a rope golem to a succubus. They say that you should never sleep near invisible ring wraiths. They say that you should never try to leave the dungeon with a bag of gems. They say that you should remove your armor before sitting on a throne. They say the gods get angry if you kill your dog. This fortune cookie is copy protected. This fortune cookie is the property of Fortune Cookies, Inc. This release contains 10% recycled material. Time stands still as the succubus changes her calendar to January 1, 2000. Tired? Try a scroll of charging on yourself. To achieve the next higher rating, you need 3 more points. To reach heaven, escape the dungeon while wearing a ring of levitation. Tourists wear shirts loud enough to wake the dead. Tridents are for use underwater. Try calling your katana Moulinette. Waltz, dumb nymph, for quick jigs vex. Ulch! That meat was painted! Unfortunately, this message was left intentionally blank. Using a morning star in the evening has no effect. Waltz, dumb nymph, for quick jigs vex. Want a hint? Zap a wand of make invisible on your weapon! Want to ascend in a hurry? Apply at Gizmonic Institute. Wanted: shopkeepers. Send a scroll of mail to Mage of Yendor/Level 35/Dungeon. Warning: fortune reading can be hazardous to your health. We have new ways of detecting treachery... Wet towels make great weapons! What a pity, you cannot read it! Whatever can go wrong, will go wrong. When a piercer drops in on you, you will be tempted to hit the ceiling! When in a maze follow the right wall and you will never get lost. When you have a key, you don't have to wait for the guard. Why are you wasting time reading fortunes? Wish for a master key and open the Magic Memory Vault! Wizard expects every monster to do its duty. Wow! You could've had a potion of fruit juice! Yet Another Silly Message (YASM). You are destined to be misled by a fortune. You can get a genuine Amulet of Yendor by doing the following: --More-- You can make holy water by boiling the hell out of it. 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! You may get rich selling letters, but beware of being blackmailed! You offend Shai-Hulud by sheathing your crysknife without having drawn blood. You swallowed the fortune! You want to regain strength? Two levels ahead is a guesthouse! You will encounter a tall, dark, and gruesome creature... slashem-0.0.7E7F3/dat/Arch.des0000664000076400007640000003605010545462317014002 0ustar aliali# 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. # # The "start" level for the quest. # # Here you meet your (besieged) class leader, Lord Carnarvon # and receive your quest assignment. # MAZE: "Arc-strt",' ' FLAGS: noteleport,hardfloor GEOMETRY:center,center MAP ............................................................................ ............................................................................ ............................................................................ ............................................................................ ....................}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}................. ....................}-------------------------------------}................. ....................}|..S......+.................+.......|}................. ....................}-S---------------+----------|.......|}................. ....................}|.|...............|.......+.|.......|}................. ....................}|.|...............---------.---------}................. ....................}|.S.\.............+.................+.................. ....................}|.|...............---------.---------}................. ....................}|.|...............|.......+.|.......|}................. ....................}-S---------------+----------|.......|}................. ....................}|..S......+.................+.......|}................. ....................}-------------------------------------}................. ....................}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}................. ............................................................................ ............................................................................ ............................................................................ ENDMAP # Dungeon Description REGION:(00,00,75,19),lit,"ordinary" REGION: (22,06,23,06),unlit,"ordinary" REGION: (25,06,30,06),unlit,"ordinary" REGION: (32,06,48,06),unlit,"ordinary" REGION: (50,06,56,08),lit,"ordinary" REGION: (40,08,46,08),unlit,"ordinary" REGION: (22,08,22,12),unlit,"ordinary" REGION: (24,08,38,12),unlit,"ordinary" REGION: (48,08,48,08),lit,"ordinary" REGION: (40,10,56,10),lit,"ordinary" REGION: (48,12,48,12),lit,"ordinary" REGION: (40,12,46,12),unlit,"ordinary" REGION: (50,12,56,14),lit,"ordinary" REGION: (22,14,23,14),unlit,"ordinary" REGION: (25,14,30,14),unlit,"ordinary" REGION: (32,14,48,14),unlit,"ordinary" # Stairs STAIR:(55,07),down # Portal arrival point BRANCH:(63,06,63,06),(0,0,0,0) # Doors DOOR:closed,(22,07) DOOR:closed,(38,07) DOOR:locked,(47,08) DOOR:locked,(23,10) DOOR:locked,(39,10) DOOR:locked,(57,10) DOOR:locked,(47,12) DOOR:closed,(22,13) DOOR:closed,(38,13) DOOR:locked,(24,14) DOOR:closed,(31,14) DOOR:locked,(49,14) # Lord Carnarvon MONSTER:'@',"Lord Carnarvon",(25,10) # The treasure of Lord Carnarvon OBJECT:'(',"chest",(25,10) # student guards for the audience chamber MONSTER:'@',"student",(26,09) MONSTER:'@',"student",(27,09) MONSTER:'@',"student",(28,09) MONSTER:'@',"student",(26,10) MONSTER:'@',"student",(28,10) MONSTER:'@',"student",(26,11) MONSTER:'@',"student",(27,11) MONSTER:'@',"student",(28,11) # city watch guards in the antechambers MONSTER:'@',"watchman",(50,06) MONSTER:'@',"watchman",(50,14) # Eels in the moat MONSTER:';',"giant eel",(20,10) MONSTER:';',"giant eel",(45,04) MONSTER:';',"giant eel",(33,16) # Non diggable walls NON_DIGGABLE:(00,00,75,19) # Random traps TRAP:random,random TRAP:random,random TRAP:random,random TRAP:random,random TRAP:random,random TRAP:random,random # Monsters on siege duty. MONSTER: 'S',random,(60,09) MONSTER: 'M',random,(60,10) MONSTER: 'S',random,(60,11) MONSTER: 'S',random,(60,12) MONSTER: 'M',random,(60,13) MONSTER: 'S',random,(61,10) MONSTER: 'S',random,(61,11) MONSTER: 'S',random,(61,12) MONSTER: 'S',random,(30,03) MONSTER: 'M',random,(20,17) MONSTER: 'S',random,(67,02) MONSTER: 'S',random,(10,19) # # The "locate" level for the quest. # # Here you have to find the Entrance to the Tomb of the Toltec Kings # to go further towards your assigned quest. # MAZE: "Arc-loca",' ' FLAGS: hardfloor GEOMETRY:center,center MAP ............................................................................ ............................................................................ ............................................................................ ........................-------------------------------..................... ........................|....|.S......................|..................... ........................|....|.|.|+------------------.|..................... ........................|....|.|.|.|.........|......|.|..................... ........................|....|.|.|.|.........|......|.|..................... ........................|---+-.|.|.|..---....+......|.|..................... ........................|....|.|.|.---|.|....|......|.|..................... ........................|....S.|.|.+..S.|--S-----S--|.|..................... ........................|....|.|.|.---|.|....|......+.|..................... ........................|---+-.|.|.|..---....|.------.|..................... ........................|....|.|.|.|.........|.|....+.|..................... ........................|....|.|.|.|.........|+|....|-|..................... ........................|....|.|.|------------+------.S..................... ........................|....|.S......................|..................... ........................-------------------------------..................... ............................................................................ ............................................................................ ENDMAP # 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" REGION:(33,04,53,04),unlit,"ordinary",unfilled,true REGION:(36,10,37,10),unlit,"ordinary" REGION:(39,09,39,11),unlit,"ordinary" REGION:(36,06,42,08),unlit,"ordinary",unfilled,true REGION:(36,12,42,14),unlit,"ordinary",unfilled,true REGION:(46,06,51,09),unlit,"ordinary" REGION:(46,11,49,11),unlit,"ordinary",unfilled,true REGION:(48,13,51,14),unlit,"ordinary" # Doors DOOR:closed,(31,04) DOOR:closed,(28,08) DOOR:locked,(29,10) DOOR:closed,(28,12) DOOR:closed,(31,16) DOOR:locked,(34,05) DOOR:locked,(35,10) DOOR:locked,(38,10) DOOR:closed,(43,10) DOOR:closed,(45,08) DOOR:locked,(46,14) DOOR:locked,(46,15) DOOR:locked,(49,10) DOOR:locked,(52,11) DOOR:closed,(52,13) DOOR:closed,(54,15) # Stairs STAIR:(03,17),up STAIR:(39,10),down # Altars - three types. All are unattended. ALTAR:(26,05),align[0],altar ALTAR:(26,10),align[1],altar ALTAR:(26,15),align[2],altar # Non diggable walls NON_DIGGABLE:(00,00,75,19) # Objects OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random 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) TRAP:"spiked pit",(23,05) TRAP:"spiked pit",(26,19) TRAP:"spiked pit",(55,10) TRAP:"spiked pit",(55,08) TRAP:"pit",(51,01) TRAP:"pit",(23,18) TRAP:"pit",(31,18) TRAP:"pit",(48,19) TRAP:"pit",(55,15) TRAP:"magic",(60,04) TRAP:"statue",(72,07) TRAP:"statue",random TRAP:"statue",random TRAP:"anti magic",(64,12) TRAP:"sleep gas",random TRAP:"sleep gas",random TRAP:"dart",random TRAP:"dart",random TRAP:"dart",random TRAP:"rolling boulder",(32,10) TRAP:"rolling boulder",(40,16) # Random monsters. MONSTER:'S',random,random MONSTER:'S',random,random MONSTER:'S',random,random MONSTER:'S',random,random MONSTER:'S',random,random MONSTER:'S',random,random MONSTER:'S',random,random MONSTER:'S',random,random MONSTER:'S',random,random MONSTER:'S',random,random MONSTER:'S',random,random MONSTER:'S',random,random MONSTER:'S',random,random MONSTER:'S',random,random MONSTER:'S',random,random MONSTER:'S',random,random MONSTER:'S',random,random MONSTER:'S',random,random MONSTER:'M',random,random MONSTER:'M',"human mummy",random MONSTER:'M',"human mummy",random MONSTER:'M',"human mummy",random MONSTER:'M',"human mummy",random MONSTER:'M',"human mummy",random MONSTER:'M',"human mummy",random MONSTER:'M',"human mummy",random MONSTER:'M',random,random # # 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. # MAZE: "Arc-goal", ' ' GEOMETRY:center,center MAP --------- |..|.|..| -----------|..S.S..|----------- |.|........|+-|.|-+|........|.| |.S........S..|.|..S........S.| |.|........|..|.|..|........|.| ------------------+------------------ |..|..........|.......|..........|..| |..|..........+.......|..........S..| |..S..........|.......+..........|..| |..|..........|.......|..........|..| ------------------+------------------ |.|........|..|.|..|........|.| |.S........S..|.|..S........S.| |.|........|+-|.|-+|........|.| -----------|..S.S..|----------- |..|.|..| --------- ENDMAP # Dungeon Description REGION:(00,00,75,19),lit,"ordinary" REGION:(35,02,36,03),unlit,"ordinary" REGION:(40,02,41,03),unlit,"ordinary" REGION:(24,04,24,06),unlit,"ordinary" REGION:(26,04,33,06),lit,"ordinary" REGION:(38,02,38,06),unlit,"ordinary" REGION:(43,04,50,06),lit,"ordinary" REGION:(52,04,52,06),unlit,"ordinary" REGION:(35,05,36,06),unlit,"ordinary" REGION:(40,05,41,06),unlit,"ordinary" REGION:(21,08,22,11),unlit,"ordinary" REGION:(24,08,33,11),lit,"ordinary" REGION:(35,08,41,11),unlit,"ordinary" REGION:(43,08,52,11),lit,"ordinary" REGION:(54,08,55,11),unlit,"ordinary" REGION:(24,13,24,15),unlit,"ordinary" REGION:(26,13,33,15),unlit,"ordinary" REGION:(35,13,36,14),unlit,"ordinary" REGION:(35,16,36,17),unlit,"ordinary" REGION:(38,13,38,17),unlit,"ordinary" REGION:(40,13,41,14),unlit,"ordinary" REGION:(40,16,41,17),unlit,"ordinary" REGION:(43,13,50,15),unlit,"temple" REGION:(52,13,52,15),unlit,"ordinary" # Stairs 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" OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,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 TRAP:"rolling boulder",(46,14) # Random monsters. MONSTER:'&',"Minion of Huhetotl",(50,14) MONSTER:'S',random,random MONSTER:'S',random,random MONSTER:'S',random,random MONSTER:'S',random,random MONSTER:'S',random,random MONSTER:'S',random,random MONSTER:'S',random,random MONSTER:'S',random,random MONSTER:'S',random,random MONSTER:'S',random,random MONSTER:'S',random,random MONSTER:'S',random,random MONSTER:'S',random,random MONSTER:'S',random,random MONSTER:'S',random,random MONSTER:'S',random,random MONSTER:'S',random,random MONSTER:'S',random,random MONSTER:'M',"human mummy",random MONSTER:'M',"human mummy",random MONSTER:'M',"human mummy",random MONSTER:'M',"human mummy",random MONSTER:'M',"human mummy",random MONSTER:'M',"human mummy",random MONSTER:'M',"human mummy",random MONSTER:'M',"human mummy",random MONSTER:'M',random,random # # The "fill" levels for the quest. # # These levels are used to fill out any levels not occupied by specific # levels as defined above. "filla" is the upper filler, between the # start and locate levels, and "fillb" the lower between the locate # and goal levels. # LEVEL: "Arc-fila" # ROOM: "ordinary" , random, random, random, random STAIR: random, up OBJECT: random,random,random MONSTER: 'S', random, random ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random OBJECT: random,random,random MONSTER: 'S', random, random ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random TRAP: random, random OBJECT: random,random,random MONSTER: 'S', random, random ROOM: "ordinary" , random, random, random, random STAIR: random, down OBJECT: random, random, random TRAP: random, random MONSTER: 'S', random, random MONSTER: 'M', "human mummy", random ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random OBJECT: random, random, random TRAP: random, random MONSTER: 'S', random, random ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random TRAP: random, random MONSTER: 'S', random, random RANDOM_CORRIDORS LEVEL: "Arc-filb" # ROOM: "ordinary" , random, random, random, random STAIR: random, up OBJECT: random,random,random MONSTER: 'M', random, random ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random OBJECT: random,random,random MONSTER: 'M', random, random ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random TRAP: random, random OBJECT: random,random,random MONSTER: 'M', random, random ROOM: "ordinary" , random, random, random, random STAIR: random, down OBJECT: random, random, random TRAP: random, random MONSTER: 'S', random, random MONSTER: 'M', "human mummy", random ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random OBJECT: random, random, random TRAP: random, random MONSTER: 'S', random, random ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random TRAP: random, random MONSTER: 'S', random, random RANDOM_CORRIDORS slashem-0.0.7E7F3/dat/mines.des0000664000076400007640000010777410545462317014254 0ustar aliali# SCCS Id: @(#)mines.des 3.4 2002/05/02 # 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 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 # 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 MONSTER: '@', "watchman", random, peaceful MONSTER: '@', "watch captain", random, peaceful SUBROOM: "shop" , lit, (2,2), (3,4), "town" CHANCE: 90 DOOR: false, closed, south, random SUBROOM: "tool shop", lit, (2,9), (3,4), "town" CHANCE: 90 DOOR: false, closed, north, random SUBROOM: "ordinary", unlit, (6,2), (3,4), "town" DOOR: false, closed, south, random SUBROOM: "ordinary", lit, (6,9), (3,4), "town" DOOR: false, closed, north, random SUBROOM: "food shop", lit, (10,2), (2,3), "town" CHANCE: 90 DOOR: false, closed, south, random SUBROOM: "candle shop", lit, (22,2), (3,3), "town" DOOR: false, closed, south, random SUBROOM: "ordinary", unlit, (10,10), (2,3), "town" DOOR: false, locked, east, random MONSTER: 'G', "gnome", random SUBROOM: "ordinary", lit, (19,2), (2,3), "town" DOOR: false, locked, west, random MONSTER: 'G', "gnome", random SUBROOM: "temple", lit, (15,9), (4,4), "town" DOOR: false, closed, north, random ALTAR:(02,02),align[0],shrine MONSTER: 'G', "gnomish wizard", random MONSTER: 'G', "gnomish wizard", random SUBROOM: "ordinary", lit, (22,10), (2,3), "town" DOOR: false, locked, west, random SUBROOM: "ordinary", lit, (26,2), (3,3), "town" DOOR: false, closed, south, random MONSTER: 'G', "gnome lord", random SUBROOM: "ordinary", unlit, (25,10), (4,3), "town" 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 MONSTER: 'h', "dwarf thief", random MONSTER: 'h', "dwarf thief", random ROOM: "ordinary" , random, random, random, random TRAP: random, random MONSTER: 'G', "gnome", random MONSTER: 'G', "gnome thief", random MONSTER: 'G', "gnome thief", random 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 MONSTER: '@', "watchman", random, peaceful MONSTER: '@', "watch captain", random, peaceful SUBROOM: "ordinary", random, (2,0), (2,2), "town" DOOR: false, closed, west, random SUBROOM: "ordinary", unlit, (5,0), (2,2), "town" DOOR: false, closed, south, random SUBROOM: "ordinary", random, (8,0), (2,2), "town" DOOR: false, closed, east, random SUBROOM: "ordinary", lit, (16,0), (2,2), "town" DOOR: false, closed, west, random SUBROOM: "ordinary", unlit, (19,0), (2,2), "town" DOOR: false, closed, south, random SUBROOM: "ordinary", random, (22,0), (2,2), "town" DOOR: false, locked, south, random MONSTER: 'G', "gnome", random SUBROOM: "ordinary", unlit, (25,0), (2,2), "town" DOOR: false, closed, east, random SUBROOM: "ordinary", lit, (2,5), (2,2), "town" DOOR: false, closed, north, random SUBROOM: "ordinary", lit, (5,5), (2,2), "town" DOOR: false, closed, south, random SUBROOM: "ordinary", random, (8,5), (2,2), "town" DOOR: false, locked, north, random MONSTER: 'G', "gnome", random SUBROOM: "shop" , lit, (2,10), (4,3), "town" CHANCE: 90 DOOR: false, closed, west, random SUBROOM: "tool shop", lit, (23,10), (4,3), "town" CHANCE: 90 DOOR: false, closed, east, random SUBROOM: "food shop", lit, (24,5), (3,4), "town" CHANCE: 90 DOOR: false, closed, north, random SUBROOM: "candle shop", lit, (11,10), (4,3), "town" DOOR: false, closed, east, random SUBROOM: "ordinary", unlit, (7,10), (3,3), "town" DOOR: false, locked, north, random MONSTER: 'G', "gnome", random SUBROOM: "temple", lit, (19,5), (4,4), "town" DOOR: false, closed, north, random ALTAR:(02,02),align[0],shrine MONSTER: 'G', "gnomish wizard", random MONSTER: 'G', "gnomish wizard", random SUBROOM: "ordinary", lit, (18,10), (4,3), "town" DOOR: false, locked, west, random MONSTER: 'G', "gnome lord", 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 MONSTER: 'h', "dwarf thief", random MONSTER: 'h', "dwarf thief", random ROOM: "ordinary" , random, random, random, random TRAP: random, random MONSTER: 'G', "gnome", random MONSTER: 'G', "gnome thief", random MONSTER: 'G', "gnome thief", random 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 MONSTER: 'h', "dwarf thief", random MONSTER: 'h', "dwarf thief", random ROOM: "ordinary" , random, random, random, random TRAP: random, random MONSTER: 'G', "gnome", random MONSTER: 'G', "gnome thief", random MONSTER: 'G', "gnome thief", 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 MONSTER: 'h', "dwarf thief", random MONSTER: 'h', "dwarf thief", random ROOM: "ordinary" , random, random, random, random TRAP: random, random MONSTER: 'G', "gnome", random MONSTER: 'G', "gnome thief", random MONSTER: 'G', "gnome thief", 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 FOUNTAIN:(50,09) FOUNTAIN:(10,15) FOUNTAIN:(66,18) 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: 'G', "gnome thief", random MONSTER: 'G', "gnome thief", random MONSTER: 'h', "dwarf", random MONSTER: 'h', "dwarf", random MONSTER: 'h', "dwarf", random MONSTER: 'h', "dwarf thief", random MONSTER: 'h', "dwarf thief", 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,39,15),up STAIR:levregion(61,03,75,19),(0,0,39,15),down FOUNTAIN:(22,07) FOUNTAIN:(09,13) 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: 'G', "gnome thief", random MONSTER: 'G', "gnome thief", random MONSTER: 'h', "dwarf", random MONSTER: 'h', "dwarf", random MONSTER: 'h', "dwarf", random MONSTER: 'h', "dwarf thief", random MONSTER: 'h', "dwarf thief", 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 MONSTER: 'h', "dwarf thief", random MONSTER: 'h', "dwarf thief", random ROOM: "ordinary" , random, random, random, random TRAP: random, random MONSTER: 'G', "gnome", random MONSTER: 'G', "gnome thief", random MONSTER: 'G', "gnome thief", 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 STAIR:place[6],down # Non diggable walls NON_DIGGABLE:(00,00,74,17) # Niches # Note: place[6] has been made staircase down to Gnome King level 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 --------------------------------------------------------------------------- |...................................................| | |.|---------S--.--|...|--------------------------|..| | |.||---| |.||-| |...|..........................|..| | |.||...| |-|.|.|---...|.............................| .. | |.||...|-|.....|....|-|..........................|..|. .. | |.||.....|-S|..|....|............................|..|.. . | |.||--|..|..|..|-|..|----------------------------|..|-. | |.| |..|..|....|..................................|... | |.| |..|..|----|..-----------------------------|..|.... | |.|---|..|--|.......|----------------------------|..|..... | |...........|----.--|......................| |..|....... | |-----------|...|.| |------------------|.|.|-----|..|.....|.. | |-----------|.{.|.|--------------------|.|..........|.....|.... | |...............|.S......................|-------------..-----... | |.--------------|.|--------------------|.|......................... | |.................| |.....................|........ | --------------------------------------------------------------------------- ENDMAP # Dungeon Description FOUNTAIN:(14,13) REGION:(23,03,48,06),lit,"ordinary" REGION:(21,06,22,06),lit,"ordinary" REGION:(14,04,14,04),unlit,"ordinary" REGION:(10,05,14,08),unlit,"ordinary" REGION:(10,09,11,09),unlit,"ordinary" REGION:(15,08,16,08),unlit,"ordinary" # Secret doors DOOR:locked,(12,02) DOOR:locked,(11,06) # Stairs STAIR:(36,04),up STAIR:(70,06),down # Non diggable walls NON_DIGGABLE:(00,00,52,17) NON_DIGGABLE:(53,00,74,00) NON_DIGGABLE:(53,17,74,17) NON_DIGGABLE:(74,01,74,16) NON_DIGGABLE:(53,07,55,07) NON_DIGGABLE:(53,14,61,14) # The Gnome King's wine cellar. ENGRAVING:(12,03),engrave,"You are now entering the Gnome King's wine cellar." ENGRAVING:(12,04),engrave,"Trespassers will be persecuted!" OBJECT:'!',"booze",(10,07) OBJECT:'!',"booze",(10,07) OBJECT:'!',random,(10,07) OBJECT:'!',"booze",(10,08) OBJECT:'!',"booze",(10,08) OBJECT:'!',random,(10,08) OBJECT:'!',"booze",(10,09) OBJECT:'!',"booze",(10,09) OBJECT:'!',"object detection",(10,09) # Objects # The Treasure chamber... OBJECT:'*',"diamond",(69,04) OBJECT:'*',random,(69,04) OBJECT:'*',"diamond",(69,04) OBJECT:'*',random,(69,04) OBJECT:'*',"emerald",(70,04) OBJECT:'*',random,(70,04) OBJECT:'*',"emerald",(70,04) OBJECT:'*',random,(70,04) OBJECT:'*',"emerald",(69,05) OBJECT:'*',random,(69,05) OBJECT:'*',"ruby",(69,05) OBJECT:'*',random,(69,05) OBJECT:'*',"ruby",(70,05) OBJECT:'*',"amethyst",(70,05) OBJECT:'*',random,(70,05) OBJECT:'*',"amethyst",(70,05) OBJECT:'*',"luckstone",(70,05) # Scattered gems... 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 # "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,12,2,16) FOUNTAIN:(12,08) FOUNTAIN:(51,15) 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 STAIR:place[2],down # 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 # # Ruggo the Gnome King's own special level # # MAZE: "mineking",' ' GEOMETRY: center,center #0 1 2 3 4 5 6 #1234567890123456789012345678901234567890123456789012345678901234567890 MAP # # # ## ##### ####### # # # # ############### ### ###### # ##### ######## # #### # # # # #### ##################### ## ----------- ### ######### # ######## # # # |....\....| # # # ###### ### # |.........| #### ## # # ## ####### |.........| ## # # #### # ######## # # # -----+----- # # ######### # # # # # ####### # # ##### ############### ##### # # ######## # # # # # # # # ###### ######### ############## # #### # # # # # # ENDMAP RANDOM_PLACES:(19,1),(42,1),(61,1),(21,15),(41,15),(61,16) # only place[0] is currently used STAIR:(35,06),up #BRANCH:(35,06,35,06),(0,0,0,0) DOOR: closed, (59,10) # 40 random gems all around... 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 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 OBJECT: '*',random,random OBJECT: '*',random,random OBJECT: '*',random,random OBJECT: '*',random,random OBJECT: '*',"luckstone",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 OBJECT: '*',random,random OBJECT: '*',random,random OBJECT: '*',random,random OBJECT: '*',random,random OBJECT: '*',random,random OBJECT: '*',random,random #Pickaxe in case of trappedness on Wine Cellar Mine's end OBJECT: '(',"pick-axe",place[0] #20 bunches of gold all around... GOLD: random,random GOLD: random,random GOLD: random,random GOLD: random,random GOLD: random,random GOLD: random,random GOLD: random,random GOLD: random,random GOLD: random,random GOLD: random,random GOLD: random,random GOLD: random,random GOLD: random,random GOLD: random,random GOLD: random,random GOLD: random,random GOLD: random,random GOLD: random,random GOLD: random,random GOLD: random,random # throne room MONSTER: 'G', "Ruggo the Gnome King", (59,7), hostile OBJECT: ')',random,(59,7) OBJECT: '/',random,(59,7) OBJECT: '!',random,(59,7) OBJECT: '!',random,(59,7) OBJECT: '[',random,(59,7) MONSTER: 'G', random, (55,7), hostile MONSTER: 'G', random, (56,7), hostile MONSTER: 'G', random, (57,7), hostile MONSTER: 'G', random, (58,7), hostile MONSTER: 'G', random, (60,7), hostile MONSTER: 'G', random, (61,7), hostile MONSTER: 'G', random, (62,7), hostile MONSTER: 'G', random, (63,7), hostile MONSTER: 'G', random, (55,8), hostile MONSTER: 'G', random, (56,8), hostile MONSTER: 'G', random, (57,8), hostile MONSTER: 'G', random, (58,8), hostile MONSTER: 'G', random, (59,8), hostile MONSTER: 'G', random, (60,8), hostile MONSTER: 'G', random, (61,8), hostile MONSTER: 'G', random, (62,8), hostile MONSTER: 'G', random, (63,8), hostile MONSTER: 'G', random, (55,9), hostile MONSTER: 'G', random, (56,9), hostile MONSTER: 'G', random, (57,9), hostile MONSTER: 'G', random, (58,9), hostile MONSTER: 'G', random, (59,9), hostile MONSTER: 'G', random, (60,9), hostile MONSTER: 'G', random, (61,9), hostile MONSTER: 'G', random, (62,9), hostile MONSTER: 'G', random, (63,9), hostile # the mine workers MONSTER: 'G', "gnome", random, hostile MONSTER: 'G', "gnome", random, hostile MONSTER: 'G', "gnome", random, hostile MONSTER: 'G', "gnome", random, hostile MONSTER: 'G', "gnome", random, hostile MONSTER: 'G', "gnome", random, hostile MONSTER: 'G', "gnome", random, hostile MONSTER: 'G', "gnome", random, hostile MONSTER: 'G', "gnome", random, hostile MONSTER: 'G', "gnome", random, hostile MONSTER: 'G', "gnome", random, hostile MONSTER: 'G', "gnome", random, hostile MONSTER: 'G', "gnome", random, hostile MONSTER: 'G', "gnome", random, hostile MONSTER: 'G', "gnome", random, hostile MONSTER: 'G', "gnome", random, hostile MONSTER: 'G', "gnome", random, hostile MONSTER: 'G', "gnome", random, hostile MONSTER: 'G', "gnome", random, hostile MONSTER: 'G', "gnome", random, hostile MONSTER: 'G', "gnome warrior", random, hostile MONSTER: 'G', "gnome warrior", random, hostile MONSTER: 'G', "gnome warrior", random, hostile MONSTER: 'G', "gnome warrior", random, hostile MONSTER: 'G', "gnome warrior", random, hostile MONSTER: 'G', "gnome warrior", random, hostile MONSTER: 'G', "gnome warrior", random, hostile MONSTER: 'G', "gnome warrior", random, hostile MONSTER: 'G', "gnome warrior", random, hostile MONSTER: 'G', "gnome warrior", random, hostile MONSTER: 'G', "gnome warrior", random, hostile slashem-0.0.7E7F3/dat/history0000664000076400007640000003103410545462317014051 0ustar alialiSLASH'EM History file for release 0.0.7 Behold, mortal, the origins of SLASH'EM... Jay Fenlason wrote the original Hack with help from Kenny 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(tm) machines to the Usenet. Don G. Kneller ported Hack 1.0.3 to Microsoft(tm) C and MS-DOS(tm), producing PC HACK 1.01e, added support for DEC Rainbow graphics in version 1.03g, and went on to produce at least four more versions (3.0, 3.2, 3.51, and 3.6). R. Black ported PC HACK 3.51 to Lattice(tm) 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 version 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, Eric S. Raymond, John Rupley, Mike Threepoint, and Janet Walz, to produce NetHack 3.0c. The same group subsequently released ten patch- level revisions and updates of 3.0. 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. A scant one month before the next major version release of Nethack, two adventurous souls undertook their own modification to the sacred Nethack formula. Tom Proudfoot and Yuval released Nethack++, which was rapidly renamed Nethack--, containeing new monsters, items and other miscellaneous modifications. Headed by Mike Stephenson and coordinated by Izchak Miller and Janet Walz, the development team which now included Ken Arromdee, 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 individual character quests, a new endgame and many other new features, and produced NetHack 3.1. Ken Lorber, Gregg Wonderly and Greg Olson, with help from Richard Addison, Mike Passaretti, and Olaf Seibert, developed NetHack 3.1 for the Amiga. Norm Meluch and Kevin Smolkowski, with help from Carl Schelin, Stephen Spackman, Steve VanDevender, and Paul Winner, ported NetHack 3.1 to the PC. Jon Watte 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 ported NetHack 3.1 to the Atari. Pat Rankin, with help from Joshua Delahunty, is 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 added in the "tiled" version of the game and generated most of the individual tiles for NetHack 3.2. Time passed, and Nethack-- was ported to 3.11 by Chris. Stephen White then released his own modification known as Nethack Plus, which contained new character classes. Unbeknownst to the world at large, Tom Proudfoot took this source and combined it with his Nethack--. Stephen White went on to add weapon skills, which were eventually integrated into the next version of Nethack, and other features. In February 1996, Tom Proudfoot released SLASH V1. Including part of Stephen White's Nethack Plus and his own Nethack--, leaving unmentioned his own slew of further modifications, this is perhaps the best known of the Nethack modifications. Six versions of this, ending with SLASH V6, are known to exist. The 3.2 development team, comprised of: Michael Allison; Ken Arromdee; David Cohrs; Jessie Collet; Steve Creps; Kevin Darcy; Timo Hakulinen; Steve Linhart; Dean Luick; Pat Rankin; Eric Smith; Mike Stephenson; Janet Walz; and Paul Winner, released version 3.2 in April of 1996. Version 3.2 marks 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 the current 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, passed away. This release of the game is dedicated to him by the development and porting teams. Version 3.2 proved to be more stable than previous versions. Many bugs were fixed, abuses eliminated, and game features tuned for better game play. SLASH V6 was picked up by Enrico Horn managed to synchronize it with the 3.2 source. The new SLASH 4.1.2 was released as far back as November 1996 went through at least 4 editlevels (E5, E6, E7) with the latest version being 4.1.2E8, synchronized with Nethack 3.2.2 and the Blackmarket option available, released in June 1997. Nathan La began the arduous task of drawing tiles for the SLASH monsters. Kentaro Shirakata ported SLASH 4.1.2E8 to Unix. Lief Clennon ported SLASH 4.1.2E8 to OS/2. Romain Dolbeau ported SLASH 4.1.2E8 to Macintosh. Warren Cheung combined SLASH 4.1.2 and Wizard Patch to create SLASH'EM 0.1 in November 1997. Several revisions including new spells and other minor additions have led to SLASH'EM 0.0.3. Steven Uy has generously made additional modifications. Dirk Schoenberger has continued updating the SLASH/SLASH'EM monster tiles. He has also ported SLASH'EM to Linux. Lief Clennon ported SLASH'EM to OS/2 EMX. Kevin Hugo ported SLASH'EM to Macintosh, and has also contributed additional changes and improvements. Robin Johnson finished arduous task of drawing tiles for the SLASH'EM monsters. He has also contributed many more new tiles. Kevin later joined the DevTeam and incorporated the best of these ideas in NetHack 3.3. JNetHack (the Japanese version of NetHack) has been around since at least 1994, developed by Issei Numata and others. The GTK interface was written for this variant and released in 1999. Mitsuhiro Itakura headed a team which began the process of redrawing the NetHack tiles in 8-bit color at 32x32 pixels. 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. Warren Cheung combined SLASH'EM 0.0.5E7F1 and NetHack 3.3 to create SLASH'EM 0.0.6 and maintained the DOS and Microsoft Windows ports. J. Ali Harlow incorporated the GTK interface and Mitsuhiro Itakura's 32x32 tileset into SLASH'EM 0.0.6 and maintained the UNIX port of SLASH'EM 0.0.6. Peter Makholm maintained the Debian package. Paul Hurtley maintained the MAC port of SLASH'EM 0.0.6. 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. Alex Kompel also contributed a Windows CE port for 3.4.1. 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. Warren Cheung, Christian Cooper, J. Ali Harlow, Paul Hurtley, Pekka Rousu and Darshan Shaligram combined SLASH'EM 0.0.6E5F2 and Nethack 3.4 to create SLASH'EM 0.0.7 The Slash'EM home page is at http://www.slashem.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: Adam Aronow Izchak Miller Mike Stephenson Alex Kompel J. Ali Harlow Norm Meluch Andreas Dorn Janet Walz Olaf Seibert Andy Church Janne Salmijarvi Pasi Kallinen Andy Swanson Jean-Christophe Collet Pat Rankin Ari Huttunen Jochen Erwied Paul Winner Barton House John Kallen Pierre Martineau Benson I. Margulies John Rupley Ralf Brown Bill Dyer John S. Bien Ray Chason Boudewijn Waijers Johnny Lee Richard Addison Bruce Cox Jon W{tte Richard Beigel Bruce Holloway Jonathan Handler Richard P. Hughey Bruce Mewborne Joshua Delahunty Rob Menke Carl Schelin Keizo Yamamoto Robin Johnson Chris Russo Ken Arnold Roderick Schertler David Cohrs Ken Arromdee Roland McGrath David Damerell Ken Lorber Ron Van Iwaarden David Gentzel Ken Washikita Ronnen Miller David Hairston Kevin Darcy Ross Brown Dean Luick Kevin Hugo Sascha Wostmann Del Lamb Kevin Sitze Scott Bigham Deron Meranda Kevin Smolkowski Scott R. Turner Dion Nicolaas Kevin Sweet Stephen Spackman Dylan O'Donnell Lars Huttar Stephen White Eric Backus Malcolm Ryan Steve Creps Eric Hendrickson Mark Gooderum Steve Linhart Eric R. Smith Mark Modrall Steve VanDevender Eric S. Raymond Marvin Bressler Teemu Suikki Erik Andersen Matthew Day Tim Lennan Frederick Roeber Merlyn LeRoy Timo Hakulinen Gil Neiger Michael Allison Tom Almy Greg Laskin Michael Feir Tom West Greg Olson Michael Hamel Warren Cheung Gregg Wonderly Michael Sokolov Warwick Allison Hao-yang Wang Mike Engber Yitzhak Sapir Helge Hafting Mike Gallop Irina Rempt-Drijfhout Mike Passaretti slashem-0.0.7E7F3/dat/tower.des0000664000076400007640000000700410545462317014262 0ustar aliali# 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. # # Upper stage of Vlad's tower MAZE:"tower1",' ' FLAGS: noteleport,hardfloor GEOMETRY:half-left,center MAP --- --- --- |.| |.| |.| ---S---S---S--- |.......+.+...| ---+-+---.----- |....\|.+.| ---+-+---.----- |.......+.+...| ---S---S---S--- |.| |.| |.| --- --- --- ENDMAP LADDER:(11,05),down # The lord and his court MONSTER:'V',"Vlad the Impaler",(07,05) MONSTER:'V',random,(03,09) MONSTER:'V',random,(07,09) MONSTER:'V',random,(11,09) MONSTER:'V',random,(03,01) MONSTER:'V',random,(07,01) MONSTER:'V',random,(11,01) # The doors DOOR:locked,(08,03),"The Key of Chaos" DOOR:locked,(10,03) DOOR:locked,(03,04),"The Key of Law" DOOR:locked,(05,04),"The Key of Neutrality" DOOR:locked,(10,05) DOOR:locked,(08,07),"The Key of Law" DOOR:locked,(10,07) DOOR:locked,(03,06),"The Key of Chaos" DOOR:locked,(05,06),"The Key of Neutrality" # treasures OBJECT:'(',"chest",(07,05) OBJECT:'(',"chest",(03,09) OBJECT:'(',"chest",(07,09) OBJECT:'(',"chest",(11,09) OBJECT:'(',"chest",(03,01) OBJECT:'(',"chest",(07,01) OBJECT:'(',"chest",(11,01) # We have to protect the tower against outside attacks NON_DIGGABLE:(00,00,14,10) # and force the use of the aligned doors NON_PASSWALL:(00,00,14,10) # Intermediate stage of Vlad's tower MAZE:"tower2",' ' FLAGS: noteleport,hardfloor GEOMETRY:half-left,center MAP --- --- --- |.| |.| |.| ---S---S---S--- |.S.........S.| ---.------+---- |......|..| --------.------ |.S......+..S.| ---S---S---S--- |.| |.| |.| --- --- --- ENDMAP # Random places are the 10 niches RANDOM_PLACES:(03,01),(07,01),(11,01),(01,03),(13,03), (01,07),(13,07),(03,09),(07,09),(11,09) LADDER:(11,05),up LADDER:(03,07),down DOOR:locked,(10,04) DOOR:locked,(09,07) MONSTER:'&',random,place[0] MONSTER:'&',random,place[1] MONSTER:'d',"hell hound pup",place[2] MONSTER:'d',"hell hound pup",place[3] MONSTER:'d',"winter wolf",place[4] CONTAINER:'(',"chest",place[5] OBJECT:'"',"amulet of life saving",contained CONTAINER:'(',"chest",place[6] OBJECT:'"',"amulet of strangulation",contained OBJECT:'[',"water walking boots",place[7] OBJECT:'[',"crystal plate mail",place[8] OBJECT:'+',"invisibility",place[9] # Walls in the tower are non diggable NON_DIGGABLE:(00,00,14,10) # Bottom most stage of Vlad's tower MAZE:"tower3",' ' FLAGS: noteleport,hardfloor GEOMETRY:half-left,center MAP --- --- --- |.| |.| |.| ---S---S---S--- |.S.........S.| -----.........----- |...|.........+...| |.---.........---.| |.|.S.........S.|.| |.---S---S---S---.| |...|.|.|.|.|.|...| ---.---.---.---.--- |.............| --------------- ENDMAP # Random places are the 10 niches RANDOM_PLACES:(05,01),(09,01),(13,01),(03,03),(15,03), (03,07),(15,07),(05,09),(09,09),(13,09) BRANCH:(02,05,02,05),(00,00,00,00) LADDER:(05,07),up # Entry door is, of course, locked DOOR:locked,(14,05) # Let's put a dragon behind the door, just for the fun... MONSTER:'D',random,(13,05) MONSTER:random,random,(12,04) MONSTER:random,random,(12,06) MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random OBJECT:')',"long sword",place[0] TRAP:random,place[0] OBJECT:'(',"lock pick",place[1] TRAP:random,place[1] OBJECT:'[',"elven cloak",place[2] TRAP:random,place[2] OBJECT:'(',"blindfold",place[3] TRAP:random,place[3] # Walls in the tower are non diggable NON_DIGGABLE:(00,00,18,12) slashem-0.0.7E7F3/dat/medusa.des0000664000076400007640000004123610545462317014405 0ustar aliali# SCCS Id: @(#)medusa.des 3.4 1996/05/11 # $Id: medusa.des,v 1.4 2003/09/06 07:44:22 prousu Exp $ # Copyright (c) 1989 by Jean-Christophe Collet # Copyright (c) 1990, 1991 by M. Stephenson # Copyright (c) 2003 by Pasi Kallinen # NetHack may be freely redistributed. See license for details. # # These are the Medusa's levels : # MAZE:"medusa-1",' ' FLAGS: noteleport GEOMETRY:center,center MAP }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} }}.}}}}}..}}}}}......}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}....}}}...}}}}} }...}}.....}}}}}....}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}...............} }....}}}}}}}}}}....}}}..}}}}}}}}}}}.......}}}}}}}}}}}}}}}}..}}.....}}}...}} }....}}}}}}}}.....}}}}..}}}}}}.................}}}}}}}}}}}.}}}}.....}}...}} }....}}}}}}}}}}}}.}}}}.}}}}}}.-----------------.}}}}}}}}}}}}}}}}}.........} }....}}}}}}}}}}}}}}}}}}.}}}...|...............S...}}}}}}}}}}}}}}}}}}}....}} }.....}.}}....}}}}}}}}}.}}....--------+--------....}}}}}}..}}}}}}}}}}}...}} }......}}}}..}}}}}}}}}}}}}........|.......|........}}}}}....}}}}}}}}}}}}}}} }.....}}}}}}}}}}}}}}}}}}}}........|.......|........}}}}}...}}}}}}}}}.}}}}}} }.....}}}}}}}}}}}}}}}}}}}}....--------+--------....}}}}}}.}.}}}}}}}}}}}}}}} }......}}}}}}}}}}}}}}}}}}}}...S...............|...}}}}}}}}}}}}}}}}}.}}}}}}} }.......}}}}}}}..}}}}}}}}}}}}.-----------------.}}}}}}}}}}}}}}}}}....}}}}}} }........}}.}}....}}}}}}}}}}}}.................}}}}}..}}}}}}}}}.......}}}}} }.......}}}}}}}......}}}}}}}}}}}}}}.......}}}}}}}}}.....}}}}}}...}}..}}}}}} }.....}}}}}}}}}}}.....}}}}}}}}}}}}}}}}}}}}}}.}}}}}}}..}}}}}}}}}}....}}}}}}} }}..}}}}}}}}}}}}}....}}}}}}}}}}}}}}}}}}}}}}...}}..}}}}}}}.}}.}}}}..}}}}}}}} }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} ENDMAP # Dungeon Description # (must maintain one room definition; `unfilled' forces its room to be kept) REGION:(00,00,74,19),lit,"ordinary" REGION:(31,07,45,07),unlit,"ordinary" REGION:(35,09,41,10),unlit,"ordinary",unfilled REGION:(31,12,45,12),unlit,"ordinary" # Teleport: down to up stairs island, up to Medusa's island TELEPORT_REGION:(01,01,05,17),(0,0,0,0),down TELEPORT_REGION:(26,04,50,15),(0,0,0,0),up # Stairs STAIR:(05,14),up STAIR:(36,10),down # Doors DOOR:closed,(46,07) DOOR:locked,(38,08) DOOR:locked,(38,11) DOOR:closed,(30,12) # Branch, not allowed inside Medusa's building. BRANCH:levregion(01,00,79,20),(30,06,46,13) # Non diggable walls NON_DIGGABLE:(30,06,46,13) # Objects CONTAINER:'`',"statue",(36,10),uncursed,"knight",3,"Perseus" OBJECT[75%]:'[',"shield of reflection",contained,cursed,+0 OBJECT[25%]:'[',"levitation boots",contained,random,+0 OBJECT[50%]:')',"scimitar",contained,blessed,+2 OBJECT[50%]:'(',"sack",contained # These aren't really containers, but specifying CONTAINER forces them to be # empty, since CONTAINERs contain only what is explicitly specified. CONTAINER:'`',"statue",random CONTAINER:'`',"statue",random CONTAINER:'`',"statue",random CONTAINER:'`',"statue",random CONTAINER:'`',"statue",random CONTAINER:'`',"statue",random CONTAINER:'`',"statue",random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,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:"board",(38,07) TRAP:"board",(38,12) # Random monsters MONSTER:'@',"Medusa",(36,10),asleep MONSTER:';',"giant eel",(11,06) MONSTER:';',"giant eel",(23,13) MONSTER:';',"giant eel",(29,02) MONSTER:';',"jellyfish",(02,02) MONSTER:';',"jellyfish",(00,08) MONSTER:';',"jellyfish",(04,18) MONSTER:'T',"water troll",(51,03) MONSTER:'T',"water troll",(64,11) MONSTER:'S',random,(38,07) MONSTER:'S',random,(38,12) MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MAZE:"medusa-2",' ' FLAGS: noteleport GEOMETRY:center,center MAP }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} }------}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}-------}}}}}}}}--------------} }|....|}}}}}}}}}..}.}}..}}}}}}}}}}}}}..}}}}}}-.....--}}}}}}}|............|} }|....|.}}}}}}}}}}}.}...}}..}}}}}}}}}}}}}}}}}---......}}}}}.|............|} }S....|.}}}}}}---}}}}}}}}}}}}}}}}}}}}}}}}}}---...|..-}}}}}}.S..----------|} }|....|.}}}}}}-...}}}}}}}}}.}}...}.}}}}.}}}......----}}}}}}.|............|} }|....|.}}}}}}-....--}}}}}}}}}}}}}}}}}}}}}}----...--}}}}}}}.|..--------+-|} }|....|.}}}}}}}......}}}}...}}}}}}.}}}}}}}}}}}---..---}}}}}.|..|..S...|..|} }|....|.}}}}}}-....-}}}}}}}------}}}}}}}}}}}}}}-...|.-}}}}}.|..|..|...|..|} }|....|.}}}}}}}}}---}}}}}}}........}}}}}}}}}}---.|....}}}}}.|..|..|...|..|} }|....|.}}}}}}}}}}}}}}}}}}-....|...-}}}}}}}}--...----.}}}}}.|..|..|...|..|} }|....|.}}}}}}..}}}}}}}}}}---..--------}}}}}-..---}}}}}}}}}.|..|..-------|} }|...}|...}}}.}}}}}}...}}}}}--..........}}}}..--}}}}}}}}}}}.|..|.........|} }|...}S...}}.}}}}}}}}}}}}}}}-..--------}}}}}}}}}}}}}}...}}}.|..--------..S} }|...}|...}}}}}}}..}}}}}}----..|....-}}}}}}}}}}}}}}}}}..}}}.|............|} }|....|}}}}}....}}}}..}}.-.......----}}......}}}}}}.......}}|............|} }------}}}}}}}}}}}}}}}}}}---------}}}}}}}}}}}}}}}}}}}}}}}}}}--------------} }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} ENDMAP # Dungeon Description REGION:(00,00,74,19),lit,"ordinary" REGION:(02,03,05,16),unlit,"ordinary" REGION:(61,03,72,16),unlit,"ordinary",unfilled,true REGION:(71,08,72,11),unlit,"ordinary" REGION:(67,08,69,11),lit,"ordinary" # Teleport: down to up stairs island, up to Medusa's island TELEPORT_REGION:(02,03,05,16),(0,0,0,0),down TELEPORT_REGION:(61,03,72,16),(0,0,0,0),up # Stairs STAIR:(04,09),up STAIR:(68,10),down # Doors DOOR:locked,(71,07) # Branch, not allowed on Medusa's island. BRANCH:levregion(01,00,79,20),(59,01,73,17) # Non diggable walls NON_DIGGABLE:(01,02,06,17) NON_DIGGABLE:(60,02,73,17) # Objects CONTAINER:'`',"statue",(68,10),uncursed,"knight",3,"Perseus" OBJECT[25%]:'[',"shield of reflection",contained,cursed,+0 OBJECT[75%]:'[',"levitation boots",contained,random,+0 OBJECT[50%]:')',"scimitar",contained,blessed,+2 OBJECT[50%]:'(',"sack",contained CONTAINER:'`',"statue",(64,08) CONTAINER:'`',"statue",(65,08) CONTAINER:'`',"statue",(64,09) CONTAINER:'`',"statue",(65,09) CONTAINER:'`',"statue",(64,10) CONTAINER:'`',"statue",(65,10) CONTAINER:'`',"statue",(64,11) CONTAINER:'`',"statue",(65,11) OBJECT:'`',"boulder",(04,04) OBJECT:'/',random,(52,09) OBJECT:'`',"boulder",(52,09) OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random # Traps TRAP:"magic",(03,12) TRAP:random,random TRAP:random,random TRAP:random,random TRAP:random,random # Monsters. MONSTER:'@',"Medusa",(68,10),asleep MONSTER:'g',"gremlin",(02,14) MONSTER:'H',"titan",(02,05) MONSTER:';',"electric eel",(10,13) MONSTER:';',"electric eel",(11,13) MONSTER:';',"electric eel",(10,14) MONSTER:';',"electric eel",(11,14) MONSTER:';',"electric eel",(10,15) MONSTER:';',"electric eel",(11,15) MONSTER:';',"jellyfish",(01,01) MONSTER:';',"jellyfish",(00,08) MONSTER:';',"jellyfish",(04,19) MONSTER:''',"stone golem",(64,08),asleep MONSTER:''',"stone golem",(65,08),asleep MONSTER:''',"stone golem",(64,09),asleep MONSTER:''',"stone golem",(65,09),asleep MONSTER:'S',"cobra",(64,10),asleep MONSTER:'S',"cobra",(65,10),asleep MONSTER:'A',random,(72,08) MONSTER:'y',"yellow light",(72,11),asleep MONSTER:random,random,(17,07) MONSTER:random,random,(28,11) MONSTER:random,random,(32,13) MONSTER:random,random,(49,09) MONSTER:random,random,(48,07) MONSTER:random,random,(65,03) MONSTER:random,random,(70,04) MONSTER:random,random,(70,15) MONSTER:random,random,(65,16) MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MAZE:"medusa-3",' ' FLAGS: noteleport GEOMETRY:center,center # # Here you disturb ravens nesting in the trees. # MAP }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} }}}}}}}}}}.}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}.}}}}}}}}}}}}}}}}}}}}}}}}}}}} }}}}}}}}T..T.}}}}}}}}}}}}}}}}}}}}..}}}}}}}}.}}}...}}}}}}}.}}}}}......}}}}}}} }}}}}}.......T.}}}}}}}}}}}..}}}}..T.}}}}}}...T...T..}}...T..}}..-----..}}}}} }}}...-----....}}}}}}}}}}.T..}}}}}...}}}}}.....T..}}}}}......T..|...|.T..}}} }}}.T.|...|...T.}}}}}}}.T......}}}}..T..}}.}}}.}}...}}}}}.T.....+...|...}}}} }}}}..|...|.}}.}}}}}.....}}}T.}}}}.....}}}}}}.T}}}}}}}}}}}}}..T.|...|.}}}}}} }}}}}.|...|.}}}}}}..T..}}}}}}}}}}}}}T.}}}}}}}}..}}}}}}}}}}}.....-----.}}}}}} }}}}}.--+--..}}}}}}...}}}}}}}}}}}}}}}}}}}T.}}}}}}}}}}}}}}}}.T.}........}}}}} }}}}}.......}}}}}}..}}}}}}}}}.}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}.}}}.}}.T.}}}}}} }}.T...T...}}}}T}}}}}}}}}}}....}}}}}}}}}}T}}}}}.T}}...}}}}}}}}}}}}}}...}}}}} }}}...T}}}}}}}..}}}}}}}}}}}.T...}}}}}}}}.T.}.T.....T....}}}}}}}}}}}}}.}}}}}} }}}}}}}}}}}}}}}....}}}}}}}...}}.}}}}}}}}}}............T..}}}}}.T.}}}}}}}}}}} }}}}}}}}}}}}}}}}..T..}}}}}}}}}}}}}}..}}}}}..------+--...T.}}}....}}}}}}}}}}} }}}}.}..}}}}}}}.T.....}}}}}}}}}}}..T.}}}}.T.|...|...|....}}}}}.}}}}}...}}}}} }}}.T.}...}..}}}}T.T.}}}}}}.}}}}}}}....}}...|...+...|.}}}}}}}}}}}}}..T...}}} }}}}..}}}.....}}...}}}}}}}...}}}}}}}}}}}}}T.|...|...|}}}}}}}}}}}....T..}}}}} }}}}}..}}}.T..}}}.}}}}}}}}.T..}}}}}}}}}}}}}}---S-----}}}}}}}}}}}}}....}}}}}} }}}}}}}}}}}..}}}}}}}}}}}}}}}.}}}}}}}}}}}}}}}}}T..T}}}}}}}}}}}}}}}}}}}}}}}}}} }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} ENDMAP RANDOM_PLACES:(08,06),(66,05),(46,15) REGION:(00,00,74,19),lit,"ordinary" REGION:(49,14,51,16),random,"ordinary",unfilled REGION:(07,05,09,07),unlit,"ordinary" REGION:(65,04,67,06),unlit,"ordinary" REGION:(45,14,47,16),unlit,"ordinary" # All places are accessible also with jumping, so don't bother # restricting the placement when teleporting from levels below this. TELEPORT_REGION:(33,02,38,07),(0,0,0,0),down STAIR:(32,01,39,07),(0,0,0,0),up STAIR:place[0],down DOOR:locked,(08,08) DOOR:locked,(64,05) DOOR:random,(50,13) DOOR:locked,(48,15) # FOUNTAIN:place[1] # CONTAINER:'`',"statue",place[2],uncursed,"knight",1,"Perseus" OBJECT[75%]:'[',"shield of reflection",contained,cursed,+0 OBJECT[25%]:'[',"levitation boots",contained,random,+0 OBJECT[50%]:')',"scimitar",contained,blessed,+2 OBJECT[50%]:'(',"sack",contained # CONTAINER:'`',"statue",random CONTAINER:'`',"statue",random CONTAINER:'`',"statue",random CONTAINER:'`',"statue",random CONTAINER:'`',"statue",random CONTAINER:'`',"statue",random CONTAINER:'`',"statue",random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:'?',"blank paper",(48,18) OBJECT:'?',"blank paper",(48,18) # TRAP:"rust",random TRAP:"rust",random TRAP:"board",random TRAP:"board",random TRAP:random,random # MONSTER:'@',"Medusa",place[0] MONSTER:';',"giant eel",random MONSTER:';',"giant eel",random MONSTER:';',"jellyfish",random MONSTER:';',"jellyfish",random MONSTER:'n',"wood nymph",random MONSTER:'n',"water nymph",random MONSTER:'n',"water nymph",random MONSTER:'B',"raven",random,hostile MONSTER:'B',"raven",random,hostile MONSTER:'B',"raven",random,hostile MONSTER:'B',"raven",random,hostile MONSTER:'B',"raven",random,hostile MONSTER:'B',"raven",random,hostile MONSTER:'B',"raven",random,hostile MONSTER:'B',"raven",random,hostile MONSTER:'B',"raven",random,hostile MONSTER:'B',"raven",random,hostile MONSTER:'B',"raven",random,hostile MONSTER:'B',"raven",random,hostile MONSTER:'B',"raven",random,hostile MONSTER:'B',"raven",random,hostile MONSTER:'B',"raven",random,hostile MONSTER:'B',"raven",random,hostile MONSTER:'B',"raven",random,hostile MONSTER:'B',"raven",random,hostile MONSTER:'B',"raven",random,hostile MONSTER:'B',"raven",random,hostile MONSTER:'B',"raven",random,hostile MONSTER:'B',"raven",random,hostile MONSTER:'B',"raven",random,hostile MONSTER:'B',"raven",random,hostile MONSTER:'B',"raven",random,hostile MONSTER:'B',"raven",random,hostile MONSTER:'B',"raven",random,hostile MONSTER:'B',"raven",random,hostile MONSTER:'B',"raven",random,hostile MONSTER:'B',"raven",random,hostile MAZE:"medusa-4",' ' FLAGS: noteleport GEOMETRY:center,center # # Here the Medusa rules some slithery monsters from her 'palace', with # a yellow dragon nesting in the backyard. # MAP }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} }}}}}}}}}}}}}}........}}}}}}}}}}}}}}}}}}}}}}}..}}}.....}}}}}}}}}}}----|}}}}} }}}}}}..----------F-.....}}}}}}}}}}}}}}}}..---...}}}}....T.}}}}}}}....|}}}}} }}}.....|...F......S}}}}....}}}}}}}...}}.....|}}.}}}}}}}......}}}}|......}}} }}}.....+...|..{...|}}}}}}}}}}}}.....}}}}|...|}}}}}}}}}}}.}}}}}}}}----.}}}}} }}......|...|......|}}}}}}}}}......}}}}}}|.......}}}}}}}}}}}}}..}}}}}...}}}} }}|-+--F|-+--....|F|-|}}}}}....}}}....}}}-----}}.....}}}}}}}......}}}}.}}}}} }}|...}}|...|....|}}}|}}}}}}}..}}}}}}}}}}}}}}}}}}}}....}}}}}}}}....T.}}}}}}} }}|...}}F...+....F}}}}}}}..}}}}}}}}}}}}}}...}}}}}}}}}}}}}}}}}}}}}}....}}..}} }}|...}}|...|....|}}}|}....}}}}}}....}}}...}}}}}...}}}}}}}}}}}}}}}}}.....}}} }}--+--F|-+--....-F|-|....}}}}}}}}}}.T...}}}}....---}}}}}}}}}}}}}}}}}}}}}}}} }}......|...|......|}}}}}.}}}}}}}}}....}}}}}}}.....|}}}}}}}}}.}}}}}}}}}}}}}} }}}}....+...|..{...|.}}}}}}}}}}}}}}}}}}}}}}}}}}.|..|}}}}}}}......}}}}...}}}} }}}}}}..|...F......|...}}}}}}}}}}..---}}}}}}}}}}--.-}}}}}....}}}}}}....}}}}} }}}}}}}}-----S----F|....}}}}}}}}}|...|}}}}}}}}}}}}...}}}}}}...}}}}}}..}}}}}} }}}}}}}}}..............T...}}}}}.|.......}}}}}}}}}}}}}}..}...}.}}}}....}}}}} }}}}}}}}}}....}}}}...}...}}}}}.......|.}}}}}}}}}}}}}}.......}}}}}}}}}...}}}} }}}}}}}}}}..}}}}}}}}}}.}}}}}}}}}}-..--.}}}}}}}}..}}}}}}..T...}}}..}}}}}}}}}} }}}}}}}}}...}}}}}}}}}}}}}}}}}}}}}}}...}}}}}}}....}}}}}}}.}}}..}}}...}}}}}}}} }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}.}}}}}}....}}}}}}}}}}}}}}}}}}}...}}}}}} }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} ENDMAP # RANDOM_PLACES:(04,08),(10,04),(10,08),(10,12) # REGION:(00,00,74,19),lit,"ordinary" REGION:(13,03,18,13),lit,"ordinary",unfilled # TELEPORT_REGION:(64,01,74,17),(0,0,0,0),down TELEPORT_REGION:(02,02,18,13),(0,0,0,0),up # STAIR:(67,01,74,20),(0,0,0,0),up STAIR:place[0],down # DOOR:locked,(04,06) DOOR:locked,(04,10) DOOR:locked,(08,04) DOOR:locked,(08,12) DOOR:locked,(10,06) DOOR:locked,(10,10) DOOR:locked,(12,08) # BRANCH:levregion(27,00,79,20),(0,0,0,0) # NON_DIGGABLE:(01,01,22,14) # OBJECT:'(',"crystal ball",(07,08) # CONTAINER:'`',"statue",place[1],uncursed,"knight",1,"Perseus" OBJECT[75%]:'[',"shield of reflection",contained,cursed,+0 OBJECT[25%]:'[',"levitation boots",contained,random,+0 OBJECT[50%]:')',"scimitar",contained,blessed,+2 OBJECT[50%]:'(',"sack",contained # CONTAINER:'`',"statue",random CONTAINER:'`',"statue",random CONTAINER:'`',"statue",random CONTAINER:'`',"statue",random CONTAINER:'`',"statue",random CONTAINER:'`',"statue",random CONTAINER:'`',"statue",random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,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 # MONSTER:'@',"Medusa",place[0] MONSTER:';',"kraken",(07,07) # # the nesting dragon MONSTER:'D',"yellow dragon", (05,04), asleep MONSTER[50%]:'D',"baby yellow dragon", (04,04), asleep MONSTER[25%]:'D',"baby yellow dragon", (04,05), asleep OBJECT:'%',"egg", (05,04), random, "yellow dragon", random OBJECT[50%]:'%',"egg", (05,04), random, "yellow dragon", random OBJECT[25%]:'%',"egg", (05,04), random, "yellow dragon", random # MONSTER:';',"giant eel",random MONSTER:';',"giant eel",random MONSTER:';',"jellyfish",random MONSTER:';',"jellyfish",random MONSTER:'S',random,random MONSTER:'S',random,random MONSTER:'S',random,random MONSTER:'S',random,random MONSTER:'S',random,random MONSTER:'S',random,random MONSTER:'S',random,random MONSTER:'S',random,random MONSTER:'S',random,random MONSTER:'S',random,random MONSTER:'S',random,random MONSTER:'N',"black naga hatchling", random MONSTER:'N',"black naga hatchling", random MONSTER:'N',"black naga hatchling", random MONSTER:'N',"black naga", random MONSTER:'N',"black naga", random MONSTER:'N',"black naga", random slashem-0.0.7E7F3/dat/gypsy.txt0000664000076400007640000000745510545462317014353 0ustar alialiRead Your Fortune For 50 zorkmids, the gypsy will draw a random card. If your card is a suited card, you get a special fortune. Trump cards each have specific effects, good or bad. There is no skill involved with this service; however, the most useful effects have an extra cost that can be only paid by credit. For this reason, you may want to play the other games first to win enough credit for a good outcome. Three-Card Monte "Let me show you the easiest game to win. I've got these three cards: the ace of swords, two of swords, and three of swords. Watch me shuffle them in front of you. Are you looking carefully? Good. Now can you tell me which one is the ace? That's right! Wasn't that easy? Would you like to win some credit? Just place a bet, and if you can pick the ace again, I'll pay your bet." Actually, it doesn't matter how carefully you watch the gypsy -- by using slight of hand, she can control whether you win or lose. Your chances of winning may increase or decrease as you continue to play the game, depending upon whether the gypsy thinks you are "hooked" on the game. Ninety-Nine After placing a bet, you and the gypsy are each dealt three cards. You alternate turns with the gypsy in which you must play one card from your hand, adjust a total depending on the card you played, and then draw a new card. The object of the game is to force your opponent to play a card that makes the total less than zero or more than niney-nine. The effects of the cards upon the total are as follows: Ace Adds 1 to the total. 2 through 10 Adds the card's value to the total. Jack, Queen Subtracts 10 from the total. King Raises the total to 99. Always safe to play. Fool Raises the total to 100. Always loses. Other trumps No change to the total. Always safe to play. You are the first to play. If there are no more cards left to draw from, you win. Yendorian Tarocchi This game is still under construction, and will be released in a future version. Tarot cards originated for the purpose of playing Tarocchi, an Italian trick-based card game. (Their use in fortunetelling and the occult began much later.) Tarocchi has been adapted and renamed by other cultures: Tarot (France), Tarok (Danish), Troccas (Switzerland), and so on. Pawn Gems You can sell valuable gems to gypsies for credit. About the Cards Our deck of playing cards is derived from several different European card systems. The Italian card system is the oldest, believed to be imported from India, Persia, or Arabia circa 1370. (Note that although playing cards were invented in China, scholarly evidence indicates that they had no direct influence on European cards. Also, cards did not appear in Europe until long after Marco Polo or the Crusades, so it is unlikely that they were introduced by these travellers.) Tarot cards were invented during the 15th century for the purpose of playing trick-taking card games. They were not associated with Gypsies or the occult until the 18th century. Finally, there is the French card system, which has been widely adopted by the English-speaking world. The deck can be divided into two parts. There are 52 "suited" cards that are very similar to the familiar French system (4 suits with 13 ranks); in a Tarot deck, these are called the "minor arcana". The other part of the deck are the "trump" cards, which are called the "major arcana" in a Tarot deck. Our suits are named "swords", "wands", "shields", and "rings". These are assigned by matching the Tarot suits to their closest equivalent NetHack object. Interestingly, there are two "offensive" suits (swords, wands), two "defensive" suits (shields, rings), two "ordinary" suits (swords, shields), and two "magical" suits (wands, rings). slashem-0.0.7E7F3/dat/rumors.tru0000664000076400007640000005135510545462317014520 0ustar alialiA blindfold can be very useful if you're telepathic. A candelabrum affixed with seven candles shows the way with a magical light. A crystal plate mail will not rust. A katana might slice a worm in two. A life saver is not the fresh maker. A magic vomit pump could be useful for gourmands. A nymph knows how to unlock chains. A potion of blindness lets you see invisible things. A priest can get the gods to listen easily. A priestess and a virgin you might be, but that unicorn won't care. A ring of conflict is a bad thing if there is a nurse in the room. A short sword is not as good as a long sword. A succubus will go farther than a nymph. A wand can exorcize a past explorer's ghost. Acid blobs should be attacked bare-handed. Affairs with nymphs are often very expensive. Afraid of nymphs? Wear a ring of adornment. Afraid of your valuables being stolen? Carry more junk! Always be aware of the phase of the moon! Always sweep the floor before engraving important messages. Amulets of Yendor are hard to make. Even for a wand of wishing. An arch-lich isn't the worst kind of lich... An elven cloak protects against magic. An umber hulk can be a confusing sight. As Crom is my witness, I'll never go hungry again! Asking about monsters may be very useful. Attack long worms from the rear -- that is so much safer! Attacking an eel where there is none is usually a fatal mistake! Bandaging wounds helps keep up appearances. Bashing monsters with a bow is not such a good idea. Be careful! The Wizard may plan an ambush! Be nice to a nurse: Put away your weapon and take off your clothes. Being digested is a painfully slow process. Blank scrolls make more interesting reading. Blind? Catch a floating eye! Booksellers never read scrolls; they might get carried away. Concise conquest: Control, confuse, conjure, condemn. Conserve energy, turn off the lights. Digging up a grave could be a bad idea. Dilithium crystals are rare indeed. Dogs are attracted by the smell of tripe. Dogs are superstitious; they never step on cursed items. Dogs of ghosts aren't angry, just hungry. Don't bother about money: only leprechauns and shopkeepers are interested. Don't break the toilet! How will you sit on it then? Don't forget! Large dogs are MUCH harder to kill than little dogs. Don't mess with shopkeepers, or you'll get the Guild after you. Dragons never whip their children; they wouldn't feel it! Eat your carrots. They're good for your eyes. Eating a freezing sphere is like eating a yeti. Eating a killer bee is like eating a scorpion. Eating a tengu is like eating a nymph. Eating a wraith is a rewarding experience! Eating unpaid leprechauns may be advantageous. Elbereth has quite a reputation around these parts. 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. Ever fought with an enchanted tooth? Ever heard of a wand of fear? It's a frightening thought! Ever tried reading while confused? Ever tried to put a troll into a large box? Ever wondered why one would want to dip something in a potion? Expensive cameras have penetrating flash lights. Extra staircases lead to extra levels. Fiery letters might deter monsters. For a good time engrave `Elbereth'. Gems are too precious to be thrown away carelessly. Getting hungry? Stop wearing rings! Getting too warm? Take off that Amulet of Yendor and stay away from the exit! Gods expect the best from their priesthood. Gods look down their noses at demigods. Guy Montag keeps his scrolls in a bag. Handle your flasks carefully -- there might be a ghost inside! Holy water has many uses. Horses trust their riders, even when not so deserved. Hunger is a confusing experience for a dog! I once knew a hacker who ate too fast and choked to death. I smell a maze of twisty little passages. I wish I never wished a wand of wishing. (Wishful thinking.) I wouldn't advise playing catch with a giant. I'm watching you. -- The Wizard of Yendor Ice boxes keep your food fresh. If you are being punished, it's done with a deadly weapon. If you kill the Wizard, you get promoted to demi-god. If you need a wand of digging, kindly ask the minotaur. If you want to hit, use a dagger. If you want to rob a shop, train your dog. If you're lost, try buying a map next time you're in a shop. Inside a shop you better take a look at the price tags before buying anything. It is bad manners to use a wand in a shop. 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. Keep your armors away from rust. Keep your weaponry away from acids. Kill a unicorn of your color and you kill your luck. Leather is waterproof. Ever see a cow with an umbrella? Leprechauns are the most skilled cutpurses in this dungeon. Lizard corpses protect against cockatrices. Look out! Monkeys! Money lost, little lost; honor lost, much lost; pluck lost, all lost. Most monsters can't swim. Music hath charms to affect the stubborn drawbridge. Music hath charms to soothe the savage beast. Never attack a guard. Never ride a long worm. Never use your best weapon to engrave a curse. No easy fighting with a heavy load! Nurses are accustomed to touch naked persons: they don't harm them. Nymphs can unlink more than your chain mail. Once your little dog will be a big dog, and you will be proud of it. Opening a tin is difficult, especially when you attempt it bare handed! Orcs and killer bees share their lifestyle. Orcs do not procreate in dark rooms. Plain nymphs are harmless. Playing AD&D may be helpful. Playing Gauntlet might be enlightening in some situations. Playing billiards pays when you are in a shop. Polymorphing a shopkeeper might make you safer. Polymorphing your dog probably makes you safer. Potions don't usually mix, but sometimes... Psst! It's done with mirrors! Put on a ring of teleportation: it will take you away from onslaught. Rays aren't boomerangs, of course, but still... Read the manual before entering the cave -- you might get killed otherwise. Reading Herbert might be enlightening in one case. Reading Tolkien might help you. Reading scrolls after drinking booze can give confusing results. Rust monsters love water. There are potions they hate, however. Sacks protect contents from temperatures up to 452 degrees fahrenheit. Scrolls fading? It's not the heat, it's the humidity. Shopkeepers accept credit cards, as long as you pay cash. Shopkeepers can spot a tourist a mile away with those Hawaiian shirts. Shopkeepers can't tell identical twins apart. Shopkeepers can't swim. Shopkeepers don't read, so what use is engraving in a shop? Shopkeepers have incredible patience. Shopkeepers might raise their prices for tourists. Shopkeepers value money more than revenge. Sitting on a toilet can be quite a relief! Some monsters can be tamed. I once saw a hacker with a tame dragon! 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. The gods don't appreciate pesky priesthood. The magic marker is mightier than the sword. The moon is not the only heavenly body to influence this game. The orc swings his two handed sword named Elfrist at you. You die... The pen is mightier than the sword. The secret of wands of Nothing Happens: try again! There has always been something mystical about mirrors. There is a Mastermind deep in the dungeon. There is a big treasure hidden in the zoo! 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 Hell used to be a lot bigger. They say that Juiblex is afraid of a wand of digging. They say that Medusa would like to put you on a pedestal. They say that Vecna is alive, and his lich friends are too! They say that Vecna has a huge hoard of treasure. They say that Vlad lives!!! ... in the mazes. They say that `Elbereth' is often written about. They say that a bag of holding can't hold everything. They say that a blessed tin of quasit meat is a quick meal. They say that a cat avoids traps. They say that a cave spider will occasionally eat cave spider eggs. They say that a clever wizard can have stats: 18/** 24 18 24 24 24. They say that a clove of garlic makes a good talisman if handled right. They say that a cursed scroll of teleportation could land you in trouble. They say that a diamond is another kind of luck stone. They say that a dog can be trained to fetch objects. They say that a gelatinous cube makes a healthy breakfast. They say that a giant gets strong by eating right, try it! They say that a grid bug won't hit you when you cross it. They say that a gypsy could tell your fortune for a price. They say that a lembas wafer is a very light snack. They say that a loadstone has a strange attraction and is not bad luck. They say that a lock pick by any other name is still a lock pick. They say that a lucky amulet will block poisoned arrows. They say that a mirror will freeze a floating eye but you can still see it. They say that a neutral character might get Giantslayer. They say that a polymorph trap is magic and magic protection prevents it. They say that a potion of healing can cancel a potion of sickness. They say that a potion of monster detection sometimes works both ways. They say that a sink looks different from high above the floor. They say that a summoned demon could improve your game. They say that a tin of wraith meat is a rare dining experience. They say that a unicorn might bring you luck. They say that a wand of cancellation is like a wand of polymorph. They say that a wand of locking can close more than just doors. They say that a wand of polymorph can change your game. They say that a wizard is even more powerful the second time around. They say that a xorn knows of no obstacles when pursuing you. They say that abusing a credit card could shock you sooner or later. They say that amulets, like most things, can be deadly or life saving. They say that an altar can identify blessings. They say that an ooze will bite your boots and a rockmole will eat them. They say that an unlucky hacker was once killed by an exploding tin. They say that antique dealers are always interested in precious stones. They say that bandaging one's wounds helps to keep up one's appearance. They say that booze can be diluted but not cancelled. They say that by listening carefully, you can hear a secret door! They say that carrots and carrot juice may improve your vision. They say that cave spiders are not considered expensive health food. They say that demigods must leave behind their prized earthly possessions. They say that dipping things in toilets is a bad habit. 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. They say that feeling an unexpected draft of air is sort of a breakthrough. They say that finding a cursed gray stone is always bad luck. They say that gaining a level is an experience that can raise your sights. They say that garter snake meat rarely tastes good but it's still healthy. They say that gauntlets of dexterity have a hidden enchanted touch. They say that going to heaven is just another way of escaping the dungeon. They say that golden nagas are law-abiding denizens as long as you are too. They say that grave robbers sometimes get rich. They say that gray dragon scale mail isn't the last word in armor anymore. They say that gremlins can make you feel cooler than you are now. They say that grid bugs only exist in a strictly Cartesian sense. They say that hackers often feel jumpy about eating nymphs. They say that having polymorph control won't shock you. They say that if it's hard getting your food down another bite could kill. They say that if you don't wear glasses why bother with carrots? They say that if you notice a loose board beneath you, don't step on it. They say that if you start at the bottom the only place to go is up. They say that if you teleport to heaven you're presumed to be dead already. They say that in a shop you can be charged for old charges. They say that in lighter moments you could think of ways to pass a stone. They say that in the dungeon breaking a mirror can be seven years bad luck. They say that in the dungeon you don't usually have any luck at all. They say that in time a blessed luckstone can make your god happy. They say that it is easier to kill the Wizard than to make him stand still. They say that it only takes 1 zorkmid to meet the Kops. They say that it's a blast when you mix the right potions together. They say that it's not blind luck if you catch a glimpse of Medusa. They say that killing a shopkeeper brings bad luck. They say that monsters never step on a scare monster scroll. They say that most monsters find flute recitals extremely boring. They say that mummy corpses are not well preserved. They say that naturally a wand of wishing would be heavily guarded. They say that no one notices the junk underneath a boulder. They say that nobody expects a unicorn horn to rust. They say that nobody knows if an explorer can live forever. Do you? They say that nothing can change the fact that some potions contain a djinni. They say that nothing can change the fact that some potions contain a ghost. They say that nymphs always fall for rock'n'roll, try it! They say that once an Olog-Hai is canned it never shows its face again. They say that once upon a time xans would never scratch your boots. They say that only an experienced wizard can do the tengu shuffle. They say that only chaotics can kill shopkeepers and get away with it. They say that only dogs should drink out of toilets... They say that only female monsters can lay eggs. They say that playing a horn really bad is really good. They say that rubbing a glowing potion does not make it a magic lamp. They say that scalpels become dull because they're not athames. They say that shopkeepers don't like pick-axes. They say that shopkeepers don't mind you bringing your pets in the shop. They say that shopkeepers don't usually mind if you sneak into a shop. They say that shopkeepers often have a large amount of money in their purses. They say that shopkeepers often remember things that you might forget. They say that sinks and armor don't mix, take your cloak off now! They say that sinks run hot and cold and many flavors in between. They say that snake charmers aren't charismatic, just musical. They say that soldiers are always prepared and usually protected. They say that some eggs could hatch in your pack, lucky or not. They say that some fire ants will make you a hot meal. They say that some horns play hot music and others are too cool for words. They say that some humanoids are nonetheless quite human. They say that some shopkeepers consider gems to be family heirlooms. They say that some shopkeepers recognize gems but they won't tell you. They say that some stones are much much heavier than others. They say that some yetis are full of hot air. They say that something very special would be in a well-protected place. They say that speed boots aren't fast enough to let you walk on water. They say that teleport traps are the devil's work. They say that tengu don't wear rings, why should you? They say that tengu never steal gold although they would be good at it. They say that that which was stolen once can be stolen again, ask any nymph. They say that the Delphic Oracle knows that lizard corpses aren't confusing. They say that the Hand of Elbereth can hold up your prayers. They say that the Leprechaun King is rich as Croesus. They say that the Lost Tomb is a bad place to die. They say that the Orc King can't be paralyzed. Why? They say that the Wizard of Yendor is schizophrenic and suicidal. They say that the beholder has a deadly disposition. They say that the experienced character knows how to convert an altar. They say that the gods are happy when they drop objects at your feet. They say that the idea of invisible Nazgul has a certain ring to it. They say that the lady of the lake now lives in a fountain somewhere. They say that the local shopkeeper frowns upon the rude tourist. They say that the only door to the vampire's tower is on its lowest level. They say that the only good djinni is a grateful djinni. They say that the thing about genocide is that it works both ways. They say that the unicorn horn rule is if it ain't broke then don't fix it. They say that the view from a fog cloud is really very moving. They say that the walls in shops are made of extra hard material. They say that there are at least 15 ways to lose a pair of levitation boots. They say that there are important items in the webs of the spiders. They say that there is a luckstone somewhere in the Mines. They say that throwing glass gems is the same as throwing rocks. They say that trespassing a boulder is probably beneath you. They say that unicorn horns and crysknives are sharper than they used to be... They say that unicorns are fond of precious gems. They say that prayer at an altar can sometimes make the water there holy. They say that what goes down the drain might come back up. They say that wielded, a long sword named Fire Brand makes you feel cooler. They say that wielded, a long sword named Frost Brand makes you hot stuff. They say that wiping its face is impossible for a floating eye. They say that with a floating eye you could see in the dark. 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 might find broken smoky potions in the morgue. They say that you should always be prepared for a final challenge. They say that you should ask a dwarf to let you into a locked shop. They say that you should pray for divine inspiration. They say that you should religiously give your gold away. They say that you will never get healthy by eating geckos. They say that zapping yourself with a wand of undead turning is stupid. They say the Wizard's castle is booby-trapped! They say the gods get angry if you kill your dog. They say the gods get angry if you pray too much. They say the shopkeepers are insured by Croesus himself! They say there is a powerful magic item hidden in a castle deep down! Those who wield a cockatrice corpse have a rocky road ahead of them. Throwing food at a wild dog might tame him. To a full belly all food is bad. Trolls are described as rubbery: they keep bouncing back. Try the fall-back end-run play against ghosts. Try using your magic marker on wet scrolls. Two wrongs don't make a right, but three lefts do. Valkyries come from the north, and have commensurate abilities. Vampires hate garlic. Vault guards never disturb their Lords. Vegetarians enjoy lichen and seaweed. Visitors are requested not to apply genocide to shopkeepers. Watch out, the Wizard might come back. Water traps have no effect on dragons. What is a cockatrice going to eat when it gets hungry? Who needs an apron if they're made of glass? Why do you suppose they call them MAGIC markers? Why do you think they call them mercenaries? Why would anybody in his sane mind engrave "Elbereth"? Wishing too much may bring you too little. You can't bribe soldier ants. You can't get gold from a gypsy. You can't leave a shop through the back door: there isn't one! You may discover a fine spirit inside a potion bottle. You may want to dip into a potion of bottled blessings. You might be able to bribe a demon lord. You might trick a shopkeeper if you're invisible. You should certainly learn about quantum mechanics. You're going into the morgue at midnight??? Your dog knows what to eat; maybe you should take lessons. Zap yourself and see what happens... Zapping a wand of undead turning might bring your dog back to life. slashem-0.0.7E7F3/dat/blkmar.des0000664000076400007640000000533210545462317014374 0ustar aliali# # This is the black market # Massimo Campostrini (campo@sunthpi3.difi.unipi.it) # MAZE: "blkmar", ' ' FLAGS: noteleport, hardfloor GEOMETRY: center, center MAP --------------------------------------------------------------------------- |.|.......................................................................| |.|.......................................................................| |.|.......................................................................| |.|.......................................................................| |.|.......................................................................| |.|.......................................................................| |.|.......................................................................| |.|.......................................................................| |.|.......................................................................| |.|.......................................................................| |.|.......................................................................| |.|.......................................................................| |.|.......................................................................| |.+.......................................................................| |.|.......................................................................| |.|.......................................................................| --------------------------------------------------------------------------- ENDMAP NON_DIGGABLE: (00,00,74,17) REGION: (03,01,73,16), lit, "black market", filled BRANCH: (01,01,01,01), (0,0,0,0) DOOR: open, (02,14) ENGRAVING: (01,03), engrave, "Pets are not allowed in the shop" ENGRAVING: (01,05), engrave, "Thieves will be killed." ENGRAVING: (01,07), engrave, "Sorry about the mess. Remember, ask if you need help!" ENGRAVING: (01,09), engrave, "Don't even think about stealing anything." # black marketeer's assistants: # from The Hobbit (Tolkien) MONSTER: 'T', "rock troll", (03,03), "William", asleep, peaceful MONSTER: 'T', "rock troll", (03,12), "Thomas", asleep, peaceful # from the Bible MONSTER: 'H', "frost giant", (03,16), "Goliath", asleep, peaceful # from Greek mythology & high-energy physics MONSTER: 'n', "wood nymph", (03,09), "Daphne", asleep, peaceful # Add your favorite monsters here. Make them peaceful and named, # otherwise they will not behave like assistants. MONSTER: '&', "balrog", (03,04), "Njalnohaar", asleep, peaceful MONSTER: '&', "pit fiend", (03,02), "Hilvuuloth", asleep, peaceful MONSTER: 'c', "cockatrice", (03,13), "Wilbur", asleep, peaceful MONSTER: 'c', "cockatrice", (03,08), "Simon", asleep, peaceful MONSTER: ':', "rhaumbusun", (03,11), "Izzy", asleep, peaceful slashem-0.0.7E7F3/dat/stor-2.des0000664000076400007640000000222210545462317014245 0ustar aliali# # Storage level (#1) # LEVEL: "stor-2" ROOM: "ordinary", unlit, random, random, (4,4) NAME: "central" OBJECT:'(',"chest",(2,2) OBJECT:'/',random,(2,2) OBJECT:'(',random,(2,2) OBJECT:'(',random,(2,2) OBJECT:'=',random,(2,2) OBJECT:'=',"regeneration",(2,2) OBJECT:'*',random,(2,2) ENGRAVING:(2,2),burn,"Danger! Cursed Items! Do Not Touch!" TRAP: random, random TRAP: random, random TRAP: random, random ROOM: "ordinary" , random, random, random, random STAIR: random, up OBJECT: random,random,random MONSTER: random, random, random, hostile ROOM: "ordinary" , random, random, random, random STAIR: random, down OBJECT: random, random, random TRAP: random, random MONSTER: random, random, random, hostile ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random OBJECT: random, random, random MONSTER: random, random, random, hostile ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random TRAP: random, random MONSTER: random, random, random, hostile ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random TRAP: random, random MONSTER: random, random, random, hostile RANDOM_CORRIDORS slashem-0.0.7E7F3/dat/Flame.des0000664000076400007640000002313110545462317014145 0ustar aliali# SCCS Id: @(#)Flame.des 3.4 1991/09/30 # Copyright (c) 1989 by Jean-Christophe Collet # Copyright (c) 1991-2 by M. Stephenson # NetHack may be freely redistributed. See license for details. # # The "start" level for the quest. # # Here you meet your (besieged) class leader, the High Flame Mage, # and receive your quest assignment. # MAZE: "Fla-strt",' ' FLAGS: noteleport,hardfloor GEOMETRY:center,center MAP LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL LLL........LLLLLLLL....LLLLLLLLLLLLL......................LLLLLLLLL.LLLLLLLL LLL.LLLLLLL.LLLLLL.L...LLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLL...LLLLLLL LLL.LLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLL.LLLLL.L.LLLLLLLL LLL.LLLLLLLLL.LL.LLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLL.LLLLLLLLLLL LLL.LLLLLLLLLL..LLLLLLLLLLLLLLLL..........LLLLLLLLLLLLLLLLLLL.L.LLLLLLLLLLLL LLL.LLL.LLLLLLL.LLLLLLLLLLLLLL...LLLLLLLL...LLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLL LPL.LLPPLLLLLLLLL.LLLLLLLLLL...LLL......LLL...LLLLLLLLLLLLLLLL.LLLLLLLLLLLLL LLPP.PPPLPLLLLLLLL....LLLLL...LL..........LL...LLLLLLLLLLLLLLL.LLLLLLLLLLLLL LLPP...PPLLLLLLLL.LLLL.......LL............LL........LLLLLLLLL.LLLLLLLLLLLLL LPP.....PPPLLLLL.LLLLLLLLLL...LL..........LL...LLLLLL.LLLLLLLL.LLLLLLLLLLLLL LPPP...PPPLLLLL.LLLLLLLLLLLL...LLL......LLL...LLLLLLLL.LLLLLLLL.LLLLLLLLLLLL LLLPP.PPPLLLLL.LLLLLLLLLLLLLLL...LLLLLLLL...LLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLL L.LLPPPPLLLLLL.LLLLLLLLLLLLLLLLL..........LLLLLLLLLLLL.LLLLLLLLLL.LL..LLLLLL LLLLLLLPLLLLLLL.LLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLLLL.....LLLLL LL.LLL.PPLLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLLL.......LLLLLLLLLLLLLL....LLLLL LLLLLL.LLLLLLLLLL.............................LLLLLLLLLLLLLLLLLLLLLL..LLLLLL LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL ENDMAP # Random Monsters RANDOM_MONSTERS: 'R', 'E' # Dungeon Description REGION:(00,00,75,19),lit,"ordinary" # Portal arrival point BRANCH:(69,17,69,17),(0,0,0,0) # Stairs STAIR:(05,12),down # High Flame Mage MONSTER:'@',"High Flame Mage",(36,11) # The treasure of the High Flame Mage OBJECT:'(',"chest",(37,11) # guards for the audience chamber MONSTER:'@',"igniter",(34,09) MONSTER:'@',"igniter",(34,10) MONSTER:'@',"igniter",(34,11) MONSTER:'@',"igniter",(34,12) MONSTER:'@',"igniter",(34,13) MONSTER:'@',"igniter",random MONSTER:'@',"igniter",random MONSTER:'D',"baby red dragon",random,peaceful MONSTER:'D',"red dragon",random,peaceful MONSTER:'D',"red dragon",random,peaceful # Non diggable NON_DIGGABLE:(00,00,75,19) # Random traps TRAP:"rust",random TRAP:"rust",random TRAP:"rust",random TRAP:"rust",random TRAP:"rust",random TRAP:"rust",random TRAP:"rust",random TRAP:"rust",random # Monsters on siege duty. MONSTER: 'E',"water elemental",random,hostile MONSTER: 'E',"water elemental",random,hostile MONSTER: 'E',"water elemental",random,hostile MONSTER: 'E',"water elemental",random,hostile MONSTER: 'E',"water elemental",random,hostile MONSTER: 'E',"water elemental",random,hostile MONSTER: 'R',"rust monster",random,hostile MONSTER: 'R',"rust monster",random,hostile MONSTER: 'R',"rust monster",random,hostile MONSTER: 'R',"rust monster",random,hostile # # The "locate" level for the quest. # # Here you have to find the cave of Surtur to go # further towards your assigned quest. # MAZE: "Fla-loca",' ' FLAGS: hardfloor INIT_MAP: '.' , 'L' , true , true , lit , false GEOMETRY:center,center MAP PPPP.... ....PPPPP. PLP... .PPLLLPP PPP ....................... PPPLLP .. ............................ PPPP . ............................... .... ................................. .. .................................... . ................................... . .................................. . .. .............................. PP .PPP .......................... PLP .PLLP ..PLLP .PPPP.. ....PPPP ENDMAP # Random Monsters RANDOM_MONSTERS: 'E', 'R' # Dungeon Description REGION:(00,00,39,12),lit,"ordinary" # Stairs STAIR:(48,14),up STAIR:(20,06),down # Non diggable walls NON_DIGGABLE:(00,00,39,12) # Objects OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random # Random traps TRAP:"rust",random TRAP:"rust",random TRAP:"rust",random TRAP:"rust",random TRAP:random,random TRAP:random,random # Random monsters. MONSTER:'E',"water elemental",random,hostile MONSTER:'E',"water elemental",random,hostile MONSTER:'E',"water elemental",random,hostile MONSTER:'E',"water elemental",random,hostile MONSTER:'E',"water elemental",random,hostile MONSTER:'E',"water elemental",random,hostile MONSTER:'E',"water elemental",random,hostile MONSTER:'E',"water elemental",random,hostile MONSTER:'E',"water elemental",random,hostile MONSTER:'R',"rust monster",random,hostile MONSTER:'R',"rust monster",random,hostile MONSTER:'R',"rust monster",random,hostile MONSTER:'R',"rust monster",random,hostile # # The "goal" level for the quest. # # Here you meet Lord Surtur your nemesis monster. You have to # defeat Lord Surtur in combat to gain the artifact you have # been assigned to retrieve. # MAZE: "Fla-goal", 'P' INIT_MAP: '.' , 'P' , true , true , lit , false GEOMETRY:center,center MAP .....PPPPPPPPPPPPPPPPPPPPPPPPP..... ...PPPPPPPPPPPPPP.PPPPPPPPPPPPPP... ..PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP.. .PPPPPPPPPPP|---------|PPPPPPPPPPP. .PPPPPPPPP|--.........--|PPPPPPPPP. PPPPPPPPP|-...PPPPPPP...-|PPPPPPPPP PPPPPPPPP|...PP.....PP...|PPPPPPPPP PPPPPPPP|-..PP.......PP..-|PPPPPPPP PPPPPPPP|...PP.......PP...|PPPPPPPP PPPPPPPP|-..PP.......PP..-|PPPPPPPP PPPPPPPPP|...PP.....PP...|PPPPPPPPP PPPPPPPPP|-...PPPPPPP...-|PPPPPPPPP .PPPPPPPPP|--.........--|PPPPPPPPP. .PPPPPPPPPPP|---------|PPPPPPPPPPP. ..PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP.. ...PPPPPPPPPPPPPP.PPPPPPPPPPPPPP... .....PPPPPPPPPPPPPPPPPPPPPPPPP..... ENDMAP # Random Monsters RANDOM_MONSTERS: 'E', 'R' # Dungeon Description REGION:(00,00,34,16),lit,"ordinary" # Stairs # Note: The up stairs are *intentionally* off of the map. STAIR:(45,10),up # Non diggable walls NON_DIGGABLE:(00,00,34,16) # Drawbridges DRAWBRIDGE:(17,02),south,closed DRAWBRIDGE:(17,14),north,closed # Objects OBJECT:'(',"magic candle",(17,08),blessed,0,"The Candle of Eternal Flame" OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random # Random traps TRAP:"rust",random TRAP:"rust",random TRAP:"rust",random TRAP:"rust",random TRAP:random,random TRAP:random,random # KMH, balance patch 2 -- all quests now have an altar ALTAR:(17,08),noalign,altar # Random monsters. MONSTER:'@',"Water Mage",(17,08) MONSTER:'E',"water elemental",random,hostile MONSTER:'E',"water elemental",random,hostile MONSTER:'E',"water elemental",random,hostile MONSTER:'E',"water elemental",random,hostile MONSTER:'E',"water elemental",random,hostile MONSTER:'E',"water elemental",random,hostile MONSTER:'E',"water elemental",random,hostile MONSTER:'E',"water elemental",random,hostile MONSTER:'E',"water elemental",random,hostile MONSTER:'E',"water elemental",random,hostile MONSTER:'E',"water elemental",random,hostile MONSTER:'E',"water elemental",random,hostile MONSTER:'R',"rust monster",random,hostile MONSTER:'R',"rust monster",random,hostile MONSTER:'R',"rust monster",random,hostile MONSTER:'R',"rust monster",random,hostile # # The "fill" levels for the quest. # # These levels are used to fill out any levels not occupied by specific # levels as defined above. "filla" is the upper filler, between the # start and locate levels, and "fillb" the lower between the locate # and goal levels. # MAZE: "Fla-fila" , 'L' INIT_MAP: '.' , 'L' , true , true , lit, false NOMAP # STAIR: random, up STAIR: random, down # OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random # MONSTER: 'E', "water elemental", random MONSTER: 'E', "water elemental", random MONSTER: 'E', "water elemental", random MONSTER: 'E', "water elemental", random MONSTER: 'E', "water elemental", random MONSTER: 'E', "water elemental", random MONSTER: 'E', "water elemental", random MONSTER: 'R', "rust monster", random, hostile MONSTER: 'R', "rust monster", random, hostile MONSTER: 'R', "rust monster", random, hostile # TRAP: random, random TRAP: random, random TRAP: random, random TRAP: random, random TRAP: random, random TRAP: random, random TRAP: random, random MAZE: "Fla-filb" , 'P' INIT_MAP: '.' , 'P' , true , true , lit, false NOMAP # STAIR: random, up STAIR: random, down # OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random # MONSTER: 'E', "water elemental", random MONSTER: 'E', "water elemental", random MONSTER: 'E', "water elemental", random MONSTER: 'E', "water elemental", random MONSTER: 'E', "water elemental", random MONSTER: 'E', "water elemental", random MONSTER: 'E', "water elemental", random MONSTER: 'R', "rust monster", random, hostile MONSTER: 'R', "rust monster", random, hostile # TRAP: "rust", random TRAP: "rust", random TRAP: "rust", random TRAP: "rust", random TRAP: "rust", random TRAP: random, random TRAP: random, random slashem-0.0.7E7F3/dat/giants.des0000664000076400007640000000773110545462317014416 0ustar aliali# the Giant caves MAZE: "cav2fill",' ' GEOMETRY: center,center #0 1 2 3 4 5 6 #1234567890123456789012345678901234567890123456789012345678901234567890 MAP ----------| |---| |.........| |...| |---------| -----------| |.........| |...| |.........| |..........| |.........| |...| |.........| |..........| |----+------------+----------------+------| |..........| |.........................................| |..........| |.........................................|-----------| |--|.......| |----+------+----------------+-----------+|...........| |---+--------.......|...........|....|......| |................| |...................|...........|....|......| |................| |...................|-----------|....|......| |................| |\..................S...........|....|......| |................| |...................|-------------+--|......| |----------------| |-------+-----------|......|................| |...............|......|................| |...............+......|................| |...............|-----------------------| |...............| |---------------| ENDMAP # # STAIR:(34,02),up BRANCH:(34,02,34,02),(0,0,0,0) # DOOR: closed,(34,4) DOOR: closed,(21,4) DOOR: closed,(51,4) DOOR: closed,(57,7) DOOR: closed,(45,7) DOOR: closed,(28,7) DOOR: closed,(21,7) DOOR: closed,(8,8) DOOR: closed,(38,12) DOOR: closed,(12,13) DOOR: closed,(24,15) # # the king's hidden treasure OBJECT:'(',"chest",(35,11) GOLD: random,(35,11) GOLD: random,(35,11) GOLD: random,(35,11) GOLD: random,(35,11) GOLD: random,(35,11) GOLD: random,(35,11) GOLD: random,(35,11) OBJECT: '*', random, (35,11) OBJECT: '*', random, (35,11) OBJECT: '*', random, (35,11) OBJECT: '*', random, (35,11) OBJECT: '*', random, (35,11) OBJECT: '"', random, (35,11) OBJECT: '"', random, (35,11) OBJECT: random, random, (35,11) OBJECT: random, random, (35,11) OBJECT: random, random, (35,11) # stuff scattered around OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random # # # MONSTER: 'H', "giant", random, hostile MONSTER: 'H', "giant", random, hostile MONSTER: 'H', "giant", random, hostile MONSTER: 'H', "giant", random, hostile MONSTER: 'H', "giant", random, hostile MONSTER: 'H', "giant", random, hostile MONSTER: 'H', "giant", random, hostile MONSTER: 'H', "giant", random, hostile MONSTER: 'H', "giant", random, hostile MONSTER: 'H', "giant", random, hostile MONSTER: 'H', "giant", random, hostile MONSTER: 'H', "giant", random, hostile MONSTER: 'H', "giant", random, hostile MONSTER: 'H', "giant", random, hostile MONSTER: 'H', "giant", random, hostile MONSTER: 'H', "giant", random, hostile MONSTER: 'H', "giant", random, hostile MONSTER: 'H', "giant", random, hostile MONSTER: 'H', "giant", random, hostile MONSTER: 'H', "giant", random, hostile MONSTER: 'H', random, random, hostile MONSTER: 'H', random, random, hostile MONSTER: 'H', random, random, hostile MONSTER: 'H', random, random, hostile MONSTER: 'H', random, random, hostile MONSTER: 'H', random, random, hostile MONSTER: 'H', random, random, hostile MONSTER: 'H', "the Largest Giant", (5,11), hostile MONSTER: 'O', random, random, hostile MONSTER: 'O', random, random, hostile MONSTER: 'O', random, random, hostile MONSTER: 'O', random, random, hostile MONSTER: 'O', random, random, hostile MONSTER: 'O', random, random, hostile MONSTER: 'O', random, random, hostile MONSTER: 'O', random, random, hostile MONSTER: 'T', random, random, hostile MONSTER: 'T', random, random, hostile MONSTER: 'T', random, random, hostile MONSTER: 'T', random, random, hostile # TRAP: random, random TRAP: random, random TRAP: random, random TRAP: random, random slashem-0.0.7E7F3/dat/pet_mark.pbm0000664000076400007640000000001410545462317014721 0ustar alialiP48 76>slashem-0.0.7E7F3/dat/Barb.des0000664000076400007640000003141610545462317013774 0ustar aliali# 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. # # The "start" level for the quest. # # Here you meet your (besieged) class leader, Pelias, # and receive your quest assignment. # MAZE: "Bar-strt",' ' FLAGS: noteleport,hardfloor GEOMETRY:center,center MAP ..................................PP........................................ ...................................PP....................................... ...................................PP....................................... ....................................PP...................................... ........--------------......-----....PPP.................................... ........|...S........|......+...|...PPP..................................... ........|----........|......|...|....PP..................................... ........|.\..........+......-----........................................... ........|----........|...............PP..................................... ........|...S........|...-----.......PPP.................................... ........--------------...+...|......PPPPP................................... .........................|...|.......PPP.................................... ...-----......-----......-----........PP.................................... ...|...+......|...+..--+--.............PP................................... ...|...|......|...|..|...|..............PP.................................. ...-----......-----..|...|.............PPPP................................. .....................-----............PP..PP................................ .....................................PP...PP................................ ....................................PP...PP................................. ....................................PP....PP................................ ENDMAP # Dungeon Description REGION:(00,00,75,19),lit,"ordinary" REGION:(09,05,11,05),unlit,"ordinary" REGION:(09,07,11,07),lit,"ordinary" REGION:(09,09,11,09),unlit,"ordinary" REGION:(13,05,20,09),lit,"ordinary" REGION:(29,05,31,06),lit,"ordinary" REGION:(26,10,28,11),lit,"ordinary" REGION:(04,13,06,14),lit,"ordinary" REGION:(15,13,17,14),lit,"ordinary" REGION:(22,14,24,15),lit,"ordinary" # Stairs STAIR:(09,09),down # Portal arrival point BRANCH:(62,02,62,02),(0,0,0,0) # Doors DOOR:locked,(12,05) DOOR:locked,(12,09) DOOR:closed,(21,07) DOOR:open,(07,13) DOOR:open,(18,13) DOOR:open,(23,13) DOOR:open,(25,10) DOOR:open,(28,05) # Elder MONSTER:'@',"Pelias",(10,07) # The treasure of Pelias OBJECT:'(',"chest",(09,05) # chieftain guards for the audience chamber MONSTER:'@',"chieftain",(10,05) MONSTER:'@',"chieftain",(10,09) MONSTER:'@',"chieftain",(11,05) MONSTER:'@',"chieftain",(11,09) MONSTER:'@',"chieftain",(14,05) MONSTER:'@',"chieftain",(14,09) MONSTER:'@',"chieftain",(16,05) MONSTER:'@',"chieftain",(16,09) # Non diggable walls NON_DIGGABLE:(00,00,75,19) # One trap to keep the ogres at bay. TRAP:"spiked pit",(37,07) # Eels in the river MONSTER:';',"giant eel",(36,01) MONSTER:';',"giant eel",(37,09) MONSTER:';',"giant eel",(39,15) # Monsters on siege duty. MONSTER:'O',"ogre",(40,08),hostile MONSTER:'O',"ogre",(41,06),hostile MONSTER:'O',"ogre",(41,07),hostile MONSTER:'O',"ogre",(41,08),hostile MONSTER:'O',"ogre",(41,09),hostile MONSTER:'O',"ogre",(41,10),hostile MONSTER:'O',"ogre",(42,06),hostile MONSTER:'O',"ogre",(42,07),hostile MONSTER:'O',"ogre",(42,08),hostile MONSTER:'O',"ogre",(42,09),hostile MONSTER:'O',"ogre",(42,10),hostile # # The "locate" level for the quest. # # Here you have to infiltrate the Duali Oasis to go # further towards your assigned quest. # MAZE: "Bar-loca",' ' FLAGS: hardfloor GEOMETRY:center,center MAP ..........PPP......................................... ...........PP.......................................... ....... ..........PP...........-----..........------------------ .......... ...........PP..........+...|..........|....S...........|.. ............ ..........PPP..........|...|..........|-----...........|... ............. ...........PPP.........-----..........+....+...........|... ............. ..........PPPPPPPPP...................+....+...........S................. ........PPPPPPPPPPPPP.........-----...|-----...........|................ ......PPPPPPPPPPPPPP..P.......+...|...|....S...........| ... .....PPPPPPP......P..PPPP.....|...|...------------------.. ... ....PPPPPPP.........PPPPPP....-----........................ ........ ...PPPPPPP..........PPPPPPP.................................. .......... ....PPPPPPP........PPPPPPP.................................... .......... .....PPPPP........PPPPPPP.........-----........................ ........ ......PPP..PPPPPPPPPPPP...........+...|......................... ..... ..........PPPPPPPPPPP.............|...|......................... .... ..........PPPPPPPPP...............-----......................... . ..............PPP................................................. ...............PP.................................................... ................PPP................................................... ENDMAP # Dungeon Description REGION:(00,00,75,19),lit,"ordinary" REGION:(24,03,26,04),unlit,"ordinary" REGION:(31,08,33,09),unlit,"ordinary" REGION:(35,14,37,15),unlit,"ordinary" REGION:(39,03,54,08),lit,"ordinary" REGION:(56,00,75,08),unlit,"ordinary" REGION:(64,09,75,16),unlit,"ordinary" # Doors DOOR:open,(23,03) DOOR:open,(30,08) DOOR:open,(34,14) DOOR:locked,(38,05) DOOR:locked,(38,06) DOOR:closed,(43,03) DOOR:closed,(43,05) DOOR:closed,(43,06) DOOR:closed,(43,08) DOOR:locked,(55,06) # Stairs STAIR:(05,02),up STAIR:(70,13),down # Objects OBJECT:random,random,(42,03) OBJECT:random,random,(42,03) OBJECT:random,random,(42,03) OBJECT:random,random,(41,03) OBJECT:random,random,(41,03) OBJECT:random,random,(41,03) OBJECT:random,random,(41,03) OBJECT:random,random,(41,08) OBJECT:random,random,(41,08) OBJECT:random,random,(42,08) OBJECT:random,random,(42,08) OBJECT:random,random,(42,08) OBJECT:random,random,(71,13) OBJECT:random,random,(71,13) OBJECT:random,random,(71,13) # Random traps TRAP:"spiked pit",(10,13) TRAP:"spiked pit",(21,07) TRAP:"spiked pit",(67,08) TRAP:"spiked pit",(68,09) TRAP:random,random TRAP:random,random TRAP:random,random TRAP:random,random # Random monsters. MONSTER:'O',"ogre",(12,09),hostile MONSTER:'O',"ogre",(18,11),hostile MONSTER:'O',"ogre",(45,05),hostile MONSTER:'O',"ogre",(45,06),hostile MONSTER:'O',"ogre",(47,05),hostile MONSTER:'O',"ogre",(46,05),hostile MONSTER:'O',"ogre",(56,03),hostile MONSTER:'O',"ogre",(56,04),hostile MONSTER:'O',"ogre",(56,05),hostile MONSTER:'O',"ogre",(56,06),hostile MONSTER:'O',"ogre",(57,03),hostile MONSTER:'O',"ogre",(57,04),hostile MONSTER:'O',"ogre",(57,05),hostile MONSTER:'O',"ogre",(57,06),hostile MONSTER:'O',"ogre",random,hostile MONSTER:'O',"ogre",random,hostile MONSTER:'O',"ogre",random,hostile MONSTER:'O',random,random,hostile MONSTER:'T',random,random,hostile MONSTER:'T',"rock troll",(46,06),hostile MONSTER:'T',"rock troll",(47,06),hostile MONSTER:'T',"rock troll",(56,07),hostile MONSTER:'T',"rock troll",(57,07),hostile MONSTER:'T',"rock troll",(70,13),hostile MONSTER:'T',"rock troll",random,hostile MONSTER:'T',"rock troll",random,hostile MONSTER:'T',random,random,hostile # # The "goal" level for the quest. # # Here you meet Thoth Amon, your nemesis monster. You have to # defeat Thoth Amon in combat to gain the artifact you have # been assigned to retrieve. # MAZE: "Bar-goal", ' ' GEOMETRY:center,center MAP ............. .................. .... ......................... .... ....... .......................... ....... ...... ........................ ....... .. ...................................... .. .. ..................... .. .. .................. .. .. ..S...S.............. ................ .. ........ ... ......... .. ...... .. ... .... .. ... .. ...... ........ .... .. .................. ........ ...... ...... ...................... ...... .. .... .................. ........... .............. ........... ENDMAP # Dungeon Description REGION:(00,00,75,19),unlit,"ordinary" # Secret doors DOOR:locked,(22,09) DOOR:locked,(26,09) # Stairs STAIR:(36,05),up # The altar. Unattended. ALTAR:(63,04),noncoaligned,altar NON_DIGGABLE:(00,00,75,19) # Objects OBJECT:'*',"luckstone",(63,04),blessed,0,"The Heart of Ahriman" OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,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:'@',"Thoth Amon",(63,04),hostile MONSTER:'O',"ogre",random,hostile MONSTER:'O',"ogre",random,hostile MONSTER:'O',"ogre",random,hostile MONSTER:'O',"ogre",random,hostile MONSTER:'O',"ogre",random,hostile MONSTER:'O',"ogre",random,hostile MONSTER:'O',"ogre",random,hostile MONSTER:'O',"ogre",random,hostile MONSTER:'O',"ogre",random,hostile MONSTER:'O',"ogre",random,hostile MONSTER:'O',"ogre",random,hostile MONSTER:'O',"ogre",random,hostile MONSTER:'O',"ogre",random,hostile MONSTER:'O',"ogre",random,hostile MONSTER:'O',"ogre",random,hostile MONSTER:'O',"ogre",random,hostile MONSTER:'O',random,random,hostile MONSTER:'O',random,random,hostile MONSTER:'T',"rock troll",random,hostile MONSTER:'T',"rock troll",random,hostile MONSTER:'T',"rock troll",random,hostile MONSTER:'T',"rock troll",random,hostile MONSTER:'T',"rock troll",random,hostile MONSTER:'T',"rock troll",random,hostile MONSTER:'T',"rock troll",random,hostile MONSTER:'T',"rock troll",random,hostile MONSTER:'T',random,random,hostile WALLIFY # # The "fill" levels for the quest. # # These levels are used to fill out any levels not occupied by specific # levels as defined above. "filla" is the upper filler, between the # start and locate levels, and "fillb" the lower between the locate # and goal levels. # MAZE: "Bar-fila" , ' ' INIT_MAP: '.' , '.' , true , true , unlit , false NOMAP # STAIR: random, up STAIR: random, down # OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, 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 # MONSTER: 'O', "ogre", random, hostile MONSTER: 'O', "ogre", random, hostile MONSTER: 'O', random, random, hostile MONSTER: 'T', "rock troll", random, hostile MAZE: "Bar-filb" , ' ' INIT_MAP: '.' , ' ' , true , true , unlit , true NOMAP # STAIR: random, up STAIR: random, down # OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, 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 # MONSTER: 'O', "ogre", random, hostile MONSTER: 'O', "ogre", random, hostile MONSTER: 'O', "ogre", random, hostile MONSTER: 'O', "ogre", random, hostile MONSTER: 'O', "ogre", random, hostile MONSTER: 'O', "ogre", random, hostile MONSTER: 'O', "ogre", random, hostile MONSTER: 'O', random , random, hostile MONSTER: 'T', "rock troll", random, hostile MONSTER: 'T', "rock troll", random, hostile MONSTER: 'T', "rock troll", random, hostile MONSTER: 'T', random , random, hostile slashem-0.0.7E7F3/dat/Monk.des0000664000076400007640000002616510545462317014037 0ustar aliali# SCCS Id: @(#)Monk.des 3.4 2002/04/08 # Copyright (c) 1989 by Jean-Christophe Collet # Copyright (c) 1991-2 by M. Stephenson # NetHack may be freely redistributed. See license for details. # # The "start" level for the quest. # # Here you meet your (besieged) class leader, the Grand Master # and receive your quest assignment. # MAZE: "Mon-strt",' ' FLAGS: noteleport,hardfloor GEOMETRY:center,center MAP ............................................................................ ............................................................................ ............................................................................ ....................------------------------------------.................... ....................|................|.....|.....|.....|.................... ....................|..------------..|--+-----+-----+--|.................... ....................|..|..........|..|.................|.................... ....................|..|..........|..|+---+---+-----+--|.................... ..................---..|..........|......|...|...|.....|.................... ..................+....|..........+......|...|...|.....|.................... ..................+....|..........+......|...|...|.....|.................... ..................---..|..........|......|...|...|.....|.................... ....................|..|..........|..|+-----+---+---+--|.................... ....................|..|..........|..|.................|.................... ....................|..------------..|--+-----+-----+--|.................... ....................|................|.....|.....|.....|.................... ....................------------------------------------.................... ............................................................................ ............................................................................ ............................................................................ ENDMAP # Dungeon Description REGION:(00,00,75,19),lit,"ordinary" REGION:(24,06,33,13),lit,"temple" # Portal arrival point BRANCH:(05,04,05,04),(0,0,0,0) # Stairs STAIR:(52,09),down # Doors DOOR:locked,(18,09) DOOR:locked,(18,10) DOOR:closed,(34,09) DOOR:closed,(34,10) DOOR:closed,(40,05) DOOR:closed,(46,05) DOOR:closed,(52,05) DOOR:locked,(38,07) DOOR:closed,(42,07) DOOR:closed,(46,07) DOOR:closed,(52,07) DOOR:locked,(38,12) DOOR:closed,(44,12) DOOR:closed,(48,12) DOOR:closed,(52,12) DOOR:closed,(40,14) DOOR:closed,(46,14) DOOR:closed,(52,14) # Unattended Altar - unaligned due to conflict - player must align it. ALTAR:(28,09),noalign,altar # The Grand Master MONSTER:'@',"Grand Master",(28,10) # No treasure chest! # guards for the audience chamber MONSTER:'@',"abbot",(32,07) MONSTER:'@',"abbot",(32,08) MONSTER:'@',"abbot",(32,11) MONSTER:'@',"abbot",(32,12) MONSTER:'@',"abbot",(33,07) MONSTER:'@',"abbot",(33,08) MONSTER:'@',"abbot",(33,11) MONSTER:'@',"abbot",(33,12) # Non diggable walls NON_DIGGABLE:(00,00,75,19) # Random traps TRAP:"dart",(20,09) TRAP:"dart",(20,10) TRAP:random,random TRAP:random,random TRAP:random,random TRAP:random,random # Monsters on siege duty. MONSTER: 'E',"earth elemental",(37,01) MONSTER: 'E',"earth elemental",(37,18) MONSTER: 'E',"earth elemental",(03,03) MONSTER: 'E',"earth elemental",(65,04) MONSTER: 'E',"earth elemental",(12,11) MONSTER: 'E',"earth elemental",(60,12) MONSTER: 'E',"earth elemental",(14,08) MONSTER: 'E',"earth elemental",(55,00) MONSTER: 'X',"xorn",(18,18) MONSTER: 'X',"xorn",(59,10) MONSTER: 'X',"xorn",(13,09) MONSTER: 'X',"xorn",(01,17) # # The "locate" level for the quest. # # Here you have to locate the Monastery of the Earth-Lord to # go further towards your assigned quest. # MAZE: "Mon-loca",' ' GEOMETRY:center,center # 1 2 3 4 5 6 7 #123456789012345678901234567890123456789012345678901234567890123456789012345 MAP ---------------------------------------------------- -------- ---.................................................- --.....| ---...--------........------........................--- ---...| ---.....- --.......- ----..................---- --.-- ---.....---- --------- --..................-- --..| ---...----- ----.----.....----.....--- --..|| ----..---- -----..--- |...--- |.......--- --...| |...--- ----....--- |.--- |.........-- --...|| |...- ----.....--- ---- |..........---....| |...---- ----......--- | |...|.......-....|| |......----- ---.........- | -----...|............| |..........----- ----...........--- -------......||...........|| |..............-----................--- |............|||..........| |-S----...............................--- |...........|| |.........|| |.....|..............------.............-----..........|| ||........| |.....|.............-- ---.........................|| |.......|| |.....|.............- ---.....................--| ||......| |---S--------.......---- --.................---- |.....|| |...........|..........--------..............----- ||....| |...........|............................----- |....| ------------------------------------------ ------ ENDMAP # Random Monsters RANDOM_MONSTERS: 'E', 'X' # Dungeon Description REGION:(00,00,75,20),lit,"ordinary" # Stairs STAIR:random,up STAIR:random,down # 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 OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,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: 'E',"earth elemental",random MONSTER: 'E',"earth elemental",random MONSTER: 'E',"earth elemental",random MONSTER: 'E',"earth elemental",random MONSTER: 'E',"earth elemental",random MONSTER: 'E',"earth elemental",random MONSTER: 'E',"earth elemental",random MONSTER: 'E',"earth elemental",random MONSTER: 'E',"earth elemental",random MONSTER: 'E',"earth elemental",random MONSTER: 'E',"earth elemental",random MONSTER: 'E',"earth elemental",random MONSTER: 'E',"earth elemental",random MONSTER: 'E',"earth elemental",random MONSTER: 'X',"xorn",random MONSTER: 'X',"xorn",random MONSTER: 'X',"xorn",random MONSTER: 'X',"xorn",random MONSTER: 'X',"xorn",random MONSTER: 'X',"xorn",random MONSTER: 'X',"xorn",random MONSTER: 'X',"xorn",random MONSTER: 'X',"xorn",random # # The "goal" level for the quest. # # Here you meet Master Kaen, your nemesis monster. You have to # defeat Master Kaen in combat to gain the artifact you have # been assigned to retrieve. # MAZE: "Mon-goal", ' ' INIT_MAP: 'L' , '.' , false , false , unlit , false GEOMETRY:center,center MAP .L......L.LLL.......LL.... .LLL.......L......LL...... LL.LL.............L.LL.... .......................... ......................LL.. ......................LLL. LL........................ .LL....................... .LL................LL.L... ..LL.....L.LL.......LLL... .........LLL.........L.... ENDMAP # Dungeon Description RANDOM_PLACES:(14,04),(13,07) REGION:(00,00,25,10),unlit,"ordinary" # Stairs STAIR:(20,05),up # Objects OBJECT:'(',"lenses",place[0],blessed,0,"The Eyes of the Overworld" OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random # Random traps TRAP:"fire",random TRAP:"fire",random TRAP:"fire",random TRAP:"fire",random TRAP:random,random TRAP:random,random # Random monsters. MONSTER:'@',"Master Kaen",place[0] ALTAR:place[0],noalign,altar MONSTER: 'E',"earth elemental",random MONSTER: 'E',"earth elemental",random MONSTER: 'E',"earth elemental",random MONSTER: 'E',"earth elemental",random MONSTER: 'E',"earth elemental",random MONSTER: 'E',"earth elemental",random MONSTER: 'E',"earth elemental",random MONSTER: 'E',"earth elemental",random MONSTER: 'E',"earth elemental",random MONSTER: 'X',"xorn",random MONSTER: 'X',"xorn",random MONSTER: 'X',"xorn",random MONSTER: 'X',"xorn",random MONSTER: 'X',"xorn",random MONSTER: 'X',"xorn",random MONSTER: 'X',"xorn",random MONSTER: 'X',"xorn",random MONSTER: 'X',"xorn",random # # The "fill" levels for the quest. # # These levels are used to fill out any levels not occupied by specific # levels as defined above. "fila" is the upper filler, between the # start and locate levels, and "filb" the lower between the locate # and goal levels. # LEVEL: "Mon-fila" # Random Monsters RANDOM_MONSTERS: 'E', 'X' # ROOM: "ordinary" , random, random, random, random STAIR: random, up OBJECT: random,random,random MONSTER: 'E', random, random, hostile ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random OBJECT: random,random,random MONSTER: 'E', random, random, hostile ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random TRAP: random, random OBJECT: random,random,random MONSTER: 'X', "xorn", random MONSTER: 'E', "earth elemental", random ROOM: "ordinary" , random, random, random, random STAIR: random, down OBJECT: random, random, random TRAP: random, random MONSTER: 'E', random, random, hostile MONSTER: 'E', "earth elemental", random ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random OBJECT: random, random, random TRAP: random, random MONSTER: 'X', random, random, hostile ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random TRAP: random, random MONSTER: 'E', "earth elemental", random RANDOM_CORRIDORS LEVEL: "Mon-filb" # Random Monsters RANDOM_MONSTERS: 'E', 'X' # ROOM: "ordinary" , random, random, random, random STAIR: random, up OBJECT: random,random,random MONSTER: 'X', random, random, hostile ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random OBJECT: random,random,random MONSTER: 'X', random, random, hostile ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random TRAP: random, random OBJECT: random,random,random MONSTER: 'E', random, random, hostile ROOM: "ordinary" , random, random, random, random STAIR: random, down OBJECT: random, random, random TRAP: random, random MONSTER: 'E', random, random, hostile MONSTER: 'E', "earth elemental", random ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random OBJECT: random, random, random TRAP: random, random MONSTER: 'X', random, random, hostile ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random TRAP: random, random MONSTER: 'E', "earth elemental", random RANDOM_CORRIDORS slashem-0.0.7E7F3/dat/stor-3.des0000664000076400007640000000221410545462317014247 0ustar aliali# # Storage level (#1) # LEVEL: "stor-3" ROOM: "ordinary", unlit, random, random, (4,4) NAME: "central" OBJECT:'(',"chest",(2,2) OBJECT:'/',random,(2,2) OBJECT:'/',random,(2,2) OBJECT:'(',random,(2,2) OBJECT:'(',random,(2,2) OBJECT:'(',random,(2,2) OBJECT:'=',random,(2,2) ENGRAVING:(2,2),burn,"Property of the Wizard! Do Not Touch!" TRAP: random, random TRAP: random, random TRAP: random, random ROOM: "ordinary" , random, random, random, random STAIR: random, up OBJECT: random,random,random MONSTER: random, random, random, hostile ROOM: "ordinary" , random, random, random, random STAIR: random, down OBJECT: random, random, random TRAP: random, random MONSTER: random, random, random, hostile ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random OBJECT: random, random, random MONSTER: random, random, random, hostile ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random TRAP: random, random MONSTER: random, random, random, hostile ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random TRAP: random, random MONSTER: random, random, random, hostile RANDOM_CORRIDORS slashem-0.0.7E7F3/dat/Ranger.des0000664000076400007640000002766610545462317014360 0ustar aliali# 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. # # The "start" level for the quest. # # Here you meet your (besieged) class leader, Orion, # and receive your quest assignment. # MAZE: "Ran-strt",'.' FLAGS: noteleport,hardfloor,arboreal INIT_MAP:'.','.',true,true,lit,false 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 OBJECT:'(',"chest",(20,10) # Guards for the audience chamber MONSTER:'@',"hunter",(19,09) MONSTER:'@',"hunter",(20,09) MONSTER:'@',"hunter",(21,09) MONSTER:'@',"hunter",(19,10) MONSTER:'@',"hunter",(21,10) MONSTER:'@',"hunter",(19,11) MONSTER:'@',"hunter",(20,11) MONSTER:'@',"hunter",(21,11) # Non diggable walls NON_DIGGABLE:(00,00,40,20) # Traps TRAP:"arrow",(30,09) TRAP:"arrow",(30,10) TRAP:"pit",(40,09) TRAP:"spiked pit",random TRAP:"bear",random TRAP:"bear",random # Monsters on siege duty. MONSTER: 'H',"minotaur",(33,09),hostile,asleep MONSTER: 'C',"forest centaur",(19,03),hostile MONSTER: 'C',"forest centaur",(19,04),hostile MONSTER: 'C',"forest centaur",(19,05),hostile MONSTER: 'C',"forest centaur",(21,03),hostile MONSTER: 'C',"forest centaur",(21,04),hostile MONSTER: 'C',"forest centaur",(21,05),hostile MONSTER: 'C',"forest centaur",(01,09),hostile MONSTER: 'C',"forest centaur",(02,09),hostile MONSTER: 'C',"forest centaur",(03,09),hostile MONSTER: 'C',"forest centaur",(01,11),hostile MONSTER: 'C',"forest centaur",(02,11),hostile MONSTER: 'C',"forest centaur",(03,11),hostile MONSTER: 'C',"forest centaur",(19,15),hostile MONSTER: 'C',"forest centaur",(19,16),hostile MONSTER: 'C',"forest centaur",(19,17),hostile MONSTER: 'C',"forest centaur",(21,15),hostile MONSTER: 'C',"forest centaur",(21,16),hostile MONSTER: 'C',"forest centaur",(21,17),hostile MONSTER: 'C',"plains centaur",random,hostile MONSTER: 'C',"plains centaur",random,hostile MONSTER: 'C',"plains centaur",random,hostile MONSTER: 'C',"plains centaur",random,hostile MONSTER: 'C',"plains centaur",random,hostile MONSTER: 'C',"plains centaur",random,hostile MONSTER: 's',"scorpion",random,hostile MONSTER: 's',"scorpion",random,hostile # # The "locate" level for the quest. # # Here you have to infiltrate the Cave of the Wumpus to go # further towards your assigned quest. # MAZE: "Ran-loca",' ' FLAGS: hardfloor GEOMETRY:center,center #1234567890123456789012345678901234567890123456789012345678901234567890 MAP ....... ......... ....... ................... ................... .... ....... ....... .... ... ..... . ..... . ..... ... . .......... ..... ........... ..... .......... . . .. ..... .......... ..... .......... ..... .. . . . . ..... . ..... . . . . . ..... ............. ..... . . . . ................ ....... ................ . . . . ..... ....... ..... . . . . . ...... ...... . . . . . ........... ......... ........... . . . . .......... .......... . . . .. ..... . ..... . ..... .. . . .......... ..... ........... ..... .......... . . ..... .......... ..... .......... ..... . . . ..... . ..... . . ... ....... ....... ....... ... .............. ............. .............. ....... ....... ....... ....... ....... ENDMAP # Dungeon Description REGION:(00,00,54,19),lit,"ordinary" # Stairs STAIR:(25,05),up STAIR:(27,18),down # Non diggable walls NON_DIGGABLE:(00,00,54,19) # Objects OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random # Random traps TRAP:"spiked pit",random TRAP:"spiked pit",random TRAP:"teleport",random TRAP:"teleport",random TRAP:"arrow",random TRAP:"arrow",random # Random monsters. MONSTER:'q',"wumpus",(27,18),hostile,asleep MONSTER:'B',"giant bat",random,hostile MONSTER:'B',"giant bat",random,hostile MONSTER:'B',"giant bat",random,hostile MONSTER:'B',"giant bat",random,hostile MONSTER:'C',"forest centaur",random,hostile MONSTER:'C',"forest centaur",random,hostile MONSTER:'C',"forest centaur",random,hostile MONSTER:'C',"forest centaur",random,hostile MONSTER:'C',"mountain centaur",random,hostile MONSTER:'C',"mountain centaur",random,hostile MONSTER:'C',"mountain centaur",random,hostile MONSTER:'C',"mountain centaur",random,hostile MONSTER:'C',"mountain centaur",random,hostile MONSTER:'C',"mountain centaur",random,hostile MONSTER:'C',"mountain centaur",random,hostile MONSTER:'C',"mountain centaur",random,hostile MONSTER:'s',"scorpion",random,hostile MONSTER:'s',"scorpion",random,hostile MONSTER:'s',"scorpion",random,hostile MONSTER:'s',"scorpion",random,hostile MONSTER:'s',random,random,hostile MONSTER:'s',random,random,hostile # # The "goal" level for the quest. # # Here you meet Scorpius, your nemesis monster. You have to # defeat Scorpius in combat to gain the artifact you have # been assigned to retrieve. # MAZE: "Ran-goal", ' ' GEOMETRY:center,center MAP ... ... .......................................................................... ... + ... . ............ ....... . ....... . . ............................. . ........ .........S.. . . ............ . ...... . . . ....... .. . . ......... . .... + . ... . .. . . S . ......... .S. .S............... . . ... . ... . ......... . . . ........ .....S.+.......+....\....+........+. . . ... ... S ......... .. ..... . . .. ......... .. ...... . . ....... ... + .... .... .......... . . .............. .. . ...... .. ............. . . ............. . .......... ...... . ... + ... .......................................................................... ... ... ENDMAP # Dungeon Description REGION:(00,00,75,19),lit,"ordinary" # Stairs STAIR:(19,10),up # Non diggable walls NON_DIGGABLE:(00,00,75,19) # Objects OBJECT:')',"bow",(37,10),blessed,0,"The Longbow of Diana" OBJECT:'(',"chest",(37,10) OBJECT:random,random,(36,09) OBJECT:random,random,(36,10) OBJECT:random,random,(36,11) OBJECT:random,random,(37,09) OBJECT:random,random,(37,11) OBJECT:random,random,(38,09) OBJECT:random,random,(38,10) OBJECT:random,random,(38,11) OBJECT:random,random,random OBJECT:random,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 # doors DOOR:locked,(12,08) DOOR:closed,(22,10) DOOR:locked,(24,10) DOOR:closed,(25,11) DOOR:closed,(32,10) DOOR:closed,(37,03) DOOR:closed,(37,07) DOOR:closed,(37,13) DOOR:closed,(37,16) DOOR:closed,(42,10) DOOR:locked,(46,08) DOOR:closed,(51,10) DOOR:locked,(53,08) DOOR:closed,(65,05) # Random monsters. MONSTER:'s',"Scorpius",(37,10),hostile MONSTER:'C',"forest centaur",(36,09),hostile MONSTER:'C',"forest centaur",(36,10),hostile MONSTER:'C',"forest centaur",(36,11),hostile MONSTER:'C',"forest centaur",(37,09),hostile MONSTER:'C',"forest centaur",(37,11),hostile MONSTER:'C',"forest centaur",(38,09),hostile MONSTER:'C',"mountain centaur",(38,10),hostile MONSTER:'C',"mountain centaur",(38,11),hostile MONSTER:'C',"mountain centaur",(02,02),hostile MONSTER:'C',"mountain centaur",(71,02),hostile MONSTER:'C',"mountain centaur",(02,16),hostile MONSTER:'C',"mountain centaur",(71,16),hostile MONSTER:'C',"forest centaur",random,hostile MONSTER:'C',"forest centaur",random,hostile MONSTER:'C',"mountain centaur",random,hostile MONSTER:'C',"mountain centaur",random,hostile MONSTER:'C',random,random,hostile MONSTER:'C',random,random,hostile MONSTER:'s',"scorpion",(03,02),hostile MONSTER:'s',"scorpion",(72,02),hostile MONSTER:'s',"scorpion",(03,17),hostile MONSTER:'s',"scorpion",(72,17),hostile MONSTER:'s',"scorpion",(41,10),hostile MONSTER:'s',"scorpion",(33,09),hostile MONSTER:'s',"scorpion",random,hostile MONSTER:'s',"scorpion",random,hostile MONSTER:'s',random,random,hostile WALLIFY # # The "fill" levels for the quest. # # These levels are used to fill out any levels not occupied by specific # levels as defined above. "fila" is the upper filler, between the # start and locate levels, and "filb" the lower between the locate # and goal levels. # MAZE: "Ran-fila" , ' ' INIT_MAP: '.' , 'T', true, true, random, true NOMAP # STAIR: random, up STAIR: random, down # OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, 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 # MONSTER: 'C', "mountain centaur", random, hostile MONSTER: 'C', "mountain centaur", random, hostile MONSTER: 'C', "forest centaur", random, hostile MONSTER: 'C', "forest centaur", random, hostile MONSTER: 'C', "forest centaur", random, hostile MONSTER: 'C', random, random, hostile MONSTER: 's', "scorpion", random, hostile MAZE: "Ran-filb" , ' ' INIT_MAP: '.' , ' ', true, true, random, true NOMAP # STAIR: random, up STAIR: random, down # OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, 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 # MONSTER: 'C', "mountain centaur", random, hostile MONSTER: 'C', "mountain centaur", random, hostile MONSTER: 'C', "mountain centaur", random, hostile MONSTER: 'C', "mountain centaur", random, hostile MONSTER: 'C', random, random, hostile MONSTER: 's', "scorpion", random, hostile MONSTER: 's', "scorpion", random, hostile slashem-0.0.7E7F3/dat/tomb.des0000664000076400007640000001001110545462317014053 0ustar aliali# SCCS Id: @(#)tomb.des 3.4 1993/02/23 # Copyright (c) 1989 by Jean-Christophe Collet # Copyright (c) 1991 by M. Stephenson # NetHack may be freely redistributed. See license for details. # # # MAZE: "tomb",' ' GEOMETRY: center,center #0 1 2 3 4 5 6 #1234567890123456789012345678901234567890123456789012345678901234567890 MAP -------- |......| |......| |---.--| # # |----S---| --------| |------| |........| |.......| |......------........|------------.......| |......+.............+...........+.......| |......+.............+...........+.......| |......------........|------------.......| |------| |........| |.......| |---S----| --------| # # |--.---| |......| |......| -------- ENDMAP RANDOM_MONSTERS: 'Z','M' STAIR:(08,09),up BRANCH:(08,09,08,09),(0,0,0,0) DOOR: locked,(14,09) DOOR: locked,(14,10) DOOR: locked,(28,09) DOOR: locked,(28,10) DOOR: locked,(40,09) DOOR: locked,(40,10) TRAP: "spiked pit",random TRAP: "spiked pit",random TRAP: "spiked pit",random TRAP: "spiked pit",random TRAP: "spiked pit",random OBJECT:'(',"chest",(47,9) GOLD: random,(47,9) GOLD: random,(47,9) GOLD: random,(47,9) GOLD: random,(47,9) GOLD: random,(47,9) GOLD: random,(47,9) GOLD: random,(47,9) GOLD: random,(47,9) GOLD: random,(47,9) GOLD: random,(47,9) OBJECT: '?', random, (47,9) OBJECT: '?', random, (47,9) OBJECT: '?', random, (47,9) OBJECT: '?', random, (47,9) OBJECT: '!', random, (47,9) OBJECT: '!', random, (47,9) OBJECT: '!', random, (47,9) OBJECT: random, random, (47,9) OBJECT: random, random, (47,9) OBJECT: random, random, random OBJECT:'(',"chest",(23,1) OBJECT: random, random, (23,1) OBJECT: random, random, (23,1) OBJECT: random, random, (23,1) OBJECT:'(',"chest",(24,18) OBJECT: random, random, (24,18) OBJECT: random, random, (24,18) OBJECT: random, random, (24,18) OBJECT:'(',"chest",(47,10) GOLD: random,(47,10) GOLD: random,(47,10) GOLD: random,(47,10) GOLD: random,(47,10) GOLD: random,(47,10) GOLD: random,(47,10) GOLD: random,(47,10) GOLD: random,(47,10) GOLD: random,(47,10) GOLD: random,(47,10) OBJECT: '?', random, (47,10) OBJECT: '?', random, (47,10) OBJECT: '?', random, (47,10) OBJECT: '?', random, (47,10) OBJECT: '+', random, (47,10) OBJECT: '+', random, (47,10) OBJECT: '+', random, (47,10) OBJECT: '+', random, (47,10) OBJECT: random, random, (47,10) OBJECT: random, random, (47,10) OBJECT: random, random, (47,10) OBJECT: random, random, (47,10) OBJECT: random, random, (47,10) MONSTER: 'L', "lich", (47,9) MONSTER: ' ',"shadow",random MONSTER: ' ',"shadow",random MONSTER: ' ',"shadow",random MONSTER: ' ',"shadow",random MONSTER: ' ',"shadow",random MONSTER: ' ',"shadow",random MONSTER: ' ',"shadow",random MONSTER: ' ',"shadow",random MONSTER: ' ',"shadow",random MONSTER: ' ',"shadow",random MONSTER: ' ',"shadow",random MONSTER: ' ',"shadow",random MONSTER: ' ',"shadow",random MONSTER: ' ',"shadow",random MONSTER: 'Z',random,random MONSTER: 'Z',random,random MONSTER: 'Z',random,random MONSTER: 'Z',random,random MONSTER: 'Z',random,random MONSTER: 'Z',random,random MONSTER: 'Z',random,random MONSTER: 'Z',random,random MONSTER: 'Z',random,random MONSTER: 'Z',random,random MONSTER: 'Z',random,random MONSTER: 'Z',random,random MONSTER: 'Z',random,random MONSTER: 'Z',random,random MONSTER: 'Z',random,random MONSTER: 'Z',random,random MONSTER: 'Z',random,random MONSTER: 'Z',random,random MONSTER: 'Z',random,random MONSTER: 'M',random,random MONSTER: 'M',random,random MONSTER: 'M',random,random MONSTER: 'M',random,random MONSTER: 'M',random,random MONSTER: 'M',random,random MONSTER: 'M',random,random MONSTER: 'M',random,random MONSTER: 'M',random,random MONSTER: 'M',random,random MONSTER: 'M',random,random slashem-0.0.7E7F3/dat/dragons.des0000664000076400007640000000630010545462317014555 0ustar aliali# SCCS Id: @(#)caves.des 3.4 1993/02/23 # Copyright (c) 1989 by Jean-Christophe Collet # Copyright (c) 1991 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 above. # MAZE: "dragons" , ' ' INIT_MAP: '.' , ' ' , true , true , random , true NOMAP RANDOM_MONSTERS: 'D','w' # STAIR: random, up STAIR: random, down # 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 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 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 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 OBJECT: '?', random, random OBJECT: '?', random, random OBJECT: '?', random, random OBJECT: '?', random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random # MONSTER: 'D', random, random, hostile MONSTER: 'D', random, random, hostile MONSTER: 'D', random, random, hostile MONSTER: 'D', random, random, hostile MONSTER: 'D', random, random, hostile MONSTER: 'D', random, random, hostile MONSTER: 'D', random, random, hostile MONSTER: 'D', random, random, hostile MONSTER: 'D', random, random, hostile MONSTER: 'D', random, random, hostile MONSTER: 'D', random, random, hostile MONSTER: 'D', random, random, hostile MONSTER: 'D', random, random, hostile MONSTER: 'D', random, random, hostile MONSTER: 'D', random, random, hostile MONSTER: 'D', random, random, hostile MONSTER: 'D', random, random, hostile MONSTER: 'D', random, random, hostile MONSTER: 'D', random, random, hostile MONSTER: 'D', random, random, hostile MONSTER: 'D', random, random, hostile MONSTER: 'D', random, random, hostile MONSTER: 'D', random, random, hostile MONSTER: 'D', random, random, hostile MONSTER: 'w', random, random, hostile MONSTER: 'w', random, random, hostile MONSTER: 'w', random, random, hostile MONSTER: 'w', random, random, hostile MONSTER: 'w', "rot worm", random, hostile MONSTER: 'w', "rot worm", random, hostile MONSTER: 'w', "rot worm", random, hostile MONSTER: 'w', "rot worm", random, hostile MONSTER: 'w', "rot worm", random, hostile # TRAP: random, random TRAP: random, random TRAP: random, random TRAP: random, random slashem-0.0.7E7F3/dat/rats.des0000664000076400007640000000554710545462317014105 0ustar aliali# # Rat level # LEVEL: "rats" RANDOM_MONSTERS: 'r' ROOM: "ordinary" , unlit, random, random, (16,8) NAME: "central" OBJECT: random,random,random OBJECT: random,random,random OBJECT: random,random,random OBJECT: '!',"invulnerability",random OBJECT: ')',"long sword",(8,4) OBJECT: '[',"elven boots",(8,4) OBJECT: '%',"cheese",(8,4) OBJECT: '%',"cheese",(8,4) OBJECT: '/',random,(8,4) OBJECT: '!',random,(8,4) MONSTER: 'r', random, random, hostile MONSTER: 'r', random, random, hostile MONSTER: 'r', random, random, hostile MONSTER: 'r', random, random, hostile MONSTER: 'r', random, random, hostile MONSTER: 'r', "pack rat", random, hostile MONSTER: 'r', "pack rat", random, hostile MONSTER: 'r', "pack rat", random, hostile MONSTER: 'r', "pack rat", random, hostile MONSTER: 'r', "black rat", random, hostile MONSTER: 'r', "black rat", random, hostile MONSTER: 'r', "black rat", random, hostile MONSTER: 'r', "black rat", random, hostile MONSTER: 'r', "black rat", random, hostile MONSTER: 'r', "black rat", random, hostile MONSTER: 'r', "black rat", random, hostile MONSTER: 'r', "black rat", random, hostile MONSTER: 'r', "giant rat", random, hostile MONSTER: 'r', "giant rat", random, hostile MONSTER: 'r', "giant rat", random, hostile MONSTER: 'r', "giant rat", random, hostile MONSTER: 'r', "giant rat", random, hostile MONSTER: 'r', "sewer rat", random, hostile MONSTER: 'r', "sewer rat", random, hostile MONSTER: 'r', "sewer rat", random, hostile MONSTER: 'r', "sewer rat", random, hostile MONSTER: 'r', "sewer rat", random, hostile MONSTER: 'r', "sewer rat", random, hostile MONSTER: 'r', "sewer rat", random, hostile MONSTER: 'r', "sewer rat", random, hostile MONSTER: 'r', "rabid rat", random, hostile MONSTER: 'r', "the Rat King", (8,8), hostile ROOM: "ordinary" , random, random, random, random STAIR: random, up OBJECT: random,random,random MONSTER: 'r', "giant rat", random, hostile MONSTER: 'r', "giant rat", random, hostile MONSTER: 'r', "giant rat", random, hostile ROOM: "ordinary" , random, random, random, random STAIR: random, down OBJECT: random, random, random TRAP: random, random MONSTER: 'r', "rabid rat", random, hostile MONSTER: 'r', "rabid rat", random, hostile ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random OBJECT: random, random, random MONSTER: 'r', "giant rat", random, hostile MONSTER: 'r', "giant rat", random, hostile MONSTER: 'r', "giant rat", random, hostile ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random TRAP: random, random MONSTER: 'r', "giant rat", random, hostile MONSTER: 'r', "giant rat", random, hostile MONSTER: 'r', "giant rat", random, hostile ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random TRAP: random, random MONSTER: 'r', "giant rat", random, hostile MONSTER: 'r', "giant rat", random, hostile MONSTER: 'r', "giant rat", random, hostile RANDOM_CORRIDORS slashem-0.0.7E7F3/dat/grund.des0000664000076400007640000012613410545462317014247 0ustar aliali# $Id: grund.des,v 1.1 2003/04/25 18:27:34 j_ali Exp $ # Copyright (c) Tina Hall, 2002 # Modifications copyright (c) Slash'EM Development Team, 2003 # NetHack may be freely redistributed. See license for details. # # Grund's Stronghold # # The names for the soldiers are what the orcs understood, # 'mercenary', 'trouble shooter' and 'deserter' are simply # too much for them to comprehend. # MAZE:"grund-1",' ' FLAGS:noteleport,hardfloor,nommap,shortsighted INIT_MAP:' ',' ',false,false,lit,false GEOMETRY:right,center #12345678901234567890123456789012 #0 i 1 i 2 i 3 MAP ........ ..... ........ ......... ......... ............. ......... ......-F-...... .......... .....---.---..... .......... ....--- . ---.... ........... ....-----------.... ........... ...--- - - - ---... ...............-------------.... ..............-- - - - - - --... ..............F..---------..F... ..............-- - - -.- - --... ...............-------------.... ........... ...--- - - - ---... ........... ....-----------.... .......... ....--- . ---.... .......... .....---.---..... ......... ......-F-...... ......... ............. ........ ......... ........ ..... ENDMAP RANDOM_PLACES:(21,03),(14,10),(28,10),(21,17) DOOR:locked,place[0] STAIR:(18,07,24,13),(00,00,00,00),up BRANCH:(18,07,24,13),(00,00,00,00) TELEPORT_REGION:(18,07,24,13),(00,00,00,00) MAZEWALK:(22,11),east REGION:(00,00,32,20),lit,"ordinary" REGION:(15,04,27,16),unlit,"ordinary" REGION:(15,04,16,05),lit,"ordinary" REGION:(26,04,27,05),lit,"ordinary" REGION:(15,15,16,16),lit,"ordinary" REGION:(26,15,27,16),lit,"ordinary" NON_DIGGABLE:(00,00,17,20) NON_DIGGABLE:(25,00,32,20) NON_DIGGABLE:(18,00,24,06) NON_DIGGABLE:(18,14,24,20) TRAP:"statue",(11,10) CONTAINER:'`',"statue",(11,10),"winged gargoyle",0 # monsters (Fussvolk) MONSTER:'o',"orc-captain",random,hostile MONSTER:'o',"orc",random,hostile MONSTER:'o',"orc",random,hostile MONSTER:'o',"orc",random,hostile MONSTER:'o',"orc",random,hostile MONSTER:'o',"orc",random,hostile MONSTER:'o',"orc",random,hostile MONSTER:'o',"orc",random,hostile MONSTER:'o',"orc",random,hostile MONSTER[60%]:'o',"orc-captain",random,hostile MONSTER[60%]:'o',"orc",random,hostile MONSTER[60%]:'o',"orc",random,hostile MONSTER[60%]:'o',"orc",random,hostile MONSTER[60%]:'o',"orc",random,hostile MONSTER[60%]:'o',"orc",random,hostile MONSTER[60%]:'o',"orc",random,hostile MONSTER[60%]:'o',"orc",random,hostile MONSTER[60%]:'o',"orc",random,hostile # objects OBJECT[80%]:'/',"create monster",random OBJECT[40%]:'/',"create horde",random OBJECT[80%]:'/',"speed monster",random OBJECT[40%]:'/',"speed monster",random OBJECT[80%]:'/',"make invisible",random OBJECT[40%]:'/',"make invisible",random OBJECT[80%]:'!',"invisibility",random OBJECT[40%]:'!',"invisibility",random OBJECT[80%]:'!',"speed",random OBJECT[40%]:'!',"speed",random OBJECT[40%]:'!',"full healing",random OBJECT[20%]:'!',"full healing",random OBJECT[60%]:'!',"extra healing",random OBJECT[30%]:'!',"extra healing",random OBJECT[80%]:'!',"healing",random OBJECT[40%]:'!',"healing",random OBJECT[40%]:'!',"gain level",random OBJECT[20%]:'!',"gain level",random OBJECT[20%]:'!',"invulnerability",random OBJECT[10%]:'!',"invulnerability",random #traps TRAP[50%]:"rust",(00,01) TRAP[50%]:"rust",(00,03) TRAP[50%]:"rust",(00,05) TRAP[50%]:"rust",(00,07) TRAP[50%]:"rust",(00,09) TRAP[50%]:"rust",(00,11) TRAP[50%]:"rust",(00,13) TRAP[50%]:"rust",(00,15) TRAP[50%]:"rust",(00,17) TRAP[50%]:"rust",(00,19) TRAP[50%]:"arrow",(01,00) TRAP[50%]:"arrow",(02,01) TRAP[50%]:"arrow",(01,02) TRAP[50%]:"arrow",(02,03) TRAP[50%]:"arrow",(01,04) TRAP[50%]:"arrow",(02,05) TRAP[50%]:"arrow",(01,06) TRAP[50%]:"arrow",(02,07) TRAP[50%]:"arrow",(01,08) TRAP[50%]:"arrow",(02,09) TRAP[50%]:"arrow",(01,10) TRAP[50%]:"arrow",(02,11) TRAP[50%]:"arrow",(01,12) TRAP[50%]:"arrow",(02,13) TRAP[50%]:"arrow",(01,14) TRAP[50%]:"arrow",(02,15) TRAP[50%]:"arrow",(01,16) TRAP[50%]:"arrow",(02,17) TRAP[50%]:"arrow",(01,18) TRAP[50%]:"arrow",(02,19) TRAP[50%]:"arrow",(01,20) TRAP[50%]:"spiked pit",(03,00) TRAP[50%]:"spiked pit",(04,01) TRAP[50%]:"spiked pit",(03,02) TRAP[50%]:"spiked pit",(04,03) TRAP[50%]:"spiked pit",(03,04) TRAP[50%]:"spiked pit",(04,05) TRAP[50%]:"spiked pit",(03,06) TRAP[50%]:"spiked pit",(04,07) TRAP[50%]:"spiked pit",(03,08) TRAP[50%]:"spiked pit",(04,09) TRAP[50%]:"spiked pit",(03,10) TRAP[50%]:"spiked pit",(04,11) TRAP[50%]:"spiked pit",(03,12) TRAP[50%]:"spiked pit",(04,13) TRAP[50%]:"spiked pit",(03,14) TRAP[50%]:"spiked pit",(04,15) TRAP[50%]:"spiked pit",(03,16) TRAP[50%]:"spiked pit",(04,17) TRAP[50%]:"spiked pit",(03,18) TRAP[50%]:"spiked pit",(04,19) TRAP[50%]:"spiked pit",(03,20) TRAP:"rust",random TRAP:"rust",random TRAP[50%]:"rust",random TRAP[50%]:"rust",random TRAP:"arrow",random TRAP:"arrow",random TRAP[50%]:"arrow",random TRAP[50%]:"arrow",random TRAP:"spiked pit",random TRAP:"spiked pit",random TRAP[50%]:"spiked pit",random TRAP[50%]:"spiked pit",random TRAP:"land mine",random TRAP:"land mine",random TRAP:"land mine",random TRAP:"land mine",random TRAP:"land mine",random TRAP:"land mine",random TRAP:"land mine",random TRAP:"land mine",random TRAP:"land mine",random TRAP:"land mine",random TRAP:"land mine",random TRAP:"land mine",random TRAP[50%]:"land mine",random TRAP[50%]:"land mine",random TRAP[50%]:"land mine",random TRAP[50%]:"land mine",random TRAP[50%]:"level teleport",random TRAP[50%]:"level teleport",random MONSTER:'o',"hobgoblin",(10,11),hostile OBJECT:'/',"fire",random,cursed,1 ENGRAVING:random,burn,"Us wanna no veeseetohs!" ENGRAVING:random,burn,"boogrr ohf! GRR!" ENGRAVING:random,burn,"keap Us ohr Gohld!!" ENGRAVING:random,burn,"Me Preeeteee!" ENGRAVING:random,burn,"dee no preeeteee" ENGRAVING:random,burn,"veesetoohs gohd eet!" GEOMETRY:left,center #12345678901234567890123456789012345678901 #0 i 1 i 2 i 3 i 4 MAP -----------------------------------------} -...SH.----..-----...---..--------.+.-..-} -...----..F..-..-....-.+..+.--..--.-.-..F} -...--....--+-.---..--.----.-...--.-.-..-} --S--......S#-.---..+..----.+....+.-.-.--} -##-.......---.---F----------....---.-..F} -#--.......-...---.-----..-----.----.-..-} ##-.......--.----...+.-...-------..+.-..F} H--......---.-..-..--.--...---..-.--.-..-} H-......----S-S---..F.+..-.F....+.--.-..F} HS\........S...S.-------+---....----.-..-} H-......----S-S----..---..--+-.-----.-..F} H--......---.-..-....----....----..+.-..-} ##-.......--.----.....+.--F----...--.-..F} -#--.......-...---...--.-..--...----.-..-} -##-.......---.---F----.--..+.---..+.-..F} --S--......S#-.---..---...+--F---+--.-.--} -...--....--+-.--....--------.-...--.-..-} -...----..F..-..-....+..-...+....---.-..F} -...SH.----..------.---...---....---.S..-} -----------------------------------------} ENDMAP RANDOM_PLACES:(16,02),(16,08),(16,12),(16,18),(31,07) REGION:(00,00,39,20),unlit,"ordinary" REGION:(41,00,41,20),lit,"ordinary" NON_DIGGABLE:(00,00,37,20) DRAWBRIDGE:(41,10),west,closed # (whatever it's called) MONSTER:'o',"war orc",(39,02),hostile OBJECT[80%]:'/',"sleep",(39,02) OBJECT:')',"orcish bow",(39,02),uncursed,+1 OBJECT:')',"orcish arrow",(39,02),uncursed,+2 MONSTER:'o',"war orc",(39,05),hostile OBJECT[40%]:'/',"fireball",(39,05) OBJECT:')',"orcish bow",(39,05),uncursed,+2 OBJECT:')',"orcish arrow",(39,05),uncursed,+1 MONSTER:'@',"soldier",(39,07),hostile OBJECT[40%]:'/',"cold",(39,07) OBJECT:')',"orcish bow",(39,07),uncursed,+1 OBJECT:')',"orcish arrow",(39,07),uncursed,+3 OBJECT[40%]:')',"sniper rifle",(39,07),uncursed,+3 OBJECT[40%]:')',"bullet",(39,07),uncursed,+4 OBJECT[40%]:')',"bullet",(39,07),uncursed,+3 MONSTER:'o',"war orc",(39,09),hostile OBJECT[80%]:'/',"magic missile",(39,09) OBJECT:')',"orcish bow",(39,09),uncursed,+2 OBJECT:')',"orcish arrow",(39,09),uncursed,+1 MONSTER:'o',"war orc",(39,11),hostile OBJECT[80%]:'/',"striking",(39,11) OBJECT:')',"orcish bow",(39,11),uncursed,+2 OBJECT:')',"orcish arrow",(39,11),uncursed,+3 MONSTER:'@',"soldier",(39,13),hostile OBJECT[60%]:'/',"fire",(39,13) OBJECT:')',"orcish bow",(39,13),uncursed,+1 OBJECT:')',"orcish arrow",(39,13),uncursed,+2 OBJECT[40%]:')',"grenade launcher",(39,13),uncursed,+1 OBJECT[40%]:')',"frag grenade",(39,13),uncursed,+3 OBJECT[40%]:')',"frag grenade",(39,13),uncursed,+2 MONSTER:'o',"war orc",(39,15),hostile OBJECT[60%]:'/',"lightning",(39,15) OBJECT:')',"orcish bow",(39,15),uncursed,+2 OBJECT:')',"orcish arrow",(39,15),uncursed,+2 MONSTER:'o',"war orc",(39,18),hostile OBJECT[40%]:'/',"draining",(39,18) OBJECT:')',"orcish bow",(39,18),uncursed,+3 OBJECT:')',"orcish arrow",(39,18),uncursed,+3 # MONSTER:'d',"hell hound",(36,01),hostile MONSTER[50%]:'d',"hell hound",(36,07),hostile MONSTER[50%]:'d',"hell hound",(36,12),hostile MONSTER:'d',"hell hound",(36,15),asleep,hostile # caves MONSTER[50%]:'o',"Uruk-hai",(18,02),hostile MONSTER:'o',"Uruk-hai",(19,02),hostile MONSTER:'o',"Uruk-hai",(20,02),hostile MONSTER:'o',"Uruk-hai",(18,03),hostile MONSTER:'o',"Uruk-hai",(19,03),hostile MONSTER:'o',"orc shaman",(24,02),hostile MONSTER[50%]:'o',"orc shaman",(24,02),hostile MONSTER:'H',"stone giant",(30,04),hostile MONSTER[50%]:'H',"stone giant",(31,03),hostile MONSTER:'@',"rogue",(18,07),hostile OBJECT:')',"rapier",(18,07),uncursed,+1 OBJECT[50%]:'!',"sickness",(18,07) OBJECT[50%]:'(',"sack",(18,07) MONSTER:'@',"mugger",(18,08),hostile OBJECT:')',"club",(18,08),uncursed,+2 OBJECT[40%]:')',"crossbow",(18,08),uncursed,+3 OBJECT[40%]:')',"crossbow bolt",(18,08),uncursed,+1 OBJECT[50%]:'!',"paralysis",(18,08) MONSTER:'@',"soldier",(18,09),hostile OBJECT[50%]:'!',"booze",(18,09) MONSTER:'O',"ogre",(24,07),hostile MONSTER:'O',"ogre",(25,07),hostile MONSTER[50%]:'O',"ogre",(24,08),hostile MONSTER:'O',"ogre",(25,08),hostile MONSTER:'o',"hill orc",(29,09),hostile MONSTER:'o',"hill orc",(30,09),hostile MONSTER[50%]:'o',"hill orc",(31,09),hostile MONSTER:'o',"hill orc",(29,10),hostile MONSTER[50%]:'o',"hill orc",(30,10),hostile MONSTER:'o',"hill orc",(31,10),hostile MONSTER:'o',"snow orc",(18,12),hostile MONSTER[50%]:'o',"snow orc",(19,12),hostile MONSTER:'o',"snow orc",(20,12),hostile MONSTER[50%]:'o',"snow orc",(18,13),hostile MONSTER:'o',"snow orc",(19,13),hostile MONSTER:'o',"snow orc",(20,13),hostile MONSTER:'o',"orc shaman",(25,14),hostile MONSTER[50%]:'o',"orc shaman",(27,15),hostile MONSTER[50%]:'o',"great orc",(18,17),hostile MONSTER:'o',"great orc",(19,17),hostile MONSTER:'o',"great orc",(20,17),hostile MONSTER:'o',"great orc",(18,18),hostile MONSTER[50%]:'o',"great orc",(19,18),hostile MONSTER:'o',"great orc",(20,18),hostile MONSTER:'o',"Mordor orc",(18,17),hostile MONSTER[50%]:'o',"Mordor orc",(19,17),hostile MONSTER:'o',"Mordor orc",(18,18),hostile MONSTER:'o',"Mordor orc",(19,18),hostile MONSTER[80%]:'T',"troll",random,hostile MONSTER[60%]:'T',"rock troll",random,hostile MONSTER[40%]:'T',"two-headed troll",random,hostile MONSTER[20%]:'T',"black troll",random,hostile # slaves MONSTER:'o',"goblin",random,random MONSTER:'o',"goblin",random,random MONSTER:'o',"goblin",random,random MONSTER:'o',"goblin",random,random MONSTER[50%]:'o',"goblin",random,random MONSTER[50%]:'o',"goblin",random,random # TRAP:"statue",(16,10) CONTAINER:'`',"statue",(16,10),"harpy",0 # throneroom MONSTER:'o',"Grund the Orc King",(02,10),hostile OBJECT:'/',random,(02,10) OBJECT:'"',random,(02,10) OBJECT:'[',random,(02,10) MONSTER:'o',"demon orc",(03,09),hostile MONSTER:'o',"demon orc",(03,11),hostile MONSTER[60%]:'o',"demon orc",(07,09),hostile MONSTER[60%]:'o',"demon orc",(07,11),hostile MONSTER:'o',"orc shaman",(04,08),hostile MONSTER:'o',"orc shaman",(04,12),hostile MONSTER:'O',"ogre mage",(04,10),hostile MONSTER[50%]:'O',"ogre mage",(06,10),hostile MONSTER[50%]:'O',"shadow ogre",(06,07),hostile MONSTER[50%]:'O',"ogre lord",(06,13),hostile MONSTER:'Z',"orc zombie",(07,04),asleep,hostile MONSTER:'Z',"orc zombie",(09,06),asleep,hostile MONSTER:'M',"orc mummy",(08,05),asleep,hostile MONSTER:'Z',"orc zombie",(07,16),asleep,hostile MONSTER:'Z',"orc zombie",(09,14),asleep,hostile MONSTER:'M',"orc mummy",(08,15),asleep,hostile # prisons MONSTER:'Z',"skeleton",(11,01),random MONSTER[40%]:'@',"nurse",(12,02),peaceful MONSTER[10%]:'@',"gypsy",(12,18),peaceful MONSTER:' ',"ghost",(11,19),peaceful OBJECT:'%',"corpse",(11,19),"human",0 # treasury OBJECT:'(',"chest",(02,02) MONSTER:'s',"giant spider",(02,03),asleep,hostile MONSTER:'s',"giant spider",(03,01),asleep,hostile GOLD:1200,(02,02) GOLD:random,(02,02) CONTAINER:'(',"chest",(06,01) OBJECT:'"',"amulet of magical breathing",contained OBJECT:'+',"haste self",contained,blessed,+4 OBJECT[20%]:'(',"magic marker",contained,cursed,34 OBJECT:'!',"enlightenment",contained,blessed,0 OBJECT:'!',"enlightenment",contained,blessed,0 OBJECT[50%]:'!',"enlightenment",contained,blessed,0 OBJECT[50%]:'!',"enlightenment",contained,blessed,0 GOLD:8700,(06,01) GOLD:random,(06,01) # arms storage OBJECT:'(',"chest",(02,18) MONSTER:'o',"orc",(03,19),asleep,hostile OBJECT[40%]:'!',"booze",(02,19) CONTAINER:'(',"chest",(06,19) OBJECT:'[',"gauntlets of power",contained,cursed,+1 OBJECT:'%',"tin",contained,"spinach",0 OBJECT:'%',"tin",contained,"spinach",0 OBJECT[50%]:'%',"tin",contained,"spinach",0 OBJECT[50%]:'%',"tin",contained,"spinach",0 #traps TRAP[90%]:"land mine",(08,10) TRAP[90%]:"board",(09,10) TRAP[90%]:"anti magic",(10,10) TRAP:"falling rock",random TRAP[50%]:"falling rock",random TRAP:"web",random TRAP[50%]:"web",random TRAP:"dart",random TRAP:"dart",random TRAP[50%]:"dart",random TRAP[50%]:"dart",random # goodies for the monsters: OBJECT:'!',"speed",random OBJECT:'!',"speed",random OBJECT[50%]:'!',"speed",random OBJECT[50%]:'!',"speed",random OBJECT:'!',"invisibility",random OBJECT:'!',"invisibility",random OBJECT[50%]:'!',"invisibility",random OBJECT[50%]:'!',"invisibility",random OBJECT:'/',"healing",random OBJECT[50%]:'/',"healing",random OBJECT:'/',"create monster",random OBJECT[20%]:'/',"create horde",random OBJECT[20%]:'/',"polymorph",random OBJECT:'?',"create monster",random OBJECT[40%]:'?',"create monster",random,cursed,0 # doors DOOR:locked,place[0] DOOR:locked,place[1] DOOR:random,(35,01) DOOR:random,(23,02) DOOR:random,(26,02) DOOR:random,(20,04) DOOR:random,(28,04) DOOR:random,(33,04) DOOR:random,(20,07) DOOR:random,(35,07) DOOR:random,(22,09) DOOR:random,(32,09) DOOR:random,(24,10) DOOR:random,(28,11) DOOR:random,(35,12) DOOR:random,(22,13) DOOR:random,(28,15) DOOR:random,(35,15) DOOR:random,(26,16) DOOR:random,(33,16) DOOR:random,(21,18) DOOR:random,(28,18) DOOR:locked,(02,04) DOOR:locked,(02,16) DOOR:locked,(12,03) DOOR:locked,(12,17) DOOR:locked,(11,04) DOOR:locked,(11,16) DOOR:locked,(01,10) DOOR:locked,(04,01) DOOR:locked,(04,19) DOOR:locked,(11,10) DOOR:locked,(12,09) DOOR:locked,(12,11) DOOR:locked,(14,09) DOOR:locked,(14,11) DOOR:locked,(15,10) # MAZE:"grund-2",' ' FLAGS:noteleport,hardfloor,nommap,shortsighted INIT_MAP:' ',' ',false,false,lit,false GEOMETRY:right,center #12345678901234567890123456789012 #0 i 1 i 2 i 3 MAP ........ ..... ........ ......... ......... ............. ......... ......-F-...... .......... .....---.---..... .......... ....--- . ---.... ........... ....-----------.... ........... ...--- - - - ---... ...............-------------.... ..............-- - - - - - --... ..............F..---------..F... ..............-- - - -.- - --... ...............-------------.... ........... ...--- - - - ---... ........... ....-----------.... .......... ....--- . ---.... .......... .....---.---..... ......... ......-F-...... ......... ............. ........ ......... ........ ..... ENDMAP RANDOM_PLACES:(21,03),(14,10),(28,10),(21,17) DOOR:locked,place[0] STAIR:(18,07,24,13),(00,00,00,00),up BRANCH:(18,07,24,13),(00,00,00,00) TELEPORT_REGION:(18,07,24,13),(00,00,00,00) MAZEWALK:(22,11),east REGION:(00,00,32,20),lit,"ordinary" REGION:(15,04,27,16),unlit,"ordinary" REGION:(15,04,16,05),lit,"ordinary" REGION:(26,04,27,05),lit,"ordinary" REGION:(15,15,16,16),lit,"ordinary" REGION:(26,15,27,16),lit,"ordinary" NON_DIGGABLE:(00,00,17,20) NON_DIGGABLE:(25,00,32,20) NON_DIGGABLE:(18,00,24,06) NON_DIGGABLE:(18,14,24,20) TRAP:"statue",(11,10) CONTAINER:'`',"statue",(11,10),"winged gargoyle",0 # monsters (Fussvolk) MONSTER:'o',"orc-captain",random,hostile MONSTER:'o',"orc",random,hostile MONSTER:'o',"orc",random,hostile MONSTER:'o',"orc",random,hostile MONSTER:'o',"orc",random,hostile MONSTER:'o',"orc",random,hostile MONSTER:'o',"orc",random,hostile MONSTER:'o',"orc",random,hostile MONSTER:'o',"orc",random,hostile MONSTER[60%]:'o',"orc-captain",random,hostile MONSTER[60%]:'o',"orc",random,hostile MONSTER[60%]:'o',"orc",random,hostile MONSTER[60%]:'o',"orc",random,hostile MONSTER[60%]:'o',"orc",random,hostile MONSTER[60%]:'o',"orc",random,hostile MONSTER[60%]:'o',"orc",random,hostile MONSTER[60%]:'o',"orc",random,hostile MONSTER[60%]:'o',"orc",random,hostile # objects OBJECT[80%]:'/',"create monster",random OBJECT[40%]:'/',"create horde",random OBJECT[80%]:'/',"speed monster",random OBJECT[40%]:'/',"speed monster",random OBJECT[80%]:'/',"make invisible",random OBJECT[40%]:'/',"make invisible",random OBJECT[80%]:'!',"invisibility",random OBJECT[40%]:'!',"invisibility",random OBJECT[80%]:'!',"speed",random OBJECT[40%]:'!',"speed",random OBJECT[40%]:'!',"full healing",random OBJECT[20%]:'!',"full healing",random OBJECT[60%]:'!',"extra healing",random OBJECT[30%]:'!',"extra healing",random OBJECT[80%]:'!',"healing",random OBJECT[40%]:'!',"healing",random OBJECT[40%]:'!',"gain level",random OBJECT[20%]:'!',"gain level",random OBJECT[20%]:'!',"invulnerability",random OBJECT[10%]:'!',"invulnerability",random #traps TRAP[50%]:"rust",(00,01) TRAP[50%]:"rust",(00,03) TRAP[50%]:"rust",(00,05) TRAP[50%]:"rust",(00,07) TRAP[50%]:"rust",(00,09) TRAP[50%]:"rust",(00,11) TRAP[50%]:"rust",(00,13) TRAP[50%]:"rust",(00,15) TRAP[50%]:"rust",(00,17) TRAP[50%]:"rust",(00,19) TRAP[50%]:"arrow",(01,00) TRAP[50%]:"arrow",(02,01) TRAP[50%]:"arrow",(01,02) TRAP[50%]:"arrow",(02,03) TRAP[50%]:"arrow",(01,04) TRAP[50%]:"arrow",(02,05) TRAP[50%]:"arrow",(01,06) TRAP[50%]:"arrow",(02,07) TRAP[50%]:"arrow",(01,08) TRAP[50%]:"arrow",(02,09) TRAP[50%]:"arrow",(01,10) TRAP[50%]:"arrow",(02,11) TRAP[50%]:"arrow",(01,12) TRAP[50%]:"arrow",(02,13) TRAP[50%]:"arrow",(01,14) TRAP[50%]:"arrow",(02,15) TRAP[50%]:"arrow",(01,16) TRAP[50%]:"arrow",(02,17) TRAP[50%]:"arrow",(01,18) TRAP[50%]:"arrow",(02,19) TRAP[50%]:"arrow",(01,20) TRAP[50%]:"spiked pit",(03,00) TRAP[50%]:"spiked pit",(04,01) TRAP[50%]:"spiked pit",(03,02) TRAP[50%]:"spiked pit",(04,03) TRAP[50%]:"spiked pit",(03,04) TRAP[50%]:"spiked pit",(04,05) TRAP[50%]:"spiked pit",(03,06) TRAP[50%]:"spiked pit",(04,07) TRAP[50%]:"spiked pit",(03,08) TRAP[50%]:"spiked pit",(04,09) TRAP[50%]:"spiked pit",(03,10) TRAP[50%]:"spiked pit",(04,11) TRAP[50%]:"spiked pit",(03,12) TRAP[50%]:"spiked pit",(04,13) TRAP[50%]:"spiked pit",(03,14) TRAP[50%]:"spiked pit",(04,15) TRAP[50%]:"spiked pit",(03,16) TRAP[50%]:"spiked pit",(04,17) TRAP[50%]:"spiked pit",(03,18) TRAP[50%]:"spiked pit",(04,19) TRAP[50%]:"spiked pit",(03,20) TRAP:"rust",random TRAP:"rust",random TRAP[50%]:"rust",random TRAP[50%]:"rust",random TRAP:"arrow",random TRAP:"arrow",random TRAP[50%]:"arrow",random TRAP[50%]:"arrow",random TRAP:"spiked pit",random TRAP:"spiked pit",random TRAP[50%]:"spiked pit",random TRAP[50%]:"spiked pit",random TRAP:"land mine",random TRAP:"land mine",random TRAP:"land mine",random TRAP:"land mine",random TRAP:"land mine",random TRAP:"land mine",random TRAP:"land mine",random TRAP:"land mine",random TRAP:"land mine",random TRAP:"land mine",random TRAP:"land mine",random TRAP:"land mine",random TRAP[50%]:"land mine",random TRAP[50%]:"land mine",random TRAP[50%]:"land mine",random TRAP[50%]:"land mine",random TRAP[50%]:"level teleport",random TRAP[50%]:"level teleport",random MONSTER:'o',"hobgoblin",(10,11),hostile OBJECT:'/',"fire",random,cursed,1 ENGRAVING:random,burn,"Us wanna no veeseetohs!" ENGRAVING:random,burn,"boogrr ohf! GRR!" ENGRAVING:random,burn,"keap Us ohr Gohld!!" ENGRAVING:random,burn,"Me Preeeteee!" ENGRAVING:random,burn,"dee no preeeteee" ENGRAVING:random,burn,"veesetoohs gohd eet!" GEOMETRY:left,center #12345678901234567890123456789012345678901 #0 i 1 i 2 i 3 i 4 MAP -----------------------------------------} -...SH.----..-----...---..--------.+.-..-} -...----..F..-..-....-.+..+.--..--.-.-..F} -...--....--+-.---..--.----.-...--.-.-..-} --S--......S#-.---..+..----.+....+.-.-.--} -##-.......---.---F----------....---.-..F} -#--.......-...---.-----..-----.----.-..-} ##-.......--.----...+.-...-------..+.-..F} H--......---.-..-..--.--...---..-.--.-..-} H-......----S-S---..F.+..-.F....+.--.-..F} HS\........S...S.-------+---....----.-..-} H-......----S-S----..---..--+-.-----.-..F} H--......---.-..-....----....----..+.-..-} ##-.......--.----.....+.--F----...--.-..F} -#--.......-...---...--.-..--...----.-..-} -##-.......---.---F----.--..+.---..+.-..F} --S--......S#-.---..---...+--F---+--.-.--} -...--....--+-.--....--------.-...--.-..-} -...----..F..-..-....+..-...+....---.-..F} -...SH.----..------.---...---....---.S..-} -----------------------------------------} ENDMAP RANDOM_PLACES:(16,02),(16,08),(16,12),(16,18),(31,07) REGION:(00,00,39,20),unlit,"ordinary" REGION:(41,00,41,20),lit,"ordinary" NON_DIGGABLE:(00,00,37,20) DRAWBRIDGE:(41,10),west,closed # (whatever it's called) MONSTER:'o',"war orc",(39,02),hostile OBJECT[80%]:'/',"sleep",(39,02) OBJECT:')',"orcish bow",(39,02),uncursed,+1 OBJECT:')',"orcish arrow",(39,02),uncursed,+2 MONSTER:'o',"war orc",(39,05),hostile OBJECT[40%]:'/',"fireball",(39,05) OBJECT:')',"orcish bow",(39,05),uncursed,+2 OBJECT:')',"orcish arrow",(39,05),uncursed,+1 MONSTER:'@',"soldier",(39,07),hostile OBJECT[40%]:'/',"cold",(39,07) OBJECT:')',"orcish bow",(39,07),uncursed,+1 OBJECT:')',"orcish arrow",(39,07),uncursed,+3 OBJECT[40%]:')',"sniper rifle",(39,07),uncursed,+3 OBJECT[40%]:')',"bullet",(39,07),uncursed,+4 OBJECT[40%]:')',"bullet",(39,07),uncursed,+3 MONSTER:'o',"war orc",(39,09),hostile OBJECT[80%]:'/',"magic missile",(39,09) OBJECT:')',"orcish bow",(39,09),uncursed,+2 OBJECT:')',"orcish arrow",(39,09),uncursed,+1 MONSTER:'o',"war orc",(39,11),hostile OBJECT[80%]:'/',"striking",(39,11) OBJECT:')',"orcish bow",(39,11),uncursed,+2 OBJECT:')',"orcish arrow",(39,11),uncursed,+3 MONSTER:'@',"soldier",(39,13),hostile OBJECT[60%]:'/',"fire",(39,13) OBJECT:')',"orcish bow",(39,13),uncursed,+1 OBJECT:')',"orcish arrow",(39,13),uncursed,+2 OBJECT[40%]:')',"grenade launcher",(39,13),uncursed,+1 OBJECT[40%]:')',"frag grenade",(39,13),uncursed,+3 OBJECT[40%]:')',"frag grenade",(39,13),uncursed,+2 MONSTER:'o',"war orc",(39,15),hostile OBJECT[60%]:'/',"lightning",(39,15) OBJECT:')',"orcish bow",(39,15),uncursed,+2 OBJECT:')',"orcish arrow",(39,15),uncursed,+2 MONSTER:'o',"war orc",(39,18),hostile OBJECT[40%]:'/',"draining",(39,18) OBJECT:')',"orcish bow",(39,18),uncursed,+3 OBJECT:')',"orcish arrow",(39,18),uncursed,+3 # MONSTER:'d',"hell hound",(36,01),hostile MONSTER[50%]:'d',"hell hound",(36,07),hostile MONSTER[50%]:'d',"hell hound",(36,12),hostile MONSTER:'d',"hell hound",(36,15),asleep,hostile # caves MONSTER[50%]:'o',"Uruk-hai",(18,02),hostile MONSTER:'o',"Uruk-hai",(19,02),hostile MONSTER:'o',"Uruk-hai",(20,02),hostile MONSTER:'o',"Uruk-hai",(18,03),hostile MONSTER:'o',"Uruk-hai",(19,03),hostile MONSTER:'o',"orc shaman",(24,02),hostile MONSTER[50%]:'o',"orc shaman",(24,02),hostile MONSTER:'H',"stone giant",(30,04),hostile MONSTER[50%]:'H',"stone giant",(31,03),hostile MONSTER:'@',"rogue",(18,07),hostile OBJECT:')',"rapier",(18,07),uncursed,+1 OBJECT[50%]:'!',"sickness",(18,07) OBJECT[50%]:'(',"sack",(18,07) MONSTER:'@',"mugger",(18,08),hostile OBJECT:')',"club",(18,08),uncursed,+2 OBJECT[40%]:')',"crossbow",(18,08),uncursed,+3 OBJECT[40%]:')',"crossbow bolt",(18,08),uncursed,+1 OBJECT[50%]:'!',"paralysis",(18,08) MONSTER:'@',"soldier",(18,09),hostile OBJECT[50%]:'!',"booze",(18,09) MONSTER:'O',"ogre",(24,07),hostile MONSTER:'O',"ogre",(25,07),hostile MONSTER[50%]:'O',"ogre",(24,08),hostile MONSTER:'O',"ogre",(25,08),hostile MONSTER:'o',"hill orc",(29,09),hostile MONSTER:'o',"hill orc",(30,09),hostile MONSTER[50%]:'o',"hill orc",(31,09),hostile MONSTER:'o',"hill orc",(29,10),hostile MONSTER[50%]:'o',"hill orc",(30,10),hostile MONSTER:'o',"hill orc",(31,10),hostile MONSTER:'o',"snow orc",(18,12),hostile MONSTER[50%]:'o',"snow orc",(19,12),hostile MONSTER:'o',"snow orc",(20,12),hostile MONSTER[50%]:'o',"snow orc",(18,13),hostile MONSTER:'o',"snow orc",(19,13),hostile MONSTER:'o',"snow orc",(20,13),hostile MONSTER:'o',"orc shaman",(25,14),hostile MONSTER[50%]:'o',"orc shaman",(27,15),hostile MONSTER[50%]:'o',"great orc",(18,17),hostile MONSTER:'o',"great orc",(19,17),hostile MONSTER:'o',"great orc",(20,17),hostile MONSTER:'o',"great orc",(18,18),hostile MONSTER[50%]:'o',"great orc",(19,18),hostile MONSTER:'o',"great orc",(20,18),hostile MONSTER:'o',"Mordor orc",(18,17),hostile MONSTER[50%]:'o',"Mordor orc",(19,17),hostile MONSTER:'o',"Mordor orc",(18,18),hostile MONSTER:'o',"Mordor orc",(19,18),hostile MONSTER[80%]:'T',"troll",random,hostile MONSTER[60%]:'T',"rock troll",random,hostile MONSTER[40%]:'T',"two-headed troll",random,hostile MONSTER[20%]:'T',"black troll",random,hostile # slaves MONSTER:'o',"goblin",random,random MONSTER:'o',"goblin",random,random MONSTER:'o',"goblin",random,random MONSTER:'o',"goblin",random,random MONSTER[50%]:'o',"goblin",random,random MONSTER[50%]:'o',"goblin",random,random # TRAP:"statue",(16,10) CONTAINER:'`',"statue",(16,10),"harpy",0 # throneroom MONSTER:'o',"Grund the Orc King",(02,10),hostile OBJECT:'/',random,(02,10) OBJECT:'"',random,(02,10) OBJECT:'[',random,(02,10) MONSTER:'o',"demon orc",(03,09),hostile MONSTER:'o',"demon orc",(03,11),hostile MONSTER[60%]:'o',"demon orc",(07,09),hostile MONSTER[60%]:'o',"demon orc",(07,11),hostile MONSTER:'o',"orc shaman",(04,08),hostile MONSTER:'o',"orc shaman",(04,12),hostile MONSTER:'O',"ogre mage",(04,10),hostile MONSTER[50%]:'O',"ogre mage",(06,10),hostile MONSTER[50%]:'O',"shadow ogre",(06,07),hostile MONSTER[50%]:'O',"ogre lord",(06,13),hostile MONSTER:'Z',"orc zombie",(07,04),asleep,hostile MONSTER:'Z',"orc zombie",(09,06),asleep,hostile MONSTER:'M',"orc mummy",(08,05),asleep,hostile MONSTER:'Z',"orc zombie",(07,16),asleep,hostile MONSTER:'Z',"orc zombie",(09,14),asleep,hostile MONSTER:'M',"orc mummy",(08,15),asleep,hostile # prisons MONSTER:'Z',"skeleton",(11,01),random MONSTER[40%]:'@',"nurse",(12,02),peaceful MONSTER[10%]:'@',"gypsy",(12,18),peaceful MONSTER:' ',"ghost",(11,19),peaceful OBJECT:'%',"corpse",(11,19),"human",0 # treasury OBJECT:'(',"chest",(02,02) MONSTER:'s',"giant spider",(02,03),asleep,hostile MONSTER:'s',"giant spider",(03,01),asleep,hostile GOLD:1200,(02,02) GOLD:random,(02,02) CONTAINER:'(',"chest",(06,01) OBJECT:'"',"amulet of drain resistance",contained OBJECT:'+',"acid stream",contained,blessed,+4 OBJECT[20%]:'(',"magic marker",contained,cursed,34 OBJECT:'!',"enlightenment",contained,blessed,0 OBJECT:'!',"enlightenment",contained,blessed,0 OBJECT[50%]:'!',"enlightenment",contained,blessed,0 OBJECT[50%]:'!',"enlightenment",contained,blessed,0 GOLD:8700,(06,01) GOLD:random,(06,01) # arms storage OBJECT:'(',"chest",(02,18) MONSTER:'o',"orc",(03,19),asleep,hostile OBJECT[40%]:'!',"booze",(02,19) CONTAINER:'(',"chest",(06,19) OBJECT:'[',"helm of telepathy",contained,blessed,+0 OBJECT:'%',"tin",contained,"spinach",0 OBJECT:'%',"tin",contained,"spinach",0 OBJECT[50%]:'%',"tin",contained,"spinach",0 OBJECT[50%]:'%',"tin",contained,"spinach",0 #traps TRAP[90%]:"land mine",(08,10) TRAP[90%]:"board",(09,10) TRAP[90%]:"anti magic",(10,10) TRAP:"falling rock",random TRAP[50%]:"falling rock",random TRAP:"web",random TRAP[50%]:"web",random TRAP:"dart",random TRAP:"dart",random TRAP[50%]:"dart",random TRAP[50%]:"dart",random # goodies for the monsters: OBJECT:'!',"speed",random OBJECT:'!',"speed",random OBJECT[50%]:'!',"speed",random OBJECT[50%]:'!',"speed",random OBJECT:'!',"invisibility",random OBJECT:'!',"invisibility",random OBJECT[50%]:'!',"invisibility",random OBJECT[50%]:'!',"invisibility",random OBJECT:'/',"healing",random OBJECT[50%]:'/',"healing",random OBJECT:'/',"create monster",random OBJECT[20%]:'/',"create horde",random OBJECT[20%]:'/',"polymorph",random OBJECT:'?',"create monster",random OBJECT[40%]:'?',"create monster",random,cursed,0 # doors DOOR:locked,place[0] DOOR:locked,place[1] DOOR:random,(35,01) DOOR:random,(23,02) DOOR:random,(26,02) DOOR:random,(20,04) DOOR:random,(28,04) DOOR:random,(33,04) DOOR:random,(20,07) DOOR:random,(35,07) DOOR:random,(22,09) DOOR:random,(32,09) DOOR:random,(24,10) DOOR:random,(28,11) DOOR:random,(35,12) DOOR:random,(22,13) DOOR:random,(28,15) DOOR:random,(35,15) DOOR:random,(26,16) DOOR:random,(33,16) DOOR:random,(21,18) DOOR:random,(28,18) DOOR:locked,(02,04) DOOR:locked,(02,16) DOOR:locked,(12,03) DOOR:locked,(12,17) DOOR:locked,(11,04) DOOR:locked,(11,16) DOOR:locked,(01,10) DOOR:locked,(04,01) DOOR:locked,(04,19) DOOR:locked,(11,10) DOOR:locked,(12,09) DOOR:locked,(12,11) DOOR:locked,(14,09) DOOR:locked,(14,11) DOOR:locked,(15,10) # MAZE:"grund-3",' ' FLAGS:noteleport,hardfloor,nommap,shortsighted INIT_MAP:' ',' ',false,false,lit,false GEOMETRY:right,center #12345678901234567890123456789012 #0 i 1 i 2 i 3 MAP ........ ..... ........ ......... ......... ............. ......... ......-F-...... .......... .....---.---..... .......... ....--- . ---.... ........... ....-----------.... ........... ...--- - - - ---... ...............-------------.... ..............-- - - - - - --... ..............F..---------..F... ..............-- - - -.- - --... ...............-------------.... ........... ...--- - - - ---... ........... ....-----------.... .......... ....--- . ---.... .......... .....---.---..... ......... ......-F-...... ......... ............. ........ ......... ........ ..... ENDMAP RANDOM_PLACES:(21,03),(14,10),(28,10),(21,17) DOOR:locked,place[0] STAIR:(18,07,24,13),(00,00,00,00),up BRANCH:(18,07,24,13),(00,00,00,00) TELEPORT_REGION:(18,07,24,13),(00,00,00,00) MAZEWALK:(22,11),east REGION:(00,00,32,20),lit,"ordinary" REGION:(15,04,27,16),unlit,"ordinary" REGION:(15,04,16,05),lit,"ordinary" REGION:(26,04,27,05),lit,"ordinary" REGION:(15,15,16,16),lit,"ordinary" REGION:(26,15,27,16),lit,"ordinary" NON_DIGGABLE:(00,00,17,20) NON_DIGGABLE:(25,00,32,20) NON_DIGGABLE:(18,00,24,06) NON_DIGGABLE:(18,14,24,20) TRAP:"statue",(11,10) CONTAINER:'`',"statue",(11,10),"winged gargoyle",0 # monsters (Fussvolk) MONSTER:'o',"orc-captain",random,hostile MONSTER:'o',"orc",random,hostile MONSTER:'o',"orc",random,hostile MONSTER:'o',"orc",random,hostile MONSTER:'o',"orc",random,hostile MONSTER:'o',"orc",random,hostile MONSTER:'o',"orc",random,hostile MONSTER:'o',"orc",random,hostile MONSTER:'o',"orc",random,hostile MONSTER[60%]:'o',"orc-captain",random,hostile MONSTER[60%]:'o',"orc",random,hostile MONSTER[60%]:'o',"orc",random,hostile MONSTER[60%]:'o',"orc",random,hostile MONSTER[60%]:'o',"orc",random,hostile MONSTER[60%]:'o',"orc",random,hostile MONSTER[60%]:'o',"orc",random,hostile MONSTER[60%]:'o',"orc",random,hostile MONSTER[60%]:'o',"orc",random,hostile # objects OBJECT[80%]:'/',"create monster",random OBJECT[40%]:'/',"create horde",random OBJECT[80%]:'/',"speed monster",random OBJECT[40%]:'/',"speed monster",random OBJECT[80%]:'/',"make invisible",random OBJECT[40%]:'/',"make invisible",random OBJECT[80%]:'!',"invisibility",random OBJECT[40%]:'!',"invisibility",random OBJECT[80%]:'!',"speed",random OBJECT[40%]:'!',"speed",random OBJECT[40%]:'!',"full healing",random OBJECT[20%]:'!',"full healing",random OBJECT[60%]:'!',"extra healing",random OBJECT[30%]:'!',"extra healing",random OBJECT[80%]:'!',"healing",random OBJECT[40%]:'!',"healing",random OBJECT[40%]:'!',"gain level",random OBJECT[20%]:'!',"gain level",random OBJECT[20%]:'!',"invulnerability",random OBJECT[10%]:'!',"invulnerability",random #traps TRAP[50%]:"rust",(00,01) TRAP[50%]:"rust",(00,03) TRAP[50%]:"rust",(00,05) TRAP[50%]:"rust",(00,07) TRAP[50%]:"rust",(00,09) TRAP[50%]:"rust",(00,11) TRAP[50%]:"rust",(00,13) TRAP[50%]:"rust",(00,15) TRAP[50%]:"rust",(00,17) TRAP[50%]:"rust",(00,19) TRAP[50%]:"arrow",(01,00) TRAP[50%]:"arrow",(02,01) TRAP[50%]:"arrow",(01,02) TRAP[50%]:"arrow",(02,03) TRAP[50%]:"arrow",(01,04) TRAP[50%]:"arrow",(02,05) TRAP[50%]:"arrow",(01,06) TRAP[50%]:"arrow",(02,07) TRAP[50%]:"arrow",(01,08) TRAP[50%]:"arrow",(02,09) TRAP[50%]:"arrow",(01,10) TRAP[50%]:"arrow",(02,11) TRAP[50%]:"arrow",(01,12) TRAP[50%]:"arrow",(02,13) TRAP[50%]:"arrow",(01,14) TRAP[50%]:"arrow",(02,15) TRAP[50%]:"arrow",(01,16) TRAP[50%]:"arrow",(02,17) TRAP[50%]:"arrow",(01,18) TRAP[50%]:"arrow",(02,19) TRAP[50%]:"arrow",(01,20) TRAP[50%]:"spiked pit",(03,00) TRAP[50%]:"spiked pit",(04,01) TRAP[50%]:"spiked pit",(03,02) TRAP[50%]:"spiked pit",(04,03) TRAP[50%]:"spiked pit",(03,04) TRAP[50%]:"spiked pit",(04,05) TRAP[50%]:"spiked pit",(03,06) TRAP[50%]:"spiked pit",(04,07) TRAP[50%]:"spiked pit",(03,08) TRAP[50%]:"spiked pit",(04,09) TRAP[50%]:"spiked pit",(03,10) TRAP[50%]:"spiked pit",(04,11) TRAP[50%]:"spiked pit",(03,12) TRAP[50%]:"spiked pit",(04,13) TRAP[50%]:"spiked pit",(03,14) TRAP[50%]:"spiked pit",(04,15) TRAP[50%]:"spiked pit",(03,16) TRAP[50%]:"spiked pit",(04,17) TRAP[50%]:"spiked pit",(03,18) TRAP[50%]:"spiked pit",(04,19) TRAP[50%]:"spiked pit",(03,20) TRAP:"rust",random TRAP:"rust",random TRAP[50%]:"rust",random TRAP[50%]:"rust",random TRAP:"arrow",random TRAP:"arrow",random TRAP[50%]:"arrow",random TRAP[50%]:"arrow",random TRAP:"spiked pit",random TRAP:"spiked pit",random TRAP[50%]:"spiked pit",random TRAP[50%]:"spiked pit",random TRAP:"land mine",random TRAP:"land mine",random TRAP:"land mine",random TRAP:"land mine",random TRAP:"land mine",random TRAP:"land mine",random TRAP:"land mine",random TRAP:"land mine",random TRAP:"land mine",random TRAP:"land mine",random TRAP:"land mine",random TRAP:"land mine",random TRAP[50%]:"land mine",random TRAP[50%]:"land mine",random TRAP[50%]:"land mine",random TRAP[50%]:"land mine",random TRAP[50%]:"level teleport",random TRAP[50%]:"level teleport",random MONSTER:'o',"hobgoblin",(10,11),hostile OBJECT:'/',"fire",random,cursed,1 ENGRAVING:random,burn,"Us wanna no veeseetohs!" ENGRAVING:random,burn,"boogrr ohf! GRR!" ENGRAVING:random,burn,"keap Us ohr Gohld!!" ENGRAVING:random,burn,"Me Preeeteee!" ENGRAVING:random,burn,"dee no preeeteee" ENGRAVING:random,burn,"veesetoohs gohd eet!" GEOMETRY:left,center #12345678901234567890123456789012345678901 #0 i 1 i 2 i 3 i 4 MAP -----------------------------------------} -...SH.----..-----...---..--------.+.-..-} -...----..F..-..-....-.+..+.--..--.-.-..F} -...--....--+-.---..--.----.-...--.-.-..-} --S--......S#-.---..+..----.+....+.-.-.--} -##-.......---.---F----------....---.-..F} -#--.......-...---.-----..-----.----.-..-} ##-.......--.----...+.-...-------..+.-..F} H--......---.-..-..--.--...---..-.--.-..-} H-......----S-S---..F.+..-.F....+.--.-..F} HS\........S...S.-------+---....----.-..-} H-......----S-S----..---..--+-.-----.-..F} H--......---.-..-....----....----..+.-..-} ##-.......--.----.....+.--F----...--.-..F} -#--.......-...---...--.-..--...----.-..-} -##-.......---.---F----.--..+.---..+.-..F} --S--......S#-.---..---...+--F---+--.-.--} -...--....--+-.--....--------.-...--.-..-} -...----..F..-..-....+..-...+....---.-..F} -...SH.----..------.---...---....---.S..-} -----------------------------------------} ENDMAP RANDOM_PLACES:(16,02),(16,08),(16,12),(16,18),(31,07) REGION:(00,00,39,20),unlit,"ordinary" REGION:(41,00,41,20),lit,"ordinary" NON_DIGGABLE:(00,00,37,20) DRAWBRIDGE:(41,10),west,closed # (whatever it's called) MONSTER:'o',"war orc",(39,02),hostile OBJECT[80%]:'/',"sleep",(39,02) OBJECT:')',"orcish bow",(39,02),uncursed,+1 OBJECT:')',"orcish arrow",(39,02),uncursed,+2 MONSTER:'o',"war orc",(39,05),hostile OBJECT[40%]:'/',"fireball",(39,05) OBJECT:')',"orcish bow",(39,05),uncursed,+2 OBJECT:')',"orcish arrow",(39,05),uncursed,+1 MONSTER:'@',"soldier",(39,07),hostile OBJECT[40%]:'/',"cold",(39,07) OBJECT:')',"orcish bow",(39,07),uncursed,+1 OBJECT:')',"orcish arrow",(39,07),uncursed,+3 OBJECT[40%]:')',"sniper rifle",(39,07),uncursed,+3 OBJECT[40%]:')',"bullet",(39,07),uncursed,+4 OBJECT[40%]:')',"bullet",(39,07),uncursed,+3 MONSTER:'o',"war orc",(39,09),hostile OBJECT[80%]:'/',"magic missile",(39,09) OBJECT:')',"orcish bow",(39,09),uncursed,+2 OBJECT:')',"orcish arrow",(39,09),uncursed,+1 MONSTER:'o',"war orc",(39,11),hostile OBJECT[80%]:'/',"striking",(39,11) OBJECT:')',"orcish bow",(39,11),uncursed,+2 OBJECT:')',"orcish arrow",(39,11),uncursed,+3 MONSTER:'@',"soldier",(39,13),hostile OBJECT[60%]:'/',"fire",(39,13) OBJECT:')',"orcish bow",(39,13),uncursed,+1 OBJECT:')',"orcish arrow",(39,13),uncursed,+2 OBJECT[40%]:')',"grenade launcher",(39,13),uncursed,+1 OBJECT[40%]:')',"frag grenade",(39,13),uncursed,+3 OBJECT[40%]:')',"frag grenade",(39,13),uncursed,+2 MONSTER:'o',"war orc",(39,15),hostile OBJECT[60%]:'/',"lightning",(39,15) OBJECT:')',"orcish bow",(39,15),uncursed,+2 OBJECT:')',"orcish arrow",(39,15),uncursed,+2 MONSTER:'o',"war orc",(39,18),hostile OBJECT[40%]:'/',"draining",(39,18) OBJECT:')',"orcish bow",(39,18),uncursed,+3 OBJECT:')',"orcish arrow",(39,18),uncursed,+3 # MONSTER:'d',"hell hound",(36,01),hostile MONSTER[50%]:'d',"hell hound",(36,07),hostile MONSTER[50%]:'d',"hell hound",(36,12),hostile MONSTER:'d',"hell hound",(36,15),asleep,hostile # caves MONSTER[50%]:'o',"Uruk-hai",(18,02),hostile MONSTER:'o',"Uruk-hai",(19,02),hostile MONSTER:'o',"Uruk-hai",(20,02),hostile MONSTER:'o',"Uruk-hai",(18,03),hostile MONSTER:'o',"Uruk-hai",(19,03),hostile MONSTER:'o',"orc shaman",(24,02),hostile MONSTER[50%]:'o',"orc shaman",(24,02),hostile MONSTER:'H',"stone giant",(30,04),hostile MONSTER[50%]:'H',"stone giant",(31,03),hostile MONSTER:'@',"rogue",(18,07),hostile OBJECT:')',"rapier",(18,07),uncursed,+1 OBJECT[50%]:'!',"sickness",(18,07) OBJECT[50%]:'(',"sack",(18,07) MONSTER:'@',"mugger",(18,08),hostile OBJECT:')',"club",(18,08),uncursed,+2 OBJECT[40%]:')',"crossbow",(18,08),uncursed,+3 OBJECT[40%]:')',"crossbow bolt",(18,08),uncursed,+1 OBJECT[50%]:'!',"paralysis",(18,08) MONSTER:'@',"soldier",(18,09),hostile OBJECT[50%]:'!',"booze",(18,09) MONSTER:'O',"ogre",(24,07),hostile MONSTER:'O',"ogre",(25,07),hostile MONSTER[50%]:'O',"ogre",(24,08),hostile MONSTER:'O',"ogre",(25,08),hostile MONSTER:'o',"hill orc",(29,09),hostile MONSTER:'o',"hill orc",(30,09),hostile MONSTER[50%]:'o',"hill orc",(31,09),hostile MONSTER:'o',"hill orc",(29,10),hostile MONSTER[50%]:'o',"hill orc",(30,10),hostile MONSTER:'o',"hill orc",(31,10),hostile MONSTER:'o',"snow orc",(18,12),hostile MONSTER[50%]:'o',"snow orc",(19,12),hostile MONSTER:'o',"snow orc",(20,12),hostile MONSTER[50%]:'o',"snow orc",(18,13),hostile MONSTER:'o',"snow orc",(19,13),hostile MONSTER:'o',"snow orc",(20,13),hostile MONSTER:'o',"orc shaman",(25,14),hostile MONSTER[50%]:'o',"orc shaman",(27,15),hostile MONSTER[50%]:'o',"great orc",(18,17),hostile MONSTER:'o',"great orc",(19,17),hostile MONSTER:'o',"great orc",(20,17),hostile MONSTER:'o',"great orc",(18,18),hostile MONSTER[50%]:'o',"great orc",(19,18),hostile MONSTER:'o',"great orc",(20,18),hostile MONSTER:'o',"Mordor orc",(18,17),hostile MONSTER[50%]:'o',"Mordor orc",(19,17),hostile MONSTER:'o',"Mordor orc",(18,18),hostile MONSTER:'o',"Mordor orc",(19,18),hostile MONSTER[80%]:'T',"troll",random,hostile MONSTER[60%]:'T',"rock troll",random,hostile MONSTER[40%]:'T',"two-headed troll",random,hostile MONSTER[20%]:'T',"black troll",random,hostile # slaves MONSTER:'o',"goblin",random,random MONSTER:'o',"goblin",random,random MONSTER:'o',"goblin",random,random MONSTER:'o',"goblin",random,random MONSTER[50%]:'o',"goblin",random,random MONSTER[50%]:'o',"goblin",random,random # TRAP:"statue",(16,10) CONTAINER:'`',"statue",(16,10),"harpy",0 # throneroom MONSTER:'o',"Grund the Orc King",(02,10),hostile OBJECT:'/',random,(02,10) OBJECT:'"',random,(02,10) OBJECT:'[',random,(02,10) MONSTER:'o',"demon orc",(03,09),hostile MONSTER:'o',"demon orc",(03,11),hostile MONSTER[60%]:'o',"demon orc",(07,09),hostile MONSTER[60%]:'o',"demon orc",(07,11),hostile MONSTER:'o',"orc shaman",(04,08),hostile MONSTER:'o',"orc shaman",(04,12),hostile MONSTER:'O',"ogre mage",(04,10),hostile MONSTER[50%]:'O',"ogre mage",(06,10),hostile MONSTER[50%]:'O',"shadow ogre",(06,07),hostile MONSTER[50%]:'O',"ogre lord",(06,13),hostile MONSTER:'Z',"orc zombie",(07,04),asleep,hostile MONSTER:'Z',"orc zombie",(09,06),asleep,hostile MONSTER:'M',"orc mummy",(08,05),asleep,hostile MONSTER:'Z',"orc zombie",(07,16),asleep,hostile MONSTER:'Z',"orc zombie",(09,14),asleep,hostile MONSTER:'M',"orc mummy",(08,15),asleep,hostile # prisons MONSTER:'Z',"skeleton",(11,01),random MONSTER[40%]:'@',"nurse",(12,02),peaceful MONSTER[10%]:'@',"gypsy",(12,18),peaceful MONSTER:' ',"ghost",(11,19),peaceful OBJECT:'%',"corpse",(11,19),"human",0 # treasury OBJECT:'(',"chest",(02,02) MONSTER:'s',"giant spider",(02,03),asleep,hostile MONSTER:'s',"giant spider",(03,01),asleep,hostile GOLD:1200,(02,02) GOLD:random,(02,02) CONTAINER:'(',"chest",(06,01) OBJECT:'"',"amulet versus stone",contained OBJECT:'+',"create monster",contained,blessed,+4 OBJECT[20%]:'(',"magic marker",contained,cursed,34 OBJECT:'!',"enlightenment",contained,blessed,0 OBJECT:'!',"enlightenment",contained,blessed,0 OBJECT[50%]:'!',"enlightenment",contained,blessed,0 OBJECT[50%]:'!',"enlightenment",contained,blessed,0 GOLD:8700,(06,01) GOLD:random,(06,01) # arms storage OBJECT:'(',"chest",(02,18) MONSTER:'o',"orc",(03,19),asleep,hostile OBJECT[40%]:'!',"booze",(02,19) CONTAINER:'(',"chest",(06,19) OBJECT:'[',"oilskin cloak",contained,uncursed,+0 OBJECT:'%',"tin",contained,"spinach",0 OBJECT:'%',"tin",contained,"spinach",0 OBJECT[50%]:'%',"tin",contained,"spinach",0 OBJECT[50%]:'%',"tin",contained,"spinach",0 #traps TRAP[90%]:"land mine",(08,10) TRAP[90%]:"board",(09,10) TRAP[90%]:"anti magic",(10,10) TRAP:"falling rock",random TRAP[50%]:"falling rock",random TRAP:"web",random TRAP[50%]:"web",random TRAP:"dart",random TRAP:"dart",random TRAP[50%]:"dart",random TRAP[50%]:"dart",random # goodies for the monsters: OBJECT:'!',"speed",random OBJECT:'!',"speed",random OBJECT[50%]:'!',"speed",random OBJECT[50%]:'!',"speed",random OBJECT:'!',"invisibility",random OBJECT:'!',"invisibility",random OBJECT[50%]:'!',"invisibility",random OBJECT[50%]:'!',"invisibility",random OBJECT:'/',"healing",random OBJECT[50%]:'/',"healing",random OBJECT:'/',"create monster",random OBJECT[20%]:'/',"create horde",random OBJECT[20%]:'/',"polymorph",random OBJECT:'?',"create monster",random OBJECT[40%]:'?',"create monster",random,cursed,0 # doors DOOR:locked,place[0] DOOR:locked,place[1] DOOR:random,(35,01) DOOR:random,(23,02) DOOR:random,(26,02) DOOR:random,(20,04) DOOR:random,(28,04) DOOR:random,(33,04) DOOR:random,(20,07) DOOR:random,(35,07) DOOR:random,(22,09) DOOR:random,(32,09) DOOR:random,(24,10) DOOR:random,(28,11) DOOR:random,(35,12) DOOR:random,(22,13) DOOR:random,(28,15) DOOR:random,(35,15) DOOR:random,(26,16) DOOR:random,(33,16) DOOR:random,(21,18) DOOR:random,(28,18) DOOR:locked,(02,04) DOOR:locked,(02,16) DOOR:locked,(12,03) DOOR:locked,(12,17) DOOR:locked,(11,04) DOOR:locked,(11,16) DOOR:locked,(01,10) DOOR:locked,(04,01) DOOR:locked,(04,19) DOOR:locked,(11,10) DOOR:locked,(12,09) DOOR:locked,(12,11) DOOR:locked,(14,09) DOOR:locked,(14,11) DOOR:locked,(15,10) slashem-0.0.7E7F3/dat/endgame.des0000664000076400007640000006065110545462317014531 0ustar aliali# 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 # NetHack may be freely redistributed. See license for details. # # These are the ENDGAME levels: earth, air, fire, water, and astral. # The top-most level, the Astral Level, has 3 temples and shrines. # Players are supposed to sacrifice the Amulet of Yendor on the appropriate # shrine. MAZE:"earth",' ' FLAGS: noteleport,hardfloor,shortsighted MESSAGE: "Well done, mortal!" MESSAGE: "But now thou must face the final Test..." MESSAGE: "Prove thyself worthy or perish!" GEOMETRY:center,center # The player lands, upon arrival, in the # lower-right cavern. The location of the # portal to the next level is randomly chosen. # This map has no visible outer boundary, and # is mostly diggable "rock". MAP ... .... .. ..... ... .. .... .... ... .... ... .... ... . .. .. ....... . .. .. ... . . .. . ... .. .. . .. . .. ... . ... ... .. ... .. .... .. .. ... .. ..... ... ... .... .. ENDMAP # Since there are no stairs, this forces the hero's initial placement TELEPORT_REGION:(69,16,69,16),(0,0,0,0) PORTAL:(0,0,75,19),(65,13,75,19),"air" # Some helpful monsters. Making sure a # pick axe and at least one wand of digging # are available. MONSTER:'@',"Elvenking",(67,16) MONSTER:'H',"minotaur",(67,14) # An assortment of earth-appropriate nasties # in each cavern. MONSTER:'E',"earth elemental",(52,13),hostile MONSTER:'E',"earth elemental",(53,13),hostile MONSTER:'T',"rock troll",(53,12) MONSTER:'H',"stone giant",(54,12) # MONSTER:'S',"pit viper",(70,05) MONSTER:'&',"barbed devil",(69,06) MONSTER:'H',"stone giant",(69,08) MONSTER:''',"stone golem",(71,08) MONSTER:'&',"pit fiend",(70,09) MONSTER:'E',"earth elemental",(70,08),hostile # MONSTER:'E',"earth elemental",(60,03),hostile MONSTER:'H',"stone giant",(61,04) MONSTER:'E',"earth elemental",(62,04),hostile MONSTER:'E',"earth elemental",(61,05),hostile MONSTER:'s',"scorpion",(62,05) MONSTER:'p',"rock piercer",(63,05) # MONSTER:'U',"umber hulk",(40,05) MONSTER:'v',"dust vortex",(42,05) MONSTER:'T',"rock troll",(38,06) MONSTER:'E',"earth elemental",(39,06),hostile MONSTER:'E',"earth elemental",(41,06),hostile MONSTER:'E',"earth elemental",(38,07),hostile MONSTER:'H',"stone giant",(39,07) MONSTER:'E',"earth elemental",(43,07),hostile MONSTER:''',"stone golem",(37,08) MONSTER:'S',"pit viper",(43,08) MONSTER:'S',"pit viper",(43,09) MONSTER:'T',"rock troll",(44,10) # MONSTER:'E',"earth elemental",(02,01),hostile MONSTER:'E',"earth elemental",(03,01),hostile MONSTER:''',"stone golem",(01,02) MONSTER:'E',"earth elemental",(02,02),hostile MONSTER:'T',"rock troll",(04,03) MONSTER:'T',"rock troll",(03,03) MONSTER:'&',"pit fiend",(03,04) MONSTER:'E',"earth elemental",(04,05),hostile MONSTER:'S',"pit viper",(05,06) # MONSTER:'E',"earth elemental",(21,02),hostile MONSTER:'E',"earth elemental",(21,03),hostile MONSTER:'H',"minotaur",(21,04) MONSTER:'E',"earth elemental",(21,05),hostile MONSTER:'T',"rock troll",(22,05) MONSTER:'E',"earth elemental",(22,06),hostile MONSTER:'E',"earth elemental",(23,06),hostile # MONSTER:'S',"pit viper",(14,08) MONSTER:'&',"barbed devil",(14,09) MONSTER:'E',"earth elemental",(13,10),hostile MONSTER:'T',"rock troll",(12,11) MONSTER:'E',"earth elemental",(14,12),hostile MONSTER:'E',"earth elemental",(15,13),hostile MONSTER:'H',"stone giant",(17,13) MONSTER:''',"stone golem",(18,13) MONSTER:'&',"pit fiend",(18,12) MONSTER:'E',"earth elemental",(18,11),hostile MONSTER:'E',"earth elemental",(18,10),hostile # MONSTER:'&',"barbed devil",(02,16) MONSTER:'E',"earth elemental",(03,16),hostile MONSTER:'T',"rock troll",(02,17) MONSTER:'E',"earth elemental",(04,17),hostile MONSTER:'E',"earth elemental",(04,18),hostile OBJECT:'`',"boulder",random MAZE:"air",' ' FLAGS: noteleport,hardfloor,shortsighted # The following messages are somewhat obtuse, to make then # equally meaningful if the player can see or not. MESSAGE: "What a strange feeling!" MESSAGE: "You notice that there is no gravity here." GEOMETRY:center,center # The player lands, upon arrival, in the # lower-left area. The location of the # portal to the next level is randomly chosen. # This map has no visible outer boundary, and # is all "air". MAP AAAAAAAAAAAAAAAAAAAAAAAACCCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAACCCCCCAAAAAAAACCCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAACCAACCCCCAAAAAACCCCCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAACCACCCCCCCAAAAACCCCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAACCCCCCCCCCAAAAACCCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAACCCCAAACCAAACCCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAACCCCAAAAAACCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAACCCCCCCAAAACCACCCCCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAACCCCAAAAAAACCACAACCCCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACCAACCCCCCCCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAACCCCAAACCCCCCAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAACACACCCCCAAACCCCCCCAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAACAACCCCCCCAAAACCCCCCCAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAACACCCCCCCCAAACCCCCCCCAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACCCCCCCCCCAACCCCCCCCAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAACACCCCCCCCCCACCCCCCCCAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAACAACCCCCCCCCCCCCCCCAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAACCCCCCAAACCCCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 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 MONSTER:'E',"air elemental",random,hostile MONSTER:'E',"air elemental",random,hostile MONSTER:'E',"air elemental",random,hostile MONSTER:'E',"air elemental",random,hostile MONSTER:'E',"air elemental",random,hostile MONSTER:'E',"air elemental",random,hostile MONSTER:'E',"air elemental",random,hostile MONSTER:'E',"air elemental",random,hostile MONSTER:'E',"air elemental",random,hostile MONSTER:'e',"floating eye",random,hostile MONSTER:'e',"floating eye",random,hostile MONSTER:'e',"floating eye",random,hostile MONSTER:'y',"yellow light",random,hostile MONSTER:'y',"yellow light",random,hostile MONSTER:'y',"yellow light",random,hostile MONSTER:'A',"couatl",random MONSTER:'D',random,random MONSTER:'D',random,random MONSTER:'D',random,random MONSTER:'D',random,random MONSTER:'D',random,random MONSTER:'E',random,random MONSTER:'E',random,random MONSTER:'E',random,random MONSTER:'J',random,random MONSTER:'J',random,random MONSTER:'&',"djinni",random,hostile MONSTER:'&',"djinni",random,hostile MONSTER:'&',"djinni",random,hostile MONSTER:'v',"fog cloud",random,hostile MONSTER:'v',"fog cloud",random,hostile MONSTER:'v',"fog cloud",random,hostile MONSTER:'v',"fog cloud",random,hostile MONSTER:'v',"fog cloud",random,hostile MONSTER:'v',"fog cloud",random,hostile MONSTER:'v',"fog cloud",random,hostile MONSTER:'v',"fog cloud",random,hostile MONSTER:'v',"fog cloud",random,hostile MONSTER:'v',"energy vortex",random,hostile MONSTER:'v',"energy vortex",random,hostile MONSTER:'v',"energy vortex",random,hostile MONSTER:'v',"energy vortex",random,hostile MONSTER:'v',"energy vortex",random,hostile MONSTER:'v',"steam vortex",random,hostile MONSTER:'v',"steam vortex",random,hostile MONSTER:'v',"steam vortex",random,hostile MONSTER:'v',"steam vortex",random,hostile MONSTER:'v',"steam vortex",random,hostile MAZE:"fire",' ' FLAGS: noteleport,hardfloor,shortsighted GEOMETRY:center,center # The player lands, upon arrival, in the # lower-right. The location of the # portal to the next level is randomly chosen. # This map has no visible outer boundary, and # is mostly open area, with lava lakes and bunches of fire traps. MAP ............................................................................ ....LLLLLLLL............L.......................LLL......................... ...LL...................L......................LLLL................LL....... ...L.............LLLL...LL....LL...............LLLLL.............LLL........ .LLLL..............LL....L.....LLL..............LLLL..............LLLL...... ..........LLLL...LLLL...LLL....LLL......L........LLLL....LL........LLL...... ........LLLLLLL...LL.....L......L......LL.........LL......LL........LL...L.. ........LL..LLL..LL......LL......LLLL..L.........LL......LLL............LL.. ....L..LL....LLLLL.................LLLLLLL.......L......LL............LLLLLL ....L..L.....LL.LLLL.......L............L........LLLLL.LL......LL.........LL ....LL........L...LL......LL.............LLL.....L...LLL.......LLL.........L .....LLLLLL........L.......LLL.............L....LL...L.LLL......LLLLLLL..... ..........LLLL............LL.L.............L....L...LL.........LLL..LLL..... ...........................LLLLL...........LL...L...L........LLLL..LLLLLL... .....LLLL.............LL....LL.......LLL...LL.......L..LLL....LLLLLLL....... .......LLL.........LLLLLLLLLLL......LLLLL...L...........LL...LL...LL........ .........LL.......LL.........LL.......LLL....L..LLL....LL.........LL........ ..........LLLLLLLLL...........LL....LLL.......LLLLL.....LL........LL........ .................L.............LLLLLL............LL...LLLL.........LL....... .................................LL....................LL................... ENDMAP TELEPORT_REGION:(69,16,69,16),(0,0,0,0) PORTAL:(0,0,75,19),(65,13,75,19),"water" TRAP:"fire",random TRAP:"fire",random TRAP:"fire",random TRAP:"fire",random TRAP:"fire",random TRAP:"fire",random TRAP:"fire",random TRAP:"fire",random TRAP:"fire",random TRAP:"fire",random TRAP:"fire",random TRAP:"fire",random TRAP:"fire",random TRAP:"fire",random TRAP:"fire",random TRAP:"fire",random TRAP:"fire",random TRAP:"fire",random TRAP:"fire",random TRAP:"fire",random TRAP:"fire",random TRAP:"fire",random TRAP:"fire",random TRAP:"fire",random TRAP:"fire",random TRAP:"fire",random TRAP:"fire",random TRAP:"fire",random TRAP:"fire",random TRAP:"fire",random TRAP:"fire",random TRAP:"fire",random TRAP:"fire",random TRAP:"fire",random TRAP:"fire",random TRAP:"fire",random TRAP:"fire",random TRAP:"fire",random TRAP:"fire",random TRAP:"fire",random # An assortment of fire-appropriate nasties MONSTER:'D',"red dragon",random MONSTER:'&',"balrog",random MONSTER:'E',"fire elemental",random,hostile MONSTER:'E',"fire elemental",random,hostile MONSTER:'v',"fire vortex",random MONSTER:'d',"hell hound",random # MONSTER:'H',"fire giant",random MONSTER:'&',"barbed devil",random MONSTER:'d',"hell hound",random MONSTER:''',"stone golem",random MONSTER:'&',"pit fiend",random MONSTER:'E',"fire elemental",random,hostile # MONSTER:'E',"fire elemental",random,hostile MONSTER:'d',"hell hound",random MONSTER:'E',"fire elemental",random,hostile MONSTER:'E',"fire elemental",random,hostile MONSTER:'s',"scorpion",random MONSTER:'H',"fire giant",random # MONSTER:'d',"hell hound",random MONSTER:'v',"dust vortex",random MONSTER:'v',"fire vortex",random MONSTER:'E',"fire elemental",random,hostile MONSTER:'E',"fire elemental",random,hostile MONSTER:'E',"fire elemental",random,hostile MONSTER:'d',"hell hound",random MONSTER:'E',"fire elemental",random,hostile MONSTER:''',"stone golem",random MONSTER:'S',"pit viper",random MONSTER:'S',"pit viper",random MONSTER:'v',"fire vortex",random # MONSTER:'E',"fire elemental",random,hostile MONSTER:'E',"fire elemental",random,hostile MONSTER:'H',"fire giant",random MONSTER:'E',"fire elemental",random,hostile MONSTER:'v',"fire vortex",random MONSTER:'v',"fire vortex",random MONSTER:'&',"pit fiend",random MONSTER:'E',"fire elemental",random,hostile MONSTER:'S',"pit viper",random # MONSTER:':',"salamander",random,hostile MONSTER:':',"salamander",random,hostile MONSTER:'H',"minotaur",random MONSTER:':',"salamander",random,hostile MONSTER:'v',"steam vortex",random MONSTER:':',"salamander",random,hostile MONSTER:':',"salamander",random,hostile # MONSTER:'H',"fire giant",random MONSTER:'&',"barbed devil",random MONSTER:'E',"fire elemental",random,hostile MONSTER:'v',"fire vortex",random MONSTER:'E',"fire elemental",random,hostile MONSTER:'E',"fire elemental",random,hostile MONSTER:'d',"hell hound",random MONSTER:'H',"fire giant",random MONSTER:'&',"pit fiend",random MONSTER:'E',"fire elemental",random,hostile MONSTER:'E',"fire elemental",random,hostile # MONSTER:'&',"barbed devil",random MONSTER:':',"salamander",random,hostile MONSTER:'v',"steam vortex",random MONSTER:':',"salamander",random,hostile MONSTER:':',"salamander",random,hostile OBJECT:'`',"boulder",random OBJECT:'`',"boulder",random OBJECT:'`',"boulder",random OBJECT:'`',"boulder",random OBJECT:'`',"boulder",random MAZE:"water",' ' FLAGS: noteleport,hardfloor,shortsighted MESSAGE: "You find yourself suspended in an air bubble surrounded by water." GEOMETRY:center,center # The player lands upon arrival to an air bubble # within the leftmost third of the level. The # portal to the next level is randomly located in an air # bubble within the rightmost third of the level. # Bubbles are generated by special code in mkmaze.c for now. MAP WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW ENDMAP TELEPORT_REGION:(0,0,25,19),(0,0,0,0) PORTAL:(51,0,75,19),(0,0,0,0),"astral" # A fisherman's dream... MONSTER:';',"giant eel",random MONSTER:';',"giant eel",random MONSTER:';',"giant eel",random MONSTER:';',"giant eel",random MONSTER:';',"giant eel",random MONSTER:';',"giant eel",random MONSTER:';',"giant eel",random MONSTER:';',"giant eel",random MONSTER:';',"electric eel",random MONSTER:';',"electric eel",random MONSTER:';',"electric eel",random MONSTER:';',"electric eel",random MONSTER:';',"electric eel",random MONSTER:';',"electric eel",random MONSTER:';',"electric eel",random MONSTER:';',"electric eel",random MONSTER:';',"kraken",random MONSTER:';',"kraken",random MONSTER:';',"kraken",random MONSTER:';',"kraken",random MONSTER:';',"kraken",random MONSTER:';',"kraken",random MONSTER:';',"kraken",random MONSTER:';',"kraken",random MONSTER:';',"kraken",random MONSTER:';',"shark",random MONSTER:';',"shark",random MONSTER:';',"shark",random MONSTER:';',"shark",random MONSTER:';',"piranha",random MONSTER:';',"piranha",random MONSTER:';',"piranha",random MONSTER:';',"piranha",random MONSTER:';',"jellyfish",random MONSTER:';',"jellyfish",random MONSTER:';',"jellyfish",random MONSTER:';',"jellyfish",random MONSTER:';',random,random MONSTER:';',random,random MONSTER:';',random,random MONSTER:';',random,random # These guys feel like home here MONSTER:'E',"water elemental",random,hostile MONSTER:'E',"water elemental",random,hostile MONSTER:'E',"water elemental",random,hostile MONSTER:'E',"water elemental",random,hostile MONSTER:'E',"water elemental",random,hostile MONSTER:'E',"water elemental",random,hostile MONSTER:'E',"water elemental",random,hostile MONSTER:'E',"water elemental",random,hostile MONSTER:'E',"water elemental",random,hostile MONSTER:'E',"water elemental",random,hostile MONSTER:'E',"water elemental",random,hostile MONSTER:'E',"water elemental",random,hostile MONSTER:'E',"water elemental",random,hostile MONSTER:'E',"water elemental",random,hostile MONSTER:'E',"water elemental",random,hostile MONSTER:'E',"water elemental",random,hostile MONSTER:'E',"water elemental",random,hostile MONSTER:'E',"water elemental",random,hostile MONSTER:'E',"water elemental",random,hostile MAZE:"astral",' ' FLAGS: noteleport,hardfloor,nommap,shortsighted MESSAGE: "You arrive on the Astral Plane!" MESSAGE: "Here the High Temples of the aligned gods are located." MESSAGE: "You sense alarm, hostility, and excitement in the air!" GEOMETRY:center,center MAP --------------- |.............| |..---------..| |..|.......|..| --------------- |..|.......|..| --------------- |.............| |..|.......|..| |.............| |..---------..-| |-------| |..|.......|..| |-------| |-..---------..| |..|.......|...-| |-.......-| |..|.......|..| |-.......-| |-...|.......|..| |..|.......|....-|-.........-||..----+----..||-.........-|-....|.......|..| |..|.......+.....+...........||.............||...........+.....+.......|..| |..|.......|....-|-.........-|--|.........|--|-.........-|-....|.......|..| |..|.......|...-| |-.......-| -|---+---|- |-.......-| |-...|.......|..| |..---------..-| |---+---| |-.......-| |---+---| |-..---------..| |.............| |...|-----|-.........-|-----|...| |.............| --------------- |.........|...........|.........| --------------- -------...|-.........-|...------- |....|-.......-|....| ---...|---+---|...--- |...............| ----------------- ENDMAP # Rider locations RANDOM_PLACES:(23,9),(37,14),(51,9) # Where the player will land on arrival TELEPORT_REGION:(29,15,45,15),(30,15,44,15) # Lit courts REGION:(01,05,16,14),lit,"ordinary",filled,true REGION:(31,01,44,10),lit,"ordinary",filled,true REGION:(61,05,74,14),lit,"ordinary",filled,true # A Sanctum for each alignment # The shrines' alignments are shuffled for # each game REGION:(04,07,10,11),lit,"temple" REGION:(34,03,40,07),lit,"temple" REGION:(64,07,70,11),lit,"temple" ALTAR:(07,09),align[0],sanctum ALTAR:(37,05),align[1],sanctum ALTAR:(67,09),align[2],sanctum # Doors DOOR:closed,(11,09) DOOR:closed,(17,09) DOOR:locked,(23,12) DOOR:locked,(37,08) DOOR:closed,(37,11) DOOR:closed,(37,17) DOOR:locked,(51,12) DOOR:locked,(57,09) DOOR:closed,(63,09) # Non diggable and phazeable everywhere NON_DIGGABLE:(00,00,74,19) NON_PASSWALL:(00,00,74,19) # Moloch's horde # West round room MONSTER:'@',"aligned priest",(18,09),noalign,hostile MONSTER:'@',"aligned priest",(19,08),noalign,hostile MONSTER:'@',"aligned priest",(19,09),noalign,hostile MONSTER:'@',"aligned priest",(19,10),noalign,hostile MONSTER:'A',"Angel",(20,09),noalign,hostile MONSTER:'A',"Angel",(20,10),noalign,hostile MONSTER:'&',"Pestilence",place[0],hostile # South-central round room MONSTER:'@',"aligned priest",(36,12),noalign,hostile MONSTER:'@',"aligned priest",(37,12),noalign,hostile MONSTER:'@',"aligned priest",(38,12),noalign,hostile MONSTER:'@',"aligned priest",(36,13),noalign,hostile MONSTER:'A',"Angel",(38,13),noalign,hostile MONSTER:'A',"Angel",(37,13),noalign,hostile MONSTER:'&',"Death",place[1],hostile # East round room MONSTER:'@',"aligned priest",(56,09),noalign,hostile MONSTER:'@',"aligned priest",(55,08),noalign,hostile MONSTER:'@',"aligned priest",(55,09),noalign,hostile MONSTER:'@',"aligned priest",(55,10),noalign,hostile MONSTER:'A',"Angel",(54,09),noalign,hostile MONSTER:'A',"Angel",(54,10),noalign,hostile MONSTER:'&',"Famine",place[2],hostile # # The aligned horde # # We do not know in advance the alignment of the # player. The mpeaceful bit will need resetting # when the level is created. The setting here is # but a place holder. # # West court MONSTER:'@',"aligned priest",(12,07),chaos,hostile MONSTER:'@',"aligned priest",(13,07),chaos,peaceful MONSTER:'@',"aligned priest",(14,07),law,hostile MONSTER:'@',"aligned priest",(12,11),law,peaceful MONSTER:'@',"aligned priest",(13,11),neutral,hostile MONSTER:'@',"aligned priest",(14,11),neutral,peaceful MONSTER:'A',"Angel",(11,05),chaos,hostile MONSTER:'A',"Angel",(12,05),chaos,peaceful MONSTER:'A',"Angel",(13,05),law,hostile MONSTER:'A',"Angel",(11,13),law,peaceful MONSTER:'A',"Angel",(12,13),neutral,hostile MONSTER:'A',"Angel",(13,13),neutral,peaceful # Central court MONSTER:'@',"aligned priest",(32,09),chaos,hostile MONSTER:'@',"aligned priest",(33,09),chaos,peaceful MONSTER:'@',"aligned priest",(34,09),law,hostile MONSTER:'@',"aligned priest",(40,09),law,peaceful MONSTER:'@',"aligned priest",(41,09),neutral,hostile MONSTER:'@',"aligned priest",(42,09),neutral,peaceful MONSTER:'A',"Angel",(31,08),chaos,hostile MONSTER:'A',"Angel",(32,08),chaos,peaceful MONSTER:'A',"Angel",(31,09),law,hostile MONSTER:'A',"Angel",(42,08),law,peaceful MONSTER:'A',"Angel",(43,08),neutral,hostile MONSTER:'A',"Angel",(43,09),neutral,peaceful # East court MONSTER:'@',"aligned priest",(60,07),chaos,hostile MONSTER:'@',"aligned priest",(61,07),chaos,peaceful MONSTER:'@',"aligned priest",(62,07),law,hostile MONSTER:'@',"aligned priest",(60,11),law,peaceful MONSTER:'@',"aligned priest",(61,11),neutral,hostile MONSTER:'@',"aligned priest",(62,11),neutral,peaceful MONSTER:'A',"Angel",(61,05),chaos,hostile MONSTER:'A',"Angel",(62,05),chaos,peaceful MONSTER:'A',"Angel",(63,05),law,hostile MONSTER:'A',"Angel",(61,13),law,peaceful MONSTER:'A',"Angel",(62,13),neutral,hostile MONSTER:'A',"Angel",(63,13),neutral,peaceful # # Assorted nasties MONSTER:'L',random,random,hostile MONSTER:'L',random,random,hostile MONSTER:'L',random,random,hostile MONSTER:'V',random,random,hostile MONSTER:'V',random,random,hostile MONSTER:'V',random,random,hostile MONSTER:'D',random,random,hostile MONSTER:'D',random,random,hostile MONSTER:'D',random,random,hostile slashem-0.0.7E7F3/dat/Healer.des0000664000076400007640000002621510545462317014327 0ustar aliali# 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. # # The "start" level for the quest. # # Here you meet your (besieged) class leader, Hippocrates # and receive your quest assignment. # MAZE: "Hea-strt",' ' FLAGS: noteleport,hardfloor GEOMETRY:center,center MAP PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP PPPP........PPPP.....PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP.P..PPPPP......PPPPPPPP PPP..........PPPP...PPPPP.........................PPPP..PPPPP........PPPPPPP PP............PPPPPPPP..............................PPP...PPPP......PPPPPPPP P.....PPPPPPPPPPPPPPP................................PPPPPPPPPPPPPPPPPPPPPPP PPPP....PPPPPPPPPPPP...................................PPPPP.PPPPPPPPPPPPPPP PPPP........PPPPP.........-----------------------........PP...PPPPPPP.....PP PPP............PPPPP....--|.|......S..........S.|--.....PPPP.PPPPPPP.......P PPPP..........PPPPP.....|.S.|......-----------|S|.|......PPPPPP.PPP.......PP PPPPPP......PPPPPP......|.|.|......|...|......|.|.|.....PPPPPP...PP.......PP PPPPPPPPPPPPPPPPPPP.....+.|.|......S.\.S......|.|.+......PPPPPP.PPPP.......P PPP...PPPPP...PPPP......|.|.|......|...|......|.|.|.......PPPPPPPPPPP.....PP PP.....PPP.....PPP......|.|S|-----------......|.S.|......PPPPPPPPPPPPPPPPPPP PPP..PPPPP...PPPP.......--|.S..........S......|.|--.....PPPPPPPPP....PPPPPPP PPPPPPPPPPPPPPPP..........-----------------------..........PPPPP..........PP PPPPPPPPPPPPPPPPP........................................PPPPPP............P PPP.............PPPP...................................PPP..PPPP..........PP PP...............PPPPP................................PPPP...PPPP........PPP PPP.............PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP....PPPPPP PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP ENDMAP # Dungeon Description REGION:(00,00,75,19),lit,"ordinary" # Stairs STAIR:(37,9),down # Portal arrival point BRANCH:(04,12,04,12),(0,0,0,0) # altar for the Temple ALTAR:(32,09),neutral,altar # Doors DOOR:locked,(24,10) DOOR:closed,(26,08) DOOR:closed,(27,12) DOOR:locked,(28,13) DOOR:closed,(35,07) DOOR:locked,(35,10) DOOR:locked,(39,10) DOOR:closed,(39,13) DOOR:locked,(46,07) DOOR:closed,(47,08) DOOR:closed,(48,12) DOOR:locked,(50,10) # Hippocrates MONSTER:'@',"Hippocrates",(37,10) # The treasure of Hippocrates OBJECT:'(',"chest",(37,10) # intern guards for the audience chamber MONSTER:'@',"attendant",(29,08) MONSTER:'@',"attendant",(29,09) MONSTER:'@',"attendant",(29,10) MONSTER:'@',"attendant",(29,11) MONSTER:'@',"attendant",(40,09) MONSTER:'@',"attendant",(40,10) MONSTER:'@',"attendant",(40,11) MONSTER:'@',"attendant",(40,13) # Non diggable walls NON_DIGGABLE:(00,00,75,19) # Random traps TRAP:random,random TRAP:random,random TRAP:random,random TRAP:random,random TRAP:random,random TRAP:random,random # Monsters on siege duty. MONSTER: 'r',"rabid rat",random MONSTER: 'r',"rabid rat",random MONSTER: 'r',"rabid rat",random MONSTER: 'r',"rabid rat",random MONSTER: 'r',"rabid rat",random MONSTER: 'r',"rabid rat",random MONSTER: 'r',"rabid rat",random MONSTER: 'r',"rabid rat",random MONSTER: 'r',"rabid rat",random MONSTER: 'r',"rabid rat",random MONSTER: ';',"giant eel",random MONSTER: ';',"shark",random MONSTER: ';', random, random MONSTER: 'D',random,random,hostile MONSTER: 'D',random,random,hostile MONSTER: 'D',random,random,hostile MONSTER: 'D',random,random,hostile MONSTER: 'D',random,random,hostile MONSTER: 'S',random,random,hostile MONSTER: 'S',random,random,hostile MONSTER: 'S',random,random,hostile MONSTER: 'S',random,random,hostile MONSTER: 'S',random,random,hostile # # The "locate" level for the quest. # # Here you have to find the Temple of Coeus to go # further towards your assigned quest. # MAZE: "Hea-loca",' ' FLAGS: hardfloor # INIT_MAP: '.' , 'P', true , true , lit , false GEOMETRY:center,center MAP PPPPPPPPPPPPP.......PPPPPPPPPPP PPPPPPPP...............PPPPPPPP PPPP.....-------------...PPPPPP PPPPP....|.S.........|....PPPPP PPP......+.|.........|...PPPPPP PPP......+.|.........|..PPPPPPP PPPP.....|.S.........|..PPPPPPP PPPPP....-------------....PPPPP PPPPPPPP...............PPPPPPPP PPPPPPPPPPP........PPPPPPPPPPPP ENDMAP # Dungeon Description REGION:(00,00,30,09),lit,"ordinary" REGION:(12,03,20,06),lit,"temple" # Doors DOOR:closed,(09,04) DOOR:closed,(09,05) DOOR:locked,(11,03) DOOR:locked,(11,06) # Stairs STAIR:(04,04),up STAIR:(20,06),down # Non diggable walls NON_DIGGABLE:(11,02,21,07) # Altar in the temple. ALTAR:(13,05), chaos, shrine # Objects OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,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:'r',"rabid rat",random MONSTER:'r',"rabid rat",random MONSTER:'r',"rabid rat",random MONSTER:'r',"rabid rat",random MONSTER:'r',"rabid rat",random MONSTER:'r',"rabid rat",random MONSTER:'r',"rabid rat",random MONSTER:'r',"rabid rat",random MONSTER:'r',random,random,hostile MONSTER:';',"giant eel",random MONSTER:';',"giant eel",random MONSTER:';',"giant eel",random MONSTER:';',"giant eel",random MONSTER:';',"giant eel",random MONSTER:';',"electric eel",random MONSTER:';',"electric eel",random MONSTER:';',"kraken",random MONSTER:';',"shark",random MONSTER:';',"shark",random MONSTER:';',random, random,hostile MONSTER:';',random, random,hostile MONSTER: 'D',random,random,hostile MONSTER: 'D',random,random,hostile MONSTER: 'D',random,random,hostile MONSTER: 'D',random,random,hostile MONSTER: 'D',random,random,hostile MONSTER: 'S',random,random,hostile MONSTER: 'S',random,random,hostile MONSTER: 'S',random,random,hostile MONSTER: 'S',random,random,hostile MONSTER: 'S',random,random,hostile MONSTER: 'S',random,random,hostile MONSTER: 'S',random,random,hostile MONSTER: 'S',random,random,hostile MONSTER: 'S',random,random,hostile # # The "goal" level for the quest. # # Here you meet Cyclops your nemesis monster. You have to # defeat Cyclops in combat to gain the artifact you have # been assigned to retrieve. # MAZE: "Hea-goal", 'P' # INIT_MAP: '.' , 'P' , false , true , lit , false GEOMETRY:center,center MAP .P....................................PP. PP.......PPPPPPP....PPPPPPP....PPPP...PP. ...PPPPPPP....PPPPPPP.....PPPPPP..PPP...P ...PP..............................PPP... ..PP..............................PP..... ..PP..............................PPP.... ..PPP..............................PP.... .PPP..............................PPPP... ...PP............................PPP...PP ..PPPP...PPPPP..PPPP...PPPPP.....PP...PP. P....PPPPP...PPPP..PPPPP...PPPPPPP...PP.. PPP..................................PPP. ENDMAP # Dungeon Description REGION:(00,00,40,11),lit,"ordinary" # Stairs STAIR:(39,10),up # Non diggable walls NON_DIGGABLE:(00,00,40,11) # Objects OBJECT:')',"quarterstaff",(20,06),blessed,0,"The Staff of Aesculapius" OBJECT:'/',"lightning",(20,06) OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,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:'H',"Cyclops",(20,06),hostile MONSTER:'r',"rabid rat",random MONSTER:'r',"rabid rat",random MONSTER:'r',"rabid rat",random MONSTER:'r',random,random,hostile MONSTER:'r',random,random,hostile MONSTER:';',"giant eel",random MONSTER:';',"giant eel",random MONSTER:';',"giant eel",random MONSTER:';',"giant eel",random MONSTER:';',"giant eel",random MONSTER:';',"giant eel",random MONSTER:';',"electric eel",random MONSTER:';',"electric eel",random MONSTER:';',"shark",random MONSTER:';',"shark",random MONSTER:';',random,random,hostile MONSTER: 'D',random,random,hostile MONSTER: 'D',random,random,hostile MONSTER: 'D',random,random,hostile MONSTER: 'D',random,random,hostile MONSTER: 'D',random,random,hostile MONSTER: 'S',random,random,hostile MONSTER: 'S',random,random,hostile MONSTER: 'S',random,random,hostile MONSTER: 'S',random,random,hostile MONSTER: 'S',random,random,hostile MONSTER: 'S',random,random,hostile MONSTER: 'S',random,random,hostile MONSTER: 'S',random,random,hostile MONSTER: 'S',random,random,hostile MONSTER: 'S',random,random,hostile # # The "fill" levels for the quest. # # These levels are used to fill out any levels not occupied by specific # levels as defined above. "filla" is the upper filler, between the # start and locate levels, and "fillb" the lower between the locate # and goal levels. # MAZE: "Hea-fila" , 'P' INIT_MAP: '.' , 'P' , false , true , lit , false NOMAP # STAIR: random, up STAIR: random, down # OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random # MONSTER: 'r', "rabid rat", random MONSTER: 'r', random, random,hostile MONSTER: 'r', random, random,hostile MONSTER: ';', "giant eel", random MONSTER: ';', "giant eel", random MONSTER: ';', "electric eel", random MONSTER: 'D',random,random,hostile MONSTER: 'D',random,random,hostile MONSTER: 'D',random,random,hostile MONSTER: 'D',random,random,hostile MONSTER: 'S',random,random,hostile MONSTER: 'S',random,random,hostile MONSTER: 'S',random,random,hostile # TRAP: random, random TRAP: random, random TRAP: random, random TRAP: random, random MAZE: "Hea-filb" , 'P' INIT_MAP: '.' , 'P' , false , true , lit , false NOMAP # STAIR: random, up STAIR: random, down # OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random # MONSTER: 'r', "rabid rat", random MONSTER: 'r', "rabid rat", random MONSTER: 'r', random, random,hostile MONSTER: 'r', random, random,hostile MONSTER: ';', "giant eel", random MONSTER: ';', "giant eel", random MONSTER: ';', "giant eel", random MONSTER: ';', "giant eel", random MONSTER: ';', "giant eel", random MONSTER: ';', "electric eel", random MONSTER: ';', "electric eel", random MONSTER: 'D',random,random,hostile MONSTER: 'D',random,random,hostile MONSTER: 'D',random,random,hostile MONSTER: 'D',random,random,hostile MONSTER: 'S',random,random,hostile MONSTER: 'S',random,random,hostile MONSTER: 'S',random,random,hostile # TRAP: random, random TRAP: random, random TRAP: random, random TRAP: random, random slashem-0.0.7E7F3/dat/knox.des0000664000076400007640000000764610545462317014115 0ustar aliali# 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. # MAZE:"knox",' ' FLAGS: noteleport GEOMETRY:center,center MAP ---------------------------------------------------------------------------- | |........|...............................................................| | |........|.................................................------------..| | -------+--.................................................|..........|..| | |........}}}}}}}....................}}}}}}}..........|..........|..| | |........}-----}....................}-----}..........--+--+--...|..| | ---........}|...|}}}}}}}}}}}}}}}}}}}}}}|...|}.................|...|..| | |..........}---S------------------------S---}.................|...|..| | |..........}}}|...............|..........|}}}.................+...|..| | -------..........}|...............S..........|}...................|...|..| | |.....|..........}|...............|......\...S}...................|...|..| | |.....+........}}}|...............|..........|}}}.................+...|..| | |.....|........}---S------------------------S---}.................|...|..| | |.....|........}|...|}}}}}}}}}}}}}}}}}}}}}}|...|}.................|...|..| | |..-S----......}-----}....................}-----}..........--+--+--...|..| | |..|....|......}}}}}}}....................}}}}}}}..........|..........|..| | |..|....|..................................................|..........|..| | -----------................................................------------..| | |..............................................................| ---------------------------------------------------------------------------- ENDMAP # Non diggable walls NON_DIGGABLE:(00,00,75,19) # Portal arrival point BRANCH:(08,16,08,16),(0,0,0,0) # Throne room, with Croesus on the throne REGION:(37,08,46,11),lit,"throne" MONSTER:'@',"Croesus",(43,10),hostile # The Vault # Using unfilled morgue for # identification in mkmaze.c REGION:(21,08,35,11),lit,"morgue",unfilled # Corner towers REGION:(19,06,21,06),lit,"ordinary" REGION:(46,06,48,06),lit,"ordinary" REGION:(19,13,21,13),lit,"ordinary" REGION:(46,13,48,13),lit,"ordinary" # A welcoming committee REGION:(03,10,07,13),lit,"zoo",filled,true # arrival chamber; needs to be a real room to control migrating monsters, # and `unfilled' is a kludge to force an ordinary room to remain a room REGION:(06,15,09,16),unlit,"ordinary",unfilled # Barracks REGION:(62,03,71,04),lit,"barracks",filled,true # Doors DOOR:closed,(06,14) DOOR:closed,(09,03) DOOR:open,(63,05) DOOR:open,(66,05) DOOR:open,(68,08) DOOR:locked,(08,11) DOOR:open,(68,11) DOOR:closed,(63,14) DOOR:closed,(66,14) # Soldiers guarding the fort MONSTER:'@',"soldier",(12,14) MONSTER:'@',"soldier",(12,13) MONSTER:'@',"soldier",(11,10) MONSTER:'@',"soldier",(13,02) MONSTER:'@',"soldier",(14,03) MONSTER:'@',"soldier",(20,02) MONSTER:'@',"soldier",(30,02) MONSTER:'@',"soldier",(40,02) MONSTER:'@',"soldier",(30,16) MONSTER:'@',"soldier",(32,16) MONSTER:'@',"soldier",(40,16) MONSTER:'@',"soldier",(54,16) MONSTER:'@',"soldier",(54,14) MONSTER:'@',"soldier",(54,13) MONSTER:'@',"soldier",(57,10) MONSTER:'@',"soldier",(57,09) MONSTER:'@',"lieutenant",(15,08) # Four dragons guarding each side MONSTER:'D',random,(18,09) MONSTER:'D',random,(49,10) MONSTER:'D',random,(33,05) MONSTER:'D',random,(33,14) # Eels in the moat MONSTER:';',"giant eel",(17,08) MONSTER:';',"giant eel",(17,11) MONSTER:';',"giant eel",(48,08) MONSTER:';',"giant eel",(48,11) # The corner rooms treasures OBJECT:'*',"diamond",(19,06) OBJECT:'*',"diamond",(20,06) OBJECT:'*',"diamond",(21,06) OBJECT:'*',"emerald",(19,13) OBJECT:'*',"emerald",(20,13) OBJECT:'*',"emerald",(21,13) OBJECT:'*',"ruby",(46,06) OBJECT:'*',"ruby",(47,06) OBJECT:'*',"ruby",(48,06) OBJECT:'*',"amethyst",(46,13) OBJECT:'*',"amethyst",(47,13) OBJECT:'*',"amethyst",(48,13) slashem-0.0.7E7F3/dat/license0000664000076400007640000001141310545462317013771 0ustar aliali NETHACK GENERAL PUBLIC LICENSE (Copyright 1989 M. Stephenson) (Based on the BISON general public license, copyright 1988 Richard M. Stallman) Everyone is permitted to copy and distribute verbatim copies of this license, but changing it is not allowed. You can also use this wording to make the terms for other programs. The license agreements of most software companies keep you at the mercy of those companies. By contrast, our general public license is intended to give everyone the right to share NetHack. To make sure that you get the rights we want you to have, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. Hence this license agreement. Specifically, we want to make sure that you have the right to give away copies of NetHack, that you receive source code or else can get it if you want it, that you can change NetHack or use pieces of it in new free programs, and that you know you can do these things. To make sure that everyone has such rights, we have to forbid you to deprive anyone else of these rights. For example, if you distribute copies of NetHack, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must tell them their rights. Also, for our own protection, we must make certain that everyone finds out that there is no warranty for NetHack. If NetHack is modified by someone else and passed on, we want its recipients to know that what they have is not what we distributed. Therefore we (Mike Stephenson and other holders of NetHack copyrights) make the following terms which say what you must do to be allowed to distribute or change NetHack. COPYING POLICIES 1. You may copy and distribute verbatim copies of NetHack source code as you receive it, in any medium, provided that you keep intact the notices on all files that refer to copyrights, to this License Agreement, and to the absence of any warranty; and give any other recipients of the NetHack program a copy of this License Agreement along with the program. 2. You may modify your copy or copies of NetHack or any portion of it, and copy and distribute such modifications under the terms of Paragraph 1 above (including distributing this License Agreement), provided that you also do the following: a) cause the modified files to carry prominent notices stating that you changed the files and the date of any change; and b) cause the whole of any work that you distribute or publish, that in whole or in part contains or is a derivative of NetHack or any part thereof, to be licensed at no charge to all third parties on terms identical to those contained in this License Agreement (except that you may choose to grant more extensive warranty protection to some or all third parties, at your option) c) You may charge a distribution fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 3. You may copy and distribute NetHack (or a portion or derivative of it, under Paragraph 2) in object code or executable form under the terms of Paragraphs 1 and 2 above provided that you also do one of the following: a) accompany it with the complete machine-readable source code, which must be distributed under the terms of Paragraphs 1 and 2 above; or, b) accompany it with full information as to how to obtain the complete machine-readable source code from an appropriate archive site. (This alternative is allowed only for noncommercial distribution.) For these purposes, complete source code means either the full source distribution as originally released over Usenet or updated copies of the files in this distribution used to create the object code or executable. 4. You may not copy, sublicense, distribute or transfer NetHack except as expressly provided under this License Agreement. Any attempt otherwise to copy, sublicense, distribute or transfer NetHack is void and your rights to use the program under this License agreement shall be automatically terminated. However, parties who have received computer software programs from you with this License Agreement will not have their licenses terminated so long as such parties remain in full compliance. Stated plainly: You are permitted to modify NetHack, or otherwise use parts of NetHack, provided that you comply with the conditions specified above; in particular, your modified NetHack or program containing parts of NetHack must remain freely available as provided in this License Agreement. In other words, go ahead and share NetHack, but don't try to stop anyone else from sharing it farther. slashem-0.0.7E7F3/dat/nymph.des0000664000076400007640000000305710545462317014261 0ustar aliali# # Nymph level # LEVEL: "nymph" RANDOM_MONSTERS: 'n' ROOM: "ordinary" , unlit, random, random, (12,7) NAME: "central" OBJECT:'(',"chest",random OBJECT:'(',"chest",random OBJECT:'(',"chest",random OBJECT:'(',"chest",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 OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random OBJECT: random, random, random MONSTER: 'n', random, random, hostile MONSTER: 'n', random, random, hostile MONSTER: 'n', random, random, hostile MONSTER: 'n', random, random, hostile MONSTER: 'n', random, random, hostile MONSTER: 'n', "Aphrodite", random, hostile ROOM: "ordinary" , random, random, random, random STAIR: random, up OBJECT: random,random,random MONSTER: 'n', random, random, hostile ROOM: "ordinary" , random, random, random, random STAIR: random, down OBJECT: random, random, random TRAP: random, random MONSTER: 'n', random, random, hostile ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random OBJECT: random, random, random MONSTER: 'n', random, random, hostile ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random TRAP: random, random MONSTER: 'n', random, random, hostile ROOM: "ordinary" , random, random, random, random OBJECT: random, random, random TRAP: random, random MONSTER: 'n', random, random, hostile RANDOM_CORRIDORS slashem-0.0.7E7F3/dat/sokoban.des0000664000076400007640000010161010545462317014554 0ustar aliali# SCCS Id: @(#)sokoban.des 3.4 1999/03/15 # $Id: sokoban.des,v 1.4 2003/05/13 18:26:18 j_ali Exp $ # Copyright (c) 1998-1999 by Kevin Hugo # Copyright (c) 2002 by Pasi Kallinen # NetHack may be freely redistributed. See license for details. # # In case you haven't played the game Sokoban, you'll learn # quickly. This branch isn't particularly difficult, just time # consuming. Some players may wish to skip this branch. # # The following actions are currently permitted without penalty: # Carrying or throwing a boulder already in inventory # (player or nonplayer). # Teleporting boulders. # Digging in the floor. # The following actions are permitted, but with a luck penalty: # Breaking boulders. # Stone-to-fleshing boulders. # Creating new boulders (e.g., with a scroll of earth). # Jumping. # Being pulled by a thrown iron ball. # Hurtling through the air from Newton's 3rd law. # Squeezing past boulders when naked or as a giant. # These actions are not permitted: # Moving diagonally between two boulders and/or walls. # Pushing a boulder diagonally. # Picking up boulders (player or nonplayer). # Digging or walking through walls. # Teleporting within levels or between levels of this branch. # Using cursed potions of gain level. # Escaping a pit/hole (e.g., by flying, levitation, or # passing a dexterity check). # Bones files are not permitted. # # The following Sokoban levels heavily modified for NetHack by Pasi Kallinen: # soko4-3, soko4-4, soko4-5 # soko3-3, soko3-4, soko3-5, soko3-6, soko3-7 # soko2-3, soko2-4, soko2-5, soko2-6, soko2-7 # soko1-3, soko1-4 # The original authors are listed just before the maps. ### Bottom (first) level of Sokoban ### MAZE:"soko4-1",' ' FLAGS:noteleport,hardfloor GEOMETRY:center,center #12345678901234567890123456789012345678901234567890 MAP ------ ----- |....| |...| |....----...| |...........| |..|-|.|-|..| ---------|.--- |......|.....| |..----|.....| --.| |.....| |.|---|.....| |...........| |..|--------- ---- ENDMAP BRANCH:(06,04,06,04),(0,0,0,0) STAIR:(06,06),up REGION:(00,00,13,12),lit,"ordinary" NON_DIGGABLE:(00,00,13,12) NON_PASSWALL:(00,00,13,12) # Boulders OBJECT:'`',"boulder",(02,02) OBJECT:'`',"boulder",(02,03) # OBJECT:'`',"boulder",(10,02) OBJECT:'`',"boulder",(09,03) OBJECT:'`',"boulder",(10,04) # OBJECT:'`',"boulder",(08,07) OBJECT:'`',"boulder",(09,08) OBJECT:'`',"boulder",(09,09) OBJECT:'`',"boulder",(08,10) OBJECT:'`',"boulder",(10,10) # Traps TRAP:"pit",(03,06) TRAP:"pit",(04,06) TRAP:"pit",(05,06) TRAP:"pit",(02,08) TRAP:"pit",(02,09) TRAP:"pit",(04,10) TRAP:"pit",(05,10) TRAP:"pit",(06,10) TRAP:"pit",(07,10) # A little help OBJECT:'?',"earth",(02,11) OBJECT:'?',"earth",(03,11) # Random objects OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'=',random,random OBJECT:'/',random,random MAZE:"soko4-2",' ' FLAGS:noteleport,hardfloor GEOMETRY:center,center #12345678901234567890123456789012345678901234567890 MAP -------- ------ |.|....|-|....| |.|-..........| |.||....|.....| |.||....|.....| |.|-----|.----- |.| |......| |.-----|......| |.............| |..|---|......| ---- -------- ENDMAP BRANCH:(03,01,03,01),(0,0,0,0) STAIR:(01,01),up REGION:(00,00,14,10),lit,"ordinary" NON_DIGGABLE:(00,00,14,10) NON_PASSWALL:(00,00,14,10) # Boulders OBJECT:'`',"boulder",(05,02) OBJECT:'`',"boulder",(06,02) OBJECT:'`',"boulder",(06,03) OBJECT:'`',"boulder",(07,03) # OBJECT:'`',"boulder",(09,05) OBJECT:'`',"boulder",(10,03) OBJECT:'`',"boulder",(11,02) OBJECT:'`',"boulder",(12,03) # OBJECT:'`',"boulder",(07,08) OBJECT:'`',"boulder",(08,08) OBJECT:'`',"boulder",(09,08) OBJECT:'`',"boulder",(10,08) # Traps TRAP:"pit",(01,02) TRAP:"pit",(01,03) TRAP:"pit",(01,04) TRAP:"pit",(01,05) TRAP:"pit",(01,06) TRAP:"pit",(01,07) TRAP:"pit",(03,08) TRAP:"pit",(04,08) TRAP:"pit",(05,08) TRAP:"pit",(06,08) # A little help OBJECT:'?',"earth",(01,09) OBJECT:'?',"earth",(02,09) # Random objects OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'=',random,random OBJECT:'/',random,random MAZE:"soko4-3",' ' FLAGS:noteleport, hardfloor GEOMETRY:center,center # "J Franklin Mentzer " MAP ------- |..|..| -------- ------.....--- ---......--- |......---...| |..........| |.|.|......|.--|........|.--- |.|.--..|..|...-F-F-F-F--...| |.......|...................| |.|.--..|..|...-F-F-F-F--...| |.|.|......|.--|........|.--- |......---...| |..........| ------.....--- ---......--- |..|..| -------- ------- ENDMAP BRANCH:(13,6,13,6),(0,0,0,0) STAIR:(26,6), up REGION:(00,00,28,12),lit,"ordinary" NON_DIGGABLE:(00,00,28,12) NON_PASSWALL:(00,00,28,12) OBJECT:'?',"earth",(16,3) OBJECT:'?',"earth",(16,9) OBJECT:'`',"boulder",(8,2) OBJECT:'`',"boulder",(8,4) OBJECT:'`',"boulder",(3,5) OBJECT:'`',"boulder",(6,6) OBJECT:'`',"boulder",(7,6) OBJECT:'`',"boulder",(9,6) OBJECT:'`',"boulder",(10,6) OBJECT:'`',"boulder",(3,7) OBJECT:'`',"boulder",(8,8) OBJECT:'`',"boulder",(8,10) TRAP:"pit",(15,6) TRAP:"pit",(16,6) TRAP:"pit",(17,6) TRAP:"pit",(18,6) TRAP:"pit",(19,6) TRAP:"pit",(20,6) TRAP:"pit",(21,6) TRAP:"pit",(22,6) TRAP:"pit",(23,6) OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'=',random,random OBJECT:'/',random,random MAZE:"soko4-4",' ' FLAGS:noteleport, hardfloor GEOMETRY:center,center # "Joseph L Traub" MAP ----------------- |.......|...--..| |.-----.|.......| |.---...|.......| |...........--..| |......--...||..| |FFFFF-------|.-| |...........|-..| |.....-------...| |..L............| |.....-------...| |.....| |...| ------- ----- ENDMAP BRANCH:(1,5,1,5),(0,0,0,0) STAIR:(11,7), up REGION:(00,00,16,12),lit,"ordinary" NON_DIGGABLE:(00,00,16,12) NON_PASSWALL:(00,00,16,12) OBJECT:'?',"earth",(14,1) OBJECT:'?',"earth",(15,1) OBJECT:'`',"boulder",(12,2) OBJECT:'`',"boulder",(6,3) OBJECT:'`',"boulder",(12,3) OBJECT:'`',"boulder",(6,4) OBJECT:'`',"boulder",(7,4) OBJECT:'`',"boulder",(14,4) OBJECT:'`',"boulder",(14,7) OBJECT:'`',"boulder",(2,9) OBJECT:'`',"boulder",(12,9) OBJECT:'`',"boulder",(13,9) OBJECT:'`',"boulder",(14,10) TRAP:"pit",(6,7) TRAP:"pit",(7,7) TRAP:"pit",(8,7) TRAP:"pit",(9,7) TRAP:"pit",(10,7) TRAP:"pit",(6,9) TRAP:"pit",(7,9) TRAP:"pit",(8,9) TRAP:"pit",(9,9) TRAP:"pit",(10,9) OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'=',random,random OBJECT:'/',random,random MAZE:"soko4-5",' ' FLAGS:noteleport, hardfloor GEOMETRY:center,center # "Joseph L Traub" MAP ----------- |.........| |.........| ------ |...-----.| |....-----....--.| |................| |-.|.......--.--.| |-.|---.----|.||.| |..------...|.--.-- |...........F.....| ---------...|.....| ----------- ENDMAP BRANCH:(7,7,7,7),(0,0,0,0) STAIR:(10,9), up REGION:(00,00,18,11),lit,"ordinary" NON_DIGGABLE:(00,00,18,11) NON_PASSWALL:(00,00,18,11) OBJECT:'?',"earth",(1,8) OBJECT:'?',"earth",(1,9) OBJECT:'`',"boulder",(12,2) OBJECT:'`',"boulder",(14,2) OBJECT:'`',"boulder",(9,3) OBJECT:'`',"boulder",(11,4) OBJECT:'`',"boulder",(16,4) OBJECT:'`',"boulder",(8,5) OBJECT:'`',"boulder",(10,5) OBJECT:'`',"boulder",(14,9) TRAP:"pit",(2,6) TRAP:"pit",(2,7) TRAP:"pit",(4,9) TRAP:"pit",(5,9) TRAP:"pit",(6,9) TRAP:"pit",(7,9) TRAP:"pit",(8,9) OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'=',random,random OBJECT:'/',random,random ### Second level ### MAZE:"soko3-1",' ' FLAGS:noteleport GEOMETRY:center,center #12345678901234567890123456789012345678901234567890 MAP ----------- ----------- |....|....|-- |.........| |....|......| |.........| |.........|-- |.........| |....|....| |.........| |-.--------- |.........| |....|.....| |.........| |....|.....| |.........| |..........| |.........| |....|.....|---------------+| |....|......................| ----------------------------- ENDMAP STAIR:(11,02),down STAIR:(23,04),up DOOR:locked,(27,09) REGION:(00,00,28,11),lit,"ordinary" NON_DIGGABLE:(00,00,28,11) NON_PASSWALL:(00,00,28,11) # Boulders OBJECT:'`',"boulder",(03,02) OBJECT:'`',"boulder",(04,02) # OBJECT:'`',"boulder",(06,02) OBJECT:'`',"boulder",(06,03) OBJECT:'`',"boulder",(07,02) # OBJECT:'`',"boulder",(03,06) OBJECT:'`',"boulder",(02,07) OBJECT:'`',"boulder",(03,07) OBJECT:'`',"boulder",(03,08) OBJECT:'`',"boulder",(02,09) OBJECT:'`',"boulder",(03,09) OBJECT:'`',"boulder",(04,09) # OBJECT:'`',"boulder",(06,07) OBJECT:'`',"boulder",(06,09) OBJECT:'`',"boulder",(08,07) OBJECT:'`',"boulder",(08,10) OBJECT:'`',"boulder",(09,08) OBJECT:'`',"boulder",(09,09) OBJECT:'`',"boulder",(10,07) OBJECT:'`',"boulder",(10,10) # Traps TRAP:"hole",(12,10) TRAP:"hole",(13,10) TRAP:"hole",(14,10) TRAP:"hole",(15,10) TRAP:"hole",(16,10) TRAP:"hole",(17,10) TRAP:"hole",(18,10) TRAP:"hole",(19,10) TRAP:"hole",(20,10) TRAP:"hole",(21,10) TRAP:"hole",(22,10) TRAP:"hole",(23,10) TRAP:"hole",(24,10) TRAP:"hole",(25,10) TRAP:"hole",(26,10) # Random objects OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'=',random,random OBJECT:'/',random,random MAZE:"soko3-2",' ' FLAGS:noteleport GEOMETRY:center,center #12345678901234567890123456789012345678901234567890 MAP ---- ----------- -|..|------- |.........| |..........| |.........| |..-----.-.| |.........| |..|...|...| |.........| |.........-| |.........| |.......|..| |.........| |.----..--.| |.........| |........|.-- |.........| |.---.-.....------------+| |...|...-................| |.........---------------- ----|..|..| ------- ENDMAP STAIR:(03,01),down STAIR:(20,04),up DOOR:locked,(24,09) REGION:(00,00,25,13),lit,"ordinary" NON_DIGGABLE:(00,00,25,13) NON_PASSWALL:(00,00,25,13) # Boulders OBJECT:'`',"boulder",(02,03) OBJECT:'`',"boulder",(08,03) OBJECT:'`',"boulder",(09,04) OBJECT:'`',"boulder",(02,05) OBJECT:'`',"boulder",(04,05) OBJECT:'`',"boulder",(09,05) OBJECT:'`',"boulder",(02,06) OBJECT:'`',"boulder",(05,06) OBJECT:'`',"boulder",(06,07) OBJECT:'`',"boulder",(03,08) OBJECT:'`',"boulder",(07,08) OBJECT:'`',"boulder",(05,09) OBJECT:'`',"boulder",(10,09) OBJECT:'`',"boulder",(07,10) OBJECT:'`',"boulder",(10,10) OBJECT:'`',"boulder",(03,11) # Traps TRAP:"hole",(12,10) TRAP:"hole",(13,10) TRAP:"hole",(14,10) TRAP:"hole",(15,10) TRAP:"hole",(16,10) TRAP:"hole",(17,10) TRAP:"hole",(18,10) TRAP:"hole",(19,10) TRAP:"hole",(20,10) TRAP:"hole",(21,10) TRAP:"hole",(22,10) TRAP:"hole",(23,10) # Random objects OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'=',random,random OBJECT:'/',random,random MAZE:"soko3-3",' ' FLAGS:noteleport GEOMETRY:center,center # "Thinking Rabbit" MAP ----------------- |........F......| |..--....F......| --.|.....F......| |.---------.--.| |...........||.| |..------...--.-- ---- |.......| ---.----.-- |........| |....----- --...| ----- ENDMAP STAIR:(16,7), down STAIR:(4,3), up REGION:(00,00,17,12),lit,"ordinary" NON_DIGGABLE:(00,00,17,12) NON_PASSWALL:(00,00,17,12) OBJECT:'`',"boulder",(12,2) OBJECT:'`',"boulder",(14,2) OBJECT:'`',"boulder",(11,3) OBJECT:'`',"boulder",(13,3) OBJECT:'`',"boulder",(11,6) OBJECT:'`',"boulder",(12,6) OBJECT:'`',"boulder",(11,7) OBJECT:'`',"boulder",(9,9) OBJECT:'`',"boulder",(11,9) OBJECT:'`',"boulder",(10,10) TRAP:"hole",(3,1) TRAP:"hole",(4,1) TRAP:"hole",(2,3) TRAP:"hole",(2,4) TRAP:"hole",(4,5) TRAP:"hole",(5,5) TRAP:"hole",(6,5) TRAP:"hole",(7,5) TRAP:"hole",(8,5) TRAP:"hole",(9,5) OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'=',random,random OBJECT:'/',random,random MAZE:"soko3-4",' ' FLAGS:noteleport GEOMETRY:center,center # "Thinking Rabbit" MAP ---- ---|..---- |..|.....|--- ---- |.....|..|..| |..----.|...|.....| |...........|--...| |.--F--...|.|....-- |.|...|-.-|......| |.F...+...|......| --.|...|........--- |..--F-----.|.--- |.........|...| --------------- ENDMAP STAIR:(12,9), down STAIR:(9,11), up REGION:(00,00,19,12),lit,"ordinary" NON_DIGGABLE:(00,00,19,12) NON_PASSWALL:(00,00,19,12) DOOR:locked,(7,8) OBJECT:'`',"boulder",(14,2) OBJECT:'`',"boulder",(12,3) OBJECT:'`',"boulder",(14,3) OBJECT:'`',"boulder",(17,4) OBJECT:'`',"boulder",(16,5) OBJECT:'`',"boulder",(12,6) OBJECT:'`',"boulder",(16,6) OBJECT:'`',"boulder",(9,7) OBJECT:'`',"boulder",(13,7) OBJECT:'`',"boulder",(14,7) OBJECT:'`',"boulder",(16,8) OBJECT:'`',"boulder",(9,9) OBJECT:'`',"boulder",(13,9) OBJECT:'`',"boulder",(11,10) TRAP:"hole",(5,5) TRAP:"hole",(6,5) TRAP:"hole",(7,5) TRAP:"hole",(2,6) TRAP:"hole",(2,7) TRAP:"hole",(2,8) TRAP:"hole",(5,8) TRAP:"hole",(2,9) TRAP:"hole",(3,11) TRAP:"hole",(4,11) TRAP:"hole",(5,11) TRAP:"hole",(6,11) TRAP:"hole",(7,11) TRAP:"hole",(8,11) OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'=',random,random OBJECT:'/',random,random MAZE:"soko3-5",' ' FLAGS:noteleport GEOMETRY:center,center # "Thinking Rabbit" MAP -------- |......| |......----- |---.......| |..--.|....| |.....|.|.----- |.--..........| --.||..|...|...| |..------------- |.........| ----------- ENDMAP STAIR:(6,5), down STAIR:(9,9), up REGION:(00,00,15,10),lit,"ordinary" NON_DIGGABLE:(00,00,15,10) NON_PASSWALL:(00,00,15,10) OBJECT:'?',"earth",(14,6) OBJECT:'?',"earth",(14,7) OBJECT:'`',"boulder",(4,2) OBJECT:'`',"boulder",(8,3) OBJECT:'`',"boulder",(6,4) OBJECT:'`',"boulder",(9,4) OBJECT:'`',"boulder",(6,6) OBJECT:'`',"boulder",(8,6) OBJECT:'`',"boulder",(10,6) OBJECT:'`',"boulder",(11,6) TRAP:"hole",(2,6) TRAP:"hole",(2,7) TRAP:"hole",(4,9) TRAP:"hole",(5,9) TRAP:"hole",(6,9) TRAP:"hole",(7,9) TRAP:"hole",(8,9) OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'=',random,random OBJECT:'/',random,random MAZE:"soko3-6",' ' FLAGS:noteleport GEOMETRY:center,center # "Joseph L Traub" MAP ---------------- |...|..|.|.--..| |.|.|..........--- |.|....--FF--....--- |...|..|....|......| --.-|.-|.FF.|......| |.||.|-....--.--.-- |.FF.FL....LF.FF.| |.||.|--..--|.||.| --.--.--|..|-|.||.| |......||..|--.--.-- |......-|..|-......| |.......|..|..---..| -----..............| |.|....|..|...-- --------------- ENDMAP STAIR:(8,1), down STAIR:(10,4), up REGION:(00,00,19,15),lit,"ordinary" NON_DIGGABLE:(00,00,19,15) NON_PASSWALL:(00,00,19,15) OBJECT:'`',"boulder",(7,2) OBJECT:'`',"boulder",(12,2) OBJECT:'`',"boulder",(14,3) OBJECT:'`',"boulder",(15,4) OBJECT:'`',"boulder",(16,4) OBJECT:'`',"boulder",(2,5) OBJECT:'`',"boulder",(5,5) OBJECT:'`',"boulder",(14,10) OBJECT:'`',"boulder",(17,10) OBJECT:'`',"boulder",(3,11) OBJECT:'`',"boulder",(4,11) OBJECT:'`',"boulder",(2,12) OBJECT:'`',"boulder",(5,12) OBJECT:'`',"boulder",(7,13) OBJECT:'`',"boulder",(11,13) OBJECT:'`',"boulder",(16,13) TRAP:"hole",(8,5) TRAP:"hole",(11,5) TRAP:"hole",(8,6) TRAP:"hole",(9,6) TRAP:"hole",(10,6) TRAP:"hole",(11,6) TRAP:"hole",(8,7) TRAP:"hole",(9,7) TRAP:"hole",(10,7) TRAP:"hole",(11,7) TRAP:"hole",(9,8) TRAP:"hole",(10,8) TRAP:"hole",(9,9) TRAP:"hole",(10,9) TRAP:"hole",(9,10) TRAP:"hole",(10,10) TRAP:"hole",(9,11) TRAP:"hole",(10,11) OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'=',random,random OBJECT:'/',random,random MAZE:"soko3-7",' ' FLAGS:noteleport GEOMETRY:center,center # "Joseph L Traub" MAP --------- ------------|.....+.| |...........|.....|.| |.---.......|.....|.| |...|.......|.....|.| |...|---.---|.....|.| |...--......|.....|.| |...........-------.| ---.--...|..........| |.--...|--------..| |......| ---- ---.---- --- ENDMAP STAIR:(5,11), down STAIR:(15,5), up REGION:(00,00,20,12),lit,"ordinary" NON_DIGGABLE:(00,00,20,12) NON_PASSWALL:(00,00,20,12) DOOR:locked,(18,1) OBJECT:'`',"boulder",(6,3) OBJECT:'`',"boulder",(7,3) OBJECT:'`',"boulder",(6,4) OBJECT:'`',"boulder",(9,4) OBJECT:'`',"boulder",(3,5) OBJECT:'`',"boulder",(8,5) OBJECT:'`',"boulder",(2,6) OBJECT:'`',"boulder",(3,7) OBJECT:'`',"boulder",(4,7) OBJECT:'`',"boulder",(6,7) OBJECT:'`',"boulder",(7,8) OBJECT:'`',"boulder",(8,8) TRAP:"hole",(19,2) TRAP:"hole",(19,3) TRAP:"hole",(19,4) TRAP:"hole",(19,5) TRAP:"hole",(19,6) TRAP:"hole",(19,7) TRAP:"hole",(12,8) TRAP:"hole",(13,8) TRAP:"hole",(14,8) TRAP:"hole",(15,8) TRAP:"hole",(16,8) TRAP:"hole",(17,8) OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'=',random,random OBJECT:'/',random,random ### Third level ### MAZE:"soko2-1",' ' FLAGS:noteleport GEOMETRY:center,center #12345678901234567890123456789012345678901234567890 MAP -------------------- |........|...|.....| |.....-..|.-.|.....| |..|.....|...|.....| |-.|..-..|.-.|.....| |...--.......|.....| |...|...-...-|.....| |...|..|...--|.....| |-..|..|----------+| |..................| |...|..|------------ -------- ENDMAP STAIR:(06,10),down STAIR:(16,04),up DOOR:locked,(18,08) REGION:(00,00,19,11),lit,"ordinary" NON_DIGGABLE:(00,00,19,11) NON_PASSWALL:(00,00,19,11) # Boulders OBJECT:'`',"boulder",(02,02) OBJECT:'`',"boulder",(03,02) # OBJECT:'`',"boulder",(05,03) OBJECT:'`',"boulder",(07,03) OBJECT:'`',"boulder",(07,02) OBJECT:'`',"boulder",(08,02) # OBJECT:'`',"boulder",(10,03) OBJECT:'`',"boulder",(11,03) # OBJECT:'`',"boulder",(02,07) OBJECT:'`',"boulder",(02,08) OBJECT:'`',"boulder",(03,09) # OBJECT:'`',"boulder",(05,07) OBJECT:'`',"boulder",(06,06) # Traps TRAP:"hole",(08,09) TRAP:"hole",(09,09) TRAP:"hole",(10,09) TRAP:"hole",(11,09) TRAP:"hole",(12,09) TRAP:"hole",(13,09) TRAP:"hole",(14,09) TRAP:"hole",(15,09) TRAP:"hole",(16,09) TRAP:"hole",(17,09) # Random objects OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'=',random,random OBJECT:'/',random,random MAZE:"soko2-2",' ' FLAGS:noteleport GEOMETRY:center,center #12345678901234567890123456789012345678901234567890 MAP -------- --|.|....| |........|---------- |.-...-..|.|.......| |...-......|.......| |.-....|...|.......| |....-.--.-|.......| |..........|.......| |.--...|...|.......| |....-.|---|.......| --|....|----------+| |................| ------------------ ENDMAP STAIR:(06,11),down STAIR:(15,06),up DOOR:locked,(18,10) REGION:(00,00,19,12),lit,"ordinary" NON_DIGGABLE:(00,00,19,12) NON_PASSWALL:(00,00,19,12) # Boulders OBJECT:'`',"boulder",(04,02) OBJECT:'`',"boulder",(04,03) OBJECT:'`',"boulder",(05,03) OBJECT:'`',"boulder",(07,03) OBJECT:'`',"boulder",(08,03) OBJECT:'`',"boulder",(02,04) OBJECT:'`',"boulder",(03,04) OBJECT:'`',"boulder",(05,05) OBJECT:'`',"boulder",(06,06) OBJECT:'`',"boulder",(09,06) OBJECT:'`',"boulder",(03,07) OBJECT:'`',"boulder",(04,07) OBJECT:'`',"boulder",(07,07) OBJECT:'`',"boulder",(06,09) OBJECT:'`',"boulder",(05,10) OBJECT:'`',"boulder",(05,11) # Traps TRAP:"hole",(07,11) TRAP:"hole",(08,11) TRAP:"hole",(09,11) TRAP:"hole",(10,11) TRAP:"hole",(11,11) TRAP:"hole",(12,11) TRAP:"hole",(13,11) TRAP:"hole",(14,11) TRAP:"hole",(15,11) TRAP:"hole",(16,11) TRAP:"hole",(17,11) # Random objects OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'=',random,random OBJECT:'/',random,random MAZE:"soko2-3",' ' FLAGS:noteleport GEOMETRY:center,center # "Thinking Rabbit" MAP ------------ -------|..........| |...|..|--------..| |......|..| |.-- --.--..|..-----|.| |.....--...|..|.| |.|....|......|.| |...|.....---.|.| |.....--..---.|.| ---...|.......|.| ---.|...--..|.| |......||....| |.....-----..| ------- ---- ENDMAP STAIR:(8,4), down STAIR:(8,1), up REGION:(00,00,18,13),lit,"ordinary" NON_DIGGABLE:(00,00,18,13) NON_PASSWALL:(00,00,18,13) OBJECT:'`',"boulder",(2,3) OBJECT:'`',"boulder",(5,4) OBJECT:'`',"boulder",(4,5) OBJECT:'`',"boulder",(6,5) OBJECT:'`',"boulder",(9,5) OBJECT:'`',"boulder",(6,6) OBJECT:'`',"boulder",(10,6) OBJECT:'`',"boulder",(3,7) OBJECT:'`',"boulder",(6,7) OBJECT:'`',"boulder",(10,8) OBJECT:'`',"boulder",(5,9) OBJECT:'`',"boulder",(10,9) OBJECT:'`',"boulder",(10,10) OBJECT:'`',"boulder",(7,11) OBJECT:'`',"boulder",(8,11) TRAP:"hole",(9,1) TRAP:"hole",(10,1) TRAP:"hole",(11,1) TRAP:"hole",(12,1) TRAP:"hole",(13,1) TRAP:"hole",(14,1) TRAP:"hole",(15,1) TRAP:"hole",(16,3) TRAP:"hole",(16,4) TRAP:"hole",(16,5) TRAP:"hole",(16,6) TRAP:"hole",(16,7) TRAP:"hole",(16,8) TRAP:"hole",(16,9) TRAP:"hole",(16,10) OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'=',random,random OBJECT:'/',random,random MAZE:"soko2-4",' ' FLAGS:noteleport GEOMETRY:center,center # "Joseph L Traub" MAP ---------- -----|........| ----...-|.-----..| |.......---...|.-- |.............|.| |.|.--------.-|.| |.|.....|.....|.| |.|.....|.|...|.| --.|...|.|.----|.| |..--....|.....|.| |......|.|.......| -----.--.........| |.............| |...---.......| ----- --------- ENDMAP STAIR:(4,4), down STAIR:(10,2), up REGION:(00,00,18,14),lit,"ordinary" NON_DIGGABLE:(00,00,18,14) NON_PASSWALL:(00,00,18,14) OBJECT:'`',"boulder",(4,3) OBJECT:'`',"boulder",(3,4) OBJECT:'`',"boulder",(5,4) OBJECT:'`',"boulder",(7,4) OBJECT:'`',"boulder",(12,4) OBJECT:'`',"boulder",(4,5) OBJECT:'`',"boulder",(6,6) OBJECT:'`',"boulder",(5,7) OBJECT:'`',"boulder",(7,7) OBJECT:'`',"boulder",(6,8) OBJECT:'`',"boulder",(5,10) OBJECT:'`',"boulder",(5,12) TRAP:"hole",(11,1) TRAP:"hole",(12,1) TRAP:"hole",(13,1) TRAP:"hole",(14,1) TRAP:"hole",(15,1) TRAP:"hole",(16,3) TRAP:"hole",(16,4) TRAP:"hole",(16,5) TRAP:"hole",(16,6) TRAP:"hole",(16,7) TRAP:"hole",(16,8) TRAP:"hole",(16,9) OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'=',random,random OBJECT:'/',random,random MAZE:"soko2-5",' ' FLAGS:noteleport GEOMETRY:center,center # "Joseph L Traub" MAP ------------------ ----....|.........+.| |....--.|.........|.| |.......|.........|.| ---.----.|.........|.| |........-F-F-F-F-F-.| |....................| |........--F-F-F-F-..| --.--.--.|...........| |--.....|...........| |.......|...........| |....|..|...........| --------------------- ENDMAP STAIR:(2,8), down STAIR:(11,3), up REGION:(00,00,21,12),lit,"ordinary" NON_DIGGABLE:(00,00,21,12) NON_PASSWALL:(00,00,21,12) DOOR:locked,(19,1) OBJECT:'`',"boulder",(3,3) OBJECT:'`',"boulder",(3,5) OBJECT:'`',"boulder",(7,5) OBJECT:'`',"boulder",(4,6) OBJECT:'`',"boulder",(5,6) OBJECT:'`',"boulder",(7,6) OBJECT:'`',"boulder",(8,6) OBJECT:'`',"boulder",(5,7) OBJECT:'`',"boulder",(8,7) OBJECT:'`',"boulder",(6,9) OBJECT:'`',"boulder",(15,9) OBJECT:'`',"boulder",(16,9) OBJECT:'`',"boulder",(5,10) OBJECT:'`',"boulder",(6,10) TRAP:"hole",(20,2) TRAP:"hole",(20,3) TRAP:"hole",(20,4) TRAP:"hole",(20,5) TRAP:"hole",(9,6) TRAP:"hole",(10,6) TRAP:"hole",(11,6) TRAP:"hole",(12,6) TRAP:"hole",(13,6) TRAP:"hole",(14,6) TRAP:"hole",(15,6) TRAP:"hole",(16,6) TRAP:"hole",(17,6) TRAP:"hole",(18,6) OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'=',random,random OBJECT:'/',random,random MAZE:"soko2-6",' ' FLAGS:noteleport GEOMETRY:center,center # "Thinking Rabbit" MAP --------- |...|...---- |...+......| |...|.|..|.| -----------....|.| |................| |.|.|..--.|.|..|.| |...|.....|....|.| --.|...-------+-|.| --......|....|...|.| |....|..F....F...|.| |......-|....|...|.-- |..-----|....|----..| |..|....+....+......| --------------------- ENDMAP STAIR:(1,13), down STAIR:(4,13), up REGION:(00,00,20,14),lit,"ordinary" NON_DIGGABLE:(00,00,20,14) NON_PASSWALL:(00,00,20,14) DOOR:locked,(12,2) DOOR:locked,(15,8) DOOR:locked,(8,13) DOOR:locked,(13,13) OBJECT:'`',"boulder",(10,2) OBJECT:'`',"boulder",(13,3) OBJECT:'`',"boulder",(18,4) OBJECT:'`',"boulder",(9,5) OBJECT:'`',"boulder",(8,6) OBJECT:'`',"boulder",(7,7) OBJECT:'`',"boulder",(3,8) OBJECT:'`',"boulder",(6,8) OBJECT:'`',"boulder",(5,9) OBJECT:'`',"boulder",(4,10) OBJECT:'`',"boulder",(15,10) OBJECT:'`',"boulder",(3,11) OBJECT:'`',"boulder",(2,12) TRAP:"hole",(18,6) TRAP:"hole",(18,7) TRAP:"hole",(18,8) TRAP:"hole",(18,9) TRAP:"hole",(18,10) TRAP:"hole",(18,11) TRAP:"hole",(5,13) TRAP:"hole",(6,13) TRAP:"hole",(7,13) TRAP:"hole",(14,13) TRAP:"hole",(15,13) TRAP:"hole",(16,13) TRAP:"hole",(17,13) OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'=',random,random OBJECT:'/',random,random MAZE:"soko2-7",' ' FLAGS:noteleport GEOMETRY:center,center # "Thinking Rabbit" MAP ---- ---------|..| ---...|...--..|--- |.....|.......|..| |.|...|...--.....| |.|...|....|..--.| |.|.----.|.--F--.|--- |.|..|--.|..|.|..|..| |.|..|....|.|.|.....| |.........|.|.--F--.-- |.|..---.--.|..|..|..| |.----......F..F.....| |......-----|..|.----- -------- |.--..| |.....| |..---- ---- ENDMAP STAIR:(12,1), down STAIR:(13,7), up REGION:(00,00,21,16),lit,"ordinary" NON_DIGGABLE:(00,00,21,16) NON_PASSWALL:(00,00,21,16) OBJECT:'`',"boulder",(12,2) OBJECT:'`',"boulder",(3,3) OBJECT:'`',"boulder",(4,3) OBJECT:'`',"boulder",(12,3) OBJECT:'`',"boulder",(12,4) OBJECT:'`',"boulder",(8,5) OBJECT:'`',"boulder",(9,5) OBJECT:'`',"boulder",(3,7) OBJECT:'`',"boulder",(6,9) TRAP:"hole",(14,4) TRAP:"hole",(16,5) TRAP:"hole",(16,6) TRAP:"hole",(17,8) TRAP:"hole",(19,9) TRAP:"hole",(18,11) TRAP:"hole",(16,12) TRAP:"hole",(13,13) TRAP:"hole",(15,14) OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'=',random,random OBJECT:'/',random,random ### Top (last) level of Sokoban ### MAZE:"soko1-1",' ' FLAGS:noteleport GEOMETRY:center,center #12345678901234567890123456789012345678901234567890 MAP -------------------------- |........................| |.......|---------------.| -------.------ |.| |...........| |.| |...........| |.| --------.----- |.| |............| |.| |............| |.| -----.-------- ------|.| |..........| --|.....|.| |..........| |.+.....|.| |.........|- |-|.....|.| -------.---- |.+.....+.| |........| |-|.....|-- |........| |.+.....| |...|----- --|.....| ----- ------- ENDMAP RANDOM_PLACES:(16,11),(16,13),(16,15) STAIR:(01,01),down REGION:(00,00,25,17),lit,"ordinary" NON_DIGGABLE:(00,00,25,17) NON_PASSWALL:(00,00,25,17) # Boulders OBJECT:'`',"boulder",(03,05) OBJECT:'`',"boulder",(05,05) OBJECT:'`',"boulder",(07,05) OBJECT:'`',"boulder",(09,05) OBJECT:'`',"boulder",(11,05) # OBJECT:'`',"boulder",(04,07) OBJECT:'`',"boulder",(04,08) OBJECT:'`',"boulder",(06,07) OBJECT:'`',"boulder",(09,07) OBJECT:'`',"boulder",(11,07) # OBJECT:'`',"boulder",(03,12) OBJECT:'`',"boulder",(04,10) OBJECT:'`',"boulder",(05,12) OBJECT:'`',"boulder",(06,10) OBJECT:'`',"boulder",(07,11) OBJECT:'`',"boulder",(08,10) OBJECT:'`',"boulder",(09,12) # OBJECT:'`',"boulder",(03,14) # Traps TRAP:"hole",(08,01) TRAP:"hole",(09,01) TRAP:"hole",(10,01) TRAP:"hole",(11,01) TRAP:"hole",(12,01) TRAP:"hole",(13,01) TRAP:"hole",(14,01) TRAP:"hole",(15,01) TRAP:"hole",(16,01) TRAP:"hole",(17,01) TRAP:"hole",(18,01) TRAP:"hole",(19,01) TRAP:"hole",(20,01) TRAP:"hole",(21,01) 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 OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'=',random,random OBJECT:'/',random,random # Rewards DOOR:locked,(23,13) DOOR:closed,(17,11) DOOR:closed,(17,13) DOOR:closed,(17,15) REGION:(18,10,22,16),lit,"zoo",filled,true OBJECT:'(',"bag of holding",place[0] ENGRAVING:place[0],burn,"Elbereth" MAZE:"soko1-2",' ' FLAGS:noteleport GEOMETRY:center,center #12345678901234567890123456789012345678901234567890 MAP ------------------------ |......................| |..-------------------.| ----.| ----- |.| |..|.-- --...| |.| |.....|--|....| |.| |.....|..|....| |.| --....|......-- |.| |.......|...| ------|.| |....|..|...| --|.....|.| |....|--|...| |.+.....|.| |.......|..-- |-|.....|.| ----....|.-- |.+.....+.| ---.--.| |-|.....|-- |.....| |.+.....| |..|..| --|.....| ------- ------- ENDMAP RANDOM_PLACES:(16,10),(16,12),(16,14) STAIR:(06,15),down REGION:(00,00,25,16),lit,"ordinary" NON_DIGGABLE:(00,00,25,16) NON_PASSWALL:(00,00,25,16) # Boulders OBJECT:'`',"boulder",(04,04) OBJECT:'`',"boulder",(02,06) OBJECT:'`',"boulder",(03,06) OBJECT:'`',"boulder",(04,07) OBJECT:'`',"boulder",(05,07) OBJECT:'`',"boulder",(02,08) OBJECT:'`',"boulder",(05,08) OBJECT:'`',"boulder",(03,09) OBJECT:'`',"boulder",(04,09) OBJECT:'`',"boulder",(03,10) OBJECT:'`',"boulder",(05,10) OBJECT:'`',"boulder",(06,12) # OBJECT:'`',"boulder",(07,14) # OBJECT:'`',"boulder",(11,05) OBJECT:'`',"boulder",(12,06) OBJECT:'`',"boulder",(10,07) OBJECT:'`',"boulder",(11,07) OBJECT:'`',"boulder",(10,08) OBJECT:'`',"boulder",(12,09) OBJECT:'`',"boulder",(11,10) # Traps TRAP:"hole",(05,01) TRAP:"hole",(06,01) TRAP:"hole",(07,01) TRAP:"hole",(08,01) TRAP:"hole",(09,01) TRAP:"hole",(10,01) TRAP:"hole",(11,01) TRAP:"hole",(12,01) TRAP:"hole",(13,01) TRAP:"hole",(14,01) TRAP:"hole",(15,01) TRAP:"hole",(16,01) TRAP:"hole",(17,01) TRAP:"hole",(18,01) TRAP:"hole",(19,01) TRAP:"hole",(20,01) 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 OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'=',random,random OBJECT:'/',random,random # Rewards DOOR:locked,(23,12) DOOR:closed,(17,10) DOOR:closed,(17,12) DOOR:closed,(17,14) REGION:(18,09,22,15),lit,"zoo",filled,true OBJECT:'"',"amulet of reflection",place[0] ENGRAVING:place[0],burn,"Elbereth" MAZE:"soko1-3",' ' FLAGS:noteleport GEOMETRY:center,center # "J Franklin Mentzer " MAP --------- |.......| ------- |..----+-- |.....-------.|.....| -----........|.|.....| |...|-....--.|.|.....| |...|..--....|.|.....| |...|..-----.|.|.....| --.........|.|.|+----| |.....---.|.|.F...+.| |.|.....|.|.|.|...|-| |.|.|.|...|.|.F...+.| --.---...|.|.|.|...|-| |.....----.|.|.F...+.| |..............|------ ----....|......| |....|..----- --------- ENDMAP RANDOM_PLACES:(20,9),(20,11),(20,13) STAIR:(2,3), down REGION:(00,00,21,17),lit,"ordinary" REGION:(16,03,19,07),lit,"zoo",filled,true NON_DIGGABLE:(00,00,21,17) NON_PASSWALL:(00,00,21,17) DOOR:locked,(19,2) DOOR:locked,(16,8) DOOR:locked,(19,9) DOOR:locked,(19,11) DOOR:locked,(19,13) OBJECT:'`',"boulder",(6,4) OBJECT:'`',"boulder",(2,6) OBJECT:'`',"boulder",(2,7) OBJECT:'`',"boulder",(3,8) OBJECT:'`',"boulder",(6,8) OBJECT:'`',"boulder",(3,9) OBJECT:'`',"boulder",(5,9) OBJECT:'`',"boulder",(6,10) OBJECT:'`',"boulder",(6,11) OBJECT:'`',"boulder",(3,13) OBJECT:'`',"boulder",(5,14) OBJECT:'`',"boulder",(10,14) OBJECT:'`',"boulder",(4,15) OBJECT:'`',"boulder",(7,15) OBJECT:'`',"boulder",(10,15) TRAP:"hole",(15,1) TRAP:"hole",(16,1) TRAP:"hole",(17,1) TRAP:"hole",(18,1) TRAP:"hole",(14,3) TRAP:"hole",(14,4) TRAP:"hole",(14,5) TRAP:"hole",(14,6) TRAP:"hole",(14,7) TRAP:"hole",(14,8) TRAP:"hole",(14,9) TRAP:"hole",(14,10) TRAP:"hole",(14,11) TRAP:"hole",(14,12) TRAP:"hole",(14,13) OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'=',random,random OBJECT:'/',random,random OBJECT:'(',"bag of holding",place[0] ENGRAVING:place[0],burn,"Elbereth" MAZE:"soko1-4",' ' FLAGS:noteleport GEOMETRY:center,center # "J Franklin Mentzer " MAP ------------ |.+......+.| |-|......|-------- |.+......+.......| |-|......|-----..| |.+......+.| |.-- |-------------|.| |.....|...|...|.| |.............|.| |....------.|.|.| |....|...|....|.| |....|.......-|.| -----|.--..---|.| |...|.....+..F.| |........-|..F.| |-.----.---FF-.| |..............| |...|...-----..| --------- ---- ENDMAP RANDOM_PLACES:(1,1),(10,1),(1,3),(1,5),(10,5) STAIR:(6,10), down REGION:(00,00,17,18),lit,"ordinary" REGION:(03,01,08,05),lit,"zoo",filled,true NON_DIGGABLE:(00,00,17,18) NON_PASSWALL:(00,00,17,18) DOOR:locked,(2,1) DOOR:locked,(9,1) DOOR:locked,(2,3) DOOR:locked,(9,3) DOOR:locked,(2,5) DOOR:locked,(9,5) DOOR:locked,(11,13) OBJECT:'`',"boulder",(2,8) OBJECT:'`',"boulder",(3,8) OBJECT:'`',"boulder",(6,8) OBJECT:'`',"boulder",(10,8) OBJECT:'`',"boulder",(12,8) OBJECT:'`',"boulder",(3,9) OBJECT:'`',"boulder",(2,10) OBJECT:'`',"boulder",(3,10) OBJECT:'`',"boulder",(12,10) OBJECT:'`',"boulder",(8,11) OBJECT:'`',"boulder",(6,12) OBJECT:'`',"boulder",(7,13) OBJECT:'`',"boulder",(6,14) OBJECT:'`',"boulder",(4,16) OBJECT:'`',"boulder",(8,16) OBJECT:'`',"boulder",(9,16) TRAP:"hole",(10,3) TRAP:"hole",(11,3) TRAP:"hole",(12,3) TRAP:"hole",(13,3) TRAP:"hole",(14,3) TRAP:"hole",(15,5) TRAP:"hole",(15,6) TRAP:"hole",(15,7) TRAP:"hole",(15,8) TRAP:"hole",(15,9) TRAP:"hole",(15,10) TRAP:"hole",(15,11) TRAP:"hole",(15,12) TRAP:"hole",(15,13) TRAP:"hole",(15,14) TRAP:"hole",(15,15) OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'=',random,random OBJECT:'/',random,random OBJECT:'"',"amulet of reflection",place[0] ENGRAVING:place[0],burn,"Elbereth" slashem-0.0.7E7F3/dat/mtemple.des0000664000076400007640000001210410545462317014562 0ustar aliali# SCCS Id: @(#)mtemple.des 3.4 1993/02/23 # Copyright (c) 1989 by Jean-Christophe Collet # Copyright (c) 1991 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 above. # # This is the Temple of Moloch. # Within lie priests, demons, and, most importantly.... candles! # # MAZE: "mtemple",' ' GEOMETRY: center,center #0 1 2 3 4 5 6 #1234567890123456789012345678901234567890123456789012345678901234567890 MAP ----- ----- ----- ----- ----- |...| |...| |...| |...| |...| ----------...---...---...---...---...|-| ----- |...|..................................| |...| |...+..................................S########S...| |...|..................................| |...| ----------...---...---...---...---...|-| ----- |...| |...| |...| |...| |...| ----- ----- ----- ----- ----- ENDMAP RANDOM_MONSTERS: '&','Z' REGION:(00,00,55,08),unlit,"ordinary" #REGION:(39,03,41,05),unlit,"temple" REGION:(08,01,41,07),unlit,"temple" STAIR:(05,04),up BRANCH:(05,04,05,04),(0,0,0,0) DOOR: locked,(07,04) # the altar of Moloch (making four will make four priests....) ALTAR:(40,04),noalign,shrine ALTAR:(40,04),noalign,shrine ALTAR:(40,04),noalign,shrine ALTAR:(40,04),noalign,shrine # flanking the doorway.... TRAP: "spiked pit",(06,03) TRAP: "spiked pit",(06,05) # the treasure chamber! OBJECT:'(',"chest",(52,3) OBJECT:'(',"wax candle",(52,3) GOLD: random,(52,3) GOLD: random,(52,3) OBJECT: random, random, (52,3) OBJECT: random, random, (52,3) OBJECT: random, random, (52,3) OBJECT:'(',"chest",(53,3) OBJECT:'(',"wax candle",(53,3) GOLD: random,(53,3) GOLD: random,(53,3) OBJECT: random, random, (53,3) OBJECT: random, random, (53,3) OBJECT: random, random, (53,3) OBJECT:'(',"chest",(54,3) OBJECT:'(',"wax candle",(54,3) GOLD: random,(54,3) GOLD: random,(54,3) OBJECT: random, random, (54,3) OBJECT: random, random, (54,3) OBJECT: random, random, (54,3) OBJECT:'(',"chest",(52,4) OBJECT:'(',"wax candle",(52,4) GOLD: random,(52,4) GOLD: random,(52,4) OBJECT: random, random, (52,4) OBJECT: random, random, (52,4) OBJECT: random, random, (52,4) OBJECT:'(',"chest",(53,4) OBJECT:'(',"wax candle",(53,4) GOLD: random,(53,4) GOLD: random,(53,4) OBJECT: random, random, (53,4) OBJECT: random, random, (53,4) OBJECT: random, random, (53,4) OBJECT:'(',"chest",(54,4) OBJECT:'(',"wax candle",(54,4) GOLD: random,(54,4) GOLD: random,(54,4) OBJECT: random, random, (54,4) OBJECT: random, random, (54,4) OBJECT: random, random, (54,4) OBJECT:'(',"chest",(52,5) OBJECT:'(',"wax candle",(52,5) GOLD: random,(52,5) GOLD: random,(52,5) OBJECT: random, random, (52,5) OBJECT: random, random, (52,5) OBJECT: random, random, (52,5) OBJECT:'(',"chest",(53,5) OBJECT:'(',"wax candle",(53,5) GOLD: random,(53,5) GOLD: random,(53,5) OBJECT: random, random, (53,5) OBJECT: random, random, (53,5) OBJECT: random, random, (53,5) OBJECT:'(',"chest",(54,5) OBJECT:'(',"wax candle",(54,5) GOLD: random,(54,5) GOLD: random,(54,5) OBJECT: random, random, (54,5) OBJECT: random, random, (54,5) OBJECT: random, random, (54,5) # five gargoyles on either side, in the niches of the temple MONSTER: 'g',"statue gargoyle",(14,1),hostile,asleep MONSTER: 'g',"statue gargoyle",(20,1),hostile,asleep MONSTER: 'g',"statue gargoyle",(26,1),hostile,asleep MONSTER: 'g',"statue gargoyle",(32,1),hostile,asleep MONSTER: 'g',"statue gargoyle",(38,1),hostile,asleep MONSTER: 'g',"statue gargoyle",(14,7),hostile,asleep MONSTER: 'g',"statue gargoyle",(20,7),hostile,asleep MONSTER: 'g',"statue gargoyle",(26,7),hostile,asleep MONSTER: 'g',"statue gargoyle",(32,7),hostile,asleep MONSTER: 'g',"statue gargoyle",(38,7),hostile,asleep # demons down by the altar... MONSTER: '&',"bone devil",(37,2),hostile,asleep MONSTER: '&',"babau",(38,2),hostile,asleep MONSTER: '&',"barbed devil",(39,2),hostile,asleep MONSTER: '&',"vrock",(37,6),hostile,asleep MONSTER: '&',"horned devil",(38,6),hostile,asleep MONSTER: '&',"hezrou",(39,6),hostile,asleep # a horde of zombies is also inside.... MONSTER: 'Z',random,(17,3),hostile,asleep MONSTER: 'Z',random,(18,3),hostile,asleep MONSTER: 'Z',random,(19,3),hostile,asleep MONSTER: 'Z',random,(20,3),hostile,asleep MONSTER: 'Z',random,(21,3),hostile,asleep MONSTER: 'Z',random,(22,3),hostile,asleep MONSTER: 'Z',random,(23,3),hostile,asleep MONSTER: 'Z',random,(17,4),hostile,asleep MONSTER: 'Z',random,(18,4),hostile,asleep MONSTER: 'Z',random,(19,4),hostile,asleep MONSTER: 'Z',random,(20,4),hostile,asleep MONSTER: 'Z',random,(21,4),hostile,asleep MONSTER: 'Z',random,(22,4),hostile,asleep MONSTER: 'Z',random,(23,4),hostile,asleep MONSTER: 'Z',random,(17,5),hostile,asleep MONSTER: 'Z',random,(18,5),hostile,asleep MONSTER: 'Z',random,(19,5),hostile,asleep MONSTER: 'Z',random,(20,5),hostile,asleep MONSTER: 'Z',random,(21,5),hostile,asleep MONSTER: 'Z',random,(22,5),hostile,asleep MONSTER: 'Z',random,(23,5),hostile,asleep ENGRAVING:(06,04),burn,"Those Not of Moloch, Begone!" slashem-0.0.7E7F3/dat/frnknstn.des0000664000076400007640000000512310545462317014765 0ustar aliali# SCCS Id: @(#)frnknstn.des 3.1 98/NOV/11 # 1998, Robin Johnson # Copyright (c) 1991 by M. Stephenson # NetHack may be freely redistributed. See license for details. # # Doctor Frankenstein's laboratory # MAZE:"frnknstn",random FLAGS:hardfloor # noteleport would render the quantummechs a bit useless here GEOMETRY:center,center MAP ----------------------------. |..........................|. |.-----------------------|.|. |.|......................|.|. |.|.--------------------.|.|. |.|.|....|.............|.|.|. |.S.|....S.............S.|.S. |.|.|....|.............|.|.|. |.|.--------------------.|.|. |.|......................|.|. |.------------------------.|. |..........................|. ----------------------------. ENDMAP STAIR:levregion(01,00,79,20),(0,0,28,12),up STAIR:(5,6),down BRANCH:levregion(01,00,79,20),(0,0,28,12) MAZEWALK:(28,05),east # Undiggable walls NON_DIGGABLE:(00,00,11,12) NON_DIGGABLE:(11,00,21,00) NON_DIGGABLE:(11,10,27,12) NON_DIGGABLE:(21,00,27,10) # Frankenstein and his bodyguard MONSTER:'Q',"Doctor Frankenstein",(06,06),asleep MONSTER:''',"flesh golem",(06,05) MONSTER:''',"flesh golem",(06,07) MONSTER:''',"flesh golem",(05,06) MONSTER:''',"flesh golem",(07,06) MONSTER:'Q',"genetic engineer",(05,05) MONSTER:'Q',"genetic engineer",(05,07) MONSTER:'Q',"quantum mechanic",(07,05) MONSTER:'Q',"quantum mechanic",(07,07) # Golems guarding the lab MONSTER:''',random,(19,05) MONSTER:''',random,(20,06) MONSTER:''',random,(21,07) MONSTER:''',random,(19,05) MONSTER:''',random,(20,06) MONSTER:''',random,(21,07) MONSTER:''',random,(19,05) MONSTER:''',random,(20,06) MONSTER:''',random,(21,07) # Frankenstein's treasure OBJECT:'(',"ice box",(06,06) # Geddit? # Some more roamers MONSTER:''',"Frankenstein's Monster",random MONSTER:'Q',"genetic engineer",random MONSTER:'Q',"genetic engineer",random MONSTER:'Q',"quantum mechanic",random MONSTER:'Q',"quantum mechanic",random MONSTER:''',random,random MONSTER:''',random,random MONSTER:''',random,random MONSTER:''',random,random # Some extra random monsters MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random # Squeaky boards TRAP:"board",(08,05) TRAP:"board",(08,06) TRAP:"board",(08,07) TRAP:"board",(22,05) TRAP:"board",(22,06) TRAP:"board",(22,07) # Randomly-placed traps TRAP:"spiked pit",random TRAP:"anti magic",random TRAP:"magic",random TRAP:"polymorph",random # Some random treasure OBJECT:'!',random,random OBJECT:'!',random,random OBJECT:'?',random,random OBJECT:'?',random,random OBJECT:'/',random,random OBJECT:'/',random,random OBJECT:'+',random,random OBJECT:'+',random,random slashem-0.0.7E7F3/dat/gehennom.des0000664000076400007640000007415410545462317014734 0ustar aliali# 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. # MAZE: "valley", ' ' FLAGS: hardfloor GEOMETRY:center,center MAP ---------------------------------------------------------------------------- |...S.|..|.....| |.....-| |................| |...............| |...| |---|.|.--.---.| |......--- ----..........-----.-----....---........---.-.| | |.|.|..| |.| --........| |.............| |.......---| |-...........--| | |...S..| |.| |.......-----.......------| |--------..---......------- | |----------- |.| |-......| |....|...-- |...-----................---- | |.....S....---.| |.......| |....|...| |..............----------- | |.....|.|......| |.....--- |......--- |....---.......| | |.....|.|------| |....-- --....-- |-------- ----....--------------- | |.....|--......---BBB-| |...-- |.......| |..................| | |..........||........-| --...| |.......| |...||.............| | |.....|...-||-........------....| |.......---- |...||.............-- | |.....|--......---...........--------..........| |.......---------...-- | |.....| |------| |--.......--| |..B......----- -----....| |.| |....--- | |.....| |......--| ------..| |----..B......| |.--------.-- |-.....---| |------ |........| |.|....| |.....----BBBB---------...........---.........| | |........| |...|..| |.....| |-.............--------...........---| | --.....-----------.| |....-----.....---------- |.........---- | | |..|..B...........| |.|..........|.| |.|........| | ---------------------------------------------------------------------------- ENDMAP # Dungeon Description # The shrine to Moloch. REGION:(01,06,05,14),lit,"temple" # The Morgues REGION:(19,01,24,08),unlit,"morgue",filled,true REGION:(09,14,16,18),unlit,"morgue",filled,true REGION:(37,09,43,14),unlit,"morgue",filled,true # Stairs STAIR:(01,01),down # Branch location BRANCH:(66,17,66,17),(0,0,0,0) # Secret Doors DOOR:locked,(04,01) DOOR:locked,(08,04) DOOR:locked,(06,06) # The altar of Moloch. ALTAR:(03,10),noalign,shrine # Non diggable walls - everywhere! NON_DIGGABLE:(00,00,75,19) # Objects # **LOTS** of dead bodies (all human). # note: no priest(esse)s or monks - maybe Moloch has a *special* # fate reserved for members of *those* classes. # OBJECT:'%',"corpse",random,"archeologist",0 OBJECT:'%',"corpse",random,"archeologist",0 OBJECT:'%',"corpse",random,"barbarian",0 OBJECT:'%',"corpse",random,"barbarian",0 OBJECT:'%',"corpse",random,"caveman",0 OBJECT:'%',"corpse",random,"cavewoman",0 OBJECT:'%',"corpse",random,"healer",0 OBJECT:'%',"corpse",random,"healer",0 OBJECT:'%',"corpse",random,"knight",0 OBJECT:'%',"corpse",random,"knight",0 OBJECT:'%',"corpse",random,"ranger",0 OBJECT:'%',"corpse",random,"ranger",0 OBJECT:'%',"corpse",random,"rogue",0 OBJECT:'%',"corpse",random,"rogue",0 OBJECT:'%',"corpse",random,"samurai",0 OBJECT:'%',"corpse",random,"samurai",0 OBJECT:'%',"corpse",random,"tourist",0 OBJECT:'%',"corpse",random,"tourist",0 OBJECT:'%',"corpse",random,"valkyrie",0 OBJECT:'%',"corpse",random,"valkyrie",0 OBJECT:'%',"corpse",random,"wizard",0 OBJECT:'%',"corpse",random,"wizard",0 # # Some random weapons and armor. # OBJECT:'[',random,random OBJECT:'[',random,random OBJECT:'[',random,random OBJECT:'[',random,random OBJECT:')',random,random OBJECT:')',random,random OBJECT:')',random,random OBJECT:')',random,random # # Some random loot. # OBJECT:'*',"ruby",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 OBJECT:'/',random,random OBJECT:'=',random,random OBJECT:'=',random,random OBJECT:'+',random,random OBJECT:'+',random,random OBJECT:'(',random,random OBJECT:'(',random,random OBJECT:'(',random,random # (Not so) Random traps. TRAP:"spiked pit", (05,02) TRAP:"spiked pit", (14,05) TRAP:"sleep gas", (03,01) TRAP:"board", (21,12) TRAP:"board", random TRAP:"dart", (60,01) TRAP:"dart", (26,17) TRAP:"anti magic", random TRAP:"anti magic", random TRAP:"magic", random TRAP:"magic", random # Random monsters. # The ghosts. MONSTER:' ',"ghost",random MONSTER:' ',"ghost",random MONSTER:' ',"ghost",random MONSTER:' ',"ghost",random MONSTER:' ',"ghost",random MONSTER:' ',"ghost",random # Add a few bats for atmosphere. MONSTER:'B',"vampire bat",random MONSTER:'B',"vampire bat",random MONSTER:'B',"vampire bat",random # And a lich for good measure. MONSTER:'L',random,random # Some undead nasties for good measure MONSTER:'V',random,random MONSTER:'V',random,random MONSTER:'V',random,random MONSTER:'Z',random,random MONSTER:'Z',random,random MONSTER:'Z',random,random MONSTER:'Z',random,random MONSTER:'M',random,random MONSTER:'M',random,random MONSTER:'M',random,random MONSTER:'M',random,random # # The Juiblex level # MAZE:"juiblex",' ' FLAGS:noteleport,shortsighted INIT_MAP:'.','}',true,true,unlit,false # guarantee at least one open spot to ensure successful stair placement GEOMETRY:left,bottom MAP }}}}}}}} }}...}}} }}}...}} }}}}.}}} }}}}}}}} ENDMAP OBJECT:'`',"boulder",random GEOMETRY:right,top MAP }}}}}}}} }}}}.}}} }}}...}} }}...}}} }}}}}}}} ENDMAP OBJECT:'`',"boulder",random # lair GEOMETRY:center,center MAP ..}}}}}.}}}}}.}}}}}.}}}}}.}}}}}.}}}}}.}}}}}.}}}}}.. .}}}.}}}}}..}}}..}}}}}..}}}..}}}}}..}}}..}}}}}.}}}. }}}...}}..}}.}.}}.}}.}}}...}}}.}}}..}}}..}}}}...}}} .}}}.}}.}}}.}}.}}.}}...}}.}}.....}}.....}....}.}}}. ..}}}..}}}.}}.}}.}}..}}.....}}.}}}.}}.}}}}}}}}}}}.. .}}}..}}}}}.}}.}}.}}...}}}}}.....}}.}}}}}}.....}}}. }}}..}}...}}..}}.}}}.}}}...}}}.}}}.}.}}}}..P.P..}}} }}.}}}}...}}}}}.}...}}}..P..}}}.}.}}}.}}}}.....}}}} }.}}}}.}}.}..}.}}}}}}}..P.P..}}}.}}}.}}..}}...}}}}. .}}}}.}}}}....}}}}}.}}}..P..}}}.}}}}.}}..}}...}}}.} }}}}..}}.}}..}}}}...}}}}...}}}.}}}}}.}}}}.}}}}}}.}} }}}...}}...}}}..}}}}}}}}}}}}.....}}}}.}}...}..}.}}} .}}}..}}.}}}}....}}..}}}..}}.....}}}}.}}}.}....}}}. ..}}}.}}}}..}}..}}..}}..}}..}}.}}}..}.}..}}}..}}}.. .}}}.}}}}....}}}}..}}....}}}}}}}...}}}....}}}}.}}}. }}}...}}}....}}}..}}}....}}}..}}...}}}....}}}...}}} .}}}.}}}}}..}}}..}}}}}..}}}..}}}}}..}}}..}}}}}.}}}. ..}}}}}.}}}}}.}}}}}.}}}}}.}}}}}.}}}}}.}}}}}.}}}}}.. ENDMAP # Random registers RANDOM_MONSTERS:'j','b','P','F' RANDOM_PLACES:(04,02),(46,02),(04,15),(46,15) # Dungeon description REGION:(00,00,50,17),unlit,"swamp" MAZEWALK:(00,09),west MAZEWALK:(50,08),east STAIR:levregion(01,00,11,20),(0,0,50,17),down STAIR:levregion(69,00,79,20),(0,0,50,17),up BRANCH:levregion(01,00,11,20),(0,0,50,17) TELEPORT_REGION:levregion(01,00,11,20),(0,0,50,17),up TELEPORT_REGION:levregion(69,00,79,20),(0,0,50,17),down FOUNTAIN:place[0] MONSTER:'m',"giant mimic",place[1],m_feature "fountain" MONSTER:'m',"giant mimic",place[2],m_feature "fountain" MONSTER:'m',"giant mimic",place[3],m_feature "fountain" # The demon of the swamp MONSTER:'&',"Juiblex",(25,08) # And a couple demons MONSTER:'i',"lemure",(43,08) MONSTER:'i',"lemure",(44,08) MONSTER:'i',"lemure",(45,08) # Some liquids and gems OBJECT:'*',random,(43,06) OBJECT:'*',random,(45,06) OBJECT:'!',random,(43,09) OBJECT:'!',random,(44,09) OBJECT:'!',random,(45,09) # And lots of blobby monsters MONSTER:monster[0],random,(25,06) MONSTER:monster[1],random,(24,07) MONSTER:monster[2],random,(26,07) MONSTER:monster[3],random,(23,08) MONSTER:monster[3],random,(27,08) MONSTER:monster[2],random,(24,09) MONSTER:monster[1],random,(26,09) MONSTER:monster[0],random,(25,10) MONSTER:'j',random,random MONSTER:'j',random,random MONSTER:'j',random,random MONSTER:'j',random,random MONSTER:'P',random,random MONSTER:'P',random,random MONSTER:'P',random,random MONSTER:'P',random,random MONSTER:'b',random,random MONSTER:'b',random,random MONSTER:'b',random,random MONSTER:'F',random,random MONSTER:'F',random,random MONSTER:'F',random,random MONSTER:'m',random,random MONSTER:'m',random,random MONSTER:';',"jellyfish",random MONSTER:';',"jellyfish",random # Some random objects OBJECT:'!',random,random OBJECT:'!',random,random OBJECT:'!',random,random OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'%',random,random OBJECT:'`',"boulder",random # Some traps TRAP:"sleep gas",random TRAP:"sleep gas",random TRAP:"anti magic",random TRAP:"anti magic",random TRAP:"magic",random TRAP:"magic",random # # The Orcus Level # MAZE:"orcus",random FLAGS: noteleport,shortsighted GEOMETRY:right,center # A ghost town MAP .|....|....|....|..............|....|........ .|....|....|....|..............|....|........ .|....|....|....|--...-+-------|............. .|....|....|....|..............+............. .|.........|....|..............|....|........ .--+-...-+----+--....-------...--------.+---- .....................|.....|................. .....................|.....|................. .--+----....-+---....|.....|...----------+--- .|....|....|....|....---+---...|......|...... .|.........|....|..............|......|...... .----...---------.....-----....+......|...... .|........................|....|......|...... .----------+-...--+--|....|....----------+--- .|....|..............|....+....|............. .|....+.......|......|....|....|............. .|....|.......|......|....|....|............. ENDMAP MAZEWALK:(00,06),west # Entire main area REGION:(01,00,44,16),unlit,"ordinary" STAIR:(33,15),down STAIR:levregion(01,00,12,20),levregion(20,01,70,20),up BRANCH:levregion(01,00,12,20),levregion(20,01,70,20) TELEPORT_REGION:levregion(01,00,12,20),levregion(20,01,70,20) # Wall "ruins" OBJECT:'`',"boulder",(19,02) OBJECT:'`',"boulder",(20,02) OBJECT:'`',"boulder",(21,02) OBJECT:'`',"boulder",(36,02) OBJECT:'`',"boulder",(36,03) OBJECT:'`',"boulder",(06,04) OBJECT:'`',"boulder",(05,05) OBJECT:'`',"boulder",(06,05) OBJECT:'`',"boulder",(07,05) OBJECT:'`',"boulder",(39,05) OBJECT:'`',"boulder",(08,08) OBJECT:'`',"boulder",(09,08) OBJECT:'`',"boulder",(10,08) OBJECT:'`',"boulder",(11,08) OBJECT:'`',"boulder",(06,10) OBJECT:'`',"boulder",(05,11) OBJECT:'`',"boulder",(06,11) OBJECT:'`',"boulder",(07,11) OBJECT:'`',"boulder",(21,11) OBJECT:'`',"boulder",(21,12) OBJECT:'`',"boulder",(13,13) OBJECT:'`',"boulder",(14,13) OBJECT:'`',"boulder",(15,13) OBJECT:'`',"boulder",(14,14) # Doors DOOR:closed,(23,02) DOOR:open,(31,03) DOOR:nodoor,(03,05) DOOR:closed,(09,05) DOOR:closed,(14,05) DOOR:closed,(40,05) DOOR:open,(03,08) DOOR:nodoor,(13,08) DOOR:open,(41,08) DOOR:closed,(24,09) DOOR:closed,(31,11) DOOR:open,(11,13) DOOR:closed,(18,13) DOOR:closed,(41,13) DOOR:open,(26,14) DOOR:closed,(06,15) # Special rooms ALTAR:(24,07),noalign,sanctum REGION:(22,12,25,16),unlit,"morgue" REGION:(32,09,37,12),lit,"shop" REGION:(12,00,15,04),lit,"shop" # Some traps. TRAP:"spiked pit", random TRAP:"sleep gas", random TRAP:"anti magic", random TRAP:"fire", random TRAP:"fire", random TRAP:"fire", random TRAP:"magic", random TRAP:"magic", random # Some random objects OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random OBJECT:random,random,random # The resident nasty MONSTER:'&',"Orcus",(33,15) # And its preferred companions MONSTER:'Z',"human zombie",(32,15) MONSTER:' ',"shade",(32,14) MONSTER:' ',"shade",(32,16) MONSTER:'V',"vampire",(35,16) MONSTER:'V',"vampire",(35,14) MONSTER:'V',"vampire lord",(36,14) MONSTER:'V',"vampire lord",(36,15) # Randomly placed companions MONSTER:'Z',"skeleton",random MONSTER:'Z',"skeleton",random MONSTER:'Z',"skeleton",random MONSTER:'Z',"skeleton",random MONSTER:'Z',"skeleton",random MONSTER:' ',"shade",random MONSTER:' ',"shade",random MONSTER:' ',"shade",random MONSTER:' ',"shade",random MONSTER:'Z',"giant zombie",random MONSTER:'Z',"giant zombie",random MONSTER:'Z',"giant zombie",random MONSTER:'Z',"ettin zombie",random MONSTER:'Z',"ettin zombie",random MONSTER:'Z',"ettin zombie",random MONSTER:'Z',"human zombie",random MONSTER:'Z',"human zombie",random MONSTER:'Z',"human zombie",random MONSTER:'V',"vampire",random MONSTER:'V',"vampire",random MONSTER:'V',"vampire",random MONSTER:'V',"vampire lord",random MONSTER:'V',"vampire lord",random # A few more for the party MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random MONSTER:random,random,random # # The Asmodeus Level # MAZE:"asmodeus",random FLAGS: noteleport # First part GEOMETRY:half-left,center MAP --------------------- |.............|.....| |.............S.....| |---+------------...| |.....|.........|-+-- |..---|.........|.... |..|..S.........|.... |..|..|.........|.... |..|..|.........|-+-- |..|..-----------...| |..S..........|.....| --------------------- ENDMAP STAIR:levregion(01,00,6,20),levregion(6,1,70,16),up BRANCH:levregion(01,00,6,20),levregion(6,1,70,16) TELEPORT_REGION:levregion(01,00,6,20),levregion(6,1,70,16) # Doors DOOR:closed,(04,03) DOOR:locked,(18,04) DOOR:closed,(18,08) # STAIR:(13,07),down # Non diggable walls NON_DIGGABLE:(00,00,20,11) # Entire main area REGION:(01,01,20,10),unlit,"ordinary" # The fellow in residence MONSTER:'&',"Asmodeus",(12,07) # Some random weapons and armor. 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 # Some traps. TRAP:"spiked pit", (05,02) TRAP:"fire", (08,06) TRAP:"sleep gas", random TRAP:"anti magic", random TRAP:"fire", random TRAP:"magic", random TRAP:"magic", random # Random monsters. MONSTER:' ',"ghost",(11,07) MONSTER:'&',"horned devil",(10,05) MONSTER:'L',random,random # Some Vampires for good measure MONSTER:'V',random,random MONSTER:'V',random,random MONSTER:'V',random,random # Second part GEOMETRY:half-right,center MAP --------------------------------- ................................| ................................+ ................................| --------------------------------- ENDMAP MAZEWALK:(32,02),east # Non diggable walls NON_DIGGABLE:(00,00,32,04) DOOR:closed,(32,02) MONSTER:'&',random,random MONSTER:'&',random,random MONSTER:'&',random,random TRAP:"anti magic", random TRAP:"fire", random TRAP:"magic", random # # The Baalzebub level # MAZE:"baalz",random FLAGS: noteleport GEOMETRY:right,center MAP ------------------------------------------------- | --- ---- | ---- | ------------ | | ------ | --------|..........|--- | |....| -------|...........-------------- ---....|--|..................S............|---- ....--....S..----------------|............S...| ---....|--|..................|............|---- | |....| -------|...........-----S-------- | ------ | --------|..........|--- | ---- | ------------ | | --- ---- ------------------------------------------------- ENDMAP STAIR:levregion(01,00,15,20),levregion(15,1,70,16),up BRANCH:levregion(01,00,15,20),levregion(15,1,70,16) TELEPORT_REGION:levregion(01,00,15,20),levregion(15,1,70,16) NON_DIGGABLE:(00,00,46,12) MAZEWALK:(00,06),west STAIR:(44,06),down # The fellow in residence MONSTER:'&',"Baalzebub",(35,06) # Some random weapons and armor. 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 # Some traps. TRAP:"spiked pit", random TRAP:"fire", random TRAP:"sleep gas", random TRAP:"anti magic", random TRAP:"fire", random TRAP:"magic", random TRAP:"magic", random # Random monsters. MONSTER:' ',"ghost",(37,07) MONSTER:'&',"horned devil",(32,05) MONSTER:'&',"barbed devil",(38,07) MONSTER:'L',random,random # Some Vampires for good measure MONSTER:'V',random,random MONSTER:'V',random,random MONSTER:'V',random,random # [Tom] # The Yeenoghu level # MAZE:"yeenoghu",random FLAGS: noteleport GEOMETRY:right,center MAP ------------------------------------------------- | ---------| |----------| | |....S...|--|......|...------------ | |....|...| |......-...S..........| | |....|-------..........|...------S------- ---....|--|..............|...|............|---- ..........S..............|---|.....\......S...| ---....|--|..............|...|............|---- | |....|-------..........|...-------------- | |....|...| |......-...S..........| | |....S...|--|......|...------------ | ---------| |----------| ------------------------------------------------- ENDMAP STAIR:levregion(01,00,15,20),levregion(15,1,70,16),up BRANCH:levregion(01,00,15,20),levregion(15,1,70,16) TELEPORT_REGION:levregion(01,00,15,20),levregion(15,1,70,16) NON_DIGGABLE:(00,00,46,12) MAZEWALK:(00,06),west STAIR:(44,06),down # The fellow in residence MONSTER:'&',"Yeenoghu",(35,06) # Some random weapons and armor. 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 # Some traps. TRAP:"fire", random TRAP:"fire", random TRAP:"magic", random TRAP:"magic", random TRAP:"magic", random TRAP:"magic", random # Random monsters. MONSTER:'Z',"ghoul",random MONSTER:'Z',"ghoul",random MONSTER:'Z',"ghoul",random MONSTER:'Z',"ghoul",random MONSTER:'Z',"ghoul",random MONSTER:'Z',"ghoul",random MONSTER:'Z',"ghoul",random MONSTER:'Z',"ghoul",random MONSTER:'Z',"ghast",random MONSTER:'Z',"ghast",random MONSTER:'Z',"ghast",random MONSTER:'Z',"ghast",random MONSTER:'Z',"ghast",random MONSTER:'Z',"ghast",random MONSTER:'G',"gnoll",random MONSTER:'G',"gnoll",random MONSTER:'G',"gnoll",random MONSTER:'G',"gnoll",random MONSTER:'G',"gnoll",random MONSTER:'G',"gnoll",random MONSTER:'G',"gnoll",random MONSTER:'G',"gnoll",random MONSTER:'G',"gnoll",random MONSTER:'G',"gnoll",random MONSTER:'G',"gnoll",random MONSTER:'G',"gnoll",random MONSTER:'G',"gnoll",random MONSTER:'G',"gnoll",random MONSTER:'G',"gnoll",random MONSTER:'G',"gnoll",random MONSTER:'G',"gnoll",random # [Tom] # The Geryon level # MAZE:"geryon",random FLAGS: noteleport GEOMETRY:right,center MAP ------------------------------------------------- | ------------|----------| | |....S......|..........|--------------------- | |....|......S..........S...|......|.........| | |---S--------..........|...------S-----S-...| ---...........|..........|...S............|--S- ..............|-S--------|---|............|...| ---...........|..........|...|............|---- | |---------S--..........|...----------S----- | |....|......|..........S..........|.......| | |....S......|..........|----------|.......| | ------------|----------| --------- ------------------------------------------------- ENDMAP STAIR:levregion(01,00,15,20),levregion(15,1,70,16),up BRANCH:levregion(01,00,15,20),levregion(15,1,70,16) TELEPORT_REGION:levregion(01,00,15,20),levregion(15,1,70,16) NON_DIGGABLE:(00,00,46,12) MAZEWALK:(00,06),west STAIR:(44,06),down # The fellow in residence MONSTER:'&',"Geryon",(35,06) # Some random weapons and armor. 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 # Some traps. TRAP:"fire", random TRAP:"fire", random TRAP:"fire", random TRAP:"fire", random TRAP:"fire", random TRAP:"fire", random TRAP:"fire", random TRAP:"fire", random # Random monsters. MONSTER:'H',"minotaur",random MONSTER:'H',"minotaur",random MONSTER:'H',"minotaur",random MONSTER:'H',"minotaur",random MONSTER:'H',"minotaur",random MONSTER:'H',"minotaur",random MONSTER:'H',"minotaur",random MONSTER:'H',"minotaur",random MONSTER:'&',"horned devil",random MONSTER:'&',"horned devil",random MONSTER:'&',"horned devil",random MONSTER:'&',"horned devil",random MONSTER:'&',"barbed devil",random MONSTER:'&',"barbed devil",random MONSTER:'&',"barbed devil",random # [Tom] # The Demogorgon level # MAZE:"demogorg",random FLAGS: noteleport GEOMETRY:right,center MAP ------------------------------------------------- | ------------|------------------ | |}}}}}}}}}}}|}...}......}}}}}}|-------------- | |}}}}}}}}}}}|....}}...}...}}}}S...|.........| | |-----}}-----...}...}.......}}|--S-----S-...| ---....}}}}...|.....}}....}..}}}|...|.....|--S- .......}}}}...|-S----------------...|.....|...| ---..}}}}}}...|}..| |...S..S...|.....|---- | |-}}}--------...| |...-------|--S----- | |}}}}|......S...| |..........S.......| | |}}}}S......|..}| |----------|.......| | ------------|---- --------- ------------------------------------------------- ENDMAP STAIR:levregion(01,00,15,20),levregion(15,1,70,16),up BRANCH:levregion(01,00,15,20),levregion(15,1,70,16) TELEPORT_REGION:levregion(01,00,15,20),levregion(15,1,70,16) NON_DIGGABLE:(00,00,46,12) MAZEWALK:(00,06),west STAIR:(44,06),down # The fellow in residence MONSTER:'&',"Demogorgon",(06,06) # Some random weapons and armor. 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 monsters. MONSTER:'P',random,random MONSTER:'P',random,random MONSTER:'P',random,random MONSTER:'P',random,random MONSTER:'P',random,random MONSTER:'P',random,random MONSTER:'P',random,random MONSTER:'P',random,random MONSTER:'P',random,random MONSTER:'j',random,random MONSTER:'j',random,random MONSTER:'j',random,random MONSTER:'j',random,random MONSTER:'j',random,random MONSTER:'j',random,random MONSTER:'j',random,random MONSTER:'F',random,random MONSTER:'F',random,random MONSTER:'F',random,random MONSTER:'F',random,random MONSTER:'F',random,random MONSTER:'&',"hezrou",random MONSTER:'&',"hezrou",random MONSTER:'&',"hezrou",random MONSTER:'&',"hezrou",random MONSTER:'&',"hezrou",random MONSTER:'&',"hezrou",random MONSTER:'&',"hezrou",random MONSTER:'&',"hezrou",random MONSTER:'&',"hezrou",random MONSTER:'&',"hezrou",random MONSTER:'&',"vrock",random MONSTER:'&',"vrock",random MONSTER:'&',"vrock",random MONSTER:'&',"vrock",random MONSTER:'&',"vrock",random MONSTER:'&',"vrock",random # [Tom] # The Dispater level # MAZE:"dispater",random FLAGS: noteleport GEOMETRY:right,center MAP ------------------------------------------------- | ----------------------------------------|-- | |.....|.....................|...|...|...S.| | |.--|.|.-------------------.|.|.|.|.|.|.|.| | |...|.|...................|.|.|.|.|.|.|.|.| ----|.|.|-----------------|.|.|.|.|.|.|.|.|S--- ....|.|.|.................|.|.|.|.|.|.|.|.|...| ---.|.|.|.|--------------.|.|.|.|.|.|.|.|.|---- | |.|.|.|.|...............|.|.|.|.|.|.|.|.| | | |.|.|.|.|.--------------|.|.|.|.|.|.|.|.| | | |...|...|.................|...|...|...|.| | | ------------------------------------------- ------------------------------------------------- ENDMAP STAIR:levregion(01,00,15,20),levregion(15,1,70,16),up BRANCH:levregion(01,00,15,20),levregion(15,1,70,16) TELEPORT_REGION:levregion(01,00,15,20),levregion(15,1,70,16) NON_DIGGABLE:(00,00,46,12) MAZEWALK:(00,06),west STAIR:(44,06),down # The fellow in residence MONSTER:'&',"Dispater",(18,06) # Some random weapons and armor. 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 # Some traps. TRAP:"fire", random TRAP:"fire", random TRAP:"fire", random TRAP:"fire", random TRAP:"fire", random TRAP:"fire", random TRAP:"fire", random TRAP:"fire", random TRAP:"fire", random TRAP:"fire", random TRAP:"fire", random TRAP:"fire", random # Random monsters. MONSTER:'i',"lemure",random MONSTER:'i',"lemure",random MONSTER:'i',"lemure",random MONSTER:'i',"lemure",random MONSTER:'i',"lemure",random MONSTER:'i',"lemure",random MONSTER:'i',"lemure",random MONSTER:'i',"lemure",random MONSTER:'i',"lemure",random MONSTER:'i',"lemure",random MONSTER:'i',"lemure",random MONSTER:'i',"lemure",random MONSTER:'i',"lemure",random MONSTER:'i',"lemure",random MONSTER:'i',"lemure",random MONSTER:'i',"lemure",random MONSTER:'i',"lemure",random MONSTER:'i',"lemure",random MONSTER:'i',"lemure",random MONSTER:'i',"lemure",random MONSTER:'i',"lemure",random MONSTER:'i',"lemure",random MONSTER:'i',"lemure",random MONSTER:'i',"lemure",random MONSTER:'i',"imp",random MONSTER:'i',"imp",random MONSTER:'i',"imp",random MONSTER:'i',"imp",random MONSTER:'i',"imp",random MONSTER:'i',"imp",random MONSTER:'i',"imp",random MONSTER:'i',"imp",random MONSTER:'i',"imp",random MONSTER:'i',"imp",random MONSTER:'i',"imp",random MONSTER:'i',"imp",random MONSTER:'i',"imp",random MONSTER:'i',"imp",random MONSTER:'i',"imp",random MONSTER:'i',"nupperibo",random MONSTER:'i',"nupperibo",random MONSTER:'i',"nupperibo",random MONSTER:'i',"nupperibo",random MONSTER:'i',"nupperibo",random MONSTER:'i',"nupperibo",random MONSTER:'i',"nupperibo",random MONSTER:'i',"nupperibo",random MONSTER:'i',"nupperibo",random MONSTER:'i',"nupperibo",random MONSTER:'i',"nupperibo",random MONSTER:'i',"nupperibo",random MONSTER:'i',"nupperibo",random MONSTER:'i',"nupperibo",random MONSTER:'i',"nupperibo",random MONSTER:'&',"horned devil",random MONSTER:'&',"horned devil",random MONSTER:'&',"horned devil",random MONSTER:'&',"horned devil",random MONSTER:'&',"barbed devil",random MONSTER:'&',"barbed devil",random MONSTER:'&',"barbed devil",random MONSTER:'&',"barbed devil",random MONSTER:'&',"barbed devil",random MONSTER:'&',"barbed devil",random MONSTER:'&',"bone devil",random MONSTER:'&',"bone devil",random MONSTER:'&',"bone devil",random MONSTER:'&',"bone devil",random MONSTER:'&',"bone devil",random MONSTER:'&',"bone devil",random MONSTER:'&',"bone devil",random MONSTER:'&',"bone devil",random MONSTER:'&',"bone devil",random # # The Sanctum Level # MAZE:"sanctum", ' ' FLAGS: noteleport,hardfloor GEOMETRY:center,center MAP ---------------------------------------------------------------------------- | -------------- | | |............| ------- | | -------............----- |.....| | | |......................| --.....| --------- | | ----......................---------|......---- |.......| | | |........---------..........|......+.........| ------+---..| | | ---........|.......|..........--S----|.........| |........|..| | | |..........|.......|.............| |.........-------..---------- | | |..........|.......|..........---- |..........|....|..|......| | | |..........|.......|..........| --.......----+---S---S--..| | | |..........---------..........| |.......|.............|..| | | ---...........................| -----+-------S---------S--- | | |...........................| |...| |......| |....|-- | | ----.....................---- |...---....--- ---......| | | |.....................| |..........| |.....---- | | -------...........----- --...------- |.....| | | |...........| |...| |.....| | | ------------- ----- ------- | ---------------------------------------------------------------------------- ENDMAP REGION:(15,07,21,10),lit,"temple" ALTAR:(18,08),noalign,sanctum REGION:(41,06,48,11),unlit,"morgue",filled,true # Non diggable walls NON_DIGGABLE:(00,00,75,19) # Invisible barrier separating the left & right halves of the level NON_PASSWALL:(37,00,39,19) # Doors DOOR:closed,(40,06) DOOR:locked,(62,06) DOOR:closed,(46,12) DOOR:closed,(53,10) # Surround the temple with fire TRAP:"fire",(13,05) TRAP:"fire",(14,05) TRAP:"fire",(15,05) TRAP:"fire",(16,05) TRAP:"fire",(17,05) TRAP:"fire",(18,05) TRAP:"fire",(19,05) TRAP:"fire",(20,05) TRAP:"fire",(21,05) TRAP:"fire",(22,05) TRAP:"fire",(23,05) TRAP:"fire",(13,12) TRAP:"fire",(14,12) TRAP:"fire",(15,12) TRAP:"fire",(16,12) TRAP:"fire",(17,12) TRAP:"fire",(18,12) TRAP:"fire",(19,12) TRAP:"fire",(20,12) TRAP:"fire",(21,12) TRAP:"fire",(22,12) TRAP:"fire",(23,12) TRAP:"fire",(13,06) TRAP:"fire",(13,07) TRAP:"fire",(13,08) TRAP:"fire",(13,09) TRAP:"fire",(13,10) TRAP:"fire",(13,11) TRAP:"fire",(23,06) TRAP:"fire",(23,07) TRAP:"fire",(23,08) TRAP:"fire",(23,09) TRAP:"fire",(23,10) TRAP:"fire",(23,11) # Some traps. TRAP:"spiked pit", random TRAP:"fire", random TRAP:"sleep gas", random TRAP:"anti magic", random TRAP:"fire", random TRAP:"magic", random # Some 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 OBJECT:'!',random,random OBJECT:'?',random,random OBJECT:'?',random,random OBJECT:'?',random,random OBJECT:'?',random,random OBJECT:'?',random,random # Some monsters. MONSTER:'&',"horned devil",(14,12),hostile MONSTER:'&',"barbed devil",(18,08),hostile MONSTER:'&',"erinys",(10,04),hostile MONSTER:'&',"marilith",(15,04),hostile MONSTER:'&',"nalfeshnee",(27,08),hostile # Moloch's horde MONSTER:'@',"aligned priest",(20,03),noalign,hostile MONSTER:'@',"aligned priest",(15,04),noalign,hostile MONSTER:'@',"aligned priest",(11,05),noalign,hostile MONSTER:'@',"aligned priest",(11,07),noalign,hostile MONSTER:'@',"aligned priest",(11,09),noalign,hostile MONSTER:'@',"aligned priest",(11,12),noalign,hostile MONSTER:'@',"aligned priest",(15,13),noalign,hostile MONSTER:'@',"aligned priest",(17,13),noalign,hostile MONSTER:'@',"aligned priest",(21,13),noalign,hostile # A few nasties MONSTER:'L',random,random MONSTER:'L',random,random MONSTER:'V',random,random MONSTER:'V',random,random MONSTER:'V',random,random STAIR:(63,15),up slashem-0.0.7E7F3/dat/newmall.des0000664000076400007640000000433110545462317014561 0ustar aliali# SCCS Id: @(#)newmall.des 3.4 1993/02/23 # Copyright (c) 1989 by Jean-Christophe Collet # Copyright (c) 1991 by M. Stephenson # NetHack may be freely redistributed. See license for details. # LEVEL: "mall" MESSAGE: "You hear the sounds of civilization." ROOM: "ordinary" , lit, random, random, (48,15) NAME: "town" FOUNTAIN: (20, 7) # # The Town Watch. # MONSTER: '@', "watchman", random, peaceful MONSTER: '@', "watchman", random, peaceful MONSTER: '@', "watchman", random, peaceful MONSTER: '@', "watchman", random, peaceful MONSTER: '@', "watch captain", random, peaceful MONSTER: '@', "watch captain", random, peaceful MONSTER: random, random, random MONSTER: random, random, random MONSTER: random, random, random MONSTER: random, random, random MONSTER: random, random, random MONSTER: random, random, random SUBROOM: "tool shop" , lit, (2,2), (6,4), "town" CHANCE: 20 DOOR: false, closed, south, random SUBROOM: "food shop", lit, (2,9), (6,4), "town" CHANCE: 20 DOOR: false, closed, north, random SUBROOM: "scroll shop", unlit, (9,2), (6,4), "town" CHANCE: 20 DOOR: false, closed, south, random SUBROOM: "potion shop", lit, (9,9), (6,4), "town" CHANCE: 20 DOOR: false, closed, north, random SUBROOM: "ring shop", lit, (16,2), (4,3), "town" CHANCE: 20 DOOR: false, closed, south, random SUBROOM: "candle shop", lit, (23,2), (6,3), "town" CHANCE: 20 DOOR: false, closed, south, random SUBROOM: "book shop", lit, (16,10), (4,3), "town" CHANCE: 20 DOOR: false, closed, east, random SUBROOM: "shop", lit, (23,9), (10,4), "town" CHANCE: 20 DOOR: false, closed, north, random SUBROOM: "wand shop", lit, (33,2), (3,3), "town" CHANCE: 20 DOOR: false, closed, west, random SUBROOM: "weapon shop", lit, (39,2), (7,4), "town" CHANCE: 20 DOOR: false, closed, south, random SUBROOM: "armor shop", unlit, (38,10), (7,3), "town" CHANCE: 20 DOOR: false, closed, north, random ROOM: "ordinary" , random, random, random, random STAIR: random, up STAIR: random, down MONSTER: random, random, random ROOM: "ordinary" , random, random, random, random MONSTER: random, random, random ROOM: "ordinary" , random, random, random, random ROOM: "ordinary" , random, random, random, random MONSTER: random, random, random RANDOM_CORRIDORS slashem-0.0.7E7F3/win/0000775000076400007640000000000010545462320012443 5ustar alialislashem-0.0.7E7F3/win/tty/0000775000076400007640000000000010545462317013271 5ustar alialislashem-0.0.7E7F3/win/tty/getline.c0000664000076400007640000001514310545462317015070 0ustar aliali/* SCCS Id: @(#)getline.c 3.4 2002/10/06 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" #ifdef TTY_GRAPHICS #if !defined(MAC) #define NEWAUTOCOMP #endif #include "wintty.h" #include "func_tab.h" #ifdef OVL1 char morc = 0; /* tell the outside world what char you chose */ #endif /* OVL1 */ STATIC_DCL boolean FDECL(ext_cmd_getlin_hook, (char *)); typedef boolean FDECL((*getlin_hook_proc), (char *)); STATIC_DCL void FDECL(hooked_tty_getlin, (const char*,char*,getlin_hook_proc)); extern int NDECL(extcmd_via_menu); /* cmd.c */ extern char erase_char, kill_char; /* from appropriate tty.c file */ #ifdef OVL1 /* * Read a line closed with '\n' into the array char bufp[BUFSZ]. * (The '\n' is not stored. The string is closed with a '\0'.) * Reading can be interrupted by an escape ('\033') - now the * resulting string is "\033". */ void tty_getlin(query, bufp) const char *query; register char *bufp; { hooked_tty_getlin(query, bufp, (getlin_hook_proc) 0); } STATIC_OVL void hooked_tty_getlin(query, bufp, hook) const char *query; register char *bufp; getlin_hook_proc hook; { register char *obufp = bufp; register int c; struct WinDesc *cw = wins[WIN_MESSAGE]; boolean doprev = 0; if(ttyDisplay->toplin == 1 && !(cw->flags & WIN_STOP)) more(); cw->flags &= ~WIN_STOP; ttyDisplay->toplin = 3; /* special prompt state */ ttyDisplay->inread++; pline("%s ", query); *obufp = 0; for(;;) { (void) fflush(stdout); Sprintf(toplines, "%s ", query); Strcat(toplines, obufp); if((c = Getchar()) == EOF) { #ifndef NEWAUTOCOMP *bufp = 0; #endif /* not NEWAUTOCOMP */ break; } if(c == '\033') { *obufp = c; obufp[1] = 0; break; } if (ttyDisplay->intr) { ttyDisplay->intr--; *bufp = 0; } if(c == '\020') { /* ctrl-P */ if (iflags.prevmsg_window != 's') { 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 == 's') { tty_clear_nhwindow(WIN_MESSAGE); cw->maxcol = cw->maxrow; doprev = 0; addtopl(query); addtopl(" "); *bufp = 0; addtopl(obufp); } if(c == erase_char || c == '\b') { if(bufp != obufp) { #ifdef NEWAUTOCOMP char *i; #endif /* NEWAUTOCOMP */ bufp--; #ifndef NEWAUTOCOMP putsyms("\b \b");/* putsym converts \b */ #else /* NEWAUTOCOMP */ putsyms("\b"); for (i = bufp; *i; ++i) putsyms(" "); for (; i > bufp; --i) putsyms("\b"); *bufp = 0; #endif /* NEWAUTOCOMP */ } else tty_nhbell(); #if defined(apollo) } else if(c == '\n' || c == '\r') { #else } else if(c == '\n') { #endif #ifndef NEWAUTOCOMP *bufp = 0; #endif /* not NEWAUTOCOMP */ break; } else if(' ' <= (unsigned char) c && c != '\177' && (bufp-obufp < BUFSZ-1 && bufp-obufp < COLNO)) { /* avoid isprint() - some people don't have it ' ' is not always a printing char */ #ifdef NEWAUTOCOMP char *i = eos(bufp); #endif /* NEWAUTOCOMP */ *bufp = c; bufp[1] = 0; putsyms(bufp); bufp++; if (hook && (*hook)(obufp)) { putsyms(bufp); #ifndef NEWAUTOCOMP bufp = eos(bufp); #else /* NEWAUTOCOMP */ /* pointer and cursor left where they were */ for (i = bufp; *i; ++i) putsyms("\b"); } else if (i > bufp) { char *s = i; /* erase rest of prior guess */ for (; i > bufp; --i) putsyms(" "); for (; s > bufp; --s) putsyms("\b"); #endif /* NEWAUTOCOMP */ } } else if(c == kill_char || c == '\177') { /* Robert Viduya */ /* this test last - @ might be the kill_char */ #ifndef NEWAUTOCOMP while(bufp != obufp) { bufp--; putsyms("\b \b"); } #else /* NEWAUTOCOMP */ for (; *bufp; ++bufp) putsyms(" "); for (; bufp != obufp; --bufp) putsyms("\b \b"); *bufp = 0; #endif /* NEWAUTOCOMP */ } else tty_nhbell(); } ttyDisplay->toplin = 2; /* nonempty, no --More-- required */ ttyDisplay->inread--; clear_nhwindow(WIN_MESSAGE); /* clean up after ourselves */ } void xwaitforspace(s) register const char *s; /* chars allowed besides return */ { register int c, x = ttyDisplay ? (int) ttyDisplay->dismiss_more : '\n'; morc = 0; while((c = tty_nhgetch()) != '\n') { if(iflags.cbreak) { if ((s && index(s,c)) || c == x) { morc = (char) c; break; } tty_nhbell(); } } } #endif /* OVL1 */ #ifdef OVL2 /* * Implement extended command completion by using this hook into * tty_getlin. Check the characters already typed, if they uniquely * identify an extended command, expand the string to the whole * command. * * Return TRUE if we've extended the string at base. Otherwise return FALSE. * Assumptions: * * + we don't change the characters that are already in base * + base has enough room to hold our string */ STATIC_OVL boolean ext_cmd_getlin_hook(base) char *base; { int oindex, com_index; com_index = -1; for (oindex = 0; extcmdlist[oindex].ef_txt != (char *)0; oindex++) { if (!strncmpi(base, extcmdlist[oindex].ef_txt, strlen(base))) { if (com_index == -1) /* no matches yet */ com_index = oindex; else /* more than 1 match */ return FALSE; } } if (com_index >= 0) { Strcpy(base, extcmdlist[com_index].ef_txt); return TRUE; } return FALSE; /* didn't match anything */ } /* * Read in an extended command, doing command line completion. We * stop when we have found enough characters to make a unique command. */ int tty_get_ext_cmd() { int i; char buf[BUFSZ]; if (iflags.extmenu) return extcmd_via_menu(); /* maybe a runtime option? */ /* hooked_tty_getlin("#", buf, flags.cmd_comp ? ext_cmd_getlin_hook : (getlin_hook_proc) 0); */ #ifdef REDO hooked_tty_getlin("#", buf, in_doagain ? (getlin_hook_proc)0 : ext_cmd_getlin_hook); #else hooked_tty_getlin("#", buf, ext_cmd_getlin_hook); #endif (void) mungspaces(buf); if (buf[0] == 0 || buf[0] == '\033') return -1; for (i = 0; extcmdlist[i].ef_txt != (char *)0; i++) if (!strcmpi(buf, extcmdlist[i].ef_txt)) break; #ifdef REDO if (!in_doagain) { int j; for (j = 0; buf[j]; j++) savech(buf[j]); savech('\n'); } #endif if (extcmdlist[i].ef_txt == (char *)0) { pline("%s: unknown extended command.", buf); i = -1; } return i; } #endif /* OVL2 */ #endif /* TTY_GRAPHICS */ /*getline.c*/ slashem-0.0.7E7F3/win/tty/termcap.c0000664000076400007640000007201310545462317015073 0ustar aliali/* 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. */ #include "hack.h" #if defined (TTY_GRAPHICS) && !defined(NO_TERMS) #include "wintty.h" #include "tcap.h" #ifdef MICROPORT_286_BUG #define Tgetstr(key) (tgetstr(key,tbuf)) #else #define Tgetstr(key) (tgetstr(key,&tbufptr)) #endif /* MICROPORT_286_BUG **/ static char * FDECL(s_atr2str, (int)); static char * FDECL(e_atr2str, (int)); void FDECL(cmov, (int, int)); void FDECL(nocmov, (int, int)); #if defined(TEXTCOLOR) && defined(TERMLIB) # ifdef OVLB # if !defined(UNIX) || !defined(TERMINFO) # ifndef TOS static void FDECL(analyze_seq, (char *, int *, int *)); # endif # endif static void NDECL(init_hilite); static void NDECL(kill_hilite); # endif /* OVLB */ #endif #ifdef OVLB /* (see tcap.h) -- nh_CM, nh_ND, nh_CD, nh_HI,nh_HE, nh_US,nh_UE, ul_hack */ struct tc_lcl_data tc_lcl_data = { 0, 0, 0, 0,0, 0,0, FALSE }; #endif /* OVLB */ STATIC_VAR char *HO, *CL, *CE, *UP, *XD, *BC, *SO, *SE, *TI, *TE; STATIC_VAR char *VS, *VE; STATIC_VAR char *ME; STATIC_VAR char *MR; #if 0 STATIC_VAR char *MB, *MH; STATIC_VAR char *MD; /* may already be in use below */ #endif #ifdef TERMLIB # ifdef TEXTCOLOR STATIC_VAR char *MD; # endif STATIC_VAR int SG; #ifdef OVLB STATIC_OVL char PC = '\0'; #else /* OVLB */ STATIC_DCL char PC; #endif /* OVLB */ STATIC_VAR char tbuf[512]; #endif #ifdef TEXTCOLOR # ifdef TOS const char *hilites[CLR_MAX]; /* terminal escapes for the various colors */ # else char NEARDATA *hilites[CLR_MAX]; /* terminal escapes for the various colors */ # endif #endif #ifdef OVLB static char *KS = (char *)0, *KE = (char *)0; /* keypad sequences */ static char nullstr[] = ""; #endif /* OVLB */ #if defined(ASCIIGRAPH) && !defined(NO_TERMS) extern boolean HE_resets_AS; #endif #ifndef TERMLIB STATIC_VAR char tgotobuf[20]; # ifdef TOS #define tgoto(fmt, x, y) (Sprintf(tgotobuf, fmt, y+' ', x+' '), tgotobuf) # else #define tgoto(fmt, x, y) (Sprintf(tgotobuf, fmt, y+1, x+1), tgotobuf) # endif #endif /* TERMLIB */ #ifndef MSDOS STATIC_DCL void NDECL(init_ttycolor); #ifdef VIDEOSHADES boolean colorflag = FALSE; /* colors are initialized */ char ttycolors[CLR_MAX]; #endif void init_ttycolor() { #ifdef VIDEOSHADES if (!colorflag) { ttycolors[CLR_RED] = CLR_RED; ttycolors[CLR_GREEN] = CLR_GREEN; ttycolors[CLR_BROWN] = CLR_BROWN; ttycolors[CLR_BLUE] = CLR_BLUE; ttycolors[CLR_MAGENTA] = CLR_MAGENTA; ttycolors[CLR_CYAN] = CLR_CYAN; ttycolors[CLR_GRAY] = CLR_GRAY; ttycolors[CLR_BLACK] = CLR_BLACK; ttycolors[CLR_ORANGE] = CLR_ORANGE; ttycolors[CLR_BRIGHT_GREEN] = CLR_BRIGHT_GREEN; ttycolors[CLR_YELLOW] = CLR_YELLOW; ttycolors[CLR_BRIGHT_BLUE] = CLR_BRIGHT_BLUE; ttycolors[CLR_BRIGHT_MAGENTA] = CLR_BRIGHT_MAGENTA; ttycolors[CLR_BRIGHT_CYAN] = CLR_BRIGHT_CYAN; ttycolors[CLR_WHITE] = CLR_WHITE; } #endif } # ifdef VIDEOSHADES static int FDECL(convert_uchars,(char *, uchar *, int)); /* * OPTIONS=videocolors:1-2-3-4-5-6-7-8-9-10-11-12-13-14-15 * Left to right assignments for: * red green brown blue magenta cyan gray black * orange br.green yellow br.blue br.mag br.cyan white */ int assign_videocolors(char *colorvals) { int i,icolor; uchar *tmpcolor; init_ttycolor(); i = strlen(colorvals); tmpcolor = (uchar *)alloc(i); if (convert_uchars(colorvals,tmpcolor,i) < 0) return FALSE; icolor = CLR_RED; for( i = 0; tmpcolor[i] != 0; ++i) { if (icolor <= CLR_WHITE) ttycolors[icolor++] = tmpcolor[i]; } colorflag = TRUE; free((genericptr_t)tmpcolor); return 1; } static int convert_uchars(bufp,list,size) char *bufp; /* current pointer */ uchar *list; /* return list */ int size; { unsigned int num = 0; int count = 0; list[count] = 0; while (1) { switch(*bufp) { case ' ': case '\0': case '\t': case '-': case '\n': if (num) { list[count++] = num; list[count] = 0; num = 0; } if ((count==size) || !*bufp) return count; bufp++; break; case '#': if (num) { list[count++] = num; list[count] = 0; } return count; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': num = num*10 + (*bufp-'0'); if (num > 15) return -1; bufp++; break; default: return -1; } } /*NOTREACHED*/ } # endif /* !MSDOS */ # endif /* VIDEOSHADES*/ #ifdef OVLB void tty_startup(wid, hgt) int *wid, *hgt; { register int i; #ifdef TERMLIB register const char *term; register char *tptr; char *tbufptr, *pc; #endif #ifdef TEXTCOLOR # ifndef MSDOS init_ttycolor(); # endif #endif #ifdef TERMLIB # ifdef VMS term = verify_termcap(); if (!term) # endif term = getenv("TERM"); # if defined(TOS) && defined(__GNUC__) if (!term) term = "builtin"; /* library has a default */ # endif if (!term) #endif #ifndef ANSI_DEFAULT error("Can't get TERM."); #else # ifdef TOS { CO = 80; LI = 25; TI = VS = VE = TE = nullstr; HO = "\033H"; CE = "\033K"; /* the VT52 termcap */ UP = "\033A"; nh_CM = "\033Y%c%c"; /* used with function tgoto() */ nh_ND = "\033C"; XD = "\033B"; BC = "\033D"; SO = "\033p"; SE = "\033q"; /* HI and HE will be updated in init_hilite if we're using color */ nh_HI = "\033p"; nh_HE = "\033q"; *wid = CO; *hgt = LI; CL = "\033E"; /* last thing set */ return; } # else /* TOS */ { # ifdef MICRO get_scr_size(); # ifdef CLIPPING if(CO < COLNO || LI < ROWNO+3) setclipped(); # endif # endif HO = "\033[H"; /* nh_CD = "\033[J"; */ CE = "\033[K"; /* the ANSI termcap */ # ifndef TERMLIB nh_CM = "\033[%d;%dH"; # else nh_CM = "\033[%i%d;%dH"; # endif UP = "\033[A"; nh_ND = "\033[C"; XD = "\033[B"; # ifdef MICRO /* backspaces are non-destructive */ BC = "\b"; # else BC = "\033[D"; # endif nh_HI = SO = "\033[1m"; nh_US = "\033[4m"; MR = "\033[7m"; TI = nh_HE = ME = SE = nh_UE = "\033[0m"; /* strictly, SE should be 2, and nh_UE should be 24, but we can't trust all ANSI emulators to be that complete. -3. */ # ifndef MICRO AS = "\016"; AE = "\017"; # endif TE = VS = VE = nullstr; # ifdef TEXTCOLOR for (i = 0; i < CLR_MAX / 2; i++) if (i != CLR_BLACK) { hilites[i|BRIGHT] = (char *) alloc(sizeof("\033[1;3%dm")); Sprintf(hilites[i|BRIGHT], "\033[1;3%dm", i); # ifndef VIDEOSHADES if (i != CLR_GRAY) # ifdef MICRO if (i == CLR_BLUE) hilites[CLR_BLUE] = hilites[CLR_BLUE|BRIGHT]; else # endif # endif { hilites[i] = (char *) alloc(sizeof("\033[0;3%dm")); Sprintf(hilites[i], "\033[0;3%dm", i); } } # endif *wid = CO; *hgt = LI; CL = "\033[2J"; /* last thing set */ return; } # endif /* TOS */ #endif /* ANSI_DEFAULT */ #ifdef TERMLIB tptr = (char *) alloc(1024); tbufptr = tbuf; if(!strncmp(term, "5620", 4)) flags.null = FALSE; /* this should be a termcap flag */ if(tgetent(tptr, term) < 1) { char buf[BUFSZ]; (void) strncpy(buf, term, (BUFSZ - 1) - (sizeof("Unknown terminal type: . "))); buf[BUFSZ-1] = '\0'; error("Unknown terminal type: %s.", term); } if ((pc = Tgetstr("pc")) != 0) PC = *pc; if(!(BC = Tgetstr("le"))) /* both termcap and terminfo use le */ # ifdef TERMINFO error("Terminal must backspace."); # else if(!(BC = Tgetstr("bc"))) { /* termcap also uses bc/bs */ # ifndef MINIMAL_TERM if(!tgetflag("bs")) error("Terminal must backspace."); # endif BC = tbufptr; tbufptr += 2; *BC = '\b'; } # endif # ifdef MINIMAL_TERM HO = (char *)0; # else HO = Tgetstr("ho"); # endif /* * LI and CO are set in ioctl.c via a TIOCGWINSZ if available. If * the kernel has values for either we should use them rather than * the values from TERMCAP ... */ # ifndef MICRO if (!CO) CO = tgetnum("co"); if (!LI) LI = tgetnum("li"); # else # if defined(TOS) && defined(__GNUC__) if (!strcmp(term, "builtin")) get_scr_size(); else { # endif CO = tgetnum("co"); LI = tgetnum("li"); if (!LI || !CO) /* if we don't override it */ get_scr_size(); # if defined(TOS) && defined(__GNUC__) } # endif # endif # ifdef CLIPPING if(CO < COLNO || LI < ROWNO+3) setclipped(); # endif nh_ND = Tgetstr("nd"); if(tgetflag("os")) error("NetHack can't have OS."); if(tgetflag("ul")) ul_hack = TRUE; CE = Tgetstr("ce"); UP = Tgetstr("up"); /* It seems that xd is no longer supported, and we should use a linefeed instead; unfortunately this requires resetting CRMOD, and many output routines will have to be modified slightly. Let's leave that till the next release. */ XD = Tgetstr("xd"); /* not: XD = Tgetstr("do"); */ if(!(nh_CM = Tgetstr("cm"))) { if(!UP && !HO) error("NetHack needs CM or UP or HO."); tty_raw_print("Playing NetHack on terminals without CM is suspect."); tty_wait_synch(); } SO = Tgetstr("so"); SE = Tgetstr("se"); nh_US = Tgetstr("us"); nh_UE = Tgetstr("ue"); SG = tgetnum("sg"); /* -1: not fnd; else # of spaces left by so */ if(!SO || !SE || (SG > 0)) SO = SE = nh_US = nh_UE = nullstr; TI = Tgetstr("ti"); TE = Tgetstr("te"); VS = VE = nullstr; # ifdef TERMINFO VS = Tgetstr("eA"); /* enable graphics */ # endif KS = Tgetstr("ks"); /* keypad start (special mode) */ KE = Tgetstr("ke"); /* keypad end (ordinary mode [ie, digits]) */ MR = Tgetstr("mr"); /* reverse */ # if 0 MB = Tgetstr("mb"); /* blink */ MD = Tgetstr("md"); /* boldface */ MH = Tgetstr("mh"); /* dim */ # endif ME = Tgetstr("me"); /* turn off all attributes */ if (!ME || (SE == nullstr)) ME = SE; /* default to SE value */ /* Get rid of padding numbers for nh_HI and nh_HE. Hope they * aren't really needed!!! nh_HI and nh_HE are outputted to the * pager as a string - so how can you send it NULs??? * -jsb */ nh_HI = (char *) alloc((unsigned)(strlen(SO)+1)); nh_HE = (char *) alloc((unsigned)(strlen(ME)+1)); i = 0; while (digit(SO[i])) i++; Strcpy(nh_HI, &SO[i]); i = 0; while (digit(ME[i])) i++; Strcpy(nh_HE, &ME[i]); AS = Tgetstr("as"); AE = Tgetstr("ae"); nh_CD = Tgetstr("cd"); # ifdef TEXTCOLOR MD = Tgetstr("md"); # endif # ifdef TEXTCOLOR # if defined(TOS) && defined(__GNUC__) if (!strcmp(term, "builtin") || !strcmp(term, "tw52") || !strcmp(term, "st52")) { init_hilite(); } # else init_hilite(); # endif # endif *wid = CO; *hgt = LI; if (!(CL = Tgetstr("cl"))) /* last thing set */ error("NetHack needs CL."); if ((int)(tbufptr - tbuf) > (int)(sizeof tbuf)) error("TERMCAP entry too big...\n"); free((genericptr_t)tptr); #endif /* TERMLIB */ } /* note: at present, this routine is not part of the formal window interface */ /* deallocate resources prior to final termination */ void tty_shutdown() { #if defined(TEXTCOLOR) && defined(TERMLIB) kill_hilite(); #endif /* we don't attempt to clean up individual termcap variables [yet?] */ return; } void tty_number_pad(state) int state; { switch (state) { case -1: /* activate keypad mode (escape sequences) */ if (KS && *KS) xputs(KS); break; case 1: /* activate numeric mode for keypad (digits) */ if (KE && *KE) xputs(KE); break; case 0: /* don't need to do anything--leave terminal as-is */ default: break; } } #ifdef TERMLIB extern void NDECL((*decgraphics_mode_callback)); /* defined in drawing.c */ static void NDECL(tty_decgraphics_termcap_fixup); /* We call this routine whenever DECgraphics mode is enabled, even if it has been previously set, in case the user manages to reset the fonts. The actual termcap fixup only needs to be done once, but we can't call xputs() from the option setting or graphics assigning routines, so this is a convenient hook. */ static void tty_decgraphics_termcap_fixup() { static char ctrlN[] = "\016"; static char ctrlO[] = "\017"; static char appMode[] = "\033="; static char numMode[] = "\033>"; /* these values are missing from some termcaps */ if (!AS) AS = ctrlN; /* ^N (shift-out [graphics font]) */ if (!AE) AE = ctrlO; /* ^O (shift-in [regular font]) */ if (!KS) KS = appMode; /* ESC= (application keypad mode) */ if (!KE) KE = numMode; /* ESC> (numeric keypad mode) */ /* * Select the line-drawing character set as the alternate font. * Do not select NA ASCII as the primary font since people may * reasonably be using the UK character set. */ if (iflags.DECgraphics) xputs("\033)0"); #ifdef PC9800 init_hilite(); #endif #if defined(ASCIIGRAPH) && !defined(NO_TERMS) /* some termcaps suffer from the bizarre notion that resetting video attributes should also reset the chosen character set */ { const char *nh_he = nh_HE, *ae = AE; int he_limit, ae_length; if (digit(*ae)) { /* skip over delay prefix, if any */ do ++ae; while (digit(*ae)); if (*ae == '.') { ++ae; if (digit(*ae)) ++ae; } if (*ae == '*') ++ae; } /* can't use nethack's case-insensitive strstri() here, and some old systems don't have strstr(), so use brute force substring search */ ae_length = strlen(ae), he_limit = strlen(nh_he); while (he_limit >= ae_length) { if (strncmp(nh_he, ae, ae_length) == 0) { HE_resets_AS = TRUE; break; } ++nh_he, --he_limit; } } #endif } #endif /* TERMLIB */ #if defined(ASCIIGRAPH) && defined(PC9800) extern void NDECL((*ibmgraphics_mode_callback)); /* defined in drawing.c */ #endif #ifdef PC9800 extern void NDECL((*ascgraphics_mode_callback)); /* defined in drawing.c */ static void NDECL(tty_ascgraphics_hilite_fixup); static void tty_ascgraphics_hilite_fixup() { register int c; for (c = 0; c < CLR_MAX / 2; c++) if (c != CLR_BLACK) { hilites[c|BRIGHT] = (char *) alloc(sizeof("\033[1;3%dm")); Sprintf(hilites[c|BRIGHT], "\033[1;3%dm", c); #ifndef VIDEOSHADES if (c != CLR_GRAY) { #endif hilites[c] = (char *) alloc(sizeof("\033[0;3%dm")); Sprintf(hilites[c], "\033[0;3%dm", c); #ifndef VIDEOSHADES } #endif } } #endif /* PC9800 */ void tty_start_screen() { xputs(TI); xputs(VS); #ifdef PC9800 if (!iflags.IBMgraphics && !iflags.DECgraphics) tty_ascgraphics_hilite_fixup(); /* set up callback in case option is not set yet but toggled later */ ascgraphics_mode_callback = tty_ascgraphics_hilite_fixup; # ifdef ASCIIGRAPH if (iflags.IBMgraphics) init_hilite(); /* set up callback in case option is not set yet but toggled later */ ibmgraphics_mode_callback = init_hilite; # endif #endif /* PC9800 */ #ifdef TERMLIB if (iflags.DECgraphics) tty_decgraphics_termcap_fixup(); /* set up callback in case option is not set yet but toggled later */ decgraphics_mode_callback = tty_decgraphics_termcap_fixup; #endif if (iflags.num_pad) tty_number_pad(1); /* make keypad send digits */ } void tty_end_screen() { clear_screen(); xputs(VE); xputs(TE); } /* Cursor movements */ #endif /* OVLB */ #ifdef OVL0 /* Note to OVLx tinkerers. The placement of this overlay controls the location of the function xputc(). This function is not currently in trampoli.[ch] files for what is deemed to be performance reasons. If this define is moved and or xputc() is taken out of the ROOT overlay, then action must be taken in trampoli.[ch]. */ void nocmov(x, y) int x,y; { if ((int) ttyDisplay->cury > y) { if(UP) { while ((int) ttyDisplay->cury > y) { /* Go up. */ xputs(UP); ttyDisplay->cury--; } } else if(nh_CM) { cmov(x, y); } else if(HO) { home(); tty_curs(BASE_WINDOW, x+1, y); } /* else impossible("..."); */ } else if ((int) ttyDisplay->cury < y) { if(XD) { while((int) ttyDisplay->cury < y) { xputs(XD); ttyDisplay->cury++; } } else if(nh_CM) { cmov(x, y); } else { while((int) ttyDisplay->cury < y) { xputc('\n'); ttyDisplay->curx = 0; ttyDisplay->cury++; } } } if ((int) ttyDisplay->curx < x) { /* Go to the right. */ if(!nh_ND) cmov(x, y); else /* bah */ /* should instead print what is there already */ while ((int) ttyDisplay->curx < x) { xputs(nh_ND); ttyDisplay->curx++; } } else if ((int) ttyDisplay->curx > x) { while ((int) ttyDisplay->curx > x) { /* Go to the left. */ xputs(BC); ttyDisplay->curx--; } } } void cmov(x, y) register int x, y; { xputs(tgoto(nh_CM, x, y)); ttyDisplay->cury = y; ttyDisplay->curx = x; } /* See note at OVLx ifdef above. xputc() is a special function. */ void xputc(c) #if defined(apollo) int c; #else char c; #endif { (void) putchar(c); } void xputs(s) const char *s; { # ifndef TERMLIB (void) fputs(s, stdout); # else # if defined(NHSTDC) || defined(ULTRIX_PROTO) tputs(s, 1, (int (*)())xputc); # else tputs(s, 1, xputc); # endif # endif } void cl_end() { if(CE) xputs(CE); else { /* no-CE fix - free after Harold Rynes */ /* this looks terrible, especially on a slow terminal but is better than nothing */ register int cx = ttyDisplay->curx+1; while(cx < CO) { xputc(' '); cx++; } tty_curs(BASE_WINDOW, (int)ttyDisplay->curx+1, (int)ttyDisplay->cury); } } #endif /* OVL0 */ #ifdef OVLB void clear_screen() { /* note: if CL is null, then termcap initialization failed, so don't attempt screen-oriented I/O during final cleanup. */ if (CL) { xputs(CL); home(); } } #endif /* OVLB */ #ifdef OVL0 void home() { if(HO) xputs(HO); else if(nh_CM) xputs(tgoto(nh_CM, 0, 0)); else tty_curs(BASE_WINDOW, 1, 0); /* using UP ... */ ttyDisplay->curx = ttyDisplay->cury = 0; } void standoutbeg() { if(SO) xputs(SO); } void standoutend() { if(SE) xputs(SE); } #if 0 /* if you need one of these, uncomment it (here and in extern.h) */ void revbeg() { if(MR) xputs(MR); } void boldbeg() { if(MD) xputs(MD); } void blinkbeg() { if(MB) xputs(MB); } void dimbeg() /* not in most termcap entries */ { if(MH) xputs(MH); } void m_end() { if(ME) xputs(ME); } #endif #endif /* OVL0 */ #ifdef OVLB void backsp() { xputs(BC); } void tty_nhbell() { if (flags.silent) return; (void) putchar('\007'); /* curx does not change */ (void) fflush(stdout); } #endif /* OVLB */ #ifdef OVL0 #ifdef ASCIIGRAPH void graph_on() { if (AS) xputs(AS); } void graph_off() { if (AE) xputs(AE); } #endif #endif /* OVL0 */ #ifdef OVL1 #if !defined(MICRO) # ifdef VMS static const short tmspc10[] = { /* from termcap */ 0, 2000, 1333, 909, 743, 666, 333, 166, 83, 55, 50, 41, 27, 20, 13, 10, 5 }; # else static const short tmspc10[] = { /* from termcap */ 0, 2000, 1333, 909, 743, 666, 500, 333, 166, 83, 55, 41, 20, 10, 5 }; # endif #endif /* delay 50 ms */ void tty_delay_output() { #if defined(MICRO) register int i; #endif #ifdef TIMED_DELAY if (flags.nap) { (void) fflush(stdout); msleep(50); /* sleep for 50 milliseconds */ return; } #endif #if defined(MICRO) /* simulate the delay with "cursor here" */ for (i = 0; i < 3; i++) { cmov(ttyDisplay->curx, ttyDisplay->cury); (void) fflush(stdout); } #else /* MICRO */ /* BUG: if the padding character is visible, as it is on the 5620 then this looks terrible. */ if(flags.null) # ifdef TERMINFO /* cbosgd!cbcephus!pds for SYS V R2 */ # ifdef NHSTDC tputs("$<50>", 1, (int (*)())xputc); # else tputs("$<50>", 1, xputc); # endif # else # if defined(NHSTDC) || defined(ULTRIX_PROTO) tputs("50", 1, (int (*)())xputc); # else tputs("50", 1, xputc); # endif # endif else if(ospeed > 0 && ospeed < SIZE(tmspc10) && nh_CM) { /* delay by sending cm(here) an appropriate number of times */ register int cmlen = strlen(tgoto(nh_CM, ttyDisplay->curx, ttyDisplay->cury)); register int i = 500 + tmspc10[ospeed]/2; while(i > 0) { cmov((int)ttyDisplay->curx, (int)ttyDisplay->cury); i -= cmlen*tmspc10[ospeed]; } } #endif /* MICRO */ } #endif /* OVL1 */ #ifdef OVLB void cl_eos() /* free after Robert Viduya */ { /* must only be called with curx = 1 */ if(nh_CD) xputs(nh_CD); else { 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); } } #if defined(TEXTCOLOR) && defined(TERMLIB) # if defined(UNIX) && defined(TERMINFO) /* * Sets up color highlighting, using terminfo(4) escape sequences. * * Having never seen a terminfo system without curses, we assume this * inclusion is safe. On systems with color terminfo, it should define * the 8 COLOR_FOOs, and avoid us having to guess whether this particular * terminfo uses BGR or RGB for its indexes. * * If we don't get the definitions, then guess. Original color terminfos * used BGR for the original Sf (setf, Standard foreground) codes, but * there was a near-total lack of user documentation, so some subsequent * terminfos, such as early Linux ncurses and SCO UNIX, used RGB. Possibly * as a result of the confusion, AF (setaf, ANSI Foreground) codes were * introduced, but this caused yet more confusion. Later Linux ncurses * have BGR Sf, RGB AF, and RGB COLOR_FOO, which appears to be the SVR4 * standard. We could switch the colors around when using Sf with ncurses, * which would help things on later ncurses and hurt things on early ncurses. * We'll try just preferring AF and hoping it always agrees with COLOR_FOO, * and falling back to Sf if AF isn't defined. * * In any case, treat black specially so we don't try to display black * characters on the assumed black background. */ /* `curses' is aptly named; various versions don't like these macros used elsewhere within nethack; fortunately they're not needed beyond this point, so we don't need to worry about reconstructing them after the header file inclusion. */ #undef delay_output #undef TRUE #undef FALSE #define m_move curses_m_move /* Some curses.h decl m_move(), not used here */ #include #if !defined(LINUX) && !defined(__FreeBSD__) extern char *tparm(); #endif # ifdef COLOR_BLACK /* trust include file */ #ifndef VIDEOSHADES #undef COLOR_BLACK #endif # else # ifndef _M_UNIX /* guess BGR */ #ifdef VIDEOSHADES #define COLOR_BLACK 0 #endif #define COLOR_BLUE 1 #define COLOR_GREEN 2 #define COLOR_CYAN 3 #define COLOR_RED 4 #define COLOR_MAGENTA 5 #define COLOR_YELLOW 6 #define COLOR_WHITE 7 # else /* guess RGB */ #define COLOR_RED 1 #define COLOR_GREEN 2 #define COLOR_YELLOW 3 #define COLOR_BLUE 4 #define COLOR_MAGENTA 5 #define COLOR_CYAN 6 #define COLOR_WHITE 7 # endif # endif #ifndef VIDEOSHADES #define COLOR_BLACK COLOR_BLUE #endif const int ti_map[8] = { COLOR_BLACK, COLOR_RED, COLOR_GREEN, COLOR_YELLOW, COLOR_BLUE, COLOR_MAGENTA, COLOR_CYAN, COLOR_WHITE }; static void init_hilite() { register int c; char *setf, *scratch; for (c = 0; c < SIZE(hilites); c++) hilites[c] = nh_HI; hilites[CLR_GRAY] = hilites[NO_COLOR] = (char *)0; if (tgetnum("Co") < 8 || ((setf = tgetstr("AF", (char **)0)) == (char *)0 && (setf = tgetstr("Sf", (char **)0)) == (char *)0)) return; for (c = 0; c < CLR_MAX / 2; c++) { scratch = tparm(setf, ti_map[c]); #ifndef VIDEOSHADES if (c != CLR_GRAY) { #endif hilites[c] = (char *) alloc(strlen(scratch) + 1); Strcpy(hilites[c], scratch); #ifndef VIDEOSHADES } #endif if (c != CLR_BLACK) { hilites[c|BRIGHT] = (char*) alloc(strlen(scratch)+strlen(MD)+1); Strcpy(hilites[c|BRIGHT], MD); Strcat(hilites[c|BRIGHT], scratch); } } } # else /* UNIX && TERMINFO */ # ifndef TOS /* find the foreground and background colors set by nh_HI or nh_HE */ static void analyze_seq (str, fg, bg) char *str; int *fg, *bg; { register int c, code; int len; # ifdef MICRO *fg = CLR_GRAY; *bg = CLR_BLACK; # else *fg = *bg = NO_COLOR; # endif c = (str[0] == '\233') ? 1 : 2; /* index of char beyond esc prefix */ len = strlen(str) - 1; /* length excluding attrib suffix */ if ((c != 1 && (str[0] != '\033' || str[1] != '[')) || (len - c) < 1 || str[len] != 'm') return; while (c < len) { if ((code = atoi(&str[c])) == 0) { /* reset */ /* this also catches errors */ # ifdef MICRO *fg = CLR_GRAY; *bg = CLR_BLACK; # else *fg = *bg = NO_COLOR; # endif } else if (code == 1) { /* bold */ *fg |= BRIGHT; # if 0 /* I doubt we'll ever resort to using blinking characters, unless we want a pulsing glow for something. But, in case we do... - 3. */ } else if (code == 5) { /* blinking */ *fg |= BLINK; } else if (code == 25) { /* stop blinking */ *fg &= ~BLINK; # endif } else if (code == 7 || code == 27) { /* reverse */ code = *fg & ~BRIGHT; *fg = *bg | (*fg & BRIGHT); *bg = code; } else if (code >= 30 && code <= 37) { /* hi_foreground RGB */ *fg = code - 30; } else if (code >= 40 && code <= 47) { /* hi_background RGB */ *bg = code - 40; } while (digit(str[++c])); c++; } } # endif /* * Sets up highlighting sequences, using ANSI escape sequences (highlight code * found in print.c). The nh_HI and nh_HE sequences (usually from SO) are * scanned to find foreground and background colors. */ static void init_hilite() { register int c; # ifdef TOS extern unsigned long tos_numcolors; /* in tos.c */ static char NOCOL[] = "\033b0", COLHE[] = "\033q\033b0"; if (tos_numcolors <= 2) { return; } /* Under TOS, the "bright" and "dim" colors are reversed. Moreover, * on the Falcon the dim colors are *really* dim; so we make most * of the colors the bright versions, with a few exceptions where * the dim ones look OK. */ hilites[0] = NOCOL; for (c = 1; c < SIZE(hilites); c++) { char *foo; foo = (char *) alloc(sizeof("\033b0")); if (tos_numcolors > 4) Sprintf(foo, "\033b%c", (c&~BRIGHT)+'0'); else Strcpy(foo, "\033b0"); hilites[c] = foo; } if (tos_numcolors == 4) { TI = "\033b0\033c3\033E\033e"; TE = "\033b3\033c0\033J"; nh_HE = COLHE; hilites[CLR_GREEN] = hilites[CLR_GREEN|BRIGHT] = "\033b2"; hilites[CLR_RED] = hilites[CLR_RED|BRIGHT] = "\033b1"; } else { sprintf(hilites[CLR_BROWN], "\033b%c", (CLR_BROWN^BRIGHT)+'0'); sprintf(hilites[CLR_GREEN], "\033b%c", (CLR_GREEN^BRIGHT)+'0'); TI = "\033b0\033c\017\033E\033e"; TE = "\033b\017\033c0\033J"; nh_HE = COLHE; hilites[CLR_WHITE] = hilites[CLR_BLACK] = NOCOL; hilites[NO_COLOR] = hilites[CLR_GRAY]; } # else /* TOS */ int backg, foreg, hi_backg, hi_foreg; for (c = 0; c < SIZE(hilites); c++) hilites[c] = nh_HI; hilites[CLR_GRAY] = hilites[NO_COLOR] = (char *)0; analyze_seq(nh_HI, &hi_foreg, &hi_backg); analyze_seq(nh_HE, &foreg, &backg); for (c = 0; c < SIZE(hilites); c++) /* avoid invisibility */ if ((backg & ~BRIGHT) != c) { # if defined(MICRO) && !defined(VIDEOSHADES) if (c == CLR_BLUE) continue; # endif if (c == foreg) hilites[c] = (char *)0; else if (c != hi_foreg || backg != hi_backg) { hilites[c] = (char *) alloc(sizeof("\033[%d;3%d;4%dm")); Sprintf(hilites[c], "\033[%d", !!(c & BRIGHT)); if ((c | BRIGHT) != (foreg | BRIGHT)) Sprintf(eos(hilites[c]), ";3%d", c & ~BRIGHT); if (backg != CLR_BLACK) Sprintf(eos(hilites[c]), ";4%d", backg & ~BRIGHT); Strcat(hilites[c], "m"); } } # if defined(MICRO) && !defined(VIDEOSHADES) /* brighten low-visibility colors */ hilites[CLR_BLUE] = hilites[CLR_BLUE|BRIGHT]; # endif # endif /* TOS */ } # endif /* UNIX */ static void kill_hilite() { # ifndef TOS register int c; for (c = 0; c < CLR_MAX / 2; c++) { if (hilites[c|BRIGHT] == hilites[c]) hilites[c|BRIGHT] = 0; if (hilites[c] && (hilites[c] != nh_HI)) free((genericptr_t) hilites[c]), hilites[c] = 0; if (hilites[c|BRIGHT] && (hilites[c|BRIGHT] != nh_HI)) free((genericptr_t) hilites[c|BRIGHT]), hilites[c|BRIGHT] = 0; } # endif return; } #endif /* TEXTCOLOR */ static char nulstr[] = ""; static char * s_atr2str(n) int n; { switch (n) { case ATR_ULINE: if(nh_US) return nh_US; case ATR_BOLD: case ATR_BLINK: #if defined(TERMLIB) && defined(TEXTCOLOR) if (MD) return MD; #endif return nh_HI; case ATR_INVERSE: return MR; } return nulstr; } static char * e_atr2str(n) int n; { switch (n) { case ATR_ULINE: if(nh_UE) return nh_UE; case ATR_BOLD: case ATR_BLINK: return nh_HE; case ATR_INVERSE: return ME; } return nulstr; } void term_start_attr(attr) int attr; { if (attr) { xputs(s_atr2str(attr)); } } void term_end_attr(attr) int attr; { if(attr) { xputs(e_atr2str(attr)); } } void term_start_raw_bold() { xputs(nh_HI); } void term_end_raw_bold() { xputs(nh_HE); } #ifdef TEXTCOLOR void term_end_color() { xputs(nh_HE); } void term_start_color(color) int color; { #ifdef VIDEOSHADES xputs(hilites[ttycolors[color]]); #else xputs(hilites[color]); #endif } int 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 QT_GRAPHICS /* XXX has_color() should be added to windowprocs */ if (windowprocs.name != NULL && !strcmpi(windowprocs.name, "Qt")) return TRUE; #endif #ifdef AMII_GRAPHICS /* hilites[] not used */ return iflags.use_color; #endif return hilites[color] != (char *)0; } #endif /* TEXTCOLOR */ #endif /* OVLB */ #endif /* TTY_GRAPHICS */ /*termcap.c*/ slashem-0.0.7E7F3/win/tty/topl.c0000664000076400007640000003452310545462317014422 0ustar aliali/* 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. */ #include "hack.h" #ifdef TTY_GRAPHICS #include "tcap.h" #include "wintty.h" #include #ifdef __WATCOMC__ /* for delay() */ #include #endif #ifndef C /* this matches src/cmd.c */ #define C(c) (0x1f & (c)) #endif STATIC_DCL void FDECL(redotoplin, (const char*)); STATIC_DCL void FDECL(topl_putsym, (CHAR_P)); STATIC_DCL void NDECL(remember_topl); STATIC_DCL void FDECL(removetopl, (int)); #ifdef OVLB #ifdef BORG extern char borg_on; #endif int tty_doprev_message() { /*WAC merged in NH340 prevwindow - add reverse ordering?*/ winid tmpwin; register struct WinDesc *cw = wins[WIN_MESSAGE]; winid prevmsg_win; int i; if ((iflags.prevmsg_window != 's') && !ttyDisplay->inread) { /* not single */ if(iflags.prevmsg_window == 'f') { /* full */ prevmsg_win = create_nhwindow(NHW_MENU); putstr(prevmsg_win, 0, "Message History"); putstr(prevmsg_win, 0, ""); cw->maxcol = cw->maxrow; 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 if (iflags.prevmsg_window == 'c') { /* combination */ do { morc = 0; if (cw->maxcol == cw->maxrow) { ttyDisplay->dismiss_more = C('p'); /* allowed at --More-- */ redotoplin(toplines); cw->maxcol--; if (cw->maxcol < 0) cw->maxcol = cw->rows-1; if (!cw->data[cw->maxcol]) cw->maxcol = cw->maxrow; } else if (cw->maxcol == (cw->maxrow - 1)){ ttyDisplay->dismiss_more = C('p'); /* allowed at --More-- */ 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; } else { prevmsg_win = create_nhwindow(NHW_MENU); putstr(prevmsg_win, 0, "Message History"); putstr(prevmsg_win, 0, ""); cw->maxcol = cw->maxrow; 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); } } while (morc == C('p')); ttyDisplay->dismiss_more = 0; } else { /* reversed */ morc = 0; prevmsg_win = create_nhwindow(NHW_MENU); putstr(prevmsg_win, 0, "Message History"); putstr(prevmsg_win, 0, ""); putstr(prevmsg_win, 0, toplines); cw->maxcol=cw->maxrow-1; if(cw->maxcol < 0) cw->maxcol = cw->rows-1; do { putstr(prevmsg_win, 0, 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 (cw->maxcol != cw->maxrow); display_nhwindow(prevmsg_win, TRUE); destroy_nhwindow(prevmsg_win); cw->maxcol = cw->maxrow; ttyDisplay->dismiss_more = 0; } } else if(iflags.prevmsg_window == 's') { /* single */ 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; } #if 0 ttyDisplay->dismiss_more = C('p'); /* allowed at --More-- */ do { morc = 0; if (cw->maxcol == cw->maxrow) { redotoplin(toplines); cw->maxcol--; if (cw->maxcol < 0) cw->maxcol = cw->rows-1; if (!cw->data[cw->maxcol]) cw->maxcol = cw->maxrow; } else if (cw->data[cw->maxcol]) { /*WAC Show all the history in a window*/ tmpwin = create_nhwindow(NHW_MENU); putstr(tmpwin, ATR_BOLD, "Message History"); putstr(tmpwin, 0, ""); putstr(tmpwin, 0, toplines); do { if (!cw->data[cw->maxcol]) break; putstr(tmpwin, 0, 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 (cw->maxcol != cw->maxrow); display_nhwindow(tmpwin, TRUE); destroy_nhwindow(tmpwin); cw->maxcol = cw->maxrow; } } while (morc == C('p')); ttyDisplay->dismiss_more = 0; #endif return 0; } #endif /* OVLB */ #ifdef OVL1 STATIC_OVL void redotoplin(str) const char *str; { int otoplin = ttyDisplay->toplin; home(); if(*str & 0x80) { /* kludge for the / command, the only time we ever want a */ /* graphics character on the top line */ g_putch((int)*str++); ttyDisplay->curx++; } end_glyphout(); /* in case message printed during graphics output */ putsyms(str); cl_end(); ttyDisplay->toplin = 1; if(ttyDisplay->cury && otoplin != 3) more(); } STATIC_OVL void remember_topl() { register struct WinDesc *cw = wins[WIN_MESSAGE]; int idx = cw->maxrow; unsigned len = strlen(toplines) + 1; if (len > (unsigned)cw->datlen[idx]) { if (cw->data[idx]) free(cw->data[idx]); len += (8 - (len & 7)); /* pad up to next multiple of 8 */ cw->data[idx] = (char *)alloc(len); cw->datlen[idx] = (short)len; } Strcpy(cw->data[idx], toplines); cw->maxcol = cw->maxrow = (idx + 1) % cw->rows; } void addtopl(s) const char *s; { register struct WinDesc *cw = wins[WIN_MESSAGE]; tty_curs(BASE_WINDOW,cw->curx+1,cw->cury); putsyms(s); cl_end(); ttyDisplay->toplin = 1; } #endif /* OVL1 */ #ifdef OVL2 void more() { struct WinDesc *cw = wins[WIN_MESSAGE]; /* avoid recursion -- only happens from interrupts */ if(ttyDisplay->inmore++) return; if(ttyDisplay->toplin) { tty_curs(BASE_WINDOW, cw->curx+1, cw->cury); if(cw->curx >= CO - 8) topl_putsym('\n'); } if(flags.standout) standoutbeg(); putsyms(defmorestr); if(flags.standout) standoutend(); #ifdef BORG if (borg_on) { #ifdef __WATCOMC__ delay(100); #else delay_output(); delay_output(); /* 100ms wait */ #endif } else { xwaitforspace("\033 "); } #else xwaitforspace("\033 "); #endif if(morc == '\033') cw->flags |= WIN_STOP; if(ttyDisplay->toplin && cw->cury) { docorner(1, cw->cury+1); cw->curx = cw->cury = 0; home(); } else if(morc == '\033') { cw->curx = cw->cury = 0; home(); cl_end(); } ttyDisplay->toplin = 0; ttyDisplay->inmore = 0; } void update_topl(bp) register const char *bp; { register char *tl, *otl; register int n0; int notdied = 1; struct WinDesc *cw = wins[WIN_MESSAGE]; /* 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)) && cw->cury == 0 && n0 + (int)strlen(toplines) + 3 < CO-8 && /* room for --More-- */ (notdied = strncmp(bp, "You die", 7))) { Strcat(toplines, " "); Strcat(toplines, bp); cw->curx += 2; 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 */ cw->curx = cw->cury = 0;/* from home--cls() & docorner(1,n) */ } } remember_topl(); (void) strncpy(toplines, bp, TBUFSZ); toplines[TBUFSZ - 1] = 0; for(tl = toplines; n0 >= CO; ){ otl = tl; for(tl+=CO-1; tl != otl && !isspace(*tl); --tl) ; if(tl == otl) { /* Eek! A huge token. Try splitting after it. */ tl = index(otl, ' '); if (!tl) break; /* No choice but to spit it out whole. */ } *tl++ = '\n'; n0 = strlen(tl); } if(!notdied) cw->flags &= ~WIN_STOP; if(!(cw->flags & WIN_STOP)) redotoplin(toplines); } STATIC_OVL void topl_putsym(c) char c; { register struct WinDesc *cw = wins[WIN_MESSAGE]; if(cw == (struct WinDesc *) 0) panic("Putsym window MESSAGE nonexistant"); switch(c) { case '\b': if(ttyDisplay->curx == 0 && ttyDisplay->cury > 0) tty_curs(BASE_WINDOW, CO, (int)ttyDisplay->cury-1); backsp(); ttyDisplay->curx--; cw->curx = ttyDisplay->curx; return; case '\n': cl_end(); ttyDisplay->curx = 0; ttyDisplay->cury++; cw->cury = ttyDisplay->cury; #ifdef WIN32CON (void) putchar(c); #endif break; default: if(ttyDisplay->curx == CO-1) topl_putsym('\n'); /* 1 <= curx <= CO; avoid CO */ #ifdef WIN32CON (void) putchar(c); #endif ttyDisplay->curx++; } cw->curx = ttyDisplay->curx; if(cw->curx == 0) cl_end(); #ifndef WIN32CON (void) putchar(c); #endif } void putsyms(str) const char *str; { while(*str) topl_putsym(*str++); } STATIC_OVL void removetopl(n) register int n; { /* assume addtopl() has been done, so ttyDisplay->toplin is already set */ while (n-- > 0) putsyms("\b \b"); } extern char erase_char; /* from xxxtty.c; don't need kill_char */ char tty_yn_function(query,resp, def) const char *query,*resp; char def; /* * Generic yes/no function. 'def' is the default (returned by space or * return; 'esc' returns 'q', or 'n', or the default, depending on * what's in the string. The 'query' string is printed before the user * is asked about the string. * If resp is NULL, any single character is accepted and returned. * If not-NULL, only characters in it are allowed (exceptions: the * quitchars are always allowed, and if it contains '#' then digits * are allowed); if it includes an , anything beyond that won't * be shown in the prompt to the user but will be acceptable as input. */ { register char q; char rtmp[40]; boolean digit_ok, allow_num; struct WinDesc *cw = wins[WIN_MESSAGE]; boolean doprev = 0; char prompt[QBUFSZ]; if(ttyDisplay->toplin == 1 && !(cw->flags & WIN_STOP)) more(); cw->flags &= ~WIN_STOP; ttyDisplay->toplin = 3; /* special prompt state */ ttyDisplay->inread++; if (resp) { char *rb, respbuf[QBUFSZ]; allow_num = (index(resp, '#') != 0); Strcpy(respbuf, resp); /* any acceptable responses that follow aren't displayed */ if ((rb = index(respbuf, '\033')) != 0) *rb = '\0'; Sprintf(prompt, "%s [%s] ", query, respbuf); if (def) Sprintf(eos(prompt), "(%c) ", def); pline("%s", prompt); } else { pline("%s ", query); q = readchar(); goto clean_up; } do { /* loop until we get valid input */ q = lowc(readchar()); if (q == '\020') { /* ctrl-P */ if (iflags.prevmsg_window != 's') { 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) { /* BUG[?]: this probably ought to check whether the character which has just been read is an acceptable response; if so, skip the reprompt and use it. */ tty_clear_nhwindow(WIN_MESSAGE); cw->maxcol = cw->maxrow; doprev = 0; addtopl(prompt); q = '\0'; /* force another loop iteration */ continue; } digit_ok = allow_num && digit(q); if (q == '\033') { if (index(resp, 'q')) q = 'q'; else if (index(resp, 'n')) q = 'n'; else q = def; break; } else if (index(quitchars, q)) { q = def; break; } if (!index(resp, q) && !digit_ok) { tty_nhbell(); q = (char)0; } else if (q == '#' || digit_ok) { char z, digit_string[2]; int n_len = 0; long value = 0; addtopl("#"), n_len++; digit_string[1] = '\0'; if (q != '#') { digit_string[0] = q; addtopl(digit_string), n_len++; value = q - '0'; q = '#'; } do { /* loop until we get a non-digit */ z = lowc(readchar()); if (digit(z)) { value = (10 * value) + (z - '0'); if (value < 0) break; /* overflow: try again */ digit_string[0] = z; addtopl(digit_string), n_len++; } else if (z == 'y' || index(quitchars, z)) { if (z == '\033') value = -1; /* abort */ z = '\n'; /* break */ } else if (z == erase_char || z == '\b') { if (n_len <= 1) { value = -1; break; } else { value /= 10; removetopl(1), n_len--; } } else { value = -1; /* abort */ tty_nhbell(); break; } } while (z != '\n'); if (value > 0) yn_number = value; else if (value == 0) q = 'n'; /* 0 => "no" */ else { /* remove number from top line, then try again */ removetopl(n_len), n_len = 0; q = '\0'; } } } while(!q); if (q != '#') { Sprintf(rtmp, "%c", q); addtopl(rtmp); } clean_up: ttyDisplay->inread--; ttyDisplay->toplin = 2; if (ttyDisplay->intr) ttyDisplay->intr--; if(wins[WIN_MESSAGE]->cury) tty_clear_nhwindow(WIN_MESSAGE); return q; } #endif /* OVL2 */ #endif /* TTY_GRAPHICS */ /*topl.c*/ slashem-0.0.7E7F3/win/tty/wintty.c0000664000076400007640000021753210545462317015005 0ustar aliali/* SCCS Id: @(#)wintty.c 3.4 2002/09/27 */ /* Copyright (c) David Cohrs, 1991 */ /* NetHack may be freely redistributed. See license for details. */ /* * Neither a standard out nor character-based control codes should be * part of the "tty look" windowing implementation. * h+ 930227 */ #include "hack.h" #include "dlb.h" #ifdef SHORT_FILENAMES #include "patchlev.h" #else #include "patchlevel.h" #endif #ifdef TTY_GRAPHICS #ifdef MAC # define MICRO /* The Mac is a MICRO only for this file, not in general! */ # ifdef THINK_C extern void msmsg(const char *,...); # endif #endif #ifndef NO_TERMS #include "tcap.h" #endif #include "wintty.h" #ifdef CLIPPING /* might want SIGWINCH */ # if defined(BSD) || defined(ULTRIX) || defined(AIX_31) || defined(_BULL_SOURCE) #include # endif #endif extern char mapped_menu_cmds[]; /* from options.c */ /* Interface definition, for windows.c */ struct window_procs tty_procs = { "tty", #ifdef MSDOS WC_TILED_MAP|WC_ASCII_MAP| #endif #if defined(WIN32CON) WC_MOUSE_SUPPORT| #endif WC_COLOR|WC_HILITE_PET|WC_INVERSE|WC_EIGHT_BIT_IN, 0L, tty_init_nhwindows, tty_player_selection, tty_askname, tty_get_nh_event, tty_exit_nhwindows, tty_suspend_nhwindows, tty_resume_nhwindows, tty_create_nhwindow, tty_clear_nhwindow, tty_display_nhwindow, tty_destroy_nhwindow, tty_curs, tty_putstr, tty_display_file, tty_start_menu, tty_add_menu, tty_end_menu, tty_select_menu, tty_message_menu, tty_update_inventory, tty_mark_synch, tty_wait_synch, #ifdef CLIPPING tty_cliparound, #endif #ifdef POSITIONBAR tty_update_positionbar, #endif tty_print_glyph, tty_raw_print, tty_raw_print_bold, tty_nhgetch, tty_nh_poskey, tty_nhbell, tty_doprev_message, tty_yn_function, tty_getlin, tty_get_ext_cmd, tty_number_pad, tty_delay_output, #ifdef CHANGE_COLOR /* the Mac uses a palette device */ tty_change_color, #ifdef MAC tty_change_background, set_tty_font_name, #endif tty_get_color_string, #endif /* other defs that really should go away (they're tty specific) */ tty_start_screen, tty_end_screen, genl_outrip, #if defined(WIN32CON) nttty_preference_update, #else genl_preference_update, #endif }; static int maxwin = 0; /* number of windows in use */ winid BASE_WINDOW; struct WinDesc *wins[MAXWIN]; struct DisplayDesc *ttyDisplay; /* the tty display descriptor */ extern void FDECL(cmov, (int,int)); /* from termcap.c */ extern void FDECL(nocmov, (int,int)); /* from termcap.c */ #if defined(UNIX) || defined(VMS) static char obuf[BUFSIZ]; /* BUFSIZ is defined in stdio.h */ #endif static char winpanicstr[] = "Bad window id %d"; char defmorestr[] = "--More--"; #ifdef MENU_COLOR extern struct menucoloring *menu_colorings; #endif #ifdef CLIPPING # if defined(USE_TILES) && defined(MSDOS) boolean clipping = FALSE; /* clipping on? */ int clipx = 0, clipxmax = 0; # else static boolean clipping = FALSE; /* clipping on? */ static int clipx = 0, clipxmax = 0; # endif static int clipy = 0, clipymax = 0; #endif /* CLIPPING */ #if defined(USE_TILES) && defined(MSDOS) extern void FDECL(adjust_cursor_flags, (struct WinDesc *)); #endif #if defined(ASCIIGRAPH) && !defined(NO_TERMS) boolean GFlag = FALSE; boolean HE_resets_AS; /* see termcap.c */ #endif #if defined(MICRO) || defined(WIN32CON) static const char to_continue[] = "to continue"; #define getret() getreturn(to_continue) #else STATIC_DCL void NDECL(getret); #endif STATIC_DCL void FDECL(erase_menu_or_text, (winid, struct WinDesc *, BOOLEAN_P)); STATIC_DCL void FDECL(free_window_info, (struct WinDesc *, BOOLEAN_P)); STATIC_DCL void FDECL(dmore,(struct WinDesc *, const char *)); STATIC_DCL void FDECL(set_item_state, (winid, int, tty_menu_item *)); STATIC_DCL void FDECL(set_all_on_page, (winid,tty_menu_item *,tty_menu_item *)); STATIC_DCL void FDECL(unset_all_on_page, (winid,tty_menu_item *,tty_menu_item *)); STATIC_DCL void FDECL(invert_all_on_page, (winid,tty_menu_item *,tty_menu_item *, CHAR_P)); STATIC_DCL void FDECL(invert_all, (winid,tty_menu_item *,tty_menu_item *, CHAR_P)); STATIC_DCL void FDECL(process_menu_window, (winid,struct WinDesc *)); STATIC_DCL void FDECL(process_text_window, (winid,struct WinDesc *)); STATIC_DCL tty_menu_item *FDECL(reverse, (tty_menu_item *)); STATIC_DCL const char * FDECL(compress_str, (const char *)); STATIC_DCL void FDECL(tty_putsym, (winid, int, int, CHAR_P)); static char *FDECL(copy_of, (const char *)); STATIC_DCL void FDECL(bail, (const char *)); /* __attribute__((noreturn)) */ STATIC_DCL int FDECL(tty_role_select, (char *, char *)); STATIC_DCL int FDECL(tty_race_select, (char *, char *)); /* * A string containing all the default commands -- to add to a list * of acceptable inputs. */ static const char default_menu_cmds[] = { MENU_FIRST_PAGE, MENU_LAST_PAGE, MENU_NEXT_PAGE, MENU_PREVIOUS_PAGE, MENU_SELECT_ALL, MENU_UNSELECT_ALL, MENU_INVERT_ALL, MENU_SELECT_PAGE, MENU_UNSELECT_PAGE, MENU_INVERT_PAGE, 0 /* null terminator */ }; /* clean up and quit */ STATIC_OVL void bail(mesg) const char *mesg; { clearlocks(); tty_exit_nhwindows(mesg); terminate(EXIT_SUCCESS); /*NOTREACHED*/ } #if defined(SIGWINCH) && defined(CLIPPING) STATIC_OVL void winch() { int oldLI = LI, oldCO = CO, i; register struct WinDesc *cw; getwindowsz(); if((oldLI != LI || oldCO != CO) && ttyDisplay) { ttyDisplay->rows = LI; ttyDisplay->cols = CO; cw = wins[BASE_WINDOW]; cw->rows = ttyDisplay->rows; cw->cols = ttyDisplay->cols; if(iflags.window_inited) { cw = wins[WIN_MESSAGE]; cw->curx = cw->cury = 0; tty_destroy_nhwindow(WIN_STATUS); WIN_STATUS = tty_create_nhwindow(NHW_STATUS); if(u.ux) { #ifdef CLIPPING if(CO < COLNO || LI < ROWNO+3) { setclipped(); tty_cliparound(u.ux, u.uy); } else { clipping = FALSE; clipx = clipy = 0; } #endif i = ttyDisplay->toplin; ttyDisplay->toplin = 0; docrt(); bot(); ttyDisplay->toplin = i; flush_screen(1); if(i) { addtopl(toplines); } else for(i=WIN_INVEN; i < MAXWIN; i++) if(wins[i] && wins[i]->active) { /* cop-out */ addtopl("Press Return to continue: "); break; } (void) fflush(stdout); if(i < 2) flush_screen(1); } } } } #endif /*ARGSUSED*/ void tty_init_nhwindows(argcp,argv) int* argcp; char** argv; { #if defined(MAC_MPW) # pragma unused(argcp,argv) #endif int wid, hgt; /* * Remember tty modes, to be restored on exit. * * gettty() must be called before tty_startup() * due to ordering of LI/CO settings * tty_startup() must be called before initoptions() * due to ordering of graphics settings */ #if defined(UNIX) || defined(VMS) setbuf(stdout,obuf); #endif gettty(); /* to port dependant tty setup */ tty_startup(&wid, &hgt); setftty(); /* calls start_screen */ /* set up tty descriptor */ ttyDisplay = (struct DisplayDesc*) alloc(sizeof(struct DisplayDesc)); ttyDisplay->toplin = 0; ttyDisplay->rows = hgt; ttyDisplay->cols = wid; ttyDisplay->curx = ttyDisplay->cury = 0; ttyDisplay->inmore = ttyDisplay->inread = ttyDisplay->intr = 0; ttyDisplay->dismiss_more = 0; #ifdef TEXTCOLOR ttyDisplay->color = NO_COLOR; #endif ttyDisplay->attrs = 0; /* set up the default windows */ BASE_WINDOW = tty_create_nhwindow(NHW_BASE); wins[BASE_WINDOW]->active = 1; ttyDisplay->lastwin = WIN_ERR; #if defined(SIGWINCH) && defined(CLIPPING) (void) signal(SIGWINCH, winch); #endif /* add one a space forward menu command alias */ add_menu_cmd_alias(' ', MENU_NEXT_PAGE); tty_clear_nhwindow(BASE_WINDOW); tty_putstr(BASE_WINDOW, 0, ""); tty_putstr(BASE_WINDOW, 0, COPYRIGHT_BANNER_A); tty_putstr(BASE_WINDOW, 0, COPYRIGHT_BANNER_B); tty_putstr(BASE_WINDOW, 0, COPYRIGHT_BANNER_C); tty_putstr(BASE_WINDOW, 0, ""); tty_display_nhwindow(BASE_WINDOW, FALSE); } void tty_player_selection() { 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; 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) { /* 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 { if (tty_role_select(pbuf, plbuf) < 0) goto give_up; } (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' */ if (tty_race_select(pbuf, plbuf) < 0) goto give_up; } (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); } STATIC_OVL int tty_role_select(pbuf, plbuf) char * pbuf; char * plbuf; { int i, n; char thisch, lastch = 0; char rolenamebuf[QBUFSZ]; winid win; anything any; menu_item *selected = 0; 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) { free((genericptr_t) selected), selected = 0; return (-1); /* Selected quit */ } flags.initrole = selected[0].item.a_int - 1; free((genericptr_t) selected), selected = 0; return (flags.initrole); } STATIC_OVL int tty_race_select(pbuf, plbuf) char * pbuf; char * plbuf; { int i, k, n; char thisch, lastch; winid win; anything any; menu_item *selected = 0; /* 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 */ thisch = lowc(races[i].noun[0]); if (thisch == lastch) thisch = highc(thisch); add_menu(win, NO_GLYPH, &any, thisch, 0, ATR_NONE, races[i].noun, MENU_UNSELECTED); lastch = thisch; } 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) return(-1); /* Selected quit */ k = selected[0].item.a_int - 1; free((genericptr_t) selected), selected = 0; } flags.initrace = k; return (k); #if 0 /* This version deals with more than 2 races per letter */ int i, k, n, choicelet = 0; char thisch; char choicestr[3]; winid win; anything any; menu_item *selected = 0; char pbuf[QBUFSZ]; /* 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) do { 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) && (!choicelet || !strncmpi(races[i].noun, choicestr, choicelet))) { thisch = lowc(races[i].noun[choicelet]); any.a_int = i+1; /* must be non-zero */ add_menu(win, NO_GLYPH, &any, thisch, 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, "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", roles[flags.initrole].name.m); 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) { free((genericptr_t) selected), selected = 0; if (!choicelet) { return (-1); /* Selected quit */ } else { choicelet--; n = 2; /* there are at least 2 */ continue; } } else { k = selected[0].item.a_int - 1; free((genericptr_t) selected), selected = 0; choicestr[choicelet] = races[k].noun[choicelet]; choicelet++; } /* Check whether there are at least 2 choices left */ n = 0; for (i = 0; (races[i].noun && (n <= 1)); i++) if (ok_race(flags.initrole, i, flags.initgend, flags.initalign) && (!choicelet || !strncmpi(races[i].noun, choicestr, choicelet))) n++; } while (n > 1); flags.initrace = k; return (k); #endif } /* * plname is filled either by an option (-u Player or -uPlayer) or * explicitly (by being the wizard) or by askname. * It may still contain a suffix denoting the role, etc. * Always called after init_nhwindows() and before display_gamewindows(). */ void tty_askname() { static char who_are_you[] = "Who are you? "; register int c, ct, tryct = 0; tty_putstr(BASE_WINDOW, 0, ""); do { if (++tryct > 1) { if (tryct > 10) bail("Giving up after 10 tries.\n"); tty_curs(BASE_WINDOW, 1, wins[BASE_WINDOW]->cury - 1); tty_putstr(BASE_WINDOW, 0, "Enter a name for your character..."); /* erase previous prompt (in case of ESC after partial response) */ tty_curs(BASE_WINDOW, 1, wins[BASE_WINDOW]->cury), cl_end(); } tty_putstr(BASE_WINDOW, 0, who_are_you); tty_curs(BASE_WINDOW, (int)(sizeof who_are_you), wins[BASE_WINDOW]->cury - 1); ct = 0; while((c = tty_nhgetch()) != '\n') { if(c == EOF) error("End of input\n"); if (c == '\033') { ct = 0; break; } /* continue outer loop */ #if defined(WIN32CON) if (c == '\003') bail("^C abort.\n"); #endif /* some people get confused when their erase char is not ^H */ if (c == '\b' || c == '\177') { if(ct) { ct--; #ifdef WIN32CON ttyDisplay->curx--; #endif #if defined(MICRO) || defined(WIN32CON) # if defined(WIN32CON) || defined(MSDOS) backsp(); /* \b is visible on NT */ (void) putchar(' '); backsp(); # else msmsg("\b \b"); # endif #else (void) putchar('\b'); (void) putchar(' '); (void) putchar('\b'); #endif } continue; } #if defined(UNIX) || defined(VMS) if(c != '-' && c != '@') if(c < 'A' || (c > 'Z' && c < 'a') || c > 'z') c = '_'; #endif if (ct < (int)(sizeof plname) - 1) { #if defined(MICRO) # if defined(MSDOS) if (iflags.grmode) { (void) putchar(c); } else # endif msmsg("%c", c); #else (void) putchar(c); #endif plname[ct++] = c; #ifdef WIN32CON ttyDisplay->curx++; #endif } } plname[ct] = 0; } while (ct == 0); /* move to next line to simulate echo of user's */ tty_curs(BASE_WINDOW, 1, wins[BASE_WINDOW]->cury + 1); } void tty_get_nh_event() { return; } #if !defined(MICRO) && !defined(WIN32CON) STATIC_OVL void getret() { xputs("\n"); if(flags.standout) standoutbeg(); xputs("Hit "); xputs(iflags.cbreak ? "space" : "return"); xputs(" to continue: "); if(flags.standout) standoutend(); xwaitforspace(" "); } #endif void tty_suspend_nhwindows(str) const char *str; { settty(str); /* calls end_screen, perhaps raw_print */ if (!str) tty_raw_print(""); /* calls fflush(stdout) */ } void tty_resume_nhwindows() { gettty(); setftty(); /* calls start_screen */ docrt(); } void tty_exit_nhwindows(str) const char *str; { winid i; tty_suspend_nhwindows(str); /* Just forget any windows existed, since we're about to exit anyway. * Disable windows to avoid calls to window routines. */ for(i=0; itype = type; newwin->flags = 0; newwin->active = FALSE; newwin->curx = newwin->cury = 0; newwin->morestr = 0; newwin->mlist = (tty_menu_item *) 0; newwin->plist = (tty_menu_item **) 0; newwin->npages = newwin->plist_size = newwin->nitems = newwin->how = 0; switch(type) { case NHW_BASE: /* base window, used for absolute movement on the screen */ newwin->offx = newwin->offy = 0; newwin->rows = ttyDisplay->rows; newwin->cols = ttyDisplay->cols; newwin->maxrow = newwin->maxcol = 0; break; case NHW_MESSAGE: /* message window, 1 line long, very wide, top of screen */ newwin->offx = newwin->offy = 0; /* sanity check */ if(iflags.msg_history < 20) iflags.msg_history = 20; else if(iflags.msg_history > 60) iflags.msg_history = 60; newwin->maxrow = newwin->rows = iflags.msg_history; newwin->maxcol = newwin->cols = 0; break; case NHW_STATUS: /* status window, 2 lines long, full width, bottom of screen */ /* WAC make it a variable lines long */ newwin->offx = 0; #if defined(USE_TILES) && defined(MSDOS) /* We're in VGA 640x480 mode. There's room for 3 lines */ if (iflags.grmode) { newwin->offy = ttyDisplay->rows-3; } else #endif newwin->offy = min((int)ttyDisplay->rows-2, ROWNO+1); /* newwin->rows = newwin->maxrow = 2; */ newwin->rows = newwin->maxrow = ((ttyDisplay->rows - newwin->offy) > 2) ? 3 : 2; newwin->cols = newwin->maxcol = min(ttyDisplay->cols, COLNO); break; case NHW_MAP: /* map window, ROWNO lines long, full width, below message window */ newwin->offx = 0; newwin->offy = 1; newwin->rows = ROWNO; newwin->cols = COLNO; newwin->maxrow = 0; /* no buffering done -- let gbuf do it */ newwin->maxcol = 0; break; case NHW_MENU: case NHW_TEXT: /* inventory/menu window, variable length, full width, top of screen */ /* help window, the same, different semantics for display, etc */ newwin->offx = newwin->offy = 0; newwin->rows = 0; newwin->cols = ttyDisplay->cols; newwin->maxrow = newwin->maxcol = 0; break; default: panic("Tried to create window type %d\n", (int) type); return WIN_ERR; } for(newid = 0; newidmaxrow) { newwin->data = (char **) alloc(sizeof(char *) * (unsigned)newwin->maxrow); newwin->datlen = (short *) alloc(sizeof(short) * (unsigned)newwin->maxrow); if(newwin->maxcol) { for (i = 0; i < newwin->maxrow; i++) { newwin->data[i] = (char *) alloc((unsigned)newwin->maxcol); newwin->datlen[i] = newwin->maxcol; } } else { for (i = 0; i < newwin->maxrow; i++) { newwin->data[i] = (char *) 0; newwin->datlen[i] = 0; } } if(newwin->type == NHW_MESSAGE) newwin->maxrow = 0; } else { newwin->data = (char **)0; newwin->datlen = (short *)0; } return newid; } STATIC_OVL void erase_menu_or_text(window, cw, clear) winid window; struct WinDesc *cw; boolean clear; { if(cw->offx == 0) if(cw->offy) { tty_curs(window, 1, 0); cl_eos(); } else if (clear) clear_screen(); else docrt(); else docorner((int)cw->offx, cw->maxrow+1); } STATIC_OVL void free_window_info(cw, free_data) struct WinDesc *cw; boolean free_data; { int i; if (cw->data) { if (cw == wins[WIN_MESSAGE] && cw->rows > cw->maxrow) cw->maxrow = cw->rows; /* topl data */ for(i=0; imaxrow; i++) if(cw->data[i]) { free((genericptr_t)cw->data[i]); cw->data[i] = (char *)0; if (cw->datlen) cw->datlen[i] = 0; } if (free_data) { free((genericptr_t)cw->data); cw->data = (char **)0; if (cw->datlen) free((genericptr_t)cw->datlen); cw->datlen = (short *)0; cw->rows = 0; } } cw->maxrow = cw->maxcol = 0; if(cw->mlist) { tty_menu_item *temp; while ((temp = cw->mlist) != 0) { cw->mlist = cw->mlist->next; if (temp->str) free((genericptr_t)temp->str); free((genericptr_t)temp); } } if (cw->plist) { free((genericptr_t)cw->plist); cw->plist = 0; } cw->plist_size = cw->npages = cw->nitems = cw->how = 0; if(cw->morestr) { free((genericptr_t)cw->morestr); cw->morestr = 0; } } void tty_clear_nhwindow(window) winid window; { register struct WinDesc *cw = 0; if(window == WIN_ERR || (cw = wins[window]) == (struct WinDesc *) 0) panic(winpanicstr, window); ttyDisplay->lastwin = window; switch(cw->type) { case NHW_MESSAGE: if(ttyDisplay->toplin) { home(); cl_end(); if(cw->cury) docorner(1, cw->cury+1); ttyDisplay->toplin = 0; } break; case NHW_STATUS: tty_curs(window, 1, 0); cl_end(); tty_curs(window, 1, 1); cl_end(); break; case NHW_MAP: /* cheap -- clear the whole thing and tell nethack to redraw botl */ flags.botlx = 1; /* fall into ... */ case NHW_BASE: clear_screen(); break; case NHW_MENU: case NHW_TEXT: if(cw->active) erase_menu_or_text(window, cw, TRUE); free_window_info(cw, FALSE); break; } cw->curx = cw->cury = 0; } STATIC_OVL void dmore(cw, s) register struct WinDesc *cw; const char *s; /* valid responses */ { const char *prompt = cw->morestr ? cw->morestr : defmorestr; int offset = (cw->type == NHW_TEXT) ? 1 : 2; tty_curs(BASE_WINDOW, (int)ttyDisplay->curx + offset, (int)ttyDisplay->cury); if(flags.standout) standoutbeg(); xputs(prompt); ttyDisplay->curx += strlen(prompt); if(flags.standout) standoutend(); xwaitforspace(s); } STATIC_OVL void set_item_state(window, lineno, item) winid window; int lineno; tty_menu_item *item; { char ch = item->selected ? (item->count == -1L ? '+' : '#') : '-'; tty_curs(window, 4, lineno); term_start_attr(item->attr); (void) putchar(ch); ttyDisplay->curx++; term_end_attr(item->attr); } STATIC_OVL void set_all_on_page(window, page_start, page_end) winid window; tty_menu_item *page_start, *page_end; { tty_menu_item *curr; int n; for (n = 0, curr = page_start; curr != page_end; n++, curr = curr->next) if (curr->identifier.a_void && !curr->selected) { curr->selected = TRUE; set_item_state(window, n, curr); } } STATIC_OVL void unset_all_on_page(window, page_start, page_end) winid window; tty_menu_item *page_start, *page_end; { tty_menu_item *curr; int n; for (n = 0, curr = page_start; curr != page_end; n++, curr = curr->next) if (curr->identifier.a_void && curr->selected) { curr->selected = FALSE; curr->count = -1L; set_item_state(window, n, curr); } } STATIC_OVL void invert_all_on_page(window, page_start, page_end, acc) winid window; tty_menu_item *page_start, *page_end; char acc; /* group accelerator, 0 => all */ { tty_menu_item *curr; int n; for (n = 0, curr = page_start; curr != page_end; n++, curr = curr->next) if (curr->identifier.a_void && (acc == 0 || curr->gselector == acc)) { if (curr->selected) { curr->selected = FALSE; curr->count = -1L; } else curr->selected = TRUE; set_item_state(window, n, curr); } } /* * Invert all entries that match the give group accelerator (or all if * zero). */ STATIC_OVL void invert_all(window, page_start, page_end, acc) winid window; tty_menu_item *page_start, *page_end; char acc; /* group accelerator, 0 => all */ { tty_menu_item *curr; boolean on_curr_page; struct WinDesc *cw = wins[window]; invert_all_on_page(window, page_start, page_end, acc); /* invert the rest */ for (on_curr_page = FALSE, curr = cw->mlist; curr; curr = curr->next) { if (curr == page_start) on_curr_page = TRUE; else if (curr == page_end) on_curr_page = FALSE; if (!on_curr_page && curr->identifier.a_void && (acc == 0 || curr->gselector == acc)) { if (curr->selected) { curr->selected = FALSE; curr->count = -1; } else curr->selected = TRUE; } } } #ifdef MENU_COLOR STATIC_OVL boolean get_menu_coloring(str, color, attr) char *str; int *color, *attr; { struct menucoloring *tmpmc; if (iflags.use_menu_color) for (tmpmc = menu_colorings; tmpmc; tmpmc = tmpmc->next) #ifdef USE_REGEX_MATCH # ifdef GNU_REGEX if (re_search(&tmpmc->match, str, strlen(str), 0, 9999, 0) >= 0) { # else # ifdef POSIX_REGEX if (regexec(&tmpmc->match, str, 0, NULL, 0) == 0) { # endif # endif #else if (pmatch(tmpmc->match, str)) { #endif *color = tmpmc->color; *attr = tmpmc->attr; return TRUE; } return FALSE; } #endif /* MENU_COLOR */ STATIC_OVL void process_menu_window(window, cw) winid window; struct WinDesc *cw; { tty_menu_item *page_start, *page_end, *curr; long count; int n, curr_page, page_lines; boolean finished, counting, reset_count; char *cp, *rp, resp[QBUFSZ], gacc[QBUFSZ], *msave, *morestr; curr_page = page_lines = 0; page_start = page_end = 0; msave = cw->morestr; /* save the morestr */ cw->morestr = morestr = (char*) alloc((unsigned) QBUFSZ); counting = FALSE; count = 0L; reset_count = TRUE; finished = FALSE; /* collect group accelerators; for PICK_NONE, they're ignored; for PICK_ONE, only those which match exactly one entry will be accepted; for PICK_ANY, those which match any entry are okay */ gacc[0] = '\0'; if (cw->how != PICK_NONE) { int i, gcnt[128]; #define GSELIDX(c) (c & 127) /* guard against `signed char' */ for (i = 0; i < SIZE(gcnt); i++) gcnt[i] = 0; for (n = 0, curr = cw->mlist; curr; curr = curr->next) if (curr->gselector && curr->gselector != curr->selector) { ++n; ++gcnt[GSELIDX(curr->gselector)]; } if (n > 0) /* at least one group accelerator found */ for (rp = gacc, curr = cw->mlist; curr; curr = curr->next) if (curr->gselector && !index(gacc, curr->gselector) && (cw->how == PICK_ANY || gcnt[GSELIDX(curr->gselector)] == 1)) { *rp++ = curr->gselector; *rp = '\0'; /* re-terminate for index() */ } } /* loop until finished */ while (!finished) { if (reset_count) { counting = FALSE; count = 0; } else reset_count = TRUE; if (!page_start) { /* new page to be displayed */ if (curr_page < 0 || (cw->npages > 0 && curr_page >= cw->npages)) panic("bad menu screen page #%d", curr_page); /* clear screen */ if (!cw->offx) { /* if not corner, do clearscreen */ if(cw->offy) { tty_curs(window, 1, 0); cl_eos(); } else clear_screen(); } rp = resp; if (cw->npages > 0) { /* collect accelerators */ page_start = cw->plist[curr_page]; page_end = cw->plist[curr_page + 1]; for (page_lines = 0, curr = page_start; curr != page_end; page_lines++, curr = curr->next) { #ifdef MENU_COLOR int color = NO_COLOR, attr = ATR_NONE; boolean menucolr = FALSE; #endif if (curr->selector) *rp++ = curr->selector; tty_curs(window, 1, page_lines); if (cw->offx) cl_end(); (void) putchar(' '); ++ttyDisplay->curx; /* * Don't use xputs() because (1) under unix it calls * tputstr() which will interpret a '*' as some kind * of padding information and (2) it calls xputc to * actually output the character. We're faster doing * this. */ #ifdef MENU_COLOR if (iflags.use_menu_color && (menucolr = get_menu_coloring(curr->str, &color,&attr))) { term_start_attr(attr); if (color != NO_COLOR) term_start_color(color); } else #endif term_start_attr(curr->attr); for (n = 0, cp = curr->str; #ifndef WIN32CON *cp && (int) ++ttyDisplay->curx < (int) ttyDisplay->cols; cp++, n++) #else *cp && (int) ttyDisplay->curx < (int) ttyDisplay->cols; cp++, n++, ttyDisplay->curx++) #endif if (n == 2 && curr->identifier.a_void != 0 && curr->selected) { if (curr->count == -1L) (void) putchar('+'); /* all selected */ else (void) putchar('#'); /* count selected */ } else (void) putchar(*cp); #ifdef MENU_COLOR if (iflags.use_menu_color && menucolr) { if (color != NO_COLOR) term_end_color(); term_end_attr(attr); } else #endif term_end_attr(curr->attr); } } else { page_start = 0; page_end = 0; page_lines = 0; } *rp = 0; /* corner window - clear extra lines from last page */ if (cw->offx) { for (n = page_lines + 1; n < cw->maxrow; n++) { tty_curs(window, 1, n); cl_end(); } } /* set extra chars.. */ Strcat(resp, default_menu_cmds); Strcat(resp, "0123456789\033\n\r"); /* counts, quit */ Strcat(resp, gacc); /* group accelerators */ Strcat(resp, mapped_menu_cmds); 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(); dmore(cw, resp); } else { /* just put the cursor back... */ tty_curs(window, (int) strlen(cw->morestr) + 2, page_lines); xwaitforspace(resp); } morc = map_menu_cmd(morc); switch (morc) { case '0': /* special case: '0' is also the default ball class */ if (!counting && index(gacc, morc)) goto group_accel; /* fall through to count the zero */ case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': count = (count * 10L) + (long) (morc - '0'); /* * It is debatable whether we should allow 0 to * start a count. There is no difference if the * item is selected. If not selected, then * "0b" could mean: * * count starting zero: "zero b's" * ignore starting zero: "select b" * * At present I don't know which is better. */ if (count != 0L) { /* ignore leading zeros */ counting = TRUE; reset_count = FALSE; } break; case '\033': /* cancel - from counting or loop */ if (!counting) { /* deselect everything */ for (curr = cw->mlist; curr; curr = curr->next) { curr->selected = FALSE; curr->count = -1L; } cw->flags |= WIN_CANCELLED; finished = TRUE; } /* else only stop count */ break; case '\0': /* finished (commit) */ case '\n': case '\r': /* only finished if we are actually picking something */ if (cw->how != PICK_NONE) { finished = TRUE; break; } /* else fall through */ case MENU_NEXT_PAGE: if (cw->npages > 0 && curr_page != cw->npages - 1) { curr_page++; page_start = 0; } else finished = TRUE; /* questionable behavior */ break; case MENU_PREVIOUS_PAGE: if (cw->npages > 0 && curr_page != 0) { --curr_page; page_start = 0; } break; case MENU_FIRST_PAGE: if (cw->npages > 0 && curr_page != 0) { page_start = 0; curr_page = 0; } break; case MENU_LAST_PAGE: if (cw->npages > 0 && curr_page != cw->npages - 1) { page_start = 0; curr_page = cw->npages - 1; } break; case MENU_SELECT_PAGE: if (cw->how == PICK_ANY) set_all_on_page(window, page_start, page_end); break; case MENU_UNSELECT_PAGE: unset_all_on_page(window, page_start, page_end); break; case MENU_INVERT_PAGE: if (cw->how == PICK_ANY) invert_all_on_page(window, page_start, page_end, 0); break; case MENU_SELECT_ALL: if (cw->how == PICK_ANY) { set_all_on_page(window, page_start, page_end); /* set the rest */ for (curr = cw->mlist; curr; curr = curr->next) if (curr->identifier.a_void && !curr->selected) curr->selected = TRUE; } break; case MENU_UNSELECT_ALL: unset_all_on_page(window, page_start, page_end); /* unset the rest */ for (curr = cw->mlist; curr; curr = curr->next) if (curr->identifier.a_void && curr->selected) { curr->selected = FALSE; curr->count = -1; } break; case MENU_INVERT_ALL: if (cw->how == PICK_ANY) invert_all(window, page_start, page_end, 0); break; default: if (cw->how == PICK_NONE || !index(resp, morc)) { /* unacceptable input received */ tty_nhbell(); break; } else if (index(gacc, morc)) { group_accel: /* group accelerator; for the PICK_ONE case, we know that it matches exactly one item in order to be in gacc[] */ invert_all(window, page_start, page_end, morc); if (cw->how == PICK_ONE) finished = TRUE; break; } /* find, toggle, and possibly update */ for (n = 0, curr = page_start; curr != page_end; n++, curr = curr->next) if (morc == curr->selector) { if (curr->selected) { if (counting && count > 0) { curr->count = count; set_item_state(window, n, curr); } else { /* change state */ curr->selected = FALSE; curr->count = -1L; set_item_state(window, n, curr); } } else { /* !selected */ if (counting && count > 0) { curr->count = count; curr->selected = TRUE; set_item_state(window, n, curr); } else if (!counting) { curr->selected = TRUE; set_item_state(window, n, curr); } /* do nothing counting&&count==0 */ } if (cw->how == PICK_ONE) finished = TRUE; break; /* from `for' loop */ } break; } } /* while */ cw->morestr = msave; free((genericptr_t)morestr); } STATIC_OVL void process_text_window(window, cw) winid window; struct WinDesc *cw; { int i, n, attr; register char *cp; for (n = 0, i = 0; i < cw->maxrow; i++) { if (!cw->offx && (n + cw->offy == ttyDisplay->rows - 1)) { tty_curs(window, 1, n); cl_end(); dmore(cw, quitchars); if (morc == '\033') { cw->flags |= WIN_CANCELLED; break; } if (cw->offy) { tty_curs(window, 1, 0); cl_eos(); } else clear_screen(); n = 0; } tty_curs(window, 1, n++); if (cw->offx) cl_end(); if (cw->data[i]) { attr = cw->data[i][0] - 1; if (cw->offx) { (void) putchar(' '); ++ttyDisplay->curx; } term_start_attr(attr); for (cp = &cw->data[i][1]; #ifndef WIN32CON *cp && (int) ++ttyDisplay->curx < (int) ttyDisplay->cols; cp++) #else *cp && (int) ttyDisplay->curx < (int) ttyDisplay->cols; cp++, ttyDisplay->curx++) #endif (void) putchar(*cp); term_end_attr(attr); } } if (i == cw->maxrow) { tty_curs(BASE_WINDOW, (int)cw->offx + 1, (cw->type == NHW_TEXT) ? (int) ttyDisplay->rows - 1 : n); cl_end(); dmore(cw, quitchars); if (morc == '\033') cw->flags |= WIN_CANCELLED; } } /*ARGSUSED*/ void tty_display_nhwindow(window, blocking) winid window; boolean blocking; /* with ttys, all windows are blocking */ { register struct WinDesc *cw = 0; if(window == WIN_ERR || (cw = wins[window]) == (struct WinDesc *) 0) panic(winpanicstr, window); if(cw->flags & WIN_CANCELLED) return; ttyDisplay->lastwin = window; ttyDisplay->rawprint = 0; switch(cw->type) { case NHW_MESSAGE: if(ttyDisplay->toplin == 1) { more(); ttyDisplay->toplin = 1; /* more resets this */ tty_clear_nhwindow(window); } else ttyDisplay->toplin = 0; cw->curx = cw->cury = 0; if(!cw->active) iflags.window_inited = TRUE; break; case NHW_MAP: end_glyphout(); if(blocking) { if(!ttyDisplay->toplin) ttyDisplay->toplin = 1; tty_display_nhwindow(WIN_MESSAGE, TRUE); return; } case NHW_BASE: (void) fflush(stdout); break; case NHW_TEXT: cw->maxcol = ttyDisplay->cols; /* force full-screen mode */ /*FALLTHRU*/ case NHW_MENU: cw->active = 1; /* avoid converting to uchar before calculations are finished */ cw->offx = (uchar) (int) max((int) 10, (int) (ttyDisplay->cols - cw->maxcol - 1)); if(cw->type == NHW_MENU) cw->offy = 0; if(ttyDisplay->toplin == 1) tty_display_nhwindow(WIN_MESSAGE, TRUE); if(cw->offx == 10 || cw->maxrow >= (int) ttyDisplay->rows) { cw->offx = 0; if(cw->offy) { tty_curs(window, 1, 0); cl_eos(); } else clear_screen(); ttyDisplay->toplin = 0; } else tty_clear_nhwindow(WIN_MESSAGE); if (cw->data || !cw->maxrow) process_text_window(window, cw); else process_menu_window(window, cw); break; } cw->active = 1; } void tty_dismiss_nhwindow(window) winid window; { register struct WinDesc *cw = 0; if(window == WIN_ERR || (cw = wins[window]) == (struct WinDesc *) 0) panic(winpanicstr, window); switch(cw->type) { case NHW_MESSAGE: if (ttyDisplay->toplin) tty_display_nhwindow(WIN_MESSAGE, TRUE); /*FALLTHRU*/ case NHW_STATUS: case NHW_BASE: case NHW_MAP: /* * these should only get dismissed when the game is going away * or suspending */ tty_curs(BASE_WINDOW, 1, (int)ttyDisplay->rows-1); cw->active = 0; break; case NHW_MENU: case NHW_TEXT: if(cw->active) { if (iflags.window_inited) { /* otherwise dismissing the text endwin after other windows * are dismissed tries to redraw the map and panics. since * the whole reason for dismissing the other windows was to * leave the ending window on the screen, we don't want to * erase it anyway. */ erase_menu_or_text(window, cw, FALSE); } cw->active = 0; } break; } cw->flags = 0; } void tty_destroy_nhwindow(window) winid window; { register struct WinDesc *cw = 0; if(window == WIN_ERR || (cw = wins[window]) == (struct WinDesc *) 0) panic(winpanicstr, window); if(cw->active) tty_dismiss_nhwindow(window); if(cw->type == NHW_MESSAGE) iflags.window_inited = 0; if(cw->type == NHW_MAP) clear_screen(); free_window_info(cw, TRUE); free((genericptr_t)cw); wins[window] = 0; } void tty_curs(window, x, y) winid window; register int x, y; /* not xchar: perhaps xchar is unsigned and curx-x would be unsigned as well */ { struct WinDesc *cw = 0; int cx = ttyDisplay->curx; int cy = ttyDisplay->cury; if(window == WIN_ERR || (cw = wins[window]) == (struct WinDesc *) 0) panic(winpanicstr, window); ttyDisplay->lastwin = window; #if defined(USE_TILES) && defined(MSDOS) adjust_cursor_flags(cw); #endif 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; case NHW_STATUS: s = "[status window]"; break; case NHW_MAP: s = "[map window]"; break; case NHW_MENU: s = "[corner window]"; break; case NHW_TEXT: s = "[text window]"; break; case NHW_BASE: s = "[base window]"; break; } impossible("bad curs positioning win %d %s (%d,%d)", window, s, x, y); return; } #endif x += cw->offx; y += cw->offy; #ifdef CLIPPING if(clipping && window == WIN_MAP) { x -= clipx; y -= clipy; } #endif if (y == cy && x == cx) return; if(cw->type == NHW_MAP) end_glyphout(); #ifndef NO_TERMS if(!nh_ND && (cx != x || x <= 3)) { /* Extremely primitive */ cmov(x, y); /* bunker!wtm */ return; } #endif if((cy -= y) < 0) cy = -cy; if((cx -= x) < 0) cx = -cx; if(cy <= 3 && cx <= 3) { nocmov(x, y); #ifndef NO_TERMS } else if ((x <= 3 && cy <= 3) || (!nh_CM && x < cx)) { (void) putchar('\r'); ttyDisplay->curx = 0; nocmov(x, y); } else if (!nh_CM) { nocmov(x, y); #endif } else cmov(x, y); ttyDisplay->curx = x; ttyDisplay->cury = y; } STATIC_OVL void tty_putsym(window, x, y, ch) winid window; int x, y; char ch; { register struct WinDesc *cw = 0; if(window == WIN_ERR || (cw = wins[window]) == (struct WinDesc *) 0) panic(winpanicstr, window); switch(cw->type) { case NHW_STATUS: case NHW_MAP: case NHW_BASE: tty_curs(window, x, y); (void) putchar(ch); ttyDisplay->curx++; cw->curx++; break; case NHW_MESSAGE: case NHW_MENU: case NHW_TEXT: impossible("Can't putsym to window type %d", cw->type); break; } } STATIC_OVL const char* compress_str(str) const char *str; { static char cbuf[BUFSZ]; /* compress in case line too long */ if((int)strlen(str) >= CO) { register const char *bp0 = str; register char *bp1 = cbuf; do { #ifdef CLIPPING if(*bp0 != ' ' || bp0[1] != ' ') #else if(*bp0 != ' ' || bp0[1] != ' ' || bp0[2] != ' ') #endif *bp1++ = *bp0; } while(*bp0++); } else return str; return cbuf; } void tty_putstr(window, attr, str) winid window; int attr; const char *str; { register struct WinDesc *cw = 0; register char *ob; register const char *nb; register int i, j, n0; register int k; /* Assume there's a real problem if the window is missing -- * probably a panic message */ if(window == WIN_ERR || (cw = wins[window]) == (struct WinDesc *) 0) { tty_raw_print(str); return; } if(str == (const char*)0 || ((cw->flags & WIN_CANCELLED) && (cw->type != NHW_MESSAGE))) return; if(cw->type != NHW_MESSAGE) str = compress_str(str); ttyDisplay->lastwin = window; switch(cw->type) { case NHW_MESSAGE: /* really do this later */ #if defined(USER_SOUNDS) && defined(WIN32CON) play_sound_for_message(str); #endif update_topl(str); break; case NHW_STATUS: #ifdef ALLEG_FX if (iflags.usealleg) { alleg_stats(str, cw->cury); break; } #endif ob = &cw->data[cw->cury][j = cw->curx]; if(flags.botlx) *ob = 0; if(!cw->cury && (int)strlen(str) >= CO) { /* the characters before "St:" are unnecessary */ nb = index(str, ':'); if(nb && nb > str+2) str = nb - 2; } k = 0; /* WAC - attempt to break or shorten line 2 if it's too long */ if(cw->cury && (int)strlen(str) >= CO) { if(cw->cury < (cw->maxrow - 1)) for(k = CO - 1; k && str[k] != ' ';) k--; if(!k || (int)strlen(str + k + 1) >= CO) { str = shorten_bot2(str, CO); k = 0; } } nb = str; for(i = cw->curx+1, n0 = cw->cols; i < n0; i++, nb++) { if(!*nb) { if(*ob || flags.botlx) { /* last char printed may be in middle of line */ tty_curs(WIN_STATUS, i, cw->cury); cl_end(); } break; } if(*ob != *nb) tty_putsym(WIN_STATUS, i, cw->cury, *nb); if(*ob) ob++; /* String break? --WAC */ if(i == k) { (void) strncpy(&cw->data[cw->cury][j], str, cw->cols - j - 1); cw->data[cw->cury][min(k+1, cw->cols-1)] = '\0'; if(*ob || flags.botlx) { /* last char printed may be in middle of line */ tty_curs(WIN_STATUS, k+1, cw->cury); cl_end(); } nb++; str = nb + 1; i = j = 0; cw->curx = 0; cw->cury++; ob = &cw->data[cw->cury][cw->curx]; if(flags.botlx) *ob = 0; tty_curs(WIN_STATUS, 1, cw->cury); k = 0; } } (void) strncpy(&cw->data[cw->cury][j], str, cw->cols - j - 1); cw->data[cw->cury][cw->cols-1] = '\0'; /* null terminate */ /* ALI - Clear third line if present and unused */ if (cw->cury == 1 && cw->cury < (cw->maxrow - 1)) { cw->data[cw->cury + 1][0] = '\0'; tty_curs(WIN_STATUS, 1, cw->cury + 1); cl_end(); } cw->cury = (cw->cury+1) % 2; cw->curx = 0; break; case NHW_MAP: tty_curs(window, cw->curx+1, cw->cury); term_start_attr(attr); while(*str && (int) ttyDisplay->curx < (int) ttyDisplay->cols-1) { (void) putchar(*str); str++; ttyDisplay->curx++; } cw->curx = 0; cw->cury++; term_end_attr(attr); break; case NHW_BASE: tty_curs(window, cw->curx+1, cw->cury); term_start_attr(attr); while (*str) { if ((int) ttyDisplay->curx >= (int) ttyDisplay->cols-1) { cw->curx = 0; cw->cury++; tty_curs(window, cw->curx+1, cw->cury); } (void) putchar(*str); str++; ttyDisplay->curx++; } cw->curx = 0; cw->cury++; term_end_attr(attr); break; case NHW_MENU: case NHW_TEXT: if(cw->type == NHW_TEXT && cw->cury == ttyDisplay->rows-1) { /* not a menu, so save memory and output 1 page at a time */ cw->maxcol = ttyDisplay->cols; /* force full-screen mode */ tty_display_nhwindow(window, TRUE); for(i=0; imaxrow; i++) if(cw->data[i]){ free((genericptr_t)cw->data[i]); cw->data[i] = 0; } cw->maxrow = cw->cury = 0; } /* always grows one at a time, but alloc 12 at a time */ if(cw->cury >= cw->rows) { char **tmp; cw->rows += 12; tmp = (char **) alloc(sizeof(char *) * (unsigned)cw->rows); for(i=0; imaxrow; i++) tmp[i] = cw->data[i]; if(cw->data) free((genericptr_t)cw->data); cw->data = tmp; for(i=cw->maxrow; irows; i++) cw->data[i] = 0; } if(cw->data[cw->cury]) free((genericptr_t)cw->data[cw->cury]); n0 = strlen(str) + 1; ob = cw->data[cw->cury] = (char *)alloc((unsigned)n0 + 1); *ob++ = (char)(attr + 1); /* avoid nuls, for convenience */ Strcpy(ob, str); if(n0 > cw->maxcol) cw->maxcol = n0; if(++cw->cury > cw->maxrow) 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'; tty_putstr(window, attr, &str[i]); } } break; } } void #ifdef FILE_AREAS tty_display_file(farea, fname, complain) const char *farea; #else tty_display_file(fname, complain) #endif const char *fname; boolean complain; { #ifdef DEF_PAGER /* this implies that UNIX is defined */ { /* use external pager; this may give security problems */ #ifdef FILE_AREAS register int fd = open_area(farea, fname, 0, 0); #else register int fd = open(fname, 0); #endif if(fd < 0) { if(complain) pline("Cannot open %s.", fname); else docrt(); return; } if(child(1)) { /* Now that child() does a setuid(getuid()) and a chdir(), we may not be able to open file fname anymore, so make it stdin. */ (void) close(0); if(dup(fd)) { if(complain) raw_printf("Cannot open %s as stdin.", fname); } else { (void) execlp(catmore, "page", (char *)0); if(complain) raw_printf("Cannot exec %s.", catmore); } if(complain) sleep(10); /* want to wait_synch() but stdin is gone */ terminate(EXIT_FAILURE); } (void) close(fd); } #else /* DEF_PAGER */ { dlb *f; char buf[BUFSZ]; char *cr; tty_clear_nhwindow(WIN_MESSAGE); #ifdef FILE_AREAS f = dlb_fopen_area(farea, fname, "r"); #else f = dlb_fopen(fname, "r"); #endif if (!f) { if(complain) { home(); tty_mark_synch(); tty_raw_print(""); perror(fname); tty_wait_synch(); pline("Cannot open \"%s\".", fname); } else if(u.ux) docrt(); } else { winid datawin = tty_create_nhwindow(NHW_TEXT); boolean empty = TRUE; if(complain #ifndef NO_TERMS && nh_CD #endif ) { /* attempt to scroll text below map window if there's room */ wins[datawin]->offy = wins[WIN_STATUS]->offy+3; if((int) wins[datawin]->offy + 12 > (int) ttyDisplay->rows) wins[datawin]->offy = 0; } while (dlb_fgets(buf, BUFSZ, f)) { if ((cr = index(buf, '\n')) != 0) *cr = 0; #ifdef MSDOS 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); } } #endif /* DEF_PAGER */ } void tty_start_menu(window) winid window; { tty_clear_nhwindow(window); return; } /*ARGSUSED*/ /* * Add a menu item to the beginning of the menu list. This list is reversed * later. */ void tty_add_menu(window, glyph, identifier, ch, gch, attr, str, preselected) winid window; /* window to use, must be of type NHW_MENU */ int glyph; /* glyph to display with item (unused) */ const anything *identifier; /* what to return if selected */ char ch; /* keyboard accelerator (0 = pick our own) */ char gch; /* group accelerator (0 = no group) */ int attr; /* attribute for string (like tty_putstr()) */ const char *str; /* menu string */ boolean preselected; /* item is marked as selected */ { #if defined(MAC_MPW) # pragma unused(glyph) #endif register struct WinDesc *cw = 0; tty_menu_item *item; const char *newstr; char buf[4+BUFSZ]; if (str == (const char*) 0) return; if (window == WIN_ERR || (cw = wins[window]) == (struct WinDesc *) 0 || cw->type != NHW_MENU) panic(winpanicstr, window); cw->nitems++; if (identifier->a_void) { int len = strlen(str); if (len >= BUFSZ) { /* We *think* everything's coming in off at most BUFSZ bufs... */ impossible("Menu item too long (%d).", len); len = BUFSZ - 1; } Sprintf(buf, "%c - ", ch ? ch : '?'); (void) strncpy(buf+4, str, len); buf[4+len] = '\0'; newstr = buf; } else newstr = str; item = (tty_menu_item *) alloc(sizeof(tty_menu_item)); item->identifier = *identifier; item->count = -1L; item->selected = preselected; item->selector = ch; item->gselector = gch; item->attr = attr; item->str = copy_of(newstr); item->next = cw->mlist; cw->mlist = item; } /* Invert the given list, can handle NULL as an input. */ STATIC_OVL tty_menu_item * reverse(curr) tty_menu_item *curr; { tty_menu_item *next, *head = 0; while (curr) { next = curr->next; curr->next = head; head = curr; curr = next; } return head; } /* * End a menu in this window, window must a type NHW_MENU. This routine * processes the string list. We calculate the # of pages, then assign * keyboard accelerators as needed. Finally we decide on the width and * height of the window. */ void tty_end_menu(window, prompt) winid window; /* menu to use */ const char *prompt; /* prompt to for menu */ { struct WinDesc *cw = 0; tty_menu_item *curr; short len; int lmax, n; char menu_ch; if (window == WIN_ERR || (cw = wins[window]) == (struct WinDesc *) 0 || cw->type != NHW_MENU) panic(winpanicstr, window); /* Reverse the list so that items are in correct order. */ cw->mlist = reverse(cw->mlist); /* Put the promt at the beginning of the menu. */ if (prompt) { anything any; any.a_void = 0; /* not selectable */ tty_add_menu(window, NO_GLYPH, &any, 0, 0, ATR_NONE, "", MENU_UNSELECTED); tty_add_menu(window, NO_GLYPH, &any, 0, 0, ATR_NONE, prompt, MENU_UNSELECTED); } lmax = min(52, (int)ttyDisplay->rows - 1); /* # lines per page */ cw->npages = (cw->nitems + (lmax - 1)) / lmax; /* # of pages */ /* make sure page list is large enough */ if (cw->plist_size < cw->npages+1 /*need 1 slot beyond last*/) { if (cw->plist) free((genericptr_t)cw->plist); cw->plist_size = cw->npages + 1; cw->plist = (tty_menu_item **) alloc(cw->plist_size * sizeof(tty_menu_item *)); } cw->cols = 0; /* cols is set when the win is initialized... (why?) */ menu_ch = '?'; /* lint suppression */ for (n = 0, curr = cw->mlist; curr; n++, curr = curr->next) { /* set page boundaries and character accelerators */ if ((n % lmax) == 0) { menu_ch = 'a'; cw->plist[n/lmax] = curr; } if (curr->identifier.a_void && !curr->selector) { curr->str[0] = curr->selector = menu_ch; if (menu_ch++ == 'z') menu_ch = 'A'; } /* cut off any lines that are too long */ len = strlen(curr->str) + 2; /* extra space at beg & end */ if (len > (int)ttyDisplay->cols) { curr->str[ttyDisplay->cols-2] = 0; len = ttyDisplay->cols; } if (len > cw->cols) cw->cols = len; } cw->plist[cw->npages] = 0; /* plist terminator */ /* * If greater than 1 page, morestr is "(x of y) " otherwise, "(end) " */ if (cw->npages > 1) { char buf[QBUFSZ]; /* produce the largest demo string */ Sprintf(buf, "(%d of %d) ", cw->npages, cw->npages); len = strlen(buf); cw->morestr = copy_of(""); } else { cw->morestr = copy_of("(end) "); len = strlen(cw->morestr); } if (len > (int)ttyDisplay->cols) { /* truncate the prompt if its too long for the screen */ if (cw->npages <= 1) /* only str in single page case */ cw->morestr[ttyDisplay->cols] = 0; len = ttyDisplay->cols; } if (len > cw->cols) cw->cols = len; cw->maxcol = cw->cols; /* * The number of lines in the first page plus the morestr will be the * maximum size of the window. */ if (cw->npages > 1) cw->maxrow = cw->rows = lmax + 1; else cw->maxrow = cw->rows = cw->nitems + 1; } int tty_select_menu(window, how, menu_list) winid window; int how; menu_item **menu_list; { register struct WinDesc *cw = 0; tty_menu_item *curr; menu_item *mi; int n, cancelled; if(window == WIN_ERR || (cw = wins[window]) == (struct WinDesc *) 0 || cw->type != NHW_MENU) panic(winpanicstr, window); *menu_list = (menu_item *) 0; cw->how = (short) how; morc = 0; tty_display_nhwindow(window, TRUE); cancelled = !!(cw->flags & WIN_CANCELLED); tty_dismiss_nhwindow(window); /* does not destroy window data */ if (cancelled) { n = -1; } else { for (n = 0, curr = cw->mlist; curr; curr = curr->next) if (curr->selected) n++; } if (n > 0) { *menu_list = (menu_item *) alloc(n * sizeof(menu_item)); for (mi = *menu_list, curr = cw->mlist; curr; curr = curr->next) if (curr->selected) { mi->item = curr->identifier; mi->count = curr->count; mi++; } } return n; } /* special hack for treating top line --More-- as a one item menu */ char tty_message_menu(let, how, mesg) char let; int how; const char *mesg; { /* "menu" without selection; use ordinary pline, no more() */ if (how == PICK_NONE) { pline("%s", mesg); return 0; } ttyDisplay->dismiss_more = let; morc = 0; /* barebones pline(); since we're only supposed to be called after 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 */ wins[WIN_MESSAGE]->flags &= ~WIN_CANCELLED; ttyDisplay->dismiss_more = 0; return ((how == PICK_ONE && morc == let) || morc == '\033') ? morc : '\0'; } void tty_update_inventory() { return; } void tty_mark_synch() { (void) fflush(stdout); } void tty_wait_synch() { /* we just need to make sure all windows are synch'd */ if(!ttyDisplay || ttyDisplay->rawprint) { getret(); if(ttyDisplay) ttyDisplay->rawprint = 0; } else { tty_display_nhwindow(WIN_MAP, FALSE); 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 */ (void) tty_doprev_message(); (void) tty_doprev_message(); ttyDisplay->intr++; (void) fflush(stdout); } } } void docorner(xmin, ymax) register int xmin, ymax; { register int y; register struct WinDesc *cw = wins[WIN_MAP]; if (u.uswallow) { /* Can be done more efficiently */ swallowed(1); return; } #if defined(SIGWINCH) && defined(CLIPPING) if(ymax > LI) ymax = LI; /* can happen if window gets smaller */ #endif for (y = 0; y < ymax; y++) { tty_curs(BASE_WINDOW, xmin,y); /* move cursor */ cl_end(); /* clear to end of line */ #ifdef CLIPPING if (y<(int) cw->offy || y+clipy > ROWNO) continue; /* only refresh board */ #if defined(USE_TILES) && defined(MSDOS) if (iflags.tile_view) row_refresh((xmin/2)+clipx-((int)cw->offx/2),COLNO-1,y+clipy-(int)cw->offy); else #endif row_refresh(xmin+clipx-(int)cw->offx,COLNO-1,y+clipy-(int)cw->offy); #else if (yoffy || y > ROWNO) continue; /* only refresh board */ row_refresh(xmin-(int)cw->offx,COLNO-1,y-(int)cw->offy); #endif } end_glyphout(); if (ymax >= (int) wins[WIN_STATUS]->offy) { /* we have wrecked the bottom line */ flags.botlx = 1; bot(); } } void end_glyphout() { #if defined(ASCIIGRAPH) && !defined(NO_TERMS) if (GFlag) { GFlag = FALSE; graph_off(); } #endif #ifdef TEXTCOLOR if(ttyDisplay->color != NO_COLOR) { term_end_color(); ttyDisplay->color = NO_COLOR; } #endif } #ifndef WIN32 void g_putch(in_ch) int in_ch; { register char ch = (char)in_ch; # if defined(ASCIIGRAPH) && !defined(NO_TERMS) if (iflags.IBMgraphics || iflags.eight_bit_tty) { /* IBM-compatible displays don't need other stuff */ (void) putchar(ch); } else if (ch & 0x80) { if (!GFlag || HE_resets_AS) { graph_on(); GFlag = TRUE; } (void) putchar((ch ^ 0x80)); /* Strip 8th bit */ } else { if (GFlag) { graph_off(); GFlag = FALSE; } (void) putchar(ch); } #else (void) putchar(ch); #endif /* ASCIIGRAPH && !NO_TERMS */ return; } #endif /* !WIN32 */ #ifdef CLIPPING void setclipped() { clipping = TRUE; clipx = clipy = 0; clipxmax = CO; clipymax = LI - 3; } void tty_cliparound(x, y) int x, y; { extern boolean restoring; int oldx = clipx, oldy = clipy; if (!clipping) return; if (x < clipx + 5) { clipx = max(0, x - 20); clipxmax = clipx + CO; } else if (x > clipxmax - 5) { clipxmax = min(COLNO, clipxmax + 20); clipx = clipxmax - CO; } if (y < clipy + 2) { clipy = max(0, y - (clipymax - clipy) / 2); clipymax = clipy + (LI - 3); } else if (y > clipymax - 2) { clipymax = min(ROWNO, clipymax + (clipymax - clipy) / 2); clipy = clipymax - (LI - 3); } if (clipx != oldx || clipy != oldy) { if (on_level(&u.uz0, &u.uz) && !restoring) (void) doredraw(); } } #endif /* CLIPPING */ /* * tty_print_glyph * * Print the glyph to the output device. Don't flush the output device. * * 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 0 #ifdef ALLEG_FX if (!iflags.usealleg) #endif #endif 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); #ifndef NO_TERMS if (ul_hack && ch == '_') { /* non-destructive underscore */ (void) putchar((char) ' '); backsp(); } #endif #ifdef TEXTCOLOR if (color != ttyDisplay->color) { if(ttyDisplay->color != NO_COLOR) term_end_color(); ttyDisplay->color = color; if(color != NO_COLOR) 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); #ifdef TEXTCOLOR /* turn off color as well, ATR_INVERSE may have done this already */ if(ttyDisplay->color != NO_COLOR) { term_end_color(); ttyDisplay->color = NO_COLOR; } #endif } wins[window]->curx++; /* one character over */ ttyDisplay->curx++; /* the real cursor moved too */ } void tty_raw_print(str) const char *str; { if(ttyDisplay) ttyDisplay->rawprint++; #if defined(MICRO) || defined(WIN32CON) msmsg("%s\n", str); #else puts(str); (void) fflush(stdout); #endif } void tty_raw_print_bold(str) const char *str; { if(ttyDisplay) ttyDisplay->rawprint++; term_start_raw_bold(); #if defined(MICRO) || defined(WIN32CON) msmsg("%s", str); #else (void) fputs(str, stdout); #endif term_end_raw_bold(); #if defined(MICRO) || defined(WIN32CON) msmsg("\n"); #else puts(""); (void) fflush(stdout); #endif } int tty_nhgetch() { int i; #ifdef UNIX /* kludge alert: Some Unix variants return funny values if getc() * is called, interrupted, and then called again. There * is non-reentrant code in the internal _filbuf() routine, called by * getc(). */ static volatile int nesting = 0; char nestbuf; #endif (void) fflush(stdout); /* Note: if raw_print() and wait_synch() get called to report terminal * initialization problems, then wins[] and ttyDisplay might not be * available yet. Such problems will probably be fatal before we get * here, but validate those pointers just in case... */ if (WIN_MESSAGE != WIN_ERR && wins[WIN_MESSAGE]) wins[WIN_MESSAGE]->flags &= ~WIN_STOP; #ifdef UNIX i = ((++nesting == 1) ? tgetch() : (read(fileno(stdin), (genericptr_t)&nestbuf,1) == 1 ? (int)nestbuf : EOF)); --nesting; #else i = tgetch(); #endif if (!i) i = '\033'; /* map NUL to ESC since nethack doesn't expect NUL */ if (ttyDisplay && ttyDisplay->toplin == 1) ttyDisplay->toplin = 2; return i; } /* * return a key, or 0, in which case a mouse button was pressed * mouse events should be returned as character postitions in the map window. * Since normal tty's don't have mice, just return a key. */ /*ARGSUSED*/ int tty_nh_poskey(x, y, mod) int *x, *y, *mod; { #if defined(MAC_MPW) # pragma unused(x,y,mod) #endif # if defined(WIN32CON) int i; (void) fflush(stdout); /* Note: if raw_print() and wait_synch() get called to report terminal * initialization problems, then wins[] and ttyDisplay might not be * available yet. Such problems will probably be fatal before we get * here, but validate those pointers just in case... */ if (WIN_MESSAGE != WIN_ERR && wins[WIN_MESSAGE]) wins[WIN_MESSAGE]->flags &= ~WIN_STOP; i = ntposkey(x, y, mod); if (!i && mod && *mod == 0) i = '\033'; /* map NUL to ESC since nethack doesn't expect NUL */ if (ttyDisplay && ttyDisplay->toplin == 1) ttyDisplay->toplin = 2; return i; # else return tty_nhgetch(); # endif } void win_tty_init() { # if defined(WIN32CON) nttty_open(); # endif return; } #ifdef POSITIONBAR void tty_update_positionbar(posbar) char *posbar; { # ifdef MSDOS video_update_positionbar(posbar); # endif } #endif /* * Allocate a copy of the given string. If null, return a string of * zero length. * * This is an exact duplicate of copy_of() in X11/winmenu.c. */ static char * copy_of(s) const char *s; { if (!s) s = ""; return strcpy((char *) alloc((unsigned) (strlen(s) + 1)), s); } #endif /* TTY_GRAPHICS */ /*wintty.c*/ slashem-0.0.7E7F3/win/proxy/0000775000076400007640000000000010545462317013632 5ustar alialislashem-0.0.7E7F3/win/proxy/Makefile.unx0000664000076400007640000000717010545462317016110 0ustar aliali# $Id: Makefile.unx,v 1.9.2.1 2004/11/18 22:38:10 j_ali Exp $ # Copyright (c) Slash'EM Development Team 2001-2004 # NetHack may be freely redistributed. See license for details. # # This makefile is for maintainer use. It is not needed when building the game. AWK = awk CFLAGS = -g -I../../include -pthread #RPCLIB = -lrpclib # ---------------------------------------- # # Nothing below this line should have to be changed. # timestamps for primary header files, matching src/Makefile CONFIG_H = ../../src/config.h-t HACK_H = ../../src/hack.h-t CSRC = nhxdr.c nhext.c nhextxdr.c nhextio.c nhextnb.c test_com.c all: tests FORCE: tests: test_xdr rpcgen-test_xdr test_ext test_io FORCE @echo "" @echo Testing NhExt XDR routines... @echo The output of these two tests should be identical: @echo ============================ - ./test_xdr -w | ./rpcgen-test_xdr -r @echo ============================ - ./rpcgen-test_xdr -w | ./test_xdr -r @echo ============================ @echo "" @echo Testing NhExt sub-protocol 1 support routines... @echo ============================ - ./test_ext @echo ============================ @echo "" @echo Testing NhExt I/O buffering routines... @echo ============================ - ./test_io @echo ============================ test_xdr: test_xdr.c nhxdr.o nhextxdr.o nhextio.o nhextnb.o $(CC) $(CFLAGS) -URPCGEN -o test_xdr test_xdr.c nhxdr.o nhextxdr.o \ nhextio.c nhextnb.c rpcgen-test_xdr: test_xdr.c $(CC) $(CFLAGS) -DRPCGEN -o rpcgen-test_xdr test_xdr.c $(RPCLIB) rpcgen-nhext.h rpcgen-nhext_xdr.c: rpcgen-nhext.x rpcgen rpcgen-nhext.x rpcgen-nhext.x: ext_protocol.html $(AWK) '/

init<\/h3>/ { init=1; } /^
$$/ { if (init) output=1; next;} /^<\/pre>$$/ { output=0; } { if (output) print }' < ext_protocol.html > rpcgen-nhext.x

test_ext:	test_ext.c test_com.o nhext.o nhxdr.o nhextxdr.o nhextio.o \
	nhextnb.o
	$(CC) $(CFLAGS) -o test_ext test_ext.c test_com.o nhext.o nhxdr.o \
		nhextxdr.o nhextio.o nhextnb.o

test_io:	test_io.c test_com.o nhextio.o nhextnb.o
	$(CC) $(CFLAGS) -o test_io test_io.c test_com.o nhextio.o nhextnb.o

clean:
	$(RM) *.o test_xdr rpcgen-test_xdr test_ext test_io

spotless:	clean
	$(RM) rpcgen-nhext.h rpcgen-nhext_xdr.c rpcgen-nhext.x

depend: ../../sys/unix/depend.awk $(CSRC)
	$(AWK) -f ../../sys/unix/depend.awk ../../include/*.h $(CSRC) | \
	sed -e 's:\.\./include:\.\./\.\./include:g' \
	  -e 's:touch:@echo /**/ >>:' > makedep
	@echo '/^# DO NOT DELETE THIS LINE OR CHANGE ANYTHING BEYOND IT/+2,$$d' >eddep
	@echo '$$r makedep' >>eddep
	@echo 'w' >>eddep
	@cp Makefile.unx Makefile.bak
	ed - Makefile.unx < eddep
	ed - Makefile.w32 < eddep
	@rm -f eddep makedep
	@echo '# DEPENDENCIES MUST END AT END OF FILE' >> Makefile.unx
	@echo '# IF YOU PUT STUFF HERE IT WILL GO AWAY' >> Makefile.unx
	@echo '# see make depend above' >> Makefile.unx
	@echo '# DEPENDENCIES MUST END AT END OF FILE' >> Makefile.w32
	@echo '# IF YOU PUT STUFF HERE IT WILL GO AWAY' >> Makefile.w32
	@echo '# see Makefile.unx' >> Makefile.w32
	- diff Makefile.bak Makefile.unx
	@rm -f Makefile.bak

# DO NOT DELETE THIS LINE OR CHANGE ANYTHING BEYOND IT

# config.h timestamp
$(CONFIG_H): ../../include/config.h
	touch $(CONFIG_H)
# hack.h timestamp
$(HACK_H): ../../include/hack.h
	touch $(HACK_H)
#
nhxdr.o: nhxdr.c ../../include/nhxdr.h
nhext.o: nhext.c ../../include/nhxdr.h ../../include/proxycom.h
nhextxdr.o: nhextxdr.c ../../include/nhxdr.h
nhextio.o: nhextio.c ../../include/nhxdr.h ../../include/proxycom.h
nhextnb.o: nhextnb.c ../../include/nhxdr.h ../../include/proxycom.h
test_com.o: test_com.c test_com.h
# DEPENDENCIES MUST END AT END OF FILE
# IF YOU PUT STUFF HERE IT WILL GO AWAY
# see make depend above
slashem-0.0.7E7F3/win/proxy/md5.c0000664000076400007640000003022410545462317014464 0ustar  aliali/*
  Copyright (C) 1999, 2000, 2002 Aladdin Enterprises.  All rights reserved.

  This software is provided 'as-is', without any express or implied
  warranty.  In no event will the authors be held liable for any damages
  arising from the use of this software.

  Permission is granted to anyone to use this software for any purpose,
  including commercial applications, and to alter it and redistribute it
  freely, subject to the following restrictions:

  1. The origin of this software must not be misrepresented; you must not
     claim that you wrote the original software. If you use this software
     in a product, an acknowledgment in the product documentation would be
     appreciated but is not required.
  2. Altered source versions must be plainly marked as such, and must not be
     misrepresented as being the original software.
  3. This notice may not be removed or altered from any source distribution.

  L. Peter Deutsch
  ghost@aladdin.com

 */
/* $Id: md5.c,v 1.1 2003/07/05 15:02:54 j_ali Exp $ */
/*
  Independent implementation of MD5 (RFC 1321).

  This code implements the MD5 Algorithm defined in RFC 1321, whose
  text is available at
	http://www.ietf.org/rfc/rfc1321.txt
  The code is derived from the text of the RFC, including the test suite
  (section A.5) but excluding the rest of Appendix A.  It does not include
  any code or documentation that is identified in the RFC as being
  copyrighted.

  The original and principal author of md5.c is L. Peter Deutsch
  .  Other authors are noted in the change history
  that follows (in reverse chronological order):

  2002-04-13 lpd Clarified derivation from RFC 1321; now handles byte order
	either statically or dynamically; added missing #include 
	in library.
  2002-03-11 lpd Corrected argument list for main(), and added int return
	type, in test program and T value program.
  2002-02-21 lpd Added missing #include  in test program.
  2000-07-03 lpd Patched to eliminate warnings about "constant is
	unsigned in ANSI C, signed in traditional"; made test program
	self-checking.
  1999-11-04 lpd Edited comments slightly for automatic TOC extraction.
  1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5).
  1999-05-03 lpd Original version.
 */

#include "md5.h"
#include 

#undef BYTE_ORDER	/* 1 = big-endian, -1 = little-endian, 0 = unknown */
#ifdef ARCH_IS_BIG_ENDIAN
#  define BYTE_ORDER (ARCH_IS_BIG_ENDIAN ? 1 : -1)
#else
#  define BYTE_ORDER 0
#endif

#define T_MASK ((md5_word_t)~0)
#define T1 /* 0xd76aa478 */ (T_MASK ^ 0x28955b87)
#define T2 /* 0xe8c7b756 */ (T_MASK ^ 0x173848a9)
#define T3    0x242070db
#define T4 /* 0xc1bdceee */ (T_MASK ^ 0x3e423111)
#define T5 /* 0xf57c0faf */ (T_MASK ^ 0x0a83f050)
#define T6    0x4787c62a
#define T7 /* 0xa8304613 */ (T_MASK ^ 0x57cfb9ec)
#define T8 /* 0xfd469501 */ (T_MASK ^ 0x02b96afe)
#define T9    0x698098d8
#define T10 /* 0x8b44f7af */ (T_MASK ^ 0x74bb0850)
#define T11 /* 0xffff5bb1 */ (T_MASK ^ 0x0000a44e)
#define T12 /* 0x895cd7be */ (T_MASK ^ 0x76a32841)
#define T13    0x6b901122
#define T14 /* 0xfd987193 */ (T_MASK ^ 0x02678e6c)
#define T15 /* 0xa679438e */ (T_MASK ^ 0x5986bc71)
#define T16    0x49b40821
#define T17 /* 0xf61e2562 */ (T_MASK ^ 0x09e1da9d)
#define T18 /* 0xc040b340 */ (T_MASK ^ 0x3fbf4cbf)
#define T19    0x265e5a51
#define T20 /* 0xe9b6c7aa */ (T_MASK ^ 0x16493855)
#define T21 /* 0xd62f105d */ (T_MASK ^ 0x29d0efa2)
#define T22    0x02441453
#define T23 /* 0xd8a1e681 */ (T_MASK ^ 0x275e197e)
#define T24 /* 0xe7d3fbc8 */ (T_MASK ^ 0x182c0437)
#define T25    0x21e1cde6
#define T26 /* 0xc33707d6 */ (T_MASK ^ 0x3cc8f829)
#define T27 /* 0xf4d50d87 */ (T_MASK ^ 0x0b2af278)
#define T28    0x455a14ed
#define T29 /* 0xa9e3e905 */ (T_MASK ^ 0x561c16fa)
#define T30 /* 0xfcefa3f8 */ (T_MASK ^ 0x03105c07)
#define T31    0x676f02d9
#define T32 /* 0x8d2a4c8a */ (T_MASK ^ 0x72d5b375)
#define T33 /* 0xfffa3942 */ (T_MASK ^ 0x0005c6bd)
#define T34 /* 0x8771f681 */ (T_MASK ^ 0x788e097e)
#define T35    0x6d9d6122
#define T36 /* 0xfde5380c */ (T_MASK ^ 0x021ac7f3)
#define T37 /* 0xa4beea44 */ (T_MASK ^ 0x5b4115bb)
#define T38    0x4bdecfa9
#define T39 /* 0xf6bb4b60 */ (T_MASK ^ 0x0944b49f)
#define T40 /* 0xbebfbc70 */ (T_MASK ^ 0x4140438f)
#define T41    0x289b7ec6
#define T42 /* 0xeaa127fa */ (T_MASK ^ 0x155ed805)
#define T43 /* 0xd4ef3085 */ (T_MASK ^ 0x2b10cf7a)
#define T44    0x04881d05
#define T45 /* 0xd9d4d039 */ (T_MASK ^ 0x262b2fc6)
#define T46 /* 0xe6db99e5 */ (T_MASK ^ 0x1924661a)
#define T47    0x1fa27cf8
#define T48 /* 0xc4ac5665 */ (T_MASK ^ 0x3b53a99a)
#define T49 /* 0xf4292244 */ (T_MASK ^ 0x0bd6ddbb)
#define T50    0x432aff97
#define T51 /* 0xab9423a7 */ (T_MASK ^ 0x546bdc58)
#define T52 /* 0xfc93a039 */ (T_MASK ^ 0x036c5fc6)
#define T53    0x655b59c3
#define T54 /* 0x8f0ccc92 */ (T_MASK ^ 0x70f3336d)
#define T55 /* 0xffeff47d */ (T_MASK ^ 0x00100b82)
#define T56 /* 0x85845dd1 */ (T_MASK ^ 0x7a7ba22e)
#define T57    0x6fa87e4f
#define T58 /* 0xfe2ce6e0 */ (T_MASK ^ 0x01d3191f)
#define T59 /* 0xa3014314 */ (T_MASK ^ 0x5cfebceb)
#define T60    0x4e0811a1
#define T61 /* 0xf7537e82 */ (T_MASK ^ 0x08ac817d)
#define T62 /* 0xbd3af235 */ (T_MASK ^ 0x42c50dca)
#define T63    0x2ad7d2bb
#define T64 /* 0xeb86d391 */ (T_MASK ^ 0x14792c6e)


static void
md5_process(md5_state_t *pms, const md5_byte_t *data /*[64]*/)
{
    md5_word_t
	a = pms->abcd[0], b = pms->abcd[1],
	c = pms->abcd[2], d = pms->abcd[3];
    md5_word_t t;
#if BYTE_ORDER > 0
    /* Define storage only for big-endian CPUs. */
    md5_word_t X[16];
#else
    /* Define storage for little-endian or both types of CPUs. */
    md5_word_t xbuf[16];
    const md5_word_t *X;
#endif

    {
#if BYTE_ORDER == 0
	/*
	 * Determine dynamically whether this is a big-endian or
	 * little-endian machine, since we can use a more efficient
	 * algorithm on the latter.
	 */
	static const int w = 1;

	if (*((const md5_byte_t *)&w)) /* dynamic little-endian */
#endif
#if BYTE_ORDER <= 0		/* little-endian */
	{
	    /*
	     * On little-endian machines, we can process properly aligned
	     * data without copying it.
	     */
	    if (!((data - (const md5_byte_t *)0) & 3)) {
		/* data are properly aligned */
		X = (const md5_word_t *)data;
	    } else {
		/* not aligned */
		memcpy(xbuf, data, 64);
		X = xbuf;
	    }
	}
#endif
#if BYTE_ORDER == 0
	else			/* dynamic big-endian */
#endif
#if BYTE_ORDER >= 0		/* big-endian */
	{
	    /*
	     * On big-endian machines, we must arrange the bytes in the
	     * right order.
	     */
	    const md5_byte_t *xp = data;
	    int i;

#  if BYTE_ORDER == 0
	    X = xbuf;		/* (dynamic only) */
#  else
#    define xbuf X		/* (static only) */
#  endif
	    for (i = 0; i < 16; ++i, xp += 4)
		xbuf[i] = xp[0] + (xp[1] << 8) + (xp[2] << 16) + (xp[3] << 24);
	}
#endif
    }

#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n))))

    /* Round 1. */
    /* Let [abcd k s i] denote the operation
       a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */
#define F(x, y, z) (((x) & (y)) | (~(x) & (z)))
#define SET(a, b, c, d, k, s, Ti)\
  t = a + F(b,c,d) + X[k] + Ti;\
  a = ROTATE_LEFT(t, s) + b
    /* Do the following 16 operations. */
    SET(a, b, c, d,  0,  7,  T1);
    SET(d, a, b, c,  1, 12,  T2);
    SET(c, d, a, b,  2, 17,  T3);
    SET(b, c, d, a,  3, 22,  T4);
    SET(a, b, c, d,  4,  7,  T5);
    SET(d, a, b, c,  5, 12,  T6);
    SET(c, d, a, b,  6, 17,  T7);
    SET(b, c, d, a,  7, 22,  T8);
    SET(a, b, c, d,  8,  7,  T9);
    SET(d, a, b, c,  9, 12, T10);
    SET(c, d, a, b, 10, 17, T11);
    SET(b, c, d, a, 11, 22, T12);
    SET(a, b, c, d, 12,  7, T13);
    SET(d, a, b, c, 13, 12, T14);
    SET(c, d, a, b, 14, 17, T15);
    SET(b, c, d, a, 15, 22, T16);
#undef SET

     /* Round 2. */
     /* Let [abcd k s i] denote the operation
          a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */
#define G(x, y, z) (((x) & (z)) | ((y) & ~(z)))
#define SET(a, b, c, d, k, s, Ti)\
  t = a + G(b,c,d) + X[k] + Ti;\
  a = ROTATE_LEFT(t, s) + b
     /* Do the following 16 operations. */
    SET(a, b, c, d,  1,  5, T17);
    SET(d, a, b, c,  6,  9, T18);
    SET(c, d, a, b, 11, 14, T19);
    SET(b, c, d, a,  0, 20, T20);
    SET(a, b, c, d,  5,  5, T21);
    SET(d, a, b, c, 10,  9, T22);
    SET(c, d, a, b, 15, 14, T23);
    SET(b, c, d, a,  4, 20, T24);
    SET(a, b, c, d,  9,  5, T25);
    SET(d, a, b, c, 14,  9, T26);
    SET(c, d, a, b,  3, 14, T27);
    SET(b, c, d, a,  8, 20, T28);
    SET(a, b, c, d, 13,  5, T29);
    SET(d, a, b, c,  2,  9, T30);
    SET(c, d, a, b,  7, 14, T31);
    SET(b, c, d, a, 12, 20, T32);
#undef SET

     /* Round 3. */
     /* Let [abcd k s t] denote the operation
          a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */
#define H(x, y, z) ((x) ^ (y) ^ (z))
#define SET(a, b, c, d, k, s, Ti)\
  t = a + H(b,c,d) + X[k] + Ti;\
  a = ROTATE_LEFT(t, s) + b
     /* Do the following 16 operations. */
    SET(a, b, c, d,  5,  4, T33);
    SET(d, a, b, c,  8, 11, T34);
    SET(c, d, a, b, 11, 16, T35);
    SET(b, c, d, a, 14, 23, T36);
    SET(a, b, c, d,  1,  4, T37);
    SET(d, a, b, c,  4, 11, T38);
    SET(c, d, a, b,  7, 16, T39);
    SET(b, c, d, a, 10, 23, T40);
    SET(a, b, c, d, 13,  4, T41);
    SET(d, a, b, c,  0, 11, T42);
    SET(c, d, a, b,  3, 16, T43);
    SET(b, c, d, a,  6, 23, T44);
    SET(a, b, c, d,  9,  4, T45);
    SET(d, a, b, c, 12, 11, T46);
    SET(c, d, a, b, 15, 16, T47);
    SET(b, c, d, a,  2, 23, T48);
#undef SET

     /* Round 4. */
     /* Let [abcd k s t] denote the operation
          a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */
#define I(x, y, z) ((y) ^ ((x) | ~(z)))
#define SET(a, b, c, d, k, s, Ti)\
  t = a + I(b,c,d) + X[k] + Ti;\
  a = ROTATE_LEFT(t, s) + b
     /* Do the following 16 operations. */
    SET(a, b, c, d,  0,  6, T49);
    SET(d, a, b, c,  7, 10, T50);
    SET(c, d, a, b, 14, 15, T51);
    SET(b, c, d, a,  5, 21, T52);
    SET(a, b, c, d, 12,  6, T53);
    SET(d, a, b, c,  3, 10, T54);
    SET(c, d, a, b, 10, 15, T55);
    SET(b, c, d, a,  1, 21, T56);
    SET(a, b, c, d,  8,  6, T57);
    SET(d, a, b, c, 15, 10, T58);
    SET(c, d, a, b,  6, 15, T59);
    SET(b, c, d, a, 13, 21, T60);
    SET(a, b, c, d,  4,  6, T61);
    SET(d, a, b, c, 11, 10, T62);
    SET(c, d, a, b,  2, 15, T63);
    SET(b, c, d, a,  9, 21, T64);
#undef SET

     /* Then perform the following additions. (That is increment each
        of the four registers by the value it had before this block
        was started.) */
    pms->abcd[0] += a;
    pms->abcd[1] += b;
    pms->abcd[2] += c;
    pms->abcd[3] += d;
}

void
md5_init(md5_state_t *pms)
{
    pms->count[0] = pms->count[1] = 0;
    pms->abcd[0] = 0x67452301;
    pms->abcd[1] = /*0xefcdab89*/ T_MASK ^ 0x10325476;
    pms->abcd[2] = /*0x98badcfe*/ T_MASK ^ 0x67452301;
    pms->abcd[3] = 0x10325476;
}

void
md5_append(md5_state_t *pms, const md5_byte_t *data, int nbytes)
{
    const md5_byte_t *p = data;
    int left = nbytes;
    int offset = (pms->count[0] >> 3) & 63;
    md5_word_t nbits = (md5_word_t)(nbytes << 3);

    if (nbytes <= 0)
	return;

    /* Update the message length. */
    pms->count[1] += nbytes >> 29;
    pms->count[0] += nbits;
    if (pms->count[0] < nbits)
	pms->count[1]++;

    /* Process an initial partial block. */
    if (offset) {
	int copy = (offset + nbytes > 64 ? 64 - offset : nbytes);

	memcpy(pms->buf + offset, p, copy);
	if (offset + copy < 64)
	    return;
	p += copy;
	left -= copy;
	md5_process(pms, pms->buf);
    }

    /* Process full blocks. */
    for (; left >= 64; p += 64, left -= 64)
	md5_process(pms, p);

    /* Process a final partial block. */
    if (left)
	memcpy(pms->buf, p, left);
}

void
md5_finish(md5_state_t *pms, md5_byte_t digest[16])
{
    static const md5_byte_t pad[64] = {
	0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    };
    md5_byte_t data[8];
    int i;

    /* Save the length before padding. */
    for (i = 0; i < 8; ++i)
	data[i] = (md5_byte_t)(pms->count[i >> 2] >> ((i & 3) << 3));
    /* Pad to 56 bytes mod 64. */
    md5_append(pms, pad, ((55 - (pms->count[0] >> 3)) & 63) + 1);
    /* Append the length. */
    md5_append(pms, data, 8);
    for (i = 0; i < 16; ++i)
	digest[i] = (md5_byte_t)(pms->abcd[i >> 2] >> ((i & 3) << 3));
}
slashem-0.0.7E7F3/win/proxy/nhextnb.c0000664000076400007640000002516510545462317015455 0ustar  aliali/* $Id: nhextnb.c,v 1.1 2003/10/25 18:06:01 j_ali Exp $ */
/* Copyright (c) Slash'EM Development Team 2003 */
/* NetHack may be freely redistributed.  See license for details. */

/* NhExt: Non-blocking support using threads & mutexes */

/* #define DEBUG */

#include 
#ifdef DEBUG
#include 
#endif
#include "nhxdr.h"

#ifdef WIN32
#include 
#include 

static int check_res(int res)
{
    return res == WAIT_ABANDONED || res == WAIT_OBJECT_0 ? 1 :
      res == WAIT_TIMEOUT ? 0 : -1;
}
#define DEFINE_LOCK(mutex)	HANDLE mutex
#define INIT_LOCK(mutex)	(mutex = CreateMutex(NULL, FALSE, NULL))
#define AQUIRE_LOCK_(mutex)	check_res(WaitForSingleObject(mutex, INFINITE))
#define TRY_LOCK_(mutex)	check_res(WaitForSingleObject(mutex, 0))
#define RELEASE_LOCK_(mutex)	ReleaseMutex(mutex)
#define FREE_LOCK(mutex)	CloseHandle(mutex)
#else	/* WIN32 */
#include 
#include 
#include 

#define DEFINE_LOCK(mutex)	pthread_mutex_t mutex
#define INIT_LOCK(mutex)	(!pthread_mutex_init(&(mutex), NULL))
#define AQUIRE_LOCK_(mutex)	(!pthread_mutex_lock(&(mutex)))
#define TRY_LOCK_(mutex)	(!pthread_mutex_trylock(&(mutex)))
#define RELEASE_LOCK_(mutex)	(!pthread_mutex_unlock(&(mutex)))
#define FREE_LOCK(mutex)	(!pthread_mutex_destroy(&(mutex)))
#endif

#ifdef DEBUG
#ifdef WIN32
#define debug_line(str)		fprintf(stderr, "[%X] %s\n", \
				  GetCurrentThreadId(), str)
#else
#define debug_line(str)		fprintf(stderr, "%s\n", str)
#endif
static int debug_line_res(int res, const char *mutex, const char *verb)
{
    char buf[100];
    if (res == 1)
	sprintf(buf, "Lock %s %sd", mutex, verb);
    else if (res == 0)
	sprintf(buf, "Lock %s not %sd", mutex, verb);
    else {
	sprintf(buf, "%s of lock %s produced error", verb, mutex);
	if (buf[0] >= 'a' && buf[0] <= 'z') {
	    buf[0] -= 'a';
	    buf[0] += 'A';
	}
    }
    debug_line(buf);
    return res;
}
#define AQUIRE_LOCK(mutex)	(debug_line("Aquiring lock " #mutex), \
				  debug_line_res(AQUIRE_LOCK_(mutex), \
				  #mutex, "aquire"))
#define TRY_LOCK(mutex)		debug_line_res(TRY_LOCK_(mutex), \
				  #mutex, "aquire")
#define RELEASE_LOCK(mutex)	debug_line_res(RELEASE_LOCK_(mutex), \
				  #mutex, "release")
#else
#define AQUIRE_LOCK(mutex)	AQUIRE_LOCK_(mutex)
#define TRY_LOCK(mutex)		TRY_LOCK_(mutex)
#define RELEASE_LOCK(mutex)	RELEASE_LOCK_(mutex)
#endif

#define NHEXT_NB_PENDING	1
#define NHEXT_NB_CLOSED		2
#define NHEXT_NB_ERROR		4

struct NhExtNB_ {
    unsigned int flags;
    nhext_io_func func;
    void *handle;
#ifdef WIN32
    HANDLE thread;
#else
    pthread_t thread;
#endif
    DEFINE_LOCK(m_A);
    DEFINE_LOCK(m_B);
    DEFINE_LOCK(m_C);
    struct {
	void *buffer;
	int bytes;
    } cmd;
    int res;
};

#ifdef WIN32
static unsigned  __stdcall read_thread(void *data)
{
    NhExtNB *nb = (NhExtNB *)data;
#else
static void *read_thread(void *data)
{
    NhExtNB *nb = (NhExtNB *)data;
#endif
    void *buffer = data;		/* Any non-zero value */
    int bytes;
#ifdef DEBUG
    debug_line("read_thread starts");
#endif
    if (AQUIRE_LOCK(nb->m_B)) {
	for(;;) {
	    if (!AQUIRE_LOCK(nb->m_C))
		break;
	    buffer = nb->cmd.buffer;
	    bytes = nb->cmd.bytes;
	    if (!RELEASE_LOCK(nb->m_B))
		break;
	    if (!AQUIRE_LOCK(nb->m_A))
		break;
	    if (!RELEASE_LOCK(nb->m_C))
		break;
	    if (!buffer)
		break;
	    if (!AQUIRE_LOCK(nb->m_B))
		break;
#ifdef DEBUG
	    debug_line("Issuing read call");
#endif
	    nb->res = (*nb->func)(nb->handle, buffer, bytes);
#ifdef DEBUG
	    debug_line("Read call returns");
#endif
	    if (!RELEASE_LOCK(nb->m_A))
		break;
	}
    }
    (void)RELEASE_LOCK(nb->m_A);
    if (!buffer) {
	/* Controlled exit - we're responsible for cleaning up */
	(void)FREE_LOCK(nb->m_A);
	(void)FREE_LOCK(nb->m_B);
	(void)FREE_LOCK(nb->m_C);
#ifdef WIN32
	CloseHandle(nb->thread);
#endif
#ifdef DEBUG
	debug_line("read_thread terminates");
#endif
	free(nb);
	return 0;
    } else {
	(void)RELEASE_LOCK(nb->m_B);
	(void)RELEASE_LOCK(nb->m_C);
#ifdef DEBUG
	debug_line("read_thread aborts");
#endif
#ifdef WIN32
	return 1;
#else
	return (void *)1;
#endif
    }
}

/*
 * Sequence of events for a non-blocking read:
 *
 *	Read thread			Main thread
 *	-----------			-----------
 *	B  C Waiting for cmd		AC - nhext_nb_read called
 *	B  C Waiting for cmd		AC - Writes cmd
 *	BC - Copying cmd		A  B Issues cmd
 *	C  A				AB -
 *	AC -				B  C Waiting for cmd to be actioned
 *	A  B Ready to action cmd	BC -
 *	AB - In underlying system	C  - Returns to caller
 *	AB - In underlying system	C  A nhext_nb_read re-called
 *	B  - Result recorded		AC - Result available to caller
 *
 * (The first column for each thread is the locks currently aquired. The second
 * column is the locks currently being waited for.)
 *
 * Sequence of events for a blocking read:
 *
 *	Read thread			Main thread
 *	-----------			-----------
 *	B  C Waiting for cmd		AC - nhext_nb_read called
 *	B  C Waiting for cmd		AC - Writes cmd
 *	BC - Copying cmd		A  B Issues cmd
 *	C  A				AB -
 *	AC -				B  C Waiting for cmd to be actioned
 *	A  B Ready to action cmd	BC -
 *	AB - In underlying system	C  A Waiting for results
 *	B  - Result recorded		AC - Returns to caller
 *
 * The mutexes also protect certain fields as follows:
 *	A - res
 *	B -
 *	C - cmd
 */

NhExtNB *nhext_nb_open(nhext_io_func func, void *handle)
{
    NhExtNB *nb;
    int retval;
    nb = malloc(sizeof(*nb));
    if (!nb) {
#ifdef DEBUG
	debug_line("nhext_nb_open failing (not enough memory)");
#endif
	return NULL;
    }
    nb->func = func;
    nb->handle = handle;
    if (!INIT_LOCK(nb->m_A)) {
	free(nb);
#ifdef DEBUG
	debug_line("nhext_nb_open failing (can't init lock A)");
#endif
	return NULL;
    }
    if (!INIT_LOCK(nb->m_B)) {
	FREE_LOCK(nb->m_A);
#ifdef DEBUG
	debug_line("nhext_nb_open failing (can't init lock B)");
#endif
	free(nb);
	return NULL;
    }
    if (!INIT_LOCK(nb->m_C)) {
	FREE_LOCK(nb->m_A);
	FREE_LOCK(nb->m_B);
#ifdef DEBUG
	debug_line("nhext_nb_open failing (can't init lock C)");
#endif
	free(nb);
	return NULL;
    }
    if (!AQUIRE_LOCK(nb->m_A) || !AQUIRE_LOCK(nb->m_C)) {
#ifdef DEBUG
	debug_line("nhext_nb_open failing (can't aquire locks A & C)");
#endif
	goto out;
    }
    nb->flags = 0;
#ifdef WIN32
    nb->thread = (HANDLE)_beginthreadex(NULL, 0, read_thread, nb, 0, NULL);
    if (!nb->thread) {
#else
    if (pthread_create(&nb->thread, NULL, read_thread, nb) == EAGAIN) {
#endif
#ifdef DEBUG
	debug_line("nhext_nb_open failing (can't create read thread)");
#endif
out:	RELEASE_LOCK(nb->m_A);
	RELEASE_LOCK(nb->m_C);
	FREE_LOCK(nb->m_A);
	FREE_LOCK(nb->m_B);
	FREE_LOCK(nb->m_C);
	free(nb);
	return NULL;
    }
    /*
     * We must wait for the read thread to start and aquire the B mutex
     * or the synchronization will fail.
     */
    while ((retval = TRY_LOCK(nb->m_B)) > 0) {
	if (!RELEASE_LOCK(nb->m_B)) {
#ifdef WIN32
	    TerminateThread(nb->thread, -1);
	    CloseHandle(nb->thread);
#else
	    pthread_cancel(nb->thread);
#endif
#ifdef DEBUG
	    debug_line("nhext_nb_open failing (can't release lock B)");
#endif
	    goto out;
	}
#ifdef WIN32
	Sleep(0);			/* Relinquish time slice */
#else
# ifdef _POSIX_PRIORITY_SCHEDULING
	sched_yield();			/* Relinquish time slice */
# else
	sleep(0);
# endif
#endif
    }
    if (retval < 0) {
	nhext_nb_close(nb);
#ifdef DEBUG
	debug_line("nhext_nb_open failing (error in trying to aquire lock B)");
#endif
	return NULL;
    }
    return nb;
}

int nhext_nb_close(NhExtNB *nb)
{
    int retval;
    if (nb->flags & NHEXT_NB_CLOSED)
	return -1;
    nb->flags |= NHEXT_NB_CLOSED;
    /*
     * Mutex B should always be owned by the read thread unless we have aborted
     * in the middle of a call to nhext_nb_read.
     */
    retval = TRY_LOCK(nb->m_B);
    if (retval == 1) {
#ifdef WIN32
	DWORD code;
	if (GetExitCodeThread(nb->thread, &code) == STILL_ACTIVE) {
	    /*
	     * Something has gone drastically wrong. Clean up as best we can.
	     */
	    TerminateThread(nb->thread, 1);
	    code = 1;
	}
#else
	void *code;
	if (pthread_join(nb->thread, &code)) {
	    /*
	     * Something has gone drastically wrong. Clean up as best we can.
	     */
	    pthread_cancel(nb->thread);
	    code = (void *)1;
	}
#endif
	if (code) {
	    /* Read thread has aborted. Clean up */
#ifdef WIN32
	    CloseHandle(nb->thread);
#endif
	    RELEASE_LOCK(nb->m_A);
	    RELEASE_LOCK(nb->m_B);
	    RELEASE_LOCK(nb->m_C);
	    FREE_LOCK(nb->m_A);
	    FREE_LOCK(nb->m_B);
	    FREE_LOCK(nb->m_C);
	    free(nb);
	} else {
	    /* read thread has terminated and cleaned up (shouldn't happen) */
	    RELEASE_LOCK(nb->m_B);
	}
	return -1;
    }
    nb->cmd.buffer = NULL;
    nb->cmd.bytes = 0;
    if (!(nb->flags & NHEXT_NB_PENDING))
	RELEASE_LOCK(nb->m_A);
    RELEASE_LOCK(nb->m_C);
    /* The read thread is responsible for cleaning up - if a read is pending
     * this will be after it finishes.
     */
    return 0;
}

int nhext_nb_read(NhExtNB *nb, char *buf, int bytes, int blocking)
{
    int retval;
#ifdef DEBUG
    debug_line("nhext_nb_read called");
#endif
    if (nb->flags & NHEXT_NB_ERROR)
	return -1;
    if (!(nb->flags & NHEXT_NB_PENDING)) {
	nb->cmd.buffer = buf;
	nb->cmd.bytes = bytes;
	if (!RELEASE_LOCK(nb->m_C) || !AQUIRE_LOCK(nb->m_B) ||
	  !RELEASE_LOCK(nb->m_A) || !AQUIRE_LOCK(nb->m_C) ||
	  !RELEASE_LOCK(nb->m_B)) {
	    nb->flags |= NHEXT_NB_ERROR;
#ifdef DEBUG
	    debug_line("nhext_nb_read failing with hard error");
#endif
	    return -1;
	}
	if (!blocking) {
	    nb->flags |= NHEXT_NB_PENDING;
#ifdef DEBUG
	    debug_line("nhext_nb_read returning PENDING");
#endif
	    return -2;
	} else {
	    if (!AQUIRE_LOCK(nb->m_A)) {
		nb->flags |= NHEXT_NB_ERROR;
#ifdef DEBUG
		debug_line("nhext_nb_read failing with hard error");
#endif
		return -1;
	    }
#ifdef DEBUG
	    debug_line("nhext_nb_read returns result");
#endif
	    return nb->res >= 0 ? nb->res : -1;
	}
    } else {
	if (buf != nb->cmd.buffer || bytes < nb->cmd.bytes) {
#ifdef DEBUG
	    debug_line("nhext_nb_read failing with soft error (INVALID)");
#endif
	    return -1;
	}
	if (!blocking) {
	    retval = TRY_LOCK(nb->m_A);
	    if (retval == 1) {
		nb->flags &= ~NHEXT_NB_PENDING;
#ifdef DEBUG
		debug_line("nhext_nb_read returns result");
#endif
		return nb->res >= 0 ? nb->res : -1;
	    } else if (retval) {
		nb->flags |= NHEXT_NB_ERROR;
#ifdef DEBUG
		debug_line("nhext_nb_read failing with hard error");
#endif
		return -1;
	    }
	    else {
#ifdef DEBUG
		debug_line("nhext_nb_read returning PENDING");
#endif
		return -2;
	    }
	} else {
	    if (!AQUIRE_LOCK(nb->m_A)) {
		nb->flags |= NHEXT_NB_ERROR;
#ifdef DEBUG
		debug_line("nhext_nb_read failing with hard error");
#endif
		return -1;
	    }
	    nb->flags &= ~NHEXT_NB_PENDING;
#ifdef DEBUG
	    debug_line("nhext_nb_read returns result");
#endif
	    return nb->res >= 0 ? nb->res : -1;
	}
    }
}
slashem-0.0.7E7F3/win/proxy/Install.pxy0000664000076400007640000001230110545462317015777 0ustar  alialiThe proxy window interface allows the game to be built with support
for external window interfaces. These have many advantages over
internal interfaces: they can be added later by groups other than
the dev-team with no need for changes to the game source; they can
run in seperate processes and even on seperate machines; they can
run as different users (which avoids security problems when the
game is run as setuid or setgid).

External window interfaces are not without their disadvantages.
There is an overhead associated with the NhExt protocol and more
information needs to be shared (since less can be assumed). This
takes time to do, especially during startup.

The following configurations currently exist:

A. Plug-in window interfaces

In this configuration the game itself is built with the proxy interface
as a window interface. Typically just two windowing systems will be
installed in the main executable - tty and proxy. The tty interface
should be the default windowing system.

Each windowing system which needs to be supported is then supplied
as a plug-in window interface.

The game and plug-in interface consist of the following systems:

Game:
	WINPROXY	Game side proxy support
	PROXYCOM	Common proxy support
	PROXYUTL	Interfaces between proxy and the game
	NHWIN		Tile support
	WINTTY		TTY window interface
	HACK		The game core

Plug-in interface:
	WINDOW		The window interface (eg., GTK)
	NHPROXY		Plug-in side proxy support

To build:

	1. Configure config.h as follows:
		Define PROXY_GRAPHICS and TTY_GRAPHICS
	   You may also define other _GRAPHICS symbols for multiple
	   windowing ports in the same executable if you so desire.

	2. [UNIX] Configure toplevel Makefile for proxy use:
	
	   Add $(CNF_SHARE_PROXYND) to the definition of CNF_SHARE_DATND.

	3. Configure src/Makefile for proxy use:

	   [UNIX]

	   Add the following to WINSRC, WINOBJ, and WINLIB and compile:

	    [WINSRC]   $(WINTTYSRC) $(WINPROXYSRC) $(PROXYUTLSRC) $(PROXYCOMSRC)
	    [WINOBJ]   $(WINTTYOBJ) $(WINPROXYOBJ) $(PROXYUTLOBJ) $(PROXYCOMOBJ)
	    [WINLIB]   $(WINTTYLIB) $(WINPROXYLIB)

	   This will give you an executable supporting both tty and plug-in
	   windowing ports.

	   To support multiple windowing ports, change the definitions
	   of WINSRC, WINOBJ and WINLIB to include all the relevant
	   variables.

	   [MS-Windows]

	   Change the definition of USE_GTK and USE_PROXY as follows and
	   compile:

	    USE_GTK = N
	    USE_PROXY = Y

	   This will give you an executable supporting both tty and plug-in
	   windowing ports. Multiple windowing ports are not supported under
	   MS-Windows.

	4. Follow all the instructions in ../../sys/unix/Install.unx or the
	   appropriate documentation in ../../sys/winnt for the remainder of
	   the installation process.

	5. Build proxy library by "make nhproxy.a" in src

	6. Follow the instructions in ../../win/ to build an external
	   window interface for the relevant windowing systems you want to
	   make available (and which support external interfaces).

	7. If you want to enable users on remote computers to play games
	   on your computer over the network, then you need to configure
	   your system for this. The details of this will vary from system
	   to system, but this is how you do it for systems running xinetd:

	   a. Add a line to /etc/services such as the following:

	      slashem         2700/tcp            # Slash'EM game server

	      (the choice of port 2700 is arbitary.)

	   b. Add a file to /etc/xinetd.d (called eg., slashem) with the
	      following contents:

	      # default: on
	      # description: The slashem server serves NhExt connections.
	      service slashem
	      {
	      		disable			= no
			socket_type		= stream
			wait			= no
			user			= games
			server			= /usr/local/bin/slashem
			server_args		= --proxy
			env			= HOME=/etc/slashem
			log_on_success		+= DURATION USERID
			log_on_failure		+= USERID
			nice			= 10
	      }

	      (you will need to alter the location of the server if it is
	      installed in a different directory, or with a different name.)
	
	   c. Create a configuration file /etc/slashem/.slashemrc which is
	      readable by user games. It is probably better if the file (and
	      the /etc/slashem directory) is owned by root.

	   d. In /etc/slashem/.slashemrc you can specify the tilesets that
	      the proxy server will allow access to (remote clients are not
	      permitted to override TILESET settings). You can also specify
	      default options if you are not happy with the ones hardcoded
	      into slashem.

	      Example contents:

	      TILESET=name:Small tiles, file:gltile16.png
	      TILESET=name:Big tiles, file:gltile32.png, transparent
	      TILESET=name:Big 3D tiles, file:gltile64.png, transparent, pseudo3D

	   e. Cause xinetd to re-read its configuration files. See the
	      xinetd manual page for details.

B. Proxified window interfaces

This configuration uses dual processes (which has the advantage of
allowing the windowing interface to run without elevated privileges -
necessary for GTK).  It is somewhat simpler than plug-in window
interfaces but is much less flexible.

To build these interfaces follow the instructions in the directory
containing the relevant window interface (currently only GTK).
slashem-0.0.7E7F3/win/proxy/dlbh.c0000664000076400007640000000535410545462317014716 0ustar  aliali/* $Id: dlbh.c,v 1.1 2001/12/11 20:43:49 j_ali Exp $ */
/* Copyright (c) Slash'EM Development Team 2001-2002 */
/* NetHack may be freely redistributed.  See license for details. */

#include "hack.h"
#include "dlb.h"

/*
 * A tiny front end to the dlb module which supports small integer handles.
 */

#define HANDLES_PER_NODE	32

struct dlb_node {
    struct dlb_node *next;
    int offset;
    dlb *handles[HANDLES_PER_NODE];
} *nodes = (struct dlb_node *)0;

int
#ifndef FILE_AREAS
dlbh_fopen(file, mode)
const char *file, *mode;
#else
dlbh_fopen_area(area, file, mode)
const char *area, *file, *mode;
#endif
{
    int i;
    struct dlb_node *n;
    for(n = nodes; n; n = n->next) {
	for(i = 0; i < HANDLES_PER_NODE; i++)
	    if (!n->handles[i])
		break;
	if (i < HANDLES_PER_NODE)
	    break;
    }
    if (!n) {
	n = (struct dlb_node *) alloc(sizeof(struct dlb_node));
	n->next = nodes;
	n->offset = nodes ? nodes->offset + HANDLES_PER_NODE : 0;
	for(i = 0; i < HANDLES_PER_NODE; i++)
	    n->handles[i] = NULL;
	nodes = n;
	i = 0;
    }
#ifndef FILE_AREAS
    n->handles[i] = dlb_fopen(file, mode);
#else
    n->handles[i] = dlb_fopen_area(area, file, mode);
#endif
    return n->handles[i] ? n->offset + i : -1;
}

static struct dlb_node *
dlbh_find_node(int fh)
{
    struct dlb_node *n;
    if (!nodes || fh >= nodes->offset + HANDLES_PER_NODE)
	return (struct dlb_node *)0;
    for(n = nodes; n; n = n->next)
	if (fh >= n->offset)
	    return n;
    return (struct dlb_node *)0;
}

int
dlbh_fclose(fh)
int fh;
{
    int i, retval;
    struct dlb_node *n = dlbh_find_node(fh);
    if (!n)
	return -1;
    retval = dlb_fclose(n->handles[fh - n->offset]);
    n->handles[fh - n->offset] = NULL;
    if (n == nodes) {
	while (nodes) {
	    for(i = 0; i < HANDLES_PER_NODE; i++)
		if (nodes->handles[i])
		    break;
	    if (i == HANDLES_PER_NODE) {
		n = nodes;
		nodes = nodes->next;
		free(n);
	    }
	    else
		break;
	}
    }
    return retval;
}

int
dlbh_fread(buf, size, quan, fh)
char *buf;
int size, quan, fh;
{
    struct dlb_node *n = dlbh_find_node(fh);
    return n ? dlb_fread(buf, size, quan, n->handles[fh - n->offset]) : 0;
}

int
dlbh_fseek(fh, pos, whence)
int fh;
long pos;
int whence;
{
    struct dlb_node *n = dlbh_find_node(fh);
    return n ? dlb_fseek(n->handles[fh - n->offset], pos, whence) : EOF;
}

char *
dlbh_fgets(buf, len, fh)
char *buf;
int len;
int fh;
{
    struct dlb_node *n = dlbh_find_node(fh);
    return n ? dlb_fgets(buf, len, n->handles[fh - n->offset]) : (char *)0;
}

int
dlbh_fgetc(fh)
int fh;
{
    struct dlb_node *n = dlbh_find_node(fh);
    return n ? dlb_fgetc(n->handles[fh - n->offset]) : EOF;
}

long
dlbh_ftell(fh)
int fh;
{
    struct dlb_node *n = dlbh_find_node(fh);
    return n ? dlb_ftell(n->handles[fh - n->offset]) : 0;
}
slashem-0.0.7E7F3/win/proxy/riputil.c0000664000076400007640000000215010545462317015464 0ustar  aliali/* $Id: riputil.c,v 1.1 2001/12/11 20:43:49 j_ali Exp $ */
/* Copyright (c) Slash'EM Development Team 2001-2002 */
/* NetHack may be freely redistributed.  See license for details. */

#include "hack.h"

extern const char *killed_by_prefix[];

char *
get_killer_string(how)
int how;
{
    static char buf[BUFSZ];
    /* Put together death description */
    switch (killer_format) {
	default: impossible("bad killer format?");
	case KILLED_BY_AN:
	    if (Instant_Death) {
		Strcpy(buf, "instantly ");
		strcat(buf, killed_by_prefix[how]);
	    }
	    else if (Quick_Death) {
		Strcpy(buf, "quickly ");
		strcat(buf, killed_by_prefix[how]);
	    }
	    else
		Strcpy(buf, killed_by_prefix[how]);
	    Strcat(buf, an(killer));
	    break;
	case KILLED_BY:
	    if (Instant_Death) {
		Strcpy(buf, "instantly ");
		strcat(buf, killed_by_prefix[how]);
	    }
	    else if (Quick_Death) {
		Strcpy(buf, "quickly ");
		strcat(buf, killed_by_prefix[how]);
	    }
	    else
		Strcpy(buf, killed_by_prefix[how]);
	    Strcat(buf, killer);
	    break;
	case NO_KILLER_PREFIX:
	    Strcpy(buf, killer);
	    break;
    }
    return buf;
}
slashem-0.0.7E7F3/win/proxy/Makefile.w320000664000076400007640000000360510545462317015710 0ustar  aliali# $Id: Makefile.w32,v 1.6 2003/10/25 18:06:01 j_ali Exp $
# Copyright (c) Slash'EM Development Team 2001-2003
# NetHack may be freely redistributed.  See license for details.
#
# This makefile is for maintainer use. It is not needed when building the game.

CC = gcc
CFLAGS = -g -I../../include

# ----------------------------------------
#
# Nothing below this line should have to be changed.

# timestamps for primary header files, matching src/Makefile
CONFIG_H = ../../src/config.h-t
HACK_H  = ../../src/hack.h-t

CSRC = nhxdr.c nhext.c nhextxdr.c

all:	tests

FORCE:

tests:	test_ext.exe test_io.exe FORCE
	@echo ""
	@echo Testing NhExt sub-protocol 1 support routines...
	@echo ============================
	- ./test_ext
	@echo ============================
	@echo ""
	@echo Testing NhExt I/O buffering routines...
	@echo ============================
	- ./test_io
	@echo ============================

test_ext.exe:	test_ext.c test_com.o nhext.o nhxdr.o nhextxdr.o nhextio.o \
	nhextnb.o
	$(CC) $(CFLAGS) -o test_ext test_ext.c test_com.o nhext.o nhxdr.o \
		nhextxdr.o nhextio.o nhextnb.o

test_io.exe:	test_io.c test_com.o nhextio.o nhextnb.o
	$(CC) $(CFLAGS) -o test_io test_io.c test_com.o nhextio.o nhextnb.o

clean:
	-del *.o
	-del test_ext.exe
	-del test_io.exe

spotless:	clean

# DO NOT DELETE THIS LINE OR CHANGE ANYTHING BEYOND IT

# config.h timestamp
$(CONFIG_H): ../../include/config.h
	@echo /**/ >> $(CONFIG_H)
# hack.h timestamp
$(HACK_H): ../../include/hack.h
	@echo /**/ >> $(HACK_H)
#
nhxdr.o: nhxdr.c ../../include/nhxdr.h
nhext.o: nhext.c ../../include/nhxdr.h ../../include/proxycom.h
nhextxdr.o: nhextxdr.c ../../include/nhxdr.h
nhextio.o: nhextio.c ../../include/nhxdr.h ../../include/proxycom.h
nhextnb.o: nhextnb.c ../../include/nhxdr.h ../../include/proxycom.h
test_com.o: test_com.c test_com.h
# DEPENDENCIES MUST END AT END OF FILE
# IF YOU PUT STUFF HERE IT WILL GO AWAY
# see Makefile.unx
slashem-0.0.7E7F3/win/proxy/compxdr.c0000664000076400007640000001712510545462317015460 0ustar  aliali/* $Id: compxdr.c,v 1.14 2003/10/25 18:06:01 j_ali Exp $ */
/* Copyright (c) Slash'EM Development Team 2001-2003 */
/* NetHack may be freely redistributed.  See license for details. */

#include 
#include "nhxdr.h"
#include "proxycom.h"

/*
 * This module implements the XDR routines for non-trivial compound types that
 * NhExt needs.
 */

nhext_xdr_bool_t proxycb_xdr_subprot2_init(xdr, datum)
NhExtXdr *xdr;
struct proxycb_subprot2_init *datum;
{
    return nhext_xdr_array(xdr, (char **)&datum->masks, &datum->n_masks,
	(unsigned int)-1, sizeof(unsigned long), nhext_xdr_u_long);
}

nhext_xdr_bool_t proxy_xdr_init_nhwindow_req(xdr, datum)
NhExtXdr *xdr;
struct proxy_init_nhwindow_req *datum;
{
    return nhext_xdr_array(xdr, (char **)&datum->argv, 
      &datum->argc, (unsigned int)-1, sizeof(char *), nhext_xdr_wrapstring);
}

nhext_xdr_bool_t proxy_xdr_init_nhwindow_res(xdr, datum)
NhExtXdr *xdr;
struct proxy_init_nhwindow_res *datum;
{
    int retval = nhext_xdr_bool(xdr, &datum->inited);
    retval &= nhext_xdr_array(xdr, (char **)&datum->argv, 
      &datum->argc, (unsigned int)-1, sizeof(char *), nhext_xdr_wrapstring);
    retval &= nhext_xdr_array(xdr, (char **)&datum->capv, 
      &datum->capc, (unsigned int)-1, sizeof(char *), nhext_xdr_wrapstring);
    return retval;
}

nhext_xdr_bool_t proxy_xdr_proxy_mi(xdrs, datum)
NhExtXdr *xdrs;
struct proxy_mi *datum;
{
    return nhext_xdr_int(xdrs, &datum->item) && nhext_xdr_long(xdrs, &datum->count);
}

nhext_xdr_bool_t proxy_xdr_select_menu_res(xdr, datum)
NhExtXdr *xdr;
struct proxy_select_menu_res *datum;
{
    int retval;
    retval = nhext_xdr_int(xdr, &datum->retval);
    retval &= nhext_xdr_array(xdr, (char **)&datum->selected, 
      &datum->n, 0xffffffff, sizeof(struct proxy_mi), proxy_xdr_proxy_mi);
    return retval;
}

nhext_xdr_bool_t proxy_xdr_status_req(xdr, datum)
NhExtXdr *xdr;
struct proxy_status_req *datum;
{
    return nhext_xdr_int(xdr, &datum->reconfig) &
      nhext_xdr_array(xdr, (char **)&datum->values, 
      &datum->nv, (unsigned int)-1, sizeof(char *), nhext_xdr_wrapstring);
}

nhext_xdr_bool_t proxy_xdr_glyph_row(xdr, datum)
NhExtXdr *xdr;
struct proxy_glyph_row *datum;
{
    return nhext_xdr_int(xdr, &datum->start) &
      nhext_xdr_array(xdr, (char **)&datum->glyphs, 
      &datum->ng, (unsigned int)-1, sizeof(int), nhext_xdr_int);
}

nhext_xdr_bool_t proxy_xdr_glyph_layer(xdr, datum)
NhExtXdr *xdr;
struct proxy_glyph_layer *datum;
{
    return nhext_xdr_int(xdr, &datum->start) &
      nhext_xdr_array(xdr, (char **)&datum->rows, &datum->nr,
      (unsigned int)-1, sizeof(struct proxy_glyph_row), proxy_xdr_glyph_row);
}

nhext_xdr_bool_t proxy_xdr_print_glyph_layered_req(xdr, datum)
NhExtXdr *xdr;
struct proxy_print_glyph_layered_req *datum;
{
    return nhext_xdr_int(xdr, &datum->window) &
      nhext_xdr_array(xdr, (char **)&datum->layers, &datum->nl,
      (unsigned int)-1, sizeof(struct proxy_glyph_layer),
      proxy_xdr_glyph_layer);
}

nhext_xdr_bool_t proxycb_xdr_get_player_choices_res_role(xdr, datum)
NhExtXdr *xdr;
struct proxycb_get_player_choices_res_role *datum;
{
    return nhext_xdr_wrapstring(xdr, (char **)&datum->male) &
      nhext_xdr_wrapstring(xdr, (char **)&datum->female);
}

nhext_xdr_bool_t proxycb_xdr_get_player_choices_res(xdr, datum)
NhExtXdr *xdr;
struct proxycb_get_player_choices_res *datum;
{
    return nhext_xdr_array(xdr, (char **)&datum->aligns, &datum->n_aligns,
        (unsigned int)-1, sizeof(char *), nhext_xdr_wrapstring) &
      nhext_xdr_array(xdr, (char **)&datum->genders, &datum->n_genders,
        (unsigned int)-1, sizeof(char *), nhext_xdr_wrapstring) &
      nhext_xdr_array(xdr, (char **)&datum->races, &datum->n_races,
        (unsigned int)-1, sizeof(char *), nhext_xdr_wrapstring) &
      nhext_xdr_array(xdr, (char **)&datum->roles, &datum->n_roles,
        (unsigned int)-1, sizeof(struct proxycb_get_player_choices_res_role),
	proxycb_xdr_get_player_choices_res_role);
}

nhext_xdr_bool_t proxycb_xdr_get_valid_selections_res(xdr, datum)
NhExtXdr *xdr;
struct proxycb_get_valid_selections_res *datum;
{
    return nhext_xdr_int(xdr, &datum->no_roles) &
      nhext_xdr_int(xdr, &datum->no_races) &
      nhext_xdr_int(xdr, &datum->no_aligns) &
      nhext_xdr_int(xdr, &datum->no_genders) &
      nhext_xdr_array(xdr, (char **)&datum->masks, &datum->n_masks,
        (unsigned int)-1, sizeof(unsigned long), nhext_xdr_u_long);
}

nhext_xdr_bool_t proxycb_xdr_get_extended_commands_res(xdr, datum)
NhExtXdr *xdr;
struct proxycb_get_extended_commands_res *datum;
{
    return nhext_xdr_array(xdr, (char **)&datum->commands, &datum->n_commands,
        (unsigned int)-1, sizeof(char *), nhext_xdr_wrapstring);
}

nhext_xdr_bool_t proxycb_xdr_get_tilesets_res_tileset(xdr, datum)
NhExtXdr *xdr;
struct proxycb_get_tilesets_res_tileset *datum;
{
    return nhext_xdr_wrapstring(xdr, (char **)&datum->name) &
      nhext_xdr_wrapstring(xdr, (char **)&datum->file) &
      nhext_xdr_wrapstring(xdr, (char **)&datum->mapfile) &
      nhext_xdr_long(xdr, &datum->flags);
}

nhext_xdr_bool_t proxycb_xdr_get_tilesets_res(xdr, datum)
NhExtXdr *xdr;
struct proxycb_get_tilesets_res *datum;
{
    return nhext_xdr_array(xdr, (char **)&datum->tilesets, &datum->n_tilesets,
        (unsigned int)-1, sizeof(struct proxycb_get_tilesets_res_tileset),
	proxycb_xdr_get_tilesets_res_tileset);
}

nhext_xdr_bool_t proxycb_xdr_get_glyph_mapping_res_symdef(xdr, datum)
NhExtXdr *xdr;
struct proxycb_get_glyph_mapping_res_symdef *datum;
{
    return nhext_xdr_long(xdr, &datum->rgbsym) &
      nhext_xdr_wrapstring(xdr, (char **)&datum->description);
}

nhext_xdr_bool_t proxycb_xdr_get_glyph_mapping_res_submapping(xdr, datum)
NhExtXdr *xdr;
struct proxycb_get_glyph_mapping_res_submapping *datum;
{
    int start, retval;
    start = xdr->x_pos;
    retval = proxycb_xdr_get_glyph_mapping_res_symdef(xdr, &datum->symdef) &
      nhext_xdr_array(xdr, (char **)&datum->glyphs, &datum->n_glyphs,
        (unsigned int)-1, sizeof(struct proxycb_get_glyph_mapping_res_symdef),
	proxycb_xdr_get_glyph_mapping_res_symdef);
    return retval;
}

nhext_xdr_bool_t proxycb_xdr_get_glyph_mapping_res_mapping(xdr, datum)
NhExtXdr *xdr;
struct proxycb_get_glyph_mapping_res_mapping *datum;
{
    return nhext_xdr_wrapstring(xdr, (char **)&datum->flags) &
      nhext_xdr_int(xdr, &datum->base_mapping) &
      nhext_xdr_int(xdr, &datum->alt_glyph) &
      proxycb_xdr_get_glyph_mapping_res_symdef(xdr, &datum->symdef) &
      nhext_xdr_array(xdr, (char **)&datum->submappings, &datum->n_submappings,
        (unsigned int)-1,
	sizeof(struct proxycb_get_glyph_mapping_res_submapping),
	proxycb_xdr_get_glyph_mapping_res_submapping);
}

nhext_xdr_bool_t proxycb_xdr_get_glyph_mapping_res(xdr, datum)
NhExtXdr *xdr;
struct proxycb_get_glyph_mapping_res *datum;
{
    return nhext_xdr_int(xdr, &datum->no_glyph) &
      nhext_xdr_long(xdr, &datum->transparent) &
      nhext_xdr_array(xdr, (char **)&datum->mappings, &datum->n_mappings,
        (unsigned int)-1, sizeof(struct proxycb_get_glyph_mapping_res_mapping),
	proxycb_xdr_get_glyph_mapping_res_mapping);
}

nhext_xdr_bool_t proxycb_xdr_get_extensions_res_extension(xdr, datum)
NhExtXdr *xdr;
struct proxycb_get_extensions_res_extension *datum;
{
    return nhext_xdr_wrapstring(xdr, (char **)&datum->name) &
      nhext_xdr_wrapstring(xdr, (char **)&datum->version) &
      nhext_xdr_int(xdr, &datum->no_procedures);
}

nhext_xdr_bool_t proxycb_xdr_get_extensions_res(xdr, datum)
NhExtXdr *xdr;
struct proxycb_get_extensions_res *datum;
{
    return nhext_xdr_array(xdr, (char **)&datum->extensions,
	&datum->n_extensions, (unsigned int)-1,
	sizeof(struct proxycb_get_extensions_res_extension),
	proxycb_xdr_get_extensions_res_extension);
}
slashem-0.0.7E7F3/win/proxy/getopt.c0000664000076400007640000001415710545462317015310 0ustar  aliali/* $Id: getopt.c,v 1.4.2.1 2005/08/13 11:28:08 prousu Exp $ */
/* Copyright (c) Slash'EM Development Team 2002 */
/* NetHack may be freely redistributed.  See license for details. */

#include "hack.h"

/*
 * This module allows option value to be read by reading the values of
 * the game's internal variables.
 */

/*
 * boolopt[] is a private array of the options module. Defining the structure
 * here is a bit of a hack. If we don't end up merging this module with the
 * core options module then we should probably share information about this
 * variable in a rather more sensible fashion. --ALI
 */

static struct Bool_Opt
{
    const char *name;
    boolean *addr, initvalue;
    int optflags;
} *boolopt = (struct Bool_Opt *)0;

static int
get_option_bool(const char *option)
{
    int i;
    if (!boolopt)
	boolopt = (struct Bool_Opt *)nh_option_get_boolopt();
    for(i = 0; boolopt[i].name; i++)
	if (!strcmp(option, boolopt[i].name)) {
	    return boolopt[i].addr ? *(boolopt[i].addr) : FALSE;
	}
    if (!strcmp(option, "female"))  return flags.female;
    if (!strcmp(option, "male"))  return !flags.female;
    return -2;
}

static void
encode_escapes(buf, syms, length)
char *buf;
uchar *syms;
int length;
{
    int i, j;
    uchar v;
    for(i = j = 0; i < length; i++) {
	v = syms[i];
	if (v == 0 || v > 126) {
	    sprintf(buf + j, "\\%03d", v);
	    j += 4;
	} else if (v == '\\') {
	    buf[j++] = '\\';
	    buf[j++] = '\\';
	} else if (v < 0x20) {
	    buf[j++] = '^';
	    buf[j++] = v | 0x40;
	} else
	    buf[j++] = v;
    }
    buf[j] = '\0';
}

static char *
get_graphics_opts(buf, maxlen, offset)
char *buf;
int maxlen, offset;
{
    /* [ALI] Perhaps we should read save_showsyms on the rogue level? */
    encode_escapes(buf, showsyms + offset, maxlen);
    return buf;
}

/*
 * From options.c
 */

static void
oc_to_str(src,dest)
    char *src, *dest;
{
    int i;

    while ((i = (int) *src++) != 0) {
	if (i < 0 || i >= MAXOCLASSES)
	    impossible("oc_to_str:  illegal object class %d", i);
	else
	    *dest++ = def_oc_syms[i];
    }
    *dest = '\0';
}

char *get_option(const char *option)
{
    int b;
    static char buf[BUFSIZ];
    b = get_option_bool(option);
    if (b != -2)
	return b ? "yes" : "no";
    if (!strcmp(option, "pettype"))
	return preferred_pet == 'd' ? "dog" : preferred_pet == 'c' ? "cat" : "random";
    if (!strcmp(option, "ghoulname"))
	return ghoulname;
    if (!strcmp(option, "wolfname"))
	return wolfname;
    if (!strcmp(option, "catname"))
	return catname;
    if (!strcmp(option, "dogname"))
	return dogname;
    if (!strcmp(option, "horsename"))
	return horsename;
    if (!strcmp(option, "msghistory")) {
	sprintf(buf, "%d", iflags.msg_history);
	return buf;
    }
    if (!strcmp(option, "use_stone")) {
#if defined(CHANGE_COLOR) && defined(MAC)
	sprintf(buf, "%d", iflags.use_stone);
	return buf;
#else
	return "0";
#endif
    }
    /* background, use_stone, palette and hicolor are write only */
    if (!strcmp(option, "fruit"))  return pl_fruit;
    if (!strcmp(option, "graphics"))
	return get_graphics_opts(buf, MAXPCHARS, 0);
    if (!strcmp(option, "dungeon"))
	return get_graphics_opts(buf, MAXDCHARS, 0);
    if (!strcmp(option, "traps"))
	return get_graphics_opts(buf, MAXTCHARS, MAXDCHARS);
    if (!strcmp(option, "effects"))
	return get_graphics_opts(buf, MAXECHARS, MAXDCHARS + MAXTCHARS);
    if (!strcmp(option, "objects")) {
	encode_escapes(buf, oc_syms + 1, MAXOCLASSES - 1);
	return buf;
    }
    if (!strcmp(option, "monsters")) {
	encode_escapes(buf, monsyms + 1, MAXMCLASSES - 1);
	return buf;
    }
    if (!strcmp(option, "warnings")) {
	encode_escapes(buf, warnsyms, WARNCOUNT);
	return buf;
    }
    if (!strcmp(option, "name"))  return plname;
    if (!strcmp(option, "role"))  return pl_character;
    if (!strcmp(option, "race")) {
	buf[0] = pl_race;
	buf[1] = '\0';
	return buf;
    }
    if (!strcmp(option, "gender"))  return flags.initgend ? "female" : "male";
    if (!strcmp(option, "align"))
	switch (flags.initalign) {
	    case ROLE_LAWFUL:	return "lawful";
	    case ROLE_NEUTRAL:	return "neutral";
	    case ROLE_CHAOTIC:	return "chaotic";
	    default:	return "random";
	}
    if (!strcmp(option, "packorder"))  return flags.inv_order;
    if (!strcmp(option, "pickup_burden"))
	switch (flags.pickup_burden) {
	    case UNENCUMBERED:	return "u";
	    case SLT_ENCUMBER:	return "b";
	    case MOD_ENCUMBER:	return "s";
	    case HVY_ENCUMBER:	return "n";
	    case EXT_ENCUMBER:	return "o";
	    default:	return "l";
	}
    if (!strcmp(option, "pickup_types")) {
	oc_to_str(flags.pickup_types, buf);
	return buf;
    }
    if (!strcmp(option, "disclose"))  return flags.end_disclose;
    if (!strcmp(option, "scores")) {
	sprintf(buf, "%d top/ %d around%s", flags.end_top, flags.end_around,
		flags.end_own ? "/own" : "");
	return buf;
    }
    if (!strcmp(option, "suppress_alert")) {
	sprintf(buf, "%lu.%lu.%lu", FEATURE_NOTICE_VER_MAJ,
		FEATURE_NOTICE_VER_MIN, FEATURE_NOTICE_VER_PATCH);
	return buf;
    }
    if (!strcmp(option, "tileset"))  return tileset;
#ifdef VIDEOSHADES
    if (!strcmp(option, "videocolors")) {
	int i, icolor;
	char *bp = buf;
	icolor = CLR_RED;
	for(i = 0; i < 12; i++) {
	    if (icolor < (CLR_WHITE)) {
		if (bp != buf)
		    *bp++ = '-';
		sprintf(bp, "%d", ttycolors[icolor++]);
		bp = eos(bp);
		if ((icolor > CLR_CYAN) && (icolor < CLR_ORANGE))
		     icolor = CLR_ORANGE;
	    }
	}
	return buf;
    }
# ifdef MSDOS
    if (!strcmp(option, "videoshades")) {
	sprintf(buf, "%s-%s-%s",
		ttycolors[CLR_BLACK] == M_BLACK ? "dark" :
		ttycolors[CLR_BLACK] == M_GRAY ?  "normal" : "light",
		ttycolors[CLR_GRAY] == M_BLACK ? "dark" :
		ttycolors[CLR_GRAY] == M_GRAY ?  "normal" : "light",
		ttycolors[CLR_WHITE] == M_BLACK ? "dark" :
		ttycolors[CLR_WHITE] == M_GRAY ?  "normal" : "light");
    }
# endif
#endif
    if (!strcmp(option, "menustyle")) {
	switch (flags.menu_style) {
	    default:
	    case MENU_TRADITIONAL:	return "traditional";
	    case MENU_COMBINATION:	return "combination";
	    case MENU_PARTIAL:		return "partial";
	    case MENU_FULL:		return "full";
	}
    }
    if (!strcmp(option, "number_pad"))
	return iflags.num_pad ? iflags.num_pad_mode ? "2" : "1" : "0";
    return "";
}
slashem-0.0.7E7F3/win/proxy/test_com.h0000664000076400007640000000203610545462317015621 0ustar  aliali/* $Id: test_com.h,v 1.1.2.1 2004/11/18 22:38:10 j_ali Exp $ */
/* Copyright (c) Slash'EM Development Team 2001-2004 */
/* NetHack may be freely redistributed.  See license for details. */

/*
 * Header file for test_com.c
 */

#define FALSE	0
#define TRUE	1

extern int is_child;

extern long *alloc(unsigned int nb);
extern void impossible(const char *fmt,...);
extern void nhext_error_handler(int class, const char *error);
extern int child_start(const char *argv0);
extern int child_read(void *handle, void *buf, unsigned int len);
extern int child_write(void *handle, void *buf, unsigned int len);
extern int child_wait0();
extern int child_wait();
extern int debug_read(void *handle, void *buf, unsigned int len);
extern int debug_write(void *handle, void *buf, unsigned int len);
extern int parent_read(void *handle, void *buf, unsigned int len);
extern int parent_write(void *handle, void *buf, unsigned int len);
extern void *get_child_readh();
extern void *get_child_writeh();
extern void *get_parent_readh();
extern void *get_parent_writeh();
slashem-0.0.7E7F3/win/proxy/test_ext.c0000664000076400007640000001616610545462317015647 0ustar  aliali/* $Id: test_ext.c,v 1.8 2003/10/25 18:06:01 j_ali Exp $ */
/* Copyright (c) Slash'EM Development Team 2001-2003 */
/* NetHack may be freely redistributed.  See license for details. */

/*
 * This module tests the NhExt support routines for sub-protocol 1.
 * These include nhext_init(), nhext_end() nhext_rpc() and nhext_svc(),
 * all of which can be found in nhext.c.
 *
 * Note: This module does not test the implementation of sub-protocol 1
 * itself (which is found in winproxy.c) or the support for sub-protocol 2.
 */

#include 
#include 

#include "hack.h"
#include "nhxdr.h"
#include "proxycom.h"
#include "test_com.h"

volatile server_exit = 0;

#define EXT_FID_EXIT	0x7FFF
#define EXT_FID_TEST1	1
#define EXT_FID_TEST2	2
#define EXT_FID_TEST3	3
#define EXT_FID_TEST4	4
#define EXT_FID_TEST5	5
#define EXT_FID_TEST6	6
#define EXT_FID_TEST7	7

#define EXT_CID_TEST7	0x1007

void test7_callback(unsigned short id, NhExtXdr *request, NhExtXdr *reply)
{
    int i;
    nhext_rpc_params(request, 1, EXT_INT_P(i));
    nhext_rpc_params(reply, 1, EXT_INT(i * 5 + 3));
}

struct nhext_svc callbacks[] = {
    EXT_CID_TEST7,	test7_callback,
    0, NULL,
};

void svc_exit(unsigned short id, NhExtXdr *request, NhExtXdr *reply)
{
    server_exit = 1;
    nhext_rpc_params(reply, 0);
}

void svc_test1(unsigned short id, NhExtXdr *request, NhExtXdr *reply)
{
    nhext_rpc_params(reply, 0);
}

void svc_test2(unsigned short id, NhExtXdr *request, NhExtXdr *reply)
{
    int i;
    nhext_rpc_params(request, 1, EXT_INT_P(i));
    nhext_rpc_params(reply, 0);
}

void svc_test3(unsigned short id, NhExtXdr *request, NhExtXdr *reply)
{
    int i;
    nhext_rpc_params(request, 1, EXT_INT_P(i));
    nhext_rpc_params(reply, 1, EXT_INT(i + 1));
}

void svc_test4(unsigned short id, NhExtXdr *request, NhExtXdr *reply)
{
    char *s;
    char *buf;
    nhext_rpc_params(request, 1, EXT_STRING_P(s));
    buf = (char *)alloc(strlen(s) + 3);
    sprintf(buf, "<%s>", s);
    free(s);
    nhext_rpc_params(reply, 1, EXT_STRING(buf));
    free(buf);
}

struct test5_request {
    unsigned int n;
    long *array;
};

int svc_xdr_test5_request(xdrs, datum)
NhExtXdr *xdrs;
struct test5_request *datum;
{
    return nhext_xdr_array(xdrs, (char **)&datum->array, &datum->n,
      (unsigned int)-1, sizeof(long), nhext_xdr_long);
}

void svc_test5(unsigned short id, NhExtXdr *request, NhExtXdr *reply)
{
    int i;
    int total = 0;
    struct test5_request req = { 0, (long *)0 };
    nhext_rpc_params(request, 1, EXT_XDRF(svc_xdr_test5_request, &req));
    for(i = 0; i < req.n; i++)
	total += req.array[i];
    nhext_rpc_params(reply, 1, EXT_INT(total));
}

void svc_test6(unsigned short id, NhExtXdr *request, NhExtXdr *reply)
{
    int i;
    char *s;
    winid w;
    nhext_xdr_bool_t b;
    char c;
    nhext_rpc_params(request, 5, EXT_INT_P(i), EXT_INT_P(w), EXT_CHAR_P(c),
      EXT_STRING_P(s), EXT_BOOLEAN_P(b));
    nhext_rpc_params(reply, 5, EXT_INT(w), EXT_STRING(s), EXT_CHAR(c),
      EXT_INT(i), EXT_BOOLEAN(b));
    free(s);
}

void svc_test7(unsigned short id, NhExtXdr *request, NhExtXdr *reply)
{
    int i;
    nhext_rpc_params(request, 1, EXT_INT_P(i));
    nhext_rpc(EXT_CID_TEST7, 1, EXT_INT(i), 1, EXT_INT_P(i));
    nhext_rpc_params(reply, 1, EXT_INT(i));
}

struct nhext_svc services[] = {
    EXT_FID_EXIT,	svc_exit,
    EXT_FID_TEST1,	svc_test1,
    EXT_FID_TEST2,	svc_test2,
    EXT_FID_TEST3,	svc_test3,
    EXT_FID_TEST4,	svc_test4,
    EXT_FID_TEST5,	svc_test5,
    EXT_FID_TEST6,	svc_test6,
    EXT_FID_TEST7,	svc_test7,
    0,			NULL,
};

void server(void)
{
    int i;
    NhExtIO *rd, *wr;
    rd = nhext_io_open(parent_read, get_parent_readh(), NHEXT_IO_RDONLY);
    wr = nhext_io_open(parent_write, get_parent_writeh(), NHEXT_IO_WRONLY);
    if (!rd || !wr) {
	fprintf(stderr, "C Failed to open I/O streams.\n");
	exit(1);
    }
    (void)nhext_set_errhandler(nhext_error_handler);
    if (nhext_init(rd, wr, callbacks) < 0) {
	fprintf(stderr, "C Failed to initialize NhExt.\n");
	exit(1);
    }
    if (nhext_set_protocol(1)) {
	fprintf(stderr, "C Failed to select protocol 1.\n");
	exit(1);
    }
    do {
	i = nhext_svc(services);
	if (!i)
	    impossible("Ignoring packet with zero ID");
    } while (!server_exit);
    nhext_end();
    nhext_io_close(rd);
    nhext_io_close(wr);
}

void run_tests(void)
{
    int i, retval;
    char c, *s;
    nhext_xdr_bool_t b;
    winid w;
    int total;
    struct test5_request req;
    fprintf(stderr, "Test 1...\n");
    retval = nhext_rpc(EXT_FID_TEST1, 0, 0);
    fprintf(stderr, "Test 1 %s.\n", retval ? "passed" : "failed");
    fprintf(stderr, "Test 2...\n");
    retval = nhext_rpc(EXT_FID_TEST2, 1, EXT_INT(0), 0);
    fprintf(stderr, "Test 2 %s.\n", retval ? "passed" : "failed");
    fprintf(stderr, "Test 3...\n");
    retval = nhext_rpc(EXT_FID_TEST3, 1, EXT_INT(67), 1, EXT_INT_P(i));
    if (i != 68)
	retval = FALSE;
    fprintf(stderr, "Test 3 %s.\n", retval ? "passed" : "failed");
    fprintf(stderr, "Test 4...\n");
    retval = nhext_rpc(EXT_FID_TEST4, 1, EXT_STRING("Hello"),
      1, EXT_STRING_P(s));
    if (strcmp(s, ""))
	retval = FALSE;
    fprintf(stderr, "Test 4 %s.\n", retval ? "passed" : "failed");
    fprintf(stderr, "Test 5...\n");
    req.n = 5;
    req.array = (long *)alloc(req.n * sizeof(long));
    for(i = 0; i < 5; i++)
	req.array[i] = 7 * i + 3;
    retval = nhext_rpc(EXT_FID_TEST5,
      1, EXT_XDRF(svc_xdr_test5_request, &req), 1, EXT_INT_P(total));
    for(i = 0; i < 5; i++)
	total -= req.array[i];
    if (total)
	retval = FALSE;
    free(req.array);
    fprintf(stderr, "Test 5 %s.\n", retval ? "passed" : "failed");
    fprintf(stderr, "Test 6...\n");
    retval = nhext_rpc(EXT_FID_TEST6,
      5, EXT_INT(37), EXT_INT(2), EXT_CHAR('l'), EXT_STRING("Shalom"),
         EXT_BOOLEAN(TRUE),
      5, EXT_INT_P(w), EXT_STRING_P(s), EXT_CHAR_P(c), EXT_INT_P(i),
         EXT_BOOLEAN_P(b));
    if (w != 2 || strcmp(s, "Shalom") || c != 'l' || i != 37 || !b)
	retval = FALSE;
    free(s);
    fprintf(stderr, "Test 6 %s.\n", retval ? "passed" : "failed");
    fprintf(stderr, "Test 7...\n");
    retval = nhext_rpc(EXT_FID_TEST7, 1, EXT_INT(11), 1, EXT_INT_P(i));
    if (i != 58)
	retval = FALSE;
    fprintf(stderr, "Test 7 %s.\n", retval ? "passed" : "failed");
}

main(argc, argv)
int argc;
char **argv;
{
    NhExtIO *rd, *wr;
    if (argc > 1 && !strcmp(argv[1], "-c")) {
	is_child++;
	server();
	exit(0);
    }
    if (!child_start(argv[0])) {
	fprintf(stderr, "Failed to start child.\n");
	exit(1);
    }
    rd = nhext_io_open(debug_read, get_child_readh(), NHEXT_IO_RDONLY);
    wr = nhext_io_open(debug_write, get_child_writeh(), NHEXT_IO_WRONLY);
    if (!rd || !wr) {
	fprintf(stderr, "Failed to open I/O streams.\n");
	exit(1);
    }
    (void)nhext_set_errhandler(nhext_error_handler);
    if (nhext_init(rd, wr, callbacks) < 0) {
	fprintf(stderr, "Failed to initialize NhExt.\n");
	exit(1);
    }
    if (nhext_set_protocol(1)) {
	fprintf(stderr, "Failed to select protocol 1.\n");
	exit(1);
    }
    run_tests();
    nhext_rpc(EXT_FID_EXIT, 0, 0);
    nhext_end();
    nhext_io_close(rd);
    nhext_io_close(wr);
    if (!child_wait()) {
	fprintf(stderr, "Error while waiting for child.\n");
	exit(1);
    }
    exit(0);
}
slashem-0.0.7E7F3/win/proxy/winproxy.c0000664000076400007640000010536310545462317015705 0ustar  aliali/* $Id: winproxy.c,v 1.34.2.1 2004/10/30 08:38:31 j_ali Exp $ */
/* Copyright (c) Slash'EM Development Team 2001-2004 */
/* NetHack may be freely redistributed.  See license for details. */

/* #define DEBUG */

#include 
#ifdef DEBUG
#include 
#endif
#include "hack.h"
#include "patchlevel.h"
#include "date.h"
#include "nhxdr.h"
#include "proxycom.h"
#include "winproxy.h"
#ifdef WIN32
#include "win32api.h"
#endif

#ifdef DISPLAY_LAYERS
#define MAX_LAYERS	5
#else
#define MAX_LAYERS	1
#endif

static void proxy_flush_layers();
static void proxy_print_glyph_layered();

static int proxy_protocol = 0;

static int proxy_no_mapwins = 0;

static int no_layers = MAX_LAYERS;

static struct proxy_mapwin {
    int id;
    int c_rows, c_cols, c_layers;	/* Configured dimensions */
#ifdef DISPLAY_LAYERS
    struct gbuf_layer {
	char start, stop;
	struct {
	    char start, stop;
	    int glyphs[COLNO];
	} rows[ROWNO];
    } gbuf_layers[MAX_LAYERS];
#endif
} *proxy_mapwins;

/* Window to redirect raw output to, if not WIN_ERR */

int proxy_rawprint_win = WIN_ERR;

/* Current interface mode */

unsigned long proxy_interface_mode = 0;

/* Flag to advise raw print functions not to attempt to use proxy */

static int in_proxy_init = 0;

/* Flag to indicate that the remote interface is authorized */

int proxy_authorized = 0;

/* Interface definition for plug-in windowing ports */
struct window_procs proxy_procs = {
    "proxy",
    0x0,
    0L,
    proxy_init_nhwindows,
    proxy_player_selection,
    proxy_askname,
    proxy_get_nh_event,
    proxy_exit_nhwindows,
    proxy_suspend_nhwindows,
    proxy_resume_nhwindows,
    proxy_create_nhwindow,
    proxy_clear_nhwindow,
    proxy_display_nhwindow,
    proxy_destroy_nhwindow,
    proxy_curs,
    proxy_putstr,
    proxy_display_file,
    proxy_start_menu,
    proxy_add_menu,
    proxy_end_menu,
    proxy_select_menu,
    proxy_message_menu,
    proxy_update_inventory,
    proxy_mark_synch,
    proxy_wait_synch,
#ifdef CLIPPING
    proxy_cliparound,
#endif
#ifdef POSITIONBAR
    proxy_update_positionbar,
#endif
    proxy_print_glyph,
    proxy_raw_print,
    proxy_raw_print_bold,
    proxy_nhgetch,
    proxy_nh_poskey,
    proxy_nhbell,
    proxy_doprev_message,
    proxy_yn_function,
    proxy_getlin,
    proxy_get_ext_cmd,
    proxy_number_pad,
    proxy_delay_output,
#ifdef CHANGE_COLOR
    proxy_change_color,
#ifdef MAC
    proxy_change_background,
    proxy_set_font_name,
#endif
    proxy_get_color_string,
#endif
    proxy_start_screen,
    proxy_end_screen,
    proxy_outrip,
    proxy_preference_update,
};

/* Extensions to the NhExt protocol */
struct proxy_extension proxy_extents[] = {
    { 0, 0, 0, 0, 0 }		/* must be last */
};

/*
 * The glue functions.
 */

void
proxy_init_nhwindows(argcp, argv)
int *argcp;
char **argv;
{
    int i, j, retval;
    struct proxy_init_nhwindow_req req;
    struct proxy_init_nhwindow_res res = {0, 0, 0, 0, 0};
    extern struct wc_Opt wc_options[];
    req.argc = *argcp;
    req.argv = argv;
    retval = nhext_rpc(EXT_FID_INIT_NHWINDOWS,
      1, EXT_XDRF(proxy_xdr_init_nhwindow_req, &req),
      1, EXT_XDRF(proxy_xdr_init_nhwindow_res, &res));
    if (retval)
    {
	if (res.argc > *argcp)
	    panic("Proxy: Bad argument list from init_nhwindows");
	for(i = 0; i < res.argc; i++)
	{
	    for(j = i; j < *argcp; j++)
		if (!strcmp(res.argv[i], argv[j]))
		{
		    argv[i] = argv[j];
		    break;
		}
	    if (j == *argcp)
		panic("Proxy: Bad argument from init_nhwindows");
	}
	*argcp = res.argc;
	if (res.inited)
	    iflags.window_inited = TRUE;
	for(i = 0; i < res.capc; i++)
	    for(j = 0; wc_options[j].wc_name; j++)
		if (!strcmp(wc_options[j].wc_name, res.capv[i]))
		    windowprocs.wincap |= wc_options[j].wc_bit;
    }
}

void
proxy_player_selection()
{
    int role, race, gend, alignm;
    nhext_xdr_bool_t quit;
    if (!nhext_rpc(EXT_FID_PLAYER_SELECTION,
      4, EXT_INT(flags.initrole), EXT_INT(flags.initrace),
         EXT_INT(flags.initgend), EXT_INT(flags.initalign),
      5, EXT_INT_P(role), EXT_INT_P(race), EXT_INT_P(gend), EXT_INT_P(alignm),
         EXT_BOOLEAN_P(quit)))
	quit = 1;
    if (quit)
    {
	clearlocks();
	proxy_exit_nhwindows((char *)0);
	terminate(0);
    }
    flags.initrole = role;
    flags.initrace = race;
    flags.initgend = gend;
    flags.initalign = alignm;
}

void
proxy_askname()
{
    char *name = (char *)0;
    if (nhext_rpc(EXT_FID_ASKNAME, 0, 1, EXT_STRING_P(name))) {
	strncpy(plname, name, sizeof(plname) - 1);
	plname[sizeof(plname) - 1] = '\0';
    }
    free(name);
}

void
proxy_get_nh_event()
{
    (void)nhext_rpc(EXT_FID_GET_NH_EVENT, 0, 0);
}

void
proxy_exit_nhwindows(str)
const char *str;
{
    (void)nhext_rpc(EXT_FID_EXIT_NHWINDOWS, 1, EXT_STRING(str), 0);
}

void
proxy_suspend_nhwindows(str)
const char *str;
{
    (void)nhext_rpc(EXT_FID_SUSPEND_NHWINDOWS, 1, EXT_STRING(str), 0);
}

void
proxy_resume_nhwindows()
{
    (void)nhext_rpc(EXT_FID_RESUME_NHWINDOWS, 0, 0);
}

winid
proxy_create_nhwindow(type)
int type;
{
    winid id;
    int w;
    if (type == NHW_MAP) {
	struct proxy_mapwin *new;
	for(w = 0; w < proxy_no_mapwins; w++)
	    if (proxy_mapwins[w].id < 0)
		break;
	if (w == proxy_no_mapwins) {
	    if (proxy_mapwins)
		new = (struct proxy_mapwin *) realloc(proxy_mapwins,
		  (proxy_no_mapwins + 1) * sizeof(struct proxy_mapwin));
	    else
		new = (struct proxy_mapwin *)
		  malloc(sizeof(struct proxy_mapwin));
	    if (!new)
		return -1;
	    proxy_mapwins = new;
	    proxy_no_mapwins++;
	}
	proxy_mapwins[w].c_rows = 21;
	proxy_mapwins[w].c_cols = 80;
	proxy_mapwins[w].c_layers = 1;
    }
    if (!nhext_rpc(EXT_FID_CREATE_NHWINDOW, 1, EXT_INT(type), 1, EXT_INT_P(id)))
	id = -1;
    if (type == NHW_MAP) {
	proxy_mapwins[w].id = id;
#ifdef DISPLAY_LAYERS
	if (id >= 0)
	    proxy_flush_layers(w, TRUE);
#endif
    }
    return id;
}

static int
proxy_get_mapwin(window)
winid window;
{
    int w;
    for(w = 0; w < proxy_no_mapwins; w++)
	if (proxy_mapwins[w].id == window)
	    return w;
    return -1;
}

void
proxy_clear_nhwindow(window)
winid window;
{
    int w = proxy_get_mapwin(window);
    no_layers = level.flags.hero_memory ? 5 : 2;
    if (w >= 0) {
#ifdef DISPLAY_LAYERS
	proxy_flush_layers(w, TRUE);
#endif
	proxy_mapwins[w].c_rows = ROWNO;
	proxy_mapwins[w].c_cols = COLNO;
	proxy_mapwins[w].c_layers = no_layers;
	(void)nhext_rpc(EXT_FID_CLEAR_NHWINDOW, 4, EXT_INT(window),
	  EXT_INT(ROWNO), EXT_INT(COLNO), EXT_INT(no_layers), 0);
    } else
	(void)nhext_rpc(EXT_FID_CLEAR_NHWINDOW, 4, EXT_INT(window),
	  EXT_INT(0), EXT_INT(0), EXT_INT(0), 0);
}

void
proxy_display_nhwindow(window, blocking)
winid window;
boolean blocking;
{
    int w = proxy_get_mapwin(window);
#ifdef DISPLAY_LAYERS
    if (w >= 0)
	proxy_flush_layers(w, FALSE);
#endif
    (void)nhext_rpc(EXT_FID_DISPLAY_NHWINDOW,
      2, EXT_INT(window), EXT_BOOLEAN((nhext_xdr_bool_t)blocking), 0);
}

void
proxy_destroy_nhwindow(window)
winid window;
{
    struct proxy_mapwin *new;
    int w = proxy_get_mapwin(window);
    (void)nhext_rpc(EXT_FID_DESTROY_NHWINDOW, 1, EXT_INT(window), 0);
    if (w >= 0) {
	proxy_mapwins[w].id = -1;
	if (w == proxy_no_mapwins - 1) {
	    if (proxy_no_mapwins == 1) {
		free(proxy_mapwins);
		proxy_mapwins = (struct proxy_mapwin *)0;
		proxy_no_mapwins = 0;
	    } else {
		new = (struct proxy_mapwin *) realloc(proxy_mapwins,
		  (proxy_no_mapwins - 1) * sizeof(struct proxy_mapwin));
		if (new) {
		    proxy_mapwins = new;
		    proxy_no_mapwins--;
		}
	    }
	}
    }
    mapid_del_winid(window);
}

int proxy_curs_on_u = FALSE;

void
proxy_curs(window, x, y)
winid window;
int x, y;
{
    proxy_curs_on_u = x == u.ux && y == u.uy;
    (void)nhext_rpc(EXT_FID_CURS,
      3, EXT_INT(window), EXT_INT(x), EXT_INT(y), 0);
}

void
proxy_putstr(window, attr, str)
winid window;
int attr;
const char *str;
{
    if (window >= 0)
	(void)nhext_rpc(EXT_FID_PUTSTR,
	  3, EXT_INT(window), EXT_INT(attr), EXT_STRING(str), 0);
    else if (attr == ATR_NONE)
	proxy_raw_print(str);
    else
	proxy_raw_print_bold(str);
}

void
#ifdef FILE_AREAS
proxy_display_file(farea, fname, complain)
const char *farea;
#else
proxy_display_file(fname, complain)
#endif
const char *fname;
BOOLEAN_P complain;
{
    int fh;
#ifdef FILE_AREAS
    fh = dlbh_fopen_area(farea, fname, "r");
#else
    fh = dlbh_fopen(fname, "r");
#endif
    if (fh < 0) {
	if (complain)  pline("Can't open %s.", fname);
	return;
    }
    (void)nhext_rpc(EXT_FID_DISPLAY_FILE,
      1, EXT_INT(fh), 0);
    dlbh_fclose(fh);
}

void
proxy_start_menu(window)
winid window;
{
    (void)nhext_rpc(EXT_FID_START_MENU, 1, EXT_INT(window), 0);
    mapid_del_identifiers(window);
}

void
proxy_add_menu(window, glyph, identifier, ch, gch, attr, str, preselected)
winid window;
int glyph;
const anything *identifier;
CHAR_P ch, gch;
int attr;
const char *str;
BOOLEAN_P preselected;
{
    int mapping = mapid_map_identifier(window, identifier);
    if (glyph != NO_GLYPH)
	glyph = glyph2proxy[glyph];
    (void)nhext_rpc(EXT_FID_ADD_MENU,
      8, EXT_INT(window), EXT_INT(glyph), EXT_INT(mapping), EXT_INT(ch),
         EXT_INT(gch), EXT_INT(attr), EXT_STRING(str),
	 EXT_BOOLEAN(preselected),
      0);
}

void
proxy_end_menu(window, prompt)
winid window;
const char *prompt;
{
    (void)nhext_rpc(EXT_FID_END_MENU,
      2, EXT_INT(window), EXT_STRING(prompt), 0);
}

int
proxy_select_menu(window, how, menu_list)
winid window;
int how;
menu_item **menu_list;
{
    int i;
    struct proxy_select_menu_res ret = {0, 0, (struct proxy_mi *)0};
    if (!nhext_rpc(EXT_FID_SELECT_MENU,
      2, EXT_INT(window), EXT_INT(how),
      1, EXT_XDRF(proxy_xdr_select_menu_res, &ret))) {
	if (ret.selected)
	    nhext_xdr_free(proxy_xdr_select_menu_res, (char *)&ret);
	return 0;	/* Nothing selected */
    }
    *menu_list = (menu_item *) alloc(ret.n * sizeof(menu_item));
    for(i = 0; i < ret.n; i++) {
	mapid_unmap_identifier(window, ret.selected[i].item,
	  &(*menu_list)[i].item);
	(*menu_list)[i].count = ret.selected[i].count;
    }
    i = ret.retval;
    nhext_xdr_free(proxy_xdr_select_menu_res, (char *)&ret);
    return i;
}

char
proxy_message_menu(let, how, mesg)
char let;
int how;
const char *mesg;
{
    int ret;
    if (!nhext_rpc(EXT_FID_MESSAGE_MENU,
      3, EXT_INT(let), EXT_INT(how), EXT_STRING(mesg), 1, EXT_INT_P(ret)))
	ret = -1;
    return (char)ret;
}

void
proxy_update_inventory()
{
    (void)nhext_rpc(EXT_FID_UPDATE_INVENTORY, 0, 0);
}

void
proxy_mark_synch()
{
    (void)nhext_rpc(EXT_FID_MARK_SYNC, 0, 0);
}

void
proxy_wait_synch()
{
    (void)nhext_rpc(EXT_FID_WAIT_SYNC, 0, 0);
}

#ifdef CLIPPING
void
proxy_cliparound(x, y)
int x, y;
{
    (void)nhext_rpc(EXT_FID_CLIPAROUND, 2, EXT_INT(x), EXT_INT(y), 0);
}
#endif

#ifdef POSITIONBAR
void
proxy_update_positionbar(posbar)
char *posbar;
{
    (void)nhext_rpc(EXT_FID_UPDATE_POSITIONBAR, 1, EXT_STRING(posbar), 0);
}
#endif

#ifdef DISPLAY_LAYERS
static void
proxy_print_layer(w, x, y, z, glyph)
int w;
xchar x, y, z;
int glyph;
{
    int g;
    struct gbuf_layer *l = proxy_mapwins[w].gbuf_layers + z;
    g = glyph == NO_GLYPH ? NO_GLYPH : glyph2proxy[glyph];
    if (l->rows[y].glyphs[x] != g) {
	l->rows[y].glyphs[x] = g;
	if (l->start > y)
	    l->start = y;
	if (l->stop < y)
	    l->stop = y;
	if (l->rows[y].start > x)
	    l->rows[y].start = x;
	if (l->rows[y].stop < x)
	    l->rows[y].stop = x;
    }
}

static void
proxy_flush_layers(w, clearing)
int w;
int clearing;
{
    int x, y, z;
    struct gbuf_layer *l = proxy_mapwins[w].gbuf_layers;
    if (!clearing) {
	if (proxy_mapwins[w].c_rows != ROWNO ||
	  proxy_mapwins[w].c_cols != COLNO ||
	  proxy_mapwins[w].c_layers != no_layers) {
	    proxy_mapwins[w].c_rows = ROWNO;
	    proxy_mapwins[w].c_cols = COLNO;
	    proxy_mapwins[w].c_layers = no_layers;
	    (void)nhext_rpc(EXT_FID_CLEAR_NHWINDOW, 4,
	      EXT_INT(proxy_mapwins[w].id), EXT_INT(ROWNO), EXT_INT(COLNO),
	      EXT_INT(no_layers), 0);
	}
	proxy_print_glyph_layered(proxy_mapwins[w].id,
	  no_layers, proxy_mapwins[w].gbuf_layers);
    }
    for(z = 0; z < no_layers; z++) {
	l->stop = 0;
	l->start = ROWNO - 1;
	for(y = 0; y < ROWNO; y++) {
	    l->rows[y].stop = 0;
	    l->rows[y].start = COLNO - 1;
	    if (clearing)
		for(x = 0; x < COLNO; x++)
		    l->rows[y].glyphs[x] = NO_GLYPH;
	}
	l++;
    }
}
#endif

void
proxy_print_glyph(window, x, y, glyph)
winid window;
xchar x, y;
int glyph;
{
    int w = proxy_get_mapwin(window);
#ifdef DISPLAY_LAYERS
    if (w >= 0 && proxy_interface_mode & EXT_IM_DISPLAY_LAYERS) {
	struct rm *lev = &levl[x][y];

	if (!level.flags.hero_memory || glyph_is_floating(glyph))
	    proxy_print_layer(w, x, y, 0, glyph);
	else
	    proxy_print_layer(w, x, y, 0,
	      lev->mem_invis ? GLYPH_INVISIBLE : NO_GLYPH);
	if (level.flags.hero_memory) {
	    if (lev->mem_obj)
		proxy_print_layer(w, x, y, 1, lev->mem_corpse ?
		  body_to_glyph(lev->mem_obj - 1) :
		  objnum_to_glyph(lev->mem_obj - 1));
	    else
		proxy_print_layer(w, x, y, 1, NO_GLYPH);
	    proxy_print_layer(w, x, y, 2, lev->mem_trap ?
	      cmap_to_glyph(lev->mem_trap - 1 + MAXDCHARS) : NO_GLYPH);
	    switch (lev->mem_bg) {
		case S_room:
		case S_corr:
		case S_litcorr:
		case S_air:
		case S_water:
		    proxy_print_layer(w, x, y, 3, NO_GLYPH);
		    proxy_print_layer(w, x, y, 4, cmap_to_glyph(lev->mem_bg));
		    break;
		default:
		    proxy_print_layer(w, x, y, 3, cmap_to_glyph(lev->mem_bg));
		    if (Is_airlevel(&u.uz))
			proxy_print_layer(w, x, y, 4, cmap_to_glyph(S_air));
		    else if (Is_waterlevel(&u.uz))
			proxy_print_layer(w, x, y, 4, cmap_to_glyph(S_water));
		    else if (lev->roomno != NO_ROOM)
			proxy_print_layer(w, x, y, 4, cmap_to_glyph(S_room));
		    else if (lev->waslit || flags.lit_corridor)
			proxy_print_layer(w, x, y, 4, cmap_to_glyph(S_litcorr));
		    else
			proxy_print_layer(w, x, y, 4, cmap_to_glyph(S_corr));
		    break;
	    }
	} else
	    proxy_print_layer(w, x, y, 1, back_to_glyph(x, y));
    }
    else
#endif
    (void)nhext_rpc(EXT_FID_PRINT_GLYPH,
      4, EXT_INT(window), EXT_INT(x), EXT_INT(y), EXT_INT(glyph2proxy[glyph]),
      0);
}

void
proxy_raw_print(str)
const char *str;
{
    static int active = 0;
    if (proxy_rawprint_win != WIN_ERR) {
	proxy_putstr(proxy_rawprint_win, 0, str);
	return;
    }
    if (active++ || in_proxy_init ||
      !nhext_rpc(EXT_FID_RAW_PRINT, 1, EXT_STRING(str), 0)) {
	fputs(str, stderr);
	fputc('\n', stderr);
	(void) fflush(stderr);
    }
    active--;
}

void
proxy_raw_print_bold(str)
const char *str;
{
    static int active = 0;
    if (proxy_rawprint_win != WIN_ERR) {
	proxy_putstr(proxy_rawprint_win, ATR_BOLD, str);
	return;
    }
    if (active++ || in_proxy_init ||
      !nhext_rpc(EXT_FID_RAW_PRINT_BOLD, 1, EXT_STRING(str), 0)) {
	fputs(str, stderr);
	fputc('\n', stderr);
	(void) fflush(stderr);
    }
    active--;
}

int
proxy_nhgetch()
{
    int ret;
    if (!nhext_rpc(EXT_FID_NHGETCH, 0, 1, EXT_INT_P(ret)))
	ret = 0;
    return ret;
}

int
proxy_nh_poskey(x, y, mod)
int *x, *y, *mod;
{
    int ret, lx, ly, lmod;
    if (!nhext_rpc(EXT_FID_NH_POSKEY, 0,
      4, EXT_INT_P(ret), EXT_INT_P(lx), EXT_INT_P(ly), EXT_INT_P(lmod)))
	return proxy_nhgetch();
    *x = lx;
    *y = ly;
    *mod = lmod;
    return ret;
}

void
proxy_nhbell()
{
    (void)nhext_rpc(EXT_FID_NHBELL, 0, 0);
}

int
proxy_doprev_message()
{
    int ret;
    if (!nhext_rpc(EXT_FID_DOPREV_MESSAGE, 0, 1, EXT_INT_P(ret)))
	ret = 0;
    return ret;
}

char
proxy_yn_function(query, resp, def)
const char *query, *resp;
char def;
{
    int ret, count;
    if (!nhext_rpc(EXT_FID_YN_FUNCTION,
      3, EXT_STRING(query), EXT_STRING(resp), EXT_INT(def),
      2, EXT_INT_P(ret), EXT_INT_P(count)))
	ret = def;
    if (ret == '#')
	yn_number = count;
    return ret;
}

void
proxy_getlin(query, bufp)
const char *query;
char *bufp;
{
    char *reply = (char *)0;
    if (nhext_rpc(EXT_FID_GETLIN,
      1, EXT_STRING(query), 1, EXT_STRING_P(reply))) {
	strncpy(bufp, reply, BUFSZ - 1);
	bufp[BUFSZ - 1] = '\0';
    } else
	bufp[0] = '\0';
    free(reply);
}

int
proxy_get_ext_cmd()
{
    int extcmd;
    if (!nhext_rpc(EXT_FID_GET_EXT_CMD, 0, 1, EXT_INT_P(extcmd)))
	extcmd = -1;
    return extcmd;
}

void
proxy_number_pad(state)
int state;
{
    (void)nhext_rpc(EXT_FID_NUMBER_PAD, 1, EXT_INT(state), 0);
}

void
proxy_delay_output()
{
    (void)nhext_rpc(EXT_FID_DELAY_OUTPUT, 0, 0);
}

#ifdef CHANGE_COLOR
void
proxy_change_color(color, rgb, reverse)
int color;
long rgb;
int reverse;
{
    (void)nhext_rpc(EXT_FID_CHANGE_COLOR,
      3, EXT_INT(color), EXT_LONG(rgb), EXT_BOOL(reverse), 0);
}

#ifdef MAC
void
proxy_change_background(white_or_black)
int white_or_black;
{
    (void)nhext_rpc(EXT_FID_CHANGE_BACKGROUND, 1, EXT_BOOL(white_or_black), 0);
}

short
proxy_set_font_name(window, font)
winid window;
char *font;
{
    int ret;
    if (!nhext_rpc(EXT_FID_SET_FONT_NAME, 2, EXT_INT(window), EXT_STRING(font),
      1, EXT_INT_P(ret)))
	ret = -1;
    return (short)ret;
}
#endif	/* MAC */

char *
proxy_get_color_string()
{
    char *ret = (char *)0;
    if (!nhext_rpc(EXT_FID_GET_COLOR_STRING, 0, 1, EXT_STRING_P(ret))) {
	free(ret);
	return "";
    }
    return ret;
}
#endif	/* CHANGE_COLOR */

void
proxy_start_screen()
{
    (void)nhext_rpc(EXT_FID_START_SCREEN, 0, 0);
}

void
proxy_end_screen()
{
    (void)nhext_rpc(EXT_FID_END_SCREEN, 0, 0);
}

void
proxy_outrip(window, how)
winid window;
int how;
{
    nhext_xdr_bool_t handled;
    char *killed_by;
    killed_by = get_killer_string(how);
    if (!nhext_rpc(EXT_FID_OUTRIP, 2, EXT_INT(window), EXT_STRING(killed_by),
      1, EXT_BOOLEAN_P(handled)))
	handled = 0;
    if (!handled)
	genl_outrip(window, how);
}

void
proxy_preference_update(pref)
const char *pref;
{
    const char *value = get_option(pref);
    (void)nhext_rpc(EXT_FID_PREFERENCE_UPDATE, 2, EXT_STRING(pref),
      EXT_STRING(value), 0);
}

void
proxy_status(reconfig, nv, values)
int reconfig, nv;
const char **values;
{
    struct proxy_status_req req;
    req.reconfig = reconfig;
    req.nv = nv;
    req.values = values;
    (void)nhext_rpc(EXT_FID_STATUS, 1, EXT_XDRF(proxy_xdr_status_req, &req), 0);
}

#ifdef DISPLAY_LAYERS
static void
proxy_print_glyph_layered(window, nl, layers)
winid window;
int nl;
struct gbuf_layer *layers;
{
    int i, j, k;
    struct proxy_print_glyph_layered_req req;
    req.window = window;
    req.nl = nl;
    req.layers = (struct proxy_glyph_layer *)alloc(nl *
      sizeof(struct proxy_glyph_layer));
    for(i = 0; i < nl; i++) {
	if (layers[i].stop - layers[i].start >= 0) {
	    req.layers[i].start = layers[i].start;
	    req.layers[i].nr = layers[i].stop - layers[i].start + 1;
	    req.layers[i].rows = (struct proxy_glyph_row *)
	      alloc(req.layers[i].nr * sizeof(struct proxy_glyph_row));
	    for(j = 0, k = layers[i].start; j < req.layers[i].nr; j++, k++)
		if (layers[i].rows[k].stop - layers[i].rows[k].start >= 0) {
		    req.layers[i].rows[j].start = layers[i].rows[k].start;
		    req.layers[i].rows[j].ng =
		      layers[i].rows[k].stop - layers[i].rows[k].start + 1;
		    req.layers[i].rows[j].glyphs =
		      layers[i].rows[k].glyphs + layers[i].rows[k].start;
		} else {
		    req.layers[i].rows[j].start = 0;
		    req.layers[i].rows[j].ng = 0;
		    req.layers[i].rows[j].glyphs = (int *)0;
		}
	} else {
	    req.layers[i].start = 0;
	    req.layers[i].nr = 0;
	    req.layers[i].rows = (struct proxy_glyph_row *)0;
	}
    }
    (void)nhext_rpc(EXT_FID_PRINT_GLYPH_LAYERED,
      1, EXT_XDRF(proxy_xdr_print_glyph_layered_req, &req), 0);
    for(i = 0; i < nl; i++)
	if (req.layers[i].rows)
	    free(req.layers[i].rows);
    free(req.layers);
}
#endif	/* DISPLAY_LAYERS */

FILE *proxy_config_fp = NULL;

FILE *
proxy_config_file_open()
{
    proxy_config_fp = tmpfile();
    if (proxy_config_fp) {
	/* Since this is currently the only use of writable dlbh streams,
	 * we simply use a hard-coded handle of zero.
	 */
	(void)nhext_rpc(EXT_FID_SEND_CONFIG_FILE, 1, EXT_INT(0), 0);
	rewind(proxy_config_fp);		/* Ready to read */
    }
    return proxy_config_fp;
}

void
proxy_config_file_close(FILE *fp)
{
    fclose(proxy_config_fp);
    proxy_config_fp = NULL;
}

extern struct nhext_svc proxy_callbacks[];

#ifdef DEBUG
static int FDECL(debug_read, (void *, void *, unsigned int));
static int FDECL(debug_write, (void *, void *, unsigned int));

#define READ_F	debug_read
#define WRITE_F	debug_write
#else
#define READ_F	proxy_read
#define WRITE_F	proxy_write
#endif

#ifdef WIN32
#define READ_H	((void *)_get_osfhandle(0))
#define WRITE_H	((void *)_get_osfhandle(1))
#else
#define READ_H	((void *)0)
#define WRITE_H	((void *)1)
#endif

#ifdef WIN32
int proxy_read(handle, buf, len)
void *handle;
void *buf;
int len;
{
    DWORD d;
    if (!ReadFile((HANDLE)handle, buf, len, &d, NULL)) {
	d = GetLastError();
	return d == ERROR_HANDLE_EOF || d == ERROR_BROKEN_PIPE ? 0 : -1;
    } else
	return d;
}

int proxy_pipe_read_nb(handle, buf, len)
void *handle;
void *buf;
int len;
{
    DWORD nb;
    if (!PeekNamedPipe((HANDLE)handle, NULL, 0, NULL, &nb, NULL))
	return -1;
    if (!nb)
	return -2;
    return READ_F(handle, buf, len);
}

int proxy_write(handle, buf, len)
void *handle;
void *buf;
int len;
{
    DWORD nb;
    if (!WriteFile((HANDLE)handle, buf, len, &nb, NULL))
	return -1;
    else
	return nb;
}
#else	/* WIN32 */
static int
proxy_read(handle, buf, len)
void *handle;
void *buf;
unsigned int len;
{
    int fd = (int)handle, nb;
    nb = read(fd, buf, len);
    return nb >= 0 ? nb : -1;
}

static int
proxy_read_nb(handle, buf, len)
void *handle;
void *buf;
int len;
{
    int fd = (int)handle, retval;
    fd_set readfds;
    struct timeval tv = {0, 0};
    FD_ZERO(&readfds);
    FD_SET(fd, &readfds);
    retval = select(fd + 1, &readfds, NULL, NULL, &tv);
    if (retval < 0)
	return -1;
    if (!retval)
	return -2;
    return READ_F(handle, buf, len);
}

static int
proxy_write(handle, buf, len)
void *handle;
void *buf;
unsigned int len;
{
    int fd = (int)handle, nb;
    fd_set fds;
    struct timeval tv;
    FD_ZERO(&fds);
    FD_SET(fd,&fds);
    tv.tv_sec = 30;	/* Don't block forever but allow for slow connections */
    tv.tv_usec = 0;
    if (select(fd+1, NULL, &fds, NULL, &tv)) {
	nb = write(fd, buf, len);
	return nb >= 0 ? nb : -1;
    } else
	return -1;
}
#endif	/* WIN32 */

struct proxy_auth_connection {
    int sin, sout, serr, pid;
    char error[BUFSZ + 1];
};

static void
proxy_auth_emit_error(struct proxy_auth_connection *auth)
{
    /*
     * If auth->error is empty then proxy_auth_verify was never called,
     * which implies that the remote end probably doesn't support
     * an authentication method which we allow.
     */
    const char *message = *auth->error ?
      auth->error : "Please upgrade your client.";
    winid w;
    int argc = 1;
    char *argv[2];
    /*
     * We are called before init_nhwindows,
     * but a window is much more user friendly.
     */
    argv[0] = DEF_GAME_NAME;
    argv[1] = NULL;
    proxy_init_nhwindows(&argc, argv);
    w = proxy_create_nhwindow(NHW_MENU);
    proxy_putstr(w, ATR_BOLD, "Authentication failed.");
    proxy_putstr(w, ATR_NONE, "");
    proxy_putstr(w, ATR_NONE, message);
    proxy_display_nhwindow(w, TRUE);
    proxy_destroy_nhwindow(w);
    proxy_exit_nhwindows(NULL);
}

/*
 * Returns non-NULL if helper program opened.
 */
 
static struct proxy_auth_connection *
proxy_auth_open()
{
    struct proxy_auth_connection *pac;
    char *authopts = nh_getenv("HACKAUTHENTICATION");
#ifdef WIN32
    if (authopts) {
	pac = (struct proxy_auth_connection *)alloc(sizeof(*pac));
	pac->sin = pac->sout = pac->serr = pac->pid = -1;
	strcpy(pac->error, "Authentication not supported under win32.");
	return pac;
    } else
	return NULL;
#else
    int s_in[2], s_out[2], s_err[2], r, status;
    char buf[BUFSZ + 1];
    if (authopts)
	parseauthentication(authopts);
    if (authentication.prog[0]) {
	pac = (struct proxy_auth_connection *)alloc(sizeof(*pac));
	pac->sin = pac->sout = pac->serr = pac->pid = -1;
	pac->error[0] = '\0';
	if (pipe(s_in) || pipe(s_out) || pipe(s_err)) {
	    strcpy(pac->error, "Can't create pipes to helper program.");
	    return pac;
	}
	if (!(pac->pid = fork())) {
	    int i, j, argc = 1;
	    char **argv;
	    char args[BUFSZ];
	    (void)setgid(getgid());
	    (void)setuid(getuid());
	    dup2(s_in[0], 0);
	    dup2(s_out[1], 1);
	    dup2(s_err[1], 2);
	    close(s_in[0]);
	    close(s_in[1]);
	    close(s_out[0]);
	    close(s_out[1]);
	    close(s_err[0]);
	    close(s_err[1]);
	    strcpy(args, authentication.args);
	    for(i = 0; args[i]; i++)
		if (args[i] == ' ' && i && args[i - 1] != ' ')
		    argc++;
	    argv = (char **) malloc((argc + 1) * sizeof(char *));
	    if (!argv)
	    {
		fprintf(stderr, "Resource failure\n");
		exit(1);
	    }
	    argv[0] = authentication.prog;
	    j = 1;
	    argv[j] = args;
	    for(i = 0; args[i]; i++)
		if (args[i] == ' ' && i) {
		    args[i] = '\0';
		    while(args[i + 1] == ' ')
			i++;
		    argv[++j] = args + i + 1;
		}
	    argv[++j] = NULL;
	    execvp(authentication.prog, argv);
	    perror(authentication.prog);
	    exit(1);
	}
	close(s_in[0]);
	close(s_out[1]);
	close(s_err[1]);
	pac->sin = s_in[1];
	pac->sout = s_out[0];
	pac->serr = s_err[0];
	r = read(pac->sout, buf, BUFSZ);
	if (r < 0) {
	    strcpy(pac->error, "Error reading from helper program.");
	    return pac;
	}
	if (r == 0) {
	    /*
	     * Authentication program has failed. If it has output an
	     * error on stardard error then report this.
	     */
	    r = read(pac->serr, buf, BUFSZ);
	    if (r > 0) {
		if (buf[r - 1] == '\n')
		    r--;
		buf[r] = '\0';
		strcpy(pac->error, buf);
	    } else {
		waitpid(pac->pid, &status, 0);
		if (!WIFEXITED(status)) {
		    if (WIFSIGNALED(status))
			sprintf(pac->error, "Helper program died (signal %d).",
			  WTERMSIG(status));
		    else
			strcpy(pac->error, "Helper program died.");
		} else if (WEXITSTATUS(status)) {
		    r = read(pac->serr, buf, BUFSZ);
		    if (r > 0) {
			if (buf[r - 1] == '\n')
			    r--;
			buf[r] = '\0';
			strcpy(pac->error, buf);
		    } else
			sprintf(pac->error, "Helper program exited (error %d).",
			  WEXITSTATUS(status));
		}
		else
		    sprintf(pac->error, "Helper program exited.");
	    }
	}
	/* TODO: Do something with the challenge string if not empty */
	return pac;
    }
    else
	return NULL;
#endif	/* WIN32 */
}

static int
proxy_auth_verify(struct proxy_auth_connection *pac,
  const char *name, const char *response)
{
#ifndef WIN32
    int r, status, verified = 0;
    char buf[BUFSZ + 1];
    if (*pac->error)
	return 0;
    strcpy(buf, name);
    strcat(buf, "\n");
    write(pac->sin, buf, strlen(buf));
    strcpy(buf, response);
    strcat(buf, "\n");
    write(pac->sin, buf, strlen(buf));
    waitpid(pac->pid, &status, 0);
    pac->pid = -1;
    if (!WIFEXITED(status)) {
	if (WIFSIGNALED(status))
	    sprintf(pac->error, "Helper program died (signal %d).",
	      WTERMSIG(status));
	else
	    strcpy(pac->error, "Helper program died.");
    } else if (WEXITSTATUS(status)) {
	r = read(pac->serr, buf, BUFSZ);
	if (r > 0) {
	    if (buf[r - 1] == '\n')
		r--;
	    buf[r] = '\0';
	    strcpy(pac->error, buf);
	} else
	    strcpy(pac->error, "Helper program exited.");
    }
    else
	verified = 1;
    return verified;
#else
    return 0;
#endif	/* WIN32 */
}

static void
proxy_auth_close(struct proxy_auth_connection *pac)
{
#ifndef WIN32
    int status;
    if (pac->sin >= 0)
	close(pac->sin);
    if (pac->sout >= 0)
	close(pac->sout);
    if (pac->serr >= 0)
	close(pac->serr);
    if (pac->pid >= 0) {
	if (!waitpid(pac->pid, &status, WNOHANG)) {
	    kill(pac->pid, 15);
	    sleep(1);
	    (void)waitpid(pac->pid, &status, WNOHANG);
	}
    }
#endif
    free(pac);
}

static int
proxy_init(struct proxy_auth_connection *auth)
{
    int i, j, k;
    static char *name = (char *)0;
    NhExtIO *rd, *wr;
    struct nhext_svc *services;
    struct nhext_line *lp = (struct nhext_line *)0, line;
    char standard[8];
#ifdef UNIX
    rd = nhext_io_open(READ_F, READ_H, NHEXT_IO_RDONLY);
    if (rd)
	nhext_io_setnbfunc(rd, proxy_read_nb);
#else
# ifdef WIN32
    void *read_h = READ_H;
    if (GetFileType((HANDLE)read_h) == FILE_TYPE_PIPE) {
	rd = nhext_io_open(READ_F, read_h, NHEXT_IO_RDONLY);
	if (rd)
	    nhext_io_setnbfunc(rd, proxy_pipe_read_nb);
    } else
# endif
    rd = nhext_io_open(READ_F, READ_H, NHEXT_IO_RDONLY | NHEXT_IO_NBLOCK);
#endif
    if (!rd) {
	pline("Proxy: Failed to open read NhExtIO stream");
	return FALSE;
    }
    wr = nhext_io_open(WRITE_F, WRITE_H, NHEXT_IO_WRONLY);
    if (!wr) {
	pline("Proxy: Failed to open write NhExtIO stream");
	nhext_io_close(rd);
	return FALSE;
    }
    if (proxy_extents[0].name) {
	for(i = j = 0; proxy_extents[i].name; i++)
	    j += proxy_extents[i].no_procedures;
	for(i = 0; proxy_callbacks[i].id; i++)
	    ;
	j += i;
	services = (struct nhext_svc *) alloc(j * sizeof(struct nhext_svc));
	for(i = j = 0; proxy_extents[i].name; i++) {
	    (*proxy_extents[i].init)(0x8000 + j);
	    for(k = 0; k < proxy_extents[i].no_procedures; k++, j++) {
		services[j].id = 0x8000 + j;
		services[j].handler = proxy_extents[i].handler;
	    }
	}
	for(i = 0; proxy_callbacks[i].id; i++)
	    services[j + i] = proxy_callbacks[i];
    } else
	services = proxy_callbacks;
    if (nhext_init(rd, wr, services) < 0) {
	pline("Proxy: Failed to initialize NhExt");
	nhext_io_close(rd);
	nhext_io_close(wr);
	return FALSE;
    }
    line.type = "NhExt";
    line.n = auth ? 5 : 4;
    line.tags = (char **)alloc(line.n * sizeof(char *));
    line.values = (char **)alloc(line.n * sizeof(char *));
    line.tags[0] = "standard";
    Sprintf(standard, "%d.%d", EXT_STANDARD_MAJOR, EXT_STANDARD_MINOR);
    line.values[0] = standard;
    line.tags[1] = "game";
    line.values[1] = DEF_GAME_NAME;
    line.tags[2] = "version";
    line.values[2] = VERSION_STRING;
    line.tags[3] = "protocols";
    line.values[3] = "1,2";
    if (auth) {
	line.tags[4] = "authmethods";
	line.values[4] = "1";
    }
    i = nhext_subprotocol0_write_line(&line);
    free(line.tags);
    free(line.values);
    if (!i) {
	pline("Proxy: Failed to write NhExt greeting");
failed:
	if (lp)
	    nhext_subprotocol0_free_line(lp);
	nhext_end();
	nhext_io_close(rd);
	nhext_io_close(wr);
	return FALSE;
    }
    lp = nhext_subprotocol0_read_line();
    if (!lp) {
	pline("Proxy: Failed to read reply to NhExt greeting");
	goto failed;
    }
    if (strcmp(lp->type,"Ack")) {
	pline("Proxy: NhExt greeting not acknowledged");
	goto failed;
    }
    for(i = 0; i < lp->n; i++)
	if (!strcmp(lp->tags[i], "protocol")) {
	    if (!strcmp(lp->values[i], "1"))
		proxy_protocol = 1;
	    else if (!strcmp(lp->values[i], "2"))
		proxy_protocol = 2;
	    else {
		pline("Proxy: Illegal sub-protocol \"%s\"", lp->values[i]);
		goto failed;
	    }
	    break;
	}
    if (i == lp->n) {
	pline("Proxy: Missing protocol in acknowledgment");
	goto failed;
    }
    if (auth) {
	int method = 0;
	char *user = NULL;
	char *passwd = NULL;
	for(i = 0; i < lp->n; i++) {
	    if (!strcmp(lp->tags[i], "authmethod")) {
		if (!strcmp(lp->values[i], "1"))
		    method = 1;
	    } else if (!strcmp(lp->tags[i], "username"))
		user = lp->values[i];
	    else if (!strcmp(lp->tags[i], "password"))
		passwd = lp->values[i];
	}
	if (method == 1) {
	    proxy_authorized = proxy_auth_verify(auth, user, passwd);
	    if (proxy_authorized) {
		strncpy(plname, user, sizeof(plname) - 1);
		plname[sizeof(plname) - 1] = '\0';
	    }
	}
    } else
	proxy_authorized = 1;
    for(i = 0; i < lp->n; i++)
	if (!strcmp(lp->tags[i], "windowtype"))
	    break;
    if (name)
	free(name);
    if (i == lp->n)
	windowprocs.name = proxy_procs.name;
    else {
	name = (char *)alloc(strlen(lp->values[i]) + 7);
	Sprintf(name, "proxy/%s", lp->values[i]);
	windowprocs.name = name;
    }
    nhext_set_protocol(proxy_protocol);
    return TRUE;
} 

#undef READ_F
#undef WRITE_F
#undef READ_H
#undef WRITE_H

#ifdef DEBUG
static void
debug_dump(buf, len, arrow)
void *buf;
unsigned int len;
char *arrow;
{
    int i, j, nc;
    long l;
    char cbuf[17];
    unsigned char *bp = buf;
    for(i = 0; i < len; ) {
	if ((i & 15) == 0) {
	    if (!i)
		fputs(arrow, stderr);
	    else {
		cbuf[16] = '\0';
		while(nc++ < 40)
		    fputc(' ', stderr);
		fputs(cbuf, stderr);
		fputs("\n  ", stderr);
	    }
	    nc = 2;
	}
	if (len - i >= 4) {
	    l = (long)bp[i] << 24 | (long)bp[i + 1] << 16 |
	      (long)bp[i + 2] << 8 | bp[i + 3];
	    fprintf(stderr, " %08X", l);
	    nc += 9;
	    for(j = 0; j < 4; j++, i++)
		cbuf[i & 15] = isgraph(bp[i]) || bp[i] == ' ' ?  bp[i] : '.';
	}
	else {
	    fprintf(stderr, " %02X", bp[i]);
	    nc += 3;
	    cbuf[i & 15] = isgraph(bp[i]) || bp[i] == ' ' ? bp[i] : '.';
	    i++;
	}
    }
    if (len) {
	cbuf[i & 15 ? i & 15 : 16] = '\0';
	while(nc++ < 40)
	    fputc(' ', stderr);
	fputs(cbuf, stderr);
    }
    fputc('\n', stderr);
}

static int
debug_read(handle, buf, len)
void *handle;
void *buf;
unsigned int len;
{
    int retval;
    retval = proxy_read(handle, buf, len);
    if (retval == -2)
	fputs("<- PENDING\n", stderr);
    else if (retval < 0)
	fputs("<- ERROR\n", stderr);
    else if (!retval)
	fputs("<- EOF\n", stderr);
    else
	debug_dump(buf, retval, "<-");
    return retval;
}

static int
debug_write(handle, buf, len)
void *handle;
void *buf;
unsigned int len;
{
    int retval;
    retval = proxy_write(handle, buf, len);
    if (retval < 0)
	fputs("-> ERROR\n", stderr);
    else
	debug_dump(buf, retval, "->");
    return retval;
}
#endif	/* DEBUG */

static void
win_proxy_errhandler(class, error)
int class;
const char *error;
{
    if (class == EXT_ERROR_COMMS) {
	fputs(error, stderr);
	fputc('\n', stderr);
	(void) fflush(stderr);
	hangup(0);
    } else {
	pline(error);
	pline("Program in disorder - perhaps you'd better #quit.");
    }
}

static unsigned long async_callbacks[] = {
    1 << EXT_CID_DISPLAY_INVENTORY - EXT_CID_DISPLAY_INVENTORY |
      1 << EXT_CID_DOREDRAW - EXT_CID_DISPLAY_INVENTORY |
      1 << EXT_CID_INTERFACE_MODE - EXT_CID_DISPLAY_INVENTORY |
      1 << EXT_CID_SET_OPTION_MOD_STATUS - EXT_CID_DISPLAY_INVENTORY,
};

void
win_proxy_init()
{
    int retval;
    struct proxycb_subprot2_init request, result;
    struct proxy_auth_connection *auth;
    in_proxy_init = TRUE;
    set_glyph_mapping();
    (void)nhext_set_errhandler(win_proxy_errhandler);
    auth = proxy_auth_open();
    if (!proxy_init(auth))
	panic("Proxy: Failed to initialize");
    if (proxy_protocol == 1)
	retval = nhext_rpc(EXT_FID_INIT, 0, 0);
    else {
	request.n_masks = SIZE(async_callbacks);
	request.masks = async_callbacks;
	result.masks = (unsigned long *)0;
	retval = nhext_rpc(EXT_FID_INIT,
	  1, EXT_XDRF(proxycb_xdr_subprot2_init, &request),
	  1, EXT_XDRF(proxycb_xdr_subprot2_init, &result));
	if (retval) {
	    nhext_set_async_masks(result.n_masks, result.masks);
	    free(result.masks);
	}
    }
    if (!retval)
	panic("Proxy: Failed to initialize window interface");
    /*
     * raw_print and raw_print_bold are now useable
     * and proxy_auth_emit_error() needs them.
     */
    in_proxy_init = FALSE;
    if (auth) {
	if (!proxy_authorized) {
	    proxy_auth_emit_error(auth);
	    clearlocks();
	    terminate(EXIT_SUCCESS);
	}
	proxy_auth_close(auth);
    }
}

int
win_proxy_iteration()
{
    int i;
    i = nhext_svc(proxy_callbacks);
    if (!i)
	fprintf(stderr, "proxy: Ignoring packet with zero ID\n");
    return i;
}
slashem-0.0.7E7F3/win/proxy/nhext.c0000664000076400007640000007376410545462317015145 0ustar  aliali/* $Id: nhext.c,v 1.18.2.1 2005/01/03 13:54:21 j_ali Exp $ */
/* Copyright (c) Slash'EM Development Team 2001-2004 */
/* NetHack may be freely redistributed.  See license for details. */

/* #define DEBUG */

#include 
#include 
#include 
#include 
#include 
#include "nhxdr.h"
#include "proxycom.h"

/*
 * This module implements the low-level NhExt protocols.
 */

static struct nhext_connection {
    int length;
    /* In sub-protocol 2, the serial number to
     * which the last reply read relates
     */
    unsigned short serial;
    NhExtXdr *in, *out;
    NhExtIO *rd, *wr;
    struct nhext_svc *callbacks;
    int protocol;
} nhext_connection;

int nhext_init(NhExtIO *rd, NhExtIO *wr, struct nhext_svc *cb)
{
    nhext_io_setmode(rd, NHEXT_IO_NOAUTOFILL);
    nhext_connection.rd = rd;
    nhext_connection.wr = wr;
    nhext_connection.in = (NhExtXdr *)alloc(sizeof(NhExtXdr));
    nhext_connection.out = (NhExtXdr *)alloc(sizeof(NhExtXdr));
    nhext_xdrio_create(nhext_connection.in, rd, NHEXT_XDR_DECODE);
    nhext_xdrio_create(nhext_connection.out, wr, NHEXT_XDR_ENCODE);
    nhext_connection.callbacks = cb;
    nhext_connection.protocol = 0;
    return 0;
}

int nhext_set_protocol(int protocol)
{
    if (protocol < 1 || protocol > 2)
	return -1;
    nhext_connection.protocol = protocol;
    return 0;
}

int nhext_async_mode(void)
{
    return nhext_connection.protocol > 1;
}

void nhext_end()
{
    nhext_xdr_destroy(nhext_connection.in);
    nhext_xdr_destroy(nhext_connection.out);
    free(nhext_connection.in);
    free(nhext_connection.out);
    nhext_connection.in = NULL;
    nhext_connection.out = NULL;
}

static char *nhext_subprotocol0_encode_value(char *buf, char *value)
{
    *buf++ = '"';
    while (*value) {
	if (*value == '\\' || *value == '"')
	    *buf++ = '\\';
	*buf++ = *value++;
    }
    *buf++ = '"';
    return buf;
}

int nhext_subprotocol0_write_line(struct nhext_line *line)
{
    int i, len, retval;
    char *buf, *bp;
    len = strlen(line->type) + 1;
    for(i = 0; i < line->n; i++) {
	len += strlen(line->tags[i]) + 1;
	len += strlen(line->values[i]) * 2 + 2 + 1;
    }
    buf = (char *)alloc(len);
    (void)strcpy(buf, line->type);
    bp = buf + strlen(buf);
    for(i = 0; i < line->n; i++) {
	*bp++ = ' ';
	(void)strcpy(bp, line->tags[i]);
	bp += strlen(bp);
	*bp++ = ' ';
	bp = nhext_subprotocol0_encode_value(bp, line->values[i]);
    }
    *bp++ = '\n';
    retval = nhext_io_write(nhext_connection.wr, buf, bp - buf) == bp - buf &&
      !nhext_io_flush(nhext_connection.wr);
    free(buf);
    return retval;
}

#define NHEXT_SP0_NORMAL_SIZE	64
#define NHEXT_SP0_SPECIAL_SIZE	200

/*
 * Return the next token read or NULL on error. An empty string
 * will be returned if the line ends before a token is found.
 */

static char *nhext_subprotocol0_read_token(NhExtIO *io)
{
    int i, ch;
    static char token[NHEXT_SP0_NORMAL_SIZE+1];
    for(i = 0;; ) {
	ch = nhext_io_getc(io);
	if (ch < 0) {
#ifdef DEBUG
	    fprintf(stderr,
	      "[%d] EOF/ERROR while reading sub-protocol 0 token\n", getpid());
#endif
	    return NULL;
	}
	if (ch == '\r' || ch == '\n')
	    break;
	if (ch == ' ')
	    if (i)
		break;
	    else
		continue;
	if (ch != '_' && !isalnum(ch)) {
#ifdef DEBUG
	    fprintf(stderr,
	      "[%d] Illegal character (0x%02X) while reading sub-protocol 0 token\n",
	      getpid(), ch);
#endif
	    return NULL;
	}
	if (i == NHEXT_SP0_NORMAL_SIZE) {
#ifdef DEBUG
	    fprintf(stderr,
	      "[%d] Too many characters while reading sub-protocol 0 token\n",
	      getpid());
#endif
	    return NULL;
	}
	token[i++] = ch;
    }
    token[i] = '\0';
#ifdef DEBUG
    fprintf(stderr, "nhext_subprotocol0_read_token: %s\n", token);
#endif
    return token;
}

/*
 * Return the next value read or NULL on error. A NULL
 * will be returned if the line ends before a value can be found.
 */

static char *nhext_subprotocol0_read_value(NhExtIO *io, int isspecial)
{
    int i, ch, esc = FALSE, invalue = FALSE;
    const int maxlen =
      isspecial ? NHEXT_SP0_SPECIAL_SIZE : NHEXT_SP0_NORMAL_SIZE;
    static char value[NHEXT_SP0_SPECIAL_SIZE+1];
    for(i = 0;; ) {
	ch = nhext_io_getc(io);
	if (ch < 0) {
#ifdef DEBUG
	    fprintf(stderr,
	      "[%d] EOF/ERROR while reading sub-protocol 0 value\n", getpid());
#endif
	    return NULL;
	}
	if (!invalue) {
	    if (ch == '"')
		invalue = TRUE;
	    else if (ch == ' ')
		continue;
	    else {
#ifdef DEBUG
		fprintf(stderr,
		  "[%d] Read 0x%02X while expecting sub-protocol 0 value\n",
		  getpid(), ch);
#endif
		return NULL;
	    }
	} else if (ch < ' ' || ch > '~') {
#ifdef DEBUG
	    fprintf(stderr,
	      "[%d] Illegal character (0x%02X) while reading sub-protocol 0 value\n",
	      getpid(), ch);
#endif
	    return NULL;
	} else if (!esc && ch == '\\')
	    esc = TRUE;
	else if (!esc && ch == '"')
	    break;
	else if (i == maxlen) {
#ifdef DEBUG
	    fprintf(stderr,
	      "[%d] Too many characters while reading sub-protocol 0 value\n",
	      getpid());
#endif
	    return NULL;
	} else {
	    value[i++] = ch;
	    esc = FALSE;
	}
    }
    value[i] = '\0';
#ifdef DEBUG
    fprintf(stderr, "nhext_subprotocol0_read_value: %s\n", value);
#endif
    return value;
}

void nhext_subprotocol0_free_line(struct nhext_line *line)
{
    int i;
    for(i = 0; i < line->n; i++) {
	free(line->tags[i]);
	free(line->values[i]);
    }
    free(line->type);
    free(line->tags);
    free(line->values);
    free(line);
}

struct nhext_line *nhext_subprotocol0_read_line()
{
    int i, iserror;
    char *s;
    struct nhext_line *line;
#ifdef DEBUG
    if (nhext_io_getc(nhext_connection.rd) >= 0)
	fprintf(stderr,
	  "[%d] NhExt: Non-empty buffer in nhext_subprotocol0_read_line\n",
	  getpid());
#endif
    i = nhext_io_filbuf(nhext_connection.rd, TRUE);
    if (i <= 0) {
#ifdef DEBUG
	fprintf(stderr,
	  "[%d] %s while trying to read sub-protocol 0 packet\n",
	  getpid(), i == 0 ? "EOF" : i == -2 ? "EWOULDBLOCK" : "ERROR");
#endif
	return NULL;
    }
    line = (struct nhext_line *) alloc(sizeof(*line));
    s = nhext_subprotocol0_read_token(nhext_connection.rd);
    if (!s) {
	free(line);
	return NULL;
    }
    iserror = !strcmp(s, "Error");
    line->type = strdup(s);
    line->n = 0;
    line->tags = (char **)0;
    line->values = (char **)0;
    for(i = 0;; i++) {
	s = nhext_subprotocol0_read_token(nhext_connection.rd);
	if (!s || !*s)
	    break;
	if (line->n) {
	    line->tags =
	      (char **)realloc(line->tags, (line->n + 1)*sizeof(char **));
	    line->values =
	      (char **)realloc(line->values, (line->n + 1)*sizeof(char **));
	    if (!line->tags || !line->values) {
#ifdef DEBUG
		fprintf(stderr,
		  "[%d] NhExt: Memory allocation failure; cannot get %u tags",
		  getpid(), line->n + 1);
#endif
		s = NULL;
		break;
	    }
	} else {
	    line->tags = (char **)malloc(sizeof(char **));
	    line->values = (char **)malloc(sizeof(char **));
	    if (!line->tags || !line->values) {
#ifdef DEBUG
		fprintf(stderr,
		  "[%d] NhExt: Memory allocation failure; cannot get 1 tag",
		  getpid());
#endif
		s = NULL;
		break;
	    }
	}
	line->tags[line->n] = strdup(s);
	s = nhext_subprotocol0_read_value(nhext_connection.rd,
	  iserror && !strcmp(s, "mesg"));
	if (!s) {
	    free(line->tags[line->n]);
	    break;
	}
	line->values[line->n] = strdup(s);
	line->n++;
    }
    if (s && nhext_io_getc(nhext_connection.rd) >= 0) {
	for(i = 1; nhext_io_getc(nhext_connection.rd) >= 0; i++)
	    ;
#ifdef DEBUG
	fprintf(stderr,
	  "[%d] %d extra character%s after valid sub-protocol 0 packet\n",
	  getpid(), i, i == 1 ? "": "s");
#endif
	s = NULL;
    }
    if (!s) {
	nhext_subprotocol0_free_line(line);
	return NULL;
    } else
	return line;
}

/*
 * This function is available for callers to use if sub-protocol 0 fails.
 * It returns a pointer to the received packet which was being processed
 * at the time.
 */

char *nhext_subprotocol0_get_failed_packet(int *nb)
{
    if (nhext_connection.in)
	return nhext_io_getpacket(nhext_connection.rd, nb);
    else
	return (char *)0;
}

static void nhext_default_handler(int class, const char *error)
{
    impossible(error);
}

static nhext_errhandler nhext_error_handler = nhext_default_handler;

nhext_errhandler nhext_set_errhandler(nhext_errhandler new)
{
    nhext_errhandler old = nhext_error_handler;
    nhext_error_handler = new;
    return old;
}

static void nhext_error(int class, const char *fmt, ...)
{
    va_list ap;
    char buf[128];
    va_start(ap, fmt);
    vsprintf(buf, fmt, ap);
    nhext_error_handler(class, buf);
    va_end(ap);
}

#if defined(va_copy)
#define VA_COPY(dst, src)	va_copy(dst, src)
#elif defined(__va_copy)
#define VA_COPY(dst, src)	__va_copy(dst, src)
#else
#define VA_COPY(dst, src)	((dst) = (src))
#endif

static int nhext_rpc_vparams1(NhExtXdr *xdrs, int no, va_list *app)
{
    int retval = TRUE;
    int param;
    va_list ap;
    long param_l;
    long *param_pl;
    int param_i;
    int *param_pi;
    char *param_s;
    char **param_ps, *param_pc;
    nhext_xdr_bool_t param_b, *param_pb;
    int (*param_codec)();
    void *param_addr;
    VA_COPY(ap, *app);
    while(retval && no--) {
	param = va_arg(ap, int);
	switch(param) {
	    case EXT_PARAM_INT:
		param_i = va_arg(ap, int);
		retval = nhext_xdr_int(xdrs, ¶m_i);
		break;
	    case EXT_PARAM_LONG:
		param_l = va_arg(ap, long);
		retval = nhext_xdr_long(xdrs, ¶m_l);
		break;
	    case EXT_PARAM_STRING:
		param_s = va_arg(ap, char *);
		retval = nhext_xdr_string(xdrs, ¶m_s, (unsigned int)-1);
		break;
	    case EXT_PARAM_BYTES:
		param_s = va_arg(ap, char *);
		param_i = va_arg(ap, int);
		retval = nhext_xdr_bytes(xdrs, ¶m_s, ¶m_i,
			(unsigned int)-1);
		break;
	    case EXT_PARAM_BOOLEAN:
		param_b = va_arg(ap, int);	/* boolean is promoted to int */
		retval = nhext_xdr_bool(xdrs, ¶m_b);
		break;
	    case EXT_PARAM_CHAR:
		param_i = va_arg(ap, int);	/* char is promoted to int */
		retval = nhext_xdr_int(xdrs, ¶m_i);
		break;
	    case EXT_PARAM_PTR | EXT_PARAM_INT:
		param_pi = va_arg(ap, int *);
		retval = nhext_xdr_int(xdrs, param_pi);
		break;
	    case EXT_PARAM_PTR | EXT_PARAM_LONG:
		param_pl = va_arg(ap, long *);
		retval = nhext_xdr_long(xdrs, param_pl);
		break;
	    case EXT_PARAM_PTR | EXT_PARAM_STRING:
		param_ps = va_arg(ap, char **);
		*param_ps = NULL;
		retval = nhext_xdr_string(xdrs, param_ps, (unsigned int)-1);
		break;
	    case EXT_PARAM_PTR | EXT_PARAM_BYTES:
		param_ps = va_arg(ap, char **);
		*param_ps = NULL;
		param_pi = va_arg(ap, int *);
		nhext_xdr_bytes(xdrs, param_ps, param_pi, (unsigned int)-1);
		break;
	    case EXT_PARAM_PTR | EXT_PARAM_BOOLEAN:
		param_pb = va_arg(ap, nhext_xdr_bool_t *);
		retval = nhext_xdr_bool(xdrs, param_pb);
		break;
	    case EXT_PARAM_PTR | EXT_PARAM_CHAR:
		param_pc = va_arg(ap, char *);
		retval = nhext_xdr_char(xdrs, param_pc);
		break;
	    case EXT_PARAM_XDRF:
		param_codec = (int (*)())va_arg(ap, void *);
		param_addr = va_arg(ap, void *);
		retval = (*param_codec)(xdrs, param_addr);
		break;
	    default:
		nhext_error(EXT_ERROR_INTERNAL,
		  "Bad key in proxy rpc (%d)", param);
		retval = FALSE;
		break;
	}
    }
    VA_COPY(*app, ap);
    return retval;
}

/*
 * Note: nhext_rpc_params() does different things depending on whether
 * the XDR stream is set to encode or decode. In decode mode, the
 * header is assumed to have already been read whereas, in encode mode,
 * nhext_rpc_params() writes the reply header itself.
 */

int nhext_rpc_params(NhExtXdr *xdrs, int no, ...)
{
    int retval;
    va_list ap;
    unsigned long value;
    NhExtXdr sink;
    if (nhext_connection.protocol < 1 || nhext_connection.protocol > 2) {
	nhext_error(EXT_ERROR_INTERNAL,
	  "nhext_rpc_params: Unsupported protocol %d",
	  nhext_connection.protocol);
	return 0;
    }
    if (xdrs->x_op == NHEXT_XDR_ENCODE) {
	sink.x_op = NHEXT_XDR_COUNT;
	sink.x_pos = 0;
	va_start(ap, no);
	retval = nhext_rpc_vparams1(&sink, no, &ap);
	va_end(ap);
	if (!retval)
	    nhext_error(EXT_ERROR_INTERNAL, "Codec failed in sink");
	else {
	    value = sink.x_pos >> 2;
	    if (nhext_connection.protocol > 1) {
		value |= 0x8000;		/* Mark packet as a reply */
		value |= nhext_svc_get_serial() << 16;
	    }
	    retval = nhext_xdr_u_long(xdrs, &value);
	    if (!retval)
		nhext_error(EXT_ERROR_COMMS, "Failed to write header");
	}
	if (!retval)
	    return retval;
    }
    va_start(ap, no);
    retval = nhext_rpc_vparams1(xdrs, no, &ap);
    if (!retval)
	nhext_error(EXT_ERROR_COMMS, "Codec failed");
    va_end(ap);
    return retval;
}

#define NHEXT_FLAG_ASYNC	1
#define NHEXT_FLAG_UNSUPPORTED	2

static int nhext_n_flags;
static int *nhext_flags;

static int
nhext_extend_flags(int n_flags)
{
    int *new;
    if (n_flags <= nhext_n_flags)
	return 0;
    if (!nhext_flags)
	new = (int *)calloc(n_flags, sizeof(int));
    else
	new = (int *)realloc(nhext_flags, n_flags * sizeof(int));
    if (new) {
	nhext_flags = new;
	nhext_n_flags = n_flags;
	return 0;
    } else
	return -1;
}

void
nhext_set_async_masks(int n,unsigned long *masks)
{
    int i;
    if (nhext_n_flags)
	for(i = 0; i < nhext_n_flags; i++)
	    nhext_flags[i] &= ~NHEXT_FLAG_ASYNC;
    if (n) {
	for(i = 31; i > 0; i--)
	    if (masks[n - 1] & 1L << i)
		break;
	if (nhext_extend_flags(1 + (n - 1) * 32 + i + 1))
	    impossible("Memory allocation failure in nhext_set_async_masks");
#ifdef DEBUG
	fprintf(stderr, "nhext: Async IDs:");
#endif
	for(i = 1; i < nhext_n_flags; i++) {
	    if (masks[(i - 1) / 32] & 1L << ((i - 1) & 31))
		nhext_flags[i] |= NHEXT_FLAG_ASYNC;
#ifdef DEBUG
	    if (nhext_flags[i] & NHEXT_FLAG_ASYNC)
		fprintf(stderr, " %x", i);
#endif
	}
#ifdef DEBUG
	fprintf(stderr, "\n");
#endif
    }
#ifdef DEBUG
    else
	fprintf(stderr, "No async IDs\n");
#endif
}

void
nhext_set_unsupported(int id)
{
    if (!nhext_extend_flags(id + 1))
	nhext_flags[id] |= NHEXT_FLAG_UNSUPPORTED;
}

struct nhext_frame {
    struct nhext_frame *prev_fp;
    unsigned short serial;
    unsigned short length;
#ifdef DEBUG
    unsigned short id;
#endif
    unsigned char async;
    void *data;
};

static unsigned short rpc_serial = 0;
static struct nhext_frame *nhext_rpc_fp, *nhext_svc_fp;

unsigned short nhext_rpc_get_next_serial(void)
{
    return rpc_serial + 1;
}

unsigned short nhext_svc_get_serial(void)
{
    return nhext_svc_fp ? nhext_svc_fp->serial : 0;
}

static void nhext_store_reply(struct nhext_frame *f)
{
    int n, nb;
    void *data;
    f->length = nhext_connection.length;
    if (!f->length) {
	/* Avoid alloc(0) which may return NULL */
	f->data = (void *)alloc(1);
	return;
    }
    f->data = (void *)alloc(f->length);
    nhext_io_setautofill_limit(nhext_connection.rd, f->length);
    /* Can't use nhext_io_fread() since nhext_connection.length
     * may be too large for use as a member size.
     */
    data = f->data;
    nb = f->length;
    while(nb) {
	n = nhext_io_read(nhext_connection.rd, data, nb);
	if (n > 0) {
	    nb -= n;
	    data += n;
	} else {
	    /*
	     * Issue a comms error here. We will probably
	     * issue a protocol error (short reply) when
	     * we come to process the reply, which isn't
	     * very helpful, but it doesn't seem worth
	     * the overhead to block it -- ALI.
	     */
	    nhext_error(EXT_ERROR_COMMS, "Read from proxy interface failed");
	    f->length -= nb;
	    break;
	}
    }
}

/*
 * nhext_rpc() is a generic function to call a remote procedure and return
 * a result. It cannot deal with every possible type of request and result
 * packet, but it's very simple to use for those it can deal with.
 *
 * Arguments are:
 *	id		The ID of the procedure to call
 *	request		List of arguments describing the request packet
 *	response	List of arguments describing the response packet
 *
 * For both the request and response packets, the list of arguments consists
 * of:
 *
 *	no			The number of fields in the packet
 *	field[1] .. field[no]	The field to send/receive.
 */

int
nhext_rpc(unsigned short id, ...)
{
    NhExtXdr sink;
    va_list ap;
    unsigned long value, pos;
    int i, retval;
    int no;		/* Number of fields */
    struct nhext_frame frame, *f;
    NhExtXdr xdrmem, *in;
    if (nhext_connection.protocol < 1 || nhext_connection.protocol > 2) {
	nhext_error(EXT_ERROR_INTERNAL, "nhext_rpc: Unsupported protocol %d",
	  nhext_connection.protocol);
	return FALSE;
    }
    if (nhext_flags && id < nhext_n_flags &&
      nhext_flags[id] & NHEXT_FLAG_UNSUPPORTED) {
	return FALSE;
    }
    frame.prev_fp = nhext_rpc_fp;
    nhext_rpc_fp = &frame;
    frame.serial = ++rpc_serial;
    frame.data = NULL;
#ifdef DEBUG
    frame.id = id;
    fprintf(stderr, "[%d] nhext_rpc: [%u] call(%X)\n",
      getpid(), rpc_serial, id);
    if (frame.prev_fp) {
	fprintf(stderr, "[%d] nhext_rpc: call stack:\n", getpid());
	for(f = frame.prev_fp; f; f = f->prev_fp)
	    fprintf(stderr, "[%d]\t[%u] call(%X)%s\n",
	      getpid(), f->serial, f->id, f->data ? " (reply stored)" : "");
    }
#endif
    sink.x_op = NHEXT_XDR_COUNT;
    sink.x_pos = 0;
    va_start(ap, id);
    no = va_arg(ap, int);
    if (!nhext_rpc_vparams1(&sink, no, &ap)) {
	nhext_error(EXT_ERROR_INTERNAL, "Codec failed in sink");
	va_end(ap);
	--rpc_serial;
	nhext_rpc_fp = frame.prev_fp;
	return FALSE;
    }
    va_end(ap);
    va_start(ap, id);
    (void) va_arg(ap, int);
    value = (id << 16) | (sink.x_pos >> 2);
    nhext_xdr_u_long(nhext_connection.out, &value);
    pos = nhext_xdr_getpos(nhext_connection.out);
    if (!nhext_rpc_vparams1(nhext_connection.out, no, &ap) ||
      nhext_io_flush(nhext_connection.wr)) {
	nhext_error(EXT_ERROR_COMMS, "Write to proxy interface failed");
	va_end(ap);
	nhext_rpc_fp = frame.prev_fp;
	return FALSE;
    }
    if (nhext_xdr_getpos(nhext_connection.out) - pos != sink.x_pos) {
	nhext_error(EXT_ERROR_INTERNAL,
	  "Miscounted length in proxy rpc ID %d (counted %lu, wrote %lu)",
	  id, sink.x_pos, nhext_xdr_getpos(nhext_connection.out) - pos);
	va_end(ap);
	nhext_rpc_fp = frame.prev_fp;
	return FALSE;
    }
    if (nhext_flags && id < nhext_n_flags &&
      nhext_flags[id] & NHEXT_FLAG_ASYNC) {
	no = va_arg(ap, int);
	if (no) {
	    nhext_error(EXT_ERROR_PROTOCOL,
	      "Expecting reply from asynchronous procedure %d", id);
	    va_end(ap);
	    nhext_rpc_fp = frame.prev_fp;
	    return FALSE;
	}
#ifdef DEBUG
	fprintf(stderr, "[%d] nhext_rpc: [%lu] %X sent\n",
	  getpid(), frame.serial, id);
#endif
	frame.async = TRUE;
    } else
	frame.async = FALSE;
    for(;;)
    {
	/* By dealing with incoming packets here, we reduce the chance that
	 * the remote end will need to buffer replies. We cannot do this,
	 * however, unless we are certain that we won't block on the read;
	 * otherwise, we could easily deadlock.
	 */
	if (frame.async && nhext_io_willblock(nhext_connection.rd)) {
	    va_end(ap);
	    nhext_rpc_fp = frame.prev_fp;
	    return TRUE;
	}
	retval = nhext_svc(nhext_connection.callbacks);
	if (retval < 0) {
	    va_end(ap);
	    nhext_rpc_fp = frame.prev_fp;
	    return FALSE;
	} else if (!retval) {
	    if (!frame.async && (nhext_connection.protocol <= 1 ||
	      nhext_connection.serial == frame.serial)) {
		frame.length = nhext_connection.length;
		break;
	    } else {
		for(f = frame.prev_fp; f; f = f->prev_fp) {
		    if (nhext_connection.serial == f->serial &&
		      !f->async && !f->data) {
			nhext_store_reply(f);
			break;
		    }
		}
		if (!f) {
		    nhext_error(EXT_ERROR_PROTOCOL,
		      "Reply received for unexpected serial %u (%d bytes)",
		      nhext_connection.serial, nhext_connection.length);
		    /* Junk the reply and continue to wait */
		    nhext_io_setautofill_limit(nhext_connection.rd,
		      nhext_connection.length);
		    for(i = 0; i < nhext_connection.length; i++)
			(void)nhext_io_getc(nhext_connection.rd);
		}
#ifdef DEBUG
		else {
		    long total = 0;
		    for(f = frame.prev_fp; f; f = f->prev_fp)
			if (f->data)
			    total += f->length;
		    fprintf(stderr,
		      "[%d] nhext_rpc: %u bytes stored (total %ld)\n",
		      getpid(), nhext_connection.length, total);
		}
#endif
	    }
	} else if (frame.data)
	    break;
    }
    no = va_arg(ap, int);
    /* External window ports are always allowed to return an empty reply to
     * a request. This indicates that the request is not supported.
     */
    if (no && !frame.length) {
	nhext_error(EXT_ERROR_NOTSUPPORTED,
	  "Procedure %d not supported by remote end", id);
	va_end(ap);
	nhext_set_unsupported(id);
	nhext_rpc_fp = frame.prev_fp;
	return FALSE;
    }
    if (frame.data) {
	in = &xdrmem;
	nhext_xdrmem_create(in, frame.data, frame.length, NHEXT_XDR_DECODE);
    } else {
	in = nhext_connection.in;
	nhext_io_setautofill_limit(nhext_connection.rd, frame.length);
    }
    if (!nhext_rpc_vparams1(in, no, &ap)) {
	/*
	 * There are two important causes of nhext_rpc_vparams1() failing.
	 * Either the packet sent by the remote end is shorter than we
	 * are expecting or a comms error caused us to fail to read the
	 * whole packet. We distinguish these by checking if NOAUTOFILL
	 * is set (in which case we have read the advertised length).
	 * Note: When processing a stored reply we assume that the error
	 * must be a protocol error (we have no way of detecting if the
	 * short reply is due to a previous comms error).
	 */
	if (in == &xdrmem ||
	  nhext_io_getmode(nhext_connection.rd) & NHEXT_IO_NOAUTOFILL)
	    nhext_error(EXT_ERROR_PROTOCOL,
	      "Short reply received for protocol %d (received %d)", id,
	      frame.length);
	else
	    nhext_error(EXT_ERROR_COMMS, "Read from proxy interface failed");
	va_end(ap);
	if (in == &xdrmem) {
	    nhext_xdr_destroy(in);
	    free(frame.data);
	}
	nhext_rpc_fp = frame.prev_fp;
	return FALSE;
    }
    /* If we're in sub-protocol 2, there may well be more bytes available
     * which form part of the next packet, but nhext_rpc_vparams1 should have
     * read the whole of this packet. If we're in sub-protocol 1, the tests
     * can be even more strict - see below. If we're processing a stored
     * packet, we can check this by looking at the read pointer.
     * Otherwise, we can check this since NOAUTOFILL will be set if the
     * advertised length has been consumed.
     */
    if (in == &xdrmem ? nhext_xdr_getpos(in) < frame.length :
      !(nhext_io_getmode(nhext_connection.rd) & NHEXT_IO_NOAUTOFILL)) {
	/* Output an error and read and throw away the excess data. */
	if (in == &xdrmem)
	    i = frame.length - nhext_xdr_getpos(in);
	else
	    for(i = 0;; i++) {
		(void)nhext_io_getc(nhext_connection.rd);
		if (nhext_io_getmode(nhext_connection.rd) & NHEXT_IO_NOAUTOFILL)
		    break;
	    }
	nhext_error(EXT_ERROR_PROTOCOL,
	  "Mismatch in RPC ID %d reply length (%d of %d unused)",
	  id, i, nhext_connection.length);
	va_end(ap);
	if (in == &xdrmem) {
	    nhext_xdr_destroy(in);
	    free(frame.data);
	}
	nhext_rpc_fp = frame.prev_fp;
	return FALSE;
    }
    /* In sub-protocol 1, there should not be any more bytes available. If
     * there are then either the remote end wrote more data than it advertised
     * in the header, or it wrote two or more packets.
     */
    if (nhext_connection.protocol <= 1 &&
      nhext_io_getc(nhext_connection.rd) >= 0) {
	/* One or more bytes are still available. We output an error and
	 * read and throw away the excess data.
	 */
	for(i = 1; nhext_io_getc(nhext_connection.rd) >= 0; i++)
	    ;
	nhext_error(EXT_ERROR_PROTOCOL,
	  "Mismatch in RPC ID %d reply length (%d of %d unused)",
	  id, i, nhext_connection.length);
	va_end(ap);
	if (in == &xdrmem) {
	    nhext_xdr_destroy(in);
	    free(frame.data);
	}
	nhext_rpc_fp = frame.prev_fp;
	return FALSE;
    }
    va_end(ap);
    if (in == &xdrmem) {
	nhext_xdr_destroy(in);
	free(frame.data);
    }
    nhext_rpc_fp = frame.prev_fp;
#ifdef DEBUG
    fprintf(stderr, "[%d] nhext_rpc: [%lu] %X returns\n",
      getpid(), frame.serial, id);
#endif
    return TRUE;
}

/*
 * nhext_svc() is a function to service incoming packets. It reads a packet
 * header from the remote process (either a child or a parent). Service
 * packets (those which are not replies) are dispatched and replied to, reply
 * packets are left in the NhExt buffer (except for the header). The length
 * of the packet (as advised in the header) will be stored in the length
 * variable. In sub-protocol 2, the serial number to which the reply relates
 * is stored in the serial variable. For service packets, the ID is returned.
 * For replies, 0 is returned. Special packets are handled and 0xffff returned.
 *
 * nhext_svc() is thus suitable for use in two occasions. In the first, it
 * can be used to dispatch callbacks while waiting for a reply. In this mode
 * nhext_svc() should be called repeatedly until it returns 0. In the second
 * case, nhext_svc() can be used as the main loop of a server in which case
 * it should be called repeatedly to service requests and a zero ID should
 * be treated as an error.
 */

int
nhext_svc(struct nhext_svc *services)
{
    struct nhext_frame frame;
    static unsigned short serial = 0;
    int i, j, is_reply, is_special, type;
    unsigned short id;
    unsigned long value, word2;
    if (nhext_connection.protocol < 1 || nhext_connection.protocol > 2) {
	nhext_error(EXT_ERROR_INTERNAL, "nhext_svc: Unsupported protocol %d",
	  nhext_connection.protocol);
	return -1;
    }
    if (nhext_connection.protocol <= 1 &&
      nhext_io_getc(nhext_connection.rd) >= 0) {
	/* One or more bytes are already available. This means that a
	 * previous packet was not wholly used. We output an error and
	 * read and throw away the excess data.
	 */
	for(j = 1; nhext_io_getc(nhext_connection.rd) >= 0; j++)
	    ;
	nhext_error(EXT_ERROR_PROTOCOL,
	  "Mismatch in packet length (%d of %d unused)",
	  j, nhext_connection.length);
    }
    nhext_io_setautofill_limit(nhext_connection.rd, 4);
    if (!nhext_xdr_u_long(nhext_connection.in, &value)) {
	nhext_error(EXT_ERROR_COMMS, "Read from proxy interface failed");
	return -1;
    }
    id = value >> 16;
    if (nhext_connection.protocol <= 1) {
	is_reply = !id;
	is_special = FALSE;
	nhext_connection.length = (value & 0xffff) << 2;
    } else {
	is_reply = value & 0x8000;
	is_special = id == 0xffff && !is_reply;
	if (is_special) {
	    type = (value & 0x7f00) >> 8;
	    nhext_connection.length = (value & 0xff) << 2;
	} else
	    nhext_connection.length = (value & 0x7fff) << 2;
    }
    if (is_reply)
	nhext_connection.serial = id;
    else if (is_special) {
	nhext_io_setautofill_limit(nhext_connection.rd,
	  nhext_connection.length);
	if (type == EXT_SPECIAL_ERROR && nhext_connection.length >= 8) {
	    unsigned short serial;
	    unsigned char code;
	    if (!nhext_xdr_u_long(nhext_connection.in, &value) |
	      !nhext_xdr_u_long(nhext_connection.in, &word2)) {
		nhext_error(EXT_ERROR_COMMS,
		  "Read from proxy interface failed");
		return -1;
	    }
	    serial = value >> 16;
	    id = value & 0xffff;
	    code = word2 & 0xff;
	    /* Discard any unprocessed remainder of known types before
	     * calling nhext_error() so that we maintain our state.
	     */
	    for(j = 8; j < nhext_connection.length; j++)
		if (nhext_io_getc(nhext_connection.rd) < 0)
		    break;
	    switch(code) {
		case EXT_ERROR_UNSUPPORTED:
#ifdef DEBUG
		    nhext_error(code,
		      "Unsupported function %X in RPC serial %X", id, serial);
#endif
		    nhext_set_unsupported(id);
		    break;
		case EXT_ERROR_UNAVAILABLE:
		    nhext_error(code,
		      "Unavailable function %X in RPC serial %X", id, serial);
		    break;
		case EXT_ERROR_INVALIDENCODING:
		    nhext_error(code,
		      "Decoding error in RPC serial %X (ID %X)", serial, id);
		    break;
		case EXT_ERROR_INVALIDPARAMS:
		    nhext_error(code,
		      "Invalid parameter(s) in RPC serial %X (ID %X)",
		      serial, id);
		    break;
		case EXT_ERROR_RESOURCEFAILURE:
		    nhext_error(code,
		      "Ran out of resources in RPC serial %X (ID %X)",
		      serial, id);
		    break;
		default:
		    nhext_error(EXT_ERROR_GENERIC,
		      "Error %X in RPC serial %X (ID %X)", code, serial, id);
	    }
	} else {
	    /* Discard special packets of unknown types.
	     */
	    for(j = 0; j < nhext_connection.length; j++)
		if (nhext_io_getc(nhext_connection.rd) < 0)
		    break;
	}
	return 0xffff;
    } else {
	frame.prev_fp = nhext_svc_fp;
	nhext_svc_fp = &frame;
	frame.serial = ++serial;
	nhext_io_setautofill_limit(nhext_connection.rd,
	  nhext_connection.length);
	for(i = 0; services[i].id; i++) {
	    if (id == services[i].id) {
		(*services[i].handler)(id, nhext_connection.in,
		  nhext_connection.out);
		break;
	    }
	}
	if (nhext_connection.protocol <= 1 &&
	  nhext_io_getc(nhext_connection.rd) >= 0) {
	    /* One or more bytes are still available. This means that the
	     * whole packet was not used. We output an error if we called
	     * a handler (otherwise the error is not helpful) and, in any
	     * case, read and throw away the excess data.
	     */
	    for(j = 1; nhext_io_getc(nhext_connection.rd) >= 0; j++)
		;
	    if (services[i].id)
		/* Note: This can only occur if there was not a recursive
		 * call (otherwise any error would have been detected
		 * either just before the next packet was read if this
		 * callback request was partially unused or just after
		 * the packet was processed if a reply packet was partially
		 * unused). The conclusion of all this is that
		 * nhext_connection.length is always valid. -- ALI
		 */
		nhext_error(EXT_ERROR_PROTOCOL,
		  "Mismatch in callback ID %d request length (%d of %d unused)",
		  id, j, nhext_connection.length);
	}
	if (!services[i].id) {
#ifdef DEBUG
	    fprintf(stderr,"[%d] Unsupported proxy callback ID %d (%d known)\n",
	      getpid(), id, i);
#endif
	    nhext_error(EXT_ERROR_NOTSUPPORTED, "Procedure %d not supported",
	      id);
	    nhext_rpc_params(nhext_connection.out, 0);
	}
	nhext_svc_fp = frame.prev_fp;
	if (nhext_io_flush(nhext_connection.wr)) {
	    nhext_error(EXT_ERROR_COMMS, "Write to proxy interface failed");
	    return -1;
	}
    }
    return is_reply ? 0 : id;
}

void
nhext_send_error(unsigned short id, unsigned char error_code)
{
    unsigned short serial = nhext_svc_get_serial();
    unsigned long hdr, word1, word2;
    hdr = 0xffff0000 | EXT_SPECIAL_ERROR << 8 | 2;
    word1 = serial << 16 | id;
    word2 = error_code;
    if ((!nhext_xdr_u_long(nhext_connection.out, &hdr) |
      !nhext_xdr_u_long(nhext_connection.out, &word1) |
      !nhext_xdr_u_long(nhext_connection.out, &word2)) ||
      nhext_io_flush(nhext_connection.wr)) {
	nhext_error(EXT_ERROR_COMMS, "Write to proxy interface failed");
    }
}
slashem-0.0.7E7F3/win/proxy/test_io.c0000664000076400007640000003005210545462317015444 0ustar  aliali/* $Id: test_io.c,v 1.3 2003/10/25 18:06:02 j_ali Exp $ */
/* Copyright (c) Slash'EM Development Team 2002-2003 */
/* NetHack may be freely redistributed.  See license for details. */

#include 
#include 
#include 
#include 
#include "nhxdr.h"
#include "test_com.h"

/* #define PRINTF_FP_SUPPORT */		/* Support for %e, %f & %g */

/*
 * This module tests the NhExtIO implementation by using it to write
 * and read data via pipes to and from a child process. This setup
 * allows us to write large packets without causing an infinite block
 * while still failing if NhExtIO attempts to read data ahead of time.
 */

#ifdef SIGPIPE
static void
sigpipe_handler(int signum)
{
    fprintf(stderr, "%s: SIGPIPE received\n", is_child ? "child" : "parent");
}
#endif

static int
child(NhExtIO *rio, NhExtIO *wio)
{
    int i, j, k, r, nb, exitcode = 1;
    unsigned char buffer[8192];
    unsigned long crc, crc1;		/* AUTODIN-II 32-bit CRC */
    nb = nhext_io_read(rio, buffer, sizeof(buffer));
    if (nb) {
	/*
	 * auto-fill is off. nb should be zero to indicate EOF.
	 * If NhExtIO returns anything else, there's something wrong.
	 * Should NhExtIO actually attempt a read it will cause an
	 * infinite block since the parent process won't write
	 * anything until it gets the start command.
	 */
	if (nb < 0)
	    perror("child: nhext_io_read(EOF)");
	else
	    fprintf(stderr,
	      "child: nhext_io_read(EOF): Expecting EOF, got %d bytes\n", nb);
	goto done;
    }
    if (nhext_io_write(wio, "Start\n", 6) != 6) {
	perror("child: write(start)");
	goto done;
    }
    if (nhext_io_flush(wio)) {
	perror("child: flush(start)");
	goto done;
    }
    if (nhext_io_filbuf(rio, TRUE) < 0) {
	perror("child: filbuf");
	goto done;
    }
    r = nhext_io_read(rio, buffer, sizeof(buffer));
    if (r <= 0) {
	if (r < 0)
	    perror("child: nhext_io_read(ACK)");
	else
	    fprintf(stderr,
	      "child: nhext_io_read(ACK): Expecting ACK, got EOF\n");
	goto done;
    }
    if (r != 4 || memcmp(buffer, "ACK\n", 4)) {
	fprintf(stderr,
	  "child: nhext_io_read(ACK): Expecting ACK, got %*.*s\n",r,r,buffer);
	goto done;
    }
    if (nhext_io_getmode(rio) != (NHEXT_IO_RDONLY | NHEXT_IO_NOAUTOFILL)) {
	fprintf(stderr,
	  "child: nhext_io_getmode: Bad mode (%d)\n", nhext_io_getmode(rio));
	goto done;
    }
    nhext_io_setmode(rio, 0);
    if (nhext_io_getmode(rio) != NHEXT_IO_RDONLY) {
	fprintf(stderr,
	  "child: nhext_io_setmode: Failed (now %d)\n", nhext_io_getmode(rio));
	goto done;
    }
    for(i = 0; i < 10000; i++) {
	if (i%100 == 0)
	    fprintf(stderr, "Packet %d\n", i);
	/* A random sized packet */
	nb = 1 + (int)(rand() * 8192.0 / (RAND_MAX + 1.0));
	/* Containing random data */
	crc = 0;
	for(j = 0; j < nb; j++) {
	    buffer[j] = (int)(rand() * 256.0 / (RAND_MAX + 1.0));
	    crc ^= buffer[j] << 24;
	    for(k = 0; k < 8; k++) {
		if (crc & 1UL << 31) {
		    crc <<= 1;
		    crc ^= 0x4C11DB7;
		} else
		    crc <<= 1;
	    }
	}
	/* Write packet to parent */
	j = 1 + (int)(rand() * (double)nb / (RAND_MAX + 1.0));
	if (nhext_io_write(wio, buffer, j) != j) {
	    perror("child: write(random)");
	    goto done;
	}
	if (j != nb) {
	    if (nhext_io_write(wio, buffer + j, nb - j) != nb - j) {
		perror("child: write(random)");
		goto done;
	    }
	}
	if (nhext_io_flush(wio)) {
	    perror("child: flush(random)");
	    goto done;
	}
	/* Read back the XORed data */
	k = 0;					/* Total read so far */
	do {
	    j = 1 + (int)(rand() * (double)(sizeof(buffer) - k) /
	      (RAND_MAX + 1.0));		/* Bytes this fragment */
	    r = nhext_io_read(rio, buffer + k, j);
	    if (r <= 0) {
		if (r < 0)
		    perror("child: nhext_io_read(random)");
		else
		    fprintf(stderr,
		      "child: nhext_io_read(random): Expecting data, got EOF\n");
		goto done;
	    }
	    k += r;
	} while (k < nb);
	if (k != nb) {
	    fprintf(stderr,
	      "child: nhext_io_read(random): Expecting %d bytes, got %d\n",
	      nb, k);
	    goto done;
	}
	/* Reverse the XOR and compute CRC */
	crc1 = 0;
	for(j = 0; j < nb; j++) {
	    buffer[j] ^= 0x8D;
	    crc1 ^= buffer[j] << 24;
	    for(k = 0; k < 8; k++) {
		if (crc1 & 1UL << 31) {
		    crc1 <<= 1;
		    crc1 ^= 0x4C11DB7;
		} else
		    crc1 <<= 1;
	    }
	}
	if (crc1 != crc) {
	    fprintf(stderr, "child: nhext_io_read(random): Bad CRC\n");
	    goto done;
	}
    }
    exitcode = 0;
    fprintf(stderr, "No errors found on child side\n");
done:
    return exitcode;
}

static int
parent(NhExtIO *rio, NhExtIO *wio)
{
    int c, nb, exitcode = 1;
    unsigned char buffer[32];
    nb = nhext_io_read(rio, buffer, sizeof(buffer));
    if (nb <= 0) {
	if (nb < 0)
	    perror("parent: nhext_io_read(start)");
	else
	    fprintf(stderr,
	      "parent: nhext_io_read(start): Expecting Start, got EOF\n");
	goto done;
    }
    if (nb != 6 || memcmp(buffer, "Start\n", 6)) {
	fprintf(stderr,
	  "parent: nhext_io_read(start): "
	  "Expecting Start\\n, got \"%*.*s\" (%d bytes)\n",
	  nb,nb,buffer,nb);
	goto done;
    }
    if (nhext_io_write(wio, "ACK\n", 4) != 4) {
	perror("parent: write(ACK)");
	goto done;
    }
    if (nhext_io_flush(wio)) {
	perror("parent: flush(ACK)");
	goto done;
    }
    if (nhext_io_getmode(rio) != NHEXT_IO_RDONLY) {
	fprintf(stderr,
	  "parent: nhext_io_getmode: Bad mode (%d)\n", nhext_io_getmode(rio));
	goto done;
    }
    nhext_io_setmode(rio, NHEXT_IO_NOAUTOFILL);
    if (nhext_io_getmode(rio) != (NHEXT_IO_RDONLY | NHEXT_IO_NOAUTOFILL)) {
	fprintf(stderr,
	  "parent: nhext_io_setmode: Failed (now %d)\n", nhext_io_getmode(rio));
	goto done;
    }
    for(;;) {
	/* Read byte from child */
	c = nhext_io_getc(rio);
	if (c < 0) {
	    if (nhext_io_flush(wio)) {
		perror("parent: flush(random)");
		goto done;
	    }
	    nb = nhext_io_filbuf(rio, TRUE);
	    if (nb < 0) {
		perror("parent: filbuf");
		goto done;
	    } else if (!nb)
		break;		/* EOF */
	    c = nhext_io_getc(rio);
	    if (c < 0) {
		perror("parent: getc(random)");
		goto done;
	    }
	}
	/* XOR it */
	c ^= 0x8D;
	/* Write it back to child */
	if (nhext_io_fputc(c, wio) < 0) {
	    perror("parent: fputc(random)");
	    goto done;
	}
    }
    exitcode = 0;
    fprintf(stderr, "No errors found on parent side\n");
done:
    return exitcode;
}

int fd_write(void *handle, void *buf, unsigned int len)
{
    int retval;
    retval = write((int)handle, buf, len);
    return retval >= 0 ? retval : -1;
}

test_printf()
{
    NhExtIO *wr;
    wr = nhext_io_open(fd_write, (void *)1, NHEXT_IO_WRONLY);
#ifdef PRINTF_FP_SUPPORT
    printf("Test of %%f output\n"
           "-----------------\n");
    printf("printf:\n");
    printf(">%-8.4lf<\n", 3.1415926);
    printf(">%8.4lf<\n", -3.1415926);
    printf(">%8.4lf<\n", 31415926.0);
    printf(">%8.4lf<\n", 0.00031415926);
    printf(">%8.4lf<\n", 0.000031415926);
    nhext_io_printf(wr, "nhext_io_printf:\n");
    nhext_io_printf(wr, ">%-8.4lf<\n", 3.1415926);
    nhext_io_printf(wr, ">%8.4lf<\n", -3.1415926);
    nhext_io_printf(wr, ">%8.4lf<\n", 31415926.0);
    nhext_io_printf(wr, ">%8.4lf<\n", 0.00031415926);
    nhext_io_printf(wr, ">%8.4lf<\n", 0.000031415926);
    nhext_io_flush(wr);
    printf("\nTest of %%e output\n"
           "-----------------\n");
    printf("printf:\n");
    printf(">%-8.4le<\n", 3.1415926);
    printf(">%8.4le<\n", -3.1415926);
    printf(">%8.4le<\n", 31415926.0);
    printf(">%8.4le<\n", 0.00031415926);
    printf(">%8.4le<\n", 0.000031415926);
    nhext_io_printf(wr, "nhext_io_printf:\n");
    nhext_io_printf(wr, ">%-8.4le<\n", 3.1415926);
    nhext_io_printf(wr, ">%8.4le<\n", -3.1415926);
    nhext_io_printf(wr, ">%8.4le<\n", 31415926.0);
    nhext_io_printf(wr, ">%8.4le<\n", 0.00031415926);
    nhext_io_printf(wr, ">%8.4le<\n", 0.000031415926);
    nhext_io_flush(wr);
    printf("\nTest of %%g output\n"
           "-----------------\n");
    printf("printf:\n");
    printf(">%-8.4lg<\n", 3.1415926);
    printf(">%8.4lg<\n", -3.1415926);
    printf(">%8.4lg<\n", 31415926.0);
    printf(">%8.4lg<\n", 0.00031415926);
    printf(">%8.4lg<\n", 0.000031415926);
    nhext_io_printf(wr, "nhext_io_printf:\n");
    nhext_io_printf(wr, ">%-8.4lg<\n", 3.1415926);
    nhext_io_printf(wr, ">%8.4lg<\n", -3.1415926);
    nhext_io_printf(wr, ">%8.4lg<\n", 31415926.0);
    nhext_io_printf(wr, ">%8.4lg<\n", 0.00031415926);
    nhext_io_printf(wr, ">%8.4lg<\n", 0.000031415926);
    nhext_io_flush(wr);
#endif
    printf("\nTest of %%d output\n"
           "-----------------\n");
    printf("printf:\n");
    printf(">%-8d<\n", 314159);
    printf(">%8d<\n", -314159);
    printf(">%08d<\n", 314159);
    printf(">%-08d<\n", 314159);
    printf(">%+08d<\n", 314159);
    nhext_io_printf(wr, "nhext_io_printf:\n");
    nhext_io_printf(wr, ">%-8d<\n", 314159);
    nhext_io_printf(wr, ">%8d<\n", -314159);
    nhext_io_printf(wr, ">%08d<\n", 314159);
    nhext_io_printf(wr, ">%-08d<\n", 314159);
    nhext_io_printf(wr, ">%+08d<\n", 314159);
    nhext_io_flush(wr);
    printf("\nTest of %%lu output\n"
           "-----------------\n");
    printf("printf:\n");
    printf(">%-8lu<\n", 314159UL);
    printf(">%8lu<\n", 314159UL);
    printf(">%08lu<\n", 314159UL);
    printf(">%-08lu<\n", 314159UL);
    printf(">%+08lu<\n", 314159UL);
    nhext_io_printf(wr, "nhext_io_printf:\n");
    nhext_io_printf(wr, ">%-8lu<\n", 314159UL);
    nhext_io_printf(wr, ">%8lu<\n", 314159UL);
    nhext_io_printf(wr, ">%08lu<\n", 314159UL);
    nhext_io_printf(wr, ">%-08lu<\n", 314159UL);
    nhext_io_printf(wr, ">%+08lu<\n", 314159UL);
    nhext_io_flush(wr);
    printf("\nTest of %%x output\n"
           "-----------------\n");
    printf("printf:\n");
    printf(">%-8x<\n", 314159U);
    printf(">%8X<\n", 314159U);
    printf(">%08x<\n", 314159U);
    printf(">%#-08X<\n", 314159U);
    printf(">%#08x<\n", 314159U);
    nhext_io_printf(wr, "nhext_io_printf:\n");
    nhext_io_printf(wr, ">%-8x<\n", 314159U);
    nhext_io_printf(wr, ">%8X<\n", 314159U);
    nhext_io_printf(wr, ">%08x<\n", 314159U);
    nhext_io_printf(wr, ">%#-08X<\n", 314159U);
    nhext_io_printf(wr, ">%#08x<\n", 314159U);
    nhext_io_flush(wr);
    printf("\nTest of %%p output\n"
           "-----------------\n");
    printf("printf:\n");
    printf(">%-9p<\n", wr);
    printf(">%9P<\n", wr);
    printf(">%09p<\n", wr);
    printf(">%#-09P<\n", wr);
    printf(">%#09p<\n", wr);
    nhext_io_printf(wr, "nhext_io_printf:\n");
    nhext_io_printf(wr, ">%-9p<\n", wr);
    nhext_io_printf(wr, ">%9P<\n", wr);
    nhext_io_printf(wr, ">%09p<\n", wr);
    nhext_io_printf(wr, ">%#-09P<\n", wr);
    nhext_io_printf(wr, ">%#09p<\n", wr);
    nhext_io_flush(wr);
    printf("\nTest of %%s output\n"
           "-----------------\n");
    printf("printf:\n");
    printf(">%*s<\n", -9, "Hello");
    printf(">%9s<\n", "Hello");
    printf(">%09s<\n", "Hello");
    printf(">%-*s<\n", 9, "Hello");
    printf(">%9.*s<\n", 4, "Hello");
    printf(">%s<\n", (char *)0);
    nhext_io_printf(wr, "nhext_io_printf:\n");
    nhext_io_printf(wr, ">%*s<\n", -9, "Hello");
    nhext_io_printf(wr, ">%9s<\n", "Hello");
    nhext_io_printf(wr, ">%09s<\n", "Hello");
    nhext_io_printf(wr, ">%-*s<\n", 9, "Hello");
    nhext_io_printf(wr, ">%9.*s<\n", 4, "Hello");
    nhext_io_printf(wr, ">%s<\n", (char *)0);
    nhext_io_flush(wr);
    nhext_io_close(wr);
}

int
main(argc, argv)
int argc;
char **argv;
{
    int retval = 0;
    NhExtIO *rd, *wr;
#ifdef SIGPIPE
    signal(SIGPIPE, sigpipe_handler);
#endif
    if (argc > 1 && !strcmp(argv[1], "-c")) {
	is_child++;
	rd = nhext_io_open(parent_read, get_parent_readh(),
	  NHEXT_IO_RDONLY | NHEXT_IO_NOAUTOFILL);
	wr = nhext_io_open(parent_write, get_parent_writeh(), NHEXT_IO_WRONLY);
	if (!rd || !wr) {
	    fprintf(stderr, "C Failed to open I/O streams.\n");
	    exit(1);
	}
	retval = child(rd, wr);
	nhext_io_close(rd);
	nhext_io_close(wr);
	exit(retval);
    }
    if (!child_start(argv[0])) {
	fprintf(stderr, "Failed to start child.\n");
	exit(1);
    }
    rd = nhext_io_open(child_read, get_child_readh(), NHEXT_IO_RDONLY);
    wr = nhext_io_open(child_write, get_child_writeh(), NHEXT_IO_WRONLY);
    if (!rd || !wr) {
	fprintf(stderr, "Failed to open I/O streams.\n");
	exit(1);
    }
    retval = parent(rd, wr);
    nhext_io_close(rd);
    nhext_io_close(wr);
    test_printf();
    exit(retval);
}
slashem-0.0.7E7F3/win/proxy/nhextxdr.c0000664000076400007640000001455110545462317015650 0ustar  aliali/* $Id: nhextxdr.c,v 1.7 2003/10/25 18:06:01 j_ali Exp $ */
/* Copyright (c) Slash'EM Development Team 2001-2003 */
/* NetHack may be freely redistributed.  See license for details. */

#include 
#include 
#include "nhxdr.h"

/*
 * This module implements the NhExt version of XDR according to RFC 1014.
 * It is backwards compatible with the code produced by rpcgen, and can
 * be replaced by that for testing purposes on systems which support it.
 * NetHack uses the extra facilities implemented here and is not therefore
 * itself compatible with rpcgen.
 * Rpcgen is included in the freely available RPCSRC 4.0 from Sun
 * Microsystems, which can be downloaded in 17 shar files from
 * ftp://bcm.tmc.edu/nfs/
 */

/*
 * Note: Although this routine is called _long and takes a pointer to a
 * long datum, it always reads and writes 32-bit values, regardless of
 * the size of the long type. This might cause problems on a platform
 * where long is smaller than 32 bits (but then NetHack doesn't support
 * such platforms anyway). On platforms with longs larger than 32 bits,
 * NetHack only needs the least significant 32 bits, and this function
 * will correctly encode and decode this quantity.
 */

nhext_xdr_bool_t
nhext_xdr_long(xdrs, datum)
NhExtXdr *xdrs;
long *datum;
{
    int retval = TRUE;
    unsigned char buf[4];
    if (xdrs->x_op == NHEXT_XDR_ENCODE) {
	buf[0] = *datum >> 24 & 0xff;
	buf[1] = *datum >> 16 & 0xff;
	buf[2] = *datum >> 8 & 0xff;
	buf[3] = *datum & 0xff;
	retval = xdrs->x_write(xdrs, buf, 4);
    } else if (xdrs->x_op == NHEXT_XDR_DECODE) {
	retval = xdrs->x_read(xdrs, buf, 4);
	*datum =
	  (long)buf[0] << 24 | (long)buf[1] << 16 | (long)buf[2] << 8 | buf[3];
    } else if (xdrs->x_op == NHEXT_XDR_COUNT)
	xdrs->x_pos += 4;
    return retval;
}

nhext_xdr_bool_t
nhext_xdr_u_long(xdrs, datum)
NhExtXdr *xdrs;
unsigned long *datum;
{
    int retval;
    long l;
    l = *datum;
    retval = nhext_xdr_long(xdrs, &l);
    *datum = (unsigned long)l;
    return retval;
}

nhext_xdr_bool_t
nhext_xdr_short(xdrs, datum)
NhExtXdr *xdrs;
short *datum;
{
    int retval;
    long l;
    l = *datum;
    retval = nhext_xdr_long(xdrs, &l);
    *datum = (short)l;
    return retval;
}

nhext_xdr_bool_t
nhext_xdr_u_short(xdrs, datum)
NhExtXdr *xdrs;
unsigned short *datum;
{
    int retval;
    long l;
    l = *datum;
    retval = nhext_xdr_long(xdrs, &l);
    *datum = (unsigned short)l;
    return retval;
}

nhext_xdr_bool_t
nhext_xdr_int(xdrs, datum)
NhExtXdr *xdrs;
int *datum;
{
    int retval;
    long l;
    l = *datum;
    retval = nhext_xdr_long(xdrs, &l);
    *datum = (int)l;
    return retval;
}

nhext_xdr_bool_t
nhext_xdr_u_int(xdrs, datum)
NhExtXdr *xdrs;
unsigned int *datum;
{
    int retval;
    long l;
    l = *datum;
    retval = nhext_xdr_long(xdrs, &l);
    *datum = (unsigned int)l;
    return retval;
}

nhext_xdr_bool_t
nhext_xdr_char(xdrs, datum)
NhExtXdr *xdrs;
char *datum;
{
    int retval;
    long l;
    l = *datum;
    retval = nhext_xdr_long(xdrs, &l);
    *datum = (char)l;
    return retval;
}

nhext_xdr_bool_t
nhext_xdr_u_char(xdrs, datum)
NhExtXdr *xdrs;
unsigned char *datum;
{
    int retval;
    long l;
    l = *datum;
    retval = nhext_xdr_long(xdrs, &l);
    *datum = (unsigned char)l;
    return retval;
}

nhext_xdr_bool_t
nhext_xdr_enum(xdrs, datum)
NhExtXdr *xdrs;
int *datum;
{
    int retval;
    long l;
    l = *datum;
    retval = nhext_xdr_long(xdrs, &l);
    *datum = (int)l;
    return retval;
}

nhext_xdr_bool_t
nhext_xdr_bool(xdrs, datum)
NhExtXdr *xdrs;
nhext_xdr_bool_t *datum;
{
    int retval;
    long l;
    l = !!*datum;
    retval = nhext_xdr_long(xdrs, &l);
    *datum = (nhext_xdr_bool_t)l;
    return retval;
}

/*
 * A common routine for nhext_xdr_string() and nhext_xdr_bytes()
 */

static nhext_xdr_bool_t
nhext_xdr_bytestring(xdrs, datum, len, maxlen, ext)
NhExtXdr *xdrs;
char **datum;
unsigned int *len;
unsigned int maxlen, ext;
{
    int retval;
    long zero = 0;
    if (xdrs->x_op == NHEXT_XDR_ENCODE) {
	if (*len > maxlen)
	    return FALSE;
	retval = nhext_xdr_u_int(xdrs, len);
	retval &= xdrs->x_write(xdrs, *datum, *len);
	if (*len & 3)
	    retval &= xdrs->x_write(xdrs, &zero, 4 - (*len & 3));
    } else if (xdrs->x_op == NHEXT_XDR_DECODE) {
	retval = nhext_xdr_u_int(xdrs, len);
	if (retval) {
	    if (*len > maxlen)
		return FALSE;
	    if (!*datum) {
		*datum = malloc(MAX(NHEXT_XDR_RNDUP(*len), *len + ext));
		if (!*datum)
		    return FALSE;
	    }
	    retval &= xdrs->x_read(xdrs, *datum, NHEXT_XDR_RNDUP(*len));
	}
    } else if (xdrs->x_op == NHEXT_XDR_FREE) {
	free(*datum);
	*datum = NULL;
	retval = TRUE;
    } else if (xdrs->x_op == NHEXT_XDR_COUNT) {
	xdrs->x_pos += 4 + NHEXT_XDR_RNDUP(*len);
	retval = TRUE;
    }
    return retval;
}

nhext_xdr_bool_t
nhext_xdr_string(xdrs, datum, maxsize)
NhExtXdr *xdrs;
char **datum;
unsigned int maxsize;
{
    int retval;
    unsigned int slen;
    if (xdrs->x_op == NHEXT_XDR_ENCODE || xdrs->x_op == NHEXT_XDR_COUNT)
	slen = strlen(*datum);
    retval = nhext_xdr_bytestring(xdrs, datum, &slen, maxsize, 1);
    if (retval && xdrs->x_op == NHEXT_XDR_DECODE)
	(*datum)[slen] = '\0';
    return retval;
}

nhext_xdr_bool_t
nhext_xdr_bytes(xdrs, datum, len, maxlen)
NhExtXdr *xdrs;
char **datum;
unsigned int *len;
unsigned int maxlen;
{
    return nhext_xdr_bytestring(xdrs, datum, len, maxlen, 0);
}

nhext_xdr_bool_t
nhext_xdr_wrapstring(xdrs, datum)
NhExtXdr *xdrs;
char **datum;
{
    return nhext_xdr_string(xdrs, datum, (unsigned int)-1);
}

nhext_xdr_bool_t
nhext_xdr_vector(xdrs, addr, len, size, codec)
NhExtXdr *xdrs;
char *addr;
unsigned int len;
unsigned int size;
nhext_xdr_bool_t (*codec)(NhExtXdr *, void *);
{
    for(; len > 0; len--) {
	if (!(*codec)(xdrs, addr))
	    return FALSE;
	addr += size;
    }
    return TRUE;
}

nhext_xdr_bool_t
nhext_xdr_array(xdrs, addr, len, maxlen, size, codec)
NhExtXdr *xdrs;
char **addr;
unsigned int *len;
unsigned int maxlen;
unsigned int size;
nhext_xdr_bool_t (*codec)(NhExtXdr *, void *);
{
    int retval;
    long slen;
    if (!nhext_xdr_u_int(xdrs, len))
	return FALSE;
    slen = *len;
    if (xdrs->x_op != NHEXT_XDR_FREE && slen > maxlen)
	return FALSE;
    if (xdrs->x_op == NHEXT_XDR_DECODE && !*addr && slen) {
	*addr = calloc(slen, size);
	if (!*addr)
	    return FALSE;
    }
    retval = nhext_xdr_vector(xdrs, *addr, slen, size, codec);
    if (xdrs->x_op == NHEXT_XDR_FREE) {
	free(*addr);
	*addr = NULL;
    }
    return retval;
}
slashem-0.0.7E7F3/win/proxy/ext_protocol.html0000664000076400007640000015606510545462317017256 0ustar  aliali



   NhExt: A protocol for NetHack plug-in window ports


NhExt: A protocol for NetHack plug-in window ports

This document describes NhExt 1.0.2, a protocol to be used when NetHack calls a function located inside a plug-in window port and for when that window port function in turn calls a function located inside NetHack (a call back). The protocol specifies no limit to the depth of recursion which may occur.

NhExt requires a two-way, single duplex, connection between the game and the window-port. How that connection is set up is outside the scope of the protocol.

NhExt has provision for more than one sub-protocol, to allow for future backwards compatibility. Initially, both the game and the window port should be in sub-protocol 0. Sub-protocols 0 and 1 must be supported by games; sub-protocol 2 is optional (this is to maintain compatibility with NhExt 1.0).

Sub-protocol 0

Sub-protocol 0 is line based. Each line consists of a series of characters terminated with one end-of-line character. The game will always use the ASCII NL character (code 0x0A) for this, but it will accept either ASCII NL or CR (codes 0x0A and 0x0D) - but not both.

The game will always start by writing a line consisting of the five characters "NhExt" which will be followed by a number of tags and values.

Tags are sequences of up to 64 alpha-numeric characters, plus "_".

Values are sequences of up to 64 printable ASCII characters (space to "~"), enclosed in double quote marks. Characters may be escaped with backslash. If every character was escaped, and including the two enclosing quotes, a 64 character sequence could take 130 bytes to transmit.

Tags need not be in any order within the line.

Tags and values are seperated from each other (and from the "NhExt" command) by one space character.

The following tags will always be present:

  • standard. The NhExt standard to which the game complies. NhExt standards are always of the form major.minor where major and minor are non-negative decimal numbers. Micro revisions (eg., 1.0.1) are fully compatible with each other and are therefore not important. Games complying to a later standard will be compatible with window ports complying with an earlier standard in the same series (having the same major number). Window ports should refuse to connect to a game with a major number greater than the standard to which they comply; they should connect with full functionality to a game with the same major number and with a minor number no lower than the standard to which they comply. Window ports may connect to games complying to earlier revisions of the standard if they are able to modify their functionality to comply with the earlier standard.
  • game. This value can be used to distinguish vanilla NetHack (which uses the value "NetHack") from its variants (eg., Slash'EM uses the value "SlashEM").
  • version. This is the value of VERSION_STRING.
  • protocols. This is a comma seperated list of protocols that this game supports. There should be no whitespace in the list. Sub-protocol zero is not listed.

The following tag may also be present:

  • authmethods. This is a comma seperated list of authentication methods that this game allows. There should be no whitespace in the list. If this tag is not present, its value should be taken as "0".

Window ports should ignore tags they do not recognize.

Example:

NhExt standard "1.0" game "NetHack" version "3.3.2" protocols "1" junk "foo \" bar"

The window-port should reply with either an error or an acknowledgment response.

An error response consists of the five characters "Error" followed by a "mesg" tag and a value. As a special case, this value may be up to 200 characters in length.

Example:

Error mesg "X11: Can't open display (Permission denied)"

There may also be other tags present, which will be ignored.

The game will respond to an error response by displaying the error message to the user and then terminating.

An acknowledgment response consists of the three characters "Ack" followed by a number of tags and values.

The following tags must always be present:

  • windowtype. The name of the window-port.
  • protocol. The sub-protocol to use.

The following tags may be present:

  • authmethod. The authentication method used. If this tag is not present, its value should be taken as "0".
  • username. The user name for authentication.
  • password. The password for authentication.

The game will ignore tags it does not recognize.

Example:

Ack windowtype "Gtk" protocol "1"
On receipt of an acknowledgment response, the game will immediately start the requested sub-protocol. The window-port should enter listening mode.

Authentication

There is currently just one method of authentication defined (in addition to method 0). This is a simple password authenticaion scheme which transmits the password in clear text. A future version of this standard may define a more secure authentication method, perhaps along the same lines as RFC 2195.

Game servers that wish to take advantage of authentication should declare that they allow authentication by method 1 and optionally also via method 0 if they wish to allow non-authenticated users. On receipt of an acknowledgment response, the game should check that the authenticaion method employed is allowed and, in the case of method 1, that the user name and password are acceptable. The game should then remember whether the remote interface is authenticated or not. Note that a compliant game may not refuse to enter the requested sub-protocol even if authentication fails.

If authentication fails then the game should issue an error and exit after the error is displayed and acknowledged by the user (eg., by using display_nhwindow with blocking set to TRUE). Games may fail all callbacks received during this period (while still sending replies where required).

Example:

NhExt standard "1.0" game "SlashEM" version "0.0.7E6F2" protocols "1,2" authmethods "1"
Ack windowtype "Gtk" protocol "2" authmethod "1" username "fred" password "secret"

Sub-protocol 1

This sub-protocol is heavily based on Sun Microsystem's XDR protocol, documented in RFC 1014. In addition, I use their XDR language to describe the structure of request and reply encodings. It should be possible to use their rpcgen program (supplied with Solaris) to generate routines to encode and decode data compatible with sub-protocol 1. There is, however, no need to use rpcgen.

I have also plagiarised window.doc mercilessly.

Sub-protocol 1 is fully synchronous. That is, at any time either the game is waiting for input and the window-port is either writing data or is not yet ready to write data, or the reverse is true.

Window Types and Terminology

There are 5 basic window types, used to call create_nhwindow:

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)

The tty window-port also uses NHW_BASE (the base display) internally.

NHW_MENU windows can be used for either menu or text display. Their basic feature is that for the tty-port, if the window is small enough, it appears in the corner of the tty display instead of overwriting the whole screen. The first call to add information to the window will decide if it is going to be used to display a menu or text. If start_menu() is called, then it will be used as a menu. If putstr() is called, it will be used as text. Once decided, there is no turning back. For the tty-port, if the data is too large for a single screen then the data is paged (with --more--) between pages. Only NHW_MENU type windows can be used for menus.

NHW_TEXT windows are used to display a large amount of textual data. This is the type of window one would use for displaying a help file, for example. In the tty window-port, windows of type NHW_TEXT can page using the DEF_PAGER, if DEF_PAGER is defined. There exists an assumption that the font for text windows is monospaced. The help files are all formatted accordingly.

"window" is always of type int. The proxy module will convert to and from winids if it ever needs to. There are a few fixed window names that are known throughout the code:

WIN_MESSAGE (top line)
WIN_STATUS (bottom lines)
WIN_MAP (main dungeon)
WIN_INVEN (inventory)

Other windows are created and destroyed as needed.

"Port" in this document refers to a CPU/OS/hardware platform (UNIX, MSDOS TOS, etc.) "window-port" refers to the windowing platform. This is orthogonal (e.g. UNIX might use either a tty window-port or an X11 window-port).

Standard window port procedures

These procedures must be supported by all plug-in window ports (although for many procedures they need not actually do anything). Depending on the setting of the configuration variables, the game may never call some of these. Such configuration variables have no effect on the values of the IDs.

ProcedureID
init0x01
init_nhwindows0x02
player_selection0x03
askname0x04
get_nh_event0x05
exit_nhwindows0x06
suspend_nhwindows0x07
resume_nhwindows0x08
create_nhwindow0x09
clear_nhwindow0x0A
display_nhwindow0x0B
destroy_nhwindow0x0C
curs0x0D
putstr0x0E
display_file0x0F
start_menu0x10
add_menu0x11
end_menu0x12
select_menu0x13
message_menu0x14
update_inventory0x15
mark_sync0x16
wait_sync0x17
cliparound0x18
update_positionbar0x19
print_glyph0x1A
raw_print0x1B
raw_print_bold0x1C
nhgetch0x1D
nh_poskey0x1E
nhbell0x1F
doprev_message0x20
yn_function0x21
getlin0x22
get_ext_cmd0x23
number_pad0x24
delay_output0x25
change_color0x26
change_background0x27
set_font_name0x28
get_color_string0x29
start_screen0x2A
end_screen0x2B
outrip0x2C
preference_update0x2D
status0x2E
print_glyph_layered0x2F
send_config_file0x30

Plug-in window ports may define non-standard procedures with IDs of 0x8000 and above. In response to all other IDs, the window port should return a reply packet with no results.

The proxy module will initiate a procedure by writing an unsigned integer (according to RFC1014) whose value is as follows:

	value = (ID << 16) | (length >> 2);
where length is the length of the following data (not including value) in bytes. It will then write the relevant request structure (if a procedure takes no arguments then length will be zero and no request structure will be written).

The proxy module will then read back an unsigned integer from the plug-in window-port and decode it as follows:

	ID = value >> 16;
	length = (value & 0xffff) << 2;
If ID is non-zero, this is a callback.

If ID is zero, this is a reply to the active procedure. The proxy module will read that many bytes from the plug-in window-port and process the reply.

init

init takes no arguments and returns no results.

This procedure will be called once before all other procedures.

init_nhwindows

typedef string argument<>;
typedef string wincap<>;

struct init_nhwindows_req {
	argument argv<>;
};

struct init_nhwindows_res {
	bool inited;
	argument argv<>;
	wincap capabilities<>;
};

  • 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, argv should be changed to remove those arguments and returned.
  • When the message window is created, inited needs to be returned as TRUE. Otherwise all plines() will be done via raw_print.
  • ALI: Would a window-port ever want to leave iflags.window_inited FALSE?
  • The capabilities list should be filled in with the relevant values. The proxy module will ignore capabilities that it does not recognize. The following capabilities are currently understood:
    • align_message
    • align_status
    • ascii_map
    • color
    • eight_bit_tty
    • font_map
    • font_menu
    • font_message
    • font_size_map
    • font_size_menu
    • font_size_message
    • font_size_status
    • font_size_text
    • font_status
    • font_text
    • hilite_pet
    • map_mode
    • mouse_support
    • perm_invent
    • player_selection
    • popup_dialog
    • preload_tiles
    • scroll_amount
    • scroll_margin
    • splash_screen
    • tiled_map
    • tile_file
    • tile_height
    • tile_width
    • use_inverse
    • var_msgcount
    • windowcolors

player_selection

struct player_selection_req {
	int initrole;
	int initrace;
	int initgend;
	int initalign;
};

struct player_selection_res {
	int role;
	int race;
	int gend;
	int align;
	bool quit;
};

Do a window-port specific player type selection. If player_selection offers a Quit option, it should return TRUE in quit if this is selected.

askname

askname takes no arguments.
struct askname_res {
	string plname<>;
};

Ask the user for a player name and return it.

get_nh_event

get_nh_event takes no arguments and returns no results.

Does window event processing (e.g. exposure events). A noop for the tty and X window-ports.

exit_nhwindows

struct exit_nhwindows_req {
	string str<>;
};
exit_nhwindows returns no results.

Exits the window system. This should dismiss all windows, except the "window" used for raw_print(). str is printed if possible.

suspend_nhwindows

struct suspend_nhwindows_req {
	string str<>;
};
suspend_nhwindows returns no results.

Prepare the windows to be suspended.

resume_nhwindows

resume_nhwindows takes no arguments and returns no results.

Restore the windows after being suspended.

create_nhwindow

enum nhwindow_type {
    NHW_MESSAGE = 1,		/* (top line) */
    NHW_STATUS = 2,		/* (bottom lines) */
    NHW_MAP = 3,		/* (main dungeon) */
    NHW_MENU = 4,		/* (inventory or other "corner" windows) */
    NHW_TEXT = 5		/* (help/text, full screen paged window) */
};

struct create_nhwindow_req {
    enum nhwindow_type type;
};

struct create_nhwindow_res {
    int window;
};

Create a window of type type.

clear_nhwindow

struct clear_nhwindow_req {
    int window;
    int rows;
    int cols;
    int layers;
};
clear_nhwindow returns no results.

Clear the given window, when appropriate.

For windows of type NHW_MAP, the rows, cols and layers fields specify the number of rows, columns and layers to be used for this window from now until the next call to clear the window. Windowing interfaces which choose not to use layered glyphs may ignore this value.

display_nhwindow

struct display_nhwindow_req {
    int window;
    bool blocking;
};
display_nhwindow returns no results.

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.

destroy_nhwindow

struct destroy_nhwindow_req {
    int window;
};
destroy_nhwindow returns no results.

Destroy will dismiss the window if the window has not already been dismissed.

curs

struct curs_req {
    int window;
    int x;
    int y;
};
curs returns no results.

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.

For variable sized windows, like the status window, the behavior when curs is called outside the window's limits is unspecified. The mac port wraps to 0, with the status window being 2 lines high and 80 columns wide.

Still used by curs_on_u(), status updates, screen locating (identify, teleport).

NHW_MESSAGE, NHW_MENU and NHW_TEXT windows do not currently support curs in the tty window-port.

putstr

enum nhwindow_atr {
    ATR_NONE = 0,
    ATR_BOLD = 1,
    ATR_DIM = 2,
    ATR_ULINE = 4,
    ATR_BLINK = 5,
    ATR_INVERSE = 7
};

struct putstr_req {
    int window;
    enum nhwindow_atr attr;
    string str<>;
};
putstr returns no results.

Print str on the window with the given attribute. Only printable ASCII characters (040-0126) must be supported. Multiple putstrs 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 putstrs 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.

display_file

struct display_file_req {
    int fh;
};
display_file returns no results.

Display the file whose handle is fh.

The proxy module is responsible for opening the file to be displayed as if the dlbh_fopen callback had been called. The window-port should read the data from the file using the dlbh_fgets callback (passing it fh as the handle). When the display_file procedure returns, the proxy module will close the file again.

The proxy module is responsible for complaining (via pline) if the file cannot be opened (in which case this procedure will not be initiated).

start_menu

struct start_menu_req {
    int window;
};
start_menu returns no results.

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.

add_menu

struct add_menu_req {
    int window;
    int glyph;
    int identifier;
    int accelerator;
    int groupacc;
    int attr;
    string str<>;
    bool preselected;
};
add_menu returns no results.

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 -1 (converted from NO_GLYPH by the proxy module).

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.

The proxy module is responsible for converting the game's anything identifiers into integers (and back again in select_menu).

end_menu

struct end_menu_req {
    int window;
    string prompt<>;
};
end_menu returns no results.

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 an empty string, 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

select_menu

enum menu_pick {
    PICK_NONE = 0,  /* user picks nothing (display only) */
    PICK_ONE = 1,   /* only pick one */
    PICK_ANY = 2    /* can pick any amount */
};

struct select_menu_req {
    int window;
    enum menu_pick how;
};

struct select_menu_res_item {
    int item;       /* identifier */
    long count;     /* count */
};

struct select_menu_res {
    int retval;
    select_menu_res_item selected<>;
};

Set retval to 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 array of select_menu_res_item structures, one for each selected line. 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 empty. how is the mode of the menu. Three valid values are PICK_NONE, PICK_ONE, and PICK_ANY, meaning: nothing is selectable, only one thing is selectable, and any number valid items may selected. If how is PICK_NONE, retval should never be set to 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.

The proxy module is responsible for converting the integer identifiers back to the original anything value.

message_menu

struct message_menu_req {
    int let;
    int how;
    string mesg<>;
};

struct message_menu_res {
    int retval;
};

tty-specific hack to allow single line context-sensitive help to behave compatibly with multi-line help menus.

This should only be called when a prompt is active; it sends mesg to the message window. For tty, it forces a --More-- prompt and enables let as a viable keystroke for dismissing that prompt, so that the original prompt can be answered from the message line "help menu".

retval is either let, 0 (no selection was made), or 27 (explicit cancellation was requested).

Interfaces which issue prompts and messages to separate windows typically won't need this functionality, and should set retval to -1 (in which case the proxy module will arrange for the message to be output via pline() instead).

ALI: What does how do?

update_inventory

update_inventory takes no arguments and returns no results.

Indicate to the window port that the inventory has been changed.

Merely calls the display_inventory callback for window-ports that leave the window up, otherwise does nothing.

mark_sync

mark_sync takes no arguments and returns no results.

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

wait_sync

wait_sync takes no arguments and returns no results.

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.

cliparound

struct cliparounf_req {
    int x;
    int y;
};
cliparound returns no values.

Make sure that the user is more-or-less centered on the screen if the playing area is larger than the screen.

update_positionbar

struct update_positionbar_req {
    string features<>;
};
update_positionbar returns no values.

Provide some additional information for use in a horizontal position bar (most useful on clipped displays). features is a series of char pairs. The first char in the pair is a symbol and the second char is the column where it is currently located. A '<' is used to mark an upstairs, a '>' for a downstairs, and an '@' for the current player location.

print_glyph

struct print_glyph_req {
    int window;
    int x;
    int y;
    int glyph;
};
print_glyph returns no values.

Print 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).

raw_print

struct raw_print_req {
    string str<>;
};
raw_print returns no values.

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").

raw_print_bold

struct raw_print_bold_req {
    string str<>;
};
raw_print_bold returns no values.

Like raw_print, but prints in bold/standout (if possible).

nhgetch

nhgetch takes no arguments.

struct nhgetch_res {
    int ch;
};

Sets ch to 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. The character returned must be non-zero.

nh_poskey

nh_poskey takes no arguments.

enum mouse_click {
    CLICK_1 = 1,	/* mouse click type 1 */
    CLICK_2 = 2		/* mouse click type 2 */
};

struct nh_poskey_res {
    int retval;
    int x;
    int y;
    enum mouse_click mod;
};

Returns a single character input from the user or a positioning event (perhaps from a mouse). If retval is non-zero, a character was typed, else, a position in the MAP window is returned in x, y and mod.

The different click types can map to whatever the hardware supports. If no mouse is supported, this routine always sets retval to a non-zero character.

nhbell

nhbell takes no arguments and returns no values.

Beep at user. [This will exist at least until sounds are redone, since sounds aren't attributable to windows anyway.]

doprev_message

doprev_message takes no arguments.

struct doprev_message_res {
    int retval;
};

Display previous messages. Used by the ^P command.

On the tty-port this scrolls WIN_MESSAGE back one line.

ALI: What purpose does retval serve?

yn_function

struct yn_function_req {
    string ques<>;
    string choices<>;
    int default_response;
};

struct yn_function_res {
    int retval;
    int count;
};

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 empty, 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 count and set retval to '#'.

This uses the top line in the tty window-port, other ports might use a popup.

getlin

struct getlin_req {
    string ques<>;
};

struct getlin_res {
    string input<>;
};

Prints ques as a prompt and reads a single line of text, up to a newline. The string entered is returned in input without the newline. ESC is used to cancel, in which case the string "\033" is returned.

getlin must call the flush_screen callback with cursor_on_u set to TRUE before doing anything.

This uses the top line in the tty window-port, other ports might use a popup.

get_ext_cmd

get_ext_cmd takes no arguments.

struct get_ext_cmd_res {
    int extcmd;
};

Get an extended command in a window-port specific way. An index into the extended command list (readable with the get_extended_commands callback) is returned on a successful selection, -1 otherwise.

number_pad

enum number_pad_mode {
    NP_KEYPAD = -1,		/* activate keypad mode (escape sequences) */
    NP_NUMERIC = 1		/* activate numeric mode for keypad (digits) */
};

struct number_pad_req {
    enum number_pad_mode state;
};
number_pad returns no values.

Initialize the number pad to the given state.

delay_output

delay_output takes no arguments and returns no values.

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.

change_color

struct change_color_req {
    int color;
    int rgb;
    bool reverse;
};
change_color returns no values.

change_background

struct change_background_req {
    bool white_or_black;
};
change_background returns no values.

set_font_name

struct set_font_name_req {
    int window;
    string font<>;
};

struct set_font_name_res {
    int retval;
};

get_color_string

get_color_string takes no arguments.

struct get_color_string_res {
    string retval<>;
};

start_screen

start_screen takes no arguments and returns no values.

Only used on Unix tty ports. Sets up the tty to work in full-screen graphics mode. Look at win/tty/termcap.c for an example.

end_screen

end_screen takes no arguments and returns no values.

Only used on Unix tty ports. The complement of start_screen().

outrip

struct outrip_req {
    int window;
    string killed_by_prefix<>;
};

struct outrip_res {
    bool handled;
};

The tombstone code. If you want the traditional code set handled to FALSE (the proxy module will then call genl_outrip).

ALI: I suspect we should pass rather more information to this procedure; genl_outrip() uses a lot of global variables.

preference_update

struct preference_update_req {
    string pref<>;
    string value<>;
};

Notify the window client that the value of option pref has changed to value. The set of options of which the window client will be notified is determined by the window capabilities, set in the init_nhwindows procedure.

status

typedef string value<>;

struct proxy_status_req {
    int reconfig;
    value values<>;
};

print_glyph_layered

struct glyph_row {
    int start;
    int glyphs<>;
};

struct glyph_layer {
    int start;
    struct glyph_row rows<>;
};

struct print_glyph_layered_req {
    int window;
    struct glyph_layer layers<>;
};
print_glyph_layered returns no values.

Place glyphs at the relevant places on the given window. All layers are included in the call, even if there have been no changes to the glyphs in that layer. In contrast, only a subset of the rows and the glyphs within those rows are included. The start fields specify the first row or column in the window which should be written to. Note that the start column may vary across different rows and that some rows may contain no glyphs. Window interfaces may display layered glyphs using either opacity (lowest present glyph is displayed), transparancy (each glyph is represented by an irregular shaped image. Glyphs from layers further away may be seen behind the image), translucency (glpyhs are represented by images that only partially obscure the underlying image) or some other suitable method.

Layers are numbered counting away from the viewer. Layers which have no glyph present have a value of NO_GLYPH.

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).

Note: This procedure will only be called if the interface flag EXT_IM_DISPLAY_LAYERS is set.

send_config_file

struct send_config_file_req {
    int handle;
};
send_config_file returns no values.

Request that if the window interface has a local config file then it should be sent to the game by writing it to the specified handle using the dlbh_fwrite callback. The handle will be closed when send_config_file returns.

Standard window port call backs

Plug-in window ports may assume that the following call backs are supported.

Call backID
display_inventory0x01
dlbh_fopen0x02
dlbh_fgets0x03
dlbh_fread0x04
dlbh_fwrite0x05
dlbh_fclose0x06
dlbh_fmd5sum0x07
flush_screen0x08
doredraw0x09
interface_mode0x0A
parse_options0x0B
get_option0x0C
get_player_choices0x0D
get_valid_selections0x0E
quit_game0x0F
display_score0x10
doset0x11
get_extended_commands0x12
map_menu_cmd0x13
get_standard_winid0x14
get_tilesets0x15
get_glyph_mapping0x16
get_extensions0x17
set_option_mod_status0x18

display_inventory

display_inventory takes no arguments and returns no values.

Display the hero's inventory.

dlbh_fopen

struct dlbh_fopen_req {
    string name<>;
    string mode<>;
};

struct dlbh_fopen_res {
    int fh;
};

Open a file and return a handle or -1 on error. The following names have special meanings as follows:
NameFile
$(RECORD)NetHack record
$(HELP)NetHack help
$(SHELP)NetHack short help
$(DEBUGHELP)NetHack wizard mode help
$(DATAFILE)NetHack data
$(CMDHELPFILE)NetHack command help
$(HISTORY)NetHack history
$(LICENSE)NetHack license
$(OPTIONFILE)NetHack option
$(OPTIONS_USED)NetHack options used
$(GUIDEBOOK)NetHack guidebook

The following modes are supported: r and rb.

dlbh_fgets

struct dlbh_fgets_req {
    int len;
    int fh;
};

struct dlbh_fgets_res {
    string line<>;
};

Read one line of a file previously opened with dlbh_fopen. At most len characters will be returned including the newline at the end of the line. If len is too short to return a whole line the first len characters will be returned (with no terminating newline) and the rest of the line will be available for reading with the next call the dlbh_fgets. An empty string will be returned on end of file or other error.

dlbh_fread

struct dlbh_fread_req {
    int len;
    int fh;
};

struct dlbh_fread_res {
    int retval;
    opaque buffer<>;
};

Read up to len bytes of a file previously opened with dlbh_fopen. If an error occurs, retval will be non-zero. Any bytes read before the error occured will be returned in the buffer. An empty buffer will be returned on end of file.

dlbh_fwrite

struct dlbh_fwrite_req {
    int fh;
    opaque buffer<>;
};

struct dlbh_fwrite_res {
    int retval;
};

Write buffer to a file previously opened for writing. At present, the only means of aquiring a writable handle is via the send_config_file procedure. If an error occurs, retval will be non-zero.

dlbh_fclose

struct dlbh_fclose_req {
    int fh;
};

struct dlbh_fclose_res {
    int retval;
};

Close a file previously opened with dlbh_fclose. Return non-zero on error.

dlbh_fmd5sum

struct dlbh_fmd5sum_req {
    string name<>;
};

struct dlbh_fmd5sum_res {
    int retval;
    string digest<>;
};

Compute a message digest for a file according to RFC 1321 (MD5). See dlbh_fopen for information on file names. Retval will be zero if the file was opened successfully and -1 if an error was encountered.

flush_screen

flush_screen takes no arguments and returns no values.

Flush the screen.

doredraw

doredraw takes no arguments and returns no values.

Redraw the screen.

interface_mode

struct interface_mode_fclose_req {
    unsigned long mode;
};

Set or reset flags to change the behaviour of the interface as follows:
FlagStatusBehaviour
EXT_IM_STATUS0Report status via calls to putstr(WIN_STATUS,...)
1Report status via calls to status(...)
EXT_IM_DISPLAY_LAYERS0Use print_glyph procedure
1Use print_glyph_layered procedure

parse_options

struct parse_options_req {
    string opts<>;
};

struct parse_options_res {
    int retval;
};

Parse the options passed. Multiple options may be given, seperated with commas. The format for options is the save as when included with the OPTIONS keyword in NetHack defaults files. See the guidebook for details.

parse_options returns non-zero on error.

get_option

struct get_option_req {
    string opt<>;
};

struct get_option_res {
    string value<>;
};

Get the value of an option, or the empty string if the option is not recognized. Boolean options are returned as values of "yes" or "no".

get_player_choices

typedef string choices<>;

struct get_player_choices_res_role {
    string male<>;
    string female<>;
};

struct get_player_choices_res {
    choices aligns<>;
    choices genders<>;
    choices races<>;
    struct get_player_choices_res_role roles<>;
};

Returns an array of the possible values for each of player alignment, gender, race and role. Note that this includes all possible values, not just the ones that are compatible with the currently set options.

The (integer) values of align, gend, race and role used by the player_selection procedure can be used as indices into these arrays.

get_valid_selctions

struct get_valid_selections_res {
    int no_roles;
    int no_races;
    int no_aligns;
    int no_genders;
    unsigned long masks<>;
};

Get a packed array of masks of combinations of role, race, gender and alignment which form a valid player selection.

When unpacked, the array contains no_roles * no_races * no_aligns elements each of which is a mask of the valid genders for this combination of role, race, alignment. If there are no valid genders then this mask will be zero, otherwise it will be the bitwise-OR of (1<<gender) for each gender that is valid.

The array is packed by copying no_gender bits from the next mask in the unpacked array into the least significant unused bits of the current element in the packed array (the order of bits within each mask is unchanged during this process). A new element in the packed array is started when there is not enough room for a complete mask to be stored (masks are not split across array elements). The final element in the packed array may only be partially filled.

quit_game

quit_game takes no arguments and returns no values.

User request to quit the game.

display_score

display_score takes no arguments and returns no values.

Display the current score list.

doset

doset takes no arguments and returns no values.

Display the current options and allow the user to modify them.

get_extended_commands

typedef string commands<>;

struct get_extended_commands_res {
    commands ext_cmd_list<>;
};

Get a list of extended commands. Note that this command list may change (for example when starting in wizard mode).

map_menu_cmd

struct map_menu_cmd_req {
    int ch;
};

struct map_menu_cmd_res {
    int retval;
};

Map the given character to its corresponding menu command. If it doesn't match anything, just return the original.

get_standard_winid

struct get_standard_winid_req {
    string window<>;
};

struct get_standard_winid_res {
    int retval;
};

Return the window ID of standard windows (this will be -1 if the window is not open). The following window names are currently recognized:
NameWindow
MESSAGEThe message window
STATUSThe status window
MAPThe map window
INVENThe permanent inventory window or, if none, the current transitory inventory window

Unrecognized windows will return -1.

get_tilesets

struct get_tilesets_res_tileset {
    string name<>;
    string file<>;
    string mapfile<>;
    long flags;
};

struct get_tilesets_res {
    struct get_tilesets_res_tileset tilesets<>;
};

Return a list of the currently configured tile sets.

get_glyph_mapping

struct get_glyph_mapping_res_symdef {
    long rgbsym;
    string description<>;
};

struct get_glyph_mapping_res_submapping {
    struct get_glyph_mapping_res_symdef symdef;
    struct get_glyph_mapping_res_symdef glyphs<>;
};

struct get_glyph_mapping_res_mapping {
    string flags<>;
    int base_mapping;
    int alt_glyph;
    struct get_glyph_mapping_res_symdef symdef;
    struct get_glyph_mapping_res_submapping submappings<>;
};

struct get_glyph_mapping_res {
    int no_glyph;
    long transparent;
    struct get_glyph_mapping_res_mapping mappings<>;
};

Return a set of descriptions for each glyph so that the window port can generate a map between glyphs and tiles and/or characters for display.

The descriptions are returned in a tiered structure for efficiency. The top level contains the value of no_glyph, which is both the number of glyphs in the map and the value used by the game to indicate that no glyph is present.

The transparent field contains an arbitary RGB colour which is used within the glyph map to indicate a transparent colour. When combining glyph maps (see below) a non-transparent colour should always superceed the transparent colour. Similarly, the symbol part of the transparent field contains a value which is used to indicate a transparent symbol which is used in an equivalent way. The field (and the rgbsym field described later) is encoded with an 8-bit red value in the top 8 bits, an 8-bit green value in bits 16 to 23, an 8-bit blue value in bits 9 to 15 and an 8-bit symbol in the bottom 8 bits.

There then follows a series of mappings which form the second level. Here a comma seperated set of flags may be specified which is used to distinguish similar glyphs. Window ports should ignore flags that they do not recognize.

Where a set of glyphs is substantially the same as another set, then they will be specified as being based on another mapping with the base_mapping field. This will be -1 where no base mapping is in use. Where a base mapping is specified and the number of sub-mappings is zero then the current mapping should be taken as a duplicate of the base mapping, with different flags and alternate glyph (see below) possibly with different colour and symbol (if these are different to the transparent colour and symbol). Where a base mapping is specified with sub-mappings, then each sub-mapping specifes a number of glyphs for each of the glyphs in the base mapping. This is used, for example, with swallows which are based on the monster mapping.

Also provided for some mappings is an alternate glyph which should be used where the windowing port does not support the glyph set. If there is no alternate glyph then the alt_glyph field will contain the value of no_glyph.

Finally, each mapping has a symdef field which contains an RGB colour and symbol which may be set if all glyphs in the set share the same colour and/or symbol.

Each sub-map contains a symdef field which is used in the same way as the same field in the containing mapping structure and a set of symdefs, one for each glyph in the sub-mapping.

get_extensions

struct get_extensions_res_extension {
    string name<>;
    string vers<>;
    int no_procedures;
};

struct get_extensions_res {
    struct get_extensions_res_extension extensions<>;
};

Return a list of the supported extensions. The first extension listed will use no_procedures IDs starting at 0x8000. Subsequent extensions will use IDs starting just after the previous extension.

set_option_mod_status

/*
 * Option flags
 * Each higher number includes the characteristics of the numbers
 * below it.
 */
enum option_mod_flag {
    SET_IN_FILE = 0,	/* config file option only */
    SET_VIA_PROG = 1,	/* may be set via extern program, not seen in game */
    DISP_IN_GAME = 2,	/* may be set via extern program, displayed in game */
    SET_IN_GAME = 3	/* may be set via extern program or set in the game */
};

struct set_option_mod_status_req {
    string optnam<>;
    enum option_mod_flag status;
};

Sub-protocol 2

Sub-protocol 2 has exactly the same procedures and callbacks that are documented above for sub-protocol 1 (except init), but is no longer fully synchronous. This means that some procedures and callbacks which have no need to send a reply can be defined as asynchronous. This lets the remote end know that no reply will be generated, allowing serveral requests to be sent at the same time.

In order to cope with the asychronous nature of the protocol, the header is modified slightly from that used in sub-protocol 0 so that the serial number to which a reply relates can be sent. This means that there is one less bit available and the maximum packet size (including the header) is consequently reduced to 128Kb (sub-protocol 1 allows 256Kb).

In sub-protocol 2, the proxy module will initiate a procedure by writing an unsigned integer (according to RFC1014) whose value is as follows:

	value = (ID << 16) | (length >> 2);
where length is the length of the following data (not including value) in bytes. It will then write the relevant request structure (if a procedure takes no arguments then length will be zero and no request structure will be written). Bit 15 will always be zero. An ID of 0xffff indicates a special packet.

The proxy module will then read back an unsigned integer from the plug-in window-port and decode it as follows:

	ID = value >> 16;
	is_reply = value & 0x8000;
	length = (value & 0x7fff) << 2;

If ID is 0xffff and is_reply is zero, this is a special packet. Otherwise, if is_reply is zero, this is a callback.

If is_reply is non-zero, this is a reply. The ID field contains the serial number of the request to which it relates. The first request to be sent has a serial number of 1. Each subsequent request has the next serial number in sequence, wrapping to 0 after 0xffff. There is no requirement that replies must be sent in any particular order.

Special packets

Special packets provide a kind of out-of-band communication stream which have no effect on the processing of request and reply packets. They are distingushed by a header with the top 17 bits set to 0x1fffe (which corresponds to an ID of 0xffff and bit 15 reset). Special packets are further decoded as follows:

	type = (value & 0x7f00) >> 8;
	length = (value & 0xff) << 2;

Special packet type 0 (error packets)

Error packets are at least two words long which are decoded as follows:

	serial = word1 >> 16;
	id = word1 & 0xffff;
	code = word2 & 0xff;

Other bits are reserved and should be written as zero and ignored on read. serial is the serial number of the request to which this error relates. id is the ID of that request. code is an error code, which is one of the following:
CodeMeaning
1The function is unsupported
2The function is unsupported in this state (eg., directory_update() before game started)
3Invalid paramameter encoding (eg., passing params to a function which takes none)
4Invalid parameters (eg., set_option_mod_status() for an undefined status)
5Resource failure (eg., add_menu() runs out of memory)

Other error codes should be treated as a generic error.

On receit of a code 1 error (unsupported function), implementations may take it that all further requests with this ID will be ignored (other than to generate errors) and drop them at source. Window interfaces that would otherwise ignore certain requests from the game should instead signal an error to reduce bandwidth. Games are not expected to cope with every combination of procedures being signalled as unsupported, but will cope with the following procedures being unsupported:

  • get_nh_event
  • suspend_nhwindows and resume_nhwindows (must be both or none)
  • update_inventory
  • mark_sync
  • wait_sync
  • cliparound
  • update_positionbar
  • nhbell
  • doprev_message
  • number_pad
  • delay_output
  • change_color
  • change_background
  • set_font_name
  • get_color_string
  • start_screen
  • end_screen

Window interfaces are not required to be able to cope with any of the standard callbacks being signalled as unsupported.

Unrecognized special packets

Special packets of a type other than those listed here should be ignored.

Window port procedures specific to sub-protocol 2

init

struct init_req {
    unsigned long async_callbacks<>;
};

struct init_res {
    unsigned long async_procedures<>;
};

In sub-protocol 2, the init procedure is passed a list of callbacks that will not generate a reply and returns a similar list for procedures supported by the window interface.

Lists of async callbacks and procedures are encoded as an array of bitmasks with one mask per 32 callbacks or procedures starting with IDs 1-32 and going up by 32 for each subsequent mask. Within each mask, the least significant bit represents the lowest ID within the 32 IDs encoded. Bits are set to denote an asychronous callback or procedure and reset to denote a synchronous one. Synchronous callbacks and procedures always expect a reply; asynchronous ones expect no reply. IDs beyond the end of the array are treated as synchronous.

This procedure will be called once before all other procedures. No callbacks may be invoked before the init procedure returns.

Change history

NhExt 1.0.1

  • Added sub-protocol 2.

NhExt 1.0.2

  • Added authentication.
slashem-0.0.7E7F3/win/proxy/prxytile.c0000664000076400007640000002346010545462317015663 0ustar aliali/* $Id: prxytile.c,v 1.8 2003/10/25 18:06:01 j_ali Exp $ */ /* Copyright (c) Slash'EM Development Team 2002-2003 */ /* NetHack may be freely redistributed. See license for details. */ #include #include #include #include "nhxdr.h" #include "proxycom.h" #include "prxyclnt.h" #include "proxycb.h" /* #define DEBUG */ /* * entry is a comma seperated list of descriptions. * '\' is treated as an escape character. */ static void proxy_tilemap_add_entry(struct proxy_tilemap *map, int tn, char *entry) { int i, j, k, idx; char buf[1024]; if (map->no_entries >= map->max_entries) { if (map->max_entries) { map->max_entries *= 2; map->entries = realloc(map->entries, map->max_entries * sizeof(struct proxy_tilemap_entry)); } else { map->max_entries = 32; map->entries = malloc(map->max_entries * sizeof(struct proxy_tilemap_entry)); } if (!map->entries) panic("Not enough memory to load tile map"); } idx = map->no_entries++; map->entries[idx].refs = 0; map->entries[idx].tile = tn; for(i = 0, j = 1; entry[i]; i++) if (entry[i] == '\\' && entry[i + 1]) i++; else if (entry[i] == ',') j++; map->entries[idx].no_descs = j; map->entries[idx].descs = (char **)alloc(j * sizeof(char *)); for(i = j = k = 0; ; i++) if (entry[i] == '\\' && entry[i + 1]) buf[k++] = entry[++i]; else if (entry[i] == ',' || !entry[i]) { map->entries[idx].descs[j] = (char *)alloc(k + 1); strncpy(map->entries[idx].descs[j], buf, k); map->entries[idx].descs[j++][k] = '\0'; if (!entry[i]) break; k = 0; } else if (k || entry[i] != ' ') buf[k++] = entry[i]; if (j != map->entries[idx].no_descs) panic("Bad description count in proxy_tilemap_set_entry"); #ifdef DEBUG fprintf(stderr, "tile %d \"", tn); for(i = j = 0; i < map->entries[idx].no_descs; i++) { if (!map->entries[idx].descs[i] || !*map->entries[idx].descs[i]) continue; if (j) fputs(", ", stderr); fputs(map->entries[idx].descs[i], stderr); j++; } fputs("\"\n", stderr); #endif } struct proxy_tilemap * proxy_new_tilemap(void) { struct proxy_tilemap *map; map = (struct proxy_tilemap *)alloc(sizeof(struct proxy_tilemap)); map->no_entries = map->max_entries = 0; map->no_tiles = 0; map->entries = NULL; return map; } int proxy_load_tilemap_line(struct proxy_tilemap *map, const char *line) { int i, j, k, tn; char buf[256]; char c; if (!strncmp(line, "tile ", 5) && sscanf(line + 5, "%d \"%255[^\"]", &tn, buf) == 2) { map->no_tiles ++; /* The string consists of alternate descriptions seperated * by '/' characters. Split these up (honouring the '\' * escape) and add each description to the tilemap. * Spaces are removed surrounding '/' characters. */ for(i = j = 0; ; i++) if (buf[i] == '\\' && buf[i + 1]) i++; else if (buf[i] == '/' || !buf[i]) { for(k = i - 1; buf[k] == ' '; k--) ; k++; c = buf[k]; buf[k] = '\0'; proxy_tilemap_add_entry(map, tn, buf + j); buf[k] = c; if (!buf[i]) break; j = i + 1; while(buf[j] == ' ') j++; } return 0; } else return -1; /* unrecognized map commands */ } struct proxy_tilemap * proxy_load_tilemap(fh, pulse, pulse_data) int fh; void (*pulse)(); void *pulse_data; { char buf[1024]; struct proxy_tilemap *map; map = proxy_new_tilemap(); while(proxy_cb_dlbh_fgets(buf, 1024, fh)) { if (pulse) (*pulse)(pulse_data); proxy_load_tilemap_line(map, buf); } return map; } void proxy_free_tilemap(map) struct proxy_tilemap *map; { int i, j; for(i = 0; i < map->no_entries; i++) { for(j = 0; j < map->entries[i].no_descs; j++) free(map->entries[i].descs[j]); free(map->entries[i].descs); } free(map); } /* * Return the number of ordered matches between the descriptions. * Encoded as number of matches in top 16 bits and exact matches in lower 16. * This has the effect that a larger number of matches will always win but * where there are an equal number of matches, the number of exact matches * is taken into account. */ static int proxy_match_descriptions(struct proxy_tilemap_entry *tile_entry, struct proxy_glyph_mapping *glyph_desc) { int i, j; int no_matches = 0, no_exact_matches = 0; int last_match = -1; for(i = 0; i < tile_entry->no_descs; i++) { if (!tile_entry->descs[i]) continue; for(j = last_match + 1; j < glyph_desc->no_descs; j++) { if (!glyph_desc->descs[j]) continue; if (!strcmp(tile_entry->descs[i], glyph_desc->descs[j])) { no_matches++; no_exact_matches++; last_match = j; break; } else if (!strcmp(tile_entry->descs[i], "*")) { no_matches++; last_match = j; break; } } } return no_matches << 16 | no_exact_matches; } static short proxy_map_glyph(struct proxy_tilemap *tile_map, struct proxy_glyph_mapping *desc) { int i, j; int best = -1; int best_refs; int best_matches; for(i = 0; i < tile_map->no_entries; i++) { j = proxy_match_descriptions(tile_map->entries + i, desc); if (best < 0 || j > best_matches || j == best_matches && tile_map->entries[i].refs < best_refs) { best = i; best_refs = tile_map->entries[i].refs; best_matches = j; } } if (best >= 0) { tile_map->entries[best].refs++; return tile_map->entries[best].tile; } else return -1; } #ifdef DEBUG static short proxy_log_mapping(int glyph, int tile, struct proxy_tilemap *tile_map, struct proxy_glyph_mapping *mapping) { int i, j, k; fprintf(stderr, "glyph %d", glyph); if (desc) { fputs(" \"", stderr); for(i = j = 0; i < mapping->no_descs; i++) { if (!mapping->descs[i] || !*mapping->descs[i]) continue; if (j) fputs(", ", stderr); fputs(mapping->descs[i], stderr); j++; } fputc('"', stderr); } if (tile >= 0) { fprintf(stderr, " mapped to tile %d \"", tile); for(k = j = 0; k < tile_map->no_entries; k++) { if (tile_map->entries[k].tile == tile) { if (j) fputs(" / ", stderr); for(i = j = 0; i < tile_map->entries[k].no_descs; i++) { if (!tile_map->entries[k].descs[i] || !*tile_map->entries[k].descs[i]) continue; if (j) fputs(", ", stderr); fputs(tile_map->entries[k].descs[i], stderr); j++; } fprintf(stderr, " {%d}", tile_map->entries[k].refs); } } fputs("\"\n", stderr); } else fputs(" not mapped\n", stderr); } #define PROXY_MAP_GLYPH(glyph, tile, tile_map, mapping) \ if (1) { \ int PROXY_MAP_GLYPH_gn = (glyph); \ glyph2tile[PROXY_MAP_GLYPH_gn] = (tile); \ proxy_log_mapping(PROXY_MAP_GLYPH_gn, tile, tile_map, mapping); \ } else #else /* DEBUG */ #define PROXY_MAP_GLYPH(glyph, tile, tile_map, mapping) \ (glyph2tile[(glyph)] = (tile)) #endif /* DEBUG */ short * proxy_map_glyph2tile(glyph_map, tile_map, pulse, pulse_data) struct proxycb_get_glyph_mapping_res *glyph_map; struct proxy_tilemap *tile_map; void (*pulse)(); void *pulse_data; { int i, j, k, m, glyph = 0; struct proxy_glyph_map_info info; struct proxy_glyph_mapping *mapping; struct forward_ref { int first_glyph; int no_glyphs; int ref_glyph; }; int no_forward_refs = 0; struct forward_ref *forward_refs = NULL, *fr; short *glyph2tile; glyph2tile = (short *)alloc(glyph_map->no_glyph * sizeof(short)); for(i = 0; i < glyph_map->no_glyph; i++) glyph2tile[i] = -1; mapping = proxy_glyph_map_first(&info, glyph_map); while (mapping) { if (pulse) (*pulse)(pulse_data); /* TODO: Where the tileset defines tiles for a mapping, this should * take precedence over the alternate glyph. Currently, we always * use the alternative glyph, if set. */ if (mapping->alt_glyph != glyph_map->no_glyph) { m = glyph2tile[mapping->alt_glyph]; if (m < 0) { /* Referenced glyph has not yet been mapped */ if (no_forward_refs && fr->ref_glyph == mapping->alt_glyph && fr->first_glyph + fr->no_glyphs == glyph) fr->no_glyphs++; else { if (no_forward_refs++) forward_refs = realloc(forward_refs, no_forward_refs * sizeof (struct forward_ref)); else forward_refs = malloc(sizeof (struct forward_ref)); if (!forward_refs) panic("Not enough memory to map glyphs"); fr = forward_refs + no_forward_refs - 1; fr->first_glyph = glyph; fr->no_glyphs = 1; fr->ref_glyph = mapping->alt_glyph; } glyph++; } else PROXY_MAP_GLYPH(glyph++, m, tile_map, NULL); } else { m = proxy_map_glyph(tile_map, mapping); PROXY_MAP_GLYPH(glyph++, m, tile_map, mapping); } mapping = proxy_glyph_map_next(&info); } proxy_glyph_map_close(&info); /* Handle any forward references (ignoring any that reference undefined * glyphs - we treat these just like any other undefined glyphs). */ do { k = 0; fr = forward_refs; for(i = 0; i < no_forward_refs; i++, fr++) { if (!fr->no_glyphs) continue; m = glyph2tile[fr->ref_glyph]; if (m >= 0) { for(j = 0; j < fr->no_glyphs; j++) PROXY_MAP_GLYPH(fr->first_glyph + j, m, tile_map, NULL); fr->no_glyphs = 0; k = 1; /* We've done some work */ } else if (!k) { m = fr->ref_glyph; fr = forward_refs; for(j = 0; j < no_forward_refs; j++, fr++) if (fr->no_glyphs && m >= fr->first_glyph && m < fr->first_glyph + fr->no_glyphs) break; fr = forward_refs + i; if (j < no_forward_refs) /* There's work still to do (and we haven't done any) */ k = -1; } } if (k < 0) panic("Cyclic forward references in glyph mapping"); } while(k); free(forward_refs); /* Make certain all glyphs map to _something_ */ #if 0 /* FIXME */ glyph = cmap_to_glyph(S_stone); #else glyph = 0; #endif j = glyph2tile[glyph]; if (j < 0) j = 0; for(i = 0; i < glyph_map->no_glyph; i++) if (glyph2tile[i] < 0) glyph2tile[i] = j; return glyph2tile; } slashem-0.0.7E7F3/win/proxy/callback.c0000664000076400007640000004704410545462317015543 0ustar aliali/* $Id: callback.c,v 1.26 2004/04/19 06:56:42 j_ali Exp $ */ /* Copyright (c) Slash'EM Development Team 2001-2004 */ /* NetHack may be freely redistributed. See license for details. */ /* #define DEBUG */ #include "hack.h" #include "func_tab.h" #include "md5.h" #include "nhxdr.h" #include "proxycom.h" #include "winproxy.h" extern int proxy_authorized; static void FDECL(callback_display_inventory, \ (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(callback_dlbh_fopen, \ (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(callback_dlbh_fgets, \ (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(callback_dlbh_fread, \ (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(callback_dlbh_fwrite, \ (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(callback_dlbh_fclose, \ (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(callback_dlbh_fmd5sum, \ (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(callback_flush_screen, \ (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(callback_doredraw, \ (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(callback_interface_mode, \ (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(callback_parse_options, \ (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(callback_get_option, \ (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(callback_get_player_choices, \ (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(callback_get_valid_selections, \ (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(callback_quit_game, \ (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(callback_display_score, \ (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(callback_doset, \ (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(callback_get_extended_commands, \ (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(callback_map_menu_cmd, \ (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(callback_get_standard_winid, \ (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(callback_get_tilesets, \ (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(callback_get_glyph_mapping, \ (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(callback_get_extensions, \ (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(callback_set_option_mod_status, \ (unsigned short, NhExtXdr *, NhExtXdr *)); static void callback_display_inventory(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { /* * Ignore recursive calls. They cause the game to * produce illegal output and have no utility. */ static int busy = 0; if (!busy && proxy_authorized) { busy++; display_inventory((char *)0, FALSE); if (!nhext_async_mode()) nhext_rpc_params(reply, 0); busy--; } } /* * Common function used by callback_dlbh_fopen() and callback_dlbh_fmd5sum() * to open files on behalf of the window interface. */ #ifndef FILE_AREAS #define SET_FILE(f, a) if (1) { file = f; } else #else #define SET_FILE(f, a) if (1) { file = f; area = a; } else #endif /* * Warning: overwrites memory pointed to by name */ static int cb_dlbh_fopen(char *name, char *mode) { char *file, *subname; #ifdef FILE_AREAS char *area; #endif char *s; char *buf = NULL; int i, retval = 0; if (name[0] != '$' || name[1] != '(') retval = -1; else { for(i = 0; name[i] && name[i] != ')'; i++) ; if (!name[i]) retval = -1; else { name[i] = '\0'; subname = name + i + 1; if (*subname=='/') subname++; else if (*subname) retval = -1; } } if (strcmp(mode, "r") && strcmp(mode, "rb")) retval = -1; if (!retval && *subname) { if (!strcmp(name + 2, "TILEDIR") || !strcmp(name + 2, "TILEMAPDIR")) { #ifdef MAXNOTILESETS for(i = 0; i < no_tilesets; i++) if (!strcmp(tilesets[i].file, subname)) break; if (i == no_tilesets) retval = -1; else #else if (strcmp(tile_file, subname)) retval = -1; else #endif if (!strcmp(name + 2, "TILEDIR")) SET_FILE(subname, FILE_AREA_SHARE); else { s = strrchr(subname, '.'); if (s) { buf = (char *)alloc(s - subname + 5); (void)strncpy(buf, subname, s - subname); buf[s - subname] = '\0'; } else { buf = (char *)alloc(strlen(subname) + 5); Strcpy(buf, subname); } Strcat(buf, ".map"); SET_FILE(buf, FILE_AREA_SHARE); } } else retval = -1; } else if (!retval) { if (!strcmp(name + 2, "RECORD")) SET_FILE(NH_RECORD, NH_RECORD_AREA); else if (!strcmp(name + 2, "HELP")) SET_FILE(NH_HELP, NH_HELP_AREA); else if (!strcmp(name + 2, "SHELP")) SET_FILE(NH_SHELP, NH_SHELP_AREA); else if (!strcmp(name + 2, "DEBUGHELP")) SET_FILE(NH_DEBUGHELP, NH_DEBUGHELP_AREA); #if 0 else if (!strcmp(name + 2, "RUMORFILE")) SET_FILE(NH_RUMORFILE, NH_RUMORAREA); else if (!strcmp(name + 2, "ORACLEFILE")) SET_FILE(NH_ORACLEFILE, NH_ORACLEAREA); #endif else if (!strcmp(name + 2, "DATAFILE")) SET_FILE(NH_DATAFILE, NH_DATAAREA); else if (!strcmp(name + 2, "CMDHELPFILE")) SET_FILE(NH_CMDHELPFILE, NH_CMDHELPAREA); else if (!strcmp(name + 2, "HISTORY")) SET_FILE(NH_HISTORY, NH_HISTORY_AREA); else if (!strcmp(name + 2, "LICENSE")) SET_FILE(NH_LICENSE, NH_LICENSE_AREA); else if (!strcmp(name + 2, "OPTIONFILE")) SET_FILE(NH_OPTIONFILE, NH_OPTIONAREA); else if (!strcmp(name + 2, "OPTIONS_USED")) SET_FILE(NH_OPTIONS_USED, NH_OPTIONS_USED_AREA); else if (!strcmp(name + 2, "GUIDEBOOK")) SET_FILE(NH_GUIDEBOOK, NH_GUIDEBOOK_AREA); else retval = -1; } if (!retval) { dlb_init(); #ifndef FILE_AREAS retval = dlbh_fopen(file, mode); #else retval = dlbh_fopen_area(area, file, mode); #endif } if (buf) free(buf); return retval; } #undef SET_FILE static void callback_dlbh_fopen(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { char *name, *mode; int retval; nhext_rpc_params(request, 2, EXT_STRING_P(name), EXT_STRING_P(mode)); retval = proxy_authorized ? cb_dlbh_fopen(name, mode) : -1; nhext_rpc_params(reply, 1, EXT_INT(retval)); free(name); free(mode); } static void callback_dlbh_fgets(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { int fh, len; char *retval; char *buf; extern char *dlbh_fgets(); nhext_rpc_params(request, 2, EXT_INT_P(len), EXT_INT_P(fh)); if (len > 10*1024*1024) len = 10*1024*1024; /* Avoid pointless resource useage */ buf = (char *)malloc(len); if (!buf && len > 512) { len = 512; buf = (char *)malloc(len); } retval = buf && proxy_authorized ? dlbh_fgets(buf, len, fh) : (char *)0; nhext_rpc_params(reply, 1, EXT_STRING(retval ? retval : "")); free(buf); } static void callback_dlbh_fread(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { int fh, len, nb; char *buf; nhext_rpc_params(request, 2, EXT_INT_P(len), EXT_INT_P(fh)); if (len > 120*1024) len = 120*1024; /* Sub-protocol 2 limits at 128Kb - 12 bytes */ buf = (char *)malloc(len); if (!buf && len > 512) { len = 512; buf = (char *)malloc(len); } nb = buf && proxy_authorized ? dlbh_fread(buf, 1, len, fh) : -1; nhext_rpc_params(reply, 2, EXT_INT(nb < 0), EXT_BYTES(buf, nb >= 0 ? nb : 0)); free(buf); } extern FILE *proxy_config_fp; static void callback_dlbh_fwrite(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { int fh, nb, retval; char *buf = (char *)0; nhext_rpc_params(request, 2, EXT_INT_P(fh), EXT_BYTES_P(buf, nb)); if (!fh && proxy_config_fp && proxy_authorized) retval = fwrite(buf, nb, 1, proxy_config_fp) != 1; else retval = -1; free(buf); nhext_rpc_params(reply, 1, EXT_INT(retval)); } static void callback_dlbh_fclose(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { int fh, retval; nhext_rpc_params(request, 1, EXT_INT_P(fh)); retval = proxy_authorized ? dlbh_fclose(fh) : -1; nhext_rpc_params(reply, 1, EXT_INT(retval)); } static void callback_dlbh_fmd5sum(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { int retval = 0; int fh, nb, i; char *name; char *buf; md5_state_t md5; md5_byte_t digest[16]; char md5sum[33]; nhext_rpc_params(request, 1, EXT_STRING_P(name)); buf = (char *)alloc(8128); if (!buf || !proxy_authorized) { fh = -1; retval = -1; } else { fh = cb_dlbh_fopen(name, "rb"); if (fh < 0) retval = -1; } free(name); if (!retval) { md5_init(&md5); do { nb = dlbh_fread(buf, 1, 8128, fh); if (nb > 0) md5_append(&md5, buf, nb); } while (nb > 0); if (nb < 0) retval = -1; md5_finish(&md5, digest); } if (fh >= 0) (void)dlbh_fclose(fh); free(buf); if (retval) md5sum[0]='\0'; else { for(i = 0; i < 16; i++) sprintf(md5sum + 2 * i, "%02x", digest[i]); md5sum[2 * i] = '\0'; } nhext_rpc_params(reply, 2, EXT_INT(retval), EXT_STRING(md5sum)); } static void callback_flush_screen(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { extern int proxy_curs_on_u; if (proxy_authorized) flush_screen(proxy_curs_on_u); nhext_rpc_params(reply, 0); } static void callback_doredraw(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { if (proxy_authorized) (void)doredraw(); if (!nhext_async_mode()) nhext_rpc_params(reply, 0); } static void callback_interface_mode(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { nhext_rpc_params(request, 1, EXT_LONG_P(proxy_interface_mode)); if (proxy_authorized) bot_set_handler(proxy_interface_mode & EXT_IM_STATUS ? proxy_status : (void (*)())0L); if (!nhext_async_mode()) nhext_rpc_params(reply, 0); } static void callback_parse_options(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { char *opts; nhext_rpc_params(request, 1, EXT_STRING_P(opts)); if (proxy_authorized) parseoptions(opts, FALSE, FALSE); free(opts); nhext_rpc_params(reply, 1, EXT_INT(0)); } static void callback_get_option(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { char *opt, *value; nhext_rpc_params(request, 1, EXT_STRING_P(opt)); value = proxy_authorized ? get_option(opt) : ""; free(opt); nhext_rpc_params(reply, 1, EXT_STRING(value)); } static void callback_get_player_choices(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { int i; const char *aligns_adj[ROLE_ALIGNS], *genders_adj[ROLE_GENDERS]; struct proxycb_get_player_choices_res choices; choices.n_aligns = ROLE_ALIGNS; choices.aligns = aligns_adj; for(i = 0; i < ROLE_ALIGNS; i++) aligns_adj[i] = aligns[i].adj; choices.n_genders = ROLE_GENDERS; choices.genders = genders_adj; for(i = 0; i < ROLE_GENDERS; i++) genders_adj[i] = genders[i].adj; for(i = 0; races[i].noun; i++) ; choices.n_races = i; choices.races = (const char **)alloc(i * sizeof(const char *)); for(i = 0; i < choices.n_races; i++) choices.races[i] = races[i].noun; for(i = 0; roles[i].name.m; i++) ; choices.n_roles = i; choices.roles = (struct proxycb_get_player_choices_res_role *) alloc(i * sizeof(struct proxycb_get_player_choices_res_role)); for(i = 0; i < choices.n_roles; i++) { choices.roles[i].male = roles[i].name.m; choices.roles[i].female = roles[i].name.f ? roles[i].name.f : ""; } nhext_rpc_params(reply, 1, EXT_XDRF(proxycb_xdr_get_player_choices_res, &choices)); free(choices.races); free(choices.roles); } #define SKIP(n) do { \ i += (n) / pack; \ k += ((n) % pack) * ROLE_GENDERS; \ if (k >= pack * ROLE_GENDERS) { \ i++; \ k -= pack * ROLE_GENDERS; \ } \ } while(0) static void callback_get_valid_selections(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { int role, race, gend, align; const int pack = 32 / ROLE_GENDERS; /* No. masks packed in each element */ int i, k; struct proxycb_get_valid_selections_res vs; for(vs.no_roles = 0; roles[vs.no_roles].name.m; vs.no_roles++) ; for(vs.no_races = 0; races[vs.no_races].noun; vs.no_races++) ; vs.no_aligns = ROLE_ALIGNS; vs.no_genders = ROLE_GENDERS; vs.n_masks = (vs.no_roles * vs.no_races * ROLE_ALIGNS + pack - 1) / pack; vs.masks = (unsigned long *)alloc(vs.n_masks * sizeof(unsigned long)); memset((genericptr_t)vs.masks, 0, vs.n_masks * sizeof(unsigned long)); for(role = 0, i = 0, k = 0; role < vs.no_roles; role++) if (!validrole(role)) SKIP(vs.no_races * ROLE_ALIGNS); else for(race = 0; race < vs.no_races; race++) if (!validrace(role, race)) SKIP(ROLE_ALIGNS); else for(align = 0; align < ROLE_ALIGNS; align++) { if (!validalign(role, race, align)) k += ROLE_GENDERS; else for(gend = 0; gend < ROLE_GENDERS; gend++, k++) if (validgend(role, race, gend)) vs.masks[i] |= 1L << k; if (k >= pack * ROLE_GENDERS) { i++; k = 0; } } if (i != (k ? vs.n_masks - 1 : vs.n_masks)) panic("callback_get_valid_selections: Bad packing (%d, %d, %d)", i, k, vs.n_masks); nhext_rpc_params(reply, 1, EXT_XDRF(proxycb_xdr_get_valid_selections_res, &vs)); free(vs.masks); } #undef SKIP static void callback_quit_game(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { if (proxy_authorized && program_state.something_worth_saving) done2(); else { clearlocks(); exit_nhwindows(NULL); terminate(EXIT_SUCCESS); } /* Not reached */ nhext_rpc_params(reply, 0); } static void callback_display_score(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { extern int proxy_rawprint_win; char *argv[] = { "nethack", "-sall", }; if (proxy_authorized) { proxy_rawprint_win = create_toptenwin(); prscore(2, argv); display_nhwindow(proxy_rawprint_win, TRUE); destroy_toptenwin(); dlb_init(); /* Re-initialise DLB */ proxy_rawprint_win = WIN_ERR; } nhext_rpc_params(reply, 0); } static void callback_doset(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { if (proxy_authorized) doset(); nhext_rpc_params(reply, 0); } static void callback_get_extended_commands(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { int i; extern struct ext_func_tab extcmdlist[]; struct proxycb_get_extended_commands_res list; for(i = 0; extcmdlist[i].ef_txt; i++) ; list.n_commands = i; list.commands = (const char **)alloc(i * sizeof(const char *)); for(i = 0; i < list.n_commands; i++) list.commands[i] = extcmdlist[i].ef_txt; nhext_rpc_params(reply, 1, EXT_XDRF(proxycb_xdr_get_extended_commands_res, &list)); free(list.commands); } static void callback_map_menu_cmd(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { int ch, retval; nhext_rpc_params(request, 1, EXT_INT_P(ch)); retval = proxy_authorized ? map_menu_cmd(ch) : ch; nhext_rpc_params(reply, 1, EXT_INT(retval)); } static void callback_get_standard_winid(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { char *window; int retval; nhext_rpc_params(request, 1, EXT_STRING_P(window)); if (!proxy_authorized) retval = -1; else if (!strcmp(window,"MESSAGE")) retval = WIN_MESSAGE; else if (!strcmp(window,"STATUS")) retval = WIN_STATUS; else if (!strcmp(window,"MAP")) retval = WIN_MAP; else if (!strcmp(window,"INVEN")) retval = WIN_INVEN; else retval = -1; nhext_rpc_params(reply, 1, EXT_INT(retval)); } static void callback_get_tilesets(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { int i; char *file; struct proxycb_get_tilesets_res list; #ifdef MAXNOTILESETS list.n_tilesets = no_tilesets; list.tilesets = (struct proxycb_get_tilesets_res_tileset *) alloc(no_tilesets * sizeof(*list.tilesets)); for(i = 0; i < list.n_tilesets; i++) { list.tilesets[i].name = tilesets[i].name; file = (char *)alloc(strlen(tilesets[i].file) + 12); sprintf(file, "$(TILEDIR)/%s", tilesets[i].file); list.tilesets[i].file = file; file = (char *)alloc(strlen(tilesets[i].file) + 16); sprintf(file, "$(TILEMAPDIR)/%s", tilesets[i].file); list.tilesets[i].mapfile = file; list.tilesets[i].flags = tilesets[i].flags; } #else list.n_tilesets = 1; list.tilesets = (struct proxycb_get_tilesets_res_tileset *) alloc(1 * sizeof(*list.tilesets)); list.tilesets[0].name = "Default"; file = (char *)alloc(strlen(tile_file) + 12); sprintf(file, "$(TILEDIR)/%s", tile_file); list.tilesets[0].file = file; file = (char *)alloc(strlen(tile_file) + 16); sprintf(file, "$(TILEMAPDIR)/%s", tile_file); list.tilesets[0].mapfile = file; list.tilesets[0].flags = 0; #endif nhext_rpc_params(reply, 1, EXT_XDRF(proxycb_xdr_get_tilesets_res, &list)); for(i = 0; i < list.n_tilesets; i++) free((char *)list.tilesets[i].file); free(list.tilesets); } static void callback_get_glyph_mapping(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { struct proxycb_get_glyph_mapping_res *mapping; mapping = get_glyph_mapping(); nhext_rpc_params(reply, 1, EXT_XDRF(proxycb_xdr_get_glyph_mapping_res, mapping)); free_glyph_mapping(mapping); } static void callback_get_extensions(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { int i; struct proxycb_get_extensions_res list; for(i = 0; proxy_extents[i].name; i++) ; list.n_extensions = i; list.extensions = (struct proxycb_get_extensions_res_extension *) alloc(i * sizeof(*list.extensions)); for(i = 0; proxy_extents[i].name; i++) { list.extensions[i].name = proxy_extents[i].name; list.extensions[i].version = proxy_extents[i].version; list.extensions[i].no_procedures = proxy_extents[i].no_procedures; } nhext_rpc_params(reply, 1, EXT_XDRF(proxycb_xdr_get_extensions_res, &list)); free(list.extensions); } static void callback_set_option_mod_status(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { char *optnam; int status; nhext_rpc_params(request, 2, EXT_STRING_P(optnam), EXT_INT_P(status)); if (proxy_authorized) set_option_mod_status(optnam, status); free(optnam); if (!nhext_async_mode()) nhext_rpc_params(reply, 0); } struct nhext_svc proxy_callbacks[] = { EXT_CID_DISPLAY_INVENTORY, callback_display_inventory, EXT_CID_DLBH_FOPEN, callback_dlbh_fopen, EXT_CID_DLBH_FGETS, callback_dlbh_fgets, EXT_CID_DLBH_FREAD, callback_dlbh_fread, EXT_CID_DLBH_FWRITE, callback_dlbh_fwrite, EXT_CID_DLBH_FCLOSE, callback_dlbh_fclose, EXT_CID_DLBH_FMD5SUM, callback_dlbh_fmd5sum, EXT_CID_FLUSH_SCREEN, callback_flush_screen, EXT_CID_DOREDRAW, callback_doredraw, EXT_CID_INTERFACE_MODE, callback_interface_mode, EXT_CID_PARSE_OPTIONS, callback_parse_options, EXT_CID_GET_OPTION, callback_get_option, EXT_CID_GET_PLAYER_CHOICES, callback_get_player_choices, EXT_CID_GET_VALID_SELECTIONS, callback_get_valid_selections, EXT_CID_QUIT_GAME, callback_quit_game, EXT_CID_DISPLAY_SCORE, callback_display_score, EXT_CID_DOSET, callback_doset, EXT_CID_GET_EXTENDED_COMMANDS, callback_get_extended_commands, EXT_CID_MAP_MENU_CMD, callback_map_menu_cmd, EXT_CID_GET_STANDARD_WINID, callback_get_standard_winid, EXT_CID_GET_TILESETS, callback_get_tilesets, EXT_CID_GET_GLYPH_MAPPING, callback_get_glyph_mapping, EXT_CID_GET_EXTENSIONS, callback_get_extensions, EXT_CID_SET_OPTION_MOD_STATUS, callback_set_option_mod_status, 0, NULL, }; slashem-0.0.7E7F3/win/proxy/prxymap.c0000664000076400007640000001454110545462317015503 0ustar aliali/* $Id: prxymap.c,v 1.5 2003/08/31 12:54:24 j_ali Exp $ */ /* Copyright (c) Slash'EM Development Team 2002-2003 */ /* NetHack may be freely redistributed. See license for details. */ #include #include #include "nhxdr.h" #include "proxycom.h" #include "prxyclnt.h" static void proxy_set_description(struct proxy_glyph_mapping *datum, int level, const char *description) { for(; datum->no_descs < level; datum->no_descs++) datum->descs[datum->no_descs] = NULL; datum->descs[level] = !description || !*description ? NULL : description; if (datum->no_descs <= level) datum->no_descs = level + 1; } static void proxy_set_symdef(struct proxy_glyph_map_info *info, int level, struct proxycb_get_glyph_mapping_res_symdef *symdef) { int rgb, sym; /* * Update the rgbsym with the new information, if present. * * Where both the existing infomation and the new information * are opaque then the existing information is kept when the * new data comes mapping which is based on a second mapping * and the new information is used when the mapping isn't based * on any other. This allows the mapping for corpses to override * the symbol of the monster mappings (colours could also be * overridden if so desired). */ if (level < PROXY_LEVEL_BASED_MAPPING) { rgb = RGBSYM_RGB(info->current.rgbsym); if (rgb == RGBSYM_RGB(info->glyph_map->transparent)) rgb = RGBSYM_RGB(symdef->rgbsym); sym = RGBSYM_SYM(info->current.rgbsym); if (sym == RGBSYM_SYM(info->glyph_map->transparent)) sym = RGBSYM_SYM(symdef->rgbsym); } else { rgb = RGBSYM_RGB(symdef->rgbsym); if (rgb == RGBSYM_RGB(info->glyph_map->transparent)) rgb = RGBSYM_RGB(info->current.rgbsym); sym = RGBSYM_SYM(symdef->rgbsym); if (sym == RGBSYM_SYM(info->glyph_map->transparent)) sym = RGBSYM_SYM(info->current.rgbsym); } info->current.rgbsym = RGB_SYM(rgb, sym); proxy_set_description(&info->current, level, symdef->description); } static struct proxy_glyph_mapping * proxy_glyph_map_current(info) struct proxy_glyph_map_info *info; { struct proxycb_get_glyph_mapping_res_mapping *mapping, *base; mapping = info->glyph_map->mappings + info->mi; info->current.no_descs = 0; info->current.rgbsym = info->glyph_map->transparent; if (mapping->base_mapping >= 0) { if (mapping->base_mapping < info->mi) base = info->glyph_map->mappings + mapping->base_mapping; else /* Forward references to mappings are not supported */ panic("Glyph mapping %d based on undefined mapping", info->mi); proxy_set_symdef(info, PROXY_LEVEL_MAPPING, &base->symdef); proxy_set_symdef(info, PROXY_LEVEL_BASED_MAPPING, &mapping->symdef); } else { base = NULL; proxy_set_symdef(info, PROXY_LEVEL_MAPPING, &mapping->symdef); } /* We ignore flags from our base mapping (if any) * and always use our own. */ proxy_set_description(&info->current, PROXY_LEVEL_FLAGS, mapping->flags); info->current.alt_glyph = mapping->alt_glyph; if (!mapping->n_submappings) { if (!base) panic("Glyph mapping %d has no base and no sub-mappings", info->mi); proxy_set_symdef(info, PROXY_LEVEL_SUBMAPPING, &base->submappings[info->bsmi].symdef); proxy_set_symdef(info, PROXY_LEVEL_GLYPH, &base->submappings[info->bsmi].glyphs[info->bgi]); } else if (base) { if (!base->n_submappings) panic("Glyph mapping %d based on mapping with no sub-mappings", info->mi); proxy_set_symdef(info, PROXY_LEVEL_SUBMAPPING, &base->submappings[info->bsmi].symdef); proxy_set_symdef(info, PROXY_LEVEL_GLYPH, &base->submappings[info->bsmi].glyphs[info->bgi]); proxy_set_symdef(info, PROXY_LEVEL_BASED_SUBMAPPING, &mapping->submappings[info->smi].symdef); proxy_set_symdef(info, PROXY_LEVEL_BASED_GLYPH, &mapping->submappings[info->smi].glyphs[info->gi]); } else { proxy_set_symdef(info, PROXY_LEVEL_SUBMAPPING, &mapping->submappings[info->smi].symdef); proxy_set_symdef(info, PROXY_LEVEL_GLYPH, &mapping->submappings[info->smi].glyphs[info->gi]); } return &info->current; } struct proxy_glyph_mapping * proxy_glyph_map_first(info, glyph_map) struct proxy_glyph_map_info *info; struct proxycb_get_glyph_mapping_res *glyph_map; { info->glyph_map = glyph_map; info->mi = info->smi = info->gi = 0; info->bsmi = info->bgi = 0; info->current.descs = info->descs; return proxy_glyph_map_current(info); } struct proxy_glyph_mapping * proxy_glyph_map_next(info) struct proxy_glyph_map_info *info; { struct proxycb_get_glyph_mapping_res_mapping *mapping, *base; if (info->mi >= info->glyph_map->n_mappings) return (struct proxy_glyph_mapping *)0; mapping = info->glyph_map->mappings + info->mi; if (mapping->base_mapping >= 0) base = info->glyph_map->mappings + mapping->base_mapping; else base = NULL; if (++info->gi >= (mapping->n_submappings ? mapping->submappings[info->smi].n_glyphs : 0)) { if (++info->smi >= mapping->n_submappings) { if (++info->bgi >= (base && base->n_submappings ? base->submappings[info->bsmi].n_glyphs : 0)) { if (++info->bsmi >= (base ? base->n_submappings : 0)) { if (++info->mi >= info->glyph_map->n_mappings) return (struct proxy_glyph_mapping *)0; info->bsmi = 0; } info->bgi = 0; } info->smi = 0; } info->gi = 0; } return proxy_glyph_map_current(info); } void proxy_glyph_map_close(info) struct proxy_glyph_map_info *info; { } unsigned int proxy_glyph_map_get_length(glyph_map) struct proxycb_get_glyph_mapping_res *glyph_map; { unsigned int count = 0; struct proxycb_get_glyph_mapping_res_mapping *mapping, *base; int mi = 0, bsmi = 0, bgi = 0, smi = 0, gi = 0; mapping = glyph_map->mappings + 0; if (mapping->base_mapping >= 0) base = glyph_map->mappings + mapping->base_mapping; else base = NULL; for(;;) { count++; if (++gi >= (mapping->n_submappings ? mapping->submappings[smi].n_glyphs : 0)) { if (++smi >= mapping->n_submappings) { if (++bgi >= (base && base->n_submappings ? base->submappings[bsmi].n_glyphs : 0)) { if (++bsmi >= (base ? base->n_submappings : 0)) { if (++mi >= glyph_map->n_mappings) return count; mapping++; if (mapping->base_mapping >= 0) base = glyph_map->mappings + mapping->base_mapping; else base = NULL; bsmi = 0; } bgi = 0; } smi = 0; } gi = 0; } } } slashem-0.0.7E7F3/win/proxy/proxycb.c0000664000076400007640000005036410545462317015474 0ustar aliali/* $Id: proxycb.c,v 1.18 2003/10/25 18:06:01 j_ali Exp $ */ /* Copyright (c) Slash'EM Development Team 2001-2003 */ /* NetHack may be freely redistributed. See license for details. */ #include #include #include #include "nhxdr.h" #include "proxycom.h" #include "proxycb.h" #ifndef SIZE #define SIZE(array) (sizeof(array) / sizeof(*(array))) #endif extern NhExtIO *proxy_clnt_log; void proxy_cb_display_inventory() { unsigned short serial; if (proxy_clnt_log) { serial = nhext_rpc_get_next_serial(); nhext_io_printf(proxy_clnt_log, "rpc [%u] display_inventory()\n", serial); } (void)nhext_rpc(EXT_CID_DISPLAY_INVENTORY, 0, 0); } int proxy_cb_dlbh_fopen(name, mode) const char *name, *mode; { int retval; unsigned short serial; if (proxy_clnt_log) { serial = nhext_rpc_get_next_serial(); nhext_io_printf(proxy_clnt_log, "rpc [%u] dlbh_fopen(\"%s\", \"%s\")\n", serial, name, mode); } if (!nhext_rpc(EXT_CID_DLBH_FOPEN, 2, EXT_STRING(name), EXT_STRING(mode), 1, EXT_INT_P(retval))) retval = -1; if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "rpc [%u] dlbh_fopen = %d\n", serial, retval); return retval; } char * proxy_cb_dlbh_fgets(buf, len, fh) char *buf; int len, fh; { char *retval, *line = (char *)0; unsigned short serial; if (proxy_clnt_log) { serial = nhext_rpc_get_next_serial(); nhext_io_printf(proxy_clnt_log, "rpc [%u] dlbh_fgets(%d, %d)\n", serial, len, fh); } if (!nhext_rpc(EXT_CID_DLBH_FGETS, 2, EXT_INT(len), EXT_INT(fh), 1, EXT_STRING_P(line))) { free(line); return (char *)0; } if (*line) { strncpy(buf, line, len - 1); buf[len - 1] = '\0'; retval = buf; } else retval = (char *)0; free(line); if (proxy_clnt_log) { if (retval) nhext_io_printf(proxy_clnt_log, "rpc [%u] dlbh_fgets = \"%s\"\n", serial, retval); else nhext_io_printf(proxy_clnt_log, "rpc [%u] dlbh_fgets = NULL\n", serial); } return retval; } int proxy_cb_dlbh_fread(buf, size, no, fh) char *buf; int size, no, fh; { int retval, offset = 0, nb; char *buffer = (char *)0; unsigned short serial; if (proxy_clnt_log) { serial = nhext_rpc_get_next_serial(); nhext_io_printf(proxy_clnt_log, "rpc [%u] dlbh_fread(%p, %d, %d, %d)\n", serial, buf, size, no, fh); } if (!nhext_rpc(EXT_CID_DLBH_FREAD, 2, EXT_INT(size * no), EXT_INT(fh), 2, EXT_INT_P(retval), EXT_BYTES_P(buffer, nb))) { free(buffer); return -1; } if (nb) memcpy(buf, buffer, nb); free(buffer); while (!retval && nb % size) { /* * The dblh_fread() callback has no concept of item sizes * (it acts more like read() in this respect than fread()). * If we get a sucessful read which is short then we shouldn't * discard the remainder unless we have reached end of file. */ offset += nb; if (!nhext_rpc(EXT_CID_DLBH_FREAD, 2, EXT_INT(size * no - offset), EXT_INT(fh), 2, EXT_INT_P(retval), EXT_BYTES_P(buffer, nb))) nb = 0; if (nb) memcpy(buf + offset, buffer, nb); free(buffer); } retval = retval ? -1 : (offset + nb) / size; if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "rpc [%u] dlbh_fread = %d\n", serial, retval); return retval; } int proxy_cb_dlbh_fwrite(buf, size, no, fh) char *buf; int size, no, fh; { int retval; unsigned short serial; if (proxy_clnt_log) { serial = nhext_rpc_get_next_serial(); nhext_io_printf(proxy_clnt_log, "rpc [%u] dlbh_fwrite(%p, %d, %d, %d)\n", serial, buf, size, no, fh); } if (!nhext_rpc(EXT_CID_DLBH_FWRITE, 2, EXT_INT(fh), EXT_BYTES(buf, size * no), 1, EXT_INT_P(retval))) retval = -1; if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "rpc [%u] dlbh_fwrite = %d\n", serial, retval ? -1 : no); return retval ? -1 : no; } int proxy_cb_dlbh_fclose(fh) int fh; { int retval; unsigned short serial; if (proxy_clnt_log) { serial = nhext_rpc_get_next_serial(); nhext_io_printf(proxy_clnt_log, "rpc [%u] dlbh_fclose(%d)\n", serial, fh); } if (!nhext_rpc(EXT_CID_DLBH_FCLOSE, 1, EXT_INT(fh), 1, EXT_INT_P(retval))) retval = -1; if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "rpc [%u] dlbh_fclose = %d\n", serial, retval); return retval; } char * proxy_cb_dlbh_fmd5sum(name) const char *name; { int retval; char *digest = (char *)0; unsigned short serial; if (proxy_clnt_log) { serial = nhext_rpc_get_next_serial(); nhext_io_printf(proxy_clnt_log, "rpc [%u] dlbh_fmd5sum(\"%s\")\n", serial, name); } if (!nhext_rpc(EXT_CID_DLBH_FMD5SUM, 1, EXT_STRING(name), 2, EXT_INT_P(retval), EXT_STRING_P(digest))) retval = -1; if (!retval) { if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "rpc [%u] dlbh_fmd5sum = \"%s\"\n", serial, digest); return digest; } else { free(digest); if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "rpc [%u] dlbh_fmd5sum = NULL\n", serial); return (char *)0; } } void proxy_cb_flush_screen() { unsigned short serial; if (proxy_clnt_log) { serial = nhext_rpc_get_next_serial(); nhext_io_printf(proxy_clnt_log, "rpc [%u] flush_screen()\n", serial); } (void)nhext_rpc(EXT_CID_FLUSH_SCREEN, 0, 0); } void proxy_cb_doredraw() { unsigned short serial; if (proxy_clnt_log) { serial = nhext_rpc_get_next_serial(); nhext_io_printf(proxy_clnt_log, "rpc [%u] doredraw()\n", serial); } (void)nhext_rpc(EXT_CID_DOREDRAW, 0, 0); } void proxy_cb_interface_mode(mode) unsigned long mode; { unsigned short serial; if (proxy_clnt_log) { unsigned long m = mode; serial = nhext_rpc_get_next_serial(); nhext_io_printf(proxy_clnt_log, "rpc [%u] interface_mode(", serial); if (m & EXT_IM_STATUS) { nhext_io_printf(proxy_clnt_log, "EXT_IM_STATUS"); m &= ~EXT_IM_STATUS; } if (m & EXT_IM_DISPLAY_LAYERS) { if (m != mode) nhext_io_printf(proxy_clnt_log, " | "); nhext_io_printf(proxy_clnt_log, "EXT_IM_DISPLAY_LAYERS"); m &= ~EXT_IM_DISPLAY_LAYERS; } if (m || m == mode) { if (m != mode) nhext_io_printf(proxy_clnt_log, " | "); nhext_io_printf(proxy_clnt_log, "%lu", m); } nhext_io_printf(proxy_clnt_log, ")\n"); } (void)nhext_rpc(EXT_CID_INTERFACE_MODE, 1, EXT_LONG(mode), 0); } int proxy_cb_parse_options(opts) char *opts; { int retval; unsigned short serial; if (proxy_clnt_log) { serial = nhext_rpc_get_next_serial(); nhext_io_printf(proxy_clnt_log, "rpc [%u] parse_options(\"%s\")\n", serial, opts); } if (!nhext_rpc(EXT_CID_PARSE_OPTIONS, 1, EXT_STRING(opts), 1, EXT_INT_P(retval))) retval = -1; if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "rpc [%u] parse_options = %d\n", serial, retval); return retval; } char * proxy_cb_get_option(opt) char *opt; { char *retval = (char *)0; unsigned short serial; if (proxy_clnt_log) { serial = nhext_rpc_get_next_serial(); nhext_io_printf(proxy_clnt_log, "rpc [%u] get_option(\"%s\")\n", serial, opt); } if (!nhext_rpc(EXT_CID_GET_OPTION, 1, EXT_STRING(opt), 1, EXT_STRING_P(retval))) { free(retval); if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "rpc [%u] get_option = NULL\n", serial); return (char *)0; } if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "rpc [%u] get_option = \"%s\"\n", serial, retval); return retval; } struct proxycb_get_player_choices_res * proxy_cb_get_player_choices() { struct proxycb_get_player_choices_res *retval; unsigned short serial; if (proxy_clnt_log) { serial = nhext_rpc_get_next_serial(); nhext_io_printf(proxy_clnt_log, "rpc [%u] get_player_choices()\n", serial); } retval=(struct proxycb_get_player_choices_res *)alloc(sizeof(*retval)); memset(retval, 0, sizeof(*retval)); if (!nhext_rpc(EXT_CID_GET_PLAYER_CHOICES, 0, 1, EXT_XDRF(proxycb_xdr_get_player_choices_res, retval))) { free(retval); if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "rpc [%u] get_player_choices = NULL\n", serial); return (struct proxycb_get_player_choices_res *)0; } if (proxy_clnt_log) { int i; nhext_io_printf(proxy_clnt_log, "rpc [%u] get_player_choices = <", serial); for(i = 0; i < retval->n_aligns; i++) { if (i) nhext_io_printf(proxy_clnt_log, ", "); nhext_io_printf(proxy_clnt_log, "\"%s\"", retval->aligns[i]); } nhext_io_printf(proxy_clnt_log, ">, <"); for(i = 0; i < retval->n_genders; i++) { if (i) nhext_io_printf(proxy_clnt_log, ", "); nhext_io_printf(proxy_clnt_log, "\"%s\"", retval->genders[i]); } nhext_io_printf(proxy_clnt_log, ">, <"); for(i = 0; i < retval->n_races; i++) { if (i) nhext_io_printf(proxy_clnt_log, ", "); nhext_io_printf(proxy_clnt_log, "\"%s\"", retval->races[i]); } nhext_io_printf(proxy_clnt_log, ">, <"); for(i = 0; i < retval->n_roles; i++) { if (i) nhext_io_printf(proxy_clnt_log, ", "); nhext_io_printf(proxy_clnt_log, "{\"%s\", \"%s\"}", retval->roles[i].male, retval->roles[i].female); } nhext_io_printf(proxy_clnt_log, ">\n"); } return retval; } void proxy_cb_free_player_choices(choices) struct proxycb_get_player_choices_res *choices; { nhext_xdr_free(proxycb_xdr_get_player_choices_res, (char *)choices); free(choices); } struct proxycb_get_valid_selections_res * proxy_cb_get_valid_selections() { struct proxycb_get_valid_selections_res *retval; unsigned short serial; if (proxy_clnt_log) { serial = nhext_rpc_get_next_serial(); nhext_io_printf(proxy_clnt_log, "rpc [%u] get_valid_selections()\n", serial); } retval=(struct proxycb_get_valid_selections_res *)alloc(sizeof(*retval)); memset(retval, 0, sizeof(*retval)); if (!nhext_rpc(EXT_CID_GET_VALID_SELECTIONS, 0, 1, EXT_XDRF(proxycb_xdr_get_valid_selections_res, retval))) { free(retval); if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "rpc [%u] get_valid_selections = NULL\n", serial); return (struct proxycb_get_valid_selections_res *)0; } if (proxy_clnt_log) { int i; nhext_io_printf(proxy_clnt_log, "rpc [%u] get_valid_selections = %d, %d, %d, %d, <", serial, retval->no_roles, retval->no_races, retval->no_aligns, retval->no_genders); for(i = 0; i < retval->n_masks; i++) { if (i) nhext_io_printf(proxy_clnt_log, ", "); nhext_io_printf(proxy_clnt_log, "0x%08lX", retval->masks[i]); } nhext_io_printf(proxy_clnt_log, ">\n"); } return retval; } void proxy_cb_free_valid_selections(vs) struct proxycb_get_valid_selections_res *vs; { nhext_xdr_free(proxycb_xdr_get_valid_selections_res, (char *)vs); free(vs); } static struct proxycb_get_valid_selections_res *valid_selections; void proxy_cb_valid_selection_open() { if (!valid_selections) valid_selections = proxy_cb_get_valid_selections(); } /* * If s is negative, then iterate i over 0 <= i < n, otherwise do just one * iteration at i == s. Early exit as soon as we find a valid combination. */ #define ITERATE(i, s, n) for((i) = (s) >= 0 ? (s) : 0; \ !valid && ((s) >= 0 ? (i) == (s) : (i) < (n)); \ (i)++) int proxy_cb_valid_selection_check(role, race, gend, align) int role, race, gend, align; { int valid = 0; int pack; /* No. masks packed in each element */ int i, k, n; int irole, irace, igend, ialign; pack = 32 / valid_selections->no_genders; ITERATE(irole, role, valid_selections->no_roles) ITERATE(irace, race, valid_selections->no_races) ITERATE(ialign, align, valid_selections->no_aligns) { n = (irole * valid_selections->no_races + irace) * valid_selections->no_aligns + ialign; i = n / pack; k = (n % pack) * valid_selections->no_genders; ITERATE(igend, gend, valid_selections->no_genders) if (valid_selections->masks[i] & 1L << k + igend) valid = 1; } return valid; } #undef ITERATE void proxy_cb_valid_selection_close() { if (valid_selections) { proxy_cb_free_valid_selections(valid_selections); valid_selections = (struct proxycb_get_valid_selections_res *)0; } } void proxy_cb_quit_game() { unsigned short serial; if (proxy_clnt_log) { serial = nhext_rpc_get_next_serial(); nhext_io_printf(proxy_clnt_log, "rpc [%u] quit_game()\n", serial); } (void)nhext_rpc(EXT_CID_QUIT_GAME, 0, 0); } void proxy_cb_display_score() { unsigned short serial; if (proxy_clnt_log) { serial = nhext_rpc_get_next_serial(); nhext_io_printf(proxy_clnt_log, "rpc [%u] display_score()\n", serial); } (void)nhext_rpc(EXT_CID_DISPLAY_SCORE, 0, 0); } void proxy_cb_doset() { unsigned short serial; if (proxy_clnt_log) { serial = nhext_rpc_get_next_serial(); nhext_io_printf(proxy_clnt_log, "rpc [%u] doset()\n", serial); } (void)nhext_rpc(EXT_CID_DOSET, 0, 0); } struct proxycb_get_extended_commands_res * proxy_cb_get_extended_commands() { struct proxycb_get_extended_commands_res *retval; unsigned short serial; if (proxy_clnt_log) { serial = nhext_rpc_get_next_serial(); nhext_io_printf(proxy_clnt_log, "rpc [%u] get_extended_commands()\n", serial); } retval=(struct proxycb_get_extended_commands_res *)alloc(sizeof(*retval)); memset(retval, 0, sizeof(*retval)); if (!nhext_rpc(EXT_CID_GET_EXTENDED_COMMANDS, 0, 1, EXT_XDRF(proxycb_xdr_get_extended_commands_res, retval))) { free(retval); if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "rpc [%u] get_extended_commands = NULL\n", serial); return (struct proxycb_get_extended_commands_res *)0; } if (proxy_clnt_log) { int i; nhext_io_printf(proxy_clnt_log, "rpc [%u] get_extended_commands = <", serial); for(i = 0; i < retval->n_commands; i++) { if (i) nhext_io_printf(proxy_clnt_log, ", "); nhext_io_printf(proxy_clnt_log, "\"%s\"", retval->commands[i]); } nhext_io_printf(proxy_clnt_log, ">\n"); } return retval; } void proxy_cb_free_extended_commands(commands) struct proxycb_get_extended_commands_res *commands; { nhext_xdr_free(proxycb_xdr_get_extended_commands_res, (char *)commands); free(commands); } int proxy_cb_map_menu_cmd(ch) int ch; { int retval; unsigned short serial; if (proxy_clnt_log) { serial = nhext_rpc_get_next_serial(); nhext_io_printf(proxy_clnt_log, "rpc [%u] map_menu_cmd(%d)\n", serial, ch); } if (!nhext_rpc(EXT_CID_MAP_MENU_CMD, 1, EXT_INT(ch), 1, EXT_INT_P(retval))) retval = ch; if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "rpc [%u] map_menu_cmd = %d\n", serial, retval); return retval; } int proxy_cb_get_standard_winid(window) char *window; { int retval; unsigned short serial; if (proxy_clnt_log) { serial = nhext_rpc_get_next_serial(); nhext_io_printf(proxy_clnt_log, "rpc [%u] get_standard_winid(\"%s\")\n", serial, window); } if (!nhext_rpc(EXT_CID_GET_STANDARD_WINID, 1, EXT_STRING(window), 1, EXT_INT_P(retval))) retval = -1; if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "rpc [%u] get_standard_winid = %d\n", serial, retval); return retval; } struct proxycb_get_tilesets_res * proxy_cb_get_tilesets() { struct proxycb_get_tilesets_res *retval; unsigned short serial; if (proxy_clnt_log) { serial = nhext_rpc_get_next_serial(); nhext_io_printf(proxy_clnt_log, "rpc [%u] get_tilesets()\n", serial); } retval=(struct proxycb_get_tilesets_res *)alloc(sizeof(*retval)); memset(retval, 0, sizeof(*retval)); if (!nhext_rpc(EXT_CID_GET_TILESETS, 0, 1, EXT_XDRF(proxycb_xdr_get_tilesets_res, retval))) { free(retval); if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "rpc [%u] get_tilesets = NULL\n", serial); return (struct proxycb_get_tilesets_res *)0; } if (proxy_clnt_log) { int i; nhext_io_printf(proxy_clnt_log, "rpc [%u] get_tilesets = <", serial); for(i = 0; i < retval->n_tilesets; i++) { if (i) nhext_io_printf(proxy_clnt_log, ", "); nhext_io_printf(proxy_clnt_log, "{\"%s\",\"%s\",\"%s\",%ld}", retval->tilesets[i].name, retval->tilesets[i].file, retval->tilesets[i].mapfile, retval->tilesets[i].flags); } nhext_io_printf(proxy_clnt_log, ">\n"); } return retval; } void proxy_cb_free_tilesets(tilesets) struct proxycb_get_tilesets_res *tilesets; { nhext_xdr_free(proxycb_xdr_get_tilesets_res, (char *)tilesets); free(tilesets); } struct proxycb_get_glyph_mapping_res * proxy_cb_get_glyph_mapping() { struct proxycb_get_glyph_mapping_res *retval; unsigned short serial; if (proxy_clnt_log) { serial = nhext_rpc_get_next_serial(); nhext_io_printf(proxy_clnt_log, "rpc [%u] get_glyph_mapping()\n", serial); } retval=(struct proxycb_get_glyph_mapping_res *)alloc(sizeof(*retval)); memset(retval, 0, sizeof(*retval)); if (!nhext_rpc(EXT_CID_GET_GLYPH_MAPPING, 0, 1, EXT_XDRF(proxycb_xdr_get_glyph_mapping_res, retval))) { free(retval); if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "rpc [%u] get_glpyh_mapping = NULL\n", serial); retval = (struct proxycb_get_glyph_mapping_res *)0; } if (proxy_clnt_log) { int i, j, k; struct proxycb_get_glyph_mapping_res_submapping *sm; nhext_io_printf(proxy_clnt_log, "rpc [%u] get_glpyh_mapping = %d, 0x%08lX, <\n ", serial, retval->no_glyph, retval->transparent); for(i = 0; i < retval->n_mappings; i++) { if (i) nhext_io_printf(proxy_clnt_log, ",\n "); nhext_io_printf(proxy_clnt_log, "{\"%s\", %d, %d, {0x%08lX, \"%s\"}, <", retval->mappings[i].flags, retval->mappings[i].base_mapping, retval->mappings[i].alt_glyph, retval->mappings[i].symdef.rgbsym, retval->mappings[i].symdef.description); for(j = 0; j < retval->mappings[i].n_submappings; j++) { if (j) nhext_io_fputc(',', proxy_clnt_log); nhext_io_printf(proxy_clnt_log, "\n "); sm = retval->mappings[i].submappings + j; nhext_io_printf(proxy_clnt_log, "{{0x%08lX, \"%s\"}, <", sm->symdef.rgbsym, sm->symdef.description); for(k = 0; k < sm->n_glyphs; k++) { if (k) nhext_io_printf(proxy_clnt_log, ", "); nhext_io_printf(proxy_clnt_log, "{0x%08lX, \"%s\"}", sm->glyphs[k].rgbsym, sm->glyphs[k].description); } nhext_io_printf(proxy_clnt_log, ">}"); } nhext_io_printf(proxy_clnt_log, "\n >}"); } nhext_io_printf(proxy_clnt_log, "\n >\n"); } return retval; } void proxy_cb_free_glyph_mapping(mapping) struct proxycb_get_glyph_mapping_res *mapping; { nhext_xdr_free(proxycb_xdr_get_glyph_mapping_res, (char *)mapping); free(mapping); } struct proxycb_get_extensions_res * proxy_cb_get_extensions() { struct proxycb_get_extensions_res *retval; unsigned short serial; if (proxy_clnt_log) { serial = nhext_rpc_get_next_serial(); nhext_io_printf(proxy_clnt_log, "rpc [%u] get_extentions()\n", serial); } retval=(struct proxycb_get_extensions_res *)alloc(sizeof(*retval)); memset(retval, 0, sizeof(*retval)); if (!nhext_rpc(EXT_CID_GET_EXTENSIONS, 0, 1, EXT_XDRF(proxycb_xdr_get_extensions_res, retval))) { free(retval); if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "rpc [%u] get_extentions = NULL\n", serial); return (struct proxycb_get_extensions_res *)0; } if (proxy_clnt_log) { int i; nhext_io_printf(proxy_clnt_log, "rpc [%u] get_extentions = <\n", serial); for(i = 0; i < retval->n_extensions; i++) { if (i) nhext_io_printf(proxy_clnt_log, ", "); nhext_io_printf(proxy_clnt_log, "{\"%s\", \"%s\", %d}", retval->extensions[i].name, retval->extensions[i].version, retval->extensions[i].no_procedures); } nhext_io_printf(proxy_clnt_log, ">\n"); } return retval; } void proxy_cb_free_extensions(extensions) struct proxycb_get_extensions_res *extensions; { nhext_xdr_free(proxycb_xdr_get_extensions_res, (char *)extensions); free(extensions); } void proxy_cb_set_option_mod_status(optnam, status) const char *optnam; { unsigned short serial; static const char *option_mod_flags[] = { "SET_IN_FILE", "SET_VIA_PROG", "DISP_IN_GAME", "SET_IN_GAME" }; if (proxy_clnt_log) { serial = nhext_rpc_get_next_serial(); if (status >= 0 && status < SIZE(option_mod_flags)) nhext_io_printf(proxy_clnt_log, "rpc [%u] set_option_mod_status(\"%s\", %s)\n", serial, optnam, option_mod_flags[status]); else nhext_io_printf(proxy_clnt_log, "rpc [%u] set_option_mod_status(\"%s\", %d)\n", serial, optnam, status); } (void)nhext_rpc(EXT_CID_SET_OPTION_MOD_STATUS, 2, EXT_STRING(optnam), EXT_INT(status), 0); } slashem-0.0.7E7F3/win/proxy/prxychar.c0000664000076400007640000000146110545462317015640 0ustar aliali/* $Id: prxychar.c,v 1.3 2003/01/01 12:13:33 j_ali Exp $ */ /* Copyright (c) Slash'EM Development Team 2002-2003 */ /* NetHack may be freely redistributed. See license for details. */ #include #include #include #include "nhxdr.h" #include "proxycom.h" #include "prxyclnt.h" long * proxy_map_glyph2char(glyph_map) struct proxycb_get_glyph_mapping_res *glyph_map; { int glyph = 0; struct proxy_glyph_map_info info; struct proxy_glyph_mapping *mapping; long *glyph2rgbsym; glyph2rgbsym = (long *)alloc(glyph_map->no_glyph * sizeof(long)); mapping = proxy_glyph_map_first(&info, glyph_map); while (mapping) { glyph2rgbsym[glyph++] = mapping->rgbsym; mapping = proxy_glyph_map_next(&info); } proxy_glyph_map_close(&info); return glyph2rgbsym; } slashem-0.0.7E7F3/win/proxy/prxyconn.c0000664000076400007640000004203010545462317015655 0ustar aliali/* $Id: prxyconn.c,v 1.9 2003/12/01 17:44:04 j_ali Exp $ */ /* Copyright (c) Slash'EM Development Team 2002-2003 */ /* NetHack may be freely redistributed. See license for details. */ #include #include #include #ifdef WIN32 #include #include #include #include #else #include #include #include #include #include #endif #include "nhxdr.h" #include "proxycom.h" #include "prxyclnt.h" #ifdef WIN32 /* Mingw uses slightly different names to the platform SDK */ #if defined(WSAEINVALIDPROCTABLE) && !defined(WSAINVALIDPROCTABLE) #define WSAINVALIDPROCTABLE WSAEINVALIDPROCTABLE #endif #if defined(WSAEINVALIDPROVIDER) && !defined(WSAINVALIDPROVIDER) #define WSAINVALIDPROVIDER WSAEINVALIDPROVIDER #endif #if defined(WSAEPROVIDERFAILEDINIT) && !defined(WSAPROVIDERFAILEDINIT) #define WSAPROVIDERFAILEDINIT WSAEPROVIDERFAILEDINIT #endif /* Create an anonymous pipe with one end inheritable. */ static int pipe_create(HANDLE *handles, int non_inherit) { HANDLE h; SECURITY_ATTRIBUTES sa; sa.nLength = sizeof(sa); sa.bInheritHandle = TRUE; sa.lpSecurityDescriptor = NULL; if (!CreatePipe(&handles[0], &handles[1], &sa, 0)) return FALSE; if (!DuplicateHandle(GetCurrentProcess(), handles[non_inherit], GetCurrentProcess(), &h, 0, FALSE, DUPLICATE_SAME_ACCESS)) { CloseHandle(handles[0]); CloseHandle(handles[1]); return FALSE; } CloseHandle(handles[non_inherit]); handles[non_inherit] = h; return TRUE; } static HANDLE dup_osf(int fd) { HANDLE h, dh; h = (HANDLE)_get_osfhandle(fd); if (h == INVALID_HANDLE_VALUE) return h; if (!DuplicateHandle(GetCurrentProcess(), h, GetCurrentProcess(), &dh, 0, FALSE, DUPLICATE_SAME_ACCESS)) return INVALID_HANDLE_VALUE; return dh; } static int redirect_to_osf(DWORD std_handle, HANDLE osf) { int i, retval, fd, mode; switch(std_handle) { case STD_INPUT_HANDLE: fd = 0; mode = _O_RDONLY | _O_BINARY; break; case STD_OUTPUT_HANDLE: fd = 1; mode = _O_WRONLY | _O_BINARY; break; case STD_ERROR_HANDLE: fd = 2; mode = _O_WRONLY | _O_BINARY; break; default: errno = EINVAL; return 0; } if (!SetStdHandle(std_handle, osf)) return 0; i = _open_osfhandle((long)osf, mode); if (i < 0) return 0; retval = (dup2(i, fd) >= 0); close(i); return retval; } /* The connect pipe thread deals with copying data from standard input * to the pipe, leaving the main thread to deal with reading from the * pipe and writing the result to standard output. * * Note that earlier versions of NetHack/Slash'EM assume that standard * input is a console. These will enter a tight loop if they attempt * to read input from our pipe. The user will need to use Ctrl-C to * interrupt both processes if this happens. */ static void connect_pipe_thread(LPVOID lpv_param) { int nb; DWORD nbw; char buffer[1024]; HANDLE h = (HANDLE)lpv_param; while((nb = read(0, buffer, sizeof(buffer))) > 0) WriteFile(h, buffer, nb, &nbw, NULL); /* We wouldn't normally expect to get either EOF or ERROR from * standard input, but if we do then report any error and exit. */ if (nb) proxy_clnt_error("standard input: %s", strerror(errno)); CloseHandle(h); } static int connect_pipe(void *rh, void *wh) { HANDLE thread; DWORD thread_id; DWORD nbr; char buffer[1024]; thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)connect_pipe_thread, (LPVOID)wh, 0, &thread_id); if (thread == INVALID_HANDLE_VALUE) { proxy_clnt_error("Failed to connect pipe to game and standard I/O"); return 0; } while (ReadFile((HANDLE)rh, buffer, sizeof(buffer), &nbr, NULL) && nbr) write(1, buffer, (int)nbr); /* After EOF/ERROR from the pipe, we no longer need to forward standard * input to the game so terminate the thread. */ TerminateThread(thread, 0); CloseHandle(thread); return 1; } static int client_read_file(void *handle, void *buf, unsigned int len) { DWORD d; if (!ReadFile((HANDLE)handle, buf, len, &d, NULL)) { d = GetLastError(); return d == ERROR_HANDLE_EOF || d == ERROR_BROKEN_PIPE ? 0 : -1; } else return d; } static int client_write_file(void *handle, void *buf, unsigned int len) { DWORD nb; if (!WriteFile((HANDLE)handle, buf, len, &nb, NULL)) return -1; else return nb; } static int client_read_skt(void *handle, void *buf, unsigned int len) { int nb; nb = recv((SOCKET)handle, buf, len, 0); if (nb == SOCKET_ERROR) return -1; else return nb; } static int client_write_skt(void *handle, void *buf, unsigned int len) { int nb; nb = send((SOCKET)handle, buf, len, 0); if (nb == SOCKET_ERROR) return -1; else return nb; } #else /* WIN32 */ static int connect_pipe(void *rfd, void *wfd) { int nb; fd_set readfds; char buffer[1024]; for(;;) { FD_ZERO(&readfds); FD_SET(0, &readfds); FD_SET((int)rfd, &readfds); if (select((int)rfd + 1, &readfds, NULL, NULL, NULL) < 0) { proxy_clnt_error("select: %s", strerror(errno)); return 0; } if (FD_ISSET(0, &readfds)) { nb = read(0, buffer, sizeof(buffer)); if (nb <= 0) { if (nb < 0) proxy_clnt_error("standard in: %s", strerror(errno)); return nb == 0; } else write((int)wfd, buffer, nb); } if (FD_ISSET((int)rfd, &readfds)) { nb = read((int)rfd, buffer, sizeof(buffer)); if (nb <= 0) { if (nb < 0) proxy_clnt_error("pipe from game: %s", strerror(errno)); return nb == 0; } else write(1, buffer, nb); } } } static int client_read(void *handle, void *buf, unsigned int len) { int nb; nb = read((int)handle, buf, len); return nb >= 0 ? nb : -1; } static int client_write(void *handle, void *buf, unsigned int len) { int nb; nb = write((int)handle, buf, len); return nb >= 0 ? nb : -1; } #endif /* WIN32 */ static int exit_client_services; void proxy_exit_client_services() { exit_client_services = 1; } int proxy_init_client_services(nhext_io_func read_f, void *read_h, nhext_io_func write_f, void *write_h) { int nb; char *s; if (!win_proxy_clnt_init(read_f, read_h, write_f, write_h)) { proxy_clnt_error("Proxy interface failed; switching to text mode"); /* * Most likely cause of failing to start the proxy interface is that * either the game executable we called doesn't support proxy interfaces * or that an error occured during initialisation. The assumption is * that the output from the game is actually a message intended for the * user. In either case, we are best to retrieve the failed packet from * the nhext module and display it. Then we can connect the games's * standard I/O to the user for them to interpret and take appropriate * action. */ s = win_proxy_clnt_get_failed_packet(&nb); if (s) write(1, s, nb); connect_pipe(read_h, write_h); return 1; } return 0; } void proxy_start_client_services() { exit_client_services = 0; while(win_proxy_clnt_iteration() >= 0 && !exit_client_services) ; } #ifdef WIN32 static int proxy_connect_file(char *address, int *argcp, char **argv) { char *filename, *dirname, *save_wd; char **nargv; int i, pid; HANDLE to_game_h[2], from_game_h[2], save_stdin, save_stdout; nargv = (char **)alloc((*argcp + 2) * sizeof(char *)); filename = strrchr(address, '\\'); if (filename) { i = 1024; save_wd = malloc(i); *save_wd = '\0'; while(!getcwd(save_wd, i) && errno == ERANGE) { free(save_wd); i *= 2; save_wd = malloc(i); *save_wd = '\0'; } filename++; i = filename - address; dirname = malloc(i); if (!dirname) { proxy_clnt_error("Not enough memory"); return 1; } strncpy(dirname, address, i - 1); dirname[i - 1] = '\0'; if (chdir(dirname)) { proxy_clnt_error("Can't change to directory %s", dirname); return 1; } free(dirname); nargv[0] = filename; } else { nargv[0] = address; save_wd = NULL; } nargv[1] = "--proxy"; for(i = 1; i <= *argcp; i++) nargv[i + 1] = argv[i]; if (!pipe_create(to_game_h, 1) || !pipe_create(from_game_h, 0)) { proxy_clnt_error("Failed to create pipes"); return 1; } save_stdin = (HANDLE)_get_osfhandle(0); if (save_stdin != INVALID_HANDLE_VALUE) { save_stdin = dup_osf(0); if (save_stdin == INVALID_HANDLE_VALUE) { proxy_clnt_error("Failed to save stdin"); return 1; } } if (!redirect_to_osf(STD_INPUT_HANDLE, to_game_h[0])) { proxy_clnt_error("Failed to redirect stdin"); return 1; } save_stdout = (HANDLE)_get_osfhandle(1); if (save_stdout != INVALID_HANDLE_VALUE) { save_stdout = dup_osf(1); if (save_stdout == INVALID_HANDLE_VALUE) { proxy_clnt_error("Failed to save stdout"); return 1; } } if (!redirect_to_osf(STD_OUTPUT_HANDLE, from_game_h[1])) { proxy_clnt_error("Failed to redirect stdout"); return 1; } pid = spawnv(P_NOWAIT, nargv[0], nargv); if (pid < 0) { proxy_clnt_error("%s: %s", nargv[0], strerror(errno)); return 1; } free(nargv); if (save_stdin == INVALID_HANDLE_VALUE) { SetStdHandle(STD_INPUT_HANDLE, INVALID_HANDLE_VALUE); close(0); } else if (!redirect_to_osf(STD_INPUT_HANDLE, save_stdin)) { proxy_clnt_error("Failed to restore stdin"); return 1; } if (save_stdout == INVALID_HANDLE_VALUE) { SetStdHandle(STD_OUTPUT_HANDLE, INVALID_HANDLE_VALUE); close(1); } else if (!redirect_to_osf(STD_OUTPUT_HANDLE, save_stdout)) { proxy_clnt_error("Failed to restore stdout"); return 1; } if (save_wd && *save_wd) chdir(save_wd); if (save_wd) free(save_wd); return proxy_init_client_services(client_read_file, (void *)from_game_h[0], client_write_file, (void *)to_game_h[1]); } static const char *strerror_WSA(int errnum) { int i; static char buf[30]; struct { int errnum; const char *err; } errors[] = { WSAEACCES, "Perminssion denied", WSAEADDRINUSE, "Address already in use", WSAEADDRNOTAVAIL, "Cannot assign requested address", WSAEAFNOSUPPORT, "Address family not supported by protocol family", WSAEALREADY, "Operation already in progress", WSAECONNABORTED, "Software caused connection abort", WSAECONNREFUSED, "Connection refused", WSAECONNRESET, "Connection reser by peer", WSAEDESTADDRREQ, "Destination address required", WSAEFAULT, "Bad address", WSAEHOSTDOWN, "Host is down", WSAEHOSTUNREACH, "No route to host", WSAEINPROGRESS, "Operation now in progress", WSAEINTR, "Interrupted function call", WSAEINVAL, "Invalid argument", WSAEISCONN, "Socket is already connected", WSAEMFILE, "Too many open files", WSAEMSGSIZE, "Message too long", WSAENETDOWN, "Network is down", WSAENETRESET, "Network dropped connection on reset", WSAENETUNREACH, "Network is unreachable", WSAENOBUFS, "No buffer space available", WSAENOPROTOOPT, "Bad protocol option", WSAENOTCONN, "Socket is not connected", WSAENOTSOCK, "Socket operation on nonsocket", WSAEOPNOTSUPP, "Operation not supported", WSAEPFNOSUPPORT, "Protocol family not supported", WSAEPROCLIM, "Too many processes", WSAEPROTONOSUPPORT, "Protocol not supported", WSAEPROTOTYPE, "Protocol wrong for socket", WSAESHUTDOWN, "Cannot send after socket shutdown", WSAESOCKTNOSUPPORT, "Socket type not supported", WSAETIMEDOUT, "Connection timed out", WSATYPE_NOT_FOUND, "Class type not found", WSAEWOULDBLOCK, "Resource temporarily unavailable", WSAHOST_NOT_FOUND, "Host not found", WSA_INVALID_HANDLE, "Specified event object handle is invalid", WSA_INVALID_PARAMETER, "One or more parameters are invalid", WSAINVALIDPROCTABLE, "Invalid procedure table from service provider", WSAINVALIDPROVIDER, "Invalid service provider version number", WSA_IO_INCOMPLETE, "Overlapped I/O event object not in signaled state", WSA_IO_PENDING, "Overlapped operations will complete later", WSA_NOT_ENOUGH_MEMORY, "Insufficient memory available", WSANOTINITIALISED, "Successful WSAStartup not yet performed", WSANO_DATA, "Valid name, no data record of requested type", WSANO_RECOVERY, "This is a nonrecoverable error", WSAPROVIDERFAILEDINIT, "Unable to initialize a service provider", WSASYSCALLFAILURE, "System call failure", WSASYSNOTREADY, "Network subsystem is unavailable", WSATRY_AGAIN, "Nonauthoritive host found", WSAVERNOTSUPPORTED, "Winsock.dll version out of range", WSAEDISCON, "Graceful shutdown in progress", WSA_OPERATION_ABORTED, "Overlapped operation aborted", }; for(i = 0; i < sizeof(errors)/sizeof(*errors); i++) if (errors[i].errnum == errnum) return errors[i].err; sprintf(buf, "Unknown error %d", errnum); return buf; } static int proxy_connect_tcp(char *address) { SOCKET skt; WSADATA wsa_data; int i, port; long iaddr; char *s, *err; struct hostent *he; struct sockaddr_in sa; s = strrchr(address, ':'); if (!s) { proxy_clnt_error("Missing port number in tcp scheme"); return 1; } port=atoi(s + 1); if (!port) { proxy_clnt_error("Illegal port number in tcp scheme"); return 1; } i = s - address; s = (char *)alloc(i + 1); strncpy(s, address, i); s[i] = '\0'; switch (WSAStartup(MAKEWORD(2, 0), &wsa_data)) { case 0: err = NULL; break; case WSASYSNOTREADY: err = "Network subsystem not ready"; break; case WSAVERNOTSUPPORTED: err = "WinSock API: Version 2.0 not supported"; break; case WSAEINPROGRESS: err = "WinSock API: Blocking operation in progress"; break; case WSAEPROCLIM: err = "WinSock API: Too many tasks"; break; case WSAEFAULT: err = "WinSock API: Application error"; break; default: err = "WinSock API: Unknown error"; break; } if (err) { proxy_clnt_error(err); return 1; } skt = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (skt == INVALID_SOCKET) { proxy_clnt_error("Failed to create socket: %s", strerror_WSA(WSAGetLastError())); return 1; } sa.sin_family = AF_INET; sa.sin_port = htons(port); iaddr = inet_addr(s); if (iaddr == INADDR_NONE) { he = gethostbyname(s); if (!he) { proxy_clnt_error("Can't resolve hostname: %s", strerror_WSA(WSAGetLastError())); return 1; } iaddr = *((long *)he->h_addr); } sa.sin_addr.S_un.S_addr = iaddr; if (connect(skt, (struct sockaddr *)&sa, sizeof(sa))) { proxy_clnt_error("Failed to connect to remote machine: %s", strerror_WSA(WSAGetLastError())); return 1; } free(s); return proxy_init_client_services(client_read_skt, (void *)skt, client_write_skt, (void *)skt); } #else /* WIN32 */ static int proxy_connect_file(char *address, int *argcp, char **argv) { int i; char **nargv = NULL; int to_game[2],from_game[2]; if (pipe(to_game) || pipe(from_game)) { proxy_clnt_error("Can't create NhExt stream"); return 1; } nargv = (char **)alloc((*argcp + 2) * sizeof(char *)); nargv[0] = address; nargv[1] = "--proxy"; for(i = 1; i <= *argcp; i++) nargv[i + 1] = argv[i]; if (!fork()) { dup2(to_game[0],0); dup2(from_game[1],1); close(to_game[1]); close(from_game[0]); execvp(nargv[0], nargv); perror(nargv[0]); _exit(127); } else { free(nargv); close(to_game[0]); close(from_game[1]); return proxy_init_client_services(client_read, (void *)from_game[0], client_write, (void *)to_game[1]); } /*NOTREACHED*/ return 1; } static int proxy_connect_tcp(char *address) { int skt; int i, port; long iaddr; char *s, *err; struct hostent *he; struct sockaddr_in sa; s = strrchr(address, ':'); if (!s) { proxy_clnt_error("Missing port number in tcp scheme"); return 1; } port=atoi(s + 1); if (!port) { proxy_clnt_error("Illegal port number in tcp scheme"); return 1; } i = s - address; s = (char *)alloc(i + 1); strncpy(s, address, i); s[i] = '\0'; skt = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (skt < 0) { proxy_clnt_error("Failed to create socket: %s", strerror(errno)); return 1; } sa.sin_family = AF_INET; sa.sin_port = htons(port); iaddr = inet_addr(s); if (iaddr == INADDR_NONE) { he = gethostbyname(s); if (!he) { extern int h_errno; proxy_clnt_error("Can't resolve hostname: %s", hstrerror(h_errno)); return 1; } iaddr = *((long *)he->h_addr); } sa.sin_addr.s_addr = iaddr; if (connect(skt, (struct sockaddr *)&sa, sizeof(sa))) { proxy_clnt_error("Failed to connect to remote machine: %s", strerror(errno)); return 1; } free(s); return proxy_init_client_services(client_read, (void *)skt, client_write, (void *)skt); } #endif /* WIN32 */ /* * Currently supported schemes: * * Scheme Description Address * ------------------------------------------------------- * file Run program on this computer filename * tcp Connect to remote computer host:port */ int proxy_connect(char *scheme, char *address, int *argcp, char **argv) { if (!strcmp(scheme, "file")) return proxy_connect_file(address, argcp, argv); else if (!strcmp(scheme, "tcp")) return proxy_connect_tcp(address); else proxy_clnt_error("Unsupported scheme: %s", scheme); return 1; } slashem-0.0.7E7F3/win/proxy/nhextio.c0000664000076400007640000006227310545462317015466 0ustar aliali/* $Id: nhextio.c,v 1.5 2003/10/25 18:06:01 j_ali Exp $ */ /* Copyright (c) Slash'EM Development Team 2003 */ /* NetHack may be freely redistributed. See license for details. */ /* NhExt: buffering support */ /* #define PRINTF_FP_SUPPORT */ /* Support for %e, %f & %g */ #include #include #include #include #ifdef PRINTF_FP_SUPPORT #include #endif #include "nhxdr.h" struct NhExtIO_ { unsigned int flags; unsigned int autofill_limit; /* Zero for no limit */ nhext_io_func func, nb_func; void *handle; unsigned char buffer[1025]; /* Capable of storing n-1 chars */ unsigned char *rp, *wp; NhExtNB *nb; }; #define ADVANCE_PTR(io, ptr, inc) \ do { \ (ptr) += (inc); \ if ((ptr) >= (io)->buffer + sizeof((io)->buffer)) \ (ptr) -= sizeof((io)->buffer); \ } while(0) /* Flags changeable by nhext_io_setmode */ #define NHEXT_IO__USERFLAGS (NHEXT_IO_NOAUTOFILL | NHEXT_IO_LINEBUF) /* Flags readable by nhext_io_getmode */ #define NHEXT_IO__READFLAGS (NHEXT_IO__USERFLAGS | \ NHEXT_IO_NBLOCK | \ NHEXT_IO_RDONLY | \ NHEXT_IO_WRONLY) NhExtIO *nhext_io_open(nhext_io_func func, void *handle, unsigned int flags) { NhExtIO *io; io = malloc(sizeof(*io)); if (!io) return NULL; io->flags = flags; io->autofill_limit = 0; io->func = func; io->nb_func = NULL; io->handle = handle; io->rp = io->wp = io->buffer; io->nb = NULL; return io; } int nhext_io_close(NhExtIO *io) { int retval; retval = nhext_io_flush(io); if (io->nb) (void)nhext_nb_close(io->nb); free(io); return retval; } unsigned int nhext_io_getmode(NhExtIO *io) { return io->flags & NHEXT_IO__READFLAGS; } void nhext_io_setmode(NhExtIO *io, unsigned int flags) { io->flags &= ~NHEXT_IO__USERFLAGS; io->flags |= flags & NHEXT_IO__USERFLAGS; } /* Warning: The numbering of free blocks is a little odd */ static void nhext_io__getfree(NhExtIO *io, int *nf1, int *nf2) { /* R * W * +--------------------+ * |222222222222222222|G| 1 - free1, 2 - free2, D - data, G - guard * +--------------------+ * * R W * +--------------------+ * |111|G|DDDDDDDD|22222| * +--------------------+ * * R W * +--------------------+ * |DDDDDDDDDDDD|22222|G| * +--------------------+ * * W R * +--------------------+ * |111|G|DDDDDDDDDDDDDD| * +--------------------+ * * W R * +--------------------+ * |DDD|G|DDDDDDDDDDDDDD| (and variations with guard byte at start or end) * +--------------------+ */ *nf1 = io->wp >= io->rp ? io->rp - io->buffer: io->rp - io->wp; *nf2 = io->wp >= io->rp ? io->buffer + sizeof(io->buffer) - io->wp : 0; /* Guard byte goes in free1 if non-empty else in free2 */ if (*nf1) (*nf1)--; else (*nf2)--; } /* If an autofill limit is set, then autofill will be enabled until * that many bytes have been read and then disabled. Set a zero limit * to allow an unlimited number of bytes to be read (the default). * Notes: * 1. When a limit is in place, all calls to filbuf will reduce * the limit by the number of bytes read regardless of whether the * call was made internally or by the application. * 2. If there are unread bytes in the buffer at the time this function * is called then the limit will be adjusted as if they had been read * after the given limit was set. */ void nhext_io_setautofill_limit(NhExtIO *io, unsigned int limit) { int nf1, nf2, nb; nhext_io__getfree(io, &nf1, &nf2); nb = sizeof(io->buffer) - nf1 - nf2 - 1; if (limit > nb) { io->flags &= ~NHEXT_IO_NOAUTOFILL; io->autofill_limit = limit - nb; } else { io->flags |= NHEXT_IO_NOAUTOFILL; io->autofill_limit = 0; } } void nhext_io_setnbfunc(NhExtIO *io, nhext_io_func func) { /* If there is a read pending then delay the closure until it completes */ if (io->nb && !(io->flags & NHEXT_IO_PENDING)) { nhext_nb_close(io->nb); io->nb = NULL; } io->nb_func = func; io->flags |= NHEXT_IO_NBLOCK; } /* * Returns: >0 if buffer now non-empty, * else 0 on EOF, -1 on error, or -2 on would block */ int nhext_io_filbuf(NhExtIO *io, int blocking) { int retval, nf1, nf2; if (!blocking && !(io->flags & NHEXT_IO_NBLOCK)) return -2; /* * NHEXT_IO_NBLOCK is advisory only, so no error on failure */ if ((io->flags & NHEXT_IO_NBLOCK) && !io->nb && !io->nb_func) { io->nb = nhext_nb_open(io->func, io->handle); if (!io->nb) io->flags &= ~NHEXT_IO_NBLOCK; } if (io->rp == io->wp && !(io->flags & NHEXT_IO_PENDING)) io->rp = io->wp = io->buffer; nhext_io__getfree(io, &nf1, &nf2); if (nf2) { if (nf1 && !(io->flags & NHEXT_IO_PENDING)) { /* Combine free blocks so that we don't make unneccesary * calls to I/O function (which may be expensive). */ io->flags &= ~NHEXT_IO_SIMPLEBUFFER; memmove(io->buffer, io->rp, io->wp - io->rp); io->wp += io->buffer - io->rp; io->rp = io->buffer; } nf1 += nf2; /* nf2 = 0 */ } if (!nf1) return 1; /* Buffer is full */ /* * A simple buffer is one that has the whole of the latest packet read * stored starting at io->buffer and ending at io->wp - 1. Such buffers * may be used to retrieve said packet by calling nhext_io_getpacket(). */ if (io->wp == io->buffer) io->flags |= NHEXT_IO_SIMPLEBUFFER; else io->flags &= ~NHEXT_IO_SIMPLEBUFFER; if (io->nb) { retval = nhext_nb_read(io->nb, io->wp, nf1, blocking); /* * If we have a read call pending then we must remeber this so that * we don't change io->wp or allow a direct read or else NhExtNB's * requirements (of keeping read call parameters constant until a * read is complete) would be broken. */ if (retval == -2) io->flags |= NHEXT_IO_PENDING; else { io->flags &= ~NHEXT_IO_PENDING; if (io->nb_func) { /* Closure delayed until completion of pending read */ nhext_nb_close(io->nb); io->nb = NULL; } } } else if (!blocking) retval = (*io->nb_func)(io->handle, io->wp, nf1); else { retval = (*io->func)(io->handle, io->wp, nf1); if (retval < 0) retval = -1; } if (retval > 0) { ADVANCE_PTR(io, io->wp, retval); if (!(io->flags & NHEXT_IO_NOAUTOFILL) && io->autofill_limit) { if (io->autofill_limit > retval) io->autofill_limit -= retval; else { io->autofill_limit = 0; io->flags |= NHEXT_IO_NOAUTOFILL; } } } return retval; } int nhext_io_getc(NhExtIO *io) { unsigned char c; if (io->rp == io->wp && (io->flags & NHEXT_IO_NOAUTOFILL || nhext_io_filbuf(io, TRUE) <= 0)) return -1; /* getc doesn't distinguish EOF and ERROR */ c = *io->rp; ADVANCE_PTR(io, io->rp, 1); if (io->rp == io->wp && io->nb) nhext_io_filbuf(io, FALSE); return c; } /* * nhext_io_read() reads between 1 and nb bytes from the stream. A read will * only be requested on the underlying I/O system if there would otherwise * be no bytes to return to the caller (and not even then if NOAUTOFILL is * set). This prevents blocking but means that using nhext_io_read() to * read fixed sized datums is not useful. For example, * nhext_io_read(io, &datum, sizeof(datum)) * may easily only partially read datum even though the rest of datum is * available for reading. Where the caller knows in advance that an infinite * block will not occur when reading, nhext_io_fread() should be used instead: * nhext_io_fread(&datum, sizeof(datum), 1, io); */ int nhext_io_read(NhExtIO *io, char *buf, int nb) { int i; int retval = 0; /* Satisfy from read buffer (or 1st half if split) */ if (nb && io->rp != io->wp) { if (io->wp > io->rp) i = io->wp - io->rp; else i = io->buffer + sizeof(io->buffer) - io->rp; if (i > nb) i = nb; memcpy(buf, io->rp, i); ADVANCE_PTR(io, io->rp, i); buf += i; nb -= i; retval += i; } /* Satisfy from 2nd half of read buffer */ if (nb && io->rp != io->wp) { i = io->wp - io->rp; /* rp must point at buffer at this point */ if (i > nb) i = nb; memcpy(buf, io->rp, i); ADVANCE_PTR(io, io->rp, i); buf += i; nb -= i; retval += i; } /* The buffer is empty or the request is satisfied. * If we've read some data or we shouldn't auto-fill then we're done */ if (retval || io->flags & NHEXT_IO_NOAUTOFILL) { if (io->nb) nhext_io_filbuf(io, FALSE); return retval; } if (nb >= sizeof(io->buffer) && !(io->flags & NHEXT_IO_PENDING)) { /* If caller still wants more than we can buffer and we don't have * a read call pending, read direct */ io->flags &= ~NHEXT_IO_SIMPLEBUFFER; if (io->nb) i = nhext_nb_read(io->nb, buf, nb, TRUE); else i = (*io->func)(io->handle, buf, nb); if (i <= 0) { /* If we have previously read some data correctly, then return * this number and leave EOF/ERROR reporting until later. * Otherwise report EOF as 0 and ERROR as -1 */ return retval ? retval : i < 0 ? -1 : 0; } if (io->autofill_limit) { if (io->autofill_limit > i) io->autofill_limit -= i; else { io->autofill_limit = 0; io->flags |= NHEXT_IO_NOAUTOFILL; } } buf += i; nb -= i; retval += i; } else if (nb) { /* Caller wants a fragment or we have a read call pending; * fill our buffer and then satisfy from there. */ i = nhext_io_filbuf(io, TRUE); if (i <= 0) return retval ? retval : i < 0 ? -1 : 0; /* As above */ i = io->wp - io->rp; /* rp must point at buffer at this point */ if (i > nb) i = nb; memcpy(buf, io->rp, i); ADVANCE_PTR(io, io->rp, i); buf += i; nb -= i; retval += i; } return retval; } /* nhext_io_fread() reads up to nmemb members of the given size and returns * the number read. Where fewer members were read than requested then an EOF * or ERROR has occured. Any partially read member will still be available * for reading after nhext_io_fread() returns. * * A negative return indicates that the member size is too large. */ int nhext_io_fread(void *buffer, int size, int nmemb, NhExtIO *io) { int nb, bf; int nbp = 0; /* Number of bytes read in partial read */ int nm = nmemb; /* Members still to read */ if (size > sizeof(io->buffer)) { /* * We need enough room to store a partial member so that we don't * get an indeterminate result. This means that the buffer must * be capable of storing (size - 1) bytes, which is equivalent to * saying that the buffer size (including the guard byte) must be * no smaller than the size of a member. */ return -1; } if (size <= 0) return -1; bf = INT_MAX / size; /* Blocking factor */ while(nm) { if (bf > nm) bf = nm; nb = nhext_io_read(io, buffer, bf * size); if (nb <= 0) return nmemb - nm; buffer += nb; nm -= nb / size; nbp = nb % size; while(nbp) { nb = nhext_io_read(io, buffer, size - nbp); if (nb <= 0) { /* EOF or ERROR after a partial read. * * The buffer must be empty so we can place the partially * read member back into it. */ io->flags &= ~NHEXT_IO_SIMPLEBUFFER; memcpy(io->buffer, buffer - nbp, nbp); io->rp = io->buffer; io->wp = io->buffer + nbp; return nmemb - nm; } nbp += nb; buffer += nb; if (nbp == size) { nm--; nbp = 0; } } } return nmemb; } /* nhext_io_getpacket() gets the last packet read under certain circumstances. * This will always work if the caller sets no-autofill mode and calls * nhext_io_fillbuf() on an empty buffer. Calls to nhext_io_fread() must * also be avoided since this can cause simple buffer mode to be cancelled * (nhext_io_fread() could be re-written to avoid this if it became important). */ char *nhext_io_getpacket(NhExtIO *io, int *nb) { if (io->flags & NHEXT_IO_SIMPLEBUFFER) { *nb = io->wp - io->buffer; return io->buffer; } else return NULL; } /* Return TRUE if a read call would block */ int nhext_io_willblock(NhExtIO *io) { if (io->flags & NHEXT_IO_WRONLY) return -1; if (io->rp != io->wp) return FALSE; /* Buffer non-empty */ if (io->flags & NHEXT_IO_NBLOCK) nhext_io_filbuf(io, FALSE); return io->rp == io->wp; } int nhext_io_flush(NhExtIO *io) { unsigned char *s; int retval, nb1, nb2; if (io->rp == io->wp) return 0; /* Nothing to do */ if (!(io->flags & NHEXT_IO_WRONLY)) return 0; /* Read streams don't need flushing */ /* * W R * +--------------------+ * |11111|FFFFF|G|222222| 1 - block1, 2 - block2, F - free, G - guard * +--------------------+ * * R W * +--------------------+ * |FFF|G|11111111|FFFFF| * +--------------------+ * * R W * +--------------------+ * |111111111111|FFFFF|G| * +--------------------+ * * W R * +--------------------+ * |FFF|G|22222222222222| * +--------------------+ * * W R * +--------------------+ * |111|G|22222222222222| (and variations with guard byte at start or end) * +--------------------+ */ nb1 = io->wp >= io->rp ? io->wp - io->rp : io->wp - io->buffer; nb2 = io->wp >= io->rp ? 0 : io->buffer + sizeof(io->buffer) - io->rp; if (nb1 && nb2) { /* Try and combine split buffer so that we don't make unneccesary * calls to I/O function (which may be expensive). */ s = malloc(nb2); /* For copy of 2nd half */ if (s) { memcpy(s, io->buffer, nb2); memmove(io->buffer, io->rp, nb1); memcpy(io->buffer + nb1, s, nb2); io->rp = io->buffer; io->wp = io->buffer + nb1 + nb2; nb1 += nb2; nb2 = 0; free(s); } } /* Write out buffer (or 1st half if split) */ while (nb1) { retval = (*io->func)(io->handle, io->rp, nb1); if (retval > 0) { ADVANCE_PTR(io, io->rp, retval); nb1 -= retval; } else return -1; } /* Write out 2nd half */ while (nb2) { retval = (*io->func)(io->handle, io->rp, nb2); if (retval > 0) { io->rp += retval; /* rp can't wrap while writing 2nd half */ nb2 -= retval; } else return -1; } io->rp = io->wp = io->buffer; /* Buffer is now empty */ return 0; } int nhext_io_fputc(int c, NhExtIO *io) { unsigned char ch, *wp = io->wp; ch = c; *wp = ch; ADVANCE_PTR(io, wp, 1); if (wp == io->rp) { /* Buffer was full; flush first */ if (nhext_io_flush(io)) return -1; *io->wp = ch; ADVANCE_PTR(io, io->wp, 1); } else io->wp = wp; if (io->flags & NHEXT_IO_LINEBUF && ch == '\n' && nhext_io_flush(io)) return -1; return (int)ch; } int nhext_io_write(NhExtIO *io, char *buf, int nb) { int i; int retval = 0, nf1, nf2; /* If the buffer is not empty, then top it up first */ if (nb && io->wp != io->rp) { nhext_io__getfree(io, &nf1, &nf2); /* If free2 is non-empty, then wp must point at it so store there first */ if (nb && nf2) { i = nf2; if (i > nb) i = nb; memcpy(io->wp, buf, i); ADVANCE_PTR(io, io->wp, i); buf += i; nb -= i; retval += i; /* nf2 -= i; */ } /* If there is any excess then store in free1 * (which wp must now point to after filling free2) */ if (nb && nf1) { i = nf1; if (i > nb) i = nb; memcpy(io->wp, buf, i); ADVANCE_PTR(io, io->wp, i); buf += i; nb -= i; retval += i; /* nf1 -= i; */ } } if (nb) { /* Then flush the buffer (which must be either empty (NOP) or full) */ if (nhext_io_flush(io)) return retval ? retval : -1; /* If we can't buffer the data then write it directly until we can. */ while (nb >= sizeof(io->buffer)) { i = (*io->func)(io->handle, buf, nb); if (i <= 0) return retval ? retval : i; buf += i; nb -= i; retval += i; } } if (nb) { /* Finally, place the last fragment in the by now empty buffer */ memcpy(io->buffer, buf, nb); io->wp += nb; retval += nb; } return retval; } /* A version of write that honours LINEBUF */ int nhext_io_writet(NhExtIO *io, char *buf, int nb) { int i, retval = 0; if (!(io->flags & NHEXT_IO_LINEBUF)) return nhext_io_write(io, buf, nb); for(i = nb - 1; i >= 0; i--) if (buf[i] == '\n') { retval = nhext_io_write(io, buf, i + 1); if (retval <= i || nhext_io_flush(io) || retval == nb) return retval; break; } i = nhext_io_write(io, buf + retval, nb - retval); if (i > 0) retval += i; else if (!retval) retval = i; return retval; } #define NHEXT_IO_FMT_LJUST 0x00001 /* neg width */ #define NHEXT_IO_FMT_SIGN 0x00002 /* + prefix */ #define NHEXT_IO_FMT_ALT 0x00004 /* # prefix */ #define NHEXT_IO_FMT_ZEROPAD 0x00008 /* 0 prefix */ #define NHEXT_IO_FMT_WIDTH 0x00010 /* width present */ #define NHEXT_IO_FMT_PRECISION 0x00020 /* precision present */ #define NHEXT_IO_FMT_SHORT 0x00040 /* h prefix */ #define NHEXT_IO_FMT_LONG 0x00080 /* l prefix */ #define NHEXT_IO_FMT_UNSIGNED 0x00100 /* u, x, X, p or P */ #define NHEXT_IO_FMT_HEX 0x00200 /* x, X, p or P */ #define NHEXT_IO_FMT_PTR 0x00400 /* p or P */ #define NHEXT_IO_FMT_CAPS 0x00800 /* Upper case variant */ #define NHEXT_IO_FMT_NEG 0x01000 /* Value is negative */ #define NHEXT_IO_FMT_EXP 0x02000 /* Output exponent suffix */ #define NHEXT_IO_FMT_DONE 0x04000 /* %fmt finished */ static int nhext_io_pad(NhExtIO *io, int flags, int padding, int pre) { int i, nb = 0; int do_pad = (flags & (NHEXT_IO_FMT_WIDTH | NHEXT_IO_FMT_LJUST)) == (pre ? NHEXT_IO_FMT_WIDTH : NHEXT_IO_FMT_WIDTH | NHEXT_IO_FMT_LJUST); int zero_pad = pre && flags & NHEXT_IO_FMT_ZEROPAD; if (flags & (NHEXT_IO_FMT_SIGN | NHEXT_IO_FMT_NEG)) padding--; if ((flags & (NHEXT_IO_FMT_HEX | NHEXT_IO_FMT_ALT)) == (NHEXT_IO_FMT_HEX | NHEXT_IO_FMT_ALT)) padding -= 2; if (do_pad && !zero_pad) { for(i = 0; i < padding; i++) if (nhext_io_fputc(' ', io) < 0) return -1; else nb++; } if (pre) { if (flags & (NHEXT_IO_FMT_SIGN | NHEXT_IO_FMT_NEG)) { if (nhext_io_fputc(flags & NHEXT_IO_FMT_NEG ? '-' : '+', io) < 0) return -1; else nb++; } if ((flags & (NHEXT_IO_FMT_HEX | NHEXT_IO_FMT_ALT)) == (NHEXT_IO_FMT_HEX | NHEXT_IO_FMT_ALT)) { if (nhext_io_fputc('0', io) < 0) return -1; if (nhext_io_fputc(flags & NHEXT_IO_FMT_CAPS ? 'X' : 'x', io) < 0) return -1; nb += 2; } } if (do_pad && zero_pad) { for(i = 0; i < padding; i++) if (nhext_io_fputc('0', io) < 0) return -1; else nb++; } return nb; } /* Warning: Always cast signed integers to long before passing to printi */ static int nhext_io_printi(NhExtIO *io, int flags, int width, unsigned long v) { int i, retval = 0, digit, w, padding; int radix = flags & NHEXT_IO_FMT_HEX ? 16 : 10; static const char *lc_digits = "0123456789abcdef"; static const char *uc_digits = "0123456789ABCDEF"; const char *digits = flags & NHEXT_IO_FMT_CAPS ? uc_digits : lc_digits; char buffer[8 * sizeof(v) / 3 + 1]; /* Recalculate if radix < 10 */ char *p; if (!(flags & NHEXT_IO_FMT_UNSIGNED) && (long)v < 0) { flags |= NHEXT_IO_FMT_NEG; v = -(long)v; } p = buffer + sizeof(buffer); w = 0; do { digit = v % radix; v /= radix; *--p = digits[digit]; w++; } while (v || flags & NHEXT_IO_FMT_PTR && w < sizeof(void *) * 2); padding = width - w; i = nhext_io_pad(io, flags, padding, TRUE); if (i < 0) return -1; else retval += i; if (nhext_io_write(io, p, w) != w) return -1; else retval += w; i = nhext_io_pad(io, flags, padding, FALSE); if (i < 0) return -1; else retval += i; return retval; } /* * A cut down version of printf. Not all ANSI C features are implemented. * Use with caution. */ int nhext_io_vprintf(NhExtIO *io, char *fmt, va_list ap) { int i, j, nb = 0; unsigned long ul; char *s; int flags, width, precision; #ifdef PRINTF_FP_SUPPORT double d; int padding, expon, dp, sgn; static int exp_width = 0; if (!exp_width) { i = DBL_MAX_10_EXP; while (i) { i /= 10; exp_width++; } exp_width++; } #endif while(*fmt) { for(i = 0; fmt[i] && fmt[i] != '%'; i++) ; if (i) { if (nhext_io_writet(io, fmt, i) != i) return -1; else nb += i; fmt += i; } if (!*fmt) break; flags = 0; while (!(flags & NHEXT_IO_FMT_DONE) && *++fmt) { switch(*fmt) { case '-': flags |= NHEXT_IO_FMT_LJUST; break; case '+': flags |= NHEXT_IO_FMT_SIGN; break; case '#': flags |= NHEXT_IO_FMT_ALT; break; case '.': flags |= NHEXT_IO_FMT_PRECISION; precision = 0; break; case '*': if (flags & NHEXT_IO_FMT_PRECISION) precision = va_arg(ap, int); else { flags |= NHEXT_IO_FMT_WIDTH; width = va_arg(ap, int); if (width < 0) { flags |= NHEXT_IO_FMT_LJUST; width = -width; } } break; case '0': if (flags & NHEXT_IO_FMT_PRECISION) precision *= 10; else if (flags & NHEXT_IO_FMT_WIDTH) width *= 10; else flags |= NHEXT_IO_FMT_ZEROPAD; break; case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (flags & NHEXT_IO_FMT_PRECISION) { precision *= 10; precision += *fmt - '0'; } else if (flags & NHEXT_IO_FMT_WIDTH) { width *= 10; width += *fmt - '0'; } else { flags |= NHEXT_IO_FMT_WIDTH; width = *fmt - '0'; } break; case 'h': flags |= NHEXT_IO_FMT_SHORT; flags &= ~NHEXT_IO_FMT_LONG; break; case 'l': flags |= NHEXT_IO_FMT_LONG; flags &= ~NHEXT_IO_FMT_SHORT; break; case 'c': i = nhext_io_pad(io, flags, width - 1, TRUE); if (i < 0) return -1; else nb += i; if (nhext_io_fputc((char)va_arg(ap, int), io) < 0) return -1; else nb++; i = nhext_io_pad(io, flags, width - 1, FALSE); if (i < 0) return -1; else nb += i; flags |= NHEXT_IO_FMT_DONE; break; case 'P': case 'p': case 'X': case 'x': if (*fmt == 'p' || *fmt == 'P') flags |= NHEXT_IO_FMT_PTR; if (*fmt == 'P' || *fmt == 'X') flags |= NHEXT_IO_FMT_CAPS; flags |= NHEXT_IO_FMT_HEX; /* Fall through */ case 'u': flags |= NHEXT_IO_FMT_UNSIGNED; flags &= ~NHEXT_IO_FMT_SIGN; /* Fall through */ case 'd': case 'i': if (flags & NHEXT_IO_FMT_LONG) ul = va_arg(ap, long); else if (flags & NHEXT_IO_FMT_UNSIGNED) ul = va_arg(ap, unsigned int); else ul = (long)va_arg(ap, int); i = nhext_io_printi(io, flags, width, ul); if (i < 0) return -1; else nb += i; flags |= NHEXT_IO_FMT_DONE; break; #ifdef PRINTF_FP_SUPPORT case 'E': case 'F': case 'G': flags |= NHEXT_IO_FMT_CAPS; /* Fall through */ case 'e': case 'f': case 'g': if (!(flags & NHEXT_IO_FMT_PRECISION)) precision = 6; d = va_arg(ap, double); s = fcvt(d, precision, &dp, &sgn); if (*fmt == 'f') j = strlen(s); else { j = precision; if (*fmt == 'e' || *fmt == 'E') j++; s = fcvt(d, j - dp, &dp, &sgn); if (j > precision || dp > precision || dp < -3) { flags |= NHEXT_IO_FMT_EXP; expon = dp - 1; dp = 1; } } if (sgn) flags |= NHEXT_IO_FMT_NEG; padding = width - j; if (dp <= 0) padding += dp - 2; else if (dp < j) padding--; if (flags & NHEXT_IO_FMT_EXP) padding -= 5; i = nhext_io_pad(io, flags, padding, TRUE); if (i < 0) return -1; else nb += i; if (dp <= 0) { if (nhext_io_write(io, "0.", 2) != 2) return -1; for(i = dp; i < 0; i++) if (nhext_io_fputc('0', io) < 0) return -1; if (nhext_io_write(io, s, j) != j) return -1; nb += 2 - dp; } else if (dp < j) { if (nhext_io_write(io, s, dp) != dp) return -1; if (nhext_io_fputc('.', io) < 0) return -1; if (nhext_io_write(io, s + dp, j - dp) != j - dp) return -1; nb++; } else if (nhext_io_write(io, s, j) != j) return -1; nb += j; if (flags & NHEXT_IO_FMT_EXP) { if (nhext_io_fputc( flags & NHEXT_IO_FMT_CAPS ? 'E' : 'e', io) < 0) return -1; if (nhext_io_printi(io, NHEXT_IO_FMT_ZEROPAD | NHEXT_IO_FMT_WIDTH | NHEXT_IO_FMT_SIGN, exp_width, (long)expon) < 0) return -1; } i = nhext_io_pad(io, flags, padding, FALSE); if (i < 0) return -1; else nb += i; flags |= NHEXT_IO_FMT_DONE; break; #endif /* PRINTF_FP_SUPPORT */ case 's': s = va_arg(ap, char *); if (flags & NHEXT_IO_FMT_PRECISION) j = precision; else j = s ? strlen(s) : 6; i = nhext_io_pad(io, flags, width - j, TRUE); if (i < 0) return -1; else nb += i; if (nhext_io_writet(io, s ? s : "(null)", j) != j) return -1; else nb += j; i = nhext_io_pad(io, flags, width - j, FALSE); if (i < 0) return -1; else nb += i; flags |= NHEXT_IO_FMT_DONE; break; case '%': default: if (nhext_io_fputc(*fmt, io) < 0) return -1; else nb++; flags |= NHEXT_IO_FMT_DONE; break; } } if (flags & NHEXT_IO_FMT_DONE) fmt++; } return nb; } int nhext_io_printf(NhExtIO *io, char *fmt, ...) { int retval; va_list ap; va_start(ap, fmt); retval = nhext_io_vprintf(io, fmt, ap); va_end(ap); return retval; } slashem-0.0.7E7F3/win/proxy/proxysvc.c0000664000076400007640000015456610545462317015714 0ustar aliali/* $Id: proxysvc.c,v 1.27 2004/04/19 06:56:42 j_ali Exp $ */ /* Copyright (c) Slash'EM Development Team 2001-2004 */ /* NetHack may be freely redistributed. See license for details. */ /* #define DEBUG */ /* #define DEBUG_RPC */ /* Log RPC calls to stderr */ #include #include #include #include #ifdef WIN32 #include #include #include #endif #include "nhxdr.h" #include "proxycom.h" #include "proxycb.h" #include "prxyclnt.h" #ifndef SIZE #define SIZE(array) (sizeof(array) / sizeof(*(array))) #endif static void NDECL((*proxy_ini)); /* optional (can be 0) */ static struct window_ext_procs *proxy_svc; int proxy_svc_ver_major, proxy_svc_ver_minor, proxy_svc_protocol; NhExtIO *proxy_clnt_log = NULL; unsigned long proxy_clnt_flags = 0; /* * The proxy svc module provides a set of service functions (ie., suitable * to act as handlers for nhext_svc()). These service functions decode the * incoming parameters; call the relevant windowing interface ext function; * and then encode the results. * * Global functions: * proxy_svc_set_ext_procs(struct window_ext_procs *windowprocs) * proxy_svc_main(struct window_ext_procs *windowprocs) * proxy_svc_main_quit(void) */ static void FDECL(proxy_svc_init, (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(proxy_svc_init_nhwindows, (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(proxy_svc_player_selection, (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(proxy_svc_askname, (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(proxy_svc_get_nh_event, (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(proxy_svc_exit_nhwindows, (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(proxy_svc_suspend_nhwindows, (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(proxy_svc_resume_nhwindows, (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(proxy_svc_create_nhwindow, (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(proxy_svc_clear_nhwindow, (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(proxy_svc_display_nhwindow, (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(proxy_svc_destroy_nhwindow, (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(proxy_svc_curs, (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(proxy_svc_putstr, (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(proxy_svc_display_file, (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(proxy_svc_start_menu, (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(proxy_svc_add_menu, (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(proxy_svc_end_menu, (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(proxy_svc_select_menu, (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(proxy_svc_message_menu, (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(proxy_svc_update_inventory, (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(proxy_svc_mark_synch, (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(proxy_svc_wait_synch, (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(proxy_svc_cliparound, (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(proxy_svc_update_positionbar, (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(proxy_svc_print_glyph, (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(proxy_svc_raw_print, (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(proxy_svc_raw_print_bold, (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(proxy_svc_nhgetch, (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(proxy_svc_nh_poskey, (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(proxy_svc_nhbell, (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(proxy_svc_doprev_message, (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(proxy_svc_yn_function, (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(proxy_svc_getlin, (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(proxy_svc_get_ext_cmd, (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(proxy_svc_number_pad, (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(proxy_svc_delay_output, (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(proxy_svc_change_color, (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(proxy_svc_change_background, (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(proxy_svc_set_font_name, (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(proxy_svc_get_color_string, (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(proxy_svc_start_screen, (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(proxy_svc_end_screen, (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(proxy_svc_outrip, (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(proxy_svc_preference_update, (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(proxy_svc_status, (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(proxy_svc_print_glyph_layered, (unsigned short, NhExtXdr *, NhExtXdr *)); static void FDECL(proxy_svc_send_config_file, (unsigned short, NhExtXdr *, NhExtXdr *)); static unsigned long async_procedures[] = { 1 << EXT_FID_GET_NH_EVENT - EXT_FID_INIT | 1 << EXT_FID_EXIT_NHWINDOWS - EXT_FID_INIT | 1 << EXT_FID_SUSPEND_NHWINDOWS - EXT_FID_INIT | 1 << EXT_FID_RESUME_NHWINDOWS - EXT_FID_INIT | 1 << EXT_FID_CLEAR_NHWINDOW - EXT_FID_INIT | 1 << EXT_FID_DISPLAY_NHWINDOW - EXT_FID_INIT | 1 << EXT_FID_DESTROY_NHWINDOW - EXT_FID_INIT | 1 << EXT_FID_CURS - EXT_FID_INIT | 1 << EXT_FID_PUTSTR - EXT_FID_INIT | 1 << EXT_FID_START_MENU - EXT_FID_INIT | 1 << EXT_FID_ADD_MENU - EXT_FID_INIT | 1 << EXT_FID_END_MENU - EXT_FID_INIT | 1 << EXT_FID_UPDATE_INVENTORY - EXT_FID_INIT | 1 << EXT_FID_MARK_SYNC - EXT_FID_INIT | 1 << EXT_FID_WAIT_SYNC - EXT_FID_INIT | 1 << EXT_FID_CLIPAROUND - EXT_FID_INIT | 1 << EXT_FID_UPDATE_POSITIONBAR - EXT_FID_INIT | 1 << EXT_FID_PRINT_GLYPH - EXT_FID_INIT | 1 << EXT_FID_RAW_PRINT - EXT_FID_INIT | 1 << EXT_FID_RAW_PRINT_BOLD - EXT_FID_INIT | 1 << EXT_FID_NHBELL - EXT_FID_INIT, 1 << EXT_FID_NUMBER_PAD - EXT_FID_YN_FUNCTION | 1 << EXT_FID_DELAY_OUTPUT - EXT_FID_YN_FUNCTION | 1 << EXT_FID_CHANGE_COLOR - EXT_FID_YN_FUNCTION | 1 << EXT_FID_CHANGE_BACKGROUND - EXT_FID_YN_FUNCTION | 1 << EXT_FID_START_SCREEN - EXT_FID_YN_FUNCTION | 1 << EXT_FID_END_SCREEN - EXT_FID_YN_FUNCTION | 1 << EXT_FID_PREFERENCE_UPDATE - EXT_FID_YN_FUNCTION | 1 << EXT_FID_STATUS - EXT_FID_YN_FUNCTION | 1 << EXT_FID_PRINT_GLYPH_LAYERED - EXT_FID_YN_FUNCTION, }; static void proxy_svc_init(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { int i; struct proxycb_subprot2_init async_request, async_reply; if (proxy_svc_protocol > 1) { async_request.masks = (unsigned long *)0; nhext_rpc_params(request, 1, EXT_XDRF(proxycb_xdr_subprot2_init, &async_request)); if (proxy_clnt_log) { nhext_io_printf(proxy_clnt_log, "[%u] init(<", nhext_svc_get_serial()); for(i = 0; i < async_request.n_masks; i++) { if (i) nhext_io_printf(proxy_clnt_log, ", "); nhext_io_printf(proxy_clnt_log, "0x%08lX", async_request.masks[i]); } nhext_io_printf(proxy_clnt_log, ">)\n"); } nhext_set_async_masks(async_request.n_masks, async_request.masks); free(async_request.masks); } else if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] init()\n", nhext_svc_get_serial()); if (proxy_ini) (*proxy_ini)(); if (proxy_svc_protocol > 1) { async_reply.n_masks = SIZE(async_procedures); async_reply.masks = async_procedures; if (proxy_clnt_log) { nhext_io_printf(proxy_clnt_log, "[%u] init = <", nhext_svc_get_serial()); for(i = 0; i < async_reply.n_masks; i++) { if (i) nhext_io_printf(proxy_clnt_log, ", "); nhext_io_printf(proxy_clnt_log, "0x%08lX", async_reply.masks[i]); } nhext_io_printf(proxy_clnt_log, ">\n"); } nhext_rpc_params(reply, 1, EXT_XDRF(proxycb_xdr_subprot2_init, &async_reply)); } else nhext_rpc_params(reply, 0); } static void proxy_svc_init_nhwindows(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { int i; struct proxy_init_nhwindow_req req = { 0, (char **)0 }; struct proxy_init_nhwindow_res res; nhext_rpc_params(request, 1, EXT_XDRF(proxy_xdr_init_nhwindow_req, &req)); if (proxy_clnt_log) { nhext_io_printf(proxy_clnt_log, "[%u] init_nhwindows(<", nhext_svc_get_serial()); for(i = 0; i < req.argc; i++) { if (i) nhext_io_printf(proxy_clnt_log, ", "); nhext_io_printf(proxy_clnt_log, "\"%s\"", req.argv[i]); } nhext_io_printf(proxy_clnt_log, ">)\n"); } res.argc = req.argc; res.argv = req.argv; res.capc = 0; res.capv = (char **)0; res.inited = (*proxy_svc->winext_init_nhwindows)(&res.argc, res.argv, &res.capv); if (res.capv) for(res.capc = 0; res.capv[res.capc]; res.capc++) ; if (proxy_clnt_log) { nhext_io_printf(proxy_clnt_log, "[%u] init_nhwindows = %s, <", nhext_svc_get_serial(), res.inited ? "TRUE" : "FALSE"); for(i = 0; i < res.argc; i++) { if (i) nhext_io_printf(proxy_clnt_log, ", "); nhext_io_printf(proxy_clnt_log, "\"%s\"", res.argv[i]); } nhext_io_printf(proxy_clnt_log, ">, <"); for(i = 0; i < res.capc; i++) { if (i) nhext_io_printf(proxy_clnt_log, ", "); nhext_io_printf(proxy_clnt_log, "\"%s\"", res.capv[i]); } nhext_io_printf(proxy_clnt_log, ">\n"); } nhext_rpc_params(reply, 1, EXT_XDRF(proxy_xdr_init_nhwindow_res, &res)); } static void proxy_svc_player_selection(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { int role, race, gend, align; nhext_xdr_bool_t quit; nhext_rpc_params(request, 4, EXT_INT_P(role), EXT_INT_P(race), EXT_INT_P(gend), EXT_INT_P(align)); if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] player_selection(%d, %d, %d, %d)\n", nhext_svc_get_serial(), role, race, gend, align); quit = (nhext_xdr_bool_t) (*proxy_svc->winext_player_selection)(&role, &race, &gend, &align); if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] player_selection = %d, %d, %d, %d, %s\n", nhext_svc_get_serial(), role, race, gend, align, quit ? "TRUE" : "FALSE"); nhext_rpc_params(reply, 5, EXT_INT(role), EXT_INT(race), EXT_INT(gend), EXT_INT(align), EXT_BOOLEAN(quit)); } static void proxy_svc_askname(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { char *plname; if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] askname()\n", nhext_svc_get_serial()); plname = (*proxy_svc->winext_askname)(); if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] askname = \"%s\"\n", nhext_svc_get_serial(), plname); nhext_rpc_params(reply, 1, EXT_STRING(plname)); free(plname); } static void proxy_svc_get_nh_event(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] get_nh_event()\n", nhext_svc_get_serial()); if (proxy_svc->winext_get_nh_event) (*proxy_svc->winext_get_nh_event)(); else if (proxy_svc_protocol > 1) { if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] get_nh_event not supported\n", nhext_svc_get_serial()); nhext_send_error(id, EXT_ERROR_UNSUPPORTED); } if (!nhext_async_mode()) nhext_rpc_params(reply, 0); } static void proxy_svc_exit_nhwindows(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { char *str = (char *)0; nhext_rpc_params(request, 1, EXT_STRING_P(str)); if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] exit_nhwindows(\"%s\")\n", nhext_svc_get_serial(), str); (*proxy_svc->winext_exit_nhwindows)(str); free(str); if (!nhext_async_mode()) nhext_rpc_params(reply, 0); } static void proxy_svc_suspend_nhwindows(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { char *str = (char *)0; nhext_rpc_params(request, 1, EXT_STRING_P(str)); if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] suspend_nhwindows(\"%s\")\n", nhext_svc_get_serial(), str); if (proxy_svc->winext_suspend_nhwindows) (*proxy_svc->winext_suspend_nhwindows)(str); else if (proxy_svc_protocol > 1) { if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] suspend_nhwindows not supported\n", nhext_svc_get_serial()); nhext_send_error(id, EXT_ERROR_UNSUPPORTED); } free(str); if (!nhext_async_mode()) nhext_rpc_params(reply, 0); } static void proxy_svc_resume_nhwindows(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] resume_nhwindows()\n", nhext_svc_get_serial()); if (proxy_svc->winext_resume_nhwindows) (*proxy_svc->winext_resume_nhwindows)(); else if (proxy_svc_protocol > 1) { if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] resume_nhwindows not supported\n", nhext_svc_get_serial()); nhext_send_error(id, EXT_ERROR_UNSUPPORTED); } if (!nhext_async_mode()) nhext_rpc_params(reply, 0); } static void proxy_svc_create_nhwindow(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { int type; int window; static const char *nhwindow_types[] = { NULL, "NHW_MESSAGE", "NHW_STATUS", "NHW_MAP", "NHW_MENU", "NHW_TEXT" }; nhext_rpc_params(request, 1, EXT_INT_P(type)); if (proxy_clnt_log) { if (type >= 1 && type < SIZE(nhwindow_types)) nhext_io_printf(proxy_clnt_log, "[%u] create_nhwindow(%s)\n", nhext_svc_get_serial(), nhwindow_types[type]); else nhext_io_printf(proxy_clnt_log, "[%u] create_nhwindow(%d)\n", nhext_svc_get_serial(), type); } window = (*proxy_svc->winext_create_nhwindow)(type); if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] create_nhwindow = %d\n", nhext_svc_get_serial(), window); nhext_rpc_params(reply, 1, EXT_INT(window)); } static void proxy_svc_clear_nhwindow(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { int window, rows, cols, layers; nhext_rpc_params(request, 4, EXT_INT_P(window), EXT_INT_P(rows), EXT_INT_P(cols), EXT_INT_P(layers)); if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] clear_nhwindow(%d, %d, %d, %d)\n", nhext_svc_get_serial(), window, rows, cols, layers); (*proxy_svc->winext_clear_nhwindow)(window, rows, cols, layers); if (!nhext_async_mode()) nhext_rpc_params(reply, 0); } static void proxy_svc_display_nhwindow(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { int window; nhext_xdr_bool_t blocking; nhext_rpc_params(request, 2, EXT_INT_P(window), EXT_BOOLEAN_P(blocking)); if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] display_nhwindow(%d, %s)\n", nhext_svc_get_serial(), window, blocking ? "TRUE" : "FALSE"); (*proxy_svc->winext_display_nhwindow)(window, blocking); if (!nhext_async_mode()) nhext_rpc_params(reply, 0); } static void proxy_svc_destroy_nhwindow(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { int window; nhext_rpc_params(request, 1, EXT_INT_P(window)); if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] destroy_nhwindow(%d)\n", nhext_svc_get_serial(), window); (*proxy_svc->winext_destroy_nhwindow)(window); if (!nhext_async_mode()) nhext_rpc_params(reply, 0); } static void proxy_svc_curs(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { int window; int x, y; nhext_rpc_params(request, 3, EXT_INT_P(window), EXT_INT_P(x), EXT_INT_P(y)); if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] curs(%d, %d, %d)\n", nhext_svc_get_serial(), window, x, y); (*proxy_svc->winext_curs)(window, x, y); if (!nhext_async_mode()) nhext_rpc_params(reply, 0); } static void proxy_svc_putstr(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { int window; int attr; char *str = (char *)0; static const char *nhwindow_atrs[] = { "ATR_NONE", "ATR_BOLD", "ATR_DIM", "ATR_ULINE", "ATR_BLINK", "ATR_INVERSE" }; nhext_rpc_params(request, 3, EXT_INT_P(window), EXT_INT_P(attr), EXT_STRING_P(str)); if (proxy_clnt_log) { if (attr >= 0 && attr < SIZE(nhwindow_atrs)) nhext_io_printf(proxy_clnt_log, "[%u] putstr(%d, %s, \"%s\")\n", nhext_svc_get_serial(), window, nhwindow_atrs[attr], str); else nhext_io_printf(proxy_clnt_log, "[%u] putstr(%d, %d, \"%s\")\n", nhext_svc_get_serial(), window, attr, str); } (*proxy_svc->winext_putstr)(window, attr, str); free(str); if (!nhext_async_mode()) nhext_rpc_params(reply, 0); } static void proxy_svc_display_file(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { int fh; nhext_rpc_params(request, 1, EXT_INT_P(fh)); if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] display_file(%d)\n", nhext_svc_get_serial(), fh); (*proxy_svc->winext_display_file)(fh); nhext_rpc_params(reply, 0); } static void proxy_svc_start_menu(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { int window; nhext_rpc_params(request, 1, EXT_INT_P(window)); if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] start_menu(%d)\n", nhext_svc_get_serial(), window); (*proxy_svc->winext_start_menu)(window); if (!nhext_async_mode()) nhext_rpc_params(reply, 0); } static void proxy_svc_add_menu(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { int window; int glyph, identifier, accelerator, groupacc, attr; char *str = (char *)0; nhext_xdr_bool_t preselected; nhext_rpc_params(request, 8, EXT_INT_P(window), EXT_INT_P(glyph), EXT_INT_P(identifier), EXT_INT_P(accelerator), EXT_INT_P(groupacc), EXT_INT_P(attr), EXT_STRING_P(str), EXT_BOOLEAN_P(preselected)); if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] add_menu(%d, %d, %d, %d, %d, %d, \"%s\", %s)\n", nhext_svc_get_serial(), window, glyph, identifier, accelerator, groupacc, attr, str, preselected ? "TRUE" : "FALSE"); (*proxy_svc->winext_add_menu)(window, glyph, identifier, accelerator, groupacc, attr, str, preselected); free(str); if (!nhext_async_mode()) nhext_rpc_params(reply, 0); } static void proxy_svc_end_menu(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { int window; char *prompt = (char *)0; nhext_rpc_params(request, 2, EXT_INT_P(window), EXT_STRING_P(prompt)); if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] end_menu(%d, \"%s\")\n", nhext_svc_get_serial(), window, prompt); (*proxy_svc->winext_end_menu)(window, prompt); free(prompt); if (!nhext_async_mode()) nhext_rpc_params(reply, 0); } static void proxy_svc_select_menu(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { int i; int window; int how; struct proxy_mi *selected; struct proxy_select_menu_res ret; static const char *menu_picks[] = { "PICK_NONE", "PICK_ONE", "PICK_ANY" }; nhext_rpc_params(request, 2, EXT_INT_P(window), EXT_INT_P(how)); if (proxy_clnt_log) { if (how >= 0 && how < SIZE(menu_picks)) nhext_io_printf(proxy_clnt_log, "[%u] select_menu(%d, %s)\n", nhext_svc_get_serial(), window, menu_picks[how]); else nhext_io_printf(proxy_clnt_log, "[%u] select_menu(%d, %d)\n", nhext_svc_get_serial(), window, how); } ret.retval = (*proxy_svc->winext_select_menu)(window, how, &selected); ret.n = ret.retval > 0 && selected ? ret.retval : 0; if (ret.n) { ret.selected = (struct proxy_mi *)alloc(ret.n * sizeof (struct proxy_mi)); for(i = 0; i < ret.n; i++) { ret.selected[i].item = selected[i].item; ret.selected[i].count = selected[i].count; } } else ret.selected = (struct proxy_mi *)0; if (proxy_clnt_log) { int i; nhext_io_printf(proxy_clnt_log, "[%u] select_menu = %d, <", nhext_svc_get_serial(), ret.retval); for(i = 0; i < ret.n; i++) { if (i) nhext_io_printf(proxy_clnt_log, ", "); nhext_io_printf(proxy_clnt_log, "{%d, %ld}", ret.selected[i].item, ret.selected[i].count); } nhext_io_printf(proxy_clnt_log, ">\n"); } nhext_rpc_params(reply, 1, EXT_XDRF(proxy_xdr_select_menu_res, &ret)); if (ret.n) free(ret.selected); } static void proxy_svc_message_menu(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { int retval; int let, how; char *mesg = (char *)0; nhext_rpc_params(request, 3, EXT_INT_P(let), EXT_INT_P(how), EXT_STRING_P(mesg)); if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] message_menu(%d, %d, \"%s\")\n", nhext_svc_get_serial(), let, how, mesg); retval = (*proxy_svc->winext_message_menu)(let, how, mesg); if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] message_menu = %d\n", nhext_svc_get_serial(), retval); nhext_rpc_params(reply, 1, EXT_INT(retval)); free(mesg); } static void proxy_svc_update_inventory(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] update_inventory()\n", nhext_svc_get_serial()); if (proxy_svc->winext_update_inventory) (*proxy_svc->winext_update_inventory)(); else if (proxy_svc_protocol > 1) { if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] update_inventory not supported\n", nhext_svc_get_serial()); nhext_send_error(id, EXT_ERROR_UNSUPPORTED); } if (!nhext_async_mode()) nhext_rpc_params(reply, 0); } static void proxy_svc_mark_synch(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] mark_sync()\n", nhext_svc_get_serial()); if (proxy_svc->winext_mark_synch) (*proxy_svc->winext_mark_synch)(); else if (proxy_svc_protocol > 1) { if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] mark_sync not supported\n", nhext_svc_get_serial()); nhext_send_error(id, EXT_ERROR_UNSUPPORTED); } if (!nhext_async_mode()) nhext_rpc_params(reply, 0); } static void proxy_svc_wait_synch(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] wait_sync()\n", nhext_svc_get_serial()); if (proxy_svc->winext_wait_synch) (*proxy_svc->winext_wait_synch)(); else if (proxy_svc_protocol > 1) { if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] wait_sync not supported\n", nhext_svc_get_serial()); nhext_send_error(id, EXT_ERROR_UNSUPPORTED); } if (!nhext_async_mode()) nhext_rpc_params(reply, 0); } static void proxy_svc_cliparound(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { int x, y; nhext_rpc_params(request, 2, EXT_INT_P(x), EXT_INT_P(y)); if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] cliparound(%d, %d)\n", nhext_svc_get_serial(), x, y); if (proxy_svc->winext_cliparound) (*proxy_svc->winext_cliparound)(x, y); else if (proxy_svc_protocol > 1) { if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] cliparound not supported\n", nhext_svc_get_serial()); nhext_send_error(id, EXT_ERROR_UNSUPPORTED); } if (!nhext_async_mode()) nhext_rpc_params(reply, 0); } static void proxy_svc_update_positionbar(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { char *posbar = (char *)0; nhext_rpc_params(request, 1, EXT_STRING_P(posbar)); if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] update_positionbar(\"%s\")\n", nhext_svc_get_serial(), posbar); if (proxy_svc->winext_update_positionbar) (*proxy_svc->winext_update_positionbar)(posbar); else if (proxy_svc_protocol > 1) { if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] update_positionbar not supported\n", nhext_svc_get_serial()); nhext_send_error(id, EXT_ERROR_UNSUPPORTED); } free(posbar); if (!nhext_async_mode()) nhext_rpc_params(reply, 0); } static void proxy_svc_print_glyph(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { int window; int x, y, glyph; nhext_rpc_params(request, 4, EXT_INT_P(window), EXT_INT_P(x), EXT_INT_P(y), EXT_INT_P(glyph)); if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] print_glyph(%d, %d, %d, %d)\n", nhext_svc_get_serial(), window, x, y, glyph); (*proxy_svc->winext_print_glyph)(window, x, y, glyph); if (!nhext_async_mode()) nhext_rpc_params(reply, 0); } static void proxy_svc_raw_print(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { char *str = (char *)0; nhext_rpc_params(request, 1, EXT_STRING_P(str)); if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] raw_print(\"%s\"", nhext_svc_get_serial(), str); (*proxy_svc->winext_raw_print)(str); free(str); if (!nhext_async_mode()) nhext_rpc_params(reply, 0); } static void proxy_svc_raw_print_bold(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { char *str = (char *)0; nhext_rpc_params(request, 1, EXT_STRING_P(str)); if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] raw_print_bold(\"%s\"", nhext_svc_get_serial(), str); (*proxy_svc->winext_raw_print_bold)(str); free(str); if (!nhext_async_mode()) nhext_rpc_params(reply, 0); } static void proxy_svc_nhgetch(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { int ret; if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] nhgetch()\n", nhext_svc_get_serial()); ret = (*proxy_svc->winext_nhgetch)(); if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] nhgetch = %d\n", nhext_svc_get_serial(), ret); nhext_rpc_params(reply, 1, EXT_INT(ret)); } static void proxy_svc_nh_poskey(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { int ret, lx, ly, lmod; const char *mouse_clicks[] = { NULL, "CLICK_1", "CLICK_2" }; if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] nh_poskey()\n", nhext_svc_get_serial()); ret = (*proxy_svc->winext_nh_poskey)(&lx, &ly, &lmod); if (proxy_clnt_log) { if (lmod >= 1 && lmod < SIZE(mouse_clicks)) nhext_io_printf(proxy_clnt_log, "[%u] nh_poskey = %d, %d, %d, %s\n", nhext_svc_get_serial(), ret, lx, ly, mouse_clicks[lmod]); else nhext_io_printf(proxy_clnt_log, "[%u] nh_poskey = %d, %d, %d, %d\n", nhext_svc_get_serial(), ret, lx, ly, lmod); } nhext_rpc_params(reply, 4, EXT_INT(ret), EXT_INT(lx), EXT_INT(ly), EXT_INT(lmod)); } static void proxy_svc_nhbell(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] nhbell()\n", nhext_svc_get_serial()); if (proxy_svc->winext_nhbell) (*proxy_svc->winext_nhbell)(); else if (proxy_svc_protocol > 1) { if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] nhbell not supported\n", nhext_svc_get_serial()); nhext_send_error(id, EXT_ERROR_UNSUPPORTED); } if (!nhext_async_mode()) nhext_rpc_params(reply, 0); } static void proxy_svc_doprev_message(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { int ret; if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] doprev_message()\n", nhext_svc_get_serial()); if (proxy_svc->winext_doprev_message) ret = (*proxy_svc->winext_doprev_message)(); else { if (proxy_svc_protocol > 1) { if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] doprev_message not supported\n", nhext_svc_get_serial()); nhext_send_error(id, EXT_ERROR_UNSUPPORTED); } ret = 0; } if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] doprev_message = %d\n", nhext_svc_get_serial(), ret); nhext_rpc_params(reply, 1, EXT_INT(ret)); } static void proxy_svc_yn_function(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { int retval, count = 0, def; char *ques = (char *)0, *choices = (char *)0; nhext_rpc_params(request, 3, EXT_STRING_P(ques), EXT_STRING_P(choices), EXT_INT_P(def)); if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] yn_function(\"%s\", \"%s\", %d)\n", nhext_svc_get_serial(), ques, choices, def); retval = (*proxy_svc->winext_yn_function)(ques, choices, def, &count); if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] yn_function = %d, %d\n", nhext_svc_get_serial(), retval, count); nhext_rpc_params(reply, 2, EXT_INT(retval), EXT_INT(count)); free(ques); free(choices); } static void proxy_svc_getlin(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { char *ques = (char *)0, *input; nhext_rpc_params(request, 1, EXT_STRING_P(ques)); if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] getlin(\"%s\")\n", nhext_svc_get_serial(), ques); input = (*proxy_svc->winext_getlin)(ques); if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] getlin = \"%s\"\n", nhext_svc_get_serial(), input); nhext_rpc_params(reply, 1, EXT_STRING(input)); free(ques); free(input); } static void proxy_svc_get_ext_cmd(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { int extcmd; if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] get_ext_cmd()\n", nhext_svc_get_serial()); extcmd = (*proxy_svc->winext_get_ext_cmd)(); if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] get_ext_cmd = %d\n", nhext_svc_get_serial(), extcmd); nhext_rpc_params(reply, 1, EXT_INT(extcmd)); } static void proxy_svc_number_pad(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { int state; const char *number_pad_modes[] = { "NP_KEYPAD", NULL, "NP_NUMERIC" }; nhext_rpc_params(request, 1, EXT_INT_P(state)); if (proxy_clnt_log) { if (state == -1 || state == 1) nhext_io_printf(proxy_clnt_log, "[%u] number_pad(%s)\n", nhext_svc_get_serial(), number_pad_modes[state]); else nhext_io_printf(proxy_clnt_log, "[%u] number_pad(%d)\n", nhext_svc_get_serial(), state); } if (proxy_svc->winext_number_pad) (*proxy_svc->winext_number_pad)(state); else if (proxy_svc_protocol > 1) { if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] number_pad not supported\n", nhext_svc_get_serial()); nhext_send_error(id, EXT_ERROR_UNSUPPORTED); } if (!nhext_async_mode()) nhext_rpc_params(reply, 0); } static void proxy_svc_delay_output(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] delay_output()\n", nhext_svc_get_serial()); if (proxy_svc->winext_delay_output) (*proxy_svc->winext_delay_output)(); else if (proxy_svc_protocol > 1) { if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] delay_output not supported\n", nhext_svc_get_serial()); nhext_send_error(id, EXT_ERROR_UNSUPPORTED); } if (!nhext_async_mode()) nhext_rpc_params(reply, 0); } static void proxy_svc_change_color(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { int color; long rgb; nhext_xdr_bool_t reverse; nhext_rpc_params(request, 3, EXT_INT_P(color), EXT_LONG_P(rgb), EXT_BOOLEAN_P(reverse)); if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] change_color(%d, %ld, %s)\n", nhext_svc_get_serial(), color, rgb, reverse ? "TRUE" : "FALSE"); if (proxy_svc->winext_change_color) (*proxy_svc->winext_change_color)(color, rgb, reverse); else if (proxy_svc_protocol > 1) { if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] change_color not supported\n", nhext_svc_get_serial()); nhext_send_error(id, EXT_ERROR_UNSUPPORTED); } if (!nhext_async_mode()) nhext_rpc_params(reply, 0); } static void proxy_svc_change_background(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { nhext_xdr_bool_t white_or_black; nhext_rpc_params(request, 1, EXT_BOOLEAN_P(white_or_black)); if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] change_background(%s)\n", nhext_svc_get_serial(), white_or_black ? "TRUE" : "FALSE"); if (proxy_svc->winext_change_background) (*proxy_svc->winext_change_background)(white_or_black); else if (proxy_svc_protocol > 1) { nhext_send_error(id, EXT_ERROR_UNSUPPORTED); if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] change_background not supported\n", nhext_svc_get_serial()); } if (!nhext_async_mode()) nhext_rpc_params(reply, 0); } static void proxy_svc_set_font_name(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { int window; char *font = (char *)0; int ret; nhext_rpc_params(request, 2, EXT_INT_P(window), EXT_STRING_P(font)); if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] set_font_name(%d, \"%s\")\n", nhext_svc_get_serial(), window, font); if (proxy_svc->winext_set_font_name) ret = (*proxy_svc->winext_set_font_name)(window, font); else { if (proxy_svc_protocol > 1) { if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] set_font_name not supported\n", nhext_svc_get_serial()); nhext_send_error(id, EXT_ERROR_UNSUPPORTED); } ret = -1; } if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] set_font_name = %d\n", nhext_svc_get_serial(), ret); nhext_rpc_params(reply, 1, EXT_INT(ret)); free(font); } static void proxy_svc_get_color_string(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { char *ret; if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] get_color_string()\n", nhext_svc_get_serial()); if (proxy_svc->winext_get_color_string) ret = (*proxy_svc->winext_get_color_string)(); else { if (proxy_svc_protocol > 1) { if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] get_color_string not supported\n", nhext_svc_get_serial()); nhext_send_error(id, EXT_ERROR_UNSUPPORTED); } ret = ""; } if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] get_color_string = \"%s\"\n", nhext_svc_get_serial(), ret); nhext_rpc_params(reply, 1, EXT_STRING(ret)); free(ret); } static void proxy_svc_start_screen(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] start_screen()\n", nhext_svc_get_serial()); if (proxy_svc->winext_start_screen) (*proxy_svc->winext_start_screen)(); else if (proxy_svc_protocol > 1) { if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] start_screen not supported\n", nhext_svc_get_serial()); nhext_send_error(id, EXT_ERROR_UNSUPPORTED); } if (!nhext_async_mode()) nhext_rpc_params(reply, 0); } static void proxy_svc_end_screen(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] end_screen()\n", nhext_svc_get_serial()); if (proxy_svc->winext_end_screen) (*proxy_svc->winext_end_screen)(); else if (proxy_svc_protocol > 1) { if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] end_screen not supported\n", nhext_svc_get_serial()); nhext_send_error(id, EXT_ERROR_UNSUPPORTED); } if (!nhext_async_mode()) nhext_rpc_params(reply, 0); } static void proxy_svc_outrip(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { int window; char *killed_by = (char *)0; nhext_xdr_bool_t handled; nhext_rpc_params(request, 2, EXT_INT_P(window), EXT_STRING_P(killed_by)); if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] outrip(%d, \"%s\")\n", nhext_svc_get_serial(), window, killed_by); handled = (nhext_xdr_bool_t)(*proxy_svc->winext_outrip)(window, killed_by); if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] outrip = %s\n", nhext_svc_get_serial(), handled ? "TRUE" : "FALSE"); nhext_rpc_params(reply, 1, EXT_BOOLEAN(handled)); free(killed_by); } static void proxy_svc_preference_update(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { char *optnam = (char *)0; char *value = (char *)0; nhext_rpc_params(request, 2, EXT_STRING_P(optnam), EXT_STRING_P(value)); if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] preference_update(\"%s\", \"%s\")\n", nhext_svc_get_serial(), optnam, value); (*proxy_svc->winext_preference_update)(optnam, value); if (!nhext_async_mode()) nhext_rpc_params(reply, 0); free(optnam); free(value); } static void proxy_svc_status(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { struct proxy_status_req req = { 0, 0, (const char **)0 }; nhext_rpc_params(request, 1, EXT_XDRF(proxy_xdr_status_req, &req)); if (proxy_clnt_log) { int i; nhext_io_printf(proxy_clnt_log, "[%u] status(%d, <", nhext_svc_get_serial(), req.reconfig); for(i = 0; i < req.nv; i++) { if (i) nhext_io_printf(proxy_clnt_log, ", "); nhext_io_printf(proxy_clnt_log, "\"%s\"", req.values[i]); } nhext_io_printf(proxy_clnt_log, ">\n"); } (*proxy_svc->winext_status)(req.reconfig, req.nv, req.values); if (!nhext_async_mode()) nhext_rpc_params(reply, 0); } static void proxy_svc_print_glyph_layered(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { int i, j; struct proxy_print_glyph_layered_req req = { 0, 0, 0 }; nhext_rpc_params(request, 1, EXT_XDRF(proxy_xdr_print_glyph_layered_req, &req)); if (proxy_clnt_log) { int k, ng; nhext_io_printf(proxy_clnt_log, "[%u] print_glyph_layered(%d, <\n ", nhext_svc_get_serial(), req.window); for(i = 0; i < req.nl; i++) { if (i) nhext_io_printf(proxy_clnt_log, ",\n "); ng = 0; for(j = 0; j < req.layers[i].nr; j++) ng += req.layers[i].rows[j].ng; nhext_io_printf(proxy_clnt_log, "%d, <%s", req.layers[i].start, ng > 10 ? "\n " : ""); for(j = 0; j < req.layers[i].nr; j++) { if (j) nhext_io_printf(proxy_clnt_log, ng > 10 ? ",\n " : ", "); nhext_io_printf(proxy_clnt_log, "%d, <", req.layers[i].rows[j].start); for(k = 0; k < req.layers[i].rows[j].ng; k++) { if (k) nhext_io_printf(proxy_clnt_log, ", "); nhext_io_printf(proxy_clnt_log, "%d", req.layers[i].rows[j].glyphs[k]); } nhext_io_printf(proxy_clnt_log, ">"); } nhext_io_printf(proxy_clnt_log, ng > 10 ? "\n >" : ">"); } nhext_io_printf(proxy_clnt_log, "\n >\n"); } (*proxy_svc->winext_print_glyph_layered)(req.window, req.nl, req.layers); for(i = 0; i < req.nl; i++) { for(j = 0; j < req.layers[i].nr; j++) free(req.layers[i].rows[j].glyphs); free(req.layers[i].rows); } free(req.layers); if (!nhext_async_mode()) nhext_rpc_params(reply, 0); } static void proxy_svc_send_config_file(id, request, reply) unsigned short id; NhExtXdr *request, *reply; { int fh; nhext_rpc_params(request, 1, EXT_INT_P(fh)); if (proxy_clnt_log) nhext_io_printf(proxy_clnt_log, "[%u] send_config_file(%d)\n", nhext_svc_get_serial(), fh); (*proxy_svc->winext_send_config_file)(fh); nhext_rpc_params(reply, 0); } static struct nhext_svc services[] = { EXT_FID_INIT, proxy_svc_init, EXT_FID_INIT_NHWINDOWS, proxy_svc_init_nhwindows, EXT_FID_PLAYER_SELECTION, proxy_svc_player_selection, EXT_FID_ASKNAME, proxy_svc_askname, EXT_FID_GET_NH_EVENT, proxy_svc_get_nh_event, EXT_FID_EXIT_NHWINDOWS, proxy_svc_exit_nhwindows, EXT_FID_SUSPEND_NHWINDOWS, proxy_svc_suspend_nhwindows, EXT_FID_RESUME_NHWINDOWS, proxy_svc_resume_nhwindows, EXT_FID_CREATE_NHWINDOW, proxy_svc_create_nhwindow, EXT_FID_CLEAR_NHWINDOW, proxy_svc_clear_nhwindow, EXT_FID_DISPLAY_NHWINDOW, proxy_svc_display_nhwindow, EXT_FID_DESTROY_NHWINDOW, proxy_svc_destroy_nhwindow, EXT_FID_CURS, proxy_svc_curs, EXT_FID_PUTSTR, proxy_svc_putstr, EXT_FID_DISPLAY_FILE, proxy_svc_display_file, EXT_FID_START_MENU, proxy_svc_start_menu, EXT_FID_ADD_MENU, proxy_svc_add_menu, EXT_FID_END_MENU, proxy_svc_end_menu, EXT_FID_SELECT_MENU, proxy_svc_select_menu, EXT_FID_MESSAGE_MENU, proxy_svc_message_menu, EXT_FID_UPDATE_INVENTORY, proxy_svc_update_inventory, EXT_FID_MARK_SYNC, proxy_svc_mark_synch, EXT_FID_WAIT_SYNC, proxy_svc_wait_synch, EXT_FID_CLIPAROUND, proxy_svc_cliparound, EXT_FID_UPDATE_POSITIONBAR, proxy_svc_update_positionbar, EXT_FID_PRINT_GLYPH, proxy_svc_print_glyph, EXT_FID_RAW_PRINT, proxy_svc_raw_print, EXT_FID_RAW_PRINT_BOLD, proxy_svc_raw_print_bold, EXT_FID_NHGETCH, proxy_svc_nhgetch, EXT_FID_NH_POSKEY, proxy_svc_nh_poskey, EXT_FID_NHBELL, proxy_svc_nhbell, EXT_FID_DOPREV_MESSAGE, proxy_svc_doprev_message, EXT_FID_YN_FUNCTION, proxy_svc_yn_function, EXT_FID_GETLIN, proxy_svc_getlin, EXT_FID_GET_EXT_CMD, proxy_svc_get_ext_cmd, EXT_FID_NUMBER_PAD, proxy_svc_number_pad, EXT_FID_DELAY_OUTPUT, proxy_svc_delay_output, EXT_FID_CHANGE_COLOR, proxy_svc_change_color, EXT_FID_CHANGE_BACKGROUND, proxy_svc_change_background, EXT_FID_SET_FONT_NAME, proxy_svc_set_font_name, EXT_FID_GET_COLOR_STRING, proxy_svc_get_color_string, EXT_FID_START_SCREEN, proxy_svc_start_screen, EXT_FID_END_SCREEN, proxy_svc_end_screen, EXT_FID_OUTRIP, proxy_svc_outrip, EXT_FID_PREFERENCE_UPDATE, proxy_svc_preference_update, EXT_FID_STATUS, proxy_svc_status, EXT_FID_PRINT_GLYPH_LAYERED, proxy_svc_print_glyph_layered, EXT_FID_SEND_CONFIG_FILE, proxy_svc_send_config_file, 0, NULL, }; void proxy_svc_set_ext_procs(ini_routine, windowprocs) void NDECL((*ini_routine)); struct window_ext_procs *windowprocs; { proxy_ini = ini_routine; proxy_svc = windowprocs; } #ifdef DEBUG static void debug_dump(buf, len, arrow) void *buf; unsigned int len; char *arrow; { int i, j, nc; long l; char cbuf[17]; unsigned char *bp = buf; for(i = 0; i < len; ) { if ((i & 15) == 0) { if (!i) fputs(arrow, stderr); else { cbuf[16] = '\0'; while(nc++ < 40) fputc(' ', stderr); fputs(cbuf, stderr); fputs("\n ", stderr); } nc = 2; } if (len - i >= 4) { l = (long)bp[i] << 24 | (long)bp[i + 1] << 16 | (long)bp[i + 2] << 8 | bp[i + 3]; fprintf(stderr, " %08X", l); nc += 9; for(j = 0; j < 4; j++, i++) cbuf[i & 15] = isgraph(bp[i]) || bp[i] == ' ' ? bp[i] : '.'; } else { fprintf(stderr, " %02X", bp[i]); nc += 3; cbuf[i & 15] = isgraph(bp[i]) || bp[i] == ' ' ? bp[i] : '.'; i++; } } if (len) { cbuf[i & 15 ? i & 15 : 16] = '\0'; while(nc++ < 40) fputc(' ', stderr); fputs(cbuf, stderr); } fputc('\n', stderr); } struct debug_handle { nhext_io_func f; void *h; char *arrow; }; static int debug_snoop(handle, buf, len) void *handle; void *buf; unsigned int len; { int retval; struct debug_handle *h = (struct debug_handle *)handle; retval = h->f(h->h, buf, len); if (retval == -2) fprintf(stderr, "%s PENDING\n", h->arrow); else if (retval < 0) fprintf(stderr, "%s ERROR\n", h->arrow); else debug_dump(buf, retval, h->arrow); return retval; } #endif /* DEBUG */ static struct nhext_line *win_proxy_clnt_subprotocol0_lp; static struct nhext_line *win_proxy_clnt_subprotocol0_resp; char * win_proxy_clnt_gettag(tag) const char *tag; { int i; for(i = 0; i < win_proxy_clnt_subprotocol0_lp->n; i++) if (!strcmp(win_proxy_clnt_subprotocol0_lp->tags[i], tag)) return win_proxy_clnt_subprotocol0_lp->values[i]; return (char *)0; } /* * Returns non-zero on error */ int win_proxy_clnt_settag(tag, value) const char *tag, *value; { int i; char **new; for(i = 0; i < win_proxy_clnt_subprotocol0_resp->n; i++) if (!strcmp(win_proxy_clnt_subprotocol0_resp->tags[i], tag)) { free(win_proxy_clnt_subprotocol0_resp->values[i]); win_proxy_clnt_subprotocol0_resp->values[i] = strdup(value); return !win_proxy_clnt_subprotocol0_resp->values[i]; } new = (char **)realloc(win_proxy_clnt_subprotocol0_resp->tags, (i + 1) * sizeof(char *)); if (!new) return 1; win_proxy_clnt_subprotocol0_resp->tags = new; new = (char **)realloc(win_proxy_clnt_subprotocol0_resp->values, (i + 1) * sizeof(char *)); if (!new) return 1; win_proxy_clnt_subprotocol0_resp->values = new; win_proxy_clnt_subprotocol0_resp->tags[i] = strdup(tag); if (!win_proxy_clnt_subprotocol0_resp->tags[i]) return 1; win_proxy_clnt_subprotocol0_resp->values[i] = strdup(value); if (!win_proxy_clnt_subprotocol0_resp->values[i]) { free(win_proxy_clnt_subprotocol0_resp->tags[i]); return 1; } win_proxy_clnt_subprotocol0_resp->n++; return 0; } void win_proxy_clnt_set_flags(unsigned long mask, unsigned long value) { proxy_clnt_flags &= ~mask; proxy_clnt_flags |= mask & value; } int win_proxy_clnt_log_open(nhext_io_func func, void *handle) { if (proxy_clnt_log) nhext_io_close(proxy_clnt_log); if (func) proxy_clnt_log = nhext_io_open(func, handle, NHEXT_IO_WRONLY | NHEXT_IO_LINEBUF); else proxy_clnt_log = (NhExtIO *)0; return !!proxy_clnt_log; } #ifdef DEBUG_RPC static int debug_rpc_out(handle, buf, len) void *handle; void *buf; unsigned int len; { return write(2, buf, len); } #endif static proxy_clnt_authhandler proxy_clnt_auth_handler = NULL; proxy_clnt_authhandler proxy_clnt_set_authhandler(proxy_clnt_authhandler new) { proxy_clnt_authhandler old = proxy_clnt_auth_handler; proxy_clnt_auth_handler = new; return old; } int win_proxy_clnt_init(read_f, read_h, write_f, write_h) nhext_io_func read_f, write_f; void *read_h, *write_h; { int i; char *s; NhExtIO *rd, *wr; struct nhext_line line; char *standard, *protocols, *authmethods, buf[32]; #ifdef DEBUG static struct debug_handle dhr, dhw; dhr.f = read_f; dhr.h = read_h; dhr.arrow = "<="; rd = nhext_io_open(debug_snoop, &dhr, NHEXT_IO_RDONLY); dhw.f = write_f; dhw.h = write_h; dhw.arrow = "=>"; wr = nhext_io_open(debug_snoop, &dhw, NHEXT_IO_WRONLY); #else rd = nhext_io_open(read_f, read_h, NHEXT_IO_RDONLY); wr = nhext_io_open(write_f, write_h, NHEXT_IO_WRONLY); #endif if (!rd || !wr) { proxy_clnt_error("Failed to open I/O streams"); exit(1); } #ifdef DEBUG_RPC (void)win_proxy_clnt_log_open(debug_rpc_out, 0); #endif if (nhext_init(rd, wr, services) < 0) { proxy_clnt_error("Failed to initialize NhExt"); nhext_io_close(wr); nhext_io_close(rd); return FALSE; } win_proxy_clnt_subprotocol0_lp = nhext_subprotocol0_read_line(); if (!win_proxy_clnt_subprotocol0_lp) { failed: proxy_clnt_error("Failed to start NhExt"); /* We leave the NhExtIO streams open and NhExt initialized so * that win_proxy_clnt_get_failed_packet() will still work. */ return FALSE; } if (strcmp(win_proxy_clnt_subprotocol0_lp->type, "NhExt") || !win_proxy_clnt_gettag("game") || !(standard = win_proxy_clnt_gettag("standard")) || !win_proxy_clnt_gettag("version") || !(protocols = win_proxy_clnt_gettag("protocols"))) { nhext_subprotocol0_free_line(win_proxy_clnt_subprotocol0_lp); goto failed; } if (sscanf(standard, "%u.%u", &proxy_svc_ver_major, &proxy_svc_ver_minor) != 2 || proxy_svc_ver_major != EXT_STANDARD_MAJOR) { proxy_clnt_error("Incompatible NhExt standard (%s)", standard); nhext_subprotocol0_free_line(win_proxy_clnt_subprotocol0_lp); s = "Error mesg \"Incompatible NhExt standard\"\n"; (void)nhext_io_write(wr, s, strlen(s)); nhext_end(); nhext_io_close(wr); nhext_io_close(rd); return FALSE; } if (proxy_clnt_flags & PROXY_CLNT_SYNCHRONOUS) s = NULL; else s = strchr(protocols, '2'); if (s && (s == protocols || s[-1] == ',') && (!s[1] || s[1] == ',')) proxy_svc_protocol = 2; else { s = strchr(protocols, '1'); if (s && (s == protocols || s[-1] == ',') && (!s[1] || s[1] == ',')) proxy_svc_protocol = 1; else { nhext_subprotocol0_free_line(win_proxy_clnt_subprotocol0_lp); if (proxy_clnt_flags & PROXY_CLNT_SYNCHRONOUS) proxy_clnt_error("Sub-protocol 1 not supported"); else proxy_clnt_error("Sub-protocols 1 & 2 not supported"); s = "Error mesg \"No supported protocols\"\n"; (void)nhext_io_write(wr, s, strlen(s)); nhext_end(); nhext_io_close(wr); nhext_io_close(rd); return FALSE; } } authmethods = win_proxy_clnt_gettag("authmethods"); if (!proxy_clnt_auth_handler) { if (authmethods) { s = strchr(authmethods, '0'); if (!s || s != authmethods && s[-1] != ',' || s[1] && s[1] != ',') { proxy_clnt_error( "No handler defined for required authorization"); s = "Error mesg \"Authorization not supported\"\n"; (void)nhext_io_write(wr, s, strlen(s)); nhext_end(); nhext_io_close(wr); nhext_io_close(rd); return FALSE; } } } else if (authmethods && strcmp(authmethods,"0")) { int method = 0; unsigned long authmask = 0; win_proxy_clnt_subprotocol0_resp = (struct nhext_line *) alloc(sizeof(struct nhext_line)); win_proxy_clnt_subprotocol0_resp->n = 0; win_proxy_clnt_subprotocol0_resp->values = NULL; win_proxy_clnt_subprotocol0_resp->tags = NULL; i = 0; do { if (authmethods[i] == ',' || authmethods[i] == '\0') { if (method < sizeof(unsigned long) * 8) authmask |= 1UL << method; method = 0; } else if (authmethods[i] >= '0' && authmethods[i] <= '9') { method *= 10; method += authmethods[i] - '0'; } } while (authmethods[i++]); if (proxy_clnt_auth_handler(authmask)) { if (win_proxy_clnt_subprotocol0_resp->n) { win_proxy_clnt_subprotocol0_resp->type = "Error"; (void)nhext_subprotocol0_write_line( win_proxy_clnt_subprotocol0_resp); for(i = 0; i < win_proxy_clnt_subprotocol0_resp->n; i++) { free(win_proxy_clnt_subprotocol0_resp->values[i]); free(win_proxy_clnt_subprotocol0_resp->tags[i]); } free(win_proxy_clnt_subprotocol0_resp->values); free(win_proxy_clnt_subprotocol0_resp->tags); } else { s = "Error mesg \"Generic authorization failure\"\n"; (void)nhext_io_write(wr, s, strlen(s)); } free(win_proxy_clnt_subprotocol0_resp); nhext_end(); nhext_io_close(wr); nhext_io_close(rd); return FALSE; } } line.type = "Ack"; line.n = win_proxy_clnt_subprotocol0_resp ? 2 + win_proxy_clnt_subprotocol0_resp->n : 2; line.tags = (char **)alloc(line.n * sizeof(char *)); line.values = (char **)alloc(line.n * sizeof(char *)); line.tags[0] = "windowtype"; line.values[0] = (char *)proxy_svc->name; line.tags[1] = "protocol"; sprintf(buf, "%d", proxy_svc_protocol); line.values[1] = buf; if (win_proxy_clnt_subprotocol0_resp) { for(i = 0; i < win_proxy_clnt_subprotocol0_resp->n; i++) { line.values[i + 2] = win_proxy_clnt_subprotocol0_resp->values[i]; line.tags[i + 2] = win_proxy_clnt_subprotocol0_resp->tags[i]; } } i = nhext_subprotocol0_write_line(&line); if (win_proxy_clnt_subprotocol0_resp) { for(i = 0; i < win_proxy_clnt_subprotocol0_resp->n; i++) { free(win_proxy_clnt_subprotocol0_resp->values[i]); free(win_proxy_clnt_subprotocol0_resp->tags[i]); } free(win_proxy_clnt_subprotocol0_resp->values); free(win_proxy_clnt_subprotocol0_resp->tags); } free(line.tags); free(line.values); if (!i) { nhext_subprotocol0_free_line(win_proxy_clnt_subprotocol0_lp); proxy_clnt_error("Failed to write NhExt acknowledgement"); nhext_end(); nhext_io_close(wr); nhext_io_close(rd); return FALSE; } nhext_set_protocol(proxy_svc_protocol); return TRUE; } int win_proxy_clnt_iteration(void) { int i; i = nhext_svc(services); if (!i) proxy_clnt_error("Ignoring packet with zero ID"); return i; } char * win_proxy_clnt_get_failed_packet(int *nb) { return nhext_subprotocol0_get_failed_packet(nb); } /* * This uses the following rules: * * .0 == * .n+1 > .n * a > * a+1 > .a * * where n is any decimal number and a is any single non-digit (with a+1 * meaning the next ASCII character after a). Note: the use of atoi() * means that whitespace and +/- signs will cause odd effects. The * assumption is that only alphanumeric characters plus '.' will be used. */ static int cmp_versions(const char *ver1, const char *ver2) { const char *s1, *s2; int n1, n2; int retval = 0; for(;*ver1 || *ver2;) { s1 = strchr(ver1, '.'); if (!s1) s1 = ver1 + strlen(ver1); s2 = strchr(ver2, '.'); if (!s2) s2 = ver2 + strlen(ver2); n1 = atoi(ver1); n2 = atoi(ver2); retval = n1 - n2; if (retval) break; while(*ver1 >= '0' && *ver1 <= '9') ver1++; while(*ver2 >= '0' && *ver2 <= '9') ver2++; while(ver1 < s1 && ver2 < s2 && *ver1 == *ver2) ver1++, ver2++; if (ver1 >= s1) retval = ver2 < s2 ? -1 : 0; else retval = ver2 < s2 ? *ver1 - *ver2 : 1; if (retval) break; ver1 = *s1 ? s1 + 1 : s1; ver2 = *s2 ? s2 + 1 : s2; } return retval; } /* * min_ver is inclusive, next_ver is exclusive, so that a typical requirement of * ver 1.x can be expressed as 1.0 <= ver < 2.0 (min_ver = 1.0, next_ver = 2.0). * We return the first listed entry that matches so extensions should be * listed with the latest version first to select this in preference where * there is a choice. */ char * win_proxy_clnt_get_extension(const char *name, const char *min_ver, const char *next_ver, unsigned short *idp) { int i; char *retval = NULL; unsigned short id = 0x8000; struct proxycb_get_extensions_res *exts; struct proxycb_get_extensions_res_extension *ext; exts = proxy_cb_get_extensions(); if (exts) { ext = exts->extensions; for(i = 0; i < exts->n_extensions; i++, ext++) { if (!strcmp(name, ext->name) && min_ver && cmp_versions(min_ver, ext->version) <= 0 && next_ver && cmp_versions(next_ver, ext->version) > 0) { *idp = id; retval = strdup(ext->version); break; } id += ext->no_procedures; } proxy_cb_free_extensions(exts); } return retval; } static void proxy_clnt_default_handler(const char *error) { fprintf(stderr, "proxy: %s\n", error); } static proxy_clnt_errhandler proxy_clnt_error_handler = proxy_clnt_default_handler; proxy_clnt_errhandler proxy_clnt_set_errhandler(proxy_clnt_errhandler new) { proxy_clnt_errhandler old = proxy_clnt_error_handler; proxy_clnt_error_handler = new; return old; } void proxy_clnt_error(const char *fmt, ...) { va_list ap; char buf[128]; va_start(ap, fmt); vsprintf(buf, fmt, ap); proxy_clnt_error_handler(buf); va_end(ap); } slashem-0.0.7E7F3/win/proxy/test_com.c0000664000076400007640000002245510545462317015623 0ustar aliali/* $Id: test_com.c,v 1.1.2.1 2004/11/18 22:38:10 j_ali Exp $ */ /* Copyright (c) Slash'EM Development Team 2001-2004 */ /* NetHack may be freely redistributed. See license for details. */ /* * This module provides common routines used by the test programs. */ #include #include #include #include "test_com.h" int is_child = 0; long *alloc(unsigned int nb) { return malloc(nb); } void impossible(const char *fmt, ...) { int i; va_list args; va_start(args, fmt); fputs("impossible: ", stderr); if (is_child) fputs("C: ", stderr); vfprintf(stderr, fmt, args); putc('\n', stderr); fflush(stderr); va_end(args); if (!is_child) { for(i=0;i<10 && !child_wait0();i++) sleep(1); } exit(126); } void nhext_error_handler(int class, const char *error) { int i; fputs("NhExt error: ", stderr); if (is_child) fputs("C: ", stderr); fputs(error, stderr); putc('\n', stderr); fflush(stderr); if (!is_child) { for(i=0;i<10 && !child_wait0();i++) sleep(1); } exit(126); } #ifdef WIN32 #include #include #include static PROCESS_INFORMATION pi; static HANDLE to_parent[2], to_child[2]; /* Create an anonymous pipe with one end inheritable. */ static int pipe_create(HANDLE *handles, int non_inherit) { HANDLE h; SECURITY_ATTRIBUTES sa; sa.nLength = sizeof(sa); sa.bInheritHandle = TRUE; sa.lpSecurityDescriptor = NULL; if (!CreatePipe(&handles[0], &handles[1], &sa, 8192)) return FALSE; if (!DuplicateHandle(GetCurrentProcess(), handles[non_inherit], GetCurrentProcess(), &h, 0, FALSE, DUPLICATE_SAME_ACCESS)) { CloseHandle(handles[0]); CloseHandle(handles[1]); return FALSE; } CloseHandle(handles[non_inherit]); handles[non_inherit] = h; return TRUE; } static HANDLE dup_osf(int fd) { HANDLE h, dh; h = (HANDLE)_get_osfhandle(fd); if (h == INVALID_HANDLE_VALUE) return h; if (!DuplicateHandle(GetCurrentProcess(), h, GetCurrentProcess(), &dh, 0, FALSE, DUPLICATE_SAME_ACCESS)) return INVALID_HANDLE_VALUE; return dh; } static int redirect_to_osf(DWORD std_handle, HANDLE osf) { int i, retval, fd, mode; switch(std_handle) { case STD_INPUT_HANDLE: fd = 0; mode = _O_RDONLY | _O_BINARY; break; case STD_OUTPUT_HANDLE: fd = 1; mode = _O_WRONLY | _O_BINARY; break; case STD_ERROR_HANDLE: fd = 2; mode = _O_WRONLY | _O_BINARY; break; default: errno = EINVAL; return 0; } if (!SetStdHandle(std_handle, osf)) return 0; i = _open_osfhandle((long)osf, mode); if (i < 0) return 0; retval = (dup2(i, fd) >= 0); close(i); return retval; } static void pipe_close(HANDLE *handles) { CloseHandle(handles[0]); CloseHandle(handles[1]); } int child_start(const char *argv0) { int fd, retval; char *cmdline; HANDLE save_stdin, save_stdout; STARTUPINFO si; cmdline = malloc(strlen(argv0) + 4); if (!cmdline) return FALSE; sprintf(cmdline, "%s -c", argv0); if (!pipe_create(to_parent, 0)) { free(cmdline); return FALSE; } if (!pipe_create(to_child, 1)) { pipe_close(to_parent); free(cmdline); return FALSE; } save_stdin = dup_osf(0); save_stdout = dup_osf(1); if (save_stdin == INVALID_HANDLE_VALUE || save_stdout == INVALID_HANDLE_VALUE) { pipe_close(to_parent); pipe_close(to_child); free(cmdline); return FALSE; } if (!redirect_to_osf(STD_INPUT_HANDLE, to_child[0])) { pipe_close(to_parent); pipe_close(to_child); free(cmdline); return FALSE; } if (!redirect_to_osf(STD_OUTPUT_HANDLE, to_parent[1])) { redirect_to_osf(STD_INPUT_HANDLE, save_stdin); pipe_close(to_parent); pipe_close(to_child); free(cmdline); return FALSE; } ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); ZeroMemory(&pi, sizeof(pi)); retval = CreateProcess(NULL, /* No module name */ cmdline, /* Command line */ NULL, /* Process handle not inheritable */ NULL, /* Thread handle not inheritable */ TRUE, /* Inherits parent's handles */ #if 0 DETACHED_PROCESS, /* Creation flags */ #else 0, /* Creation flags */ #endif NULL, /* Use parent's environment */ NULL, /* Use parent's starting dir */ &si, &pi); free(cmdline); redirect_to_osf(STD_INPUT_HANDLE, save_stdin); redirect_to_osf(STD_OUTPUT_HANDLE, save_stdout); if (!retval) { pipe_close(to_parent); pipe_close(to_child); } else { CloseHandle(to_parent[1]); CloseHandle(to_child[0]); } return retval; } int child_read(handle, buf, len) void *handle; void *buf; unsigned int len; { DWORD d; if (!ReadFile((HANDLE)handle, buf, len, &d, NULL)) { d = GetLastError(); return d == ERROR_HANDLE_EOF || d == ERROR_BROKEN_PIPE ? 0 : -1; } else return d; } int child_write(handle, buf, len) void *handle; void *buf; unsigned int len; { DWORD nb; if (!WriteFile((HANDLE)handle, buf, len, &nb, NULL)) return -1; else return nb; } int child_wait0() { return WaitForSingleObject(pi.hProcess, 0) == WAIT_OBJECT_0; } int child_wait() { WaitForSingleObject(pi.hProcess, INFINITE); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); pipe_close(to_parent); pipe_close(to_child); return TRUE; } int parent_read(void *handle, void *buf, unsigned int len) { DWORD d; if (!ReadFile((HANDLE)handle, buf, len, &d, NULL)) { d = GetLastError(); return d == ERROR_HANDLE_EOF || d == ERROR_BROKEN_PIPE ? 0 : -1; } else return d; } int parent_write(void *handle, void *buf, unsigned int len) { DWORD nb; if (!WriteFile((HANDLE)handle, buf, len, &nb, NULL)) return -1; else return nb; } void *get_parent_readh() { return (void *)_get_osfhandle(0); } void *get_parent_writeh() { return (void *)_get_osfhandle(1); } #else /* WIN32 */ #include #include static int pid; static int to_parent[2], to_child[2]; int child_start(const char *argv0) { if (pipe(to_child)) return FALSE; if (pipe(to_parent)) { close(to_child[0]); close(to_child[1]); return FALSE; } pid = fork(); if (pid < 0) { close(to_child[0]); close(to_child[1]); close(to_parent[0]); close(to_parent[1]); return FALSE; } else if (!pid) { close(to_child[1]); close(to_parent[0]); dup2(to_child[0],0); dup2(to_parent[1],1); execl(argv0, argv0, "-c", NULL); _exit(127); } else { close(to_child[0]); close(to_parent[1]); } return TRUE; } int child_read(handle, buf, len) void *handle; void *buf; unsigned int len; { int retval; retval = read((int)handle, buf, len); return retval >= 0 ? retval : -1; } int child_write(handle, buf, len) void *handle; void *buf; unsigned int len; { int retval; retval = write((int)handle, buf, len); return retval >= 0 ? retval : -1; } static int child__wait(options) { int status; if (waitpid(pid,&status,options) == pid) { if (!WIFEXITED(status)) { if (WIFSIGNALED(status)) fprintf(stderr, "Child died due to signal %d\n", WTERMSIG(status)); else fprintf(stderr, "Child died for unknown reason\n"); } else if (WEXITSTATUS(status)) fprintf(stderr, "Child exited with code %d\n", WEXITSTATUS(status)); return TRUE; } else return FALSE; } int child_wait0() { return child__wait(WNOHANG); } int child_wait() { close(to_child[1]); close(to_parent[0]); return child__wait(0); } int parent_read(void *handle, void *buf, unsigned int len) { int retval; retval = read((int)handle, buf, len); return retval >= 0 ? retval : -1; } int parent_write(void *handle, void *buf, unsigned int len) { int retval; retval = write((int)handle, buf, len); return retval >= 0 ? retval : -1; } void *get_parent_readh() { return (void *)0; } void *get_parent_writeh() { return (void *)1; } #endif /* WIN32 */ void *get_child_readh() { return (void *)to_parent[0]; } void *get_child_writeh() { return (void *)to_child[1]; } int debug_read(handle, buf, len) void *handle; void *buf; unsigned int len; { int i, retval; long l; unsigned char *bp = buf; retval = child_read(handle, buf, len); if (retval == -2) fputs("<- PENDING\n", stderr); else if (retval < 0) fputs("<- ERROR\n", stderr); else { for(i = 0; i < retval; ) { if ((i & 7) == 0) { if (!i) fputs("<-", stderr); else fputs("\n ", stderr); } if (retval - i >= 4) { l = (long)bp[i] << 24 | (long)bp[i+1] << 16 | (long)bp[i+2] << 8 | bp[i+3]; fprintf(stderr, " %08X", l); i += 4; } else { fprintf(stderr, " %02X", bp[i]); i++; } } fputc('\n', stderr); } return retval; } int debug_write(handle, buf, len) void *handle; void *buf; unsigned int len; { int i, retval; long l; unsigned char *bp = buf; retval = child_write(handle, buf, len); if (retval < 0) fputs("-> ERROR\n", stderr); else { for(i = 0; i < retval; ) { if ((i & 7) == 0) { if (!i) fputs("->", stderr); else fputs("\n ", stderr); } if (retval - i >= 4) { l = (long)bp[i] << 24 | (long)bp[i+1] << 16 | (long)bp[i+2] << 8 | bp[i+3]; fprintf(stderr, " %08X", l); i += 4; } else { fprintf(stderr, " %02X", bp[i]); i++; } } fputc('\n', stderr); } return retval; } slashem-0.0.7E7F3/win/proxy/nhxdr.c0000664000076400007640000001236110545462317015124 0ustar aliali/* $Id: nhxdr.c,v 1.6 2003/10/25 18:06:01 j_ali Exp $ */ /* Copyright (c) Slash'EM Development Team 2001-2003 */ /* NetHack may be freely redistributed. See license for details. */ /* #define DEBUG */ #include #include #ifdef DEBUG #include #endif #include "nhxdr.h" /* * This module implements the NhExt version of the XDR support routines. * It is functionally equivalent to the code provided with rpcgen, and * except for the xdrio stream can be replaced by that on systems which * support it. Rpcgen is included in the freely available RPCSRC 4.0 * from Sun Microsystems, which can be downloaded in 17 shar files from * ftp://bcm.tmc.edu/nfs/ (this is mainly useful in testing). * * The xdrio stream has no direct equivalent in RPCSRC. Sun's xdrrec * stream has the capabilities but this requires both client and server * to use it which is not acceptable. Sun's xdrstdio stream is very * similar in function to xdrio but would either require changes to * the source of RPCSRC or the use of local pipes to connect xdrstdio * to nhext_io. */ #ifdef DEBUG static void debug_dump(buf, len, arrow) void *buf; unsigned int len; char *arrow; { int i, j, nc, ni; long l; char cbuf[17]; unsigned char *bp = buf; for(i = 0; i < len; ) { if ((i & 15) == 0) { if (!i) { ni = fprintf(stderr, "[%d] ", getpid()); ni += fputs(arrow, stderr); } else { cbuf[16] = '\0'; while(nc++ < 40) fputc(' ', stderr); fputs(cbuf, stderr); fputs("\n", stderr); for(j = 0; j <= ni; j++) fputc(' ', stderr); } nc = 2; } if (len - i >= 4) { l = (long)bp[i] << 24 | (long)bp[i + 1] << 16 | (long)bp[i + 2] << 8 | bp[i + 3]; fprintf(stderr, " %08X", l); nc += 9; for(j = 0; j < 4; j++, i++) cbuf[i & 15] = isgraph(bp[i]) || bp[i] == ' ' ? bp[i] : '.'; } else { fprintf(stderr, " %02X", bp[i]); nc += 3; cbuf[i & 15] = isgraph(bp[i]) || bp[i] == ' ' ? bp[i] : '.'; i++; } } if (len) { cbuf[i & 15 ? i & 15 : 16] = '\0'; while(nc++ < 40) fputc(' ', stderr); fputs(cbuf, stderr); } fputc('\n', stderr); } #endif /* DEBUG */ unsigned int nhext_xdr_getpos(xdrs) NhExtXdr *xdrs; { return xdrs->x_pos; } nhext_xdr_bool_t nhext_xdr_setpos(xdrs, pos) NhExtXdr *xdrs; unsigned int pos; { if (!xdrs->x_size || pos > xdrs->x_size) return FALSE; xdrs->x_pos = pos; return TRUE; } void nhext_xdr_free(codec, addr) char *addr; nhext_xdr_bool_t (*codec)(NhExtXdr *, void *); { NhExtXdr xdrs; xdrs.x_op = NHEXT_XDR_FREE; (void)(*codec)(&xdrs, addr); } static nhext_xdr_bool_t nhext_xdrmem_read(xdrs, addr, size) NhExtXdr *xdrs; char *addr; int size; { if (size < 0) return FALSE; if (size > xdrs->x_size - xdrs->x_pos) size = xdrs->x_size - xdrs->x_pos; memcpy(addr, (unsigned char *)xdrs->x_data + xdrs->x_pos, size); #ifdef DEBUG debug_dump(addr, size, "<<"); #endif xdrs->x_pos += size; return TRUE; } static nhext_xdr_bool_t nhext_xdrmem_write(xdrs, addr, size) NhExtXdr *xdrs; const char *addr; int size; { if (size < 0 || size > xdrs->x_size - xdrs->x_pos) return FALSE; #ifdef DEBUG debug_dump(addr, size, ">>"); #endif memcpy((unsigned char *)xdrs->x_data + xdrs->x_pos, addr, size); xdrs->x_pos += size; return TRUE; } static void nhext_xdrmem_destroy(xdrs) NhExtXdr *xdrs; { } void nhext_xdrmem_create(xdrs, addr, size, op) NhExtXdr *xdrs; char *addr; unsigned int size; enum nhext_xdr_op op; { xdrs->x_data = addr; xdrs->x_op = op; xdrs->x_size = size; xdrs->x_pos = 0; xdrs->x_read = nhext_xdrmem_read; xdrs->x_write = nhext_xdrmem_write; xdrs->x_destroy = nhext_xdrmem_destroy; } static nhext_xdr_bool_t nhext_xdrio_read(xdrs, addr, size) NhExtXdr *xdrs; char *addr; int size; { int retval; if (size <= 0) return !size; retval = nhext_io_fread(addr, size, 1, (NhExtIO *)xdrs->x_data); #ifdef DEBUG if (retval < 0) /* * Only nhext_xdr_bytestring() calls us with anything larger * than 4 bytes. If this is triggered then either NhExtIO * needs to be modified to increase the buffer size or the * NhExt protocol needs to be modified to keep all strings * below NhExtIO's limit. */ fprintf(stderr, "nhext_xdrio: datum too large to read (%d)\n", size); #endif if (retval == 1) { #ifdef DEBUG debug_dump(addr, size, "<<"); #endif xdrs->x_pos += size; } #ifdef DEBUG else fprintf(stderr, "[%d] << EOF\n", getpid()); #endif return retval == 1; } static nhext_xdr_bool_t nhext_xdrio_write(xdrs, addr, size) NhExtXdr *xdrs; const char *addr; int size; { int retval; if (size < 0) return FALSE; #ifdef DEBUG debug_dump(addr, size, ">>"); #endif retval = nhext_io_write((NhExtIO *)xdrs->x_data, (void *)addr, size); xdrs->x_pos += retval; return retval == size; } static void nhext_xdrio_destroy(xdrs) NhExtXdr *xdrs; { (void)nhext_io_flush((NhExtIO *)xdrs->x_data); } void nhext_xdrio_create(xdrs, io, op) NhExtXdr *xdrs; NhExtIO *io; enum nhext_xdr_op op; { xdrs->x_data = io; xdrs->x_op = op; xdrs->x_size = 0; /* xdr_setpos() is not supported */ xdrs->x_pos = 0; xdrs->x_read = nhext_xdrio_read; xdrs->x_write = nhext_xdrio_write; xdrs->x_destroy = nhext_xdrio_destroy; } slashem-0.0.7E7F3/win/proxy/glyphmap.c0000664000076400007640000005507610545462317015634 0ustar aliali/* $Id: glyphmap.c,v 1.4 2002/11/25 14:23:46 j_ali Exp $ */ /* Copyright (c) Slash'EM Development Team 2002 */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" #include "nhxdr.h" #include "proxycom.h" #include "winproxy.h" /* #define DEBUG */ /* Glyph mapping ignores the value of iflags.use_color. This flag should be * checked by the window port where appropriate. However, we must take account * of TEXTCOLOR because colours will not be available when this is not defined. */ #ifdef C #undef C #endif #ifdef TEXTCOLOR #define C(n) n #else #define C(n) NO_COLOR #endif #define RGB(r, g, b) ((r)<<16 | (g)<<8 | (b)) /* Some arbitary, unused, colour */ #define RGB_TRANSPARENT RGB(0, 0, 1) long rgb_colors[] = { /* Black */ RGB(0,0,0), /* Red */ RGB(127,0,0), /* Green */ RGB(0,127,0), /* Brown */ RGB(127,127,0), /* Blue */ RGB(0,0,127), /* Magenta */ RGB(127,0,127), /* Cyan */ RGB(0,127,127), /* Light grey */ RGB(127,127,127), /* Dark grey */ RGB(63,63,63), /* Bright red */ RGB(255,0,0), /* Bright green */ RGB(0,255,0), /* Yellow */ RGB(255,255,0), /* Bright blue */ RGB(0,0,255), /* Bright magenta */ RGB(255,0,255), /* Bright cyan */ RGB(0,255,255), /* White */ RGB(255,255,255) }; short glyph2proxy[MAX_GLYPH]; static int set_glyph_mapping_monsters(glyph) int glyph; { int i, j; for(i = 0; i < MAXMCLASSES; i++) if (monexplain[i]) for(j = 0; j < NUMMONS; j++) if (mons[j].mlet == i) glyph2proxy[monnum_to_glyph(j)] = glyph++; return glyph; } static void get_glyph_mapping_monsters(map) struct proxycb_get_glyph_mapping_res_mapping *map; { int i, j, k, l; int n_mons[MAXMCLASSES]; map->flags = ""; map->base_mapping = -1; map->alt_glyph = NO_GLYPH; map->symdef.rgbsym = RGB_SYM(RGB_TRANSPARENT, 0); map->symdef.description = "monster"; for(i = 0; i < MAXMCLASSES; i++) n_mons[i] = 0; for(i = 0; i < NUMMONS; i++) if (mons[i].mlet >= 0 && mons[i].mlet < MAXMCLASSES) n_mons[mons[i].mlet]++; map->n_submappings = MAXMCLASSES; for(i = 0; i < MAXMCLASSES; i++) if (!monexplain[i] || !n_mons[i]) map->n_submappings--; map->submappings = (struct proxycb_get_glyph_mapping_res_submapping *) alloc(map->n_submappings * sizeof(*map->submappings)); for(i = j = 0; i < MAXMCLASSES; i++) { if (monexplain[i] && n_mons[i]) { map->submappings[j].symdef.rgbsym = RGB_SYM(RGB_TRANSPARENT, monsyms[i]); map->submappings[j].symdef.description = monexplain[i]; map->submappings[j].n_glyphs = n_mons[i]; map->submappings[j].glyphs = (struct proxycb_get_glyph_mapping_res_symdef *) alloc(map->submappings[j].n_glyphs * sizeof(*map->submappings[j].glyphs)); for(k = l = 0; k < NUMMONS; k++) if (mons[k].mlet == i) { map->submappings[j].glyphs[l].rgbsym = RGB_SYM(rgb_colors[C(mons[k].mcolor)], monsyms[i]); map->submappings[j].glyphs[l].description = mons[k].mname; l++; } if (l != map->submappings[j].n_glyphs) panic("glyph_mapping_monsters: Bad no glyphs"); j++; } } } static int set_glyph_mapping_invisible_monster(glyph) int glyph; { glyph2proxy[GLYPH_INVISIBLE] = glyph; return glyph + 1; } static void get_glyph_mapping_invisible_monster(map) struct proxycb_get_glyph_mapping_res_mapping *map; { map->flags = ""; map->base_mapping = -1; map->alt_glyph = NO_GLYPH; map->symdef.rgbsym = RGB_SYM(RGB_TRANSPARENT, 0); map->symdef.description = "monster"; map->n_submappings = 1; map->submappings = (struct proxycb_get_glyph_mapping_res_submapping *) alloc(sizeof(*map->submappings)); map->submappings->symdef.rgbsym = RGB_SYM(rgb_colors[NO_COLOR], DEF_INVISIBLE); /* see mapglyph.c */ map->submappings->symdef.description = ""; map->submappings->n_glyphs = 1; map->submappings->glyphs = (struct proxycb_get_glyph_mapping_res_symdef *) alloc(sizeof(*map->submappings->glyphs)); map->submappings->glyphs->rgbsym = RGB_SYM(rgb_colors[NO_COLOR], DEF_INVISIBLE); map->submappings->glyphs->description = "invisible monster"; } static int set_glyph_mapping_monsters_based(base_glyphs, glyph, type) int base_glyphs, glyph, type; { int i; switch(type) { case GLYPH_PET_OFF: for(i = 0; i < base_glyphs; i++) glyph2proxy[petnum_to_glyph(i)] = glyph2proxy[monnum_to_glyph(i)] + glyph; break; case GLYPH_RIDDEN_OFF: for(i = 0; i < base_glyphs; i++) glyph2proxy[ridden_monnum_to_glyph(i)] = glyph2proxy[monnum_to_glyph(i)] + glyph; break; case GLYPH_DETECT_OFF: for(i = 0; i < base_glyphs; i++) glyph2proxy[detected_monnum_to_glyph(i)] = glyph2proxy[monnum_to_glyph(i)] + glyph; break; default: panic("Bad derived monster type in glyph map"); } return glyph + base_glyphs; } static void get_glyph_mapping_monsters_based(map, base, type) struct proxycb_get_glyph_mapping_res_mapping *map; int base, type; { int i; switch(type) { case GLYPH_PET_OFF: map->flags = "pet"; break; case GLYPH_RIDDEN_OFF: map->flags = "ridden"; break; case GLYPH_DETECT_OFF: map->flags = "detected"; break; default: panic("Bad derived monster type in glyph map"); } map->base_mapping = base; map->alt_glyph = NO_GLYPH; map->symdef.rgbsym = RGB_SYM(RGB_TRANSPARENT, 0); map->symdef.description = ""; map->n_submappings = 0; map->submappings = NULL; } static int set_glyph_mapping_monster_corpses(base_glyphs, glyph) int base_glyphs, glyph; { int i; for(i = 0; i < base_glyphs; i++) glyph2proxy[body_to_glyph(i)] = glyph2proxy[monnum_to_glyph(i)] + glyph; return glyph + base_glyphs; } static void get_glyph_mapping_monster_corpses(map, base) struct proxycb_get_glyph_mapping_res_mapping *map; int base; { map->flags = "corpse"; map->base_mapping = base; map->alt_glyph = objnum_to_glyph(CORPSE); map->symdef.rgbsym = /* see mapglyph.c */ RGB_SYM(RGB_TRANSPARENT, oc_syms[(int)objects[CORPSE].oc_class]); map->symdef.description = ""; map->n_submappings = 0; map->submappings = NULL; } static int set_glyph_mapping_objects(glyph) int glyph; { int i, j; for(i = 0; i < MAXOCLASSES; i++) { if (oclass_names[i]) { for(j = 0; j < NUM_OBJECTS; j++) if (objects[j].oc_class == i) glyph2proxy[objnum_to_glyph(j)] = glyph++; } } return glyph; } static void get_glyph_mapping_objects(map) struct proxycb_get_glyph_mapping_res_mapping *map; { int i, j, k, l; map->flags = ""; map->base_mapping = -1; map->alt_glyph = NO_GLYPH; map->symdef.rgbsym = RGB_SYM(RGB_TRANSPARENT, 0); map->symdef.description = "object"; map->n_submappings = MAXOCLASSES; for(i = 0; i < MAXOCLASSES; i++) if (!oclass_names[i]) map->n_submappings--; map->submappings = (struct proxycb_get_glyph_mapping_res_submapping *) alloc(map->n_submappings * sizeof(*map->submappings)); for(i = j = 0; i < MAXOCLASSES; i++) { if (oclass_names[i]) { map->submappings[j].symdef.rgbsym = RGB_SYM(RGB_TRANSPARENT, oc_syms[i]); map->submappings[j].symdef.description = oclass_names[i]; map->submappings[j].n_glyphs = 0; for(k = 0; k < NUM_OBJECTS; k++) if (objects[k].oc_class == i) map->submappings[j].n_glyphs++; map->submappings[j].glyphs = (struct proxycb_get_glyph_mapping_res_symdef *) alloc(map->submappings[j].n_glyphs * sizeof(*map->submappings[j].glyphs)); for(k = l = 0; k < NUM_OBJECTS; k++) if (objects[k].oc_class == i) { map->submappings[j].glyphs[l].rgbsym = RGB_SYM(rgb_colors[C(objects[k].oc_color)], oc_syms[i]); map->submappings[j].glyphs[l].description = obj_descr[k].oc_descr ? obj_descr[k].oc_descr : obj_descr[k].oc_name; l++; } j++; } } } /* Defines for cmap groups, used for submappings. Cmaps in each group must be * contiguous (assumed below). */ #define IS_CMAP_WALL(cmap) ((cmap) && (cmap) <= S_trwall) #define IS_CMAP_DOOR(cmap) ((cmap) >= S_ndoor && (cmap) <= S_hcdoor) #define IS_CMAP_TRAP(cmap) ((cmap) >= MAXDCHARS && \ (cmap) < MAXDCHARS + MAXTCHARS) #define IS_CMAP_EFFECT(cmap) ((cmap) >= MAXDCHARS + MAXTCHARS && \ (cmap) < MAXPCHARS - MAXEXPCHARS - 8) #define IS_CMAP_SWALLOW(cmap) ((cmap) >= MAXPCHARS - MAXEXPCHARS - 8 && \ (cmap) < MAXPCHARS - MAXEXPCHARS) #define CMAP_WALL 0 #define CMAP_DOOR 1 #define CMAP_TRAP 2 #define CMAP_EFFECT 3 #define CMAP_SWALLOW 4 #define CMAP_NO_GROUP 5 #define CMAP_GROUP(cmap) (IS_CMAP_WALL(cmap) ? CMAP_WALL : \ IS_CMAP_DOOR(cmap) ? CMAP_DOOR : \ IS_CMAP_TRAP(cmap) ? CMAP_TRAP : \ IS_CMAP_EFFECT(cmap) ? CMAP_EFFECT : \ IS_CMAP_SWALLOW(cmap) ? CMAP_SWALLOW : -1) static char *cmap_groups[] = { "wall", "door", "trap", "effect", "swallow" }; static int set_glyph_mapping_cmap_submapping(first, next, glyph) int first, next, glyph; { int i; for(i = first; i < next; i++) glyph2proxy[cmap_to_glyph(i)] = glyph++; return glyph; } static void get_glyph_mapping_cmap_submapping(submap, desc, first, next) struct proxycb_get_glyph_mapping_res_submapping *submap; char *desc; int first, next; { int i; submap->symdef.rgbsym = RGB_SYM(RGB_TRANSPARENT, 0); submap->symdef.description = desc; submap->n_glyphs = next - first; submap->glyphs = (struct proxycb_get_glyph_mapping_res_symdef *) alloc(submap->n_glyphs * sizeof(*submap->glyphs)); for(i = first; i < next; i++) { submap->glyphs[i - first].rgbsym = RGB_SYM(rgb_colors[C(defsyms[i].color)], showsyms[i]); submap->glyphs[i - first].description = defsyms[i].explanation; } } static struct { int group, first_cmap, next_cmap; /* first <= cmap < next */ } cmap_idx[CMAP_NO_GROUP]; static int set_glyph_mapping_cmap(glyph) int glyph; { int i, j, k, l; for(i = 0; i < CMAP_NO_GROUP; i++) cmap_idx[i].group = -1; for(i = j = 0; i <= MAXPCHARS - MAXEXPCHARS; i++) { k = CMAP_GROUP(i); if (k >= 0) { if (cmap_idx[j].group != k) { if (cmap_idx[j].group >= 0) cmap_idx[j++].next_cmap = i; cmap_idx[j].group = k; cmap_idx[j].first_cmap = i; } } else if (cmap_idx[j].group >= 0) cmap_idx[j++].next_cmap = i; } for(i = 0; /* i <= CMAP_NO_GROUP */; i++) { k = i ? cmap_idx[i - 1].next_cmap : 0; l = i == CMAP_NO_GROUP ? MAXPCHARS - MAXEXPCHARS : cmap_idx[i].first_cmap; if (l != k) glyph = set_glyph_mapping_cmap_submapping(k, l, glyph); if (i == CMAP_NO_GROUP) break; glyph = set_glyph_mapping_cmap_submapping(cmap_idx[i].first_cmap, cmap_idx[i].next_cmap, glyph); } return glyph; } static void get_glyph_mapping_cmap(map) struct proxycb_get_glyph_mapping_res_mapping *map; { int i, j, k, l; map->flags = ""; map->base_mapping = -1; map->alt_glyph = NO_GLYPH; map->symdef.rgbsym = RGB_SYM(RGB_TRANSPARENT, 0); map->symdef.description = "cmap"; map->n_submappings = CMAP_NO_GROUP; if (cmap_idx[0].first_cmap) map->n_submappings++; for(i = 1; i < CMAP_NO_GROUP; i++) if (cmap_idx[i].first_cmap != cmap_idx[i - 1].next_cmap) map->n_submappings++; if (cmap_idx[CMAP_NO_GROUP - 1].next_cmap != MAXPCHARS - MAXEXPCHARS) map->n_submappings++; map->submappings = (struct proxycb_get_glyph_mapping_res_submapping *) alloc(map->n_submappings * sizeof(*map->submappings)); for(i = j = 0; /* i <= CMAP_NO_GROUP */; i++) { k = i ? cmap_idx[i - 1].next_cmap : 0; l = i == CMAP_NO_GROUP ? MAXPCHARS - MAXEXPCHARS : cmap_idx[i].first_cmap; if (l != k) { get_glyph_mapping_cmap_submapping(map->submappings + j, "", k, l); j++; } if (i == CMAP_NO_GROUP) break; get_glyph_mapping_cmap_submapping(map->submappings + j, cmap_groups[cmap_idx[i].group], cmap_idx[i].first_cmap, cmap_idx[i].next_cmap); j++; } } static char *explosion_types[] = { /* hack.h, see also tilemap.c */ "dark", "noxious", "muddy", "wet", "magical", "fiery", "frosty" }; static int set_glyph_mapping_explosions(glyph) int glyph; { int i, j; for(i = 0; i < EXPL_MAX; i++) for(j = 0; j < MAXEXPCHARS; j++) glyph2proxy[explosion_to_glyph(i, j + S_explode1)] = glyph++; return glyph; } static void get_glyph_mapping_explosions(map, base) struct proxycb_get_glyph_mapping_res_mapping *map; int base; { int i, j; extern int explcolors[]; map->flags = explosion_types[0]; map->base_mapping = -1; map->alt_glyph = NO_GLYPH; map->symdef.rgbsym = RGB_SYM(rgb_colors[C(explcolors[0])], 0); map->symdef.description = "explosion"; map->n_submappings = 1; map->submappings = (struct proxycb_get_glyph_mapping_res_submapping *) alloc(map->n_submappings * sizeof(*map->submappings)); map->submappings->symdef.rgbsym = RGB_SYM(rgb_colors[C(explcolors[0])], 0); map->submappings->symdef.description = ""; map->submappings->n_glyphs = MAXEXPCHARS; map->submappings->glyphs = (struct proxycb_get_glyph_mapping_res_symdef *) alloc(map->submappings->n_glyphs * sizeof(*map->submappings->glyphs)); for(i = 0; i < MAXEXPCHARS; i++) { map->submappings->glyphs[i].rgbsym = RGB_SYM(rgb_colors[C(explcolors[0])], showsyms[i + S_explode1]); map->submappings->glyphs[i].description = defsyms[i + S_explode1].explanation; } for(i = 1; i < EXPL_MAX; i++) { map++; map->flags = explosion_types[i]; map->base_mapping = base; map->alt_glyph = NO_GLYPH; map->symdef.rgbsym = RGB_SYM(rgb_colors[C(explcolors[i])], 0); map->symdef.description = ""; map->n_submappings = 0; map->submappings = NULL; } } static char *zap_types[] = { /* spell.h */ "magic missile", "fire", "cold", "sleep", "death", "lightning", "poison gas", "acid" }; static int set_glyph_mapping_zaps(glyph) int glyph; { int i, j; for(i = 0; i < NUM_ZAP; i++) for(j = 0; j < 4; j++) glyph2proxy[i * 4 + j + GLYPH_ZAP_OFF] = glyph++; return glyph; } static void get_glyph_mapping_zaps(map, base) struct proxycb_get_glyph_mapping_res_mapping *map; int base; { int i, j; map->flags = zap_types[0]; map->base_mapping = -1; map->alt_glyph = NO_GLYPH; map->symdef.rgbsym = RGB_SYM(rgb_colors[C(zapcolors[0])], 0); map->symdef.description = "zap"; map->n_submappings = 1; map->submappings = (struct proxycb_get_glyph_mapping_res_submapping *) alloc(map->n_submappings * sizeof(*map->submappings)); map->submappings->symdef.rgbsym = RGB_SYM(rgb_colors[C(zapcolors[0])], 0); map->submappings->symdef.description = ""; map->submappings->n_glyphs = 4; map->submappings->glyphs = (struct proxycb_get_glyph_mapping_res_symdef *) alloc(map->submappings->n_glyphs * sizeof(*map->submappings->glyphs)); for(i = 0; i < 4; i++) { map->submappings->glyphs[i].rgbsym = RGB_SYM(rgb_colors[C(zapcolors[0])], showsyms[i + S_vbeam]); map->submappings->glyphs[i].description = defsyms[i + S_vbeam].explanation; } for(i = 1; i < NUM_ZAP; i++) { map++; map->flags = zap_types[i]; map->base_mapping = base; map->alt_glyph = NO_GLYPH; map->symdef.rgbsym = RGB_SYM(rgb_colors[C(zapcolors[i])], 0); map->symdef.description = ""; map->n_submappings = 0; map->submappings = NULL; } } static struct { int cmap; const char *description; } swallow_cmaps[] = { S_sw_tl, "top left", S_sw_tc, "top center", S_sw_tr, "top right", S_sw_ml, "middle left", S_sw_mr, "middle right", S_sw_bl, "bottom left", S_sw_bc, "bottom center", S_sw_br, "bottom right" }; static int set_glyph_mapping_swallow(base_glyphs, glyph) int base_glyphs, glyph; { int i, j; for(i = 0; i < SIZE(swallow_cmaps); i++) for(j = 0; j < base_glyphs; j++) glyph2proxy[j * SIZE(swallow_cmaps) + i + GLYPH_SWALLOW_OFF] = glyph2proxy[monnum_to_glyph(j)] * SIZE(swallow_cmaps) + i + glyph; return glyph + SIZE(swallow_cmaps) * base_glyphs; } static void get_glyph_mapping_swallow(map, base) struct proxycb_get_glyph_mapping_res_mapping *map; int base; { int i; map->flags = ""; map->base_mapping = base; map->alt_glyph = NO_GLYPH; map->symdef.rgbsym = RGB_SYM(RGB_TRANSPARENT, 0); map->symdef.description = "swallow"; map->n_submappings = 1; map->submappings = (struct proxycb_get_glyph_mapping_res_submapping *) alloc(map->n_submappings * sizeof(*map->submappings)); map->submappings->symdef.rgbsym = RGB_SYM(RGB_TRANSPARENT, 0); map->submappings->symdef.description = ""; map->submappings->n_glyphs = SIZE(swallow_cmaps); map->submappings->glyphs = (struct proxycb_get_glyph_mapping_res_symdef *) alloc(map->submappings->n_glyphs * sizeof(*map->submappings->glyphs)); for(i = 0; i < SIZE(swallow_cmaps); i++) { map->submappings->glyphs[i].rgbsym = RGB_SYM(RGB_TRANSPARENT, showsyms[swallow_cmaps[i].cmap]); map->submappings->glyphs[i].description = swallow_cmaps[i].description; } } static int set_glyph_mapping_warning(glyph) int glyph; { int i; for(i = 0; i < WARNCOUNT; i++) glyph2proxy[warning_to_glyph(i)] = glyph++; return glyph; } static void get_glyph_mapping_warning(map) struct proxycb_get_glyph_mapping_res_mapping *map; { int i; map->flags = ""; map->base_mapping = -1; map->alt_glyph = NO_GLYPH; map->symdef.rgbsym = RGB_SYM(RGB_TRANSPARENT, 0); map->symdef.description = "warning"; map->n_submappings = 1; map->submappings = (struct proxycb_get_glyph_mapping_res_submapping *) alloc(map->n_submappings * sizeof(*map->submappings)); map->submappings->symdef.rgbsym = RGB_SYM(RGB_TRANSPARENT, 0); map->submappings->symdef.description = ""; map->submappings->n_glyphs = WARNCOUNT; map->submappings->glyphs = (struct proxycb_get_glyph_mapping_res_symdef *) alloc(map->submappings->n_glyphs * sizeof(*map->submappings->glyphs)); for(i = 0; i < WARNCOUNT; i++) { map->submappings->glyphs[i].rgbsym = RGB_SYM(rgb_colors[C(def_warnsyms[i].color)], warnsyms[i]); map->submappings->glyphs[i].description = def_warnsyms[i].explanation; } } #ifdef DEBUG static void print_glyph_mapping(fp, mapping) FILE *fp; struct proxycb_get_glyph_mapping_res *mapping; { int i, j, k; struct proxycb_get_glyph_mapping_res_mapping *m; struct proxycb_get_glyph_mapping_res_submapping *s; struct proxycb_get_glyph_mapping_res_symdef *g; fprintf(fp, "Glyph mapping:\n"); fprintf(fp, "No. glyphs: %d\n", mapping->no_glyph); fprintf(fp, "Transparent RGBsym: 0x%lX\n", mapping->transparent); fprintf(fp, "No. mappings: %d\n", mapping->n_mappings); fprintf(fp, "Mappings:\n"); for(i = 0; i < mapping->n_mappings; i++) { m = mapping->mappings + i; fprintf(fp, "%-3d Flags: %s\n", i, m->flags); fprintf(fp, " Base mapping: %d\n", m->base_mapping); fprintf(fp, " Alt. glyph: %d\n", m->alt_glyph); fprintf(fp, " RGBsym: 0x%lX\n", m->symdef.rgbsym); fprintf(fp, " Description: %s\n", m->symdef.description); fprintf(fp, " No. sub mappings: %d\n", m->n_submappings); fprintf(fp, " Sub mappings:\n"); for(j = 0; j < m->n_submappings; j++) { s = m->submappings + j; fprintf(fp, " %-3d RGBsym: 0x%lX\n", j, s->symdef.rgbsym); fprintf(fp, " Description: %s\n", s->symdef.description); fprintf(fp, " No. glyphs: %d\n", s->n_glyphs); fprintf(fp, " Glyphs:\n"); for(k = 0; k < s->n_glyphs; k++) { g = s->glyphs + k; fprintf(fp, " %-3d RGBsym: 0x%lX\n", k, g->rgbsym); fprintf(fp, " Description: %s\n", g->description); } } } } #endif void set_glyph_mapping() { int glyph; int monster_glyphs; #ifdef DEBUG for(glyph = 0; glyph < NO_GLYPH; glyph++) glyph2proxy[glyph] = -1; #endif /* Monsters */ /* Warning: There are assumptions all through this module that the * base monsters start at glyph 0 */ monster_glyphs = set_glyph_mapping_monsters(0); glyph = monster_glyphs; glyph = set_glyph_mapping_monsters_based(monster_glyphs, glyph, GLYPH_PET_OFF); glyph = set_glyph_mapping_invisible_monster(glyph); glyph = set_glyph_mapping_monsters_based(monster_glyphs, glyph, GLYPH_DETECT_OFF); glyph = set_glyph_mapping_monster_corpses(monster_glyphs, glyph); glyph = set_glyph_mapping_monsters_based(monster_glyphs, glyph, GLYPH_RIDDEN_OFF); /* Objects */ glyph = set_glyph_mapping_objects(glyph); /* Others */ glyph = set_glyph_mapping_cmap(glyph); glyph = set_glyph_mapping_explosions(glyph); glyph = set_glyph_mapping_zaps(glyph); glyph = set_glyph_mapping_swallow(monster_glyphs, glyph); glyph = set_glyph_mapping_warning(glyph); if (glyph != NO_GLYPH) panic("Glyph count wrong in mapping (%d != %d)", glyph, NO_GLYPH); #ifdef DEBUG for(glyph = 0; glyph < NO_GLYPH; glyph++) if (glyph2proxy[glyph] < 0 || glyph2proxy[glyph] >= NO_GLYPH) panic("Incomplete glyph mapping; internal glyph %d missing", glyph); #endif } struct proxycb_get_glyph_mapping_res * get_glyph_mapping() { static struct proxycb_get_glyph_mapping_res mapping; mapping.no_glyph = NO_GLYPH; mapping.transparent = RGB_SYM(RGB_TRANSPARENT, 0); mapping.n_mappings = 8 + EXPL_MAX + NUM_ZAP + 2; mapping.mappings = (struct proxycb_get_glyph_mapping_res_mapping *) alloc(mapping.n_mappings * sizeof(*mapping.mappings)); /* Monsters */ get_glyph_mapping_monsters(mapping.mappings + 0); get_glyph_mapping_monsters_based(mapping.mappings + 1, 0, GLYPH_PET_OFF); get_glyph_mapping_invisible_monster(mapping.mappings + 2); get_glyph_mapping_monsters_based(mapping.mappings + 3, 0, GLYPH_DETECT_OFF); get_glyph_mapping_monster_corpses(mapping.mappings + 4, 0); get_glyph_mapping_monsters_based(mapping.mappings + 5, 0, GLYPH_RIDDEN_OFF); /* Objects */ get_glyph_mapping_objects(mapping.mappings + 6); /* Others */ get_glyph_mapping_cmap(mapping.mappings + 7); get_glyph_mapping_explosions(mapping.mappings + 8, 8); get_glyph_mapping_zaps(mapping.mappings + 8 + EXPL_MAX, 8 + EXPL_MAX); get_glyph_mapping_swallow(mapping.mappings + 8 + EXPL_MAX + NUM_ZAP, 0); get_glyph_mapping_warning(mapping.mappings + 8 + EXPL_MAX + NUM_ZAP + 1); #ifdef DEBUG { FILE *fp; fp = fopen("/tmp/glyph.map", "w"); print_glyph_mapping(fp, &mapping); fclose(fp); } #endif return &mapping; } void free_glyph_mapping(mapping) struct proxycb_get_glyph_mapping_res *mapping; { int i, j; for(i = 0; i < mapping->n_mappings; i++) { for(j = 0; j < mapping->mappings[i].n_submappings; j++) if (mapping->mappings[i].submappings[j].n_glyphs) free(mapping->mappings[i].submappings[j].glyphs); if (mapping->mappings[i].n_submappings) free(mapping->mappings[i].submappings); } if (mapping->n_mappings) free(mapping->mappings); } slashem-0.0.7E7F3/win/proxy/test_xdr.c0000664000076400007640000001666310545462317015646 0ustar aliali/* $Id: test_xdr.c,v 1.3 2002/11/02 15:47:04 j_ali Exp $ */ /* Copyright (c) Slash'EM Development Team 2001 */ /* NetHack may be freely redistributed. See license for details. */ /* * This module tests the NhExt implementation of XDR by using it to write * and read data to and from the equivalent code produced by rpcgen. * * Note: You need rpcgen to build this test program. * It should be built once with RPCGEN defined to get a version which * uses Sun Microsystems's rpc library and once without to get a * version which uses our implementation. The two can then be tested * for compatibility. */ #include #ifdef RPCGEN #include #else #include "hack.h" #include "nhxdr.h" #endif /* RPCGEN */ #ifdef RPCGEN #define SIZE(array) (sizeof(array)/sizeof(*(array))) #define nhext_xdr_bool_t bool_t #define NHEXT_XDR_DECODE XDR_DECODE #define NHEXT_XDR_ENCODE XDR_ENCODE #define NHEXT_XDR_FREE XDR_FREE #define nhext_xdr_op xdr_op typedef XDR NhExtXdr; typedef xdrproc_t nhext_xdrproc_t; #define nhext_xdrmem_create xdrmem_create #define nhext_xdr_getpos xdr_getpos #define nhext_xdr_setpos xdr_setpos #define nhext_xdr_destroy xdr_destroy #define nhext_xdr_short xdr_short #define nhext_xdr_long xdr_long #define nhext_xdr_int xdr_int #define nhext_xdr_char xdr_char #define nhext_xdr_u_short xdr_u_short #define nhext_xdr_u_long xdr_u_long #define nhext_xdr_u_int xdr_u_int #define nhext_xdr_u_char xdr_u_char #define nhext_xdr_enum xdr_enum #define nhext_xdr_bool xdr_bool #define nhext_xdr_vector xdr_vector #define nhext_xdr_array xdr_array #define nhext_xdr_string xdr_string #else typedef nhext_xdr_bool_t (*nhext_xdrproc_t) (); #endif /* RPCGEN */ int test_long(xdrs, op) NhExtXdr *xdrs; enum nhext_xdr_op op; { int i; long l; for(i = 0; i < 8; i++) { l = i; if (!nhext_xdr_long(xdrs, &l)) { fprintf(stderr, "nhext_xdr_long failed\n"); return FALSE; } if (op == NHEXT_XDR_DECODE) printf("%ld ", l); } if (op == NHEXT_XDR_DECODE) putchar('\n'); return TRUE; } int test_vector(xdrs, op) NhExtXdr *xdrs; enum nhext_xdr_op op; { int i; short vector[8]; for(i = 0; i < 8; i++) vector[i] = i; if (!nhext_xdr_vector(xdrs, (char *)vector, SIZE(vector), sizeof(short), (nhext_xdrproc_t)nhext_xdr_short)) { fprintf(stderr, "nhext_xdr_vector failed\n"); return FALSE; } if (op == NHEXT_XDR_DECODE) { printf("[ "); for(i = 0; i < 8; i++) printf("%d ", vector[i]); putchar(']'); putchar('\n'); } return TRUE; } int test_array(xdrs, op) NhExtXdr *xdrs; enum nhext_xdr_op op; { int i; unsigned int length; unsigned char *array; if (op == NHEXT_XDR_ENCODE) { array = malloc(5); if (!array) { fprintf(stderr, "malloc failed\n"); return FALSE; } array[0] = 'h'; array[1] = 'e'; array[2] = array[3] = 'l'; array[4] = 'o'; length = 5; } else array = NULL; if (!nhext_xdr_array(xdrs, (char **)&array, &length, (unsigned int)-1, sizeof(unsigned char), (nhext_xdrproc_t)nhext_xdr_u_char)) { fprintf(stderr, "nhext_xdr_array failed\n"); return FALSE; } if (op == NHEXT_XDR_DECODE) { printf("< "); for(i = 0; i < length; i++) printf("'%c' ", array[i]); putchar('>'); putchar('\n'); } free(array); array = NULL; length = 0; if (!nhext_xdr_array(xdrs, (char **)&array, &length, (unsigned int)-1, sizeof(unsigned char), (nhext_xdrproc_t)nhext_xdr_u_char)) { fprintf(stderr, "nhext_xdr_array failed\n"); return FALSE; } if (op == NHEXT_XDR_DECODE) { printf("< "); for(i = 0; i < length; i++) printf("'%c' ", array[i]); putchar('>'); putchar('\n'); } if (array) { fprintf(stderr, "nhext_xdr_array allocated on empty array\n"); return FALSE; } return TRUE; } int test_string(xdrs, op) NhExtXdr *xdrs; enum nhext_xdr_op op; { int i; char *string; if (op == NHEXT_XDR_ENCODE) string = strdup("Hello world!"); /* Multiple of 4 bytes */ else string = NULL; if (!nhext_xdr_string(xdrs, &string, (unsigned int)-1)) { fprintf(stderr, "nhext_xdr_string failed\n"); return FALSE; } if (op == NHEXT_XDR_DECODE) printf("\"%s\"\n", string); free(string); if (op == NHEXT_XDR_ENCODE) string = strdup("Goodbye"); /* Not a multiple of 4 bytes */ else string = NULL; if (!nhext_xdr_string(xdrs, &string, (unsigned int)-1)) { fprintf(stderr, "nhext_xdr_string failed\n"); return FALSE; } if (op == NHEXT_XDR_DECODE) printf("\"%s\"\n", string); free(string); if (op == NHEXT_XDR_ENCODE) string = strdup(""); else string = NULL; if (!nhext_xdr_string(xdrs, &string, (unsigned int)-1)) { fprintf(stderr, "nhext_xdr_string failed\n"); return FALSE; } if (op == NHEXT_XDR_DECODE) printf("\"%s\"\n", string); free(string); return TRUE; } int test_bool(xdrs, op) NhExtXdr *xdrs; enum nhext_xdr_op op; { nhext_xdr_bool_t bool = TRUE; if (!nhext_xdr_bool(xdrs, &bool)) { fprintf(stderr, "nhext_xdr_bool failed\n"); return FALSE; } if (op == NHEXT_XDR_DECODE) printf("%s ", bool == TRUE ? "TRUE" : bool == FALSE ? "FALSE" : "???"); bool = FALSE; if (!nhext_xdr_bool(xdrs, &bool)) { fprintf(stderr, "nhext_xdr_bool failed\n"); return FALSE; } if (op == NHEXT_XDR_DECODE) printf("%s\n", bool == TRUE ? "TRUE" : bool == FALSE ? "FALSE" : "???"); return TRUE; } int test_enum(xdrs, op) NhExtXdr *xdrs; enum nhext_xdr_op op; { enum nhext_xdr_op e; e = NHEXT_XDR_DECODE; if (!nhext_xdr_enum(xdrs, (int *)&e)) { fprintf(stderr, "nhext_xdr_enum failed\n"); return FALSE; } if (op == NHEXT_XDR_DECODE) switch(e) { case NHEXT_XDR_DECODE: printf("NHEXT_XDR_DECODE "); break; case NHEXT_XDR_ENCODE: printf("NHEXT_XDR_ENCODE "); break; case NHEXT_XDR_FREE: printf("NHEXT_XDR_FREE "); break; default: printf("??? "); break; } e = NHEXT_XDR_ENCODE; if (!nhext_xdr_enum(xdrs, (int *)&e)) { fprintf(stderr, "nhext_xdr_enum failed\n"); return FALSE; } if (op == NHEXT_XDR_DECODE) switch(e) { case NHEXT_XDR_DECODE: printf("NHEXT_XDR_DECODE\n"); break; case NHEXT_XDR_ENCODE: printf("NHEXT_XDR_ENCODE\n"); break; case NHEXT_XDR_FREE: printf("NHEXT_XDR_FREE\n"); break; default: printf("???\n"); break; } return TRUE; } int codec(buf, len, maxlen, op) char *buf; unsigned int *len; unsigned int maxlen; enum nhext_xdr_op op; { int retval; NhExtXdr xdrs; unsigned int pos; nhext_xdrmem_create(&xdrs, buf, maxlen, op); if (op == NHEXT_XDR_ENCODE) pos = nhext_xdr_getpos(&xdrs); retval = test_long(&xdrs, op) && test_vector(&xdrs, op) && test_array(&xdrs, op) && test_string(&xdrs, op) && test_bool(&xdrs, op) && test_enum(&xdrs, op); if (op == NHEXT_XDR_ENCODE) *len = nhext_xdr_getpos(&xdrs) - pos; nhext_xdr_destroy(&xdrs); return retval; } reader() { unsigned int nb; char buf[200]; nb = fread(buf, 1, sizeof(buf), stdin); return codec(buf, &nb, nb, NHEXT_XDR_DECODE); } writer() { unsigned int nb; char buf[200]; if (!codec(buf, &nb, sizeof(buf), NHEXT_XDR_ENCODE)) return FALSE; fwrite(buf, 1, nb, stdout); return TRUE; } main(argc, argv) int argc; char **argv; { int retval; if (argc != 2 || argv[1][0]!='-' || argv[1][1]!='r' && argv[1][1]!='w' || argv[1][2]) { fprintf(stderr, "Usage: %s -r | -w\n", argv[0]); exit(1); } if (argv[1][1]=='r') retval = reader(); else retval = writer(); exit(!retval); } slashem-0.0.7E7F3/win/proxy/mapid.c0000664000076400007640000001017710545462317015076 0ustar aliali/* $Id: mapid.c,v 1.2 2001/12/24 07:56:33 j_ali Exp $ */ /* Copyright (c) Slash'EM Development Team 2001-2002 */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" #include "nhxdr.h" #include "winproxy.h" /* * [ALI] It would be far too much work to pass generic identifiers to * plug-in window ports (and also pointless). Instead we substitute * integers. We keep a record of the mapping so that we can reverse * this in the reply. * Note: zero is a special value and must be preserved. Window ports * should treat all other values as opaque. */ struct mapid__window { winid id; int no_identifiers; anything *identifiers; }; static int mapid__no_windows; static struct mapid__window *mapid__windows; /* * Get the index into mapid__windows for window id, adding an * entry if necessary. */ static int mapid__add_winid(id) winid id; { int i; if (id == WIN_ERR) panic("mapid__add_winid: Bad window ID"); for(i = 0; i < mapid__no_windows; i++) if (mapid__windows[i].id == id) return i; for(i = 0; i < mapid__no_windows; i++) if (mapid__windows[i].id == WIN_ERR) break; if (i == mapid__no_windows) { if (mapid__no_windows++) mapid__windows = (struct mapid__window *)realloc(mapid__windows, mapid__no_windows * sizeof(*mapid__windows)); else mapid__windows = (struct mapid__window *)malloc(sizeof(*mapid__windows)); if (!mapid__windows) panic("proxy: can't get %d bytes", mapid__no_windows * sizeof(*mapid__windows)); } mapid__windows[i].id = id; mapid__windows[i].no_identifiers = 0; mapid__windows[i].identifiers = (anything *)0; return i; } /* * Scrap any entry in mapid__windows for window id. */ void mapid_del_winid(id) winid id; { int i; if (id == WIN_ERR) panic("mapid_del_winid: Bad window ID"); for(i = 0; i < mapid__no_windows; i++) if (mapid__windows[i].id == id) { if (mapid__windows[i].no_identifiers) free(mapid__windows[i].identifiers); mapid__windows[i].id = WIN_ERR; break; } } /* * Map identifier into an integer which can be used to unmap back to * the same identifier later. Zero is treated specially and will always * map to zero (and non-zero identifiers will never map to zero). */ int mapid_map_identifier(id, identifier) winid id; const anything *identifier; { int i, j; if (identifier->a_void == 0) return 0; i = mapid__add_winid(id); if (j = mapid__windows[i].no_identifiers++) mapid__windows[i].identifiers = (anything *)realloc(mapid__windows[i].identifiers, mapid__windows[i].no_identifiers * sizeof(*mapid__windows->identifiers)); else mapid__windows[i].identifiers = (anything *)malloc(sizeof(*mapid__windows->identifiers)); if (!mapid__windows[i].identifiers) panic("proxy: can't get %d bytes", mapid__windows[i].no_identifiers * sizeof(*mapid__windows->identifiers)); mapid__windows[i].identifiers[j] = *identifier; return j + 1; } /* * Retrieve the identifier from the mapping. */ void mapid_unmap_identifier(id, mapping, identifier) winid id; int mapping; anything *identifier; { int i; if (mapping == 0) { identifier->a_void = 0; return; } if (id == WIN_ERR) panic("mapid_unmap_identifier: Bad window ID"); for(i = 0; i < mapid__no_windows; i++) if (mapid__windows[i].id == id) break; if (i == mapid__no_windows) { impossible("Ext: Trying to unmap on an unopened window?"); identifier->a_void = 0; return; } if (mapping < 1 || mapping > mapid__windows[i].no_identifiers) { impossible("Bad identifier returned from plug-in."); identifier->a_void = 0; return; } *identifier = mapid__windows[i].identifiers[mapping - 1]; } /* * Discard all previously mapped identifiers for window. */ void mapid_del_identifiers(id) winid id; { int i; if (id == WIN_ERR) panic("mapid_del_indentifiers: Bad window ID"); for(i = 0; i < mapid__no_windows; i++) if (mapid__windows[i].id == id) { if (mapid__windows[i].no_identifiers) free(mapid__windows[i].identifiers); mapid__windows[i].identifiers = (anything *)0; mapid__windows[i].no_identifiers = 0; break; } } slashem-0.0.7E7F3/win/gem/0000775000076400007640000000000010545462317013221 5ustar alialislashem-0.0.7E7F3/win/gem/tile2img.c0000664000076400007640000000725210545462317015107 0ustar aliali/* SCCS Id: @(#)tile2bmp.c 3.2 95/09/06 */ /* Copyright (c) NetHack PC Development Team 1995 */ /* NetHack may be freely redistributed. See license for details. */ /* * Edit History: * * Initial Creation M.Allison 94/01/11 * Marvin was here Marvin 97/01/11 * */ /* #include */ #include "hack.h" #include "tile.h" #include "bitmfile.h" /* #define COLORS_IN_USE MAXCOLORMAPSIZE /* 256 colors */ #define COLORS_IN_USE 16 /* 16 colors */ extern char *FDECL(tilename, (int, int)); static void FDECL(build_ximgtile,(pixel (*)[TILE_X])); void get_color(unsigned int colind, struct RGB *rgb); void get_pixel(int x, int y, unsigned int *colind); #if COLORS_IN_USE==16 #define MAX_X 320 /* 2 per byte, 4 bits per pixel */ #else #define MAX_X 640 #endif #define MAX_Y 1200 FILE *tibfile2; pixel tilepixels[TILE_Y][TILE_X]; char *tilefiles[] = { "..\\win\\share\\monsters.txt", "..\\win\\share\\objects.txt", "..\\win\\share\\other.txt"}; unsigned int **Bild_daten; 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; if (argc != 2) { Fprintf(stderr, "usage: tile2img outfile.img\n"); 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); } fclose(fp); Bild_daten=(unsigned int **)malloc(MAX_Y*sizeof(unsigned int *)); for(i=0;i 62) { Fprintf(stderr, "too many colors (%d)\n", num_colors); exit(EXIT_FAILURE); } while (read_text_tile(tilepixels)) { build_ximgtile(tilepixels); tilecount++; xoffset += TILE_X; if (xoffset >= MAX_X) { yoffset += TILE_Y; xoffset = 0; } } (void) fclose_text_file(); ++filenum; } Fprintf(stderr, "Total of %d tiles in memory.\n",tilecount); bitmap_to_file(XIMG, MAX_X, (tilecount/20+1)*16, 372, 372, 4, 16, bmpname, get_color, get_pixel ) ; Fprintf(stderr, "Total of %d tiles written to %s.\n",tilecount, bmpname); exit(EXIT_SUCCESS); /*NOTREACHED*/ return 0; } void get_color(unsigned int colind, struct RGB *rgb){ rgb->r=(1000L*(long)ColorMap[CM_RED][colind])/0xFF; rgb->g=(1000L*(long)ColorMap[CM_GREEN][colind])/0xFF; rgb->b=(1000L*(long)ColorMap[CM_BLUE][colind])/0xFF; } void get_pixel(int x, int y, unsigned int *colind){ *colind=Bild_daten[y][x]; } static void build_ximgtile(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 = cur_y + yoffset; x = cur_x + xoffset; Bild_daten[y][x] =cur_color; } } } slashem-0.0.7E7F3/win/gem/gr_rect.h0000664000076400007640000000065510545462317015025 0ustar aliali/* 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); slashem-0.0.7E7F3/win/gem/load_img.c0000664000076400007640000001574710545462317015156 0ustar aliali#define __TCC_COMPAT__ #include #include #include #include #include #include #include #include #include "load_img.h" #ifndef FALSE #define FALSE 0 #define TRUE !FALSE #endif /* VDI <-> Device palette order conversion matrixes: */ /* Four-plane vdi-device */ int vdi2dev4[]={0,15,1,2,4,6,3,5,7,8,9,10,12,14,11,13}; /* Two-plane vdi-device */ int vdi2dev2[]={0,3,1,2}; void get_colors(int handle, short *palette, int col){ int i, idx; /* get current color palette */ for(i=0; i < col; i ++){ /* device->vdi->device palette order */ switch(planes){ case 1: idx=i;break; case 2: idx=vdi2dev2[i];break; case 4: idx=vdi2dev4[i];break; default: if(i<16) idx=vdi2dev4[i]; else idx= i==255 ? 1 : i; } vq_color(handle, i, 0, (int *)palette + idx * 3); } } void img_set_colors(int handle, short *palette, int col){ int i, idx, end; /* set color palette */ end=min(1<fd_addr; /* initialize some variables and zero temp. line buffer */ mplanes=min(image->fd_nplanes, planes); /* convert image */ line_addr=image_addr; buf_addr=screen_addr; if(mplanes>1){ /* cut/pad color planes into temp buf */ for(plane=0; planefd_addr); /* convert image line in temp into current device raster format */ if((new1_addr=(char *) calloc(1,new_size)) == NULL) return(FALSE); dev_form.fd_addr=new1_addr; vr_trnfm(x_handle, &tmp, &dev_form); free(new_addr); /* change image description */ image->fd_stand=0; /* device format */ image->fd_addr=new1_addr; image->fd_nplanes=planes; return(TRUE); } int transform_img(MFDB *image){ /* return FALSE if transform_img fails */ int success; long size; if(!image->fd_addr) return(FALSE); size=(long)((long)image->fd_wdwidth * (long)image->fd_h); success=convert(image, size); /* Use vr_trfm(), which needs quite a lot memory. */ if(success) return(TRUE); /* else show_error(ERR_ALLOC); */ return(FALSE); } /* Loads & depacks IMG (0 if succeded, else error). */ /* Bitplanes are one after another in address IMG_HEADER.addr. */ int depack_img(char *name, IMG_header *pic){ int b, line, plane, width, word_aligned, opcode, patt_len, pal_size, byte_repeat, patt_repeat, scan_repeat, error = FALSE; char *pattern, *to, *endline, *puffer, sol_pat; long size; FILE *fp; if((fp = fopen(name, "rb")) == NULL) return(ERR_FILE); setvbuf(fp,NULL,_IOLBF,BUFSIZ); /* read header info (bw & ximg) into image structure */ fread((char *)&(pic->version), 2, 8 + 3, fp); /* only 2-256 color imgs */ if(pic->planes < 1 || pic->planes > 8){ error = ERR_COLOR; goto end_depack; } /* if XIMG, read info */ if(pic->magic == XIMG && pic->paltype == 0){ pal_size = (1 << pic->planes) * 3 * 2; if((pic->palette = (short *)calloc(1,pal_size))){ fread((char *)pic->palette, 1, pal_size, fp); } }else{ pic->palette = NULL; } /* width in bytes word aliged */ word_aligned = (pic->img_w + 15) >> 4; word_aligned <<= 1; /* width byte aligned */ width = (pic->img_w + 7) >> 3; /* allocate memory for the picture */ free(pic->addr); size = (long)((long)word_aligned * (long)pic->img_h * (long)pic->planes); /*MAR*/ /* check for header validity & malloc long... */ if (pic->length > 7 && pic->planes < 33 && pic->img_w > 0 && pic->img_h > 0){ if(!(pic->addr=(char *)calloc(1,size))){ error = ERR_ALLOC; goto end_depack; } }else{ error = ERR_HEADER; goto end_depack; } patt_len = pic->pat_len; /* jump over the header and possible (XIMG) info */ fseek(fp, (long) pic->length * 2L, SEEK_SET); for(line=0,to=pic->addr; lineimg_h; line+=scan_repeat){ /* depack whole img */ for(plane=0,scan_repeat=1; planeplanes; plane++){ /* depack one scan line */ puffer=to=pic->addr+(long)(line+plane*pic->img_h)*(long)word_aligned; endline=puffer+width; do{ /* depack one line in one bitplane */ switch((opcode= fgetc(fp))){ case 0: /* pattern or scan repeat */ if((patt_repeat=fgetc(fp))){ /* repeat a pattern */ fread(to,patt_len,1,fp); pattern=to; to+=patt_len; while(--patt_repeat){ /* copy pattern */ memcpy(to,pattern,patt_len); to+=patt_len; } }else{ /* repeat a line */ if(fgetc(fp)==0xFF) scan_repeat=fgetc(fp); else{ error = ERR_DEPACK; goto end_depack; } } break; case 0x80: /* Literal */ byte_repeat=fgetc(fp); fread(to,byte_repeat,1,fp); to+=byte_repeat; break; default: /* Solid run */ byte_repeat = opcode & 0x7F; sol_pat = opcode&0x80 ? 0xFF : 0x00; while(byte_repeat--) *to++=sol_pat; } }while(to 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 */ /* to=pic->addr+(long)(line+1+plane*pic->img_h)*(long)word_aligned;*/ for(b=scan_repeat-1; b; --b){ memcpy(to, puffer, width); to+=word_aligned; } } }else{ error = ERR_DEPACK; goto end_depack; } } } end_depack: fclose(fp); return(error); } int half_img(MFDB *s, MFDB *d){ int pxy[8], i, j; MFDB tmp; mfdb(&tmp,NULL,s->fd_w/2,s->fd_h,s->fd_stand,s->fd_nplanes); tmp.fd_w=s->fd_w/2; tmp.fd_addr=calloc(1,mfdb_size(&tmp)); if(!tmp.fd_addr) return(FALSE); pxy[1]=pxy[5]=0; pxy[3]=pxy[7]=s->fd_h-1; for(i=0;ifd_w/2;i++){ pxy[0]=pxy[2]=2*i; pxy[4]=pxy[6]=i; vro_cpyfm(x_handle,S_ONLY,pxy,s,&tmp); } pxy[0]=pxy[4]=0; pxy[2]=pxy[6]=s->fd_w/2-1; for(j=0;jfd_h/2;j++){ pxy[1]=pxy[3]=2*j; pxy[5]=pxy[7]=j; vro_cpyfm(x_handle,S_ONLY,pxy,&tmp,d); } free(tmp.fd_addr); return(TRUE); } slashem-0.0.7E7F3/win/gem/title.uu0000664000076400007640000006325010545462317014723 0ustar alialibegin 777 title.img M $ .P $ $!= %T 4 R%A)34< /H ^@#Z /H &K ^@ /H ^@ M #Z /H #Z LH#Z &K CT"R@$: :L!JP+* 1H CT /H M :L (] 1H -; UL"R@/H LH"/0 _PDH*"BH!H ) ?_@'_^_ M___'A( /_#_\!__X _P#__P?__P!B@HAH )_@ ?X ! X!( / \ #^ ' M__ /\ /@ /A@>!@ ?@#_^____'@X 0W_@?^ /_\ __ ?_X!__P 8H!X ( M?\ '_Q___X.#@ ^/\ _P ?_@ ?P ?_ #_\'AX (?]_W_U___[N#@!"O]^_W M_?_O_\?S^?_?[_\_A@> "& P!@,8 #& X !V( .&!@8 8 P '@.$8# # ,' M* > "#_@ _X/__^#@X /C_ /\ #_X ?_ #_@ ?^!X> "* O^@+H "Z X / MJ!?H%_Z +_^8#>Z O_0"AP> "& P P8, #& X /S# ,, & 8 #@ Q&!P P& M!R@'@ @_X '\!___@X. #X?@!^ _\ ?_X _X '_ >'@ B@+_T%] N@. M#[0O]"_^@%__8 +N@;_T!8<'@ @P, &&# Q@. #\PP## !@& !P &Q@X , M# "- O_H7T "Z X /M"_T+_Z 7_Z (Z" M_^@7AP6 "O@ ,!X!A_P /X#@!#\/XP_@8!_ P \8/^&#_\!@B !P8 ? M #@#@ !N@O_07X<%@!U\ # ? 8?L/_S^ M?P'X_#\,/P, /@<'_#&#_&!_X 8%@ H0 ' '@ X X ', \ #P #@6 M!/P '^ &!8 *' ?]P#]Y___NX. $+?O!^\!_^X!_A_@_OP_W^ &A8 <[__0 M%_Z%]#_\NG\!^+0O]"_] "_Y!APN@O^@7X<%@!T\ # / 8?L?__^_X/__#\, M/P, /@8/_CN#^&#_P 8%@ H0 # '@ X X 0, \ #P #@ !X H ^ _ MP 8%@!T< !_[ /WGP .[@/X'M^\'[P'_[@/YX^K^^#^_P :%@!SO_] +_H7T M0 .Z@(('M"_T+_T +_H)XBZ"_Z"_AP6 "#P , \!A^Q_@X 2@__\/PP_ P ^ M!A__/X/PP/^ !@6 '1@ , > ?_#A^ /@P#P / . ?X#@#P #^ !@6 M'1P '_L _>??_+M^_OBW[P?O ?_N _?Y[O[P?[^ !H6 '.?_T O^A?1?_+M^ M@OBT+_0O_0 O^A?Y+H+_0+^'!8 ??_SI^_O\W[P?O ?_N ^_^[O[P_W\'A8 ?_[A^ /^P#P / ' !__#@#P /X'!8 <'X ?^X#]Y]__N'[^ M_[?O!^\!^_<'W_]N_O#^_@>%@!OG_] +_H7T7_^Y_H+_M"_T+_T*%_1?_VZ" M_H*(!8 ??__A^_O_W[P?O _OW M!]__KO[Q_OX'A8 ;Y__0!?Z%]%__^?Z"__0O]"_Z"A?T7_^N@OT"B 6 '#_ M, ?!A^Q___Q_@__\/PP_!@X?#/_A_X/V!_P'!8 <&\ < !X!__^'X __ / M \ < /^'. / !_ <%@!P?P!_]P/WGW__X?O[_]^\'[P/[]P>_X<[^\_W\ M!X6 &^?_T 7^A?1?__O^@O_T+_0O^@H7]+__SH+Z!8@%@!P_P# 'P8?L?@ \ M>8/P?#\,/P8>'QS_@'^#_ _\!P6 '!O ' > > #QX /!P#P / ' #^ M;@#P _P'!8 <'\ ?_<#]Y]X /'C^\'?O!^\#\_<'OX!N_O?[_ >%@!OG_] % M_H7T7____H+_]"_T+_H2%^2__^Z"] N(!8 ?> QP_O '[P?O _7W#W\ 'O[W^_@'A8 ;Y__0 OZ%]%____Z" M__0O]"_Z%1?I?__^@O0+B 6 '#_ , /!A^Q^ 1AH_ ,/_P_!A\?F?X #X/X M'_ '!8 -&\ , !X!X !& \ . # \ ! > ?@ . . '\ <%@!P?P!_^P/WG MW@ $8-[P!^ '[P/U]X]^ [^[_?P!X6 &^?_T +^A?1?___^@O_T( 0O^A47 MZ7___H+H%X@%@!P_P# #X8?L?@ 88/P#!_X/PP?#YG^ >#\#_P!P6 #1O M #@ > > !@ / #@ P/ 0#@'X !@# #_ '!8 <'\ ?_N#]Y]X &#^\ ?_ M_^\']?N/?@ &_M_O\ >%@!OG_] "_H7T7____H+_]!_X+_05"^E___Z"T"^( M!8 ?> ! GO '___O!_7[CWP M O[?[^ 'A8 ;Y__0 OZ%]%____Z"__0 "_T%0OI?__^@M OB 6 '#_ , 'A MA^Q^ !Z_ , _##\/F?P 8/@?\ '!8 (&\ & !X!X$@ 'P X &#P , M X!\!( "'\ '!8 ('\ ?_V#]Y]X#@!&6\ ?__^\'[?N/? _C_?P >%@!OG M_] !?H7T7____H+_] +_0M"^E___Z"(%^(!8 >!( !\ . !@\ #@. > 2 C^ !P6 "!_ 'O]P_>?> M X 1_O '___O!^[[GW@ /__OX 'A8 ;Y__2@7Z%]%____Z"__0 "_T+HO1 M?__^@ "_B 6 &W_ ,X#QA^Q^! !F_ , !_##^'\?@ 8 !_P@%@ @[P M, '@'@2 ? #@ 8/ X!P'@$@ %_" 6 "#_ 'O^P_>?> X 0YO '__^O!^[] MWW@ /__?PB%@!O'_]* OH7T7_O__H+_] +_0NA=%___Z 7^(@ $.!(& M&L S@/&'['X, '#\ P #\8/X?S^ !@ '_"( !#@2 "#O P > >!( ! M\ . !@\ #@' ^ 2 7\(!8 (/\ >_[#]Y]X#@!"^\ ?__^\/[OW>^ __]_ M"(6 &\?_TH"^A?1?\__^@O_T OZ"Z%TO___H !?XB (!^ !_\ SP/F' M['X\ &+\ P?^'\8?X?S^ !@ /^"( "'X #@ A[P . '@'@2 ? #@ 8/ M !X!P/@$@ '^" 6 &W_ 'G^X_>?>" ]O '__^O#][]WO@ /_^_@B%@!J' M_]) OH7T7\O__H+_]!_X+^A>A=+___Z HF 3.$@!O\ #/ P88,8?P << M#+_\,!AAAC, & 8 #@ )Y7@. 3^$@ 'X'8 "!_X#@ $,!( 5_ >?X#\ M!\ X "Z =@!^ /P/P> X($@ )__@.%@!4$ !) @(0$0#@ (( !" $( A MA!(#@ * 02 G@!@X @;X . #-@888,?\P ;\ ## ,,!AAAC, &! M@8 %@ -UP " 7^$@ & 'X ##\ @!H0?____? 'C_ _ ? ^ P@ 'X ?@ M#\#\'@."!H #?\ A( 6_G $B! A 1 R @@ $( 0@"$"$$@. H&!!H # M<#__@ %?A * &3-@888,/PP 8, #K ,82 M 7 @@ (# ( !( . %@.( !X_P/P'__@ /X !6 'H _ ?AX#@ /^?X &@ (/ M (2 %OSX !(@0(0$/P@ (( !" $( A 0A(#@ ."0( &@ (,_X2 '/X #,P M888, P ?, #+ -L!A@PS, &#X, '@ ' @ '@@ 55555^^"& 4 $@!8' M! >'\#\!__X ". =@!F /P'X> X #_C^ !X !P(2 %OF, !(00(0$ @ M (( !" $( A 0A(#@ ."(( '@ &_A( <_ ,S QA@P C !XP ,, SP-,## M,P 8-@P > 3" < #@ (=O"& 1 $@!8& @ >'^#\!_]X "> ?@!R ; M@'X> X #_C^ !X !,(2 %OL& !(0((0$ @ (( !" $(!" 0A(#@ ."(( ' M@ $OA( 6_ '_\_@_A_P)#___T__\/_T_\O_#\X. X/P?X> ?" < #@ (- M_"($@!P& __>[^[]]_;[__ZN__?O]N_=OW[>___^_M_?AX !\(2 '/L'_]+H M+H7T O__H+_]"_T+]"_0M+___Z"T%^(A( 6Z '_\_@_A_P'[___@__\?_R_ M^?_#\X. X/P?X> >" 8 #@!P)_?_ X X!\ #__X __ /\ _ /P# ___^ M , ?AX !X 2 '!(#_][O[OWW__O__O[_]Z_W;]:_?M[___[^W]^'@ '@A8 5 M!@ 2"""$! ?H "" 0@!" 0@$(2 X #@A! !X !'X& #*JJJH !__/X/Z?\ M/X. "L?__'_\__?_P_.#@ .#\'^'@ $P@ & !( ;^?_ X X!\ #__X __ / M\ _ /P# ___^ , ?AX !, & 'U5557D%_][O[MWW^!O__KK_]Z_W+]B_?M[_ M__[^W]^'@ $PA8 5C@ 2"""$!#@8 "" 0@!" 0@$(2 X #@A! !X& 5\$ M@ <#__/\/[?\A( *@__]/_X_\/_!\X. X/X/X: L7\!8 ;<__ \ 8!\ ?C M__X __ /\ _ !P! ___^ . /AH "Q?R 2"#@!S\B__>]];-]T?C__[^__;O M]>_?AW]>___^_N_OAH "Q?R%@ C\ !($$(0$0 . "H( !" $(!" 01(#@ ." M"" &@ (__X !! 2 " ?_]_R?C_Q_@X *@__]O_T_X7_A\X. \/X/X2 !/P) M__X%@!L'_\#P!@'P'_O__@#_\ _P#X $#___X X ^$@ 3\"?_^@ %[@X < M_G?_VO=V]???^__^_O_V;_;OOOA?7O___K[O[X2 !/P)__Z%@ CX !($$(0$ M0 . "H( !" $("!X01(#@ .""" $@ $#@P6 "(__^_X_E_Q_@X *S___/_^_ MZQ_I]X. YOX/X. H"?@P6 &XO_P/@& ? ?___^ /_P#_ /@ 0/___@#@ M#X. H"?@X !/X2 &X__UOO6[???___^LO_T[_1OM.>76O___N;O[X. H"? M@X6 "'0 $@(0A 1 X *@@ $( 0@( >!$@. X((( . 7^$ 8 !?X6 !?/_ M#^?]A( *Q__\/_T_?VS1\X. \/\'X> ?X!@!5____^>__ ^ (!\!____X M__ /\ \#@ = ___^ / 'AX !_H !'X. '/Y__][Z^IWV7____KK_]^_V[R"3 M+U[___Z^]_>'@ '^A8 ;A__2^@J%]%____Z"__0O]"^@ %2___^@O07B( ! M 8: !O/_G__\?X. "OO__+__?W:.>_.#@ .C_!^'@ 'X@ $!A( 1.__ _ (! M\!____X __ /\ \#@ = ___^ / 'AX !^( !#X2 &S__WOUJA???___^AO_W M;_2O*7&%7O___M[W]X> ?B%@!O'_]+]"H7T7____H+_]"_T+Z 5+___Z" M]!>(@ $'AH %\_\OK_R'@ 5__/]]](6 X/^'X> :" 0>$@!&[_\#\ @'P M'____@#_\ _P#P2"@ 3^ /@'AX !H( !!X2 &[__WOW:U?=?___^@O_TK_ :"%@!O'_]+]"H7T7____H+_]"_T+Z( )+___Z"^A>( M@ $'B( #G\_]A( *B___/_]_>?WW]X. ^?^#X: F@ @ $'A( 1F__ _@(! M\!____X __ /\ \$@H $_@#X X: F@ @ $'A( ;G__2_NJU]E____[V__3O M]*\G_@B:___^FOO[AH ": "%@!OG_]+^BH7T7____H+_]"_TKZ/\ )K___Z" M^@N(@ $#AH &]_^7__Q_@X %V___?_Z#@ +L]X2 OX/A( $[4 ( ! X2 M$=O_P/X! ? ?___^ /_P#_ /!( &?__^ /@#A( $[4 ( ! X2 &]__VO[M MA???___^IO_TK_4O0@/SF7___H+[^X2 !.U "%@!OG_]+^A87T7____H;_ M]"_U+T(#X)E___Z"^@N(@ (!^ . '#_ ,_'GU^_^ !O_ -?PW_[__^_? M ?_S3X '@ (!^ . "!O / > >!( *\ / \ _ @< . _ #@ > @'X M X ('\ >\)LMY%X#@!'"\ :O!B]2_!&K< @O&[@ >%@!OG_]+^@P7T7___ M_L+_]"_T+T+\$*E___Z"_0N( 8 !X . '#_ /_#5G^]^ !@_ ,/P[_U__Z M__ ??S3X ' 8 !X . "!O / > >!( *\ / \ _\ @< . _ !@ %@!OG_]+_0 7T M7____M[_]*_T+V+_T*E___Z"_06(!8 %@!OG_]+_0 7T7__]_NK_]"_T M;T+_TDE___Z"_06(!8 %@!OG_]+_H 7T7__]_IK_]&_U;T+_T4M___Z" M_H6(!8 @O""P >%@!OG_]+_H 7U7__Y_J;_]._U+M7_ZDE___Z"_H*(!8 % M@!OG_]+_T 7W7__Y_H[_]B_V+L7_[%:___Z2_H*(!8 %@!SG_]+_T 7T M7__U_O;_]:_U;HW_[-2___:2_T%_AP6 '#_ -_ V[^[^ XAB_ /OPS_K_ 8 M?O@ ">_P]> '!8 6&\ \ !X!X " \ / X!\ 0. . _ 8 <%@!P? MP!KP&17E7@ $(/;P!&\'+M7P#]6X "2\$M@!X6 '.?_TO_0%?1?__7^]O_T M;_4NU?_N5;__]H+_07^'!8 9S_#[ MX <%@!8;P #P '@'@ ( #P \ #@'P 8 X #\ !@!P6 '!_ $O +5>1> M P@MO 'KP?N[? *IM@ ++P16 'A8 O]^[E_^JF MW__FDO]!?X<%@!P_P#?P'=?O_@ V89/P##\,/R_@&O_X !G'\'7P!P6 %AO M / > > !@ / #P , ^ "!@#@ /P # '!8 <'\ :\ HMY%X '&#N\ ?O M!^W;X TJ6 NO JL >%@!SG_]+_Z@WT7__=_N[_]^_W[=O_[2I?_^::_ZB_ MAP6 '#_ /_ /M^U^ .9AP_ ,/PP^#^ ,?WP .?_P?_ '!8 6&\ \ !X!X M & \ / @#X (' . _ , <%@!P?P!+P!$WFW@ \8+[P!^\'Z_O@!ZK< M !""\""P!X6 '.?_TO_T3?;?_SW^OO_W[_?K^__WJM__UH+_H+^'!8 => /S@_W /]P_W^^ 'Z^P ,.+P(+@' MA8 <[__6__5=]U_\_?[_?^_W[_?[__ > #@ ' P > # 0# M@ /P !@'!8 <'\ 2\ *EY]X#_.#_< _[#__]X ?M] !@WO 96 >%@!SO_]+_ M^J7WWP/]_O]_[_OO__W_]^WW_V[>_]!?AP6 '/O /_ &!^S__ ?C ? __S__ M_^ , ! !X $!( #\ 8!P6 M'+O $O #_>=0__WA_[ < 0 /> 'U?@ X/[P$=@'A8 '@ X$!@0& \ !@2 _ ' <%@!S[P!KP ?WG MS__]X?X /\ _P# #_;^ <#N\!3 #-K__?WWS__]_?X/@X. "\#_[_;^ M =[N_]1?AP6 ' / ,_ #!^PP ?G__ _P#_?\ __\'^8Z/P'_P'!8 < \ M\ !X > !\ #_ /]_P ' " / # <%@!P#P![P ?WG___]X@'P /\ M_W_ ?=__\+>\ @L!X> "MK__?WW___]^@&'@ G!]W__WM[_Z"^'!8 < \ _ M\ ,'[ #__\?^ '_@?__P '_< #'@_ ;/ <%@!P#P #P '@ !X!_X ?^! M___ , 8 \ ,!P6 ' / $O !_>?___G@'_@!_X'__\ &S__AO[P#.P' MAX )TO_]_??___G@B( )_AN__[[^_^QOAP6 ' ? ,_ !A^P ?__@'_@!_\'_ M_^ _SX#CX/P#_X'!8 "-[__OWW__P'BH ( MX<__?O[_]"^'!8 <#X _\ &'[ ___^ __ /_X___X '_O_\?@_ .W@<%@!P/ M@ #P '@ /_X#_\ __C___@ ?^P !X \ &!P6 ' ^ $O _>?_@__@/_P# M_^/__^ !_['\'O[P!38'AX 'TO_^_??_@XR !_'\_O[_]#>'!8 &#X S\ #' MA( 2X#__!\ /P ?^?__\#\ Q^!P6 ' ^ / > ?__@/_\'P _ ! M_YX#^ #P 8'!8 <#X >\ !][_!__^ __P? #\ '_G@/Y_O 'E@>'@ ?6 M__]][_!_C( '_@/Y_O_WEX<'@ 0W\ #'A( #X'_@!H ) _^/__\!\ 9?!PB M"O > /___@?^ &@ D#_X__\ !P <'!X +&O ?>P/___@?^ &@ D#_X__ M]_]P [<'AX &VO__?>P/CX %]_]_^[>'!X %,_ 9_R#@ +A\ B "!_'___! M\ :O!PB !/ <"#@ +A\ B "!_'_^ < #!P> !1[P #W @X "X? (@ @? MQ__@_W #6P>'@ 7>__^]PY" !>#_?_M;AP> !3/P '_@@X !@ F " 'C__CY M\ 8/!PB !/ <"#@ & "8 ( >/_^ P ,'!X %'O .<"#@ & "8 ( >/_ M^ >P _L'AX %WO__N=^1@ 0'O_O[AP> "#/P #_@___ #(& !O ?\ 8O@ 8( M@ ?P ?@___ #(& !O 0$ #@ 8'@ @>\ 'X/__P R!@ ;P$% #VX &AX $ MWO__QY* !/!?^]N'!X '8? #^'_^ V !Q_ ?_ &!X &"( &< /X?_X#8 ' M'\!_@ !@ 8'@ <_< /X?_X#8 ''\!_@ /]@ :'@ *_?Y6 X_[_8<'@ 9@ M\ /X?\0@8 $^ P'@ 8(@ 40 _A_Q"!@ 3X & !@> !C^0 _A_Q"!@ 3X M!_V !H> K^?EH "]_V'!X &8'@ !^/ #X & ?_X?P? !@J P?CP ^ !@'_ M^ !P 8'@ 8_X 'X\ /@ 8!__@/_< &AX "O^>6@ */_8<'@ 7!_ 'XA& M!0_\#\/ !@J @?B$8 %#_P , &!X %?^ !^(1@ 4/_ #^P :'@ )_XY: M O#^AP> !<_P . $H $_@#[P 8(@ 00 . $H $_@ P 8'@ 5^$ #@!* M!/X /L &AX "?A^7@ $^AP: P&_^!6 ! < ?^ &!X " ?@5@ 0' $!@!@> M O'X%8 $!P!'8 :&@ +^\9B L=_A@: P/W_A>!@ '@!@> @?^%X "^" & M!H # P?_@!6 M @?^!P: ! ('_X 5@ ('_@>&@ +Z/YB OX?A@: ! X/_\ 6@8 !\ 8'@ ,/ M_\ 6@8 !P 8'@ ,/_\ 6@8 !P :&@ 'QFH !SX8'@ (/_A> @_P!@> @_^ M%X "#_ &!X "#_X7@ (/\ :H!X "'^ 7@ (#^ 8'@ (?X!> @/X!@> A_@ M%X " _@&J > 3\9@ %\!@> 3\9@ %\!@> 3\9@ %\!J@'@ %\&8 !'@8' M@ %\&8 !'@8'@ %\&8 !'@:H!X !X!F 0,&!X !X!F 0,&!X !X!F 0,& MJ"@H'8 !. JH*"@<@ (!_@JH"X "'X #@ (#P!8+@ '\!( " \ %@ '\$ N M > $@ (#P 6 ?P$@ (#_PJ+@ +\?X. OP_E@N A^ X "#/ 6"H " _P$ M@ (/\ 2 @'^$ J @/@!( "#_ $@ (#_P2 P/_@ F+@ +\?X. O /E@N M A_ X "&?@6"H "!_P$@ (?^ 6 ?P0"H "!^ $@ (?^ 2 P?_@ . P?_ M@ F+@ +\/X. N 'E@J P?^0 . A/X%@J @_@!( "'_@%@ '\!8 !_ H* M@ $(!8 "'_@$@ ,'_X #@ ,'_X )BX "X;^#@ +@!Y8*@ ('_@2 B?\%@J M A_@!( "/_P$@ (!_@6 ?P*"H !& 6 C_\!( #!_^ X #!_^ "8N >&$ M@ + Y8*@ (/_ 2 B_\%@J A_P!( "/_P$@ (!_@2 @'^"@J 1 %@ (_ M_ 2 P?_@ . P?_@ F+@ 'SA( "P .%@ $SA8 !,XH*@ (/_ 2 C_\!8 ! M9 6 :@*"H "/_@$@ (__ 2 P??@ . @'>"@J C?@!( "/_P$@ ,'WX # M@ ,'WX )BX !^X2 L #A8 !=X6 ;N*"H "'_P$@ (YG 6 2 %@ $@"@J M C_X!( ".9P$@ (#WP2 @'>"@J B?P!( "/_P$@ ,#WX #@ ,'WX )BX ! M^X2 L #E@J AZ\!( "/_P%@ $@!8 !( H*@ (^N 2 C_\!( " ]\$@ (! MW@H*@ (O\ 2 C_\!( " ]\$@ ,'WX )BX !^X2 L9CE@J AUO 2 AB(!8 !> 6 7@*"H "/K@$@ (?^ 2 @&&!( " M 88*"H "+_ $@ (7> 2 @&'!( #/X?@"8N ?N$@ +O]X6 8>%@ &'B@J M A_\!( "*!06"H "/_@$@ (O] 6 ?P%@ '\"@J BO0!( "+_0%@ '^!( # M/__P"8N ?N$@ +7ZY8*@ ([W 2 @O0!( # P. X $ 08 < @*@ (_^ 2 M @PP!( # P. !( #? !P" J @PP!( "## %@ '\!( $/OWP< B+@ '[A( " M_#^*@ /X_'^)"H ".]P$@ (($ 2 ! >'P#@#@ -^#_@("H "/#@$@ (/\ 2 M! >'@#@#@ -\#_@("H "## $@ (/\ 6 "7@ . /_W_^ B*@ +\.XR ;^# M@ /X_'^)"H "/#P$@ (,, 2 "@__X/P 0$#_X("H "/_ $@ (/\ 2 ! O_ M@/P$@ (/_@@*@ (+T 2 @_P!X '_ ._O__@B+@ 'SBH #^_^?@X "^'B* M"H 6/_\/_ !^ !^ '__]_@ '@#__@@*@!8_\P_\ '__X'X 8 W^ M 8 _^" J "@PS#_P ?__@?@$@ @-_@ ?\/_@B+@ 'S@X $_@?@?X. M _@ #X. _@!#XD*@ T__[_^ #__X?\ _@P* !#\!__\("H 6/^.__@ ' M___G_ ,_\'_P . /_P@*@ H'X[_^ ?__^?\!( "!_\#@ /^#_\(BX ! MXX. !/@'X!^#@ /S_P>#@ /X @^)"H !/X,!@ @"__]O_ ?X,"@ 1_P___ M" J %C@'__\ !O__;_P &/_!_\ & !_\("X ) ___ ;__V_\!( "!_\# M@ ,\!_\(BX !YX. !/D#P)^#@ /C_P>#@ /@ >)"H !#X. "8 #?_[__ M^X,"A @)@!__?_\ #Z___^ #_\___" F %P/_^#__@ ^__?_\ #8_@'^ #/X /_ M" F $0,8 #__@ ^__?_\ # '^ X #% /_"(N "/@____P0 (/@X #V_X! M@X #S_0#B0F %P'G'__[@ ??^__\ 'Z___X '_\__^" F %P?_X!_[@ _? M^__\ ' _$'X '/X '^" F $088X!_[@ _?^__\ # $'X X #% '^"(N M". ?___P( 0/@X #P_Q!@X #S_0!B0F %P/P'__Q@ >O=?_X '#/^/@ ![ M]_G\" F %P__X _Q@ ^O]?_X ' ''W@ '; .?\" F %PP/X _Q@ ^O]?_X M # 'W@ &8]^?\"(N #N /___QT N/___YPQQ]@X #W_?GB0F %P_\/__@ M _7<__X 8_W_'X C /'\" F %P__P _@ _7\__X ' #'_X 'C /_\ M" J %@/ #^ #]?S__@ !__@?_@ > __P(BX (P ____'H#X^$@ +L?X0! MB@F 0^#@!/ _7\__P "'_/\ #D//\" F %P__^@_ _7\__P #@ M#'_\ ##@/_\" J %D "#\ #]?S__ ./@?_P ,!W__P(BX (^@____'H M#X^#@ +[[(6 ?>*"8 7",?_'^ , ##\ +___P 'R__P("8 +#__[ M[^ #\ #_\ #@ D(?_P '@__P("8 7!_@#[^ #\ #_\ , ?_P (5 M__P(BX "^^^)@ /[SW^$@ 'UB@J %L__#^ "/'#^ +___@ (1__@( M"8 +#__C_^ #R/'_^ $@ A_^ @'_^ @)@! #3@ __ MG^/ ?O_^ #@H '^ _/_^ @'@!H@ 8_Z__CP 7[__@ #_'_X # MX/_X' <'@!,&' 8P __@ 7[__@ # '_X X #%/_X"(N !^O__#__Z!>% M@ +\?X2 !/3___>'!X -. '___[_ ]__X ."@ ?X #\__X" > &B M #_C_^_P #O?_^ /\/_@ /@?_C\!P> $P<\ " #_^ #O?_^ , M/_@#@ ,4?_@(BX 'X__QC__$(X6 OP_A( $]'__(X<'@ 0X /@X &^ , M/__ X* !_@ 'S__@(!X :( ?^O___@ /#__P !_P_^ _!_^_P' M!X 9!_P < /_X /#__P !P _^ @Q_^ B+@ ?K_^!'_\/#A8 "_#^$ M@ 3\?_PGAP> &3 #__\]_X !O[^\ '__[@ '__S@(!X :( ?^/S MW_@ ._O[P #_X?N _P_/_P'!X 9#_P 0 /SP ._O[P\ #@ ?O^ M @ _. B+@ ?C_^!'_\6'A8 "_A^$@ 3\/_@?AP> &3 #__\]WX ?[^\ M ?__S@( '__B (!X :( __WSW_@ )_O[P #_\/. @ !_X>/_ '!X 9 M#_P P 'SP@ )_O[S_ " //_@ !@ >( B+@ ?]_^H7_]F'AH !#X2 !/X? MX!^'!X 9, ?__YV)@ '[?YQ40 "__^)P0 __^( @'@!H@ '_\?G?^ _ MM_G ! ?_PX@! /_PX__ <&@!H(#_P1@ 'YQV /[?YVKP % ../P # . M( B+@ ?Q_^=G_\/+AH !#X6 P_@/X<&@ !_X /^_\"PN " !#'^ !@ !@F+@ +Z?X. @/ AH !AX6 X?!^X<&@!D/ M__P#___X 0 _[_P#!$ +__\& $ #___"0: &P& ___+@?_ '_O_ 0!_ M_\0 0!__\$__ <(@!<#_ .!F< ?^_\'/O % !&?_ ' 0F+@ C\O_N_ M_@/ ?X6 <>%@ /!P:.'!H 9!\ !?__\ -$ ?\_\$ %___ @#___PD& M@ T!P ?__T0'_P!_S_P X +?__H " ___PO_T'!X :/__Z 0&MP!_S_P M/_\ ( __^ P @ $'BX (_1____X#P'^%@ 'KA8 #\, #AP> "#?\!___ M ")$!( %0 " !_\$@ 4/_^" 0<'@ @P ?__P ?^ 2 #A_X@ ?_ !_X __ MX/__!P> 7@%@ (]N 2 ";__@ ?__@ . L [!Y^ D ZAP> DSD!( " M 8(&@ & !8 &0 /@ "$!P> 4 %@ (^?@2 S_\@ . "#_\0 /@'_^!P: M P'S& 2 CY^!( )\\^ !\\_ X "7WH'AX "_.>6@ +1QX<'@ *Q* 6 M 0($@ ,-,( #@ ,-,$ #@ (@0 <'@ *MS 2 C_^!( #/_R X #/_Q X " M<<8'!X "[]P$@ (__@2 ">RW@ >RWP . ENN!X> OWOEH "\<>'!X " M4" $@ (GY 2 P(@@ . T(@0 2 40'!X "3]P$@ (X' 2 S_<@ . S_< M0 . G_^!P> N_-@ +X'YD'@ &P M!8 ", P$@ ."@( #@ /"@$ #@ )@!@<'@ *O_ 2 B_T!( #/_R X #/_Q M X "?_X'!H # >_\!( "+_0$@ E__X $__\ #@ )__@>?@ *__8<'@ ,1 M! P#@ 0,, #@!( '@ L 0 . !# D X%!X ##O@, X )>]X X '_B M X #/_Q X $/]P #@4'@ ,N^ P#@ ][W@#@ #__X $__\ #@ 0OW . M!8> ?Z8@ '?AP> "ACP#A@ &?D _@#@ P /@4'@ H' M" X8 &?^X/X X " 8 #@ )\/@2 !!X< #X%!X 5!P@.& !__^#^ ?_^ M !?#_P X $'A0 /@6(@ $/D( "_#^$@ +^'X<'@!0, ]\ &#R ?X !# MR8'\ +'X@2 !!@,!'X%!X * _ /? "?_?G^ . !P&!_ >!X$@ 0?_ 1^ M!0> %0/P#WP ___Y_@ #PW@?P 7@?\ . !!?\!'X%DX "_#^$@ +X'XT' M@!P&( ?^ (!D _\ "@P/\ +%8@/P ,/ S^!0> ' ' !_X !?_O[_P M :C _P 'U^ _ _\#/X%!X < < '_@ '___O_ /K\#_ !?7_S\ M"]P,_@63@ +^OX2 OU_C0: !0'__ __ X 5@ _\ @0 !_^ +CQ _X . M< _\!0: !P'V( __ ^#@!/\ _!P__^ #\/$_X __ _\!0> ' 8CC_\ M#_]___P !^__[_X #?P___@ 6@#_P%F8 "_#^$@ +'XX<&@!T#__P?_P " M !/^ $ 0'_@ D P'_ #_ /_ 4&@ <##R ?_P /@X 3^ ?X ?__@ ( M'_Q/_ __\/_ 4'@!P&(]__ W__[_X !_O__O^ ]____\ #'XP_\!9^ M L?CAP: '0?__!__ $ @(?X 0# /^ "8& /\ #P!_\!0: !P8#P!__ M !^#@!/X #_P#__^ #P?^._\ '__Y_\!0> # /#__\ 'O]_?_@ /X. #?X M/W____P !A_@ #^ !_ 2 C_X!0: !PP __@!^#@ /P '^#@ G^ 'X/X'_\ M .#@ 'X!0> 0>#@!B '_Z___ ?W__G_X ?_?___P \ #__@%GX "P!^' M!H =#_P"#__@$>(G#\ !X P?P C_@0?P % */_H%!H '"$ "#__@'X. M#\ ?7____P ?C@ ?_P X. ?H%!X !0X. &. .W=OWP !X?_\__ !]P!^_ M_ #T O_^@6?@ +0'X<&@!T/]@,/^> 3\ ^?X #@ '!_ #_^'!_ \ \? M_@4'@ ;P P_YX!^#@ /@ '^#@ G\ '_X ?_\ >#@ '^!0> ',G___G@#>_W M;^ ??__O_P ?< ?O_P !_ /__X%GX "\#^'!H =#_,#C_@ ?"/W^ > # M@?P !__CX?P / /'_X%!H ' ? #C_@ #X. #^ ?_OO__P ?_@#__P !X. M ?X%!H = < ?G_P !_ /__X%GX "\#^'!H = M#_&#C_@ ? /C_ &? #D_@ 0?_C@_@ _ /W_@%!H ' ? #C_@ #X. #_ M/^____@ ?_@#__@ !X. ?@%!H ' /\ 0__D/^ !_^.#^ T \?X 4& M@!T/L /_\ /X ?_\ ?X '_^ _^ /_^ 'W___X 4&@!T/CS__\ /_Q__ M\ /@ ?W^ _P!__^ 'T __X 6?@ +P?X<'@!8P&(!X 6,#^/ M\ !P..'\ __,/^ !_^./^ . P,_P 4&@!T., /_\ ?X ?_\ /\ /_ M^ /^ /_^ #/___P 4&@!T.#\/_\ ?_Q__\ /P __^ /P!__^ # /_ MP 6?@ '#B > !# ?__ #@ \#A^ #_CG^ #_C_^ #@ .#_< %!X <, /_ M\ >, __X #. /_X . /_X /__]P 4'@! /X__P !X____@ , '__@ M X #'__@ X #@_W !9^ <>(!X $, /]\ . %0./P /^/_X /^/_X M "@___? M#C___\ #@ ,?_^ #@ D?_^ '#^< %GX !QX@'@ 00!_G X 5!__ ? MX__ _X__ !P_' !0> '! '^< #Y__\ #@'_\ #@#_\ #__ M\< %!X 0#__YP /_O_P (!__P . "1__P '!_[ M\< "&'\\ /#\< /#_< '#\\ %!X <'_OQP /__SP /__Q MP /__]P /__SP 4'@!P/__' ?^_/ ___' ___W !P_/ M!9^ <>(!X <$<)QP (8?SP \/QP \/YP ' __\< !_[\\ #__\< M #__^< '#\\ %GX !QX@'@!SYP!A #P_' #P_# #P_# ! MP_& !0> ' ' &$ #__\< #__\, #__\, #__\8 %!X &!H 6 8$ " ?\?\ _]_^ _]_ M^ . U\:X 8'@!5_/'@ '?&_ -7:O@ -7:O@#@ -;"N &J : ! &! M!^ #@ .G!7 #@ .I%3 #@ .I%3 #@ ,& . &!H " 8$$@! !_Q_P #_W_P M #_W_P X #_A_@!@> %7\X$ 5\:\ U=J\ U=J\ . _X?X :H M #_ B@H**@/@ '@#H " > (#X !X Z @_@" ^ > .@ (/^ B>@ +P!X@. M@ (!\ . 3X*@ (#P @.@ (!\ Z C_ " Z @'P X " ? )@ (_\ B>@ + M#X@.@ (!\ . 7 *@ (/P @.@ (!\ Z G_ " Z @'P X "#_@)@ )_X B> M@ * 'X@.@ ("X . 6 *@ %_"0Z @+@#H$)#H " ^ #@ (?^ F!@ '@")X! M@ $?B B R 0 . C^@ X !8 6 ?P$@ %^"0Z C^@"8 !_ . @'^"0B M R 0 . C_@ X "'_@(@ ,!_^ (F8 ! X. _X 'X@(@ -@ & #@8 !P . M 6 $@ ,'_X #@0D.@8 !P B !P?_@ ?\)"( #8 !@ X& < #@ (?^ B M P'_P B8@ CX '____X /X@(@ AP & '_P . 6 $@ ,.+\ #@8 !@ @- M@ ,!_\ (@ @.+\ /_@ @(@ AP & '_P . A_X"( # __ "(J 7^- M@ CP #____Q^/X@(@ H__N /_X !@X +_@ $/_@ !_X (#8 # __@ M"( ($/_@ #_X ("( (/X;@ #_^ -@ ,#_\ (B( "O@:.@ C@ !____Q_ M/X@(@ A__^ ?_\ B "!?NX >N " J !B ?_\ B "!?NX ^N M" B "G\#X !__P .$!X # __ "(B _P#WXV ". '____/\_B B "#__ MP !__P"( (/__P !U8 ("H &0 !__P"( (/__P #U8 ("( */@' M '__ 8. ?X'@ ,#_\ (B( #^ &_C8 (P /___\_S^("( "#_\#@ @. M ' '__P. ""@ \ >N " V P__\ . A;1 X (+__P #ZX ("( ! M# 2 P__\ 2 0$#@ ('_P. P/_P B(@ +P (B _X6T8. ",?_#____/\_ MB B @__ X (# P !XQX#@ AQ2G '_@ @-@ ,/__ #@ )_^@. "'XQ M\ _^ " B 0@$@ ,/__ #@ ( #O< /_ :8@ @'_X____S_/X@(@ (((0. P0 ( . #PA$ M8 N !P #_[#__@8(@ (&<@. P?_X . #W>\8 O__P #_[#__@8( M@ ('W@. P?_X . #W>\8 !_^ #P_#__@:(@ +^_@X (!_^/ M___\_S^("( ""#$#@ ,"'$ #@ ]'B?P8 ;1X\ _\[__X&"( "!_X#@ ,# MX\ #@ ]X>?P8 ;>'\ _\[__X&"( "!\X#@ ,#X\ #@ =X>?P8 .' X % M __[__X&CH !XX2 #?A____^ X ( M 'X /X #@X ,_@ ( !@X .OX #\#__@#'_G__ M #^#@ ' !HF #Q____X ?@!___P/P/__^(6 \ X@(@ 4&9@& (2 $=@% MG_G__@XX_X'_ !Y\ ?^ !@B "P>> 8 #P _]@'@X ,_@X _ '_ '[^ ?^ M!@B !0>> 8 A( -V /P'_^ # 8 $ ___P84#B F &/ _^ ?__C_P #_-!_^>@// M ?^ __X _ <(@ L____X .0 )__ 'X. "_Y[X ?_X#__@#\!PB %3____@ MY__G_\ ? /__@'\,/__@(. ?P'B( (P/ ____D "># 8 $ ___@84#B B M&7 '__PG! Y_\ #Y_\?_]X;SV'_@!_^,/X'"( %0_P?__"$@ + 'X2 "M_X M '__@/_^-_X'"( !#X. $?!O__;_P!\ ___@>PP__^ @X !_@>(@ +P (. M _P /X,!@ 0#__^AA8 #^ WB B &? #__@GBBY_\ #YO\?_\X;CF'_@!/\ M./X'"( %@?@/_^"$@ + 'X2 "L_X '__@//\/_X'"( !#X. %>!O__;_P!\ M ___@>1Q__^ \____@>(@ +P (. _P /X,!@ 4#__^Q]X2 _P /X@'@!H! M\ G_P ,1##_@ .?SQ__GCP \?^ _YX_P<)@ 3P!_\ A( "@!^$@ J?_ #_ M_X#C_G__!PB !0__W_\ A( (@!\ ___@<>#@ * XX,'B( "\ "#@ /\ #^# M 8 % ___X>>$@ /\ '^(!X : _@!V_\ #((P_X !FX!__^ P8,'B( "^ &#@ /\ #^# 8 % ___^>^$@ /^ '^(!X : _P#^_X M#1%P_X #^?\?\8P^ ?'_ #^?_X'"( %? /C_@"$@ * 'X. "_&-_@'__P ! M_G_^!PB !7__Y_X A( (@!\ __Q@<># 8 $ ?___@>(@ +\ X. _P /X,! M@ 4#___SYX2 _X ?X@'@!H#_ /__@ . +#_@ /_]Q_P #ZD\?P 'P_[@<( M@ 5\ ^/^ (2 H ?@X +\ '^ /_\ '\/^X'"( %?__C_@"$@!" 'X '__ ! M]UO__ !___N!XB OP#@X #_ _@X "@ >#@ 'WA( #_@ _B B !@__P_X M X,"@ Y@!__@ #7^__@ /Z_[@<'@ 4#R!'__@. C__ X -!__@ #0 __@ M _Z_[@<'@!H#R '__@ #@#__ ?___@ 8!__@ ___[@>)@ 'O@X #_ _ MB( !SX2 _P /X@)@!@XP_P ____@ 8 ?_X '___X '^/\P'!X % \ X M__P#@ (__@. #0?_X $ /_X /^/\P'!X : \_'__P X(__@ '___X $ M /_X /__\P'B8 !QX. _P /XV _P /X@)@!@8X_@ ]___@ 8 ?_P # MMW_X #^O\ '!X % X 8__@#@ (__@. #0?_P ,'_X ?^O\ '!X : X_G M__@ Z(__@ '___P $>/_X ?__\ 'B8 !YX. _P@/XV _@ /X@(@!@/ MQ__P /?_YP #,'YX ![-^. #_C\("( 8" #_\ '#^< !##^> P M?C@ !_X_" F %SC_\ #OC^< !/_^> !\_C@ !___"(V _P\/XV _@ M/X@(@!@/S__P /__YP ,'YX ![M^> #_]\("( 8" #_\ '#^< !_ M_^> X?G@ #__?" F %S#_\ #GC^< !__^> !\_G@ #___"(V _P< M/XV _ 'X@(@!D/___ /__YP ,'XX !7A^> '_Q^ !PF &&#_P M'#^< !__^. +Y?G@ '_\?@ <)@!A@_\ YX_G ?__C@ "__YX !__ M_X 'C8 #_!P_C8 #X ?B B "#___P '___ X # P#@ X (<'XP !?_I\ ' M"8 "\#\#@!,\!P ___X !W/^, !__Z? !PF &/ _ ?__\ /__^ M ?W_C ?___P >-@ /@/ >-@ . >("( (?\_\ ?\_\#@ ,# . #@ A@ M'@ /__+P <)@ + ' . $S ' #___@ ?Y_X /__R\ '"8 4P!P !_S M_P ___X '^?^ "#@ ' !XV ^ \!XT"@ $#B B "'_'_ '_'_ X # M#@#@ X '8 X %__T0@(@ ,!P!P#@!)P!P _X_X /^?^ /__]$("( 5 M < < ?\?\ /^/^ #_G_@ #@PB-@ /@?@>,@ 3\ !B!V W__\ @= 4@ -___ ('8 #?__P")V X #X@ end slashem-0.0.7E7F3/win/gem/gem_rsc.uu0000664000076400007640000003351210545462317015217 0ustar alialibegin 777 GEM_RSC.RSC M $29@^Z$B(/N@^Z #0)&@^Z)]X Y0 , !8 @ "@. M "!.151(04-+ "!'86UE "!(97)E "!4:&5R90 @271E;0 @07!P M87)E; @36%G:6, ("!!8F]U="!.971H86-K+BXN "TM+2TM+2TM+2TM+2TM M+2TM+2TM+2T ("!$97-K($%C8V5S2 Q(" ("!$97-K($%C8V5S2 R(" ("!$97-K($%C8V5S2 S(" ("!$97-K($%C8V5S2 T M(" ("!$97-K($%C8V5S2 U(" ("!$97-K($%C8V5S2 V(" M("!(96QP+BXN(" @(" @(" @/P @(%=H870@:7,N+BX@(" @(" O " @0V]M M;6%N9"!H96QP+BXN("8 +2TM+2TM+2TM+2TM+2TM+2TM+2TM " @3W!T:6]N M" @ M(" @( 5L " @16YG00 M+2TM M+2TM+2TM+2TM+2TM " @3&]O:R!A=" @(" [ " @4V5A " @2G5M<" @(" @( 5J " @ M0VAA=" @(" @( 5C " @1FEG:'0@(" @("!& " @4VAO=R!A;&P@(" @("!I M " @4VAO=R!K:6YD(" @("!) " @1&ES8V]V97)I97,@("!< "TM+2TM+2TM M+2TM+2TM+2TM+2T ("!%870@(" @(" @(" @(&4 ("!$2 @(" @(" @(&$ ("!5 @($9I;&P@<75I=F5R(" @ M(" @40 @($9I2 @(% ("!296UO M=F4@86-C97-S;W)Y(%( ("!7;W)N(')I;F=S(" @(" @(#T ("!7;W)N(&%M M=6QE=" @(" @("( ("!,:7-T('-P96QL@ @($-A'#P)'$< X#@0/YS^"!P' . X$#_=_@@?GF @ !@)__^8"0 F D 59@) "8"0!5F D )@) 168"0 MF D%!9@$@ $X!($5, 2 3 "0%9P D "8 $@5. D G $A3@ D)P $DX M F< $. G ' #SP\\ \\//@/ M___X#___^ ____@/ #X#U55^ \ /@/557X#P ^ ]55?@/ #X#U55^ > M ?@'U57P!X !\ /55_ #P /@ ?47X #P#\ ?5^ #P_ ??@ #_P ?X M #\ < '0 !V\ =P 4 !@ "$8 /__ M "\ 0 !W$ >1 'D@ % 8 A& #__P @ $ >: 'HP !Z0 M P & 0 __\ "0 ! 'V0 !]L ?E , !@ "$8 /__ ( "@ M!^H ?O '^P # 8 A& #__P % P @ ("0 " H P & 0 M __\ "0 ! ("P "$$ AW , !@ "$8 /__ #8 -@ "(, B% M (A@ # 8 A$ #__@ " $ B' (B0 "(H P & (1 __X M @ ! (BP "(T B. , !@ "$0 /_^ ( 0 "(\ B1 (D@ # M 8 A$ #__@ " $ B3 (E0 ")8 P & (1 __X @ ! ( MEP ")D B: , !@ "$0 /_^ ( 0 ")L B= (G@ # 8 A$ M #__@ " $ B? (H0 "*( P & (1 __X @ ! (HP "*4 M BF , !@ "$0 /_^ ( 0 "*< BN (KP % 8 A& #__P ' M $ BP (M0 "+8 !0 & (1@ __\ !0 ! (MP "- C1 , M!@ "$P, /__ !D 0 "-( C= (Z # 8 I!Y #__P + L CJ M ([0 ".X P & (0> $ P ! ([P "0H D+ , !@ "$0$ M /__ !L 0 "^H D: &URD 4 !( @ \Z M .N@ "1$0 !P " ( ! " +0 (__\ 0 * !D M : 9 H @ " !0 1 : ,! $ P ) !D M " ,@,! 3_____ " - "0,! 7_____ " M /0 ) !@,! ;_____ " 0P / !@,! ?_____ M " 20 5 !P,! C_____ " 4 < !@,! G_ M____ " 5@ B "0,! +_____ " 7P K !P,! M "P!< !D P$ 40 3 !0 # 3 !0 /\1 " M%@ ( W_____ !P 9@ %@ ! [_____ !P ( >0 M $ %@ ! ______ !P D ( %@ ! !#_____ !P MI0 , %@ ! !'_____ !P N@ 0 %@ ! !+_____ !P M SP 4 %@ ! !/_____ !P Y 8 %@ ! O_____ !P M ^0 < %@ ! !\ %0 > !0 /\1 + %0 * !;_____ M !P !#@ %0 ! !?_____ !P !(@ $ %0 ! !C_ M____ !P !-@ ( %0 ! !G_____ !P ( !2@ , %0 ! M !K_____ !P !8 0 %0 ! !O_____ !P != 4 M%0 ! !S_____ !P ( !B 8 %0 ! !W_____ !P !G@ M < %0 ! ![_____ !P ( !L@ @ %0 ! !3_____ !P ! MR D %0 ! "X ( M !0 /\1 1 % . "'_____ !P M !W % ! "+_____ !P ![P $ % ! "/_____ !P M " @ ( % ! "3_____ !P "%0 , % ! "7_____ M !P "* 0 % ! ";_____ !P ".P 4 % ! "?_ M____ !P "3@ 8 % ! "C_____ !P ( "80 < % ! M "G_____ !P "=@ @ % ! "K_____ !P "B0 D M% ! "O_____ !P ( "G H % ! "S_____ !P "L0 M L % ! "W_____ !P "Q P % ! !______ !P " MUP T % ! #L +P Z !0 /\1 7 $ , ##_____ !P M "Z@ $ ! #'_____ !P ( "^0 $ $ ! #+_____ !P M #"@ ( $ ! #/_____ !P #&0 , $ ! #3_____ M !P #* 0 $ ! #7_____ !P #-P 4 $ ! #;_ M____ !P #1@ 8 $ ! #?_____ !P #50 < $ ! M #C_____ !P #9 @ $ ! #G_____ !P #

$P / #W_____ !P # MH $P ! #[_____ !P #L@ $ $P ! #______ !P M #Q ( $P ! $#_____ !P ( #U@ , $P ! $'_____ !P M #Z@ 0 $P ! $+_____ !P #_ 4 $P ! $/_____ M !P $#@ 8 $P ! $3_____ !P $( < $P ! $7_ M____ !P $,@ @ $P ! $;_____ !P $1 D $P ! M $?_____ !P $5@ H $P ! $C_____ !P $: L M$P ! $G_____ !P ( $>@ P $P ! $K_____ !P $C@ M T $P ! #O_____ !P $H X $P ! %P 3 !; !0 /\1 M D %@ 0 $W_____ !P $L@ %@ ! $[_____ !P M $QP $ %@ ! $______ !P $W ( %@ ! %#_____ !P M $\0 , %@ ! %'_____ !P %!@ 0 %@ ! %+_____ M !P %&P 4 %@ ! %/_____ !P ( %, 8 %@ ! %3_ M____ !P %1P < %@ ! %7_____ !P %7 @ %@ ! M %;_____ !P %<0 D %@ ! %?_____ !P %A@ H M%@ ! %C_____ !P ( %FP L %@ ! %G_____ !P %L@ M P %@ ! %K_____ !P %QP T %@ ! %O_____ !P % MW X %@ ! $O_____ !P %\0 \ %@ ! H 70!H !0 M /\1 M $@ , %[_____ !P &!@ $@ ! %______ !P M ( &%P $ $@ ! &#_____ !P &*@ ( $@ ! &'_____ M !P &.P , $@ ! &+_____ !P &3 0 $@ ! &/_ M____ !P &70 4 $@ ! &3_____ !P &;@ 8 $@ ! M &7_____ !P &?P < $@ ! &;_____ !P &D @ M$@ ! &?_____ !P &H0 D $@ ! &C_____ !P &L@ M H $@ ! %S_____ !P ( &PP L $@ !__\ 0 ! !0 1 M 4 3P " #_____"Q0 8 $1>0 @ "__\ 0 ! !0 M $1 " $ H 5 #_____ !D ( $A 1 , @ !__\ 0 *"Q0 M 0 (1 # $ +@ * +_____ !H,!P &U I @$ P8! 4 P $ M !0 /\1 0 !" #0 ' 3_____ !\ 2(@ "" !0 % +_ M____ !P &V #" 4 !P ! ;_____ !P( &X / $ %0 ! M ?_____ !P &]@ / , '@ ! C_____ !P '%0 / 0 M$0 ! G_____ !P ')P / 8 & ! K_____ !4 /N@ ! M# <$(@ ! #_____ !4 ( /U@ !" @ (0 !__\ 0 ""Q0 0 /X1 M> ! ( 3P@6 +_____$QH,!P 'DP " !4 " ! #_____ !@ ( M ) ( @ &3@ 4__\ 0 ["Q0 0 (1> ! $ + ) +_____ !4( M /\@ " $ " ! #< P U !0 $1>0 " , * @# 4 ! $ M !H,!0 'I0 !" @ ! /_____!1D $1 0 ! < M!@ & !H,!0 'IP $" @ ! 7_____!1D $1 0 ! M D " ( !H,!0 'J0 '" @ ! ?_____!1D $1 M 0 ! L "@ * !H,!0 'JP *" @ ! G_____!1D $1 M 0 ! T # , !H,!0 'K0 -" @ ! O_____!1D $1 M 0 ! \ #@ . !H,!0 'KP 0" @ ! W_____!1D M $1 0 ! !$ $ 0 !H,!0 'L0 3" @ ! ______!1D M $1 0 ! !, $@ 2 !H,!0 'LP 6" @ ! !'_____ M!1D $1 0 ! !4 % 4 !H,!0 'M0 9" @ ! !/_ M____!1D $1 0 ! !< %@ 6 !H,!0 'MP <" @ ! M !7_____!1D $1 0 ! !D & 8 !H,!0 'N0 ?" M @ ! !?_____!1D $1 0 ! !L &@ : !H,!0 'NP B M" @ ! !G_____!1D $1 0 ! !T ' < !H,!0 ' MO0 E" @ ! !O_____!1D $1 0 ! !\ '@ > !H,!0 M 'OP ! ( @ ! !W_____!1D $1 0 ! "$ ( @ !H, M!0 'P0 $ ( @ ! !______!1D $1 0 ! ", (@ B M !H,!0 'PP ' ( @ ! "'_____!1D $1 0 ! "4 M) D !H,!0 'Q0 * ( @ ! "/_____!1D $1 0 ! M "< )@ F !H,!0 'QP - ( @ ! "7_____!1D $1 M 0 ! "D * H !H,!0 'R0 0 ( @ ! "?_____!1D $1 M 0 ! "L *@ J !H,!0 'RP 3 ( @ ! "G_____!1D $1 M 0 ! "T + L !H,!0 'S0 6 ( @ ! "O_____!1D M $1 0 ! "\ +@ N !H,!0 'SP 9 ( @ ! "W_____!1D M $1 0 ! #$ , P !H,!0 'T0 < ( @ ! "______ M!1D $1 0 ! #, ,@ R !H,!0 'TP ? ( @ ! #'_ M____!1D $1 0 ! #4 - T !H,!0 'U0 B ( @ ! M #/_____!1D $1 0 ! ( -@ V !H,!0 'UP E ( M @ ! #7_____!1D $1 0 ! #H . Y !0 $1>0 # M , %@ # #G_____ !X(" 0#@ ! $ "P ! #?_____ !H,!P ' MYP - $ !P ! #O_____ !X(" 0*@ # < # ! #_____ !H,)0 M '_0 1 < !@ !__\ 0 $"Q0( 0 (1> ! $ .P ' +_____ !4( M 01@ " $ -P ! /_____ !X(" 08@ " , -P ! 3_____ M$QH$!0 (>0 # 4 " ! #_____ !H,)P (@ P 4 " !__\ M 0 9"Q0 0 1> ( 0 # & +_____ !L 0 6> % @ ! M /_____ !L ! 6> " ( @ ! 3_____ !L P 6> *" ( M @ ! 7_____ !L @ 6> % 4 @ ! < !@ & !8,!0 0?@ " M 0 @ ! 7_____!1D $1 0 ! D " ( !8,!0 0 MF@ % 0 @ ! ?_____!1D $1 0 ! L "@ * !8,!0 M 0M@ ( 0 @ ! G_____!1D $1 0 ! T # , !8, M!0 0T@ "" ( @ ! O_____!1D $1 0 ! \ #@ . M !8,!0 0[@ %" ( @ ! W_____!1D $1 0 ! !$ M$ 0 !8,!0 1"@ (" ( @ ! ______!1D $1 0 ! M !, $@ 2 !8,!0 1)@ " $ @ ! !'_____!1D $1 M 0 ! !4 % 4 !8,!0 10@ % $ @ ! !/_____!1D $1 M 0 ! !< %@ 6 !8,!0 17@ ( $ @ ! !7_____!1D $1 M 0 ! !D & 8 !8,!0 1>@ '! 4 !0P !?_____!1D M $1 ! 0P &@ : !8,!0 1E@ ' !0P !G_____!1D M( $1 ! 0P __\ 0 $ !0 1 ! 4 3P # +_____ M !L, 0 0 6>0 @ ! /_____"Q0( $1>0 $ @ ! 3_ M____ !L, 0 @ 6>0 ( @ ! #_____ !@ ( + " 30 # M__\ 0 $"Q0 0 (1>0 ! $ + @4 +_____ !4( 1L@ ! M+ ! /_____"AX " 1S@ . !( $ ! 3_____ !8,!P 1Z@ A M !( "0@! #_____ !8 ( 2!@ " $ * @,__\ 0 !"Q0 $1 M<@ # , " " #_____ !H,)P )# !" !@ !__\ 0 ! !0 0 @ M /\1>0 " , !@ # #_____ !\ ( 21 P # 29@ '#X G !QN N end slashem-0.0.7E7F3/win/gem/gem_rso.uu0000664000076400007640000000234210545462317015230 0ustar alialibegin 777 GEM_RSC.RSO M4E-/2 1( @ " ! !#__P __\ M M '___^!____@ M #__P #__P M M /_ '___^!____@ :1F]1)Y2KX@ M (\TJP "!$U%3E4 P'1$]!0D]55 '@9$3U%5250 __\ 0 #"E-4 M05154TQ)3D4 $*1U)!0E-405154P#__P " ,&34%05TE. !DU!4$)/ M6 0E-05!#55)33U( __\ P #!4%"3U54 "$9,64%"3U54 !!T]+ M04)/550 ,+3D542$%#2TE-1S __\ ! #!4Q)3D53 "$9,64Q)3D53 M !!5%,24Y% ""4Q)3D533$E35 #__P % ,(64Y#2$])0T4 +1DQ9 M64Y#2$])0T4 $(64Y04D]-4%0 ()4T]-14-(05)3 # UE.,0 -0-9 M3DX #<'04Y90TA!4@ . A#2$]314Y#2 .@5#3U5.5 .P193D]+ /__ M 8 P=,24Y%1T54 "D9,64Q)3D5'150 $(3$=04D]-4%0 ('3$=2 M15!,60 P-13$< 0$3$=/2P#__P ' ,)1$E214-424]. #$9,641) M4D5#5$E/3@ !01$25(Q 5!$1)4CD !<'1$E21$]73@ &05$25)54 #_ M_P ( ,&35-'5TE. !!55035-' ""D=204)-4T=724X ,%1$Y-4T< M 0(35-'3$E.15, __\ "0 #!TY!345'150 *1DQ93D%-14=%5 @90 M3$Y!344 0.3D542$%#2U!)0U154D4 __\ "@ #!5!!1T52 "$9,65!! @1T52 !!E%004=%4@#__P + ,&3DA)0T]. /____\ end slashem-0.0.7E7F3/win/gem/xpm2img.c0000664000076400007640000001057510545462317014760 0ustar aliali/* 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]; } slashem-0.0.7E7F3/win/gem/wingem.c0000664000076400007640000007276110545462317014670 0ustar aliali/* SCCS Id: @(#)wingem.c 3.4 1999/12/10 */ /* Copyright (c) Christian Bressler, 1999 */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" #include "func_tab.h" #include "dlb.h" #include #ifdef SHORT_FILENAMES #include "patchlev.h" #else #include "patchlevel.h" #endif #ifdef GEM_GRAPHICS #include "wingem.h" static char nullstr[] = "", winpanicstr[] = "Bad window id %d"; static int curr_status_line; 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, 0L, Gem_init_nhwindows, Gem_player_selection, Gem_askname, Gem_get_nh_event, Gem_exit_nhwindows, Gem_suspend_nhwindows, Gem_resume_nhwindows, Gem_create_nhwindow, Gem_clear_nhwindow, Gem_display_nhwindow, Gem_destroy_nhwindow, Gem_curs, Gem_putstr, Gem_display_file, Gem_start_menu, Gem_add_menu, Gem_end_menu, Gem_select_menu, genl_message_menu, Gem_update_inventory, Gem_mark_synch, Gem_wait_synch, #ifdef CLIPPING Gem_cliparound, #endif #ifdef POSITIONBAR Gem_update_positionbar, #endif Gem_print_glyph, Gem_raw_print, Gem_raw_print_bold, Gem_nhgetch, Gem_nh_poskey, Gem_nhbell, Gem_doprev_message, Gem_yn_function, Gem_getlin, Gem_get_ext_cmd, Gem_number_pad, Gem_delay_output, #ifdef CHANGE_COLOR /* the Mac uses a palette device */ Gem_change_color, #ifdef MAC Gem_change_background, Gem_set_font_name, #endif Gem_get_color_string, #endif /* other defs that really should go away (they're tty specific) */ Gem_start_screen, Gem_end_screen, Gem_outrip, Gem_preference_update }; #ifdef MAC void * Gem_change_background(dummy) int dummy; {} short * Gem_set_font_name(foo,bar) winid foo; char *bar; {} #endif /*************************** Proceduren *************************************/ int mar_hp_query(void){ if(Upolyd) return(u.mh ? u.mhmax/u.mh : -1); return(u.uhp ? u.uhpmax/u.uhp : -1); } int mar_iflags_numpad() { return(iflags.num_pad ? 1 : 0); } int mar_get_msg_history() { return(iflags.msg_history); } int mar_get_msg_visible() { return(iflags.wc_vary_msgcount); } /* clean up and quit */ static void bail(mesg) const char *mesg; { clearlocks(); Gem_exit_nhwindows(mesg); terminate(EXIT_SUCCESS); /*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) int* argcp; char** argv; { 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*/ } iflags.window_inited = TRUE; CO=80; /* MAR -- whatsoever */ LI=25; add_menu_cmd_alias(' ', MENU_NEXT_PAGE); mar_set_no_glyph(NO_GLYPH); } void Gem_player_selection() { int i, k, n; char pick4u = 'n', pbuf[QBUFSZ], lastch=0, currch; winid win; 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); bail((char *)0); /*NOTREACHED*/ return; } } /* Select a role, if necessary */ 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); flags.initrole = randrole(); } }else{ /* 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 */ currch = lowc(roles[i].name.m[0]); if(currch == lastch) currch = highc(currch); add_menu(win, roles[i].malenum, &any, currch, 0, ATR_NONE, an(roles[i].name.m), MENU_UNSELECTED); lastch = currch; } } 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); end_menu(win, "Pick a role"); 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; } } /* 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) { mar_add_message("Incompatible race!"); mar_display_nhwindow(WIN_MESSAGE); 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) { 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", roles[flags.initrole].name.m); 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; } } /* 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) { mar_add_message("Incompatible gender!"); mar_display_nhwindow(WIN_MESSAGE); 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) { 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 %s", races[flags.initrace].adj, roles[flags.initrole].name.m); 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; } } /* 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) { mar_add_message("Incompatible alignment!"); mar_display_nhwindow(WIN_MESSAGE); 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) { 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 %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); 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! */ return; } /* * plname is filled either by an option (-u Player or -uPlayer) or * explicitly (by being the wizard) or by askname. * It may still contain a suffix denoting pl_character. * Always called after init_nhwindows() and before display_gamewindows(). */ void Gem_askname() { strncpy(plname,mar_ask_name(),PL_NSIZ); } void Gem_get_nh_event() {} void Gem_suspend_nhwindows(str) const char *str; { const char *foo; foo=str; /* MAR -- And the compiler whines no more ... */ } void Gem_resume_nhwindows() {} void Gem_end_screen() {} void Gem_start_screen() {} extern void mar_exit_nhwindows(void); extern boolean run_from_desktop; void Gem_exit_nhwindows(str) const char *str; { if(str) Gem_raw_print(str); mar_exit_nhwindows(); if(flags.toptenwin) run_from_desktop=FALSE; iflags.window_inited = 0; } winid Gem_create_nhwindow(type) int type; { winid newid; switch(type) { case NHW_MESSAGE: if(iflags.msg_history < 20) iflags.msg_history = 20; else if(iflags.msg_history > 60) iflags.msg_history = 60; break; case NHW_STATUS: case NHW_MAP: case NHW_MENU: case NHW_TEXT: break; default: panic("Tried to create window type %d\n", (int) type); return WIN_ERR; } newid=mar_create_window(type); if(newid == MAXWIN) { panic("No window slots!"); /* NOTREACHED */ } return newid; } void Gem_nhbell() { if (flags.silent) return; putchar('\007'); fflush(stdout); } extern void mar_clear_map(void); void Gem_clear_nhwindow(window) winid window; { if(window == WIN_ERR) panic(winpanicstr, window); switch(mar_hol_win_type(window)) { case NHW_MESSAGE: mar_clear_messagewin(); break; case NHW_MAP: mar_clear_map(); break; case NHW_STATUS: case NHW_MENU: case NHW_TEXT: break; } } extern void mar_more(void); /*ARGSUSED*/ void Gem_display_nhwindow(window, blocking) winid window; boolean blocking; { if(window == WIN_ERR) panic(winpanicstr, window); mar_display_nhwindow(window); switch(mar_hol_win_type(window)){ case NHW_MESSAGE: if(blocking) mar_more(); break; case NHW_MAP: if(blocking) Gem_display_nhwindow(WIN_MESSAGE, TRUE); break; case NHW_STATUS: case NHW_TEXT: case NHW_MENU: default: break; } } void Gem_destroy_nhwindow(window) winid window; { if(window == WIN_ERR) /* MAR -- test existence */ panic(winpanicstr, window); mar_destroy_nhwindow(window); } extern void mar_curs(int,int); /* mar_curs is only for map */ void Gem_curs(window, x, y) winid window; register int x, y; { if(window == WIN_ERR) /* MAR -- test existence */ panic(winpanicstr, window); if(window==WIN_MAP) mar_curs(x-1,y); /*$$$*/ else if(window==WIN_STATUS) curr_status_line=y; } extern void mar_add_status_str(const char *, int); extern void mar_putstr_text(winid, int, const char *); void Gem_putstr(window, attr, str) winid window; int attr; const char *str; { int win_type; if(window == WIN_ERR) { Gem_raw_print(str); return; } if(str == (const char*)0) return; switch((win_type=mar_hol_win_type(window))) { case NHW_MESSAGE: mar_add_message(str); break; case NHW_STATUS: mar_status_dirty(); mar_add_status_str(str,curr_status_line); if(curr_status_line) mar_display_nhwindow(WIN_STATUS); break; case NHW_MAP: if(strcmp(str,".")) 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: mar_change_menu_2_text(window); /* Fallthru */ case NHW_TEXT: mar_putstr_text(window,attr,str); break; } /* endswitch win_type */ } void Gem_display_file(fname, complain) const char *fname; boolean complain; { dlb *f; char buf[BUFSZ]; char *cr; f = dlb_fopen(fname, "r"); if (!f) { if(complain) pline("Cannot open \"%s\".", fname); } else { winid datawin; datawin = Gem_create_nhwindow(NHW_TEXT); while (dlb_fgets(buf, BUFSZ, f)) { if ((cr = index(buf, '\n')) != 0) *cr = 0; if (index(buf, '\t') != 0) (void) tabexpand(buf); Gem_putstr(datawin, 0, buf); } (void) dlb_fclose(f); Gem_display_nhwindow(datawin, FALSE); Gem_destroy_nhwindow(datawin); } } /*ARGSUSED*/ /* * Add a menu item to the beginning of the menu list. This list is reversed * later. */ void Gem_add_menu(window, glyph, identifier, ch, gch, attr, str, preselected) winid window; /* window to use, must be of type NHW_MENU */ int glyph; /* glyph to display with item (unused) */ const anything *identifier; /* what to return if selected */ char ch; /* keyboard accelerator (0 = pick our own) */ char gch; /* group accelerator (0 = no group) */ int attr; /* attribute for string (like Gem_putstr()) */ const char *str; /* menu string */ boolean preselected; /* item is marked as selected */ { Gem_menu_item *G_item; const char *newstr; char buf[QBUFSZ]; if (str == (const char*) 0) return; if (window == WIN_ERR) /* MAR -- test existence */ panic(winpanicstr, window); if (identifier->a_void) Sprintf(buf, "%c - %s", ch ? ch : '?', str); else Sprintf(buf, "%s", str); newstr = buf; G_item = (Gem_menu_item *) alloc(sizeof(Gem_menu_item)); G_item->Gmi_identifier = (long)identifier->a_void; G_item->Gmi_glyph = glyph!=NO_GLYPH ? glyph2tile[glyph] : NO_GLYPH; G_item->Gmi_count = -1L; G_item->Gmi_selected = preselected ? 1 : 0; G_item->Gmi_accelerator = ch; G_item->Gmi_groupacc = gch; G_item->Gmi_attr = attr; G_item->Gmi_str = copy_of(newstr); mar_add_menu(window, G_item); } /* * End a menu in this window, window must a type NHW_MENU. * We assign the keyboard accelerators as needed. */ void Gem_end_menu(window, prompt) winid window; /* menu to use */ const char *prompt; /* prompt to for menu */ { if(window == WIN_ERR || mar_hol_win_type(window) != NHW_MENU) panic(winpanicstr, window); /* Reverse the list so that items are in correct order. */ mar_reverse_menu(); /* Put the prompt at the beginning of the menu. */ mar_set_menu_title(prompt); mar_set_accelerators(); } int Gem_select_menu(window, how, menu_list) winid window; int how; menu_item **menu_list; { Gem_menu_item *Gmit; menu_item *mi; int n; if(window == WIN_ERR || mar_hol_win_type(window) != NHW_MENU) panic(winpanicstr, window); *menu_list = (menu_item *) 0; mar_set_menu_type(how); Gem_display_nhwindow(window, TRUE); for (n = 0, Gmit = mar_hol_inv(); Gmit; Gmit = Gmit->Gmi_next) if (Gmit->Gmi_selected) n++; if (n > 0) { *menu_list = (menu_item *) alloc(n * sizeof(menu_item)); for (mi = *menu_list, Gmit = mar_hol_inv(); Gmit; Gmit = Gmit->Gmi_next) if (Gmit->Gmi_selected) { mi->item = (anything)(genericptr_t)Gmit->Gmi_identifier; mi->count = Gmit->Gmi_count; mi++; } } return n; } void Gem_update_inventory() {} void Gem_mark_synch() { mar_display_nhwindow(WIN_MESSAGE); mar_display_nhwindow(WIN_MAP); mar_display_nhwindow(WIN_STATUS); } void Gem_wait_synch() { mar_display_nhwindow(WIN_MESSAGE); mar_display_nhwindow(WIN_MAP); mar_display_nhwindow(WIN_STATUS); } #ifdef CLIPPING extern void mar_cliparound(void); void Gem_cliparound(x, y) int x, y; { mar_curs(x-1,y); mar_cliparound(); } #endif /* CLIPPING */ /* * Gem_print_glyph * * Print the glyph to the output device. Don't flush the output device. * * Since this is only called from show_glyph(), it is assumed that the * position and glyph are always correct (checked there)! */ void mar_print_gl_char(winid,xchar,xchar,int); #ifdef REINCARNATION extern int mar_set_rogue(int); #endif extern void mar_add_pet_sign(winid,int,int); void Gem_print_glyph(window, x, y, glyph) winid window; xchar x, y; int glyph; { /* Move the cursor. */ Gem_curs(window, x,y); # ifdef REINCARNATION mar_set_rogue(Is_rogue_level(&u.uz) ? TRUE : FALSE); # endif 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 mar_print_gl_char(window,x,y,glyph); } void mar_print_char(winid,xchar,xchar,char,int); void mar_print_gl_char(window, x, y, glyph) winid window; 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. */ # ifdef REINCARNATION if (Is_rogue_level(&u.uz)) color = NO_COLOR; # endif #endif /* TEXTCOLOR */ mar_print_char(window,x,y,ch,color); } extern void mar_raw_print(const char *); extern void mar_raw_print_bold(const char *); void Gem_raw_print(str) const char *str; { if(str && *str){ if(iflags.window_inited) mar_raw_print(str); else printf("%s\n",str); } } void Gem_raw_print_bold(str) const char *str; { if(str && *str){ if(iflags.window_inited) mar_raw_print_bold(str); else printf("%s\n",str); } } extern void mar_update_value(void); /* wingem1.c */ int Gem_nhgetch() { int i; mar_update_value(); i = tgetch(); if (!i) i = '\033'; /* map NUL to ESC since nethack doesn't expect NUL */ return i; } /* Get a extended command in windowport specific way. returns index of the ext_cmd or -1. called after '#'. It's a menu with all the possibilities. */ int Gem_get_ext_cmd() { winid wind; int i, count, what,too_much=FALSE; menu_item *selected=NULL; anything any; char accelerator=0, tmp_acc=0; const char *ptr; wind=Gem_create_nhwindow(NHW_MENU); Gem_start_menu(wind); for(i=0;(ptr=extcmdlist[i].ef_txt);i++){ any.a_int=i; accelerator=*ptr; if(tmp_acc==accelerator){ if(too_much) accelerator='&'; /* MAR -- poor choice, anyone? */ else accelerator+='A'-'a'; too_much=TRUE; }else too_much=FALSE; tmp_acc=*ptr; Gem_add_menu(wind,NO_GLYPH,&any,accelerator,0,ATR_NONE,ptr,FALSE); } Gem_end_menu(wind,"What extended command?"); count=Gem_select_menu(wind,PICK_ONE,&selected); what = count ? selected->item.a_int : -1; if(selected) free(selected); Gem_destroy_nhwindow(wind); return(what); } void Gem_number_pad(state) int state; { state=state; } void win_Gem_init() {} #ifdef POSITIONBAR void Gem_update_positionbar(posbar) char *posbar; {} #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. * * This is an exact duplicate of copy_of() in X11/winmenu.c. */ static char * copy_of(s) const char *s; { if (!s) s = nullstr; return strcpy((char *) alloc((unsigned) (strlen(s) + 1)), s); } #endif /* GEM_GRAPHICS /*wingem.c*/ slashem-0.0.7E7F3/win/gem/Install.gem0000664000076400007640000000203310545462317015317 0ustar alialiHi, This is nethack3.4.1 for Atari Gem and tty Windowing System. It is by far not complete or perfect. (My english too :-)) You need at least 2Meg free RAM, 16 colors and 3 Meg free Disk space. In fact it works also with monochrome, but you have to create a nh2.img (and title2.img) on your own. Atari windowport changes from 3.3.0: added a ASCII-Mode in GEM -> F2 the cursor is switchable -> F3 added inventory/menu search -> : removed the redraw problem removed almost all flicker (except with NOVA-Card :-() placed the GEM-dialogues more pleasent tty corner windows (i.e. inv) display now correct in a vt52-win greyed out old messages placed the GEM-windows more convient ... Feel free to contact me about Issues and Errors. e-mail: gaston@cs.tu-berlin.de You use this program at your own risk, I can't guarantee it will work or do you no harm. Look at the nethack licence too. As you may have noticed the look and feel is from Warwick Allisons nethack3.1.3d Gem Version and I have used E_Gem2.2.0 from Christian Grunenberg. Marvin slashem-0.0.7E7F3/win/gem/bitmfile.c0000664000076400007640000001766610545462317015200 0ustar aliali/****************************\ * Bitmap mit Farbtabelle als * * Graphik-Datei speichern * * Autor: Gabriel Schmidt * * (c) 1992 by MAXON-Computer * * Modifiziert von Sebastian * * Bieber, Dez. 1994 * * -> Programmcode * \****************************/ #include #include #include #include #include #include "bitmfile.h" /* --- (X) IMG-Implementation ----------------- */ #define IMG_COMPRESSED typedef struct { UWORD img_version; UWORD img_headlen; UWORD img_nplanes; UWORD img_patlen; UWORD img_pixw; UWORD img_pixh; UWORD img_w; UWORD img_h; } IMG_HEADER; typedef enum {NONE, SOLID0, SOLID1, PATRUN, BITSTR} IMG_MODE; typedef UBYTE IMG_SOLID; typedef enum { RGB=0, CMY=1, Pantone=2 } XIMG_COLMODEL; typedef struct { ULONG img_ximg; XIMG_COLMODEL img_colmodel; } XIMG_HEADER; typedef struct RGB XIMG_RGB; int bitmap_to_img(FILE_TYP typ, int ww, int wh, unsigned int pixw, unsigned int pixh, unsigned int planes, unsigned int colors, const char *filename, void(*get_color)(unsigned int colind, struct RGB *rgb), void(*get_pixel)(int x, int y, unsigned int *colind) ) { int file, error, cnt; IMG_HEADER header; XIMG_HEADER xheader; XIMG_RGB xrgb; IMG_MODE mode; UBYTE *line_buf, *write_buf; register UBYTE *startpnt, *bufpnt; unsigned int colind, line_len, line, bit; register unsigned int byte; register UBYTE count; /* fill in (X) IMG-Header */ header.img_version = 1; header.img_headlen = (UWORD) sizeof(header) /2; if (typ == XIMG) header.img_headlen += (UWORD)(sizeof(xheader)+colors*sizeof(xrgb))/2; header.img_nplanes = planes; header.img_patlen = 2; header.img_pixw = pixw; header.img_pixh = pixh; header.img_w = ww; header.img_h = wh; xheader.img_ximg = XIMG_MAGIC; xheader.img_colmodel= RGB; /* calculate linelength, allocate buffer. */ line_len = (ww+7)/8; line_buf = malloc((size_t)planes*line_len); if (line_buf == NULL) return(ENOMEM); /* Worst case: the bufferd line could grow to max. 3 times the length */ /* of the original! */ write_buf = malloc((size_t)3*line_len); if (write_buf == NULL) { free(line_buf); return(ENOMEM); }; /* open file */ file = open(filename, O_WRONLY | O_CREAT | O_TRUNC); if (file<0) { error = errno; free(line_buf); free(write_buf); return(error); }; /* write Header */ if (write (file, &header, sizeof(header)) != sizeof(header) || (typ == XIMG && write (file, &xheader, sizeof(xheader) ) != sizeof(xheader))) { error = errno; close(file); free(line_buf); free(write_buf); return(error); }; /* save the colortable if possible */ if ( typ == XIMG ) for (cnt=0; cnt>= 1; }; }; }; /* compress bitstrings in buffer */ /* and write it to file */ for (cnt=0; cnt0; count--) *(bufpnt++) = *(startpnt++); break; }; }; if (write(file,write_buf,bufpnt-write_buf) != (bufpnt-write_buf)) { error = errno; close(file); free(line_buf); free(write_buf); return(error); }; }; }; /*close file, free buffer. */ close(file); free(line_buf); free(write_buf); return(0); } /*---filetype-dispatcher--------------------*/ const char *get_file_ext(FILE_TYP typ) { switch (typ) { case IMG: case XIMG: return("IMG"); default: return(""); }; } int bitmap_to_file(FILE_TYP typ, int ww, int wh, unsigned int pwx, unsigned int pwy, unsigned int planes, unsigned int colors, const char *filename, void (*get_color)(unsigned int colind, struct RGB *rgb), void (*get_pixel)(int x, int y, unsigned int *colind)) { switch (typ) { case IMG: case XIMG: return(bitmap_to_img(typ,ww,wh,pwx,pwy,planes,colors,filename,get_color,get_pixel)); default: return(-1); }; } slashem-0.0.7E7F3/win/gem/wingem1.c0000664000076400007640000022550510545462317014745 0ustar aliali/* 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 #include #include #include "gem_rsc.h" #include "load_img.h" #include "gr_rect.h" #define genericptr_t void * typedef signed char schar; #include "wintype.h" #undef genericptr_t #define NDECL(f) f(void) #define FDECL(f,p) f p #define CHAR_P char #define SCHAR_P schar #define UCHAR_P uchar #define XCHAR_P xchar #define SHORT_P short #define BOOLEAN_P boolean #define ALIGNTYP_P aligntyp typedef signed char xchar; #include "wingem.h" #undef CHAR_P #undef SCHAR_P #undef UCHAR_P #undef XCHAR_P #undef SHORT_P #undef BOOLEAN_P #undef ALIGNTYP_P #undef NDECL #undef FDECL static char nullstr[]="", md[]="NetHack 3.4.3", 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 /* * Keyboard translation tables. */ #define C(c) (0x1f & (c)) #define M(c) (0x80 | (c)) #define KEYPADLO 0x61 #define KEYPADHI 0x71 #define PADKEYS (KEYPADHI - KEYPADLO + 1) #define iskeypad(x) (KEYPADLO <= (x) && (x) <= KEYPADHI) /* * Keypad keys are translated to the normal values below. * When iflags.BIOS is active, shifted keypad keys are translated to the * shift values below. */ static const struct pad { char normal, shift, cntrl; } keypad[PADKEYS] = { {C('['), 'Q', C('[')}, /* UNDO */ {'?', '/', '?'}, /* HELP */ {'(', 'a', '('}, /* ( */ {')', 'w', ')'}, /* ) */ {'/', '/', '/'}, /* / */ {C('p'), '$', C('p')}, /* * */ {'y', 'Y', C('y')}, /* 7 */ {'k', 'K', C('k')}, /* 8 */ {'u', 'U', C('u')}, /* 9 */ {'h', 'H', C('h')}, /* 4 */ {'.', '.', '.'}, {'l', 'L', C('l')}, /* 6 */ {'b', 'B', C('b')}, /* 1 */ {'j', 'J', C('j')}, /* 2 */ {'n', 'N', C('n')}, /* 3 */ {'i', 'I', C('i')}, /* Ins */ {'.', ':', ':'} /* Del */ }, numpad[PADKEYS] = { {C('['), 'Q', C('[')} , /* UNDO */ {'?', '/', '?'}, /* HELP */ {'(', 'a', '('}, /* ( */ {')', 'w', ')'}, /* ) */ {'/', '/', '/'}, /* / */ {C('p'), '$', C('p')}, /* * */ {'7', M('7'), '7'}, /* 7 */ {'8', M('8'), '8'}, /* 8 */ {'9', M('9'), '9'}, /* 9 */ {'4', M('4'), '4'}, /* 4 */ {'.', '.', '.'}, /* 5 */ {'6', M('6'), '6'}, /* 6 */ {'1', M('1'), '1'}, /* 1 */ {'2', M('2'), '2'}, /* 2 */ {'3', M('3'), '3'}, /* 3 */ {'i', 'I', C('i')}, /* Ins */ {'.', ':', ':'} /* Del */ }; #define TBUFSZ 300 #define BUFSZ 256 extern int yn_number; /* from decl.c */ extern char toplines[TBUFSZ]; /* from decl.c */ extern char mapped_menu_cmds[]; /* from options.c */ extern int mar_iflags_numpad(void); /* from wingem.c */ 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; static struct gw{ WIN *gw_window; int gw_type, gw_dirty; 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{*/ int mar_message_pause=TRUE; int mar_esc_pressed=FALSE; 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]; MITEM scroll_keys[]={ /* menu, key, state, mode, msg */ {FAIL,key(CTRLLEFT,0),K_CTRL,PAGE_LEFT,FAIL}, {FAIL,key(CTRLRIGHT,0),K_CTRL,PAGE_RIGHT,FAIL}, {FAIL,key(SCANUP,0),K_SHIFT,PAGE_UP,FAIL}, {FAIL,key(SCANDOWN,0),K_SHIFT,PAGE_DOWN,FAIL}, {FAIL,key(SCANLEFT,0),0,LINE_LEFT,FAIL}, {FAIL,key(SCANRIGHT,0),0,LINE_RIGHT,FAIL}, {FAIL,key(SCANUP,0),0,LINE_UP,FAIL}, {FAIL,key(SCANDOWN,0),0,LINE_DOWN,FAIL}, {FAIL,key(SCANLEFT,0),K_SHIFT,LINE_START,FAIL}, {FAIL,key(SCANRIGHT,0),K_SHIFT,LINE_END,FAIL}, {FAIL,key(SCANUP,0),K_CTRL,WIN_START,FAIL}, {FAIL,key(SCANDOWN,0),K_CTRL,WIN_END,FAIL}, {FAIL,key(SCANHOME,0),K_SHIFT,WIN_END,FAIL}, {FAIL,key(SCANHOME,0),0,WIN_START,FAIL} }; #define SCROLL_KEYS 14 static DIAINFO *Inv_dialog; #define null_free(ptr) free(ptr), (ptr)=NULL #define test_free(ptr) if(ptr) null_free(ptr) static char *Menu_title=NULL; void mar_display_nhwindow(winid); void mar_check_hilight_status(void){} /* to be filled :-) */ static char *mar_copy_of(const char *); extern void panic(const char *, ...); void *m_alloc(size_t amt){ void *ptr; ptr=malloc(amt); if (!ptr) panic("Memory allocation failure; cannot get %lu bytes", amt); return(ptr); } void mar_clear_messagewin(void){ int i, *ptr=message_age; if(WIN_MESSAGE==WIN_ERR) return; for(i=msg_anz;--i>=0;ptr++){ if(*ptr) Gem_nhwindow[WIN_MESSAGE].gw_dirty=TRUE; *ptr=FALSE; } mar_message_pause=FALSE; 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;icurr,&frame,&z_win->curr.g_x,&z_win->curr.g_y,NULL)) window_size(z_win,&z_win->curr); else window_top(z_win); } 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); } Event_Timer(50,0,TRUE); break; case DNMSG: if(msg_posob_x=p_w->work.g_x+p_w->work.g_w/2-p_obj->ob_width/2; p_obj->ob_y=p_w->work.g_y+p_w->work.g_h/2-p_obj->ob_height/2; return(DIA_LASTPOS); } return(DIA_CENTERED); } /****************************** set_no_glyph *************************************/ void mar_set_no_glyph(ng) int ng; { 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]; v_set_fill(col,1,IP_SOLID,0); rc_grect_to_array(area,pxy); v_bar(x_handle,pxy); } void my_clear_area(GRECT *area){ my_color_area(area, WHITE); } int mar_set_tile_mode(int); 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; pla[3]+=h; pla[6]=pla[4]=area->g_x; /* x_wert to */ 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]); } } static int draw_titel(PARMBLK *pb){ static int pla[8]; GRECT work=*(GRECT *) &pb->pb_x; if(rc_intersect((GRECT *)&pb->pb_xc,&work)){ pla[0]=pla[1]=0; pla[2]=pb->pb_w-1; pla[3]=pb->pb_h-1; pla[6]=pla[4]=pb->pb_x; /* x_wert to */ pla[7]=pla[5]=pb->pb_y; /* y_wert to */ pla[6]+=pb->pb_w-1; pla[7]+=pb->pb_h-1; vro_cpyfm(x_handle, S_ONLY, pla, &Titel_bild, screen); } return(0); } static int draw_lines(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); 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); } static int draw_msgline(PARMBLK *pb){ GRECT area=*(GRECT *) &pb->pb_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; 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;ipb_x; if(rc_intersect((GRECT *)&pb->pb_xc,&area)){ int gl, i, x=pb->pb_x, y=pb->pb_y,start_line=area.g_y-y; 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 v_set_text(FAIL,FALSE,BLACK,0,FAIL,NULL); 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); } static int draw_prompt(PARMBLK *pb){ GRECT area=*(GRECT *) &pb->pb_x; 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); } static USERBLK ub_lines={draw_lines, 0L}, ub_msg={draw_msgline, 0L}, ub_inventory={draw_inventory, 0L}, ub_titel={draw_titel, 0L}, ub_status={draw_status, 0L}, ub_prompt={draw_prompt, 0L}; /**************************** rsc_funktionen *****************************/ void my_close_dialog(DIAINFO *dialog,boolean shrink_box){ close_dialog(dialog,shrink_box); Event_Timer(0,0,TRUE); } void mar_get_rsc_tree(obj_number, z_ob_obj) int obj_number; OBJECT **z_ob_obj; { rsrc_gaddr( R_TREE, obj_number, z_ob_obj ); fix_objects(*z_ob_obj,SCALING,0,0); } void mar_clear_map(void); void img_error(errnumber) int errnumber; { char buf[BUFSZ]; switch(errnumber){ case ERR_HEADER : sprintf(buf,"%s","[1][ Image Header | corrupt. ][ Oops ]"); break; case ERR_ALLOC : sprintf(buf,"%s","[1][ Not enough | memory for | an image. ][ Oops ]"); break; case ERR_FILE : sprintf(buf,"%s","[1][ The Image-file | is not available ][ Oops ]"); break; case ERR_DEPACK : sprintf(buf,"%s","[1][ The Image-file | is corrupt ][ Oops ]"); break; case ERR_COLOR : sprintf(buf,"%s","[1][ Number of colors | not supported ][ Oops ]"); break; default: sprintf(buf,"[1][ img_error | strange error | number: %i ][ Hmm ]",errnumber); break; } form_alert(1,buf); } void mar_change_button_char(OBJECT *z_ob, int nr, char ch){ *ob_get_text(z_ob,nr,0)=ch; ob_set_hotkey(z_ob,nr,ch); } void mar_set_dir_keys() { static int mi_numpad=FAIL; char mcmd[]="bjnh.lyku", npcmd[]="123456789", *p_cmd; 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,'<'); p_cmd= mi_numpad ? npcmd : mcmd; for(i=0;i<9;i++) mar_change_button_char(z_ob,DIR1+2*i,p_cmd[i]); } } extern int total_tiles_used; /* tile.c */ 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; if((i=open_rsc("gem_rsc.rsc",NULL,md,md,md,0,0,0))<=0){ graf_mouse(M_OFF,NULL); if(i<0) form_alert(1,"[3][| Fatal Error | File: GEM_RSC.RSC | not found. ][ grumble ]"); else form_alert(1,"[3][| Fatal Error | GEM initialisation | failed. ][ a pity ]"); return(0); } if(planes<1 || planes>8){ form_alert(1,"[3][ Color-depth | not supported, | try 2-256 colors. ][ Ok ]"); return(0); } MouseBee(); /* MAR -- 17.Mar 2002 NVDI 3.0 or better uses v_ftext */ v_mtext= speedo==3 ? &v_ftext : &v_gtext; for(i=0;i0 && planes<9){ normal_palette=(short *)m_alloc(3*colors*sizeof(short)); get_colors(x_handle,normal_palette, colors); } loadimg: bild_fehler=depack_img(Tilefile?Tilefile:(planes>=4)?"NH16.IMG":"NH2.IMG",&tile_image); if(bild_fehler){ z_ob=zz_oblist[ABOUT]; ob_undraw_dialog(z_ob,0,0,0,0); ob_hide(z_ob,OKABOUT,FALSE); img_error(bild_fehler); return(0); } if(tile_image.img_w%Tile_width || tile_image.img_h%Tile_heigth){ Tilefile=NULL; Tile_width=Tile_heigth=16; printf("size didn't match.\n"); goto loadimg; } if((tile_image.img_w/Tile_width)*(tile_image.img_h/Tile_heigth)=4){ 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 } 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); for(i=0;i=0;) if(Gem_nhwindow[i].gw_type) 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); test_free(tile_image.addr); test_free(titel_image.palette); test_free(titel_image.addr); } /************************* mar_curs *******************************/ void mar_curs(x,y) int x, y; { 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); Min(&dirty_map_area.g_x,map_cursx); Min(&dirty_map_area.g_y,map_cursy); Max(&dirty_map_area.g_w,map_cursx); Max(&dirty_map_area.g_h,map_cursy); map_cursx=x; map_cursy=y; if(WIN_MAP!=WIN_ERR) Gem_nhwindow[WIN_MAP].gw_dirty=TRUE; } void mar_cliparound(void); void mar_map_curs_weiter(void) { static int once=TRUE; if(once){ redraw_window(Gem_nhwindow[WIN_STATUS].gw_window,NULL); redraw_window(Gem_nhwindow[WIN_MESSAGE].gw_window,NULL); once=FALSE; } mar_curs(map_cursx+1,map_cursy); mar_cliparound(); } /************************* about *******************************/ void mar_about() { xdialog(zz_oblist[ABOUT], md, NULL, NULL, DIA_CENTERED, FALSE, DIALOG_MODE); Event_Timer(0,0,TRUE); } /************************* ask_name *******************************/ char * mar_ask_name() { OBJECT *z_ob=zz_oblist[NAMEGET]; int bild_fehler; char who_are_you[] = "Who are you? "; bild_fehler=depack_img(planes<4 ? "TITLE2.IMG" : "TITLE.IMG", &titel_image); if(bild_fehler ){ /* MAR -- this isn't lethal */ ob_set_text(z_ob,NETHACKPICTURE,"missing title.img."); }else{ mfdb(&Titel_bild, (int *)titel_image.addr, titel_image.img_w, titel_image.img_h, 1, titel_image.planes); transform_img(&Titel_bild); z_ob[NETHACKPICTURE].ob_type=G_USERDEF; z_ob[NETHACKPICTURE].ob_spec.userblk=&ub_titel; } ob_clear_edit(z_ob); xdialog(z_ob,who_are_you, NULL, NULL, DIA_CENTERED, FALSE, DIALOG_MODE); Event_Timer(0,0,TRUE); test_free(titel_image.palette); test_free(titel_image.addr); test_free(Titel_bild.fd_addr); return(ob_get_text(z_ob,PLNAME,0)); } /************************* more *******************************/ void send_key(int key) { int buf[8]; buf[3]=0; /* No Shift/Ctrl/Alt */ buf[4]=key; AvSendMsg(ap_id,AV_SENDKEY,buf); } void send_return() { send_key(key(SCANRET,0)); } int K_Init(xev,availiable) XEVENT *xev; int availiable; { xev=xev; return(MU_KEYBD&availiable); } int KM_Init(xev,availiable) XEVENT *xev; int availiable; { xev=xev; return((MU_KEYBD|MU_MESAG)&availiable); } int M_Init(xev,availiable) XEVENT *xev; int availiable; { xev=xev; return(MU_MESAG&availiable); } #define More_Init K_Init int More_Handler(xev) XEVENT *xev; { int ev=xev->ev_mwich; if(ev&MU_KEYBD){ char ch=(char)(xev->ev_mkreturn&0x00FF); DIAINFO *dinf; WIN *w; switch(ch){ case '\033': /* no more more more */ case ' ': if((w=get_top_window()) && (dinf=(DIAINFO *)w->dialog) && dinf->di_tree==zz_oblist[PAGER]){ if(ch=='\033') mar_esc_pressed=TRUE; send_return(); break; } /* Fall thru */ default: ev &= ~MU_KEYBD; /* unknown key */ break; } } return(ev); } void mar_more() { if(!mar_esc_pressed){ OBJECT *z_ob=zz_oblist[PAGER]; WIN *p_w; Event_Handler(More_Init,More_Handler); 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); Event_Handler(NULL,NULL); if(planes<4) dial_colors(4,BLACK,WHITE,RED,RED,WHITE,BLACK,BLACK,BLACK,FAIL,FAIL,FAIL,FAIL,TRUE,TRUE); else dial_colors(7,LWHITE,BLACK,RED,RED,BLACK,BLACK,BLACK,BLACK,WHITE,WHITE,WHITE,WHITE,TRUE,TRUE); } } /************************* Gem_start_menu *******************************/ void Gem_start_menu(win) winid win; { win=win; if(invent_list){ Gem_menu_item *curr, *next; for(curr=invent_list;curr;curr=next){ next=curr->Gmi_next; free(curr->Gmi_str); free(curr); } } invent_list=NULL; Anz_inv_lines=0; Inv_breite=16; } /************************* mar_add_menu *******************************/ void mar_add_menu(win, item) winid win; Gem_menu_item *item; { win=win; item->Gmi_next = invent_list; invent_list = item; Anz_inv_lines++; } void mar_reverse_menu() { Gem_menu_item *next, *head = 0, *curr=invent_list; while (curr) { next = curr->Gmi_next; curr->Gmi_next = head; head = curr; curr = next; } invent_list=head; } void mar_set_accelerators() { char ch='a'; 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; if(ch=='z') ch='A'; else if(ch=='Z') ch=0; else ch++; } } } Gem_menu_item * mar_hol_inv() { return(invent_list); } /************************* mar_putstr_text *********************/ 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) { static int zeilen_frei=0; int breite; char *ptr; window=window; if(!text_lines){ text_lines=(char **)m_alloc(12*sizeof(char *)); zeilen_frei=12; } if(!zeilen_frei){ text_lines=(char **)realloc(text_lines,(Anz_text_lines+12)*sizeof(char *)); zeilen_frei=12; } if(!text_lines){ mar_raw_print("No room for Text"); return; } if(str) breite=strlen(str); Min(&breite,80); ptr=text_lines[Anz_text_lines]=(char *)m_alloc(breite*sizeof(char)+2); *ptr=(char)(attr+1); /* avoid 0 */ strncpy(ptr+1,str,breite); ptr[breite+1]=0; Anz_text_lines++; zeilen_frei--; } int mar_set_inv_win(Anzahl, Breite) int Anzahl, Breite; { 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; } } scroll_menu.vpage=Anzahl; } if((scroll_menu.hmax=scroll_menu.hsize-scroll_menu.hpage)<0) scroll_menu.hmax=0; 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); } /************************* mar_status_dirty *******************************/ void mar_status_dirty() { int ccol; ccol=mar_hp_query(); if(ccol<2) curs_col=WHITE; /* 50-100% : 0 */ else if(ccol<3) curs_col=YELLOW; /* 33-50% : 6 */ else if(ccol<5) curs_col=LYELLOW; /* 20-33% : 14*/ else if(ccol<10) curs_col=RED; /* 10-20% : 2 */ else curs_col=MAGENTA; /* <10% : 7*/ } /************************* mar_add_message *******************************/ void mar_add_message(str) const char *str; { int i, mesg_hist=mar_get_msg_history(); char *tmp, *rest, buf[TBUFSZ]; if(WIN_MESSAGE == WIN_ERR) return; if(!mar_message_pause){ mar_message_pause=TRUE; messages_pro_zug=0; msg_pos=msg_max; } if(msg_max>mesg_hist-2){ msg_max=mesg_hist-2; msg_pos--; if(msg_pos<0) msg_pos=0; tmp=message_line[0]; for(i=0;i=msg_width){ int pos=msg_width; tmp=toplines+msg_width; while(*tmp!=' ' && pos>=0){ tmp--; pos--; } if(pos<=0) pos=msg_width; /* Mar -- Oops, what a word :-) */ message_age[msg_max]=TRUE; strncpy(message_line[msg_max],toplines,pos); message_line[msg_max][pos]=0; rest=strcpy(buf,toplines+pos); }else{ message_age[msg_max]=TRUE; strncpy(message_line[msg_max],toplines,msg_width); rest=0; } Gem_nhwindow[WIN_MESSAGE].gw_dirty=TRUE; if(messages_pro_zug>=mesg_hist){ /* MAR -- Greater then should never happen */ messages_pro_zug=mesg_hist; mar_display_nhwindow(WIN_MESSAGE); } if(rest) mar_add_message(rest); } /************************* mar_add_status_str *******************************/ void mar_add_status_str(str,line) 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 *******************************/ void mar_set_menu_title(str) const char *str; { test_free(Menu_title); /* just in case */ Menu_title=mar_copy_of(str ? str : nullstr); } /************************* mar_set_menu_type *******************************/ void mar_set_menu_type(how) int how; { Inv_how=how; } /************************* Inventory Utils *******************************/ void set_all_on_page(start, page) int start, page; { Gem_menu_item *curr; if(start<0 || page<0) return; for(curr=invent_list; start--&&curr; curr=curr->Gmi_next); for(; page--&&curr; curr=curr->Gmi_next) if (curr->Gmi_identifier && !curr->Gmi_selected) curr->Gmi_selected = TRUE; } void unset_all_on_page(start, page) int start, page; { Gem_menu_item *curr; if(start<0 || page<0) return; for(curr=invent_list; start--&&curr; curr=curr->Gmi_next); for(; page--&&curr; curr=curr->Gmi_next) if (curr->Gmi_identifier && curr->Gmi_selected) { curr->Gmi_selected = FALSE; curr->Gmi_count = -1L; } } void invert_all_on_page(start, page, acc) int start, page; char acc; { Gem_menu_item *curr; if(start<0 || page<0) return; for(curr=invent_list; start--&&curr; curr=curr->Gmi_next); for(; page--&&curr; curr=curr->Gmi_next) if (curr->Gmi_identifier && (acc == 0 || curr->Gmi_groupacc == acc)) { if (curr->Gmi_selected) { curr->Gmi_selected = FALSE; curr->Gmi_count = -1L; } else curr->Gmi_selected = TRUE; } } /************************* Inv_Handler and Inv_Init *******************************/ int scroll_top_dialog(char ch){ WIN *w; DIAINFO *dinf; if((w=get_top_window()) && (dinf=(DIAINFO *)w->dialog) && dinf->di_tree==zz_oblist[LINES]){ switch(ch){ case ' ': if(scroll_menu.vpos==scroll_menu.vmax){ send_return(); break; } /* Fall thru */ case MENU_NEXT_PAGE: scroll_window(w,PAGE_DOWN,NULL); break; case MENU_PREVIOUS_PAGE: scroll_window(w,PAGE_UP,NULL); break; case MENU_FIRST_PAGE: scroll_window(w,WIN_START,NULL); break; case MENU_LAST_PAGE: scroll_window(w,WIN_END,NULL); break; default: return(FALSE); } return(TRUE); } return(FALSE); } #define Text_Init KM_Init int Text_Handler(xev) XEVENT *xev; { 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); if(!scroll_top_dialog(ch)) switch(ch){ 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; } } return(ev); } #define Inv_Init KM_Init static long count=0; int Inv_Handler(xev) XEVENT *xev; { 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 */ }else /* LINESLIST changed */ ev &= ~MU_MESAG; /* unknown message not used */ } /* MU_MESAG */ if(ev&MU_KEYBD){ char ch=(char)(xev->ev_mkreturn&0x00FF); if(!scroll_top_dialog(ch)){ switch(ch){ case '0': /* special 0 is also groupaccelerator for balls */ if(count<=0) goto find_acc; case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if(Inv_how==PICK_NONE) goto find_acc; count = (count * 10L) + (long) (ch - '0'); break; case '\033': /* cancel - from counting or loop */ if(count>0L) count=0L; else{ unset_all_on_page(0, (int)scroll_menu.vsize); my_close_dialog(Inv_dialog,TRUE); return(ev); } break; case '\0': /* finished (commit) */ case '\n': case '\r': break; case MENU_SELECT_PAGE: if(Inv_how==PICK_NONE) goto find_acc; if (Inv_how == PICK_ANY) set_all_on_page((int)scroll_menu.vpos, scroll_menu.vpage); break; case MENU_SELECT_ALL: if(Inv_how==PICK_NONE) goto find_acc; if (Inv_how == PICK_ANY) set_all_on_page(0, (int)scroll_menu.vsize); break; case MENU_UNSELECT_PAGE: unset_all_on_page((int)scroll_menu.vpos, scroll_menu.vpage); break; case MENU_UNSELECT_ALL: unset_all_on_page(0, (int)scroll_menu.vsize); break; case MENU_INVERT_PAGE: if(Inv_how==PICK_NONE) goto find_acc; if (Inv_how == PICK_ANY) invert_all_on_page((int)scroll_menu.vpos, scroll_menu.vpage, 0); break; case MENU_INVERT_ALL: if(Inv_how==PICK_NONE) goto find_acc; if (Inv_how == PICK_ANY) invert_all_on_page(0, (int)scroll_menu.vsize, 0); break; case MENU_SEARCH: if(Inv_how!=PICK_NONE){ char buf[BUFSZ]; Gem_getlin("Search for:",buf); if(!*buf || buf[0]=='\033') break; for(it=invent_list;it;it=it->Gmi_next){ if(it->Gmi_identifier && strstr(it->Gmi_str,buf)){ it->Gmi_selected=TRUE; if(Inv_how!=PICK_ANY){ my_close_dialog(Inv_dialog,FALSE); break; } } } } 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 */ } /* MU_KEYBD */ 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); } return(ev); } /************************* draw_window *******************************/ static void mar_draw_window( first, win, area) int first; WIN *win; GRECT *area; { OBJECT *obj=(OBJECT *)win->para; if(obj){ if(first){ obj->ob_x=win->work.g_x; obj->ob_y=win->work.g_y; } if(area==NULL) area=&(win->work); objc_draw(obj, ROOT, MAX_DEPTH, area->g_x, area->g_y, area->g_w, area->g_h); } } /************************* 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; if(!sc) return; if(p_win->gadgets&HSLIDE){ long hsize=1000l; if(sc->hsize>0 && sc->hpage>0){ hsize *= sc->hpage; hsize /= sc->hsize; } window_slider(p_win,HOR_SLIDER,0,(int)hsize); } if(p_win->gadgets&VSLIDE){ long vsize=1000l; if(sc->vsize>0 && sc->vpage>0){ vsize *= sc->vpage; vsize /= sc->vsize; } window_slider(p_win,VERT_SLIDER,0,(int)vsize); } } } 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: *place=me; break; case NHW_MAP: *place=ma; break; case NHW_STATUS: *place=st; break; default: break; } } void mar_display_nhwindow(wind) winid wind; { DIAINFO *dlg_info; OBJECT *z_ob; int d_exit=W_ABANDON, i, breite, mar_di_mode, tmp_magx=magx; GRECT g_mapmax, area; char *tmp_button; struct gw *p_Gw; if(wind == WIN_ERR) return; p_Gw=&Gem_nhwindow[wind]; switch(p_Gw->gw_type){ case NHW_TEXT: if(WIN_MESSAGE != WIN_ERR && Gem_nhwindow[WIN_MESSAGE].gw_window) mar_display_nhwindow(WIN_MESSAGE); 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; 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(dlg_info,FALSE); if(d_exit!=W_CLOSED) ob_undostate(z_ob,d_exit&NO_CLICK,SELECTED); } } Event_Handler(NULL,NULL); ob_set_text(z_ob,QLINE,tmp_button); break; case NHW_MENU: if(WIN_MESSAGE != WIN_ERR && Gem_nhwindow[WIN_MESSAGE].gw_window) mar_display_nhwindow(WIN_MESSAGE); z_ob=zz_oblist[LINES]; scroll_menu.vsize=Anz_inv_lines; 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; 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); } } Event_Handler(NULL,NULL); ob_set_text(z_ob,QLINE,tmp_button); break; 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(); } if(p_Gw->gw_dirty){ area.g_x=p_Gw->gw_window->work.g_x+scroll_map.px_hline*(dirty_map_area.g_x-scroll_map.hpos); area.g_y=p_Gw->gw_window->work.g_y+scroll_map.px_vline*(dirty_map_area.g_y-scroll_map.vpos); area.g_w=(dirty_map_area.g_w-dirty_map_area.g_x+1)*scroll_map.px_hline; area.g_h=(dirty_map_area.g_h-dirty_map_area.g_y+1)*scroll_map.px_vline; 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; } break; case NHW_MESSAGE: if(p_Gw->gw_window==NULL){ calc_std_winplace(NHW_MESSAGE,&p_Gw->gw_place); z_ob=zz_oblist[MSGWIN]; magx=0; /* MAR -- Fake E_GEM to remove Backdropper */ 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; case NHW_STATUS: if(p_Gw->gw_window==NULL){ z_ob=zz_oblist[STATUSLINE]; calc_std_winplace(NHW_STATUS,&p_Gw->gw_place); 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; add_dirty_rect(dr_stat,&p_Gw->gw_place); } 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); } p_Gw->gw_dirty=FALSE; } /************************* create_window *******************************/ int mar_hol_win_type(window) winid window; { return(Gem_nhwindow[window].gw_type); } winid mar_create_window(type) int type; { winid newid; static char name[]="Gem"; int i; struct gw *p_Gw=&Gem_nhwindow[0]; for(newid = 0; p_Gw->gw_type && newid < MAXWIN; newid++, p_Gw++); switch(type){ case NHW_MESSAGE: message_line=(char **)m_alloc(msg_anz*sizeof(char *)); message_age=(int *)m_alloc(msg_anz*sizeof(int)); for(i=0;igw_window=open_window("Sonst", name, NULL, NULL, NAME|MOVER|CLOSER, 0, 0, 0, NULL, &p_Gw->gw_place, NULL, NULL, NULL, XM_TOP|XM_BOTTOM|XM_SIZE); break; } p_Gw->gw_type=type; return(newid); } void mar_change_menu_2_text(win) winid win; { Gem_nhwindow[win].gw_type=NHW_TEXT; } /************************* mar_clear_map *******************************/ void mar_clear_map() { int pla[8]; int x,y; pla[0]=pla[1]=pla[4]=pla[5]=0; pla[2]=pla[6]=scroll_map.px_hline*(COLNO-1)-1; pla[3]=pla[7]=scroll_map.px_vline*ROWNO-1; for(y=0;y0 ? 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); } } void mar_update_value() { if(WIN_MESSAGE!=WIN_ERR){ mar_message_pause=FALSE; mar_esc_pressed=FALSE; 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); } } int Main_Init(xev,availiable) XEVENT *xev; int availiable; { xev->ev_mb1mask= xev->ev_mb1state=1; xev->ev_mb1clicks= xev->ev_mb2clicks= xev->ev_mb2mask= xev->ev_mb2state=2; return((MU_KEYBD|MU_BUTTON1|MU_BUTTON2|MU_MESAG)&availiable); } /* * return a key, or 0, in which case a mouse button was pressed * mouse events should be returned as character postitions in the map window. */ /*ARGSUSED*/ int mar_nh_poskey(x, y, mod) int *x, *y, *mod; { static XEVENT xev; int retval, ev; xev.ev_mflags=Main_Init(&xev,0xFFFF); ev=Event_Multi(&xev); retval=FAIL; if(ev&MU_KEYBD){ char ch = xev.ev_mkreturn&0x00FF; char scan = (xev.ev_mkreturn & 0xff00) >> 8; int shift = xev.ev_mmokstate; const struct pad *kpad; /* Translate keypad keys */ if (iskeypad(scan)) { 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) mar_cliparound(); else if(scan == SCANF1) retval='h'; else if(scan == SCANF2){ mar_set_tile_mode(!mar_set_tile_mode(FAIL)); retval=C('l'); /* trigger full-redraw */ }else if(scan == SCANF3){ 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{ if(!ch) ch=(char)M(tolower(scan_2_ascii(xev.ev_mkreturn,shift))); if(((int)ch)==-128) ch='\033'; retval=ch; } } if(ev&MU_BUTTON1 || ev&MU_BUTTON2){ int ex=xev.ev_mmox, ey=xev.ev_mmoy; 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; }else if(WIN_STATUS != WIN_ERR && akt_win==Gem_nhwindow[WIN_STATUS].gw_window){ move_win(akt_win); }else if(WIN_MESSAGE != WIN_ERR && akt_win==Gem_nhwindow[WIN_MESSAGE].gw_window){ message_handler(ex,ey); } } if(ev&MU_MESAG){ int *buf=xev.ev_mmgpbuf; char *str; OBJECT *z_ob=zz_oblist[MENU]; switch(*buf) { case MN_SELECTED : menu_tnormal(z_ob,buf[3],TRUE); /* unselect menu header */ str=ob_get_text(z_ob,buf[4],0); str+=strlen(str)-2; switch(*str){ case ' ': /* just that command */ retval=str[1]; break; case '\005': /* Alt command */ case '\007': retval=M(str[1]); break; case '^': /* Ctrl command */ retval=C(str[1]); break; case 'f': /* Func Key */ switch(str[1]){ case '1': retval='h'; break; case '2': mar_set_tile_mode(!mar_set_tile_mode(FAIL)); retval=C('l'); /* trigger full-redraw */ break; case '3': draw_cursor=!draw_cursor; mar_curs(map_cursx,map_cursy); mar_display_nhwindow(WIN_MAP); break; default: } break; default: mar_about(); break; } break; /* MN_SELECTED */ 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; } } /* MU_MESAG */ if(retval==FAIL) retval=mar_nh_poskey(x,y,mod); return(retval); } int Gem_nh_poskey(x, y, mod) int *x, *y, *mod; { mar_update_value(); return(mar_nh_poskey(x, y, mod)); } void Gem_delay_output() { Event_Timer(50,0,FALSE); /* wait 50ms */ } 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); } /************************* print_glyph *******************************/ int mar_set_rogue(int); int mar_set_tile_mode(tiles) int tiles; { 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 prev=z_w->curr; window_reinit(z_w,md,md,NULL,FALSE,FALSE); } return(FAIL); } int mar_set_rogue(what) int what; { static int rogue=FALSE, prev_mode=TRUE; if(what<0) return(rogue); if(what!=rogue){ rogue=what; if(rogue){ prev_mode=mar_set_tile_mode(FAIL); mar_set_tile_mode(FALSE); }else mar_set_tile_mode(prev_mode); } return(FAIL); } void mar_add_pet_sign(window,x,y) winid window; int x, y; { if(window != WIN_ERR && window==WIN_MAP){ static int pla[8]={0,0,7,7,0,0,0,0}, colindex[2]={RED,WHITE}; pla[4]=pla[6]=scroll_map.px_hline*x; pla[5]=pla[7]=scroll_map.px_vline*y; pla[6]+=7; pla[7]+=6; vrt_cpyfm(x_handle,MD_TRANS,pla,&Pet_Mark,&Map_bild,colindex); } } void mar_print_glyph(window, x, y, gl) 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; { if(window != WIN_ERR && window==WIN_MAP){ static int gem_color[16]={ 9, 2,11,10, 4, 7, 8, 15,0,14, 3, 6, 5, 13,15, 0}; int pla[8], colindex[2]; map_glyphs[y][x]=ch; 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); } } /************************* getlin *******************************/ void Gem_getlin(ques, input) const char *ques; char *input; { OBJECT *z_ob=zz_oblist[LINEGET]; int d_exit, length; char *pr[2], *tmp; if(WIN_MESSAGE != WIN_ERR && Gem_nhwindow[WIN_MESSAGE].gw_window) mar_display_nhwindow(WIN_MESSAGE); 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){ tmp--; } if(tmp<=ques) tmp=ques+length; /* Mar -- Oops, what a word :-) */ pr[0]=ques; *tmp=0; pr[1]=++tmp; }else{ pr[0]=ques; pr[1]=NULL; } ub_prompt.ub_parm=(long)pr; ob_clear_edit(z_ob); d_exit=xdialog(z_ob, nullstr, NULL, NULL, mar_ob_mapcenter(z_ob), FALSE, DIALOG_MODE); Event_Timer(0,0,TRUE); if(d_exit==W_CLOSED || d_exit==W_ABANDON || (d_exit&NO_CLICK)==QLG){ *input='\033'; input[1]=0; }else strncpy(input,ob_get_text(z_ob,LGREPLY, 0),length); } /************************* ask_direction *******************************/ #define Dia_Init K_Init int Dia_Handler(xev) XEVENT *xev; { int ev=xev->ev_mwich; char ch=(char)(xev->ev_mkreturn&0x00FF); if(ev&MU_KEYBD){ WIN *w; DIAINFO *dinf; switch(ch){ case 's': send_key((int)(mar_iflags_numpad() ? '5' : '.')); break; case '.': send_key('5'); /* MAR -- '.' is a button if numpad isn't set */ break; case '\033': /*ESC*/ if((w=get_top_window()) && (dinf=(DIAINFO *)w->dialog) && dinf->di_tree==zz_oblist[DIRECTION]){ my_close_dialog(dinf,FALSE); break; } /* Fall thru */ default: ev &= ~MU_KEYBD; /* let the dialog handle it */ break; } } return(ev); } int mar_ask_direction() { int d_exit; OBJECT *z_ob=zz_oblist[DIRECTION]; Event_Handler(Dia_Init,Dia_Handler); mar_set_dir_keys(); d_exit=xdialog(z_ob, nullstr, NULL, NULL, mar_ob_mapcenter(z_ob), FALSE, DIALOG_MODE); Event_Timer(0,0,TRUE); Event_Handler(NULL,NULL); if(d_exit==W_CLOSED || d_exit==W_ABANDON) return('\033'); if((d_exit&NO_CLICK)==DIRDOWN) return('>'); if((d_exit&NO_CLICK)==DIRUP) return('<'); if((d_exit&NO_CLICK)==(DIR1+8)) /* 5 or . */ return('.'); return(*ob_get_text(z_ob,d_exit&NO_CLICK,0)); } /************************* yn_function *******************************/ #define any_init M_Init static int any_handler(xev) XEVENT *xev; { int ev=xev->ev_mwich; if(ev&MU_MESAG){ int *buf=xev->ev_mmgpbuf; if(*buf==OBJC_EDITED) my_close_dialog(*(DIAINFO **)&buf[4], FALSE); else ev &= ~MU_MESAG; } return(ev); } int send_yn_esc(char ch) { static char esc_char=0; if(ch<0){ if(esc_char){ send_key((int)esc_char); return(TRUE); } return(FALSE); }else esc_char=ch; return(TRUE); } #define single_init K_Init static int single_handler(xev) XEVENT *xev; { int ev=xev->ev_mwich; if(ev&MU_KEYBD){ char ch=(char)xev->ev_mkreturn&0x00FF; WIN *w; DIAINFO *dinf; switch(ch){ case ' ': send_return(); break; case '\033': if((w=get_top_window()) && (dinf=(DIAINFO *)w->dialog) && dinf->di_tree==zz_oblist[YNCHOICE]){ if(!send_yn_esc(FAIL)) my_close_dialog(dinf,FALSE); break; } /* Fall thru */ default: ev &= ~MU_MESAG; } } return(ev); } char Gem_yn_function(query,resp, def) const char *query,*resp; char def; { OBJECT *z_ob=zz_oblist[YNCHOICE]; int d_exit, i, len; long anzahl; char *tmp; const char *ptr; if(WIN_MESSAGE != WIN_ERR && Gem_nhwindow[WIN_MESSAGE].gw_window) mar_display_nhwindow(WIN_MESSAGE); /* if query for direction the special dialog */ 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)); if(resp){ /* single inputs */ ob_hide(z_ob,SOMECHARS,FALSE); ob_hide(z_ob,ANYCHAR,TRUE); if(strchr(resp,'q')) send_yn_esc('q'); else if(strchr(resp,'n')) send_yn_esc('n'); else send_yn_esc(def); /* strictly def should be returned, but in trad. I it's 0 */ if(strchr(resp,'#')){ /* count possible */ ob_hide(z_ob,YNOK,FALSE); ob_hide(z_ob,COUNT,FALSE); }else{ /* no count */ ob_hide(z_ob,YNOK,TRUE); ob_hide(z_ob,COUNT,TRUE); } if((anzahl=(long)strchr(resp,'\033'))){ anzahl-=(long)resp; }else{ anzahl=strlen(resp); } for(i=0,ptr=resp;i<2*anzahl;i+=2,ptr++){ ob_hide(z_ob,YN1+i,FALSE); mar_change_button_char(z_ob,YN1+i,*ptr); ob_undoflag(z_ob,YN1+i,DEFAULT); if(*ptr==def) ob_doflag(z_ob,YN1+i,DEFAULT); } 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); } Event_Handler(single_init,single_handler); }else{ /* any input */ ob_hide(z_ob,SOMECHARS,TRUE); 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); } d_exit=xdialog(z_ob, nullstr, NULL, NULL, mar_ob_mapcenter(z_ob), FALSE, DIALOG_MODE); Event_Timer(0,0,TRUE); Event_Handler(NULL,NULL); /* display of count is missing (through the core too) */ free(ob_get_text(z_ob,YNPROMPT,0)); ob_set_text(z_ob,YNPROMPT,tmp); if(resp && (d_exit==W_CLOSED || d_exit==W_ABANDON)) return('\033'); if((d_exit&NO_CLICK)==YNOK){ yn_number=atol(ob_get_text(z_ob,COUNT,0)); return('#'); } if(!resp) return(*ob_get_text(z_ob,CHOSENCH,0)); return(*ob_get_text(z_ob,d_exit&NO_CLICK,0)); } /* * Allocate a copy of the given string. If null, return a string of * zero length. * * This is an exact duplicate of copy_of() in X11/winmenu.c. */ static char * mar_copy_of(s) const char *s; { if (!s) s = nullstr; return strcpy((char *) m_alloc((unsigned) (strlen(s) + 1)), s); } const char *strRP="raw_print", *strRPB="raw_print_bold"; void mar_raw_print(str) const char *str; { xalert(1,FAIL,X_ICN_INFO,NULL,APPL_MODAL,BUTTONS_CENTERED,TRUE,strRP,str,NULL); } void mar_raw_print_bold(str) const char *str; { char buf[BUFSZ]; sprintf(buf,"!%s",str); xalert(1,FAIL,X_ICN_INFO,NULL,APPL_MODAL,BUTTONS_CENTERED,TRUE,strRPB,buf,NULL); } /*wingem1.c*/ slashem-0.0.7E7F3/win/gem/gr_rect.c0000664000076400007640000001134310545462317015014 0ustar aliali/* 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); } slashem-0.0.7E7F3/win/X11/0000775000076400007640000000000010545462317013022 5ustar alialislashem-0.0.7E7F3/win/X11/tile2x11.c0000664000076400007640000001602610545462317014544 0ustar aliali/* * Convert the given input files into an output file that is expected * by nethack. * * Assumptions: * + Two dimensional byte arrays are in row order and are not padded * between rows (x11_colormap[][]). */ #include "hack.h" /* for MAX_GLYPH */ #include "tile.h" #include "tile2x11.h" /* x11 output file header structure */ #define OUTNAME "x11tiles" /* Default output file name */ /* #define PRINT_COLORMAP */ /* define to print the colormap */ x11_header header; unsigned char *tile_bytes = NULL; unsigned char *curr_tb = NULL; unsigned char x11_colormap[MAXCOLORMAPSIZE][3]; /* Look up the given pixel and return its colormap index. */ static unsigned char pix_to_colormap(pix) pixel pix; { int i; for (i = 0; i < header.ncolors; i++) { if (pix.r == x11_colormap[i][CM_RED] && pix.g == x11_colormap[i][CM_GREEN] && pix.b == x11_colormap[i][CM_BLUE]) break; } if (i == header.ncolors) { Fprintf(stderr, "can't find color: [%u,%u,%u]\n", pix.r, pix.g, pix.b); exit(1); } return (unsigned char) (i & 0xFF); } /* 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; pixel tile[MAX_TILE_Y][MAX_TILE_X]; int x, y; 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; } /* Merge the current text colormap (ColorMap) with ours (x11_colormap). */ static void merge_text_colormap() { int i, j; for (i = 0; i < colorsinmap; i++) { for (j = 0; j < header.ncolors; j++) if (x11_colormap[j][CM_RED] == ColorMap[CM_RED][i] && x11_colormap[j][CM_GREEN] == ColorMap[CM_GREEN][i] && x11_colormap[j][CM_BLUE] == ColorMap[CM_BLUE][i]) break; if (j >= MAXCOLORMAPSIZE) { Fprintf(stderr, "colormap overflow\n"); exit(1); } if (j == header.ncolors) { /* couldn't find it */ #ifdef PRINT_COLORMAP printf("color %2d: %3d %3d %3d\n", header.ncolors, ColorMap[CM_RED][i], ColorMap[CM_GREEN][i], ColorMap[CM_BLUE][i]); #endif x11_colormap[j][CM_RED] = ColorMap[CM_RED][i]; x11_colormap[j][CM_GREEN] = ColorMap[CM_GREEN][i]; x11_colormap[j][CM_BLUE] = ColorMap[CM_BLUE][i]; header.ncolors++; } } } /* Open the given file, read & merge the colormap, convert the tiles. */ static void process_file(fname) char *fname; { unsigned long count; if (!fopen_text_file(fname, RDTMODE)) { Fprintf(stderr, "can't open file \"%s\"\n", fname); exit(1); } if (!tile_bytes) { /* * Delayed until we open the first input file so that * we know the size of the tiles we are processing. */ tile_bytes = malloc(tile_x*tile_y*MAX_GLYPH); if (!tile_bytes) { Fprintf(stderr, "Not enough memory.\n"); exit(1); } curr_tb = tile_bytes; } merge_text_colormap(); count = convert_tiles(&curr_tb); Fprintf(stderr, "%s: %lu tiles\n", fname, count); header.ntiles += count; fclose_text_file(); } #ifdef USE_XPM static int xpm_write(fp) FILE *fp; { int i,j,x,y; char c[3]="?"; unsigned char *bytes; if (header.ncolors > 4096) { Fprintf(stderr, "Sorry, only configured for up to 4096 colors\n"); exit(1); /* All you need to do is add more char per color - below */ } /* Fill unused entries with "checkerboard" pattern */ for(i = TILES_PER_COL * TILES_PER_ROW - header.ntiles; i > 0; i--) for (y = 0; y < tile_y; y++) for (x = 0; x < tile_x; x+=2) { *curr_tb++ = 0; *curr_tb++ = 1; } Fprintf(fp, "/* XPM */\n"); Fprintf(fp, "static char* nhtiles[] = {\n"); Fprintf(fp, "\"%lu %lu %lu %d\",\n", header.tile_width*TILES_PER_ROW, header.tile_height*TILES_PER_COL, header.ncolors, header.ncolors > 64 ? 2 : 1 /* char per color */); for (i = 0; i < header.ncolors; i++) { if (header.ncolors > 64) { /* two chars per color */ c[0] = i / 64 + '0'; c[1] = i % 64 + '0'; } else c[0] = i + '0'; /* just one char per color */ Fprintf(fp, "\"%s c #%02x%02x%02x\",\n", c, x11_colormap[i][0], x11_colormap[i][1], x11_colormap[i][2]); } for (j = 0; j < TILES_PER_COL; j++) for (y = 0; y < header.tile_height; y++) { bytes=tile_bytes+(j*TILES_PER_ROW*header.tile_height+y)* header.tile_width; Fprintf(fp, "\""); for (i = 0; i < TILES_PER_ROW; i++) { for (x = 0; x < header.tile_width; x++) { if (header.ncolors > 64) { /* two chars per color */ c[0] = bytes[x] / 64 + '0'; c[1] = bytes[x] % 64 + '0'; } else c[0] = bytes[x] + '0'; /* just one char per color */ fputs(c, fp); } bytes+=header.tile_height*header.tile_width; } Fprintf(fp, "\",\n"); } return fprintf(fp, "};\n")>=0; } #endif /* USE_XPM */ /* * ALI * * Architecture independent tile file so that x11tiles can always be * stored in FILE_AREA_SHARE, thus simplifying the configuration. */ static boolean fwrite_tile_header_item(item, fp) long item; FILE *fp; { putc((item>>24)&0xff,fp); putc((item>>16)&0xff,fp); putc((item>>8)&0xff,fp); putc(item&0xff,fp); return !ferror(fp); } static boolean fwrite_tile_header(header, fp) x11_header *header; FILE *fp; { return fwrite_tile_header_item(header->version,fp) && fwrite_tile_header_item(header->ncolors,fp) && fwrite_tile_header_item(header->tile_width,fp) && fwrite_tile_header_item(header->tile_height,fp) && fwrite_tile_header_item(header->ntiles,fp) && fwrite_tile_header_item(header->per_row,fp); } int main(argc, argv) int argc; char **argv; { FILE *fp; int i, argn = 1; char *outname = OUTNAME; header.version = 2; /* version 1 had no per_row field */ header.ncolors = 0; header.ntiles = 0; /* updated as we read in files */ header.per_row = 1; while (argn < argc) { if (argn + 1 < argc && !strcmp(argv[argn], "-o")) { outname = argv[argn + 1]; argn += 2; } else break; } if (argn == argc) { Fprintf(stderr, "usage: %s [-o out_file] txt_file1 [txt_file2 ...]\n", argv[0]); exit(1); } fp = fopen(outname, "w"); if (!fp) { perror(outname); exit(1); } for (i = argn; i < argc; i++) process_file(argv[i]); Fprintf(stderr, "Total tiles: %ld\n", header.ntiles); header.tile_width = tile_x; header.tile_height = tile_y; #ifdef USE_XPM if (xpm_write(fp) == 0) { Fprintf(stderr, "can't write XPM file\n"); exit(1); } #else if (fwrite_tile_header(&header, fp) == 0) { Fprintf(stderr, "can't write output header\n"); exit(1); } if (fwrite((char *)x11_colormap, 1, header.ncolors*3, fp) == 0) { Fprintf(stderr, "can't write output colormap\n"); exit(1); } if (fwrite((char *)tile_bytes, 1, (int) header.ntiles*header.tile_width*header.tile_height, fp) == 0) { Fprintf(stderr, "can't write tile bytes\n"); exit(1); } #endif fclose(fp); free(tile_bytes); return 0; } slashem-0.0.7E7F3/win/X11/winval.c0000664000076400007640000000736210545462317014476 0ustar aliali/* SCCS Id: @(#)winval.c 3.4 1992/3/7 */ /* Copyright (c) Dean Luick, 1992 */ /* NetHack may be freely redistributed. See license for details. */ /* * Routines that define a name-value label widget pair that fit inside a * form widget. */ #include #ifndef SYSV #define PRESERVE_NO_SYSV /* X11 include files may define SYSV */ #endif #include #include #include #include #include #ifdef PRESERVE_NO_SYSV # ifdef SYSV # undef SYSV # endif # undef PRESERVE_NO_SYSV #endif #include "hack.h" /* #define for const for non __STDC__ compilers */ #include "winX.h" #define WNAME "name" #define WVALUE "value" Widget create_value(parent, name_value) Widget parent; const char *name_value; { Widget form, name; Arg args[8]; Cardinal num_args; num_args = 0; XtSetArg(args[num_args], XtNborderWidth, 0); num_args++; XtSetArg(args[num_args], XtNdefaultDistance, 0); num_args++; form = XtCreateManagedWidget(name_value, formWidgetClass, parent, args, num_args); num_args = 0; XtSetArg(args[num_args], XtNjustify, XtJustifyRight); num_args++; XtSetArg(args[num_args], XtNborderWidth, 0); num_args++; XtSetArg(args[num_args], XtNlabel, name_value); num_args++; XtSetArg(args[num_args], XtNinternalHeight, 0); num_args++; name = XtCreateManagedWidget(WNAME, labelWidgetClass, form, args, num_args); num_args = 0; XtSetArg(args[num_args], XtNjustify, XtJustifyRight); num_args++; XtSetArg(args[num_args], XtNborderWidth, 0); num_args++; XtSetArg(args[num_args], XtNfromHoriz, name); num_args++; XtSetArg(args[num_args], XtNinternalHeight, 0); num_args++; (void) XtCreateManagedWidget(WVALUE, labelWidgetClass, form, args, num_args); return form; } void set_name(w, new_label) Widget w; char *new_label; { Arg args[1]; Widget name; name = XtNameToWidget(w, WNAME); XtSetArg(args[0], XtNlabel, new_label); XtSetValues(name, args, ONE); } void set_name_width(w, new_width) Widget w; int new_width; { Arg args[1]; Widget name; name = XtNameToWidget(w, WNAME); XtSetArg(args[0], XtNwidth, new_width); XtSetValues(name, args, ONE); } int get_name_width(w) Widget w; { Arg args[1]; Dimension width; Widget name; name = XtNameToWidget(w, WNAME); XtSetArg(args[0], XtNwidth, &width); XtGetValues(name, args, ONE); return (int) width; } void set_value(w, new_value) Widget w; const char *new_value; { Arg args[1]; Widget val; val = XtNameToWidget(w, WVALUE); XtSetArg(args[0], XtNlabel, new_value); XtSetValues(val, args, ONE); } void set_value_width(w, new_width) Widget w; int new_width; { Arg args[1]; Widget val; val = XtNameToWidget(w, WVALUE); XtSetArg(args[0], XtNwidth, new_width); XtSetValues(val, args, ONE); } int get_value_width(w) Widget w; { Arg args[1]; Widget val; Dimension width; val = XtNameToWidget(w, WVALUE); XtSetArg(args[0], XtNwidth, &width); XtGetValues(val, args, ONE); return (int) width; } /* Swap foreground and background colors (this is the best I can do with */ /* a label widget, unless I can get some init hook in there). */ void hilight_value(w) Widget w; { swap_fg_bg(XtNameToWidget(w, WVALUE)); } /* Swap the foreground and background colors of the given widget */ void swap_fg_bg(w) Widget w; { Arg args[2]; Pixel fg, bg; XtSetArg(args[0], XtNforeground, &fg); XtSetArg(args[1], XtNbackground, &bg); XtGetValues(w, args, TWO); XtSetArg(args[0], XtNforeground, bg); XtSetArg(args[1], XtNbackground, fg); XtSetValues(w, args, TWO); } slashem-0.0.7E7F3/win/X11/winmap.c0000664000076400007640000014452010545462317014467 0ustar aliali/* SCCS Id: @(#)winmap.c 3.4 1996/04/05 */ /* Copyright (c) Dean Luick, 1992 */ /* NetHack may be freely redistributed. See license for details. */ /* * This file contains: * + global functions print_glyph() and cliparound() * + the map window routines * + the char and pointer input routines * * Notes: * + We don't really have a good way to get the compiled ROWNO and * COLNO as defaults. They are hardwired to the current "correct" * values in the Window widget. I am _not_ in favor of including * some nethack include file for Window.c. */ #ifndef SYSV #define PRESERVE_NO_SYSV /* X11 include files may define SYSV */ #endif #include #include #include #include #include #include #include #ifdef PRESERVE_NO_SYSV # ifdef SYSV # undef SYSV # endif # undef PRESERVE_NO_SYSV #endif #include "xwindow.h" /* map widget declarations */ #include "hack.h" #include "dlb.h" #include "winX.h" #ifdef SHORT_FILENAMES #include "patchlev.h" #else #include "patchlevel.h" #endif #ifdef USE_XPM #include #endif /* from tile.c */ extern short glyph2tile[]; extern int total_tiles_used; extern int tiles_per_row; extern int tiles_per_col; /* Define these if you really want a lot of junk on your screen. */ /* #define VERBOSE */ /* print various info & events as they happen */ /* #define VERBOSE_UPDATE */ /* print screen update bounds */ /* #define VERBOSE_INPUT */ /* print input events */ #define USE_WHITE /* almost always use white as a tile cursor border */ static boolean FDECL(init_tiles, (struct xwindow *)); static void FDECL(set_button_values, (Widget,int,int,unsigned)); static void FDECL(map_check_size_change, (struct xwindow *)); static void FDECL(map_update, (struct xwindow *,int,int,int,int,BOOLEAN_P)); static void FDECL(init_text, (struct xwindow *)); static void FDECL(map_exposed, (Widget,XtPointer,XtPointer)); static void FDECL(set_gc, (Widget,Font,char *,Pixel,GC *,GC *)); static void FDECL(get_text_gc, (struct xwindow *,Font)); static void FDECL(get_char_info, (struct xwindow *)); static void FDECL(display_cursor, (struct xwindow *)); /* Global functions ======================================================== */ void X11_print_glyph(window, x, y, glyph) winid window; xchar x, y; int glyph; { struct map_info_t *map_info; boolean update_bbox; check_winid(window); if (window_list[window].type != NHW_MAP) { impossible("print_glyph: can (currently) only print to map windows"); return; } map_info = window_list[window].map_information; if (map_info->is_tile) { unsigned short *t_ptr; t_ptr = &map_info->mtype.tile_map->glyphs[y][x]; if (*t_ptr != glyph) { *t_ptr = glyph; update_bbox = TRUE; } else update_bbox = FALSE; } 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]; #ifdef TEXTCOLOR co_ptr = &map_info->mtype.text_map->colors[y][x]; if (*ch_ptr != ch || *co_ptr != color) #else if (*ch_ptr != ch) #endif { *ch_ptr = ch; #ifdef TEXTCOLOR *co_ptr = color; #endif update_bbox = TRUE; } else update_bbox = FALSE; } if (update_bbox) { /* update row bbox */ if ((uchar) x < map_info->t_start[y]) map_info->t_start[y] = x; if ((uchar) x > map_info->t_stop[y]) map_info->t_stop[y] = x; } } #ifdef CLIPPING /* * The is the tty clip call. Since X can resize at any time, we can't depend * on this being defined. */ /*ARGSUSED*/ void X11_cliparound(x, y) int x, y; { } #endif /* CLIPPING */ /* End global functions ==================================================== */ #include "tile2x11.h" /* * We're expecting to never read more than one tile file per session. * If this is false, then we can make an array of this information, * or just keep it on a per-window basis. */ Pixmap tile_pixmap = None; static int tile_width; static int tile_height; static int tile_count; static XImage *tile_image = 0; static int tile_index = -1; /* * This structure is used for small bitmaps that are used for annotating * tiles. For example, a "heart" annotates pets. */ struct tile_annotation { Pixmap bitmap; Pixel foreground; unsigned int width, height; int hotx, hoty; /* not currently used */ }; static struct tile_annotation pet_annotation; static void init_annotation(annotation, filename, colorpixel) struct tile_annotation *annotation; char *filename; Pixel colorpixel; { Display *dpy = XtDisplay(toplevel); if (0!=XReadBitmapFile(dpy, XtWindow(toplevel), filename, &annotation->width, &annotation->height, &annotation->bitmap, &annotation->hotx, &annotation->hoty)) { char buf[BUFSZ]; Sprintf(buf, "Failed to load %s", filename); X11_raw_print(buf); } annotation->foreground = colorpixel; } /* * Put the tile image on the server. * * We can't send the image to the server until the top level * is realized. When the tile file is first processed, the top * level is not realized. This routine is called after we * realize the top level, but before we start resizing the * map viewport. */ void post_process_tiles() { Display *dpy = XtDisplay(toplevel); unsigned int width, height; char *pet_mark_file; if (tile_image == 0) return; /* no tiles */ height = tile_height * tiles_per_col; width = tile_width * tiles_per_row; tile_pixmap = XCreatePixmap(dpy, XtWindow(toplevel), width, height, DefaultDepth(dpy, DefaultScreen(dpy))); if (!tile_pixmap) impossible("post_process_tiles: insufficient memory to create pixmap"); XPutImage(dpy, tile_pixmap, DefaultGC(dpy, DefaultScreen(dpy)), tile_image, 0,0, 0,0, /* src, dest top left */ width, height); XDestroyImage(tile_image); /* data bytes free'd also */ tile_image = 0; #ifndef FILE_AREAS pet_mark_file = appResources.pet_mark_bitmap; #else pet_mark_file = make_file_name(FILE_AREA_SHARE, appResources.pet_mark_bitmap); #endif init_annotation(&pet_annotation, pet_mark_file, appResources.pet_mark_color); #ifdef FILE_AREAS free(pet_mark_file); #endif } #ifndef USE_XPM /* * ALI * * Architecture independent tile file so that x11tiles can always be * stored in FILE_AREA_SHARE, thus simplifying the configuration. */ static boolean fread_tile_header_item(item, fp) long *item; FILE *fp; { *item = (long)getc(fp)<<24; *item |= (long)getc(fp)<<16; *item |= (long)getc(fp)<<8; *item |= (long)getc(fp); #ifdef VERBOSE fprintf(stderr, "fread_tile_header_item: 0x%lX\n",*item); #endif return !feof(fp) && !ferror(fp); } static boolean fread_tile_header(header, fp) x11_header *header; FILE *fp; { int retval; retval = fread_tile_header_item(&header->version,fp) && fread_tile_header_item(&header->ncolors,fp) && fread_tile_header_item(&header->tile_width,fp) && fread_tile_header_item(&header->tile_height,fp) && fread_tile_header_item(&header->ntiles,fp); if (retval) { if (header->version == 1) header->per_row = 1; else retval = fread_tile_header_item(&header->per_row,fp); } return retval; } #endif /* * Open and read the tile file. Return TRUE if there were no problems. * Return FALSE otherwise. */ static boolean init_tiles(wp) struct xwindow *wp; { #ifdef USE_XPM XpmAttributes attributes; int errorcode; char *tile_file; #else FILE *fp = (FILE *)0; x11_header header; unsigned char *cp, *colormap = (unsigned char *)0; unsigned char *tb, *tile_bytes = (unsigned char *)0; int size; 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; /* already have tile information */ if (tile_pixmap != None) { XFreePixmap(dpy, tile_pixmap); tile_pixmap = None; } map_info = wp->map_information; if (map_info->mtype.text_map) { free(map_info->mtype.text_map); map_info->mtype.text_map = 0; } if (!map_info->mtype.tile_map) map_info->mtype.tile_map = (struct tile_map_info_t *) alloc(sizeof(struct tile_map_info_t)); tile_info = map_info->mtype.tile_map; (void) memset((genericptr_t) tile_info, 0, sizeof(struct tile_map_info_t)); #ifdef USE_XPM attributes.valuemask = XpmCloseness; attributes.closeness = 25000; #ifndef FILE_AREAS tile_file = tilesets[tile_index].file; #else tile_file = make_file_name(FILE_AREA_SHARE, tilesets[tile_index].file); #endif errorcode = XpmReadFileToImage(dpy, tile_file, &tile_image, 0, &attributes); if (errorcode == XpmColorFailed) { Sprintf(buf, "Insufficient colors available to load %s.", tilesets[tile_index].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, tile_file, &tile_image, 0, &attributes); } #ifdef FILE_AREAS free(tile_file); #endif if (errorcode!=XpmSuccess) { if (errorcode == XpmColorFailed) { Sprintf(buf, "Insufficient colors available to load %s.", tilesets[tile_index].file); X11_raw_print(buf); } else { Sprintf(buf, "Failed to load %s: %s",tilesets[tile_index].file, XpmGetErrorString(errorcode)); X11_raw_print(buf); } result = FALSE; X11_raw_print("Switching to text-based mode."); goto tiledone; } if (tile_image->height % tiles_per_col != 0 || tile_image->height <= tiles_per_col || tile_image->width % tiles_per_row != 0 || tile_image->width <= tiles_per_row) { char buf[BUFSIZ]; Sprintf(buf, "%s appears to have a non-integer tile size.\n" "Its size (%dx%d) should be a multiple of %dx%d", tilesets[tile_index].file, tile_image->width, tile_image->height, tiles_per_row, tiles_per_col); 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 / tiles_per_row; tile_height = tile_image->height / tiles_per_col; #else /* any less than 16 colours makes tiles useless */ ddepth = DefaultDepthOfScreen(screen); if (ddepth < 4) { X11_raw_print("need a screen depth of at least 4"); result = FALSE; goto tiledone; } fp = fopen_datafile_area(FILE_AREA_SHARE, tilesets[tile_index].file, RDBMODE, FALSE); if (!fp) { X11_raw_print("can't open tile file"); perror(tilesets[tile_index].file); result = FALSE; goto tiledone; } if (!fread_tile_header(&header, fp)) { X11_raw_print("read of header failed"); result = FALSE; goto tiledone; } if (header.version != 1 && header.version != 2) { Sprintf(buf, "Wrong tile file version, expected 1 or 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 size = 3*header.ncolors; colormap = (unsigned char *) alloc((unsigned)size); if (fread((char *) colormap, 1, size, fp) != size) { X11_raw_print("read of colormap failed"); result = FALSE; goto tiledone; } /* defined in decl.h - these are _not_ good defines to have */ #undef red #undef green #undef blue colors = (XColor *) alloc(sizeof(XColor) * (unsigned)header.ncolors); for (i = 0; i < header.ncolors; i++) { cp = colormap + (3 * i); colors[i].red = cp[0] * 256; colors[i].green = cp[1] * 256; colors[i].blue = cp[2] * 256; colors[i].flags = 0; colors[i].pixel = 0; 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; } } size = header.tile_height * header.tile_width; /* * 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; goto tiledone; } if (header.ntiles < total_tiles_used) { Sprintf(buf, "tile file incomplete, expecting %d tiles, found %lu", total_tiles_used, header.ntiles); X11_raw_print(buf); result = FALSE; goto tiledone; } if (appResources.double_tile_size) { tile_width = 2*header.tile_width; tile_height = 2*header.tile_height; } else { tile_width = header.tile_width; tile_height = header.tile_height; } /* * Arrange the tiles in the image (and subsequently on the pixmap) * so that we avoid dimensions larger than 32767 which trigger a * bug in XPutImage (at least on Solaris 2.5.1). */ image_width = tile_width * tiles_per_row; image_height = tile_height * tiles_per_col; /* calculate bitmap_pad */ if (ddepth > 16) bitmap_pad = 32; else if (ddepth > 8) bitmap_pad = 16; else bitmap_pad = 8; tile_image = XCreateImage(dpy, DefaultVisualOfScreen(screen), ddepth, /* depth */ ZPixmap, /* format */ 0, /* offset */ 0, /* data */ image_width, /* width */ image_height, /* height */ bitmap_pad, /* bit pad */ 0); /* bytes_per_line */ if (!tile_image) impossible("init_tiles: insufficient memory to create image"); /* now we know the physical memory requirements, we can allocate space */ tile_image->data = (char *) alloc((unsigned)tile_image->bytes_per_line * image_height); if (appResources.double_tile_size) { unsigned long pixel; for (i = 0; i < tile_count; i++) { /* point at the upper-left corner of the next tile */ y = i / header.per_row; x = i - y * header.per_row; tb = tile_bytes + header.tile_width * (x + y * header.tile_height * header.per_row); for (y = 0; y < header.tile_height; y++) { for (x = 0; x < header.tile_width; x++) { pixel = colors[tb[x]].pixel; XPutPixel(tile_image, (i % tiles_per_row) * tile_width + 2*x, (i / tiles_per_row) * tile_height + 2*y, pixel); XPutPixel(tile_image, (i % tiles_per_row) * tile_width + 2*x, (i / tiles_per_row) * tile_height + 2*y+1, pixel); XPutPixel(tile_image, (i % tiles_per_row) * tile_width + 2*x+1, (i / tiles_per_row) * tile_height + 2*y, pixel); XPutPixel(tile_image, (i % tiles_per_row) * tile_width + 2*x+1, (i / tiles_per_row) * tile_height + 2*y+1, pixel); } tb += header.tile_width * header.per_row; } } } else { for (i = 0; i < tile_count; i++) { /* point at the upper-left corner of the next tile */ y = i / header.per_row; x = i - y * header.per_row; tb = tile_bytes + header.tile_width * (x + y * header.tile_height * header.per_row); for (y = 0; y < header.tile_height; y++) { for (x = 0; x < header.tile_width; x++) XPutPixel(tile_image, (i % tiles_per_row) * tile_width + x, (i / tiles_per_row) * tile_height + y, colors[tb[x]].pixel); tb += header.tile_width * header.per_row; } } } #endif /* USE_XPM */ /* fake an inverted tile by drawing a border around the edges */ #ifdef USE_WHITE /* use white or black as the border */ mask = GCFunction | GCForeground | GCGraphicsExposures; values.graphics_exposures = False; values.foreground = WhitePixelOfScreen(screen); values.function = GXcopy; tile_info->white_gc = XtGetGC(wp->w, mask, &values); values.graphics_exposures = False; values.foreground = BlackPixelOfScreen(screen); values.function = GXcopy; tile_info->black_gc = XtGetGC(wp->w, mask, &values); #else /* * Use xor so we don't have to check for special colors. Xor white * against the upper left pixel of the corridor so that we have a * white rectangle when in a corridor. */ mask = GCFunction | GCForeground | GCGraphicsExposures; values.graphics_exposures = False; values.foreground = WhitePixelOfScreen(screen) ^ XGetPixel(tile_image, 0, tile_height*glyph2tile[cmap_to_glyph(S_corr)]); values.function = GXxor; tile_info->white_gc = XtGetGC(wp->w, mask, &values); mask = GCFunction | GCGraphicsExposures; values.function = GXCopy; values.graphics_exposures = False; tile_info->black_gc = XtGetGC(wp->w, mask, &values); #endif /* USE_WHITE */ tiledone: #ifndef USE_XPM if (fp) (void) fclose(fp); if (colormap) free((genericptr_t)colormap); if (tile_bytes) free((genericptr_t)tile_bytes); if (colors) free((genericptr_t)colors); #endif if (result) { /* succeeded */ map_info->square_height = tile_height; map_info->square_width = tile_width; map_info->square_ascent = 0; map_info->square_lbearing = 0; } else { if (tile_info) free((genericptr_t)tile_info); map_info->mtype.tile_map = 0; } return result; } /* * Make sure the map's cursor is always visible. */ void check_cursor_visibility(wp) struct xwindow *wp; { Arg arg[2]; Widget viewport, horiz_sb, vert_sb; float top, shown, cursor_middle; Boolean do_call, adjusted = False; #ifdef VERBOSE char *s; #endif viewport = XtParent(wp->w); horiz_sb = XtNameToWidget(viewport, "horizontal"); vert_sb = XtNameToWidget(viewport, "vertical"); /* All values are relative to currently visible area */ #define V_BORDER 0.3 /* if this far from vert edge, shift */ #define H_BORDER 0.3 /* if this from from horiz edge, shift */ #define H_DELTA 0.4 /* distance of horiz shift */ #define V_DELTA 0.4 /* distance of vert shift */ if (horiz_sb) { XtSetArg(arg[0], XtNshown, &shown); 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 if (cursor_middle < top) { s = " outside left"; } else if (cursor_middle < top + shown*H_BORDER) { s = " close to left"; } else if (cursor_middle > (top + shown)) { s = " outside right"; } else if (cursor_middle > (top + shown - shown*H_BORDER)) { s = " close to right"; } else { s = ""; } printf("Horiz: shown = %3.2f, top = %3.2f%s", shown, top, s); #endif if (cursor_middle < top) { top = cursor_middle - shown*H_DELTA; if (top < 0.0) top = 0.0; } else if (cursor_middle < top + shown*H_BORDER) { top -= shown*H_DELTA; if (top < 0.0) top = 0.0; } else if (cursor_middle > (top + shown)) { top = cursor_middle - shown*H_DELTA; if (top < 0.0) top = 0.0; if (top + shown > 1.0) top = 1.0 - shown; } else if (cursor_middle > (top + shown - shown*H_BORDER)) { top += shown*H_DELTA; if (top + shown > 1.0) top = 1.0 - shown; } else { do_call = False; } if (do_call) { XtCallCallbacks(horiz_sb, XtNjumpProc, &top); adjusted = True; } } if (vert_sb) { XtSetArg(arg[0], XtNshown, &shown); 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 if (cursor_middle < top) { s = " above top"; } else if (cursor_middle < top + shown*V_BORDER) { s = " close to top"; } else if (cursor_middle > (top + shown)) { s = " below bottom"; } else if (cursor_middle > (top + shown - shown*V_BORDER)) { s = " close to bottom"; } else { s = ""; } printf("%sVert: shown = %3.2f, top = %3.2f%s", horiz_sb ? "; " : "", shown, top, s); #endif if (cursor_middle < top) { top = cursor_middle - shown*V_DELTA; if (top < 0.0) top = 0.0; } else if (cursor_middle < top + shown*V_BORDER) { top -= shown*V_DELTA; if (top < 0.0) top = 0.0; } else if (cursor_middle > (top + shown)) { top = cursor_middle - shown*V_DELTA; if (top < 0.0) top = 0.0; if (top + shown > 1.0) top = 1.0 - shown; } else if (cursor_middle > (top + shown - shown*V_BORDER)) { top += shown*V_DELTA; if (top + shown > 1.0) top = 1.0 - shown; } else { do_call = False; } if (do_call) { XtCallCallbacks(vert_sb, XtNjumpProc, &top); adjusted = True; } } /* make sure cursor is displayed during dowhatis.. */ if (adjusted) display_cursor(wp); #ifdef VERBOSE if (horiz_sb || vert_sb) printf("\n"); #endif } /* * Check to see if the viewport has grown smaller. If so, then we want to make * sure that the cursor is still on the screen. We do this to keep the cursor * on the screen when the user resizes the nethack window. */ static void map_check_size_change(wp) struct xwindow *wp; { struct map_info_t *map_info = wp->map_information; Arg arg[2]; Dimension new_width, new_height; Widget viewport; viewport = XtParent(wp->w); XtSetArg(arg[0], XtNwidth, &new_width); XtSetArg(arg[1], XtNheight, &new_height); XtGetValues(viewport, arg, TWO); /* 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); } /* * Fill in parameters "regular" and "inverse" with newly created GCs. * Using the given background pixel and the foreground pixel optained * by querying the widget with the resource name. */ static void set_gc(w, font, resource_name, bgpixel, regular, inverse) Widget w; Font font; char *resource_name; Pixel bgpixel; GC *regular, *inverse; { XGCValues values; XtGCMask mask = GCFunction | GCForeground | GCBackground | GCFont; Pixel curpixel; Arg arg[1]; XtSetArg(arg[0], resource_name, &curpixel); XtGetValues(w, arg, ONE); values.foreground = curpixel; values.background = bgpixel; values.function = GXcopy; values.font = font; *regular = XtGetGC(w, mask, &values); values.foreground = bgpixel; values.background = curpixel; values.function = GXcopy; values.font = font; *inverse = XtGetGC(w, mask, &values); } /* * Create the GC's for each color. * * I'm not sure if it is a good idea to have a GC for each color (and * inverse). It might be faster to just modify the foreground and * background colors on the current GC as needed. */ static void get_text_gc(wp, font) struct xwindow *wp; Font font; { struct map_info_t *map_info = wp->map_information; Pixel bgpixel; Arg arg[1]; /* Get background pixel. */ XtSetArg(arg[0], XtNbackground, &bgpixel); XtGetValues(wp->w, arg, ONE); #ifdef TEXTCOLOR #define set_color_gc(nh_color, resource_name) \ set_gc(wp->w, font, resource_name, bgpixel, \ &map_info->mtype.text_map->color_gcs[nh_color], \ &map_info->mtype.text_map->inv_color_gcs[nh_color]); set_color_gc(CLR_BLACK, XtNblack); set_color_gc(CLR_RED, XtNred); set_color_gc(CLR_GREEN, XtNgreen); set_color_gc(CLR_BROWN, XtNbrown); set_color_gc(CLR_BLUE, XtNblue); set_color_gc(CLR_MAGENTA, XtNmagenta); set_color_gc(CLR_CYAN, XtNcyan); set_color_gc(CLR_GRAY, XtNgray); set_color_gc(NO_COLOR, XtNforeground); set_color_gc(CLR_ORANGE, XtNorange); set_color_gc(CLR_BRIGHT_GREEN, XtNbright_green); set_color_gc(CLR_YELLOW, XtNyellow); set_color_gc(CLR_BRIGHT_BLUE, XtNbright_blue); set_color_gc(CLR_BRIGHT_MAGENTA, XtNbright_magenta); set_color_gc(CLR_BRIGHT_CYAN, XtNbright_cyan); set_color_gc(CLR_WHITE, XtNwhite); #else set_gc(wp->w, font, XtNforeground, bgpixel, &map_info->mtype.text_map->copy_gc, &map_info->mtype.text_map->inv_copy_gc); #endif } /* * Display the cursor on the map window. */ static void display_cursor(wp) struct xwindow *wp; { /* Redisplay the cursor location inverted. */ map_update(wp, wp->cursy, wp->cursy, wp->cursx, wp->cursx, TRUE); } /* * Check if there are any changed characters. If so, then plaster them on * the screen. */ void display_map_window(wp) struct xwindow *wp; { register int row; struct map_info_t *map_info = wp->map_information; /* * If the previous cursor position is not the same as the current * cursor position, then update the old cursor position. */ if (wp->prevx != wp->cursx || wp->prevy != wp->cursy) { register unsigned int x = wp->prevx, y = wp->prevy; if (x < map_info->t_start[y]) map_info->t_start[y] = x; if (x > map_info->t_stop[y]) map_info->t_stop[y] = x; } for (row = 0; row < ROWNO; row++) { if (map_info->t_start[row] <= map_info->t_stop[row]) { map_update(wp, row, row, (int) map_info->t_start[row], (int) map_info->t_stop[row], FALSE); map_info->t_start[row] = COLNO-1; map_info->t_stop[row] = 0; } } display_cursor(wp); wp->prevx = wp->cursx; /* adjust old cursor position */ wp->prevy = wp->cursy; } /* * Set all map tiles to S_stone */ static void map_all_stone(map_info) struct map_info_t *map_info; { int i; unsigned short *sp, stone; stone = cmap_to_glyph(S_stone); for (sp = (unsigned short *) map_info->mtype.tile_map->glyphs, i = 0; i < ROWNO*COLNO; sp++, i++) *sp = stone; } /* * Fill the saved screen characters with the "clear" tile or character. * * Flush out everything by resetting the "new" bounds and calling * display_map_window(). */ void clear_map_window(wp) struct xwindow *wp; { struct map_info_t *map_info = wp->map_information; /* * Check if tileset has changed. * This can happen if tileset changed via doset() and doredraw() was * called. --ALI */ if (tile_index >= 0 && strcmp(tileset, tilesets[tile_index].name) || tile_index < 0 && tileset[0]) { int i; for(i = 0; i < no_tilesets; i++) if (!strcmp(tileset, tilesets[i].name)) break; if (i < no_tilesets && tilesets[i].flags & ~TILESET_TRANSPARENT) { pline("Warning: Can't use tile set \"%s\"; unsupported flag set", tilesets[i].name); i = tile_index; strcpy(tileset, tilesets[tile_index].name); } if (i == no_tilesets) tile_index = -1; else tile_index = i; if (tile_index >= 0 && init_tiles(wp)) { map_info->is_tile = TRUE; post_process_tiles(); } else { tile_index = -1; tileset[0] = '\0'; init_text(wp); map_info->is_tile = FALSE; } set_map_size(wp, COLNO, ROWNO); } if (map_info->is_tile) { map_all_stone(map_info); } else { /* Fill text with spaces, and update */ (void) memset((genericptr_t) map_info->mtype.text_map->text, ' ', sizeof(map_info->mtype.text_map->text)); #ifdef TEXTCOLOR (void) memset((genericptr_t) map_info->mtype.text_map->colors, NO_COLOR, sizeof(map_info->mtype.text_map->colors)); #endif } /* force a full update */ (void) memset((genericptr_t) map_info->t_start, (char) 0, sizeof(map_info->t_start)); (void) memset((genericptr_t) map_info->t_stop, (char) COLNO-1, sizeof(map_info->t_stop)); display_map_window(wp); } /* * Retreive the font associated with the map window and save attributes * that are used when updating it. */ static void get_char_info(wp) struct xwindow *wp; { XFontStruct *fs; struct map_info_t *map_info = wp->map_information; fs = WindowFontStruct(wp->w); map_info->square_width = fs->max_bounds.width; map_info->square_height = fs->max_bounds.ascent + fs->max_bounds.descent; map_info->square_ascent = fs->max_bounds.ascent; map_info->square_lbearing = -fs->min_bounds.lbearing; #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"); printf("min_bounds:lb=%d rb=%d width=%d asc=%d des=%d attr=%d\n", fs->min_bounds.lbearing, fs->min_bounds.rbearing, fs->min_bounds.width, fs->min_bounds.ascent, fs->min_bounds.descent, fs->min_bounds.attributes); printf("max_bounds:lb=%d rb=%d width=%d asc=%d des=%d attr=%d\n", 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 if (fs->min_bounds.width != fs->max_bounds.width) X11_raw_print("Warning: map font is not monospaced!"); } /* * keyhit buffer */ #define INBUF_SIZE 64 int inbuf[INBUF_SIZE]; int incount = 0; int inptr = 0; /* points to valid data */ /* * Keyboard and button event handler for map window. */ void map_input(w, event, params, num_params) Widget w; XEvent *event; String *params; Cardinal *num_params; { XKeyEvent *key; XButtonEvent *button; boolean meta = FALSE; int i, nbytes; Cardinal in_nparams = (num_params ? *num_params : 0); char c; char keystring[MAX_KEY_STRING]; switch (event->type) { case ButtonPress: button = (XButtonEvent *) event; #ifdef VERBOSE_INPUT printf("button press\n"); #endif if (in_nparams > 0 && (nbytes = strlen(params[0])) < MAX_KEY_STRING) { Strcpy(keystring, params[0]); key = (XKeyEvent *) event; /* just in case */ goto key_events; } if (w != window_list[WIN_MAP].w) { #ifdef VERBOSE_INPUT printf("map_input called from wrong window\n"); #endif X11_nhbell(); return; } set_button_values(w, button->x, button->y, button->button); break; case KeyPress: #ifdef VERBOSE_INPUT printf("key: "); #endif if(appResources.slow && input_func) { (*input_func)(w, event, params, num_params); break; } /* * Don't use key_event_to_char() because we want to be able * to allow keys mapped to multiple characters. */ key = (XKeyEvent *) event; if (in_nparams > 0 && (nbytes = strlen(params[0])) < MAX_KEY_STRING) { Strcpy(keystring, params[0]); } else { /* * Assume that mod1 is really the meta key. */ meta = !!(key->state & Mod1Mask); nbytes = XLookupString(key, keystring, MAX_KEY_STRING, (KeySym *)0, (XComposeStatus *)0); } key_events: /* Modifier keys return a zero length string when pressed. */ if (nbytes) { #ifdef VERBOSE_INPUT printf("\""); #endif for (i = 0; i < nbytes; i++) { c = keystring[i]; if (incount < INBUF_SIZE) { inbuf[(inptr+incount)%INBUF_SIZE] = ((int) c) + (meta ? 0x80 : 0); incount++; } else { X11_nhbell(); } #ifdef VERBOSE_INPUT if (meta) /* meta will print as M */ (void) putchar('M'); if (c < ' ') { /* ctrl will print as ^ */ (void) putchar('^'); c += '@'; } (void) putchar(c); #endif } #ifdef VERBOSE_INPUT printf("\" [%d bytes]\n", nbytes); #endif } break; default: impossible("unexpected X event, type = %d\n", (int) event->type); break; } } static void set_button_values(w, x, y, button) Widget w; int x; int y; unsigned int button; { struct xwindow *wp; struct map_info_t *map_info; wp = find_widget(w); map_info = wp->map_information; click_x = x / map_info->square_width; click_y = y / map_info->square_height; /* The values can be out of range if the map window has been resized */ /* to be larger than the max size. */ if (click_x >= COLNO) click_x = COLNO-1; if (click_y >= ROWNO) click_x = ROWNO-1; /* Map all buttons but the first to the second click */ click_button = (button == Button1) ? CLICK_1 : CLICK_2; } /* * Map window expose callback. */ /*ARGSUSED*/ static void map_exposed(w, client_data, widget_data) Widget w; XtPointer client_data; /* unused */ XtPointer widget_data; /* expose event from Window widget */ { int x, y; struct xwindow *wp; struct map_info_t *map_info; unsigned width, height; int start_row, stop_row, start_col, stop_col; XExposeEvent *event = (XExposeEvent *) widget_data; int t_height, t_width; /* tile/text height & width */ if (!XtIsRealized(w) || event->count > 0) return; wp = find_widget(w); map_info = wp->map_information; if (wp->keep_window && !map_info) return; /* * The map is sent an expose event when the viewport resizes. Make sure * that the cursor is still in the viewport after the resize. */ map_check_size_change(wp); if (event) { /* called from button-event */ x = event->x; y = event->y; width = event->width; height = event->height; } else { x = 0; y = 0; width = wp->pixel_width; height= wp->pixel_height; } /* * Convert pixels into INCLUSIVE text rows and columns. */ t_height = map_info->square_height; t_width = map_info->square_width; start_row = y / t_height; stop_row = ((y + height) / t_height) + ((((y + height) % t_height) == 0) ? 0 : 1) - 1; start_col = x / t_width; stop_col = ((x + width) / t_width) + ((((x + width) % t_width) == 0) ? 0 : 1) - 1; #ifdef VERBOSE printf("map_exposed: x = %d, y = %d, width = %d, height = %d\n", x, y, width, height); printf("chars %d x %d, rows %d to %d, columns %d to %d\n", map_info->square_height, map_info->square_width, start_row, stop_row, start_col, stop_col); #endif /* Out of range values are possible if the map window is resized to be */ /* bigger than the largest expected value. */ if (stop_row >= ROWNO) stop_row = ROWNO-1; if (stop_col >= COLNO) stop_col = COLNO-1; map_update(wp, start_row, stop_row, start_col, stop_col, FALSE); display_cursor(wp); /* make sure cursor shows up */ } /* * Do the actual work of the putting characters onto our X window. This * is called from the expose event routine, the display window (flush) * routine, and the display cursor routine. The later is a kludge that * involves the inverted parameter of this function. A better solution * would be to double the color count, with any color above CLR_MAX * being inverted. * * This works for rectangular regions (this includes one line rectangles). * The start and stop columns are *inclusive*. */ static void map_update(wp, start_row, stop_row, start_col, stop_col, inverted) struct xwindow *wp; int start_row, stop_row, start_col, stop_col; boolean inverted; { int win_start_row, win_start_col; struct map_info_t *map_info = wp->map_information; int row; register int count; if (start_row < 0 || stop_row >= ROWNO) { impossible("map_update: bad row range %d-%d\n", start_row, stop_row); return; } if (start_col < 0 || stop_col >=COLNO) { impossible("map_update: bad col range %d-%d\n", start_col, stop_col); return; } #ifdef VERBOSE_UPDATE printf("update: [0x%x] %d %d %d %d\n", (int) wp->w, start_row, stop_row, start_col, stop_col); #endif win_start_row = start_row; win_start_col = start_col; 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) * map_info->square_width; src_y = (tile / tiles_per_row) * map_info->square_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); XSetClipMask(dpy, tile_map->black_gc, pet_annotation.bitmap); XCopyPlane( dpy, pet_annotation.bitmap, XtWindow(wp->w), tile_map->black_gc, 0,0, pet_annotation.width,pet_annotation.height, dest_x,dest_y, 1 ); XSetClipOrigin(dpy, tile_map->black_gc, 0, 0); XSetClipMask(dpy, tile_map->black_gc, None); XSetForeground(dpy, tile_map->black_gc, BlackPixelOfScreen(screen)); } } } if (inverted) { XDrawRectangle(XtDisplay(wp->w), XtWindow(wp->w), #ifdef USE_WHITE /* kludge for white square... */ tile_map->glyphs[start_row][start_col] == cmap_to_glyph(S_ice) ? tile_map->black_gc : tile_map->white_gc, #else tile_map->white_gc, #endif start_col * map_info->square_width, start_row * map_info->square_height, map_info->square_width-1, map_info->square_height-1); } } else { struct text_map_info_t *text_map = map_info->mtype.text_map; #ifdef TEXTCOLOR if (iflags.use_color) { register char *c_ptr; char *t_ptr; int cur_col, color, win_ystart; for (row = start_row; row <= stop_row; row++) { win_ystart = map_info->square_ascent + (row * map_info->square_height); t_ptr = (char *) &(text_map->text[row][start_col]); c_ptr = (char *) &(text_map->colors[row][start_col]); cur_col = start_col; while (cur_col <= stop_col) { color = *c_ptr++; count = 1; while ((cur_col + count) <= stop_col && *c_ptr == color) { count++; c_ptr++; } XDrawImageString(XtDisplay(wp->w), XtWindow(wp->w), inverted ? text_map->inv_color_gcs[color] : text_map->color_gcs[color], map_info->square_lbearing + (map_info->square_width * cur_col), win_ystart, t_ptr, count); /* move text pointer and column count */ t_ptr += count; cur_col += count; } /* col loop */ } /* row loop */ } else #endif /* TEXTCOLOR */ { int win_row, win_xstart; /* We always start at the same x window position and have */ /* the same character count. */ win_xstart = map_info->square_lbearing + (win_start_col * map_info->square_width); count = stop_col - start_col + 1; for (row = start_row, win_row = win_start_row; row <= stop_row; row++, win_row++) { XDrawImageString(XtDisplay(wp->w), XtWindow(wp->w), inverted ? text_map->inv_copy_gc : text_map->copy_gc, win_xstart, map_info->square_ascent + (win_row * map_info->square_height), (char *) &(text_map->text[row][start_col]), count); } } } } /* Adjust the number of rows and columns on the given map window */ void set_map_size(wp, cols, rows) struct xwindow *wp; Dimension cols, rows; { Arg args[4]; Cardinal num_args; wp->pixel_width = wp->map_information->square_width * cols; wp->pixel_height = wp->map_information->square_height * rows; num_args = 0; XtSetArg(args[num_args], XtNwidth, wp->pixel_width); num_args++; XtSetArg(args[num_args], XtNheight, wp->pixel_height); num_args++; XtSetValues(wp->w, args, num_args); } static void init_text(wp) struct xwindow *wp; { struct map_info_t *map_info = wp->map_information; struct text_map_info_t *text_map; if (map_info->mtype.tile_map) { free(map_info->mtype.tile_map); map_info->mtype.tile_map = 0; } map_info->is_tile = FALSE; text_map = map_info->mtype.text_map = (struct text_map_info_t *) alloc(sizeof(struct text_map_info_t)); (void) memset((genericptr_t) text_map->text, ' ', sizeof(text_map->text)); #ifdef TEXTCOLOR (void) memset((genericptr_t) text_map->colors, NO_COLOR, sizeof(text_map->colors)); #endif get_char_info(wp); get_text_gc(wp, WindowFont(wp->w)); } static char map_translations[] = "#override\n\ Left: scroll(4)\n\ Right: scroll(6)\n\ Up: scroll(8)\n\ Down: scroll(2)\n\ : input() \ "; /* * The map window creation routine. */ void create_map_window(wp, create_popup, parent) struct xwindow *wp; boolean create_popup; /* parent is a popup shell that we create */ Widget parent; { struct map_info_t *map_info; /* map info pointer */ Widget map, viewport; Arg args[16]; Cardinal num_args; Dimension rows, columns; #if 0 int screen_width, screen_height; #endif wp->type = NHW_MAP; if (create_popup) { /* * Create a popup that accepts key and button events. */ num_args = 0; XtSetArg(args[num_args], XtNinput, False); num_args++; wp->popup = parent = XtCreatePopupShell(DEF_GAME_NAME, topLevelShellWidgetClass, toplevel, args, num_args); /* * If we're here, then this is an auxiliary map window. If we're * cancelled via a delete window message, we should just pop down. */ } num_args = 0; XtSetArg(args[num_args], XtNallowHoriz, True); num_args++; XtSetArg(args[num_args], XtNallowVert, True); num_args++; /* XtSetArg(args[num_args], XtNforceBars, True); num_args++; */ XtSetArg(args[num_args], XtNuseBottom, True); num_args++; XtSetArg(args[num_args], XtNtranslations, XtParseTranslationTable(map_translations)); num_args++; viewport = XtCreateManagedWidget( "map_viewport", /* name */ viewportWidgetClass, /* widget class from Window.h */ parent, /* parent widget */ args, /* set some values */ num_args); /* number of values to set */ /* * Create a map window. We need to set the width and height to some * value when we create it. We will change it to the value we want * later */ num_args = 0; XtSetArg(args[num_args], XtNwidth, 100); num_args++; XtSetArg(args[num_args], XtNheight, 100); num_args++; XtSetArg(args[num_args], XtNtranslations, XtParseTranslationTable(map_translations)); num_args++; wp->w = map = XtCreateManagedWidget( "map", /* name */ windowWidgetClass, /* widget class from Window.h */ viewport, /* parent widget */ args, /* set some values */ num_args); /* number of values to set */ XtAddCallback(map, XtNexposeCallback, map_exposed, (XtPointer) 0); map_info = wp->map_information = (struct map_info_t *) alloc(sizeof(struct map_info_t)); map_info->viewport_width = map_info->viewport_height = 0; /* reset the "new entry" indicators */ (void) memset((genericptr_t) map_info->t_start, (char) COLNO, sizeof(map_info->t_start)); (void) memset((genericptr_t) map_info->t_stop, (char) 0, sizeof(map_info->t_stop)); map_info->mtype.text_map = (struct text_map_info_t *)0; map_info->mtype.tile_map = (struct tile_map_info_t *)0; /* Backwards compatibility */ if (appResources.tile_file[0]) { int i; for(i = 0; i < no_tilesets; i++) if (!strcmp(tilesets[i].file, appResources.tile_file)) break; if (i == no_tilesets && no_tilesets < MAXNOTILESETS) { pline( "Warning: Adding tiles in file \"%s\" as \"X Default\" tile set", appResources.tile_file); strcpy(tilesets[i].name, "X Default"); strcpy(tilesets[i].file, appResources.tile_file); tilesets[i].flags = 0; no_tilesets++; if (!tileset[0]) { strcpy(tileset, tilesets[i].name); tile_index = i; } } else if (i < no_tilesets && !tileset[0]) { strcpy(tileset, tilesets[i].name); tile_index = i; } } if (tile_index < 0 && tileset[0]) { int i; for(i = 0; i < no_tilesets; i++) if (!strcmp(tilesets[i].name, tileset)) { tile_index = i; break; } } if (tile_index >= 0 && tilesets[tile_index].flags & ~TILESET_TRANSPARENT) { pline("Warning: Can't use tile set \"%s\"; unsupported flag set", tilesets[tile_index].name); tile_index = -1; tileset[0] = '\0'; } /* we probably want to restrict this to the 1st map window only */ if (tile_index >= 0 && init_tiles(wp)) { map_info->is_tile = TRUE; } else { tile_index = -1; tileset[0] = '\0'; init_text(wp); map_info->is_tile = FALSE; } /* * Initially, set the map widget to be the size specified by the * widget rows and columns resources. We need to do this to * correctly set the viewport window size. After the viewport is * realized, then the map can resize to its normal size. */ num_args = 0; XtSetArg(args[num_args], XtNrows, &rows); num_args++; XtSetArg(args[num_args], XtNcolumns, &columns); num_args++; XtGetValues(wp->w, args, num_args); /* Don't bother with windows larger than ROWNOxCOLNO. */ if (columns > COLNO) columns = COLNO; if (rows > ROWNO) rows = ROWNO; #if 0 /* This is insufficient. We now resize final window in winX.c */ /* * Check for overrunning the size of the screen. This does an ad hoc * job. * * Width: We expect that there is nothing but borders on either side * of the map window. Use some arbitrary width to decide * when to shrink. * * Height: if the map takes up more than 1/2 of the screen height, start * reducing its size. */ screen_height = HeightOfScreen(XtScreen(wp->w)); screen_width = WidthOfScreen(XtScreen(wp->w)); #define WOFF 50 if ((int)(columns*map_info->square_width) > screen_width-WOFF) { columns = (screen_width-WOFF) / map_info->square_width; if (columns == 0) columns = 1; } if ((int)(rows*map_info->square_height) > screen_height/2) { rows = screen_height / (2*map_info->square_height); if (rows == 0) rows = 1; } #endif set_map_size(wp, columns, rows); /* * If we have created our own popup, then realize it so that the * viewport is also realized. Then resize the map window. */ if (create_popup) { XtRealizeWidget(wp->popup); XSetWMProtocols(XtDisplay(wp->popup), XtWindow(wp->popup), &wm_delete_window, 1); set_map_size(wp, COLNO, ROWNO); } if (map_info->is_tile) { map_all_stone(map_info); } } /* * Destroy this map window. */ void destroy_map_window(wp) struct xwindow *wp; { struct map_info_t *map_info = wp->map_information; if (wp->popup) nh_XtPopdown(wp->popup); if (map_info) { struct text_map_info_t *text_map = map_info->mtype.text_map; /* Free allocated GCs. */ if (!map_info->is_tile) { #ifdef TEXTCOLOR int i; for (i = 0; i < CLR_MAX; i++) { XtReleaseGC(wp->w, text_map->color_gcs[i]); XtReleaseGC(wp->w, text_map->inv_color_gcs[i]); } #else XtReleaseGC(wp->w, text_map->copy_gc); XtReleaseGC(wp->w, text_map->inv_copy_gc); #endif } /* free alloc'ed text information */ free((genericptr_t)text_map), map_info->mtype.text_map = 0; /* Free malloc'ed space. */ free((genericptr_t)map_info), wp->map_information = 0; } /* Destroy map widget. */ if (wp->popup && !wp->keep_window) XtDestroyWidget(wp->popup), wp->popup = (Widget)0; if (wp->keep_window) XtRemoveCallback(wp->w, XtNexposeCallback, map_exposed, (XtPointer)0); else wp->type = NHW_NONE; /* allow re-use */ } boolean exit_x_event; /* exit condition for the event loop */ /******* pkey(k) int k; { printf("key = '%s%c'\n", (k<32) ? "^":"", (k<32) ? '@'+k : k); } ******/ /* * Main X event loop. Here we accept and dispatch X events. We only exit * under certain circumstances. */ int x_event(exit_condition) int exit_condition; { XEvent event; int retval = 0; boolean keep_going = TRUE; /* Hold globals so function is re-entrant */ boolean hold_exit_x_event = exit_x_event; click_button = NO_CLICK; /* reset click exit condition */ exit_x_event = FALSE; /* reset callback exit condition */ /* * Loop until we get a sent event, callback exit, or are accepting key * press and button press events and we receive one. */ if((exit_condition == EXIT_ON_KEY_PRESS || exit_condition == EXIT_ON_KEY_OR_BUTTON_PRESS) && incount) goto try_test; do { XtAppNextEvent(app_context, &event); XtDispatchEvent(&event); /* See if we can exit. */ try_test: switch (exit_condition) { case EXIT_ON_SENT_EVENT: { XAnyEvent *any = (XAnyEvent *) &event; if (any->send_event) { retval = 0; keep_going = FALSE; } break; } case EXIT_ON_EXIT: if (exit_x_event) { incount = 0; retval = 0; keep_going = FALSE; } break; case EXIT_ON_KEY_PRESS: if (incount != 0) { /* get first pressed key */ --incount; retval = inbuf[inptr]; inptr = (inptr+1) % INBUF_SIZE; /* pkey(retval); */ keep_going = FALSE; } break; case EXIT_ON_KEY_OR_BUTTON_PRESS: if (incount != 0 || click_button != NO_CLICK) { if (click_button != NO_CLICK) { /* button press */ /* click values are already set */ retval = 0; } else { /* key press */ /* get first pressed key */ --incount; retval = inbuf[inptr]; inptr = (inptr+1) % INBUF_SIZE; /* pkey(retval); */ } keep_going = FALSE; } break; default: panic("x_event: unknown exit condition %d", exit_condition); break; } } while (keep_going); /* Restore globals */ exit_x_event = hold_exit_x_event; return retval; } /*winmap.c*/ slashem-0.0.7E7F3/win/X11/wintext.c0000664000076400007640000003774410545462317014707 0ustar aliali/* SCCS Id: @(#)wintext.c 3.4 1996/04/05 */ /* Copyright (c) Dean Luick, 1992 */ /* NetHack may be freely redistributed. See license for details. */ /* * File for dealing with text windows. * * + No global functions. */ #ifndef SYSV #define PRESERVE_NO_SYSV /* X11 include files may define SYSV */ #endif #include #include #include #include #include #include #include #include #ifdef PRESERVE_NO_SYSV # ifdef SYSV # undef SYSV # endif # undef PRESERVE_NO_SYSV #endif #include "hack.h" #include "winX.h" #include "xwindow.h" #ifdef GRAPHIC_TOMBSTONE #include #endif #define TRANSIENT_TEXT /* text window is a transient window (no positioning) */ static const char text_translations[] = "#override\n\ : dismiss_text()\n\ : key_dismiss_text()"; #ifdef GRAPHIC_TOMBSTONE static const char rip_translations[] = "#override\n\ : rip_dismiss_text()\n\ : rip_dismiss_text()"; static Widget FDECL(create_ripout_widget, (Widget)); #endif /*ARGSUSED*/ void delete_text(w, event, params, num_params) Widget w; XEvent *event; String *params; Cardinal *num_params; { struct xwindow *wp; struct text_info_t *text_info; wp = find_widget(w); text_info = wp->text_information; nh_XtPopdown(wp->popup); if (text_info->blocked) { exit_x_event = TRUE; } else if (text_info->destroy_on_ack) { destroy_text_window(wp); } } /* * Callback used for all text windows. The window is poped down on any key * or button down event. It is destroyed if the main nethack code is done * with it. */ /*ARGSUSED*/ void dismiss_text(w, event, params, num_params) Widget w; XEvent *event; String *params; Cardinal *num_params; { struct xwindow *wp; struct text_info_t *text_info; wp = find_widget(w); text_info = wp->text_information; nh_XtPopdown(wp->popup); if (text_info->blocked) { exit_x_event = TRUE; } else if (text_info->destroy_on_ack) { destroy_text_window(wp); } } /* Dismiss when a non-modifier key pressed. */ void key_dismiss_text(w, event, params, num_params) Widget w; XEvent *event; String *params; Cardinal *num_params; { char ch = key_event_to_char((XKeyEvent *) event); if (ch) dismiss_text(w, event, params, num_params); } #ifdef GRAPHIC_TOMBSTONE /* Dismiss from clicking on rip image. */ void rip_dismiss_text(w, event, params, num_params) Widget w; XEvent *event; String *params; Cardinal *num_params; { dismiss_text(XtParent(w), event, params, num_params); } #endif /* ARGSUSED */ void add_to_text_window(wp, attr, str) struct xwindow *wp; int attr; /* currently unused */ const char *str; { struct text_info_t *text_info = wp->text_information; int width; append_text_buffer(&text_info->text, str, FALSE); /* Calculate text width and save longest line */ width = XTextWidth(text_info->fs, str, (int) strlen(str)); if (width > text_info->max_width) text_info->max_width = width; } void display_text_window(wp, blocking) struct xwindow *wp; boolean blocking; { 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 * lines that would fit on the screen. Next, remove four of these * lines to give room for a possible window manager titlebar (some * wm's put a titlebar on transient windows). Make sure we have * _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; if (nlines < text_info->text.num_lines) { /* add on width of scrollbar. Really should look this up, * but can't until the window is realized. Chicken-and-egg problem. */ width += 20; } #ifdef GRAPHIC_TOMBSTONE if (text_info->is_rip) { Widget rip = create_ripout_widget(XtParent(wp->w)); if (rip) { XtSetArg(args[num_args], XtNfromVert, rip); num_args++; } } #endif if (width > (Dimension) XtScreen(wp->w)->width) { /* too wide for screen */ /* Back off some amount - we really need to back off the scrollbar */ /* width plus some extra. */ width = XtScreen(wp->w)->width - 20; } XtSetArg(args[num_args], XtNstring, text_info->text.text); num_args++; XtSetArg(args[num_args], XtNwidth, width); num_args++; XtSetArg(args[num_args], XtNheight, height); num_args++; XtSetValues(wp->w, args, num_args); #ifdef TRANSIENT_TEXT XtRealizeWidget(wp->popup); XSetWMProtocols(XtDisplay(wp->popup), XtWindow(wp->popup), &wm_delete_window, 1); positionpopup(wp->popup, FALSE); #endif nh_XtPopup(wp->popup, (int)XtGrabNone, wp->w); /* Kludge alert. Scrollbars are not sized correctly by the Text widget */ /* if added before the window is displayed, so do it afterward. */ num_args = 0; if (nlines < text_info->text.num_lines) { /* add vert scrollbar */ XtSetArg(args[num_args], XtNscrollVertical, XawtextScrollAlways); num_args++; } if (width >= (Dimension) (XtScreen(wp->w)->width-20)) { /* too wide */ XtSetArg(args[num_args], XtNscrollHorizontal, XawtextScrollAlways); num_args++; } if (num_args) XtSetValues(wp->w, args, num_args); /* We want the user to acknowlege. */ if (blocking) { (void) x_event(EXIT_ON_EXIT); nh_XtPopdown(wp->popup); } } void create_text_window(wp) struct xwindow *wp; { struct text_info_t *text_info; Arg args[8]; Cardinal num_args; Position top_margin, bottom_margin, left_margin, right_margin; Widget form; wp->type = NHW_TEXT; wp->text_information = text_info = (struct text_info_t *) alloc(sizeof(struct text_info_t)); init_text_buffer(&text_info->text); text_info->max_width = 0; text_info->extra_width = 0; text_info->extra_height = 0; text_info->blocked = FALSE; text_info->destroy_on_ack = TRUE; /* Ok to destroy before display */ #ifdef GRAPHIC_TOMBSTONE text_info->is_rip = FALSE; #endif num_args = 0; XtSetArg(args[num_args], XtNallowShellResize, True); num_args++; XtSetArg(args[num_args], XtNtranslations, XtParseTranslationTable(text_translations)); num_args++; #ifdef TRANSIENT_TEXT wp->popup = XtCreatePopupShell("text", transientShellWidgetClass, toplevel, args, num_args); #else wp->popup = XtCreatePopupShell("text", topLevelShellWidgetClass, toplevel, args, num_args); #endif XtOverrideTranslations(wp->popup, XtParseTranslationTable("WM_PROTOCOLS: delete_text()")); num_args = 0; XtSetArg(args[num_args], XtNallowShellResize, True); num_args++; form = XtCreateManagedWidget("form", formWidgetClass, wp->popup, args, num_args); num_args = 0; XtSetArg(args[num_args], XtNdisplayCaret, False); num_args++; XtSetArg(args[num_args], XtNresize, XawtextResizeBoth); num_args++; XtSetArg(args[num_args], XtNtranslations, XtParseTranslationTable(text_translations)); num_args++; wp->w = XtCreateManagedWidget( killer && WIN_MAP == WIN_ERR ? "tombstone" : "text_text", /* name */ asciiTextWidgetClass, form, /* parent widget */ args, /* set some values */ num_args); /* number of values to set */ /* Get the font and margin information. */ num_args = 0; XtSetArg(args[num_args], XtNfont, &text_info->fs); num_args++; XtSetArg(args[num_args], XtNtopMargin, &top_margin); num_args++; XtSetArg(args[num_args], XtNbottomMargin, &bottom_margin); num_args++; XtSetArg(args[num_args], XtNleftMargin, &left_margin); num_args++; XtSetArg(args[num_args], XtNrightMargin, &right_margin); num_args++; XtGetValues(wp->w, args, num_args); text_info->extra_width = left_margin + right_margin; text_info->extra_height = top_margin + bottom_margin; } void destroy_text_window(wp) struct xwindow *wp; { /* Don't need to pop down, this only called from dismiss_text(). */ struct text_info_t *text_info = wp->text_information; /* * If the text window was blocked, then the user has already ACK'ed * it and we are free to really destroy the window. Otherwise, don't * destroy until the user dismisses the window via a key or button * press. */ if (text_info->blocked || text_info->destroy_on_ack) { XtDestroyWidget(wp->popup); free_text_buffer(&text_info->text); free((genericptr_t)text_info), wp->text_information = 0; wp->type = NHW_NONE; /* allow reuse */ } else { text_info->destroy_on_ack = TRUE; /* destroy on next ACK */ } } void clear_text_window(wp) struct xwindow *wp; { clear_text_buffer(&wp->text_information->text); } /* text buffer routines ---------------------------------------------------- */ /* Append a line to the text buffer. */ void append_text_buffer(tb, str, concat) struct text_buffer *tb; const char *str; boolean concat; { char *copy; int length; if (!tb->text) panic("append_text_buffer: null text buffer"); if (str) { length = strlen(str); } else { length = 0; } if (length + tb->text_last + 1 >= tb->text_size) { /* we need to go to a bigger buffer! */ #ifdef VERBOSE printf("append_text_buffer: text buffer growing from %d to %d bytes\n", tb->text_size, 2*tb->text_size); #endif copy = (char *) alloc((unsigned)tb->text_size*2); (void) memcpy(copy, tb->text, tb->text_last); free(tb->text); tb->text = copy; tb->text_size *= 2; } if (tb->num_lines) { /* not first --- append a newline */ char appchar = '\n'; if(concat && !index("!.?'\")", tb->text[tb->text_last-1])) { appchar = ' '; tb->num_lines--; /* offset increment at end of function */ } *(tb->text + tb->text_last) = appchar; tb->text_last++; } if (str) { (void) memcpy((tb->text+tb->text_last), str, length+1); if(length) { /* Remove all newlines. Otherwise we have a confused line count. */ copy = (tb->text+tb->text_last); while ((copy = index(copy, '\n')) != (char*)0) *copy = ' '; } tb->text_last += length; } tb->text[tb->text_last] = '\0'; tb->num_lines++; } /* Initialize text buffer. */ void init_text_buffer(tb) struct text_buffer *tb; { tb->text = (char *) alloc(START_SIZE); tb->text[0] = '\0'; tb->text_size = START_SIZE; tb->text_last = 0; tb->num_lines = 0; } /* Empty the text buffer */ void clear_text_buffer(tb) struct text_buffer *tb; { tb->text_last = 0; tb->text[0] = '\0'; tb->num_lines = 0; } /* Free up allocated memory. */ void free_text_buffer(tb) struct text_buffer *tb; { free(tb->text); tb->text = (char *) 0; tb->text_size = 0; tb->text_last = 0; tb->num_lines = 0; } #ifdef GRAPHIC_TOMBSTONE static void FDECL(rip_exposed, (Widget,XtPointer,XtPointer)); static XImage* rip_image=0; #define STONE_LINE_LEN 16 /* # 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 */ static char rip_line[YEAR_LINE+1][STONE_LINE_LEN+1]; extern const char *killed_by_prefix[]; void calculate_rip_text(int how) { /* Follows same algorithm as genl_outrip() */ char buf[BUFSZ]; char *dpx; int line; /* Put name on stone */ 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?"); 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 */ for (line=DEATH_LINE, dpx = buf; line 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()); } /* * RIP image expose callback. */ /*ARGSUSED*/ static void rip_exposed(w, client_data, widget_data) Widget w; XtPointer client_data; /* unused */ XtPointer widget_data; /* expose event from Window widget */ { XExposeEvent *event = (XExposeEvent *) widget_data; Display* dpy=XtDisplay(w); Arg args[8]; XGCValues values; XtGCMask mask; GC gc; static Pixmap rip_pixmap=None; int i, x, y; if (!XtIsRealized(w) || event->count > 0) return; if (rip_pixmap == None && rip_image) { rip_pixmap = XCreatePixmap(dpy, XtWindow(w), rip_image->width, rip_image->height, DefaultDepth(dpy, DefaultScreen(dpy))); XPutImage(dpy, rip_pixmap, DefaultGC(dpy, DefaultScreen(dpy)), rip_image, 0,0, 0,0, /* src, dest top left */ rip_image->width, rip_image->height); XDestroyImage(rip_image); /* data bytes free'd also */ } mask = GCFunction | GCForeground | GCGraphicsExposures | GCFont; values.graphics_exposures = False; XtSetArg(args[0], XtNforeground, &values.foreground); XtGetValues(w, args, 1); values.function = GXcopy; values.font = WindowFont(w); gc = XtGetGC(w, mask, &values); if (rip_pixmap != None) { XCopyArea(dpy, rip_pixmap, XtWindow(w), gc, event->x, event->y, event->width, event->height, event->x, event->y); } x=appResources.tombtext_x; y=appResources.tombtext_y; for (i=0; i<=YEAR_LINE; i++) { int len=strlen(rip_line[i]); XFontStruct* font=WindowFontStruct(w); int width=XTextWidth(font, rip_line[i], len); XDrawString(dpy, XtWindow(w), gc, x-width/2, y, rip_line[i], len); x+=appResources.tombtext_dx; y+=appResources.tombtext_dy; } XtReleaseGC(w, gc); } /* * The ripout window creation routine. */ static Widget create_ripout_widget(Widget parent) { Widget imageport; Arg args[16]; Cardinal num_args; static int rip_width, rip_height; if (!rip_image) { XpmAttributes attributes; int errorcode; char *rip_file; attributes.valuemask = XpmCloseness; attributes.closeness = 65535; /* Try anything */ #ifndef FILE_AREAS rip_file = appResources.tombstone; #else rip_file = make_file_name(FILE_AREA_SHARE, appResources.tombstone); #endif errorcode = XpmReadFileToImage(XtDisplay(parent), rip_file, &rip_image, 0, &attributes); #ifdef FILE_AREAS free(rip_file); #endif if (errorcode != XpmSuccess) { char buf[BUFSZ]; Sprintf(buf, "Failed to load %s: %s", appResources.tombstone, XpmGetErrorString(errorcode)); X11_raw_print(buf); return (Widget)0; } rip_width = rip_image->width; rip_height = rip_image->height; } num_args = 0; XtSetArg(args[num_args], XtNwidth, rip_width); num_args++; XtSetArg(args[num_args], XtNheight, rip_height); num_args++; XtSetArg(args[num_args], XtNtranslations, XtParseTranslationTable(rip_translations)); num_args++; imageport = XtCreateManagedWidget("rip", windowWidgetClass, parent, args, num_args); XtAddCallback(imageport, XtNexposeCallback, rip_exposed, (XtPointer) 0); return imageport; } #endif /* GRAPHIC_TOMBSTONE */ /*wintext.c*/ slashem-0.0.7E7F3/win/X11/winX.c0000664000076400007640000016146510545462317014130 0ustar aliali/* SCCS Id: @(#)winX.c 3.4 1999/12/21 */ /* Copyright (c) Dean Luick, 1992 */ /* NetHack may be freely redistributed. See license for details. */ /* * "Main" file for the X window-port. This contains most of the interface * routines. Please see doc/window.doc for an description of the window * interface. */ #ifndef SYSV #define PRESERVE_NO_SYSV /* X11 include files may define SYSV */ #endif #ifdef MSDOS /* from compiler */ #define SHORT_FILENAMES #endif #include #include #include #include #include #include #include #include #include #include #include /* for color support */ #ifdef SHORT_FILENAMES #include #else #include #endif #ifdef PRESERVE_NO_SYSV # ifdef SYSV # undef SYSV # endif # undef PRESERVE_NO_SYSV #endif #ifdef SHORT_FILENAMES #undef SHORT_FILENAMES /* hack.h will reset via global.h if necessary */ #endif #include "hack.h" #include "winX.h" #include "dlb.h" #ifdef SHORT_FILENAMES #include "patchlev.h" #else #include "patchlevel.h" #endif /* Should be defined in but you never know */ #ifndef XtSpecificationRelease #define XtSpecificationRelease 0 #endif /* * Icons. */ #include "../win/X11/nh72icon" #include "../win/X11/nh56icon" #include "../win/X11/nh32icon" static struct icon_info { const char *name; unsigned char *bits; unsigned width, height; } icon_data[] = { { "nh72", nh72icon_bits, nh72icon_width, nh72icon_height }, { "nh56", nh56icon_bits, nh56icon_width, nh56icon_height }, { "nh32", nh32icon_bits, nh32icon_width, nh32icon_height }, { (const char *)0, (unsigned char *)0, 0, 0 } }; /* * Private global variables (shared among the window port files). */ struct xwindow window_list[MAX_WINDOWS]; AppResources appResources; void FDECL((*input_func), (Widget,XEvent *,String *,Cardinal *)); int click_x, click_y, click_button; /* Click position on a map window */ /* (filled by set_button_values()). */ int updated_inventory; /* Interface definition, for windows.c */ struct window_procs X11_procs = { "X11", WC_COLOR|WC_HILITE_PET, 0L, X11_init_nhwindows, X11_player_selection, X11_askname, X11_get_nh_event, X11_exit_nhwindows, X11_suspend_nhwindows, X11_resume_nhwindows, X11_create_nhwindow, X11_clear_nhwindow, X11_display_nhwindow, X11_destroy_nhwindow, X11_curs, X11_putstr, X11_display_file, X11_start_menu, X11_add_menu, X11_end_menu, X11_select_menu, genl_message_menu, /* no need for X-specific handling */ X11_update_inventory, X11_mark_synch, X11_wait_synch, #ifdef CLIPPING X11_cliparound, #endif #ifdef POSITIONBAR donull, #endif X11_print_glyph, X11_raw_print, X11_raw_print_bold, X11_nhgetch, X11_nh_poskey, X11_nhbell, X11_doprev_message, X11_yn_function, X11_getlin, X11_get_ext_cmd, X11_number_pad, X11_delay_output, #ifdef CHANGE_COLOR /* only a Mac option currently */ donull, donull, #endif /* other defs that really should go away (they're tty specific) */ X11_start_screen, X11_end_screen, #ifdef GRAPHIC_TOMBSTONE X11_outrip, #else genl_outrip, #endif genl_preference_update, }; /* * Local functions. */ static void FDECL(dismiss_file, (Widget, XEvent*, String*, Cardinal*)); static void FDECL(delete_file, (Widget, XEvent*, String*, Cardinal*)); static void FDECL(yn_key, (Widget, XEvent*, String*, Cardinal*)); static void FDECL(yn_delete, (Widget, XEvent*, String*, Cardinal*)); static void FDECL(askname_delete, (Widget, XEvent*, String*, Cardinal*)); static void FDECL(getline_delete, (Widget, XEvent*, String*, Cardinal*)); static void FDECL(X11_hangup, (Widget, XEvent*, String*, Cardinal*)); static int FDECL(input_event, (int)); static void FDECL(win_visible, (Widget,XtPointer,XEvent *,Boolean *)); static void NDECL(init_standard_windows); /* * Local variables. */ static boolean x_inited = FALSE; /* TRUE if window system is set up. */ static winid message_win = WIN_ERR, /* These are the winids of the */ map_win = WIN_ERR, /* message, map, and status */ status_win = WIN_ERR; /* windows, when they are created */ /* in init_windows(). */ static Pixmap icon_pixmap = None; /* Pixmap for icon. */ /* * Find the window structure that corresponds to the given widget. Note * that this is not the popup widget, nor the viewport, but the child. */ struct xwindow * find_widget(w) Widget w; { int windex; struct xwindow *wp; /* Search to find the corresponding window. Look at the main widget, */ /* popup, the parent of the main widget, then parent of the widget. */ for (windex = 0, wp = window_list; windex < MAX_WINDOWS; windex++, wp++) if (wp->type != NHW_NONE && (wp->w == w || wp->popup == w || (wp->w && (XtParent(wp->w)) == w) || (wp->popup == XtParent(w)))) break; if (windex == MAX_WINDOWS) panic("find_widget: can't match widget"); return wp; } /* * Find a free window slot for use. */ static winid find_free_window() { int windex; struct xwindow *wp; for (windex = 0, wp = &window_list[0]; windex < MAX_WINDOWS; windex++, wp++) if (wp->type == NHW_NONE) break; if (windex == MAX_WINDOWS) panic("find_free_window: no free windows!"); return (winid) windex; } /* * Color conversion. The default X11 color converters don't try very * hard to find matching colors in PseudoColor visuals. If they can't * allocate the exact color, they puke and give you something stupid. * This is an attempt to find some close readonly cell and use it. */ XtConvertArgRec const nhcolorConvertArgs[] = { {XtWidgetBaseOffset, (XtPointer)XtOffset(Widget, core.screen), sizeof(Screen *)}, {XtWidgetBaseOffset, (XtPointer)XtOffset(Widget, core.colormap), sizeof(Colormap)} }; #define done(type, value) \ { \ if (toVal->addr != 0) { \ if (toVal->size < sizeof(type)) { \ toVal->size = sizeof(type); \ return False; \ } \ *(type*)(toVal->addr) = (value); \ } \ else { \ static type static_val; \ static_val = (value); \ toVal->addr = (genericptr_t)&static_val; \ } \ toVal->size = sizeof(type); \ return True; \ } /* decl.h declares these, but it screws up structure references -dlc */ #undef red #undef green #undef blue /* * Find a color that approximates the color named in "str". The "str" color * may be a color name ("red") or number ("#7f0000"). If str == NULL, then * "color" is assumed to contain the RGB color wanted. * The approximate color found is returned in color as well. * Return True if something close was found. */ Boolean nhApproxColor(screen, colormap, str, color) Screen *screen; /* screen to use */ Colormap colormap; /* the colormap to use */ char *str; /* color name */ XColor *color; /* the X color structure; changed only if successful */ { int ncells; 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 */ /* or if it's huge, and _some_ match should have been possible */ if((ncells = CellsOfScreen(screen)) < 256 || ncells > 4096) return False; if (str != (char *)0) { if (!XParseColor(DisplayOfScreen(screen), colormap, str, &tmp)) return False; } else { tmp = *color; tmp.flags = 7; /* force to use all 3 of RGB */ } if (!table) { table = (XColor *) XtCalloc(ncells, sizeof(XColor)); for(i=0; iaddr; XColor screenColor; XColor exactColor; Screen *screen; XtAppContext app = XtDisplayToApplicationContext(dpy); Colormap colormap; Status status; String params[1]; Cardinal num_params=1; if (*num_args != 2) { XtAppWarningMsg(app, "wrongParameters", "cvtStringToPixel", "XtToolkitError", "String to pixel conversion needs screen and colormap arguments", (String *)0, (Cardinal *)0); return False; } screen = *((Screen **) args[0].addr); colormap = *((Colormap *) args[1].addr); /* If Xt colors, use the Xt routine and hope for the best */ #if (XtSpecificationRelease >= 5) if ((strcmpi(str, XtDefaultBackground) == 0) || (strcmpi(str, XtDefaultForeground) == 0)) { return XtCvtStringToPixel(dpy, args, num_args, fromVal, toVal, closure_ret); } #else if (strcmpi(str, XtDefaultBackground) == 0) { *closure_ret = (char*)False; done(Pixel, WhitePixelOfScreen(screen)); } if (strcmpi(str, XtDefaultForeground) == 0) { *closure_ret = (char*)False; done(Pixel, BlackPixelOfScreen(screen)); } #endif status = XAllocNamedColor(DisplayOfScreen(screen), colormap, (char*)str, &screenColor, &exactColor); if (status == 0) { String msg, type; /* some versions of XAllocNamedColor don't allow #xxyyzz names */ if (str[0] == '#' && XParseColor(DisplayOfScreen(screen), colormap, str, &exactColor) && XAllocColor(DisplayOfScreen(screen), colormap, &exactColor)) { *closure_ret = (char*)True; done(Pixel, exactColor.pixel); } params[0] = str; /* Server returns a specific error code but Xlib discards it. Ugh */ if (XLookupColor(DisplayOfScreen(screen), colormap, (char*)str, &exactColor, &screenColor)) { /* try to find another color that will do */ if (nhApproxColor(screen, colormap, (char*) str, &screenColor)) { *closure_ret = (char*)True; done(Pixel, screenColor.pixel); } type = "noColormap"; msg = "Cannot allocate colormap entry for \"%s\""; } else { /* some versions of XLookupColor also don't allow #xxyyzz names */ if(str[0] == '#' && (nhApproxColor(screen, colormap, (char*) str, &screenColor))) { *closure_ret = (char*)True; done(Pixel, screenColor.pixel); } type = "badValue"; msg = "Color name \"%s\" is not defined"; } XtAppWarningMsg(app, type, "cvtStringToPixel", "XtToolkitError", msg, params, &num_params); *closure_ret = False; return False; } else { *closure_ret = (char*)True; done(Pixel, screenColor.pixel); } } /* ARGSUSED */ static void nhFreePixel(app, toVal, closure, args, num_args) XtAppContext app; XrmValuePtr toVal; XtPointer closure; XrmValuePtr args; Cardinal *num_args; { Screen *screen; Colormap colormap; if (*num_args != 2) { XtAppWarningMsg(app, "wrongParameters", "freePixel", "XtToolkitError", "Freeing a pixel requires screen and colormap arguments", (String *)0, (Cardinal *)0); return; } screen = *((Screen **) args[0].addr); colormap = *((Colormap *) args[1].addr); if (closure) { XFreeColors( DisplayOfScreen(screen), colormap, (unsigned long*)toVal->addr, 1, (unsigned long)0 ); } } /* [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) const char *str; { (void) puts(str); } void X11_raw_print_bold(str) const char *str; { (void) puts(str); } void X11_curs(window, x, y) winid window; int x, y; { check_winid(window); if (x < 0 || x >= COLNO) { impossible("curs: bad x value [%d]", x); x = 0; } if (y < 0 || y >= ROWNO) { impossible("curs: bad y value [%d]", y); y = 0; } window_list[window].cursx = x; window_list[window].cursy = y; } void X11_putstr(window, attr, str) winid window; int attr; const char *str; { winid new_win; struct xwindow *wp; check_winid(window); wp = &window_list[window]; switch (wp->type) { case NHW_MESSAGE: (void) strncpy(toplines, str, TBUFSZ); /* for Norep(). */ toplines[TBUFSZ - 1] = 0; append_message(wp, str); break; case NHW_STATUS: adjust_status(wp, str); break; case NHW_MAP: impossible("putstr: called on map window \"%s\"", str); break; case NHW_MENU: if (wp->menu_information->is_menu) { impossible( "putstr: called on a menu window, \"%s\" discarded", str); break; } /* * Change this menu window into a text window by creating a * new text window, then copying it to this winid. */ new_win = X11_create_nhwindow(NHW_TEXT); X11_destroy_nhwindow(window); *wp = window_list[new_win]; window_list[new_win].type = NHW_NONE; /* allow re-use */ /* fall though to add text */ case NHW_TEXT: add_to_text_window(wp, attr, str); break; default: impossible("putstr: unknown window type [%d] \"%s\"", wp->type, str); } } /* We do event processing as a callback, so this is a null routine. */ void X11_get_nh_event() { return; } int X11_nhgetch() { return input_event(EXIT_ON_KEY_PRESS); } int X11_nh_poskey(x, y, mod) int *x, *y, *mod; { int val = input_event(EXIT_ON_KEY_OR_BUTTON_PRESS); if (val == 0) { /* user clicked on a map window */ *x = click_x; *y = click_y; *mod = click_button; } return val; } winid X11_create_nhwindow(type) int type; { winid window; struct xwindow *wp; if (!x_inited) panic("create_nhwindow: windows not initialized"); /* * We have already created the standard message, map, and status * windows in the window init routine. The first window of that * type to be created becomes the standard. * * A better way to do this would be to say that init_nhwindows() * has already defined these three windows. */ if (type == NHW_MAP && map_win != WIN_ERR) { window = map_win; map_win = WIN_ERR; return window; } if (type == NHW_MESSAGE && message_win != WIN_ERR) { window = message_win; message_win = WIN_ERR; return window; } if (type == NHW_STATUS && status_win != WIN_ERR) { window = status_win; status_win = WIN_ERR; return window; } window = find_free_window(); wp = &window_list[window]; /* The create routines will set type, popup, w, and Win_info. */ wp->prevx = wp->prevy = wp->cursx = wp->cursy = wp->pixel_width = wp->pixel_height = 0; wp->keep_window = FALSE; switch (type) { case NHW_MAP: create_map_window(wp, TRUE, (Widget) 0); break; case NHW_MESSAGE: create_message_window(wp, TRUE, (Widget) 0); break; case NHW_STATUS: create_status_window(wp, TRUE, (Widget) 0); break; case NHW_MENU: create_menu_window(wp); break; case NHW_TEXT: create_text_window(wp); break; default: panic("create_nhwindow: unknown type [%d]", type); break; } return window; } void X11_clear_nhwindow(window) winid window; { struct xwindow *wp; check_winid(window); wp = &window_list[window]; switch (wp->type) { case NHW_MAP: clear_map_window(wp); break; case NHW_TEXT: clear_text_window(wp); break; case NHW_STATUS: case NHW_MENU: case NHW_MESSAGE: /* do nothing for these window types */ break; default: panic("clear_nhwindow: unknown window type [%d]", wp->type); break; } } void X11_display_nhwindow(window, blocking) winid window; boolean blocking; { struct xwindow *wp; check_winid(window); wp = &window_list[window]; switch (wp->type) { case NHW_MAP: if (wp->popup) nh_XtPopup(wp->popup, (int)XtGrabNone, wp->w); display_map_window(wp); /* flush map */ /* * We need to flush the message window here due to the way the tty * port is set up. To flush a window, you need to call this * routine. However, the tty port _pauses_ with a --more-- if we * do a display_nhwindow(WIN_MESSAGE, FALSE). Thus, we can't call * display_nhwindow(WIN_MESSAGE,FALSE) in parse() because then we * get a --more-- after every line. * * Perhaps the window document should mention that when the map * is flushed, everything on the three main windows should be * flushed. Note: we don't need to flush the status window * because we don't buffer changes. */ if (WIN_MESSAGE != WIN_ERR) display_message_window(&window_list[WIN_MESSAGE]); if (blocking) (void) x_event(EXIT_ON_KEY_OR_BUTTON_PRESS); break; case NHW_MESSAGE: if (wp->popup) nh_XtPopup(wp->popup, (int)XtGrabNone, wp->w); display_message_window(wp); /* flush messages */ break; case NHW_STATUS: if (wp->popup) nh_XtPopup(wp->popup, (int)XtGrabNone, wp->w); break; /* no flushing necessary */ case NHW_MENU: { int n; menu_item *selected; /* pop up menu */ n = X11_select_menu(window, PICK_NONE, &selected); if (n) { impossible("perminvent: %d selected??", n); free((genericptr_t)selected); } break; } case NHW_TEXT: display_text_window(wp, blocking); /* pop up text window */ break; default: panic("display_nhwindow: unknown window type [%d]", wp->type); break; } } void X11_destroy_nhwindow(window) winid window; { struct xwindow *wp; check_winid(window); wp = &window_list[window]; /* * "Zap" known windows, but don't destroy them. We need to keep the * toplevel widget popped up so that later windows (e.g. tombstone) * are visible on DECWindow systems. This is due to the virtual * roots that the DECWindow wm creates. */ if (window == WIN_MESSAGE) { wp->keep_window = TRUE; WIN_MESSAGE = WIN_ERR; iflags.window_inited = 0; } else if (window == WIN_MAP) { wp->keep_window = TRUE; WIN_MAP = WIN_ERR; } else if (window == WIN_STATUS) { wp->keep_window = TRUE; WIN_STATUS = WIN_ERR; } else if (window == WIN_INVEN) { /* don't need to keep this one */ WIN_INVEN = WIN_ERR; } switch (wp->type) { case NHW_MAP: destroy_map_window(wp); break; case NHW_MENU: destroy_menu_window(wp); break; case NHW_TEXT: destroy_text_window(wp); break; case NHW_STATUS: destroy_status_window(wp); break; case NHW_MESSAGE: destroy_message_window(wp); break; default: panic("destroy_nhwindow: unknown window type [%d]", wp->type); break; } } void X11_update_inventory() { if (x_inited && window_list[WIN_INVEN].menu_information->is_up) { updated_inventory = 1; /* hack to avoid mapping&raising window */ (void) display_inventory((char *)0, FALSE); updated_inventory = 0; } } /* The current implementation has all of the saved lines on the screen. */ int X11_doprev_message() { return 0; } void X11_nhbell() { /* We can't use XBell until toplevel has been initialized. */ if (x_inited) XBell(XtDisplay(toplevel), 0); /* else print ^G ?? */ } void X11_mark_synch() { if (x_inited) { /* * The window document is unclear about the status of text * that has been pline()d but not displayed w/display_nhwindow(). * Both the main and tty code assume that a pline() followed * by mark_synch() results in the text being seen, even if * display_nhwindow() wasn't called. Duplicate this behavior. */ if (WIN_MESSAGE != WIN_ERR) display_message_window(&window_list[WIN_MESSAGE]); XSync(XtDisplay(toplevel), False); } } void X11_wait_synch() { if (x_inited) XFlush(XtDisplay(toplevel)); } /* Both resume_ and suspend_ are called from ioctl.c and unixunix.c. */ void X11_resume_nhwindows() { return; } /* ARGSUSED */ void X11_suspend_nhwindows(str) const char *str; { return; } /* Under X, we don't need to initialize the number pad. */ /* ARGSUSED */ void X11_number_pad(state) int state; { return; } /* called from options.c */ void X11_start_screen() { return; } /* called from setftty() in unixtty.c */ void X11_end_screen() { return; } /* called from settty() in unixtty.c */ #ifdef GRAPHIC_TOMBSTONE void X11_outrip(window, how) winid window; int how; { struct xwindow *wp; check_winid(window); wp = &window_list[window]; if (wp->type == NHW_TEXT) { wp->text_information->is_rip = TRUE; } else { panic("ripout on non-text window (window type [%d])", wp->type); } calculate_rip_text(how); } #endif /* init and exit nhwindows ------------------------------------------------- */ XtAppContext app_context; /* context of application */ Widget toplevel = (Widget) 0; /* toplevel widget */ Atom wm_delete_window; /* pop down windows */ static XtActionsRec actions[] = { {"dismiss_file", dismiss_file}, /* action for file viewing widget */ {"delete_file", delete_file}, /* action for file delete-window */ {"dismiss_text", dismiss_text}, /* button action for text widget */ {"delete_text", delete_text}, /* delete action for text widget */ {"key_dismiss_text",key_dismiss_text},/* key action for text widget */ #ifdef GRAPHIC_TOMBSTONE {"rip_dismiss_text",rip_dismiss_text},/* action for rip in text widget */ #endif {"menu_key", menu_key}, /* action for menu accelerators */ {"yn_key", yn_key}, /* action for yn accelerators */ {"yn_delete", yn_delete}, /* action for yn delete-window */ {"askname_delete", askname_delete},/* action for askname delete-window */ {"getline_delete", getline_delete},/* action for getline delete-window */ {"menu_delete", menu_delete}, /* action for menu delete-window */ {"ec_key", ec_key}, /* action for extended commands */ {"ec_delete", ec_delete}, /* action for ext-com menu delete */ {"ps_key", ps_key}, /* action for player selection */ {"race_key", race_key}, /* action for race selection */ {"gend_key", gend_key}, /* action for gender selection */ {"algn_key", algn_key}, /* action for alignment selection */ {"X11_hangup", X11_hangup}, /* action for delete of top-level */ {"input", map_input}, /* action for key input */ {"scroll", nh_keyscroll}, /* action for scrolling by keys */ }; 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), XtOffset(AppResources *,message_line), XtRString, "False" }, { "double_tile_size", "Double_tile_size", XtRBoolean, sizeof(Boolean), XtOffset(AppResources *,double_tile_size), XtRString, "False" }, { "tile_file", "Tile_file", XtRString, sizeof(String), XtOffset(AppResources *,tile_file), XtRString, "" }, { "icon", "Icon", XtRString, sizeof(String), XtOffset(AppResources *,icon), XtRString, "nh72" }, { "message_lines", "Message_lines", XtRInt, sizeof(int), XtOffset(AppResources *,message_lines), XtRString, "12" }, { "pet_mark_bitmap", "Pet_mark_bitmap", XtRString, sizeof(String), XtOffset(AppResources *,pet_mark_bitmap), XtRString, "pet_mark.xbm" }, { "pet_mark_color", "Pet_mark_color", XtRPixel, sizeof(XtRPixel), XtOffset(AppResources *,pet_mark_color), XtRString, "Red" }, #ifdef GRAPHIC_TOMBSTONE { "tombstone", "Tombstone", XtRString, sizeof(String), XtOffset(AppResources *,tombstone), XtRString, "rip.xpm" }, { "tombtext_x", "Tombtext_x", XtRInt, sizeof(int), XtOffset(AppResources *,tombtext_x), XtRString, "155" }, { "tombtext_y", "Tombtext_y", XtRInt, sizeof(int), XtOffset(AppResources *,tombtext_y), XtRString, "78" }, { "tombtext_dx", "Tombtext_dx", XtRInt, sizeof(int), XtOffset(AppResources *,tombtext_dx), XtRString, "0" }, { "tombtext_dy", "Tombtext_dy", XtRInt, sizeof(int), XtOffset(AppResources *,tombtext_dy), XtRString, "13" }, #endif }; void X11_init_nhwindows(argcp,argv) int* argcp; char** argv; { static const char *banner_text[] = { COPYRIGHT_BANNER_A, COPYRIGHT_BANNER_B, COPYRIGHT_BANNER_C, "", "", 0 }; register const char **pp; int i; Cardinal num_args; Arg args[4]; uid_t savuid; /* Init windows to nothing. */ for (i = 0; i < MAX_WINDOWS; i++) window_list[i].type = NHW_NONE; /* * setuid hack: make sure that if nethack is setuid, to use real uid * when opening X11 connections, in case the user is using xauth, since * the "games" or whatever user probably doesn't have permission to open * a window on the user's display. This code is harmless if the binary * is not installed setuid. See include/system.h on compilation failures. */ savuid = geteuid(); (void) seteuid(getuid()); XSetIOErrorHandler((XIOErrorHandler) hangup); num_args = 0; XtSetArg(args[num_args], XtNallowShellResize, True); num_args++; toplevel = XtAppInitialize( &app_context, DEF_GAME_NAME, /* application class */ (XrmOptionDescList)0, 0, /* options list */ argcp, (String *)argv, /* command line args */ (String *)0, /* fallback resources */ (ArgList)args, num_args); XtOverrideTranslations(toplevel, XtParseTranslationTable("WM_PROTOCOLS: X11_hangup()")); /* We don't need to realize the top level widget. */ #ifdef TEXTCOLOR /* add new color converter to deal with overused colormaps */ XtSetTypeConverter(XtRString, XtRPixel, nhCvtStringToPixel, (XtConvertArgList)nhcolorConvertArgs, XtNumber(nhcolorConvertArgs), XtCacheByDisplay, nhFreePixel); #endif /* TEXTCOLOR */ /* Register the actions mentioned in "actions". */ XtAppAddActions(app_context, actions, XtNumber(actions)); /* Get application-wide resources */ XtGetApplicationResources(toplevel, (XtPointer)&appResources, resources, XtNumber(resources), (ArgList)0, ZERO); /* Initialize other things. */ init_standard_windows(); /* Give the window manager an icon to use; toplevel must be realized. */ if (appResources.icon && *appResources.icon) { struct icon_info *ip; for (ip = icon_data; ip->name; ip++) if (!strcmp(appResources.icon, ip->name)) { icon_pixmap = XCreateBitmapFromData(XtDisplay(toplevel), XtWindow(toplevel), (genericptr_t)ip->bits, ip->width, ip->height); if (icon_pixmap != None) { XWMHints hints; (void) memset((genericptr_t)&hints, 0, sizeof(XWMHints)); hints.flags = IconPixmapHint; hints.icon_pixmap = icon_pixmap; XSetWMHints(XtDisplay(toplevel), XtWindow(toplevel), &hints); } break; } } /* end of setuid hack: reset uid back to the "games" uid */ (void) seteuid(savuid); x_inited = TRUE; /* X is now initialized */ /* Display the startup banner in the message window. */ for (pp = banner_text; *pp; pp++) X11_putstr(WIN_MESSAGE, 0, *pp); } /* * All done. */ /* ARGSUSED */ void X11_exit_nhwindows(dummy) const char *dummy; { extern Pixmap tile_pixmap; /* from winmap.c */ /* explicitly free the icon and tile pixmaps */ if (icon_pixmap != None) { XFreePixmap(XtDisplay(toplevel), icon_pixmap); icon_pixmap = None; } if (tile_pixmap != None) { XFreePixmap(XtDisplay(toplevel), tile_pixmap); tile_pixmap = None; } if (WIN_INVEN != WIN_ERR) X11_destroy_nhwindow(WIN_INVEN); if (WIN_STATUS != WIN_ERR) X11_destroy_nhwindow(WIN_STATUS); if (WIN_MAP != WIN_ERR) X11_destroy_nhwindow(WIN_MAP); if (WIN_MESSAGE != WIN_ERR) X11_destroy_nhwindow(WIN_MESSAGE); } /* delay_output ------------------------------------------------------------ */ /* * Timeout callback for delay_output(). Send a fake message to the map * window. */ /* ARGSUSED */ static void d_timeout(client_data, id) XtPointer client_data; XtIntervalId *id; { XEvent event; XClientMessageEvent *mesg; /* Set up a fake message to the event handler. */ mesg = (XClientMessageEvent *) &event; mesg->type = ClientMessage; mesg->message_type = XA_STRING; mesg->format = 8; XSendEvent(XtDisplay(window_list[WIN_MAP].w), XtWindow(window_list[WIN_MAP].w), False, NoEventMask, (XEvent*) mesg); } /* * Delay for 50ms. This is not implemented asynch. Maybe later. * Start the timeout, then wait in the event loop. The timeout * function will send an event to the map window which will be waiting * for a sent event. */ void X11_delay_output() { if (!x_inited) return; (void) XtAppAddTimeOut(app_context, 30L, d_timeout, (XtPointer) 0); /* The timeout function will enable the event loop exit. */ (void) x_event(EXIT_ON_SENT_EVENT); } /* X11_hangup -------------------------------------------------------------- */ /* ARGSUSED */ static void X11_hangup(w, event, params, num_params) Widget w; XEvent *event; String *params; Cardinal *num_params; { hangup(1); /* 1 is commonly SIGHUP, but ignored anyway */ } /* askname ----------------------------------------------------------------- */ /* ARGSUSED */ static void askname_delete(w, event, params, num_params) Widget w; XEvent *event; String *params; Cardinal *num_params; { nh_XtPopdown(w); (void) strcpy(plname, "Mumbles"); /* give them a name... ;-) */ exit_x_event = TRUE; } /* Callback for askname dialog widget. */ /* ARGSUSED */ static void askname_done(w, client_data, call_data) Widget w; XtPointer client_data; XtPointer call_data; { int len; char *s; Widget dialog = (Widget) client_data; s = (char *) GetDialogResponse(dialog); len = strlen(s); if (len == 0) { X11_nhbell(); return; } /* Truncate name if necessary */ if (len >= sizeof(plname)-1) len = sizeof(plname)-1; (void) strncpy(plname, s, len); plname[len] = '\0'; XtFree(s); nh_XtPopdown(XtParent(dialog)); exit_x_event = TRUE; } void X11_askname() { Widget popup, dialog; Arg args[1]; XtSetArg(args[0], XtNallowShellResize, True); popup = XtCreatePopupShell("askname", transientShellWidgetClass, toplevel, args, ONE); XtOverrideTranslations(popup, XtParseTranslationTable("WM_PROTOCOLS: askname_delete()")); dialog = CreateDialog(popup, "dialog", askname_done, (XtCallbackProc) 0); SetDialogPrompt(dialog, "What is your name?"); /* set prompt */ SetDialogResponse(dialog, ""); /* set default answer */ XtRealizeWidget(popup); positionpopup(popup, TRUE); /* center,bottom */ nh_XtPopup(popup, (int)XtGrabExclusive, dialog); /* The callback will enable the event loop exit. */ (void) x_event(EXIT_ON_EXIT); } /* getline ----------------------------------------------------------------- */ /* This uses Tim Theisen's dialog widget set (from GhostView). */ static Widget getline_popup, getline_dialog; #define CANCEL_STR "\033" static char *getline_input; /* Callback for getline dialog widget. */ /* ARGSUSED */ static void done_button(w, client_data, call_data) Widget w; 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; } /* ARGSUSED */ static void getline_delete(w, event, params, num_params) Widget w; XEvent *event; String *params; Cardinal *num_params; { Strcpy(getline_input, CANCEL_STR); nh_XtPopdown(w); exit_x_event = TRUE; } /* Callback for getline dialog widget. */ /* ARGSUSED */ static void abort_button(w, client_data, call_data) Widget w; XtPointer client_data; XtPointer call_data; { Widget dialog = (Widget) client_data; Strcpy(getline_input, CANCEL_STR); nh_XtPopdown(XtParent(dialog)); exit_x_event = TRUE; } void X11_getlin(question, input) const char *question; char *input; { static boolean need_to_init = True; getline_input = input; flush_screen(1); if (need_to_init) { Arg args[1]; need_to_init = False; XtSetArg(args[0], XtNallowShellResize, True); getline_popup = XtCreatePopupShell("getline",transientShellWidgetClass, toplevel, args, ONE); XtOverrideTranslations(getline_popup, XtParseTranslationTable("WM_PROTOCOLS: getline_delete()")); getline_dialog = CreateDialog(getline_popup, "dialog", done_button, abort_button); XtRealizeWidget(getline_popup); XSetWMProtocols(XtDisplay(getline_popup), XtWindow(getline_popup), &wm_delete_window, 1); } SetDialogPrompt(getline_dialog, (String)question); /* set prompt */ SetDialogResponse(getline_dialog, ""); /* set default answer */ positionpopup(getline_popup, TRUE); /* center,bottom */ nh_XtPopup(getline_popup, (int)XtGrabExclusive, getline_dialog); /* The callback will enable the event loop exit. */ (void) x_event(EXIT_ON_EXIT); } /* Display file ------------------------------------------------------------ */ static const char display_translations[] = "#override\n\ q: dismiss_file()\n\ Escape: dismiss_file()\n\ : dismiss_file()"; /* WM_DELETE_WINDOW callback for file dismissal. */ /*ARGSUSED*/ static void delete_file(w, event, params, num_params) Widget w; XEvent *event; String *params; Cardinal *num_params; { nh_XtPopdown(w); XtDestroyWidget(w); } /* Callback for file dismissal. */ /*ARGSUSED*/ static void dismiss_file(w, event, params, num_params) Widget w; XEvent *event; String *params; Cardinal *num_params; { Widget popup = XtParent(w); nh_XtPopdown(popup); XtDestroyWidget(popup); } void #ifdef FILE_AREAS X11_display_file(area, str, complain) const char *area; #else X11_display_file(str, complain) #endif const char *str; boolean complain; { dlb *fp; Arg args[12]; Cardinal num_args; Widget popup, dispfile; Position top_margin, bottom_margin, left_margin, right_margin; XFontStruct *fs; int new_width, new_height; #define LLEN 128 char line[LLEN]; int num_lines; char *textlines; int charcount; /* Use the port-independent file opener to see if the file exists. */ #ifdef FILE_AREAS fp = dlb_fopen_area(area, str, RDTMODE); #else fp = dlb_fopen(str, RDTMODE); #endif if (!fp) { if(complain) pline("Cannot open %s. Sorry.", str); return; /* it doesn't exist, ignore */ } /* * Count the number of lines and characters in the file. */ num_lines = 0; charcount = 1; while (dlb_fgets(line, LLEN, fp)) { num_lines++; charcount += strlen(line); } (void) dlb_fclose(fp); /* Ignore empty files */ if (num_lines == 0) return; /* If over the max window size, truncate the window size to the max */ if (num_lines >= DISPLAY_FILE_SIZE) num_lines = DISPLAY_FILE_SIZE; /* * Re-open the file and read the data into a buffer. Cannot use * the XawAsciiFile type of widget, because that is not DLB-aware. */ textlines = (char *) alloc((unsigned int) charcount); textlines[0] = '\0'; #ifdef FILE_AREAS fp = dlb_fopen_area(area, str, RDTMODE); #else fp = dlb_fopen(str, RDTMODE); #endif while (dlb_fgets(line, LLEN, fp)) { (void) strcat(textlines, line); } (void) dlb_fclose(fp); num_args = 0; XtSetArg(args[num_args], XtNtitle, str); num_args++; popup = XtCreatePopupShell("display_file", topLevelShellWidgetClass, toplevel, args, num_args); XtOverrideTranslations(popup, XtParseTranslationTable("WM_PROTOCOLS: delete_file()")); num_args = 0; XtSetArg(args[num_args], XtNscrollHorizontal, XawtextScrollWhenNeeded); num_args++; XtSetArg(args[num_args], XtNscrollVertical, XawtextScrollWhenNeeded); num_args++; XtSetArg(args[num_args], XtNtype, XawAsciiString); num_args++; XtSetArg(args[num_args], XtNstring, textlines); num_args++; XtSetArg(args[num_args], XtNdisplayCaret, False); num_args++; XtSetArg(args[num_args], XtNtranslations, XtParseTranslationTable(display_translations)); num_args++; dispfile = XtCreateManagedWidget( "text", /* name */ asciiTextWidgetClass, popup, /* parent widget */ args, /* set some values */ num_args); /* number of values to set */ /* Get font and border information. */ num_args = 0; XtSetArg(args[num_args], XtNfont, &fs); num_args++; XtSetArg(args[num_args], XtNtopMargin, &top_margin); num_args++; XtSetArg(args[num_args], XtNbottomMargin, &bottom_margin); num_args++; XtSetArg(args[num_args], XtNleftMargin, &left_margin); num_args++; XtSetArg(args[num_args], XtNrightMargin, &right_margin); num_args++; 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; /* Set the new width and height. */ num_args = 0; XtSetArg(args[num_args], XtNwidth, new_width); num_args++; XtSetArg(args[num_args], XtNheight, new_height); num_args++; XtSetValues(dispfile, args, num_args); nh_XtPopup(popup, (int)XtGrabNone, (Widget)0); free(textlines); } /* yn_function ------------------------------------------------------------- */ /* (not threaded) */ static const char *yn_quitchars = " \n\r"; static const char *yn_choices; /* string of acceptable input */ static char yn_def; static char yn_return; /* return value */ static char yn_esc_map; /* ESC maps to this char. */ static Widget yn_popup; /* popup for the yn fuction (created once) */ static Widget yn_label; /* label for yn function (created once) */ static boolean yn_getting_num; /* TRUE if accepting digits */ static int yn_ndigits; /* digit count */ static long yn_val; /* accumulated value */ static const char yn_translations[] = "#override\n\ : yn_key()"; /* * Convert the given key event into a character. If the key maps to * more than one character only the first is returned. If there is * no conversion (i.e. just the CTRL key hit) a NUL is returned. */ char key_event_to_char(key) XKeyEvent *key; { char keystring[MAX_KEY_STRING]; int nbytes; boolean meta = !!(key->state & Mod1Mask); nbytes = XLookupString(key, keystring, MAX_KEY_STRING, (KeySym *)0, (XComposeStatus *)0); /* Modifier keys return a zero lengh string when pressed. */ if (nbytes == 0) return '\0'; return (char) (((int) keystring[0]) + (meta ? 0x80 : 0)); } /* * Called when we get a WM_DELETE_WINDOW event on a yn window. */ /* ARGSUSED */ static void yn_delete(w, event, params, num_params) Widget w; XEvent *event; String *params; Cardinal *num_params; { yn_getting_num = FALSE; /* Only use yn_esc_map if we have choices. Otherwise, return ESC. */ yn_return = yn_choices ? yn_esc_map : '\033'; exit_x_event = TRUE; /* exit our event handler */ } /* * Called when we get a key press event on a yn window. */ /* ARGSUSED */ static void yn_key(w, event, params, num_params) Widget w; XEvent *event; String *params; Cardinal *num_params; { char ch; if(appResources.slow && !input_func) map_input(w, event, params, num_params); ch = key_event_to_char((XKeyEvent *) event); if (ch == '\0') { /* don't accept nul char or modifier event */ /* no bell */ return; } if (!yn_choices) { /* accept any input */ yn_return = ch; } else { ch = lowc(ch); /* move to lower case */ if (ch == '\033') { yn_getting_num = FALSE; yn_return = yn_esc_map; } else if (index(yn_quitchars, ch)) { yn_return = yn_def; } else if (index(yn_choices, ch)) { if (ch == '#') { if (yn_getting_num) { /* don't select again */ X11_nhbell(); return; } yn_getting_num = TRUE; yn_ndigits = 0; yn_val = 0; return; /* wait for more input */ } yn_return = ch; if (ch != 'y') yn_getting_num = FALSE; } else { if (yn_getting_num) { if (digit(ch)) { yn_ndigits++; yn_val = (yn_val * 10) + (long) (ch - '0'); return; /* wait for more input */ } if (yn_ndigits && (ch == '\b' || ch == 127/*DEL*/)) { yn_ndigits--; yn_val = yn_val/ 10; return; /* wait for more input */ } } X11_nhbell(); /* no match */ return; } if (yn_getting_num) { yn_return = '#'; if (yn_val < 0) yn_val = 0; yn_number = yn_val; /* assign global */ } } exit_x_event = TRUE; /* exit our event handler */ } char X11_yn_function(ques, choices, def) const char *ques; const char *choices; char def; { static Boolean need_to_init = True; char buf[QBUFSZ]; Arg args[4]; Cardinal num_args; yn_choices = choices; /* set up globals for callback to use */ yn_def = def; /* * This is sort of a kludge. There are quite a few places in the main * nethack code where a pline containing information is followed by a * call to yn_function(). There is no flush of the message window * (it is implicit in the tty window port), so the line never shows * up for us! Solution: do our own flush. */ if (WIN_MESSAGE != WIN_ERR) display_message_window(&window_list[WIN_MESSAGE]); if (choices) { char *cb, choicebuf[QBUFSZ]; Strcpy(choicebuf, choices); /* anything beyond is hidden */ if ((cb = index(choicebuf, '\033')) != 0) *cb = '\0'; /* ques [choices] (def) */ if ((int)(1 + strlen(ques) + 2 + strlen(choicebuf) + 4) >= QBUFSZ) panic("yn_function: question too long"); Sprintf(buf, "%s [%s] ", ques, choicebuf); if (def) Sprintf(eos(buf), "(%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 { if ((int)(1 + strlen(ques)) >= QBUFSZ) panic("yn_function: question too long"); Strcpy(buf, ques); } if (!appResources.slow && need_to_init) { need_to_init = False; XtSetArg(args[0], XtNallowShellResize, True); yn_popup = XtCreatePopupShell("query", transientShellWidgetClass, toplevel, args, ONE); XtOverrideTranslations(yn_popup, XtParseTranslationTable("WM_PROTOCOLS: yn_delete()")); num_args = 0; XtSetArg(args[num_args], XtNtranslations, XtParseTranslationTable(yn_translations)); num_args++; yn_label = XtCreateManagedWidget("yn_label", labelWidgetClass, yn_popup, args, num_args); XtRealizeWidget(yn_popup); XSetWMProtocols(XtDisplay(yn_popup), XtWindow(yn_popup), &wm_delete_window, 1); } if(appResources.slow) input_func = yn_key; num_args = 0; XtSetArg(args[num_args], XtNlabel, buf); num_args++; XtSetValues(yn_label, args, num_args); if(!appResources.slow) { /* * Due to some kind of weird bug in the X11R4 and X11R5 shell, we * need to set the label twice to get the size to change. */ num_args = 0; XtSetArg(args[num_args], XtNlabel, buf); num_args++; XtSetValues(yn_label, args, num_args); positionpopup(yn_popup, TRUE); nh_XtPopup(yn_popup, (int)XtGrabExclusive, yn_label); } yn_getting_num = FALSE; (void) x_event(EXIT_ON_EXIT); if(appResources.slow) { input_func = 0; num_args = 0; XtSetArg(args[num_args], XtNlabel, " "); num_args++; XtSetValues(yn_label, args, num_args); } else { nh_XtPopdown(yn_popup); /* this removes the event grab */ } return yn_return; } /* End global functions ==================================================== */ /* * Before we wait for input via nhgetch() and nh_poskey(), we need to * do some pre-processing. */ static int input_event(exit_condition) int exit_condition; { if (WIN_STATUS != WIN_ERR) /* hilighting on the fancy status window */ check_turn_events(); if (WIN_MAP != WIN_ERR) /* make sure cursor is not clipped */ check_cursor_visibility(&window_list[WIN_MAP]); if (WIN_MESSAGE != WIN_ERR) /* reset pause line */ set_last_pause(&window_list[WIN_MESSAGE]); return x_event(exit_condition); } /*ARGSUSED*/ void msgkey(w, data, event) Widget w; XtPointer data; XEvent *event; { Cardinal num = 0; map_input(window_list[WIN_MAP].w, event, (String*) 0, &num); } /*ARGSUSED*/ static void win_visible(w, data, event, flag) /* only called for autofocus */ Widget w; XtPointer data; /* client_data not used */ XEvent *event; Boolean *flag; /* continue_to_dispatch flag not used */ { XVisibilityEvent *vis_event = (XVisibilityEvent *)event; if (vis_event->state != VisibilityFullyObscured) { /* one-time operation; cancel ourself */ XtRemoveEventHandler(toplevel, VisibilityChangeMask, False, win_visible, (XtPointer) 0); /* grab initial input focus */ XSetInputFocus(XtDisplay(w), XtWindow(w), RevertToNone, CurrentTime); } } /* * Set up the playing console. This has three major parts: the * message window, the map, and the status window. */ static void init_standard_windows() { Widget form, message_viewport, map_viewport, status; Arg args[8]; Cardinal num_args; Dimension message_vp_width, map_vp_width, status_width, max_width; int map_vp_hd, status_hd; struct xwindow *wp; num_args = 0; XtSetArg(args[num_args], XtNallowShellResize, True); num_args++; form = XtCreateManagedWidget(DEF_GAME_NAME, panedWidgetClass, toplevel, args, num_args); XtAddEventHandler(form, KeyPressMask, False, (XtEventHandler) msgkey, (XtPointer) 0); if (appResources.autofocus) XtAddEventHandler(toplevel, VisibilityChangeMask, False, win_visible, (XtPointer) 0); /* * Create message window. */ WIN_MESSAGE = message_win = find_free_window(); wp = &window_list[message_win]; wp->cursx = wp->cursy = wp->pixel_width = wp->pixel_height = 0; wp->popup = (Widget) 0; create_message_window(wp, FALSE, form); message_viewport = XtParent(wp->w); /* Tell the form that contains it that resizes are OK. */ num_args = 0; XtSetArg(args[num_args], XtNresizable, True); num_args++; XtSetArg(args[num_args], XtNleft, XtChainLeft); num_args++; XtSetArg(args[num_args], XtNtop, XtChainTop); num_args++; XtSetValues(message_viewport, args, num_args); if(appResources.slow) { num_args = 0; XtSetArg(args[num_args], XtNtranslations, XtParseTranslationTable(yn_translations)); num_args++; yn_label = XtCreateManagedWidget("yn_label", labelWidgetClass, form, args, num_args); num_args = 0; XtSetArg(args[num_args], XtNfromVert, message_viewport); num_args++; XtSetArg(args[num_args], XtNjustify, XtJustifyLeft); num_args++; XtSetArg(args[num_args], XtNresizable, True); num_args++; XtSetArg(args[num_args], XtNlabel, " "); num_args++; XtSetValues(yn_label, args, num_args); } /* * Create the map window & viewport and chain the viewport beneath the * message_viewport. */ map_win = find_free_window(); wp = &window_list[map_win]; wp->cursx = wp->cursy = wp->pixel_width = wp->pixel_height = 0; wp->popup = (Widget) 0; create_map_window(wp, FALSE, form); map_viewport = XtParent(wp->w); /* Chain beneath message_viewport or yn window. */ num_args = 0; if(appResources.slow) { XtSetArg(args[num_args], XtNfromVert, yn_label); num_args++; } else { XtSetArg(args[num_args], XtNfromVert, message_viewport);num_args++; } XtSetArg(args[num_args], XtNbottom, XtChainBottom); num_args++; XtSetValues(map_viewport, args, num_args); /* Create the status window, with the form as it's parent. */ status_win = find_free_window(); wp = &window_list[status_win]; wp->cursx = wp->cursy = wp->pixel_width = wp->pixel_height = 0; wp->popup = (Widget) 0; create_status_window(wp, FALSE, form); status = wp->w; /* * Chain the status window beneath the viewport. Mark the left and right * edges so that they stay a fixed distance from the left edge of the * parent, as well as the top and bottom edges so that they stay a fixed * distance from the bottom of the parent. We do this so that the status * will never expand or contract. */ num_args = 0; XtSetArg(args[num_args], XtNfromVert, map_viewport); num_args++; XtSetArg(args[num_args], XtNleft, XtChainLeft); num_args++; XtSetArg(args[num_args], XtNright, XtChainLeft); num_args++; XtSetArg(args[num_args], XtNtop, XtChainBottom); num_args++; XtSetArg(args[num_args], XtNbottom, XtChainBottom); num_args++; XtSetValues(status, args, num_args); /* * Realize the popup so that the status widget knows it's size. * * If we unset MappedWhenManaged then the DECwindow driver doesn't * attach the nethack toplevel to the highest virtual root window. * So don't do it. */ /* XtSetMappedWhenManaged(toplevel, False); */ XtRealizeWidget(toplevel); wm_delete_window = XInternAtom(XtDisplay(toplevel), "WM_DELETE_WINDOW", False); XSetWMProtocols(XtDisplay(toplevel), XtWindow(toplevel), &wm_delete_window, 1); /* * Resize to at most full-screen. */ { #define TITLEBAR_SPACE 18 /* Leave SOME screen for window decorations */ int screen_width = WidthOfScreen(XtScreen(wp->w)); int screen_height = HeightOfScreen(XtScreen(wp->w)) - TITLEBAR_SPACE; Dimension form_width, form_height; XtSetArg(args[0], XtNwidth, &form_width); XtSetArg(args[1], XtNheight, &form_height); XtGetValues(toplevel, args, TWO); if (form_width > screen_width || form_height > screen_height) { XtSetArg(args[0], XtNwidth, min(form_width,screen_width)); XtSetArg(args[1], XtNheight, min(form_height,screen_height)); XtSetValues(toplevel, args, TWO); XMoveWindow(XtDisplay(toplevel),XtWindow(toplevel), 0, TITLEBAR_SPACE); } #undef TITLEBAR_SPACE } post_process_tiles(); /* after toplevel is realized */ /* * Now get the default widths of the windows. */ XtSetArg(args[0], XtNwidth, &message_vp_width); XtGetValues(message_viewport, args, ONE); XtSetArg(args[0], XtNwidth, &map_vp_width); XtSetArg(args[1], XtNhorizDistance, &map_vp_hd); XtGetValues(map_viewport, args, TWO); XtSetArg(args[0], XtNwidth, &status_width); XtSetArg(args[1], XtNhorizDistance, &status_hd); XtGetValues(status, args, TWO); /* * Adjust positions and sizes. The message viewport widens out to the * widest width. Both the map and status are centered by adjusting * their horizDistance. */ if (map_vp_width < status_width || map_vp_width < message_vp_width) { if (status_width > message_vp_width) { XtSetArg(args[0], XtNwidth, status_width); XtSetValues(message_viewport, args, ONE); max_width = status_width; } else { /***** The status display looks better when left justified. XtSetArg(args[0], XtNhorizDistance, status_hd+((message_vp_width-status_width)/2)); XtSetValues(status, args, ONE); *****/ max_width = message_vp_width; } XtSetArg(args[0], XtNhorizDistance, map_vp_hd+((int)(max_width-map_vp_width)/2)); XtSetValues(map_viewport, args, ONE); } else { /* map is widest */ XtSetArg(args[0], XtNwidth, map_vp_width); XtSetValues(message_viewport, args, ONE); /***** The status display looks better when left justified. XtSetArg(args[0], XtNhorizDistance, status_hd+((map_vp_width-status_width)/2)); XtSetValues(status, args, ONE); *****/ } /* * Clear all data values on the fancy status widget so that the values * used for spacing don't appear. This needs to be called some time * after the fancy status widget is realized (above, with the game popup), * but before it is popped up. */ null_out_status(); /* * Set the map size to its standard size. As with the message window * above, the map window needs to be set to its constrained size until * its parent (the viewport widget) was realized. * * Move the message window's slider to the bottom. */ set_map_size(&window_list[map_win], COLNO, ROWNO); set_message_slider(&window_list[message_win]); /* attempt to catch fatal X11 errors before the program quits */ (void) XtAppSetErrorHandler(app_context, (XtErrorHandler) hangup); /* We can now print to the message window. */ iflags.window_inited = 1; } void nh_XtPopup(w, g, childwid) Widget w; /* widget */ int g; /* type of grab */ Widget childwid; /* child to recieve focus (can be None) */ { XtPopup(w, (XtGrabKind)g); XSetWMProtocols(XtDisplay(w), XtWindow(w), &wm_delete_window, 1); if (appResources.autofocus) XtSetKeyboardFocus(toplevel, childwid); } void nh_XtPopdown(w) Widget w; { XtPopdown(w); if (appResources.autofocus) XtSetKeyboardFocus(toplevel, None); } void win_X11_init() { #ifdef OPENWINBUG /* With the OpenWindows 3.0 libraries and the SunOS 4.1.2 ld, these * two routines will not be found when linking. An apparently correct * executable is produced, along with nasty messages and a failure code * returned to make. The routines are in the static libXmu.a and * libXmu.sa.4.0, but not in libXmu.so.4.0. Rather than fiddle with * static linking, we do this. */ if (rn2(2) > 2) { /* i.e., FALSE that an optimizer probably can't find */ get_wmShellWidgetClass(); get_applicationShellWidgetClass(); } #endif return; } /* Callback * Scroll a viewport, using standard NH 1,2,3,4,6,7,8,9 directions. */ /*ARGSUSED*/ void nh_keyscroll(viewport, event, params, num_params) Widget viewport; XEvent *event; String *params; Cardinal *num_params; { Arg arg[2]; Widget horiz_sb, vert_sb; float top, shown; Boolean do_call; int direction; Cardinal in_nparams = (num_params ? *num_params : 0); if (in_nparams != 1) return; /* bad translation */ direction=atoi(params[0]); horiz_sb = XtNameToWidget(viewport, "*horizontal"); vert_sb = XtNameToWidget(viewport, "*vertical"); if (!horiz_sb && !vert_sb) { /* Perhaps the widget enclosing this has scrollbars (could use while) */ Widget parent=XtParent(viewport); if (parent) { horiz_sb = XtNameToWidget(parent, "horizontal"); vert_sb = XtNameToWidget(parent, "vertical"); } } #define H_DELTA 0.25 /* distance of horiz shift */ /* vert shift is half of curr distance */ /* The V_DELTA is 1/2 the value of shown. */ if (horiz_sb) { XtSetArg(arg[0], XtNshown, &shown); XtSetArg(arg[1], XtNtopOfThumb, &top); XtGetValues(horiz_sb, arg, TWO); do_call = True; switch (direction) { case 1: case 4: case 7: top -= H_DELTA; if (top < 0.0) top = 0.0; break; case 3: case 6: case 9: top += H_DELTA; if (top + shown > 1.0) top = 1.0 - shown; break; default: do_call = False; } if (do_call) { XtCallCallbacks(horiz_sb, XtNjumpProc, &top); } } if (vert_sb) { XtSetArg(arg[0], XtNshown, &shown); XtSetArg(arg[1], XtNtopOfThumb, &top); XtGetValues(vert_sb, arg, TWO); do_call = True; switch (direction) { case 7: case 8: case 9: top -= shown / 2.0; if (top < 0.0) top = 0; break; case 1: case 2: case 3: top += shown / 2.0; if (top + shown > 1.0) top = 1.0 - shown; break; default: do_call = False; } if (do_call) { XtCallCallbacks(vert_sb, XtNjumpProc, &top); } } } /*winX.c*/ slashem-0.0.7E7F3/win/X11/dialogs.c0000664000076400007640000002567410545462317014626 0ustar aliali/* * Copyright 1991 University of Wisconsin-Madison * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of the University of Wisconsin-Madison not * be used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. The University of * Wisconsin-Madison makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * THE UNIVERSITY OF WISCONSIN-MADISON DISCLAIMS ALL WARRANTIES WITH REGARD TO * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS, IN NO EVENT SHALL THE UNIVERSITY OF WISCONSIN-MADISON BE LIABLE FOR * ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Tim Theisen Department of Computer Sciences * tim@cs.wisc.edu University of Wisconsin-Madison * uwvax!tim 1210 West Dayton Street * (608)262-0438 Madison, WI 53706 * * * Modified 12/91 by Dean Luick. Tim graciously donated this piece of code * from his program ghostview, an X11 front end for ghostscript. * * + Make the cancel button optional. * + Put an #ifdef SPECIAL_CMAP around code to fix a colormap bug. * We don't need it here. * + Add the function positionpopup() from another part of ghostview * to this code. * * Modified 2/93, Various. * + Added workaround for SYSV include problem. * + Changed the default width response text widget to be as wide as the * window itself. Suggestion from David E. Wexelblat, dwex@goblin.org. */ #ifndef SYSV #define PRESERVE_NO_SYSV /* X11 include files may define SYSV */ #endif #include #include #include #include #include #include #include #include #ifdef PRESERVE_NO_SYSV # ifdef SYSV # undef SYSV # endif # undef PRESERVE_NO_SYSV #endif #include "config.h" /* #define for const for non __STDC__ compilers */ /* ":" added to both translations below to allow limited redefining of * keysyms before testing for keysym values -- dlc */ static const char okay_accelerators[] = "#override\n\ :Return: set() notify() unset()\n"; static const char cancel_accelerators[] = "#override\n\ :Escape: set() notify() unset()\n\ :[: set() notify() unset()\n"; /* for keyboards w/o an ESC */ /* Create a dialog widget. It is just a form widget with * a label prompt * a text response * an okay button * an optional cancel button */ Widget CreateDialog(parent, name, okay_callback, cancel_callback) Widget parent; String name; XtCallbackProc okay_callback; XtCallbackProc cancel_callback; { Widget form, prompt, response, okay, cancel; Arg args[20]; Cardinal num_args; num_args = 0; #ifdef SPECIAL_CMAP if (special_cmap) { XtSetArg(args[num_args], XtNbackground, white); num_args++; } #endif form = XtCreateManagedWidget(name, formWidgetClass, parent, args, num_args); num_args = 0; #ifdef SPECIAL_CMAP if (special_cmap) { XtSetArg(args[num_args], XtNforeground, black); num_args++; XtSetArg(args[num_args], XtNbackground, white); num_args++; } #endif XtSetArg(args[num_args], XtNtop, XtChainTop); num_args++; XtSetArg(args[num_args], XtNbottom, XtChainTop); num_args++; XtSetArg(args[num_args], XtNleft, XtChainLeft); num_args++; XtSetArg(args[num_args], XtNright, XtChainLeft); num_args++; XtSetArg(args[num_args], XtNresizable, True); num_args++; XtSetArg(args[num_args], XtNborderWidth, 0); num_args++; prompt = XtCreateManagedWidget("prompt", labelWidgetClass, form, args, num_args); num_args = 0; #ifdef SPECIAL_CMAP if (special_cmap) { XtSetArg(args[num_args], XtNforeground, black); num_args++; XtSetArg(args[num_args], XtNbackground, white); num_args++; } #endif XtSetArg(args[num_args], XtNfromVert, prompt); num_args++; XtSetArg(args[num_args], XtNtop, XtChainTop); num_args++; XtSetArg(args[num_args], XtNbottom, XtChainTop); num_args++; XtSetArg(args[num_args], XtNleft, XtChainLeft); num_args++; XtSetArg(args[num_args], XtNright, XtChainLeft); num_args++; XtSetArg(args[num_args], XtNresizable, True); num_args++; XtSetArg(args[num_args], XtNeditType, XawtextEdit); num_args++; XtSetArg(args[num_args], XtNresize, XawtextResizeWidth); num_args++; XtSetArg(args[num_args], XtNstring, ""); num_args++; response = XtCreateManagedWidget("response", asciiTextWidgetClass, form, args, num_args); num_args = 0; #ifdef SPECIAL_CMAP if (special_cmap) { XtSetArg(args[num_args], XtNforeground, black); num_args++; XtSetArg(args[num_args], XtNbackground, white); num_args++; } #endif XtSetArg(args[num_args], XtNfromVert, response); num_args++; XtSetArg(args[num_args], XtNtop, XtChainTop); num_args++; XtSetArg(args[num_args], XtNbottom, XtChainTop); num_args++; XtSetArg(args[num_args], XtNleft, XtChainLeft); num_args++; XtSetArg(args[num_args], XtNright, XtChainLeft); num_args++; XtSetArg(args[num_args], XtNresizable, True); num_args++; XtSetArg(args[num_args], XtNaccelerators, XtParseAcceleratorTable(okay_accelerators)); num_args++; okay = XtCreateManagedWidget("okay", commandWidgetClass, form, args, num_args); XtAddCallback(okay, XtNcallback, okay_callback, form); /* Only create cancel button if there is a callback for it. */ if (cancel_callback) { num_args = 0; #ifdef SPECIAL_CMAP if (special_cmap) { XtSetArg(args[num_args], XtNforeground, black); num_args++; XtSetArg(args[num_args], XtNbackground, white); num_args++; } #endif XtSetArg(args[num_args], XtNfromVert, response); num_args++; XtSetArg(args[num_args], XtNfromHoriz, okay); num_args++; XtSetArg(args[num_args], XtNtop, XtChainTop); num_args++; XtSetArg(args[num_args], XtNbottom, XtChainTop); num_args++; XtSetArg(args[num_args], XtNleft, XtChainLeft); num_args++; XtSetArg(args[num_args], XtNright, XtChainLeft); num_args++; XtSetArg(args[num_args], XtNresizable, True); num_args++; XtSetArg(args[num_args], XtNaccelerators, XtParseAcceleratorTable(cancel_accelerators)); num_args++; cancel = XtCreateManagedWidget("cancel", commandWidgetClass, form, args, num_args); XtAddCallback(cancel, XtNcallback, cancel_callback, form); XtInstallAccelerators(response, cancel); } XtInstallAccelerators(response, okay); XtSetKeyboardFocus(form, response); return form; } #if 0 /* get the prompt from the dialog box. Used a startup time to * save away the initial prompt */ String GetDialogPrompt(w) Widget w; { Arg args[1]; Widget label; String s; label = XtNameToWidget(w, "prompt"); XtSetArg(args[0], XtNlabel, &s); XtGetValues(label, args, ONE); return XtNewString(s); } #endif /* set the prompt. This is used to put error information in the prompt */ void SetDialogPrompt(w, newprompt) Widget w; String newprompt; { Arg args[1]; Widget label; label = XtNameToWidget(w, "prompt"); XtSetArg(args[0], XtNlabel, newprompt); XtSetValues(label, args, ONE); } /* get what the user typed; caller must free the response */ String GetDialogResponse(w) Widget w; { Arg args[1]; Widget response; String s; response = XtNameToWidget(w, "response"); XtSetArg(args[0], XtNstring, &s); XtGetValues(response, args, ONE); return XtNewString(s); } #define max(a,b) (((a) > (b)) ? (a) : (b)) /* set the default reponse */ void SetDialogResponse(w, s) Widget w; String s; { Arg args[4]; Widget response; XFontStruct *font; Dimension width, nwidth, leftMargin, rightMargin; response = XtNameToWidget(w, "response"); XtSetArg(args[0], XtNfont, &font); XtSetArg(args[1], XtNleftMargin, &leftMargin); XtSetArg(args[2], XtNrightMargin, &rightMargin); XtSetArg(args[3], XtNwidth, &width); XtGetValues(response, args, FOUR); /* width includes margins as per Xaw documentation */ nwidth = (font->max_bounds.width * strlen(s))+leftMargin+rightMargin; if (nwidth < width) nwidth = width; XtSetArg(args[0], XtNstring, s); XtSetArg(args[1], XtNwidth, nwidth); XtSetValues(response, args, TWO); XawTextSetInsertionPoint(response, strlen(s)); } #if 0 /* clear the response */ void ClearDialogResponse(w) Widget w; { Arg args[2]; Widget response; response = XtNameToWidget(w, "response"); XtSetArg(args[0], XtNstring, ""); XtSetArg(args[1], XtNwidth, 100); XtSetValues(response, args, TWO); } #endif /* Not a part of the original dialogs.c from ghostview --------------------- */ /* position popup window under the cursor */ void positionpopup(w, bottom) Widget w; boolean bottom; /* position y on bottom? */ { Arg args[3]; Cardinal num_args; Dimension width, height, b_width; int x, y, max_x, max_y; Window root, child; XSizeHints *hints; int dummyx, dummyy; unsigned int dummymask; extern Widget toplevel; /* following line deals with a race condition w/brain-damaged WM's -dlc */ XtUnrealizeWidget(w); XQueryPointer(XtDisplay(toplevel), XtWindow(toplevel), &root, &child, &x, &y, &dummyx, &dummyy, &dummymask); num_args = 0; XtSetArg(args[num_args], XtNwidth, &width); num_args++; XtSetArg(args[num_args], XtNheight, &height); num_args++; XtSetArg(args[num_args], XtNborderWidth, &b_width); num_args++; XtGetValues(w, args, num_args); /* position so that the cursor is center,center or center,bottom */ width += 2 * b_width; x -= ( (Position) width/2 ); if (x < 0) x = 0; if ( x > (max_x = (Position) (XtScreen(w)->width - width)) ) x = max_x; if (bottom) { y -= (height+b_width-1); height += 2 * b_width; } else { height += 2 * b_width; y -= ( (Position) height/2 ); } if (y < 0) y = 0; if ( y > (max_y = (Position) (XtScreen(w)->height - height)) ) y = max_y; num_args = 0; XtSetArg(args[num_args], XtNx, x); num_args++; XtSetArg(args[num_args], XtNy, y); num_args++; XtSetValues(w, args, num_args); /* Some older window managers ignore XtN{x,y}; hint the same values */ /* The {x,y} are not used by newer window managers; older ones need them */ XtRealizeWidget(w); hints = XAllocSizeHints(); hints->flags = USPosition; hints->x = x; hints->y = y; XSetWMNormalHints(XtDisplay(w), XtWindow(w), hints); XFree(hints); } slashem-0.0.7E7F3/win/X11/pet_mark.xbm0000664000076400007640000000045010545462317015333 0ustar aliali#define pet_mark_width 16 #define pet_mark_height 16 static unsigned char pet_mark_bits[] = { 0x00, 0x00, 0x6c, 0x00, 0xfe, 0x00, 0xfe, 0x00, 0x7c, 0x00, 0x38, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; slashem-0.0.7E7F3/win/X11/nh32icon0000664000076400007640000000212210545462317014365 0ustar aliali/* 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. */ /* 32x32 X11 icon for NetHack. */ #define nh32icon_width 32 #define nh32icon_height 32 static unsigned char nh32icon_bits[] = { 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, 0xc1, 0x1f, 0x80, 0x81, 0x81, 0x0f, 0x80, 0x81, 0x01, 0x07, 0x00, 0x81, 0x01, 0xc0, 0x03, 0x80, 0xff, 0x7f, 0xfe, 0xff}; slashem-0.0.7E7F3/win/X11/Window.c0000664000076400007640000001225210545462317014437 0ustar aliali/* SCCS Id: @(#)Window.c 3.4 1993/02/02 */ /* Copyright (c) Dean Luick, 1992 */ /* NetHack may be freely redistributed. See license for details. */ /* * Data structures and support routines for the Window widget. This is a * drawing canvas with 16 colors and one font. */ #ifndef SYSV #define PRESERVE_NO_SYSV /* X11 include files may define SYSV */ #endif #ifdef MSDOS /* from compiler */ #define SHORT_FILENAMES #endif #ifdef SHORT_FILENAMES #include #else #include #endif #include #ifdef PRESERVE_NO_SYSV # ifdef SYSV # undef SYSV # endif # undef PRESERVE_NO_SYSV #endif #include "xwindowp.h" #include "config.h" static XtResource resources[] = { #define offset(field) XtOffset(WindowWidget, window.field) /* {name, class, type, size, offset, default_type, default_addr}, */ { XtNrows, XtCRows, XtRDimension, sizeof(Dimension), offset(rows), XtRImmediate, (XtPointer) 21}, { XtNcolumns, XtCColumns, XtRDimension, sizeof(Dimension), offset(columns), XtRImmediate, (XtPointer) 80}, { XtNforeground, XtCForeground, XtRPixel, sizeof(Pixel), offset(foreground), XtRString, XtDefaultForeground }, { XtNblack, XtCColor, XtRPixel, sizeof(Pixel), offset(black), XtRString, "black"}, { XtNred, XtCColor, XtRPixel, sizeof(Pixel), offset(red), XtRString, "red" }, { XtNgreen, XtCColor, XtRPixel, sizeof(Pixel), offset(green), XtRString, "pale green" }, { XtNbrown, XtCColor, XtRPixel, sizeof(Pixel), offset(brown), XtRString, "brown" }, { XtNblue, XtCColor, XtRPixel, sizeof(Pixel), offset(blue), XtRString, "blue" }, { XtNmagenta, XtCColor, XtRPixel, sizeof(Pixel), offset(magenta), XtRString, "magenta" }, { XtNcyan, XtCColor, XtRPixel, sizeof(Pixel), offset(cyan), XtRString, "light cyan" }, { XtNgray, XtCColor, XtRPixel, sizeof(Pixel), offset(gray), XtRString, "gray" }, { XtNorange, XtCColor, XtRPixel, sizeof(Pixel), offset(orange), XtRString, "orange" }, { XtNbright_green, XtCColor, XtRPixel, sizeof(Pixel), offset(bright_green), XtRString, "green" }, { XtNyellow, XtCColor, XtRPixel, sizeof(Pixel), offset(yellow), XtRString, "yellow" }, { XtNbright_blue, XtCColor, XtRPixel, sizeof(Pixel), offset(bright_blue), XtRString, "royal blue" }, { XtNbright_magenta, XtCColor, XtRPixel, sizeof(Pixel), offset(bright_magenta), XtRString, "violet" }, { XtNbright_cyan, XtCColor, XtRPixel, sizeof(Pixel), offset(bright_cyan), XtRString, "cyan" }, { XtNwhite, XtCColor, XtRPixel, sizeof(Pixel), offset(white), XtRString, "white" }, { XtNfont, XtCFont, XtRFontStruct, sizeof(XFontStruct *), offset(font), XtRString, XtDefaultFont }, { XtNexposeCallback, XtCCallback, XtRCallback, sizeof(XtCallbackList), offset(expose_callback), XtRCallback, (char *)0 }, { XtNcallback, XtCCallback, XtRCallback, sizeof(XtCallbackList), offset(input_callback), XtRCallback, (char *)0 }, { XtNresizeCallback, XtCCallback, XtRCallback, sizeof(XtCallbackList), offset(resize_callback), XtRCallback, (char *)0 }, #undef offset }; /* ARGSUSED */ static void no_op(w, event, params, num_params) Widget w; /* unused */ XEvent *event; /* unused */ String *params; /* unused */ Cardinal *num_params; /* unused */ { } static XtActionsRec actions[] = { {"no-op", no_op}, }; static char translations[] = ": input() \ "; /* ARGSUSED */ static void Redisplay(w, event, region) Widget w; XEvent *event; Region region; /* unused */ { /* This isn't correct - we need to call the callback with region. */ XtCallCallbacks(w, XtNexposeCallback, (XtPointer) event); } /* ARGSUSED */ static void Resize(w) Widget w; { XtCallCallbacks(w, XtNresizeCallback, (XtPointer) 0); } WindowClassRec windowClassRec = { { /* core fields */ /* superclass */ (WidgetClass) &widgetClassRec, /* class_name */ "Window", /* widget_size */ sizeof(WindowRec), /* class_initialize */ 0, /* class_part_initialize */ 0, /* class_inited */ FALSE, /* initialize */ 0, /* initialize_hook */ 0, /* realize */ XtInheritRealize, /* actions */ actions, /* num_actions */ XtNumber(actions), /* resources */ resources, /* num_resources */ XtNumber(resources), /* xrm_class */ NULLQUARK, /* compress_motion */ TRUE, /* compress_exposure */ TRUE, /* compress_enterleave */ TRUE, /* visible_interest */ FALSE, /* destroy */ 0, /* resize */ Resize, /* expose */ Redisplay, /* set_values */ 0, /* set_values_hook */ 0, /* set_values_almost */ XtInheritSetValuesAlmost, /* get_values_hook */ 0, /* accept_focus */ 0, /* version */ XtVersion, /* callback_private */ 0, /* tm_table */ translations, /* query_geometry */ XtInheritQueryGeometry, /* display_accelerator */ XtInheritDisplayAccelerator, /* extension */ 0 }, { /* window fields */ /* empty */ 0 } }; WidgetClass windowWidgetClass = (WidgetClass)&windowClassRec; Font WindowFont(w) Widget w; { return ((WindowWidget)w)->window.font->fid; } XFontStruct * WindowFontStruct(w) Widget w; { return ((WindowWidget)w)->window.font; } slashem-0.0.7E7F3/win/X11/winmisc.c0000664000076400007640000006163310545462317014650 0ustar aliali/* SCCS Id: @(#)winmisc.c 3.4 2000/05/21 */ /* Copyright (c) Dean Luick, 1992 */ /* NetHack may be freely redistributed. See license for details. */ /* * Misc. popup windows: player selection and extended commands. * * + Global functions: player_selection() and get_ext_cmd(). */ #ifndef SYSV #define PRESERVE_NO_SYSV /* X11 include files may define SYSV */ #endif #include #include #include #include #include #include #include #include /* for index() */ #include #ifdef PRESERVE_NO_SYSV # ifdef SYSV # undef SYSV # endif # undef PRESERVE_NO_SYSV #endif #include "hack.h" #include "func_tab.h" #include "winX.h" static Widget extended_command_popup = 0; static Widget extended_command_form; static Widget *extended_commands = 0; static int extended_command_selected; /* index of the selected command; */ static int ps_selected; /* index of selected role */ #define PS_RANDOM (-50) #define PS_QUIT (-75) static const char ps_randchars[] = "*@"; static const char ps_quitchars[] = "\033qQ"; #define EC_NCHARS 32 static boolean ec_active = FALSE; static int ec_nchars = 0; static char ec_chars[EC_NCHARS]; static Time ec_time; static const char extended_command_translations[] = "#override\n\ : ec_key()"; static const char player_select_translations[] = "#override\n\ : ps_key()"; static const char race_select_translations[] = "#override\n\ : race_key()"; static const char gend_select_translations[] = "#override\n\ : gend_key()"; static const char algn_select_translations[] = "#override\n\ : algn_key()"; static void FDECL(popup_delete, (Widget, XEvent*, String*, Cardinal*)); static void NDECL(ec_dismiss); static Widget FDECL(make_menu, (const char *,const char *,const char *, const char *,XtCallbackProc, const char *,XtCallbackProc, int,const char **, Widget **, XtCallbackProc,Widget *)); static void NDECL(init_extended_commands_popup); static void FDECL(ps_quit, (Widget,XtPointer,XtPointer)); static void FDECL(ps_random, (Widget,XtPointer,XtPointer)); static void FDECL(ps_select, (Widget,XtPointer,XtPointer)); /* Player Selection -------------------------------------------------------- */ /* ARGSUSED */ static void ps_quit(w, client_data, call_data) Widget w; XtPointer client_data, call_data; { ps_selected = PS_QUIT; exit_x_event = TRUE; /* leave event loop */ } /* ARGSUSED */ static void ps_random(w, client_data, call_data) Widget w; XtPointer client_data, call_data; { ps_selected = PS_RANDOM; exit_x_event = TRUE; /* leave event loop */ } /* ARGSUSED */ static void ps_select(w, client_data, call_data) Widget w; XtPointer client_data, call_data; { ps_selected = (int) client_data; exit_x_event = TRUE; /* leave event loop */ } /* ARGSUSED */ void ps_key(w, event, params, num_params) Widget w; XEvent *event; String *params; Cardinal *num_params; { char ch, *mark; char rolechars[QBUFSZ]; int i; (void)memset(rolechars, '\0', sizeof rolechars); /* for index() */ for (i = 0; roles[i].name.m; ++i) { ch = lowc(*roles[i].name.m); /* if (flags.female && roles[i].name.f) ch = lowc(*roles[i].name.f); */ /* this supports at most two roles with the same first letter */ if (index(rolechars, ch)) ch = highc(ch); rolechars[i] = ch; } ch = key_event_to_char((XKeyEvent *) event); if (ch == '\0') { /* don't accept nul char/modifier event */ /* don't beep */ return; } mark = index(rolechars, ch); if (!mark) mark = index(rolechars, lowc(ch)); if (!mark) mark = index(rolechars, highc(ch)); if (!mark) { if (index(ps_randchars, ch)) ps_selected = PS_RANDOM; else if (index(ps_quitchars, ch)) ps_selected = PS_QUIT; else { X11_nhbell(); /* no such class */ return; } } else ps_selected = (int)(mark - rolechars); exit_x_event = TRUE; } /* ARGSUSED */ void race_key(w, event, params, num_params) Widget w; XEvent *event; String *params; Cardinal *num_params; { char ch, *mark; char racechars[QBUFSZ]; int i; (void)memset(racechars, '\0', sizeof racechars); /* for index() */ for (i = 0; races[i].noun; ++i) { ch = lowc(*races[i].noun); /* this supports at most two races with the same first letter */ if (index(racechars, ch)) ch = highc(ch); racechars[i] = ch; } ch = key_event_to_char((XKeyEvent *) event); if (ch == '\0') { /* don't accept nul char/modifier event */ /* don't beep */ return; } mark = index(racechars, ch); if (!mark) mark = index(racechars, lowc(ch)); if (!mark) mark = index(racechars, highc(ch)); if (!mark) { if (index(ps_randchars, ch)) ps_selected = PS_RANDOM; else if (index(ps_quitchars, ch)) ps_selected = PS_QUIT; else { X11_nhbell(); /* no such race */ return; } } else ps_selected = (int)(mark - racechars); exit_x_event = TRUE; } /* ARGSUSED */ void gend_key(w, event, params, num_params) Widget w; XEvent *event; String *params; Cardinal *num_params; { char ch, *mark; static char gendchars[] = "mf"; ch = key_event_to_char((XKeyEvent *) event); if (ch == '\0') { /* don't accept nul char/modifier event */ /* don't beep */ return; } mark = index(gendchars, ch); if (!mark) mark = index(gendchars, lowc(ch)); if (!mark) { if (index(ps_randchars, ch)) ps_selected = PS_RANDOM; else if (index(ps_quitchars, ch)) ps_selected = PS_QUIT; else { X11_nhbell(); /* no such gender */ return; } } else ps_selected = (int)(mark - gendchars); exit_x_event = TRUE; } /* ARGSUSED */ void algn_key(w, event, params, num_params) Widget w; XEvent *event; String *params; Cardinal *num_params; { char ch, *mark; static char algnchars[] = "LNC"; ch = key_event_to_char((XKeyEvent *) event); if (ch == '\0') { /* don't accept nul char/modifier event */ /* don't beep */ return; } mark = index(algnchars, ch); if (!mark) mark = index(algnchars, highc(ch)); if (!mark) { if (index(ps_randchars, ch)) ps_selected = PS_RANDOM; else if (index(ps_quitchars, ch)) ps_selected = PS_QUIT; else { X11_nhbell(); /* no such alignment */ return; } } else ps_selected = (int)(mark - algnchars); exit_x_event = TRUE; } /* Global functions ========================================================= */ void X11_player_selection() { int num_roles, num_races, num_gends, num_algns, 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); 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"); } Sprintf(qbuf, "Choose your %s Role", s_suffix(plbuf)); popup = make_menu("player_selection", qbuf, player_select_translations, "quit", ps_quit, "random", ps_random, num_roles, choices, (Widget **)0, ps_select, &player_form); ps_selected = -1; positionpopup(popup, FALSE); nh_XtPopup(popup, (int)XtGrabExclusive, player_form); /* The callbacks will enable the event loop exit. */ (void) x_event(EXIT_ON_EXIT); nh_XtPopdown(popup); XtDestroyWidget(popup); free((genericptr_t)choices), choices = 0; if (ps_selected == PS_QUIT) { clearlocks(); X11_exit_nhwindows((char *)0); terminate(0); } else if (ps_selected == PS_RANDOM) { flags.initrole = ROLE_RANDOM; } else if (ps_selected < 0 || ps_selected >= num_roles) { panic("player_selection: bad role select value %d", ps_selected); } else { flags.initrole = ps_selected; } } (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 */ for (num_races = 0; races[num_races].noun; ++num_races) continue; choices = (const char **)alloc(sizeof(char *) * num_races); for (;;) { availcount = availindex = 0; for (i = 0; i < num_races; i++) { choices[i] = 0; if (ok_race(flags.initrole, i, flags.initgend, flags.initalign)) { choices[i] = races[i].noun; ++availcount; availindex = i; /* used iff only one */ } } if (availcount > 0) break; else if (flags.initalign >= 0) flags.initalign = -1; /* reset */ else if (flags.initgend >= 0) flags.initgend = -1; else panic("no available role+RACE+gender+alignment combinations"); } if (availcount == 1) { 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, "random", ps_random, num_races, choices, (Widget **)0, ps_select, &player_form); ps_selected = -1; positionpopup(popup, FALSE); nh_XtPopup(popup, (int)XtGrabExclusive, player_form); /* The callbacks will enable the event loop exit. */ (void) x_event(EXIT_ON_EXIT); nh_XtPopdown(popup); XtDestroyWidget(popup); free((genericptr_t)choices), choices = 0; if (ps_selected == PS_QUIT) { clearlocks(); X11_exit_nhwindows((char *)0); terminate(0); } else if (ps_selected == PS_RANDOM) { flags.initrace = ROLE_RANDOM; } else if (ps_selected < 0 || ps_selected >= num_races) { panic("player_selection: bad race select value %d", ps_selected); } else { flags.initrace = ps_selected; } } /* 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 */ num_gends = 2; /* genders[2] isn't allowed */ choices = (const char **)alloc(sizeof(char *) * num_gends); for (;;) { availcount = availindex = 0; for (i = 0; i < num_gends; i++) { choices[i] = 0; if (ok_gend(flags.initrole, flags.initrace, i, flags.initalign)) { choices[i] = genders[i].adj; ++availcount; availindex = i; /* used iff only one */ } } if (availcount > 0) break; else if (flags.initalign >= 0) flags.initalign = -1; /* reset */ else panic("no available role+race+GENDER+alignment combinations"); } if (availcount == 1) { 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, "random", ps_random, num_gends, choices, (Widget **)0, ps_select, &player_form); ps_selected = -1; positionpopup(popup, FALSE); nh_XtPopup(popup, (int)XtGrabExclusive, player_form); /* The callbacks will enable the event loop exit. */ (void) x_event(EXIT_ON_EXIT); nh_XtPopdown(popup); XtDestroyWidget(popup); free((genericptr_t)choices), choices = 0; if (ps_selected == PS_QUIT) { clearlocks(); X11_exit_nhwindows((char *)0); terminate(0); } else if (ps_selected == PS_RANDOM) { flags.initgend = ROLE_RANDOM; } else if (ps_selected < 0 || ps_selected >= num_gends) { panic("player_selection: bad gender select value %d", ps_selected); } else { flags.initgend = ps_selected; } } /* 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 */ num_algns = 3; /* aligns[3] isn't allowed */ choices = (const char **)alloc(sizeof(char *) * num_algns); for (;;) { availcount = availindex = 0; for (i = 0; i < num_algns; i++) { choices[i] = 0; if (ok_align(flags.initrole, flags.initrace, flags.initgend, i)) { choices[i] = aligns[i].adj; ++availcount; availindex = i; /* used iff only one */ } } if (availcount > 0) break; else panic("no available role+race+gender+ALIGNMENT combinations"); } if (availcount == 1) { 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, "random", ps_random, num_algns, choices, (Widget **)0, ps_select, &player_form); ps_selected = -1; positionpopup(popup, FALSE); nh_XtPopup(popup, (int)XtGrabExclusive, player_form); /* The callbacks will enable the event loop exit. */ (void) x_event(EXIT_ON_EXIT); nh_XtPopdown(popup); XtDestroyWidget(popup); free((genericptr_t)choices), choices = 0; if (ps_selected == PS_QUIT) { clearlocks(); X11_exit_nhwindows((char *)0); terminate(0); } else if (ps_selected == PS_RANDOM) { flags.initalign = ROLE_RANDOM; } else if (ps_selected < 0 || ps_selected >= num_algns) { panic("player_selection: bad alignment select value %d", ps_selected); } else { flags.initalign = ps_selected; } } /* more than one alignment choice available */ } } int X11_get_ext_cmd() { static Boolean initialized = False; if (!initialized) { init_extended_commands_popup(); initialized = True; } extended_command_selected = -1; /* reset selected value */ positionpopup(extended_command_popup, FALSE); /* center on cursor */ nh_XtPopup(extended_command_popup, (int)XtGrabExclusive, extended_command_form); /* The callbacks will enable the event loop exit. */ (void) x_event(EXIT_ON_EXIT); return extended_command_selected; } /* End global functions ===================================================== */ /* Extended Command -------------------------------------------------------- */ /* ARGSUSED */ static void extend_select(w, client_data, call_data) Widget w; XtPointer client_data, call_data; { int selected = (int) client_data; if (extended_command_selected != selected) { /* visibly deselect old one */ if (extended_command_selected >= 0) swap_fg_bg(extended_commands[extended_command_selected]); /* select new one */ swap_fg_bg(extended_commands[selected]); extended_command_selected = selected; } nh_XtPopdown(extended_command_popup); /* reset colors while popped down */ swap_fg_bg(extended_commands[extended_command_selected]); ec_active = FALSE; exit_x_event = TRUE; /* leave event loop */ } /* ARGSUSED */ static void extend_dismiss(w, client_data, call_data) Widget w; XtPointer client_data, call_data; { ec_dismiss(); } /* ARGSUSED */ static void extend_help(w, client_data, call_data) Widget w; XtPointer client_data, call_data; { /* We might need to make it known that we already have one listed. */ (void) doextlist(); } /* ARGSUSED */ void ec_delete(w, event, params, num_params) Widget w; XEvent *event; String *params; Cardinal *num_params; { if (w == extended_command_popup) { ec_dismiss(); } else { popup_delete(w, event, params, num_params); } } /* ARGSUSED */ static void popup_delete(w, event, params, num_params) Widget w; XEvent *event; String *params; Cardinal *num_params; { ps_selected = PS_QUIT; nh_XtPopdown(w); exit_x_event = TRUE; /* leave event loop */ } static void ec_dismiss() { /* unselect while still visible */ if (extended_command_selected >= 0) swap_fg_bg(extended_commands[extended_command_selected]); extended_command_selected = -1; /* dismiss */ nh_XtPopdown(extended_command_popup); ec_active = FALSE; exit_x_event = TRUE; /* leave event loop */ } /* ARGSUSED */ void ec_key(w, event, params, num_params) Widget w; XEvent *event; String *params; Cardinal *num_params; { char ch; int i; XKeyEvent *xkey = (XKeyEvent *) event; ch = key_event_to_char(xkey); if (ch == '\0') { /* don't accept nul char/modifier event */ /* don't beep */ return; } else if (index("\033\n\r", ch)) { if (ch == '\033') { /* unselect while still visible */ if (extended_command_selected >= 0) swap_fg_bg(extended_commands[extended_command_selected]); extended_command_selected = -1; /* dismiss */ } nh_XtPopdown(extended_command_popup); /* unselect while invisible */ if (extended_command_selected >= 0) swap_fg_bg(extended_commands[extended_command_selected]); exit_x_event = TRUE; /* leave event loop */ ec_active = FALSE; return; } /* too much time has elapsed */ if ((xkey->time - ec_time) > 500) ec_active = FALSE; if (!ec_active) { ec_nchars = 0; ec_active = TRUE; } ec_time = xkey->time; ec_chars[ec_nchars++] = ch; if (ec_nchars >= EC_NCHARS) ec_nchars = EC_NCHARS-1; /* don't overflow */ for (i = 0; extcmdlist[i].ef_txt; i++) { if (extcmdlist[i].ef_txt[0] == '?') continue; if (!strncmp(ec_chars, extcmdlist[i].ef_txt, ec_nchars)) { if (extended_command_selected != i) { /* I should use set() and unset() actions, but how do */ /* I send the an action to the widget? */ if (extended_command_selected >= 0) swap_fg_bg(extended_commands[extended_command_selected]); extended_command_selected = i; swap_fg_bg(extended_commands[extended_command_selected]); } break; } } } /* * Use our own home-brewed version menu because simpleMenu is designed to * be used from a menubox. */ static void init_extended_commands_popup() { int i, num_commands; const char **command_list; /* count commands */ for (num_commands = 0; extcmdlist[num_commands].ef_txt; num_commands++) ; /* do nothing */ /* If the last entry is "help", don't use it. */ if (strcmp(extcmdlist[num_commands-1].ef_txt, "?") == 0) --num_commands; command_list = (const char **) alloc((unsigned)num_commands * sizeof(char *)); for (i = 0; i < num_commands; i++) command_list[i] = extcmdlist[i].ef_txt; extended_command_popup = make_menu("extended_commands", "Extended Commands", extended_command_translations, "dismiss", extend_dismiss, "help", extend_help, num_commands, command_list, &extended_commands, extend_select, &extended_command_form); free((char *)command_list); } /* ------------------------------------------------------------------------- */ /* * Create a popup widget of the following form: * * popup_label * ----------- ------------ * |left_name| |right_name| * ----------- ------------ * ------------------------ * | name1 | * ------------------------ * ------------------------ * | name2 | * ------------------------ * . * . * ------------------------ * | nameN | * ------------------------ */ static Widget make_menu(popup_name, popup_label, popup_translations, left_name, left_callback, right_name, right_callback, num_names, widget_names, command_widgets, name_callback, formp) const char *popup_name; const char *popup_label; const char *popup_translations; const char *left_name; XtCallbackProc left_callback; const char *right_name; XtCallbackProc right_callback; int num_names; const char **widget_names; /* return array of command widgets */ Widget **command_widgets; XtCallbackProc name_callback; Widget *formp; /* return */ { Widget popup, form, label, above, left, right; Widget *commands, *curr; int i; Arg args[8]; Cardinal num_args; Dimension width, max_width; int distance, skip; commands = (Widget *) alloc((unsigned)num_names * sizeof(Widget)); num_args = 0; XtSetArg(args[num_args], XtNallowShellResize, True); num_args++; popup = XtCreatePopupShell(popup_name, transientShellWidgetClass, toplevel, args, num_args); XtOverrideTranslations(popup, XtParseTranslationTable("WM_PROTOCOLS: ec_delete()")); num_args = 0; XtSetArg(args[num_args], XtNtranslations, XtParseTranslationTable(popup_translations)); num_args++; *formp = form = XtCreateManagedWidget("menuform", formWidgetClass, popup, args, num_args); /* Get the default distance between objects in the form widget. */ num_args = 0; XtSetArg(args[num_args], XtNdefaultDistance, &distance); num_args++; XtGetValues(form, args, num_args); /* * Create the label. */ num_args = 0; XtSetArg(args[num_args], XtNborderWidth, 0); num_args++; label = XtCreateManagedWidget(popup_label, labelWidgetClass, form, args, num_args); /* * Create the left button. */ num_args = 0; XtSetArg(args[num_args], XtNfromVert, label); num_args++; /* XtSetArg(args[num_args], XtNshapeStyle, XmuShapeRoundedRectangle); num_args++; */ left = XtCreateManagedWidget(left_name, commandWidgetClass, form, args, num_args); XtAddCallback(left, XtNcallback, left_callback, (XtPointer) 0); skip = 3*distance; /* triple the spacing */ if(!skip) skip = 3; /* * Create right button. */ num_args = 0; XtSetArg(args[num_args], XtNfromHoriz, left); num_args++; XtSetArg(args[num_args], XtNfromVert, label); num_args++; /* XtSetArg(args[num_args], XtNshapeStyle, XmuShapeRoundedRectangle); num_args++; */ right = XtCreateManagedWidget(right_name, commandWidgetClass, form, args, num_args); XtAddCallback(right, XtNcallback, right_callback, (XtPointer) 0); XtInstallAccelerators(form, left); XtInstallAccelerators(form, right); /* * Create and place the command widgets. */ for (i = 0, above = left, curr = commands; i < num_names; i++) { if (!widget_names[i]) continue; num_args = 0; XtSetArg(args[num_args], XtNfromVert, above); num_args++; if (above == left) { /* if first, we are farther apart */ XtSetArg(args[num_args], XtNvertDistance, skip); num_args++; } *curr = XtCreateManagedWidget(widget_names[i], commandWidgetClass, form, args, num_args); XtAddCallback(*curr, XtNcallback, name_callback, (XtPointer) i); above = *curr++; } /* * Now find the largest width. Start with the width dismiss + help * buttons, since they are adjacent. */ XtSetArg(args[0], XtNwidth, &max_width); XtGetValues(left, args, ONE); XtSetArg(args[0], XtNwidth, &width); XtGetValues(right, args, ONE); max_width = max_width + width + distance; /* Next, the title. */ XtSetArg(args[0], XtNwidth, &width); XtGetValues(label, args, ONE); if (width > max_width) max_width = width; /* Finally, the commands. */ for (i = 0, curr = commands; i < num_names; i++) { if (!widget_names[i]) continue; XtSetArg(args[0], XtNwidth, &width); XtGetValues(*curr, args, ONE); if (width > max_width) max_width = width; curr++; } /* * Finally, set all of the single line widgets to the largest width. */ XtSetArg(args[0], XtNwidth, max_width); XtSetValues(label, args, ONE); for (i = 0, curr = commands; i < num_names; i++) { if (!widget_names[i]) continue; XtSetArg(args[0], XtNwidth, max_width); XtSetValues(*curr, args, ONE); curr++; } if (command_widgets) *command_widgets = commands; else free((char *) commands); XtRealizeWidget(popup); XSetWMProtocols(XtDisplay(popup), XtWindow(popup), &wm_delete_window, 1); return popup; } slashem-0.0.7E7F3/win/X11/SlashEM.ad0000664000076400007640000001625110545462317014631 0ustar aliali! The display_file, tombstone, and menu windows are all formatted assuming ! a fixed width font. Text windows may or may not be formatted as above. ! The rip window applies if the GRAPHIC_TOMBSTONE option is turned on, and ! requires a 12 pixel font for correct appearance. ! SlashEM*font: variable SlashEM*display_file*font: fixed SlashEM*tombstone*font: fixed SlashEM*text*rip*font: -*-times-medium-r-*-*-12-*-*-*-*-*-*-* SlashEM*menu*font: fixed SlashEM*text*font: fixed SlashEM*map*font: nh10 ! To use full-color tiles for the map, uncomment the tile file name. ! If you use a 100dpi (or greater) monitor you may wish to double the ! tile size so you can see the figures. If SlashEM was compiled to ! use XPM (USE_XPM in config.h), the tile_file is a standard XPM file. ! Otherwise, it is a custom format. double_tile_size only applies to ! the custom format - to enlarge an XPM file, use processing tools ! such as XV or preferably PBMplus. ! !SlashEM.tile_file: x11tiles !SlashEM.double_tile_size: True ! ! The annotation of pets. !SlashEM.pet_mark_bitmap: pet_mark.xbm !SlashEM.pet_mark_color: Red ! Tombstone ! The image file !SlashEM.tombstone: rip.xpm ! Text starts at (tombtext_x, tombtext_y) and subsequent lines ! are displaced by (tombtext_dx, tombtext_dy) pixels. If you !SlashEM.tombtext_x: 155 !SlashEM.tombtext_y: 78 !SlashEM.tombtext_dx: 0 !SlashEM.tombtext_dy: 13 ! The color to use for the text on the hero's tombstone SlashEM*rip*foreground: black ! Translation tables. There are currently several actions in nethack, but ! the only one you should be using is "input()", which, with no parameters, ! uses XLookupString to translate your keypress into a command. You ! can optionally give it parameters to change the behavior, see the example ! below. Note that you have to specify the translations in every appropriate ! window. SlashEM*message*translations: : input() ! ! Example extra translations for the map window. ! !SlashEM*map*translations: #override \ ! !Left: input(h) \n\ ! !Right: input(l) \n\ ! !Up: input(k) \n\ ! !Down: input(j) ! ! The icon to use; supported values are nh72, nh56, and nh32; nh72 is the ! default. Some window managers may not support the larger icon sizes. ! It is not guaranteed that the window manager will honor the icon selection. !SlashEM*icon: nh56 ! ! If True, the default, a popup for single character prompts such as y/n ! questions is _not_ used. SlashEM*slow: True ! ! The number of lines the message window will show without scrolling. !SlashEM*message_lines: 12 ! ! If True, the message window has a line that seperates old and new messages. !SlashEM*message_line: True ! ! If True, force keyboard to attach to popup windows. Some window managers ! enforce a click-to-focus-keyboard policy (e.g. the DECwindows wm). SlashEM ! has a lot of popups and is almost unplayable without some kind of autofocus. !SlashEM*autofocus: True ! ! Specify the number of rows and columns of the map window. The default ! is the standard 80x21 window. Note: this _does_not_ change nethack's ! level size, only what you see of it. !SlashEM*map*rows: 21 !SlashEM*map*columns: 80 ! Parts of the fancy status display. ! SlashEM*status_condition.borderWidth: 0 SlashEM*status_info*borderWidth: 0 ! Sample color screen entries. ! SlashEM*nethack.background: wheat SlashEM*map*yellow: gold SlashEM*map*brown: tan SlashEM*map*gray: grey85 SlashEM*map*foreground: wheat SlashEM*map*background: grey40 SlashEM*fancy_status.skipAdjust: True SlashEM*fancy_status.background: wheat SlashEM*status_info*foreground: Sienna SlashEM*status_info*background: wheat SlashEM*status_info.background: wheat SlashEM*status_attributes*foreground: black SlashEM*status_attributes*background: white SlashEM*status_condition*foreground: red SlashEM*status_condition*background: wheat SlashEM*Scrollbar*foreground: Sienna SlashEM*Scrollbar*background: wheat SlashEM*status_info*showGrip: False SlashEM*status_attributes*showGrip: False SlashEM*player_selection*random.borderColor: blue SlashEM*player_selection*random.borderWidth: 2 SlashEM*player_selection*random.foreground: blue SlashEM*player_selection*random.accelerators: #override\n\ Return: set() notify() unset() SlashEM*player_selection*quit.borderColor: blue SlashEM*player_selection*quit.foreground: blue SlashEM*player_selection*Command.borderColor: red SlashEM*player_selection*Command.foreground: red SlashEM*player_selection*quit.accelerators: #override\n\ Escape: set() notify() unset() SlashEM*race_selection*random.borderColor: blue SlashEM*race_selection*random.borderWidth: 2 SlashEM*race_selection*random.foreground: blue SlashEM*race_selection*random.accelerators: #override\n\ Return: set() notify() unset() SlashEM*race_selection*quit.borderColor: blue SlashEM*race_selection*quit.foreground: blue SlashEM*race_selection*Command.borderColor: red SlashEM*race_selection*Command.foreground: red SlashEM*race_selection*quit.accelerators: #override\n\ Escape: set() notify() unset() SlashEM*gender_selection*random.borderColor: blue SlashEM*gender_selection*random.borderWidth: 2 SlashEM*gender_selection*random.foreground: blue SlashEM*gender_selection*random.accelerators: #override\n\ Return: set() notify() unset() SlashEM*gender_selection*quit.borderColor: blue SlashEM*gender_selection*quit.foreground: blue SlashEM*gender_selection*Command.borderColor: red SlashEM*gender_selection*Command.foreground: red SlashEM*gender_selection*quit.accelerators: #override\n\ Return: set() notify() unset() SlashEM*alignment_selection*random.borderColor: blue SlashEM*alignment_selection*random.borderWidth: 2 SlashEM*alignment_selection*random.foreground: blue SlashEM*alignment_selection*random.accelerators: #override\n\ Return: set() notify() unset() SlashEM*alignment_selection*quit.borderColor: blue SlashEM*alignment_selection*quit.foreground: blue SlashEM*alignment_selection*Command.borderColor: red SlashEM*alignment_selection*Command.foreground: red SlashEM*alignment_selection*quit.accelerators: #override\n\ Return: set() notify() unset() SlashEM*extended_commands*dismiss.borderColor: blue SlashEM*extended_commands*dismiss.foreground: blue SlashEM*extended_commands*help.borderColor: blue SlashEM*extended_commands*help.foreground: blue SlashEM*extended_commands*Command.borderColor: red SlashEM*extended_commands*Command.foreground: red SlashEM*extended_commands*help.accelerators: #override\n\ :?: set() notify() unset() SlashEM*extended_commands*dismiss.accelerators: #override\n\ Escape: set() notify() unset() ! ! ! The following are the default 15 colors that the nethack map uses. ! If they don't look good on your screen, change them. ! ! The foreground color is used as "no color". ! !SlashEM*map*black: black !SlashEM*map*red: red !SlashEM*map*green: pale green !SlashEM*map*brown: brown !SlashEM*map*blue: blue !SlashEM*map*magenta: magenta !SlashEM*map*cyan: light cyan !SlashEM*map*gray: gray !SlashEM*map*orange: orange !SlashEM*map*bright_green: green !SlashEM*map*yellow: yellow !SlashEM*map*bright_blue: royal blue !SlashEM*map*bright_magenta: violet !SlashEM*map*bright_cyan: cyan !SlashEM*map*white: white slashem-0.0.7E7F3/win/X11/nh_icon.xpm0000664000076400007640000000356210545462317015173 0ustar aliali/* XPM */ static char * nh_icon[] = { "40 40 6 1", " s None c none", ". c #ffffff", "X c #dadab6", "o c #6c91b6", "O c #476c6c", "+ c #000000", " ", " ", " ", " . .X..XX.XX X ", " .. .....X.XXXXXX XX ", " ... ....X..XX.XXXXX XXX ", " .. ..........X.XXXXXXXXXXX XX ", " .... ........X..XX.XXXXXXXXX XXXX ", " .... ..........X.XXXXXXXXXXX XXXX ", " ooOOO..ooooooOooOOoOOOOOOOXX+++OO++ ", " ooOOO..ooooooooOoOOOOOOOOOXX+++OO++ ", " ....O..ooooooOooOOoOOOOOOOXX+XXXX++ ", " ....O..ooooooooOoOOOOOOOOOXX+XXXX++ ", " ..OOO..ooooooOooOOoOOOOOOOXX+++XX++ ", " ++++..ooooooooOoOOOOOOOOOXX+++ +++ ", " +++..ooooooOooOOoOOOOOOOXX+++ + ", " ++..ooooooooOoOOOOOOOOOXX+++ ", " ..ooooooOooOOoOOOOOOOXX+++ ", " ..ooooooooOoOOOOOOOOOXX+++ ", " ..ooooooOooOOoOOOOOOOXX+++ ", " ..ooooooooOoOOOOOOOOOXX+++ ", " ..oooooOooOOoOOOOOOXX+++ ", " ..oooooooOoOOOOOOOOXX+++ ", " ..ooooOooOOoOOOOOXX+++ ", " ..ooooooOoOOOOOOOXX++++ ", " ..o..oooOooOOoOOOOXX+XX+++ ", " ...o..oooooOoOOOOOXX++XXX++ ", " ....OO..ooOooOOoOOXX+++XXXX++ ", " ...oo..+..oooOoOOOXX++XXooXXX++ ", " ...ooo..++..OooOOoXX+++XXooOXXX+ ", " ..oooOOXX+++....XXXX++++XXOOoOOXX+ ", " ..oooOOXX+++ ...XXX+++++XXOOooOXX++ ", " ..oooOXXX+++ ..XX+++ +XXOOooOXX++ ", " .....XXX++++ XXXXXXX++ ", " ....XX++++ XXXXXXX+ ", " ...XX+++ XXXXX++ ", " ", " ", " ", " "}; slashem-0.0.7E7F3/win/X11/nh72icon0000664000076400007640000001037010545462317014375 0ustar aliali/* SCCS Id: @(#)nh72icon 3.4 1993/01/21 */ /* Copyright (c) 1993 by M. Stephenson */ /* NetHack may be freely redistributed. See license for details. */ /* 72x72 X11 icon for NetHack. */ #define nh72icon_width 72 #define nh72icon_height 72 static unsigned char nh72icon_bits[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0xe0, 0x07, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0xe0, 0x07, 0x00, 0x78, 0x00, 0x00, 0x00, 0x1e, 0x00, 0xe0, 0x07, 0x3e, 0xc8, 0x07, 0x00, 0xf8, 0x13, 0x7c, 0xe0, 0x07, 0x22, 0x08, 0xfc, 0xc1, 0x0f, 0x10, 0x44, 0xe0, 0x07, 0x36, 0x08, 0x00, 0x7f, 0x00, 0x10, 0x6c, 0xe0, 0x07, 0x1c, 0x08, 0x00, 0x00, 0x00, 0x10, 0x38, 0xe0, 0x07, 0x14, 0x08, 0x00, 0x00, 0x00, 0x10, 0x28, 0xe0, 0x07, 0x1c, 0x08, 0x00, 0x00, 0x00, 0x10, 0x38, 0xe0, 0x07, 0x14, 0x08, 0x00, 0x00, 0x00, 0x10, 0x28, 0xe0, 0x07, 0x1c, 0x08, 0x00, 0x00, 0x00, 0x10, 0x38, 0xe0, 0x07, 0x14, 0x08, 0x00, 0x00, 0x00, 0x10, 0x28, 0xe0, 0x87, 0xff, 0x08, 0x10, 0x00, 0x10, 0x10, 0xff, 0xe1, 0xc7, 0xff, 0x09, 0x38, 0x10, 0x38, 0x90, 0xff, 0xe3, 0x47, 0x1c, 0x09, 0x78, 0x38, 0x3c, 0x90, 0x38, 0xe2, 0x07, 0x1c, 0x08, 0xfc, 0x39, 0x7f, 0x10, 0x38, 0xe0, 0x07, 0x1c, 0x08, 0xfc, 0xbb, 0x7f, 0x10, 0x38, 0xe0, 0x07, 0x1c, 0x08, 0xfe, 0xff, 0xff, 0x10, 0x38, 0xe0, 0x07, 0x1c, 0x08, 0xfe, 0xff, 0xff, 0x10, 0x38, 0xe0, 0x07, 0x1c, 0x08, 0xfe, 0xff, 0xff, 0x10, 0x38, 0xe0, 0x07, 0x1c, 0x08, 0xfe, 0xff, 0xff, 0x10, 0x38, 0xe0, 0x07, 0x1c, 0x08, 0xfe, 0xff, 0xff, 0x10, 0x38, 0xe0, 0x07, 0x1c, 0x08, 0xfc, 0xbb, 0x7f, 0x10, 0x38, 0xe0, 0x07, 0x1c, 0x08, 0xfc, 0x39, 0x7f, 0x10, 0x38, 0xe0, 0x07, 0x1c, 0x08, 0x78, 0x38, 0x3c, 0x10, 0x38, 0xe0, 0x07, 0x1c, 0x08, 0x38, 0x38, 0x38, 0x10, 0x38, 0xe0, 0x07, 0x1c, 0x08, 0x10, 0x38, 0x10, 0x10, 0x38, 0xe0, 0x07, 0x1c, 0x08, 0x00, 0x38, 0x00, 0x10, 0x38, 0xe0, 0x07, 0x1c, 0x08, 0x00, 0x38, 0x00, 0x10, 0x38, 0xe0, 0x07, 0x1c, 0x08, 0x00, 0x38, 0x00, 0x10, 0x38, 0xe0, 0x07, 0x1c, 0x08, 0x00, 0x38, 0x00, 0x10, 0x38, 0xe0, 0x07, 0x1c, 0x08, 0x00, 0x38, 0x00, 0x10, 0x38, 0xe0, 0x07, 0x1c, 0x08, 0x00, 0x38, 0x00, 0x10, 0x38, 0xe0, 0x07, 0x1c, 0x08, 0x00, 0x38, 0x00, 0x10, 0x38, 0xe0, 0x07, 0x1c, 0x08, 0x00, 0x38, 0x00, 0x10, 0x38, 0xe0, 0x07, 0x1c, 0x08, 0x00, 0x28, 0x00, 0x10, 0x38, 0xe0, 0x07, 0x1c, 0x08, 0x00, 0x38, 0x00, 0x10, 0x38, 0xe0, 0x07, 0x08, 0x18, 0x00, 0x28, 0x00, 0x10, 0x10, 0xe0, 0x07, 0x08, 0x30, 0x00, 0x38, 0x00, 0x18, 0x10, 0xe0, 0x07, 0x00, 0x60, 0x00, 0x28, 0x00, 0x0c, 0x00, 0xe0, 0x07, 0x00, 0xc0, 0x00, 0x38, 0x00, 0x06, 0x00, 0xe0, 0x07, 0x00, 0x80, 0x01, 0x28, 0x00, 0x03, 0x00, 0xe0, 0x07, 0x00, 0x00, 0x03, 0x38, 0x80, 0x01, 0x00, 0xe0, 0x07, 0x00, 0x00, 0x06, 0x6c, 0xc0, 0x00, 0x10, 0xe0, 0x07, 0x08, 0x00, 0x0c, 0x44, 0x60, 0x00, 0x92, 0xe0, 0x07, 0x49, 0x00, 0x18, 0x7c, 0x30, 0x00, 0x6c, 0xe0, 0x07, 0x36, 0x00, 0x30, 0x00, 0x18, 0x00, 0x44, 0xe0, 0x07, 0x22, 0x00, 0x60, 0x00, 0x0c, 0x00, 0x83, 0xe1, 0x87, 0xc1, 0x00, 0xc0, 0x00, 0x06, 0x00, 0x44, 0xe0, 0x07, 0x22, 0x00, 0x80, 0x01, 0x03, 0x00, 0x6c, 0xe0, 0x07, 0x36, 0x00, 0x00, 0x83, 0x01, 0x00, 0x92, 0xe0, 0x07, 0x49, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x10, 0xe0, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; slashem-0.0.7E7F3/win/X11/nh56icon0000664000076400007640000000527510545462317014407 0ustar aliali/* SCCS Id: @(#)nh56icon 3.4 2002/02/12 */ /* Copyright (c) 1993,1995 by M. Stephenson */ /* NetHack may be freely redistributed. See license for details. */ /* 56x56 X11 icon for NetHack. */ #define nh56icon_width 56 #define nh56icon_height 56 static unsigned char nh56icon_bits[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x30, 0x38, 0x18, 0x00, 0xc0, 0x03, 0x00, 0x78, 0x28, 0x3c, 0x00, 0xc0, 0x03, 0x00, 0xf8, 0x6c, 0x3e, 0x00, 0xc0, 0x03, 0x00, 0xf8, 0x55, 0x3f, 0x00, 0xc0, 0x23, 0x22, 0xfc, 0xc7, 0x7f, 0x88, 0xc8, 0x43, 0x10, 0xfc, 0xd7, 0x7f, 0x10, 0xc4, 0x03, 0x07, 0xfe, 0xc7, 0xff, 0xc0, 0xc1, 0x83, 0x0d, 0xfe, 0xd7, 0xff, 0x60, 0xc3, 0xa3, 0x28, 0xfe, 0xc7, 0xff, 0x28, 0xca, 0x83, 0x0d, 0xfe, 0xd7, 0xff, 0x60, 0xc3, 0x03, 0x07, 0xfe, 0xc7, 0xff, 0xc0, 0xc1, 0x43, 0x10, 0xfc, 0xd7, 0x7f, 0x10, 0xc4, 0x23, 0x22, 0xfc, 0xc7, 0x7f, 0x88, 0xc8, 0x03, 0x00, 0xf8, 0x55, 0x3f, 0x00, 0xc0, 0x03, 0x00, 0xf8, 0x44, 0x3e, 0x00, 0xc0, 0x03, 0x00, 0x78, 0x54, 0x3c, 0x00, 0xc0, 0x03, 0x00, 0x30, 0x6c, 0x18, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x6c, 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, 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, 0xff, 0xd6, 0xfe, 0xff, 0xdf, 0x0b, 0x00, 0x80, 0xaa, 0x02, 0x00, 0xd0, 0x0b, 0x00, 0x80, 0x54, 0x02, 0x00, 0xd0, 0xfb, 0xff, 0xff, 0x39, 0xff, 0xff, 0xdf, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; slashem-0.0.7E7F3/win/X11/winstat.c0000664000076400007640000007227610545462317014675 0ustar aliali/* SCCS Id: @(#)winstat.c 3.4 1996/04/05 */ /* Copyright (c) Dean Luick, 1992 */ /* NetHack may be freely redistributed. See license for details. */ /* * Status window routines. This file supports both the "traditional" * tty status display and a "fancy" status display. A tty status is * made if a popup window is requested, otherewise a fancy status is * made. This code assumes that only one fancy status will ever be made. * Currently, only one status window (of any type) is _ever_ made. */ #ifndef SYSV #define PRESERVE_NO_SYSV /* X11 include files may define SYSV */ #endif #include #include #include #include #include #include #include #include #include #ifdef PRESERVE_NO_SYSV # ifdef SYSV # undef SYSV # endif # undef PRESERVE_NO_SYSV #endif #include "hack.h" #include "winX.h" extern const char *hu_stat[]; /* from eat.c */ extern const char *enc_stat[]; /* from botl.c */ static void FDECL(update_fancy_status, (struct xwindow *)); static Widget FDECL(create_fancy_status, (Widget,Widget)); static void FDECL(destroy_fancy_status, (struct xwindow *)); void create_status_window(wp, create_popup, parent) struct xwindow *wp; /* window pointer */ boolean create_popup; Widget parent; { XFontStruct *fs; Arg args[8]; Cardinal num_args; Position top_margin, bottom_margin, left_margin, right_margin; wp->type = NHW_STATUS; if (!create_popup) { /* * If we are not creating a popup, then we must be the "main" status * window. */ if (!parent) panic("create_status_window: no parent for fancy status"); wp->status_information = 0; wp->w = create_fancy_status(parent, (Widget) 0); return; } wp->status_information = (struct status_info_t *) alloc(sizeof(struct status_info_t)); init_text_buffer(&wp->status_information->text); num_args = 0; XtSetArg(args[num_args], XtNallowShellResize, False); num_args++; XtSetArg(args[num_args], XtNinput, False); num_args++; wp->popup = parent = XtCreatePopupShell("status_popup", topLevelShellWidgetClass, toplevel, args, num_args); /* * If we're here, then this is an auxiliary status window. If we're * cancelled via a delete window message, we should just pop down. */ num_args = 0; XtSetArg(args[num_args], XtNdisplayCaret, False); num_args++; XtSetArg(args[num_args], XtNscrollHorizontal, XawtextScrollWhenNeeded); num_args++; XtSetArg(args[num_args], XtNscrollVertical, XawtextScrollWhenNeeded); num_args++; wp->w = XtCreateManagedWidget( "status", /* name */ asciiTextWidgetClass, parent, /* parent widget */ args, /* set some values */ num_args); /* number of values to set */ /* * Adjust the height and width of the message window so that it * is two lines high and COLNO of the widest characters wide. */ /* Get the font and margin information. */ num_args = 0; XtSetArg(args[num_args], XtNfont, &fs); num_args++; XtSetArg(args[num_args], XtNtopMargin, &top_margin); num_args++; XtSetArg(args[num_args], XtNbottomMargin, &bottom_margin); num_args++; XtSetArg(args[num_args], XtNleftMargin, &left_margin); num_args++; 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; /* Set the new width and height. */ num_args = 0; XtSetArg(args[num_args], XtNwidth, wp->pixel_width); num_args++; XtSetArg(args[num_args], XtNheight, wp->pixel_height); num_args++; XtSetValues(wp->w, args, num_args); } void destroy_status_window(wp) struct xwindow *wp; { /* If status_information is defined, then it a "text" status window. */ if (wp->status_information) { if (wp->popup) { nh_XtPopdown(wp->popup); if (!wp->keep_window) XtDestroyWidget(wp->popup), wp->popup = (Widget)0; } free((genericptr_t)wp->status_information); wp->status_information = 0; } else { destroy_fancy_status(wp); } if (!wp->keep_window) wp->type = NHW_NONE; } /* * This assumes several things: * + Status has only 2 lines * + That both lines are updated in succession in line order. * + We didn't set stringInPlace on the widget. */ void adjust_status(wp, str) struct xwindow *wp; const char *str; { Arg args[2]; Cardinal num_args; if (!wp->status_information) { update_fancy_status(wp); return; } if (wp->cursy == 0) { clear_text_buffer(&wp->status_information->text); append_text_buffer(&wp->status_information->text, str, FALSE); return; } append_text_buffer(&wp->status_information->text, str, FALSE); /* Set new buffer as text. */ num_args = 0; XtSetArg(args[num_args], XtNstring, wp->status_information->text.text); num_args++; XtSetValues(wp->w, args, num_args); } /* Fancy Status -------------------------------------------------------------*/ static int hilight_time = 1; /* number of turns to hilight a changed value */ struct X_status_value { char *name; /* text name */ int type; /* status type */ Widget w; /* widget of name/value pair */ long last_value; /* value displayed */ int turn_count; /* last time the value changed */ boolean set; /* if hilighed */ boolean after_init; /* don't hilight on first change (init) */ }; /* valid type values */ #define SV_VALUE 0 /* displays a label:value pair */ #define SV_LABEL 1 /* displays a changable label */ #define SV_NAME 2 /* displays an unchangeable name */ static void FDECL(hilight_label, (Widget)); static void FDECL(update_val, (struct X_status_value *,long)); static const char *FDECL(width_string, (int)); static void FDECL(create_widget, (Widget,struct X_status_value *,int)); static void FDECL(get_widths, (struct X_status_value *,int *,int *)); static void FDECL(set_widths, (struct X_status_value *,int,int)); static Widget FDECL(init_column, (char *,Widget,Widget,Widget,int *)); static Widget FDECL(init_info_form, (Widget,Widget,Widget)); /* * Form entry storage indices. */ #define F_STR 0 #define F_DEX 1 #define F_CON 2 #define F_INT 3 #define F_WIS 4 #define F_CHA 5 #define F_NAME 6 #define F_DLEVEL 7 #define F_GOLD 8 #define F_HP 9 #define F_MAXHP 10 #define F_POWER 11 #define F_MAXPOWER 12 #define F_AC 13 #define F_LEVEL 14 #define F_EXP 15 #define F_ALIGN 16 #define F_TIME 17 #define F_SCORE 18 #define F_WEIGHT 19 #define F_WEIGHTCAP 20 #define F_HUNGER 21 #define F_CONFUSED 22 #define F_SICK 23 #define F_BLIND 24 #define F_STUNNED 25 #define F_HALLU 26 #define F_ENCUMBER 27 #define NUM_STATS 28 /* * Notes: * + Alignment needs a different init value, because -1 is an alignment. * + Armor Class is an schar, so 256 is out of range. * + Blank value is 0 and should never change. */ static struct X_status_value shown_stats[NUM_STATS] = { { "Strength", SV_VALUE, (Widget) 0, -1, 0, FALSE, FALSE }, /* 0*/ { "Dexterity", SV_VALUE, (Widget) 0, -1, 0, FALSE, FALSE }, { "Constitution", SV_VALUE, (Widget) 0, -1, 0, FALSE, FALSE }, { "Intelligence", SV_VALUE, (Widget) 0, -1, 0, FALSE, FALSE }, { "Wisdom", SV_VALUE, (Widget) 0, -1, 0, FALSE, FALSE }, { "Charisma", SV_VALUE, (Widget) 0, -1, 0, FALSE, FALSE }, /* 5*/ { "", SV_LABEL, (Widget) 0, -1, 0, FALSE, FALSE }, /* name */ { "", SV_LABEL, (Widget) 0, -1, 0, FALSE, FALSE }, /* dlvl */ { "Gold", SV_VALUE, (Widget) 0, -1, 0, FALSE, FALSE }, { "Hit Points", SV_VALUE, (Widget) 0, -1, 0, FALSE, FALSE }, { "Max HP", SV_VALUE, (Widget) 0, -1, 0, FALSE, FALSE }, /*10*/ { "Power", SV_VALUE, (Widget) 0, -1, 0, FALSE, FALSE }, { "Max Power", SV_VALUE, (Widget) 0, -1, 0, FALSE, FALSE }, { "Armor Class", SV_VALUE, (Widget) 0,256, 0, FALSE, FALSE }, { "Level", SV_VALUE, (Widget) 0, -1, 0, FALSE, FALSE }, { "Experience", SV_VALUE, (Widget) 0, -1, 0, FALSE, FALSE }, /*15*/ { "Alignment", SV_VALUE, (Widget) 0, -2, 0, FALSE, FALSE }, { "Time", SV_VALUE, (Widget) 0, -1, 0, FALSE, FALSE }, { "Score", SV_VALUE, (Widget) 0, -1, 0, FALSE, FALSE }, { "Weight", SV_VALUE, (Widget) 0, -1, 0, FALSE, FALSE }, { "Max Weight", SV_VALUE, (Widget) 0, -1, 0, FALSE, FALSE }, /*20*/ { "", SV_NAME, (Widget) 0, -1, 0, FALSE, TRUE }, /* hunger*/ { "Confused", SV_NAME, (Widget) 0, 0, 0, FALSE, TRUE }, { "", SV_NAME, (Widget) 0, 0, 0, FALSE, TRUE }, /* sick */ { "Blind", SV_NAME, (Widget) 0, 0, 0, FALSE, TRUE }, { "Stunned", SV_NAME, (Widget) 0, 0, 0, FALSE, TRUE }, /*25*/ { "Hallucinating", SV_NAME, (Widget) 0, 0, 0, FALSE, TRUE }, { "", SV_NAME, (Widget) 0, 0, 0, FALSE, TRUE }, /*encumbr*/ }; /* * Set all widget values to a null string. This is used after all spacings * have been calculated so that when the window is popped up we don't get all * kinds of funny values being displayed. */ void null_out_status() { int i; struct X_status_value *sv; Arg args[1]; for (i = 0, sv = shown_stats; i < NUM_STATS; i++, sv++) { switch (sv->type) { case SV_VALUE: set_value(sv->w, ""); break; case SV_LABEL: case SV_NAME: XtSetArg(args[0], XtNlabel, ""); XtSetValues(sv->w, args, ONE); break; default: impossible("null_out_status: unknown type %d\n", sv->type); break; } } } /* This is almost an exact duplicate of hilight_value() */ static void hilight_label(w) Widget w; /* label widget */ { Arg args[2]; Pixel fg, bg; XtSetArg(args[0], XtNforeground, &fg); XtSetArg(args[1], XtNbackground, &bg); XtGetValues(w, args, TWO); XtSetArg(args[0], XtNforeground, bg); XtSetArg(args[1], XtNbackground, fg); XtSetValues(w, args, TWO); } static void update_val(attr_rec, new_value) struct X_status_value *attr_rec; long new_value; { char buf[BUFSZ]; Arg args[4]; if (attr_rec->type == SV_LABEL) { if (attr_rec == &shown_stats[F_NAME]) { Strcpy(buf, plname); if ('a' <= buf[0] && buf[0] <= 'z') buf[0] += 'A'-'a'; Strcat(buf, " the "); if (u.mtimedone) { char mname[BUFSZ]; int k = 0; Strcpy(mname, mons[u.umonnum].mname); while(mname[k] != 0) { if ((k == 0 || (k > 0 && mname[k-1] == ' ')) && 'a' <= mname[k] && mname[k] <= 'z') mname[k] += 'A' - 'a'; k++; } Strcat(buf, mname); } else Strcat(buf, rank_of(u.ulevel, pl_character[0], flags.female)); } else if (attr_rec == &shown_stats[F_DLEVEL]) { if (!describe_level(buf, FALSE)) { Strcpy(buf, dungeons[u.uz.dnum].dname); Sprintf(eos(buf), ", level %d", depth(&u.uz)); } } else { impossible("update_val: unknown label type \"%s\"", attr_rec->name); return; } if (strcmp(buf, attr_rec->name) == 0) return; /* same */ /* Set the label. */ Strcpy(attr_rec->name, buf); XtSetArg(args[0], XtNlabel, buf); XtSetValues(attr_rec->w, args, ONE); } else if (attr_rec->type == SV_NAME) { if (attr_rec->last_value == new_value) return; /* no change */ attr_rec->last_value = new_value; /* special cases: hunger, encumbrance, sickness */ if (attr_rec == &shown_stats[F_HUNGER]) { XtSetArg(args[0], XtNlabel, hu_stat[new_value]); } else if (attr_rec == &shown_stats[F_ENCUMBER]) { XtSetArg(args[0], XtNlabel, enc_stat[new_value]); } else if (attr_rec == &shown_stats[F_SICK]) { buf[0] = 0; if (Sick) { if (u.usick_type & SICK_VOMITABLE) Strcat(buf, "FoodPois"); if (u.usick_type & SICK_NONVOMITABLE) { if (u.usick_type & SICK_VOMITABLE) Strcat(buf, " "); Strcat(buf, "Ill"); } } XtSetArg(args[0], XtNlabel, buf); } else if (new_value) { XtSetArg(args[0], XtNlabel, attr_rec->name); } else { XtSetArg(args[0], XtNlabel, ""); } XtSetValues(attr_rec->w, args, ONE); } else { /* a value pair */ boolean force_update = FALSE; /* special case: time can be enabled & disabled */ if (attr_rec == &shown_stats[F_TIME]) { static boolean flagtime = TRUE; if(flags.time && !flagtime) { set_name(attr_rec->w, shown_stats[F_TIME].name); force_update = TRUE; flagtime = flags.time; } else if(!flags.time && flagtime) { set_name(attr_rec->w, ""); set_value(attr_rec->w, ""); flagtime = flags.time; } if(!flagtime) return; } /* special case: exp can be enabled & disabled */ else if (attr_rec == &shown_stats[F_EXP]) { static boolean flagexp = TRUE; #ifdef EXP_ON_BOTL if (flags.showexp && !flagexp) { set_name(attr_rec->w, shown_stats[F_EXP].name); force_update = TRUE; flagexp = flags.showexp; } else if(!flags.showexp && flagexp) { set_name(attr_rec->w, ""); set_value(attr_rec->w, ""); flagexp = flags.showexp; } if (!flagexp) return; #else if (flagexp) { set_name(attr_rec->w, ""); set_value(attr_rec->w, ""); flagexp = FALSE; } return; /* don't show it at all */ #endif } /* special case: score can be enabled & disabled */ else if (attr_rec == &shown_stats[F_SCORE]) { static boolean flagscore = TRUE; #ifdef SCORE_ON_BOTL if(flags.showscore && !flagscore) { set_name(attr_rec->w, shown_stats[F_SCORE].name); force_update = TRUE; flagscore = flags.showscore; } else if(!flags.showscore && flagscore) { set_name(attr_rec->w, ""); set_value(attr_rec->w, ""); flagscore = flags.showscore; } if(!flagscore) return; #else if (flagscore) { set_name(attr_rec->w, ""); set_value(attr_rec->w, ""); flagscore = FALSE; } return; #endif } /* special case: weight can be enabled & disabled - clive */ else if (attr_rec == &shown_stats[F_WEIGHT]) { static boolean flagweight = TRUE; #ifdef SHOW_WEIGHT if(flags.showweight && !flagweight) { set_name(attr_rec->w, shown_stats[F_WEIGHT].name); force_update = TRUE; flagweight = flags.showweight; } else if(!flags.showweight && flagweight) { set_name(attr_rec->w, ""); set_value(attr_rec->w, ""); flagweight = flags.showweight; } if(!flagweight) return; #else if (flagweight) { set_name(attr_rec->w, ""); set_value(attr_rec->w, ""); flagweight = FALSE; } return; #endif } else if (attr_rec == &shown_stats[F_WEIGHTCAP]) { static boolean flagweightcap = TRUE; #ifdef SHOW_WEIGHT if(flags.showweight && !flagweightcap) { set_name(attr_rec->w, shown_stats[F_WEIGHTCAP].name); force_update = TRUE; flagweightcap = flags.showweight; } else if(!flags.showweight && flagweightcap) { set_name(attr_rec->w, ""); set_value(attr_rec->w, ""); flagweightcap = flags.showweight; } if(!flagweightcap) return; #else if (flagweightcap) { set_name(attr_rec->w, ""); set_value(attr_rec->w, ""); flagweightcap = FALSE; } return; #endif } /* special case: when polymorphed, show "HD", disable exp */ else if (attr_rec == &shown_stats[F_LEVEL]) { static boolean lev_was_poly = FALSE; if (u.mtimedone && !lev_was_poly) { force_update = TRUE; set_name(attr_rec->w, "HD"); lev_was_poly = TRUE; } else if (!u.mtimedone && lev_was_poly) { force_update = TRUE; set_name(attr_rec->w, shown_stats[F_LEVEL].name); lev_was_poly = FALSE; } } else if (attr_rec == &shown_stats[F_EXP]) { static boolean exp_was_poly = FALSE; if (u.mtimedone && !exp_was_poly) { force_update = TRUE; set_name(attr_rec->w, ""); set_value(attr_rec->w, ""); exp_was_poly = TRUE; } else if (!u.mtimedone && exp_was_poly) { force_update = TRUE; set_name(attr_rec->w, shown_stats[F_EXP].name); exp_was_poly = FALSE; } if (u.mtimedone) return; /* no display for exp when poly */ } if (attr_rec->last_value == new_value && !force_update) /* same */ return; attr_rec->last_value = new_value; /* Special cases: strength, alignment and "clear". */ if (attr_rec == &shown_stats[F_STR]) { if(new_value > 18) { if (new_value > 118) Sprintf(buf,"%ld", new_value-100); else if(new_value < 118) Sprintf(buf, "18/%02ld", new_value-18); else Strcpy(buf, "18/**"); } else { Sprintf(buf, "%ld", new_value); } } else if (attr_rec == &shown_stats[F_ALIGN]) { Strcpy(buf, (new_value == A_CHAOTIC) ? "Chaotic" : (new_value == A_NEUTRAL) ? "Neutral" : "Lawful" ); } else { Sprintf(buf, "%ld", new_value); } set_value(attr_rec->w, buf); } /* * Now hilight the changed information. Names, time and score don't * hilight. If first time, don't hilight. If already lit, don't do * it again. */ if (attr_rec->type != SV_NAME && attr_rec != &shown_stats[F_TIME]) { if (attr_rec->after_init) { if(!attr_rec->set) { if (attr_rec->type == SV_LABEL) hilight_label(attr_rec->w); else hilight_value(attr_rec->w); attr_rec->set = TRUE; } attr_rec->turn_count = 0; } else { attr_rec->after_init = TRUE; } } } /* * Update the displayed status. The current code in botl.c updates * two lines of information. Both lines are always updated one after * the other. So only do our update when we update the second line. * * Information on the first line: * name, attributes, alignment, score * * Information on the second line: * dlvl, gold, hp, power, ac, {level & exp or HD **} * status (hunger, conf, halu, stun, sick, blind), time, encumbrance * * [**] HD is shown instead of level and exp if mtimedone is non-zero. */ static void update_fancy_status(wp) struct xwindow *wp; { struct X_status_value *sv; long val; int i; if (wp->cursy != 0) return; /* do a complete update when line 0 is done */ for (i = 0, sv = shown_stats; i < NUM_STATS; i++, sv++) { switch (i) { case F_STR: val = (long) ACURR(A_STR); break; case F_DEX: val = (long) ACURR(A_DEX); break; case F_CON: val = (long) ACURR(A_CON); break; case F_INT: val = (long) ACURR(A_INT); break; case F_WIS: val = (long) ACURR(A_WIS); break; case F_CHA: val = (long) ACURR(A_CHA); break; /* * Label stats. With the exceptions of hunger, encumbrance, sick * these are either on or off. Pleae leave the ternary operators * the way they are. I want to specify 0 or 1, not a boolean. */ case F_HUNGER: val = (long) u.uhs; break; case F_CONFUSED: val = (long) Confusion ? 1L : 0L; break; case F_SICK: val = (long) Sick ? (long)u.usick_type : 0L; break; case F_BLIND: val = (long) Blind ? 1L : 0L; break; case F_STUNNED: val = (long) Stunned ? 1L : 0L; break; case F_HALLU: val = (long) Hallucination ? 1L : 0L; break; case F_ENCUMBER: val = (long) near_capacity(); break; 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; case F_MAXHP: val = (long) (u.mtimedone ? u.mhmax : u.uhpmax); break; case F_POWER: val = (long) u.uen; break; case F_MAXPOWER: val = (long) u.uenmax; break; case F_AC: val = (long) u.uac; break; case F_LEVEL: val = (long) (u.mtimedone ? mons[u.umonnum].mlevel : u.ulevel); break; #ifdef EXP_ON_BOTL case F_EXP: val = flags.showexp ? u.uexp : 0L; break; #else case F_EXP: val = 0L; break; #endif case F_ALIGN: val = (long) u.ualign.type; break; case F_TIME: val = flags.time ? (long) moves : 0L; break; #ifdef SCORE_ON_BOTL case F_SCORE: val = flags.showscore ? botl_score():0L; break; #else case F_SCORE: val = 0L; break; #endif #ifdef SHOW_WEIGHT case F_WEIGHT: val = (long) (flags.showweight ? inv_weight() + weight_cap() : 0); break; case F_WEIGHTCAP: val = (long) (flags.showweight ? weight_cap() : 0); break; #else case F_WEIGHT: val = 0L; break; case F_WEIGHTCAP: val = 0L; break; #endif default: { /* * There is a possible infinite loop that occurs with: * * impossible->pline->flush_screen->bot->bot{1,2}-> * putstr->adjust_status->update_other->impossible * * Break out with this. */ static boolean active = FALSE; if (!active) { active = TRUE; impossible("update_other: unknown shown value"); active = FALSE; } val = 0; break; } } update_val(sv, val); } } /* * Turn off hilighted status values after a certain amount of turns. */ void check_turn_events() { int i; struct X_status_value *sv; for (sv = shown_stats, i = 0; i < NUM_STATS; i++, sv++) { if (!sv->set) continue; if (sv->turn_count++ >= hilight_time) { if (sv->type == SV_LABEL) hilight_label(sv->w); else hilight_value(sv->w); sv->set = FALSE; } } } /* Initialize alternate status ============================================= */ /* Return a string for the initial width. */ static const char * width_string(sv_index) int sv_index; { switch (sv_index) { case F_STR: return "018/**"; case F_DEX: case F_CON: case F_INT: case F_WIS: case F_CHA: return "088"; /* all but str never get bigger */ case F_HUNGER: return shown_stats[F_HUNGER].name; case F_CONFUSED:return shown_stats[F_CONFUSED].name; case F_SICK: return shown_stats[F_SICK].name; case F_BLIND: return shown_stats[F_BLIND].name; case F_STUNNED: return shown_stats[F_STUNNED].name; case F_HALLU: return shown_stats[F_HALLU].name; case F_ENCUMBER:return shown_stats[F_ENCUMBER].name; case F_NAME: case F_DLEVEL: return ""; case F_HP: case F_MAXHP: return "9999"; case F_POWER: case F_MAXPOWER:return "999"; case F_AC: return "-99"; case F_LEVEL: return "99"; case F_GOLD: case F_EXP: return "4294967295"; /* max ulong */ case F_ALIGN: return "Neutral"; case F_TIME: return "4294967295"; /* max ulong */ case F_SCORE: return "4294967295"; /* max ulong */ case F_WEIGHT: return "4294967295"; /* max ulong */ case F_WEIGHTCAP: return "4294967295"; /* max ulong */ } impossible("width_string: unknown index %d\n", sv_index); return ""; } static void create_widget(parent, sv, sv_index) Widget parent; struct X_status_value *sv; int sv_index; { Arg args[4]; Cardinal num_args; switch (sv->type) { case SV_VALUE: sv->w = create_value(parent, sv->name); set_value(sv->w, width_string(sv_index)); break; case SV_LABEL: /* Labels get their own buffer. */ sv->name = (char *) alloc(BUFSZ); sv->name[0] = '\0'; num_args = 0; XtSetArg(args[num_args], XtNborderWidth, 0); num_args++; XtSetArg(args[num_args], XtNinternalHeight, 0); num_args++; sv->w = XtCreateManagedWidget( sv_index == F_NAME ? "name" : "dlevel", labelWidgetClass, parent, args, num_args); break; case SV_NAME: num_args = 0; XtSetArg(args[num_args], XtNborderWidth, 0); num_args++; XtSetArg(args[num_args], XtNinternalHeight, 0); num_args++; sv->w = XtCreateManagedWidget(sv->name, labelWidgetClass, parent, args, num_args); break; default: panic("create_widget: unknown type %d", sv->type); } } /* * Get current width of value. width2p is only valid for SV_LABEL types. */ static void get_widths(sv, width1p, width2p) struct X_status_value *sv; int *width1p, *width2p; { Arg args[1]; Dimension width; switch (sv->type) { case SV_VALUE: *width1p = get_name_width(sv->w); *width2p = get_value_width(sv->w); break; case SV_LABEL: case SV_NAME: XtSetArg(args[0], XtNwidth, &width); XtGetValues(sv->w, args, ONE); *width1p = width; *width2p = 0; break; default: panic("get_widths: unknown type %d", sv->type); } } static void set_widths(sv, width1, width2) struct X_status_value *sv; int width1, width2; { Arg args[1]; switch (sv->type) { case SV_VALUE: set_name_width(sv->w, width1); set_value_width(sv->w, width2); break; case SV_LABEL: case SV_NAME: XtSetArg(args[0], XtNwidth, (width1+width2)); XtSetValues(sv->w, args, ONE); break; default: panic("set_widths: unknown type %d", sv->type); } } static Widget init_column(name, parent, top, left, col_indices) char *name; Widget parent, top, left; int *col_indices; { Widget form; Arg args[4]; Cardinal num_args; int max_width1, width1, max_width2, width2; int *ip; struct X_status_value *sv; num_args = 0; if (top != (Widget) 0) { XtSetArg(args[num_args], XtNfromVert, top); num_args++; } if (left != (Widget) 0) { XtSetArg(args[num_args], XtNfromHoriz, left); num_args++; } XtSetArg(args[num_args], XtNdefaultDistance, 0); num_args++; form = XtCreateManagedWidget(name, formWidgetClass, parent, args, num_args); max_width1 = max_width2 = 0; for (ip = col_indices; *ip >= 0; ip++) { sv = &shown_stats[*ip]; create_widget(form, sv, *ip); /* will set init width */ if (ip != col_indices) { /* not first */ num_args = 0; XtSetArg(args[num_args], XtNfromVert, shown_stats[*(ip-1)].w); num_args++; XtSetValues(sv->w, args, num_args); } get_widths(sv, &width1, &width2); if (width1 > max_width1) max_width1 = width1; if (width2 > max_width2) max_width2 = width2; } for (ip = col_indices; *ip >= 0 ; ip++) { set_widths(&shown_stats[*ip], max_width1, max_width2); } /* There is room behind the end marker for the two widths. */ *++ip = max_width1; *++ip = max_width2; return form; } /* * These are the orders of the displayed columns. Change to suit. The -1 * indicates the end of the column. The two numbers after that are used * to store widths that are calculated at run-time. */ static int attrib_indices[] = { F_STR,F_DEX,F_CON,F_INT,F_WIS,F_CHA, -1,0,0 }; static int status_indices[] = { F_HUNGER, F_CONFUSED, F_SICK, F_BLIND, F_STUNNED, F_HALLU, F_ENCUMBER, -1,0,0 }; static int col2_indices[] = { F_MAXHP, F_ALIGN, F_TIME, F_EXP, F_MAXPOWER, F_WEIGHTCAP, -1,0,0 }; static int col1_indices[] = { F_HP, F_AC, F_GOLD, F_LEVEL, F_POWER, F_WEIGHT,F_SCORE, -1,0,0 }; /* * Produce a form that looks like the following: * * name * dlevel * col1_indices[0] col2_indices[0] * col1_indices[1] col2_indices[1] * . . * . . * col1_indices[n] col2_indices[n] */ static Widget init_info_form(parent, top, left) Widget parent, top, left; { Widget form, col1; struct X_status_value *sv_name, *sv_dlevel; Arg args[6]; Cardinal num_args; int total_width, *ip; num_args = 0; if (top != (Widget) 0) { XtSetArg(args[num_args], XtNfromVert, top); num_args++; } if (left != (Widget) 0) { XtSetArg(args[num_args], XtNfromHoriz, left); num_args++; } XtSetArg(args[num_args], XtNdefaultDistance, 0); num_args++; form = XtCreateManagedWidget("status_info", formWidgetClass, parent, args, num_args); /* top of form */ sv_name = &shown_stats[F_NAME]; create_widget(form, sv_name, F_NAME); /* second */ sv_dlevel = &shown_stats[F_DLEVEL]; create_widget(form, sv_dlevel, F_DLEVEL); num_args = 0; XtSetArg(args[num_args], XtNfromVert, sv_name->w); num_args++; XtSetValues(sv_dlevel->w, args, num_args); /* two columns beneath */ col1 = init_column("name_col1", form, sv_dlevel->w, (Widget) 0, col1_indices); (void) init_column("name_col2", form, sv_dlevel->w, col1, col2_indices); /* Add calculated widths. */ for (ip = col1_indices; *ip >= 0; ip++) ; /* skip to end */ total_width = *++ip; total_width += *++ip; for (ip = col2_indices; *ip >= 0; ip++) ; /* skip to end */ total_width += *++ip; total_width += *++ip; XtSetArg(args[0], XtNwidth, total_width); XtSetValues(sv_name->w, args, ONE); XtSetArg(args[0], XtNwidth, total_width); XtSetValues(sv_dlevel->w, args, ONE); return form; } /* * Create the layout for the fancy status. Return a form widget that * contains everything. */ static Widget create_fancy_status(parent, top) Widget parent, top; { Widget form; /* The form that surrounds everything. */ Widget w; Arg args[8]; Cardinal num_args; num_args = 0; if (top != (Widget) 0) { XtSetArg(args[num_args], XtNfromVert, top); num_args++; } XtSetArg(args[num_args], XtNdefaultDistance, 0); num_args++; XtSetArg(args[num_args], XtNborderWidth, 0); num_args++; XtSetArg(args[num_args], XtNorientation, XtorientHorizontal); num_args++; form = XtCreateManagedWidget("fancy_status", panedWidgetClass, parent, args, num_args); w = init_info_form(form, (Widget) 0, (Widget) 0); w = init_column("status_attributes",form, (Widget) 0, w, attrib_indices); (void) init_column("status_condition", form, (Widget) 0, w, status_indices); return form; } static void destroy_fancy_status(wp) struct xwindow *wp; { int i; struct X_status_value *sv; if (!wp->keep_window) XtDestroyWidget(wp->w), wp->w = (Widget)0; for (i = 0, sv = shown_stats; i < NUM_STATS; i++, sv++) if (sv->type == SV_LABEL) { free((genericptr_t)sv->name); sv->name = 0; } } /*winstat.c*/ slashem-0.0.7E7F3/win/X11/ibm.bdf0000664000076400007640000011420610545462317014252 0ustar alialiSTARTFONT 2.1 COMMENT (null) FONT -Misc-Fixed-Medium-R-Normal-IBMPC-14-120-75-75-C-80-ISO8859-1 SIZE 13 78 78 FONTBOUNDINGBOX 8 14 0 -3 STARTPROPERTIES 19 FONTNAME_REGISTRY "" FOUNDRY "Misc" FAMILY_NAME "Fixed" WEIGHT_NAME "Medium" SLANT "R" SETWIDTH_NAME "Normal" ADD_STYLE_NAME "IBMPC" PIXEL_SIZE 14 POINT_SIZE 120 RESOLUTION_X 75 RESOLUTION_Y 75 SPACING "C" AVERAGE_WIDTH 80 CHARSET_REGISTRY "ISO8859" CHARSET_ENCODING "1" DEFAULT_CHAR 0 FONT_DESCENT 3 FONT_ASCENT 11 COPYRIGHT "Public domain font. Share and enjoy." ENDPROPERTIES CHARS 256 STARTCHAR C000 ENCODING 0 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR C001 ENCODING 1 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 7e00 8100 a500 8100 8100 bd00 9900 8100 7e00 0000 0000 0000 ENDCHAR STARTCHAR C002 ENCODING 2 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 7e00 ff00 db00 ff00 ff00 c300 e700 ff00 7e00 0000 0000 0000 ENDCHAR STARTCHAR C003 ENCODING 3 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 6c00 ee00 fe00 fe00 fe00 7c00 3800 1000 0000 0000 0000 ENDCHAR STARTCHAR C004 ENCODING 4 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 1000 3800 7c00 fe00 7c00 3800 1000 0000 0000 0000 0000 ENDCHAR STARTCHAR C005 ENCODING 5 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 1000 3800 1000 6c00 ee00 6c00 1000 3800 0000 0000 0000 ENDCHAR STARTCHAR C006 ENCODING 6 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 1000 3800 7c00 7c00 fe00 fe00 6c00 1000 3800 0000 0000 0000 ENDCHAR STARTCHAR C007 ENCODING 7 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 0000 1800 3c00 3c00 1800 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR C010 ENCODING 8 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP ff00 ff00 ff00 ff00 ff00 e700 c300 c300 e700 ff00 ff00 ff00 ff00 ff00 ENDCHAR STARTCHAR C011 ENCODING 9 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 1800 3c00 6600 6600 3c00 1800 0000 0000 0000 0000 ENDCHAR STARTCHAR C012 ENCODING 10 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP ff00 ff00 ff00 ff00 e700 c300 9900 9900 c300 e700 ff00 ff00 ff00 ff00 ENDCHAR STARTCHAR C013 ENCODING 11 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 1e00 0e00 1e00 3600 7800 cc00 cc00 cc00 7800 0000 0000 0000 ENDCHAR STARTCHAR C014 ENCODING 12 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 3c00 6600 6600 6600 3c00 1800 7e00 1800 1800 0000 0000 0000 ENDCHAR STARTCHAR C015 ENCODING 13 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 1e00 1a00 1e00 1800 1800 1800 7800 f800 7000 0000 0000 0000 ENDCHAR STARTCHAR C016 ENCODING 14 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 3e00 3600 3e00 3600 3600 7600 f600 6600 0e00 1e00 0c00 0000 0000 ENDCHAR STARTCHAR C017 ENCODING 15 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 1800 db00 7e00 3c00 6600 6600 3c00 7e00 db00 1800 0000 0000 0000 ENDCHAR STARTCHAR C020 ENCODING 16 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 8000 e000 f000 fc00 fe00 fc00 f000 e000 8000 0000 0000 0000 ENDCHAR STARTCHAR C021 ENCODING 17 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0200 0e00 3e00 7e00 fe00 7e00 3e00 0e00 0200 0000 0000 0000 ENDCHAR STARTCHAR C022 ENCODING 18 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 1800 3c00 7e00 1800 1800 1800 7e00 3c00 1800 0000 0000 0000 ENDCHAR STARTCHAR C023 ENCODING 19 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 6600 6600 6600 6600 6600 6600 0000 6600 6600 0000 0000 0000 ENDCHAR STARTCHAR C024 ENCODING 20 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 7f00 db00 db00 db00 7b00 1b00 1b00 1b00 1b00 0000 0000 0000 ENDCHAR STARTCHAR C025 ENCODING 21 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 7c00 c600 c600 6000 7c00 f600 de00 7c00 0c00 c600 c600 7c00 0000 ENDCHAR STARTCHAR C026 ENCODING 22 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 fe00 fe00 fe00 0000 0000 0000 ENDCHAR STARTCHAR C027 ENCODING 23 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 1800 3c00 7e00 1800 1800 7e00 3c00 1800 7e00 0000 0000 0000 ENDCHAR STARTCHAR C030 ENCODING 24 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 1800 3c00 7e00 1800 1800 1800 1800 1800 1800 0000 0000 0000 ENDCHAR STARTCHAR C031 ENCODING 25 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 1800 1800 1800 1800 1800 1800 7e00 3c00 1800 0000 0000 0000 ENDCHAR STARTCHAR C032 ENCODING 26 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 0c00 0e00 ff00 0e00 0c00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR C033 ENCODING 27 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 3000 7000 fe00 7000 3000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR C034 ENCODING 28 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 0000 c000 c000 c000 fe00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR C035 ENCODING 29 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 2400 6600 ff00 6600 2400 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR C036 ENCODING 30 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 1000 3800 3800 3800 7c00 7c00 fe00 fe00 0000 0000 0000 0000 ENDCHAR STARTCHAR C037 ENCODING 31 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 fe00 fe00 7c00 7c00 7c00 3800 3800 1000 0000 0000 0000 0000 ENDCHAR STARTCHAR C040 ENCODING 32 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ! ENCODING 33 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 1800 3c00 3c00 3c00 1800 1800 0000 1800 1800 0000 0000 0000 ENDCHAR STARTCHAR " ENCODING 34 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 3600 3600 3600 1400 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR # ENCODING 35 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 6c00 6c00 6c00 fe00 6c00 6c00 fe00 6c00 6c00 0000 0000 0000 ENDCHAR STARTCHAR $ ENCODING 36 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 1800 1800 7c00 c600 c000 7800 3c00 0600 c600 7c00 1800 1800 0000 ENDCHAR STARTCHAR % ENCODING 37 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 6200 6600 0c00 1800 3000 6600 c600 0000 0000 0000 ENDCHAR STARTCHAR & ENCODING 38 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 3800 6c00 3800 3800 7600 f600 ce00 cc00 7600 0000 0000 0000 ENDCHAR STARTCHAR ' ENCODING 39 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0c00 0c00 0c00 1800 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ( ENCODING 40 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0c00 1800 3000 3000 3000 3000 3000 1800 0c00 0000 0000 0000 ENDCHAR STARTCHAR ) ENCODING 41 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 3000 1800 0c00 0c00 0c00 0c00 0c00 1800 3000 0000 0000 0000 ENDCHAR STARTCHAR * ENCODING 42 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 6c00 3800 fe00 3800 6c00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR + ENCODING 43 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 1800 1800 7e00 1800 1800 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR , ENCODING 44 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0c00 0c00 0c00 1800 0000 0000 ENDCHAR STARTCHAR - ENCODING 45 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 fe00 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR . ENCODING 46 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 1800 1800 0000 0000 0000 ENDCHAR STARTCHAR / ENCODING 47 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0200 0600 0c00 1800 3000 6000 c000 8000 0000 0000 0000 ENDCHAR STARTCHAR 0 ENCODING 48 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 7c00 c600 ce00 de00 f600 e600 c600 c600 7c00 0000 0000 0000 ENDCHAR STARTCHAR 1 ENCODING 49 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 1800 7800 1800 1800 1800 1800 1800 1800 7e00 0000 0000 0000 ENDCHAR STARTCHAR 2 ENCODING 50 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 7c00 c600 c600 0c00 1800 3000 6000 c600 fe00 0000 0000 0000 ENDCHAR STARTCHAR 3 ENCODING 51 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 7c00 c600 0600 0600 3c00 0600 0600 c600 7c00 0000 0000 0000 ENDCHAR STARTCHAR 4 ENCODING 52 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0c00 1c00 3c00 6c00 cc00 fe00 0c00 0c00 0c00 0000 0000 0000 ENDCHAR STARTCHAR 5 ENCODING 53 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 fe00 c000 c000 c000 fc00 0600 0600 c600 7c00 0000 0000 0000 ENDCHAR STARTCHAR 6 ENCODING 54 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 7c00 c600 c000 c000 fc00 c600 c600 c600 7c00 0000 0000 0000 ENDCHAR STARTCHAR 7 ENCODING 55 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 fe00 c600 0c00 1800 3000 3000 3000 3000 3000 0000 0000 0000 ENDCHAR STARTCHAR 8 ENCODING 56 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 7c00 c600 c600 c600 7c00 c600 c600 c600 7c00 0000 0000 0000 ENDCHAR STARTCHAR 9 ENCODING 57 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 7c00 c600 c600 c600 7e00 0600 0600 c600 7c00 0000 0000 0000 ENDCHAR STARTCHAR : ENCODING 58 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 0c00 0c00 0000 0000 0c00 0c00 0000 0000 0000 0000 ENDCHAR STARTCHAR ; ENCODING 59 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 0c00 0c00 0000 0000 0c00 0c00 0c00 1800 0000 0000 ENDCHAR STARTCHAR < ENCODING 60 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0c00 1800 3000 6000 c000 6000 3000 1800 0c00 0000 0000 0000 ENDCHAR STARTCHAR = ENCODING 61 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 0000 fe00 0000 fe00 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR > ENCODING 62 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 6000 3000 1800 0c00 0600 0c00 1800 3000 6000 0000 0000 0000 ENDCHAR STARTCHAR ? ENCODING 63 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 7c00 c600 c600 0c00 1800 1800 0000 1800 1800 0000 0000 0000 ENDCHAR STARTCHAR @ ENCODING 64 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 7c00 c600 c600 de00 de00 de00 dc00 c000 7e00 0000 0000 0000 ENDCHAR STARTCHAR A ENCODING 65 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 3800 6c00 c600 c600 c600 fe00 c600 c600 c600 0000 0000 0000 ENDCHAR STARTCHAR B ENCODING 66 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 fc00 6600 6600 6600 7c00 6600 6600 6600 fc00 0000 0000 0000 ENDCHAR STARTCHAR C ENCODING 67 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 3c00 6600 c000 c000 c000 c000 c000 6600 3c00 0000 0000 0000 ENDCHAR STARTCHAR D ENCODING 68 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 f800 6c00 6600 6600 6600 6600 6600 6c00 f800 0000 0000 0000 ENDCHAR STARTCHAR E ENCODING 69 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 fe00 6600 6000 6000 7c00 6000 6000 6600 fe00 0000 0000 0000 ENDCHAR STARTCHAR F ENCODING 70 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 fe00 6600 6000 6000 7c00 6000 6000 6000 f000 0000 0000 0000 ENDCHAR STARTCHAR G ENCODING 71 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 7c00 c600 c600 c000 c000 ce00 c600 c600 7c00 0000 0000 0000 ENDCHAR STARTCHAR H ENCODING 72 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 c600 c600 c600 c600 fe00 c600 c600 c600 c600 0000 0000 0000 ENDCHAR STARTCHAR I ENCODING 73 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 3c00 1800 1800 1800 1800 1800 1800 1800 3c00 0000 0000 0000 ENDCHAR STARTCHAR J ENCODING 74 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 3c00 1800 1800 1800 1800 1800 d800 d800 7000 0000 0000 0000 ENDCHAR STARTCHAR K ENCODING 75 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 c600 cc00 d800 f000 f000 d800 cc00 c600 c600 0000 0000 0000 ENDCHAR STARTCHAR L ENCODING 76 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 f000 6000 6000 6000 6000 6000 6200 6600 fe00 0000 0000 0000 ENDCHAR STARTCHAR M ENCODING 77 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 c600 c600 ee00 fe00 d600 d600 d600 c600 c600 0000 0000 0000 ENDCHAR STARTCHAR N ENCODING 78 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 c600 c600 e600 e600 f600 de00 ce00 ce00 c600 0000 0000 0000 ENDCHAR STARTCHAR O ENCODING 79 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 7c00 c600 c600 c600 c600 c600 c600 c600 7c00 0000 0000 0000 ENDCHAR STARTCHAR P ENCODING 80 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 fc00 6600 6600 6600 7c00 6000 6000 6000 f000 0000 0000 0000 ENDCHAR STARTCHAR Q ENCODING 81 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 7c00 c600 c600 c600 c600 c600 c600 d600 7c00 0600 0000 0000 ENDCHAR STARTCHAR R ENCODING 82 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 fc00 6600 6600 6600 7c00 7800 6c00 6600 e600 0000 0000 0000 ENDCHAR STARTCHAR S ENCODING 83 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 7c00 c600 c000 6000 3800 0c00 0600 c600 7c00 0000 0000 0000 ENDCHAR STARTCHAR T ENCODING 84 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 7e00 5a00 1800 1800 1800 1800 1800 1800 3c00 0000 0000 0000 ENDCHAR STARTCHAR U ENCODING 85 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 c600 c600 c600 c600 c600 c600 c600 c600 7c00 0000 0000 0000 ENDCHAR STARTCHAR V ENCODING 86 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 c600 c600 c600 c600 c600 c600 6c00 3800 1000 0000 0000 0000 ENDCHAR STARTCHAR W ENCODING 87 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 c600 c600 d600 d600 d600 fe00 ee00 c600 c600 0000 0000 0000 ENDCHAR STARTCHAR X ENCODING 88 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 c600 c600 6c00 3800 3800 3800 6c00 c600 c600 0000 0000 0000 ENDCHAR STARTCHAR Y ENCODING 89 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 6600 6600 6600 6600 3c00 1800 1800 1800 3c00 0000 0000 0000 ENDCHAR STARTCHAR Z ENCODING 90 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 fe00 c600 8c00 1800 3000 6000 c200 c600 fe00 0000 0000 0000 ENDCHAR STARTCHAR [ ENCODING 91 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 7c00 6000 6000 6000 6000 6000 6000 6000 7c00 0000 0000 0000 ENDCHAR STARTCHAR \ ENCODING 92 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 8000 c000 6000 3000 1800 0c00 0600 0200 0000 0000 0000 ENDCHAR STARTCHAR ] ENCODING 93 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 7c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 7c00 0000 0000 0000 ENDCHAR STARTCHAR ^ ENCODING 94 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 1000 3800 6c00 c600 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR _ ENCODING 95 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ff00 0000 ENDCHAR STARTCHAR ` ENCODING 96 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 1800 1800 1800 0c00 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR a ENCODING 97 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 0000 7800 0c00 7c00 cc00 dc00 7600 0000 0000 0000 ENDCHAR STARTCHAR b ENCODING 98 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 e000 6000 6000 7c00 6600 6600 6600 6600 fc00 0000 0000 0000 ENDCHAR STARTCHAR c ENCODING 99 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 0000 7c00 c600 c000 c000 c600 7c00 0000 0000 0000 ENDCHAR STARTCHAR d ENCODING 100 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 1c00 0c00 0c00 7c00 cc00 cc00 cc00 cc00 7e00 0000 0000 0000 ENDCHAR STARTCHAR e ENCODING 101 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 0000 7c00 c600 fe00 c000 c600 7c00 0000 0000 0000 ENDCHAR STARTCHAR f ENCODING 102 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 1c00 3600 3000 3000 fc00 3000 3000 3000 7800 0000 0000 0000 ENDCHAR STARTCHAR g ENCODING 103 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 0000 7600 ce00 c600 c600 7e00 0600 c600 7c00 0000 ENDCHAR STARTCHAR h ENCODING 104 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 e000 6000 6000 6c00 7600 6600 6600 6600 e600 0000 0000 0000 ENDCHAR STARTCHAR i ENCODING 105 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 1800 1800 0000 3800 1800 1800 1800 1800 3c00 0000 0000 0000 ENDCHAR STARTCHAR j ENCODING 106 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0c00 0c00 0000 1c00 0c00 0c00 0c00 0c00 cc00 cc00 7800 0000 ENDCHAR STARTCHAR k ENCODING 107 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 e000 6000 6000 6600 6c00 7800 6c00 6600 e600 0000 0000 0000 ENDCHAR STARTCHAR l ENCODING 108 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 3800 1800 1800 1800 1800 1800 1800 1800 3c00 0000 0000 0000 ENDCHAR STARTCHAR m ENCODING 109 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 0000 6c00 fe00 d600 d600 c600 c600 0000 0000 0000 ENDCHAR STARTCHAR n ENCODING 110 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 0000 dc00 6600 6600 6600 6600 6600 0000 0000 0000 ENDCHAR STARTCHAR o ENCODING 111 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 0000 7c00 c600 c600 c600 c600 7c00 0000 0000 0000 ENDCHAR STARTCHAR p ENCODING 112 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 0000 dc00 6600 6600 6600 7c00 6000 6000 f000 0000 ENDCHAR STARTCHAR q ENCODING 113 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 0000 7600 cc00 cc00 cc00 7c00 0c00 0c00 1e00 0000 ENDCHAR STARTCHAR r ENCODING 114 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 0000 dc00 6600 6000 6000 6000 f000 0000 0000 0000 ENDCHAR STARTCHAR s ENCODING 115 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 0000 7c00 c600 7000 1c00 c600 7c00 0000 0000 0000 ENDCHAR STARTCHAR t ENCODING 116 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 3000 3000 3000 fc00 3000 3000 3000 3600 1c00 0000 0000 0000 ENDCHAR STARTCHAR u ENCODING 117 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 0000 cc00 cc00 cc00 cc00 cc00 7600 0000 0000 0000 ENDCHAR STARTCHAR v ENCODING 118 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 0000 c600 c600 c600 6c00 3800 1000 0000 0000 0000 ENDCHAR STARTCHAR w ENCODING 119 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 0000 c600 c600 d600 d600 fe00 6c00 0000 0000 0000 ENDCHAR STARTCHAR x ENCODING 120 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 0000 c600 6c00 3800 3800 6c00 c600 0000 0000 0000 ENDCHAR STARTCHAR y ENCODING 121 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 0000 c600 c600 c600 ce00 7600 0600 c600 7c00 0000 ENDCHAR STARTCHAR z ENCODING 122 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 0000 fe00 8c00 1800 3000 6200 fe00 0000 0000 0000 ENDCHAR STARTCHAR { ENCODING 123 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0e00 1800 1800 1800 7000 1800 1800 1800 0e00 0000 0000 0000 ENDCHAR STARTCHAR | ENCODING 124 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 1800 1800 1800 1800 0000 1800 1800 1800 1800 0000 0000 0000 ENDCHAR STARTCHAR } ENCODING 125 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 7000 1800 1800 1800 0e00 1800 1800 1800 7000 0000 0000 0000 ENDCHAR STARTCHAR ~ ENCODING 126 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 7600 dc00 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR C177 ENCODING 127 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 1000 3800 3800 6c00 6c00 fe00 0000 0000 0000 0000 ENDCHAR STARTCHAR vwall ENCODING 128 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 1800 1800 1800 1800 1800 1800 1800 1800 1800 1800 1800 1800 1800 1800 ENDCHAR STARTCHAR hwall ENCODING 129 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 ff00 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR tlcorn ENCODING 130 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 1f00 1800 1800 1800 1800 1800 1800 ENDCHAR STARTCHAR trcorn ENCODING 131 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 f800 1800 1800 1800 1800 1800 1800 ENDCHAR STARTCHAR blcorn ENCODING 132 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 1800 1800 1800 1800 1800 1800 1800 1f00 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR brcorn ENCODING 133 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 1800 1800 1800 1800 1800 1800 1800 f800 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR crwall ENCODING 134 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 1800 1800 1800 1800 1800 1800 1800 ff00 1800 1800 1800 1800 1800 1800 ENDCHAR STARTCHAR tuwall ENCODING 135 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 1800 1800 1800 1800 1800 1800 1800 ff00 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR tdwall ENCODING 136 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 ff00 1800 1800 1800 1800 1800 1800 ENDCHAR STARTCHAR tlwall ENCODING 137 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 18 18 18 18 18 18 18 f8 18 18 18 18 18 18 ENDCHAR STARTCHAR trwall ENCODING 138 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 18 18 18 18 18 18 18 1f 18 18 18 18 18 18 ENDCHAR STARTCHAR ndoor ENCODING 139 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 1800 1800 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR vodoor ENCODING 140 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 1800 1800 1800 1800 0000 0000 0000 7e00 0000 0000 0000 1800 1800 1800 ENDCHAR STARTCHAR hodoor ENCODING 141 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 1800 1800 1800 1800 9900 1800 1800 1800 0000 0000 0000 ENDCHAR STARTCHAR vcdoor ENCODING 142 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 1800 1800 1800 7e00 7e00 1800 1800 1800 0000 0000 0000 ENDCHAR STARTCHAR hcdoor ENCODING 143 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 1800 1800 1800 7e00 7e00 1800 1800 1800 0000 0000 0000 ENDCHAR STARTCHAR room ENCODING 144 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 1800 1800 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR dark corr ENCODING 145 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 1100 4400 1100 4400 1100 4400 1100 4400 1100 4400 1100 4400 1100 4400 ENDCHAR STARTCHAR lit corr ENCODING 146 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 5500 aa00 5500 aa00 5500 aa00 5500 aa00 5500 aa00 5500 aa00 5500 aa00 ENDCHAR STARTCHAR upstair ENCODING 147 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0c00 1800 3000 6000 c000 6000 3000 1800 0c00 0000 0000 0000 ENDCHAR STARTCHAR dnstair ENCODING 148 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 6000 3000 1800 0c00 0600 0c00 1800 3000 6000 0000 0000 0000 ENDCHAR STARTCHAR trap ENCODING 149 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 1000 3800 6c00 c600 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR web ENCODING 150 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0100 0f00 3c00 c600 c200 6f00 3a00 3200 7300 5700 8c00 db00 7f00 2500 ENDCHAR STARTCHAR pool ENCODING 151 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 7700 0000 ee00 bb00 0000 7700 dd00 0000 bb00 ee00 0000 dd00 7700 0000 ENDCHAR STARTCHAR fountain ENCODING 152 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 1400 0000 3400 4a00 4900 8a00 2800 0200 5900 1800 3c00 3c00 ff00 ff00 ENDCHAR STARTCHAR sink ENCODING 153 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 2400 2400 7e00 2400 2400 7e00 2400 2400 0000 0000 0000 ENDCHAR STARTCHAR throne ENCODING 154 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0400 0400 0400 0400 3c00 1400 3c00 2400 2400 ff00 ff00 ENDCHAR STARTCHAR upladder ENCODING 155 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0c00 1800 3000 6000 c000 6000 3000 1800 0c00 0000 0000 0000 ENDCHAR STARTCHAR dnladder ENCODING 156 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 6000 3000 1800 0c00 0600 0c00 1800 3000 6000 0000 0000 0000 ENDCHAR STARTCHAR dbvwall ENCODING 157 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 1800 3c00 7e00 7e00 3c00 3c00 3c00 3c00 3c00 3c00 7e00 7e00 3c00 1800 ENDCHAR STARTCHAR dbhwall ENCODING 158 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 0000 2400 7e00 ff00 7e00 2400 0000 0000 0000 0000 ENDCHAR STARTCHAR ice ENCODING 159 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 0000 2400 1800 1800 2400 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR lava ENCODING 160 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0200 4000 2000 2000 0400 1000 9500 5500 5500 5e00 ff00 ff00 ENDCHAR STARTCHAR vbeam ENCODING 161 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 1000 1c00 0800 1000 2000 4000 3000 1800 0400 0800 1000 2000 7000 1000 ENDCHAR STARTCHAR hbeam ENCODING 162 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 0000 4000 6000 d100 0a00 0400 0000 0000 0000 0000 ENDCHAR STARTCHAR lslant ENCODING 163 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 8000 6000 2000 2000 2000 1000 1000 0800 0c00 0200 0200 0200 0200 0100 ENDCHAR STARTCHAR rslant ENCODING 164 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0100 0100 0200 0200 0400 0400 0400 1800 2000 2000 4000 4000 4000 8000 ENDCHAR STARTCHAR dig beam ENCODING 165 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 5500 0a00 1400 2800 5000 a000 4100 8200 0500 0a00 1400 2800 5000 aa00 ENDCHAR STARTCHAR camera flash ENCODING 166 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 c800 4b00 0200 2000 0400 d800 1b00 2000 4400 5200 0a00 0000 ENDCHAR STARTCHAR boom open left ENCODING 167 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 2000 1000 0800 0400 0200 0400 0800 1000 2000 0000 0000 0000 ENDCHAR STARTCHAR boom open right ENCODING 168 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0200 0400 0800 1000 2000 1000 0800 0400 0200 0000 0000 0000 ENDCHAR STARTCHAR magic shield 1 ENCODING 169 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 5000 1200 4200 0800 1000 3a00 1000 4400 5000 2c00 0400 2800 ENDCHAR STARTCHAR magic shield 2 ENCODING 170 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 3600 a800 5a00 da00 8400 f400 d500 3a00 d700 a500 fd00 6f00 3800 3600 ENDCHAR STARTCHAR magic sheild 3 ENCODING 171 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 1c00 4300 0000 0800 2200 0000 4000 0800 0200 9a00 cc00 2200 0000 ENDCHAR STARTCHAR magic shield 4 ENCODING 172 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 6000 1000 6c00 5200 4000 1b00 4600 6b00 cd00 a200 a800 5600 3400 0000 ENDCHAR STARTCHAR sw top left ENCODING 173 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0300 0400 0400 0800 0800 1000 1000 ENDCHAR STARTCHAR sw top center ENCODING 174 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 0000 3c00 c300 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR sw top right ENCODING 175 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 c000 2000 2000 1000 1000 0800 0800 ENDCHAR STARTCHAR sw middle left ENCODING 176 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 1000 1000 2000 2000 2000 2000 2000 4000 2000 2000 2000 2000 1000 1000 ENDCHAR STARTCHAR sw middle right ENCODING 177 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0800 0800 0400 0400 0400 0400 0400 0200 0400 0400 0400 0400 0800 0800 ENDCHAR STARTCHAR sw bottom left ENCODING 178 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 1000 1000 0800 0800 0400 0400 0300 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR sw bottom center ENCODING 179 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 c300 3c00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR sw bottom right ENCODING 180 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0800 0800 1000 1000 2000 2000 c000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR explosion1 ENCODING 181 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0100 0e00 3100 ce00 3100 4600 9800 6700 9800 2300 4c00 9300 2400 ENDCHAR STARTCHAR explosion2 ENCODING 182 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 ff00 0000 ff00 0000 ff00 0000 fe00 0100 fe00 0100 fe00 0100 7c00 ENDCHAR STARTCHAR explosion3 ENCODING 183 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 e000 1800 e600 1900 c400 3300 cd00 3200 8900 6400 9200 4900 ENDCHAR STARTCHAR explosion4 ENCODING 184 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 4900 5600 a500 aa00 4a00 5500 5500 5500 5500 5500 4a00 aa00 a500 5600 ENDCHAR STARTCHAR explosion5 ENCODING 185 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 8300 7c00 8300 7c00 8200 3900 4500 5500 4500 3900 8200 7c00 8300 7c00 ENDCHAR STARTCHAR explosion6 ENCODING 186 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 2500 d400 4a00 aa00 a500 5500 5500 5500 5500 5500 a500 aa00 4a00 d400 ENDCHAR STARTCHAR explosion7 ENCODING 187 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 4900 2400 9300 4c00 2300 9800 6700 b800 4e00 3100 ce00 3100 0e00 0100 ENDCHAR STARTCHAR explosion8 ENCODING 188 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 8300 7c00 0100 fe00 0100 fe00 0100 fe00 0000 ff00 0000 ff00 0000 ff00 ENDCHAR STARTCHAR explosion9 ENCODING 189 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 2500 4900 9200 6400 8900 3200 cc00 3b00 e400 1900 e600 1800 e000 0000 ENDCHAR STARTCHAR C276 ENCODING 190 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 1800 1800 1800 1800 1800 f800 1800 f800 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR C203 ENCODING 191 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 3000 7800 cc00 0000 7800 0c00 7c00 cc00 dc00 7600 0000 0000 0000 ENDCHAR STARTCHAR C204 ENCODING 192 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 cc00 cc00 0000 7800 0c00 7c00 cc00 dc00 7600 0000 0000 0000 ENDCHAR STARTCHAR C207 ENCODING 193 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 7c00 c600 c000 c000 c600 7c00 1800 6c00 3800 0000 ENDCHAR STARTCHAR C210 ENCODING 194 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 3000 7800 cc00 0000 7c00 c600 fe00 c000 c600 7c00 0000 0000 0000 ENDCHAR STARTCHAR C303 ENCODING 195 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 1800 1800 1800 1800 1800 1800 1800 1f00 1800 1800 1800 1800 1800 1800 ENDCHAR STARTCHAR C201 ENCODING 196 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 c600 c600 0000 c600 c600 c600 c600 ce00 7600 0000 0000 0000 ENDCHAR STARTCHAR C206 ENCODING 197 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 3800 6c00 3800 0000 7800 0c00 7c00 cc00 dc00 7600 0000 0000 0000 ENDCHAR STARTCHAR C200 ENCODING 198 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 3c00 6600 c000 c000 c000 c600 6600 3c00 1800 cc00 3800 0000 ENDCHAR STARTCHAR C264 ENCODING 199 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 1800 1800 1800 1800 1800 1800 1800 f800 1800 1800 1800 1800 1800 1800 ENDCHAR STARTCHAR C333 ENCODING 200 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP ff00 ff00 ff00 ff00 ff00 ff00 ff00 ff00 ff00 ff00 ff00 ff00 ff00 ff00 ENDCHAR STARTCHAR C334 ENCODING 201 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 ff00 ff00 ff00 ff00 ff00 ff00 ff00 ENDCHAR STARTCHAR C335 ENCODING 202 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP f000 f000 f000 f000 f000 f000 f000 f000 f000 f000 f000 f000 f000 f000 ENDCHAR STARTCHAR C336 ENCODING 203 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0f00 0f00 0f00 0f00 0f00 0f00 0f00 0f00 0f00 0f00 0f00 0f00 0f00 0f00 ENDCHAR STARTCHAR C337 ENCODING 204 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP ff00 ff00 ff00 ff00 ff00 ff00 ff00 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR C272 ENCODING 205 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 3600 3600 3600 3600 3600 3600 3600 3600 3600 3600 3600 3600 3600 3600 ENDCHAR STARTCHAR C273 ENCODING 206 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 0000 fe00 0600 f600 3600 3600 3600 3600 3600 3600 ENDCHAR STARTCHAR C236 ENCODING 207 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 fc00 c600 fc00 c000 cc00 de00 cc00 cc00 cc00 c600 0000 0000 0000 ENDCHAR STARTCHAR amulet ENCODING 208 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 3c00 4200 4200 4200 2200 2200 1c00 3e00 3e00 3e00 1c00 0000 0000 ENDCHAR STARTCHAR food ENCODING 209 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 7c00 7c00 3800 1000 1000 1000 7c00 0000 ENDCHAR STARTCHAR weapon ENCODING 210 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 2000 3000 2800 2800 2800 2800 2800 2800 3800 fe00 3000 3000 3000 3000 ENDCHAR STARTCHAR tool ENCODING 211 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 0000 3c00 4200 4200 7e00 7e00 7e00 7e00 0000 0000 ENDCHAR STARTCHAR ball ENCODING 212 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 1c00 3e00 3e00 7e00 ad00 7600 ENDCHAR STARTCHAR chain ENCODING 213 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 6600 9900 6600 ENDCHAR STARTCHAR rock ENCODING 214 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 3c00 6600 5200 8500 d200 a900 a000 4500 9300 bf00 6a00 fe00 7f00 ENDCHAR STARTCHAR armor ENCODING 215 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 0000 7c00 6c00 5400 6c00 5400 2800 1000 0000 0000 ENDCHAR STARTCHAR potion ENCODING 216 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 3c00 1800 1800 1800 1800 3c00 6e00 7a00 5e00 7600 3c00 0000 ENDCHAR STARTCHAR scroll ENCODING 217 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 7e00 ff00 7e00 2a00 5400 2a00 5400 2a00 7e00 ff00 7e00 0000 ENDCHAR STARTCHAR wand ENCODING 218 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 2200 2400 1500 0200 0800 0800 1000 1000 1000 2000 2000 2000 4000 0000 ENDCHAR STARTCHAR ring ENCODING 219 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 4200 2400 8300 3800 4500 4400 4400 3900 8200 2900 4800 0000 0000 ENDCHAR STARTCHAR gem ENCODING 220 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 7c00 c600 4400 3800 1000 0000 ENDCHAR STARTCHAR gold ENCODING 221 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 5400 5400 a500 a900 8a00 0000 6000 be00 fb00 df00 3800 ENDCHAR STARTCHAR venom ENCODING 222 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 1800 2400 4400 5800 2000 0000 0000 0000 ENDCHAR STARTCHAR spbook ENCODING 223 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 7c00 4600 6600 4600 4600 4600 6600 4600 7e00 7e00 0000 ENDCHAR STARTCHAR C262 ENCODING 224 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP dd00 7700 dd00 7700 dd00 7700 dd00 7700 dd00 7700 dd00 7700 dd00 7700 ENDCHAR STARTCHAR C341 ENCODING 225 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 7800 cc00 d800 fc00 c600 e600 dc00 c000 c000 0000 ENDCHAR STARTCHAR C342 ENCODING 226 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 fe00 6600 6200 6000 6000 6000 6000 6000 6000 0000 0000 0000 ENDCHAR STARTCHAR C343 ENCODING 227 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 0000 fe00 6c00 6c00 6c00 6c00 6c00 0000 0000 0000 ENDCHAR STARTCHAR C344 ENCODING 228 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 fe00 c600 6200 3000 1800 3000 6200 c600 fe00 0000 0000 0000 ENDCHAR STARTCHAR C345 ENCODING 229 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 0000 7e00 d800 cc00 cc00 cc00 7800 0000 0000 0000 ENDCHAR STARTCHAR C346 ENCODING 230 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 6600 6600 6600 6600 7c00 6000 c000 8000 0000 0000 ENDCHAR STARTCHAR C347 ENCODING 231 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 0000 7600 dc00 1800 1800 1800 1800 0000 0000 0000 ENDCHAR STARTCHAR C350 ENCODING 232 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 fe00 3800 6c00 c600 c600 c600 6c00 3800 fe00 0000 0000 0000 ENDCHAR STARTCHAR C351 ENCODING 233 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 3800 6c00 c600 c600 fe00 c600 c600 6c00 3800 0000 0000 0000 ENDCHAR STARTCHAR C352 ENCODING 234 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 3800 6c00 c600 c600 c600 6c00 6c00 6c00 ee00 0000 0000 0000 ENDCHAR STARTCHAR C353 ENCODING 235 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 3e00 6000 3000 3c00 6600 c600 c600 cc00 7800 0000 0000 0000 ENDCHAR STARTCHAR C354 ENCODING 236 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 0000 7e00 db00 db00 7e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR C355 ENCODING 237 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0600 0c00 7c00 de00 f600 e600 7c00 6000 c000 0000 0000 0000 ENDCHAR STARTCHAR C356 ENCODING 238 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 1c00 3000 6000 6000 7c00 6000 6000 3000 1c00 0000 0000 0000 ENDCHAR STARTCHAR C357 ENCODING 239 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 7c00 c600 c600 c600 c600 c600 c600 c600 c600 0000 0000 0000 ENDCHAR STARTCHAR C360 ENCODING 240 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 0000 fe00 0000 fe00 0000 fe00 0000 0000 0000 0000 ENDCHAR STARTCHAR C361 ENCODING 241 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 1800 1800 7e00 1800 1800 0000 7e00 0000 0000 0000 ENDCHAR STARTCHAR C362 ENCODING 242 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 3000 1800 0c00 0600 0c00 1800 3000 0000 7e00 0000 0000 0000 ENDCHAR STARTCHAR C363 ENCODING 243 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0c00 1800 3000 6000 3000 1800 0c00 0000 7e00 0000 0000 0000 ENDCHAR STARTCHAR C364 ENCODING 244 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0c00 1e00 1a00 1800 1800 1800 1800 1800 1800 1800 1800 ENDCHAR STARTCHAR C365 ENCODING 245 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 1800 1800 1800 1800 1800 1800 1800 1800 1800 5800 7800 3000 0000 0000 ENDCHAR STARTCHAR C366 ENCODING 246 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 1800 1800 0000 7e00 0000 1800 1800 0000 0000 0000 0000 ENDCHAR STARTCHAR C225 ENCODING 247 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 3000 1800 0c00 0000 7c00 c600 c600 c600 c600 7c00 0000 0000 0000 ENDCHAR STARTCHAR C370 ENCODING 248 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 7800 cc00 cc00 7800 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR C371 ENCODING 249 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 1800 1800 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR C372 ENCODING 250 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 1800 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR C373 ENCODING 251 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 1f00 1800 1800 1800 1800 d800 7800 3800 1800 0000 0000 ENDCHAR STARTCHAR C374 ENCODING 252 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 d800 6c00 6c00 6c00 6c00 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR C375 ENCODING 253 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 7000 d800 3000 6000 f800 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR C376 ENCODING 254 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 7e00 7e00 7e00 7e00 7e00 7e00 0000 0000 0000 0000 ENDCHAR STARTCHAR C377 ENCODING 255 SWIDTH 666 0 DWIDTH 8 0 BBX 8 14 0 -3 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR ENDFONT slashem-0.0.7E7F3/win/X11/winmenu.c0000664000076400007640000007704110545462317014661 0ustar aliali/* SCCS Id: @(#)winmenu.c 3.4 1996/08/15 */ /* Copyright (c) Dean Luick, 1992 */ /* NetHack may be freely redistributed. See license for details. */ /* * File for creating menus. * * + Global functions: start_menu, add_menu, end_menu, select_menu */ /*#define USE_FWF*/ /* use FWF's list widget */ #ifndef SYSV #define PRESERVE_NO_SYSV /* X11 include files may define SYSV */ #endif #include #include #include #include #include #include #include #include #include #ifdef USE_FWF #include #else #include #endif #include #ifdef PRESERVE_NO_SYSV # ifdef SYSV # undef SYSV # endif # undef PRESERVE_NO_SYSV #endif #include "hack.h" #include "winX.h" #include static void FDECL(menu_select, (Widget, XtPointer, XtPointer)); static void FDECL(invert_line, (struct xwindow *,x11_menu_item *,int,long)); static void FDECL(menu_ok, (Widget, XtPointer, XtPointer)); static void FDECL(menu_cancel, (Widget, XtPointer, XtPointer)); static void FDECL(menu_all, (Widget, XtPointer, XtPointer)); static void FDECL(menu_none, (Widget, XtPointer, XtPointer)); static void FDECL(menu_invert, (Widget, XtPointer, XtPointer)); static void FDECL(menu_search, (Widget, XtPointer, XtPointer)); static void FDECL(select_all, (struct xwindow *)); static void FDECL(select_none, (struct xwindow *)); static void FDECL(select_match, (struct xwindow *, char*)); static void FDECL(invert_all, (struct xwindow *)); static void FDECL(invert_match, (struct xwindow *, char*)); static void FDECL(menu_popdown, (struct xwindow *)); #ifdef USE_FWF static void FDECL(sync_selected, (struct menu_info_t *, int, int *)); #endif static void FDECL(move_menu, (struct menu *, struct menu *)); static void FDECL(free_menu, (struct menu *)); static void FDECL(reset_menu_to_default, (struct menu *)); static void FDECL(clear_old_menu, (struct xwindow *)); static char *FDECL(copy_of, (const char *)); #define reset_menu_count(mi) ((mi)->counting = FALSE, (mi)->menu_count = 0L) static const char menu_translations[] = "#override\n\ Left: scroll(4)\n\ Right: scroll(6)\n\ Up: scroll(8)\n\ Down: scroll(2)\n\ : menu_key()"; /* * Menu callback. */ /* ARGSUSED */ static void menu_select(w, client_data, call_data) Widget w; XtPointer client_data, call_data; { struct xwindow *wp; struct menu_info_t *menu_info; #ifdef USE_FWF XfwfMultiListReturnStruct *lrs = (XfwfMultiListReturnStruct *) call_data; #else XawListReturnStruct *lrs = (XawListReturnStruct *) call_data; int i; x11_menu_item *curr; #endif long how_many; wp = find_widget(w); menu_info = wp->menu_information; how_many = menu_info->counting ? menu_info->menu_count : -1L; reset_menu_count(menu_info); #ifdef USE_FWF /* if we've reached here, we've found our selected item */ switch (lrs->action) { case XfwfMultiListActionNothing: pline("menu_select: nothing action?"); break; case XfwfMultiListActionStatus: pline("menu_select: status action?"); break; case XfwfMultiListActionHighlight: case XfwfMultiListActionUnhighlight: sync_selected(menu_info,lrs->num_selected,lrs->selected_items); break; } #else for (i = 0, curr = menu_info->curr_menu.base; i < lrs->list_index; i++) { if (!curr) panic("menu_select: out of menu items!"); curr = curr->next; } XawListUnhighlight(w); /* unhilight item */ /* if the menu is not active or don't have an identifier, try again */ if (!menu_info->is_active || curr->identifier.a_void == 0) { X11_nhbell(); return; } /* if we've reached here, we've found our selected item */ curr->selected = !curr->selected; if (curr->selected) { curr->str[2] = (how_many != -1L) ? '#' : '+'; curr->pick_count = how_many; } else { curr->str[2] = '-'; curr->pick_count = -1L; } XawListChange(wp->w, menu_info->curr_menu.list_pointer, 0, 0, True); #endif if (menu_info->how == PICK_ONE) menu_popdown(wp); } /* * Called when menu window is deleted. */ /* ARGSUSED */ void menu_delete(w, event, params, num_params) Widget w; XEvent *event; String *params; Cardinal *num_params; { menu_cancel((Widget)None, (XtPointer) find_widget(w), (XtPointer) 0); } /* * Invert the count'th line (curr) in the given window. */ /*ARGSUSED*/ static void invert_line(wp, curr, which, how_many) struct xwindow *wp; x11_menu_item *curr; int which; long how_many; { reset_menu_count(wp->menu_information); curr->selected = !curr->selected; if (curr->selected) { #ifdef USE_FWF XfwfMultiListHighlightItem((XfwfMultiListWidget)wp->w, which); #else curr->str[2] = (how_many != -1) ? '#' : '+'; #endif curr->pick_count = how_many; } else { #ifdef USE_FWF XfwfMultiListUnhighlightItem((XfwfMultiListWidget)wp->w, which); #else curr->str[2] = '-'; #endif curr->pick_count = -1L; } } /* * Called when we get a key press event on a menu window. */ /* ARGSUSED */ void menu_key(w, event, params, num_params) Widget w; XEvent *event; String *params; Cardinal *num_params; { struct menu_info_t *menu_info; x11_menu_item *curr; struct xwindow *wp; char ch; int count; wp = find_widget(w); menu_info = wp->menu_information; ch = key_event_to_char((XKeyEvent *) event); if (ch == '\0') { /* don't accept nul char/modifier event */ /* don't beep */ return; } if (menu_info->is_active) { /* waiting for input */ ch = map_menu_cmd(ch); if (ch == '\033') { /* quit */ if (menu_info->counting) { /* when there's a count in progress, ESC discards it rather than dismissing the whole menu */ reset_menu_count(menu_info); return; } select_none(wp); } else if (ch == '\n' || ch == '\r') { ; /* accept */ } else if (isdigit(ch)) { /* special case: '0' is also the default ball class */ if (ch == '0' && !menu_info->counting && index(menu_info->curr_menu.gacc, ch)) goto group_accel; menu_info->menu_count *= 10L; menu_info->menu_count += (long)(ch - '0'); if (menu_info->menu_count != 0L) /* ignore leading zeros */ menu_info->counting = TRUE; return; } else if (ch == MENU_SEARCH) { /* search */ if (menu_info->how == PICK_ANY || menu_info->how == PICK_ONE) { char buf[BUFSZ]; X11_getlin("Search for:", buf); if (!*buf || *buf == '\033') return; if (menu_info->how == PICK_ANY) { invert_match(wp, buf); return; } else { select_match(wp, buf); } } else { X11_nhbell(); return; } } else if (ch == MENU_SELECT_ALL) { /* select all */ if (menu_info->how == PICK_ANY) select_all(wp); else X11_nhbell(); return; } else if (ch == MENU_UNSELECT_ALL) { /* unselect all */ if (menu_info->how == PICK_ANY) select_none(wp); else X11_nhbell(); return; } else if (ch == MENU_INVERT_ALL) { /* invert all */ if (menu_info->how == PICK_ANY) invert_all(wp); else X11_nhbell(); return; } else if (index(menu_info->curr_menu.gacc, ch)) { group_accel: /* matched a group accelerator */ if (menu_info->how == PICK_ANY || menu_info->how == PICK_ONE) { for (count = 0, curr = menu_info->curr_menu.base; curr; curr = curr->next, count++) { if (curr->identifier.a_void != 0 && curr->gselector == ch) { invert_line(wp, curr, count, -1L); /* for PICK_ONE, a group accelerator will only be included in gacc[] if it matches exactly one entry, so this must be it... */ if (menu_info->how == PICK_ONE) goto menu_done; /* pop down */ } } #ifndef USE_FWF XawListChange(wp->w, menu_info->curr_menu.list_pointer, 0, 0, True); #endif } else X11_nhbell(); return; } else { boolean selected_something = FALSE; for (count = 0, curr = menu_info->curr_menu.base; curr; curr = curr->next, count++) if (curr->identifier.a_void != 0 && curr->selector == ch) break; if (curr) { invert_line(wp, curr, count, menu_info->counting ? menu_info->menu_count : -1L); #ifndef USE_FWF XawListChange(wp->w, menu_info->curr_menu.list_pointer, 0, 0, True); #endif selected_something = curr->selected; } else { X11_nhbell(); /* no match */ } if (!(selected_something && menu_info->how == PICK_ONE)) return; /* keep going */ } /* pop down */ } else { /* permanent inventory window */ if (ch != '\033') { X11_nhbell(); return; } /* pop down on ESC */ } menu_done: menu_popdown(wp); } /* ARGSUSED */ static void menu_ok(w, client_data, call_data) Widget w; XtPointer client_data, call_data; { struct xwindow *wp = (struct xwindow *) client_data; menu_popdown(wp); } /* ARGSUSED */ static void menu_cancel(w, client_data, call_data) Widget w; /* don't use - may be None */ XtPointer client_data, call_data; { struct xwindow *wp = (struct xwindow *) client_data; if (wp->menu_information->is_active) { select_none(wp); wp->menu_information->cancelled = TRUE; } menu_popdown(wp); } /* ARGSUSED */ static void menu_all(w, client_data, call_data) Widget w; XtPointer client_data, call_data; { select_all((struct xwindow *) client_data); } /* ARGSUSED */ static void menu_none(w, client_data, call_data) Widget w; XtPointer client_data, call_data; { select_none((struct xwindow *) client_data); } /* ARGSUSED */ static void menu_invert(w, client_data, call_data) Widget w; XtPointer client_data, call_data; { invert_all((struct xwindow *) client_data); } /* ARGSUSED */ static void menu_search(w, client_data, call_data) Widget w; XtPointer client_data, call_data; { struct xwindow *wp = (struct xwindow *) client_data; struct menu_info_t *menu_info = wp->menu_information; char buf[BUFSZ]; X11_getlin("Search for:", buf); if (!*buf || *buf == '\033') return; if (menu_info->how == PICK_ANY) invert_match(wp, buf); else select_match(wp, buf); if (menu_info->how == PICK_ONE) menu_popdown(wp); } static void select_all(wp) struct xwindow *wp; { x11_menu_item *curr; int count; boolean changed = FALSE; reset_menu_count(wp->menu_information); for (count = 0, curr = wp->menu_information->curr_menu.base; curr; curr = curr->next, count++) if (curr->identifier.a_void != 0) if (!curr->selected) { invert_line(wp, curr, count, -1L); changed = TRUE; } #ifndef USE_FWF if (changed) XawListChange(wp->w, wp->menu_information->curr_menu.list_pointer, 0, 0, True); #endif } static void select_none(wp) struct xwindow *wp; { x11_menu_item *curr; int count; boolean changed = FALSE; reset_menu_count(wp->menu_information); for (count = 0, curr = wp->menu_information->curr_menu.base; curr; curr = curr->next, count++) if (curr->identifier.a_void != 0) if (curr->selected) { invert_line(wp, curr, count, -1L); changed = TRUE; } #ifndef USE_FWF if (changed) XawListChange(wp->w, wp->menu_information->curr_menu.list_pointer, 0, 0, True); #endif } static void invert_all(wp) struct xwindow *wp; { x11_menu_item *curr; int count; reset_menu_count(wp->menu_information); for (count = 0, curr = wp->menu_information->curr_menu.base; curr; curr = curr->next, count++) if (curr->identifier.a_void != 0) invert_line(wp, curr, count, -1L); #ifndef USE_FWF XawListChange(wp->w, wp->menu_information->curr_menu.list_pointer, 0, 0, True); #endif } static void invert_match(wp, match) struct xwindow *wp; char *match; { x11_menu_item *curr; int count; boolean changed = FALSE; reset_menu_count(wp->menu_information); for (count = 0, curr = wp->menu_information->curr_menu.base; curr; curr = curr->next, count++) if (curr->identifier.a_void != 0 && strstri(curr->str, match)) { invert_line(wp, curr, count, -1L); changed = TRUE; } #ifndef USE_FWF if (changed) XawListChange(wp->w, wp->menu_information->curr_menu.list_pointer, 0, 0, True); #endif } static void select_match(wp, match) struct xwindow *wp; char *match; { x11_menu_item *curr; int count; reset_menu_count(wp->menu_information); for (count = 0, curr = wp->menu_information->curr_menu.base; curr; curr = curr->next, count++) if (curr->identifier.a_void != 0 && strstri(curr->str, match)) { if (!curr->selected) { invert_line(wp, curr, count, -1L); #ifndef USE_FWF XawListChange(wp->w, wp->menu_information->curr_menu.list_pointer, 0, 0, True); #endif } return; } /* no match */ X11_nhbell(); } static void menu_popdown(wp) struct xwindow *wp; { nh_XtPopdown(wp->popup); /* remove the event grab */ if (wp->menu_information->is_active) exit_x_event = TRUE; /* exit our event handler */ wp->menu_information->is_up = FALSE; /* menu is down */ } #ifdef USE_FWF /* * Make sure our idea of selected matches the FWF Multilist's idea of what * is currently selected. The MultiList's selected list can change without * notifying us if one or more items are selected and then another is * selected (not toggled). Then the items that were selected are deselected * but we are not notified. */ static void sync_selected(menu_info, num_selected, items) struct menu_info_t *menu_info; int num_selected; int *items; { int i, j, *ip; x11_menu_item *curr; Boolean found; for (i=0, curr = menu_info->curr_menu.base; curr; i++, curr = curr->next) { found = False; for (j = 0, ip = items; j < num_selected; j++, ip++) if (*ip == i) { found = True; break; } #if 0 if (curr->selected && !found) printf("sync: deselecting %s\n", curr->str); else if (!curr->selected && found) printf("sync: selecting %s\n", curr->str); #endif curr->selected = found ? TRUE : FALSE; } } #endif /* USE_FWF */ /* Global functions ======================================================== */ void X11_start_menu(window) winid window; { struct xwindow *wp; check_winid(window); wp = &window_list[window]; if (wp->menu_information->is_menu) { /* make sure we'ere starting with a clean slate */ free_menu(&wp->menu_information->new_menu); } else { wp->menu_information->is_menu = TRUE; } } /*ARGSUSED*/ void X11_add_menu(window, glyph, identifier, ch, gch, attr, str, preselected) winid window; int glyph; /* unused (for now) */ const anything *identifier; char ch; char gch; /* group accelerator (0 = no group) */ int attr; const char *str; boolean preselected; { x11_menu_item *item; struct menu_info_t *menu_info; check_winid(window); menu_info = window_list[window].menu_information; if (!menu_info->is_menu) { impossible("add_menu: called before start_menu"); return; } item = (x11_menu_item *) alloc((unsigned)sizeof(x11_menu_item)); item->next = (x11_menu_item *) 0; item->identifier = *identifier; item->attr = attr; /* item->selected = preselected; */ item->selected = FALSE; item->pick_count = -1L; if (identifier->a_void) { char buf[4+BUFSZ]; int len = strlen(str); if (!ch) { /* Supply a keyboard accelerator. Only the first 52 get one. */ if (menu_info->new_menu.curr_selector) { ch = menu_info->new_menu.curr_selector++; if (ch == 'z') menu_info->new_menu.curr_selector = 'A'; else if (ch == 'Z') menu_info->new_menu.curr_selector = 0; /* out */ } } if (len >= BUFSZ) { /* We *think* everything's coming in off at most BUFSZ bufs... */ impossible("Menu item too long (%d).", len); len = BUFSZ - 1; } Sprintf(buf, "%c - ", ch ? ch : ' '); (void) strncpy(buf+4, str, len); buf[4+len] = '\0'; item->str = copy_of(buf); } else { /* no keyboard accelerator */ item->str = copy_of(str); ch = 0; } item->selector = ch; item->gselector = gch; if (menu_info->new_menu.last) { menu_info->new_menu.last->next = item; } else { menu_info->new_menu.base = item; } menu_info->new_menu.last = item; menu_info->new_menu.count++; } void X11_end_menu(window, query) winid window; const char *query; { struct menu_info_t *menu_info; check_winid(window); menu_info = window_list[window].menu_information; if (!menu_info->is_menu) { impossible("end_menu: called before start_menu"); return; } menu_info->new_menu.query = copy_of(query); } int X11_select_menu(window, how, menu_list) winid window; int how; menu_item **menu_list; { x11_menu_item *curr; struct xwindow *wp; struct menu_info_t *menu_info; Arg args[10]; Cardinal num_args; String *ptr; int retval; Dimension v_pixel_width, v_pixel_height; boolean labeled; Widget viewport_widget, form, label, ok, cancel, all, none, invert, search; Boolean sens; #ifdef USE_FWF Boolean *boolp; #endif char gacc[QBUFSZ], *ap; *menu_list = (menu_item *) 0; check_winid(window); wp = &window_list[window]; menu_info = wp->menu_information; if (!menu_info->is_menu) { impossible("select_menu: called before start_menu"); return 0; } menu_info->how = (short) how; /* collect group accelerators; for PICK_NONE, they're ignored; for PICK_ONE, only those which match exactly one entry will be accepted; for PICK_ANY, those which match any entry are okay */ gacc[0] = '\0'; if (menu_info->how != PICK_NONE) { int i, n, gcnt[128]; #define GSELIDX(c) ((c) & 127) /* guard against `signed char' */ for (i = 0; i < SIZE(gcnt); i++) gcnt[i] = 0; for (n = 0, curr = menu_info->new_menu.base; curr; curr = curr->next) if (curr->gselector && curr->gselector != curr->selector) { ++n; ++gcnt[GSELIDX(curr->gselector)]; } if (n > 0) /* at least one group accelerator found */ for (ap = gacc, curr = menu_info->new_menu.base; curr; curr = curr->next) if (curr->gselector && !index(gacc, curr->gselector) && (menu_info->how == PICK_ANY || gcnt[GSELIDX(curr->gselector)] == 1)) { *ap++ = curr->gselector; *ap = '\0'; /* re-terminate for index() */ } } menu_info->new_menu.gacc = copy_of(gacc); reset_menu_count(menu_info); /* * Create a string and sensitive list for the new menu. */ menu_info->new_menu.list_pointer = ptr = (String *) alloc((unsigned) (sizeof(String) * (menu_info->new_menu.count+1))); for (curr = menu_info->new_menu.base; curr; ptr++, curr = curr->next) *ptr = (String) curr->str; *ptr = 0; /* terminate list with null */ #ifdef USE_FWF menu_info->new_menu.sensitive = boolp = (Boolean *) alloc((unsigned) (sizeof(Boolean) * (menu_info->new_menu.count))); for (curr = menu_info->new_menu.base; curr; boolp++, curr = curr->next) *boolp = (curr->identifier.a_void != 0); #else menu_info->new_menu.sensitive = (Boolean *) 0; #endif labeled = (menu_info->new_menu.query && *(menu_info->new_menu.query)) ? TRUE : FALSE; /* * Menus don't appear to size components correctly, except * when first created. For 3.2.0 release, just recreate * each time. */ if (menu_info->valid_widgets && (window != WIN_INVEN || !flags.perm_invent)) { XtDestroyWidget(wp->popup); menu_info->valid_widgets = FALSE; menu_info->is_up = FALSE; } if (!menu_info->valid_widgets) { Dimension row_spacing; num_args = 0; XtSetArg(args[num_args], XtNallowShellResize, True); num_args++; wp->popup = XtCreatePopupShell( window == WIN_INVEN ? "inventory" : "menu", how == PICK_NONE ? topLevelShellWidgetClass: transientShellWidgetClass, toplevel, args, num_args); XtOverrideTranslations(wp->popup, XtParseTranslationTable("WM_PROTOCOLS: menu_delete()")); num_args = 0; XtSetArg(args[num_args], XtNtranslations, XtParseTranslationTable(menu_translations)); num_args++; form = XtCreateManagedWidget("mform", formWidgetClass, wp->popup, args, num_args); num_args = 0; XtSetArg(args[num_args], XtNborderWidth, 0); num_args++; XtSetArg(args[num_args], XtNtop, XtChainTop); num_args++; XtSetArg(args[num_args], XtNbottom, XtChainTop); num_args++; XtSetArg(args[num_args], XtNleft, XtChainLeft); num_args++; XtSetArg(args[num_args], XtNright, XtChainLeft); num_args++; if (labeled) label = XtCreateManagedWidget(menu_info->new_menu.query, labelWidgetClass, form, args, num_args); else label = NULL; /* * Create ok, cancel, all, none, invert, and search buttons.. */ num_args = 0; XtSetArg(args[num_args], XtNfromVert, label); num_args++; XtSetArg(args[num_args], XtNtop, XtChainTop); num_args++; XtSetArg(args[num_args], XtNbottom, XtChainTop); num_args++; XtSetArg(args[num_args], XtNleft, XtChainLeft); num_args++; XtSetArg(args[num_args], XtNright, XtChainLeft); num_args++; ok = XtCreateManagedWidget("OK", commandWidgetClass, form, args, num_args); XtAddCallback(ok, XtNcallback, menu_ok, (XtPointer) wp); num_args = 0; XtSetArg(args[num_args], XtNfromVert, label); num_args++; XtSetArg(args[num_args], XtNfromHoriz, ok); num_args++; XtSetArg(args[num_args], XtNsensitive, how!=PICK_NONE); num_args++; XtSetArg(args[num_args], XtNtop, XtChainTop); num_args++; XtSetArg(args[num_args], XtNbottom, XtChainTop); num_args++; XtSetArg(args[num_args], XtNleft, XtChainLeft); num_args++; XtSetArg(args[num_args], XtNright, XtChainLeft); num_args++; cancel = XtCreateManagedWidget("cancel", commandWidgetClass, form, args, num_args); XtAddCallback(cancel, XtNcallback, menu_cancel, (XtPointer) wp); sens = (how == PICK_ANY); num_args = 0; XtSetArg(args[num_args], XtNfromVert, label); num_args++; XtSetArg(args[num_args], XtNfromHoriz, cancel); num_args++; XtSetArg(args[num_args], XtNsensitive, sens); num_args++; XtSetArg(args[num_args], XtNtop, XtChainTop); num_args++; XtSetArg(args[num_args], XtNbottom, XtChainTop); num_args++; XtSetArg(args[num_args], XtNleft, XtChainLeft); num_args++; XtSetArg(args[num_args], XtNright, XtChainLeft); num_args++; all = XtCreateManagedWidget("all", commandWidgetClass, form, args, num_args); XtAddCallback(all, XtNcallback, menu_all, (XtPointer) wp); num_args = 0; XtSetArg(args[num_args], XtNfromVert, label); num_args++; XtSetArg(args[num_args], XtNfromHoriz, all); num_args++; XtSetArg(args[num_args], XtNsensitive, sens); num_args++; XtSetArg(args[num_args], XtNtop, XtChainTop); num_args++; XtSetArg(args[num_args], XtNbottom, XtChainTop); num_args++; XtSetArg(args[num_args], XtNleft, XtChainLeft); num_args++; XtSetArg(args[num_args], XtNright, XtChainLeft); num_args++; none = XtCreateManagedWidget("none", commandWidgetClass, form, args, num_args); XtAddCallback(none, XtNcallback, menu_none, (XtPointer) wp); num_args = 0; XtSetArg(args[num_args], XtNfromVert, label); num_args++; XtSetArg(args[num_args], XtNfromHoriz, none); num_args++; XtSetArg(args[num_args], XtNsensitive, sens); num_args++; XtSetArg(args[num_args], XtNtop, XtChainTop); num_args++; XtSetArg(args[num_args], XtNbottom, XtChainTop); num_args++; XtSetArg(args[num_args], XtNleft, XtChainLeft); num_args++; XtSetArg(args[num_args], XtNright, XtChainLeft); num_args++; invert = XtCreateManagedWidget("invert", commandWidgetClass, form, args, num_args); XtAddCallback(invert, XtNcallback, menu_invert, (XtPointer) wp); num_args = 0; XtSetArg(args[num_args], XtNfromVert, label); num_args++; XtSetArg(args[num_args], XtNfromHoriz, invert); num_args++; XtSetArg(args[num_args], XtNsensitive, how!=PICK_NONE); num_args++; XtSetArg(args[num_args], XtNtop, XtChainTop); num_args++; XtSetArg(args[num_args], XtNbottom, XtChainTop); num_args++; XtSetArg(args[num_args], XtNleft, XtChainLeft); num_args++; XtSetArg(args[num_args], XtNright, XtChainLeft); num_args++; search = XtCreateManagedWidget("search", commandWidgetClass, form, args, num_args); XtAddCallback(search, XtNcallback, menu_search, (XtPointer) wp); num_args = 0; XtSetArg(args[num_args], XtNallowVert, True); num_args++; XtSetArg(args[num_args], XtNallowHoriz, False); num_args++; XtSetArg(args[num_args], XtNuseBottom, True); num_args++; XtSetArg(args[num_args], XtNuseRight, True); num_args++; /* XtSetArg(args[num_args], XtNforceBars, True); num_args++; */ XtSetArg(args[num_args], XtNfromVert, all); num_args++; XtSetArg(args[num_args], XtNtop, XtChainTop); num_args++; XtSetArg(args[num_args], XtNbottom, XtChainBottom); num_args++; XtSetArg(args[num_args], XtNleft, XtChainLeft); num_args++; XtSetArg(args[num_args], XtNright, XtChainRight); num_args++; viewport_widget = XtCreateManagedWidget( "menu_viewport", /* name */ viewportWidgetClass, form, /* parent widget */ args, num_args); /* values, and number of values */ /* make new menu the current menu */ move_menu(&menu_info->new_menu, &menu_info->curr_menu); num_args = 0; XtSetArg(args[num_args], XtNforceColumns, True); num_args++; XtSetArg(args[num_args], XtNcolumnSpacing, 1); num_args++; XtSetArg(args[num_args], XtNdefaultColumns, 1); num_args++; XtSetArg(args[num_args], XtNlist, menu_info->curr_menu.list_pointer); num_args++; #ifdef USE_FWF XtSetArg(args[num_args], XtNsensitiveArray, menu_info->curr_menu.sensitive); num_args++; XtSetArg(args[num_args], XtNmaxSelectable, menu_info->curr_menu.count); num_args++; #endif wp->w = XtCreateManagedWidget( "menu_list", /* name */ #ifdef USE_FWF xfwfMultiListWidgetClass, #else listWidgetClass, #endif viewport_widget, /* parent widget */ args, /* set some values */ num_args); /* number of values to set */ XtAddCallback(wp->w, XtNcallback, menu_select, (XtPointer) 0); /* Get the font and margin information. */ num_args = 0; XtSetArg(args[num_args], XtNfont, &menu_info->fs); num_args++; XtSetArg(args[num_args], XtNinternalHeight, &menu_info->internal_height); num_args++; XtSetArg(args[num_args], XtNinternalWidth, &menu_info->internal_width); num_args++; XtSetArg(args[num_args], XtNrowSpacing, &row_spacing); num_args++; XtGetValues(wp->w, args, num_args); /* font height is ascent + descent */ menu_info->line_height = menu_info->fs->max_bounds.ascent + menu_info->fs->max_bounds.descent + row_spacing; menu_info->valid_widgets = TRUE; num_args = 0; XtSetArg(args[num_args], XtNwidth, &v_pixel_width); num_args++; XtSetArg(args[num_args], XtNheight, &v_pixel_height); num_args++; XtGetValues(wp->w, args, num_args); } else { Dimension len; viewport_widget = XtParent(wp->w); /* get the longest string on new menu */ v_pixel_width = 0; for (ptr = menu_info->new_menu.list_pointer; *ptr; ptr++) { len = XTextWidth(menu_info->fs, *ptr, strlen(*ptr)); if (len > v_pixel_width) v_pixel_width = len; } /* add viewport internal border */ v_pixel_width += 2 * menu_info->internal_width; v_pixel_height = (2 * menu_info->internal_height) + (menu_info->new_menu.count * menu_info->line_height); /* make new menu the current menu */ move_menu(&menu_info->new_menu, &menu_info->curr_menu); #ifdef USE_FWF XfwfMultiListSetNewData((XfwfMultiListWidget)wp->w, menu_info->curr_menu.list_pointer, 0, 0, TRUE, menu_info->curr_menu.sensitive); #else XawListChange(wp->w, menu_info->curr_menu.list_pointer, 0, 0, TRUE); #endif } /* if viewport will be bigger than the screen, limit its height */ num_args = 0; XtSetArg(args[num_args], XtNwidth, &v_pixel_width); num_args++; XtSetArg(args[num_args], XtNheight, &v_pixel_height); num_args++; XtGetValues(wp->w, args, num_args); if ((Dimension) XtScreen(wp->w)->height * 5 / 6 < v_pixel_height) { /* scrollbar is 14 pixels wide. Widen the form to accommodate it. */ v_pixel_width += 14; /* shrink to fit vertically */ v_pixel_height = XtScreen(wp->w)->height * 5 / 6; num_args = 0; XtSetArg(args[num_args], XtNwidth, v_pixel_width); num_args++; XtSetArg(args[num_args], XtNheight, v_pixel_height); num_args++; XtSetValues(wp->w, args, num_args); } XtRealizeWidget(wp->popup); /* need to realize before we position */ /* if menu is not up, position it */ if (!menu_info->is_up) positionpopup(wp->popup, FALSE); menu_info->is_up = TRUE; if (window == WIN_INVEN && how == PICK_NONE) { /* cant use nh_XtPopup() because it may try to grab the focus */ XtPopup(wp->popup, (int)XtGrabNone); if (!updated_inventory) XMapRaised(XtDisplay(wp->popup), XtWindow(wp->popup)); XSetWMProtocols(XtDisplay(wp->popup), XtWindow(wp->popup), &wm_delete_window, 1); retval = 0; } else { menu_info->is_active = TRUE; /* waiting for user response */ menu_info->cancelled = FALSE; nh_XtPopup(wp->popup, (int)XtGrabExclusive, wp->w); (void) x_event(EXIT_ON_EXIT); menu_info->is_active = FALSE; if (menu_info->cancelled) return -1; retval = 0; for (curr = menu_info->curr_menu.base; curr; curr = curr->next) if (curr->selected) retval++; if (retval) { menu_item *mi; *menu_list = mi = (menu_item *) alloc(retval * sizeof(menu_item)); for (curr = menu_info->curr_menu.base; curr; curr = curr->next) if (curr->selected) { mi->item = curr->identifier; mi->count = curr->pick_count; mi++; } } } return retval; } /* End global functions ==================================================== */ /* * Allocate a copy of the given string. If null, return a string of * zero length. * * This is an exact duplicate of copy_of() in tty/wintty.c. */ static char * copy_of(s) const char *s; { if (!s) s = ""; return strcpy((char *) alloc((unsigned) (strlen(s) + 1)), s); } static void move_menu(src_menu, dest_menu) struct menu *src_menu, *dest_menu; { free_menu(dest_menu); /* toss old menu */ *dest_menu = *src_menu; /* make new menu current */ /* leave no dangling ptrs */ reset_menu_to_default(src_menu); } static void free_menu(mp) struct menu *mp; { while (mp->base) { mp->last = mp->base; mp->base = mp->base->next; free((genericptr_t)mp->last->str); free((genericptr_t)mp->last); } if (mp->query) free((genericptr_t) mp->query); if (mp->gacc) free((genericptr_t) mp->gacc); if (mp->list_pointer) free((genericptr_t) mp->list_pointer); if (mp->sensitive) free((genericptr_t) mp->sensitive); reset_menu_to_default(mp); } static void reset_menu_to_default(mp) struct menu *mp; { mp->base = mp->last = (x11_menu_item *)0; mp->query = (const char *)0; mp->gacc = (const char *)0; mp->count = 0; mp->list_pointer = (String *)0; mp->sensitive = (Boolean *)0; mp->curr_selector = 'a'; /* first accelerator */ } static void clear_old_menu(wp) struct xwindow *wp; { struct menu_info_t *menu_info = wp->menu_information; free_menu(&menu_info->curr_menu); free_menu(&menu_info->new_menu); if (menu_info->valid_widgets) { nh_XtPopdown(wp->popup); menu_info->is_up = FALSE; XtDestroyWidget(wp->popup); menu_info->valid_widgets = FALSE; wp->w = wp->popup = (Widget) 0; } } void create_menu_window(wp) struct xwindow *wp; { wp->type = NHW_MENU; wp->menu_information = (struct menu_info_t *) alloc(sizeof(struct menu_info_t)); (void) memset((genericptr_t) wp->menu_information, '\0', sizeof(struct menu_info_t)); reset_menu_to_default(&wp->menu_information->curr_menu); reset_menu_to_default(&wp->menu_information->new_menu); reset_menu_count(wp->menu_information); wp->w = wp->popup = (Widget) 0; } void destroy_menu_window(wp) struct xwindow *wp; { clear_old_menu(wp); /* this will also destroy the widgets */ free((genericptr_t) wp->menu_information); wp->menu_information = (struct menu_info_t *) 0; wp->type = NHW_NONE; /* allow re-use */ } /*winmenu.c*/ slashem-0.0.7E7F3/win/X11/winmesg.c0000664000076400007640000004221410545462317014642 0ustar aliali/* SCCS Id: @(#)winmesg.c 3.4 1996/04/05 */ /* Copyright (c) Dean Luick, 1992 */ /* NetHack may be freely redistributed. See license for details. */ /* * Message window routines. * * Global functions: * create_message_window() * destroy_message_window() * display_message_window() * append_message() */ #ifndef SYSV #define PRESERVE_NO_SYSV /* X11 include files may define SYSV */ #endif #include #include #include #include #include #include #ifdef PRESERVE_NO_SYSV # ifdef SYSV # undef SYSV # endif # undef PRESERVE_NO_SYSV #endif #include "xwindow.h" /* Window widget declarations */ #include "hack.h" #include "winX.h" static struct line_element *FDECL(get_previous, (struct line_element *)); static void FDECL(set_circle_buf, (struct mesg_info_t *,int)); static char *FDECL(split, (char *,XFontStruct *,DIMENSION_P)); static void FDECL(add_line, (struct mesg_info_t *,const char *)); static void FDECL(redraw_message_window, (struct xwindow *)); static void FDECL(mesg_check_size_change, (struct xwindow *)); static void FDECL(mesg_exposed, (Widget,XtPointer,XtPointer)); static void FDECL(get_gc, (Widget,struct mesg_info_t *)); static void FDECL(mesg_resized, (Widget,XtPointer,XtPointer)); static char mesg_translations[] = "#override\n\ : input() \ "; /* Move the message window's vertical scrollbar's slider to the bottom. */ void set_message_slider(wp) struct xwindow *wp; { Widget scrollbar; float top; scrollbar = XtNameToWidget(XtParent(wp->w), "vertical"); if (scrollbar) { top = 1.0; XtCallCallbacks(scrollbar, XtNjumpProc, &top); } } void create_message_window(wp, create_popup, parent) struct xwindow *wp; /* window pointer */ boolean create_popup; Widget parent; { Arg args[8]; Cardinal num_args; Widget viewport; struct mesg_info_t *mesg_info; wp->type = NHW_MESSAGE; wp->mesg_information = mesg_info = (struct mesg_info_t *) alloc(sizeof(struct mesg_info_t)); mesg_info->fs = 0; mesg_info->num_lines = 0; mesg_info->head = mesg_info->line_here = mesg_info->last_pause = mesg_info->last_pause_head = (struct line_element *) 0; mesg_info->dirty = False; mesg_info->viewport_width = mesg_info->viewport_height = 0; if (iflags.msg_history < appResources.message_lines) iflags.msg_history = appResources.message_lines; if (iflags.msg_history > MAX_HISTORY) /* a sanity check */ iflags.msg_history = MAX_HISTORY; set_circle_buf(mesg_info, (int) iflags.msg_history); /* Create a popup that becomes the parent. */ if (create_popup) { num_args = 0; XtSetArg(args[num_args], XtNallowShellResize, True); num_args++; wp->popup = parent = XtCreatePopupShell("message_popup", topLevelShellWidgetClass, toplevel, args, num_args); /* * If we're here, then this is an auxiliary message window. If we're * cancelled via a delete window message, we should just pop down. */ } /* * Create the viewport. We only want the vertical scroll bar ever to be * visible. If we allow the horizontal scrollbar to be visible it will * always be visible, due to the stupid way the Athena viewport operates. */ num_args = 0; XtSetArg(args[num_args], XtNallowVert, True); num_args++; viewport = XtCreateManagedWidget( "mesg_viewport", /* name */ viewportWidgetClass, /* widget class from Window.h */ parent, /* parent widget */ args, /* set some values */ num_args); /* number of values to set */ /* * Create a message window. We will change the width and height once * we know what font we are using. */ num_args = 0; if (!create_popup) { XtSetArg(args[num_args], XtNtranslations, XtParseTranslationTable(mesg_translations)); num_args++; } wp->w = XtCreateManagedWidget( "message", /* name */ windowWidgetClass, /* widget class from Window.h */ viewport, /* parent widget */ args, /* set some values */ num_args); /* number of values to set */ XtAddCallback(wp->w, XtNexposeCallback, mesg_exposed, (XtPointer) 0); /* * Now adjust the height and width of the message window so that it * is appResources.message_lines high and DEFAULT_MESSAGE_WIDTH wide. */ /* Get the font information. */ num_args = 0; XtSetArg(args[num_args], XtNfont, &mesg_info->fs); num_args++; XtGetValues(wp->w, args, num_args); /* Save character information for fast use later. */ mesg_info->char_width = mesg_info->fs->max_bounds.width; mesg_info->char_height = mesg_info->fs->max_bounds.ascent + mesg_info->fs->max_bounds.descent; mesg_info->char_ascent = mesg_info->fs->max_bounds.ascent; mesg_info->char_lbearing = -mesg_info->fs->min_bounds.lbearing; get_gc(wp->w, mesg_info); wp->pixel_height = ((int)iflags.msg_history) * mesg_info->char_height; /* If a variable spaced font, only use 2/3 of the default size */ if (mesg_info->fs->min_bounds.width != mesg_info->fs->max_bounds.width) { wp->pixel_width = ((2*DEFAULT_MESSAGE_WIDTH)/3) * mesg_info->fs->max_bounds.width; } else wp->pixel_width = (DEFAULT_MESSAGE_WIDTH * mesg_info->fs->max_bounds.width); /* Set the new width and height. */ num_args = 0; XtSetArg(args[num_args], XtNwidth, wp->pixel_width); num_args++; XtSetArg(args[num_args], XtNheight, wp->pixel_height); num_args++; XtSetValues(wp->w, args, num_args); /* make sure viewport height makes sense before realizing it */ num_args = 0; mesg_info->viewport_height = appResources.message_lines * mesg_info->char_height; XtSetArg(args[num_args], XtNheight, mesg_info->viewport_height);num_args++; XtSetValues(viewport, args, num_args); XtAddCallback(wp->w, XtNresizeCallback, mesg_resized, (XtPointer) 0); /* * If we have created our own popup, then realize it so that the * viewport is also realized. */ if (create_popup) { XtRealizeWidget(wp->popup); XSetWMProtocols(XtDisplay(wp->popup), XtWindow(wp->popup), &wm_delete_window, 1); } } void destroy_message_window(wp) struct xwindow *wp; { if (wp->popup) { nh_XtPopdown(wp->popup); if (!wp->keep_window) XtDestroyWidget(wp->popup), wp->popup = (Widget)0; } if (wp->mesg_information) { set_circle_buf(wp->mesg_information, 0); /* free buffer list */ free((genericptr_t)wp->mesg_information), wp->mesg_information = 0; } if (wp->keep_window) XtRemoveCallback(wp->w, XtNexposeCallback, mesg_exposed, (XtPointer)0); else wp->type = NHW_NONE; } /* Redraw message window if new lines have been added. */ void display_message_window(wp) struct xwindow *wp; { if (wp->mesg_information->dirty) redraw_message_window(wp); } /* * Append a line of text to the message window. Split the line if the * rendering of the text is too long for the window. */ void append_message(wp, str) struct xwindow *wp; const char *str; { char *mark, *remainder, buf[BUFSZ]; if (!str) return; Strcpy(buf, str); /* we might mark it up */ remainder = buf; do { mark = remainder; remainder = split(mark, wp->mesg_information->fs, wp->pixel_width); add_line(wp->mesg_information, mark); } while (remainder); } /* private functions ======================================================= */ /* * Return the element in the circular linked list just before the given * element. */ static struct line_element * get_previous(mark) struct line_element *mark; { struct line_element *curr; if (!mark) return (struct line_element *) 0; for (curr = mark; curr->next != mark; curr = curr->next) ; return curr; } /* * Set the information buffer size to count lines. We do this by creating * a circular linked list of elements, each of which represents a line of * text. New buffers are created as needed, old ones are freed if they * are no longer used. */ static void set_circle_buf(mesg_info, count) struct mesg_info_t *mesg_info; int count; { int i; struct line_element *tail, *curr, *head; if (count < 0) panic("set_circle_buf: bad count [= %d]", count); if (count == mesg_info->num_lines) return; /* no change in size */ if (count < mesg_info->num_lines) { /* * Toss num_lines - count line entries from our circular list. * * We lose lines from the front (top) of the list. We _know_ * the list is non_empty. */ tail = get_previous(mesg_info->head); for (i = mesg_info->num_lines - count; i > 0; i--) { curr = mesg_info->head; mesg_info->head = curr->next; if (curr->line) free((genericptr_t)curr->line); free((genericptr_t)curr); } if (count == 0) { /* make sure we don't have a dangling pointer */ mesg_info->head = (struct line_element *) 0; } else { tail->next = mesg_info->head; /* link the tail to the head */ } } else { /* * Add count - num_lines blank lines to the head of the list. * * Create a separate list, keeping track of the tail. */ for (head = tail = 0, i = 0; i < count - mesg_info->num_lines; i++) { curr = (struct line_element *) alloc(sizeof(struct line_element)); curr->line = 0; curr->buf_length = 0; curr->str_length = 0; if (tail) { tail->next = curr; tail = curr; } else { head = tail = curr; } } /* * Complete the circle by making the new tail point to the old head * and the old tail point to the new head. If our line count was * zero, then make the new list circular. */ if (mesg_info->num_lines) { curr = get_previous(mesg_info->head);/* get end of old list */ tail->next = mesg_info->head; /* new tail -> old head */ curr->next = head; /* old tail -> new head */ } else { tail->next = head; } mesg_info->head = head; } mesg_info->num_lines = count; /* Erase the line on a resize. */ mesg_info->last_pause = (struct line_element *) 0; } /* * Make sure the given string is shorter than the given pixel width. If * not, back up from the end by words until we find a place to split. */ static char * split(s, fs, pixel_width) char *s; XFontStruct *fs; /* Font for the window. */ Dimension pixel_width; { char save, *end, *remainder; save = '\0'; remainder = 0; end = eos(s); /* point to null at end of string */ /* assume that if end == s, XXXXXX returns 0) */ while ((Dimension) XTextWidth(fs, s, (int) strlen(s)) > pixel_width) { *end-- = save; while (*end != ' ') { if (end == s) panic("split: eos!"); --end; } save = *end; *end = '\0'; remainder = end + 1; } return remainder; } /* * Add a line of text to the window. The first line in the curcular list * becomes the last. So all we have to do is copy the new line over the * old one. If the line buffer is too small, then allocate a new, larger * one. */ static void add_line(mesg_info, s) struct mesg_info_t *mesg_info; const char *s; { register struct line_element *curr = mesg_info->head; register int new_line_length = strlen(s); if (new_line_length + 1 > curr->buf_length) { if (curr->line) free(curr->line); /* free old line */ curr->buf_length = new_line_length + 1; curr->line = (char *) alloc((unsigned)curr->buf_length); } Strcpy(curr->line, s); /* copy info */ curr->str_length = new_line_length; /* save string length */ mesg_info->head = mesg_info->head->next; /* move head to next line */ mesg_info->dirty = True; /* we have undrawn lines */ } /* * Save a position in the text buffer so we can draw a line to seperate * text from the last time this function was called. * * Save the head position, since it is the line "after" the last displayed * line in the message window. The window redraw routine will draw a * line above this saved pointer. */ void set_last_pause(wp) struct xwindow *wp; { register struct mesg_info_t *mesg_info = wp->mesg_information; #ifdef ERASE_LINE /* * If we've erased the pause line and haven't added any new lines, * don't try to erase the line again. */ if (!mesg_info->last_pause && mesg_info->last_pause_head == mesg_info->head) return; if (mesg_info->last_pause == mesg_info->head) { /* No new messages in last turn. Redraw window to erase line. */ mesg_info->last_pause = (struct line_element *) 0; mesg_info->last_pause_head = mesg_info->head; redraw_message_window(wp); } else { #endif mesg_info->last_pause = mesg_info->head; #ifdef ERASE_LINE } #endif } static void redraw_message_window(wp) struct xwindow *wp; { struct mesg_info_t *mesg_info = wp->mesg_information; register struct line_element *curr; register int row, y_base; /* * Do this the cheap and easy way. Clear the window and just redraw * the whole thing. * * This could be done more effecently with one call to XDrawText() instead * of many calls to XDrawString(). Maybe later. * * Only need to clear if window has new text. */ if (mesg_info->dirty) { XClearWindow(XtDisplay(wp->w), XtWindow(wp->w)); mesg_info->line_here = mesg_info->last_pause; } /* For now, just update the whole shootn' match. */ for (y_base = row = 0, curr = mesg_info->head; row < mesg_info->num_lines; row++, y_base += mesg_info->char_height, curr = curr->next) { XDrawString(XtDisplay(wp->w), XtWindow(wp->w), mesg_info->gc, mesg_info->char_lbearing, mesg_info->char_ascent + y_base, curr->line, curr->str_length); /* * This draws a line at the _top_ of the line of text pointed to by * mesg_info->last_pause. */ if (appResources.message_line && curr == mesg_info->line_here) { XDrawLine(XtDisplay(wp->w), XtWindow(wp->w), mesg_info->gc, 0, y_base, wp->pixel_width, y_base); } } mesg_info->dirty = False; } /* * Check the size of the viewport. If it has shrunk, then we want to * move the vertical slider to the bottom. */ static void mesg_check_size_change(wp) struct xwindow *wp; { struct mesg_info_t *mesg_info = wp->mesg_information; Arg arg[2]; Dimension new_width, new_height; Widget viewport; viewport = XtParent(wp->w); XtSetArg(arg[0], XtNwidth, &new_width); XtSetArg(arg[1], XtNheight, &new_height); XtGetValues(viewport, arg, TWO); /* Only move slider to bottom if new size is smaller. */ if (new_width < mesg_info->viewport_width || new_height < mesg_info->viewport_height) { set_message_slider(wp); } mesg_info->viewport_width = new_width; mesg_info->viewport_height = new_height; } /* Event handler for message window expose events. */ /*ARGSUSED*/ static void mesg_exposed(w, client_data, widget_data) Widget w; XtPointer client_data; /* unused */ XtPointer widget_data; /* expose event from Window widget */ { XExposeEvent *event = (XExposeEvent *) widget_data; if (XtIsRealized(w) && event->count == 0) { struct xwindow *wp; Display *dpy; Window win; XEvent evt; /* * Drain all pending expose events for the message window; * we'll redraw the whole thing at once. */ dpy = XtDisplay(w); win = XtWindow(w); while (XCheckTypedWindowEvent(dpy, win, Expose, &evt)) continue; wp = find_widget(w); if (wp->keep_window && !wp->mesg_information) return; mesg_check_size_change(wp); redraw_message_window(wp); } } static void get_gc(w, mesg_info) Widget w; struct mesg_info_t *mesg_info; { XGCValues values; XtGCMask mask = GCFunction | GCForeground | GCBackground | GCFont; Pixel fgpixel, bgpixel; Arg arg[2]; XtSetArg(arg[0], XtNforeground, &fgpixel); XtSetArg(arg[1], XtNbackground, &bgpixel); XtGetValues(w, arg, TWO); values.foreground = fgpixel; values.background = bgpixel; values.function = GXcopy; values.font = WindowFont(w); mesg_info->gc = XtGetGC(w, mask, &values); } /* * Handle resizes on a message window. Correct saved pixel height and width. * Adjust circle buffer to accomidate the new size. * * Problem: If the resize decreases the width of the window such that * some lines are now longer than the window, they will be cut off by * X itself. All new lines will be split to the new size, but the ends * of the old ones will not be seen again unless the window is lengthened. * I don't deal with this problem because it isn't worth the trouble. */ /* ARGSUSED */ static void mesg_resized(w, client_data, call_data) Widget w; XtPointer call_data, client_data; { Arg args[4]; Cardinal num_args; Dimension pixel_width, pixel_height; struct xwindow *wp; #ifdef VERBOSE int old_lines; old_lines = wp->mesg_information->num_lines;; #endif num_args = 0; XtSetArg(args[num_args], XtNwidth, &pixel_width); num_args++; XtSetArg(args[num_args], XtNheight, &pixel_height); num_args++; XtGetValues(w, args, num_args); wp = find_widget(w); wp->pixel_width = pixel_width; wp->pixel_height = pixel_height; set_circle_buf(wp->mesg_information, (int) pixel_height / wp->mesg_information->char_height); #ifdef VERBOSE printf("Message resize. Pixel: width = %d, height = %d; Lines: old = %d, new = %d\n", pixel_width, pixel_height, old_lines, wp->mesg_information->num_lines); #endif } /*winmesg.c*/ slashem-0.0.7E7F3/win/X11/slashem.rc0000664000076400007640000000641510545462317015012 0ustar aliali# # Slash'EM configuration file. # # Naming this file $(HOME)/.slashemrc (for UNIX) or setting the environment # variable SLASHEMOPTIONS to point to its full path name elsewhere tells # Slash'EM to use X11 windowing and fonts (provided the executable was # compiled with that ability). # # TILESET=name:Small tiles, file:x11tiles TILESET=name:Big tiles, file:x11bigtiles, transparent # # OPTIONS=windowtype:x11,toptenwin,hilite_pet,color OPTIONS=confirm,male,fixinv,noautopickup,safe_pet,sortpack,tombstone OPTIONS=verbose,news,fruit:pineapple OPTIONS=dogname:Dhairrhuwyth OPTIONS=catname:Ghisteslwchlohm #OPTIONS=tiles:Small tiles # # There are 17 object symbols and various graphics symbols. # The descriptions of these symbols can be found in dat/opthelp. # # # Font: nh10 (10x20) # OBJECTS= 180 183 188 192 181 184 182 189 190 196 \ 191 194 193 187 185 186 195 # DUNGEON= 032 025 018 013 012 014 011 015 023 024 \ 022 021 128 129 130 131 132 035 035 133 \ 134 135 136 137 145 146 144 124 143 142 \ 143 141 140 149 150 031 031 147 148 031 \ 161 140 # TRAPS= 138 138 138 138 138 138 138 138 138 138 \ 138 138 138 138 138 139 138 138 138 138 \ 138 138 # EFFECTS= 151 152 153 154 155 156 157 158 \ 159 160 161 162 \ 163 164 165 166 167 168 169 170 \ 171 172 173 174 175 176 177 178 179 \ 171 172 173 174 175 176 177 178 179 \ 171 172 173 174 175 176 177 178 179 \ 171 172 173 174 175 176 177 178 179 \ 171 172 173 174 175 176 177 178 179 \ 171 172 173 174 175 176 177 178 179 \ 171 172 173 174 175 176 177 178 179 # # # Font: ibm (8x14) # #OBJECTS= 207 210 215 219 208 211 209 216 217 223 \ # 218 221 220 214 212 213 222 # #DUNGEON= 032 128 129 130 131 132 133 134 135 136 \ # 137 138 139 045 124 142 143 035 035 144 \ # 145 146 147 148 155 156 227 124 154 153 \ # 154 152 151 159 160 200 200 157 158 250 \ # 170 151 # #TRAPS= 149 149 149 149 149 149 149 149 149 149 \ # 149 149 149 149 149 150 149 149 149 149 \ # 149 149 # #EFFECTS= 161 162 163 164 165 166 167 168 \ # 169 170 171 172 \ # 173 174 175 176 177 178 179 180 \ # 181 182 183 184 185 186 187 188 189 \ # 181 182 183 184 185 186 187 188 189 \ # 181 182 183 184 185 186 187 188 189 \ # 181 182 183 184 185 186 187 188 189 \ # 181 182 183 184 185 186 187 188 189 \ # 181 182 183 184 185 186 187 188 189 \ # 181 182 183 184 185 186 187 188 189 # # # Font: a "standard" font like 6x13 # Note that this version is unlikely to work on a tty on a Unix system because # many of these characters are also control characters. # #DUNGEON = 032 025 018 013 012 014 011 015 023 024 \ # 022 021 031 045 124 043 043 035 035 031 \ # 035 001 060 062 060 062 019 124 092 035 \ # 092 123 125 031 125 046 046 035 035 046 \ # 127 125 # #TRAPS= 094 094 094 094 094 094 094 094 094 094 \ # 094 094 094 094 094 002 094 094 094 094 \ # 094 094 # #EFFECTS= 124 045 092 047 042 033 041 040 \ # 048 035 064 042 \ # 047 045 092 124 124 092 045 047 \ # 047 064 092 064 064 064 092 064 047 \ # 047 064 092 064 064 064 092 064 047 \ # 047 064 092 064 064 064 092 064 047 \ # 047 064 092 064 064 064 092 064 047 \ # 047 064 092 064 064 064 092 064 047 \ # 047 064 092 064 064 064 092 064 047 \ # 047 064 092 064 064 064 092 064 047 slashem-0.0.7E7F3/win/X11/nh10.bdf0000664000076400007640000013461110545462317014253 0ustar alialiSTARTFONT 2.1 COMMENT Nethack 10x20 font. Based on the font 10x20. FONT nh10 SIZE 20 75 75 FONTBOUNDINGBOX 10 20 0 -5 STARTPROPERTIES 19 FONTNAME_REGISTRY "" FOUNDRY "Misc" FAMILY_NAME "Fixed" WEIGHT_NAME "Medium" SLANT "R" SETWIDTH_NAME "Normal" ADD_STYLE_NAME "NetHack" PIXEL_SIZE 20 POINT_SIZE 200 RESOLUTION_X 75 RESOLUTION_Y 75 SPACING "C" AVERAGE_WIDTH 100 CHARSET_REGISTRY "ISO8859" CHARSET_ENCODING "1" DEFAULT_CHAR 0 FONT_DESCENT 5 FONT_ASCENT 15 COPYRIGHT "Copyright 1989-1991 Network Computing Devices, Inc." ENDPROPERTIES CHARS 256 STARTCHAR C000 ENCODING 0 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR C001 ENCODING 1 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0c00 1e00 3f00 7f80 7f80 3f00 1e00 0c00 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR C002 ENCODING 2 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 5540 aa80 5540 aa80 5540 aa80 5540 aa80 5540 aa80 5540 aa80 5540 aa80 5540 aa80 5540 aa80 5540 aa80 ENDCHAR STARTCHAR C003 ENCODING 3 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 6600 6600 6600 7e00 6600 6600 6600 0000 1f80 0600 0600 0600 0600 0600 0000 0000 ENDCHAR STARTCHAR C004 ENCODING 4 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 7c00 6000 6000 7800 6000 6000 6000 0f80 0c00 0c00 0f00 0c00 0c00 0c00 0000 0000 ENDCHAR STARTCHAR C005 ENCODING 5 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 3c00 6600 6000 6000 6600 3c00 0000 1f00 1980 1980 1f00 1e00 1b00 1980 0000 0000 ENDCHAR STARTCHAR C006 ENCODING 6 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 3000 3000 3000 3000 3000 3e00 0000 0f80 0c00 0c00 0f00 0c00 0c00 0c00 0000 0000 ENDCHAR STARTCHAR C007 ENCODING 7 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1e00 3300 3300 3300 1e00 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR C010 ENCODING 8 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0c00 0c00 7f80 0c00 0c00 0000 7f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR C011 ENCODING 9 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 6600 7600 7e00 7e00 6e00 6600 0000 0c00 0c00 0c00 0c00 0c00 0c00 0f80 0000 0000 ENDCHAR STARTCHAR C012 ENCODING 10 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 6600 6600 6600 3c00 3c00 1800 1800 0000 1f80 0600 0600 0600 0600 0600 0000 0000 ENDCHAR STARTCHAR C013 ENCODING 11 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 fc00 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR C014 ENCODING 12 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 fc00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR C015 ENCODING 13 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0fc0 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR C016 ENCODING 14 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0fc0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR C017 ENCODING 15 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ffc0 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR C020 ENCODING 16 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 ffc0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR C021 ENCODING 17 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 ffc0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR C022 ENCODING 18 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 ffc0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR C023 ENCODING 19 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ffc0 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR C024 ENCODING 20 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ffc0 0000 0000 0000 0000 ENDCHAR STARTCHAR C025 ENCODING 21 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0fc0 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR C026 ENCODING 22 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 fc00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR C027 ENCODING 23 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ffc0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR C030 ENCODING 24 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 ffc0 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR C031 ENCODING 25 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR C032 ENCODING 26 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 01c0 0700 1c00 7000 1c00 0700 01c0 0000 0000 7fc0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR C033 ENCODING 27 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 7000 1c00 0700 01c0 0700 1c00 7000 0000 0000 7fc0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR C034 ENCODING 28 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0080 3f80 5b00 1b00 1b00 1b00 1b00 3300 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR C035 ENCODING 29 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0180 0300 7fc0 0600 0c00 7fc0 1800 3000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR C036 ENCODING 30 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0f00 1980 1980 1800 1800 1800 7e00 1800 1800 1800 7c00 56c0 7380 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR C037 ENCODING 31 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0c00 0c00 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR space ENCODING 32 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ! ENCODING 33 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0000 0c00 0c00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR " ENCODING 34 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3300 3300 3300 1200 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR # ENCODING 35 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0d80 0d80 0d80 3fc0 1b00 1b00 1b00 7f80 3600 3600 3600 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR $ ENCODING 36 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0c00 3f00 6d80 6c00 6c00 6c00 3f00 0d80 0d80 0d80 6d80 3f00 0c00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR % ENCODING 37 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 3980 6d80 6f00 3b00 0600 0600 0c00 0c00 1b80 1ec0 36c0 3380 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR & ENCODING 38 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1c00 3600 3600 3600 3c00 1800 3800 6c00 66c0 6380 6300 7780 3cc0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ' ENCODING 39 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0f00 0e00 1800 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ( ENCODING 40 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0300 0600 0c00 0c00 1800 1800 1800 1800 1800 0c00 0c00 0600 0300 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ) ENCODING 41 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3000 1800 0c00 0c00 0600 0600 0600 0600 0600 0c00 0c00 1800 3000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR * ENCODING 42 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 3300 3300 1e00 7f80 1e00 3300 3300 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR + ENCODING 43 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0c00 0c00 0c00 7f80 0c00 0c00 0c00 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR , ENCODING 44 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0e00 0e00 1800 0000 0000 0000 0000 ENDCHAR STARTCHAR - ENCODING 45 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 7f80 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR . ENCODING 46 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0e00 0e00 0e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR / ENCODING 47 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0180 0180 0300 0300 0600 0600 0c00 0c00 1800 1800 3000 3000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 0 ENCODING 48 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0c00 1e00 3300 3300 6180 6180 6180 6180 6180 3300 3300 1e00 0c00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 1 ENCODING 49 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0c00 1c00 3c00 6c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 7f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 2 ENCODING 50 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1e00 3300 6180 6180 0180 0180 0300 0e00 1800 3000 6000 6000 7f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 3 ENCODING 51 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1e00 3300 6180 6180 0180 0300 0e00 0300 0180 6180 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 4 ENCODING 52 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0100 0300 0700 0f00 1b00 3300 6300 6300 7f80 0300 0300 0300 0300 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 5 ENCODING 53 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 7f80 6000 6000 6000 6000 6e00 7300 0180 0180 0180 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 6 ENCODING 54 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1e00 3300 6100 6000 6000 6e00 7300 6180 6180 6180 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 7 ENCODING 55 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 7f80 0180 0180 0300 0300 0600 0600 0c00 0c00 1800 1800 3000 3000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 8 ENCODING 56 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1e00 3300 6180 6180 6180 3300 1e00 3300 6180 6180 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR 9 ENCODING 57 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1e00 3300 6180 6180 6180 6180 3380 1d80 0180 0180 2180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR : ENCODING 58 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0e00 0e00 0000 0000 0000 0000 0e00 0e00 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ; ENCODING 59 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0e00 0e00 0000 0000 0000 0000 0e00 0e00 1c00 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR < ENCODING 60 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0100 0300 0600 0c00 1800 3000 6000 3000 1800 0c00 0600 0300 0100 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR = ENCODING 61 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 7f80 0000 0000 0000 0000 7f80 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR > ENCODING 62 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 2000 3000 1800 0c00 0600 0300 0180 0300 0600 0c00 1800 3000 2000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ? ENCODING 63 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1e00 3300 6180 6180 6180 0300 0600 0c00 0c00 0c00 0000 0c00 0c00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR @ ENCODING 64 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1e00 3300 6180 6780 6f80 6d80 6d80 6d80 6f00 6600 6000 3180 1f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR A ENCODING 65 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0c00 1e00 3300 3300 6180 6180 6180 7f80 6180 6180 6180 6180 6180 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR B ENCODING 66 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 7c00 6600 6300 6300 6300 6600 7e00 6300 6180 6180 6180 6300 7e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR C ENCODING 67 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1e00 3300 6180 6000 6000 6000 6000 6000 6000 6000 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR D ENCODING 68 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 7e00 6300 6180 6180 6180 6180 6180 6180 6180 6180 6180 6300 7e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR E ENCODING 69 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 7f80 6000 6000 6000 6000 6000 7e00 6000 6000 6000 6000 6000 7f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR F ENCODING 70 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 7f80 6000 6000 6000 6000 6000 7e00 6000 6000 6000 6000 6000 6000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR G ENCODING 71 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1e00 3300 6180 6000 6000 6000 6780 6180 6180 6180 6180 3380 1e80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR H ENCODING 72 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 6180 6180 6180 6180 6180 6180 7f80 6180 6180 6180 6180 6180 6180 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR I ENCODING 73 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 7f80 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 7f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR J ENCODING 74 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0f80 0180 0180 0180 0180 0180 0180 0180 0180 6180 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR K ENCODING 75 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 6180 6180 6300 6300 6600 6600 7c00 6600 6600 6300 6300 6180 6180 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR L ENCODING 76 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 6000 6000 6000 6000 6000 6000 6000 6000 6000 6000 6000 6000 7f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR M ENCODING 77 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 6180 6180 7380 7380 7f80 6d80 6d80 6d80 6d80 6180 6180 6180 6180 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR N ENCODING 78 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 6180 7180 7180 7980 7980 6d80 6d80 6780 6780 6380 6380 6180 6180 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR O ENCODING 79 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1e00 3300 6180 6180 6180 6180 6180 6180 6180 6180 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR P ENCODING 80 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 7e00 6300 6180 6180 6180 6180 6300 7e00 6000 6000 6000 6000 6000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Q ENCODING 81 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1e00 3300 6180 6180 6180 6180 6180 6180 6180 6d80 6780 3300 1f00 0180 0000 0000 0000 0000 ENDCHAR STARTCHAR R ENCODING 82 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 7e00 6300 6180 6180 6180 6180 6300 7e00 6600 6300 6300 6180 6180 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR S ENCODING 83 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1e00 3300 6180 6000 6000 3000 1e00 0300 0180 0180 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR T ENCODING 84 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 7f80 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR U ENCODING 85 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 6180 6180 6180 6180 6180 6180 6180 6180 6180 6180 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR V ENCODING 86 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 6180 6180 6180 6180 3300 3300 3300 1e00 1e00 1e00 0c00 0c00 0c00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR W ENCODING 87 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 6180 6180 6180 6180 6180 6d80 6d80 6d80 6d80 7380 7380 6180 6180 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR X ENCODING 88 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 6180 6180 3300 3300 1e00 1e00 0c00 1e00 1e00 3300 3300 6180 6180 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Y ENCODING 89 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 6180 6180 3300 3300 1e00 1e00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Z ENCODING 90 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 7f80 0180 0180 0300 0600 0600 0c00 1800 1800 3000 6000 6000 7f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR [ ENCODING 91 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3f00 3000 3000 3000 3000 3000 3000 3000 3000 3000 3000 3000 3f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR \ ENCODING 92 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 3000 3000 1800 1800 0c00 0c00 0600 0600 0300 0300 0180 0180 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ] ENCODING 93 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3f00 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 0300 3f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ^ ENCODING 94 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0c00 1e00 3300 6180 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR _ ENCODING 95 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 7fc0 0000 0000 0000 0000 ENDCHAR STARTCHAR ` ENCODING 96 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3c00 1c00 0600 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR a ENCODING 97 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 1f00 3180 0180 3f80 6180 6180 6180 3e80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR b ENCODING 98 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 6000 6000 6000 6000 6000 6e00 7300 6180 6180 6180 6180 7300 6e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR c ENCODING 99 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 1f00 3180 6000 6000 6000 6000 3180 1f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR d ENCODING 100 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0180 0180 0180 0180 0180 1d80 3380 6180 6180 6180 6180 3380 1d80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR e ENCODING 101 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 1e00 3300 6180 7f80 6000 6000 3180 1f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR f ENCODING 102 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0f00 1980 1980 1800 1800 1800 1800 7e00 1800 1800 1800 1800 1800 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR g ENCODING 103 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 3e80 6380 6300 6300 6300 3e00 6000 3f00 6180 6180 6180 3f00 0000 ENDCHAR STARTCHAR h ENCODING 104 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 6000 6000 6000 6000 6000 6e00 7300 6180 6180 6180 6180 6180 6180 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR i ENCODING 105 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0c00 0c00 0000 3c00 0c00 0c00 0c00 0c00 0c00 0c00 7f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR j ENCODING 106 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0180 0180 0000 0780 0180 0180 0180 0180 0180 0180 0180 3180 3180 3180 1f00 0000 ENDCHAR STARTCHAR k ENCODING 107 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 6000 6000 6000 6000 6000 6300 6600 6c00 7800 7c00 6600 6300 6180 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR l ENCODING 108 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 7f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR m ENCODING 109 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 5b00 7f80 6d80 6d80 6d80 6d80 6d80 6d80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR n ENCODING 110 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 6e00 7300 6180 6180 6180 6180 6180 6180 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR o ENCODING 111 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 1e00 3300 6180 6180 6180 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR p ENCODING 112 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 6e00 7300 6180 6180 6180 6180 7300 6e00 6000 6000 6000 6000 0000 ENDCHAR STARTCHAR q ENCODING 113 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 1d80 3380 6180 6180 6180 6180 3380 1d80 0180 0180 0180 0180 0000 ENDCHAR STARTCHAR r ENCODING 114 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 6f00 3980 3000 3000 3000 3000 3000 3000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR s ENCODING 115 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 3f00 6180 6000 3f00 0180 0180 6180 3f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR t ENCODING 116 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 1800 1800 1800 7e00 1800 1800 1800 1800 1800 1980 0f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR u ENCODING 117 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 6180 6180 6180 6180 6180 6180 3380 1d80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR v ENCODING 118 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 6180 6180 3300 3300 1e00 1e00 0c00 0c00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR w ENCODING 119 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 6180 6180 6180 6d80 6d80 6d80 7f80 3300 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR x ENCODING 120 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 6180 3300 1e00 0c00 0c00 1e00 3300 6180 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR y ENCODING 121 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 6180 6180 6180 6180 6180 6180 3380 1d80 0180 6180 3300 1e00 0000 ENDCHAR STARTCHAR z ENCODING 122 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 3f80 0180 0300 0600 0c00 1800 3000 3f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR { ENCODING 123 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0780 0c00 0c00 0c00 0c00 0c00 7800 0c00 0c00 0c00 0c00 0c00 0780 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR bar ENCODING 124 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR } ENCODING 125 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 7800 0c00 0c00 0c00 0c00 0c00 0780 0c00 0c00 0c00 0c00 0c00 7800 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ~ ENCODING 126 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3980 6d80 6700 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR C177 ENCODING 127 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR doorway ENCODING 128 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 1e00 1200 1200 1e00 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR vodoor ENCODING 129 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 0000 0000 0000 7f80 7f80 0000 0000 0000 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR codoor ENCODING 130 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0c00 0c00 0c00 8c40 8c40 0c00 0c00 0c00 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR vcdoor ENCODING 131 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0c00 0c00 0c00 0c00 0c00 0c00 3300 2100 2100 2100 2100 2100 2100 3300 0c00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR hcdoor ENCODING 132 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 7f80 4080 8040 8040 4080 7f80 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR room ENCODING 133 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0c00 0c00 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR dark corridor ENCODING 134 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 4440 1100 4440 1100 4440 1100 4440 1100 4440 1100 4440 1100 4440 1100 4440 1100 4440 1100 4440 1100 ENDCHAR STARTCHAR lit corridor ENCODING 135 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 5540 aa80 5540 aa80 5540 aa80 5540 aa80 5540 aa80 5540 aa80 5540 aa80 5540 aa80 5540 aa80 5540 aa80 ENDCHAR STARTCHAR upstair ENCODING 136 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0100 0200 0400 0800 1000 2000 1000 0800 0400 0200 0100 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR dnstair ENCODING 137 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 2000 1000 0800 0400 0200 0100 0200 0400 0800 1000 2000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR trap ENCODING 138 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 ffc0 c0c0 e1c0 b340 9e40 8c40 9e40 b340 e1c0 c0c0 ffc0 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR web ENCODING 139 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 4980 f900 4f00 c9c0 9940 9300 f240 9e40 9340 32c0 a640 fcc0 2f80 2580 e4c0 ec80 7f80 4bc0 4940 c900 ENDCHAR STARTCHAR pool ENCODING 140 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP b6c0 0000 2480 db40 0000 9240 6d80 0000 4900 b6c0 0000 2480 db40 0000 9240 6d80 0000 4900 b6c0 0000 ENDCHAR STARTCHAR fountain ENCODING 141 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 1000 0a00 4200 0c00 3000 0280 6800 0100 4800 2900 4800 0900 9c00 1400 ff80 ff80 ff80 ENDCHAR STARTCHAR sink ENCODING 142 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 2100 2100 2100 2100 1e00 1e00 1200 ENDCHAR STARTCHAR throne ENCODING 143 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0100 0100 0100 0100 0100 1f00 0900 0900 3f00 2100 2100 ffc0 ENDCHAR STARTCHAR altar ENCODING 144 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 7f80 7f80 3300 3300 3300 3300 ENDCHAR STARTCHAR up ladder ENCODING 145 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 9000 f000 9000 9000 f000 9100 9380 f540 9100 9100 f100 9100 9100 f000 9000 9000 f000 9000 9000 f000 ENDCHAR STARTCHAR down ladder ENCODING 146 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 9000 f000 9000 9000 f000 9100 9100 f100 9100 9100 f540 9380 9100 f000 9000 9000 f000 9000 9000 f000 ENDCHAR STARTCHAR dbvwall ENCODING 147 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0c00 0c00 0c00 0c00 0c00 3f00 3f00 3f00 3f00 3f00 3f00 3f00 3f00 3f00 3f00 0c00 0c00 0c00 0c00 0c00 ENDCHAR STARTCHAR dbhwall ENCODING 148 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 3f00 3f00 ffc0 ffc0 3f00 3f00 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ice ENCODING 149 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 1200 0c00 0c00 1200 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR lava ENCODING 150 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 8800 0480 0080 3700 1300 9900 0940 4140 0840 2900 8900 a840 4540 ffc0 ffc0 ffc0 ENDCHAR STARTCHAR vbeam ENCODING 151 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0800 0800 0e00 0400 0800 1000 2000 1000 0800 0800 0800 0800 0400 0200 0400 0800 1000 3000 0800 0800 ENDCHAR STARTCHAR hbeam ENCODING 152 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 2000 3000 e8c0 0500 0200 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR lslant ENCODING 153 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 8000 4000 4000 4000 3000 0800 0800 0800 0800 0800 0800 0400 0400 0200 0200 0200 0200 0200 0180 0040 ENDCHAR STARTCHAR rslant ENCODING 154 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0040 0080 0080 0080 0080 0080 0300 0400 0400 0400 0800 0800 1000 2000 4000 4000 4000 4000 4000 8000 ENDCHAR STARTCHAR dig beam ENCODING 155 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 8040 4080 2100 1200 0c00 0c00 1200 2100 4080 8040 8040 4080 2100 1200 0c00 0c00 1200 2100 4080 8040 ENDCHAR STARTCHAR camera flash ENCODING 156 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 4200 0600 6400 0100 0940 4840 0400 2100 1e00 5ec0 1e80 1e00 2500 5440 2000 0d80 2840 c000 9280 0040 ENDCHAR STARTCHAR boomerang left ENCODING 157 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 3000 2800 1400 0a00 0500 0300 0500 0a00 1400 2800 3000 0000 0000 0000 0000 ENDCHAR STARTCHAR boomerang right ENCODING 158 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0300 0500 0a00 1400 2800 3000 2800 1400 0a00 0500 0300 0000 0000 0000 0000 ENDCHAR STARTCHAR shield 1 ENCODING 159 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0200 76c0 fa40 8a00 4680 f900 ea00 e7c0 ddc0 5480 3100 b300 e8c0 4cc0 6c00 6300 4480 a180 1400 0780 ENDCHAR STARTCHAR shield 2 ENCODING 160 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 6100 b340 0040 08c0 77c0 d240 b980 8380 a100 2700 4c40 31c0 bf40 c200 ca00 3380 4180 1b80 0780 ENDCHAR STARTCHAR shield 3 ENCODING 161 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP d000 0600 5e80 4e80 4c80 2000 2800 3e80 5f80 e640 5080 47c0 8380 c880 a940 9840 0dc0 1300 6080 3200 ENDCHAR STARTCHAR shield 4 ENCODING 162 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 4200 d480 95c0 1c40 3c80 9b80 2d80 5280 5900 5400 6500 0680 2780 9c80 af80 2180 6080 2340 4580 3100 ENDCHAR STARTCHAR swallow top left ENCODING 163 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 00c0 0100 0100 0100 0200 0200 0200 0400 0400 0400 ENDCHAR STARTCHAR swallow top center ENCODING 164 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 1e00 6180 8040 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR swallow top right ENCODING 165 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 c000 2000 2000 2000 1000 1000 1000 0800 0800 0800 ENDCHAR STARTCHAR swallow mid left ENCODING 166 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0400 0400 0400 0800 0800 0800 1000 1000 1000 1000 1000 1000 1000 1000 0800 0800 0800 0400 0400 0400 ENDCHAR STARTCHAR swallow mid right ENCODING 167 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0800 0800 0800 0400 0400 0400 0200 0200 0200 0200 0200 0200 0200 0200 0400 0400 0400 0800 0800 0800 ENDCHAR STARTCHAR swallow bot left ENCODING 168 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0400 0400 0400 0200 0200 0200 0100 0100 0100 00c0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR swallow bot center ENCODING 169 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 8040 6180 1e00 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR swallow bot right ENCODING 170 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0800 0800 0800 1000 1000 1000 2000 2000 2000 c000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR explosion 1 ENCODING 171 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 01c0 0e00 31c0 ce00 31c0 c600 18c0 6700 98c0 2300 ccc0 3300 4c40 9380 2440 4980 b640 2880 5300 ENDCHAR STARTCHAR explosion 2 ENCODING 172 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0800 f7c0 0800 f7c0 0800 f7c0 0800 f7c0 0800 f7c0 0800 f7c0 0800 f7c0 0800 f7c0 0800 f7c0 0800 f780 ENDCHAR STARTCHAR explosion 3 ENCODING 173 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 c000 3800 c600 3980 c640 3180 8c40 7300 8cc0 6200 9980 6640 1900 e480 1240 c900 3680 8a40 6500 ENDCHAR STARTCHAR explosion 4 ENCODING 174 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP a4c0 2900 4a40 5480 a500 aa40 aa80 aa80 aa80 5540 aa80 aa80 aa80 aa40 a500 5480 4a40 2900 a4c0 5300 ENDCHAR STARTCHAR explosion 5 ENCODING 175 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0840 f780 0840 7700 8880 7740 8880 b680 aa80 5540 aa80 b680 8880 7740 8880 7700 0840 f780 0840 f780 ENDCHAR STARTCHAR explosion 6 ENCODING 176 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 9280 4a40 2940 9540 5280 2a80 aa80 aa80 aa80 5540 aa80 aa80 aa80 2a80 5280 9540 2940 4a40 9280 6500 ENDCHAR STARTCHAR explosion 7 ENCODING 177 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 2880 b640 4980 2440 9380 4c40 3300 ccc0 2300 98c0 6700 18c0 c600 31c0 ce00 31c0 0e00 01c0 0000 0000 ENDCHAR STARTCHAR explosion 8 ENCODING 178 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0800 f7c0 0800 f7c0 0800 f7c0 0800 f7c0 0800 f7c0 0800 f7c0 0800 f7c0 0800 f7c0 0800 f7c0 0800 0000 ENDCHAR STARTCHAR explosion 9 ENCODING 179 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 8a40 3680 c900 1240 e480 1900 6640 9980 6200 8cc0 7300 8c40 3180 c640 3980 c600 3800 c000 0000 0000 ENDCHAR STARTCHAR illegal object ENCODING 180 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 3b80 4640 4440 4c40 3b80 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR amulet ENCODING 181 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 1e00 2100 2100 2100 1100 1100 0e00 1f00 1f00 0e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR food ENCODING 182 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 3f00 3f00 3f00 1e00 0c00 0c00 0c00 3f00 0000 0000 0000 0000 ENDCHAR STARTCHAR weapon ENCODING 183 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1000 1800 1400 1200 1200 1200 1200 1200 1200 1200 7f80 1c00 1c00 1c00 1c00 1c00 0000 0000 ENDCHAR STARTCHAR tool ENCODING 184 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 1e00 2100 2100 3f00 3f00 3f00 3f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ball ENCODING 185 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0e00 1f00 1f00 1f00 eac0 5780 ENDCHAR STARTCHAR chain ENCODING 186 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 6d80 9240 6d80 ENDCHAR STARTCHAR rock ENCODING 187 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 1e00 3100 2900 4280 6900 5480 5000 2280 4980 5f80 3500 ff40 bfc0 ENDCHAR STARTCHAR armor ENCODING 188 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 2e80 3f80 2a80 3580 2a80 3580 2a80 1500 0a00 0400 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR potion ENCODING 189 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 1e00 0c00 0c00 0c00 0c00 1e00 3700 3d00 2f00 3b00 1e00 0000 0000 0000 ENDCHAR STARTCHAR scroll ENCODING 190 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 3f00 7f80 3f00 2a00 1500 2a00 1500 2a00 3f00 7f80 3f00 0000 0000 0000 0000 ENDCHAR STARTCHAR wand ENCODING 191 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1100 1500 1240 0a80 0100 0400 0400 0800 0800 0800 1000 1000 1000 2000 0000 0000 0000 0000 ENDCHAR STARTCHAR ring ENCODING 192 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 2900 1200 4180 1c00 2280 2200 2200 1c80 4100 1480 2400 0000 0000 0000 0000 ENDCHAR STARTCHAR gem ENCODING 193 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 3e00 6300 2200 1c00 0800 0000 0000 ENDCHAR STARTCHAR gold ENCODING 194 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0000 0000 2a00 2a00 5280 5480 4500 0000 3000 5f00 7d80 6f80 1c00 ENDCHAR STARTCHAR venom ENCODING 195 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 0c00 1200 2200 2c00 1000 0000 0000 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR spbook ENCODING 196 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 3e00 2300 3300 2300 2300 2300 3300 2300 3f00 3f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Aring ENCODING 197 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0c00 1200 1200 0c00 0c00 1e00 3300 6180 6180 7f80 6180 6180 6180 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR AE ENCODING 198 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0f80 1e00 3600 3600 6600 6600 7f80 6600 6600 6600 6600 6600 6780 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Ccedilla ENCODING 199 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1e00 3300 6180 6000 6000 6000 6000 6000 6000 6000 6180 3300 1e00 0c00 0400 1200 0c00 0000 ENDCHAR STARTCHAR Egrave ENCODING 200 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3000 1800 0c00 0000 7f80 6000 6000 6000 7e00 6000 6000 6000 7f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Eacute ENCODING 201 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0600 0c00 1800 0000 7f80 6000 6000 6000 7e00 6000 6000 6000 7f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Ecircumflex ENCODING 202 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0c00 1e00 3300 0000 7f80 6000 6000 6000 7e00 6000 6000 6000 7f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Edieresis ENCODING 203 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3300 3300 0000 0000 7f80 6000 6000 6000 7e00 6000 6000 6000 7f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Igrave ENCODING 204 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3000 1800 0c00 0000 3f00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 3f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Iacute ENCODING 205 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0600 0c00 1800 0000 3f00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 3f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Icircumflex ENCODING 206 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0c00 1e00 3300 0000 3f00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 3f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Idieresis ENCODING 207 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3300 3300 0000 0000 3f00 0c00 0c00 0c00 0c00 0c00 0c00 0c00 3f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Eth ENCODING 208 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 7e00 6300 6180 6180 6180 6180 f980 6180 6180 6180 6180 6300 7e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Ntilde ENCODING 209 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1900 3f00 2600 0000 4180 6180 7180 7980 7d80 6f80 6780 6380 6180 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Ograve ENCODING 210 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3000 1800 0c00 0000 1e00 3300 6180 6180 6180 6180 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Oacute ENCODING 211 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0300 0600 0c00 0000 1e00 3300 6180 6180 6180 6180 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Ocircumflex ENCODING 212 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0c00 1e00 3300 0000 1e00 3300 6180 6180 6180 6180 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Otilde ENCODING 213 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1900 3f00 2600 0000 1e00 3300 6180 6180 6180 6180 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Odieresis ENCODING 214 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3300 3300 0000 0000 1e00 3300 6180 6180 6180 6180 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR multiply ENCODING 215 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 2080 3180 1b00 0e00 0e00 1b00 3180 2080 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Oslash ENCODING 216 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0080 1f80 3300 6380 6580 6580 6980 6980 7180 3300 7e00 4000 0000 0000 0000 0000 ENDCHAR STARTCHAR Ugrave ENCODING 217 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3000 1800 0c00 0000 6180 6180 6180 6180 6180 6180 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Uacute ENCODING 218 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0300 0600 0c00 0000 6180 6180 6180 6180 6180 6180 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Ucircumflex ENCODING 219 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0c00 1e00 3300 0000 6180 6180 6180 6180 6180 6180 6180 3380 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Udieresis ENCODING 220 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3300 3300 0000 0000 6180 6180 6180 6180 6180 6180 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Yacute ENCODING 221 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0300 0600 0c00 0000 4080 6180 3300 1e00 0c00 0c00 0c00 0c00 0c00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR Thorn ENCODING 222 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 3c00 1800 1f00 1980 1980 1980 1f00 1800 1800 1800 3c00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR germandbls ENCODING 223 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 1c00 3e00 7300 6300 6300 6600 6c00 6600 6300 6100 6300 6e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR agave ENCODING 224 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3000 1800 0c00 0000 0000 3f00 6180 0180 3f80 6180 6180 6180 3e80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR aacute ENCODING 225 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0600 0c00 1800 0000 0000 3f00 6180 0180 3f80 6180 6180 6180 3e80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR acircumflex ENCODING 226 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0c00 1e00 3300 0000 0000 3f00 6180 0180 3f80 6180 6180 6180 3e80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR atilde ENCODING 227 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1900 3f00 2600 0000 0000 3f00 6180 0180 3f80 6180 6180 6180 3e80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR adieresis ENCODING 228 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3300 3300 0000 0000 0000 3f00 6180 0180 3f80 6180 6180 6180 3e80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR aring ENCODING 229 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0c00 1200 1200 0c00 3f00 6180 0180 3f80 6180 6180 6180 3e80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ae ENCODING 230 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 3b00 4d80 0d80 0f00 3c00 6c00 6c80 3700 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ccedilla ENCODING 231 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 1f00 3180 6000 6000 6000 6000 3180 1f00 0c00 0400 1200 0c00 0000 ENDCHAR STARTCHAR egrave ENCODING 232 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3000 1800 0c00 0000 0000 1e00 3300 6180 7f80 6000 6000 3180 1f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR eacute ENCODING 233 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0600 0c00 1800 0000 0000 1e00 3300 6180 7f80 6000 6000 3180 1f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ecircumflex ENCODING 234 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0c00 1e00 3300 0000 0000 1e00 3300 6180 7f80 6000 6000 3180 1f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR edieresis ENCODING 235 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3300 3300 0000 0000 0000 1e00 3300 6180 7f80 6000 6000 3180 1f00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR igrave ENCODING 236 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3000 1800 0c00 0000 0000 3c00 0c00 0c00 0c00 0c00 0c00 0c00 7f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR iacute ENCODING 237 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0600 0c00 1800 0000 0000 3c00 0c00 0c00 0c00 0c00 0c00 0c00 7f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR icircumflex ENCODING 238 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0c00 1e00 3300 0000 0000 3c00 0c00 0c00 0c00 0c00 0c00 0c00 7f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR idieresis ENCODING 239 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3300 3300 0000 0000 0000 3c00 0c00 0c00 0c00 0c00 0c00 0c00 7f80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR eth ENCODING 240 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 4400 6c00 3800 3800 6c00 4600 1f00 3380 6180 6180 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ntilde ENCODING 241 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1900 3f00 2600 0000 0000 6e00 7300 6180 6180 6180 6180 6180 6180 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ograve ENCODING 242 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3000 1800 0c00 0000 0000 1e00 3300 6180 6180 6180 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR oacute ENCODING 243 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0600 0c00 1800 0000 0000 1e00 3300 6180 6180 6180 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ocircumflex ENCODING 244 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0c00 1e00 3300 0000 0000 1e00 3300 6180 6180 6180 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR otilde ENCODING 245 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 1900 3f00 2600 0000 0000 1e00 3300 6180 6180 6180 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR odieresis ENCODING 246 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3300 3300 0000 0000 0000 1e00 3300 6180 6180 6180 6180 3300 1e00 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR divide ENCODING 247 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0c00 0c00 0000 0000 7f80 7f80 0000 0000 0c00 0c00 0000 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR oslash ENCODING 248 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 1e80 3380 6380 6780 6d80 7980 3300 7e00 4000 0000 0000 0000 0000 ENDCHAR STARTCHAR ugrave ENCODING 249 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3000 1800 0c00 0000 0000 6180 6180 6180 6180 6180 6180 3380 1d80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR uacute ENCODING 250 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0600 0c00 1800 0000 0000 6180 6180 6180 6180 6180 6180 3380 1d80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ucircumflex ENCODING 251 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0c00 1e00 3300 0000 0000 6180 6180 6180 6180 6180 6180 3380 1d80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR udieresis ENCODING 252 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3300 3300 0000 0000 0000 6180 6180 6180 6180 6180 6180 3380 1d80 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR yacute ENCODING 253 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0600 0c00 1800 0000 0000 0000 6180 6180 6180 6180 6180 3380 1d80 0180 6180 3300 1e00 0000 ENDCHAR STARTCHAR thorn ENCODING 254 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 0000 0000 0000 0000 0000 3800 1e00 1b00 1b00 1e00 1800 1800 3800 0000 0000 0000 0000 0000 ENDCHAR STARTCHAR ydieresis ENCODING 255 SWIDTH 878 0 DWIDTH 10 0 BBX 10 20 0 -5 BITMAP 0000 0000 3300 3300 0000 0000 0000 0000 6180 6180 6180 6180 6180 3380 1d80 0180 6180 3300 1e00 0000 ENDCHAR ENDFONT slashem-0.0.7E7F3/win/X11/Install.X110000664000076400007640000002550010545462317014725 0ustar aliali This document describes the installation of Slash'EM with an X11 interface. There are no explicit UNIX dependencies in this code, but we have only tested it under UNIX, using X11R4, X11R5, or X11R6. We have two reports that the code also works under DesqView/X on MS-DOS with djgpp, but you will have to add dependencies for the X code to that makefile before you can use it. Other X11R4+ platforms may work as well, with some tweaking likely. Follow WIN* in sys/unix/Makefile.src for compilation hints. (If you try to compile it with X11R3 or earlier, you will get many errors, starting with complaints about XtPointer not being declared. If you get around the compilation problems, you will still need a recent library of Athena Widgets to link against. Once compiled, you can probably run it under an R3 X server, though.) The reason this uses the Athena widget set is that the Athena widgets come free from MIT (like X11). Unfortunately, the companies that resell X11 (value subtracted er, added software; yea, yea, that's the ticket) usually discourage its use by either omitting the set or putting it on the "unsupported" portion of their tape. If you do not have the Athena widgets, you may obtain them via anonymous ftp from ftp.x.org. To use this code, define X11_GRAPHICS in include/config.h. (You can comment out TTY_GRAPHICS or change DEFAULT_WINDOW_SYS if you want to, but there's little reason to do so. The X11 version almost requires a config file for full effect, so you can just as well set windowtype there; also, you or someone else might just possibly be stuck in a situation where you can't use the X version -- over a non-blindingly-fast modem, say.) You may also want to define USE_XPM, GRAPHIC_TOMBSTONE as discussed below. In src/Makefile, add $(WINX11SRC), $(WINX11OBJ), and $(WINX11LIB) to WINSRC, WINOBJ, and WINLIB respectively, and compile. This will give you an executable supporting both X11 and tty windowing. If you want to use the optional tiles (multicolored pictures instead of a replacement font), you will need to have the win/share files and change the CNF_SHARE_DATND setting in the top Makefile to contain the tile files before you do your 'make all'. Include x11tiles for the 16x16 tile set and x11bigtiles for the 32x32 set. The available tile sets should be defined in the configuration file. The tiles option can then be used to select the initial tile set or unset to use ASCII characters. See win/x11/slashem.rc and the Guidebook for more information. When using tiles, you have the option of defining USE_XPM in config.h. This causes Slash'EM to use the XPM file format for the "x11(big)tiles" file rather than a custom format. Since the XPM format can be processed by existing tools such as PBMPlus and XV, you can modify the tiles to suit your environment. However, you need to make sure the number of tiles in each row and column of the image remains the same, as the code depends on this to calculate the size of each tile. For example, you may magnify them for display on high-resolution screens using the following command: xpmtoppm x11tiles | pnmscale -xscale 1 -yscale 1.6875 | pnmdepth 255 | ppmquant 100 | ppmtoxpm >x11tiles_big.xpm To use XPM, you must have the free XPM libraries installed in your system. Official xpm releases can be found by ftp on: ftp.x.org (198.4.202.8) contrib/libraries (Boston, USA) avahi.inria.fr (138.96.12.1) pub/xpm (Sophia Antipolis, France) If you do choose to define USE_XPM, be sure to add "-lXpm" to WINX11LIB in src/Makefile. If you define USE_XPM in config.h, you may also define GRAPHIC_TOMBSTONE which causes the closing tombstone to be displayed from the image file specified by the "tombstone" X resource (rip.xpm by default). In this case, make sure the top Makefile CNF_SHARE_X11ND also contains rip.xpm. Whether or not you install tile support, you can provide support for special graphics symbols via alternate fonts. (The fonts and tiles cannot be used at the same time, but the same executable handles both.) The two included X11 fonts use the general Slash'EM map area remapping to represent object/dungeon/trap/effect characters (see win/X11/slashem.rc and the Guidebook) as monocolored symbols and monsters as monocolored letters. For instance, a ruby potion will show up as a potion symbol in red. It's easier to see the difference between fonts and tiles than to describe it. :-) Unless you are the only one using your executable and you already know which you prefer, we suggest installing the optional files for both possibilities and letting each person decide for themselves. To use the included fonts, you will need to install one or both of them and then use the symbol mappings found in slashem.rc. The fonts are found in nh10.bdf and ibm.bdf. You first need to convert the bdf files to whatever form your X11 server recognizes (usually using a command called bdftosnf for R4 servers or bdftopcf for R5 servers). Then run mkfontdir on the directory containing your font files (you might want to copy them to GAMEDIR, from the top Makefile, after you've done "make install"). If these commands aren't familiar, talk to your local X11 guru and read the man pages. Finally, add that directory to your font search path (e.g. xset fp+ GAMEDIR, setting GAMEDIR to the value of GAMEDIR in the top Makefile). Alternatively, you (assuming you are a system administrator) can install the fonts in your standard X11 font directory. If you do not install the fonts in the standard X11 font directory, all persons playing nethack must add that "xset fp+" command to their .xinitrc file, or whatever file they execute when starting X11. Adding the "xset" command to the nethack.sh is also an alternative, though it may clutter your X11 font search path after playing several games, so this method is not recommended. See the note below for the alternative installation procedure for Sun's OpenWindows. If you're using file areas, then the fonts can go in any sensible directory. FILE_AREA_SHARE is suggested for pcf fonts and FILE_AREA_UNSHARE for snf fonts. If your X11 include files and libraries are not installed in a standard place (i.e. /usr/include/X11 and /usr/lib respectively) you will need to prepend an appropriate -I parameter to CFLAGS and a -L parameter to LFLAGS, setting to the place to find the include and library files for X11. Finally, to ensure SlashEM's windows look the way they were intended to look, make sure the top Makefile CNF_SHARE_X11ND also contains SlashEM.ad. If it does, running slashem will automatically take the appropriate steps to cause this file to be used to initialize SlashEM's X11 resources. Alternatively, each person may append the contents of this file to their .Xdefaults file. A second alternative is copy SlashEM.ad to SlashEM in GAMEDIR (or FILE_AREA_SHARE) (from the top Makefile) and add a line to nethack.sh specifying this additional applications defaults directory: XAPPLRESDIR=$HACKDIR; export XAPPLRESDIR (Replace $HACKDIR with the value of FILE_AREA_SHARE if appropriate.) Three icon suggestions to the window manager are supported: nh72, nh56, and nh32. Data for them comes from the source files nh72icon, nh56icon, and nh32icon; they are compiled into the program via #includes in winX.c. Selection between them is controlled by the "icon" resource in SlashEM.ad; the default is nh72. Sorry, an Imakefile is not included. Unlike many X11 programs, X11 support is only a small, optional, part of nethack, and the Makefile is needed for systems that don't use X11. Notes for Sun's OpenWindows: 1. For OpenWindows 3.0 (NOT 2.x), define OPENWINBUG in include/unixconf.h. The library bug from SunOS 4.1.x is fixed in Solaris 2.x (or when proper Sun patches have been applied to 4.1.x), so it is also unnecessary there. (Defining it when unnecessary causes the same problem being avoided when it is necessary. :-) 2. In addition to the changes suggested by the comments in src/Makefile, -- for OpenWindows 2.x and 3.0 (NOT 3.1) (i.e., versions for SunOS 4.x), add -I/usr/openwin/include to CFLAGS, -L/usr/openwin/lib to LFLAGS, and -lm to WINX11LIB in src/Makefile. -- for OpenWindows 3.1 (i.e., versions for Solaris 2.x), add -I/usr/openwin/include to CFLAGS, -L/usr/openwin/lib -L/usr/ccs/lib -R/usr/openwin/lib to LFLAGS, and -lsocket -lnsl -lm to WINX11LIB in src/Makefile. (Naturally, if your OpenWindows is installed elsewhere, adapt the openwin paths.) This will allow you to create a game executable. 3. Run the fonts through convertfont and run bldfamily on the directory. Now you must let your X server know where to find the fonts. For a personal installation, the simplest thing is to include the directory of the fonts in the environment variable FONTPATH, as set in your .profile or .login before starting the server. For a multi-user installation, you have the various "xset fp+" options outlined above for standard X. 4. Something must still be done with the SlashEM.ad file -- all three of the possibilities mentioned for standard X11 should work. Notes for AIX 3.2: 1. AIX 3.2 includes the Athena Widget Toolkit library (and other things) under the /usr/lpp/X11/Xamples tree, so you will have to add -L/usr/lpp/X11/Xamples/lib to LFLAGS. If you can't find libXaw.a on your first build, go into /usr/lib/X11/Xamples, read the README file, and build the library. Notes for XFree86 - (on linux and BSD386 platforms) 1. Edit src/Makefile for linux/BSD386. Even though you use the Open Look Window manager, do not define OPENWINBUG. Use the standard X11 object and library options. 2. Follow the standard installation directions defined above. File Description --------- --------------------------------------------------------------- slashem.rc - A sample configuration file for fonts nh10 and ibm. nh10.bdf - A modified version of the 10x20 standard font. ibm.bdf - A modified version of one of the ibm (8x14) nethack font. Must be used in conjunction with SlashEM.ad or slashem.rc. nh32icon - A 32x32 icon bitmap for use with window managers. nh56icon - A 56x56 icon bitmap for use with window managers. nh72icon - A 72x72 icon bitmap for use with window managers. nh_icon.xpm - A color icon for use with window managers. SlashEM.ad - A sample .Xdefaults for a color screen. ../../include/xwindow.h ../../include/xwindowp.h Window.c - A bare-bones widget that has 16 colors and a drawing canvas. ../../include/winX.h - Defines for the X window-port. win*.c - Code for the X window-port dialogs.c - A better dialog widget. Original code (modified slightly by Dean Luick) distributed under the X copyright by Tim Theisen. This is from his Ghostview program (which is under the GNU public license, v2 or higher). pet_mark.xbm - A pet indicator bitmap for tiles. rip.xpm - A graphical tombstone. tile2x11.c - Converts win/share tiles for X11 use. slashem-0.0.7E7F3/win/X11/rip.xpm0000664000076400007640000024054210545462317014351 0ustar aliali/* XPM */ static char *rip_xpm[] = { /* width height ncolors chars_per_pixel */ "400 200 90 1", /* colors */ " c #36362E", ". c #414146", "X c #2F2F31", "o c #353523", "O c #034702", "+ c #152E0A", "@ c #30311E", "# c #29292B", "$ c #233511", "% c #22221A", "& c #A6A6A2", "* c #3A3A38", "= c #75746B", "- c #191A14", "; c #7F7E78", ": c #12120D", "> c #1F2713", ", c #16330A", "< c #033E01", "1 c #181816", "2 c #033A01", "3 c #043802", "4 c #161614", "5 c #46464D", "6 c #242425", "7 c #0C0C0A", "8 c #15150C", "9 c #454545", "0 c #4B4B37", "q c #1F300F", "w c #1F2E0F", "e c #3F3F3F", "r c #3D3D3D", "t c #1B1B15", "y c #1A2E0D", "u c #888783", "i c #2D2D2D", "p c #292929", "a c #807F7B", "s c #272F13", "d c #313134", "f c #4D4D56", "g c #18180E", "h c #B4B4B1", "j c #989892", "k c #252621", "l c #90908A", "z c #1C1C18", "x c #83827D", "c c #6D6C64", "v c #20201F", "b c #797873", "n c #2C2C2E", "m c #42424A", "M c #434341", "N c #1F1F17", "B c #273B22", "V c #2E2E1F", "C c #7E7D74", "Z c #8B8B84", "A c #1D1D18", "S c #85857E", "D c #4B4B4F", "F c #CECECC", "G c #034301", "H c #034101", "J c #272728", "K c #043302", "L c #353539", "P c #282B15", "I c #5A5B50", "U c #24241B", "Y c #C0C0BE", "T c #30302A", "R c #5E5E61", "E c #1F330F", "W c #DFDFDC", "Q c #8C8C87", "! c #043C01", "~ c #053602", "^ c #38383B", "/ c #053002", "( c #343437", ") c #44444A", "_ c #52525B", "` c #132909", "' c #060603", "] c #292922", "[ c #424237", "{ c #3B3B3A", /* pixels */ "'''''''''''''''''7777777v7''''''''''''''''''''v''k'7777777777777777:7:7:7:7::::::4::4:444444444411111z1zzzzzzvddvvvvvvvvvvv6J#JJJJJ6JJ66JJJJJJ####nnnnXXdL^^^fRLLLLL^^^^^rrr.rm..mmmmmm5m....c_m__.mm.m.mmm.m.mm.mmm.m_).mmmm)_Df555555D5D5D5D5DDDDDfffff_____________cR______c_______c_____R_R_R______R__uffDDDDDDDDDR5D5D5D5D5D5D55R55D55555555555555Ra555555555)5)))))))))))))))))))5)5))5)5)5)))))))5))55555", "'''''''''''''''''''776777'7''''''''''''''''''7'7kv7'7777777777777:77:7:::::::::::::4:44:44444411111111zzzdzzvzvvzvvvvvvvv66JJ##66JJJ6J6JJ6JJJ#####nnnXXXdL^^^^^^LL^^^r^.R^.^.Rmmmm55m5m55m..m_mm)))mmmmmmm))55)mm.m.mm9mmmmmm)555fffff5fffffDDDDfDffffff_______________R_c_cR_____R__cR_______R__R_R_____fRDfDfDD5DD555D5D5555555555R555555D5555555555555555555)))))))))mmmmmmmm))))))))))))))))))))))))))))))))", "''''''''v''''''''77'7777777v''''''''''''''7'7'77'77777777777:7:7:7::7:7::e:::#.:4:44:4:444444X41111zzz1v1vzvzvzvvvzvvvv666J####JJ6#66J6JJJJ#####nnnnXXXXdL^^m^^^^L^^^.RfRm^m.mmm5m555555mmmmm)mm)))))))))5555555mmm_cmmm_)))))5fff5fffffff_ffffffff_b__________________cbRR__c_RR___________R__________ffff5DD5D5D55DD5555555555555555555555555555555555)5_5)))))))mmmmmm9m9m9mmmmmmmmmmmmmmmmmmmm))))))))))))))", "''''''''''''''''v''7777777vv('''''''''''''7'77'77777777777:7:7:::7:7:::::#7474::4:4:44444n9n491111z11v1v1vzvdvvvvvvvv6666######JJJ6J6JJJJJ#J###n#nnXnXXdLL^^^^^^^^^^.^f...f..mmm55555f5_mmmmm)))))))55))55ff5ff55m)m))mR_)))555f5bffff_R_fff________R___________R_____bR____________________________ffffDf5fDDD5f5D55555555555R5555555555555)5)5c))))))))5_)))))mmm).mm)_m.mm)))))m.m.m.m.m9__.).).m.mmmmmm)))))", "''''''''''''''''v'777777777''''''''''''7'7'77'777777777:7:7:7:7:747474:::4:4:4744:44444444411111z11v11v1v1vvvzvvvvv666JJ#######6J6JJJJJJJ#J####nnnnXXXXd(L^mLm^m^.^^.^.^.^m..mmm55555mmmmmm))))555555555D5fff5ff55))))))_D555555fffffffffff_f______________R__R_____R___R_c_R__R__________________Rfff5f5DD5D55D555555555555555D5D5555))))))))))_5))))))))))mmmmm))m5mmm)mm.m555))m.........9.9..m.m.m.m9mmmmmmm", "''''''''''7''7''''v'777777777''''''''''7'777777777777:7:7::7:747474::474:474:444:444:444444111111v11v1v1vvvvv6vvv66J6#6._###^#JJ6JJJJJJJJ#####nnnnXnXdddLLLf^Lm^m^m^^......m^.mm5m5555m)_))))55555555555ff5fff5RfD555_l55555555fff_ffff__ffffff___________________R_________c__________f_fff_f_f_RfffDfDDf5D5D5555555555)55mRD5fRf5555)))5_)))))5)))))))m)))m).m555555)mmmm555555mm........._..m..._.....__m9m9m", "''''''''''''''7'7'c'7'77777'777777777'7'77'77777777:67:7:7:::::::474::4:4:44:4:4447n4444441111dv11v1v1vvv666666#6##J###__.6##66#6JJJJ#######nnnnnXXXXXdddLL^^mLm^m^m.m^m^.^m....mmmmmmm5))555_55555555Dfffffff5f5f=555Rm55555555fffffffff_f_ff_f_______R___________________________f_f_ff_fffffffff5f5f5D5D555555555))))5_DDf5f55f5f555)mm)mmmmmmmmmmm555555)))5555555mm)555555555m....................m..9.m.mm", "'''''''''''''''v'''7''7'7777777776777{v7777777777:777JJ::74747474:47444474:44444444n4444411)1d5vvvvvv66666666#66666####nR^666#JJ##J##J######nnnnnXnXdddLdLL^LLLm^mm^m^m.^..m^..mmmmmm5)))5555D55D5D5D5ffffffRff5ffb5f5555555DD5f5fffffff_fff_ff__ff______________R________b_R____f_fff_RfffffffffR5ffDD5D5D5555555)555555=5f55555555555)m9_mm)m9mmc.m5555f5555_5f_5f55mmm55mmmm555m......................mmmmm))", "''''''''''''''''v''''''777777767777777777777777:77:::J:74J.::4:4:444744444447444444n444111191zvvvvv6v6vvvvvv6v6666666######J#JJ##J##J####ennnnnXXXXdddd5LLLL^m^mmLm^mmm^m^m..m.Rmmm5m5)55555555D55DDDD5f_fffb55f5f5f5f55555D5D5=5f5ffffff_f_f_ff_f____________cc____________bRbfffff_fffffffffDf5ff55DD5D5Rc5555))))555f5f5m555mmm5f5555mm_.mmmm.mmm)55f555555555_5m55mm5mmmmmmm555mm...mm..e.e.e......mmmmmm555", "'''''''''''''''''''''''''77777^6477777777777r:77::7:7:::::#74:47447444.4#4444444444441111111z16vvvvvv1vvvvvvvv6v6666666JJJJ#6###J#####n#nnnnnXnXXXXdd(ddLLLLLmLm^m^m^m^.......m5mm5m5)5555555D5DDDD5f5ffffffff5f5fffRfD555D5D5ff5ff5fffff___ff_f__f____R___________c_____f_ff_ff_fffffffffffDDfDfDDDf55D5555555))55555f555mmmmmmmmm5cf55mm.mm)mm...m5555mm55_5555m5m55m55mm....mmm5m5mmmmm..._e.f.f.e.mm55555555", "''''''''''''v'''''''''7'77777'67774777777::::::::::::4:444:44:44444444#44444444444111111111zdvvv1v1v1vvvvvv6v6666666##J6#J^#########n#nnn#nnnXXXXdddddLLLLLLLLm^mmLm^mm^m...m.mm)))5)555555D55DD5fDDDfff_ffff5f5f5fffff5DDDDf5f5fffffff____f________________R__________f_fff_bRfffRfffDffDDRRf5DD5D55D5555555))55555f5a55mmmm.....mmm555m.mmmmmm..m55m_5mmmmm5mmm5mmmm_mmm..rer.mmmmm5m5m5m........e..m5_5mc55__", "''''''''''''('''''''''''77777777447:7::7:74:474744:4:44:4447444444#44444444114114111111111v1dvvvvv1vvv1vv6d6v6v6666666#J###########n#nnnnnnXnXXXdddd(((LLL^L^Lm^mLm^m^.mm..m.mm))5)555555c55DD5DDRf5fffff_fffff555ffffff5f5D5fDffDffffff_____fb___________R_________f_fbf_ffff____RfDfDfDDDfD5fDD5f5D55555_)5_R555f5555mm..........mm555m.mmmm...m5_mmmmmmmmmm55mmmmmmm..r.r..^.e_f.mmm5mmmmmmm.mm..mm5mm.m_m...", "N''''''''''''''''''''''777777747474474_::474:4444#47444444444444444444111111111X1111111v111vvv6vv1vv16vvvv566v6666##J#J#########n.n#nnnnnXnX._Xdddd()L(LLL^^^^^m^m^m^m...mm.mm))))555555D5fDD5fDf5=ffffRR_ff555f5fffffffffDfDDfDfffRf_f_f__f__bf___Ra__R________R____fff_f_f_______fffDDfDDD5DR55D555555555555f5f55mmmm_m..e....e...mm555mmm.mmmm55mmmmm..fR5mmm5mm..^.^r.^.^.rrr.re.emmmmmmmmmmmmmmmm_m.ee.r.ee", "'''''''N''''N'''''''''7'7747447474474444J44744744n_4444444444444444111111111111115111v11v1v1vv66vvvvvvLvvv6v66666666JJ#J####.##n#nnnnnnnXnXXdXd.e_xalLLLL^^LmLm^m^m^mblabbbmm)))55555555D5D5ff=Rffbff____ff5ff5555fff_fffffRDfffffff_f________b__________R_________fff__f__________ffffDDD5DD5555555D_5))5555f55mmmmm....r..e.Rr..^..mm55mmmmmmm5mmm....r.mmmmmmmm..^.^.^.^.^.^.^.^.^.^r....mmmmmmmmmm..r.r.r.e.", "'''''''v'''NL'''''7'7''7'777774474744447447444444441441411444444441111111v11v11v1d1v111v11vvvv666vvvvvv6v666v6666#6###J######nnnnnnnnnXnX._e=&hY&&jjh^L^^^^^^mLmmfmmmRFYYFWW&lRc555555DDafffffffffff____ff5f55f5f5ffRf__ffffffDffffR__f____________R__c__________ff_f__________ff__f_fD5D5f555D5555555_5)5fff5_5mm....r...r.....r...rmmm_5m5mm5mmm.r.^.^.^.mmmmm_f.f^^r^R.^^.^.^.^rrr^..^.^..........^er.^.^.^.^", "''''''''''''N''''''''77'777774747444#m444447474444441111111111111111111v11Rv11v111v11v1v1v1v166666vvvv6v66v66666#6##J###.##nnnnnnnnXnXXDRjYYhYh&j&&jj^^^^^.^.LmmmRmmmRWFYYFWFWWWhjRR5D55Rff_____ff___fffff5f5f5f5fmff__f__ffDffffR_bR_________________c_______f_f_ff________f_fffff_ffff5f555555555))5))55555f5m....r..r.r.^.^.^.r.^..m__mm5mmmmm....^.^^.^mmmmmmm^L.^.^.^^.^^r^^.^.^.^^^.^.^m^.^^.^rr.^.Rr.r.ee", "'''''''''''''''''7'77'7777777744444447444444444444411v111111111v1v1v1v11v111v1v1vv15v1v1v1vv66666vvvv6v6v66666J6J#J#J#####nn#n.nnnXne=&&hYYhh&&l&h&jQL^^^^^.^fmmmmmmmbFFFYYFWWWFYhYFl=fRfff__________fff5ff5f5f5f5fff_____f_ffffRR_f___________R__R___RR_______fffff______fffffR_ffffff5fffDD5555))))))555f555mm...r..^m^...r..RRm..r.mm_mmmmm....^.f.^.^..m.mmm^.^^^^^^^r^^r.^.^^.^^.f.^^r^.^.^r^^.^.Rrrfe^.^rr", "'''v'''''''''''7'7'7vv7'7777777744744444444444441111v11v11v1v1v11v1111v1v1vv11v1v11v1v1v1vv1666666L6v6v6666666#JJJJ####._nn__nnn.rR&YYhY&hYh&jlQjh&Qarn^^^.Lm^.mmmmmmbWWFYFYWWWYYhhFFYY&bff_______ffff5fff5fff5f5f5f___f___f_ff__R____cR_______c______a____f_ff_fff_____ffff5f5ff55fffffff5ff5f55cc))m)555555_m...em^..bf.r^.rr..^.^.^mm5mmm...^..mm^.m^m^m^mLm^m^^.^r^.^^^.^^^^r^^.^^^^^.^.^.^.^.rfr^.^rr^.^.^r", "'''''''''''''''''77'7{77777777474744744111144444411v11111111111vv1v1v1v1v1v1vv1v1vv1v1vvv1v6v66666m66666666^#6#6########nn..nnXRbhhhhYYYhhh&&hjuQhjQbee^.^.^.^mfmmmmmbFFWFYYFWWWhYYhFFWWY&R____ffffffffffff5f5fff5fff___R_____f__R________R__R______a_____f_f____ff_____ff5f55f55D5fffff5555ff5fm_mmmm5555555mmme.r..^.frrf.^..^.r.^...mmmm..^..m.^m.^m.^mmm^mmL^^fL^^^^^.^^^^^.^^r^^.^r^^^^^^^^^^^r^^^.^.^^^r^.", "''*'''''N'''''7'7'777777777774777474441111144444n111v1v11v1v1v11vv1v1vv1vv1vv1vvvv1vvvv1vvvv66666666v666666#6#6##J####nn#nnnXDlhh&h&hhYh&&j&h&&Qj&&ubr5r^.^.f.mmmmmmmQWWFWYYhWWWhhhYhYFWWFY&uR_fbffffRf=5fDfffDf5fff______u__R_f_________________________f_f__________ffRff5fR5555555f5f555mm55f5)mmmm555f5f_mm..r.^.^.^.^.^.^.^.^ff.^^.m.m^.^^m^mm.^mLm^m^^m^Lm^^R^^^^^^^^^^^^^^.^^^^^^.^.^.^.rf^.^^.r^^^^^.^r^", "''v'''''v''7'7'777vk77r77:74774474747441v11v4444111v111v1dd111v11vv1v1vvdvvv1vv1vvvv1vvvvvvv66#66v66666666#6########nn#nnnnDjhhhh&YFWYYYhjulljjjjh&jQr)dr^m^....mmmmmjWWWWYYYYWWFhYY&hhhFWWYhhaRbffffRfRffffDfDffDfff___________________R___________bR_f______________ff5f5555D555555555m5m5mm5f5mm..m55mmm5_5m.^.^.RR.r.^.^.^fr^.^rff.^.^.^.^.^^f^^m^^mLmfmLmLLL^L^^^^^^^^^^^^^^^^.^^.^^^^^^^^^^^^^^^^^^.^^^^r^", "'''''''v''7'777'77{777777477J4747474411111v1v11111v11v1111111v11v1vv1vv5mv1vvvvvvv1vvvvvvvvv66#6666666666#6#J#J#####n#nn.f&FFhhhh&hWFWWYY&lQQxl&YYYYQM9drm^.m^..mmmmmbWWWFFYFYhWYhYFYhhYhWWWWYFWRRfffRffffffffffDfff_________f_f_______RR___________________R____f_ffff5f55f5D5555555m5m))mmmm5555mmmmm5m55_5m.^.r.rmRr^.^^.^^.^.rrfDf^.^^^.^m^LmRm^^^f^^LLLLLLL^LL^LLLLL^L^^^^^f^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^", "'''''v'''7777777k77k7:7::7474747474744L_mL1d#ddvv11161v1v1dd1vdv1vv1vdvvvvvvv1vvdLvvvvvvvvb666#6666666#######^.###nnnnncjYYYYFhYY&FFFWFYjj&lQj&&Yhu_^^9re.......mmm55f_lFhYhYhjFYYYFFYhFYFWWWWWFF&R_ff_fffffDfffffDff___R______________Rc___c__R_____R_R_______ffffff5f55f55D555555)5)))mmm.m.m5555)5555m5mm5m^.r.^^.^.^^.^^.^^.^^.^r^^^^.L^mL^mL^L^mLRmL^^^^LLLLLLL^^^^L^LD^^^^R^^^^^^^^^^^^f^^^^^^^^^^^^^^^^^^", "''''''''7'77777777777:7:7477474746mu&&h&hj&jQb_Lvvvv1161v1v1v1v1v1vvvv1vvvvvvvvvvvvvvvvv6v6v6##66666#6#6#6######n#n#nnRYFYYhYFYYFhhFWWF&l&&j&hhh&fv6#M9r.^.^...mm_m5m566duhhY&&hYYYWFFhFFFWWWWWWWWFx_fffffffffffffffff___R_R__________R_____________bR________fffff5f55DD5D555555)))))mm).m...mmmm555m5m55mm_mr.^^.^.^r^.r^.^.^^r^^fr^r^^^^^Lm^LLm^^^LbL^^LLLLLLLLLLLLLLLLLDLL^^L^^^^^^^^^^^^D^^^^^^^^^^^^^^^^^^", "'''''7'77777777777:7::::474474#5bhYYYYhhhh&&j&jlu_dvvv1611v1v1vvvvv1vvvvvvvvvvvvvvv6vvLLv6vL66##6#6#6##########n#nnnrjYYFWFYYhFFhYhYYY&auj&j&YYYmz666XM.r.....m.m_55c5Xnvd&hYhhFhYFhFYYhFYFWWWWWWYWFYR_fffffffffffff_f___R_RR____cRR________f__f__________f_Rffff5f5D5f55D555555))))mm.m.........mmmmmmmmmmm.^fr.^^.^^.^^^^^^^.^^.DD^r^^^^^^m^mL^LL^^^L^^^^LLLLLLLLLL(LLLLLLLLLL^L^^^^^^^^^^^L^^^^^^^^^LLLLLLLLL", "'''7''777777777::::4:44744744^jhFFYYYhFYYYhhhh&&jQu_L66161vv1vv1v1vvvvvvvvvvvvv6v6vv6v66666L#####6#6#########nnnnnnbhFYFYFWFFYYFFhhh&juaj&&hhFFjJv#pkJe.r.....mma_5_R5Lv66uhYhFYFFYYYFhYhFWWWWWWFYhWYFQf_f_f_ffffffff____R___R______cR_____________R_____ffffff5DD5D5D5555R55555_))m).m..........f....m^....^..^^.^^.^^^.^.^.^^^^^^^^^^^^^L.^^mLm^^^LLm^^LLLLLL5L(((((((((LLLLLLL^LLLD^^^^L^LL^5LLLLLLL^LLLLLLLL", "''7'77'7777:7:J::44#14444444uFhYFFFFYFhFFYYhY&Ql&ujua_66vvvvvvv6L6vvvvvvvv6v66vv6v6v6v6v66666#d######6#fm##nn#nnn.xFFYYFFFFYhFFFFFFhjbbj&&&YYYYh#v#kvp*e.&YFYYhhj55555m6vvjFFhYFFFYWFYYFFYFYFWWWWYYhhFW&=f_ff_f_f_fR______bRb___________R_ff______R____fff_ffff5D5D5555555__5))5))mmm........fe.r.r.rrr.^.^^.^^.^^.^^^.^^^f^^^r^^^^^^^^^L^^Lm^LmL^mLLLLL^LLLLdd5d(d(d(d(((((LLLRLLL^LLLLLLLL^LLLLLLLLLLLLLLL((((", "'7'7'7777:7::7:744444m1111#uWFFWWWFWFFhYFYYYYhj&jQjQQuRLvvv6v6v666666v6v6vv6vv6v6v6v66666666#n###6########nn#nn#.YYYFYFFFWYFhhFFFYWYlaQQ&lYFWhYF)6piiTpmRhYhFFYhhcR5D5Rk#^FWFYFFYFhWFYhWWWYYFWWWWYYYYFFFhR_f_f_f_f__f___R__R_RR__R___________R__R_____f_ffffcf55D555555555D5)5))))mm........e..r.e.^..^.^.^.^.^^.^^^.^^^^^^^^^^^^^^^^^LLfLL^^LmLLmLLLLfLLLLdLd((((((((((d((((((RLLLLLLLLLLLLLLLLLLLLL(((((((((((", "'7'7777777::74:444444m_dv_&YFYYWWFWFWYFFFYYYhhhj&&j&ajabfv6v666666666666L66v66666666666666###n##########nn#nnnnfYFYFYFFFFFYFFhhFYFFY&j&jj&FWWhhFbL]TJp#)&YYhhYFhhj55ffD^djFhhYYYYYhWFYYFWWFYhYYWWYFYYFWFFhu__f_f_f________RRR_R_________f______R______ffffff55D555555555))))5)))mm.m......e.eee.^.fer^.^.^.^^r^.LrfD^^r^^^^^^^^^^^^^L^LLLLL^fmLL^LL^LLRLLLLdmdddddd9RXddd((((((((((LLLLLLLLLLL((((((((((((((((99", "77'77777:7::4744414444114hFFWWWWWWFWFFFFFYFYYhYjjl&j&juub_6LLL6#6###666666v66v6v6v6666666####d########nn#nnnnnRYFFFFFFFFFFhYFYh&&YF&hh&h&&hhYhYYYhcR)ca&hYFYhYhhhYYlRR=lhFF&hFhYhWYFWYhFWWWFhhYhFFFYhYWFWYFuR__fb_f_f___RR_R_R_R________f___R______f_fffff5f5D555555_))))))))))mm)5mm...e..r.r.^.eR.^.^.^r^f^.^^^^^^^^^^^^^^^^^f^^LLLLLLLLLmLLLmLmLmLLLLLddLc()dddddddd(dddd()((((((((((((((((((((95((((((d(dd(d", "77777777::47444411144444aFFWWFWWFWWWFWFWYFYFFY&&&h&Q&&uaaRf6###6######6#6^66666666666666###dd#######n_nnnnnnnuhYYFFFWWFYh&h&FFF&&hh&YFh&&&hhYFhhYYFYYYFYYFFYhFFYYhhjjhFFYhhuYWYYhWWWWWYWWWWWFFYYYYFYYYYWFFFFu___________b_RR_R_R_____fRf__________fffff5f5f5555555)5))c_5))))55)))55mmm..r.r.^.rrr.^.^.^.^.^r^^r^r^^^^^^^^^^^^LLLLLLLL(LL^^LmLLLLLLLLLLLdddddddddddddddddd(dd9((((((((((((((((((((((d(dddddddddd", "777k77:7:744744n1114441RYWWFWWWWWFWWFWWFFFYhFF&&&hh&juabaaRL6#6#########m####666666666#6##dnnn##^m#n#nnnnnnnaFYYFFFFFYh&YYYhhFFY&&jhFYFYhhhhFWFYhYYFFYYYYYFFYhYYh&ja&hhFhhlQhhhYYWWWWFYWWWWWWWYYYYWYFhYYFFFYFuR____________RR_R_R____f_ff_a________fff5f55555555))))))_)mmm)5555555555mmr.rf.r.^.^r^.^r^^^^r^^^RR^^^^^^^^^^^LL^LLL(R(()5LLmLLLLmLLLLLLLdddddddddddddddddddddddR9d(9(d((((((((((d(d(ddd(ddddddddd", "7U76::7:4:44444n1v44444&WWFWFWWWWWWWWWFWFWFYYYh&Yhhh&buaubbRL66#########^##n##.6J6JJ^^##ndnn###n##nnnnnnXnXuFFFFFh&hFF&hYYFF&hhFYj&YhFFYFFYYWFFFhhYFFFFhhhYYFYYYhxba&Yhhh&jhYYFYYFWWWWYWWWWWWWYYYFWFYYYhFFWFYYQR_________RRR_R_RRb__fff__________R_ff555R55555)))))mm))m.)))55555555555mm..r.^.fr.^.^^.^.^^^.^^^^^^^^^^^L^LL^LLL((((d((d(LLL^mLLLLddddddddddddd9XXXXXXdddddddd9_(ddddd9d(ddddddddddddddddddddddX", "77::::4:444n4444v11444^FFWWWWWWWWWWWWFWWFYFFYYYh&&hhQuuQabbb_6#########6#####mRn######mRmn#_###nnnnnnnXnndRFhh&&&h&&hhhYFYYYhj&&&j&&hFYFWFFFYYWWYYFFFFYhYYhhFYY&jaujYhWY&&hhFFFFYYFWWFFWWWWWWWYFFYFWFYYhhFFYhhYQ_________R_R_R_R______ff______fffbfff5f55555)))))m.m.m..9_mm55f5555mmm_mmm^.r.^f^^^^r^^^^^.^^^^^^^^^^D^^LLLLLL(((((((d(ddLLLLLLLLddddddddddXXXXdXXXXdXXXXdXddddddddd(d(ddd(d(d(ddddddddddddXXXXX", "7:::4:444441111v11v411bFWWWWWWWWWWWWWFWWFFFYFhYYh&&&QuluuaRbbL6#####66#6#L6#J#mnnndndndd#f_m#nn#nnnmmnnXdaFhhh&&h&YYhYYYFYhYhhhlQ&hhYFYhFYFYYhFFFhFFFFFYYWYhYF&jaua&h&YhhhYhFWFFWYYWWFFWWWWWWWYFFYYFFFWFYhYYYhFY______R___RR_R_R_R__________ffffff5f5555555))))mm.c_....mm)5555m5m5_cmm5m..^.^.^.r.^^.^^^^^^^^^^RfL^L^LLLLLL((((((ddddddddLLLddddddnddndndndXXXXXXXXXXXXXXXXdXdddddddddddddddddddddddddXXcdXdXdX", ":647444441111v1mv1v11XFFWWWWWWWWWWFWWWWWFFFYYYYhhh&lujjjuaQRbR########6#6##6#JJ##n#n#####m####nnnnnnndd(5&Yh&&&&&&hYYhYYYh&hh&&l;xxxjjQajlullahFWYYFFFFhYW&jljbbau&&&&ljjxlQjjj&&&jjFYYWWWWFYYYFWFYYYYYYFYWWFYFF&___________R__R__________ffff5f55555f555_)))m.m.m.......mmm5555mmmm_mmmm.^ff.^r^^L.^^^f^^^^^D^^^L^LLLLD5LL((((((dddddddddLdLdddndnddndndcdXXXXXXXXXXXXXXXdXXXXXdXdddddd9(ddddddddddddXXddXXXXXX", "4:44444411v1v1v1v1v1v.YWFWWWWWWWWWWWWFWWYWFYFYFYYh&&jujuQQbbRbf########6#6#^###J#^#########nnnndndndmLLm&&&&&YYhh&h&&&hh&hh&&&&css@so$@$s@$@$@sZWWhFYhhhhWc$o$ocujhh&hb@@@@$oooo$oo$@@ChWWWYFWFFFWFYYFWFWWWWWYFFWl____________R_________f_ff55fmf555555555))mmm...........mm55mmmm_mmmmmmm.rrr^r^.^^^r^^^^^^^^LLL^LLLLLLL((((((dddddddddXdddddnddnmndXmXmmnXXXXXXXXXX.cXXXXXXdXXXXXXddddddddddddddXXXXXXXXXXXXXX", "44n44#nd1111v111vvvv1fFFWWWWWWWWWWWWWWWFWYYYFFhh&&h&Q&uQubuRbb_#####6#6##J###J#J.#######n#nnnndnnnddLLmQhYh&hYWFY&hhhhhFYFY&&&&Iossoossssssssss$0FFFYh&hhFcosss=jhFWFYCo0ssssssssssssso0&FWFFFYYFFFYYWWWWWWWFYYWWF=________b____________ffff5f555555555)))_.)........e_e...mm5mmm._m.mmmm..f^.^.^^f^^^^^^^^^LLL^LLLLLLL((((((9dddddddd9_dXdndnddnd_dnmnXnnXnXnXnXnXnXnXXXXXXXXXXdXdXXdXXddddddXdXXX9dXXXXXXXXXXX", "44n11111v1v1d16v1v1vv_FYWWWWWWWWWWWWWFWYFFFFWFj&&hhhuuQQaaabRbRmd#######6##########n#nnnnnnnnXnddddLLLc&hhYY&FFWF&hhYYhFWWh&&&hI000000000000000ss0FYYWYY&h00000Z&hWWWY=000000000000000os0YFYFFhYYYYFYWWWWWWWYFWFFFh_____________ff_ff_ffff55f_f555555_))))9m.......e.efee..mmmmmm.._...mm.^_.^^^^^^^^^^^RDLL^^LLLLLL((((5(((dd(ddddXXXXXXXXdndnndnXmmnXnXXnXnnnnnnnXXX_XXXXXXXXXXXXMdXXXXX9XXXXXXdX_XXMXXXXXXnXi", "44111111mv1161v161vv1cYYWWWWWWWWWWWWFWWWFFYFFh&h&h&h&jQQQbuRbbbd######6###########n#nnnnnnnXndddnddLLf&&hhh&FFWFY&&&YYhYFFh&h&&I00000I0c0c0I00000@lYYFWFhY0000oj&hYFWWI0000II==ICC==0000scFWFFhYYYFYYWWWWWWWWYFWWWW&_RR____f_fffffffff5f55f5555555555_))).m......e.e.e.e.e.mm5mam..f.mmm....^..^r^^^R^^^LLLL5LLLLL(((((((d(ddd99ddXdXXXXXXnmdnnXnXnnn.nXnnXnnnnXnXnnniMiXnXXXXXXXX9MXXXXXXXXdXdXXXXXXXXXXXiXiXnn", "#44111vdn1vv1v16161vvRFFWWWWWWWWWWWWWWWWYFFYF&h&&&&hhuulaaabRbRm###6##########._#nnnnnnnnndndddXdLLLL&&&hh&YWFFhhhhhhhhhYFhhhhl00000jjj&j&hYYj00000jhh&&YY00000ljhhhWFc0000jFFhYFWWWj0000oWWWWYYFYYFFFWWWFWWWFFFFFFWa___ffffffffff55f55f_f555555555)))).)........e.reeer..e.mmmmm.....m.^.^^.^^.L^^^^^^LL^LL(L((((((((((d(ddddddXXXXXXXXnXnmnXnnXnnnnnXnnXninnnnniinnnnnnXXnXXXXXXXXXXXXXXXXMXXX_XXXXXXiXinnnnMi", "#44111111v1v1vvvv1v1vRYFFFWWWWWWWWFFFFFWFYFFF&h&&YhhhubQuabcbcb_L6##########nn##nnnnnnXnXXXddLdLLLLLR&hY&&&&hYhYYYYhYhhhYFhhjjZ00000CZjh&h&YFF00000ljl&h&l0000oZjYhhYYZ0000jYFFFFWWWW0000oWWWFYYFFFYWWWWFFFYFYFYYFWW&_ff_ffffffff5ff55f_R55555555))))).m......e.r.r.r.^.r^.mmmmm......mmm^.m^.^^^^D^^^LLLL(5(((((((((d(ddddd9ddX9XXXXXnXXXnnnnXnmXnnXnnnnnnnnnnnnenniXnXnniXXnXnXXXXXXXXXXXXXXXXXXXXiiXnnnniXnni", "444411v1v1v161611v16vfhWFWFWWWWWWWFFFWFFFYhFFY&hhhjhjlbbuabRbcbRn########n.#n#nnnnnnnXXdddLLLLLL_^Lmu&hYYh&hhhhhYhh&hYh&YFY&j&j00000cCZ&h&YFFC00000CCj&hjl00000ShY&&jYC0000&FFFYFWWW&00000WWWYYFFYFYFWWWWYWFFYWFYFFFWbfffffffffmf5f55f55R5_D55)))))m.).._cRm..e.r.^.^.r^..b.mmm.m.^m..^mmm^Rm^^^^^^^LLLLLL(5(((((((ddddd9dddddddXXXXXXXnXn.nXnnm.#nnnnnnnnnnnnnnnnnnnn_iinnnnXXXXnXnXXXXXXXXXXXiXiXinniinXinnnnn", "7441111v1v16161v61v1v#&FFFFFFFFFWWFWWWYYFFYhhYY&j&&h&uuRbbbbbRbR########n#_nnnnnnX.XXdddLLLLLLLLRmLbQ&&h&h&&hhh&lhhFY&&j&hYjllj0000000c0II=c000000cCx&&&Sj0000o&&Y&jhY=0000I=cC==Cj=00000=WWWYhFFFWFWWWWFFYFWWYFYYYWFYffffR_f5ff5f5f55555555))))))m9m._..._.e.r.r.r.^.^.^.^mm..m.m^.^..m^mm_^.^^^RLLLLLL((9R((((d(d(dddddddXdddXXXXXXnXnXnXnnnn#nnnnnnnnnnnnnnnnninnnnninniXninXiXXXnMiXiiXiXiXiXnniXninnnnnnnnn", "4:441v1v1v1616v1v11v1vjYYYFWFFWYYFFWFFYFYYYYhYF&j&&jQu&ubaRbRbc_######n#nnnnnnnXXddXd(LLLLLL^LLLLL_aj&hh&&&h&&&alh&&hh&jjhlalj&00000o0o0000o000000jjj&lxS&00000&h&hYhhc000000000000o00000YWWWFYFFFFWFWWWFYhFFWFFFYYYWWcfffffffmf555_R5555)5)))))m.)........e..e.^.^rrrr^r^m.mf_m...^.^^L.^mmffL^LDL^LL(((((d(d(ddddddddddXXXXdXXXXXnXnnninnnnnnnnnnnnnnn#########nniiinnniiiinnnnnnnn_innnnnnnniiininnnnnniiiiin", ":44111111vvvvv161vv1vdbYFWYFFFFWYFFYYYFFYYYYhhFjj&au&Qjuacbcbc=5#####n#nnnnninXd(d(LL5LLLL^^LLLLL^RQ&&hhhhh&&&juj&QjjjQauQaajjl00000000000000000IjjjjljZh&00000YhhFWFY=00000000000000000&WWWWYFWFFFFYWWWYhYFFWWFFWFYWWjffffff5f55f5D5555)5))))))_).......e...^.r.R^.^.^.^.^.mmmmm^^.^^^.Lm^^.^L^LLL(5(((((d(ddddddddddXdXXXXXXXXXnXnnnXnnnnnnXXnnnnn#n#n#nnnnnnni##n#inne_nnnniXniXniMiiiXii_Mninnnnnnn#p_#n#n#n", "4444411v1v1v11v11v1dvvXhYYFFYFYFFWWYFYYYYYYY&hYjj&ujjjjjaabRbcb^.^###nnnnnninXXdLLL(LLLLLLLLLLLLLmbuul&h&&h&&lujull&&jbaaljQ&jC0000000000000000C&h&ljlhYFj00000FYFWWWW=00000000000000IZFYYWWWWWFFYYYFFWWWYhYWFWWWFWFWFY_f5_f55f555555555)))))).)..........ee.e.^.r.^r^.^^^mm.m.m..^^.^^.^m^m^^^LLLL(9(((d(ddddddddddX9XdXXXXXXXnXnnnXinnnnnXddXXXnnn#in##########ne#nniniiinniiiiiiiiiinnnnniinnnni_p#in#i#i#n#n", "4444411nv1v1111v1v1dvzvChYYYhFYYYYYFYYYYhhhhhhhjQ&jjjjQauRbcbcc^n##nn#nnninnXd(LLdddddLLLLLLLLdLdRbajhhYYY&uualjQ&hYY&uauu&j&S=00000CZ=000000YYhhY&jFFFWYh00000FFFWWWWC0000CZ&ZCjZZZFFWYFFWFWYWYYYFYFFWWWYYYFWFFWWFWWFhbRfR5f55f5fDDD555))))m.).......e.ee..r.^.^rr^.r^r^.^m^.m^m^m^.^m^mm^m^^^LLL((((d(dddddddddXXXX9ddXXXXXiXnnnninnnnnXXdddddXnnn##############i#ne#iiinnnnnennnnnnnnnnii_in#enpi#i#pi###i#i#", "44444411111161v1v1vvvvvn&&hhFYYFYFhYYYYY&Y&hhYhxQjljjullabRbRbRdnnnn#nnnnnXXddLLdddddddLLLLLdLLL5bcbjh&h&&aabj&&hYWFWFjQujhh&xc00000&hYc000o0SFhYFhhWWWFYF00000WWWFWFW00000&YF&&hh&FWWYhYhhhhWFWFYWFWYWWWWYYYFWWFFWWFFhQf55ff5f_R5f5ffD555)))m..9......e..rr.^.rr.^.^^.^^..mm^.^m^m^m^m^mL^L^^LLL(((((ddddddddXXXXdXdddddXXXnnninXnnnnnnndddddddXXnn####i##i##i###e#nn_pniii_einnnnniiii#n##p##i##_rp###########", "4444411111v1111v1v1v1vv(ZhhFYYYYFFFhhhYYhh&hF&&&jlQa&ulabRbcbc_nXnnnnnnXnXnXdLLLdddd(ddLLdLLLLLLfbRbj&&&jucRa&&hFWFWFFhhhYFYjZI00000&jYFI000soZYhFYhYWFWFh00000WWFFFWWC0000hYhj&j&hWWWWYFYFYYFYWWFWWFFFWWWFYFWWFWYYFhYhhR5f55fffffffff5f55555)m......e.e.^..rr.^.^r^^f^^^.^m^m^^^^m^mm^m^^^^^^LLL((((dd9dddd9XXXdXXddddddddXniMnnnnnninnXdddddddXXnn####p##p##########pi#n##Iiininn#n#n#ni#i#i###prp###eepip#p##", "44m411111v41v1v1616vvvvv{jhhhhhYYYhF&hh&hh&hjj&jj&QQluabRbcbRbdnXnn_nnnXXXXd(LLdd(ddddLdLLdLLLLLfRbajj&jQbbu&&hFWFWFFFFFFFYYj;c00000hhhhh0000o0lhhFFYWWWFY00000WWWFFWW00000hY&ljjhhWWWWWFWY&&YhWWFWWWYYFWWWFFFFWFYYhYFYFbfffffff5_5555f5f5R_f5)m..e.e.e.r.^er.^.^rr^.^^r.^m.^^.^^m^m^^mLL^LRLLL(((dddddddXXX9XXXXXddddd(((dXXnMnnnnnn#nXdddddXdddnn#####rr###p########i#een#nnnXXXnn#n#ir######ip#p#p#p###p#####", "11n1111v14v1v1vv161vvvvvv*&&&&hh&hhh&h&h&h&hhQlljhbQabbbcbcc=f#nnnnnnXXXXXXdLLdddddd((dLdLLLLLL^_cbujuuQubaljhhFFFFWFFFFWWWYucI00000hhhh&&0000s@ZYFYFFWWWj00000FWWWFFWC0000hY&Zj&YYWWWWWF&&&&hYWWWWWWWYFFWWFFFWFFYhhYFYF&Rfff5f55555555f5555555mm...r.er.r_^.^.^r^.^^r^.^mmLm^L^^^^mff5^^^L5LL(((d(dddddXXXXXXXXXXXddd(d(d(dXXnnnnXXXXXdXXXdndXXdnn###p####p####pi##i###i#nnn.XXXXnn###pfni###pppppppppppppppprr", "111111v41v1v1v1vvvvvvv6vvv9&&&hhh&&h&&&hh&&&&bjj&jbbbbRbRbRbRXnnnnXXXXXXXXdLLLLddd((((LLLLL5^^^RRbbuQuQjuaj&&YFFFFWFFFFFYFFhacc0000IhhhhYhj0000@@hFhWWWWFh00000YWWFWFWI0000&&ljl&hYWWWWFhjj&hYYWWWWWWWFFFYFYYhYh&hYYYYYYWfff5f555)))m)5mm5m5m5555mm.ee.^effrrr^rr.^.f.^mm^^^^L^^^^m^^^^^LLLLLL((ddddddXXXXMXXXXXXdd)d(d(dddddX_inXdXddddndXnddndXXn##pppppppp#p##p##p#####nnXXXXXnncen#pi#fppppppppppppppppppppp", "1z11v111v1v1v1vv1vvvvvvv6kJ0&j&h&&&&hjjh&&&j&j&xxbaabRbcbRbcmnnnXnXiXXXXXX(LLL(dd((((((LLLL^^^^Rbabu&h&jujQhFFFFFFFWFFFFYFFj;Ic0000IhhYh&&jj0000sohYWWWFh&00000hFWWFFWC0000ZSCjhFYFWWWFh&&lYFhYWWWWWWWWYFYhWhj&&hFFFYFFYYbff5)5)))).)..m...mm55mm5mm..^.rer^.^.^.^..^.m^m^m^^^^^^5Lm^.^^^LL(5((((dddXXXXXXXXXXXnXdddLddXXndddd.ddddXXXXmdddnnddndnn#pppppppppppr##########neXXXXnXnnnnn##iipJJJJJJJJJJJJJJJJJJJJ", "z1z11v1v1v1vvvvvvvvvv6v666669ljj&&&j&&&&jZ&Z&Qjaxuubbccccbcmnn.nnX.MXXXXdd(^5L(((((((LLL^^^^^^Dbxauj&Y&QbauYWFFWFFFFFFFYYYYQcc=0000IhY&&jj&jC0000olYWWFh&&0000=YYWWFFF=0000Z=lhYWWFWWWhjl&&WWYYYWWWWWWWFYY&&QjhhhYFFFYYYhR_5_5))cm.9......_..m.mmmmmm.rrrrre^r^r^mf^fm^mL^^L^LLLL^^mL^^^L^LL5(((dddXdXXXXXXXdXXX.Xd(ddnnnnnXXXdXXXnnnnXXXXdXmnddXmnn#pppJppppppppp#p#p####nXdXdnXnnXdXnnnn##JpJJJJJJJ{{JpJpJpJpJ", "z1v1v1v1v1vv1v1vvvv6vv6v6vk6kD;ZjS&hjjjlj&jQljabac=bRbRbccmnnXnXXXXXXXddddL^5L(((((LLLL^^^^^^r^luu&hhh&ubauYFFFFFFFFFYYFYY&=RClZj&j&YYhhj&&&&jjjZS&YFYh&&YZj&j&YhYWWYW&hZjC=lYYFWWWWWWjZjhWWWYhFFWWWWWWYh&&QlYFYhFYWFYYYhxff5)))_mm.......e....mmm5mm...^.rr^.^^m^fffm^^^^^L^L^LLLL^Lm^^^^^LL(dddXXXXXXXiXnXd.XXdddXXnnnnnnn#nXnnnnn##nnnndnndnndnXXn#JJrJJJppppiRpppprp##nXXXXXnXXXnnn.nn#pJJJJJJJJJJJJJJJJJJJJ", "zzzv1vvv1vv16vvvvvvv6v666666k**blj&llZjjljlljxuauaccbcbRRm#XnXXXXXdddddd(LDDL((((((LL^^^^^^^r^c&&&&&&h&ubQjhFFFFFFFFYFYYYYQRcC&YFFFhFFY&Y&&YYYFYYhhhhhjYFWFhhYYFhhYWWWFhYY&jhFFFWWWWWF=jhWWWWFYYYFWWWWWY&&hjhWFYYYYWYYYFhj55m).).9........ee....mmmmm.^.^.^^r^^.^.r.^^^^L^LLLLLLLLL.L^^^^L^^L(ddXXdXXXiXM_idddd)dddnn#n#n#####n########nnnnnnnndnXnXn##prJJJJJJpJppppprp#nX._XnXXmnnrnneXnnJJJ6JJJJJJJJDJJJJJJJJ", "v1v1v1v1vvvvvvvvvvv6v6v6k66666JJ9;xxlCuSSxax;abaccbcccc_mnnXXXXXdXddddd(L^^LL(((LLL^^^^^^^Dr^.R&hhYhh&hQQ&j&FFFFFFFFYFFFYhuRSZhYYFYYYFY&hhYYhhYYY&hj&&&FFWWWFFYFFYYWWWYYWh&YFYYYWWWWFZlYWWWWWFYFYYWWFFh&&hYhhWWFYYYFYhYhYh55)m9.mmm.....ee.e....mmmm...^..^r^^^.^m^m^.^LLLLLLLLLLL5LLLm^^^LL((ddXXXXXXiiiindd(ddXXn#n#n######################n#nnnXnnn#pJJJpJpJJJpJJpppp#nnXXnnnnn#n#nn#nn##JJJJ##pJ66J]J666666*", "zvzvvvvvvddvvvv6v6666D66k66JkJ6{##{I;;;x=auabccc=cccb_LnnXXXXXddddddd((L^r^^L(LLL*^^^^^DD{r^r^a&&YFF&h&jhh&hhFFFFFFFFFYFY&bS&jhYFYYWYFFYhYYFFFYYh&jjhhhWWFWWWFYFWYhFWFFWWhYWYWFYFWWWhlhWWWWWWWFhhYFW&QjhYYFYYWFWWYYFYYYFFYfm5)m))....e.e..r.e......m.^..^r^.^r^.^m^.L^LLLLL((()_((5LLLLL^L^^L(dddd9XiiinnnXXdXXXn##############ppppppJJ#####^###nnd#####JJJJJJJpJJJJJJJ##nnnnnXXn########nn##Jp###rJJ6666J]6J]6J", "zvv1vXvvvvdvvvvvL66JJrJJJJ]6J6J#nnnn^RRb=b==cc=c=RR5dnXnXXXXXdXdddd(LL^^^.^^LLL*L^^^^^^^r^rr^mj&hhYYh&&jhYh&hYFFFFWFFFFYh&bjj&FYFYYFWYFYYWYWWWWWhZS&Y&FWWWWWWWhFFFYYWWWFFFWWYFYYWWWh&hWWWWWWWWFYFYWhuahWFYFFFYWWWFFFYYhFFY5c55))m...e_feefr.r.re^.^.....m^.^.^.^.^m^^LLL(((((d(((d(dLLLLL^LLLL((dddXXXnii_Xdddnnn########p#pppppppJJJ#JJJJ6J^JJ#nn#nJ#ppJJJJJJJJJJp{JpJ##nnnnnnnn#######r#n######rr###JJJ666k666", "vvvvvvvv66vv6v6666######J{DJJJ##nnnnXXnnLm.f__mmdXXnXnXXXXXddddddd(L5^^r^^^^L^L^^^^^^^r^rrrr.R&YYhYFYY&j&hhh&hYFWFWFFFFh&lujjhYYFYYWWhFYhFWWWWWYjZj&YYWWWWWWWWYFWWFYWWWFWWWWYYYYWWh&hWWWWWWWWWWYWF&QbjWWFYWWFFYWWWWYFYYYhY555555)..e.ee.eerr^rrrrr.^...^m.ff^.^^^mL^LLL((d(d(dddddd(dmLdddLLLLLL(dddX.XXXXXXdnX###p#ppppppppppJJJJJpJJJJJJJJJJJ##d###JJJJJJJJJJJJJJJJ###nnnnnn###JJ6JJJJJJ##n##nn##rr##JJ66666k6", "vvvvvvv6666666666###nnen##JJJp#nnnnXXXnnnXddX_.nnnnXnXnXXXXddd d(d(L^^^f^^^L^^^^^^^^{r^r^rrf^^hFFYFFFYh&FFjf#f^R5Rf_v))eDLXJ900I0000I0I00000c0IPoo0 0IIcI0=0c0000II0IcIc0Ic0sIIocIIIc cR_=;c=IDf.(nX(D_=5__D_aFWWWWWYYhYYY_55m555m..e.e..r.^.^.^^^^^.^^..^.^.^m^m^^^LLd(d(dddddddddddLddddXXdddd(dddddXdXXXXXn#cpppppppppJJJJJJpJJJJJJJJJJ^JJJ6##nn#f####JJJJJpJpJJp#####nnnn###JJ66666666JJJJ#J#######JJJJJJJJJ", "vvvvvv6v6666########n#nn#n#rDinnnnXXdnnnXXdXXdnnnXnXXXXXXXdddddd(((L^ff^^^^^^^=^^^{^r^rrer.f..&hFFFhYYh&YW&77'''''''''''''''''''778788888787787''''''''''77878788777888888777'7''''''''''''''''''''''''''''''5YWWWWWWYYhYh5mmmmmm)m.eb..r.^r^^^r^f^^^^.L^m^.^mL^^^^LL(ddddddddddXdXdXXddXnXXXnXXddddXXXnXnnnn#J^JJJJJJJJJJpJJJJJJJJJJJJJJJJ6J6J6#n#n.#nnn#####n######nn#nnb###J6J666v6v6v666666JJ###############", "vvvv666666###6#######nnnnnnnennnXnXdXnnnnXddXXdXXXnXnXXXdddd d((d(LL^^^R^^L^^^D^{{rrrrrrrrrrD.YhYFF&&hllYFjbuxx=aac=bZbZSCbaSa;;C=C=SxxSxZSCZSZQQullllSljlZSSSSuSZS=lSSbSZxljjulQllQuQaQujQQaQQalQQjuQcQQlujlfYWWWWWWWYYYY_...e..mm..r^..^.^r^^^^D^^^^L^^^Lm^^^Lm^L((ddddddddXdXdXXXdXXnXXnXnnnnnnnnnnn#n#n##JJJJJJJ{JJJJJJJJJJJJJ]J666666J6J6J6##nnnnn#nnnrnnnnnnnnnnnnn####JJ666v6k6kvkvvv6666J#######JJJJ6JJJ", "666666J####6#666#J####nnXXXnnenXndXdXXXnXXd(dddddXXXXXXdddddd(d(((L^^r.^^^^^^^^{r^r^rf^.r.r.e.&&&YY&&jua&FluuaaabaaSxQZu;bbaS;aSxaxSuxlul;xZlSlulSSQQjjZllSxxuuZZuuSjlSSujlljllQQjlZQljujljuQQQllQQujjljjlljjIYYWWWWWWWWYYfrre...mm.^f.r^.^^^^^^^^^^^^^^^^^^^^L^LLLddddddddXXXXXXXXXXXXXnXnnnnnn######J###JJJJJJJJJJJJJJJJJJJ]J66J6J6JJJ]666J6J6J6##^nn#n#n#n#nnn#########6666DLD 6vvvvvvkvkvv66J6J6JJJ6JJJ66666", "66J6J####J#6666J66J6J#nnnnXXXXXXXXddddXXXXddd(d(mdddXdddd d(d( (((^^^.^^^^^^^{r^rr^rrrrrrrr.rm&&hh&h&laajhRbbbbaQ;QSuQZQb;a;;xxxaaxxSalZxxZllaxZQuSujQjlZlSlSSuuuSZjjjQljQQlQQQlljQQlQujlQjuQQllljjjjjjjjjlQQ)YWWWWWWWWWWFD.r......e.^rrr^^^^^^^^xLLL^Lf^^LLLL^5LLddddddXXXXXXXXXXXXiXnXnnnnnin###ppJJJJJJJJJJ6J666J6J66J*666J6J6J6J6**666J66666666Jr#Jr#######J###J#J#JJJ^6v6Lvkvvkvv6vvv(vvvv6v6666666L66vvvvv", "JJ#####J6666J6#6JJ#JJ#rrnXXXXnXXXXdddm.XiXXdd((L((ddd(dddddd((((((^r.^^^^^^^{^r^r^.^r.r.r..r..hhYYh&&&bbj&RbbbauaxxauZZS;bQbaxxxaaxxSaZlxaZxSxxlxuuQlxSxxSSxSxSSuSujljljllljljjjuZQQQjjjQjjjQQQQQQjljjjQjlllQ9FFWWWWWWWWWW_rr.^.rf_.^r^^^^^^^^^^LLLLLLL5LLLLLLLLLddddXXXXXXXXXXXiXiXXiiininin####pJJJJJJJ{J6J6{6J]6J6]6J**J6J6J6J6]6666666kR]6666J66666J6JJJJJ6J6666JJ^666D66vk6vvvvvvvvvvvvvvvvvvv6v66v6vvvvvvv", "##n###JJJ6J6JJ6#JJJp#pr#nnnXdddddddLddXXXXXXXdd(LLLL((( d( (d(((LL^^^.^^^^^^r^rrre^.rrr.r.r..fYhh&h&&&abQ&RbbbuxxSaxuZxab;;bxaxxxxaaxual;lluuaauuuljljuSuxxuSSulZuujjjlluululQuZjZjjjjlluQjjQlQlljjjjuQQllllQ9YFWWWWWWWWWW_r^...r.f..^^^^^^^^LLLL(((((L(LLLd(dLLdddXXXXXXXXiXiXiXiiiiiinni#n#p#ppJJJJJJJ66JD**{666666666666J6]6]666***kJk6k66666666666666R6666666k6666*6D66k6vv66vvvvvvvvvvvvvvvdvvvvvvvvvv%R vv", "r####JJJ6^^J#J#J#p#pp#Di#nnnXd((((d(dddXXXXXdd((LL^^L^LL(d((((9DL^r.^R^^^^r{rr^rrrerr.r.r...ebhY&&h&&&u_u&RQauuaSauuSQuba;baxxxxxaa;lQSuauxuuxaSuQlQjllljjSxQxSjuuujjjQZSZuuZuuujljQQQjjlljjlQQuQjjjQljjljQlQ9YWFWWWWWWWWWRr.^.^.^.^r^^^^^^LLLL(L((((((((dmdddLddXXXXXXXiXiXiMiiiiiinnnii#i###ppJJJJJ66J6Jk666666666666J6J66666666**66666666k6k6k6k6k6k*k6k6k6kv6v6 DUv(Dk6v6vkvv6vvvvvvvv vvvvvNvvvvvvvNvv9Nvvv", "nn###JJJpppJpJpppppiperiiiiinnXXXX(d(dddXdddddd((LLL^^^^5LLLL^^^^^.^r^^^{^^^r^e^.^.r.r.e.e.._c&&&&&hYY&RuhcuuabaQxaxxQxbu;axSxxxa;;lauuaa;xuxxxlululluSluxuQxuuSSuujZllSuuuZujQljjjljjljllljjjjljjjjllljlllQQ9YYFWWWWWWWWWRRfm^..^..^^^^^LLLL((((((d(dd(dddddd(dXXXXXXiXiiiiiiiinnniiiii##p#n#JJJJ6JkJJJJJ666666kkk6*k6k6k6]666666666k6k6k6k6k6k6k6k66*(*6k6v6v6kkv6vvkvk66vvvvvk9vv9vAvAdcvAAvNvvNvNvNvvAv vAvA", "nnn##pJJppppppp##i##ireiiiiiiiiXXXXdddXddXMddd((dd(((L^^5*L^^^Dr.r^^^^r^r^rrrrr.rr.re.r......c&&&&&hFF&u&&RabaxaQubxQu;aub;xxxxuaalZQaaaaaxSuSxlZluulluxSxSSuZSuuSulZuSuSuuujQllujlQQQQuQQQllQjjjujjQljllllll9YYYYWWWWWWWWme^.^.^.^^.L^LLL((((((((d(ddddddddd(dXXXXiXiiiiiiinnniiii#nnXninnnnn#JJ6JJ#####JJk6JJJJJJJ666666666k6kk6k66666k6k6kRk6k6k6kkv6 6vkkvkvvvkvkvvvv6vvvvvvvv vAvAAvAdAdAAvAvAvAvAvAvAAvAvA", "Xnnn#pDpppp#pipi#riiiiiiiiiiXXMXT_XXddd ddd (99d(((((L^r^^^^^r^.r^r^^^^r^rrrrrrrr.re.e.e....mb&&&&h&hYj&hYbuabaxuuaxuxCub;xxxuxaauull;axZaxuuxxxljuujjxSuuuQxuuuQuSuZQuuQQZllQjjQuuuuuuuQjljjljuQQjljQlljljllDFFYYWWWWWWWWR.^^^^^m^.^^L((((((((( ddddd(ddXdXdXXXiXiiiiiinniiiin####nXdXdXXXn#n#JJ6J#######J6J6JJJJJ{6k6k6k6k6*66666k6k6666v6666v6v6v6v6v6kvv6vvvkvvvvvvvvvvvvvvAvzvAvAvAATXAAAAAAAAzvzvAAzvAAAAA", "Xnnp#ppipipi#iiiiiiiiiiiiXXXXXXXXdX dddd(d(d(((d9(((((^^r^r^.r.^^r^^DD{rr^rrr.r.r.e.e....M..mQ&&&YFYFY&&YY_uaaau;Z;Sxbbaa;aaxxaa;lu;Qa;QlluaaaxalZxjuxuSSuuuuSuuuuZQuuQuQQuujjljuZuQuZuQljQjlQQllQQQjQQQlQlll9FYYWWWWWWWWFDLL^^^^^^^R^L(((((ddddddd ddXdXXXXXXXiiiiinniii######i#iinXXXXXnnXnn#r#J###JJJJ##JJJJJJ#r^J66k66666*k6k6k66JJJJJ6J6666666kvkkvvvkvvvvvvvvvvvvvvvvvvNvvAvzAAAAAzzAzzzzzvzzvzzAAvzAAvz9z", "enipiDipiiiiiiiiiiiiiiXXXMXXXXXdd ddd (d d((( (((((I((L^^.^rr^^r^^^r^^r^rre^.rrreee.e.....9m5Rh&&&YYYhhYhh_bab;aSaua;b;Cbaaa;ZZQZxaa;;ZlQQuulQuljuuuxuuuSuuxuxuuuuuuZQQQQQQuuQQlZuuljjjjljjjjQuQQjlllllluQQQQcWWWWWWWWWWWWRLLLLLL^^^^((((d( (d(dddddXdXXXXXXXXinecniee##rrei#i#nXnXXXnXnnnne.nn#####J666J###JJ6JJ##JJ6J6k6k6k66k66*66JJJ#JJJJJJJ66666vvvkvvvvvvvvvvvvvvvvvv9AvAAAAzvzvzzzzzzzzzzzzzzzzzzzzzzzzzz", "XnpiiTiiiiiiiieiiieXXXTXXMX Xd ddd9I(d(((((((((*(*(LL*LL^L^r^.^^^rr^rRDrrrr.re.....e..M.9.)))uh&&hYhYYFhhh_bbxuxxQab;bbb;;;;Q;;CS;;aaZxaxaSaauujQljSuuuxuuxuSSSuuZuZuQuQQQlllQulljjjjjlQjjjljuQlQujlQlljj&jjjeWWWWWWWWWWWWbL(((LL(LLL(dd(ddddd dddXdXXXXXXTXiiiin#i##iri###p#iinXXXnnnnn######nnnn#J66666JJ##JJJJ#JJJJJJ66J6k6k6kk66JJ#J#J6J6JJJJJJ6*6kvvRvv vvvv%vvvNvNvNvA9AvAAzzzzzzzzzzzzzzzzzzzzzzzXzzzzzzz", "iiiiiiiiiTiiieeTXXXTXXXdXMM_ d(ddd((((((9( ((*((LL*L*L^*^^^^^^^r^r^rrrrerr.rr.eeee......)9))5ch&&hFYYYh&h&RaubaSSab;bbb;;abxux;uZu;xaal;xSuSxxulSjxuuSSuxSxuQQjZQuuQuuQlllllQujQjjjjlQQlQlllQQuQlQjjj&ljjjjllRWWWWWWWWWWWW=(d(dd(_d(dd(dddddddXdXdXXXTXXiXiiiinii#i#ipr##i##nnXXXnn#######pJJ##rr#{J66v6k666J##{{#JrJJJJJJJ666kk6v66{JJJJ666666JJ6JJJ66vv%vv(vvvvvvvAvvvAvAAXAAzzzzzzzzzzz1z1z1z1z11zztztztzzzzz", "iiTiiTiiiXTXiXXXXXXXdTdX dd ddd ((d(( (*(*L*LL*L*L**^**5^^^^^r^rr^rrrrre.re.e.e.....9.99))95cuhhh&h&hh&hY&Raxxbbb;;bbauubaSuQluSlxaxxaaaxSuuSxQQlSxxxuuQllQjjljSSQuuQQuQQQQuQQljjjjljjQQlQQuQQuQQQQQQlljjjjjlrWWWWWWWWWWWWfdd(ddddddddd ddddddMdXXXXdXXTXiiiiii##ip#p#nnnnnnXnn#n#ppJ##pJJJ6J6JJ6J6*k6kvkv66JJJJJ#JJJJJJJ{J66kv6vk666JJJJ66666J6J66666JJ6v6v9vvNvAAvvAAAvzAAAzzzXzzz1z11z1z1111z1tzt1t1tttzzzzzz", "iiiiiiXiXXXTXXXXXX Xdd d(ddd( (( (( (L((*LLLL***L*^^*^*D*D{{r^r^rrrrrr.ree.e.e....M..b9)9)555u&hhh&hhYYFhjRbbabab;bbxu;xZZQuQZxuQaxaaaaxSuuuSxljlZaSlxxluQlljljxuuuuQuQuQQQQlQZujjljjlQljllQQQQQQulllQjjljjlQDWWWWWWWWWWWW_dddd dddddddXXdTXXMXXXTXXMXXiiiiiii#i#p#pnnXn.XXXXn#ppJJJJp#JJJJ6k6k6*6k6vkv6v6v6JJ#JJJ6JJJJJ66666kvkvkvk6666J6666J6J6666v6v666666vvvvvvvzvAAAAzzzzzzztz1z1zt111-1t1--1-111I11iz1zvzv", "iiTXiXXMIeXdd X X dd ddd ( (((((((*LL*L*L*9*^*^^^*^*^^{^{^{^rrrrrrrr.ree.e.e...M..99)m)_55555uhh&hYYYYYh&Qcbbbbb;bbauaSQZu;uC;lQuuxaS;axSuuuuxxujuajQlSljjljjlZuSuSQQQlQQQuQQQQQQlZjjluuQlQQQQQQQQQQuQQjjjllQIFFWWWWWWWWWWRcdXdXX XXXXXXXXXdXMXXXXXiXeiiiiii##ipppiinXnXnnn#n#JJJJJJJJJJJ6k66*66 kvkv6kvvk666JJJ666JJ6JJJ6k6kv6kvvvvvv666D6666J6^6vvvvdvvv666v6vvvAAAAAzzzzzzzz1t1tt11-1--111111111--11--TzzzvXv", "iXXXXTXXXdXXd(ddddddd (d((((((((*(L*9L**L*D^*^*^{{{{{{{{{{rrrrrrrD.eeee.e....M.9.9)9)95959D55&h&hhhYYYh&&QbaaSxxaabuauabCaa;;SSSu;x;xaaxxuuuuuxxaSQlljQjQljllljuuQQuullQQlllQlQQllujjlQuQuQQQuuQljjlQljjjQjuj6WYFWWWFWWWWW9XXXXXXXXXXXTXTXTXiXXTXXiXieiiiii#pippppnnXnn####p#JpJJJ]R]6JJJJk6k6k6k66vk6vkvv66^#JJJ66666JJ666vkvvvkvkvkvv66vk666666vvNvvNvvvvvv6v6vvvvvzzzzzzzz1tti1-1---114---------1111111zzvzvz", "XXTXX XTIX d9(( ((( ((d (9( L*(*(*L*IRL*^**^{{{{{^r{{^r^rrrrrrreeeee..e...M..9.99)9))595D5D5DYYh&&&&&&&&&abuxxxxbQx;SC;a;Ca;;uuulxaZaaaaSuuuuSxxZlQlllljlQxxSuSQlllQQQuQQlllllQllQQjjljjjjQuljjjljjjlQjjjlljlDWYWFFYFWFFWWbXXXTXXXTXiiXiiiiiXiiiiXiiiiiiXiii#pp#nnnnXn#pJJJJJJ]J]JJ6J6k6Jk666k6kvkvk(v66vk66JJJJ66J6J66666kvvkvkvvvvvvvvv66666666vvvAAvAIvvvvv6vv(vvzzzzzzz1ttt1---1111--44444444444g----1zzzzzz", "TXdTdXddddd d(((( ((((((*_IL*(*L***^^^*^{{{{{{{{{r^rrrrrrrrrreeeeee.ee..M..9)99)))95595D9D_D5WF&h&&&&&h&&abaxa;bbauub;bbC;alQQllQ;l;aa;xSxxxxSxSZQZljZulxxSuuuQuQQQulQlQllluujjuQQQZuuujjljujllQljjjjjQjjjjQlcWFWYhjhFFFFWcXXiXiiiiiieiiiiiiiiiXiiXXddd9ddXnnninXXXnXn#pJJJJ]JJJkD*k6]6kk*k6k66k6vkvvkvk666JJJ6JJJ666666k6vvkvvvvvvvvvvvvv666v6vvAAAAvAzvzAzvvvvvvvzvzzzz1ttt1--i14-1g444g4g4g4g4g4g4414111z1vzz", "XdTd d d ddM( ((((( ( L(*(*L**L*^*^*^{{{{^{r{^rrrrrrrrrrrreeee.e.e....M.M9)55)55D5DDDD5DDDDDDFWY&h&h&&&&&aaaxabauQuZZZQZb;bZuuSQSQaaaaxxaSxxxaxuxuuQluulluuSlQSuuuQujljuQujjlQujjjQlljjQljluQlljjQllQjjjjjlQQRWWY&jhhYYYYYRXiiiiiiiiiiiiiiiiXieiXiXdd.XXeXXXXXnXnnnnnnnpJkJ]6Jk6Jk6]J6k66k66J666k6vkvvvvkv66JJJJJJ6J66kvv6kvvvvvUvvv%vvvv6666vvvAvAAvzAAvXvAvvvvvv1vz1z1tt111-11p-44444g444g4g4444444-1-11z1v111", "X dddddddd( (( (( (L(*(*L***^****^{{{{^{{r{rrrrrrrrrrreeer.r.ee.e..MM..99)D_DDDDDDDDDDDDDDDRDFFFh&&hh&hhh=axabbaaZuSuxQalQbCZQQZux;aaxaaxxZuxaaaQluuuuuQjSxulQSxuuQujQlQuullQjllQQljjjjuQlluQljuljjQjjluQuQujuWWhjjhFWWWWW_iiiiiiiiiiiiiiniiXXXXXXdXXiiiiinnnnnn#pp##nnpJJJJ6kJkk6k66J66kk66666666kvkvkv666JJJ6J6JJ666v66v6kvvUvv vvv%vvvv66vvAAAAAXAvAXvzvvvvvvvzzzztt111--4--4g4g4g444g484g484gg441111z1z1z14", "ddX d d ( (9((( LL*(*L***L*^*^{^{{{{{r{rrrrrrrrrDDeeeeeee.ee.e...M..99.9)5D_DDDfDDDfDffffffDDFYFh&&h&hYFYRaaabbabbZ;aa;ub;;;blZQZC;axxxxxaZQllaSjljlluSQluSxSuQlSSSuQlulQjjjuujluljjjjjjjjuuQuuujjllQjQllllQjRWY&u&YFWWWWW=niiiiiiip#pp#iXXXXdddXXn#p##ppp##pp##JJJpp##JJJJJJ66k6k6k66k6vvkkkkk6vvvkvvvk6*J666666J6666k6k6kvvvvvvvvvNvvvvv6v6vvvAAzzAvzzAvvvvzvvzvzz1z1---111-44g444g4gg48484884844411111zzz1114", "d d d( d(( (( (*(*L****^**^{{{^IR{{{{rDrrrrrreeeeeeeee.e.ee.e.M.M.999))55D5DDD5DfffffRDffff_cFhY&&hhh&&YFRabbubbbCx;ZubCCbbxSxZlSu;;xxSaxxalujQulllQllljjjjlQljjlSuuujjQljuQQQuuuuljjjjjuQlllllQjjjjjujlljlQj9Yj&j&hYWWWWWRi##ppppppippinXXXXnini#ppippppppppJJpJ6JJp##pJ#pJJ6k6kkk6kkkvk6vkvvvvkvkvvvk(6J666666DDJ6666v6vvvvvv%d vvvvvvvvvvvvvvAvzzz1vzzzvvvvzvzvzzz1t--1-zt1-14444484:48484848441111izz1111148", "ddd( (d ((((*L*(****9*^*{{{{{{rr^rrrrrrrrrreeeeeeee.efeMeR.M.M.M.9.)55DDD55955DDDfffDfff____cFYY&hY&h&&&hRabubbbbbuSCb;bbu;CuaQxuu;;xxaSxauluQjljljZlQjjlQQjjjllZuuSuulljuQQQQQuuljjljlZQQlllQQlQujjjlQljllljTjjl&YFFYYWWWRripipipppppp#nXnnnpDpppppppppJJJJJ]JkJkpprDr#pJpJJk6k6kvkv6vkvvvvkvkkvvvvvvv66666vv666k666kvvvvvvv%vAvvvvvvvvvvvv6vvvXzAzzzzzvzvzvzv1vzvzzzzzzzzzzzzz1t11444888848848441111i111n44448", "d ( d( (( L *(**L*^*{{{{{{{{r{r{rrrrrrrereeeeeee.e.eMM..Mf..M9999)955DD5DD9D9D5DDDfff_f_ff_faFYY&YYh&hhhhRbbQbbbbbu;CQZuxuQxQSQaQu;;xSxSxSuuxZlQlllljQQjjjQxxxluxuxuSQjjQljjuuuQuuZljjZuulQluuQQuljjjQQQQlllj{j&&hFWFFFWYYrpppppppppppi#nnppp{{{]p]JJJJ]J]J]66*6kJJJp*JJJ66J6kkvkvk(kvkvvk%RvvvvvkkvUvv66666v6666666 v6vvvvvvvAvvv6v66666vvvv6vvAAzzvzvzzzvzvzvvzvzvzvvzzzzzzz1zzzti4g44444:8484441114444448:884", "(d (( ((*(*L**L***{{{{{{rrrrrrrrrrrrrereeeee.e.Me.M.M.MMf99M9.9.95DDDDDD5D55D5DDDDfR__f_____QFFh&YYh&YFFYfaubb;bCZbCQuxuZQCCZSZalQa;xxxxuZlSlSSjSuuQluljQZjuSSllllQjljjjljQjuuZQZuQjjljjQlQQjjQjljQj&uQQllQQlMYhhFFWWWFhYYR]pppp]pp]JJ]#nnJJ]J]JJJJJkJkJ]6*6]kkkkkJJJk6k6k6k6vkvkvv vvvUvvv v 9kvvvvvvk66L66666666669vvvv%v%vNvvvvv66v(vvvvvvvvvvzvzzvzvzvzv1v1v1v1z111zz111111111zi14444884444441114484488848:8", "( (( (( *9(*L***^{{{D{rrrrrrrrrDDeeeeeeeee.eMMMfRM.M.M.99M9)99)9D_DDDDD5DD9DD9DDDffff_______aFh&&YYYhYWWFRxxS;bbZxbQSSxxC;;CluQSZQQlaxxalQSllauQuljllljQulxuuululjlljljlljQQQuQQullljlQluQjjjjjjuujjjQujlQQulRFhFFFWFWWFYYIpp{*pJ]J{]JpnnpJ]J]JJ]JkJ]6]6k**k6k666k6k(6T* IivvvvTvkvvvUvvvv(IvUvvvUvvUvvv6k66666vvvv666vvvvAvvvvvv66(vv6vvvvvvzvvvzvzvzvzvzzzv1v1vz11111144444111111111114444g-D4411448488:8k8::8", " (( L(*L(I9****{{{{D{rrrDrrrreeeeeeeeee.eMMM..MMMMMM.9999999)99)5DfDDD5DDDDDDDDDDfffR_______uFhh&hYYhYWFW_SxbuSbSSaZub;;;;;aZZlSxaaxu;a;QZllaxujZllZluuulSuZSQQljuQuQuQZjjjQjuZujjjjjljQQllQuuQZZuuljluulQuljbFFFWFFWWWWFFf]J]JJJJJ*JJ#nnp6666k66kkkk6k6kk6k6kkUvkv MD9I99*Uv9j&RTT*] vv%vvvvvvvvvvvvvv%vvvvv66vvvv96v(vvAvAvvvvvvv vvvvvvvvzvzvvvzv1vzvz1vvzv1v111144444g4g4g4414111111144844]-441444]8]::::8::", "(( ((* (******{{{{{rrrrrereeeeeeeeeD.eMM.M..MMM.9.999999)9)99595DRDDDDD9DD9DDDDDDfDfIff_____jFY&&hYYhFFWFcSuSCZZaZCZCxC;;bxaZZulQQ;allQQQllQxauQlaxxSaxxSSZuSZljjxuuQjllQjjjjllljjjQjZuZQQQuQjjlQQQZljjjjjjljRFFFFFFFFWFWWR]J]J]JkJ]Jp#n#p]kkk6kkkkk6k6kkkkvkvvkXII9D9ID9Mpvv&&hu {{r r%v%%v%%vN v%%%%vvv%vvvvvvvvv(vv6vvvvvvv(vvvvvAvvvvvvvvvvvzvzzzzz1zv1111v1z1444g4g848488444444444411444414441444J8:::8::::", "( L* L**L****{{{rrrrrrreeeeeeeeDMeMDMM.M.M99M_9999999)999)95595DDfDDDDDDDDDDDIDffIffDfIf___f&FY&&&hhYhFFFRSuu;ZuxaSS;ubC;;bCQQlSuZ;;ZlZlQaxZaSZSQxSSxSxxSuuuSjljZuSSlQQjjljSQZljjuuuuuZuuZuuuQZQQQQQQjjjjuQlj WWWWFWFWWFFWS]6666kkk6JJ###J6k6kk6k6 (kvkvvkvkvU9=IDIM0ID[ v%v&j&&r9[D[MrpTvNvvAvXNvvAvANNvAvvvvvvvAMdvvvvvvvvvvvAAzzzzzzvvzvzzvzvzzzzz1zz1v1zz1114gg84g:488848:g4848484411414144144448]:::*::::*", " L (L*9*****{{{rrrreDeeeeeeeeMMMD.MMM.M99.M_9M99999)995=95959D9DDfDDD9DDDDDDDfDDDfDfDRfD_f__jFY&&hYYYYhFYR=;u;aZZ;xQZSu;;;C;CuluQZZZQZQxxxSaSxSuuaSuSxxuuuSuxjllZuSSSSuZljjjjuuljjQZQZQZullZQuuQuQQQjjjjjjuQZDWWWWWFFFWWWWR6kkk]6]6kkJ###Jkkkkkvkvkk9vvvkvvv9xbIRIID9D TekvNTljlc{[* 9D*** vNNXNNvNAvNvAXAAAAvvvvvvvvvvvvdvvvzzzzzzzttzzzzvzzzzzvzvzz1111z1v1z444g4:4884884:8::88888:484414444444448]]k:::::::::", "L*L* *9****{{{rrrrreDeeeeMMMMeMMMM.MMMM9_M9999999999595_D9D9DD9DfDDDDDDDDDDDDDIDIfDIDDDDD_ffjFFY&&hh&YYhYRb=ub;x;a;xaxSabbb;;CuuQaaaQxxSZxSxxxaxQuSuSSuxuSuSjulllSSuuuZuljQjjjQlZQQuZQlQZljjlQjjjjjljjjjjjjuQIWWWWWWFFFFWW=kk6k6k6kk6JJpJk(kvvkvvvvUUvUvvvT=&=IRI9DI909D*NMMkIDk%kTM[9D[9 9kAvTvAAvAAAAANANAvvvvvvvAAvAvdMvAMtttttt---tz(ztppTiznD=bXJv1z1z11148:88488488:8848k8:8::::8444141p14888:::::::::::::", "( *9******{{{rrrrreeMeeeMMeM.MM.MMM.9999M_99999959595I99D9D9D9DDffDDDDDDDDbIDfDDDDDDDDDDDDDf&FFYY&&hY&YYhI=bSb;aZaSZZuZab;b;;CxQQQaaxaxalaxxxxaaSaSxSSxuSSSxllxSlZuSuZuuljlQlljjulluQQlQulljjjjjlQlQQQljjljuQIWWWWWWWWFFWWRkkkkkkkkkkRpJ6kUvkvvUvUvvvvvvvTu&bRRIcf0RDDDIM9]]9DI9I;cMM[0De[* AAAvAAAvNAvAAAAAAvvvvvAvAAvAAzzT-ttttt--k 9MTTTT]]R&&jbMTTTv11144848488::8:::88k8::::::8::884444g484:::::::878787::", "********{{{{rrrreeeeeMMMMM.MMMMM999999999=9)59599D9D95DD9DDDDDDDffDDDDDDDDcDDDDDDDDDDDDDDDDRhYhhYh&hhh&hlRbbbb;;x;SSbaCbCbb;b;CZuSSSuaZuuaaxxxxSSSuSSxSxxuajlSSQjZlQuQuZuQlljZjSlQluuZjjjjjuujjjjjjQQlllQjlZQRWWWWWFWWWWFWbkkkvkvvkv(kJ6kvvUvvUvvv%v%%vNTl&bRRIRIIDI[IDIDI* 9IDclQM[MIeD09 M9*TAAAAAAATAAAAzzTvAvvvzzzzzzzz--------T9cRVk]Tp]]p9SQjlDT T4Tz14888:*8:8:8:g::::::8:8:::::84444848::::::::787878787", "*(*****{{{{rrrreeeeeReMMDMMM9M999M99999999)I99D9D9D9D9D9DD9D9DDD_DDDDDDIDDRDDDDDDDDcDDDDDDDDj&&&&&&&hYh&&IbSu;abaZxbbbbbCb;b;;CxQlQuSZuuul;axxSuSSSxSuSSxSjljuljjlljSluQZZZjlQuuZjulujjujjlQjjuuQZjQullllZjjQkWWWYYYYYWWWWRkvvkvkkvkv6J9vUvvv%vv%vTNXNNix&lcRIRIcDII9D0DID9DM0DDDDDDMrIDDMp[9[*TAAAAAAAAzzzzzzAAAzAzzztzti-------gDabRTi% *]]] ah&SM]]k% iA8::88888:8:::]k8:8:::::8:8:::88::8:::::::87888%8o7:U", "******{{{{rrrreeReMeDMMMfMM9M99M9999999)_I)9D959D9D9DD9DD9DDDDDIf_IDDDDDDDDDDDDDDDD9D99D999D&&&&&&h&hYYhQcuaaSxbbxbbCbC;bbC;;;;aQZZllSuZlu;u;aaxxxSSxxxlljlQllljlljSuQQZQQSjQQjlZlQjjjjuullljlluQulZZQlllQjlZDWWYYYYYYYFWWcvkvUvUvUvUk6*vvv%v%XNNNvANAX=&hcRcIIRIRD0000D0D0D[DIII0I[M[I90{ *[DMkzzzzzzzzzztttttzzet-----4[4-g4g4IaSSc p]i ]g%RD[A%A] kTTkNt88:::::::8: k8:::8::::88:8::::8::::V9@9oNUVDCjjjU%", "*****{{{{rrrreeeDeeMMMMM9M999999999995999959D9DD9D9DD9DDDIIDDDDfD_DDDDDDDDDDDDDD9D9D9D9D9D9)&Y&jh&hhhhYhbcCuSuZbZSb;;bCS;bbb;;C;;lQQluuZlQQSaaaxxuxuSxQjlZuuulSSQllSSuZQZuulQZuZjjjjQjuuuZlZZjllQujlZZQllQlQZIWWYYFWFYYYFWlv v%vvvvvv66vT %vNNNvAAMTAzIhhaRIRRIIcIIsoo$oo0ID0ooID0o@[[MIDM {MM[Mtttttttttttttt-------4g-g4-g4g4U=;uc* *TT]T* p]VTiI=u]p ]kpT-::8:8:8:::8::::::::::::::::::::tT9c=M]kT%T=hY&&]T", "****{{{{rrrrreMeMeMMMMM9M99M9999999999D9D9D9D9D9DDDD9DDDDDDDDDDDIfDRDDDDD9D0D99DD9D9D99c9999&&j&hhYhjhhhubCaxxxux;C;;C;bb;Qx;;a;;aZulSuQZuxlSaa;uSaauuuQQluQZuSSlSxSuZZuuuSlljjulZZQlluuuuuZZujlZQujjjZulQlulRWWYFWFWFFYYYRUvv%%%v%%vk6%%vANvAAAAAAAzz&YjRcRIIIfRc0oo000oo00Mo0IIoo$s@oo0[9[*D * ttttttttt---------g-g-g4gg4ggkcllbT* T]kpTT*]]k 9cIkUkpk]T]-8::::::::::::::::::::::::::::: Rbx= kU]T]TI&hYh]]", "***{{{{r{rrreMeMDMMMMM9M9999999999599D99D9D9D9DD9D9DDDDDDDDDDDDDffDDDD0D9D9D9DD9DD9D9D99999)h&h&&&hljhYYxxSSuSbbbb;a;;abSbZSb;a;;xlllSuuuSxlulZZQuxSuulllllZuxSSSSuuuuuuuuullQQluZuulZjQlluZQZuuulZlQjljZZQjj*WWYFYFYFFYFYbv%v%vN%Nvv6vANTAATAAAzzzt-IYYaIIccIIIIc000I000o0I0oo0Io0000oo[D9D[M [e%--tpT----t------]-g4g4gg4g4:cl&&DT *TTUT]TpU T T]%iN]T]T]]-]-U::::::::88788o788o878878:8 b;;cTkkUkpU[&jZSIkU", "*{{{{rrrreeeeeMeMMMMM9M9999999999D9D99D9D9DDDDD0DDDD0DDDDDDDIDDDIfDD0DDD9D9I5D9DD9D9D999999RY&h&Yhuxhh&Y=axSZbb=ubbaabCbb;bxC;;aaCSaluaZlaxxxSSSxSuSuullllxxxxxSuuZuuuuSuSjljZjuuZuuljlljuZQQQujjSujjljjlujjj9WWYYYhhYYhYYRUvNNNvvvvvkNAAAAAAAAttttttlFhIDIDRRIIDIIoso0oo0IIIooIIo0000oo00I[ TT*9*]t-t--t-----g4g-g4gggg4g8g8I&lj=T * ]ps ]TTUT ( TvN]TkpT%k]]TT:87887887878788878:88788>[xSlS ]]kTT]N]U]V]IR[", "*{{{r{[rrr[DeMeMMMMM9M999999I99D99999D9D9DD0D9DDDIDDDDD0DDDDDDDDDDDDD9D999D5D9DDDD9D9999999cY&&hY&au&j&&u=ab;bbbubaaC;;aCbCb;S;C;;xSxlSaZQxxxxxxuulQllxSlaSSSxxSuuuuuSQljlllZjuluZuSQZuZuuZQQZulljjjjujlulQljIFFFhFYYhhYhhIvvvNAANv vAAAAAztttttt--TFFlRIIIIRIIIIcoo0o0o0000o0000o@sooo00D*T *[ 9U--------]-4--g4gg4g48g8R8]hY&&9TT* *Tossss@s okosss@s %]Tk TV7878787878787878787788789SljuIT]kkT]]]%]TTpC&I", "{{r{r[rr[eeD[eMMMMMMM99999999999D9DDD9D0DDIDDDDDDDDDDDDDDDIDDDDDDfRDDD9D9D9D5DD9D9D9999M9MMR&&jhhjbxba&&=b==bbbbabbaaa;;;bbbC;;;bC;ZlllxZQlxxxxuZulllQuQxSSxQZxxSSuSxQjjjlluQlQuuuSjjQuZQQQZZQuQuuuulQQllllZQMFYYYYFYYYYYYIzvvNvNvvvvAAAztttTtt-----cFYlII_DIIcRIIIo0I0oo0I00oo000o000o000I*[{M T9[4-g-g-g--gggggg4gg8g88*88DY&Yu TT*** Vs@ooPs@TVs@]@ssssso]Tk TTV78787878787878787887878=bbSckT]kUTT]TA%]]Tk[p", "{r{[rrereeeMeMMMM9DR9M999999999D99D0D9DDDRDD0DD0DDDI0DD0DDDDDDDDDDDDDDDD9DDD9D95955999MMMMMRj&jhhju=_=lu_S;bb=CbbZbaa;;a;bbC;;bCb;;;CaluQlSuu;x;lllQljSxaxlQSZxxxllZjuuuQjjSZljuuZulQluQQQuZuQulQuZZZllZjjjlZIFFYhFFFFYhFYcvvvvvvvvvMzttttttt-------=hhbccIIcDIDIIco0IIo00900oo0I0o0000IMIr[MM[Mr0Dgggg-g-ggg-g4]gg8g8488888jY&hI[]TV* *Ps@oPP@] @@VPs@ooPo T]k]kUV8787878787878787878787IIRxuM]UT-%TVTTNp]Tk-T]", "r{rrr[re[eMDMMMMMM9M999999IR9D99D9D9D0DD9DDDDDDDD0DDD9=_DDDD9D9D9D9D9D99D99999999959MMMMMMMR&&&hj&&ubRc=DCx==;bbbxbx;;C;;CbQSuSuS;;;C;SZZQSQZZQlSlll;SSZQllllxSSlllQuSQQlQlxZuuuZujQjuSZQuuuSulQQZuuujlljjlQQ_FYhYFFYFFFFYIvvvv%vNvTtTtttt--{----g-glhYccI_RDDI9[DIo0000oo00[ooo00o00II0ID[M[{*M 99kg-g4g-g4g4ggg848g888888]Fhhh9**TT *[Us@s@ssoT s@]so@os@@V]%NNAT]87878787878>87888788VcR;xRPNUTt%]s@ss@T]stV@", "[r[erreeeeIDMMMM9MM9M99999999D9D0DD9DDD0DD0D9D0D9D999D99D0D9D9DD9D9DD9D59D999999599MMMMMeeecj&FYhh&j=R=bM==xubCb=Sbxa;;a;baQuQuu;xbCC;a;;;;xQlQQZ;;alQuSxlQljZllZuujljjxlSuZljSuuuQuSuSuZZulZZZQuZZuujQllljQjDWFhhFFFYYYFhRvvvNAAttTt-Vt---tg--ggg-U&YYIDIIcIID [I0I00II00 [0o0oo0o00IIID0M9[*[*T[ g]ggg4ggggg]8g8g8888888R&hYh T*[]TT]o@ooo@oV ooV@o@@@@sV]N-NUtTN88888888887888787887[cS&&Dk-]UtTVs@@@sT@stos", "rrrr[e[eMMM[MMMMM999999999D90D9ID9D0D9I_D0D9D9D999D9D0D99999D999D9D9999995999999999MMMReMee;j&h&h&&ucbuuI==bbbbbbxb;a;babb;alaaSQQQC;;aaxaa;uuQlZxllZuulQllZllZuSZjllQlxSxlljSuuSjjuQuSZuuuuljululuZZlQZlljQjIWYhYYYYYYYYhcNNAztttttt------g-g]-g4gg&&jRIIRIRcIDIIII0IIII0 MI00[[[o0I90D[D9[M[D**[MT]]g4ggggggg*8g888888888=YhF; [TTT T] so@oo@@V @oVosPPo@g%gz]k]]]:78787878788888I8>7Pxl&hj U]U]NUUsoPPs@V@oV@", "r[e[eeMeM[MMMMMM9MM99999990DR99ID9IDDDDD9D9D999II09999999DI90999959999I9999)999999MMeeDeeee;uxl&h&lbbub;_;=a=bbb=Sb;aCaaCbCbZQZSxSSZlQQuQQQZQZaSuZlSZZjlllQSQlQZSQluxSSSSjQlSSlulullSuuQQQuSujjjZuQZQlZlljljQgYhYYhYhYWWFhbTAttttt--------g-gggggggk&l&RRIRI*M[[D90T00II0[MIII9[*[M0DID9ID[IM[[I **[]4ggggg48g888g888888:8:cjYYZ*[kk]T%N[os0o@@ o@ Vo@VPoVNk%]TTTV]P878878888>88888:888&h&&;%t]%kNTo@s@s@V@s]@s", "eeeee[eM[MMMMMM9M9909I99D9D99D9D9RD9D9D9D9909999959I999999M9999II99999.9999999M9MMeeee[r[rDQlQlQj&lcbucc9a=b=b=bbub;aC;axCaxZZSuZQQaaxaSuQSxxuZuxxxQ;xx;;lSSQZluullSSQSZZuxSulljQZjlluQllZZuZjlZSZZQZQQZZuQluIYYYhYhYFWWWYbAtt-----g[g]*]ggg-gg4gg8 jj&IIIID T U]T]]UNTTk%%t]]%k]k]oTo* [* r[{ *[4-g4g4g8g8gg88888888888cZh&S ]TN%ktU [oo[os@o @@oV@oo] U Tk ]kkk88888>8788788888880h&hj=Vkt]UN]VsPso@oVsPU@", "e[e[eM[MMMMMMMMM9M9999990990D9IID0D0DD0D90D9D999999M9909MMMMMMM9999MMMMMMMMMMMMDeeee[eeer[r&h&&j&&u=abcc9b=bb=;b=ab;;Caa;xCSZx;SZlZuaaaxSluZZQuxlSaSxxxaZlZaaxuSZuZlSxuZuSZuljlujxjSSullZuuZljllZZQZSlQluuujZMFYFYYhhYFWWF=*Ntt-tg--g-g-gg-gggggg8gT&jhcIRID TTTTT ]TTTT]]]T]]]]]kUUNNNztk]M0D{t--ggg8g8g8888888 :888UlSj&cTT{] N ToV [0oo@@oooVV]]TTUTT U] ]U87878>88888888888-IYhh&=]]tTT-UosP@@soos@Ps", "ee[MMMMMMMMMMM990999IM9D9D9D9D999D9DI9D9I5999D099999DMMMMMMMMMM99MMeMMMMeeeeeeeMDMrereeeeerjh&hhh&u=cRcjf=b=bSbCCb=b;b;aCS;uZuCCuQ;uZlZQQQ;;CaC;;;axa;;x;axxxQluZlSuZxxxllllluSljxSZuQQuSuSujllljuZuuljQllSSl[WWWFhhYhYhYFa *%-gV-g-gg]ggggg8g888g8 j&&ccRcI TTTTTTTT]TTV]T]]V]]Vp]]]]kkk]kU M9I --gggg--88g8888888888glSh&RV {T%]]kVT]TVoT[ TVTT ]ViV ]kTT NN]T]g888888888888gg8ggRhhhYlVkTV]%UU@@P@@@os@PV", "M[MM[M[MM[MMM90M999M990990D0D0D9D9DMI9D9I9D9D99999MIDMMMMMMMMMMMMMeeeeeeeeMeeMeeer[r[re[eerh&&YFFhQbcRQ&Rb==C;SS;=ba;C;CSZZuZCbCbxxSSQQCC;axaa;;;axxa;;;xx;a;QZxljSZZllSZlZjZZZZZZuZSuuuSSuQlZlllSSuSjlljjSSjRWWWWFhYhhYFFa[ *U--g-g-gggg4ggg88g98gM&jjIIRIR T TTTVTT]TT]T]]T]]]]]]]]Uk]UUUVD{0DA--]]9[U]VDujkt]8 88g48&&&h=] [kggg888:88:8:g8:g:gg4gtANU]kUtk]]V88888888888gggggg-0hhhh;VTU]]NTVPPoPVVoooUU", "M[M[MMMMMMMMMM999M9099D99D99DDDD9D99999D99D99999999MMD0MM[MMMMMMMee[ee[e[rr{eree[rr{{rrre[9YY&YFFhjQuu&&I=b=SxSSCbb;aabba;;xSbCb;aCbxuSCCa;;;;;xxxxa;xxSxxuSaxxSSulZjlZQSSxxSSuSSSuSSSuxluuZluQjZjjxljZQljSQjIWWWWFFFFFYFWl[[* Ugggggg9ggg8g888k g8Ujj&RDIcI TT TT T T] T]T]]T]]]T]]]kk]]]kkkTMIDD ]DcMV]kVN9&j T]T%gg-gg;&h&=]]kkg4gg8g:8888:888:8::8:::8:::::UTUUV88888888gggg]gg--9h&&hSV]%U]%VUUNUV]V]VUVU", "M[MMMMM[MMMM0M9M90999909909D99999IID9D9999MR999999999MMMMeeeMeMMM[Drr[r{{{{{[r[rr{r[{[{[{r*YYYhYFYjQjl&Yc=ab;Sbaa=bbbCbabCxZxbbCauaZSa;CbC;;;a;xaxSxxSxxxuZux;aaaSlllZxSSSxSuuuuuSSxlllSujQlZllQjuuQuZSjjlSxl FWWFFFFWFFFWj{ [ -g-gg-0gggg888g8888gl&&cRRIR T T TTTTT TT]TV]]V]]]]]V]kkUkUU [*IDoRc[VTT]]g]I[ T%]-%4g-gSSjjR]%]]gg4g48g4888g8888:88::88:::8::UUA]]888888ggg--gggggg0&&&jZ]U]7:7::g7:g:gtNN]]", "MM[M[MMMM0M9M9099990999D059D0D99DMMM99M9990999D9ID99MMMDD[[ee[eDer[r[r{[{[**{*{{r{[{{{9r***YYhhYFFjQ&&FhR=Sx=;CCaSSC;aC;aSuuuuZa;u;SCbbCCCa;;aSaxaa;;;xxxSuuSSx;aualSSSuSuuuZuuuuuuuSjujjjlZQQlljulQZZZljlluSTYFFWFYFFFWWWj[[[[MTggggggg8g88g8888888llj=ccRI T TTTTTVTpT]T]T]Vp]]]]U]]]k][[0D=C*T%]TUVAkNcj[Tog]kgggccC&=V]T g4gg8ggg8g8888:88:888:8:88:8:Nk]kV88888P8ggggggkggg[j&jjZVAN:78778787:787:7:", "M0DIMM[MMMM0MM9M909999099D99990990DM90MM0DMM90DMMMMM9MMM[eee[eee[r{r{{********[{[{{{r{[***[FY&jhFY&&jYF&c=bS=uSbu==b=ZSbbaZSaSZZuZxuu;bbub;;;xxS;;llSZlxSSSSx;lQluSxuZuuuuuuuSxxSuuSSllulljujZljjjlullQZuQluS[YYFWFFWFWWWhS[*M[[ Ngggggggg8888888888jl&cccII* TT TTTTTVTT TT]]T]]]]V]]kk]k]UT[D{0boUT%]]U]]TU]k]TTT]]]g8cbbZl T]]-gggg4g84884888:88:88::88:8:8t]k]T888PoUgggg-ggggg8Pjj&jjUUUg7878787878787::", "IMM[MM0MMMMM90M90990999D9090MMMM[MM[MMM[MIMMM[[M[M[MMMM[Me[ee[e[r{[**[*0** [ ****{{[****** hh&&&FhYhhFFjR==babx;xxCbabbCZSS;xS;SubbZZZ;CbCCCbC;SxxZQQuQ;SuuxaSZZZaSuZSSuuuSSSSSSxSuxlljZjllululjlZuZQjQQuluSZTYhhFFWWWWWhla] *[Tgggggg88g888888gggjj&=cRI9 * * TTTTTTTTV]TVTVi]]T]]]V]k]k]M0D[IkVUT]sssVU@PUT]tVTUg]g[SZjj[*TT-g4gg-gg8ggg88g8888888888:8888V8VTg888UgggggggggUggojjlZZ N%N878787878878878", "[M[M[DMMM0M0MM9MMMM909909MMMMM[M[M[e[[e[e[R[[e[[[[e[[9eeeeeeer[**[*** *** * ******* * *[ *[&hhhhYYYhFYF&c====;;;CauuCCbbbbxbbb;ZSCZZxCb;;b;SSaauZC;;;ClZax;ZaSQQ;SSaaSSSSxxxxxxSxaSZQllllSSjllllluuulQZlujZjl YhhhYWWWWhQjl ]V M[ggggg88g8888ggggg-lj&b=IID T TT T TTTTTT]T]]TVT]]V]]]]]UT[90M ]kVVPsP@sPs%PsssTU%kkUDjlQj*[ g-g4gg4gg488gggg88888:8:88888:]%%UgggggggggUggggPggP&jl=S*tNP787878787878787", "M[M0M[[M0MMMM0M0M0MM999MM[D[[[[e[[[[e[[[[[[[{[r[{[{{[[[90r[[r9**[* [** 0 ** [ [ * * * *IjhhYhYYYhFFYZbb===;=CxCSbbbbbb;CC;bCbbbbZCxZ;;auSQubCCC;;aa;uQZxZSlxaSZxaxaaxxxxaxalZxxjluZSjjSuujxlZjlZuQjuZZujuQ]FFhhhYFWW&Zhj** [ [[ ggggggggggg-g--- ;Cj=cR[I* ToT T oT TVT]]]]T]]]]k]]]]90D* ]]%]Usss@osVUs@sso]UV][ljjjD[[T-gggg-ggggg4gg:8g8g88888888888UkgTggggggggggggggggPgZSCCZIg%]888878888788788", "M[MM[MM0DMM0M[DMMMMMMM0M[[[[[e[[[9r[[r[{[{[{[*[*[*[[***[*[**M0[*[** * * * * D[c&jj&YhhhYYYYuCbb======xbbS;a;bbbC;;;;;CCbbbQZuCC;C;aaa;aaxaxCZSSu;;aSxaSx;a;axaxxxaxllZSuuSlQulSlljllZjZulllQQQQjlDFFYYhYhWW&lFj[[[[ [*Uggggg-t---g-gU]gUcSZb=IDc * * * T TT VTVTTTV]]T]V]]]]kV[{ 0[TV]oo@@sPPsVP@@s@UV]UVDSZjjI [Tg---g-g4ggggg8gg8g88g888888888V]t@ggggggggggggggggggSljjj0UNV78788787887887:", "[M[M[M[M0M[MMM0IM0MM0[[[[e[[[[[r[[[{[[{[*[*[*[******0** I[* [ [[* [ 0* [ [ 0Icj&&j&Y&&Yhhh=bb;;bbb==bCabC;Zbbuabb;;;CbbC;C;;;CCbCCbCCC;xxaCSSuCa;xa;lCxxx;xxx;xSxuSSuZuSQjxxljlZlZlllullZjlllSZZcYYYYhYhhW&&F& * [oNNttgtgggggggggggbulCcRII[* [ o T o TVTT]TT]VV]]]]UV]U] [* N%TTPsosoVPVUsPPPV]]]V[jj&l0 ]]tgtg-ggggggg4gg488g88888888888kV%]gggggggggggggggggg=jjl&cNNU888788878788788", "[[M[[[[[[M[M0M9[MMM[e[e[[[[[{[*[[[D*[*[*[*[ **[0[ [[[[ [ [ * * * * I&&j&&hhhhh&&Zbbbb;bb=S;SSSbS=bCSSxCbCZSxaCbC;;;CCaSSZlQu;xxa;Cal;C;Z;ZaSSSxx;;xxuSxZxuuQuQxSxSuluSlZZZQSjllQZllxuZgYYYYYYhhY&YWjUUN%T * ToVggggggggggggggZjQ;cRI0 T TTTTTTTTTVTTT]V]]]]]]]][D[MTUUoTo@o@VVVU@PPo]]]]V%[&ljjI UTtgttgt---g--ggggggg8g8g8888888]]]Pg>ggggggg>gg>gg>gsjjjjjRtUP878887888878888", "[[0I[M[M[[MMM[M[[[[[[[[*[*[*[*[**00[* [ [ *[ [ [* [ * *[ [0 [ [ R&jj&&YYhYY&habbbbb===bSSa;;abbb=b=bbbbCxxxaabC;uuSxa;uxC;;uCx;lx;allCxSSSuSaSSSxSSuuxSxQlSxxxlZluulZjSuZjlZlZjxSSl%YYhhhhhh&hFWjUUUNV[[*@]Tggggggg>gggggVSllCcc99* [* TToTT@TTVTVTVTVT]]TV]V]]][[MD[V]kUNUVVU]U%VVU]]VVV%V &&ljI]* UN-gtgtgg-ggggggggggggg8g88888V]k]gggwgwg>ggg>gg>gg>I&&llc>TV888788878888787", "[[[[[[[[[M[[[[[[e[[[*[*[*[*[[ [ [*[ [ [ [ [ [ [ [ [ *0 o o o o o [c&j&&hYFYYh&&R==b=====SSSxxS=bbbbCbbbC;;CCCbbCbuS;SZSZbC;aCQCxx;CClx;xSSSxxSxSxxxxSClZxSaSZa;lSZlxuxSSxxSllljZSSSlZth&hhhYhhjYWW&UU%Uk[M[TVVVggg>gggggg>ggljl;Ic0I[ [ TTTTo T]TVT]]TV]T]]]]][[0[*T888888888888888888-VT@l&ZjM[ *UtgNgtgttggg-gggggggggggg88g88T]UP>g>ggggggPgg>gg>ggclSCcIU]N888888888888888", "[[{[[[[[[[[[[[[[[[[*[ [ [ [ [ [ [ [ [ [ [ [o [ o o o [o o o o o o Cjj&&j&YYYYh&0====abbbx=b;Cb====bbCbbbbCb;bC;bbCCZZZZZZx;Cu;;a;a;CZ;;SSSa;;xxaSxxxx;llxZ;x;SlZlluZZSxxxuZQllSZjZSZlThhhhhhYhjhWWjPUUUV[[ VVTNg>Pgggg>gggg>=jlcc9II[* oToT TVTTVTVTTTV]V]]]]U[M[M[P88888888888888888888]V;lZS[ okttgttgtgtg-ggg-ggg-ggg8ggggggU]TUUg>gPgPgPg>gPg>gPgoc==cIPVt888888888888888", "*[[[*[[[D0*[*[ [*[*[ [ [ [o[ [ [ [ [ [[[ [ [ o o o o oo[o o o o o o[ o ooo*b&jjj&j&&&Yh&_c==CbbbSxS;bbx==b=bbCbbbCbC;;;Cb;xSZx;;aZCC;Cxxaaa;ClS;aSxS;CxaxSxxaxxuQxSx;SQllllQluSuSuZZjlllZllxQZ]hhhhhYh&jFFFjUUUUV*[[TVVNPggg>g>gg>g>gZSb=0cRI[ [[ T T TTTTTTVTTVVT]V]VV]VT[[ [V88888888888888888888]VSZl=0[ T@tNNgtgttgtgtg-g-gggggggggg8ggU]V%PPgPgPg>gPg>gPg>g>oc=S=R%%N888888888888888", "[ [ [[*[[*[ [ [ [ [o[o [o [o[ [o o o oo o[oo o o o o oo o o o ooooooT ooTo oobjjh&hhhh&jjC[==bbCCCbS=SSCSS=====bbbbbbb=bCbbCuS;xu;CaCxZCSxC;Sua;xxaC;SC;C;x;S;xCCSlx;;luZlSS;llluuulllZZZllZ;lQZ]FFYYYYhlhFWWjVUUUV[[[ VkVVPN>g>gPg>g>gcCcIcRIIM o oToTVToTTV]TV]T]]]V]T9o[*Vggggg8g888888888888NVVSjScI[*oTtNgNNgNgNgtgtg-gggggggggggggg] UVVg>gPgPgPgPgPgPgPg[=CS=c>gV888888888888888", " [ [ [ [ [ [ [ [ [o[ [o[o[o[o o[o o[o[o o[o[o oo o o o o[ o o o o oTo To oooToToToQ&&j&&&&hhScc bbb=Cb;=bSb=xSab=bSS==uaSS;;CSS;uaZCSS;ZbC;CC;CuSSSZ;;;auCuSC;C;xaSxa;ClZ;;ZS;Z;SlZllZZllllZxZllu;;lZVFWFFFYQlFWWWjUPUU] [ Nggo]VP>g>PgPgPg>ISCcccII0 [ * o o oT T oTT VTTVVTV]VV]V]V[9M[Vgg8g8g8ggggg8g888888]V=lZxI*[ Vg>tNgNgNgtNgtttgggttggggggggggoUTVPgPgPgPgPgPgPgPgPs==C=Io]V@88888888888888", " [o[o[o[ [o[o[o[o[o o[o o o [o[o o o o [oooo oo oo o oooo o o o o o o o oooTooTooooTox&j&jj&j&lcRbrbx==CbbC==bC;xCC;b;axSC;;;SxS;SxSSSSuSZZZaSZxuZZZbbC;;ZSxZxZxCC;;xSSxaaaQ;aZxxxxSlZZZlZllZlZZllZCxlZZ*YFWFF&lhFWFWjVUUPV[0 ggtVoVUgPgPgPggPgClj;cIII* [ * T o T TVTTVTT]V]TVpVTV]*II[Tggggggggg8ggggggggg8P]ClSCc [TNtNgN>gNg>gNgNgttgtggggggggggg]%VVNPgPgPgPgPgPgPgPPgC=cCC0V]V88888888888888", "[o[o[ [ [o[ [ [ [o[o[o o[ o[ooo[ o[o[o ooo o o oo ooo o o ooo ooooooooo*o ooooooVooooQh&&&jjjl==ajIb==C=b=;=;C=;C;aCaCabbCSSZ;bbx;SS;CC;bbbbbxSuSxxZb;aaCZZx;auCC;;;;xSS;xCZSCuau;ZZZxZZ;;ZZlllSlSxx;SaZVYFFWYl&YWFWWjPU]]][[ g>NoU]V@gPgPgPPg@CjjlRc=I[[[ [ [ o o TTo oTV VTVTVTVVV]T 0[0[Pggggggggggggggg8gggg@VcjZZc[ [ N>gNNgNNgNtNgNg>gtggtgtgggggggU]UVgPgPPgPPPgPPPP@PgPZZCCZDVVV88888888888888", " [o[ [o[o[o[o[o[o[o [o o[oo oo o oo ooo o o ooo oo o o o oooooo ooo o o o o[oooToVoVToTo[j&hh&jjjuaSj&9=c;=bC;;====xSCb;xCbbbbSSS;bCCub=bbCCCbbxZCuCSC;ZCCCC;SZZSaZCCC;;;xSxS;CSZ;lxxQZlS;xlxxClllZZSZSCSSlZ hYWFjjYFFWFFjVUPUoT otgNV%PPVPgPgPgPP>cljScIRI0[ [ [oo T oToTTT oTVTVTVVTV]TVVTD0e[Vgggggggggggggggggggg@VISS=C[ [ >NNNg>Ng>Ngg>gNggNg>gggtgtgtggUVVoPPPPPPgPgPgPgPgPPgcZZCSIVTVgggggggggggg8g", "[ [[[[ [ [o[o[ [ o ooo[o[o[o[[o o o[o o o o o[o o oooooo oo@oooTo[ ooToo TooooTooToo@j&j&h&jjuSjjlDcC=;x;xa===bCCx;C;bbC;xx=;b;uSb=Cx=bC=xSSSS;ZZSCZZ;ubSuuZZxCS;C;;;xxxCx;;QSCSlZSxuS;ZSSCSZCClZZZSSllSVhh&&jhFWFFWFjP]VU][ og>googV@gPPPgPPg>cllC0ccc[ [ [ o o ToToToTVTVTTVVTVTV 90D[@gggggggggggggggggggg@oI=ccCToo NNg>NNgNNg>NNgNgNgNggNg>gtgtgtUoT]PgPogPPgPPPPgPPgPsIZZSSIVVV8g8gggggggg8gg", " [o[o o[o[o[o o[oo[oo[o ooooooooo o oooo o oo ooo oooooo ooToooVoo@o ooooooooTooooTo@T@j&&jjjjlxuh&jIc=abC======CCCxbbbCabSSSCbxbbSSCCCS=bbSx;SCCbZCbbuxSCCSCZZCC;CC;xax;x;xCCZSCSZZSxlSSxSlCxSCC;SZ;ZZZlZ]&lSjhFWWFFFFYP]P]@ 0oN>N@oNPVPgPgPgPPg0lZcIcII0 [o [ oTo ToTVTVTVToVTTVV]V I00 @tg>gg>gg>gg>gg>ggggg@VIC=c=V]VV%NNNN>N>gNgNg>Ng>gNgNgNgg>g>ggVo]VPNPPPgPPgPgPgPgPgPICCCZc@Vogggggggggggggg", "[ [o[ [o[ [o[o[[ o oo o o o o o oo o oo o o ooooToooo@oooVoVo@oo@T@TVoVoooToVo@@@V&jj&jj&jZajjZI=CCC=bc===bCaCxxCCbCa==CCb=bC;==bCb=x=CSCSZCxbbCbSZSubSCZCCCbbC;x;C;;x;xCQZCCSlZZZZZZS;ZZllZZZSSZCCCS jjul&hYFFFFW&P]V]o[0ot>tooNo@gPgPPPgP@IcIc0ccIM[ [[ o o o o oToToTTVTVTT@TVTVo DM[ @>gg>gg>gg>gg>gggwg>gPV0=Cc=o oN>N>NNNNN>Ng>NgNg>gNgNg>gNgg>gTo @NPNPgP@PgPgPPgPPPo0C=CCCVV@gggggggggggggg", " [o[o[ [o[o [o[oo[ooo o[oo o o oo o oo[o o o oo ooooooooT@T@oo@oVT@@@@ooToV o@T@oV@[jjjljjlu;au&&cCCC==Cc=cCxxC==C;CCb=;;=b===Cbbb=b=b=bb=SxCbb=bCCx=;CbbZSbbb;bC;;x;C;;xSaCZZCxZZSZZZZSSSSZSZZSlSxC;;Z[jljjj&hYYYFFF@P]PUV[ >N>VVg@VPPgPgPgPgIIcCII0D[ [[o o o o oToT@ToTVTVTVTVT 00[ ogg>ggPg>ggPggPg>gg>g@V0cZC=[[[o%N>NN>gPgNN>gN>N>gNg>gNgNg>gNgoTooPNPPPNPgPPPgPPgPgP0CSCC=ooVggg`ggg`ggg`gg", "o[ o[o[ o[o[[o[0o ooo[o oooo oo oo o o o oo oo o oooooooVoVo@o@oVoVo@Vo@oV@@@@o@oooVV@oV&jjjjlbcal&&jRCCc=;=bCaaCCb==;;x==b=======b===b===b=b=Z==bbCCbx;CbCbCZxCbCbbb;aC;CCC;xx;SZZZSZxZZZZZZSxSSZZZSZ;CClSMQj&hhh&&hhYFhVVVVV[[oN>NVPNPPPgPPPgPPPcSZ=I0II0 [ o ToTo ToToTo VooTVVoVT@I0D[@og>gPggPg>gPggPgg>gN@T0ClCC[[*oNPNPgPNNNPgPN>NNgN>N>g>g>Ng>gNV oT@PgPNPPPgPgPPgPgPP0CSZ=C@T@g>ggg>ggg>gggg", " o[ o [o o o [o oooo o o [oo oo o0o o oo oo oooooVT@oVo@oVoV@T@@@oVoVVT@@V@V@VV@@@VIj&&jju=bj&&&Scb==;b=bc=;xx;bc========Cb===b=bb=bbb=CSSSCSbbb=bSSCCCbC;;SbbbCC;;aCbC;CCCCCSCCZCxZSZSZZSCCSSC;lZSCSZS l&&hYYYh&YhF&@VV]V[ [>NP@oPVPNPPPgPgPgcZZ=III0*o[[o[o [ [o o oo @ToVToTToTo]oVT0I0 o@>gPggPgPgPgPggPgPg>Po SCC=[ [ PNNNPgPNNgPgNNgPNg>gNPgPgN>gNgPVooVUPNPNPPPPPPgPP@Pg0=S==CoPPgg>g>gg>gg>g>g", " o[oo[o[ o o[o[[o o o o o oooo[ o0[ ooooo oo oo oo[oToVooo@oTVo@Vo@@@T@VVVV@@@T@@V@T@VV@@DjljQj;=Sj&j&Q==b=c=cccC;c================b===b=b=xx;Cbb=;Cb=xSxSb;;=ZC;bCbCCbbCCCCCCbCbCCSCZbxZSZZZSS;;;ZCx;CxSZZSZt&hhjhYhhh&&YYVVVPVo0oPPN@VNP@PgPgPPPgPIZZCI0IR0[ [ [ o[ o o oo oT oTooToTVoTV@TVVT0D0 o@PgPgPgPgPggPgPgPg>N@@@=C=C0[o NPNPNNNPNPNNPNPgPNPgPgNNgPgN>NVVo]VPNPPgPNPgPgPPPP@Ps=CCCC[VVogg>gg>gPgg>gg", " oo oooo o [ oo o[o ooo o ooooooooo ooo oo [o o oo@ oVoV@@@T@oVV@@@@@@@To@@@@@@VVVVoV@IjjjZ;bx&hhhhxcccccb=C;b=====================b===CbCx===SSS;CbSbS=;bCSbCbCCCCbbbbbbbCbbSbCuZuCCCxSSxCx;;;SuCx;SS;xxSVhhh&hYYhhh&Fh@VVVV[ oPPP@@PPPVPPPgPPPP0SSCcIIc0[[o[ o[ o [o oo o oToToVToToVToVVo00Doo@NPgPgPgPgPPgPgPgPgP@Vo====0 oP%PNPNPNPgPNNPgPNgNNgPgPNgPgPgVo VVNPNPPgoP@PNP@NPPPPII=ccoVVV>gPgPgggPg>gP", "o[ o[ o0 ooo o[o ooo o o ooooooooooooo o ooooooooooooVoVo@o@VVV@T@V@TV@@@@@VVVVV@V@V@VIjja=cC&hYYYh=c==cc==CbCc==c=====b===b===;b==CCb;======bC;SSSCCxSbbbCCS;bbbbbb;CbCbbbCCSxSSZCCbCCSS;;;;CaSZSZZZ;C;;x hhhhYYhhYhhFh@VVVP[[ PNPo@N@@NPPgPPPgP0=SCIcIII[o [o[o[ o o o o oooTooToToTooVo@TVVe00 0ogPPgPPgPgPgPPgPPgP>@oo====0[o P%NPNPNPNNPgPNNPgPPgPNPgPN>NNNoV@ooNPgPgPPNPgPgogPgP@II=cI >V@>gPggPgPgPg>g", " oooooo oooo ooo oo o oo oooo oooooo ooooooo ooooToVT@V@oVoVoVVoo@@@@@@@VVVVVVV@V@VVVVVVVcllcRbZhhYhYYC===ccc=cC======c=====b==bc;aSC;a;==bbbb====CSS=;SCSC=b=S;C=CbCC=C=SCbbCbbCSZxS=CbbSSCCS;C;a;SZSSS;xSxxc&hhhhYhhh&hF&@@VPV[o[PPPo@P@@PNPPgPgPg0cSCcIII0 [o o o o oo oo oToTooVoVooToVT@VT0D[ [@PPgPPgPPPgPPgPPgPPgP@@ccc=0 [oUPNPNPNPNPNPNPgPNNNPgPgPgPgPgPt@oVoPPPgPgPgPPgPPPgPPPIc==c0@VPgPgPgPgPgPgPg", " o o o o o o o o o o o o oooo oTooooToo ooToToo@oo@o@Vo@VV@VV@T@VV VVV@V@V@VVVVVVVVVVVcl=I=SjYhYYhYCc=ccc=ccc=cc==c===c====c=;;=bC===b==b==bCb===CCSS;=SbCCCb=C=bbb==b;b=b=C=xZSSbCb=CSS;C;x;SZSS;xSxSxxSS j&hhhhhhh&&hj@VV@@o@oNP%ooPVPPNPNPPgPPIcC=cIcII[o[o[ o[o oo o ooooToToTVoTVoTVV00[0[ogPPPgPPPgPPgPPgPPgPPPoIIIcI [ooUPPNPNPNPNPNPNPNPPNPNPNPgPNP>NoVVogPgPPgPPgPPgPgPPgP0ccc=IP@VPgPgPgPgPgPg>", "o ooo o o ooooooo o o oo[ooooo0ooooooToooooTooooVoV@@T@T@VV@@T@@VVVV@o@VVVVVVV@@VVVVVVVVP=ScRblhhYhhYhR=c===c==cbccc=c==cc==c=====C=======bbb=b=bbCxCCSSSCSCCbb=b=C=b=bb=Z=CbCC;xCCS=;Cb=SSCxS;SZS;SCSSSCS;SCI&&&&hh&h&&&ll@@@@@o [PPP@VN@VNPg@PgPPg0=C=IIII0 o o[o oo o oo o oTooooo@T@oo@oV[[o[ @PPgPPgPgPPgPPgPPgPPg@@0I00Io[ooUP%PNPNPNPNPNPNPgPgPgPNPNPgPNPoVVoPNoPgoPgPgPPgPgPP0IcIIc0o@VgPgPgPgPgPgPP", " o[o oo0 oo o o oooooo oooooooTooTooo@[o@TVooToT@oT@o@@@@@@T@@VVVV@VVVV@@@@VVVVVVVVVVVVVoI=IcC&&hh&hhY=c=ccccc=cbc==c=cc=c=====c=C======bb=bCCbbb==;bCSC;bS=CbS===SS=b=b=;==bCSSSSxCbCCSSSCxZCCSZSS;CSS=C=C=b &&j&&&hh&&lCc@@@V@[ooPPP@VP@@PNPPNPPgPo=CCIIII0[o[o[oo[oo o oo ooooooooooToo@oTVV@ [o [@PNPPgPPPgPPgPPgPPgPPPo0III0o PP%PPPPPPPPNPPNPPPNPPPgPNPPNPNV@V@gPPgPPPgPPPPgPPgPP0I=III@@@PgPPPgPPPgP>N", "ooooo oo[o[oooooo o oooooooooooooo@o[@oVooo@To0VoV@@T@V [@@@VVVo@VV@@@VoVVVVVVVVVVVVPVVVVIIR;Sh&h&&hhYc===cccc=cCccccbcc====c===c=x=======bbbbbb===bbC==S=x=S=;==CbxSS==C=;C=CSSSCCSCCSSSCSSSSCbCSCSSS=CbC=CbI&&jhhhh&hYZ=C@@@@P[o[PNPNPgPPPPPgPPPPPo==cIIII0[oo[o[ooo o o o ooo oo ooToooVoT@@@V0[0[oPPPgPPPgPPgPPPgPPPPgPP@0cIIIoo0oPUPPUPNPNPPPNPPNPNPPNPPPNPgPPNP@PoPgPPgPgPgPPPPgPPgPo00cI0o@@PPgPgPPgPPgPg", " o o ooo ooooo ooooooooooooToTooVoooVo@oVoVoooTVo@ o@V@@@VVVVV@VV@VoVVVoVVVVVVVVVPVVVVPVV[I=S&&&&h&&Yhccc=cccc=cc=ccC=bc=b====c==b=c============b=bCC;CCx=C==Cx===CCxCS=bbSCCCCSSCCCCSS=SCCCS=SSCS=C===CbbC=CIh&&jhYhhh&Sj&P@>>P>PwPwPP>PP>>PwPPsgwso==III0I0o[oo oo[ o[o oooo ooooo@ooo@oo@@@V@V0[[[[P>PPPgPPPPPPgPPPPgPPN@@0cII0@oVoPPPUPUPPPNPNPPPPPPNPPNPNPPPNPPPVoPPPPPPPgPPPgPgPPgPP0I0II0PP@PgPPPgPPgPP>P", "s@s@s@ssssPPs@sPs@sP@PPPPPPPPPPPPPPPPPPPPPPPPPsPPPPPPPPPPPPsPPPPPPPPPPPPPsPsPsPsPPPsPPPsPIcbljjh&&&&hhcccccccccc=cb=Cccb=cc=c===c===c=======bb=b===CCS=S=CC===b;===CCS;CCb=CCCxCSCC=CCCSCSC;CbSC====CCb=bbbC=[&&&&j&Y&hj&h&w``+``g``sw>swwPw>PgswPswoIcc0II0Ioo [o[ooooooooo oooooooooooVo@oo@@o@o[[[oswswPsPwPP>PPPgPPPPgPgg@ssPggggggNggggw>gwgw>ggwwgwggwggggwgPP@o@oPwPgsPPPgPPPPPPPPP@00I00@P@PPggPgPgPggg>", "PsPPsPs@P@PsPPPPPs@sPsPsPPsPsPssPPsPPP@PsPs@sPPPPPsPPsPsPs@sPPsPsPPsPsPs@sP@sPPPsPsPPPPPP=SQljl&h&hhhhIcccccccccc=ccccCCccc==cccCCc=====c====b====C==C=;CCCC==C;====;CSC=C=SS=CSCCbbbCCCC=CCCS=C==b=b=b===C=bP&&&&ljj&&hYFY+y,,+,+````+```g`y````g`w$00I0I0I00o[oooo[o oo ooooooooooo@ooVoooo@oV@o0[00wPwPwwPggg>gggwggggwggwg>gwg`>`wwywqwwwywyw`yyw``yyywyyww`yyygyy>yg`gww>ggPgPPPgPgPPPoossPPgPggPgPgPgPgPPN", "PPsPPPPPsPsPPsPsPPPPs@PPPPPPPPPPsPPssPsP@PPPPsPsPsPPs@Ps@sPP@sPPPPPsPPPPPPPPPsPPP@sPsPsPsujl&ZZlh&hhhhIcccccccccccbCCCcccc=cccccbC=Ccc============c=CC==C==b==cC===CSCS==b=CSCSCCCCS=CSSCb=C=====b=C=b==CCCC=Nh&jjZCCjh&&&j,,++,`,+++,+,``++,`y`+,++`,E,E$@ooooo[oooooooooooo ooooooo@ooo@@@@o@@o@[o@@>gwgg>gw>gwgw>gwgwg>gwgggwyqyyw`>``wy``w+yywyyyywgygy+yyyyyyy`>``yygw`y`wgwwggwwwgwgywwwgPgPgPPgPgPgPgPgg>", "PsPPPPsPPPPPs@sP@s@sPPsPsPsPsPPsP@sVs@sPssssPPPPPPPPPPPPss@sssPsssPsPPPsPsPsPPPssPPPPPPPs&h&lZZjjh&hhhIccRccccccccc=cccccc==bC==Cc=bc=cc=cc=======c==C===C;=c==C==;==CC===b=C=CCCCC=;CCb=bCCxb=========CC====0YYhjSSSj&&jh&,,,++,+,```,+`+,,+```,++,+,,+,,+,,+,$y+[ooo[ooooooooooooo@ooo@@oo@osg>>>`>wgwgwgwg>gwgwggwg>gwgwgwEEyyyyyyyyy>w`wyyyy>`w`yyyyyq,yyy+yy+yyyyyw`w`w`ygw`y`w`ygyyyw``ywwg`wwgwwPgPPgPgP>", "PPPsPsP@ss@sPsP@sssPPPPPPPPPPPPPsPsPsPs@s@s@sPsPPPPsPsPPPPPPPs@s@s@sPssPsPsPPPPPPPsPPsPs0&&hjjllZjh&h&IcIccRccccccc==cccbCbc=cccccbcc=c=cc===cc=c=CCc=c=C=C=c====cCS=======c;CCC==C======CCC=;SSCCC==b==cSCCCUYFhjZCjhh&&Yj,,,,,+++,,,++``,,++`+,`+`,,++,++`++``+,+,y,++qoooooooooooo@ooo>>>N>>>g>g>>g>gPgPgPgw>wgwgPgwgwwwq,Eyyq,wyywyyyyqyyyyyyyy>`w,yy`wyyyyyyyyy,y`wyyy`wyyyy`>`wyy``y`>y`y`wy`gy`wwwgwwgwg>", "sPPPPPsPPss@s@sssPs@sssssPsPsPsPsPsPsPsPsPsPss@ssssPsPsssPsPsPsPsPsPsPPPsPs@ssss@sPss@sso&h&h&lZZj&&h&Icc=cIccIccI=c=======c===b==cc=c=cc=c=c=c=ccCcC==CC=C=C=c=c=C=cCC=====c====bCC=======CCCc=============CohYhjSZ&&&j&Yj,,,,,,,,,+,+,,+,,``+++,,`,+,`,+,,``,,+`+`+++,,,+ywy,oooo@s>>>>>>g>>>>w>sg>>>wg>>wgwgwgPgwgwwwww,EE,qywyqywyyqyEyyyyyyEyq,wyyw,wyyyyyyyyyyyywyy,ywyyyyyw`yyw`wwwyywyww`wywywygw`w`w`wy", "sPssPsPPsPPssPsPPsPPsP@s@ssPsPs@sP@sP@sPsPsPPsPsPPsPsPsPPsP@sP@sPs@s@s@s@s@sPPPssPsPPsPsI&&&&&jZZjjh&hIc=cccIccccc=cccccccc=c===ccccccccccc=cc==cc==bc======cbcb=cb=====ccc==c=C=C=C=CCC==CbbC==c===CC===CCCC0Yh&Sjjj&&&j&&,,,,,,,,+,,,,,,,,,,,,,,++````,,,+,,+,``,`+,`,`,`,```y+++y>>>>>>P>>>>>>g>w>gPgswgw>gPgwwwwEEwqyqwqyqwyEE,EEyE,qyyqywyq,EyE,wyyyy,Ey,Eyyyyyyyyyyyyyyyyyyyww`y>+y`w+yy`wyyyy`w`wy`ww`>`w", "sPs@s@sPs@sPs@Ps@s@s@PsPsPPsPsPsPsPsPsPsPsPs@s@s@s@s@s@s@s@ss@sPsPsPsPssPsPsPssPPPPPs@ss0&&&&h&jZljl&lIccccccccIc==ccc==ccc==ccccccccc=ccc=cccc=ccc=====c==c=c=Ccc=cc==cc==ccc=CC====CCC=C=C====CC;CCCC;CCC==oYhjZhhjj&&j&l,,,,O,,,+,+,,,!,,,,,,+++,,,,,,+,,,++++,+,,+,+,+`++`++++````gy>Pg>>w>>PwPgwPw>wgPg>w>wEwqqEEEEEEEyqEEwwyEEEywwyqEywyE,EEyyq,qyEEE,Eyqyyyywyyyw,Eyyyyygyyyywyyw`yyyyyyyyyyyyyw`ywyyywgy", "PsPsPs@s@s@s@ss@sssss@ss@s@sPsPPsPsPsPsPsPsPsssssPs@ss@ss@s@ss@s@s@s@s@ssssPssPsssssssss0&j&&&&jZSjZlZIcI==cc===ccccc=cc===ccccccccccccccccccc=cccc==c==C=cC=cc=====c==c=c=c==cC==C=c===CCCC=CCCCCC====CC=c== hjS&hhhj&&h&j,,,,,y,,,,,,,,,,,,,,,,,,,,,,,,!,,,,+`+,,,++,,,+,`,++++++,++g,`+,``PgPwgPPPgP>>PwP>swq$$E$EEEEEEwqEEEEEEEEEEEEEE,qEEEE,wwEEE,qyyEEE,EyqEywyqyyyyyyyyE,wyyyyyyqwyyyyyq,y,wyyyyw`wyyy`wy", "sPsPPsssssPsss@s@s@@s@s@s@ss@s@s@s@s@ssssssssPsPsPssPssPsssss@s@s@ss@ss@s@s@s@s@s@s@s@s@0&&&j&hjlSZZS=IcI==cc==ccccc=c=cc=cccIccccccccccccccccccccc==cccCcb==ccc=Cc==c=ccccccccC====CC==CcC=CCC==CCCCCCCcc=c=0&CZhYhhh&&&&&,,,,,+,,,,,,,,,,,,,H,,,H,,,,,,,,,```,,,`+`,,+,+``+,+,+++,`,+`,y``y`w``Psgws>w>PgwwwwE$wwq$EEEEEEEEEEEEEEqEqywqEEEyEEEEEyE,EqwEE,E,EEEyyqyEqyEqyEEyEyEyyEywyEyyyywyyywyEyyqyyyyw`ywwyy", "ssssssPsPssPsPssssssssss@s@s@ss@ss@ss@s@s@s@s@s@s@ssPsPsPPsPsssssssPssPsPsss@s@s@s@s@ss@0&&j&j&jSCZjZcIcIcccccc=ccccccccIccIccccccccccccccccccccccccC==c=cC=cccccCcccc==ccccc=c====C==ccc=c===c=C===CC===cc==[==jhhhhhj&h&j,,,,,,,,,,,,,,,,,OE++,,+,,,,,,,,,,`,+,,,+``,,,+`+,``,,`,,,`++,,```y``y`y`y>PgPss$$$$$$$$E$E$EEEEEEEEEEEEEEEEEEEEEEEEEEEEqwEEEEqqwEEyEEEEEyywyEE,qE,EywEyE,EyywyqyE,wyq,qyyqqqEywwy`w>", "s@s@s@s@s@PsPsPsPPPPPPPssssssssssPssPsss@s@s@s@ss@s@@s@@s@@s@s@s@s@ssssssPsssssssssssss$IZj&j&j&ZZZjjIIcI=IcIcccccIIcIcIccIccccccIccIcccccIc==cccc==c==c====ccccc=cc=ccCccccccc===cccccc=ccCc==c===c====c=c==ocC&&&&hh&ll&&O,$O,,,,,,O,,,,,,,,,,,,,,,,,,,,,,,,,,,,+,,,,,,,`+,+,``+,++,`+,+y`+`y`y`y`+y`w`y$$$$$qs$E$$E$$$sE$$E$qq$EEE$EwEEEEEEEEEEqEEEEyEEEEqyEEEEEqwyEEqywqyEEEyw,qwywwyEyyyEEw,wywyq,yyEyywwwy", "s@s@s@s@s@s@@s@@s@s@s@s@s@sssPsPsssssssssssssssssssssssssss@s@s@s@s@@s@@@s@@s@s@s@s@@s$$IccSSCl&CI=CZIIIcccccccIcIcccccIcIccIcIcccccccIccICcccc=c===c=c=ccccccccc=cccc=ccccccc=====ccc=cccc=====C===c==cC===cocj&&j&&hhjjj&$,,E,OE,,,E,,,,,,,,,OE,,,,,H++,,,,,,H+`,,,,,,+,+,,,,,,,,,,`+,++`+y`++`y+`y++````y`w$$$$$$$$$E$E$$E$$$$Eq$$Ewwqwq$EEqEEEEEEEqEEEqqEqEEEEEEwwqyEEEEEEEEEEyEywywE,EqqyyywqE,qEEEyywqyywy", "s@s@ss@s@s@ss@s@sssssssssss@ssss@Ps@sPsPsssssssss@s@s@s@ss@s@s@s@G~G!!H~H!!H!HH!!~!!GH!O!GGGOOOOOOOOOOO,!!!O!G!O,O$$OBBBBB0000000IcIIccIcccIcc=c=c=cc=cccc=cccIc=cccccc==ccccc====ccccccccC=Cc=c==C=C===c====@=&&&&&&&h&Zlj$O$O,$,,,,,,,,EO,,,,E,O,,,,,,,,,!,,,,,,`,,,,,,,,,++`,+,,++,,,+`,+,+,+++`y``y`yyy+w```+$$$$$$$$s$$$$$$$$$$$$$qsqqqE$E$E$E$qwwEE$EEEEEEEEEqEwwEEEEEEEqwyqwwEEEEEEEEqEEEEEEwwyyyyEEEEy>w", "sssss@s@s@s@s@ss@s@@s@@s@@s@s@@s@s@s@s@s@sPsG!!,!!!/~!OGO!HGG!!G!!!!!H!!!!!GOG!G!!!~~~HOH,!,!,!,O,G,!,!!!,!,~,!HG!OOOOOOOOOOOOOH!~~~!,~,$OBBBBB0IIccccccc=cIccccc==ccccccccccc==c=cc=c======cccc===c=cccc===c[=jh&&j&&&&&&j,$,$,,,O$,O$O$,,,,,,O$,,,,,+,,,,,,,,,,,,+,,,H,,,,,,+,,,,,,++,,++,,+,,,y++,y`y+++``yy`yy`yy$$$sE$$$$$$$$$$$$$s$$$$$$$$$$EEE$$Eq$E$E$E$E$EEwwqEEEEEEEEEqEEEEqwEEEEywqEqqqEyEwwEEEEyw>yE", "@s@s@s@s@$@s@$@s@s@s@s@s@ss@sEE!/!HHHGH/~O!OOGH!O~/~~~!,OOOH!HG!!H,OOOGOOOOO,!~+//`/K+~`//!!!!!!!~!OG~~~!!////H!!~,O,OGO,O!~~,~!,H,!~!~~/`,OOOOGOOO$OBBI0IcccIccc=IcIcccccccIcc===cc====cIc=c=====Icc=ccccc==oSj&h&&j&&&&&j$O,$O,,E,,$,,,,,,,,,E,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,+,,,,,,,,,+,+y`,++y`,,+y`+yy,`y`+yyy$$$$$$$$$$$$$$$$$$$$$$$$$$$$$E$$$E$E$E$$E$$$$qEEE$E$$EEqEEwwwwwqEEEEEEEEEEEEqEEEEqEEqwww", "ssssssssss@$$s$s$O,G!G!GO~`~HOO!!!!OG!H!!!!,~!HGOOOOGGOOGOO,OGGG!!GO,O!G,O!HGG!HHOOG!!H!!33!3!!!!!~!!!H!~!~3!H!,!!!O!,~~/~//~~~!GO!~~~////!O,G,!~!O!,OOOG!~$$B0I0ccccIccI=cc=cc=cccccccccccIccccc==cccIcI====0Slj&&&&&&&&j&$,$O$$OE,,,,,,,,,O$,,,,,,,,,OE,,O$OE,,,,,,,,,,,,+,,,,,,,++,,,++,,,,,,,,,`,,,y`y`yy,+`yy+y+y+y+yy,$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$E$$$$$E$q$EEq$EEE$EEEEEEEEqEEEqqEEEEqEEEEEwwwqEqwqw", "s$ssO$OOO,GHOOO!!OOO!HH~/OG!!~~~~!!!!~!GOGH!HGGOOG!HOOOOOG!!!!!!!!~~!!!GG!!GOO!!~HHHHHGGGGOGH!~!,H!!!!,!G!~~~/~~!!!~~~~~/~~~~~!~~~!G!!!~//`/~!OG!~,~!~~/+~K,OOOOOO$$B00cIcccccc=IcIccIc=IccccIcccccccIcc=cccc0ZZZjjZjj&&&&&$O,$,,E,$O,$O,,,,$,$O,,,,,$O$,,,E,,EO,EO,,,,,,,,,,,,,,,,,,,+,,,+,,++,,,yy,,,,,,,,,+yy`,`y,y`,yy`yyyyy$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$q$$$$$Esw$$$qw$E$$$$$qqEwwE$E$EEqwqEqqEEEEEEqqqqE", ",,,,,,y,,y,```yy,,y,,+y,,,,,,,,,,,,+,,,,,,,,,,,,,,,+,,,y,yy,,,y,y,y,+y,yy,yy`yyyyyy$$$$$$$$$$$$$$$$$$$$$$$sq$$$$$$$$$$ws$$$$$$q$$$E$$$w$$$EEqE$wqEE$ww$EEqwEEEEE", "OOH!/~~~!OHHG,OOOOOOG,!OOOOOOOOOOOOOOOOH!~~////~~~H,GOOG`yyy`y`yy+y+`y++``y+y+``y++`>`y`yy`yy+y,yyy`>+y+y+y+`y,,,,,,,,,y,y,,,,,,y+,,y,,yy+,y,y,yyyyyyyy`>yyyyy$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$sqs$$$$$$$$q$$$wq$$sq$q$$w$wq", "~~HOOOOOOOOOOOOGH!,~~!!!OOOOOGHHH`yyyyy`y+y`yy,y+yy`yy`y`y`+++yy`+y+y`y+y`+y``+y``+y``+y+y`yy`y`y,y`+y,+,+,,y,y,+,yyyyy,y,y,,y+y,+yyyyyyyyyyyyEyw$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ws$$$$$$$$q$$$$qsq$q", "OH!!OOOOGHOOOO!HHGOOOOOOH,!~~!GOOOOOOOOOOOH!HGOOH!!!!!!!!H!!!~!~!~!!!!~~K/~!!!H~/~//~!!GOOOGOOOH!~~3HHOOOOOGGH!~//~~~//~!HGHHH!!!!!!~~!!!HH!3KK~!!3~!OGOH!~!~!,!~H33~~~!,//~!~/!G~~~,!`,!OOO,O0cCCSZCCZSZCSlZCZCZZCCZCZCCZl$wyyyyyyyy`yyy`yyy+`>+`yyyy`yy,yy,`y+`y`y+y``yg,+y`y+y+y+``y,`y`y+y+y`y+y+y`yy,,,E,,y+y+,,y,y,yy,E,yy,yyyyyyyyyyyy>qy$$$$$$$$$$$$$$$$q$$$$$$$$$$$$$$q$$$$$$$$$$$qs$$$$qsws$$sqsqs$$$$", "!!~!!OOHO,!!G,~~!!OOOOOOOOOOOOOGOOOOOOOOOOOOOOOOGH!!H!HO!HH!!~~~!!!!3~~K~K33~~~~///~~!!!!HG`yyyy`yyyyy``y`+y```yyy+y``y`++y``gy+yyyygyyy+y,y,,yy,y,,,y,y,yy,yy,yyyyy,yy>yyyywyw$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$q$$$$$$$$$$$$$$$$$$q$$", "K///`/`////~~H!!H!!HGOOOOOOOOOO!~~~!!GOOGHHH,G!~~~H!HGGGHG!HH!!3~~~!!!!!!!!!~!~~~~~~~~/~~HH!3!HGGOOOH`y`yyy`y`yyyyyy`y,y`>+y`yg``yyy+y`yy`yy`yyy`>`yy`yyyyyyyyyy+gy`y,,y+y`yy,yy+,E,E,E,y,yyy,y,y,yyyyEyyyyyyyy>ywwww$$$$qs$$$$$$$$$$$$$$$$$$$$q$$$$$$$$s$$$$ws$$$ws$$$$$$$$$$", "33~K~~K~3y>yy>`>y>yyyyyy,yyyy,yyyyy``y`y`y`yy``yy`yyyyyyyyy+y,yyy,y+y+y+y,yyyy`y`y`ygyyyyyyy,yy,y,y,y,yyyyyyEy,yyyyyEEyyEyyy>ywqqq$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$Esq$$$w$$$$$$$$", "OOGHGGOOGHH!HOOOOOOOOOOOGOOOH!HGHHH!HGOOO!~~~~~!~!OOOHHH!,3!!!!~~3!!GOGOOH3/~~33!!!!GOOGH!~~~///K~3K~~~~!GO!!`yyyyygyy>gyyyyyyyyyy,yyyyy>yyyyyyyy`yyy+y``y+y+y`yy+yy+yyy+yy+y``yyyyyyy,y`yyy`yyyy,yyyyyE,y,E,E,EyyEyyE`yyEyEywyEywywwww$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ws$s$$$$$$", "GHyy>`wyyyy>`yy`yyyyyyy,yyyyy`y,yy+yyyyyyyyy,yy,yyyyyyyyyyy,yyy`yyyyyy`>`yy`yyyyyyyyyyyyyyyyyyyyyyEyy,E,E,EyyE,EyyEyyyEEyqyw>yqw>qE$B$$$$$$$$$$$$$sq$$$$$$$$$$$$$$$q$$$$$$$$$$$$$$$", "OOOOOG<<ywyyyyyy>`>yyyyyyyyyyyyyyyyy,yyy,yyy,yyyyyyyyyyy``>,yyy,yyyyy,yyyyyyyyyyyy,yyyyyyyyyyyyyy>`>ygyyyyyyEyyE,EyEyqyyEyyyyqwywwwEwwwwwE$$$$$$$$$$$$$$$$$q$$$$$$$$$$ws$$$$$$$$$$$$$$$", "H!<222~333yyyyyyyyyyyyyyyyyyyyyyyyyyyyy>`>yyyyyyEyEwyywywwyEwwywyqwww>Eqwwq$$$$$$$$$$$$$$$sw$$$$$$$$$$$$$$$$$$sqsws$", "2322!HOOOOOH!ywyyEyy>yyyyyyyyEy>yyyyyyyy,E,Ey>`yyyyyyy,y>`wyyyyyyyy,yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyEyyyyyy>ywywyEyyEEEyqqyqyqywEqEywqw>wwwwqw$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$q$$$$$$$", "OOOOOGH!!23!wyyy>wyy>>EyEyyyyEE,EyyEyyyEyyyyyyyyyyyy`yyyyyyyyyyyyyyyyyE,yyyyyyyyy>yyyyyyyyyyyyyyyyyyyyyyyywywyyyywyyyyyyyEyEyEEqEEEwwwqwqEwwwwww$>$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$q$$$", "HH<yyEyyE,y>`wyyyyyyEyyqyyqyEqyqyw>yqywywyyqqq>wwqywEEEEqEEEywqEEwwwwww>www>$sw$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$", "GGGHHHHHHyqyywyyEqyyEEyyyyyEEyyyEyEyyEEyyyEyyyyEyy,yyEyyyy>yyy+>yyyyyyyyqyyyy>yEyEwyyqyyyqyyqyyyyqywywqwywyywywywywyEqyEqwEqwwEqww$q>qsqwqPqs$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$", "OOOOOGHGOOOGHGHHyqyw>ywqywyqyywyqywywyyyEyE,qEyyEyyyyyEyyyyE,EE,yyyyyyyyyyyyyyyyyywyy>ywy>`wyEywyywEyyqyywwqEywqyqyqwqqqwwwq>wwqqwwqEqwwEEwqqqqwwwww>wsqs$$$$$$$$$$$$$$$$$$$$$$$$$$$$sq", "OOOOOOOGHHGOOOOOOOOOOOOOOOOGHH!2~K~3332<22<<ywyywyyqywyyyEyyEqEyyEEyEywyyEy>y>>yEEEqyEEqywyEyy>y>yyywyyEyqy>yEEqywqEywywqywqwywyqwww>wwwwwwwww>wwqwqw$E$w$Esw$qsw$qsws$$$$$$$$$$$$$$$$$$$$$$$$$$$", "KK~2HGGGOOOHOOOOOHH!!!HOOOOOOOH>yyyyyq,EyyyyqEEyEyEyEyyyyyyEyEyEyywyyEyEyyEywyqEEyEEyEywyqqywwywwywwqqqwwwyqqywqwqwwww>qqwqqqwEEEqEqE$wwq$>wswsws$s$$$$$$$$$$$$$$$$$$$$$ws", "~22wwwwwwwqwwwwwEwwwwEwwEqwwqwwqww$E$w$Esqsq$Esqs>qwsw$$$$$B$$$$$$$$$$$$$$$", "~22wEyEEEEEEEqywwyqywyEEEyqyqEEwyqEEyqEEywEyqEEEyEEyEEEyqyEwqyqyEyqqywqEEwwyqEwyEEqqqw>>yEw>wqww>w>wqw>Ewqwwwww$wswwwww>w$>sEs$$w$$qswssws$$$$$$$$$$$$$$$$$$$", "wwwqEEEEwwwwwqwwwwwwwwq>wEqwwqwqwwsqwwwwws$sqswwwEsw$sw$sw$qw$wsw$$$$$$$$$$$$$$$$", "GOOOOOOGOGGGHH!232!22wwwEEEqqqqqw>w>wqqwwEEqEEEEqEqqEEqqqEqqEwwwwEEwqEEEEEEEwqEqEqEwwwqqqwwqwwwwqEqwwwEqqEwqE$wwsw$wswq$ws>swqwsq$sws$$q$swsws$swswswsq$$$$$$$$$$$$$", "OOOOOOOOHH!33qEEqqwwywwy>>yqEqqwqqEqEEEEEEEEEqEEEqEqwwwEwwEEEqwwqEwwwwEqEEqEqEEwwqqwwqEwEwwEwqq$qwwq$Eww$wwEsw$wswwsqswsqswsqs$$$s$sw$sqsqsqs>$sw$$$$$$$$$", "OOOGHHwEEwwwqEEwwqEEEEqEEwqww$Ew>wwwwsE$wwwsws>sww$wsws$wsqs>w$ws>$wswqwssw$qsw$$w$swswsq$$$$$$", "sws$sws$s$qs$swswEswswsw$$$s", "HHGGGGGOOGGHHHHGOOOOOGOHHs$qs$q$wswwswswswsqs$qq$swswswsswsswsqsws$$ws$$qwssw$s", "OOOOOOOOOHHHHHGHH<<$wssE", "OOOOOOOGOOOOOOOOOOGOOOOH<<2!$sq$s$$$swsqsswsw$swsqsqsw$sqwsqsqsws$sq$sw$w$", "OOOOOOOOOOOOOOOOOOOOOH22!<q$$$E$$$w$$$$q$$$q$$E$ws$q$sqs$$sE$q$$ss$sws$$$$s$sqsww$sEswsEsqswsqswPwsws$qsqsqsws>sqsq>sws>$s$sq", "OOOOOOOOOOOOOOOOGH!<<<<swsswswswsqsqsqswswsq", "OOOOOOOOOOOOGH$ws$sqsqswswsqsqsws", "OOOOOOOOOOOGGGOOOOOOOH<<$s$$$q$$$s$$$$$wsq$q$Eswsw$qsw$$$$$sw$sq$$qsqsqsw$s$s$wPws$q$$ssEs$$q$$Eswswsw$$w$ws$qsqwsw$$swsq$$wsqsq" }; slashem-0.0.7E7F3/win/gnome/0000775000076400007640000000000010545462317013556 5ustar alialislashem-0.0.7E7F3/win/gnome/gnaskstr.c0000664000076400007640000000264010545462317015560 0ustar aliali/* SCCS Id: @(#)gnaskstr.c 3.4 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ #include "gnaskstr.h" #include "gnmain.h" #include static void ghack_ask_string_callback(gchar * string, gpointer data) { char **user_text = (char **) data; g_assert(user_text != NULL); *user_text = string; /* note - value must be g_free'd */ } int ghack_ask_string_dialog(const char *szMessageStr, const char *szDefaultStr, const char *szTitleStr, char *buffer) { int i; GtkWidget* dialog; gchar *user_text = NULL; dialog = gnome_request_dialog(FALSE, szMessageStr, szDefaultStr, 0, ghack_ask_string_callback, &user_text, NULL); g_assert(dialog != NULL); gtk_window_set_title(GTK_WINDOW(dialog), szTitleStr); gnome_dialog_set_default( GNOME_DIALOG(dialog), 0); gtk_window_set_modal( GTK_WINDOW(dialog), TRUE); gnome_dialog_set_parent (GNOME_DIALOG (dialog), GTK_WINDOW (ghack_get_main_window ()) ); i = gnome_dialog_run_and_close (GNOME_DIALOG (dialog)); /* Quit */ if ( i != 0 || user_text == NULL ) { if (user_text) g_free(user_text); return -1; } if ( *user_text == 0 ) { g_free(user_text); return -1; } g_assert(strlen(user_text) > 0); strcpy (buffer, user_text); g_free(user_text); return 0; } slashem-0.0.7E7F3/win/gnome/gnmap.h0000664000076400007640000000065510545462317015037 0ustar aliali/* SCCS Id: @(#)gnmap.h 3.4 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ #ifndef GnomeHackMapWindow_h #define GnomeHackMapWindow_h #include #include #include "config.h" #include "global.h" GtkWidget *ghack_init_map_window(void); void ghack_reinit_map_window(void); #endif /* GnomeHackMapWindow_h */ slashem-0.0.7E7F3/win/gnome/gnbind.h0000664000076400007640000000602010545462317015166 0ustar aliali/* SCCS Id: @(#)gnbind.h 3.4 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ #ifndef GnomeHackBind_h #define GnomeHackBind_h /* * This header files defines the interface between the window port specific * code in the Gnome port and the rest of the nethack game engine. */ #include #include #include "gnomeprv.h" #include "gnmain.h" #include "gnmap.h" #include "gnmenu.h" #include "gnplayer.h" #include "gnsignal.h" #include "gnstatus.h" #include "gntext.h" #include "gnmesg.h" #include "gnyesno.h" #include "gnglyph.h" #include "gnworn.h" /* Create an array to keep track of the various windows */ #ifndef MAXWINDOWS #define MAXWINDOWS 15 #endif typedef struct gnome_nhwindow_data { GtkWidget* win; int type; } GNHWinData; /* Some prototypes */ void gnome_init_nhwindows(int* argc, char** argv); void gnome_player_selection(void); void gnome_askname(void); void gnome_get_nh_event(void); void gnome_exit_nhwindows(const char *); void gnome_suspend_nhwindows(const char *); void gnome_resume_nhwindows(void); winid gnome_create_nhwindow(int type); void gnome_create_nhwindow_by_id(int type, winid i); void gnome_clear_nhwindow(winid wid); void gnome_display_nhwindow(winid wid, BOOLEAN_P block); void gnome_destroy_nhwindow(winid wid); void gnome_curs(winid wid, int x, int y); void gnome_putstr(winid wid, int attr, const char *text); #ifdef FILE_AREAS void gnome_display_file(const char *filearea,const char *filename, BOOLEAN_P must_exist); #else void gnome_display_file(const char *filename,BOOLEAN_P must_exist); #endif void gnome_start_menu(winid wid); void gnome_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 gnome_end_menu(winid wid, const char *prompt); int gnome_select_menu(winid wid, int how, MENU_ITEM_P **selected); /* No need for message_menu -- we'll use genl_message_menu instead */ void gnome_update_inventory(void); void gnome_mark_synch(void); void gnome_wait_synch(void); void gnome_cliparound(int x, int y); /* The following function does the right thing. The nethack * gnome_cliparound (which lacks the winid) simply calls this funtion. */ void gnome_cliparound_proper(winid wid, int x, int y); void gnome_print_glyph(winid wid,XCHAR_P x,XCHAR_P y,int glyph); void gnome_raw_print(const char *str); void gnome_raw_print_bold(const char *str); int gnome_nhgetch(void); int gnome_nh_poskey(int *x, int *y, int *mod); void gnome_nhbell(void); int gnome_doprev_message(void); char gnome_yn_function(const char *question, const char *choices, CHAR_P def); void gnome_getlin(const char *question, char *input); int gnome_get_ext_cmd(void); void gnome_number_pad(int state); void gnome_delay_output(void); void gnome_start_screen(void); void gnome_end_screen(void); void gnome_outrip(winid wid, int how); void gnome_delete_nhwindow_by_reference( GtkWidget *menuWin); #endif /* GnomeHackBind_h */ slashem-0.0.7E7F3/win/gnome/gnglyph.h0000664000076400007640000000242110545462317015376 0ustar aliali/* SCCS Id: @(#)gnglyph.h 3.4 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ #ifndef GnomeHackGlyph_h #define GnomeHackGlyph_h #include "config.h" #include "global.h" /* the prototypes in system headers contain useless argument names that trigger spurious warnings if gcc's `-Wshadow' option is used */ #undef index #define index _hide_index_ #define time _hide_time_ #include #include #undef index #define index strchr #undef time extern short glyph2tile[]; /* From tile.c */ typedef struct { GdkImlibImage* im; int count; int width; int height; } GHackGlyphs; extern int ghack_init_glyphs( const char *); extern void ghack_free_glyphs( void); extern void ghack_dispose_glyphs( void); extern int ghack_glyph_count( void); extern GdkImlibImage* ghack_image_from_glyph( int, gboolean); extern int ghack_glyph_height( void); extern int ghack_glyph_width( void); #if defined(FILE_AREAS) #define TILESETDIR FILE_AREA_SHARE #elif defined(HACKDIR) #define TILESETDIR HACKDIR #else # error HACKDIR is not defined! #endif #endif /* GnomeHackGlyph_h */ slashem-0.0.7E7F3/win/gnome/README0000664000076400007640000000331310545462317014436 0ustar alialiThis directory contains the windowing code written for GnomeHack. The NetHack devteam is in the process of making it part of the normal distribution. It should be noted that this is still work in progress and that there are still problems with this code. So use at your own risk. Of course any contributions, especially bug fixes, are more than welcome! These files are based on the files from GnomeHack 1.0.5 by Erik Andersen. Some files have been renamed to fit into 8.3 name constraints (yuk!). These are: GnomeHack.h gnomeprv.h GnomeHackAskStringDialog.c gnaskstr.c GnomeHackAskStringDialog.h gnaskstr.h GnomeHackBind.c gnbind.c GnomeHackBind.h gnbind.h GnomeHackGlyph.c gnglyph.c GnomeHackGlyph.h gnglyph.h GnomeHackMainWindow.c gnmain.c GnomeHackMainWindow.h gnmain.h GnomeHackMapWindow.c gnmap.c GnomeHackMapWindow.h gnmap.h GnomeHackMenuWindow.c gnmenu.c GnomeHackMenuWindow.h gnmenu.h GnomeHackMessageWindow.c gnmesg.c GnomeHackMessageWindow.h gnmesg.h GnomeHackPlayerSelDialog.c gnplayer.c GnomeHackPlayerSelDialog.h gnplayer.h GnomeHackSettings.c gnopts.c GnomeHackSettings.h gnopts.h GnomeHackSignals.c gnsignal.c GnomeHackSignals.h gnsignal.h GnomeHackStatusWindow.c gnstatus.c GnomeHackStatusWindow.h gnstatus.h GnomeHackTextWindow.c gntext.c GnomeHackTextWindow.h gntext.h GnomeHackYesNoDialog.c gnyesno.c GnomeHackYesNoDialog.h gnyesno.h Other files have been removed because we don't or can't use them (yet). Makefile.am Makefile.in gnomehack.desktop gnomehack.desktop.in NetHack currently doesn't use autoconf, so the setup for that has not made the translation. Note: All loss in style, elegance, and readability is entirely our fault and not Erik's. slashem-0.0.7E7F3/win/gnome/gntext.h0000664000076400007640000000140510545462317015240 0ustar aliali/* SCCS Id: @(#)gntext.h 3.4 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ #ifndef GnomeHackTextWindow_h #define GnomeHackTextWindow_h #include #include "config.h" #include "global.h" GtkWidget* ghack_init_text_window ( ); void ghack_text_window_clear(GtkWidget *widget, gpointer data); void ghack_text_window_destroy(); void ghack_text_window_display(GtkWidget *widget, boolean block, gpointer data); void ghack_text_window_put_string(GtkWidget *widget, int attr, const char* text, gpointer data); void ghack_text_window_rip_string( const char* ripString); #endif /* GnomeHackTextWindow_h */ slashem-0.0.7E7F3/win/gnome/gnbind.c0000664000076400007640000011257510545462317015176 0ustar aliali/* SCCS Id: @(#)gnbind.c 3.4 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ /* * This file implements the interface between the window port specific * code in the Gnome port and the rest of the nethack game engine. */ #include "gnbind.h" #include "gnmain.h" #include "gnmenu.h" #include "gnaskstr.h" #include "gnyesno.h" GNHWinData gnome_windowlist[MAXWINDOWS]; winid WIN_WORN = WIN_ERR; #ifdef TTY_GRAPHICS extern void tty_raw_print(const char *); extern void tty_raw_print_bold(const char *); #endif /* Interface definition, for windows.c */ struct window_procs Gnome_procs = { "Gnome", WC_COLOR|WC_HILITE_PET|WC_INVERSE, 0L, gnome_init_nhwindows, gnome_player_selection, gnome_askname, gnome_get_nh_event, gnome_exit_nhwindows, gnome_suspend_nhwindows, gnome_resume_nhwindows, gnome_create_nhwindow, gnome_clear_nhwindow, gnome_display_nhwindow, gnome_destroy_nhwindow, gnome_curs, gnome_putstr, gnome_display_file, gnome_start_menu, gnome_add_menu, gnome_end_menu, gnome_select_menu, genl_message_menu, /* no need for X-specific handling */ gnome_update_inventory, gnome_mark_synch, gnome_wait_synch, #ifdef CLIPPING gnome_cliparound, #endif #ifdef POSITIONBAR donull, #endif gnome_print_glyph, gnome_raw_print, gnome_raw_print_bold, gnome_nhgetch, gnome_nh_poskey, gnome_nhbell, gnome_doprev_message, gnome_yn_function, gnome_getlin, gnome_get_ext_cmd, gnome_number_pad, gnome_delay_output, #ifdef CHANGE_COLOR /* only a Mac option currently */ donull, donull, #endif /* other defs that really should go away (they're tty specific) */ gnome_start_screen, gnome_end_screen, gnome_outrip, genl_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 gnome_init_nhwindows(int* argc, char** argv) { int i; char *path; /* Main window */ ghack_init_main_window( *argc, argv); ghack_init_signals( ); for(i = 0; i < no_tilesets; i++) if (!strcmp(tileset, tilesets[i].name)) break; if ((tilesets[i].flags & ~TILESET_TRANSPARENT) != 0) { g_warning("Can't use tile set \"%s\"; unsupported flag set\n", tileset); i = no_tilesets; /* Use a default tile set */ } if (i == no_tilesets) { for(i = 0; i < no_tilesets; i++) if ((tilesets[i].flags & ~TILESET_TRANSPARENT) == 0) break; if (i == no_tilesets) g_error("ERROR: No valid tiles found\n"); } path = (char *)alloc(strlen(TILESETDIR) + strlen(tilesets[i].file) + 2); sprintf(path, TILESETDIR "/%s", tilesets[i].file); if (ghack_init_glyphs(path)) g_error ("ERROR: Could not initialize glyphs.\n"); free(path); // gnome/gtk is not reentrant set_option_mod_status("ignintr", DISP_IN_GAME); flags.ignintr = TRUE; iflags.window_inited = TRUE; /* gnome-specific window creation */ WIN_WORN = gnome_create_nhwindow(NHW_WORN); } /* 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 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; } } } /* Ask the user for a player name. */ void gnome_askname() { int ret; g_message("Asking name...."); /* Ask for a name and stuff the response into plname, a nethack global */ ret = ghack_ask_string_dialog("What is your name?", "gandalf", "GnomeHack", plname); /* Quit if they want to quit... */ if (ret==-1) { gnome_exit_nhwindows(0); } } /* Does window event processing (e.g. exposure events). A noop for the tty and X window-ports. */ void gnome_get_nh_event() { /* We handle our own events. */ return; } /* Exits the window system. This should dismiss all windows, except the "window" used for raw_print(). str is printed if possible. */ void gnome_exit_nhwindows(const char *str) { gtk_exit (0); terminate(EXIT_SUCCESS); } /* Prepare the window to be suspended. */ void gnome_suspend_nhwindows(const char *str) { /* I don't think we need to do anything here... */ return; } /* Restore the windows after being suspended. */ void gnome_resume_nhwindows() { /* Do Nothing. Un-necessary since the GUI will refresh itself. */ 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 gnome_create_nhwindow(int type) { winid i = 0; /* Return the next available winid */ for (i=0; i= 0) && (wid < MAXWINDOWS) && (gnome_windowlist[wid].win != NULL)) { gtk_signal_emit( GTK_OBJECT (gnome_windowlist[wid].win), ghack_signals[GHSIG_PUTSTR], (guint) attr, text); } } /* Display the file named str. Complain about missing files iff complain is TRUE. */ #ifdef FILE_AREAS void gnome_display_file(const char *filearea,const char *filename, BOOLEAN_P must_exist) #else void gnome_display_file(const char *filename,BOOLEAN_P must_exist) #endif { /* Strange -- for some reason it makes us create a new text window * instead of reusing any existing ones -- perhaps we can work out * some way to reuse stuff -- but for now just make and destroy new * ones each time */ dlb *f; #ifdef FILE_AREAS f = dlb_fopen_area(filearea, filename, "r"); #else f = dlb_fopen(filename, "r"); #endif if (!f) { if (must_exist) { GtkWidget *box; char message[90]; sprintf(message, "Warning! Could not find file: %s\n",filename); box = gnome_message_box_new (_(message), GNOME_MESSAGE_BOX_ERROR, GNOME_STOCK_BUTTON_OK, NULL); gnome_dialog_set_default( GNOME_DIALOG(box), 0); gnome_dialog_set_parent (GNOME_DIALOG (box), GTK_WINDOW (ghack_get_main_window ()) ); gtk_window_set_modal( GTK_WINDOW(box), TRUE); gtk_widget_show (box); } } else { GtkWidget *txtwin, *gless, *frametxt; #define LLEN 128 char line[LLEN], *textlines; int num_lines, charcount; txtwin = gnome_dialog_new("Text Window", GNOME_STOCK_BUTTON_OK, NULL); gtk_widget_set_usize(GTK_WIDGET(txtwin), 500, 400); gtk_window_set_policy(GTK_WINDOW(txtwin), TRUE, TRUE, FALSE); gtk_window_set_title(GTK_WINDOW(txtwin), "Text Window"); gnome_dialog_set_default( GNOME_DIALOG(txtwin), 0); gtk_window_set_modal( GTK_WINDOW(txtwin), TRUE); frametxt = gtk_frame_new (""); gtk_widget_show (frametxt); /* * Count the number of lines and characters in the file. */ num_lines = 0; charcount = 1; while (dlb_fgets(line, LLEN, f)) { num_lines++; charcount += strlen(line); } (void) dlb_fclose(f); /* Ignore empty files */ if (num_lines == 0) return; /* * Re-open the file and read the data into a buffer. */ textlines = (char *) alloc((unsigned int) charcount); textlines[0] = '\0'; #ifdef FILE_AREAS f = dlb_fopen_area(filearea, filename, "r"); #else f = dlb_fopen( filename, RDTMODE); #endif while (dlb_fgets(line, LLEN, f)) { (void) strcat(textlines, line); } (void) dlb_fclose(f); gless = gnome_less_new (); gnome_less_show_string (GNOME_LESS (gless), textlines); gtk_container_add (GTK_CONTAINER (frametxt), gless); gtk_box_pack_start(GTK_BOX (GNOME_DIALOG (txtwin)->vbox), frametxt, TRUE, TRUE, 0); gtk_widget_show_all( txtwin); gtk_window_set_modal( GTK_WINDOW(txtwin), TRUE); gnome_dialog_set_parent (GNOME_DIALOG (txtwin), GTK_WINDOW (ghack_get_main_window ()) ); gnome_dialog_run_and_close (GNOME_DIALOG (txtwin)); free(textlines); } } /* 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 gnome_start_menu(winid wid) { if (wid != -1) { if (gnome_windowlist[wid].win == NULL && gnome_windowlist[wid].type != 0) { gnome_create_nhwindow_by_id(gnome_windowlist[wid].type, wid); } gtk_signal_emit( GTK_OBJECT (gnome_windowlist[wid].win), ghack_signals[GHSIG_START_MENU]); } } /* 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 gnome_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) { GHackMenuItem item; item.glyph = glyph; item.identifier = identifier; item.accelerator = accelerator; item.group_accel = group_accel; item.attr = attr; item.str = str; item.presel = presel; if (wid != -1 && gnome_windowlist[wid].win != NULL) { gtk_signal_emit( GTK_OBJECT (gnome_windowlist[wid].win), ghack_signals[GHSIG_ADD_MENU], &item); } } /* 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 gnome_end_menu(winid wid, const char *prompt) { if (wid != -1 && gnome_windowlist[wid].win != NULL) { gtk_signal_emit( GTK_OBJECT (gnome_windowlist[wid].win), ghack_signals[GHSIG_END_MENU], prompt); } } /* 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 gnome_select_menu(winid wid, int how, MENU_ITEM_P **selected) { int nReturned = -1; if (wid != -1 && gnome_windowlist[wid].win != NULL && gnome_windowlist[wid].type == NHW_MENU) { nReturned=ghack_menu_window_select_menu (gnome_windowlist[wid].win, selected, how); } 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 gnome_update_inventory() { ghack_main_window_update_inventory(); } /* 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 gnome_mark_synch() { /* Do nothing */ } /* 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 gnome_wait_synch() { /* Do nothing */ } /* 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 gnome_cliparound(int x, int y) { /* FIXME!!! winid should be a parameter!!! * Call a function that Does The Right Thing(tm). */ gnome_cliparound_proper(WIN_MAP,x,y); } void gnome_cliparound_proper(winid wid, int x, int y) { if (wid != -1 && gnome_windowlist[wid].win != NULL) { gtk_signal_emit( GTK_OBJECT (gnome_windowlist[wid].win), ghack_signals[GHSIG_CLIPAROUND], (guint) x, (guint) y); } } /* 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 gnome_print_glyph(winid wid,XCHAR_P x,XCHAR_P y,int glyph) { if (wid != -1 && gnome_windowlist[wid].win != NULL) { GdkImlibImage *im; im = ghack_image_from_glyph( glyph, FALSE); gtk_signal_emit (GTK_OBJECT (gnome_windowlist[wid].win), ghack_signals[GHSIG_PRINT_GLYPH], (guint) x, (guint) y, im, NULL); } } /* 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 gnome_raw_print(const char *str) { #ifdef TTY_GRAPHICS tty_raw_print(str); #else puts(str); (void) fflush(stdout); #endif } /* raw_print_bold(str) -- Like raw_print(), but prints in bold/standout (if possible). */ void gnome_raw_print_bold(const char *str) { #ifdef TTY_GRAPHICS tty_raw_print_bold(str); #else puts(str); (void) fflush(stdout); #endif } /* 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 gnome_nhgetch() { int key; GList *theFirst; gtk_signal_emit (GTK_OBJECT (gnome_windowlist[WIN_STATUS].win), ghack_signals[GHSIG_FADE_HIGHLIGHT]); g_askingQuestion = 1; /* Process events until a key press event arrives. */ while ( g_numKeys == 0 ) gtk_main_iteration(); theFirst = g_list_first( g_keyBuffer); g_keyBuffer = g_list_remove_link(g_keyBuffer, theFirst); key = GPOINTER_TO_INT( theFirst->data); g_list_free_1( theFirst); g_numKeys--; g_askingQuestion = 0; 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 gnome_nh_poskey(int *x, int *y, int *mod) { gtk_signal_emit (GTK_OBJECT (gnome_windowlist[WIN_STATUS].win), ghack_signals[GHSIG_FADE_HIGHLIGHT]); g_askingQuestion = 0; /* Process events until a key or map-click arrives. */ while ( g_numKeys == 0 && g_numClicks == 0 ) gtk_main_iteration(); if (g_numKeys > 0) { int key; GList *theFirst; theFirst = g_list_first( g_keyBuffer); g_keyBuffer = g_list_remove_link(g_keyBuffer, theFirst); key = GPOINTER_TO_INT( theFirst->data); g_list_free_1( theFirst); g_numKeys--; return ( key); } else { GHClick *click; GList *theFirst; theFirst = g_list_first( g_clickBuffer); g_clickBuffer = g_list_remove_link(g_clickBuffer, theFirst); click = (GHClick*) theFirst->data; *x=click->x; *y=click->y; *mod=click->mod; g_free( click); g_list_free_1( theFirst); g_numClicks--; return ( 0); } } /* nhbell() -- Beep at user. [This will exist at least until sounds are redone, since sounds aren't attributable to windows anyway.] */ void gnome_nhbell() { /* FIXME!!! Play a cool GNOME sound instead */ gdk_beep(); } /* doprev_message() -- Display previous messages. Used by the ^P command. -- On the tty-port this scrolls WIN_MESSAGE back one line. */ int gnome_doprev_message() { /* Do Nothing. They can read old messages using the scrollbar. */ 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 gnome_yn_function(const char *question, const char *choices, CHAR_P def) { int ch; int result=-1; char message[BUFSZ]; char yn_esc_map='\033'; GtkWidget *mainWnd = ghack_get_main_window(); 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); } gnome_putstr(WIN_MESSAGE, ATR_BOLD, message); if (mainWnd != NULL && choices && !index(choices,ch)) { return(ghack_yes_no_dialog( question, choices, def)); } /* Only here if main window is not present */ while (result<0) { ch=gnome_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 { gnome_nhbell(); /* and try again... */ } } else { result=ch; } } 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 gnome_getlin(const char *question, char *input) { int ret; ret = ghack_ask_string_dialog(question, "", "nethack", input); if (ret == -1) input[0] = 0; } /* 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 gnome_get_ext_cmd() { return ghack_menu_ext_cmd(); } /* number_pad(state) -- Initialize the number pad to the given state. */ void gnome_number_pad(int state) { /* Do Nothing */ } /* 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 gnome_delay_output() { if (gnome_windowlist[WIN_MESSAGE].win != NULL) { gtk_signal_emit( GTK_OBJECT (gnome_windowlist[WIN_MESSAGE].win), ghack_signals[GHSIG_DELAY], (guint) 50); } } /* start_screen() -- Only used on Unix tty ports, but must be declared for completeness. Sets up the tty to work in full-screen graphics mode. Look at win/tty/termcap.c for an example. If your window-port does not need this function just declare an empty function. */ void gnome_start_screen() { /* Do Nothing */ } /* end_screen() -- Only used on Unix tty ports, but must be declared for completeness. The complement of start_screen(). */ void gnome_end_screen() { /* Do Nothing */ } /* outrip(winid, int) -- The tombstone code. If you want the traditional code use genl_outrip for the value and check the #if in rip.c. */ void gnome_outrip(winid wid, int how) { /* Follows roughly the same algorithm as genl_outrip() */ char buf[BUFSZ]; char ripString[BUFSZ]="\0"; extern const char *killed_by_prefix[]; /* Put name on stone */ Sprintf(buf, "%s\n", plname); 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 */ 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 */ Strcat(ripString, buf); Strcat(ripString, "\n"); /* Put year on stone */ Sprintf(buf, "%4d\n", getyear()); Strcat(ripString, buf); ghack_text_window_rip_string( ripString); } slashem-0.0.7E7F3/win/gnome/mapbg.xpm0000664000076400007640000005462510545462317015406 0ustar aliali/* XPM */ static char * mapbg_xpm[] = { "96 96 254 2", " c None", ". c #BC6C33", "+ c #AC6324", "@ c #B46B2B", "# c #B47734", "$ c #AC6B2C", "% c #B46C3D", "& c #BC7945", "* c #A4774B", "= c #B48643", "- c #AC7F40", "; c #AC773A", "> c #C49054", ", c #C48044", "' c #B4642C", ") c #B45E21", "! c #BC642B", "~ c #BD723E", "{ c #C4884E", "] c #C48F4B", "^ c #C49753", "/ c #CC9052", "( c #CC7234", "_ c #B4804F", ": c #C4985D", "< c #946232", "[ c #AC6431", "} c #C46637", "| c #945222", "1 c #8C5435", "2 c #844C29", "3 c #945836", "4 c #AC653D", "5 c #A45E2B", "6 c #AC5E2A", "7 c #A44D21", "8 c #A45823", "9 c #A4592C", "0 c #B46C34", "a c #B46536", "b c #AC7240", "c c #AC7231", "d c #944C1B", "e c #8C5223", "f c #945722", "g c #AC6B34", "h c #944C24", "i c #9C5222", "j c #B47234", "k c #C4783B", "l c #BC7833", "m c #BC7F3B", "n c #BC8044", "o c #BC783C", "p c #A46332", "q c #9C6331", "r c #B4773C", "s c #B4723D", "t c #A46B33", "u c #B48043", "v c #CC814C", "w c #B46422", "x c #C47946", "y c #C48743", "z c #BC6D3D", "A c #BC6536", "B c #94522E", "C c #A4643E", "D c #B45E2F", "E c #A45223", "F c #9C4C1B", "G c #B47845", "H c #C4804D", "I c #9C5723", "J c #AC5E35", "K c #A45935", "L c #9B5E29", "M c #BE7234", "N c #BC8744", "O c #AC5924", "P c #A45E35", "Q c #9C582C", "R c #AC501F", "S c #9C5935", "T c #8C4D28", "U c #643D21", "V c #845437", "W c #B47E31", "X c #844126", "Y c #B45823", "Z c #954627", "` c #9C4C24", " . c #7C4124", ".. c #B4592D", "+. c #9C5E37", "@. c #945644", "#. c #AC6C3E", "$. c #8C4627", "%. c #9C643E", "&. c #744021", "*. c #A4723C", "=. c #844628", "-. c #743819", ";. c #844019", ">. c #944D2D", ",. c #A4512C", "'. c #B45227", "). c #C4622A", "!. c #9C522E", "~. c #7C3A1A", "{. c #BC5E24", "]. c #CC8243", "^. c #9C664C", "/. c #AC5934", "(. c #9C4E2E", "_. c #7C4B29", ":. c #8C532C", "<. c #A46423", "[. c #7C422C", "}. c #743214", "|. c #AC592C", "1. c #8C4224", "2. c #C47F3C", "3. c #8C421C", "4. c #8C410F", "5. c #8C5D3E", "6. c #8C5B32", "7. c #88461A", "8. c #663626", "9. c #AC6B4C", "0. c #94411A", "a. c #845C30", "b. c #744B20", "c. c #7C4D34", "d. c #CC874A", "e. c #D49053", "f. c #C46C32", "g. c #BC814D", "h. c #CC7842", "i. c #A45A44", "j. c #8C4B1A", "k. c #843204", "l. c #945E37", "m. c #7C564C", "n. c #74422C", "o. c #95461B", "p. c #AC7747", "q. c #745634", "r. c #94572C", "s. c #7C4621", "t. c #CC7A54", "u. c #B47654", "v. c #BC5E2C", "w. c #B49056", "x. c #C4915C", "y. c #B4874E", "z. c #BC884D", "A. c #A46C45", "B. c #D48749", "C. c #BC5A30", "D. c #CCA06C", "E. c #BCA26C", "F. c #BC8F54", "G. c #BC895C", "H. c #BC8F4C", "I. c #BC995E", "J. c #C46D3D", "K. c #D4985A", "L. c #C4562C", "M. c #843A16", "N. c #C49F63", "O. c #BC9652", "P. c #B48F4C", "Q. c #CC915C", "R. c #BC5824", "S. c #B49A60", "T. c #CC9F60", "U. c #DC995F", "V. c #AC8A54", "W. c #B4875F", "X. c #C4885C", "Y. c #BC905E", "Z. c #CC975B", "`. c #D4A167", " + c #7C5334", ".+ c #9C6B39", "++ c #845323", "@+ c #B46D4C", "#+ c #A46B3C", "$+ c #CC9864", "%+ c #8C4E34", "&+ c #743A24", "*+ c #6C3D2E", "=+ c #C45E30", "-+ c #AC7E52", ";+ c #9C6C47", ">+ c #6C3C1B", ",+ c #CC8954", "'+ c #542810", ")+ c #7C5E3C", "!+ c #84532C", "~+ c #946C45", "{+ c #946340", "]+ c #BCA870", "^+ c #B49E5C", "/+ c #C47E5C", "(+ c #AC8E44", "_+ c #8C633A", ":+ c #C4A86C", "<+ c #CCA76E", "[+ c #CCA961", "}+ c #7A462D", "|+ c #8C6644", "1+ c #744623", "2+ c #A47248", "3+ c #94624C", "4+ c #845E3C", "5+ c #7C5329", "6+ c #9C7249", "7+ c #844D34", "8+ c #6C4C30", "9+ c #A46E54", "0+ c #A4624C", "a+ c #6C3E24", "b+ c #5C3224", "c+ c #D4A66C", "d+ c #744B30", "e+ c #BC926C", "f+ c #AC7954", "g+ c #AC522C", "h+ c #6C4526", "i+ c #A47A54", "j+ c #BC6644", "k+ c #BC6E4C", "l+ c #A48650", "m+ c #AC825C", "n+ c #CC6A34", "o+ c #9C7E5C", "p+ c #7C623C", "q+ c #5C3A2C", "r+ c #644A34", "s+ c #4C3624", "t+ c #844B1B", "u+ c #7C4018", "v+ c #D49A68", "w+ c #7C4B1C", "x+ c #742E04", "y+ c #CC8157", "z+ c #745A44", "A+ c #B46644", "B+ c #643614", "C+ c #C4A65C", "D+ c #843A04", "E+ c #6C2E14", ". + @ # @ $ % & * = - ; > , ' . ) ! ~ { ] ^ ] / ( ' , _ : < [ } [ | 1 2 3 4 5 ! 6 7 8 ' 8 9 0 a b c d | [ 0 % e 8 f 5 ~ g h i % & % 5 a ' 8 ' a < j k l m { n o . ! 6 . 0 % p p q g r s 0 @ 0 . ", "j + $ # @ t g s u > u c { v @ ! w ' ~ x y y m u . ) z r > f 5 A [ B 3 2 B C 6 @ D E E 8 F i 6 0 g G 0 o H , j d I I [ & % i f [ . @ . 6 J K 2 3 L $ . M o N # j D ' O % [ 0 p P L g & l 0 0 . % ", "4 Q 5 % j $ @ g u / G t M k ' R 9 9 J A . M p 3 . O ! M { L 3 4 [ Q S T B Q 6 ' 6 6 J a a 9 9 a c & 0 ~ ~ z 0 L 5 8 5 [ [ d 8 & M . x i B 3 U V 3 4 . l & N m W 6 6 8 % [ g 8 5 q % & o j [ [ 0 ", "3 X h [ 0 0 0 0 ~ n j p 0 z Y 7 T Z ` Y ! ' Q .a ..! . , t +.@.#.[ C S S 9 [ . D a J a z J 8 % , o + 8 8 [ @ ' J 9 Q 6 5 5 [ x P [ 4 $.1 %.&.V S p ~ o b *.; c 9 6 5 % [ [ 5 p p b & o 0 $ [ 6 ", "=.-.;.9 a . j j . 0 [ @ z . Y O >.h ,.'.).! !.~.P D {.! ].& ^.T & & s % 4 [ A . 4 /.` Z (.d Q , H #.8 E 8 [ [ [ a 9 /.% z 0 . ~ _.1 :.T S C S | < <.M 0 | 2 T >.Q Q | [ 5 [ p 0 0 % # s j % 5 !.", "[.}.~.!.' 0 @ @ . 6 O 0 ~ a D Y P K |.... . K 1.8 D {.! 2.y b Q o x % % a 6 . A ,.` 3.1.1.4.i ~ & 5 i d 8 J 9 [ A J |.D a D a a 5.3 .;.h 8 a I 6.f $ g 7.}.1.$.T T T +.Q 0 g 0 % % 0 0 0 % 5 h ", "_.8.;.E 6 ' ' @ ' O 8 ' @ . a ..+ D 9 9 0 o ~ p 6 ' ! . , n 0 . 0 o [ A a |.a 6 ` 3.Z (.>.$.I 0 #.e h d !.J I C a D E F F 7 |.D 9.>.>.Z 0.9 a 8 a.b.Q [ =.;.!.K 2 T 7.S 5 #.[ 0 g [ g g % g J Q ", "c.-.;.8 D ) @ w . ' w [ a ~ ~ Y O O 9 S c d.e.d.f.A . H g.# @ h.$ ~ [ % z |.. 6 /.Z ` i.Z d [ o %.j.S P 4 % Q p E 8 O 7 F Z E /.O k.a a 9 & #.l.m.n.B C j.T 5 ) :.:.2 q p % [ [ [ [ [ [ [ 4 p Q ", "o.F i I 9 [ 0 0 ' 6 8 6 # n o 0 @ ) L W d.].0 [ + @ M k m ; $ @ $ 0 j 0 0 0 0 a c g G p.q f p s ' 0 d !.Q h & M Y '.7 E 7 7 7 R [ @ ) |.[ 4 3 b.q.b.2 L % g P r.j.I 6 a a 6 + [ [ p [ [ g & & I ", "I d d E 0 ~ 0 6 ' O E 8 j n m . ( j # N 2.@ O !.@ @ ! M r # # M # m n , & r % s m r & o p I [ [ $ @ 7.Q P Q o j f.. O 8 F 7 O ..6 ' ' ..a a q 2 _.s.;.j.F o.o.j.I 5 p O 8 O @ M [ 0 0 g 0 o ~ L ", "[ 9 F 9 z t.. O ' ) O w r n , ~ A % u.n o w |.|.a ' D ' o o n ~ j l , N n r G _ u 0 #.a |.[ 0 # n r | 9 P 8 0 [ l o o % g [ D 6 7 O ..Y a A 4 p C #.s ' O 6 D a g % 0 a [ 6 [ 0 @ , k o o n o c ", "[ [ [ ' a . a |.8 O Y 0 o ~ . v./.r.S #.z . D D 5 6 ..! s & o ~ # o m r u _ w.x.y.p.[ J 6 % y z.] n p g a 6 @ [ # m y { m ~ @ @ 9 |.D ' A ~ % [ A.G x ~ ' ! 0 z 0 0 0 % . 0 [ [ [ o o $ M # 0 o ", "g s ~ 0 0 a ' ' O ' ~ B.{ o ' C./.$.;.B ' A R ` Z ,...A . o & ~ y m N N ] : : D.E.F.G.g.G _ H.I.y N s % 0 a z M r u m & o o m m & & ~ ~ l j 0 <.t s G j $ 0 # j % [ 8 [ 0 % . ~ @ o o 0 r j # y ", "o o l s o & , x 0 J.B.e.K., . L.a >.M.d 6 ! E 3.M.o...! . & n r 2.y n { > : : F.I.I.N.: y.F.O.P.n o a ' D 6 ' 0 $ c % o & o o m & G # j # r c [ q p L I I L <.p . ' [ 0 o % 0 % o k o o o o o , ", "k n o o & { / Q., l ~ , { m ! R.D !.h 6 . . ) P 7.i ..w M m { n m n N z.z.z.y.= y.z.I.S.w.I.x.g.o ' 6 Y R O 8 [ [ a [ a z o r # s j j j @ 0 . 0 ~ . 0 0 0 0 0 o ! . o H o [ [ a g 6 [ s 0 g g g ", "@ o o r c u > T.U.H # n ] n J.).D 6 0 k ( M ~ & +.[ D w l y / g.{ { { { N z.] > y z.w.w.V.W.X.& ~ 6 Y R Y ! ' 0 ~ a E 7 9 0 m n o k k k . ' D } D D A z z ' [ A 6 ' 0 0 p L [ x a I [ & & & s g ", "I E D ! 0 s z.F.T.H.o o h.d., c j m / Y.Z.`.n t ' ' $ , y y N m m y y ] { z.n N n { ; > H.r / z.~ p E O D 6 ' . @ 5 i d F 5 g r [ j o 0 g % 0 [ ' 6 5 p I 4.4.o.o.d e U +c.6..+[ i j d.# m { p ", "0 5 i O a g.Q.F.T.^ N o & ].n @ # m { b p.Q.N c ! a M , / { m m W m N z.z.n N y n { ; z.] u ] r 0 + 8 ..a D w @ @ ' 8 d T r.g r @ 0 g [ <.[ [ p 5 5 [ p Q Q 5 z 6 p :.b.V _.l.p s 5 0 m @ # { G ", "H ~ [ a & H g._ > Z.: ] z.] , o . o ~ f Q H H j . . x y d., 2.o y N z.z.z.N n & { { ; z.> u { s 0 a D 6 v.a ' w Y O >. .&.2 q $ g 0 [ 5 5 [ [ [ 0 [ | 7.>.Q 9 h !.P ++2 5.=.4 @ C | Q P Q 5 0 k ", "H , s % @+#.#+#+#.z.$+N.: Z.H k 0 a a E 9 & x ~ z k x , , l M k y ] > ^ > G.n m { N u ] ^ { y s k . a |.6 ! ' + {.|.%+&+*+V p l [ $ @ [ $ 0 0 p % S 7.$.B C Q T ;.3 T 2 @.%+a @ +.T $.>.K 9 [ k ", "n & q B +.+.S p :.#+y.Y.w.H.{ , J.a a /.a z a o x k , o ~ . . f.# n ] : Z.: > { o n u > ^ { n o ~ J.a 9 6 0 . @ =+O T 8.8.1 [ 0 $ 0 s j % % g 0 +.Q S !.B h h f ~.4 t %.3 3 4 6 r.T X $.i.J a k ", "~ % B e ^.%.e T 3 q * -+_ u H / x a a a A 0 [ & , { , n l M f.. . o z.> : : ] H o n N F.z.n o J.~ a [ [ 0 % M M w |.Z }.-.T L O j ~ o 0 $ [ [ % p 5 9 K i j.j.| 4.% G p 1 S B r.| T X Z K a [ . ", "' % +.l.* ;+2 2 ;+%.q s b b u x.x % 0 . 0 M j n N z.y n o o f.! ).. & z.F.> z.n n n z.H.z.n 0 . a [ [ b & r g j @ 0 [ >.` K a ' 0 r o % [ 5 5 g $ p 8 9 a ~ o # D @ o #+T @.>+1 K 5 5 [ % ~ z J ", "E a +.1 ;+;+6.A.* %.+.@+% p #+= #.g 0 0 M , r y u N N n o k . {.R.v.0 u G.F.{ z.,+y > H.H.G ' ' @ [ g n z.# $ <.<.0 a |.E a A 0 <.0 x o g L 8 [ <.% 0 8 8 @ k m B.M o g V 1 '+)+h Q @ j M 0 J o.", "_..+^.!+6.l.l.l.~+;+6.V {+:.:.A.r.e q G F.N.]+]+^+I.^ K.d.' 6 z @ M % a /+{ y.H.(+T.^ u ,+2.a ' [ <.t y.x.y.b t L $ @ ' [ 0 # g j j r % [ I p g [ 0 O Y ) w 2.y l j $ @ 5 I P i I <.0 0 0 0 5 e ", ":.%.< :.1 {+l.3 ~+;+_+6.l.!+s.5.3 T q g.> > :+<+:+: H.y ].. ) A + ' 6 9 [ G z.> P.[+^ N { d.0 . . @ s g.z.n 0 @ j o o 0 @ M r # $ j o #.[ <.g #.j . 6 . . 0 , y j l k , g 8 p 5 [ g a z % a 5 i ", "A.%.%.+.l.C #+%.{+~+{+{+5.}+n.}+3 6.#.H { z.> T.<+Z.n o , ~ ! a w ' D 9 !.[ n ] O.<+N.= ] y o l M . o o & s 0 . n n o 0 $ j r # $ j s 0 #.s s # g [ 9 0 z 5 g #+2.o , ,+d.H & 0 s % a a a [ J 5 ", "b S %.C +.^.9.A.5.{+~+^.|+1+*+n.c.1 #.H x o H ,+> { n s x k . . . ! A A O a v y I.[+N.N H.y m 2.h.l l & o r ~ o & m r g g s o G j g b G G r r & r #.[ % 4 | S q o 5 <.~ , d.o $ z a 6 a a /.4 a ", "#.3 +.%.r.+.2+b 5.5.3+;+5.c.n.n.8.T #.~ 0 z x & % & & o x M . z ! D A A D o d.d.: T.: H.z.] y ] 2.m n n z.N N n m G r # r r m r n g c g.{ G j o H r [ #.9 7.e q [ | [ $ g o o o % a [ J [ [ a a ", "C p %.C {+l.;+;+{+4+3+;+l.%+2 .2 Q @+z J 6 K Q [ M & & , s 0 l ~ ' a ' ' o , n F.F.> H.m N N m N N u y.z.H.z.N n n n n z.n G o , s r G.F.r # & o & [ g L j.Q p o 5 0 [ 0 , o x M . s g % % % a ", "C A.#+A.A.;+5.1 ~+5.{+;+^.S +.Q #.g ~ x 6 h $.=.. [ [ r g.o # , , H o 0 j o m N = N { N u u m r N N N n _ u = = & u u _ N _ n r & & n z.z.n o # x x j o o $ o r ].L + [ 0 d.g g 0 n , n u n % p ", "q p.2+A.* ;+5+1+6+a.< A.#+#+~ g v ' . h.a $. .7+. + I #.{ { m / H e.{ k d.y N ] N N ] / n n y m N { { { G G u _ r b r u = u G r ~ g.{ u y.z.n @ 0 0 0 o 2.y ].m , + , o s , 0 & @ , { N , y o 5 ", "k @ j j . H & 6.a.6+a.6+;+s ~ [ 2.j C C !.j.b.8+[ K j.l r H.N.P.= z.K.N Z.; N > r z.H.N ] r t o u u n n u u u V.<.G I p ;.g g u = V.H.u { # o g $ g G z.z.m m , N = = ] # y m # W <.o ~ ; t r t ", ". + $ [ ' ~ & .+l.;+l.2+9+#.~ a n q 1 2 T &.1+q.C [ % { y T.^ I.> z./ o e.r n z.# u N N { u # l u u m r r r p.u s % [ J I 5 r { z.u > u { r r 0 j ~ b g t #.o d.H.y N K.y { o r n g k o g.N { j ", "D 9 + + O ' % b S 0+@.9+C C 4 z A.}+a+b+V &._.7+e p { { { c+F.<+Z.N n $ y 0 ~ % j $ r y n # ~ 0 u m n G r s G n & $ % 5 4 j.t n F.G.] g.{ r n 0 d.n p $.X I # 2.y n u y g 0 0 , 2.' . % & { e.. ", "..|.6 a D D a j S @.2 3+1 5.S #.S [.d+U l.T +.B e b X.g.> D.F.N.x.z.r 6 M D ' |.0 [ o , r j ~ $ r n g.& & r r & s p % P % j.<.p.> z.z._ / n n o y & S ~.~.Q j m / H H v 5 I |.x M ' A /.5 s x a ", "C./.9 9 D v.' . %.7+a+c.d+c.2 q !.1 3+2 #+9 % S u.Z.G.y.e+x.z.f+> { & [ . ....... 0 , v % . ~ ' [ b & n & s ~ s t #.& G & b _ g.z._ z.g./ g.{ H m g Q X >.s { y 5 L p , [ a [ x . ! A |.4.Q z {.", "..g+d 0.7 ..' z %.c.U }+h+5+s.l.$.%+3 h ' ' z g G.$+-+_ Y.* f+r._ H & w D O ..D A z ~ o j % 0 a I [ s G r s b s G x.H X.G X.G.z.G.= G.z.x.z.> > z.u #.C b H > N <.| d % % h.~ ~ . } v./.~.d D v.", "..|.d ;.F ..D . C T _.c.[.B $.P }+ .%+K z ' s _ z.i+-+i+_ 2+;+e t r z [ 6 |.|.A 6 a D [ 0 ~ 0 [ E [ s g.G G r u > : z._ p.G.F.P.Y.F.F.F.: y.> Z.Z.> g.n g.> ] > U.,+o , [ ~ a ! f.{...J 3.| D ! ", "v.J.p h /.A A J.i.B B @.=.i.(.j+a.c.@.k+t.~ A.l+F..+e+m+W.f+;+:.P s % ' D a a z ..D 8 I ~ & 0 a /.@+x z.z.= y.z.x.y.p.A.b y.I.N.: Y.N.: : y.F.N.x.F.N y ] ] : T.r n n , 5 5 [ ' M ! /.k+B 4 . n+", "] u 6 R ! A z g.I #.=.%+l.%+J a B T p [ & C k+g.u ; g.e+o+p+ +3 {+q #.[ 6 . o g [ H [ n { > N j D 6 a & { : I.w._ _ !+_.+.9.Y.N.]+S.I.F.Z.u n n u u - H.Z.N # y I l o u j j m l l l + $ K.] u : ", "z.m @ ' f.~ ~ g.& & :.1 @.S % a %.+.C % @+[ u.& u b _ m+~+)+_+^.#+#.% @ [ . & c s d.g.> ] { z.N ~ z s u G.x.O.F.G -+c.&.1 ^.y.I.]+S.N.G.> n n N ] = ; W Z.] u n @ n o m n m , $ l 2.j k e.{ N Z.", "n , j . k o n > { G e T 3 C H a P 0+J % [ [ % & n G _ f+|+4+2+f+p 4 % a ' ~ , s & % { { F.N z.z., n & n z.z.F.y.s 9+b.U c.@._ O.S.I.N.G.H.n { { N ] H.= H.y m y , , s j g j & . j M . M & [ 5 r ", "n o j . o y z.T.,+_ r.:.:.#.,+a 3 K !.4 8 a % x u G u.A._+|+9+#.4 #.z a [ ~ x % G f u u > ^ z.N N u u g.z.z.g.G p 3 8+q+*+V p.] w.I.T.z.G.z.{ { u ] Z.> z.= r #.~ ].r g <.<.~ o ~ x k z A O i a ", "& o j @ , N ] : K.{ p.#+p #.H g Q P Q a 6 ~ ~ H _ g.& _ p.-+p.#+% % @+0 0 % & #.& | G y.Z.> H.y.> z.u u g.g.G b i 2 r+s+8.7+#+r -+F.T.F.> g.{ g.> ] = u y.g.t t++ & & , r g j 0 o ~ z z z J D z ", "0 o o o n & _ G.x.> { _ G g.H & #.s % s z H H & W.u.g.X.G.e+g.A.i.3 p % % 0 ~ z ~ #.g.> > y.u n Z.> u G r r s #.S 2 +}+n.3 C c u z.Z.> > g.{ & > N y.u p.u #.| g ~ r n H & & 0 r b g a a 6 ' a ", "g o x o @+p +.@+= G.> { ,+{ g.{ g.g., o H v H #.6.1 %.u.-+i+2+l.:.u+!+#.s g M x % & G g.g.G ; u { z.{ n s % g 0 S 2 %.l.Q @+r G G u { G.> _ n G N u > > u p.u.g & G ; r u r u s F.= n & 0 . a a ", "g o n % 9 $.>.0+z.> Z.Q.v+,+n ,+z.n n 0 , & u.I 8+&.1 A.* i+;++.5.&.++b r [ @ ~ % /+5 G g.g.n G c r { H & [ [ p 3 2 C t a ].{ u g.G z.z.: r _ & > u G.x.z._ b r.b n z.> N b G r P.- u n o ~ M 0 ", ";.P 9 ~ #.u+7.6.t u F.y.g.o k m . . a ~ I ~ j p ++s.w+;+{+< _ ;+7+l.2 _ 4 s ' M c c # & s g 0 k @ o u u r g 8 |.2 &.t+b P.w.y.r ; { z.H.; z.o s t ; z.: F.z.n ; # m r t #.c r & u H.; y o ~ ~ Q ", "h T x+K & | r.r.% & y.u s s z s a 9 p [ g & n <.l.>+&.b 2+%.p.f+V 1 3 #.% g % o m u n & & % $ [ p 0 r r n g 9 6 +.e Q u F.P.N r n n ; = u { r s ; r y.x.y.N u # u N o c s s G g.] Z.= ] % a J T ", "X S 3.j.9 K 4 Q A s s % % a 4 +.+.e Q r.G & d.g b 7.:.p.G p.b p.6.6.4 [ x % > z.z.{ { { y n o % $ j r u g.r [ a 3 Q 4 & _ y.n % p.n u g.; ; s H , n z.{ z.g.n o o , n s r & G H = F.= H 9 7 (.T ", "~.P S 3.0.i a K J.~ & & u.@+^.l.l.1 3 e #.G { & u.r.C #.p.H G c .+t % J y+u.T.y.G.g.F.] { r & H ~ o G , ,+& [ [ T K % G ; - & g #.#.s g.s #.s ,+y 2.{ H r b & r #.& o s r o & n z.] z.{ 9 /.,.(.", "S 1.M.,.|./.a a a u.n g.@++.c.8+V {+6.l.< G { / G +.p q #.{ r s u m % % x g.Y.l+X.#.#.u n g [ k+o ~ g & { & [ [ S a k+x p.G & 4 #.r.3 #.& & @+s r s & r 5 | Q p 9 #.s s o n G H H.F.z.n E ,.Z Z ", "4 ` ` |.A ~ z J P #.s r t e q+s+c.~+5.q l.g.g.K.{ % t % s b 4 s r , 0 n H : : w./+r.7.+.; #.[ . s [ I [ & G p 4 S 4 k+n G u g.% 3 t+T Q u.#.#.t C p g % | 4.7.T >.C s r n N n z.F.z.z.G 7 ..Z >.", "J a J.D |.J.~ E 4 C #.o z +.d+r+!+;+%.%.p.g.g.Q.K.X.r G s +.Q %.a o b > : T.T.: ~ Q u+=.P @+~ f.s [ i <.& & @+r | !.[ s G u & @+2 s.:.B #.p #+t 3 !.C a S h B :.$.P G n ] z.N F.Z.x.^ { [ } ..a ", "D R D D O a 6 h (.h i ' a 4 5.z+6.%.A..+G.z.g.u z.K.G #.%.r.r.T 6 ~ n Z.N.F.> { . [ >.X T J . f.H g 8 #.y+H g.H 3 i 9 % ; p.b [ 6.s.=.T #.#.#+l.=.X 3 4 [ +.Q 3 $.C g.{ ^ ^ H.F.x.F.: 2.8 v.R [ ", "E a D 8 8 6 5 I 5+5+!+B [ ~ C 5+#+* L u.#.s p #.0 [ #.3 +.1 1 =.p u.r Z./ n G H % 5 B 2 T L 0 ! $ l W m { n s o p.b g G ~ #.P +.l.w+w+f .+G r L 1+s.f K [ 6 9 o a P g & m m g.z.u m { , 0 O D ..", "R |.O E 8 ' [ [ ++!+1 Q ..a [ {+G -+r.#+4 #+p g 8 5 C e 1 2 2 =.q r #.Q.{ r #.z.% p q L +.#.~ . j 2.m 2.{ { n l b p.n H g 5 +.#.b T j.+.% 0 0 @ 2 T S 5 [ 6 I 4 a 6 0 x & r n g.m u m G @ [ a |.", "D D O O D 0 z ~ Q S K /...D % & _ f+f +.p #.p +.| +.C 2 2 2 5.2 p s g e.{ # c H & % #.b t #.4 ` K % m o g.H g.# p.s s % #.p S S K S J 4 x a [ D r.r.q [ % a i 5 a 6 0 o g [ #.#.o # 0 0 0 z . 6 ", "A ..J D J J z ~ J P J a A ! z g.2+A.e P % @+C r.T l.A.7+2 7++.:.p G g / , n & H /+& u ] / Q.@+1.9 ~ ,+g.G z.,+y & p.#.g g 4 9 T 1.P @+/.~ 4 D 9 +.r.P [ o ~ I 8 a [ a 0 [ 5 P [ 0 g 0 g z , , [ ", "v.O D 4 (.` /.a [ S 3 J . a #.A.l.C Q 5 k+s A.:.=.3 ^.s._.2 3 r.I ~ 0 m o , o s +.B e t z.Q.u.$.1.[ & <.j.r.G # s g.g.r #.[ P !.2 %.#.B C S P 4 P 9 p [ , & 5 8 [ p [ 0 [ [ a a ~ ' [ @ ~ v x 0 ", "v./.D P Z h K 7 P r.T p s ~ q :.6.#+C 9 z C C :._.1 l.s.2 :.q !.Q ~ [ o k , ~ [ C B e L g.`.v+G @+H / #.t+Q & , s & n o r s [ d !+!+1 < 3 7.j.C [ /.[ g H , [ I S I p [ [ % z z % [ 0 z ~ k k 0 ", "! |.P S X B J ` /.K S C z & q _.:.#+% |.4 Q +.V T 7+1 2 3 S [ 5 9 [ Q ~ H v % [ +.r.3 r.+._ : z.g.n y u I p ~ ' g o o r n , a d 2 s.2 b 3 T ;.C D J [ g H H [ 9 T T f [ g . % [ [ 5 ' o . 0 . . ", "' E !.T u+S 4 h g+/.K J z z S . .C & D a >.S 7+%+2 1 2 +.p [ 5 i (.4.~ v x [ 0 +.C 9.+.3 b H.H.,+N ] / G x x 8 8 l Z./ m o ~ 6 :.T T 9.$.+.K A+/.|.[ g , ,+g 5 2 2 +.g % o 0 8 I | [ k % ) A k ", "O O 8 Z h K p p <.+.r.B Q q :.&.&+S @+#.9 B S {+I f r.T 2 l.l.e ;.q 9 x x k ~ 9 q.B+1 0+S C s / 2.N ^ C+O.; [ v.Y 0 M ,+m n [ ' I I 5 % 4 t r r [ [ 0 0 , n { ; R O @ p.; #.p 9 7.Q #.% a O O z ", "i 9 9 i !.L S r.< 3 >.:.Q +.:. .}+3 4 4 6 Q Q +.$ Q L 3 1 :.r.e | p 5 ~ 0 s [ 5 5.s.c.^.0+r.p n H m u H.z.j @ J.+ [ t r r n o k [ i S 4 #.s r # j 0 o 0 , o n n . ' <.p p r.!.Q Q P [ 4 % [ !.9 ", "2 B P J 9 S :.c._.2 =.%+P #.4 @.T >.P 4 J 5 P %.[ % C 3 2 B l.T 9 [ [ . 6 z [ #._.>+'+c.{+_.Q #.,+# j m N r o , e./ ] u = n n s [ 3.3.P u.g.n N o c o 0 ~ g n { , 0 [ a [ B $.2 d Q Q Q C C B T ", "&.1 P [ 6 3 2 1+c.V %+3 4 @+P >.%+%+B J [ K 9 P a P +.B 2 :.%.%.a [ z . 9 % r.C i.@.>+ +|+2 >.6 r M j ~ x d.z.N > Z.T.z.^ > / n J ;.u+Q u.{ { N G 0 % 0 0 5 0 n m j . a ..!.T u+7.5 4 r.>.1 2 =.", "h+7++.J +.r.c.d+_.!+1 C #.o % S T =.>.S K Q Q J 4 7.X 1 1 2 C H ~ % x z 5 [ T B 0+3 V 1+4+l.B a <.0 z ' . , y r - N Z.= H.z./ z.& S | #.G n z.u N j o 0 o O [ [ N , % E ` !.S :.I % @+Q 2 _.n.n.", "n.7+3 3 r.B !+V b.++3 +.j o 0 S =.2 T B >.>.(.K $.T _.&._.A.& ~ b s % & g #.L q d 2 1 a+u+%.I % 6 M ~ w [ o , r n { > n u u N z.,+G s G g.y.z.z.n r r 0 . 8 8 I o d.& |.i J 4 S 6 g p B 1 2 n.a+", "=.=.7+V 6.1 1 r.l.{+S +.5 p r.;.c.7+7+2 T >.>.(. .1 +U _._ ,+6 l.C L s s & g.X.s #.#.C Q p g $ . J.. @ [ . ~ . 0 o o n n z.z.> > , n z.n z.> z.n r r [ 0 O 6 E + o , G & n % I [ [ !.T :.7+}+}+", "$.=._. +V 6.3 9 !+1 %+%+r.C S %+_.7+7+[.=.B (.T 1 n.h+5+|+p.o @ ++l.s.t #.& X.Q.N g.x y+k+0 ,+W A ' @ 0 0 + D ) O [ [ x 0 u ; u y N N u - z.F._ u r o [ ' ' . . E [ r N { y 0 R % 4 p r.B =. .7+", "2 s.7+1 &+1 .:._.1+1+2 1 %+7+1.5+2 X $.[.n._.3 >.Q i [ M g #.p 2 e :.l.f #.[ a g p #.% 0 % z . $ m 8 x |.v.' w *.$ # @ j l p f + , k s d f z.n u ; o # $ o l 2.m $ <.j x o [ L @ j % [ h $.P 1.", "1 2 2 %+ .S T :._._._.2 7+2 %+@.6.T %+X [.n. .T B K 8 6 [ 0 #.p 2 2 !+e T #+Q 9 t p g % [ ' a 5 r.<.I . /.a 6 w p #.~ M z ~ [ 9 $ r g.g f t n z., u m , c , # 2.2.l j s s [ <.[ $ j s % | >.K >.", "S T T T $.%.3 T c.c.2 _.}+=.1 +.+.S B }+n.h+s.1.!.Q 6 |.' o #.p 2 1 :.2 2 #.3 | r.p #.a 9 [ [ I &.2 <.' a A J [ d Q J z z z A+a g s { #.C _ b G.m & r { $ y g 0 j o o g <.[ s o $ & r & 4 L p S ", "p Q S >.>.C P | 2 2 V 2 2 2 3 C P 4 S 2 h+1+7+Z 3 ` |.D J.~ [ p 1 3 :.5+2 2++.T :.p @+[ 9 J [ f 8.>+t + . a 9 P 0.` F |.a D a D I #.& A.G _ *.n n s s n 0 , g @ t s s #.p g r o s & s o & g [ g ", "a [ J K S S 4 r.%+1 3 3 3 S %.C 9 a J %+&.2 S /.+.>.E D } z K S B 3 :._._.A.1 2 3 #.& a 9 9 C r.b+>+#.5 0 J Q B 0 a 8 a z . . a 4.P L #+f+b G g.x g x % & & , m 0 o s [ p #.t <.#.G $ s m % g p ", "5 P 4 P Q T +.Q S P P 4 4 #.p 9 B K D i T S J A+#.0+E D A ..4 q S S 3 2 s.%.7+2 1 +.@+a /.[ #.l.8.1+#.8 6 !.>.2 6 i D+| I F + 8 E #.L #.p.t n & & P & 5 o s H n o s % C p q q f @+#.g r r s b p ", "8 9 P J S M.+.S P [ % 4 [ 4 J Q j.Q ..'.|.D a j+l.u.9 D D E s +.J C p 3 2 3 2 %+2 >.K a a #.4 l.>+1 P O ,.Z r.w+S Q -.r.p L & . z a [ G G ; o j a i a Q 5 p o G M j $ p S r.3 %.t #.s m s b & S ", "9 i 4 4 0+u+%.%.' % . [ 6 |.9 Q w+(.7 L.=+A A ) >+p.J D |.` G T 4 % 4 +.2 1 [.1 3 :.!.a % 4 l.s.&.q 9 /.,.$.r.++T =.E+2 @.T #.% } F % G & { s @ P ` K I d p [ % l M g q | 2 r.A.+.t G n t #.u.B ", "t r.J @+P B 9 ' a [ J |.J p B ;.T Q [ D v.. . + ; l w . 4 T #+e t #+6.!+!+:.f P K S r.S 0 % S &+s.f P Q ` Q 5 Q <.+ | <.0 5 7.l.P I 8 ' . @ 0 % a Q i i ` [ % I 6 & P #.| >+3 S !+p q c b - C C ", "t r.P A+q p % A % [ [ 9 6 P S =.T Q a D A M k m m 2.@ f.P T #+q 4 [ r.T 3 S P [ K S S #.% 4 B }+e L +.Q ` 9 P 6 # l j k o g t+| P !.8 D ' 6 J [ [ 8 9 5 5 5 6 I i 0 g r q u+r.@.6.p p 0 b & #.a ", "#+q J 4 P #+% a [ J O 8 9 !.>.2 ` 9 /...! k ].].y / M M 5 T #.[ z |.K =.C K A+z P S +.4 [ !.>.7+3 3 | ` ` 8 6 a j o l l 0 s p C 9 ` 7 ,.|.8 9 |.K 9 5 a @+6 i 9 i @ j o t j.:.e ++S 9 P p g [ A ", "q C J P p % % |.' [ 6 9 !.| >.T ,.9 |.|.' . k 2.N 2.k k P T 4 g z J p ;.C B 4 A+[ 5 +.P 8 ` >.V T T h (.8 |.D z y 2.o k $ o g I ,.` 7 ,.9 g+9 |.|.[ [ a z [ i 9 I [ [ 0 L T r.:.1 +.S Q +.q P A+", ":.+.J P #.g.% a a a [ P 9 Q !.S |./.|.|.D z M ~ r o h.k [ Q C [ s p #+s.3 s.3 +.5 #.4 9 O 6 3 7+[.T Q |.6 a A A #.o 2.B., d.~ L ,.,.,.K /.K g+/.8 a 6 9 4 4 Q Q Q 9 d h h T 1 V 5+6.1 2 _._.++3 ", ":.C A+4 s & ~ a a p P P K K 9 |.,.,.,.|.D a ' a [ @ f.k #.C [ [ s #+%.b.c.h+_.:.| C 4 6 J a !.&.X T K 5 6 a [ 9 f p [ ~ k y+o a 9 K K K K 9 9 |.6 a |.i 9 [ 9 | Z $.0.0.Z >.%+s.b.++e &.h+U h+_.", "1 #.k+#.s r #.z Q Q B r.K 9 O ..8 !.E 9 O |.Y Y a O . . b b b g #.#+l._.d+&.&.2 | 9 4 J ..D B &.$.B I i 5 g p T Q 4 8 [ 8 [ I [ 9 K 9 Q Q Q 9 [ ' [ [ 6 9 S Q h h !.(.` h >.=.s.++l.+.s.c.U 8+c.", "_.4 @+[ s b a x S T :.S P 6 D v.J K |.|.|...g+'.A O v.. #._ G r a C B }+[.}+ .7+I +.p D D |.3 V B S I d 5 G 4 2 7.C 5 a a ' i % 8 9 Q :.| I p ' . 6 A ~ P I Q B p 6 [ E F d t+w+t+h K .1+b+*+}+", "r.q S f q r z.- !.i Q L g ' ! ).O A O z [ 4.+ ' #.I z ..a K r.#+| T 2 i.[ i [ L h i 7 J I f | Q ` 5 + 0 @ c b f e $ c m j H r #.Q I f [ Q Q 0+T r.q t % [ 6 |...p t m y r L T ;.t+:.r.p u+&.h+q.", "< A.b p g u _ - #.p 5 6 0 . . ! 6 |.d 6 % 6 . O 5 d 9 9 J Q Q q [ S %+C P E [ f T P 9 9 h p +.S 6 6 5 j j j & g o , j $ I g G v #+#.f 5 [ #.g u+f p n r @ [ a a g 0 r o c [ Q T 7.T K a Q | e 6.", "#+G g._ p.u N u f+#.p 6 A . . @ @ [ g % % a A A [ K Q r.r.;.p @+~ C r.S K 8 9 B u+Q ,.` ;.l.I h 8 6 6 2.v # o s . z 0 o o & p | f G & s s s G [ r # 2.<.l l , 0 & n o j c #.p h $.3.` /.a 4 a C ", "f+g.z.n u u y.z.u r a v.A M o # o o , & a . a } z x G p.< u+4 t.~ p r.S 9 ,.Q T ;.P /.8 7.q +.B 8 ' ' , ,+o z g D 8 E 0 x o 5 T D+u.,+].o 0 l { ,+0 @ I k o n p g & o g j ~ #.5 3 1.h F /.J x ~ ", "n u G G u n z.] y.n o . f.k 2.m o j s 0 a % ....a x x.x.G.f % j+0 Q r.S 9 6 9 h T P /.J Q q Q K ' J.[ [ o ~ . ' ,.,.|.6 a 6 4 z r.[ % 0 o l $ n s 5 0 8 o I Q e d [ #.g o n & ~ 2+Q q h p [ & o ", "& r b c u n N n N , x M ~ k 2.m j M ~ s [ ` 8 |.z % & z.Z.% z /.0 I S S /.z a Q B 9 g+a Q 5 B K D z I I g #.5 F d (.a [ % [ a a #.Q I 5 z o j y & p [ 6 ~ !.B T j.[ 0 g x & ~ , g.p.G #.g c o j ", "~ @ j r m G o o m m # j 2.d.2.@ @ 2.& v % 7.6 ~ x + 0 s v & a a a Q +.P J ~ ' g J J '.A 6 % [ z 9 [ h T #.P F 4.K S 9 d 6 J % D C Q % 0 [ M & { / & 0 0 ~ 0 [ +.9 @+[ g x o $ o r & G g.#.o o c ", ". @ j n , r 0 0 x l # # y K.].. M ~ <.y+H 5 & x 2.0 ].x ].z O ' a B P S O ~ . g 5 ..R ..O % a A z 4 u+7.A.+.` E :.p u.9 P 8 A+a 9 9 v ~ [ s % % N ] B.B.k z g g 4 s J [ & M [ o + 0 0 & 0 & l @ "}; slashem-0.0.7E7F3/win/gnome/gnmain.h0000664000076400007640000000151210545462317015177 0ustar aliali/* SCCS Id: @(#)gnmain.h 3.4 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ #ifndef GnomeHackMainWindow_h #define GnomeHackMainWindow_h #include #include void ghack_init_main_window( int argc, char** argv); void ghack_main_window_add_map_window(GtkWidget* win); void ghack_main_window_add_message_window(GtkWidget* win); void ghack_main_window_add_status_window(GtkWidget* win); void ghack_main_window_add_text_window(GtkWidget *); void ghack_main_window_add_worn_window(GtkWidget* win); void ghack_main_window_remove_window(GtkWidget *); void ghack_main_window_update_inventory(); void ghack_save_game_cb(GtkWidget *widget, gpointer data); GtkWidget* ghack_get_main_window(); #endif /* GnomeHackMainWindow_h */ slashem-0.0.7E7F3/win/gnome/gnomeprv.h0000664000076400007640000000057510545462317015573 0ustar aliali/* SCCS Id: @(#)gnomeprv.h 3.4 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ #ifndef GnomeHack_h #define GnomeHack_h /* These are the base nethack include files */ #include "hack.h" #include "dlb.h" #include "patchlevel.h" #include "winGnome.h" #endif /* GnomeHack_h */ slashem-0.0.7E7F3/win/gnome/gnsignal.c0000664000076400007640000002614410545462317015533 0ustar aliali/* SCCS Id: @(#)gnsignal.c 3.4 2000/07/16 */ /* Copyright (C) 1998 by Anthony Taylor */ /* NetHack may be freely redistributed. See license for details. */ #include "gnsignal.h" #include "gnmain.h" #include GList *g_keyBuffer; GList *g_clickBuffer; int g_numKeys=0; int g_numClicks=0; int g_askingQuestion=0; static int s_done=FALSE; /* * ghack_init_signals * * Create some signals and attach them to the GtkWidget class. * These are the signals: * * ghack_curs : NONE:INT,INT * INT 1 = x * INT 2 = y * * ghack_putstr : NONE:INT,POINTER * INT = attribute * POINTER = char* string to print * * ghack_print_glyph : NONE:INT,INT,POINTER * INT 1 = x * INT 2 = y * INT 3 = GtkPixmap* to rendered glyph * * ghack_clear : NONE:NONE * * ghack_display : NONE:BOOL * BOOL = blocking flag * * ghack_start_menu : NONE:NONE * * ghack_add_menu : NONE:POINTER * POINTER = GHackMenuItem* * * ghack_end_menu : NONE:POINTER * POINTER = char* to closing string * * ghack_select_menu : NONE:POINTER,INT,POINTER * POINTER = int pointer-- filled with number * of selected items on return * INT = number of items selected * POINTER = structure to fill * * ghack_cliparound : NONE:INT,INT * INT 1 = x * INT 2 = y */ void ghack_init_signals( void) { ghack_signals[GHSIG_CURS] = gtk_object_class_user_signal_new (gtk_type_class (gtk_widget_get_type ()), "ghack_curs", GTK_RUN_FIRST, gtk_marshal_NONE__INT_INT, GTK_TYPE_NONE, 2, GTK_TYPE_INT, GTK_TYPE_INT); ghack_signals[GHSIG_PUTSTR] = gtk_object_class_user_signal_new (gtk_type_class (gtk_widget_get_type ()), "ghack_putstr", GTK_RUN_FIRST, gtk_marshal_NONE__INT_POINTER, GTK_TYPE_NONE, 2, GTK_TYPE_INT, GTK_TYPE_POINTER); ghack_signals[GHSIG_PRINT_GLYPH] = gtk_object_class_user_signal_new (gtk_type_class (gtk_widget_get_type ()), "ghack_print_glyph", GTK_RUN_FIRST, gtk_marshal_NONE__INT_INT_POINTER, GTK_TYPE_NONE, 3, GTK_TYPE_INT, GTK_TYPE_INT, GTK_TYPE_POINTER); ghack_signals[GHSIG_CLEAR] = gtk_object_class_user_signal_new (gtk_type_class (gtk_widget_get_type ()), "ghack_clear", GTK_RUN_FIRST, gtk_marshal_NONE__NONE, GTK_TYPE_NONE, 0); ghack_signals[GHSIG_DISPLAY] = gtk_object_class_user_signal_new (gtk_type_class (gtk_widget_get_type ()), "ghack_display", GTK_RUN_FIRST, gtk_marshal_NONE__BOOL, GTK_TYPE_NONE, 1, GTK_TYPE_BOOL); ghack_signals[GHSIG_START_MENU] = gtk_object_class_user_signal_new (gtk_type_class (gtk_widget_get_type ()), "ghack_start_menu", GTK_RUN_FIRST, gtk_marshal_NONE__NONE, GTK_TYPE_NONE, 0); ghack_signals[GHSIG_ADD_MENU] = gtk_object_class_user_signal_new (gtk_type_class (gtk_widget_get_type ()), "ghack_add_menu", GTK_RUN_FIRST, gtk_marshal_NONE__POINTER, GTK_TYPE_NONE, 1, GTK_TYPE_POINTER); ghack_signals[GHSIG_END_MENU] = gtk_object_class_user_signal_new (gtk_type_class (gtk_widget_get_type ()), "ghack_end_menu", GTK_RUN_FIRST, gtk_marshal_NONE__POINTER, GTK_TYPE_NONE, 1, GTK_TYPE_POINTER); ghack_signals[GHSIG_SELECT_MENU] = gtk_object_class_user_signal_new (gtk_type_class (gtk_widget_get_type ()), "ghack_select_menu", GTK_RUN_FIRST, gtk_marshal_NONE__POINTER_INT_POINTER, GTK_TYPE_NONE, 3, GTK_TYPE_POINTER, GTK_TYPE_INT, GTK_TYPE_POINTER); ghack_signals[GHSIG_CLIPAROUND] = gtk_object_class_user_signal_new (gtk_type_class (gtk_widget_get_type ()), "ghack_cliparound", GTK_RUN_FIRST, gtk_marshal_NONE__INT_INT, GTK_TYPE_NONE, 2, GTK_TYPE_INT, GTK_TYPE_INT); ghack_signals[GHSIG_FADE_HIGHLIGHT] = gtk_object_class_user_signal_new (gtk_type_class (gtk_widget_get_type ()), "ghack_fade_highlight", GTK_RUN_FIRST, gtk_marshal_NONE__NONE, GTK_TYPE_NONE, 0); ghack_signals[GHSIG_DELAY] = gtk_object_class_user_signal_new (gtk_type_class (gtk_widget_get_type ()), "gnome_delay_output", GTK_RUN_FIRST, gtk_marshal_NONE__INT, GTK_TYPE_NONE, 1, GTK_TYPE_INT); } /* For want of a better place, I'm putting the delay output stuff here * -Erik */ static gint timeout_callback(gpointer data) { s_done=TRUE; return FALSE; } void ghack_delay( GtkWidget *win, int numMillisecs, gpointer data) { s_done=FALSE; gtk_timeout_add( (unsigned int) numMillisecs, timeout_callback, NULL); while( s_done==FALSE) gtk_main_iteration(); } void ghack_handle_button_press(GtkWidget *widget, GdkEventButton *event, gpointer data) { GHClick *click; double x1, y1; if (event->type != GDK_BUTTON_PRESS) return; gnome_canvas_window_to_world( GNOME_CANVAS( widget), event->x, event->y, &x1, &y1); /* g_message("I got a click at %f,%f with button %d \n", x1, y1, event->button); */ /* We allocate storage here, so we need to remember if (g_numClicks>0) * to blow this away when closing the app using something like * while (g_clickBuffer) * { * g_free((GHClick)g_clickBuffer->data); * g_clickBuffer = g_clickBuffer->next; * } * g_list_free( g_clickBuffer ); * */ click = g_new( GHClick, 1); click->x=(int)x1/ghack_glyph_width(); click->y=(int)y1/ghack_glyph_height(); click->mod=(event->button == 1)? CLICK_1 : CLICK_2; g_clickBuffer = g_list_prepend (g_clickBuffer, click); /* Could use g_list_length(), but it is stupid and just * traverses the list while counting, so we'll just do * the counting ourselves in advance. */ g_numClicks++; } #ifndef M # ifndef NHSTDC # define M(c) (0x80 | (c)) # else # define M(c) ((c) - 128) # endif /* NHSTDC */ #endif #ifndef C #define C(c) (0x1f & (c)) #endif 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: key='#'; 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; break; } 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++; } slashem-0.0.7E7F3/win/gnome/gn_xpms.h0000664000076400007640000013770610545462317015420 0ustar aliali/* 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 * . They have been borrowed from * the most excellent NetHackQt, until such time as * we can come up with something better. * * More information about NetHackQt can be had from: * http://www.troll.no/~warwick/nethack/ */ /* XPM */ static char *blind_xpm[] = { /* width height ncolors chars_per_pixel */ "40 40 5 1", /* colors */ " c #000000", ". c None", "X c #909090", "o c #606060", "O c #303030", /* pixels */ "........................................", "........................................", "........................................", "........................................", "........................................", "........................................", "........................................", "........................................", "........................................", "........................................", "........................................", "........................................", "....ooooooooooooooooooooooooooooooooX...", ".... o...", ".... o...", ".... o...", ".... o...", "......o ..o ......", "......X O..X O......", "....... o... o......", ".......o ....o .......", "........O X.....O X.......", ".........O X.......O X........", "..........o OX.........o OX.........", "........................................", "........................................", "........................................", "........................................", "........................................", "........................................", "........................................", "........................................", "........................................", "........................................", "........................................", "........................................", "........................................", "........................................", "........................................", "........................................" }; /* XPM */ static char *cha_xpm[] = { /* width height ncolors chars_per_pixel */ "40 40 14 1", /* colors */ " c #F85848", ". c #949E9E", "X c #F8B090", "o c #E00028", "O c #D4D4D4", "+ c None", "@ c #B0B0B0", "# c #F82C24", "$ c #F89E6C", "% c #FF0000", "& c #909090", "* c #FFFFFF", "= c #CEAA90", "- c #DADAB6", /* pixels */ "++++++++++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++++++++++", "+++++++++++++++=#%#=+=#%% ++++++++++++++", "++++++++++++++ %O%%%#%$$%o%=++++++++++++", "+++++++++++++# +#%%o%%o%%%%% +++++++++++", "+++++++++++ %%%%%%%%%%%%%%%%o#=+++++++++", "+++++++++ o%%%%%%%%%%%%%%%%%%%%# +++++++", "++++++ #%%%%%%o%%%o%%o%%o%o%%%%%o%o +++", "++=#%%o%%%#= =*+**O*+**O*+- = =%%%%#@+++", "++++ %=++*+*+**O****O****O*O*O*OO%=+++++", "+++++.%=OO+*O*OO****+****+*O*+O&%=@+++++", "++++++=%=*OO+**O**O*O**O*O*OO+$%=+++++++", "+++++++#% +*OOOO****+****@O+*#%=++++++++", "++++++++#%#*+**+O+OO+O+OOO*O#o#+++++++++", "+++++++++o% O**+****O****O*#%%=+++++++++", "+++++++++ %%#O*O****+****+ %o#++++++++++", "++++++++++o%% XO*O**O*O**#%%%+++++++++++", "++++++++++ %%%o%$-**+**$%%%%=+++++++++++", "+++++++++++o%%$X$%%%%%%#= o#++++++++++++", "++++++++++@ %%%o#O$$+$$$%%%=++++++++++++", "++++++++++++#o%%%%%%%%o%%%=@++++++++++++", "+++++++++++++ %%%%%%%%%%o=++++++++++++++", "+++++++++++++++= & & @++++++++++++++++", "++++++++++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++++++++++" }; /* XPM */ static char *chaotic_xpm[] = { /* width height ncolors chars_per_pixel */ "40 40 9 1", /* colors */ " c #000000", ". c #5C7A7A", "X c None", "o c #B0B0B0", "O c #909090", "+ c #788C8C", "@ c #606060", "# c #FFFFFF", "$ c #303030", /* pixels */ "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXX@$ @XXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXX$$+#X$ $XXXXXXXXXX", "XXXXXXXXXXXXXXXXXX@$#o @XXXXXXXXX", "XXXXXXXXXXXXXXXXXX$XX OXXXXXXXX", "XXXXXXXXXXXXXXXXX@ # $@$ $XXXXXXXX", "XXXXXXXXXXXXXXXXX@.+ $XXXO @XXXXXXX", "XXXXXXXXXXXXXXXXX O@ XXXXX@ @XXXXXXX", "XXXXXXXXXXXXXXXXX @O $XXXXX@$ @XXXXXXX", "XXXXXXXXXXXXXXXXX O+ @XXXXO++ @XXXXXXX", "XXXXXXXXXXXXXXXXX @+ $@OXO$#$ XXXXXXXX", "XXXXXXXXXXXXXXXXX O@ $ @$Xo $XXXXXXXX", "XXXXXXXXXXXXXXXXX +O $X##+ $XXXXXXXXX", "XXXXXXXXXXXXXXXXX +@ $XXXXXXXXXX", "XXXXXXXXXXXXXXXXX oO $XXXXXXXXXXX", "XXXXXXXXO@@@@@ +# $XXXXXXXXXXXX", "XXXXXXO +o########$ $@XXXXXXXXX", "XXXXXX +#+.$XXXXXXXX", "XXXXXX @O @XXXXXXX", "XXXXXX$ $@ $@@$ @XXXXXXX", "XXXXXXX@@@@XXXXXX + @XXXX@$ OXXXXXXX", "XXXXXXXXXXXXXXXX@ # @XXXXXXX@@OXXXXXXXX", "XXXXXXXXXXXXXXXX@.+ @XXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXX$O@ XXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXX @O XXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXX #$ @XXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXX # @XXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXX # @XXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXX@ # @XXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXX@ # OXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXX@.X XXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXX ++ XXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXX @+ XXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXX O@ @XXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXX +O @XXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXX @XXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXX$ OXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXX@@OXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" }; /* XPM */ static char *cns_xpm[] = { /* width height ncolors chars_per_pixel */ "40 40 19 1", /* colors */ " c #000000", ". c #F85848", "X c #949E9E", "o c #F8B090", "O c #E00028", "+ c #7C3400", "@ c None", "# c #B0B0B0", "$ c #F82C24", "% c #F89E6C", "& c #FF0000", "* c #B64700", "= c #909090", "- c #788C8C", "; c #606060", ": c #C80050", "> c #CEAA90", ", c #303030", "< c #FFB691", /* pixels */ "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", "@@@@@@@@@@@.oo.o$ ;@@@@@@@@@@@@@@@@@@@@@", "@@@@@@@@@@@>.o.%%O,@@@@@@@@@@@@@@@@@@@@@", "@@@@@@@@@@@@$oo.o. ,@@@@@@@@@@@@@@@@@@@@", "@@@@@@@@@@@@.oo$oo+ =@@@@@@@@@@@@@@@@@@@", "@@@@@@@@@@@@..o&oo$ ,@@@@@@@@@@@@@@@@@@@", "@@@@@@@@@@@@#.o.oo. =@.$%@@@@@@@@@@@@@@", "@@@@@@@@@@@@@.o..oo& O.%ooo@@@@@@@@@@@@@", "@@@@@@@@@@@@@.o.&%o.$oo%O++;@@@@@@@@@@@@", "@@@@@@@@@@@@@.o.+$%$o.@@@@@@@@@@@", "@@@@@@@@@@@@@.oo++o%$$ ,@@$.oo@@@@@@@@@@", "@@@@@@@@@@@@>.oo+Oo$o%.@@$oo..-@@@@@@@@@", "@@@@@@@@@@@@..o%;.o&%.$..o%O ++>@@@@@@@@", "@@@@@@@@@@@@>.$O:%o.O::::O* $oooo@@@@@@@", "@@@@@@@@@@@@::::::$$:OO&OO::oo%.;=@@@@@@", "@@@@@@@@@@@.::::::::O&&&&&O::++ ,@@@@@@", "@@@@@@@@@@>:::O&&OO&&&&&&&&:: ;@@@@@", "@@@@@@@@@@=::O&&&&&O:O&&&&&O: ,=@@@@@@@", "@@@@@@@@@@:::&&&&&&&&:&&&&&O: ;@@@@@@@@", "@@@@@@@@@@::O&&&&&&&&:&O&&&O:, ;@@@@@@@@", "@@@@@@@@@@::O&&&&O&O&OO&O&&O:+ ;@@@@@@@@", "@@@@@@@@@@::&&&O&&&&&O:&&&&O:, @@@@@@@@", "@@@@@@@@@@::O&&&&&O&&&:O&O&::+ @@@@@@@@", "@@@@@@@@@@::O&&O&&&&O&OO&&&:: @@@@@@@@", "@@@@@@@@@@=::O&&&&O&&&O:&&&:: @@@@@@@@", "@@@@@@@@@@.:::O&&O&&&&&:&OO:: @@@@@@@@", "@@@@@@@@@@@:::::&&&&O&O:&&O:, @@@@@@@@", "@@@@@@@@@@.>:::::O&&&&&:&&::+ ;@@@@@@@@", "@@@@@@@@@@>.<::::O&&O&O:&&:: @@@@@@@@@", "@@@@@@@@@@@.o%,:::O&&&O:&O:, @@@@@@@@@", "@@@@@@@@@@@$o. :::OO&OO&::, ;@@@@@@@@@", "@@@@@@@@@@@&o%+ ,::O&OO&O:: =@@@@@@@@@", "@@@@@@@@@@@.oo+ :::OO::: ,@@@@@@@@@@", "@@@@@@@@@@@..oO +::::: =@@@@@@@@@@", "@@@@@@@@@@@@.<.+ ,+, ,@@@@@@@@@@@", "@@@@@@@@@@@@Oo<+ @X, ,@@@@@@@@@@@@", "@@@@@@@@@@@@.%o$ @@@@@;, ;@@@@@@@@@@@@@", "@@@@@@@@@@@@@.o., =@@@@@@@@@@@@@@@@@@@@@", "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" }; /* XPM */ static char *confused_xpm[] = { /* width height ncolors chars_per_pixel */ "40 40 13 1", /* colors */ " c #000000", ". c #949E9E", "X c #5C7A7A", "o c #D4D4D4", "O c None", "+ c #B0B0B0", "@ c #909090", "# c #788C8C", "$ c #606060", "% c #406868", "& c #FFFFFF", "* c #303030", "= c #6C91B6", /* pixels */ "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOO.=.+OO=.+O.OO+O+OO.+OOOOOO", "OOOOOOOOOOO++=====O=====+=O+==++=O+OOOOO", "OOOOOOOOOOO+=.=====.=++++===OO==+O=+OOOO", "OOOOOOOOOOO=+===.+=o==o===+&OoO======OOO", "OOOOOOOO+O+====OO+=o&&&&Oo==o&oO+==+=.O.", "OOOO+.+=+O==+&&o=oooOo&o&ooo=&oooO==O=+=", "OOOOOOOO++O===oo=oo&=&o&&oo=o==&o+==++==", "OOOOOOOO=o.=O====o&OO&o&oo&o&&oo=======O", "OOOOOOOo===+=O=O=ooO=ooooOOo=o&O=====OOO", "OOOOOOOOO+==+=======O=oo====O=o=O===+OOO", "OOOOOOOOO.=#=X=+====O========O======OOOO", "OOOOOOO.#Xo++.=#%====O==========OO==+OOO", "OOOOOO+Xo#+#+.#=.==X====+====O=+=+==+OOO", "OOOOO.+.+O===##.#=X.====oX##===o+OO.OOOO", "OOOOO#+####O#O##o.#+==#X#O#+...=OOo=+OOO", "OOOO++#o+#+X++++#.#O.#+#X.#+X+==+OO=oOOO", "OOOO#+.+..X+.##X++#++#..+XX#+##+..OOOOOO", "OOOO##....O+#++#+.++#+X+#+#X..+#+#OOOOOO", "OOOO++#+.+.#+#O+X#X#XX#.++##.#++.X$OOOOO", "OOOOO#+#+.+++#++.+++##+X###+X+X##+**OOOO", "OOOOO#..#OO#+.##o###.+..++.+#X+#+#* @OOO", "OOOOO+#.#O+#+#O.+++.###+##++###+.#* $OOO", "OOOOOOXX+#+#+#o..X##++#+..##.#+### *OOO", "OOOOOOOX#.#X+#+#+#+.#+..+####%XX%% OOO", "OOOOOOOO.%%X.#+#+#.++#+#+#+.X++=.% *OOO", "OOOOOOOOO.* *##+#+.O####.+XX%%%%#% $OOO", "OOOOOOOOOOO. %X.+.#+++XXX=.+++#X $OOO", "OOOOOOOOOOOO.* %%X..#X%=.####%X* $OOO", "OOOOOOOOOOOOOO.$ *XX%%%=.#X%###=* OOOO", "OOOOOOOOOOOOOOOOOO+%%%=%%#.+.#=* @OOOO", "OOOOOOOOOOOOOOOOOOo=%%%==X##X%* OOOOO", "OOOOOOOOOOOOOOOOOOO+X%%%%X=%* @OOOOO", "OOOOOOOOOOOOOOOOOOOOX%%%%X *@OOOOOO", "OOOOOOOOOOOOOOOOOOOO=%%%X* *$$OOOOOOOO", "OOOOOOOOOOOOOOOOOOOO+X%%= .OOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOX%%% OOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOO=%%* $OOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOO=%%% $OOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOO+%%% $OOOOOOOOOOOOO" }; /* XPM */ static char *dex_xpm[] = { /* width height ncolors chars_per_pixel */ "40 40 19 1", /* colors */ " c #000000", ". c #949E9E", "X c #F8B090", "o c #5C7A7A", "O c #D4D4D4", "+ c #F87A24", "@ c #7C3400", "# c None", "$ c #B0B0B0", "% c #F89E6C", "& c #B64700", "* c #909090", "= c #606060", "- c #CEAA90", "; c #DADAB6", ": c #303030", "> c #F86800", ", c #FFB691", "< c #F88C48", /* pixels */ "########################################", "########################################", "########################################", "########################################", "########################################", "########################################", "###############-%-######################", "##############-%X<-#####################", "#########-<<-#-%XX+==###################", "#########%,X< :<,X%@ :##################", "#########-XX%: @;X%+ *#################", "##########<,X& :<<%+: :#################", "######->+#-%%%: <,XX@ #################", "######%X%@ <,,& @XXX+ :++-#############", "######-: +XX+ #########", "#####+%%@@,X%<,XXXXXXX<:@XXX<: =########", "####$%XX< <,<,XX& ########", "#####$%<%X@%XXXX<%XX< =#######", "#######<;X%XXXXX<<,XXXXXX%,XXXXXXXXX%@ #######", "##########- c #788C8C", ", c #606060", "< c #406868", "1 c #C80050", "2 c #FFFFFF", "3 c #FFFF00", "4 c #00B6FF", "5 c #CEAA90", "6 c #DADAB6", "7 c #F86800", "8 c #FFB691", "9 c #6C91B6", "0 c #F88C48", "q c #0000FF", /* pixels */ "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$", "$$$$$$$$$$$$$$$353333335*$$$$$$$$$$$$$$$", "$$$$$$$$$$$$*33333333#7@3335$$$$$$$$$$$$", "$$$$$$$$$65333333333@7777#333*$$$$$$$$$$", "$$$$$$$$$3333333333377777733333===%$$$$$", "$$$$$$$533333333333#7777777333%=====$$$$", "$$$$$$ #3333333333o>7777773330======%$$$", "$$$$5---O#33333o3944077777333*=======$$$", "$$$$-----O333333>4444.77333330======%$$$", "$$$ ---O--;3333344444443333333:====5$$$$", "$$$ O-----733333444444433333333 ==035$$$", "$$$3--O--O333333>44444>33333333333333$$$", "$$533---O33333333944493333#333333333356$", "$$33867733333o33333:o333333o3333333333$$", "$532+2233333#333333333333oooo3#3333333%$", "6522222+33333333333333333oooooo33o3333*$", "$+22+22263333333o3333333ooooooo333333356", "662222+2533333333333333#ooooooo33333333$", "$32+22223333o3#33333o333ooooooo3#333333%", "$33222233333333333#333333ooooo333333333$", "$33368333333333333330626*oooo#333333o33%", "%333335== 33oo333333222223#333333333333$", "$3333=====:ooooo333+22+2263333333.>o333%", "$5333=====oooooo33322222223333339444935$", "$*33 ====>ooooooo3362+222633333.44444>3$", "$%330====:ooooooo333222+23333334444444$$", "$$333177 =oooXoo#333*626333333;4444444$$", "$$53##777&3oooo3333333333333#--,444449$$", "$$$3;77777#3o333333333333333O---94449$$$", "$$%*@77777#33333333333333337O----O:o3$$$", "$$$5777777333 333333333333;---O-O73$$$$", "$$$$#7777730====#:.,33333333------3$$$$$", "$$$$$577333=====qqqq<0333333#O---35$$$$$", "$$$$$%53335====qqqqqq.33o333337735$$$$$$", "$$$$$$$533 ====qqqqqqq3333333333%$$$$$$$", "$$$$$$$$%33====qqqqqqq333333333%$$$$$$$$", "$$$$$$$$$$50===qqqqqq,3333333:$$$$$$$$$$", "$$$$$$$$$%6%5503,qqq<333#335%$$$$$$$$$$$", "$$$$$$$$$$$$$%$*53,03335o$%%$$$$$$$$$$$$", "$$$$$$$$$$$$$$$$$$$$$%$$+$$$$$$$$$$$$$$$" }; /* XPM */ static char *hungry_xpm[] = { /* width height ncolors chars_per_pixel */ "40 40 15 1", /* colors */ " c #000000", ". c #949E9E", "X c #5C7A7A", "o c #D4D4D4", "O c None", "+ c #B0B0B0", "@ c #909090", "# c #788C8C", "$ c #606060", "% c #406868", "& c #FFFFFF", "* c #CEAA90", "= c #DADAB6", "- c #303030", "; c #6C91B6", /* pixels */ "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOO========OOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOO=============OOOOOOOOOOOOO", "OO;XX;@OOOOO================OOOOOOOO;XOO", "OO;%-;$OOOO==================OOOOOOO;XOO", "OO;-%;$OOO========@$#@========OOOOO+;;$O", "OO;%-;$OO=======- -*======*OOOO.;;$O", "OO;-%;$O======* @====.$$&=====@OOO.;;$O", "OO;X%;$O====== -========*@=====*.OO+;;$O", "OO;;;X$o====* -==========@======$OO;;;$O", "OO+;;-+o====- =============o====#@O+;;$O", "OOO;%$O===== @=============&====*$O;;;$O", "OOO+%OO====@ ==============&=====-OO;;$O", "OOo;-Oo====$ ==============o&==== OO;;$O", "OOO+%OO====@ ==============&===== O+;;#O", "OOO;-Oo====$-==============&&==== O+;;-O", "OOO;;+O=====$*============&&====* OO;;%+", "OOO;;$o=====$.============&&====X-OO;;$O", "OOO;;$O======*.===&======&&=====-$=O;;$O", "OOO;;$Oo=====.==========&&=====* @O+;;$O", "OOO;;$OO=======oo=====&&&======$-OOO;;$O", "OOO;;$OOo=======&o&&&&&&======$ @OOO;;$O", "OOO;;$OOOO========&=&========* $OOOO;;$O", "OO+;;$OOOOo=================* -OOOOO#;$O", "OOO;;$OOOOO=*==============@ -=OOOOO;;$O", "OOO;;$OOOOOOO+*==========*- $OOOOOOO;;$O", "OOOX-$OOOOOOOO@X@*====*#- -.OOOOOOOOX-$O", "OOOOOOOOOOOOOO=*@$- -$.=OOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOO=O==O=O=OOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO" }; /* XPM */ static char *hvy_enc_xpm[] = { /* width height ncolors chars_per_pixel */ "40 40 13 1", /* colors */ " c #000000", ". c #949E9E", "X c #5C7A7A", "o c #D4D4D4", "O c None", "+ c #B0B0B0", "@ c #909090", "# c #788C8C", "$ c #606060", "% c #406868", "& c #FFFFFF", "* c #303030", "= c #6C91B6", /* pixels */ "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOoO+OOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOoOXX==OOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOoO=OO+==OOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOoXOO.*$=$OOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOO=+# *.X *OOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOO==.OO=+@ $OOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOXO==.OO $OOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOO+=@$@* @OOOOOOOOOOOOOO", "OOOOOOOOOOO&&&&&&&&&&&&&&&.OOOOOOOOOOOOO", "OOOOOOOOOOOo==============X*OOOOOOOOOOOO", "OOOOOOOOOOoO===X====X=====X**OOOOOOOOOOO", "OOOOOOOOOO&============X===% $OOOOOOOOOO", "OOOOOOOOOoo===*%====***%===%* OOOOOOOOOO", "OOOOOOOOOoO==% %===* %==X* @OOOOOOOOO", "OOOOOOOOO&===% *==% X==**===% $OOOOOOOOO", "OOOOOOOOoo===% %==% ===% ===X OOOOOOOOO", "OOOOOOOOoO==== *== *==== *==X* @OOOOOOOO", "OOOOOOOO&===== %== %==== %===% $OOOOOOOO", "OOOOOOOoo===== *== *==== *===%* OOOOOOOO", "OOOOOOOoO===== %==% ===* ====X* @OOOOOOO", "OOOOOOO&===X== *==% X==**=====% $OOOOOOO", "OOOOOOoo===== *==* %=====X OOOOOOO", "OOOOOOoO=====*%%X===*%*X======%* @OOOOOO", "OOOOOOo====================X===* $OOOOOO", "OOOOOOO=%X%XXXX%XXXXXXXXX%X=%X% OOOOOO", "OOOOOOO.=********************** OOOOOO", "OOOOOOOOO OOOOOO", "OOOOOOOOO. @OOOOOO", "OOOOOOOOOOOoOOoOoOoOoOoOoOOoOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO" }; /* XPM */ static char *int_xpm[] = { /* width height ncolors chars_per_pixel */ "40 40 12 1", /* colors */ " c #000000", ". c #949E9E", "X c #5C7A7A", "o c #D4D4D4", "O c None", "+ c #B0B0B0", "@ c #909090", "# c #788C8C", "$ c #606060", "% c #406868", "& c #303030", "* c #6C91B6", /* pixels */ "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOO+#.X.##@#OOOOOOOOOOOOOOOOOO", "OOOOOOOO+##@X#O++.#+#.##OOOOOOOOOOOOOOOO", "OOOOOO+#Xo++#X#%#+##o#O#.#+OOOOOOOOOOOOO", "OOOOO.Xo#+#++##+.XX#..+.+..XOOOOOOOOOOOO", "OOOO++.+O.+O##+#.X###..OX#.+X+OOOOOOOOOO", "OOOO#+####O#O##o##+###X#+#+.#..OOOOOOOOO", "OOO.+#o+#+X++++#.#O+#+#X.#+X++X+OOOOOOOO", "OOO.+.+..X+.##X++#++#..+XX#+#X+..OOOOOOO", "OOO##....O+#++#+.++#+X+#+#X..+#+#OOOOOOO", "OOO++#+.+.#+#O+X#X#XX#.++##.#++.X$OOOOOO", "OOOO#+#+.+++#++.+++##+X###+X+X##+&&OOOOO", "OOOO#..#OO#+.##o###.+..++.+#X+#+#& @OOOO", "OOOO.#.#O+#+#O.+++.###+##++###+.# $OOOO", "OOOOOXX+#+#+#o..X##++#+..##.#+### &OOOO", "OOOOOOX#.#X+#+#+#+.#+..+####XX%X% OOOO", "OOOOOOO.%%X.#+#+#.++#+#+#+.%++*+% &OOOO", "OOOOOOOO@& &##+#+.O####.+XXX%%%#% $OOOO", "OOOOOOOOOO. %X.+.#+++XXX*.+++#% $OOOO", "OOOOOOOOOOO@& %%X..#XXX.####%%& $OOOO", "OOOOOOOOOOOOO@$ &XX%%%*.#X%###*& OOOOO", "OOOOOOOOOOOOOOOOO+%%%*%%#.+.#*& @OOOOO", "OOOOOOOOOOOOOOOOOO*%%%*.X##XX& OOOOOO", "OOOOOOOOOOOOOOOOOOOX%%%%X*%& @OOOOOO", "OOOOOOOOOOOOOOOOOOOX%%%%% &@OOOOOOO", "OOOOOOOOOOOOOOOOOOO*%%%X& &$$OOOOOOOOO", "OOOOOOOOOOOOOOOOOOO+%%%* .OOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOO+*%%% OOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOO*%%& $OOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOO*%%% $OOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOO+%%& $OOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOoOOOOOOOOOOOOOOOO" }; /* XPM */ static char *lawful_xpm[] = { /* width height ncolors chars_per_pixel */ "40 40 10 1", /* colors */ " c #000000", ". c #949E9E", "X c #5C7A7A", "o c #D4D4D4", "O c None", "+ c #B0B0B0", "@ c #909090", "# c #606060", "$ c #FFFFFF", "% c #303030", /* pixels */ "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOo$$$$$$oOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOO$$o$$o$$$$$OOOOOOOOOO", "OOOOOOOOOOOOOOOOOOo$$$$$$$o$$ooOOOOOOOOO", "OOOOOOOOOOOOOOOOOO$o$$$o$$$$$$$oOOOOOOOO", "OOOOOOOOOOOOOOOOOo$$$$+ .o$$$$$oOOOOOOOO", "OOOOOOOOOOOOOOOOOo$$$+%OOOO$o$$$oOOOOOOO", "OOOOOOOOOOOOOOOOO$$o$X@OOOOo$$$ooOOOOOOO", "OOOOOOOOOOOOOOOOO$$$$%OOOOOo$$$..OOOOOOO", "OOOOOOOOOOOOOOOOO$$$$@OOOOo$$oo##OOOOOOO", "OOOOOOOOOOOOOOOO+$$o$$ooOoo$$$o OOOOOOOO", "OOOOOOOOOOOOOOOOO$$$$$$$o$$$$o#%OOOOOOOO", "OOOOOOOOOOOOOOOO+$$o$$o$$$$$o@%OOOOOOOOO", "OOOOOOOOOOOOOOOOO$$$$$$$$o$o.%OOOOOOOOOO", "OOOOOOOOOOOOOOOOOo$$$o$$oo@#%OOOOOOOOOOO", "OOOOOOOOoooooo$$$$$$$$$$$% %OOOOOOOOOOOO", "OOOOOOO$$$$$$$$$$$$o$$o$$$$$$$oOOOOOOOOO", "OOOOOO$$$$$$$$$o$$$$$$$$$$$$o$$oOOOOOOOO", "OOOOOO$$o$ooooo##+o$$+##@oo$$$$$oOOOOOOO", "OOOOOOo$$#% %#$$$+%##%%#ooo$O#OOOOOOO", "OOOOOOOo@##OOOOO+$$$##OOOO#%%##%@OOOOOOO", "OOOOOOOOOOOOOOOOo$$$##OOOOOOO##@OOOOOOOO", "OOOOOOOOOOOOOOOOo$$o##OOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOO$$oo OOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOO+$$$o OOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOO$$$##OOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOO$o$##OOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOO$$$##OOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOo$$$##OOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOo$$o%@OOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOo$$o OOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOO$$oo OOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOO$$$o OOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOO$$$##OOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOo$$##OOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOO$$o##OOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOo$# @OOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOO.#@OOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO" }; /* XPM */ static char *mod_enc_xpm[] = { /* width height ncolors chars_per_pixel */ "40 40 13 1", /* colors */ " c #000000", ". c #949E9E", "X c #5C7A7A", "o c #D4D4D4", "O c None", "+ c #B0B0B0", "@ c #909090", "# c #788C8C", "$ c #606060", "% c #406868", "& c #FFFFFF", "* c #303030", "= c #6C91B6", /* pixels */ "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOoO+OOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOoOXX==OOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOoO=OO+==OOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOoXOO.*$=$OOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOO=+# *.X *OOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOO==.OO=+@ $OOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOXO==.OO $OOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOO+=@$@* @OOOOOOOOOOOOOO", "OOOOOOOOOOOOOo&&&&&&&&&oXOOOOOOOOOOOOOOO", "OOOOOOOOOOOO+&=========X%@OOOOOOOOOOOOOO", "OOOOOOOOOOOOO&=====X====% @OOOOOOOOOOOOO", "OOOOOOOOOOOOoO==X=======X* OOOOOOOOOOOOO", "OOOOOOOOOOOO&====*%*%*===* $OOOOOOOOOOOO", "OOOOOOOOOOO+&===X ===% *OOOOOOOOOOOO", "OOOOOOOOOOOoO===**=======X* OOOOOOOOOOOO", "OOOOOOOOOOO&===% %=======X% $OOOOOOOOOOO", "OOOOOOOOOOO&===% %*%%=====% *OOOOOOOOOOO", "OOOOOOOOOOoO===* ====X* OOOOOOOOOOO", "OOOOOOOOOO&=========* X===X% $OOOOOOOOOO", "OOOOOOOOO+&=========% *====% *OOOOOOOOOO", "OOOOOOOOOoO===% %=== %====%* OOOOOOOOOO", "OOOOOOOOO&====* *==X===% $OOOOOOOOO", "OOOOOOOOO&======*%*%X=======% *OOOOOOOOO", "OOOOOOOOOo==X===============% OOOOOOOOO", "OOOOOOOOO=XXXXXXXXXX%X%X%X%%% $OOOOOOOO", "OOOOOOOOOO=%**************** $OOOOOOOO", "OOOOOOOOOOO$ $OOOOOOOO", "OOOOOOOOOOOO* *OOOOOOOOO", "OOOOOOOOOOOOOoOOoOoOoOoOoOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO" }; /* XPM */ static char *neutral_xpm[] = { /* width height ncolors chars_per_pixel */ "40 40 14 1", /* colors */ " c #000000", ". c #949E9E", "X c #5C7A7A", "o c #D4D4D4", "O c None", "+ c #B0B0B0", "@ c #909090", "# c #788C8C", "$ c #606060", "% c #406868", "& c #FFFFFF", "* c #00B6FF", "= c #303030", "- c #6C91B6", /* pixels */ "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOO.------.OOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOO-+O&o.-----OOOOOOOOOO", "OOOOOOOOOOOOOOOOOO+-&o--------.OOOOOOOOO", "OOOOOOOOOOOOOOOOOO-oo----------+OOOOOOOO", "OOOOOOOOOOOOOOOOO+-&--% #-------OOOOOOOO", "OOOOOOOOOOOOOOOOO-OO-X=OOO.-----+OOOOOOO", "OOOOOOOOOOOOOOOOO-oO-%#OOOO.-----OOOOOOO", "OOOOOOOOOOOOOOOOO--O-=OOOOO+---X#OOOOOOO", "OOOOOOOOOOOOOOOOO-oO-XOOOO+OO--=$OOOOOOO", "OOOOOOOOOOOOOOOOO-OO--++OO-&--- OOOOOOOO", "OOOOOOOOOOOOOOOOO-OO-----+oo--%=OOOOOOOO", "OOOOOOOOOOOOOOOOO--O--+o&&o--%=OOOOOOOOO", "OOOOOOOOOOOOOOOOO-oo*-------%=OOOOOOOOOO", "OOOOOOOOOOOOOOOOO-oO------%%=OOOOOOOOOOO", "OOOOOOOO+.+-+.---O&------= =OOOOOOOOOOOO", "OOOOOO+-oo&&&&&&&&------------.OOOOOOOOO", "OOOOOO---------------X-----O&Oo-OOOOOOOO", "OOOOOO---------%=%---%%=%----OO-.OOOOOOO", "OOOOOO---== =%---%=%%===----%XOOOOOOO", "OOOOOOO-#$%OOOOOO-+-%$OOOO%===%=@OOOOOOO", "OOOOOOOOOOOOOOOO.-&-=%OOOOOOO%%#OOOOOOOO", "OOOOOOOOOOOOOOOo-O+-%$OOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOO-oO- OOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOO-OO- OOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOO-&-%%OOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOO-&-%$OOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOO-&-=$OOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOO--o-%$OOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOO+-&- .OOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOO-Oo- OOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOO-OO- OOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOO-oO- OOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOO-OO%%OOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOO-o-%$OOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOO---%$OOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOO--% #OOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOX$@OOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO" }; /* XPM */ static char *ovr_enc_xpm[] = { /* width height ncolors chars_per_pixel */ "40 40 13 1", /* colors */ " c #000000", ". c #949E9E", "X c #5C7A7A", "o c #D4D4D4", "O c None", "+ c #B0B0B0", "@ c #909090", "# c #788C8C", "$ c #606060", "% c #406868", "& c #FFFFFF", "* c #303030", "= c #6C91B6", /* pixels */ "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOoO+=+OOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOo=#===+OOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOo=.OO@X=OOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOo#OO* #X @OOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOO+=.XX+=#* @OOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOO+=O=.=OO $OOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOO#.=+OO@ $OOOOOOOOOOOOOO", "OOOOOOOOOooooooooo&O.#+#XooooOOOOOOOOOOO", "OOOOOOOOO&OOoOoOoOOOOOOOOOoO%@OOOOOOOOOO", "OOOOOOOOoO==================X*@OOOOOOOOO", "OOOOOOOO&===================X% @OOOOOOOO", "OOOOOOOO&==%*%*%*%*%*%*%*%*==% *OOOOOOOO", "OOOOOOOoO==%*%%*%%*%%*%*%*%==X* OOOOOOOO", "OOOOOOO&======================* $OOOOOOO", "OOOOOO+&=== ===% *OOOOOOO", "OOOOOOoO======================X* OOOOOOO", "OOOOOO&=======================X% $OOOOOO", "OOOOOOo========================% *OOOOOO", "OOOOOoO===*%X=====%%======%%===X* OOOOOO", "OOOOO&==% %==% *==== %==* $OOOOO", "OOOOO&== *==**== **% *=X% %%* ==% *OOOOO", "OOOOoO==%%==* =* ===% == %=== %=X* OOOOO", "OOOO&=======% =**===% %X %X==* =X% $OOOO", "OOOO&======% %= %==== %% ====* ==% *OOOO", "OOOoO=====% *== *==== %* ====% ==X* OOOO", "OOO&====XX *===**===% X% X=== *===* $OOO", "OO+&====X *====* ===% == *=== %===% *OOO", "OOoO===% %*%*== *** %==% %** ====X* OOO", "OO&====% ==X *====* %====X% $OO", "OO&================================% *OO", "OOo===X============================% OO", "OO=XXXXXXXXXXXX%XXXX%X%X%XXXXX%X%X%% $O", "OOO=%****************************** $O", "OOOO$ $O", "OOOOO* *OO", "OOOOOOOOOOoOOoOOoOOoOOoOOoOOoOOoOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO" }; /* XPM */ static char *satiated_xpm[] = { /* width height ncolors chars_per_pixel */ "40 40 23 1", /* colors */ " c #000000", ". c #949E9E", "X c #F8B090", "o c #5C7A7A", "O c #D4D4D4", "+ c #F87A24", "@ c #7C3400", "# c None", "$ c #B0B0B0", "% c #F89E6C", "& c #914700", "* c #B64700", "= c #909090", "- c #788C8C", "; c #606060", ": c #406868", "> c #FFFFFF", ", c #CEAA90", "< c #DADAB6", "1 c #303030", "2 c #FFB691", "3 c #6C91B6", "4 c #F88C48", /* pixels */ "########################################", "########################################", "########################################", "########################################", "########################################", "########################################", "########################################", "################<<<<<<<<################", "##############<<<<<<<<<<$#$$$###########", "############<<<<<<<<<<$:31:3:###########", "###########<<<<<<%42<<#:3:133-##########", "##########<<<<<%<<;;=o$131:33;##########", "#########<<<<<<,1 ::31:33;,#########", "########<<<<<<, =<<<<.13:133;<=########", "########<<<%2, 1<<<<<<#333:33;<,=#######", "#######<<<3-=<33;<<@o######", "#######O<<<<<,#<<<<<<<<.3:<3-;<, =######", "########<<<<2<<<<<<<<<>#31<33o<11#######", "########O<<<<44<>O>>>>>#3:<3.;- =#######", "##########<<<4<<<<><><<$3:<331 ;<#######", "##########<<<<<<<%2<<<<$3:<33 1#########", "###########O,<<<<<<<<<<#31<331##########", "#############.<<<<<<<<<$3:133;##########", "##############=;=,<<<<,o 1;;=##########", "###############<=;1 1;=##############", "#################<# c #B64700", ", c #909090", "< c #788C8C", "1 c #606060", "2 c #406868", "3 c #FFFFFF", "4 c #CEAA90", "5 c #DADAB6", "6 c #303030", "7 c #F86800", "8 c #FFB691", "9 c #6C91B6", "0 c #F88C48", "q c #0000FF", /* pixels */ "****************************************", "*************#333333333#****************", "***********##33333#333333#**************", "**********#33333#33333#33*==************", "*********#33##33-;-3#3333399************", "********#33#33#3-@ 33333#33=.***********", "********#3*#33-;;;;;-33333#99***********", "*******#3*3333-;;;;@ 33#333#9=**********", "*******#333#33#3-;-33#*##33399**********", "******#3#3333333-@-#333#9933*9=*********", "******#333#33#3333333#333*9999=*********", "******#333333333#3#33333333*999*********", "******#3#33#33333333#33#3333#9=*********", "******#333334>&&:&&>::44,3#33#9*********", "******#33*::&41OOO6:4O 0::4433=*********", "******#3:>,0:O0O1O+O:OXO,O+2+OOo4<+1104:>:#*********", "******.&:1OOO,14X2O48:O80,440:,*********", "******4::>OOO%8-X4O4%O,84+O0X&>=********", "******.::>,O 99*X+<$,+.o*1O4&0:*********", "******>:0&4O5qq9#10OO3qq9,+X:1:*********", "****=>,,::,O4qq9X+O>O-qq9O2X0,>*********", "******4:>OOOO48882OOOO+4OOO07*4*********", "******4*,4OO+OXX3O5************", "*********=0%,OO,>:>>O +1OO4*************", "**********=%+OO:::1:::6+:7**************", "***********7&OO:O+O,O1OO+1**************", "***********40OO,O4:OOO11O<5*************", "**********=4 +O1O2+O2+O0O***************", "************72O+1+21-OOO%5**************", "************0%1OOOO+O+174***************", "*************%%O,OO1407-=***************", "**************-$>%0%:74*****************", "****************54044*=*****************", "*****************=*=********************" }; /* XPM */ static char *sick_il_xpm[] = { /* width height ncolors chars_per_pixel */ "40 40 23 1", /* colors */ " c #F85848", ". c #949E9E", "X c #F8B090", "o c #E00028", "O c #D4D4D4", "+ c #F87A24", "@ c #7C3400", "# c None", "$ c #B0B0B0", "% c #F89E6C", "& c #FF0000", "* c #914700", "= c #B64700", "- c #909090", "; c #606060", ": c #FFFFFF", "> c #CEAA90", ", c #DADAB6", "< c #F86800", "1 c #FFB691", "2 c #6C91B6", "3 c #F88C48", "4 c #0000FF", /* pixels */ "########################################", "#############O:::::::::O################", "###########OO:::::O::::::O##############", "##########O:::::O:::::O::#$$############", "#########O::OO::%&%:O:::::22############", "########O::O::O:%o :::::O::$.###########", "########O:#O::%&&&&&%:::::O22###########", "#######O:#::::%&&&&o ::O:::O2$##########", "#######O:::O::O:%&%::O#OO:::22##########", "######O:O:::::::%o%O:::O22::#2$#########", "######O:::O::O:::::::O:::#2222$#########", "######O:::::::::O:O::::::::#222#########", "######O:O::O::::::::O::O::::O2$#########", "######O:::::>=@@=**=**>>-:O::O2#########", "######O::#**@3>%* ;=>=3;<@>>::$#########", "######O:** >=>XXXX1X >>+>%*%*;O#########", "######O3@*,X%XXXXXXX>X%XX >*=*O#########", "######.@@3XXXXXXXXXXXXXXX>X>3*-#########", "######>***>X% >XXXXX3XXXXXX%>*=>########", "######.***> 22#XXX<%X22#XXX@+;#########", "######=*3@X>O442OXX==%XX11111O1+%X111XX%<#>#########", "######.,;XXXXXX1O1X%3XXXXX%+3###########", "########3=XXXXXX:XXXXXXXXX+<>$##########", "########>+XXXXXX%-3->XXXX%+<############", "#########%3XXXXXX>- -%XXX%<%$###########", "#########$############", "##########+%XXXXXXXXXXXX%+<#############", "##########%3XXX>=****3XX%<%#############", "##########>+XXX**=3-*@3>3+##############", "###########<%XX >XX%X;%X3+##############", "###########%3XX>XX++XXXX<%$#############", "##########$>+XXXXXXXXXXX<###############", "############<%XXXXXXXXX3+###############", "###########$%+XXXXXXXX%<>###############", "#############++XXXXXX%<%$###############", "#############$%<<3333<%#################", "#################%3>>$##################", "#################$#$####################" }; /* XPM */ static char *slt_enc_xpm[] = { /* width height ncolors chars_per_pixel */ "40 40 13 1", /* colors */ " c #000000", ". c #949E9E", "X c #5C7A7A", "o c #D4D4D4", "O c None", "+ c #B0B0B0", "@ c #909090", "# c #788C8C", "$ c #606060", "% c #406868", "& c #FFFFFF", "* c #303030", "= c #6C91B6", /* pixels */ "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOoO+OOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOoOXX==OOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOoO=OO+==OOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOoXOO.*$=$OOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOO=+# *.X *OOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOO==.OO=+@ $OOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOXO==.OO $OOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOO+=@$@* @OOOOOOOOOOOOOO", "OOOOOOOOOOOOOOO&&&&&&&X @OOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOo======X*OOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOoO======X**OOOOOOOOOOOOOOO", "OOOOOOOOOOOOOO&====X===% $OOOOOOOOOOOOOO", "OOOOOOOOOOOOOoo==%* %==%* OOOOOOOOOOOOOO", "OOOOOOOOOOOOOoO=% % =X* @OOOOOOOOOOOOO", "OOOOOOOOOOOOO&==**==% %=% $OOOOOOOOOOOOO", "OOOOOOOOOOOOoo==%%==* %=X OOOOOOOOOOOOO", "OOOOOOOOOOOOoO=====* X==X* @OOOOOOOOOOOO", "OOOOOOOOOOOO&=====* %====% $OOOOOOOOOOOO", "OOOOOOOOOOOoo==== X=====%* OOOOOOOOOOOO", "OOOOOOOOOOOo+===* *%*%%==X* @OOOOOOOOOOO", "OOOOOOOOOOO&==== %===% $OOOOOOOOOOO", "OOOOOOOOOOO&==============% OOOOOOOOOOO", "OOOOOOOOOOO==============X% @OOOOOOOOOO", "OOOOOOOOOOO+%%%%%%%%%%%%%% $OOOOOOOOOO", "OOOOOOOOOOOOO% $OOOOOOOOOO", "OOOOOOOOOOOOO@ @OOOOOOOOOO", "OOOOOOOOOOOOOO@$$$$$$$$$$$$$@OOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO" }; /* XPM */ static char *str_xpm[] = { /* width height ncolors chars_per_pixel */ "40 40 17 1", /* colors */ " c #000000", ". c #F8B090", "X c #5C7A7A", "o c #F87A24", "O c #7C3400", "+ c None", "@ c #B0B0B0", "# c #F89E6C", "$ c #B64700", "% c #909090", "& c #606060", "* c #CEAA90", "= c #DADAB6", "- c #303030", "; c #F86800", ": c #FFB691", "> c #F88C48", /* pixels */ "++++++++++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++++++++++", "+++++++++++++++++++*>*>#++++++++++++++++", "++++++++++++++++*#o>..*#o*++++++++++++++", "+++++++++++++++o#.#>.....o++++++++++++++", "+++++++++++++++;>;#.o.>..#$X++++++++++++", "+++++++++++++++o#>.o.>:...o %++++++++++", "++++++++++++++o##>>#o##>..#O -++++++++++", "++++++++++++++>#.oo#>..>...O ++++++++++", "++++++++++++++*o##.>>;o#...o ++++++++++", "+++++++++++++++*;o#........>- &+++++++++", "+++++++++++++++++#>>;o......O -+++++++++", "+++++++++++++++++@+@+o>.....$ +++++++++", "+++++++++++++++++++++*;.#...>- %++++++++", "++++++++++++++++++++++;>o....$ &++++++++", "++++++++++++++++++++++#>>....>- %+++++++", "+++++++++++++++++++++++;#>....; -+++++++", "+++++++++++++++++++++++o#>....>O %++++++", "+++++++++++++++++++++++*>o.....; -++++++", "+++++++++++++#>**+++++++;#.....>O %+++++", "+o#+++++++*o;>>>>o#+++++o##.....; -+++++", "+:#o*++++oo#..*..*>;*+++#>#.....>O %++++", "+:=#o#+*;>.:==:....#;*++@o.......; &++++", "+::..>;o#.=::::......o*++;.......>O ++++", "+.....#o.:.=:.........o#+;........$ ++++", "+......#o..:...........#o;>.......o &+++", "+........#..............*>o......:o- +++", "+..................#o>#...#o.......O +++", "+...............>o>#.......#>......O &++", "+..................................o -++", "+..................................> ++", "+..................................> ++", "+.................................#$ &+", "+................................>$ &+", "+..#>$o>#..............#>;>>>oOOO- ++", "+...#O OOOOO$>>>>>>>$OO %++", "+...o -&&++++", "+..#O -&&%++++++++++", "++++++++++++++++++++++++++++++++++++++++" }; /* XPM */ static char *stunned_xpm[] = { /* width height ncolors chars_per_pixel */ "40 40 12 1", /* colors */ " c #000000", ". c #949E9E", "X c #5C7A7A", "o c #D4D4D4", "O c None", "+ c #B0B0B0", "@ c #909090", "# c #788C8C", "$ c #606060", "% c #406868", "& c #303030", "* c #6C91B6", /* pixels */ "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", "OOOOOOOOOOOO&$OOOO@OOO@@OO@OOOOOOOOOOOOO", "OOOOOOOOOOO@& $OO@&&$$@ O@$$OOOOOOOOOOOO", "OOOOOOOOOOOO$$ @@@$ &&OOO@$OOOOOOOOOOOO", "OOOOOOOOOOOOO@@&$$$$&O$OO$O &@O@OOOOOOOO", "OOOOOO@@@@@@OO@$$O$&$@@OO& &&$O&OOOOOOO", "OOOOOO&&&& & $ &&@$ &O@$& &&&$ & $OOOOOO", "OOOOOO$&OO &&&$ $$ $& $$&$&&&OOOOOOO", "OOOOOO@@O@$ &+ # &O$$ $$&O@OOOOO", "OOOOOOOO@X%$ %& %% & && $$@@@@OOOO", "OOOOOOO+$$@+ &%%%&%& & &@OOO&&OOO", "OOOOOO.Xo%+ &&%%%%%&& & OO@$&&OOO", "OOOOO++ $$&&$ && %&%%& &O@&$&OOOO", "OOOOO####$ X&&& && &%& & &&OOOO", "OOOO++#.+## $&# %& & & &$ OOOO", "OOOO#+++.@&%&& &#&%& & $ @OOOOOO", "OOOO##....#+$#@%#& $%$&@&$$% & X##$@OOOO", "OOOO.+#+.+@#+#+$&$X#%&%.+& %&#++.$&OOOOO", "OOOOO#+#+.+++#$$%&++&X+X#&#+&+&##+ &OOOO", "OOOOO#..#OO#+@%#o##X.@..++.+$&+#+#& @OOO", "OOOOO+#.#O+#+#O@++@$$##+##++###+.#& $OOO", "OOOOOOXX+#+#+#o.@%&$++#+..##.#+### &OOO", "OOOOOOOX#.#X+#+#+##&#+..+####%XX%% OOO", "OOOOOOOO+%%X.#+#+#.++#+#+#+.X++*.% &OOO", "OOOOOOOOO@& &##+#+.O####.+XX%%%%#% $OOO", "OOOOOOOOOOO. %X.+.#+++XXX*.+++#X $OOO", "OOOOOOOOOOOO@& %%X..#X%#.####%X& $OOO", "OOOOOOOOOOOOOO@$ &XX%%%*.#X%###*& OOOO", "OOOOOOOOOOOOOOOOOO+%%%*%%#.+.#*& @OOOO", "OOOOOOOOOOOOOOOOOOO*%%%**X##X%& OOOOO", "OOOOOOOOOOOOOOOOOOOOX%%%%X*X& @OOOOO", "OOOOOOOOOOOOOOOOOOOOX%%%%X &@OOOOOO", "OOOOOOOOOOOOOOOOOOOO*%%%X& &$$OOOOOOOO", "OOOOOOOOOOOOOOOOOOOO+X%%* @OOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOOX%%& OOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOO*%%% $OOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOO*%%% $OOOOOOOOOOOOO", "OOOOOOOOOOOOOOOOOOOOO.X%& $OOOOOOOOOOOOO" }; /* XPM */ static char *wis_xpm[] = { /* width height ncolors chars_per_pixel */ "40 40 13 1", /* colors */ " c #000000", ". c #949E9E", "X c #5C7A7A", "o c None", "O c #B0B0B0", "+ c #909090", "@ c #788C8C", "# c #606060", "$ c #406868", "% c #FFFFFF", "& c #303030", "* c #6C91B6", "= c #0000FF", /* pixels */ "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooo+#& &#oooooooooooooooooooo", "oooooooooooo+& #oooooooooooooooooo", "ooooooooooo+ &====&& &ooooooooooooooooo", "oooooooooo+ &==& ===%& +ooooooooooooooo", "ooooooooo+&%=== ===%%o&&oooooooooooooo", "oooooooo.&%%===& ===%o& #+ooooooooooo", "oooo&###&&%%*=======$#&ooo#& #+oooooooo", "ooooo###o+&X$=====& #oo##oooo+######oooo", "oooooooooooo######@oo##ooooooooooooooooo", "oooooooooooooOoOoOo##ooooooooooooooooooo", "ooooooooooooooooo+#+ooo+&#oooooooooooooo", "ooooooooooooooooooooooo#oooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo" }; /* XPM */ static char *nothing_xpm[] = { /* width height ncolors chars_per_pixel */ "40 40 13 1", /* colors */ " c #000000", ". c #949E9E", "X c #5C7A7A", "o c None", "O c #B0B0B0", "+ c #909090", "@ c #788C8C", "# c #606060", "$ c #406868", "% c #FFFFFF", "& c #303030", "* c #6C91B6", "= c #0000FF", /* pixels */ "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo", "oooooooooooooooooooooooooooooooooooooooo" }; slashem-0.0.7E7F3/win/gnome/gntext.c0000664000076400007640000001122610545462317015235 0ustar aliali/* SCCS Id: @(#)gntext.c 3.4 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ #include "gntext.h" #include "gnmain.h" #include /* include the standard RIP window (win/X11/rip.xpm) */ #include "gn_rip.h" /* dimensions of the pixmap */ #define RIP_IMAGE_WIDTH 400 #define RIP_IMAGE_HEIGHT 200 /* dimensions and location of area where we can draw text on the pixmap */ #define RIP_DRAW_WIDTH 84 #define RIP_DRAW_HEIGHT 89 #define RIP_DRAW_X 114 #define RIP_DRAW_Y 69 /* Text Window widgets */ GtkWidget *RIP = NULL; GtkWidget *RIPlabel = NULL; GtkWidget *TW_window = NULL; GnomeLess *gless; static int showRIP = 0; void ghack_text_window_clear(GtkWidget *widget, gpointer data) { g_assert (gless != NULL); gtk_editable_delete_text (GTK_EDITABLE (gless->text), 0, 0); } void ghack_text_window_destroy() { TW_window = NULL; } void ghack_text_window_display(GtkWidget *widget, boolean block, gpointer data) { if(showRIP == 1) { gtk_widget_show (GTK_WIDGET ( RIP)); 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 gnome_dialog_run_and_close(GNOME_DIALOG(TW_window)); if(showRIP == 1) { showRIP = 0; gtk_widget_hide (GTK_WIDGET ( RIP)); gtk_window_set_title(GTK_WINDOW(TW_window), "Text Window"); } } void ghack_text_window_put_string(GtkWidget *widget, int attr, const char* text, gpointer data) { if(text == NULL) return; /* Don't bother with attributes yet */ gtk_text_insert (GTK_TEXT (gless->text), NULL, NULL, NULL, text, -1); gtk_text_insert (GTK_TEXT (gless->text), NULL, NULL, NULL, "\n", -1); } GtkWidget* ghack_init_text_window ( ) { GtkWidget *pixmap; if(TW_window) return(GTK_WIDGET(TW_window)); TW_window = gnome_dialog_new("Text Window", GNOME_STOCK_BUTTON_OK, NULL); gtk_window_set_default_size( GTK_WINDOW(TW_window), 500, 400); gtk_window_set_policy(GTK_WINDOW(TW_window), TRUE, TRUE, FALSE); gtk_window_set_title(GTK_WINDOW(TW_window), "Text Window"); /* create GNOME pixmap object */ pixmap = gnome_pixmap_new_from_xpm_d (rip_xpm); g_assert (pixmap != NULL); gtk_widget_show (GTK_WIDGET (pixmap)); /* create label with our "death message", sized to fit into the * tombstone */ RIPlabel = gtk_label_new ("RIP"); g_assert (RIPlabel != NULL); /* gtk_label_set_justify is broken? */ gtk_label_set_justify (GTK_LABEL (RIPlabel), GTK_JUSTIFY_CENTER); gtk_label_set_line_wrap (GTK_LABEL (RIPlabel), TRUE); gtk_widget_set_usize (RIPlabel, RIP_DRAW_WIDTH, RIP_DRAW_HEIGHT); gtk_widget_show (RIPlabel); /* create a fixed sized widget for the RIP pixmap */ RIP = gtk_fixed_new (); g_assert (RIP != NULL); gtk_widget_set_usize (RIP, RIP_IMAGE_WIDTH, RIP_IMAGE_HEIGHT); gtk_fixed_put (GTK_FIXED (RIP), pixmap, 0, 0); gtk_fixed_put (GTK_FIXED (RIP), RIPlabel, RIP_DRAW_X, RIP_DRAW_Y); gtk_widget_show (RIP); gtk_box_pack_start(GTK_BOX(GNOME_DIALOG(TW_window)->vbox), RIP, TRUE, TRUE, 0); /* create a gnome Less widget for the text stuff */ gless = GNOME_LESS (gnome_less_new ()); g_assert (gless != NULL); gtk_widget_show (GTK_WIDGET (gless)); gtk_box_pack_start(GTK_BOX(GNOME_DIALOG(TW_window)->vbox), GTK_WIDGET (gless), TRUE, TRUE, 0); /* Hook up some signals */ gtk_signal_connect(GTK_OBJECT(TW_window), "ghack_putstr", GTK_SIGNAL_FUNC(ghack_text_window_put_string), NULL); gtk_signal_connect(GTK_OBJECT(TW_window), "ghack_clear", GTK_SIGNAL_FUNC(ghack_text_window_clear), NULL); gtk_signal_connect(GTK_OBJECT(TW_window), "ghack_display", GTK_SIGNAL_FUNC(ghack_text_window_display), NULL); /* Center the dialog over over parent */ gnome_dialog_set_parent( GNOME_DIALOG (TW_window), GTK_WINDOW(ghack_get_main_window()) ); gtk_window_set_modal( GTK_WINDOW(TW_window), TRUE); gtk_widget_show_all(TW_window); gtk_widget_hide (GTK_WIDGET ( RIP)); gnome_dialog_close_hides (GNOME_DIALOG (TW_window), TRUE); return GTK_WIDGET(TW_window); } void ghack_text_window_rip_string( const char* string) { /* This is called to specify that the next message window will * be a RIP window, which will include this text */ showRIP = 1; gtk_label_set( GTK_LABEL( RIPlabel), string); } slashem-0.0.7E7F3/win/gnome/gnworn.c0000664000076400007640000000570010545462317015236 0ustar aliali/* SCCS Id: @(#)gnbind.c 3.4 2002/04/15 */ /* Copyright (C) 2002, Dylan Alex Simon */ /* NetHack may be freely redistributed. See license for details. */ #include "gnworn.h" #include "gnglyph.h" #include "gnsignal.h" #include "gnomeprv.h" #define WORN_WIDTH 3 #define WORN_HEIGHT 6 #ifdef TOURIST #define WORN_OBJECT_LIST /* struct obj *[WORN_HEIGHT][WORN_WIDTH] = */ { \ { uquiver, uarmh, u.twoweap ? NULL : uswapwep }, \ { u.twoweap ? uswapwep : NULL, ublindf, uwep }, \ { uleft, uamul, uright }, \ { uarms, uarmc, uarmg }, \ { uarmu, uarm, uskin }, \ { uball, uarmf, uchain } \ } #else #define WORN_OBJECT_LIST /* struct obj *[WORN_HEIGHT][WORN_WIDTH] = */ { \ { uquiver, uarmh, u.twoweap ? NULL : uswapwep }, \ { u.twoweap ? uswapwep : NULL, ublindf, uwep }, \ { uleft, uamul, uright }, \ { uarms, uarmc, uarmg }, \ { NULL, uarm, uskin }, \ { uball, uarmf, uchain } \ } #endif static GtkWidget *worn_contents[WORN_HEIGHT][WORN_WIDTH]; static struct obj *last_worn_objects[WORN_HEIGHT][WORN_WIDTH]; GdkImlibImage *image_of_worn_object(struct obj *o); void ghack_worn_display(GtkWidget *win, boolean block, gpointer data); GtkWidget* ghack_init_worn_window() { GtkWidget *top; GtkWidget *table; GtkWidget *tablealign; GtkWidget *label; int i,j; top = gtk_vbox_new(FALSE, 2); table = gtk_table_new(WORN_HEIGHT, WORN_WIDTH, TRUE); for (i = 0; i < WORN_HEIGHT; i++) { for (j = 0; j < WORN_WIDTH; j++) { worn_contents[i][j] = gnome_pixmap_new_from_imlib(image_of_worn_object(NULL)); last_worn_objects[i][j] = NULL; /* a pointer that will never be */ gtk_table_attach(GTK_TABLE(table), GTK_WIDGET(worn_contents[i][j]), j, j+1, i, i+1, 0, 0, 0, 0); } } tablealign = gtk_alignment_new(0.5, 0.0, 0.0, 1.0); gtk_box_pack_start(GTK_BOX(top), tablealign, FALSE, FALSE, 0); gtk_container_add(GTK_CONTAINER(tablealign), table); label = gtk_label_new("Equipment"); gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_CENTER); gtk_box_pack_start(GTK_BOX(top), label, FALSE, FALSE, 0); gtk_signal_connect(GTK_OBJECT(top), "ghack_display", GTK_SIGNAL_FUNC(ghack_worn_display), NULL); return top; } GdkImlibImage* image_of_worn_object(struct obj *o) { int glyph; GdkImlibImage *im; if (o) glyph = obj_to_glyph(o); else glyph = cmap_to_glyph(S_stone); im = ghack_image_from_glyph(glyph, FALSE); return im; } void ghack_worn_display(GtkWidget *win, boolean block, gpointer data) { int i, j; struct obj *worn_objects[WORN_HEIGHT][WORN_WIDTH] = WORN_OBJECT_LIST; for (i = 0; i < WORN_HEIGHT; i++) { for (j = 0; j < WORN_WIDTH; j++) { if (worn_objects[i][j] != last_worn_objects[i][j]) { last_worn_objects[i][j] = worn_objects[i][j]; gnome_pixmap_load_imlib(GNOME_PIXMAP(worn_contents[i][j]), image_of_worn_object(worn_objects[i][j])); } } } } slashem-0.0.7E7F3/win/gnome/gnmesg.h0000664000076400007640000000160310545462317015207 0ustar aliali/* SCCS Id: @(#)gnmesg.h 3.4 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ #ifndef GnomeHackMessageWindow_h #define GnomeHackMessageWindow_h #include #include "config.h" GtkWidget* ghack_init_message_window ( /* GnomeHackKeyBuffer g_keybuffer, GnomeHackClickBuffer g_clickbuffer */ ); void ghack_message_window_clear(GtkWidget *widget, gpointer data); void ghack_message_window_destroy(); void ghack_message_window_display(GtkWidget *widget, boolean block, gpointer data); void ghack_message_window_put_string(GtkWidget *widget, int attr, const char* text, gpointer data); void ghack_message_window_use_RIP(int how); void ghack_message_window_scroll(int dx, int dy); #endif /* GnomeHackMessageWindow_h */ slashem-0.0.7E7F3/win/gnome/gnyesno.c0000664000076400007640000000440110545462317015403 0ustar aliali/* SCCS Id: @(#)gnyesno.c 3.4 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ #include "gnbind.h" #include "gnyesno.h" int ghack_yes_no_dialog( const char *question, const char *choices, int def) { int i=0, ret; gchar button_name[BUFSZ]; GtkWidget *box; GtkWidget* mainWnd=NULL; box = gnome_message_box_new ( question, GNOME_MESSAGE_BOX_QUESTION, NULL); /* add buttons for each choice */ if (!strcmp(GNOME_STOCK_BUTTON_OK, choices)) { gnome_dialog_append_button ( GNOME_DIALOG(box), GNOME_STOCK_BUTTON_OK); gnome_dialog_set_default( GNOME_DIALOG(box), 0); gnome_dialog_set_accelerator( GNOME_DIALOG(box), 0, 'o', 0); #if 0 g_print("Setting accelerator '%c' for button %d\n", 'o', 0); #endif } else { for( ; choices[i]!='\0'; i++) { if (choices[i]=='y') { sprintf( button_name, GNOME_STOCK_BUTTON_YES); } else if (choices[i]=='n') { sprintf( button_name, GNOME_STOCK_BUTTON_NO); } else if (choices[i] == 'q') { sprintf( button_name, "Quit"); } else { sprintf( button_name, "%c", choices[i]); } if (def==choices[i]) gnome_dialog_set_default( GNOME_DIALOG(box), i); gnome_dialog_append_button ( GNOME_DIALOG(box), button_name); gnome_dialog_set_accelerator( GNOME_DIALOG(box), i, choices[i], 0); #if 0 g_print("Setting accelerator '%c' for button %d\n", choices[i], i); #endif } } #if 0 /* Perhaps add in a quit game button, like this... */ gnome_dialog_append_button ( GNOME_DIALOG(box), GNOME_STOCK_BUTTON_CLOSE); gnome_dialog_set_accelerator( GNOME_DIALOG(box), i, choices[i], 0); g_print("Setting accelerator '%c' for button %d\n", 'Q', i); #endif gnome_dialog_set_close(GNOME_DIALOG (box), TRUE); mainWnd = ghack_get_main_window (); gtk_window_set_modal( GTK_WINDOW(box), TRUE); gtk_window_set_title( GTK_WINDOW(box), "GnomeHack"); if ( mainWnd != NULL ) { gnome_dialog_set_parent (GNOME_DIALOG (box), GTK_WINDOW ( mainWnd) ); } ret=gnome_dialog_run_and_close ( GNOME_DIALOG (box)); #if 0 g_print("You selected button %d\n", ret); #endif if (ret==-1) return( '\033'); else return( choices[ret]); } slashem-0.0.7E7F3/win/gnome/gnsignal.h0000664000076400007640000000217310545462317015534 0ustar aliali/* SCCS Id: @(#)gnsignal.h 3.4 2000/07/16 */ /* Copyright (C) 1998 by Anthony Taylor */ /* NetHack may be freely redistributed. See license for details. */ #ifndef GnomeHackSignals_h #define GnomeHackSignals_h #include #include #include "gnomeprv.h" #include "gnglyph.h" /* The list of custom signals */ enum { GHSIG_CURS, GHSIG_PUTSTR, GHSIG_PRINT_GLYPH, GHSIG_CLEAR, GHSIG_DISPLAY, GHSIG_START_MENU, GHSIG_ADD_MENU, GHSIG_END_MENU, GHSIG_SELECT_MENU, GHSIG_CLIPAROUND, GHSIG_FADE_HIGHLIGHT, GHSIG_DELAY, GHSIG_LAST_SIG }; guint ghack_signals[GHSIG_LAST_SIG]; extern void ghack_init_signals( void); void ghack_handle_key_press(GtkWidget *widget, GdkEventKey *event, gpointer data); void ghack_handle_button_press(GtkWidget *widget, GdkEventButton *event, gpointer data); typedef struct { int x, y, mod; } GHClick; extern GList *g_keyBuffer; extern GList *g_clickBuffer; extern int g_numKeys; extern int g_numClicks; extern int g_askingQuestion; void ghack_delay( GtkWidget *win, int numMillisecs, gpointer data); #endif /* GnomeHackSignals_h */ slashem-0.0.7E7F3/win/gnome/gnmain.c0000664000076400007640000006261410545462317015204 0ustar aliali/* SCCS Id: @(#)gnmain.c 3.4 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ #include "gnmain.h" #include "gnsignal.h" #include "gnbind.h" #include "gnopts.h" #include #include #include #include #include #include #include "hack.h" #include "date.h" static GtkWidget* mainWindow=NULL; static GtkWidget *about=NULL; static GtkWidget* hBoxFirstRow; static GtkWidget* vBoxMain; int restarted = 0; int os_x = 0, os_y = 0, os_w = 0, os_h = 0; static GnomeClient *session_id; static void ghack_quit_game(GtkWidget *widget, int button) { gtk_widget_hide(widget); if (button == 0) { gnome_exit_nhwindows(0); gtk_object_unref(GTK_OBJECT(session_id)); } } static void ghack_quit_game_cb(GtkWidget *widget, gpointer data) { GtkWidget *box; box = gnome_message_box_new(_("Do you really want to quit?"), GNOME_MESSAGE_BOX_QUESTION, GNOME_STOCK_BUTTON_YES, GNOME_STOCK_BUTTON_NO, NULL); gnome_dialog_set_default( GNOME_DIALOG(box), 1); gnome_dialog_set_parent (GNOME_DIALOG (box), GTK_WINDOW (ghack_get_main_window ()) ); gnome_dialog_set_accelerator (GNOME_DIALOG(box), 1, 'n', 0); gnome_dialog_set_accelerator (GNOME_DIALOG(box), 0, 'y', 0); gtk_window_set_modal( GTK_WINDOW(box), TRUE); gtk_signal_connect( GTK_OBJECT(box), "clicked", (GtkSignalFunc)ghack_quit_game, NULL); gtk_widget_show(box); } static void ghack_save_game(GtkWidget *widget, int button) { gtk_widget_hide(widget); if (button == 0) { if(dosave0()) { /* make sure they see the Saving message */ display_nhwindow(WIN_MESSAGE, TRUE); gnome_exit_nhwindows("Be seeing you..."); } else (void)doredraw(); } } void ghack_save_game_cb(GtkWidget *widget, gpointer data) { GtkWidget *box; box = gnome_message_box_new(_("Quit and save the current game?"), GNOME_MESSAGE_BOX_QUESTION, GNOME_STOCK_BUTTON_YES, GNOME_STOCK_BUTTON_NO, NULL); gnome_dialog_set_default( GNOME_DIALOG(box), 1); gnome_dialog_set_parent (GNOME_DIALOG (box), GTK_WINDOW (ghack_get_main_window ()) ); gnome_dialog_set_accelerator (GNOME_DIALOG(box), 1, 'n', 0); gnome_dialog_set_accelerator (GNOME_DIALOG(box), 0, 'y', 0); gtk_window_set_modal( GTK_WINDOW(box), TRUE); gtk_signal_connect( GTK_OBJECT(box), "clicked", (GtkSignalFunc)ghack_save_game, NULL); gtk_widget_show(box); } static void ghack_new_game(GtkWidget *widget, int button) { if (button == 0) { g_message("This feature is not yet implemented. Sorry."); } } static void ghack_new_game_cb(GtkWidget *widget, gpointer data) { GtkWidget *box; box = gnome_message_box_new(_("Start a new game?"), GNOME_MESSAGE_BOX_QUESTION, GNOME_STOCK_BUTTON_YES, GNOME_STOCK_BUTTON_NO, NULL); gnome_dialog_set_default( GNOME_DIALOG(box), 1); gnome_dialog_set_parent (GNOME_DIALOG (box), GTK_WINDOW (ghack_get_main_window ()) ); gnome_dialog_set_accelerator (GNOME_DIALOG(box), 1, 'n', 0); gnome_dialog_set_accelerator (GNOME_DIALOG(box), 0, 'y', 0); gtk_window_set_modal( GTK_WINDOW(box), TRUE); gtk_signal_connect( GTK_OBJECT(box), "clicked", (GtkSignalFunc)ghack_new_game, NULL); gtk_widget_show(box); } static void about_destroy_callback (void) { about = NULL; } static void ghack_about_cb(GtkWidget *widget, gpointer data) { char buf[BUFSZ]="\0"; char buf1[BUFSZ]="\0"; const gchar *authors[] = {"Erik Andersen", "Anthony Taylor", "Jeff Garzik", "The Nethack Dev Team", NULL}; if (about) { gdk_window_raise (about->window); return; } getversionstring(buf); strcat( buf1, VERSION_STRING); strcat( buf, _("\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", (GtkSignalFunc) about_destroy_callback, NULL); gtk_widget_show(about); } static void ghack_settings_cb(GtkWidget *widget, gpointer data) { ghack_settings_dialog(); } static void ghack_accelerator_selected (GtkWidget *widget, gpointer data) { GdkEventKey event; int key = GPOINTER_TO_INT( data); /* g_message("An accelerator for \"%c\" was selected", key); */ /* stuff a key directly into the keybuffer */ event.state=0; event.keyval=key; ghack_handle_key_press(NULL, &event, NULL); } #ifndef M # ifndef NHSTDC # define M(c) (0x80 | (c)) # else # define M(c) ((c) - 128) # endif /* NHSTDC */ #endif #ifndef C #define C(c) (0x1f & (c)) #endif GnomeUIInfo game_tree[] = { { GNOME_APP_UI_ITEM, N_ ("_Change Settings..."), N_("Change Game Settings"), ghack_settings_cb, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0,0, NULL }, GNOMEUIINFO_SEPARATOR, { GNOME_APP_UI_ITEM, N_("Version"), NULL, ghack_accelerator_selected, GINT_TO_POINTER('v'), NULL, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_ABOUT, 'v',0 }, { GNOME_APP_UI_ITEM, N_("History..."), NULL, ghack_accelerator_selected, GINT_TO_POINTER('V'), NULL, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_ABOUT, 'V',GDK_SHIFT_MASK }, { GNOME_APP_UI_ITEM, N_("Compilation..."), NULL, ghack_accelerator_selected, GINT_TO_POINTER(M('v')), NULL, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_ABOUT,'v',GDK_MOD1_MASK }, { GNOME_APP_UI_ITEM, N_("Options..."), NULL, ghack_accelerator_selected, GINT_TO_POINTER('O'), NULL, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_PREF, 'O', GDK_SHIFT_MASK }, { GNOME_APP_UI_ITEM, N_("Explore Mode..."), NULL, ghack_accelerator_selected, GINT_TO_POINTER('X'), NULL, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_QUIT, 'X', GDK_SHIFT_MASK }, GNOMEUIINFO_SEPARATOR, GNOMEUIINFO_MENU_NEW_GAME_ITEM(ghack_new_game_cb, NULL), GNOMEUIINFO_MENU_SAVE_ITEM(ghack_save_game_cb, NULL), { GNOME_APP_UI_ITEM, N_("Exit"), NULL, ghack_quit_game_cb, GINT_TO_POINTER(M('Q')), NULL, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_ABOUT, 'Q', GDK_MOD1_MASK }, GNOMEUIINFO_END }; GnomeUIInfo edit_menu[] = { { GNOME_APP_UI_ITEM, N_("Inventory"), N_("Edit/View your Inventory"), ghack_accelerator_selected, GINT_TO_POINTER('i'), NULL, GNOME_APP_PIXMAP_NONE, NULL, 'i', 0 }, { GNOME_APP_UI_ITEM, N_("Discoveries"), N_("Edit/View your Discoveries"), ghack_accelerator_selected, GINT_TO_POINTER('\\'), NULL, GNOME_APP_PIXMAP_NONE, NULL, '\\',0 }, { GNOME_APP_UI_ITEM, N_("List/reorder your spells"), N_("List/reorder your spells"), ghack_accelerator_selected, GINT_TO_POINTER('x'), NULL, GNOME_APP_PIXMAP_NONE, NULL, 'x', 0 }, { GNOME_APP_UI_ITEM, N_("Adjust letters"), N_("Adjust letter for items in your Inventory"), ghack_accelerator_selected, GINT_TO_POINTER(M('a')), NULL, GNOME_APP_PIXMAP_NONE, NULL, 'a', GDK_MOD1_MASK }, GNOMEUIINFO_SEPARATOR, { GNOME_APP_UI_ITEM, N_("Name object"), N_("Assign a name to an object"), ghack_accelerator_selected, GINT_TO_POINTER(M('n')), NULL, GNOME_APP_PIXMAP_NONE, NULL, 'n', GDK_MOD1_MASK }, { GNOME_APP_UI_ITEM, N_("Name creature"), N_("Assign a name to a creature"), ghack_accelerator_selected, GINT_TO_POINTER('C'), NULL, GNOME_APP_PIXMAP_NONE, NULL, 'C', GDK_SHIFT_MASK }, GNOMEUIINFO_SEPARATOR, { GNOME_APP_UI_ITEM, N_("Qualifications"), N_("Edit your Qualifications"), ghack_accelerator_selected, GINT_TO_POINTER(M('e')), NULL, GNOME_APP_PIXMAP_NONE, NULL, 'e',GDK_MOD1_MASK }, GNOMEUIINFO_END }; GnomeUIInfo apparel_menu[] = { { GNOME_APP_UI_ITEM, N_("Wield Weapon"), N_("Select a weapon to fight with"), ghack_accelerator_selected, GINT_TO_POINTER('w'), NULL, GNOME_APP_PIXMAP_NONE, NULL, 'w',0 }, { GNOME_APP_UI_ITEM, N_("Remove Apparel..."), N_("Remove apparel dialog bog"), ghack_accelerator_selected, GINT_TO_POINTER('A'), NULL, GNOME_APP_PIXMAP_NONE, NULL, 'A',GDK_SHIFT_MASK }, GNOMEUIINFO_SEPARATOR, { GNOME_APP_UI_ITEM, N_("Wear Armor"), N_("Put on armor"), ghack_accelerator_selected, GINT_TO_POINTER('W'), NULL, GNOME_APP_PIXMAP_NONE, NULL, 'W',GDK_SHIFT_MASK }, { GNOME_APP_UI_ITEM, N_("Take off Armor"), N_("Take off armor you are wearing"), ghack_accelerator_selected, GINT_TO_POINTER('T'), NULL, GNOME_APP_PIXMAP_NONE, NULL, 'T',GDK_SHIFT_MASK }, GNOMEUIINFO_SEPARATOR, { GNOME_APP_UI_ITEM, N_("Put on non-armor"), N_("Put on non-armor apparel"), ghack_accelerator_selected, GINT_TO_POINTER('P'), NULL, GNOME_APP_PIXMAP_NONE, NULL, 'P',GDK_SHIFT_MASK }, { GNOME_APP_UI_ITEM, N_("Remove non-armor"), N_("Remove non-armor apparel you are wearing"), ghack_accelerator_selected, GINT_TO_POINTER('R'), NULL, GNOME_APP_PIXMAP_NONE, NULL, 'R',GDK_SHIFT_MASK }, GNOMEUIINFO_END }; GnomeUIInfo action_menu[] = { { GNOME_APP_UI_ITEM, N_("Get"), N_("Pick up things at the current location"), ghack_accelerator_selected, GINT_TO_POINTER(','), NULL, GNOME_APP_PIXMAP_NONE, NULL, ',',0 }, { GNOME_APP_UI_ITEM, N_("Loot"), N_("loot a box on the floor"), ghack_accelerator_selected, GINT_TO_POINTER(M('l')), NULL, GNOME_APP_PIXMAP_NONE, NULL, 'l',GDK_MOD1_MASK }, { GNOME_APP_UI_ITEM, N_("Sit"), N_("sit down"), ghack_accelerator_selected, GINT_TO_POINTER(M('s')), NULL, GNOME_APP_PIXMAP_NONE, NULL, 's',GDK_MOD1_MASK }, { GNOME_APP_UI_ITEM, N_("Force"), N_("force a lock"), ghack_accelerator_selected, GINT_TO_POINTER(M('f')), NULL, GNOME_APP_PIXMAP_NONE, NULL, 'f',GDK_MOD1_MASK }, { GNOME_APP_UI_ITEM, N_("Kick"), N_("kick something (usually a door)"), ghack_accelerator_selected, GINT_TO_POINTER(C('d')), NULL, GNOME_APP_PIXMAP_NONE, NULL, 'd',GDK_CONTROL_MASK }, { GNOME_APP_UI_ITEM, N_("Jump"), N_("jump to another location"), ghack_accelerator_selected, GINT_TO_POINTER(M('j')), NULL, GNOME_APP_PIXMAP_NONE, NULL, 'j',GDK_MOD1_MASK }, #ifdef STEED { GNOME_APP_UI_ITEM, N_("Ride"), N_("Ride (or stop riding) a monster"), doride, GINT_TO_POINTER(M('r')), NULL, GNOME_APP_PIXMAP_NONE, NULL, 'R',GDK_MOD1_MASK }, #endif { GNOME_APP_UI_ITEM, N_("Wipe face"), N_("wipe off your face"), ghack_accelerator_selected, GINT_TO_POINTER(M('w')), NULL, GNOME_APP_PIXMAP_NONE, NULL, 'w',GDK_MOD1_MASK }, { GNOME_APP_UI_ITEM, N_("Throw/Shoot"), N_("throw or shoot a weapon"), ghack_accelerator_selected, GINT_TO_POINTER('t'), NULL, GNOME_APP_PIXMAP_NONE, NULL, 't',0 }, { GNOME_APP_UI_ITEM, N_("Quiver/Ready"), N_("ready or quiver some ammunition"), ghack_accelerator_selected, GINT_TO_POINTER('Q'), NULL, GNOME_APP_PIXMAP_NONE, NULL, 'Q',GDK_SHIFT_MASK, }, { GNOME_APP_UI_ITEM, N_("Open Door"), N_("open a door"), ghack_accelerator_selected, GINT_TO_POINTER('o'), NULL, GNOME_APP_PIXMAP_NONE, NULL, 'o',0 }, { GNOME_APP_UI_ITEM, N_("Close Door"), N_("open a door"), ghack_accelerator_selected, GINT_TO_POINTER('c'), NULL, GNOME_APP_PIXMAP_NONE, NULL, 'c',0 }, GNOMEUIINFO_SEPARATOR, { GNOME_APP_UI_ITEM, N_("Drop"), N_("drop an object"), ghack_accelerator_selected, GINT_TO_POINTER('d'), NULL, GNOME_APP_PIXMAP_NONE, NULL, 'd',0 }, { GNOME_APP_UI_ITEM, N_("Drop Many"), N_("drop selected types of objects"), ghack_accelerator_selected, GINT_TO_POINTER('D'), NULL, GNOME_APP_PIXMAP_NONE, NULL, 'D',GDK_SHIFT_MASK }, { GNOME_APP_UI_ITEM, N_("Eat"), N_("eat something"), ghack_accelerator_selected, GINT_TO_POINTER('e'), NULL, GNOME_APP_PIXMAP_NONE, NULL, 'e',0 }, { GNOME_APP_UI_ITEM, N_("Engrave"), N_("write a message in the dust on the floor"), ghack_accelerator_selected, GINT_TO_POINTER('E'), NULL, GNOME_APP_PIXMAP_NONE, NULL, 'E',GDK_SHIFT_MASK }, { GNOME_APP_UI_ITEM, N_("Apply"), N_("apply or use a tool (pick-axe, key, camera, etc.)"), ghack_accelerator_selected, GINT_TO_POINTER('a'), NULL, GNOME_APP_PIXMAP_NONE, NULL, 'a',0 }, GNOMEUIINFO_SEPARATOR, { GNOME_APP_UI_ITEM, N_("Up"), N_("go up the stairs"), ghack_accelerator_selected, GINT_TO_POINTER('<'), NULL, GNOME_APP_PIXMAP_NONE, NULL, '<',0 }, { GNOME_APP_UI_ITEM, N_("Down"), N_("go down the stairs"), ghack_accelerator_selected, GINT_TO_POINTER('>'), NULL, GNOME_APP_PIXMAP_NONE, NULL, '>',0 }, { GNOME_APP_UI_ITEM, N_("Rest"), N_("wait for a moment"), ghack_accelerator_selected, GINT_TO_POINTER('.'), NULL, GNOME_APP_PIXMAP_NONE, NULL, '.',0 }, { GNOME_APP_UI_ITEM, N_("Search"), N_("search for secret doors, hidden traps and monsters"), ghack_accelerator_selected, GINT_TO_POINTER('s'), NULL, GNOME_APP_PIXMAP_NONE, NULL, 's',0 }, GNOMEUIINFO_SEPARATOR, { GNOME_APP_UI_ITEM, N_("Chat"), N_("talk to someone"), ghack_accelerator_selected, GINT_TO_POINTER(M('c')), NULL, GNOME_APP_PIXMAP_NONE, NULL, 'c',GDK_MOD1_MASK }, { GNOME_APP_UI_ITEM, N_("Pay"), N_("pay your bill to the shopkeeper"), ghack_accelerator_selected, GINT_TO_POINTER('p'), NULL, GNOME_APP_PIXMAP_NONE, NULL, 'p',0 }, GNOMEUIINFO_END }; GnomeUIInfo magic_menu[] = { { GNOME_APP_UI_ITEM, N_("Quaff potion"), N_("drink a potion"), ghack_accelerator_selected, GINT_TO_POINTER('q'), NULL, GNOME_APP_PIXMAP_NONE, NULL, 'q',0 }, { GNOME_APP_UI_ITEM, N_("Read Book/Scroll"), N_("read a spell book or a scroll"), ghack_accelerator_selected, GINT_TO_POINTER('r'), NULL, GNOME_APP_PIXMAP_NONE, NULL, 'r',0 }, { GNOME_APP_UI_ITEM, N_("Zap Wand"), N_("zap a wand"), ghack_accelerator_selected, GINT_TO_POINTER('z'), NULL, GNOME_APP_PIXMAP_NONE, NULL, 'z',0 }, { GNOME_APP_UI_ITEM, N_("Zap Spell"), N_("cast a spell"), ghack_accelerator_selected, GINT_TO_POINTER('Z'), NULL, GNOME_APP_PIXMAP_NONE, NULL, 'Z',GDK_SHIFT_MASK }, GNOMEUIINFO_SEPARATOR, { GNOME_APP_UI_ITEM, N_("Dip"), N_("dip an object into something"), ghack_accelerator_selected, GINT_TO_POINTER(M('d')), NULL, GNOME_APP_PIXMAP_NONE, NULL, 'd',GDK_MOD1_MASK }, { GNOME_APP_UI_ITEM, N_("Rub"), N_("Rub something (i.e. a lamp)"), ghack_accelerator_selected, GINT_TO_POINTER(M('r')), NULL, GNOME_APP_PIXMAP_NONE, NULL, 'r',GDK_MOD1_MASK }, { GNOME_APP_UI_ITEM, N_("Invoke"), N_("invoke an object's special powers"), ghack_accelerator_selected, GINT_TO_POINTER(M('i')), NULL, GNOME_APP_PIXMAP_NONE, NULL, 'i',GDK_MOD1_MASK }, GNOMEUIINFO_SEPARATOR, { GNOME_APP_UI_ITEM, N_("Offer"), N_("offer a sacrifice to the gods"), ghack_accelerator_selected, GINT_TO_POINTER(M('o')), NULL, GNOME_APP_PIXMAP_NONE, NULL, 'o',GDK_MOD1_MASK }, { GNOME_APP_UI_ITEM, N_("Pray"), N_("pray to the gods for help"), ghack_accelerator_selected, GINT_TO_POINTER(M('p')), NULL, GNOME_APP_PIXMAP_NONE, NULL, 'p',GDK_MOD1_MASK }, GNOMEUIINFO_SEPARATOR, { GNOME_APP_UI_ITEM, N_("Teleport"), N_("teleport (if you can)"), ghack_accelerator_selected, GINT_TO_POINTER(C('t')), NULL, GNOME_APP_PIXMAP_NONE, NULL, 't',GDK_CONTROL_MASK }, { GNOME_APP_UI_ITEM, N_("Monster Action"), N_("use a monster's special ability"), ghack_accelerator_selected, GINT_TO_POINTER(M('m')), NULL, GNOME_APP_PIXMAP_NONE, NULL, 'm',GDK_MOD1_MASK }, { GNOME_APP_UI_ITEM, N_("Turn Undead"), N_("turn undead"), ghack_accelerator_selected, GINT_TO_POINTER(M('t')), NULL, GNOME_APP_PIXMAP_NONE, NULL, 't',GDK_MOD1_MASK }, GNOMEUIINFO_END }; GnomeUIInfo help_menu[] = { { GNOME_APP_UI_ITEM, N_("About..."), N_("About GnomeHack"), ghack_about_cb, NULL, NULL, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_ABOUT, 0, 0, NULL }, { GNOME_APP_UI_ITEM, N_("Help"), NULL, ghack_accelerator_selected, GINT_TO_POINTER('?'), NULL, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_ABOUT, '?', 0 }, GNOMEUIINFO_SEPARATOR, { GNOME_APP_UI_ITEM, N_("What is here"), N_("Check what items occupy the current location"), ghack_accelerator_selected, GINT_TO_POINTER(':'), NULL, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_ABOUT, ':',0 }, { GNOME_APP_UI_ITEM, N_("What is that"), N_("Identify an object"), ghack_accelerator_selected, GINT_TO_POINTER(';'), NULL, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_ABOUT, ';',0 }, { GNOME_APP_UI_ITEM, N_("Identify a map symbol"), N_("Identify a map symbol"), ghack_accelerator_selected, GINT_TO_POINTER('/'), NULL, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_ABOUT, '/',0 }, GNOMEUIINFO_END }; GnomeUIInfo mainmenu[] = { GNOMEUIINFO_MENU_GAME_TREE(game_tree), GNOMEUIINFO_MENU_EDIT_TREE(edit_menu), { GNOME_APP_UI_SUBTREE, N_("Apparel"), NULL, apparel_menu, NULL, NULL, 0, NULL, 0, 0, NULL }, { GNOME_APP_UI_SUBTREE, N_("Action"), NULL, action_menu, NULL, NULL, 0, NULL, 0, 0, NULL }, { GNOME_APP_UI_SUBTREE, N_("Magic"), NULL, magic_menu, NULL, NULL, 0, NULL, 0, 0, NULL }, GNOMEUIINFO_MENU_HELP_TREE(help_menu), GNOMEUIINFO_END }; static void ghack_main_window_key_press(GtkWidget *widget, GdkEventKey *event, gpointer data) { /* First, turn off the key press propogation. We've got the * key, but we don't wan't the underlying Gtk widgets to get it, * since they do the wrong thing with the arrow keys (shift focus)... */ gtk_signal_emit_stop_by_name( GTK_OBJECT(mainWindow), "key_press_event"); /* stuff the key event into the keybuffer */ ghack_handle_key_press(widget, event, data); } /* parsing args */ void parse_args (int argc, char *argv[]) { gint ch; struct option options[] = { /* Default args */ { "help", no_argument, NULL, 'h' }, { "version", no_argument, NULL, 'v' }, { NULL, 0, NULL, 0 } }; gchar *id = NULL; /* initialize getopt */ optarg = NULL; optind = 0; optopt = 0; while( (ch = getopt_long(argc, argv, "hv", options, NULL)) != EOF ) { switch(ch) { case 'h': g_print ( _("%s: A gnomified 'Hello World' program\n\n" "Usage: %s [--help] [--version]\n\n" "Options:\n" " --help display this help and exit\n" " --version output version information and exit\n"), argv[0], argv[0]); exit(0); break; case 'v': g_print (_("NetHack %s.\n"), VERSION_STRING); exit(0); break; case ':': case '?': g_print (_("Options error\n")); exit(0); break; } } /* SM stuff */ session_id = gnome_client_new (); #if 0 session_id = gnome_client_new ( /* callback to save the state and parameter for it */ save_state, argv[0], /* callback to die and parameter for it */ NULL, NULL, /* id from the previous session if restarted, NULL otherwise */ id); #endif /* set the program name */ gnome_client_set_program (session_id, argv[0]); g_free(id); 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; /* It seems that the authors of gnome_score_init() drop group * priveledges. We need group priveledges, so until we change the * way we save games to do things the gnome way(???), this stays * commented out. (after hours of frusteration...) * -Erik */ /* gnome_score_init("gnomehack"); */ gettimeofday(&tv, NULL); srand(tv.tv_usec); uid = getuid(); 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...) */ #if 0 textdomain (PACKAGE); #endif gdk_imlib_init(); /* Main window */ mainWindow = gnome_app_new((char *) "nethack", (char *) N_("Nethack for Gnome")); gtk_widget_realize(mainWindow); if (restarted) { gtk_widget_set_uposition (mainWindow, os_x, os_y); gtk_widget_set_usize (mainWindow, os_w, os_h); } gtk_window_set_default_size( GTK_WINDOW(mainWindow), 800, 600); gtk_window_set_policy(GTK_WINDOW(mainWindow), FALSE, TRUE, TRUE); gnome_app_create_menus(GNOME_APP(mainWindow), mainmenu); gtk_signal_connect(GTK_OBJECT(mainWindow), "key_press_event", GTK_SIGNAL_FUNC(ghack_main_window_key_press), NULL); gtk_signal_connect(GTK_OBJECT(mainWindow), "delete_event", GTK_SIGNAL_FUNC(ghack_quit_game_cb), NULL); /* Put some stuff into our main window */ vBoxMain = gtk_vbox_new (FALSE, 0); hBoxFirstRow = gtk_hbox_new (FALSE, 0); /* pack Boxes into other boxes to produce the right structure */ gtk_box_pack_start (GTK_BOX (vBoxMain), hBoxFirstRow, FALSE, TRUE, 0); /* pack vBoxMain which contains all our widgets into the main window. */ gnome_app_set_contents(GNOME_APP(mainWindow), vBoxMain); /* DONT show the main window yet, due to a Gtk bug that causes it * to not refresh the window when adding widgets after the window * 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) { GtkWidget *vBox; vBox= gtk_vbox_new (TRUE, 0); gtk_box_pack_start (GTK_BOX (vBox), win, TRUE, TRUE, 2); gtk_box_pack_start (GTK_BOX (vBoxMain), vBox, TRUE, TRUE, 2); gtk_widget_show_all(vBox); /* Ok, now show the main window -- now that we have added in * all the windows (relys on nethack displaying the map window last * (This is an ugly kludge, BTW) */ gtk_widget_show_all(mainWindow); } void ghack_main_window_add_message_window(GtkWidget* win) { gtk_box_pack_start (GTK_BOX (hBoxFirstRow), win, TRUE, TRUE, 2); gtk_widget_show_all(win); } void ghack_main_window_add_status_window(GtkWidget* win) { gtk_box_pack_start (GTK_BOX (hBoxFirstRow), win, FALSE, TRUE, 2); gtk_widget_show_all(win); } void ghack_main_window_add_worn_window(GtkWidget* win) { gtk_box_pack_end (GTK_BOX (hBoxFirstRow), win, FALSE, TRUE, 2); gtk_widget_show_all(win); } void ghack_main_window_add_text_window(GtkWidget *win) { g_warning("Fixme!!! AddTextWindow is not yet implemented"); } void ghack_main_window_remove_window(GtkWidget *win) { g_warning("Fixme!!! RemoveWindow is not yet implemented"); } void ghack_main_window_update_inventory() { /* For now, do very little. Eventually we may allow the inv. window to stay active. When we do this, we'll need to implement this... g_warning("Fixme!!! updateInventory is not yet implemented"); */ gnome_display_nhwindow(WIN_WORN, FALSE); } GtkWidget* ghack_get_main_window() { return( GTK_WIDGET(mainWindow) ); } slashem-0.0.7E7F3/win/gnome/gnopts.c0000664000076400007640000000716310545462317015243 0ustar aliali/* SCCS Id: @(#)gnopts.c 3.4 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ #include "gnopts.h" #include "gnglyph.h" #include "gnmain.h" #include "gnmap.h" #include #include #include "hack.h" static gint gn_tileset; static GtkWidget* clist; static void opt_sel_key_hit(GtkWidget *widget, GdkEventKey *event, gpointer data) { int i; for (i = 0; i < no_tilesets; ++i) { if (toupper(tilesets[i].name[0]) == toupper(event->keyval)) { gn_tileset = i; gtk_clist_select_row( GTK_CLIST (clist), i, 0); } } } static void opt_sel_row_selected(GtkCList *cList, int row, int col, GdkEvent *event) { gn_tileset = row; } void ghack_settings_dialog() { int i; static GtkWidget* dialog; static GtkWidget* swin; static GtkWidget* frame1; dialog = gnome_dialog_new (_("GnomeHack Settings"), GNOME_STOCK_BUTTON_OK, 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 (opt_sel_key_hit), tilesets ); frame1 = gtk_frame_new (_("Choose one of the following tilesets:")); gtk_object_set_data (GTK_OBJECT (dialog), "frame1", frame1); gtk_widget_show (frame1); gtk_container_border_width (GTK_CONTAINER (frame1), 3); swin = gtk_scrolled_window_new (NULL, NULL); clist = gtk_clist_new (2); gtk_clist_column_titles_hide (GTK_CLIST (clist)); gtk_widget_set_usize (GTK_WIDGET (clist), 100, 180); gtk_container_add (GTK_CONTAINER (swin), clist); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swin), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_signal_connect (GTK_OBJECT (clist), "select_row", GTK_SIGNAL_FUNC (opt_sel_row_selected), NULL ); gtk_container_add (GTK_CONTAINER (frame1), swin); gtk_box_pack_start_defaults (GTK_BOX (GNOME_DIALOG (dialog)->vbox), frame1); /* Add the tilesets into the list here... */ for (i=0; i < no_tilesets; i++) { gchar accelBuf[BUFSZ]; const char *text[3]={accelBuf, tilesets[i].name,NULL}; if ((tilesets[i].flags & ~TILESET_TRANSPARENT) != 0) continue; /* Unsupported flag set */ sprintf( accelBuf, "%c ", tolower(tilesets[i].name[0])); gtk_clist_insert (GTK_CLIST (clist), i, (char**)text); } gtk_clist_columns_autosize (GTK_CLIST (clist)); gtk_widget_show_all (swin); /* Center the dialog over over parent */ gnome_dialog_set_default( GNOME_DIALOG(dialog), 0); gtk_window_set_modal( GTK_WINDOW(dialog), TRUE); gnome_dialog_set_parent (GNOME_DIALOG (dialog), GTK_WINDOW (ghack_get_main_window ()) ); /* Run the dialog -- returning whichever button was pressed */ i = gnome_dialog_run (GNOME_DIALOG (dialog)); gnome_dialog_close (GNOME_DIALOG (dialog)); /* They hit Quit or error */ if (i != 0 ) { return; } if (gn_tileset < no_tilesets) { if (tilesets[gn_tileset].file[0] != '/') { char *path; path = (char *)alloc(strlen(TILESETDIR) + strlen(tilesets[gn_tileset].file) + 2); sprintf(path, TILESETDIR "/%s", tilesets[gn_tileset].file); ghack_free_glyphs(); if (ghack_init_glyphs(path)) g_error ("ERROR: Could not initialize glyphs.\n"); free(path); } else { ghack_free_glyphs(); if (ghack_init_glyphs(tilesets[gn_tileset].file)) g_error ("ERROR: Could not initialize glyphs.\n"); } ghack_reinit_map_window(); } else { /* This shouldn't happen */ g_warning("This shouldn't happen\n"); } } slashem-0.0.7E7F3/win/gnome/gnstatus.c0000664000076400007640000007672710545462317015615 0ustar aliali/* SCCS Id: @(#)gnstatus.c 3.4 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ #include "gnstatus.h" #include "gnsignal.h" #include "gn_xpms.h" #include "gnomeprv.h" extern const char *hu_stat[]; /* from eat.c */ extern const char *enc_stat[]; /* from botl.c */ void ghack_status_window_update_stats(); void ghack_status_window_clear(GtkWidget *win, gpointer data); void ghack_status_window_destroy(GtkWidget *win, gpointer data); void ghack_status_window_display(GtkWidget *win, boolean block, gpointer data); void ghack_status_window_cursor_to(GtkWidget *win, int x, int y, gpointer data); void ghack_status_window_put_string(GtkWidget *win, int attr, const char* text, gpointer data); static void ghack_fade_highlighting(); static void ghack_highlight_widget( GtkWidget* widget, GtkStyle* oldStyle, GtkStyle* newStyle); /* some junk to handle when to fade the highlighting */ #define NUM_TURNS_HIGHLIGHTED 3 static GList *s_HighLightList; typedef struct { GtkWidget* widget; GtkStyle* oldStyle; int nTurnsLeft; } Highlight; /* Ok, now for a LONG list of widgets... */ static GtkWidget* statTable = NULL; static GtkWidget* titleLabel = NULL; static GtkWidget* dgnLevelLabel = NULL; static GtkWidget* strPix = NULL; static GtkWidget* strLabel = NULL; static GtkWidget* dexPix = NULL; static GtkWidget* dexLabel = NULL; static GtkWidget* intPix = NULL; static GtkWidget* intLabel = NULL; static GtkWidget* wisPix = NULL; static GtkWidget* wisLabel = NULL; static GtkWidget* conPix = NULL; static GtkWidget* conLabel = NULL; static GtkWidget* chaPix = NULL; static GtkWidget* chaLabel = NULL; static GtkWidget* goldLabel = NULL; static GtkWidget* hpLabel = NULL; static GtkWidget* powLabel = NULL; static GtkWidget* acLabel = NULL; static GtkWidget* levlLabel = NULL; static GtkWidget* expLabel = NULL; static GtkWidget* timeLabel = NULL; static GtkWidget* scoreLabel = NULL; static GtkWidget* alignPix = NULL; static GtkWidget* alignLabel = NULL; static GtkWidget* hungerPix = NULL; static GtkWidget* hungerLabel = NULL; static GtkWidget* sickPix = NULL; static GtkWidget* sickLabel = NULL; static GtkWidget* blindPix = NULL; static GtkWidget* blindLabel = NULL; static GtkWidget* stunPix = NULL; static GtkWidget* stunLabel = NULL; static GtkWidget* halluPix = NULL; static GtkWidget* halluLabel = NULL; static GtkWidget* confuPix = NULL; static GtkWidget* confuLabel = NULL; static GtkWidget* encumbPix = NULL; static GtkWidget* encumbLabel = NULL; static GtkStyle* normalStyle = NULL; static GtkStyle* bigStyle = NULL; static GtkStyle* redStyle = NULL; static GtkStyle* greenStyle = NULL; static GtkStyle* bigRedStyle = NULL; static GtkStyle* bigGreenStyle = NULL; /* Pure red */ static GdkColor color_red = { 0, 0xff00, 0, 0 }; /* ForestGreen (looks better than just pure green) */ static GdkColor color_green = { 0, 0x2200, 0x8b00, 0x2200 }; static int lastDepth; static int lastStr; static int lastInt; static int lastWis; static int lastDex; static int lastCon; static int lastCha; static long lastAu; static int lastHP; static int lastMHP; static int lastLevel; static int lastPOW; static int lastMPOW; static int lastAC; static int lastExp; static aligntyp lastAlignment; static unsigned lastHungr; static long lastConf; static long lastBlind; static long lastStun; static long lastHalu; static long lastSick; static int lastEncumb; void ghack_status_window_clear( GtkWidget *win, gpointer data) { /* Don't think we need this at all */ } void ghack_status_window_destroy(GtkWidget *win, gpointer data) { while (s_HighLightList) { g_free( (Highlight*)s_HighLightList->data); s_HighLightList = s_HighLightList->next; } g_list_free( s_HighLightList ); } void ghack_status_window_display( GtkWidget *win, boolean block, gpointer data) { gtk_widget_show_all( GTK_WIDGET(win)); } void ghack_status_window_cursor_to( GtkWidget *win, int x, int y, gpointer data) { /* Don't think we need this at all */ } void ghack_status_window_put_string( GtkWidget *win, int attr, const char* text, gpointer data) { ghack_status_window_update_stats(); } GtkWidget* ghack_init_status_window () { GtkWidget *horizSep0, *horizSep1, *horizSep2, *horizSep3; GtkWidget *statsHBox, *strVBox, *dexVBox, *intVBox, *statHBox; GtkWidget *wisVBox, *conVBox, *chaVBox; GtkWidget *alignVBox, *hungerVBox, *sickVBox, *blindVBox; GtkWidget *stunVBox, *halluVBox, *confuVBox, *encumbVBox; /* Set up a (ridiculous) initial state */ lastDepth = 9999; lastStr = 9999; lastInt = 9999; lastWis = 9999; lastDex = 9999; lastCon = 9999; lastCha = 9999; lastAu = 9999; lastHP = 9999; lastMHP = 9999; lastLevel = 9999; lastPOW = 9999; lastMPOW = 9999; lastAC = 9999; lastExp = 9999; lastAlignment = A_NEUTRAL; /* start off guessing neutral */ lastHungr = 9999; lastConf = 9999; lastBlind = 9999; lastStun = 9999; lastHalu = 9999; lastSick = 9999; lastEncumb = 9999; statTable = gtk_table_new( 10, 8, FALSE); gtk_table_set_row_spacings( GTK_TABLE( statTable), 1); gtk_table_set_col_spacings( GTK_TABLE( statTable), 1); /* Begin the first row of the table -- the title */ titleLabel = gtk_label_new( _("GnomeHack!")); gtk_table_attach( GTK_TABLE( statTable), titleLabel, 0, 8, 0, 1, GTK_FILL, 0, 0, 0); if (!normalStyle) normalStyle = gtk_style_copy ( gtk_widget_get_style (GTK_WIDGET (titleLabel))); /* Set up some styles to draw stuff with */ if (!redStyle) { g_assert (greenStyle == NULL); g_assert (bigStyle == NULL); g_assert (bigRedStyle == NULL); g_assert (bigGreenStyle == NULL); greenStyle = gtk_style_copy (normalStyle); redStyle = gtk_style_copy (normalStyle); bigRedStyle = gtk_style_copy (normalStyle); bigGreenStyle = gtk_style_copy (normalStyle); bigStyle = gtk_style_copy (normalStyle); greenStyle->fg[GTK_STATE_NORMAL] = color_green; redStyle->fg[GTK_STATE_NORMAL] = color_red; bigRedStyle->fg[GTK_STATE_NORMAL] = color_red; bigGreenStyle->fg[GTK_STATE_NORMAL] = color_green; gdk_font_unref (bigRedStyle->font); gdk_font_unref (bigGreenStyle->font); bigRedStyle->font = gdk_font_load("-misc-fixed-*-*-*-*-20-*-*-*-*-*-*-*"); bigGreenStyle->font = gdk_font_load("-misc-fixed-*-*-*-*-20-*-*-*-*-*-*-*"); gdk_font_unref (bigStyle->font); bigStyle->font = gdk_font_load ("-misc-fixed-*-*-*-*-20-*-*-*-*-*-*-*"); } gtk_widget_set_style (GTK_WIDGET (titleLabel), bigStyle); /* Begin the second row */ dgnLevelLabel = gtk_label_new (_ ("Nethack for Gnome")); gtk_table_attach (GTK_TABLE (statTable), dgnLevelLabel, 0, 8, 1, 2, GTK_FILL, 0, 0, 0); gtk_widget_set_style (GTK_WIDGET (dgnLevelLabel), bigStyle); /* Begin the third row */ horizSep0 = gtk_hseparator_new (); gtk_table_attach (GTK_TABLE (statTable), horizSep0, 0, 8, 2, 3, GTK_FILL, GTK_FILL, 0, 0); /* Begin the fourth row */ statsHBox = gtk_hbox_new (TRUE, 0); strVBox = gtk_vbox_new (FALSE, 0); strPix = gnome_pixmap_new_from_xpm_d( str_xpm); strLabel = gtk_label_new( "STR: "); gtk_box_pack_start (GTK_BOX (strVBox), strPix, TRUE, TRUE, 2); gtk_box_pack_start (GTK_BOX (strVBox), strLabel, TRUE, TRUE, 2); gtk_box_pack_start (GTK_BOX(statsHBox), GTK_WIDGET(strVBox), TRUE, TRUE, 2); dexVBox = gtk_vbox_new (FALSE, 0); dexPix = gnome_pixmap_new_from_xpm_d( dex_xpm); dexLabel = gtk_label_new( "DEX: "); gtk_box_pack_start (GTK_BOX (dexVBox), dexPix, TRUE, TRUE, 2); gtk_box_pack_start (GTK_BOX (dexVBox), dexLabel, TRUE, TRUE, 2); gtk_box_pack_start (GTK_BOX(statsHBox), GTK_WIDGET(dexVBox), TRUE, TRUE, 2); conVBox = gtk_vbox_new (FALSE, 0); conPix = gnome_pixmap_new_from_xpm_d( cns_xpm); conLabel = gtk_label_new( "CON: "); gtk_box_pack_start (GTK_BOX (conVBox), conPix, TRUE, TRUE, 2); gtk_box_pack_start (GTK_BOX (conVBox), conLabel, TRUE, TRUE, 2); gtk_box_pack_start (GTK_BOX(statsHBox), GTK_WIDGET(conVBox), TRUE, TRUE, 2); intVBox = gtk_vbox_new (FALSE, 0); intPix = gnome_pixmap_new_from_xpm_d( int_xpm); intLabel = gtk_label_new( "INT: "); gtk_box_pack_start (GTK_BOX (intVBox), intPix, TRUE, TRUE, 2); gtk_box_pack_start (GTK_BOX (intVBox), intLabel, TRUE, TRUE, 2); gtk_box_pack_start (GTK_BOX(statsHBox), GTK_WIDGET(intVBox), TRUE, TRUE, 2); wisVBox = gtk_vbox_new (FALSE, 0); wisPix = gnome_pixmap_new_from_xpm_d( wis_xpm); wisLabel = gtk_label_new( "WIS: "); gtk_box_pack_start (GTK_BOX (wisVBox), wisPix, TRUE, TRUE, 2); gtk_box_pack_start (GTK_BOX (wisVBox), wisLabel, TRUE, TRUE, 2); gtk_box_pack_start (GTK_BOX(statsHBox), GTK_WIDGET(wisVBox), TRUE, TRUE, 2); chaVBox = gtk_vbox_new (FALSE, 0); chaPix = gnome_pixmap_new_from_xpm_d( cha_xpm); chaLabel = gtk_label_new( "CHA: "); gtk_box_pack_start (GTK_BOX (chaVBox), chaPix, TRUE, TRUE, 2); gtk_box_pack_start (GTK_BOX (chaVBox), chaLabel, TRUE, TRUE, 2); gtk_box_pack_start (GTK_BOX(statsHBox), GTK_WIDGET(chaVBox), TRUE, TRUE, 2); gtk_table_attach( GTK_TABLE( statTable), GTK_WIDGET(statsHBox), 0, 8, 3, 4, GTK_FILL, 0, 0, 0); /* Begin the fifth row */ horizSep1 = gtk_hseparator_new(); gtk_table_attach( GTK_TABLE( statTable), horizSep1, 0, 8, 4, 5, GTK_FILL, GTK_FILL, 0, 0); /* Begin the sixth row */ hpLabel = gtk_label_new( "HP: "); gtk_table_attach( GTK_TABLE( statTable), hpLabel, 0, 1, 5, 6, GTK_FILL, 0, 0, 0); acLabel = gtk_label_new( "AC: "); gtk_table_attach( GTK_TABLE( statTable), acLabel, 2, 3, 5, 6, GTK_FILL, 0, 0, 0); powLabel = gtk_label_new( "Power: "); gtk_table_attach( GTK_TABLE( statTable), powLabel, 4, 5, 5, 6, GTK_FILL, 0, 0, 0); goldLabel = gtk_label_new( "Au: "); gtk_table_attach( GTK_TABLE( statTable), goldLabel, 6, 7, 5, 6, GTK_FILL, 0, 0, 0); /* Begin the seventh row */ horizSep2 = gtk_hseparator_new(); gtk_table_attach( GTK_TABLE( statTable), horizSep2, 0, 8, 6, 7, GTK_FILL, GTK_FILL, 0, 0); /* Begin the eigth row */ levlLabel = gtk_label_new( "Level: "); gtk_table_attach( GTK_TABLE( statTable), levlLabel, 0, 1, 7, 8, GTK_FILL, 0, 0, 0); expLabel = gtk_label_new( "Exp: "); gtk_table_attach( GTK_TABLE( statTable), expLabel, 2, 3, 7, 8, GTK_FILL, 0, 0, 0); timeLabel = gtk_label_new( "Time: "); gtk_table_attach( GTK_TABLE( statTable), timeLabel, 4, 5, 7, 8, GTK_FILL, 0, 0, 0); scoreLabel = gtk_label_new( "Score: "); gtk_table_attach( GTK_TABLE( statTable), scoreLabel, 6, 7, 7, 8, GTK_FILL, 0, 0, 0); /* Begin the ninth row */ horizSep3 = gtk_hseparator_new(); gtk_table_attach( GTK_TABLE( statTable), horizSep3, 0, 8, 8, 9, GTK_FILL, GTK_FILL, 0, 0); /* Begin the tenth and last row */ statHBox = gtk_hbox_new (FALSE, 0); alignVBox = gtk_vbox_new (FALSE, 0); alignPix = gnome_pixmap_new_from_xpm_d( neutral_xpm); alignLabel = gtk_label_new( "Neutral"); gtk_box_pack_start (GTK_BOX (alignVBox), alignPix, TRUE, TRUE, 2); gtk_box_pack_start (GTK_BOX (alignVBox), alignLabel, TRUE, TRUE, 2); gtk_box_pack_start (GTK_BOX(statHBox), GTK_WIDGET(alignVBox), TRUE, FALSE, 2); hungerVBox = gtk_vbox_new (FALSE, 0); hungerPix = gnome_pixmap_new_from_xpm_d( hungry_xpm); hungerLabel = gtk_label_new( "Hungry"); gtk_box_pack_start (GTK_BOX (hungerVBox), hungerPix, TRUE, TRUE, 2); gtk_box_pack_start (GTK_BOX (hungerVBox), hungerLabel, TRUE, TRUE, 2); gtk_box_pack_start (GTK_BOX(statHBox), GTK_WIDGET(hungerVBox), TRUE, FALSE, 2); sickVBox = gtk_vbox_new (FALSE, 0); sickPix = gnome_pixmap_new_from_xpm_d( sick_fp_xpm); sickLabel = gtk_label_new( "FoodPois"); gtk_box_pack_start (GTK_BOX (sickVBox), sickPix, TRUE, TRUE, 2); gtk_box_pack_start (GTK_BOX (sickVBox), sickLabel, TRUE, TRUE, 2); gtk_box_pack_start (GTK_BOX(statHBox), GTK_WIDGET(sickVBox), TRUE, FALSE, 2); blindVBox = gtk_vbox_new (FALSE, 0); blindPix = gnome_pixmap_new_from_xpm_d( blind_xpm); blindLabel = gtk_label_new( "Blind"); gtk_box_pack_start (GTK_BOX (blindVBox), blindPix, TRUE, TRUE, 2); gtk_box_pack_start (GTK_BOX (blindVBox), blindLabel, TRUE, TRUE, 2); gtk_box_pack_start (GTK_BOX(statHBox), GTK_WIDGET(blindVBox), TRUE, FALSE, 2); stunVBox = gtk_vbox_new (FALSE, 0); stunPix = gnome_pixmap_new_from_xpm_d( stunned_xpm); stunLabel = gtk_label_new( "Stun"); gtk_box_pack_start (GTK_BOX (stunVBox), stunPix, TRUE, TRUE, 2); gtk_box_pack_start (GTK_BOX (stunVBox), stunLabel, TRUE, TRUE, 2); gtk_box_pack_start (GTK_BOX(statHBox), GTK_WIDGET(stunVBox), TRUE, FALSE, 2); confuVBox = gtk_vbox_new (FALSE, 0); confuPix = gnome_pixmap_new_from_xpm_d( confused_xpm); confuLabel = gtk_label_new( "Confused"); gtk_box_pack_start (GTK_BOX (confuVBox), confuPix, TRUE, TRUE, 2); gtk_box_pack_start (GTK_BOX (confuVBox), confuLabel, TRUE, TRUE, 2); gtk_box_pack_start (GTK_BOX(statHBox), GTK_WIDGET(confuVBox), TRUE, FALSE, 2); halluVBox = gtk_vbox_new (FALSE, 0); halluPix = gnome_pixmap_new_from_xpm_d( hallu_xpm); halluLabel = gtk_label_new( "Hallu"); gtk_box_pack_start (GTK_BOX (halluVBox), halluPix, TRUE, TRUE, 2); gtk_box_pack_start (GTK_BOX (halluVBox), halluLabel, TRUE, TRUE, 2); gtk_box_pack_start (GTK_BOX(statHBox), GTK_WIDGET(halluVBox), TRUE, FALSE, 2); encumbVBox = gtk_vbox_new (FALSE, 0); encumbPix = gnome_pixmap_new_from_xpm_d( slt_enc_xpm); encumbLabel = gtk_label_new( "Burdened"); gtk_box_pack_start (GTK_BOX (encumbVBox), encumbPix, TRUE, TRUE, 2); gtk_box_pack_start (GTK_BOX (encumbVBox), encumbLabel, TRUE, TRUE, 2); gtk_box_pack_start (GTK_BOX(statHBox), GTK_WIDGET(encumbVBox), TRUE, FALSE, 2); gtk_table_attach( GTK_TABLE( statTable), GTK_WIDGET(statHBox), 0, 8, 9, 10, GTK_FILL, GTK_FILL, 0, 0); /* Set up the necessary signals */ gtk_signal_connect (GTK_OBJECT (statTable), "ghack_fade_highlight", GTK_SIGNAL_FUNC (ghack_fade_highlighting), NULL); gtk_signal_connect (GTK_OBJECT (statTable), "ghack_putstr", GTK_SIGNAL_FUNC (ghack_status_window_put_string), NULL); gtk_signal_connect (GTK_OBJECT (statTable), "ghack_clear", GTK_SIGNAL_FUNC (ghack_status_window_clear), NULL); gtk_signal_connect (GTK_OBJECT (statTable), "ghack_curs", GTK_SIGNAL_FUNC (ghack_status_window_cursor_to), NULL); gtk_signal_connect(GTK_OBJECT (statTable), "gnome_delay_output", GTK_SIGNAL_FUNC(ghack_delay), NULL); /* Lastly, show the status window and everything in it */ gtk_widget_show_all( statTable); return GTK_WIDGET(statTable); } void ghack_status_window_update_stats() { char buf[BUFSZ]; gchar *buf1; 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); if ('a' <= buf[0] && buf[0] <= 'z') buf[0] += 'A'-'a'; strcat(buf, " the "); if (u.mtimedone) { char mname[BUFSZ]; int k = 0; strcpy(mname, mons[u.umonnum].mname); while(mname[k] != 0) { if ((k == 0 || (k > 0 && mname[k-1] == ' ')) && 'a' <= mname[k] && mname[k] <= 'z') { mname[k] += 'A' - 'a'; } k++; } strcat(buf, mname); } else { strcat(buf, rank_of(u.ulevel, pl_character[0], flags.female)); } gtk_label_get( GTK_LABEL( titleLabel), &buf1); if (strcmp( buf1, buf) != 0 && firstTime==FALSE) { /* Ok, this changed so add it to the highlighing list */ ghack_highlight_widget( titleLabel, bigStyle, bigGreenStyle); } gtk_label_set( GTK_LABEL( titleLabel), buf); if (In_endgame(&u.uz)) { strcpy(buf, (Is_astralevel(&u.uz) ? "Astral Plane":"End Game")); } else { sprintf(buf, "%s, level %d", dungeons[u.uz.dnum].dname, depth(&u.uz)); } if (lastDepth > depth(&u.uz) && firstTime==FALSE) { /* Ok, this changed so add it to the highlighing list */ ghack_highlight_widget( dgnLevelLabel, bigStyle, bigRedStyle); } else if (lastDepth < depth(&u.uz) && firstTime==FALSE) { /* Ok, this changed so add it to the highlighing list */ ghack_highlight_widget( dgnLevelLabel, bigStyle, bigGreenStyle); } lastDepth = depth(&u.uz); gtk_label_set( GTK_LABEL( dgnLevelLabel), buf); /* Next, fill in the player's stats */ if (ACURR(A_STR) > 118) { sprintf(buf,"STR:%d",ACURR(A_STR)-100); } else if (ACURR(A_STR)==118) { sprintf(buf,"STR:18/**"); } else if(ACURR(A_STR) > 18) { sprintf(buf,"STR:18/%02d",ACURR(A_STR)-18); } else { sprintf(buf,"STR:%d",ACURR(A_STR)); } if (lastStr < ACURR(A_STR) && firstTime==FALSE) { /* Ok, this changed so add it to the highlighing list */ ghack_highlight_widget( strLabel, normalStyle, greenStyle); } else if (lastStr > ACURR(A_STR) && firstTime==FALSE) { /* Ok, this changed so add it to the highlighing list */ ghack_highlight_widget( strLabel, normalStyle, redStyle); } lastStr = ACURR(A_STR); gtk_label_set( GTK_LABEL( strLabel), buf); sprintf(buf,"INT:%d",ACURR(A_INT)); if (lastInt < ACURR(A_INT) && firstTime==FALSE) { /* Ok, this changed so add it to the highlighing list */ ghack_highlight_widget( intLabel, normalStyle, greenStyle); } else if (lastInt > ACURR(A_INT) && firstTime==FALSE) { /* Ok, this changed so add it to the highlighing list */ ghack_highlight_widget( intLabel, normalStyle, redStyle); } lastInt = ACURR(A_INT); gtk_label_set( GTK_LABEL( intLabel), buf); sprintf(buf,"WIS:%d",ACURR(A_WIS)); if (lastWis < ACURR(A_WIS) && firstTime==FALSE) { /* Ok, this changed so add it to the highlighing list */ ghack_highlight_widget( wisLabel, normalStyle, greenStyle); } else if (lastWis > ACURR(A_WIS) && firstTime==FALSE) { /* Ok, this changed so add it to the highlighing list */ ghack_highlight_widget( wisLabel, normalStyle, redStyle); } lastWis = ACURR(A_WIS); gtk_label_set( GTK_LABEL( wisLabel), buf); sprintf(buf,"DEX:%d",ACURR(A_DEX)); if (lastDex < ACURR(A_DEX) && firstTime==FALSE) { /* Ok, this changed so add it to the highlighing list */ ghack_highlight_widget( dexLabel, normalStyle, greenStyle); } else if (lastDex > ACURR(A_DEX) && firstTime==FALSE) { /* Ok, this changed so add it to the highlighing list */ ghack_highlight_widget( dexLabel, normalStyle, redStyle); } lastDex = ACURR(A_DEX); gtk_label_set( GTK_LABEL( dexLabel), buf); sprintf(buf,"CON:%d",ACURR(A_CON)); if (lastCon < ACURR(A_CON) && firstTime==FALSE) { /* Ok, this changed so add it to the highlighing list */ ghack_highlight_widget( conLabel, normalStyle, greenStyle); } else if (lastCon > ACURR(A_CON) && firstTime==FALSE) { /* Ok, this changed so add it to the highlighing list */ ghack_highlight_widget( conLabel, normalStyle, redStyle); } lastCon = ACURR(A_CON); gtk_label_set( GTK_LABEL( conLabel), buf); sprintf(buf,"CHA:%d",ACURR(A_CHA)); if (lastCha < ACURR(A_CHA) && firstTime==FALSE) { /* Ok, this changed so add it to the highlighing list */ ghack_highlight_widget( chaLabel, normalStyle, greenStyle); } else if (lastCha > ACURR(A_CHA) && firstTime==FALSE) { /* Ok, this changed so add it to the highlighing list */ ghack_highlight_widget( chaLabel, normalStyle, redStyle); } lastCha = ACURR(A_CHA); 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", umoney); 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) { /* special case: when polymorphed, show "HD", disable exp */ sprintf(buf,"HP:%d/%d", ( (u.mh > 0)? u.mh : 0), u.mhmax); if ((lastHP < u.mh || lastMHP < u.mhmax ) && firstTime==FALSE) { /* Ok, this changed so add it to the highlighing list */ ghack_highlight_widget( hpLabel, normalStyle, greenStyle); } else if ((lastHP > u.mh || lastMHP > u.mhmax ) && firstTime==FALSE) { /* Ok, this changed so add it to the highlighing list */ ghack_highlight_widget( hpLabel, normalStyle, redStyle); } lastHP = u.mh; lastMHP = u.mhmax; } else { sprintf(buf,"HP:%d/%d", ( (u.uhp > 0)? u.uhp : 0), u.uhpmax); if ((lastHP < u.uhp || lastMHP < u.uhpmax ) && firstTime==FALSE) { /* Ok, this changed so add it to the highlighing list */ ghack_highlight_widget( hpLabel, normalStyle, greenStyle); } else if ((lastHP > u.uhp || lastMHP > u.uhpmax ) && firstTime==FALSE) { /* Ok, this changed so add it to the highlighing list */ ghack_highlight_widget( hpLabel, normalStyle, redStyle); } lastHP = u.uhp; lastMHP = u.uhpmax; } gtk_label_set( GTK_LABEL( hpLabel), buf); if (u.mtimedone) { /* special case: when polymorphed, show "HD", disable exp */ sprintf(buf,"HD:%d", mons[u.umonnum].mlevel); if (lastLevel < mons[u.umonnum].mlevel && firstTime==FALSE) { /* Ok, this changed so add it to the highlighing list */ ghack_highlight_widget( levlLabel, normalStyle, greenStyle); } else if (lastLevel > mons[u.umonnum].mlevel && firstTime==FALSE) { /* Ok, this changed so add it to the highlighing list */ ghack_highlight_widget( levlLabel, normalStyle, redStyle); } lastLevel = mons[u.umonnum].mlevel; } else { sprintf(buf,"Level:%d", u.ulevel); if (lastLevel < u.ulevel && firstTime==FALSE) { /* Ok, this changed so add it to the highlighing list */ ghack_highlight_widget( levlLabel, normalStyle, greenStyle); } else if (lastLevel > u.ulevel && firstTime==FALSE) { /* Ok, this changed so add it to the highlighing list */ ghack_highlight_widget( levlLabel, normalStyle, redStyle); } lastLevel = u.ulevel; } gtk_label_set( GTK_LABEL( levlLabel), buf); sprintf(buf,"Power:%d/%d", u.uen, u.uenmax); if ((lastPOW < u.uen || lastMPOW < u.uenmax) && firstTime==FALSE) { /* Ok, this changed so add it to the highlighing list */ ghack_highlight_widget( powLabel, normalStyle, greenStyle); } if ((lastPOW > u.uen || lastMPOW > u.uenmax) && firstTime==FALSE) { /* Ok, this changed so add it to the highlighing list */ ghack_highlight_widget( powLabel, normalStyle, redStyle); } lastPOW = u.uen; lastMPOW = u.uenmax; gtk_label_set( GTK_LABEL( powLabel), buf); sprintf(buf,"AC:%d", u.uac); if (lastAC > u.uac && firstTime==FALSE) { /* Ok, this changed so add it to the highlighing list */ ghack_highlight_widget( acLabel, normalStyle, greenStyle); } else if (lastAC < u.uac && firstTime==FALSE) { /* Ok, this changed so add it to the highlighing list */ ghack_highlight_widget( acLabel, normalStyle, redStyle); } lastAC = u.uac; gtk_label_set( GTK_LABEL( acLabel), buf); #ifdef EXP_ON_BOTL if (flags.showexp) { sprintf(buf,"Exp:%ld", u.uexp); if (lastExp < u.uexp && firstTime==FALSE) { /* Ok, this changed so add it to the highlighing list */ ghack_highlight_widget( expLabel, normalStyle, greenStyle); } else if (lastExp > u.uexp && firstTime==FALSE) { /* Ok, this changed so add it to the highlighing list */ ghack_highlight_widget( expLabel, normalStyle, redStyle); } lastExp = u.uexp; gtk_label_set( GTK_LABEL( expLabel), buf); } else #endif { gtk_label_set( GTK_LABEL( expLabel), ""); } if (flags.time) { sprintf(buf,"Time:%ld", moves); gtk_label_set( GTK_LABEL( timeLabel), buf); } else gtk_label_set( GTK_LABEL( timeLabel), ""); #ifdef SCORE_ON_BOTL if (flags.showscore) { sprintf(buf,"Score:%ld", botl_score()); gtk_label_set( GTK_LABEL( scoreLabel), buf); } else gtk_label_set( GTK_LABEL( scoreLabel), ""); #else { gtk_label_set( GTK_LABEL( scoreLabel), ""); } #endif /* See if their alignment has changed */ if (lastAlignment != u.ualign.type) { if (firstTime==FALSE) { /* Ok, this changed so add it to the highlighing list */ ghack_highlight_widget( alignLabel, normalStyle, redStyle); } lastAlignment = u.ualign.type; /* looks like their alignment has changed -- change out the icon */ if (u.ualign.type==A_CHAOTIC) { gtk_label_set( GTK_LABEL( alignLabel), "Chaotic"); gnome_pixmap_load_xpm_d( GNOME_PIXMAP(alignPix), chaotic_xpm); } else if (u.ualign.type==A_NEUTRAL) { gtk_label_set( GTK_LABEL( alignLabel), "Neutral"); gnome_pixmap_load_xpm_d( GNOME_PIXMAP(alignPix), neutral_xpm); } else { gtk_label_set( GTK_LABEL( alignLabel), "Lawful"); gnome_pixmap_load_xpm_d( GNOME_PIXMAP(alignPix), lawful_xpm); } } hung=hu_stat[u.uhs]; if (lastHungr != u.uhs) { if (firstTime==FALSE) { /* Ok, this changed so add it to the highlighing list */ ghack_highlight_widget( hungerLabel, normalStyle, redStyle); } lastHungr = u.uhs; if (hung[0]==' ') { gtk_label_set( GTK_LABEL( hungerLabel), " "); gnome_pixmap_load_xpm_d( GNOME_PIXMAP(hungerPix), nothing_xpm); } else if (u.uhs == 0 /* SATIATED */) { gtk_label_set( GTK_LABEL( hungerLabel), hung); gnome_pixmap_load_xpm_d( GNOME_PIXMAP(hungerPix), satiated_xpm); } else { gtk_label_set( GTK_LABEL( hungerLabel), hung); gnome_pixmap_load_xpm_d( GNOME_PIXMAP(hungerPix), hungry_xpm); } } if (lastConf != Confusion) { if (firstTime==FALSE) { /* Ok, this changed so add it to the highlighing list */ ghack_highlight_widget( confuLabel, normalStyle, redStyle); } lastConf = Confusion; if (Confusion) { gtk_label_set( GTK_LABEL( confuLabel), "Confused"); gnome_pixmap_load_xpm_d( GNOME_PIXMAP(confuPix), confused_xpm); } else { gtk_label_set( GTK_LABEL( confuLabel), " "); gnome_pixmap_load_xpm_d( GNOME_PIXMAP(confuPix), nothing_xpm); } } if (lastBlind != Blind) { if (firstTime==FALSE) { /* Ok, this changed so add it to the highlighing list */ ghack_highlight_widget( blindLabel, normalStyle, redStyle); } lastBlind = Blind; if (Blind) { gtk_label_set( GTK_LABEL( blindLabel), "Blind"); gnome_pixmap_load_xpm_d( GNOME_PIXMAP(blindPix), blind_xpm); } else { gtk_label_set( GTK_LABEL( blindLabel), " "); gnome_pixmap_load_xpm_d( GNOME_PIXMAP(blindPix), nothing_xpm); } } if (lastStun != Stunned) { if (firstTime==FALSE) { /* Ok, this changed so add it to the highlighing list */ ghack_highlight_widget( stunLabel, normalStyle, redStyle); } lastStun = Stunned; if (Stunned) { gtk_label_set( GTK_LABEL( stunLabel), "Stun"); gnome_pixmap_load_xpm_d( GNOME_PIXMAP(stunPix), stunned_xpm); } else { gtk_label_set( GTK_LABEL( stunLabel), " "); gnome_pixmap_load_xpm_d( GNOME_PIXMAP(stunPix), nothing_xpm); } } if (lastHalu != Hallucination) { if (firstTime==FALSE) { /* Ok, this changed so add it to the highlighing list */ ghack_highlight_widget( halluLabel, normalStyle, redStyle); } lastHalu = Hallucination; if (Hallucination) { gtk_label_set( GTK_LABEL( halluLabel), "Hallu"); gnome_pixmap_load_xpm_d( GNOME_PIXMAP(halluPix), hallu_xpm); } else { gtk_label_set( GTK_LABEL( halluLabel), " "); gnome_pixmap_load_xpm_d( GNOME_PIXMAP(halluPix), nothing_xpm); } } if (lastSick != Sick) { if (firstTime==FALSE) { /* Ok, this changed so add it to the highlighing list */ ghack_highlight_widget( sickLabel, normalStyle, redStyle); } lastSick = Sick; if (Sick) { if (u.usick_type & SICK_VOMITABLE) { gtk_label_set( GTK_LABEL( sickLabel), "FoodPois"); gnome_pixmap_load_xpm_d( GNOME_PIXMAP(sickPix), sick_fp_xpm); } else if (u.usick_type & SICK_NONVOMITABLE) { gtk_label_set( GTK_LABEL( sickLabel), "Ill"); gnome_pixmap_load_xpm_d( GNOME_PIXMAP(sickPix), sick_il_xpm); } else { gtk_label_set( GTK_LABEL( sickLabel), "FoodPois"); gnome_pixmap_load_xpm_d( GNOME_PIXMAP(sickPix), sick_fp_xpm); } } else { gtk_label_set( GTK_LABEL( sickLabel), " "); gnome_pixmap_load_xpm_d( GNOME_PIXMAP(sickPix), nothing_xpm); } } enc=enc_stat[near_capacity()]; if (lastEncumb != near_capacity()) { if (firstTime==FALSE) { /* Ok, this changed so add it to the highlighing list */ ghack_highlight_widget( encumbLabel, normalStyle, redStyle); } lastEncumb = near_capacity(); switch ( lastEncumb ) { case 0: gtk_label_set( GTK_LABEL( encumbLabel), " "); gnome_pixmap_load_xpm_d( GNOME_PIXMAP(encumbPix), nothing_xpm); break; case 1: gtk_label_set( GTK_LABEL( encumbLabel), enc); gnome_pixmap_load_xpm_d( GNOME_PIXMAP(encumbPix), slt_enc_xpm); break; case 2: gtk_label_set( GTK_LABEL( encumbLabel), enc); gnome_pixmap_load_xpm_d( GNOME_PIXMAP(encumbPix), mod_enc_xpm); break; case 3: gtk_label_set( GTK_LABEL( encumbLabel), enc); gnome_pixmap_load_xpm_d( GNOME_PIXMAP(encumbPix), hvy_enc_xpm); break; case 4: gtk_label_set( GTK_LABEL( encumbLabel), enc); gnome_pixmap_load_xpm_d( GNOME_PIXMAP(encumbPix), ext_enc_xpm); break; case 5: gtk_label_set( GTK_LABEL( encumbLabel), enc); gnome_pixmap_load_xpm_d( GNOME_PIXMAP(encumbPix), ovr_enc_xpm); } } firstTime=FALSE; } static void ghack_fade_highlighting() { GList *item; Highlight *highlt; /* Remove any items from the queue if their time is up */ for (item = g_list_first( s_HighLightList) ; item ; ) { highlt = (Highlight*) item->data; if (highlt) { if ( highlt->nTurnsLeft <= 0) { gtk_widget_set_style( GTK_WIDGET( highlt->widget), highlt->oldStyle); s_HighLightList = g_list_remove_link(s_HighLightList, item); g_free( highlt); g_list_free_1( item); item = g_list_first( s_HighLightList); continue; } else (highlt->nTurnsLeft)--; } if (item) item=item->next; else break; } } /* Widget changed, so add it to the highlighing list */ static void ghack_highlight_widget( GtkWidget* widget, GtkStyle* oldStyle, GtkStyle* newStyle) { Highlight *highlt; GList *item; /* Check if this widget is already in the queue. If so then * remove it, so we will only have the new entry in the queue */ for (item = g_list_first( s_HighLightList) ; item ; ) { highlt = (Highlight*) item->data; if (highlt) { if ( highlt->widget == widget) { s_HighLightList = g_list_remove_link(s_HighLightList, item); g_free( highlt); g_list_free_1( item); break; } } if (item) item=item->next; else break; } /* Ok, now highlight this widget and add it into the fade * highlighting queue */ highlt = g_new( Highlight, 1); highlt->nTurnsLeft=NUM_TURNS_HIGHLIGHTED; highlt->oldStyle=oldStyle; highlt->widget=widget; s_HighLightList = g_list_prepend (s_HighLightList, highlt); gtk_widget_set_style( GTK_WIDGET( widget), newStyle); } slashem-0.0.7E7F3/win/gnome/gnplayer.h0000664000076400007640000000055310545462317015553 0ustar aliali/* 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 */ slashem-0.0.7E7F3/win/gnome/gnmenu.c0000664000076400007640000005364310545462317015226 0ustar aliali/* SCCS Id: @(#)gnmenu.c 3.4 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ #include #include #include #include "gnmenu.h" #include "gnmain.h" #include "gnbind.h" #include "func_tab.h" typedef enum { MenuUnknown = 0, MenuText, MenuMenu } MenuWinType; typedef struct { ANY_P identifier; gchar accelerator[BUFSZ]; int itemNumber; int selected; } menuItem; typedef struct { int curItem; int numRows; int charIdx; guint32 lastTime; } extMenu; static GdkColor color_blue = { 0, 0, 0, 0xffff }; static void ghack_menu_window_key(GtkWidget *menuWin, GdkEventKey *event, gpointer data) { int i, numRows; menuItem* item; MenuWinType isMenu; isMenu = (MenuWinType) GPOINTER_TO_INT (gtk_object_get_data (GTK_OBJECT (menuWin), "isMenu")); if (isMenu == MenuMenu) { GtkWidget *clist; gint selection_mode; clist = GTK_WIDGET(gtk_object_get_data (GTK_OBJECT (menuWin), "clist")); g_assert (clist != NULL); numRows = GPOINTER_TO_INT (gtk_object_get_data(GTK_OBJECT(clist), "numRows")); selection_mode = GPOINTER_TO_INT (gtk_object_get_data (GTK_OBJECT(clist), "selection_mode")); for (i = 0; i <= numRows; ++i) { item = (menuItem*) gtk_clist_get_row_data(GTK_CLIST(clist), i); if (item == NULL) continue; if (!strcmp(item->accelerator, "")) continue; if ((!strcmp(item->accelerator, event->string)) || ((selection_mode == GTK_SELECTION_MULTIPLE) && (event->keyval == ','))) { if (item->selected) { gtk_clist_unselect_row( GTK_CLIST (clist), item->itemNumber, 0); item->selected = FALSE; } else { gtk_clist_select_row(GTK_CLIST (clist), item->itemNumber, 0); if (gtk_clist_row_is_visible(GTK_CLIST(clist), item->itemNumber) != GTK_VISIBILITY_FULL) gtk_clist_moveto(GTK_CLIST(clist), item->itemNumber, 0, 0.5, 0); item->selected = TRUE; } } } } } static void ghack_menu_row_selected (GtkCList *clist, int row, int col, GdkEvent *event) { /* FIXME: Do something */ } void ghack_menu_window_clear(GtkWidget *menuWin, gpointer data) { MenuWinType isMenu; int i, numRows; menuItem* item; isMenu = (MenuWinType) GPOINTER_TO_INT (gtk_object_get_data (GTK_OBJECT (menuWin), "isMenu")); if (isMenu == MenuMenu) { GtkWidget *clist; clist = GTK_WIDGET (gtk_object_get_data (GTK_OBJECT (menuWin), "clist")); g_assert (clist != NULL); /* destroy existing menu data, if any */ if (clist) { /* destroy all the row_data we stored in the clist */ numRows = GPOINTER_TO_INT( gtk_object_get_data( GTK_OBJECT(clist), "numRows") ); for( i=0; itext), 0, 0); } } void ghack_menu_window_display(GtkWidget *menuWin, gboolean blocking, gpointer data) { //if(blocking) { gnome_dialog_close_hides (GNOME_DIALOG (menuWin), TRUE); gnome_dialog_set_close (GNOME_DIALOG (menuWin), TRUE); gnome_dialog_run_and_close(GNOME_DIALOG (menuWin)); //} //else { //gtk_widget_show(menuWin); //} } gint ghack_menu_hide( GtkWidget *menuWin, GdkEvent *event, gpointer data ) { gtk_widget_hide (menuWin); return FALSE; /* FIXME: what is correct result here? */ } void ghack_menu_window_start_menu (GtkWidget *menuWin, gpointer data) { GtkWidget *frame1, *swin, *clist; MenuWinType isMenu; g_assert (menuWin != NULL); g_assert (data == NULL); /* destroy existing menu data, if any */ frame1 = gtk_object_get_data (GTK_OBJECT (menuWin), "frame1"); if (frame1) gtk_widget_destroy (frame1); isMenu = MenuMenu; gtk_object_set_data (GTK_OBJECT (menuWin), "isMenu", GINT_TO_POINTER (isMenu)); gtk_widget_set_usize (GTK_WIDGET (menuWin), 500, 400); gtk_window_set_policy (GTK_WINDOW (menuWin), TRUE, TRUE, FALSE); frame1 = gtk_frame_new ("Make your selection"); g_assert (frame1 != NULL); gtk_object_set_data (GTK_OBJECT(menuWin), "frame1", frame1); gtk_widget_show (GTK_WIDGET (frame1)); gtk_container_set_border_width (GTK_CONTAINER (frame1), 5); gtk_box_pack_start (GTK_BOX (GNOME_DIALOG(menuWin)->vbox), frame1, TRUE, TRUE, 0); swin = gtk_scrolled_window_new (NULL, NULL); g_assert (swin != NULL); gtk_object_set_data (GTK_OBJECT(menuWin), "swin", swin); gtk_widget_show (GTK_WIDGET (swin)); gtk_container_add (GTK_CONTAINER (frame1), swin); clist = gtk_clist_new (4); g_assert (clist != NULL); gtk_object_set_data (GTK_OBJECT(menuWin), "clist", clist); gtk_widget_show (GTK_WIDGET (clist)); gtk_container_add (GTK_CONTAINER (swin), clist); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swin), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_signal_connect (GTK_OBJECT (clist), "select_row", GTK_SIGNAL_FUNC (ghack_menu_row_selected), NULL); gtk_object_set_data (GTK_OBJECT (clist), "numItems", GINT_TO_POINTER (-1)); } int ghack_menu_window_select_menu (GtkWidget *menuWin, MENU_ITEM_P **_selected, gint how) { gint rc; guint num_sel, i, idx; GtkWidget *clist; GList *cur; MENU_ITEM_P *selected = NULL; menuItem* item; g_assert (_selected != NULL); *_selected = NULL; if (how == PICK_NONE) { gnome_dialog_close_hides (GNOME_DIALOG (menuWin), TRUE); rc = gnome_dialog_run_and_close (GNOME_DIALOG (menuWin)); return( rc == 1 ? -1 : 0); } clist = GTK_WIDGET (gtk_object_get_data (GTK_OBJECT (menuWin), "clist")); g_assert (clist != NULL); gtk_object_set_data (GTK_OBJECT (clist), "selection_mode", GINT_TO_POINTER ((how == PICK_ANY)? GTK_SELECTION_MULTIPLE : GTK_SELECTION_SINGLE)); gtk_clist_set_selection_mode (GTK_CLIST (clist), (how == PICK_ANY)? GTK_SELECTION_MULTIPLE : GTK_SELECTION_SINGLE); gnome_dialog_close_hides (GNOME_DIALOG (menuWin), TRUE); rc = gnome_dialog_run_and_close (GNOME_DIALOG (menuWin)); if ((rc == 1) || (GTK_CLIST (clist)->selection == NULL)) { return(-1); } num_sel = g_list_length (GTK_CLIST (clist)->selection); if (num_sel < 1) { return(-1); } /* fill in array with selections from clist */ selected = g_new0( MENU_ITEM_P, num_sel); g_assert (selected != NULL); cur = GTK_CLIST (clist)->selection; i = 0; while (cur) { g_assert (i < num_sel); /* grab row number from clist selection list */ idx = GPOINTER_TO_INT (cur->data); item = (menuItem*) gtk_clist_get_row_data( GTK_CLIST (clist), idx); selected[i].item = item->identifier; selected[i].count = -1; cur = g_list_next(cur); i++; } *_selected = selected; return( (int) num_sel); } void ghack_menu_window_add_menu( GtkWidget *menuWin, gpointer menu_item, gpointer data) { GHackMenuItem* item; GtkWidget *clist; gchar buf[BUFSZ]="", accelBuf[BUFSZ]=""; gchar *pbuf; char *text[4] = { buf, NULL, NULL, NULL }; gint nCurrentRow = -1, numItems = -1; MenuWinType isMenu; GtkStyle *bigStyle = NULL; gboolean item_selectable; GdkImlibImage* image; static gboolean special; g_assert (menu_item != NULL); item = (GHackMenuItem*) menu_item; item_selectable = ( item->identifier->a_int == 0)? FALSE : TRUE; isMenu = (MenuWinType) GPOINTER_TO_INT (gtk_object_get_data (GTK_OBJECT (menuWin), "isMenu")); clist = GTK_WIDGET (gtk_object_get_data (GTK_OBJECT (menuWin), "clist")); g_assert (clist != NULL); /* This is a special kludge to make the special hidden help menu item work as designed */ if ( special==TRUE ) { special=FALSE; item_selectable=TRUE; } if ( ! strcmp( item->str, "The NetHack license.")) { special=TRUE; } if (item->str) { /* First, make a new blank entry in the clist */ nCurrentRow = gtk_clist_append (GTK_CLIST (clist), text); if (item->glyph != NO_GLYPH) { image = ghack_image_from_glyph( item->glyph, FALSE); if (image==NULL || image->pixmap==NULL) { g_warning("Bummer -- having to force rendering for glyph %d!", item->glyph); /* wierd -- pixmap is NULL so retry rendering it */ image = ghack_image_from_glyph( item->glyph, TRUE); } if (image==NULL || image->pixmap==NULL) { g_error("Aiiee! glyph is still NULL for item\n\"%s\"", item->str); } else gtk_clist_set_pixmap (GTK_CLIST (clist), nCurrentRow, 1, gdk_imlib_move_image( image), gdk_imlib_move_mask( image)); } if (item->accelerator) { /* FIXME: handle accelerator, */ g_snprintf(accelBuf, sizeof(accelBuf), "%c ", item->accelerator); gtk_clist_set_text (GTK_CLIST (clist), nCurrentRow, 0, accelBuf); g_snprintf(buf, sizeof(buf), "%s", item->str); gtk_clist_set_text (GTK_CLIST (clist), nCurrentRow, 2, buf); } else { if (item->group_accel) { /* FIXME: maybe some day I should try to handle * group accelerators... */ } if (( (item->attr == 0) && (item->identifier->a_int != 0)) || (special ==TRUE) ) { numItems = GPOINTER_TO_INT( gtk_object_get_data( GTK_OBJECT(clist), "numItems") )+1; /* Ok, now invent a unique accelerator */ if ( ('a'+numItems) <= 'z' ) { g_snprintf(accelBuf, sizeof(accelBuf), "%c ", 'a'+numItems); gtk_clist_set_text(GTK_CLIST(clist), nCurrentRow, 0, accelBuf); } else if ( ('A'+numItems-26)<='Z') { g_snprintf(accelBuf, sizeof(accelBuf), "%c ", 'A'+numItems-26); gtk_clist_set_text(GTK_CLIST(clist), nCurrentRow, 0, accelBuf); } else { accelBuf[0] = buf[0] = 0; } g_snprintf(buf, sizeof(buf), "%s", item->str); gtk_clist_set_text (GTK_CLIST (clist), nCurrentRow, 2, buf); gtk_object_set_data (GTK_OBJECT (clist), "numItems", GINT_TO_POINTER (numItems)); /* This junk is to specially handle the options menu */ pbuf = strstr( buf, " ["); if (pbuf == NULL) { pbuf = strstr( buf, "\t["); } if (pbuf != NULL) { *pbuf=0; pbuf++; gtk_clist_set_text (GTK_CLIST (clist), nCurrentRow, 3, pbuf); } } /* FIXME: handle more than 26*2 accelerators (but how? * since I only have so many keys to work with???) else { foo(); } */ else { g_snprintf(buf, sizeof(buf), "%s", item->str); pbuf = strstr( buf, " ["); if (pbuf == NULL) { pbuf = strstr( buf, "\t["); } if (pbuf != NULL) { *pbuf=0; pbuf++; gtk_clist_set_text (GTK_CLIST (clist), nCurrentRow, 3, pbuf); } gtk_clist_set_text (GTK_CLIST (clist), nCurrentRow, 2, buf); } } if (item->attr) { switch(item->attr) { case ATR_ULINE: case ATR_BOLD: case ATR_BLINK: case ATR_INVERSE: bigStyle = gtk_style_copy (GTK_WIDGET (clist)->style); g_assert (bigStyle != NULL); gdk_font_unref (bigStyle->font); bigStyle->font = gdk_font_load ( "-misc-fixed-*-*-*-*-20-*-*-*-*-*-*-*"); bigStyle->fg[GTK_STATE_NORMAL] = color_blue; gtk_clist_set_cell_style (GTK_CLIST (clist), nCurrentRow, 2, bigStyle); item_selectable = FALSE; } } g_assert (nCurrentRow >= 0); gtk_clist_set_selectable (GTK_CLIST (clist), nCurrentRow, item_selectable); if ( item_selectable==TRUE && item->presel== TRUE) { /* pre-select this item */ gtk_clist_select_row( GTK_CLIST (clist), nCurrentRow, 0); } gtk_object_set_data (GTK_OBJECT (clist), "numRows", GINT_TO_POINTER (nCurrentRow)); /* We have to allocate memory here, since the menu_item currently * lives on the stack, and will otherwise go to the great bit bucket * in the sky as soon as this function exits, which would leave a * pointer to crap in the row_data. Use g_memdup to make a private, * persistant copy of the item identifier. * * We need to arrange to blow away this memory somewhere (like * ghack_menu_destroy and ghack_menu_window_clear for example). * * -Erik */ { menuItem newItem; menuItem *pNewItem; newItem.identifier = *item->identifier; newItem.itemNumber=nCurrentRow; newItem.selected=FALSE; newItem.accelerator[0]=0; /* only copy 1 char, since accel keys are by definition 1 char */ if (accelBuf[0]) { strncpy(newItem.accelerator, accelBuf, 1); } newItem.accelerator[1]=0; pNewItem = g_memdup(&newItem, sizeof( menuItem)); gtk_clist_set_row_data (GTK_CLIST (clist), nCurrentRow, (gpointer) pNewItem); } } /* Now adjust the column widths to match the contents */ gtk_clist_columns_autosize (GTK_CLIST (clist)); } void ghack_menu_window_end_menu (GtkWidget *menuWin, gpointer data) { const char* p = (const char*) data; if ((p) && (*p)) { GtkWidget *frame1 = gtk_object_get_data (GTK_OBJECT (menuWin), "frame1"); g_assert (frame1 != NULL); gtk_frame_set_label (GTK_FRAME(frame1), p); } } void ghack_menu_window_put_string(GtkWidget *menuWin, int attr, const char* text, gpointer data) { GnomeLess *gless; MenuWinType isMenu; if (text == NULL) return; isMenu = (MenuWinType) GPOINTER_TO_INT (gtk_object_get_data (GTK_OBJECT (menuWin), "isMenu")); if (isMenu == MenuText) { gless = GNOME_LESS (gtk_object_get_data (GTK_OBJECT (menuWin), "gless")); g_assert (gless != NULL); g_assert (gless->text != NULL); g_assert (GTK_IS_TEXT (gless->text)); /* Don't bother with attributes yet */ gtk_text_insert (GTK_TEXT (gless->text), NULL, NULL, NULL, text, -1); gtk_text_insert (GTK_TEXT (gless->text), NULL, NULL, NULL, "\n", -1); } else if (isMenu == MenuUnknown) { isMenu = MenuText; gtk_object_set_data (GTK_OBJECT (menuWin), "isMenu", GINT_TO_POINTER (isMenu)); gtk_widget_set_usize (GTK_WIDGET (menuWin), 500, 400); gtk_window_set_policy (GTK_WINDOW (menuWin), TRUE, TRUE, FALSE); gless = GNOME_LESS (gnome_less_new ()); g_assert (gless != NULL); gtk_object_set_data (GTK_OBJECT (menuWin), "gless", gless); gtk_widget_show (GTK_WIDGET (gless)); gnome_less_show_string (gless, text); gtk_text_insert (GTK_TEXT (gless->text), NULL, NULL, NULL, "\n", -1); gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (menuWin)->vbox), GTK_WIDGET (gless), TRUE, TRUE, 0); } } void ghack_menu_destroy (GtkWidget *menuWin, gpointer data) { MenuWinType isMenu; isMenu = (MenuWinType) GPOINTER_TO_INT (gtk_object_get_data (GTK_OBJECT (menuWin), "isMenu")); if (isMenu == MenuText) { GnomeLess *gless; gless = GNOME_LESS (gtk_object_get_data (GTK_OBJECT (menuWin), "gless")); g_assert (gless != NULL); g_assert (gless->text != NULL); g_assert (GTK_IS_TEXT (gless->text)); gtk_widget_destroy(GTK_WIDGET(gless)); } else if (isMenu == MenuMenu) { GtkWidget *frame1, *swin, *clist; /* destroy existing menu data, if any */ clist = gtk_object_get_data (GTK_OBJECT (menuWin), "clist"); if (clist) { /* destroy all the row_data we stored in the clist */ int i, numRows; menuItem* item; numRows = GPOINTER_TO_INT( gtk_object_get_data( GTK_OBJECT(clist), "numRows") ); for( i=0; istring[0]; clist = GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(menuWin), "clist")); g_assert(clist != NULL); /* if too long between keystrokes, reset to initial state */ if (event->time - info->lastTime > 500) goto init_state; /* see if current item continue to match */ if (info->charIdx > 0) { if (extcmdlist[info->curItem].ef_txt[info->charIdx] == c) { ++info->charIdx; goto found; } } /* see if the prefix matches a later command in the list */ if (info->curItem >= 0) { for (i = info->curItem + 1; i < info->numRows; ++i) { if (!strncmp(extcmdlist[info->curItem].ef_txt, extcmdlist[i].ef_txt, info->charIdx)) { if (extcmdlist[i].ef_txt[info->charIdx] == c) { ++info->charIdx; info->curItem = i; goto found; } } } } init_state: /* reset to initial state, look for matching 1st character */ for (i = 0; i < info->numRows; ++i) { if (extcmdlist[i].ef_txt[0] == c) { info->charIdx = 1; info->curItem = i; goto found; } } /* no match: leave prior, if any selection in place */ return; found: info->lastTime = event->time; gtk_clist_select_row(GTK_CLIST(clist), info->curItem, 0); if (gtk_clist_row_is_visible(GTK_CLIST(clist), info->curItem) != GTK_VISIBILITY_FULL) gtk_clist_moveto(GTK_CLIST(clist), info->curItem, 0, 0.5, 0); } int ghack_menu_ext_cmd(void) { int n; GtkWidget* dialog; GtkWidget* swin; GtkWidget* frame1; GtkWidget* clist; extMenu info; dialog = gnome_dialog_new("Extended Commands", GNOME_STOCK_BUTTON_OK, 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(ghack_ext_key_hit), &info); frame1 = gtk_frame_new("Make your selection"); gtk_object_set_data(GTK_OBJECT(dialog), "frame1", frame1); gtk_widget_show(frame1); gtk_container_border_width(GTK_CONTAINER(frame1), 3); swin = gtk_scrolled_window_new(NULL, NULL); clist = gtk_clist_new(2); gtk_object_set_data(GTK_OBJECT(dialog), "clist", clist); gtk_widget_set_usize(clist, 500, 400); gtk_container_add(GTK_CONTAINER(swin), clist); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(swin), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_signal_connect(GTK_OBJECT(clist), "select_row", GTK_SIGNAL_FUNC(ghack_menu_row_selected), NULL); gtk_container_add(GTK_CONTAINER(frame1), swin); gtk_box_pack_start_defaults(GTK_BOX(GNOME_DIALOG(dialog)->vbox), frame1); /* Add the extended commands into the list here... */ for (n = 0; extcmdlist[n].ef_txt; ++n) { const char *text[3]={extcmdlist[n].ef_txt,extcmdlist[n].ef_desc,NULL}; gtk_clist_insert(GTK_CLIST(clist), n, (char**) text); } /* fill in starting info fields */ info.curItem = -1; info.numRows = n; info.charIdx = 0; info.lastTime = 0; gtk_clist_columns_autosize(GTK_CLIST(clist)); gtk_widget_show_all(swin); /* Center the dialog over over parent */ gnome_dialog_set_default(GNOME_DIALOG(dialog), 0); gtk_window_set_modal(GTK_WINDOW(dialog), TRUE); gnome_dialog_set_parent(GNOME_DIALOG(dialog), GTK_WINDOW(ghack_get_main_window())); /* Run the dialog -- returning whichever button was pressed */ n = gnome_dialog_run_and_close(GNOME_DIALOG(dialog)); /* Quit on button 2 or error */ return (n != 0) ? -1 : info.curItem; } slashem-0.0.7E7F3/win/gnome/gnglyph.c0000664000076400007640000001366110545462317015401 0ustar aliali/* 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" /* from tile.c */ extern int tiles_per_row; extern int tiles_per_col; extern int total_tiles_used; /* from tile.c */ extern int total_tiles_used; static GHackGlyphs ghack_glyphs; static GdkImlibImage** ghack_tiles = NULL; /* NAME: * ghack_init_glyphs(char* xpm_file) * * ARGUMENTS: * char *xpm_file -- The name of the image file. * May be any image format imlib recognizes. * Does not have to be XPM. * * RETURNS: * TRUE upon successful loading of the glyphs. * FALSE upon failure. * * PURPOSE: * Constructor for the Glyph object. Well, really each glyph * object is a collection of glyphs, or tiles. This constructor * takes a single argument: the name of the image file that contains * the tile images. * * NOTES: * The glyphs (tiles) must be in the image in a certain way: the * glyphs must be arranged such that the resultant image is * TILE_X * tiles_per_row wide, and TILE_Y * tiles_per_col high. * In this sense, TILE_X and TILE_Y can be any reasonable integers-- * say, 16 <= TILE_X,Y <= 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 left of * the image, while Glyph N (the last glyph) is the last tile on the * bottom row. * * What's the difference between a glyph and a tile? Well, a * tile is just an image. A glyph is a tile that knows its * place in line. * * This initializer relies heavily on gdk_imlib. Thanks, Rasterman. */ int ghack_init_glyphs(const char *xpmFile) { ghack_glyphs.im = gdk_imlib_load_image((char *) xpmFile); if ( ! ghack_glyphs.im ) { g_error("Couldn't load required xpmFile!"); return -1; } 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) != 0 || ghack_glyphs.im->rgb_width <= tiles_per_row || (ghack_glyphs.im->rgb_height % tiles_per_col) != 0 || ghack_glyphs.im->rgb_height <= tiles_per_col) { g_error("%s is not a multiple of %d, %d (tiles/row, tiles/col) pixels wide", xpmFile, tiles_per_row, tiles_per_col); return -1; } ghack_glyphs.width = ghack_glyphs.im->rgb_width / tiles_per_row; ghack_glyphs.height = ghack_glyphs.im->rgb_height / tiles_per_col; ghack_glyphs.count = total_tiles_used; ghack_tiles = g_new0( GdkImlibImage*, ghack_glyphs.count ); return (ghack_tiles == NULL) ? -1 : 0; } void ghack_free_glyphs( ) { int i; for ( i=0 ; i= ghack_glyphs.count || tile < 0 ) { g_warning("Aiiee! I've was asked for a tile outside the allowed range!\n" "Email this to other-gnomehack@lists.debian.org"); g_warning("Max tile: %d Tile asked for: %d", ghack_glyphs.count, tile); return NULL; } if (ghack_glyphs.im == NULL) { g_warning("Aiiee! I've been asked to clone from a null image.\n" "Email this to other-gnomehack@lists.debian.org"); g_warning( "making image from tile %d, force=%s\n", tile, (force==TRUE)? "TRUE": "FALSE"); } if (force == TRUE) { g_warning("Aiiee! I've been asked to force rendering.\n" "Email this to other-gnomehack@lists.debian.org"); g_warning( "making image from tile %d, force=%s\n", tile, (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, tile * ghack_glyphs.width, ghack_glyphs.height, ghack_glyphs.width); #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.width, ghack_glyphs.height); } if (ghack_tiles[tile] && (!ghack_tiles[tile]->pixmap || force)) { if ( gdk_imlib_render(ghack_tiles[tile], ghack_tiles[tile]->rgb_width, ghack_tiles[tile]->rgb_height) == 0) { g_error("GLYPH: couldn't create tile # %d", tile); } if ( !ghack_tiles[tile]->pixmap ) g_error("Strange, tile # %d didn't get rendered???", tile); } return ghack_tiles[tile]; } slashem-0.0.7E7F3/win/gnome/gnmenu.h0000664000076400007640000000137010545462317015221 0ustar aliali/* SCCS Id: @(#)gnmenu.h 3.4 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ #ifndef GnomeHackMenuWindow_h #define GnomeHackMenuWindow_h #include #include "config.h" #include "global.h" #include "gnomeprv.h" GtkWidget* ghack_init_menu_window( void ); struct _GHackMenuItem { int glyph; const ANY_P *identifier; CHAR_P accelerator; CHAR_P group_accel; int attr; const char* str; BOOLEAN_P presel; }; typedef struct _GHackMenuItem GHackMenuItem; int ghack_menu_window_select_menu (GtkWidget *menuWin, MENU_ITEM_P **_selected, gint how); int ghack_menu_ext_cmd(void); #endif /* GnomeHackMenuWindow_h */ slashem-0.0.7E7F3/win/gnome/gnworn.h0000664000076400007640000000054110545462317015241 0ustar aliali/* SCCS Id: @(#)gnbind.c 3.4 2002/04/15 */ /* Copyright (C) 2002 by Dylan Alex Simon */ /* NetHack may be freely redistributed. See license for details. */ #ifndef GnomeHackWornWindow_h #define GnomeHackWornWindow_h #include #include "config.h" #include "global.h" GtkWidget* ghack_init_worn_window(); #endif /* GnomeHackWornWindow_h */ slashem-0.0.7E7F3/win/gnome/gnaskstr.h0000664000076400007640000000065410545462317015570 0ustar aliali/* SCCS Id: @(#)gnaskstr.h 3.4 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ #ifndef GnomeHackAskStringDialog_h #define GnomeHackAskStringDialog_h int ghack_ask_string_dialog(const char *szMessageStr, const char *szDefaultStr, const char *szTitleStr, char *buffer); #endif /* GnomeHackAskStringDialog_h */ slashem-0.0.7E7F3/win/gnome/gnplayer.c0000664000076400007640000000613510545462317015550 0ustar aliali/* 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; static GtkWidget* clist; 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 (tolower(roles[i][0]) == tolower(event->keyval)) { role_number = i; gtk_clist_select_row( GTK_CLIST (clist), i, 0); if (gtk_clist_row_is_visible(GTK_CLIST(clist), i) != GTK_VISIBILITY_FULL) gtk_clist_moveto(GTK_CLIST(clist), i, 0, 0.5, 0); } } } static void player_sel_row_selected (GtkCList *clist, int row, int col, GdkEvent *event) { role_number = row; } 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); swin = gtk_scrolled_window_new (NULL, NULL); clist = gtk_clist_new (2); gtk_clist_column_titles_hide (GTK_CLIST (clist)); gtk_widget_set_usize (GTK_WIDGET (clist), 100, 180); gtk_container_add (GTK_CONTAINER (swin), clist); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swin), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_signal_connect (GTK_OBJECT (clist), "select_row", GTK_SIGNAL_FUNC (player_sel_row_selected), NULL ); gtk_container_add (GTK_CONTAINER (frame1), swin); 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); } gtk_clist_columns_autosize (GTK_CLIST (clist)); gtk_widget_show_all (swin); /* Center the dialog over over parent */ gnome_dialog_set_default( GNOME_DIALOG(dialog), 0); gtk_window_set_modal( GTK_WINDOW(dialog), TRUE); gnome_dialog_set_parent (GNOME_DIALOG (dialog), GTK_WINDOW (ghack_get_main_window ()) ); /* Run the dialog -- returning whichever button was pressed */ i = gnome_dialog_run_and_close(GNOME_DIALOG(dialog)); /* 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); } slashem-0.0.7E7F3/win/gnome/gnstatus.h0000664000076400007640000000057610545462317015607 0ustar aliali/* SCCS Id: @(#)gnstatus.h 3.4 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ #ifndef GnomeHackStatusWindow_h #define GnomeHackStatusWindow_h #include #include "config.h" #include "global.h" GtkWidget* ghack_init_status_window (); #endif /* GnomeHackStatusWindow_h */ slashem-0.0.7E7F3/win/gnome/gnopts.h0000664000076400007640000000046210545462317015243 0ustar aliali/* SCCS Id: @(#)gnopts.h 3.4 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ #ifndef GnomeHackSettings_h #define GnomeHackSettings_h void ghack_settings_dialog( void); #endif /* GnomeHackSettings.h */ slashem-0.0.7E7F3/win/gnome/gnmap.c0000664000076400007640000004302110545462317015024 0ustar aliali/* 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. */ #include "gnmap.h" #include "gnglyph.h" #include "gnsignal.h" #include "hack.h" #ifndef ROWNO #define ROWNO 21 #define COLNO 80 #endif /* globals static to this file go here */ struct { GnomeCanvas *canvas; GnomeCanvasImage *map[(ROWNO + 1) * COLNO]; GnomeCanvasImage *overlay[(ROWNO + 1) * COLNO]; double zoom; GtkWidget *frame; } ghack_map; static GdkImlibImage *background; static GdkImlibImage *petmark; static GnomeCanvasGroup *myCanvasGroup; /* static function declarations -- local to this file go here */ void ghack_map_cursor_to( GtkWidget *win, int x, int y, gpointer data); void ghack_map_putstr( GtkWidget *win, int attr, const char* text, gpointer data); void ghack_map_print_glyph( GtkObject *win, guint x, guint y, GdkImlibImage *im, gpointer data); void ghack_map_clear( GtkWidget *win, gpointer data); static void ghack_map_display( GtkWidget *win, boolean block, gpointer data); static void ghack_map_cliparound( GtkWidget *win, int x, int y, gpointer data); static void ghack_map_window_zoom( GtkAdjustment *adj, gpointer data); /* The following XPM is the artwork of Warwick Allison * . It has been borrowed from * the most excellent NetHackQt, until such time as * we can come up with something better. * * More information about NetHackQt can be had from: * http://www.troll.no/~warwick/nethack/ */ /* XPM */ static char *pet_mark_xpm[] = { /* width height ncolors chars_per_pixel */ "8 7 2 1", /* colors */ ". c None", " c #FF0000", /* pixels */ "........", ".. . .", ". ", ". ", ".. .", "... ..", ".... ..." }; /* NAME: * ghack_init_map_window( ) * * ARGUMENTS: * NONE * * RETURNS: * GtkWidget* * * PURPOSE: * Create the basic map necessities. Create a canvas; * give it a background. Attach all the right signals * to all the right places. Generally prepare the map * to behave properly. */ GtkWidget* ghack_init_map_window ( ) { GtkWidget *vbox; GtkWidget *hbox; GtkWidget *table; GtkWidget *frame; GtkWidget *w; GtkWidget *hSeparator; GtkAdjustment *adj; GnomeCanvasImage *bg; double width, height, x, y; int i; char *path; width = COLNO * ghack_glyph_width(); height = ROWNO * ghack_glyph_height(); vbox = gtk_vbox_new (FALSE, 4); gtk_container_set_border_width (GTK_CONTAINER (vbox), 4); gtk_widget_show (vbox); /* Add in a horiz seperator */ hSeparator = gtk_hseparator_new (); gtk_box_pack_start (GTK_BOX (vbox), hSeparator, FALSE, FALSE, 2); gtk_widget_show ( hSeparator); hbox = gtk_hbox_new (FALSE, 4); gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); gtk_widget_show (hbox); /* Create the Zoom spinbutton. */ ghack_map.zoom = 1.0; w = gtk_label_new ("Zoom:"); gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 0); gtk_widget_show (w); adj = GTK_ADJUSTMENT (gtk_adjustment_new (1.00, 0.5, 3.00, 0.05, 0.50, 0.50)); w = gtk_spin_button_new (adj, 0.5, 2); gtk_widget_set_usize (w, 50, 0); gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 0); gtk_widget_show (w); /* Canvas and scrollbars */ gtk_widget_push_visual (gdk_imlib_get_visual ()); gtk_widget_push_colormap (gdk_imlib_get_colormap ()); ghack_map.canvas = GNOME_CANVAS (gnome_canvas_new()); //gtk_widget_push_visual(gdk_rgb_get_visual()); //gtk_widget_push_colormap(gdk_rgb_get_cmap()); //ghack_map.canvas = GNOME_CANVAS (gnome_canvas_new_aa()); gtk_widget_pop_colormap(); gtk_widget_pop_visual(); gtk_widget_show (GTK_WIDGET(ghack_map.canvas)); table = gtk_table_new (2, 2, FALSE); gtk_table_set_row_spacings (GTK_TABLE (table), 4); gtk_table_set_col_spacings (GTK_TABLE (table), 4); gtk_box_pack_start (GTK_BOX (vbox), table, TRUE, TRUE, 0); gtk_widget_show (table); frame = gtk_frame_new (NULL); ghack_map.frame = frame; gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN); gtk_table_attach (GTK_TABLE (table), frame, 0, 1, 0, 1, GTK_EXPAND | GTK_FILL | GTK_SHRINK, GTK_EXPAND | GTK_FILL | GTK_SHRINK, 0, 0); gtk_widget_show (frame); gtk_container_add (GTK_CONTAINER (frame), GTK_WIDGET(ghack_map.canvas)); gnome_canvas_set_scroll_region (GNOME_CANVAS(ghack_map.canvas), 0, 0, width+2*ghack_glyph_width(), height+2*ghack_glyph_height()); gnome_canvas_set_pixels_per_unit (GNOME_CANVAS(ghack_map.canvas), 1.0); w = gtk_hscrollbar_new (GTK_LAYOUT (ghack_map.canvas)->hadjustment); gtk_table_attach (GTK_TABLE (table), w, 0, 1, 1, 2, GTK_EXPAND | GTK_FILL | GTK_SHRINK, GTK_FILL, 0, 0); gtk_widget_show (w); w = gtk_vscrollbar_new (GTK_LAYOUT (ghack_map.canvas)->vadjustment); gtk_table_attach (GTK_TABLE (table), w, 1, 2, 0, 1, GTK_FILL, GTK_EXPAND | GTK_FILL | GTK_SHRINK, 0, 0); gtk_widget_show (w); myCanvasGroup = GNOME_CANVAS_GROUP ( gnome_canvas_item_new ( gnome_canvas_root(GNOME_CANVAS(ghack_map.canvas)), gnome_canvas_group_get_type (), "x", 0.0, "y", 0.0, NULL) ); /* Tile the map background with a pretty image */ #ifdef FILE_AREAS path = (char *)alloc(strlen(FILE_AREA_SHARE) + 11); strcpy(path, FILE_AREA_SHARE "/mapbg.xpm"); #else path = "mapbg.xpm"; #endif background = gdk_imlib_load_image(path); #ifdef FILE_AREAS free(path); #endif 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) { for (x = 0; x < width+background->rgb_width; x+=background->rgb_width) { bg = GNOME_CANVAS_IMAGE( gnome_canvas_item_new ( myCanvasGroup, gnome_canvas_image_get_type (), "x", (double) x, "y", (double) y, "width", (double) background->rgb_width, "height", (double) background->rgb_height, "image", background, "anchor", (GtkAnchorType) GTK_ANCHOR_CENTER, NULL) ); gnome_canvas_item_lower_to_bottom (GNOME_CANVAS_ITEM( bg)); } } } /* ghack_map.map is an array of canvas images. Each cell of * the array will contain one tile. Here, we create the * space for the cells and then create the cells for easy * access later. */ for (i=0, y = 0; y < height; y+=ghack_glyph_height()) { for (x = 0; x < width; x+=ghack_glyph_width()) { ghack_map.map[i++] = GNOME_CANVAS_IMAGE( gnome_canvas_item_new ( myCanvasGroup, gnome_canvas_image_get_type (), "x", (double) x, "y", (double) y, "width", (double) ghack_glyph_width(), "height", (double) ghack_glyph_height(), "anchor", GTK_ANCHOR_NORTH_WEST, NULL) ); } } /* 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()) { ghack_map.overlay[i] = GNOME_CANVAS_IMAGE( gnome_canvas_item_new ( myCanvasGroup, gnome_canvas_image_get_type (), "x", (double) x, "y", (double) y, "width", (double) petmark->rgb_width, "height", (double) petmark->rgb_height, "image", petmark, "anchor", GTK_ANCHOR_NORTH_WEST, NULL) ); gnome_canvas_item_lower_to_bottom ( GNOME_CANVAS_ITEM( ghack_map.overlay[i++])); } } } /* Resize the canvas when the spinbutton changes */ gtk_signal_connect (GTK_OBJECT (adj), "value_changed", (GtkSignalFunc) ghack_map_window_zoom, ghack_map.canvas); /* Game signals */ gtk_signal_connect (GTK_OBJECT (vbox), "ghack_curs", GTK_SIGNAL_FUNC (ghack_map_cursor_to), NULL); gtk_signal_connect (GTK_OBJECT (vbox), "ghack_putstr", GTK_SIGNAL_FUNC (ghack_map_putstr), NULL); gtk_signal_connect (GTK_OBJECT (vbox), "ghack_print_glyph", GTK_SIGNAL_FUNC (ghack_map_print_glyph), NULL); gtk_signal_connect (GTK_OBJECT (vbox), "ghack_clear", GTK_SIGNAL_FUNC (ghack_map_clear), NULL); gtk_signal_connect (GTK_OBJECT (vbox), "ghack_display", GTK_SIGNAL_FUNC (ghack_map_display), NULL); gtk_signal_connect (GTK_OBJECT (vbox), "ghack_cliparound", GTK_SIGNAL_FUNC (ghack_map_cliparound), NULL); gtk_signal_connect (GTK_OBJECT (ghack_map.canvas), "button_press_event", GTK_SIGNAL_FUNC (ghack_handle_button_press), NULL); gtk_signal_connect(GTK_OBJECT (ghack_map.canvas), "gnome_delay_output", GTK_SIGNAL_FUNC(ghack_delay), NULL); return GTK_WIDGET(vbox); } /* NAME: * ghack_map_window_zoom * * ARGUMENTS: * double zoom -- The zoom factor * * RETURNS: * Nothing. * * PURPOSE: * Zoom the map image in and out. This should allow the user to * dynamically scale the map. Ideally, the background should * *NOT* scale, but this may be impractical. */ static void ghack_map_window_zoom( GtkAdjustment *adj, gpointer data) { if ( adj->value > 3.0 ) adj->value = 3.0; if ( adj->value < 0.5 ) adj->value = 0.5; ghack_map.zoom = adj->value; gnome_canvas_set_pixels_per_unit (data, adj->value); } void ghack_map_cursor_to( GtkWidget *win, int x, int y, gpointer data) { GnomeCanvasGroup *group; static GnomeCanvasRE *cursor = NULL; double x1, y1, x2, y2; float hp; guint r, g, b; x1 = x * ghack_glyph_width() - 1; y1 = y * ghack_glyph_height() - 1; x2 = x1 + ghack_glyph_width() + 2; y2 = y1 + ghack_glyph_height() + 2; hp = u.mtimedone ? (u.mhmax ? (float)u.mh/u.mhmax : 1) : (u.uhpmax ? (float)u.uhp/u.uhpmax : 1); r = 255; g = (hp >= 0.75) ? 255 : (hp >= 0.25 ? 255*2*(hp-0.25) : 0); b = (hp >= 0.75) ? 255*4*(hp-0.75) : (hp >= 0.25 ? 0 : 255*4*(0.25-hp)); group = gnome_canvas_root(GNOME_CANVAS(ghack_map.canvas)); if (!cursor) { cursor = GNOME_CANVAS_RE (gnome_canvas_item_new (group, gnome_canvas_rect_get_type (), "width_units", 1.0, NULL)); } gnome_canvas_item_set (GNOME_CANVAS_ITEM (cursor), "outline_color_rgba", GNOME_CANVAS_COLOR(r, g, b), "x1", x1, "y1", y1, "x2", x2, "y2", y2, NULL); gnome_canvas_item_raise_to_top( GNOME_CANVAS_ITEM( cursor)); gnome_canvas_item_show( GNOME_CANVAS_ITEM(cursor)); } void ghack_map_putstr( GtkWidget *win, int attr, const char* text, gpointer data) { g_warning("Fixme!!! ghack_map_putstr is not implemented"); } /* NAME: * ghack_map_print_glyph( ) * * ARGUMENTS: * XCHAR_P x, y -- The coordinates where which to print the glyph * GdkImlibImage* glyph -- The glyph image to print * * RETURNS: * Nothing. * * PURPOSE: * Draw the glyph-tile at the specified coordinates. */ void ghack_map_print_glyph( GtkObject *win, guint x, guint y, GdkImlibImage *im, gpointer data) { GnomeCanvasGroup *group; int i = y * COLNO + x; int glyph = glyph_at(x,y); GnomeCanvasImage *canvas_image = GNOME_CANVAS_IMAGE( ghack_map.map[i]); group = gnome_canvas_root (GNOME_CANVAS (ghack_map.canvas)); gnome_canvas_item_set (GNOME_CANVAS_ITEM ( canvas_image), "image", im, NULL); gnome_canvas_item_show( GNOME_CANVAS_ITEM( canvas_image)); canvas_image = GNOME_CANVAS_IMAGE( ghack_map.overlay[i]); if (x==u.ux && y==u.uy) ghack_map_cliparound(NULL, x, y, NULL); if (glyph_is_pet(glyph) #ifdef TEXTCOLOR && iflags.hilite_pet #endif ) { gnome_canvas_item_raise_to_top( GNOME_CANVAS_ITEM( canvas_image)); gnome_canvas_item_show( GNOME_CANVAS_ITEM( canvas_image)); } else { gnome_canvas_item_hide( GNOME_CANVAS_ITEM( canvas_image)); } } /* NAME: * ghack_map_clear( ) * * ARGUMENTS: * NONE * * RETURNS: * Nothing. * * PURPOSE: * Clear the map by hiding all the map tiles. */ void ghack_map_clear( GtkWidget *win, gpointer data) { int i; for (i = 0; i < ROWNO * COLNO; i++) { if (GNOME_IS_CANVAS_IMAGE(ghack_map.map[i])) { gnome_canvas_item_hide( GNOME_CANVAS_ITEM (ghack_map.map[i])); } if (GNOME_IS_CANVAS_IMAGE(ghack_map.overlay[i])) { gnome_canvas_item_hide( GNOME_CANVAS_ITEM (ghack_map.overlay[i])); } } gnome_canvas_update_now ( GNOME_CANVAS(ghack_map.canvas)); } void ghack_map_display( GtkWidget *win, boolean block, gpointer data) { gtk_widget_show_all( GTK_WIDGET(win)); } void ghack_map_cliparound( GtkWidget *win, int x, int y, gpointer data) { int map_width, map_height; int to_x, to_y; int cur_x, cur_y; int width, height, half_width, half_height; x *= ghack_glyph_width() * ghack_map.zoom; y *= ghack_glyph_height() * ghack_map.zoom; map_width = COLNO * ghack_glyph_width() * ghack_map.zoom; map_height = ROWNO * ghack_glyph_height() * ghack_map.zoom; gdk_window_get_size( GTK_LAYOUT (ghack_map.canvas)->bin_window, &width, &height); gnome_canvas_get_scroll_offsets( ghack_map.canvas, &cur_x, &cur_y); half_width = width * 0.5; half_height = height * 0.5; if ( ((x - cur_x) < (width * 0.25) ) || ( (x - cur_x) > (width * 0.75) ) ) { to_x = ((x-half_width) > 0)? x - half_width : 0; to_x = ((x+half_width) > map_width)? map_width - 2 * half_width : to_x; } else { to_x = cur_x; } if ( ((y - cur_y) < (height * 0.25) ) || ( (y - cur_y) > (height * 0.75) ) ) { to_y = ((y-half_height) > 0)? y - half_height : 0; to_y = ((y+half_height) > map_height)? map_height - 2 * half_height : to_y; } else { to_y = cur_y; } if (to_x != cur_x || to_y != cur_y) gnome_canvas_scroll_to( ghack_map.canvas, to_x, to_y); //gnome_canvas_update_now ( ghack_map.canvas); } void ghack_reinit_map_window ( ) { GnomeCanvasImage *bg; double width, height, x, y; int i; /* ghack_map_clear(NULL, NULL); */ width = COLNO * ghack_glyph_width(); height = ROWNO * ghack_glyph_height(); gnome_canvas_set_scroll_region (GNOME_CANVAS(ghack_map.canvas), 0, 0, width+2*ghack_glyph_width(), height+2*ghack_glyph_height()); /* remove everything currently in the canvas map */ gtk_object_destroy( GTK_OBJECT (myCanvasGroup)); /* Put some groups back */ myCanvasGroup = GNOME_CANVAS_GROUP ( gnome_canvas_item_new ( gnome_canvas_root(GNOME_CANVAS(ghack_map.canvas)), gnome_canvas_group_get_type (), "x", 0.0, "y", 0.0, NULL) ); /* Tile the map background with a pretty image */ if (background != NULL) { /* Tile the map background */ for (y = 0; y < height+background->rgb_height; y+=background->rgb_height) { for (x = 0; x < width+background->rgb_width; x+=background->rgb_width) { bg = GNOME_CANVAS_IMAGE( gnome_canvas_item_new ( myCanvasGroup, gnome_canvas_image_get_type (), "x", (double) x, "y", (double) y, "width", (double) background->rgb_width, "height", (double) background->rgb_height, "image", background, "anchor", (GtkAnchorType) GTK_ANCHOR_CENTER, NULL) ); gnome_canvas_item_lower_to_bottom (GNOME_CANVAS_ITEM( bg)); } } } /* ghack_map.map is an array of canvas images. Each cell of * the array will contain one tile. Here, we create the * space for the cells and then create the cells for easy * access later. */ for (i=0, y = 0; y < height; y+=ghack_glyph_height()) { for (x = 0; x < width; x+=ghack_glyph_width()) { ghack_map.map[i++] = GNOME_CANVAS_IMAGE( gnome_canvas_item_new ( myCanvasGroup, gnome_canvas_image_get_type (), "x", (double) x, "y", (double) y, "width", (double) ghack_glyph_width(), "height", (double) ghack_glyph_height(), "anchor", GTK_ANCHOR_NORTH_WEST, NULL) ); } } if (petmark != NULL) { /* 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()) { ghack_map.overlay[i] = GNOME_CANVAS_IMAGE( gnome_canvas_item_new ( myCanvasGroup, gnome_canvas_image_get_type (), "x", (double) x, "y", (double) y, "width", (double) petmark->rgb_width, "height", (double) petmark->rgb_height, "image", petmark, "anchor", GTK_ANCHOR_NORTH_WEST, NULL) ); gnome_canvas_item_lower_to_bottom ( GNOME_CANVAS_ITEM( ghack_map.overlay[i++])); } } } ghack_map_cliparound(NULL, u.ux, u.uy, NULL); ghack_map_cursor_to(NULL, u.ux, u.uy, NULL); gnome_canvas_update_now ( ghack_map.canvas); doredraw(); flush_screen(1); } slashem-0.0.7E7F3/win/gnome/gnyesno.h0000664000076400007640000000053110545462317015410 0ustar aliali/* SCCS Id: @(#)gnyesno.h 3.4 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ #ifndef GnomeHackYesNoDialog_h #define GnomeHackYesNoDialog_h int ghack_yes_no_dialog( const char* szQuestionStr, const char* szChoicesStr, int nDefault); #endif slashem-0.0.7E7F3/win/gnome/gnmesg.c0000664000076400007640000000547310545462317015213 0ustar aliali/* SCCS Id: @(#)gnmesg.c 3.4 2000/07/16 */ /* Copyright (C) 1998 by Erik Andersen */ /* NetHack may be freely redistributed. See license for details. */ #include "gnmesg.h" #include "gnsignal.h" /* Pick an arbitrary number of chars such as 80 col X 40 rows text = 3200 chars */ #define nCharsBeforeDeletingStuff 3200 /* Message Window widgets */ GtkWidget *MW_table; GtkWidget *MW_text; GtkWidget *MW_scrollbar; void ghack_message_window_clear(GtkWidget *widget, gpointer data) { /* Seems nethack calls this after every move -- we don't want * to really clear the window at all though. Ignore the request */ gint len; len = gtk_text_get_length(GTK_TEXT(MW_text)); if(len < nCharsBeforeDeletingStuff) return; gtk_text_freeze(GTK_TEXT(MW_text)); gtk_text_set_point(GTK_TEXT(MW_text), 0); gtk_text_forward_delete(GTK_TEXT(MW_text), len-((guint)(nCharsBeforeDeletingStuff*0.5))); gtk_text_set_point(GTK_TEXT(MW_text), (guint)(nCharsBeforeDeletingStuff*0.5)); gtk_text_thaw(GTK_TEXT(MW_text)); } void ghack_message_window_destroy( GtkWidget *win, gpointer data) { } void ghack_message_window_display(GtkWidget *widget, boolean block, gpointer data) { } void ghack_message_window_put_string(GtkWidget *widget, int attr, const char* text, gpointer data) { if(text == NULL) return; /* Don't bother with attributes yet */ gtk_text_insert(GTK_TEXT(MW_text), NULL, NULL, NULL, text, -1); gtk_text_insert(GTK_TEXT(MW_text), NULL, NULL, NULL, "\n", -1); } void ghack_message_window_use_RIP(int how) { } void ghack_message_window_scroll(int dx, int dy) { } GtkWidget* ghack_init_message_window(void) { MW_table = gtk_table_new(2, 1, FALSE); gtk_table_set_row_spacing(GTK_TABLE(MW_table), 0, 2); MW_text = gtk_text_new(NULL, NULL); gtk_text_set_editable(GTK_TEXT(MW_text), FALSE); gtk_text_set_word_wrap(GTK_TEXT(MW_text), TRUE); gtk_table_attach(GTK_TABLE(MW_table), MW_text, 0, 1, 0, 1, (GTK_EXPAND | GTK_FILL), (GTK_EXPAND | GTK_FILL), 0, 0); MW_scrollbar = gtk_vscrollbar_new(GTK_TEXT(MW_text)->vadj); gtk_table_attach(GTK_TABLE(MW_table), MW_scrollbar, 1, 2, 0, 1, GTK_FILL, (GTK_EXPAND | GTK_FILL), 0, 0); gtk_signal_connect(GTK_OBJECT(MW_table), "ghack_putstr", GTK_SIGNAL_FUNC(ghack_message_window_put_string), NULL); gtk_signal_connect(GTK_OBJECT(MW_table), "ghack_clear", GTK_SIGNAL_FUNC(ghack_message_window_clear), NULL); gtk_signal_connect(GTK_OBJECT(MW_table), "gnome_delay_output", GTK_SIGNAL_FUNC(ghack_delay), NULL); gtk_widget_show_all(MW_table); return GTK_WIDGET(MW_table); } slashem-0.0.7E7F3/win/gl/0000775000076400007640000000000010545462317013053 5ustar alialislashem-0.0.7E7F3/win/gl/font20.txt0000664000076400007640000021650610545462317014736 0ustar alialio = (0, 0, 0) M = (255, 255, 255) # tile 0 (char 0) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 1 (char 1) { oooooooooo oooooooooo oooooooooo ooMMMMMMoo oMooooooMo MooooooooM MoMMooMMoM MoMMooMMoM MooooooooM MooooooooM MoMMMMMMoM MooMMMMooM MooooooooM oMooooooMo ooMMMMMMoo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 2 (char 2) { oooooooooo oooooooooo oooooooooo ooMMMMMMoo oMMMMMMMMo MMMMMMMMMM MMooMMooMM MMooMMooMM MMMMMMMMMM MMMMMMMMMM MMooooooMM MMMooooMMM MMMMMMMMMM oMMMMMMMMo ooMMMMMMoo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 3 (char 3) { oooooooooo oooooooooo oooooooooo oooooooooo ooMoooMooo oMMMoMMMoo MMMMMMMMMo MMMMMMMMMo MMMMMMMMMo MMMMMMMMMo oMMMMMMMoo oMMMMMMMoo ooMMMMMooo oooMMMoooo ooooMooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 4 (char 4) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo ooooMooooo oooMMMoooo ooMMMMMooo oMMMMMMMoo MMMMMMMMMo oMMMMMMMoo ooMMMMMooo oooMMMoooo ooooMooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 5 (char 5) { oooooooooo oooooooooo oooooooooo oooooooooo ooooMooooo oooMMMoooo oooMMMoooo oMoMMMoMoo MMMoMoMMMo MMMMMMMMMo MMMMMMMMMo oMMoMoMMoo oooMMMoooo oooMMMoooo ooMMMMMooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 6 (char 6) { oooooooooo oooooooooo oooooooooo oooooooooo ooooMooooo oooMMMoooo ooMMMMMooo oMMMMMMMoo MMMMMMMMMo MMMMMMMMMo MMMMMMMMMo oMMoMoMMoo oooMMMoooo oooMMMoooo ooMMMMMooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 7 (char 7) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo ooooMMoooo oooMMMMooo oooMMMMooo ooooMMoooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 8 (char 8) { MMMMMMMMMM MMMMMMMMMM MMMMMMMMMM MMMMMMMMMM MMMMMMMMMM MMMMMMMMMM MMMMMMMMMM MMMMMMMMMM MMMMooMMMM MMMooooMMM MMMooooMMM MMMMooMMMM MMMMMMMMMM MMMMMMMMMM MMMMMMMMMM MMMMMMMMMM MMMMMMMMMM MMMMMMMMMM MMMMMMMMMM MMMMMMMMMM } # tile 9 (char 9) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooMMMMooo ooMMooMMoo oMMoMMoMMo oMMoMMoMMo oMMoMMoMMo ooMMooMMoo oooMMMMooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 10 (char 10) { MMMMMMMMMM MMMMMMMMMM MMMMMMMMMM MMMMMMMMMM MMMMMMMMMM MMMMMMMMMM MMMooooMMM MMooMMooMM MooMooMooM MooMooMooM MooMooMooM MMooMMooMM MMMooooMMM MMMMMMMMMM MMMMMMMMMM MMMMMMMMMM MMMMMMMMMM MMMMMMMMMM MMMMMMMMMM MMMMMMMMMM } # tile 11 (char 11) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooMMMMo ooooooMMMo oooooMMoMo ooMMMMoooo oMMoMMoooo MMoooMMooo MMoooMMooo MMoooMMooo oMMoMMoooo ooMMMooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 12 (char 12) { oooooooooo oooooooooo oooooooooo oooooooooo oooMMMMooo ooMMooMMoo oMMooooMMo oMMooooMMo oMMooooMMo ooMMooMMoo oooMMMMooo ooooMMoooo ooooMMoooo ooMMMMMMoo ooooMMoooo ooooMMoooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 13 (char 13) { oooooooooo oooooooooo oooooooooo oooooooooo ooooMMMMoo ooooMMoMoo ooooMMMMoo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooMMMMoooo oMMMMMoooo ooMMMooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 14 (char 14) { oooooooooo oooooooooo oooooooooo ooMMoooooo ooMMMMoooo ooMMooMMMo ooMMMooMMo ooMMoMMMMo ooMMoooMMo ooMMoooMMo ooMMoooMMo oMMMoooMMo MMMMoooMMo MMMooooMMo ooooooMMMo oooooMMMMo oooooMMMoo oooooooooo oooooooooo oooooooooo } # tile 15 (char 15) { oooooooooo oooooooooo ooooMMoooo ooooMMoooo oMMoMMoMMo ooMMMMMMoo oooMMMMooo ooMMooMMoo oMMooooMMo oMMooooMMo ooMMooMMoo oooMMMMooo ooMMMMMMoo oMMoMMoMMo ooooMMoooo ooooMMoooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 16 (char 16) { oooooooooo oooooooooo oooooooooo oooooooooo Mooooooooo MMMooooooo MMMMMooooo MMMMMMoooo MMMMMMMMoo MMMMMMMMMo MMMMMMMMoo MMMMMMoooo MMMMMooooo MMMooooooo Mooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 17 (char 17) { oooooooooo oooooooooo oooooooooo oooooooooo ooooooooMo ooooooMMMo ooooMMMMMo oooMMMMMMo oMMMMMMMMo MMMMMMMMMo oMMMMMMMMo oooMMMMMMo ooooMMMMMo ooooooMMMo ooooooooMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 18 (char 18) { oooooooooo oooooooooo oooooooooo ooooMMoooo oooMMMMooo ooMMMMMMoo oMMMMMMMMo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo oMMMMMMMMo ooMMMMMMoo oooMMMMooo ooooMMoooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 19 (char 19) { oooooooooo oooooooooo ooMMooMMoo ooMMooMMoo ooMMooMMoo ooMMooMMoo ooMMooMMoo ooMMooMMoo ooMMooMMoo ooMMooMMoo ooMMooMMoo ooMMooMMoo oooooooooo ooMMooMMoo ooMMooMMoo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 20 (char 20) { oooooooooo oooooooooo ooMMMMMMMo oMMoMMoMMo oMMoMMoMMo oMMoMMoMMo oMMoMMoMMo ooMMMMoMMo ooooMMoMMo ooooMMoMMo ooooMMoMMo ooooMMoMMo ooooMMoMMo ooooMMoMMo ooooMMoMMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 21 (char 21) { oooooooooo oooooooooo ooMMMMMMoo oMMooooMMo MMoooooMMo MMoooooooo oMMoMMMooo ooMMooMMoo MMoMMooMMo MMooMMoMMo oMMooMMooo ooMMMoMMoo oooooooMMo MMoooooMMo MMooooMMoo oMMMMMMooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 22 (char 22) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oMMMMMMMMo oMMMMMMMMo oMMMMMMMMo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 23 (char 23) { oooooooooo oooooooooo oooooooooo ooooMMoooo oooMMMMooo ooMMMMMMoo oMMMMMMMMo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo oMMMMMMMMo ooMMMMMMoo oooMMMMooo ooooMMoooo oooooooooo oMMMMMMMMo oooooooooo oooooooooo oooooooooo } # tile 24 (char 24) { oooooooooo oooooooooo oooooooooo ooooMMoooo oooMMMMooo ooMMMMMMoo oMMMMMMMMo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 25 (char 25) { oooooooooo oooooooooo oooooooooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo oMMMMMMMMo ooMMMMMMoo oooMMMMooo ooooMMoooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 26 (char 26) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooMoooo oooooMMooo oooooMMMoo MMMMMMMMMo oooooMMMoo oooooMMooo oooooMoooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 27 (char 27) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooMoooooo ooMMoooooo oMMMoooooo MMMMMMMMMo oMMMoooooo ooMMoooooo oooMoooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 28 (char 28) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oMMooooooo oMMooooooo oMMooooooo oMMMMMMMMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 29 (char 29) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo ooMoooMooo oMMoooMMoo MMMMMMMMMo oMMoooMMoo ooMoooMooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 30 (char 30) { oooooooooo oooooooooo oooooooooo ooooMooooo ooooMooooo oooMMMoooo oooMMMoooo ooMMMMMooo ooMMMMMooo ooMMMMMooo oMMMMMMMoo oMMMMMMMoo MMMMMMMMMo MMMMMMMMMo MMMMMMMMMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 31 (char 31) { oooooooooo oooooooooo oooooooooo oooooooooo MMMMMMMMMo MMMMMMMMMo MMMMMMMMMo oMMMMMMMoo oMMMMMMMoo ooMMMMMooo ooMMMMMooo ooMMMMMooo oooMMMoooo oooMMMoooo ooooMooooo ooooMooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 32 (char 32) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 33 (char 33) { oooooooooo oooooooooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo oooooooooo ooooMMoooo ooooMMoooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 34 (char 34) { oooooooooo oooooooooo ooMMooMMoo ooMMooMMoo ooMMooMMoo oooMooMooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 35 (char 35) { oooooooooo oooooooooo oooooooooo ooooMMoMMo ooooMMoMMo ooooMMoMMo ooMMMMMMMM oooMMoMMoo oooMMoMMoo oooMMoMMoo oMMMMMMMMo ooMMoMMooo ooMMoMMooo ooMMoMMooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 36 (char 36) { oooooooooo oooooooooo ooooMMoooo ooMMMMMMoo oMMoMMoMMo oMMoMMoooo oMMoMMoooo oMMoMMoooo ooMMMMMMoo ooooMMoMMo ooooMMoMMo ooooMMoMMo oMMoMMoMMo ooMMMMMMoo ooooMMoooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 37 (char 37) { oooooooooo oooooooooo oooooooooo ooMMMooMMo oMMoMMoMMo oMMoMMMMoo ooMMMoMMoo oooooMMooo oooooMMooo ooooMMoooo ooooMMoooo oooMMoMMMo oooMMMMoMM ooMMoMMoMM ooMMooMMMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 38 (char 38) { oooooooooo oooooooooo oooMMMoooo ooMMoMMooo ooMMoMMooo ooMMoMMooo ooMMMMoooo oooMMooooo ooMMMooooo oMMoMMoooo oMMooMMoMM oMMoooMMMo oMMoooMMoo oMMMoMMMMo ooMMMMooMM oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 39 (char 39) { oooooooooo oooooooooo ooooMMMMoo ooooMMMooo oooMMooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 40 (char 40) { oooooooooo oooooooooo ooooooMMoo oooooMMooo ooooMMoooo ooooMMoooo oooMMooooo oooMMooooo oooMMooooo oooMMooooo oooMMooooo ooooMMoooo ooooMMoooo oooooMMooo ooooooMMoo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 41 (char 41) { oooooooooo oooooooooo ooMMoooooo oooMMooooo ooooMMoooo ooooMMoooo oooooMMooo oooooMMooo oooooMMooo oooooMMooo oooooMMooo ooooMMoooo ooooMMoooo oooMMooooo ooMMoooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 42 (char 42) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo ooMMooMMoo ooMMooMMoo oooMMMMooo oMMMMMMMMo oooMMMMooo ooMMooMMoo ooMMooMMoo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 43 (char 43) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo ooooMMoooo ooooMMoooo ooooMMoooo oMMMMMMMMo ooooMMoooo ooooMMoooo ooooMMoooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 44 (char 44) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo ooooMMMooo ooooMMMooo oooMMooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 45 (char 45) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oMMMMMMMMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 46 (char 46) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo ooooMMMooo ooooMMMooo ooooMMMooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 47 (char 47) { oooooooooo oooooooooo oooooooooo oooooooMMo oooooooMMo ooooooMMoo ooooooMMoo oooooMMooo oooooMMooo ooooMMoooo ooooMMoooo oooMMooooo oooMMooooo ooMMoooooo ooMMoooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 48 (char 48) { oooooooooo oooooooooo ooooMMoooo oooMMMMooo ooMMooMMoo ooMMooMMoo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo ooMMooMMoo ooMMooMMoo oooMMMMooo ooooMMoooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 49 (char 49) { oooooooooo oooooooooo ooooMMoooo oooMMMoooo ooMMMMoooo oMMoMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo oMMMMMMMMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 50 (char 50) { oooooooooo oooooooooo oooMMMMooo ooMMooMMoo oMMooooMMo oMMooooMMo oooooooMMo oooooooMMo ooooooMMoo ooooMMMooo oooMMooooo ooMMoooooo oMMooooooo oMMooooooo oMMMMMMMMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 51 (char 51) { oooooooooo oooooooooo oooMMMMooo ooMMooMMoo oMMooooMMo oMMooooMMo oooooooMMo ooooooMMoo ooooMMMooo ooooooMMoo oooooooMMo oMMooooMMo oMMooooMMo ooMMooMMoo oooMMMMooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 52 (char 52) { oooooooooo oooooooooo oooooooMoo ooooooMMoo oooooMMMoo ooooMMMMoo oooMMoMMoo ooMMooMMoo oMMoooMMoo oMMoooMMoo oMMMMMMMMo ooooooMMoo ooooooMMoo ooooooMMoo ooooooMMoo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 53 (char 53) { oooooooooo oooooooooo oMMMMMMMMo oMMooooooo oMMooooooo oMMooooooo oMMooooooo oMMoMMMooo oMMMooMMoo oooooooMMo oooooooMMo oooooooMMo oMMooooMMo ooMMooMMoo oooMMMMooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 54 (char 54) { oooooooooo oooooooooo oooMMMMooo ooMMooMMoo oMMooooMoo oMMooooooo oMMooooooo oMMoMMMooo oMMMooMMoo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo ooMMooMMoo oooMMMMooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 55 (char 55) { oooooooooo oooooooooo oMMMMMMMMo oooooooMMo oooooooMMo ooooooMMoo ooooooMMoo oooooMMooo oooooMMooo ooooMMoooo ooooMMoooo oooMMooooo oooMMooooo ooMMoooooo ooMMoooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 56 (char 56) { oooooooooo oooooooooo oooMMMMooo ooMMooMMoo oMMooooMMo oMMooooMMo oMMooooMMo ooMMooMMoo oooMMMMooo ooMMooMMoo oMMooooMMo oMMooooMMo oMMooooMMo ooMMooMMoo oooMMMMooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 57 (char 57) { oooooooooo oooooooooo oooMMMMooo ooMMooMMoo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo ooMMooMMMo oooMMMoMMo oooooooMMo oooooooMMo ooMooooMMo ooMMooMMoo oooMMMMooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 58 (char 58) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo ooooMMMooo ooooMMMooo oooooooooo oooooooooo oooooooooo oooooooooo ooooMMMooo ooooMMMooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 59 (char 59) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo ooooMMMooo ooooMMMooo oooooooooo oooooooooo oooooooooo oooooooooo ooooMMMooo ooooMMMooo oooMMMoooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 60 (char 60) { oooooooooo oooooooooo oooooooMoo ooooooMMoo oooooMMooo ooooMMoooo oooMMooooo ooMMoooooo oMMooooooo ooMMoooooo oooMMooooo ooooMMoooo oooooMMooo ooooooMMoo oooooooMoo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 61 (char 61) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oMMMMMMMMo oooooooooo oooooooooo oooooooooo oooooooooo oMMMMMMMMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 62 (char 62) { oooooooooo oooooooooo ooMooooooo ooMMoooooo oooMMooooo ooooMMoooo oooooMMooo ooooooMMoo oooooooMMo ooooooMMoo oooooMMooo ooooMMoooo oooMMooooo ooMMoooooo ooMooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 63 (char 63) { oooooooooo oooooooooo oooMMMMooo ooMMooMMoo oMMooooMMo oMMooooMMo oMMooooMMo ooooooMMoo oooooMMooo ooooMMoooo ooooMMoooo ooooMMoooo oooooooooo ooooMMoooo ooooMMoooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 64 (char 64) { oooooooooo oooooooooo oooMMMMooo ooMMooMMoo oMMooooMMo oMMooMMMMo oMMoMMMMMo oMMoMMoMMo oMMoMMoMMo oMMoMMoMMo oMMoMMMMoo oMMooMMooo oMMooooooo ooMMoooMMo oooMMMMMoo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 65 (char 65) { oooooooooo oooooooooo ooooMMoooo oooMMMMooo ooMMooMMoo ooMMooMMoo oMMooooMMo oMMooooMMo oMMooooMMo oMMMMMMMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 66 (char 66) { oooooooooo oooooooooo oMMMMMoooo oMMooMMooo oMMoooMMoo oMMoooMMoo oMMoooMMoo oMMooMMooo oMMMMMMooo oMMoooMMoo oMMooooMMo oMMooooMMo oMMooooMMo oMMoooMMoo oMMMMMMooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 67 (char 67) { oooooooooo oooooooooo oooMMMMooo ooMMooMMoo oMMooooMMo oMMooooooo oMMooooooo oMMooooooo oMMooooooo oMMooooooo oMMooooooo oMMooooooo oMMooooMMo ooMMooMMoo oooMMMMooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 68 (char 68) { oooooooooo oooooooooo oMMMMMMooo oMMoooMMoo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMoooMMoo oMMMMMMooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 69 (char 69) { oooooooooo oooooooooo oMMMMMMMMo oMMooooooo oMMooooooo oMMooooooo oMMooooooo oMMooooooo oMMMMMMooo oMMooooooo oMMooooooo oMMooooooo oMMooooooo oMMooooooo oMMMMMMMMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 70 (char 70) { oooooooooo oooooooooo oMMMMMMMMo oMMooooooo oMMooooooo oMMooooooo oMMooooooo oMMooooooo oMMMMMMooo oMMooooooo oMMooooooo oMMooooooo oMMooooooo oMMooooooo oMMooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 71 (char 71) { oooooooooo oooooooooo oooMMMMooo ooMMooMMoo oMMooooMMo oMMooooooo oMMooooooo oMMooooooo oMMooMMMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo ooMMooMMMo oooMMMMoMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 72 (char 72) { oooooooooo oooooooooo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMMMMMMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 73 (char 73) { oooooooooo oooooooooo oMMMMMMMMo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo oMMMMMMMMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 74 (char 74) { oooooooooo oooooooooo ooooMMMMMo oooooooMMo oooooooMMo oooooooMMo oooooooMMo oooooooMMo oooooooMMo oooooooMMo oooooooMMo oMMooooMMo oMMooooMMo ooMMooMMoo oooMMMMooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 75 (char 75) { oooooooooo oooooooooo oMMooooMMo oMMooooMMo oMMoooMMoo oMMoooMMoo oMMooMMooo oMMooMMooo oMMMMMoooo oMMooMMooo oMMooMMooo oMMoooMMoo oMMoooMMoo oMMooooMMo oMMooooMMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 76 (char 76) { oooooooooo oooooooooo oMMooooooo oMMooooooo oMMooooooo oMMooooooo oMMooooooo oMMooooooo oMMooooooo oMMooooooo oMMooooooo oMMooooooo oMMooooooo oMMooooooo oMMMMMMMMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 77 (char 77) { oooooooooo oooooooooo oMMooooMMo oMMooooMMo oMMMooMMMo oMMMooMMMo oMMMMMMMMo oMMoMMoMMo oMMoMMoMMo oMMoMMoMMo oMMoMMoMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 78 (char 78) { oooooooooo oooooooooo oMMooooMMo oMMMoooMMo oMMMoooMMo oMMMMooMMo oMMMMooMMo oMMoMMoMMo oMMoMMoMMo oMMooMMMMo oMMooMMMMo oMMoooMMMo oMMoooMMMo oMMooooMMo oMMooooMMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 79 (char 79) { oooooooooo oooooooooo oooMMMMooo ooMMooMMoo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo ooMMooMMoo oooMMMMooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 80 (char 80) { oooooooooo oooooooooo oMMMMMMooo oMMoooMMoo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMoooMMoo oMMMMMMooo oMMooooooo oMMooooooo oMMooooooo oMMooooooo oMMooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 81 (char 81) { oooooooooo oooooooooo oooMMMMooo ooMMooMMoo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMoMMoMMo oMMooMMMMo ooMMooMMoo oooMMMMMoo oooooooMMo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 82 (char 82) { oooooooooo oooooooooo oMMMMMMooo oMMoooMMoo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMoooMMoo oMMMMMMooo oMMooMMooo oMMoooMMoo oMMoooMMoo oMMooooMMo oMMooooMMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 83 (char 83) { oooooooooo oooooooooo oooMMMMooo ooMMooMMoo oMMooooMMo oMMooooooo oMMooooooo ooMMoooooo oooMMMMooo ooooooMMoo oooooooMMo oooooooMMo oMMooooMMo ooMMooMMoo oooMMMMooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 84 (char 84) { oooooooooo oooooooooo oMMMMMMMMo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 85 (char 85) { oooooooooo oooooooooo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo ooMMooMMoo oooMMMMooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 86 (char 86) { oooooooooo oooooooooo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo ooMMooMMoo ooMMooMMoo ooMMooMMoo oooMMMMooo oooMMMMooo oooMMMMooo ooooMMoooo ooooMMoooo ooooMMoooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 87 (char 87) { oooooooooo oooooooooo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMoMMoMMo oMMoMMoMMo oMMoMMoMMo oMMoMMoMMo oMMMooMMMo oMMMooMMMo oMMooooMMo oMMooooMMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 88 (char 88) { oooooooooo oooooooooo oMMooooMMo oMMooooMMo ooMMooMMoo ooMMooMMoo oooMMMMooo oooMMMMooo ooooMMoooo oooMMMMooo oooMMMMooo ooMMooMMoo ooMMooMMoo oMMooooMMo oMMooooMMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 89 (char 89) { oooooooooo oooooooooo oMMooooMMo oMMooooMMo ooMMooMMoo ooMMooMMoo oooMMMMooo oooMMMMooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 90 (char 90) { oooooooooo oooooooooo oMMMMMMMMo oooooooMMo oooooooMMo ooooooMMoo oooooMMooo oooooMMooo ooooMMoooo oooMMooooo oooMMooooo ooMMoooooo oMMooooooo oMMooooooo oMMMMMMMMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 91 (char 91) { oooooooooo oooooooooo ooMMMMMMoo ooMMoooooo ooMMoooooo ooMMoooooo ooMMoooooo ooMMoooooo ooMMoooooo ooMMoooooo ooMMoooooo ooMMoooooo ooMMoooooo ooMMoooooo ooMMMMMMoo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 92 (char 92) { oooooooooo oooooooooo oooooooooo ooMMoooooo ooMMoooooo oooMMooooo oooMMooooo ooooMMoooo ooooMMoooo oooooMMooo oooooMMooo ooooooMMoo ooooooMMoo oooooooMMo oooooooMMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 93 (char 93) { oooooooooo oooooooooo ooMMMMMMoo ooooooMMoo ooooooMMoo ooooooMMoo ooooooMMoo ooooooMMoo ooooooMMoo ooooooMMoo ooooooMMoo ooooooMMoo ooooooMMoo ooooooMMoo ooMMMMMMoo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 94 (char 94) { oooooooooo oooooooooo ooooMMoooo oooMMMMooo ooMMooMMoo oMMooooMMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 95 (char 95) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oMMMMMMMMM oooooooooo oooooooooo oooooooooo oooooooooo } # tile 96 (char 96) { oooooooooo oooooooooo ooMMMMoooo oooMMMoooo oooooMMooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 97 (char 97) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooMMMMMoo ooMMoooMMo oooooooMMo ooMMMMMMMo oMMooooMMo oMMooooMMo oMMooooMMo ooMMMMMoMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 98 (char 98) { oooooooooo oooooooooo oMMooooooo oMMooooooo oMMooooooo oMMooooooo oMMooooooo oMMoMMMooo oMMMooMMoo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMMooMMoo oMMoMMMooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 99 (char 99) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooMMMMMoo ooMMoooMMo oMMooooooo oMMooooooo oMMooooooo oMMooooooo ooMMoooMMo oooMMMMMoo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 100 (char 100) { oooooooooo oooooooooo oooooooMMo oooooooMMo oooooooMMo oooooooMMo oooooooMMo oooMMMoMMo ooMMooMMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo ooMMooMMMo oooMMMoMMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 101 (char 101) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooMMMMooo ooMMooMMoo oMMooooMMo oMMMMMMMMo oMMooooooo oMMooooooo ooMMoooMMo oooMMMMMoo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 102 (char 102) { oooooooooo oooooooooo ooooMMMMoo oooMMooMMo oooMMooMMo oooMMooooo oooMMooooo oooMMooooo oooMMooooo oMMMMMMooo oooMMooooo oooMMooooo oooMMooooo oooMMooooo oooMMooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 103 (char 103) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo ooMMMMMoMo oMMoooMMMo oMMoooMMoo oMMoooMMoo oMMoooMMoo ooMMMMMooo oMMooooooo ooMMMMMMoo oMMooooMMo oMMooooMMo oMMooooMMo ooMMMMMMoo oooooooooo } # tile 104 (char 104) { oooooooooo oooooooooo oMMooooooo oMMooooooo oMMooooooo oMMooooooo oMMooooooo oMMoMMMooo oMMMooMMoo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 105 (char 105) { oooooooooo oooooooooo oooooooooo oooooooooo ooooMMoooo ooooMMoooo oooooooooo ooMMMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo oMMMMMMMMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 106 (char 106) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooMMo oooooooMMo oooooooooo oooooMMMMo oooooooMMo oooooooMMo oooooooMMo oooooooMMo oooooooMMo oooooooMMo oooooooMMo ooMMoooMMo ooMMoooMMo ooMMoooMMo oooMMMMMoo oooooooooo } # tile 107 (char 107) { oooooooooo oooooooooo oMMooooooo oMMooooooo oMMooooooo oMMooooooo oMMooooooo oMMoooMMoo oMMooMMooo oMMoMMoooo oMMMMooooo oMMMMMoooo oMMooMMooo oMMoooMMoo oMMooooMMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 108 (char 108) { oooooooooo oooooooooo ooMMMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo oMMMMMMMMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 109 (char 109) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oMoMMoMMoo oMMMMMMMMo oMMoMMoMMo oMMoMMoMMo oMMoMMoMMo oMMoMMoMMo oMMoMMoMMo oMMoMMoMMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 110 (char 110) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oMMoMMMooo oMMMooMMoo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 111 (char 111) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooMMMMooo ooMMooMMoo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo ooMMooMMoo oooMMMMooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 112 (char 112) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oMMoMMMooo oMMMooMMoo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMMooMMoo oMMoMMMooo oMMooooooo oMMooooooo oMMooooooo oMMooooooo oooooooooo } # tile 113 (char 113) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooMMMoMMo ooMMooMMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo ooMMooMMMo oooMMMoMMo oooooooMMo oooooooMMo oooooooMMo oooooooMMo oooooooooo } # tile 114 (char 114) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oMMoMMMMoo ooMMMooMMo ooMMoooooo ooMMoooooo ooMMoooooo ooMMoooooo ooMMoooooo ooMMoooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 115 (char 115) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo ooMMMMMMoo oMMooooMMo oMMooooooo ooMMMMMMoo oooooooMMo oooooooMMo oMMooooMMo ooMMMMMMoo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 116 (char 116) { oooooooooo oooooooooo oooooooooo oooooooooo oooMMooooo oooMMooooo oooMMooooo oMMMMMMooo oooMMooooo oooMMooooo oooMMooooo oooMMooooo oooMMooooo oooMMooMMo ooooMMMMoo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 117 (char 117) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo ooMMooMMMo oooMMMoMMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 118 (char 118) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oMMooooMMo oMMooooMMo ooMMooMMoo ooMMooMMoo oooMMMMooo oooMMMMooo ooooMMoooo ooooMMoooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 119 (char 119) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oMMooooMMo oMMooooMMo oMMooooMMo oMMoMMoMMo oMMoMMoMMo oMMoMMoMMo oMMMMMMMMo ooMMooMMoo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 120 (char 120) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oMMooooMMo ooMMooMMoo oooMMMMooo ooooMMoooo ooooMMoooo oooMMMMooo ooMMooMMoo oMMooooMMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 121 (char 121) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo ooMMooMMMo oooMMMoMMo oooooooMMo oMMooooMMo ooMMooMMoo oooMMMMooo oooooooooo } # tile 122 (char 122) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo ooMMMMMMMo oooooooMMo ooooooMMoo oooooMMooo ooooMMoooo oooMMooooo ooMMoooooo ooMMMMMMMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 123 (char 123) { oooooooooo oooooooooo oooooMMMMo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo oMMMMooooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo oooooMMMMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 124 (char 124) { oooooooooo oooooooooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 125 (char 125) { oooooooooo oooooooooo oMMMMooooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo oooooMMMMo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo oMMMMooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 126 (char 126) { oooooooooo oooooooooo ooMMMooMMo oMMoMMoMMo oMMooMMMoo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 127 (char 127) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo ooooMMoooo ooooMMoooo oooMMMMooo oooMMMMooo ooMMooMMoo ooMMooMMoo oMMMMMMMMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 128 (char 128) { oooooooooo oooooooooo oooMMMMooo ooMMooMMoo oMMooooMMo oMMooooooo oMMooooooo oMMooooooo oMMooooooo oMMooooooo oMMooooooo oMMooooooo oMMooooMMo ooMMooMMoo oooMMMMooo ooooMMoooo oooooMoooo oooMooMooo ooooMMoooo oooooooooo } # tile 129 (char 129) { oooooooooo oooooooooo ooMMooMMoo ooMMooMMoo oooooooooo oooooooooo oooooooooo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo ooMMooMMMo oooMMMoMMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 130 (char 130) { oooooooooo oooooooooo oooooMMooo ooooMMoooo oooMMooooo oooooooooo oooooooooo oooMMMMooo ooMMooMMoo oMMooooMMo oMMMMMMMMo oMMooooooo oMMooooooo ooMMoooMMo oooMMMMMoo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 131 (char 131) { oooooooooo oooooooooo ooooMMoooo oooMMMMooo ooMMooMMoo oooooooooo oooooooooo ooMMMMMMoo oMMooooMMo oooooooMMo ooMMMMMMMo oMMooooMMo oMMooooMMo oMMooooMMo ooMMMMMoMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 132 (char 132) { oooooooooo oooooooooo ooMMooMMoo ooMMooMMoo oooooooooo oooooooooo oooooooooo ooMMMMMMoo oMMooooMMo oooooooMMo ooMMMMMMMo oMMooooMMo oMMooooMMo oMMooooMMo ooMMMMMoMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 133 (char 133) { oooooooooo oooooooooo ooMMoooooo oooMMooooo ooooMMoooo oooooooooo oooooooooo ooMMMMMMoo oMMooooMMo oooooooMMo ooMMMMMMMo oMMooooMMo oMMooooMMo oMMooooMMo ooMMMMMoMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 134 (char 134) { oooooooooo oooooooooo oooooooooo ooooMMoooo oooMooMooo oooMooMooo ooooMMoooo ooMMMMMMoo oMMooooMMo oooooooMMo ooMMMMMMMo oMMooooMMo oMMooooMMo oMMooooMMo ooMMMMMoMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 135 (char 135) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooMMMMMoo ooMMoooMMo oMMooooooo oMMooooooo oMMooooooo oMMooooooo ooMMoooMMo oooMMMMMoo ooooMMoooo oooooMoooo oooMooMooo ooooMMoooo oooooooooo } # tile 136 (char 136) { oooooooooo oooooooooo ooooMMoooo oooMMMMooo ooMMooMMoo oooooooooo oooooooooo oooMMMMooo ooMMooMMoo oMMooooMMo oMMMMMMMMo oMMooooooo oMMooooooo ooMMoooMMo oooMMMMMoo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 137 (char 137) { oooooooooo oooooooooo ooMMooMMoo ooMMooMMoo oooooooooo oooooooooo oooooooooo oooMMMMooo ooMMooMMoo oMMooooMMo oMMMMMMMMo oMMooooooo oMMooooooo ooMMoooMMo oooMMMMMoo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 138 (char 138) { oooooooooo oooooooooo ooMMoooooo oooMMooooo ooooMMoooo oooooooooo oooooooooo oooMMMMooo ooMMooMMoo oMMooooMMo oMMMMMMMMo oMMooooooo oMMooooooo ooMMoooMMo oooMMMMMoo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 139 (char 139) { oooooooooo oooooooooo ooMMooMMoo ooMMooMMoo oooooooooo oooooooooo oooooooooo ooMMMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo oMMMMMMMMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 140 (char 140) { oooooooooo oooooooooo ooooMMoooo oooMMMMooo ooMMooMMoo oooooooooo oooooooooo ooMMMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo oMMMMMMMMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 141 (char 141) { oooooooooo oooooooooo ooMMoooooo oooMMooooo ooooMMoooo oooooooooo oooooooooo ooMMMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo oMMMMMMMMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 142 (char 142) { oooooooooo oooooooooo oooooooooo ooMMooMMoo ooMMooMMoo oooooooooo ooooMMoooo oooMMMMooo ooMMooMMoo oMMooooMMo oMMooooMMo oMMMMMMMMo oMMooooMMo oMMooooMMo oMMooooMMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 143 (char 143) { oooooooooo oooooooooo ooooMMoooo oooMooMooo oooMooMooo ooooMMoooo ooooMMoooo oooMMMMooo ooMMooMMoo oMMooooMMo oMMooooMMo oMMMMMMMMo oMMooooMMo oMMooooMMo oMMooooMMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 144 (char 144) { oooooooooo oooooooooo oooooMMooo ooooMMoooo oooMMooooo oooooooooo oMMMMMMMMo oMMooooooo oMMooooooo oMMooooooo oMMMMMMooo oMMooooooo oMMooooooo oMMooooooo oMMMMMMMMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 145 (char 145) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo ooMMMoMMoo oMooMMoMMo ooooMMoMMo ooooMMMMoo ooMMMMoooo oMMoMMoooo oMMoMMooMo ooMMoMMMoo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 146 (char 146) { oooooooooo oooooooooo ooooMMMMMo oooMMMMooo ooMMoMMooo ooMMoMMooo oMMooMMooo oMMooMMooo oMMMMMMMMo oMMooMMooo oMMooMMooo oMMooMMooo oMMooMMooo oMMooMMooo oMMooMMMMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 147 (char 147) { oooooooooo oooooooooo ooooMMoooo oooMMMMooo ooMMooMMoo oooooooooo oooooooooo oooMMMMooo ooMMooMMoo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo ooMMooMMoo oooMMMMooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 148 (char 148) { oooooooooo oooooooooo ooMMooMMoo ooMMooMMoo oooooooooo oooooooooo oooooooooo oooMMMMooo ooMMooMMoo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo ooMMooMMoo oooMMMMooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 149 (char 149) { oooooooooo oooooooooo ooMMoooooo oooMMooooo ooooMMoooo oooooooooo oooooooooo oooMMMMooo ooMMooMMoo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo ooMMooMMoo oooMMMMooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 150 (char 150) { oooooooooo oooooooooo ooooMMoooo oooMMMMooo ooMMooMMoo oooooooooo oooooooooo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo ooMMooMMMo oooMMMoMMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 151 (char 151) { oooooooooo oooooooooo ooMMoooooo oooMMooooo ooooMMoooo oooooooooo oooooooooo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo ooMMooMMMo oooMMMoMMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 152 (char 152) { oooooooooo oooooooooo ooMMooMMoo ooMMooMMoo oooooooooo oooooooooo oooooooooo oooooooooo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo ooMMooMMMo oooMMMoMMo oooooooMMo oMMooooMMo ooMMooMMoo oooMMMMooo oooooooooo } # tile 153 (char 153) { oooooooooo oooooooooo ooMMooMMoo ooMMooMMoo oooooooooo oooooooooo oooMMMMooo ooMMooMMoo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo ooMMooMMoo oooMMMMooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 154 (char 154) { oooooooooo oooooooooo ooMMooMMoo ooMMooMMoo oooooooooo oooooooooo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo ooMMooMMoo oooMMMMooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 155 (char 155) { oooooooooo oooooooooo oooooooooo oooooooooo oooooMoooo oooooMoooo oooMMMMMoo ooMMoMoMMo oMMooMoooo oMMooMoooo oMMooMoooo oMMooMoooo ooMMoMoMMo oooMMMMMoo oooooMoooo oooooMoooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 156 (char 156) { oooooooooo oooooooooo ooooMMMMoo oooMMooMMo oooMMooMMo oooMMooooo oooMMooooo oooMMooooo oMMMMMMooo oooMMooooo oooMMooooo oooMMooooo oMMMMMoooo oMoMoMMoMM oMMMooMMMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 157 (char 157) { oooooooooo oooooooooo oMMooooMMo oMMooooMMo ooMMooMMoo ooMMooMMoo oooMMMMooo oooMMMMooo ooooMMoooo ooMMMMMMoo ooooMMoooo ooMMMMMMoo ooooMMoooo ooooMMoooo ooooMMoooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 158 (char 158) { oooooooooo oooooooooo oMMMMMMooo oMMoooMMoo oMMoooMMoo oMMoooMMoo oMMoooMMoo oMMMMMMooo oMMooooooo oMMoMMoooo oMMoMMoooo oMMoMMMMoo oMMoMMoooo oMMoMMoMMo oMMooMMMoo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 159 (char 159) { oooooooooo oooooooooo oooooooooo oooooMMMoo ooooMMoMMo ooooMMoMMo ooooMMoooo ooooMMoooo ooooMMoooo ooMMMMMMoo ooooMMoooo ooooMMoooo ooooMMoooo oMMoMMoooo oMMoMMoooo ooMMMooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 160 (char 160) { oooooooooo oooooooooo oooooMMooo ooooMMoooo oooMMooooo oooooooooo oooooooooo ooMMMMMMoo oMMooooMMo oooooooMMo ooMMMMMMMo oMMooooMMo oMMooooMMo oMMooooMMo ooMMMMMoMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 161 (char 161) { oooooooooo oooooooooo oooooMMooo ooooMMoooo oooMMooooo oooooooooo oooooooooo ooMMMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo oMMMMMMMMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 162 (char 162) { oooooooooo oooooooooo oooooMMooo ooooMMoooo oooMMooooo oooooooooo oooooooooo oooMMMMooo ooMMooMMoo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo ooMMooMMoo oooMMMMooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 163 (char 163) { oooooooooo oooooooooo oooooMMooo ooooMMoooo oooMMooooo oooooooooo oooooooooo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo ooMMooMMMo oooMMMoMMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 164 (char 164) { oooooooooo oooooooooo oooMMooMoo ooMMMMMMoo ooMooMMooo oooooooooo oooooooooo oMMoMMMooo oMMMooMMoo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 165 (char 165) { oooooooooo oooooooooo oooMMooMoo ooMMMMMMoo ooMooMMooo oooooooooo oMoooooMMo oMMooooMMo oMMMoooMMo oMMMMooMMo oMMMMMoMMo oMMoMMMMMo oMMooMMMMo oMMoooMMMo oMMooooMMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 166 (char 166) { oooooooooo oooooooooo oooooooooo oooMMMMMoo ooMMoooMMo oooooooMMo ooMMMMMMMo oMMooooMMo oMMooooMMo ooMMMMMoMo oooooooooo oMMMMMMMMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 167 (char 167) { oooooooooo oooooooooo oooooooooo oooMMMMooo ooMMooMMoo oMMooooMMo oMMooooMMo oMMooooMMo ooMMooMMoo oooMMMMooo oooooooooo oMMMMMMMMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 168 (char 168) { oooooooooo oooooooooo ooooMMoooo ooooMMoooo oooooooooo ooooMMoooo ooooMMoooo ooooMMoooo oooMMooooo ooMMoooooo oMMooooooo oMMooooMMo oMMooooMMo ooMMooMMoo oooMMMMooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 169 (char 169) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oMMMMMMMMo oMMMMMMMMo oMMooooooo oMMooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 170 (char 170) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oMMMMMMMMo oMMMMMMMMo oooooooMMo oooooooMMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 171 (char 171) { oooooooooo oooooooooo ooMooooooo oMMooooooo ooMooooooo ooMooooooo ooMooooMoo ooMoooMooo oMMMoMoooo ooooMoMMoo oooMoMooMo ooMoooooMo oMoooooMoo ooooooMooo oooooMoooo oooooMMMMo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 172 (char 172) { oooooooooo oooooooooo ooMooooooo oMMooooooo ooMooooooo ooMooooooo ooMooooMoo ooMoooMooo oMMMoMoooo ooooMooMoo oooMooMMoo ooMooMoMoo oMooMooMoo oooMMMMMMo oooooooMoo oooooooMoo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 173 (char 173) { oooooooooo oooooooooo ooooMMoooo ooooMMoooo oooooooooo oooooooooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo oooMMMMooo oooMMMMooo oooMMMMooo oooMMMMooo ooooMMoooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 174 (char 174) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo ooooMMoMMo oooMMoMMoo ooMMoMMooo oMMoMMoooo ooMMoMMooo oooMMoMMoo ooooMMoMMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 175 (char 175) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oMMoMMoooo ooMMoMMooo oooMMoMMoo ooooMMoMMo oooMMoMMoo ooMMoMMooo oMMoMMoooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 176 (char 176) { oMoooMoooM oooMoooMoo oMoooMoooM oooMoooMoo oMoooMoooM oooMoooMoo oMoooMoooM oooMoooMoo oMoooMoooM oooMoooMoo oMoooMoooM oooMoooMoo oMoooMoooM oooMoooMoo oMoooMoooM oooMoooMoo oMoooMoooM oooMoooMoo oMoooMoooM oooMoooMoo } # tile 177 (char 177) { oMoMoMoMoM MoMoMoMoMo oMoMoMoMoM MoMoMoMoMo oMoMoMoMoM MoMoMoMoMo oMoMoMoMoM MoMoMoMoMo oMoMoMoMoM MoMoMoMoMo oMoMoMoMoM MoMoMoMoMo oMoMoMoMoM MoMoMoMoMo oMoMoMoMoM MoMoMoMoMo oMoMoMoMoM MoMoMoMoMo oMoMoMoMoM MoMoMoMoMo } # tile 178 (char 178) { MoMMMoMMMo MMMoMMMoMM MoMMMoMMMo MMMoMMMoMM MoMMMoMMMo MMMoMMMoMM MoMMMoMMMo MMMoMMMoMM MoMMMoMMMo MMMoMMMoMM MoMMMoMMMo MMMoMMMoMM MoMMMoMMMo MMMoMMMoMM MoMMMoMMMo MMMoMMMoMM MoMMMoMMMo MMMoMMMoMM MoMMMoMMMo MMMoMMMoMM } # tile 179 (char 179) { ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo } # tile 180 (char 180) { ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo MMMMMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo } # tile 181 (char 181) { ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo MMMMMMoooo ooooMMoooo ooooMMoooo MMMMMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo } # tile 182 (char 182) { oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo MMMMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo } # tile 183 (char 183) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo MMMMMMMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo } # tile 184 (char 184) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo MMMMMMoooo ooooMMoooo ooooMMoooo MMMMMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo } # tile 185 (char 185) { oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo MMMMMoMMoo ooooooMMoo ooooooMMoo MMMMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo } # tile 186 (char 186) { oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo } # tile 187 (char 187) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo MMMMMMMMoo ooooooMMoo ooooooMMoo MMMMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo } # tile 188 (char 188) { oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo MMMMMoMMoo ooooooMMoo ooooooMMoo MMMMMMMMoo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 189 (char 189) { oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo MMMMMMMMoo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 190 (char 190) { ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo MMMMMMoooo ooooMMoooo ooooMMoooo MMMMMMoooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 191 (char 191) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo MMMMMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo } # tile 192 (char 192) { ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMMMMM oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 193 (char 193) { ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo MMMMMMMMMM oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 194 (char 194) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo MMMMMMMMMM ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo } # tile 195 (char 195) { ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMMMMM ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo } # tile 196 (char 196) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo MMMMMMMMMM oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 197 (char 197) { ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo MMMMMMMMMM ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo } # tile 198 (char 198) { ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMMMMM ooooMMoooo ooooMMoooo ooooMMMMMM ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo } # tile 199 (char 199) { oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMMM oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo } # tile 200 (char 200) { oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMMM oooMMooooo oooMMooooo oooMMMMMMM oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 201 (char 201) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooMMMMMMM oooMMooooo oooMMooooo oooMMoMMMM oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo } # tile 202 (char 202) { oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo MMMMMoMMMM oooooooooo oooooooooo MMMMMMMMMM oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 203 (char 203) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo MMMMMMMMMM oooooooooo oooooooooo MMMMMoMMMM oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo } # tile 204 (char 204) { oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMMM oooMMooooo oooMMooooo oooMMoMMMM oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo } # tile 205 (char 205) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo MMMMMMMMMM oooooooooo oooooooooo MMMMMMMMMM oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 206 (char 206) { oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo MMMMMoMMMM oooooooooo oooooooooo MMMMMoMMMM oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo } # tile 207 (char 207) { ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo MMMMMMMMMM oooooooooo oooooooooo MMMMMMMMMM oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 208 (char 208) { oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo MMMMMMMMMM oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 209 (char 209) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo MMMMMMMMMM oooooooooo oooooooooo MMMMMMMMMM ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo } # tile 210 (char 210) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo MMMMMMMMMM oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo } # tile 211 (char 211) { oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMMMMMM oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 212 (char 212) { ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMMMMM ooooMMoooo ooooMMoooo ooooMMMMMM oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 213 (char 213) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo ooooMMMMMM ooooMMoooo ooooMMoooo ooooMMMMMM ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo } # tile 214 (char 214) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooMMMMMMM oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo } # tile 215 (char 215) { oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo MMMMMMMMMM oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo } # tile 216 (char 216) { ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo MMMMMMMMMM ooooMMoooo ooooMMoooo MMMMMMMMMM ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo } # tile 217 (char 217) { ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo MMMMMMoooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 218 (char 218) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo ooooMMMMMM ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo } # tile 219 (char 219) { MMMMMMMMMM MMMMMMMMMM MMMMMMMMMM MMMMMMMMMM MMMMMMMMMM MMMMMMMMMM MMMMMMMMMM MMMMMMMMMM MMMMMMMMMM MMMMMMMMMM MMMMMMMMMM MMMMMMMMMM MMMMMMMMMM MMMMMMMMMM MMMMMMMMMM MMMMMMMMMM MMMMMMMMMM MMMMMMMMMM MMMMMMMMMM MMMMMMMMMM } # tile 220 (char 220) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo MMMMMMMMMM MMMMMMMMMM MMMMMMMMMM MMMMMMMMMM MMMMMMMMMM MMMMMMMMMM MMMMMMMMMM MMMMMMMMMM MMMMMMMMMM MMMMMMMMMM } # tile 221 (char 221) { MMMMMooooo MMMMMooooo MMMMMooooo MMMMMooooo MMMMMooooo MMMMMooooo MMMMMooooo MMMMMooooo MMMMMooooo MMMMMooooo MMMMMooooo MMMMMooooo MMMMMooooo MMMMMooooo MMMMMooooo MMMMMooooo MMMMMooooo MMMMMooooo MMMMMooooo MMMMMooooo } # tile 222 (char 222) { oooooMMMMM oooooMMMMM oooooMMMMM oooooMMMMM oooooMMMMM oooooMMMMM oooooMMMMM oooooMMMMM oooooMMMMM oooooMMMMM oooooMMMMM oooooMMMMM oooooMMMMM oooooMMMMM oooooMMMMM oooooMMMMM oooooMMMMM oooooMMMMM oooooMMMMM oooooMMMMM } # tile 223 (char 223) { MMMMMMMMMM MMMMMMMMMM MMMMMMMMMM MMMMMMMMMM MMMMMMMMMM MMMMMMMMMM MMMMMMMMMM MMMMMMMMMM MMMMMMMMMM MMMMMMMMMM oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 224 (char 224) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo ooMMMooMMo oMMoMMMMoo oMMooMMMoo oMMooMMooo oMMooMMooo oMMooMMMoo oMMoMMMMoo ooMMMooMMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 225 (char 225) { oooooooooo oooooooooo oooooooooo oooMMMoooo ooMMMMMooo oMMMooMMoo oMMoooMMoo oMMoooMMoo oMMooMMooo oMMoMMoooo oMMooMMooo oMMoooMMoo oMMooooMoo oMMoooMMoo oMMoMMMooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 226 (char 226) { oooooooooo oooooooooo oooooooooo oMMMMMMMMo oMMooooMMo oMMooooMMo oMMooooooo oMMooooooo oMMooooooo oMMooooooo oMMooooooo oMMooooooo oMMooooooo oMMooooooo oMMooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 227 (char 227) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo ooooooooMo ooMMMMMMMo oMoMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo oooMMoMMoo ooMMooMMoo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 228 (char 228) { oooooooooo oooooooooo oooooooooo oMMMMMMMMo oMMooooMMo oMMooooMMo ooMMoooooo oooMMooooo ooooMMoooo ooooMMoooo oooMMooooo ooMMoooooo oMMooooMMo oMMooooMMo oMMMMMMMMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 229 (char 229) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo ooMMMMMMMo oMMooMMooo oMMoooMMoo oMMoooMMoo oMMoooMMoo oMMoooMMoo ooMMoMMooo oooMMMoooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 230 (char 230) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo ooMMoooMMo ooMMoooMMo ooMMoooMMo ooMMoooMMo ooMMoooMMo ooMMMoMMoo ooMMMMMooo ooMMoooooo ooMMoooooo ooMMoooooo oMMooooooo oooooooooo oooooooooo } # tile 231 (char 231) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooMMo ooMMMoMMoo oMMoMMMooo oMMoMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 232 (char 232) { oooooooooo oooooooooo oMMMMMMMMo oooMMMMooo ooMMooMMoo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo ooMMooMMoo oooMMMMooo oMMMMMMMMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 233 (char 233) { oooooooooo oooooooooo oooMMMMooo ooMMooMMoo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMMMMMMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo ooMMooMMoo oooMMMMooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 234 (char 234) { oooooooooo oooooooooo oooMMMoooo ooMMoMMooo oMMoooMMoo MMoooooMMo MMoooooMMo MMoooooMMo oMMoooMMoo ooMMoMMooo ooMMoMMooo ooMMoMMooo ooMMoMMooo ooMMoMMooo MMMMoMMMMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 235 (char 235) { oooooooooo oooooooooo oMoooMoooo oMMoMMoooo ooMMMooooo ooMMMooooo oMMoMMoooo oMoooMMooo oooMMMMMoo ooMMooMMMo oMMooooMMo oMMooooMMo oMMooooMMo ooMMooMMoo oooMMMMooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 236 (char 236) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooMMMMoMo ooMMooMMMo oMMoooMMMo oMMooMMMMo oMMoMMoMMo oMMMMooMMo ooMMooMMoo oMMMMMMooo oMoooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 237 (char 237) { oooooooooo oooooooooo oooooooooo oooooooooo ooooooooMo oooMMMMMMo ooMMooMMoo oMMoooMMMo oMMooMoMMo oMMooMoMMo oMMoMooMMo oMMoMooMMo oMMMoooMMo ooMMooMMoo oMMMMMMooo oMoooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 238 (char 238) { oooooooooo oooooooooo oooooooooo oooooooooo oooMMMMMoo ooMMoooooo oMMooooooo oMMooooooo oMMooooooo oMMMMMMooo oMMooooooo oMMooooooo oMMooooooo ooMMoooooo oooMMMMMoo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 239 (char 239) { oooooooooo oooooooooo oooMMMMooo ooMMooMMoo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oMMooooMMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 240 (char 240) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oMMMMMMMMo oooooooooo oooooooooo oMMMMMMMMo oooooooooo oooooooooo oMMMMMMMMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 241 (char 241) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo ooooMMoooo ooooMMoooo oMMMMMMMMo ooooMMoooo ooooMMoooo oooooooooo oMMMMMMMMo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 242 (char 242) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooMMM oooooMMMoo oooMMMoooo oMMMoooooo oooMMMoooo oooooMMMoo oooooooMMM oooooooooo oooooooooo oMMMMMMMMM oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 243 (char 243) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oMMMoooooo oooMMMoooo oooooMMMoo oooooooMMM oooooMMMoo oooMMMoooo oMMMoooooo oooooooooo oooooooooo oMMMMMMMMM oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 244 (char 244) { oooooooooo oooooooooo oooooooooo oooooMMMoo ooooMMoMMo ooooMMoMMo ooooMMoMMo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo } # tile 245 (char 245) { ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo oMMoMMoooo oMMoMMoooo oMMoMMoooo ooMMMooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 246 (char 246) { oooooooooo oooooooooo oooooooooo oooooooooo ooooMMoooo ooooMMoooo oooooooooo oooooooooo oMMMMMMMMo oMMMMMMMMo oooooooooo oooooooooo ooooMMoooo ooooMMoooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 247 (char 247) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo ooMMMooMMo oMMoMMoMMo oMMooMMMoo oooooooooo oooooooooo ooMMMooMMo oMMoMMoMMo oMMooMMMoo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 248 (char 248) { oooooooooo oooooooooo oooMMMMooo ooMMooMMoo ooMMooMMoo ooMMooMMoo oooMMMMooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 249 (char 249) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo ooooMMoooo ooooMMoooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 250 (char 250) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo ooooMMoooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 251 (char 251) { ooooMMMMMM ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo ooooMMoooo MoooMMoooo MMooMMoooo oMMoMMoooo ooMMMMoooo oooMMMoooo ooooMMoooo oooooooooo oooooooooo } # tile 252 (char 252) { oooooooooo oooooooooo oooooooooo oMMoMMoooo oMMMoMMooo oMMoooMMoo oMMoooMMoo oMMoooMMoo oMMoooMMoo oMMoooMMoo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 253 (char 253) { oooooooooo oooooooooo oooooooooo ooMMMMMooo oMMoooMMoo oooooMMooo ooooMMoooo oooMMooooo ooMMoooooo oMMMMMMMoo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 254 (char 254) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo ooMMMMMMoo ooMMMMMMoo ooMMMMMMoo ooMMMMMMoo ooMMMMMMoo ooMMMMMMoo ooMMMMMMoo ooMMMMMMoo ooMMMMMMoo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } # tile 255 (char 255) { oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo oooooooooo } slashem-0.0.7E7F3/win/gl/gl_unit.c0000664000076400007640000001504210545462317014662 0ustar aliali/* Copyright (C) 2002 Andrew Apted */ /* NetHack may be freely redistributed. See license for details. */ /* * SDL/GL window port for NetHack & Slash'EM. * * Unit system. Sorts the units (GL images) based on texture id, * which can give _much_ faster results. The startup routine also * initialises the GL into the required state. */ #include "hack.h" #if defined(GL_GRAPHICS) /* hardware only */ #define WINGL_INTERNAL #include "winGL.h" int sdlgl_tex_max = 0; #define MAX_UNITS 2048 static struct GraphicUnit unit_array[MAX_UNITS]; static short unit_map[MAX_UNITS]; static int num_units = 0; static int unit_overlap = 0; void sdlgl_unit_startup(void) { const char *str; /* query some GL properties */ str = (const char *) glGetString(GL_VERSION); if (! str) { sdlgl_error("OpenGL load problem ! (version string is NULL)\n"); } glGetIntegerv(GL_MAX_TEXTURE_SIZE, &sdlgl_tex_max); if (sdlgl_tex_max < 128) { sdlgl_error("OpenGL texture limit too small (%d).\n", sdlgl_tex_max); } if (sdlgl_tex_max > 2048) sdlgl_tex_max = 2048; #if 0 /* DEBUGGING */ str = (const char *) glGetString(GL_VERSION); sdlgl_warning("OpenGL Version: %s\n", str); str = (const char *) glGetString(GL_VENDOR); sdlgl_warning("OpenGL Vendor: %s\n", str); str = (const char *) glGetString(GL_RENDERER); sdlgl_warning("OpenGL Renderer: %s\n", str); sdlgl_warning("OpenGL Texture Size: %d\n", sdlgl_tex_max); #endif /* initialise all important GL state */ glDisable(GL_FOG); glDisable(GL_BLEND); glDisable(GL_LIGHTING); glDisable(GL_TEXTURE_2D); glDisable(GL_CULL_FACE); glDisable(GL_DEPTH_TEST); glDisable(GL_SCISSOR_TEST); glDisable(GL_STENCIL_TEST); glEnable(GL_LINE_SMOOTH); glDisable(GL_POLYGON_SMOOTH); glDisable(GL_DITHER); glEnable(GL_NORMALIZE); glFrontFace(GL_CW); glShadeModel(GL_SMOOTH); glDepthFunc(GL_LEQUAL); glAlphaFunc(GL_GREATER, 1.0 / 32.0); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glHint(GL_FOG_HINT, GL_FASTEST); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); /* turn off lighting stuff */ glDisable(GL_LIGHTING); glDisable(GL_COLOR_MATERIAL); glNormal3f(0.0, 0.0, 1.0); /* setup the GL matrices for drawing 2D stuff */ glViewport(0, 0, sdlgl_width, sdlgl_height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0.0, (float)sdlgl_width, 0.0, (float)sdlgl_height, -1.0, 1.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); /* clear screen */ glClearColor(0.0, 0.0, 0.0, 1.0); glClear(GL_COLOR_BUFFER_BIT); } void sdlgl_unit_shutdown(void) { /* does nothing */ } /* ---------------------------------------------------------------- */ static int unit_compare(const void *p1, const void *p2) { const struct GraphicUnit *A = unit_array + *((short *) p1); const struct GraphicUnit *B = unit_array + *((short *) p2); if (A->pass != B->pass) return A->pass - B->pass; if (A->tex_id != B->tex_id) return (int)A->tex_id - (int)B->tex_id; return (int)A->color - (int)B->color; } static void flush_units(void) { int i; int begun = 0; GLuint current_tex = 0x789ABCDE; if (num_units < 1) return; /* sort units into increasing texture ID */ for (i=0; i < num_units; i++) unit_map[i] = i; if (! unit_overlap) qsort(unit_map, num_units, sizeof(short), unit_compare); glEnable(GL_TEXTURE_2D); /* now draw all the goodies */ for (i=0; i < num_units; i++) { struct GraphicUnit *unit = unit_array + unit_map[i]; if (unit->tex_id != current_tex) { if (begun) glEnd(); current_tex = unit->tex_id; glBindTexture(GL_TEXTURE_2D, current_tex); glBegin(GL_QUADS); begun = 1; } /* we don't bother minimising color changes */ glColor4f( GAMMA_F(RGB_RED(unit->color)), GAMMA_F(RGB_GRN(unit->color)), GAMMA_F(RGB_BLU(unit->color)), unit->trans); glTexCoord2f(unit->tx1, unit->ty1); glVertex2i(unit->x, unit->y); glTexCoord2f(unit->tx1, unit->ty2); glVertex2i(unit->x, unit->y + unit->h); glTexCoord2f(unit->tx2, unit->ty2); glVertex2i(unit->x + unit->w, unit->y + unit->h); glTexCoord2f(unit->tx2, unit->ty1); glVertex2i(unit->x + unit->w, unit->y); } if (begun) glEnd(); glDisable(GL_TEXTURE_2D); /* we've drawn 'em all... */ num_units = 0; } /* ---------------------------------------------------------------- */ void sdlgl_begin_units(int blending, int overlap) { assert(num_units == 0); if (blending) glEnable(GL_BLEND); unit_overlap = overlap; } void sdlgl_add_unit(GLuint id, float tx1, float ty1, float tx2, float ty2, short x, short y, short w, short h, short pass, rgbcol_t color, float trans) { struct GraphicUnit *unit; if (num_units == MAX_UNITS) flush_units(); assert(num_units < MAX_UNITS); unit = unit_array + num_units; num_units++; unit->tex_id = id; unit->tx1 = tx1; unit->ty1 = ty1; unit->tx2 = tx2; unit->ty2 = ty2; unit->x = x; unit->y = y; unit->w = w; unit->h = h; unit->pass = pass; unit->color = color; unit->trans = trans; } void sdlgl_finish_units(void) { if (num_units > 0) flush_units(); glDisable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); assert(num_units == 0); } /* ---------------------------------------------------------------- */ void sdlgl_hw_make_screenshot(const char *prefix) { unsigned char *pixels; unsigned char *p; char filename[256]; char msgbuf[512]; int x, crc1, crc2; int success; pixels = (unsigned char *) alloc(sdlgl_width * sdlgl_height * 3); glReadBuffer(GL_FRONT); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glReadPixels(0, 0, sdlgl_width, sdlgl_height, GL_RGB, GL_UNSIGNED_BYTE, pixels); /* compute Adler CRC (per RFC 1950) on image. * We'll create a fairly unique filename using it. */ crc1 = crc2 = 0; p = pixels; for (x=0; x < sdlgl_width * sdlgl_height * 3; x++, p++) { crc1 = (crc1 + (int) *p) % 65521; crc2 = (crc2 + crc1) % 65521; } /* save image as a PPM (Portable PixMap) file. */ sprintf(filename, "%s%04X%04X.ppm", prefix, crc2, crc1); success = sdlgl_save_ppm_file(filename, pixels, sdlgl_width, sdlgl_height); free(pixels); /* FIXME: show a pop-up window ! */ if (success) { sprintf(msgbuf, "Screenshot saved to: %s", filename); Sdlgl_raw_print(msgbuf); } else { sprintf(msgbuf, "Screenshot failed to open: %s", filename); Sdlgl_raw_print(msgbuf); } } #endif /* GL_GRAPHICS */ /*gl_unit.c*/ slashem-0.0.7E7F3/win/gl/gl_menu.c0000664000076400007640000005074610545462317014661 0ustar aliali/* Copyright (C) 2002 Andrew Apted */ /* NetHack may be freely redistributed. See license for details. */ /* * SDL/GL window port for NetHack & Slash'EM. * * This file contains menu (NHW_MENU) windows and other menu related * functions. */ #include "hack.h" #include "dlb.h" #include "patchlevel.h" #if defined(GL_GRAPHICS) || defined(SDL_GRAPHICS) #define WINGL_INTERNAL #include "winGL.h" #include #include #include extern char mapped_menu_cmds[]; /* from options.c */ /* FORWARD DECLS */ static void draw_menu_items(struct TextWindow *win, int how); /* * A string containing all the default commands -- to add to a list * of acceptable inputs. */ static const char default_menu_cmds[] = { MENU_FIRST_PAGE, MENU_LAST_PAGE, MENU_NEXT_PAGE, MENU_PREVIOUS_PAGE, MENU_SELECT_ALL, MENU_UNSELECT_ALL, MENU_INVERT_ALL, MENU_SELECT_PAGE, MENU_UNSELECT_PAGE, MENU_INVERT_PAGE, 0 /* null terminator */ }; static void menu_set_all(struct TextWindow *win, char groupacc) { struct MenuItem *item; for (item=win->items; item; item=item->next) { if (groupacc && groupacc != item->groupacc) continue; if (item->identifier.a_void && !item->selected) { item->selected = 1; item->count = -1; } } } static void menu_unset_all(struct TextWindow *win, char groupacc) { struct MenuItem *item; for (item=win->items; item; item=item->next) { if (groupacc && groupacc != item->groupacc) continue; if (item->identifier.a_void && item->selected) { item->selected = 0; item->count = -1; } } } static void menu_invert_all(struct TextWindow *win, char groupacc) { struct MenuItem *item; for (item=win->items; item; item=item->next) { if (groupacc && groupacc != item->groupacc) continue; if (!item->identifier.a_void) continue; item->selected = item->selected ? 0 : 1; item->count = -1; } } /* reverse the item list. Can handle NULL as an input. */ static struct MenuItem *reverse_items(struct MenuItem *items) { struct MenuItem *head = NULL; struct MenuItem *next = NULL; for (; items; items = next) { next = items->next; items->next = head; head = items; } return head; } /* collect group accelerators, same as in ../tty/wintty.c. * Ignore accelerators for PICK_NONE. For PICK_ONE, only accept * accelerators that mach exactly one entry. Grab them all for * PICK_ANY. */ static void collect_group_accelerators(int how, char *gacc, struct TextWindow *win) { struct MenuItem *curr; char *rp; int accel; int n; int gcnt[128] = { 0, }; for (n=0, curr=win->items; curr; curr=curr->next) { accel = (int)curr->groupacc & 0x7F; /* make it ASCII safe */ if (! accel) continue; if (! gcnt[accel]) gacc[n++] = accel; gcnt[accel]++; } gacc[n] = 0; if (how == PICK_ONE) { for(rp=gacc; *gacc; gacc++) { accel = (int)*gacc & 0x7F; if (gcnt[accel] == 1) *rp++ = accel; } *rp = 0; } } /* returns < 0 if cancelled */ int sdlgl_process_menu_window(int window, struct TextWindow *win, int how) { struct MenuItem *item; struct TileWindow *kt_win = NULL; int pixel_w, pixel_h; int total_choices; int finished = 0; int cancelled = 0; int counting = 0; int count = 0; int ch; /* for group accelerators */ char gacc[128] = { 0, }; char kt_buf[16]; assert(! win->base); if (! win->items) return -1; /* calc_w/h has already been calculated in end_menu(). */ if (win->is_menu != 1 || win->calc_w <= 0 || win->calc_h <= 0) { raw_printf("process_menu_window(%d): bad menu", window); return -1; } sdlgl_top_win = window; win->base = sdlgl_new_tilewin(sdlgl_font_menu, win->calc_w, win->calc_h, 1,0); /* choose background color */ win->base->background = (how == PICK_NONE) ? MENU_NONE_COL : (how == PICK_ONE) ? MENU_ONE_COL : MENU_ANY_COL; draw_menu_items(win, how); pixel_w = min(sdlgl_width, win->base->scale_w * win->calc_w); pixel_h = min(sdlgl_height, win->base->scale_h * win->calc_h); win->show_w = pixel_w / win->base->scale_w; win->show_h = pixel_h / win->base->scale_h; assert(0 < win->show_w && win->show_w <= win->calc_w); assert(0 < win->show_h && win->show_h <= win->calc_h); sdlgl_map_tilewin(win->base, sdlgl_width - pixel_w, sdlgl_height - pixel_h, pixel_w, pixel_h, 10+window); /* set focus */ win->focus_x = 0; win->focus_y = win->calc_h - win->show_h; /* this flushes: */ sdlgl_pan_window(window, 0, 0); if (how != PICK_NONE) collect_group_accelerators(how, gacc, win); total_choices = 0; if (how != PICK_NONE) { for (item = win->items; item; item = item->next) if (item->identifier.a_void) total_choices++; } #if 0 /* DEBUGGING */ fprintf(stderr, "GROUPACC: %c `%s'\n", (how == PICK_NONE) ? 'N' : (how == PICK_ONE) ? '1' : 'A', gacc); #endif while (!finished && !cancelled) { int bx, by, bmod; /* close count window ? */ if (kt_win && !counting) { sdlgl_unmap_tilewin(kt_win); sdlgl_free_tilewin(kt_win); kt_win = NULL; } sdlgl_flush(); ch = sdlgl_get_poskey(0, &bx, &by, &bmod); if (ch == 0) /* mouse button */ { int index = win->calc_h - 1 - by; assert(index >= 0); if (how == PICK_NONE) continue; if (index == 0) /* bottom padding line */ continue; item = win->items; for (; index > 1 && item; index--) item = item->next; if (index <= 1 && item && item->identifier.a_void) { if (counting && count > 0) { item->selected = 1; item->count = count; } else item->selected = item->selected ? 0 : 1; /* redraw menu */ draw_menu_items(win, how); sdlgl_flush(); if (how == PICK_ONE) finished = 1; } counting = 0; continue; } if (ch == '\033') { if (counting) { counting = 0; continue; } cancelled = 1; break; } if (ch == '\n' || ch == '\r' || ch == ' ') { /* handle counting. Many times I have simply hit enter instead * of an accelerator (especially when taking gold out of a bag). */ if (counting && count > 0 && how == PICK_ANY && total_choices > 1) continue; if (counting && count > 0 && how == PICK_ANY && total_choices == 1) { for (item = win->items; item; item = item->next) if (item->identifier.a_void) break; assert(item); item->selected = 1; item->count = count; draw_menu_items(win, how); sdlgl_flush(); counting = 0; continue; } finished = 1; break; } if (how == PICK_NONE) continue; /* counting */ if (digit(ch) && (ch != '0' || counting)) { if (!counting) { counting = 1; count = 0; } /* prevent overflow */ if (count <= 99999) count = count * 10 + (ch - '0'); /* adjust count window (create if needed) */ if (! kt_win) { int x, y; int w, h; kt_win = sdlgl_new_tilewin(sdlgl_font_menu, 16, 1, 1,0); kt_win->background = win->base->background; w = 16 * kt_win->scale_w; h = 1 * kt_win->scale_h; /* if the menu window fits vertically on the screen with space * underneath for a line, place the count window underneath it * and touching the right edge. Otherwise squash it onto the * bottom-most line. */ x = sdlgl_width - w; y = sdlgl_height - pixel_h; if (y >= h) { y -= h; } sdlgl_map_tilewin(kt_win, x, y, w, h, 11+window); } sdlgl_blank_area(kt_win, 0, 0, 16, 1); sprintf(kt_buf, "Count: %d", count); assert(strlen(kt_buf) <= 15); sdlgl_store_str(kt_win, 15 - strlen(kt_buf), 0, kt_buf, 16, B_CYAN); continue; } /* group accelerators */ if (strchr(gacc, ch)) { menu_invert_all(win, ch); /* if PICK_ONE, gacc only contains accels for single items */ if (how == PICK_ONE) finished = 1; draw_menu_items(win, how); counting = 0; continue; } if (letter(ch) || ch == '#' || ch == '$' || ch == '*') { for (item=win->items; item; item=item->next) { if (item->identifier.a_void && ch && ch == item->accelerator) { if (counting && count > 0) { item->selected = 1; item->count = count; } else item->selected = item->selected ? 0 : 1; /* redraw menu */ draw_menu_items(win, how); sdlgl_flush(); if (how == PICK_ONE) finished = 1; break; /* from inner for loop */ } } counting = 0; continue; } counting = 0; switch (ch) { case MENU_SELECT_ALL: if (how == PICK_ANY) { menu_set_all(win, 0); draw_menu_items(win, how); } break; case MENU_UNSELECT_ALL: if (how == PICK_ANY) { menu_unset_all(win, 0); draw_menu_items(win, how); } break; case MENU_INVERT_ALL: if (how == PICK_ANY) { menu_invert_all(win, 0); draw_menu_items(win, how); } break; default: /* beep ? */ break; } } sdlgl_unmap_tilewin(win->base); sdlgl_free_tilewin(win->base); win->base = NULL; sdlgl_top_win = WIN_ERR; if (kt_win) { sdlgl_unmap_tilewin(kt_win); sdlgl_free_tilewin(kt_win); kt_win = NULL; } return cancelled ? -1 : 0; } void sdlgl_clear_menu_items(struct TextWindow *win) { struct MenuItem *item; while (win->items) { item = win->items; win->items = item->next; free(item->str); free(item); } assert(win->items == NULL); } static void draw_menu_items(struct TextWindow *win, int how) { struct TileWindow *base; struct MenuItem *item; int x, y; int maxlen; tilecol_t tilecol; char buffer[BUFSZ]; base = win->base; assert(base); assert(base->is_text); for (item=win->items,y=1; item; item=item->next,y++) { assert(y >= 0); if (item->identifier.a_void) { Sprintf(buffer, " %c ", item->accelerator ? item->accelerator : '?'); /* -AJA- displaying the full count will disturb the nice * alignment when count >= 10, but I think that showing * the value to the user is more important. */ if (item->selected && item->count > 0) Sprintf(buffer+strlen(buffer), "%d ", item->count); else if (item->selected) strcat(buffer, "+ "); else strcat(buffer, "- "); } else { /* padding character, looks better */ strcpy(buffer, " "); } strncpy(buffer+strlen(buffer), item->str, BUFSZ-strlen(buffer)-1); buffer[BUFSZ-1] = 0; tilecol = sdlgl_attr_to_tilecol(item->attr); x = 0; maxlen = win->calc_w - x; if (maxlen > 0) x += sdlgl_store_str(base, x, y, buffer, maxlen, tilecol); maxlen = win->calc_w - x; if (maxlen > 0) sdlgl_blank_area(base, x, y, maxlen, 1); } } void Sdlgl_start_menu(winid window) { struct TextWindow *win; if (window == WIN_ERR) return; assert (0 <= window && window < MAXWIN && text_wins[window]); win = text_wins[window]; if (win->type != NHW_MENU || win->is_menu == 0) return; win->is_menu = 1; win->calc_w = win->calc_h = 0; sdlgl_clear_menu_items(win); Sdlgl_clear_nhwindow(window); } /* * Add a menu item to the menu list. */ void Sdlgl_add_menu(winid window, int glyph, const anything *identifier, CHAR_P ch, CHAR_P groupacc, int attr, const char *str, BOOLEAN_P preselected) { struct TextWindow *win; struct MenuItem *item; if (window == WIN_ERR) return; assert (0 <= window && window < MAXWIN && text_wins[window]); win = text_wins[window]; if (win->type != NHW_MENU || win->is_menu != 1) return; /* highlight non-selectable entries */ if (attr == ATR_NONE && !identifier->a_void) attr = ATR_ULINE; /* create item record */ item = (struct MenuItem *) alloc(sizeof(struct MenuItem)); memset(item, 0, sizeof(struct MenuItem)); item->glyph = glyph; item->identifier = *identifier; item->accelerator = ch; item->groupacc = groupacc; item->attr = attr; item->str = strdup(str ? str : ""); item->selected = preselected; item->count = -1; /* link it in (to head of list) */ item->next = win->items; win->items = item; } /* * End a menu in this window, window must a type NHW_MENU. This routine * processes the string list. We also decide on the width and height * of the window. Finally, we supply accelerator keys for menus that * don't supply their own. */ void Sdlgl_end_menu(winid window, const char *prompt) { struct TextWindow *win; struct MenuItem *item; int used_accs[52] = { 0, }; int curr_acc = 0; if (window == WIN_ERR) return; assert (0 <= window && window < MAXWIN && text_wins[window]); win = text_wins[window]; if (win->type != NHW_MENU || win->is_menu != 1) return; /* put the prompt at the beginning of the menu */ if (prompt) { anything any; any.a_void = 0; /* not selectable */ win->items = reverse_items(win->items); Sdlgl_add_menu(window, NO_GLYPH, &any, 0,0, ATR_BOLD, "", FALSE); Sdlgl_add_menu(window, NO_GLYPH, &any, 0,0, ATR_BOLD, prompt, FALSE); /* this double reversal... bit of a hack */ win->items = reverse_items(win->items); } /* compute total width & height */ win->calc_w = 0; win->calc_h = 0; for (item=win->items; item; item=item->next) { int width = min(CO - 2, 5 + strlen(item->str)); if (width > win->calc_w) win->calc_w = width; win->calc_h++; /* mark the used accelerators */ if (item->identifier.a_void) { if ('a' <= item->accelerator && item->accelerator <= 'z') used_accs[item->accelerator - 'a'] = 0; if ('A' <= item->accelerator && item->accelerator <= 'Z') used_accs[item->accelerator - 'A' + 26] = 0; } } /* left & bottom padding character */ win->calc_w += 1; win->calc_h += 1; assert(win->calc_w > 0); assert(win->calc_h > 0); /* supply keyboard accelerators, when missing */ win->items = reverse_items(win->items); for (item=win->items; item; item=item->next) { if (!item->identifier.a_void || item->accelerator) continue; for (; curr_acc < 52 && used_accs[curr_acc]; curr_acc++) { /* nothing needed */ } if (curr_acc >= 52) /* none left */ continue; item->accelerator = (curr_acc < 26) ? ('a' + curr_acc) : ('A' + curr_acc - 26); used_accs[curr_acc++] = 1; } /* some hackitude here, to get right order */ win->items = reverse_items(win->items); } int Sdlgl_select_menu(winid window, int how, menu_item **menu_list) { struct TextWindow *win; struct MenuItem *item; menu_item *mi; int num; *menu_list = NULL; if (window == WIN_ERR) return -1; assert (0 <= window && window < MAXWIN && text_wins[window]); win = text_wins[window]; if (win->type != NHW_MENU || win->is_menu != 1) return -1; if (sdlgl_process_menu_window(window, win, how) < 0) return -1; /* see how many items were selected */ for (item=win->items, num=0; item; item=item->next) if (item->selected && item->count != 0) num++; if (num == 0) return 0; /* create record of selected items */ *menu_list = (menu_item *) alloc(num * sizeof(menu_item)); for (item=win->items, mi = *menu_list; item; item=item->next) { if (!item->selected || item->count == 0) continue; mi->item = item->identifier; mi->count = item->count; mi++; } return num; } char Sdlgl_message_menu(CHAR_P let, int how, const char *mesg) { struct TextWindow *win; if (WIN_MESSAGE == WIN_ERR) return 0; win = text_wins[WIN_MESSAGE]; assert(win); if (sdlgl_alt_prev) sdlgl_remove_scrollback(); win->more_escaped = 0; /* "menu" without selection; use ordinary method */ if (how != PICK_ONE || let == 0) { return genl_message_menu(let, how, mesg); } win->dismiss_more = let; win->more_ch = 0; Sdlgl_putstr(WIN_MESSAGE, 0, mesg); /* force the [MORE] if the message didn't wrap */ if (win->fresh_lines > 0 && win->more_ch != let) sdlgl_more(win); win->dismiss_more = 0; if (win->more_ch == let || win->more_ch == '\033') return win->more_ch; return 0; } /* * Generic yes/no function. 'def' is the default (returned by space or * return; 'esc' returns 'q', or 'n', or the default, depending on * what's in the string. The 'query' string is printed before the * user is asked about the string. * * If resp is NULL, any single character is accepted and returned. * If not-NULL, only characters in it are allowed (exceptions: the * quitchars are always allowed, and if it contains '#' then digits * are allowed); if it includes an , anything beyond that won't * be shown in the prompt to the user but will be acceptable as input. */ char Sdlgl_yn_function(const char *query, const char *resp, CHAR_P def) { struct TextWindow *win; int ch = 'n'; /* value to keep compiler sweet */ int allow_num; char prompt[BUFSZ]; char respbuf[BUFSIZ]; char *rb; if (WIN_MESSAGE == WIN_ERR) return 'n'; win = text_wins[WIN_MESSAGE]; assert(win); assert(win->base); if (sdlgl_alt_prev) sdlgl_remove_scrollback(); if (win->fresh_lines > 0) sdlgl_more(win); Sdlgl_clear_nhwindow(WIN_MESSAGE); /* disable scrollback while we control the message win */ win->scrollback_enable = 0; sdlgl_gotoxy(win, 0, 0); allow_num = (resp && strchr(resp, '#') != NULL); /* make up the prompt */ if (resp) { strcpy(respbuf, resp); rb = strchr(respbuf, '\033'); if (rb) *rb = 0; sprintf(prompt, "%s [%s] ", query, respbuf); if (def) sprintf(prompt+strlen(prompt), "(%c) ", def); } else strcpy(prompt, query); sdlgl_puts(win, prompt); for (;;) { sdlgl_flush(); ch = sdlgl_get_key(0); if (!resp) break; if (ch == C('p')) { Sdlgl_doprev_message(); continue; } if (sdlgl_alt_prev) sdlgl_remove_scrollback(); /* handle escape (yes, it's weird) */ if (ch == '\033') { ch = strchr(resp, 'q') ? 'q' : (strchr(resp, 'n') ? 'n' : def); break; } /* Note: quitchars[] is defined in the main nethack code */ if (strchr(quitchars, ch)) { ch = def; break; } if (allow_num && (ch == '#' || digit(ch))) { /* --- handle numbers --- */ int n_len = 0; int value = 0; int nc; sdlgl_putc(win, '#'); n_len++; if (digit(ch)) { sdlgl_putc(win, ch); n_len++; value = ch - '0'; } for (;;) { sdlgl_flush(); nc = sdlgl_get_key(0); if (nc == C('p')) { Sdlgl_doprev_message(); continue; } if (sdlgl_alt_prev) sdlgl_remove_scrollback(); if (digit(nc) && value <= 99999) { sdlgl_putc(win, nc); n_len++; value = value * 10 + (nc - '0'); continue; } /* handle escape */ if (nc == '\033' || (nc == '\b' && n_len <= 1)) { value = -1; break; } /* backspace */ if (nc == '\b') { assert(n_len > 1); sdlgl_puts(win, "\b \b"); n_len--; value /= 10; continue; } /* enter */ if ((nc == '\n' || nc == '\r') && n_len > 1) break; /* beep ? */ } if (value > 0) { yn_number = value; ch = '#'; break; } else if (value == 0) { ch = 'n'; break; } /* user escaped, clear number */ for (; n_len > 0; n_len--) sdlgl_puts(win, "\b \b"); continue; /* --- end of handle numbers --- */ } if (strchr(resp, ch)) break; /* beep ? */ } Sdlgl_clear_nhwindow(WIN_MESSAGE); win->scrollback_enable = 1; return (char) ch; } #endif /* GL_GRAPHICS */ /*gl_menu.c*/ slashem-0.0.7E7F3/win/gl/gl_stat.c0000664000076400007640000002362310545462317014662 0ustar aliali/* Copyright (C) 2002 Andrew Apted */ /* NetHack may be freely redistributed. See license for details. */ /* * SDL/GL window port for NetHack & Slash'EM. * * Status line (bottom of the screen). */ #include "hack.h" #if defined(GL_GRAPHICS) || defined(SDL_GRAPHICS) #define WINGL_INTERNAL #include "winGL.h" extern const char *hu_stat[]; /* from eat.c */ extern const char *enc_stat[]; /* from botl.c */ #define TURNS_TO_HIGHLIGHT 4 #define STAT_INVALID -999999 struct BottomStat { /* current value, which tracks the actual value */ int cur; /* last value (for coloring purposed) */ int last; /* Whenever the `cur' field changes, we set this to * TURNS_TO_HIGHLIGHT, which then counts down. When it reaches * zero, last := cur, and thus the value stops being highlighted. */ int turns; }; static struct BottomStat st_STR = { STAT_INVALID, STAT_INVALID, 0 }, st_DEX = { STAT_INVALID, STAT_INVALID, 0 }, st_CON = { STAT_INVALID, STAT_INVALID, 0 }, st_INT = { STAT_INVALID, STAT_INVALID, 0 }, st_WIS = { STAT_INVALID, STAT_INVALID, 0 }, st_CHA = { STAT_INVALID, STAT_INVALID, 0 }, st_DEPTH = { STAT_INVALID, STAT_INVALID, 0 }, st_GOLD = { STAT_INVALID, STAT_INVALID, 0 }, st_HP = { STAT_INVALID, STAT_INVALID, 0 }, st_HPMAX = { STAT_INVALID, STAT_INVALID, 0 }, st_EN = { STAT_INVALID, STAT_INVALID, 0 }, st_ENMAX = { STAT_INVALID, STAT_INVALID, 0 }, st_AC = { STAT_INVALID, STAT_INVALID, 0 }, st_LEVEL = { STAT_INVALID, STAT_INVALID, 0 }; /* ForestGreen (looks better than just pure green) */ #define POS_COLOR_B TXT_MAKE(1,4,1) #define NEG_COLOR_B TXT_MAKE(4,0,0) #define POS_COLOR TXT_MAKE(1,3,1) #define NEG_COLOR TXT_MAKE(3,0,0) #define AFFLICT_COLOR B_YELLOW /* spaces on the status window where we can put afflictions. Ranges * are inclusive. Order of the array is bottom up. */ static struct AfflictSpace { int x1, x2; } afflict_spaces[3]; /* ---------------------------------------------------------------- */ static void add_str(struct TextWindow *win, const char *str) { int len = strlen(str); if (win->write_x + len >= win->show_w) len = win->show_w - 1 - win->write_x; for (; len > 0; len--, str++) sdlgl_putc(win, *str); } static void add_val(struct TextWindow *win, int val, int old, int dark, int reverse) { char buffer[BUFSZ]; if (val == STAT_INVALID) { add_str(win, "??"); return; } sprintf(buffer, "%-1d", val); /* choose color based on any change */ if (old != STAT_INVALID && val != old) { if ((reverse ? 0 : 1) == (val < old ? 1 : 0)) win->write_col = dark ? NEG_COLOR : NEG_COLOR_B; else win->write_col = dark ? POS_COLOR : POS_COLOR_B; } add_str(win, buffer); win->write_col = dark ? GREY : L_GREY; } static void do_player(struct TextWindow *win, int *len) { char buf[BUFSZ]; win->write_col = GREY; strncpy(buf, plname, 10); buf[10] = 0; if ('a' <= buf[0] && buf[0] <= 'z') buf[0] += 'A' - 'a'; add_str(win, buf); add_str(win, " the "); if (Upolyd) { char mbot[BUFSZ]; int k; Strcpy(mbot, mons[u.umonnum].mname); for (k=0; mbot[k] != 0; k++) { if ((k == 0 || (k > 0 && mbot[k-1] == ' ')) && 'a' <= mbot[k] && mbot[k] <= 'z') { mbot[k] += 'A' - 'a'; } } add_str(win, mbot); } else add_str(win, rank_of(u.ulevel, Role_switch, flags.female)); if (In_quest(&u.uz)) { add_str(win, " at Home "); add_val(win, dunlev(&u.uz), STAT_INVALID, 1, 0); } else if (! In_endgame(&u.uz)) { add_str(win, " in "); add_str(win, dungeons[u.uz.dnum].dname); } else { add_str(win, Is_astralevel(&u.uz) ? " on Astral Plane" : " at End Game"); } (*len) = win->write_x; } static void do_characteristics(struct TextWindow *win, int *len) { win->write_col = GREY; add_str(win, "St:"); if (st_STR.cur > 18) { if (st_STR.cur > STR18(100)) add_val(win, st_STR.cur-100, st_STR.last-100, 1, 0); else if (st_STR.cur < STR18(100)) { add_str(win, "18/"); add_val(win, st_STR.cur-18, st_STR.last-18, 1, 0); } else add_str(win, "18/**"); } else add_val(win, st_STR.cur, st_STR.last, 1, 0); add_str(win, " Dx:"); add_val(win, st_DEX.cur, st_DEX.last, 1, 0); add_str(win, " Co:"); add_val(win, st_CON.cur, st_CON.last, 1, 0); add_str(win, " In:"); add_val(win, st_INT.cur, st_INT.last, 1, 0); add_str(win, " Wi:"); add_val(win, st_WIS.cur, st_WIS.last, 1, 0); add_str(win, " Ch:"); add_val(win, st_CHA.cur, st_CHA.last, 1, 0); #ifdef SCORE_ON_BOTL if (flags.showscore) { add_str(win, " S:"); add_val(win, (int)botl_score(), STAT_INVALID, 1, 0); } #endif add_str(win, (u.ualign.type == A_CHAOTIC) ? " Chaotic" : (u.ualign.type == A_NEUTRAL) ? " Neutral" : " Lawful"); (*len) = win->write_x; } static void do_money_hp(struct TextWindow *win, int *len) { char buf[BUFSZ]; win->write_col = L_GREY; /* show depth */ if (!In_quest(&u.uz) && !In_endgame(&u.uz)) { add_str(win, "Dlvl:"); add_val(win, st_DEPTH.cur, st_DEPTH.last, 0, 0); } sprintf(buf, " %c:", oc_syms[COIN_CLASS]); add_str(win, buf); add_val(win, st_GOLD.cur, st_GOLD.last, 0, 0); add_str(win, " HP:"); add_val(win, st_HP.cur, st_HP.last, 0, 0); add_str(win, "("); add_val(win, st_HPMAX.cur, st_HPMAX.last, 0, 0); add_str(win, ") Pw:"); add_val(win, st_EN.cur, st_EN.last, 0, 0); add_str(win, "("); add_val(win, st_ENMAX.cur, st_ENMAX.last, 0, 0); /* this one is reversed (lower is better) */ add_str(win, ") AC:"); add_val(win, st_AC.cur, st_AC.last, 0, 1); if (Upolyd) { add_str(win, " HD:"); add_val(win, mons[u.umonnum].mlevel, STAT_INVALID, 0, 0); } #ifdef EXP_ON_BOTL else if (flags.showexp) { add_str(win, " Xp:"); add_val(win, st_LEVEL.cur, st_LEVEL.last, 0, 0); add_str(win, "/"); add_val(win, (int)u.uexp, STAT_INVALID, 0, 0); } #endif else { add_str(win, " Exp:"); add_val(win, st_LEVEL.cur, st_LEVEL.last, 0, 0); } #ifdef SHOW_WEIGHT if (flags.showweight) { add_str(win, " Wt:"); add_val(win, inv_weight()+weight_cap(), STAT_INVALID, 0, 0); add_str(win, "/"); add_val(win, weight_cap(), STAT_INVALID, 0, 0); } #endif if (flags.time) { add_str(win, " T:"); add_val(win, moves, STAT_INVALID, 0, 0); } (*len) = win->write_x; } static void add_one_affliction(struct TextWindow *win, const char *name) { int x, y; int size = strlen(name) + 1; /* 1 == a padding space */ int space; for (y=0; y < 3; y++) { space = afflict_spaces[y].x2 - afflict_spaces[y].x1 + 1; if (size < space) break; } if (y >= 3) { /* NO ROOM ! Too bad... */ return; } afflict_spaces[y].x2 -= size; x = afflict_spaces[y].x2 + 1; /* draw affliction name */ assert(win->base->is_text); sdlgl_store_str(win->base, x, y, name, 99, AFFLICT_COLOR); } static void do_afflictions(struct TextWindow *win) { int cap = near_capacity(); #ifndef VANILLA_GLHACK /* Slash'EM only */ if (Invulnerable) add_one_affliction(win, "Invul"); #endif if (Levitation) add_one_affliction(win, "Lev"); else if (Flying) add_one_affliction(win, "Fly"); /* add Hungry (etc) */ if (hu_stat[u.uhs][0] != ' ') add_one_affliction(win, hu_stat[u.uhs]); if (Blind) add_one_affliction(win, "Blind"); if (Sick) { if (u.usick_type & SICK_VOMITABLE) add_one_affliction(win, "FoodPois"); else add_one_affliction(win, "Ill"); } if (Confusion) add_one_affliction(win, "Conf"); if (Stunned) add_one_affliction(win, "Stun"); if (Hallucination) add_one_affliction(win, "Hallu"); if (Slimed) add_one_affliction(win, "Slime"); /* -AJA- this idea by Roderick Schertler */ if (u.ustuck && !u.uswallow && !sticks(youmonst.data)) add_one_affliction(win, "Held"); /* display Burdened (etc) */ if (cap > UNENCUMBERED) add_one_affliction(win, enc_stat[cap]); } void sdlgl_write_status(struct TextWindow *win) { int dummy; assert(win->base); sdlgl_clear(win); sdlgl_home(win); do_player(win, &dummy); sdlgl_putc(win, '\n'); do_characteristics(win, &afflict_spaces[1].x1); sdlgl_putc(win, '\n'); do_money_hp(win, &afflict_spaces[0].x1); /* set up the spaces for placing afflictions. We clobber the first * line (player and dungeon name) as a last resort. */ afflict_spaces[2].x1 = 0; afflict_spaces[0].x2 = afflict_spaces[1].x2 = afflict_spaces[2].x2 = win->show_w - 1; do_afflictions(win); } /* ---------------------------------------------------------------- */ static void do_bottom_stat(int step, struct BottomStat *bot, int value) { /* setting initial value ? */ if (bot->last == STAT_INVALID) { bot->last = bot->cur = value; return; } if (value != bot->cur) { if (bot->turns > 0) bot->last = bot->cur; bot->cur = value; bot->turns = TURNS_TO_HIGHLIGHT; return; } if (step > 0 && bot->turns > 0) { bot->turns = max(0, bot->turns - step); if (bot->turns == 0) bot->last = bot->cur; } } void sdlgl_update_status(int step) { int hp = max(0, Upolyd ? u.mh : u.uhp); int hpmax = Upolyd ? u.mhmax : u.uhpmax; do_bottom_stat(step, &st_STR, ACURR(A_STR)); do_bottom_stat(step, &st_DEX, ACURR(A_DEX)); do_bottom_stat(step, &st_CON, ACURR(A_CON)); do_bottom_stat(step, &st_INT, ACURR(A_INT)); do_bottom_stat(step, &st_WIS, ACURR(A_WIS)); do_bottom_stat(step, &st_CHA, ACURR(A_CHA)); do_bottom_stat(step, &st_DEPTH, depth(&u.uz)); do_bottom_stat(step, &st_GOLD, (int)u.ugold); do_bottom_stat(step, &st_HP, hp); do_bottom_stat(step, &st_HPMAX, hpmax); do_bottom_stat(step, &st_EN, u.uen); do_bottom_stat(step, &st_ENMAX, u.uenmax); do_bottom_stat(step, &st_AC, u.uac); do_bottom_stat(step, &st_LEVEL, u.ulevel); } #endif /* GL_GRAPHICS */ /*gl_stat.c*/ slashem-0.0.7E7F3/win/gl/gl_role.c0000664000076400007640000003053210545462317014645 0ustar aliali/* Copyright (C) 2002 Andrew Apted */ /* NetHack may be freely redistributed. See license for details. */ /* * SDL/GL window port for NetHack & Slash'EM. * * Character selection code (Role, Race, Gender, Alignment). */ #include "hack.h" #include "dlb.h" #include "patchlevel.h" #if defined(GL_GRAPHICS) || defined(SDL_GRAPHICS) #define WINGL_INTERNAL #include "winGL.h" #include #include /* value chosen not to conflict with existing ROLE values */ #define ROLE_QUIT (-7) #define HEIGHT_PICKER 7 #define DEPTH_PICKER 8 /* callback functions used to create menus for player_selection(). * Each one returns: 1 for a valid name, 0 for an invalid name, and -1 * when the list is exhausted. For 1 and 0, the name is copied into * the buffer provided. */ static int query_role_name(int what, char *buf) { if (roles[what].name.m == NULL) return -1; if (flags.initgend >= 0 && flags.female && roles[what].name.f) strcpy(buf, roles[what].name.f); else strcpy(buf, roles[what].name.m); return ok_role(what, flags.initrace, flags.initgend, flags.initalign) ? 1 : 0; } static int query_race_name(int what, char *buf) { if (races[what].noun == NULL) return -1; strcpy(buf, races[what].noun); return ok_race(flags.initrole, what, flags.initgend, flags.initalign) ? 1 : 0; } static int query_gender_name(int what, char *buf) { if (what >= ROLE_GENDERS) return -1; strcpy(buf, genders[what].adj); return ok_gend(flags.initrole, flags.initrace, what, flags.initalign) ? 1 : 0; } static int query_align_name(int what, char *buf) { if (what >= ROLE_ALIGNS) return -1; strcpy(buf, aligns[what].adj); return ok_align(flags.initrole, flags.initrace, flags.initgend, what) ? 1 : 0; } /* print a string with line splitting. Based on sdlgl_putstr(), but * has some significant differences now. */ static void raw_puts_split(struct TextWindow *win, const char *str) { int len = strlen(str); while (len > 0) { int use_len; int width = win->show_w; /* does it fit yet ? */ if (len < width) { sdlgl_puts_nolf(win, str); return; } /* choose a good place to break the line */ for (use_len = width-1; use_len > width/2; use_len--) if (str[use_len] == ' ') break; /* no space in latter half of string ? Must be a very long token, * so we might as well split it at the screen edge. */ if (str[use_len] != ' ') use_len = width-1; for (; use_len > 0; use_len--, str++, len--) if (*str != '\n' && *str != '\r') sdlgl_putc(win, *str); sdlgl_putc(win, '\n'); /* remove leading spaces */ for (; *str == ' '; str++, len--) { } } } /* may return ROLE_RANDOM, or ROLE_NONE when the list is empty (which * can only mean that the role/race/gender/alignment combination that * the user supplied on the command line was not possible), or * ROLE_QUIT if the user pressed escape. */ static int do_player_selection_menu(const char *type, int (* func)(int what, char *buf)) { int i, kind; int valid = 0, total = 0, last = -1; winid window; anything any; int attr, choice; menu_item *selected = NULL; int used_accs[52] = { 0, }; char accel; char name[BUFSZ]; char prompt[BUFSZ]; char randstr[BUFSZ]; /* count valid entries */ for (i=0; ; i++) { kind = (* func)(i, name); if (kind < 0) break; total++; if (kind > 0) { valid++; last = i; } } if (valid == 0) return ROLE_NONE; assert(last >= 0); /* -AJA- this is disabled -- it's better IMHO to show the user the * single choice, letting them press ESC and pick some other * role/race/gender if they're not satisfied. */ #if 0 if (valid == 1) return last; #endif /* create menu */ sprintf(prompt, "Pick your %s", type); sprintf(randstr, "Random %s", type); window = Sdlgl_create_nhwindow(NHW_MENU); assert(window != WIN_ERR); Sdlgl_start_menu(window); for (i=0; i < total; i++) { kind = (* func)(i, name); any.a_void = 0; attr = ATR_NONE; /* choose accelerator key */ accel = lowc(name[0]); if (accel < 'a' || accel > 'z') accel = 0; else { if (! used_accs[accel - 'a']) used_accs[accel - 'a'] = 1; else { accel = highc(accel); if (! used_accs[accel - 'A' + 26]) used_accs[accel - 'A' + 26] = 1; else accel = 0; } } if (kind > 0) { /* must add one, zero is not allowed */ any.a_int = 1 + i; } else { /* shift name right (to align), and make dim */ memmove(name + 5, name, strlen(name) + 1); memcpy(name, " ", 5); attr = ATR_DIM; } Sdlgl_add_menu(window, NO_GLYPH, &any, accel, 0 /* no groupacc */, attr, name, MENU_UNSELECTED); } /* add `Random' line (unless there's only one choice) */ if (valid > 1) { any.a_int = 1 + total; Sdlgl_add_menu(window, NO_GLYPH, &any, '*', 0 /* no groupacc */, ATR_NONE, randstr, MENU_UNSELECTED); } Sdlgl_end_menu(window, prompt); /* get result back from menu */ i = Sdlgl_select_menu(window, PICK_ONE, &selected); Sdlgl_destroy_nhwindow(window); if (i <= 0) return ROLE_QUIT; assert(i == 1 && selected); choice = selected[0].item.a_int - 1; free(selected); assert(0 <= choice && choice <= total); if (choice == total) return ROLE_RANDOM; return choice; } /* These return -1 if cancelled, otherwise 0. */ static int select_auto_pick(int *pick4u) { struct TextWindow *win; int pixel_h; int ch; /* handle the fully random (-@) option */ if (flags.randomall) { (* pick4u) = 1; return 0; } /* create text & tile windows */ win = sdlgl_new_textwin(NHW_TEXT); /* type unimportant */ win->show_w = sdlgl_width / sdlgl_font_message->tile_w; win->show_h = HEIGHT_PICKER; pixel_h = sdlgl_font_message->tile_h * win->show_h; win->base = sdlgl_new_tilewin(sdlgl_font_message, win->show_w, win->show_h, 1,0); sdlgl_map_tilewin(win->base, 0, sdlgl_height - pixel_h, sdlgl_width, pixel_h, DEPTH_PICKER); /* do the query */ { char pbuf[QBUFSZ]; const char *prompt = "Shall I pick a character for you? [ynq] "; if (flags.initrole != ROLE_NONE || flags.initrace != ROLE_NONE || flags.initgend != ROLE_NONE || flags.initalign != ROLE_NONE) { prompt = build_plselection_prompt(pbuf, QBUFSZ, flags.initrole, flags.initrace, flags.initgend, flags.initalign); } sdlgl_home(win); /* if the copyright wasn't shown on the splash screen (because it * was disabled), then show it here. */ if (! iflags.wc_splash_screen) { sdlgl_puts(win, COPYRIGHT_BANNER_A "\n"); sdlgl_puts(win, COPYRIGHT_BANNER_B "\n"); sdlgl_puts(win, COPYRIGHT_BANNER_C "\n"); sdlgl_puts(win, "\n"); } raw_puts_split(win, prompt); } do { sdlgl_flush(); ch = sdlgl_get_key(0); } while (strchr("ynq\033", ch) == NULL); sdlgl_unmap_tilewin(win->base); sdlgl_free_textwin(win); if (ch == 'q' || ch == '\033') return -1; /* should we randomly pick for the player ? */ (* pick4u) = (ch == 'y') ? 1 : 0; return 0; } static int select_a_role(int pick4u) { int choice; while (flags.initrole < 0) { if (pick4u || flags.initrole == ROLE_RANDOM || flags.randomall) { flags.initrole = pick_role(flags.initrace, flags.initgend, flags.initalign, PICK_RANDOM); break; } /* select a role */ for (;;) { choice = do_player_selection_menu("role", query_role_name); if (choice != ROLE_NONE) break; /* reset */ if (flags.initalign >= 0) flags.initalign = ROLE_NONE; else if (flags.initgend >= 0) flags.initgend = ROLE_NONE; else if (flags.initrace >= 0) flags.initrace = ROLE_NONE; else return 0; } if (choice == ROLE_QUIT) { flags.initrole = ROLE_NONE; return -1; } flags.initrole = choice; } return 0; } static int select_a_race(int pick4u) { int choice; while (!validrace(flags.initrole, flags.initrace)) { if (pick4u || flags.initrace == ROLE_RANDOM || flags.randomall) { flags.initrace = pick_race(flags.initrole, flags.initgend, flags.initalign, PICK_RANDOM); break; } /* select a race */ for (;;) { choice = do_player_selection_menu("race", query_race_name); if (choice != ROLE_NONE) break; /* reset */ if (flags.initalign >= 0) flags.initalign = ROLE_NONE; else if (flags.initgend >= 0) flags.initgend = ROLE_NONE; else return 0; } if (choice == ROLE_QUIT) { flags.initrole = ROLE_NONE; flags.initrace = ROLE_NONE; return -1; } flags.initrace = choice; } return 0; } static int select_a_gender(int pick4u) { int choice; while (!validgend(flags.initrole, flags.initrace, flags.initgend)) { if (pick4u || flags.initgend == ROLE_RANDOM || flags.randomall) { flags.initgend = pick_gend(flags.initrole, flags.initrace, flags.initalign, PICK_RANDOM); break; } /* select a gender */ for (;;) { choice = do_player_selection_menu("gender", query_gender_name); if (choice != ROLE_NONE) break; /* reset */ if (flags.initalign >= 0) flags.initalign = ROLE_NONE; else return 0; } if (choice == ROLE_QUIT) { flags.initrace = ROLE_NONE; flags.initgend = ROLE_NONE; return -1; } flags.initgend = choice; } return 0; } static int select_an_alignment(int pick4u) { int choice; while (!validalign(flags.initrole, flags.initrace, flags.initalign)) { if (pick4u || flags.initalign == ROLE_RANDOM || flags.randomall) { /* pick_align */ flags.initalign = pick_align(flags.initrole, flags.initrace, flags.initgend, PICK_RANDOM); break; } /* select an alignment */ for (;;) { choice = do_player_selection_menu("alignment", query_align_name); if (choice != ROLE_NONE) break; /* nothing to reset ! */ return 0; } if (choice == ROLE_QUIT) { flags.initgend = ROLE_NONE; flags.initalign = ROLE_NONE; return -1; } flags.initalign = choice; } return 0; } #define INIT_IS_RANDOM(val) \ ((val) == ROLE_RANDOM || \ (flags.randomall && (val) == ROLE_NONE)) static void do_random_role_checks(void) { if (INIT_IS_RANDOM(flags.initrole)) { flags.initrole = pick_role(flags.initrace, flags.initgend, flags.initalign, PICK_RANDOM); } if (INIT_IS_RANDOM(flags.initrace)) { flags.initrace = pick_race(flags.initrole, flags.initgend, flags.initalign, PICK_RANDOM); } if (INIT_IS_RANDOM(flags.initalign)) { flags.initalign = pick_align(flags.initrole, flags.initrace, flags.initgend, PICK_RANDOM); } if (INIT_IS_RANDOM(flags.initgend)) { flags.initgend = pick_gend(flags.initrole, flags.initrace, flags.initalign, PICK_RANDOM); } } void Sdlgl_player_selection(void) { /* -AJA- Note that the initrole, initrace, initgend and initalign * fields of the `flag' global have been set to ROLE_NONE in * the initoptions() routine in src/options.c. Those values * may then be updated by the system code (sys/unixmain.c) * depending on command line options. */ int pick4u; /* avoid unnecessary prompts further down */ do_random_role_checks(); rigid_role_checks(); if (select_auto_pick(&pick4u) < 0) sdlgl_error("Quit from pick-for-you prompt.\n"); for (;;) { if (select_a_role(pick4u) < 0) sdlgl_error("Quit from player selection menu.\n"); if (select_a_race(pick4u) < 0) continue; if (select_a_gender(pick4u) < 0) continue; if (select_an_alignment(pick4u) < 0) continue; break; } if (flags.initrole < 0 || flags.initrace < 0 || flags.initgend < 0 || flags.initalign < 0) { raw_printf("WARNING: failed to select a valid character ! " "(%d,%d,%d,%d)\n", flags.initrole, flags.initrace, flags.initgend, flags.initalign); /* do nothing -- let init_role() deal with it */ } } #endif /* GL_GRAPHICS */ /*gl_role.c*/ slashem-0.0.7E7F3/win/gl/gl_map.c0000664000076400007640000005612310545462317014465 0ustar aliali/* Copyright (C) 2002 Andrew Apted */ /* NetHack may be freely redistributed. See license for details. */ /* * SDL/GL window port for NetHack & Slash'EM. * * Handles the map window. */ #include "hack.h" #include "display.h" #include "patchlevel.h" #if defined(GL_GRAPHICS) || defined(SDL_GRAPHICS) #define WINGL_INTERNAL #include "winGL.h" static int zoom_sets[] = { 10, 12, 16, 20, 24, 32, 40, 48, 64, 80, 96, 128 }; #define NUM_ZOOM (SIZE(zoom_sets)) int sdlgl_quantize_zoom(int zoom_h) { int i; if (zoom_h == TEXT_ZOOM) return zoom_h; if (sdlgl_software) { if (iflags.wc_tile_height <= 16) { /* with 16x16 tileset in SW mode, no zooming possible */ return 16; } return (zoom_h < iflags.wc_tile_height * 3 / 4) ? (iflags.wc_tile_height / 2) : iflags.wc_tile_height; } for (i=NUM_ZOOM-1; i > 0; i--) { if (zoom_sets[i] > iflags.wc_tile_height * 4) continue; if (zoom_sets[i-1] <= iflags.wc_tile_height / 4) break; if (zoom_h >= zoom_sets[i]) break; } return zoom_sets[i]; } static void center_on_text_map(struct TextWindow *win) { int tw, th; int mx, my; assert(win->base); assert(win->base->is_text); tw = win->base->scale_w; th = win->base->scale_h; /* doesn't need to use scale_skew (text map is never skewed) */ mx = win->base->total_w * tw / 2 - win->base->scr_w / 2; my = win->base->total_h * th / 2 - win->base->scr_h / 2; sdlgl_set_pan(win->base, mx, my); } static void center_on_player(struct TextWindow *win) { int tw, th, tk; int fx, fy; assert(win->base); assert(! win->base->is_text); tw = win->base->scale_w; th = win->base->scale_h; tk = win->base->scale_skew; fx = win->focus_x * tw + tw / 2 - win->base->scr_w / 2 + win->focus_y * tk; fy = win->focus_y * th + th / 2 - win->base->scr_h / 2; sdlgl_set_pan(win->base, fx, fy); win->map_px = fx; win->map_py = fy; win->jail_x = 0; win->jail_y = 0; } void sdlgl_create_map(struct TextWindow *win, int w, int h) { int i; assert(win->base); win->base->is_map = 1; win->base->curs_color = OUTLINE_COL; win->glyphs = (struct GlyphPair *) alloc(w * h * sizeof(struct GlyphPair)); for (i=0; i < win->base->total_h * win->base->total_w; i++) { win->glyphs[i].bg = NO_GLYPH; win->glyphs[i].fg = NO_GLYPH; } win->map_px = 0; win->map_py = 0; if (sdlgl_def_zoom == TEXT_ZOOM) { win->zoom_h = iflags.wc_tile_height; sdlgl_change_tileset(win->base, sdlgl_font_map, 1); sdlgl_set_scale(win->base, sdlgl_font_map->tile_h); center_on_text_map(win); } else { win->zoom_h = sdlgl_def_zoom; sdlgl_set_scale(win->base, win->zoom_h); center_on_player(win); } } static int glyph_is_translucent(int glyph_fg, int lev_x, int lev_y) { /* The glyph can be drawn 50% translucent under these conditions: * (a) it is a monster or the player. * (b) it is invisible. * (c) the player can see invisible. * (d) if it wasn't invisible, the player would be able to see it * using normal vision. */ struct monst *mtmp; if (glyph_fg == NO_GLYPH) return 0; assert(glyph_fg <= MAX_GLYPH); /* handle the player */ if (lev_x == u.ux && lev_y == u.uy) { return canseeself() && Invis; } if (! glyph_is_monster(glyph_fg)) return 0; mtmp = m_at(lev_x, lev_y); if (! mtmp) return 0; return knowninvisible(mtmp); } static int glyph_is_dungeon(glyphidx_t glyph) { if (! glyph_is_cmap(glyph)) return 0; /* There are some glyphs in the CMAP range that can stay in the * foreground (everything else in CMAP must go into background). * * These belong elsewhere IMHO (either ZAP range or a new one). */ if (glyph == cmap_to_glyph(S_digbeam) || glyph == cmap_to_glyph(S_flashbeam) || glyph == cmap_to_glyph(S_boomleft) || glyph == cmap_to_glyph(S_boomright)) { return 0; } if (glyph >= cmap_to_glyph(S_ss1) && glyph <= cmap_to_glyph(S_ss4)) { return 0; } if (glyph >= cmap_to_glyph(S_explode1) && glyph <= cmap_to_glyph(S_explode9)) { return 0; } return 1; } static int back_to_trap(XCHAR_P lev_x, XCHAR_P lev_y) { struct trap *trap = t_at(lev_x, lev_y); if (!trap || !trap->tseen) return NO_GLYPH; return trap_to_glyph(trap); } #define cannot_see(x,y) \ (Blind || (viz_array && !cansee((x), (y)))) static void make_double_glyph(struct GlyphPair *gpair, XCHAR_P lev_x, XCHAR_P lev_y, glyphidx_t glyph) { int back; if (glyph_is_dungeon(glyph)) { back = glyph; glyph = NO_GLYPH; } else { back = back_to_glyph(lev_x, lev_y); /* handle traps */ if (back == NO_GLYPH || back == cmap_to_glyph(S_room) || back == cmap_to_glyph(S_stone) || back == cmap_to_glyph(S_corr) || back == cmap_to_glyph(S_litcorr)) { int tt = back_to_trap(lev_x, lev_y); if (tt != NO_GLYPH && tt != glyph) back = tt; } if (!levl[lev_x][lev_y].waslit && cannot_see(lev_x, lev_y)) { if (back == cmap_to_glyph(S_room)) back = cmap_to_glyph(S_stone); else if (back == cmap_to_glyph(S_litcorr)) back = cmap_to_glyph(S_corr); } } /* S_stone (a fully black tile) never needs to be drawn. */ if (back == cmap_to_glyph(S_stone)) back = NO_GLYPH; if (back == glyph) glyph = NO_GLYPH; gpair->fg = glyph; gpair->bg = back; } static void glyph_to_character(struct TextWindow *win, struct GlyphPair * gpair, int x, int y) { int ch; rgbcol_t rgb; int glyph = (gpair->fg != NO_GLYPH) ? gpair->fg : gpair->bg; int color; unsigned special; if (glyph == NO_GLYPH) { sdlgl_blank_area(win->base, x, y, 1, 1); return; } /* Map the glyph back to a character */ mapglyph(glyph, &ch, &color, &special, x, y); if (color == NO_COLOR) rgb = L_GREY; else rgb = termcolor_to_tilecol[color]; /* store it */ { char ch_b = (char)ch; sdlgl_store_char(win->base, x, y, ch_b, rgb); } } static void glyph_to_tilepair(struct TextWindow *win, struct GlyphPair *glyph, int x, int y) { tileidx_t fg, mg, bg; tileflags_t flags = 0; int lev_x = x; int lev_y = win->base->total_h - 1 - y; /* foreground */ if (glyph->fg == NO_GLYPH) { fg = TILE_EMPTY; } else { int glyph_fg = glyph->fg; /* prevent glyph_is_monster() warning */ assert(glyph->fg <= MAX_GLYPH); fg = glyph2tile[glyph->fg]; /* support for horizontal flipping */ if (sdlgl_flipping) { int dx = 0; /* handle the player */ if (lev_x == u.ux && lev_y == u.uy && fg < NUM_MON_TILES) { dx = (u.dx != 0) ? u.dx : win->player_dx; } else if (glyph_is_monster(glyph_fg) && m_at(lev_x, lev_y)) { struct monst *mon = m_at(lev_x, lev_y); int i; /* find last horizontal move. A better approach would be to add * a field to the monster struct for which way the monster is * facing (8 possible dirs), updated in the movement (and * attacking !) code. That's a lot of work though... */ for (i=0; i < MTSZ; i++) { dx = mon->mx - mon->mtrack[i].x; if (dx != 0) break; } } dx = dx * -sdlgl_mon_tile_face_dir(fg); if (dx > 0) flags |= TILE_F_FLIPX; } /* support for translucent invisibles */ if (sdlgl_invis_fx && iflags.wc_tile_height >= 32) { if (glyph_is_translucent(glyph_fg, lev_x, lev_y)) flags |= TILE_F_TRANS50; } } /* background and mid-ground */ if (glyph->bg == NO_GLYPH) { mg = bg = TILE_EMPTY; } else { assert(glyph->bg <= MAX_GLYPH); /* the ROOM tile always lets the BG shine through */ if (glyph->bg == cmap_to_glyph(S_room)) mg = TILE_EMPTY; else mg = glyph2tile[glyph->bg]; bg = #ifdef VANILLA_GLHACK In_mines(&u.uz) ? Fl_Mine : In_sokoban(&u.uz) ? Fl_Sokoban : Is_knox(&u.uz) ? Fl_Knox : (In_V_tower(&u.uz) || In_W_tower(lev_x, lev_y, &u.uz)) ? Fl_Tower : In_hell(&u.uz) ? Fl_Hell : In_quest(&u.uz) ? Fl_Quest : In_endgame(&u.uz) ? Fl_Astral : Is_medusa_level(&u.uz) ? Fl_Beach : # ifndef VANILLA_GLHACK /* FIXME !!! In_caves(&u.uz) ? Fl_Caves : */ # endif # ifdef REINCARNATION Is_rogue_level(&u.uz) ? Fl_Rogue : # endif #endif /* otherwise */ glyph2tile[cmap_to_glyph(S_room)]; } sdlgl_store_tile(win->base, x, y, fg, mg, bg, flags); } static void update_map_extras(struct TextWindow *win, short x, short y, struct GlyphPair *glyph) { struct TileWindow *base = win->base; int worm_tail; sdlgl_remove_extrashapes(base, x, y); worm_tail = (glyph->fg == petnum_to_glyph(PM_LONG_WORM_TAIL)); if (iflags.wc_hilite_pet && ! worm_tail) { int on_left = 0; /* determine if heart is placed on left or right side */ if (sdlgl_flipping && ! base->is_text && (base->tiles[(int)y * base->total_w + x].flags & TILE_F_FLIPX)) { on_left = 1; } if (glyph_is_pet(glyph->fg)) sdlgl_add_extrashape(base, SHAPE_Heart, x, y, on_left, 0); else if (glyph_is_ridden_monster(glyph->fg)) sdlgl_add_extrashape(base, SHAPE_Ridden, x, y, on_left, 0); } } /* * sdlgl_print_glyph * * Print the glyph to the output device. Don't flush the output device. * * Since this is only called from show_glyph(), it is assumed that the * position and glyph are always correct (checked there)! */ void Sdlgl_print_glyph(winid window, XCHAR_P x, XCHAR_P y, int glyph) { struct TextWindow *win; int xx, yy, offset; if (window == WIN_ERR) return; assert (0 <= window && window < MAXWIN && text_wins[window]); win = text_wins[window]; if (win->type != NHW_MAP) return; if (! win->base) return; assert(win->glyphs); xx = (int)x; yy = win->base->total_h - 1 - (int)y; if (xx < 0 || xx >= win->base->total_w || yy < 0 || yy >= win->base->total_h) { return; } /* give the map window a border. We do this *here* so that the * border doesn't get drawn during the initial game prompts. */ win->base->has_border = 1; offset = yy * win->base->total_w + xx; make_double_glyph(win->glyphs + offset, x, y, (glyphidx_t) glyph); if (win->base->is_text) glyph_to_character(win, win->glyphs + offset, xx, yy); else glyph_to_tilepair(win, win->glyphs + offset, xx, yy); update_map_extras(win, xx, yy, win->glyphs + offset); } static void update_all_glyphs(struct TextWindow *win) { int x, y; int offset; assert(win->base); assert(win->glyphs); for (y=0; y < win->base->total_h; y++) for (x=0; x < win->base->total_w; x++) { offset = y * win->base->total_w + x; if (win->base->is_text) glyph_to_character(win, win->glyphs + offset, x, y); else glyph_to_tilepair(win, win->glyphs + offset, x, y); update_map_extras(win, x, y, win->glyphs + offset); } } #if 0 /* clips the given vector (starting at the origin) by the rectangle * centered on the origin, with width = 2*w and height = 2*h. */ static void clip_vector(int *dx, int *dy, int w, int h) { int neg_dx; int neg_dy; if (( neg_dx = ((*dx) < 0) )) (*dx) = -(*dx); if (( neg_dy = ((*dy) < 0) )) (*dy) = -(*dy); if ((*dx) > w) { (*dy) = (*dy) * w / (*dx); (*dx) = w; } if ((*dy) > h) { (*dx) = (*dx) * h / (*dy); (*dy) = h; } if (neg_dx) (*dx) = -(*dx); if (neg_dy) (*dy) = -(*dy); } #endif /* Definitive jail: * * WIDTH = scr_w * jail_size / 100; (pixels) * * SCREEN X1 = scr_w/2 + jail_sdx - jw/2; * SCREEN X2 = scr_w/2 + jail_sdx + jw/2; * * MAP X1 = (map_px + SCREEN X1) / tw; (whole tiles) * MAP X2 = (map_px + SCREEN X2) / tw; * * MAP W = (MAP X2 - MAP X1) + 1; */ static void update_jail(struct TextWindow *win) { int fx, fy, tw, th, tk; int jx, jy, jw, jh; int extra_x, extra_y; struct TileWindow *base = win->base; assert(base); tw = base->scale_w; th = base->scale_h; tk = base->scale_skew; /* no jail required for text view. We just center the map on the * screen. We assume it fits -- only when using a very small mode * (640x400) is there any chance it won't (the user can always use * the 8x8 font instead of the 8x14 one). */ if (base->is_text) return; /* handle chunky scrolling mode here. The X margin is inflated * since the map window is a lot wider than it is high. */ if (sdlgl_jump_scroll) { int marg_x = tw * iflags.wc_scroll_margin * 17 / 10; int marg_y = th * iflags.wc_scroll_margin; fx = win->focus_x * tw + tw / 2 + win->focus_y * tk; fy = win->focus_y * th + th / 2; if (fx < win->map_px + marg_x || fx > win->map_px + base->scr_w - marg_x) { win->map_px = fx - win->base->scr_w / 2; } if (fy < win->map_py + marg_y || fy > win->map_py + base->scr_h - marg_y) { win->map_py = fy - win->base->scr_h / 2; } sdlgl_set_pan(win->base, win->map_px, win->map_py); return; } /* make sure jail offset is valid */ extra_x = base->scr_w * (100 - sdlgl_jail_size) / 200 + 2; extra_y = base->scr_h * (100 - sdlgl_jail_size) / 200 + 2; if (abs(win->jail_x) > extra_x) win->jail_x = sgn(win->jail_x) * extra_x; if (abs(win->jail_y) > extra_y) win->jail_y = sgn(win->jail_y) * extra_y; /* shift jail if focus has moved outside it, panning the map window * when necessary. * * This is complicated by allowing the jail to be non-centered on * the screen; the code here "auto-centers" it rather than panning. * Removing the loops is left as an exercise for the reader :). */ fx = win->focus_x * tw + tw / 2 + win->focus_y * tk; fy = win->focus_y * th + th / 2; /* jail no smaller than one tile */ jw = max(tw, base->scr_w * sdlgl_jail_size / 100); jh = max(th, base->scr_h * sdlgl_jail_size / 100); jx = win->map_px + base->scr_w/2 + win->jail_x - jw/2; jy = win->map_py + base->scr_h/2 + win->jail_y - jh/2; while (fx < jx) { if (win->jail_x >= tw) win->jail_x -= tw; else win->map_px -= tw; jx = win->map_px + base->scr_w/2 + win->jail_x - jw/2; } while (fy < jy) { if (win->jail_y >= th) win->jail_y -= th; else win->map_py -= th; jy = win->map_py + base->scr_h/2 + win->jail_y - jh/2; } while (fx > jx + jw) { if (win->jail_x <= -tw) win->jail_x += tw; else win->map_px += tw; jx = win->map_px + base->scr_w/2 + win->jail_x - jw/2; } while (fy > jy + jh) { if (win->jail_y <= -th) win->jail_y += th; else win->map_py += th; jy = win->map_py + base->scr_h/2 + win->jail_y - jh/2; } /* auto-center the jail when possible. Panning not affected. */ while (win->jail_x <= -tw && fx > jx + tw) { win->jail_x += tw; jx = win->map_px + base->scr_w/2 + win->jail_x - jw/2; } while (win->jail_y <= -th && fy > jy + th) { win->jail_y += th; jy = win->map_py + base->scr_h/2 + win->jail_y - jh/2; } while (win->jail_x >= tw && fx < jx + jw - tw) { win->jail_x -= tw; jx = win->map_px + base->scr_w/2 + win->jail_x - jw/2; } while (win->jail_y >= th && fy < jy + jh - th) { win->jail_y -= th; jy = win->map_py + base->scr_h/2 + win->jail_y - jh/2; } sdlgl_set_pan(win->base, win->map_px, win->map_py); } void Sdlgl_cliparound(int x, int y) { struct TextWindow *win; int player_x, player_y; if (sdlgl_map_win == WIN_ERR) return; win = text_wins[sdlgl_map_win]; assert(win); if (! win->base) return; player_x = u.ux; player_y = win->base->total_h - 1 - u.uy; /* update player direction */ if (u.dx != 0) win->player_dx = u.dx; y = win->base->total_h - 1 - y; if (x < 0 || x >= win->base->total_w || y < 0 || y >= win->base->total_h) return; win->focus_x = x; win->focus_y = y; update_jail(win); /* draw cursor, unless it's on the player */ if (!win->write_cursor && x == player_x && y == player_y) { sdlgl_set_cursor(win->base, -1, -1, 1); } else { sdlgl_set_cursor(win->base, x, y, 1); } } int sdlgl_cursor_visible(void) { struct TextWindow *win; if (sdlgl_map_win == WIN_ERR) return 0; win = text_wins[sdlgl_map_win]; assert(win); if (! win->base) return 0; return (win->base->curs_x >= 0); } static void do_zoom(struct TextWindow *win, int zoom_h) { struct TileWindow *base; int tw, th, tk; int dx, dy; int cur_x, cur_y; base = win->base; assert(base); assert(! base->is_text); assert(zoom_h != TEXT_ZOOM); assert(sdlgl_quantize_zoom(zoom_h) == zoom_h); if (zoom_h == win->zoom_h) return; /* compute the center of the focus tile, in terms of on-screen * pixels. */ tw = base->scale_w; th = base->scale_h; tk = base->scale_skew; cur_x = win->focus_x * tw + tw / 2 - win->map_px + win->focus_y * tk; cur_y = win->focus_y * th + th / 2 - win->map_py; /* update zoom */ win->zoom_h = zoom_h; /* update panning, so that the focus tile remains as close as * possible on the screen to where it was before. */ sdlgl_set_scale(win->base, zoom_h); tw = win->base->scale_w; th = win->base->scale_h; tk = win->base->scale_skew; win->map_px = win->focus_x * tw + tw / 2 - cur_x + win->focus_y * tk; win->map_py = win->focus_y * th + th / 2 - cur_y; /* move jail center towards focus, upto 1 tile step. The rough * clipping (handling dx & dy separately) doesn't matter. We rely * on update_jail() to limit jail_x/y to valid values. */ dx = cur_x - (base->scr_w / 2 + win->jail_x); dy = cur_y - (base->scr_h / 2 + win->jail_y); if (abs(dx) >= tw) dx = sgn(dx) * tw; if (abs(dy) >= th) dy = sgn(dy) * th; win->jail_x += dx / 2; win->jail_y += dy / 2; update_jail(win); } /* adjust is -1 to zoom out, +1 to zoom in, * -2 to zoom to maximum, +2 to zoom to default. */ void sdlgl_zoom_map(int adjust) { struct TextWindow *win; int zoom_h; if (sdlgl_map_win == WIN_ERR) return; win = text_wins[sdlgl_map_win]; assert(win); assert(win->zoom_h != TEXT_ZOOM); /* ignore CTRL-PGUP/PGDN if the default zoom is text-mode. */ if (sdlgl_def_zoom == TEXT_ZOOM && abs(adjust) == 2) return; /* allow CTRL-PGUP/PGDN to switch from text-mode. The rationale * behind not doing this for plain PGUP/DN is that the result could * be confusing or unexpected. With CTRL, a specific zoom factor is * implied. */ if (win->base->is_text) { if (abs(adjust) != 2) return; sdlgl_toggle_text_view(); } if (adjust == -2) zoom_h = sdlgl_quantize_zoom(1); else if (adjust == +2) zoom_h = sdlgl_def_zoom; else { if (sdlgl_software) { if (iflags.wc_tile_height <= 16) return; zoom_h = (adjust < 0) ? (iflags.wc_tile_height / 2) : iflags.wc_tile_height; } else /* OpenGL, all zooms are available */ { int i; for (i=0; i < NUM_ZOOM; i++) if (zoom_sets[i] == win->zoom_h) break; assert(i != NUM_ZOOM); i = max(0, min(NUM_ZOOM-1, i + adjust)); zoom_h = sdlgl_quantize_zoom(zoom_sets[i]); } } do_zoom(win, zoom_h); } void sdlgl_center_screen_on_player(void) { struct TextWindow *win; if (sdlgl_map_win == WIN_ERR) return; win = text_wins[sdlgl_map_win]; assert(win); if (win->base->is_text) return; center_on_player(win); } void sdlgl_toggle_text_view(void) { struct TextWindow *win; if (sdlgl_map_win == WIN_ERR) return; win = text_wins[sdlgl_map_win]; assert(win); assert(win->base); assert(win->glyphs); if (win->base->is_text) { sdlgl_change_tileset(win->base, sdlgl_tiles, 0); update_all_glyphs(win); sdlgl_set_scale(win->base, win->zoom_h); update_jail(win); return; } sdlgl_change_tileset(win->base, sdlgl_font_map, 1); update_all_glyphs(win); sdlgl_set_scale(win->base, sdlgl_font_map->tile_h); center_on_text_map(win); } #ifdef POSITIONBAR void Sdlgl_update_positionbar(char *posbar) { /* implement this one day... */ } #endif /* returns 1 if found (updating the x/y coords), otherwise 0. */ int sdlgl_find_click(int window, int *x, int *y) { struct TextWindow *win; struct TileWindow *base; int xx, yy; if (window == WIN_ERR) return 0; win = text_wins[window]; if (! win || ! win->base) return 0; base = win->base; xx = *x - base->scr_x; yy = sdlgl_height - 1 - *y - base->scr_y; if (xx < 0 || yy < 0 || xx >= base->scr_w || yy >= base->scr_h) return 0; yy = (yy + base->pan_y) / base->scale_h; xx = (xx + base->pan_x - yy * base->scale_skew) / base->scale_w; if (xx < 0 || yy < 0 || xx >= base->total_w || yy >= base->total_h) return 0; *x = xx; *y = base->total_h - 1 - yy; return 1; } /* * Pan the map by the given offset. The dx/dy values have the * following meanings (in absolute value) : * * 0 - no change (but compute anyway). * 1 - move by a single tile. * 2 - move by a bunch of tiles (5 or so). * 3 - move by a "page" (the window size). * 4 - move as far as possible. */ void sdlgl_pan_map_window(int dx, int dy) { struct TextWindow *win; int tw, th; int show_w, show_h; int map_w, map_h; if (sdlgl_map_win == WIN_ERR) return; win = text_wins[sdlgl_map_win]; assert(win); assert(win->base); if (win->base->is_text) return; tw = win->base->scale_w; th = win->base->scale_h; show_w = max(1, win->base->scr_w / tw); show_h = max(1, win->base->scr_h / th); map_w = win->base->total_w * win->base->scale_w + win->base->total_h * win->base->scale_skew; map_h = win->base->total_h * win->base->scale_h; switch (abs(dx)) { case 2: dx = sgn(dx) * min(6, show_w); break; case 3: dx = sgn(dx) * (show_w - 1); break; case 4: dx = sgn(dx) * 999; break; } switch (abs(dy)) { case 2: dy = sgn(dy) * min(4, show_h); break; case 3: dy = sgn(dy) * (show_h - 1); break; case 4: dy = sgn(dy) * 999; break; } dx *= tw; dy *= th; /* limit the amount moved so that the map stays on-screen. */ map_w = max(0, map_w - win->base->scr_w); map_h = max(0, map_h - win->base->scr_h); if (dx < 0 && win->map_px + dx < -2 * tw) dx = min(0, -2 * tw - win->map_px); if (dx > 0 && win->map_px + dx > map_w + 2 * tw) dx = max(0, map_w + 2 * tw - win->map_px); if (dy < 0 && win->map_py + dy < -2 * th) dy = min(0, -2 * th - win->map_py); if (dy > 0 && win->map_py + dy > map_h + 2 * th) dy = max(0, map_h + 2 * th - win->map_py); /* update jail center */ if (dx < 0) win->jail_x = min(0, win->jail_x + -dx); else if (dx > 0) win->jail_x = max(0, win->jail_x - dx); if (dy < 0) win->jail_y = min(0, win->jail_y + -dy); else if (dy > 0) win->jail_y = max(0, win->jail_y - dy); /* update panning */ win->map_px += dx; win->map_py += dy; sdlgl_set_pan(win->base, win->map_px, win->map_py); sdlgl_flush(); } #endif /* GL_GRAPHICS */ /*gl_map.c*/ slashem-0.0.7E7F3/win/gl/gl_opt.c0000664000076400007640000004255110545462317014512 0ustar aliali/* Copyright (C) 2002 Andrew Apted */ /* NetHack may be freely redistributed. See license for details. */ /* * SDL/GL window port for NetHack & Slash'EM. * * Parses options, from both the command-line and the config file. */ #include "hack.h" #include "dlb.h" #include "patchlevel.h" #include "date.h" #if defined(GL_GRAPHICS) || defined(SDL_GRAPHICS) #define WINGL_INTERNAL #include "winGL.h" #include #include #include int sdlgl_width = 0; int sdlgl_height = 0; int sdlgl_depth = 0; /* other configurable vars: ints... */ int sdlgl_windowed = DEF_SDLGL_WINDOWED; int sdlgl_key_repeat = DEF_SDLGL_KEYREPEAT; int sdlgl_jail_size = 0; int sdlgl_prev_step = 0; int sdlgl_gamma = 0; /* range is -5 to +5 */ static int fontsize_override = 0; /* booleans... */ int sdlgl_def_zoom = 0; int sdlgl_msg_dim = 0; int sdlgl_alt_prev = 0; int sdlgl_reformat = 0; int sdlgl_shrink_wrap = 0; int sdlgl_flipping = 0; int sdlgl_jump_scroll = 0; int sdlgl_invis_fx = 0; enum OptionValueType { VALTYPE_INTEGER, VALTYPE_BOOLEAN, /* true or false, 1 or 0. Can be absent */ VALTYPE_DOUBLE, VALTYPE_STRING, VALTYPE_VID_MODE, /* video mode like "800x600" */ VALTYPE_KEY_REPEAT, }; enum LocalOptionFlags { /* option is only for backwards compatibility */ LOPT_BACKW_COMPAT = 0x0001, /* option only available on the command line */ LOPT_CMDLINE_ONLY = 0x0002, /* option only available in the config file. * (Note that LOPT_BACKW_COMPAT implies this). */ LOPT_FILE_ONLY = 0x0004 }; struct LocalOption { const char *name; const char *desc; void *val_ptr; /* pointer to value storage */ int val_type; /* one of the VALTYPE_* values */ int flags; }; static struct LocalOption local_option_list[] = { { "mode", "Video mode (screen resolution)", NULL, VALTYPE_VID_MODE, 0 }, { "depth", "Video depth (color bits per pixel)", &sdlgl_depth, VALTYPE_INTEGER, 0 }, { "windowed", "Runs in a window instead of fullscreen", &sdlgl_windowed, VALTYPE_BOOLEAN, 0 }, { "gamma", "Gamma correction (-5 to +5, where 0 is normal)", &sdlgl_gamma, VALTYPE_INTEGER, 0 }, /* ---- command-line only options ---- */ { "tileheight", "Which tileset to use (16, 32 or 64)", &iflags.wc_tile_height, VALTYPE_INTEGER, LOPT_CMDLINE_ONLY }, { "fontsize", "Size of text font (8, 14, 20 or 22)", &fontsize_override, VALTYPE_INTEGER, LOPT_CMDLINE_ONLY }, /* ---- config-file only options ---- */ { "defzoom", "Default zoom (size of on-screen tiles)", &sdlgl_def_zoom, VALTYPE_INTEGER, LOPT_FILE_ONLY }, { "keyrepeat", "Key autorepeat (never, partial, or always)", &sdlgl_key_repeat, VALTYPE_KEY_REPEAT, LOPT_FILE_ONLY }, #if 0 { "msgdim", "Dim the message window rather than clear it", &sdlgl_msg_dim, VALTYPE_BOOLEAN, LOPT_FILE_ONLY }, #endif { "altprev", "Alternate previous history mode (^P)", &sdlgl_alt_prev, VALTYPE_BOOLEAN, LOPT_FILE_ONLY }, { "prevstep", "Lines to step through previous history", &sdlgl_prev_step, VALTYPE_INTEGER, LOPT_FILE_ONLY }, { "reformat", "Reformat text windows that are too wide", &sdlgl_reformat, VALTYPE_BOOLEAN, LOPT_FILE_ONLY }, { "shrinkwrap", "Shrink the font when text window too big", &sdlgl_shrink_wrap, VALTYPE_BOOLEAN, LOPT_FILE_ONLY }, { "flipping", "Flip monster tiles to match their movement", &sdlgl_flipping, VALTYPE_BOOLEAN, LOPT_FILE_ONLY }, { "invisfx", "Draw invisible but seen monsters translucent", &sdlgl_invis_fx, VALTYPE_BOOLEAN, LOPT_FILE_ONLY }, { "jumpscroll", "Scroll the map window in large steps", &sdlgl_jump_scroll, VALTYPE_BOOLEAN, LOPT_FILE_ONLY }, { "jailsize", "Percentage of screen which doesn't scroll", &sdlgl_jail_size, VALTYPE_INTEGER, LOPT_FILE_ONLY }, /* ---- options kept for backwards compatibility ---- */ { "tilesize", "Backwards Compatibility Only", &iflags.wc_tile_height, VALTYPE_INTEGER, LOPT_BACKW_COMPAT }, { "textfont", "Backwards Compatibility Only", &iflags.wc_fontsiz_message, VALTYPE_INTEGER, LOPT_BACKW_COMPAT }, { "mapfont", "Backwards Compatibility Only", &iflags.wc_fontsiz_map, VALTYPE_INTEGER, LOPT_BACKW_COMPAT }, { "msglines", "Backwards Compatibility Only", &iflags.wc_vary_msgcount, VALTYPE_INTEGER, LOPT_BACKW_COMPAT }, { NULL, NULL, NULL, 0, 0 } }; /* returns a valid index, or -1 if not found. Sets `negated' to 1 if * found and the "no" prefix was used, otherwise it is unchanged. */ static int find_local_option(const char *word, int *negated) { int i; const char *curname; for (i=0; (curname = local_option_list[i].name); i++) { if (strncmp(word, curname, strlen(curname)) == 0) return i; } /* handle the "no" prefix. */ if (! (word[0] == 'n' && word[1] == 'o' && letter(word[2]))) return -1; word += 2; for (i=0; (curname = local_option_list[i].name); i++) { if (strncmp(word, curname, strlen(curname)) == 0) { (*negated) = 1; return i; } } return -1; } static void parse_single_option(int optidx, const char *par, int from_file, int negated) { struct LocalOption *opt = local_option_list + optidx; int *intp; double *doubp; char tmp; assert(opt->name); if (par && strlen(par) == 0) par = NULL; if (! par && (opt->val_type != VALTYPE_BOOLEAN)) { sdlgl_error("The %s%s option requires a parameter.\n", from_file ? "" : "--", opt->name); } /* strings not handled yet */ assert(opt->val_type != VALTYPE_STRING); switch (opt->val_type) { case VALTYPE_VID_MODE: /* * the `mode' option must be handled specially. We assume that * it's the only VALTYPE_VID_MODE option in the list. */ assert(par); sscanf(par, "%d x %d", &sdlgl_width, &sdlgl_height); break; case VALTYPE_KEY_REPEAT: /* * the `keyrepeat' option is also a bit special, it takes the * values "never", "partial" and "always". For backwards * compatibility, integer values from 0 to 2 are also accepted. */ intp = (int *) opt->val_ptr; assert(intp); assert(par); tmp = tolower(*par); switch (tmp) { case '0': case 'n': /* never */ (*intp) = 0; break; case '1': case 'p': /* partial */ (*intp) = 1; break; case '2': case 'a': /* always */ (*intp) = 2; break; default: sdlgl_warning("Bad %s syntax: %s:%s.\n", from_file ? "GL_OPTIONS" : SDLGL_ENV_VAR, opt->name, par); Sdlgl_wait_synch(); break; } break; case VALTYPE_BOOLEAN: intp = (int *) opt->val_ptr; assert(intp); if (! par) *intp = ! negated; else if (par[0] == '0' || lowc(par[0]) == 'f') *intp = 0; else *intp = 1; break; case VALTYPE_INTEGER: intp = (int *) opt->val_ptr; assert(intp); assert(par); sscanf(par, "%d", intp); break; case VALTYPE_DOUBLE: doubp = (double *) opt->val_ptr; assert(doubp); assert(par); sscanf(par, "%lf", doubp); break; default: sdlgl_error("parse_single_option INTERNAL error on --%s.", opt->name); } } static void show_help_message(void) { fprintf(stderr, #ifdef VANILLA_GLHACK "glHack " GLHACK_VER_STR " (C) 2002 Andrew Apted\n" "See the homepage at http://glhack.sourceforge.net/\n" "This is port of NetHack -- see http://www.nethack.org/\n" "\n" "Some standard NetHack options:\n" #else "Slash'EM " VERSION_STRING " - SDL/GL window port\n" "See the homepage at http://slashem.sourceforge.net/\n" "\n" "Some standard Slash'EM options:\n" #endif " -u UserName : name your character in the game.\n" " -p Profession : profession (role) of your character.\n" " -r Race : race of your character.\n" " -@ : choose random character attributes.\n" " -X : enter non-scoring eXplore mode.\n" " -s : show list of high-scores and exit.\n" "\n" #ifdef VANILLA_GLHACK "Some glHack specific options:\n" #else "Some SDL/GL specific options:\n" #endif " --mode 640x480 : specify the video mode.\n" " --depth 24 : the video depth (bits per pixel).\n" " --windowed : run in a window (instead of fullscreen).\n" " --tileheight 16 : select tile height (16 or 32).\n" " --fontsize 22 : choose text font (8, 14, 20 or 22).\n" "\n" "Please view the docs for more information, including\n" "the complete list of available options.\n" ); sdlgl_error(""); /* NOT REACHED */ } static void show_version_message(void) { #ifdef VANILLA_GLHACK fprintf(stderr, "glHack version " GLHACK_VER_STR "\n"); #else fprintf(stderr, "Slash'EM version " VERSION_STRING " (SDL/GL window port)\n"); #endif sdlgl_error(""); /* NOT REACHED */ } /* this is called from src/files.c when parsing the config file. */ void Sdlgl_parse_options(char *opts, int initial, int from_file) { char *par; int optidx; int negated = 0; /* note the clever trick here using recursion to split and handle * NUL-terminated option strings. Copied from src/options.c. */ if ((par = strchr(opts, ',')) != 0) { *par++ = 0; Sdlgl_parse_options(par, initial, from_file); } /* strip leading and trailing white space */ while (isspace(*opts)) opts++; par = eos(opts); while (--par >= opts && isspace(*par)) *par = 0; if (opts[0] == '!') opts++, negated = 1; optidx = find_local_option(opts, &negated); par = NULL; if (optidx >= 0 && (local_option_list[optidx].flags & LOPT_CMDLINE_ONLY)) { /* treat as though it wasn't found */ optidx = -1; } if (optidx < 0) { /* same logic as badoption() in src/option.c */ if (!initial) { pline("Bad GL_OPTIONS syntax: %s.", opts); return; } if (from_file) sdlgl_warning("Bad GL_OPTIONS syntax: %s.\n", opts); else sdlgl_warning("Bad " SDLGL_ENV_VAR " syntax: %s.\n", opts); Sdlgl_wait_synch(); return; } if (local_option_list[optidx].val_type != VALTYPE_BOOLEAN) { /* if the option requires a parameter, find it after a `:' * character (NOT an `=' char like for command line args). */ par = strchr(opts, ':'); if (par) par++; } parse_single_option(optidx, par, from_file, negated); } void sdlgl_parse_cmdline_options(int *argcp, char **argv) { int num, opt; int negated; char **dest_argv; const char *word, *par; /* skip the program name */ argv++; dest_argv = argv; num = (*argcp) - 1; while (num > 0) { num--; /* we require options to start with a double dash, not only to be * all GNU-ish (which is nice), but so we don't clash with the * single dash / single letter options in unixmain.c (etc). */ if (argv[0][0] != '-' || argv[0][1] != '-') { /* not an option */ *dest_argv++ = *argv++; continue; } word = argv[0] + 2; if (strcmp(word, "help") == 0) { /* this exits the program */ show_help_message(); } if (strcmp(word, "version") == 0) { /* this exits the program */ show_version_message(); } negated = 0; opt = find_local_option(word, &negated); par = NULL; if (opt >= 0 && (local_option_list[opt].flags & LOPT_BACKW_COMPAT)) { /* backwards compatibility option */ sdlgl_warning("The --%s option has been replaced or removed.\n", local_option_list[opt].name); sdlgl_warning("Please see the docs for more information.\n"); Sdlgl_wait_synch(); *dest_argv++ = *argv++; continue; } if (opt >= 0 && (local_option_list[opt].flags & LOPT_FILE_ONLY)) { /* treat as though it wasn't found */ opt = -1; } if (opt < 0) { /* unrecognised option */ *dest_argv++ = *argv++; continue; } /* swallow arg string */ argv++; if (local_option_list[opt].val_type != VALTYPE_BOOLEAN) { /* the following options require a parameter. Find it either in * the same argument string (after an `=' char), or as the next * argument. */ par = strchr(word, '='); if (par) par++; else if (num > 0 && argv[0][0] != '-') { par = argv[0]; /* swallow the parameter */ num--; argv++; } } parse_single_option(opt, par, 0 /* from_file */, negated); } assert(dest_argv <= argv); dest_argv[0] = NULL; /* compute number of deleted argument strings */ (*argcp) -= (argv - dest_argv); } #undef SET_WARN #define SET_WARN(str,var,defval) \ sdlgl_warning(str " %d not supported. Using default (%d).\n", \ var, (defval)); \ Sdlgl_wait_synch(); \ var = (defval); #undef RANGE_CHK #define RANGE_CHK(str,var,mini,maxi) \ if (var < (mini)) \ { \ sdlgl_warning(str " %d too low. Using minimum (%d).\n", \ var, (mini)); \ Sdlgl_wait_synch(); \ var = (mini); \ } \ else if (var > (maxi)) \ { \ sdlgl_warning(str " %d too high. Using maximum (%d).\n", \ var, (maxi)); \ Sdlgl_wait_synch(); \ var = (maxi); \ } void sdlgl_validate_wincap_options(void) { set_wc_option_mod_status(WC_SCROLL_MARGIN, 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_SCROLL_MARGIN; } if (iflags.wc_tile_height <= 0) { iflags.wc_tile_height = DEF_TILE_HEIGHT; } else if (iflags.wc_tile_height != 16 && iflags.wc_tile_height != 32 && iflags.wc_tile_height != 64 ) { SET_WARN("Tile height", iflags.wc_tile_height, DEF_TILE_HEIGHT); } /* set the tileset name if not already set. */ #ifndef VANILLA_GLHACK if (tileset[0] == 0) { if (iflags.wc_tile_height == 16) strcpy(tileset, "Small tiles"); else strcpy(tileset, "Big tiles"); } #endif if (iflags.wc_vary_msgcount <= 0) { iflags.wc_vary_msgcount = DEF_VARY_MSGCOUNT; } else { RANGE_CHK("Message count", iflags.wc_vary_msgcount, MIN_MESSAGE, MAX_MESSAGE); } /* ---- handle font sizes ---- */ #undef FONT_CHK #define FONT_CHK(str,var,defval) \ if (var <= 0) \ var = (defval); \ else if (var != sdlgl_quantize_font(var)) \ { \ SET_WARN(str,var,defval); \ } FONT_CHK("Map font size", iflags.wc_fontsiz_map, DEF_FONTSIZ_MAP); if (fontsize_override > 0) { FONT_CHK("Font size", fontsize_override, DEF_FONTSIZ_TEXT); iflags.wc_fontsiz_message = fontsize_override; iflags.wc_fontsiz_status = fontsize_override; iflags.wc_fontsiz_menu = fontsize_override; iflags.wc_fontsiz_text = fontsize_override; } else { FONT_CHK("Message font size", iflags.wc_fontsiz_message, DEF_FONTSIZ_TEXT); FONT_CHK("Status font size", iflags.wc_fontsiz_status, iflags.wc_fontsiz_message); FONT_CHK("Menu font size", iflags.wc_fontsiz_menu, iflags.wc_fontsiz_message); FONT_CHK("Text font size", iflags.wc_fontsiz_text, iflags.wc_fontsiz_menu); } } void sdlgl_validate_gl_options(void) { if (sdlgl_width <= 0 || sdlgl_height <= 0) { sdlgl_width = sdlgl_height = 0; /* autodetect */ } else { if (sdlgl_width < MIN_SDLGL_WIDTH || sdlgl_height < MIN_SDLGL_HEIGHT) { sdlgl_warning("Video mode %dx%d too small. Using %dx%d.\n", sdlgl_width, sdlgl_height, MIN_SDLGL_WIDTH, MIN_SDLGL_HEIGHT); sdlgl_width = MIN_SDLGL_WIDTH; sdlgl_height = MIN_SDLGL_HEIGHT; } else if (sdlgl_width > MAX_SDLGL_WIDTH || sdlgl_height > MAX_SDLGL_HEIGHT) { sdlgl_warning("Video mode %dx%d too large. Using %dx%d.\n", sdlgl_width, sdlgl_height, MAX_SDLGL_WIDTH, MAX_SDLGL_HEIGHT); sdlgl_width = MAX_SDLGL_WIDTH; sdlgl_height = MAX_SDLGL_HEIGHT; } } if (sdlgl_depth <= 0) { sdlgl_depth = 0; /* autodetect */ } else switch (sdlgl_depth) { case 8: case 15: case 16: case 24: case 32: break; default: SET_WARN("Video depth", sdlgl_depth, DEF_SDLGL_DEPTH); break; } RANGE_CHK("Gamma", sdlgl_gamma, -5, +5); if (sdlgl_def_zoom <= 0) { sdlgl_def_zoom = iflags.wc_tile_height; } else if (sdlgl_def_zoom <= 8) { sdlgl_def_zoom = TEXT_ZOOM; } sdlgl_def_zoom = sdlgl_quantize_zoom(sdlgl_def_zoom); if (sdlgl_jail_size <= 0) { sdlgl_jail_size = DEF_SDLGL_JAILSIZE; } else { RANGE_CHK("Jail size", sdlgl_jail_size, 1, 100); } if (sdlgl_prev_step <= 0) { sdlgl_prev_step = sdlgl_alt_prev ? iflags.wc_vary_msgcount : DEF_SDLGL_PREVSTEP; } else if (sdlgl_alt_prev) { sdlgl_prev_step = min(sdlgl_prev_step, iflags.wc_vary_msgcount); } else if (sdlgl_prev_step > MAX_SDLGL_PREVSTEP) { sdlgl_prev_step = MAX_SDLGL_PREVSTEP; } } void Sdlgl_preference_update(const char *pref) { if (strcmpi(pref, "scroll_margin") == 0) { Sdlgl_cliparound(u.ux, u.uy); sdlgl_flush(); return; } } #endif /* GL_GRAPHICS */ /*gl_opt.c*/ slashem-0.0.7E7F3/win/gl/gl_hardw.c0000664000076400007640000004150610545462317015014 0ustar aliali/* Copyright (C) 2002 Andrew Apted */ /* NetHack may be freely redistributed. See license for details. */ /* * SDL/GL window port for NetHack & Slash'EM. * * Hardware accelerated drawing code (using OpenGL). */ #include "hack.h" #include "patchlevel.h" #if defined(GL_GRAPHICS) /* hardware only */ #define WINGL_INTERNAL #include "winGL.h" #define TILE_PAD 2 #define RIP_ALPHA 0.64 static GLuint pet_mark_id = 0; static GLuint ridden_mark_id = 0; static rgbcol_t fade_color = RGB_MAKE(0, 0, 0); void hw_rend_startup(void) { sdlgl_unit_startup(); } void hw_rend_shutdown(void) { sdlgl_unit_shutdown(); } /* ---------------------------------------------------------------- */ static GH_INLINE void copy_border_pix(unsigned char *tex_dat, int dx, int dy, int ex, int ey, int e_stride, int tw, int th) { int sx = 1 + max(0, min(tw - 1, dx - 1)); int sy = 1 + max(0, min(th - 1, dy - 1)); unsigned char *src = tex_dat + (ey+th+TILE_PAD-1-sy) * e_stride + (ex+sx) * 4; unsigned char *dest = tex_dat + (ey+th+TILE_PAD-1-dy) * e_stride + (ex+dx) * 4; dest[0] = src[0]; dest[1] = src[1]; dest[2] = src[2]; dest[3] = src[3]; } static void copy_one_tile(struct TileSet *set, int is_text, const unsigned char *image_dat, int sx, int sy, int s_stride, unsigned char *tex_dat, int ex, int ey, int e_stride, unsigned char *has_alpha) { int dx, dy; int alpha_flag = 0; int tw = set->tile_w; int th = set->tile_h; for (dy = 0; dy < th; dy++) for (dx = 0; dx < tw; dx++) { const unsigned char *src = image_dat + (sy+dy) * s_stride + (sx+dx) * 4; unsigned char *dst = tex_dat + (ey+th+TILE_PAD-1-(dy+1)) * e_stride + (ex+(dx+1)) * 4; /* copy RGBA colors, handling alpha */ if (src[3] < 128) { dst[0] = dst[1] = dst[2] = 0; dst[3] = 0; alpha_flag = 1; } else { dst[0] = GAMMA(src[0]); dst[1] = GAMMA(src[1]); dst[2] = GAMMA(src[2]); dst[3] = 255; } } /* for text tiles, we simply leave the padding blank. * for graphical tiles, we copy the border pixels to the padding. */ if (! is_text) { for (dy=0; dy <= (th + 1); dy += (th + 1)) for (dx=0; dx < (tw + TILE_PAD); dx++) { copy_border_pix(tex_dat, dx, dy, ex, ey, e_stride, tw, th); } for (dx=0; dx <= (tw + 1); dx += (tw + 1)) for (dy=1; dy < (th + TILE_PAD - 1); dy++) { copy_border_pix(tex_dat, dx, dy, ex, ey, e_stride, tw, th); } } (*has_alpha) = (unsigned char) alpha_flag; } GLuint sdlgl_send_graphic_RGBA(unsigned char *data, int width, int height) { GLuint id; glGenTextures(1, &id); glBindTexture(GL_TEXTURE_2D, id); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexImage2D(GL_TEXTURE_2D, 0, 4, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); return id; } /* * Note: assumes image_dat is 4 bytes per pixel (RGBA) */ static void create_tile_texture(struct TileSet *set, int is_text, const unsigned char *image_dat, int image_w, int image_h, unsigned char *tex_dat, int num_w, int num_h, int n) { int dx, dy; int pack_total = set->pack_w * set->pack_h; GLuint id; /* clear texture, mainly for the last-page case */ memset(tex_dat, 0, set->tex_size_w * set->tex_size_h * 4); for (dy = 0; dy < set->pack_h; dy++) for (dx = 0; dx < set->pack_w; dx++) { int tile = n * pack_total + (dy * set->pack_w) + dx; /* source location in image_dat */ int sx = (tile % num_w) * set->tile_w; int sy = (tile / num_w) * set->tile_h; /* end location in tex_dat */ int ex = dx * (set->tile_w + TILE_PAD); int ey = dy * (set->tile_h + TILE_PAD); if (tile < set->tile_num) { copy_one_tile(set, is_text, image_dat, sx, sy, image_w * 4, tex_dat, ex, ey, set->tex_size_w * 4, set->has_alpha + tile); } } id = sdlgl_send_graphic_RGBA(tex_dat, set->tex_size_w, set->tex_size_h); #if 0 /* Test the new image */ glColor3f(1.0, 1.0, 1.0); glBegin(GL_QUADS); glTexCoord2f(0,0); glVertex2i(0,0); glTexCoord2f(0,1); glVertex2i(0,300); glTexCoord2f(1,1); glVertex2i(300,300); glTexCoord2f(1,0); glVertex2i(300,0); glEnd(); SDL_GL_SwapBuffers(); sleep(10); #endif set->tex_ids[n] = id; } static struct TileSet *hw_load_tileset(const char *filename, int tile_w, int tile_h, int is_text, int keep_rgba, int *across, int *down) { struct TileSet *set; unsigned char *image_dat; unsigned char *tex_dat; int n, image_w, image_h; int num_w, num_h, pack_total; glEnable(GL_TEXTURE_2D); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); image_dat = sdlgl_load_png_file(filename, &image_w, &image_h); if (! image_dat) { sdlgl_error("Could not load tileset %s\n", filename); return NULL; /* NOT REACHED */ } /* check size */ if (image_h < tile_h || image_w < tile_w || (image_h % tile_h) != 0 || (image_w % tile_w) != 0) { free(image_dat); sdlgl_error("PNG file `%s' has bad dimensions (total %dx%d) " "(tile %dx%d)\n", filename, image_w, image_h, tile_w, tile_h); return NULL; /* NOT REACHED */ } num_w = image_w / tile_w; num_h = image_h / tile_h; set = (struct TileSet *) alloc(sizeof(struct TileSet)); memset(set, 0, sizeof(struct TileSet)); set->tile_num = num_h * num_w; set->tile_w = tile_w; set->tile_h = tile_h; set->lap_w = (tile_h == 64) ? 16 : 0; set->lap_h = (tile_h == 64) ? 32 : 0; set->lap_skew = (tile_h == 64) ? 16 : 0; set->tex_size_w = sdlgl_tex_max; set->tex_size_h = sdlgl_tex_max; /* tiles are packed into 256x256 GL textures */ set->pack_w = set->tex_size_w / (tile_w + TILE_PAD); set->pack_h = set->tex_size_h / (tile_h + TILE_PAD); pack_total = set->pack_w * set->pack_h; assert(set->pack_w > 0 && set->pack_h > 0); set->tex_num = (set->tile_num + pack_total - 1) / pack_total; assert(set->tex_num > 0); /* shrink texture size if possible */ if (set->tex_num == 1) { int rows = (set->tile_num + set->pack_w - 1) / set->pack_w; while (rows * (tile_h + TILE_PAD) <= (set->tex_size_h / 2)) set->tex_size_h /= 2; set->pack_h = set->tex_size_h / (tile_h + TILE_PAD); pack_total = set->pack_w * set->pack_h; assert(1 == (set->tile_num + pack_total - 1) / pack_total); } /* allocate temp texture space */ tex_dat = (unsigned char *) alloc(set->tex_size_w * set->tex_size_h * 4); set->tex_ids = (GLuint *) alloc(set->tex_num * sizeof(GLuint)); set->has_alpha = (unsigned char *) alloc(set->tile_num); /* create textures & send to the GL */ for (n=0; n < set->tex_num; n++) { create_tile_texture(set, is_text, image_dat, image_w, image_h, tex_dat, num_w, num_h, n); } /* all done, free stuff */ free(image_dat); free(tex_dat); glDisable(GL_TEXTURE_2D); #if 0 /* DEBUGGING */ sdlgl_warning("%s (%dx%d) loaded from %s\n", is_text ? "FONT" : "TILESET", set->tile_w, set->tile_h, filename); #endif if (across) (*across) = num_w; if (down) (*down) = num_h; return set; } static void hw_free_tileset(struct TileSet *set) { if (set->tex_ids) { glDeleteTextures(set->tex_num, set->tex_ids); free(set->tex_ids); set->tex_ids = NULL; } if (set->has_alpha) { free(set->has_alpha); set->has_alpha = NULL; } free(set); } /* ---------------------------------------------------------------- */ static void hw_create_extra_graphics(void) { int x, y; unsigned char pet_dat[8 * 8 * 4]; assert(pet_mark_id == 0); glEnable(GL_TEXTURE_2D); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); /* create the normal pet mark (8x8) */ for (y=0; y < 8; y++) for (x=0; x < 8; x++) { int pix = pet_mark_bits[7 - y] & (1 << (7-x)); pet_dat[(y*8 + x) * 4 + 0] = pix ? 255 : 0; pet_dat[(y*8 + x) * 4 + 1] = pix ? 0 : 0; pet_dat[(y*8 + x) * 4 + 2] = pix ? 0 : 0; pet_dat[(y*8 + x) * 4 + 3] = pix ? 255 : 0; } pet_mark_id = sdlgl_send_graphic_RGBA(pet_dat, 8, 8); /* create the ridden monster mark (8x8) */ for (y=0; y < 8; y++) for (x=0; x < 8; x++) { int pix = ridden_mark_bits[7 - y] & (1 << (7-x)); pet_dat[(y*8 + x) * 4 + 0] = pix ? 0 : 0; pet_dat[(y*8 + x) * 4 + 1] = pix ? 224 : 0; pet_dat[(y*8 + x) * 4 + 2] = pix ? 0 : 0; pet_dat[(y*8 + x) * 4 + 3] = pix ? 255 : 0; } ridden_mark_id = sdlgl_send_graphic_RGBA(pet_dat, 8, 8); glDisable(GL_TEXTURE_2D); } static void hw_free_extra_shapes(void) { if (pet_mark_id) glDeleteTextures(1, &pet_mark_id); pet_mark_id = 0; if (ridden_mark_id) glDeleteTextures(1, &ridden_mark_id); ridden_mark_id = 0; } /* ---------------------------------------------------------------- */ static void hw_enable_clipper(int x, int y, int w, int h) { glEnable(GL_SCISSOR_TEST); glScissor(x, y, w, h); } static void hw_disable_clipper(void) { glDisable(GL_SCISSOR_TEST); } #if 0 /* JAIL debugging */ static void debug_jail(void) { if (sdlgl_map_win != WIN_ERR) { struct TextWindow *win; struct TileWindow *base; win = text_wins[sdlgl_map_win]; if (win && ((base = win->base))) { int jw = base->scr_w * sdlgl_jail_size / 200; int jh = base->scr_h * sdlgl_jail_size / 200; int mx = base->scr_x + base->scr_w / 2 + win->jail_x; int my = base->scr_y + base->scr_h / 2 + win->jail_y; glColor3f(0.0, 1.0, 0.0); glBegin(GL_LINE_LOOP); glVertex2i(mx-jw, my-jh); glVertex2i(mx-jw, my+jh); glVertex2i(mx+jw, my+jh); glVertex2i(mx+jw, my-jh); glEnd(); } } } #endif static void hw_blit_frame(void) { SDL_GL_SwapBuffers(); } /* ---------------------------------------------------------------- */ #define BG_STEP 32 static void hw_set_rgb_color(rgbcol_t color, float trans) { glColor4f(GAMMA_F(RGB_RED(color)), GAMMA_F(RGB_GRN(color)), GAMMA_F(RGB_BLU(color)), trans); } static void hw_draw_background(int sx, int sy, int sw, int sh, rgbcol_t color, int start_idx, int depth) { int x, y; int bx, by, bw, bh; /* fill background color */ hw_set_rgb_color(color, 1); glBegin(GL_QUADS); /* break rectangle into 32x32 blocks, skipping any blocks that are * obscured by higher windows. Note how we do this _inside_ the * glBegin/glEnd pair -- this is very important for speed. */ for (y=0; y < sh; y += BG_STEP) for (x=0; x < sw; x += BG_STEP) { bx = sx + x; by = sy + y; bw = min(sw - x, BG_STEP); bh = min(sh - y, BG_STEP); /* the for loop prevents zero sizes */ assert(bw > 0 && bh > 0); if (! sdlgl_test_tile_visible(start_idx, bx, by, bw, bh)) continue; glVertex2i(bx, by); glVertex2i(bx, by+bh); glVertex2i(bx+bw, by+bh); glVertex2i(bx+bw, by); } glEnd(); } static void hw_draw_extra_shape(struct TileWindow *win, struct ExtraShape *shape) { int sx, sy, sw, sh; int size; sw = win->scale_w; sh = win->scale_h; sx = win->scr_x - win->pan_x + shape->x * sw + shape->y * win->scale_skew; sy = win->scr_y - win->pan_y + shape->y * sh; /* trivial clipping */ if (sx + sw <= win->scr_x || sx >= win->scr_x + win->scr_w) return; if (sy + sh * 2 <= win->scr_y || sy >= win->scr_y + win->scr_h) return; switch (shape->type) { case SHAPE_None: break; case SHAPE_Heart: case SHAPE_Ridden: /* * par1: 0 is normal, 1 puts it on the left. */ sx += win->scale_full_w * (shape->par1 ? 1 : 3) / 4; size = (win->scale_h <= 10) ? 6 : 8; if (win->scale_h > 24) size += (win->scale_h - 24) / 4; sy += (win->scale_full_h - sh) * 3 / 5; if (win->scale_h < 16) sy += 4; sx -= size / 2; glEnable(GL_TEXTURE_2D); if (shape->type == SHAPE_Ridden) glBindTexture(GL_TEXTURE_2D, ridden_mark_id); else glBindTexture(GL_TEXTURE_2D, pet_mark_id); glColor3f(1.0, 1.0, 1.0); glEnable(GL_BLEND); glBegin(GL_QUADS); glTexCoord2f(0.01, 0.01); glVertex2i(sx, sy+sh-size); glTexCoord2f(0.01, 0.99); glVertex2i(sx, sy+sh); glTexCoord2f(0.99, 0.99); glVertex2i(sx+size, sy+sh); glTexCoord2f(0.99, 0.01); glVertex2i(sx+size, sy+sh-size); glEnd(); glDisable(GL_TEXTURE_2D); glDisable(GL_BLEND); break; } } static void hw_draw_cursor(struct TileWindow *win) { int x = win->curs_x; int y = win->curs_y; int w = win->curs_w; rgbcol_t col = win->curs_color; int sx, sy, sw, sh; assert(x >= 0 && y >= 0 && w > 0); sw = win->scale_w; sh = win->scale_h; sx = win->scr_x - win->pan_x + x * sw + y * win->scale_skew; sy = win->scr_y - win->pan_y + y * sh; sw = sw * (w - 1) + win->scale_full_w; sh = win->scale_full_h; /* trivial clipping */ if (sx + sw <= win->scr_x || sx >= win->scr_x + win->scr_w) return; if (sy + sh <= win->scr_y || sy >= win->scr_y + win->scr_h) return; hw_set_rgb_color(col, 1); if (win->curs_block) { glBegin(GL_QUADS); glVertex2i(sx, sy); glVertex2i(sx, sy+sh); glVertex2i(sx+sw, sy+sh); glVertex2i(sx+sw, sy); glEnd(); } else { glBegin(GL_LINE_LOOP); glVertex2i(sx, sy); glVertex2i(sx, sy+sh); glVertex2i(sx+sw, sy+sh); glVertex2i(sx+sw, sy); glEnd(); } } static void hw_draw_border(struct TileWindow *win, rgbcol_t col) { int sx, sy, sw, sh; int skew; sw = win->total_w * win->scale_w; sh = win->total_h * win->scale_h; skew = win->total_h * win->scale_skew; sx = win->scr_x - win->pan_x; sy = win->scr_y - win->pan_y; hw_set_rgb_color(col, 1); glBegin(GL_LINE_LOOP); glVertex2i(sx, sy); glVertex2i(sx+skew, sy+sh); glVertex2i(sx+skew+sw, sy+sh); glVertex2i(sx+sw, sy); glEnd(); } static void hw_begin_tile_draw(int blending, int overlap) { sdlgl_begin_units(blending, overlap); } static void hw_finish_tile_draw(void) { sdlgl_finish_units(); } static void hw_draw_tile(struct TileWindow *win, int sx, int sy, int sw, int sh, tileidx_t tile, tilecol_t tilecol, tileflags_t flags, short layer) { struct TileSet *set = win->set; rgbcol_t color; int bx, by, til_idx; float tx1, ty1, tx2, ty2; float fudge = 0.1; int tw = set->tile_w + TILE_PAD; int th = set->tile_h + TILE_PAD; float tsize_w = set->tex_size_w; float tsize_h = set->tex_size_h; assert(set); assert(tile < set->tile_num); /* ignore spaces */ if (win->is_text && TILE_2_CHAR(tile) == (unsigned char)' ') return; til_idx = tile / (set->pack_w * set->pack_h); tile %= (set->pack_w * set->pack_h); bx = tile % set->pack_w; by = tile / set->pack_w; /* a little fudging to get the pixels we want */ tx1 = ((bx + 0) * tw + 1 + fudge) / tsize_w; ty1 = ((by + 0) * th + 1 + fudge) / tsize_h; tx2 = ((bx + 1) * tw - 1 - fudge) / tsize_w; ty2 = ((by + 1) * th - 1 - fudge) / tsize_h; if (flags & TILE_F_FLIPX) { float tmp = tx1; tx1 = tx2; tx2 = tmp; } if (win->is_text) color = sdlgl_text_colors[tilecol & 0xFF]; else color = RGB_MAKE(255, 255, 255); sdlgl_add_unit(set->tex_ids[til_idx], tx1, ty1, tx2, ty2, sx, sy, sw, sh, layer, color, win->see_through ? RIP_ALPHA : (flags & TILE_F_TRANS50) ? 0.5 : 1); } static void hw_start_fading(int max_w, int min_y) { /* not needed */ } static void hw_finish_fading(void) { /* not needed */ } static void hw_draw_fading(float fade_amount) { glEnable(GL_BLEND); hw_set_rgb_color(fade_color, fade_amount); glBegin(GL_QUADS); glVertex2i(0, 0); glVertex2i(0, sdlgl_height); glVertex2i(sdlgl_width, sdlgl_height); glVertex2i(sdlgl_width, 0); glEnd(); glDisable(GL_BLEND); } /* ---------------------------------------------------------------- */ static void hw_set_pan(struct TileWindow *win, int x, int y) { win->pan_x = x; win->pan_y = y; } static void hw_set_new_pos(struct TileWindow *win, int x, int y, int w, int h) { assert(w > 0 && h > 0); assert(win->scr_depth > 0); win->scr_x = x; win->scr_y = y; win->scr_w = w; win->scr_h = h; } static void hw_mark_dirty(int x, int y, int w, int h, int depth) { /* nothing needed */ } /* ---------------------------------------------------------------- */ /* Rendering interface table. */ struct rendering_procs sdlgl_hardw_rend_procs = { hw_rend_startup, hw_rend_shutdown, hw_load_tileset, hw_free_tileset, hw_create_extra_graphics, hw_free_extra_shapes, hw_enable_clipper, hw_disable_clipper, hw_blit_frame, hw_draw_background, hw_draw_extra_shape, hw_draw_cursor, hw_begin_tile_draw, hw_draw_tile, hw_finish_tile_draw, hw_draw_border, hw_start_fading, hw_draw_fading, hw_finish_fading, sdlgl_hw_make_screenshot, hw_set_pan, hw_set_new_pos, hw_mark_dirty }; #endif /* GL_GRAPHICS */ /*gl_hardw.c*/ slashem-0.0.7E7F3/win/gl/Install.GL0000664000076400007640000000754110545462317014714 0ustar alialiInstalling Slash'EM with a SDL/GL interface ------------------------------------------- [NOTE: this text is not finished !] This document describes the installation of Slash'EM with the SDL/GL interface on UNIX. "SDL" refers to Simple Directmedia Layer, a library commonly used for games on Linux and other UNIX systems. "GL" refers to OpenGL(R), which offers hardware accelerated graphics (usually 3D graphics, but that is not being used here). OpenGL(R) is completely optional, there is a fully functional software renderer that uses plain SDL. The SDL/GL interface originally appeared in my glHack project, which can be found at http://glhack.sourceforge.net/. Since the windowing interface is almost identical between vanilla NetHack and Slash'EM, the code has fitted in very well. In fact the exact same windowing code is used in both (with #ifdefs to handle the differences). (NOTE: the filenames mentioned here are relative to the win/gl directory, i.e. where this Install.GL document resides) To use this code: 1. follow the directions for the UNIX installation (in ../sys/unix) to create the Makefiles. 2. ../../include/config.h define SDL_GRAPHICS and GL_GRAPHICS (search for them). If you don't have OpenGL(R) on your system, then leave GL_GRAPHICS commented out. Comment out TTY_GRAPHICS, or leave it in if you want to support both interfaces (in which case be sure you have the right curses libraries etc. required for that interface). You may define X11_GRAPHICS and/or QT_GRAPHICS in addition to support multiple windowing ports (and even TTY as well) in the same executable if you so desire. This hasn't been tested yet though. 3. ../../src/Makefile add $(WINGLSRC), $(WINGLOBJ), and $(WINGLLIB) to WINSRC, WINOBJ, and WINLIB respectively, and compile. This will give you an executable supporting both SDL/GL and TTY windowing. If you left GL_GRAPHICS commented out in config.h, then remove the "-lGL" from the WINGLLIB line, otherwise the build may fail. To support multiple windowing ports, change the definitions of WINSRC, WINOBJ and WINLIB to include all the relevant variables. 4. ../../Makefile (the top-level makefile) change CNF_SHARE_DATND to include $(CNF_SHARE_GLND). If you want to support the other windowing ports, include their $(CNF_SHARE_XXXND) variables also. Under Linux, you may want to install using SETGID permissions. (This is the only configuration I've tested BTW). This can be done by changing the following variables at the top of the makefile to these values: GAMEUID = root GAMEGRP = games GAMEPERM = 02755 VARFILEPERM = 0664 VARDIRPERM = 02775 This also requires that the variable-playground directory (defined by VARDIR in the makefile, and VARPLAYGROUND in include/unixconf.h) to be set to some directory in /var, such as /var/lib/games/slashem. 5. Follow all the instructions in ../../sys/unix/Install.unx for the remainder of the installation process. The following is what I usually do (for Linux) :- config.h: (0) comment out the NEWS definition. (a) comment out COMPRESS and COMPRESS_EXTENSION. (b) uncomment DLB. (c) change HACKDIR define from "." to match GAMEDIR in the top-level Makefile (e.g. "/usr/local/slashemdir"). (d) uncomment out SCORE_ON_BOTL. unixconf.h: (e) comment out NETWORK and SVR4, and uncomment LINUX. (f) uncomment NO_MAILREADER. [TODO: keyboard & mouse controls.] [TODO: .slashemrc and GL_OPTIONS lines, and available options] [TODO: available command-line options.] [TODO: SLASHEMGLOPTIONS shell var.] Cheers, Andrew Apted Last updated: 1st October 2002 slashem-0.0.7E7F3/win/gl/font14.txt0000664000076400007640000013150610545462317014735 0ustar alialio = (0, 0, 0) M = (255, 255, 255) # tile 0 (char 0) { oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo } # tile 1 (char 1) { oooooooo oooooooo oMMMMMMo MooooooM MoMooMoM MooooooM MooooooM MoMMMMoM MooMMooM MooooooM oMMMMMMo oooooooo oooooooo oooooooo } # tile 2 (char 2) { oooooooo oooooooo oMMMMMMo MMMMMMMM MMoMMoMM MMMMMMMM MMMMMMMM MMooooMM MMMooMMM MMMMMMMM oMMMMMMo oooooooo oooooooo oooooooo } # tile 3 (char 3) { oooooooo oooooooo oooooooo oMMoMMoo MMMoMMMo MMMMMMMo MMMMMMMo MMMMMMMo oMMMMMoo ooMMMooo oooMoooo oooooooo oooooooo oooooooo } # tile 4 (char 4) { oooooooo oooooooo oooooooo oooMoooo ooMMMooo oMMMMMoo MMMMMMMo oMMMMMoo ooMMMooo oooMoooo oooooooo oooooooo oooooooo oooooooo } # tile 5 (char 5) { oooooooo oooooooo oooooooo oooMoooo ooMMMooo oooMoooo oMMoMMoo MMMoMMMo oMMoMMoo oooMoooo ooMMMooo oooooooo oooooooo oooooooo } # tile 6 (char 6) { oooooooo oooooooo oooMoooo ooMMMooo oMMMMMoo oMMMMMoo MMMMMMMo MMMMMMMo oMMoMMoo oooMoooo ooMMMooo oooooooo oooooooo oooooooo } # tile 7 (char 7) { oooooooo oooooooo oooooooo oooooooo oooooooo oooMMooo ooMMMMoo ooMMMMoo oooMMooo oooooooo oooooooo oooooooo oooooooo oooooooo } # tile 8 (char 8) { MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMooMMM MMooooMM MMooooMM MMMooMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM } # tile 9 (char 9) { oooooooo oooooooo oooooooo oooooooo oooMMooo ooMMMMoo oMMooMMo oMMooMMo ooMMMMoo oooMMooo oooooooo oooooooo oooooooo oooooooo } # tile 10 (char 10) { MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMooMMM MMooooMM MooMMooM MooMMooM MMooooMM MMMooMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM } # tile 11 (char 11) { oooooooo oooooooo oooMMMMo ooooMMMo oooMMMMo ooMMoMMo oMMMMooo MMooMMoo MMooMMoo MMooMMoo oMMMMooo oooooooo oooooooo oooooooo } # tile 12 (char 12) { oooooooo oooooooo ooMMMMoo oMMooMMo oMMooMMo oMMooMMo ooMMMMoo oooMMooo oMMMMMMo oooMMooo oooMMooo oooooooo oooooooo oooooooo } # tile 13 (char 13) { oooooooo oooooooo oooMMMMo oooMMoMo oooMMMMo oooMMooo oooMMooo oooMMooo oMMMMooo MMMMMooo oMMMoooo oooooooo oooooooo oooooooo } # tile 14 (char 14) { oooooooo ooMMMMMo ooMMoMMo ooMMMMMo ooMMoMMo ooMMoMMo oMMMoMMo MMMMoMMo oMMooMMo ooooMMMo oooMMMMo ooooMMoo oooooooo oooooooo } # tile 15 (char 15) { oooooooo oooMMooo MMoMMoMM oMMMMMMo ooMMMMoo oMMooMMo oMMooMMo ooMMMMoo oMMMMMMo MMoMMoMM oooMMooo oooooooo oooooooo oooooooo } # tile 16 (char 16) { oooooooo oooooooo Mooooooo MMMooooo MMMMoooo MMMMMMoo MMMMMMMo MMMMMMoo MMMMoooo MMMooooo Mooooooo oooooooo oooooooo oooooooo } # tile 17 (char 17) { oooooooo oooooooo ooooooMo ooooMMMo ooMMMMMo oMMMMMMo MMMMMMMo oMMMMMMo ooMMMMMo ooooMMMo ooooooMo oooooooo oooooooo oooooooo } # tile 18 (char 18) { oooooooo oooooooo oooMMooo ooMMMMoo oMMMMMMo oooMMooo oooMMooo oooMMooo oMMMMMMo ooMMMMoo oooMMooo oooooooo oooooooo oooooooo } # tile 19 (char 19) { oooooooo oooooooo oMMooMMo oMMooMMo oMMooMMo oMMooMMo oMMooMMo oMMooMMo oooooooo oMMooMMo oMMooMMo oooooooo oooooooo oooooooo } # tile 20 (char 20) { oooooooo oooooooo oMMMMMMM MMoMMoMM MMoMMoMM MMoMMoMM oMMMMoMM oooMMoMM oooMMoMM oooMMoMM oooMMoMM oooooooo oooooooo oooooooo } # tile 21 (char 21) { oooooooo oMMMMMoo MMoooMMo MMoooMMo oMMooooo oMMMMMoo MMMMoMMo MMoMMMMo oMMMMMoo ooooMMoo MMoooMMo MMoooMMo oMMMMMoo oooooooo } # tile 22 (char 22) { oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo MMMMMMMo MMMMMMMo MMMMMMMo oooooooo oooooooo oooooooo } # tile 23 (char 23) { oooooooo oooooooo oooMMooo ooMMMMoo oMMMMMMo oooMMooo oooMMooo oMMMMMMo ooMMMMoo oooMMooo oMMMMMMo oooooooo oooooooo oooooooo } # tile 24 (char 24) { oooooooo oooooooo oooMMooo ooMMMMoo oMMMMMMo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooooooo oooooooo oooooooo } # tile 25 (char 25) { oooooooo oooooooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oMMMMMMo ooMMMMoo oooMMooo oooooooo oooooooo oooooooo } # tile 26 (char 26) { oooooooo oooooooo oooooooo oooooooo ooooMMoo ooooMMMo MMMMMMMM ooooMMMo ooooMMoo oooooooo oooooooo oooooooo oooooooo oooooooo } # tile 27 (char 27) { oooooooo oooooooo oooooooo oooooooo ooMMoooo oMMMoooo MMMMMMMo oMMMoooo ooMMoooo oooooooo oooooooo oooooooo oooooooo oooooooo } # tile 28 (char 28) { oooooooo oooooooo oooooooo oooooooo oooooooo MMoooooo MMoooooo MMoooooo MMMMMMMo oooooooo oooooooo oooooooo oooooooo oooooooo } # tile 29 (char 29) { oooooooo oooooooo oooooooo oooooooo ooMooMoo oMMooMMo MMMMMMMM oMMooMMo ooMooMoo oooooooo oooooooo oooooooo oooooooo oooooooo } # tile 30 (char 30) { oooooooo oooooooo oooMoooo ooMMMooo ooMMMooo ooMMMooo oMMMMMoo oMMMMMoo MMMMMMMo MMMMMMMo oooooooo oooooooo oooooooo oooooooo } # tile 31 (char 31) { oooooooo oooooooo MMMMMMMo MMMMMMMo oMMMMMoo oMMMMMoo oMMMMMoo ooMMMooo ooMMMooo oooMoooo oooooooo oooooooo oooooooo oooooooo } # tile 32 (char 32) { oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo } # tile 33 (char 33) { oooooooo oooooooo oooMMooo ooMMMMoo ooMMMMoo ooMMMMoo oooMMooo oooMMooo oooooooo oooMMooo oooMMooo oooooooo oooooooo oooooooo } # tile 34 (char 34) { oooooooo ooMMoMMo ooMMoMMo ooMMoMMo oooMoMoo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo } # tile 35 (char 35) { oooooooo oooooooo oMMoMMoo oMMoMMoo oMMoMMoo MMMMMMMo oMMoMMoo oMMoMMoo MMMMMMMo oMMoMMoo oMMoMMoo oooooooo oooooooo oooooooo } # tile 36 (char 36) { oooooooo oooMMooo oooMMooo oMMMMMoo MMoooMMo MMoooooo oMMMMooo ooMMMMoo oooooMMo MMoooMMo oMMMMMoo oooMMooo oooMMooo oooooooo } # tile 37 (char 37) { oooooooo oooooooo oooooooo oooooooo oMMoooMo oMMooMMo ooooMMoo oooMMooo ooMMoooo oMMooMMo MMoooMMo oooooooo oooooooo oooooooo } # tile 38 (char 38) { oooooooo oooooooo ooMMMooo oMMoMMoo ooMMMooo ooMMMooo oMMMoMMo MMMMoMMo MMooMMMo MMooMMoo oMMMoMMo oooooooo oooooooo oooooooo } # tile 39 (char 39) { oooooooo ooooMMoo ooooMMoo ooooMMoo oooMMooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo } # tile 40 (char 40) { oooooooo oooooooo ooooMMoo oooMMooo ooMMoooo ooMMoooo ooMMoooo ooMMoooo ooMMoooo oooMMooo ooooMMoo oooooooo oooooooo oooooooo } # tile 41 (char 41) { oooooooo oooooooo ooMMoooo oooMMooo ooooMMoo ooooMMoo ooooMMoo ooooMMoo ooooMMoo oooMMooo ooMMoooo oooooooo oooooooo oooooooo } # tile 42 (char 42) { oooooooo oooooooo oooooooo oooooooo oMMoMMoo ooMMMooo MMMMMMMo ooMMMooo oMMoMMoo oooooooo oooooooo oooooooo oooooooo oooooooo } # tile 43 (char 43) { oooooooo oooooooo oooooooo oooooooo oooMMooo oooMMooo oMMMMMMo oooMMooo oooMMooo oooooooo oooooooo oooooooo oooooooo oooooooo } # tile 44 (char 44) { oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo ooooMMoo ooooMMoo ooooMMoo oooMMooo oooooooo oooooooo } # tile 45 (char 45) { oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo MMMMMMMo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo } # tile 46 (char 46) { oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooMMooo oooMMooo oooooooo oooooooo oooooooo } # tile 47 (char 47) { oooooooo oooooooo oooooooo ooooooMo oooooMMo ooooMMoo oooMMooo ooMMoooo oMMooooo MMoooooo Mooooooo oooooooo oooooooo oooooooo } # tile 48 (char 48) { oooooooo oooooooo oMMMMMoo MMoooMMo MMooMMMo MMoMMMMo MMMMoMMo MMMooMMo MMoooMMo MMoooMMo oMMMMMoo oooooooo oooooooo oooooooo } # tile 49 (char 49) { oooooooo oooooooo oooMMooo oMMMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oMMMMMMo oooooooo oooooooo oooooooo } # tile 50 (char 50) { oooooooo oooooooo oMMMMMoo MMoooMMo MMoooMMo ooooMMoo oooMMooo ooMMoooo oMMooooo MMoooMMo MMMMMMMo oooooooo oooooooo oooooooo } # tile 51 (char 51) { oooooooo oooooooo oMMMMMoo MMoooMMo oooooMMo oooooMMo ooMMMMoo oooooMMo oooooMMo MMoooMMo oMMMMMoo oooooooo oooooooo oooooooo } # tile 52 (char 52) { oooooooo oooooooo ooooMMoo oooMMMoo ooMMMMoo oMMoMMoo MMooMMoo MMMMMMMo ooooMMoo ooooMMoo ooooMMoo oooooooo oooooooo oooooooo } # tile 53 (char 53) { oooooooo oooooooo MMMMMMMo MMoooooo MMoooooo MMoooooo MMMMMMoo oooooMMo oooooMMo MMoooMMo oMMMMMoo oooooooo oooooooo oooooooo } # tile 54 (char 54) { oooooooo oooooooo oMMMMMoo MMoooMMo MMoooooo MMoooooo MMMMMMoo MMoooMMo MMoooMMo MMoooMMo oMMMMMoo oooooooo oooooooo oooooooo } # tile 55 (char 55) { oooooooo oooooooo MMMMMMMo MMoooMMo ooooMMoo oooMMooo ooMMoooo ooMMoooo ooMMoooo ooMMoooo ooMMoooo oooooooo oooooooo oooooooo } # tile 56 (char 56) { oooooooo oooooooo oMMMMMoo MMoooMMo MMoooMMo MMoooMMo oMMMMMoo MMoooMMo MMoooMMo MMoooMMo oMMMMMoo oooooooo oooooooo oooooooo } # tile 57 (char 57) { oooooooo oooooooo oMMMMMoo MMoooMMo MMoooMMo MMoooMMo oMMMMMMo oooooMMo oooooMMo MMoooMMo oMMMMMoo oooooooo oooooooo oooooooo } # tile 58 (char 58) { oooooooo oooooooo oooooooo oooooooo ooooMMoo ooooMMoo oooooooo oooooooo ooooMMoo ooooMMoo oooooooo oooooooo oooooooo oooooooo } # tile 59 (char 59) { oooooooo oooooooo oooooooo oooooooo ooooMMoo ooooMMoo oooooooo oooooooo ooooMMoo ooooMMoo ooooMMoo oooMMooo oooooooo oooooooo } # tile 60 (char 60) { oooooooo oooooooo ooooMMoo oooMMooo ooMMoooo oMMooooo MMoooooo oMMooooo ooMMoooo oooMMooo ooooMMoo oooooooo oooooooo oooooooo } # tile 61 (char 61) { oooooooo oooooooo oooooooo oooooooo oooooooo MMMMMMMo oooooooo MMMMMMMo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo } # tile 62 (char 62) { oooooooo oooooooo oMMooooo ooMMoooo oooMMooo ooooMMoo oooooMMo ooooMMoo oooMMooo ooMMoooo oMMooooo oooooooo oooooooo oooooooo } # tile 63 (char 63) { oooooooo oooooooo oMMMMMoo MMoooMMo MMoooMMo ooooMMoo oooMMooo oooMMooo oooooooo oooMMooo oooMMooo oooooooo oooooooo oooooooo } # tile 64 (char 64) { oooooooo oooooooo oMMMMMoo MMoooMMo MMoooMMo MMoMMMMo MMoMMMMo MMoMMMMo MMoMMMoo MMoooooo oMMMMMMo oooooooo oooooooo oooooooo } # tile 65 (char 65) { oooooooo oooooooo ooMMMooo oMMoMMoo MMoooMMo MMoooMMo MMoooMMo MMMMMMMo MMoooMMo MMoooMMo MMoooMMo oooooooo oooooooo oooooooo } # tile 66 (char 66) { oooooooo oooooooo MMMMMMoo oMMooMMo oMMooMMo oMMooMMo oMMMMMoo oMMooMMo oMMooMMo oMMooMMo MMMMMMoo oooooooo oooooooo oooooooo } # tile 67 (char 67) { oooooooo oooooooo ooMMMMoo oMMooMMo MMoooooo MMoooooo MMoooooo MMoooooo MMoooooo oMMooMMo ooMMMMoo oooooooo oooooooo oooooooo } # tile 68 (char 68) { oooooooo oooooooo MMMMMooo oMMoMMoo oMMooMMo oMMooMMo oMMooMMo oMMooMMo oMMooMMo oMMoMMoo MMMMMooo oooooooo oooooooo oooooooo } # tile 69 (char 69) { oooooooo oooooooo MMMMMMMo oMMooMMo oMMooooo oMMooooo oMMMMMoo oMMooooo oMMooooo oMMooMMo MMMMMMMo oooooooo oooooooo oooooooo } # tile 70 (char 70) { oooooooo oooooooo MMMMMMMo oMMooMMo oMMooooo oMMooooo oMMMMMoo oMMooooo oMMooooo oMMooooo MMMMoooo oooooooo oooooooo oooooooo } # tile 71 (char 71) { oooooooo oooooooo oMMMMMoo MMoooMMo MMoooMMo MMoooooo MMoooooo MMooMMMo MMoooMMo MMoooMMo oMMMMMoo oooooooo oooooooo oooooooo } # tile 72 (char 72) { oooooooo oooooooo MMoooMMo MMoooMMo MMoooMMo MMoooMMo MMMMMMMo MMoooMMo MMoooMMo MMoooMMo MMoooMMo oooooooo oooooooo oooooooo } # tile 73 (char 73) { oooooooo oooooooo ooMMMMoo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo ooMMMMoo oooooooo oooooooo oooooooo } # tile 74 (char 74) { oooooooo oooooooo ooMMMMoo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo MMoMMooo MMoMMooo oMMMoooo oooooooo oooooooo oooooooo } # tile 75 (char 75) { oooooooo oooooooo MMoooMMo MMooMMoo MMoMMooo MMMMoooo MMMMoooo MMoMMooo MMooMMoo MMoooMMo MMoooMMo oooooooo oooooooo oooooooo } # tile 76 (char 76) { oooooooo oooooooo MMMMoooo oMMooooo oMMooooo oMMooooo oMMooooo oMMooooo oMMoooMo oMMooMMo MMMMMMMo oooooooo oooooooo oooooooo } # tile 77 (char 77) { oooooooo oooooooo MMoooMMo MMoooMMo MMMoMMMo MMMMMMMo MMoMoMMo MMoMoMMo MMoMoMMo MMoooMMo MMoooMMo oooooooo oooooooo oooooooo } # tile 78 (char 78) { oooooooo oooooooo MMoooMMo MMoooMMo MMMooMMo MMMooMMo MMMMoMMo MMoMMMMo MMooMMMo MMooMMMo MMoooMMo oooooooo oooooooo oooooooo } # tile 79 (char 79) { oooooooo oooooooo oMMMMMoo MMoooMMo MMoooMMo MMoooMMo MMoooMMo MMoooMMo MMoooMMo MMoooMMo oMMMMMoo oooooooo oooooooo oooooooo } # tile 80 (char 80) { oooooooo oooooooo MMMMMMoo oMMooMMo oMMooMMo oMMooMMo oMMMMMoo oMMooooo oMMooooo oMMooooo MMMMoooo oooooooo oooooooo oooooooo } # tile 81 (char 81) { oooooooo oooooooo oMMMMMoo MMoooMMo MMoooMMo MMoooMMo MMoooMMo MMoooMMo MMoooMMo MMoMoMMo oMMMMMoo oooooMMo oooooooo oooooooo } # tile 82 (char 82) { oooooooo oooooooo MMMMMMoo oMMooMMo oMMooMMo oMMooMMo oMMMMMoo oMMMMooo oMMoMMoo oMMooMMo MMMooMMo oooooooo oooooooo oooooooo } # tile 83 (char 83) { oooooooo oooooooo oMMMMMoo MMoooMMo MMoooooo oMMooooo ooMMMooo ooooMMoo oooooMMo MMoooMMo oMMMMMoo oooooooo oooooooo oooooooo } # tile 84 (char 84) { oooooooo oooooooo oMMMMMMo oMoMMoMo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo ooMMMMoo oooooooo oooooooo oooooooo } # tile 85 (char 85) { oooooooo oooooooo MMoooMMo MMoooMMo MMoooMMo MMoooMMo MMoooMMo MMoooMMo MMoooMMo MMoooMMo oMMMMMoo oooooooo oooooooo oooooooo } # tile 86 (char 86) { oooooooo oooooooo MMoooMMo MMoooMMo MMoooMMo MMoooMMo MMoooMMo MMoooMMo oMMoMMoo ooMMMooo oooMoooo oooooooo oooooooo oooooooo } # tile 87 (char 87) { oooooooo oooooooo MMoooMMo MMoooMMo MMoMoMMo MMoMoMMo MMoMoMMo MMMMMMMo MMMoMMMo MMoooMMo MMoooMMo oooooooo oooooooo oooooooo } # tile 88 (char 88) { oooooooo oooooooo MMoooMMo MMoooMMo oMMoMMoo ooMMMooo ooMMMooo ooMMMooo oMMoMMoo MMoooMMo MMoooMMo oooooooo oooooooo oooooooo } # tile 89 (char 89) { oooooooo oooooooo oMMooMMo oMMooMMo oMMooMMo oMMooMMo ooMMMMoo oooMMooo oooMMooo oooMMooo ooMMMMoo oooooooo oooooooo oooooooo } # tile 90 (char 90) { oooooooo oooooooo MMMMMMMo MMoooMMo MoooMMoo oooMMooo ooMMoooo oMMooooo MMooooMo MMoooMMo MMMMMMMo oooooooo oooooooo oooooooo } # tile 91 (char 91) { oooooooo oooooooo oMMMMMoo oMMooooo oMMooooo oMMooooo oMMooooo oMMooooo oMMooooo oMMooooo oMMMMMoo oooooooo oooooooo oooooooo } # tile 92 (char 92) { oooooooo oooooooo oooooooo Mooooooo MMoooooo oMMooooo ooMMoooo oooMMooo ooooMMoo oooooMMo ooooooMo oooooooo oooooooo oooooooo } # tile 93 (char 93) { oooooooo oooooooo oMMMMMoo ooooMMoo ooooMMoo ooooMMoo ooooMMoo ooooMMoo ooooMMoo ooooMMoo oMMMMMoo oooooooo oooooooo oooooooo } # tile 94 (char 94) { oooooooo oooMoooo ooMMMooo oMMoMMoo MMoooMMo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo } # tile 95 (char 95) { oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo MMMMMMMM oooooooo } # tile 96 (char 96) { oooooooo oooMMooo oooMMooo oooMMooo ooooMMoo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo } # tile 97 (char 97) { oooooooo oooooooo oooooooo oooooooo oooooooo oMMMMooo ooooMMoo oMMMMMoo MMooMMoo MMoMMMoo oMMMoMMo oooooooo oooooooo oooooooo } # tile 98 (char 98) { oooooooo oooooooo MMMooooo oMMooooo oMMooooo oMMMMMoo oMMooMMo oMMooMMo oMMooMMo oMMooMMo MMMMMMoo oooooooo oooooooo oooooooo } # tile 99 (char 99) { oooooooo oooooooo oooooooo oooooooo oooooooo oMMMMMoo MMoooMMo MMoooooo MMoooooo MMoooMMo oMMMMMoo oooooooo oooooooo oooooooo } # tile 100 (char 100) { oooooooo oooooooo oooMMMoo ooooMMoo ooooMMoo oMMMMMoo MMooMMoo MMooMMoo MMooMMoo MMooMMoo oMMMMMMo oooooooo oooooooo oooooooo } # tile 101 (char 101) { oooooooo oooooooo oooooooo oooooooo oooooooo oMMMMMoo MMoooMMo MMMMMMMo MMoooooo MMoooMMo oMMMMMoo oooooooo oooooooo oooooooo } # tile 102 (char 102) { oooooooo oooooooo oooMMMoo ooMMoMMo ooMMoooo ooMMoooo MMMMMMoo ooMMoooo ooMMoooo ooMMoooo oMMMMooo oooooooo oooooooo oooooooo } # tile 103 (char 103) { oooooooo oooooooo oooooooo oooooooo oooooooo oMMMoMMo MMooMMMo MMoooMMo MMoooMMo oMMMMMMo oooooMMo MMoooMMo oMMMMMoo oooooooo } # tile 104 (char 104) { oooooooo oooooooo MMMooooo oMMooooo oMMooooo oMMoMMoo oMMMoMMo oMMooMMo oMMooMMo oMMooMMo MMMooMMo oooooooo oooooooo oooooooo } # tile 105 (char 105) { oooooooo oooooooo oooMMooo oooMMooo oooooooo ooMMMooo oooMMooo oooMMooo oooMMooo oooMMooo ooMMMMoo oooooooo oooooooo oooooooo } # tile 106 (char 106) { oooooooo oooooooo ooooMMoo ooooMMoo oooooooo oooMMMoo ooooMMoo ooooMMoo ooooMMoo ooooMMoo MMooMMoo MMooMMoo oMMMMooo oooooooo } # tile 107 (char 107) { oooooooo oooooooo MMMooooo oMMooooo oMMooooo oMMooMMo oMMoMMoo oMMMMooo oMMoMMoo oMMooMMo MMMooMMo oooooooo oooooooo oooooooo } # tile 108 (char 108) { oooooooo oooooooo ooMMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo ooMMMMoo oooooooo oooooooo oooooooo } # tile 109 (char 109) { oooooooo oooooooo oooooooo oooooooo oooooooo oMMoMMoo MMMMMMMo MMoMoMMo MMoMoMMo MMoooMMo MMoooMMo oooooooo oooooooo oooooooo } # tile 110 (char 110) { oooooooo oooooooo oooooooo oooooooo oooooooo MMoMMMoo oMMooMMo oMMooMMo oMMooMMo oMMooMMo oMMooMMo oooooooo oooooooo oooooooo } # tile 111 (char 111) { oooooooo oooooooo oooooooo oooooooo oooooooo oMMMMMoo MMoooMMo MMoooMMo MMoooMMo MMoooMMo oMMMMMoo oooooooo oooooooo oooooooo } # tile 112 (char 112) { oooooooo oooooooo oooooooo oooooooo oooooooo MMoMMMoo oMMooMMo oMMooMMo oMMooMMo oMMMMMoo oMMooooo oMMooooo MMMMoooo oooooooo } # tile 113 (char 113) { oooooooo oooooooo oooooooo oooooooo oooooooo oMMMoMMo MMooMMoo MMooMMoo MMooMMoo oMMMMMoo ooooMMoo ooooMMoo oooMMMMo oooooooo } # tile 114 (char 114) { oooooooo oooooooo oooooooo oooooooo oooooooo MMoMMMoo oMMooMMo oMMooooo oMMooooo oMMooooo MMMMoooo oooooooo oooooooo oooooooo } # tile 115 (char 115) { oooooooo oooooooo oooooooo oooooooo oooooooo oMMMMMoo MMoooMMo oMMMoooo oooMMMoo MMoooMMo oMMMMMoo oooooooo oooooooo oooooooo } # tile 116 (char 116) { oooooooo oooooooo ooMMoooo ooMMoooo ooMMoooo MMMMMMoo ooMMoooo ooMMoooo ooMMoooo ooMMoMMo oooMMMoo oooooooo oooooooo oooooooo } # tile 117 (char 117) { oooooooo oooooooo oooooooo oooooooo oooooooo MMooMMoo MMooMMoo MMooMMoo MMooMMoo MMooMMoo oMMMoMMo oooooooo oooooooo oooooooo } # tile 118 (char 118) { oooooooo oooooooo oooooooo oooooooo oooooooo MMoooMMo MMoooMMo MMoooMMo oMMoMMoo ooMMMooo oooMoooo oooooooo oooooooo oooooooo } # tile 119 (char 119) { oooooooo oooooooo oooooooo oooooooo oooooooo MMoooMMo MMoooMMo MMoMoMMo MMoMoMMo MMMMMMMo oMMoMMoo oooooooo oooooooo oooooooo } # tile 120 (char 120) { oooooooo oooooooo oooooooo oooooooo oooooooo MMoooMMo oMMoMMoo ooMMMooo ooMMMooo oMMoMMoo MMoooMMo oooooooo oooooooo oooooooo } # tile 121 (char 121) { oooooooo oooooooo oooooooo oooooooo oooooooo MMoooMMo MMoooMMo MMoooMMo MMooMMMo oMMMoMMo oooooMMo MMoooMMo oMMMMMoo oooooooo } # tile 122 (char 122) { oooooooo oooooooo oooooooo oooooooo oooooooo MMMMMMMo MoooMMoo oooMMooo ooMMoooo oMMoooMo MMMMMMMo oooooooo oooooooo oooooooo } # tile 123 (char 123) { oooooooo oooooooo ooooMMMo oooMMooo oooMMooo oooMMooo oMMMoooo oooMMooo oooMMooo oooMMooo ooooMMMo oooooooo oooooooo oooooooo } # tile 124 (char 124) { oooooooo oooooooo oooMMooo oooMMooo oooMMooo oooMMooo oooooooo oooMMooo oooMMooo oooMMooo oooMMooo oooooooo oooooooo oooooooo } # tile 125 (char 125) { oooooooo oooooooo oMMMoooo oooMMooo oooMMooo oooMMooo ooooMMMo oooMMooo oooMMooo oooMMooo oMMMoooo oooooooo oooooooo oooooooo } # tile 126 (char 126) { oooooooo oooooooo oMMMoMMo MMoMMMoo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo } # tile 127 (char 127) { oooooooo oooooooo oooooooo oooooooo oooMoooo ooMMMooo ooMMMooo oMMoMMoo oMMoMMoo MMMMMMMo oooooooo oooooooo oooooooo oooooooo } # tile 128 (char 128) { oooooooo oooooooo ooMMMMoo oMMooMMo MMoooooo MMoooooo MMoooooo MMoooMMo oMMooMMo ooMMMMoo oooMMooo MMooMMoo ooMMMooo oooooooo } # tile 129 (char 129) { oooooooo oooooooo MMoooMMo MMoooMMo oooooooo MMoooMMo MMoooMMo MMoooMMo MMoooMMo MMooMMMo oMMMoMMo oooooooo oooooooo oooooooo } # tile 130 (char 130) { oooooooo ooooMMoo oooMMooo ooMMoooo oooooooo oMMMMMoo MMoooMMo MMMMMMMo MMoooooo MMoooMMo oMMMMMoo oooooooo oooooooo oooooooo } # tile 131 (char 131) { oooooooo ooMMoooo oMMMMooo MMooMMoo oooooooo oMMMMooo ooooMMoo oMMMMMoo MMooMMoo MMoMMMoo oMMMoMMo oooooooo oooooooo oooooooo } # tile 132 (char 132) { oooooooo oooooooo MMooMMoo MMooMMoo oooooooo oMMMMooo ooooMMoo oMMMMMoo MMooMMoo MMoMMMoo oMMMoMMo oooooooo oooooooo oooooooo } # tile 133 (char 133) { oooooooo oMMooooo ooMMoooo oooMMooo oooooooo oMMMMooo ooooMMoo oMMMMMoo MMooMMoo MMoMMMoo oMMMoMMo oooooooo oooooooo oooooooo } # tile 134 (char 134) { oooooooo ooMMMooo oMMoMMoo ooMMMooo oooooooo oMMMMooo ooooMMoo oMMMMMoo MMooMMoo MMoMMMoo oMMMoMMo oooooooo oooooooo oooooooo } # tile 135 (char 135) { oooooooo oooooooo oooooooo oooooooo oMMMMMoo MMoooMMo MMoooooo MMoooooo MMoooMMo oMMMMMoo oooMMooo oMMoMMoo ooMMMooo oooooooo } # tile 136 (char 136) { oooooooo ooMMoooo oMMMMooo MMooMMoo oooooooo oMMMMMoo MMoooMMo MMMMMMMo MMoooooo MMoooMMo oMMMMMoo oooooooo oooooooo oooooooo } # tile 137 (char 137) { oooooooo oooooooo MMooMMoo MMooMMoo oooooooo oMMMMMoo MMoooMMo MMMMMMMo MMoooooo MMoooMMo oMMMMMoo oooooooo oooooooo oooooooo } # tile 138 (char 138) { oooooooo oMMooooo ooMMoooo oooMMooo oooooooo oMMMMMoo MMoooMMo MMMMMMMo MMoooooo MMoooMMo oMMMMMoo oooooooo oooooooo oooooooo } # tile 139 (char 139) { oooooooo oooooooo oMMooMMo oMMooMMo oooooooo ooMMMooo oooMMooo oooMMooo oooMMooo oooMMooo ooMMMMoo oooooooo oooooooo oooooooo } # tile 140 (char 140) { oooooooo oooMMooo ooMMMMoo oMMooMMo oooooooo ooMMMooo oooMMooo oooMMooo oooMMooo oooMMooo ooMMMMoo oooooooo oooooooo oooooooo } # tile 141 (char 141) { oooooooo oMMooooo ooMMoooo oooMMooo oooooooo ooMMMooo oooMMooo oooMMooo oooMMooo oooMMooo ooMMMMoo oooooooo oooooooo oooooooo } # tile 142 (char 142) { oooooooo MMooMMoo oooooooo ooMMMooo oMMoMMoo MMoooMMo MMoooMMo MMMMMMMo MMoooMMo MMoooMMo MMoooMMo oooooooo oooooooo oooooooo } # tile 143 (char 143) { oooooooo ooMMMooo oMMoMMoo ooMMMooo oMMoMMoo MMoooMMo MMoooMMo MMMMMMMo MMoooMMo MMoooMMo MMoooMMo oooooooo oooooooo oooooooo } # tile 144 (char 144) { oooooooo oooMMooo ooMMoooo MMMMMMMo oMMooMMo oMMooooo oMMMMMoo oMMooooo oMMooooo oMMooMMo MMMMMMMo oooooooo oooooooo oooooooo } # tile 145 (char 145) { oooooooo oooooooo oooooooo oooooooo oooooooo MMMoMMoo ooMMooMo oMMMMMMo MoMMoooo MoMMoooo oMMoMMMo oooooooo oooooooo oooooooo } # tile 146 (char 146) { oooooooo oooooooo ooMMMMMo oMMMMooo MMoMMooo MMoMMooo MMMMMMMo MMoMMooo MMoMMooo MMoMMooo MMoMMMMo oooooooo oooooooo oooooooo } # tile 147 (char 147) { oooooooo ooMMoooo oMMMMooo MMooMMoo oooooooo oMMMMMoo MMoooMMo MMoooMMo MMoooMMo MMoooMMo oMMMMMoo oooooooo oooooooo oooooooo } # tile 148 (char 148) { oooooooo oooooooo MMoooMMo MMoooMMo oooooooo oMMMMMoo MMoooMMo MMoooMMo MMoooMMo MMoooMMo oMMMMMoo oooooooo oooooooo oooooooo } # tile 149 (char 149) { oooooooo oMMooooo ooMMoooo oooMMooo oooooooo oMMMMMoo MMoooMMo MMoooMMo MMoooMMo MMoooMMo oMMMMMoo oooooooo oooooooo oooooooo } # tile 150 (char 150) { oooooooo ooMMoooo oMMMMooo MMooMMoo oooooooo MMooMMoo MMooMMoo MMooMMoo MMooMMoo MMooMMoo oMMMoMMo oooooooo oooooooo oooooooo } # tile 151 (char 151) { oooooooo oMMooooo ooMMoooo oooMMooo oooooooo MMooMMoo MMooMMoo MMooMMoo MMooMMoo MMooMMoo oMMMoMMo oooooooo oooooooo oooooooo } # tile 152 (char 152) { oooooooo oooooooo MMoooMMo MMoooMMo oooooooo MMoooMMo MMoooMMo MMoooMMo MMooMMMo oMMMoMMo oooooMMo MMoooMMo oMMMMMoo oooooooo } # tile 153 (char 153) { oooooooo MMoooMMo oooooooo oMMMMMoo MMoooMMo MMoooMMo MMoooMMo MMoooMMo MMoooMMo MMoooMMo oMMMMMoo oooooooo oooooooo oooooooo } # tile 154 (char 154) { oooooooo MMoooMMo oooooooo MMoooMMo MMoooMMo MMoooMMo MMoooMMo MMoooMMo MMoooMMo MMoooMMo oMMMMMoo oooooooo oooooooo oooooooo } # tile 155 (char 155) { oooooooo oooooooo oooooooo oooMoooo oMMMMMoo MMoMoMMo MMoMoooo MMoMoooo MMoMoMMo oMMMMMoo oooMoooo oooooooo oooooooo oooooooo } # tile 156 (char 156) { oooooooo oooooooo ooMMMooo oMMoMMoo oMMooMoo oMMooooo MMMMoooo oMMooooo oMMooooo oMMooMMo MMMMMMoo oooooooo oooooooo oooooooo } # tile 157 (char 157) { oooooooo oooooooo oMMooMMo oMMooMMo ooMMMMoo oooMMooo oMMMMMMo oooMMooo oMMMMMMo oooMMooo oooMMooo oooooooo oooooooo oooooooo } # tile 158 (char 158) { oooooooo MMMMMMoo MMoooMMo MMMMMMoo MMoooooo MMooMMoo MMoMMMMo MMooMMoo MMooMMoo MMooMMoo MMoooMMo oooooooo oooooooo oooooooo } # tile 159 (char 159) { oooooooo oooooooo ooooMMMo oooMMoMM oooMMooo oooMMooo oMMMMMMo oooMMooo oooMMooo MMoMMooo oMMMoooo oooooooo oooooooo oooooooo } # tile 160 (char 160) { oooooooo ooooMMoo oooMMooo ooMMoooo oooooooo oMMMMooo ooooMMoo oMMMMMoo MMooMMoo MMoMMMoo oMMMoMMo oooooooo oooooooo oooooooo } # tile 161 (char 161) { oooooooo oooooMMo ooooMMoo oooMMooo oooooooo ooMMMooo oooMMooo oooMMooo oooMMooo oooMMooo ooMMMMoo oooooooo oooooooo oooooooo } # tile 162 (char 162) { oooooooo ooooMMoo oooMMooo ooMMoooo oooooooo oMMMMMoo MMoooMMo MMoooMMo MMoooMMo MMoooMMo oMMMMMoo oooooooo oooooooo oooooooo } # tile 163 (char 163) { oooooooo ooooMMoo oooMMooo ooMMoooo oooooooo MMooMMoo MMooMMoo MMooMMoo MMooMMoo MMooMMoo oMMMoMMo oooooooo oooooooo oooooooo } # tile 164 (char 164) { oooooooo oooooooo oMMMoMMo MMoMMMoo oooooooo MMoMMMoo oMMooMMo oMMooMMo oMMooMMo oMMooMMo oMMooMMo oooooooo oooooooo oooooooo } # tile 165 (char 165) { oooooooo oMMMoMMo MMoMMMoo oooooooo MMoooMMo MMMooMMo MMMMoMMo MMoMMMMo MMooMMMo MMoooMMo MMoooMMo oooooooo oooooooo oooooooo } # tile 166 (char 166) { oooooooo oooooooo oMMMMooo ooooMMoo oMMMMMoo MMooMMoo oMMMoMMo oooooooo MMMMMMMo oooooooo oooooooo oooooooo oooooooo oooooooo } # tile 167 (char 167) { oooooooo oooooooo oMMMMMoo MMoooMMo MMoooMMo MMoooMMo oMMMMMoo oooooooo MMMMMMMo oooooooo oooooooo oooooooo oooooooo oooooooo } # tile 168 (char 168) { oooooooo oooooooo ooMMoooo ooMMoooo oooooooo ooMMoooo ooMMoooo oMMooooo MMoooMMo MMoooMMo oMMMMMoo oooooooo oooooooo oooooooo } # tile 169 (char 169) { oooooooo oooooooo oooooooo oooooooo oooooooo MMMMMMMo MMoooooo MMoooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo } # tile 170 (char 170) { oooooooo oooooooo oooooooo oooooooo oooooooo MMMMMMMo oooooMMo oooooMMo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo } # tile 171 (char 171) { oooooooo oooooooo oMMooooo MMMoooMM oMMooMMo oMMoMMoo oooMMMMo ooMMooMM oMMooMMo MMooMMoo ooooMMMM oooooooo oooooooo oooooooo } # tile 172 (char 172) { oooooooo oooooooo oMMooooo MMMoooMM oMMooMMo oMMoMMoo oooMMoMo ooMMoMMo oMMoMoMo MMoMMMMM oooooMMo oooooooo oooooooo oooooooo } # tile 173 (char 173) { oooooooo oooooooo oooMMooo oooMMooo oooooooo oooMMooo oooMMooo ooMMMMoo ooMMMMoo ooMMMMoo oooMMooo oooooooo oooooooo oooooooo } # tile 174 (char 174) { oooooooo oooooooo oooooooo oooooooo ooMMooMM oMMooMMo MMooMMoo oMMooMMo ooMMooMM oooooooo oooooooo oooooooo oooooooo oooooooo } # tile 175 (char 175) { oooooooo oooooooo oooooooo oooooooo MMooMMoo oMMooMMo ooMMooMM oMMooMMo MMooMMoo oooooooo oooooooo oooooooo oooooooo oooooooo } # tile 176 (char 176) { oooMoooM oMoooMoo oooMoooM oMoooMoo oooMoooM oMoooMoo oooMoooM oMoooMoo oooMoooM oMoooMoo oooMoooM oMoooMoo oooMoooM oMoooMoo } # tile 177 (char 177) { oMoMoMoM MoMoMoMo oMoMoMoM MoMoMoMo oMoMoMoM MoMoMoMo oMoMoMoM MoMoMoMo oMoMoMoM MoMoMoMo oMoMoMoM MoMoMoMo oMoMoMoM MoMoMoMo } # tile 178 (char 178) { MMoMMMoM oMMMoMMM MMoMMMoM oMMMoMMM MMoMMMoM oMMMoMMM MMoMMMoM oMMMoMMM MMoMMMoM oMMMoMMM MMoMMMoM oMMMoMMM MMoMMMoM oMMMoMMM } # tile 179 (char 179) { oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo } # tile 180 (char 180) { oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo MMMMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo } # tile 181 (char 181) { oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo MMMMMooo oooMMooo MMMMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo } # tile 182 (char 182) { ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo MMMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo } # tile 183 (char 183) { oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo MMMMMMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo } # tile 184 (char 184) { oooooooo oooooooo oooooooo oooooooo oooooooo MMMMMooo oooMMooo MMMMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo } # tile 185 (char 185) { ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo MMMMoMMo oooooMMo MMMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo } # tile 186 (char 186) { ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo } # tile 187 (char 187) { oooooooo oooooooo oooooooo oooooooo oooooooo MMMMMMMo oooooMMo MMMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo } # tile 188 (char 188) { ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo MMMMoMMo oooooMMo MMMMMMMo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo } # tile 189 (char 189) { ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo MMMMMMMo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo } # tile 190 (char 190) { oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo MMMMMooo oooMMooo MMMMMooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo } # tile 191 (char 191) { oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo MMMMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo } # tile 192 (char 192) { oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMMMM oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo } # tile 193 (char 193) { oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo MMMMMMMM oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo } # tile 194 (char 194) { oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo MMMMMMMM oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo } # tile 195 (char 195) { oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMMMM oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo } # tile 196 (char 196) { oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo MMMMMMMM oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo } # tile 197 (char 197) { oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo MMMMMMMM oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo } # tile 198 (char 198) { oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMMMM oooMMooo oooMMMMM oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo } # tile 199 (char 199) { ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMM ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo } # tile 200 (char 200) { ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMM ooMMoooo ooMMMMMM oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo } # tile 201 (char 201) { oooooooo oooooooo oooooooo oooooooo oooooooo ooMMMMMM ooMMoooo ooMMoMMM ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo } # tile 202 (char 202) { ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo MMMMoMMM oooooooo MMMMMMMM oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo } # tile 203 (char 203) { oooooooo oooooooo oooooooo oooooooo oooooooo MMMMMMMM oooooooo MMMMoMMM ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo } # tile 204 (char 204) { ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMM ooMMoooo ooMMoMMM ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo } # tile 205 (char 205) { oooooooo oooooooo oooooooo oooooooo oooooooo MMMMMMMM oooooooo MMMMMMMM oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo } # tile 206 (char 206) { ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo MMMMoMMM oooooooo MMMMoMMM ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo } # tile 207 (char 207) { oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo MMMMMMMM oooooooo MMMMMMMM oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo } # tile 208 (char 208) { ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo MMMMMMMM oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo } # tile 209 (char 209) { oooooooo oooooooo oooooooo oooooooo oooooooo MMMMMMMM oooooooo MMMMMMMM oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo } # tile 210 (char 210) { oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo MMMMMMMM ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo } # tile 211 (char 211) { ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMMMMM oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo } # tile 212 (char 212) { oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMMMM oooMMooo oooMMMMM oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo } # tile 213 (char 213) { oooooooo oooooooo oooooooo oooooooo oooooooo oooMMMMM oooMMooo oooMMMMM oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo } # tile 214 (char 214) { oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo ooMMMMMM ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo } # tile 215 (char 215) { ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo MMMMMMMM ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo } # tile 216 (char 216) { oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo MMMMMMMM oooMMooo MMMMMMMM oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo } # tile 217 (char 217) { oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo MMMMMooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo } # tile 218 (char 218) { oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooMMMMM oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo } # tile 219 (char 219) { MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM } # tile 220 (char 220) { oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM } # tile 221 (char 221) { MMMMoooo MMMMoooo MMMMoooo MMMMoooo MMMMoooo MMMMoooo MMMMoooo MMMMoooo MMMMoooo MMMMoooo MMMMoooo MMMMoooo MMMMoooo MMMMoooo } # tile 222 (char 222) { ooooMMMM ooooMMMM ooooMMMM ooooMMMM ooooMMMM ooooMMMM ooooMMMM ooooMMMM ooooMMMM ooooMMMM ooooMMMM ooooMMMM ooooMMMM ooooMMMM } # tile 223 (char 223) { MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo } # tile 224 (char 224) { oooooooo oooooooo oooooooo oooooooo oooooooo oMMMoMMo MMoMMMoo MMooMooo MMooMooo MMoMMMoo oMMMoMMo oooooooo oooooooo oooooooo } # tile 225 (char 225) { oooooooo oooooooo oooooooo oooooooo oMMMMooo MMooMMoo MMoMMooo MMMMMMoo MMoooMMo MMMooMMo MMoMMMoo MMoooooo MMoooooo oooooooo } # tile 226 (char 226) { oooooooo oooooooo MMMMMMMo oMMooMMo oMMoooMo oMMooooo oMMooooo oMMooooo oMMooooo oMMooooo oMMooooo oooooooo oooooooo oooooooo } # tile 227 (char 227) { oooooooo oooooooo oooooooo oooooooo oooooooo MMMMMMMo oMMoMMoo oMMoMMoo oMMoMMoo oMMoMMoo oMMoMMoo oooooooo oooooooo oooooooo } # tile 228 (char 228) { oooooooo oooooooo MMMMMMMo MMoooMMo oMMoooMo ooMMoooo oooMMooo ooMMoooo oMMoooMo MMoooMMo MMMMMMMo oooooooo oooooooo oooooooo } # tile 229 (char 229) { oooooooo oooooooo oooooooo oooooooo oooooooo oMMMMMMo MMoMMooo MMooMMoo MMooMMoo MMooMMoo oMMMMooo oooooooo oooooooo oooooooo } # tile 230 (char 230) { oooooooo oooooooo oooooooo oooooooo oMMooMMo oMMooMMo oMMooMMo oMMooMMo oMMMMMoo oMMooooo MMoooooo Mooooooo oooooooo oooooooo } # tile 231 (char 231) { oooooooo oooooooo oooooooo oooooooo oooooooo oMMMoMMo MMoMMMoo oooMMooo oooMMooo oooMMooo oooMMooo oooooooo oooooooo oooooooo } # tile 232 (char 232) { oooooooo oooooooo MMMMMMMo ooMMMooo oMMoMMoo MMoooMMo MMoooMMo MMoooMMo oMMoMMoo ooMMMooo MMMMMMMo oooooooo oooooooo oooooooo } # tile 233 (char 233) { oooooooo oooooooo ooMMMooo oMMoMMoo MMoooMMo MMoooMMo MMMMMMMo MMoooMMo MMoooMMo oMMoMMoo ooMMMooo oooooooo oooooooo oooooooo } # tile 234 (char 234) { oooooooo oooooooo ooMMMooo oMMoMMoo MMoooMMo MMoooMMo MMoooMMo oMMoMMoo oMMoMMoo oMMoMMoo MMMoMMMo oooooooo oooooooo oooooooo } # tile 235 (char 235) { oooooooo oooooooo ooMMMMMo oMMooooo ooMMoooo ooMMMMoo oMMooMMo MMoooMMo MMoooMMo MMooMMoo oMMMMooo oooooooo oooooooo oooooooo } # tile 236 (char 236) { oooooooo oooooooo oooooooo oooooooo oooooooo oMMMMMMo MMoMMoMM MMoMMoMM oMMMMMMo oooooooo oooooooo oooooooo oooooooo oooooooo } # tile 237 (char 237) { oooooooo oooooooo oooooMMo ooooMMoo oMMMMMoo MMoMMMMo MMMMoMMo MMMooMMo oMMMMMoo oMMooooo MMoooooo oooooooo oooooooo oooooooo } # tile 238 (char 238) { oooooooo oooooooo oooMMMoo ooMMoooo oMMooooo oMMooooo oMMMMMoo oMMooooo oMMooooo ooMMoooo oooMMMoo oooooooo oooooooo oooooooo } # tile 239 (char 239) { oooooooo oooooooo oMMMMMoo MMoooMMo MMoooMMo MMoooMMo MMoooMMo MMoooMMo MMoooMMo MMoooMMo MMoooMMo oooooooo oooooooo oooooooo } # tile 240 (char 240) { oooooooo oooooooo oooooooo oooooooo oooooooo MMMMMMMo oooooooo MMMMMMMo oooooooo MMMMMMMo oooooooo oooooooo oooooooo oooooooo } # tile 241 (char 241) { oooooooo oooooooo oooooooo oooooooo oooMMooo oooMMooo oMMMMMMo oooMMooo oooMMooo oooooooo oMMMMMMo oooooooo oooooooo oooooooo } # tile 242 (char 242) { oooooooo oooooooo ooMMoooo oooMMooo ooooMMoo oooooMMo ooooMMoo oooMMooo ooMMoooo oooooooo oMMMMMMo oooooooo oooooooo oooooooo } # tile 243 (char 243) { oooooooo oooooooo ooooMMoo oooMMooo ooMMoooo oMMooooo ooMMoooo oooMMooo ooooMMoo oooooooo oMMMMMMo oooooooo oooooooo oooooooo } # tile 244 (char 244) { oooooooo oooooooo oooooooo ooooMMoo oooMMMMo oooMMoMo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo } # tile 245 (char 245) { oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oMoMMooo oMMMMooo ooMMoooo oooooooo oooooooo } # tile 246 (char 246) { oooooooo oooooooo oooooooo oooMMooo oooMMooo oooooooo oMMMMMMo oooooooo oooMMooo oooMMooo oooooooo oooooooo oooooooo oooooooo } # tile 247 (char 247) { oooooooo oooooooo oooooooo oooooooo oMMMoMMo MMoMMMoo oooooooo oooooooo oMMMoMMo MMoMMMoo oooooooo oooooooo oooooooo oooooooo } # tile 248 (char 248) { oooooooo oooooooo oMMMMooo MMooMMoo MMooMMoo oMMMMooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo } # tile 249 (char 249) { oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooMMooo oooMMooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo } # tile 250 (char 250) { oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooMMooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo } # tile 251 (char 251) { oooooooo oooooooo oooooooo oooMMMMM oooMMooo oooMMooo oooMMooo oooMMooo MMoMMooo oMMMMooo ooMMMooo oooMMooo oooooooo oooooooo } # tile 252 (char 252) { oooooooo MMoMMooo oMMoMMoo oMMoMMoo oMMoMMoo oMMoMMoo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo } # tile 253 (char 253) { oooooooo oMMMoooo MMoMMooo ooMMoooo oMMooooo MMMMMooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo } # tile 254 (char 254) { oooooooo oooooooo oooooooo oooooooo oMMMMMMo oMMMMMMo oMMMMMMo oMMMMMMo oMMMMMMo oMMMMMMo oooooooo oooooooo oooooooo oooooooo } # tile 255 (char 255) { oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo } slashem-0.0.7E7F3/win/gl/gl_rendu.c0000664000076400007640000005722110545462317015025 0ustar aliali/* Copyright (C) 2002 Andrew Apted */ /* NetHack may be freely redistributed. See license for details. */ /* * SDL/GL window port for NetHack & Slash'EM. * * Software rendering utilities. */ #include "hack.h" #include "patchlevel.h" #if defined (SDL_GRAPHICS) /* software only */ #define WINGL_INTERNAL #include "winGL.h" #define SHRINK_FAST 0 #define COLOR_CACHE_SIZE 512 #define COLOR_HASH(r,g,b) \ ((g) + (r) * 11 + (b) * 41) struct ColorCacheEntry { /* index into sdlgl_palette[], or -1 if unused */ short index; /* color that was matched at the index */ rgbcol_t color; }; /* this palette contains the colors used in the 32x32 tileset, and * includes the 16 colors used in the 16x16 tileset. * * the first two colors are black and white, for somewhat arcane * reasons (to minimise color-flashing under an 8-bit X server). */ rgbcol_t sdlgl_palette[256] = { 0x000000, 0xffffff, #ifdef VANILLA_GLHACK 0x000010, 0x000020, 0x000030, 0x000040, 0x000060, 0x000080, 0x0000a0, 0x0000c0, 0x0000e0, 0x0000ff, 0x001000, 0x001010, 0x001800, 0x001818, 0x002000, 0x002020, 0x002040, 0x003000, 0x003018, 0x003030, 0x003060, 0x004000, 0x004080, 0x004020, 0x004040, 0x0050a0, 0x006000, 0x0060c0, 0x006030, 0x006060, 0x0070e0, 0x008000, 0x008080, 0x0080ff, 0x008040, 0x009100, 0x00a000, 0x00a0a0, 0x00a050, 0x00b6ff, 0x00c000, 0x00c0c0, 0x00c060, 0x00e000, 0x00e070, 0x00e0e0, 0x00fdfd, 0x00ff00, 0x00ff80, 0x100000, 0x100010, 0x101000, 0x101010, 0x180000, 0x181800, 0x181830, 0x183000, 0x183018, 0x183030, 0x200000, 0x200020, 0x201000, 0x202020, 0x204000, 0x204020, 0x204040, 0x2a4141, 0x300000, 0x300030, 0x300c00, 0x301800, 0x301818, 0x302400, 0x303000, 0x303018, 0x303030, 0x303060, 0x306000, 0x306030, 0x306060, 0x395858, 0x400000, 0x400080, 0x400020, 0x400040, 0x408000, 0x408080, 0x408040, 0x401000, 0x402000, 0x402020, 0x402040, 0x403000, 0x404000, 0x404080, 0x404020, 0x404040, 0x476c6c, 0x5000a0, 0x50a000, 0x50a0a0, 0x50a050, 0x5050a0, 0x505050, 0x600000, 0x6000c0, 0x600030, 0x600060, 0x608080, 0x608060, 0x60c000, 0x60c0c0, 0x60c060, 0x601800, 0x603000, 0x603030, 0x603060, 0x604800, 0x606000, 0x606080, 0x6060c0, 0x606030, 0x606060, 0x64a0a0, 0x68541f, 0x6c91b6, 0x6cff00, 0x7000e0, 0x707070, 0x7070e0, 0x70e000, 0x70e070, 0x70e0e0, 0x756958, 0x7878a0, 0x78a078, 0x78a0a0, 0x7f5a48, 0x800000, 0x800040, 0x800080, 0x8000ff, 0x802000, 0x804000, 0x804080, 0x804040, 0x806000, 0x806080, 0x806060, 0x807020, 0x808000, 0x808080, 0x8080ff, 0x808040, 0x808060, 0x80ff00, 0x80ff80, 0x80ffff, 0x8e1000, 0x909090, 0x9090c0, 0x90c090, 0x90c0c0, 0x91876e, 0x914700, 0xa00000, 0xa000a0, 0xa00050, 0xa07800, 0xa07878, 0xa078a0, 0xa0a000, 0xa0a078, 0xa0a0a0, 0xa0a050, 0xa02800, 0xa05000, 0xa050a0, 0xa05050, 0xa5765e, 0xa8a8e0, 0xa8e0a8, 0xa8e0e0, 0xaa8834, 0xab9a81, 0xb0b0b0, 0xb64700, 0xc00000, 0xc000c0, 0xc00060, 0xc09000, 0xc09090, 0xc090c0, 0xc0a040, 0xc0c000, 0xc0c090, 0xc0c0c0, 0xc0c0ff, 0xc0c060, 0xc0ffc0, 0xc0ffff, 0xc03000, 0xc06000, 0xc060c0, 0xc06060, 0xc91700, 0xca8f72, 0xcc4f00, 0xd0a850, 0xd0d0d0, 0xd57600, 0xdadab6, 0xe00000, 0xe00070, 0xe000e0, 0xe07000, 0xe07070, 0xe070e0, 0xe0a800, 0xe0a8a8, 0xe0a8e0, 0xe0c0a0, 0xe0e000, 0xe0e070, 0xe0e0a8, 0xe0e0e0, 0xe03800, 0xe5a282, 0xec9100, 0xf0f0f0, 0xf2c44d, 0xf8e060, 0xfcfc99, 0xff0000, 0xff0080, 0xff00ff, 0xff1e00, 0xff4000, 0xff6c00, 0xff8000, 0xff8080, 0xff8777, 0xffb691, 0xffc000, 0xffc0c0, 0xffc0ff, 0xffd3af, 0xffff00, 0xffff80, 0xffffc0, 0x102030, 0x301800, 0x282828, /* bkg colors (unused by tiles) */ 0x000000, /* 255 = transparent color (0x00ffff) */ #else /* Slash'EM */ 0x000010, 0x000020, 0x000030, 0x000040, 0x000060, 0x000080, 0x0000a0, 0x0000c0, 0x0000e0, 0x0000ff, 0x001000, 0x001010, 0x001800, 0x001818, 0x001830, 0x002000, 0x002020, 0x002040, 0x003000, 0x003018, 0x003030, 0x003060, 0x004000, 0x004020, 0x004040, 0x004080, 0x0050a0, 0x006000, 0x006030, 0x006060, 0x0060c0, 0x0070e0, 0x008000, 0x008040, 0x008080, 0x0080ff, 0x009000, 0x00a000, 0x00a050, 0x00a0a0, 0x00b6ff, 0x00c000, 0x00c060, 0x00c0c0, 0x00e000, 0x00e070, 0x00e0e0, 0x00ff00, 0x00ff80, 0x00ffff, 0x100000, 0x100010, 0x101000, 0x101010, 0x103030, 0x180000, 0x181800, 0x181830, 0x183000, 0x183018, 0x183030, 0x200000, 0x200020, 0x202000, 0x202020, 0x204000, 0x204020, 0x204040, 0x300000, 0x300030, 0x300c00, 0x301800, 0x301818, 0x302400, 0x303000, 0x303018, 0x303030, 0x303060, 0x306000, 0x306030, 0x306060, 0x400000, 0x400020, 0x400040, 0x400080, 0x401000, 0x402000, 0x402020, 0x402040, 0x403000, 0x404000, 0x404020, 0x404040, 0x404080, 0x408000, 0x408040, 0x408080, 0x486c6c, 0x5000a0, 0x505050, 0x5050a0, 0x50a000, 0x50a050, 0x50a0a0, 0x600000, 0x600030, 0x600060, 0x6000c0, 0x601800, 0x603000, 0x603030, 0x603060, 0x604800, 0x606000, 0x606030, 0x606060, 0x606080, 0x6060c0, 0x608060, 0x608080, 0x60c000, 0x60c060, 0x60c0c0, 0x6090b2, 0x68541f, 0x6c90b6, 0x6cff00, 0x7000e0, 0x707070, 0x7070e0, 0x70a0a0, 0x70e000, 0x70e070, 0x70e0e0, 0x756958, 0x7878a0, 0x78a078, 0x78a0a0, 0x800000, 0x800040, 0x800080, 0x8000ff, 0x802000, 0x804000, 0x804040, 0x804080, 0x805a48, 0x806000, 0x806060, 0x806080, 0x807020, 0x808000, 0x808040, 0x808060, 0x808080, 0x8080ff, 0x80ff00, 0x80ff80, 0x80ffff, 0x904800, 0x90876e, 0x909090, 0x9090c0, 0x90c090, 0x90c0c0, 0xa00000, 0xa00050, 0xa000a0, 0xa02800, 0xa05000, 0xa05050, 0xa050a0, 0xa07800, 0xa07878, 0xa078a0, 0xa0a000, 0xa0a050, 0xa0a078, 0xa0a0a0, 0xa0a0e0, 0xa57660, 0xa8a8e0, 0xa8e0a8, 0xa8e0e0, 0xaa8834, 0xaa9a80, 0xb0b0b0, 0xb24000, 0xb64800, 0xc00000, 0xc00060, 0xc000c0, 0xc03000, 0xc06000, 0xc06060, 0xc060c0, 0xc09000, 0xc09090, 0xc090c0, 0xc0a040, 0xc0c000, 0xc0c060, 0xc0c090, 0xc0c0c0, 0xc0c0ff, 0xc0ffc0, 0xc0ffff, 0xca9072, 0xd0a850, 0xd0d0d0, 0xd2d2b2, 0xdadab6, 0xe00000, 0xe00070, 0xe000e0, 0xe03800, 0xe07000, 0xe07070, 0xe070e0, 0xe0a800, 0xe0a8a8, 0xe0a8e0, 0xe0c0a0, 0xe0e000, 0xe0e070, 0xe0e0a8, 0xe0e0e0, 0xe5a282, 0xf0f0f0, 0xf20000, 0xf26000, 0xf2c44d, 0xf8e060, 0xfcfc99, 0xff0000, 0xff0080, 0xff00ff, 0xff4000, 0xff6c00, 0xff8000, 0xff8080, 0xff80ff, 0xffb690, 0xffc000, 0xffc0c0, 0xffc0ff, 0xffd3b0, 0xffff00, 0xffff80, 0xffffc0, 0x102030, 0x301800, 0x282828, /* bkg colors (unused by tiles) */ 0x000000, /* 255 = transparent color (0x476c6c) */ #endif }; static struct ColorCacheEntry color_cache[COLOR_CACHE_SIZE] = { { -1, 0 }, }; void sdlgl_set_surface_colors(SDL_Surface *surf) { int i; SDL_Color colors[256]; for (i=0; i < 256; i++) { colors[i].r = GAMMA(RGB_RED(sdlgl_palette[i])); colors[i].g = GAMMA(RGB_GRN(sdlgl_palette[i])); colors[i].b = GAMMA(RGB_BLU(sdlgl_palette[i])); } SDL_SetColors(surf, colors, 0, 256); } static int fast_find_color(int r, int g, int b) { rgbcol_t rgb = RGB_MAKE(r, g, b); int hash = COLOR_HASH(r, g, b) % COLOR_CACHE_SIZE; int c = color_cache[hash].index; if (c >= 0 && color_cache[hash].color == rgb) { /* cache hit */ return c; } /* cache miss -- find required index */ { int best = 0; int best_dist = 1 << 30; for (c=0; c < 256; c++) { int dr, dg, db, dist; if (c == TRANS_PIX) continue; dr = r - RGB_RED(sdlgl_palette[c]); dg = g - RGB_GRN(sdlgl_palette[c]); db = b - RGB_BLU(sdlgl_palette[c]); dist = (dr * dr) + (dg * dg) + (db * db); if (dist == 0) { best = c; break; } if (dist < best_dist) { best = c; best_dist = dist; } } c = best; } color_cache[hash].index = c; color_cache[hash].color = rgb; return c; } /*------------------------------------------------------------------------*/ static GH_INLINE void setpixel(SDL_Surface *s, int x, int y, Uint32 c) { int bpp = s->format->BytesPerPixel; Uint8 *p = (Uint8 *)s->pixels + y * s->pitch + x * bpp; switch(bpp) { case 1: *p = c; break; case 2: *(Uint16 *)p = c; break; case 3: if (SDL_BYTEORDER == SDL_BIG_ENDIAN) { p[0] = (c >> 16) & 0xff; p[1] = (c >> 8) & 0xff; p[2] = c & 0xff; } else { p[0] = c & 0xff; p[1] = (c >> 8) & 0xff; p[2] = (c >> 16) & 0xff; } break; case 4: *(Uint32 *)p = c; break; default: sdlgl_error("Bit depth not one of (8,16,24,32) (depth: %d)\n", bpp); break; /* NOT REACHED */ } } static GH_INLINE Uint32 getpixel(SDL_Surface *s, int x, int y) { int bpp = s->format->BytesPerPixel; Uint8 *p = (Uint8 *)s->pixels + y * s->pitch + x * bpp; switch(bpp) { case 1: return *p; case 2: return *(Uint16 *)p; case 3: if(SDL_BYTEORDER == SDL_BIG_ENDIAN) return (p[0] << 16) | (p[1] << 8) | p[2]; else return (p[2] << 16) | (p[1] << 8) | p[0]; case 4: return *(Uint32 *)p; default: sdlgl_error("Bit depth not one of (8,16,24,32) (depth: %d)\n", bpp); return 0; /* NOT REACHED */ } } SDL_Surface *sdlgl_RGBA_to_truecolor(unsigned char *data, int width, int height) { SDL_Surface *surf; Uint32 r, g, b, a; if (SDL_BYTEORDER == SDL_BIG_ENDIAN) { r = 0xFF000000; g = 0x00FF0000; b = 0x0000FF00; a = 0x000000FF; } else { r = 0x000000FF; g = 0x0000FF00; b = 0x00FF0000; a = 0xFF000000; } surf = SDL_CreateRGBSurfaceFrom(data, width, height, 32, 4 * width, r, g, b, a); if (! surf) return NULL; /* Since SDL_CreateRGBSurfaceFrom merely copies the data pointer, we * must not free it. Instead, we'll tell SDL to free it. * NOTE: this is *not* a public API. */ surf->flags &= ~SDL_PREALLOC; return surf; } SDL_Surface *sdlgl_RGBA_to_palettised(unsigned char *data, int width, int height) { int x, y; SDL_Surface *surf = SDL_CreateRGBSurface(SDL_SWSURFACE, width, height, 8, 0, 0, 0, 0); if (! surf) return NULL; sdlgl_set_surface_colors(surf); SDL_SetColorKey(surf, SDL_SRCCOLORKEY, TRANS_PIX); if (SDL_MUSTLOCK(surf)) SDL_LockSurface(surf); for (y=0; y < height; y++) for (x=0; x < width; x++) { unsigned char *src = data + (y * width * 4) + (x * 4); int pix = (src[3] < 128) ? TRANS_PIX : fast_find_color(src[0], src[1], src[2]); setpixel(surf, x, y, pix); } if (SDL_MUSTLOCK(surf)) SDL_UnlockSurface(surf); return surf; } SDL_Surface *sdlgl_shrink_surface(SDL_Surface *src) { int x, y; SDL_Surface *dest = SDL_CreateRGBSurface(SDL_SWSURFACE, src->w / 2, src->h / 2, 8, 0, 0, 0, 0); if (! dest) return NULL; /* Only works with 8 bit surfaces. */ assert(src->format->BytesPerPixel == 1); sdlgl_set_surface_colors(dest); SDL_SetColorKey(dest, SDL_SRCCOLORKEY, TRANS_PIX); assert((src->w % 2) == 0); assert((src->h % 2) == 0); if (SDL_MUSTLOCK(src)) SDL_LockSurface(src); if (SDL_MUSTLOCK(dest)) SDL_LockSurface(dest); #if SHRINK_FAST { for (y=0; y < src->h; y += 2) for (x=0; x < src->w; x += 2) { setpixel(dest, x/2, y/2, getpixel(src, x, y)); } } #else /* slow but nicer */ { for (y=0; y < src->h; y += 2) for (x=0; x < src->w; x += 2) { /* compute average of the four pixels */ int sub; Uint8 r, g, b; Uint32 c, r_tot=0, g_tot=0, b_tot=0, a_count=0; for (sub=0; sub < 4; sub++) { c = getpixel(src, x + (sub & 1), y + (sub & 2) / 2); if (c == TRANS_PIX) { a_count++; } else { /* assert(0 <= c && c <= 255); */ /* -AJA- Previously I used SDL_GetRGB() here, which had the * unfortunate effect of apply gamma _twice_ to the * resulting image. */ r_tot += RGB_RED(sdlgl_palette[c]); g_tot += RGB_GRN(sdlgl_palette[c]); b_tot += RGB_BLU(sdlgl_palette[c]); } } if (a_count > 4/2) { setpixel(dest, x/2, y/2, TRANS_PIX); } else { r = r_tot / (4 - a_count); g = g_tot / (4 - a_count); b = b_tot / (4 - a_count); setpixel(dest, x/2, y/2, fast_find_color(r, g, b)); } } } #endif if (SDL_MUSTLOCK(src)) SDL_UnlockSurface(src); if (SDL_MUSTLOCK(dest)) SDL_UnlockSurface(dest); return dest; } void sdlgl_sw_create_has_alpha(struct TileSet *set) { int tile; SDL_Surface *surf = set->surf; if (surf->format->BytesPerPixel != 1) return; set->has_alpha = (unsigned char *) alloc(set->tile_num); memset(set->has_alpha, 0, set->tile_num * sizeof(unsigned char)); if (SDL_MUSTLOCK(surf)) SDL_LockSurface(surf); for (tile = 0; tile < set->tile_num; tile++) { int x = (tile % set->pack_w) * set->tile_w; int y = (tile / set->pack_w) * set->tile_h; int dx, dy; int done = 0; for (dy = 0; (dy < set->tile_h) && !done; dy++) for (dx = 0; (dx < set->tile_w) && !done; dx++) { if (getpixel(surf, x+dx, y+dy) == TRANS_PIX) { set->has_alpha[tile] = 1; done = 1; } } } if (SDL_MUSTLOCK(surf)) SDL_UnlockSurface(surf); } /*------------------------------------------------------------------------*/ void sdlgl_create_font_cache(struct TileSet *set) { int i; struct FontCache *cache; cache = (struct FontCache *) alloc(sizeof(struct FontCache)); cache->char_num = FONTCACHE_SIZE; cache->pack_w = FONTCACHE_PACK_W; cache->pack_h = (cache->char_num + cache->pack_w - 1) / cache->pack_w; cache->char_surf = SDL_CreateRGBSurface(SDL_SWSURFACE, cache->pack_w * set->tile_w, cache->pack_h * set->tile_h, 8, 0, 0, 0, 0); if (! cache->char_surf) { sdlgl_error("Failed to create SDL surface for font cache.\n"); /* NOT REACHED */ } sdlgl_set_surface_colors(cache->char_surf); SDL_SetColorKey(cache->char_surf, SDL_SRCCOLORKEY, TRANS_PIX); cache->what_cols = (tilecol_t *) alloc(cache->char_num * sizeof(tilecol_t)); for (i=0; i < cache->char_num; i++) cache->what_cols[i] = TILECOL_UNUSED; set->font_cache = cache; } void sdlgl_free_font_cache(struct TileSet *set) { assert(set->font_cache); assert(set->font_cache->char_surf); assert(set->font_cache->what_cols); SDL_FreeSurface(set->font_cache->char_surf); free(set->font_cache->what_cols); free(set->font_cache); set->font_cache = NULL; } void sdlgl_font_cache_lookup(struct TileSet *set, tileidx_t ch, tilecol_t color, int *pos_x, int *pos_y) { struct FontCache *cache = set->font_cache; int hash = FONTCACHE_HASH(ch,color) % cache->char_num; assert(hash >= 0); (*pos_x) = hash % cache->pack_w; (*pos_y) = hash / cache->pack_w; assert((*pos_y) < cache->pack_h); if (cache->what_cols[hash] == color) { /* cache hit -- do nothing */ return; } /* cache miss -- replace tile with colored font char */ { int x, y; int tw = set->tile_w; int th = set->tile_h; int src_x = (ch % set->pack_w) * tw; int src_y = (ch / set->pack_w) * th; int dest_x = (*pos_x) * tw; int dest_y = (*pos_y) * th; rgbcol_t rgb = sdlgl_text_colors[color]; Uint32 c = SDL_MapRGB(cache->char_surf->format, GAMMA(RGB_RED(rgb)), GAMMA(RGB_GRN(rgb)), GAMMA(RGB_BLU(rgb))); assert(src_y/th < set->pack_h); if (SDL_MUSTLOCK(set->surf)) SDL_LockSurface(set->surf); if (SDL_MUSTLOCK(cache->char_surf)) SDL_LockSurface(cache->char_surf); for (y=0; y < th; y++) for (x=0; x < tw; x++) { Uint32 pix = getpixel(set->surf, src_x + x, src_y + y); if (pix != TRANS_PIX) pix = c; setpixel(cache->char_surf, dest_x + x, dest_y + y, pix); } if (SDL_MUSTLOCK(set->surf)) SDL_UnlockSurface(set->surf); if (SDL_MUSTLOCK(cache->char_surf)) SDL_UnlockSurface(cache->char_surf); } /* fix up cache ! */ cache->what_cols[hash] = color; } /*------------------------------------------------------------------------*/ struct DirtyMatrix *sdlgl_create_dirty_matrix(int pw, int ph) { struct DirtyMatrix *mat; mat = (struct DirtyMatrix *) alloc(sizeof(struct DirtyMatrix)); mat->pw = pw; mat->ph = ph; mat->cw = (pw + DIRTY_SIZE - 1) / DIRTY_SIZE; mat->ch = (ph + DIRTY_SIZE - 1) / DIRTY_SIZE; assert(mat->cw > 1); assert(mat->ch > 1); mat->cells = (unsigned char *) alloc(mat->cw * mat->ch); /* initial dirty matrix should be fully dirty, so that initial * background gets drawn & blitted. */ memset(mat->cells, 0 /* depth */, mat->cw * mat->ch); /* create the updating rectangles */ mat->max_rects = ((mat->cw + 1) / 2) * mat->ch; mat->updaters = (SDL_Rect *) alloc(mat->max_rects * sizeof(SDL_Rect)); return mat; } void sdlgl_free_dirty_matrix(struct DirtyMatrix *mat) { free(mat->updaters); mat->updaters = NULL; free(mat->cells); mat->cells = NULL; free(mat); } void sdlgl_dirty_matrix_clear(struct DirtyMatrix *mat) { int x, y; for (y=0; y < mat->ch; y++) for (x=0; x < mat->cw; x++) { mat->cells[y * mat->cw + x] = CLEAN_CELL; } } void sdlgl_dirty_matrix_add(struct DirtyMatrix *mat, int x, int y, int w, int h, int depth) { int dx1, dy1; int dx2, dy2; /* clip coords */ if (x < 0) { w += x; x = 0; } if (y < 0) { h += y; y = 0; } if (x + w >= mat->pw) { w = mat->pw - x; } if (y + h >= mat->ph) { h = mat->ph - y; } if (w <= 0 || h <= 0) return; dx1 = x / DIRTY_SIZE; dy1 = y / DIRTY_SIZE; dx2 = (x + w - 1) / DIRTY_SIZE; dy2 = (y + h - 1) / DIRTY_SIZE; for (y = dy1; y <= dy2; y++) for (x = dx1; x <= dx2; x++) { unsigned char *cell = mat->cells + (y * mat->cw) + x; if (*cell > depth) *cell = depth; } } int sdlgl_dirty_matrix_test(struct DirtyMatrix *mat, int x, int y, int w, int h, int depth) { int dx1, dy1; int dx2, dy2; /* clip coords */ if (x < 0) { w += x; x = 0; } if (y < 0) { h += y; y = 0; } if (x + w >= mat->pw) { w = mat->pw - x; } if (y + h >= mat->ph) { h = mat->ph - y; } if (w <= 0 || h <= 0) return 0; /* clean */ dx1 = x / DIRTY_SIZE; dy1 = y / DIRTY_SIZE; dx2 = (x + w - 1) / DIRTY_SIZE; dy2 = (y + h - 1) / DIRTY_SIZE; for (y = dy1; y <= dy2; y++) for (x = dx1; x <= dx2; x++) { unsigned char *cell = mat->cells + (y * mat->cw) + x; if (*cell <= depth) return 1; /* dirty */ } return 0; /* clean */ } /* returns the number of rectangles. */ int sdlgl_dirty_matrix_to_updaters(struct DirtyMatrix *mat) { int num = 0; int x, y, w; int pix_w, pix_h; for (y = 0; y < mat->ph; y += DIRTY_SIZE) for (x = 0; x < mat->pw; x += w * DIRTY_SIZE) { w = 1; /* NOTE: Now 1-to-1, so it could read the matrix directly... */ if (sdlgl_dirty_matrix_test(mat, x, y, DIRTY_SIZE, DIRTY_SIZE, CLEAN_CELL-1) == 0) { continue; } /* find longest horizontal run */ for (;;) { int x2 = x + w * DIRTY_SIZE; if (x2 >= mat->pw) break; if (sdlgl_dirty_matrix_test(mat, x2, y, w * DIRTY_SIZE, DIRTY_SIZE, CLEAN_CELL-1) == 0) { break; } w += 1; } assert(num < mat->max_rects); pix_w = w * DIRTY_SIZE; pix_h = 1 * DIRTY_SIZE; if (x + pix_w >= mat->pw) pix_w = mat->pw - x; if (y + pix_h >= mat->ph) pix_h = mat->ph - y; assert(pix_w > 0 && pix_h > 0); mat->updaters[num].x = x; mat->updaters[num].y = y; mat->updaters[num].w = pix_w; mat->updaters[num].h = pix_h; num++; } return num; } /*------------------------------------------------------------------------*/ static GH_INLINE void low_level_blit(int sx, int sy, SDL_Surface *src, int dx, int dy, int dw, int dh, Uint32 col, int px, int py, int pw, int ph) { SDL_Rect srect, drect; dx += px; dy += py; dw -= px; dh -= py; assert(dw > 0 && dh > 0); assert(pw > 0 && ph > 0); drect.x = dx; drect.y = dy; drect.w = min(dw, pw); drect.h = min(dh, ph); if (src) { srect.x = sx; srect.y = sy; srect.w = drect.w; srect.h = drect.h; SDL_BlitSurface(src, &srect, sdlgl_surf, &drect); } else { SDL_FillRect(sdlgl_surf, &drect, col); } } void sdlgl_dirty_matrix_blit(struct DirtyMatrix *mat, SDL_Surface *src, SDL_Rect *srect, SDL_Rect *drect, Uint32 col, int depth) { /* This function is the ONLY function that draws into the screen * surface. When `src' is NULL, it fills with the given color, * otherwise we are blitting from the source surface. Both cases * will limit drawing to areas marked as dirty. * * Algorithm: * * 1. Clip to matrix size. Abort if result is empty. * * 2. Compute dirty area. Abort if fully clean. If fully dirty, * apply blit and return early. * * 3. Complex blit: iterate over dirty area. For each dirty * cell, set SDL's clipper and apply blit. */ int sx, sy; /* source rect */ int dx, dy, dw, dh; /* dest rect */ int dx1, dy1, dx2, dy2; /* dirty area */ dx = drect->x; dy = drect->y; dw = drect->w; dh = drect->h; if (srect) { sx = srect->x; sy = srect->y; dw = srect->w; dh = srect->h; } else if (src) { sx = 0; sy = 0; dw = src->w; dh = src->h; } else { sx = sy = 0; /* not needed */ } /* --- clipping --- */ if (dx < 0) { dw += dx; sx -= dx; dx = 0; } if (dy < 0) { dh += dy; sy -= dy; dy = 0; } if (dx + dw >= mat->pw) { dw = mat->pw - dx; } if (dy + dh >= mat->ph) { dh = mat->ph - dy; } if (dw <= 0 || dh <= 0) return; /* --- compute dirty area --- */ { int cx, cy; /* cell */ int dirty_num = 0; int total; dx1 = dx / DIRTY_SIZE; dy1 = dy / DIRTY_SIZE; dx2 = (dx + dw - 1) / DIRTY_SIZE; dy2 = (dy + dh - 1) / DIRTY_SIZE; assert(0 <= dx1 && dx1 <= dx2 && dx2 < mat->cw); assert(0 <= dy1 && dy1 <= dy2 && dy2 < mat->ch); total = (dx2 - dx1 + 1) * (dy2 - dy1 + 1); for (cy = dy1; cy <= dy2; cy++) for (cx = dx1; cx <= dx2; cx++) { if (mat->cells[cy * mat->cw + cx] <= depth) dirty_num++; } if (dirty_num == 0) return; if (dirty_num == total) { low_level_blit(sx, sy, src, dx, dy, dw, dh, col, 0, 0, dw, dh); return; } } /* --- do complex clipping --- */ { SDL_Rect old_clip, clip; int cx, cy, c_len; /* cell */ int nw, nh; SDL_GetClipRect(sdlgl_surf, &old_clip); for (cy = dy1; cy <= dy2; cy++) for (cx = dx1; cx <= dx2; cx += c_len) { c_len = 1; if (mat->cells[cy * mat->cw + cx] > depth) continue; /* find longest horizontal run */ for (;;) { int cx2 = cx + c_len; if (cx2 >= mat->cw) break; if (mat->cells[cy * mat->cw + cx2] > depth) break; c_len++; } clip.x = cx * DIRTY_SIZE; clip.y = cy * DIRTY_SIZE; nw = c_len * DIRTY_SIZE; nh = DIRTY_SIZE; /* compute intersection with old clip rectangle */ if (clip.x < old_clip.x) { nw -= (old_clip.x - clip.x); clip.x = old_clip.x; } if (clip.y < old_clip.y) { nh -= (old_clip.y - clip.y); clip.y = old_clip.y; } if (clip.x + nw > old_clip.x + old_clip.w) nw = old_clip.x + old_clip.w - clip.x; if (clip.y + nh > old_clip.y + old_clip.h) nh = old_clip.y + old_clip.h - clip.y; if (nw <= 0 || nh <= 0) continue; clip.w = nw; clip.h = nh; SDL_SetClipRect(sdlgl_surf, &clip); low_level_blit(sx, sy, src, dx, dy, dw, dh, col, 0, 0, dw, dh); } SDL_SetClipRect(sdlgl_surf, &old_clip); } } #endif /* SDL_GRAPHICS */ /*gl_rendu.c*/ slashem-0.0.7E7F3/win/gl/font8.txt0000664000076400007640000007050610545462317014662 0ustar alialio = (0, 0, 0) M = (255, 255, 255) # tile 0 (char 0) { oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo } # tile 1 (char 1) { oMMMMMMo MooooooM MoMooMoM MooooooM MoMMMMoM MooMMooM MooooooM oMMMMMMo } # tile 2 (char 2) { oMMMMMMo MMMMMMMM MMoMMoMM MMMMMMMM MMooooMM MMMooMMM MMMMMMMM oMMMMMMo } # tile 3 (char 3) { oMMoMMoo MMMMMMMo MMMMMMMo MMMMMMMo oMMMMMoo ooMMMooo oooMoooo oooooooo } # tile 4 (char 4) { oooMoooo ooMMMooo oMMMMMoo MMMMMMMo oMMMMMoo ooMMMooo oooMoooo oooooooo } # tile 5 (char 5) { ooMMMooo oMMMMMoo ooMMMooo MMMMMMMo MMMMMMMo MMoMoMMo oooMoooo ooMMMooo } # tile 6 (char 6) { oooMoooo ooMMMooo oMMMMMoo MMMMMMMo MMMMMMMo oMMMMMoo oooMoooo ooMMMooo } # tile 7 (char 7) { oooooooo oooooooo oooMMooo ooMMMMoo ooMMMMoo oooMMooo oooooooo oooooooo } # tile 8 (char 8) { MMMMMMMM MMMMMMMM MMMooMMM MMooooMM MMooooMM MMMooMMM MMMMMMMM MMMMMMMM } # tile 9 (char 9) { oooooooo ooMMMMoo oMMooMMo oMooooMo oMooooMo oMMooMMo ooMMMMoo oooooooo } # tile 10 (char 10) { MMMMMMMM MMooooMM MooMMooM MoMMMMoM MoMMMMoM MooMMooM MMooooMM MMMMMMMM } # tile 11 (char 11) { ooooMMMM oooooMMM ooooMMMM oMMMMMoM MMooMMoo MMooMMoo MMooMMoo oMMMMooo } # tile 12 (char 12) { ooMMMMoo oMMooMMo oMMooMMo oMMooMMo ooMMMMoo oooMMooo oMMMMMMo oooMMooo } # tile 13 (char 13) { ooMMMMMM ooMMooMM ooMMMMMM ooMMoooo ooMMoooo oMMMoooo MMMMoooo MMMooooo } # tile 14 (char 14) { oMMMMMMM oMMoooMM oMMMMMMM oMMoooMM oMMoooMM oMMooMMM MMMooMMo MMoooooo } # tile 15 (char 15) { oooMMooo MMoMMoMM ooMMMMoo MMMooMMM MMMooMMM ooMMMMoo MMoMMoMM oooMMooo } # tile 16 (char 16) { Mooooooo MMMooooo MMMMMooo MMMMMMMo MMMMMooo MMMooooo Mooooooo oooooooo } # tile 17 (char 17) { ooooooMo ooooMMMo ooMMMMMo MMMMMMMo ooMMMMMo ooooMMMo ooooooMo oooooooo } # tile 18 (char 18) { oooMMooo ooMMMMoo oMMMMMMo oooMMooo oooMMooo oMMMMMMo ooMMMMoo oooMMooo } # tile 19 (char 19) { oMMooMMo oMMooMMo oMMooMMo oMMooMMo oMMooMMo oooooooo oMMooMMo oooooooo } # tile 20 (char 20) { oMMMMMMM MMoMMoMM MMoMMoMM oMMMMoMM oooMMoMM oooMMoMM oooMMoMM oooooooo } # tile 21 (char 21) { ooMMMMMo oMMooooM ooMMMMoo oMMooMMo oMMooMMo ooMMMMoo MooooMMo oMMMMMoo } # tile 22 (char 22) { oooooooo oooooooo oooooooo oooooooo oMMMMMMo oMMMMMMo oMMMMMMo oooooooo } # tile 23 (char 23) { oooMMooo ooMMMMoo oMMMMMMo oooMMooo oMMMMMMo ooMMMMoo oooMMooo MMMMMMMM } # tile 24 (char 24) { oooMMooo ooMMMMoo oMMMMMMo oooMMooo oooMMooo oooMMooo oooMMooo oooooooo } # tile 25 (char 25) { oooMMooo oooMMooo oooMMooo oooMMooo oMMMMMMo ooMMMMoo oooMMooo oooooooo } # tile 26 (char 26) { oooooooo oooMMooo ooooMMoo MMMMMMMo ooooMMoo oooMMooo oooooooo oooooooo } # tile 27 (char 27) { oooooooo ooMMoooo oMMooooo MMMMMMMo oMMooooo ooMMoooo oooooooo oooooooo } # tile 28 (char 28) { oooooooo oooooooo MMoooooo MMoooooo MMoooooo MMMMMMMo oooooooo oooooooo } # tile 29 (char 29) { oooooooo ooMooMoo oMMooMMo MMMMMMMM oMMooMMo ooMooMoo oooooooo oooooooo } # tile 30 (char 30) { oooooooo oooMMooo ooMMMMoo oMMMMMMo MMMMMMMM MMMMMMMM oooooooo oooooooo } # tile 31 (char 31) { oooooooo MMMMMMMM MMMMMMMM oMMMMMMo ooMMMMoo oooMMooo oooooooo oooooooo } # tile 32 (char 32) { oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo } # tile 33 (char 33) { oooMMooo ooMMMMoo ooMMMMoo ooMMMMoo oooMMooo oooooooo oooMMooo oooooooo } # tile 34 (char 34) { oMMoMMoo oMMoMMoo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo } # tile 35 (char 35) { oMMoMMoo oMMoMMoo MMMMMMMo oMMoMMoo MMMMMMMo oMMoMMoo oMMoMMoo oooooooo } # tile 36 (char 36) { oooMMooo ooMMMMMo oMMooooo ooMMMMoo oooooMMo oMMMMMoo oooMMooo oooooooo } # tile 37 (char 37) { oooooooo MMoooMMo MMooMMoo oooMMooo ooMMoooo oMMooMMo MMoooMMo oooooooo } # tile 38 (char 38) { ooMMMooo oMMoMMoo oMMoMooo oMMMoMMo MMoMMMoo MMooMMoo oMMMoMMo oooooooo } # tile 39 (char 39) { oooMMooo oooMMooo ooMMoooo oooooooo oooooooo oooooooo oooooooo oooooooo } # tile 40 (char 40) { ooooMMoo oooMMooo ooMMoooo ooMMoooo ooMMoooo oooMMooo ooooMMoo oooooooo } # tile 41 (char 41) { ooMMoooo oooMMooo ooooMMoo ooooMMoo ooooMMoo oooMMooo ooMMoooo oooooooo } # tile 42 (char 42) { oooooooo oMMooMMo ooMMMMoo MMMMMMMM ooMMMMoo oMMooMMo oooooooo oooooooo } # tile 43 (char 43) { oooooooo oooMMooo oooMMooo oMMMMMMo oooMMooo oooMMooo oooooooo oooooooo } # tile 44 (char 44) { oooooooo oooooooo oooooooo oooooooo oooooooo oooMMooo oooMMooo ooMMoooo } # tile 45 (char 45) { oooooooo oooooooo oooooooo oMMMMMMo oooooooo oooooooo oooooooo oooooooo } # tile 46 (char 46) { oooooooo oooooooo oooooooo oooooooo oooooooo oooMMooo oooMMooo oooooooo } # tile 47 (char 47) { ooooooMM oooooMMo ooooMMoo oooMMooo ooMMoooo oMMooooo MMoooooo oooooooo } # tile 48 (char 48) { oMMMMMoo MMoooMMo MMoMMMMo MMMMMMMo MMMMoMMo MMoooMMo oMMMMMoo oooooooo } # tile 49 (char 49) { oooMMooo oMMMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooooooo } # tile 50 (char 50) { oMMMMMoo MMoooMMo ooooMMoo oooMMooo ooMMoooo oMMooooo MMMMMMMo oooooooo } # tile 51 (char 51) { oMMMMMoo MMoooMMo oooooMMo oooMMMoo oooooMMo MMoooMMo oMMMMMoo oooooooo } # tile 52 (char 52) { oooMMMoo ooMMMMoo oMMoMMoo MMooMMoo MMMMMMMo ooooMMoo ooooMMoo oooooooo } # tile 53 (char 53) { MMMMMMMo MMoooooo MMMMMMoo oooooMMo oooooMMo MMoooMMo oMMMMMoo oooooooo } # tile 54 (char 54) { ooMMMooo oMMooooo MMoooooo MMMMMMoo MMoooMMo MMoooMMo oMMMMMoo oooooooo } # tile 55 (char 55) { MMMMMMMo oooooMMo ooooMMoo oooMMooo ooMMoooo oMMooooo oMMooooo oooooooo } # tile 56 (char 56) { oMMMMMoo MMoooMMo MMoooMMo oMMMMMoo MMoooMMo MMoooMMo oMMMMMoo oooooooo } # tile 57 (char 57) { oMMMMMoo MMoooMMo MMoooMMo oMMMMMMo oooooMMo ooooMMoo ooMMMooo oooooooo } # tile 58 (char 58) { oooooooo oooMMooo oooMMooo oooooooo oooooooo oooMMooo oooMMooo oooooooo } # tile 59 (char 59) { oooooooo oooMMooo oooMMooo oooooooo oooooooo oooMMooo oooMMooo ooMMoooo } # tile 60 (char 60) { ooooMMoo oooMMooo ooMMoooo oMMooooo ooMMoooo oooMMooo ooooMMoo oooooooo } # tile 61 (char 61) { oooooooo oooooooo oMMMMMMo oooooooo oooooooo oMMMMMMo oooooooo oooooooo } # tile 62 (char 62) { ooMMoooo oooMMooo ooooMMoo oooooMMo ooooMMoo oooMMooo ooMMoooo oooooooo } # tile 63 (char 63) { ooMMMMoo oMMooMMo oooooMMo ooooMMoo oooMMooo oooooooo oooMMooo oooooooo } # tile 64 (char 64) { oMMMMMoo MMoooMMo MMoMMMMo MMoMMMMo MMoMMMMo MMoooooo oMMMMMoo oooooooo } # tile 65 (char 65) { oooMoooo ooMMMooo oMMoMMoo MMoooMMo MMMMMMMo MMoooMMo MMoooMMo oooooooo } # tile 66 (char 66) { MMMMMMoo MMoooMMo MMoooMMo MMMMMMoo MMoooMMo MMoooMMo MMMMMMoo oooooooo } # tile 67 (char 67) { oMMMMMoo MMoooMMo MMoooooo MMoooooo MMoooooo MMoooMMo oMMMMMoo oooooooo } # tile 68 (char 68) { MMMMMMoo MMoooMMo MMoooMMo MMoooMMo MMoooMMo MMoooMMo MMMMMMoo oooooooo } # tile 69 (char 69) { MMMMMMMo MMoooooo MMoooooo MMMMMooo MMoooooo MMoooooo MMMMMMMo oooooooo } # tile 70 (char 70) { MMMMMMMo MMoooooo MMoooooo MMMMMooo MMoooooo MMoooooo MMoooooo oooooooo } # tile 71 (char 71) { oMMMMMoo MMoooMMo MMoooooo MMooMMMo MMoooMMo MMoooMMo oMMMMMoo oooooooo } # tile 72 (char 72) { MMoooMMo MMoooMMo MMoooMMo MMMMMMMo MMoooMMo MMoooMMo MMoooMMo oooooooo } # tile 73 (char 73) { oMMMMMMo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oMMMMMMo oooooooo } # tile 74 (char 74) { oooooMMo oooooMMo oooooMMo oooooMMo MMoooMMo MMoooMMo oMMMMMoo oooooooo } # tile 75 (char 75) { MMoooMMo MMooMMoo MMoMMooo MMMMoooo MMoMMooo MMooMMoo MMoooMMo oooooooo } # tile 76 (char 76) { MMoooooo MMoooooo MMoooooo MMoooooo MMoooooo MMoooooo MMMMMMMo oooooooo } # tile 77 (char 77) { MoooooMo MMoooMMo MMMoMMMo MMMMMMMo MMoMoMMo MMoooMMo MMoooMMo oooooooo } # tile 78 (char 78) { MMoooMMo MMMooMMo MMMMoMMo MMoMMMMo MMooMMMo MMoooMMo MMoooMMo oooooooo } # tile 79 (char 79) { oMMMMMoo MMoooMMo MMoooMMo MMoooMMo MMoooMMo MMoooMMo oMMMMMoo oooooooo } # tile 80 (char 80) { MMMMMMoo MMoooMMo MMoooMMo MMMMMMoo MMoooooo MMoooooo MMoooooo oooooooo } # tile 81 (char 81) { oMMMMMoo MMoooMMo MMoooMMo MMoooMMo MMMMoMMo MMoMMMMo oMMMMMoo oooooMMo } # tile 82 (char 82) { MMMMMMoo MMoooMMo MMoooMMo MMMMMMoo MMoMMooo MMooMMoo MMoooMMo oooooooo } # tile 83 (char 83) { oMMMMMoo MMoooMMo oMMooooo ooMMMooo ooooMMoo MMoooMMo oMMMMMoo oooooooo } # tile 84 (char 84) { oMMMMMMo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooooooo } # tile 85 (char 85) { MMoooMMo MMoooMMo MMoooMMo MMoooMMo MMoooMMo MMoooMMo oMMMMMoo oooooooo } # tile 86 (char 86) { MMooooMM MMooooMM oMMooMMo oMMooMMo ooMMMMoo ooMMMMoo oooMMooo oooooooo } # tile 87 (char 87) { MMoooMMo MMoooMMo MMoooMMo MMoMoMMo MMMMMMMo MMMoMMMo MMoooMMo oooooooo } # tile 88 (char 88) { MMooooMM oMMooMMo ooMMMMoo oooMMooo ooMMMMoo oMMooMMo MMooooMM oooooooo } # tile 89 (char 89) { MMooooMM MMooooMM oMMooMMo ooMMMMoo oooMMooo oooMMooo oooMMooo oooooooo } # tile 90 (char 90) { MMMMMMMo oooooMMo ooooMMoo oooMMooo ooMMoooo oMMooooo MMMMMMMo oooooooo } # tile 91 (char 91) { ooMMMMoo ooMMoooo ooMMoooo ooMMoooo ooMMoooo ooMMoooo ooMMMMoo oooooooo } # tile 92 (char 92) { MMoooooo oMMooooo ooMMoooo oooMMooo ooooMMoo oooooMMo ooooooMM oooooooo } # tile 93 (char 93) { ooMMMMoo ooooMMoo ooooMMoo ooooMMoo ooooMMoo ooooMMoo ooMMMMoo oooooooo } # tile 94 (char 94) { oooMoooo ooMMMooo oMMoMMoo MMoooMMo oooooooo oooooooo oooooooo oooooooo } # tile 95 (char 95) { oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo MMMMMMMo } # tile 96 (char 96) { oooMMooo oooMMooo ooooMMoo oooooooo oooooooo oooooooo oooooooo oooooooo } # tile 97 (char 97) { oooooooo oooooooo oMMMMMoo oooooMMo oMMMMMMo MMoooMMo oMMMMMMo oooooooo } # tile 98 (char 98) { MMoooooo MMoooooo MMMMMMoo MMoooMMo MMoooMMo MMoooMMo MMMMMMoo oooooooo } # tile 99 (char 99) { oooooooo oooooooo oMMMMMoo MMoooMMo MMoooooo MMoooMMo oMMMMMoo oooooooo } # tile 100 (char 100) { oooooMMo oooooMMo oMMMMMMo MMoooMMo MMoooMMo MMoooMMo oMMMMMMo oooooooo } # tile 101 (char 101) { oooooooo oooooooo oMMMMMoo MMoooMMo MMMMMMMo MMoooooo oMMMMMoo oooooooo } # tile 102 (char 102) { ooMMMMoo oMMooMMo oMMooooo MMMMoooo oMMooooo oMMooooo oMMooooo oooooooo } # tile 103 (char 103) { oooooooo oooooooo oMMMMMMo MMoooMMo MMoooMMo oMMMMMMo oooooMMo oMMMMMoo } # tile 104 (char 104) { MMoooooo MMoooooo MMMMMMoo MMoooMMo MMoooMMo MMoooMMo MMoooMMo oooooooo } # tile 105 (char 105) { oooMMooo oooooooo ooMMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooooooo } # tile 106 (char 106) { oooooMMo oooooooo oooooMMo oooooMMo oooooMMo oooooMMo MMoooMMo oMMMMMoo } # tile 107 (char 107) { MMoooooo MMoooooo MMooMMoo MMoMMooo MMMMoooo MMoMMooo MMooMMoo oooooooo } # tile 108 (char 108) { ooMMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooooooo } # tile 109 (char 109) { oooooooo oooooooo MMMoMMoo MMMMMMMo MMoMoMMo MMoooMMo MMoooMMo oooooooo } # tile 110 (char 110) { oooooooo oooooooo MMMMMMoo MMoooMMo MMoooMMo MMoooMMo MMoooMMo oooooooo } # tile 111 (char 111) { oooooooo oooooooo oMMMMMoo MMoooMMo MMoooMMo MMoooMMo oMMMMMoo oooooooo } # tile 112 (char 112) { oooooooo oooooooo MMMMMMoo MMoooMMo MMoooMMo MMMMMMoo MMoooooo MMoooooo } # tile 113 (char 113) { oooooooo oooooooo oMMMMMMo MMoooMMo MMoooMMo oMMMMMMo oooooMMo oooooMMo } # tile 114 (char 114) { oooooooo oooooooo MMoMMMoo MMMooMMo MMoooooo MMoooooo MMoooooo oooooooo } # tile 115 (char 115) { oooooooo oooooooo oMMMMMMo MMoooooo oMMMMMoo oooooMMo MMMMMMoo oooooooo } # tile 116 (char 116) { ooMMoooo ooMMoooo oMMMMMoo ooMMoooo ooMMoooo ooMMoMMo oooMMMoo oooooooo } # tile 117 (char 117) { oooooooo oooooooo MMoooMMo MMoooMMo MMoooMMo MMoooMMo oMMMMMoo oooooooo } # tile 118 (char 118) { oooooooo oooooooo MMoooMMo MMoooMMo MMoooMMo oMMoMMoo ooMMMooo oooooooo } # tile 119 (char 119) { oooooooo oooooooo MMoooMMo MMoooMMo MMoMoMMo MMMMMMMo oMMoMMoo oooooooo } # tile 120 (char 120) { oooooooo oooooooo MMoooMMo oMMoMMoo ooMMMooo oMMoMMoo MMoooMMo oooooooo } # tile 121 (char 121) { oooooooo oooooooo MMooooMM oMMooMMo ooMMMMoo oooMMooo ooMMoooo oMMooooo } # tile 122 (char 122) { oooooooo oooooooo MMMMMMMo ooooMMoo ooMMMooo oMMooooo MMMMMMMo oooooooo } # tile 123 (char 123) { ooooMMMo oooMMooo oooMMooo oMMMoooo oooMMooo oooMMooo ooooMMMo oooooooo } # tile 124 (char 124) { oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooooooo } # tile 125 (char 125) { oMMMoooo oooMMooo oooMMooo ooooMMMo oooMMooo oooMMooo oMMMoooo oooooooo } # tile 126 (char 126) { oMMMooMo MooMMMoo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo } # tile 127 (char 127) { oooooooo oooMoooo ooMMMooo oMMoMMoo MMoooMMo MMoooMMo MMMMMMMo oooooooo } # tile 128 (char 128) { oMMMMMoo MMoooMMo MMoooooo MMoooooo MMoooMMo oMMMMMoo ooooMMoo oMMMMooo } # tile 129 (char 129) { MMooMMoo oooooooo MMooMMoo MMooMMoo MMooMMoo MMooMMoo oMMMoMMo oooooooo } # tile 130 (char 130) { ooooMMoo oooMMooo oMMMMMoo MMoooMMo MMMMMMMo MMoooooo oMMMMMoo oooooooo } # tile 131 (char 131) { oMMMMMoo MoooooMo oMMMMooo ooooMMoo oMMMMMoo MMooMMoo oMMMoMMo oooooooo } # tile 132 (char 132) { MMoooMMo oooooooo oMMMMooo ooooMMoo oMMMMMoo MMooMMoo oMMMoMMo oooooooo } # tile 133 (char 133) { ooMMoooo oooMMooo oMMMMooo ooooMMoo oMMMMMoo MMooMMoo oMMMoMMo oooooooo } # tile 134 (char 134) { ooMMoooo ooMMoooo oMMMMooo ooooMMoo oMMMMMoo MMooMMoo oMMMoMMo oooooooo } # tile 135 (char 135) { oooooooo oooooooo oMMMMMMo MMoooooo MMoooooo oMMMMMMo ooooMMoo ooMMMooo } # tile 136 (char 136) { oMMMMMoo MoooooMo oMMMMMoo MMoooMMo MMMMMMMo MMoooooo oMMMMMoo oooooooo } # tile 137 (char 137) { MMoooMMo oooooooo oMMMMMoo MMoooMMo MMMMMMMo MMoooooo oMMMMMoo oooooooo } # tile 138 (char 138) { ooMMoooo oooMMooo oMMMMMoo MMoooMMo MMMMMMMo MMoooooo oMMMMMoo oooooooo } # tile 139 (char 139) { oMMooMMo oooooooo ooMMMooo oooMMooo oooMMooo oooMMooo ooMMMMoo oooooooo } # tile 140 (char 140) { oMMMMMoo MoooooMo ooMMMooo oooMMooo oooMMooo oooMMooo ooMMMMoo oooooooo } # tile 141 (char 141) { ooMMoooo oooMMooo oooooooo ooMMMooo oooMMooo oooMMooo ooMMMMoo oooooooo } # tile 142 (char 142) { MMoooMMo ooMMMooo oMMoMMoo MMoooMMo MMMMMMMo MMoooMMo MMoooMMo oooooooo } # tile 143 (char 143) { ooMMMooo oMMoMMoo oMMMMMoo MMoooMMo MMMMMMMo MMoooMMo MMoooMMo oooooooo } # tile 144 (char 144) { oooMMooo ooMMoooo MMMMMMMo MMoooooo MMMMMooo MMoooooo MMMMMMMo oooooooo } # tile 145 (char 145) { oooooooo oooooooo oMMMMMMo oooMMooo oMMMMMMo MMoMMooo oMMMMMMo oooooooo } # tile 146 (char 146) { ooMMMMMo oMMoMMoo MMooMMoo MMMMMMMo MMooMMoo MMooMMoo MMooMMMo oooooooo } # tile 147 (char 147) { oMMMMMoo MoooooMo oMMMMMoo MMoooMMo MMoooMMo MMoooMMo oMMMMMoo oooooooo } # tile 148 (char 148) { MMoooMMo oooooooo oMMMMMoo MMoooMMo MMoooMMo MMoooMMo oMMMMMoo oooooooo } # tile 149 (char 149) { ooMMoooo oooMMooo oMMMMMoo MMoooMMo MMoooMMo MMoooMMo oMMMMMoo oooooooo } # tile 150 (char 150) { oMMMMooo MooooMoo oooooooo MMooMMoo MMooMMoo MMooMMoo oMMMoMMo oooooooo } # tile 151 (char 151) { oMMooooo ooMMoooo MMooMMoo MMooMMoo MMooMMoo MMooMMoo oMMMoMMo oooooooo } # tile 152 (char 152) { MMoooMMo oooooooo MMoooMMo MMoooMMo MMoooMMo oMMMMMMo oooooMMo MMMMMMoo } # tile 153 (char 153) { MMoooMMo ooMMMooo oMMoMMoo MMoooMMo MMoooMMo oMMoMMoo ooMMMooo oooooooo } # tile 154 (char 154) { MMoooMMo oooooooo MMoooMMo MMoooMMo MMoooMMo MMoooMMo oMMMMMoo oooooooo } # tile 155 (char 155) { oooMMooo oooMMooo oMMMMMMo MMoooooo MMoooooo oMMMMMMo oooMMooo oooMMooo } # tile 156 (char 156) { ooMMMooo oMMoMMoo oMMooMoo MMMMoooo oMMooooo oMMooMMo MMMMMMoo oooooooo } # tile 157 (char 157) { oMMooMMo oMMooMMo ooMMMMoo oMMMMMMo oooMMooo oMMMMMMo oooMMooo oooMMooo } # tile 158 (char 158) { MMMMMooo MMooMMoo MMooMMoo MMMMMoMo MMoooMMo MMooMMMM MMoooMMo MMoooMMM } # tile 159 (char 159) { ooooMMMo oooMMoMM oooMMooo ooMMMMoo oooMMooo MMoMMooo oMMMoooo oooooooo } # tile 160 (char 160) { oooMMooo ooMMoooo oMMMMooo ooooMMoo oMMMMMoo MMooMMoo oMMMoMMo oooooooo } # tile 161 (char 161) { ooooMMoo oooMMooo oooooooo ooMMMooo oooMMooo oooMMooo ooMMMMoo oooooooo } # tile 162 (char 162) { ooooMMoo oooMMooo oMMMMMoo MMoooMMo MMoooMMo MMoooMMo oMMMMMoo oooooooo } # tile 163 (char 163) { oooMMooo ooMMoooo MMooMMoo MMooMMoo MMooMMoo MMooMMoo oMMMoMMo oooooooo } # tile 164 (char 164) { oMMMoMMo MMoMMMoo oooooooo MMoMMMoo oMMooMMo oMMooMMo oMMooMMo oooooooo } # tile 165 (char 165) { oMMMoMMo MMoMMMoo oooooooo MMMooMMo MMMMoMMo MMoMMMMo MMooMMMo oooooooo } # tile 166 (char 166) { ooMMMMoo oMMoMMoo oMMoMMoo ooMMMMMo oooooooo oMMMMMMo oooooooo oooooooo } # tile 167 (char 167) { ooMMMooo oMMoMMoo oMMoMMoo ooMMMooo oooooooo oMMMMMoo oooooooo oooooooo } # tile 168 (char 168) { oooMMooo oooooooo oooMMooo oooMMooo ooMMoooo oMMoooMM ooMMMMMo oooooooo } # tile 169 (char 169) { oooooooo oooooooo oooooooo MMMMMMMo MMoooooo MMoooooo oooooooo oooooooo } # tile 170 (char 170) { oooooooo oooooooo oooooooo MMMMMMMo oooooMMo oooooMMo oooooooo oooooooo } # tile 171 (char 171) { oMMoooMM MMMooMMo oMMoMMoo oMMMMMMo ooMMooMM oMMooMMo MMooMMoo ooooMMMM } # tile 172 (char 172) { oMMoooMM MMMooMMo oMMoMMoo oMMMMoMo ooMMoMMo oMMoMoMo MMoMMMMM oooooMMo } # tile 173 (char 173) { oooMMooo oooooooo oooMMooo oooMMooo ooMMMMoo ooMMMMoo oooMMooo oooooooo } # tile 174 (char 174) { oooooooo ooMMooMM oMMooMMo MMooMMoo oMMooMMo ooMMooMM oooooooo oooooooo } # tile 175 (char 175) { oooooooo MMooMMoo oMMooMMo ooMMooMM oMMooMMo MMooMMoo oooooooo oooooooo } # tile 176 (char 176) { ooMoooMo MoooMooo ooMoooMo MoooMooo ooMoooMo MoooMooo ooMoooMo MoooMooo } # tile 177 (char 177) { oMoMoMoM MoMoMoMo oMoMoMoM MoMoMoMo oMoMoMoM MoMoMoMo oMoMoMoM MoMoMoMo } # tile 178 (char 178) { oMMMoMMM MMoMMMoM oMMMoMMM MMoMMMoM oMMMoMMM MMoMMMoM oMMMoMMM MMoMMMoM } # tile 179 (char 179) { oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo } # tile 180 (char 180) { oooMMooo oooMMooo oooMMooo oooMMooo MMMMMooo oooMMooo oooMMooo oooMMooo } # tile 181 (char 181) { oooMMooo oooMMooo MMMMMooo oooMMooo MMMMMooo oooMMooo oooMMooo oooMMooo } # tile 182 (char 182) { ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo MMMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo } # tile 183 (char 183) { oooooooo oooooooo oooooooo oooooooo MMMMMMMo ooMMoMMo ooMMoMMo ooMMoMMo } # tile 184 (char 184) { oooooooo oooooooo MMMMMooo oooMMooo MMMMMooo oooMMooo oooMMooo oooMMooo } # tile 185 (char 185) { ooMMoMMo ooMMoMMo MMMMoMMo oooooMMo MMMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo } # tile 186 (char 186) { ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo } # tile 187 (char 187) { oooooooo oooooooo MMMMMMMo oooooMMo MMMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo } # tile 188 (char 188) { ooMMoMMo ooMMoMMo MMMMoMMo oooooMMo MMMMMMMo oooooooo oooooooo oooooooo } # tile 189 (char 189) { ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo MMMMMMMo oooooooo oooooooo oooooooo } # tile 190 (char 190) { oooMMooo oooMMooo MMMMMooo oooMMooo MMMMMooo oooooooo oooooooo oooooooo } # tile 191 (char 191) { oooooooo oooooooo oooooooo oooooooo MMMMMooo oooMMooo oooMMooo oooMMooo } # tile 192 (char 192) { oooMMooo oooMMooo oooMMooo oooMMooo oooMMMMM oooooooo oooooooo oooooooo } # tile 193 (char 193) { oooMMooo oooMMooo oooMMooo oooMMooo MMMMMMMM oooooooo oooooooo oooooooo } # tile 194 (char 194) { oooooooo oooooooo oooooooo oooooooo MMMMMMMM oooMMooo oooMMooo oooMMooo } # tile 195 (char 195) { oooMMooo oooMMooo oooMMooo oooMMooo oooMMMMM oooMMooo oooMMooo oooMMooo } # tile 196 (char 196) { oooooooo oooooooo oooooooo oooooooo MMMMMMMM oooooooo oooooooo oooooooo } # tile 197 (char 197) { oooMMooo oooMMooo oooMMooo oooMMooo MMMMMMMM oooMMooo oooMMooo oooMMooo } # tile 198 (char 198) { oooMMooo oooMMooo oooMMMMM oooMMooo oooMMMMM oooMMooo oooMMooo oooMMooo } # tile 199 (char 199) { ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMM ooMMoMMo ooMMoMMo ooMMoMMo } # tile 200 (char 200) { ooMMoMMo ooMMoMMo ooMMoMMM ooMMoooo ooMMMMMM oooooooo oooooooo oooooooo } # tile 201 (char 201) { oooooooo oooooooo ooMMMMMM ooMMoooo ooMMoMMM ooMMoMMo ooMMoMMo ooMMoMMo } # tile 202 (char 202) { ooMMoMMo ooMMoMMo MMMMoMMM oooooooo MMMMMMMM oooooooo oooooooo oooooooo } # tile 203 (char 203) { oooooooo oooooooo MMMMMMMM oooooooo MMMMoMMM ooMMoMMo ooMMoMMo ooMMoMMo } # tile 204 (char 204) { ooMMoMMo ooMMoMMo ooMMoMMM ooMMoooo ooMMoMMM ooMMoMMo ooMMoMMo ooMMoMMo } # tile 205 (char 205) { oooooooo oooooooo MMMMMMMM oooooooo MMMMMMMM oooooooo oooooooo oooooooo } # tile 206 (char 206) { ooMMoMMo ooMMoMMo MMMMoMMM oooooooo MMMMoMMM ooMMoMMo ooMMoMMo ooMMoMMo } # tile 207 (char 207) { oooMMooo oooMMooo MMMMMMMM oooooooo MMMMMMMM oooooooo oooooooo oooooooo } # tile 208 (char 208) { ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo MMMMMMMM oooooooo oooooooo oooooooo } # tile 209 (char 209) { oooooooo oooooooo MMMMMMMM oooooooo MMMMMMMM oooMMooo oooMMooo oooMMooo } # tile 210 (char 210) { oooooooo oooooooo oooooooo oooooooo MMMMMMMM ooMMoMMo ooMMoMMo ooMMoMMo } # tile 211 (char 211) { ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo ooMMMMMM oooooooo oooooooo oooooooo } # tile 212 (char 212) { oooMMooo oooMMooo oooMMMMM oooMMooo oooMMMMM oooooooo oooooooo oooooooo } # tile 213 (char 213) { oooooooo oooooooo oooMMMMM oooMMooo oooMMMMM oooMMooo oooMMooo oooMMooo } # tile 214 (char 214) { oooooooo oooooooo oooooooo oooooooo ooMMMMMM ooMMoMMo ooMMoMMo ooMMoMMo } # tile 215 (char 215) { ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo MMMMMMMM ooMMoMMo ooMMoMMo ooMMoMMo } # tile 216 (char 216) { oooMMooo oooMMooo MMMMMMMM oooMMooo MMMMMMMM oooMMooo oooMMooo oooMMooo } # tile 217 (char 217) { oooMMooo oooMMooo oooMMooo oooMMooo MMMMMooo oooooooo oooooooo oooooooo } # tile 218 (char 218) { oooooooo oooooooo oooooooo oooooooo oooMMMMM oooMMooo oooMMooo oooMMooo } # tile 219 (char 219) { MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM } # tile 220 (char 220) { oooooooo oooooooo oooooooo oooooooo MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM } # tile 221 (char 221) { MMMMoooo MMMMoooo MMMMoooo MMMMoooo MMMMoooo MMMMoooo MMMMoooo MMMMoooo } # tile 222 (char 222) { ooooMMMM ooooMMMM ooooMMMM ooooMMMM ooooMMMM ooooMMMM ooooMMMM ooooMMMM } # tile 223 (char 223) { MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM oooooooo oooooooo oooooooo oooooooo } # tile 224 (char 224) { oooooooo oooooooo oMMMoMMo MMoMMMoo MMooMooo MMoMMMoo oMMMoMMo oooooooo } # tile 225 (char 225) { oMMMMooo MMooMMoo MMooMMoo MMoMMooo MMooMMoo MMoooMMo MMooMMoo oooooooo } # tile 226 (char 226) { MMMMMMMo MMoooMMo MMoooooo MMoooooo MMoooooo MMoooooo MMoooooo oooooooo } # tile 227 (char 227) { oooooooo oooooooo MMMMMMMo oMMoMMoo oMMoMMoo oMMoMMoo oMMoMMoo oooooooo } # tile 228 (char 228) { MMMMMMMo MMoooMMo oMMooooo ooMMoooo oMMooooo MMoooMMo MMMMMMMo oooooooo } # tile 229 (char 229) { oooooooo oooooooo oMMMMMMo MMoMMooo MMoMMooo MMoMMooo oMMMoooo oooooooo } # tile 230 (char 230) { oooooooo oooooooo oMMooMMo oMMooMMo oMMooMMo oMMooMMo oMMMMMoo MMoooooo } # tile 231 (char 231) { oooooooo oMMMoMMo MMoMMMoo oooMMooo oooMMooo oooMMooo oooMMooo oooooooo } # tile 232 (char 232) { oMMMMMMo oooMMooo ooMMMMoo oMMooMMo oMMooMMo ooMMMMoo oooMMooo oMMMMMMo } # tile 233 (char 233) { ooMMMooo oMMoMMoo MMoooMMo MMMMMMMo MMoooMMo oMMoMMoo ooMMMooo oooooooo } # tile 234 (char 234) { ooMMMooo oMMoMMoo MMoooMMo MMoooMMo oMMoMMoo oMMoMMoo MMMoMMMo oooooooo } # tile 235 (char 235) { ooooMMMo oooMMooo ooooMMoo ooMMMMMo oMMooMMo oMMooMMo ooMMMMoo oooooooo } # tile 236 (char 236) { oooooooo oooooooo oMMMMMMo MMoMMoMM MMoMMoMM oMMMMMMo oooooooo oooooooo } # tile 237 (char 237) { oooooMMo ooooMMoo oMMMMMMo MMoMMoMM MMoMMoMM oMMMMMMo oMMooooo MMoooooo } # tile 238 (char 238) { oooMMMMo ooMMoooo oMMooooo oMMMMMMo oMMooooo ooMMoooo oooMMMMo oooooooo } # tile 239 (char 239) { oooooooo oMMMMMoo MMoooMMo MMoooMMo MMoooMMo MMoooMMo MMoooMMo oooooooo } # tile 240 (char 240) { oooooooo MMMMMMMo oooooooo MMMMMMMo oooooooo MMMMMMMo oooooooo oooooooo } # tile 241 (char 241) { oooMMooo oooMMooo oMMMMMMo oooMMooo oooMMooo oooooooo oMMMMMMo oooooooo } # tile 242 (char 242) { ooMMoooo oooMMooo ooooMMoo oooMMooo ooMMoooo oooooooo oMMMMMMo oooooooo } # tile 243 (char 243) { ooooMMoo oooMMooo ooMMoooo oooMMooo ooooMMoo oooooooo oMMMMMMo oooooooo } # tile 244 (char 244) { ooooMMMo oooMMoMM oooMMoMM oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo } # tile 245 (char 245) { oooMMooo oooMMooo oooMMooo oooMMooo oooMMooo MMoMMooo MMoMMooo oMMMoooo } # tile 246 (char 246) { oooooooo oooMMooo oooooooo oMMMMMMo oooooooo oooMMooo oooooooo oooooooo } # tile 247 (char 247) { oooooooo oMMMoMMo MMoMMMoo oooooooo oMMMoMMo MMoMMMoo oooooooo oooooooo } # tile 248 (char 248) { ooMMMooo oMMoMMoo oMMoMMoo ooMMMooo oooooooo oooooooo oooooooo oooooooo } # tile 249 (char 249) { oooooooo oooooooo oooooooo oooMMooo oooMMooo oooooooo oooooooo oooooooo } # tile 250 (char 250) { oooooooo oooooooo oooooooo oooMMooo oooooooo oooooooo oooooooo oooooooo } # tile 251 (char 251) { ooooMMMM ooooMMoo ooooMMoo ooooMMoo MMMoMMoo oMMoMMoo ooMMMMoo oooMMMoo } # tile 252 (char 252) { oMMoMMoo ooMMoMMo ooMMoMMo ooMMoMMo ooMMoMMo oooooooo oooooooo oooooooo } # tile 253 (char 253) { oMMMMooo ooooMMoo oooMMooo ooMMoooo oMMMMMoo oooooooo oooooooo oooooooo } # tile 254 (char 254) { oooooooo oooooooo ooMMMMoo ooMMMMoo ooMMMMoo ooMMMMoo oooooooo oooooooo } # tile 255 (char 255) { oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo oooooooo } slashem-0.0.7E7F3/win/gl/gl_image.c0000664000076400007640000004333010545462317014766 0ustar aliali/* Copyright (C) 2002 Andrew Apted */ /* NetHack may be freely redistributed. See license for details. */ /* * SDL/GL window port for NetHack & Slash'EM. * * Image handling, loading and saving of PNG files. This code is in * a separate file to make using other image formats easier. */ #include "hack.h" #include "patchlevel.h" #include "dlb.h" #if defined(GL_GRAPHICS) || defined(SDL_GRAPHICS) #define WINGL_INTERNAL #include "winGL.h" #include unsigned char pet_mark_bits[8] = { 0x00, /* ........ */ 0x6c, /* .MM.MM.. */ 0xfe, /* MMMMMMM. */ 0xfe, /* MMMMMMM. */ 0x7c, /* .MMMMM.. */ 0x38, /* ..MMM... */ 0x10, /* ...M.... */ 0x00 /* ........ */ }; unsigned char ridden_mark_bits[8] = { 0x00, /* ........ */ 0x6c, /* .MM.MM.. */ 0xfe, /* MMMMMMM. */ 0xfe, /* MMMMMMM. */ 0x7c, /* .MMMMM.. */ 0x38, /* ..MMM... */ 0x10, /* ...M.... */ 0x00 /* ........ */ }; unsigned char sdlgl_gamma_table[256]; SDL_Cursor *sdlgl_cursor_main = NULL; SDL_Cursor *sdlgl_cursor_left = NULL; SDL_Cursor *sdlgl_cursor_right = NULL; SDL_Cursor *sdlgl_cursor_up = NULL; SDL_Cursor *sdlgl_cursor_down = NULL; SDL_Cursor *sdlgl_cursor_hand = NULL; SDL_Cursor *sdlgl_cursor_cross = NULL; /* * These tables show which way the monsters face in the 16x16 and * 32x32 tilesets: `L' for left, `R' for right, otherwise no * particular direction. They are loaded from the glface16.lst and * glface32.lst files. */ char tile_16_face_dirs[1000] = { 0, }; char tile_32_face_dirs[1000] = { 0, }; /* ---------------------------------------------------------------- */ static unsigned char cursor_up_bits[16 * 4] = { 0x01, 0x00, 0x01, 0x00, /* .......o........ */ 0x02, 0x80, 0x03, 0x80, /* ......oMo....... */ 0x04, 0x40, 0x07, 0xC0, /* .....oMMMo...... */ 0x08, 0x20, 0x0F, 0xE0, /* ....oMMMMMo..... */ 0x10, 0x10, 0x1F, 0xF0, /* ...oMMMMMMMo.... */ 0x20, 0x08, 0x3F, 0xF8, /* ..oMMMMMMMMMo... */ 0x40, 0x04, 0x7F, 0xFC, /* .oMMMMMMMMMMMo.. */ 0x80, 0x02, 0xFF, 0xFE, /* oMMMMMMMMMMMMMo. */ 0x7C, 0x7C, 0x7F, 0xFC, /* .oooooMMMooooo.. */ 0x04, 0x40, 0x07, 0xC0, /* .....oMMMo...... */ 0x04, 0x40, 0x07, 0xC0, /* .....oMMMo...... */ 0x04, 0x40, 0x07, 0xC0, /* .....oMMMo...... */ 0x04, 0x40, 0x07, 0xC0, /* .....oMMMo...... */ 0x04, 0x40, 0x07, 0xC0, /* .....oMMMo...... */ 0x04, 0x40, 0x07, 0xC0, /* .....oMMMo...... */ 0x02, 0x80, 0x03, 0x80 /* ......oMo....... */ }; static unsigned char cursor_down_bits[16 * 4] = { 0x02, 0x80, 0x03, 0x80, /* ......oMo....... */ 0x04, 0x40, 0x07, 0xC0, /* .....oMMMo...... */ 0x04, 0x40, 0x07, 0xC0, /* .....oMMMo...... */ 0x04, 0x40, 0x07, 0xC0, /* .....oMMMo...... */ 0x04, 0x40, 0x07, 0xC0, /* .....oMMMo...... */ 0x04, 0x40, 0x07, 0xC0, /* .....oMMMo...... */ 0x04, 0x40, 0x07, 0xC0, /* .....oMMMo...... */ 0x7C, 0x7C, 0x7F, 0xFC, /* .oooooMMMooooo.. */ 0x80, 0x02, 0xFF, 0xFE, /* oMMMMMMMMMMMMMo. */ 0x40, 0x04, 0x7F, 0xFC, /* .oMMMMMMMMMMMo.. */ 0x20, 0x08, 0x3F, 0xF8, /* ..oMMMMMMMMMo... */ 0x10, 0x10, 0x1F, 0xF0, /* ...oMMMMMMMo.... */ 0x08, 0x20, 0x0F, 0xE0, /* ....oMMMMMo..... */ 0x04, 0x40, 0x07, 0xC0, /* .....oMMMo...... */ 0x02, 0x80, 0x03, 0x80, /* ......oMo....... */ 0x01, 0x00, 0x01, 0x00 /* .......o........ */ }; static unsigned char cursor_left_bits[16 * 4] = { 0x01, 0x00, 0x01, 0x00, /* .......o........ */ 0x02, 0x80, 0x03, 0x80, /* ......oMo....... */ 0x04, 0x80, 0x07, 0x80, /* .....oMMo....... */ 0x08, 0x80, 0x0F, 0x80, /* ....oMMMo....... */ 0x10, 0x80, 0x1F, 0x80, /* ...oMMMMo....... */ 0x20, 0xFE, 0x3F, 0xFE, /* ..oMMMMMooooooo. */ 0x40, 0x01, 0x7F, 0xFF, /* .oMMMMMMMMMMMMMo */ 0x80, 0x00, 0xFF, 0xFF, /* oMMMMMMMMMMMMMMM */ 0x40, 0x01, 0x7F, 0xFF, /* .oMMMMMMMMMMMMMo */ 0x20, 0xFE, 0x3F, 0xFE, /* ..oMMMMMooooooo. */ 0x10, 0x80, 0x1F, 0x80, /* ...oMMMMo....... */ 0x08, 0x80, 0x0F, 0x80, /* ....oMMMo....... */ 0x04, 0x80, 0x07, 0x80, /* .....oMMo....... */ 0x02, 0x80, 0x03, 0x80, /* ......oMo....... */ 0x01, 0x00, 0x01, 0x00, /* .......o........ */ 0x00, 0x00, 0x00, 0x00 /* ................ */ }; static unsigned char cursor_right_bits[16 * 4] = { 0x00, 0x80, 0x00, 0x80, /* ........o....... */ 0x01, 0x40, 0x01, 0xC0, /* .......oMo...... */ 0x01, 0x20, 0x01, 0xE0, /* .......oMMo..... */ 0x01, 0x10, 0x01, 0xF0, /* .......oMMMo.... */ 0x01, 0x08, 0x01, 0xF8, /* .......oMMMMo... */ 0x7F, 0x04, 0x7F, 0xFC, /* .oooooooMMMMMo.. */ 0x80, 0x02, 0xFF, 0xFE, /* oMMMMMMMMMMMMMo. */ 0x00, 0x01, 0xFF, 0xFF, /* MMMMMMMMMMMMMMMo */ 0x80, 0x02, 0xFF, 0xFE, /* oMMMMMMMMMMMMMo. */ 0x7F, 0x04, 0x7F, 0xFC, /* .oooooooMMMMMo.. */ 0x01, 0x08, 0x01, 0xF8, /* .......oMMMMo... */ 0x01, 0x10, 0x01, 0xF0, /* .......oMMMo.... */ 0x01, 0x20, 0x01, 0xE0, /* .......oMMo..... */ 0x01, 0x40, 0x01, 0xC0, /* .......oMo...... */ 0x00, 0x80, 0x00, 0x80, /* ........o....... */ 0x00, 0x00, 0x00, 0x00 /* ................ */ }; static unsigned char cursor_hand_bits[16 * 4] = { 0x06, 0x00, 0x06, 0x00, /* .....oo......... */ 0x09, 0x00, 0x0F, 0x00, /* ....oMMo........ */ 0x09, 0x00, 0x0F, 0x00, /* ....oMMo........ */ 0x09, 0x00, 0x0F, 0x00, /* ....oMMo........ */ 0x09, 0xC0, 0x0F, 0xC0, /* ....oMMooo...... */ 0x09, 0x38, 0x0F, 0xF8, /* ....oMMoMMooo... */ 0x69, 0x26, 0x6F, 0xFE, /* .oo.oMMoMMoMMoo. */ 0x98, 0x05, 0xFF, 0xFF, /* oMMooMMMMMMMMoMo */ 0x88, 0x01, 0xFF, 0xFF, /* oMMMoMMMMMMMMMMo */ 0x48, 0x01, 0x7F, 0xFF, /* .oMMoMMMMMMMMMMo */ 0x20, 0x02, 0x3F, 0xFE, /* ..oMMMMMMMMMMMo. */ 0x20, 0x02, 0x3F, 0xFE, /* ..oMMMMMMMMMMMo. */ 0x10, 0x04, 0x1F, 0xFC, /* ...oMMMMMMMMMo.. */ 0x08, 0x04, 0x0F, 0xFC, /* ....oMMMMMMMMo.. */ 0x04, 0x08, 0x07, 0xF8, /* .....oMMMMMMo... */ 0x04, 0x08, 0x07, 0xF8 /* .....oMMMMMMo... */ }; static unsigned char cursor_cross_bits[16 * 4] = { 0x00, 0x00, 0x00, 0x00, /* ................ */ 0x08, 0x10, 0x08, 0x10, /* ....o......o.... */ 0x14, 0x28, 0x1C, 0x38, /* ...oMo....oMo... */ 0x22, 0x44, 0x3E, 0x7C, /* ..oMMMo..oMMMo.. */ 0x11, 0x88, 0x1F, 0xF8, /* ...oMMMooMMMo... */ 0x08, 0x10, 0x0F, 0xF0, /* ....oMMMMMMo.... */ 0x04, 0x20, 0x07, 0xE0, /* .....oMMMMo..... */ 0x04, 0x20, 0x07, 0xE0, /* .....oMMMMo..... */ 0x08, 0x10, 0x0F, 0xF0, /* ....oMMMMMMo.... */ 0x11, 0x88, 0x1F, 0xF8, /* ...oMMMooMMMo... */ 0x22, 0x44, 0x3E, 0x7C, /* ..oMMMo..oMMMo.. */ 0x14, 0x28, 0x1C, 0x38, /* ...oMo....oMo... */ 0x08, 0x10, 0x08, 0x10, /* ....o......o.... */ 0x00, 0x00, 0x00, 0x00, /* ................ */ 0x00, 0x00, 0x00, 0x00, /* ................ */ 0x00, 0x00, 0x00, 0x00 /* ................ */ }; /* ---------------------------------------------------------------- */ int sdlgl_quantize_tile_size(int size) { return (size < 24) ? 16 : 32; } int sdlgl_mon_tile_face_dir(tileidx_t fg) { char dir = '.'; if (fg >= SIZE(tile_16_face_dirs)) return 0; if (iflags.wc_tile_height == 16) dir = tile_16_face_dirs[fg]; else if (iflags.wc_tile_height == 32) dir = tile_32_face_dirs[fg]; else return 0; if (dir == 'L') return -1; else if (dir == 'R') return +1; return 0; } void sdlgl_load_face_dirs(const char *filename, char *face_dirs) { FILE *fp; int mon = 0; int ch; #ifdef FILE_AREAS fp = fopen_datafile_area(FILE_AREA_SHARE, filename, RDTMODE, FALSE); #else fp = fopen_datafile(filename, RDTMODE, FALSE); #endif if (!fp) { sdlgl_error("Failed to open file: %s\n", filename); return; /* NOT REACHED */ } while ((ch = fgetc(fp)) != EOF) { ch = highc(ch); if (isspace(ch) || !isprint(ch)) continue; if (ch != '.' && ch != 'L' && ch != 'R') { sdlgl_warning("Ignoring bad character `%c' in face file: %s\n", ch, filename); continue; } face_dirs[mon++] = ch; if (mon >= SIZE(tile_16_face_dirs)) { sdlgl_warning("Too many monsters in face file: %s\n", filename); break; } } fclose(fp); } /* ---------------------------------------------------------------- */ /* Gamma tables. * top[] = 512 * (x ** 0.5 - x) * bottom[] = 512 * (x - x ** 2) * where x = input_value / 255. */ static unsigned char gamma_table_top[256] = { 0,30,41,49,56,61,66,70,74,78,81,84,86,89,91,94, 96,98,99,101,103,104,106,107,108,110,111,112,113,114,115,116, 117,117,118,119,120,120,121,121,122,122,123,123,124,124,125,125, 125,126,126,126,126,127,127,127,127,127,127,127,127,127,127,127, 127,127,127,127,127,127,127,127,127,127,127,127,126,126,126,126, 126,125,125,125,125,124,124,124,124,123,123,123,122,122,122,121, 121,121,120,120,119,119,119,118,118,117,117,116,116,115,115,114, 114,113,113,112,112,111,111,110,110,109,109,108,108,107,106,106, 105,105,104,103,103,102,102,101,100,100,99,98,98,97,96,96, 95,94,94,93,92,92,91,90,90,89,88,87,87,86,85,85, 84,83,82,82,81,80,79,79,78,77,76,75,75,74,73,72, 71,71,70,69,68,67,67,66,65,64,63,62,62,61,60,59, 58,57,57,56,55,54,53,52,51,50,50,49,48,47,46,45, 44,43,42,42,41,40,39,38,37,36,35,34,33,32,31,31, 30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15, 14,13,12,11,10,9,8,7,6,5,4,3,3,2,1,0 }; static unsigned char gamma_table_bottom[256] = { 0,1,3,5,7,9,11,13,15,17,19,21,22,24,26,28, 30,31,33,35,37,38,40,42,43,45,46,48,50,51,53,54, 56,57,59,60,62,63,64,66,67,69,70,71,73,74,75,76, 78,79,80,81,83,84,85,86,87,88,89,91,92,93,94,95, 96,97,98,99,100,101,101,102,103,104,105,106,107,107,108,109, 110,110,111,112,113,113,114,115,115,116,116,117,118,118,119,119, 120,120,121,121,122,122,122,123,123,124,124,124,125,125,125,125, 126,126,126,126,126,127,127,127,127,127,127,127,127,127,127,127, 127,127,127,127,127,127,127,127,127,127,127,126,126,126,126,126, 125,125,125,125,124,124,124,123,123,122,122,122,121,121,120,120, 119,119,118,118,117,116,116,115,115,114,113,113,112,111,110,110, 109,108,107,107,106,105,104,103,102,101,101,100,99,98,97,96, 95,94,93,92,91,89,88,87,86,85,84,83,81,80,79,78, 76,75,74,73,71,70,69,67,66,64,63,62,60,59,57,56, 54,53,51,50,48,46,45,43,42,40,38,37,35,33,31,30, 28,26,24,22,21,19,17,15,13,11,9,7,5,3,1,0 }; void sdlgl_generate_gamma_table(void) { int i, result = 0; for (i=0; i < 256; i++) { switch (sdlgl_gamma) { case -5: result = i - gamma_table_bottom[i] / 2; break; case -4: result = i - gamma_table_bottom[i] / 3; break; case -3: result = i - gamma_table_bottom[i] / 4; break; case -2: result = i - gamma_table_bottom[i] / 6; break; case -1: result = i - gamma_table_bottom[i] / 8; break; case 0: result = i; break; case +1: result = i + gamma_table_top[i] / 8; break; case +2: result = i + gamma_table_top[i] / 6; break; case +3: result = i + gamma_table_top[i] / 4; break; case +4: result = i + gamma_table_top[i] / 3; break; case +5: result = i + gamma_table_top[i] / 2; break; default: impossible("Bad sdlgl_gamma value %d", sdlgl_gamma); break; } sdlgl_gamma_table[i] = min(255, max(0, result)); } } /* ---------------------------------------------------------------- */ static SDL_Cursor *make_sdl_cursor(unsigned char *combi) { unsigned char data[256]; unsigned char mask[256]; int y; /* separate the data & mask from the combined image */ for (y = 0; y < 16; y++) { data[y * 2 + 0] = combi[y * 4 + 0]; data[y * 2 + 1] = combi[y * 4 + 1]; mask[y * 2 + 0] = combi[y * 4 + 2]; mask[y * 2 + 1] = combi[y * 4 + 3]; } return SDL_CreateCursor(data, mask, 16, 16, 8, 8); } void sdlgl_init_mouse_cursors(void) { sdlgl_cursor_main = SDL_GetCursor(); sdlgl_cursor_up = make_sdl_cursor(cursor_up_bits); sdlgl_cursor_down = make_sdl_cursor(cursor_down_bits); sdlgl_cursor_left = make_sdl_cursor(cursor_left_bits); sdlgl_cursor_right = make_sdl_cursor(cursor_right_bits); sdlgl_cursor_hand = make_sdl_cursor(cursor_hand_bits); sdlgl_cursor_cross = make_sdl_cursor(cursor_cross_bits); } void sdlgl_free_mouse_cursors(void) { SDL_SetCursor(sdlgl_cursor_main); /* the main cursor is made by SDL itself */ sdlgl_cursor_main = NULL; if (sdlgl_cursor_up) { SDL_FreeCursor(sdlgl_cursor_up); sdlgl_cursor_up = NULL; } if (sdlgl_cursor_down) { SDL_FreeCursor(sdlgl_cursor_down); sdlgl_cursor_down = NULL; } if (sdlgl_cursor_left) { SDL_FreeCursor(sdlgl_cursor_left); sdlgl_cursor_left = NULL; } if (sdlgl_cursor_right) { SDL_FreeCursor(sdlgl_cursor_right); sdlgl_cursor_right = NULL; } if (sdlgl_cursor_hand) { SDL_FreeCursor(sdlgl_cursor_hand); sdlgl_cursor_hand = NULL; } if (sdlgl_cursor_cross) { SDL_FreeCursor(sdlgl_cursor_cross); sdlgl_cursor_cross = NULL; } } /* ---------------------------------------------------------------- */ #define CHECK_PNG_BYTES 4 unsigned char *sdlgl_load_png_file(const char *filename, int *image_w, int *image_h) { /* -AJA- all these volatiles here may seem strange. They are needed * because the ANSI C standard (which GCC adheres to) says that when * setjmp/longjmp is being used, only volatile local variables are * guaranteed to keep their state if longjmp() gets called. */ FILE * volatile fp = NULL; unsigned char * volatile image_dat = NULL; png_bytep * volatile row_pointers = NULL; /* we take the address of these two, so we shouldn't need the * volatile. (GCC complains about discarding qualifiers if the * volatile is there). */ png_structp /*volatile*/ png_ptr = NULL; png_infop /*volatile*/ info_ptr = NULL; char sig_buf[CHECK_PNG_BYTES]; png_uint_32 width, height; int bit_depth, color_type, interlace_type; int row, stride; /* open the prospective PNG file */ #ifdef FILE_AREAS fp = fopen_datafile_area(FILE_AREA_SHARE, filename, RDBMODE, FALSE); #else fp = fopen_datafile(filename, RDBMODE, FALSE); #endif if (!fp) { sdlgl_warning("Failed to open file: %s\n", filename); return NULL; } /* read in some of the signature bytes */ if (fread(sig_buf, 1, CHECK_PNG_BYTES, fp) != CHECK_PNG_BYTES) { sdlgl_warning("Failed to read from file: %s\n", filename); goto failed; } /* compare the first CHECK_PNG_BYTES bytes of the signature */ if (png_sig_cmp(sig_buf, (png_size_t)0, CHECK_PNG_BYTES) != 0) { sdlgl_warning("File is not a PNG file: %s\n", filename); goto failed; } /* pass NULLs for the error functions -- thus use the setjump stuff */ png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if (png_ptr == NULL) { sdlgl_warning("Problem within LibPNG (no memory ?)\n"); goto failed; } /* allocate/initialize the memory for image information */ info_ptr = png_create_info_struct(png_ptr); if (info_ptr == NULL) { sdlgl_warning("Out of memory with LibPNG\n"); goto failed; } /* set error handling since we are using the setjmp/longjmp method * (this is the normal method of doing things with libpng). */ if (setjmp(png_ptr->jmpbuf)) { sdlgl_warning("Problem within LibPNG (unknown)\n"); goto failed; } /* set up the input control since we're using standard C streams */ png_init_io(png_ptr, fp); png_set_sig_bytes(png_ptr, CHECK_PNG_BYTES); /* the call to png_read_info() gives us all of the information from the * PNG file before the first IDAT (image data chunk) */ png_read_info(png_ptr, info_ptr); png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type, &interlace_type, NULL, NULL); *image_w = (int)width; *image_h = (int)height; /* tell libpng to strip 16 bit/color down to 8 bits/color */ png_set_strip_16(png_ptr); /* expand paletted colors into true RGB triplets */ if (color_type == PNG_COLOR_TYPE_PALETTE || color_type == PNG_COLOR_TYPE_GRAY || png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) { png_set_expand(png_ptr); } /* set alpha position and filler value */ png_set_filler(png_ptr, 0xFF, PNG_FILLER_AFTER); /* let all the above calls take effect */ png_read_update_info(png_ptr, info_ptr); /* allocate the memory for the image */ stride = png_get_rowbytes(png_ptr, info_ptr); image_dat = (unsigned char *) alloc(height * stride); row_pointers = (png_bytep *) alloc(height * sizeof(png_bytep)); for (row=0; row < height; row++) { row_pointers[row] = image_dat + row * stride; } /* now read in the image. Yeah baby ! */ png_read_image(png_ptr, row_pointers); png_read_end(png_ptr, info_ptr); /* free stuff & close the file */ png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL); free(row_pointers); fclose(fp); return image_dat; /* -AJA- Normally I don't like gotos. In this situation where there * are lots of points of possible failure and a growing set of * things to be undone, it makes for nicer code. */ failed: if (image_dat) free(image_dat); if (png_ptr) { /* assume NULLs not allowed (png docs don't say, bad bad) */ if (info_ptr) png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL); else png_destroy_read_struct(&png_ptr, (png_infopp)NULL, (png_infopp)NULL); } if (row_pointers) free(row_pointers); if (fp) fclose(fp); return NULL; } /* ---------------------------------------------------------------- */ int sdlgl_save_ppm_file(const char *filename, const unsigned char *pixels, int image_w, int image_h) { FILE *fp; int x, y; fp = fopen(filename, "wb"); if (! fp) return 0; fprintf(fp, "P6\n%d %d\n255\n", image_w, image_h); /* the pixels are bottom up */ for (y = image_h-1; y >= 0; y--) { const unsigned char *p = pixels + y * image_w * 3; for (x = 0; x < image_w; x++, p += 3) { fputc(p[0], fp); fputc(p[1], fp); fputc(p[2], fp); } } fclose(fp); return 1; } #endif /* GL_GRAPHICS */ /*gl_image.c*/ slashem-0.0.7E7F3/win/gl/gl_main.c0000664000076400007640000005142010545462317014627 0ustar aliali/* Copyright (C) 2002 Andrew Apted */ /* NetHack may be freely redistributed. See license for details. */ /* * SDL/GL window port for NetHack & Slash'EM. * * Main code for SDL/GL port. Contains the interface table * (sdlgl_procs) to the main nethack code. Initialises and shuts down * SDL. Sets up initial GL parameters. Handles events. Also * contains some miscellaneous utility routines. */ #include "hack.h" #include "dlb.h" #include "patchlevel.h" #if defined(GL_GRAPHICS) || defined(SDL_GRAPHICS) #define WINGL_INTERNAL #include "winGL.h" #include #include #include #include #include #include int sdlgl_initialized = 0; /* main sdl surface */ SDL_Surface *sdlgl_surf; /* whether running in software or hardware mode */ int sdlgl_software = 0; /* rendering procedures (either GL or software) */ struct rendering_procs sdlgl_rend_procs; char sdlgl_video_driver[128] = { 0, }; static struct timeval base_time; static char err_msg_buf[2048]; static int cur_key_sym = SDLK_LAST; #ifdef GL_GRAPHICS static void Sdlgl_init_nhwindows_gl (int *argcp, char **argv); #endif #ifdef SDL_GRAPHICS static void Sdlgl_init_nhwindows_sdl(int *argcp, char **argv); #endif #define SDLGL_WC_FLAGS \ ( WC_COLOR | WC_HILITE_PET \ | WC_TILE_HEIGHT \ | WC_FONTSIZ_MAP | WC_FONTSIZ_MENU | WC_FONTSIZ_MESSAGE \ | WC_FONTSIZ_STATUS | WC_FONTSIZ_TEXT \ | WC_ALIGN_MESSAGE | WC_ALIGN_STATUS \ | WC_SCROLL_MARGIN | WC_SPLASH_SCREEN \ | WC_VARY_MSGCOUNT) /* Interface definition, Hardware version */ #ifdef GL_GRAPHICS struct window_procs sdlgl_hardw_procs = { "GL", SDLGL_WC_FLAGS, 0L, Sdlgl_init_nhwindows_gl, Sdlgl_player_selection, Sdlgl_askname, Sdlgl_get_nh_event, Sdlgl_exit_nhwindows, Sdlgl_suspend_nhwindows, Sdlgl_resume_nhwindows, Sdlgl_create_nhwindow, Sdlgl_clear_nhwindow, Sdlgl_display_nhwindow, Sdlgl_destroy_nhwindow, Sdlgl_curs, Sdlgl_putstr, Sdlgl_display_file, Sdlgl_start_menu, Sdlgl_add_menu, Sdlgl_end_menu, Sdlgl_select_menu, Sdlgl_message_menu, Sdlgl_update_inventory, Sdlgl_mark_synch, Sdlgl_wait_synch, #ifdef CLIPPING Sdlgl_cliparound, #endif #ifdef POSITIONBAR Sdlgl_update_positionbar, #endif Sdlgl_print_glyph, Sdlgl_raw_print, Sdlgl_raw_print_bold, Sdlgl_nhgetch, Sdlgl_nh_poskey, Sdlgl_nhbell, Sdlgl_doprev_message, Sdlgl_yn_function, Sdlgl_getlin, Sdlgl_get_ext_cmd, Sdlgl_number_pad, Sdlgl_delay_output, #ifdef CHANGE_COLOR donull, donull, #endif Sdlgl_start_screen, Sdlgl_end_screen, Sdlgl_outrip, Sdlgl_preference_update }; #endif /* Interface definition, Software version. Only difference is the name * field and the init function. */ #ifdef SDL_GRAPHICS struct window_procs sdlgl_softw_procs = { "SDL", SDLGL_WC_FLAGS, 0L, Sdlgl_init_nhwindows_sdl, Sdlgl_player_selection, Sdlgl_askname, Sdlgl_get_nh_event, Sdlgl_exit_nhwindows, Sdlgl_suspend_nhwindows, Sdlgl_resume_nhwindows, Sdlgl_create_nhwindow, Sdlgl_clear_nhwindow, Sdlgl_display_nhwindow, Sdlgl_destroy_nhwindow, Sdlgl_curs, Sdlgl_putstr, Sdlgl_display_file, Sdlgl_start_menu, Sdlgl_add_menu, Sdlgl_end_menu, Sdlgl_select_menu, Sdlgl_message_menu, Sdlgl_update_inventory, Sdlgl_mark_synch, Sdlgl_wait_synch, #ifdef CLIPPING Sdlgl_cliparound, #endif #ifdef POSITIONBAR Sdlgl_update_positionbar, #endif Sdlgl_print_glyph, Sdlgl_raw_print, Sdlgl_raw_print_bold, Sdlgl_nhgetch, Sdlgl_nh_poskey, Sdlgl_nhbell, Sdlgl_doprev_message, Sdlgl_yn_function, Sdlgl_getlin, Sdlgl_get_ext_cmd, Sdlgl_number_pad, Sdlgl_delay_output, #ifdef CHANGE_COLOR donull, donull, #endif Sdlgl_start_screen, Sdlgl_end_screen, Sdlgl_outrip, Sdlgl_preference_update }; #endif /* Display a warning/error. These should have a trailing \n (unlike * the raw_print routines, see below). */ void sdlgl_warning(const char *str, ...) { va_list argptr; err_msg_buf[sizeof(err_msg_buf) - 1] = 0; va_start(argptr, str); vsprintf(err_msg_buf, str, argptr); va_end(argptr); /* overflow ? */ assert(err_msg_buf[sizeof(err_msg_buf) - 1] == 0); fprintf(stderr, "-- " SDLGL_PROGRAM ": %s", err_msg_buf); } void sdlgl_error(const char *str, ...) { if (str[0]) { va_list argptr; err_msg_buf[sizeof(err_msg_buf) - 1] = 0; va_start(argptr, str); vsprintf(err_msg_buf, str, argptr); va_end(argptr); /* overflow ? */ assert(err_msg_buf[sizeof(err_msg_buf) - 1] == 0); fprintf(stderr, "** " SDLGL_PROGRAM ": %s", err_msg_buf); } clearlocks(); Sdlgl_exit_nhwindows(""); terminate(EXIT_SUCCESS); /* NOT REACHED */ } void sdlgl_hangup(const char *str, ...) { if (str[0]) { va_list argptr; err_msg_buf[sizeof(err_msg_buf) - 1] = 0; va_start(argptr, str); vsprintf(err_msg_buf, str, argptr); va_end(argptr); /* overflow ? */ assert(err_msg_buf[sizeof(err_msg_buf) - 1] == 0); fprintf(stderr, "!! " SDLGL_PROGRAM ": %s", err_msg_buf); } hangup(1); /* NOT REACHED */ clearlocks(); Sdlgl_exit_nhwindows(""); terminate(EXIT_SUCCESS); /* NOT REACHED -- AGAIN! */ } void Sdlgl_nhbell(void) { /* does nothing */ } void Sdlgl_number_pad(int state) { /* does nothing */ } /* time utilities. sdlgl_get_time() returns milliseconds since * some epoch (e.g. since the program started). sdlgl_sleep() will * delay for a given number of milliseconds (exact amount not * guaranteed -- may be longer due to process switches, etc). */ static void sdlgl_init_time(void) { gettimeofday(&base_time, NULL); } int sdlgl_get_time(void) { int secs, millis; struct timeval tv; gettimeofday(&tv, NULL); secs = tv.tv_sec - base_time.tv_sec; millis = (tv.tv_usec - base_time.tv_usec) / 1000; /* fix for any "time going backwards" kernel bug */ if (secs < 0 || (secs == 0 && millis < 0)) return 0; return secs * 1000 + millis; } void sdlgl_sleep(int millis) { if (millis > 0) usleep(millis * 1000); } void Sdlgl_delay_output(void) { /* delay 50 ms */ sdlgl_sleep(50); } static int choose_best_video_mode(SDL_Rect **modes) { int i; int best = -1; int best_dist = 999999999; for (i=0; modes[i]; i++) { int w = modes[i]->w; int h = modes[i]->h; int dist, dw, dh; if (w < MIN_SDLGL_WIDTH || h < MIN_SDLGL_HEIGHT) continue; if (w > MAX_SDLGL_WIDTH || h > MAX_SDLGL_HEIGHT) continue; dw = abs(w - DEF_SDLGL_WIDTH); dh = abs(h - DEF_SDLGL_HEIGHT); /* modes smaller than 800x600 are a bit uncomfortable when using * the 32x32 or isometric tilesets. Hence we add this penalty. */ if (iflags.wc_tile_height > 16) { if (w < 800) dw = dw * 3 / 2; if (h < 600) dh = dh * 3 / 2; } dist = dw * dw + dh * dh; if (dist < best_dist) { best = i; best_dist = dist; } } return best; } static void detect_video_modes(void) { const SDL_VideoInfo *info; SDL_Rect **modes; int got_depth = 0; int got_width = 0; int got_height = 0; int flags = SDL_FULLSCREEN; if (! sdlgl_software) flags |= SDL_OPENGL | SDL_DOUBLEBUF; if (sdlgl_depth == 8 && ! sdlgl_windowed) flags |= SDL_HWPALETTE; /* get name of video driver */ if (SDL_VideoDriverName(sdlgl_video_driver, sizeof(sdlgl_video_driver)) == NULL) { strcpy(sdlgl_video_driver, "unknown"); } info = SDL_GetVideoInfo(); assert(info && info->vfmt); /* --- Autodetect the video depth --- */ if (sdlgl_depth == 0) { got_depth = info->vfmt->BitsPerPixel; switch (got_depth) { case 8: case 15: case 16: case 24: case 32: sdlgl_warning("Autodetected video depth: %d bits per pixel.\n", got_depth); break; default: sdlgl_warning("Strange autodetected video depth: %d\n", got_depth); got_depth = (got_depth < 12) ? 8 : (got_depth < 23) ? 16 : 32; sdlgl_warning("Trying %d instead...\n", got_depth); break; } assert(got_depth > 0); sdlgl_depth = got_depth; } /* --- Autodetect video mode --- */ if (sdlgl_width == 0) { modes = SDL_ListModes(NULL, flags); if (modes == (SDL_Rect **)0 || modes == (SDL_Rect **)-1) { got_width = DEF_SDLGL_WIDTH; got_height = DEF_SDLGL_HEIGHT; sdlgl_warning("Couldn't autodetect video mode.\n"); sdlgl_warning("Trying %dx%d...\n", got_width, got_height); } else { int count, best; for (count = 0; modes[count]; count++) { /* nothing needed */ } if (count == 1) { got_width = modes[0]->w; got_height = modes[0]->h; sdlgl_warning("Autodetected video mode: %dx%d\n", got_width, got_height); } else { /* there is more than one available. This probably doesn't * happen under X11, but may happen on other video targets. * We need to pick just one. Algorithm: first eliminate modes * that are too big or too small, then pick the one closest to * the default video mode. */ sdlgl_warning("Autodetected %d different video modes.\n", count); best = choose_best_video_mode(modes); assert(best < count); if (best >= 0) { got_width = modes[best]->w; got_height = modes[best]->h; sdlgl_warning("Selected %dx%d...\n", got_width, got_height); } else { got_width = DEF_SDLGL_WIDTH; got_height = DEF_SDLGL_HEIGHT; sdlgl_warning("All modes were either too small or too big !\n"); sdlgl_warning("Trying %dx%d instead...\n", got_width, got_height); } } } assert(got_width > 0 && got_height > 0); sdlgl_width = got_width; sdlgl_height = got_height; if (sdlgl_windowed) { /* make room for titlebar and borders */ sdlgl_width -= 20; sdlgl_height -= 60; } } } static void sdlgl_do_init_nhwindows(int *argcp, char **argv) { Uint32 flags; CO = 80; LI = 25; /* handle arguments */ sdlgl_parse_cmdline_options(argcp, argv); sdlgl_validate_wincap_options(); sdlgl_validate_gl_options(); /* --------- SDL ----------- */ if (SDL_Init(SDL_INIT_VIDEO) < 0) sdlgl_error("Failed to initialise the SDL library.\n"); detect_video_modes(); flags = 0; if (sdlgl_software) { flags |= SDL_SWSURFACE; if (sdlgl_depth == 8 && ! sdlgl_windowed) flags |= SDL_HWPALETTE; } else { flags |= SDL_OPENGL; flags |= SDL_DOUBLEBUF; /* needed ?? */ switch (sdlgl_depth) { case 15: SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5); SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 5); SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5); break; case 16: SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5); SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 6); SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5); break; case 24: case 32: SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8); break; } SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 0); SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 0); } if (! sdlgl_windowed) flags |= SDL_FULLSCREEN; sdlgl_surf = SDL_SetVideoMode(sdlgl_width, sdlgl_height, sdlgl_depth, flags); if (sdlgl_surf == NULL) { SDL_Quit(); sdlgl_warning("Failed to set SDL/GL video mode %dx%d (%d bit, %s)\n", sdlgl_width, sdlgl_height, sdlgl_depth, sdlgl_windowed ? "windowed" : "fullscreen"); sdlgl_error("Please try a different mode or depth (see --help).\n"); } SDL_EnableUNICODE(1); SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); SDL_WM_SetCaption(SDLGL_PROGRAM, SDLGL_ICON); /* move the mouse pointer out of the way */ SDL_WarpMouse(sdlgl_width - 32, sdlgl_height - 32); sdlgl_init_time(); sdlgl_generate_gamma_table(); sdlgl_rend_startup(); sdlgl_tile_startup(); sdlgl_font_startup(); sdlgl_init_mouse_cursors(); /* show the logo & copyright */ if (iflags.wc_splash_screen) { sdlgl_start_logo(); while (! sdlgl_iterate_logo()) continue; } sdlgl_tile_load_rest(); sdlgl_emul_startup(); sdlgl_win_startup(); sdlgl_initialized = 1; } #ifdef GL_GRAPHICS void Sdlgl_init_nhwindows_gl(int *argcp, char **argv) { sdlgl_software = 0; sdlgl_rend_procs = sdlgl_hardw_rend_procs; sdlgl_do_init_nhwindows(argcp, argv); } #endif #ifdef SDL_GRAPHICS void Sdlgl_init_nhwindows_sdl(int *argcp, char **argv) { sdlgl_software = 1; sdlgl_rend_procs = sdlgl_softw_rend_procs; sdlgl_do_init_nhwindows(argcp, argv); } #endif void Sdlgl_exit_nhwindows(const char *str) { if (str && str[0]) Sdlgl_raw_print_bold(str); if (! sdlgl_initialized) return; sdlgl_initialized = 0; sdlgl_free_mouse_cursors(); sdlgl_win_shutdown(); sdlgl_emul_shutdown(); sdlgl_font_shutdown(); sdlgl_tile_shutdown(); sdlgl_rend_shutdown(); SDL_Quit(); } void Sdlgl_suspend_nhwindows(const char *str) { /* does nothing */ } void Sdlgl_resume_nhwindows(void) { /* does nothing */ } void Sdlgl_get_nh_event(void) { /* does nothing */ } void Sdlgl_update_inventory() { /* does nothing */ } void Sdlgl_mark_synch() { /* does nothing */ } void Sdlgl_wait_synch() { /* Unfortunately, this routine may be called before we are * initialized... */ if (! sdlgl_initialized) { sdlgl_sleep(1000); return; } sdlgl_flush(); } /* These raw_print routines don't need a trailing \n. */ void Sdlgl_raw_print(const char *str) { fprintf(stderr, "%s\n", str); } void Sdlgl_raw_print_bold(const char *str) { Sdlgl_raw_print(str); } static int convert_keysym(int sym, int unicode, int mod) { int shift = mod & KMOD_SHIFT; int ctrl = mod & KMOD_CTRL; int alt = mod & KMOD_ALT; (void) ctrl; /* CTRL + letter ? */ if (0x01 <= unicode && unicode <= 0x1F) return unicode; /* is it printable ASCII ? */ if (0x20 <= unicode && unicode <= 0x7E) { /* ALT + letter ? */ if (letter(unicode) && alt) return M(unicode); return unicode; } switch (sym) { /* standard control keys */ case SDLK_BACKSPACE: return '\b'; case SDLK_RETURN: return '\n'; case SDLK_ESCAPE: return '\033'; case SDLK_TAB: return '\t'; /* cursor keys & keypad */ case SDLK_UP: return iflags.num_pad ? '8' : shift ? 'K' : 'k'; case SDLK_DOWN: return iflags.num_pad ? '2' : shift ? 'J' : 'j'; case SDLK_LEFT: return iflags.num_pad ? '4' : shift ? 'H' : 'h'; case SDLK_RIGHT: return iflags.num_pad ? '6' : shift ? 'L' : 'l'; /* -AJA- no special handling for numeric keypad, always return * digits, and let the main code handle any conversion to * movement via the "number_pad" option. */ case SDLK_KP0: return '0'; case SDLK_KP1: return '1'; case SDLK_KP2: return '2'; case SDLK_KP3: return '3'; case SDLK_KP4: return '4'; case SDLK_KP5: return '5'; case SDLK_KP6: return '6'; case SDLK_KP7: return '7'; case SDLK_KP8: return '8'; case SDLK_KP9: return '9'; case SDLK_PERIOD: return '.'; /* stuff we should ignore */ case SDLK_RSHIFT: case SDLK_LSHIFT: case SDLK_RCTRL: case SDLK_LCTRL: case SDLK_RALT: case SDLK_LALT: case SDLK_RMETA: case SDLK_LMETA: case SDLK_LSUPER: case SDLK_RSUPER: case SDLK_MODE: case SDLK_COMPOSE: return 0; default: break; } #if 0 raw_printf("convert_keysym: UNKNOWN SDL KEY %d", sym); #endif /* unknown key */ return 0; } /* main internal key/mouse routine. */ int sdlgl_get_poskey(int flags, int *x, int *y, int *mod) { SDL_Event ev; for (;;) { if (SDL_PollEvent(&ev) == 0) { /* wait for input to come */ sdlgl_sleep(40); continue; } switch (ev.type) { case SDL_KEYDOWN: { int sym = ev.key.keysym.sym; int unicode = ev.key.keysym.unicode; int mod = ev.key.keysym.mod; int repeat = 0; int key; /* check for auto-repeat */ if (cur_key_sym == sym) repeat = 1; else cur_key_sym = sym; if (repeat && sdlgl_key_repeat == 0) break; sdlgl_update_mouse_location(0); /* we eat some keys for our own purposes, like zooming the map * in/out or scrolling through text or menu windows. */ if (sdlgl_internal_key_handler(&ev.key.keysym, repeat)) break; if (repeat && sdlgl_key_repeat == 1 && ! (flags & POSKEY_ALLOW_REPEAT) && ! sdlgl_cursor_visible()) { break; } key = convert_keysym(sym, unicode, mod); if (key == 0) break; if (sdlgl_alt_prev) { /* handle alternate scrollback mode. When ^P is pressed and * the scrollback window is mapped, we simply update it here * (rather than pass the ^P to the main NetHack code). When * some other key is pressed, we remove the scrollback win. */ struct TextWindow *win = 0; if (WIN_MESSAGE != WIN_ERR) win = text_wins[WIN_MESSAGE]; if (key != C('p') && key != C('o') && key != C('n')) { sdlgl_remove_scrollback(); } else if (win && win->scrollback_pos > 0) { sdlgl_adjust_scrollback(win, (key == 16) ? +1 : -1); continue; } } /* -AJA- filter out ^Z -- causes an apparent lock-up when in * fullscreen mode (ugh). */ if (key != C('z')) return key; break; } case SDL_KEYUP: cur_key_sym = SDLK_LAST; sdlgl_update_mouse_location(0); break; case SDL_QUIT: sdlgl_hangup("Received QUIT signal from SDL.\n"); break; case SDL_MOUSEMOTION: sdlgl_internal_motion_handler(&ev.motion); break; case SDL_MOUSEBUTTONDOWN: { int window; if (sdlgl_internal_button_handler(&ev.button)) break; switch (ev.button.button) { case SDL_BUTTON_LEFT: *mod = CLICK_1; break; case SDL_BUTTON_MIDDLE: case SDL_BUTTON_RIGHT: *mod = CLICK_2; break; default: continue; } *x = ev.button.x; *y = ev.button.y; if (sdlgl_top_win != WIN_ERR) window = sdlgl_top_win; else window = sdlgl_map_win; if (! sdlgl_find_click(window, x, y)) continue; /* return the mouse click */ return 0; } case SDL_ACTIVEEVENT: if (ev.active.gain) { sdlgl_update_mouse_location(0); sdlgl_flush(); } else { sdlgl_update_mouse_location(1); } break; #if (SDL_MAJOR_VERSION * 100 + SDL_MINOR_VERSION) >= 102 /* only exists in SDL 1.2 and higher */ case SDL_VIDEOEXPOSE: sdlgl_flush(); break; #endif default: break; } } /* not actually reached */ return -1; } int sdlgl_get_key(int flags) { int x, y, mod; for (;;) { int key = sdlgl_get_poskey(flags, &x, &y, &mod); /* just ignore any mouse events */ if (key) return key; } } int Sdlgl_nhgetch(void) { /* update status bar */ { sdlgl_update_status(1); if (WIN_STATUS != WIN_ERR && text_wins[WIN_STATUS] != NULL) sdlgl_write_status(text_wins[WIN_STATUS]); } /* reset the skipping of [MORE] prompts (a bit paranoid, as * Sdlgl_clear_window() also resets it and that should handle most * cases). */ if (text_wins[WIN_MESSAGE] != NULL) { text_wins[WIN_MESSAGE]->more_escaped = 0; } /* we rely on this flush in many places */ sdlgl_flush(); return sdlgl_get_key(POSKEY_DO_SCROLLBACK); } /* * return a key, or 0, in which case a mouse button was pressed * mouse events should be returned as character postitions in the map * window. */ int Sdlgl_nh_poskey(int *x, int *y, int *mod) { /* update status bar */ { sdlgl_update_status(1); if (WIN_STATUS != WIN_ERR && text_wins[WIN_STATUS] != NULL) sdlgl_write_status(text_wins[WIN_STATUS]); } /* reset the skipping of [MORE] prompts */ if (text_wins[WIN_MESSAGE] != NULL) { text_wins[WIN_MESSAGE]->more_escaped = 0; } /* we rely on this flush in many places */ sdlgl_flush(); return sdlgl_get_poskey(POSKEY_DO_SCROLLBACK, x, y, mod); } #endif /* GL_GRAPHICS */ /*gl_main.c*/ slashem-0.0.7E7F3/win/gl/gl_conf.c0000664000076400007640000003332310545462317014632 0ustar aliali/* Copyright (C) 2002 Andrew Apted */ /* NetHack may be freely redistributed. See license for details. */ /* * SDL/GL window port for NetHack & Slash'EM. * * Handles the new in-game option screens, including support for * saving back options to the config file. */ #include "hack.h" #include "dlb.h" #include "patchlevel.h" #if defined(GL_GRAPHICS) || defined(SDL_GRAPHICS) #if defined(VANILLA_GLHACK) #define WINGL_INTERNAL #include "winGL.h" #include #include #include #define DEPTH_OPT_TITL 41 #define DEPTH_OPT_KEYS 42 #define DEPTH_OPT_MAIN 43 static struct TileWindow *opt_titl; static struct TileWindow *opt_main; static struct TileWindow *opt_keys; /* from src/files.c */ extern const char *NDECL(get_config_write_filename); enum OptLineFlag { /* whether it is an option, otherwise comments (etc) */ OFLG_Option = 0x0001, /* the option is SDL/GL specific (otherwise standard) */ OFLG_GL = 0x0002, /* boolean option. When true, the value string will be either "0" * or "1". */ OFLG_Boolean = 0x0010, /* the option was on same line as the previous one */ OFLG_SameLine = 0x0020, /* the line used `:' instead of `=' after the "OPTIONS" or * "GL_OPTIONS" keyword. */ OFLG_HadColon = 0x0040, /* the option has been written to the config file */ OFLG_Written = 0x0100 }; struct OptionLine { /* link in list */ struct OptionLine *next; int flags; /* name and value. Name can be NULL only for blank (non-option) * lines. Value is NULL for all non-option lines, and for options * that have an empty value. */ char *name; char *value; }; static struct OptionLine *changed_option_list = NULL; static void add_opt(struct OptionLine **list, struct OptionLine *pred, const char *name, const char *value, int flags) { struct OptionLine *line = (struct OptionLine *) alloc(sizeof(struct OptionLine)); memset(line, 0, sizeof(*line)); line->flags = flags; line->name = name ? strdup(name) : NULL; line->value = value ? strdup(value) : NULL; /* find tail node when pred is NULL */ if (! pred) { pred = (*list); while (pred && pred->next) pred = pred->next; } if (pred) { line->next = pred->next; pred->next = line; } else { line->next = (*list); (*list) = line; } } static void free_opts(struct OptionLine **list) { assert(list); while (*list) { struct OptionLine *cur = (*list); (*list) = cur->next; if (cur->name) free(cur->name); if (cur->value) free(cur->value); free(cur); } } static struct OptionLine *find_changed_option(int flags, const char *name) { struct OptionLine *cur; for (cur = changed_option_list; cur; cur = cur->next) { if (! (cur->flags & OFLG_Option)) continue; if ((cur->flags & OFLG_GL) != (flags & OFLG_GL)) continue; /* !!! FIXME: should this be case insensitive ?? */ if (strcmp(cur->name, name) == 0) return cur; /* handle the case where the `name' (from the config file) starts with * "no" -- for booleans this is allowed. */ if (! (cur->flags & OFLG_Boolean)) continue; if (! (name[0] == 'n' && name[1] == 'o' && letter(name[2]))) continue; if (strcmp(cur->name, name + 2) == 0) return cur; } return NULL; } /* ---------------------------------------------------------------- */ static struct OptionLine *config_line_list = NULL; static int config_is_new = 0; #define match_varname(INP,NAM,LEN) match_optname(INP,NAM,LEN,TRUE) void bbb_parse_single_option(char *opts, int flags) { char *par; short is_bool = 0; short negated = 0; /* strip leading and trailing white space */ while (isspace(*opts)) opts++; par = eos(opts); while (--par >= opts && isspace(*par)) *par = 0; if (opts[0] == '!') opts++, negated = 1; /* look for a parameter after `:' char. When absent, we assume the * option was a boolean. Note that the `:' may be present but have * nothing after it -- this means an empty parameter. */ par = strchr(opts, ':'); if (par) *par++ = 0; else is_bool = 1; if (is_bool || negated) { add_opt(&config_line_list, NULL, opts, negated ? "0" : "1", OFLG_Option | OFLG_Boolean | flags); } else { add_opt(&config_line_list, NULL, opts, par, OFLG_Option | flags); } } void bbb_parse_options(char *opts, int flags) { while (opts) { char *par = strchr(opts, ','); if (par) *par++ = 0; bbb_parse_single_option(opts, flags); opts = par; } } static int bbb_parse_config_line(char *buf) { char *bufp, *altp; int flags = 0; if (*buf == '#') { add_opt(&config_line_list, NULL, buf, NULL, 0); return 1; } /* remove trailing whitespace */ bufp = eos(buf); while (--bufp > buf && isspace(*bufp)) { /* nothing here */ } if (bufp <= buf) { /* skip blank lines */ buf[0] = 0; add_opt(&config_line_list, NULL, buf, NULL, 0); return 1; } *(bufp + 1) = 0; /* find the '=' or ':' */ bufp = index(buf, '='); altp = index(buf, ':'); if (!bufp || (altp && altp < bufp)) { bufp = altp; flags |= OFLG_HadColon; } /* bad line ? */ if (!bufp) return 0; /* skip whitespace between '=' and value */ for (bufp++; isspace(*bufp); bufp++) { /* nothing here */ } if (match_varname(buf, "OPTIONS", 4)) { bbb_parse_options(bufp, flags); return 1; } if (match_varname(buf, "GL_OPTIONS", 10)) { bbb_parse_options(bufp, OFLG_GL | flags); return 1; } /* keep other lines intact */ add_opt(&config_line_list, NULL, buf, NULL, 0); return 1; } static int read_config_lines(const char *conf_name) { FILE *fp = fopen(conf_name, "r"); char buf[4 * BUFSZ]; if (! fp) { /* allow it to be missing (new user) */ if (errno == ENOENT) { config_is_new = 1; return 0; } pline("Error trying to read the config file!"); return -1; } while (fgets(buf, sizeof(buf)-1, fp)) { if (! bbb_parse_config_line(buf)) sdlgl_warning("Bad option line: \"%s\"\n", buf); } fclose(fp); /* OK */ return 0; } static int merge_config_lines(void) { static const char *default_header[] = { "#", #ifdef VANILLA_GLHACK "# glHack config file.", #else "# Slash'EM config file.", #endif "#", "", NULL }; struct OptionLine *cur; struct OptionLine *opt; struct OptionLine *last_norm = NULL; struct OptionLine *last_gl = NULL; int i; for (cur = config_line_list; cur; cur = cur->next) { if (! (cur->flags & OFLG_Option)) continue; if (cur->flags & OFLG_GL) last_gl = cur; else last_norm = cur; opt = find_changed_option(cur->flags, cur->name); if (! opt) continue; /* Note that we copy the _name_ as well. We do this because * booleans that were prefixed with "no" in the config file need * to have the "no" removed. */ free(cur->name); free(cur->value); cur->name = strdup(opt->name); cur->value = strdup(opt->value); if (opt->flags & OFLG_Written) sdlgl_warning("The %soption `%s' occurs twice in config file.\n", (opt->flags & OFLG_GL) ? "gl_" : "", opt->name); opt->flags |= OFLG_Written; } /* handle left-over options. If the config file was empty (or is * new), add some comments to the top. */ if (config_line_list == NULL) { for (i=0; default_header[i]; i++) add_opt(&config_line_list, NULL, default_header[i], NULL, 0); } /* do two passes, to keep all the normal and gl options separate. */ for (i = 0; i < 2; i++) { for (opt = changed_option_list; opt; opt = opt->next) { if ((opt->flags & OFLG_GL) != (i ? OFLG_GL : 0)) continue; if (opt->flags & OFLG_Written) continue; add_opt(&config_line_list, i ? last_gl : last_norm, opt->name, opt->value, opt->flags); opt->flags |= OFLG_Written; } } /* OK */ return 0; } static int write_config_lines(const char *conf_name) { struct OptionLine *opt; FILE *fp; int within_line; int prev_flags; fp = fopen(conf_name, "w"); if (! fp) { pline("Error trying to write the config file!"); return -1; } /* Invariant: when `within_line' is true, the file position is * currently within an option line (needing either a "," separator * or a "\n" to start a fresh line). */ within_line = 0; prev_flags = 0; for (opt = config_line_list; opt; opt = opt->next) { if (! (opt->flags & OFLG_Option)) { if (within_line) { fprintf(fp, "\n"); within_line = 0; } fprintf(fp, "%s\n", opt->name ? opt->name : ""); continue; } if (within_line && (prev_flags & OFLG_GL) != (opt->flags & OFLG_GL)) { fprintf(fp, "\n"); within_line = 0; } if (within_line) fprintf(fp, ","); else fprintf(fp, "%sOPTIONS%c", (opt->flags & OFLG_GL) ? "GL_" : "", (opt->flags & OFLG_HadColon) ? ':' : '='); /* handle booleans */ if ((opt->flags & OFLG_Boolean) && opt->value[0] == '0') fprintf(fp, "!"); assert(opt->name); fprintf(fp, opt->name); if (! (opt->flags & OFLG_Boolean)) fprintf(fp, ":%s", opt->value ? opt->value : ""); within_line = 1; prev_flags = opt->flags; } if (within_line) fprintf(fp, "\n"); fclose(fp); /* OK */ return 0; } void sdlgl_update_config_file(const char *conf_name) { config_is_new = 0; if (read_config_lines(conf_name) == 0 && merge_config_lines() == 0 && write_config_lines(conf_name) == 0) { if (config_is_new) pline("Successfully wrote new config file."); else pline("Successfully updated the config file."); } free_opts(&config_line_list); } /* ---------------------------------------------------------------- */ static void create_opt_titl(int what) { const char *str = NULL; int width; switch (what) { case 1: str = "NetHack Options"; break; case 2: str = "SDL/GL Options"; break; case 3: str = "Miscellaneous Info"; break; default: return; } width = strlen(str); opt_titl = sdlgl_new_tilewin(sdlgl_font_text, width + 2, 1, 1,0); sdlgl_store_str(opt_titl, 1, 0, str, 99, WHITE); sdlgl_map_tilewin(opt_titl, sdlgl_width - (width + 2) * opt_titl->scale_w, sdlgl_height - opt_titl->scale_h, (width + 2) * opt_titl->scale_w, opt_titl->scale_h, DEPTH_OPT_TITL); } static void create_opt_keys(void) { static int w = 50; static int h = 4; static const char *key_lines[] = { "Use cursor keys or letters to select an option", "Use Enter/Return to prompt for a new value", "Use `+' and `-' to change booleans and integers", "Use Escape key to exit" }; int i; opt_keys = sdlgl_new_tilewin(sdlgl_font_menu, w, h, 1,0); opt_keys->background = MENU_NONE_COL; /* PREV_BACK_COL */ for (i=0; i < h; i++) sdlgl_store_str(opt_keys, 1, i, key_lines[h-1-i], 99, L_GREY); sdlgl_map_tilewin(opt_keys, sdlgl_width - w * opt_keys->scale_w, 0, w * opt_keys->scale_w, h * opt_keys->scale_h, DEPTH_OPT_KEYS); } static void create_opt_main(void) { int w = 60; int h = 15; opt_main = sdlgl_new_tilewin(sdlgl_font_menu, w, h, 1,0); opt_main->background = TEXT_BACK_COL; sdlgl_map_tilewin(opt_main, sdlgl_width - w * opt_main->scale_w, opt_keys->scr_h + 20, w * opt_main->scale_w, h * opt_main->scale_h, DEPTH_OPT_MAIN); } static void destroy_opt_titl(void) { sdlgl_unmap_tilewin(opt_titl); sdlgl_free_tilewin(opt_titl); opt_titl = NULL; } static void destroy_opt_keys(void) { sdlgl_unmap_tilewin(opt_keys); sdlgl_free_tilewin(opt_keys); opt_keys = NULL; } static void destroy_opt_main(void) { sdlgl_unmap_tilewin(opt_main); sdlgl_free_tilewin(opt_main); opt_main = NULL; } static void test_opt(int what) { create_opt_titl(what); create_opt_keys(); create_opt_main(); sdlgl_set_start_depth(DEPTH_OPT_TITL); sdlgl_flush(); /* ..... */ sdlgl_get_key(0); destroy_opt_titl(); destroy_opt_keys(); destroy_opt_main(); sdlgl_set_start_depth(0); sdlgl_flush(); } static int handle_option_main_menu(void) { static const char *items[] = { /* 1 */ "Nethack options.", /* 2 */ "SDL/GL options.", /* 3 */ "Miscellaneous info.", NULL }; int i, n; menu_item *selected = NULL; anything any; winid tmpwin = create_nhwindow(NHW_MENU); any.a_void = 0; /* zero all bits */ start_menu(tmpwin); for (i=0; items[i]; i++) { any.a_int = i+1; add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, items[i], MENU_UNSELECTED); } end_menu(tmpwin, "Option Main Menu"); n = select_menu(tmpwin, PICK_ONE, &selected); destroy_nhwindow(tmpwin); if (n <= 0) return 0; assert(selected); n = selected[0].item.a_int; free((genericptr_t)selected); return n; } /* called from src/options.c */ int Sdlgl_doset() { int what; const char *conf_name = get_config_write_filename(); what = handle_option_main_menu(); if (what == 0) return 0; switch (what) { case 1: /* !!! NetHack options */ test_opt(1); break; case 2: /* !!! SDL/GL options */ test_opt(2); break; case 3: /* !!! View miscellaneous */ test_opt(3); break; } /* clear_nhwindow(WIN_MESSAGE); */ if (conf_name && changed_option_list) { what = yn("Write changes to config file?"); clear_nhwindow(WIN_MESSAGE); #if 0 /* !!! */ if (what == 'y') sdlgl_update_config_file(conf_name); #endif } free_opts(&changed_option_list); return 0; } #endif /* VANILLA_GLHACK */ #endif /* GL_GRAPHICS */ /*gl_conf.c*/ slashem-0.0.7E7F3/win/gl/gl_tile.c0000664000076400007640000006741710545462317014655 0ustar aliali/* Copyright (C) 2002 Andrew Apted */ /* NetHack may be freely redistributed. See license for details. */ /* * SDL/GL window port for NetHack & Slash'EM. * * The tile engine. Loads tiles from image files into "TileSets". * Does allocation/freeing and rendering of "TileWindows". */ #include "hack.h" #include "patchlevel.h" #if defined(GL_GRAPHICS) || defined(SDL_GRAPHICS) #define WINGL_INTERNAL #include "winGL.h" extern const char *killed_by_prefix[]; struct TileSet *sdlgl_tiles = NULL; static struct TileWindow *mapped_tilewins[MAXWIN]; static int mapped_num = 0; static int start_depth = 0; /* fading support. amount is 0 for none */ static float fade_amount = 0; /* logo support */ static struct TileSet *logo_set = NULL; static int logo_w, logo_h; static struct TileWindow *logo_win = NULL; static struct TileWindow *logo_copyright = NULL; static enum { LOGST_NOT_BEGUN, LOGST_SHOW, LOGST_FADE_OUT, LOGST_DONE } logo_state = LOGST_NOT_BEGUN; static int logo_progress, logo_target, logo_epoch; static struct TileSet *rip_set = NULL; static int rip_w, rip_h; static struct TileWindow *rip_win = NULL; static struct TileWindow *rip_name = NULL; static struct TileWindow *rip_info = NULL; void sdlgl_tile_startup(void) { /* nothing to do */ } void sdlgl_tile_shutdown(void) { if (sdlgl_tiles) { sdlgl_free_tileset(sdlgl_tiles); sdlgl_tiles = NULL; } if (rip_set) { sdlgl_free_tileset(rip_set); rip_set = NULL; } if (logo_set) { sdlgl_free_tileset(logo_set); logo_set = NULL; } sdlgl_free_extra_shapes(); } /* ---------------------------------------------------------------- */ void sdlgl_add_extrashape(struct TileWindow *win, enum ShapeType type, short x, short y, int par1, int par2) { struct ExtraShape *shape; if (win->extra_num >= win->extra_max) return; shape = win->extra_shapes + win->extra_num; win->extra_num++; shape->type = type; shape->x = x; shape->y = y; shape->par1 = par1; shape->par2 = par2; } void sdlgl_remove_extrashapes(struct TileWindow *win, short x, short y) { int i, j; for (i=j=0; i < win->extra_num; i++) { struct ExtraShape *shape = win->extra_shapes + i; assert(shape->type != SHAPE_None); if (shape->x == x && shape->y == y) continue; if (i != j) memmove(win->extra_shapes + j, shape, sizeof(struct ExtraShape)); j++; } win->extra_num = j; assert(win->extra_num >= 0); } /* ---------------------------------------------------------------- */ static void do_load_tileset(void) { /* map tiles are loaded while logo is displayed (unless the splash * screen has been disabled), and RIP image is loaded after logo is * removed and freed. */ if (iflags.wc_tile_height == 16) sdlgl_tiles = sdlgl_load_tileset("gltile16.png", 16,16, 0,0, NULL,NULL); else if (iflags.wc_tile_height == 64) sdlgl_tiles = sdlgl_load_tileset("gltile64.png", 48,64, 0,0, NULL,NULL); else sdlgl_tiles = sdlgl_load_tileset("gltile32.png", 32,32, 0,0, NULL,NULL); assert(sdlgl_tiles); } void sdlgl_start_logo(void) { const char *pos; const char *copyright_str = COPYRIGHT_BANNER_A "\n" COPYRIGHT_BANNER_B "\n" COPYRIGHT_BANNER_C; int x, y; int w1, h1, w2, h2; logo_set = sdlgl_load_tileset("gllogo.png", 16,16, 0,0, &logo_w, &logo_h); assert(logo_set); /* fade color remains same over life of logo */ fade_amount = 0; assert(logo_state == LOGST_NOT_BEGUN); logo_state = LOGST_SHOW; logo_progress = 0; logo_target = 2000; logo_epoch = sdlgl_get_time(); /* build logo window. -AJA- Using tileset/tilewindow is not * strictly necessary, it would be easy enough to have a single * image and draw it directly. The advantage is supporting logos * larger than 256x256 (a common texture limitation of 3D cards), * and slightly simpler code overall. */ logo_win = sdlgl_new_tilewin(logo_set, logo_w, logo_h, 0,0); for (y=0; y < logo_h; y++) for (x=0; x < logo_w; x++) { /* 1-to-1 mapping */ logo_win->tiles[(logo_h-1 - y) * logo_w + x].fg = y * logo_w + x; } /* build copyright info window */ logo_copyright = sdlgl_new_tilewin(sdlgl_font_message, 60, 10, 1,0); x = 0; y = logo_copyright->total_h - 1; for (pos=copyright_str; *pos; pos++) { if (*pos == '\n') { x = 0; y--; if (y < 0) break; continue; } if (x >= logo_copyright->total_w) continue; logo_copyright->tiles[y * logo_copyright->total_w + x].fg = CHAR_2_TILE(*pos); x++; } /* map windows onto screen */ w1 = logo_win->total_w * logo_win->set->tile_w; h1 = logo_win->total_h * logo_win->set->tile_h; sdlgl_map_tilewin(logo_win, 10, sdlgl_height - h1 - 12, w1, h1, 1); w2 = logo_copyright->total_w * logo_copyright->set->tile_w; h2 = logo_copyright->total_h * logo_copyright->set->tile_h; sdlgl_map_tilewin(logo_copyright, 20, sdlgl_height - h1 - 40 - h2, w2, h2, 2); sdlgl_start_fading(sdlgl_width, logo_copyright->scr_y); sdlgl_mark_dirty(0, 0, sdlgl_width, sdlgl_height, 0); sdlgl_flush(); /* load in the tileset now, whilst the logo is fully up. They are * fairly large, and take some time to load. */ do_load_tileset(); } /* returns 1 when finished */ int sdlgl_iterate_logo(void) { int last_progress; assert (LOGST_SHOW <= logo_state && logo_state <= LOGST_FADE_OUT); assert(logo_set); assert(logo_win); assert(logo_copyright); /* compute fading amount */ if (logo_state == LOGST_FADE_OUT) { assert(logo_target > 0); assert(0 <= logo_progress && logo_progress <= logo_target); fade_amount = logo_progress / (float)logo_target; } /* draw it and wait */ sdlgl_mark_dirty(0, logo_copyright->scr_y, sdlgl_width, sdlgl_height - logo_copyright->scr_y, 0); sdlgl_flush(); last_progress = logo_progress; logo_progress = (sdlgl_get_time() - logo_epoch); assert(logo_progress >= 0); /* when fading out, limit the jump to a bit over 1/3 */ if (logo_state == LOGST_FADE_OUT && (logo_progress - last_progress) > 350) { logo_progress = last_progress + 350; } if (logo_progress < logo_target) return 0; /* current phase is over -- choose new one */ logo_progress = 0; if (logo_state == LOGST_SHOW) { logo_state = LOGST_FADE_OUT; logo_target = 1000; logo_epoch = sdlgl_get_time(); return 0; } /* all done. Clean up the mess */ logo_state = LOGST_DONE; fade_amount = 0; sdlgl_unmap_tilewin(logo_win); sdlgl_free_tilewin(logo_win); logo_win = NULL; sdlgl_unmap_tilewin(logo_copyright); sdlgl_free_tilewin(logo_copyright); logo_copyright = NULL; sdlgl_free_tileset(logo_set); logo_set = NULL; sdlgl_finish_fading(); sdlgl_flush(); return 1; } void sdlgl_tile_load_rest(void) { if (! sdlgl_tiles) { do_load_tileset(); } rip_set = sdlgl_load_tileset("glrip.png", 30,30, 0,1, &rip_w, &rip_h); assert(rip_set); sdlgl_create_extra_graphics(); /* FIXME: create facing files for Slash'EM. */ #ifdef VANILLA_GLHACK sdlgl_load_face_dirs("glface16.lst", tile_16_face_dirs); sdlgl_load_face_dirs("glface32.lst", tile_32_face_dirs); #endif } /* ---------------------------------------------------------------- */ #define STONE_MID_X (155 + 155/2) #define STONE_NAME_Y (92 + 92/2) #define STONE_NAME_W (80 + 80/2) #define STONE_NAME_H (40 + 40/2) #define STONE_TEXT_Y (48 + 48/2) #define STONE_INFO_LINES 5 #define STONE_MAX_NAME 11 #define STONE_MAX_INFO 16 static void add_rip_info(const char *str, int len, int y) { int shift_x; len = min(STONE_MAX_INFO, len); shift_x = (STONE_MAX_INFO - len) / 2; if (len == 0) return; assert(len > 0); assert(shift_x >= 0); assert(shift_x + len <= STONE_MAX_INFO); sdlgl_store_str(rip_info, shift_x, y, str, len, BLACK); } static void add_rip_killer(const char *str, int y) { struct TempLine { char s[STONE_MAX_INFO + 1 /* NUL */]; } bufs[STONE_INFO_LINES]; /* NB: top down */ int len = strlen(str); int i, line; if (len == 0) return; /* FUDGE IT */ for (line=0; line < STONE_INFO_LINES; line++) { /* determine how much of the string to use for this line (possibly * all of it, if the whole thing fits). */ len = strlen(str); if (len == 0) break; if (len > STONE_MAX_INFO) { for (len=STONE_MAX_INFO; len > STONE_MAX_INFO/2; len--) if (str[len] == ' ') break; if (str[len] != ' ') len = STONE_MAX_INFO; } memcpy(bufs[line].s, str, len); bufs[line].s[len] = 0; str += len; while (*str == ' ') str++; } assert(line > 0 && line <= STONE_INFO_LINES); if ('a' <= bufs[0].s[0] && bufs[0].s[0] <= 'z') bufs[0].s[0] += 'A' - 'a'; /* center the lines vertically */ y += (STONE_INFO_LINES - line + 1) / 2; for (i=0; i < line; i++) add_rip_info(bufs[i].s, strlen(bufs[i].s), y + line - 1 - i); } /* returns bottom y */ int sdlgl_display_RIP(int how) { int x, y; int w, h; int base_y; char name_buf[BUFSZ]; char info_buf[BUFSZ]; assert(! rip_win); assert(rip_set); /* create tombstone window */ rip_win = sdlgl_new_tilewin(rip_set, rip_w, rip_h, 0,0); for (y=0; y < rip_h; y++) for (x=0; x < rip_w; x++) { /* 1-to-1 mapping */ rip_win->tiles[(rip_h-1 - y) * rip_w + x].fg = y * rip_w + x; } w = rip_win->total_w * rip_win->scale_w; h = rip_win->total_h * rip_win->scale_h; base_y = sdlgl_height - h - 10; sdlgl_map_tilewin(rip_win, (sdlgl_width - w) / 2, base_y, w, h, 30); /* now create name & role windows */ strcpy(name_buf, plname); name_buf[STONE_MAX_NAME] = 0; if ('a' <= name_buf[0] && name_buf[0] <= 'z') name_buf[0] += 'A' - 'a'; rip_name = sdlgl_new_tilewin(sdlgl_font_message, strlen(name_buf), 1, 1,0); rip_info = sdlgl_new_tilewin(sdlgl_font_8, STONE_MAX_INFO, 2 + STONE_INFO_LINES, 1,0); rip_name->see_through = 1; rip_info->see_through = 1; /* scale name to fit nicely on tombstone */ if (! sdlgl_software) { rip_name->scale_w = STONE_NAME_W / rip_name->total_w; rip_name->scale_h = STONE_NAME_H / rip_name->total_h; if (rip_name->scale_w > sdlgl_font_message->tile_w * 4 / 2) rip_name->scale_w = sdlgl_font_message->tile_w * 4 / 2; if (rip_name->scale_h > sdlgl_font_message->tile_h * 4 / 2) rip_name->scale_h = sdlgl_font_message->tile_h * 4 / 2; if (rip_name->scale_w > rip_name->scale_h * 2) rip_name->scale_w = rip_name->scale_h * 2; else if (rip_name->scale_h > rip_name->scale_w * 4) rip_name->scale_h = rip_name->scale_w * 4; rip_name->scale_full_w = rip_name->scale_w; rip_name->scale_full_h = rip_name->scale_h; } sdlgl_store_str(rip_name, 0, 0, name_buf, rip_name->total_w, BLACK); /* Put $ on stone */ Sprintf(info_buf, "%ld Au", u.ugold); add_rip_info(info_buf, strlen(info_buf), 1 + STONE_INFO_LINES); /* Put death type on stone */ switch (killer_format) { case KILLED_BY_AN: Strcpy(info_buf, killed_by_prefix[how]); Strcat(info_buf, an(killer)); break; case KILLED_BY: Strcpy(info_buf, killed_by_prefix[how]); Strcat(info_buf, killer); break; case NO_KILLER_PREFIX: Strcpy(info_buf, killer); break; default: Strcpy(info_buf, "Killed by a bad switch"); break; } add_rip_killer(info_buf, 1); /* Put year on stone */ Sprintf(info_buf, "%4d", getyear()); add_rip_info(info_buf, strlen(info_buf), 0); /* map these bits of text onto the screen, baby */ w = rip_name->total_w * rip_name->scale_w; h = rip_name->total_h * rip_name->scale_h; sdlgl_map_tilewin(rip_name, rip_win->scr_x + STONE_MID_X - w/2, rip_win->scr_y + STONE_NAME_Y + STONE_NAME_H/2 - h/2, w, h, 32); w = rip_info->total_w * rip_info->scale_w; h = rip_info->total_h * rip_info->scale_h; sdlgl_map_tilewin(rip_info, rip_win->scr_x + STONE_MID_X - w/2, rip_win->scr_y + STONE_TEXT_Y, w, h, 31); return base_y; } void sdlgl_dismiss_RIP(void) { assert(rip_win); assert(rip_name); assert(rip_info); sdlgl_unmap_tilewin(rip_win); sdlgl_free_tilewin(rip_win); rip_win = NULL; sdlgl_unmap_tilewin(rip_name); sdlgl_free_tilewin(rip_name); rip_name = NULL; sdlgl_unmap_tilewin(rip_info); sdlgl_free_tilewin(rip_info); rip_info = NULL; } /* ---------------------------------------------------------------- */ struct TileWindow *sdlgl_new_tilewin(struct TileSet *set, int total_w, int total_h, int is_text, int is_map) { int total = total_w * total_h; struct TileWindow *win; assert(total_w > 0 && total_h > 0); win = (struct TileWindow *) alloc(sizeof(struct TileWindow)); memset(win, 0, sizeof(struct TileWindow)); win->set = set; win->total_w = total_w; win->total_h = total_h; win->is_text = is_text; win->is_map = is_map; win->see_through = 0; win->mapped_idx = -1; /* set defaults */ win->scale_full_w = set->tile_w; win->scale_full_h = set->tile_h; win->scale_w = set->tile_w - set->lap_w; win->scale_h = set->tile_h - set->lap_h; win->scale_skew = set->lap_skew; win->pan_x = win->pan_y = 0; win->background = RGB_MAKE(0, 0, 0); win->curs_x = win->curs_y = -1; win->curs_w = 1; win->curs_block = 0; win->curs_color = OUTLINE_COL; win->has_border = 0; /* setup tile arrays */ win->tiles = (struct TilePair *) alloc(total * sizeof(struct TilePair)); sdlgl_blank_area(win, 0, 0, total_w, total_h); /* setup extra_shape array */ win->extra_max = is_map ? 256 : 10; win->extra_num = 0; win->extra_shapes = (struct ExtraShape *) alloc(win->extra_max * sizeof(struct ExtraShape)); return win; } void sdlgl_free_tilewin(struct TileWindow *win) { if (win->scr_depth > 0) sdlgl_unmap_tilewin(win); if (win->tiles) { free(win->tiles); win->tiles = NULL; } if (win->extra_shapes) { free(win->extra_shapes); win->extra_shapes = NULL; } free(win); } void sdlgl_set_start_depth(int depth) { start_depth = depth; } void sdlgl_change_tileset(struct TileWindow *win, struct TileSet *set, int is_text) { int i; /* handle text <-> nontext changes */ if (is_text && !win->is_text) { for (i=0; i < (win->total_w * win->total_h); i++) win->tiles[i].u.col = L_GREY; } win->set = set; win->is_text = is_text; /* scale, pan & pad values are updated elsewhere (namely in * sdlgl_zoom_map), which includes changing the tile values for the * new tile set. */ sdlgl_mark_dirty(win->scr_x, win->scr_y, win->scr_w, win->scr_h, win->scr_depth); } static int tilewin_compare(const void *p1, const void *p2) { const struct TileWindow *A = *((const struct TileWindow **) p1); const struct TileWindow *B = *((const struct TileWindow **) p2); return (A->scr_depth - B->scr_depth); } void sdlgl_map_tilewin(struct TileWindow *win, int x, int y, int w, int h, int depth) { int i; assert(w > 0 && h > 0); assert(depth > 0); assert(win->scr_depth == 0); assert(mapped_num < MAXWIN); win->scr_x = x; win->scr_y = y; win->scr_w = w; win->scr_h = h; win->scr_depth = depth; mapped_tilewins[mapped_num++] = win; if (mapped_num > 1) qsort(mapped_tilewins, mapped_num, sizeof(void *), tilewin_compare); /* set private index values */ for (i=0; i < mapped_num; i++) mapped_tilewins[i]->mapped_idx = i; sdlgl_mark_dirty(win->scr_x, win->scr_y, win->scr_w, win->scr_h, win->scr_depth); } void sdlgl_unmap_tilewin(struct TileWindow *win) { int i; assert(win->scr_depth > 0); assert(win->mapped_idx >= 0); sdlgl_mark_dirty(win->scr_x, win->scr_y, win->scr_w, win->scr_h, 0); win->scr_depth = 0; win->mapped_idx = -1; for (i=0; i < mapped_num; i++) { if (mapped_tilewins[i] == win) { mapped_tilewins[i] = NULL; break; } } /* it better be there in the list ! */ assert(i != mapped_num); mapped_num--; /* if there's a gap, close it by shifting stuff down */ for (; i < mapped_num; i++) mapped_tilewins[i] = mapped_tilewins[i+1]; /* this isn't strictly necessary -- however if we were using garbage * collection, then it would be (prevent spurious references). */ mapped_tilewins[mapped_num] = NULL; /* update private index values */ for (i=0; i < mapped_num; i++) mapped_tilewins[i]->mapped_idx = i; } /* ---------------------------------------------------------------- */ static GH_INLINE void mark_dirty_tiles(struct TileWindow *win, int x, int y, int w, int h) { int x2, y2; x = win->scr_x - win->pan_x + x * win->scale_w + y * win->scale_skew; y = win->scr_y - win->pan_y + y * win->scale_h; x2 = x + w * win->scale_full_w; y2 = y + h * win->scale_full_h; /* clip to window coords */ x = max(x, win->scr_x); y = max(y, win->scr_y); x2 = min(x2, win->scr_x + win->scr_w); y2 = min(y2, win->scr_y + win->scr_h); if (x2 <= x || y2 <= y) return; sdlgl_mark_dirty(x, y, x2 - x, y2 - y, win->scr_depth); } void sdlgl_store_char(struct TileWindow *win, int x, int y, char ch, rgbcol_t col) { int offset = y * win->total_w + x; assert(0 <= x && x < win->total_w); assert(0 <= y && y < win->total_h); win->tiles[offset].fg = CHAR_2_TILE(ch); win->tiles[offset].mg = TILE_EMPTY; win->tiles[offset].u.col = col; win->tiles[offset].flags = 0; mark_dirty_tiles(win, x, y, 1, 1); } /* * returns the number of characters stored. */ int sdlgl_store_str(struct TileWindow *win, int x, int y, const char *str, int maxlen, rgbcol_t col) { int offset = y * win->total_w + x; int width; assert(0 <= x && x < win->total_w); assert(0 <= y && y < win->total_h); /* NOTE: assumes string has been clipped to window bounds */ for (; *str && maxlen > 0; str++, maxlen--, offset++) { win->tiles[offset].fg = CHAR_2_TILE(*str); win->tiles[offset].mg = TILE_EMPTY; win->tiles[offset].u.col = col; win->tiles[offset].flags = 0; } width = offset - (y * win->total_w + x); mark_dirty_tiles(win, x, y, width, 1); return width; } static GH_INLINE int is_tile_solid(struct TileSet *set, tileidx_t idx) { if (! set->has_alpha) return 1; if (idx == TILE_EMPTY) return 0; return set->has_alpha[idx] ? 0 : 1; } void sdlgl_store_tile(struct TileWindow *win, int x, int y, tileidx_t fg, tileidx_t mg, tileidx_t bg, tileflags_t flags) { int offset = y * win->total_w + x; /* Optimisation: don't draw anything underneath tiles that are * completely solid. */ if (is_tile_solid(win->set, fg)) mg = bg = TILE_EMPTY; else if (is_tile_solid(win->set, mg)) bg = TILE_EMPTY; win->tiles[offset].fg = fg; win->tiles[offset].mg = mg; win->tiles[offset].u.bg = bg; win->tiles[offset].flags = flags; mark_dirty_tiles(win, x, y, 1, 1); } void sdlgl_blank_area(struct TileWindow *win, int x, int y, int w, int h) { assert(w > 0 && h > 0); assert(0 <= x && x+w <= win->total_w); assert(0 <= y && y+h <= win->total_h); mark_dirty_tiles(win, x, y, w, h); for (; h > 0; h--, y++) { int offset = y * win->total_w + x; int len; if (win->is_text) { for (len=w; len > 0; len--, offset++) { win->tiles[offset].fg = TILE_EMPTY; win->tiles[offset].mg = TILE_EMPTY; win->tiles[offset].u.col = L_GREY; win->tiles[offset].flags = 0; } } else { for (len=w; len > 0; len--, offset++) { win->tiles[offset].fg = TILE_EMPTY; win->tiles[offset].mg = TILE_EMPTY; win->tiles[offset].u.bg = TILE_EMPTY; win->tiles[offset].flags = 0; } } } } void sdlgl_copy_area(struct TileWindow *win, int x, int y, int w, int h, int x2, int y2) { int dx = x - x2; int dy = y - y2; assert(w > 0 && h > 0); assert(0 <= x && x+w <= win->total_w); assert(0 <= y && y+h <= win->total_h); assert(0 <= x2 && x2+w <= win->total_w); assert(0 <= y2 && y2+h <= win->total_h); mark_dirty_tiles(win, x2, y2, w, h); /* diagonal moves not supported (yet). */ assert(dx == 0 || dy == 0); if (dx == 0 && y2 < y) /* downwards */ { for (; h > 0; h--, y++) { struct TilePair *src = win->tiles + (y * win->total_w + x); struct TilePair *dst = win->tiles + (y2 * win->total_w + x2); memmove(dst, src, sizeof(struct TilePair) * w); } } else if (dx == 0 && y2 > y) /* upwards */ { y += h - 1; y2 += h - 1; for (; h > 0; h--, y--, y2--) { struct TilePair *src = win->tiles + (y * win->total_w + x); struct TilePair *dst = win->tiles + (y2 * win->total_w + x2); memmove(dst, src, sizeof(struct TilePair) * w); } } else if (dy == 0) /* left or right */ { for (; h > 0; h--, y++) { struct TilePair *src = win->tiles + (y * win->total_w + x); struct TilePair *dst = win->tiles + (y2 * win->total_w + x2); memmove(dst, src, sizeof(struct TilePair) * w); } } } /* transfer tiles between two _different_ tile windows. */ void sdlgl_transfer_area(struct TileWindow *swin, int sx, int sy, int w, int h, struct TileWindow *dwin, int dx, int dy) { assert(w > 0 && h > 0); assert(0 <= sx && sx+w <= swin->total_w); assert(0 <= sy && sy+h <= swin->total_h); assert(0 <= dx && dx+w <= dwin->total_w); assert(0 <= dy && dy+h <= dwin->total_h); mark_dirty_tiles(dwin, dx, dy, w, h); for (; h > 0; h--, sy++, dy++) { struct TilePair *src = swin->tiles + (sy * swin->total_w + sx); struct TilePair *dst = dwin->tiles + (dy * dwin->total_w + dx); memcpy(dst, src, sizeof(struct TilePair) * w); } } /* transfer a line of tiles between a tile window and a buffer. If * `retrieve' is 1, the buffer is being filled, otherwise the buffer * is being transferred to the tile window. */ void sdlgl_transfer_line(struct TileWindow *win, int x, int y, int w, struct TilePair *buffer, int retrieve) { struct TilePair *win_pos; assert(w > 0); assert(0 <= x && x+w <= win->total_w); assert(0 <= y && y < win->total_h); win_pos = win->tiles + (y * win->total_w) + x; if (retrieve) memcpy(buffer, win_pos, sizeof(struct TilePair) * w); else memcpy(win_pos, buffer, sizeof(struct TilePair) * w); if (! retrieve) { mark_dirty_tiles(win, x, y, w, 1); } } void sdlgl_set_scale(struct TileWindow *win, int h) { int th = win->set->tile_h; int lw = win->set->lap_w * h / th; int lh = win->set->lap_h * h / th; win->scale_full_w = win->set->tile_w * h / th; win->scale_full_h = h; win->scale_w = win->scale_full_w - lw; win->scale_h = win->scale_full_h - lh; win->scale_skew = win->set->lap_skew * h / th; assert(win->scale_w > 0); assert(win->scale_h > 0); sdlgl_mark_dirty(win->scr_x, win->scr_y, win->scr_w, win->scr_h, win->scr_depth); } void sdlgl_set_cursor(struct TileWindow *win, int x, int y, int w) { if (win->curs_x >= 0) mark_dirty_tiles(win, win->curs_x, win->curs_y, win->curs_w, 1); win->curs_x = x; win->curs_y = y; win->curs_w = w; if (win->curs_x >= 0) mark_dirty_tiles(win, win->curs_x, win->curs_y, win->curs_w, 1); } /* ---------------------------------------------------------------- */ /* * test if an on-screen tile is completely obscured by a window * sitting above it. `start_idx' is the index of the first window to * test (usually win->mapped_idx+1). */ int sdlgl_test_tile_visible(int start_idx, int x, int y, int w, int h) { int x2 = x + w - 1; int y2 = y + h - 1; int scr_x2, scr_y2; assert(start_idx >= 0); for (; start_idx < mapped_num; start_idx++) { struct TileWindow *win = mapped_tilewins[start_idx]; assert(win); if (win->scr_depth < start_depth) continue; if (win->see_through) continue; scr_x2 = win->scr_x + win->scr_w - 1; scr_y2 = win->scr_y + win->scr_h - 1; if (win->scr_x <= x && x2 <= scr_x2 && win->scr_y <= y && y2 <= scr_y2) return 0; } /* yes is visible (maybe only partially) */ return 1; } static void draw_tilewindow(struct TileWindow *win) { int x, y, n; int sx, sy, sw, sh, sfw, sfh; int top, bottom, left, right; tilecol_t tilecol = 0; struct TilePair *cur; /* draw background. Note: TILE_EMPTY guarantees that the background * may show through, even on non-text windows. */ if (! win->see_through) sdlgl_draw_background(win->scr_x, win->scr_y, win->scr_w, win->scr_h, win->background, win->mapped_idx + 1, win->scr_depth); /* use scissor test to clip tiles to the window. This is for tiles * that cross the window boundary -- we already skip tiles that lie * completely outside of the window. */ sdlgl_enable_clipper(win->scr_x, win->scr_y, win->scr_w, win->scr_h); if (win->has_border) sdlgl_draw_border(win, BORDER_COL); /* block cursors are drawn under (text) tiles, outline cursors are * drawn over (map) tiles. */ if (win->curs_x >= 0 && win->curs_block) sdlgl_draw_cursor(win); sw = win->scale_w; sh = win->scale_h; sfw = win->scale_full_w; sfh = win->scale_full_h; top = win->scr_y + win->scr_h; bottom = win->scr_y; left = win->scr_x; right = win->scr_x + win->scr_w; /* TWO PASSES: first draw all floor tiles, which are guaranteed to * never overlap (in Isometric mode). Secondly, draw the other * stuff on top. Call this "poor man's Z buffering" :). */ if (! win->is_text) { sdlgl_begin_tile_draw(1, 0); for (y=win->total_h - 1; y >= 0; y--) { sy = win->scr_y - win->pan_y + y * sh; if (sy + sfh <= bottom || sy >= top) continue; for (x=0; x < win->total_w; x++) { sx = win->scr_x - win->pan_x + x * sw + y * win->scale_skew; if (sx + sfw <= left || sx >= right) continue; if (!sdlgl_test_tile_visible(win->mapped_idx + 1, sx, sy, sfw, sfh)) continue; cur = win->tiles + (y * win->total_w + x); if (cur->u.bg != TILE_EMPTY) sdlgl_draw_tile(win, sx, sy, sfw, sfh, cur->u.bg, 0, /* flags */ 0, /* layer */ 0); } } sdlgl_finish_tile_draw(); } /* second pass: */ sdlgl_begin_tile_draw(1, (win->set->lap_w || win->set->lap_h)); for (y=win->total_h - 1; y >= 0; y--) { sy = win->scr_y - win->pan_y + y * sh; if (sy + sfh <= bottom || sy >= top) continue; for (x=0; x < win->total_w; x++) { sx = win->scr_x - win->pan_x + x * sw + y * win->scale_skew; if (sx + sfw <= left || sx >= right) continue; if (!sdlgl_test_tile_visible(win->mapped_idx + 1, sx, sy, sfw, sfh)) continue; cur = win->tiles + (y * win->total_w + x); /* for non-text windows, tilecol is unused */ if (win->is_text) tilecol = cur->u.col; if (! win->is_text) { if (cur->mg != TILE_EMPTY) sdlgl_draw_tile(win, sx, sy, sfw, sfh, cur->mg, 0, /* flags */ 0, /* layer */ 1); } if (cur->fg != TILE_EMPTY) sdlgl_draw_tile(win, sx, sy, sfw, sfh, cur->fg, tilecol, cur->flags, /* layer */ 2); } } sdlgl_finish_tile_draw(); /* draw the extra shapes, like the love heart */ for (n=0; n < win->extra_num; n++) sdlgl_draw_extra_shape(win, win->extra_shapes + n); if (win->curs_x >= 0 && ! win->curs_block) sdlgl_draw_cursor(win); sdlgl_disable_clipper(); } void sdlgl_draw_mapped(void) { int i; /* clear any parts of the screen that windows may not cover. We are * using draw_background() to limit the amount to draw. */ sdlgl_draw_background(0, 0, sdlgl_width, sdlgl_height, RGB_MAKE(0, 0, 0), 0 /* start_idx */, 0 /* depth */); for (i=0; i < mapped_num; i++) if (mapped_tilewins[i]->scr_depth >= start_depth) draw_tilewindow(mapped_tilewins[i]); /* handle fading */ if (fade_amount > 0) sdlgl_draw_fading(fade_amount); } void sdlgl_flush(void) { sdlgl_draw_mapped(); sdlgl_blit_frame(); } #endif /* GL_GRAPHICS */ /*gl_tile.c*/ slashem-0.0.7E7F3/win/gl/gl_text.c0000664000076400007640000003212010545462317014663 0ustar aliali/* Copyright (C) 2002 Andrew Apted */ /* NetHack may be freely redistributed. See license for details. */ /* * SDL/GL window port for NetHack & Slash'EM. * * This file handles text (NHW_TEXT) windows. */ #include "hack.h" #include "dlb.h" #include "patchlevel.h" #if defined(GL_GRAPHICS) || defined(SDL_GRAPHICS) #define WINGL_INTERNAL #include "winGL.h" #include #include static struct TextItem *reverse_text_items(struct TextItem *items) { struct TextItem *head = NULL; struct TextItem *next = NULL; for (; items; items = next) { next = items->next; items->next = head; head = items; } return head; } #define MAX_ALGN 44 static int find_aligns(unsigned short *aligns, char *line) { int x; int count = 0; memset(aligns, 0, MAX_ALGN * sizeof(unsigned short)); for (x=1; x < MAX_ALGN && line[x]; x++) { unsigned short num; if (! isspace(line[x-1]) || isspace(line[x])) continue; /* compute the `score': number of spaces before the position *and* * after something printable. */ for (num=1; (x-num) >= 0 && isspace(line[x-num]); num++) { /* nothing in here */ } aligns[x] = (x-num < 0) ? 1 : num; count++; } return count; } static int merge_aligns(unsigned short *main, unsigned short *other) { int x; int count = 0; for (x=0; x < MAX_ALGN; x++) { if (main[x] == 0) continue; if (other[x] == 0) { main[x] = 0; continue; } main[x] = max(main[x], other[x]); count++; } return count; } static int choose_best_align(unsigned short *aligns, int cut_off) { int x; assert(cut_off <= MAX_ALGN); /* best alignment is the rightmost one. */ for (x=cut_off-1; x >= 0; x--) { if (aligns[x] > 0) return x; } return 0; } #if 0 /* DEBUGGING */ static void show_aligns(unsigned short *aligns) { int x; fprintf(stderr, "<"); for (x=0; x < MAX_ALGN; x++) fprintf(stderr, "%c", aligns[x] ? '|' : ' '); fprintf(stderr, ">\n"); } #endif void sdlgl_insert_text_item(struct TextWindow *win, struct TextItem *pred, int align, int attr, const char *str) { struct TextItem *item; item = (struct TextItem *) alloc(sizeof(struct TextItem)); memset(item, 0, sizeof(struct TextItem)); item->attr = attr; item->str = strdup(str ? str : ""); item->align = align; /* link it in */ if (pred) { item->next = pred->next; pred->next = item; } else { item->next = win->lines; win->lines = item; } } static int is_line_blank(const char *str) { if (str) for (; *str; str++) if (! isspace(*str)) return 0; return 1; } static int is_initial_blank(const char *str, int num) { for (; *str && num > 0; str++, num--) if (! isspace(*str)) return 0; return 1; } /* result is index of the first character that should be moved to the * next line. */ static int find_chopoff_point(const char *buf, int cur_align, int avail_w) { int len = strlen(buf); int x, min_x; assert(cur_align < avail_w); assert(len > avail_w); min_x = cur_align + (avail_w - cur_align) * 3 / 5; for (x=avail_w - 1; x > min_x; x--) if (isspace(buf[x-1]) && ! isspace(buf[x])) return x; return avail_w - 1; } static void compute_text_bounds(struct TextWindow *win) { struct TextItem *item; /* compute height */ win->calc_w = win->calc_h = 0; for (item=win->lines; item; item=item->next) { int width = min(CO-1, strlen(item->str)); if (width > win->calc_w) win->calc_w = width; win->calc_h++; } /* one char padding at bottom */ win->calc_h += 1; /* one char padding at left */ win->calc_w += 1; } #define MIN_SCAN_Y 4 static void do_scan_text(struct TextWindow *win, int avail_w) { struct TextItem *item, *succ; int pos_x, y; int cut_off; unsigned short aligns[MAX_ALGN]; unsigned short tmp_al[MAX_ALGN]; /* after the `cut_off' point we don't look for vertically aligned * blocks. */ cut_off = min(40, win->calc_w / 2); if (cut_off < 4) return; item = win->lines; while (item) { if (is_line_blank(item->str)) { item=item->next; continue; } if (! find_aligns(aligns, item->str)) { item=item->next; continue; } for (y=1,succ=item->next; y < MIN_SCAN_Y && succ; y++,succ=succ->next) { if (is_line_blank(succ->str)) break; if (! find_aligns(tmp_al, succ->str)) break; if (! merge_aligns(aligns, tmp_al)) break; } if (y != MIN_SCAN_Y) { item=item->next; continue; } /* OK, vertical alignment has been detected. Set the `align' * field of all following lines that match. */ pos_x = choose_best_align(aligns, cut_off); if (pos_x == 0) { item=item->next; continue; } assert(pos_x < sizeof(aligns)); for (; y > 0; y--, item=item->next) item->align = pos_x; for (; item; item=item->next) { if (is_line_blank(item->str)) break; if (! find_aligns(tmp_al, item->str)) break; if (tmp_al[pos_x] == 0) break; item->align = pos_x; } } } static void do_reformat_text(struct TextWindow *win, int avail_w) { struct TextItem *item, *Z, *succ; int reformatting; int cur_align, cur_attr; int len, pos_x; char buf[BUFSZ * 2]; const char *J; reformatting = 0; cur_align = cur_attr = 0; /* grab the first line, then clear the list, rebuilding the list * along the way. BTW, this is has the desirable side-effect of * reversing the list. */ item = win->lines; win->lines = NULL; #undef ADD_IT #define ADD_IT() do \ { struct TextItem *succ = item->next; \ item->next = win->lines; \ win->lines = item; \ item = succ; \ } while(0) #undef TRAIL_IT #define TRAIL_IT(buf) do \ { int p; \ assert(buf); \ for (p=strlen(buf)-1; p >= cur_align; p--) \ if (! isspace(buf[p])) \ break; \ buf[p+1] = 0; \ } while(0) /* Loop Invariants: * * when `reformatting' is false: * * + item points at the current line to process. * + buf[], cur_align and cur_attr are unused. * * when `reformatting' is true: * * + item points at the current line to process, which we * modify (split or join it). * + item->str != NULL && line not completely blank. * + no trailing space on line (ignoring any initial indent * spaces). * + buf[] only used temporarily. * + cur_align and cur_attr are valid. */ while (item) { if (! reformatting) { if (is_line_blank(item->str)) { ADD_IT(); continue; } len = strlen(item->str); if (strlen(item->str) <= avail_w) { ADD_IT(); continue; } cur_align = item->align; cur_attr = item->attr; reformatting = 1; continue; } assert(reformatting); assert(! is_line_blank(item->str)); /* current line too long ? */ len = strlen(item->str); if (len > avail_w) { pos_x = find_chopoff_point(item->str, cur_align, avail_w); assert(pos_x > cur_align); assert(pos_x < len-1); len = pos_x; /* build new line */ while (item->str[pos_x] && isspace(item->str[pos_x])) pos_x++; if (cur_align > 0) memset(buf, ' ', cur_align); strcpy(buf + cur_align, item->str + pos_x); /* shorten the current line, and add to list */ item->str[len] = 0; TRAIL_IT(item->str); ADD_IT(); /* allocate new line */ Z = (struct TextItem *) alloc(sizeof(struct TextItem)); memset(Z, 0, sizeof(struct TextItem)); Z->str = strdup(buf); Z->attr = cur_attr; Z->align = cur_align; Z->next = item; item = Z; continue; } /* is the next line part of the same block ? */ if (! item->next || item->next->align != cur_align || item->next->attr != cur_attr || is_line_blank(item->next->str) || ! is_initial_blank(item->next->str, cur_align)) { ADD_IT(); reformatting = 0; continue; } /* concatenate the following line */ succ = item->next; assert(succ); assert(succ->str); item->next = succ->next; for (J=succ->str; *J && isspace(*J); J++) { /* nothing in here */ } strcpy(buf, item->str); strcat(buf, " "); strcat(buf, J); TRAIL_IT(buf); free(item->str); item->str = strdup(buf); free(succ); } } /* * attempts to reformat or shrink the text window. Returns the * tileset to use as the font. */ static struct TileSet * reformat_text_window( struct TextWindow *win) { struct TileSet *set; int avail_w; set = sdlgl_font_text; avail_w = sdlgl_width / set->tile_w; if (sdlgl_shrink_wrap) { while (win->calc_w > avail_w) { /* reached smallest ? */ if (set == sdlgl_next_narrower_font(set->tile_h)) break; set = sdlgl_next_narrower_font(set->tile_h); avail_w = sdlgl_width / set->tile_w; } } if (win->calc_w <= avail_w) return set; if (! sdlgl_reformat) return set; /* Step 1. Figure out the alignment positions for each line. We * require at least four lines to have the same alignment * pattern for it to "kick in". */ do_scan_text(win, avail_w); /* reverse lines (which normally go up) to process them. Better * results when this is done *after* the alignment scan. */ win->lines = reverse_text_items(win->lines); /* Step 2. Reformat any blocks where at least one of the lines is * too long. */ do_reformat_text(win, avail_w); compute_text_bounds(win); return set; } static void draw_text_items(struct TextWindow *win) { struct TileWindow *base; struct TextItem *item; int x, y; int maxlen; tilecol_t tilecol; base = win->base; assert(base); assert(base->is_text); /* choose background color */ win->base->background = TEXT_BACK_COL; for (item=win->lines,y=1; item; item=item->next,y++) { assert(y >= 0); tilecol = sdlgl_attr_to_tilecol(item->attr); x = 0; /* padding character */ sdlgl_blank_area(base, x, y, 1, 1); x++; maxlen = win->calc_w - x; if (maxlen > 0) x += sdlgl_store_str(base, x, y, item->str, maxlen, tilecol); maxlen = win->calc_w - x; if (maxlen > 0) sdlgl_blank_area(base, x, y, maxlen, 1); } } void sdlgl_process_text_window(int window, struct TextWindow *win) { struct TileSet *font_set; int bottom_y; int pixel_w, pixel_h; assert(! win->base); if (! win->lines) return; if (sdlgl_alt_prev) sdlgl_remove_scrollback(); sdlgl_top_win = window; compute_text_bounds(win); font_set = reformat_text_window(win); win->base = sdlgl_new_tilewin(font_set, win->calc_w, win->calc_h, 1,0); draw_text_items(win); /* here, strangely enough, is where we show the RIP image */ if (win->is_rip) bottom_y = sdlgl_display_RIP(win->how_died) - 20; else bottom_y = sdlgl_height; pixel_w = min(sdlgl_width, win->base->scale_w * win->calc_w); pixel_h = min(bottom_y, win->base->scale_h * win->calc_h); win->show_w = pixel_w / win->base->scale_w; win->show_h = pixel_h / win->base->scale_h; assert(0 < win->show_w && win->show_w <= win->calc_w); assert(0 < win->show_h && win->show_h <= win->calc_h); sdlgl_map_tilewin(win->base, sdlgl_width - pixel_w, bottom_y - pixel_h, pixel_w, pixel_h, 10+window); /* set focus */ win->focus_x = 0; win->focus_y = win->calc_h - win->show_h; /* this flushes: */ sdlgl_pan_window(window, 0, 0); for (;;) { int ch = sdlgl_get_key(0); if (ch == ' ' || ch == '\n' || ch == '\r' || ch == '\033' || ch == 'q' || ch == 'n' || ch == 'y') break; } if (win->is_rip) sdlgl_dismiss_RIP(); sdlgl_unmap_tilewin(win->base); sdlgl_free_tilewin(win->base); win->base = NULL; sdlgl_top_win = WIN_ERR; } void sdlgl_clear_text_items(struct TextWindow *win) { struct TextItem *item; while (win->lines) { item = win->lines; win->lines = item->next; free(item->str); free(item); } assert(win->lines == NULL); } void Sdlgl_display_file(const char *fname, BOOLEAN_P complain) { dlb *f; winid datawin; char buf[BUFSZ]; char *cr; #ifdef FILE_AREAS f = dlb_fopen_area(FILE_AREA_SHARE, fname, RDTMODE); #else f = dlb_fopen(fname, RDTMODE); #endif if (!f) { if (complain) { sprintf(buf, "Cannot open `%s' to display.", fname); Sdlgl_raw_print(buf); } return; } datawin = Sdlgl_create_nhwindow(NHW_TEXT); while (dlb_fgets(buf, BUFSZ, f) != NULL) { /* NUL-terminate string */ if ((cr = index(buf, '\n')) != 0) *cr = 0; if ((cr = index(buf, '\r')) != 0) *cr = 0; if (index(buf, '\t') != 0) tabexpand(buf); Sdlgl_putstr(datawin, 0, buf); } Sdlgl_display_nhwindow(datawin, FALSE); Sdlgl_destroy_nhwindow(datawin); dlb_fclose(f); } #endif /* GL_GRAPHICS */ /*gl_text.c*/ slashem-0.0.7E7F3/win/gl/gl_softw.c0000664000076400007640000004561010545462317015051 0ustar aliali/* Copyright (C) 2002 Andrew Apted */ /* NetHack may be freely redistributed. See license for details. */ /* * SDL/GL window port for NetHack & Slash'EM. * * Software drawing code (version without OpenGL). * * Based on work by Allister MacLeod (C) 2002. */ #include "hack.h" #include "patchlevel.h" #if defined (SDL_GRAPHICS) /* software only */ #define WINGL_INTERNAL #include "winGL.h" struct DirtyMatrix *sdlgl_matrix = NULL; static SDL_Surface *pet_mark_surf = NULL; static SDL_Surface *ridden_mark_surf = NULL; static SDL_Surface *darkness = NULL; void sw_rend_startup(void) { if (sdlgl_depth == 8) { sdlgl_set_surface_colors(sdlgl_surf); } sdlgl_matrix = sdlgl_create_dirty_matrix(sdlgl_width, sdlgl_height); } void sw_rend_shutdown(void) { sdlgl_free_dirty_matrix(sdlgl_matrix); } /*------------------------------------------------------------------------*/ static GH_INLINE Uint32 rgb2sdl(SDL_PixelFormat *fmt, rgbcol_t color) { Uint8 r = GAMMA(RGB_RED(color)); Uint8 g = GAMMA(RGB_GRN(color)); Uint8 b = GAMMA(RGB_BLU(color)); return SDL_MapRGB(fmt, r, g, b); } static void create_iso_borders(struct TileSet *set) { int x, y; Uint32 c; /* the surface consists of three tiles, one for the corners, one for * horizontal lines, and one for vertical lines. "+ - |" */ set->borders = SDL_CreateRGBSurface(SDL_SWSURFACE, 48 * 3, 64, 8 /* bpp */, 0, 0, 0, 0); if (! set->borders) sdlgl_error("Couldn't create SDL surface for iso borders.\n"); sdlgl_set_surface_colors(set->borders); SDL_SetColorKey(set->borders, SDL_SRCCOLORKEY, TRANS_PIX); c = rgb2sdl(set->borders->format, BORDER_COL); for (y=0; y < 64; y++) for (x=0; x < 48; x++) { int horiz = (y == 48) && (x >= 8) && (x < 40); int vert = (y >= 32) && (x == (48 - y / 2)); SDL_Rect drect; drect.x = x; drect.y = y; drect.w = drect.h = 1; SDL_FillRect(set->borders, &drect, (horiz || vert) ? c : TRANS_PIX); drect.x = x + 48; drect.y = y; drect.w = drect.h = 1; SDL_FillRect(set->borders, &drect, horiz ? c : TRANS_PIX); drect.x = x + 96; drect.y = y; drect.w = drect.h = 1; SDL_FillRect(set->borders, &drect, vert ? c : TRANS_PIX); } set->borders_small = sdlgl_shrink_surface(set->borders); if (! set->borders_small) sdlgl_error("Could not create surface for shrunken borders.\n"); } static struct TileSet *sw_load_tileset(const char *filename, int tile_w, int tile_h, int is_text, int keep_rgba, int *across, int *down) { struct TileSet *set; unsigned char *data_ptr; int width, height; int num_w, num_h; int is_isometric = ! is_text && tile_h == 64; data_ptr = sdlgl_load_png_file(filename, &width, &height); if (! data_ptr) { sdlgl_error("Could not load tileset image: %s\n", filename); return NULL; /* NOT REACHED */ } set = (struct TileSet *) alloc(sizeof(struct TileSet)); memset(set, 0, sizeof(struct TileSet)); assert(sdlgl_surf); if (keep_rgba && sdlgl_surf->format->BytesPerPixel > 1) { set->surf = sdlgl_RGBA_to_truecolor(data_ptr, width, height); } else { set->surf = sdlgl_RGBA_to_palettised(data_ptr, width, height); free(data_ptr); } if (! set->surf) { sdlgl_error("Could not create SDL surface for tileset.\n"); return NULL; /* NOT REACHED */ } set->surf_small = NULL; if (tile_h >= 32) { set->surf_small = sdlgl_shrink_surface(set->surf); if (! set->surf_small) { sdlgl_error("Could not create SDL surface for shrunken tileset.\n"); return NULL; /* NOT REACHED */ } } set->tile_w = tile_w; set->tile_h = tile_h; num_w = set->surf->w / tile_w; num_h = set->surf->h / tile_h; set->tile_num = num_w * num_h; set->lap_w = is_isometric ? 16 : 0; set->lap_h = is_isometric ? 32 : 0; set->lap_skew = is_isometric ? 16 : 0; set->pack_w = num_w; set->pack_h = num_h; set->has_alpha = NULL; if (! is_text && ! keep_rgba) { sdlgl_sw_create_has_alpha(set); } set->font_cache = NULL; if (is_text) { sdlgl_create_font_cache(set); } set->borders = set->borders_small = NULL; if (is_isometric) { create_iso_borders(set); } if (across) *across = num_w; if (down) *down = num_h; return set; } static void sw_free_tileset(struct TileSet *set) { if (set->surf) { SDL_FreeSurface(set->surf); set->surf = NULL; } if (set->surf_small) { SDL_FreeSurface(set->surf_small); set->surf = NULL; } if (set->has_alpha) { free(set->has_alpha); set->has_alpha = NULL; } if (set->font_cache) { sdlgl_free_font_cache(set); set->font_cache = NULL; } free(set); } static SDL_Surface *mark_to_surface(const unsigned char *bits, Uint8 r, Uint8 g, Uint8 b) { int x, y; Uint32 c; SDL_Surface *surf = SDL_CreateRGBSurface(SDL_SWSURFACE, 8, 8, 8 /* bpp */, 0, 0, 0, 0); if (! surf) sdlgl_error("Couldn't create SDL surface for pet mark.\n"); sdlgl_set_surface_colors(surf); SDL_SetColorKey(surf, SDL_SRCCOLORKEY, TRANS_PIX); c = SDL_MapRGB(surf->format, r, g, b); for (y=0; y < 8; y++) for (x=0; x < 8; x++) { int pix = bits[y] & (1 << (7-x)); SDL_Rect drect; drect.x = x; drect.y = y; drect.w = drect.h = 1; SDL_FillRect(surf, &drect, pix ? c : TRANS_PIX); } return surf; } static void sw_create_extra_graphics(void) { pet_mark_surf = mark_to_surface(pet_mark_bits, 255, 0, 0); ridden_mark_surf = mark_to_surface(ridden_mark_bits, 0, 224, 0); assert(pet_mark_surf && ridden_mark_surf); } static void sw_free_extra_shapes(void) { if (pet_mark_surf) SDL_FreeSurface(pet_mark_surf); pet_mark_surf = NULL; if (ridden_mark_surf) SDL_FreeSurface(ridden_mark_surf); ridden_mark_surf = NULL; } static void sw_enable_clipper(int x, int y, int w, int h) { SDL_Rect cliprect; cliprect.x = x; cliprect.y = sdlgl_height - y - h; cliprect.w = w; cliprect.h = h; SDL_SetClipRect(sdlgl_surf, &cliprect); } static void sw_disable_clipper(void) { SDL_SetClipRect(sdlgl_surf, NULL); } static void sw_blit_frame(void) { int num = sdlgl_dirty_matrix_to_updaters(sdlgl_matrix); SDL_UpdateRects(sdlgl_surf, num, sdlgl_matrix->updaters); sdlgl_dirty_matrix_clear(sdlgl_matrix); } /*------------------------------------------------------------------------*/ static GH_INLINE void draw_line(int x1, int y1, int x2, int y2, Uint32 c, int depth) { SDL_Rect r; /* doesn't handle diagonal lines (never will) */ assert(x1 == x2 || y1 == y2); if (x1 == x2) /* vertical line */ { r.x = x1; r.y = min(y1, y2); r.w = 1; r.h = max(y1, y2) - r.y + 1; } else /* horizontal line */ { r.x = min(x1, x2); r.y = y1; r.w = max(x1, x2) - r.x + 1; r.h = 1; } sdlgl_dirty_matrix_blit(sdlgl_matrix, NULL, NULL, &r, c, depth); } #define BG_CELL 64 static void sw_draw_background(int sx, int sy, int sw, int sh, rgbcol_t color, int start_idx, int depth) { int x, y; SDL_Rect r; Uint32 c = rgb2sdl(sdlgl_surf->format, color); for (y=0; y < sh; y += BG_CELL) for (x=0; x < sw; x += BG_CELL) { r.x = sx + x; r.y = sy + y; r.w = min(sw - x, BG_CELL); r.h = min(sh - y, BG_CELL); /* the for loop prevents zero sizes */ assert(r.w > 0 && r.h > 0); if (! sdlgl_test_tile_visible(start_idx, r.x, r.y, r.w, r.h)) continue; r.y = sdlgl_height - r.y - r.h; if (sdlgl_dirty_matrix_test(sdlgl_matrix, r.x, r.y, r.w, r.h, depth) == 0) { continue; } sdlgl_dirty_matrix_blit(sdlgl_matrix, NULL, NULL, &r, c, depth); } } static void sw_draw_extra_shape(struct TileWindow *win, struct ExtraShape *shape) { SDL_Rect drect; SDL_Surface *surf; int sx, sy, sw, sh; sw = win->scale_w; sh = win->scale_h; sx = win->scr_x - win->pan_x + shape->x * sw + shape->y * win->scale_skew; sy = win->scr_y - win->pan_y + shape->y * sh; /* trivial clipping */ if (sx + sw <= win->scr_x || sx >= win->scr_x + win->scr_w) return; if (sy + sh <= win->scr_y || sy >= win->scr_y + win->scr_h) return; switch (shape->type) { case SHAPE_None: break; case SHAPE_Heart: case SHAPE_Ridden: /* * par1: 0 is normal, 1 puts it on the left. */ /* don't show them in text mode */ if (sw < 14 || sh < 14) return; sx += (win->scale_full_w + sw) / 2 - 8; sy += (win->scale_full_h + sh) / 2 - 8; drect.w = drect.h = 8; drect.x = sx; drect.y = sdlgl_height - sy - drect.h; if (shape->type == SHAPE_Ridden) surf = ridden_mark_surf; else surf = pet_mark_surf; sdlgl_dirty_matrix_blit(sdlgl_matrix, surf, NULL, &drect, 0, win->scr_depth); break; default: impossible("Unknown extra shape %d", shape->type); } } static void sw_draw_cursor(struct TileWindow *win) { int x = win->curs_x; int y = win->curs_y; int w = win->curs_w; int sx, sy, sw, sh; Uint32 c = rgb2sdl(sdlgl_surf->format, win->curs_color); assert(x >= 0 && y >= 0 && w > 0); sw = win->scale_w; sh = win->scale_h; sx = win->scr_x - win->pan_x + x * sw + y * win->scale_skew; sy = win->scr_y - win->pan_y + y * sh; sw = sw * (w - 1) + win->scale_full_w; sh = win->scale_full_h; /* trivial clipping */ if (sx + sw <= win->scr_x || sx >= win->scr_x + win->scr_w || sy + sh <= win->scr_y || sy >= win->scr_y + win->scr_h) { return; } /* SDL coordinates are y-inverted from OpenGL */ sy = sdlgl_height - sy - sh; if (win->curs_block) { SDL_Rect r; r.x = sx; r.y = sy; r.w = sw; r.h = sh; sdlgl_dirty_matrix_blit(sdlgl_matrix, NULL, NULL, &r, c, win->scr_depth); } else { sw -= 1; /* don't draw outside of tile boundary */ sh -= 1; draw_line(sx, sy, sx + sw, sy, c, win->scr_depth); draw_line(sx + sw, sy, sx + sw, sy + sh, c, win->scr_depth); draw_line(sx + sw, sy + sh, sx, sy + sh, c, win->scr_depth); draw_line(sx, sy + sh, sx, sy, c, win->scr_depth); } } static void sw_begin_tile_draw(int blending, int overlap) { /* nothing needed */ } static void sw_finish_tile_draw(void) { /* nothing needed */ } static void sw_draw_tile(struct TileWindow *win, int sx, int sy, int sw, int sh, tileidx_t tile, tilecol_t tilecol, tileflags_t flags, short layer) { struct TileSet *set = win->set; SDL_Rect trect, drect; SDL_Surface *surf; assert(set); assert(tile < set->tile_num); /* ignore spaces */ if (win->is_text && TILE_2_CHAR(tile) == (unsigned char)' ') return; /* SDL coordinates are y-inverted from OpenGL coordinates */ drect.x = sx; drect.y = sdlgl_surf->h - sy - sh; drect.w = sw; drect.h = sh; /* ignore tiles that are not dirty */ if (sdlgl_dirty_matrix_test(sdlgl_matrix, drect.x, drect.y, drect.w, drect.h, win->scr_depth) == 0) { return; } trect.x = (tile % set->pack_w) * set->tile_w; trect.y = (tile / set->pack_w) * set->tile_h; trect.w = set->tile_w; trect.h = set->tile_h; if (win->is_text) { /* use plain surface if color is bright white */ if (tilecol == WHITE) { surf = set->surf; } else { int pos_x, pos_y; assert(set->font_cache); assert(set->font_cache->char_surf); sdlgl_font_cache_lookup(set, tile, tilecol, &pos_x, &pos_y); trect.x = pos_x * set->tile_w; trect.y = pos_y * set->tile_h; surf = set->font_cache->char_surf; } } else { surf = set->surf; if (set->surf_small && set->tile_h / 2 == win->scale_full_h) { surf = set->surf_small; trect.x /= 2; trect.y /= 2; trect.w /= 2; trect.h /= 2; } } /* NOTE: using SDL_SetAlpha() like this will be quite inefficient * if there a lots of translucent tiles being drawn, because it * invalidates SDL's blitting tables. Ideally we should draw all * the translucent tiles together. */ if (flags & TILE_F_TRANS50) SDL_SetAlpha(surf, SDL_SRCALPHA, 128); sdlgl_dirty_matrix_blit(sdlgl_matrix, surf, &trect, &drect, 0, win->scr_depth); if (flags & TILE_F_TRANS50) SDL_SetAlpha(surf, SDL_SRCALPHA, 255); } static void draw_iso_border_tile(struct TileWindow *win, int x, int y) { struct TileSet *set = win->set; SDL_Rect trect, drect; SDL_Surface *surf; int sx = win->scr_x - win->pan_x + x * win->scale_w + y * win->scale_skew; int sy = win->scr_y - win->pan_y + y * win->scale_h; int tile; assert(set); /* SDL coordinates are y-inverted from OpenGL coordinates */ drect.x = sx; drect.y = sdlgl_surf->h - sy - win->scale_h; drect.w = win->scale_full_w; drect.h = win->scale_full_h; /* ignore tiles that are not dirty */ if (sdlgl_dirty_matrix_test(sdlgl_matrix, drect.x, drect.y, drect.w, drect.h, win->scr_depth) == 0) { return; } if (x > 0 && x < win->total_w - 1) tile = 1; else if (y > 0 && y < win->total_h - 1) tile = 2; else tile = 0; trect.x = tile * 48; trect.y = 0; trect.w = 48; trect.h = 64; surf = set->borders; if (set->borders_small && set->tile_h / 2 == win->scale_full_h) { surf = set->borders_small; trect.x /= 2; trect.y /= 2; trect.w /= 2; trect.h /= 2; } sdlgl_dirty_matrix_blit(sdlgl_matrix, surf, &trect, &drect, 0, win->scr_depth); } static void sw_draw_border(struct TileWindow *win, rgbcol_t col) { int x1, y1, x2, y2; int cx1, cy1, cx2, cy2; int depth = win->scr_depth; int sides = 0x1111; /* L, R, B, T */ Uint32 c; /* handle isometric tileset specially, since the dirty matrix code * doesn't support drawing diagonal lines (would *really* mess it * up). */ if (win->set->borders) { for (x1 = 0; x1 < win->total_w; x1++) { draw_iso_border_tile(win, x1, 0); draw_iso_border_tile(win, x1, win->total_h - 1); } for (y1 = 0; y1 < win->total_h; y1++) { draw_iso_border_tile(win, 0, y1); draw_iso_border_tile(win, win->total_w - 1, y1); } return; } x1 = win->scr_x - win->pan_x; y1 = win->scr_y - win->pan_y; x2 = x1 + win->total_w * win->scale_w - 1; y2 = y1 + win->total_h * win->scale_h - 1; /* clip box to on-screen window */ cx1 = win->scr_x; cy1 = win->scr_y; cx2 = win->scr_x + win->scr_w - 1; cy2 = win->scr_y + win->scr_h - 1; if (x1 < cx1) x1 = cx1, sides &= ~0x1000; if (x2 > cx2) x2 = cx2, sides &= ~0x0100; if (y1 < cy1) y1 = cy1, sides &= ~0x0010; if (y2 > cy2) y2 = cy2, sides &= ~0x0001; if (x1 >= x2 || y1 >= y2 || sides == 0) return; assert(cx1 <= x1 && x1 <= x2 && x2 <= cx2); assert(cy1 <= y1 && y1 <= y2 && y2 <= cy2); c = rgb2sdl(sdlgl_surf->format, col); y1 = sdlgl_height - 1 - y1; y2 = sdlgl_height - 1 - y2; if (sides & 0x1000) draw_line(x1, y1, x1, y2, c, depth); if (sides & 0x0100) draw_line(x2, y1, x2, y2, c, depth); if (sides & 0x0010) draw_line(x1, y1, x2, y1, c, depth); if (sides & 0x0001) draw_line(x1, y2, x2, y2, c, depth); } static void sw_start_fading(int max_w, int min_y) { SDL_PixelFormat *fmt = sdlgl_surf->format; assert(! darkness); if ((sdlgl_surf->flags & SDL_HWPALETTE) && sdlgl_depth == 8) { return; } else if (fmt->BitsPerPixel <= 8) { /* SDL doesn't support 8 bpp -> 8 bpp alpha blits. */ darkness = SDL_CreateRGBSurface(SDL_SWSURFACE, max_w, sdlgl_height - min_y, 15, 0x1F << 10, 0x1F << 5, 0x1F, 0); } else { darkness = SDL_CreateRGBSurface(SDL_SWSURFACE, max_w, sdlgl_height - min_y, fmt->BitsPerPixel, fmt->Rmask, fmt->Gmask, fmt->Bmask, 0); } if (! darkness) { sdlgl_error("Could not allocate SDL surface to apply fading.\n"); return; /* NOT REACHED */ } SDL_FillRect(darkness, NULL, SDL_MapRGB(fmt, 0, 0, 0)); } static void sw_draw_fading(float fade_amount) { SDL_Rect drect; if ((sdlgl_surf->flags & SDL_HWPALETTE) && sdlgl_depth == 8) { /* use the palette trick for fading (much smoother) */ SDL_Color colors[256]; int mul = 256 - (int)(fade_amount * 256); int i; for (i=0; i < 256; i++) { /* we apply gamma _after_ linear interpolation (correct in * theory, but in practice ?). */ int r = (RGB_RED(sdlgl_palette[i]) * mul) >> 8; int g = (RGB_GRN(sdlgl_palette[i]) * mul) >> 8; int b = (RGB_BLU(sdlgl_palette[i]) * mul) >> 8; colors[i].r = GAMMA(r); colors[i].g = GAMMA(g); colors[i].b = GAMMA(b); } SDL_SetPalette(sdlgl_surf, SDL_PHYSPAL, colors, 0, 256); return; } assert(darkness); SDL_SetAlpha(darkness, SDL_SRCALPHA, (int)(fade_amount * 255)); drect.x = 0; drect.y = 0; drect.w = darkness->w; drect.h = darkness->h; sdlgl_dirty_matrix_blit(sdlgl_matrix, darkness, NULL, &drect, 0, 0); } static void sw_finish_fading(void) { if ((sdlgl_surf->flags & SDL_HWPALETTE) && sdlgl_depth == 8) { /* first cause screen to be cleared (unmapped windows) */ sdlgl_flush(); sdlgl_set_surface_colors(sdlgl_surf); return; } SDL_FreeSurface(darkness); darkness = NULL; } void sw_make_screenshot(const char *prefix) { /* FIXME: S/W screenshots */ sdlgl_warning("Screenshots not yet supported in software mode.\n"); } /* ---------------------------------------------------------------- */ static void sw_set_pan(struct TileWindow *win, int x, int y) { win->pan_x = x; win->pan_y = y; sdlgl_mark_dirty(win->scr_x, win->scr_y, win->scr_w, win->scr_h, win->scr_depth); } static void sw_set_new_pos(struct TileWindow *win, int x, int y, int w, int h) { int join_x, join_y; int join_w, join_h; assert(w > 0 && h > 0); assert(win->scr_depth > 0); join_x = min(x, win->scr_x); join_y = min(y, win->scr_y); join_w = max(x+w, win->scr_x + win->scr_w) - join_x; join_h = max(y+h, win->scr_y + win->scr_h) - join_y; win->scr_x = x; win->scr_y = y; win->scr_w = w; win->scr_h = h; sdlgl_mark_dirty(join_x, join_y, join_w, join_h, 0); } static void sw_mark_dirty(int x, int y, int w, int h, int depth) { int x2 = x + w; /* Note: not inclusive */ int y2 = y + h; /* clip to screen */ x = max(x, 0); y = max(y, 0); x2 = min(x2, sdlgl_width); y2 = min(y2, sdlgl_height); if (x2 <= x || y2 <= y) return; w = x2 - x; h = y2 - y; /* convert from GL to SDL coords */ y = sdlgl_height - y - h; sdlgl_dirty_matrix_add(sdlgl_matrix, x, y, w, h, depth); } /* ---------------------------------------------------------------- */ /* Rendering interface table. */ struct rendering_procs sdlgl_softw_rend_procs = { sw_rend_startup, sw_rend_shutdown, sw_load_tileset, sw_free_tileset, sw_create_extra_graphics, sw_free_extra_shapes, sw_enable_clipper, sw_disable_clipper, sw_blit_frame, sw_draw_background, sw_draw_extra_shape, sw_draw_cursor, sw_begin_tile_draw, sw_draw_tile, sw_finish_tile_draw, sw_draw_border, sw_start_fading, sw_draw_fading, sw_finish_fading, sw_make_screenshot, sw_set_pan, sw_set_new_pos, sw_mark_dirty }; #endif /* SDL_GRAPHICS */ /*gl_softw.c*/ slashem-0.0.7E7F3/win/gl/gl_win.c0000664000076400007640000006411110545462317014501 0ustar aliali/* Copyright (C) 2002 Andrew Apted */ /* NetHack may be freely redistributed. See license for details. */ /* * SDL/GL window port for NetHack & Slash'EM. * * This file contains all the window handling code. Basically all of * the interface routines which have a `window' argument. We attempt * to behave as closelu as possible to the TTY port, with a few * enhancements. Map handling is in gl_map.c. */ #include "hack.h" #include "dlb.h" #include "patchlevel.h" #if defined(GL_GRAPHICS) || defined(SDL_GRAPHICS) #define WINGL_INTERNAL #include "winGL.h" #include #include #include struct TextWindow *text_wins[MAXWIN] = { NULL, }; static int textwin_num = 0; int sdlgl_map_win = WIN_ERR; int sdlgl_top_win = WIN_ERR; struct MouseLocation sdlgl_mouseloc = { MACT_AWAY, 0, 0, WIN_ERR }; #define MORE_STR "[More]" #define MORE_LEN 6 #define DEPTH_MAP 2 #define DEPTH_STATUS 3 #define DEPTH_MESSAGE 4 #define DEPTH_SC_BACK 5 #define HEIGHT_STATUS 3 #define WIN_PADDING 8 void sdlgl_win_startup(void) { /* tell the main nethack code: we're ready to Rock 'n' Roll */ iflags.window_inited = 1; } void sdlgl_win_shutdown(void) { winid i; iflags.window_inited = 0; /* Just forget any windows existed, since we're about to exit anyway. * Disable windows to avoid calls to window routines. */ for(i=0; i < MAXWIN; i++) { if (text_wins[i]) Sdlgl_destroy_nhwindow(i); } } winid Sdlgl_create_nhwindow(int type) { winid newid; struct TextWindow *newwin; /* no more window numbers ? */ if (textwin_num == MAXWIN) return WIN_ERR; for (newid=0; newid <= textwin_num; newid++) if (!text_wins[newid]) break; assert(newid <= textwin_num); newwin = text_wins[newid] = sdlgl_new_textwin(type); textwin_num++; sdlgl_update_mouse_location(0); return newid; } void Sdlgl_destroy_nhwindow(winid window) { struct TextWindow *win; if (window == WIN_ERR) return; assert (0 <= window && window < MAXWIN && text_wins[window]); win = text_wins[window]; if (win->base) Sdlgl_dismiss_nhwindow(window); if (win->items) sdlgl_clear_menu_items(win); if (win->lines) sdlgl_clear_text_items(win); sdlgl_free_textwin(win); text_wins[window] = NULL; textwin_num--; if (iflags.window_inited) sdlgl_update_mouse_location(0); } void Sdlgl_clear_nhwindow(winid window) { struct TextWindow *win; int x, y; if (window == WIN_ERR) return; assert (0 <= window && window < MAXWIN && text_wins[window]); win = text_wins[window]; if (! win->base) return; if (win->type == NHW_MESSAGE) { sdlgl_putc(win, C('l')); /* ^L: clear */ sdlgl_home(win); win->fresh_lines = 0; win->more_escaped = 0; return; } sdlgl_blank_area(win->base, 0, 0, win->base->total_w, win->base->total_h); for (y=0; y < win->base->total_h; y++) for (x=0; x < win->base->total_w; x++) { int offset = y * win->base->total_w + x; if (win->glyphs) { win->glyphs[offset].bg = NO_GLYPH; win->glyphs[offset].fg = NO_GLYPH; sdlgl_remove_extrashapes(win->base, x, y); } } sdlgl_home(win); } /* * Pan the text/menu window by the given offset. The dx/dy values * have the following meanings (in absolute value) : * * 0 - no change (but compute anyway). * 1 - move by a single character. * 2 - move by a bunch of characters (5 or so). * 3 - move by a "page" (the window size). * 4 - move as far as possible. */ void sdlgl_pan_window(int window, int dx, int dy) { struct TextWindow *win; struct TileWindow *base; int x, y; assert(0 <= window && window < MAXWIN); win = text_wins[window]; assert(win); base = win->base; assert(base); x = win->focus_x; y = win->focus_y; switch (abs(dx)) { case 2: dx = sgn(dx) * 10; break; case 3: dx = sgn(dx) * (win->show_w - 1); break; case 4: dx = sgn(dx) * win->calc_w; break; } switch (abs(dy)) { case 2: dy = sgn(dy) * 5; break; case 3: dy = sgn(dy) * (win->show_h - 1); break; case 4: dy = sgn(dy) * win->calc_h; break; } x += dx; y += dy; /* limit new focus value */ win->focus_x = max(0, min(win->calc_w - win->show_w, x)); win->focus_y = max(0, min(win->calc_h - win->show_h, y)); /* compute panning for tile window */ sdlgl_set_pan(base, win->focus_x * base->scale_w, win->focus_y * base->scale_h); sdlgl_flush(); } static int compute_window_base_y(int type, int *h) { int pad = WIN_PADDING; int mesg_h = pad + iflags.wc_vary_msgcount * sdlgl_font_message->tile_h; int stat_h = pad + HEIGHT_STATUS * sdlgl_font_status->tile_h; int map_h = sdlgl_height - mesg_h - stat_h; int stat_pos = 0; /* 0 for bottom, 1 for middle, 2 for top */ int mesg_pos = 2; int a_mesg = iflags.wc_align_message; int a_stat = iflags.wc_align_status; /* we treat ALIGN_LEFT the same as ALIGN_TOP, and ALIGN_RIGHT the * same as ALIGN_BOTTOM. */ a_mesg = (a_mesg == ALIGN_LEFT || a_mesg == ALIGN_TOP) ? 0 : 1; a_stat = (a_stat == ALIGN_LEFT || a_stat == ALIGN_TOP) ? 0 : 1; switch (a_stat * 2 + a_mesg) { case 0: stat_pos = 1, mesg_pos = 2; break; case 1: stat_pos = 2, mesg_pos = 0; break; case 2: stat_pos = 0, mesg_pos = 2; break; case 3: stat_pos = 0, mesg_pos = 1; break; } switch (type) { case NHW_MESSAGE: (*h) = mesg_h - pad; switch (mesg_pos) { case 0: return 0; case 1: return (stat_pos < 1) ? stat_h : (map_h + pad); case 2: return sdlgl_height - (*h); } break; case NHW_STATUS: (*h) = stat_h - pad; switch (stat_pos) { case 0: return 0; case 1: return (mesg_pos < 1) ? mesg_h : (map_h + pad); case 2: return sdlgl_height - (*h); } break; case NHW_MAP: (*h) = map_h; if (mesg_pos > 0 && stat_pos > 0) return 0; if (mesg_pos < 2 && stat_pos < 2) return sdlgl_height - (*h); return (mesg_pos < 1) ? mesg_h : stat_h; } impossible("compute_window_base_y: bad type or pos !\n"); return 0; } void Sdlgl_display_nhwindow(winid window, BOOLEAN_P blocking) { struct TextWindow *win; int win_y, win_h; if (window == WIN_ERR) return; assert (0 <= window && window < MAXWIN && text_wins[window]); win = text_wins[window]; SDL_PumpEvents(); /* already displayed ? */ if (win->base) { sdlgl_flush(); /* handle `blocking' special cases -- this fixes the bug with * detection potions only flashing very briefly. */ if (blocking && window == WIN_MAP) { sdlgl_get_key(0); } return; } switch (win->type) { case NHW_MESSAGE: win->show_w = sdlgl_width / sdlgl_font_message->tile_w; win->show_h = iflags.wc_vary_msgcount; win_y = compute_window_base_y(NHW_MESSAGE, &win_h); win->base = sdlgl_new_tilewin(sdlgl_font_message, win->show_w, win->show_h, 1,0); sdlgl_map_tilewin(win->base, 0, win_y, sdlgl_width, win_h, DEPTH_MESSAGE); sdlgl_home(win); /* create scroll-back window */ assert(! win->scrollback); assert(iflags.msg_history >= MIN_HISTORY); win->scrollback = sdlgl_new_tilewin(sdlgl_font_message, win->show_w, iflags.msg_history, 1,0); win->scrollback->background = PREV_BACK_COL; win->scrollback_pos = 0; win->scrollback_size = 0; win->scrollback_enable = 1; break; case NHW_STATUS: win->show_w = sdlgl_width / sdlgl_font_status->tile_w; win->show_h = HEIGHT_STATUS; win_y = compute_window_base_y(NHW_STATUS, &win_h); win->base = sdlgl_new_tilewin(sdlgl_font_status, win->show_w, win->show_h, 1,0); sdlgl_map_tilewin(win->base, 0, win_y, sdlgl_width, win_h, DEPTH_STATUS); break; case NHW_MAP: sdlgl_map_win = window; win_y = compute_window_base_y(NHW_MAP, &win_h); win->base = sdlgl_new_tilewin(sdlgl_tiles, 80, 22, 0,1); sdlgl_map_tilewin(win->base, 0, win_y, sdlgl_width, win_h, DEPTH_MAP); sdlgl_create_map(win, 80, 22); break; case NHW_MENU: if (win->is_menu == 0) sdlgl_process_text_window(window, win); break; case NHW_TEXT: sdlgl_process_text_window(window, win); break; default: break; } sdlgl_flush(); } void Sdlgl_dismiss_nhwindow(winid window) { struct TextWindow *win; if (window == WIN_ERR) return; assert (0 <= window && window < MAXWIN && text_wins[window]); win = text_wins[window]; /* already dismissed ? */ if (! win->base) return; if (win->type == NHW_MAP) { sdlgl_map_win = WIN_ERR; assert(win->glyphs); free(win->glyphs); win->glyphs = NULL; } switch (win->type) { case NHW_MESSAGE: /* remove scroll-back window */ if (sdlgl_alt_prev) sdlgl_remove_scrollback(); assert(win->scrollback); sdlgl_free_tilewin(win->scrollback); win->scrollback = NULL; /* FALL THROUGH */ case NHW_STATUS: case NHW_MAP: sdlgl_unmap_tilewin(win->base); sdlgl_free_tilewin(win->base); win->base = NULL; default: break; } /* special check, to prevent screen redrawing to happen when * shutting down. */ if (iflags.window_inited) sdlgl_flush(); } void Sdlgl_curs(winid window, int x, int y) { /* does nothing */ } void sdlgl_more(struct TextWindow *win) { const char *prompt = MORE_STR; struct TilePair old_buf[16]; int len = strlen(prompt); int start_x, start_y; int ch; assert(win->base); assert(win->base->is_text); assert(0 < win->fresh_lines && win->fresh_lines <= win->show_h); start_x = 0; start_y = win->write_y; if (win->more_escaped && !win->dismiss_more) { win->fresh_lines = 0; return; } /* when the [MORE] does not fit, put it at the start of the next * line. */ if (start_y > 0 && win->write_x + 1 > win->show_w - len) start_y--; else start_x = min(win->show_w - len, win->write_x + 1); /* save contents where the [MORE] goes, and restore it later */ sdlgl_transfer_line(win->base, start_x, start_y, len, old_buf, 1); sdlgl_store_str(win->base, start_x, start_y, prompt, len, B_RED); for (;;) { sdlgl_flush(); ch = sdlgl_get_key(0); if (ch == C('p')) { Sdlgl_doprev_message(); continue; } if (sdlgl_alt_prev) sdlgl_remove_scrollback(); if (ch && ch == win->dismiss_more) { win->more_ch = ch; break; } if (ch == '\033' && !win->dismiss_more) win->more_escaped = 1; if (ch == ' ' || ch == '\n' || ch == '\r' || ch == '\033' || ch == 'q' || ch == 'n' || ch == 'y') break; } sdlgl_transfer_line(win->base, start_x, start_y, len, old_buf, 0); win->fresh_lines = 0; } static const char *messages_of_import[] = { "You die", "You turn to stone", "You fry to a crisp", "You sink below the surface and die", "You cease to exist", "You drown", "Your last thought fades away", "Your new form doesn't seem healthy enough to survive", "You're still burning", "You're still drowning", "Eating that is instantly fatal", "The death ray hits you", "Unfortunately, digesting any of it is fatal", "Unfortunately your brain is still gone", "Restoring", /* this one is borderline */ /* "Saving", */ "You ascend", "This game is void", "Probably someone removed it", "Cannot read level", "Cannot rewrite level" }; /* -AJA- this is a bit of a kludge. Ideally the main code would mark * messages as "must see" in some way (a new ATR_ value might be * the best way). * * Testing `killer != 0' doesn't help here either, as the main * code often sets it *after* calling pline/You/Your. */ static int important_message(const char *str) { int i; for (i=0; i < SIZE(messages_of_import); i++) { const char *cur_msg = messages_of_import[i]; if (strncmpi(str, cur_msg, strlen(cur_msg)) == 0) return 1; } if (strstri(str, "drowns you.") != 0) return 1; return 0; } static void do_message_putstr(struct TextWindow *win, int attr, const char *str) { int len = strlen(str); int use_len; int is_important; /* factor in the size of the [More] */ int is_bottom = (win->fresh_lines == win->show_h); int width = win->show_w - (is_bottom ? MORE_LEN : 0); if (sdlgl_alt_prev) sdlgl_remove_scrollback(); is_important = important_message(str); /* If there is room on the line, print message on same line. * But messages like "You die..." deserve their own line. */ if (win->fresh_lines > 0 && !win->want_new_line && (win->write_x + 2 + len + 1 < width) && ! is_important) { /* Note: fresh_lines field stays the same */ sdlgl_puts_nolf(win, " "); sdlgl_puts_nolf(win, str); return; } win->want_new_line = 0; if (is_important) win->more_escaped = 0; while (len > 0) { if (win->fresh_lines >= win->show_h) { sdlgl_more(win); sdlgl_putc(win, '\n'); } else { if (win->write_x > 0) sdlgl_putc(win, '\n'); } assert(win->write_x == 0); /* increment the fresh line count, since we're about to add text * into a new line. */ win->fresh_lines++; is_bottom = (win->fresh_lines == win->show_h); width = win->show_w - (is_bottom ? MORE_LEN : 0); /* does it fit yet ? */ if (len < width) { sdlgl_puts_nolf(win, str); break; } /* choose a good place to break the line */ for (use_len = width-1; use_len > width/2; use_len--) if (str[use_len] == ' ') break; /* no space in latter half of string ? Must be a very long token, * so we might as well split it at the screen edge. */ if (str[use_len] != ' ') use_len = width-1; for (; use_len > 0; use_len--, str++, len--) if (*str != '\n' && *str != '\r') sdlgl_putc(win, *str); for (; *str == ' '; str++, len--) { /* removing leading spaces */ } } if (is_important && win->fresh_lines > 0) sdlgl_more(win); } void Sdlgl_putstr(winid window, int attr, const char *str) { struct TextWindow *win; if (window == WIN_ERR) return; assert (0 <= window && window < MAXWIN && text_wins[window]); win = text_wins[window]; switch (win->type) { case NHW_MESSAGE: strncpy(toplines, str, TBUFSZ); /* for Norep() */ toplines[TBUFSZ - 1] = 0; do_message_putstr(win, attr, str); break; case NHW_STATUS: /* does nothing -- it is drawn elsewhere */ break; case NHW_MENU: if (win->is_menu == 1) return; if (win->is_menu < 0) { /* mark this menu as a text window */ win->is_menu = 0; win->calc_w = win->calc_h = 0; } /*FALL THROUGH*/ case NHW_TEXT: { sdlgl_insert_text_item(win, NULL, 0, attr, str); break; } default: break; } } tilecol_t sdlgl_attr_to_tilecol(int attr) { switch (attr) { case ATR_BOLD: return WHITE; case ATR_DIM: return CYAN; case ATR_INVERSE: return B_GREEN; case ATR_ULINE: return B_YELLOW; case ATR_BLINK: return B_RED; default: break; } return L_GREY; } int Sdlgl_doprev_message(void) { struct TextWindow *win; int pixel_h; int ch; int dy, shown, max_shown; if (WIN_MESSAGE == WIN_ERR) return 0; assert(0 <= WIN_MESSAGE && WIN_MESSAGE < MAXWIN); win = text_wins[WIN_MESSAGE]; assert(win); if (win->type != NHW_MESSAGE || !win->scrollback) return 0; if (win->scrollback_size <= 0) /* shouldn't be possible */ return 0; if (sdlgl_alt_prev) { assert(win->show_h > 0); assert(win->base); /* In the alternate mode, we keep the scrollback tile window * mapped, pan it and return. The next keypress will either be ^P * or ^O and sdlgl_adjust_scrollback will be called. or something * else and sdlgl_remove_scrollback will be called. */ if (win->scrollback_pos == 0) { int top_y = win->base->scr_y + win->base->scr_h; pixel_h = win->scrollback->scale_h; sdlgl_map_tilewin(win->scrollback, 0, top_y - pixel_h, sdlgl_width, pixel_h, DEPTH_SC_BACK); } sdlgl_adjust_scrollback(win, +1); return 0; } /* NOTE: we don't set sdlgl_top_win here, since this does a * different style of panning. */ dy = sdlgl_prev_step; max_shown = min(win->scrollback->total_h, win->scrollback_size); shown = min(dy, max_shown); assert(shown > 0); pixel_h = win->scrollback->scale_h * shown; sdlgl_map_tilewin(win->scrollback, 0, sdlgl_height - pixel_h, sdlgl_width, pixel_h, DEPTH_SC_BACK); for (;;) { sdlgl_flush(); ch = sdlgl_get_key(POSKEY_ALLOW_REPEAT); if (ch == ' ' || ch == '\n' || ch == '\r' || ch == '\033' || ch == 'q' || ch == 'n' || ch == 'y') break; if (ch == C('p')) { shown = min(max_shown, shown + dy); } else if (ch == C('o') || ch == C('n')) { shown -= dy; if (shown <= 0) break; } else continue; /* we rely on the bottom-up nature of tilewins, otherwise we'd * need to update the pan_y field too. */ pixel_h = win->scrollback->scale_h * shown; sdlgl_set_new_pos(win->scrollback, 0, sdlgl_height - pixel_h, sdlgl_width, pixel_h); } sdlgl_unmap_tilewin(win->scrollback); win->scrollback_pos = 0; return 0; } /* dy is +1 it scroll back, -1 to scroll forward. */ void sdlgl_adjust_scrollback(struct TextWindow *win, int dy) { int old_pos; int new_pos; assert(win && win->scrollback); assert(win->base); old_pos = win->scrollback_pos; dy = sgn(dy) * sdlgl_prev_step; new_pos = old_pos + dy; if (new_pos <= 0) { sdlgl_remove_scrollback(); return; } /* limit scrollback */ if (new_pos > max(win->show_h, win->scrollback_size + abs(dy) - 1)) return; win->scrollback_pos = new_pos; if (old_pos < win->show_h || new_pos < win->show_h) { int top_y = win->base->scr_y + win->base->scr_h; int pixel_h = win->scrollback->scale_h * min(win->show_h, new_pos); sdlgl_set_new_pos(win->scrollback, 0, top_y - pixel_h, sdlgl_width, pixel_h); } sdlgl_set_pan(win->scrollback, win->scrollback->pan_x, max(0, new_pos - win->show_h) * win->scrollback->scale_h); sdlgl_flush(); } void sdlgl_remove_scrollback(void) { struct TextWindow *win; if (WIN_MESSAGE == WIN_ERR) return; assert(0 <= WIN_MESSAGE && WIN_MESSAGE < MAXWIN); win = text_wins[WIN_MESSAGE]; assert(win); if (win->type != NHW_MESSAGE || !win->scrollback) return; /* check if mapped */ if (win->scrollback_pos == 0) return; win->scrollback_pos = 0; sdlgl_unmap_tilewin(win->scrollback); sdlgl_flush(); } void sdlgl_update_mouse_location(int lost_focus) { int x, y; int old_action = sdlgl_mouseloc.action; int idx; int alt; struct TextWindow *win; struct TileWindow *base; (void) SDL_GetMouseState(&x, &y); y = sdlgl_height - 1 - y; sdlgl_mouseloc.x = x; sdlgl_mouseloc.y = y; if (lost_focus || x < 0 || y < 0 || x >= sdlgl_width || y >= sdlgl_height) { sdlgl_mouseloc.action = MACT_AWAY; sdlgl_mouseloc.window = WIN_ERR; if (old_action != sdlgl_mouseloc.action) SDL_SetCursor(sdlgl_cursor_main); return; } /* find the containing window (if any) */ win = NULL; base = NULL; for (idx = MAXWIN-1; idx >= 0; idx--) { if (! text_wins[idx]) continue; win = text_wins[idx]; base = win->base; if (! base || base->scr_depth <= 0) continue; if (x >= base->scr_x && x < base->scr_x + base->scr_w && y >= base->scr_y && y < base->scr_y + base->scr_h) { break; /* found it */ } } sdlgl_mouseloc.action = MACT_NORMAL; sdlgl_mouseloc.window = WIN_ERR; if (idx >= 0) { int use_dirs = 0; sdlgl_mouseloc.window = idx; alt = SDL_GetModState() & (KMOD_ALT | KMOD_META); assert(win); assert(base); switch (win->type) { case NHW_TEXT: use_dirs = 1; break; case NHW_MENU: if (win->is_menu == 0) { use_dirs = 1; break; } /* FALL THROUGH */ case NHW_MAP: use_dirs = alt ? 1 : 0; break; default: break; } if (use_dirs) { /* figure out what direction to scroll based on where the mouse * position is in the window. */ int px = x - base->scr_x; int py = y - base->scr_y; int A, B; assert(base->scr_w > 0); assert(base->scr_h > 0); px = px * 100 / base->scr_w; py = py * 100 / base->scr_h; A = px > py; B = px > (100 - py); switch (A*2 + B) { case 0: sdlgl_mouseloc.action = MACT_LEFT; break; case 1: sdlgl_mouseloc.action = MACT_UP; break; case 2: sdlgl_mouseloc.action = MACT_DOWN; break; case 3: sdlgl_mouseloc.action = MACT_RIGHT; break; } } } /* set the mouse cursor */ if (old_action != sdlgl_mouseloc.action) { switch (sdlgl_mouseloc.action) { case MACT_NORMAL: case MACT_AWAY: SDL_SetCursor(sdlgl_cursor_main); break; case MACT_UP: SDL_SetCursor(sdlgl_cursor_up); break; case MACT_DOWN: SDL_SetCursor(sdlgl_cursor_down); break; case MACT_LEFT: SDL_SetCursor(sdlgl_cursor_left); break; case MACT_RIGHT: SDL_SetCursor(sdlgl_cursor_right); break; case MACT_HAND: SDL_SetCursor(sdlgl_cursor_hand); break; case MACT_CROSS: SDL_SetCursor(sdlgl_cursor_cross); break; } } } /* returns 1 if key was eaten */ int sdlgl_internal_key_handler(SDL_keysym *key, int repeat) { int shift, ctrl, alt, step; assert(key); shift = (key->mod & KMOD_SHIFT); ctrl = (key->mod & KMOD_CTRL); alt = (key->mod & (KMOD_ALT | KMOD_META)); if (alt) { step = 2; switch (key->sym) { case SDLK_LEFT: sdlgl_pan_map_window(-step, 0); return 1; case SDLK_RIGHT: sdlgl_pan_map_window(+step, 0); return 1; case SDLK_UP: sdlgl_pan_map_window(0, +step); return 1; case SDLK_DOWN: sdlgl_pan_map_window(0, -step); return 1; case SDLK_HOME: Sdlgl_cliparound(u.ux, u.uy); sdlgl_flush(); return 1; default: return 0; } } if (key->sym == SDLK_F5 && !repeat) { /* Only allow screenshots by the game's administrator */ if (wizard) sdlgl_make_screenshot("/tmp/shot_"); /* Using Sdlgl_putstr() to show a message would be nice here. The * problem is, we may already be inside it, and it wasn't designed * to be recursive. Oh well. */ return 1; } step = ctrl ? 4 : shift ? 2 : 1; if (sdlgl_top_win != WIN_ERR) { switch (key->sym) { case SDLK_LEFT: sdlgl_pan_window(sdlgl_top_win, -step, 0); return 1; case SDLK_RIGHT: sdlgl_pan_window(sdlgl_top_win, +step, 0); return 1; case SDLK_UP: sdlgl_pan_window(sdlgl_top_win, 0, +step); return 1; case SDLK_DOWN: sdlgl_pan_window(sdlgl_top_win, 0, -step); return 1; case SDLK_PAGEUP: sdlgl_pan_window(sdlgl_top_win, 0, +3); return 1; case SDLK_PAGEDOWN: sdlgl_pan_window(sdlgl_top_win, 0, -3); return 1; case SDLK_HOME: sdlgl_pan_window(sdlgl_top_win, -4, +4); return 1; case SDLK_END: sdlgl_pan_window(sdlgl_top_win, -4, -4); return 1; default: return 0; } } if (sdlgl_map_win != WIN_ERR) { /* none of these need auto-repeat */ if (repeat) return 0; switch (key->sym) { case SDLK_PAGEUP: sdlgl_zoom_map(ctrl ? +2 : +1); sdlgl_flush(); return 1; case SDLK_PAGEDOWN: sdlgl_zoom_map(ctrl ? -2 : -1); sdlgl_flush(); return 1; case SDLK_HOME: sdlgl_center_screen_on_player(); sdlgl_flush(); return 1; case SDLK_END: sdlgl_toggle_text_view(); sdlgl_flush(); return 1; case SDLK_F4: assert(text_wins[sdlgl_map_win]); text_wins[sdlgl_map_win]->write_cursor ^= 1; Sdlgl_cliparound(u.ux, u.uy); sdlgl_flush(); return 1; default: return 0; } } return 0; } /* returns 1 if button was eaten */ int sdlgl_internal_button_handler(SDL_MouseButtonEvent *but) { int winid; if (sdlgl_mouseloc.action <= MACT_AWAY) return 0; winid = sdlgl_mouseloc.window; if (winid == WIN_ERR) return 0; /* handle the map */ if (winid == sdlgl_map_win) { int step = 2; switch (sdlgl_mouseloc.action) { case MACT_UP: sdlgl_pan_map_window(0, +step); break; case MACT_DOWN: sdlgl_pan_map_window(0, -step); break; case MACT_LEFT: sdlgl_pan_map_window(-step, 0); break; case MACT_RIGHT: sdlgl_pan_map_window(+step, 0); break; default: break; } } else /* text or menu window */ { int step = 2; switch (sdlgl_mouseloc.action) { case MACT_UP: sdlgl_pan_window(winid, 0, +step); break; case MACT_DOWN: sdlgl_pan_window(winid, 0, -step); break; case MACT_LEFT: sdlgl_pan_window(winid, -step, 0); break; case MACT_RIGHT: sdlgl_pan_window(winid, +step, 0); break; default: break; } } return 1; } void sdlgl_internal_motion_handler(SDL_MouseMotionEvent *mot) { sdlgl_update_mouse_location(0); } void Sdlgl_outrip(winid window, int how) { struct TextWindow *win; if (window == WIN_ERR) return; assert (0 <= window && window < MAXWIN && text_wins[window]); win = text_wins[window]; if (win->type == NHW_TEXT) { /* actual tombstone image is put up at display_nhwindow() time */ win->is_rip = 1; win->how_died = how; } } #endif /* GL_GRAPHICS */ /*gl_win.c*/ slashem-0.0.7E7F3/win/gl/gl_font.c0000664000076400007640000000730710545462317014656 0ustar aliali/* Copyright (C) 2002 Andrew Apted */ /* NetHack may be freely redistributed. See license for details. */ /* * SDL/GL window port for NetHack & Slash'EM. * * Font management. */ #include "hack.h" #include "patchlevel.h" #if defined(GL_GRAPHICS) || defined(SDL_GRAPHICS) #define WINGL_INTERNAL #include "winGL.h" /* colors used for text. Index 0 guaranteed to be black */ rgbcol_t sdlgl_text_colors[256]; /* actual tilesets */ struct TileSet *sdlgl_font_8 = NULL; /* always loaded */ struct TileSet *sdlgl_font_14 = NULL; struct TileSet *sdlgl_font_20 = NULL; struct TileSet *sdlgl_font_22 = NULL; /* handles used by the rest of the code */ struct TileSet *sdlgl_font_map = NULL; struct TileSet *sdlgl_font_text = NULL; struct TileSet *sdlgl_font_menu = NULL; struct TileSet *sdlgl_font_message = NULL; struct TileSet *sdlgl_font_status = NULL; /* mapping from NetHack (terminal) colors */ tilecol_t termcolor_to_tilecol[CLR_MAX] = { BLUE, /* Note: not BLACK ! */ RED, GREEN, BROWN, BLUE, MAGENTA, CYAN, GREY, L_GREY, B_ORANGE, B_GREEN, B_YELLOW, B_BLUE, B_MAGENTA, B_CYAN, WHITE }; static struct TileSet *load_font(int size) { switch (size) { case 8: if (! sdlgl_font_8) sdlgl_font_8 = sdlgl_load_tileset("glfont8.png", 8,8, 1,0, NULL,NULL); return sdlgl_font_8; case 14: if (! sdlgl_font_14) sdlgl_font_14 = sdlgl_load_tileset("glfont14.png", 8,14, 1,0, NULL,NULL); return sdlgl_font_14; case 20: if (! sdlgl_font_20) sdlgl_font_20 = sdlgl_load_tileset("glfont20.png", 10,20, 1,0, NULL,NULL); return sdlgl_font_20; case 22: if (! sdlgl_font_22) sdlgl_font_22 = sdlgl_load_tileset("glfont22.png", 12,22, 1,0, NULL,NULL); return sdlgl_font_22; default: sdlgl_error("INTERNAL ERROR: bad font size %d\n", size); } return NULL; /* not reached */ } void sdlgl_font_startup(void) { int i; static int text_intensities[5] = { 0, 64, 136, 208, 255 }; /* initialise text colors */ for (i=0; i < 125; i++) { int r = text_intensities[TXT_GET_R(i)]; int g = text_intensities[TXT_GET_G(i)]; int b = text_intensities[TXT_GET_B(i)]; sdlgl_text_colors[i] = RGB_MAKE(r,g,b); } /* load the font sets */ load_font(8); /* the 8x8 font is always loaded */ sdlgl_font_map = load_font(iflags.wc_fontsiz_map); sdlgl_font_text = load_font(iflags.wc_fontsiz_text); sdlgl_font_menu = load_font(iflags.wc_fontsiz_menu); sdlgl_font_message = load_font(iflags.wc_fontsiz_message); sdlgl_font_status = load_font(iflags.wc_fontsiz_status); assert(sdlgl_font_8); assert(sdlgl_font_map); assert(sdlgl_font_text && sdlgl_font_menu); assert(sdlgl_font_message && sdlgl_font_status); } void sdlgl_font_shutdown(void) { if (sdlgl_font_8) { sdlgl_free_tileset(sdlgl_font_8); sdlgl_font_8 = NULL; } if (sdlgl_font_14) { sdlgl_free_tileset(sdlgl_font_14); sdlgl_font_14 = NULL; } if (sdlgl_font_20) { sdlgl_free_tileset(sdlgl_font_20); sdlgl_font_20 = NULL; } if (sdlgl_font_22) { sdlgl_free_tileset(sdlgl_font_22); sdlgl_font_22 = NULL; } sdlgl_font_map = NULL; sdlgl_font_text = sdlgl_font_menu = NULL; sdlgl_font_message = sdlgl_font_status = NULL; } int sdlgl_quantize_font(int size) { if (size <= 10) return 8; else if (size <= 16) return 14; else if (size <= 21) return 20; else return 22; } struct TileSet *sdlgl_next_narrower_font(int cur_h) { if (cur_h > 20 && sdlgl_font_20) return sdlgl_font_20; if (sdlgl_font_14) return sdlgl_font_14; return sdlgl_font_8; } #endif /* GL_GRAPHICS */ /*gl_font.c*/ slashem-0.0.7E7F3/win/gl/rip.txt0000664000076400007640000061467110545462317014425 0ustar alialiA = (133, 133, 127) B = (112, 111, 103) C = (31, 31, 30) D = (2, 71, 1) E = (11, 11, 7) F = (2, 67, 1) G = (21, 42, 10) H = (41, 41, 43) I = (35, 53, 17) J = (170, 170, 166) K = (40, 40, 35) L = (127, 126, 120) M = (209, 209, 207) N = (36, 36, 37) O = (155, 155, 150) P = (47, 47, 44) Q = (61, 61, 61) R = (9, 49, 3) S = (23, 23, 17) T = (26, 46, 13) U = (118, 117, 110) V = (3, 63, 0) W = (74, 74, 70) X = (69, 69, 75) Y = (196, 196, 193) Z = (64, 64, 60) a = (24, 24, 17) b = (146, 146, 140) c = (20, 20, 13) d = (140, 140, 134) e = (25, 49, 11) f = (137, 136, 131) g = (27, 28, 23) h = (6, 54, 2) i = (130, 130, 124) j = (53, 53, 45) k = (76, 76, 84) l = (42, 42, 44) m = (66, 66, 74) n = (98, 98, 92) o = (37, 37, 35) p = (38, 40, 26) q = (81, 81, 88) r = (45, 45, 46) s = (42, 44, 33) t = (53, 53, 57) u = (31, 51, 15) v = (31, 45, 15) w = (223, 223, 220) x = (57, 58, 57) y = (3, 58, 0) z = (56, 56, 59) 0 = (48, 48, 51) 1 = (64, 64, 70) 2 = (53, 52, 36) 3 = (183, 183, 180) 4 = (32, 48, 15) 5 = (51, 51, 47) 6 = (67, 67, 66) 7 = (32, 33, 25) 8 = (42, 46, 28) 9 = (71, 71, 73) _ = (124, 123, 115) # tile 0 (rip) { EEEEEEEEEEEEEEEEEEEEEEEEEEEEEE EEEEEEEEEEEEEEEEEEEEEEEEEEEEEE EEEEEEEEEEEEEEEEEEEEEEEEEEEEEE EEEEEEEEEEEEEEEEEEEEEEEEEEEEEE EEEEEEEEEEEEECEEEEEEEEEEEEEEEE EEEEEEEEEEEEEEEEEEEEEEEEEcEEEE EEEEEEEEEEEEEEEEEEEEEEEEcNEEEE EEEEEEEEEEEEEEEEEEEEEEEEcSEEEE EEEEEEEEEEEEEEEEEEEEEEEEEEEESE EEEEEEEEEEEEEEEEEEEEEEEEEEEr9E EEEEEEEEEEEEEEEEEEEEEEEEEEE5nc EEEEEEEEEEEEEEEEEEEEEEESEEEEcE EEEEEEEEEEEEEEEEEEEEEEEcScEEEE EEEEEEEEEEEEEEEEEEEEEEEEcSEEEE EEEEEEEEEEEEEEEEEEEEEEEEEEEEEE EEEEEEEEEEEEEEEEEEEEEEEEEEEEEE EEEEEEEEEEEEEEEEEEcCEEEEEEEEEE EEEEEEEEEEEEEEEEEECrEEEEEEEEEE cEEEEEEEEEEEEEEEEEECEEEEEEEEEE 7cEEEEEEEEEEEEEEEEEEEEEEEEEEEE EEEEEEEEEEEcEEEEEEEcEEEEEEEEEE EEEEEEEEEEECcEEEEENNEEEEEEEEEE EEEEEEEEEEEScEEEEcr0EEEEEEEEEE EEEEEEEEEEEEEEEEEEagEEEEEEEEEE EEEEEEEEEEEEEEEEEEEcEEEEEEEEEE EEEEEEEEEEEEEEEEEEEEEEEEEEEEEE EEEEEcEEEEEEEEEEEEEEEEEEEEEEEE EEEEEcEEEEEEEEEEEEEEEEEEEEEEEE EEEEEEEEEEEEEEEEEEEEEEEEEEEEEE EEEClEEEEEEEEcEEEEEEEEEEEEEEEE } # tile 1 (rip) { EEEEEESCcEEEEEEEEEEEEEEEEEEEEE EEEcEESgEEEEEEEEEEEEEEEEEEEEEE EcNSEEcEEEEEEEEEEEEEEEEEEEEEEE EESSEEEEEEEEEEEEEEEEEEEEEEEEEE EEEEEEEEEEENSEEEEEEEEEEEEEEEEE EEEEcEEEESCCHHEEEEEEEEEEEEEEEE EEEEEEEEESgcCgEEEEEEEEEEEEEEEE EEEcEEcEEEEEEEEEEEEEEEEEEEEEEE EEEEEcEEEEEEEEEEEEEEEEEEEEEEEE EEEEEEEEEEEEEEEEEEEEEEEEEEEEEE EEEEEEcEcEEEEEEEEEEEEEEEEEEEEE EEEEEEEEEEEEEEEEEEEECSEEEc0lgE EEEEEEEEEEEEEEEcSEEEgSEEEENCSE EEEEEEEEcEEEEEECNSEEEEEEEEEEEE EEEEEEEEEEEEEEENtHCSEEEEEEEEEE EEEEEEEEEEEcEEEC0gScEcccEEEEEc EEEEEEEEEEcEEEEcCEEEccSEEcEEEE EEEEEEEEEEEEEEEEcEcSScEcEEcSEE EEEEEEEEEEcEEEEcEEcSSEcScEcNtS EEEEEEEEEcEEccESgEcSEcSScEStkg EEEEEEEEEcSEcSgEEScESgSEcSSCgS EEEEEEEEEESEESEcSScEScSESSccSE EEEEEEEEEEEEEEESSgEEgEEgSgCgcE EEEEEEEEEEcEEcScESSESSgSCH1lSS EEEEEEEEEEEEEcEcSSSEggSSCNHCSS EEEEEEEEEEEcEEEESSSgSSSSSSEEgS cCScEEEEEEEEEcEEEESSSEEgSSSSSS Eg0CEEEEEEEcEEEESEEgSESSSESgSS EEtNEEEEEcEEEESSSESSESSgEECSSg EEcEEEEEEEEcEESSEEEESSEECSSSSS } # tile 2 (rip) { EEEEEEEEEcCEEEoSEEEEEEEEEEEEEE EEEEEEEEEcgEEEoSEEEEEEEEEEEEEE EEEEEEEEEEEEcNoSEEEEEcEEEEcEEc EEEEEEEEEEEEcSgEEEEEEEEEcEEEEE EEEEEEEEEEEEEEEEEEEEEEEEEEEEEE EEEEEEEEEEEEEEEEEEEEEEcEEEEcSE EEEEEEEEEEEEEEEEEEEcEEEcEEcEEc EEEEEEEEEEEEEEEEcEEEEEEccEccES EEEEEEEEEEEEEEEEEEcESEEcEEccEE EEEEEEEEEEEEEcEEcESScEEcEcEEcc EEEEEEEEEEEEEEEEEcCNESSEESEccE EEEEEEEEEEEEcEccEEEcNNNSccEESc EEEEEEEEEcEcEEEcEcEEHHgEcSgNlS EEEEEEcScEEcSEEESEcSCCcEESNt1g EEEEEENtSEEEEScEESEEScESccENlE EEcEcECHSEcESEcccESEcccScScSCS EcccccEcccccEScEccccSSESSSSSES cEEcScSSEESEcSSScSSESSgESSSSgE EccEcccccSScSSCSEcSSSSSSSgSSSc ccgcESccSSSSSgHHCEEgSSgSSSSSSg CNSSSEcSgEEgSSHmkCSSSSSSSSgSSS gCSScESSSgESSSC00CSSSSgSSgSSSS cSgEESSSSSgSSSSScSSSgSgSSSgSgS SSSggEECEESSgSSSSSCSSCECSCECEC SSSSScSSECSSSSSSSSSSCCSSSSCSCE SgSSSgSSgSSSSSSSgSSCCCgSCSSSSC SSSSSSSSSSSgSCSSSCCCSSSCCSCCCS gSgSCSSSSCECECECSCSCSSSCgCECCE SSSSSSSgSSSSCSCECCCECSCECECSSC SSCSCECECECENNCSCECNSCCCSgCCSC } # tile 3 (rip) { EEEEEEEEEEEcEEcEEcEEcEEcccEccc EEEEEEEEEEEccEccEccEccEcEcccEc EEcEEEcEccEEEcEEccEcEccccEcccc EcEEcEEEcEEEcEEcEcccHCcEcSgHNc ccEccEccEcccEEcEEcEgzlEcccNtQS EcEEccccEEcEEccccccSrCEScESgSc EcEcEcEEccEccccccEccCgEScEgcEc EEcEEccEScEScESSEcccSccSScScES ccEcSEcSEcSccEgEEgcEgEEgcEgSSg EcEcccEScSESccSScccSSScSScSScS SESEcEScSEcScEccScSSESSSccSSEg EgEcScEScSSEEgSSSScESccSSSSgSS cScSSESScSScSEgSSSccSScSSESSSS EESSESScSSSScEcgCSSgSSSgcESgSg cgcSSEcSSEEgSSSlzCCHSSSSSSgSSS SSEcgEcgSgcSSSSltCCCSSSSSSSSSS SSSSSgSSSSgSSSSCNScSSgSSCECECS ESSSSSSSSCHSSgSSgSSSSSSSSCECSS SgSSSSgSSCCSSSSSSSgSCSSCECgSCN SSSgSSSSSSSgSSSSgSgSSSSSCECECH SSSSSSgSSSSSgSCSSSSgSCECSCSCSC SSSSSCECECECSSSSSCSgCECECCSSSC SSCECECSCSCECSSCECECCNCCCCSCSN SCECSCECECECSSSSCCCCE1qHECECCS CECSSCCSCCSCCSCCECCCSl1CCCSCCS SCSSCCCgCCSCCECCCSSCCSSSCCSCCS CCSCCSSSCCSCECCSCSCCSCCCCSSCCS CCSSCCCCCCCSCCSCCSCCSCCCSCCCCC SSCSSCCCECCgCCECCCCCCgCSCCCSSC CECCCECNCCSCCSNNNEgCCCSNCCSCCC } # tile 4 (rip) { ccSccccSccSSSSSSSSSSSSSSSSSSSS EcSccEcScSSSSSSSSSSSSSSSSggSgS cEcccSScSSScSSSgSSgSSSgSgSSSgS cccccSSESSScSSScScSgCCSgSSSgSg ESccSSScSccSSSgCgSSg0NSSgSgSgg SgESSccSSSSSSgNt10gC10SSSgSggg SSccSSSgSSgSSSCl0NCglNgSggSggC SScSSSSSSSSSSSSScSSSSSgSggCSSC cESSSSSEgSSSSgSSSSgSgSSgSCCCSS SSgcSCCSSSgSSSSSgSSSSCCCSSggCS SSSEE0NSSSSSgSSSgCCSSHtNCSSCCg SSSSgHNSSSSSSSgSCzHgl1mNCCCCCC SgSSCHNSSgSCECSSCmtSN00NCCNCCN SSSSSHNECECECSSSC10SSCCCCCCCCN SSSSSSgSCSSCECSSSCggSCNNCNCNCC SSSSCSSSSSSSCSSSSSCNCCNCCgCCCC SSSCECSSCECSSSCSCSH0NCCCggCgSC CECECSSSSCECECECCSN0NCCCCCCCgC CCECSSCSCECCCSCgCCNHCCNCCNgggC NSCCCECESCgCCgSSSCCCCNNNCCggNC SC1HSCSCCCECSCSCCSCCCNNNCCCCCC EC10ECCECCSCCCSCCCCCCNNNNNCCCC CCNNCCCSSSSCCECgCCCCCNNNNNCNCC CECCCCECCCSCCSCCgCggNNNNNNNNCC gCCSC0HCCCCCgCCSCCCCNNNNNNNCCC CCCSCm0CECCECCSCCCNNNNNNNNCCNo CCCSSNCCCCSNCSCCCgCNNNNNNNNl0N gCgCCggCgCCCCgCNCCCNNNNNNNotQH CSCCCSCCSCCCCCSCCNNCNNNNNNCtQH CCCCgCCCCCCSCNCCCCNNNNNNNNNNHN } # tile 5 (rip) { SgggSgggggggggClt5lCCCCCCCCCCC gSgggggg77ggg7gH00HCCCCCCCCCCC SgSgggg7rHgg7CgCNCCgCoCCoCCNCC ggagg7ggHog7ggCggC7CCCgCCCCCCN ggCgaCgSCggCC7C7gCCCC7gCCCCCoN SgCggCggCCgCH0NCCCCCCCCCCCNNNN gSCggCgggg7CNHCgCNCCCCCNNNNNNN CSSCCSCCgCCCCCgCCCCCCNCNNNNNHH CCSgCSCCCCCCoCNoCCCCNNNNNNHNHz gCSCCCgCNNNNCNNNNNNoNHKHHHHNr9 CCgCCCNCNNNNNNNNNHHNHHHNHHHHrk CCNNNNNNNNNNNNHHNNNNNNNHHHHHHr CNNNNNCNNoCNNNNNNNNNNNNNHKHlHH NCNCCCCCCCCCNNCCNNNNNNNNNNHHHH CCSCCCCCCCCCCCCNNCNNNNNNNNNNNH CCgCoCCCCCCNoCNNNCoNNNNNNKHNNN CSCCCCCoCoNNCCNNNNNNNNNNNlHHHN CCCggCCCNHrNoCNNCNNNNNNNNNNHHN CCNCgCCCC0QHCNoCNNNNNNHKNNNHHH CSNNNCCCgt1HNNCNNNNNNNHHHHHHHH CCCr0NCCCNHCNNNNNNNNNNNNNHNHHK CCCNlNCCNCNoCNNNNNNNHNNNHHHHHH oCCCCNNCNNNNNCNNNNNNHHNlHHHHNH CCCNNCNNNNCNNNNNNNHHNNHHHHHHHH CCNNoNCNNCNNNNNNNNNHNHHHHNHHHH CCNCCNNCNNNNNNNNHNNHHHHHHHHHHr CCNNCNNNNNNNNNNHHHKHNHNHHHHHrQ NNNoNNNNNNNrrNNKHNNHHHHHHHHHHt CNNNNNNNNNNt0HNNHNHHHHHHHHHHHH NCNNNNNNNNNlHNHHNHHHHHHHHHHlrr } # tile 6 (rip) { CCCCCNNHHHHNHHNHHNNHNHNNNHNHHN CCCCCNNKHHHNHKHNHNNKHNNNNKHNHK oCNNNHHHHHHNNNHKHKNNHNNNHHNNHN CoNNNNHHHHHNNNNNHHNNHNNHNHNNNH NNNNlHHHHHHHHHNNHNNNHNNHKHKHHH NNHHHHHHHHHNKNHNNNNNNHKHNHNHHN NNHlHHHHHHHNHHNNNHNHHNHNHHHHHH r0HHHHllHHHNNNNNHHHNKHNHHNHHNH kXrNHH0tlHHHNNHHNKNHHNHKNHHHHH qqQrNH00HNNHNNHNHHHNHHHHHHHHHH qqX0NHHHNNNHHNKHNHNHHHHHHHHHHH kn1rNNNNHHHNHHHHHHHHNHHHHHHHHH xm0lNNNHHHNHHHHHHHHHHHHHHlt5ll HNHHHHHHHNHHHHNHHHHNHHHHHrQtlr NHKHNHNNHHHHHHHHHHHHHllHlr0rrr KHNr0lHNHHHHHHHHHHllHlrrlrHlrr HHH0tlHHHHHHHHHHHHlrllrrrlHlrl HHHllHHHHHHHHHHHHrrHlrrrrrlrr0 HHHHHHHHHHHHHrt0llllrrrlrrrrrr HHHHHHlrHHHHH01zlHlrrrrrrrrrrr HHHHHHt1rHHlllPrrrrrlrrlrrrrrr HHHHHH0trllrllllrrlrrrrllr0tQ0 lrHHHHHHrrrrrrrrrrrrlrr00z9nnk t1lHHlrlrllrlrlrl0rlrHrQXniJ33 r0lHllHHltzrlllrlHH0WnB_ibJ3YY rrllr00rlt1rrrr0tzZq_OJJ33YYY3 kk0H0kqk0lrH0Qt1ndJ3333Y3J33Y3 1100zkk1rNHQknUAbJ3YYY3Y3J333J HHlz110Hr01BUd3333333YYY33J3JJ lHlr0rHHQnfJJJJJ3JJ33Y33JJJJOJ } # tile 7 (rip) { HHNHHHHHHlrrrrrr0000tzzzzQknnz HNHHHHHHHlrlrlrrr000tzzztQXqqz HKHHHHHHHlrrrrr0000ttzzzzzQQQz HHHHHHllllrrrr000P00tzzzQQzttz HHHHHHlrrrrrr0P00000ttzzQmzzzz HHHHHllHrlrrrr0P000ttzzzzzzzzz HHHHHrllrrr0rr0000tttzzQzzQQzQ HHHHlrrrrrrr000r000tttzXQz11zm HHHlrrlrlrrrr00000ttttzkXttQmz llllrrrrr00rr000005tttz11zQ1z1 lrrrrlrr00P00P000000tttzzz1ztm lrrlrrrl0rrr00000tt0tttzttztzm lrrrrrrr0rr0000001Q0tttzzzQzz1 rrlrl00000000000tm1ttttttzmQz1 lrrrr0r0r00000t500tttttttzmQzm rr0rr000000000t0t0ttttttttz1Q1 rlr00P000000000ttttttttttttQmt rlrr00000000tt0ttttttzztzttQmz 0QXQr0000rrrtxtt5ttttzzzzztQ11 z6q1r0t0tzQQ9kz0tttttzzzzzzzz1 00rHlztxXn_UiL10ttttzzztQ1zQmz xqnBUALULdbdJO60tzzzzzztQQQ1QQ nfJ3YY3JJJObJJX0tzzzzzzzzQmzzm JJY33JJOOJJOObX0zzzzzQ1zQ1tQmm Y333JOOOJJOOOA15zzzzzQQ1QQmmmm J3OJOdOJ3JJObL10zzzzzzz11zkkmm JJObbdbO3JJdd_60rtzzzQ1tQ1QQ1m JOJOdddb3JObAU6ttzQQzQ1zQ1tQmk JJ3JbdfbJJbdAB6QZzQmQQ1Q11QQXk J3JJJddbJJOdiBmQXQzzmQz19km1mX } # tile 8 (rip) { ttttttzzzzzzttQQQQ61xQm111mmmm ttttttzzzzzzQQQQQQ116mm111mmmm zttzzzzzQxzQkqQQ1zQXnkmmmmmXXX zztzzzzzQ9kXqnmQQQ16qkmmmXmXXX zztzzzzQQqnkqnXQQmm11mmmXXmXXX zzzzzzQ1zmqXXmmXkm11mmmmXXXXXX QzQQzzQ1z1XQQ1Qmk111mmmmXXXXkX QQ1QzzQ1QQ1zQ1zQm111mmmmXXkXXX QmzQmzzz11111111mmQz1mmmXXmXXX Q1Q1Q1QQm1Q11Q11QmmQ1111mXmmXX Qzm1z1mmmQzmQz1Qz1m111111mmmmm 1zmm1z1mzQmmQz111mQz6111mmmmmm 1QQ1mzQmQmmQ1QQ1mm1Q11XqkmmmmX m1zQ1QQmmm1z1mzQm11mm1mnqmmmmX 1z1QQm1zmQz11111111111m9XmmXXm QQm1tmQzmmQQ1111111111mmmmmXXX 1mmQtmQQ1mmzQm11116m11mmmXXXXX QmtQmzQmzQ1mmm161mm1mmmmXXXXXX Q1Q1z1QQQQ1111111111mmmXXXXXXX QtmQz11zXk9X99X9X11mmmXXmXXXXX 11z11zzXBLi_BBBBB1z111m1XXXXXX 1m1mmQ1XBb3JOOJJJOiBBqWq91mmXX mXqkmmmmqOwYYYMwwwMJOfU_BqqkXk mXnqmmmXkJwMYYYMMwMYMMMM3JbBqq mmqXmm1XnJMMYYY3MMwwwwwwM33ObO mmmmmmm9BJMMMMYYYYMwwwwMYY33MM mmmmmm1XBJwwMYYYMYMwwwwYYY333M Xmmmmm1XBJwwwMYYYYYwwwwMY33333 kmmmmm19BJMMMwMYY3YMwwwwY33YY3 mmmmmm1kL3wwMMwM3Y33wwwwMJ333Y } # tile 9 (rip) { mmmmmXXm111119Bnqmkqqk1mmm11m1 mmmmmXXm111119nnkmkqq91mmm11m1 mmXXmXXXm1111XqqmmXXXXXmmmmmmm XXXXXXXXmm11mmkXmmmmXXXmmmmmmm XXXXX9XmmmmmmmmmmmmXXmXXXXXXXX XXkkXqkmmmmmmmXXXXXXXXXXXXXXmX XXkXXkX1mmmmmmXmXXXXXXXXXXXXXX kXmmmmmXmmmXXXXXXXXXXXXXXXXXXX XXXXmmkqXmXXmXXXXXXXXXXXkXkXXX XXXmmmkkXXXXXXkkXXXkXXkXXXXXkk mmmmmXXmXXXXX9qkXXXXXXXXXXXkkk mmXXXXXXXXXXXXkkkX9kk9kXkkXkkk mmXXXXXXXXkXXX9XXk99X9k9kW99kk XmXXXXXXXXXXXkXXX9kXXkWkWkkkXk XXXXXXXXkXXXXXk9Xk9kkWkXkk9Xkq XXXXXXXXmXXkXXk9kWk9kkk9kkkkkk XXXXXkXXk9Xk9XX9kk9XqkWk9kkkqk XXXXXXXknnXX9kk99k9knqkXkkkkkk XXkXXXXknqk9kW9Xk9kkqnnkkkqkkq kXXXXXk9mkkWkkXkqkkkmnBqkkkkqn XXXXkXX9X9kXkkknUnqkkn_qkkqqqq XXkXXXnBkkkkkkknnnqkknnqkqqqqq XXXkkXnLqkkkkkkkkkkqkkkkqqqqqq kmX9X9qnqkkqqqqqqqqkkqqqqqqqqq innkmkqqkkkqqqqqqqqqqqqqqqqkkk 3biBnnnqkkqqqqqqqqqqqqqqqqkkkk MY33JOfnkkkqqqqqqqqqqqqqqqqkXk YMMMMM3OLnkqqqqqqqqqqkqkkkkkkk YMMMwwwY3dBqnqqqqqqqqkqkqkqkkq 333MMwwwM33ObLnqqknUqkkkkqnqqB } # tile 10 (rip) { 1mmmm11m11mm11mmmm111kqX11mmmm 1mmmm11m11mm11mmmm11mkqX11mmmm mmmmXmXXXXmmmm11m111mX9mmmmmmm mmXXXXXXXXXXmm11mkqqX1m1XkXmmm XXXXXXXXXXXXXmmmXknBX1mXkqXmXX XXXkqkkXkqkXXXmmXXX9XmmnnqXmXX XkXkkkkkkkkkXXXXXm1mm11qqqkXXX 99XkkkkkmkkqkXXXXXXXX9kmkqk9XX kkkkXkkkkkknqkkXmXXXk_AkmXXXXX kkkkkkqkqXXqkkkqn9XXkB_kmXXXkX kkkkkkqqkkXkkXknUkXXmqq9mXXXXX kkqkqkqnqkkXkkkBUkXkXX9XXXkXXX qqkkkknBkkkkXkkqnkkkkXXXXXXXXk qqkqkkBBkmXkkXkkXkkkkkXXkXXXXk kkqkkkqqkkXkkXkkkkqnkkkXXXkXkX kqkkqkkkkXkkkkkkkkqqkkkXXXk9k9 qqqkkqkkXkkXkkXkkkkkkkkXkkkWk9 kqqqqkkkkkkXXXXXqkqkqkkkkXkkXk qqqqkkkkkkkk9Xkkkqkkkqkkkkkk9k nnqqqkkXXXXkkXkkkkqkqkkkkkkkkq qqqkkXkkkkXXXXXkkqkkqqkqkkkkqn qqkkkXkkkkkXkkXkqkqqqqqqkqkkkq qqkkXkkXXkkXkkXkkkqnqqqqqkqkkk qkkkXkkXkkXkkXkXmkqqqqqqqqqqkk kkkkkkkkkkkkkkkkkkkkqqqqqqqqqq kXkkkXkkXkkXXkXkkkkqqqqqqqqqkq kkkkXkkkkkXkkXkkXkqqqqqqqqqqqq kqkkkkkkkXkkkkkXkkqqqqqqqnqqqq qkkkkXkkXkkkkkXkkkkqqqqqnnqqnq nXkkkkkkkkkkkXkkkqqqqqqqqqqUin } # tile 11 (rip) { mmmkqkkkXXXXXXXXXk9Xk9Xk9Xk9Xk mmmkq9kkXXXXXXXXXk9Xk9Xk9XWkXW mmXXXXXXkqkkkkqkXkkkkkkkkkkWkk mmXXXkkkkkkqqkkkkkqkkqqkkkkkkk XXXXXkkkqkXkkqkkkqqkqqqkkkkkkk XXXXXkkkBBkkkkkqqnnqkkkkqqqqqq XXXXXkXknnkkqkqkqqqqkkqqqqqqqq XXXkXXkkkkkkkkkkkqkkqkkqqqqqqq kXXXXkkkkqqqkqkqkqqqqkqkkqkqqq XXXXXkkqkqqkkkkkkqqqqkkqkkkqqq XXkXXXkkkkqkqkqqkqkkqqqqqkkqqq kk9kXkkXkqkkkqkkkkqqqkkkqqqkqq 99kX9nqXkkkkqkkqqkqqqkqqqqqkqq 9XkXkBnXkkXkkkqkkkkkqqkqqkqqkq 9kXkkqkXkkkXkkkqkqkkqqqqqkqqqk kkXkkkkkkkkkkkqkkqqqqqqqqqqqqq kkXkkXkkkqkkkkqkqqqqqqqqqqqqqq 9XkkkkkkkkkqkqkkkqqqqqqqqqknLq k9kkkkkkkkkqqqqkkqqqqqqqqqqBUq k9kkkWkkkkqnqkqqqqqqqqqqqqqnLq qkkkkkkkqkkkqqqqqqqqqqqqqqqBLq qkkkkkqkkkqqqqqqqqqqqqqqqqqqBq kkkkkkkqqkqnnqqqkqqqqqqqqqqqqq kkkkkkkknqqUBnqqqqqqqqqqqqqqqq kkkqkkqnnnqnnqqqqqqqqnqqqqqqqq qkkkkqqnnnqqqqqqqqqqqqqqnqqqqB qqkkkqqqnqqqqqqBUnqqqqqqqqqqqU qqqkqqqqnnqqqqqqnnqqqqBqqqBqqq qqqqqqqqnqqqqqqqqqqqqBqqqqnqqq qqnnqqqqqqqqqqqqqqqqqqqqqqqqqq } # tile 12 (rip) { 9k9kkWkkkkkkkkqqqqqqqqqqqqqqqq kkWkWkkkkqkqkqqqqqqqqqqqqqqqqq kkkkkkkkkkkkqqqqqqqqqqqqqqqqqq kkkkkknnqkqqqqqqqqqqqqqqqqqqqq kkkkkqBUqqqqqqqqqqqqqqqqqqqqqq qqqqqqnnqqqqqqqqqqqqnqqqnnqqnq qqqqqqqqqqqqqqqnqnqqqqnqqnqqqq qqqqqqqqqqqqqqqqqnnqqnnqqqqqqq qqqqqqqqqqqqqqqqqqqqqqqqqqqnnq qqqqqqqqqqqBqqqqqqqqqqqqqqqqnq qqqqqqqqnqqnnqqqqqqqqqqqqqqqqq qqqqqnqqqqqqqqqqqqqqqqqqqqnBqq qqqqqqqqqqqqqqqqnqqnqBBBnqnqqq qqqqqqqqqqqqqqqqqqqqqqnUqqqqqq qqqqqqqqqqqBnqqqqqqqqqqqqqqqqU qqqqqqqqqqqnqqqqqqqBqqqqqqqqqn qqqqqqqqqqqqqqqnqqBqqqqqqqqqqq qqqqqqqqqqqqqqqqBqqqqqqqqqqqqq qqqqqqLUqqqUqqqqnqqqqqnqqUqqqq qqqqqqUiqqqqBqqqqqqqqqqqqnqqqq qqqqqqqqqqqqqqUqqqqqBqqqqqqqqq qqqqqBqqqqBqqqnqqqqqqqqqqqqqqq qqqqqnnqqUBqqqqqqBqqqqqqBqqqqq qqqqqqqqqqUqqqqqqqqqqqqqqqqqqq qqqqBqqqqBqnqqqqqqqqqqqqqqqqqk BqqBqqqqqqnUqqqqqqqqqqqqqkqqkq qqqqqqqqqLiqqqqqBqqqqqqqqkkkqq BqqqqqnLqqUqqqqqqqqqqqqqqqqkqq qqqqqqULqqqqqqqqqqqqqqqqqqqkqq qqqqqqqqqqqqqqqqqqqqqqqqqqqqqq } # tile 13 (rip) { qqqnBnqqqqqqqqqnBqqqqqqqqqqnBq qqqnBnqqqqqqqqqnBqqqqqqqqqqnBq qqqqqnqqBnqBBnqqqqqqqnnqqqBnnq qqqqqnBBnnnnnqnnqnnnqqnqqqnnqq qqqqnnUUnnqqqqBnqnnnqqqqqqqqqq qqqBUnnqqqqqqqqqqqqqqqqqqqqqqq qnqnBqqqqnnqqqqqqnqqqqqqqqqqqq nnqqqqnnqnBqnBqqqnnqqqqqqqqqqq qqqqqqqqqqqqnBqqqqqqqqqqnqqqnq qqqqqqqqqqqqqnqqqqqqqqqqqqqqqq qqqqqqqqqqqqqqqqqqqqqqqqqqqqqq qqqqqqqqqBLqqnqqqqqqqqqqqqqqqq qqqqqqqqqnnqBUnnUqqqqqqqqqqqqq qqqqnqqqqqqqnUnBUqqqqqqkqqkkqq Bqqqqqqqqqqqqqqqqqqqkkkqkqkqkk nqqqqqqqqqqqkqBnqkkqqqqkkqkkkq qqqqqqqqqqkkkqUUqqqkkqnqkkqkkk qqqqqLBqqqkkqqqqqqqqqnqqkkkkkk qqqqqnqqqqqkkqqqqqqqqqqqkkkkkk qqqqqqqqkqqqqqqqqqqqqqqqkkkkXk qqqqqqqqqqqqqqqqqqqqqqqqqkkqkk qqqqqqqqqqqqqqqqqqqqqqqqkqkkkX qqqqqqqqqqqqqqqqqqqqqqqqqqqkkX qqqqqqqqqqqqqqqqqqqqqqqqqqkkkk qqqqqqqqqqqqqqqqqqqqqqqqkkkqkk qqqqqqqqqqqqqqqkqnqqkkkkqkqkkX qqqqqqqqqqqqkmqkkqqqkmkkkkkqkk qqqqqqqqqkkkkmkkmkkkmkmkkqkkqk qqqqqqqqqkmkkmkkkmmkkmkkkkkqkk qqqqqqqqqkkmkqqqmkmmmkmkmkkkXk } # tile 14 (rip) { qqqqqqnnqnnqnnqqqqqqqqqnnqqUfq qqqqqqqnqqnqknqqqqqqqqqqnqqBLq qqqqqqqqqnnqqqnnqnnqqqqqqqknnk qqqqqqqnqqnqqqnqqnqqqqqqqqkqq9 qqqqqqnnqqqqqqqqqqqqqqqqkqkkkX qqqqqqqqqqqqqqqqqqqqqqqkkkkkXk qqnqqqqqqqqqqqqqnqqqkkkkkXkk9k qqqqqqqqqqqqqqqnnqkkkkXkkXk9kX qqqqqqqqqqqqqqnqqkqkkkkk9kkkXk qqqqkqqqqqqqqqqqkkkqXkk9kWkk99 qqqqqkkqkqqkqqqqkmkkXkkXk9X9kX qkqkkqkqkkkqkqqkkkkkk9kX9kXk9X qqkqkkkkqkkkkkqqkkkkkkWXkWXkqn qqkkkkqkkkkkkXqkkmXmk9kX9kXqnB kkkqqkkkkkkkkkkkkkkkXXXk9XXXkW kqkkkqqqkkXkkkkXk9XkkXX9XXXXmX kkkkkqnnqkmkXkm9kXXX9kXXkXXXXX kkXkkqqkmkk9kkXkkX9kXXXXXXXkqX kkkkkkkXXqqk999kkXX9XXXXXkXkkX kkXk9kXXkqnXXXk9XXXXkXXkXXXXXX kkk9XkWkX9kXXXXXXXkkqkXmXXXXXX k99kk9k9XXXXXXXkXXXkkkkXXXXkkk XkXkkXXXXkkXXkXXXXXXXkqXXXXkkk kXkkXXXXXXXXXXXXXXXXXXXXXXXXXX kkkkk9k9XXXXXkmmXXmXXXmXXXXkkX kkkkkkkkkXXkXX9kXXXXXXXXXXXkkX kkqkXkkkXkkXmknBn9mXmmXXkXXXXX kkkXXkkkkkkkXXnnqXmmmmXXXXkXXX kmXXXXkkkXXkkmkkmmmmmXXXXXXXkX kXXXXmmXXXXkkXXmmmmmmXXXkXkkXk } # tile 15 (rip) { kkkWk9k9kWkk9kWqnkXkX9kX9kX9kX kk9kWkWk9kWkWk9qn9XkX9kX9kX9kX kkkkkkkWX9kWkXXX9k9Xk99XXXXXXX 9k9k9kWk9k9k99kXX9XXkXXXkXXXXX kkWkXk9Xk9XX9kWkXXXXXXXXXXXk9k kkWk9XkkX9kXXXXXXXkXXXkXXXXqn9 k999k9kkXX9XkXXXXXXXXXXXXXXkqk 9kXXXk9XXXkXXXXXkXkXXkXXXkXXXW 9Xk9XXXXXXXXXkXXXXXmXXXmqnkXXk XX9kXXXXXkXXXXXXXXXXkk9Xqqk9kk XkXXXkXXXXXkmXXXXXXkqqkkkkXkkX XXXXXXXkXXXXXXXXXXmkBnXkkXXXXX qXXXkXXXXXXXXXkXXkX9nqXkXXXXXX qXXXXXXXXmXXXXXXXkkXkkXmmXXXXm k9XkXXXXXXXXXXXkkXXXXXmmmmXXmm XXXmXXXXXXkXkkmnBkXXXmmmmm1m11 XXXXXXXXXXXXkkmn_kmXmmmmmm1111 XXqnnkmkXkkXXXXkkmmm1111111111 XXkqqXXkXkkXmXXmmkkm1116111111 XXXkkXkkXXXmmmm1Xkk1111Z6116X1 XXkkXXXmmmmmmm111X61Q1111Z1qnZ kkkkkXmmmm11111611111Q111119q1 kkXkqXmmm1111111Q61111Q1111111 X9kkXm1111111Q611Q11QQ1zQ1zQ1z XXkXmm111111Q111QQQQQm1Q11Q1m9 kXXXmm11116QQ11QQ9mQ11111Q116n XXqkm11116ZmQz11XUnk11QzQ1QQQm XXkXm11611Q11QQQ9nn611m1QQ11QQ kXmmmm1Z11Q111zQXkmxQXkmQz111z qqXmm111Q11zQ1tQ1QQ6zQ1QQ1QQ1z } # tile 16 (rip) { 9kX9kXm9nqXX9kXXXXXXXXXXXXXXXX 9kX9kXXknqXX9kXXXXXXXXXXXXXXXX XXXXXXqnXXXXXXXkXkkXXkXXkXkXkX XXkXX9kqXXXXkXXXX99XXXXXXXXXXX XXXXXXXXXXXXXXXXXXkXXkXXk9XXXX XXXXXXXXXXkXXkXXkXXXXXXmnBkmXX XXkXXkXXXXXXXXXXmXXXXXmmqn9mXX kkkkXXXkXXXXXXXXXXXXXXXmkqXXXX qnkkXXXXXXXmXmXkqXmXmXXXXXXXmX qqqkXkkXXXXXmmmkkXmmmmmmmmmmmm mXkXXkkXXXXXmmmmXmmmmmmmmmmXXm XXXkXXXXXkXXmm6kqXmmXmm6mmmqB9 XXmXXkXXXXXXmm1kqX1mmmmX61mkq9 mmmmXkkkXXXXXmmkqm1mmmmm11mm6m mmmmmXnnqkXXXmmmmmmmXmmm11111m m11mmmknkXXXXm111mmmmmmm11111m 1111mmm1XXkXXm11mmmmmmmm1111mX 11111mmmXXXXXm11mmmmm11111mXXq 161111mmXXXXXX1mmmm1mm1111XXXk 1Z11111mmXXXXXmmmm11mmmmmXXXXm Q11Qz161mmXXkXmmmmmmmmmmXXmmmm Q111Q111mmmmkkXmmXmmmmXmmXmm11 QQ6111QQ1mmmkqkmmXXmmXXmmmm11Q Q1Q11z1111XqqqmmmXXmmmmmmm1111 qq611QQ111mkqqXmmXmmmm1mm11QQ1 nnX1111Q11m1kqXmmmmmm11111mQz1 XmQQ1QQ1zQmmXXmmmm11161zQ111mm Q1QQ1zQ1Q1mmmmmmmm11Q11Q1m11Qm Q1Q11QQm111mmmmmm111zQ11111Qz1 11zmkkX1zzQ1mm1mmQQ1ztQm1Q1mmm } # tile 17 (rip) { XXXX9nULkmXXXXXXXXXXXXXXXXXXXX XXXX9qUUkXXXXXXXXXXXXXXXXXXmXm kXXXXkkkXXXXkXkXXXXXXXXXXXXXXX XXkXXXmmXkkXXXXXXXXXXmXmmmmmmm XXXXXXXXXkqkmXXXXXXmXXXmmmmmmm XXXXXXXXXkqXmXmXmXmmmmmX11mmmm XXXmXmXXXkkXmmmmmmmmmmmmmmmmmm XXmXXXXXXmmXmmmmmmmmXXXmXXmmmm mXXXmXmmXXXXmmX11mXXXXXXXXXXXm mmmXXXXXXXXXXmX91XXXXXXXXXXXmm mmmXXXXXXXXXXXXXXXXXXkXXkXXXmm 1mXXXXXXkkXXXXXkqXkqqkXkkXXXmm 1mXXXkkXkkXXXXXkkXXkqkXkXXXXmm mXXXXkkXXXXXXkXXXXXXqkXmXXXXmm XXXkXXXmmXXkkq9XXXXXXXXmXXXmmX XXmkkXmmmmXmkkXXXXXXXXXmXXXkkX XXmkqXmmmmmmmmXXmmmmXXmmmmmkkX kmmmXmmmmmmmmmmXXXXmmmmmmmmXX1 Xmmmmmm11XkqkmmmXXXXmmmmm1Q11Q mmmmmm161XknqXmmmmXXmmm111zQ1z 1111111Q1mXXXmmmmmmmmm11QQ1Qz1 61Q11QQ1Q11mmmmmmmXkkX1k1zQQzQ 11zQ1zQ1zQ1mmmmmmmkqkX1kmzzQQt 61zQ1zzQ1Qz1mmmmmmXXX1zzQ1zQ1z XXQQ1Qzz11Qmm1mmmm1QmQttzQzQ1z XkmQz1QQ11m1111mmmQz1Qzzzzzzzz 1Q1m1z11zQmz1mzQmQQmzzz1QzQzz1 1QzmmQQ1Q1m1QQQ1mzzQzQmQzzQzz1 m1zQmmQzmm1mQzmm1zzzzXqztzzzzz QzmQzmQzm1zz11QtzmQttknQtzzzzz } # tile 18 (rip) { XXXXXXXXXXXXXXXXXXXXXmXXXXXXXX XmXmXmXmXmXmXmXmXmXmXXXXXXXXXX mmmmmmmmmmmmmXXXXXXXXmXXXXXXXX mmmmmmmm6mmmmmmmmmmmmmmmmmmmmm XX6Xm6XmX6mmmmmmmmmmmmmmmmmmmm kqX11mmmmmXXXXXmm11m11m11m11m6 9kX111mmXXXXXXXmm1111111111116 mmmmm11mXXXXXXXmm1111111111111 mmmmmXXXXXXXXXmmm1111111111111 mmXXXXXXkXXkXXXmm1111111111111 mXXXXXXXXXXXXXXXm1111111111111 mmXXXXmmmmXXXXXXm11111m61m6111 mXXXXmmmmmmXXkXXX11m111116m111 XXmmmmmmmmmmXXXXXXmm11116mmm11 XXmmm111111mmmmXXmXXmmXmmmm111 XXmm11111111mmmmmmmXXmmXmmXX11 mmm1111QZQQ11mXXmmmmXXmXXmXXm1 11Q11Q111Qz111qqkX1mmmmXXmmmmm Q11QQ1QQ1QQQQZkkX11161XXmmmmmm zQ1Qz1Qz11QQQQ1QxZ61Z1m1mmmmmm Qz1Qz11z1QzmQz1Qz1Qz1QzQ111111 9km1zzQ1Q1Q1Q1QQQ1QQQQQ1QQ11Q1 kn1Qzz11tQ1zQ1zQQQQQz111Qz1Qz1 QmQtz1QzzQQzzzmQzmQz1Qzzzz11z1 zQQzzQQz1zQQQzQ1QQzz1mmQQzQzQQ zzzQzzQQ1Qz11ztQ1Qzz1XkmQzzQQz Qzzzz11zzzzzzQzzQ1QzzQQzzz11t1 QzQQzQzzzzzQQQzzz1QzQQtxzzQQzQ tzmQzzzzzzzmQzzQQtzz1QzQQzzzzz zzzzzzzzzzzzzz11zzzzzzzzQ1zQ1z } # tile 19 (rip) { XXXXXXXXXXXXXXXXXmXXXXXXXXXXXX XXXXXXXXXXXmXmXmXXXXXmXXXXXXXX XXXXXXXXXmXXXXXXXXXXXXXXXXXXXX mmmmmmmmmXXXmXmXmXmXmXmXXXXXmX mXXmmmmmmmXXXXXXXXXXXXXmXXXXXX kqqk1Xm1Xm1m11mmmmmmmmmXXXmXmX 9kkX6m61m61m11mm1mmmmmmmmmmmmm X6116111m11Xm1m11m96XXXmmmmmmm kqm61m1111mqk111111mqqqX1mmm6m Xk611111111kX1111116kkkm6m61Xm 11111111111111111m111661mm11mm 11111111111111111111mmmmmmmmXX 66161161611111111111mmmmmmXXXX 1Z61Z1111m6116111mmmmmmmmmXXXX 6Xq9Z1Xk6XkX1Z16XmmXXXXmXXXXXX 11k911XX1XX11611mmkkkXXnqXXkkk 11111111111Z1111mXkqXmXnnmXkqq mmmmm11mm1111mmmXmXX1mXqkm1mmm mmmmm1mmmm11mmmkkX1111mXX11611 mmmmmmmmmmmmmmmkqX11ZQZmQQ61QZ 1mmmmmmmmmmmmmmmm11Q11Q11Q11Z1 1m11m11mm11mm1Q1Q11QQQ1QQ1QQ1Q 16116116161111zQZQ11Q11z11zQ1z Qzm1z1QzzQ1zQQQQ1zQmnkz61Q11ZQ Q1QQQQQzzzQQQQQkqQz1qkQQQ1QQQQ Q1z1mzQQQzQmQzQkn6xZkXQzQ1zQQQ 1z1QQ11z1Q1kmQz1mxxQZQQ1QQ1QzQ zzQQzQztQQzX1xzzQQQz1zz1Qz1QzQ zzzzzzQQzzzQxzzzz1Qz1QztzQzzz1 Q1zQ1QmkQQ1Qzz11QQzzzzzzQ1zxQQ } # tile 20 (rip) { EEEgrEEEEEEEECEEEEEEEEEEEEEEcS EEEcgEEEEEEESSEEEEEEEEEEEEESNN EEEEEEEEEEESSEEEEEEEEEEEEEENzS EEEEEEEEEEEcEEEEEEEEEEEEcSESNg EEEEEEEEgcEEEEEEEEEEEEEESCEEEN EEEEEEEEEEEEEEEEEEEEEEEEEcEEEE EEEEEEEEEEEEEEEEEEEEEEEEEEEcEE EEEEEEEEEEEEEEEEEEEEEEEEEEEccc EEEEEEEEEEEEEEEEEEEcEEcccccEcc EEEEEEEEEEEEEEEEEcEEcSCccESSSC EEEEEEEEEEEEEEEEEccEcCNccSSSgN EEEEEEEEEEEEEEccEcccEESEESSSSg EEEEEEEEEEEEEEcEEcEEccccSgSSSS EEEEEEEEEEEEEEEEcccESccSSSSSSg EEEEEEEEEEEEccEccESSEcSSSSgSSS EEEEEEEEEEEEEcccSEcCESSSSgSSgS EEEEEEEEEcEcEcESSEcSSgSgSSgSSS EEEEECgEEEcEESEEgScESSgNNgSSgS EcScEHCEcEcEScEgSSSEgSSlNSCCEC EECgECgcccEcSSSSSggSSSgHNSCCgS EEEccScEccSESSScgHCSSSSSCCCECE EEEEcEcSEcgSSSSSSNCCECSSgCSCCC EcSSccSSSSSSSSSSSSSSCSCNCSSCCE cSCCSEESSSSSSgSgSgSgCSg10CSCCC cSCSScSSSSSSSSSCCSCCgCClHCSCCS gSEcgSSgSgSCSgSCCSgNECCSCCCgCC SSSCHgcSNHl0NSSSSSCCCSSgCCCCCC SSSNlCSgCNNNCgSCCgCNSCCCgCCCCC SSSNHgSSSgSSCNCgCSN0CCNCCSCCSC SSSSCSSgSSgSlmCCSSCNSCCSCNSCCC } # tile 21 (rip) { cEEgNcEEcEESEESESESEgEECEECSgS SEENtcEEccESSSEESCEESSESSESSSS EEEESEEcScEECNgEcScECEEgSSCECE EEcEEcEcEScESCSSESESEEEEEEESN0 gEcEEcccEcSEcSEECEECEgCCCHNtkq cEEcEcEESSEEEgEEcEEEgNmnfObOJO EcccEcccESESSEECCC0mBUdJ33Y333 EcEcSESScEgScEgNzkUb3YYYYYYY33 ScSSSEcSScEgESNqbJ3MMYYYY333MY CcSSgESSgSEEHkiOJYYMMYYYYYYYYM CSCSSSSSSSCCqJMM3YYMMMMMYYM33Y Sg1lSSgSSSHnJwMYMwwwwMMwMYMY33 cCmmtHCCHmUOMMMYYwwwwMwwwMYYYY ECtkktNNqb3YMMYYYwwwMMwMMwYYMM gSCCCCENbYMYMwwMwwwwwMMMwMYMMY SSccSENq3MMwwwMwwwwMwwMwMMwMMw SSSSSSkOYMMwwwMMwwMMMwwwMMwMMw gSScCmfYwwMMwwwwwwwwMMwwMMwwMM ECSENU3wwwMMMwwwwwwwMwwwwwwwMM SSgEHOMwwMMwMMwwwwwwwwwwwwwMMw CSECm3MMwwwwwwwwwwwwwwwwwwMMww SSSlBYMwwwwwwwwwwwwwwwwwwMMMww CSSkbYwwwwwwwwwwwwwwwwwwwwMwww SSC_MMwwwwwwwwwwwwwMwMMwwwwwww SC0AMMwMwwwwwwwwwwwwwMMwwwMwww SNtAMwwMwwwwwwwwwwwwwwwwwwMMww gCmbMMMwwwwwwwwwwwwwwwwwwwwwwM gCmOMYMwwwwwwwwwwwwwwwwwwwwMwY CNmOMYMwwwwwwwMwwwwwwwwwwMMwMY SCqOY3MwwwwwwwwwwwwwwwwwMMwwww } # tile 22 (rip) { CCSSSCCECSgSCNCECCCgSCSCSCNHNC CCSSCCCCSSSSSSSggCCSSSSCgCHtlC CECCCECgSSSCECSCCgSSNCSgSSCCSg lNCCSCCCCNCCCCSSCSCCCgCSCCECNN qqmtN1ttt10NCCSCECCCSCCSCCgN00 JJbdbffLUqm0NSCCCCCSSCNECCSCNC 33JJJJOObfUnqktHNCCgCCCNCgSCCE 333JJJOOJJOOOdnktNCCCgCCCSSCCC 3YY333J33JJJOOfAUq1HNCNSCNSCCC YYY33333JOOOOOdbbLnk1HCCCNgCCC MMYYY33YJOddJJfdOfdinmNNNCCCCC MYYY3YYY3JbJObdbOdddfBktNCCCCN YMYYYY333JJOOOOObObAbfBqm0CCNC MMY3YY33333OOJJOOJbAOdiABkHNNN MM3YMY3Y333ObOdOJOOOObffiBqtN0 MYMYYYMY33JJOOOJObOJJbfAiLnmtl MYYYYMMMY3JJJJ3JJbOJOOiLiLnnkH MYMM333MM3OJOJ33JJOOdfL__iiBqt MMwMY3YYY3JJJ3333JJOiLiLLALUBk MMwMMYYYYY3J333J33JOLLfiAf__UB wM3MMYY3YY33JJJJ33JdfAfdfLU__U MMYYMYMY33Y33JJJ3JOfffdffiiBB_ wMMMMYYM33YY33JJOJOfddbdffiUnU wYMYMY3YYY333J3JJbffbOOOdfLAin MYMMMYYYYYYY3Y3JJObbdbOdddffiB MYwMYYYMYYYY333JJJObdbbffddiU_ wMYYYYYMYY333JJJ3JbbJbfddf_iin MwMYYYMwM3JJJOJ33JOfbbfdfi_iiB YMMYMMMwM3bJJJ33J3OffdddfLLiiU MYMYYMMM3JJJJJ3JJ3JOObdddf_iin } # tile 23 (rip) { gCCSCSCSNCCgCCgCCCCNNgCCCCCCCC EgECCgSSCCCSgCSCCN00NCCCCSCCCS CSNCSSCCgCCCCSCCNmmmNggCCCCNCC CSCNNCgCCCCCCCNNCtt0CgCCCCCCCC NgCN0CCSCCCSgC0HCCCCCCCCNCSCCC CCSCNgCCSCCCCNCCSCCNCCNCCCCCCC CCSCCCCCCCCCCCCCgCCCCCCCNCCCCC CCSCCCCCCCCSCCCCCCCCCNCCCCNCCN CSCCCgCCgCCCCCNCCNCNCCCNCCCCNN gCNCCCNHCCCCNCCCCCCCCCNCCNNCCN CCCCCN00HNCCCCNCCNCCNNNCNNNNCC NCNNCNHNNNNNNNCNNCCNCCCNNCCNNC NCNNCNNNNNNNNNNNNNHrNCNNCNCNNN NHNNNNNNNNNNNNNNNNrtNNNCNNNNNN tttlNHHNHlllHNNNNNNNNCCNNNCNNC 000lHNNHHHHHHNHNNNNNrlCNNNCNNC NHHHHNHHHHHHHHHHNlHlz0NNNNNNNN HNHHNHHHHHHHHHHHHHt10HHHHHNoNN zHHNNHlHHHHHHHHHHHt1lHHllHNl0N ktNNNHHHHHHHHHHHHH0tlHHrlHrQmH BmHNHHHHHHHHHHHHHNHlHHHHHrQqq0 Un0NHHHHHHHHHNNHHNNl0lNHHHtkq0 _U1lNHHHHHHHHNNHHNNltrNHHNNtQ0 B_nQNHHHHHHHHHHNNHHNllHNNHHHll BBBqzlHHHHHHHllHNNNNNHHrrHHNNH nn_BkrNHHHHHHHHHHNHlNNlz0HHHHH B__BXrNHHHHHNNHHNHHHHHHllHHHHN BBUBqQ0rHHHHHNHNHHHNHHHHHHHHlK BnUBnXz0lHHHHHHHHHNNHHHHHHHHHH BU__BQlHHHHHHHHNNHHHHHHHHHHHNH } # tile 24 (rip) { CCCCgCCCCCCCgCCCCCNNNNNNNNNNNN CCCCCCCSCNCCCCCCNCCNNHlNNNCCNN CCCCSCCCCCCNCCNCgCNNNNHNNNNNNN NllNCCNCCNCCCCgzkHCNNHHNNNNNNN HttHCCCCNCCCNCCkBrCNNHHNNNNNNN NCNNCCNCCCCCNNCHrCCNHHHNNNNNNN CCCCCNCCNN0lNNCCClHNNHHHNNHNNN CCNCCNNCCltzlCNCNt0NNHHHHNHHNH NCNNCCNNCNHNNNNNNt0HHHHHHHNNHN CNNCNCNNCCNCNNNNNrlNHrrlHHHHHN NNCNNCCNNCNCNNNNNNNNHr0lHHHHHH CNCCNCNNNNNNNNNNNNNHrllHHHNNHH NNNNNNCNNNNNNNNNHNHlrlHHHHNHHH NNNNNNNNNNNNNNNHlHHHrlHHHHHHHH NNCNNNNNNNNNNNHHHHHl0rHHHHHHHH NNCoNNNNNNNNNHHHHrrrrlHHHHHHHH NNNNNNNNNNNNHHHHl000lHHHllrlHH NNNNNNNNNNHNNHHr0rrrrlHH0z1tHl NNNNNNl00rHNNlr00lHlllHlr0z0lr NHNNHN0zz0r0000rl0rHHHHrlHHlrr HHHHHHllltXnkQrNrk1KHHHrrllrrl HllrrlrrH019mzQ1mkQHlllllrrlrz lrr00r00rr00HrkqkmtHlrrHlrrl01 HllllrllHllHHlmQrlHHHlrlrrrrrP HH00HllHHHHHHlt0NHlllrr0rrrrrr Hrt0HHHHHHHHHHHHlrrrrrr00r00r0 t1rHHHHHHHHHllHlrrlrl00rrrr000 0tlHHllHlllllrrlrrrrrrP00r00t0 HHHHlrllrrrrrrlrrlrr0rr000000t HHHllHlrrrlrlrrrr0rr00000r000t } # tile 25 (rip) { NoNNNNNNNNHNNHHHNHHHHHHHlllllr NNNNNNNNNHHNNHHHHHHHHHHHlrrlHl NNNNNNNNHNNHHHHHNHHHHHHHlrHllH NNNNKHNHHHNHHH0ttlHHHlllrrlHr6 NNNHHHHHHHHHHltQQrHHHlrrrrrHxB NHNNHNHHNNHHHHrrrHlrHlrHlHNtnJ HNNHHNHHNHHHHHHHHHlllrlNNtq_OY NNHHHHHHHHHHHHHHHrlHrlr0QqO3YY HHHHHHKHHHHHHHlrrrrrlNrnfJYYYM HHNNrQQtlHHllllrlrllrQnO3MYYYM HHNNrXkQrHlrrrHlrll09UOYMMYYYY HHHHlrrrHlrrHHrrlHHXJ33YYMYYMM HHHHHHHHlllrllrHH0qbYMYYYYYYMM HHHHHHlrrlHrrlrltqOMMYYMYYMMMY HHHHrrlHrrrrrlNznJYMMMMMMYMYMM Hr1zlrllrlrlHlkUbYMYYMMYMwwMMY H0k1lrrrrrrll6fJY3YYMMMMMwwMYY ll00rrlrlrlN6i3M3YYYMMYMMMYY3J llllrrrrrH0ki3MMYMMMY33YYMY3JJ rrrrrrrrrHZf3MMYMYYY3JJ33MM3J3 llrr0rrrlzn3M33JJJJJ3JOJJ333J3 Qzrrrrl0k_JY333JJJJJJJ33J333YY m10lr0rQ_3M333JJJOJ3J3YY333YYY 0r0000tkb3Y3JJJJOJJJOJ3YYY33YY 0zt0ttqiJJ3JJJJ3JJJJJJ33J3J333 QmztzmL3JJJJOJYYY333JJJJJJJJ33 ttttX_O333JJJ33MwMY3JJ33JJJJ3Y tt0QnbJ3YY333JYMMwMYJJ333YY33M tttq_O33J3Y33JYMMwwYJJ3J3YY33Y tz1UJJJ3333J3YMwwMY3JOJJ3YY33Y } # tile 26 (rip) { lHlNNr9BLOJ333JJY3YY33Y33JObdO rr00QqiJ333333JJYMwwYYYY33Odfd 0Q1BOYYY33333JJJ3wMMwwwYY3JOdd qUfOYMMYY33333JJYMMMwwMY3JOOOd bJYYY3YYMY3YYYJ3MMMMwwYYJbOJJb YYYY333YMY3YYY333YwwwMMJObJJOO MMMMY3Y3YYMYYY333YMMMM3bddOOJO YMwwMYYY3YMMY3Y333Y3YJOiifOOJO YYMMwMMYY3YMMY3333JJOOALfOOJJJ YYYMwYYYMYYYMYYY33JOfLLfbJJOJ3 MMMMYY33YMMMMMMYM3Jb_ULbOJJJJY MMwMYMYJ3YMMMYYMwYJfLiddOObOYY YMwYYMYY33YMYMYMMY3bdbObOOOJMw MMMYYYMM3J3YYYYMMY3JOJJOOOJ3MM MMMY3YYM33JJJJYYYJJ3JJJJJJO333 Y3333JYMMYYJOJ3YYJJYY3J3JOJJ3J 33JJ3J3YMMYJJJJ3JJ3YMY3JJJJJ33 33Y3YJ33MMMYJOJOOJYMYYYY3JJ3J3 3YYYYY3JYYYMYJOOO3YYYMMYYYYY33 3YYYMM3JJJ3YM3OOJY33YMYYYMMYYY YMYYYY33OOJJJJOOJJJ3MYYYwwMMMY YMY33Y33JJJOOOOJJJ3YMYYYMwYMMM YMY3333333JbfdOJ3J33YY3J3YYYY3 YY3JJ333JJJOffddddOJJOOdOJObOO 3J3JJJJJJJOinWkqqWnnqnqkkqnqqq JJ333JJJJJOUZvv484v8TvI44v4444 YYYYYJOJJJOBZI44p82244p444pIv8 MMwM3JOJOJJnZZ222ZZx2222222222 wwwYJJJJJ3JnWWWWWWZWWWWWWWWWWW YMMYJJJJJJOnWZWZWZWWWWZnWWnWZW } # tile 27 (rip) { OJOOObbOJJJbf_6QXzxQQ1QQm9X111 ddbbOOOO3JJOOiXQm0tQzQ1zQ11111 ddAfbOJYYYYYJAkZ1ttQmQz1m1zQ11 ddfbOJ3YY3JO_n6Z6zxZm1Q1m11Q11 dbOJJJ33JbBkz0tZ6QQZ1111111111 OJJJ3J3JB1NHHrZm6Q11zQ1zQ1111m OJ3Y3YOBtCgCNHt66111Q11Q11116m OJYYYYLrgCNNNNlx61QQ11111111m1 33YMYJnNCClHKoNt161QQQQQQzQQQQ 33YMYJngCNHHoCN5Q1Q1BLAffiiLLL YYYYYYUNCNHKNNH0xQQqOYYMMYMY3Y ww33YMdtNNHHPHPlr19nJYY3YMMY33 ww333MOklCKHlHHoNznd3Y333YYYY3 ww333MJ_ktPjrHPPtXL3YYY3333MY3 YY33YYY3Jinq6QqBUbJ33YMY33Y333 33Y333YYY3ObdfbJJ333YMMY33YYY3 3YMY333YYYMMYMYMMYYYMMYY33YMMY YMwMYY33YYYMMYYYYYYYYYMMYY33YY YwwMMYYJ33YMMMYYY3333YYYMY33YY MwYMMMY333YYMMMMY33333Y3YMYY3Y YYYMwwM3YYMMMYMYY33Y3333YMYYYJ YYYYMwMY3YMYMMMYYY3YMY33YYMYJJ Y3JYMMMM3YMMMYMMMY3YwM3333Y3Ob OOfJYYwMY3YYMMMMM33YwYJJOOJbLL nqkqUJMwMY3MMYYY333Yw3LnqnqqqB 448v4BJMwY3MY33JJ3J3wJqIv8ev2n 4v4v88ZBMwYMYY3JJJ33MJn2pIvv8n 22222TT2_3MYYYYYJ333YdkZ2222ZU WWWWW8I82iMY3YwMYY3J3_ZWWWWZZA WZ2WZWWZ8nJYYYMwwM33YiZZWZW2Zf } # tile 28 (rip) { mmmmmm1kAYwwwwwMYY33YwwwM33333 1mmmmmQkAYwwwwwM3YYY3MwwwY33YY 1mmmmm19U3wwwwMMYYYMY3YwMY33YM 1mmmmXmXnLJ3MwYYYYYY3JJMM333YM 1mXmmXXXkmkUOYJ3Y33Y3OOYYYYYYM mXqkmXmmXzNrzkfJ33Y3JJJ33YY3Yw 1mqkmXkqktNNgNkA3J3YJJJY33YYYY mkqkXXnBkQrrNCNBJ33Y333MY3YYM3 nUnkXqnnkQ0NCNCqbJY33YMYYMYMY3 ffqmXkkq91zNCC7kO3MY33YYYMMYYM JbqX9XXXXkmHCCgnJMMM33YMMMMYYw 3JBnnkX9XqqHCHHLMwMMYYMMY3MY3M 3JfnmmXkkqk5NlqOwMYY3YYYYYY33w 33J_kkkkkkkmxkbYM3J3YYYYYYY33w J333JbBqqnB_bJYMYJJ3YY3333wM3M 33YYYOfLfbJ3YYYYYOJYwM3Y33MwMM YY3JJObO3YMMY333JAOYMM3Y33wwww 33JJOAbJ333MY33ObfO3333Y3Ywwww 33bfi_dJ33JYY3JJdO3333YY3YMwww 3Jf_Uib33Y333JJOO33YYYMYYYYMww JbiifbJY3YwYJJJJ33YMMMMMYYYYMw bfAiAO33JYMY3JJ333YMMwYMMMYYMw fLfAfJJJJJ3333J3YJ3MwMYMMMY3YM LiAbJOJJJOOOJObbOOOJOJJJ33JJOJ _AdOJJJO3O_nnnqnqqnnnnnBnnBBnq LdOJ333J3OB2784pIv4888884Tp88T AOJYMwMYYJB2jZIv4v844848444pIv bJJYwwwMYOBZZW2222222222222222 OJJMwwwwMOnWWZWWWWZWWWZWWWWWWW JJ33YMwwwJWWZWWZWWnWnBBWnBBBnB } # tile 29 (rip) { 3J33YYMwMwM3JObLnkBUqkqkkqqqqB 3J33333MwwwMY3YOAUUUqkkkkqnqkn Y33J3333wwwMwwYYYMOqqqqkkqnqkk MY333YY3MwwwwwMMww3dfBkkqkqqqk MMY33MYYYwwwwwwwwMMM3bnnkkqqqq MMM33MMMMwwwwwwwwwwwwM3inkkkqk MMYY3YYMYMwwwwwwwwwwMww3Oiqkkk 3MYY33YYYYMwwwwwwwwwYYMwM3_nqq YYYY3333YwwwwwwwwwwYY3YwMYYJUk MYYY3YYYYMwMMwwwwwwMY33YYYMMJi MMYYYMMMYYYYYMwwwwwwYYY3J3Yww3 wMY33wwwwMYYYMwwwwwwY3YY3YMMMM wYY33MwwwMYYYYMMMwwwYYYYYYYMMM MMY3YYwwwMMY3JY3YMwwYYMY3YYwwM wMY33YwwwwwM3333Y3YMMMYY33YMwM wwMYYMwwwwwMM33YY3YYYYMYY33YMM wwwMYwwwwwwwwMMYYY3YYYMY3YYYYw wwMY3wwwwwwwwwwM3YYY3MwYYY33YY wwwYYwwwwwwwwwwMY3YYYwwYYY3Y33 wwwMYwwwwwwwwwwM3YYYMMwMMYYYY3 wwMMYwwwwwwwwwwMYYMYYYMwwYY333 wwMMMwwwwwwwwwwMYMMMYYYwMMYMMY wwMYMwwwwwwwwwwYYYMM3YYYMMMMwM YwMYYwwwwwwMYYYYYMMwMYYYY3YYYY B_UfJMMwwwwYYYMYYMMwMMYY3YYYMY vv7W_OYwwwwYYMwwMYMMwwMY3YMwwM vp48ZWAYMMwMMMMYYYYMMMYYYYMwww 22228I6iYwMYYMMY3YYYYYYYYYwwww WWWZ2I8WJYMYMMYY33YYYYYMYYMwww W2WZWW28BJMwMYMY33Y3YYMY3Ywwww } # tile 30 (rip) { qkkkkkkkkk9qkkkkkqkqqqqqqqqBBq qkkkkkkkkkkkkk9kkkqqqqqqqqqqqq qkqkkkkkkkkkkkkkkqqqqqqqqqqqqq kkkkqkkkqkqkkkkkkkqqqqqqqnqqqq kqkqkkkkkkkkkkkkkkkqqqqqnnqqqq qkkkqkkkkkkqkqkkkqkqqqqqqqnqqn kqkkkqkkqkkkkkkqkkqqkqqqqqnnqn kkkqkkqkkkqkqkqkkqqqqqqqqqqnqq kqkqqqqqqkkkkkkkqkkqqqqqqqBqqq BnkqqkkqqkqqqkqqkqqqqqqqqqqnBn bUqkqqkkqqkqqkqqqnqqqqqqqqqUUn YOnkqkqqqqqkqqqqqqqqqqqqBnqqqn M3O_nqkqqqqqkqkqqqqqqqqqqqqqnn MMYJdnqqkqqqqqqqqqqqqqqqqqqnnq MMYY3dBqqqqkn_qqqqqqqqqqqBqnqn wMYMM3dBqqqknBqqqqqqqqqqnUnqqn MMMMMM3fnqqqqqqqqqqqqqqqUUqqnn YMMYMYYYdBqqqqqqqqqqqqqqqqqqqn YMYMMYMYJbBnqqqqqqqqqnqqqqqnnq 3MMwwMYYYJdBnqqqqqqqqqqqqqqBqB 33MMMY333Y3dBqqqqnqqqqqqqqBqqn Y33YYY333YY3LqqqqqqqqqUqqqqnqB YY33YYYY3YMYbqqqqqqqqBqqqqqqnq YM3MwwMY3YMM3Oqqqqqqqqqqqqqqqq MMMwwwwMYYMMM3inqqqqqqqqqqqqqq wwwwwwwwYYYMwwJiqqqqqqqqnqqqqq wwwwwwwMYYYwwwMOnqqqBqqqqqqqqi wwwwwwMYYYMMwMM3bqqqqqqqqqqqqB wwwwwwMYYwwMYMMMJUqqqqqqqBqqqq wwwwwwwwYYMwwwwwMJLqqBUqqqqqqq } # tile 31 (rip) { qqnqqqqqqqqqqqqqqqqBqqqqqqqqqq qqqqqqqqqqnqqqnqqqnnqqqqqqqqnq qqqqqqqqqqqqqqqqqBqnqqqqnqqqqq qqqqqqqqqqqqqqqqqqBUqqqqqUqqqq qqqqqqqqqqqqqqqqqBnBqqqqUBqqqU nqqqqqqqqqqnqqqnnqqqqqqqqqqqqq nqqqqqqqUnnqqqqqnqqqqqqqqqqqqq nnqqqqqqnBnqUqqqqqqqqqqqqqqqqq qqnnqqqqqqqqBUBqqqqqqqqqqqqqqq nBnqqqqqqqqqqnqqqqqqBqqqqqqqqq BUqqqqnqqqqqqqqqqqUqqqqqqqqBqq qqnqBqqqnBqqqqqqqqqqqqqqqqUqqq nqqnqqqqnqqqqqqnqqqqqqqqqqqqqB nnqqBqqqqqqqqqqqqqqqqqqqqqqqqq nqnnqnnqqqqqnqqqqqqqqqqBqUqqqq qqqnqqBqqqqqqqqqUqqqqqqqqqqqqq nqnnqnqqqqBqqqqqqqqqqqUqqqqqBq nnqqnqqBqqqqqqqqqqqqqUfqqqqqqq nnqnnqnBUqqqqqqqqqqqqqUqqqqqqq qqqnqqnqULqqqqqqqqqqqqqqqqqqqq qqBqqBqqqqqqqqqqqqqqqqqqqqUqqq nqqnqqnqqqqqqqqqqqqqqqqqqqqqqq qqnqqBqqBqqqqqqqqqqqqqqqqqqkkq nnqqqqnqqqqqqqqqqqqqqqqqqqkkkk qnqqBqqqqqqBqqqqqqqqqqqqqkkkmk qqqnnqqqqqqqqqqqqqqqqqqqkmmkkm UqqqqqqqqqqqqqqUqqqqqqqkkkkkmk qqqqqqqqqqqqqqqqqqqqqkkkkkkkkm qqqqqqqqqqqqqqqqqqqkqkmmkkqqkk qqqqqqqqqqqqqqqkkkkkmkkmmkmkmk } # tile 32 (rip) { qqqqqqnUqqqqqqqqqqqqqqqqqqqqqq qqnqqqBUUqqqqqqqqqqqqqqqqqqqqq qqqqqqqqqqqqqqqqqqUqqqqqqqqqqq BqqqqqqqqqqUqqBqqqqqqUqqqqqqqq qqqqqqqnBqqqBqqqqqqqqqqqqqqqqq qqqqqqUUBqqqqqqqqqqqqqqqqqqqkk qqqBqqqBqqqqqqqqqqqUqqqqkqkkkm qqqqqqqqqqqqqqqqqqBqqqkkkkmkkk qqqqqBqqqqqqqqqqqqqqqkkkkkkmkm qqqqqnqqqqqqqqqqqqkkqkkmmkkmkm qqBqUqqqqqBqqqqqqqqqkqkkkmmkkm UqqqqqqqqqqqqqqqkqqBqkkmmkkmkm qBqqqqqqqqqqqqkkqkqqqkmkmkmmmk qqqqqqqqqqqkqkkkkqkmkmkmmkmkmm qqqqqqqqqqqkkqkkkkkkkmkmkmmkmk qqqqqqqqqqkkkkkkkkkmmkmkmmkmmm qqqqqqqqqkkkkkmkkmmkmmkmkmkmmk qqqqqqqqkkmkkmkmmkmmkmkmmmmmmm qUqqqqqkkkmkkqkmkmkmmkmmkmmmkm qqUqqqkkkmkmqqkmmkmmkmmmmmmmmm qqLBqkkkmkkmkkmkmmkmmmkmmkmmmm qqqqkkkkkmkkmmmmkmmmmmmmmmmkqk kqqkkkkmmkmmkmkmmmkmmkmmmm1qBq kkmkmmkmkkkmmkqkmmmmmmmmm1mX9m kmkmmkmkkmmkmkkkmmkmmmmm111116 mkmkmkmmmmkmkmmmkmmmmmm1111111 mkmmkmkmkmmmmmmkqmmmmm11111111 mkmkmmkmkkmmkmmkkmmm1111111116 mmkmkmmkqkmmmmkmmmm1111111111Z mkmmmkmkqkmkmmm1m111111111Z61Z } # tile 33 (rip) { qqBqqqqqqqkmkkqqmkmkmmXmXXkkmk qqqqqqkkkkmkmmXXkkmmkmkmkXmXXX qqqqkkkkmmkkkmkkmmkmXkmXXXXXXX qqkkkmmkkkmmkXkXXXmkXmkXXkmXXm kkkkkkmkkkmkXkXXkXXXXXXmXXmXXX kkmmmkkkmXkmkXXXXXXkXXXXXXXXmm kkkmkmkmkkmXXXkXkXXmmXmXmmmmmm mkmkkkmXXkkXkXXXXmkXXXXXXmmm1m kmkkmmkmXqnXmXXXXXkqXmXmmXm1m1 kmkmkmmkXknqkXXXXXkkXXmmmm1111 mkmmmkmXXkqqkXXXXXXmXmmmmm1111 kmkmkmXkXXkkXXXXXXXXXmmmm11111 mmmkmkmXXXXXXXXXXXXmmmmm111111 kmkmmXXXXXXXXXXXXXmmm11m111111 kkmmmmXXXXXXXXXXmmmmmXXmmm116m kkXqqkkXXmXmXXXXXmmmXXXXmm1m11 mmmqBqkXXXXXXmXXXXXXXXXXXmmmm1 mXmqqkmmmmmXXXXXXXXXXXXXXXXXmm mmXXkm11mmmmXXkXXkXXXXXXXXXXmm mmXmmm1mXXXXXXXXXXXXXkXkXXXXXm mmmm1119qkmmXXXkkXXXXXXmmmmkqX X111111XkXmXXXXkkXXXXXXkqqmXkX X111111mmmXXXXXXXmXXmXXknBX1mX m1111111mmmmXkXXXXXmmmmmqqXmmm 111111111mmmXXXXXXXmmXkmXkmmmm 1161911111mmXXXXmmmmmkqX1mmmmm 11Q9q611111mmXXXmmmm1kqX11mmmm 11Z9q1Q6111mmmXXmmmm1XkkX1111m 11ZXk6QZ111mmmmmmkXm111qk1111m 61Z11Z11Z61mmmXmk_n111mkk1mmmm } # tile 34 (rip) { XXXXXXmmmXXqkXmmm111mXXXXmkXmk mmXXmXXmmXXkkXmmm111mXXXXmmmmX mXXmmmmmmXXXXXXXmmmmmmmXXmXXXq mmmmm1mm1mXXXXXXXmmXXXXXXmXXXk mmmmm11m11mXXXXXXXXXXXXXXmXXmm mX11m11111mmXmmXXXXXXXXXXXXXmm mm111111111m1mmmXXXXmmXmmXXmmm 11111111111111mmmmmmmmmmmmmmmm 1111111111111Xk9m1111mmzQm1111 111111m6Xm6116Xm111ZZ11QQQ11QQ 11111116kXZ11Q1ZQ11QQQQmQz1Qzz 11m6111Zm11Q11Z11zQ1mQzmQz11z1 1116116Q1661QQ1mXQQ1QQQQ1QQQQQ 1611Z61ZQQZ1QzQkq1QQz11zQ1zQmQ 6Z111Q11Q11zQmQknXQz1Qz1QzQzzk 11111Q11QQ1QQ1Z9k1zQ1QQ1Q1zQQm 16Q11111zQ1QQQQQ1xQmtQmtQ1z11z 1Q1QZk91Q11zQ1zQQzQ1zQQzzzztQz 11111XX1QQmm11QQQ1Q1zQ1zQQzzzQ mm116Q11zQ1kXQ1Qz1QtzQ1zQ1zzzt mmmQz1QQ1QQkXzzzzzQQzzzzzzzQ1z mmm1QQ1Q1QQm1QQQQzzQQQzzzzzQQz Xm111z11zQ1zQmQ11Qtz11tQzzzzzz mm1QzkkkmQzQQzztz11zztQkmzzzzz mmm1QX9X1QzQzzQztQzzxxzm1zzzzz mmmm1ZQxQQzQQz11QzzzQQzzzzzzzz mm11mk1z1Qz1QzzXkzzzzzzzztzzzz mm1Q1qkQQzzQQzz1mQttzzzz6kXQtz mm1QQkk1zzzzzzzzzzQQzzztknkQtt m1111mQz111zxQzzztXnQtzzzxzztt } # tile 35 (rip) { kqXmm11Q1QQQXqkX1xQmzQ1zQ1z1XQ kqXmm1Qz1Qz1knnqQQ11zQ1QQ1zmkZ qXmm1zQ1Q11Q6knkQzQ1zzQ11tz11z kXm1QQQ11QQxQ6k9QzzQQQzQQQzzQQ mXXQzm1Q1QzzQ1zQ1zzQmQtz11Qzz1 kqXQQ1QzzQ1z11zQQzQ1QQz1QQ1Qzz Xk11X1Q1tQQQQQzQ1zQ1QzzQQt1QQz 1QzmkQQ1Qzz11zzQ1zzzzzzzzztQmz Qz1m6zzQ1QzzQ1zzzzQ1zQ1zQmzzzz Q1QQ1QztQ1QzQQzQQzQQzmXQQQzzxz 11zzt1QzzQ1zzzzQmzzzzmkQtzzQQz QQ1Qzz11ztztQ1zzzzzzzQQzzzzzzz zz1QzQQQQ1mX1Qzzzzzzzztzzzzzzz zzQQz1QtxXk91tzQQzzzzzzzzzzzzz 1z1QzzzzzQQQzzzzzzzzzzzzzzzzQk 1QQQzzttQzttzzzzzzzzzzzzzzzzzm xQzzz61QQQzzzzzzzzzzzzzzzzzztt QzztQqnq1tzzzzzzzzzzzzzzzttzzt QQztQkkWQtzzzzzzzzzzzzzzzztzzt 11zzztttzzzzzzQzzzztzzttzztttt zzzzzzttzzzzzQ9mzzztttttttttt5 zzzzzz6kXQtzzzmQttttttttttt5tt zzQzztknq1tzztzttzzzttttttttt5 zQ91zzzQzzztttttz9kmzttt5t5t5t zzmQtzttttztttttt61Qtttttt0tt0 zzztttttzztttttttt5ttt0t5tttt0 zttttzzttttttttttt0t5tt5tt6Q00 ttzztzztttttttttt0QQt5tt0tQz00 zQzzttttttttttt5t01Xtt0t0000zt 1mztttttttttt5tttttz0t5t000Q66 } # tile 36 (rip) { zQQ1XXXXm1QQ11Q11zQ1zzQ1zzXmQQ zQmQtQXqq91zQ1zQ1QQ1QQ1ztQqXzz Q1QQQkkkqXz1QzzzQ1Qz11ztQXnqmz 1QQQ11m6mQzQQzQztQ11QzzQQ1XXQz QzzQ1QQQzzzzzz1QtzQ1ztzmQtzztz QQztzkXxzQQzzzzzzztzmQztttmQtz zz11mkXzQzQzzzzzzzQQ11QttzQQzz zzQ9k91tQQzzzzzzzz11zQmzzztttz zzzQQQzzzzzzzzztz1Qzz1mtQ1zzzz zzztztzzzzzzttzzzz1QzzQQ1QzQQz zzzzzzzzzzzzzzzzztQ1ztz1Qtz11z zzzzzzzzzztt1kztttzztQ1ztz1Qzt zzzzzzzzzzttQmtttzQm1Q10ttQztt QzzzzzztzztttttttzmkmQ0zzzzttz mzzzttttttttttttz1Qzztz1Qz1Qz1 Qtzzt0ttttttttztt1QQttzQztQQzQ tttttQztttzzztzzztQ1tttzzttttt ttt0tn90tQXXQttQ1tttttt1Qttttt ttttz9100zQ1zttzQztzQQzQQttt0t ttt5tt00tt000ttttttzmQttttt000 t5tt5tt0t5t000tttttztzttttt000 ttt0t05t00t0000tttttt0t0tt0000 t5t0000000000t00tttt000000000r ttt000000000000tt0tt00000r00r0 00000t00t0000000t00t000000r0t0 t000000000tt000000000rr000rQX0 000000000x9qm0000r00r0000rrXqt 000t00000tQmQ0P00rr0000000rz1Q 00000000Prrrr00r0t0r0Plrr0rl01 Q000000000000P0r01Q0rrr0rr0rrr } # tile 37 (rip) { 1Q1ztm1tmmm1QQ1ztQQtz19Qzzzzzz Q1zzQ1Qt1kkmQt1Qttttzttzzzzzzz zzz1kzzzzzzzttzzttzztttzzttttt QQtXq1ztttttztttttzztttzzzzzzz 11tknXQtzzzzzzttttttttttzzzzzz zz0nU1tzzztttttttttttttttttttt zztXqQtzzzzttttttttttttttttttt zzzttzzzzzzttttttzzttttttttttt zttQ1zzzttttttttzm1tttttt5tttt tttzQzzzttttttt0zX10t005t0t50t tttzztzztttttt00tmQ0t50t00t00t ttt1kztttttt0t05tzt5ttt0t0tttt ttt9qQ0ttzt0tz0000t0t5tQ99tP0t zt5kqQttttt01Xt0t000000Zqqtr00 QttzQztt0000qnQQ1t00000ttt000t Qttttttt00056qtzQ0000000000000 tttttt0000000P000000t0000000t0 tttttt000000000000000000000000 0ttt5000t0000000tQz00000000000 0000000000000t0006xr0000000000 00000t0000t000000t00P0P0000000 0000000rr0r000r00P00000P000P0P 000rr0rrx0r00P00P00r0r000P00r0 00rr0rlznqr000P00000000r00rrrP 00rtQr01n9l0r000r0r0r000r0z9q5 r00Q10zm1tlr000P000P00r0r0Zqnt Hr1Qr00r0rrrr0rr0rr0rr0rr005t5 Qzz0rrrrrrrrrrrrrrrrrrrr00rzQ0 m10r0rr00rr0rrrrrrrrrrrr0rrmq0 001zlrrrrr0rrrlrl0rl0rrrrrPx65 } # tile 38 (rip) { zzzzzzzzzzzzztQzzQQzzQQzQ1zQ1z zzzzzzzzzzzzzQzzzmQztQmztzzzzz ttzztzzzzzzz1kzzzzzzzzzzzzzzzz ttztz1QzzzztkqQtzzzzzzzzzzzzzz ztztzk6zzzzt9qQtzzzzzzzzzzzzzz ttttz91ttzzzzQzzzzzzzzzzzzzzzz ttttz1Qtttzzttzzzzzzzzzzzzzzzz ttttttttttttzztzzzzzQzzzzzzzzz tttttttttttttzzztttz9mzzzzzztz 5t5tttttttz9Ztzztztz1Qtzzzzttz tttt5tttt0Qnk0tttzzttttttttttt 005ttt5tt0znkttttttttttttttttt 00tt5ttt5tt915tttttttttttttttt 005ttt5ttttt0ttttttttttttttttt 0t00000z1Q0t5t0t5ttttttttttttt t000t00t9100tt5tt5t5t5t5t5t5t5 000t50006Qzttttttttttttttttttt 0000000009n9x00Q6t50t50t5t5t5t t00t00t006qq60tzQt00tzQt0t0t0t 000000000x6qm00000000Q600t0000 000000000tttt00000tt0ttt000tt0 0000000000P00000000000000005t0 0P00P0000000000t00000000tt0000 00000000P00000000000t000Q6z000 r0P000r0000P000000000000zQt00t l0000P000000000P00000000000000 00r0P00P0P0r00000rr00000000000 rP000000000000P00xt00000000zQ0 r00r0r0r0r0P000056Q00P0r00rx60 r0rr00P00000P0rx66xr0000P00050 } # tile 39 (rip) { Q1zQ1z1mzQQztzQQQzzzQQzzQ1zQQz ztzzzzzzzzzzzzzzzzzzmQzzzztQQz zzztzzzzzzzzzzzzzzzzzzzzzzzzzz zz11zzzzzzzzzzzzzzzzzzzzzzzzzz zQkXzzzzzzzzzzzzzzzzzzzzzzzzzz tQkmzzzzzzzzzzzzzzzzzzzzzzzzzz zzQQzzzzzzzzzzzzzzzzzzzzzzzzzz zzttzQzzzzzzzzzzzttttttttttttt ztttQX1ttttttttttzzttttttttttt zzttz1zttttttttttzzttttttttttt zztttttttttttttttttttttttt0t0t tttttttttttttttttttttttt5tt5t0 tttttttttttttt5t5t5t5t5ttt5zQZ tttttt5tttttt5ttttttttt5t0tQ66 ttt5t5tt5Qm9Qt0t5t5t500t000ttt t5tttt5ttzQ1z0tt0t0t0t00t00000 tt5t0ttt5t0t00t500000000000000 5ttt5t05t0t00000t0000000t00t00 0000t0t00t50000t00t00t00000000 0t0000000000t00000000000000000 t50tt0000000000t00000000000000 0t0t000t00t000000005q60000P000 000000000000000000rznkP0000000 0000000000000t000000x500P000P0 00t00t00t00000000r00rr0000r000 00000000000000P0P000000r0P00r0 000000000r0ZQ00rr0r0r000000P00 000000000r0k1rrtx0rP00r0r0rr0r r00P00P00rtk1rrxZ0r00P000rrrrr 000000rr000t000000000rr0rr0rlr } # tile 40 (rip) { CCgSSSgSgCgNttCCCCCCggCCCCCCCC lHSSSSSCECC0lNggCCgSCCSNCgCCSC rHgSSSgSgSgCCCCCSCCSCCCCCCgCCg CCSSSgSSSCCcSgCgCgCCCCCCCCgCgC ScSSSSSgSCCSCCSCCSCCCCNgSgCggC EESCECSSSSgCCSCggNCCNCSCNCgCCg cccSgSSCCgSCCSCCSNCSNCCCCNSSCg SSSESSSSCCSCggCgCCCCCNCSgCCSSC cEgSCSSSgSSgSSCCCCCCCCSNCSCCCS cSSCESSCSSSCggCCCCCCgCgCCgCCCN SSSSgSSSSCSCCSCCSCCSSCCSSSCCg0 SSCECECECECHNNSCCCSSSSgCCgCgC0 SSSSSCECSCSNCCSgCSCCggCggCgCCN SSCECECSSSSSgSSSSSCNSCCSCCSgCC SSSSSSSECSSgSSCCCSSgSSgCCSCCSC SSSNHCSCECSSgSggCggCSgCgCCgCCC SSS0mCECSSSCSSCCcSCCSCCSCNgCNC SgSNHCSSSCSCCSSCCSgCSCCCCgNCgC SSgCCSSCECCCSSCgCCCgCgCCCgNCgC gSSCECSCSCCCECCCSCCSCgSCCCCCNC SggggSCCSSSSCCSCCSCCgCCCCaCCCC gggCgSSCCSSCgCCggCCCgCCCgCCCCC ggSgCSgSCCSCCSCgSCCCCCCCCCCCNC gCSCCSCNSCCSCCSCCCCgCCgCNCCCCN ggggCCSCCCCCgCgCCCgCCggCCCCCCN CggggCCSCCCCCSCCCgCNNCNCCCCoCC CCggCSCCSCCSCCCNCCCCCCCCCCCCCN CgCgCCCCCCCCgNHlNNCCCCCNCCNNNN ggCCgCCCCCCCCNlt0NCCNCCNNNNNNN ggCCCSCNlHCCCCNl0NCCCCCCl0NNNN } # tile 41 (rip) { CNqOMYMwwwwwwwwwwwwwwwwwwMwwww gNqOMMMwwwwwwwwwwwwMwwwwwwwwww SHqbMMMMMMwwwwwwwwwwwMMMMMMMMw CNkdYMMMMMwwwwwwwwwwwMYMYMMMMw CN1L3wwMwMMMwwwwwwwwwMMMMMwwYY CCNB3MMYMMMMMMMMYMwwwMMMwwwMYY CggnJYYYYYMMMYMMMYYMMMMwwwMYYY CSgqO3YYYYMwwMYwwYYYYMMwMYMYYM gClqb3MMwMYMMMMMMwYYYMMYYYYYMY CNKxn3YYMMYMYYMYYwMMMMMYYYYYYM lCCgzOYY3YMYYYMYYYMMwwwYYMY3YY rCgSr_O3YYYY33MYYYY3YYYMYYYY3Y NCCgo6A3J333YYYYYYYYY33YYYY3YY NCCCCCBJJJ33YYY3YMYYMY33YY3YYY ggCCNlnOJ33YYYYYYYYMMMY33333YY CgCCCHZBJ33YY3333YYYYYYY3J333J CCCCCCNQLO33J33333Y3Y33Y3JJ33J CCCCCCCNQiJJJJJJ33JJ3333JJ3JJJ CNCoNCCCCkiJJOJJ33JJJJJ3JJJJJ3 CCCNNCCCgKXdJJOJ333JJJJ3JJJJJJ CCCCCCNNoNPWiJOOJ3JJJOJJJJObO3 CCNoCNNNNNo8qiOOOJJJJJOOJ3OOOJ CCNCCNNNNNNoH6LbObOJOJJOOJOJJJ NCCNNCNNCCoNoPkUfdbOfbJJJOOObb oNCNNNCNNNoNCKxWnibOdOJJOdbbOb CNCCNNNNNNNNoKt0xn_dbOOddbfdOO NCNCCNooNNNNNNoHHrQqiddfddLAfA NNzrCNooNNNNNoNNNrrx9nnBLdLLAi oH9QNNooNNNHNoHNHx5NNHxWn____i NlZtNNNHNKoNNHNNKlrrlrrPzXnnB_ } # tile 42 (rip) { MYMYYYMY3JJ3JJJJJ33JbddddALiiB MYYMMYYYJJ3JJOJJJJ33difbfLLiL_ wYYMMMMMJJ3OJJ33333JdL_ddfiLUB MMY3YMMY3JJ3JJYJJ3JJbiUiffiLUn MMY33YMYY3J3333OO3JbbA_ULAiLUn YMMY3333YY3JObJJJ3JOdALnB____U YYYYY3333YYJOOOJJJOOfbb_B__UB_ M3YYYY33YYMJOOJJObbdfbJbL_LBnU YYY3YY333YYObOJbiAOJdbOfiLBBUB YYYYYY3JJYYObOJbidOObbObfLU_UB Y3Y3Y33JJY3OObJbdObOOObOdLL_Un 33333333333ObbJOObOOObdifAnB_B 3J33J3J333JbfdOObObbbddfAiBBBB 3J33O3333YJdAbbbbbOOfdbbfLUBnU 333JJJYMJJJJObbddibJfdbALUnBUB 333JJ33JOOJJOOObdAbOdff_UBBBUU JJ3JJ3JObOJbbOJOfdddAiL_BnUUBU JJ3JJJ3JbdbbbO3O_dfi____BBUUnB 3JJJJJ3JAAbbOJJdUiL__UBUBBUBnU 33JOJJJOLfObOJbA_U__UBnUBnUBnU JJJJJbOJbOJfAiL_LiLUnBUBBUnBUU JOOOObOJOOOALiiiAL_UnBBBBBBUBn ObdOJdbJdbbiLiAfA__UBBnBBBUBnm bOJOOddbOdL_LLBUU_BnUBnUUBBnX0 bOOObbbbdfi_iAUBBBBBUBBBBnn10r bdbbddbbiAAiiAiUBBBUBUUnnqm0Hr ffAiiAAiiL_iUBBUUBBBBBBnkm0rl0 L_LiAiL_UUUUBBBBUBBBBq91ztrrr0 _ULAAi_UBBBBBUBnBnBBqQ0llr0000 _U___UUBBBBBUUBnnqmz000rr00r0r } # tile 43 (rip) { nB_UBQrHHHHNHHHHNHHHHHHHHHH0z1 BnUBqktHHHHNNHHHHHHHHHHHHHHtmq UUBUUq10NNlHHHHHHHHHHHHHlrrrr0 B_BU_nm0HHHHHHHHHHHHl00llrlHHH BUBBUB1HHHHHHHHHHHHHlQmrHrHlrr _UnBUB1NHHHHHHHHHHllH1q0Hrrrrr UBBBBn1NHHHHHHHllHlrHz10lrlrlr BnUUBqQNHHHHHHHlrllrrlHrrrrrr0 BUBBBqtHHHHHHHllHrrrrrrrrrlr00 B_BUB9zt0rHHHHrrlrrlrlrrlrrr00 BUBUB6z1z0HHHllrrrrrrrrrrr0000 B_BBB10rlHHlrlHlrrlrrlrrr005tt BBBBnzrllllrlllrrrrrrrrr0000tt BnUBqtlrrrrrlHrrlrrlrr00000ttt BUBnq0rrrlrllrlrrrrrrrrr00tttt BBUnQrl0rl01zlrrr0rr0rr000tztt BnUqlrrrrl0k1lrlr0000000ttttt0 BBnQHlrrrrr00rr0000r0r000ttt00 UB10Hrrlrrrlrr00r0P00005tttt00 Bq0lrrrrrr00000P0000P00tttttz0 n10llrr0rrrrrr000r0000ttttttt0 X0r0zrrrr0Qx5000P00000ttQQztt0 0llz1rrlrz16zr0P00000ttz1Xzt5t rrr0000000000000000005tt1Xztt5 rr0rl0r00000000000t0tQ1m1Qtttt rrr00000P0000000000tt6kW10tt5t 0000r000000000000ttttzQzztt5tt r0r00000000000tt0ttzQzzttttttt 0000000000000t5tttzzQQzzzt5ttt 0P000000000ttttzzzzz1Qzzzttttx } # tile 44 (rip) { tHlrrllrlrrrrrlr0rr00000000ttt QHlrrrrrrrlrlrr00r05t00000tttt rrrrlrlrlrrrr0r00000t00tttttt0 lrlrlrrrrr000000t5ttttttQmzttz rrrr0rrr00000t0tttttttttXqQtzm lrrz10r000000tttttttttt5knXtzB rr0zz00000ttttttttzztttt191QkU 00000000tzttttttttzztttttt0mn_ 0t00tttzX1tttttzzzztttttttt9nA 0ttttttt1QtttttzzzttttttttxqUf ttttt5tt0ttttttttttttttttzmnLA tt0000000ttttttttttttt0t0tqB_i t000000000ttttttttt0tt0tt1nUUU t00t00t0000ttttttt00ttttQqUUBU t000000t000tzt0ttttttttt1q_BnU 000t000t0tt0ttt5tttttttt1qnBB_ 00t00t000tt0tttt0ttttttt1qnB_L 0000005tt00t50ttttttttttXqnB_A 0t0t5t0t5tttttttz1Qtztz9qnBULA 0000ttttttttttttzm1zztQnnn___A 00tt5t5t5ttttttttzzzztQqB_L__i t0t5ttttttttzzzzzzzzzQ9nUiiLLd t5ttt5t0ttttzzzzzzzzzQqUAiiAbO ttt5tttttttzzzzzzzzzQt1AdAibJJ t5ttttttzzzzzzzzzzzQz6nbOObOJJ 5tt5ttttzzzzzzzzQzzQtqUOJJJJJJ tttttzzzzzzzzzz196xzQ9BO333333 ttzzzzzzzzz161xZmQzQzq_OJJ3YYY ttxxzzzzzzQ9k9ZQQzQztndJJJYYMM ztzzzzzzzzzQQQzxQQxzzBOOJ33YYY } # tile 45 (rip) { 0QUbJJJ33JJJYwMMwY333JJJ333333 09OJJJJJ3JJ3MMMMY333333333J333 1nO3333JJJJJJYY333Y3Y3YJ3Y33J3 qAOJ3Y33JJJJJ33333YY3Y3J33333J BbJJ3YY33JJJ33333333333JJ3Y3JJ LbOJJ3JJ3JJJJ33J3JOOJ33YM3JJJO fbJJJ3JJJJJJJJJJJbdbJ3JYY3JJJO bOJJ33JJJJJ3JJJJOiAb3JOOJJ3JOb OJJJ333J3JJJJJJOOfdOJOdOOOOOdA bObJJ3JJJ33JJJObdbdbbbdOOOOdLL ffbOJ3JJJJJJOObfdObfbbOJJJOfUL dOJ33YY3Y3JdddLAbOddOJJ333JbAL fO33J3333JdALLfbOOOO3YMYMMYOdA dOJJJ3JOJd___LbJJJ33YMwMwwM3Ob fOJJJJOOb_nnBiOJJJ3MwMMwwMMYJJ fOOOJOOdiUBBiOJJJYMwMwMwMYMYYY dObOJbbf_ULfOJJJ3MMwMMwMMMMMMM bOdddddA__idbOJ33YMMMMMwMMYMYM ddAAfbdA_idOOO3YYMMYMMMwMMMMMY dbddbObAidOJJJYYMYMMYwwMMYMYMM bJJJOOddbbbJYYMMMMMYMMMwwMMMMM OJY3Jbfidfd3MwMYMMMMMYMwMYMYMY JJ33ObLULid3MwMMMwwMYMMYMMMMYY J33JJdL_LLb3MMYMYMMMMYMMMMY3YM 3J3JOdLUAfb3YMMMMYMYMMMYYYYYYY JJ3JJdLLdbOJYMMYMMMMMYMMYYMYYY J3JJ3dAdOOOJ3MMMYMYMYMMMYYMMMY 3JJJJbbJ3JOJ3YYMMMMMMMYMYYMYYM 3J3JJOJ33JJ333YMYMYMYMMMMMMYYM 3JJJJbJ3Y3JJJ3YYMMMMMMMMMYMMYY } # tile 46 (rip) { YYMY3J33JJbnZWWWWWnB_UBd_BAfLd 3YMY333J3JLW2WW2W2BOOOOJJOJ33Y 3YYYJ3JOObiWZWWWWWnAdbO3JJJJJY 3YMY3JObOOfW2W2WW2n_AdOJ33333Y JYYMYJOOJJdWWWWWWWnBB_dOOJOJYY OJ33YObbdOdn2WWWW2WZWnBnnnnBL_ OJ33JdddbObWWWWWWW22ZWW2WZWWnW bOJOALfbbJOn2WWWWWW2WZIWWWWWZ2 AdbfLLfOOOAW2WWWWWWWWWWW2WWZWW iAddfAbOOb_W2WWWWWWW2W2WWWWWW2 iidOOdOJOdUWWWWWWWWWWWWWW2WWWW ifAOOOOJd_BWWWWWWWn___BWWWWWWW iAdO3JJOf_BW2WWWW2BOJJdnWWWWW2 bdOJ33JOdUnWWWWWn2_JJYY_nWWWW2 JJ3YMYJOdUWWWWWWW2_JOJYYdWWWWW YYYMYYJbdUnWWWWWWW_3JJ3MJ_W2WW MMMYYYJb_UnWWWWWW2AY3333YJnWWW wwwwwYJABnnWWWW2n2_333J3JJOBWW MMwwMYO_BBn2WWWWWWA33333333bBW YYYMY3O_BBBWWWWWWWd333J3333Jdn YYMMYJf_nnnWWWWWWn_333Y3JJJObb YYYMYOLBnnBWW2W2W2d3333JJOOJOO Y3YY3dUBBBBWWnnWnndYY3OJObOOJO YYY3OinnUAdA_dbddbJ3Y3J3JOOJJJ YYYJbBnBUdOJ33Y33JYMYY33JJJJO3 Y3YJAnnB_OJYYMMMM3YMMM3JJYJOJY YY3OinBiAO3YYYYMY33YYYYJJ3333Y YYJO_BiObO3YYYYYYMYYMMY3J333YY YYJdUAOJOJ33YMY3YwMYYMYY33YYYM 33Jd_bbOO3MYYYYYYYwwYYMY3YwMYM } # tile 47 (rip) { d__nZWZW2WBJ33YYY33YYfZWWWZZWA MYJU2WWWWZWAJ3JJOJ3YYA2WZWW2WA YMMdZWZWZ2WAOObOJJJJOBZWWWW2Zi MM3_2WWWWZWLffbOJ3JOdB2WW2WZW_ Y3_nWW2WWWWU_LbOJ3JbbBZWWWW2W_ BWWW2WWWWWB__AOJJJbAO_2W2WW2ZO ZZ2WWWWW2BAddbJJbbfAOUZWWWW2WO 2WWWWWWWW_OOOOOOdiibJi2WWWWWWO WWW2WWWn_bObObObbAOJ3UZWWWW2n3 WW2W2nBAJJObbbfOJJ3YJU2WWWW2n3 WWnnn_OJ3JJbOOOJ3YMYOBZWWWW2nY 2WO3JJJ3Y3ObJYYYMwMY3_2WWWWZn3 WnOMM33YY3JJYwwMwMYYYdWWWWW2nY 2WBOM33YMY33YwwwwMYYMdW2WWW2nM 2I2BOY33MY333YwwMwwYY_2n2WW2nM W2IWBJ33YYYYYYwMMwwMYd2WWWW2nM WW22WUO3JYMMYYwwwwMMYiZWWWWWnY 2WW2I2nOYYMYYMYwwwwMJU2WWWW2WY WWW22I2B3MM3YwMwwwwM3BZWWWW2B3 WWWWW2I2bYY3YwwwwwMM3A2WWWWWWJ B2WWWW2I2_Y3MwwwwMY3J_ZWWWW2nJ _nW22WZ8vnJ3wwwwMY3JJ_2W2W2Wn3 b_nWWWWW2nO3MwwMY3JJJ_WWnWWBA3 JOddddd__fJYMMYY3JOJYO_AbOdbOY 333333JJOJJ3YY3JJJ33MYJJJ3J33Y Y3YYMYYY333JJJ3JO3MMwwM333YYYM 33JYYYY3JJ3OJJJOJYMMwwwwMYMYYY YYYY33Y3JJJOOJJJJMwMMwwwwMMYYM MMMYYY3JJbbbJ333YwwwMMwwwwMYYY wwwwwwM3bfdO33J3MwwwwwwwwwwY3Y } # tile 48 (rip) { OJJ333MwwOqWWWZWWBfOJObbOJJJJ3 bO3333YwMOBW2WW2WdYMMY3YMwwwww bO33333YYJ_WWWWZWdJYMMMYMMwwww OJY3JJJJYJ_W2W2WWbYMMMMMMMwwww O3Y3JJOOYOBWWWW2nb3YYYY33YwMww JJY3ObJ3YOBWWWWWZnU__ifiLifOJf J3JJJJJ33OnW2WWWWWWnWnnqnqnnnW 33JJ3YY33bnWWWWW2WZWWZZWZWZWZ2 33JYMwMYYOBWWWWWWWWWZWWZWWWZWW Y3YYwwwwMJB2WWWWW2W22W2W2Z2W2W MYMwwwwwwJBWWWWWWWWWnWWWWnWWWW MYYwwwwww3BWWWWWWB__Ob___d____ wwwMwwwwwOWWWWWWWdJJYJObO3JOJJ wwwMYwMMwO2WWWW2WOYYM3JJ3J3JJM wwMMMMMww3BWWWWWnOYYYJbJOOJJ3w wwMMMYwwwOnWWWW2WJY3JObOObJJ3w wwwwMMMwwO2WWWWWnOYYJObOOO333w wwwwMMMMw3BWWWW2WJYYJbdbOJ3YYw wwwwMwMMwJnWWWWWnO33ObbbOJ33Yw MwwMMwMMwOWWWWW2WbJObbObOJ33Yw YMwwMMMMw3BWWWW2n_bd_AOJYYYYMw YYwwwMYMwJU2W2W2WAA__bJ3YwMMYw YYwwwMMMMJBnWWWWn___bJ3YMwwwMw 33YMwwM3wYbJb_b_BB_d3YYYwwwwww YJ3YMwwMwYY33J3Jb_bJYYYMwwwwww Y333YwwwwwY3YYYJJOJYYMMYMwwwww MYY3YwwwwMY3Mw3JJ3YMYYYYMwwwwM MwY33MwwwMYMww3J3MMYMYYYYMwwww wMY33YwwYMMwww33YwMYwwYYYMwwww MMMY3YMwwwwMMMYMwwM3MYY3MwwwwY } # tile 49 (rip) { dBWZWZZ2ZdwwwMwY3YYYYYYYYMMwww Ydn2WWWW4fwwwwwMYYYMYYYYMMMMww wMn2WWZ22AwwwwMYY3YMMYMYMwwwww w3n2WWWZ2bwwwwYYYYYMYMYYYMwwww 3dWZW2WWWbwwwwY3YMMMYYMYYMwwww BWWWWWWWnJwwwwY33YMMYMwMMwwwww Z2W2WW2WdYwwwwYY3YMMMMwwwwwwww 2WWWWWWn3wwwwwMYYMMYMYMwMYwwww WWWW22BJwwwwwwYYMwwMMMMMYYwwww 2W2nBdJ3YwwwwwMMwMMMYYYYYYMwww nnn_OMMYYMwwwwwwwMYYYYYYYMMMww OY3MwYYMYwwMwwYMwYYYYYYYYMYwww YwwwY3YYYYYYYYMMwMYY3MMYMMYMww wwwMY3333333J3MwYwwMYMwMwwYMww wwwww3YM3YYYYYMYYwwwYMwwMMYMMw wwwwwMMMMMY3J3YY3wwwMMwwwMMYYM wwwwwwwMMM3JOJ333wwwMwwwwwYYYY wwwwwwwY3JJJJJ33YwwwwwwwwwwYYM wwwwwwYYOOOOJJ3YYwwwwwwwwwwMYM wwwwwYYJObOJJ3Y3YwwwwwwwwwwwMY wwwMM3JJJbb3YM33YwwwwwwwwwwwwY wwwM3JJbJOOYwM33YMwwwwwwwwwwwY wwwMJOdbOJ3wwwYY33MwwwwwwwwwwM wwwYbddOJYwwwwY33YMMwwwwwwwwwY wwwJidbJYwwwwwYY3YYYMwwwwwwwwY wwMOUbJYwwwwwwMYYYYYYMwwwwwwwY wYOAd3MwwwwwwwMYYMYYYMwwMMMY3J M3ddJMwwwwwwwwMMYYY33YwwM3JJJJ YJbJ3wwwwwwwwwwwY3J3YYMwYOfdO3 JJJYwwwwwwwwwwwwYYMYYMwYJfLb3M } # tile 50 (rip) { wwMwwwwwYMMMwwMwwMbnqnqqqqqqqq wMMMwwwwMMYMMYMMMw3fqqqqqqqqqq wMMMYYYMYYMY3YYMwwYbqqqqqqqqqk MMYMMYMY3YwYYYMMwwMYUqqqqqqkkk wwYMwMMMYMwMYYYMMYwMbqqkqkqkqq MMMYYMMwwMYMYYYYYwwMYfkkkkqqqq wMY33YMwwMYMYY3Y3MMMwOkkkqkqqq MYY33MMMwMMMMMYYY3MwwJBqkkkqqq MY33YMYMwwwMYMwMM3MwwYiqkkqkkk wY333YMwMwwwMwMwMYMwwYJqkkkkqk wwY33YMwMMwwwwMMwMwwMM3nqkkkqq wwYY3YYMwwMYwwwMMwwwMYJiBqkqqk wwMYYYYYMMMMMMwwMwwwMYJdBqkqqk wwwMY3YYMwwwwMYMwwMYMYJOBkkmkk wwwMYYYMMwwMwMMYYMY3Y333fkmkkm wwwwMMYMwwMMwMY3YYY3YY3YOnkkkk MwwwwMMMYMMwwYYY333YMYYMJUqkkk MMwwwMYMMwwMMMY3333YMMYM3bBqkq MMMMMYYYYYMY3333333YYYYYM3nkkk MYYYMYYYJ333JJ3YYYYYYYY3wMBmkk YMY33wMJOOJJJ3YMYMY3YMYYY3iqqk YYY3JY3OOOJJJ3YMMMYMYMYYYJLnkk YY33JObdOJ3333YYMMMMY3YYYJBqqm Y3JOJbdd3YYY33YYYMwYYYY3YJfnkk 3JJJJdbJMMMY3YYYYwwYY3YYYJOBmk JOJJ3OJ3wMMYY3YYYMMY3YYYY3JUmm JJJ3Y3J3wwwYYYY3YMYY33Y3333Lmm J33YY33YwwMwMMY3YMM333YYYMYAmm YYYYMYYYwMMwwwYYYYYYYYYYMMYdmX wYYYMMMYYMwwwwMYMMYYY33MMMYAmB } # tile 51 (rip) { qqqqqqqqqqkkqqkkmkkkkkkkmmmmkm qqqkqqkqkkkkkkkmkkqqkkmmkmkmmk kkkqkkqkkmkkkmmkkqqqkmmkmkmkmm kqkkkkkkmkkkkmkkkkBqkkkkkmmmkm kkkqkmkkkkkmmmkkmmqqqkqkmkmkmm qkkkkkkmkkmkkmmkmkkkmkmkmmmmmm qkkkkkkmkmkkqqkmmkmmkmmmmkmmkm kkkmmkkkmmkqqqkmkmkmmmkmmmmmmm qkkkkmmmkkmkqkmkmmmmkmmmkmmkmm kkmkkkmkkmkkmkmmkmkmmkmmmmmmmm kmmkkmkmmkmmkmkmmkmmmmmkmmmmmm kkkmmkkmkkkkkkmkmmkmmmmmmmmmmm kkmkkqqqkkkmkkkkmkmmkmmmmmmmm1 kkmkkqnqmkkkmkkkkmmkmmkmkmm111 kmkkkqqqqkkkkkkkmkkmkmmmmXXmm1 kkkqkkkkqkkkkkkkkkkkmkqqkkXXmm kkkqkkkmqkmmmmmkkmkkXqnqqkXXXm kqmkkkmkmkmkXkXmkkkmkXkkXXXXXm kkkkkmmkmmmmmmXXXkmXXmmmXXkXXX kmkkmmkmmmXmXmmXmmmmXmmXXmXXXX kmmkmkmmmXXmmXmmmmm1mm1mmmXXkm kkkmmmqqXmm6mm1111111Xkm1mXXmm kqmmmmnBXm16611111111kkX11m11m kmkXXmkqXmmm11111111111111111m mmmmmXXXXm111111111111Q6111111 XmXXmmmm61111111111161ZQ611111 kmmm6m1mmmm11111116ZZ11Z111111 mXmm91mmm161111616111Q11161111 XXXmmXXm111116111ZZ1m6Q16Z1161 nXXXXXmm111111qqkZQ1kXQ11Q11QZ } # tile 52 (rip) { mkmkmmmmkkmmmmm11111111111Z11Q mkmmkmkmmmmmmmm11111111111Z61Q kmmmmmmmmmmmm111111116Z11Q11Q6 mmmkmmmmmm1mmkqqkm1111Z11Q1QQ1 kmmmmmmmmmm1XqBBnX1116Z11Q1Qz1 mmkmmmmmmkqmmm9kqX1Z11Q11Q11Q1 mmmmmmmm1Xk1111X911111Q1QQ1QQ1 mmmmmmm1111111111Z6111Z1QQm1zQ kqmmm111111111Z11111zQ1QQmn9z1 kkmm1111111111161611QQ1QQmkXQQ m1m1111111111116QZ11Z11zQ1QQmz 1111111116Z16ZZ1111QmQz1QzQQQz m11111111161111611Q1QQ11Qx1QQ1 66111111111Z6111QQ11zQ1QQQ1Qz1 1m111111Z61Z11zQ111QQ11zQ1QQzQ 11166m6161111QQQQ1ZQ1QQ1Q1zQQz 1111Z11Z11Z61Q11zQQQ1Qz1QzQQQz mm11111Q11QQ11Q9kQQ1z11QQQt11z XX11111QZ16xQ1mkq1z1QzQQzQ1QQ1 XXmmm11ZZ61zx6kkkQQQQQzQQQ1Qz1 mmXXmm111Qz11Q61QzQ1zQ1z11zQ11 mmXmmmm1mQx1ZQQQQQQ1QQQQzQQmXQ mmmmmmmm11QQQQQQQZzzQQzQQQmkkQ mmmXXmmm1111Qz11QQzz11zt11zmqk mmmmXmmm1QQmQz11xQQQQzzQQQQ1X9 1mmmmmmmmQz1QQ1QzzzQzzz11z11Q1 1mmmmm11111zQ1mQzQQzztz1QtmQz1 6m11mm11Q11Q1Q1Qz1QzQzz11zmQzm 11111mm6zQ1mQzzQQ1QzQQz1QzmQQ1 QQ1Qz1111111m1zQ1zQ1zQ1QQmzQmz } # tile 53 (rip) { Z1ZZ1Q111161mmXmXnq1161XX11mmm QZ1ZQQ1111Z1mmmmm11m11111111mm 1Q1Qz16QzQ1mmmmmmm1111111111Xm QQ11QQQ1QknX1mmmmm1111Q16111Qm Qz11zz111nB9mmmmm11m1Qzm111Qz1 1z1Qz1Qz111mmm111m11mQz1Qz111m zQQQQQQzQQQ1mmXkkm11m1Q1Q1Q1Q1 QQ1QQzQQzQm11XkqqX11611zQ1zttt Qz1Qz1Qz11z11mmXXmm1QzQ1Qzzzz1 QQQ1Q1QzQQ11mmm11mm1QztQ1Qzzzm QQzQ1zzzz11m11m1111111ztQ1zzQ1 Q1QQzzzz1QQmQz1m1Q1mQQ1zQ1zQ1Q Q1zQQQzz11QmmQQ11zQmz1mz11z1mz Qtz11zzz111mmmzQ1zQ1zQmzQmQQ1Q zQkXzzzz1Qzm1zmQzzzzz1mzQXmQz1 z1m1zzQQQ1QmQzQ1QzzzQ1QQ1z1z1Q Q1zzzQ11zQm1QzzQ1zzzmQzm1zQ1mt zzQxz1Qz1XmzQmztzzzzzzz1kkkkmz 1m1Qz11Q1Q1tQQzttzzztQ1Q1mXm1z 9kmQQ1mmzttzzztzzzzzz11zzzzzzz QQ1m1z1mzQmztzzzzzzQm1z1Qz1Qzz 11m1Q1QQzQQzzzzzzztz1Qzm1zQQzz mkXQz1Qtzzztzzttttttztz1Qtzzzz kqXQzzzzzzztzztzztttttzzztmQzz XmQQzzztzzztzztzzttttttQzzQQtz 1tzzzzztzzttttttttttttzmQtzzzz Qz1QzttttttttttttttttQmztttQ1z Qt1Qtttttttttttz1XQtt1XztttQQz Qttzttttttttt00QXqm001mztttttt zztttttttttt5t0tzzzt0tt0tttttt } # tile 54 (rip) { 1Q11QQQQQQQ1zzzzzzX9Qzzztttttt Qz1QzzQmQzz1QttQzzztzzztttzztt m1zQm11t1Qzzzzz19Qzzzzttttttzm XmQQ1qXQQQzzzztQmQzzztttttt0tX m1XQQnq1zzzzzzQQtzztttttttttz9 QzmmmqXz1QzztQn9tttttttttt0Q9n Q1Q1XkXmk1tztQq9tzttttttt5tzZX Q1t1mmXkk1tztz91tzzzttt5tttt00 zz11tz1XQztzztztttQmz0ttt5t50t Qzm1zQQzztzzztttt519zt5t00tt00 QQmQzm1zzzztttttttQ6t0tt00t500 QmXQzm1zzzzttttt0ttt5t05t00000 1m1zzQQzzzzttttttt0tt00000000t Q1ttzttzzzttttt5t5tt5t0tt0t000 1zzzztzzzztttttttt5t0056Q00000 Qtztzk1tzzttttt50t0t00tQz00000 ttztQn9tttttt0t0000000000000rr zzztz91ttttt5t5tt0000000000rr0 zzztzQzttt5t0t00t00t00000Prtx0 ztttttzzttt5t0000000000000rxZ0 zzttt0Qmz0ttt500000000P0r00000 zzzttt1Xz0t5tt000000P0000P00r0 ztzzttQmz0tt000t000000r00r0P00 zzzzztzztt00000P00P00P00rrrrrr zzzzzzttt50000000000Prr05xmzr0 zztzzzzt5t000P0000r00rrrt6q1l0 zzzzttttt000000rr0000rrrP050r0 zzzzzztt5t00000tx0rrrrrrrHHlr0 zztzzzztt000000Q10rrrrrrrr0000 tzzzttttttttt0000000rrrrl0k1r0 } # tile 55 (rip) { QQzttttttt5t5tt5t5t00t00000zQQ ttttt0tt5tttt5tttt00tt00t00000 Q0tt5tt5tt5ttt00t5000000Q6t00r 1t5tt5tt5tt0050t00zQt000tQ5000 10ttttt5tt5t000000Q60000000000 k0t5t5t0t00tt0t0000t0000000000 15t0t000t00t500000000000000000 0t00t000000000000000000P000000 5000000000000t000000P0000P00P0 t00000t00t0000Qtr0000P0r00000r 000t00000000056Q00000000P0r0Pr 000000000000r06Q0000r0r000rr0r 00000000000000Qz0000000Prrrrrr 5t00000P0000000000000r00rrrr0r Q10r0P000P00000000000000rrrxQ0 Qm0r00000000000000tt0t00rrlx60 x15r00P000000t00tt5tt50000rtZ0 0000P0000P000000t00t00t00r0rrr rr0000r0000Qz0t0t0t00t0000rzQ0 r00r0P0000tmQ0t50t50000000rmq0 00P00rrr0000tt000000r0t0000Qm0 00rr0rtz00000tt00rrrrr00000tz0 00000rz1000t500rlrrrrrrr0rr000 001zrr00000000rrrrrlrlrrllrr0r 00Qt0Qz00t0rrrllrlrrllllHHlrrl 0000t1Q0000rrlHlrHllHHHHHHHllH 00t00t0000rllrHlrHHHHHHHHHHHHH 000000rrrllHllHllHHHHHHHHHHHHH 0000r0rlHHHHHHHHHHHHHHHHHHHHHH 0000rrrrHHHHHHHHHHHHHHHHHHHHHH } # tile 56 (rip) { t000000P0r0rrr0l0mQrrrlrrrrrrl 05000P000000rr0rr1zrrrrl00rrrr x15r00P0rrrP00rrl0rrrrrlz10rlr tx0rr0000rrrr0r0zrlrrr0z110lrr 0r0000r0P00rr0lz10r0rH011QrHrr 000P0P00rrrrr0r00rrlrrrrr0lrrl P0000rr0rrrrrrrrrrrrrllHllrrrr 0P0r0rrrlrrrrrrlrlrlrrrrrrrlrl 00rr0rrrrr0lrrrrrrrrr0rrlrrrrr r0rrrrrrrrrrrlrlrrr0000rrrrrlr rrrrrrr0rrrrrrrrr000000000lrrr rrrlrrrrrrlrlrr00000000000rrlr lrrrrrrrlrrrrr000000000000rrrr rr0rrrrrrrrlrr000000t000000rrr lrrrrlrlrrrrr000000000000P0rrr lrrlrrrrllrr00000t00000000rrrl lrrrrlrrllr000000000000000rrrH rrlr000rrr000000000r000000rrrH lrr00r0000000r00000P00r000rrrH lr000000000t0r00Prr000r0000rlH 000000000r01Q0000rlr000rP0rlrH 00000rrrrr0Qz0000rtz000000ztll r00rrrrllr0rr0r00rQ10r00001zlr rrrrrrlHHlrrrrr00rr000rr000000 lllllrlHHHlrlrlr0rll0rrr00rrr0 HHHHHHHHHHHlrrrllrrlrlr00r0rrr HHHHHHHHHHHHHHHHHHHHrllrrrrrrr HHHHHHHHHHHHHHHHHHr0lHHllrr00l HHHHHHHHKNHHHHHHHH0zlHHHlrl00l HHHHKHKHHHHNHKHNNK0zlNHHlrrllr } # tile 57 (rip) { lrz0rrrrrrrrrrrrrrrrrrrlrlr0tr rrlr0rrr0rrrrlrlrrrr0rrrrrrllr r0rrrlrlrrrrrrrrrllrQtlrlr0rlr rrrlrrrrrlrlrlrlrrrrt5lrrrrz10 rrrrrlrlrrrrrrrrrlrrlrrrrll1k0 rlrlrrrrrlrlrlrlrrrrrrrlrrr00r rrrrrlllllllllllllllrrrrrrrllr rlrlrrlHHHHHHHHHHHHlrlrrrrrrrr llrlHrlHlrrrrrrrrrrrHHHrllrrrl lHrrlllHlrlllllllllll0trlllrrl lHrrlHHHHHHHHHHHHHHHltQlHrrrrr lHHlHHHHHHHHHHHHHHHHHrrHH0Z0Hr lHHHHHllHHHllHHllHHHH0tlHrtQ1r lHHHHHlrHHlrlHHlrHHHH0QrHlH1kr lHHHHHHKHHHHHHHHHHHHHlrHHHHrrr lHHHHHr0t0HHHHHHHHHHHHHHHHHHHl HHHHHH0ZQ0HHHHHHHHHHHHHHHHHlrH HHHHHHlrrlHHHHHHHHHHrlHHlrHHHH HHHHHHHHHHHHHHHHHHHHllHHllHHHH HHHHHHHHKHHHHHHHHllHHHHHHHHHHH HHHKHKHHHHKHKHHKlxtHHHHHHHHHHH HKHHHHHKHHHHHHHHHtPHNHHHHHHHHH lHHHKHHHHKHHKHHKHKHl0rHHHHHllH rlHHHN5xlNHKHHHHHHH5qmNKHHH0xl rrHHHNtQlNHNHoHKHKHr9xKHHHKtQP rrlHHH0xlNKHNHHNHHHNNKHHHHH5xH rrrlHHHHHHHHKHHHNHNHHHNHKHHHlH llllHHHNNHoHHNHNHKHNKNHNHKHHKH HHHHHHHKHNHNHNHKHHHHHHNHHHNHNH HHHHHHHHKHNHKHNHNHNHNKlx0NHNHH } # tile 58 (rip) { rrrr0rr0r0r000rtQxtrr0r000Prrr rrr0rrr00P00r00rrrP00000r0000r rrrrr00Prr0rr0P00000r0r00P0r00 rrrrrrrrrr0rr0rrrrr0r00P0000P0 lrrlrrrr00000rrr0rr000000r0000 rrrrr0rlrrr0rr00r0rPQxr0rrrr0r rlllrrrrrlrrrrrrrrl0kQlrrrrrrr r000rrrrrrrrrrrrrrl0q1lrrrrrrr t6q1Hrrrrlr0rrrr0rl06QPrrrrrrl 5z6zlrrlrrrrrrrrrrrrt5lrrrrrrl rrlrrrrrrrr0rrrrrrrrPrrrrrrrrr rrrrrrllllrQtlrrrrrrlrrrrlrrrl lrrrrrz1z0rt0rrlrlrrrrrrllrrlH HrrrPHmq6trrlrrrrrrrrrrrlHrlHH lHllHKWqxHPlrrrlrHlrllrlllrlHr 0tz0HHxZPHrrrrrrrlllllll00rHHl 0ZZtllHl0rr0000rrrlHrlHlxZrHHH r0rrrrlP1zr00r0rlHHHHHHHQk0HHH llHHrll0zt00P0rl0k60lHHNtQrtQr HHHlrr00rrP00rrH5nqxrlHHHHHQkr HHHHrQtr0000rr0rrtjrrrlHHHrr0H HHHlrzt0P00rrrrrllrrrrrHHlrlHH HHHlrr00000rr0rrr0000rr0rrrlHH HHHlrrrr0P00rrrr00rrrl0QzlrlHH HHll0z110rr0r0Qtrr0trl01QrrllH HHrr0Qkktlrrr01zlltxrlrxtrrrlH HHrrr00trrrrrr0rHrrrrrrrrrrlHH HHrrrrrlrrrrrlHHHlHHllHHHlrrlH HHrlrrrrrr00rrHHHHHHHHHHlrrrrH HHrrrlrlrrrrrrHHHHHHHHHHtxrHrH } # tile 59 (rip) { tx500rQ10r0Pr000rr0rrrrrrrrtxr xZ0r0r1k0r0r0P0P0rr0rrrrrrlxZ0 0000000t0000rrrr0rrrrrlrr0rr0r 0r0r0rrrrP0rrrrrrrlrrrrrrrrllr P000Prr0rr0rrrrrrrrr0rrrrrrrrr r0rr0rr0rrrrr0lrrrrlrrrrlrlrlr rllrrrrrrrrrrrrrrrrrllrrrrrrrr 000rrrrrrrrrrrrrlrlr00rrrrrrrr 1q6tlrrrrrlllrlrrlHrk1Krllrllr t6x5lrrlrl01zHlrrlHr1tHrlHrlHr r0rrrlrrrH0k1NHlrrllHHHrllllll 1k5lrHtQ0HH0rHrlHHlrlHHHlrllrl z1rHll0tltQtrHllHHHlHHHHllHllH NHHHHrHHN1qZ5HHHHlrlHHHHHHHHHH lHrlHHHHHtZ0HHHHlQZQlHrHHHHHHH lHllHllHHr0HHHHHHtztlHlHHHHHHH HHHHlrlHHHKHHHHHHHHHHHHHHHHlrr HHHHHHHHHHHHHHHHHHKHHHHHHHH0QQ HHHHHKHKHHKHHKHHKHHHKHKHHKHPt0 oHHHHHHHHHHHHHHKHHHHHHHHHHHHKH HKHKHKHKKHKKHKNNNKHKHKHKKHNHNH HHNHNHNHNHNHNH0t0HHNHNHNHKHNHH HNHHKHHNHHHNNHtxxHoHHKHHNHHKHN HKHNHNKHNKNHHKHlHNHNHNHNHHNHKH NHNHNHHNHHHNHNHoHQ0KHHNHKNHHNN HNHNNNHKHNHKHNHNrXQNNKHNHHHNHH HNHKHHHHHHNHNNNNHrHNNNNNNNNNHt HHHNHNHHHr0HNNNNoooNNNKNNNKoo0 HHKHHHHHltQlNHNNNNNNNKKNNHKoNN HHHHHHHlxZQlNHHHNHHNNNNNooNNNN } # tile 60 (rip) { gCCCCCgCHNCNCNCNHCCNCoNCHrNNHH CCCNCCCCCCCCNNNNCCNNCCNNNNNHlH CCCCCNCCNCCNNNNNNNNNNNNNNNHHHH CCNCCCCCCCNNNNNNNNNKHHNNNHHHHH CCCCCNCCNNNCNNNNNNHHHHHlHHHHHH CCCCCCNNNNNNNNNNHHHHNHlHHHHHHH NNNNNCNNNNNHNNNHHHHHNNHNHHHHHH NNNNNNNNNNHHHllHHNNHNNNNNHHHHH NNNNNNNHHHHHHHHHHNNNNNNHNNNNHN NNNHHHHHHHHHHNNNNNNNNNHNNNNNHN HHKHHHHHHHHNNNNNNNNHNHHNHHHHHH HHHlrHHHHHHHHNNNNNNNHNNHHKNHKH t0lHlHHHHNHNNHr00HNHHNNHHHHHHH QxrHHHHHHHNHNHtztHHHHHlNHHKHHH rrrlHHHHNHKHNHlllHNHKHHHHHHHHP rlrrlHHHHNNNHHHKHKHHHNHHHHHHHl rrrrrlHHHlrHNHHHHHHHHHHHHH0rHH 0rrlrrlHHQ9rHKHHKHHHPlHPlrx5Pr rrrrrllHN0QrHHlHHlHHrPlrPlt0rr 00rlrHHlrlNPlHrlHrllrrrrrrPrrr ZQrrrHH09QHHlrrrrrrrrPPrrrrrPr xzrllHl0QxrlPrrrrrrrl0trrrr5t0 rrrlHrrPrrrrrrrrrrrrrxZ0PrrtQ5 rrrrrrrrPrrrrrPPrrP0Q6ZPl0000P rrrrPrrrPlrrrrPPPrrrtxtP0P0PrP rrrPPrrrPPrrrr0PP0rrrrrP000000 rrrrrrrrrrrrrrr00PP000000r05j0 rrrrrrrrrr0tZWx0P000j0rj500j00 rrrPP0rr0r0QqW6t0005j00j00j000 rr000000PP005t500000tt00000000 } # tile 61 (rip) { HH0rNHHH0xxHNHNHHHlrrrlHlt19Xk HHHlrloHt6XlNNHHHHlrlrrrrrrlHK lrltQrlHlrlHNNHHHlrrrrlr000rlr lrl0trlHlHH0zzrllrrlrrr000rrrr llHllrllrHlx990lrrrrrr0000rrrr Hllrrrrlrrrrx6rlrrrrrr0000rrlr HHllrlrrrrrl00z0lrrr00000rrrrr HHHlrrr0000rlrQtr0rr000000000r NHHlllrrlr00r00000000000000Pr0 NHH0tt0lrr0P00rrP0r0P00000QQz0 HNH5ZQtlr0000rrr000000000t1mQ0 HHKtQrlrrrr000000000000t00tt00 HHNz6rHlrlrr0000t0t0t00zt00000 HHl190HHrrrrr000t5tt5t0t000000 HlxZQ0rrrrrrrrrr000000t5tt0000 HrQ6Q0rrrrrrrrrrrrP0rPt0000000 l0xQx0PrrrrrrrrP00000000000000 rr000rrrrrrrr0rxZ0ljk1r000000j rrrPlrrrrrrr000tx0P06Qr050t005 rrrrrrrr0000P0Prr000000j000000 rrrr00r0Qxr000000000j00000jtt0 rrrPP0r06xrP0r05j0005tQWQ005tt r00PP0056x0x5000j0000z9qW50t5t P0000000Z66q6P00t00000xxttttt0 00PP000jxxQ9Q500t5t0tt00t5t5tt 00P0000j000j00500jjtt50t5tjttx 000jj0tt00000tjttttj5ttjttt5t5 5000005t0t00ttt5tt5ttt5t5tzttt 0j50005jt5jtt5ttt5ttttxtzzxztx 00jtt00t0tt5ttt5ttzx5ttxQ6ttxx } # tile 62 (rip) { qqnnnnnnnnnnqk99mQ0rHrrrr00000 P0QzQXkkqX11tlrrrlrrrr000P0r00 lr0ttt0zqq10lrrlrrrrrrrr000P00 rrrr0rr0110rlrrrr0rr0rr00r0000 r00000000rlrrr0rr000000P000000 rr00000r0000r00rr0rl0r00000000 rr000000000000Prr0rr00P000000t r0000tt0000000000P00P000005000 0P000000tt0tQm000000000000j0tt rr00000t5t5tQQt000000t00t05005 rr0P0000t0ttt0t0000tt500000000 00000000000ttttttttt5ttj50ttjt r0r0r0r00t5ttttzzttttttjt00t5t 0P00000000tttttzzzzzzzttztt0tt 0000000000t5ttttttzzzzzz1mtttt 000txt00000t000tttttzzzz1XQttz 000xZ50t5tttt00t0ttttzzz1mxttz 0005tj0t6m650t5tt5t5tzzzQzzzzz t00000ttQZQ0zQtt5t0ttzzQQzzzQz 0tt0t050t0t0Q6t0txz5ttztQQzzQz 5j0tttttjt5tttt0xq6tttzzzQ1QzQ 05t5t5t5t5tzt5tttWZ5tttzzzQQzQ tttttttttttxttxx5tttxxttzzttzQ Q6t5j5t5xt5ttttxxtzxtzzxxzzzzz QQxtjtttzxtttxttxxxxzxx1Qzzzzz ttxztxxttxxtxxtzxxxzxxxX1zzQzz txttttttxxxxztxxzzxxzxQ99x99xx zxzzQxtzxxxxzzxxzxxxzxQ1QQ11xx ttx6mxxzxxzzzzxxzxxzzxxxxxxxxz ztx6kQxxzxxzzxxQxQxQxQxQxQxQQQ } # tile 63 (rip) { 0000000t0t0tx1zzzxxzQQzzztzztx 0000500005tt1XzzzZQzzzzzztzztz 0000j0t00tttzQztQkmzzzztzzzttz 0005000tt05ttz1XmmQzzzzzzzz9qQ 050000t5tttttQkkkQzzzzzzzztnBZ 0j0tttt05tttzzzz1nktzztzzzt9kQ 05t00t00tttzzzxzQk6zzzzzzzzQ1Q 005t05ttttzzzzQ11ztzzzzzzzzzzx 00ttjtt5ttzzzz1QzzzzzzzzzzxxQz tt5t5t5tttzQQ1QQzzzzzzzzzxxQQz 0tttttt5ttzQ11zzzzzzzzzzxxzQQz t05t50tttzzzzz1QzzzzzzzzQQzQQQ 5t0zQ1QtzzQQzQq9tzzzzzQzQQQQQQ tttQ9k1ttQZ1QznktzzzzQQxQQQzzQ tttzzQzzzQmQQQQzzzxxzzzzQQzQQz tzzQ1xzQQQQzzQtzQzxQzzQQQQQQQ1 zzzm9Z11QzzzzzzQzzQzzQQQQQ1QQ1 zzQQQ11QzQQzzztzzQQzQQQQQQQQQQ QQQQQQQxQQzzQX61zQQQQQQQQQ1QQ1 Q1Q1mzzzzQzzmWk1xQQQzQQQQZ11Q1 QQzzQzQzzzzQzQzxQzQQQQ1zQmQQQQ QQQQzQzzQQQQzQ991QQQQQQQQ1QQ11 zzmQzzzzQQQzz6nq96z1QQQm1QZ111 zzzzzQQzQQzQQQ6Z6ZQQQ11QQQ11ZZ zzxzzQQQQzQQQQxQQQ61QQ11QQ16Q6 zzQQzQQQzQQQQZQQQQ61QQZ11Z11Z1 QQzzQzQQQQ1QQQQ11QQZZ11Z11Z111 QQQQQQz1QQQQQ1QZ1QZ1Z11Z611611 QQQQQQQQZQQQ11QQZZ11Z11Z111116 QQQQQ1QZkX16Z6QQZ11Z1111116116 } # tile 64 (rip) { zzzzzzzzzQQtzQQQQQQ1k_JJ3333YY zzzzzzzzzzQzQQQQQZQ6qiJYYY33YM zzzzzzxxZQzQzzQQZkmzt_YMMYYYMM tzzzxzxQQQQQQQQQmkXztB3YYMYMYY tzzxxzQQzzQ1Q6QQmk9mQUJJYMMMY3 xxQxZQQQQQQQQQQQQQXXQAY33YMMMJ xQxQQQQQ91Q1QQ1QZQ1XQL3J33YMYJ QQzQQzzZkmz11Q11Q11QQ_JJOJ3Y3J QQQQzQQQZQQQQQQQQ11QQUJJJ33JJ3 QQQQQQQQ1QQ1ZQQ1111z1_3J3Y33JJ QQz11zQQ11Q11Q116Q11QL333Y333J QQQzz11QQQQ11Q11Q611mfY333JJ3J QQQQQ1QQ1QQ11Q1611Q1nbY33JJJ3J Q1QQZQQQ11Q61Q1111QXBO333OJJJJ Q1zQmQ11Q11Z16Z111XqBfJJJJJJJJ Q1zQ1QQ11Q11111611XknfJJOJJOJ3 1QQ11QQZ11Q61111111mndJJJJJJJJ QQ61QQ61Z61Z1111111XBdJJJJOJJJ QQ11Q1161111616111QkLOJOJJ33Y3 1Q61Z11Z11111166111XLOJJOJ3YMY QZZZZ11Z111111166mm9nd3JJJJ3YY 111116161161661mXmmkBb3JOJJ3Y3 16111Z111661m661XX19_J3JOJ33Y3 ZZZ6111111111X6mXXmknbJJJJ3YYY 1111111616169Xm96XknBO3JJJJ3Y3 1111116X9966mXX6mXqBAO3333JJJJ 11166119Un1966mXXX9qLOJ333JJJJ 1116661Xnq6k9XXXXXmkiOJ3JJ3333 611mX6Xm11XqkXXXXXmkiJ33JJ33YY 6166m66X6XX99XXXkX1qbJ3JJ3333Y } # tile 65 (rip) { Y33JOOOJ3333J33MMMMwMwwwMwMwMY YYY3JOOJ33JJOOJJ3YYMYYMYY33YYJ MMY3JJ3MM3bBXQnkkBBnUBnB9xqnqk YYY33J3YwYd0EEgSSCCSNCCCEEcSSS 3YY3JJJYwMboEgcEcEEccEEcccccES OJ3JbbJYM3bBBUUUUnBBBBnnnB_BB_ JJJbfAO3M3bfdbfffiiifL_iAAbbfb JOOdALdJMJAAfAiLLi_LLiiAAAdddf JJbfiLdO3bnU_____LAfLAdAAfdddd JJOf__fJJAnU__U_LifAiAfiAfdddf JJJbUUfOJinU_U__ifALiiiiAfdffA OJJb__ibJLnB__ULfAiiAiLiAfdfii JOJbLBUdJinLi_LffiiiiiAAAAdfAL JJJOiqBdJinAfiAfAiiAiiffAAddA_ 3Y33OnBd3bBidfiL_LAdiiiiiidfi_ YMMYOULOJfnLiLiLLLfdfL_iAfdAL_ YYM3ObOJJAnLL_LiiiAddi_ifdfiLi J3YJOOJ3YOUAAL__iiAdfiLiAfALLA 3YYJOJJYYbBifLLLLAAifALiAAL__A YMY3JJ3YYAqLAiLLifiLfALiAi___L YY3J33333fqUiL__LLiAiAfiLLU_LL 3Y33YY333iqB__LiiiiAAAALLL____ 3YYYY3J33AqU__iAAiiAdAL__L_U_U YYYY3JJ3JLn_AA_LiAAAiL_L__U_UL 333JJJ33JinLfAL__LLLLL___U_LiA J33JJ3YYJLn_iiAL_U__LLL___iAff 333YYYY3OLqU__iLUL__L__U_ifiLi 33YYYY3JO_nU_U___L______ifAiif YYY3Y3JJd_BUL___U_LL_U_LAAiiAf YYY33JJObLULLLiiiiLiL__AAiAAL_ } # tile 66 (rip) { 33ObfOOO3YMYMwYYYwwwYMMYYYwwMw OOfLiddbJJ33333J3YMYJ3Y3JJ3YMM qq9QQt6qnWnnnnnnnnBBnnBnnWnnWn a7ccEEcacvavvvavvavI444vvvvvvv cccccccccEcEccaaaaap77ap77c77a UUBnBBUUBBBBBBnBBnBUUUUUUU__UB dfiiLAddfAffdAAiAifdfdbddbdfff i__ULLiiLLLAiALiiAffAfbfddiLAd i_LLLLLLiAiAiLiiAiAiLfbdfALffb i__ifLLLAiiiiLiiiiAALfdbfLiAdf iL_if__iiiAiiiLiiiiALAdbfiiffA LULLL_LiiiiiiiiiiiiifiibfLdbdf __L___LiiiiiAiALLLiddAidALdddf _iL__iiiiiiiiiiLLLfbdfAfiifAiA LfLLiiAAiiAiiLLLLdfifffiLiLiif ifL_LiiiiiiAALLifbfAAAAiLLLLAA AA__LiiAiiifiiifbdddLLiLiiiiiA i_LiiAiifAiiLiAffbbdiLiiffLiif i_LiiLiiAiiLLLddAAddiLLAddffAA iLLLLiiiiiiiLiddALAdiLiddbbdfL __LiiiLLfdfddfAiiiLLLidbbdddfA _LLLLLiAAAAAAfiLLiLLAAAfffAAAA _LLLLLAdLLL_iALLLiiiffiLiiiiAi LLi__iAfiLLAfffiLiiLifdiLiifAA L_LLLAfddfiAddfiLiiiLAfLLiAAff i_iAffddbdfAddiiiiiiiLLiiiAfff AffddffddfiAddiLiiiLiiiiiAAfff dddfAffAiAfddfAiiiLiLLiiiAffff dffiLAi_LfbdfffAiLAALLiiiAffff _LiiLLLLiAAAfALiiLiiLiiiiiAfff } # tile 67 (rip) { wwwwwwYJddOJ3M3YwwwwwwwwwwwMYM MMMMY3OAiAbbJ33YMMMMMMMMMMMY3Y B_nBB22ZZWWWWqnBUL_BnBinB_nnWn 42vvvEEEccaEcap77Kpac82vI8vvav ca7aacacccacccccccESaaS7aa7aa7 U_U__L____LLLLL_BLAAi___UUUUUU bbdbObbOdbbObOOObbOOObdfdddbdb dbffdfddfiAddbbOOdddbdAAAiffff bdiLffddfAAAbOdbObddbfAddiAAff ffALAddfffAfbbfddffAffAffAiAAA iAiiibfiAfddbdAAiiiiiiAiiAiAAA ffiLiffAffbObbOdAAAAiiifAiAAfd ffiiLAfffdbbbbbbdddbdfiAffAifb ffiiiAAfddddbObddbbOOdiifdAifb fiiiiddfddddbbdAfbdfAAfdfiffff AAAiAbdfbdfddddfAffAiifffAffAA ffAiidbdbdffdbbdAiiAiAAAAfdfAf ffiiiifdObfAdOOdiAAffffdfiffAf iiiiiLfbbfAdbbdfAAAffffffAAfff iiiiiifbdAAbbAiAfAAAAfffffAAff dddffdbbdAfdfiffffAAfffiAfiAff ffdfdbObddbAAAfffAAffAAAAAiAAf LiAffbbfbbbfAfffAiAffAiffAAAAf iiiAfbdAObAfffAAAfAiAiiAfddbbd AiiAdddddfiAAAAAffdfdffdbbdbOd fAifddbdAiiiiAfffddbbdbbOObbbf AiifbObbdAiifdAiAddfddbbbObbOA fAiAddbbdiidbdfAAdbbbbbbObbbdA ffAiiAbbfiAbbdbdAbbObbbOObbddf fffAiiiAifdbbbObdbbdbbObbbbbbd } # tile 68 (rip) { wwwwMYMwwwwMwwwwwwwYMYYYwwwwY3 YMMM33YMMMYYYMMwMMYJ333JYMM3JO WnBBnnnBi_B_BWB__nW2BBnWnAUBBn vv7opav82882I4428vccvpvca87v7p 7gaSSSa7g77a777acagaccaccccccc _U_UUnULUUUBBU_UU_AffL_LL__LL_ bdbbdidObdfAAbObbOOOOObbObOOOb ddfffAbObdAAfdbbbbbObdbdddObdd ffAfdbObObfdbObddbdddddbdbObdd AfAAdOObObbbbbddbbbdbbbbbdbbdd ffAAfbbbObbObbbdbbbbOOOObffddd dffffOObObbbdffdbddbdffdbbddOO bffAdbOObbddfAfddfdddfAfbOdbOb bAffdbObObddfAffAffdffffdObbOd AAfAdObdbbdfAffffdffbbddbObObb AAAAdbbffdffAAffffdbbbdbdbOObb ffAAfdddfAAffAffffbOddbbdfbbdd ddfAAffddffffdddddbbdbOObddfff fdfAffffdfdfddddfdbbbbbOdffAff ffffdddfffdfdddfffdOObbOdfdffd fffffffddddddddddfffdddbdffAfd fffffffdddddddddddddddfdbddbbb ffdffdffddfdddddbbbdddddbbOObO fdfAfdffffddbbbbbbddfbbdbbObOO ffdffdfdfdddbdddddddfdObOObOOb iAdffAdddffddddddfddddbbObOObb iffffffdfddfdddddddbdddfbOObbb AfAfAfdddddfdddddddddddfdbbbdO AAffAdddddbdddddfddddddddddddb Afdddfffdbbddddbdbdddddddbbddb } # tile 69 (rip) { J3MwwwwwwwwwwwwwwYMwMMYJdLfJww J3YMMMMMMMMMMMMMY3YMYJbiUUf3MM BUqnAUBBAbbAAAUnnnnq9mQQQ1qnUA s8EaKoCCHPjHlr7gggScEEEEEc7gCr EcccEcccccEcEcccccEScccSSSccEE ___UB__Uii__UBUL_B_LL_LfLU_BnU bbbObbbOOOObbdbObdbObbbOOOOdiO fdbbbdbObbOffddddbbbdbdfdObObb dbdddbbbdbOffdddbbbbbObOOOObOO ddbbbObdbbObddddddddbbObbbOObb dbObOObdbOOObddddddddbObbObObd ObObbbdfdbObbdddddbbbOObOOdddd bbbbbbdddbOObdbddddbObOObbddbb dddbOObbbbbObbdddfddOObObdbbbO bOObbbbbbbbObOOObbbObOObbdbbbO bbbbdbbddddbbbbbObObbbOObdbbbb dddddffddddbbbdbOObbfdObbddbOb fffffAfdObbbObbbbddddbObbOddbb fAfAffdbObdOObbbbdddddbdbOdddd ddddddbdObdObbddddbbddddbbdddd bbObOObbObOObOdffdddObdbbbbdbd OOOObbbbbOObOOdfddddbbbbddbdbb ObObddbOObbbbbffddbdAbObddbbbO bbdddbddbbbbbdddfdbddbbOObJObb bbbdddddddddddddfddddbbbbbObbO bOObddbbdddfdddffdddddddddddbO ObbdddbObdbdddddddddfdbbbddbOb OObddddbbbddddddddddfdddddddbO ObbdfffddddddddddddddddddfdddO OObddAfdfdddddfffddbbOObddbbOO } # tile 70 (rip) { wMYMwwwMYYMwwwwwMYYYY3YYYYYAmq YY3YMMYYYYYwwwwwwYYMYY3Y33YAmm UnnBBnnBAJMwwwwwwwMY333YYYYdkX CSCCgSSNkOMwwwwwwwMMY3333YYfXX cccccccSzAYwwwwwwwwwYYY33Y3Lmm L_L_UAAUkiMwwwwwwwwwwM3Y3YYfk1 OOObOOJbqfYMwwwwwwwwwwMMYYYdk1 OOdbbbObqfYYMwwwwwwwwwwwMYMdmQ ObObbdbAWiYwwwwwwwwwwwwwwwMdm1 bObbddbiXiMMwwwwwwwwwwwwwwwbX1 bOdbbbbi6fMMMwwwwwwwwwwwwwwOkQ dbbbbbbiXLYMwwwwwwwwwwwwwwwOkQ bbbbdbbimLYwMwwwwwwwwwwwwwwJkQ bbObddbiXiYwMYwwMwwwwwwwwwwJq6 bbbbddbimLYYMMwwwwwwwwwwwwwOqn bddbbdbAmiY3YYMwwwwwwwwwwwwO9k bbbbbbbA9iYYY3YYwwwwwwwwwwwOQQ bObbObbAkdMMYY3MwwwwwwwwwwwOqm bbdbbbbf9fMMY3MwwwwwwwwwwwwOkQ dddddbbA9dMYYYwwwwwwwwwwwwwb1z dfdddddfBOwwwwwwwwwwwwwwwwwOkx bbObbbbfqOwwwwwwwwwwwwwwwwwJnQ OOJOOOOd6dwwwwwwwwwMwwwwwww3BQ ObOOObbfnOwwwwwwwwwwwwwwwwwJnz bOObObbfkbwwwwwwwwwwwwwwwwwJqz ObOObOOiQbwwwwwwwwwwwwwwwwwOm0 bbObObbi9bwwwwwwwwwwwwwwwwwOX0 bbOObbbAqbwwwwwwwMwwwwwwwwwOqq OObbbdbAqdMMMwwwwwwwwwwwwwwJqB bObbbfbfliwYYMwwwwwYwwwwwwwbxt } # tile 71 (rip) { qXXXXXXm11161199X1QZX1Z1QQ1QQQ XXXXXXXX111Z61QZZ11ZQQQQzzQQQQ XXXXXXXXm1111Z1Q1111Q11zQ1zQmz XXmXXXXXmm11Q6nq11611QQz1QzQQQ mmmmmmmmXmm1QXBnQ11Q1QzQQzzzzQ m111Z111mmm11m6Qz161z11zzQzzzz Q1161111mmm11Qm1Q1QQQQQzzQzzzz xQZ61111mmm1QQk91QzzmQzzzzzzzz QQ111111111Z11QQQQQQzzzzzzzzzz QQ11Q116Xk91QQzzQQQQzzzzzzzzzz QQ1Qz1QQkqqX1zzQtzzzzzzzzzzzzz xz1m111Z1kkm11Qzzzzzzzzzzztttt zQQ11QQ1QmXQQ1zzzzzzzzzzzztttt 11QQ1zQ1zQ1QzQzzzzzzzzzttttttt qkmQz1m1zQm1Qzzzzzzztttttttt5t kmm1z11QQ1QQ1Qzzzzzztttttt5tt5 xz1Qz1Qz1QzzQ1ttzttttt0ttttt5t QzzzzzzzmQz1Qzzztttttttt5t5ttt zzzzzzzz1QzQXkQtt5t5t5tt0t0000 ttzzzzzztzzt9nQtttttttt5t0000t ttttttttzzzzQQt0t5t500tjt50tt0 0tttttttttzzttt0t0tt00050t05t0 0tt5ttttzztttt0t00t50t000000j0 000t000zqm0t0005t0000000t00000 00t0000tmQ00t00t05000000000tx0 005t0000000000000j0000t0000QZ0 r0005j0000000000000000P0056x00 6000050005000000000000P0006xr0 Wrr00000jj000000P0r00P0005Qxr0 0000000P000r0r0PP0PP0PP0rr000P } # tile 72 (rip) { QQ1QQQ11111Q1mQmXX11Q1QzQQ1Q1t QQx11zQ6111zQmmXqk1t1QzzzzmQtz zzzzzz11Qzz1m1zQmQ11zQmz11Qtzz zzmQzzzQzQQQQQQ1QzQQQ1QzzQzzzz zQkXzzzzzQ1ztzmQzmQzmQttzzzzzt tQkmzzzzzztzzzzztm1zzzztQmQttt zzQQzzzzzztzzzztzQQzztztQQztt0 zz1QzzzzzzzQzzzzzzzzzztQztttt0 t6_n0tttztzkmzzzttttttQX1ttt00 tznk0tttztzkmtztttttttz1ztt000 zt00tttttttmQttttttttttttt0000 tttttttttttztttttt0t0tttt00000 tt5t5t5t5tt0tt0zQ00t00tt500000 ttttttttttttt00Q1t000tt0000000 t5t0t05t005t500tt0000t5t000r0P tttt50t00000t00000005t0000P00r t5t50t0000000000000t0t00r000rr tj0000000tt00000000000P0rr0rrr 0500t0500000000000000P0rrlllrr 00000j0000000000P00P00rrrPt0rr 0000050000000P0000P00rrl06B9Hl 00000000000P000rP00rrrrr0z9QlH 0t000000P0000r0PP0rrrrrrrlHHrH 00000000PPr0rr0rPrrrrrrrrrHlrH 0000P0r0P00PPrrrrrrrrrrllllllH 00P00005000PP0rrrrrrrrrlHHrlHH 00PP0rxZ0r0rrrrrrrrrrlHrlHHHHH P0P0PrtQx5rrrrrrrrrllllllHHHll 00P00rr0ZzrrrrrrrrlHHlPHHHHHPr P00rr0r0ZxrrrrrrrlHHrlHHHKHlrr } # tile 73 (rip) { zzttttt500t5tt0000000000ttQztt zttttttt0t0000000000000t00mQt0 zttt5t00t500t000t00t00000tzt00 zttt05t00t00000000000000000000 ttt000000000000000000000000000 tt0000000000t0000000000000000r 0t00t00t0000000000000r0P00P00r 00000000000000P000P0P0000000P0 000000000000r000r00000r0rrrrr0 000000000P0P000P00rrr0r00rrrrr t00000P000000r000Prr0rr0P0rrrr P0P0P00P0r0rr0rr0rr0rrrrrrrrrr 000000rr00rrr0x5rrrrrrrrrrrrrr r0r0r0rr0rr0r0Zxrrrrrrrrrrrlrr 000rr0rrrrrrrr0Prrrrrrrrrrrrrr 00rrrrrrrrrrrrlrrrrrrrrllrrrrr r0rrrrrrrrrrrrrrrrrrrrrHlrrr0r rrrrrrrrrrrrrrrrrlHHHHllr00000 rllrrrrlHHllllllllHHlllrr000P0 r00rrrr0rlllHHHHHrllrrrrr0P000 tZZ0HH0QQQQ0lHrlHrrrrr0000rr0r 0txt0l0ttttrHHrrllr0r00rrrrrrr HHHtZ0HHHHHKHlrrrrr00Prrlrrrrr lrKtQlHHPHHHlrrr0000rrrlHHHHHH llHrtrHlrrllrrrrrrrrlllHHHHHHH HHHlrrr0rrrrr0rrlHllHHHHNHHHHH lrlrrlz10r0000rlHHHHHNHKHNHHHH lrrrrrtt0rrrrrlHHHKHKHNNNKHHHH rr0rrrrllrlHllHHoHNHNHKrlHNHNH r0rrrlHHHHHHHHHHHKHNHoPq6oNNHK } # tile 74 (rip) { 0t5ttttttttt5t0000P0ztrrr01Qr0 0000tttttttttt0000001zr000rr00 00000000t0t00t000000t00000000P 0000P000P00005t0000000P00Prrrr 0rrr00Prrr0r0000000r00rrrrrlrr r00rr0rrrrrrrrrrrrrrrrrllrllrl rr0rrrrrlrlrllllllllllHHllHHHH rrrrrrrrrrrrlHHHHHHHHHHHHHHHNH rrrrrlrlrrrlHHHHHHHHNHNHKHNNHK rrrlrrrrlllHHHHHKHNHKHKHNH0rNN rrrrrrrlHHHHHHHKHNHKHNHNHHx0KH rrrlHrlHHHHHHHNHNHHNHNHHNNNNrX rrllllHHHHHHHKHNHKNHNNNHNNNoHz rrHlrHHHHHHHHNHHNHHNNNNHNNHNoo lHHHHHllHHKHNHKNNHooNHHNHKHNNN llllllrrlHHHKHNNNHKHHHHHHHHNNo rrrrrrrrrlHNHNNNHNHHHHHHHHNHHo 00000rHHrlHHNHNNHHHHHHHHHHHHNN 00rrrrlHrll0rHNNHHHHHHHHHHHHHN 0rrlr000rHrQ5HHHHHHHHNNHNHHHHH rrrlrQ1Q0lrrlHHHHHHHNNNNNHHHHH llllrtztrlrHHllHHHHNNNNNNNHHHH lHHHHHKHHlrr0rrrlHNNNNNNNNNHNH HHHHHHNHHHrxZxl0xHNNNNCNooNNNN HHHHoNHNNNH000Hr00loNoCNooNoNN NHNHHNNHNNHKNNHNotPoNooCCoCCNN KHNHNNooNooN0tKooKNCoNCNoCNNCN NHNNKNoK0looPtKCCoCCooCNCCooNN HNNooNNKtPNNP2oCooCoNNoCCCoooN NHHKoNooHNoNoKNNNCCoNNCooCCNNN } # tile 75 (rip) { 0000rHHlHHHHHHHHHHHHHHHHKHHKHK 00rr00rHHHHHHHHHHHHHHHHHHHHKHN 00rH0nkoHHHHHHKHHKHHKKHKHKHNHH rrlNPq6NHoHKHKHKHHKHNHNHNHKHNH rlHHH5rNHNHNHHNHNHNHHHHKHNHNHH HHHNHHHHHKHN0xlNHNHNHoHNHHNHHN HHoHoNNHNHNHr0HNHKHNNNHKHNKHNH NHNHNHHHKHKHNNKHNHNHHHNHNHKKNN HNHNNHNNNNNHNNHNNNNH50NNNNHNNH NNNlrHNNKNNHNNKNNNl5Q0NNNNNNNN lHNtxHNHKKNNNNKKNN0xx0NNNHNHHN 6xxxxKNNNNNNNNNNNNNKHNNHNNKKNK t0r5rNNNNNNNNNNNNNNNNNNNNNKNNK NNNNNNNNNNNNNHNNNHNNHNNNNNNNNN NNNNNNoooooN0jKoNooNooNKKNNNNN oNNNNNNKoKool0NoNoNNoNNKKNooNo oNNHHHHKHHKHNoNNNNNNNNNNNNKKNo NNNNNHNHNNHx0NooNooNooNoootPNN HHNNHKHNHrtQ0NoNNooNoNNoNKx5oN HNHHNHNHH0QzrNNNNooNNNNNNHtPoN HKHNNHHNHlrHHNNNNNooNooNooKNNo HHHNNNNNHHNNNHHNHNNoNNKNooNNoo HHNHHHllHHHlHHNHKHNNNNHNooNooN NHHHlxxxlNHx0oHNHNHHNHNNNNNooo NHHHH0t5lHH00NHKHHNH0rNNNNooCo NNHNHNNNHHNKNHNHNHNHx0NNNNoCCN NHKHHHHHHNNHHKHNHKNNHNNNNNoCCo NNNHHKNNNNNNHHNHNHNNNooNNooNoo NHHNHNHNNNNNHNNNHNHNNooNooCCNo rtlHNHHNNNNNNNNNKHNNNNNCooCCCC } # tile 76 (rip) { KHKHNHNHHHNHNHNNNNr0HNHHll0rHl HNHNHHHHNHNHNHHHHHNNNHKHHl0rHH HHNHKHNHNHKHKHN0tHNHHNNHHHrrlH NKHNHNHKHNHNHNHr0HNHNNNNHlrllH HHNHKHNHNHHHNHKNNNNHNNHNNlrlHl KNHKoHNNNNNNNNNNHNNKNNHNNHllrr NNHoKHNNNNNNNKNNNNNHNNHNNHNlll NNHNNHNNHlHHKKNNNNNNNNNNNNNNHH NNHNNKNNtxxoNNNNNNNNNNNNNNNNNN HNNNKNNNr5PNNNNoH6xoNNNNNNHNNN NHNKKNHKNNNNNNNClq6oNNNNNNHNNN KNNNNtxxxPoNNoNoKPHNNNNNNNNNNN NNNH0xt05HoNNoNNoNCoNNoNNoNNoN NNNrxxPCNNNNNNNNNNooNooNooNooN NNNNHKNNooNooNooNooNCNNooNooNo ooNooNNNoNNooooooooH6tCooooooo ooNooNNNNNNNooNooNClq6oNoooooo NNNNNooNooNNNNNCCNNNPHNCCNCCNC NoNoooNNKNNNNNNNoNNNCNNNNNoNNN ooNNKNNNNHHHHHHNNHNNNNNNNNNNNo oNN0tKNNHNKNHHNHHKHHKHKHNNNNNN oool0NNNNHHHHHHNNHNNNHNHNNNNNN oooooNHlHHHNHHHNNNNNHNHKHHHHHN oNCoNNrxHNHHNHNNNNNNNNNHNKNNNK oCCoNNl0HNHNHNNNNNNNNNNNNHNNNH oCooNNNNoHNHKHNNNNNNNNHNNNNNNN CCooCooNNNNNNHCNNNNNHNNHNNNNNN oCCCCCCoNNNNNHz0NNNNNKNNrrNCoN NCCoCoCCCNNNNH9zNNNNNNHNrtHCCC NoCCoCCoCCCNNNNooNNNNNNNHNCCC7 } # tile 77 (rip) { HNHHoHNHNHHNHNHHKHKHHHH0rHHHHH rrHNHNHNHNKHNHHNHNHNKNHKNHHHHH QXrHHHHHHHHNHKNHHHNlHHNHHHHHHH QkrHlllHHHKHNHHHHHHHNHHHHHlllH zQrHrrrrHHlrlHHlrlHHHlHHHlrrrl rrlrrllrrlrxtlrrrrrrrrrrrrrrrr r0rrrHlrlrrt5rllrlrrllllllllll 0zrllrrlHllHlrHlrrrlHHHHHHHHHH tQrNlxtHHHHHHHHHHHHlHHHHHHHHHH P0HNH0rNNNHHHHHHNNHNNHNNHHNr0N NNNNNNNNrlNNHNHNNNNNNNNNNNH0zN NNNNNNCrq6oNNNNNNNNNooNNNNN0xN NoNNorHN6tNNNoNNoNNNCNNltxoKrl ooNoHx0KNooNooNooCNNCCoP66K7C0 oNNPxtxtNooNNCNNCNoooCoNHNCCoN oooHrl5xNoCoooCNCCNCNNCCCCCoCC oooCCNlPKCCoooCCoCCCCCoCooCCCC CNCNNCoNKNCCCNoCCCNooCCCCCCCCC CNCooCCCCoCCoNCCCCCNCCCCCCoCCC CCooooCCCCoCCCCCCCCCCCCoCCCCCC NNCCCCNogCoCCCCCoCCCCCCCCCCCoC l0NCoCCK1tCCKHoCCCCC7oCCCC7CC7 0xoooCCNq6gCrjoCCCoC77CCoC77C7 HHNNNCCCKoCCl0NCCCCCCCCCggCCCC NNNNNNNC77NC0QoCC7CC7C7CCCgC77 NNNNNHNNCCNCtZNCC77CgggCCC7ggg NCNoCNNNNNNNNHCCCCCNCCoC7gC7g7 CCCNHNCNNNNNNoCCNCCCCCggggCg7g CCoH0oCCCNNNNNCoNCCCC7CgCgg7gg 7CC77CCgCCCCCCNNCNNoCCCCCCgggg } # tile 78 (rip) { llrlrrrrrlllllHHHHKHHHHHrtHHlH lrrrrlrlrlHHHHNHNNNHNHNHNNNHHH HlrHHrrrlHHHHHHNNNNNNNNNNNNNHH Hll6q0HlHHHHNHNNNNoNNoNNoNNNNN llHqB5NHHHNNNNNNNNCCNCCNCCNNNN rrHPtrHHHNNNNNNNCNooNooCNoCCCC rllNCNHNN0Q00zPKNNCNCNCCCooCCo HHHHNNNNNzktQ9jHNCCCCCCCCCooNo HHK00HCCo0xNoHoCCoNCCNNCCCCl0N NNNxmHCNCKHNCCCCCoCCCCNCCCCKlC NHCzXHNNCCoNNCCCCCCCoCCCoCCCCC tmHNHKoNCCCNNNCoCCCCCCCCCCCCCC 1kHCNCoNCNNNoNCCCCCCCCCCCCNoKC 66HNNCNNCCoCCCHNCCNNNCCNCCCjxo NHoNNCCCCCCCCH60CgtZNgCCg7lqnH CCNNoCCCCCCCCo05HCH0Ngg7g7CZko CCNNCCCoCCoCCCCHjoggC7gggC7Nrg oCCCCCCCCCCg7CgCNg7Cg7C7g7l0r7 CCCCCCCC7CC7g7ggggg7ggCgg7oKog CCCCoNN777CCCgC7g7gCg7g7gggggg CoCCN6PaCCg7g7gggCggCggggggggg CC77N5tPCg7gCggggC7gg7gggggggg 7C77Ca067CCgg7gggggggggggggggg ggC7ggH07g7ggggggggggggggggggg 7gCgggCoggggCN7gggggggggg7gggg 7Cggg7ggggggNrgggggggggaggagga g7gggggggggg7ggggggggggggSgSga gg7ggggggggggagggaggaagagSgSSg gggggggggggag7SgggaagagSSagSSS ggggggggggggoHCaaaagagaSgSSSgg } # tile 79 (rip) { llHHHllrtt0tt0lHHNHHNNNNooNNoN llHHHrrlHKlxQxlHHHNHNNNNNNNooN HHHHHHHlHHHlrrHHHKHNHKHHKHHNHN NNNNHNHHHHHHHHHHHHHHHHHHHHHHHH NNNNNNHNHHHHHHHHHHHHHHHHHHHHHH NNNNNNNHHHHHHHHHHHHHNHNHNNNHNH CNoNNNNHNHHHKHHHHHNNHHHNNNNNKN CCCNNNNNNNNNNHNHNNNlNHNNNNNNNN CCCCCNNCNNNNNNNNNNrtKNNCCCCCCC CCCCCNCCNNNNNNNNNNHrNCNCCgoCCC oCCCCCCNCCCNNCNNNCCNCCCCoHoCCC CCCoCCHrNCCCCCCCCCCCCCCgQnxKCC CCCCCCoHCCCCCCCCCC77CCNPQZPoCC CoCCCC7gCCCCCoCCoC77CCN6jagCCC aggoC77CC77C77C77CCC7gotPgC7CC CHgg777CC7CC7gC7gCCg777poCggCg N07ggCgCCggCCgCCgogCC7gggCC7C7 77ggCg7g7g7ggC7gCg7gggC7g7gggg ggg7ggg7gg7gCggg7ggCg77gCggH57 gggggg7CCggC7ggggC7Cgggg7Cg0ZC ggggggggggggggggggggggggggg7Cg ggggggggggggggggggCN7ggggggggg ggggggggggggggggggorgggggggggg ggggggggggaaggggggg7gggggggggg gaggaggagggggggaaggagggggggggg SgSSaggSgggggSg7Cgagg7ggggCggg aSggSgagSgagSSSxq7SgHogag7C7gC SgagSgaaSSaSgSSPxgcgPKggggCNNC gSSSgSSgSgSgagSSSaagHoggg7gHrC SSggSgSgSgSgSSSgSSgSgggggC7CN7 } # tile 80 (rip) { rr0rPP00Pjrrx60050tQt5t5t0tt50 000PP0P0j5rPZktPj0Q6tttjtt5ttj PP000P000000tx500j0tt0t0t55t5t PP000P5005005000txx0t5tttt5tt5 0005P0tj00j00j00tZQtjtt0tttt55 00jj00000050000t5xt5t5jtt5jttt 005000505000t50ttxxtttjj5ttjzt 00000j00j50j5tj5t6Q0t5tjtttxx5 00j00jj0ttj0tt5jjtttjttxttxztx 00050tj05t505tttt0ttjttxtxxxzx 0000t5tjt00jtt0tttxxtxxttxxxxx 00j5tjj0ttjt5tj5tjjxtzxxztxxxx tt00t5t0tjt5tt0txttxttxxxzxxzx tt0jjtt5jtttxxttxtxxxxtxxxxxQx t5jjtt55t5tjjQZQtxttxxxxxxxZxx 5tttt5x5ttzjtxqXQxxzxxxxxxQxx6 jj5t55tttxxt0xWqZQxxxxxQxxxxZ9 ttttj5ttzjjttxZZxxxxxxxxZxZxQ6 t0t5tzt5ztx5zxxxxxxxxxZxxQxQxQ t5jttxtjtxxxztxxxxxxxZxQQZQZQQ jjt5jtttxZ6QxxxxxxxxZxxZQQQQQQ jtxtt5tjx69xxxxxxxxZxxQZQZQZQQ ttxxtQjjxZ6QxxxxxZxxZxZQQQQQQQ ttjjQ66xxQxxxxxxxxZxQZQQQZQQ6Z ztjxxZQxxxxxxxxZxZxxZQQZ1QQ6QZ xxxxxxxxxxxxxZxZxxQZZQQQQ6ZZ1Z xxtzxxxxxxxxZxxxZZQQQQZ6QQZ6QQ xxtxxxxxxxxZxxZxxZQQQQQQ9k6Z6Z xxxxxxxxxZxxxZxQZQQZQQ6Qkn6Q6Z xxxxxxxxxxZxZxZZQQQQZ6ZQ9k1QZ6 } # tile 81 (rip) { t5t505ttQz0t5tzt5ttttttxWkk6tx tttt0j5z91xjttxttxttxxtjWqn95x 5tt5tttQqqqx5xt5xtzxxxxzQZQQzz tt5ttttx6WWttxtzxzxxxxxxtzzxxx t55tt5zxt5xtzxxxtxxzxxzxxzxQxQ ttx5txztxxxxxzxxxxxxzzxQxQxxxx ttzztxxtzxxxxxxxxztxxxxQxQxxxx txtxxxxxtzxzxxzzxQQZxQxxZxZQZQ xxxxxxxxxxzxxQxzQknqZxxZxxQm96 QZxxxxxQxxxxQxQxZWWkZQxxxQQ6XQ Z6QxzxxxQxxZxxxQQQzxxQZZZQQQQQ QQxQxxZxZxZxxZZxQQxQQQQQQQQQQ6 xxxZxZxQxxxZZQQQQQxQQZQZQZQQQZ xZxxxxQQQZZQQQQQQZZ6QQQQQQ6QQZ 69ZQZZQQQQQQZQZQQkk96Q66Z1Z6Z1 X9QQQQ1XQQQQQQQQZ69m6ZZQQZZQZ6 6xQQQQm9ZQQQQQ6Z1QQQZ6Q6Z1Z1Z1 QQQZQQZZQ1Z66Z6ZZQQ6ZQ69X1ZZ66 QQQQQQQQQZZQ6ZQQ1m6ZQQ6k91661Z Q6QQQ1Z1Z1Z1ZQ6Q69k61Z9996Z116 X96QZZZZZZZZ6Z66669k6166661166 9k6Q1Z1Z6666666Z66696166666669 X9ZQZZZ66Z6Z66Z66666661Z6Z6Z66 666QQ66Z66Z61166611Z6Z61666696 QQ666666Z116Z66Z66666666X69666 6666Z6666616666666669696666696 kn6Q66996666666666666666969666 Wq6ZZ69k666666666696969666666X X996669k6666966X6666666696X66X 6666Z66X66666666666696966mXX66 } # tile 82 (rip) { xzxQ6zxxzxxxxQxxQxxQxxZxxQxQQQ xzxxxzxxQxQxQxzQZxZxzQQzQQQZQQ zxxQxxQxZxZxZxQQzQQZQQQQQQQQQ6 xQxxZxZxxxxQxQQzQQQQQQQQQQZQQQ xxxzxZxQxQQQQQQQQQZQZQQQQQ1Q6Z ZxQxQQQQQQQQQQQQQQQQQQ6Z6QQ11Q QQQQQQQQQQQQ1mm6QQQQQQZ6ZZ161Q QQQQQQQQQQQQ6kWXQ6Z66Z6QZ111QZ QQQQQQ6Q6Z1Z6Z6ZZ6ZQQ11Z11QQZ1 QQQ6QQQQZ6ZZQQQQZ1Q6X616Z6k911 QQQQQ6Z6ZQ6Q6Z1Z1111kXZ6Q6nq1Z QQZ6ZZ6ZQ6ZQ11Z11ZZ6661166kk11 1Q6Q6QZ1Z11ZZQ1616661111m9k961 ZZQ6ZZ11Z16m6611611616669km666 Z6Z11Z66666kqn6166116166X966Xm 1Q6616661669kq66166166m666666X 1Z6Z6Z1116666Z666Z1696669m69m6 116111166Z616616696666966X66X6 11661166k966966X6669m9616Xm9mX 61666966qk6666666X66Xm6k96Xm6X 66166qk666696969mXm66mkBnQXX6X 9k166k966966666666XX66knn9X999 kq6669696669m969m6XX99Xkkk69k6 69kk666666669X6mX6XWqq66k969k6 69Bq6mX96XX6X999X999qWWX999999 19Bn69XX69Xm69k9Xk99XWkk9XWkkk 66999qq669k699999999X9k999k96W 9kk9WqW999969k69k69k99999k999k kqqkX69k6XX99999999kW9mWkW99kW 99WWX69Wm9kk9X99X9kWm9kkWqqqnk } # tile 83 (rip) { QQQQQQQ61m6QZ11Z11111161116616 QQ6QQ6ZZZQZZ1111Z61111611m661X QQZ6QZ6Q6Q611ZZ111161166Xm696m QQ6Z1Z11ZZ1111161166661mXX9mXX 6ZQ11Z16Z111111161166XXXXXXXXX 116ZZ11Z1116Z611m666m9kqq9k9kk 11ZZ111111166661169mX9kqqkWkkk 61Z111116611m96619mXX9kqqk9kWk 1Z116116166666mXmXXXk99kkWk9Xk 611161616m1XXXXX99k99XX9999k9W 11611616X61XXXXkk9k9kXXX9XX9kk 6666666mmX6XXXkWkX9Wk9X999k9XW 66969166XX9k9k9kWk9k9999999k9k 661m61m9Xk9kWkWk9k9XkkXX9kX9k9 X669m69kqkkWk9kkWX9kW9X9kk69kW 6X669m9kkkkkkWkWk9k9k99kk999k9 XmX66XXXkkkWk9k9XkWkkWkWkWkkWk 6mXX6XXknqk9kWkWkm9WkX6kWkWk9k 99XX999kqqWkWk9kW99kW99k9kkqWk XXmXXkWkkkkWkkWkkkkWkkkWkWnWkk XX999k9kkk9kWk69W9k9kWk9kkqkkW 99k96WkkkkkkWk99kkkWk99WkWkkqW 9kW999kk9kWk9kWkW9kWkkqkWkWqqW 99X9kkkkkkkWk9kWkkWk9nUnkkkqWk 9k99kWkkkkWkWk9kWk9k9nUqWWkkWk kk9kWkkqkkk9k9kWkkWk9nBq9kWkkW 96kWkWkqk9kWkkWkkqqWkqnWkkWkWk 999kWqqqkqq9kWkWWqWkWqqkWk9k9k kkkWknqkqqnWk9kkWkWkWkWkWkWkkW k9WkkkkkqqWkWkWkWkkWkWkWkk9kWk } # tile 84 (rip) { 66XXXXmX99Xm99X9kX1qJ33JJJJJJ3 6XX66XXXXXmX9kX9kX1n3MY3JJJJJO mmXX6XXXX6Xk9X9qqk1nMwYJJ3JOJJ XXX999k99XXk99kkqW1nYwM3JJJJJJ k9X9kkWkk9XkWkWk9kmn3wwY3J3JJ3 WkkkWkWkWkkWkWk9knkn3wMMYJJOJ3 kWkWkkkWkkkkkkkkkqXn3MYMY3JJJJ kWk9kkkkqkkkkkkkqWmnYMYMYJJOJ3 kkkkkkkqnqkkkqkkkqqUYY3Y3JJJ33 kkqkqkkkqqkkkqqqqqn_YY333OJ33J Wkkkkkkkkkkkqqqqqqn_YMYY3J33YJ kWkkkkkkqqqqqkqqqknfYYYYJJ3YY3 9kWkkqqqqqkqqqqqqkBbYMY33J3YY3 kWkkqnnqqqqqqqqqqkBOYMY3JJ3YY3 kkkkkqkkqqqqqqqqqqBfYM3JOJ3YY3 k9kkkkqqqqqqqqqqqkBdYYJJJJ33YY WkkqkkqnqqqqqqqqqqBbMY33JJJ3YY 9kkkkknqqqqqqqqqqkUOYMYJJJ3YYY kkqkkkkqkqqqqqqqqq_JMY3JOJJJ33 kknqkkkkkqnqqqqqqk_JYM3JJJJJ33 kkkWkkkknqkkqqqqqqUJYM3JOJJ3YY kkkkWqkWqqkkqqqqqkUOYMY3JJJ333 qnkkknWkkWk9kkqqqkUJMMMY3JJJ33 WWWkWkWkWk9k9kkkkX_JYMMYY3JOJ3 kkkWk9kWk9kkWk9kXqf3YYY3YYJJJJ k9WkWkk9kWkWkk9kkqf3Y3JJ333JJ3 Wkk9kBn9k9kWkWkWk9UOJJJJJJJJOJ WkWkWqqk999k99999X_JOJOJJOJJJJ kWkWk6W996X996X66m_JJJJOJJO33J 9mk99996k96k96k961U333JOJ3JJ3J } # tile 85 (rip) { J33JJJJJfL_AAiAAiALLAiLiiiAiL_ JJOJJJJOi__AAiiiii__ffiLii__LL OJJJ3OJOA_UiiAiLL_U_LAffL_L___ JOJJJJJOA_LLiiiL__LiAffdAiAAii JJJJJJJJiLiiiiL__LAfdfffdddddd 3JJJ3J3J_ULiiL___LiiddAAffifdi 3JJ33YYJUBiiiL_U_iL_LAfiiiiiAA JJJ3YMM3nBiLLLLU_L__UifLLiiLLA 3JJJJYMYBni___AiU_U__LALidfi_L J3JOJJ33BBiU_iiLU_U__iAiiAi___ J3JJJJJJnBL_if_U___UUifAL__LL_ JJJ3JJ3JBn_Uid__U_U_Uifi__fdfA JJ3YYYYJnniiii___U__iiL_Lfffff JJYYMMM3nnAfL_U_L__ifi__AdfAiA 333Mwww3nBAiAiL__UifAL_ffAAAii 33YMwMwMnBAiLLiiLULfALLddALLii 333MwMwMnBAAL_AfALLAAiifdA__LL 33YMMwwYUBAfAiLAdfiidiLfALiL_L 33YYMwMYBBfffALiddAiAiiAi_Ai__ YY33MMM3BBAAffLidfAiLiAAiiAi__ YYY33MM3BnULAfLLifdfLLAddfAAAL 3JYY3YY3BnUUifL_LAfiLLiffAiAAi JJ3YY333Bn_ULA__iiiLiLLiiiiAAi 33J3YYYJnnUULA__LiAfiiAfddfffi 33JJ333bnn___L__LLAfLiAfAiAAiL 333JJ3JfnB____U_LLLiLiAiLULL__ J333JJJOnn_iAALLL__iffi_____U_ J3YY3JJbnBiiAAiiiU_LAi__U_U___ J33YY3OiB_fiiiAAi_U_iLU__L__LL 3333Y3OUBULfAAAdA_ifAL_LLLU_LA } # tile 86 (rip) { __LLiL_LAAAAfdiLiAiiiLiiiAffff LL_LiiLifdffddiiifALiiLiiAAfAA _LLLidddddbdbdLAdiLiLLLiAAiiAi L_L_LdddfddddfAffLLLiLiiiiiiii i_L__ffffAAdfAdALiiiiiiiiiAAii AbdiU_AdddddffAiLLiLiiiiLiifff AAfi_LLidddddfLLLiiiiiLiiiiAdd iU_LLL__dddddfLLLLiiiiiiiiiAdd L__U_iiAifdbdAAiLLiiiAAiiiiiid __LL_LiAiAddAAfiLLiiiiiiiiLiAb __fAL_AfiAdiAffiLLLiAiLAAiiAfd iiffdifdAfdiAdfiLLiiAiiAiiiAff ffffALAdAfdLfddALLLiAiiiAAfddA ffdi__AdAffLfbdAiLiiiiiiAfdddf iLLLL_fbffdAfdddddfLiAiifbdfAd L_LLLLAddddAAAAAfdfiLLiLfddddb LLLLLLAddddfAiiiLLAfiiiLAdddbb L__LiiAddfdddddALLfbddfdddbbbd LL_LLLAddddddddA_LAbbdddbdfffd LLL___iddbdAAfdALLAdbddddfiLif LLLL_LLLfdbffdddffdddddAAiiiAi L____LL_ifdfddAAAAddAffiAAiAAi _U___LLL_iffddiLLLAdiiiifdiiAi __L_ULLL_LAddddALLiiiiiLddiiii _____LL_LLiddffAiiiALiAAfdiLii ___U_L__L_LfdfAAAAffiAdffAiiii ____L__LL__ifddddfAAffffAfbALL __U_L_LLLLLLfdbddddfffffdddALi L____LLLLLLLAdddddbdfAfddbdiiA iLU_U__LLL_LLibddddbfAffdbddfA } # tile 87 (rip) { ffAAiiiAfdddbbbbbObddddfffdbdd fAAiiifdbdddbbdddObbdAiiiAfAAd iiAAiifddddbbbdddbfiiAAffAffdf iiiiifAAffddbbdffddfAAfAfddfff iiiiifAifffddbfAfdbbffAAdbdfif AiLLiiAdddAffffffdbbfiifdbdfii fffiLLdbbbbddffAAdbbfiiAffdfff dbbfiidObbObbbdAfdbbdfAAAAfddb ddObffdbbbdddbddbbObOObddddbOO dfbbbdbbbbbddbdbbOObbbbObbObbb dffbObbObbOddbdbObbbdddbObbbbd AifdbdddbbbbbOdddOOOObdAAAAdbd ffffdbdddffdbbdddObbdbbAiiifbd dbAifbbiffddbdfdbObdfbbdAAAdbd bdiifddfdbbbdbdbOddfddAfffAdbf dAiAdbdfbObdbbddbddddfAffAdddd fLiAfbbddddddddAAfddAAfdfAdddb AiiifdbdiiAiAAiiiiAAAfdfAAfdbb fiiAdfddAiiiiiiiiiiAAfffAAdbbO AiiffAfdiiAAAiAiiiAAffffAfObdO iAiAAffAiiAfAAiiiffffAAfiAObbb iAiiiAfdAAAffAiAAAAfAfAAdddbbb iiiiiiAdfAAfAAAfAAAfAAfibOdddb iiiLiLiAiiAiAAAAifAAAAAifbbfii AiAiiiiiiAfAiAiiiAAAAiiddddAiA iiiiiAAAAfAAAAiAAiiifAAbObAifd iiiAAffAAAAiiAfAAiiiidbbbbffbb iiiiiAAiiiAiiAAiifdfbbbbbbddbO iLLiiiiiiAAAAiiiAbbbObbddbbbdb iLiLiiiifAiAfiiAdObdddfffdbdAf } # tile 88 (rip) { ddddddfdddddddbbbbbdbdddbbdddO dbbbbdddddfdddbbbddbbdbdbddddb dddddfdddddddbbbdffdbObdfddddd fddddfbbdbbddddbbbddbbbdbbbddd ffAddfbObbOffdfdOObdddfOOOObdb AfffdfdOddbdfffdbbddObddbddddO AAAffAdbdddddddbbbdddbbbdfdbOb dAAAAffdbdfbddOObObffdObdfdbOO bdAAfffdbObddbOdfdddddfffffdbO bdfffAAfbbbdbbbdfdddddffAfdbbb dfffAAAfAdbbbbdfdddddddfffdbOO AifAiAAAfbOObddbOOdffffdfffddb dfdffbddbbOObdbbbObfAffddfffdb bbbddObbOObObbObdbbfffddddfddO dbObbbbOdbObdbObdddffdddffddbb dbbbdddbddbdbbObbddbffdfdbbbbb bOffdffdddddbObOOdbOffdfbOOOOO ObAAffddbbbdddOObOOObbddbObObd bbfAAAfbbbdbbbbbOddbddbbObbbdd bffAAifbdddbOObbbffdddbbObdfff dffAAAAAAffddbbOObObffdbbOOddd ddfAAAAAAfffdbObbOOObdfdbbbbdf bdfiAfffffdfdbObdbObObdbdfdddf dddffAAfdfffddObdddbbbOObfdbdf dbdddfffdffffdbbbdbbdbOddddbbf bOddbdffdffdffddbbbbdbbAfbdddf OObdbOdAddfddfdddbbbddfffdObfd ObbbbbdfdddddddffObdddddddbddb bdbbbAAfdddddddfAbbbdbObddbdbO ddbbbAiAffddddfffbbddfffbOOOOb } # tile 89 (rip) { ObbbbbbbbddddddbbbbbOObbbddbOb ObdbOOObObdfdbObOObbbOOObbdbOO dffffbOObbbfbObbbddbObObOObbdb dfbdbbbbbbbfdbbddbbbbbbbbbObbO bbOOOddbObbffddbbbObddbbddOObb bObObffdbbdffdbbOddbbObdbOObbd OOObObbbbbdfdddddfdbOObbdbObdd bObOObOOOdffddffffbOObbbbdbbdb ObOObObfddbdbdbdddbObOObObdbOb ObbObbdfddbbbbbdbdbbbbbOOOddbb bbObdfddddbbbdddddddAbObObbddd bbObffAfbddbdfAdddffdbOObOdddd OObbbbddbddddbdddbddbbbOOOdddd bObbbObddbddbOObdObbObdbOJdfdd bObdbbdfdbOOOOOOOObffbOOOOdfdb ObbbbddddbbbbddbdbdfAfbbbOdffd OObbbddddbddfffdddfdfffdbObdff bOdfdddddddffdbObbdddddddbbObO ddfffffdddfffdbbbdddddddddOOOb fffddfffdfffffdddddddddddbbObO dddfddffdbddfdfAfddfddddbOOOOb ddddddffbbbbbdfdbbbbbbbdbObObO fdddbddddbOObbdbOObOOObbbOObOO fdddddffdbbObOOObObbddbddddbbb fdddbbbbbbbbdbbOObObbbbdddddbb AfdbOOObOOOfAdbObObOOOObddbbbb dfbObfbOObddbOObffdddbOdffdbbb bbOOOffbbbbdbObddAfdfdbdfdddbb ObObbdAfdbbdbbbbddddfdbdddddbb bdObffffddbdddObbdddAbObdffddb } # tile 90 (rip) { ObdbbbOAtAwYYwwwMMMMwMMMwwwJq5 OObbbOOAkOwYMwMYM3YMwMMMMwwJBz ObOObdbfBJwMwwY33OJ3MMMYMMwJnt OOOObddAnOwwMM3JJOJ3YYYYYYwOnt bObbddbfnOwwM3JOOJ33YYYYYYYbq0 ddfddfbbi3wwMJObOJYMwMwwwwwOX0 dddddfbb_JwwYJbbJ3YMwwwwwwwJq5 bbbbbdbbnOwYJOdbJYYMwwwwwwwJn0 dbObddOd9fYJOJbOJJ3YwwwwwwwJq5 bbbbbdOdQBJObOOJ3YYYMMMwwwwJqx bObdbbOftqOObbJ3YMMMY3YwwwwOkZ ddbbbbOdZnOOJJJ3MwMMYMMwMYMAtr ddbdddbd6U3JJJYMMwwwMMMYYYYf1H dbbdddbA9LM333YMMwwwwwM33YYbqP OddddfdfnbM3YMMMMwMMwwMMYYYbkP bdddfdbdBOMYYMMMMMMwwwwwMYMb9P dbddddOb_OMMMMwwYMMwwwwwMMwbmH bOOObbOdBOMMYMMMMMMMYwwMMwwOkl ObbbbbbbmfwwwMMMYwMMMwwMMww3nj ObdfddOfxAwwwwwwMwMMwwwMMMw3Bj OOOdfdbi9bwwwwwwMMMYMMwwwwwJqH ObObdddikOwwwwwwwwMMYMwwwwwOnl bOOOOfdAnbwwwwwwwwwMMMYMMww3nl OOdbOfdAqOwwwwwwwwwwwMMMMwwJkH bbbbbfdAnOwwwwwwwMwwwwMMMwwJnH ddObbdbAqOwwwwwwwMMwwwwwwMwJnP bddbObOLPiwwwwYY3YYYYMwwwwwJqP bddbbObLtfwwwM3Y3Y333YMMwwwJqH bddbObdikbwwM3YYYYYYYYYYMwwJnK bbddbdbinOwwMY3YMwMYY3YYMMwYLl } # tile 91 (rip) { l0r0Pr000PP00rrrPrrPrrPrrrrrrr l00PP00r0PP0rr000rrrrrrrr0rrrr l0rr0rrrrrrrP0QtrrrrrrrrrrrrP0 lrrrrrrrrrrrPrt5Prrrrrrrrrr5t0 lrrrrrrrrrrrrrPrrrrrrrrrr0rtQ0 lrrrrrrrrrrrrrrrrrrrrrrrrP0000 Hrrrrrrrrrrlllllllrrrrrrr00000 HrrrrrrrrrPHHHHHHHlr0000000000 HHHHHHHHHHHHlrHKHPrr0r0r0PrrPr rlHHlKHHHHKHHHHHHlrl00rrrrHtzr 0lHlrHlPHHHHKHHKHHlr0rlrlrHQ90 HHHHHHHHHHKHHHHlrHlrrlHHHlxQZx KHKKHKHKHHHKKHKHHHlrrlKHNH00P0 oHlllHKKKHHHHNHKKHlrrHNHKKNKKN olxxxlKNKKHxPKKNHlrrHHHoKHKKHH NKj0PHHHKNlx5KHHlrrrHNNKNNoKNN KHKKNHNHNHHxrNHNHrrlHNNNNNNooN oHpKHKKHoNKHHHHHHrlHHHKoooooNo CNKNNKoKooKooKHHHllHHNKooooooo CNNNNNoooooNNHNHHHHHHNNooNoooN CooooKKNKoNooKHHHHHHHNoooooooC CooooKooKKooooNNHHHHNHrooCCooC 7oNooooooooooNrlHHHNoP0KCCCCoC CoooooooooooCPqmNHNNoKsCCooCCp 7oooCooCCooCN06xKNNooC77oCCC77 7ooCCooCCCoCl0ooHHKoCCC77CC7pC 7CCooCCoooCoooNNlZ0C77CoCCp7CC 7CCCpCCpoC7o77oNH65C7CCCCC7KHC 7KC77C77C7pCCpooNtlCNCCp7C7Kr7 ojN77CoCCCCCCCNNNoKPjs7C7C777C } # tile 92 (rip) { rr0rrrrrt5rlrrrrrllHlHKHllllrr rr0rrrrrrrr000rrrrlHHHHHlrrrrr rrrr00000006Q000rrrllrrlr000rr rrrr0000Qt0Qzz000rrrrrrrrrrrrr r0rr00001zrrtQ0r00000rr0rlrrrr P000000000rr00rrrrrrrrrrlHHHHH 00000rrlllllHHllllllllllHHKHKH 00rrlHHHHHHHHHHHHHHHHHHHHNHNHH rrlHHHHPHHHKHHHHHHHHKHKHHNNNHN HlHHHHHlHKHHHHKHKHKHKNNKNHoNHH KHHKHKHHHHHKHNHNHNHNKHHoNHoKHN PKHHKHKHKKHKoHKKNKKNNrxKooHNKH PoKHoHNNHNKoKKol0KKKolPNooKHHN NHNHNHKoHKoNKKN5xNoKKoooooooHN KKHNoKoKNKKNoKtxxKoNooNNNNoooo NKNooKKKNKKNoKP0rKoNooooCCCCCK NNooooooNooNoooooooNooopCNHKHj oooooooNooNooooooCCoCCCgNPqqq6 oooKPrNCCooCCoooCNC7gotW6WWnqW ooNljt0KCCoCCCoCCooo8xqUnnqWn6 CoCoKoxZNCCCNoCCCgH6U_BnnnqnWW oCCCC7PjN7pCCCC7KZnii_nnqnWWqq CCCCCp77C7pCoCCH6UOJUnnnnqWWWn pC7pCCCCCCCCCCCqiJb_nnnqnnqWWn CC777CC77NC7gHqiOOLBnnqnnnqWWn CCC7pCNp77CCpWdJO_nnqnqnnnnqWq CpCKr7or7g7CkLOJbUnnqnnqnnWWnn C7CoKgCK7gHZUO3O_nnnnqnnnnqnWW g7gCo77ggoQUOJ3fnnnnnqnqnnnqWZ 7ggPZPogaPnJ3JbUnqnnnnWnnnWnq2 } # tile 93 (rip) { r0rllHHHHHHKHHNHoHNKNoH6xKNNKN r0rlHHHNHNHNHNHKoHKKrlHNNHNooN r0rlHHKHNHNHKKHNHNoH9mjKNNKKNo rrrllHHHKNHKKoHNNNNHxtPKKNKooo rrrrrHKNoNHoKNNKoNNHoCoKKNNooN HllrrHHHKHNHNNoNHoooNooNNNHNNN HHlllHNHNHKHNNoNNoooooooNNNNoN HHHHHNHKHNHNHHNNNooNooNooNNooN HKHHHHHNHHHHNKNooNoooooNoooooC rtzz0HHHHHHNHHNoooooooCooCooCC 0Zk6xrHKHNHKHNooNooooCCKoCNNCo HrQtHHNHNNNHNNoooCCoCCK0roCooo NHPHooNNCNNNNNNooCooCCKtPCCCN7 HHooNKKNHHNooNCCoCCooCC2HCCCC7 P0ooPtjjqZKCCCCggoC7oCCNCC77CC tQzzxWZ6WW0o7CH9nBqtlKKlKKsoCC Q6k99nW99ZxpCN9LJ3bn5rjxjHjPoC 9k6qqkk66xHCSPfJJ3OUxjxQxxjxt7 W6qWqWZxZPoCS0OJOJJb6tZZ69xZZj ZZnqWZxjjKC7atbJOJJb9Q6Z6W6Z6Z WWW622jQHCgg7xdOOOdB6ZZZjxZWkQ W6WZxQQx7KtjKPB_BnWxlr2xZx6kWZ WWWWWkWtpP660lkW6o7pPPxZZZ69kZ qWWWWqkZZtKK5WWqqZZkBBnW6ZZZWW WWqkqnW9qZP8x9qqWnBLbUqZZWWWZW WZnWWnWqqWxtZ6nqkn_ddnZZ66qW6W W6WWWWqnWW6996ZWWkqqqkWW96Zkqq WWWWWWqWk9WkWZWWnWqWWWq96ZZ6nW ZZW2WWWWWWWWWZWqqnqnZWqZZ6ZWqW I22II222WWnWZW222nqWWZ22xZZZ6n } # tile 94 (rip) { NHNooNNoooooNCooNClroCNNCCCoNN NKKKNNNNooNoCCoCCor0NCNNNCooNN oKtPoNooNNNooNCooCCNoCCooNNNNN oKPloNNNNNNoooNCNNCCCoCCoooNNN NNooNNNHNNNNooNNCooCCCCCooCCNN ooooNNNNNNNNNNNooCooCCoCCNNNNN CCCooooooooNNoCNCoCCCoNCNN0rNH NoCCoooooooNNCCCCoNCCCCKNNt0NN CoNoCooCCCCCNoCooCCCCoK0rNHKNN oCNCC7CCCCNoNCCCCCCCCCorHNNNNN CCCCoNKoCCooCCoCoCCCCCCNNNNNNN CCo7Kq1CCCCCCCoooC7poCCNNNNNNN CCN7o9xCH5toCCCoCCC7CCoNNNrHNN pCCCKjlCPQZHCCCCCCNCCCoNNH0rNN CCCHxqZgpoNCCo7pCC77oCCCNNKNNN C7CN5ZPC77CCCC7CCCC7CCC7CNCCNC 77CCCgCCCCCCoNCCCoCCCCC77CCCCC go777CCp7CC78PN7777p7CoCCCpCCC HoKp777CC77gl077CC7777g777777C 5lPHC77CC77CHP77CCCgC7Cg77CgCC xxxj5Cg7gor777C777gC77CgNr7g7g ZZjZxKgg7H0Cggg77gg7Cg7gCo7ggg Z6xZZl77CKlC7gggCCggg7ggCgg77g 9ZZZxjjPgg7g7CgC7g7C7ggC7gCggg 96ZZjQZQrK7g77ggg7gCg7KCggg7Cg 6WWxj6m6QtP7ggg7CggggKP7gg7ggg WW6tHZW6Zxj5og7gg7g7gg7ggggggg 9WZ5jjZZW6Qr7ggg7gCg7ggggggggg WWZtjxZZW9Zl7ggggggggggggggggg qW6xjxZ666Z6lagggggggggggggggg } # tile 95 (rip) { l0HHKHNNNNNNNNNNHNNNNNoCCCooCC NNNHNHNNNNHNNHNNNNNNNoooCCoCCo HHHNNHKHHNNNNNNNNNooNNCCooCCCC NNHNNNHNHNNNNNNNoNCNNoCCCoCCoC HHNHHHNHKNNHNNNooCCCNooCCCCCCC NKHNNHNNHHHNNNNNCNNNCNNoNCC7pC NHNNNNNNNNNNNNNoCNNoNoooCCCC7C NNNNNNNllHNNNNNooNoooooCCCCCNC NNNNNNtkWzNNNNNNNCNNCCCCCoCCC7 NCoNNN0zQ0NNNNooCCCoCCCCCC7CC7 NCCNNNNNCoNNNNoCCCCCCCoCCC77Cg NCNNNNNNNNNNPPNoNCCCCCCCCoC7go oCNNNNNNNNNN0QoCNCCo7CC7CC77gC NNNNNNNNNNNCtZNCCCCC77CpCC77CC NNNNNCCCCCCNNHNCCCCCo7CCCCCCCN oNNNNCCCCCotrCNHrCoCggg7CCCCCC CCNNNCCoCCN6tCCl0NCC77CgCCCoNC CCCCCCCCCCCtrCCNHCCCCCCCCCCl0N CCCCoCCCCCCxtHCCCCCCCCCCCCCHlo CoCCCCCoCgCxQrNCCoCCNNCCoCCCCC 7gCCCCCCCCCooNCCCCCCrHCCC7gCg7 g7CCCoCCCCCgggCC7CNrQ0CgH07agg 7CCCCCCCoCCCg7CgCCH0Z0ggPZ7agg g7gCCCCCCCC7gCg7gCC777ggHjgagg ggKoC7CCCCCgCgCgg7ggaggg77aaaa g7lKCg7CCoCggggggggg7ggaaagagg ggg7gCg7ggggggggggg7HNagaaagaa ggggggg7rKggggggagSg5HSSgaaaaS ggggggg7xraaaaaaaaSgxHcaaSSaac aggaaaaa7gagagSaagaaggaaaSSSSa } # tile 96 (rip) { oCCoNCCoCCCoNoCNoNNNNNNNNNCCC7 oCCCCCCCCCCCCCNNNNNNNNNNNNCCCC CCCCCCCCCCCCCCCNNNNNCNNCCC7gCg C7CCCoC7NCCoCCNNNNNNCCNCog7ggg ppNNNC77CCCCCCNNNNNNCCCCggC7gg CoPjPoCCC77CCCCCCNNNCCCgCgCg7g CCKPHC77CC7oCCCoNNNNCoC7g7gggg CNCCCC77CCCCCCCCNCNNCCCCggg7gg H0jHCCCCCCCCCoCCCCCCCCCCCgCggg olrKCCCCCCoCCCCCCCCNCCCCoNC7gg gCCCoCCoCCCCoCCoCCNNCoCCHrgg7g CCCNNCCNNNNNNNCCCCCCNNCCC77ggg CCCCNCNNNHrNNNCCCCCCoCCCCggg7g CCoCCNNNCl0NCCCCCoCCCCCCCC7gC7 CCNNH0lCCNNCCCCCCCCCCgoCCCgCCg CCNCotPCCCoCCCCoCCCCgggCCCgggC CCCCCjHCCCCCCCCCCC7gC7CCCNC7gC CCCCCNC7CCCCCoCCCCCCCCCC7gCggg C77g7ggCg7CgCCCCCCCC7CC7gCgCgg ggggggggggggCCCg7Cggg7CggCgggg ggggggggggggggg7Cggggggg7CgggS ggggggagaagaCNgaCCNNoooagClxW9 gggggaaaggg70tCg7HllPPlor6qBLA gggggaSagp5Z6ZPHrPPPssPkLOOObL agaaa7oPWqWZxjPPPllHpolkLOJObd aaaaCj6qBBqPpoKPPlHpKKHQnfdOOb aSEKkB_BnWjPo7jjjxPsKpH2qdJ3Jb KxWqUfiUqxPlosPjjjjrK77pk_fiBk xBLdfi_nj2jlKolPjjtjl7Sgxq9xj7 ZU_fA_qxjtxPPPKHjxjjjroK82jr5W } # tile 97 (rip) { 7g7g7g5ZoCCCCCNoCNCClKCCC7gggg 7ggCCaZkKCCoCCCNNCCN0lCC7ggggg gCC7ggCsgggggCCCCCCCNNC7gC7ggg 7gg7ggCgNN7g7CCCCCCCCggg7ggggg CNgg7g7NrHCg7CCoCCCCCCgCggSgga Nr7gCgNrNggCCCCCCCCoCgggCggggg CKC7ggCHC7CCCCCCCCCgC7ggggggga ggC7ggggCCCCCCg7Cog7CggggaggSa ggggC7ggg7CCoCCggCggC7ggggagga ggaCggg7ggCgCC7CgCgCgg7ggggagg gCgggg7Cg7Cg7CggCggC7gC7gg7g7g 7Cg7CgggggCggCg7CCCgCCgC7gCCC7 g7gg7g7g7gC7gCggCCggCgggCggCgg ggCgCCggCggCggCggCCSCCSgggSSSg gC7gC7CC7ggg7CggCggCCgSSSSgSgg gCgCgg7ggg7g7ggCggCgggSgSgSSSS ggCggCggggCCCgCggCgSSSgSSSSgSS ggg7ggggCCSggSSCCggggSSSSSSSSS gggggggCgggSSgggggaggSSSSSSgSc ggggagggSCCgggCgSSgSSSSScSSSSc ggaSgSSggggCCaggSSSSSSScSScccS xCCCggaggggggggSScSSSSSccScScS qPHNCggCSgggSSSgSScEcccSScccSc nZPrrrNCSgSSgSSScScccSccSEccSc n6jPjjKgNggSSSSccScSH7cccccccc UmP2j5CarHggSScccccStocEcccccc BQlKso77jjHggcEcccccaaccccccEc xKg7prKpjjlNgSSccccccccccEcccc 78HKsjPoPPPo777ScccEcEcccccEcc nBikpHPjjPKoNHlpScccccEcccccEc } # tile 98 (rip) { ggggg7ggagag7CgSgSgagaggSgSSSS gggggSgggggSagaaSgSSaSSagSSgSS g7ggggggagaaNHgSgSgSagSSSSSSSS gggaagaagaaaolCSSSSgSSSSgSSSSS gggagSSgaagSCNgSSgSSSSSSSSgSSS gSSSSgagSaSggSSgSSSSSSgSSSSSSc gSgSgSSSgSgSSSSSSSSgSSSgSSSSSc aagSSSgSgSSSaSSSSSSSSgSSSScSSS gaagSCggSSgSgSSSSgSScSSccScSSc gggaggggggggSSgSgSSScSSccScccS gggggggggggggggSgggSSSSSccccSS gggggggggggggggSCHCSSgSSSSSSSc ggggggggggSggggggrNSSSSSSSSScc ggSSgSSgSSSSSgSaCHNgSSSSgSccSS SgSSSSSSgSgSgSSgSgSSgSgSSSSSSS SSSSSgSSSSSgSSgSSgSgSSgSgSgSSc SSSgSSSSSSSSgSSSgSSSgSSSgSSSSS SSSScSSccSSSSSSSSSgSSSSSSgSgSS cScccSScccSSSSSSSSSSSSgSSSgSSg SScccccScSESSgESgESSSESSSgSSSS ccccScccccccScSccccSSgSSSSgSSS SccScccccSgccccSESESESESSSSSCS ccEcccaScgNSEccccESEScSgSSSSSS EcccccgoScccccEcEccSEcESECECSS ccccccagccccEcccccccESESSECECE cSccccccccEcSEcccEcESESESSCSSC cc7KCccEccccEccEcccccSESEESESE cSjPocccccEcccccEcccccSEgESSES ESPP7ScEcccccEcccccccEcScESESE ccaScccccEcEccEcEcEcESEcESESEc } # tile 99 (rip) { gSSSgSSgSSgSSggSggSgSggg7ggggg SgSSSSSSSSSSSSSgaSgaSggggggggg SSSSSSgSSSSSSSSSgSSSgSggggC7gg gSSSgSSSSSgSSSSgSSSgSggggggggg SSSSSSSgSSSSSgSgSggSSggSCCgSgS SSSgScSSSSSSSSgSSSSggggggaggSS cSScSScSSSSSgSSSgSgSgggggaggSS SScccSScSSSSSSgSCgSgggggggSSgS cSScSScSSgSgSgSNNCggSgSSSSgSSc SccSScSSSSSSgSSN0gggSCNSgSSgSc ccccScSSSgSgSSgNHgSSgNHgcSSSSS ccScSSSSSgSSgSSSSSSSSSSScESccS cSSSESSSgSSgSSSSSSSSSScccScccS SSSgCgSSSSCECSSccSgScccSSScccc gSS0mCcSgSSgSSSSScccEcSCCccEcc SSSrtCSSSSSSSgEgCSSCSccgSccccc cSSCCgSSSCSSSSSNNcgNcccccEccEc SSSSCSSSSSSSSSSCNScSEcEccccccc SSgSSSgSSSCECESCNScccCoScEcEco gSSSSSSgSCECSgSCoccEcotScccca0 SSSSSSSSSECECNNNocccESacEcEcca SgCCSSCESSSSSCCggccEcccccccEcc SCNNSSESSESEcEcccEccEcEcEccccE SSgSSSSCESESEcccEcccEccEccEEcc CESSSESESESESEcEcEccEccEEcEccE ESSSESESESESEccccEccEccEcSEEcE SESSESESESEcEccEEcccccaE7pEEc7 EScSESEcSCHgHrNgSa77Kxqknnqja7 ScEcSSSCP6k2x6js77s2kBbOJOJng7 SESESNlQnBBWjHKHl7p5Bb33JJJBpl } # tile 100 (rip) { xxxxxxxZxZjZxxZQQZQQQ66Z16ZZ66 xxxxxxZxZxZxQZQQQQQQZ66Z66Z66Z xxxxxxxxxZxZxQQQZ1Q666Z699X666 xxxjZxZxZxQQQQZQQQQZZ66Z6966Z6 xxZZxZxxZQQQQQZQ66Z6Z66Z166666 xxxxxxxZZxZQZQQZ69XQ66Z6Z6Z6Z6 xZxZxZxZxZZZQZZQZk9ZZ66Z66666Z xxxQZxxZZZZQZZZQ6W6ZQ6Z66Z6666 QxZQxZZZZZZQZZZZZ66Z6666Z669kn QQQQxZZZZQQQQ6QQ6966Z6Z666699q QQxxZZQQZZZZZZQ6W996666Z666666 ZZZZZQQQZQZZQZQ9nk966Z66666666 ZZZQZZQZQQZQZ6ZWWW66Z66Z666669 ZZQZQQZZZZZQ6666ZZ666Z66696966 QQZZQZZZZ6ZZ6ZZZ6ZZ666Z6666669 QQZZZZZZZZ666Z6Z6666Z666666666 ZZQ6ZQZQZZZ6ZZ66666Z66Z6969m6W 6QZZZZ6Z6ZZ666Z66Z66Z666666666 ZQZZZZZ666ZZ66WZ66Z66666WW6969 1ZZZZ6666Z6666666Z6666666W6966 66ZZZ6ZZZ6ZZ66ZZ66666WWZ666666 6ZZZW666Z6Z666ZZ6Z6666W6696966 66ZZZZZWZ6666ZW66666666696666W 6ZZZW6Z666ZZ666Z6ZZW669666WW66 66Z6Z66Z666Z6666666Z6W6666W66W 6ZW6ZWZZ66Z66ZWZW66WZWW6966W6W 6ZWWWnW6Z6ZZWZ6Z6WZ6666666W666 WqZWWWW66ZW66Z66ZZWWZ666WZWW6W nWWZ6ZZ66WWZ666Z6666WZW6WWZ66W 6Z6ZZ6Z6WWZ6ZZW6ZWZ6Z666ZZW6WZ } # tile 101 (rip) { 666Z66666X6969696966666666X996 6Z6666696m66666666696mX69669km 666669666666696969666XX66Xk966 Z666666969696666666X9999969999 66696966666699696X6mk96k966k99 666666696966qq966k96666m66k96k 669696666666WqW6X999699999999W 666666969696W666669kX9kk9k99WW q666966666666696Xk9669kWWWm9kW k666669699qqk699699999WZWWW6kk 669696666qnnk6k9669k99kW99WWWk 66666696666696k96k6WWkk69kWWW6 6969666699966WW9XkWWW99WWW9kqW 6666669669kW6Wk9Wqn96XWW6k9Wnq m6969666X6WWqn669nqW6qnWWkWkWk W9kk669966WWWq966kW9qqk99k99k9 ZWqWW69k6WW699k99k99nqW99999k6 66WW66WW6X6WWW9WnqqWWWWWWkk6Wk Wq66X9W6W96W699kWqWWWW96WqWWZW kn66XW99999996kW6W69W96Wnq99kW 696WW666WWWWW9W6W69k9996kn69W6 6666W666W9WZWWWWk9999996WW6999 W66WWX69W96X9kWkkWX6k9996WX6Xk 666WW666WWX9969m6X69nqnk9X9966 W696W9W6W6WkWW996699WqW96m9966 6m666W6W996W6W9966k96666669669 669WW666W99m66WWW669W6W666WZ66 W96W69W6WW6WW66ZZ66ZZW966WZZ6Z Z666WW96W66WZ666666ZZ66ZZZ666Z WW666WW666ZZ666ZZ6ZZ6ZZZZZZZZZ } # tile 102 (rip) { 99699X9k699999k99k9999kWkWqWqW 9km9km9WX9k99kWkk999kkWkWkWkWk 9k69W69k699k96k96kWkWk9kkWkWkW 9969kk9k99k6W9k99k9WWkWkWkWkkW 9k999kWkWkWWWWkWkWWWWkkWk9kWkk 969kWWWk99kW9WnqWk9WkkWW6kkWkW 699kkWWW99kkkkWqWkkkWkWWWWkkqW WkkqnkWkkWkWkWkWkWk9k9kWkkWWnk WknqWWWWWkkW6WkkkqqWWk9WWWkkWk 9Wqqk99WWkWWWkWWWqWWWqnqWkWkWk 99WWkWkWk9kWk9WWWWkW6nBqk9k9kW WXkWWk99W6Wk99W96999Wk99kWWWk9 kWW6W6999W6W66X99699WW66996W66 qWWWW99k69W9X969kX9W6W9X666996 99W99k96699qnqWZ666966966X9qqW 999666W966WWqWW6Wkk669666XWWq6 99966W66666W6W9m9qq666696669Z6 X6WWW6WkX6X666X66W666WW6666Z66 9qW699999WW6X666666966Z66666Z6 Wn9X6669W6W6m669699k66Z6666Z66 qqW99X9k966666666qn96666Z6666Z Wq69k699669696966q999WZ666Z6Z6 966999X6666666666666k6WZ66ZZ6Z 96969nq6969696969666666Z66Z6ZZ 6m66WqW9699m9q996X69Z66W99ZZZQ 66WZW696699WWnk9666Z6669k9ZZZQ 6WWWZZ66WWk666666669Z6666ZZZZZ ZWkkZ666WZ666Z6666666Z6ZZ6Z6ZZ ZZqWW66ZZZZZ6ZZZZZ66666ZZZ6ZZQ ZZZqnZZZZZZZZZZZZZZZ61ZZ6ZZZQ6 } # tile 103 (rip) { WkkW9kkqqkkqqkWkWkWkW9kW9W9999 9kWkkkWqkkWnqkWkkWk9X9WWWk9699 kWkWkWqqkkkWkWk6WW99999W969k9X kqWkWkWqkkWk9WWWWk96k96kkX9k99 qnWkWkqnkkkWWWWkWk99999nW9k96k WkWkWkWWWkWkWWm9k9666999kk69kW kWk9kWkkkqqkk9999996999X9999k9 WkWkk9kWkqnkWkk96k9X9k6kkXkk9m Wk9kWkWkkkkWkWkWkk96kWkk99W99X 99k99k99W9Wk99k99999999996X96X 9X999996k969k699669k9666669666 9999kk96k96kk999kXX99996966666 kk6999999999996999m69966669696 9WX6669km9kX696m966XXX6m966666 WW696966X966666qqW66X6Xm669696 W666Wqkq96X6696Wk966666mX66666 66669qnqW666666m6669696669696m 96666W6W666666666666666966666W Z666666669666Z6Z66666666666Z69 666Z6666666ZZ6666Z6ZZZZZZZZ6ZZ 6Z6666666ZZ1ZZZZZZZ6Q66Q1Z66Z1 6666Z6666ZQZZ1Q1Z1ZZQ6ZQQ6ZZZZ 6Z666Z6ZZ66ZZZZZZQZZQQQxQQQQQ1 66Z6Z666ZW9ZxQZZZxQxQxxQZZQZZQ Z6ZZ696ZZZWQQZZZxZxxZZxxxZZxZx 6ZZZZ9XQZZZZZZZQxZxZZxxxxxxxxQ ZZZZZ16ZZxxZQxxxxxxjxxxxxxxZZx ZZZ6ZZZZQxZxxZZxxZZxZjjZxjZjxZ ZQZZZZZxxZZjxxZxZZZxxjjZjjxxZj ZZZZZxxxZZxxxx2jZjZxjxQjxxxxxx } # tile 104 (rip) { 9999999996Xnk69961UJ3JObJ3J333 kkm99m9k999nn6666ZUJJOOJJ333Y3 9Wk9XW96k96k669661L3JJJJJJO33O 9k99999999666666XXd3JJ3JJ3JJOA kWX9k69k666969669qOYJJ3J3Y3OLL k9k96k9m6X6666669nOYJJJJ3YJbLA 9k999996666969669nd3JOO333Jd_A 9999km966966666Z6qiJJOO33JOA_i 99XXX6669666666Z6qiOJOOJ33OdiU X6XXXm96666Z6Z66WqLJJOO3JJOObL 6X6XXX66666666ZZ6qfJJJJ3JOJJJb 9Xm966666Z6Z6ZZQWniOO3MY33J3OO X966666Z6kk6Z66z6BfOJ3Y333JJJb 66696Z66Zqn6Q6ZQm_dOOJ3OJ3JJOd 9666666ZQ9k6QZZx6UfdAdOJJ3JOdL 666666ZQQ66ZQ1QQk_dfifdbOJJOdU 6666ZZQQZZZQZZx1qfObbbbdbOJOfB XQZZ6ZZZQZZZQZZxWOJ3OJObOOJOAU 9m6ZQZQZZZZZQQZj9b33JJJJJJJbiU 996QQ6ZQQZ1QQZZx9dJJJ33333JOAU Z6QZZQZZQQZZZZZt9J3JO3YYMY3Of_ ZZQZZQxZZQZZQZZxqJYJJJYMMM3JdA ZZQQQxxZQQQQQQZjq3YYJ3YYMY3Jbb QZxQZZZxZZxZZQZjkJYY333YYMYJbd QQxQZZjZxZZZxxx593YYY333MMMJbd xZxxZxZxxZ6QZxx0kJM33J3YYMM3bd xZxZxxQZxZZxxxxjkYM3JOOJYMY3OJ xZxxxZxxZxZxxxx263Y3JJOJYM333J xxxZxZZjxxxxxxxjZJ33JOJJ3Y33Y3 xxxxx2jxjjxZxjxj6O33333J3YYY33 } # tile 105 (rip) { 3JJ333O_BU_iAAAAfiifiL_LLL__LL Ob3333OA__LLiiiiiAALL_LLLL_LL_ bOJYYYJLiiiiAfAL____U_LiLLLLL_ bJ333YOUiAAAffi_UU_L___iiL_L__ O33OJ3OU_iiiff_U_ULf_U_LiL____ OJOOJJOiU_i_LL_U_UifL_iiL_LLLL dbdOJJbLUU_UU___U_Li_ULLLLLLLL _B_bJJfB_UUUU_UU___L___LiiiLLL nqBAbbBnLi___UU___ULfL_LLiLLLi BnBULLnq_AiUUU___U__AiUiiLLLLL iUnnBUnkUiiUUUL___U_iL_iiLLL_L fBnBB_q6BUULAA____UUiL_iiLLLLL LBnUiABWBUULii____U_iL_LiiL__i UB_iffBnBUUU_UU_U_U_iLULLiL__i U_Ai_iBqU_UL_U_U_UUUiL_LLL_LLi U_dLBUnk__U_UUU_U_U_AiULLL_LLL BLA_BBk9_LUUUUUUU_U_fi_LLi_LLi UiLUnBk9U_U__UU_L_UUiLULLL_Lii UUBnBinWB_UUU_________U_LL__Li BnnnUO_qB_UUU_AL__L__UU_LL__LL BBnBdJinUUUUULLiiii_UUULLL_LL_ LUBfOJLqUUUU_iLifAi_UU_LiLLL__ dffOJJinB__U_AiiiAi__U_LLLi_U_ bbdOJYOnB_LU_iAL_iiLUU_U_____L bOOJ3YdnBLiL__iL_LLLLLL___L__L OJJYM3fnB_AA_ULLL_LiiiA_LLiLLL OO3YMJfnUULA_UAfi_iA_UU_UUffi_ JJYMYJinBUULL_Lii_iA_UU_U_iiL_ 33YMMJUnUUUU_L_LiLLiiiL_Li_U__ YYYMYJAnBUUUUU_LLLL_iAffi____U } # tile 106 (rip) { L__LiLLLLLLLLLAddfddfffddddffd UL_fdALLLLiLLLLAdfdbAAfddffiib Li_idfL__LiLLLifbbbdAAffffAiAb _L_LiAL_LLLLLLLAdfdbfiAfddiiif __L__LL_LLLLiL_LiLfddAiAddiiii L______iiiL_LLLiiiiAdfiifddAii L____U_LiiLL__LLiffdbddLAdddfi LL_U____LLLL____LfdddbdAAddbdA LL_U_ULLL____ULLLLLLidbffdbdAf LL___iiiiiLiiLLLLLL_LAdfdddfAd LL___ddAfAAffiLLLLL_LiAfffdfid LL__iddAddffiLi_____LLiLLLLLLi L___iAfdfAAAAAfAi_L_LLLLLiLLLL LU__LLfbiLiAfddddLLiiiiiiiiiiL L_U___LdddfAiiAAAfdddddAfddddf iL_LLLidddffAAfffAffffAffdddff iiLLiifdffiffddddiLLiiLiAfdfAi LLiLLifdAiLAfdbddfALLLiiifddfd LLiLLAfdAi_LAdddAfAfAfAffdddiA LLAiiffdfi__ifdALAfdbbfdfddALL LAfdffdfL_____iiiAAfdddLLLLLii LAAAAAAf______LiLLLiddAL__LLLi _LLLLiAi_____LiL__LifAiL__LLLL ___LiffL_U__LifiiAfAiiL____LLL LLLiAffAiiiLLLfALfAL___L___LLL LiifffAfffdiLifiLAi_____LL_LiL __LfffiiAfddfAdfiffAL_UUiA__LL LiiAfiiiAAAfffiLLffdAi__Li__L_ ifAiiLLiiiLAfA_ULfdfdiLL___L_L ___Li_____iffA_iddfiL__LLL__Li } # tile 107 (rip) { AiLLLLiAfiiiAfAfdbbddfffffdfii dAiiiLAfAiiLAffffdddbdfdddfAAA dfddffddfAiiAffddbdbbbdddfiiAA fAddfffAfAAAfAfdbbbbbdffAAiiAA iiiiAiiiAAfAfffddddbdfiiiiiiiA iiiiiiAAfdddddbfAAddiiAAAAiiiA iiAiAAfffdbdbbdfAfdfiiiiAffAii iiiiiAfdfdbbbbddfdAiiAAifddfii fALLiLfbdbbddbOdAiiLifbdfAdAii dfAAAffdbbbbdfdfiAAffdbddffAAi dddddbdAddddALiAAfddbbdbbbiAAA fdbddddfiiLifddffAiAdddbbbdddb AdddddddLifAdddfffffdbddbbbddd ifffdbdfifbbdfffdbddbbbfdbbddf dddAiAfffdbAfddbObbbbddAfdbddd AffAAAAAffffAAAfdfAfddfAfddbdd iifddfAiiiidALiiiLLiddAifdfddf ddddfifbAiiAAiiiiLAdbbfiiiiffA AAAAiLAAALiiiiiiiiiAffAiiiAddf L_LL_LLLLLiiiLL_LiiLLiiiiidbdf LLiLLLLLLiiiiiLLLLLiiiLiLidddi iLLLLiiLiiiiLLLiiiiiiiiiLLffAi LLLLLiiiiiiiLLiiiAAiiffAiiiiiA LLLLLiiiiAAiiiAAiiiiffdfAiLLii LLiiiiiiiiiLLiiiiiiiAfffAiiiLL LLiiiiLiLiiiLLLiAiiAiAffAAAAii LLiiiAiLLAdbfifddAAAAAAAAiLfdd __LLiAiLLfbbdfdddiiAAfAiiiiAbd ___LLAAiiAfdddfddiiAfffAiLifdd AiLLiAdfLLiLiL_AbdiiiLifAiifdd } # tile 108 (rip) { fddffAAffddffffAfdddbbdfdbbbdb ddAiiAAfdfdffffAAbbbbObddddffd AAAAfAfffffffffAfdbdbddbdfdfff AAAffffffffAAAAdbbbbddbdffdfAf ffffdfffAffAffAdObbOdbbdffdfff AfffffffAAddbbbdbbddbbdddffdAA AfAAfAAAfdbbOObdbdddbbfddfffAd iAAAfAAAdbOOObbbbffdbddfAffAfb iidbdfbbdffffdOObfAddbOfffdffb AdbbbddbAAffddbbbAAdddbffffdbd dbdddddAfddddbdddAfddffffdfbOd ddffdObdbObAfbffffdbOdAAffffdf dffdbbbbbbbAAfiAddbbbfAfAfdbbf AAfbObbddbdAiiAdbbbbAAffAfbObd fAfdbfAAAAAAifbbdbdAifdffdddbb AfdbdfiifAiAffbdfffAddbbbdfdbb ffdbdfAAdfAdddAAiiAdbbbObdfbOb AdfdddfiiAffdAAfffddObdfbbAdOf fddffddfiiAAfddddddbbdddbOifdf fdbdiffdAiiifbbbbbbdfAAdbbAiAd fbOdifdddbdAfdbddObddfdddddfff fdbdffdbbbdffAdffddAffffffffff iiAdbdbObdfdfiiiiiiAAffAAiAAfA iiidbdbbdfiAAAAiiiAfAffAffAAAi LiAffbdfAAiAAAAAAfffffffffAAAA iifiiddiAAAffAfffffdffAfAfffff dddAiiAffffffAffffffAAiiAAfffA ddAiAAAdffAfffffAAfAAiiiiAAffi dfiiAfffAiAffAfAiAAAAAAAiiiAfi ALiAAiiiAAAAAAiiiiiiiiiAAiiiAf } # tile 109 (rip) { bdbdAffffdddfddbbbddfdbbbbbddf dbbdfffffffdddfbbbdddffbOOObdf dbfbbdddbdffdddfdfffdddbddObdO dbbbbbbbddfddddffdbddffbbbbbbO fbObdbbbffdddddfdbOOfAdOOOdbOO fdddfddfffdddddffbbbbOObObfbOb bbdfffdffddddddffdddbbbdbbddbb ObdffdddddddddddfddffAffdbdddd bdbdfdddddfdffddfdddffdfdddbdd bbdffddddffffAfddbddfffffdbbbd bbdAAfddffffAAfdbddddffffdObbb fffAiffdfffbdffddddffddfAfObdb AffAAffffffddbbdfddfddfffdbbdd fdfAAddffffAddObdbdfddfddddddd fAfffdddddAAAdbObObffdddfdbddd dfffddddddfAAdbObbdAfddddddddd dbffdbbbdddffdObbdfAfddddfdddd AAAdbbdffffddbObdbdfddddfAbddd AAfdbddffAAfdbbbbbbbfddffAdbbb ffdddfAifAAfbObdbdbbffffffbbOd fAffffAiAAfddbddbbbbAiAfAAbOdb AiAAfAfdAAfdbdfdbbbddbdAAdObdd AAAffifddfffdbfddbbdObbffbbbfd fbdbdAAdbbdbdddbbdbbdfddffdffb fdbbddbbObdddddbbdbOffdddffffb AfbbfbObObbdddddbbbOddbddddddd iAbbdddbbbbddOddbbOObbbfdbdddd AdbbbfdbbbbfdbddbOObbbdffbbbdd fbbbOdbObdbddbfdbbbbdAfdddbbdd ddbbbdbdfAfbbdbbbbbdffffdbdddb } # tile 110 (rip) { dbdddfdAnOwwMYYMwMwwYYYYYYMJBo dddbddbfnOwwMYMwMMMwMMMYYYYbqK bddddbOdQdwwMYYYYMYYMMYYYMYOBK bdfdbOOdQdwwMYYYYY33YYY3YYYOnH bdfdOOOd9bwwMY3Y3333YYY33YYbqp dfbdddObqbwMMY3YMYY33J33333dkK ddbdddbfqfMYYY3YYYYY333YY3YdWo bbbbbdbi6fMYYYYYYMYYYYY3YYYbkC bObOObbindMMY333MMMMYYY3YMYOnK bOOObddiqbMYY33YMMYYMMYYYMYOqK bObbbdbAqbMY33YYMMYYYMMYMMYdWK bbbbbdbdkbwMY33YMMMYYYYYMYYdkN ddbbOdObqOwM333YYYYMY33YYY3bqs dbbbOdbdqbwY333Y3YY3YYYYYY3bns bbObbOOL7BM33YY33Y333MwwMY3OB5 ddbbdbbL2UY33Y33333YYMwwwMYOBP dfAfdbdiqdYYYY33Y33YYMwwwwYOBH dffffOOLWfMYYYYYY333YMMwwwMJnQ dddfAdbiZAwMMMYY3J333YYMMMMJBZ dbbdiAdfZbwwwwMY333Y33333YMJUZ bObdAibdnOwwwwwMY3333333YMMJU6 bbObifbbnOwwwwwwMYYY3YYYYMw3_W dbOdAfbbqbwwwwwMMMMMMMMYYMw3A6 ObbdiibAxiwwwwMMMYMMwwMYYMwYfW OObdfAdL2UMwwMMMMYYMwMMMwwwYfW bbbbbdd_jUYYMMwwYYYMYMMwwwwYAW ddddbff_Z_MYYMwwMYMwMMwwwwYOLW ffdddAd_x_Y3YYMMMMwwMwwwwYJbUZ dfbdfAdLjUY3J3YYMwwwwwwwYJbdU2 ffObdbOitUY3333YYwwwwwwYJdbOiZ } # tile 111 (rip) { 7HC7p7CCCCC7CCoNN7pslo777ggggg 7CCC7777N77pCCoNN777C7gg7Ng7g7 g7CCpN7777CCCoNNCgg7rKggKr7ggg 77777777C77CCCoC77g7K7ggCo7gCg CC77g77CCCCNNNo7gggggg7gggg7gg gCC77gCg7goPjPo7g7Cg7g7ggagggg gCC77gg777CHPKCggggggggg7ogaga gCC77C77CCCCCC7gg7gggggaolgagg gCCCCCCCCCCC0Z7gggggggggggagaa gNCCCCCC7CCKP5K7aggaggaaoHgaaa gCCCN77N7gNPpalKgggggagaHj7aga CCC77g7ggggPKagp8gaaaaaggggaaa g77ggggggago7ga77gagagaaaca77a a7ggggggggggagaaaagaagaaaaS7sg 7ggggggggaaaaaagaaaagaaaaaacaa ggggagaaagaaK2ggolK7aaaaaacaaa aagaaagagaac8xgg8tjpaaaaagacaS oagggagaaagaggaaaggaaaaaacaaca PH7aga7paaagacag7acScaaaccacca jxs7aS78gaaaaac7sacaaaaaccaccc jj5l7aggaaaaaaaacaacaacaaGcccc xxQjs7aScaaaaacpPaaaacGacccccg xZxxjsgcaaaaaacj6gccaaccccccc7 22Zxjjpcaaacacc2Wvcacaccccccac jxZZjZ27aaaaaaap8accaacccccccc jZZZZ6xPgcacacaccaccacccaacccc jZZZZZZ27aaaGcaacaacaccccccccc 2jZZjZZxp7cacacaaacacGcccccccc Kj22jxZZjpcaaaacacccccaccccccc pssjj2Z6Z8ccacaacGcccccccccccc } # tile 112 (rip) { g7gK0H7gcWd33O_nnnqnqnqWnBnnZI CgggggggSB3YJdnnBnnWnWnqqnnnZ2 gggggga7ZfYYJ_nqnnBBnqnWnnBqWW ggggggc7nJMYbnWqqnnnnnqnWWnnW2 ggggggcHf3M3AqWqnWqnnqnWnWnnW2 gggaaaax3wYOUnnWnqnqnnqnqnWnB2 aagaaSHnYwYOUqnnWWWnnnnnWnnnn2 agagacZLYM3bBnqqnqWnWnnnnnWnW2 aaaaaSZLJ33iBnBnqnnnqWnWqqnnn2 ggagacWdJYJ_BBnnWnnnqWnWWWWnn2 aaaaacWO3Y3UnnnqqnqWWqqZZZWqWj aaaaagnJYY3BkWnqnBnqnqWj2WWnWW aaaaacn333OnqWnWnnnnnnW66WnWWn aaSaccnJJObBqnqnnnqnnnqkWnqnnn caacaanJbOOBnnWnnWWZWWZZWWWZZ2 cacaaoBJbJOnWnnqnnZjjjxxZ6j222 aaacc8nOOOOnqnWnWWZjj2j2j2pp82 acccasBJOJJBnqnnnkZjjjjjjjjjPP cccccsBJOJJ_nnnnnqZjjjjjjPjPPP aaccaHBOJJOBBnnnnnWjjjjjjPPPjP sZgcaj_JbObnqnnnqnWjjjjjjjPPjP jZacaHBOOOOnqWqnnnWjjjjjP2jP2P P2accaqOOJOBqWnnnn6jjjjPPPjPPP aSccccqOJJOBnnnnnn9jjjjPPj2jjj cccccEWOOOOUnnnnnqWjjjjPjj5jjj cccccEqbbOb_BBBnnn6jjjjjjjjjjj cccccEnObOOUnBBnqqWjjjjjjjPPPj cccccEqObOOUBBnnnWZxjjtjjtj2jj cccaccnOOJOLBBnnqWZjjtxjxxjjjj ccGaccWObJJiBBqqnkQjjjjjjjjjPj } # tile 113 (rip) { 222222222WWWWZ22ZnWn22248222ZZ 22WWWWZ222WWWZ22WWnW2228II2222 WWnWWWZZ22WnWZ222WWq22WWZWW222 22ZWWZ2ZZWWWnW222Znnj2WZWZWZ22 II22Z222WWnnWq222WnW2ZWW2WW222 22ZZ2WZIWWZWWW22WWZWWZ2I2I2222 2ZWW2Z22WWWWZZ22ZWWWZZ2222Z222 2WnWW222WWnWWW22IWZWW22WWWWZ2W 2WnnW22WWWZ2WWI22WWnW22WWZWWWn 2ZWWWW2W22WWWZ2222WWW22W2WWWWW ZWWWWZZ22WWWW222222WW22WWWnnnZ WWW2nnW2WZ22WW22Z222WW2WWWWnWn WWWnnWnnW22WWW2WW222W22WWWnWWn WWWnWnnWWW2WWnWWWZWZW22WWnWZWW 2WWWnnWW2WWnnnWn2W2Z2WWWWWnWWW 2222Z222Z2222222Z222222222WZZZ 282II422228I8I4I82I8882I2I2I22 P222222822PP22sp88sP88888888pp PPPPPjrsP522slPssps2pKps8sKsKp PPPPjPKKrPP2sKPHKsssKKK8slKKsK PPP28PPPKHP2HKPlKKP2KsKsKKpKpK PjPPjPPlPPPlKHHKKKHHKoKK8KsKso jjP2jPH8jjPKHPKpKPHKpsKPlKpsKK PPPPPPPPjjPPKKP28KKsssKKKsKpKs jPPjPPPPjjP2sHlPssol8sHpKsKKK8 2Pj2PPPPPPj82PKPPKHPKlPss8HHps PPPPPPPP82PPPjPPPKsKPlKKpsKsss jPPPPPPj2sPP2P28Hl8sP28HHKp28K jjjPPPPPPPPPPPssKP2sPssPlKKlPs jPPPjP2jPPPPPP2jPKH2sssP2s2lsK } # tile 114 (rip) { 6WZZxxZZ96xZjpgaggggaaaggggaag jWZ6WZxxkZ2xxj7aggagg7gggaggga 2WWW6WWZ6ZjZZxpaaaggorlgaaaaag jWWWqWZxxj2x66PK7gagCKogaggaga ZWZqnZj22PPxZ6QjKgaagaaaggaagg 2ZWWWZjPjjxZxx6j7gagaagaaagags WWWWqQx5xQZx2j6Z8gSaagaaagaag7 WZWqWZxZxZ6jjjZWZgSaaaaaaaaaaa WZnWZZZ66ZZ6QxWWWgcaaaaaaaaaaa nWWWZZ6ZZxZ6ZZZkm7accaaaaagaaa WnWWZZWZZxxZx266ZlgagaaSaaaaaS nWWZZ6ZZxxZQ02ZZjjpc87caaaSaaa ZZWWWZZZZZ6x5xZZjjs787aacaacac WWWW6ZWZZWWZxxZZ6jlKK7aaacaaaa WnWWZnWZZZZn62xZxZjpgaacaaacaa ZWWZZWWZjZ6W6jxjxZjgacaacaaacc 2jjjZjj22jZxZxjxZZHcaaaaaaaaac pp777p777CKsjZWWXZHaagaaaaccca 7p77777777pHxW6Wqxjsgaaacacccc sKoooKKKK7p2x66qqxjPgaaaaaavag spppoKs7p7psZWQZWWjgaSa7ppZZxp KoKKKpKpppo8xkWZWqxpgo5WZxxxjs oopKsKKoNooPxWWqWW62rZqBqZ88Ko 8Kooop7op7K2xZZWnqx2qnB6Z8jPPK sKKo7KsKppolxZjWWWkqUBWx8pHPPp KspKpposKoos2ZWZWWn__q5Ps7plrp pKKooKKoss7lxZW6ZWBUW88Ps7sKK7 KKKpKsKopKpKjZWWZZqn2ppKKoKppp pKKs8KKKKKoKx6W6WZWWPpspsPspII sspKsKsKpKpsxZZWWZZjsoKs28ppIp } # tile 115 (rip) { agaagagaaaaaagaaaaaScSaaaSacgZ aagagaagaggaaaaaaaaSaSSSaac75B gaagaagaa7KgaaSaaSaaaaSaacEjBA gagaaaaaa77acSaSaaaacccScSondb aagaaSaagSSSaaaacaaSaagac7qbJO 7aSaagaaSaSaaSaaScaaExqgEjO3YO 7aSaaaacSaaaaacSaccaojZaa9JY33 acaaaaaaaaSccSccaccaxoEEPB33JY acaacS7saSaaacccScccaccEWO33J3 cagaacg7acaccacccccccccEBY33J3 aaSaaaaSccScaccccccccccpiM3333 acaaapgcaccaccccccccccg9fJ33YY aaacgjoccacacccccccccE7nb33YYJ cacaatpcaccccccccccccE7nOY3YYf caacaacccacccccccccEcEgnfJ3M3b accacccccccccccccccccEan_O333b caccaccccccccccccccccE7nLdJ3Of ccacccccccccca2pEcccccPidfbJO_ accccEEEccccccpgcccccc8AbAOJOB avaaap8pcccccccccccccEpAbd33OB pp8jWUf_Pca8ac2pccccaEsbJJJJJi pspjnOJOxpoKspP7ccaaaEpiJJJ3JL KsgokbOAZPPplP7gcaaaacpBbJJ3O_ spagjnnZ2PP7sKgg7acaacpUddOObB sKagsjZnBqjK8sag87aaac7B__AOOB ss7CoaxBbBjP22g7oK7aac7nBBUbOi KpKHP7sjjPsPjPP8sKpscE7nUUUAbb p8s8K8ppgolloo2PHs777agWBiifbO 8I8Kps8pppjp7g8PP7ggK7gjnddbOO 888vpIp7pp484pjKpp7oo7p6UObddO } # tile 116 (rip) { BiffLkZjjjx2rHsorjjjxjHKppPP59 fbOABjPQjjjPHsooHrP2tjpKoKjjj6 OJJL92Pjjxx2PrpoPKlPPopPjPjPjj OObBtjjjjtjrllpsjKHPlopjjj5jjj ObU6HjtxjjjsHKI2jssPjppPjjttjj JOqjPjjxjjxP2284pI4888pjjjt22K Jb6PPPtxxxxjj24888888II22P2288 JUZ2PPjxxxxt288I22228v882Ps842 dqZ2oP82xxjx2p48228Ip88sPj288s iWZtPP28xjxZ2p482888p888jP2282 ixjxxjPPjxxZPpp88I824I822jjsI8 UP55xZjpPP2H828222228228jj2228 nsjxjxjHj2PK228222222228222222 kjZxlPPPjPlpj28I2222228282j282 njZ2oKKH2s77PZ288ZZ82822jj222j njjPK77pKCgg2ZZ2IZZ22882jj22s2 qjKPP77po7gp8jZj222Z228822j22s Wll0xssjjK7jjj222222ZWZ2222s22 68jxxPsPP8KPj2jj222jjZZZ22P282 68jxxPs7pKsCpsspoHs8228xjPP8sr WpjZZsgaaaaScaaScaaaccaaagaSSa Wor22KgcScaccccccccccccEcccccc W7soNo7SSaaacccccccccccccccccc Zp7pKK7caaSaaacacScccccccccccc 6ppKl2pScaaacScacaccccccaccccc kspHPjKSaacacccaaaccacccccccEc n2PHs87aaaaaacaacacacccacccccc njjPHH7aacaacaaaacScccaacccccc BxxjjPoaaaSaaaaaaaccaaacacccac BjZxjjsaaacSaaaaaaacacccccacac } # tile 117 (rip) { nLLq7oHPPHopHrPpScEccccccEcccc qnqjo7poHKoKPPK7aacccccEccccEc j2sHP77sPHpPlsp7gs7S7SccEcEccE PogCopKHHKHjspKC7pKoHgcccEcccE jPo77KsjpKlPp7oKKsrPj7cccEcScE s28vpI82p2j7pKrHKPjP2aEccEccEc s28IIpI8482ssoPHKjjP2KacEccEcc sp88484I8482sKPHo2PPPPscEcEccE 88I82222v82jjP8KKsKKp88cEEccEc 8p4822228822jssKp7777K27gEcEcc 2p882822482828Kpgg77goP87cEccE s822228228I8ss7ggg77aoP7accccc 22288888288pppgag7pp7KHsaccccc 2828I484228cg7aa7KKoKpKs7cEEcE 2s2288p822877o77KPPPP2ssp7aEEc 222822282227sPlllHPjPKpKppSccc 22882222pPjK8jjjPKrjKKKoKCcccc 2222888pKlPPKsPjPjspsPjKs7aEEc 22j2s28Ps2jPs7P2Px877sPPKpaccc lPPlK8sHs25poKrPPjsg77pPrpaccc aSaaagaag7777K8HKs7goKKK8saccc ccccScScccSaaggggaaa7slsss7acc ccccccccccEccccccccc7sP77p8pcc cEcccEcEccccccEccEcc7Kp77K8gcc ccccccccccccEccccccc7p77oss7cc ccEcccccccccccccccccg7KKKo27cc ccccccccEcccccccccccg7KoKsP7cc ccccccccccccccEcccccS7sg7s2pcc ccccccccccccccccccccc78a78j7cc ccccccccEccEcccccccccgs77ppgac } # tile 118 (rip) { EccEcEcEccccEccccccccccESESESE cEcccccccEcScccEccSEcEcccSESEc ccccccEEccas7EccSspcEccSEESccE cccEcccEcccpgccccpgcEccccccSSC ccScEccEccEcccccEccccccEEScSs6 cEccEccEccEccEccEcEEEccccEcN9U EcEccEccEcEcEccEcccccEcScEE5Bi ccEccEccEccEccEccEEcccEccES6_U cEccEccEccEccEccEccEccEcEcWqnn EccEccEcEccgSEcEcccccEccc7nnnn ccEccEccEESv7cEcccccEcccg2nBni ccccccccccEcccccEcEEcccE7ZnUAO cccccccccEccccccctKEaSccxBUfO3 ccEEcEccEcSccccc7Wxc7SEandOOJ3 ccEEccccca7ccccccgacaccEqJJJJJ cccaaaEccaacccccccccccSvB3J3JO ccc7vSEEcccEccccccccccaZA3JJ3O cEcv7ccccccccccccccccc7WbY333J Ecccaacccccccccccccccc7WbY3333 cccccccccccccccGcaaccc7qb33J3Y cccccccccccccccccacGcc7ZL33333 cccccccccccccaaapacaacgxi3JJJ3 cccccccccccacacppaaaaa7xL3JJJ3 cccccccccaGaavcaacacacaxLJJJJO cccccGacaacaaaaca7aaacaZBJJOOO ccccapvcacaaaacaappcaca2BOJOOO ccv82paacaacaaacaaacaccvnOOOJO ccv887acaaaaaaaaacavcccpnOOOOb ccca7aaaacaacaacaav7acapBOObdA caccaaacacapaGcaac7pacaaBJObd_ } # tile 119 (rip) { SEC01knBUBkxKpoljKojqd3YY33B7H cgtkB_iiU68o77slPpKjnfJJ333B7K g0B__L_BZloop7oKHpskOJOObdBx77 Qn_fffB6HoooKKHHo7pZnnnnqqWWxP BdfdbAqPpsooH2Pls77sg77p7snBnW dbObiBWKsKooHPKpKKp7K8P2o5BOOn AAddUZjPKKoppPlsKHo7pKlHH0kBUW U_A_qHoP8KC7KjPlK2Kg7pKsHP7sjH BAdBZlpKPog7sP28PPKgHosPloaojK _i_q8p7pPoa7K88828pp8rll8pa72s dinx7a7sPog7sKI888II82Ps84gps8 JOnj7g7pKggl2888282888j88pap28 JOkP77pKs77KKp4828884828888s28 JAZp7sKpKpgppp8824p8I882822288 OUPagsp7o77lP288I28482828pp82I dB8g777pp77H2288v88882288Ips88 dnjsog7sK77K88IpI88228228Ippp8 dBjpKapPjCa78284p822I8228I88pI OUj7Kos2PogpK888888888228I28p8 JijpKP2sKp77pp828I882822888888 OU2KPKpKp77r88848288828222287p OUjsH7pssp7228ppp82828282828Kp JUjppp77K77s77p7a7pppp8s887s8p bLj7pKgEccEcccacEcaaSaag777ssK OLj7gpaEEcEEEcccEcccccccScaaa7 bij7g7gcEcSEEEccEccEEEEccEccEc Od2g7pgcEccEccEccEccEccEccEEcE OAt7777SccEcccccccEccccEcccEEc dL6pg777cEEccEcEEccEcccEccccEc LLZoggppcEcEEcEccEEcEccEccEccE } # tile 120 (rip) { ZZZWZZWZWZZ6Z6WZZZ66ZW6Z6ZZZ6W WZZZWWZZZZZZWZWZZWZZWZZWWZW66Z 6ZZZ6ZZZZZWWWW666WZ6ZWWWZZZZ6Z 6ZZWZWZZWZZZZWW6ZZZZZWWWW6ZWZW ZZZZZZWZZZZZWZZZZWZ66ZWnW6WZZ6 ZZZWZZ2ZZZZZZZZWZZZW6ZWZZ6ZWZZ ZZZZWWWZZZZZZZZZZWZZZWZZZZZZWZ Z2ZZZnWZZZZZZZZWZZZWZZZZZZZZ2Z ZZZZ2WZZZZZZZ2WZZZZZZZZZZZZZZZ ZZZZZZ2ZZ2W2ZZZZZZZZ2ZZZZZZZZZ ZZ2ZZZZZZZZZWZZ2ZZ2WZZ2ZZ2ZZZ2 2ZZZZZZ2W2W2WWWW2ZW2ZZ2ZZZZZZZ ZZ2ZZ2ZZZZZZWWZZZ2ZZ2ZZ2Z2Z22Z ZW22W2Z2W2Z2Z2Z2W22W22ZZ2W2jjW 2jZZ2ZZ2W2ZZZ2W2ZZZ2WZ2ZZ22ZZ2 j2ZZ2ZZ2ZZ2ZZ2ZZ2ZZ2jZ2Zj2ZZ22 jxZ22Z22Z22Z2ZZ22Z22Wj2Z22Zj2j ZZ22Z22Z2ZW22Z22Z2ZZ2ZZZj2Zj2Z xj2ZZ2Z2Z2ZZZ222ZZjZjZjx2jZZ2Z 2ZZ22ZZjZZ2Z22ZZ2ZZ2Zx2ZZ2Zj22 ZZj2jZZZZZZ22jZ222xZ2ZZ22ZjjjZ ZjZ22ZZ22ZjZj2ZZ2Zx222x2jZ2jjZ jjZZ2Z22j22ZZ2Z22Z22jjjjj22ZZ2 ZZjxZ22W2ZZ22Zxjj2jjZ22Z22ZZZj Zx2ZZ2ZZ2ZZ22ZZ22Zj2Z2jZ22ZZ22 jj2ZZ22Z22Zxj2Zj2Zx2jj2ZZ2Z222 22Zx2j22ZZ2Zxj2xZ22ZZ2jZWW22jj 22Z22Zj2xj222j2Z2j2xZj22ZZ2jxj jjj2jZxj2jj2jxZ22j2222jj22jZZ2 jj2xZ222Zx2Zxj22j2jZ22ZZj2j22j } # tile 121 (rip) { ZW696ZZ666W66Z6ZZZZZZZZZZZZZZZ 6W666W6ZZWWZZZZZZZZZZZZZZZZZZZ W66WW6ZZZZZZZZZZZZZZZZZZ2ZZZ2Z Z6ZZWZZZZZZZZZZZZZZZZ6jZZZZZZZ ZWZZZZZZZZZ2ZZZ2ZZZZZZZZ2ZZ2ZZ ZZZZZZZ2ZZZZW2ZZ2ZZ2ZWWZZZZZZZ ZZZZZ2ZZZ2ZZ2ZZZZZ2WZWZZ2Z2ZZ2 ZZ2ZZZZZZZZZZZZ2ZZZ2ZWWZZZj2Z2 2ZZZ2Z2ZZ2ZZZZ2ZZ2ZZZ2Z2ZZ2ZZ2 ZZ2ZZZZZ2ZZ2ZZ2ZZj2ZZ2Z2ZjZjZ2 ZZ2ZZ2jZ2ZZ2ZZ2ZZjZZ22ZZj2ZZ2j ZjZZ2ZZjZ22ZjjZj2ZZ22ZZZjjZx2Z j2Zj2ZjjZZj22jZZxjZxjjj2xZj2jx 22Z22jjj2jW2jj2jZ22ZjjjjjZ22xj 2WjjjZ22ZZ2Z22ZZ22j22jZ2jj2ZZ2 2Z22ZZjj222Zj2Z22Zxj2Zj2j2222j jj2ZZ22j2jjj22jjjZ22Zx2j2jjj2j 22Zj2222Zxjj22Zx2222ZZ22ZZ22Zj xxZ22jjxx22jj22222222222j22jZ2 ZZ2jj2jZ222j222jj22jj2jj22222j j222jjj2222Zj2Z2jZj2ZZZ2jj22j2 j2xj2j22222Z22Z22xj22Z222j22j2 22Zx22ZZ22j2222222222222jj2jj2 jj22jj222jj22jj22jj222j22j22j2 xx22j22222jx2j2j2jjj2jj222jj22 xZ2222jjj22Zx22jj22j22j222j22j 22222Zx2jj222222j22jjj222j2jj2 22222x2222222222jxj222222j2j2Z 2jj222222jj22j2jxZx22jj222j22W 22j22j22j222222xZj22WWZj222222 } # tile 122 (rip) { ZZZZWWZjZZZZZjZZZxZZZZZ1Z6ZQZZ ZZZZZZZZZZZ2ZZZZxZjZZZZ6WWQZZZ Z2ZZZjZZjZZZZZjZZZZjZjZZZjZZjx ZZZ2ZZZjZZZjZjZjZjZZxxZjZWZZQj 2ZZZZZ2ZZjxZxxxZxZZWjZjjWnZjxj ZZ2ZZ2xZjZZZWZjjZZZZZZjZZ2ZZjx ZZjZ2ZjxZZjWZZ2ZZ2jZj2jZxxjxxZ jZjjZZZ2ZZ2Z2ZjjZjjZjjxjZZjjZW ZZ2ZZj2jZ2j2ZZ2jxZZ2jxZjj2jj2j ZZjjjxx2ZxjZZ2jj2jxj2xxjjjZZjj ZZjjjZx2j2jZ22jxjjjjjj2jjjZjjj ZZZZjj2xZxj2jjjxZjjjjjjjjjjj2j j2jZ2j2jxxjjjj2jZ2j2Zx2jjj22jj 222jjjj22jjjjj222jj2Zx22jj22jj 2Z22j2xZ2xZ22jjjjjjj222j22jj2j 2Z2xx22x22xj2j2jj2j2j22j2j2222 22jxZ222222j222jj222jjj2jj2222 2j22222jj22jj2j2222j22222j22jj 2j22222j222j22jj22jj222j2jjj2j j2j22jj2222j222jj22j22jj22j222 xZ2jj22j22j2jj2xZ22j2jj2222222 2x22j2j2jj222j2222jj2222222222 22222jj2j222jj22222j222222222j 22j22j222jj22j22jjj22222j22222 j2j22xj22j2j2j2jj2j222222P2222 jj222Zj2j22jj2j2222j2222222222 jj22j222jj222j2jj2222222222882 j22jj2222j222jj222222222822222 Z2j22jj222j222jj222222282P8228 22jj22jj222j222xZ2j22282222822 } # tile 123 (rip) { QQ6ZxxxZZjjZxxxjxZZjjxxjxZjxjZ ZZ6ZxjZZxx2ZZxxx2WZjxxxjjZxj2Z Z6WWZxZjZxxjj2jjQ2jxxjjjjxxjjj ZZZ2ZjZZxxxjxxjjjZZxjjxjjjjxjj xZjjjZZZjjjjxZjjxWZjjZZ2jjjjjj jjZxjjZ2jjjj2jjjxj2jjjjjjjjjjj Zjjjjx2jZxjjjjjxjjjjjjjjjjjjjj Zjjjjjj2Zxjjjjjjjjjjjjjjjjjjjj jZWZjjjj22jjjjj22jjjjj2jjjjjjj xjZxjjjjj2jjjjjjj2jjj22xj2jj2j jj2jjjjjj22jjjjjj22j22xZ22j22j 22jjj2jj22jjj22xZ2jj22j2jj2jj2 22jj222j2j22j222x22j2jj2222222 j2j22jj2jj22jj2222jj22j2222222 22jj2Zx222jj22jj2j22jj2P22jPj2 22j22xx2j2jjj2j2j2jj2j2Pj2j2P2 22jj2222jj2jjj22j22j22j22j2222 jj22j2222jj2222222222222jx22j2 j222j22j22j22222222222j2xx2222 2222222j2222jj2jj2jj22j22Z2222 22j2222222222P2xZj222jP222jjP2 222j222222822222jx22222222j222 j22PP222282222s22j222222222222 22222222822822822222P28P282282 22828j2282282282228s28222s222s 222s22282222222sjss22s2222jP28 2822822s2282882282228228s28282 8282228228s2228228282228282s2s 222828228s2Ps2s2822828ss2P2828 22s222s822822s2s2s8ss28282s2P2 } # tile 124 (rip) { Zjxxjxxjxxjx2jxZqbJ333333YYYY3 x2ZjjxxjxjjjxjjWnbJ3J3Y333YY33 jjjjjjjxxjjjZkxWUOJbOOJY333333 jjxxjjxxjjjjZW6n_OOOOOO333JJJY jjZx2jjjjjjjxWqnBbJJJOOO3YJJJ3 jj2jjjjjjjjjj2jZnOJJOOJJJ33J33 jjjjjjjjjjjjxx26BOJObOJO333333 jjjjjjjjjjj2xZj6BOJbOOJJ3YY33Y jjj22jjjjjj22xZWUOJbJJJJ3YMY3Y j2jjj2jj2jjj222nLOOOJOJJJ3YYYY 22jjj22j22jj22PqAbOOJJOOOJ3Y3Y jj2xZjj2jj2222xqAOOObOOJOOJJJJ 22jjx222P222222qiOOOJOOJJJJJJO 22Pj2222jP2j222WiOOOJJJ333333J 2j22222P22522P8nbJJJOOJJJJO333 2j2222j22222jP2qbOJOOOOOOJOJJJ PP222P2222222P8ndJOOJJObOJbOOb 222222228222228qbJJJJOJOOOOOb_ 2222822s2222222nOJ3JJJJbbObbf_ 2j228228P22P22jBOJJ33JJOOOObAi 22222j222jP2228nOJOOJJ3JObOdfi 22222P222P22288nOJJOOJJOOObdAA jP222222P2282PpnOJJOOObObObfiA 222P2228222s28pBJbOOJObOOJObfi 22j2j2822228822BJObOOOOOOObdiL jjj2282P882s822BObObbbObbfALLi 22222222s28228pnJObOObObf_BUif 828822282s8282xUJOOOOOOdLBB_dO 2s2s88s282s282q_OJJJbObd_UUdOJ s28s2j82s828826UObbOdbOiUULdOJ } # tile 125 (rip) { YMYYYOAUUUBUBUL__LLLLiAiL___U_ 3MMM3bLU_UUUUULUU_LiLii_U_____ YYYY3bLL_UUUBUUUUUUUiL_ULiLLLL Y3333AU_UL___UUUUUBUL___LLLLLf 3333J_U_U_LL____UUUU__LiL__Lif 3JJJJdLU_____L_U_U_iLLAAAi_LiU Y3JJJdL_U_U___UUUU_LiiAiii_LiU Y3JJJi_U_U_U_UUUUUU_iAAiLLLLL_ 33JJOBnUUU_UUUUBUB_AAAAiiiA_UU Y3J3OqnUUUUUU_UUUULA__LiiLL_UU 3Y33OqqUUUBU_i____LiUU_L___UUU 3Y33OnnBBUU__U_U_iAiii__U_i_BB JJJOfkqUBUU______Lii_LiL__ii_U ObbfBZqUUUU_____LULAU_AALLifiU OAUUnjq____U____LUU_AL_U_iAii_ dUnBnZq_L_UB______UU__UU_iAiL_ _BnUU6n_i_UU___U___UUU__LLiL__ BBUddqn_UUU__U_UUL_U_L_U_L_LLi ULdOOnnUBU__UU_____U__UU_iiLL_ idbJOWqUBULUU__LLL_UBUUU_iAi__ dbOOfqqB_UU_iiLiii_BUUBU_LLLiL OJJOdqnBU___LL____UUUUU_L__Li_ O3JOdnnBB_i___UBUUUUUBU_L_LLi_ dOObinnU_____U_BBUUBUU__LL_LAi AbOObnBULL__UB_UBBBBU_LLLL___L AdJJOBUL___UUU_BBUUB_iiiL_UBU_ OJJOOBB_LUBB_LUUU_LLiL_L_UUBUL OJJOAnB__UB___UU_UU_LiiLLLUUBU JJJbiBB_UBU__UUUUBBULLiiL__BBB OOOOfUBU_UUBBUBBnBBLLUBUUUUUUU } # tile 126 (rip) { U__LL___U_LiiL_LAdALLiLLL__iAA U_LLL_LL___U_U_U_fi_ifdiLLLAfi ___U__LLLLLLLL__L___UiddfAL_LL LUU_iL___LLLLLL___U_LLAAAiL__L i__ifiL___LLLLL____LL__LLLLL__ U__iAAAL____AdAiLLL____LLLLL_L U____LL___U_LiiiiiiLLLL__LLiii _U_UU_UUU___U__LAiiiiiL___LAff __U_U__U_U__LLLLLLL__U____AfAL UUUU_____U____L________LU_iiLi UUUU___L__U______L___LL_U___Lf UUUUU____U_U_____LLLLL___LiiAd UUUUUU____U___U_____L__U_LAAAA BUUUUUU_U_LU____UUU______LAfAL UUULii_BU_fiiiiiL___AAiLifiAfL __ULiAL__LiLiiiiiiiiiAAiiAiAfi LL__LLiiALLLLLLiAiiiLiiiAAAiii L_LL_iL___LiiAfAL___iiLAAAiLLL _LiL_L_UU__iAffAL_U_LiiLL_____ _LiL_U_____Aiiii___L_iA_UU__UL LLL__U__LLii_UL___ifAL_UU_i_UU _____L__iAAALU_LL_LiAi___LLL_U ____LL__iiiAi__Li_U_iAi____iiU L_____iLUUU_L__UU___L_UU__L__U LL_________U__UUUU_L__UUUU__UU LLLL__UU_L_UUUUBUUU__UU_UUUUUU LLi_UUU_UUUUUUUUUBU_UUUUUUUUUU __LUUBUUUBU_UUUUUUUUUUUUUUUUUU UUBUUUUUUUU__UUBUUU_UU__UU____ UUUUUUUUUUBUUUUUUUUUBUU_UUUUUi } # tile 127 (rip) { fdAi_iAi__LLLLLifffAfiidAiddff fdfL_____LLLLLiLLAdddAiffAdfLi LLLLLLiLLLiiiiiiiLAdfAAfALiiii ___LL__L_LLLiiiii_ifAAAiiLLLLi ___L_L_LLLLLiiiiL_LiiffLLLLiii LLAiAfdddfALiiiLiLLLLfdi___AfL iiiiiAdddAiLLiAiLiLLfdfi_LAddL AAAiiLiAiL_LLLfi_iLidfLLLAdbdL iAffAfi__LLiLLdA_iiiiL__Adfiii AfddfdfLLLLLiiAiLiiiLLL_AdiLLi dfffffddiLL_ifLLLiLLiLL_AdiLLi fiLLiiAdL__LLLiiiLiiiLLLAbALLi iiiiL_iAL_iAi_iAiLLLiiiLifAiii LAfiLLLL_Lifi_iiiLLLAffiLLiiii LAAiLfiULLLL_LLLLAAiAAfdALLLLL ifAAfdfiLLiiiLiiAddfLLLAiLLiAi AfiAffffiiAdfAffdfdf_U__LL_AdA LL______ULAAAfAAiiff__LLiL_Add ____U__LiLLAAiiiLLAf__LLLL_ifd _L____LAdALAiLAi_LAdi__L__LiAf L_U_iiAAAAiLAddAi_AddiLfL_ifff __ULAAiiAAL_LidfL_LidAiAi_LAAi U_ULAiLLAiL___fi__U_AfAAiL_ii_ _iUULAi_iffLLi______iffAfA_LAL __U___LiAAA__LUU____iiLiii__Li UUU_UU_AiL___UUU_L_Li_U_L__U_f UUUUUBifUUUU______LiL_______Ld UUU_LLif____U___UULAiL__L____i UULiAAAi_iA__U_UU_LAAi__L___LL iiLLL___U_L__UU_iiiiAL_LLLULfL } # tile 128 (rip) { iifAiiLiiiiiiiiAiiiiiAffAiifbd iAffiiiiiLiiiAiiiiiiLfbdfiidOb AiiiAiLLLLLiiiiiiiiiiLAdbddfAf iiAALiiiiLLiiiiLiiAiiiAdddfffA Lidf_iiiiiLiiiiiLiAAiAfAiAffdf ifiiiAAAiiiLLLiiifAAifdiAffddf ifiiAAAfAiiiiiiiifAAAffiifAfdd LiAAAAAAAiLAAAAAiiAAAffAiiiAdd iAAAAiiAAiiAAiiiiiAiLAddAiAiiA AAAiiiLiiiiiiiiiiiii_fbdfifiLi AAAiiLLLiiiiiAiAiiiiLfbbfifALi iAiAiL_LiiiiAAiiiiiiiAddfiAAiL LLiiAL_LLLLiiiAiLiiLLifdfiiiiA LLLiALLL__LiiLiiLiL_LLAddiL_id AA_ifAL_LL_LiiiiiiiLL_LbdfL_Ld AAAAAfALL__LLiiiAAiiLLLfddLLif iifAidfi__LLLLiiAAAiiiLLAdiLLf AiLLifi__LLLLLLiiAAiLii_AdALLf fAiLifi___LLLLLiiAAiiiL_iffiLd ddAiifA_L__LLLLiiAiiAiL_LAdAid dfdAiLiiL_LLLLLiiiiiLLiLLidfiL AddAL_LiL__LLiLiiiiiLLiL_LdfA_ iddi__LL_L_LiiiiiLiiLiiL_Lffi_ idL_L__U___LiiL_LLLLiiLiLLddfL fA_____LU_LLLiiL_LLLiiiAiLifdA fi__U__L___LLLiiL__LLLiAiL_idd fi______U__LLLLLL____LLiiALifd iiiLU__U___LLLLLL___LLLLLLLLif LLiL_U_____LLLiL____LL_L____Li LL_______LU__LL___________L_Li } # tile 129 (rip) { ddddfbObAifdbbddbdbbdfffddbdfd dffffbObfAffbOAfbdbObdfffdObff fAAfdddddfAdbbbbbbddObffdbbbdd fAfbbfiAbbdbddbbdbbdbdfddbdbbb AAdbbAiidbObddbdddbbbdfbbddbOb ddAAfiiAfdbdAfdddddddffbbbbddd dAiiiifdfddfAfbddbdffffObbdddf dAiiiiddddbfffdddbdiAfdbbdddbd ffiLLddAfdbiAfAAAfAAiifbbbbbOd AAiifddfdddAffiiiiiiAAfddbbddd LLAdbddbbdfddfAiiiiifdddbbbdAf LAddbbbbbddddfAAfAAfffdbbbbbdd fAddbddfAddbddAffAfddddbbdddbd dfdddAiiLfbbbbffffdbbbddffddbb fALAdiiAdddbbbdfddbbbbddAifdbb fiLAALiAbddddddddbbbddbdffddbd fiiiiiAfddddddddfdbdddbddfbbdd iifiLfdfdfAfdfiLiddddbbbfAbdAi fiiAAdddfiLAddiLLifbbbbddffffi fiifdddbAiLiddAii_AbbddffdAfff iAdddAAAAfiLAdAAi_iAdALLAbdfdf LfbdfAiidfiiiAAffLLifi__ifAfdA LAfddAiAddAAAiiddLLAAiLLLLiffL _LidddfdddffdfAiiffddbdfffdAAA L_ifbdfffdddddAiifffddddddAfdA ALiAfdfAfdffdfAAAAiAffAfdfAddf dfdfAdAifdddfdfdfAiiAAAddddAAf AAiAfAiidfAdfAdddAiLLiAfAiAfdd i__AALLAffAdAAfdfAL_LiAiL__Add L_fi_ifdAffddffAAiLLLAfLLiLLii } # tile 130 (rip) { dfdbbbbi2UMY33J33MMwwwwJbdJOdZ ddfbbdbLrUwMY33333YMwwwJbd3Jf9 dddddObAXfwMY3Y33Y33wwwJObY3dW ddddfbbfnbMYYYY33Y33YwwJOOYYbW dbbfifdAndYYYYY33Y33JYwJJJMYbZ dbbfifb_pBYY3YYY3Y3333YJJYwYf2 bbdAiAbLgnMYY333333333JJ3MwYi5 bbAiAAbisnYY333333333JJ3YMwYf2 AAAiAdb_7nYJJ33J33333OO3MwwMbP ddfAAdbLoB3JJ33333333Jb3MwwYd2 bOdfAfbAjB333333333Y3JOJMwwYA2 dbbfidbLlB333J3J3Y33JOOYMMM3f2 ddffddb_sBYY33333Y33OOJYMww3fj dfLAddb_sUwMMYYYYY3JbO3MwwwYfj dfLLidbL8UwwMYMMMYJddJMwwwwYA2 AiiifbbLj_MMwwMYM3OfO3MwMwwYA2 i_ifdfbLxUMMMwMMYJbOJYMwMMwYfj iiLiAifL2UYMMMwMYObJ3MwMMwwYA2 iLiiifdLjBYYMwwYObO3YMwwMww3f2 iLiAfbbLjBY3MMMJbO3YMMMwMMM3f2 Aiifbbb_2B333JJOOJ3MwMMMwwM3A2 Affdbbb_sn3JObOOJYMwwMMYMwMYO2 Adfffdb_PnJbAAbJ3YMwwMMMMYMMJ2 fdLLLLf_xnOOdAdOJ3YYMMMMMMwMb2 AA____ALZnOObdbbOJ33YYYYYMwMJx ii__LLdiZBObbOOOOJJ33Y3YYMYw3Z AL__LddL6nbbOJJJ3JJJJJ333YMMJZ fL__Adb_ZnbOJJ3Y3Y33JJ3333MYOj AiLiffd_jqOJJJJ3YYY33JJ333YYbZ AAfdfAd_7nJ33JOJ3Y3333JJJJYYJZ } # tile 131 (rip) { PPsjxjxZ62paaaaaaccaaaccccccaa jZjZZjjZZZ2acaaacaaacaacacaaac xZZZZ2ZZZ27aacGcaaaavaaaaaaavc jjZZx2xjZ2pgaaaaaaaaaaaaaaaaaa 8jj22jjjZx2p7p77aaaaaaaaaaacac 7pp7sPj2xx22828pcaaaaaaaGcaaaa g77g7sjZxxj52827cacacacacavaca gpp77s2ZZZx2ssPpcaaaaaaaac7vaa gp77poj6ZZZ28s828acacvvcaacaca 7p777s2WZZxP2s28pacvvavaaaaava 77p7ps2ZZj22882oaav7p7ccaacv7c app7ps2ZZZZjss2pgpvacacpvcpvac 77p7psjZZZZj2ssKp8paaavavavapc 7pp7p82ZZZZj2sCp2888pppaapaapa 7pp7pK2jZ22pgaap2p88pvvcappvap vp7ppK2ZWZjgcccp2222p7av7vpva8 77ppvs2ZWZ2aaaap8288paapaapaap 7ppsssjZZZ2acpgs2psp822avpavpc 77sKps2xjZ2gavgs27p88887apapap 7pppp222j22gacgp8pppp28ppavpap pp8s7sjZj22aa7cp22pc828aa8pppa gs8sKs2xZx2a7vap22pap887vp48ap vKppss2xWZ877v7p22p7882paappa8 gs8ss2ZZZZ27a7ap22pp828appaapv vps8p822ZZ2v7pap22pa228vppap8p gps8ppp2Zx27vgp8887ap28pppcvpa v882882ZZj27apgp88vgppv8vcppp8 p2s88s2ZjZ2p7v7828pp884pap888a p828KsjZxZx477p8228p88ppppp4pa ps88p822ZZ28vp7v28ppp82paappap } # tile 132 (rip) { aacaapndfbO_UBnWWWWjjjjjjjjj2j a7gag8qLLdb_BBnWZnWtjjjjjjjjjj gpp7a7WULdf_UBnWkBk2jtxjtxjtxj agpgcaZUidfLUBnqqnqxjxjxxt2jtj aaccacWifbdiUnnnqnZZxjjZjj22jj caaaccWbObfiBBnnnWZjjjjjjjjjjj aacacvqdbbdLUBnqWZZjjxxjxjjjjj caacavndbbdiUnBnZWZZ2xZxxjjjjj aavvccWOObdABqBqWnZZ2xZjjjjjjj ac7accWdbObUBnnWWnWZjxxjjjjjjj aacaavZLbOABBnWqnqWZxjjjjjjjjj vvaavcqbfi_UqWnnnnWZ2xZZxjjjjj v7cv7cZAi_BBqnnnnWWZ2jxjxjjjjj avaavcZB__nqnBnnqnqZxjjjjjjjjj pcppcvjnLiUBnBBnnWqW2jjjxZjjjx acva7cZUfdf_BnnnWnWZjjjjjxjjjZ vacpvcWAbObfUBnWnnZ2xjjjjjjjjZ vppvc8WAbOObUnnBBnWZZZZjjjZx2Z apppa8W_bObb_nnBnqW2ZZjjxxjZxj pap4pvZUdbOAUnqnnnWWZZjjjZjjZ2 a8ppcpZUdbbAnWnBBBnZ2jZjjx2jjj avppvc2ndOd_nWBnnnWZj2ZZj2jjjj pcpppa2WfdLBnqBnnqWWZ2jZx2jxjj ppcp48ZnBnnnnWnBnnWZZZj2j2ZZZj p8aa8vZnnnnUnWnnnWWZZ2jxZxxjZ2 apavpa2qnnB_BnnWWWWZ2jjZZZ22jj vapppvWB_Af_nqZWnWnjjZZj22jjjj papppvZUfdfUBWnWnWWZ2jZZj2Zj2j ppaapaZUAbf_nnWnnZZ22jZZ22Zx2j p4ppcvZnAdf_BWWWWnnWZZjZxj2xZj } # tile 133 (rip) { jPjjPjPPj2PPjPPPjl82HKpH8sllHp jjjP222PjPPj222jjP2sPPKKKKsHPs jjP2jjjjjjPP5jjP2P822PPP8ssoKP jjPjjjjPjjjP2jj88PjsHljP2ss8sl jjjjjjPjjjj22jP2s2PPsHPPls82ss jjjjj52jPP2PjPPPjPPPP2s2PPPHps jjjjjPPj2PPPP22PPsPPP82sjPP2Hs jjjjjjPP22PP28PPj2sj82P2s2s8Po jjjjjjjjjPPPPj22jjjPKKPs2PsKKP jjjjjjjj2252PP2jP2PPls282sHHlP jjjjjjjj2PP22jjjPs2P228js22PPj jjjjjjjjPjjjPjPPPP2PrPP28PP2s8 j2jjjjjjjjjj22PjPPP2P2PsPP28s2 j2jjjjjjjjjjj2P22P28P22jPjsspP jjj22jj2j22P2jPjj22PPjj82P2sss xjt52j2jj2P52jjjj2PP2Pj28sPj28 x2xxjjjjj52jj2jPjjjP8sjP22PPPs xjjjjj22jj2j2PP22j22j28jjj82Ps j2jjjjj2Pj2jPPj225P2jP22P22s28 2jjjjjjj2jj22P22r2jPj22P28P2s2 xZ2jj2jj22jjjjj5P2PP22522Ps2Ps jxjxxj2jjjjjj52jP22j228js28282 jjjxZ2jjjjj22P2jjP52P2sj82P28P jj22j2jj2jj22jj22P22P22PP2s8Ps jjj2j2jj22j2jjjj2j22Pj2Pjs2jP2 jjjjjjjjjj2j22j22jj2P22j82P22j jjjjjj22jjjP22jP2jjP2PP2j22jj8 xxjjjxj2jjjj22Pj2j22j22P2P22P2 xZjjjZx22jjjj2jjj222j22P2282P2 22Zxj22j2jj222jj22Pj2PP222PP22 } # tile 134 (rip) { sssKpKosKsKsjWWWZZj2soKpKpp484 pKspKoKKpKpsjWZWWZxjHKs7Ksp848 HssssKpKKKKsjZZxjWWZ28sss22282 Hps8oKs8Kops2ZjZjZZjKpsH222882 KKsKs7sssp7K2jxxZZ227gpPPPpvI2 8KpKpKspKKsKj6WWZZxrp772222222 soHsssK8sKpKjZWZZW6jssssss88p2 spP28K8sKsKs2ZZZWWWZ2Koop7ggp8 2sKlPsKpspKsjZZWZZZx27cScaccac s8ss8KKoKsKp2ZZZWZZx87cccccccc 2sps2pKsKpKp2ZZWZZZZ8vcccccccc sPs8ss8s8sps22ZZZ2ZZ2acccccccc 2sss2oK8sss8s2ZZ2ZZ22vcccccccc 2spHPpKsK82K8jWZ2ZZx2vcacaaaca 8jsssss8Ks8sK2ZZZZZZ27caccacca s2s8H82s82s8K82WqWWZ2vaaccaaca s8sljs8Hs2P2sHxWnnZZ27acaGcaaa 2j82P2s28soPj2ZZZZWZ8vcaaacaaa s2s8P8s82s8s2tWZZZZZ87cacaaaca 2s82P2soP2s2s2WWWZZZ2vcaaaaaaa 2PP2882P8s2s2j6WZWWZ2vcaaaaaaa P282s282s2H82xWWWWW22pcaavaacv 22s2PPss8sK8sxqWWZZ22paav7acav 2jP2sj28j2822xWWZZZ22pvaccvvac 8sP82Ps2Ps222xWWZZ222pcaavaaav 82P2s228P28P22ZWWWZj2paaapacap 2222Pss8228Ps2qWWWWZ228aapcvpa 2222P282282222ZnWZW2222va7va7a PPPj22j2p22882ZWnWZ2228pac8vca 2s22Ps82Pss822ZWWWZ2228pva8aap } # tile 135 (rip) { 88888Ip8pv88II8ssKppKKKxUObbbO 4I822I88pp428pI828Kps88xBbbOOO 8Ip4pI82p8288I88ps8Kpps6BfdbbO 8I888p82vp884888ssspoK2ZBbbOOO 84228p88pp48p8p88sKKspsjBOOOJO 282282pp8884828pssossppjUJbbOO 22pp2ppp288882Ks2s8ss7s2UJOObO 887pp777888p7opK88s87K2sBJJOdO aacaaacaaaaccacaaaa7s2P8nOJOdO ccccccccccccccccccca7K8pqdObdb cccccccccccccccccccccgspqAdddf cccccccccccccccccccccgpvnffbd_ cccccccccccccccccccca7spqdbbAB caccccccccccccccccccap2IqdbbiB cccaccacccccccccccccc7p8WLbbfA acaaaacaaacacccccccccaspqLddfi aaaaaccaaaaaaaaacaacc7ppWAbdiL acaaaaaaacaaaaccaacacp88W_bbfd aaaaaaaaaaaacaccacaacv28ZBdbfA aaaaaaaaacaaaaaacGacap28Zn_ALU aaaaaaaaaaaaaaaaacaacp22ZnBUBB aacavaacvaacavaaaaacav28ZnUBBB vcav7acavvcavvcacaaacp28Zn__UB 7vacavvac7vacacv4aavcvp82WBLUB apaaaa7vca7vacpavcv7a7882WB_iU vcpvaaapaccppcv7caavcv222WnidL capvcpvcpvccapacav7ca82s2WUfdi cvapavavpavaaavacvpc7p822W_fAL ppcvpcppcppaaa8aapvcpv822j_A__ aapaapacca8cvpav8aap7p8282BL_U } # tile 136 (rip) { BQZZx2pcaaaacaaaaacaaaccaacacc U6ZZZjCaaaaaaaaaacGaacaaaaaccc _qjxZ2pSaaaaaaaaaaacaacacGccca BWj2jP7aaagaaaaaaacacaacaaccaa BZjPsK7gaagaagacaaaaacGcaaaaaa _Wxs7Poaaaggacgaaaaaaaaaacacac _q2HPjsggaaaagagaaaaaaaaaaaaca _WP2xxs77gaaaaaagaaaaaaaaaacGc BZZxjQPpgaaggaaaaa7aaaacaaaaaa nZxxjjP7gaaagagaagaaaaaaaacaca nx2jj2sogggaaggaaaaaaaaaaaaaaa nZZxj228gg77aaaaagggaaaaaaaaaa nZZZjj287g7gag7aagaa7aaaaaaaaa nnZZx22lgg7aa77aaggagaa7aavaaa BWZZZjPsa7vgg7aa7aggaag7aaa7a7 Bnxjjxj8ga7ggaa7vca7aavagaaaga _nxjjZxP7gagaa777aggcv7aa7ag7a Ln6j2ZZ277paa77gca7gaa7gg7aa7c _BWjjZZ27v7ag7aav7ga7vgaaa7aga _UWj2Zx2pa7777a777aav7gaaa7va7 UUx2222j7gga7vg77Sa77gav7g7aag UBjss82277gaa77g7av7gaa777aa77 BB2Kss8s77777777vg77ag7cagav77 BBjsjj2277777777777777v7aa777a UBZ2Zxj277v7v77g7a7vgap7gava7v _BWZZZx2pg7777gp7c7pagggvpaa77 LU6ZZj2277p7ppc747g7appagv77vg _UZZjZx2p7v77vav7p7g77vav7777a _BW2jZZ2pvCg778aavp77ac8aa7gaa _UWZZ22j77p7pp77g7pp7vp777pp78 } # tile 137 (rip) { ccccccccccccccccccccE7Ko7as7ca cacccccccccccccccccccgpo7aPpca cGcacccccccccccccccccvsp7g8pca ccccccccccccccccccccc7ssp78paa cccacccccccccccccccccaK2opp7ca aaacGcccccccccccccccc7pKpKpvav acacaccGccccccccccccc7ssKKKaa7 aaaaaaacaacGcccccccccpssooppcc acaacaaacaacacccccccc72sppp4pc aaaaaaaaaaaacaccccccc78KKpppvc aaaaaaaaaaaccaGcaaaccapKPPpp7a aaaaaaaaaaaaacacaccaagpKs87p8p aaaaacaaaaaaaaaaccaca7pPsss8pv Gaaaaaaaaaaaacaaaaaac7sjspp28a accaaavacaaaaaaacaacacg28pP288 acvaaaaaaaaaaaaaaaaaacass7s28p a7aaaaaacaaaaaaacaacGcassps887 7vaaaaaaaaaaacaaaaaacaa7pKpKsc g7ca7aavaaaaaaaaaaaaacapKsp287 acaa7aavaacaavaavaaaaaa7p28228 7agaag7caavcv7caaca7ca77s2PKpp aavga7aaagagavaavaavacg722H28p aapaagaa7aa7aac77av7aaa8228s8p agc7vaa7aa7c7paa7acavaaH22j287 77v7vaaavagaavaaavaapaa222j22p vgpac77cp7a7aa77cp7cggasj2222p 7gcap777vaavgapvaav7ca7s2j2222 7pgaa7va7v77va7a77avgagp222222 vppaapaa7ppc7paapv7c7gap8s2228 acpp7pvapvc7apcvpca7v7782822p2 } # tile 138 (rip) { aaaacacaaaaa7cacacvaaavcnObdiU cacaaaaaacaaacaaaacacvpcWdfiLL GcaaaaaaaaacaaaaaaaaacacWbdbbb caaaaaaaaaaaaaaaaaaacaccWibOOb aaacaaaaaaaaacaaaaaaaaccWLbOOb vaaaaaaaaccvvacvvaacvvaGnOOObO cavcavcavaavccvaaaavaacvWiOJOO aavvcvvc7vacacppacvpaacv2nOJOb avacacacacapvccvaaccv7ccZUbbfi 7paavaavaaapavaaIaavpavc2nUL_U vaa7pa7pcvpavpcppav7cvpca2nUUU 7apvcpvcvpapacpvcp7cpacv8jnBUi avapavapaavpapaapavav77a8ZBU_A apcvpcvpappcvpavpcppcvpa86B_LA vcpaapaapaapaappcpvcpaapv2BUUL pappappappvapppapapap7vpvpB_UB ppavpappca8apvcppappaa8pcpBLUB vpaap8aap888acpp4ppv28vac2LbA_ ppvp48pvap8vapa8pppppv8vc8UfdA vppp8pppappcp8appcppappp77nLdd vcp28apv8aappppppaa88aa8v8WUbd pap88pap8pppppvppapvppvav8qUAA v7p8p8pcp8pcppappavpca8ap8WBL_ p8appaa888pcvpaap8aap8pp82Zn_U vppp8vpp8ppap8pvppppapIpp2Zni_ pap4pppapvap8ppacpvpappaaIZniA 8papppvp8ppappapp8papaapI2ZniA 8vpav7vpp88appvpppap8pp8avZn_A ppppa8pap8pI8ppppavpp828vaZnUi 88avp8aapp7ppapvapp848v28p4Z_L } # tile 139 (rip) { LiqPc7s7ccccccEccccScEccccEcSc dfnjc7KsccccccEcccccccEcccEccc Odq27gsscEcEccccEccEcScEcSccEc OOnx7gp7ccccEccccccEcccccccEcc OO_Zag77accccEccccEEccEcccEccc ObBxa7ppaEEcccccEccccccEcccccS ObBZas8paccccccEccccccccEccccc dfBZ7rj8cccccEcacccEccccacEccE _Bnx7psgSccccccccccccccccccccc BnnZpspacccccccccccccccccccccc UBnjp8pacccccccccccccccccccccc _BnZ7p7gcccccccccccccccccccccc LBBZaa7pcccccccccccccccccccccc _UBW7ap8accccccccccccccccccccc _BnZ8pss87cccccccccccccccccccc UUBW22K82vcccccccccccccccccccc ULiBZ2pK87cccccccccccccccccccc _LfB68828vcccccccccccccccccccc LLdB92ss27cccccccccccccccccccc ALAUq28j87cccGcacccccccaccaccc fAABq28s27caccaaaaaaaaaaaGccaa iifUn2882vcaaccacGcacGcacccaca _Lfin2822pccaaaaacaaacaaaacaaa ULLLU2p82pcacaacaaaaaacaacaaca L__LBj828pcaaaGaacaaGcaaaaecac iL__B2228pcaacGGaaacGeaaacGGaa ffU_Bj8j2pcvvccacvvcccavvcccac iLULU2p88vcvavacv7cavacvavacva _UULUZ8p4pac7pcv7caapvca7vav7c L__iUW28882acaavac7vaapacapaaa } # tile 140 (rip) { jj22x2222j22xj22j2xZ2jZjj2jj22 jjj22jj222222j2jjjxZj2222jjjj2 22Zx22ZZjjjj2jWZj22222jjjjZx2j j2xj222x22jj22Z2222222jj22x22j jj222222222jj222222j22222j222j jj22jjjjj22j22j22jj2j22jj2j22j 2j2j2j2jjj2j22jj2222j22222jj2j 22jj2222j22jj2j22222222222j22j jj2xZ22j22jWZ2222j22j22jj22222 j222x22j222ZZx22xj222j2j22j222 22222222j228ZZ22Z222222222jj2j jj22j22j22222j22222222j2222222 2s22222222I8288888I82228I822I8 4I884884888IIIII8I8I88448I88I8 p8II8pIIp4I88888848p8488p4888I 84ppp4pp8p888888v8484p84p8vI8p p8I8I84848vp8488Ip8v84848p8p84 8v84pp8v8pI8v84p8v84288482482I pIp84848p48888p888v8848888I48p 4p8v848pIpv284482Ip848v28I4848 848p8v848pIpp8I442848848488v88 I4848p8p88p848p8p8I8888v84p848 848pI88pI88p888p848I88I8p888p8 848488842848pI8848p8888482482I pIp8p888888888882p8888p8888488 p8488I88I82I88888I82I84288I884 I48pIp8p84848I8888484824888822 84pI8p8848848pI8v8488888I88I88 I848I84888p8884888pIp8488I8488 8I88888I88I88888pIp888848p88p8 } # tile 141 (rip) { jxjj2j222j222222x222ZZ2j222222 xZ22j2222jj2jj2222222222222jj2 2222jj22j22jj22222222222222222 j22222j2j222222222222222222222 22jj22jj222222jj222222222j2222 j2j22j22j22j222222222222222222 22jj22jxj22j2222Z2222222222222 j2j222xZ2222222ZW222222222j222 222jj2222222222222222j22228jZ2 2222222222222222222222222x22x2 j22222222222222222222282xZ2228 222222222222222222222222222822 2288888I8888888888888888848888 I8848I888I8I8I88848Ip8Ip8p8484 8pIp84p4p848p4p4I8vp8484p4888p pI8884884p84p848p8p8v84pIp8888 488848v8pIp848p484848p848IpI48 p488Ip84848v8488v8v888I8842884 8pp48p48p48p84p48p4888I88488I8 v84p8484p848v88p84884848p8v8v2 8I8I84888pI8pIp848pI8pIp484848 248888I8pI8p84888888888888888p p4888882IpI8p88v888Ip824pp28I8 82p8I884p8p88pIp8I88I8pI8pIp84 488p8v88888Ip888p8p8p8v88p8p8p 8828488888888pIp8p8Ip888pI8848 8428888828I888888I82488482v884 488I888I888I828I888888288888I8 I888I882428888I8828I488I8I2888 p8v8p8I848I8I848484888488pp48I } # tile 142 (rip) { 2222222j2jxj2222x22P28j2222282 222jj2222xZ2jj22222222j2s82828 22j22j222222222222222222282282 22j222j22222222222822228222822 222222jj222222jP282P8882828228 2222j222j22222222222222828222s 2222j2222222222882282822ss28s8 22222j2222222822s882P2sj8282s2 28j88222j22P8222P2228282s82s2P 82P22222PjZj822s282228222j2s28 222222852ZW8228822sjs82jZZ282s 2822822222282222j22282s2828288 888888888888888s288888888888p8 8p848p84p848ppIp4pp848848Ip848 4IppI88I8v8484p8Ip4pIp484pI824 88848884p84p8p848p8I88pI88848p 82v8pI8848pIp4I8v8v8888I88I8p4 p48I48v8v84848pp8v84884p88482I 84884888p4p8p848v8p8vp8v8v888p 8428428I48848v8p84848Ip84p8484 v8v848v8888I848I8p848pI88Ip848 8Ip88p8pI88848p84888p84p8v8p88 p88pIp8888888p8848pI8p88p88482 88488482482482482482I88I888824 8p8p88884884888p88888828I88888 8488Ip848I88I8v84288I8848I2888 88488488p848p88pI8v888I8p84I8I 8I88I88I88888I88848p8Ipp8p848p 8828428888I28828I8p8488I88p888 824888888824842888288822848284 } # tile 143 (rip) { 2ss2P822282s822s282828s22s2828 s228j822ss822s82s2s2s2j2282s2s 2822s28s82sj82s82P2828s282s828 22228s22s82s282s2828s282s82s82 s28ss2222282s2282ss28ss82s82s2 28s282822s2828jjs828s2s282s28s s282s828s28ss222828s2882s828s2 82P2s2828s282s222ss282s82s82s2 2828s8ss282s828s882s2s2s82s828 2s82s222sss28ss2s22828s82s82ss 82s82288282822828228s2s28s28s2 2s82s82s28s22828s282828s82s82s 8888888888888888888p8888888888 48p8p8p8p88p8p8p8884848Ip8I848 pp4844844p4I4pI484824pp88Ipp84 I88v8p8488p884p8v888848888IpIp 284p484p8v84p848p48v8p484848p4 p4848484I4848v8p848pIp8484p848 48428488888Ip84p48v84848p8p488 p8488I82I8884pI8Ip8Ip848p488p8 848848p48pI8848p8p88p4888848I4 8Ip88p8v888888p888888888888p88 88888848888I82I88I82482I88p884 8I888884888888p8888v88p88pI848 842888888v88p8888Ip8484p48848p 88482I88888I82I888848I888848pI 84284288288482v8I2882842842882 48848884884888I8p88p8488888888 848848I8I8I8p8488488I88488888I 82I88888882484884848p8488I8I88 } # tile 144 (rip) { 2s28s2s82s28829_ObObbddLU_bOJJ 282s28s2822282k_OOObfi_ULdJ333 s28s82s828s882q_OOdi_BBUdJJ3Y3 8s2s2828s2s282nLbOAUnBULO333Y3 828s82s28s8282nibd_nnB_fJ333Y3 ss2s28s8s28s82nibLnqB_AdJY33YY 828s282s282sp2BifUnnBLdJ333333 ss28ss828s88p2nLiBnnUAOJ33Y3J3 28s282ss2s2882nBUnnBUbJJJ33JJ3 82s82s888s82s2knnqnU_OJJJ3JJJ3 8s828s88828s82qnqnUAAO3JJ3JJOJ 82p8828288p282jWqB_fOJJJJJ3JJJ 888p888888p842ZnnBLdOOOJJOJJJO 4848484p8p48v8nnB_fbObO3JJJJJJ 84p848pIp484v2n_AAdbObbJJ3JJ33 p888848pIp8pv2BdbdbObdbbJJJJJ3 842848484848v2LOObOJdfddO3JJ33 48v84p848p8vv2b3JJObdfdbOO3JJJ 48v8pIp8v8vp8WO3JJObbdbbbbJJJJ ppp8Ip8v84842WOJJ3JOObbddfbJ3J 8248p84828484ZO3JJJJJOddddbOJJ 888v888p88842Wb3JJJJJObdfdOOOJ 8I8p84p8Ip84ZnOJJJJJJJbdfdbOO3 8p88p88428442nOJJJOJ3JJOddbbOb 88v88p8888842WOJOJJJJJJObffbbd 8488I84I8I482WOJbJOJOJJObfAdOd 8428428888882qOJJJOOJJJObdAfdd 8888888888I22WOJJOOOOJJObfiidb 88888882I4882nOJJOOJOOJOdiLidO I8I8I8I4884IjnfOOJOOJObJOfdddO } # tile 145 (rip) { JO3OAUBBBUBBBUBBUU___UBBUUBUUU 333O_BBBBBnBU_U_LLLUBUUUBUUUBU Y33bBBBBBBBBBUU_L___BBUUBBBUUU YYYOBBBUUUnBBBBUU__UBBUUBBUBBB 3YYO_UUUBBBBnBUBBUUUUUBUUUUBBU 33YO_BBUBBnBBUBnBBUBBBBUUBBBBU 33YbBBBBBBUBBBBBBBBUBnBBBUBBUU 3Y3AnBBBBUUUBBBUBBUUBBBBBBBBBU 33YOBnBUBBBBBBBBUBBUBBBUBBBBBB 33YOBBUBBBBnBnBBBBU_BBBBBBUUnB 33YbBBUUUBBBBBnUBBB_BBBBnBUUBB 3Y3bnBBBUBnBnBBBUBBBBBnBU_UUUB JY3bBnBnBBBBBnBBBBBBBBUB_LBBUB J33dnBBBBBBnBBnBBnBBBUUUU_BBB_ 333fqnBnBnBBBBBBnBBBBBBBBBnU_L 333AqBBBBBnBnBnBBBnBBUBUBUUUUU 333AqnBBnBBBBBBnBBBBnU__L__UBn 333inBBBnnBBBnBBnBnBBBBUBBBBBB J33LqnBnnBnnBBnBBBBnBBnUBBnBnB J3J_nBnqBBBnnBBBBnBBnBBBUUBBBB J3J_qnBnUBnqnBBnqBBnnnUBBUUBUB JJ3inBBBUBBnnnnBnnBBnBBBBBBBBB JJ3iqnUUBBBBnqBBBBBnBBUBBBBBBB OJOBnBBBnBnBBnBBnqnBUUBBnBnBBU bObBqnnnBBBBBBBBBBnBBBBBBBBUBB ddfBnBnnUUUBnBUUUUBBBBBBnBUBBB fA_nqBnqBUUBBBBUBBBnBnBnBUBBBB diBnnnnnBBBBBBBBBBBBBBBBBBBBBB bfBnqBnqBBnBnBnBBBBBnBnBBBnBBn ObnWqBnqBBqBnnnBBBBBBnnqnBqnBn } # tile 146 (rip) { BUUBUBUBUUUBUUUBUUUUUUUUUUUU_L UUUUUUUUUBUUUBUUUUUUUU_UUUU__U BUBUUUBUUUUUUUBULUUBUU___UL_UU UUUUUUUUUU_UBBULiiLU__iL_U__UU UUBUUUUUUBU_UBLLLii_LLLL_UBU__ BUBBUUUUUBBB_LL_U_L_UUUUUUUUUU BBBBBUBBUBBUU__UUUUUUUBUUUUUU_ BBBBUUBBUUUBUUU__UUUUUUUUUUU_U BBBBUBUBUUBBBU__UUUUUUUBU_UUUU BUBBUUUBBUUBBBU__UUBUBUUUUUUU_ BBUUUBBBUUBUBBBLLUBUUUUUUUUU_U BU_UUUUUUBBUUUU_UBBUUUBUUBUUUU UUBUBUBBUBBUBBUUBBBBBUUUUUUBUB UBBnBUBBBUUUBBUUUUBBUUUUBBUUUU UBBBBBUBBBBnU__UBBUUBUBUBBBUUU BBnBBBBBBnBBULLUBUUBBBUUBBUUUU BBBBUBBBBBBnU__UU_UBBBUBUUBUBU BnBBUUUU_UUU__BBU_BBBBBBBUBBBB BUUUUBUUUBBBUUBBUUBBBBBBBBBBBU B___UBBUBBBBBnBUUBBBUBBUBBnBUU UUUUUBBUBBUUUUUBBBBBBBBBBBUBBB BBBBBBBBUUUUUBBBBnBBBBBBnBBBBU BBBBBBBBBUBUBBBnBBBnBnBBBBnBBB BnBnBUUUBBBBBnBBBnBBBBBBBnBBBB BBBBBBBBBBnBBBnBnBBnBBBBnBBBBB BUUUBBBBnBBBnBBBBnBBBnBBBBBBnB BBUBBBBnnnBnBBnBBBBnBBBnBnBnBB nnBBBnnBnnBBnBBBBnBBnBnBBBBBBB nqBBnnnBBBBBBBnBnBBnBBBBnBnBnB nBBnqnBBnBBBnBqnBBnnnBBnBBBnnn } # tile 147 (rip) { iiiLUUUU_LiiL_U_iAiLALULL_Uif_ __L_UUUUiAAAiLL__iL_A_U____ii_ UUUUUBU_LLiAAiAi__LiALU_____Li UUUUBUUUU_LAfAL_LLLiAi_UU_U_ii ___UUUUUUU_iAiU_iAi_ii_UU_U_AL UUUU___UUUUU_L_LAAi_U_i_____L_ UUUU___UUU_____iAAAiULA___L__U __UUUUU____iL__iAiAi_ii__LU__U _____U_UUUULL__iALLL_LiU___LiU L_____UUUBU______U_iULiU_iU_iU U_U_U_UUUUU_U___UULiU_iU_iU_LU UUUUUUUUUU__L_L___LiUU_UUU_iiU UUUUBUUUUUU_LLiL_iL_U__UBUU_L_ U__UU_UUUUU___A_Ui_U_L_UUUUU_L UUUUUUUUB__UUU__ULL__L__UUB_LL BUUUUBUUUUUUU_LUUU_L_UULUUUUU_ UUUUUUUBUBBB__L_UUU_UUUUUUUBB_ UUUUUBUUUBBBUU__UUUU_L_UBBUBU_ UBBBBUBBUBU_UBUUBBUU__LUBBBUUU UBBBBUBBB_L_UBUBBU__UU_UBBBUUU UBBBBBBBBU_BU_UBU_L_U__UU_UBBB BBBBBUBnBUUBU_UBU__UUUUUUUUBBU BBBBUUBBBBUUUUBBUUUBUUUUBBUBBU BBnBBUUnBnBUUUBUUUBBUUBBBUBBU_ nBBBBBBBBBBBUUBUBUUBUBBUUBBBB_ BBnBBBBnBnBBUBBBUB__UBB__UBnBB nBBBBBnBBBBUUBBBBBU_BBUUUBBBBB BBnBnBBBBnBBU_BBBBUUBULUBBBnBn BBBBBBnBnBBnU_UBBBBBBB_UBBBBBB BUBBBnBBBBUUBBUUBBBUUUUUBBnBnB } # tile 148 (rip) { _______L___U______L_L____L__LA _____L__L_U___U_U_U___U_LA__Lf iL_U____U__LL______U__L_iAiiiA i_U__U____UL__LL__U_____Liiffi __UUL___LUU_UUii__U____U_LAffi UU__UU___UUUU_LLUUU_U__U_idfAA UU__UUU_UUUUU_iLUU_UU__ULiAiiA UUU_LUUUUU__UUfLU____LLLiiL_Li UUB_Ai_UUUUUUUL_BUU__LAiAAAiiL BU__LAi_L_UUU_U__UUU_iAAAAiLLi UU___iAAA_UU__U_LL_U_iAAAi__Li BBU___iiLiiUU_ULAL____LAAiL__L UUUU__LLiii_______L_LLLLiAL__U _BUUU__LiiLL___UU_LL_LiLiiL__U _UUBUU_LLiiL_U_UUiAiUULii____U _BUUUULi_iA_UU_UULAA__iiL_L__L _UUBU_ii_iiUBUUUU_ii_Li____LLi _BU__UUU_L_UUUUUUU__U_LL_LLL_U UUBULLUUUUUUUUUUUBUL___L_UU__U UBBULiLBUUUUUBUUUBUL____UUU__U BBB__UBB_L_UUUUBUBBBUUUUUUU_L_ UBBU_UUBU__UBBBBBUUBBBUUUU___L UBBB_UBUUBUUBBBBBBUBBBU__U_UU_ UBBBUBBBUUUBnBBBBBBBBBU_L_UUUU UBBBUBnBBUBBBBBUUBnBBBBL_UUU_U UUUUBUUBBUBBBBBBBBBUUBB__UU__U BU_UBUUBBBUBBBBnBBBBBBB__BUUUB BBLBBBBBBBBBBnBBBnBnBBBUUUUBU_ BB_UBBBBBBUUBBBnBBBBBBBBUUUUU_ nBUBBnBBBBB__nBBnBnBBnBUUUBBBB } # tile 149 (rip) { AAdi_LiAiAfffAiiiLLLLifiLLiL_i ddfi____iiAAii_LiLLLLiAfiLiiiA ffL_L____iAAiLLLLLL_LiAdfifdfd Af______LiAiLLiiLL_LLiiAffffff AiUU__U_AAiL_LiiL_LLiLLiffAiAA L___UU_LiAiL__LiiLLAffiAiiiAAi LULL_UU_iAALLLiiiiAffAiAiLiAAA _ULL__UUiAiLLAAiLifdAiLiL_iAAi _____AiAAi_iffL_LifdAAii_LifiU L__LiAfAiLiAAfiL_LiAAiiiiiAi_U i__iAiii_LAiAAii___LAL_iAii_U_ _LiAAU_AL_L_iiU_AALLALUL_UUUUL _LiiLLLiiL__iLULfi___UUUUUUUUU U____Ai_iL_LL__LiLUUUUUU__L_UU ___L_LL_U_L__LALUL_UBUUUU_UU_U _U_LiiLLUU___U_UUUUUUUU_UUUUUB LU_iAAL__UU__UUUUUUUUUU_UUUUUU _LLLL_UUU___LiUUBUBUUUUUUUUUU_ U__UUUUU__LL____LL____UUBUUUU_ UBUUUUUU_L__UULiiiL____UUUUUUU UUUBUBUUBUUL__LUBUUUUUUUUUUUUB _UU___UUUU____LUBUBBBBUBU__UBU UU_LLL_BU___U__UUUBBUUUU__L_UU UU_LLLUU_UU__UUUBUU___L__LL__L BBU___U_L_U__UUU___LLLL_U_UU_L BBUUBU_L__LLUU_LL____L_UUUUUU_ U__UUU__BULUULLL_UUU_L_______L ___UBBBUBBUUU__UUUU__U__LLL___ UBUBBBBBBBBUUBUBBB__UUUBU_LUUB BBBBBnBBBBB_UBUUBBBUUUBBUUUUUU } # tile 150 (rip) { AAAfAAd_pn3333OJ33Y3333JJJYMJZ AiLLiifU2B33J3JJ3YY33333JJMYJZ AL_LLLAUjB333333YY333333J3MMOZ iLLiiii_qL3333333Y333333J3MYOZ iLiAAiALnAJJ33333333333JJ3YYbZ iAiiiAf_ZnOJJ3J3333333JJJJ33dj iiAiiAf_WBJOJ3JJ33JJ3JJJJJOOfj L_iiLiiUq_JJJOJJ33JJJ3OJJObbi2 __U__U_UxBJJOOJJJJJ33JJOObi_B2 __UU_U_BZUJJOOJJJJJ3JJJ3JfUUn2 ____U_LUn_JJOOJ33333JJ3YJiUi_j _U___U__qA3JOJOJ3Y3J333JbidJb2 __U___UBWL3JJJOOJ33YJ33OObJJO2 UU_U___BxBJOJJJObO33JJJOOJ33O2 UUU__U_B8nJJJJJObOOOJJJ33YMMJ2 U______B7n3JOOOOdffdOJJJ3333Ou _L_____npB3JOOOdfL_LbJ3JJOJJfI L_UUUUUBZLYY3JOdiiiAbOJJOOJ3bu UU__UULB2_YMYJObAiAbJJJJOO33bI BBiiL_iBpBYMY3ObALdOJ3JJJJY3AI UBUUUULB2BYY3JOdAAOJJJJOOJY3AI UUUUUULUZUY33JbdddbJOJJOOO33bI BULLLLLUWLY3JOfdOOOOOJJJOOJJbI _L_L_UUB2UM3JOfO33JbOOJJOOOJiI LL_UUUUn2UYJOfbJ33JJbOJJJJJOAI __UBBB_BxB3OAAJJ3333OOJJJJJJdI UBBBBBUB6_JiLbJ3Y3333JJOJJJJbI UBnBBBBBWBdULOJY333J3JOJJJJJbI UBBBBB_BjqBUAO333J333JOOJ3JJfI BBBBBU_B2WUUbJOJJJJ33JObbbJJbe } # tile 151 (rip) { v288882ZZ224p8vp28pvpv88pvpppa ps28282Zj228vpp8228ppp888ppppa p8288826ZZ28p7v822p7828pp88pcp p288p82Zjxj8vpp828pp828pvpvpap v288882Z22Z8vpp82284288ppa88pa p8s28222222pppp8228p28ppvppppp 88282822222pp4p8228p888pvapa8v p2s282222ZZ8v84828pp828appap28 828s282Z22248p88288p822pv7pp4p 88228826j228ppvp88pvp88pppp8av 8288882Z22Z8v7pp7pvcp4v8p48pcp p8p7pppv8I84pv4ppvpppppvp8vp8p TvvGTvvG7vGvv48vpvp44ppvppvpa8 GGGGGGGGccGGv4vvv8vvv4pvvvpva4 GTeeeGGeeGGGGGvGvGvGvcavavvavv GeeeReeGeGGGGGGGGGGGGGGGevGGGG GeReeeRGeeGGeGeeGeGGGGGGeeGGvG heeGeGeeeReGGGGGeeGGGGeeeGGGGG ReeeGeeGeeGGGGReeGGGGeeeReGGGG ReReeReeGGeeeeeeGeGGGeReeGGGGR GeeeeeeReeeReeeReeReGeeeeGGRGe heeeeeeeeeeeeReeeeeeeReeGRGeee RReheheeheeeeeeeReeeReeeeeeeeR GeeeeDDeeeeeReeeeeReVheeReeRee GeeeeFeeeheeeeReeeeeeeeeeeeeee Reeheeeeeeeeeeeeeheeeeheeheehe ReeeeeeGeeheeheeeeeheeeeeeeVFe ReeeheeheeeeeeuheeeeeeeehDeehh ReeeeeeeeeeheehueheeVeeeDDueee yeIDDheeeheeeeDDeeeeeeeeeeeeee } # tile 152 (rip) { 888pvp2nLbALBnWWnnnZZZj2Zxj2xZ p8pppv2W_fALBBnnnBWWZZZ2jZj22Z pv8pcp2ZBiALBqnnWnnWZ222ZZ2jZ2 p8apav2WB_ALBnnnnnWWZZ2j2x22x2 a8appa2WBUA_UBnWnWWW2ZZ22jx22j 88aav82nBU__BnnnnnnWW22Zj2Zxjj ppa88v2nn__UBnqnnnWWZ22Z22x2jx aa88pc8WB__UnnnWnWnZjjj2j2j22Z ppvpcp8ZB_LLBWnnWnWWZ22Zj2Zj22 p8ppvp42B__UBqnWnnWWW222xZjZ22 p8pppp82B_BBnnWnnWnZZ2222Z22Z2 84cp448ZB_BqnqnWZnWZ2ZZ222j222 84pvv482nBUnnWnnWWWW22j2jj2jj2 vvvp8482WnBnnZnWnZnW222jZZ22Z2 Gvcavv42WWWnWWWnZnWWW22ZZ22222 GGGGGeve222Z22ZZ2ZZZZ22ZjZ2222 GGeeGeGGeeeeeuuII2I222222Z2222 GeGGeeeGeeeeeeee4uIueeeIIee2Z2 GeGGGGGeReeReeeeGeReeReeeGRI2I eeGReGeeeeGeeeReGGGeGGGGGeeeGe GeeeeRGeeReGGeeeReRGGGeeGGRGGG eeReGGGRGGGGeReeeeeGGeReGGGGGG eeeeeGGGGGGGGeeeeeeeeeeeeGGGeR eeeGeeeeeeeReeeeReeReGGeGReGee ReGeeReReReeeReheeeeeeGRGeeeee eeeeReeeeeeeeeVeeeheeGeGGeReeR eheVFeeeeeheeheeeeeGRGGeeeeeGe eeeeyeheheeeeeeeheeGGGGeReeGRG eeeReeeeeeeheeeeeeeeReeeeeeeee eheeeeeeeeeeeeeheeReeeReeeReee } # tile 153 (rip) { 2j2jj2j2jjj2222j25jj22P22j228P Zj22jZx2jjjj222jj22j2Pj2PP22s5 xZj22j22jj2jj2j22222j2222P22P2 2jx22jjj222j222j222PjP222js222 j2jj2jjj222jj222j22P2252228228 jj2xZ2jjj2222j2jj52222222P2jP2 j22xx222jj22jj222jj22222522222 x2jj2222j22jjj222j22jj25222222 xZ222jjj2jj222jj22222222222222 2222j2jj22j222j222j2222j222222 2222jj2j2jj22j22222j222j222Pj2 xZjj2Zx2j2222222j2222222282222 22j22x222j222222j2222222222222 222222222222jj2222222222222222 ZZ22j222j222222222222222222822 2x222222j222222222222222228222 22222222222222jj22222222222222 222xZ2222222222222222222282222 I8II2II82222222222222222222222 eeeeGGe42222822822222222228822 GGeGeeeeeeeT44Tuu2222228II7v7v GeeeGReGeRGGeGGGeI8IIIII8pv777 GGeGGeeGeGGeeGGGGGeGGGGeGv7pv7 eReeReGeGRGGGGGRGeGeGGGGGGGcST eeeGeeeReeGGeRGGeGeGeRGGGGGcae eGeeeeeeGeeGGeeGeGeGeGeReeGecG GGReeReeeRGGReeeGeGeGeGeeGeGGG GGeeeeeeeGGGGeGReReGGeeeeGeGeR GGGReeheeGGGeeGGGeeeRGeReeRGGe eReeeeeeeRGeReeGeGRGGeeeGeeeGG } # tile 154 (rip) { P22jP2ss228s22WWWZZ2228vpavpav 22P2282j222822ZWWWZ22287v8cppc 2P2228s228P882ZZWW22WZ2aa8paap 2222P222s2s2822WZWZ2WZ8vp8avp4 2222P288j82822WWWZ2ZZ288pvappp 2P82222s22js88WWWZWZW22av8pppc 2js2P2s222s228ZZ2Z2WZ22apppppv 2228P8222222222ZW22Z2288vpcvpp 2P2222222888822ZZ22ZZ224p7pppa 22222822s282822W2W2Z228pp7vppp 2228s22P2s2882WWZWWZ224p4paa8p 22222222s28282WZW2ZZZ2pvp8p8pa 8822282828s2822ZZZZZ22Ivp848pp 2s22222228222222W2ZZ288v444p84 822222228228822ZWZWWW248448444 2828282222282222W22Z22vpv4apvv 2228282822882882Z22I2Iaaa4aacp 2282222222vavppII44p4vavpavpcv 2888888p8pv7cav7cvvv7apapapapa 22vv7v7gvpv7va7vaavpcvpcppcv8c 777v7cap777vvvpvpaapp7vvaap7pv v7v7pv77v7v7vvapvv7vavpvpavvav 7v7pp7v7v77p7va7pvv7a7vcp4v7av v7pvcv7vvv7vppvvpaav4pvpvvcppa TGvGGGvGpvapv4vvpvpvpvvpvv7pvp eGGeeGGG47a4vvaappppaappapppvp GeeGGGGTGGvvGGp44avvv8vvvvpvcv eeeGGGGGGvGGGvvv4cvv8vpavpppp4 eeeeGGGGTGGGGTGGvvGvvp4app4vpI eeGTGGGGGeGGGvGGvGGGvvvvvvvIII } # tile 155 (rip) { pappapvpavpapapapavap8288jB_UU p8cv8aap8aapvapvappav8828xBUUU ppaa8ap8avp8aapppca8pp228xBUUB 8app8avapp8app8pappIav8222nUBU pap8p8pcpppavpppap8pavp882nBBn pp8v8cppppapppcvppvapppI8jqnqn appppap8vappppapppapvpvp82WnWW pcppapppcppvpap8pcpvp7a822ZWnW a8vppavpppcpppapv8aa8vpp82ZWnW ppppvpapppppppav888app8I822nnn 4pappppcpvppvc8ppp88aa8482ZnBW p8ppp8ppppapppp8pcp84pp822ZnBn a848488p4pppppv88ppppappvv2ZWZ Ipvvpppvpppppappppppcvpcca8I44 88aaaaapaaaaavaaaaaav7acpvavpc vpapacvvaapavpvacvaavvaav7ccaa aavvpcpvcpvpacv7avaapaavvcaaa4 pcppavaavaccpvaapcpvaavaav444v vaaavvvpa4pcvpavvcpva44pvv444e ppapvpvvaavaapcvvaav44vvve44ee aavaavaa8vavpavvvvv44v4444eevT 4aavpapvpvavvvv4v44vv4e44eeevT vpappavvvv4vv444444v44v4ee444e apvv7vv4v4444I4I4444444ev4uuuv vpvvvv4I4444I4444I4uuu4e4uuuu4 pvpvv44II4III4Iuu4uuu444uuuuuu vv4vv4II44444Iuuuuuuuuuuuuuuuu I4444III44444Iuuuuueuuuuuuuuuu IIIIIIIIIII4IIuuIuuu4uuuuuuuuu IIIII44IIIuIIIuIIIIII4uIIIuuI4 } # tile 156 (rip) { _BWZj2j2p7vppvp777pvp77v77vppv UBZZjj22pp7p77pp7477pvcppgappc UBWZZ22j8v77pp7pp7pp7a7pvcpp7a UBWZjZj2pppgp47vp7vp7pppavpppa UBZ22Zx2ppp7pp7pp7pp7pv7pp7ppa nBnWjZj228pp4p7pp7pv7pp7pp7v8a WnnZ2ZZ22878ppvpvpv7pvpvpvppvp WWWW2Zj228pvppvp7pp7ppappappap nWWZ22jjj2p8p7ppvp4p48p84p7pp4 nnWZ22ZZ28vpppIpp8ppppp48ppvpp nWnWI2ZW288ppvpppvp74p7pp4ppa8 WnWZ222222pvppppppppp8v7pp7p48 Z22Ippp7pv7ppvavaav44papvavppa IvGcccccccc7accaacvvvaavvavvpa vvcaGvvGvvvvvvvvvvvvvvvvvvGvvv v4avevTevvvGTv44vvvvv4vevvvGGv 4v44eTvvGGvGGGvvvGGGvGeGeTvvvG eveeTTTTTTvvGv4GGvvGeTTvvvGTeG TeeTvTTTTvGTvvvvGvTTveTTvvGTvG v4eTvTTevvTTTTT44TeTTTTTTTTTTv vveevevvTeTvTT4eTTTTTTTTT4Tv4e e444ee44TTeeeveTeveTvTTT4eeveu TuueeuuuT4ueevTTT4vTvTT4eeueTu vvTeuuuuTTvvvTv4uTTvTeueeuu4TT 44TuuuuuT4444T4ueTv4TuueeT4vvT uuuuuuuuuuuuuuueeu4uuuuuTevvvu uuuuu4uu4TTvv4uuuuTTuuuuuuuTTu uuuuu4uu4uT44uuuuuuTuuuuuuuuT4 uuuuuuuuuuuuuuuuuuuuuuuuuuuuu4 v4IuuuuuIuuv4uuuuuuuuuuuuuu44u } # tile 157 (rip) { avpaav7a7ava7va77vagpaa8s22ss8 vp7aa777cvpc7ppacp7cp7g822j282 ppavppvcpp7pvcppapvg7a72282222 v8a7vp7av7vpavavpv7pavps8s2822 7ppapappc7pcppa7pcapa7pap22282 vp7ppppppv7pv7pvcpppvpvgK22s82 pppavpvappcppapa74pc8pv7828s22 p7pvap7c8aavpp8p7pvcpp7p822882 pappp4pa848paapp7ppp7vpgp82s22 ppvpvppvppp8pvvp74pavppgp828p2 4p7ppp7pIpap8ppv7pvcppp77p8882 48ppvpppp8pppv7ppppppp484p8224 vaI8vpavappavpaava8va78p882228 aavvvcv4accvvcaaaavvcvpv882882 vvvGvvvvvvvvvvvvvvvvvvvcvv4vpv vvGvGGGvGvvvGvvvvGGGvGvcvGGGGv vevvvcvGcveGGvTvveveTevGGpGGGG GTGGvGvv4GeeeeGeGTGTeGTevGTGvv TG4TeTTTTe4eTveTGeveGeTTeeTTG4 GGveeTTTGGvTTTTeTeTTeTTGeeTGGe eveTTveeTvTTTeTTTTTTTTTTeTTvve eTvTeveevTeeTTe4TTTTTTTTTTTTvT TeTvTTTTeeeuTTeeuTTTTTTTTTTTTT 4eeTvTTuuueeeuT44TTTTTTvTTTTTv 4uTeTuT4TuueuueT4TTT4TTvTTTTTT uuITe4vTTTuuueeuuTT4uTTvvT4vTT ueeu4v4uueeuTeuuuuTTTvvTTu4TTu TTuu44uuuTe4TeuuTuuuTuuTuTvv4T vvuuuuuu444v4uuTTuuuuuuuTTTTvT uuuuuTTuuuuu44TTuuuuuuu44vTTuu } # tile 158 (rip) { ppppp48pap8pppppcp88ppp888vWBn papvapppap2p88pvpp827v8pp44Zqn p7p7a8pc848pppaapap2aa8app8ZnW 8ppvpavapppcpppappp8vpavppIZnn 8pIppappaa8avpppcpv8ppapppp2nB pappapppcp88aapppcp8cpppvav2Wn 8v7ppvppppppppa84papapa8pa2WWB 8pa82ppc22vaapappppapvapv2ZWnn pcp8paa8v8pavppp8vaapppavpI2Wn pvpvppvpp8apap8v88ppppppavp2ZZ 8pcpppaappappcppp8ppcvpppcp82W ppppv88p8aapvpppapvapppaapI2Zn 8I48pppp8pvpppppvppa88pvp8p22W 8pv4pcp48ppppappppp8pp8pp88I22 vcvvcvvvpvcaapavp88pavpapp8822 v7ccvvv4avpcpIapapvvpv8aaIavII vvcvvGGvGvvca44vac7vvvvavvavv4 GGvGGvvGvvcvvvvvvvvvvpcvvvvvvG vGvvGGGvGvvvvGGGGvGvGvvGvGvvGv vTTTTGvvTGvGvGGv7GvvGvGGGGeGG7 TTeeTTveTTeTTTvGGGvvvGGvvTvveG TeeeTTvTTTTTeGvvGvTGvvGTevGeve TTGTTTTTTTTGvTTvvvGGevvGeTGGvG Te4TTTTTTTTc7TTeTevvTTTvGGTveT TeT4TTTTTT4TGvTTTTveTTT4vGTTTT TTTTTTTTT4eeevTTTeTTTTT4vvTTTT uvTTuuTTuTTu4TTTuTTvTTuTTTTTTv uuuTuu4Tee4TTT4T4T4eT4TTTTTTvT Tuuee44ueTuTvvuTTuTeuTTTvvTT4T u4TTv4vTuuuuTTveeu4TTvvvvTuTTT } # tile 159 (rip) { U_U_BZ282287aapvcv7acav7cav7cv nUBBn288888paap7cpvaaacpvaavcp nUBnkZ8p828paa4vccapavpa7pav7a BBUnnZ2p88pvvapapcpIaa8cv8c7va BUUUnWj828pc7pavpaapavpaapavpa BBBBUnZv888pvapacpva8aapvap7c7 BnnBBqZ82287apappapapvapavava8 nqqnBWj2828avpaa8cppcp8cppcv8p BBnqnWZ8282paa8848aappppvcppv7 qnnnnqZ2828p8avp8apvppvpppappa WZnnWW2282884paa8appppcpppavpa WZnnnW2v8p2ppap888aapppcp4ppvp WWWnWW284824pappa8vapppapapa7p WWWW2W28p88p8paca8aappavpcaacv 22I2I2I8avpaaappc8papaa8aapIp7 2II4vvpvapavapvapapavppapvpav7 444vcpvcpvap8pcppappaapappcaap GGvvv4aaavvvpavv44aap8pcvpcvp7 vGGvvvvvvvvavvvvv8vpa8vpapapav vGGGvGvvvGGcvvcvvvvvapvvvavvcp vvTvvvGGvvvvvG4vvcvvvvvvavvGvv eveTGvTGvvGvGvvevavvcGvGvvGvev eeTGGvveeeveGGveGv4vGvvvGGvGGT TTTeTeTGTTeTeTevvGGTevevTvv7cT TTTTTeeTeTvTTTTveTGevvTGeTGG7T TTTv4eeeeevTTTTTT4GGevTTTTGTvT TTTTTTvTuTTTv4eTTTTTvGGTvvvTeT vTeTvTvTT4eTeTvvTvvevvGevTTTvv TueevTTueevTTT44444uTTvvvTGTvv TTuuuvTevTTvTTveeeTeu4TTTvTvvT } # tile 160 (rip) { 4828I2882882I8288888Ip88888888 4v28v28488488I88I82888228488I8 84288288I82882v82v842842888488 488448I8888888288888888888I888 I48I884828I28I88I28I88I8828828 22I88888888888I82482I82I888828 88v88I88I88888I82p48888p88III4 I48I88II88III4I88IIIIIIIIIDVeV pII848IeIIVeDe4eeVhVeDVeRVDDFD eeIe44DDIDDDDDVFDDDDDDDVVhDDDD VVDFVVVFDDDDDDDDDDDDVVDVhVDDDD DDDDVVhRhVhhVVDDFVDFeeDDDDDDDD yVVVhhhhhhhVhVVVVVFVeFDFVFDFDD hRhhyhyyVVVFDVVhVVFFFFFVVhVVVF hhhyVFDDDDDDDDDDDDDDDDDFVFVeuh VVyVVFDDDDDDDFDDDDDDDDVFFVVVeV DDFyyyVDDDDDFFVVDDDDFVhVVVFFDD VyVyhyVVDDDFFDeeVVFDeehhhVyFDD hhhhhhheyhhhhyehhhhyeyyyyVyVFF hhRRRhGGRGGRRRhRRhyhFVyVVFVhVV hhhhhhRhhhRhhyyyyVVVVyyVFDDDFF VVVVyyyVyyyVyyVVVVFVVVFFDDDDDD DDDFFVFFFDDDDDFFVVVFDDDDDDDDDD FFFVVVyyyVVVFDDFFDDDDFFFDDFFFh FDFFFFVVVVVVFFFVVFVVVhyhFVhhVh DDDDDDDDFVVyVyyyyyhhhhhhhVhyVh FFVVVyyyyyhhhhhyVyVFFFFDFVFVhV VyyyyhyyyVVVVFVFFVVVVVVFVVVVyV yyyyyVyVVFDDDDDDFFVyVVyyyVyVVF DDFDDDDDFFFVVVyyhyyVyVVVFFDDDD } # tile 161 (rip) { 8p88888428p4888488488848484848 8888I88888I88Ip8Ip848488488I88 II888I8I88888488v88888I2848p8v 888888888442888888828888888888 8I82248228828I828II8I88I88II8I 82888882884288IIIReGReVeVeVeRG 4I4444Iue4vv4euIeVyyVFVDDDFDDh VhVFhFDDhReRhFDDDyyyyyVFDVhVVV VVVFVhhhFFVyVhyhhhhhyyyVVhhhVV DFFDDVyyDDVVyyhyyyVVVVFVVVVVFF DDFFDDDDDDVVVVVVFFDDFDDDDDDDDD DVeeVDDDDDDDDDDDDDDDDDDDDDDDDF DDVVFDDDFFFFDDDDDFVeFVeyhheyhh DFDDDDDDDFFFFDDDDDReyheRhRRehh hhyVVhFDDDDDDDFFVVFVVyyVVVDFFF VVVVVVFDhVFhVhVVFFDFFFFFDDDDDD DDDDDDDVeeVhhhVVFDDDDDDDDDDDDD DDDDDDDDDDDFDDFDDFDDDDDDDDDDDD FFDDDDDDDDDDDDDDDVVVVVVVFFFDDD FFDDDDDDDDDDDDDDFVhhhhhhyyVFFF VVFFFFFVVhVVVVVFVhVVFVyhyyhhhh FDFFFDFFFVFVVVhVVFVFFVVyyVVVVV DDDDDDFFDDDDFVVVFFFVVVVyVVVFFD VFhVFhVhVVhVDDVFFDFDFFyhhhhRhR VhhhVhVhVVFFFFVVhyhhyhhhhhhhhh VhhhhVhhVFFFVhyhhRRhhhRhhyyVFD hVhyFyVyyVhhhRhhhyVFFFFVFDDDDD VFVFFVVVVVVVyyyVVFDDDDDFFDFFFV DDDDDFFFFFFDDDDDDDDDDDDFVFVFFV FFDDDDDDDDDDDFFVVyVVVVVVVVyFDF } # tile 162 (rip) { 888I2488I888488I8888I8888I8888 I848848I8848848848I848I84888I2 8v8488Ip8p848828828p28p28I8828 888p844e44444444vv44IIIuIe44Ie 88I4pI4VVVheRVhVhRRhyDDDDDVVVD eheVeVDDFVVVVDhhRRhhhyVeVDDDDV hyDFVVhVVVVVFDVyyVVyyVVeFFDDFe VVhVVeehhVFFDDDDDDDFFDDDFDDDDR FDFVVyVFFFFDDDFVVVFDDDDDDDDVVh DFDDFDFDDDFVVFVVVDDDFFVVVVVVyV FVFDDFDFFFVeeFyVFFDDFVyVeeyVyV VyyhhhRhhRhhhhhyFeeFDDFFVyVVyh hhhhhhhyhhhVVVVFFeFFDDDDFFFVVy RhhyVVFFFFFDDDDDDDFFDDDDDDFFFD FVVFFFVFFVyVFVVVFFVFDDDDDDDFFD DDDFVVVVFVVFFVyyVyVVVFVVVFFVVV DDDFVVVFFDDDFFVyyyyyyhVVhVVFyy DDDDDDDDDDDDDFFVyyVFhVVDFyVVVy DDFDFFVVFFVVVhyVVyVFVFFFFVVFVV FVVFVFeeFVyhhhhyFhVVFFFFFFFVVV hhhhVVVVVVyyVVyyyVyVDDDDDDDDFV VVyhhhyyyhhyyyyVFFFFFFDFFVVVFh DDVyhhhhhhhVhhyFDDDFVFVFVheeyy hVVVVVFVFVFVVyVhyVhhVhhhyhhhhh VFFDDDFFFFVVyyVFVVVhyVyVVVyyyV DDDDDDFVVVVVhVDFFDDVVVFFFFFDFD DDDDFVyyyVFFDDDDDDDDDDDDDDDDDD FFFFFVVVVVFDDDDDDDDDDDFFFFVVVF VFFVFFFFFFFDDDDDDDDFFVFhyyhhyy FVVVVVVDDDFDFFDDhVhVhhyhhyhhhh } # tile 163 (rip) { 888888888888888888888888888888 8882I82I88I888II8888II888I8II8 82882888eheheeReheeVeeReheheVe Iu44I4uIFVyFFFVDVVVVVVVDDDDDVF DDVyVVVVVyVVVVFVyVVVVVVFDFFVhF VVVFVVyVFeeFDDDFFFDDDDDDVeyyhe VFFFFVVyVVVDFVDFVDVVDDFFVeVyhR eDFFFFVyyVFDeeDVyFeeFVyVFFDVyF VVyyVyhVyyhhyyyyyFFVVhVFFDDVyy VFFVVVyyyyhyVFFFFDDFFFFFDFDFFF FDDFVVVVVyVVFDDDDFDDDFFFFVFFDD hyVeeVVFVVyhhhhyVeeVFeeVFFFVVV yhVyRFFFFVyyyyhhhRyyFVVFFVVyhh VVFFFVFFDFVFFFVyhVVVVFDDDVyVVy DDDDDDFVFFDDDDDDDDDDFVVVVFDDDD FFVVFVyVyVFFFFFVVVVyyyyhVVFFFV yyhhyhhyhhyyyyyhhhhhRhhyyyhVVh yyhhhhyVyyyyyhhhhRhhhhhhhhhhhh FVyhhhhhyhyyyyhhhyhyyyyyhhhhhh VVyVVyyhhhhhVVVVVyyyyyyVyhVyhy VFFFFFFDFVFFFDDFVyyhhhhyyyVVyh VVVVVVVVyVVVFDDDFFVFyyhhhyyyyh yyyyyhhhhyyyVFDFFDDDFVhhhhhhyy hhhyyyVFyVVFVVFFFFFFVFVVVVFVFF VyyVVVFFFFFFFDFFFFFVVFFFDFFFFF DFFFFDDDDDDDDDDFFDFVVVFDFFFFFF DDFVFDFDDDDFDDDFFVFFFFVVFVVyVV FFFFFDDFDDFFFDFDFDFFFVVVVVVyVV FVFFDDDDDFFFFFFFDDFFVVVVFFFVVV yVVVVFFFFFFFFhVFVVVVVFFFFDFFVV } # tile 164 (rip) { 88888882pII4Zn_ifOObOOOJOAULAd 8I88I888I4I42nnnnU_UBUAOABqqBB ReReheheVRhFFueeeuDIeuDIeFDueF VVyVVVVDVVFDDVFDDyVFFFVVDFVDDV VyyyhhhRhhVDVVeeyeeVeRheVFehVe eRRGGRhhGehGGRRyVVyyyVVyyyyhVD hyyyhyhhRyyehyhhyyyyyVhVVyhyyF VVDDDFVVVVFVyyyyyVyyyyyyyyVyhy yhVFFFVVVFFFFFFFDFFVVhhyeeVVyy VVFFFVVVFFDDFFFFFVVyyyVFVVDFFF DDDDDVyyVDFDDFFVyyyhyFFDDDDDDD VVFVVFVyhhhVVyVVVVyyFFDFVVVyhh hhyyyyyyVyhhhhhhehhhhyyVVyyhyy hhhyyhyVVVyhhRRGGhRhRRRhyhyyyV FFFFVFVyyFVFVyyyhhhhhhhyhRRRRh yyVyyhyhyyFFFFFFFVVyVVVVyhhRhh RRhhRRhhyyVVDDDDDFFDDDFFVyhhhh hRRRRhhhyVyVyVVFFVVVyhhhyyVVyy hhhRhhhhhhhhhyVFVVyhhyyVVVFFFF hhhyhhyhhhhhhyVFVVyyVVFFFFDDDD hyhhhyyyVVyVFDDDDDFFFVVyyhhhhy hyyyyyyVFDDFFFFVVVVyyhhhhhhhhh yVyVyVVDDDDFFVVyhhhhhRRRhhhhhh VVFFDDDDDFVVVVVVyyVVVyyyhyyyhh DFFDFFFFDFVDFDFVVFFFDFVVVFVVVV FDFVFVVFFFFDDDFFFFDDDFFDDDFFDV FVyVVFDDDDDDDDDDDDDDDFVVFDVVyy VyVVFDDDDDDDDDDDDFFFFVFVFFFFVV FVVFDFFDDDDDDDDDFFVFVVyVVyFDDD yVVVVVVVVVFDDDFVVVyhhhyyyVVFFF } # tile 165 (rip) { ObnnnnnBBBnBBnBUBnBBnnnnBBnBBq __qqWWnnnnnnnnnnnqqnknnnnnnBnW IeDDIIeDIIDIuDIeeDuIee22eujx2j VDFDDVVVVVhFFhVVFDFVDDeRDDDIDu yyeeVyVheeVeeheRVVFFyFDDDDDDDD FVyhhhyVyhhRhhRhVVVyhReDFeDDDD FVyyyyhyVyhRhhyyVeyyyheDFeeFVF yyyVVVyhyyhhyyVyyeeVyVVDVVeehh yyyeRhFVVhhhhyhhhhyyyyyhhhyyhh FVVyeVFFVyVyyhhhyyVVFFVyyhhhhh FFyVFFFVyVDFVVyVVVVVFFFFFyhhRR hhyyVVVyyyVVFVhhhhRheeFFFVyyyy yyyVyVVVyVFFFDVVVyyyRVVyyyyhRh VhyyhyyyyVDDFDDDDDDDFVyhhhyeGR GGRRRyeeyVyeeVhhhhyyhhhRhhyVFy hhyyyVVVVFFRVVyyhhhRRhhhhhhyyy yFVFDDDDDDDFVVVVyhhRhhhhhyRRRh yyVVVVVVVVVhhhhyyyyyyyyyyyyyyh VVVyyhVyyyyyhhhyVyyyyyyhVVVFFy FVyVyyVVVhyyVFyVVhhhhhhyVVVFDF yVyVVyhhhhRhhhhyyyyyhhhhhhhyVV hyyyyhhyyyyhhhyyVFVVyhhhhhhyVV hhhhhhyVFDDVyVVFVVVVVyyhhyyVVy hhhyVVFVFVVVVVFFVVFVFFFFVVhhhh VVyyyVyyVyyVFFFVVVFFFVVFVVhhhh VVyyhhhhhVVFFDFVFFDDFVVVVyyhhy hhhyyVVVVFDDDDDDDDDDDDDDFFFVVy VVVVFVVVVFDDDDDDDDDDDDDFVyVyhh DDDDDFFFFDDDDDDDDDDDDFFVVhhhRR FFFFFFFFDDDFDDDDDDDFFFVFVVVyyy } # tile 166 (rip) { nBnnnBBnBnnBBBnBBBnnBnnBBnnnBB nnqnBnnqBnqnBnBnBBBBBnnnBBqB_B j22ZWWWZWZWWZqnBBnqnBBBnnUBBBn IDuuIDIDIDeIII8ZZ2j2WWZxZZWWWZ DDDDDDDDDDDDVyhhhhyyehhRueDeII DeDDVyhVeeVVeeVyeyyhyyhhhhGeeF heFVhhhReyhyVVFVeyhhyhhhhRGRVD hhhhRRhhyhhyVFDFyhhhhhRRRRhRyD hRhhhhhhhyyhhhhyVFVyyyyhhRRGGR RhRyyyyyyyyyVVehyyyeyyyhhRhhGh hhhyVyyyyhhVFFReyheRVyhhhRhhyy yyyyhhhhFeeyVVVVyFDVhhRRhhyyyy hhyyyyyyFVRVVVDVVFFVyhhhRhyyVF hRhyyyVFVFFFFFFVyVVyyyyhRRhyVV yyyyhhhhhhhhhhhhhyyhhhhRhhGehh yyVVVyyyhhyyyyhhhyhhhhyhyyRyhy yVVFVFFVVVyyyyyVVVyhhyyyyyFFFy hVFReFFyhhRhhhyFDDFFVyhhhyVFFF VVFFVFDVVyyyyyyVFFVVFVhhyVVVyV FFDDDDFFDDDFVyyyyyyVFVyyVFyhhh FFDFDDFFFFFVhhyeeFFDDFFVyhhhhh VVyVVVyyyVVVVVFVVDDFFFyVyhhhhy yyhyyhhhyyyVFDDDDDFFVyyyVyhhhh hVyVVyyyyyhhhyVFFVVFFVyyyyhhRR hyhhyyyyhhhhhhhyyyhheyyVVVVyhh hhRRRhhVhyVhhhhhhhhheeVVFFFVyy hhhhhhhhDFFVVyyyhhyyVVFFFDFFyy hhRhhhhyVFFFVyyyhhyyyyyyyVVyyy hRRRhyyVyVFDFVVhhVyhhhhhhhhhyV yyyyVVVVFDDDDDFVVVVyhhhhhhhyyV } # tile 167 (rip) { BBUBBBBnBUUUBBBUBBBBBBBBBBBBBB nBnBBUBBUUUBBBUBBBBBBBBBnBnBnB nUBUUBBUBBUBBBBBBBBnBBBBBBBnqB WWqWqqnBnBUBBBUBBBBBBBBnnBBBnB IIIIIZWWqqnnnnnnnnBnUUBqnBnBBn DFDDDDDDDDIIuuj2xnqWnBBBBBnnBB DVDVhVVVFDDeFFeuDj2e2ZZWZWZWnn eeVVeyyhyVDFheDDDDFDyyheuuI2WW hhyVDDVyheeyyVVyhhRehhReRDDDDD hyVFFVyyhhRhyyhhRRRRyyyehVVVhV yVVVheeyhhhhhRyeehhyVyhhRReeey yyhhRhhRRGGRRhVVhhGGRRGRhRhyVy FFVyhhhhhhRhRRyyyhRRRhGRRRhhyy FFDVyVyyyyhhhRRhhhyhhhhRRRRhhh eeVheyVyyhRRRRRRRhRhhyyyRRhRRh yRhhRhyVyhhhhhyyyyyyyyyyhhhhRh yyhhhhhyyyhhyyDFFDFVyhhyyhyRey FVhyyhhRGGhyVyFReVyhhyhhhhyyyh VVyyyhhRRRhhhhyheyhhyhRyhyyVVh hyyyhyyyyyhhhhhyhhhyyeeyyRhyVy hhyyyVFDDFFFVyyyyyhRRhhhhyeeFV hhyyyyVVVVVyFFVyyyhhhhhhhhRhyy hhhhhhhhhhhhVDVyhhhhyyyVyhRRRR GGRRRRhyhhyhyVVyhhyVyhyVFVyhhh hhhyyyyVVVVyyVFVyyFVhhhhyyyVyy VVVVFVVVDFFVFVVVFVVyhhRRhhyVFV yhhyVyhhhyVyVyhhhyyhhyyVVVFFVV yhhhhhRhhyVVVVVVVyhhhhyVFFVFDF VVyhRRRRyyyVFFDDDVhRhhhyVVyVDD VVVVyyhRRRhhhhyVVVVyhhRRhhyVVV } # tile 168 (rip) { BBBBBBBBBnUUBBBBBBBBnBBUBUUBBB nBUBnBBnBBBBBBnBnBnBBBUUUUUUBB BUBBBBnBBBBBUBBBBBBnBBUUBUUBBB BBBBBBBBBnBBBBBnBnBBBBUUBBUBnB BBUUBBnBnBBBBBBBBBnBnBUUBBUBBB BBUnqBnqBBBnBBnBnBnqBBBBUUUBnB nnBBnBBnnnBBnnBBBBnnBnBUBBBBBB WZnnnnnnqnBBnnBUnBUUBBBUBBBBnB DDDu282xWWWBnnBBBBBBBBBBBqBnqB VVVFeyeDe22ZZZZWWWWnqnBBBnBBnn eeyVVDDDDVeVyRyheI2ZZZWnnnnBBB VyVVyehVeehVVyVeeVFDDDDDu2qnni yVVVyRyhRyyehhyhRhVFVVVVVe22Zk yVyyVhhhhyVeRRhyyehVeTeeeDFFFe yVeRyeRhhyVyyyhyyRhhRRhVReVhey yVehVehhhhyVyehhhhhyhRRVFRyyey yhFVhyhhhhhyeRRRhyyyhhhyVVhhyh yyhhhhyVFReyFVyyyyVFeRyVyhhRey hyhhyhhhyheyVVeyhRhyRhhehRGeyh hhhhhyhRhhhhyyeRRGGRyyheRhGhVh VyyhhhhRRRRhhyVhRRRhhhhVyhhhRR yyyyyyhhhhhyhhyyyRRRhhhyyyyyhR hhhyVVyyyyyyyhhyyhRRRRRRhyhyVR hhhReyVVeRhyhhhhhhhhhhhhhyRhye yyyheVVyRhhhhhGhhhhhhhyyyyhyyR yVyyVFyhhyyhhhRGRRhhhyyVVyyyyh FVyhhhyyhhhhhyhRRhRRhhhyeRhhhy DFyyhyyVyyyyVVVyhhhRhhhhheRhhy DDFVVyyVFFFFFVVVyhhRhhhRRRhRRh FFDFVVyVFFFDFyVyyhhhhhhhhhRhRh } # tile 169 (rip) { nBnBBBBBBnBUUBBUUBUUUUUBBBUUBB BBBBBBBnBBBBUUUBUUU_UBUUBBBUUB nBnBBBnBBB_U__BBUBBUU__UU_UUUU BBBBBBBUBU_UUBBBBBBUUU_BU_BBBB BUBBBUUUBUBUBBBBBBBUUBBBBBBBBB BUBUUUUnnnBUBBBUBBUUUnnnBBUBnB BBBUBBBBnnBnnBBBBUBBUBnBBnUBnB nBBnBBBnBBnnnBnBBBBBBUBBBBnnqB BBqnBBnnnBBnBnnnBnBBBBBBBBqnBB nnnnBBBnnBBBBnnnBnBnnnnnnnnnBn BnBBBBB_UUUBBBBUUUBUUnqqnnBBBB dfUU_ifOOObddddbbbbbd_BUUUUiAf nnnBUibOJJJObdbbOOOObA_LL_Afdd eIZWkBULfbObbdbbbbObdi__UUfddd VFDFDueu2Zn_bObbbbbbi_L_L__dOb yVFyhVDDVDeWqqnnBLfdiiffi__fbd eeyRGeRVFDDDyRVeWnnUBU_iL__ifA yhhyyhhVeeeVyeehDeIDueZWnUB_Ai RRRhRehheheVyeRhyyyVDDeu2WWWWq RGhRGGGRyyVyyVFyeGGeDDDDDVeueu hhRRRhRyVVyheRVhhyVVeeheeRDDDD hhhhhhhyehyhyehhRyyeheeReehhhh RhyyyhhhGRhhhRyGGhRGhyhRhhGGGG RVyyyhhhRRhyGGhyyhRRhyyRRhhRRh RhyhhhhyyhRRRRRhhRhhhhRyyhhRRy RRhhhyhhyRGRhyyhyRyyhReVyhhRGR yheRyyhRhhhhyyhyVyVVhRhhhhRRRh yyehyVhhhhyyyhhyeyyyyyhRhhRRRR hhyhhyyhyhhyhhhRehhhVVyeRhRRRG hyyyyyyyyhRReFDFyhyyRehVVyhhhh } # tile 170 (rip) { BUUBBBUn2WBAOJJOOJJJ33JbbbOJOu U_UUUUUn2WUOOJJOOOJJJ33OObbJO2 BBUUUUUB2W_OJJJJJJJJJJ3JbddOf2 BBUBUUUnxW_OJJJOJOJOJJJJOOOOf2 nBBUBUUnZq_bJ3JJJbOJJJOJJJJJAI BBBBBBUB2WdbOJ3JOJOOOJJJJOJJf2 nnBBBUUBZndbOJJJJJJOJJJJJJOOb2 nnBUUUBBWnddbbJJOJOJJOJOJOOJO2 BBBBBBBnWnddddOOOdbOOOJJJJJJb2 BBBBnBBnZnbddbdbObdfdbOOOOJJO2 BBBBBBBnWBdfbbfdOOfLffdbOOOJOj L_BUU___LdOfAbdddbObLidOOObOOZ A___AiLLdbfdfdffdObddAAbbAAbb2 A__ifdALfiLddA_idOfLbd_dA_AdL2 A__iAfdfAfffiL__LddfdA_LAddfBI fi_LfddfiAfiiAAi_ifdAii_LAdb_I ffiLAdbfLAfLiffi__Af_idL__fbi2 iiAi_LAdAAddiU_UU_AdL_L_BB_fU2 nBBLfLLiiiLLBnnBB_iiLL_nBBB_B2 ZWWn__BB__BBnnqnB____LUqnBBBn8 DuIeeWWWBUBBnqnqnB__UUBWWnUnWu yVVVVFI2WWWqnBqnBU____nWZWWZ2I Geyhehheeeu2nnnnB_UBUBnZ2I4euI hyhyVeeFDDDIDeZWkUBnqZIIIIu44T hhRhyReyVFVehFII2WZ22I4IIu44Tv hReeRVReheeyeehDDeeF44IIeevTTv hRyGGhhyhyhheGeVFeeReeVGG44vTv RRhhGhyehhhyhReeReheRhRRGeeTTT GRRRRyReyhyhhhhGGhhhRGGhRRReGG hRGRRRRRhRehyhGGhhRheRyhRGRhhh } # tile 171 (rip) { yeuuuehFeeeeehIheeeeeheeheeeRV GReuueVDIeeeeeuueeeVeuheeeReeD yDIeDeuIeeeheeeeehueIDDeeeeeeu huuIDeeuehFIIhFhIFhuuuFuheeeeh eIhIIeeeeFDIueDIIDIIeeeeeehehD yDeIIDFReeueeeuueeheeeeheeeeeI eRueeueuFeueReueheeeheeeeDueee ReIuDIIIDRueuheeeeheeeeeFDIuee hDhIIeeeueeIeDeuuDFeeheeuueeID hueeDuRVueVIIIheuIReeeeeeueeuh eIeFDIuDIeDIuueeeIueeeheeeeRGp eDIuuuueuIueeeeeeeeeeeueeeTeGT ReeTvvTeeeeeTGeeeeeeeTGTTeGTTe TTGGTTTTGGG7GGTTTeGGTGGTTTGTTG G7GGTTTTTTTGTTGTTGGeTeeTTGeTTG GvGTTTTTTTTGTTGeTGTTGGeTTeeGTG eTTTTTTTTTTTTTGGTTTTGGTTTTGGGv GeTTTTTTTTTGGTTTTGGTTTTGGTTTTG eeTTTTTTGTvGTTGTvGGTGTTGTTTTTG TvTTTTTTGTvTTTGT7GGTGTTTTTGGTG 4TvTGc7vTvvTTTvGGvvTvvTTTTTTTT TTvTGTGvGG7TGTvTGvvTgTTTTv7TTT uTTvvTTTGTvGGTTTTTTTcTTTv7cTTT TvTv7TTTvGGTvTTTTTv7GGTTGGTTTT vTTTvTTvvTTvTTTTTTvvGTGvTGTTTT TTTTTTvvGvvTTTTTTTTT7TG7vTTTTT vTvvvTvvSTTuuu444TTTTTuTTTTTuT vvv44TvvgTvTTTu4TTTvT4TTTTTuTT TveTuTvvTvvTTTuTTTv7TTTTTTTTTT eeheGvvT4eT7vvTTTTv7vvTTv77vuT } # tile 172 (rip) { eueeeheeVeFeReeeeeeeeeeyReeeRe eueheeeeeyFReeeeeVeeeReFyeGGee ehDFeeeeeeeeeehehVeheeeReeeRGe eIVeeeheeheeeeeeeeeeeeeeeeeeGe IIeeeeeeeeeReeeeeheeeheeeheeeR eeeeheeheeeuheeVeeeeeeeeeeeRee eeheeeeeeheFeueeeDhIDhueeeeeee heeeeeheeeeDDueehDuIDuueheheeh FeeeeeeeIDDIIeeeeuuehIuDFeIuDe eeheeVeeuueueeeeeeeGeeeeReueVe eeeeeeeeeeeeeeeeeRGGGGTeeeeeue GeeeeeeeeeGTeReeeeeGTTTeGGGRee GGTTTeeTGeeTTTGeGeeTTTGGGGGGGT GGTTeGGGGGTeGeGGGGGTGeGGTvGGTG GTTGGeGGTGGGeGeGeTGGeeTGTTGGTe TGGeGTeGTGGGeGeeTTeGGGeGeGGeeG TGGGeTTTTeGTTeeeTTeeGGTGGGeGGT TTTTTGGGTTTTTTTeGTTTGTvGeTTTTe eTTTTGeTTTGTeeTGGvTGGGTGTGTGTT GTTTTTTTTGGTeeTeG7GeeGGT7cGGGT eeTTTTTTeeTTTTTTTGGGTGGTGGTGGT eeTTTTTTeeTTTeTTTeGGTTTTTGTTGT TTTTTTTTTTTTeeTTTTTTTvvTTTTTTT TTTTTTeeTTTTTTTGGTeeTTTGGTTTTT TTTTTTeeTTTTTTTTGTeeeTTGeTeeTT TTTTTTTTTTTTTTTTTTTTeeTTTTeeTT TTTTTTTTTTTTTTTTTTTTTeeTTTTTTT TTTTTvvTTTTTTTTTTTee4eeTTTvTGT TTuTTvvTTTTTTTTTTTeeuTeuTTvGGT TuTTTTTTuuueeuTTTuTTTTeuTTTTTT } # tile 173 (rip) { eeeeeheeeGGGeeeeeeGeGeeeeGGGGG eeeheeeGeeeeeeReeReeeheeReGGRe ReeeeeeReeReeeeGReeeeeeeeeeeee eeeeeVheeeeeReGeGeeReeReeeReee eehehFheeheeeeeeeeeeeeeeReeeRe eeeeeeeeeeeeeeReeheeeheeeeeeee eheeeeeheeeReeeeeeeeeeeeeReeee eeeeeheeeeeeeeeheeheeheeGeehee eeeheeeeheeheeeeeeeeeeeeeeeeee heeeeeeeeeeeeeheeeeheeeheeReee eeeeeeheeeVueeeeVeeeehueeeeeRe eRGReeeeeeeeeeReeeeeeeeeeheeee GeTGGeeehueeGGTTeeeeeeeReeeeee GTTGGeeeeeeeeTTTeGTvGeeeTeeGee GTGGeTTGGGGeGGGGGeGGGRTTTGTGGG eeGGGGGGcGeeGGGGTTeGGGTTeGGeGe GeTGGGeTcTeeeTGGeGeTGeTGGGGGee GGTTTTTTTGGGGGGGeeGGGGGTeTTeGe TGTTeTGeTTGGGeGGGTTGGGGvGeTTGe TTTeGTGGTTGGTTeGGTTTTGGvGGTTTG TTGGGTTTGGeTTTTeTTTTTTTGTTeeTT TTGGeGTTGTTTTTGeGTTGTTGeeGeeTT TTTeTGGTTTTGeTGGGTTeTTeTGGTTTG TTTTTTTTeeTTeeTTTTTTTTTTTTTTTT TTeeTTTTeeTTTeTTTTTTGeGvTeTTTT TTeeTTTTTTTTTTTTTTTTGGG7TeTTTT TTTTTTTTTTTTeeTeeTTTTTTTGGTTTT TTTTTTTTTeeTTTGeTTTTTTTTTTTTTe TTTTTTTTTeeTvvGTvTTTTTTTTTTTTe TTTTTTTTTTTTTGTTTTTTTTTTTTTTTT } # tile 174 (rip) { eReGeGGeGGTGGGGvGGGeGGGvGGGvv4 eGeGGGeGGGeGGGTeGGGveGGGGGGGGv eeGGeGeeGGeGeGeGGGGGGGeGGGvGvG RGGeReeReeReeeeGGeeGeGeGGTTTeG eeeGeeeeeeeeReeeGGeeeGGTeGeGGG eeReeeReeGeeeeTGGeeeGTeGGeeeGe heeeeeeeheeeeeeGeGeGeeeGGeeGGe eeeeeheeeeheeReeeGeReeeeGGeGGe eeReeeeeeeeeeeeeeGeeeReeeeeeee heeeeeeheeeheeReeTeeeeeeeReeee eeeReeeeeeeeeeeeeGeeReeeeeeeee eeeeeReeeReeeeeeeeGeeeeeeeGGee heeeeeeheeeeeeheeeeeeeheeeeeRe GGeeheeeeeeeeeeeReeeeeeeeeheee TTGeTGeeeeeRGeeeeeeReGeeeeeeee eTGGeGeeeeeGGGeeeGGeGeeeeeeeee GGTeGTGGeGeTGGGTGeeeTGGGTTeeRe GGGGGGGGeeGGGGc7eGeTTTTe7STeTT GeGeTTGeGTTGeG7GeGGTGTTeGTTTTT GTTTTTeTTTTTTTTeGa7TGGTeeeTGeT TTeeTGTTGTTGTTeeTGTTTeGTGGTGGT TTeeGeTTTeGeTeeeTGeGTTGTTGTTTT eTTTeTTTTTGTTTGTTGGGTTTTTTTTTT eeTTTTGGTTTTTTTTTGG7GGTTGGTTTT eeTTTTTGTeeTTTTTTGTvTGTTTGTTTe eeTTTTTTTeeTTTTTTTTTTTTTTTTTTe TTTTTTTTTTTTTTGGTTGG7vTTTTTTTT TTTTTTTTTTTTTTGTTTTTvvTTTTTTTT eTTTTTTTTTTTTTTTTTTTTTTTTTTTTT TTTTTTTTTTueeTTTTTTTTTTTTTvvTT } # tile 175 (rip) { 4v4IIII4IIIIIIuIIIIIIIIIIuuIIu eG44IIIIIIIIIIIIIuII4uIIuuIIII evGGGGGeIIIIIIIIIIIIIIIIIIIIII GTGGGGGe44eeuuuIIIIIpIIIIIIIII GGeeeGGeTGGGveuIIII4IuIIIIIIII GGGTTGeeGGTGGGe4eT4IIIIIIIIIII eGeGeGeeGeeGeGeTGT4TuuuuuIIIII TeeeGGGeeGGeeeTGeTeGTTTeuIIIII eeGeeTGGeeGTeeTTGeeTTGGTTTTTTT ReeeTeGeeGGeeGTGGeTTeeGTTGTTTT eeReTeeeeeTeeeeeeTTTeeTTGGTTTT eeeeeeeGeeeeeTTTeeeGTTTeeTTTTe eTGGeeeGeeeeeTTeeeeGeTeeTTTTTe eTeeReeeeReTTTGeeTeeTeeTTTTTTT eGeeeTeTTTTeeTeeeeeeeGeTeeGTTT eeeeeTTTTeGeeeeeeeReTTTeeeeeTT eeeeeTGeTTGeReeGeeeeeTTeTueeTT eeeeeTeeeeeeeeeeeeeeTeeeeeTTTe GGTTeeeeeeeeeTeeeReeeeeeeeTTTe GGTTGeeTTTGe4eeTueeueeGeGTTTee 7SGTTTTTTTTeeeeTTeeTeeTeeeeeTT GTTTGTTTTTGTTeTTeeeTeTeeTTeeeT eeTTGTTTTGGTTTTTTeeTTTTTTTuTeT TTTTTTTTTTTTTTTTTTTTTTTTTTTTTu TTTTTTTTTTTTTTTTTTTTTTvGTvTG7T eTTTTTTTTTTTTTTTTTTTTv7GGvTTST TTTTTTTTTTTTTTTTTTTTTTTTTTTTGT TTTTTTTTTTTTTTTTTTTTTTTTTTTTT4 TTTTTTTTTTTTTTTTTTTTTTTTTTTTTu TTTTTTTTTTTTTTTTTTTTTTTTTTTTTT } # tile 176 (rip) { uuuu4uuuIuvvvu44uuuuuu4uuuuu4u IIu44IIIu4v4v4vv4Iuuuu4uuuuuuu IIIIIIIIIII4444444uuIuuIuuIuuI IIIIIIIIIII4pIIuuuuuIIuIIuIIuu IIIIIIIIIIIIIIIIIIIIIIIIIIIuuu IIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIII uIIIIIIIIIIIIIIIIIIIIIIIIIIIII TuuuuIIIIIIIIIIIIIIIIIIIIIIIII TTTTTuIIIIIIIIIIIIIIIIIIIIIIII eTGGTTTTTuIIIIIIIIIIIIIIIIIIII eTGTTeTvTTuuuuuuIIIIIIIIIIIIII TTTTTGGvTTTTTTTuIIIIIIIIIIIIII TTTTTTTTTTTTTTTTuTv4IIIIIIIIII TeTTTTTTTTTTTTTuTTTv44u4uIIIII eeTTTTTTTTTTTTTTTTTT7vTTuIIIII eTTeeTTTTTTTeeTTTvvTTTTTvvTv4I eTeeeeTTTTTTTTTTTvTTTTTTTvvvv4 eTeeTeeTTTTTuuTTTTTTTTTTTTvvTv TTTTTTTuTeeTTTTTTTTuuTTTTuTTTT TeTTeTTTTTeTTTTTTTTTT4TTuTTTTv eeueeueeuuTTTuTTTuTGTTTuTTuTTv TTTeeueeuTeuTTTTueeTTTTuTTTTTu TTTTeTueuTeTuTeTueTuTTvTTTTTTT TTTTTTTT4TTTTueeuTTuTv4TTTuTTT TTTTTvTGvvTTTTTTTTTuTTuvvTTvvT TTTTTvTGvvvTTvTTvTTuTTT4uTTTvT TTTTTTTTTvvTvvTvvTTuTTTuuuITT4 TTTvvTvvTTTTTTvTTTTTTTTTTTuTTu } # tile 177 (rip) { uuuu4Tuuuu4uu4Tuuuuuuuuuvvv4uT uuu44uuuuu44uu4uuuuuuuuu4v4vvT u4vvvuuuIuuuuuuuuuuuuuu4uuvv4u u444uuuuIIuuuuuuuuuuuuu444vvvu uuIIIu44IuuIuuIIuIIuIIuu4vv44u IIuuIIIIuIIuIIuuIIuuIIIIII44uu IIuIIIIIuIIIIIuIIIIuIIIuII4uuu IIIIIIIIIIIIIIuuIIIIIIIuuI4uIu IIIIIIIIIIIIIIIII4uIIIIIIIuIIv IIIIIIIIIIIuIIIIIuIIIIIIIIu4vv IIIIIIIIII44uIIIIIIIIIIIIIIu48 IIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIuIIIIIIIIII IIIIIIIIIIIIIIIIIIu4IIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIII uuu4uIIIIIIuIIIIIIIIIIIIIIIIII vvvvvIIIIII4vIIIIIIIIIIIIIIIII vvTvv4444uIIIIIIIIIIIIIIIIIIII vvTTvvvTv4uu4uIIIIIIIIIIIIIIII vTuuTvvT4vvv4vIIIIIIIIIIIIIIII uuTT4TT47vT4v474uuuIsIIIIIIIII 4TTv4vvvvvvv44vvv44IIIuIIIIIII TTTT44TTvvvv4uvvvvvvv4uIIIIIII vv4vTu4vvvTvvT4v4vvv74u44vvv4I vvTvTT44vTv44Tu4vv4vvvvvvv4vvu 44TT4Tv4Tv4u44uTTvv44v74vvvvvv TTuuu44uuuuv4vvv44v4u44vvv4v4v } # tile 178 (rip) { u4T444TTuuuuuT4Teu4vvTv4vTeTuv TuuuuuuuuuuuuuuTTuTT4vTv4ueeu4 uuuuuuuuuu4vvT4vvv4uuuuuuuuuuu uuuuuuuuuu44vT4444uuu44uuuuuuT uuuuuuuuuuuuu4uuuuuu4vvuuuuuuT uuIuuIIIuuu44uu4vvvvvvv4uuuuuu uuuuuuuuuuu4uuu444444444uuuuuu uu4IIuuuuuIuuuuuuuuuuuu44uuuu4 uIIII4vvIIuIIIIIIIu44uuvvvuuIu IIIIIu4uIu4IIIIIuIIuu44444uIuu IIIIIIIIIu4IIIIuuIIIIu4IIIIuuu u4I4vIIIIIIIIIIu4IIIIII4uIIIIv uI4I4IIIIIIIIIIIuIIuIIIuIIIIIu IIIIIIIIIIIIIIIIIIv44IIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIuIIIIIIIIIIIIIIIIIu IIIIIIIIIII4uIIIIIIIIIIIIIIII4 IIIIIIIIIIIIIIIIIIIIIIIIIIIu4I IIIIIIIIIIIIIIuIIIIIIIIIIIII4I IIIIIIIIIIIIII4uIIIIIIIIIII4II IIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIII44IIIIIIIIIIIIIIII IIIIIIIIIIII4uIIIIIuIIIIIIIIII IIIIIIIIIIIIIIIIIIu4IIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIvuIIIII uuIIIIIIIIIIIIIIIIIII4I4IIIIII v4IIIIIIIIIIIIIIIIIIIIIIIIIIII uI74IIIIIIIIIIIIIIIIIIIIIIIIII } # tile 179 (rip) { TTTTTvTevvTe4T4ueTTTTTvevvTvvT 44TTTTv44uuee4uuuuTTTT44TTTvvT 44uuuuuuuuuTvvTTTTTTuuuuuuTv74 vv4uuuuu4uuvv4vvvTTTuuuTu4vvv4 vv4uu4444uuTTuv4vuuuuuuTvv7vTu uuuuuuuuuuuu44uuuuuu4uuu4v4vvv 4uuuuuuuuuuuuuuuu444v4uuu4vv4v 44uuuuuu44uuuuuuuvvvvv4uu4vv4v uIuuu4vvvuu444uuuuuuuuu444444u uuuuuvvv4uuu4v4uuuuuu44444u4uu 44uuI444uuuIuvvuIuuu4vvuuuuuuu vIIu4IIIIIIIuvvuu4uIuuIuuIuuIv IIIu4IIIII4uuuuI4vuIuuIIuuuu4v IIIu4IIIIuv4uIII44uI4uII44Iuv4 uvIIIIIIIIIIIII44IIIIII4444uI4 444IIIIIuII4IIIIuIIuIIu4pIIIIu 48IIIIII444v44IIIIv4444IIIIIII IIIIIIIIIIIIIIIIIIIIIIIIII4uII IIIIIuIIIIIII4IIIIIIIIIIIIuIII IIIIIvvIIIII444IIIIIIIIIIIIIII IIIIIIII4II44IIIIv4IIIIIIIIIII IIIIIIIIII4IIIII44IIIIIIIIIIII IIIIIIIIIIIIIII444II4IIIIIIIII IIIIIIu4IIIIIIIIIIIIIIIIIIIIII IIIIIu44IIIIIIIIIIIIIIIIIIIIII IIIIIvvIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIII444Iv4II IIIIIIIIIIIIIIIIIIIuIII4II44II IIIIIIIIIIIIIIIIIIu4IIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIu4IIII } # tile 180 (rip) { FDFDFFFVFVyyhyyyVVVVVyVVyVVFFF VVVVVVVyyhyyyyyVFFFVVyyhhhyhVV FFFFFVVFVFVFVFVVVVyVVyyyyVFFDD FFFFFFFFFVVFFFFFVVVVVVVyVVVFFF DDDDDDDDFFFFFDDDDFFFFFFFVVVFVF DDDDDDDDDDDFFVVFFDDDDDDDDDDDDD yyhVVVFFFDFFFFDFDFDDDDDDDDFFFF hhhhhhVFFFFFFDDDDVFDDDDDDFVFVV hhhyyVVFVVVFFVVFVFVFFFFhVhVhyV hhyyhVVFFFDFFFVFFFFFFFFVVVVVyV hhyyyVVFFFDDFVFFDDDDDDDFFFFVFV VVVVVFFFVFFDFFVVFFFFFFFVFVyVyV VVFDFFFFDFDFDFFFFFFVFVVyyhyhVh DFDDDDDDDDDDFDFFFFVVFVyhyyyyVV DDDDDDDDDDDDFFFVhhhhVVFFFFFFVF DDDDDFFFFFFFVVVVFVVFFFFFFFFFFD DDDDFFFVFVVhhVVFFDDDDDDDDDDDDD VVVhVVVyVyVFFFDDDDFDDDDDDDDDDD VVVVVVFVVVVFFDDDFFFFFFFFDDDDDD FFFFDFFFDFDDDDFFFVVVFVFFFDDDDD DDDDDDDDDDDFFFVVVVVVhFVFFFFFVF DDDDDDDDDDDFDFVFFFVFVFFFFVFVhV DDDDDDDDDDDDDDFVFFFFFFFFFVVFFF DDDDDDDDDDDFFDDDDDFDDDDDDDDFFF DDDDDDDDDDDFDDDDDDDDDDDDDDDDDD DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD DDDDDDDDDDDDDDDDDDDDDDDDDFFVhV DDDDDDDDDDDDDDDDDDDFFFFFFFVFFF DDDDDDDDDDDDDDDDDDFFFFVFFFVFDD DDDDDDDDDDDDDDDDDFFFFFDDDDDDDD } # tile 181 (rip) { FFFDDDDDDFFFVVVVyyyVVFVVyhhyVV VVFFFFDFFFVVVhyyyyVVVVyhhhhhhh FFyhyVhVhVVFFVyhhVyyVyyyyyyyVy FVVFVVFVFVVVVFFVyVVyVyyyyVVVyy VFDDDDDDDFFVVFFVFhyyVhyyyVyyyy DDDDDDDDDDFFFVVVyyhhhhhhhhhyyV VVVFFDDDDDDDFFDVVyVhyyyyyyVVyV hVhVFDDDDDDDDDDFVFVFFFFFFFFFFV FVFDDDDDDDDDDDDDDDDDDDDDDDDDDD FFFFFFFFFFFDDDDDDDDDDDDDDDDDDD VVVVhFVVFVFDDDDDDDDDDDDDDDDDDD VhhhhhhhFFDFFFFFDDDDDDDDDDDDDD hhyVhVVVFFFFFFFDDDFDDDFFFFFDDD yVVFDFFFFVFVFDDDFFVFDFFFFFFFDD DDDDDDDDDDDDFFDVhVhhVFVVFFDFDD DDDDDDDDDDDDDFFDFFFFFFFDFFDFFD DDDDDDDDDDDFFFDDDDDDDDDDDDFFFD DDDDDDDDDDDDFFFVVVFFFFDFFVFFDD DDFDDFFFFFFDFFFFDFFFDDDFDFFDFF DFFFDVFFhVFVFFDDDDDDDDDDDDDFFF VVhFVhFVFDDDDDDDFFFFFFFFFVFVVV hFFVDFFFDDDDDFFFFFVVFFFFVFhVVF VFFFDDDDDDFDFFFVVVVVVVVVVFVFVF DDDDDFFVVFhhhFhFVFVhFhVFVVVVFV DDFFVhVhVhFFVFFVVhVVVVVVFFDFFF DFFVhVhVVFVVFFFFFFFFVVhFFDDDDD VhVVVVFDDDDFFDDDDFDDDFFVFDDDDD FFFFFFFFDDDDDDDDDDDDDFFDFDDDDD DDDDDFFVDDDDDDDDDDDDFFDDDDDDDD DDFVFFhVVFFFFDDDDDDDDDDDDDDDDD } # tile 182 (rip) { hyhVVVVVFVVVVVFVVhVhhhhhhhhyyy hyyVVVVyyyyhhhVhhVyVyhRhhhhyyh VFVyVyyhVhVhyhyyhhyhyyyyhyhhhh hVhyhyyyVVVVyyyVyVVVVVyVVVVyyy hhhhhyyVyVVVFVFVFFFFFVFFDDFFFV yyyyVVVVVFFFDDDDDDDDDFFDDDDDDD VyyVVVVFFFFDDDDDDDDFFFFDDDDDDD VFFFFFFFFDDDDDDDDDFFVVFDDDDDDD FFFFFDDDDDDDDDDDDFDDDDDDDDDFVh DFFFFDDDFFFDDDDDDFDDDDDFVVFhyy DDDDDDFFFFDDDDDDDDDDDDDVVhhhhy DDDDDDDDDDDDDDDDDDDDDFFVVyyhyy DDDDDDDDDDDDDDDDDDDDDFVVFVFFFV DDDDDDDDDDDDDDDDDDDDDFFFVFDFFF FFDDDDFFDDDDDDDDDDDDFFVVVVFVFy DDFDDDDFDFFDDDDDDFFFFVVVVyhyyh DDFFDDFFVFFDDDDDDFFFVhhVyyyyhh DFFFFFFFVVVFFFFFFFFhFFFFVyhyhy FFFFVVVVFFFhFhFhFhFFFFFFFVVVyy VVVVFhVhVhhFhFFFFFVFDDDFFVFVVV hVhFFVVVFFFFFDDDDDFFFFFFFVFVVy VVFVFVFVFFFFDDDFFFFFFFFFFFFVVV FFFFFFFFFFFFFDFFVFFFDDDDDDFFDF FDDFFFFFVVVVVFVVVDDDDDDDDDDDDD DDDDFFFVFVFFFFFDFDDDDDDDDDDDDF DDDDDDDFFFVFFDDDDFFDDDDDDDDDDF DDDDDDDDDFFFVVVVVVFFDDDDDDDDDF DDDDDFFFFFVhFhVhFFFFDDDDDDDDFF DDDDFFVhVhhVhFFFFDDDDDDDDDDFFF FFFVFhVVVFFFFFDFFFFDDDDDDDDDDD } # tile 183 (rip) { yVhyhVFFFFFFFVFFFVVFFDDFDDDFVV yVVVVhVVVFFFDDFFDDDDDDDDDDDFVF hhyyyyyVFDDDDDDDDDDDDDDDDDFFVy hhyVFVVVVVFFFDDDDDDDDDDFFFVVyy VVFFFVVVhyhyVFDFFFDDFFDVFVVVyh DFFFVFVyhhhyVFVVhVVhVhhhVhyhyy DDDFFVVyyhhhyhyhhhhhhhyVhVVVVV DFDFFVFVyyhhhyyVhhhhyVyVVFVVVV yhhhVyVyVVVFFFVVFFFFFDFFFDDFFV hhhhyVyVVyVVVVVVFFFDDDDFVFVyyh yVyyyVVyVVVVVVVVFVDDDFVhyhhhhy VyVFVFVVVVhyhyyhhhhyVhyhhhhhyF FVFVyVhyyyhhhhhhhhhhhhhhhhyVVF VVFyyhhhhhhhRhRRRRRRRRhhhhVFFD yhhhhhhhhhhhRRRRRRRRRhyhyVFFDD hhhhhRhhRhhhRRRRRRhhhyyVVFFDFF hhhhhhhhhRhRhhhhhhhyyyyVFFDDFF hhyyyyyyyyyyhhyhyyyyVyVFFVFVVF yyyyVVVVVVVVyyyyyyyyyyVVVVVFFF yyyyVFDFDFFFFVVyyhhhhhyyyVVVFh VVVFFDDDDFFVVyhhhhhhhhhhhhhhhh VVFFDFFFFyyyhhhhhhhhRhRhhhhhRR DFFFDVFVyhhhRRhRhhhRhRRRRhhhhh FFFVyyyyyhhRhhhyhhRRRhRhRhyhyy FFVVyyhhyyhhhhyyyhhhhhhhhhyyyy VVyVyyyyhyyyyyyyhyyyyyhhhyyyFy FFVyhyyyyyyyyhyyyyyyyyyyVVyVFF VVVVVVyVyVyyyyyyVFFVFFVFFFFFDD FVVFFFFFFVVFVFFFDDDDDDDDDDDDDD DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD } # tile 184 (rip) { VVyVhhhhVVFVVVFVhhhhhhhhhyhyyy VVyVyyyhFFVVVhyhVhhhhhhhhhhhhh yyyVVFVVFFFFFVhyhhhhhhhhyhyhhh yyyhyyyyhVyVVVhhRhhhhhyhhyyyyV VhyhhhhhhhyhhyhhhhhyhyyyyyVVVV VVVVVVVVyyhhhhhhRyyyyyVVFDDDFV VVVVVyyyhhhhhhyhhyVVVVVFFDDDDF FVFFFyyhhyyyyyVVVVVVVFFFFDDDDD yVFDFFyyyyyVVVDFFVFFVFDDDDDDDD FFDDDVVyyyVVVFFFVVVVVFFDDDDDFF FDDDDFVFVFVVVVFVVVVVVVFFVFFFFh FDDDDFFFDFFFFVVyVyVVFFVVhhhhhh DDDDDFFFDDFVVVyVVVVFVVyhhhhyVy DDDDDDDFDFVVVyyyVVFFFyyyyhVFFF DDDDDDFFVVyVyyyyyVFDDFFFDDDFFV DDDDDDFFVVFVFVVyyVFFDDDDDFFFyV FDDDDDFFVFDFVVVVFVVVVFDDFFhyhy FFDDDDDDFFFVVVVVVVVVVFVVyyhhhh VFFFFFFFVVyyyVyFFVyyyyyhhhhhRR VhhVVFVVyyhyyyVVyVyyyhhhRRhRRR hhhhhhyhVFVVVFVVVFVyyyhhRRRRRR hhhyyVyVFFFFFFFFFFVVVyyhhRRRRh hyyyVVFFFDDDDDDDFFFVVVyhhRhRhR yVyyyVFFDDDDDDDDDFFFyhhRRRRRRR VVVFFFFDDDDDDDDDFFVyyhRRRRRRRR VVFFFFFDDDDDFFFFVyhhhhRRRRRRRR DDDDDDDFFFVhVhhhhhhhhhRRRRRRRR DDDDDFFhVhyyhhhhhhRhhRRRRRRRRR DDDDDFVhhhhhhhhRhyhhhhRhRRRRRh DDFFFFVFVVyyyyyhhhhhyhyyhyhyyy } # tile 185 (rip) { yyVVyVFFFFVVhFVFFFVVVVVyyyyyyV hhhhVVFFVVhVVhVhhVhyyyyhhhhhhy hhyVVFFVFFFDDFVyVhhhhhhhhhhhhh yVVVVFFFFFFDDVVhyyhhhhyyyyyyyh FFFVVVFFFVFDFhVhVyyhhyVVVyyVyy VFFFFVFDDFFFFFVyhhhyVyyVVVyyyy DDDFFVFFFVVVVVVhhhVVFFFFFVVVyh DDDFVyyyyyyhVhyyhVyFFDDDFFVVVh FVVVyhhhyyVyyyVVFFDFVVVhyhhVVV VVyVyVyVyyVhVhVVFDDDFhVVyyyVFF hhFVhVVyyVVVVVFFDDDFVFFFVVVVVV hyyyhyyVVFFDDDDDDFVVhyVVVVyVVF VhyhhhyhyVVFFFFFFVVVVVFFVFVVVF VyyyhhyyhhyVVFVyVhyVVFFFFFFFDD VVhhhhhhhyyhVVFDFVVFFFDDDDDDDF FVFVVyyyyhyyyFDFFVVVFFFDDFFFFV VVFFVFVyVhyVFFDFVFVFVFVDFFVVFV hhhyyyVVVFFVFDDDDFFFVFVFVVVVVV hhhhyyhyhVVFFDDDDDDFFVFyVVVVFF RhhhyhhhyFFFFDDDDDDDFVVyVhVhyy RRhhhyVFFFDDFFFhFFVFVFyyhyyhhh RhhyhyyFFDDDDFVFFyVhyhyhyyyhhh hhyyyyyVFFDDDDFFFyyyhhhhhhhhhh RhRhyyFVVFFFFFVVhyhyyyhhRRhhhh RRhhyyyyyyVVVVyVyyhhhhhhRRRhhy RRhyyhhhhhyhhhVyVyhhhRRRRRRRhy RRRRRhRRhhyVVVyhhhRRRRRRRRRRRh RRhhRRhhhyVVyyhRRRRRRRRRRRRRhh RhhhhhhyyyVyyhRRRRhRRhhRhRhhhh yyyyyyyyVyVyyhhhhRhRhRhhhhyhyy } # tile 186 (rip) { VyyVVFFFDFVVFFVVyVVVyyVyyyVVVF yhyVVVVFDFyyyyyyyyVVVVFVVVVVVy yyyyVVFDDDDFVFVFFFVFFFDFVVVyhh yyyyyVVVVVFDFFFFFVVFVVFVVyyhhR hhhyyhhRhhyVVVFVyyVVyyyyyhhhhh hhRRRRRhRRRhhhhhyhVVyyhyyyhyhh hhRhRRRRRRRRRRhhhhhyVyyyyVyyyy hyhRRRRRRRRRRRRRRRhhyVyhyVFVFF VyyyyhhyhhRRRRhhhhhhhhhhyVVVVV VVVVVVVyyyhhhRhhhhhhhRRhhyVFVF VFFDDFFVFFVVyyyyyyyhhhRRhhFVFD FDDDDFVVVFFDFVVVVVVyyhhhhhyVFD DFVVFVVVVVVFDFFFFFVVVyyVyVVVFD FVyyVVVVVVVVVVFFFFFVFFDFDDDFDD VVVVVVVVVVVVFVVVVVVFVDDDDDDFFF VyyyyVVVVyyyyyyVyyyVVFDDDDDFFy VyyyyhyhhhhhhhyhhhhhyVVVFDFVyh VVVyyyyyhyyyhhhhhhhhyhhhyVVVyy FFFVFVVVVVVVyhhhhhyyyhhhyyhyyh VVFFVFFDFFVVyVyyyVyyyyVyyhhhyh yVVVyVVVFVVVFFFVVVyVVVyyhhRhhh hhhyyhyVVyVVFDFFVVVyyyyhhhRRhh hhhyyyyVyVVVDDFFVVVyhhhhhhRhhy yyyhyVVyVVVVFDFFFFVyyyyyyhyhhy yhyyyVyVVFVVVVVVFFVVyyhyyyyyyV hhyyhVVyVyVyVVyVVVyyyhhyyyyyVV hhyyyVyVVVyyyVyyhhhhhhhhhhyVVy yyyyyyVVyVyhyVyyhhhhhhhRhhyyVV yyyVVVVyVVVyyyyyyyyyyhhhRhyyFF yyVVVVVVVyVyVVVyyyVyyyhyyyVVFD } # tile 187 (rip) { VFVFFFyhhhRhyyVVVVVyhhhhhhhyyV yyyVVDFyhhhhyFDFVyhhyhhhhhhyyh hhhhyVVyhyhhhhVVhyhhhhyhyhhyVy RRhhhhhyyyyhhhhhhhhhhhhhhyyyyh hRRRRRhhyyhhhhRhhhRRhRRhyyyhhh yyhhhhhhhhhyhhhhyhhRRhhhhhhyyV yyyhhhhhyhhhhhhhhhhhhyyyyyyyhy VyyhyyyhhhhyhhRRhhhhhyyVVVVyhh yyVyyhhhRhhhhhRhhyVyhhhhyhyVFy VVVyyhhhRRRhhhRhyVVyyhhhyVVFFV DFVyhhyRRRRRRRRhyFVVVyhhVFVFDV FVVyyyhhRRRRRRhyyyyyhyyyVFVVFD DFVyyyhhRRRRRRRhyyyyhyyyyVVVFD DDVyyhhRRRRRRhyyVVVyyhhhhhhVFF FFVVVyhRRRRRRhyVFVVyyhhhhhhVVV yVVVFyhRRRRRhyVVVVyyhhyyyyyVFV yyyyyyyyRRRRhhyVVyyhhyyVFFFFVF yyhyyVyhRRRhyyyVyVVVVVyyVFFFFV yyyyyVVyyhyyyyVVVyVyFFFVVVVyyh hyhyVVFVVVVVVVVVyVyyVFDVVyhhhh hhhyyVVFVVFFVVyyyyyyyyyyhhhhhR hhyyVVVVyyyyyhhhhhhhhhhhhhhhhh yyVVFFyyhhRRRRhhhRRRhhhhhhhyhh VVFFDFFVyhhhRRRRRRhhyyyyyyyhyh FFVFFVVVVyyyhRRRRhhyyVVVFVVyyy VVVyVyVFFFVyyhRhhyyVVVFFFFVFVV yVyVVyVFFVVyyyhRhyyyVFDDDDFVVV yyVyyVVVyVyVyhhyyyyyyVFFFFVVVV VVyyyyhhyyVVyhyyyyhyyVVVVVVVVV FVVyhhhhhhyhyVyyhyyyVyyyyhhyyy } # tile 188 (rip) { VFFVVVhhyVVVVFVyhhyyyyyyhhyhhh VhyyyVhRhhhRVFVhhhhyFVyyhRyyhh yyVhhyyhhRhyyhhhRRhhhhhhyhyyhh yyyyyyyyyyyyyyyyhhhhhhhhhyyyyy hhhyyhyVyyyyVVVVVhyyyyhyyVyVFD yhhhhhhyyyyyVVyyVyyyyVVyyyFFDD yVhhyyVyVVVyheyVhhhyhyyyyyyVVF yFhhyVhVVFVVReyyyRhhhhhhhhhhhh yhhhhhhVDDFVFyVyhyyyVyyyhRhRRe yyhhyyyVVVVVyVyhhyVVyVyhhhhhye FVyyVFVhVhVyVhhhhyyyyyyhhhhhhy VhhhyhyVyyVVVVhyyyyhyyhhhRRRRh FVVVyhhyFVyVhhyyVVVyyyhhhRRRhh DDVVyhhhVVhhhRyyVDFyyyhhhRhhhh VVhhRRRRhhhhhhhVFDFFhhhyVyyyhh VyhhRRRRRRRhhhhyVFFVyyVVFFVyyy VhhhRRRRRRRRRRhhVVFVVyVVFDFVyy VyhRRRRRRRRRRRhyyVFDFFVVVFFFFV yhhRRRRRRRRRRRhyVFFFVVFFVVFFVF hhRRRRRRRRRhhhhVFFFFVVVFVyVVVV RhhhRhRRRRhyyVVFDDDDVVyhyVFVyy RRhhRRRRRhyyVVyyFVVVVyhhhyVVyh hRRRRhhRhhhhyyyyyhhhyyhhhhhyyh hhhRhhhhhhyhhyVVhhhRhhhhhhVVyy yyyyyyyyhhyyyyyyhhRRhhhhhyyVVy VyVVVVVVyhhyyhhhhRRRRRRhhhhyFh yVVFDDDFVyhhhhRRRhRRhRRRhRhRhh VVVVFVFFyyhhRRRhRERRERRhRRRRRR yVVVyhyVyyhRRRRRREGREEhRRRRRRR hyVyhyyyhhhhRRhGERRRRRREGRRRRR } # tile 189 (rip) { hhyyVFFVehheyyVhhhyVehhyhehhhh hRhhyFFVeRVVyhRRRhyyFyyReRRhhR hhRRReRyVVVVyhhyhhhhyVyRhRRhRR yyhyhRhhhhhhhRRRhhhhyyyhRRGGER DFyyVyhhRRRRhhGGhRRyhhhhhRRcER DDFFVyyhhhhhhhRRRGGRGGhhhRRRRR FFVVVVyyhhhhhhhhRRRRRRRhhRhhhR yyyVVVyyhhRhhhhhRRRhhRRhhhhRRR RhhyVyyyyyhRhhRhhhhhyyyRhhyVyh hyyhhhhhhhhhhhhhhhyhyyyhRhhyyh VyyhRRhRRRRhyyhhhhhhyVyhhRRhyh RRRRRRRRRRRhhyyyyyyhyyyhhhyhhh hhhhhhRRRRRRhhyyhhhhhyyhhyVVyy hhhhhyhRRRRhRhyyhRhyhhhhyyFFVV hhhyyyyyyyhyyyyyyyhhyyhhyVFVyV yyhyyyyyhhhyyyVVVVVyhhhhhyyVyy yyyVyVyhRRRhhhVFFVVyRhhhhhhyyh VVVVVVVyhhhhhhyyyyVyhhRRhRRhhh VFFVVVVyyRRhhyVVyVyhhhhhRRRRhh yVVVyyyyyhRhyVVFFFyhyhhhhRRRRh yyyyhyFVyyyyyyVyVFVyhhhhhhhhhR hhyyhyVVyyyhyyyyyVVVyhhhhhhhhh hyVyhhyyyyhhhhyyyyVVVyyyyhhhhh yhVyhhhhhhhhhhhyhhhVyyyyyyyyhh yyVVVyhhhhhyhhhhyVVVyVVyyhhhhh hyFFDVyhyyhhhhhyVVFFVVVVyhhRRR hhyVFFVyyhhhyyyyVFDDDFVFVVyhhh hhhyVVVyhhRhhyyyVVVVVVVFDFFVyy RRhhhVVyyhRhhhhyVyyhhhyVFDDFFy RRhhyyyyyyyhyhhhhyhRRhhyyVVFDD } # tile 190 (rip) { RRRRRRRhhheyyhRRhRRRRehhhRehhR RRhhhRRhRhyyyhhhheRRhGGhVVeRhG RRRRRRRGRRhhhRGRRhyhhhhRRRGGRG hhhRRRRGRhyhhRRhhhhRhhhRRhhRhR hhhhRRRRRhhhhhhhhRReRRRGRhhRRR hhhhyyyRhhhhyyhRRhhhRRRRRRRGRR RhyyhRhhhhhRhyRRRRRhRRhhRRhRGR RRyyhGGhRhheeyhhhGGRRhhheRhyyR hhhyyVVhhhRhyVVyyhyhRRhyhhhhRh hyyyyVyhhRRhRRyyhyyhhhRhhyhhhR yyyyhhhhRRRhGGRhhyhyyReRhhhhhG hhhhhRGGRRRRhhhhhyhRhhhhhRGGRR yhhRhhRRRRRRRhhhhyyhGhyhhhRRhh yyhRhhRRRRRRRRRhyyyyeRyhhhhhhh yhVyyhhhRRRRRhhyFhyyyVVhyhRhhh hhhyyyhhhhhhhyyyVhyyyyVhhhRhhh hhRhhhhRhyyhhhFeeyVyhhhhyhhhhR yyyhRhyhRRhyyhyyyyhhhhyRhyyyhh yhyhhhyyhhhhhyhyVhhyhhRGhhhhhh hRhhyyyyyyhRhhhyyhyyhhhGRRGGRh hhyhhyyVyyyyhhRRhhhhhyyhRhhhRR hhhhyhhhhhyyyhhRhhhhhhhhhRhRRR hRhyyhhhhhhhyyyhhyhRRRRRRRRRRR hRhhyyVFDVyhhhyyyhhhhhRRRRRRRR RRhhhyyVVVyhhhyyVyyhhRRRRRRRRR hRhRRRhhhyyhhhhhVFVyhhRRRRRRRR hhRRRRRRhhhhyhhhyyVVVyhhhRhRRR hhhRRRRRhhhhhyhhyhyyyhhhhhhhRR yhRRRRRRRhhhyyyyyhhhRhhhhhRRRR FyRRRRRRhyhhyyyVFVVyhhyyyyhRRR } # tile 191 (rip) { ReRRGTGTT4v4vTvTTvTvTvTTTvv4uT GheRhGGGTTTuTT44u4vTTvvTTTTTuT RhyhhRRRGGRGTu4vTvvT4uuTvvTT4T GRhhRhRRGRGheTTTvvvvTu4Tvvvvvv GGRReRReRRGhRGGGevvvTvvTvv7vTv hhRhhGGyRRhRGGhhRGTvvvvvvT4TTu RRhhhRhhRGRRRhRRRRRvTTv44TuuT4 RGhhRRhheGRRhRGGRyeeGGTTuuuuuv hhhhhGRRhhRyRGhRRRehRGGRGev444 hyhhRGRRRRhhyeRRRReRhhRRGGGGTv RyhRRRhhGGRhhhGGhhRehhheeGhReT hyeRRRGGRhyGRRhhRRRRGTRyyhGRRG hRRhhhRRRRGGhRRRRRhRGGRhRGReRR hRRRhhhhhGRRRRRRGRRRRhRRGGyeey hRRRGhhRhyyyRGRhhhRRRRRGRRRhRR hhhhGhRRhhyyhRhhyhRRRRRGRRRRRT hhyyyRRRRhhhhyyhhhhhhGGRRRGRRG hRGRRGRhhRhGehyyheRRhRRRRGRhhR hhRRRGRhhhRRhyhhhRhhhhRRGGGRRR hyhhhhRhhhhhhhRhhyyhyyhGRRGRRR hyyyyyhRRGVyyhhhyyeeyyyhhRRRRR hyyyhyhheyhRhhhyhVVRyyhRRhhRhG RRhhRhhhyhRGeyhhhyVFhhRGRRRhyy GGhyyhRRRRRRRRRhhRehhRRRhyhhhR RRRhyRRRRRRRRRRRhehhRRRRRhRhhe RRRRhRGGRGGRRRGGRRRRRRRRRRRRhR RRhhhhRRRRRRRRRRRRRGRhyRRhRRGR RRhhhRRRRRRRRRRRRRRGRhyehhRRRR RRRhhRRRRRRRRRRRRhhRRRRhhhhhhh RRRRRRRRRRRRRRRRRRRRRhRhhhyhyh } # tile 192 (rip) { TuTTvTTTTTTTTTTTTuTTTTTTTTTTTT TTTvvTTTTTTuuTTTTuTTTTTTTTTTTu TTvTTTTu4TTTTuuTTTTTTTTuuuTTTT vTvvvTTuvTT4T4uTTvTTvTTTTTTTTu 44TTvTT4TTTvvTvvTvvTvTTTTTuTTu uu4vTuuu4v44TTTvvTTvTTTvvTTv4T uT4vTTuuuuuuuTTvvT4TvvvvvTTT4T vTvvvTTuuuuuuuTv4uTTvv4v44TTuT 44u444vvTTTuuuuuuu4vvvTvTTv4uT v444vvvvvvvuuTuuuuu44TT44Tvv4v Tvvvv4vv7vvuTTuuuuuuuuuu44Tvvv GTv4v4uu4vvuuuTvvTTu444vvvvv4v RGGTTTTu4v4444T44Tu4444vvvvvvv hhGGGGT4vuuvvvuuuuu44444v7vv4v ehGGRGGGeTu44uuuuuuuu44u44vv74 RhhGRhGGGGTv44uuuuuuuu4uuu4vvv GRRRGhhGGGGTvvuuuu44u44uuuuu4v RRRehhGGRhReeGuu4vvvu4vv4uu44u hhRhhGRGRRheRGeTT444444vv4uuuu hyhhhGRRGGhReRGGGTuv4uuvvvuuuu GyeRhRhhhGGRhGGGheeGIIuIIIuuuI hhRhhRhhRhGhGGGhGRGeTuuIIuuuuu hhhhheRRhRRRRGhRGhRGGGu4uuIuuv eyyhhReRhhRGGRhhhGGhheGGT4444v hyehyRhGRRRRRRRRhRRGRRReeGev44 hyeRhRhRGGhyhRGGRRGGGRheRyGTvI hhyhhyhRRRRhGRyyRRGRRhhGhhGGev hhhhhhRRhhRhRGRhRRRRRhhGGhGGee hhRRRRRGyRRhhRGGhhhRRehGRRGhhR RGhRRRhhRRRRRGRhheRRRRhRGGRGGR } # tile 193 (rip) { TTTTTTTTTTTTTTTTTTTTTTTTTTTTTT TTTTTTTTTTTTv4TTTTTTTTTTTTuTTu TuTTuTTTuuuTTTTTuTTTTTTuTTTeeT TeT4uTTTuuTTTTTuTTTTTTTTuTeeTT ee44uTTTuTTTTTTTTuTTTTTTTueeuu TTTTTTTuTTTu44uTTTTuuTTuTTTvTT vvvTTTTTTTT4uTuuTTTTuTuuuTvvTT v77vTTTTTTTvTeuTTTTTTT4uuuTTuT TuTT4444uuu4vvTT4u4vTTTTTu4TTT uT4TvvvTuuuu4T4Tv444TTvTTuuuTT TT4TT4vTuuuuTT4TT4uuu44Tv4uuuT v4uuuu4vTTuTvvTv4uTT4vT444eT4T 4uuuuu44T44Tv4vvvv4v4TTv4veu4v 4uuuu4444444vvvvv7vv444vvvuuu4 uuuu44vvvvTvvvTv7vvT4uu44vvv44 4uu444v4vTvvv4TvvvvT4uu44u4444 4u4uu4vvvvv444vv44444uu44uuuu4 44uuuu44v4vuu4v4uu4vv4uvvv4uuu u4uuuuu444444uuuuuu44uuv4vv444 uvv44uuuuuuv4uuuuuuuuuu444vv44 uvv4u44uIu44uuuuu444vvvuuuuuuu u4v4uuuuu4vvv4uuuu4vv4v4uuuuuu uI4uIIuu444vvvIIuIu4444v4uIIuI 4IIuuuu4v4uIu4v4u444IIIuuI44uu uuuIuuuuv4uuuu4uuuuIIIuIuIuuuu u4uIIIII4uIuuIuuIIIIIuuIIuIIIu III4uIu4Iuv4uIIIIIuuvv4uu4Iu4I T4v44IIuIu444u4uuIIuv44444uuuu GGvvv4III44pp4vv4III444444IuI4 GGeGev44Iv4vI44444v444vII4II4I } # tile 194 (rip) { TTTTTTTTTTTuTTTvvTTTTTTTTTTTTv TTTTTTTuTTTuTTTvvTTTuTTTTueTTv TTuTTTTTTvvTTTTGTvvTTTTTTTTTTT TeTTTTTTTTvTTTTeGvvTTTTTTTTTTv TeTTTTTTTTTTTTTTTTTTTTTTTTTTTv TuTvvTv77vTuuuu4vTTuu44TvvTTuT TuTvvTTvvTTTTTuuTTuTuuTTvvTTTT TuTTuTTTTTTTTTuTTuTTuTTTTvTTTu TuuTT4TTuuu44uTT444TTvvuTTvvvu TuuuTTvvuuT4uuTu4vTTTTvuuTu4v4 T4uuuTv4uTTv4uuuuTTIuuTuuuuTT4 TuuTTuuuTTuTvTeuuTv4TT44TT4TT4 uuuTuuu4Tu4T4ueT4vvvT444Tuv4vv 4uuuuu44uu44uuuu4444uu44uuvvvv uu44uuuuuuuuuuuuu44uuuu4uu4v4v 4u4uuuTT4uuuu4TT4uuuu44444u4vv uuuuu4TTv4uuu4T4vuuu4vvuu4uu44 uuuuuu44vv4uuu44uv4uuuuuuuuuu4 uuuuuuu444uuuuv4u4uuuuu4uu4uuu uuuuuuuuuuuuuuvv4uuu4uu4uuv4uu uuvvvuuu44uuuuu4v4uuuuuu44uuuu uuu4v4uuuuuuuuuu4444uuuu44444u IuIu4v4uIuuIIuuuu4v4uuuuu444vu uuuuuIIIuIIuuI4uIv4IIu4IuuIIIu uu4uuuuuuuIuuuuIIv4uIu4uuuuIIu uI4444uuuIIu44IIIv4uIuu4uI4uIu u4IIIIIIIII4uI4v4vuIvuIIIIIIII 444IIIIuII4uIIuuuuuu44uIIuuuuu 44v4IIuuI4vIIIIIIIu4IvvIuu4444 v4v4IIIIII44uIIu4IIII4vv4IIIII } # tile 195 (rip) { TGvvTTTTTTTTTTTTTvTTTTvTTTvTTT GGTvTTTTTTTTTuTTT4vTTv4TTu4TT4 vvTTTTTTvvTuTTu4vTTT4TTTTT4vTT TvTTvTTvvvvTTvTu4TTTvTTvvTTTTT vTTvvTvvTv7GTvTTuTvvTTTv4uTTT4 TTvvTvvTTTTTvTTTuTv4TvvTTuu44T TTvvTvvTTTvvTTuuuTTuTvvTuT44TT TTuTTTTuTvvTT4uuuTTuuTTuTTvvT4 4vTTuTv4vv4TT4uTTu4vTT4vvTuu44 4vTu4vTvvvTuTv44TTv4v4u4Tv44T4 TTu4v4vT4vTuTT444Tvvvuuu4vvvTv vTvvTv4uv4u44uuuuu44TTu4v4vvvv Tv4uT44u4uuuuuuuuu4vTuuvv4vvvv vvuuuvv4uuuuuuuuuu44v4u4uu4uuv 4vu4vv4uuuu4vvv44u4vvvvv4u44uu v4uu4vvuuu4444vvv4444v4vv44uuu 44uuuvv4u4vuuuvv744uu4vvvvv4uu v4uuuu44uuuvvv4v4vv4uuuuuuvv4v 4uuuuuuuuu4444vvvvvvuuuuIu44uv uuuuuuuuu4vuuuv444v4IuuIuu4uIv uIu4vuu4vv44vv44444vv4uuuuIuu4 uuu4uuuuu44uI4v444uu4v4I4uIuuu u44uIuuIIu4IIIv44IuI4v4444IuuI uI444v4uuuIuuuuu4Iu4III4vv4uI4 444uuuuuuIIuuu4uIIIuIIuIu4uuu4 v74uIIIIuuIIIIv4IIIIIu4IIIIu4I IIIvv44444vv4844I4uIIIIv4IIIII IIII4444II4v444vvvvIuII4IIIIuI uI4uIIv4III4v4Ivvv48uI4IIIIvv4 II4uIIII4IIIIIIIIv4444I4uI4I84 } # tile 196 (rip) { TTvvvTvvTTvTTvTTTTvTTvvvvv4TT4 vTvvvTT4TTvTvvTTT4444vvv4v4TTv v4TTTTTT4vTvTTvv4vvTvvTTvvTv4T vTTTvvvvuTTvvTvv4TvT4vTTvvTvvT vTTvvv44uTTv44Tv4TT4v44444vvvv vvvuuTvvTvv4vTvv44vTvvT4vvvv47 4vv44TvTvv4TTv4v4vvT4Tvvvv44vv 44TvvvvTv4vTv4vv4444vvvvTT444T TT4v4uuuvvvvvvvvvvv4v4v4vvvvvv uTvvvuuuv4vvvvvvvvT4vvvv44v4vv uuvvTuuu44444vv7vTTuvv74v4vvv7 vv4v4uuuuuuvvvv4vv44vv4vvvv4v4 4vvv4444444v4vvvvvv444vv4vvv44 vv4v4444vvv4vvv4v4v4uu4vvvv4u4 44u44uuuv4v44vvvvvuuv4uv4vu4v4 4v444uuu44444u44v444v4u4vvvvvv 4vvv4uuuuuu4uuu4v44vv4Iuuv7v4v vv4vvvvvuu4Iu4444IIIvv4III444v 4uvv444v4v4Iuv44uuIIuvvuuu444v 4I4v4444vv4I4v4Iu4uIuu444vvv44 v4Iuu4IIu444vv44Ivv44IIIv444vI 4vuIu4uI4IIIu4v4II4v4I4vIIv4vv u44uI4uI4vIIII444I4v4v444I4484 4II44444Iu4444IuIIIIIIIIII8v4p IIIv444vIu4u44uIIIIII4IIIuII4I IIuII4vIIu4III4v4III8I4Iu4III4 u4IIII44v4IIIIIIIIu4IIIIIIIII4 IuIIIpII4I4I4III4IIuII4II4IpI4 IIIII4IIIII8III444III444v4II44 v44uI448vIIIIIIII8v4II8vIII448 } # tile 197 (rip) { uTuuuu4uuuu4vTvv444u4vvv4vvvvv 4uuuuu44uuuuTTvv4uuuvv4vvv4v47 vvTvvTTu4TTuuvv4u44vv4u4vvvuI4 vvvvv4Tu4vv4444u4vvv4uu4v4v4u4 vv7vvvv44v4vv4u4vv4vuuuvv44444 vv4vv4vvvvvvvvvvvvv4v44v4IuuIv vvvvvvv4v4v4vvvvv4v4vv4v4uuIu4 vv4v44vvvvvvvv444vv444vv4uuuu4 v4u4vv4v44uvvvuu4vvv4vvvv4vvvI vvvvvvvvvvuvv444vv4vv44v44v4v4 vvvvv44vvvuvv4vvvvvvvIIv44vvvv vvvvvv4uvvvvv4v4v4vvI44vv4vv4v vvuvvvuuu44v44v4uv44p44u4v44v4 44u4vv4uIuvv44vuIvv8444Iu48v78 44Iuvvvv4uIu4v4uIvvvuIIv4I4444 vv4I4444v4u444vvIvv44vv4u444v4 4vv44IuI4vvv4844474p44vI448v48 44v4IvuI44vI4v844I44p44I4vIIv4 444IIv4IpI4vvIv44I44Iv484vu444 44III4v4vII4uI4uI844p448484484 vvII448vvv8Iu44II4uI444v4v44vI vII44II44pvII4II44II4484v8I4v8 4IIv4III8444III444IIII4444I44I 44I4vII444I4vIIII484p4I844II8I 44IIv4pIIIIIIIIIIv4vp44v44II4I 88II8448IIIIIIpII84444v44III48 II44I44vvII44I4444vIv4I84484II 4I4uIII4v4u4II4444I4III44v4III 4IIIIIIIIv4III4vIIIIIIp44844I4 4v8448v4IIIII8IIvp44pII44III4I } # tile 198 (rip) { 4uvv44IIIIuIIIIIIIIIIIIIIIIIII vvvv47vI4v4IIIIIIIIIIIIIIIIIII vvv4Iv4v48p44IIIIIIIIIIIIIIIII vvvvv4vvv444vvIIIIIIIIIIIIIIII 4vvv4vvv7v48v44IIIIIIIIIIIIIII 4IuI4v4I444vII4pI4vIIIIIIIIIII 4uu4I4u44v4Iv4448v484IIIIIIIII uu44uIuv4v4I47vv44v44v4I4IIIII uuIu4IuuIv4844II4844p4p44v844I 44u4v4uI4pvIv4III4vIIvvv4vI444 vvvv74uIvpI4IIIIIv4II4484vpIpv vIII4v4844v44up4vIII4IIIv4II4v 4v44Ivv4444v4III4uIIvv48v44I44 v44vv844IIp4vIIII44I84v4444III v4444IvvI44Ivv8I44IIIII8II8v4I 44v4vv44p44Iv44pvII4II4444Ip4v II448448pvvIIv847I4v44v444pI84 II8v444vI48vv4v4vpv84v8II4444I IIv44v444I4Iv44v4p44v4444v4v4I 4I4v84484488v484v84v8v4vv484vv v4444p444II4v4II44v44v84484vv8 v484vI4v44IvvIIIv44p44Iv44844v v48v4p44v48v48Iv48v44IIvv8448v IIIII4v844pI4v844I484484444444 I4IIvv4444I8vv44vIIvv444II4v84 4v8I48v48vv4448v4pvv84v8II4444 444IIIIII44844IvvIII44I4vv84pv 44II4IIII4v444v444IIvvI44pIvv8 v8I448vv48Ivv8v484v8v4844I8v44 I44III44III4IIvvIv4444II4vI4v8 } # tile 199 (rip) { IIIIIIIIIIIIIIIIIIIIIIIIIuIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIu IIIIIIIIIIIIIIIIIIIIIIIIIIII44 IIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIu4I IIIIIIIIIIIIIIIIIIIIIIIIIIIuv4 IIIIIIIsIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIII 44IIIIIIIIIIIIIIIIIIIIIIIIIIII 4I4vI4uIIIIIIIIIIIIIIIIIIIIIII 4I4vv4vuIIuIIIIIIIIIIIIIIIIIII vv844p444v4IIIIIIIIIIIIIIIIIII I444p44p44474IIv4IIIIIIIIIIIII II4vI44II444IIpv44IIuIIIIIIIII 4I44p44II4vII4448v444uIIIIIIII I8II44II84vIpv4I4v484vIvuIIIII 4vI4Iv44444v44II8v444pIvIuIIvv v44IIvv44884v8II44vIIIpI44v4vv 48v4844844IIIIv48III44448444I4 IIv4p4vIvvvIIu4v44IIIvvII44pII 4I4484v8vv4p44Iv44pIIv7I448I4I uI8vv4vI444448vvIII84II84vI4vI 4I44vv48vv84444vpIIvvv4I44IIvI 444pIv4vppI4484vvpv48vp4I8III4 4vII8v48v44v484v8444444v444v84 pv4Iv44Iv44v4v44v4v4v4v44v44v4 8pI448IIIv48448v484v8448v48vv4 444444vv8v4III44vI44III4444vI4 } slashem-0.0.7E7F3/win/gl/gl_emul.c0000664000076400007640000003433010545462317014646 0ustar aliali/* Copyright (C) 2002 Andrew Apted */ /* NetHack may be freely redistributed. See license for details. */ /* * SDL/GL window port for NetHack & Slash'EM. * * Simple terminal emulation. Puts(), Putc(), Gotoxy(), etc etc. * Uses TileWindow for the output. NOTE that the write_y member of * TextWindow goes from the bottom up, i.e. 0 is the lowest line. * Also handles line input stuff (including extended commands). */ #include "hack.h" #if defined(GL_GRAPHICS) || defined(SDL_GRAPHICS) #define WINGL_INTERNAL #include "winGL.h" #include "func_tab.h" #include #include extern int NDECL(extcmd_via_menu); #define HEIGHT_ASKNAME 1 #define DEPTH_ASKNAME 8 #define MAX_NAME_LEN 20 #define MAX_EXT_CMD_LEN 20 void sdlgl_emul_startup(void) { /* does nothing */ } void sdlgl_emul_shutdown(void) { /* does nothing */ } void Sdlgl_start_screen(void) { /* does nothing (needed for interface) */ } void Sdlgl_end_screen(void) { /* does nothing (needed for interface) */ } struct TextWindow *sdlgl_new_textwin(int type) { struct TextWindow *win; win = (struct TextWindow *) alloc(sizeof(struct TextWindow)); memset(win, 0, sizeof(struct TextWindow)); win->type = type; win->is_menu = -1; win->base = NULL; win->write_x = win->write_y = 0; win->write_cursor = 0; win->write_col = win->fill_col = (BLACK<<8) + L_GREY; win->scrollback = NULL; return win; } void sdlgl_free_textwin(struct TextWindow *win) { if (win->base) { sdlgl_free_tilewin(win->base); win->base = NULL; } free(win); } /* ---------------------------------------------------------------- */ static void copy_line_to_scrollback(struct TextWindow *win, int y) { int x, tw; struct TileWindow *front = win->base; struct TileWindow *back = win->scrollback; assert(front && back); tw = front->total_w; assert(back->total_w == tw); assert(0 <= y && y < front->total_h); /* ignore empty lines */ for (x=0; x < tw; x++) if (front->tiles[y * tw + x].fg != TILE_EMPTY && front->tiles[y * tw + x].fg != CHAR_2_TILE(' ')) break; if (x >= tw) return; /* scroll up the scroll back */ sdlgl_copy_area(back, 0, 0, tw, back->total_h - 1, 0, 1); sdlgl_transfer_area(front, 0, y, tw, 1, back, 0, 0); if (win->scrollback_size < back->total_h) win->scrollback_size += 1; } static void do_scroll_up(struct TextWindow *win) { int tw = win->base->total_w; int th = win->base->total_h; if (win->scrollback && win->scrollback_enable) copy_line_to_scrollback(win, th - 1); /* copy lines upward */ sdlgl_copy_area(win->base, 0, 0, tw, th - 1, 0, 1); /* blank out bottom line */ sdlgl_blank_area(win->base, 0, 0, tw, 1); } static void do_wrapping(struct TextWindow *win) { int tw = win->base->total_w; int th = win->base->total_h; if (win->write_x < 0) { if (win->write_y >= th - 1) win->write_x = 0; else { win->write_x = tw - 1; win->write_y += 1; } } if (win->write_y >= th) win->write_y = th - 1; if (win->write_x >= tw) { win->write_x = 0; win->write_y -= 1; } for (; win->write_y < 0; win->write_y += 1) { do_scroll_up(win); } if (win->write_cursor) sdlgl_set_cursor(win->base, win->write_x, win->write_y, 1); } static void do_putc(struct TextWindow *win, char t) { int x = win->write_x; int y = win->write_y; int tw = win->base->total_w; int th = win->base->total_h; assert(0 <= x && x < tw); assert(0 <= y && y < th); sdlgl_store_char(win->base, x, y, t, win->write_col); win->write_x += 1; do_wrapping(win); } void sdlgl_putc(struct TextWindow *win, int c) { /* make sure character is in range */ c = ((unsigned int) c) & 0xFF; assert(c >= 0); /* handle special cases */ switch (c) { case 0: /* NUL: do nothing */ break; case C('g'): /* ^G: bel */ { Sdlgl_nhbell(); break; } case C('h'): /* ^H: backspace */ { sdlgl_backsp(win); break; } case C('i'): /* ^I: tab */ { int num; for (num=8 - (win->write_x & 7); num > 0; num--) do_putc(win, ' '); break; } case C('j'): /* ^J: LF */ { win->write_x = 0; win->write_y -= 1; do_wrapping(win); break; } case C('l'): /* ^L: clear */ { int y; for (y=0; y < win->show_h + 1; y++) sdlgl_putc(win, '\n'); sdlgl_home(win); break; } case C('m'): /* ^M: CR */ { win->write_x = 0; break; } /* not special ? Just display the tile normally */ default: do_putc(win, c); break; } if (win->write_cursor && win->base) sdlgl_set_cursor(win->base, win->write_x, win->write_y, 1); } void sdlgl_puts(struct TextWindow *win, const char *s) { for (; *s; s++) sdlgl_putc(win, (int) (unsigned char) *s); } void sdlgl_puts_nolf(struct TextWindow *win, const char *s) { for (; *s; s++) if (*s != '\n' && *s != '\r') sdlgl_putc(win, (int) (unsigned char) *s); } /* ---------------------------------------------------------------- */ void sdlgl_gotoxy(struct TextWindow *win, int x, int y) { int tw = win->base->total_w; int th = win->base->total_h; if (x < 0) x = 0; if (x >= tw) x = tw - 1; if (y < 0) y = 0; if (y >= th) y = th - 1; win->write_x = x; win->write_y = th - 1 - y; if (win->write_cursor) sdlgl_set_cursor(win->base, win->write_x, win->write_y, 1); } void sdlgl_home(struct TextWindow *win) { sdlgl_gotoxy(win, 0, 0); } void sdlgl_backsp(struct TextWindow *win) { win->write_x -= 1; do_wrapping(win); } /* Note: none of these clear routines affects the write position. */ void sdlgl_clear_end(struct TextWindow *win) { int x = win->write_x; int y = win->write_y; int len = win->base->total_w - x; if (len > 0) sdlgl_blank_area(win->base, x, y, len, 1); } void sdlgl_clear_eos(struct TextWindow *win) { int y; int bu_x = win->write_x; int bu_y = win->write_y; /* handle current line */ sdlgl_clear_end(win); /* handle the remaining lines underneath */ for (y=0; y < bu_y; y++) { win->write_x = 0; win->write_y = y; sdlgl_clear_end(win); } win->write_x = bu_x; win->write_y = bu_y; } void sdlgl_clear(struct TextWindow *win) { int bu_x = win->write_x; int bu_y = win->write_y; sdlgl_home(win); sdlgl_clear_eos(win); win->write_x = bu_x; win->write_y = bu_y; } void sdlgl_enable_cursor(struct TextWindow *win, int enable) { assert(win->base); win->write_cursor = enable; win->base->curs_block = 1; win->base->curs_color = CURSOR_COL; if (enable) { sdlgl_set_cursor(win->base, win->write_x, win->write_y, 1); } else { sdlgl_set_cursor(win->base, -1, -1, 1); } } /* ---------------------------------------------------------------- */ static void do_getlin(struct TextWindow *win, const char *query, char *bufp, int is_name) { int max = BUFSZ-1; int len = 0; int ch; sdlgl_gotoxy(win, 0, 0); /* show the prompt */ sdlgl_puts(win, query); sdlgl_putc(win, ' '); sdlgl_enable_cursor(win, 1); /* loop invariant: bufp[len] == 0 */ bufp[0] = 0; for (;;) { sdlgl_flush(); ch = sdlgl_get_key(POSKEY_ALLOW_REPEAT); if (ch == C('p')) { Sdlgl_doprev_message(); continue; } if (sdlgl_alt_prev) sdlgl_remove_scrollback(); if (ch == '\033') /* escape key ? */ { strcpy(bufp, "\033"); break; } if (ch == '\b') /* backspace ? */ { if (len > 0) { bufp[--len] = 0; sdlgl_puts(win, "\b \b"); } continue; } if (ch == '\n' || ch == '\r') /* return ? */ { if (! is_name || len > 0) break; } /* for name input, limit characters to letters + a few symbols. */ if (is_name && !(letter(ch) || ch == '_' || ch == '-' || ch == '@')) continue; else if (is_name && len >= MAX_NAME_LEN) continue; if (' ' <= ch && ch <= '~') { if (len < max) { bufp[len++] = ch; bufp[len] = 0; sdlgl_putc(win, ch); } continue; } /* key unacceptable. beep ? */ } /* clean up after ourselves */ sdlgl_enable_cursor(win, 0); Sdlgl_clear_nhwindow(WIN_MESSAGE); } /* * Read a line closed with '\n' into the array char bufp[BUFSZ]. * The '\n' is not stored. The string is closed with a '\0'. * Reading can be interrupted by an escape ('\033') - now the * resulting string is "\033". */ void Sdlgl_getlin(const char *query, char *bufp) { struct TextWindow *win; if (WIN_MESSAGE == WIN_ERR) { strcpy(bufp, "\033"); return; } win = text_wins[WIN_MESSAGE]; assert(win); assert(win->base); if (sdlgl_alt_prev) sdlgl_remove_scrollback(); if (win->fresh_lines > 0) sdlgl_more(win); Sdlgl_clear_nhwindow(WIN_MESSAGE); /* disable scrollback while we control the message win */ win->scrollback_enable = 0; do_getlin(win, query, bufp, 0); win->scrollback_enable = 1; } /* ---------------------------------------------------------------- */ #define VALID_EXT_CH(ch) ('a' <= (ch) && (ch) <= 'z') /* fills in `comp_tex' with an "[abcd]" completion string. If there * was a single match, returns the extcmdlist index for it, otherwise * returns -1. */ static int make_completion_text(const char *word, int len, char *comp_tex) { int i, pos, last = -1; int letters[26] = { 0, }; int matches; /* special case for zero length: use stock string */ if (len == 0) { strcpy(comp_tex, "[a-z?]"); return -1; } /* default to empty string */ comp_tex[0] = 0; for (i=matches=0; extcmdlist[i].ef_txt; i++) { const char *cmd = extcmdlist[i].ef_txt; if (! VALID_EXT_CH(cmd[0])) continue; if (strlen(cmd) <= len) continue; if (strncmp(word, cmd, len) != 0) continue; if (! VALID_EXT_CH(cmd[len])) continue; letters[cmd[len] - 'a'] = 1; matches++; last = i; } if (matches == 0) return -1; else if (matches == 1) return last; /* build match list string */ pos = 0; comp_tex[pos++] = '['; for (i=0; i < 26; i++) if (letters[i]) comp_tex[pos++] = 'a' + i; comp_tex[pos++] = ']'; comp_tex[pos] = 0; return -1; } /* -AJA- I think it's cleaner to have a whole new routine rather than * try to shoe-horn the extended command completion stuff into * the existing do_getlin() routine. */ static int do_get_ext_cmd(struct TextWindow *win) { char buffer[BUFSZ + 1 /* for NUL */]; char comp_buf[BUFSZ]; int len = 0; int i, ch; int use_menu = 0; sdlgl_enable_cursor(win, 1); win->write_col = L_GREY; /* loop invariant: buffer[len] == 0 */ buffer[0] = 0; comp_buf[0] = 0; (void) make_completion_text(buffer, len, comp_buf); for (;;) { /* redraw the line, then flush */ sdlgl_home(win); sdlgl_clear_end(win); sdlgl_putc(win, '#'); sdlgl_putc(win, ' '); sdlgl_puts(win, buffer); sdlgl_puts(win, comp_buf); sdlgl_flush(); /* process a key */ ch = sdlgl_get_key(POSKEY_ALLOW_REPEAT); if (ch == C('p')) { Sdlgl_doprev_message(); continue; } if (sdlgl_alt_prev) sdlgl_remove_scrollback(); if (ch == '\033') /* escape key ? */ { len = 0; break; } if (ch == '\n' || ch == '\r') /* return ? */ break; if (ch == '\b') /* backspace ? */ { if (len == 0) break; assert(len > 0); buffer[--len] = 0; (void) make_completion_text(buffer, len, comp_buf); continue; } if (ch == '?' && len == 0) { len = 0; use_menu = 1; break; } /* only lowercase letters please */ if (! VALID_EXT_CH(ch) || len >= MAX_EXT_CMD_LEN) { /* beep ? */ continue; } buffer[len++] = ch; buffer[len] = 0; /* do completion */ i = make_completion_text(buffer, len, comp_buf); if (i >= 0) { strcpy(buffer, extcmdlist[i].ef_txt); len = strlen(buffer); } } sdlgl_enable_cursor(win, 0); sdlgl_clear(win); sdlgl_home(win); if (use_menu) return extcmd_via_menu(); if (len == 0) return -1; /* find command, show message if not found */ for (i=0; extcmdlist[i].ef_txt; i++) if (strcmp(extcmdlist[i].ef_txt, buffer) == 0) return i; pline("%s: unknown extended command.", buffer); return -1; } /* * Read in an extended command, doing command line completion. We * stop when we have found enough characters to make a unique command. */ int Sdlgl_get_ext_cmd(void) { struct TextWindow *win; int cmd; #if 0 if (iflags.extmenu) return extcmd_via_menu(); #endif if (WIN_MESSAGE == WIN_ERR) return -1; win = text_wins[WIN_MESSAGE]; assert(win); assert(win->base); if (sdlgl_alt_prev) sdlgl_remove_scrollback(); if (win->fresh_lines > 0) sdlgl_more(win); Sdlgl_clear_nhwindow(WIN_MESSAGE); /* disable scrollback while we control the message win */ win->scrollback_enable = 0; cmd = do_get_ext_cmd(win); win->scrollback_enable = 1; return cmd; } /* * plname is filled either by an option (-u Player or -uPlayer) or * explicitly (by being the wizard) or by askname. * It may still contain a suffix denoting the role, etc. * Always called after init_nhwindows() and before display_gamewindows(). */ void Sdlgl_askname(void) { struct TextWindow *win; int pixel_h; char buffer[BUFSZ]; /* create text & tile windows */ win = sdlgl_new_textwin(NHW_TEXT); /* type unimportant */ win->show_w = sdlgl_width / sdlgl_font_message->tile_w; win->show_h = HEIGHT_ASKNAME; pixel_h = sdlgl_font_message->tile_h * win->show_h; win->base = sdlgl_new_tilewin(sdlgl_font_message, win->show_w, win->show_h, 1,0); sdlgl_map_tilewin(win->base, 0, sdlgl_height - pixel_h, sdlgl_width, pixel_h, DEPTH_ASKNAME); /* do the query */ do_getlin(win, "Who are you?", buffer, 1); sdlgl_unmap_tilewin(win->base); sdlgl_free_textwin(win); if (buffer[0] == '\033') sdlgl_error("Quit from who-are-you prompt.\n"); strncpy(plname, buffer, sizeof(plname) - 1); plname[sizeof(plname) - 1] = 0; } #endif /* GL_GRAPHICS */ /*gl_emul.c*/ slashem-0.0.7E7F3/win/gl/font22.txt0000664000076400007640000026150610545462317014740 0ustar alialio = (0, 0, 0) M = (255, 255, 255) # tile 0 (char 0) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 1 (char 1) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooMMMMMMooo ooMooooooMoo oMooooooooMo MooMMooMMooM MooMMooMMooM MooooooooooM MooooooooooM MooMMMMMMooM MoooMMMMoooM oMooooooooMo ooMooooooMoo oooMMMMMMooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 2 (char 2) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooMMMMMMooo ooMMMMMMMMoo oMMMMMMMMMMo MMMooMMooMMM MMMooMMooMMM MMMMMMMMMMMM MMMMMMMMMMMM MMMooooooMMM MMMMooooMMMM oMMMMMMMMMMo ooMMMMMMMMoo oooMMMMMMooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 3 (char 3) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooMoooMoooo ooMMMoMMMooo oMMMMMMMMMoo oMMMMMMMMMoo oMMMMMMMMMoo oMMMMMMMMMoo ooMMMMMMMooo ooMMMMMMMooo oooMMMMMoooo ooooMMMooooo oooooMoooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 4 (char 4) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooMoooooo ooooMMMooooo oooMMMMMoooo ooMMMMMMMooo oMMMMMMMMMoo ooMMMMMMMooo oooMMMMMoooo ooooMMMooooo oooooMoooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 5 (char 5) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooMoooooo ooooMMMooooo ooooMMMooooo ooMoMMMoMooo oMMMoMoMMMoo oMMMMMMMMMoo oMMMMMMMMMoo ooMMoMoMMooo ooooMMMooooo ooooMMMooooo oooMMMMMoooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 6 (char 6) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooMoooooo ooooMMMooooo oooMMMMMoooo ooMMMMMMMooo oMMMMMMMMMoo oMMMMMMMMMoo oMMMMMMMMMoo ooMMoMoMMooo ooooMMMooooo ooooMMMooooo oooMMMMMoooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 7 (char 7) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooMMooooo ooooMMMMoooo ooooMMMMoooo oooooMMooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 8 (char 8) { MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM MMMMMooMMMMM MMMMooooMMMM MMMMooooMMMM MMMMMooMMMMM MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM } # tile 9 (char 9) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo ooooMMMMoooo oooMMooMMooo ooMMoMMoMMoo ooMMoMMoMMoo ooMMoMMoMMoo oooMMooMMooo ooooMMMMoooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 10 (char 10) { MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM MMMMooooMMMM MMMooMMooMMM MMooMooMooMM MMooMooMooMM MMooMooMooMM MMMooMMooMMM MMMMooooMMMM MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM } # tile 11 (char 11) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo ooooooMMMMoo oooooooMMMoo ooooooMMoMoo oooMMMMooooo ooMMoMMooooo oMMoooMMoooo oMMoooMMoooo oMMoooMMoooo ooMMoMMooooo oooMMMoooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 12 (char 12) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo ooooMMMMoooo oooMMooMMooo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo oooMMooMMooo ooooMMMMoooo oooooMMooooo oooooMMooooo oooMMMMMMooo oooooMMooooo oooooMMooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 13 (char 13) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooMMMMooo oooooMMoMooo oooooMMMMooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooMMMMooooo ooMMMMMooooo oooMMMoooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 14 (char 14) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooMMooooooo oooMMMMooooo oooMMooMMMoo oooMMMooMMoo oooMMoMMMMoo oooMMoooMMoo oooMMoooMMoo oooMMoooMMoo ooMMMoooMMoo oMMMMoooMMoo oMMMooooMMoo oooooooMMMoo ooooooMMMMoo ooooooMMMooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 15 (char 15) { oooooooooooo oooooooooooo oooooooooooo oooooMMooooo oooooMMooooo ooMMoMMoMMoo oooMMMMMMooo ooooMMMMoooo oooMMooMMooo ooMMooooMMoo ooMMooooMMoo oooMMooMMooo ooooMMMMoooo oooMMMMMMooo ooMMoMMoMMoo oooooMMooooo oooooMMooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 16 (char 16) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oMoooooooooo oMMMoooooooo oMMMMMoooooo oMMMMMMooooo oMMMMMMMMooo oMMMMMMMMMoo oMMMMMMMMooo oMMMMMMooooo oMMMMMoooooo oMMMoooooooo oMoooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 17 (char 17) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooMoo oooooooMMMoo oooooMMMMMoo ooooMMMMMMoo ooMMMMMMMMoo oMMMMMMMMMoo ooMMMMMMMMoo ooooMMMMMMoo oooooMMMMMoo oooooooMMMoo oooooooooMoo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 18 (char 18) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooMMooooo ooooMMMMoooo oooMMMMMMooo ooMMMMMMMMoo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo ooMMMMMMMMoo oooMMMMMMooo ooooMMMMoooo oooooMMooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 19 (char 19) { oooooooooooo oooooooooooo oooooooooooo oooMMooMMooo oooMMooMMooo oooMMooMMooo oooMMooMMooo oooMMooMMooo oooMMooMMooo oooMMooMMooo oooMMooMMooo oooMMooMMooo oooMMooMMooo oooooooooooo oooMMooMMooo oooMMooMMooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 20 (char 20) { oooooooooooo oooooooooooo oooooooooooo oooMMMMMMMoo ooMMoMMoMMoo ooMMoMMoMMoo ooMMoMMoMMoo ooMMoMMoMMoo oooMMMMoMMoo oooooMMoMMoo oooooMMoMMoo oooooMMoMMoo oooooMMoMMoo oooooMMoMMoo oooooMMoMMoo oooooMMoMMoo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 21 (char 21) { oooooooooooo oooooooooooo oooooooooooo oooMMMMMMooo ooMMooooMMoo oMMoooooMMoo oMMooooooooo ooMMoMMMoooo oooMMooMMooo oMMoMMooMMoo oMMooMMoMMoo ooMMooMMoooo oooMMMoMMooo ooooooooMMoo oMMoooooMMoo oMMooooMMooo ooMMMMMMoooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 22 (char 22) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo ooMMMMMMMMoo ooMMMMMMMMoo ooMMMMMMMMoo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 23 (char 23) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooMMooooo ooooMMMMoooo oooMMMMMMooo ooMMMMMMMMoo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo ooMMMMMMMMoo oooMMMMMMooo ooooMMMMoooo oooooMMooooo oooooooooooo ooMMMMMMMMoo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 24 (char 24) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooMMooooo ooooMMMMoooo oooMMMMMMooo ooMMMMMMMMoo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 25 (char 25) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo ooMMMMMMMMoo oooMMMMMMooo ooooMMMMoooo oooooMMooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 26 (char 26) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo ooooooMooooo ooooooMMoooo ooooooMMMooo oMMMMMMMMMoo ooooooMMMooo ooooooMMoooo ooooooMooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 27 (char 27) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo ooooMooooooo oooMMooooooo ooMMMooooooo oMMMMMMMMMoo ooMMMooooooo oooMMooooooo ooooMooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 28 (char 28) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo ooMMoooooooo ooMMoooooooo ooMMoooooooo ooMMMMMMMMoo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 29 (char 29) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooMoooMoooo ooMMoooMMooo oMMMMMMMMMoo ooMMoooMMooo oooMoooMoooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 30 (char 30) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooMoooooo oooooMoooooo ooooMMMooooo ooooMMMooooo oooMMMMMoooo oooMMMMMoooo oooMMMMMoooo ooMMMMMMMooo ooMMMMMMMooo oMMMMMMMMMoo oMMMMMMMMMoo oMMMMMMMMMoo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 31 (char 31) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oMMMMMMMMMoo oMMMMMMMMMoo oMMMMMMMMMoo ooMMMMMMMooo ooMMMMMMMooo oooMMMMMoooo oooMMMMMoooo oooMMMMMoooo ooooMMMooooo ooooMMMooooo oooooMoooooo oooooMoooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 32 (char 32) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 33 (char 33) { oooooooooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooooooooo oooooooooooo oooooMMooooo oooooMMooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 34 (char 34) { oooooooooooo oooMMooMMooo oooMMooMMooo oooMMooMMooo oooMMooMMooo oooMMooMMooo oooMMooMMooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 35 (char 35) { oooooooooooo ooooooMMooMM ooooooMMooMM ooooooMMooMM oooooMMooMMo oooMMMMMMMMM oooMMMMMMMMM ooooMMooMMoo ooooMMooMMoo oooMMooMMooo oooMMooMMooo oMMMMMMMMMoo oMMMMMMMMMoo ooMMooMMoooo oMMooMMooooo oMMooMMooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 36 (char 36) { oooooooooooo oooooMMooooo oooMMMMMMooo ooMMMMMMMMoo oMMooMMoMMMo oMMooMMooMMo oMMooMMooooo ooMMMMMooooo oooMMMMMMooo oooooMMMMMoo oooooMMooMMo oooooMMooMMo oMMooMMooMMo oMMMMMMMMMoo ooMMMMMMMooo oooooMMooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 37 (char 37) { oooooooooooo oooooooooooo ooMMMoooMMoo oMooMMooMMoo oMoooMoMMooo oMMooMoMMooo ooMMMoMMoooo ooooooMMoooo oooooMMooooo oooooMMooooo ooooMMoooooo ooooMMoMMMoo oooMMoMooMMo oooMMoMoooMo ooMMooMMooMo ooMMoooMMMoo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 38 (char 38) { oooooooooooo oooooMMMoooo ooooMMMMMooo oooMMoooMMoo oooMMoooMMoo oooMMoooMMoo ooooMMMMMooo oooMMMMooooo ooMMMMMooooo oMMMoMMMoooo oMMoooMMoMMo oMMooooMMMMo oMMooooMMMoo oMMooooMMooo ooMMMMMMMMMo oooMMMMooMMo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 39 (char 39) { oooooooooooo ooooMMoooooo oooMMMMooooo oooMMMMooooo oooooMMooooo oooooMMooooo ooooMMoooooo oooMMooooooo oooMoooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 40 (char 40) { oooooooooooo oooooooMMooo ooooooMMoooo oooooMMooooo oooooMMooooo ooooMMoooooo ooooMMoooooo ooooMMoooooo ooooMMoooooo ooooMMoooooo ooooMMoooooo ooooMMoooooo oooooMMooooo oooooMMooooo ooooooMMoooo oooooooMMooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 41 (char 41) { oooooooooooo oooMMooooooo ooooMMoooooo oooooMMooooo oooooMMooooo ooooooMMoooo ooooooMMoooo ooooooMMoooo ooooooMMoooo ooooooMMoooo ooooooMMoooo ooooooMMoooo oooooMMooooo oooooMMooooo ooooMMoooooo oooMMooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 42 (char 42) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo ooooMMMMoooo oooooMMooooo oMMooMMooMMo oMMMoMMoMMMo oooMMooMMooo oooooooooooo oooMMooMMooo oMMMoMMoMMMo oMMooMMooMMo oooooMMooooo ooooMMMMoooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 43 (char 43) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oMMMMMMMMMMo oMMMMMMMMMMo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 44 (char 44) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo ooooMMoooooo oooMMMMooooo oooMMMMooooo oooooMMooooo oooooMMooooo ooooMMoooooo oooMMooooooo oooMoooooooo oooooooooooo } # tile 45 (char 45) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oMMMMMMMMMMo oMMMMMMMMMMo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 46 (char 46) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo ooooMMoooooo oooMMMMooooo oooMMMMooooo ooooMMoooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 47 (char 47) { oooooooooooo oooooooooMMo ooooooooMMoo ooooooooMMoo oooooooMMooo oooooooMMooo ooooooMMoooo ooooooMMoooo oooooMMooooo oooooMMooooo ooooMMoooooo ooooMMoooooo oooMMooooooo oooMMooooooo ooMMoooooooo ooMMoooooooo oMMooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 48 (char 48) { oooooooooooo oooooMMMoooo ooooMMMMMooo oooMoooMMooo oooMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMooo oooMMoooMooo oooMMMMMoooo ooooMMMooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 49 (char 49) { oooooooooooo ooooooMooooo oooooMMooooo ooooMMMooooo oooMMMMooooo ooMMoMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo ooMMMMMMMMoo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 50 (char 50) { oooooooooooo oooMMMMMoooo ooMMMMMMMooo oMMooooMMMoo oMooooooMMoo ooooooooMMoo ooooooooMMoo ooooooooMMoo oooooooMMooo ooooooMMoooo oooooMMooooo ooooMMoooooo oooMMooooooo ooMMooooooMo oMMMMMMMMMMo oMMMMMMMMMMo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 51 (char 51) { oooooooooooo ooooMMMMMooo oooMMMMMMMoo ooMoooooMMMo oMoooooooMMo oooooooooMMo ooooooooMMMo oooooMMMMMoo ooooMMMMMMoo ooooooooMMMo oooooooooMMo oooooooooMMo oMoooooooMMo oMMooooooMoo ooMMMMMMMooo oooMMMMMoooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 52 (char 52) { oooooooooooo oooooooMMooo ooooooMMMooo ooooooMMMooo oooooMoMMooo oooooMoMMooo ooooMooMMooo ooooMooMMooo oooMoooMMooo oooMoooMMooo ooMooooMMooo ooMMMMMMMMMo oMMMMMMMMMMo oooooooMMooo oooooooMMooo oooooooMMooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 53 (char 53) { oooooooooooo ooooMMMMMMoo ooooMMMMMMoo oooMoooooooo oooMoooooooo ooMooooooooo ooMMMMMMMooo ooMMoooMMMoo ooooooooMMMo oooooooooMMo oooooooooMMo oooooooooMMo oMoooooooMMo oMMooooooMMo ooMMooooMMoo oooMMMMMMooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 54 (char 54) { oooooooooooo oooooMMMoooo ooooMMoooooo oooMMooooooo ooMMoooooooo ooMMoooooooo oMMooooooooo oMMooMMMMooo oMMoMMMMMMoo oMMMooooMMMo oMMooooooMMo oMMooooooMMo oMMooooooMMo oMMMoooooMoo ooMMMMMMMooo oooMMMMMoooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 55 (char 55) { oooooooooooo oooMMMMMMMMo ooMMMMMMMMMo oMMooooooMoo oooooooooMoo ooooooooMMoo ooooooooMooo ooooooooMooo oooooooMMooo oooooooMoooo oooooooMoooo ooooooMMoooo ooooooMooooo ooooooMooooo oooooMMooooo oooooMoooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 56 (char 56) { oooooooooooo ooooMMMMoooo oooMoooMMooo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo oooMMoooMooo ooooMMoMoooo oooooMMooooo ooooMoMMoooo oooMoooMMooo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo oooMMoooMooo ooooMMMMoooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 57 (char 57) { oooooooooooo ooooMMMMMooo oooMoooMMMoo ooMoooooMMMo oMMooooooMMo oMMooooooMMo oMMooooooMMo oMMMooooMMMo ooMMMMMMoMMo oooMMMMooMMo oooooooooMMo ooooooooMMoo ooooooooMMoo oooooooMMooo oooooMMMoooo ooMMMMoooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 58 (char 58) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo ooooMMoooooo oooMMMMooooo oooMMMMooooo ooooMMoooooo oooooooooooo oooooooooooo ooooMMoooooo oooMMMMooooo oooMMMMooooo ooooMMoooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 59 (char 59) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo ooooMMoooooo oooMMMMooooo oooMMMMooooo ooooMMoooooo oooooooooooo oooooooooooo ooooMMoooooo oooMMMMooooo oooMMMMooooo oooooMMooooo oooooMMooooo ooooMMoooooo oooMMooooooo oooMoooooooo oooooooooooo } # tile 60 (char 60) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooMMo oooooooMMMoo oooooMMMoooo oooMMMoooooo oMMMoooooooo oMMMoooooooo oooMMMoooooo oooooMMMoooo oooooooMMMoo oooooooooMMo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 61 (char 61) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oMMMMMMMMMMo oMMMMMMMMMMo oooooooooooo oooooooooooo oMMMMMMMMMMo oMMMMMMMMMMo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 62 (char 62) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oMMooooooooo ooMMMooooooo ooooMMMooooo ooooooMMMooo ooooooooMMMo ooooooooMMMo ooooooMMMooo ooooMMMooooo ooMMMooooooo oMMooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 63 (char 63) { oooooooooooo ooooMMMMoooo oooMMMMMMooo ooMMMooMMMoo ooMoooooMMoo ooooooooMMoo ooooooooMMoo oooooooMMooo ooooooMMoooo oooooMMooooo ooooMMoooooo ooooMMoooooo oooooooooooo oooooooooooo ooooMMoooooo ooooMMoooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 64 (char 64) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo ooooMMMMMooo ooMMMMMMMMoo ooMMoooooMMo oMMooooooMMo oMMooMMMooMo oMMoMMMMMoMo oMMoMMooMoMo oMMoMMooMoMo oMMooMMMMMMo oMMooooooooo ooMMoooooooo ooMMMMMMMMMo ooooMMMMMMMo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 65 (char 65) { oooooooooooo oooooooooooo oooooMMooooo oooooMMooooo ooooMoMMoooo ooooMoMMoooo ooooMooMoooo oooMoooMMooo oooMoooMMooo oooMooooMooo ooMMMMMMMMoo ooMoooooMMoo ooMooooooMoo oMoooooooMMo oMoooooooMMo MMMoooooMMMM oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 66 (char 66) { oooooooooooo oooooooooooo MMMMMMMMoooo oMMoooooMooo oMMoooooMMoo oMMoooooMMoo oMMoooooMMoo oMMooooMMooo oMMMMMMMMooo oMMoooooMMoo oMMooooooMMo oMMooooooMMo oMMooooooMMo oMMooooooMMo oMMoooooMMoo MMMMMMMMMooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 67 (char 67) { oooooooooooo oooooooooooo ooooMMMMMMoo oooMoooooMMo ooMoooooooMo ooMooooooooo oMMooooooooo oMMooooooooo oMMooooooooo oMMooooooooo oMMooooooooo oMMooooooooo ooMooooooooo ooMMooooooMo oooMMooooMoo ooooMMMMMooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 68 (char 68) { oooooooooooo oooooooooooo MMMMMMMMoooo oMMooooMMMoo oMMoooooMMoo oMMooooooMMo oMMooooooMMo oMMooooooMMo oMMooooooMMo oMMooooooMMo oMMooooooMMo oMMooooooMMo oMMooooooMMo oMMooooooMoo oMMooooMMooo MMMMMMMooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 69 (char 69) { oooooooooooo oooooooooooo oMMMMMMMMMoo ooMMoooooMoo ooMMoooooMoo ooMMoooooooo ooMMoooooooo ooMMooooMooo ooMMMMMMMooo ooMMooooMooo ooMMoooooooo ooMMoooooooo ooMMoooooooo ooMMooooooMo ooMMooooooMo oMMMMMMMMMMo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 70 (char 70) { oooooooooooo oooooooooooo oMMMMMMMMMoo ooMMoooooMoo ooMMoooooMoo ooMMoooooooo ooMMoooooooo ooMMooooMooo ooMMMMMMMooo ooMMooooMooo ooMMoooooooo ooMMoooooooo ooMMoooooooo ooMMoooooooo ooMMoooooooo oMMMMooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 71 (char 71) { oooooooooooo oooooooooooo ooooMMMMMMoo oooMoooooMMo ooMoooooooMo ooMooooooooo oMMooooooooo oMMooooooooo oMMooooooooo oMMooooooooo oMMooooMMMMM oMMooooooMMo ooMooooooMMo ooMMoooooMMo oooMMooooMMo ooooMMMMMooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 72 (char 72) { oooooooooooo oooooooooooo MMMMooooMMMM oMMooooooMMo oMMooooooMMo oMMooooooMMo oMMooooooMMo oMMooooooMMo oMMMMMMMMMMo oMMooooooMMo oMMooooooMMo oMMooooooMMo oMMooooooMMo oMMooooooMMo oMMooooooMMo MMMMooooMMMM oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 73 (char 73) { oooooooooooo oooooooooooo oooMMMMMMooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooMMMMMMooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 74 (char 74) { oooooooooooo oooooooooooo oooMMMMMMooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMoooooo ooMMMooooooo ooMMoooooooo oooooooooooo } # tile 75 (char 75) { oooooooooooo oooooooooooo MMMMooooMMMo oMMooooMMooo oMMoooMMoooo oMMooMMooooo oMMoMMoooooo oMMMMooooooo oMMMMooooooo oMMMMMoooooo oMMoMMMooooo oMMooMMMoooo oMMoooMMMooo oMMooooMMMoo oMMoooooMMMo MMMMoooooMMM oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 76 (char 76) { oooooooooooo oooooooooooo oMMMMooooooo ooMMoooooooo ooMMoooooooo ooMMoooooooo ooMMoooooooo ooMMoooooooo ooMMoooooooo ooMMoooooooo ooMMoooooooo ooMMoooooooo ooMMoooooooo ooMMooooooMo ooMMooooooMo oMMMMMMMMMMo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 77 (char 77) { oooooooooooo oooooooooooo MMMooooooMMM oMMoooooMMMo oMMMooooMMMo oMMMooooMMMo oMMMooooMMMo oMoMMooMoMMo oMoMMooMoMMo oMoMMooMoMMo oMooMMoMoMMo oMooMMMooMMo oMooMMMooMMo oMoooMoooMMo oMoooMoooMMo MMMooMooMMMM oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 78 (char 78) { oooooooooooo oooooooooooo MMoooooooMMM oMMoooooooMo oMMMooooooMo oMMMMoooooMo oMoMMoooooMo oMooMMooooMo oMoooMMoooMo oMoooMMMooMo oMooooMMooMo oMoooooMMoMo oMooooooMMMo oMooooooMMMo oMoooooooMMo MMMoooooooMM oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 79 (char 79) { oooooooooooo oooooooooooo ooooMMMMoooo oooMoooMMMoo ooMoooooMMoo ooMooooooMMo oMMooooooMMo oMMooooooMMo oMMooooooMMo oMMooooooMMo oMMooooooMMo oMMooooooMMo ooMooooooMoo ooMMoooooMoo oooMMoooMooo ooooMMMMoooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 80 (char 80) { oooooooooooo oooooooooooo oMMMMMMMMooo ooMMooooMMoo ooMMoooooMMo ooMMoooooMMo ooMMoooooMMo ooMMooooMMoo ooMMoMMMMooo ooMMoooooooo ooMMoooooooo ooMMoooooooo ooMMoooooooo ooMMoooooooo ooMMoooooooo oMMMMooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 81 (char 81) { oooooooooooo oooooooooooo ooooMMMMoooo oooMoooMMMoo ooMoooooMMoo ooMooooooMMo oMMooooooMMo oMMooooooMMo oMMooooooMMo oMMooooooMMo oMMooooooMMo oMMooooooMMo ooMMoooooMoo ooMMMooooMoo oooMMMMMMooo ooooMMMooooo oooMMMMMoooo ooMoooMMMooM oooooooMMMMo oooooooooooo oooooooooooo oooooooooooo } # tile 82 (char 82) { oooooooooooo oooooooooooo MMMMMMMMoooo oMMooooMMooo oMMoooooMMoo oMMoooooMMoo oMMoooooMMoo oMMoooooMooo oMMMMMMMoooo oMMMMMoooooo oMMoMMMooooo oMMooMMMoooo oMMoooMMMooo oMMooooMMMoo oMMoooooMMMo MMMMoooooMMM oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 83 (char 83) { oooooooooooo oooooooooooo oooMMMMMMMMo ooMMoooooMMo oMMoooooooMo oMMoooooooMo oMMMoooooooo ooMMMMoooooo oooMMMMooooo oooooMMMMooo oooooooMMMoo ooooooooMMMo oMoooooooMMo oMoooooooMMo oMMoooooMMoo oMMMMMMMMooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 84 (char 84) { oooooooooooo oooooooooooo oMMMMMMMMMMo oMoooMMoooMo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooMMMMMMooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 85 (char 85) { oooooooooooo oooooooooooo MMMMoooooMMM oMMoooooooMo oMMoooooooMo oMMoooooooMo oMMoooooooMo oMMoooooooMo oMMoooooooMo oMMoooooooMo oMMoooooooMo oMMoooooooMo oMMoooooooMo oMMMoooooMoo ooMMMMMMMMoo oooMMMMMMooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 86 (char 86) { oooooooooooo oooooooooooo MMMoooooMMMo oMMooooooMoo ooMMooooMooo ooMMooooMooo ooMMooooMooo oooMMooMoooo oooMMooMoooo oooMMooMoooo ooooMoMooooo ooooMMMooooo ooooMMMooooo oooooMoooooo oooooMoooooo oooooMoooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 87 (char 87) { oooooooooooo oooooooooooo MMMMMMMoMMMM oMMooMMoooMo oMMooMMoooMo oMMooMMoooMo oMMMoMMoooMo oMMMoMMMoMoo ooMMooMMoMoo ooMMoMMMoMoo ooMMMoMMMMoo ooMMMoMMMooo oooMMooMMooo oooMMooMMooo oooMMooMMooo oooMMooMMooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 88 (char 88) { oooooooooooo oooooooooooo MMMMoooooMMM oMMoooooooMo ooMMoooooMoo ooMMMoooMooo oooMMoooMooo ooooMMoMoooo oooooMMooooo oooooMMooooo ooooMoMMoooo oooMoooMMooo oooMoooMMMoo ooMoooooMMoo oMoooooooMMo MMMoooooMMMM oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 89 (char 89) { oooooooooooo oooooooooooo MMMMoooooMMM oMMoooooooMo ooMMoooooMoo oooMMoooMooo oooMMoooMooo ooooMMoMoooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo ooooMMMMoooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 90 (char 90) { oooooooooooo oooooooooooo ooMMMMMMMMMo ooMoooooMMoo ooooooooMMoo oooooooMMooo oooooooMMooo ooooooMMoooo ooooooMMoooo oooooMMooooo oooooMMooooo ooooMMoooooo ooooMMoooooo oooMMooooooo oooMMoooooMo ooMMMMMMMMMo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 91 (char 91) { oooooooooooo ooooMMMMMooo ooooMMMMMooo ooooMMoooooo ooooMMoooooo ooooMMoooooo ooooMMoooooo ooooMMoooooo ooooMMoooooo ooooMMoooooo ooooMMoooooo ooooMMoooooo ooooMMoooooo ooooMMoooooo ooooMMMMMooo ooooMMMMMooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 92 (char 92) { oooooooooooo oMMooooooooo ooMMoooooooo ooMMoooooooo oooMMooooooo oooMMooooooo ooooMMoooooo ooooMMoooooo oooooMMooooo oooooMMooooo ooooooMMoooo ooooooMMoooo oooooooMMooo oooooooMMooo ooooooooMMoo ooooooooMMoo oooooooooMMo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 93 (char 93) { oooooooooooo oooMMMMMoooo oooMMMMMoooo ooooooMMoooo ooooooMMoooo ooooooMMoooo ooooooMMoooo ooooooMMoooo ooooooMMoooo ooooooMMoooo ooooooMMoooo ooooooMMoooo ooooooMMoooo ooooooMMoooo oooMMMMMoooo oooMMMMMoooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 94 (char 94) { oooooooooooo oooooMoooooo ooooMMMooooo oooMMoMMoooo ooMMoooMMooo oMMoooooMMoo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 95 (char 95) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo MMMMMMMMMMMM MMMMMMMMMMMM oooooooooooo oooooooooooo oooooooooooo } # tile 96 (char 96) { oooooooooooo oooooooMoooo ooooooMMoooo oooooMMooooo oooooMMooooo oooooMMMMooo oooooMMMMooo ooooooMMoooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 97 (char 97) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo ooooMMMMMooo oooMMoooMMoo oooMooooMMoo ooooooMMMMoo oooMMMooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMMooMMMoo oooMMMMoMMMo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 98 (char 98) { oooooooooooo ooMooooooooo oMMooooooooo MMMooooooooo oMMooooooooo oMMooooooooo oMMooMMMMooo oMMoMMMMMMoo oMMMooooMMMo oMMooooooMMo oMMooooooMMo oMMooooooMMo oMMooooooMMo oMMMoooooMMo oMMMMoooMMoo oMooMMMMMooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 99 (char 99) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooMMMMMMooo ooMMoooMMMoo ooMoooooMMoo oMMooooooooo oMMooooooooo oMMooooooooo oMMooooooooo oMMMoooooMoo ooMMooooMMoo oooMMMMMMooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 100 (char 100) { oooooooooooo oooooooooMMo ooooooooMMMo oooooooooMMo oooooooooMMo oooooooooMMo ooooMMMMoMMo ooMMoooMMMMo ooMoooooMMMo oMMooooooMMo oMMooooooMMo oMMooooooMMo oMMooooooMMo oMMMooooMMMo ooMMMooMoMMo oooMMMMooMMM oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 101 (char 101) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo ooooMMMMoooo ooMMooooMMoo oMMooooooMMo oMMooooooMMo oMMMMMMMMMMo oMMooooooooo oMMooooooooo ooMMoooooooo oooMMooooMMo ooooMMMMMooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 102 (char 102) { oooooooooooo ooooooMMMooo oooooMooMMoo oooooMooMMoo ooooMMoooooo ooooMMoooooo ooooMMoooooo ooooMMoooooo ooMMMMMMMooo ooooMMoooooo ooooMMoooooo ooooMMoooooo ooooMMoooooo ooooMMoooooo ooooMMoooooo oooMMMMooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 103 (char 103) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooMMMMMooMo ooMMoooMMMMo oMMoooooMMoo oMMoooooMMoo oMMoooooMMoo ooMMoooMMooo ooMMMMMMoooo oMMooooooooo oMMMMMMMMMoo ooMMMMMMMMMo ooMooooooMMo oMooooooooMo oMooooooooMo oMMMMMMMMMoo ooMMMMMMMooo oooooooooooo } # tile 104 (char 104) { oooooooooooo oooMoooooooo ooMMoooooooo oMMMoooooooo ooMMoooooooo ooMMoooooooo ooMMoMMMMooo ooMMMooMMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo oMMMMooMMMMo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 105 (char 105) { oooooooooooo oooooooooooo oooooMMooooo oooooMMooooo oooooooooooo oooooooooooo oooMMMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooMMMMMMooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 106 (char 106) { oooooooooooo oooooooooooo ooooooooMMoo ooooooooMMoo oooooooooooo oooooooooooo ooooooMMMMoo ooooooooMMoo ooooooooMMoo ooooooooMMoo ooooooooMMoo ooooooooMMoo ooooooooMMoo ooooooooMMoo ooooooooMMoo ooooooooMMoo ooMoooooMMoo ooMMooooMMoo ooMMMoooMooo oooMMMMMoooo ooooMMMooooo oooooooooooo } # tile 107 (char 107) { oooooooooooo oMMooooooooo MMMooooooooo oMMooooooooo oMMooooooooo oMMooooooooo oMMooooMMMoo oMMoooMMoooo oMMooMMooooo oMMMMMoooooo oMMMMooooooo oMMMMMoooooo oMMoMMMooooo oMMooMMMoooo oMMoooMMMooo MMMMoooMMMMo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 108 (char 108) { oooooooooooo oooMMMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooMMMMMMooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 109 (char 109) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo MMoMMMoMMMoo oMMoMMMoMMMo oMMooMMooMMo oMMooMMooMMo oMMooMMooMMo oMMooMMooMMo oMMooMMooMMo oMMooMMooMMo oMMooMMooMMo MMMoMMMMoMMM oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 110 (char 110) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo ooMooMMMMooo oMMMMooMMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo oMMMMooMMMMo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 111 (char 111) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo ooooMMMMMooo oooMoooMMMoo ooMoooooMMMo oMMooooooMMo oMMooooooMMo oMMooooooMMo oMMooooooMMo oMMMoooooMoo ooMMMoooMooo oooMMMMMoooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 112 (char 112) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo MMMoMMMMMooo oMMMoooMMMoo oMMoooooMMMo oMMooooooMMo oMMooooooMMo oMMooooooMMo oMMooooooMMo oMMooooooMoo oMMMooooMooo oMMMMMMMoooo oMMooooooooo oMMooooooooo oMMooooooooo oMMooooooooo MMMMoooooooo oooooooooooo } # tile 113 (char 113) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo ooooMMMMooMo oooMoooMMMMo ooMoooooMMMo oMMooooooMMo oMMooooooMMo oMMooooooMMo oMMooooooMMo oMMMoooooMMo ooMMMoooMMMo oooMMMMMMMMo oooooooooMMo oooooooooMMo oooooooooMMo oooooooooMMo ooooooooMMMM oooooooooooo } # tile 114 (char 114) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oMMMooMMMooo ooMMoMooMMoo ooMMMoooMMoo ooMMoooooooo ooMMoooooooo ooMMoooooooo ooMMoooooooo ooMMoooooooo ooMMoooooooo oMMMMooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 115 (char 115) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooMMMMMMMoo ooMMooooMMoo ooMMoooooMoo ooMMMooooooo oooMMMMooooo oooooMMMMooo oooooooMMMoo ooMoooooMMoo ooMMooooMMoo ooMMMMMMMooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 116 (char 116) { oooooooooooo oooooooooooo oooooooooooo oooooMoooooo oooooMoooooo ooooMMoooooo oMMMMMMMMMoo ooooMMoooooo ooooMMoooooo ooooMMoooooo ooooMMoooooo ooooMMoooooo ooooMMoooooo ooooMMooooMo ooooMMMooMoo oooooMMMMooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 117 (char 117) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oMMMMooMMMMo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMMooMMMoo oooMMMMooMMo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 118 (char 118) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo MMMMoooooMMM oMMoooooooMo ooMMoooooMoo ooMMoooooMoo oooMMoooMooo oooMMoooMooo ooooMMoMoooo ooooMMoMoooo oooooMMooooo oooooMMooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 119 (char 119) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo MMMMMMMMoMMM oMMooMMoooMo oMMooMMoooMo oMMooMMoooMo ooMMoMMMoMoo ooMMMoMMoMoo ooMMMoMMoMoo oooMMooMMooo oooMMooMMooo oooMMooMMooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 120 (char 120) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo MMMMMoooMMMM oMMMoooooMoo ooMMMoooMooo oooMMMoMoooo ooooMMMooooo oooooMMMoooo ooooMoMMMooo oooMoooMMMoo ooMoooooMMMo MMMMoooMMMMM oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 121 (char 121) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo MMMMooooMMMM oMMoooooooMo ooMMoooooMoo ooMMoooooMoo oooMMoooMooo oooMMoooMooo ooooMMoMoooo ooooMMoMoooo oooooMMooooo oooooMMooooo oooooMoooooo ooooMMoooooo ooooMooooooo oMMMMooooooo oMMMoooooooo oooooooooooo } # tile 122 (char 122) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oMMMMMMMMMMo oMMoooooMMMo oMoooooMMMoo ooooooMMMooo oooooMMMoooo ooooMMMooooo oooMMMoooooo ooMMMoooooMo oMMMoooooMMo oMMMMMMMMMMo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 123 (char 123) { oooooooooooo ooooooMMMooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo ooooMMoooooo ooMMMooooooo ooooMMoooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo ooooooMMMooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 124 (char 124) { oooooooooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooooooooo } # tile 125 (char 125) { oooooooooooo oooMMMoooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo ooooooMMoooo oooooooMMMoo ooooooMMoooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooMMMoooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 126 (char 126) { oooooooooooo oooooooooooo oooooooooooo oooMMMooooMo ooMMMMMooMMo oMMooMMMMMoo oMooooMMMooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 127 (char 127) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooMoooooo ooooMMMooooo ooooMMMooooo oooMMoMMoooo oooMMoMMoooo ooMMoooMMooo ooMMoooMMooo oMMoooooMMoo oMMMMMMMMMoo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 128 (char 128) { oooooooooooo oooooooooooo ooooMMMMMMoo oooMoooooMMo ooMoooooooMo ooMooooooooo oMMooooooooo oMMooooooooo oMMooooooooo oMMooooooooo oMMooooooooo oMMooooooooo ooMooooooooo ooMMooooooMo oooMMooooMoo ooooMMMMMooo oooooMMooooo ooooooMMoooo oooooooMMooo ooooMMMMoooo oooooooooooo oooooooooooo } # tile 129 (char 129) { oooooooooooo oooooooooooo oooMMooMMooo oooMMooMMooo oooooooooooo oooooooooooo oMMMMooMMMMo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMMooMMMoo oooMMMMooMMo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 130 (char 130) { oooooooooooo oooooooooooo oooooooMMooo ooooooMMoooo oooooMMooooo oooooooooooo ooooMMMMoooo ooMMooooMMoo oMMooooooMMo oMMooooooMMo oMMMMMMMMMMo oMMooooooooo oMMooooooooo ooMMoooooooo oooMMooooMMo ooooMMMMMooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 131 (char 131) { oooooooooooo ooooooMooooo oooooMMMoooo ooooMMoMMooo oooMMoooMMoo oooooooooooo ooooMMMMMooo oooMMoooMMoo oooMooooMMoo ooooooMMMMoo oooMMMooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMMooMMMoo oooMMMMoMMMo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 132 (char 132) { oooooooooooo oooooooooooo oooMMooMMooo oooMMooMMooo oooooooooooo oooooooooooo ooooMMMMMooo oooMMoooMMoo oooMooooMMoo ooooooMMMMoo oooMMMooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMMooMMMoo oooMMMMoMMMo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 133 (char 133) { oooooooooooo oooooooooooo ooooMMoooooo oooooMMooooo ooooooMMoooo oooooooooooo ooooMMMMMooo oooMMoooMMoo oooMooooMMoo ooooooMMMMoo oooMMMooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMMooMMMoo oooMMMMoMMMo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 134 (char 134) { oooooooooooo oooooMMMoooo ooooMMoMMooo ooooMMoMMooo oooooMMMoooo oooooooooooo ooooMMMMMooo oooMMoooMMoo oooMooooMMoo ooooooMMMMoo oooMMMooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMMooMMMoo oooMMMMoMMMo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 135 (char 135) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooMMMMMMooo ooMMoooMMMoo ooMoooooMMoo oMMooooooooo oMMooooooooo oMMooooooooo oMMooooooooo oMMMoooooMoo ooMMooooMMoo oooMMMMMMooo oooooMMooooo ooooooMMoooo oooooooMMooo ooooMMMMoooo oooooooooooo oooooooooooo } # tile 136 (char 136) { oooooooooooo ooooooMooooo oooooMMMoooo ooooMMoMMooo oooMMoooMMoo oooooooooooo ooooMMMMoooo ooMMooooMMoo oMMooooooMMo oMMooooooMMo oMMMMMMMMMMo oMMooooooooo oMMooooooooo ooMMoooooooo oooMMooooMMo ooooMMMMMooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 137 (char 137) { oooooooooooo oooooooooooo oooMMooMMooo oooMMooMMooo oooooooooooo oooooooooooo ooooMMMMoooo ooMMooooMMoo oMMooooooMMo oMMooooooMMo oMMMMMMMMMMo oMMooooooooo oMMooooooooo ooMMoooooooo oooMMooooMMo ooooMMMMMooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 138 (char 138) { oooooooooooo oooooooooooo ooooMMoooooo oooooMMooooo ooooooMMoooo oooooooooooo ooooMMMMoooo ooMMooooMMoo oMMooooooMMo oMMooooooMMo oMMMMMMMMMMo oMMooooooooo oMMooooooooo ooMMoooooooo oooMMooooMMo ooooMMMMMooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 139 (char 139) { oooooooooooo oooooooooooo oooMMooMMooo oooMMooMMooo oooooooooooo oooooooooooo oooMMMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooMMMMMMooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 140 (char 140) { oooooooooooo oooooMoooooo ooooMMMooooo oooMMoMMoooo ooMMoooMMooo oooooooooooo oooMMMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooMMMMMMooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 141 (char 141) { oooooooooooo oooooooooooo oooMMooooooo ooooMMoooooo oooooMMooooo oooooooooooo oooMMMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooMMMMMMooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 142 (char 142) { oooooooooooo oooMMooMMooo oooMMooMMooo oooooooooooo oooooMoooooo oooooMMooooo oooooMMooooo ooooMoMMoooo ooooMoMMoooo oooMMooMMooo oooMoooMMooo ooMMMMMMMMoo ooMoooooMMoo oMMooooooMMo oMoooooooMMo MMMoooooMMMM oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 143 (char 143) { oooooooooooo ooooMMMMoooo oooMMooMMooo ooooMMMMoooo oooooMoooooo oooooMMooooo oooooMMooooo ooooMoMMoooo ooooMoMMoooo oooMMooMMooo oooMoooMMooo ooMMMMMMMMoo ooMoooooMMoo oMMooooooMMo oMoooooooMMo MMMoooooMMMM oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 144 (char 144) { oooooooooooo ooooooMMoooo oooooMMooooo ooooMooooooo oMMMMMMMMMMo ooMMooooooMo ooMMoooooooo ooMMoooooooo ooMMooooMooo ooMMMMMMMooo ooMMooooMooo ooMMoooooooo ooMMoooooooo ooMMooooooMo ooMMooooooMo oMMMMMMMMMMo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 145 (char 145) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo ooMMMMoMMMMo oMMooMMoooMM oMoooMMoooMM oooooMMoooMM ooMMMMMMMMMM oMMooMMooooo MMoooMMooooo MMoooMMooooo MMMooMMMooMM oMMMMMoMMMMo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 146 (char 146) { oooooooooooo oooooooooooo ooooooMMMMMM oooooMMMoooM oooooMMMoooM ooooMoMMoooo ooooMoMMoooo ooooMoMMooMo oooMooMMMMMo oooMooMMooMo ooMMMMMMoooo ooMoooMMoooo ooMoooMMoooo oMooooMMoooM oMooooMMoooM MMMooMMMMMMM oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 147 (char 147) { oooooooooooo ooooooMooooo oooooMMMoooo ooooMMoMMooo oooMMoooMMoo oooooooooooo ooooMMMMMooo oooMoooMMMoo ooMoooooMMMo oMMooooooMMo oMMooooooMMo oMMooooooMMo oMMooooooMMo oMMMoooooMoo ooMMMoooMooo oooMMMMMoooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 148 (char 148) { oooooooooooo oooooooooooo oooMMooMMooo oooMMooMMooo oooooooooooo oooooooooooo ooooMMMMMooo oooMoooMMMoo ooMoooooMMMo oMMooooooMMo oMMooooooMMo oMMooooooMMo oMMooooooMMo oMMMoooooMoo ooMMMoooMooo oooMMMMMoooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 149 (char 149) { oooooooooooo oooooooooooo ooooMMoooooo oooooMMooooo ooooooMMoooo oooooooooooo ooooMMMMMooo oooMoooMMMoo ooMoooooMMMo oMMooooooMMo oMMooooooMMo oMMooooooMMo oMMooooooMMo oMMMoooooMoo ooMMMoooMooo oooMMMMMoooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 150 (char 150) { oooooooooooo ooooooMooooo oooooMMMoooo ooooMMoMMooo oooMMoooMMoo oooooooooooo oMMMMooMMMMo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMMooMMMoo oooMMMMooMMo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 151 (char 151) { oooooooooooo oooooooooooo oooMMooooooo ooooMMoooooo oooooMMooooo oooooooooooo oMMMMooMMMMo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMMooMMMoo oooMMMMooMMo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 152 (char 152) { oooooooooooo oooooooooooo oooMMooMMooo oooMMooMMooo oooooooooooo oooooooooooo MMMMooooMMMM oMMoooooooMo ooMMoooooMoo ooMMoooooMoo oooMMoooMooo oooMMoooMooo ooooMMoMoooo ooooMMoMoooo oooooMMooooo oooooMMooooo oooooMoooooo ooooMMoooooo ooooMooooooo oMMMMooooooo oMMMoooooooo oooooooooooo } # tile 153 (char 153) { oooooooooooo oooMMooMMooo oooMMooMMooo oooooooooooo ooooMMMMMooo oooMoooMMMoo ooMoooooMMoo ooMooooooMMo oMMooooooMMo oMMooooooMMo oMMooooooMMo oMMooooooMMo ooMooooooMoo ooMMoooooMoo oooMMoooMooo ooooMMMMoooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 154 (char 154) { oooooooooooo oooMMooMMooo oooMMooMMooo MMMoooooooMM oMMoooooooMo oMMoooooooMo oMMoooooooMo oMMoooooooMo oMMoooooooMo oMMoooooooMo oMMoooooooMo oMMoooooooMo oMMoooooooMo oMMMoooooMoo ooMMMMMMMMoo oooMMMMMMooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 155 (char 155) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooMMooooo oooooMMooooo oooMMMMMMooo ooMMoMMoMMoo ooMooMMoMMoo oMMooMMooooo oMMooMMooooo oMMooMMooooo oMMooMMooooo oMMMoMMooMoo ooMMoMMoMMoo oooMMMMMMooo oooooMMooooo oooooMMooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 156 (char 156) { oooooooooooo oooooooooooo ooooMMMMMooo oooMMMooMMoo oooMMoooMMoo oooMMooooooo oooMMooooooo oooMMooooooo oMMMMMMooooo oMMMMMMooooo oooMMooooooo oooMMooooooo oooMMooooooo oooMMooooooo ooMMMMMoooMo oMMMMMMMMMMo oMMooooMMMoo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 157 (char 157) { oooooooooooo oooooooooooo oMMooooooMMo oMMooooooMMo ooMMooooMMoo oooMMooMMooo oooMMooMMooo ooooMMMMoooo oooooMMooooo oooMMMMMMooo oooooMMooooo oooMMMMMMooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 158 (char 158) { oooooooooooo oooooooooooo oMMMMMMMoooo oMMooooMMooo oMMoooooMMoo oMMoooooMMoo oMMooooMMooo oMMMMMMMoooo oMMooooooooo oMMooMMooooo oMMooMMooooo oMMoMMMMMooo oMMooMMooooo oMMooMMooooo oMMooMMooMMo oMMoooMMMMoo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 159 (char 159) { oooooooooooo oooooooooooo ooooooMMMMoo oooooMMooMMo oooooMMooMMo oooooMMooooo oooooMMooooo oooooMMooooo ooMMMMMMMMoo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oMMooMMooooo oMMooMMooooo ooMMMMoooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 160 (char 160) { oooooooooooo oooooooooooo oooooooMMooo ooooooMMoooo oooooMMooooo oooooooooooo ooooMMMMMooo oooMMoooMMoo oooMooooMMoo ooooooMMMMoo oooMMMooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMMooMMMoo oooMMMMoMMMo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 161 (char 161) { oooooooooooo oooooooooooo oooooooMMooo ooooooMMoooo oooooMMooooo oooooooooooo oooMMMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooMMMMMMooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 162 (char 162) { oooooooooooo oooooooooooo oooooooMMooo ooooooMMoooo oooooMMooooo oooooooooooo ooooMMMMMooo oooMoooMMMoo ooMoooooMMMo oMMooooooMMo oMMooooooMMo oMMooooooMMo oMMooooooMMo oMMMoooooMoo ooMMMoooMooo oooMMMMMoooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 163 (char 163) { oooooooooooo oooooooooooo oooooooMMooo ooooooMMoooo oooooMMooooo oooooooooooo oMMMMooMMMMo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMMooMMMoo oooMMMMooMMo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 164 (char 164) { oooooooooooo oooMMMoooMoo ooMMMMMMMMoo ooMoooMMMooo oooooooooooo oooooooooooo ooMooMMMMooo oMMMMooMMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo oMMMMooMMMMo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 165 (char 165) { oooooooooooo oooMMMoooMoo ooMMMMMMMMoo ooMoooMMMooo MMoooooooMMM oMMoooooooMo oMMMooooooMo oMMMMoooooMo oMoMMMooooMo oMooMMMoooMo oMoooMMMooMo oMooooMMMoMo oMoooooMMMMo oMooooooMMMo oMoooooooMMo MMMoooooooMM oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 166 (char 166) { oooooooooooo oooooooooooo oooMMMMMoooo ooMMoooMMooo oooooooMMooo oooooMMMMooo oooMMooMMooo ooMMoooMMooo ooMMoooMMooo ooMMooMMMooo oooMMMoMMMoo oooooooooooo ooMMMMMMMMoo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 167 (char 167) { oooooooooooo oooooooooooo oooooMMMoooo oooMMooMMooo oooMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMooo oooMMooMMooo ooooMMMooooo oooooooooooo ooMMMMMMMMoo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 168 (char 168) { oooooooooooo ooooooMMoooo ooooooMMoooo oooooooooooo oooooooooooo ooooooMMoooo ooooooMMoooo oooooMMooooo ooooMMoooooo oooMMooooooo ooMMoooooooo ooMMoooooooo ooMMoooooMoo ooMMMooMMMoo oooMMMMMMooo ooooMMMMoooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 169 (char 169) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo ooMMMMMMMMoo ooMMMMMMMMoo ooMMoooooooo ooMMoooooooo ooMMoooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 170 (char 170) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo ooMMMMMMMMoo ooMMMMMMMMoo ooooooooMMoo ooooooooMMoo ooooooooMMoo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 171 (char 171) { oooooooooooo oooooooooooo oooMoooooooo ooMMoooooooo oooMoooooooo oooMoooooMoo oooMooooMooo oooMoooMoooo ooMMMoMooooo oooooMoMMMoo ooooMoMoooMo oooMooooooMo ooMoooooMMoo oMoooooMoooo ooooooMooooo ooooooMMMMMo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 172 (char 172) { oooooooooooo oooooooooooo oooMoooooooo ooMMoooooooo oooMoooooooo oooMoooooMoo oooMooooMooo oooMoooMoooo ooMMMoMooMoo oooooMooMMoo ooooMooMoMoo oooMooMooMoo ooMooMoooMoo oMoooMMMMMMo oooooooooMoo oooooooooMoo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 173 (char 173) { oooooooooooo oooooMMooooo oooooMMooooo oooooooooooo oooooooooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 174 (char 174) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooMMooMMo ooooMMooMMoo oooMMooMMooo ooMMooMMoooo oMMooMMooooo ooMMooMMoooo oooMMooMMooo ooooMMooMMoo oooooMMooMMo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 175 (char 175) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oMMooMMooooo ooMMooMMoooo oooMMooMMooo ooooMMooMMoo oooooMMooMMo ooooMMooMMoo oooMMooMMooo ooMMooMMoooo oMMooMMooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 176 (char 176) { ooooMMooooMM ooooMoooooMo oMMooooMMooo ooMoooooMooo ooooMMooooMM ooooMoooooMo oMMooooMMooo ooMoooooMooo ooooMMooooMM ooooMoooooMo oMMooooMMooo ooMoooooMooo ooooMMooooMM ooooMoooooMo oMMooooMMooo ooMoooooMooo ooooMMooooMM ooooMoooooMo oMMooooMMooo ooMoooooMooo ooooMMooooMM ooooMoooooMo } # tile 177 (char 177) { oMMMoMMMoMMM ooMoooMoooMo MoooMoooMooo MMoMMMoMMMoM MoooMoooMooo ooMoooMoooMo oMMMoMMMoMMM ooMoooMoooMo MoooMoooMooo MMoMMMoMMMoM MoooMoooMooo ooMoooMoooMo oMMMoMMMoMMM ooMoooMoooMo MoooMoooMooo MMoMMMoMMMoM MoooMoooMooo ooMoooMoooMo oMMMoMMMoMMM ooMoooMoooMo MoooMoooMooo MMoMMMoMMMoM } # tile 178 (char 178) { MMMMooMMMMoo MMMMoMMMMMoM MooMMMMooMMM MMoMMMMMoMMM MMMMooMMMMoo MMMMoMMMMMoM MooMMMMooMMM MMoMMMMMoMMM MMMMooMMMMoo MMMMoMMMMMoM MooMMMMooMMM MMoMMMMMoMMM MMMMooMMMMoo MMMMoMMMMMoM MooMMMMooMMM MMoMMMMMoMMM MMMMooMMMMoo MMMMoMMMMMoM MooMMMMooMMM MMoMMMMMoMMM MMMMooMMMMoo MMMMoMMMMMoM } # tile 179 (char 179) { oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo } # tile 180 (char 180) { oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo MMMMMMMooooo MMMMMMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo } # tile 181 (char 181) { oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo MMMMMMMooooo MMMMMMMooooo oooooMMooooo MMMMMMMooooo MMMMMMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo } # tile 182 (char 182) { ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo MMMMMMoMMooo MMMMMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo } # tile 183 (char 183) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo MMMMMMMMMooo MMMMMMMMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo } # tile 184 (char 184) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo MMMMMMMooooo MMMMMMMooooo oooooMMooooo MMMMMMMooooo MMMMMMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo } # tile 185 (char 185) { ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo MMMMMMoMMooo MMMMMMoMMooo oooooooMMooo MMMMMMoMMooo MMMMMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo } # tile 186 (char 186) { ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo } # tile 187 (char 187) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo MMMMMMMMMooo MMMMMMMMMooo oooooooMMooo MMMMMMoMMooo MMMMMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo } # tile 188 (char 188) { ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo MMMMMMoMMooo MMMMMMoMMooo oooooooMMooo MMMMMMMMMooo MMMMMMMMMooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 189 (char 189) { ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo MMMMMMMMMooo MMMMMMMMMooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 190 (char 190) { oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo MMMMMMMooooo MMMMMMMooooo oooooMMooooo MMMMMMMooooo MMMMMMMooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 191 (char 191) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo MMMMMMMooooo MMMMMMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo } # tile 192 (char 192) { oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMMMMMM oooooMMMMMMM oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 193 (char 193) { oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo MMMMMMMMMMMM MMMMMMMMMMMM oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 194 (char 194) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo MMMMMMMMMMMM MMMMMMMMMMMM oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo } # tile 195 (char 195) { oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMMMMMM oooooMMMMMMM oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo } # tile 196 (char 196) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo MMMMMMMMMMMM MMMMMMMMMMMM oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 197 (char 197) { oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo MMMMMMMMMMMM MMMMMMMMMMMM oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo } # tile 198 (char 198) { oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMMMMMM oooooMMMMMMM oooooMMooooo oooooMMMMMMM oooooMMMMMMM oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo } # tile 199 (char 199) { ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMMMM ooooMMoMMMMM ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo } # tile 200 (char 200) { ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMMMM ooooMMoMMMMM ooooMMoooooo ooooMMMMMMMM ooooMMMMMMMM oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 201 (char 201) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo ooooMMMMMMMM ooooMMMMMMMM ooooMMoooooo ooooMMoMMMMM ooooMMoMMMMM ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo } # tile 202 (char 202) { ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo MMMMMMoMMMMM MMMMMMoMMMMM oooooooooooo MMMMMMMMMMMM MMMMMMMMMMMM oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 203 (char 203) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo MMMMMMMMMMMM MMMMMMMMMMMM oooooooooooo MMMMMMoMMMMM MMMMMMoMMMMM ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo } # tile 204 (char 204) { ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMMMM ooooMMoMMMMM ooooMMoooooo ooooMMoMMMMM ooooMMoMMMMM ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo } # tile 205 (char 205) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo MMMMMMMMMMMM MMMMMMMMMMMM oooooooooooo MMMMMMMMMMMM MMMMMMMMMMMM oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 206 (char 206) { ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo MMMMMMoMMMMM MMMMMMoMMMMM oooooooooooo MMMMMMoMMMMM MMMMMMoMMMMM ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo } # tile 207 (char 207) { oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo MMMMMMMMMMMM MMMMMMMMMMMM oooooooooooo MMMMMMMMMMMM MMMMMMMMMMMM oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 208 (char 208) { ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo MMMMMMMMMMMM MMMMMMMMMMMM oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 209 (char 209) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo MMMMMMMMMMMM MMMMMMMMMMMM oooooooooooo MMMMMMMMMMMM MMMMMMMMMMMM oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo } # tile 210 (char 210) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo MMMMMMMMMMMM MMMMMMMMMMMM ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo } # tile 211 (char 211) { ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMMMMMMM ooooMMMMMMMM oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 212 (char 212) { oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMMMMMM oooooMMMMMMM oooooMMooooo oooooMMMMMMM oooooMMMMMMM oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 213 (char 213) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooMMMMMMM oooooMMMMMMM oooooMMooooo oooooMMMMMMM oooooMMMMMMM oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo } # tile 214 (char 214) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo ooooMMMMMMMM ooooMMMMMMMM ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo } # tile 215 (char 215) { ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo MMMMMMMMMMMM MMMMMMMMMMMM ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo ooooMMoMMooo } # tile 216 (char 216) { oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo MMMMMMMMMMMM MMMMMMMMMMMM oooooMMooooo MMMMMMMMMMMM MMMMMMMMMMMM oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo } # tile 217 (char 217) { oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo MMMMMMMooooo MMMMMMMooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 218 (char 218) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooMMMMMMM oooooMMMMMMM oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo } # tile 219 (char 219) { MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM } # tile 220 (char 220) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM } # tile 221 (char 221) { MMMMMMoooooo MMMMMMoooooo MMMMMMoooooo MMMMMMoooooo MMMMMMoooooo MMMMMMoooooo MMMMMMoooooo MMMMMMoooooo MMMMMMoooooo MMMMMMoooooo MMMMMMoooooo MMMMMMoooooo MMMMMMoooooo MMMMMMoooooo MMMMMMoooooo MMMMMMoooooo MMMMMMoooooo MMMMMMoooooo MMMMMMoooooo MMMMMMoooooo MMMMMMoooooo MMMMMMoooooo } # tile 222 (char 222) { ooooooMMMMMM ooooooMMMMMM ooooooMMMMMM ooooooMMMMMM ooooooMMMMMM ooooooMMMMMM ooooooMMMMMM ooooooMMMMMM ooooooMMMMMM ooooooMMMMMM ooooooMMMMMM ooooooMMMMMM ooooooMMMMMM ooooooMMMMMM ooooooMMMMMM ooooooMMMMMM ooooooMMMMMM ooooooMMMMMM ooooooMMMMMM ooooooMMMMMM ooooooMMMMMM ooooooMMMMMM } # tile 223 (char 223) { MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM MMMMMMMMMMMM oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 224 (char 224) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooMMMoooMMo ooMMoMMoMMoo oMMoooMMMooo oMMoooMMMooo oMMoooMMoooo oMMoooMMoooo oMMoooMMMooo oMMoooMMMooo ooMMoMMoMMoo oooMMMoooMMo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 225 (char 225) { oooooooooooo oooooooooooo ooooMMMMoooo oooMMooMMooo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMoooMMooo ooMMoMMMMooo ooMMoooMMooo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMoooMMooo oMMMoMMMoooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 226 (char 226) { oooooooooooo oooooooooooo oMMMMMMMMMoo oMMoooooMMoo oMMoooooMMoo oMMooooooooo oMMooooooooo oMMooooooooo oMMooooooooo oMMooooooooo oMMooooooooo oMMooooooooo oMMooooooooo oMMooooooooo oMMooooooooo oMMooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 227 (char 227) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooMMo ooMMMMMMMMoo oMoMMooMMooo oooMMooMMooo oooMMooMMooo oooMMooMMooo oooMMooMMooo oooMMooMMooo ooMMoooMMooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 228 (char 228) { oooooooooooo oooooooooooo oMMMMMMMMMMo oMMooooooMMo ooMMoooooMMo oooMMooooooo ooooMMoooooo oooooMMooooo ooooooMMoooo ooooooMMoooo oooooMMooooo ooooMMoooooo oooMMooooooo ooMMoooooMMo oMMooooooMMo oMMMMMMMMMMo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 229 (char 229) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooMMMMMMMMo ooMMMooMoooo oMMMooooMooo oMMoooooMMoo oMMoooooMMoo oMMoooooMMoo oMMoooooMMoo ooMooooMMMoo oooMooMMMooo ooooMMMMoooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 230 (char 230) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMMooMMMoo ooMMoMMoMMMo ooMMoooooooo ooMMoooooooo oMMooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 231 (char 231) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo ooMMMooooMMo oMMoMMooMMoo oMMoMMoMMooo oooooMMMoooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 232 (char 232) { oooooooooooo oooooooooooo oMMMMMMMMMMo ooooMMMMoooo oooMMooMMooo ooMMooooMMoo oMMooooooMMo oMMooooooMMo oMMooooooMMo oMMooooooMMo oMMooooooMMo oMMooooooMMo ooMMooooMMoo oooMMooMMooo ooooMMMMoooo oMMMMMMMMMMo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 233 (char 233) { oooooooooooo oooooooooooo ooooMMMooooo oooMMoMMoooo ooMMoooMMooo oMMoooooMMoo oMMoooooMMoo oMMoooooMMoo oMMMMMMMMMoo oMMMMMMMMMoo oMMoooooMMoo oMMoooooMMoo oMMoooooMMoo ooMMoooMMooo oooMMoMMoooo ooooMMMooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 234 (char 234) { oooooooooooo oooooooooooo ooooMMMMoooo oooMMooMMooo ooMMooooMMoo oMMooooooMMo oMMooooooMMo oMMooooooMMo oMMooooooMMo ooMMooooMMoo oooMMooMMooo oooMMooMMooo oooMMooMMooo oooMMooMMooo oooMMooMMooo oMMMMooMMMMo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 235 (char 235) { oooooooooooo oooooooooooo ooMoooMooooo ooMMoMMooooo oooMMMoooooo oooMMMoooooo ooMMoMMooooo ooMoooMMoooo ooooMMMMMooo oooMMooMMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo oooMMooMMooo ooooMMMMoooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 236 (char 236) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo ooooMMMMoMoo oooMMooMMMoo ooMMoooMMMoo ooMMooMMMMoo ooMMoMMoMMoo ooMMoMMoMMoo ooMMMMooMMoo oooMMooMMooo ooMMMMMMoooo ooMooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 237 (char 237) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooMoo ooooMMMMMMoo oooMMooMMooo ooMMoooMMMoo ooMMooMoMMoo ooMMooMoMMoo ooMMoMooMMoo ooMMoMooMMoo ooMMoMooMMoo ooMMMoooMMoo oooMMooMMooo ooMMMMMMoooo ooMooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 238 (char 238) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo ooooMMMMMooo oooMMooooooo ooMMoooooooo ooMMoooooooo ooMMoooooooo ooMMMMMMoooo ooMMoooooooo ooMMoooooooo ooMMoooooooo oooMMooooooo ooooMMMMMooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 239 (char 239) { oooooooooooo oooooooooooo ooooMMMMoooo oooMMooMMooo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 240 (char 240) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oMMMMMMMMMoo oMMMMMMMMMoo oooooooooooo oooooooooooo oMMMMMMMMMoo oMMMMMMMMMoo oooooooooooo oooooooooooo oMMMMMMMMMoo oMMMMMMMMMoo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 241 (char 241) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oMMMMMMMMMMo oMMMMMMMMMMo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooooooooo oMMMMMMMMMMo oMMMMMMMMMMo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 242 (char 242) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oMMooooooooo ooMMMooooooo ooooMMMooooo ooooooMMMooo ooooooooMMMo ooooooMMMooo ooooMMMooooo ooMMMooooooo oMMooooooooo oooooooooooo oMMMMMMMMMMo oMMMMMMMMMMo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 243 (char 243) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooMMo oooooooMMMoo oooooMMMoooo oooMMMoooooo oMMMoooooooo oooMMMoooooo oooooMMMoooo oooooooMMMoo oooooooooMMo oooooooooooo oMMMMMMMMMMo oMMMMMMMMMMo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 244 (char 244) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo ooooooMMMMoo oooooMMooMMo oooooMMooMMo oooooMMooMMo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo } # tile 245 (char 245) { oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oMMooMMooooo oMMooMMooooo oMMooMMooooo ooMMMMoooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 246 (char 246) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooMMooooo oooooMMooooo oooooooooooo oooooooooooo oMMMMMMMMMMo oMMMMMMMMMMo oooooooooooo oooooooooooo oooooMMooooo oooooMMooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 247 (char 247) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooMMMooooMo ooMMMMMooMMo oMMooMMMMMoo oMooooMMMooo oooooooooooo oooooooooooo oooMMMooooMo ooMMMMMooMMo oMMooMMMMMoo oMooooMMMooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 248 (char 248) { oooooooooooo ooooMMMMoooo oooMMooMMooo oooMMooMMooo oooMMooMMooo ooooMMMMoooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 249 (char 249) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooMMooooo ooooMMMMoooo ooooMMMMoooo oooooMMooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 250 (char 250) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooMMooooo oooooMMooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 251 (char 251) { oooooMMMMMMM oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo oooooMMooooo MMoooMMooooo oMMooMMooooo ooMMoMMooooo oooMMMMooooo ooooMMMooooo oooooMMooooo oooooooooooo oooooooooooo oooooooooooo } # tile 252 (char 252) { oooooooooooo oooooooooooo ooMooMMMoooo oMMMMMMMMooo oMMMMooMMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo ooMMooooMMoo oMMMMooMMMMo oMMMMooMMMMo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 253 (char 253) { oooooooooooo ooooMMMMoooo oooMMMMMMooo ooMMoooMMooo ooMooooMMooo ooooooMMoooo oooooMMooooo ooooMMoooooo oooMMooooMoo ooMMMMMMMMoo ooMMMMMMMMoo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 254 (char 254) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo ooMMMMMMMMoo ooMMMMMMMMoo ooMMMMMMMMoo ooMMMMMMMMoo ooMMMMMMMMoo ooMMMMMMMMoo ooMMMMMMMMoo ooMMMMMMMMoo ooMMMMMMMMoo ooMMMMMMMMoo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } # tile 255 (char 255) { oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo oooooooooooo } slashem-0.0.7E7F3/win/gl/logo.txt0000664000076400007640000017507110545462317014567 0ustar alialiA = (0, 0, 0) B = (255, 0, 32) C = (128, 64, 72) D = (255, 64, 88) E = (192, 128, 136) F = (64, 0, 8) G = (128, 128, 128) H = (255, 192, 200) I = (255, 128, 144) J = (128, 0, 16) K = (192, 0, 25) L = (255, 255, 255) M = (64, 64, 64) N = (192, 64, 80) O = (192, 192, 192) # tile 0 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 1 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 2 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 3 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 4 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 5 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 6 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 7 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 8 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 9 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 10 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 11 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 12 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 13 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 14 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 15 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 16 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 17 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 18 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 19 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 20 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 21 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 22 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 23 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 24 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 25 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 26 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 27 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 28 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 29 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAMOL AAAAAAAAAAAMOLLL AAAAAAAAAAOLLLIB AAAAAAAAMOLLIBBB AAAAAAAMLLLDBBBB AAAAAAMLLHBBBBBB AAAAAAOLHBBBBBBB AAAAAGLLBBBBBBBF AAAAALLDBBBBBBKA AAAAGLHBBBBBBKAA AAAALLDBBBBBBFAA } # tile 30 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAGGGGGGGGGGGG GOLLLLLLLLLLLLLL LLLIIDBBBBBBBBBD IDBBBBBBBBBBBBBB BBBBBBBBBBBBBBBB BBBBBBJJJJJJJLII BBBJFAAAAAAAAAAG BKAAAAAAAAAAAAAA JAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 31 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA LLLGGAAAAAAAAAAA IIHLLLOGAAAAAAAA BBBBDILLLGAAAAAA BBBBBBBDHLLMAAAA DBBBBBBBBDHLGAAA LHBBBBBBBBBICAAA MOLDBBBBBBBBJAAA AAOLDBBBBBBBJAAA AAALHBBBBBBBAAAA AAAMLIBBBBBBAAAA AAAALHBBBBBJAAAA AAAAGLBBBBBJAAAA } # tile 32 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAGGG AAAAAAAAALLLLLLL AAAAAAAAMLHIIIDB AAAAAAAAGLIBBBBB AAAAAAAAGLDIBBBB AAAAAAAAAAMGJJEL AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAG AAAAAAAAAAAAAAAG AAAAAAAAAAAAAAAL AAAAAAAAAAAAAAAL } # tile 33 (logo) { AAAAMGGGLLLLLAAA OLLLLLLLLHIIIAAA LLIIIIBBBBBBKAAA BBBBBBBBBBBBJAAA BBBBBBBBBBBBFAAA BBBBBBBBBBBBAAAA IDBBBBBBBBBKAAAA OLBBBBBBBBBJAAAA GLBBBBBBBBBFAAAA GLBBBBBBBBBAAAAA LLBBBBBBBBKAAAAA LHBBBBBBBBJAAAAA LIBBBBBBBBFAAAAA LDBBBBBBBBAAAAAA LBBBBBBBBKAAAAAA HBBBBBBBBJAAAAAA } # tile 34 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 35 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 36 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 37 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 38 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 39 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 40 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAMGGGLLL AAAAAGLLLLLLLLHI AAAAALLIIIIBBBBB AAAAALHBBBBBBBBB AAAAALHIBBBBBBBB AAAAAAMGJJJLHIBB AAAAAAAAAAAAMLIB AAAAAAAAAAAAALIB AAAAAAAAAAAAGLIB AAAAAAAAAAAAGLDB AAAAAAAAAAAAOLBB AAAAAAAAAAAALLBB AAAAAAAAAAAMLIBB AAAAAAAAAAAGLIBB AAAAAAAAAAAGLBBB } # tile 41 (logo) { MGGGOLLLLMAAAAAA LLLLLLIIHGAAAAAA IIBBBBBBBFAAAAAA BBBBBBBBBAAAAAAA BBBBBBBBKAAAAAAA BBBBBBBBJAAAAAAA BBBBBBBBFAAAAAAA BBBBBBBBAAAAAAAA BBBBBBBKAAAAAAAA BBBBBBBJAAAAAAAA BBBBBBBFAAAAAAAA BBBBBBBAAAAAAAAA BBBBBBKAAAAAAAAA BBBBBBJAAAAAAAAA BBBBBBFAAAAAAAAA BBBBBBAAAAAAAAAA } # tile 42 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 43 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 44 (logo) { AAAAAAAAMOLLLLLL AAAAAAAMLLLIIIIH AAAAAAALLHBBBBBB AAAAAAMLHBBBBBBB AAAAAAGLIBBBBBBB AAAAAAGLBBBBBBBB AAAAAAGLBBBBBBBB AAAAAAGLBBBBBBBB AAAAAAOLBBBBBBBB AAAAAALLBBBBBBBB AAAAAALIBBBBBBBB AAAAAALIBBBBBBBJ AAAAAALIBBBBBBBF AAAAAALIBBBBBBBA AAAAAALIBBBBBBJA AAAAAALIBBBBBBFA } # tile 45 (logo) { GAAAAAAAAAAAAAAA LOAAAAAAAAAAAAAA DLAAAAAAAAAAAAAA BBAAAAAAAAAAAAAA BBAAAAAAAAAAAAAA BKAAAAAAAGLLLLLL BJAAAAAAAGLIIIII BAAAAAAAAGLBBBBB KAAAAAAAAGLBBBBB JAAAAAAAAMGJJJJJ AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 46 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA LLLLLLLLLLLLLLLL IIIIIIIIIIIIIIII BBBBBBBBBBBBBBBB BBBBBBBBBBBBBBBB LHDBBBBBBBBBBBBB AOLBBBBBBBBBBKAA AGLBBBBBBBBBBAAA AGLBBBBBBBBBBAAA AOLBBBBBBBBBJAAA ALLBBBBBBBBBJAAA MLIBBBBBBBBBAAAA } # tile 47 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA LLLLLLLLLLLLLLLL IIIIIIIIIIIIIIII BBBBBBBBBBBBBBBB BBBBBBBBBBBBBBBB BBBBBBBBBBBBBBBB AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 48 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA LLLLLLLLLLLLLLAA IIIIIIIIIIIIIIAA BBBBBBBBBBBBBJAA BBBBBBBBBBBBBJAA IDBBBBBBBBBBBFAA GCLHDBBBBBBBBAAA AAAGLHBBBBBBKAAA AAAAMLIBBBBBJAAA AAAAAOLBBBBBJAAA AAAAAMLIBBBBAAAA AAAAAALIBBBBAAAA } # tile 49 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAMLLLLLLLLLLL AAAAGLHIIIIIIIII AAAAGLBBBBBBBBBB AAAAGLBBBBBBBBBB AAAAMGJJJLIDIBBB AAAAAAAAAAAMLHBB AAAAAAAAAAAAGLBB AAAAAAAAAAAAGLBB AAAAAAAAAAAAOLBB AAAAAAAAAAAALLBB AAAAAAAAAAAMLIBB } # tile 50 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA LLLLLLLLLLAAAAAA IIIIIIIIIIAAAAAA BBBBBBBBBIGAAAAA BBBBBBBBBDCAAAAA BBBBBBBBBBEAAAAA BBBBBBBBBBLAAAAA BBBBBBBBBBBAAAAA BBBBBBBBBBIGAAAA BBBBBBBBBBDCAAAA BDDBBBBBBBBEAAAA BIHBBBBBBBBLAAAA } # tile 51 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 52 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 53 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAMLLLLLLLLL AAAAAAOLHIIIIIII AAAAAGLLBBBBBBBB AAAAALLDBBBBBBBB AAAAOLHBBBBBBBBB AAAMLLDBBBBBBBBB AAAOLIBBBBBBBBBB AAGLLBBBBBBBBBBB AMLLDBBBBBBBBBBB AOLHBBBDDBBBBBBB MLLBBBBHIBBBBBBB } # tile 54 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA LLLLLLLLLLLLAAAA IIIIIIIIIIIIAAAA BBBBBBBBBBBBAAAA BBBBBBBBBBBJAAAA BBBBBJJJJJJFAAAA BBBKAAAAAAAAAAAA BBKAAAAAAAAAAAAA BBFAAAAAAAAAAAAA BBAAAAAAAAAAAAAA BKAAAAAAAAAAAAAA BJAAAAAAAAAAAAAA } # tile 55 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 56 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 57 (logo) { AAAGLHBBBBBBBAAA AAAOLDBBBBBBJAAA AAALLBBBBBBBJAAA AAMLIBBBBBBBFAAA AAGLIBBBBBBBAAAA AAGLBBBBBBBIGAAA AAGLBBBBBBBDCAAA AAGLBBBBBBBBEAAA AAGLBBBBBBBBLMAA AAGLBBBBBBBBIOAA AAGLBBBBBBBBBLOA AAGLBBBBBBBBBDLO AAMLIBBBBBBBBBDL AAALHBBBBBBBBBBD AAAGLBBBBBBBBBBB AAAMLIBBBBBBBBBB } # tile 58 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA OAAAAAAAAAAAAAAA LOMAAAAAAAAAAAAA DLLGAAAAAAAAAAAA BBHLOMAAAAAAAAAA } # tile 59 (logo) { AAAAGLDBBBBAAAAA AAAAALIBBBKAAAAA AAAAALIBBBJAAAAA AAAAALIBBBFAAAAA AAAAALIBBBAAAAAA AAAAALIBBKAAAAAA AAAAALIBBJAAAAAA AAAAALIBBFAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 60 (logo) { AAAAAAAAAAAAAAGL AAAAAAAAAAAAAAGL AAAAAAAAAAAAAALL AAAAAAAAAAAAAALH AAAAAAAAAAAAAGLI AAAAAAAAAAAAAGLD AAAAAAAAAAAAALLB AAAAAAAAAAAAALHB AAAAAAAAAAAAGLIB AAAAAAAAAAAAGLDB AAAAAAAAAAAALLBB AAAAAAAAAAAALHBB AAAAAAAAAAAGLIBB AAAAAAAAAAAGLDBB AAAAAAAAAAALLBBB AAAAAAAAAAALHBBB } # tile 61 (logo) { IBBBBBBBBFAAAAAA DBBBBBBBBAAAAAAA BBBBBBBBKAAAAAAA BBBBBBBBJAAAAAAA BBBBBBBBFAAAAAAA BBBBBBBBAAAAAAAA BBBBBBBKAAAAAAAA BBBBBBBJAAAAAAAA BBBBBBBFAAAAAAAA BBBBBBBAAAAAAAAA BBBBBBKAAAAAAAAA BBBBBBJAAAAAAAAA BBBBBBFAAAAAAAAA BBBBBBAAAAAAAAAA BBBBBKAAAAAAAAAA BBBBBJAAAAAAAAAA } # tile 62 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAG AAAAAAAAAAAAAMOL AAAAAAAAAAAAMLLL AAAAAAAAAAAOLLHB } # tile 63 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAMGGOLLLL AAAAAGOLLLLLLIII AAAGLLLLIIBBBBBB AGLLLHDBBBBBBBBB LLLHDBBBBBBBBBBB LHDBBBBBBBBBJJAA DBBBBBBBBKJAAAAA BBBBBBBBJAAAAAAA } # tile 64 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA LLLOGMAAAAAAAAAA IIILLLOLLLLLLLLL BBBBBILLHIIIIIII BBBBBBBIDBBBBBBB BBIDBBBBBBBBBBBB AAGCLHBBBBBBBBBB AAAAMOLBBBBBBBBB AAAAAOLBBBBBBBBJ } # tile 65 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA LAAAAAAAAAAAAAAA IAAAAAAAAAAAAAAA KAAAAAAAAAAAAAAA JAAAAAAAAAAAAAAA FAAAAAAAAAAAAAAO AAAAAAAAAAAAAAGL AAAAAAAAAAAAAMLL } # tile 66 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAMGGLLLLLLL AAAAGLLLLLHIIIII AAGLLLHIBBBBBBBB AOLLHDBBBBBBBBBB OLLDBBBBBBBDIBBB LLDBBBBKJAAMOLIB LDBBBBKAAAAAAMLH DBBBBKAAAAAAAAML } # tile 67 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA LGGMAAAAAAAAAAAA HLLLOGAAAAAAAAAA BBBILLOMAAAAAAAA BBBBBDLLMAAAAAAA BBBBBBBHLMAAAAAA BBBBBBBBHOAAAAAA BBBBBBBBBLMAAAAA HBBBBBBBBIGAAAAA } # tile 68 (logo) { AAAAAAAAAAALLBBB AAAAAAAAAAALHBBB AAAAAAAAAAGLIBBB AAAAAAAAAAGLDBBB AAAAAAAAAAOLBBBB AAAAAAAAAALLBBBB AAAAAAAAAMLIBBBB AAAAAAAAAGLIBBBB AAAAAAAAAGLBBBBB AAAAAAAAALLBBBBB AAAAAAAAALHBBBBB AAAAAAAAGLIBBBBB AAAAAAAAGLDBBBBB AAAAAAAAOLBBBBBB AAAAAAAALLBBBBBB AAAAAAAMLIBBBBBB } # tile 69 (logo) { BBBBBKAAAAAAAAAA BBBBBJAAAAAAAAAA BBBBBFAAAAAAAAAA BBBBBAAAAAAAAAAA BBBBBAAAAAAAAAAA BBBBJAAAAAAAAAAA BBBBJAAAAAAAAAAA BBBBAAAAAAAAAAAA BBBBAAAAAAAAAAAA BBBJAAAAAAAAAAAA BBBJAAAAAAAAAAMO BBBAAAAAAAAAAOLL BBBAAAAAAAAMLLLI BBJAAAAAAAGLLHDB BBJAAAAAAOLLHBBB BBAAAAAAOLLDBBBB } # tile 70 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAGGLLLLLLOGAAA MOLLLLHIIIILLLGA LLLIDBBBBBBBDHLG LIBBBBBBBBBBBBDL BBBBBBBBBBBBBBBH BBBBBBBBBBBBBBBD BBBJLHDBBBBBBBBB JAAAAOLDBBBBBBBB } # tile 71 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA GAAAAAAAAAAAAAAA LAAAAAAAAAAAAAAA IAAAAAAAAAAAAAAA BAAAAAAAAAAAAAAA } # tile 72 (logo) { AAAAAALIBBBBBBAA AAAAAGLIBBBBBJAA AAAAAGLDBBBBBAAA AAAAAGLBBBBBKAAA AAAAAGLBBBBBJAAA AAAAAGLBBBBBAAAA AAAAAGLBBBBKAAAA AAAAAGLBBBBJAAAA AAAAAGLBBBBAAAAA AAAAAOLBBBJAAAAA AAAAALLBBBFAAAAA AAAAALIBBBAAAAAA AAAAAGCJJFAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 73 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAG AAAAAAAAAAAAAAAG AAAAAAAAAAAAAAAL AAAAAAAAAAAAAAAL AAAAAAAAAAAAAAML AAAAAAAAAAAAAAGL AAAAAAAAAAAAAAOL AAAAAAAAAAAAAALL AAAAAAAAAAAAAALI AAAAAAAAAAAAAGLI AAAAAAAAAAAAAGLD AAAAAAAAAAAAALLB } # tile 74 (logo) { GLIBBBBBBBBBAAAA GLBBBBBBBBBKAAAA LLBBBBBBBBBJAAAA LHBBBBBBBBBFAAAA LIBBBBBBBBBAAAAA LDBBBBBBBBKAAAAA LBBBBBBBBBJAAAAA HBBBBBBBBBJAAAAA IBBBBBBBBBAAAAAA IBBBBBBBBBAAAAAA BBBBBBBBBJAAAAAA BBBBBBBBBJAAAAAA BBBBBBBBBAAAAAAA BBBBBBBBBAAAAAAA BBBBBBBBKAAAAAAA BBBBBBBBJAAAAAAA } # tile 75 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAM AAAAAAAAAAAAAAAL AAAAAAAAAAAAAAGL AAAAAAAAAAAAAAOL AAAAAAAAAAAAAMLL } # tile 76 (logo) { AAAAAALIBBBJAAAA AAAAAALIBBBJAAAA AAAAAALIBBBAAAAA AAAAAALIBBBAAAAA AAAAAALIBBKAAAAA AAAAAGLIBBJAAAAA AAAAAGLDBBFAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA GGGMAAAAAAAAAAAA LLLGAAAAAAAAAAAA HBBJAAAAAAAAAAAA DBBJAAAAAAAAAAAA BBBFAAAAAAAAAAAA } # tile 77 (logo) { AAAAAAAAAAAGLIBB AAAAAAAAAAAGLBBB AAAAAAAAAAALLBBB AAAAAAAAAAALHBBB AAAAAAAAAAGLIBBB AAAAAAAAAAGLDBBB AAAAAAAAAALLBBBB AAAAAAAAAALHBBBB AAAAAAAAAMLIBBBB AAAAAAAAAGLIBBBB AAAAAAAAAOLBBBBK AAAAAAAAALLBBBBJ AAAAAAAAMLIBBBBF AAAAAAAAGLIBBBBA AAAAAAAAGLBBBBKA AAAAAAAALLBBBBJA } # tile 78 (logo) { BILBBBBBBBBDMAAA BILBBBBBBBBIGAAA BNLIBBBBBBBBJAAA BFLIBBBBBBBBLAAA BALHBBBBBBBBIAAA BAGLBBBBBBBBDMAA JAGLBBBBBBBBIGAA JAMLIBBBBBBBBEAA AAALIBBBBBBBBLAA AAALHBBBBBBBBBAA AAAGLBBBBBBBBIGA AAAGLBBBBBBBBDCA AAAMLIBBBBBBBBLA AAAALIBBBBBBBBIA AAAALHBBBBBBBBDM AAAAGLBBBBBBBBIG } # tile 79 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 80 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAO AAAAAAAAAAAAAAML AAAAAAAAAAAAAALL AAAAAAAAAAAAAOLH AAAAAAAAAAAAMLLD AAAAAAAAAAAAOLIB AAAAAAAAAAAGLLBB AAAAAAAAAAMLLDBB AAAAAAAAAAOLHBBB AAAAAAAAAGLLBBBB AAAAAAAAMLLDBBBB AAAAAAAAOLHBBBBF AAAAAAAGLLBBBBKA AAAAAAMLLDBBBBAA AAAAAAOLHBBBBJAA } # tile 81 (logo) { LLIBBBILIBBBBBBB LHBBBBHLBBBBBBBB LDBBBBLLBBBBBBBB IBBBBCLIBBBBBBBB BBBBKGLIBBBBBBBB BBBBAOLBBBBBBBBB BBBFALLBBBBBBBBB BBKAMLIBBBBBBBBK BBAAGLIBBBBBBBBJ BFAAGLBBBBBBBBBF KAAALLBBBBBBBBBA AAAALHBBBBBBBBKA AAAGLIBBBBBBBBJA AAAGLDBBBBBBBBJA AAALLBBBBBBBBBAA AAALHBBBBBBBBBAA } # tile 82 (logo) { BFAAAAAAAAAAAAAA BAAAAAAAAAAAAAAA BAAAAAAAAAAAAAAA JAAAAAAAAAAAAAAA JAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 83 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 84 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 85 (logo) { AAAAOLBBBBBBBBBB AAAAMLHBBBBBBBBB AAAAAGLDBBBBBBBB AAAAAAOLDBBBBBBB AAAAAAAOLDBBBBBB AAAAAAAAOLDBBBBB AAAAAAAAAGLHBBBB AAAAAAAAAAMOLDBB AAAAAAAAAAAAGLHD AAAAAAAAAAAAAAOL AAAAAAAAAAAAAAAM AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 86 (logo) { BBBDLLOMAAAAAAAA BBBBBILLOMAAAAAA BBBBBBBILLOAAAAA BBBBBBBBBILLGAAA BBBBBBBBBBDHLOMA BBBBBBBBBBBBDLLG BBBBBBBBBBBBBBHL BBBBBBBBBBBBBBBD BBBBBBBBBBBBBBBB IBBBBBBBBBBBBBBB OLIBBBBBBBBBBBBB AMOLIBBBBBBBBBBB AAAMOLDBBBBBBBBB AAAAAGLHBBBBBBBB AAAAAAMOLDBBBBBB AAAAAAAAOLDBBBBB } # tile 87 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA OAAAAAAAAAAAAAAA LOMAAAAAAAAAAAAA DLLMAAAAAAAAAAAA BBHOAAAAAAAAAAAA BBBLOAAAAAAAAAAA BBBDLMAAAAAAAAAA BBBBILAAAAAAAAAA BBBBBHGAAAAAAAAA BBBBBDLAAAAAAAAA BBBBBBHMAAAAAAAA } # tile 88 (logo) { AAAAAAAAAAGLIBBB AAAAAAAAAAGLDBBB AAAAAAAAAALLBBBB AAAAAAAAAALHBBBB AAAAAAAAAGLIBBBB AAAAAAAAAGLDBBBB AAAAAAAAALLBBBBB AAAAAAAAALHBBBBB AAAAAAAAGLIBBBBB AAAAAAAAGLDBBBBB AAAAAAAALLBBBBBB AAAAAAAALHBBBBBB AAAAAAAGLIBBBBBB AAAAAAAGLDBBBBBB AAAAAAALLBBBBBBB AAAAAAALHBBBBBBB } # tile 89 (logo) { BBBBBFAAAAAAAAAA BBBBBAAAAAAAAAAA BBBBKAAAAAAAAAAA BBBBJAAAAAAAAAAA BBBBFAAAAAAAAAAA BBBBAAAAAAAAAAAA BBBKAAAAAAAAAAAA BBBJAAAAAAAAAAAA BBBFAAAAAAAAAAAA BBBAAAAAAAAAAAAA BBKAAAAAAAAAAAAA BBJAAAAAAAAAAAAA BBFAAAAAAAAAAAAA BBAAAAAAAAAAAAAA BKAAAAAAAAAAAAAA BJAAAAAAAAAAAAAA } # tile 90 (logo) { AAAAAAAAAAOLLIBB AAAAAAAAAOLLDBBB AAAAAAAAOLLDBBBB AAAAAAAOLLDBBBBB AAAAAAGLLDBBBBBB AAAAAMLLDBBBBBBB AAAAALLHBBBBBBBB AAAAOLHBBBBBBBBB AAAMLLDBBBBBBBBK AAALLIBBBBBBBBBA AAGLHBBBBBBBBBJA AALLDBBBBBBBBKAA AGLHBBBBBBBBBFAA ALLDBBBBBBBBKAAA GLHBBBBBBBBBFAAA LLDBBBBBBBBKAAAA } # tile 91 (logo) { BBBBBBKFAAAAAAAA BBBBBKAAAAAAAAAA BBBBKAAAAAAAAAAA BBBKAAAAAAAAAAAA BBKAAAAAAAAAAAAA BKAAAAAAAAAAAAAA BFAAAAAAAAAAAAAA FAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAM AAAAAAAAAAAAAAAO } # tile 92 (logo) { AAAAALLBBBBBBBBJ AAAAGLIBBBBBBBBA AAAAGLDBBBBBBBBA AAAALLBBBBBBBBJA AAAMLHBBBBBBBBJA AAAGLIBBBBBBBBAA AAALLBBBBBBBBKAA AAMLHBBBBBBBBJAA AAOLIBBBBBBBBFAA AALLBBBBBBBBBAAA AGLIBBBBBBBBKAAA ALLDBBBBBBBBJAAA MLHBBBBBBBBBFAAA OLIBBBBBBBBBAAAA LLBBBBBBBBBJAAAA LIBBBBBBBBBJAAAA } # tile 93 (logo) { AAAAAAAAAAAAAOLH AAAAAAAAAAAAALLB AAAAAAAAAAAAGLIB AAAAAAAAAAAAGLDB AAAAAAAAAAAALLBB AAAAAAAAAAAALHBB AAAAAAAAAAAALIBB AAAAAAAAAAAALIBB AAAAAAAAAAAALIBB AAAAAAAAAAAALIBB AAAAAAAAAAAAOLBB AAAAAAAAAAAAGLDB AAAAAAAAAAAAALHB AAAAAAAAAAAAAGLD AAAAAAAAAAAAAALH AAAAAAAAAAAAAAGL } # tile 94 (logo) { BBBBBFAAAAAAAAAG BBBBBAAAAAAAAAAA BBBBJAAAAAAAAAAA BBBBEAAAAAAAAAAA BBBBLAAAAAAAAAAA BBBBDMAAAAAAAAAA BBBBIOAAAAAAAAAA BBBBBLGAAAAAAAAA BBBBBDLMAAAAAAAA BBBBBBHLMAAAAAAA BBBBBBBHLMAAAAAA BBBBBBBBHLMAAAAA BBBBBBBBBHLMAAAA BBBBBBBBBBHLMAAA BBBBBBBBBBBHLOAA DBBBBBBBBBBBILOA } # tile 95 (logo) { LDBBBBBBBBJAAAAA OLBBBBBBBBJAAAAA MLIBBBBBBBFAAAAA AOLBBBBBBKAAAAAA AMLHBBBBKAAAAAAA AAMOLBJFAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 96 (logo) { AAAAAAAGLIBBBBBB AAAAAAAGLBBBBBBB AAAAAAALLBBBBBBB AAAAAAALHBBBBBBB AAAAAAGLIBBBBBBB AAAAAAGLDBBBBBBB AAAAAALLBBBBBBBB AAAAAALHBBBBBBBB AAAAAMLIBBBBBBBB AAAAAGLIBBBBBBBN AAAAAOLBBBBBBBBH AAAAALLBBBBBBBDL AAAAALIBBBBBBBIL AAAAGLIBBBBBBBLH AAAAGLDBBBBBBBLD AAAALLBBBBBBBBIB } # tile 97 (logo) { BBAAAAAOLLDBBBKA BJAAAAOLLDBBBFAA BJAAAOLLDBBKFAAA BAAAOLLDBBKAAAAA BAAGLLDBBKAAAAAA JAMLLDBBKAAAAAAA JALLHBBBFAAAAAAA AOLHBBBFAAAAAAAA GLLDBBFAAAAAAAAA LLDBBKAAAAAAAAAA LHBBKAAAAAAAAAAA LBBBFAAAAAAAAAAA IBBJAAAAAAAAAAAA BBBAAAAAAAAAAAAA BBFAAAAAAAAAAAAA BKAAAAAAAAAAAAAA } # tile 98 (logo) { AAAAAAOLBBBBBBBB AAAAAAGLBBBBBBBB AAAAAAGLBBBBBBBB AAAAAAGLBBBBBBBB AAAAAALLBBBBBBBB AAAAAMLHBBBBBBBB AAAAAGLIBBBBBBBB AAAAAOLBBBBBBBBB AAAAALLBBBBBBBBB AAAAGLIBBBBBBBBJ AAAAGLDBBBBBBBBF AAAALLBBBBBBBBBA AAAMLHBBBBBBBBJA AAAGLIBBBBBBBBJA AAAOLBBBBBBBBBAA AAALLBBBBBBBBKAA } # tile 99 (logo) { BAAAAAAAAAAAAAAA BAAAAAAAAAAAAAAA BAAAAAAAAAAAAAAA BAAAAAAAAAAAAAAA BAAAAAAAAAAAAAAA JAAAAAAAAAAAAAAA JAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 100 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 101 (logo) { AAAAAAAAAAAAALHB AAAAAAAAAAAAGLIB AAAAAAAAAAAAGLDB AAAAAAAAAAAAOLBB AAAAAAAAAAAALLBB AAAAAAAAAAAMLIBB AAAAAAAAAAAGLIBB AAAAAAAAAAAGLBBB AAAAAAAAAAALLBBB AAAAAAAAAAALHBBB AAAAAAAAAAGLIBBB AAAAAAAAAAGLDBBB AAAAAAAAAALLBBBB AAAAAAAAAALHBBBB AAAAAAAAAMLIBBBB AAAAAAAAAGLIBBBB } # tile 102 (logo) { BBBBBBBBFAAAAAAA BBBBBBBBAAAAAAAA BBBBBBBKAAAAAAAA BBBBBBBJAAAAAAAA BBBBBBDLLLLLLLLL BBBBBBDIIIIIIIII BBBBBBBBBBBBBBBB BBBBBBBBBBBBBBBB BBBBBBBBBBBBBBBB BBBBBBJJJJJJJJJJ BBBBBBAAAAAAAAAA BBBBBBAAAAAAAAAA BBBBBJAAAAAAAAAA BBBBBJAAAAAAAAAA BBBBBAAAAAAAAAAA BBBBBAAAAAAAAAAA } # tile 103 (logo) { AAAAAAAAAAAAAOLI AAAAAAAAAAAAOLLB AAAAAAAAAAAOLLDB AAAAAAAAMGLLLDBB LLLLLLLLLLLHDBBB IIIIIIIIIIBBBBBB BBBBBBBBBBBBBBBB BBBBBBBBBBBBBBBB BBBBBBBBBBBBBBBB JJJJJJELDIBBBBBB AAAAAAAAMLHBBBBB AAAAAAAAAMLHBBBB AAAAAAAAAAGLBBBB AAAAAAAAAAGLBBBB AAAAAAAAAAGLIBBB AAAAAAAAAAGLIBBK } # tile 104 (logo) { BBBAAAAAAAAAAAAA BBKAAAAAAAAAAAAA BBJAAAAAAAAAAAAA BBJAAAAAAAAAAAAA BBAAAAAAAAAAAAAA BBAAAAAAAAAAAAAA BJAAAAAAAAAAAAAA BJAAAAAAAAAAAAAA BFAAAAAAAAAAAAAA BAAAAAAAAAAAAAAA KAAAAAAAAAAAAAAA JAAAAAAAAAAAAAAA JAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 105 (logo) { AAAAAAAALHBBBBJA AAAAAAAGLIBBBBAA AAAAAAAGLDBBBBAA AAAAAAALLBBBBJAA AAAAAAALHBBBBJAA AAAAAAMLIBBBBFAA AAAAAAGLIBBBBAAA AAAAAAOLBBBBKAAA AAAAAALLBBBBJAAA AAAAAALIBBBBJAAA AAAAAGLIBBBBAAAA AAAAAGLDBBBBAAAA AAAAALLBBBBJAAAA AAAAALHBBBBJAAAA AAAAGLIBBBBAAAAA AAAAGLDBBBBAAAAA } # tile 106 (logo) { AAAAGLBBBBBBBBBE AAAAMLIBBBBBBBBL AAAAALIBBBBBBBBB AAAAALHBBBBBBBBI AAAAAGLBBBBBBBBD AAAAAGLBBBBBBBBB AAAAAMLIBBBBBBBB AAAAAALIBBBBBBBB AAAAAALHBBBBBBBB AAAAAAGLBBBBBBBB AAAAAAGLBBBBBBBB AAAAAAMLIBBBBBBB AAAAAAALIBBBBBBB AAAAAAALHBBBBBBB AAAAAAAGLBBBBBBB AAAAAAAGLBBBBBBB } # tile 107 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA GAAAAAAAAAAAAAAA CAAAAAAAAAAAAAAA EAAAAAAAAAAAAAAA LAAAAAAAAAAAAAAA BAAAAAAAAAAAAAAA IGAAAAAAAAAAAAAA DCAAAAAAAAAAAAAM BEAAAAAAAAAAAAAL BLAAAAAAAAAAAAOL BBAAAAAAAAAAAMLL BIGAAAAAAAAAALLI BDCAAAAAAAAAOLHB BBEAAAAAAAAMLLDB } # tile 108 (logo) { AAAAAGLLBBBBKAAA AAAAMLLDBBBBFAAA AAAAOLHBBBBJAAAA AAAMLLBBBBKAAAAA AAALLIBBBBFAAAAA AAOLHBBBBJAAAAAA AMLLDBBBKAAAAAAA ALLIBBBBFAAAAAAA OLHBBBBJAAAAAAAA LLDBBBKAAAAAAAAA LIBBBBFAAAAAAAAA HBBBBJAAAAAAAAAA DBBBKAAAAAAAAAAA BBBBFAAAAAAAAAAG BBBKAAAAAAAAAAAG BBBAAAAAAAAAAAAL } # tile 109 (logo) { AAGLIBBBBBBBBJAA AAGLDBBBBBBBBJAA AAOLBBBBBBBBBAAA AALLBBBBBBBBBAAA AMLIBBBBBBBBKAAA AGLIBBBBBBBBJAAA AOLBBBBBBBBBFAAA ALLBBBBBBBBBAAAA MLIBBBBBBBBBAAAA GLIBBBBBBBBJAAAA OLBBBBBBBBBJAAAA LLBBBBBBBBBAAAAA LIBBBBBBBBBAAAAA LIBBBBBBBBJAAAAA LDBBBBBBBBJAAAAA LBBBBBBBBBFAAAAA } # tile 110 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 111 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 112 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAALLLLM AAAAAAAAAAALHIHG AAAAAAAAAAGLIBBJ AAAAAAAAAAGLDBBJ AAAAAAAAAAOLBBBJ AAAAAAAAAALLBBBJ AAAAAAAAAALIBBBE AAAAAAAAAMLIBBBL AAAAAAAAAGLIBBBD AAAAAAAAAGLBBBBI AAAAAAAAAOLBBBBB AAAAAAAAALLBBBBB } # tile 113 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA MAAAAAAAAAAAAAAA GAAAAAAAAAAAAAAA LAAAAAAAAAAAAAAA HGAAAAAAAAAAAAAA } # tile 114 (logo) { AAAAAAAAAOLDBBBB AAAAAAAAAAOLDBBB AAAAAAAAAAAOLBBB AAAAAAAAAAAMLIBB AAAAAAAAAAAAOLBB AAAAAAAAAAAAMLIB AAAAAAAAAAAAALHB AAAAAAAAAAAAAGLB AAAAAAAAAAAAAGLB AAAAAAAAAAAAAGLB AAAAAAAAAAAAAGLB AAAAAAAAAAAAAGLB AAAAAAAAAAAAAGLB AAAAAAAAAAAAAOLB AAAAAAAAAAAAALLB AAAAAAAAAAAAGLIB } # tile 115 (logo) { BBBBBBIGAAAAAAAA BBBBBBBEAAAAAAAA BBBBBBBLAAAAAAAA BBBBBBBBAAAAAAAA BBBBBBBBAAAAAAAA BBBBBBBBAAAAAAAA BBBBBBBBAAAAAAAA BBBBBBBBAAAAAAAA BBBBBBBBAAAAAAAA BBBBBBBBAAAAAAAA BBBBBBBBAAAAAAAA BBBBBBBKAAAAAAAA BBBBBBBJAAAAAAAA BBBBBBBJAAAAAAAA BBBBBBBAAAAAAAAA BBBBBBKAAAAAAAAA } # tile 116 (logo) { AAAAAAGLIBBBBBBB AAAAAAGLDBBBBBBB AAAAAALLBBBBBBBB AAAAAALHBBBBBBBB AAAAAGLIBBBBBBBB AAAAAGLDBBBBBBBB AAAAALLBBBBBBBBK AAAAALHBBBBBBBBJ AAAAGLIBBBBBBBBF AAAAGLDBBBBBBBBA AAAALLBBBBBBBBKA AAAALHBBBBBBBBJA AAAGLIBBBBBBBBFA AAAGLDBBBBBBBBAA AAALLBBBBBBBBKAA AAALHBBBBBBBBJAA } # tile 117 (logo) { BFAAAAAAAAAAAAAG BAAAAAAAAAAAAAAO KAAAAAAAAAAAAAML JAAAAAAAAAAAAAGL FAAAAAAAAAAAAALL AAAAAAAAAAAAAMLH AAAAAAAAAAAAAGLI AAAAAAAAAAAAAOLB AAAAAAAAAAAAALLB AAAAAAAAAAAAALIB AAAAAAAAAAAAGLIB AAAAAMGMAAAAGLDB AAAAAOLLGAAAGLBB AAAAGLLHLGAAOLBB AAAALLDBDCAALLBB AAAOLHBBBAAALIBB } # tile 118 (logo) { LHBBBBBBBBBJAAAA LDBBBBBBBBBAAAAA LBBBBBBBBBJAAAAA IBBBBBBBBBFAAAAA BBBBBBBBBBAAAAAA BBBBBBBBBJAAAAAA BBBBBBBBBFAAAAAA BBBBBBBBBAAAAAAA BBBBBBBBJAAAAAAA BBBBBBBBJAAAAAAA BBBBBBBBAAAAAAAA BBBBBBBBAAAAAAAA BBBBBBBBAAAAAAAA BBBBBBBJAAAAAAAA BBBBBBBJAAAAAAAA BBBBBBBJAAAAAAAA } # tile 119 (logo) { AAAAAAAAAAAAAAML AAAAAAAAAAAAAAOL AAAAAAAAAAAAAMLL AAAAAAAAAAAAAOLI AAAAAAAAAAAAGLLB AAAAAAAAAAAALLDB AAAAAAAAAAAOLHBB AAAAAAAAAAMLLDBI AAAAAAAAAALLIBDL AAAAAAAAAOLHBBIL AAAAAAAAGLLDBBLL AAAAAAAMLLDBBDLH AAAAAAALLHBBBELI AAAAAAOLHBBBFLLB AAAAAOLLDBBKALHB AAAAMLLDBBBAGLIB } # tile 120 (logo) { LBBBBBBBBBBAAAAA IBBBBBBBBBBAAAAA BBBBBBBBBBJAAAAA BBBBBBBBBBJAAAAA BBBBBBBBBBAAAAAA BBBBBBBBBKAAAAAA LBBBBBBBBJAAAAAA LBBBBBBBBFAAAAAA IBBBBBBBBAAAAAAA DBBBBBBBKAAAAAAA BBBBBBBBJAAAAAAA BBBBBBBBFAAAAAAG BBBBBBBBAAAAAAGL BBBBBBBJAAAAAALL BBBBBBBJAAAAAOLH BBBBBBBAAAAAMLLD } # tile 121 (logo) { AAAAAAAAAAAAAAAO AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA GAAAAAAAAAAAAAAA LOMAAAAGGGGAAAAA ILGAAOLLLLLLAAAA BBJAOLLIDBDHGAAA BBFMLLDBBBBDLAAA } # tile 122 (logo) { LDBBBBBBBBBBBDLO LHBBBBBBBBBBBBDL MLHBBBBBBBBBBBBD AMLHBBBBBBBBBBBB AAMLHDBBBBBBBBBB AAAAOLDBBBBBBBBB AAAAAOLDBBBBBBBB AAAAAAOLDBBBBBBB AAAAAAAOLDBBBBBB AAAAAAAAOLDBBBBB AAAAAAAAALHBBBBB AAAAAAAAAMLIBBBB AAAAAAAAAAOLBBBB AAAAAAAAAAMLIBBB AAAAAAAAAAALHBBB AAAAAAAAAAAGLBBB } # tile 123 (logo) { AAAAAAAAAAAAAAAA GAAAAAAAAAAAAAAA LMAAAAAAAAAAAAAA HLAAAAAAAAAAAAAA BHOAAAAAAAAAAAAA BDLMAAAAAAAAAAAA BBIOAAAAAAAAAAAA BBBLAAAAAAAAAAAA BBBIGAAAAAAAAAAA BBBDCAAAAAAAAAAA BBBBEAAAAAAAAAAA BBBBLAAAAAAAAAAA BBBBBAAAAAAAAAAA BBBBBAAAAAAAAAAA BBBBBAAAAAAAAAAA BBBBJAAAAAAAAAAA } # tile 124 (logo) { AAAALHBBBBBBBBBB AAAMLIBBBBBBBBBB AAAGLIBBBBBBBBBB AAAOLBBBBBBBBBBK AAALLBBBBBBBBBBF AAALIBBBBBBBBBKA AAGLIBBBBBBBBBJA AAGLDBBBBBBBBBAA AALLBBBBBBBBBJAA AALHBBBBBBBBBFAA AMLIBBBBBBBBBAAA AGLIBBBBBBBBJAAA AOLBBBBBBBBBFAAA ALLBBBBBBBBBAAAA ALIBBBBBBBBKAAAA GLIBBBBBBBBJAAAA } # tile 125 (logo) { BFAAAAAAAAAAAAAA KAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAM AAAAAAAAAAAAAAAG AAAAAAAAAAAAAAAO AAAAAAAAAAAAAAAL AAAAAAAAAAAAAAGL AAAAAAAAAAAAAAOL } # tile 126 (logo) { AAGLIBBBBBBBBJAA AAGLDBBBBBBBBAAA AALLBBBBBBBBKAAA AMLHBBBBBBBBJAAA AGLIBBBBBBBBFAAA AOLBBBBBBBBBAAAA ALLBBBBBBBBJAAAA GLIBBBBBBBBFAAAA GLDBBBBBBBBAAAAA LLBBBBBBBBKAAAAA LHBBBBBBBBJAAAAA LIBBBBBBBBAAAAAA LBBBBBBBBKAAAAAA LBBBBBBBBJAAAAAM IBBBBBBBBFAAAAAL DBBBBBBBBAAAAAGL } # tile 127 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA MGMAAAAAAAAAAAAA OLLOAAAAAAAAAAAA LLILGAAAAAAAAAAA LIBDCAAAAAAAAAAA HBBBAAAAAAAAAAAA } # tile 128 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 129 (logo) { AAAAAAAAAOLBBBBB AAAAAAAAALLBBBBB AAAAAAAAALIBBBBB AAAAAAAAGLIBBBBB AAAAAAAAGLDBBBBB AAAAAAAALLBBBBBB AAAAAAAALHBBBBBB AAAAAAAGLIBBBBBB AAAAAAAGLDBBBBBB AAAAAAAOLBBBBBBB AAAAAAALLBBBBBBB AAAAAAMLIBBBBBBB AAAAAAGLIBBBBBBB AAAAAAGLBBBBBBBB AAAAAALLBBBBBBBB AAAAAALHBBBBBBBB } # tile 130 (logo) { BBBBJAAAAAAAAAAA BBBBJAAAAAAAAAAA BBBBAAAAAAAAAAAA BBBBAAAAAAAAAAAA BBBKAAAAAAAAAAAA BBBJAAAAAAAAAAAA BBBFAAAAAAAAAAAA BBBAAAAAAAAAAAAA BBKAAAAAAAAAAAAA BBJAAAAAAAAAAAAA BBJAAAAAAAAAAAAA BBAAAAAAAAAAAAAA BBAAAAAAAAAAAAAA BJAAAAAAAAAAAAAA BJAAAAAAAAAAAAAA BAAAAAAAAAAAAAAA } # tile 131 (logo) { AAAAAAAAAAGLBBBJ AAAAAAAAAAGLBBBF AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAM AAAAAAAAAAAAAAAL AAAAAAAAAAAAAAGL AAAAAAAAAAAAAMLL } # tile 132 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AMGGGGAAAAAAAAAA ALLLLLAAAAAAAAAA GLHBBKAAAAAAAAAA LLDBBJAAAAAAAAAA LHBBBAAAAAAAAAAA LIBBKAAAAAAAAAAA HBBBJAAAAAAAAAAA DBBBFAAAAAAAAAAA } # tile 133 (logo) { AAAAOLBBBBKAAAAA AAAALLBBBBJAAAAA AAAMLIBBBBFAAAAA AAAGLIBBBBAAAAAA AAAOLBBBBBAAAAAA AAALLBBBBJAAAAAA AAALIBBBBJAAAAAA AAGLIBBBBAAAAAAA AAGLDBBBBAAAAAAA AALLBBBBKAAAAAAA AALHBBBBJAAAAAAA AGLIBBBBFAAAAAAA AGLDBBBBAAAAAAAA ALLBBBBBAAAAAAAA MLHBBBBKAAAAAAAA GLIBBBBJAAAAAAAA } # tile 134 (logo) { AAAAAAAMLIBBBBBB AAAAAAAALIBBBBBB AAAAAAAALHBBBBBB AAAAAAAAGLBBBBBB AAAAAAAAGLBBBBBB AAAAAAAAMLIBBBBB AAAAAAAAALIBBBBB AAAAAAAAAOLBBBBB AAAAAAAAAGLBBBBB AAAAAAAAAGLDBBBB AAAAAAAAAALIBBBB AAAAAAAAAALIBBBB AAAAAAAAAAOLBBBB AAAAAAAAAAGLBBBB AAAAAAAAAAGLDBBB AAAAAAAAAAALIBBB } # tile 135 (logo) { BBLAAAAAAAALLIBB BBBAAAAAAAGLHBBB BBIGAAAAAMLLDBBB BBDCAAAAAOLHBBBB BBBEAAAAGLLBBBBK BBBLAAAMLLDBBBBA BBBBAAAOLHBBBBFA BBBIGAGLLBBBBKAA BBBDCMLLDBBBBAAA BBBBEOLHBBBBFAAA BBBBLLLBBBBKAAAA BBBBILDBBBBAAAAA BBBBIHBBBBFAAAAA BBBBBBBBBKAAAAAA BBBBBBBBBFAAAAAA BBBBBBBBJAAAAAAA } # tile 136 (logo) { BBFAAAAAAAAAAAAL BKAAAAAAAAAAAAGL BAAAAAAAAAAAAAGL FAAAAAAAAAAAAALL AAAAAAAAAAAAAALH AAAAAAAAAAAAAMLI AAAAAAAAAAAAAGLI AAAAAAAAAAAAAOLB AAAAAAAAAAAAALLB AAAAAAAAAAAAMLIB AAAAAAAAAAAAGLIB AAAAAAAAAAAAOLBB AAAAAAAAAAAALLBB AAAAAAAAAAAALIBB AAAAAAAAAAAGLIBB AAAAAAAAAAAGLDBB } # tile 137 (logo) { HBBBBBBBBBAAAAAA IBBBBBBBBKAAAAAA DBBBBBBBBJAAAAAA BBBBBBBBBJAAAAAA BBBBBBBBBAAAAAAA BBBBBBBBBAAAAAAA BBBBBBBBJAAAAAAA BBBBBBBBJAAAAAAA BBBBBBBBAAAAAAAA BBBBBBBBAAAAAAAA BBBBBBBKAAAAAAAA BBBBBBBJAAAAAAAA BBBBBBBFAAAAAAAA BBBBBBBAAAAAAAAA BBBBBBKAAAAAAAAA BBBBBBJAAAAAAAAA } # tile 138 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 139 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 140 (logo) { AAAAAAAAALIBBBBB AAAAAAAAMLIBBBBB AAAAAAAAGLIBBBBB AAAAAAAAGLBBBBBB AAAAAAAAGLBBBBBB AAAAAAAAMLHBBBBB AAAAAAAAAMLHBBBB AAAAAAAAAAMOLDBB AAAAAAAAAAAAGLHD AAAAAAAAAAAAAAGL AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 141 (logo) { DLAAAAAAAAAAAAAA BHOAAAAAAAAAAAAA BDLMAAAAAAAAAAAA BBILMAAAAAAAAAAA BBBHLMAAAAAAAAAA BBBBHLOAAAAAAAAA BBBBBILLGAAAAAAA BBBBBBDHLLGGAAAA BBBBBBBBDHLLLLLL HDBBBBBBBBBDIIII GLHIBBBBBBBBBBBB AAMGLIIDBBBBBBBB AAAAAAGCELBBBBBB AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 142 (logo) { AAAAAAAAAAAALLDB AAAAAAAAAAAGLHBB AAAAAAAAAAMLLDBB AAAAAAAAAMLLHBBB AAAAAAAAMLLHBBBB AAAAAAAMLLHBBBBB AAAAAMOLLHBBBBBB AAMGOLLLIBBBBBBB LLLLLLIBBBBBBBBK IIIIBBBBBBBBBBFA BBBBBBBBBBBBJAAA BBBBBBBBBJFAAAAA BBBBKJJAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 143 (logo) { BBBBBBFAAAAAAAAA BBBBBKAAAAAAAAAA BBBBBFAAAAAAAAAA BBBBKAAAAAAAAAAA BBBBAAAAAAAAAAAA BBBFAAAAAAAAAAAA BBFAAAAAAAAAAAAA BFAAAAAAAAAAAAAA FAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 144 (logo) { AAGLIBBBBBBBBFAA AAGLDBBBBBBBBAAA AALLBBBBBBBBKAAA AALHBBBBBBBBJAAA AALIBBBBBBBBJAAO AALIBBBBBBBBEAOL AALIBBBBBBBBLLLL AALIBBBBBBBBDIID AALIBBBBBBBBBBBB AAOLBBBBBBBBBBBB AAMLIBBBBBBBBBBK AAAGLHBBBBBBBBJA AAAAMGELBBKJFAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 145 (logo) { AAMLLDBBJAAALIBB AMLLIBBBAAAALIBB AOLHBBBFAAAAOLBB OLLBBBKAAAAAGLBB LLDBBBFAAAAAGLBB LDBBBFAAAAAAMLIB DBBBKAAAAAAAALHB BBBKAAAAAAAAAGLD BBKAAAAAAAAAAALH BJAAAAAAAAAAAAML FAAAAAAAAAAAAAAM AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 146 (logo) { BBBBBBBJAAAAAAAA BBBBBBBJAAAAAAAA BBBBBBBLAAAAAAAA BBBBBBBIAAAAAAAA BBBBBBBIOAAAAAAO BBBBBBBDLOAAAGLL BBBBBBBBDLLLLLLH BBBBBBBBBDIIIIDB BBBBBBBBBBBBBBBB HBBBBBBBBBBBBBBB LHBBBBBBBBBBBBBF MOLIBBBBBBBBKJAA AAMGELBBBJJAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 147 (logo) { AAAMLLIBBBFAOLDB AAMLLHBBBFAALLBB AMLLHBBBKAAMLIBB GLLHBBBKAAAGLIBB LLHBBBKAAAAGLBBB LDBBBKAAAAAGLBBB DBBBKAAAAAAGLBBB BBBKAAAAAAAGLBBB BBFAAAAAAAAGLBBB KFAAAAAAAAAGLDBB AAAAAAAAAAAALHBB AAAAAAAAAAAAMLHD AAAAAAAAAAAAAAGO AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 148 (logo) { BBBBBBBAAAAAOLIB BBBBBBJAAAAOLLBB BBBBBBJAAAMLLDBB BBBBBBAAAMLLIBBB BBBBBBAAMLLHBBBJ BBBBBDMMLLHBBBKA BBBBBILLLHBBBBAA BBBBBBIIIBBBBFAA BBBBBBBBBBBBFAAA BBBBBBBBBBKFAAAA BBBBBBBBBJAAAAAA BBBBBBBKFAAAAAAA LBBBJJAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 149 (logo) { BKAOLIBBBBBBHMAA BFALLBBBBBBBIOAA KAALIBBBBBBBBLMA FAALIBBBBBBBBIOA AAAOLBBBBBBBBBLO AAAGLDBBBBBBBBDL AAAALHBBBBBBBBBD AAAAMLHBBBBBBBBB AAAAAMLHBBBBBBBB AAAAAAMLHDBBBBBB AAAAAAAAGLHDBBBB AAAAAAAAAAGLIIDB AAAAAAAAAAAAAGCJ AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 150 (logo) { AAAAAAAAAAAGLBBB AAAAAAAAAAAGLBBB AAAAAAAAAAAGLBBB AAAAAAAAAAAOLBBB AAAAAAAAAAMLLBBB OAAAAAAAAALLIBBB LOAAAAAAMOLHBBBB DLLGMAGGLLLDBBBB BDHLLLLLLHBBBBBB BBBBIIIDBBBBBBKA BBBBBBBBBBBBBFAA BBBBBBBBBBKJAAAA LIBBBBJJJAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 151 (logo) { BBBBJAAAAAAAAAAA BBBBJAAAAAAAAAAA BBBBAAAAAAAAAAAA BBBJAAAAAAAAAAAG BBBFAAAAAAAAAAAG BBKAAAAAAAAAAAAO BBAAAAAAAAAAAAAL BFAAAAAAAAAAAAML FAAAAAAAAAAAAAGL AAAAAAAAAAAAAAGL AAAAAAAAAAAAAALL AAAAAAAAAAAAAALH AAAAAAAAAAAAAALI AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 152 (logo) { GLDBBBBBBBBAAAAA LLBBBBBBBBKAAAAA LHBBBBBBBBJAAAAA LIBBBBBBBBFAAAAA LDBBBBBBBBAAAAAA LBBBBBBBBKAAAAAA LBBBBBBBBJAAAAAA IBBBBBBBBAAAAAAA IBBBBBBBBAAAAAAA BBBBBBBBJAAAAAAA BBBBBBBBJAAAAAAA BBBBBBBKAAAAAAAA KJJJAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 153 (logo) { AAAAAAAAAAAAAALL AAAAAAAAAAAAAMLI AAAAAAAAAAAAAGLI AAAAAAAAAAAAAGLB AAAAAAAAAAAAAOLB AAAAAAAAAAAAALLB AAAAAAAAAAAAALIB AAAAAAAAAAAAALHB AAAAAAAAAAAAAGLB AAAAAAAAAAAAAMLI AAAAAAAAAAAAAAOL AAAAAAAAAAAAAAMO AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 154 (logo) { BBBBBBBBJAAAAMLL BBBBBBBBFAAAAOLH BBBBBBBBAAAAOLLB BBBBBBBKAAAGLLDB BBBBBBBJAAMLLDBB BBBBBBBEAGLLHBBB BBBBBBBLLLLHBBBK BBBBBBBDIIDBBBKA BBBBBBBBBBBBBKAA BBBBBBBBBBBBKAAA BBBBBBBBBBBJAAAA LDBBBBBBBKFAAAAA GCLIBBJJAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 155 (logo) { DBBJAAAAAAAAAAAA BBBAAAAAAAAAAAAA BBJAAAAAAAAAAAAA BKAAAAAAAAAAAAAA BFAAAAAAAAAAAAAA JAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 156 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAMLLLL AAAAAAAAAAAGLHII AAAAAAAAAAALLBBB AAAAAAAAAAALHBBB AAAAAAAAAAAGCJJJ AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 157 (logo) { AAAAAGLIBBBBBBBB AAAAAGLDBBBBBBBB AAAAALLBBBBBBBBB AAAAALHBBBBBBBBB AAAAGLIBBBBBBBBB AAAMLLDBBBBBBBBB MGGLLHBBBBBBBBBB LLLLHBBBBBBBBBBB IIBBBBBBBBBBBBBB BBBBBBBBBBBBBBBB BBBBBBBBBBBBBBBB JJJJJJJJJJJJJJJJ AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 158 (logo) { BAAAAAAAAAAAAAAA KAAAAAAAAAAAAAAA JAAAAAAAAAAAAAAA JAAAAAAAAAAAAAAA EAAAAAAAAAAAAAAA LOMAAAAAAAAAAAAA DLLLOGGGGGGGGGGG BBIILLLLLLLLLLLL BBBBBBBBBBBBBBBB BBBBBBBBBBBBBBBB BBBBBBBBBBBBBBBB JJJJJJJJJJJJJJJJ AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 159 (logo) { AAAAAAAAAAAAAOLH AAAAAAAAAAAAOLLB AAAAAAAAAAAOLLDB AAAAAAAAAAOLLDBB AAAAAAAAMLLLDBBB AAAAAMGLLLHDBBBB GGGLLLLLHIBBBBBB LLLLHIIBBBBBBBBB BBBBBBBBBBBBBBBB BBBBBBBBBBBBBBBB BBBBBBBBBBBBBBBB JJJJJJJJJJJJJJJJ AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 160 (logo) { BBBBAAAAAAAAAAAA BBBJAAAAAAAAAAAM BBBJAAAAAAAAAAAG BBBAAAAAAAAAAAAL BBKAAAAAAAAAAAGL BBJAAAAAAAAAAMLL BBFAAAAAAAAGOLLH BBAAAAMLLLLLLLIB BJAAAALLHIIIDBBB BJAAAALHBBBBBBBB BAAAAALIBBBBBBBB JAAAAAGCJJJJJJJJ AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 161 (logo) { LLBBBBBJAAAAAAAA LHBBBBBJAAAAAAAA LIBBBBBAAAAAAAAA LBBBBBBAAAAAAAAA HBBBBBBAAAAAAAAA DBBBBBIOAAAAAAAA BBBBBBDLOGAAAAAA BBBBBBBDLLLLLLLM BBBBBBBBBDIIIIHG BBBBBBBBBBBBBBBJ BBBBBBBBBBBBBBBA JJJJJJJJJJJJJJJA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 162 (logo) { AAAAAAAAAAALIBBB AAAAAAAAAAAOLBBB AAAAAAAAAAAGLBBB AAAAAAAAAAAGLDBB AAAAAAAAAAAALIBB AAAAAAAAAAAALIBB AAAAAAAAAAAAOLBB AAAAAAAAAAAAGLBB AAAAAAAAAAAAGLDB AAAAAAAAAAAAALIB AAAAAAAAAAAAAGCJ AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 163 (logo) { BBBBBBBKAAAAAAAA BBBBBBBFAAAAAAAA BBBBBBJAAAAAAAAA BBBBBKAAAAAAAAAA BBBBBFAAAAAAAAAA BBBBJAAAAAAAAAAA BBBKAAAAAAAAAAAA BBBFAAAAAAAAAAAA BBJAAAAAAAAAAAAA BKAAAAAAAAAAAAAA JFAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 164 (logo) { AAAAAAAAAAALLBBB AAAAAAAAAAALHBBB AAAAAAAAAAGLIBBB AAAAAAAAAAGLDBBB AAAAAAAAAALLBBBB AAAAAAAAAOLHBBBB AAAAAAGGOLLDBBBB AGLLLLLLLLDBBBBB ALLHIIIDBBBBBBBB GLIBBBBBBBBBBBBB GLDBBBBBBBBBBBBB MGJJJJJJJJJJJJJJ AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 165 (logo) { BBBBBBJAAAAAAAAA BBBBBBAAAAAAAAAA BBBBBBAAAAAAAAAA BBBBBJAAAAAAAAAA BBBBBJAAAAAAAAAA BBBBBEAAAAAAAAAA BBBBBLOGMAAAAAAA BBBBBDLLLLLLLGAA BBBBBBBBIIIIICAA BBBBBBBBBBBBBJAA BBBBBBBBBBBBBJAA JJJJJJJJJJJJJFAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 166 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 167 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 168 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 169 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 170 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 171 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 172 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 173 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 174 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 175 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 176 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 177 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 178 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 179 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 180 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 181 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 182 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 183 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 184 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 185 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 186 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 187 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 188 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 189 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 190 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 191 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 192 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 193 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 194 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 195 (logo) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } slashem-0.0.7E7F3/win/gtk/0000775000076400007640000000000010545462317013236 5ustar alialislashem-0.0.7E7F3/win/gtk/gtkmap.c0000664000076400007640000011170610545462317014673 0ustar aliali/* $Id: gtkmap.c,v 1.36.2.3 2004/11/12 21:57:31 j_ali Exp $ */ /* GTK+ NetHack Copyright (c) Issei Numata 1999-2000 Copyright (c) Slash'EM Development Team 2000-2004 GTK+ NetHack may be freely redistributed. See license for details. */ #include #include #include "winGTK.h" #include "dlb.h" #ifdef SHORT_FILENAMES #include "patchlev.h" #else #include "patchlevel.h" #endif #include "decl.h" #include "proxycb.h" #include "prxyclnt.h" #include "gtkprogress.h" #undef red #undef green #undef blue /* if map_click is true, we do gtk_main_quit() when clicking map */ static int map_click; static int map_update; static GtkWidget *map; static GdkFont *map_font; static gchar *map_font_name; static unsigned char *map_xoffsets; /* For character mode only */ static unsigned int map_font_width; /* Maximum width */ static enum xshm_map_mode map_mode; #ifdef GTK_PROXY int no_glyph; static short *map_glyph2colsym = (short *)0; #endif static GdkGC *map_color_gc[N_NH_COLORS]; static gint map_button_event(void *map, GdkEventButton *event, gpointer data); static void nh_map_cliparound(int x, int y, gboolean exact); static void nh_map_redraw(); static int configure_map(GtkWidget *w, gpointer data); #ifdef WINGTK_RADAR static int use_radar = TRUE; static int radar_is_created; static GtkWidget *radar; static GtkWidget *radar_darea; /* * we use 2 pixmaps for radar. * * radar_pixmap keeps radar dot * radar_pixmap2 keeps radar dot and frame rectangle */ static GdkPixmap *radar_pixmap; static GdkPixmap *radar_pixmap2; extern GtkAccelGroup *accel_group; #define RADAR_MONSTER CLR_YELLOW #define RADAR_HUMAN MAP_WHITE #define RADAR_PET CLR_GREEN #define RADAR_OBJECT CLR_BLUE #define RADAR_WALL CLR_GRAY #define RADAR_FLOOR MAP_DARK_GREEN #define RADAR_DOOR CLR_ORANGE #define RADAR_LADDER CLR_MAGENTA #define RADAR_WATER CLR_BLUE #define RADAR_TRAP CLR_RED #define RADAR_SWALLOW CLR_RED #define RADAR_ICE CLR_GRAY #define RADAR_LAVA CLR_ORANGE #define RADAR_BRIDGE CLR_GRAY #define RADAR_AIR CLR_CYAN #define RADAR_CLOUD CLR_GRAY #define RADAR_BEAM CLR_YELLOW static void nh_radar_configure(); #endif /* WINGTK_RADAR */ static GdkGC *map_gc; /* * BIG3DTILE * * +----------+ * ^ / /| * | / / | * | / / | * | / / | * *6 / / | * | +----------+ + * | ^ | | / ^ * | | | | / | * | *2 | | / *4 * | | | | / | * v v | |/ v * +----------+ * <-- *1 --> <-*3-> * <-- *5 --> * * *1 = 3D_WIDTH = 32 * *2 = 3D_HEIGHT = 32 * *3 = 3D_OFSET = 16 * *4 = 3D_OFSETY = 32 * *5 = WIDTH = 48 * *6 = HEIGHT = 64 */ TileTab tileTab[MAXNOTILESETS+1] = { { "", "" }, /* dummy */ }; int no_tileTab = 0; /* Not including dummy (index 0) */ static TileTab *Tile; int map_visual = -1; int map_clip_dist2 = 0; /* from tile.c */ extern int tiles_per_row; extern int tiles_per_col; #ifdef WINGTK_RADAR #define NH_RADAR_UNIT 4 #define NH_RADAR_WIDTH (no_cols * NH_RADAR_UNIT) #define NH_RADAR_HEIGHT (no_rows * NH_RADAR_UNIT) #endif #ifdef GTK_PROXY extern short *GTK_glyph2tile; #define glyph2tile GTK_glyph2tile #else extern short glyph2tile[]; #endif #define GLYPH2TILE(g) ((g) == NO_GLYPH ? stone_tile : glyph2tile[g]) extern GtkWidget *main_window; int cursx; int cursy; int cursm; static int c_width; static int c_height; static int c_3dwidth; static int c_3dheight; static int c_3dofset; static int c_map_width; static int c_map_height; #define TILEMAP_UPDATE 1 static int no_rows = -1, no_cols = -1, no_layers = -1; static int tilemap_size = 0; /* sizeof(struct tilemap) */ struct tilemap { unsigned int flags; int glyphs[1]; }; static struct tilemap **gtkmap = NULL; #define GTKMAP_PTR(ptr, col, size) \ ((struct tilemap *)((char *)(ptr)+(col)*(size))) #define GTKMAP(row, col) GTKMAP_PTR(gtkmap[row], col, tilemap_size) /* * fix tile number */ static int fix_tile(int tile) { return tile; } /* * (Re)configure the map for new dimensions (layers = -1 to free). */ static int nh_conf_map_dimens(int rows, int cols, int layers, int preserve) { int i, j, k; int glyph = cmap_to_glyph(S_stone); int retval = 0; int new_size = sizeof(struct tilemap) + (layers - 1) * sizeof(int); struct tilemap **new, *tm; if (rows == no_rows && cols == no_cols && layers == no_layers) return 0; if (layers >= 0) { /* Allocate new map */ new = malloc(rows * sizeof(struct tilemap *)); if (!new) { retval = -1; goto out; } for(j = 0; j < rows; j++) { new[j] = malloc(cols * new_size); if (!new[j]) { retval = -1; for(j--; j >= 0; j--) free(new[j]); free(new); goto out; } } /* Copy data from old map to new and initialize new areas */ if (gtkmap && preserve) for(j = 0; j < min(rows, no_rows); j++) { if (gtkmap[j]) for(i = 0; i < min(cols, no_cols); i++) { tm = GTKMAP_PTR(new[j], i, new_size); tm->flags = GTKMAP(j, i)->flags; for(k = 0; k < min(layers, no_layers); k++) tm->glyphs[k] = GTKMAP(j, i)->glyphs[k]; for(; k < layers; k++) tm->glyphs[k] = NO_GLYPH; } else i = 0; for(; i < cols; i++) { tm = GTKMAP_PTR(new[j], i, new_size); tm->flags = TILEMAP_UPDATE; for(k = 0; k < layers; k++) tm->glyphs[k] = NO_GLYPH; } } else j = 0; for(; j < rows; j++) for(i = 0; i < cols; i++) { tm = GTKMAP_PTR(new[j], i, new_size); tm->flags = TILEMAP_UPDATE; for(k = 0; k < layers; k++) tm->glyphs[k] = NO_GLYPH; } /* Release old map */ if (gtkmap) { for(j = 0; j < no_rows; j++) free(gtkmap[j]); free(gtkmap); } } out: if (layers < 0 || retval) { for(j = 0; j < rows; j++) free(gtkmap[j]); gtkmap = NULL; no_layers = -1; no_rows = -1; no_cols = -1; tilemap_size = 0; } else { gtkmap = new; map_update = 1; no_layers = layers; no_rows = rows; no_cols = cols; tilemap_size = new_size; if (map_visual) map = xshm_map_init(map_mode, c_map_width, c_map_height); if (GTK_WIDGET_REALIZED(map)) configure_map(map, 0); } #ifdef WINGTK_RADAR nh_radar_configure(); #endif return retval; } static int nh_conf_map_font(void) { int i, j, min_width, width; #ifdef GTK_PROXY int rgb, sym, best; double e, err = 0; int r, g, b; double d; double X, Y, Z, up, vp; /* Tri-stimulus and CIE-1976 UCS values */ double Ls, us, vs; struct { double L, up, vp; } nh_Luv[N_NH_COLORS]; long *glyph2rgbsym; struct proxycb_get_glyph_mapping_res *glyph_map; #endif if (!map_font) { if (map_font_name) { PangoFontDescription *desc; desc = pango_font_description_from_string(map_font_name); map_font = gdk_font_from_description(desc); pango_font_description_free(desc); if (!map_font) g_warning("Can't load map font \"%s\"", map_font_name); } if (!map_font) { g_return_val_if_fail(map->style != NULL, 1); map_font = gtk_style_get_font(map->style); g_return_val_if_fail(map_font != NULL, 1); gdk_font_ref(map_font); map_font_name = pango_font_description_to_string(map->style->font_desc); } } /* * ALI * We might want to consider making the size of this array * variable in the future, but for now 8 bits is always enough. */ map_xoffsets = (unsigned char *) alloc(256); for(i = 0; i < 256; i++) map_xoffsets[i] = 0; #ifdef GTK_PROXY if (!map_glyph2colsym) { glyph_map = nh_proxy_cache_get_glyph_mapping(NULL); if (!glyph_map) { pline("Cannot get glyph mapping."); return 0; } glyph2rgbsym = proxy_map_glyph2char(glyph_map); no_glyph = glyph_map->no_glyph; proxy_cb_free_glyph_mapping(glyph_map); map_glyph2colsym = (short *)alloc(no_glyph * sizeof(short)); for(i = 0; i < no_glyph; i++) map_glyph2colsym[i] = -1; /* * The algorithm for determining colour closeness used here is * a sledgehammer to crack a nut. It is based on the CIE 1976 * colour difference value (delta-E*(L*u*v*)), but modified * slightly to give much more weight to the chroma information. * Normally one would simply use (r-r0)^2 + (g-g0)^2 + (b-b0)^2 * but this gives too much weight to lightness for our purposes * and while one can conceive of a number of ways to modify it * we really need to do some testing before using one of these. * This algorithm will work, although it's a little slow. * * Note that the values in nh_colors are in 16-bit, but are * specified as 8-bit * 257 so we can simply divide by 257 * to get 8-bit. */ for(i = 0; i < N_NH_COLORS; i++) { r = nh_color[i].red/257; g = nh_color[i].green/257; b = nh_color[i].blue/257; if (r | g | b) { X = 0.412453 * r + 0.357580 * g + 0.180423 * b; Y = 0.212671 * r + 0.715160 * g + 0.072169 * b; Z = 0.019334 * r + 0.119193 * g + 0.950227 * b; nh_Luv[i].L = Y; d = X + 15 * Y + 3 * Z; nh_Luv[i].up = 4 * X / d; nh_Luv[i].vp = 9 * Y / d; } else { nh_Luv[i].L = 0.5; /* Zero would imply infinite ratio */ nh_Luv[i].up = nh_Luv[i].vp = 0; } } for(i = 0; i < no_glyph; i++) { if (map_glyph2colsym[i] == -1) { rgb = RGBSYM_RGB(glyph2rgbsym[i]); r = rgb>>16; g = (rgb>>8)&0xFF; b = rgb&0xFF; if (r | g | b) { X = 0.412453 * r + 0.357580 * g + 0.180423 * b; Y = 0.212671 * r + 0.715160 * g + 0.072169 * b; Z = 0.019334 * r + 0.119193 * g + 0.950227 * b; d = X + 15 * Y + 3 * Z; up = 4 * X / d; vp = 9 * Y / d; } else { Y = 0.5; up = vp = 0; } best = 0; for(j = 0; j < N_NH_COLORS; j++) { Ls = 116 * pow(nh_Luv[j].L / Y, 1/3.) - 16; if (nh_Luv[j].up || up) { /* These values are ten times the normal CIE 1976 * u* and v* values. (Chroma is much more important * in NetHack than lightness.) */ us = 130 * Ls * (nh_Luv[j].up - up); vs = 130 * Ls * (nh_Luv[j].vp - vp); } else us = vs = 0; e = Ls * Ls + us * us + vs * vs; #ifdef DEBUG fprintf(stderr, "E[(%d,%d,%d), (%d,%d,%d)] = %lg\n", nh_color[j].red/257, nh_color[j].green/257, nh_color[j].blue/257, r, g, b, e); #endif if (!j || e < err) { best = j; err = e; } } map_glyph2colsym[i] = best << 8 | RGBSYM_SYM(glyph2rgbsym[i]); for(j = i + 1; j < no_glyph; j++) if (RGBSYM_RGB(glyph2rgbsym[j]) == rgb) map_glyph2colsym[j] = best << 8 | RGBSYM_SYM(glyph2rgbsym[j]); } #ifdef DEBUG fprintf(stderr,"Glyph %d (0x%lX) -> sym %d, colour %d\n", i, glyph2rgbsym[i], map_glyph2colsym[i] & 0xFF, map_glyph2colsym[i] >> 8); #endif } free(glyph2rgbsym); } sym = map_glyph2colsym[0] & 0xFF; map_font_width = min_width = gdk_char_width_wc(map_font, (GdkWChar)sym); if (c_width > 0) map_xoffsets[sym] = c_width; for(i = 1; i < no_glyph; i++) { sym = map_glyph2colsym[i] & 0xFF; width = gdk_char_width_wc(map_font, (GdkWChar)sym); if (width > 0) map_xoffsets[sym] = width; if (width < min_width) min_width = width; if (width > map_font_width) map_font_width = width; } #else map_font_width = min_width = gdk_char_width_wc(map_font, (GdkWChar)oc_syms[0]); if (c_width > 0) map_xoffsets[oc_syms[0]] = c_width; for(i = 1; i < SIZE(oc_syms); i++) { width = gdk_char_width_wc(map_font, (GdkWChar)oc_syms[i]); if (width > 0) map_xoffsets[oc_syms[i]] = width; if (width < min_width) min_width = width; if (width > map_font_width) map_font_width = width; } for(i = 0; i < SIZE(showsyms); i++) { width = gdk_char_width_wc(map_font, (GdkWChar)showsyms[i]); if (width > 0) map_xoffsets[showsyms[i]] = width; if (width < min_width) min_width = width; if (width > map_font_width) map_font_width = width; } for(i = 0; i < SIZE(monsyms); i++) { width = gdk_char_width_wc(map_font, (GdkWChar)monsyms[i]); if (width > 0) map_xoffsets[monsyms[i]] = width; if (width < min_width) min_width = width; if (width > map_font_width) map_font_width = width; } for(i = 0; i < SIZE(warnsyms); i++) { width = gdk_char_width_wc(map_font, (GdkWChar)warnsyms[i]); if (width > 0) map_xoffsets[warnsyms[i]] = width; if (width < min_width) min_width = width; if (width > map_font_width) map_font_width = width; } #endif /* GTK_PROXY */ if (min_width <= 0) pline("Warning: Not all expected glyphs present in map font \"%s\".", map_font_name); /* Convert widths to offsets */ for(i = 0; i < 256; i++) if (map_xoffsets[i]) map_xoffsets[i] = (map_font_width - map_xoffsets[i]) / 2; return 1; } /* * -1: deallocate * zero: character * else: various tiles */ int nh_set_map_visual(int mode) { static int setting_visual = FALSE; /* Ignore recursive calls */ int saved_vis = map_visual; gchar *buf; GdkCursor *cursor; GtkWidget *progress; if (setting_visual) return 0; setting_visual++; if (mode < -1 || mode > no_tileTab) panic("Bad visual!\n"); if (saved_vis != mode) { if (map) gtk_widget_hide(map); if (saved_vis > 0) x_tile_destroy(); switch_mode: if (mode < 0) { map_visual = mode; setting_visual--; return 1; } else if (mode != 0) { /* mode 0 is handled in configure_map() */ buf = g_strdup_printf("Selecting %s", tileTab[mode].ident); progress = nh_gtk_progress_window_new(buf, GTK_WINDOW(main_window)); g_free(buf); if (tileTab[mode].ident[0]) { Tile = tileTab + mode; x_tile_init_add_stages(Tile, NH_GTK_PROGRESS_WINDOW(progress)); } gtk_widget_realize(progress); #if GTK_CHECK_VERSION(2,2,0) cursor = gdk_cursor_new_for_display( gdk_drawable_get_display(progress->window), GDK_WATCH); #else cursor = gdk_cursor_new(GDK_WATCH); #endif gdk_window_set_cursor(progress->window, cursor); gdk_cursor_unref(cursor); gtk_widget_show_now(progress); if (!tileTab[mode].ident[0]) map_mode = XSHM_MAP_NONE; else { map_mode = x_tile_init(Tile, NH_GTK_PROGRESS_WINDOW(progress)); while(gtk_events_pending()) gtk_main_iteration(); } if (map_mode != XSHM_MAP_NONE) { c_width = Tile->unit_width; c_height = Tile->unit_height; c_3dwidth = Tile->unit_width - Tile->ofsetx_3d; c_3dheight = Tile->unit_height - Tile->ofsety_3d; c_3dofset = Tile->ofsetx_3d; c_map_width = c_3dwidth * (no_cols - 1) + c_3dofset * no_rows + Tile->unit_width; c_map_height = c_3dheight * (no_rows - 1) + Tile->unit_height; } else { if (saved_vis > 0 && tileTab[saved_vis].ident || !saved_vis) { gtk_widget_destroy(progress); pline("Warning: Switching back to %s.", saved_vis?tileTab[saved_vis].ident:"character mode"); mode = saved_vis; saved_vis = -1; goto switch_mode; } else if (map_visual > 0) { gtk_widget_destroy(progress); panic("Failed to switch back to previous mode."); } else { setting_visual--; gtk_widget_destroy(progress); return 0; } } map = xshm_map_init(map_mode, c_map_width, c_map_height); while(gtk_events_pending()) gtk_main_iteration(); gtk_widget_destroy(progress); } map_visual = mode; if (GTK_WIDGET_REALIZED(map)) configure_map(map, 0); nh_map_check_visibility(); #ifdef WINGTK_RADAR nh_radar_update(); #endif nh_option_cache_set("tileset", tileTab[map_visual].ident); nh_map_redraw(); nh_map_flush(); gtk_widget_show(map); } setting_visual--; return 1; } int nh_get_map_visual(void) { return map_visual; } int nh_check_map_visual(int mode) { if (mode < 0 || mode > no_tileTab || mode && !tileTab[mode].ident[0]) return -1; else return 0; } int nh_set_map_font(gchar *name) { PangoFontDescription *desc; g_return_if_fail(name != NULL); if (map_font_name) { if (!strcmp(name, map_font_name)) return 0; else g_free(map_font_name); } map_font_name = g_strdup(name); if (map_font) { gdk_font_unref(map_font); desc = pango_font_description_from_string(name); map_font = gdk_font_from_description(desc); pango_font_description_free(desc); if (map_visual >= 0) { configure_map(map, 0); nh_map_redraw(); } } return 0; } gchar * nh_get_map_font(void) { if (map_font_name) return g_strdup(map_font_name); else if (map && map->style && map->style->font_desc) return pango_font_description_to_string(map->style->font_desc); else return NULL; } #ifdef WINGTK_RADAR static gint radar_expose_event(GtkWidget *widget, GdkEventExpose *event) { gdk_draw_pixmap(widget->window, widget->style->fg_gc[GTK_WIDGET_STATE(widget)], radar_pixmap2, event->area.x, event->area.y, event->area.x, event->area.y, event->area.width, event->area.height); return FALSE; } static gint radar_configure_event(GtkWidget *widget, GdkEventConfigure *event, gpointer data) { /* * The drawing area has changed size (or is receiving its initial * size). This always happens under program control. * We need to (re-)create the pixmaps to match. */ GdkPixmap *pixmap; GdkGC *gc; gint w, h; if (radar_pixmap2) gdk_pixmap_unref(radar_pixmap2); radar_pixmap2 = gdk_pixmap_new(widget->window, event->width, event->height, -1); gc = gdk_gc_new(radar_pixmap2); gdk_gc_set_foreground(gc, &nh_color[CLR_BLACK]); gdk_draw_rectangle(radar_pixmap2, gc, TRUE, 0, 0, event->width, event->height); gdk_gc_unref(gc); pixmap = gdk_pixmap_new(widget->window, event->width, event->height, -1); gc = gdk_gc_new(pixmap); gdk_gc_set_foreground(gc, &nh_color[CLR_BLACK]); gdk_draw_rectangle(pixmap, gc, TRUE, 0, 0, event->width, event->height); if (radar_pixmap) { gdk_drawable_get_size(GDK_DRAWABLE(radar_pixmap), &w, &h); if (w > event->width) w = event->width; if (h > event->height) h = event->height; gdk_draw_pixmap(pixmap, gc, radar_pixmap, 0, 0, 0, 0, w, h); gdk_pixmap_unref(radar_pixmap); } gdk_gc_unref(gc); radar_pixmap = pixmap; return FALSE; } static gint radar_destroy_event(GtkWidget *widget, gpointer data) { nh_radar_set_use(FALSE); return TRUE; } #endif /* WINGTK_RADAR */ static gint map_button_event(void *map, GdkEventButton *event, gpointer data) { int x, y; y = event->y / c_3dheight; if (y < 0 || y >= no_rows) /* Click outside area of map */ return FALSE; x = (event->x - (no_rows - y) * c_3dofset ) / c_3dwidth; if (x < 0 || x >= no_cols) return FALSE; GTK_curs(NHW_MAP, x, y); if (event->button == 1) cursm = CLICK_1; else cursm = CLICK_2; if (map_click) quit_hook(); return FALSE; } void nh_map_check_visibility() { nh_map_cliparound(cursx, cursy, FALSE); } void nh_map_clear(int rows, int cols, int layers) { int i, j, k; int glyph = cmap_to_glyph(S_stone); const char *tileset = nh_option_cache_get("tileset"); nh_conf_map_dimens(rows, cols, layers, FALSE); /* * Check if tileset has changed and change map_visual if required. * This can happen if tileset changed via doset() and doredraw() was * called. --ALI */ if (strcmp(tileset, tileTab[map_visual].ident)) { int i; for(i = 0; i <= no_tileTab; i++) if (!strcmp(tileset, tileTab[i].ident)) { nh_set_map_visual(i); break; } if (i > no_tileTab) { pline("Tileset %s not valid.", tileset); nh_option_cache_set("tileset", tileTab[map_visual].ident); } } /* TODO: We should implement a method of quickly clearing large * portions of the map to a (repeating) tile to speed this up. */ for(j = 0; j < rows; j++) for(i = 0; i < cols; i++) for(k = 0; k < layers; k++) if (GTKMAP(j, i)->glyphs[k] != NO_GLYPH) { GTKMAP(j, i)->glyphs[k] = NO_GLYPH; GTKMAP(j, i)->flags = TILEMAP_UPDATE; /* Reset all flags */ map_update = 1; } } void nh_map_destroy() { int i; nh_conf_map_dimens(-1, -1, -1, FALSE); nh_set_map_visual(-1); if (map_font) { gdk_font_unref(map_font); free(map_xoffsets); } #ifdef GTK_PROXY if (map_glyph2colsym) { free(map_glyph2colsym); map_glyph2colsym = (short *)0; } #endif gdk_gc_unref(map_gc); for (i = 0; i < N_NH_COLORS; i++) gdk_gc_unref(map_color_gc[i]); x_tile_destroy(); xshm_map_destroy(); } static int configure_map(GtkWidget *w, gpointer data) { int i; int width, height; guint path_length; gchar *path; /* * Configure for new font metrics */ if (map_visual == 0) { nh_conf_map_font(); c_width = map_font_width; c_height = map_font->ascent + map_font->descent; c_3dwidth = c_width; c_3dheight = c_height; c_3dofset = 0; c_map_width = no_cols * c_width; c_map_height = no_rows * c_height; w = map = xshm_map_init(XSHM_MAP_PIXMAP, c_map_width, c_map_height); } /* * set gc */ if (!map_gc) map_gc = gdk_gc_new(w->window); #define COLOUR_IS_RGB(colour,r,g,b) \ ((colour).red==(r) && (colour).green==(g) && (colour).blue==(b)) if (COLOUR_IS_RGB(w->style->bg[GTK_STATE_NORMAL], 0, 0, 0)) nh_color[CLR_BLACK] = nh_color[MAP_WHITE]; else if (COLOUR_IS_RGB(w->style->bg[GTK_STATE_NORMAL], 65535, 65535, 65535)) nh_color[CLR_WHITE] = nh_color[MAP_BLACK]; #undef COLOUR_IS_RGB for(i = 0; i < N_NH_COLORS; i++) { if (!map_color_gc[i]) map_color_gc[i] = gdk_gc_new(w->window); gdk_gc_set_foreground(map_color_gc[i], &nh_color[i]); gdk_gc_set_background(map_color_gc[i], &w->style->bg[GTK_STATE_NORMAL]); } return FALSE; } GtkWidget * nh_map_new(GtkWidget *w) { int i; int width, height; int visual; visual = tile_scan(); nh_conf_map_dimens(21, 80, 1, FALSE); map = xshm_map_init(XSHM_MAP_NONE, 0, 0); gtk_widget_set_name(map, "map"); xshm_map_button_handler(GTK_SIGNAL_FUNC(map_button_event), NULL); gtk_signal_connect_after(GTK_OBJECT(map), "realize", GTK_SIGNAL_FUNC(configure_map), 0); if (!nh_set_map_visual(visual)) { for(i = 0; i <= no_tileTab; i++) if (i != visual && nh_set_map_visual(i)) break; if (i > no_tileTab) panic("No valid map modes!"); } nh_map_clear(no_rows, no_cols, no_layers); return map; } #ifdef WINGTK_RADAR /* * create radar */ void nh_radar_destroy() { if (radar_pixmap) gdk_pixmap_unref(radar_pixmap); if (radar_pixmap2) gdk_pixmap_unref(radar_pixmap2); gtk_widget_destroy(radar); } GtkWidget * nh_radar_new() { radar = nh_session_window_new("radar"); #if GTK_CHECK_VERSION(1,3,12) gtk_window_add_accel_group(GTK_WINDOW(radar), accel_group); #else gtk_accel_group_attach(accel_group, G_OBJECT(radar)); #endif radar_is_created = 1; gtk_window_set_title(GTK_WINDOW(radar), DEF_GAME_NAME " Radar"); radar_darea = nh_gtk_new_and_add(gtk_drawing_area_new(), radar, ""); gtk_signal_connect(GTK_OBJECT(radar_darea), "expose_event", GTK_SIGNAL_FUNC(radar_expose_event), NULL); gtk_signal_connect(GTK_OBJECT(radar_darea), "configure_event", GTK_SIGNAL_FUNC(radar_configure_event), NULL); gtk_signal_connect(GTK_OBJECT(radar), "delete_event", GTK_SIGNAL_FUNC(radar_destroy_event), 0); if (use_radar && NH_RADAR_WIDTH > 0 && NH_RADAR_HEIGHT > 0) { gtk_drawing_area_size(GTK_DRAWING_AREA(radar_darea), NH_RADAR_WIDTH, NH_RADAR_HEIGHT); gtk_widget_show(radar); } return radar; } static void nh_radar_configure() { if (NH_RADAR_WIDTH > 0 && NH_RADAR_HEIGHT > 0) { gtk_drawing_area_size(GTK_DRAWING_AREA(radar_darea), NH_RADAR_WIDTH, NH_RADAR_HEIGHT); nh_radar_update(); if (use_radar) gtk_widget_show(radar); } else { if (radar_pixmap) gdk_pixmap_unref(radar_pixmap); if (radar_pixmap2) gdk_pixmap_unref(radar_pixmap2); radar_pixmap = NULL; radar_pixmap2 = NULL; } } void nh_print_radar(int x, int y, struct tilemap *tmap) { int k, glyph; int c; if (!radar_pixmap) return; glyph = cmap_to_glyph(S_stone); for(k = 0; k < no_layers; k++) if (tmap->glyphs[k] != NO_GLYPH) { glyph = tmap->glyphs[k]; break; } c = CLR_BLACK; if (glyph < PM_ARCHEOLOGIST) c = RADAR_MONSTER; else if (glyph_is_monster(glyph)) c = RADAR_HUMAN; else if (glyph_is_pet(glyph)) c = RADAR_PET; else if (glyph_is_object(glyph)) c = RADAR_OBJECT; else if (glyph_is_trap(glyph)) c = RADAR_TRAP; else if (glyph_is_swallow(glyph)) c = RADAR_SWALLOW; else if( glyph_is_cmap(glyph)) { if (glyph == GLYPH_CMAP_OFF) ; else if (glyph <= GLYPH_CMAP_OFF + S_trwall) c = RADAR_WALL; else if (glyph <= GLYPH_CMAP_OFF + S_hcdoor) c = RADAR_DOOR; else if (glyph <= GLYPH_CMAP_OFF + S_litcorr) c = RADAR_FLOOR; else if (glyph <= GLYPH_CMAP_OFF + S_dnladder) c = RADAR_LADDER; else if (glyph <= GLYPH_CMAP_OFF + S_pool) c = RADAR_WATER; else if (glyph <= GLYPH_CMAP_OFF + S_ice) c = RADAR_ICE; /* fountain sink ice */ else if (glyph <= GLYPH_CMAP_OFF + S_lava) c = RADAR_LAVA; /* lava */ else if (glyph <= GLYPH_CMAP_OFF + S_hcdbridge) c = RADAR_BRIDGE; /* bridge */ else if (glyph <= GLYPH_CMAP_OFF + S_air) c = RADAR_AIR; /* air */ else if (glyph <= GLYPH_CMAP_OFF + S_cloud) c = RADAR_CLOUD; /* cloud */ else if (glyph <= GLYPH_CMAP_OFF + S_water) c = RADAR_WATER; /* water */ else if (glyph < GLYPH_CMAP_OFF + S_explode9) c = RADAR_BEAM; /* beam */ } else c = RADAR_WALL; gdk_draw_rectangle(radar_pixmap, map_color_gc[c], TRUE, x * NH_RADAR_UNIT, y * NH_RADAR_UNIT, NH_RADAR_UNIT, NH_RADAR_UNIT); } #endif /* WINGTK_RADAR */ #ifndef GTK_PROXY #ifdef TEXTCOLOR #define zap_color(n) (zapcolors[n]) #define cmap_color(n) (defsyms[n].color) #define obj_color(n) (objects[n].oc_color) #define mon_color(n) (mons[n].mcolor) #define pet_color(n) (mons[n].mcolor) #else #define zap_color(n) (n) #define cmap_color(n) (n) #define obj_color(n) (n) #define mon_color(n) (n) #define pet_color(n) (n) #endif #endif /* GTK_PROXY */ static void nh_map_print_glyph_traditional(XCHAR_P x, XCHAR_P y, struct tilemap *tmap) { static GdkRectangle update_rect; int color; int k, glyph; #ifndef GTK_PROXY int offset; #endif GdkWChar ch[2]; color = 0; glyph = cmap_to_glyph(S_stone); for(k = 0; k < no_layers; k++) if (tmap->glyphs[k] != NO_GLYPH) { glyph = tmap->glyphs[k]; break; } #ifdef GTK_PROXY ch[0] = map_glyph2colsym[glyph] & 0xFF; color = map_glyph2colsym[glyph] >> 8 & 0xFF; #else if ((offset = (glyph - GLYPH_SWALLOW_OFF)) >= 0) { /* swallow */ ch[0] = (uchar) showsyms[S_sw_tl + (offset & 0x7)]; color = mon_color(offset>>3); } else if ((offset = (glyph - GLYPH_ZAP_OFF)) >= 0) { /* zap beam */ ch[0] = showsyms[S_vbeam + (offset & 0x3)]; color = zap_color(offset>>2); } else if ((offset = (glyph - GLYPH_CMAP_OFF)) >= 0) {/* cmap */ ch[0] = showsyms[offset]; color = cmap_color(offset); } else if ((offset = (glyph - GLYPH_OBJ_OFF)) >= 0) { /* object */ ch[0] = oc_syms[(int)objects[offset].oc_class]; color = obj_color(offset); } else if ((offset = (glyph - GLYPH_BODY_OFF)) >= 0) {/* a corpse */ ch[0] = oc_syms[(int)objects[CORPSE].oc_class]; color = mon_color(offset); } else if ((offset = (glyph - GLYPH_PET_OFF)) >= 0) { /* a pet */ ch[0] = monsyms[(int)mons[offset].mlet]; color = pet_color(offset); } else{ /* a monster */ ch[0] = monsyms[(int)mons[glyph].mlet]; color = mon_color(glyph); } #endif ch[1] = '\0'; gdk_draw_rectangle(xshm_map_pixmap, map->style->bg_gc[GTK_WIDGET_STATE(map)], TRUE, x * c_width, y * c_height - map_font->ascent, c_width, c_height); gdk_draw_text_wc(xshm_map_pixmap, map_font, copts.use_color ? map_color_gc[color] : map->style->fg_gc[GTK_WIDGET_STATE(map)], x * c_width + map_xoffsets[ch[0]], y * c_height, ch, 1); if (glyph_is_pet(glyph) && copts.hilite_pet) { gdk_draw_rectangle(xshm_map_pixmap, map_color_gc[copts.use_color ? CLR_RED : CLR_WHITE], FALSE, x * c_width, y * c_height - map_font->ascent, c_width - 1, c_height - 1); } else if (x == cursx && y == cursy) gdk_draw_rectangle(xshm_map_pixmap, map_color_gc[CLR_WHITE], FALSE, x * c_width, y * c_height - map_font->ascent, c_width - 1, c_height - 1); update_rect.x = x * c_width; update_rect.y = y * c_height - map_font->ascent; update_rect.width = c_width; update_rect.height = c_height; xshm_map_draw(&update_rect); } /* * The assumption that the glyph in the layer furthest from the viewer is * the only surface glyph present is flawed. However, it's the best we can * do without knowing details of the tileset in use. This might well be a * sensible addition, but for now, this suffices. */ static void nh_map_print_glyph_tmp(struct tilemap *tmap, int ofsx, int ofsy, int dosurface) { int k, tile; if (Tile->transparent) { if (dosurface) { tile = GLYPH2TILE(tmap->glyphs[no_layers - 1]); x_tile_tmp_draw_tile(tile, ofsx, ofsy); } else for(k = no_layers - 2; k >= 0; k--) if (tmap->glyphs[k] != NO_GLYPH) { tile = glyph2tile[tmap->glyphs[k]]; x_tile_tmp_draw_tile(tile, ofsx, ofsy); } } else if (!dosurface) { for(k = 0; k < no_layers - 1; k++) if (tmap->glyphs[k] != NO_GLYPH) break; tile = GLYPH2TILE(tmap->glyphs[k]); x_tile_tmp_draw_tile(tile, ofsx, ofsy); } if (!dosurface) { if (tmap == GTKMAP(cursy, cursx)) x_tile_tmp_draw_rectangle(ofsx, ofsy, MAP_WHITE); else if (copts.hilite_pet) for(k = 0; k < no_layers; k++) if (glyph_is_pet(tmap->glyphs[k])) { x_tile_tmp_draw_rectangle(ofsx, ofsy, CLR_RED); break; } } } #define NH_MAP_PRINT_GLYPH_TMP(y, x, j, i, k) \ nh_map_print_glyph_tmp(GTKMAP((y)+(j), (x)+(i)), \ (i)*c_3dwidth - (j)*c_3dofset, (j)*c_3dheight, k) /* * The ordering of glyph drawing here is very complex in order to * meet the following rules: * - Surface glyphs should never obscure anything. * - Glyphs in locations towards the bottom of the screen should * obscure glyphs higher up. * - Glyphs in locations towards the right of the screen should * obscure glyphs to the left. * * Note that these rules are not perfect. For example, a dragon standing * in a doorway of a horizontal wall will correctly have part of the * right hand of its body obscured by the wall to its right, but its * feet stick out under the wall and are thus visible. Where possible, * tiles should be drawn with these problems in mind so that the * experience is not spoiled for the player. */ static void nh_map_print_glyph_tile(XCHAR_P x, XCHAR_P y, struct tilemap *tmap) { int k; x_tile_tmp_clear(); if (Tile->spread) { for(k = 1; k >= 0; k--) { if (y > 0) { if (x > 0) NH_MAP_PRINT_GLYPH_TMP(y, x, -1, -1, k); NH_MAP_PRINT_GLYPH_TMP(y, x, -1, 0, k); } if (x > 0) NH_MAP_PRINT_GLYPH_TMP(y, x, 0, -1, k); NH_MAP_PRINT_GLYPH_TMP(y, x, 0, 0, k); if (x < no_cols - 1) NH_MAP_PRINT_GLYPH_TMP(y, x, 0, 1, k); if (y < no_rows - 1) { NH_MAP_PRINT_GLYPH_TMP(y, x, 1, 0, k); if (x < no_cols - 1) NH_MAP_PRINT_GLYPH_TMP(y, x, 1, 1, k); } } } else { NH_MAP_PRINT_GLYPH_TMP(y, x, 0, 0, 1); NH_MAP_PRINT_GLYPH_TMP(y, x, 0, 0, 0); } x_tile_draw_tmp(x * c_3dwidth + (no_rows - y) * c_3dofset, y * c_3dheight); } static void nh_map_print_glyph_simple_tile(XCHAR_P x, XCHAR_P y, struct tilemap *tmap) { int k; for(k = 0; k < no_layers - 1; k++) if (tmap->glyphs[k] != NO_GLYPH) break; x_tile_draw_tile(GLYPH2TILE(tmap->glyphs[k]), x * c_width, y * c_height); if (x == cursx && y == cursy) x_tile_draw_rectangle(x * c_width, y * c_height, &nh_color[MAP_WHITE]); else if (copts.hilite_pet) for(k = 0; k < no_layers; k++) if (glyph_is_pet(tmap->glyphs[k])) { x_tile_draw_rectangle(x * c_width, y * c_height, &nh_color[CLR_RED]); break; } } static void nh_map_print_glyph(XCHAR_P x, XCHAR_P y, struct tilemap *tmap) { #ifdef WINGTK_RADAR nh_print_radar(x, y, tmap); #endif if (map_visual == 0) nh_map_print_glyph_traditional(x, y, tmap); else if (!Tile->transparent && !Tile->spread) nh_map_print_glyph_simple_tile(x, y, tmap); else nh_map_print_glyph_tile(x, y, tmap); } void GTK_ext_print_glyph_layered(winid id, int nl, struct proxy_glyph_layer *layers) { int i, j, k, x, y; struct proxy_glyph_layer *l; for(k = 0, l = layers; k < nl; k++, l++) for(j = 0, y = l->start; j < l->nr; j++, y++) for(i = 0, x = l->rows[j].start; i < l->rows[j].ng; i++, x++) if (GTKMAP(y, x)->glyphs[k] != l->rows[j].glyphs[i]) { GTKMAP(y, x)->glyphs[k] = l->rows[j].glyphs[i]; GTKMAP(y, x)->flags |= TILEMAP_UPDATE; map_update = 1; } } void GTK_ext_print_glyph(winid id, int x, int y, int glyph) { int k; if (GTKMAP(y, x)->glyphs[0] != glyph || GTKMAP(y, x)->flags != 0) { GTKMAP(y, x)->glyphs[0] = glyph; GTKMAP(y, x)->flags = TILEMAP_UPDATE; map_update = 1; } for (k = 1; k < no_layers; k++) if (GTKMAP(y, x)->glyphs[k] != NO_GLYPH) { GTKMAP(y, x)->glyphs[k] = NO_GLYPH; GTKMAP(y, x)->flags |= TILEMAP_UPDATE; map_update = 1; } } void GTK_curs(winid id, int x, int y) { if (id != NHW_MAP) return; if (cursx != x || cursy != y) { map_update = 1; GTKMAP(y, x)->flags |= TILEMAP_UPDATE; GTKMAP(cursy, cursx)->flags |= TILEMAP_UPDATE; cursx = x; cursy = y; } } #ifdef WINGTK_RADAR static void nh_radar_redraw() { int i, j; for(j = 0; j < no_rows; j++) for(i = 0; i < no_cols; i++) nh_print_radar(i, j, GTKMAP(j, i)); nh_radar_update(); } boolean nh_radar_get_use(void) { return use_radar; } void nh_radar_set_use(boolean use) { int old = use_radar; use_radar = use; if (radar_is_created) { if (!use) gtk_widget_hide(radar); else { gtk_window_present(GTK_WINDOW(radar)); if (!old) nh_radar_redraw(); } } } void nh_radar_update() { GdkRectangle update_rect; GtkAdjustment *hadj, *vadj; if (use_radar && radar_pixmap2 && map && map_gc) { hadj = xshm_map_get_hadjustment(); vadj = xshm_map_get_vadjustment(); gdk_draw_pixmap(radar_pixmap2, map_gc, radar_pixmap, 0, 0, 0, 0, NH_RADAR_WIDTH, NH_RADAR_HEIGHT); gdk_draw_rectangle(radar_pixmap2, map_color_gc[CLR_WHITE], FALSE, hadj->value / c_3dwidth * NH_RADAR_UNIT, vadj->value / c_3dheight * NH_RADAR_UNIT, hadj->page_size / c_3dwidth * NH_RADAR_UNIT, vadj->page_size / c_3dheight * NH_RADAR_UNIT); update_rect.x = 0; update_rect.y = 0; update_rect.width = NH_RADAR_WIDTH; update_rect.height = NH_RADAR_HEIGHT; gtk_widget_draw(radar, &update_rect); gdk_window_raise(radar->window); } } #endif /* WINGTK_RADAR */ static void nh_map_cliparound(int x, int y, gboolean exact) { static int sx = -1, sy; if (!map || !exact && sx >= 0 && (x - sx) * (x - sx) + (y - sy) * (y - sy) <= map_clip_dist2) return; sx = x; sy = y; xshm_map_cliparound(x * c_3dwidth + (no_rows - y) * c_3dofset, y * c_3dheight); } #undef DIFF void GTK_cliparound(int x, int y) { nh_map_cliparound(x, y, FALSE); } /* * [ALI] * This function returns a pixmap of size 3dwidth x 3dheight pixels. * In non-3D mode, this is the full tile size, but in 3D mode this * strips out the 3D part. A complete algorithm for extracting the * non-3D part of the tile is quite complex (see bigtile.c for a * starting point), but since this routine is currently only used * for objects, we can safely assume that all tiles are padded, * ie., that the non-3D part is centered in the tile. */ GdkPixmap * GTK_glyph_to_gdkpixmap(int glyph) { int tile; int width, height; GdkPixmap *pix; width = Tile->unit_width - Tile->ofsetx_3d; height = Tile->unit_height - Tile->ofsety_3d; pix = gdk_pixmap_new(NULL, width, height, gdk_visual_get_system()->depth); if (!pix) return NULL; tile = fix_tile(GLYPH2TILE(glyph)); if (!x_tile_render_to_drawable(pix, map_gc, tile, Tile->ofsetx_3d/2, Tile->ofsety_3d/2, 0, 0, width, height)) { gdk_pixmap_unref(pix); pix = NULL; } return pix; } void nh_map_click(int f) { map_click = f; } void nh_map_pos(int *x, int *y, int *mod) { *x = cursx; *y = cursy; *mod = cursm; } static void nh_map_redraw() { int i, j; map_update = 1; for(j = 0; j < no_rows; j++) for(i = 0; i < no_cols; i++) GTKMAP(j, i)->flags |= TILEMAP_UPDATE; } void nh_map_color_changed(boolean new_value) { if (map_visual == 0) nh_map_redraw(); } void nh_map_hilite_pet_changed(boolean new_value) { int i, j, k; map_update = 1; for(j = 0; j < no_rows; j++) for(i = 0; i < no_cols; i++) for(k = 0; k < no_layers; k++) if (glyph_is_pet(GTKMAP(j, i)->glyphs[k])) GTKMAP(j, i)->flags |= TILEMAP_UPDATE; } void nh_map_flush() { int i, j; if (!xshm_map_pixmap && !xshm_map_image && !xshm_map_pixbuf) return; /* Map not realized yet - pend flush */ if (map_update) { map_update = 0; for(j = 0; j < no_rows; j++) for(i = 0; i < no_cols; i++) if (GTKMAP(j, i)->flags & TILEMAP_UPDATE) { GTKMAP(j, i)->flags &= ~TILEMAP_UPDATE; nh_map_print_glyph(i, j, GTKMAP(j, i)); } nh_map_check_visibility(); xshm_map_flush(); #ifdef WINGTK_RADAR nh_radar_update(); #endif } GTK_curs(NHW_MAP, cursx, cursy); } int nh_tile_height() { return c_height; } int nh_tile_3dheight() { return c_3dheight; } slashem-0.0.7E7F3/win/gtk/Makefile.unx0000664000076400007640000001104010545462317015503 0ustar aliali# $Id: Makefile.unx,v 1.7 2003/12/08 22:20:49 j_ali Exp $ # Copyright (c) Slash'EM Development Team 2002-2003 # NetHack may be freely redistributed. See license for details. # # This makefile is for making gtkhack, a seperate program which talks # to a game executable using the NhExt protocol. AWK = awk CC = gcc # Where the NhProxy library is installed. NHPROXYLIB = ../../src # and its associated header files. NHPROXYINC = ../../include # The pkg-config executable PKG_CONFIG = pkg-config # A semi-colon seperated list of directories to add to PKG_CONFIG_PATH # so that pkg-config can find the package config files (eg., gtk+-2.0.pc). PKG_CONFIG_PATH = /usr/devel/lib/pkgconfig # The pkg-config commands GTKCFLAGS = $(PKG_CONFIG) --cflags gtk+-2.0 GTKLIBS = $(PKG_CONFIG) --libs gtk+-2.0 # Debugging CFLAGS = -g -I$(NHPROXYINC) -DGTKHACK LFLAGS = -g #CFLAGS = -O -I$(NHPROXYINC) -DGTKHACK #LFLAGS = LIBS = -lpthread # ---------------------------------------- # # Nothing below this line should have to be changed. # timestamps for primary header files, matching src/Makefile CONFIG_H = ../../src/config.h-t HACK_H = ../../src/hack.h-t all: gtkhack .c.o: $(CC) `$(GTKCFLAGS)` $(CFLAGS) -c $< CSRC = gtkhack.c gtk.c gtkgetlin.c gtkstatus.c gtkmenu.c gtkyn.c gtkextcmd.c \ gtkmap.c gtkmessage.c gtkmisc.c gtktile.c xshmmap.c gtkext.c \ gtkhackrc.c gtkprefs.c panic.c gtkconnect.c gtkconcb.c gtksupport.c \ gtkprogress.c OBJS = gtkhack.o gtk.o gtkgetlin.o gtkstatus.o gtkmenu.o gtkyn.o gtkextcmd.o \ gtkmap.o gtkmessage.o gtkmisc.o gtktile.o xshmmap.o gtkext.o \ gtkhackrc.o gtkprefs.o panic.o gtkconnect.o gtkconcb.o gtksupport.o \ gtkprogress.o gtkhack: $(OBJS) $(NHPROXYLIB)/nhproxy.a $(CC) `$(GTKLIBS)` $(LFLAGS) -o $@ $(OBJS) $(NHPROXYLIB)/nhproxy.a $(LIBS) clean: $(RM) *.o gtkhack spotless: clean depend: ../../sys/unix/depend.awk $(CSRC) $(AWK) -f ../../sys/unix/depend.awk ../../include/*.h $(CSRC) | \ sed -e 's:\.\./include:\.\./\.\./include:g' -e 's:\.\./win/gtk/::g' \ -e 's:touch:@echo /**/ >>:' > makedep @echo '/^# DO NOT DELETE THIS LINE OR CHANGE ANYTHING BEYOND IT/+2,$$d' >eddep @echo '$$r makedep' >>eddep @echo 'w' >>eddep @cp Makefile.unx Makefile.bak ed - Makefile.unx < eddep ed - Makefile.w32 < eddep @rm -f eddep makedep @echo '# DEPENDENCIES MUST END AT END OF FILE' >> Makefile.unx @echo '# IF YOU PUT STUFF HERE IT WILL GO AWAY' >> Makefile.unx @echo '# see make depend above' >> Makefile.unx @echo '# DEPENDENCIES MUST END AT END OF FILE' >> Makefile.w32 @echo '# IF YOU PUT STUFF HERE IT WILL GO AWAY' >> Makefile.w32 @echo '# see Makefile.unx' >> Makefile.w32 - diff Makefile.bak Makefile.unx @rm -f Makefile.bak # DO NOT DELETE THIS LINE OR CHANGE ANYTHING BEYOND IT # config.h timestamp $(CONFIG_H): ../../include/config.h @echo /**/ >> $(CONFIG_H) # hack.h timestamp $(HACK_H): ../../include/hack.h @echo /**/ >> $(HACK_H) # gtkhack.o: gtkhack.c ../../include/winGTK.h ../../include/prxyclnt.h \ ../../include/proxycb.h gtkconnect.h \ gtksupport.h gtk.o: gtk.c ../../include/md5.h ../../include/winGTK.h ../../include/wintype.h \ ../../include/func_tab.h ../../include/dlb.h ../../include/patchlevel.h \ ../../include/proxycb.h ../../include/prxyclnt.h gtkgetlin.o: gtkgetlin.c ../../include/winGTK.h gtkstatus.o: gtkstatus.c ../../include/winGTK.h gtkmenu.o: gtkmenu.c ../../include/winGTK.h ../../include/patchlevel.h gtkyn.o: gtkyn.c ../../include/winGTK.h gtkextcmd.o: gtkextcmd.c ../../include/winGTK.h ../../include/proxycb.h \ ../../include/func_tab.h gtkmap.o: gtkmap.c ../../include/winGTK.h ../../include/dlb.h \ ../../include/patchlevel.h ../../include/decl.h ../../include/proxycb.h \ ../../include/prxyclnt.h gtkprogress.h gtkmessage.o: gtkmessage.c ../../include/winGTK.h gtkmisc.o: gtkmisc.c ../../include/winGTK.h ../../include/proxycb.h gtktile.o: gtktile.c ../../include/winGTK.h ../../include/dlb.h ../../include/proxycb.h \ ../../include/prxyclnt.h gtkprogress.h xshmmap.o: xshmmap.c ../../include/winGTK.h gtkext.o: gtkext.c ../../include/winGTK.h ../../include/prxyclnt.h gtkhackrc.o: gtkhackrc.c ../../include/winGTK.h gtkprefs.o: gtkprefs.c ../../include/winGTK.h ../../include/patchlevel.h panic.o: panic.c $(CONFIG_H) gtkconnect.o: gtkconnect.c gtkconcb.h gtkconnect.h \ gtksupport.h gtkconcb.o: gtkconcb.c gtkconcb.h gtkconnect.h \ gtksupport.h ../../include/winGTK.h \ ../../include/prxyclnt.h gtksupport.o: gtksupport.c gtksupport.h gtkprogress.o: gtkprogress.c ../../include/winGTK.h gtkprogress.h # DEPENDENCIES MUST END AT END OF FILE # IF YOU PUT STUFF HERE IT WILL GO AWAY # see make depend above slashem-0.0.7E7F3/win/gtk/gtkconcb.h0000664000076400007640000000217610545462317015207 0ustar aliali#include void GTK_add_connection(GtkButton *button, gpointer user_data); void GTK_edit_connection(GtkTreeView *treeview, gpointer user_data); void GTK_delete_connection(GtkTreeView *treeview, gpointer user_data); void GTK_set_default_connection(GtkTreeView *treeview, gpointer user_data); void GTK_revert_connections(GtkTreeView *treeview, gpointer user_data); void GTK_create_connection(GtkWidget *widget, gpointer user_data); void GTK_browse_server_executable(GtkWidget *button, gpointer user_data); void GTK_add_file_server(GtkWidget *widget, gpointer user_data); void GTK_add_tcp_server(GtkWidget *button, gpointer user_data); void on_DisableAsync_toggled(GtkToggleButton *togglebutton, gpointer user_data); void on_EnableLogging_toggled(GtkToggleButton *togglebutton, gpointer user_data); void on_ViewLog_clicked(GtkButton *button, gpointer user_data); void on_viewlog_clear(GtkMenuItem *menuitem, gpointer user_data); void on_viewlog_save_as(GtkMenuItem *menuitem, gpointer user_data); void on_viewlog_quit(GtkMenuItem *menuitem, gpointer user_data); void on_viewlog_copy(GtkMenuItem *menuitem, gpointer user_data); slashem-0.0.7E7F3/win/gtk/gtksupport.c0000664000076400007640000000712410545462317015630 0ustar aliali/* * DO NOT EDIT THIS FILE - it is generated by Glade. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include #include #include "gtksupport.h" GtkWidget* lookup_widget (GtkWidget *widget, const gchar *widget_name) { GtkWidget *parent, *found_widget; for (;;) { if (GTK_IS_MENU (widget)) parent = gtk_menu_get_attach_widget (GTK_MENU (widget)); else parent = widget->parent; if (!parent) parent = (GtkWidget*) g_object_get_data (G_OBJECT (widget), "GladeParentKey"); if (parent == NULL) break; widget = parent; } found_widget = (GtkWidget*) g_object_get_data (G_OBJECT (widget), widget_name); if (!found_widget) g_warning ("Widget not found: %s", widget_name); return found_widget; } static GList *pixmaps_directories = NULL; /* Use this function to set the directory containing installed pixmaps. */ void add_pixmap_directory (const gchar *directory) { pixmaps_directories = g_list_prepend (pixmaps_directories, g_strdup (directory)); } /* This is an internally used function to find pixmap files. */ static gchar* find_pixmap_file (const gchar *filename) { GList *elem; /* We step through each of the pixmaps directory to find it. */ elem = pixmaps_directories; while (elem) { gchar *pathname = g_strdup_printf ("%s%s%s", (gchar*)elem->data, G_DIR_SEPARATOR_S, filename); if (g_file_test (pathname, G_FILE_TEST_EXISTS)) return pathname; g_free (pathname); elem = elem->next; } return NULL; } /* This is an internally used function to create pixmaps. */ GtkWidget* create_pixmap (GtkWidget *widget, const gchar *filename) { gchar *pathname = NULL; GtkWidget *pixmap; if (!filename || !filename[0]) return gtk_image_new (); pathname = find_pixmap_file (filename); if (!pathname) { g_warning ("Couldn't find pixmap file: %s", filename); return gtk_image_new (); } pixmap = gtk_image_new_from_file (pathname); g_free (pathname); return pixmap; } /* This is an internally used function to create pixmaps. */ GdkPixbuf* create_pixbuf (const gchar *filename) { gchar *pathname = NULL; GdkPixbuf *pixbuf; GError *error = NULL; if (!filename || !filename[0]) return NULL; pathname = find_pixmap_file (filename); if (!pathname) { g_warning ("Couldn't find pixmap file: %s", filename); return NULL; } pixbuf = gdk_pixbuf_new_from_file (pathname, &error); if (!pixbuf) { fprintf (stderr, "Failed to load pixbuf file: %s: %s\n", pathname, error->message); g_error_free (error); } g_free (pathname); return pixbuf; } /* This is used to set ATK action descriptions. */ void glade_set_atk_action_description (AtkAction *action, const gchar *action_name, const gchar *description) { gint n_actions, i; n_actions = atk_action_get_n_actions (action); for (i = 0; i < n_actions; i++) { if (!strcmp (atk_action_get_name (action, i), action_name)) atk_action_set_description (action, i, description); } } slashem-0.0.7E7F3/win/gtk/panic.c0000664000076400007640000000454610545462317014505 0ustar aliali/* $Id: panic.c,v 1.1 2003/05/03 11:12:28 j_ali Exp $ */ /* GTK+ NetHack Copyright (c) Issei Numata 1999-2000 Copyright (c) Slash'EM Development Team 2001-2002 GTK+ NetHack may be freely redistributed. See license for details. */ /* #define DEBUG */ /* Uncomment for debugging */ /* * This module implements panic() and friends for when linked as an * external proxy module. Based on util/panic.c and src/pline.c */ #include #include #define NEED_VARARGS #include "config.h" #ifdef AZTEC #define abort() exit() #endif #ifdef VMS extern void NDECL(vms_abort); #endif /*VARARGS1*/ boolean panicking; void VDECL(panic, (const char *,...)); void panic VA_DECL(const char *,str) VA_START(str); VA_INIT(str, char *); if(panicking++) #ifdef SYSV (void) #endif abort(); /* avoid loops - this should never happen*/ (void) fputs(" ERROR: ", stderr); Vfprintf(stderr, str, VA_ARGS); (void) fputc('\n', stderr); (void) fflush(stderr); #if defined(UNIX) || defined(VMS) # ifdef SYSV (void) # endif abort(); /* generate core dump */ #endif VA_END(); exit(EXIT_FAILURE); /* redundant */ return; } /*VARARGS1*/ /* Note that these declarations rely on knowledge of the internals * of the variable argument handling stuff in "tradstdc.h" */ #if defined(USE_STDARG) || defined(USE_VARARGS) static void FDECL(vpline, (const char *, va_list)); void pline VA_DECL(const char *, line) VA_START(line); VA_INIT(line, char *); vpline(line, VA_ARGS); VA_END(); } # ifdef USE_STDARG static void vpline(const char *line, va_list the_args) { # else static void vpline(line, the_args) const char *line; va_list the_args; { # endif #else /* USE_STDARG | USE_VARARG */ #define vpline pline void pline VA_DECL(const char *, line) #endif /* USE_STDARG | USE_VARARG */ char pbuf[BUFSZ]; extern int GTK_initialized; /* Do NOT use VA_START and VA_END in here... see above */ if (!line || !*line) return; if (index(line, '%')) { Vsprintf(pbuf,line,VA_ARGS); line = pbuf; } if (!GTK_initialized) { puts(line); (void) fflush(stdout); } else { nh_map_flush(); nh_message_putstr(line); } } /*VARARGS1*/ void impossible VA_DECL(const char *, s) VA_START(s); VA_INIT(s, const char *); vpline(s,VA_ARGS); pline("External interface in disorder - perhaps you'd better #quit."); VA_END(); } /*panic.c*/ slashem-0.0.7E7F3/win/gtk/GTKRC0000664000076400007640000000226310545462317014036 0ustar aliali# # # style "text" { font_name = "fixed Medium 12" } style "map" { # Map font: # # FIXME: There is currently no way to use the IBMgraphics option. # # Map colours: # # - These are only used in character mode. # - fg is not used when color option is set. # - The five states have no real meaning and should normally take the # same values. # - In color mode, certain values of bg[NORMAL] are checked for: # * { 0.0, 0.0, 0.0 } causes normally black symbols to be drawn in white. # * { 1.0, 1.0, 1.0 } causes normally white symbols to be drawn in black. # Note: only these exact values are detected (barring rounding errors). # bg[NORMAL] = { 0.15, 0.15, 0.15 } bg[PRELIGHT] = { 0.15, 0.15, 0.15 } bg[ACTIVE] = { 0.15, 0.15, 0.15 } bg[SELECTED] = { 0.15, 0.15, 0.15 } bg[INSENSITIVE] = { 0.15, 0.15, 0.15 } fg[NORMAL] = { 1.0, 1.0, 1.0 } fg[PRELIGHT] = { 1.0, 1.0, 1.0 } fg[ACTIVE] = { 1.0, 1.0, 1.0 } fg[SELECTED] = { 1.0, 1.0, 1.0 } fg[INSENSITIVE] = { 1.0, 1.0, 1.0 } } widget "fixed font*GtkText" style "text" widget "fixed font*GtkCList" style "text" widget "SlashEM.*.map" style "map" slashem-0.0.7E7F3/win/gtk/gtkconnect.glade0000664000076400007640000013657310545462317016412 0ustar aliali True GtkHack GTK_WINDOW_TOPLEVEL GTK_WIN_POS_NONE False True False True True False 0 True GTK_BUTTONBOX_END True True True gtk-revert-to-saved True GTK_RELIEF_NORMAL 0 True True True gtk-cancel True GTK_RELIEF_NORMAL -6 True True True True True GTK_RELIEF_NORMAL -5 True 0.5 0.5 0 0 True False 2 True gtk-yes 4 0.5 0.5 0 0 0 False False True C_onnect True False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 0 False False 0 False True GTK_PACK_END True False 0 True You may choose an existing server to connect to here, or configure a new one. False False GTK_JUSTIFY_LEFT True False 0 0.5 0 0 10 False False True 0 True True True False 0 True True True GTK_POLICY_AUTOMATIC GTK_POLICY_AUTOMATIC GTK_SHADOW_NONE GTK_CORNER_TOP_LEFT True True True True False True True 5 True True 5 True GTK_BUTTONBOX_START 5 True True True _Add... True GTK_RELIEF_NORMAL True True True _Edit... True GTK_RELIEF_NORMAL True True True _Delete True GTK_RELIEF_NORMAL True True True _Set as default True GTK_RELIEF_NORMAL 7 False True 5 True True 0 True True True Add Connection GTK_WINDOW_TOPLEVEL GTK_WIN_POS_NONE True True False True True False 0 True GTK_BUTTONBOX_END True True True gtk-cancel True GTK_RELIEF_NORMAL -6 True True True gtk-ok True GTK_RELIEF_NORMAL -5 0 False True GTK_PACK_END 5 True False 0 True Please select a name for this server connection. False False GTK_JUSTIFY_LEFT False False 0 0.5 0 0 10 False False True False 5 True _Connection name: True False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 ConnectionName 0 False False True True True True 0 True * False 0 True True 0 True True True 5 True True True Select the server type, you want to connect to False False GTK_JUSTIFY_LEFT True False 0 0.5 0 0 10 False False True False 5 True _Server type: True False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 ServerType 0 False False True True False False True False True True False True 0 True * True True GTK_SELECTION_BROWSE True True Local executable True True Remote machine 0 True True 0 False False True 5 True True True Troubleshooting False False GTK_JUSTIFY_LEFT True False 0 0.5 0 0 10 False False True True Disable _asynchronous support (will increase latency) True GTK_RELIEF_NORMAL False False True 0 False False True True Enable _logging True GTK_RELIEF_NORMAL False False True 0 False False 0 True True True Configure Remote Machine GTK_WINDOW_TOPLEVEL GTK_WIN_POS_NONE True True False True True False 0 True GTK_BUTTONBOX_END True True True gtk-cancel True GTK_RELIEF_NORMAL -6 True True True gtk-ok True GTK_RELIEF_NORMAL -5 0 False True GTK_PACK_END 5 True 2 2 False 5 5 True _Port: True False GTK_JUSTIFY_LEFT False False 0 0.5 0 0 RemoteMachinePort 0 1 1 2 fill True True True True 0 True * False 1 2 1 2 True _Hostname: True False GTK_JUSTIFY_LEFT False False 0 0.5 0 0 RemoteMachineHostname 0 1 0 1 fill True True True True 0 True * False 1 2 0 1 0 True True True Configure Local Executable GTK_WINDOW_TOPLEVEL GTK_WIN_POS_NONE True True False True True False 0 True GTK_BUTTONBOX_END True True True gtk-cancel True GTK_RELIEF_NORMAL -6 True True True gtk-ok True GTK_RELIEF_NORMAL -5 0 False True GTK_PACK_END 5 True False 0 True Please enter name of server executable False False GTK_JUSTIFY_LEFT False False 0 0.5 0 0 10 False False True False 5 True True True True 0 True * False 0 True True True True _Browse... True GTK_RELIEF_NORMAL 0 False False 0 True True 0 True True True GtkHack: Failed connection GTK_WINDOW_TOPLEVEL GTK_WIN_POS_NONE True True False True True GTK_POLICY_NEVER GTK_POLICY_AUTOMATIC GTK_SHADOW_NONE GTK_CORNER_TOP_LEFT True True True GTK_JUSTIFY_LEFT GTK_WRAP_CHAR True 0 0 0 0 0 0 True Troubleshooting GTK_WINDOW_TOPLEVEL GTK_WIN_POS_NONE False True True True True False 0 True GTK_BUTTONBOX_END True True True _View log True GTK_RELIEF_NORMAL 0 True True True gtk-close True GTK_RELIEF_NORMAL -7 0 False True GTK_PACK_END True False 0 True Are you having trouble with the connection to the game server? False False GTK_JUSTIFY_LEFT False False 0 0.5 0 0 0 False False True These settings control how gtkhack connects to servers. False False GTK_JUSTIFY_LEFT False False 0 0.5 0 0 0 False False True They allow you to troubleshoot connection related problems. False False GTK_JUSTIFY_LEFT False False 0 0.5 0 0 0 False False True 4 True False True True Disable _asynchronous support on future connections True GTK_RELIEF_NORMAL False False True 4 False False True True Enable _logging True GTK_RELIEF_NORMAL False False True 4 False False 0 True True True View connection log GTK_WINDOW_TOPLEVEL GTK_WIN_POS_NONE False True False True False 0 True True _File True True gtk-clear True True gtk-save-as True True True gtk-quit True True _Edit True True gtk-copy True 0 False False True True GTK_POLICY_AUTOMATIC GTK_POLICY_AUTOMATIC GTK_SHADOW_NONE GTK_CORNER_TOP_LEFT True True False GTK_JUSTIFY_LEFT GTK_WRAP_NONE True 0 0 0 0 0 0 0 True True slashem-0.0.7E7F3/win/gtk/gtkconcb.c0000664000076400007640000002772610545462317015212 0ustar aliali/* $Id: gtkconcb.c,v 1.3 2003/12/13 12:52:58 j_ali Exp $ */ /* Copyright (c) Slash'EM Development Team 2003 */ /* NetHack may be freely redistributed. See license for details. */ #include #include #include #include "gtkconcb.h" #include "gtkconnect.h" #include "gtksupport.h" #include "winGTK.h" #include "prxyclnt.h" void GTK_add_connection(GtkButton *button, gpointer user_data) { GtkWidget *w = create_AddConnection(); gtk_widget_show(w); } void GTK_edit_connection(GtkTreeView *treeview, gpointer user_data) { GtkTreeSelection *sel = gtk_tree_view_get_selection(treeview); GtkWidget *w = NULL; GtkEntry *entry; GtkTreeModel *model; GtkTreeIter iter; gchar *name, *scheme, *address, *port; if (gtk_tree_selection_get_selected(sel, &model, &iter)) { gtk_tree_model_get(model, &iter, COLUMN_NAME, &name, COLUMN_SCHEME, &scheme, COLUMN_ADDRESS, &address, -1); if (!strcmp(scheme, "file")) { w = create_LocalExecutable(); entry = GTK_ENTRY(lookup_widget(w, "LocalExecutablePath")); gtk_entry_set_text(GTK_ENTRY(entry), address); } else if (!strcmp(scheme, "tcp")) { w = create_RemoteMachine(); port = strrchr(address, ':'); if (port) *port++ = '\0'; else port = "2700"; /* Should never happen */ entry = GTK_ENTRY(lookup_widget(w, "RemoteMachineHostname")); gtk_entry_set_text(GTK_ENTRY(entry), address); entry = GTK_ENTRY(lookup_widget(w, "RemoteMachinePort")); gtk_entry_set_text(GTK_ENTRY(entry), port); } else g_critical("Unknown server scheme '%s'", scheme); if (w) { g_object_set_data_full(G_OBJECT(w), "connection-name", name, g_free); gtk_widget_show(w); } else g_free(name); g_free(scheme); g_free(address); } } void GTK_delete_connection(GtkTreeView *treeview, gpointer user_data) { GtkTreeSelection *sel = gtk_tree_view_get_selection(treeview); GtkTreeModel *model; GtkTreeIter iter; if (gtk_tree_selection_get_selected(sel, &model, &iter)) gtk_list_store_remove(GTK_LIST_STORE(model), &iter); } void GTK_set_default_connection(GtkTreeView *treeview, gpointer user_data) { GtkTreeSelection *sel = gtk_tree_view_get_selection(treeview); GtkTreeModel *model; GtkTreeIter iter; gchar *name; if (gtk_tree_selection_get_selected(sel, &model, &iter)) { gtk_tree_model_get(model, &iter, COLUMN_NAME, &name, -1); GTK_connection_set_default(name); g_free(name); } } void GTK_revert_connections(GtkTreeView *treeview, gpointer user_data) { GtkTreeModel *model = gtk_tree_view_get_model(treeview); gtk_list_store_clear(GTK_LIST_STORE(model)); nh_read_gtkhackrc(); if (!gtk_tree_model_iter_n_children(model, NULL)) GTK_connection_add("local", "file", "slashem", 0UL); } void GTK_create_connection(GtkWidget *dialog, gpointer user_data) { GtkWidget *w; GtkWidget *ConnectionName = lookup_widget(dialog, "ConnectionName"); GtkWidget *ServerType = lookup_widget(dialog, "ServerType"); GtkWidget *DisableAsync = lookup_widget(dialog, "DisableAsync"); GtkWidget *EnableLogging = lookup_widget(dialog, "EnableLogging"); GtkTreeRowReference *ref; const gchar *name = gtk_entry_get_text(GTK_ENTRY(ConnectionName)); const gchar *type = gtk_entry_get_text(GTK_ENTRY(ServerType)); unsigned long flags = 0UL; if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(DisableAsync))) flags |= PROXY_CLNT_SYNCHRONOUS; if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(EnableLogging))) flags |= PROXY_CLNT_LOGGED; if (!*name) { w = gtk_message_dialog_new(GTK_WINDOW(dialog), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, "Please enter a name for your new connection."); gtk_dialog_run(GTK_DIALOG(w)); gtk_widget_destroy(w); return; } else if ((ref = GTK_connection_lookup(name))) { gtk_tree_row_reference_free(ref); w = gtk_message_dialog_new(GTK_WINDOW(dialog), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, "You already have a connection with the name %s.\n\n" "Please enter a different name for your connection.", name); gtk_dialog_run(GTK_DIALOG(w)); gtk_widget_destroy(w); return; } if (!strcmp(type, "Local executable")) w = create_LocalExecutable(); else if (!strcmp(type, "Remote machine")) w = create_RemoteMachine(); else { g_critical("Unknown server type '%s'", type); return; } g_object_set_data_full(G_OBJECT(w), "connection-name", g_strdup(name), g_free); g_object_set_data(G_OBJECT(w), "proxy-clnt-flags", GUINT_TO_POINTER(flags)); gtk_widget_destroy(dialog); gtk_widget_show(w); } void GTK_browse_server_executable(GtkWidget *entry, gpointer user_data) { GtkWidget *w; const gchar *path = gtk_entry_get_text(GTK_ENTRY(entry)); const gchar *os_path; gchar *s; w = gtk_file_selection_new("Select Local Executable"); gtk_file_selection_hide_fileop_buttons(GTK_FILE_SELECTION(w)); if (*path) { os_path = g_filename_from_utf8(path, -1, NULL, NULL, NULL); if (os_path) { s = g_find_program_in_path(os_path); gtk_file_selection_set_filename(GTK_FILE_SELECTION(w), s ? s : os_path); g_free(s); g_free((void *)os_path); } } if (gtk_dialog_run(GTK_DIALOG(w)) == GTK_RESPONSE_OK) { os_path = gtk_file_selection_get_filename(GTK_FILE_SELECTION(w)); path = g_filename_to_utf8(os_path, -1, NULL, NULL, NULL); if (path) { gtk_entry_set_text(GTK_ENTRY(entry), path); g_free((void *)path); } } gtk_widget_destroy(w); } void GTK_add_file_server(GtkWidget *entry, gpointer user_data) { GtkWidget *LocalExecutable = lookup_widget(entry, "LocalExecutable"); const gchar *name = g_object_get_data(G_OBJECT(LocalExecutable), "connection-name"); unsigned long flags = GPOINTER_TO_UINT( g_object_get_data(G_OBJECT(LocalExecutable), "proxy-clnt-flags")); const gchar *path = gtk_entry_get_text(GTK_ENTRY(entry)); GTK_connection_add(name, "file", path, flags); gtk_widget_destroy(LocalExecutable); } void GTK_add_tcp_server(GtkWidget *RemoteExecutable, gpointer user_data) { GtkWidget *w; gchar *address; GtkWidget *Hostname = lookup_widget(RemoteExecutable, "RemoteMachineHostname"); GtkWidget *Port = lookup_widget(RemoteExecutable, "RemoteMachinePort"); const gchar *name = g_object_get_data(G_OBJECT(RemoteExecutable), "connection-name"); unsigned long flags = GPOINTER_TO_UINT( g_object_get_data(G_OBJECT(RemoteExecutable), "proxy-clnt-flags")); const gchar *host = gtk_entry_get_text(GTK_ENTRY(Hostname)); const gchar *port = gtk_entry_get_text(GTK_ENTRY(Port)); if (!*host) { w = gtk_message_dialog_new(GTK_WINDOW(RemoteExecutable), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, "Please enter the name of the host on which the server runs."); gtk_dialog_run(GTK_DIALOG(w)); gtk_widget_destroy(w); return; } if (!*port) { w = gtk_message_dialog_new(GTK_WINDOW(RemoteExecutable), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, "Please enter the TCP/IP port that the server listens to."); gtk_dialog_run(GTK_DIALOG(w)); gtk_widget_destroy(w); return; } /* We should check the port number more carefully, but this at least * means that we won't get confused. */ if (!atoi(port) || strchr(port, ':')) { w = gtk_message_dialog_new(GTK_WINDOW(RemoteExecutable), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, "Illegal TCP/IP port number.\n\n" "Please enter a number corresponding to the remote TCP/IP port."); gtk_dialog_run(GTK_DIALOG(w)); gtk_widget_destroy(w); return; } address = g_strdup_printf("%s:%s", host, port); GTK_connection_add(name, "tcp", address, flags); g_free(address); gtk_widget_destroy(RemoteExecutable); } void on_DisableAsync_toggled(GtkToggleButton *button, gpointer user_data) { unsigned long flags; GtkTreePath *path; GtkTreeIter iter; path = gtk_tree_row_reference_get_path(GTK_current_connection); if (gtk_tree_model_get_iter(GTK_TREE_MODEL(GTK_connections), &iter, path)) { gtk_tree_model_get(GTK_TREE_MODEL(GTK_connections), &iter, COLUMN_FLAGS, &flags, -1); if (gtk_toggle_button_get_active(button)) flags |= PROXY_CLNT_SYNCHRONOUS; else flags &= ~PROXY_CLNT_SYNCHRONOUS; gtk_list_store_set(GTK_connections, &iter, COLUMN_FLAGS, flags, -1); } gtk_tree_path_free(path); } void on_EnableLogging_toggled(GtkToggleButton *button, gpointer user_data) { unsigned long flags; GtkTreePath *path; GtkTreeIter iter; path = gtk_tree_row_reference_get_path(GTK_current_connection); if (gtk_tree_model_get_iter(GTK_TREE_MODEL(GTK_connections), &iter, path)) { gtk_tree_model_get(GTK_TREE_MODEL(GTK_connections), &iter, COLUMN_FLAGS, &flags, -1); if (gtk_toggle_button_get_active(button)) flags |= PROXY_CLNT_LOGGED; else flags &= ~PROXY_CLNT_LOGGED; gtk_list_store_set(GTK_connections, &iter, COLUMN_FLAGS, flags, -1); } gtk_tree_path_free(path); gtkhack_enable_logging(flags & PROXY_CLNT_LOGGED); } void on_ViewLog_clicked(GtkButton *button, gpointer user_data) { static GtkWidget *ViewLog = NULL; GtkWidget *textview; if (ViewLog) gtk_window_present(GTK_WINDOW(ViewLog)); else { ViewLog = create_ViewLog(); textview = lookup_widget(ViewLog, "ViewLogTextView"); gtk_text_view_set_buffer(GTK_TEXT_VIEW(textview), GTK_nhext_log); gtk_window_set_default_size(GTK_WINDOW(ViewLog), 200, 300); gtk_widget_show(ViewLog); gtk_signal_connect(GTK_OBJECT(ViewLog), "destroy", GTK_SIGNAL_FUNC(gtk_widget_destroyed), &ViewLog); } } void on_viewlog_clear(GtkMenuItem *menuitem, gpointer user_data) { gtk_text_buffer_set_text(GTK_nhext_log, "", 0); } void on_viewlog_saveas_ok(GtkButton *button, GtkFileSelection *fs) { gint resp; FILE *fp; const gchar *filename; gchar *text; GtkTextIter start, end; GtkWidget *dialog; filename = gtk_file_selection_get_filename(fs); if (g_file_test(filename, G_FILE_TEST_EXISTS)) { dialog = gtk_message_dialog_new(GTK_WINDOW(fs), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_WARNING, GTK_BUTTONS_NONE, "File '%s' exists.", filename); gtk_dialog_add_buttons(GTK_DIALOG(dialog), "gtk-cancel", GTK_RESPONSE_CANCEL, "_Overwrite", GTK_RESPONSE_OK, NULL); gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK); resp = gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); if (resp != GTK_RESPONSE_OK) return; } fp = fopen(filename, "w"); gtk_text_buffer_get_bounds(GTK_nhext_log, &start, &end); text = gtk_text_buffer_get_text(GTK_nhext_log, &start, &end, FALSE); if (fwrite(text, strlen(text), 1, fp) != 1) { dialog = gtk_message_dialog_new(GTK_WINDOW(fs), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, "Error saving file '%s': %s", filename, g_strerror(errno)); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); } fclose(fp); free(text); gtk_widget_destroy(GTK_WIDGET(fs)); } void on_viewlog_save_as(GtkMenuItem *menuitem, gpointer user_data) { static GtkWidget *SaveAs = NULL; if (SaveAs) gtk_window_present(GTK_WINDOW(SaveAs)); else { GtkWidget *SaveAs = gtk_file_selection_new("Save connection log"); g_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(SaveAs)->ok_button), "clicked", G_CALLBACK(on_viewlog_saveas_ok), SaveAs); g_signal_connect_swapped( GTK_OBJECT(GTK_FILE_SELECTION(SaveAs)->cancel_button), "clicked", G_CALLBACK(gtk_widget_destroy), SaveAs); gtk_widget_show(SaveAs); gtk_signal_connect(GTK_OBJECT(SaveAs), "destroy", GTK_SIGNAL_FUNC(gtk_widget_destroyed), &SaveAs); } } void on_viewlog_quit(GtkMenuItem *menuitem, gpointer user_data) { GtkWidget *w; w = lookup_widget(GTK_WIDGET(menuitem), "ViewLog"); gtk_widget_destroy(w); } void on_viewlog_copy(GtkMenuItem *menuitem, gpointer user_data) { GtkClipboard *clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD); gtk_text_buffer_copy_clipboard( GTK_nhext_log, clipboard); } slashem-0.0.7E7F3/win/gtk/gtkprogress.c0000664000076400007640000003037310545462317015762 0ustar aliali/* $Id: gtkprogress.c,v 1.2 2003/09/03 08:36:56 j_ali Exp $ */ /* GTK+ NetHack Copyright (c) Slash'EM Development Team 2003 GTK+ NetHack may be freely redistributed. See license for details. */ #include #include #include #include "winGTK.h" #include "gtkprogress.h" #define NH_GTK_TYPE_PROGRESS_CHECK nh_gtk_progress_check_get_type() #define NH_GTK_PROGRESS_CHECK(obj) G_TYPE_CHECK_INSTANCE_CAST(obj,\ NH_GTK_TYPE_PROGRESS_CHECK,\ NhGtkProgressCheck) #define NH_GTK_PROGRESS_CHECK_CLASS(klass) \ G_TYPE_CHECK_CLASS_CAST(klass,\ NH_GTK_TYPE_PROGRESS_CHECK,\ NhGtkProgressCheckClass) #define NH_GTK_IS_PROGRESS_CHECK(obj) G_TYPE_CHECK_INSTANCE_TYPE(obj,\ NH_GTK_TYPE_PROGRESS_CHECK) #define NH_GTK_IS_PROGRESS_CHECK_CLASS(klass) \ G_TYPE_CHECK_CLASS_TYPE(klass,\ NH_GTK_TYPE_PROGRESS_CHECK) #define NH_GTK_PROGRESS_CHECK_GET_CLASS(obj) \ G_TYPE_INSTANCE_GET_CLASS(obj,\ NH_GTK_TYPE_PROGRESS_CHECK,\ NhGtkProgressCheckClass) #define MIN_CHECK_SIZE 11 typedef enum { NH_GTK_PROGRESS_CHECK_TODO, NH_GTK_PROGRESS_CHECK_CURRENT, NH_GTK_PROGRESS_CHECK_COMPLETE, } NhGtkProgressCheckState; struct _NhGtkProgressCheck { GtkMisc parent_instance; NhGtkProgressCheckState state; }; struct _NhGtkProgressCheckClass { GtkMiscClass parent_class; }; typedef struct _NhGtkProgressCheck NhGtkProgressCheck; typedef struct _NhGtkProgressCheckClass NhGtkProgressCheckClass; static void nh_gtk_progress_check_init(NhGtkProgressCheck *check); static void nh_gtk_progress_check_class_init(NhGtkProgressCheckClass *klass); static gboolean nh_gtk_progress_check_expose(GtkWidget *widget, GdkEventExpose *event); GType nh_gtk_progress_check_get_type(void) { static GType type = 0; static const GTypeInfo info = { sizeof(NhGtkProgressCheckClass), (GBaseInitFunc)NULL, (GBaseFinalizeFunc)NULL, (GClassInitFunc)nh_gtk_progress_check_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(NhGtkProgressCheck), 0, /* n_preallocs */ (GInstanceInitFunc)nh_gtk_progress_check_init }; if (!type) type = g_type_register_static(GTK_TYPE_MISC, "NhGtkProgressCheck", &info, 0); return type; } static void nh_gtk_progress_check_init(NhGtkProgressCheck *check) { GTK_WIDGET_SET_FLAGS(check, GTK_NO_WINDOW); GTK_WIDGET(check)->requisition.width = MIN_CHECK_SIZE + GTK_MISC(check)->xpad * 2; GTK_WIDGET(check)->requisition.height = MIN_CHECK_SIZE + GTK_MISC(check)->ypad * 2; check->state = NH_GTK_PROGRESS_CHECK_TODO; } static void nh_gtk_progress_check_class_init(NhGtkProgressCheckClass *klass) { ((GtkWidgetClass *)klass)->expose_event = nh_gtk_progress_check_expose; } static GtkWidget *nh_gtk_progress_check_new() { return (GtkWidget *)g_object_new(NH_GTK_TYPE_PROGRESS_CHECK, NULL); } static void nh_gtk_progress_check_set(NhGtkProgressCheck *check, NhGtkProgressCheckState state) { g_return_if_fail(NH_GTK_IS_PROGRESS_CHECK(check)); if (check->state != state) { check->state = state; if (GTK_WIDGET_DRAWABLE(check)) gtk_widget_queue_draw(GTK_WIDGET(check)); } } static gboolean nh_gtk_progress_check_expose(GtkWidget *widget, GdkEventExpose *event) { NhGtkProgressCheck *check = NH_GTK_PROGRESS_CHECK(widget); GtkMisc *misc; gint width, height; gint x, y; gint extent; gfloat xalign; if (GTK_WIDGET_DRAWABLE(widget) && check->state != NH_GTK_PROGRESS_CHECK_TODO) { misc = GTK_MISC(widget); width = widget->allocation.width - misc->xpad * 2; height = widget->allocation.height - misc->ypad * 2; extent = MIN(width, height) * 0.7; xalign = gtk_widget_get_direction(widget) == GTK_TEXT_DIR_LTR ? misc->xalign : 1.0 - misc->xalign; x = floor(widget->allocation.x + misc->xpad + (widget->allocation.width - extent) * xalign + 0.5); y = floor(widget->allocation.y + misc->ypad + (widget->allocation.height - extent) * misc->yalign + 0.5); if (check->state == NH_GTK_PROGRESS_CHECK_CURRENT) gtk_paint_arrow(widget->style, widget->window, widget->state, GTK_SHADOW_NONE, &event->area, widget, "arrow", GTK_ARROW_RIGHT, TRUE, x, y, extent, extent); else gtk_paint_check(widget->style, widget->window, widget->state, GTK_SHADOW_IN, &event->area, widget, "check", x, y, extent, extent); } return FALSE; } struct _NhGtkProgressWindow { GtkDialog parent_instance; GtkTable *checklist; GtkProgressBar *bar; GtkLabel *status; int current_stage, n_stages; struct _NhGtkProgresStage { NhGtkProgressCheck *check; GtkLabel *text; } *stages; unsigned long last_updated; /* in ms */ }; struct _NhGtkProgressWindowClass { GtkDialogClass parent_class; }; static GObjectClass *parent_class=NULL; static void nh_gtk_progress_window_init(NhGtkProgressWindow *w); static void nh_gtk_progress_window_class_init(NhGtkProgressWindowClass *klass); static void nh_gtk_progress_window_dispose(GObject *object); static void nh_gtk_progress_window_finalize(GObject *object); GType nh_gtk_progress_window_get_type(void) { static GType type=0; static const GTypeInfo info = { sizeof(NhGtkProgressWindowClass), (GBaseInitFunc)NULL, (GBaseFinalizeFunc)NULL, (GClassInitFunc)nh_gtk_progress_window_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(NhGtkProgressWindow), 0, /* n_preallocs */ (GInstanceInitFunc)nh_gtk_progress_window_init }; if (!type) type = g_type_register_static(GTK_TYPE_DIALOG, "NhGtkProgressWindow", &info, 0); return type; } static void nh_gtk_progress_window_class_init(NhGtkProgressWindowClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS(klass); parent_class = g_type_class_peek_parent(klass); object_class->dispose = nh_gtk_progress_window_dispose; object_class->finalize = nh_gtk_progress_window_finalize; } static void nh_gtk_progress_window_init(NhGtkProgressWindow *w) { w->checklist = (GtkTable *)gtk_table_new(0, 2, FALSE); gtk_table_set_row_spacings(w->checklist, 4); gtk_table_set_col_spacings(w->checklist, 4); gtk_table_set_homogeneous(w->checklist, FALSE); gtk_container_set_border_width(GTK_CONTAINER(w->checklist), 8); g_object_ref(w->checklist); gtk_object_sink(GTK_OBJECT(w->checklist)); w->bar = (GtkProgressBar *)gtk_progress_bar_new(); g_object_ref(w->bar); gtk_progress_bar_set_pulse_step(w->bar, 0.01); gtk_object_sink(GTK_OBJECT(w->bar)); #if 0 /* * The HIG suggests that you display status text to the right of the * progress bar containing something like "18 of 40", but this is not * yet implemented. */ w->status = (GtkLabel *)gtk_label_new(NULL); g_object_ref(w->status); gtk_object_sink(GTK_OBJECT(w->status)); #endif w->current_stage = -1; } GtkWidget *nh_gtk_progress_window_new(const gchar *title, GtkWindow *parent) { NhGtkProgressWindow *w; GtkWidget *hbox; GtkDialog *dialog; w = (NhGtkProgressWindow *)g_object_new(NH_GTK_TYPE_PROGRESS_WINDOW, NULL); if (title) gtk_window_set_title(GTK_WINDOW(w), title); if (parent) gtk_window_set_transient_for(GTK_WINDOW(w), parent); gtk_window_set_modal(GTK_WINDOW(w), TRUE); dialog = GTK_DIALOG(w); gtk_container_add(GTK_CONTAINER(dialog->vbox), GTK_WIDGET(w->checklist)); hbox = gtk_hbox_new(FALSE, 0); gtk_container_set_border_width(GTK_CONTAINER(hbox), 2); gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(w->bar), FALSE, FALSE, 6); if (w->status) gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(w->status), FALSE, FALSE, 6); gtk_container_add(GTK_CONTAINER(dialog->vbox), GTK_WIDGET(hbox)); gtk_dialog_add_button(dialog, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL); gtk_dialog_set_has_separator(dialog, FALSE); /* [ALI] We really should be able to cancel operations, but as yet * the GTK interface has no support for this, so we set the button * to be insensitive, which at least gives the user some clue. */ gtk_dialog_set_response_sensitive(dialog, GTK_RESPONSE_CANCEL, FALSE); gtk_widget_show_all(dialog->vbox); gtk_widget_show_all(dialog->action_area); return (GtkWidget *)w; } static void nh_gtk_progress_window_dispose(GObject *object) { int i; NhGtkProgressWindow *w; g_return_if_fail(NH_GTK_IS_PROGRESS_WINDOW(object)); w = NH_GTK_PROGRESS_WINDOW(object); if (w->checklist) { g_object_unref(w->checklist); w->checklist = NULL; } if (w->bar) { g_object_unref(w->bar); w->bar = NULL; } if (w->status) { g_object_unref(w->status); w->status = NULL; } if (w->stages) { for(i = 0; i < w->n_stages; i++) { g_object_unref(w->stages[i].check); g_object_unref(w->stages[i].text); } w->n_stages = 0; } (*G_OBJECT_CLASS(parent_class)->dispose)(object); } static void nh_gtk_progress_window_finalize(GObject *object) { NhGtkProgressWindow *w; g_return_if_fail(NH_GTK_IS_PROGRESS_WINDOW(object)); w = NH_GTK_PROGRESS_WINDOW(object); if (w->stages) { if (w->n_stages) { g_warning("NhGtkProgressWindow: finalized with undisposed stages"); w->n_stages = 0; } g_free(w->stages); w->stages = NULL; } (*G_OBJECT_CLASS(parent_class)->finalize)(object); } static void nh_gtk_progress_window_set_stage(NhGtkProgressWindow *w, guint stage, NhGtkProgressCheckState state) { PangoAttribute *attr; PangoAttrList *attrs; g_return_if_fail(NH_GTK_IS_PROGRESS_WINDOW(w)); g_return_if_fail(stage < w->n_stages); attrs = pango_attr_list_new(); attr = pango_attr_weight_new(state == NH_GTK_PROGRESS_CHECK_CURRENT ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL); attr->start_index = 0; attr->end_index = G_MAXINT; pango_attr_list_insert(attrs, attr); gtk_label_set_attributes(w->stages[stage].text, attrs); pango_attr_list_unref(attrs); nh_gtk_progress_check_set(w->stages[stage].check, state); } void nh_gtk_progress_window_add_stage(NhGtkProgressWindow *w, const gchar *name) { int n; GtkWidget *check, *label; g_return_if_fail(NH_GTK_IS_PROGRESS_WINDOW(w)); n = w->n_stages; gtk_table_resize(w->checklist, n + 1, 2); check = nh_gtk_progress_check_new(); gtk_widget_show(check); w->stages = g_realloc(w->stages, ++w->n_stages * sizeof(*w->stages)); w->stages[n].check = (NhGtkProgressCheck *)check; g_object_ref(check); label = gtk_label_new(name); gtk_widget_show(label); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); w->stages[n].text = (GtkLabel *)label; g_object_ref(label); gtk_table_attach(w->checklist, check, 0, 1, n, n + 1, 0, 0, 0, 0); gtk_table_attach(w->checklist, label, 1, 2, n, n + 1, GTK_SHRINK | GTK_FILL, 0, 0, 0); nh_gtk_progress_window_set_stage(w, n, n ? NH_GTK_PROGRESS_CHECK_TODO : NH_GTK_PROGRESS_CHECK_CURRENT); if (w->current_stage < 0) { gtk_progress_bar_set_fraction(w->bar, 0.0); w->current_stage = 0; } } void nh_gtk_progress_window_complete_stage(NhGtkProgressWindow *w) { g_return_if_fail(NH_GTK_IS_PROGRESS_WINDOW(w)); g_return_if_fail(w->n_stages != 0); g_return_if_fail(w->current_stage < w->n_stages); nh_gtk_progress_window_set_stage(w, w->current_stage, NH_GTK_PROGRESS_CHECK_COMPLETE); w->current_stage++; if (w->current_stage < w->n_stages) { gtk_progress_bar_set_fraction(w->bar, 0.0); nh_gtk_progress_window_set_stage(w, w->current_stage, NH_GTK_PROGRESS_CHECK_CURRENT); } while(gtk_events_pending()) gtk_main_iteration(); } static nh_gtk_progress_window_update(NhGtkProgressWindow *w) { unsigned long now_ms; GTimeVal now; g_get_current_time(&now); now_ms = (unsigned long)now.tv_sec * 1000 + (unsigned long)now.tv_usec / 1000; /* Update after 50ms or immediately if now_ms wraps (about 50 days) */ if (now_ms < w->last_updated || now_ms - 50 > w->last_updated) { w->last_updated = now_ms; while(gtk_events_pending()) gtk_main_iteration(); } } void nh_gtk_progress_window_stage_pulse(NhGtkProgressWindow *w) { g_return_if_fail(NH_GTK_IS_PROGRESS_WINDOW(w)); gtk_progress_bar_pulse(w->bar); nh_gtk_progress_window_update(w); } void nh_gtk_progress_window_stage_set_fraction(NhGtkProgressWindow *w, gdouble fraction) { g_return_if_fail(NH_GTK_IS_PROGRESS_WINDOW(w)); gtk_progress_bar_set_fraction(w->bar, fraction); nh_gtk_progress_window_update(w); } slashem-0.0.7E7F3/win/gtk/gtkhack.c0000664000076400007640000004357510545462317015034 0ustar aliali/* $Id: gtkhack.c,v 1.10 2004/04/19 06:56:42 j_ali Exp $ */ /* Copyright (c) Slash'EM Development Team 2002-2004 */ /* NetHack may be freely redistributed. See license for details. */ #include #include #include "winGTK.h" #include "prxyclnt.h" #include "proxycb.h" #include "gtkconnect.h" #include "gtksupport.h" static GtkWidget *treeview = NULL; GtkTreeRowReference *GTK_default_connection = NULL; GtkTreeRowReference *GTK_current_connection; GtkListStore *GTK_connections; GtkTextBuffer *GTK_nhext_log = NULL; struct lookup_datum { const char *name; GtkTreeRowReference *ref; }; static gboolean lookup(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data) { gchar *name; struct lookup_datum *datum = data; gtk_tree_model_get(model, iter, COLUMN_NAME, &name, -1); if (name && !strcmp(name, datum->name)) datum->ref = gtk_tree_row_reference_new(model, path); g_free(name); return !!datum->ref; } GtkTreeRowReference * GTK_connection_lookup(const char *name) { GtkTreePath *path; struct lookup_datum datum; datum.name = name; datum.ref = NULL; gtk_tree_model_foreach(GTK_TREE_MODEL(GTK_connections), (GtkTreeModelForeachFunc)lookup, &datum); return datum.ref; } struct update_datum { const char *name; const char *scheme; const char *address; unsigned long flags; gboolean found; }; static gboolean update(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data) { gchar *name; struct update_datum *datum = data; gtk_tree_model_get(model, iter, COLUMN_NAME, &name, -1); if (name && !strcmp(name, datum->name)) { gtk_list_store_set(GTK_connections, iter, COLUMN_NAME, datum->name, COLUMN_SCHEME, datum->scheme, COLUMN_ADDRESS, datum->address, COLUMN_FLAGS, datum->flags, -1); datum->found = TRUE; } g_free(name); return datum->found; } void GTK_connection_set_default(const char *name) { gtk_tree_row_reference_free(GTK_default_connection); GTK_default_connection = GTK_connection_lookup(name); } void GTK_connection_set_weak_default(const char *name) { if (!GTK_default_connection || !gtk_tree_row_reference_valid(GTK_default_connection)) GTK_connection_set_default(name); } /* * Add a new connection to the model (or update the existing one if * a connection of the same name exists). If there is no default * connection then make this one the default one. In all cases, make * the new/updated connection the current selection. */ void GTK_connection_add(const char *name, const char *scheme, const char *address, unsigned long flags) { GtkTreeRowReference *ref; GtkTreePath *path; GtkTreeSelection *sel; GtkTreeIter iter; struct update_datum datum; datum.name = name; datum.scheme = scheme; datum.address = address; datum.flags = flags; datum.found = FALSE; gtk_tree_model_foreach(GTK_TREE_MODEL(GTK_connections), (GtkTreeModelForeachFunc)update, &datum); if (!datum.found) { gtk_list_store_append(GTK_connections, &iter); gtk_list_store_set(GTK_connections, &iter, COLUMN_NAME, name, COLUMN_SCHEME, scheme, COLUMN_ADDRESS, address, COLUMN_FLAGS, flags, -1); } GTK_connection_set_weak_default(name); if (treeview) { sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)); ref = GTK_connection_lookup(name); path = gtk_tree_row_reference_get_path(ref); if (gtk_tree_model_get_iter(GTK_TREE_MODEL(GTK_connections), &iter, path)) gtk_tree_selection_select_iter(sel, &iter); gtk_tree_row_reference_free(ref); gtk_tree_path_free(path); } } static gboolean save(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data) { int n = 0; gchar *name, *scheme, *address; gulong flags; GString *str = data; gtk_tree_model_get(model, iter, COLUMN_NAME, &name, COLUMN_SCHEME, &scheme, COLUMN_ADDRESS, &address, COLUMN_FLAGS, &flags, -1); g_string_append_printf(str, "{\"%s\",\"%s\",\"%s\",[", g_strescape(name, ""), scheme, g_strescape(address, "")); if (flags & PROXY_CLNT_SYNCHRONOUS) { n++; g_string_append(str, "\"synchronous\""); } if (flags & PROXY_CLNT_LOGGED) { if (n++) g_string_append(str, ", "); g_string_append(str, "\"logged\""); } g_string_append(str, "]},"); g_free(name); g_free(scheme); g_free(address); return FALSE; } void GTK_connection_save(struct gtkhackrc *rc) { gchar *name; GtkTreeIter iter; GtkTreePath *path; GString *str = g_string_new("connections = ["); gtk_tree_model_foreach(GTK_TREE_MODEL(GTK_connections), (GtkTreeModelForeachFunc)save, str); g_string_truncate(str, str->len - 1); /* Remove final ',' */ g_string_append_c(str, ']'); nh_gtkhackrc_store(rc, str->str); if (GTK_default_connection && gtk_tree_row_reference_valid(GTK_default_connection)) { path = gtk_tree_row_reference_get_path(GTK_default_connection); if (gtk_tree_model_get_iter(GTK_TREE_MODEL(GTK_connections), &iter, path)) { gtk_tree_model_get(GTK_TREE_MODEL(GTK_connections), &iter, COLUMN_NAME, &name, -1); g_string_printf(str, "default_connection = \"%s\"", g_strescape(name, "")); g_free(name); nh_gtkhackrc_store(rc, str->str); } gtk_tree_path_free(path); } (void)g_string_free(str, TRUE); } static void GTK_proxy_clnt_errhandler(const char *error) { GtkWidget *w; w = gtk_message_dialog_new(NULL, 0, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, error); gtk_dialog_run(GTK_DIALOG(w)); gtk_widget_destroy(w); return; } static void GTK_nhext_errhandler(int class, const char *error) { GtkWidget *w; if (class == EXT_ERROR_COMMS) { w = gtk_message_dialog_new(NULL, 0, GTK_MESSAGE_ERROR, GTK_BUTTONS_NONE, "Connection to game server lost.\n\n%s", error); gtk_dialog_add_button(GTK_DIALOG(w), GTK_STOCK_QUIT, 0); gtk_dialog_run(GTK_DIALOG(w)); exit(1); } else GTK_proxy_clnt_errhandler(error); } static int GTK_proxy_clnt_authhandler(unsigned long methods) { int r; char *s; GtkSizeGroup *group = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); GtkWidget *dialog, *w, *hbox, *vbox, *user, *passwd; /* * Always use method 1 if available (simple password). * Otherwise, use method 0 (no authentication). * If neither method is allowed, then fail. */ if (!(methods & (1UL << 1))) { if (methods & (1UL << 0)) { win_proxy_clnt_settag("authmethod", "0"); return 0; } s = g_strdup_printf("Game server requires authentication,\n" "but doesn't allow any of my supported methods.\n\n" "Supported methods: 0,1\n" "Allowed methods: %s",win_proxy_clnt_gettag("authmethods")); GTK_proxy_clnt_errhandler(s); g_free(s); win_proxy_clnt_settag("mesg", "No supported authentication methods"); return 1; } dialog = gtk_dialog_new_with_buttons("Authentication", GTK_WINDOW(main_window), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL); gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT); gtk_container_set_border_width(GTK_CONTAINER(dialog), 12); vbox = gtk_vbox_new(FALSE, 6); hbox = gtk_hbox_new(FALSE, 6); w = gtk_label_new_with_mnemonic("_User:"); gtk_box_pack_start(GTK_BOX(hbox), w, FALSE, FALSE, 0); gtk_size_group_add_widget(group, w); user = gtk_entry_new(); gtk_box_pack_start(GTK_BOX(hbox), user, FALSE, FALSE, 0); gtk_label_set_mnemonic_widget(GTK_LABEL(w), user); gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0); hbox = gtk_hbox_new(FALSE, 6); w = gtk_label_new_with_mnemonic("_Password:"); gtk_box_pack_start(GTK_BOX(hbox), w, FALSE, FALSE, 0); gtk_size_group_add_widget(group, w); passwd = gtk_entry_new(); gtk_entry_set_visibility(GTK_ENTRY(passwd), FALSE); gtk_entry_set_activates_default(GTK_ENTRY(passwd), TRUE); g_signal_connect_swapped(G_OBJECT(user), "activate", (GCallback)gtk_widget_grab_focus, passwd); gtk_box_pack_start(GTK_BOX(hbox), passwd, FALSE, FALSE, 0); gtk_label_set_mnemonic_widget(GTK_LABEL(w), passwd); gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0); hbox = gtk_hbox_new(FALSE, 0); w = gtk_label_new(" "); gtk_box_pack_start(GTK_BOX(hbox), w, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0); vbox = gtk_vbox_new(FALSE, 6); w = gtk_label_new(NULL); gtk_label_set_markup(GTK_LABEL(w), "Your details"); gtk_misc_set_alignment(GTK_MISC(w), 0, 0.5); gtk_box_pack_start(GTK_BOX(vbox), w, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0); w = gtk_vbox_new(FALSE, 18); gtk_box_pack_start(GTK_BOX(w), vbox, TRUE, TRUE, 0); gtk_widget_show_all(w); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), w, TRUE, TRUE, 0); do { r = gtk_dialog_run(GTK_DIALOG(dialog)); } while (r != GTK_RESPONSE_ACCEPT); win_proxy_clnt_settag("authmethod", "1"); win_proxy_clnt_settag("username", gtk_entry_get_text(GTK_ENTRY(user))); win_proxy_clnt_settag("password", gtk_entry_get_text(GTK_ENTRY(passwd))); g_object_unref(group); gtk_widget_destroy(dialog); return 0; } void GTK_ext_send_config_file(int fh) { FILE *fp; char buffer[512]; int nb; #ifdef WIN32 fp = fopen("defaults.nh", "r"); #else int i; const char *home, *game; char *buf, *s; home = getenv("HOME"); game = win_proxy_clnt_gettag("game"); if (home && game) { buf = malloc(strlen(home) + strlen(game) + 5); if (buf) { /* ~/.@LOWER@rc */ strcpy(buf, home); s = eos(buf); *s++ = '/'; *s++ = '.'; /* Convert the ASCII encoded game into lower case */ for(i = 0; game[i]; i++) *s++ = game[i] >= 'A' && game[i] <= 'Z' ? game[i] | 0x20 : game[i]; *s++ = 'r'; *s++ = 'c'; *s = '\0'; } fp = fopen(buf, "r"); free(buf); } else return; #endif if (fp) { while((nb = fread(buffer, 1, 512, fp)) > 0) proxy_cb_dlbh_fwrite(buffer, nb, 1, fh); fclose(fp); } } static gtkhack_nhext_log(void *handle, void *buf, unsigned int len) { GtkTextBuffer *t = GTK_TEXT_BUFFER(handle); GtkTextIter iter; gtk_text_buffer_get_end_iter(t, &iter); gtk_text_buffer_insert(t, &iter, buf, len); return len; } void gtkhack_enable_logging(gboolean setting) { if (setting) { if (!GTK_nhext_log) GTK_nhext_log = gtk_text_buffer_new(NULL); win_proxy_clnt_log_open(gtkhack_nhext_log, GTK_nhext_log); } else win_proxy_clnt_log_open(NULL, NULL); } GtkWidget* GTK_troubleshooting_new(void) { unsigned long flags; GtkTreePath *path; GtkTreeIter iter; GtkWidget *cb; GtkWidget *w = create_Troubleshooting(); path = gtk_tree_row_reference_get_path(GTK_current_connection); if (gtk_tree_model_get_iter(GTK_TREE_MODEL(GTK_connections), &iter, path)) { gtk_tree_model_get(GTK_TREE_MODEL(GTK_connections), &iter, COLUMN_FLAGS, &flags, -1); } gtk_tree_path_free(path); cb = lookup_widget(w, "DisableAsync"); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cb), flags & PROXY_CLNT_SYNCHRONOUS); cb = lookup_widget(w, "EnableLogging"); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cb), flags & PROXY_CLNT_LOGGED); /* Stop the clicked signal from propogating from the ViewLog button * to the dialog and thus causing gtk_dialog_run() to return. Really, * we should arrange for the ViewLog button to be a non-activatable * widget but glade doesn't have support for this. */ g_signal_handlers_block_matched(lookup_widget(w, "ViewLog"), G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_DATA, g_signal_lookup("clicked", GTK_TYPE_BUTTON), 0, NULL, NULL, G_OBJECT(w)); gtk_widget_show(w); return w; } int main(int argc, char **argv) { int retval; char *s; GtkWidget *w, *connections, *progress; GdkCursor *cursor; GtkCellRenderer *renderer; GtkTreeViewColumn *column; GtkTreeSelection *sel; GtkTreePath *path; GtkTreeModel *model; GtkTreeIter iter; GError *err; gchar *name, *scheme, *address, *os_path; gulong flags; #ifdef SIGPIPE signal(SIGPIPE, SIG_IGN); #endif g_type_init(); GTK_connections = gtk_list_store_new(N_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_ULONG); GTK_init_gtk(&argc, argv); connections = create_Connections(); /* Stop the clicked signal from propogating from the revert button * to the dialog and thus causing gtk_dialog_run() to return. Really, * we should arrange for the revert button to be a non-activatable * widget but glade doesn't have support for this. */ g_signal_handlers_block_matched(lookup_widget(connections, "revertbutton1"), G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_DATA, g_signal_lookup("clicked", GTK_TYPE_BUTTON), 0, NULL, NULL, G_OBJECT(connections)); if (!gtk_tree_model_iter_n_children(GTK_TREE_MODEL(GTK_connections), NULL)) GTK_connection_add("local", "file", "slashem", 0UL); treeview = lookup_widget(connections, "ConnectionsTreeView"); g_object_ref(treeview); gtk_tree_view_set_model(GTK_TREE_VIEW(treeview), GTK_TREE_MODEL(GTK_connections)); renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes("Name", renderer, "text", COLUMN_NAME, NULL); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); column = gtk_tree_view_column_new_with_attributes("Scheme", renderer, "text", COLUMN_SCHEME, NULL); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); column = gtk_tree_view_column_new_with_attributes("Address", renderer, "text", COLUMN_ADDRESS, NULL); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); if (GTK_default_connection && gtk_tree_row_reference_valid(GTK_default_connection)) { sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)); path = gtk_tree_row_reference_get_path(GTK_default_connection); if (gtk_tree_model_get_iter(GTK_TREE_MODEL(GTK_connections), &iter, path)) gtk_tree_selection_select_iter(sel, &iter); gtk_tree_path_free(path); } while (gtk_dialog_run(GTK_DIALOG(connections)) == GTK_RESPONSE_OK) { sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)); if (gtk_tree_selection_get_selected(sel, &model, &iter)) { path = gtk_tree_model_get_path(model, &iter); GTK_current_connection = gtk_tree_row_reference_new(model, path); gtk_tree_path_free(path); gtk_tree_model_get(model, &iter, COLUMN_NAME, &name, COLUMN_SCHEME, &scheme, COLUMN_ADDRESS, &address, COLUMN_FLAGS, &flags, -1); GTK_connection_set_weak_default(name); gtk_widget_hide(connections); progress = gtk_message_dialog_new(NULL, 0, GTK_MESSAGE_INFO, GTK_BUTTONS_CANCEL, "Opening %s connection.\n\nEstablishing connection...", name); gtk_window_set_title(GTK_WINDOW(progress), "GtkHack: Connecting..."); proxy_svc_set_ext_procs(win_GTK_init, >K_ext_procs); proxy_clnt_set_errhandler(GTK_proxy_clnt_errhandler); proxy_clnt_set_authhandler(GTK_proxy_clnt_authhandler); nhext_set_errhandler(GTK_nhext_errhandler); win_proxy_clnt_set_flags(PROXY_CLNT_SYNCHRONOUS, flags); gtkhack_enable_logging(TRUE); if (flags & PROXY_CLNT_LOGGED) gtkhack_enable_logging(TRUE); gtk_widget_realize(progress); #if GTK_CHECK_VERSION(2,2,0) cursor = gdk_cursor_new_for_display( gdk_drawable_get_display(progress->window), GDK_WATCH); #else cursor = gdk_cursor_new(GDK_WATCH); #endif gdk_window_set_cursor(progress->window, cursor); gdk_cursor_unref(cursor); gtk_widget_show_now(progress); while(g_main_context_iteration(NULL, FALSE)) ; if (!strcmp(scheme, "file")) { err = NULL; os_path = g_filename_from_utf8(address, -1, NULL, NULL, &err); if (os_path) { s = g_find_program_in_path(os_path); retval = proxy_connect(scheme, s ? s : os_path, &argc, argv); g_free(s); g_free(os_path); } else { w = gtk_message_dialog_new(GTK_WINDOW(progress), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, "Unable to convert filename to OS-specific path.\n\n" "%s", err->message); gtk_dialog_run(GTK_DIALOG(w)); gtk_widget_destroy(w); retval = 1; } } else retval = proxy_connect(scheme, address, &argc, argv); gtk_widget_destroy(progress); g_free(name); g_free(scheme); g_free(address); if (!retval) { g_object_unref(treeview); treeview = NULL; gtk_widget_destroy(connections); nh_write_gtkhackrc(); proxy_start_client_services(); exit(0); } } } g_object_unref(treeview); treeview = NULL; gtk_widget_destroy(connections); exit(0); } /* * Some utility functions that are normally provided by NetHack. */ char * eos(char *s) { while(*s) s++; return s; } int getyear() { time_t t; struct tm *tm; (void)time(&t); tm = localtime(&t); return tm->tm_year + 1900; } long * alloc(bytes) unsigned int bytes; { void *p; p = malloc(bytes); if (!p) panic("GtkHack: Memory allocation failure; cannot get %u bytes", bytes); return (long *)p; } char highc(c) /* force 'c' into uppercase */ char c; { return((char)(('a' <= c && c <= 'z') ? (c & ~040) : c)); } char lowc(c) /* force 'c' into lowercase */ char c; { return((char)(('A' <= c && c <= 'Z') ? (c | 040) : c)); } int nh_strncmpi(s1, s2, n) /* case insensitive counted string comparison */ const char *s1, *s2; int n; { register char t1, t2; while (n--) { if (!*s2) return (*s1 != 0); /* s1 >= s2 */ else if (!*s1) return -1; /* s1 < s2 */ t1 = lowc(*s1++); t2 = lowc(*s2++); if (t1 != t2) return (t1 > t2) ? 1 : -1; } return 0; /* s1 == s2 */ } slashem-0.0.7E7F3/win/gtk/gtkint.c0000664000076400007640000002413710545462317014711 0ustar aliali/* $Id: gtkint.c,v 1.6.2.1 2004/11/03 09:32:01 j_ali Exp $ */ /* GTK+ NetHack Copyright (c) Issei Numata 1999-2000 Copyright (c) Slash'EM Development Team 2001-2003 GTK+ NetHack may be freely redistributed. See license for details. */ /* * This module contains everything that is only needed for the internal * interface (ie., when linking the GTK interface with the game executable). */ #include #include #include "winGTK.h" #include "nhxdr.h" #include "proxycom.h" #include "prxyclnt.h" #include "wintype.h" #include "func_tab.h" #include "dlb.h" #ifdef SHORT_FILENAMES #include "patchlev.h" #else #include "patchlevel.h" #endif static void hook() { } #ifdef GTK_PROXY static void FDECL(GTK_proxy_init_nhwindows, (int *, char **)); static void NDECL(GTK_proxy_askname); static int NDECL(GTK_proxy_nhgetch); static void FDECL(GTK_proxy_raw_print, (const char *)); static void FDECL(GTK_proxy_raw_print_bold, (const char *)); /* Only the GTK_proxy_... functions are expected to be called. * Calling any other of these before GTK_proxy_init_nhwindows() * returns is likely to result in undefined behaviour. */ struct window_procs GTK_procs = { "gtk", 0, 0L, GTK_proxy_init_nhwindows, hook, /* player_selection */ GTK_proxy_askname, GTK_get_nh_event, GTK_exit_nhwindows, hook, /* suspend_nhwindows */ hook, /* resume_nhwindows */ GTK_create_nhwindow, hook, /* clear_nhwindow */ GTK_display_nhwindow, GTK_destroy_nhwindow, GTK_curs, GTK_putstr, #ifdef FILE_AREAS (void (*)(const char *, const char *, BOOLEAN_P))hook, /* display_file */ #else (void (*)(const char *, BOOLEAN_P))hook, /* display_file */ #endif GTK_start_menu, (void (*)(winid, int, const anything *, CHAR_P, CHAR_P, int, const char *, BOOLEAN_P))hook, /* add_menu */ GTK_end_menu, (int (*)())hook, /* select_menu */ genl_message_menu, GTK_update_inventory, GTK_mark_synch, GTK_wait_synch, #ifdef CLIPPING GTK_cliparound, #endif #ifdef POSITIONBAR hook, /* update_positionbar */ #endif (void (*)(winid, XCHAR_P, XCHAR_P, int))hook, /* print_glyph */ GTK_proxy_raw_print, GTK_proxy_raw_print_bold, GTK_proxy_nhgetch, GTK_nh_poskey, hook, /* nhbell */ GTK_doprev_message, (char (*)(const char *, const char *, CHAR_P))hook, /* yn_function */ hook, /* getlin */ GTK_get_ext_cmd, GTK_number_pad, GTK_delay_output, #ifdef CHANGE_COLOR hook, /* change_color */ #ifdef MAC hook, /* change_background */ hook, /* set_font_name */ #endif hook, /* get_color_string */ #endif hook, /* start_screen,*/ hook, /* end_screen,*/ genl_outrip, hook, /* preference_update,*/ }; static void GTK_proxy_askname(void) { strcpy(plname, "games"); } static int GTK_proxy_nhgetch(void) { int c; do { c = getchar(); } while(c == '\r'); return c; } static void GTK_proxy_raw_print(const char *str) { fputs(str, stderr); fputc('\n', stderr); (void) fflush(stderr); } static void GTK_proxy_raw_print_bold(const char *str) { fputs(str, stderr); fputc('\n', stderr); (void) fflush(stderr); } #ifndef WIN32 static int GTK_client_read(void *handle, void *buf, unsigned int len) { int nb; nb = read((int)handle, buf, len); return nb >= 0 ? nb : -1; } static int GTK_client_write(void *handle, void *buf, unsigned int len) { int nb; nb = write((int)handle, buf, len); return nb >= 0 ? nb : -1; } #endif static void GTK_proxy_init_nhwindows(int *argcp, char **argv) { int retval; #ifdef WIN32 /* Win32 has no concept of fork, so we simply execute ourselves */ char *s; iflags.window_inited = 1; proxy_svc_set_ext_procs(win_GTK_init, >K_ext_procs); s = g_find_program_in_path(argv[0]); retval = proxy_connect("file", s ? s : argv[0], argcp, argv); if (!retval) proxy_start_client_services(); exit(1); #else int to_game[2],from_game[2]; #ifdef UNIX uid_t uid; gid_t gid; #endif if (pipe(to_game) || pipe(from_game)) panic("%s: Can't create NhExt stream", argv[0]); iflags.window_inited = 1; if (fork()) { dup2(to_game[0],0); dup2(from_game[1],1); close(to_game[1]); close(from_game[0]); choose_windows("proxy"); if (strncmp(windowprocs.name, "proxy/", 6)) terminate(EXIT_SUCCESS); init_nhwindows(argcp, argv); } else { close(to_game[0]); close(from_game[1]); #ifdef UNIX /* * Drop all privileges. For non-Linux systems we just assume that * seteuid()/setuid() suffices. Add more cases as needed. */ gid = getgid(); uid = getuid(); #ifdef LINUX setresgid(gid, gid, gid); setresuid(uid, uid, uid); #else setegid(gid); setgid(gid); seteuid(uid); setuid(uid); #endif #endif proxy_svc_set_ext_procs(win_GTK_init, >K_ext_procs); retval = proxy_init_client_services(GTK_client_read, (void *)from_game[0], GTK_client_write, (void *)to_game[1]); if (!retval) proxy_start_client_services(); exit(1); } #endif /* WIN32 */ } #else /* GTK_PROXY */ static void FDECL(GTK_int_init_nhwindows, (int *, char **)); static void NDECL(GTK_int_player_selection); static void NDECL(GTK_int_askname); static void FDECL(GTK_int_clear_nhwindow, (winid)); #ifdef FILE_AREAS static void FDECL(GTK_int_display_file, (const char *, const char *, BOOLEAN_P)); #else static void FDECL(GTK_int_display_file, (const char *, BOOLEAN_P)); #endif static void FDECL(GTK_int_add_menu, (winid, int, const ANY_P *, CHAR_P, CHAR_P, int, const char *, BOOLEAN_P)); static int FDECL(GTK_int_select_menu, (winid, int, MENU_ITEM_P **)); static void FDECL(GTK_int_print_glyph, (winid, XCHAR_P, XCHAR_P, int)); static char FDECL(GTK_int_yn_function, (const char *, const char *, CHAR_P)); static void FDECL(GTK_int_outrip, (winid, int)); static void FDECL(GTK_int_getlin, (const char *, char *)); static void FDECL(GTK_int_preference_update, (const char *)); struct window_procs GTK_procs = { "gtk", /* If you want to change these you probably also want to change the * equivalent values in GTK_capv[]. */ WC_COLOR | WC_HILITE_PET | #if 0 WC_ASCII_MAP | WC_TILED_MAP | WC_SPLASH_SCREEN | WC_POPUP_DIALOG | WC_EIGHT_BIT_IN | #endif WC_PERM_INVENT, 0L, GTK_int_init_nhwindows, GTK_int_player_selection, GTK_int_askname, GTK_get_nh_event, GTK_exit_nhwindows, hook, /* suspend_nhwindows */ hook, /* resume_nhwindows */ GTK_create_nhwindow, GTK_int_clear_nhwindow, GTK_display_nhwindow, GTK_destroy_nhwindow, GTK_curs, GTK_putstr, GTK_int_display_file, GTK_start_menu, GTK_int_add_menu, GTK_end_menu, GTK_int_select_menu, genl_message_menu, GTK_update_inventory, GTK_mark_synch, GTK_wait_synch, #ifdef CLIPPING GTK_cliparound, #endif #ifdef POSITIONBAR hook, /* update_positionbar */ #endif GTK_int_print_glyph, GTK_raw_print, GTK_raw_print_bold, GTK_nhgetch, GTK_nh_poskey, hook, /* nhbell */ GTK_doprev_message, GTK_int_yn_function, GTK_int_getlin, GTK_get_ext_cmd, GTK_number_pad, GTK_delay_output, #ifdef CHANGE_COLOR hook, /* change_color */ #ifdef MAC hook, /* change_background */ hook, /* set_font_name */ #endif hook, /* get_color_string */ #endif hook, /* start_screen,*/ hook, /* end_screen,*/ #ifdef GRAPHIC_TOMBSTONE GTK_int_outrip, #else genl_outrip, #endif GTK_int_preference_update, }; static void GTK_int_init_nhwindows(int *argcp, char **argv) { char **capv; if (GTK_ext_init_nhwindows(argcp, argv, &capv)) iflags.window_inited = 1; } static void GTK_int_player_selection(void) { /* * The GTK interface does not provide a quit option within * player selection. */ (void)GTK_ext_player_selection(&flags.initrole, &flags.initrace, &flags.initgend, &flags.initalign); } static void GTK_int_askname() { char *name; name = GTK_ext_askname(); strcpy(plname, name); free(name); } static void GTK_int_clear_nhwindow(window) winid window; { GTK_ext_clear_nhwindow(window, ROWNO, COLNO, 1); } #ifdef FILE_AREAS static void GTK_int_display_file(farea, fname, complain) const char *farea, *fname; BOOLEAN_P complain; #else static void GTK_int_display_file(fname, complain) const char *fname; BOOLEAN_P complain; #endif { int fh; #ifdef FILE_AREAS fh = dlbh_fopen(farea, fname, "r"); #else fh = dlbh_fopen(fname, "r"); #endif if (fh < 0) { if (complain) pline("Can't open %s.", fname); return; } GTK_ext_display_file(fh); dlbh_fclose(fh); } static void GTK_int_add_menu(window, glyph, identifier, ch, gch, attr, str, preselected) winid window; int glyph; const anything *identifier; CHAR_P ch, gch; int attr; const char *str; BOOLEAN_P preselected; { int mapping = mapid_map_identifier(window, identifier); GTK_ext_add_menu(window, glyph, mapping, ch, gch, attr, str, preselected); } int GTK_int_select_menu(window, how, menu_list) winid window; int how; menu_item **menu_list; { int i, n, retval; struct proxy_mi *selected; retval = GTK_ext_select_menu(window, how, &selected); n = retval <= 0 ? 0 : retval; *menu_list = (menu_item *) alloc(n * sizeof(menu_item)); for(i = 0; i < n; i++) { mapid_unmap_identifier(window, selected[i].item, &(*menu_list)[i].item); (*menu_list)[i].count = selected[i].count; } if (n) free(selected); return retval; } static void GTK_int_print_glyph(window, x, y, glyph) winid window; xchar x, y; int glyph; { GTK_ext_print_glyph(window, x, y, glyph); } static char GTK_int_yn_function(query, resp, def) const char *query, *resp; char def; { char ret; int count; ret = GTK_ext_yn_function(query, resp ? resp : "", def, &count); if (ret == '#') yn_number = count; return ret; } static void GTK_int_outrip(winid id, int how) { if (!GTK_ext_outrip(id, get_killer_string(how))) genl_outrip(id, how); } static void GTK_int_getlin(const char *query, char *ret) { char *line; line = GTK_ext_getlin(query); strcpy(ret, line); free(line); } static void GTK_int_preference_update(const char *optnam) { GTK_ext_preference_update(optnam, get_option(optnam)); } #endif /* GTK_PROXY */ slashem-0.0.7E7F3/win/gtk/Makefile.w320000664000076400007640000001177410545462317015322 0ustar aliali# $Id: Makefile.w32,v 1.7 2003/12/08 22:20:49 j_ali Exp $ # Copyright (c) Slash'EM Development Team 2002-2003 # NetHack may be freely redistributed. See license for details. # # This makefile is for making gtkhack; a seperate program which talks # to a game executable using the NhExt protocol. # # You need version 2.11 or later of GNU binutils for the linker to find # the Gtk+ dll import files from the output of pkg-config. This is included # in MinGW version 1.1 and later. The makefile was tested against version # 2.0.0 of MinGW, available from http://www.mingw.org/. CPP = cpp CC = gcc LINK = gcc # Where the MinGW version of Gtk+ 2.0 is installed. MW32GTK = /mingw32/gtk2 # The MinGW switch needed to specify Microsoft packing & alignment rules # (use gcc --target-help if you're not sure) MS_BITFIELDS = -mms-bitfields # MS_BITFIELDS = -fnative-struct # Where the NhProxy library is installed. NHPROXYLIB = ..\..\src # and its associated header files. NHPROXYINC = ..\..\include # The pkg-config executable PKG_CONFIG = $(MW32GTK)/bin/pkg-config # A semi-colon seperated list of directories to add to the path when # calling pkg-config so that MS-Windows can find the DLLs needed. PKG_CONFIG_DLL = $(MW32GTK)/lib # A semi-colon seperated list of directories to add to PKG_CONFIG_PATH # so that pkg-config can find the package config files (eg., gtk+-2.0.pc). PKG_CONFIG_PATH = $(MW32GTK)/lib/pkgconfig # The pkg-config commands GTKCFLAGS = $(PKG_CONFIG) --cflags gtk+-2.0 GTKLIBS = $(PKG_CONFIG) --libs gtk+-2.0 # Debugging CFLAGS = -g -I$(NHPROXYINC) $(MS_BITFIELDS) -DGTKHACK LFLAGS = -g #CFLAGS = -O -I$(NHPROXYINC) $(MS_BITFIELDS) -DGTKHACK #LFLAGS = LIBS = -lws2_32 # ---------------------------------------- # # Nothing below this line should have to be changed. # timestamps for primary header files, matching src/Makefile CONFIG_H = ../../src/config.h-t HACK_H = ../../src/hack.h-t all: gtkhack.exe FORCE: cc-gtk.h: FORCE @echo #define PKG_CONFIG_DLL "$(PKG_CONFIG_DLL)" > cc-gtk.h @echo #define PKG_CONFIG_PATH "$(PKG_CONFIG_PATH)" >> cc-gtk.h @echo #define GTKCFLAGS "$(GTKCFLAGS)" >> cc-gtk.h @echo #define GTKLIBS "$(GTKLIBS)" >> cc-gtk.h cc-gtk.exe: cc-gtk.c cc-gtk.h $(CC) $(CFLAGS) cc-gtk.c -o cc-gtk.exe .c.o: cc-gtk -c $(CC) $(CFLAGS) -c $< CSRC = gtkhack.c gtk.c gtkgetlin.c gtkstatus.c gtkmenu.c gtkyn.c gtkextcmd.c \ gtkmap.c gtkmessage.c gtkmisc.c gtktile.c xshmmap.c gtkext.c \ gtkhackrc.c gtkprefs.c panic.c gtkconnect.c gtkconcb.c gtksupport.c \ gtkprogress.c OBJS01 = gtkhack.o gtk.o gtkgetlin.o gtkstatus.o gtkmenu.o gtkyn.o gtkextcmd.o OBJS02 = gtkmap.o gtkmessage.o gtkmisc.o gtktile.o xshmmap.o gtkext.o OBJS03 = gtkhackrc.o gtkprefs.o panic.o gtkconnect.o gtkconcb.o gtksupport.o OBJS04 = gtkprogress.o gtkhack.exe: cc-gtk.exe $(OBJS01) $(OBJS02) $(OBJS03) $(OBJS04) \ $(NHPROXYLIB)/nhproxy.a @echo INPUT( $(OBJS01) )> tmp.lnk @echo INPUT( $(OBJS02) )>> tmp.lnk @echo INPUT( $(OBJS03) )>> tmp.lnk @echo INPUT( $(OBJS04) )>> tmp.lnk @echo INPUT( $(NHPROXYLIB)/nhproxy.a )>> tmp.lnk cc-gtk -l $(LINK) $(LFLAGS) -o $@ tmp.lnk $(LIBS) @del tmp.lnk clean: -del *.o -del gtkhack.exe spotless: clean # DO NOT DELETE THIS LINE OR CHANGE ANYTHING BEYOND IT # config.h timestamp $(CONFIG_H): ../../include/config.h @echo /**/ >> $(CONFIG_H) # hack.h timestamp $(HACK_H): ../../include/hack.h @echo /**/ >> $(HACK_H) # gtkhack.o: gtkhack.c ../../include/winGTK.h ../../include/prxyclnt.h \ ../../include/proxycb.h gtkconnect.h \ gtksupport.h gtk.o: gtk.c ../../include/md5.h ../../include/winGTK.h ../../include/wintype.h \ ../../include/func_tab.h ../../include/dlb.h ../../include/patchlevel.h \ ../../include/proxycb.h ../../include/prxyclnt.h gtkgetlin.o: gtkgetlin.c ../../include/winGTK.h gtkstatus.o: gtkstatus.c ../../include/winGTK.h gtkmenu.o: gtkmenu.c ../../include/winGTK.h ../../include/patchlevel.h gtkyn.o: gtkyn.c ../../include/winGTK.h gtkextcmd.o: gtkextcmd.c ../../include/winGTK.h ../../include/proxycb.h \ ../../include/func_tab.h gtkmap.o: gtkmap.c ../../include/winGTK.h ../../include/dlb.h \ ../../include/patchlevel.h ../../include/decl.h ../../include/proxycb.h \ ../../include/prxyclnt.h gtkprogress.h gtkmessage.o: gtkmessage.c ../../include/winGTK.h gtkmisc.o: gtkmisc.c ../../include/winGTK.h ../../include/proxycb.h gtktile.o: gtktile.c ../../include/winGTK.h ../../include/dlb.h ../../include/proxycb.h \ ../../include/prxyclnt.h gtkprogress.h xshmmap.o: xshmmap.c ../../include/winGTK.h gtkext.o: gtkext.c ../../include/winGTK.h ../../include/prxyclnt.h gtkhackrc.o: gtkhackrc.c ../../include/winGTK.h gtkprefs.o: gtkprefs.c ../../include/winGTK.h ../../include/patchlevel.h panic.o: panic.c $(CONFIG_H) gtkconnect.o: gtkconnect.c gtkconcb.h gtkconnect.h \ gtksupport.h gtkconcb.o: gtkconcb.c gtkconcb.h gtkconnect.h \ gtksupport.h ../../include/winGTK.h \ ../../include/prxyclnt.h gtksupport.o: gtksupport.c gtksupport.h gtkprogress.o: gtkprogress.c ../../include/winGTK.h gtkprogress.h # DEPENDENCIES MUST END AT END OF FILE # IF YOU PUT STUFF HERE IT WILL GO AWAY # see Makefile.unx slashem-0.0.7E7F3/win/gtk/gtkconnect.h0000664000076400007640000000052310545462317015546 0ustar aliali/* * DO NOT EDIT THIS FILE - it is generated by Glade. */ GtkWidget* create_Connections (void); GtkWidget* create_AddConnection (void); GtkWidget* create_RemoteMachine (void); GtkWidget* create_LocalExecutable (void); GtkWidget* create_ConnectTerminal (void); GtkWidget* create_Troubleshooting (void); GtkWidget* create_ViewLog (void); slashem-0.0.7E7F3/win/gtk/gtkconnect.c0000664000076400007640000010763410545462317015554 0ustar aliali/* * DO NOT EDIT THIS FILE - it is generated by Glade. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include #include #include #include "gtkconcb.h" #include "gtkconnect.h" #include "gtksupport.h" #define GLADE_HOOKUP_OBJECT(component,widget,name) \ g_object_set_data_full (G_OBJECT (component), name, \ gtk_widget_ref (widget), (GDestroyNotify) gtk_widget_unref) #define GLADE_HOOKUP_OBJECT_NO_REF(component,widget,name) \ g_object_set_data (G_OBJECT (component), name, widget) GtkWidget* create_Connections (void) { GtkWidget *Connections; GtkWidget *dialog_vbox1; GtkWidget *vbox1; GtkWidget *label1; GtkWidget *hseparator1; GtkWidget *hbox1; GtkWidget *scrolledwindow1; GtkWidget *ConnectionsTreeView; GtkWidget *vbuttonbox1; GtkWidget *button1; GtkWidget *button2; GtkWidget *button3; GtkWidget *button4; GtkWidget *dialog_action_area1; GtkWidget *revertbutton1; GtkWidget *cancelbutton1; GtkWidget *connectbutton1; GtkWidget *alignment2; GtkWidget *hbox7; GtkWidget *image3; GtkWidget *label13; Connections = gtk_dialog_new (); gtk_widget_set_name (Connections, "Connections"); gtk_window_set_title (GTK_WINDOW (Connections), "GtkHack"); dialog_vbox1 = GTK_DIALOG (Connections)->vbox; gtk_widget_set_name (dialog_vbox1, "dialog_vbox1"); gtk_widget_show (dialog_vbox1); vbox1 = gtk_vbox_new (FALSE, 0); gtk_widget_set_name (vbox1, "vbox1"); gtk_widget_show (vbox1); gtk_box_pack_start (GTK_BOX (dialog_vbox1), vbox1, TRUE, TRUE, 0); label1 = gtk_label_new ("You may choose an existing server to connect to here, or configure a new one."); gtk_widget_set_name (label1, "label1"); gtk_widget_show (label1); gtk_box_pack_start (GTK_BOX (vbox1), label1, FALSE, FALSE, 10); gtk_label_set_justify (GTK_LABEL (label1), GTK_JUSTIFY_LEFT); gtk_label_set_line_wrap (GTK_LABEL (label1), TRUE); gtk_misc_set_alignment (GTK_MISC (label1), 0, 0.5); hseparator1 = gtk_hseparator_new (); gtk_widget_set_name (hseparator1, "hseparator1"); gtk_widget_show (hseparator1); gtk_box_pack_start (GTK_BOX (vbox1), hseparator1, TRUE, TRUE, 0); hbox1 = gtk_hbox_new (FALSE, 0); gtk_widget_set_name (hbox1, "hbox1"); gtk_widget_show (hbox1); gtk_box_pack_start (GTK_BOX (vbox1), hbox1, TRUE, TRUE, 5); scrolledwindow1 = gtk_scrolled_window_new (NULL, NULL); gtk_widget_set_name (scrolledwindow1, "scrolledwindow1"); gtk_widget_show (scrolledwindow1); gtk_box_pack_start (GTK_BOX (hbox1), scrolledwindow1, TRUE, TRUE, 5); GTK_WIDGET_SET_FLAGS (scrolledwindow1, GTK_CAN_DEFAULT); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow1), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); ConnectionsTreeView = gtk_tree_view_new (); gtk_widget_set_name (ConnectionsTreeView, "ConnectionsTreeView"); gtk_widget_show (ConnectionsTreeView); gtk_container_add (GTK_CONTAINER (scrolledwindow1), ConnectionsTreeView); GTK_WIDGET_SET_FLAGS (ConnectionsTreeView, GTK_CAN_DEFAULT); gtk_tree_view_set_reorderable (GTK_TREE_VIEW (ConnectionsTreeView), TRUE); vbuttonbox1 = gtk_vbutton_box_new (); gtk_widget_set_name (vbuttonbox1, "vbuttonbox1"); gtk_widget_show (vbuttonbox1); gtk_box_pack_start (GTK_BOX (hbox1), vbuttonbox1, FALSE, TRUE, 7); gtk_container_set_border_width (GTK_CONTAINER (vbuttonbox1), 5); gtk_button_box_set_layout (GTK_BUTTON_BOX (vbuttonbox1), GTK_BUTTONBOX_START); gtk_box_set_spacing (GTK_BOX (vbuttonbox1), 5); button1 = gtk_button_new_with_mnemonic ("_Add..."); gtk_widget_set_name (button1, "button1"); gtk_widget_show (button1); gtk_container_add (GTK_CONTAINER (vbuttonbox1), button1); GTK_WIDGET_SET_FLAGS (button1, GTK_CAN_DEFAULT); button2 = gtk_button_new_with_mnemonic ("_Edit..."); gtk_widget_set_name (button2, "button2"); gtk_widget_show (button2); gtk_container_add (GTK_CONTAINER (vbuttonbox1), button2); GTK_WIDGET_SET_FLAGS (button2, GTK_CAN_DEFAULT); button3 = gtk_button_new_with_mnemonic ("_Delete"); gtk_widget_set_name (button3, "button3"); gtk_widget_show (button3); gtk_container_add (GTK_CONTAINER (vbuttonbox1), button3); GTK_WIDGET_SET_FLAGS (button3, GTK_CAN_DEFAULT); button4 = gtk_button_new_with_mnemonic ("_Set as default"); gtk_widget_set_name (button4, "button4"); gtk_widget_show (button4); gtk_container_add (GTK_CONTAINER (vbuttonbox1), button4); GTK_WIDGET_SET_FLAGS (button4, GTK_CAN_DEFAULT); dialog_action_area1 = GTK_DIALOG (Connections)->action_area; gtk_widget_set_name (dialog_action_area1, "dialog_action_area1"); gtk_widget_show (dialog_action_area1); gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area1), GTK_BUTTONBOX_END); revertbutton1 = gtk_button_new_from_stock ("gtk-revert-to-saved"); gtk_widget_set_name (revertbutton1, "revertbutton1"); gtk_widget_show (revertbutton1); gtk_dialog_add_action_widget (GTK_DIALOG (Connections), revertbutton1, 0); GTK_WIDGET_SET_FLAGS (revertbutton1, GTK_CAN_DEFAULT); cancelbutton1 = gtk_button_new_from_stock ("gtk-cancel"); gtk_widget_set_name (cancelbutton1, "cancelbutton1"); gtk_widget_show (cancelbutton1); gtk_dialog_add_action_widget (GTK_DIALOG (Connections), cancelbutton1, GTK_RESPONSE_CANCEL); GTK_WIDGET_SET_FLAGS (cancelbutton1, GTK_CAN_DEFAULT); connectbutton1 = gtk_button_new (); gtk_widget_set_name (connectbutton1, "connectbutton1"); gtk_widget_show (connectbutton1); gtk_dialog_add_action_widget (GTK_DIALOG (Connections), connectbutton1, GTK_RESPONSE_OK); GTK_WIDGET_SET_FLAGS (connectbutton1, GTK_CAN_DEFAULT); alignment2 = gtk_alignment_new (0.5, 0.5, 0, 0); gtk_widget_set_name (alignment2, "alignment2"); gtk_widget_show (alignment2); gtk_container_add (GTK_CONTAINER (connectbutton1), alignment2); hbox7 = gtk_hbox_new (FALSE, 2); gtk_widget_set_name (hbox7, "hbox7"); gtk_widget_show (hbox7); gtk_container_add (GTK_CONTAINER (alignment2), hbox7); image3 = gtk_image_new_from_stock ("gtk-yes", GTK_ICON_SIZE_BUTTON); gtk_widget_set_name (image3, "image3"); gtk_widget_show (image3); gtk_box_pack_start (GTK_BOX (hbox7), image3, FALSE, FALSE, 0); label13 = gtk_label_new_with_mnemonic ("C_onnect"); gtk_widget_set_name (label13, "label13"); gtk_widget_show (label13); gtk_box_pack_start (GTK_BOX (hbox7), label13, FALSE, FALSE, 0); gtk_label_set_justify (GTK_LABEL (label13), GTK_JUSTIFY_LEFT); g_signal_connect ((gpointer) button1, "clicked", G_CALLBACK (GTK_add_connection), NULL); g_signal_connect_swapped ((gpointer) button2, "clicked", G_CALLBACK (GTK_edit_connection), GTK_OBJECT (ConnectionsTreeView)); g_signal_connect_swapped ((gpointer) button3, "clicked", G_CALLBACK (GTK_delete_connection), GTK_OBJECT (ConnectionsTreeView)); g_signal_connect_swapped ((gpointer) button4, "clicked", G_CALLBACK (GTK_set_default_connection), GTK_OBJECT (ConnectionsTreeView)); g_signal_connect_swapped ((gpointer) revertbutton1, "clicked", G_CALLBACK (GTK_revert_connections), GTK_OBJECT (ConnectionsTreeView)); /* Store pointers to all widgets, for use by lookup_widget(). */ GLADE_HOOKUP_OBJECT_NO_REF (Connections, Connections, "Connections"); GLADE_HOOKUP_OBJECT_NO_REF (Connections, dialog_vbox1, "dialog_vbox1"); GLADE_HOOKUP_OBJECT (Connections, vbox1, "vbox1"); GLADE_HOOKUP_OBJECT (Connections, label1, "label1"); GLADE_HOOKUP_OBJECT (Connections, hseparator1, "hseparator1"); GLADE_HOOKUP_OBJECT (Connections, hbox1, "hbox1"); GLADE_HOOKUP_OBJECT (Connections, scrolledwindow1, "scrolledwindow1"); GLADE_HOOKUP_OBJECT (Connections, ConnectionsTreeView, "ConnectionsTreeView"); GLADE_HOOKUP_OBJECT (Connections, vbuttonbox1, "vbuttonbox1"); GLADE_HOOKUP_OBJECT (Connections, button1, "button1"); GLADE_HOOKUP_OBJECT (Connections, button2, "button2"); GLADE_HOOKUP_OBJECT (Connections, button3, "button3"); GLADE_HOOKUP_OBJECT (Connections, button4, "button4"); GLADE_HOOKUP_OBJECT_NO_REF (Connections, dialog_action_area1, "dialog_action_area1"); GLADE_HOOKUP_OBJECT (Connections, revertbutton1, "revertbutton1"); GLADE_HOOKUP_OBJECT (Connections, cancelbutton1, "cancelbutton1"); GLADE_HOOKUP_OBJECT (Connections, connectbutton1, "connectbutton1"); GLADE_HOOKUP_OBJECT (Connections, alignment2, "alignment2"); GLADE_HOOKUP_OBJECT (Connections, hbox7, "hbox7"); GLADE_HOOKUP_OBJECT (Connections, image3, "image3"); GLADE_HOOKUP_OBJECT (Connections, label13, "label13"); gtk_widget_grab_focus (connectbutton1); gtk_widget_grab_default (connectbutton1); return Connections; } GtkWidget* create_AddConnection (void) { GtkWidget *AddConnection; GtkWidget *dialog_vbox2; GtkWidget *vbox2; GtkWidget *label9; GtkWidget *hbox5; GtkWidget *label10; GtkWidget *ConnectionName; GtkWidget *hseparator2; GtkWidget *label3; GtkWidget *hbox3; GtkWidget *label4; GtkWidget *combo1; GList *combo1_items = NULL; GtkWidget *ServerType; GtkWidget *hseparator3; GtkWidget *label14; GtkWidget *DisableAsync; GtkWidget *EnableLogging; GtkWidget *dialog_action_area2; GtkWidget *cancelbutton2; GtkWidget *okbutton2; AddConnection = gtk_dialog_new (); gtk_widget_set_name (AddConnection, "AddConnection"); gtk_window_set_title (GTK_WINDOW (AddConnection), "Add Connection"); gtk_window_set_modal (GTK_WINDOW (AddConnection), TRUE); dialog_vbox2 = GTK_DIALOG (AddConnection)->vbox; gtk_widget_set_name (dialog_vbox2, "dialog_vbox2"); gtk_widget_show (dialog_vbox2); vbox2 = gtk_vbox_new (FALSE, 0); gtk_widget_set_name (vbox2, "vbox2"); gtk_widget_show (vbox2); gtk_box_pack_start (GTK_BOX (dialog_vbox2), vbox2, TRUE, TRUE, 0); gtk_container_set_border_width (GTK_CONTAINER (vbox2), 5); label9 = gtk_label_new ("Please select a name for this server connection."); gtk_widget_set_name (label9, "label9"); gtk_widget_show (label9); gtk_box_pack_start (GTK_BOX (vbox2), label9, FALSE, FALSE, 10); gtk_label_set_justify (GTK_LABEL (label9), GTK_JUSTIFY_LEFT); gtk_misc_set_alignment (GTK_MISC (label9), 0, 0.5); hbox5 = gtk_hbox_new (FALSE, 5); gtk_widget_set_name (hbox5, "hbox5"); gtk_widget_show (hbox5); gtk_box_pack_start (GTK_BOX (vbox2), hbox5, TRUE, TRUE, 0); label10 = gtk_label_new_with_mnemonic ("_Connection name:"); gtk_widget_set_name (label10, "label10"); gtk_widget_show (label10); gtk_box_pack_start (GTK_BOX (hbox5), label10, FALSE, FALSE, 0); gtk_label_set_justify (GTK_LABEL (label10), GTK_JUSTIFY_LEFT); ConnectionName = gtk_entry_new (); gtk_widget_set_name (ConnectionName, "ConnectionName"); gtk_widget_show (ConnectionName); gtk_box_pack_start (GTK_BOX (hbox5), ConnectionName, TRUE, TRUE, 0); hseparator2 = gtk_hseparator_new (); gtk_widget_set_name (hseparator2, "hseparator2"); gtk_widget_show (hseparator2); gtk_box_pack_start (GTK_BOX (vbox2), hseparator2, TRUE, TRUE, 5); label3 = gtk_label_new ("Select the server type, you want to connect to"); gtk_widget_set_name (label3, "label3"); gtk_widget_show (label3); gtk_box_pack_start (GTK_BOX (vbox2), label3, FALSE, FALSE, 10); gtk_label_set_justify (GTK_LABEL (label3), GTK_JUSTIFY_LEFT); gtk_label_set_line_wrap (GTK_LABEL (label3), TRUE); gtk_misc_set_alignment (GTK_MISC (label3), 0, 0.5); hbox3 = gtk_hbox_new (FALSE, 5); gtk_widget_set_name (hbox3, "hbox3"); gtk_widget_show (hbox3); gtk_box_pack_start (GTK_BOX (vbox2), hbox3, FALSE, FALSE, 0); label4 = gtk_label_new_with_mnemonic ("_Server type:"); gtk_widget_set_name (label4, "label4"); gtk_widget_show (label4); gtk_box_pack_start (GTK_BOX (hbox3), label4, FALSE, FALSE, 0); gtk_label_set_justify (GTK_LABEL (label4), GTK_JUSTIFY_LEFT); combo1 = gtk_combo_new (); g_object_set_data (G_OBJECT (GTK_COMBO (combo1)->popwin), "GladeParentKey", combo1); gtk_widget_set_name (combo1, "combo1"); gtk_widget_show (combo1); gtk_box_pack_start (GTK_BOX (hbox3), combo1, TRUE, TRUE, 0); gtk_combo_set_value_in_list (GTK_COMBO (combo1), TRUE, FALSE); combo1_items = g_list_append (combo1_items, (gpointer) "Local executable"); combo1_items = g_list_append (combo1_items, (gpointer) "Remote machine"); gtk_combo_set_popdown_strings (GTK_COMBO (combo1), combo1_items); g_list_free (combo1_items); ServerType = GTK_COMBO (combo1)->entry; gtk_widget_set_name (ServerType, "ServerType"); gtk_widget_show (ServerType); gtk_editable_set_editable (GTK_EDITABLE (ServerType), FALSE); gtk_entry_set_activates_default (GTK_ENTRY (ServerType), TRUE); hseparator3 = gtk_hseparator_new (); gtk_widget_set_name (hseparator3, "hseparator3"); gtk_widget_show (hseparator3); gtk_box_pack_start (GTK_BOX (vbox2), hseparator3, TRUE, TRUE, 5); label14 = gtk_label_new ("Troubleshooting"); gtk_widget_set_name (label14, "label14"); gtk_widget_show (label14); gtk_box_pack_start (GTK_BOX (vbox2), label14, FALSE, FALSE, 10); gtk_label_set_justify (GTK_LABEL (label14), GTK_JUSTIFY_LEFT); gtk_label_set_line_wrap (GTK_LABEL (label14), TRUE); gtk_misc_set_alignment (GTK_MISC (label14), 0, 0.5); DisableAsync = gtk_check_button_new_with_mnemonic ("Disable _asynchronous support (will increase latency)"); gtk_widget_set_name (DisableAsync, "DisableAsync"); gtk_widget_show (DisableAsync); gtk_box_pack_start (GTK_BOX (vbox2), DisableAsync, FALSE, FALSE, 0); EnableLogging = gtk_check_button_new_with_mnemonic ("Enable _logging"); gtk_widget_set_name (EnableLogging, "EnableLogging"); gtk_widget_show (EnableLogging); gtk_box_pack_start (GTK_BOX (vbox2), EnableLogging, FALSE, FALSE, 0); dialog_action_area2 = GTK_DIALOG (AddConnection)->action_area; gtk_widget_set_name (dialog_action_area2, "dialog_action_area2"); gtk_widget_show (dialog_action_area2); gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area2), GTK_BUTTONBOX_END); cancelbutton2 = gtk_button_new_from_stock ("gtk-cancel"); gtk_widget_set_name (cancelbutton2, "cancelbutton2"); gtk_widget_show (cancelbutton2); gtk_dialog_add_action_widget (GTK_DIALOG (AddConnection), cancelbutton2, GTK_RESPONSE_CANCEL); GTK_WIDGET_SET_FLAGS (cancelbutton2, GTK_CAN_DEFAULT); okbutton2 = gtk_button_new_from_stock ("gtk-ok"); gtk_widget_set_name (okbutton2, "okbutton2"); gtk_widget_show (okbutton2); gtk_dialog_add_action_widget (GTK_DIALOG (AddConnection), okbutton2, GTK_RESPONSE_OK); GTK_WIDGET_SET_FLAGS (okbutton2, GTK_CAN_DEFAULT); g_signal_connect_swapped ((gpointer) cancelbutton2, "clicked", G_CALLBACK (gtk_widget_destroy), GTK_OBJECT (AddConnection)); g_signal_connect_swapped ((gpointer) okbutton2, "clicked", G_CALLBACK (GTK_create_connection), GTK_OBJECT (AddConnection)); gtk_label_set_mnemonic_widget (GTK_LABEL (label10), ConnectionName); gtk_label_set_mnemonic_widget (GTK_LABEL (label4), ServerType); /* Store pointers to all widgets, for use by lookup_widget(). */ GLADE_HOOKUP_OBJECT_NO_REF (AddConnection, AddConnection, "AddConnection"); GLADE_HOOKUP_OBJECT_NO_REF (AddConnection, dialog_vbox2, "dialog_vbox2"); GLADE_HOOKUP_OBJECT (AddConnection, vbox2, "vbox2"); GLADE_HOOKUP_OBJECT (AddConnection, label9, "label9"); GLADE_HOOKUP_OBJECT (AddConnection, hbox5, "hbox5"); GLADE_HOOKUP_OBJECT (AddConnection, label10, "label10"); GLADE_HOOKUP_OBJECT (AddConnection, ConnectionName, "ConnectionName"); GLADE_HOOKUP_OBJECT (AddConnection, hseparator2, "hseparator2"); GLADE_HOOKUP_OBJECT (AddConnection, label3, "label3"); GLADE_HOOKUP_OBJECT (AddConnection, hbox3, "hbox3"); GLADE_HOOKUP_OBJECT (AddConnection, label4, "label4"); GLADE_HOOKUP_OBJECT (AddConnection, combo1, "combo1"); GLADE_HOOKUP_OBJECT (AddConnection, ServerType, "ServerType"); GLADE_HOOKUP_OBJECT (AddConnection, hseparator3, "hseparator3"); GLADE_HOOKUP_OBJECT (AddConnection, label14, "label14"); GLADE_HOOKUP_OBJECT (AddConnection, DisableAsync, "DisableAsync"); GLADE_HOOKUP_OBJECT (AddConnection, EnableLogging, "EnableLogging"); GLADE_HOOKUP_OBJECT_NO_REF (AddConnection, dialog_action_area2, "dialog_action_area2"); GLADE_HOOKUP_OBJECT (AddConnection, cancelbutton2, "cancelbutton2"); GLADE_HOOKUP_OBJECT (AddConnection, okbutton2, "okbutton2"); return AddConnection; } GtkWidget* create_RemoteMachine (void) { GtkWidget *RemoteMachine; GtkWidget *dialog_vbox3; GtkWidget *table1; GtkWidget *label6; GtkWidget *RemoteMachinePort; GtkWidget *label11; GtkWidget *RemoteMachineHostname; GtkWidget *dialog_action_area3; GtkWidget *cancelbutton3; GtkWidget *okbutton3; RemoteMachine = gtk_dialog_new (); gtk_widget_set_name (RemoteMachine, "RemoteMachine"); gtk_window_set_title (GTK_WINDOW (RemoteMachine), "Configure Remote Machine"); gtk_window_set_modal (GTK_WINDOW (RemoteMachine), TRUE); dialog_vbox3 = GTK_DIALOG (RemoteMachine)->vbox; gtk_widget_set_name (dialog_vbox3, "dialog_vbox3"); gtk_widget_show (dialog_vbox3); table1 = gtk_table_new (2, 2, FALSE); gtk_widget_set_name (table1, "table1"); gtk_widget_show (table1); gtk_box_pack_start (GTK_BOX (dialog_vbox3), table1, TRUE, TRUE, 0); gtk_container_set_border_width (GTK_CONTAINER (table1), 5); gtk_table_set_row_spacings (GTK_TABLE (table1), 5); gtk_table_set_col_spacings (GTK_TABLE (table1), 5); label6 = gtk_label_new_with_mnemonic ("_Port:"); gtk_widget_set_name (label6, "label6"); gtk_widget_show (label6); gtk_table_attach (GTK_TABLE (table1), label6, 0, 1, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_label_set_justify (GTK_LABEL (label6), GTK_JUSTIFY_LEFT); gtk_misc_set_alignment (GTK_MISC (label6), 0, 0.5); RemoteMachinePort = gtk_entry_new (); gtk_widget_set_name (RemoteMachinePort, "RemoteMachinePort"); gtk_widget_show (RemoteMachinePort); gtk_table_attach (GTK_TABLE (table1), RemoteMachinePort, 1, 2, 1, 2, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); label11 = gtk_label_new_with_mnemonic ("_Hostname:"); gtk_widget_set_name (label11, "label11"); gtk_widget_show (label11); gtk_table_attach (GTK_TABLE (table1), label11, 0, 1, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_label_set_justify (GTK_LABEL (label11), GTK_JUSTIFY_LEFT); gtk_misc_set_alignment (GTK_MISC (label11), 0, 0.5); RemoteMachineHostname = gtk_entry_new (); gtk_widget_set_name (RemoteMachineHostname, "RemoteMachineHostname"); gtk_widget_show (RemoteMachineHostname); gtk_table_attach (GTK_TABLE (table1), RemoteMachineHostname, 1, 2, 0, 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); dialog_action_area3 = GTK_DIALOG (RemoteMachine)->action_area; gtk_widget_set_name (dialog_action_area3, "dialog_action_area3"); gtk_widget_show (dialog_action_area3); gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area3), GTK_BUTTONBOX_END); cancelbutton3 = gtk_button_new_from_stock ("gtk-cancel"); gtk_widget_set_name (cancelbutton3, "cancelbutton3"); gtk_widget_show (cancelbutton3); gtk_dialog_add_action_widget (GTK_DIALOG (RemoteMachine), cancelbutton3, GTK_RESPONSE_CANCEL); GTK_WIDGET_SET_FLAGS (cancelbutton3, GTK_CAN_DEFAULT); okbutton3 = gtk_button_new_from_stock ("gtk-ok"); gtk_widget_set_name (okbutton3, "okbutton3"); gtk_widget_show (okbutton3); gtk_dialog_add_action_widget (GTK_DIALOG (RemoteMachine), okbutton3, GTK_RESPONSE_OK); GTK_WIDGET_SET_FLAGS (okbutton3, GTK_CAN_DEFAULT); g_signal_connect_swapped ((gpointer) cancelbutton3, "clicked", G_CALLBACK (gtk_widget_destroy), GTK_OBJECT (RemoteMachine)); g_signal_connect_swapped ((gpointer) okbutton3, "clicked", G_CALLBACK (GTK_add_tcp_server), GTK_OBJECT (RemoteMachine)); gtk_label_set_mnemonic_widget (GTK_LABEL (label6), RemoteMachinePort); gtk_label_set_mnemonic_widget (GTK_LABEL (label11), RemoteMachineHostname); /* Store pointers to all widgets, for use by lookup_widget(). */ GLADE_HOOKUP_OBJECT_NO_REF (RemoteMachine, RemoteMachine, "RemoteMachine"); GLADE_HOOKUP_OBJECT_NO_REF (RemoteMachine, dialog_vbox3, "dialog_vbox3"); GLADE_HOOKUP_OBJECT (RemoteMachine, table1, "table1"); GLADE_HOOKUP_OBJECT (RemoteMachine, label6, "label6"); GLADE_HOOKUP_OBJECT (RemoteMachine, RemoteMachinePort, "RemoteMachinePort"); GLADE_HOOKUP_OBJECT (RemoteMachine, label11, "label11"); GLADE_HOOKUP_OBJECT (RemoteMachine, RemoteMachineHostname, "RemoteMachineHostname"); GLADE_HOOKUP_OBJECT_NO_REF (RemoteMachine, dialog_action_area3, "dialog_action_area3"); GLADE_HOOKUP_OBJECT (RemoteMachine, cancelbutton3, "cancelbutton3"); GLADE_HOOKUP_OBJECT (RemoteMachine, okbutton3, "okbutton3"); return RemoteMachine; } GtkWidget* create_LocalExecutable (void) { GtkWidget *LocalExecutable; GtkWidget *dialog_vbox4; GtkWidget *vbox3; GtkWidget *label12; GtkWidget *hbox6; GtkWidget *LocalExecutablePath; GtkWidget *button6; GtkWidget *dialog_action_area4; GtkWidget *cancelbutton4; GtkWidget *okbutton4; LocalExecutable = gtk_dialog_new (); gtk_widget_set_name (LocalExecutable, "LocalExecutable"); gtk_window_set_title (GTK_WINDOW (LocalExecutable), "Configure Local Executable"); gtk_window_set_modal (GTK_WINDOW (LocalExecutable), TRUE); dialog_vbox4 = GTK_DIALOG (LocalExecutable)->vbox; gtk_widget_set_name (dialog_vbox4, "dialog_vbox4"); gtk_widget_show (dialog_vbox4); vbox3 = gtk_vbox_new (FALSE, 0); gtk_widget_set_name (vbox3, "vbox3"); gtk_widget_show (vbox3); gtk_box_pack_start (GTK_BOX (dialog_vbox4), vbox3, TRUE, TRUE, 0); gtk_container_set_border_width (GTK_CONTAINER (vbox3), 5); label12 = gtk_label_new ("Please enter name of server executable"); gtk_widget_set_name (label12, "label12"); gtk_widget_show (label12); gtk_box_pack_start (GTK_BOX (vbox3), label12, FALSE, FALSE, 10); gtk_label_set_justify (GTK_LABEL (label12), GTK_JUSTIFY_LEFT); gtk_misc_set_alignment (GTK_MISC (label12), 0, 0.5); hbox6 = gtk_hbox_new (FALSE, 5); gtk_widget_set_name (hbox6, "hbox6"); gtk_widget_show (hbox6); gtk_box_pack_start (GTK_BOX (vbox3), hbox6, TRUE, TRUE, 0); LocalExecutablePath = gtk_entry_new (); gtk_widget_set_name (LocalExecutablePath, "LocalExecutablePath"); gtk_widget_show (LocalExecutablePath); gtk_box_pack_start (GTK_BOX (hbox6), LocalExecutablePath, TRUE, TRUE, 0); button6 = gtk_button_new_with_mnemonic ("_Browse..."); gtk_widget_set_name (button6, "button6"); gtk_widget_show (button6); gtk_box_pack_start (GTK_BOX (hbox6), button6, FALSE, FALSE, 0); dialog_action_area4 = GTK_DIALOG (LocalExecutable)->action_area; gtk_widget_set_name (dialog_action_area4, "dialog_action_area4"); gtk_widget_show (dialog_action_area4); gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area4), GTK_BUTTONBOX_END); cancelbutton4 = gtk_button_new_from_stock ("gtk-cancel"); gtk_widget_set_name (cancelbutton4, "cancelbutton4"); gtk_widget_show (cancelbutton4); gtk_dialog_add_action_widget (GTK_DIALOG (LocalExecutable), cancelbutton4, GTK_RESPONSE_CANCEL); GTK_WIDGET_SET_FLAGS (cancelbutton4, GTK_CAN_DEFAULT); okbutton4 = gtk_button_new_from_stock ("gtk-ok"); gtk_widget_set_name (okbutton4, "okbutton4"); gtk_widget_show (okbutton4); gtk_dialog_add_action_widget (GTK_DIALOG (LocalExecutable), okbutton4, GTK_RESPONSE_OK); GTK_WIDGET_SET_FLAGS (okbutton4, GTK_CAN_DEFAULT); g_signal_connect_swapped ((gpointer) button6, "clicked", G_CALLBACK (GTK_browse_server_executable), GTK_OBJECT (LocalExecutablePath)); g_signal_connect_swapped ((gpointer) cancelbutton4, "clicked", G_CALLBACK (gtk_widget_destroy), GTK_OBJECT (LocalExecutable)); g_signal_connect_swapped ((gpointer) okbutton4, "clicked", G_CALLBACK (GTK_add_file_server), GTK_OBJECT (LocalExecutablePath)); /* Store pointers to all widgets, for use by lookup_widget(). */ GLADE_HOOKUP_OBJECT_NO_REF (LocalExecutable, LocalExecutable, "LocalExecutable"); GLADE_HOOKUP_OBJECT_NO_REF (LocalExecutable, dialog_vbox4, "dialog_vbox4"); GLADE_HOOKUP_OBJECT (LocalExecutable, vbox3, "vbox3"); GLADE_HOOKUP_OBJECT (LocalExecutable, label12, "label12"); GLADE_HOOKUP_OBJECT (LocalExecutable, hbox6, "hbox6"); GLADE_HOOKUP_OBJECT (LocalExecutable, LocalExecutablePath, "LocalExecutablePath"); GLADE_HOOKUP_OBJECT (LocalExecutable, button6, "button6"); GLADE_HOOKUP_OBJECT_NO_REF (LocalExecutable, dialog_action_area4, "dialog_action_area4"); GLADE_HOOKUP_OBJECT (LocalExecutable, cancelbutton4, "cancelbutton4"); GLADE_HOOKUP_OBJECT (LocalExecutable, okbutton4, "okbutton4"); return LocalExecutable; } GtkWidget* create_ConnectTerminal (void) { GtkWidget *ConnectTerminal; GtkWidget *scrolledwindow2; GtkWidget *textview1; ConnectTerminal = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_widget_set_name (ConnectTerminal, "ConnectTerminal"); gtk_window_set_title (GTK_WINDOW (ConnectTerminal), "GtkHack: Failed connection"); gtk_window_set_modal (GTK_WINDOW (ConnectTerminal), TRUE); scrolledwindow2 = gtk_scrolled_window_new (NULL, NULL); gtk_widget_set_name (scrolledwindow2, "scrolledwindow2"); gtk_widget_show (scrolledwindow2); gtk_container_add (GTK_CONTAINER (ConnectTerminal), scrolledwindow2); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow2), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); textview1 = gtk_text_view_new (); gtk_widget_set_name (textview1, "textview1"); gtk_widget_show (textview1); gtk_container_add (GTK_CONTAINER (scrolledwindow2), textview1); gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (textview1), GTK_WRAP_CHAR); /* Store pointers to all widgets, for use by lookup_widget(). */ GLADE_HOOKUP_OBJECT_NO_REF (ConnectTerminal, ConnectTerminal, "ConnectTerminal"); GLADE_HOOKUP_OBJECT (ConnectTerminal, scrolledwindow2, "scrolledwindow2"); GLADE_HOOKUP_OBJECT (ConnectTerminal, textview1, "textview1"); return ConnectTerminal; } GtkWidget* create_Troubleshooting (void) { GtkWidget *Troubleshooting; GtkWidget *dialog_vbox5; GtkWidget *vbox4; GtkWidget *label15; GtkWidget *label16; GtkWidget *label17; GtkWidget *hseparator4; GtkWidget *DisableAsync; GtkWidget *EnableLogging; GtkWidget *dialog_action_area5; GtkWidget *ViewLog; GtkWidget *closebutton1; Troubleshooting = gtk_dialog_new (); gtk_widget_set_name (Troubleshooting, "Troubleshooting"); gtk_window_set_title (GTK_WINDOW (Troubleshooting), "Troubleshooting"); gtk_window_set_destroy_with_parent (GTK_WINDOW (Troubleshooting), TRUE); dialog_vbox5 = GTK_DIALOG (Troubleshooting)->vbox; gtk_widget_set_name (dialog_vbox5, "dialog_vbox5"); gtk_widget_show (dialog_vbox5); vbox4 = gtk_vbox_new (FALSE, 0); gtk_widget_set_name (vbox4, "vbox4"); gtk_widget_show (vbox4); gtk_box_pack_start (GTK_BOX (dialog_vbox5), vbox4, TRUE, TRUE, 0); label15 = gtk_label_new ("Are you having trouble with the connection to the game server?"); gtk_widget_set_name (label15, "label15"); gtk_widget_show (label15); gtk_box_pack_start (GTK_BOX (vbox4), label15, FALSE, FALSE, 0); gtk_label_set_justify (GTK_LABEL (label15), GTK_JUSTIFY_LEFT); gtk_misc_set_alignment (GTK_MISC (label15), 0, 0.5); label16 = gtk_label_new ("These settings control how gtkhack connects to servers."); gtk_widget_set_name (label16, "label16"); gtk_widget_show (label16); gtk_box_pack_start (GTK_BOX (vbox4), label16, FALSE, FALSE, 0); gtk_label_set_justify (GTK_LABEL (label16), GTK_JUSTIFY_LEFT); gtk_misc_set_alignment (GTK_MISC (label16), 0, 0.5); label17 = gtk_label_new ("They allow you to troubleshoot connection related problems."); gtk_widget_set_name (label17, "label17"); gtk_widget_show (label17); gtk_box_pack_start (GTK_BOX (vbox4), label17, FALSE, FALSE, 0); gtk_label_set_justify (GTK_LABEL (label17), GTK_JUSTIFY_LEFT); gtk_misc_set_alignment (GTK_MISC (label17), 0, 0.5); hseparator4 = gtk_hseparator_new (); gtk_widget_set_name (hseparator4, "hseparator4"); gtk_widget_show (hseparator4); gtk_box_pack_start (GTK_BOX (vbox4), hseparator4, TRUE, FALSE, 4); DisableAsync = gtk_check_button_new_with_mnemonic ("Disable _asynchronous support on future connections"); gtk_widget_set_name (DisableAsync, "DisableAsync"); gtk_widget_show (DisableAsync); gtk_box_pack_start (GTK_BOX (vbox4), DisableAsync, FALSE, FALSE, 4); EnableLogging = gtk_check_button_new_with_mnemonic ("Enable _logging"); gtk_widget_set_name (EnableLogging, "EnableLogging"); gtk_widget_show (EnableLogging); gtk_box_pack_start (GTK_BOX (vbox4), EnableLogging, FALSE, FALSE, 4); dialog_action_area5 = GTK_DIALOG (Troubleshooting)->action_area; gtk_widget_set_name (dialog_action_area5, "dialog_action_area5"); gtk_widget_show (dialog_action_area5); gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area5), GTK_BUTTONBOX_END); ViewLog = gtk_button_new_with_mnemonic ("_View log"); gtk_widget_set_name (ViewLog, "ViewLog"); gtk_widget_show (ViewLog); gtk_dialog_add_action_widget (GTK_DIALOG (Troubleshooting), ViewLog, 0); GTK_WIDGET_SET_FLAGS (ViewLog, GTK_CAN_DEFAULT); closebutton1 = gtk_button_new_from_stock ("gtk-close"); gtk_widget_set_name (closebutton1, "closebutton1"); gtk_widget_show (closebutton1); gtk_dialog_add_action_widget (GTK_DIALOG (Troubleshooting), closebutton1, GTK_RESPONSE_CLOSE); GTK_WIDGET_SET_FLAGS (closebutton1, GTK_CAN_DEFAULT); g_signal_connect_swapped ((gpointer) Troubleshooting, "response", G_CALLBACK (gtk_widget_destroy), GTK_OBJECT (Troubleshooting)); g_signal_connect ((gpointer) DisableAsync, "toggled", G_CALLBACK (on_DisableAsync_toggled), NULL); g_signal_connect ((gpointer) EnableLogging, "toggled", G_CALLBACK (on_EnableLogging_toggled), NULL); g_signal_connect ((gpointer) ViewLog, "clicked", G_CALLBACK (on_ViewLog_clicked), NULL); /* Store pointers to all widgets, for use by lookup_widget(). */ GLADE_HOOKUP_OBJECT_NO_REF (Troubleshooting, Troubleshooting, "Troubleshooting"); GLADE_HOOKUP_OBJECT_NO_REF (Troubleshooting, dialog_vbox5, "dialog_vbox5"); GLADE_HOOKUP_OBJECT (Troubleshooting, vbox4, "vbox4"); GLADE_HOOKUP_OBJECT (Troubleshooting, label15, "label15"); GLADE_HOOKUP_OBJECT (Troubleshooting, label16, "label16"); GLADE_HOOKUP_OBJECT (Troubleshooting, label17, "label17"); GLADE_HOOKUP_OBJECT (Troubleshooting, hseparator4, "hseparator4"); GLADE_HOOKUP_OBJECT (Troubleshooting, DisableAsync, "DisableAsync"); GLADE_HOOKUP_OBJECT (Troubleshooting, EnableLogging, "EnableLogging"); GLADE_HOOKUP_OBJECT_NO_REF (Troubleshooting, dialog_action_area5, "dialog_action_area5"); GLADE_HOOKUP_OBJECT (Troubleshooting, ViewLog, "ViewLog"); GLADE_HOOKUP_OBJECT (Troubleshooting, closebutton1, "closebutton1"); return Troubleshooting; } GtkWidget* create_ViewLog (void) { GtkWidget *ViewLog; GtkWidget *vbox5; GtkWidget *menubar1; GtkWidget *menuitem4; GtkWidget *menuitem4_menu; GtkWidget *clear1; GtkWidget *save_as1; GtkWidget *separatormenuitem1; GtkWidget *quit1; GtkWidget *menuitem5; GtkWidget *menuitem5_menu; GtkWidget *copy1; GtkWidget *scrolledwindow3; GtkWidget *ViewLogTextView; GtkAccelGroup *accel_group; accel_group = gtk_accel_group_new (); ViewLog = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_widget_set_name (ViewLog, "ViewLog"); gtk_window_set_title (GTK_WINDOW (ViewLog), "View connection log"); vbox5 = gtk_vbox_new (FALSE, 0); gtk_widget_set_name (vbox5, "vbox5"); gtk_widget_show (vbox5); gtk_container_add (GTK_CONTAINER (ViewLog), vbox5); menubar1 = gtk_menu_bar_new (); gtk_widget_set_name (menubar1, "menubar1"); gtk_widget_show (menubar1); gtk_box_pack_start (GTK_BOX (vbox5), menubar1, FALSE, FALSE, 0); menuitem4 = gtk_menu_item_new_with_mnemonic ("_File"); gtk_widget_set_name (menuitem4, "menuitem4"); gtk_widget_show (menuitem4); gtk_container_add (GTK_CONTAINER (menubar1), menuitem4); menuitem4_menu = gtk_menu_new (); gtk_widget_set_name (menuitem4_menu, "menuitem4_menu"); gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem4), menuitem4_menu); clear1 = gtk_image_menu_item_new_from_stock ("gtk-clear", accel_group); gtk_widget_set_name (clear1, "clear1"); gtk_widget_show (clear1); gtk_container_add (GTK_CONTAINER (menuitem4_menu), clear1); save_as1 = gtk_image_menu_item_new_from_stock ("gtk-save-as", accel_group); gtk_widget_set_name (save_as1, "save_as1"); gtk_widget_show (save_as1); gtk_container_add (GTK_CONTAINER (menuitem4_menu), save_as1); separatormenuitem1 = gtk_menu_item_new (); gtk_widget_set_name (separatormenuitem1, "separatormenuitem1"); gtk_widget_show (separatormenuitem1); gtk_container_add (GTK_CONTAINER (menuitem4_menu), separatormenuitem1); gtk_widget_set_sensitive (separatormenuitem1, FALSE); quit1 = gtk_image_menu_item_new_from_stock ("gtk-quit", accel_group); gtk_widget_set_name (quit1, "quit1"); gtk_widget_show (quit1); gtk_container_add (GTK_CONTAINER (menuitem4_menu), quit1); menuitem5 = gtk_menu_item_new_with_mnemonic ("_Edit"); gtk_widget_set_name (menuitem5, "menuitem5"); gtk_widget_show (menuitem5); gtk_container_add (GTK_CONTAINER (menubar1), menuitem5); menuitem5_menu = gtk_menu_new (); gtk_widget_set_name (menuitem5_menu, "menuitem5_menu"); gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem5), menuitem5_menu); copy1 = gtk_image_menu_item_new_from_stock ("gtk-copy", accel_group); gtk_widget_set_name (copy1, "copy1"); gtk_widget_show (copy1); gtk_container_add (GTK_CONTAINER (menuitem5_menu), copy1); scrolledwindow3 = gtk_scrolled_window_new (NULL, NULL); gtk_widget_set_name (scrolledwindow3, "scrolledwindow3"); gtk_widget_show (scrolledwindow3); gtk_box_pack_start (GTK_BOX (vbox5), scrolledwindow3, TRUE, TRUE, 0); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow3), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); ViewLogTextView = gtk_text_view_new (); gtk_widget_set_name (ViewLogTextView, "ViewLogTextView"); gtk_widget_show (ViewLogTextView); gtk_container_add (GTK_CONTAINER (scrolledwindow3), ViewLogTextView); gtk_text_view_set_editable (GTK_TEXT_VIEW (ViewLogTextView), FALSE); g_signal_connect ((gpointer) clear1, "activate", G_CALLBACK (on_viewlog_clear), NULL); g_signal_connect ((gpointer) save_as1, "activate", G_CALLBACK (on_viewlog_save_as), NULL); g_signal_connect ((gpointer) quit1, "activate", G_CALLBACK (on_viewlog_quit), NULL); g_signal_connect ((gpointer) copy1, "activate", G_CALLBACK (on_viewlog_copy), NULL); /* Store pointers to all widgets, for use by lookup_widget(). */ GLADE_HOOKUP_OBJECT_NO_REF (ViewLog, ViewLog, "ViewLog"); GLADE_HOOKUP_OBJECT (ViewLog, vbox5, "vbox5"); GLADE_HOOKUP_OBJECT (ViewLog, menubar1, "menubar1"); GLADE_HOOKUP_OBJECT (ViewLog, menuitem4, "menuitem4"); GLADE_HOOKUP_OBJECT (ViewLog, menuitem4_menu, "menuitem4_menu"); GLADE_HOOKUP_OBJECT (ViewLog, clear1, "clear1"); GLADE_HOOKUP_OBJECT (ViewLog, save_as1, "save_as1"); GLADE_HOOKUP_OBJECT (ViewLog, separatormenuitem1, "separatormenuitem1"); GLADE_HOOKUP_OBJECT (ViewLog, quit1, "quit1"); GLADE_HOOKUP_OBJECT (ViewLog, menuitem5, "menuitem5"); GLADE_HOOKUP_OBJECT (ViewLog, menuitem5_menu, "menuitem5_menu"); GLADE_HOOKUP_OBJECT (ViewLog, copy1, "copy1"); GLADE_HOOKUP_OBJECT (ViewLog, scrolledwindow3, "scrolledwindow3"); GLADE_HOOKUP_OBJECT (ViewLog, ViewLogTextView, "ViewLogTextView"); gtk_window_add_accel_group (GTK_WINDOW (ViewLog), accel_group); return ViewLog; } slashem-0.0.7E7F3/win/gtk/gtkprogress.h0000664000076400007640000000301410545462317015757 0ustar aliali/* $Id: gtkprogress.h,v 1.1 2003/08/31 12:54:24 j_ali Exp $ */ /* GTK+ NetHack Copyright (c) Slash'EM Development Team 2003 GTK+ NetHack may be freely redistributed. See license for details. */ #define NH_GTK_TYPE_PROGRESS_WINDOW nh_gtk_progress_window_get_type() #define NH_GTK_PROGRESS_WINDOW(obj) G_TYPE_CHECK_INSTANCE_CAST(obj,\ NH_GTK_TYPE_PROGRESS_WINDOW,\ NhGtkProgressWindow) #define NH_GTK_PROGRESS_WINDOW_CLASS(klass) \ G_TYPE_CHECK_CLASS_CAST(klass,\ NH_GTK_TYPE_PROGRESS_WINDOW,\ NhGtkProgressWindowClass) #define NH_GTK_IS_PROGRESS_WINDOW(obj) G_TYPE_CHECK_INSTANCE_TYPE(obj,\ NH_GTK_TYPE_PROGRESS_WINDOW) #define NH_GTK_IS_PROGRESS_WINDOW_CLASS(klass) \ G_TYPE_CHECK_CLASS_TYPE(klass,\ NH_GTK_TYPE_PROGRESS_WINDOW) #define NH_GTK_PROGRESS_WINDOW_GET_CLASS(obj) \ G_TYPE_INSTANCE_GET_CLASS(obj,\ NH_GTK_TYPE_PROGRESS_WINDOW,\ NhGtkProgressWindowClass) typedef struct _NhGtkProgressWindowClass NhGtkProgressWindowClass; GType nh_gtk_progress_window_get_type(void) G_GNUC_CONST; GtkWidget *nh_gtk_progress_window_new(const gchar *title, GtkWindow *parent); void nh_gtk_progress_window_add_stage(NhGtkProgressWindow *w, const gchar *name); void nh_gtk_progress_window_complete_stage(NhGtkProgressWindow *w); void nh_gtk_progress_window_stage_pulse(NhGtkProgressWindow *w); int nh_gtk_progress_window_stage_auto_pulse(NhGtkProgressWindow *w, gboolean enable); void nh_gtk_progress_window_stage_set_fraction(NhGtkProgressWindow *w, gdouble fraction); slashem-0.0.7E7F3/win/gtk/cc-gtk.c0000664000076400007640000001573710545462317014567 0ustar aliali/* $Id: cc-gtk.c,v 1.2 2003/12/23 23:28:46 j_ali Exp $ */ /* Copyright (c) Slash'EM Development Team 2002 */ /* NetHack may be freely redistributed. See license for details. */ /* * This program provides a means of using pkg-config to determine how to * compile and link against Gtk+ 2.0. Using this as a front-end to the * compiler avoids the limitations of cmd.exe. */ #include #include #ifdef WIN32 #include #include #include #include #include #endif #include "cc-gtk.h" #define M_COMPILE 'c' #define M_LINK 'l' #ifndef WIN32 extern char **environ; /* MS-Windows defines this in stdlib.h */ #endif #ifdef WIN32 #define pipe(fds) _pipe(fds, 1024, _O_BINARY) #endif int mode = M_COMPILE; int verbose = 0; static void usage() { fprintf(stderr, "Usage: cc-gtk [-v] [-c|-l] cc [cc options] ...\n"); exit(1); } static int parse_cmdline(cmd, argc, argv) char *cmd; int *argc; char ***argv; { int i, j; int was_space = 1; *argc = 0; for(i = 0; cmd[i]; i++) { if (was_space && !isspace(cmd[i])) (*argc)++; was_space = isspace(cmd[i]); } *argv = (char **)malloc((*argc + 1) * sizeof(char *)); if (!*argv) return 0; *argc = 0; was_space = 1; for(i = j = 0; ; i++) { if (!cmd[i] || isspace(cmd[i])) { if (was_space) j = i; else { (*argv)[*argc] = (char *)malloc(i - j + 1); if (!(*argv)[*argc]) { free(*argv); return 0; } memcpy((*argv)[*argc], cmd + j, i - j); (*argv)[(*argc)++][i - j] = '\0'; j = i; was_space = 1; } if (!cmd[i]) break; } else if (was_space) { was_space = 0; j = i; } } (*argv)[*argc] = (char *)0; return 1; } static int str_cmpni(s1, s2, n) char *s1, *s2; int n; { int i, r; for(i = 0; i < n; i++) { r = (s1[i] | 0x20) - (s2[i] | 0x20); if (r) return r; } return 0; } static int env_init(enc, env) int *enc; char ***env; { int i; for(i = 0; environ[i]; i++) ; *enc = i; *env = (char **)malloc((i + 1) * sizeof(char *)); if (!*env) return 0; for(i = 0; environ[i]; i++) (*env)[i] = environ[i]; (*env)[i] = (char *)0; return 1; } static char * env_get(enc, env, var) int enc; char **env; char *var; { int i, n = strlen(var); for(i = 0; i < enc; i++) if (!str_cmpni(env[i], var, n) && env[i][n]=='=') return env[i]; return (char *)0; } static int env_put(enc, env, val) int *enc; char ***env; char *val; { int i, n; char *s; char **new; s = strchr(val, '='); if (!s) return 0; n = s - val; for(i = 0; i < *enc; i++) if (!str_cmpni((*env)[i], val, n) && (*env)[i][n] == '=') { (*env)[i] = val; return 1; } new = (char **)realloc(*env, (*enc + 2) * sizeof(char *)); if (!new) return 0; *env = new; (*env)[(*enc)++] = val; (*env)[*enc] = (char *)0; return 1; } static int pkg_config(pcargc, pcargv) int *pcargc; char ***pcargv; { int i, pid, argc; char *cmd = mode == M_COMPILE ? GTKCFLAGS : GTKLIBS; char **argv; char buf[128]; int config_bytes = 0; char *config; int p[2]; int status; int enc; char **env; char *s, *pcp, *path; char sep; if (!env_init(&enc, &env)) return 0; s = env_get(enc, env, "PKG_CONFIG_PATH"); if (s) sep = ';'; else { s = "PKG_CONFIG_PATH"; sep = '='; } pcp = (char *)malloc(strlen(s) + strlen(PKG_CONFIG_PATH) + 2); sprintf(pcp, "%s%c%s", s, sep, PKG_CONFIG_PATH); /* Re-write PKG_CONFIG_PATH to use backslashes so that * pkg-config's prefix re-writing will work. */ for(i = 0; pcp[i]; i++) if (pcp[i] == '/') pcp[i] = '\\'; env_put(&enc, &env, pcp); s = env_get(enc, env, "PATH"); if (s) sep = ';'; else { s = "PATH"; sep = '='; } path = (char *)malloc(strlen(s) + strlen(PKG_CONFIG_DLL) + 2); sprintf(path, "%s%c%s", s, sep, PKG_CONFIG_DLL); env_put(&enc, &env, path); if (!parse_cmdline(cmd, &argc, &argv)) return 0; if (verbose) { for(i = 0; i < argc; i++) { if (i) putc(' ', stderr); fputs(argv[i], stderr); } putc('\n', stderr); } if (pipe(p)) return 0; i = dup(1); dup2(p[1], 1); #ifdef WIN32 pid = spawnvpe(P_NOWAIT, argv[0], argv, env); if (pid < 0) { perror(argv[0]); return 0; } #else pid = fork(); if (pid < 0) { perror(argv[0]); return 0; } else if (!pid) { execvpe(argv[0], argv, env); perror(argv[0]); exit(1); } #endif close(p[1]); dup2(i, 1); close(i); free(env); free(pcp); free(path); while((i = read(p[0], buf, sizeof(buf))) > 0) { if (config_bytes) config = (char *)realloc(config, config_bytes + i); else config = (char *)malloc(i); memcpy(config + config_bytes, buf, i); config_bytes += i; } if (!config_bytes) { fprintf(stderr, "%s: No output\n", argv[0]); return 0; } if (config[config_bytes - 1] != '\n') { fprintf(stderr, "%s: Missing newline (%*.*s)\n", argv[0], config_bytes, config_bytes, config); } for(i = 0; i < argc; i++) free(argv[i]); #ifdef WIN32 if (config_bytes > 1 && config[config_bytes - 2] == '\r') config[config_bytes - 2] = '\0'; else #endif config[config_bytes - 1] = '\0'; close(p[0]); #ifdef WIN32 (void)cwait(&status, pid, WAIT_CHILD); if (status) exit(1); #else (void)waitpid(pid, &status, 0); if (!WIFEXITED(status) || WEXITSTATUS(status)) exit(1); #endif if (!parse_cmdline(config, pcargc, pcargv)) return 0; free(config); return 1; } int main(argc, argv) int argc; char **argv; { int i, n = 1; int pcargc, nargc; char **pcargv, **nargv; while (n < argc && argv[n][0] == '-') { if (!argv[n][1]) { n++; break; } else if (!argv[n][2]) switch(argv[n][1]) { case 'v': verbose = 1; break; case 'c': mode = M_COMPILE; break; case 'l': mode = M_LINK; break; default: usage(); } else usage(); n++; } if (n == argc) usage(); pkg_config(&pcargc, &pcargv); nargc = argc - n + pcargc; nargv = (char **)malloc((nargc + 1) * sizeof(char *)); if (!nargv) { fprintf(stderr, "cc-gtk: Not enough memory\n"); exit(1); } if (mode == M_COMPILE) { /* Insert output of pkg-config between compile cmd and its arguments */ nargv[0] = argv[n]; for(i = 0; i < pcargc; i++) nargv[i + 1] = pcargv[i]; for(i = 1; i < argc - n; i++) nargv[i + pcargc] = argv[n + i]; } else { /* Append output of pkg-config after all arguments to link cmd */ for(i = 0; i < argc - n; i++) nargv[i] = argv[n + i]; for(i = 0; i < pcargc; i++) nargv[i + argc - n] = pcargv[i]; } nargv[nargc] = (char *)0; for(i = 0; i < nargc; i++) { if (i) putc(' ', stderr); fprintf(stderr, "%s", nargv[i]); } putc('\n', stderr); #ifdef WIN32 i = spawnvp(P_WAIT, nargv[0], nargv); if (i < 0) { perror(nargv[0]); exit(1); } exit(i); #else execvp(nargv[0], nargv); perror(nargv[0]); exit(1); #endif } slashem-0.0.7E7F3/win/gtk/gtksupport.h0000664000076400007640000000246510545462317015640 0ustar aliali/* * DO NOT EDIT THIS FILE - it is generated by Glade. */ #ifdef HAVE_CONFIG_H # include #endif #include /* * Public Functions. */ /* * This function returns a widget in a component created by Glade. * Call it with the toplevel widget in the component (i.e. a window/dialog), * or alternatively any widget in the component, and the name of the widget * you want returned. */ GtkWidget* lookup_widget (GtkWidget *widget, const gchar *widget_name); /* Use this function to set the directory containing installed pixmaps. */ void add_pixmap_directory (const gchar *directory); /* * Private Functions. */ /* This is used to create the pixmaps used in the interface. */ GtkWidget* create_pixmap (GtkWidget *widget, const gchar *filename); /* This is used to create the pixbufs used in the interface. */ GdkPixbuf* create_pixbuf (const gchar *filename); /* This is used to set ATK action descriptions. */ void glade_set_atk_action_description (AtkAction *action, const gchar *action_name, const gchar *description); slashem-0.0.7E7F3/win/gtk/gtkstatus.c0000664000076400007640000004630010545462317015436 0ustar aliali/* $Id: gtkstatus.c,v 1.12 2003/08/02 14:44:52 j_ali Exp $ */ /* GTK+ NetHack Copyright (c) Issei Numata 1999-2000 Copyright (c) Slash'EM Development Team 2001-2003 GTK+ NetHack may be freely redistributed. See license for details. */ #include #include #include #include "winGTK.h" /****************************************************************************** The NhLight widget is a trivial widget that is used to indicate stat changed ******************************************************************************/ #define NH_TYPE_LIGHT nh_light_get_type() #define NH_LIGHT(obj) G_TYPE_CHECK_INSTANCE_CAST(obj, \ NH_TYPE_LIGHT, NhLight) #define NH_LIGHT_CLASS(klass) G_TYPE_CHECK_CLASS_CAST(klass, \ NH_TYPE_LIGHT, NhLightClass) #define NH_IS_LIGHT(obj) G_TYPE_CHECK_INSTANCE_TYPE(obj, \ NH_TYPE_LIGHT) #define NH_IS_LIGHT_CLASS(klass) G_TYPE_CHECK_CLASS_TYPE(klass, \ NH_TYPE_LIGHT) #define NH_LIGHT_GET_CLASS(obj) G_TYPE_INSTANCE_GET_CLASS(obj, \ NH_TYPE_LIGHT, NhLightClass) #define NH_LIGHT_MAX_CONTRAST 10 #define NH_LIGHT_WIDTH 4 #define NH_LIGHT_HEIGHT 16 typedef struct _NhLight { GtkMisc misc; int contrast; /* From 0 (none) to 10 (max), or -1 (transp) */ } NhLight; typedef struct _NhLightClass { GtkMiscClass parent_class; } NhLightClass; static gpointer parent_class; GType nh_light_get_type(void); GtkWidget *nh_light_new(void); void nh_light_set_contrast(NhLight *light, int contrast); static void nh_light_class_init(NhLightClass *klass); static void nh_light_init(NhLight *light); static gint nh_light_expose(GtkWidget *widget, GdkEventExpose *expose); static void nh_light_size_request(GtkWidget *widget, GtkRequisition *requisition); GType nh_light_get_type(void) { static GType type = 0; if (!type) { static const GTypeInfo info = { sizeof(NhLightClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc)nh_light_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(NhLight), 0, /* n_preallocs */ (GInstanceInitFunc)nh_light_init }; type = g_type_register_static(GTK_TYPE_MISC, "NhLight", &info, 0); } return type; } GtkWidget *nh_light_new(void) { return g_object_new(NH_TYPE_LIGHT, NULL); } void nh_light_set_contrast(NhLight *light, int contrast) { if (contrast < 0) contrast = 0; else if (contrast > NH_LIGHT_MAX_CONTRAST) contrast = NH_LIGHT_MAX_CONTRAST; if (light->contrast != contrast) { light->contrast = contrast; gtk_widget_queue_draw(GTK_WIDGET(light)); } } static void nh_light_class_init(NhLightClass *klass) { GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(klass); parent_class = g_type_class_peek_parent(klass); widget_class->expose_event = nh_light_expose; widget_class->size_request = nh_light_size_request; } static void nh_light_init(NhLight *light) { GTK_WIDGET_SET_FLAGS(light, GTK_NO_WINDOW); light->contrast = 0; } static gint nh_light_expose(GtkWidget *widget, GdkEventExpose *expose) { GtkMisc *misc = GTK_MISC(widget); NhLight *light = NH_LIGHT(widget); GdkGC *gc; GdkColormap *cmap; GdkColor color = {0}; GdkRectangle area; gfloat xalign; gint x, y; guint16 bg; if (GTK_WIDGET_MAPPED(widget)) { area = expose->area; if (!gdk_rectangle_intersect(&area, &widget->allocation, &area)) return FALSE; if (gtk_widget_get_direction(widget) == GTK_TEXT_DIR_LTR) xalign = misc->xalign; else xalign = 1.0 - misc->xalign; x = floor(0.5 + widget->allocation.x + misc->xpad + xalign * (widget->allocation.width - widget->requisition.width)); y = floor(0.5 + widget->allocation.y + misc->ypad + misc->yalign * (widget->allocation.height - widget->requisition.height)); gc = gdk_gc_new(widget->window); cmap = gdk_drawable_get_colormap(widget->window); if (!cmap) fprintf(stderr, "nh_light_expose: No colormap!\n"); color.red = bg = widget->style->bg[GTK_STATE_NORMAL].red; color.red += (65535L - bg) * light->contrast / NH_LIGHT_MAX_CONTRAST; color.green = bg = widget->style->bg[GTK_STATE_NORMAL].green; color.green += (65535L - bg) * light->contrast / NH_LIGHT_MAX_CONTRAST; color.blue = bg = widget->style->bg[GTK_STATE_NORMAL].blue; color.blue += (65535L - bg) * light->contrast / NH_LIGHT_MAX_CONTRAST; if (gdk_colormap_alloc_color(cmap, &color, FALSE, TRUE)) gdk_gc_set_foreground(gc, &color); else gdk_gc_set_foreground(gc, &widget->style->bg[GTK_STATE_NORMAL]); gdk_draw_rectangle(widget->window, gc, TRUE, x, y, NH_LIGHT_WIDTH, NH_LIGHT_HEIGHT); g_object_unref(gc); } } static void nh_light_size_request(GtkWidget *widget, GtkRequisition *requisition) { widget->requisition.width = NH_LIGHT_WIDTH + GTK_MISC(widget)->xpad * 2; widget->requisition.height = NH_LIGHT_HEIGHT + GTK_MISC(widget)->ypad * 2; GTK_WIDGET_CLASS(parent_class)->size_request(widget, requisition); } /******************************************************************************/ #define NH_BAR_WIDTH 150 #define NH_BAR_HEIGHT 8 #define STAT_ROWS 8 #define STAT_COLS 2 #define STAT_BARS 2 static GtkWidget *handle; static GtkWidget *frame; static GtkWidget *dlvl; static GtkWidget *stat_table; static GtkWidget *hbox2; static GtkWidget *vbox; static GtkWidget *levi; static GtkWidget *conf; static GtkWidget *blin; static GtkWidget *stun; static GtkWidget *hall; static GtkWidget *hung; static GtkWidget *sick; static GtkWidget *encu; static GtkWidget *slim; static GtkWidget *bar_table; static struct { GtkWidget *hbox, *vbox, *lbl, *area; GdkPixmap *pixmap; GdkGC *gc; } bar[STAT_BARS]; static struct { GtkLabel *label, *value; NhLight *light; } stat_widgets[STAT_COLS][STAT_ROWS]; static gint bar_expose_event(GtkWidget *widget, GdkEventExpose *event) { int i; for(i = 0; i < STAT_BARS; i++) if (widget == bar[i].area) break; if (i == STAT_BARS) return FALSE; gdk_draw_pixmap(widget->window, widget->style->fg_gc[GTK_WIDGET_STATE(widget)], bar[i].pixmap, event->area.x, event->area.y, event->area.x, event->area.y, event->area.width, event->area.height); return TRUE; } #if defined(MONITOR_HEAP) && defined(INTERNAL_MALLOC) static int stat_mem() { return monitor_heap_getmem(); } #endif #define STAT_COLUMN(n) (n) #define STAT_BAR(n) (STAT_COLS + (n)) #define STAT_FRAME (STAT_COLS + STAT_BARS + 1) #define STAT_DLEVEL (STAT_COLS + STAT_BARS + 2) #define STAT_HUNGER (STAT_COLS + STAT_BARS + 3) #define STAT_ENCUMBERANCE (STAT_COLS + STAT_BARS + 4) #define STAT_FLAGS (STAT_COLS + STAT_BARS + 5) struct nh_stat_tab { int where; char *label; char *quan; /* Name of quantity from game executable */ char *divisor; /* Value to show as max */ int vi,dvi; /* indecies into values array */ int row; gchar *oldvalue; } stat_tab[] = { {STAT_FRAME, "", "player", NULL}, {STAT_DLEVEL, "", "dlevel", NULL}, {STAT_HUNGER, "", "hunger", NULL}, {STAT_ENCUMBERANCE, "", "encumberance", NULL}, {STAT_FLAGS, "", "flags", NULL}, {STAT_BAR(1), "HP", "hp", "hpmax"}, {STAT_BAR(2), "MP", "pw", "pwmax"}, {STAT_COLUMN(1), "AC", "ac", NULL}, {STAT_COLUMN(1), "GOLD", "gold", NULL}, {STAT_COLUMN(1), "LEVEL", "elevel", NULL}, {STAT_COLUMN(1), "HD", "hitdice", NULL}, {STAT_COLUMN(1), "ALIGN", "align", NULL}, {STAT_COLUMN(1), "TIME", "time", NULL}, {STAT_COLUMN(1), "EXP", "experience", NULL}, {STAT_COLUMN(1), "SCORE", "score", NULL}, {STAT_COLUMN(1), "WEIGHT", "weight", "capacity"}, {STAT_COLUMN(2), "STR", "strength", NULL}, {STAT_COLUMN(2), "DEX", "dexterity", NULL}, {STAT_COLUMN(2), "CON", "constitution", NULL}, {STAT_COLUMN(2), "INT", "intelligence", NULL}, {STAT_COLUMN(2), "WIS", "wisdom", NULL}, {STAT_COLUMN(2), "CHA", "charisma", NULL}, #if defined(MONITOR_HEAP) && defined(INTERNAL_MALLOC) {STAT_COLUMN(2), "MEM", NULL, NULL}, #endif }; static int in_trouble = FALSE; static stat_tab_hp = -1; boolean nh_status_in_trouble(void) { return in_trouble; } char * nh_status_last_displayed(char *quan) { int i; for(i = 0; i < SIZE(stat_tab); i++) if (!strcmp(quan, stat_tab[i].quan)) return stat_tab[i].oldvalue; return NULL; } static void nh_status_reconfig(nv, values) int nv; char **values; { int i, j, k; int rowno[STAT_COLS]; for(i = 0; i < STAT_COLS; i++) { rowno[i] = 0; } for(i = 0; i < SIZE(stat_tab); i++) { stat_tab[i].vi = stat_tab[i].dvi = -1; for(j = 0; j < nv; j++) { if (stat_tab[i].divisor && !strcmp(stat_tab[i].divisor, values[j])) { stat_tab[i].dvi = j; if (!stat_tab[i].quan || stat_tab[i].vi >= 0) break; } else if (stat_tab[i].quan && !strcmp(stat_tab[i].quan, values[j])) { stat_tab[i].vi = j; if (!strcmp(stat_tab[i].quan, "hp")) stat_tab_hp = i; k = stat_tab[i].where - STAT_COLUMN(1); if (k >=0 && k < STAT_COLS) { if (stat_tab[i].row != rowno[k]) { stat_tab[i].row = rowno[k]; g_free(stat_tab[i].oldvalue); stat_tab[i].oldvalue = (gchar *)0; } gtk_label_set_text(stat_widgets[k][rowno[k]++].label, stat_tab[i].label); } if (!stat_tab[i].divisor || stat_tab[i].dvi >= 0) break; } } if (stat_tab[i].vi < 0 && stat_tab[i].oldvalue) { g_free(stat_tab[i].oldvalue); stat_tab[i].oldvalue = (gchar *)0; } } for(i = 0; i < STAT_COLS; i++) { for(j = rowno[i]; j < STAT_ROWS; j++) { gtk_label_set_text(stat_widgets[i][j].label, ""); gtk_label_set_text(stat_widgets[i][j].value, ""); } } } static light_timer(gpointer data) { int i, j; int retval = FALSE; NhLight *light; for(j = 0; j < STAT_ROWS; j++) for(i = 0; i < STAT_COLS; i++) { light = stat_widgets[i][j].light; if (light && light->contrast > 0) { nh_light_set_contrast(light, light->contrast - 1); if (light->contrast > 0) retval = TRUE; } } *(int *)data = retval; return retval; } void GTK_ext_status(reconfig, nv, values) int reconfig, nv; const char **values; { int i, j, val, dval; unsigned long fl; char buf[NH_BUFSIZ]; char *Dummy = NULL; const char *value; gchar *str = NULL, *s; GdkRectangle update_rect; static int light_timer_active = 0; int start_light_timer = 0; if (reconfig) { nh_status_reconfig(nv, values); return; } in_trouble = FALSE; for(i = 0; i < SIZE(stat_tab); i++) { if (stat_tab[i].vi < 0) continue; value = values[stat_tab[i].vi]; if (stat_tab[i].dvi >= 0) s = g_strdup_printf("%s/%s", value, values[stat_tab[i].dvi]); else s = g_strdup(value); j = stat_tab[i].where - STAT_BAR(1); if (j >= 0 && j < 2 && *stat_tab[i].label) str = g_strdup_printf("%s %s", stat_tab[i].label, s); else if (*s && (stat_tab[i].where == STAT_HUNGER || stat_tab[i].where == STAT_ENCUMBERANCE)) str = g_strdup_printf(" %s ", s); else { str = s; s = (gchar *)0; } g_free(s); if (!stat_tab[i].oldvalue || strcmp(str, stat_tab[i].oldvalue)) { switch(stat_tab[i].where) { case STAT_COLUMN(1): case STAT_COLUMN(2): j = stat_tab[i].where - STAT_COLUMN(1); gtk_label_set_text(stat_widgets[j][stat_tab[i].row].value, str); nh_light_set_contrast( stat_widgets[j][stat_tab[i].row].light, NH_LIGHT_MAX_CONTRAST); start_light_timer++; break; case STAT_BAR(1): case STAT_BAR(2): j = stat_tab[i].where - STAT_BAR(1); update_rect.x = 0; update_rect.y = 0; update_rect.width = NH_BAR_WIDTH; update_rect.height = NH_BAR_HEIGHT; sscanf(value, "%d", &val); if (stat_tab[i].dvi >= 0) { sscanf(values[stat_tab[i].dvi], "%d", &dval); if (i == stat_tab_hp && (val <= 5 || val * 7 <= dval)) in_trouble = TRUE; val = dval ? val * NH_BAR_WIDTH / dval : 0; } gdk_draw_rectangle(bar[j].pixmap, bar[j].gc, TRUE, 0, 0, val, NH_BAR_HEIGHT); if (val < NH_BAR_WIDTH) gdk_draw_rectangle(bar[j].pixmap, bar[j].area->style->black_gc, TRUE, val, 0, NH_BAR_WIDTH - val, NH_BAR_HEIGHT); gtk_widget_draw(bar[j].area, &update_rect); gtk_label_set_text(GTK_LABEL(bar[j].lbl), str); break; case STAT_FRAME: gtk_frame_set_label(GTK_FRAME(frame), str); break; case STAT_DLEVEL: gtk_label_set_text(GTK_LABEL(dlvl), str); break; case STAT_HUNGER: gtk_label_set_text(GTK_LABEL(hung), str); break; case STAT_ENCUMBERANCE: gtk_label_set_text(GTK_LABEL(encu), str); break; case STAT_FLAGS: sscanf(value, "%lX", &fl); gtk_label_set_text(GTK_LABEL(levi), (fl & RAW_STAT_LEVITATION) ? " Levitation " : ""); gtk_label_set_text(GTK_LABEL(blin), (fl & RAW_STAT_BLIND) ? " Blind " : ""); gtk_label_set_text(GTK_LABEL(conf), (fl & RAW_STAT_CONFUSION) ? " Confused " : ""); gtk_label_set_text(GTK_LABEL(sick), (fl & RAW_STAT_FOODPOIS) ? " FoodPois " : (fl & RAW_STAT_ILL) ? " Ill " : ""); gtk_label_set_text(GTK_LABEL(stun), (fl & RAW_STAT_STUNNED) ? " Stunned " : ""); gtk_label_set_text(GTK_LABEL(hall), (fl & RAW_STAT_HALLUCINATION) ? " Hallucination " : ""); gtk_label_set_text(GTK_LABEL(slim), (fl & RAW_STAT_SLIMED) ? " Slimed " : ""); break; } g_free(stat_tab[i].oldvalue); stat_tab[i].oldvalue = str; str = (gchar *)0; } g_free(str); } if (!light_timer_active && start_light_timer) g_timeout_add(200, light_timer, &light_timer_active); } void nh_status_destroy() { /* * [ALI] Most objects will be destroyed when the status widget is * destroyed (ie., as part of destroying the main window). */ int i; for(i = 0; i < STAT_BARS; i++) gdk_pixmap_unref(bar[i].pixmap); } GtkWidget * nh_status_new() { extern GtkWidget *main_window; GtkWidget *hbox, *w; GdkPixbuf *light; int i, j; gchar *text[3] = { "", "", NULL}; handle = gtk_handle_box_new(); GTK_HANDLE_BOX(handle)->shrink_on_detach = 1; frame = nh_gtk_new_and_add(gtk_frame_new(NULL), handle, ""); gtk_container_set_border_width(GTK_CONTAINER(frame), NH_PAD); vbox = nh_gtk_new_and_add(gtk_vbox_new(FALSE, 0), frame, ""); gtk_container_set_border_width(GTK_CONTAINER(vbox), NH_PAD); dlvl = nh_gtk_new_and_pack(gtk_label_new(""), vbox, "", FALSE, FALSE, 0); bar_table = nh_gtk_new_and_add(gtk_table_new(2, 2, FALSE), vbox, ""); for(i = 0; i < STAT_BARS; i++) { bar[i].hbox = nh_gtk_new_and_attach(gtk_hbox_new(FALSE, 0), bar_table, "", 0, 1, i, i + 1); for(j = 0; j < SIZE(stat_tab); j++) if (stat_tab[j].where == STAT_BAR(i + 1)) break; bar[i].lbl = nh_gtk_new_and_pack(gtk_label_new(stat_tab[j].label), bar[i].hbox, "", FALSE, FALSE, 0); bar[i].vbox = nh_gtk_new_and_attach(gtk_vbox_new(TRUE, 0), bar_table, "", 1, 2, i, i + 1); bar[i].area = nh_gtk_new_and_pack(gtk_drawing_area_new(), bar[i].vbox, "", FALSE, FALSE, 0); gtk_signal_connect(GTK_OBJECT(bar[i].area), "expose_event", GTK_SIGNAL_FUNC(bar_expose_event), NULL); bar[i].gc = gdk_gc_new(main_window->window); gtk_drawing_area_size(GTK_DRAWING_AREA(bar[i].area), NH_BAR_WIDTH, NH_BAR_HEIGHT); bar[i].pixmap = gdk_pixmap_new(main_window->window, NH_BAR_WIDTH, NH_BAR_HEIGHT, -1); } /* * [ALI] Spacing in the stat table is a little unconventional. What we * want to achive is: * * P< label>PP< value>PPPP< label>PP< value>PPP * * (where P is a padding of width NH_PAD). But we want to achive this * without using a column for the light (so that the table can be * homogeneous which looks better and keeps the resizing simple). * * We achieve this with a combination of table spacing and putting * the value and its light into an hbox. * * |P< label>P|P |< value>PP|P |P< label>P|P |< value>PP|P * * Column 0: Contents: P< label>P, Spacing: P * Column 1: Contents: < value>PP, Spacing: P * Column 2: Contents: P< label>P, Spacing: P * Column 3: Contents: < value>PP, Spacing: N/A * * The final spacing of P on the right is achieved by placing the * table in a horizontal box with an empty box. * * Note: It would be easier to move the padding out of the label * columns and then the now symetric padding could be added by * setting the padding of the table itself: * * P|< label>|PP |< value>PP|PP |< label>|PP |< value>PP|P * * However, this means that the width of the labels will be expanded * to be at least < value>PP rather than < value> * which the current scheme achieves. Ideally, we'd like it to be * simply < value>, but that doesn't seem possible. */ hbox = nh_gtk_new_and_pack(gtk_hbox_new(FALSE, 0), vbox, "", TRUE, FALSE, 0); gtk_box_set_spacing(GTK_BOX(hbox), NH_PAD); stat_table = nh_gtk_new_and_pack( gtk_table_new(STAT_ROWS, STAT_COLS * 2, TRUE), hbox, "", TRUE, FALSE, 0); nh_gtk_new_and_pack(gtk_vbox_new(FALSE, 0), hbox, "", FALSE, FALSE, 0); gtk_table_set_col_spacings(GTK_TABLE(stat_table), NH_PAD); for(j = 0; j < STAT_COLS; j++) for(i = 0; i < STAT_ROWS; i++) { w = nh_gtk_new_and_attach(gtk_label_new(""), stat_table, "", j * 2, j * 2 + 1, i, i + 1); gtk_misc_set_alignment(GTK_MISC(w), 1, 1); gtk_misc_set_padding(GTK_MISC(w), NH_PAD, 0); stat_widgets[j][i].label = GTK_LABEL(w); hbox = nh_gtk_new_and_attach(gtk_hbox_new(FALSE, 0), stat_table, "", j * 2 + 1, j * 2 + 2, i, i + 1); gtk_box_set_spacing(GTK_BOX(hbox), 2 * NH_PAD); w = nh_gtk_new_and_pack(gtk_label_new(""), hbox, "", TRUE, TRUE, 0); gtk_misc_set_alignment(GTK_MISC(w), 1, 1); stat_widgets[j][i].value = GTK_LABEL(w); w = nh_gtk_new_and_pack(nh_light_new(), hbox, "", FALSE, FALSE, 0); stat_widgets[j][i].light = NH_LIGHT(w); } hbox2 = nh_gtk_new_and_pack(gtk_hbox_new(FALSE, 0), vbox, "", FALSE, FALSE, 0); hung = nh_gtk_new_and_pack(gtk_label_new(""), hbox2, "", FALSE, FALSE, 0); levi = nh_gtk_new_and_pack(gtk_label_new(""), hbox2, "", FALSE, FALSE, 0); conf = nh_gtk_new_and_pack(gtk_label_new(""), hbox2, "", FALSE, FALSE, 0); blin = nh_gtk_new_and_pack(gtk_label_new(""), hbox2, "", FALSE, FALSE, 0); stun = nh_gtk_new_and_pack(gtk_label_new(""), hbox2, "", FALSE, FALSE, 0); hall = nh_gtk_new_and_pack(gtk_label_new(""), hbox2, "", FALSE, FALSE, 0); sick = nh_gtk_new_and_pack(gtk_label_new(""), hbox2, "", FALSE, FALSE, 0); slim = nh_gtk_new_and_pack(gtk_label_new(""), hbox2, "", FALSE, FALSE, 0); encu = nh_gtk_new_and_pack(gtk_label_new(""), hbox2, "", FALSE, FALSE, 0); /* Clear HP/MP bars */ for(i = 0; i < STAT_BARS; i++) { GdkRectangle update_rect; update_rect.x = 0; update_rect.y = 0; update_rect.width = NH_BAR_WIDTH; update_rect.height = NH_BAR_HEIGHT; gdk_gc_set_foreground(bar[i].gc, &nh_color[MAP_BLACK]); gdk_draw_rectangle(bar[i].pixmap, bar[i].gc, TRUE, 0, 0, NH_BAR_WIDTH, NH_BAR_HEIGHT); gtk_widget_draw(bar[i].area, &update_rect); gdk_gc_set_foreground(bar[i].gc, &nh_color[i ? CLR_GREEN : CLR_BLUE]); } for(i = 0; i < SIZE(stat_tab); i++) stat_tab[i].vi = stat_tab[i].dvi = -1; return handle; } slashem-0.0.7E7F3/win/gtk/gtkmenu.c0000664000076400007640000005153110545462317015061 0ustar aliali/* $Id: gtkmenu.c,v 1.23.2.1 2004/11/12 21:57:31 j_ali Exp $ */ /* GTK+ NetHack Copyright (c) Issei Numata 1999-2000 Copyright (c) Slash'EM Development Team 2000-2003 GTK+ NetHack may be freely redistributed. See license for details. */ #include #include #include #include #include "winGTK.h" #ifdef SHORT_FILENAMES #include "patchlev.h" #else #include "patchlevel.h" #endif /* #define DEBUG */ #ifdef WINGTK_MENU_IMAGES #define MENU_COLS 4 #else #define MENU_COLS 3 #endif typedef struct _NHMenuItem{ int ch; int gch; int selected; long count; int id; int attr; int glyph; } NHMenuItem; extern NHWindow gtkWindows[]; extern GtkAccelGroup *accel_group; static void move_menu(struct menu *src_menu, struct menu *dest_menu); static void free_menu(struct menu *m); static void GTK_load_menu_clist(NHWindow *w, winid inven); static gint menu_destroy(GtkWidget *widget, gpointer data) { NHWindow *w = (NHWindow *)data; if (!w->menu_information->cancelled){ w->menu_information->keysym = '\033'; w->menu_information->cancelled = 1; gtk_main_quit(); } w->menu_information->valid_widgets = FALSE; w->w = NULL; return FALSE; } static gint menu_key_press(GtkWidget *widget, GdkEventKey *event, gpointer data) { NHWindow *w = (NHWindow *)data; struct menu_info_t *menu_info = w->menu_information; #ifdef GTK_PROXY menu_info->keysym = proxy_cb_map_menu_cmd(nh_keysym(event)); #else menu_info->keysym = map_menu_cmd(nh_keysym(event)); #endif if (event->keyval == GDK_Escape) { menu_info->keysym = '\033'; menu_info->cancelled = 1; } if (menu_info->keysym) gtk_main_quit(); return FALSE; } static gint menu_button_clicked(GtkWidget *widget, gpointer data) { int i, j; NHWindow *w = NULL; for(i = 0; i < MAXWIN; i++) if (gtkWindows[i].type == NHW_MENU) for(j = 0; j < gtkWindows[i].n_button; j++) if (widget == gtkWindows[i].button[j]) { w = >kWindows[i]; break; } if (!w) panic("menu_button_clicked: Can't find window"); w->menu_information->keysym = (int)data; if (w->menu_information->keysym == '\033') w->menu_information->cancelled = 1; if (w->menu_information->keysym) gtk_main_quit(); return FALSE; } static gint menu_selected(GtkWidget *clist, gint row, gint column, GdkEventButton *event, gpointer data) { gchar buf[4]; NHWindow *w = (NHWindow *)data; struct menu_info_t *menu_info = w->menu_information; menu_info->curr_menu.nhMenuItem[row].selected = 1; menu_info->n_select++; buf[0] = menu_info->curr_menu.nhMenuItem[row].count >= 0 ? '#' : '-'; if (menu_info->curr_menu.nhMenuItem[row].gch) { buf[1] = ' '; buf[2] = menu_info->curr_menu.nhMenuItem[row].gch; buf[3] = '\0'; } else buf[1] = '\0'; gtk_clist_set_text(GTK_CLIST(clist), row, MENU_COLS - 2, buf); return FALSE; } static gint menu_unselected(GtkWidget *clist, gint row, gint column, GdkEventButton *event, gpointer data) { gchar buf[4]; NHWindow *w = (NHWindow *)data; struct menu_info_t *menu_info = w->menu_information; menu_info->curr_menu.nhMenuItem[row].selected = 0; menu_info->n_select--; if (menu_info->curr_menu.nhMenuItem[row].gch) sprintf(buf, "- %c", menu_info->curr_menu.nhMenuItem[row].gch); else strcpy(buf, "-"); gtk_clist_set_text(GTK_CLIST(clist), row, MENU_COLS - 2, buf); return FALSE; } #ifdef DEBUG static void dump_menu_window(winid id, const char *tag) { struct menu_info_t *menu_info = gtkWindows[id].menu_information; fprintf(stderr, "%s: Window %d: mi @ %p\n", tag, id, menu_info); if (menu_info) fprintf(stderr, "\tcurr: %d/%d items @ %p, new: %d/%d items @ %p\n", menu_info->curr_menu.n_menuitem, menu_info->curr_menu.alloc_menuitem, menu_info->curr_menu.nhMenuItem, menu_info->new_menu.n_menuitem, menu_info->new_menu.alloc_menuitem, menu_info->new_menu.nhMenuItem); } #endif void GTK_start_menu(winid id) { NHWindow *w; struct menu_info_t *menu_info; w = >kWindows[id]; if (w->type != NHW_MENU) panic("GTK_start_menu: Window id (%d) is not a menu (type %d)", id, w->type); menu_info = w->menu_information; /* make sure we're starting with a clean slate */ menu_info->new_menu.n_menuitem = 0; if (!menu_info->new_menu.nhMenuItem) { menu_info->new_menu.alloc_menuitem = 32; /* Arbitary */ menu_info->new_menu.nhMenuItem = (NHMenuItem *) malloc((unsigned)(sizeof(NHMenuItem) * menu_info->new_menu.alloc_menuitem)); } if (!menu_info->new_menu.nhMenuItem) { menu_info->new_menu.alloc_menuitem = 1; /* Minimum */ menu_info->new_menu.nhMenuItem = (NHMenuItem *) malloc(sizeof(NHMenuItem)); } if (!menu_info->new_menu.nhMenuItem) panic("GTK_start_menu: Memory allocation failure; cannot get %u bytes", sizeof(NHMenuItem)); menu_info->new_menu.n_menuitem = 0; menu_info->new_menu.c_menuitem = 'a'; menu_info->new_menu.clist = GTK_CLIST(gtk_clist_new(MENU_COLS)); g_object_ref(menu_info->new_menu.clist); gtk_object_sink(GTK_OBJECT(menu_info->new_menu.clist)); } static void GTK_init_menu_widgets(NHWindow *w, winid inven) { int i; GtkWidget *b; if (w->menu_information->cancelled >= 0) { w->w = nh_gtk_window_dialog(TRUE); nh_gtk_focus_set_master(GTK_WINDOW(w->w), GTK_SIGNAL_FUNC(menu_key_press), w, TRUE); nh_position_popup_dialog(GTK_WIDGET(w->w)); } else { w->w = nh_session_window_new("inventory"); nh_gtk_focus_set_slave_for(GTK_WINDOW(w->w), GTK_WINDOW(main_window)); } gtk_widget_set_name(GTK_WIDGET(w->w), "fixed font"); w->hid = gtk_signal_connect(GTK_OBJECT(w->w), "destroy", GTK_SIGNAL_FUNC(menu_destroy), w); w->frame = nh_gtk_new_and_add(gtk_frame_new(NULL), w->w, ""); w->vbox = nh_gtk_new_and_add(gtk_vbox_new(FALSE, 0), w->frame, ""); w->hbox = nh_gtk_new_and_pack(gtk_hbox_new(FALSE, 0), w->vbox, "", FALSE, FALSE, NH_PAD); if (w->menu_information->cancelled >= 0) { b = w->button[0] = nh_gtk_new_and_pack (gtk_button_new_from_stock(GTK_STOCK_OK), w->hbox, "", FALSE, FALSE, NH_PAD); gtk_signal_connect(GTK_OBJECT(b), "clicked", GTK_SIGNAL_FUNC(menu_button_clicked), (gpointer)'\n'); b = w->button[1] = nh_gtk_new_and_pack( gtk_button_new_from_stock(GTK_STOCK_CANCEL), w->hbox, "", FALSE, FALSE, NH_PAD); gtk_signal_connect(GTK_OBJECT(b), "clicked", GTK_SIGNAL_FUNC(menu_button_clicked), (gpointer)'\033'); b = w->button[2] = nh_gtk_new_and_pack( gtk_button_new_with_label("All"), w->hbox, "", FALSE, FALSE, NH_PAD); gtk_signal_connect(GTK_OBJECT(b), "clicked", GTK_SIGNAL_FUNC(menu_button_clicked), (gpointer)MENU_SELECT_ALL); b = w->button[3] = nh_gtk_new_and_pack( gtk_button_new_with_label("None"), w->hbox, "", FALSE, FALSE, NH_PAD); gtk_signal_connect(GTK_OBJECT(b), "clicked", GTK_SIGNAL_FUNC(menu_button_clicked), (gpointer)MENU_UNSELECT_ALL); b = w->button[4] = nh_gtk_new_and_pack( gtk_button_new_with_label("Invert"), w->hbox, "", FALSE, FALSE, NH_PAD); gtk_signal_connect(GTK_OBJECT(b), "clicked", GTK_SIGNAL_FUNC(menu_button_clicked), (gpointer)MENU_INVERT_ALL); } else #if GTK_CHECK_VERSION(1,3,12) gtk_window_add_accel_group(GTK_WINDOW(w->w), accel_group); #else gtk_accel_group_attach(accel_group, G_OBJECT(w->w)); #endif w->hbox2 = nh_gtk_new_and_pack(gtk_hbox_new(FALSE, 0), w->vbox, "", TRUE, TRUE, NH_PAD); w->adj = (GtkAdjustment *)gtk_adjustment_new(0.0, 0.0, 0.0, 0.0, 0.0, 0.0); w->adj2 = (GtkAdjustment *)gtk_adjustment_new(0.0, 0.0, 0.0, 0.0, 0.0, 0.0); GTK_load_menu_clist(w, inven); w->clist = nh_gtk_new_and_pack(GTK_WIDGET(w->clist), w->hbox2, "", TRUE, TRUE, NH_PAD); gtk_clist_set_vadjustment(GTK_CLIST(w->clist), w->adj); gtk_clist_set_hadjustment(GTK_CLIST(w->clist), w->adj2); gtk_clist_set_selection_mode(GTK_CLIST(w->clist), GTK_SELECTION_EXTENDED); gtk_clist_set_shadow_type(GTK_CLIST(w->clist), GTK_SHADOW_ETCHED_IN); for(i = 0; i < MENU_COLS; i++) gtk_clist_set_column_auto_resize(GTK_CLIST(w->clist), i, TRUE); #ifdef WINGTK_MENU_IMAGES if (w->menu_information->pixmaps && GTK_CLIST(w->clist)->row_height < nh_tile_3dheight()) gtk_clist_set_row_height(GTK_CLIST(w->clist), nh_tile_3dheight()); #endif w->scrolled = nh_gtk_new_and_pack( gtk_vscrollbar_new(GTK_CLIST(w->clist)->vadjustment), w->hbox2, "", FALSE, FALSE, NH_PAD); w->scrolled2 = nh_gtk_new_and_pack( gtk_hscrollbar_new(GTK_CLIST(w->clist)->hadjustment), w->vbox, "", FALSE, FALSE, NH_PAD); if (w->menu_information->cancelled >= 0) { gtk_signal_connect(GTK_OBJECT(w->clist), "select_row", GTK_SIGNAL_FUNC(menu_selected), (gpointer)w); gtk_signal_connect(GTK_OBJECT(w->clist), "unselect_row", GTK_SIGNAL_FUNC(menu_unselected), (gpointer)w); w->hbox3 = nh_gtk_new_and_pack(gtk_hbox_new(FALSE, 0), w->vbox, "", FALSE, FALSE, NH_PAD); b = w->button[5] = nh_gtk_new_and_pack( gtk_button_new_from_stock(GTK_STOCK_CLOSE), w->hbox3, "", TRUE, FALSE, 0); GTK_WIDGET_SET_FLAGS(b, GTK_CAN_DEFAULT); gtk_widget_grab_default(b); gtk_signal_connect(GTK_OBJECT(b), "clicked", GTK_SIGNAL_FUNC(menu_button_clicked), (gpointer)'\n'); w->n_button = 6; } else w->n_button = 0; if (w->menu_information->curr_menu.prompt) gtk_frame_set_label(GTK_FRAME(w->frame), w->menu_information->curr_menu.prompt); w->menu_information->valid_widgets = TRUE; } static void GTK_destroy_menu_widgets(NHWindow *w) { if (w->w && w->menu_information->valid_widgets) { gtk_widget_hide_all(w->w); if (w->hid > 0) gtk_signal_disconnect(GTK_OBJECT(w->w), w->hid); gtk_widget_destroy(w->w); w->w = NULL; w->menu_information->valid_widgets = FALSE; } } static void GTK_load_menu_clist(NHWindow *w, winid inven) { int i, j; GtkCList *c; GtkStyle *s; struct menu *menu; gchar *text[MENU_COLS]; if (w->menu_information->valid_widgets) c = GTK_CLIST(w->clist); else { c = GTK_CLIST(gtk_clist_new(MENU_COLS)); w->clist = GTK_WIDGET(c); } s = gtk_rc_get_style(w->clist); if (!s) s = w->clist->style; gtk_clist_freeze(c); gtk_clist_clear(c); menu = &w->menu_information->curr_menu; #ifdef WINGTK_MENU_IMAGES w->menu_information->pixmaps = FALSE; #endif for(j = 0; ; j++) { for(i = 0; i < MENU_COLS; i++) if (!gtk_clist_get_text(menu->clist, j, i, &text[i])) break; if (i < MENU_COLS) break; gtk_clist_append(c, text); if (!menu->nhMenuItem[j].id) { gtk_clist_set_selectable(c, j, FALSE); if (menu->nhMenuItem[j].attr == ATR_INVERSE) gtk_clist_set_background(c, j, s->dark + GTK_STATE_NORMAL); switch(menu->nhMenuItem[j].attr) { case ATR_BOLD: gtk_clist_set_foreground(c, j, &s->black); break; case ATR_DIM: gtk_clist_set_foreground(c, j, s->light + GTK_STATE_NORMAL); break; default: gtk_clist_set_foreground(c, j, s->text + GTK_STATE_NORMAL); break; } } #ifdef WINGTK_MENU_IMAGES if (menu->nhMenuItem[j].glyph != NO_GLYPH && map_visual) { GdkPixmap *pixmap; pixmap = GTK_glyph_to_gdkpixmap(menu->nhMenuItem[j].glyph); if (pixmap) { gtk_clist_set_pixmap(c, j, 0, pixmap, NULL); gdk_pixmap_unref(pixmap); w->menu_information->pixmaps = TRUE; } } #endif } /* Inventory window doesn't really look good if it's completely empty */ if (w-gtkWindows == inven && !j) { char *gold = nh_status_last_displayed("gold"); if (gold && strcmp(gold,"0")) text[0] = "Not carrying anything except gold."; else text[0] = "Not carrying anything."; for(i = 1; i < MENU_COLS; i++) text[i] = ""; gtk_clist_append(c, text); } gtk_clist_thaw(c); } void GTK_ext_add_menu(winid id, int glyph, int identifier, CHAR_P ch,CHAR_P gch ,int attr ,const char *str, BOOLEAN_P preselected) { GtkCList *c; NHWindow *w; struct menu *menu; char buf[2], buf2[4]; gchar *text[MENU_COLS]; if (!str || str[0] == '\0') return; w = >kWindows[id]; menu = &w->menu_information->new_menu; c = menu->clist; if (identifier && !ch) { ch = menu->c_menuitem++; if (ch == 'z') menu->c_menuitem = 'A'; else if (ch == 'Z') menu->c_menuitem = 0; } if (menu->n_menuitem >= menu->alloc_menuitem) { NHMenuItem *new; new = (NHMenuItem *) realloc((genericptr_t)menu->nhMenuItem, (unsigned)(sizeof(NHMenuItem) * 2 * menu->alloc_menuitem)); if (new) menu->alloc_menuitem *= 2; else new = (NHMenuItem *) realloc((genericptr_t)menu->nhMenuItem, (unsigned)(sizeof(NHMenuItem) * ++menu->alloc_menuitem)); if (!new) panic("GTK_add_menu: Memory allocation failure; cannot get %u bytes", sizeof(NHMenuItem)); menu->nhMenuItem = new; } menu->nhMenuItem[menu->n_menuitem].ch = ch; menu->nhMenuItem[menu->n_menuitem].gch = gch; menu->nhMenuItem[menu->n_menuitem].selected = FALSE; menu->nhMenuItem[menu->n_menuitem].count = -1; menu->nhMenuItem[menu->n_menuitem].id = identifier; menu->nhMenuItem[menu->n_menuitem].attr = attr; menu->nhMenuItem[menu->n_menuitem].glyph = glyph; text[0] = ""; sprintf(buf, "%c", ch); text[MENU_COLS-3] = buf; if (gch) { sprintf(buf2, "- %c", gch); text[MENU_COLS-2] = buf2; } else text[MENU_COLS-2] = identifier ? "-" : ""; text[MENU_COLS-1] = (gchar *)str; gtk_clist_append(c, text); menu->n_menuitem++; } void GTK_end_menu(winid id, const char *prompt) { NHWindow *w; NHMenuItem *new; struct menu *menu; w = >kWindows[id]; menu = &w->menu_information->new_menu; if (menu->n_menuitem) { new = (NHMenuItem *) realloc((genericptr_t)menu->nhMenuItem, (unsigned)(sizeof(NHMenuItem) * menu->n_menuitem)); if (new) { menu->alloc_menuitem = menu->n_menuitem; menu->nhMenuItem = new; } } else { free((genericptr_t)menu->nhMenuItem); menu->nhMenuItem = NULL; menu->alloc_menuitem = 0; } menu->prompt = prompt ? strdup(prompt) : (char *)0; } int GTK_ext_select_menu(winid id, int how, struct proxy_mi **menu_list) { int i; int n; NHWindow *w; struct menu_info_t *menu_info; NHMenuItem *item; GtkCList *c; extern int root_width, root_height; gint width, height; #ifdef GTK_PROXY winid inven = proxy_cb_get_standard_winid("INVEN"); #else winid inven = WIN_INVEN; #endif n = 0; w = >kWindows[id]; menu_info = w->menu_information; menu_info->n_select = 0; menu_info->selmode = how; menu_info->count = -1; *menu_list = 0; if (id == inven) { i = copts.perm_invent && how == PICK_NONE ? -1 : 0; if (i != menu_info->cancelled) { menu_info->cancelled = i; GTK_destroy_menu_widgets(w); } } else menu_info->cancelled = 0; /* make new menu the current menu */ if (menu_info->new_menu.n_menuitem) move_menu(&menu_info->new_menu, &menu_info->curr_menu); if (!menu_info->valid_widgets) GTK_init_menu_widgets(w, inven); else GTK_load_menu_clist(w, inven); if (id == inven && copts.perm_invent) gtk_window_set_title(GTK_WINDOW(w->w), DEF_GAME_NAME " Inventory"); else gtk_window_set_title(GTK_WINDOW(w->w), DEF_GAME_NAME " Menu"); if (how != PICK_ANY) { gtk_clist_set_selection_mode(GTK_CLIST(w->clist), GTK_SELECTION_SINGLE); if (w->n_button >= 4) { gtk_widget_set_sensitive(w->button[1], FALSE); gtk_widget_set_sensitive(w->button[2], FALSE); gtk_widget_set_sensitive(w->button[3], FALSE); gtk_widget_set_sensitive(w->button[4], FALSE); } } if (menu_info->cancelled < 0) { /* Permenant inventory. * The default size request from a clist is based on the initial * contents which means that the user can't resize the window smaller * than required to display the initial list regardless of what is * currently being displayed. We reduce the request to the minimum * width and 1 row high. */ gtk_widget_set_size_request(w->clist, 0, GTK_CLIST(w->clist)->row_height); /* The default size is the size that the window will initially be * displayed at. If the session system hasn't already set this then * choose a suitable default size based on the root window. It would * be nice to use a size capable of displaying the initial contents * but, at least under MS-Windows, it doesn't seem possible to get * this from Gtk+. */ if (!(nh_session_window_flags("inventory") & NH_SESSION_USER_SIZE)) gtk_window_set_default_size(GTK_WINDOW(w->w), root_width / 3, root_height * 2 / 3); gtk_widget_queue_resize(w->w); } else { /* Popup menus are normally displayed at full size so that their * contents are instantly viewable. The exception is where this * would mean that the window is too large to fit on the screen. */ GtkRequisition requisition; gtk_widget_size_request(w->clist, &requisition); if (requisition.height >= root_height * 2 / 3) gtk_widget_set_size_request(w->clist, -1, root_height * 2 / 3); else gtk_widget_hide(w->scrolled); gtk_widget_hide(w->scrolled2); } w->flags |= NHWF_DISPLAYED; gtk_widget_show(w->w); if (menu_info->cancelled < 0) { gtk_window_present(GTK_WINDOW(w->w)); return 0; } gtk_grab_add(w->w); gtk_widget_grab_focus(w->clist); c = GTK_CLIST(w->clist); while(1) { gtk_main(); if (menu_info->keysym == '\033' || menu_info->keysym == '\n' || menu_info->keysym == ' ') break; if (how == PICK_ONE && menu_info->n_select == 1) break; if (how != PICK_NONE) { for(i = 0; i < menu_info->curr_menu.n_menuitem; i++) { item = &menu_info->curr_menu.nhMenuItem[i]; if (how == PICK_ANY) { if (menu_info->keysym == MENU_INVERT_PAGE || menu_info->keysym == MENU_INVERT_ALL) { if (item->id) { if (item->selected) gtk_clist_unselect_row(c, i, 0); else { menu_info->curr_menu.nhMenuItem[i].count = -1; gtk_clist_select_row(c, i, 0); } } } if (menu_info->keysym == MENU_UNSELECT_PAGE || menu_info->keysym == MENU_UNSELECT_ALL){ if (item->id) gtk_clist_unselect_row(c, i, 0); } if (menu_info->keysym == MENU_SELECT_PAGE || menu_info->keysym == MENU_SELECT_ALL){ if (item->id) { menu_info->curr_menu.nhMenuItem[i].count = -1; gtk_clist_select_row(c, i, 0); } } else if (item->gch == menu_info->keysym) { if (item->selected) gtk_clist_unselect_row(c, i, 0); else { menu_info->curr_menu.nhMenuItem[i].count = -1; gtk_clist_select_row(c, i, 0); } } } if (item->ch == menu_info->keysym) { if (item->selected && menu_info->count < 0) gtk_clist_unselect_row(c, i, 0); else { menu_info->curr_menu.nhMenuItem[i].count = menu_info->count; gtk_clist_select_row(c, i, 0); } if (how == PICK_ONE) goto loopout; } } if (menu_info->keysym >= '0' && menu_info->keysym <= '9') { if (menu_info->count > 0) menu_info->count *= 10; else menu_info->count = 0; menu_info->count += menu_info->keysym - '0'; if (menu_info->count <= 0) menu_info->count = -1; } else menu_info->count = -1; } } loopout: GTK_destroy_menu_widgets(w); if (menu_info->cancelled) return -1; for(i = 0; i < menu_info->curr_menu.n_menuitem; i++) if (menu_info->curr_menu.nhMenuItem[i].selected && menu_info->curr_menu.nhMenuItem[i].id) n++; if (n > 0) { *menu_list = (struct proxy_mi *) alloc(n * sizeof(struct proxy_mi)); n = 0; for(i = 0; i < menu_info->curr_menu.n_menuitem; i++) { item = &menu_info->curr_menu.nhMenuItem[i]; if (item->selected && item->id) { (*menu_list)[n].item = item->id; (*menu_list)[n].count = item->count; n++; } } } return n; } static void move_menu(struct menu *src_menu, struct menu *dest_menu) { free_menu(dest_menu); /* toss old menu */ *dest_menu = *src_menu; /* make new menu current */ /* leave no dangling pointers */ src_menu->clist = (GtkCList *)0; src_menu->nhMenuItem = (NHMenuItem *)0; src_menu->alloc_menuitem = 0; src_menu->n_menuitem = 0; src_menu->prompt = (char *)0; } static void free_menu(struct menu *m) { if (m->clist) { gtk_widget_unref(GTK_WIDGET(m->clist)); m->clist = (GtkCList *)0; } free((genericptr_t) m->nhMenuItem); m->nhMenuItem = (NHMenuItem *)0; m->alloc_menuitem = 0; m->n_menuitem = 0; free((genericptr_t) m->prompt); } void GTK_create_menu_window(NHWindow *w) { w->menu_information = (struct menu_info_t *) alloc(sizeof(struct menu_info_t)); (void) memset((genericptr_t) w->menu_information, '\0', sizeof(struct menu_info_t)); } void GTK_destroy_menu_window(NHWindow *w) { GTK_destroy_menu_widgets(w); free_menu(&w->menu_information->curr_menu); free_menu(&w->menu_information->new_menu); free((genericptr_t) w->menu_information); w->menu_information = (struct menu_info_t *) 0; } void GTK_unmap_menu_window(NHWindow *w) { if (w && w->w) /* FIXME: This shouldn't be necessary, but is */ gtk_widget_hide(w->w); } slashem-0.0.7E7F3/win/gtk/gtkprefs.c0000664000076400007640000001242510545462317015233 0ustar aliali/* $Id: gtkprefs.c,v 1.4 2003/08/21 19:00:24 j_ali Exp $ */ /* GTK+ NetHack Copyright (c) Issei Numata 1999-2000 Copyright (c) Slash'EM Development Team 2000-2003 GTK+ NetHack may be freely redistributed. See license for details. */ #include #include #include "winGTK.h" #ifdef SHORT_FILENAMES #include "patchlev.h" #else #include "patchlevel.h" #endif #ifdef WINGTK_RADAR static GtkWidget *radar_button; #endif static GtkWidget *font_selection_map; static GtkWidget *map_clip_spinbutton; static void GTK_pref_cancel(GtkWidget *w, gpointer data) { gtk_widget_destroy(GTK_WIDGET(data)); } static void GTK_pref_apply(GtkWidget *w, gpointer data) { int clip_dist; gchar *font_name; font_name = gtk_font_selection_get_font_name( GTK_FONT_SELECTION(font_selection_map)); nh_set_map_font(font_name); g_free(font_name); #ifdef WINGTK_RADAR nh_radar_set_use( gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radar_button))); #endif clip_dist = gtk_spin_button_get_value_as_int( GTK_SPIN_BUTTON(map_clip_spinbutton)); map_clip_dist2 = clip_dist * clip_dist; nh_map_check_visibility(); } int GTK_preferences_save(struct gtkhackrc *rc) { gchar *map_font = nh_get_map_font(); if (map_font) nh_gtkhackrc_store(rc, "map.font = \"%s\"", map_font); nh_gtkhackrc_store(rc, "radar = %d", nh_radar_get_use()); nh_gtkhackrc_store(rc, "map.clip_dist2 = %d", map_clip_dist2); } static void GTK_pref_ok(GtkWidget *w, gpointer data) { GTK_pref_apply(w,data); GTK_pref_cancel(w,data); } #ifdef WINGTK_RADAR static GtkWidget * GTK_pref_radar_new() { radar_button = gtk_check_button_new_with_label("Display radar window"); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radar_button), nh_radar_get_use()); return radar_button; } #endif static GtkWidget * GTK_pref_general_new() { GtkWidget *vbox; vbox = gtk_vbox_new(FALSE, 0); gtk_container_border_width(GTK_CONTAINER(vbox), NH_PAD); #ifdef WINGTK_RADAR nh_gtk_new_and_pack(GTK_pref_radar_new(), vbox, "", FALSE, FALSE, NH_PAD); #endif return vbox; } static GtkWidget * GTK_pref_font_new() { GtkWidget *frame; GtkWidget *vbox; gchar *font_name; frame = gtk_frame_new("Font"); vbox = nh_gtk_new_and_add(gtk_vbox_new(FALSE, 0), frame, ""); font_selection_map = nh_gtk_new_and_pack(gtk_font_selection_new(), vbox, "", FALSE, FALSE, NH_PAD); font_name = nh_get_map_font(); if (font_name) { (void)gtk_font_selection_set_font_name( GTK_FONT_SELECTION(font_selection_map), font_name); g_free(font_name); } return frame; } static GtkWidget * GTK_pref_map_new() { GtkWidget *frame; GtkWidget *vbox,*hbox; gchar *font_name; vbox = gtk_vbox_new(FALSE, 0); gtk_container_border_width(GTK_CONTAINER(vbox), NH_PAD); frame = nh_gtk_new_and_pack(gtk_frame_new("Automatic scrolling"), vbox, "", FALSE, FALSE, NH_PAD); hbox = nh_gtk_new_and_add(gtk_hbox_new(FALSE, 0), frame, ""); nh_gtk_new_and_pack(gtk_label_new("Maximum allowable deviation:"), hbox, "", FALSE, FALSE, NH_PAD); map_clip_spinbutton = nh_gtk_new_and_pack( gtk_spin_button_new_with_range(0.0, 255.0, 1.0), hbox, "", FALSE, FALSE, NH_PAD); gtk_spin_button_set_value(GTK_SPIN_BUTTON(map_clip_spinbutton), (gdouble)(int)(sqrt(map_clip_dist2) + 0.5)); nh_gtk_new_and_pack(GTK_pref_font_new(), vbox, "", FALSE, FALSE, NH_PAD); return vbox; } GtkWidget * GTK_preferences_new() { guint hid; GtkWidget *w; GtkWidget *note; GtkWidget *vbox, *hbox; GtkWidget *ok; GtkWidget *apply; GtkWidget *cancel; w = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(w), DEF_GAME_NAME " Preferences"); gtk_window_set_destroy_with_parent(GTK_WINDOW(w), TRUE); gtk_container_border_width(GTK_CONTAINER(w), NH_PAD); #if 0 hid = gtk_signal_connect(GTK_OBJECT(w), "destroy", GTK_SIGNAL_FUNC(default_destroy), &hid); #endif nh_position_popup_dialog(GTK_WIDGET(w)); vbox = nh_gtk_new_and_add(gtk_vbox_new(FALSE, 0), w, ""); note = nh_gtk_new_and_pack(gtk_notebook_new(), vbox, "", FALSE, FALSE, NH_PAD); nh_gtk_new_and_add(GTK_pref_general_new(), note, ""); nh_gtk_new_and_add(GTK_pref_map_new(), note, ""); gtk_notebook_set_tab_label_text(GTK_NOTEBOOK(note), gtk_notebook_get_nth_page(GTK_NOTEBOOK(note), 0), "General"); gtk_notebook_set_tab_label_text(GTK_NOTEBOOK(note), gtk_notebook_get_nth_page(GTK_NOTEBOOK(note), 1), "Map"); hbox = nh_gtk_new_and_pack(gtk_hbox_new(FALSE, 0), vbox, "", FALSE, FALSE, NH_PAD); ok = nh_gtk_new_and_pack(gtk_button_new_from_stock(GTK_STOCK_OK), hbox, "", FALSE, FALSE, NH_PAD); apply = nh_gtk_new_and_pack(gtk_button_new_from_stock(GTK_STOCK_APPLY), hbox, "", FALSE, FALSE, NH_PAD); cancel = nh_gtk_new_and_pack(gtk_button_new_from_stock(GTK_STOCK_CANCEL), hbox, "", FALSE, FALSE, NH_PAD); gtk_signal_connect(GTK_OBJECT(ok), "clicked", GTK_SIGNAL_FUNC(GTK_pref_ok), w); gtk_signal_connect(GTK_OBJECT(apply), "clicked", GTK_SIGNAL_FUNC(GTK_pref_apply), w); gtk_signal_connect(GTK_OBJECT(cancel), "clicked", GTK_SIGNAL_FUNC(GTK_pref_cancel), w); gtk_widget_show_all(w); return w; } slashem-0.0.7E7F3/win/gtk/gtkmessage.c0000664000076400007640000001175710545462317015547 0ustar aliali/* $Id: gtkmessage.c,v 1.10 2003/08/02 14:27:26 j_ali Exp $ */ /* GTK+ NetHack Copyright (c) Issei Numata 1999-2000 GTK+ NetHack Copyright (c) Slash'EM Development Team 2000-2003 GTK+ NetHack may be freely redistributed. See license for details. */ #include #include #include "winGTK.h" #include #include static GtkWidget *message_text; extern int root_width; extern int root_height; #if GTK_CHECK_VERSION(2,0,0) # define USE_TEXTVIEW #else /* GTK_CHECK_VERSION */ # ifdef WIN32 /* ALI: Switching this on avoids strange scrolling effects (see bug 124233). */ # define FROZEN_INSERT # endif #endif /* GTK_CHECK_VERSION */ #ifdef USE_TEXTVIEW GtkWidget * nh_message_new() { GtkWidget *message_h; GtkWidget *sw; GtkTextIter iter; GtkTextBuffer *t; message_h = gtk_handle_box_new(); GTK_HANDLE_BOX(message_h)->shrink_on_detach = 1; message_text = gtk_text_view_new(); gtk_widget_show(message_text); GTK_WIDGET_UNSET_FLAGS(message_text, GTK_CAN_FOCUS); gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(message_text), GTK_WRAP_WORD); t = gtk_text_view_get_buffer(GTK_TEXT_VIEW(message_text)); gtk_text_buffer_create_tag(t, "warning", "foreground", "red", NULL); gtk_text_buffer_get_end_iter(t, &iter); gtk_text_buffer_create_mark(t, "nh_end", &iter, FALSE); sw = nh_gtk_new_and_add(gtk_scrolled_window_new(NULL, NULL), message_h, ""); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_container_add(GTK_CONTAINER(sw), message_text); return message_h; } void nh_message_putstr(const char *str) { int len; char *buf; GtkTextIter iter, iter2; GtkTextBuffer *t; if (!message_text) return; t = gtk_text_view_get_buffer(GTK_TEXT_VIEW(message_text)); gtk_text_buffer_get_end_iter(t, &iter); len = strlen(str); buf = (char *)alloc(len + 2); sprintf(buf, "\n%s", str); if (nh_status_in_trouble()) gtk_text_buffer_insert_with_tags_by_name(t, &iter, buf, len + 1, "warning", NULL); else gtk_text_buffer_insert(t, &iter, buf, len + 1); free(buf); len = gtk_text_buffer_get_char_count(t); if (len > NH_TEXT_REMEMBER) { gtk_text_buffer_get_iter_at_offset(t, &iter, len - NH_TEXT_REMEMBER); gtk_text_buffer_get_iter_at_line(t, &iter2, gtk_text_iter_get_line(&iter) + 1); gtk_text_buffer_get_start_iter(t, &iter); gtk_text_buffer_delete(t, &iter, &iter2); } gtk_text_view_scroll_mark_onscreen(GTK_TEXT_VIEW(message_text), gtk_text_buffer_get_mark(t, "nh_end")); } #else /* USE_TEXTVIEW */ GtkWidget * nh_message_new() { GtkWidget *message_h; GtkWidget *message_hbox; message_h = gtk_handle_box_new(); GTK_HANDLE_BOX(message_h)->shrink_on_detach = 1; message_hbox = nh_gtk_new_and_add(gtk_hbox_new(FALSE, 0), message_h, ""); message_text = nh_gtk_new_and_pack(gtk_text_new(NULL, NULL), message_hbox, "", TRUE, TRUE, NH_PAD); GTK_WIDGET_UNSET_FLAGS(message_text, GTK_CAN_FOCUS); gtk_text_set_word_wrap((GtkText *) message_text, TRUE); (void)nh_gtk_new_and_pack(gtk_vscrollbar_new(GTK_TEXT(message_text)->vadj), message_hbox, "", FALSE, FALSE, NH_PAD); return message_h; } void nh_message_putstr(const char *str) { int i; int len; char *buf; GtkText *t; #ifdef FROZEN_INSERT static int freeze_count=0; #endif if (!message_text) return; t = GTK_TEXT(message_text); len = strlen(str); buf = (char *)alloc(len + 2); sprintf(buf, "\n%s", str); #ifdef FROZEN_INSERT /* ALI: gimpwin 20001226 looks very bad if you update a text widget without * freezing it (the text is displayed half-scrolled, with lines overlapping * each other). This is not ideal (the text is redrawn each thaw), but it * is an improvement. Due to a bug in gimpwin we can't trim text if we've * frozen the widget, thus every so often we don't freeze but trim instead. */ if (++freeze_count >= 50) /* Trim text every 50 inserts */ freeze_count = 0; else gtk_text_freeze(t); #endif if (nh_status_in_trouble()) i = CLR_RED; else i = MAP_BLACK; gtk_text_insert(t, NULL, &nh_color[i], &nh_color[MAP_WHITE], buf, len + 1); len = gtk_text_get_length(t); #ifdef FROZEN_INSERT if (!freeze_count && len > NH_TEXT_REMEMBER) { #else if (len > NH_TEXT_REMEMBER) { #endif gtk_text_freeze(t); for(i = 0; i < len && len > NH_TEXT_REMEMBER; i++) if (GTK_TEXT_INDEX(t, i) == '\n') { i++; gtk_text_set_point(t, i); gtk_text_backward_delete(t, i); len -= i; } gtk_text_set_point(t, len); gtk_text_thaw(t); } #ifdef FROZEN_INSERT /* ALI: t->vadj->upper would be more correct, but causes gimpwin to crash */ if (freeze_count) { gtk_adjustment_set_value(t->vadj, t->vadj->upper - 1); gtk_text_thaw(t); } #endif free(buf); } #endif /* USE_TEXTVIEW */ int GTK_doprev_message() { return 0; } void nh_message_destroy(void) { message_text = NULL; } slashem-0.0.7E7F3/win/gtk/gtktile.c0000664000076400007640000011041610545462317015050 0ustar aliali/* $Id: gtktile.c,v 1.6.2.1 2005/07/16 07:54:11 j_ali Exp $ */ /* GTK+ NetHack Copyright (c) Issei Numata 1999-2000 Copyright (c) Slash'EM Development Team 2000-2003 GTK+ NetHack may be freely redistributed. See license for details. */ #include #include #include "winGTK.h" #include "dlb.h" #include "proxycb.h" #include "prxyclnt.h" #include "gtkprogress.h" /* #define DEBUG */ int stone_tile = 0; /* The current tile for stone */ #ifdef GTK_PROXY short *GTK_glyph2tile = (short *)0; int total_tiles_used; int tiles_per_row; int tiles_per_col; #else extern short glyph2tile[]; /* from tile.c */ extern int total_tiles_used; extern int tiles_per_row; extern int tiles_per_col; #endif extern GtkWidget *main_window; /* The transparancy data for one tile: * * +-------------+ ^ * | | | oy * | | V * | ** | ^ * | /__\ | | ny * | * * | V * | | * | | * +-------------+ * <---><--> * ox nx * * Each pixel inside the nx x ny pixel rectangle has stored within the * transparancy data whether it is transparent or opaque. This data is * run length encoded on a line-by-line basis (the encoding always breaks * at the end of a line). Each length is stored in pixels as one byte. * Each line begins with the length of transparent pixels. */ static struct tile_transp { unsigned char ox; /* The number of transparent cols at left of tile */ unsigned char oy; /* The number of transparent lines at top of tile */ unsigned char nx; /* The number of non-transparent cols in tile */ unsigned char ny; /* The number of non-transparent lines in tile */ unsigned char *data; /* RLE transparency data */ } *tile_transp; static TileTab *Tile; static GdkPixmap *tile_pixmap; static GdkImage *tile_image; static GdkImage *tmp_img; static GdkPixbuf *tile_pixbuf; static GdkPixbuf *tmp_pixbuf; static unsigned int tile_bits_per_pixel; /* * Note that while tmp_img always exists, tmp_pixbuf is set to NULL to * represent a cleared tmp image. This saves creating a blank pixbuf * and then compositing the first tile onto it. */ void x_tile_tmp_clear() { g_return_if_fail(tile_image != NULL || tile_pixbuf != NULL); if (tile_image && tmp_img) memset(tmp_img->mem, 0, tmp_img->bpl * tmp_img->height); else if (tmp_pixbuf) { gdk_pixbuf_unref(tmp_pixbuf); tmp_pixbuf = NULL; } } /* * This macro returns the address of a specified pixel. */ #define PIXBUF_PIXEL(x, y) (pixels + (y) * rowstride + (x) * n_channels) /* * Test whether a pixel is opaque. Note we only compare RGB. * If an alpha channel is present it will be ignored. */ #define PIXEL_OPAQUE(x, y) memcmp(PIXBUF_PIXEL(x, y), nul_pixel, 3) static void calc_tile_transp(TileTab *t, GdkPixbuf *pixbuf, int i) { int x, y, sx, sy; int j, k, n; static unsigned char *rle_buf = NULL; static guchar *nul_pixel, *pixels; static int rowstride; static int n_channels; static int n_bytes; if (i < 0) { /* Clean up */ #ifdef DEBUG fprintf(stderr, "%d bytes used for transparency data\n", n_bytes); #endif free(rle_buf); rle_buf = NULL; return; } if (!rle_buf) { /* Init */ n_bytes = 0; pixels = gdk_pixbuf_get_pixels(pixbuf); rowstride = gdk_pixbuf_get_rowstride(pixbuf); n_channels = gdk_pixbuf_get_n_channels(pixbuf); nul_pixel = PIXBUF_PIXEL(0, 0); rle_buf = (unsigned char *) alloc(t->unit_width * t->unit_height); /* This makes the RLE slightly easier at very little cost */ if (t->unit_width > 255) panic("gtktile: Unit width too large (%d)", t->unit_width); } sx = (i % tiles_per_row) * Tile->unit_width; sy = (i / tiles_per_row) * Tile->unit_height; for(y = 0; y < t->unit_height; y++) { for(x = 0; x < t->unit_width; x++) if (PIXEL_OPAQUE(sx + x, sy + y)) break; if (x < t->unit_width) break; } tile_transp[i].oy = y; for(y = t->unit_height - 1; y > tile_transp[i].oy; y--) { for(x = 0; x < t->unit_width; x++) if (PIXEL_OPAQUE(sx + x, sy + y)) break; if (x < t->unit_width) break; } tile_transp[i].ny = y - tile_transp[i].oy; if (!tile_transp[i].ny) { tile_transp[i].oy = 0; tile_transp[i].ox = 0; tile_transp[i].nx = 0; tile_transp[i].data = NULL; return; } for(x = 0; x < t->unit_width; x++) { for(y = tile_transp[i].oy; y < tile_transp[i].oy+tile_transp[i].ny; y++) if (PIXEL_OPAQUE(sx + x, sy + y)) break; if (y < tile_transp[i].oy + tile_transp[i].ny) break; } tile_transp[i].ox = x; for(x = t->unit_width - 1; x > tile_transp[i].ox; x--) { for(y = tile_transp[i].oy; y < tile_transp[i].oy+tile_transp[i].ny; y++) if (PIXEL_OPAQUE(sx + x, sy + y)) break; if (y < tile_transp[i].oy + tile_transp[i].ny) break; } tile_transp[i].nx = x - tile_transp[i].ox; j = 0; for(y = tile_transp[i].oy; y < tile_transp[i].oy + tile_transp[i].ny; y++) { k = n = 0; for(x = tile_transp[i].ox; x < tile_transp[i].ox + tile_transp[i].nx; x++) { if (k & 1) if (PIXEL_OPAQUE(sx + x, sy + y)) n++; else { rle_buf[j + k++] = n; n = 1; } else if (PIXEL_OPAQUE(sx + x, sy + y)) { rle_buf[j + k++] = n; n = 1; } else n++; } if (n) rle_buf[j + k++] = n; j += k; } tile_transp[i].data = (unsigned char *) alloc(j); memcpy(tile_transp[i].data, rle_buf, j); n_bytes += sizeof(*tile_transp) + j; } static int x_tile_load(TileTab *t, NhGtkProgressWindow *w) { int fh, nb; long len, done = 0; char buf[1024]; GdkPixbufLoader *loader; GError *err = NULL; Tile = t; tile_pixbuf = NULL; fh = nh_dlbh_fopen("tileset", t->file, "rb"); if (fh < 0) { pline("Cannot open tile file %s!", t->file); return 0; } loader = gdk_pixbuf_loader_new(); if (!nh_dlbh_fseek(fh, 0, SEEK_END)) { len = nh_dlbh_ftell(fh); nh_dlbh_fseek(fh, 0, SEEK_SET); } else len = -1; while (nb = nh_dlbh_fread(buf, 1, sizeof(buf), fh), nb > 0) { if (!gdk_pixbuf_loader_write(loader, buf, nb, &err)) { pline("Error loading %s: %s", t->file, err->message); g_error_free(err); err = NULL; break; } done += nb; if (len < 0) nh_gtk_progress_window_stage_pulse(w); else nh_gtk_progress_window_stage_set_fraction(w, (done * 0.9) / len); } if (nb < 0) { pline("Read error from tile file %s!", t->file); (void)gdk_pixbuf_loader_close(loader, NULL); } else if (!nb) { if (!gdk_pixbuf_loader_close(loader, &err)) { pline("Error loading %s: %s", t->file, err->message); g_error_free(err); err = NULL; } else { if (len < 0) nh_gtk_progress_window_stage_pulse(w); else nh_gtk_progress_window_stage_set_fraction(w, 1.0); tile_pixbuf = gdk_pixbuf_loader_get_pixbuf(loader); if (!tile_pixbuf) pline("No image found in tile file %s!", t->file); else g_object_ref(tile_pixbuf); } } else (void)gdk_pixbuf_loader_close(loader, NULL); nh_dlbh_fclose(fh); g_object_unref(loader); if (!tile_pixbuf) return 0; t->tilemap_width = gdk_pixbuf_get_width(tile_pixbuf); t->tilemap_height = gdk_pixbuf_get_height(tile_pixbuf); t->unit_width = t->tilemap_width / tiles_per_row; t->unit_height = t->tilemap_height / tiles_per_col; if (t->spread) { t->ofsetx_3d = t->unit_width / 3; t->ofsety_3d = t->unit_height / 2; } else { t->ofsetx_3d = 0; t->ofsety_3d = 0; } return 1; } #ifdef GTK_PROXY static struct proxy_tilemap * x_tile_load_tilemap(TileTab *t, NhGtkProgressWindow *w) { int fh, len, step; char *buf; struct proxy_tilemap *map; fh = nh_dlbh_fopen("tilemap", t->mapfile, "rb"); if (fh < 0) { pline("Cannot open tile map file %s!", t->mapfile); return NULL; } if (!nh_dlbh_fseek(fh, 0, SEEK_END)) { len = nh_dlbh_ftell(fh); nh_dlbh_fseek(fh, 0, SEEK_SET); } else len = -1; buf = g_malloc(1024); map = proxy_new_tilemap(); step = 50; /* Update progress window every 50 lines */ while(nh_dlbh_fgets(buf, 1024, fh)) { if (!--step) { step = 50; if (len < 0) nh_gtk_progress_window_stage_pulse(w); else nh_gtk_progress_window_stage_set_fraction(w, nh_dlbh_ftell(fh) / (double)len); } proxy_load_tilemap_line(map, buf); } g_free(buf); nh_dlbh_fclose(fh); return map; } /* From tilemap.c */ static int ceil_sqrt(int c) { int a=c/36,la; /* Approximation and last approximation */ /* Compute floor(sqrt(c)) */ do { la=a; a=(a*a+c)/(2*a); } while (a!=la); /* Adjust for ceil(sqrt(c)) */ return a*a==c?a:a+1; } static void x_tile_generate_map_add_stages(NhGtkProgressWindow *w) { nh_gtk_progress_window_add_stage(w, "Transferring glyph descriptions"); nh_gtk_progress_window_add_stage(w, "Transferring tileset descriptions"); nh_gtk_progress_window_add_stage(w, "Assigning tiles to glyphs"); } struct _x_tile_generate_map_pulse { unsigned int count, step, length; NhGtkProgressWindow *w; }; static void x_tile_generate_map_pulse(struct _x_tile_generate_map_pulse *p) { p->count++; if (p->count % p->step == 0) nh_gtk_progress_window_stage_set_fraction(p->w, p->count/(gdouble)p->length); } struct proxycb_get_glyph_mapping_res * nh_proxy_cache_get_glyph_mapping(GtkWidget *w) { int retval; char *file; NhExtIO *io; NhExtXdr xdr; struct proxycb_get_glyph_mapping_res *glyph_map = NULL; if (w) nh_gtk_progress_window_stage_pulse(NH_GTK_PROGRESS_WINDOW(w)); file = nh_proxy_game_cache_file("glyph_mapping.xdr"); io = GTK_io_open(file, NHEXT_IO_RDONLY); if (io) { nhext_xdrio_create(&xdr, io, NHEXT_XDR_DECODE); glyph_map = (void *)calloc(1, sizeof(*glyph_map)); retval = !proxycb_xdr_get_glyph_mapping_res(&xdr, glyph_map); nhext_xdr_destroy(&xdr); GTK_io_close(io); if (retval) { nhext_xdr_free(proxycb_xdr_get_glyph_mapping_res, (char *)glyph_map); free(glyph_map); if (w) nh_gtk_progress_window_stage_pulse(NH_GTK_PROGRESS_WINDOW(w)); } } if (!glyph_map) { glyph_map = proxy_cb_get_glyph_mapping(); if (!glyph_map) { free(file); return NULL; } if (w) nh_gtk_progress_window_stage_pulse(NH_GTK_PROGRESS_WINDOW(w)); io = GTK_io_open(file, NHEXT_IO_WRONLY); if (io) { nhext_xdrio_create(&xdr, io, NHEXT_XDR_ENCODE); retval = !proxycb_xdr_get_glyph_mapping_res(&xdr, glyph_map); retval |= nhext_io_flush(io); nhext_xdr_destroy(&xdr); GTK_io_close(io); if (retval) remove(file); } } free(file); return glyph_map; } static int x_tile_generate_map(TileTab *t, NhGtkProgressWindow *w) { struct proxycb_get_glyph_mapping_res *glyph_map; struct proxy_tilemap *tile_map; struct _x_tile_generate_map_pulse *pulse; glyph_map = nh_proxy_cache_get_glyph_mapping(GTK_WIDGET(w)); if (!glyph_map) { pline("Cannot get glyph mapping."); return 0; } no_glyph = glyph_map->no_glyph; nh_gtk_progress_window_complete_stage(w); tile_map = x_tile_load_tilemap(t, w); if (!tile_map) { proxy_cb_free_glyph_mapping(glyph_map); return 0; } nh_gtk_progress_window_complete_stage(w); total_tiles_used = tile_map->no_tiles; tiles_per_row = ceil_sqrt(total_tiles_used); tiles_per_col = (total_tiles_used + tiles_per_row - 1) / tiles_per_row; pulse = g_new(struct _x_tile_generate_map_pulse, 1); pulse->count = 0; pulse->length = proxy_glyph_map_get_length(glyph_map); pulse->step = pulse->length >= 100 ? pulse->length / 100 : 1; pulse->w = w; GTK_glyph2tile = proxy_map_glyph2tile(glyph_map, tile_map, x_tile_generate_map_pulse, pulse); g_free(pulse); proxy_cb_free_glyph_mapping(glyph_map); proxy_free_tilemap(tile_map); nh_gtk_progress_window_complete_stage(w); return 1; } struct { char *file; NhExtIO *io; } x_tile_loadmap; static void x_tile_load_map_add_stages(TileTab *t, NhGtkProgressWindow *w) { char *md5sum; gchar *name; md5sum = nh_proxy_cache_dlbh_fmd5sum(t->mapfile); name = g_strdup_printf("glyph2tile-%s.xdr", md5sum); x_tile_loadmap.file = nh_proxy_game_cache_file(name); x_tile_loadmap.io = GTK_io_open(x_tile_loadmap.file, NHEXT_IO_RDONLY); if (!x_tile_loadmap.io) x_tile_generate_map_add_stages(w); else nh_gtk_progress_window_add_stage(w, "Transferring tileset mapping"); g_free(name); free(md5sum); } static int x_tile_load_map(TileTab *t, NhGtkProgressWindow *w) { int retval, rv; NhExtXdr xdr; NhExtIO *io; if (x_tile_loadmap.io) { nhext_xdrio_create(&xdr, x_tile_loadmap.io, NHEXT_XDR_DECODE); retval = nhext_xdr_int(&xdr, &total_tiles_used); tiles_per_row = ceil_sqrt(total_tiles_used); tiles_per_col = (total_tiles_used + tiles_per_row - 1) / tiles_per_row; retval &= nhext_xdr_array(&xdr, (char **)>K_glyph2tile, &no_glyph, (unsigned int)-1, sizeof(short), nhext_xdr_short); nhext_xdr_destroy(&xdr); GTK_io_close(x_tile_loadmap.io); if (!retval) { free(GTK_glyph2tile); GTK_glyph2tile = NULL; } else nh_gtk_progress_window_complete_stage(w); } if (!GTK_glyph2tile) { retval = x_tile_generate_map(t, w); if (retval) { io = GTK_io_open(x_tile_loadmap.file, NHEXT_IO_WRONLY); if (io) { nhext_xdrio_create(&xdr, io, NHEXT_XDR_ENCODE); rv = nhext_xdr_int(&xdr, &total_tiles_used); rv &= nhext_xdr_array(&xdr, (char **)>K_glyph2tile, &no_glyph, (unsigned int)-1, sizeof(short), nhext_xdr_short); nhext_xdr_destroy(&xdr); GTK_io_close(io); if (!rv) remove(x_tile_loadmap.file); } } } free(x_tile_loadmap.file); return retval; } #endif static enum xshm_map_mode x_tile_set_map_mode(TileTab *t, NhGtkProgressWindow *w) { int i; enum xshm_map_mode mode; GdkPixbuf *copy; guchar *pixels; GdkGC *gc; if (!t->spread && !t->transparent) mode = XSHM_MAP_PIXMAP; else mode = getenv("HACKPIXBUF") ? XSHM_MAP_PIXBUF : XSHM_MAP_IMAGE; /* * Pixbufs use so much memory that it's not unexpected for us to * fail to generate the alpha channel correctly. This is not a * great problem since we carefully avoid using it ourselves * (preferring to use the transparent colour directly), but might * cause gdk_pixbuf_render_to_drawable() to get slightly confused * when it dithers the tile (the transparent colour may bleed into * the glyph). We therefore issue a warning. * * Note: It's not clear that gdk_pixbuf_render_to_drawable() * actually uses this information, but what more can we do? * There's little point using gdk_pixbuf_render_to_drawable_alpha() * since all that does is take care not to draw transparent pixels * (which we don't care about anyway; we'll never read them). */ if (mode == XSHM_MAP_PIXBUF && gdk_pixbuf_get_has_alpha(tile_pixbuf)) { /* We can't trust the XPM alpha channel & it will * overide if we don't get rid of it here */ copy = gdk_pixbuf_new(gdk_pixbuf_get_colorspace(tile_pixbuf), FALSE, gdk_pixbuf_get_bits_per_sample(tile_pixbuf), t->tilemap_width, t->tilemap_height); nh_gtk_progress_window_stage_set_fraction(w, 0.25); if (copy) { gdk_pixbuf_copy_area(tile_pixbuf, 0, 0, t->tilemap_width, t->tilemap_height, copy, 0, 0); gdk_pixbuf_unref(tile_pixbuf); tile_pixbuf = copy; nh_gtk_progress_window_stage_set_fraction(w, 0.5); } else { pline("Warning: Not enough memory: Tiles may be degraded"); mode = XSHM_MAP_IMAGE; nh_gtk_progress_window_stage_set_fraction(w, 0.0); } } if (mode == XSHM_MAP_PIXBUF && !gdk_pixbuf_get_has_alpha(tile_pixbuf)) { pixels = gdk_pixbuf_get_pixels(tile_pixbuf); nh_gtk_progress_window_stage_set_fraction(w, 0.75); copy = gdk_pixbuf_add_alpha(tile_pixbuf, TRUE, pixels[0], pixels[1], pixels[2]); if (copy) { gdk_pixbuf_unref(tile_pixbuf); tile_pixbuf = copy; } else { pline("Warning: Not enough memory: Tiles may be degraded"); mode = XSHM_MAP_IMAGE; nh_gtk_progress_window_stage_set_fraction(w, 0.0); } } tmp_pixbuf = NULL; if (mode != XSHM_MAP_PIXBUF) { tile_pixmap = gdk_pixmap_new(main_window->window, t->tilemap_width, t->tilemap_height, -1); if (!tile_pixmap) panic("Not enough memory to load tiles!"); nh_gtk_progress_window_stage_set_fraction(w, mode == XSHM_MAP_IMAGE ? 0.025 : 0.3); gc = gdk_gc_new(tile_pixmap); gdk_pixbuf_render_to_drawable(tile_pixbuf, tile_pixmap, gc, 0, 0, 0, 0, t->tilemap_width, t->tilemap_height, GDK_RGB_DITHER_NORMAL, 0, 0); gdk_gc_unref(gc); if (mode == XSHM_MAP_IMAGE) { int step = total_tiles_used >= 100 ? total_tiles_used / 100 : 1; nh_gtk_progress_window_stage_set_fraction(w, 0.1); tile_transp = (struct tile_transp *) alloc(total_tiles_used * sizeof(*tile_transp)); for(i = 0; i < total_tiles_used; i++) { calc_tile_transp(t, tile_pixbuf, i); if (i % step == 0) nh_gtk_progress_window_stage_set_fraction(w, 0.1 + (i * 0.8) / total_tiles_used); } calc_tile_transp(t, tile_pixbuf, -1); nh_gtk_progress_window_stage_set_fraction(w, 0.9); /* TODO: Creating an image via a pixmap is very inefficient; * this should be done directly from pixbuf, even if GTK+ doesn't * provide any easy way to do this. */ tile_image = gdk_image_get((GdkWindow *)tile_pixmap, 0, 0, t->tilemap_width, t->tilemap_height); if (!tile_image) panic("Not enough memory to load tiles!"); gdk_pixmap_unref(tile_pixmap); tile_pixmap = NULL; nh_gtk_progress_window_stage_set_fraction(w, 0.975); tmp_img = gdk_image_new(GDK_IMAGE_NORMAL, gdk_visual_get_system(), t->unit_width, t->unit_height); if (!tmp_img) panic("Not enough memory to load tiles!"); #if GTK_CHECK_VERSION(1,3,3) tile_bits_per_pixel = tile_image->bits_per_pixel; #else /* * Technically, this could give an incorrect result. However, as * long as the bitmap_pad is no more than 32 bits (max. X11 allows); * the bytes/line is not larger than necessary; and the width is * at least 32 pixels, then it will be correct. */ tile_bits_per_pixel = tile_image->bpl * 8 / t->tilemap_width; #endif } else tmp_img = tile_image = NULL; gdk_pixbuf_unref(tile_pixbuf); tile_pixbuf = NULL; } nh_gtk_progress_window_stage_set_fraction(w, 1.0); return mode; } void x_tile_init_add_stages(TileTab *t, NhGtkProgressWindow *w) { #ifdef GTK_PROXY x_tile_load_map_add_stages(t, w); nh_gtk_progress_window_add_stage(w, "Transferring tileset images"); #else nh_gtk_progress_window_add_stage(w, "Loading tileset images"); #endif nh_gtk_progress_window_add_stage(w, "Converting images"); } enum xshm_map_mode x_tile_init(TileTab *t, NhGtkProgressWindow *w) { int retval; int glyph = cmap_to_glyph(S_stone); #ifdef GTK_PROXY if (!x_tile_load_map(t, w)) return XSHM_MAP_NONE; #endif if (!x_tile_load(t, w)) return XSHM_MAP_NONE; nh_gtk_progress_window_complete_stage(w); #ifdef GTK_PROXY stone_tile = GTK_glyph2tile[glyph]; #else stone_tile = glyph2tile[glyph]; #endif retval = x_tile_set_map_mode(t, w); nh_gtk_progress_window_complete_stage(w); return retval; } void x_tile_destroy() { int i; if (tmp_img) { gdk_image_destroy(tmp_img); tmp_img = NULL; } if (tile_pixmap) { gdk_pixmap_unref(tile_pixmap); tile_pixmap = NULL; } if (tmp_pixbuf) { gdk_pixbuf_unref(tmp_pixbuf); tmp_pixbuf = NULL; } if (tile_pixbuf) { gdk_pixbuf_unref(tile_pixbuf); tile_pixbuf = NULL; } if (tile_transp) { for(i = 0; i < total_tiles_used; i++) free(tile_transp[i].data); free(tile_transp); tile_transp = NULL; } if (tile_image) { gdk_image_destroy(tile_image); tile_image = NULL; } #ifdef GTK_PROXY free(GTK_glyph2tile); GTK_glyph2tile = (short *)0; #endif } #define nh_pixbuf_get_pixel(x, y, pixel) \ memcpy(pixel, PIXBUF_PIXEL(x, y), n_channels) #define nh_pixbuf_put_pixel(x, y, pixel) \ memcpy(PIXBUF_PIXEL(x, y), pixel, n_channels) #undef red #undef green #undef blue void x_tile_tmp_draw_rectangle(int ofsx, int ofsy, int nhc) { int i; int width; int height; guint32 c; guchar rgba[4]; guchar *pixels; int rowstride; int n_channels; g_return_if_fail(tmp_img != NULL || tmp_pixbuf != NULL); width = Tile->unit_width; height = Tile->unit_height; if (tmp_img) { c = nh_color[nhc].pixel; if (ofsy >= 0 && ofsy < height) for(i = 0; i < width; i++) if (ofsx + i >= 0 && ofsx + i < width) gdk_image_put_pixel(tmp_img, ofsx + i, ofsy, c); if (ofsy + height - 1 >= 0 && ofsy + height - 1 < height) for(i = 0; i < width; i++) if (ofsx + i >= 0 && ofsx + i < width) gdk_image_put_pixel(tmp_img, ofsx + i, ofsy + height -1, c); if (ofsx >= 0 && ofsx < width) for(i = 0; i < height; i++) if (ofsy + i >= 0 && ofsy + i < height) gdk_image_put_pixel(tmp_img, ofsx, ofsy + i, c); if (ofsx + width - 1 >= 0 && ofsx + width - 1 < width) for(i = 0; i < height; i++) if (ofsy + i >= 0 && ofsy + i < height) gdk_image_put_pixel(tmp_img, ofsx + width - 1, ofsy + i, c); } else { g_return_if_fail(gdk_pixbuf_get_bits_per_sample(tmp_pixbuf) == 8 && gdk_pixbuf_get_colorspace(tmp_pixbuf) == GDK_COLORSPACE_RGB); pixels = gdk_pixbuf_get_pixels(tmp_pixbuf); rowstride = gdk_pixbuf_get_rowstride(tmp_pixbuf); n_channels = gdk_pixbuf_get_n_channels(tmp_pixbuf); rgba[0] = nh_color[nhc].red / 257; rgba[1] = nh_color[nhc].green / 257; rgba[2] = nh_color[nhc].blue / 257; rgba[3] = 255; if (ofsy >= 0 && ofsy < height) for(i = 0; i < width; i++) if (ofsx + i >= 0 && ofsx + i < width) nh_pixbuf_put_pixel(ofsx + i, ofsy, rgba); if (ofsy + height - 1 >= 0 && ofsy + height - 1 < height) for(i = 0; i < width; i++) if (ofsx + i >= 0 && ofsx + i < width) nh_pixbuf_put_pixel(ofsx + i, ofsy + height -1, rgba); if (ofsx >= 0 && ofsx < width) for(i = 0; i < height; i++) if (ofsy + i >= 0 && ofsy + i < height) nh_pixbuf_put_pixel(ofsx, ofsy + i, rgba); if (ofsx + width - 1 >= 0 && ofsx + width - 1 < width) for(i = 0; i < height; i++) if (ofsy + i >= 0 && ofsy + i < height) nh_pixbuf_put_pixel(ofsx + width - 1, ofsy + i, rgba); } } /* * Render the rectangle at (sx, sy) size (width, height) in the raster * for tile to the drawable. The rectangle is clipped to the tile boundaries. */ int x_tile_render_to_drawable(GdkDrawable *drawable, GdkGC *gc, int tile, int sx, int sy, int dest_x, int dest_y, int width, int height) { int srcx, srcy; srcx = (tile % tiles_per_row) * Tile->unit_width; srcy = (tile / tiles_per_row) * Tile->unit_height; if (sx < 0) { dest_x -= sx; width += sx; sx = 0; } if (sy < 0) { dest_y -= sy; height += sy; sy = 0; } if (sx + width > Tile->unit_width) width = Tile->unit_width - sx; if (sy + height > Tile->unit_height) height = Tile->unit_height - sy; if (tile_image) gdk_draw_image(drawable, gc, tile_image, srcx + sx, srcy + sy, dest_x, dest_y, width, height); else if (tile_pixbuf) gdk_pixbuf_render_to_drawable(tile_pixbuf, drawable, gc, srcx + sx, srcy + sy, dest_x, dest_y, width, height, GDK_RGB_DITHER_NORMAL, 0, 0); else gdk_draw_drawable(drawable, gc, tile_pixmap, srcx + sx, srcy + sy, dest_x, dest_y, width, height); return 1; } /* * This version of the function works when transparency is switched on * and each pixel is stored in an integer number of bytes. */ static void x_img_tmp_draw_tile_transp_byte(int tile, int ofsx, int ofsy) { int i, j, n; int width, height; int srcx, srcy; struct tile_transp *t = &tile_transp[tile]; unsigned char *rle = t->data; unsigned int bpp = tile_image->bpp; unsigned char *src, *dst; unsigned int nx = t->nx, ny = t->ny; #ifdef DEBUG if (tmp_img->bpp != bpp) impossible("Temp. image in different format"); #endif width = tmp_img->width; height = tmp_img->height; #ifdef DEBUG if (Tile->unit_width != width || Tile->unit_height != height) impossible("Temp. image not unit size"); #endif srcx = (tile % tiles_per_row) * width; srcy = (tile / tiles_per_row) * height; src = tile_image->mem + (srcy + t->oy) * tile_image->bpl + (srcx + t->ox) * bpp; dst = tmp_img->mem + (ofsy + t->oy) * tmp_img->bpl + (ofsx + t->ox) * bpp; if (ofsx < 0) { if (ofsx + t->ox + t->nx <= 0) return; /* Nothing to draw */ ofsx += t->ox; /* Ignore those already skipped */ if (ofsx < 0) ofsx = -ofsx; /* Remember how many pixels to skip */ else ofsx = 0; } else if (ofsx > 0) { /* Correct dst pointer & adjust nx */ unsigned int nxp; /* <---- ox ----><---- nx ----><---- ----> * <----------------- width -------------> * <------ nx' ----><-ofsx-> */ if (t->ox + ofsx >= width) return; /* Nothing to draw */ nxp = width - t->ox - ofsx; if (nxp < nx) nx = nxp; ofsx = 0; } if (ofsy < 0) { if (ofsy + t->oy + t->ny <= 0) return; /* Nothing to draw */ ofsy += t->oy; /* Ignore those already skipped */ if (ofsy < 0) { src -= ofsy * tile_image->bpl; dst -= ofsy * tmp_img->bpl; ny += ofsy; while(ofsy++ < 0) /* Skip transp data */ for(n = 0; n < t->nx; ) n += *rle++; } } else if (ofsy > 0) { /* Correct dst pointer & adjust ny */ unsigned int nyp; if (t->oy + ofsy >= height) return; /* Nothing to draw */ nyp = height - t->oy - ofsy; if (nyp < ny) ny = nyp; } for(j = 0; j < ny; j++) { i = *rle++; while (i < ofsx) { /* Skip ofsx pixels */ /* <---------------- nx ------------------> * <- t1 ->...<- tn -><- on -><- tn+1 ->... * <------- i -------> * <------ ofsx ------><- n -> */ n = *rle - ofsx + i; if (n > 0) memcpy(dst + ofsx * bpp, src + ofsx * bpp, n * bpp); i += *rle++; /* Opaque */ if (i < nx) i += *rle++; /* Transparent */ } for(; i < nx; ) { n = *rle; if (n > nx - i) n = nx - i; memcpy(dst + i * bpp, src + i * bpp, n * bpp); i += *rle++; if (i < nx) i += *rle++; } for(; i < t->nx; ) /* Skip any remaining transparency data */ i += *rle++; #ifdef DEBUG if (i != t->nx) impossible("Transparency data misalign"); #endif src += tile_image->bpl; dst += tmp_img->bpl; } } /* * This version of the function works whenever transparency is switched on. */ static void x_img_tmp_draw_tile_transp(int tile, int ofsx, int ofsy) { int i, j, n; guint32 pixel; int width, height; int srcx, srcy; struct tile_transp *t = &tile_transp[tile]; unsigned char *rle = t->data; width = tmp_img->width; height = tmp_img->height; srcx = (tile % tiles_per_row) * Tile->unit_width; srcy = (tile / tiles_per_row) * Tile->unit_height; for(j = t->oy; j < t->oy + t->ny; j++) { for(i = t->ox + *rle++; i < t->ox + t->nx; ) { for(n = *rle++; n; i++, n--) { if (ofsx + i >= 0 && ofsx + i < width && ofsy + j >= 0 && ofsy + j < height) { pixel = gdk_image_get_pixel(tile_image, srcx + i, srcy + j); gdk_image_put_pixel(tmp_img, ofsx + i, ofsy + j, pixel); } } if (i < t->ox + t->nx) i += *rle++; } #ifdef DEBUG if (i != t->ox + t->nx) impossible("Transparency data misalign"); #endif } } /* * This version of the function works when transparency is switched off. * It isn't used in practice, but is included for completeness. */ static void x_img_tmp_draw_tile_opaque(int tile, int ofsx, int ofsy) { int i, j; guint32 pixel; int width, height; int srcx, srcy; width = tmp_img->width; height = tmp_img->height; srcx = (tile % tiles_per_row) * Tile->unit_width; srcy = (tile / tiles_per_row) * Tile->unit_height; if (ofsx < 0) { srcx -= ofsx; width += ofsx; ofsx = 0; } if (ofsy < 0) { srcy -= ofsy; height += ofsy; ofsy = 0; } if (ofsx > 0) width -= ofsx; if (ofsy > 0) height -= ofsy; for(j = 0; j < height; j++) for(i = 0; i < width; i++) { pixel = gdk_image_get_pixel(tile_image, srcx + i, srcy + j); gdk_image_put_pixel(tmp_img, ofsx + i, ofsy + j, pixel); } } /* * This version of the function works in pixbuf mode. * FIXME: That's a lie! It doesn't work (only a silhouette of the * foreground tile is drawn). */ static void x_pixbuf_tmp_draw_tile(int tile, int ofsx, int ofsy) { int i, j, n; guint32 pixel; int width, height; int srcx, srcy; int dstx = ofsx, dsty = ofsy; width = Tile->unit_width; height = Tile->unit_height; srcx = (tile % tiles_per_row) * width; srcy = (tile / tiles_per_row) * height; if (dstx < 0) { srcx -= dstx; width += dstx; dstx = 0; } if (dsty < 0) { srcy -= dsty; height += dsty; dsty = 0; } if (dstx > 0) width -= dstx; if (dsty > 0) height -= dsty; if (!tmp_pixbuf) { tmp_pixbuf = gdk_pixbuf_new(gdk_pixbuf_get_colorspace(tile_pixbuf), gdk_pixbuf_get_has_alpha(tile_pixbuf), gdk_pixbuf_get_bits_per_sample(tile_pixbuf), Tile->unit_width, Tile->unit_height); memset(gdk_pixbuf_get_pixels(tmp_pixbuf), 0, Tile->unit_height * gdk_pixbuf_get_rowstride(tmp_pixbuf)); gdk_pixbuf_copy_area(tile_pixbuf, srcx, srcy, width, height, tmp_pixbuf, dstx, dsty); { guchar *pixels; int rowstride; int n_channels; guchar rgba[4]; g_return_if_fail(gdk_pixbuf_get_bits_per_sample(tmp_pixbuf) == 8 && gdk_pixbuf_get_colorspace(tmp_pixbuf) == GDK_COLORSPACE_RGB); pixels = gdk_pixbuf_get_pixels(tmp_pixbuf); rowstride = gdk_pixbuf_get_rowstride(tmp_pixbuf); n_channels = gdk_pixbuf_get_n_channels(tmp_pixbuf); for(j = 0; j < Tile->unit_height; j++) for(i = 0; i < Tile->unit_width; i++) { nh_pixbuf_get_pixel(i, j, rgba); rgba[3] = 255; nh_pixbuf_put_pixel(i, j, rgba); } } } else gdk_pixbuf_composite(tile_pixbuf, tmp_pixbuf, dstx, dsty, width, height, -srcx, -srcy, 1.0, 1.0, GDK_INTERP_NEAREST, 255.0); } /* * Copy tile to the temporary image at offset (ofsx, ofsy) */ void x_tile_tmp_draw_tile(int tile, int ofsx, int ofsy) { g_return_if_fail(tile_image != NULL || tile_pixbuf != NULL); g_return_if_fail(tile_pixbuf || tmp_img != NULL); #ifdef DEBUG fprintf(stderr, "x_tile_tmp_draw_tile(%d, %d, %d)\n", tile, ofsx, ofsy); #endif if (tile_pixbuf) x_pixbuf_tmp_draw_tile(tile, ofsx, ofsy); else if (Tile->transparent) if (tile_bits_per_pixel&7) x_img_tmp_draw_tile_transp(tile, ofsx, ofsy); else x_img_tmp_draw_tile_transp_byte(tile, ofsx, ofsy); else x_img_tmp_draw_tile_opaque(tile, ofsx, ofsy); } /* * Draw the temporary image to the map at position (dstx, dsty) */ void x_tile_draw_tmp(int dstx, int dsty) { g_return_if_fail(tmp_img != NULL || tmp_pixbuf != NULL); if (tmp_img) xshm_map_draw_image(tmp_img, 0, 0, dstx, dsty, tmp_img->width, tmp_img->height); else xshm_map_draw_pixbuf(tmp_pixbuf, 0, 0, dstx, dsty, Tile->unit_width, Tile->unit_height); } /* * Copy tile to the map at position (dstx, dsty) */ void x_tile_draw_tile(int tile, int dstx, int dsty) { int srcx, srcy; g_return_if_fail(tile_image != NULL || tile_pixmap != NULL); srcx = (tile % tiles_per_row) * Tile->unit_width; srcy = (tile / tiles_per_row) * Tile->unit_height; if (tile_image) xshm_map_draw_image(tile_image, srcx, srcy, dstx, dsty, Tile->unit_width, Tile->unit_height); else xshm_map_draw_drawable(tile_pixmap, srcx, srcy, dstx, dsty, Tile->unit_width, Tile->unit_height); } /* TODO: These functions need their own module */ void nhgtk_image_draw_line(GdkImage *img, long c, int x1, int y1, int x2, int y2) { int i; unsigned int bpp, bpl; g_return_if_fail(x1 == x2 || y1 == y2); g_return_if_fail(x1 <= x2 && y1 <= y2); g_return_if_fail(img != NULL); bpl = img->bpl; if (tile_bits_per_pixel&7) bpp = 0; else bpp = img->bpp; if (bpp == sizeof(unsigned long)) { unsigned long *dst; dst = img->mem + y1 * bpl + x1 * bpp; if (y1 == y2) for(i = x2 - x1 + 1; i; i--) *dst++ = (unsigned long)c; else for(i = y2 - y1 + 1; i; i--) { *dst = (unsigned long)c; dst = (unsigned long *)((unsigned char *)dst + bpl); } } else if (bpp == sizeof(unsigned short)) { unsigned short *dst; dst = img->mem + y1 * bpl + x1 * bpp; if (y1 == y2) for(i = x2 - x1 + 1; i; i--) *dst++ = (unsigned short)c; else for(i = y2 - y1 + 1; i; i--) { *dst = (unsigned short)c; dst = (unsigned short *)((unsigned char *)dst + bpl); } } else if (bpp == 1) { unsigned char *dst; dst = img->mem + y1 * bpl + x1 * bpp; if (y1 == y2) for(i = x2 - x1 + 1; i; i--) *dst++ = (unsigned char)c; else for(i = y2 - y1 + 1; i; i--) { *dst = (unsigned char)c; dst += bpl; } } else { if (y1 == y2) for(i = x1; i <= x2; i++) gdk_image_put_pixel(img, i, y1, c); else for(i = y1; i <= y2; i++) gdk_image_put_pixel(img, x1, i, c); } } void nhgtk_image_draw_rectangle(GdkImage *img, long c, int dofill, int x, int y, int width, int height) { int i; if (dofill) { if (width > 0) for(i = 0; i < height; i++) nhgtk_image_draw_line(img, c, x, y + i, x + width - 1, y + i); } else if (width < 1 || height < 1) { if (width == 0 && height >= 0) nhgtk_image_draw_line(img, c, x, y, x, y + height); else if (height == 0 && width >= 0) nhgtk_image_draw_line(img, c, x, y, x + width, y); } else { nhgtk_image_draw_line(img, c, x, y, x + width, y); nhgtk_image_draw_line(img, c, x, y + height, x + width, y + height); nhgtk_image_draw_line(img, c, x, y + 1, x, y + height - 1); nhgtk_image_draw_line(img, c, x + width, y + 1, x + width, y + height - 1); } } void x_tile_draw_rectangle(int dstx, int dsty, GdkColor *c) { GdkRectangle rect; g_return_if_fail(c != NULL); g_return_if_fail(Tile != NULL); g_return_if_fail(xshm_map_pixmap != NULL || xshm_map_image != NULL); if (xshm_map_pixmap) { GdkGC *gc; gc = gdk_gc_new(xshm_map_pixmap); gdk_gc_set_foreground(gc, c); gdk_draw_rectangle(xshm_map_pixmap, gc, FALSE, dstx, dsty, Tile->unit_width - 1, Tile->unit_height - 1); gdk_gc_unref(gc); } else nhgtk_image_draw_rectangle(xshm_map_image, c->pixel, FALSE, dstx, dsty, Tile->unit_width, Tile->unit_height); rect.x = dstx; rect.y = dsty; rect.width = Tile->unit_width; rect.height = Tile->unit_height; xshm_map_draw(&rect); } /* * [ALI] * * Create the GTK interface's tileTab[] array from the game's tileset * array. We drop any tilesets which we can easily tell aren't supported * but we won't be sure until we actually try and load them. * Information which depends on the size of the tilemap will be completed * when we load the tileset. */ int tile_scan(void) { int i, v, visual, ch; int fh; const char *tileset = nh_option_cache_get("tileset"); #ifdef GTK_PROXY struct proxycb_get_tilesets_res *tilesets_res = proxy_cb_get_tilesets(); struct proxycb_get_tilesets_res_tileset *tilesets = tilesets_res->tilesets; int no_tilesets = tilesets_res->n_tilesets; #else dlb_init(); #endif v = 1; /* Index into tileTab[] array */ for(i = 0; i < no_tilesets; i++) { if (tilesets[i].flags & ~(TILESET_TRANSPARENT | TILESET_PSEUDO3D)) continue; /* Unsupported flag set */ #ifdef GTK_PROXY if (!tilesets[i].mapfile) { fprintf(stderr, "No map file specified for tileset %s\n", tilesets[i].name); continue; } fh = proxy_cb_dlbh_fopen(tilesets[i].mapfile, "r"); if (fh < 0) { perror(tilesets[i].mapfile); continue; /* Missing or unreadable tile map */ } proxy_cb_dlbh_fclose(fh); #endif /* GTK_PROXY */ fh = nh_dlbh_fopen("tileset", tilesets[i].file, "r"); if (fh < 0) { perror(tilesets[i].file); continue; /* Missing or unreadable tile file */ } nh_dlbh_fclose(fh); tileTab[v].ident = strdup(tilesets[i].name); tileTab[v].file = strdup(tilesets[i].file); #ifdef GTK_PROXY tileTab[v].mapfile = strdup(tilesets[i].mapfile); #endif tileTab[v].transparent = !!(tilesets[i].flags & TILESET_TRANSPARENT); tileTab[v].spread = !!(tilesets[i].flags & TILESET_PSEUDO3D); v++; } no_tileTab = v - 1; if (!tileset[0]) visual = 0; else { visual = -1; for(v = 1; v <= no_tileTab; v++) { if (!strcmp(tileset, tileTab[v].ident)) { visual = v; break; } } if (visual < 0) { pline("Warning: Tile set \"%s\" not supported.", tileset); if (no_tileTab > 0) { visual = 1; /* Default to the first valid tile set */ nh_option_cache_set("tileset", tileTab[visual].ident); } else { visual = 0; /* Drop down to character mode */ nh_option_cache_set("tileset", ""); } } } #ifdef GTK_PROXY proxy_cb_free_tilesets(tilesets_res); #endif return visual; } slashem-0.0.7E7F3/win/gtk/GTKRC.w320000664000076400007640000000231610545462317014447 0ustar aliali# # Win32 Gtkrc # # Fonts are specified as Pango Font Descriptions. # style "text" { font_name = "Sans Medium 10" } widget_class "*" style "text" widget "fixed font*GtkText" style "text" widget "fixed font*GtkCList" style "text" style "map" { font_name = "Sans Medium 12" # Map colours: # # - These are only used in character mode. # - fg is not used when color option is set. # - The five states have no real meaning and should normally take the # same values. # - In color mode, certain values of bg[NORMAL] are checked for: # * { 0.0, 0.0, 0.0 } causes normally black symbols to be drawn in white. # * { 1.0, 1.0, 1.0 } causes normally white symbols to be drawn in black. # Note: only these exact values are detected (barring rounding errors). # bg[NORMAL] = { 0.15, 0.15, 0.15 } bg[PRELIGHT] = { 0.15, 0.15, 0.15 } bg[ACTIVE] = { 0.15, 0.15, 0.15 } bg[SELECTED] = { 0.15, 0.15, 0.15 } bg[INSENSITIVE] = { 0.15, 0.15, 0.15 } fg[NORMAL] = { 1.0, 1.0, 1.0 } fg[PRELIGHT] = { 1.0, 1.0, 1.0 } fg[ACTIVE] = { 1.0, 1.0, 1.0 } fg[SELECTED] = { 1.0, 1.0, 1.0 } fg[INSENSITIVE] = { 1.0, 1.0, 1.0 } } widget "SlashEM.*.map" style "map" slashem-0.0.7E7F3/win/gtk/gtkgetlin.c0000664000076400007640000000636510545462317015404 0ustar aliali/* $Id: gtkgetlin.c,v 1.7 2004/04/10 15:41:21 j_ali Exp $ */ /* GTK+ NetHack Copyright (c) Issei Numata 1999-2000 Copyright (c) Slash'EM Development Team 2000-2004 GTK+ NetHack may be freely redistributed. See license for details. */ #include #include #include #include #include "winGTK.h" static GtkWidget *window; static int cancelled; static gint getlin_destroy(GtkWidget *widget, gpointer data) { window = NULL; cancelled = 1; gtk_main_quit(); return FALSE; } static gint entry_key_press(GtkWidget *widget, GdkEventKey *event, gpointer data) { if (event->keyval == GDK_Return) gtk_main_quit(); if (event->keyval == GDK_Escape) { cancelled = 1; gtk_main_quit(); } return FALSE; } static gint entry_ok(GtkWidget *widget, GdkEventButton *event, gpointer data) { gtk_main_quit(); return FALSE; } static gint entry_cancel(GtkWidget *widget, GdkEventButton *event, gpointer data) { cancelled = 1; gtk_main_quit(); return FALSE; } char * GTK_getline(const char *query, boolean cancelable) { char *s, *ret; GtkWidget *frame; GtkWidget *vbox; GtkWidget *hbox; GtkWidget *entry; GtkWidget *ok; GtkWidget *cancel; gulong h; cancelled = 0; window = nh_gtk_window_dialog(TRUE); nh_position_popup_dialog(GTK_WIDGET(window)); frame = nh_gtk_new_and_add(gtk_frame_new(query), window, ""); gtk_container_border_width(GTK_CONTAINER(frame), NH_PAD); vbox = nh_gtk_new_and_add(gtk_vbox_new(FALSE, 0), frame, ""); entry = nh_gtk_new_and_pack(gtk_entry_new(), vbox, "", FALSE, FALSE, NH_PAD); #if GTK_CHECK_VERSION(2,0,0) gtk_entry_set_activates_default(GTK_ENTRY(entry), TRUE); #endif nh_gtk_focus_set_master(GTK_WINDOW(window), GTK_SIGNAL_FUNC(entry_key_press), 0, TRUE); hbox = nh_gtk_new_and_pack(gtk_hbox_new(FALSE, 0), vbox, "", FALSE, FALSE, NH_PAD); if (cancelable) { cancel = gtk_button_new_from_stock(GTK_STOCK_CANCEL); gtk_widget_show(cancel); gtk_box_pack_end(GTK_BOX(hbox), cancel, FALSE, FALSE, NH_PAD); gtk_signal_connect(GTK_OBJECT(cancel), "clicked", GTK_SIGNAL_FUNC(entry_cancel), NULL); } ok = gtk_button_new_from_stock(GTK_STOCK_OK); gtk_widget_show(ok); gtk_box_pack_end(GTK_BOX(hbox), ok, FALSE, FALSE, NH_PAD); GTK_WIDGET_SET_FLAGS(ok, GTK_CAN_DEFAULT); gtk_widget_grab_default(ok); gtk_signal_connect(GTK_OBJECT(ok), "clicked", GTK_SIGNAL_FUNC(entry_ok), NULL); h = gtk_signal_connect(GTK_OBJECT(window), "destroy", GTK_SIGNAL_FUNC(getlin_destroy), NULL); gtk_widget_grab_focus(entry); gtk_grab_add(window); gtk_widget_show_all(window); gtk_widget_realize(window); gdk_window_set_decorations(window->window, GDK_DECOR_BORDER | GDK_DECOR_TITLE); gtk_main(); if (!cancelled) { s = (char *)gtk_entry_get_text(GTK_ENTRY(entry)); ret = (char *)alloc(strlen(s) + 1); Strcpy(ret, s); } else { ret = (char *)alloc(1); *ret = '\0'; } if (window) { gtk_signal_disconnect(GTK_OBJECT(window), h); gtk_widget_unmap(window); gtk_widget_destroy(window); } return ret; } char * GTK_ext_getlin(const char *query) { return GTK_getline(query, TRUE); } slashem-0.0.7E7F3/win/gtk/Install.GTK0000664000076400007640000001563510545462317015225 0ustar alialiInstalling Slash'EM with a GTK 2.0 interface -------------------------------------------- This document describes the installation of Slash'EM with a GTK 2.0 interface on X11. The GTK interface is another alternative to the Athena-widgets interface found in ../X11. You can download GTK+ from http://www.gtk.org/. You need GTK+ 2.x to use this code. The GTK interface comes from JNetHack version 1.1.5 and was written by Issei Numata (issei@guru.gr.jp). JNetHack can be downloaded from http://www.jnethack.org/. The interface can be used in a number of different ways: 1. As a conventional windowing interface. This has the lowest overhead and is therefore fastest. The disadvantage is that the interface will run in the same process as the game itself and since the Gtk+ libraries cannot run with elevated privileges this means that the game must be installed without using any special privileges. On the MS-Windows platform this is the only supported configuration anyway and so there is no disadvantage. On UNIX platforms this requires choosing not to install the game with setuid or setgid permissions. See ../../sys/unix/Install.unx for details. 2. As a proxified windowing interface. In this mode, the GTK interface is included in the game executable as normal but the interface will fork and run as a child of the game process when it is initialised. This means that the interface can drop any privileges that the game process may have and thus the Gtk+ libraries can be run without any problems. In many ways this is the best compromise on UNIX systems although the NhExt protocol that the game and GTK interface use to communicate does involve a significant overhead. 3. As an external windowing interface. This is similar to the proxified mode but instead of including the GTK windowing interface in the game executable a seperate executable, gtkhack, is created. When gtkhack is run it connects to the game and communicates with it using the NhExt protocol. The advantage of this over proxified mode is that there is the potential for the game and the interface to run on seperate machines and the game executable is significantly smaller. If the GTK interface is only one of a number of different interfaces which will be used by players then this can remove an unneccessary overhead. The disadvantage is that installation and configuration is slightly more complex. To use this code: 1. follow the directions for the UNIX installation (in ../sys/unix) or for the MS-Windows installation (in ../sys/winnt) to create the Makefiles. 2. ../../include/config.h define the following symbols (search for them): [conventional] GTK_GRAPHICS [proxified] PROXY_GRAPHICS, GTK_GRAPHICS and GTK_PROXY [external] PROXY_GRAPHICS and GTK_PROXY You can comment out TTY_GRAPHICS if you want to, or leave it in to support both interfaces (in which case be sure you have the right curses libraries etc. required for that interface). It is highly recommded that you leave TTY_GRAPHICS defined if PROXY_GRAPHICS is defined. In any event, PROXY_GRAPHICS must not be the only windowing interface supported. You may define X11_GRAPHICS and/or QT_GRAPHICS in addition to support multiple windowing ports (and tty as well, if you want) in the same executable if you so desire. Proxified and external modes require that PROXY_GRAPHICS is defined which will add support for plug-in windowing ports. This may also be defined in conventional mode to support plug-in interfaces as well as the GTK interface if so desired. 3. for an external windowing interface, follow the directions in ../proxy/Install.pxy to build a game with support for plug-in window interfaces and to build the proxy library. Then build gtkhack, the external executable, by changing to this directory and typing: [UNIX] make -f Makefile.unx [MS-Windows] make -f Makefile.w32 GtkHack relies on the game executable for tiles, but does need a couple of other support files: credit.xpm found in ../../dat gtkrc found in GTKRC (UNIX) or GTKRC.w32 (MS-Windows) Install the gtkhack executable and its support files somewhere suitable and then skip to step 6. 4. ../../src/Makefile [UNIX] Add the following to WINSRC, WINOBJ, and WINLIB and compile: [conventional] [WINSRC] $(WINGTKSRC) $(PROXYUTLSRC) [WINOBJ] $(WINGTKOBJ) $(PROXYUTLOBJ) [WINLIB] $(WINGTKLIB) [proxified] [WINSRC] $(WINGTKSRC) $(WINPROXYSRC) $(PROXYUTLSRC) \ $(PROXYCOMSRC) $(PROXYCLNTSRC) [WINOBJ] $(WINGTKOBJ) $(WINPROXYOBJ) $(PROXYUTLOBJ) \ $(PROXYCOMOBJ) $(PROXYCLNTOBJ) [WINLIB] $(WINGTKLIB) $(WINPROXYLIB) This will give you an executable supporting GTK 2.0 and possibly plug-in windowing ports. To support tty windowing as well, add $(WINTTYSRC), $(WINTTYOBJ), and $(WINTTYLIB) to WINSRC, WINOBJ, and WINLIB respectively. To support multiple windowing ports, change the definitions of WINSRC, WINOBJ and WINLIB to include all the relevant variables. [MS-Windows] change the definition of USE_GTK and USE_PROXY as follows and compile: [conventional] USE_GTK = Y USE_PROXY = N [proxified] USE_GTK = N USE_PROXY = Y This will give you an executable supporting both tty windowing and GTK 2.0 and possibly plug-in windowing ports. Multiple windowing ports (apart from the above) are not supported under MS-Windows. 5. [UNIX] ../../Makefile (the top-level makefile) change CNF_SHARE_DATND to include: [conventional] $(CNF_SHARE_GTKND) [proxified] $(CNF_SHARE_GTKND) and $(CNF_SHARE_GTKPROXYND) If you want to support the other windowing ports, include their $(CNF_SHARE_XXXND) variables also. CNF_SHARE_DATND should normally include all the various flavours of x11tiles to allow the user to select which tile set he/she would prefer at runtime. If you will always be using the same one however, you can remove the others. 6. Follow all the instructions in ../../sys/unix/Install.unx or the appropriate documentation in ../../sys/winnt for the remainder of the installation process. 7. Consider adding the lines below to your .slashemrc (or equivalent if you don't run UNIX), as they are likely to give the best interface for this window port: TILESET=name:Small tiles, file:x11tiles TILESET=name:Big tiles, file:x11bigtiles, transparent TILESET=name:Big 3D tiles, file:x11big3dtiles, transparent, pseudo3D OPTIONS=tiles:Big 3D tiles Set the tiles option to your preferred tile set. If not set, the GTK port will default to the first valid tile set found. 8. Look at GAMEDIR/gtkrc (or FILE_AREA_SHARE/gtkrc if using file areas) and overide the styles in your local gtkrc (~/.gtkrc by default) if so desired. slashem-0.0.7E7F3/win/gtk/gtkconnect.gladep0000664000076400007640000000155310545462317016557 0ustar aliali GtkHack gtkconnect . . FALSE FALSE TRUE FALSE FALSE gtkconnect.c gtkconnect.h gtkconcb.c gtkconcb.h gtksupport.c gtksupport.h slashem-0.0.7E7F3/win/gtk/gtkmisc.c0000664000076400007640000007554210545462317015060 0ustar aliali/* $Id: gtkmisc.c,v 1.17 2004/04/10 14:30:50 j_ali Exp $ */ /* GTK+ NetHack Copyright (c) Issei Numata 1999-2000 Copyright (c) Slash'EM Development Team 2000-2003 GTK+ NetHack may be freely redistributed. See license for details. */ #include #include #include #include #include "winGTK.h" #ifdef GTK_PROXY #include "proxycb.h" #endif static gboolean option_lock; static int keysym; static GtkWidget *entry_url; static GtkWidget *entry_plname; static GtkWidget *entry_dogname; static GtkWidget *entry_catname; static GtkWidget *entry_fruit; static GtkWidget *entry_proxy, *entry_proxy_port; static GtkWidget *radio_k, *radio_d, *radio_r; static GtkWidget *radio_menu_t, *radio_menu_p, *radio_menu_c, *radio_menu_f; static struct GTK_Option { char *opt_name; char *on; char *off; char *option; boolean not; GSList *group; GtkWidget *radio1; GtkWidget *radio2; } gtk_option[] = { {"prevent you from attacking your pet", "Yes", "No", "safe_pet"}, {"ask before hitting peaceful monsters", "Yes", "No", "confirm"}, #ifdef TEXTCOLOR {"display pets in a red square", "Yes", "No", "hilite_pet"}, #endif {NULL,}, {"display experience points", "Yes", "No", "showexp"}, #ifdef SCORE_ON_BOTL {"display score points", "Yes", "No", "showscore"}, #endif {"display elapsed game time", "Yes", "No", "time"}, {NULL,}, {"automatically pick up objects", "Yes", "No", "autopickup"}, {NULL,}, {"print introductory message", "Yes", "No", "legacy"}, #ifdef NEWS {"print any news", "Yes", "No", "news"}, #endif #ifdef MAIL {"enable the mail dameon", "Yes", "No", "mail"}, #endif {NULL,}, {"space bar as a rest character", "Yes", "No", "rest_on_space"}, {"print more commentary", "Yes", "No", "verbose"}, {NULL,}, {"print tombstone when die", "Yes", "No", "tombstone"}, {NULL,}, {"try to retain the same letter for the same objects", "Yes", "No", "fixinv"}, {"group similar kinds of objects in inventory", "Yes", "No", "sortpack"}, }; static void nh_option_set(void); static void nh_option_get(void); static int nh_option_has_changed(void); static int nh_option_more_confirm(void); static gint default_destroy(GtkWidget *widget, gpointer data) { guint *hid = (guint *)data; *hid = 0; keysym = '\033'; gtk_main_quit(); return FALSE; } static gint default_key_press(GtkWidget *widget, GdkEventKey *event, gpointer data) { keysym = nh_keysym(event); if (keysym == '\n' || keysym == '\033') gtk_main_quit(); return FALSE; } static gint default_clicked(GtkWidget *widget, gpointer data) { if (data) keysym = (int)data; else keysym = '\n'; if (keysym == 'm') { if (nh_option_has_changed()) { switch(nh_option_more_confirm()) { case -1: /* Cancel "more options" */ keysym = 0; return FALSE; default: /* Discard changes */ nh_option_set(); break; case 1: /* Apply changes first */ nh_option_get(); break; } } /* * We have to disable the cache during the call to doset since the * game may call a number of window interface functions during the * call and there is no way for us to know at what point the options * have been set. */ nh_option_cache_disable(); #ifdef GTK_PROXY proxy_cb_doset(); #else doset(); #endif nh_option_cache_enable(); nh_option_set(); } else gtk_main_quit(); return FALSE; } /* ALI * Extra dialogue to confirm action before bringing up "more options" * dialogue if any of the options have been changed first. * * Returns: -1: Cancel, 0: Discard, 1: Apply */ static gint mc_key_press(GtkWidget *widget, GdkEventKey *event, gpointer data) { keysym = nh_keysym(event); gtk_main_quit(); return FALSE; } static gint mc_clicked(GtkWidget *widget, gpointer data) { keysym = (int)data; gtk_main_quit(); return FALSE; } static int nh_option_more_confirm(void) { guint hid; GtkWidget *w; GtkWidget *frame; GtkWidget *vbox, *hbox; GtkWidget *button1; GtkWidget *button2; GtkWidget *button3; w = nh_gtk_window_dialog(TRUE); nh_gtk_focus_set_master(GTK_WINDOW(w), GTK_SIGNAL_FUNC(mc_key_press), 0, TRUE); hid = gtk_signal_connect(GTK_OBJECT(w), "destroy", GTK_SIGNAL_FUNC(default_destroy), &hid); nh_position_popup_dialog(GTK_WIDGET(w)); frame = nh_gtk_new_and_add(gtk_frame_new(NULL), w, ""); gtk_container_border_width(GTK_CONTAINER(frame), NH_PAD); vbox = nh_gtk_new_and_add(gtk_vbox_new(FALSE, 0), frame, ""); hbox = nh_gtk_new_and_pack(gtk_hbox_new(FALSE, 0), vbox, "", FALSE, FALSE, 0); nh_gtk_new_and_pack(gtk_label_new("Commit changes made?"), hbox, "", FALSE, FALSE, 0); nh_gtk_new_and_pack(gtk_vseparator_new(), vbox, "", FALSE, FALSE, NH_PAD); hbox = nh_gtk_new_and_pack(gtk_hbox_new(FALSE, 0), vbox, "", FALSE, FALSE, NH_PAD); button1 = nh_gtk_new_and_pack(gtk_button_new_from_stock(GTK_STOCK_YES), hbox, "", FALSE, FALSE, NH_PAD); button2 = nh_gtk_new_and_pack(gtk_button_new_from_stock(GTK_STOCK_NO), hbox, "", FALSE, FALSE, NH_PAD); button3 = nh_gtk_new_and_pack(gtk_button_new_from_stock(GTK_STOCK_CANCEL), hbox, "", FALSE, FALSE, NH_PAD); gtk_signal_connect(GTK_OBJECT(button1), "clicked", GTK_SIGNAL_FUNC(mc_clicked), (gpointer)'y'); gtk_signal_connect(GTK_OBJECT(button2), "clicked", GTK_SIGNAL_FUNC(mc_clicked), (gpointer)'n'); gtk_signal_connect(GTK_OBJECT(button3), "clicked", GTK_SIGNAL_FUNC(mc_clicked), (gpointer)'c'); gtk_widget_show_all(w); gtk_grab_add(w); gtk_main(); if (hid > 0) { gtk_signal_disconnect(GTK_OBJECT(w), hid); gtk_widget_destroy(w); } switch(keysym) { case 'a': case 'A': case 'y': case 'Y': case '\n': return 1; case '\033': case 'c': case 'C': return -1; default: return 0; } } static void nh_option_set(void) { int i; GtkWidget *button; struct GTK_Option *p; char *s; gtk_entry_set_text(GTK_ENTRY(entry_plname), nh_option_cache_get("name")); gtk_entry_set_text(GTK_ENTRY(entry_catname), nh_option_cache_get("catname")); gtk_entry_set_text(GTK_ENTRY(entry_dogname), nh_option_cache_get("dogname")); gtk_entry_set_text(GTK_ENTRY(entry_fruit), nh_option_cache_get("fruit")); s = nh_option_cache_get("pettype"); if (*s == 'c') button = radio_k; else if (*s == 'd') button = radio_d; else button = radio_r; gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE); s = nh_option_cache_get("menustyle"); switch (*s) { default: case 't': button = radio_menu_t; break; case 'p': button = radio_menu_p; break; case 'c': button = radio_menu_c; break; case 'f': button = radio_menu_f; break; } gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE); for(i = 0; i < SIZE(gtk_option); i++) { p = >k_option[i]; p->group = NULL; if (p->opt_name) { button = p->not ^ nh_option_cache_get_bool(p->option) ? p->radio1 : p->radio2; gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE); } } gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(tileTab[nh_get_map_visual()].data), TRUE); } /* [ALI] We could probably do this better with glib functions */ #define NHOF_NOCACHE 1 #define NHOF_DIRTY 1 #define NHOF_BOOLEAN 2 static char *boolean_set = "yes"; /* Where value points for booleans */ static char *boolean_reset = "no"; static unsigned nh_option_cache_flags; static int nh_option_cache_size; static struct nh_option { char *option; char *value; void *addr; void (*callback)(); /* boolean: func(boolean) non-boolean: func(char *) */ unsigned flags; } *nh_option_cache; static struct nh_option * nh_option_cache_getent(const char *option) { int i; struct nh_option *new; for(i = 0; i < nh_option_cache_size; i++) if (nh_option_cache[i].option && !strcmp(option, nh_option_cache[i].option)) return nh_option_cache + i; for(i = 0; i < nh_option_cache_size; i++) if (!nh_option_cache[i].option) break; if (i == nh_option_cache_size) { new = (struct nh_option *)realloc(nh_option_cache, (nh_option_cache_size + 1) * sizeof(*nh_option_cache)); if (!new) return NULL; nh_option_cache = new; i = nh_option_cache_size++; } memset(nh_option_cache + i, 0, sizeof(*nh_option_cache)); nh_option_cache[i].option = strdup(option); return nh_option_cache[i].option ? nh_option_cache + i : NULL; } /* * Synchronize the game core with the cache */ int nh_option_cache_sync(void) { int i, nb = 0; char *buf, *bp; for(i = 0; i < nh_option_cache_size; i++) if (nh_option_cache[i].flags & NHOF_DIRTY) { nb += strlen(nh_option_cache[i].option); if (nh_option_cache[i].flags & NHOF_BOOLEAN) nb += nh_option_cache[i].value == boolean_set ? 1 : 2; else nb += strlen(nh_option_cache[i].value) + 2; } if (!nb) return TRUE; bp = buf = malloc(nb); if (!buf) return FALSE; for(i = 0; i < nh_option_cache_size; i++) if (nh_option_cache[i].flags & NHOF_DIRTY) { if (bp != buf) *bp++ = ','; if ((nh_option_cache[i].flags & NHOF_BOOLEAN) && nh_option_cache[i].value != boolean_set) *bp++ = '!'; strcpy(bp, nh_option_cache[i].option); bp = eos(bp); if (!(nh_option_cache[i].flags & NHOF_BOOLEAN)) { *bp++ = '='; strcpy(bp, nh_option_cache[i].value); bp = eos(bp); } nh_option_cache[i].flags &= ~NHOF_DIRTY; } #ifdef GTK_PROXY proxy_cb_parse_options(buf); #else parseoptions(buf, FALSE, FALSE); #endif free(buf); return TRUE; } /* * Disable the cache. This is normally only done during calls to doset(). * Note that this will cause spurious callbacks to be triggered for options * that are not changed by doset() when the options are re-entered into * the cache. Options with an address set do not suffer from this problem. */ int nh_option_cache_disable(void) { int i; char *value; boolean bv; struct nh_option *no = nh_option_cache; nh_option_cache_flags |= NHOF_NOCACHE; for(i = 0; i < nh_option_cache_size; i++, no++) { if (!(no->flags & NHOF_BOOLEAN)) free(no->value); if (!no->addr) { free(no->option); no->option = NULL; no->flags = 0; } no->value = NULL; } } int nh_option_cache_enable(void) { int i; char *value, *old_value; boolean bv, obv; struct nh_option *no = nh_option_cache; nh_option_cache_flags &= ~NHOF_NOCACHE; for(i = 0; i < nh_option_cache_size; i++, no++) { if (no->addr) { #ifdef GTK_PROXY value = proxy_cb_get_option(no->option); #else value = get_option(no->option); #endif no->flags &= ~NHOF_DIRTY; if (no->flags & NHOF_BOOLEAN) { bv = !strcmp(value, "yes"); no->value = bv ? boolean_set : boolean_reset; obv = *(boolean *)no->addr; *(boolean *)no->addr = bv; if (no->callback && bv != obv) (*no->callback)(bv); } else { no->value = strdup(value); old_value = *(char **)no->addr; *(char **)no->addr = strdup(value); if (no->callback && strcmp(no->value, old_value)) (*no->callback)(no->value); free(old_value); } } } } void nh_option_cache_set(char *option, const char *value) { boolean changed = FALSE; char *buf; struct nh_option *no = nh_option_cache_getent(option); if (no && no->flags & NHOF_BOOLEAN) panic("Setting value for boolean option %s", option); if (nh_option_cache_flags & NHOF_NOCACHE) { buf = malloc(strlen(option) + strlen(value) + 2); if (buf) { sprintf(buf, "%s=%s", option, value); #ifdef GTK_PROXY proxy_cb_parse_options(buf); #else parseoptions(buf, FALSE, FALSE); #endif free(buf); } changed = TRUE; } else if (no && (!no->value || strcmp(value, no->value))) { free(no->value); no->value = strdup(value); no->flags |= NHOF_DIRTY; changed = TRUE; } if (no && no->addr) { free(*(char **)no->addr); *(char **)no->addr = strdup(value); } if (no->callback && changed) (*no->callback)(no->value); } void nh_option_cache_set_bool(char *option, boolean value) { boolean changed; char *buf; struct nh_option *no = nh_option_cache_getent(option); if (no && !(no->flags & NHOF_BOOLEAN) && no->value) panic("Setting boolean value for text option %s", option); if (nh_option_cache_flags & NHOF_NOCACHE) { buf = malloc(strlen(option) + value ? 1 : 2); if (buf) { sprintf(buf, "%s%s", value ? "" : "!", option); #ifdef GTK_PROXY proxy_cb_parse_options(buf); #else parseoptions(buf, FALSE, FALSE); #endif free(buf); } changed = TRUE; } else if (no && no->value != (value ? boolean_set : boolean_reset)) { no->value = value ? boolean_set : boolean_reset; no->flags |= NHOF_DIRTY | NHOF_BOOLEAN; changed = TRUE; } if (no && no->addr) *(boolean *)no->addr = value; if (no->callback && changed) (*no->callback)(value); } void nh_option_cache_set_addr(char *option, char **addr) { struct nh_option *no = nh_option_cache_getent(option); if (no) { if (no->flags & NHOF_BOOLEAN) panic("Setting address for boolean option %s", option); if (no->addr) { free(*(char **)no->addr); *(char **)no->addr = (char *)0; } no->addr = addr; *addr = nh_option_cache_get(option); } } void nh_option_cache_set_bool_addr(char *option, boolean *addr) { struct nh_option *no = nh_option_cache_getent(option); if (no) { if (!(no->flags & NHOF_BOOLEAN) && no->value) panic("Setting boolean address for text option %s", option); no->addr = addr; no->flags |= NHOF_BOOLEAN; *addr = nh_option_cache_get_bool(option); } } void nh_option_cache_set_callback(char *option, void (*func)(char *new_value)) { struct nh_option *no = nh_option_cache_getent(option); if (no) { if (no->flags & NHOF_BOOLEAN) panic("Setting callback for boolean option %s", option); no->callback = (void (*)())func; } } void nh_option_cache_set_bool_callback(char *option, void (*func)(boolean new_value)) { struct nh_option *no = nh_option_cache_getent(option); if (no) { if (!(no->flags & NHOF_BOOLEAN) && no->value) panic("Setting boolean callback for text option %s", option); no->callback = (void (*)())func; } } char * nh_option_cache_get(char *option) { char *value; struct nh_option *no = nh_option_cache_getent(option); if (!no) return ""; if (!no->value) { #ifdef GTK_PROXY value = proxy_cb_get_option(option); #else value = get_option(option); #endif if (nh_option_cache_flags & NHOF_NOCACHE) return value; no->value = strdup(value); } return no->value; } boolean nh_option_cache_get_bool(char *option) { char *value; int v; struct nh_option *no = nh_option_cache_getent(option); if (!no) return FALSE; if (!no->value) { #ifdef GTK_PROXY value = proxy_cb_get_option(option); #else value = get_option(option); #endif no->flags |= NHOF_BOOLEAN; /* * Some options (eg., number_pad) are booleans under some versions * of NetHack but have been expanded to have more than one "true" * value in later versions. As long as gtkhack doesn't need to * differentiate between the various true values we can simply * map them to true and false here. This provides full backwards * compatibility. We assume that "0" means false and non-zero * values mean various shades of true. */ if (!strcmp(value, "yes")) value = boolean_set; else if (!strcmp(value, "no")) value = boolean_reset; else if (sscanf(value, "%d", &v) == 1) value = v ? boolean_set : boolean_reset; else value = boolean_reset; if (nh_option_cache_flags & NHOF_NOCACHE) return value == boolean_set; no->value = value; } return no->value == boolean_set; } void GTK_ext_preference_update(const char *option, const char *value) { boolean bv; struct nh_option *no = nh_option_cache_getent(option); if (no && no->flags & NHOF_BOOLEAN) { bv = !strcmp(value, "yes"); if (!(nh_option_cache_flags & NHOF_NOCACHE) && no->value != (bv ? boolean_set : boolean_reset)) no->value = bv ? boolean_set : boolean_reset; if (no->addr) *(boolean *)no->addr = bv; if (no->callback) (*no->callback)(bv); } else if (no) { if (!(nh_option_cache_flags & NHOF_NOCACHE) && (!no->value || strcmp(value, no->value))) { free(no->value); no->value = strdup(value); } if (no->addr) { free(*(char **)no->addr); *(char **)no->addr = strdup(value); } if (no->callback) (*no->callback)(value); } } static void nh_option_get(void) { int i; struct GTK_Option *p; if (!option_lock) { nh_option_cache_set("name", gtk_entry_get_text(GTK_ENTRY(entry_plname))); nh_option_cache_set("catname", gtk_entry_get_text(GTK_ENTRY(entry_catname))); nh_option_cache_set("dogname", gtk_entry_get_text(GTK_ENTRY(entry_dogname))); } nh_option_cache_set("fruit", gtk_entry_get_text(GTK_ENTRY(entry_fruit))); if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radio_k))) nh_option_cache_set("pettype", "cat"); else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radio_d))) nh_option_cache_set("pettype", "dog"); else nh_option_cache_set("pettype", "random"); if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radio_menu_t))) nh_option_cache_set("menustyle", "traditional"); else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radio_menu_c))) nh_option_cache_set("menustyle", "combination"); else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radio_menu_p))) nh_option_cache_set("menustyle", "partial"); else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radio_menu_f))) nh_option_cache_set("menustyle", "full"); for(i = 0; i < SIZE(gtk_option); i++) { char buf[BUFSIZ]; p = >k_option[i]; if (p->opt_name) { if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(p->radio1))) nh_option_cache_set_bool(p->option, TRUE); else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(p->radio2))) nh_option_cache_set_bool(p->option, FALSE); } } for(i = 0; i <= no_tileTab; i++) if (tileTab[i].data && gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(tileTab[i].data))){ nh_set_map_visual(i); break; } #ifdef GTK_PROXY proxy_cb_flush_screen(); #else flush_screen(cursx == u.ux && cursy == u.uy ? 1 : 0); #endif nh_option_cache_sync(); } static int nh_option_has_changed(void) { int i; struct GTK_Option *p; GtkWidget *button; char *s; boolean b; if (strcmp(nh_option_cache_get("name"), gtk_entry_get_text(GTK_ENTRY(entry_plname)))) return TRUE; if (strcmp(nh_option_cache_get("catname"), gtk_entry_get_text(GTK_ENTRY(entry_catname)))) return TRUE; if (strcmp(nh_option_cache_get("dogname"), gtk_entry_get_text(GTK_ENTRY(entry_dogname)))) return TRUE; if (strcmp(nh_option_cache_get("fruit"), gtk_entry_get_text(GTK_ENTRY(entry_fruit)))) return TRUE; s = nh_option_cache_get("pettype"); switch (*s) { case 'c': button = radio_k; break; case 'd': button = radio_d; break; default: button = radio_r; break; } if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button))) return TRUE; s = nh_option_cache_get("menustyle"); switch(*s) { case 'n': case 't': button = radio_menu_t; break; case 'c': button = radio_menu_c; break; case 'p': button = radio_menu_p; break; default: button = radio_menu_f; break; } if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button))) return TRUE; for (i = 0; i < SIZE(gtk_option); i++) { p = >k_option[i]; if (p->opt_name && p->option) { button = p->not ^ nh_option_cache_get_bool(p->option) ? p->radio1 : p->radio2; if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button))) return TRUE; } } i = nh_get_map_visual(); return !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(tileTab[i].data)); } static GtkWidget* nh_option_plname_new() { GtkWidget *frame; GtkWidget *vbox; GtkWidget *hbox, *hbox2; GtkWidget *label; frame = gtk_frame_new("Player"); vbox = nh_gtk_new_and_add(gtk_vbox_new(FALSE, 0), frame, ""); hbox = nh_gtk_new_and_pack(gtk_hbox_new(FALSE, 0), vbox, "", FALSE, FALSE, NH_PAD); label = nh_gtk_new_and_pack(gtk_label_new("Name:"), hbox, "", FALSE, FALSE, NH_PAD); entry_plname = nh_gtk_new_and_pack(gtk_entry_new_with_max_length(PL_NSIZ), hbox, "", FALSE, FALSE, NH_PAD); hbox2 = nh_gtk_new_and_pack(gtk_hbox_new(FALSE, 0), vbox, "", FALSE, FALSE, NH_PAD); gtk_widget_set_sensitive(GTK_WIDGET(label), !option_lock); return frame; } static GtkWidget * nh_option_pet_kitten_new() { GtkWidget *frame; GtkWidget *vbox; GtkWidget *hbox; GtkWidget *label; frame = gtk_frame_new("Kitten"); vbox = nh_gtk_new_and_add(gtk_vbox_new(FALSE, 0), frame, ""); hbox = nh_gtk_new_and_pack(gtk_hbox_new(FALSE, 0), vbox, "", FALSE, FALSE, NH_PAD); label = nh_gtk_new_and_pack(gtk_label_new("Name:"), hbox, "", FALSE, FALSE, NH_PAD); entry_catname = nh_gtk_new_and_pack(gtk_entry_new_with_max_length(PL_NSIZ), hbox, "", FALSE, FALSE, NH_PAD); gtk_widget_set_sensitive(GTK_WIDGET(label), !option_lock); return frame; } static GtkWidget * nh_option_pet_dog_new() { GtkWidget *frame; GtkWidget *vbox; GtkWidget *hbox; GtkWidget *label; frame = gtk_frame_new("Dog"); vbox = nh_gtk_new_and_add(gtk_vbox_new(FALSE, 0), frame, ""); hbox = nh_gtk_new_and_pack(gtk_hbox_new(FALSE, 0), vbox, "", FALSE, FALSE, NH_PAD); label = nh_gtk_new_and_pack(gtk_label_new("Name:"), hbox, "", FALSE, FALSE, NH_PAD); entry_dogname = nh_gtk_new_and_pack(gtk_entry_new_with_max_length(PL_NSIZ), hbox, "", FALSE, FALSE, NH_PAD); gtk_widget_set_sensitive(GTK_WIDGET(label), !option_lock); return frame; } static GtkWidget * nh_option_pet_new() { GtkWidget *frame; GtkWidget *label; GtkWidget *vbox; GtkWidget *hbox, *hbox2; GtkWidget *kitten; GtkWidget *dog; GSList *pet_group = NULL; frame = gtk_frame_new("Pet"); vbox = nh_gtk_new_and_add(gtk_vbox_new(FALSE, 0), frame, ""); hbox = nh_gtk_new_and_pack(gtk_hbox_new(FALSE, 0), vbox, "", FALSE, FALSE, NH_PAD); kitten = nh_gtk_new_and_pack(nh_option_pet_kitten_new(), hbox, "", FALSE, FALSE, NH_PAD); dog = nh_gtk_new_and_pack(nh_option_pet_dog_new(), hbox, "", FALSE, FALSE, NH_PAD); hbox2 = nh_gtk_new_and_pack(gtk_hbox_new(FALSE, 0), vbox, "", FALSE, FALSE, NH_PAD); label = nh_gtk_new_and_pack(gtk_label_new("Start with:"), hbox2, "", FALSE, FALSE, NH_PAD); radio_k = nh_gtk_new_and_pack( gtk_radio_button_new_with_label(pet_group, "Kitten"), hbox2, "", FALSE, FALSE, NH_PAD); pet_group = gtk_radio_button_group(GTK_RADIO_BUTTON(radio_k)); radio_d = nh_gtk_new_and_pack( gtk_radio_button_new_with_label(pet_group, "Dog"), hbox2, "", FALSE, FALSE, NH_PAD); pet_group = gtk_radio_button_group(GTK_RADIO_BUTTON(radio_d)); radio_r = nh_gtk_new_and_pack( gtk_radio_button_new_with_label(pet_group, "Random"), hbox2, "", FALSE, FALSE, NH_PAD); pet_group = gtk_radio_button_group(GTK_RADIO_BUTTON(radio_r)); gtk_widget_set_sensitive(GTK_WIDGET(radio_k), !option_lock); gtk_widget_set_sensitive(GTK_WIDGET(radio_d), !option_lock); gtk_widget_set_sensitive(GTK_WIDGET(radio_r), !option_lock); return frame; } static GtkWidget * nh_option_fruit_new() { GtkWidget *frame; GtkWidget *vbox; GtkWidget *hbox; GtkWidget *label; frame = gtk_frame_new("Fruit"); vbox = nh_gtk_new_and_add(gtk_vbox_new(FALSE, 0), frame, ""); hbox = nh_gtk_new_and_pack(gtk_hbox_new(FALSE, 0), vbox, "", FALSE, FALSE, NH_PAD); label = nh_gtk_new_and_pack(gtk_label_new("Name:"), hbox, "", FALSE, FALSE, NH_PAD); entry_fruit = nh_gtk_new_and_pack(gtk_entry_new_with_max_length(PL_NSIZ), hbox, "", FALSE, FALSE, NH_PAD); return frame; } static GtkWidget * nh_option_menu_new() { GtkWidget *frame; GtkWidget *vbox; GtkWidget *hbox; GSList *menu_group = NULL; frame = gtk_frame_new("Menu style"); vbox = nh_gtk_new_and_add(gtk_vbox_new(FALSE, 0), frame, ""); hbox = nh_gtk_new_and_pack(gtk_hbox_new(FALSE, 0), vbox, "", FALSE, FALSE, NH_PAD); radio_menu_t = nh_gtk_new_and_pack( gtk_radio_button_new_with_label(menu_group, "Traditional"), hbox, "", FALSE, FALSE, NH_PAD); menu_group = gtk_radio_button_group(GTK_RADIO_BUTTON(radio_menu_t)); radio_menu_p = nh_gtk_new_and_pack( gtk_radio_button_new_with_label(menu_group, "Partial"), hbox, "", FALSE, FALSE, NH_PAD); menu_group = gtk_radio_button_group(GTK_RADIO_BUTTON(radio_menu_t)); radio_menu_c = nh_gtk_new_and_pack( gtk_radio_button_new_with_label(menu_group, "Combination"), hbox, "", FALSE, FALSE, NH_PAD); menu_group = gtk_radio_button_group(GTK_RADIO_BUTTON(radio_menu_t)); radio_menu_f = nh_gtk_new_and_pack( gtk_radio_button_new_with_label(menu_group, "Full"), hbox, "", FALSE, FALSE, NH_PAD); menu_group = gtk_radio_button_group(GTK_RADIO_BUTTON(radio_menu_t)); return frame; } static GtkWidget * nh_option_player_new() { GtkWidget *vbox; vbox = gtk_vbox_new(FALSE, 0); gtk_container_border_width(GTK_CONTAINER(vbox), NH_PAD); nh_gtk_new_and_pack(nh_option_plname_new(), vbox, "", FALSE, FALSE, NH_PAD); nh_gtk_new_and_pack(nh_option_pet_new(), vbox, "", FALSE, FALSE, NH_PAD); nh_gtk_new_and_pack(nh_option_fruit_new(), vbox, "", FALSE, FALSE, NH_PAD); return vbox; } static GtkWidget * nh_option_game_new() { int i; GtkWidget *htmp; GtkWidget *ltmp; GtkWidget *stmp; GtkWidget *tbl; struct GTK_Option *p; tbl = gtk_table_new(sizeof(gtk_option)/sizeof(struct GTK_Option)*2, 3, FALSE); gtk_container_border_width(GTK_CONTAINER(tbl), NH_PAD); for(i = 0; i < SIZE(gtk_option); i++) { p = >k_option[i]; p->group = NULL; if (p->opt_name) { htmp = nh_gtk_new_and_attach(gtk_hbox_new(FALSE, 0), tbl, "", 0, 1, i * 2, i * 2 + 1); ltmp = nh_gtk_new_and_pack(gtk_label_new(p->opt_name), htmp, "", FALSE, FALSE, NH_PAD); htmp = nh_gtk_new_and_attach(gtk_hbox_new(FALSE, 0), tbl, "", 1, 2, i * 2, i * 2 +1); p->radio1 = nh_gtk_new_and_pack( gtk_radio_button_new_with_label(p->group, p->on), htmp, "", FALSE, FALSE, 0); p->group = gtk_radio_button_group(GTK_RADIO_BUTTON(p->radio1)); htmp = nh_gtk_new_and_attach(gtk_hbox_new(FALSE, 0), tbl, "", 2, 3, i * 2, i * 2 +1); p->radio2 = nh_gtk_new_and_pack( gtk_radio_button_new_with_label(p->group, p->off), htmp, "", FALSE, FALSE, 0); p->group = gtk_radio_button_group(GTK_RADIO_BUTTON(p->radio2)); } else stmp = nh_gtk_new_and_attach(gtk_hseparator_new(), tbl, "", 0, 3, i * 2 +1, i * 2 +2); } return tbl; } static GtkWidget * nh_option_visual_new() { GtkWidget *frame; GtkWidget *vbox; GtkWidget *hbox; GSList *menu_group = NULL; int i; frame = gtk_frame_new("Map visual"); vbox = nh_gtk_new_and_add(gtk_vbox_new(FALSE, 0), frame, ""); hbox = nh_gtk_new_and_pack(gtk_hbox_new(FALSE, 0), vbox, "", FALSE, FALSE, NH_PAD); if (!nh_check_map_visual(0)) { tileTab[0].data = nh_gtk_new_and_pack( gtk_radio_button_new_with_label(menu_group, "Characters"), hbox, "", FALSE, FALSE, NH_PAD); menu_group = gtk_radio_button_group(GTK_RADIO_BUTTON(tileTab[0].data)); } else tileTab[0].data = NULL; for(i = 1; i <= no_tileTab; i++) { if (!nh_check_map_visual(i)) { tileTab[i].data = nh_gtk_new_and_pack( gtk_radio_button_new_with_label(menu_group, tileTab[i].ident), hbox, "", FALSE, FALSE, NH_PAD); menu_group = gtk_radio_button_group(GTK_RADIO_BUTTON(tileTab[i].data)); } else tileTab[i].data = NULL; } gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(tileTab[nh_get_map_visual()].data), TRUE); return frame; } static GtkWidget * nh_option_display_new() { GtkWidget *vbox; vbox = gtk_vbox_new(FALSE, 0); gtk_container_border_width(GTK_CONTAINER(vbox), NH_PAD); nh_gtk_new_and_pack(nh_option_menu_new(), vbox, "", FALSE, FALSE, NH_PAD); nh_gtk_new_and_pack(nh_option_visual_new(), vbox, "", FALSE, FALSE, NH_PAD); return vbox; } void nh_option_new() { guint hid; GtkWidget *w; GtkWidget *note; GtkWidget *vbox, *hbox; GtkWidget *button1; GtkWidget *button2; GtkWidget *button3; w = nh_gtk_window_dialog(FALSE); gtk_container_border_width(GTK_CONTAINER(w), NH_PAD); nh_gtk_focus_set_master(GTK_WINDOW(w), GTK_SIGNAL_FUNC(default_key_press), 0, TRUE); hid = gtk_signal_connect(GTK_OBJECT(w), "destroy", GTK_SIGNAL_FUNC(default_destroy), &hid); nh_position_popup_dialog(GTK_WIDGET(w)); vbox = nh_gtk_new_and_add(gtk_vbox_new(FALSE, 0), w, ""); note = nh_gtk_new_and_pack(gtk_notebook_new(), vbox, "", FALSE, FALSE, NH_PAD); nh_gtk_new_and_add(nh_option_player_new(), note, ""); nh_gtk_new_and_add(nh_option_game_new(), note, ""); nh_gtk_new_and_add(nh_option_display_new(), note, ""); gtk_notebook_set_tab_label_text(GTK_NOTEBOOK(note), gtk_notebook_get_nth_page(GTK_NOTEBOOK(note), 0), "Player"); gtk_notebook_set_tab_label_text(GTK_NOTEBOOK(note), gtk_notebook_get_nth_page(GTK_NOTEBOOK(note), 1), "Game"); gtk_notebook_set_tab_label_text(GTK_NOTEBOOK(note), gtk_notebook_get_nth_page(GTK_NOTEBOOK(note), 2), "Misc"); hbox = nh_gtk_new_and_pack(gtk_hbox_new(FALSE, 0), vbox, "", FALSE, FALSE, NH_PAD); button1 = nh_gtk_new_and_pack(gtk_button_new_from_stock(GTK_STOCK_OK), hbox, "", FALSE, FALSE, NH_PAD); button3 = nh_gtk_new_and_pack(gtk_button_new_with_label("More Options"), hbox, "", FALSE, FALSE, NH_PAD); button2 = nh_gtk_new_and_pack(gtk_button_new_from_stock(GTK_STOCK_CANCEL), hbox, "", FALSE, FALSE, NH_PAD); gtk_signal_connect(GTK_OBJECT(button1), "clicked", GTK_SIGNAL_FUNC(default_clicked), (gpointer)'\n'); gtk_signal_connect(GTK_OBJECT(button2), "clicked", GTK_SIGNAL_FUNC(default_clicked), (gpointer)'\033'); gtk_signal_connect(GTK_OBJECT(button3), "clicked", GTK_SIGNAL_FUNC(default_clicked), (gpointer)'m'); nh_option_set(); gtk_entry_set_editable(GTK_ENTRY(entry_plname), !option_lock); gtk_entry_set_editable(GTK_ENTRY(entry_dogname), !option_lock); gtk_entry_set_editable(GTK_ENTRY(entry_catname), !option_lock); gtk_widget_set_sensitive(GTK_WIDGET(entry_plname), !option_lock); gtk_widget_set_sensitive(GTK_WIDGET(entry_dogname), !option_lock); gtk_widget_set_sensitive(GTK_WIDGET(entry_catname), !option_lock); gtk_widget_show_all(w); gtk_main(); if (keysym == '\n') nh_option_get(); if (hid > 0) { gtk_signal_disconnect(GTK_OBJECT(w), hid); gtk_widget_destroy(w); } } void nh_option_lock(boolean lock) { option_lock = lock; } slashem-0.0.7E7F3/win/gtk/gtkext.c0000664000076400007640000000374010545462317014714 0ustar aliali/* $Id: gtkext.c,v 1.4 2003/10/25 18:06:01 j_ali Exp $ */ /* GTK+ NetHack Copyright (c) Issei Numata 1999-2000 Copyright (c) Slash'EM Development Team 2001-2003 GTK+ NetHack may be freely redistributed. See license for details. */ /* * This module contains everything that is only needed for the external * interface (ie., when linking the GTK interface seperately from the game * executable). */ #include "winGTK.h" #include "prxyclnt.h" static void v_hook(); static int GTK_ext_message_menu(int let, int how, const char *mesg); struct window_ext_procs GTK_ext_procs = { "gtk", GTK_ext_init_nhwindows, GTK_ext_player_selection, GTK_ext_askname, NULL, /* get_nh_event */ GTK_exit_nhwindows, NULL, /* suspend_nhwindows */ NULL, /* resume_nhwindows */ GTK_create_nhwindow, GTK_ext_clear_nhwindow, GTK_display_nhwindow, GTK_destroy_nhwindow, GTK_curs, GTK_putstr, GTK_ext_display_file, GTK_start_menu, GTK_ext_add_menu, GTK_end_menu, GTK_ext_select_menu, GTK_ext_message_menu, GTK_update_inventory, NULL, /* mark_sync */ NULL, /* wait_sync */ GTK_cliparound, NULL, /* update_positionbar */ GTK_ext_print_glyph, GTK_raw_print, GTK_raw_print_bold, GTK_nhgetch, GTK_nh_poskey, NULL, /* nhbell */ NULL, /* doprev_message */ GTK_ext_yn_function, GTK_ext_getlin, GTK_get_ext_cmd, GTK_number_pad, GTK_delay_output, NULL, /* change_color */ NULL, /* change_background */ NULL, /* set_font_name */ NULL, /* get_color_string */ NULL, /* start_screen,*/ NULL, /* end_screen,*/ GTK_ext_outrip, GTK_ext_preference_update, GTK_ext_status, GTK_ext_print_glyph_layered, #ifdef GTKHACK GTK_ext_send_config_file, #else v_hook, /* send_config_file */ #endif }; static void v_hook() { } /*ARGSUSED*/ static int GTK_ext_message_menu(int let, int how, const char *mesg) { pline("%s", mesg); return 0; } slashem-0.0.7E7F3/win/gtk/gtk.c0000664000076400007640000032070510545462317014176 0ustar aliali/* $Id: gtk.c,v 1.53.2.4 2005/01/22 19:09:35 j_ali Exp $ */ /* GTK+ NetHack Copyright (c) Issei Numata 1999-2000 Copyright (c) Slash'EM Development Team 2001-2004 GTK+ NetHack may be freely redistributed. See license for details. */ /* #define DEBUG */ /* Uncomment for debugging */ /* #define DEBUG_SESSION */ /* For debugging session windows */ #include #include #ifdef WIN32 #include #endif #include "md5.h" #include "winGTK.h" #include "wintype.h" #include "func_tab.h" #include "dlb.h" #ifdef SHORT_FILENAMES #include "patchlev.h" #else #include "patchlevel.h" #endif #include "proxycb.h" #include "prxyclnt.h" int GTK_initialized; static int display_inventory_needed; static int in_topten; static int in_player_selection; static void select_player(GtkWidget *w, guint data); static void key_command(GtkWidget *w, gpointer data); static void move_command(GtkWidget *w, gpointer data); static void fight_command(GtkWidget *w, gpointer data); static void ext_command(GtkWidget *w, gpointer data); static void game_option(GtkWidget *w, gpointer data); static void game_preferences(GtkWidget *w, gpointer data); static void game_quit(GtkWidget *w, gpointer data); static void game_topten(GtkWidget *w, gpointer data); #ifdef GTKHACK static void game_troubleshooting(GtkWidget *widget, gpointer data); #endif static void nh_menu_sensitive(char *menu, boolean f); static int GTK_display_file(char *name); static void GTK_display_inventory(void); static void help_help(GtkWidget *w, gpointer data); static void help_shelp(GtkWidget *w, gpointer data); static void help_option(GtkWidget *w, gpointer data); static void help_je(GtkWidget *w, gpointer data); static void help_history(GtkWidget *w, gpointer data); static void help_license(GtkWidget *w, gpointer data); static void text_destroy_all(void); #define GTK_NORTH 0 #define GTK_EAST 1 #define GTK_SOUTH 2 #define GTK_WEST 3 #define GTK_NORTHEAST 4 #define GTK_NORTHWEST 5 #define GTK_SOUTHEAST 6 #define GTK_SOUTHWEST 7 NHWindow gtkWindows[MAXWIN]; struct nbtw *non_blocking_text_windows; /* * The Gtk interface maintains information about most top level windows * so that it can be saved in the profile between sessions. */ struct session_window_info { const char *name; /* The name is only used in the rc file */ unsigned int flags; GdkRectangle bounding; /* Position and size */ int ox, oy; /* Offset between set_geometry and configure */ GtkRequisition requisition; /* Most recent requisition request */ } session_window_info[] = { {"main", NH_SESSION_RESIZABLE, }, {"radar", 0, }, {"inventory", NH_SESSION_RESIZABLE, }, }; static gchar *help_font_name = NULL; static winid rawprint_win = WIN_ERR; GtkAccelGroup *accel_group=NULL; GtkWidget *main_window, *main_vbox; #ifdef WINGTK_RADAR static GtkWidget *main_radar; #endif static GtkItemFactory *main_item_factory; int root_width; int root_height; static int exiting = 0; GdkColor nh_color[N_NH_COLORS] = { /* * Standard NetHack colours (CLR_...) * Note: black & white may be remapped depending on map background */ {0, 0*257, 0*257, 0*257,}, /* black */ {0, 255*257, 0*257, 0*257,}, /* red */ {0, 152*257, 251*257, 152*257,}, /* pale green */ {0, 165*257, 42*257, 42*257,}, /* brown */ {0, 0*257, 0*257, 255*257,}, /* blue */ {0, 255*257, 0*257, 255*257,}, /* magenta */ {0, 224*257, 255*257, 255*257,}, /* light cyan */ {0, 190*257, 190*257, 190*257,}, /* gray */ {1, 0*257, 0*257, 0*257,}, /* default */ {0, 255*257, 165*257, 0*257,}, /* orange */ {0, 0*257, 255*257, 0*257,}, /* green */ {0, 255*257, 255*257, 0*257,}, /* yellow */ {0, 65*257, 105*257, 225*257,}, /* royal blue */ {0, 238*257, 130*257, 238*257,}, /* violet */ {0, 0*257, 255*257, 255*257,}, /* cyan */ {0, 255*257, 255*257, 255*257,}, /* white */ /* * Local additions (MAP_...) */ {0, 0*257, 100*257, 0*257,}, /* dark green */ {0, 0*257, 0*257, 0*257,}, /* fixed black */ {0, 255*257, 255*257, 255*257,}, /* fixed white */ }; #ifdef GTK_PROXY static struct proxycb_get_player_choices_res *player_choices = NULL; #endif char * GTK_ext_askname() { return GTK_getline("Who are you? ", FALSE); } static GtkItemFactoryEntry mainmenu_items[] = { {"/Game", NULL, NULL, 0, ""}, {"/Game/Gtear1", NULL, NULL, 0, ""}, {"/Game/Play", NULL, NULL, 0, ""}, {"/Game/Gsep1", NULL, NULL, 0, ""}, {"/Game/Save", "S", key_command, 'S', NULL}, {"/Game/Option", "O", game_option, 'O', NULL}, {"/Game/Preferences", NULL, game_preferences, 0, NULL}, {"/Game/Score", NULL, game_topten, 0, NULL}, #ifdef GTKHACK {"/Game/Troubleshooting", NULL, game_troubleshooting, 0,NULL}, #endif {"/Game/Gsep2", NULL, NULL, 0, ""}, {"/Game/Quit", NULL, game_quit, 0, NULL}, }; static GtkItemFactoryEntry *menu_items; static int nmenu_items; static GtkItemFactoryEntry helpmenu_items[] = { {"/Help", NULL, NULL, 0, ""}, {"/Help/Htear1", NULL, NULL, 0, ""}, {"/Help/Command Help", NULL, help_help, 0, NULL}, {"/Help/Key Help", NULL, help_shelp, 0, NULL}, {"/Help/Option Help", NULL, help_option, 0, NULL}, {"/Help/sep3", NULL, NULL, 0, ""}, {"/Help/History", NULL, help_history, 0, NULL}, {"/Help/License", NULL, help_license, 0, NULL}, }; static GtkItemFactoryEntry playmenu_items[] = { {"/Move", NULL, NULL, 0, ""}, {"/Move/Mtear1", NULL, NULL, 0, ""}, {"/Move/North", NULL, move_command, GTK_NORTH, NULL}, {"/Move/East", NULL, move_command, GTK_EAST, NULL}, {"/Move/South", NULL, move_command, GTK_SOUTH, NULL}, {"/Move/West", NULL, move_command, GTK_WEST, NULL}, {"/Move/Northeast", NULL, move_command, GTK_NORTHEAST, NULL}, {"/Move/Northwest", NULL, move_command, GTK_NORTHWEST, NULL}, {"/Move/Southeast", NULL, move_command, GTK_SOUTHEAST, NULL}, {"/Move/Southwest", NULL, move_command, GTK_SOUTHWEST, NULL}, {"/Move/Down", "greater", key_command, '>', NULL}, {"/Move/Up", "less", key_command, '<', NULL}, {"/Fight", NULL, NULL, 0, ""}, {"/Fight/Ftear1", NULL, NULL, 0, ""}, {"/Fight/North", NULL, fight_command, GTK_NORTH, NULL}, {"/Fight/East", NULL, fight_command, GTK_EAST, NULL}, {"/Fight/South", NULL, fight_command, GTK_SOUTH, NULL}, {"/Fight/West", NULL, fight_command, GTK_WEST, NULL}, {"/Fight/Northeast", NULL, fight_command, GTK_NORTHEAST, NULL}, {"/Fight/Northwest", NULL, fight_command, GTK_NORTHWEST, NULL}, {"/Fight/Southeast", NULL, fight_command, GTK_SOUTHEAST, NULL}, {"/Fight/Southwest", NULL, fight_command, GTK_SOUTHWEST, NULL}, {"/Check", NULL, NULL, 0, ""}, {"/Check/Ctear1", NULL, NULL, 0, ""}, {"/Check/Here", "colon", key_command, ':', NULL}, {"/Check/There", "semicolon", key_command, ';', NULL}, {"/Check/Trap", "asciicircum", key_command, '^', NULL}, {"/Equip", NULL, NULL, 0, ""}, {"/Equip/Etear1", NULL, NULL, 0, ""}, {"/Equip/Wield", "w", key_command, 'w', NULL}, {"/Equip/Exchange weapons", "x", key_command, 'x', NULL}, {"/Equip/Two-handed", NULL, ext_command, EXT_CMD_TWOWEAPON, NULL}, {"/Equip/Quiver", "Q", key_command, 'Q', NULL}, {"/Equip/Wear", "w", key_command, 'W', NULL}, {"/Equip/Take off", "T", key_command, 'T', NULL}, {"/Equip/Puton", "p", key_command, 'P', NULL}, {"/Equip/Remove", "r", key_command, 'R', NULL}, {"/You", NULL, NULL, 0, ""}, {"/You/Ytear1", NULL, NULL, 0, ""}, {"/You/Inventory", "i", key_command, 'i', NULL}, {"/You/Weapon", "parenright", key_command, ')', NULL}, {"/You/Armor", "bracketleft", key_command, '[', NULL}, {"/You/Ring", "equal", key_command, '=', NULL}, {"/You/Amulet", "quotedbl", key_command, '"', NULL}, {"/You/Tool", "parenleft", key_command, '(', NULL}, {"/You/Spells", "plus", key_command, '+', NULL}, {"/You/Known Item", "backslash", key_command, '\\', NULL}, {"/You/Conduct", NULL, ext_command, EXT_CMD_CONDUCT, NULL}, {"/Adventure", NULL, NULL, 0, ""}, {"/Adventure/ADtear1", NULL, NULL, 0, ""}, {"/Adventure/Name", "n", key_command, 'n' | 0x80, NULL}, {"/Adventure/Call", "C", key_command, 'C', NULL}, {"/Adventure/Adjust", "a", key_command, 'a' | 0x80, NULL}, {"/Action", NULL, NULL, 0, ""}, {"/Action/ACtear1", NULL, NULL, 0, ""}, {"/Action/Rest", "period", key_command, '.', NULL}, {"/Action/Search", "s", key_command, 's', NULL}, {"/Action/Eat", "e", key_command, 'e', NULL}, {"/Action/Asep1", NULL, NULL, 0, ""}, {"/Action/Open", "o", key_command, 'o', NULL}, {"/Action/Close", "c", key_command, 'c', NULL}, {"/Action/Asep2", NULL, NULL, 0, ""}, {"/Action/Pickup", "comma", key_command, ',', NULL}, {"/Action/Drop", "d", key_command, 'd', NULL}, {"/Action/Loot", "l", key_command, 'l' | 0x80, NULL}, {"/Action/Apply", "a", key_command, 'a', NULL}, {"/Action/Kick", "D", key_command, '\04', NULL}, {"/Action/Throw", "t", key_command, 't', NULL}, {"/Action/Fire", "f", key_command, 'f', NULL}, {"/Action/Asep3", NULL, NULL, 0, ""}, {"/Action/Drink", "q", key_command, 'q', NULL}, {"/Action/Read", "r", key_command, 'r', NULL}, {"/Action/Cast Spell", "Z", key_command, 'Z', NULL}, {"/Action/Zap", "z", key_command, 'z', NULL}, {"/Action/Dip", "d", key_command, 'd' | 0x80, NULL}, {"/Action/Sit", "s", key_command, 's' | 0x80, NULL}, {"/Religion", NULL, NULL, 0, ""}, {"/Religion/Rtear1", NULL, NULL, 0, ""}, {"/Religion/Pray", "p", key_command, 'p' | 0x80, NULL}, {"/Religion/Offer", "o", key_command, 'o' | 0x80, NULL}, {"/Special", NULL, NULL, 0, ""}, {"/Special/Stear1", NULL, NULL, 0, ""}, {"/Special/Engrave", "E", key_command, 'E', NULL}, {"/Special/Pay", "p", key_command, 'p', NULL}, {"/Special/Borrow", "b", key_command, 'b' | 0x80, NULL}, {"/Special/Chat", "c", key_command, 'c' | 0x80, NULL}, {"/Special/Enhance", "e", key_command, 'e' | 0x80, NULL}, {"/Special/Force", "f", key_command, 'f' | 0x80, NULL}, {"/Special/Invoke", "i", key_command, 'i' | 0x80, NULL}, {"/Special/Monster", "m", key_command, 'm' | 0x80, NULL}, {"/Special/Ride", NULL, ext_command, EXT_CMD_RIDE, NULL}, {"/Special/Rub", "r", key_command, 'r' | 0x80, NULL}, {"/Special/Wipe", "w", key_command, 'w' | 0x80, NULL}, {"/Special/Technique", "t", key_command, 't' | 0x80, NULL}, {"/Special/Teleport", "t", key_command, '', NULL}, {"/Special/Turn", NULL, ext_command, EXT_CMD_TURN, NULL}, {"/Special/Untrap", "u", key_command, 'u' | 0x80, NULL}, {"/Special/Jump", "j", key_command, 'j' | 0x80, NULL}, }; void win_GTK_init() { } /* * Non-modal dialog windows use a partial grab system whereby a number of * events which would normally be passed to other widgets are blocked, but * still allows scrolling etc. */ static gint nh_dialog_partial_grab(GtkWidget *widget, gpointer data) { boolean enable = !GPOINTER_TO_INT(data); #if GTK_CHECK_VERSION(1,3,12) if (enable) gtk_window_add_accel_group(GTK_WINDOW(main_window), accel_group); else gtk_window_remove_accel_group(GTK_WINDOW(main_window), accel_group); #else if (enable) gtk_accel_group_attach(accel_group, G_OBJECT(main_window)); else gtk_accel_group_detach(accel_group, G_OBJECT(main_window)); #endif nh_menu_sensitive("/Game", enable); nh_menu_sensitive("/Move", enable); nh_menu_sensitive("/Fight", enable); nh_menu_sensitive("/Check", enable); nh_menu_sensitive("/Equip", enable); nh_menu_sensitive("/You", enable); nh_menu_sensitive("/Adventure", enable); nh_menu_sensitive("/Action", enable); nh_menu_sensitive("/Religion", enable); nh_menu_sensitive("/Special", enable); nh_menu_sensitive("/Help", enable); return 0; } GtkWidget *nh_gtk_window_dialog(boolean is_modal) { GtkWidget *w; w = gtk_window_new(GTK_WINDOW_TOPLEVEL); if (w) { gtk_window_set_transient_for(GTK_WINDOW(w), GTK_WINDOW(main_window)); gtk_window_set_modal(GTK_WINDOW(w), is_modal); if (!is_modal) { nh_dialog_partial_grab(w, GINT_TO_POINTER(1)); gtk_signal_connect(GTK_OBJECT(w), "destroy", GTK_SIGNAL_FUNC(nh_dialog_partial_grab), 0); } #if GTK_CHECK_VERSION(1,3,2) gtk_window_set_destroy_with_parent(GTK_WINDOW(w), TRUE); #endif } return w; } GtkWidget * nh_gtk_new(GtkWidget *w, GtkWidget *parent, gchar *lbl) { #if 0 /* [ALI] Removed this code, it doesn't seem to achive anything */ gtk_widget_ref(w); gtk_object_set_data_full(GTK_OBJECT(parent), lbl, w, (GtkDestroyNotify)gtk_widget_unref); #endif gtk_widget_show(w); return w; } GtkWidget * nh_gtk_new_and_add(GtkWidget *w, GtkWidget *parent, gchar *lbl) { #if 0 gtk_widget_ref(w); gtk_object_set_data_full(GTK_OBJECT(parent), lbl, w, (GtkDestroyNotify)gtk_widget_unref); #endif gtk_widget_show(w); gtk_container_add(GTK_CONTAINER(parent), w); return w; } GtkWidget * nh_gtk_new_and_pack(GtkWidget *w, GtkWidget *parent, gchar *lbl, gboolean a1, gboolean a2, guint a3) { #if 0 gtk_widget_ref(w); gtk_object_set_data_full(GTK_OBJECT(parent), lbl, w, (GtkDestroyNotify)gtk_widget_unref); #endif gtk_widget_show(w); gtk_box_pack_start(GTK_BOX(parent), w, a1, a2, a3); return w; } GtkWidget * nh_gtk_new_and_attach(GtkWidget *w, GtkWidget *parent, gchar *lbl, guint a1, guint a2, guint a3, guint a4) { #if 0 gtk_widget_ref(w); gtk_object_set_data_full(GTK_OBJECT(parent), lbl, w, (GtkDestroyNotify)gtk_widget_unref); #endif gtk_widget_show(w); gtk_table_attach_defaults(GTK_TABLE(parent), w, a1, a2, a3, a4); return w; } GtkWidget * nh_gtk_new_and_attach2(GtkWidget *w, GtkWidget *parent, gchar *lbl, guint a1, guint a2, guint a3, guint a4, GtkAttachOptions a5, GtkAttachOptions a6, guint a7, guint a8) { #if 0 gtk_widget_ref(w); gtk_object_set_data_full(GTK_OBJECT(parent), lbl, w, (GtkDestroyNotify)gtk_widget_unref); #endif gtk_widget_show(w); gtk_table_attach(GTK_TABLE(parent), w, a1, a2, a3, a4, a5, a6, a7, a8); return w; } int nh_keysym(GdkEventKey *ev) { int ret; switch(ev->keyval) { case GDK_Return: case GDK_KP_Enter: ret = '\n'; break; case GDK_Escape: ret = '\033'; break; default: if (ev->length) ret = ev->string[0]; else ret = 0; } return ret; } static void nh_menu_sensitive(char *menu, boolean f) { GtkWidget *p; p = gtk_item_factory_get_widget(main_item_factory, menu); gtk_widget_set_sensitive(p, f); } /* ALI * We need to know the border width and height so that we can correctly * clamp dialogs to the screen. Unfortunately, GDK allows us no way to * determine the border sizes before we map the window. We get around this * by remembering what they were for the last dialog displayed and * checking that they haven't changed after the window is mapped. If * we find we're offscreen after mapping we have to re-position the * window. Clumsy, but effective. * * Note: there's no way that I know of to determine the width of the * right border or the height of the bottom border. For now, we just * assume that these are both equal to the left border. Typically, * only the top border is different and this is a valid assumption. * * This is all further complicated by the fact that, at least under * the Enlightenment window manager, gtk_widget_set_uposition() sets * the position of the top left pixel of the border before the window * is mapped, but the top left pixel of the window after it is mapped. * * Note: If the window manager is set up such that gtk_widget_set_upostion() * always sets the position of the left left pixel of the window, and if * gtk_window_get_origin() returns this same position, then this code * will fail (gracefully) and dialogs may be positioned with their borders * just off-screen. */ static gint popup_dialog_bw = 0, popup_dialog_bh = 0; static void popup_dialog_mapped(GtkWidget *w, gpointer data) { gint screen_width, screen_height; GdkWindow *window = GTK_WIDGET(w)->window; GTimer *t; gulong ms; int abandon = 0; gint x, y, nx, ny; data = gtk_object_get_user_data(GTK_OBJECT(w)); if (data) { x = GPOINTER_TO_UINT(data) >> 16; y = GPOINTER_TO_UINT(data) & 0xffff; t = g_timer_new(); if (!t) return; /* Wait for Window Manager to place window and add borders */ g_timer_start(t); do { if (abandon) { g_timer_destroy(t); return; } (void)g_timer_elapsed(t, &ms); if (ms >= 500) abandon++; /* But only after one final check */ gdk_window_get_origin(window, &nx, &ny); } while (nx == 0 && ny == 0 || nx == x && ny == y); g_timer_destroy(t); popup_dialog_bw = nx - x; popup_dialog_bh = ny - y; /* Do we need to re-position this window to stay on-screen? */ screen_width = gdk_screen_width(); screen_height = gdk_screen_height(); if (nx + popup_dialog_bw + w->allocation.width > screen_width) x = screen_width - popup_dialog_bw - w->allocation.width; else x = nx; if (ny + popup_dialog_bw + w->allocation.height > screen_height) /* popup_dialog_bw because we assume bottom border same as left */ y = screen_height - popup_dialog_bw - w->allocation.height; else y = ny; if (x != nx || y != ny) gtk_widget_set_uposition(w, x, y); } } static void popup_dialog_realizing(GtkWidget *w, gpointer data) { GdkWindow *window = GTK_WIDGET(main_window)->window; gint x, y, width, height, ox, oy; gint screen_width = gdk_screen_width(), screen_height = gdk_screen_height(); if (w->allocation.width > screen_width || w->allocation.height > screen_height) { /* This is going to look bad anyway, we can't centre it because * a position less than 0 is not valid, so the best we can do * is place the pop-up at the top left of the screen and accept * that the right and/or bottom edge will be off-screen. */ x = y = 0; } else { gdk_window_get_geometry(window, &x, &y, &width, &height, NULL); gdk_window_get_origin(window, &ox, &oy); x += ox + (width - w->allocation.width) / 2; y += oy + (height - w->allocation.height) / 2; if (x + w->allocation.width + popup_dialog_bw > screen_width) x = screen_width - popup_dialog_bw - w->allocation.width; if (y + w->allocation.height + popup_dialog_bw > screen_height) y = screen_height - popup_dialog_bw - w->allocation.height; /* (x,y) is the desired position of the window, * adjust to take into account the expected border. */ x -= popup_dialog_bw; y -= popup_dialog_bh; if (x < 0) x = 0; if (y < 0) y = 0; } gtk_widget_set_uposition(w, x, y); gtk_object_set_user_data(GTK_OBJECT(w), GUINT_TO_POINTER(x << 16 | y)); } void nh_position_popup_dialog(GtkWidget *w) { if (GTK_WIDGET_REALIZED(w)) popup_dialog_realizing(w, 0); if (GTK_WIDGET_MAPPED(w)) popup_dialog_mapped(w, 0); gtk_signal_connect(GTK_OBJECT(w), "realize", GTK_SIGNAL_FUNC(popup_dialog_realizing), 0); gtk_signal_connect_after(GTK_OBJECT(w), "map", GTK_SIGNAL_FUNC(popup_dialog_mapped), 0); } static int session_window_dump(FILE *fp, int i, const char *tag) { fprintf(fp, "%s(%s): flags:", tag, session_window_info[i].name); if (session_window_info[i].flags & NH_SESSION_RESIZABLE) fprintf(fp, " resizable"); if (session_window_info[i].flags & NH_SESSION_USER_POS) fprintf(fp, " user-pos"); if (session_window_info[i].flags & NH_SESSION_USER_SIZE) fprintf(fp, " user-size"); if (session_window_info[i].flags & NH_SESSION_PLACED) fprintf(fp, " placed"); fputc('\n', fp); fprintf(fp, "bounding is %d x %d @ (%d, %d)\n", session_window_info[i].bounding.width, session_window_info[i].bounding.height, session_window_info[i].bounding.x, session_window_info[i].bounding.y); fprintf(fp, "requistion is %d x %d\n", session_window_info[i].requisition.width, session_window_info[i].requisition.height); fprintf(fp, "Offset is (%d, %d)\n", session_window_info[i].ox, session_window_info[i].oy); } static int session_window_configure_event(GtkWidget *widget, GdkEventConfigure *event, gpointer data) { int i = GPOINTER_TO_INT(data), j; GdkRectangle frame; #ifdef DEBUG_SESSION session_window_dump(stderr, i, "configure start"); fprintf(stderr, "event is %d x %d @ (%d, %d)\n", event->width, event->height, event->x, event->y); fprintf(stderr, "widget state is:"); if (GTK_WIDGET_MAPPED(widget)) fprintf(stderr, " mapped"); if (GTK_WIDGET_REALIZED(widget)) fprintf(stderr, " realized"); if (GTK_WIDGET_VISIBLE(widget)) fprintf(stderr, " visible"); fputc('\n', stderr); #endif if (session_window_info[i].flags & NH_SESSION_PLACED) { /* Check if user has re-positioned and/or re-sized window. */ if (session_window_info[i].bounding.x != event->x - session_window_info[i].ox || session_window_info[i].bounding.y != event->y - session_window_info[i].oy) session_window_info[i].flags |= NH_SESSION_USER_POS; if (session_window_info[i].requisition.width == event->width && session_window_info[i].requisition.height == event->height) /* Resized under program control */ session_window_info[i].flags &= ~NH_SESSION_USER_SIZE; else if (session_window_info[i].bounding.width != event->width || session_window_info[i].bounding.height != event->height) /* Resized under user control */ session_window_info[i].flags |= NH_SESSION_USER_SIZE; } else { /* Initial placement */ #ifdef WIN32 /* Under win32 Gtk+, we appear to get two configure events in * quick sucession. This is probably a bug in Gtk+ with the * first configure event representing the default window * geometry and the second event representing the geometry we * have requested. We cope with this by ignoring configure * events if we have requested a geometry and the offset is * implausible. */ if (session_window_info[i].flags & NH_SESSION_USER_POS) { int ox, oy; ox = event->x - session_window_info[i].bounding.x; oy = event->y - session_window_info[i].bounding.y; if (ox >= 0 && ox <= 8 && oy >= 0 && oy <= 48) { session_window_info[i].ox = ox; session_window_info[i].oy = oy; session_window_info[i].flags |= NH_SESSION_PLACED; } else { session_window_info[i].ox = 0; session_window_info[i].oy = 0; } } else { session_window_info[i].ox = 0; session_window_info[i].oy = 0; session_window_info[i].flags |= NH_SESSION_PLACED; } #else if (session_window_info[i].flags & NH_SESSION_USER_POS) { session_window_info[i].ox = event->x - session_window_info[i].bounding.x; session_window_info[i].oy = event->y - session_window_info[i].bounding.y; } else { /* Take a good guess */ for(j = SIZE(session_window_info) - 1; j >= 0; j--) if (j != i && session_window_info[j].ox > 0) break; if (j >= 0) { session_window_info[i].ox = session_window_info[j].ox; session_window_info[i].oy = session_window_info[j].oy; } else { gdk_window_get_frame_extents(widget->window, &frame); #ifdef DEBUG_SESSION fprintf(stderr, "frame is %d x %d @ (%d, %d)\n", frame.width, frame.height, frame.x, frame.y); #endif session_window_info[i].ox = event->x - frame.x; session_window_info[i].oy = event->y - frame.y; } } session_window_info[i].flags |= NH_SESSION_PLACED; #endif } if (session_window_info[i].flags & NH_SESSION_PLACED) { session_window_info[i].bounding.x = event->x - session_window_info[i].ox; session_window_info[i].bounding.y = event->y - session_window_info[i].oy; session_window_info[i].bounding.width = event->width; session_window_info[i].bounding.height = event->height; } #ifdef DEBUG_SESSION session_window_dump(stderr, i, "configure done"); #endif return FALSE; } static int session_window_size_request(GtkWidget *widget, GtkRequisition *requisition, gpointer data) { int i = GPOINTER_TO_INT(data); #ifdef DEBUG_SESSION session_window_dump(stderr, i, "size_request start"); #endif if (session_window_info[i].flags & NH_SESSION_PLACED) { session_window_info[i].bounding.width += requisition->width - session_window_info[i].requisition.width; session_window_info[i].bounding.height += requisition->height - session_window_info[i].requisition.height; } session_window_info[i].requisition = *requisition; #ifdef DEBUG_SESSION session_window_dump(stderr, i, "size_request done"); #endif } unsigned long nh_session_window_flags(const char *name) { int i; for(i = SIZE(session_window_info) - 1; i >= 0; i--) if (!strcmp(name, session_window_info[i].name)) return (unsigned long)session_window_info[i].flags; return 0; } GtkWidget * nh_session_window_new(const char *name) { int i; GtkWidget *w; char buf[64] = ""; for(i = SIZE(session_window_info) - 1; i >= 0; i--) if (!strcmp(name, session_window_info[i].name)) break; w = gtk_window_new(GTK_WINDOW_TOPLEVEL); if (i >= 0) { if (!(session_window_info[i].flags & NH_SESSION_RESIZABLE)) gtk_window_set_resizable(GTK_WINDOW(w), FALSE); if (session_window_info[i].flags & NH_SESSION_USER_SIZE) sprintf(buf, "%ux%u", session_window_info[i].bounding.width, session_window_info[i].bounding.height); if (session_window_info[i].flags & NH_SESSION_USER_POS) sprintf(eos(buf), "+%d+%d", session_window_info[i].bounding.x, session_window_info[i].bounding.y); if (*buf) { #ifdef DEBUG_SESSION fprintf(stderr, "parse_geometry(\"%s\")\n", buf); #endif gtk_window_parse_geometry(GTK_WINDOW(w), buf); } gtk_signal_connect(GTK_OBJECT(w), "configure_event", GTK_SIGNAL_FUNC(session_window_configure_event), GINT_TO_POINTER(i)); gtk_signal_connect(GTK_OBJECT(w), "size_request", GTK_SIGNAL_FUNC(session_window_size_request), GINT_TO_POINTER(i)); } #ifdef DEBUG_SESSION session_window_dump(stderr, i, "new"); #endif return w; } int nh_session_set_geometry(const char *name, int x, int y, int width, int height) { int i; for(i = 0; i < SIZE(session_window_info); i++) if (!strcmp(name, session_window_info[i].name)) { if (x >= 0 && y >= 0) { session_window_info[i].bounding.x = x; session_window_info[i].bounding.y = y; session_window_info[i].flags |= NH_SESSION_USER_POS; } if (session_window_info[i].flags & NH_SESSION_RESIZABLE && width >= 0 && height >= 0) { session_window_info[i].bounding.width = width; session_window_info[i].bounding.height = height; session_window_info[i].flags |= NH_SESSION_USER_SIZE; } return 0; } return -1; } int nh_session_save(struct gtkhackrc *rc) { int i; for(i = 0; i < SIZE(session_window_info); i++) { if (session_window_info[i].flags & NH_SESSION_USER_POS) nh_gtkhackrc_store(rc, "window.position(\"%s\") = {%d, %d}", session_window_info[i].name, session_window_info[i].bounding.x, session_window_info[i].bounding.y); if (session_window_info[i].flags & NH_SESSION_USER_SIZE) nh_gtkhackrc_store(rc, "window.size(\"%s\") = {%d, %d}", session_window_info[i].name, session_window_info[i].bounding.width - session_window_info[i].requisition.width, session_window_info[i].bounding.height - session_window_info[i].requisition.height); } } void quit_hook() { } static char nh_key_buffer[32]; static int nh_key_rp = 0; static int nh_key_wp = 0; void nh_key_add(char c) { int p; p = nh_key_wp + 1; if (p >= sizeof(nh_key_buffer)) p = 0; if (p != nh_key_rp) { nh_key_buffer[nh_key_wp] = c; nh_key_wp = p; } /* else buffer full */ } int nh_key_check() { return nh_key_rp != nh_key_wp; } int nh_key_get() { int c; if (nh_key_rp == nh_key_wp) c = -1; else { c = nh_key_buffer[nh_key_rp++]; if (nh_key_rp >= sizeof(nh_key_buffer)) nh_key_rp = 0; } return c; } /* * Do some housekeeping that needs doing on a regular basis * and run the Gtk+ main loop until either a key is available * or the provided watch is non-zero. * * Returns TRUE if returning only because user initiated exit. */ int main_hook(int *watch) { nh_map_check_visibility(); if (display_inventory_needed) GTK_display_inventory(); #ifdef WINGTK_RADAR if (!in_topten) nh_radar_update(); #endif while(!exiting && !nh_key_check() && (!watch || !*watch)) gtk_main_iteration(); return (!nh_key_check() && (!watch || !*watch)); } static void game_option(GtkWidget *widget, gpointer data) { nh_option_new(); if (display_inventory_needed) GTK_display_inventory(); } static void game_preferences(GtkWidget *widget, gpointer data) { static GtkWidget *GTK_prefs = NULL; if (GTK_prefs) gtk_window_present(GTK_WINDOW(GTK_prefs)); else { GTK_prefs = GTK_preferences_new(); gtk_signal_connect(GTK_OBJECT(GTK_prefs), "destroy", GTK_SIGNAL_FUNC(gtk_widget_destroyed), >K_prefs); } } static void game_topten(GtkWidget *widget, gpointer data) { #ifdef GTK_PROXY in_topten++; /* Prevent radar window appearing */ proxy_cb_display_score(); #else winid id; char *argv[] = { "nethack", "-sall", }; in_topten++; /* Prevent radar window appearing */ id = rawprint_win = create_toptenwin(); prscore(2, argv); GTK_display_nhwindow(id, TRUE); destroy_toptenwin(); dlb_init(); /* Re-initialise DLB */ rawprint_win = WIN_ERR; #endif in_topten--; } #ifdef GTKHACK static void game_troubleshooting(GtkWidget *widget, gpointer data) { static GtkWidget *GTK_troubleshooting = NULL; if (GTK_troubleshooting) gtk_window_present(GTK_WINDOW(GTK_troubleshooting)); else { GTK_troubleshooting = GTK_troubleshooting_new(); gtk_signal_connect(GTK_OBJECT(GTK_troubleshooting), "destroy", GTK_SIGNAL_FUNC(gtk_widget_destroyed), >K_troubleshooting); } } #endif static void help_license(GtkWidget *widget, gpointer data) { #ifdef GTK_PROXY if (!GTK_display_file("$(LICENSE)")) pline("Cannot display license. Sorry."); #else #ifndef FILE_AREAS display_file(NH_LICENSE, TRUE); #else display_file(NH_LICENSE_AREA, NH_LICENSE, TRUE); #endif #endif } static void help_history(GtkWidget *widget, gpointer data) { #ifdef GTK_PROXY if (!GTK_display_file("$(HISTORY)")) pline("Cannot display history. Sorry."); #else dohistory(); #endif } static void help_option(GtkWidget *widget, gpointer data) { #ifdef GTK_PROXY if (!GTK_display_file("$(OPTIONFILE)")) pline("Cannot display option help. Sorry."); #else #ifndef FILE_AREAS display_file(NH_OPTIONFILE, TRUE); #else display_file(NH_OPTIONAREA, NH_OPTIONFILE, TRUE); #endif #endif } static void help_shelp(GtkWidget *widget, gpointer data) { #ifdef GTK_PROXY if (!GTK_display_file("$(SHELP)")) pline("Cannot display short help. Sorry."); #else #ifndef FILE_AREAS display_file(NH_SHELP, TRUE); #else display_file(NH_SHELP_AREA, NH_SHELP, TRUE); #endif #endif } static void help_help(GtkWidget *widget, gpointer data) { #ifdef GTK_PROXY if (!GTK_display_file("$(HELP)")) pline("Cannot display command help. Sorry."); #else #ifndef FILE_AREAS display_file(NH_HELP, TRUE); #else display_file(NH_HELP_AREA, NH_HELP, TRUE); #endif #endif } static void key_command(GtkWidget *widget, gpointer data) { nh_key_add((int)data); quit_hook(); } static const int dir_keys[8][2] = { {'k','8'}, /* North */ {'l','6'}, /* East */ {'j','2'}, /* South */ {'h','4'}, /* West */ {'u','9'}, /* Northeast */ {'y','7'}, /* Northwest */ {'n','3'}, /* Southeast */ {'b','1'}, /* Southwest */ }; static void move_command(GtkWidget *widget, gpointer data) { nh_key_add('m'); nh_key_add(copts.num_pad ? dir_keys[(int)data][1] : dir_keys[(int)data][0]); quit_hook(); } static void fight_command(GtkWidget *widget, gpointer data) { nh_key_add('F'); nh_key_add(copts.num_pad ? dir_keys[(int)data][1] : dir_keys[(int)data][0]); quit_hook(); } static void ext_command(GtkWidget *widget, gpointer data) { nh_key_add('#'); GTK_extcmd_set((int)data); quit_hook(); } static gint main_window_delete(GtkWidget *widget, gpointer data) { exiting++; if (in_player_selection) gtk_main_quit(); return TRUE; } static void game_quit(GtkWidget *widget, gpointer data) { #ifdef GTK_PROXY proxy_cb_quit_game(); #else if (program_state.something_worth_saving) done2(); else { clearlocks(); GTK_exit_nhwindows(NULL); terminate(0); } #endif } static gint default_destroy(GtkWidget *widget, gpointer data) { GtkWindow **w = (GtkWindow **)data; *w = NULL; nh_key_add('\033'); quit_hook(); return FALSE; } int nh_dir_keysym(GdkEventKey *ev) { int ret; switch(ev->keyval) { case GDK_End: case GDK_KP_End: ret = dir_keys[GTK_SOUTHWEST][!!copts.num_pad]; break; case GDK_Down: case GDK_KP_Down: ret = dir_keys[GTK_SOUTH][!!copts.num_pad]; break; case GDK_Page_Down: case GDK_KP_Page_Down: ret = dir_keys[GTK_SOUTHEAST][!!copts.num_pad]; break; case GDK_Left: case GDK_KP_Left: ret = dir_keys[GTK_WEST][!!copts.num_pad]; break; case GDK_Begin: case GDK_KP_Begin: ret = '.'; break; case GDK_Right: case GDK_KP_Right: ret = dir_keys[GTK_EAST][!!copts.num_pad]; break; case GDK_Home: case GDK_KP_Home: ret = dir_keys[GTK_NORTHWEST][!!copts.num_pad]; break; case GDK_Up: case GDK_KP_Up: ret = dir_keys[GTK_NORTH][!!copts.num_pad]; break; case GDK_Page_Up: case GDK_KP_Page_Up: ret = dir_keys[GTK_NORTHEAST][!!copts.num_pad]; break; default: ret = 0; } return ret; } /* * Our model for focus (where key presses should go) is fairly simple. * As each window is opened that should receive key presses * we start a new layer of the hierarchy. Windows with slave * focus don't accept key presses themselves; instead they forward them * to another window. Such windows are considered to be at the same * level as the window to which they forward key presses (the master). * * We do not allow the user to select which window should have focus. * If an attempt is made we simply over-ride it. On the other hand, * users must be able to give the focus to a seperate application and * to return focus to the game when they choose. * * It is important to give the user as much feedback regarding focus * as possible. Ideally, we would like to keep our internal concept of * focus and the window manager's tied together but this causes a lot * of problems with slave windows (if a slave window receives the focus * and we attempt to pass it to the master window Gdk will raise the * master window at the same time. We can fudge this afterwards but it * looks very bad). As a compromise we allow the focus to remain on * slave windows and quietly forward the key presses. */ #define FOCUS_USE_FOCUS_KEYS 1 /* This window uses focus keys */ static struct focus_hierarchy { GtkWindow *master; GSList *slaves; gint (*handler)(GtkWidget *widget, GdkEventKey *event, gpointer data); gpointer data; struct focus_hierarchy *next; unsigned long flags; } *focus_top = NULL; static int focus_game = FALSE; /* Does any game window have focus? */ #ifdef DEBUG static gint focus_dump(void) { struct focus_hierarchy *fh; GSList *list; fprintf(stderr,"Focus hierarchy\n"); fprintf(stderr,"Master\t\tHandler\t\tSlaves\n"); for(fh = focus_top; fh; fh = fh->next) { fprintf(stderr,"%p\t%p\t",fh->master,fh->handler); if (fh->slaves) for(list = fh->slaves; list; ) { fprintf(stderr,"%p",list->data); list = g_slist_next(list); if (list) fputs(", ",stderr); } else fputs("",stderr); fputc('\n',stderr); } } #endif static gint focus_out(GtkWidget *widget, GdkEventFocus *event, gpointer data) { if (focus_game) focus_game--; } static gint focus_in(GtkWidget *widget, GdkEventFocus *event, gpointer data) { GtkWindow *w = GTK_WINDOW(widget); focus_game++; if (!focus_top || w == focus_top->master || g_slist_find(focus_top->slaves, w)) return 0; if (focus_top->master && GTK_WIDGET_VISIBLE(focus_top->master)) gtk_window_present(focus_top->master); return 1; } static gint focus_map(GtkWidget *widget, gpointer data) { if (focus_game && focus_top && focus_top->master == GTK_WINDOW(widget)) gdk_window_focus(widget->window, gtk_get_current_event_time()); return 0; } static gint focus_destroy(GtkWidget *widget, gpointer data) { GtkWindow *w = GTK_WINDOW(widget); GSList *list; struct focus_hierarchy *fh, *fhl = NULL; for(fh = focus_top; fh; fhl = fh, fh = fh->next) { if (fh->master == w) { /* This should only happen during game exit when a master window * is destroyed before one or more of its slaves. We mark this * special case by setting the master to NULL and hope to * clean-up when the last slave is destroyed. */ if (fh->slaves) fh->master = NULL; else { if (fhl) fhl->next = fh->next; else focus_top = fh->next; free(fh); } break; } else if (list = g_slist_find(fh->slaves, w)) { fh->slaves = g_slist_remove(fh->slaves, w); if (!fh->slaves && !fh->master) { /* Last slave destroyed of a previously destroyed master */ if (fhl) fhl->next = fh->next; else focus_top = fh->next; free(fh); } break; } } if (!fh) impossible("Destroying unknown focus window (%p)", w); else gtk_widget_unref(widget); } gint focus_key_press_early(GtkWidget *widget, GdkEventKey *event, gpointer data) { /* Certain keys should be intercepted before passing to the default * Gtk+ handler so that we can guarantee to receive them. For such * keys we call focus_key_press() ourselves thus bypassing the * default handler (should focus_key_press() not handle the event * it will be passed back to the default handler anyway). For other * keys we do nothing and allow the default handler to run. If this * handler doesn't deal with the key (eg., an accelerator) then * Gtk+ will call focus_key_press() in due course. */ if (focus_top && focus_top->master && !(focus_top->flags & FOCUS_USE_FOCUS_KEYS) && (event->keyval == GDK_Up || event->keyval == GDK_KP_Up || event->keyval == GDK_Down || event->keyval == GDK_KP_Down || event->keyval == GDK_Left || event->keyval == GDK_KP_Left || event->keyval == GDK_Right || event->keyval == GDK_KP_Right || event->keyval == GDK_Tab || event->keyval == GDK_ISO_Left_Tab)) return focus_key_press(widget, event, data); if (event->keyval == GDK_Escape || event->keyval == GDK_space || event->keyval == GDK_KP_0 || event->keyval == GDK_KP_1 || event->keyval == GDK_KP_2 || event->keyval == GDK_KP_3 || event->keyval == GDK_KP_4 || event->keyval == GDK_KP_5 || event->keyval == GDK_KP_6 || event->keyval == GDK_KP_7 || event->keyval == GDK_KP_8 || event->keyval == GDK_KP_9) return focus_key_press(widget, event, data); else return FALSE; } gint focus_key_press(GtkWidget *widget, GdkEventKey *event, gpointer data) { if (focus_top && focus_top->master) return focus_top->handler(GTK_WIDGET(focus_top->master), event, focus_top->data); else return GTK_default_key_press(widget, event, data); } static void focus_set_events(GtkWindow *w) { gtk_widget_ref(GTK_WIDGET(w)); gtk_signal_connect(GTK_OBJECT(w), "focus_in_event", GTK_SIGNAL_FUNC(focus_in), 0); gtk_signal_connect(GTK_OBJECT(w), "focus_out_event", GTK_SIGNAL_FUNC(focus_out), 0); gtk_signal_connect(GTK_OBJECT(w), "map_event", GTK_SIGNAL_FUNC(focus_map), 0); gtk_signal_connect(GTK_OBJECT(w), "destroy", GTK_SIGNAL_FUNC(focus_destroy), 0); gtk_signal_connect(GTK_OBJECT(w), "key_press_event", GTK_SIGNAL_FUNC(focus_key_press_early), 0); gtk_signal_connect_after(GTK_OBJECT(w), "key_press_event", GTK_SIGNAL_FUNC(focus_key_press), 0); } /* * Master windows may be configured to use the standard Gtk+ focus keys * (arrow keys, tab, left tab). If they do not use the focus keys then * the key presses will be passed on to the provided signal function. */ void nh_gtk_focus_set_master(GtkWindow *w, GtkSignalFunc func, gpointer data, gboolean use_focus_keys) { struct focus_hierarchy *fh; g_return_if_fail(w != NULL); fh = (struct focus_hierarchy *)alloc(sizeof(struct focus_hierarchy)); fh->master = w; fh->slaves = NULL; fh->handler = (void *)func; fh->data = data; fh->next = focus_top; fh->flags = use_focus_keys ? FOCUS_USE_FOCUS_KEYS : 0; focus_top = fh; focus_set_events(w); #ifdef DEBUG focus_dump(); #endif } void nh_gtk_focus_set_slave_for(GtkWindow *w,GtkWindow *slave_for) { struct focus_hierarchy *fh; g_return_if_fail(w != NULL); for(fh = focus_top; fh; fh = fh->next) { if (slave_for == fh->master) { fh->slaves = g_slist_prepend(fh->slaves, w); break; } } if (!fh) { impossible("Window focus slave for unknown window?"); return; } focus_set_events(w); #ifdef DEBUG focus_dump(); #endif } gint GTK_default_key_press(GtkWidget *widget, GdkEventKey *event, gpointer data) { int keysym; if (in_player_selection) return FALSE; keysym = nh_dir_keysym(event); if (!keysym) switch(event->keyval) { case GDK_Insert: case GDK_KP_Insert: keysym = 'i'; break; default: keysym = nh_keysym(event); } if (keysym) { nh_key_add(keysym); quit_hook(); return TRUE; } else return FALSE; } static gint default_button_press(GtkWidget *widget, GdkEventButton *event, gpointer data) { nh_key_add(data ? (int)data : '\n'); quit_hook(); return FALSE; } static gint credit_expose_event(GtkWidget *widget, GdkEventExpose *event) { gtk_main_quit(); return FALSE; } static void nh_rc(void) { int i; char *rc_file; gchar **files, **new_files; #if defined(GTK_PROXY) || !defined(FILE_AREAS) # ifdef UNIX rc_file = strdup("/etc/gtkhack/gtkrc"); # else rc_file = strdup("gtkrc"); # endif #else rc_file = make_file_name(FILE_AREA_SHARE, "gtkrc"); #endif files = gtk_rc_get_default_files(); for(i = 0; files[i]; i++) ; new_files = g_new(gchar *, i + 2); if (!new_files) return; new_files[0] = (gchar *)rc_file; for(i = 0; files[i]; i++) { new_files[i + 1] = g_strdup(files[i]); if (!new_files[i + 1]) { for(; i > 0; i--) g_free(new_files[i]); g_free(new_files); return; } } new_files[i + 1] = NULL; gtk_rc_set_default_files(new_files); for(i = 1; new_files[i]; i++) g_free(new_files[i]); g_free(new_files); free(rc_file); nh_read_gtkhackrc(); } /* * ALI * * Player selection code for 3.3 codebase. * * This code tries to keep to the spirit of the GTK interface by having * all possible selections available as menus for the user (rather than * bringing up a dialog). It also keeps the keyboard accelerators (one * per role), which are numbered from F1..F12, Shift-F1..Shift-F11 in * sequence. Shift-F12 is reserved for a random role. * * The interaction of the selection code and the flags.initfoo fields * (set for example with an OPTIONS=race:gnome line) is complex. These * values could either be treated as requirements (so that specifying * race:gnome would rule out any possibility of playing a Knight, for * example), or as cached answers to questions (so that the answer is * ignored until the question is asked and since role is queried before * race, the problem does not arise). The TTY interface follows the * latter interpretation, so we do too. * * For our purposes, displaying a menu is equivalent to asking a question * and the user choosing one the options (either by actually clicking * on an option or simply by moving the mouse) equates to giving an * answer. The joy of the GTK interface is that the user can un-answer * many questions by simply moving the mouse pointer back to the previous * menu. */ struct { int role; int race; int gend; int align; } select_player_flags; /* Used to pass data to/from select_player */ #define SELECT_KEY_ROLESHIFT 20 #define SELECT_KEY_RACESHIFT 8 #define SELECT_KEY_GENDSHIFT 4 #define SELECT_KEY_ALIGNSHIFT 0 #define SELECT_KEY_NUM(key, shift, mask) \ ((int)((key)>>(shift)&(mask)) - 1) #define SELECT_KEY_ROLENUM(key) \ SELECT_KEY_NUM(key, SELECT_KEY_ROLESHIFT, 0xfff) #define SELECT_KEY_RACENUM(key) \ SELECT_KEY_NUM(key, SELECT_KEY_RACESHIFT, 0xfff) #define SELECT_KEY_GENDNUM(key) \ SELECT_KEY_NUM(key, SELECT_KEY_GENDSHIFT, 0xf) #define SELECT_KEY_ALIGNNUM(key) \ SELECT_KEY_NUM(key, SELECT_KEY_ALIGNSHIFT, 0xf) /* * The call back routine. This extracts the relevant answers from the * menu option selected and arranges for a new game to be started. */ static void select_player(GtkWidget *widget, guint data) { select_player_flags.role = SELECT_KEY_ROLENUM(data); select_player_flags.race = SELECT_KEY_RACENUM(data); select_player_flags.gend = SELECT_KEY_GENDNUM(data); select_player_flags.align = SELECT_KEY_ALIGNNUM(data); gtk_main_quit(); } /* * A node of the temporary tree which is used to generate the menu options. * * The key field contains the answers which the user would have given in * order to reach this point. Note that you need to know the level that the * node is in the tree to be able to distinguish an answer of 'random' from * `not yet asked'. This information is not stored in the tree itself. * Each son represents a possible answer to the next question. Again, you * need to know the level to know what the question is. * * Level 0 1 2 3 * Question Role? Race? Gender? Alignment? * * Tree root--->Arch--->human------+--->male---------+->lawful * | \->neutral * | \->random * \--->female-------+->lawful * \... */ struct select_node { unsigned long key; int no_sons; struct select_node *sons; }; #ifdef GTK_PROXY #define valid_race(role, race) proxy_cb_valid_selection_check(role, race, -1, -1) static boolean valid_gend(int role, int race, int gend) { return proxy_cb_valid_selection_check(role, race, gend, -1); } static boolean valid_align(int role, int race, int align) { return proxy_cb_valid_selection_check(role, race, -1, align); } #define number_roles (player_choices->n_roles) #define number_races (player_choices->n_races) #define number_genders (player_choices->n_genders) #define number_aligns (player_choices->n_aligns) #define PLAYER_ROLE_M(i) (player_choices->roles[i].male) #define PLAYER_ROLE_F(i) (player_choices->roles[i].female) #define PLAYER_RACE(i) (player_choices->races[i]) #define PLAYER_GENDER(i) (player_choices->genders[i]) #define PLAYER_ALIGN(i) (player_choices->aligns[i]) #else /* GTK_PROXY */ #define valid_race validrace #define valid_gend validgend #define valid_align validalign static int number_roles, number_races; #define number_genders ROLE_GENDERS #define number_aligns ROLE_ALIGNS #define PLAYER_ROLE_M(i) (roles[i].name.m) #define PLAYER_ROLE_F(i) (roles[i].name.f) #define PLAYER_RACE(i) (races[i].noun) #define PLAYER_GENDER(i) (genders[i].adj) #define PLAYER_ALIGN(i) (aligns[i].adj) #endif /* GTK_PROXY */ /* * Return the th possible answer to the question at level * given the answers already given in . Note that indx==0 represents * the first possible answer. * * If indx is out of range, return _exactly_ -1. * * We use a cached answer if it is a valid answer. If not, we simply ignore it. * * Note that this function never lists random as a possible answer, the * caller must add this to the list if appropriate. */ static int select_node_option(unsigned long key, int level, int indx) { int rolenum, racenum, n, i, j; boolean (*valid)(int rolenum, int racenum, int gendalignnum); switch(level) { case 0: /* Role */ if (select_player_flags.role >= 0) return indx ? -1 : select_player_flags.role; for (i = 0; i < number_roles; i++) if (!indx--) return i; return -1; break; case 1: /* Race */ rolenum = SELECT_KEY_ROLENUM(key); if (select_player_flags.race >= 0 && (rolenum < 0 || valid_race(rolenum, select_player_flags.race))) return indx ? -1 : select_player_flags.race; for (i = 0; i < number_races; i++) if (rolenum < 0 || valid_race(rolenum, i)) if (!indx--) return i; return -1; break; case 3: /* Alignmnent */ /* FALL THROUGH */ case 2: /* Gender */ if (level == 2) { n = number_genders; valid = valid_gend; i = select_player_flags.gend; } else { n = number_aligns; valid = valid_align; i = select_player_flags.align; } rolenum = SELECT_KEY_ROLENUM(key); racenum = SELECT_KEY_RACENUM(key); if (i >= 0) { if (rolenum < 0) if (racenum < 0) return indx ? -1 : i; else { for (j = 0; j < number_roles; j++) if (valid(j, racenum, i)) return indx ? -1 : i; } else if (racenum < 0) { for (j = 0; j < number_races; j++) if (valid(rolenum, j, i)) return indx ? -1 : i; } else if (valid(rolenum, racenum, i)) return indx ? -1 : i; } if (rolenum < 0) if (racenum < 0) { if (indx >= 0 && indx < n) return indx; } else { for (i = 0; i < n; i++) for (j = 0; j < number_roles; j++) if (valid(j, racenum, i)) { if (!indx--) return i; break; } } else if (racenum < 0) { for (i = 0; i < n; i++) for (j = 0; j < number_races; j++) if (valid(rolenum, j, i)) { if (!indx--) return i; break; } } else for (i = 0; i < n; i++) if (valid(rolenum, racenum, i)) if (!indx--) return i; return -1; break; } } /* * Fill a tree starting at which is in level . * Return the number of menu items (including titles and seperators) * that this tree represents. */ static int select_node_fill(struct select_node *node, int level) { int shift, no_opts, count, option, i; for (no_opts = 0; ; no_opts++) if (select_node_option(node->key, level, no_opts) < 0) break; if (level == 0) shift = SELECT_KEY_ROLESHIFT; else if (level == 1) shift = SELECT_KEY_RACESHIFT; else if (level == 2) shift = SELECT_KEY_GENDSHIFT; else shift = SELECT_KEY_ALIGNSHIFT; if (no_opts > 1) { node->no_sons = no_opts + 1; count = no_opts + 2; } else { node->no_sons = no_opts; count = no_opts; } if (!level) count++; node->sons = (struct select_node *)alloc(node->no_sons * sizeof(struct select_node)); for (i = 0; i < node->no_sons; i++) { option = select_node_option(node->key, level, i); node->sons[i].key = node->key | (option + 1 << shift); if (level<3) count += select_node_fill(node->sons + i, level + 1); else { node->sons[i].no_sons = 0; node->sons[i].sons = NULL; } } return count; } /* * Return a menu item path representing the answers given to * questions stored in . If is not NULL, append this as * a leaf to the path. */ static char * select_node_path(unsigned long key, int level, char *leaf) { int rolenum, racenum, gendnum, alignnum, len, i; char *path; rolenum = SELECT_KEY_ROLENUM(key); racenum = SELECT_KEY_RACENUM(key); gendnum = SELECT_KEY_GENDNUM(key); alignnum = SELECT_KEY_ALIGNNUM(key); len = 11 + level; if (level > 0) if (rolenum >= 0) len += strlen(PLAYER_ROLE_M(rolenum)); else len += 6; if (level > 1) if (racenum >= 0) len += strlen(PLAYER_RACE(racenum)); else len += 6; if (level > 2) if (gendnum >= 0) len += strlen(PLAYER_GENDER(gendnum)); else len += 6; if (level > 3) if (alignnum >= 0) len += strlen(PLAYER_ALIGN(alignnum)); else len += 6; if (leaf) len += 1 + strlen(leaf); path = (gchar *) alloc(len); strcpy(path, "/Game/Play"); #define SELECT_STR(num, str) (((num) >= 0) ? (str) : "Random") if (level > 0) { strcat(path, "/"); strcat(path, SELECT_STR(rolenum, PLAYER_ROLE_M(rolenum))); } if (level > 1) { strcat(path, "/"); strcat(path, SELECT_STR(racenum, PLAYER_RACE(racenum))); } if (level > 2) { strcat(path, "/"); strcat(path, SELECT_STR(gendnum, PLAYER_GENDER(gendnum))); } if (level > 3) { strcat(path, "/"); strcat(path, SELECT_STR(alignnum, PLAYER_ALIGN(alignnum))); } if (leaf) { strcat(path, "/"); strcat(path, leaf); } #undef SELECT_STR return path; } /* * Return a suitable keyboard accelrator to go with this menu item. * For most menu items this will be NULL, but we allocate one menu * item from each role to a function key. This allows the user to * press a function key to start the game in that role. The race, * gender and alignment of the character will either be as required * by the role, as specified in the select_player_flags.foo fields * or randomly chosen. */ static char * select_node_accel(unsigned long key) { int rolenum; char *accel; rolenum = SELECT_KEY_ROLENUM(key); if (rolenum >= 23) return NULL; if (SELECT_KEY_RACENUM(key) >= 0 && select_node_option(key, 1, 1) >= 0) return NULL; if (SELECT_KEY_GENDNUM(key) >= 0 && select_node_option(key, 2, 1) >= 0) return NULL; if (SELECT_KEY_ALIGNNUM(key) >= 0 && select_node_option(key, 3, 1) >= 0) return NULL; if (rolenum < 0) { accel = (gchar *) alloc(11); sprintf(accel, "F12"); } else if (rolenum < 12) { accel = (gchar *) alloc(rolenum > 8 ? 4 : 3); sprintf(accel, "F%d", rolenum + 1); } else { accel = (gchar *) alloc(rolenum > 20 ? 11 : 10); sprintf(accel, "F%d", rolenum - 11); } return accel; } /* * Walk the tree, generating menu items as we go. */ static int select_node_traverse(struct select_node *node, int offset, int level) { int i; char *titles[] = { "Role", "Race", "Gender", "Alignment" }; if (node->no_sons) { menu_items[offset].path = select_node_path(node->key, level, titles[level]); menu_items[offset].accelerator = NULL; menu_items[offset].callback = NULL; menu_items[offset].callback_action = 0; menu_items[offset++].item_type = ""; for (i = 0; i < node->no_sons; i++) { if (node->sons[i].key == node->key) { menu_items[offset].path = select_node_path(node->key, level, "GPSepR"); menu_items[offset].accelerator = NULL; menu_items[offset].callback = NULL; menu_items[offset].callback_action = 0; menu_items[offset++].item_type = "<Separator>"; } offset = select_node_traverse(node->sons + i, offset, level + 1); } } else { menu_items[offset].path = select_node_path(node->key, level, NULL); menu_items[offset].accelerator = select_node_accel(node->key); menu_items[offset].callback = select_player; menu_items[offset].callback_action = node->key; menu_items[offset++].item_type = NULL; } return offset; } static void select_node_free(struct select_node *node) { int i; for (i = 0; i < node->no_sons; i++) select_node_free(node->sons + i); free(node->sons); } #ifdef DEBUG static void select_node_dump(struct select_node *node, int level) { int i; static int count; char buf[BUFSZ]; char *titles[] = { "Role", "Race", "Gender", "Alignment" }; if (level) { for(i = 0; i < level; i++) fputs(" ", stderr); sprintf(buf, "[%d] 0x%lX: ", count++, node->key); switch (level) { case 1: if (SELECT_KEY_ROLENUM(node->key) >= 0) fprintf(stderr, "%s%s", buf, PLAYER_ROLE_M(SELECT_KEY_ROLENUM(node->key))); else { fprintf(stderr, "[%d] ---\n", count - 1); for(i = 0; i < level; i++) fputs(" ", stderr); fprintf(stderr, "[%d] 0x%lX: random", count++, node->key); } break; case 2: if (SELECT_KEY_RACENUM(node->key) >= 0) fprintf(stderr, "%s%s", buf, PLAYER_RACE(SELECT_KEY_RACENUM(node->key))); else { fprintf(stderr, "[%d] ---\n", count - 1); for(i = 0; i < level; i++) fputs(" ", stderr); fprintf(stderr, "[%d] 0x%lX: random", count++, node->key); } break; case 3: if (SELECT_KEY_GENDNUM(node->key) >= 0) fprintf(stderr, "%s%s", buf, PLAYER_GENDER(SELECT_KEY_GENDNUM(node->key))); else { fprintf(stderr, "[%d] ---\n", count - 1); for(i = 0; i < level; i++) fputs(" ", stderr); fprintf(stderr, "[%d] 0x%lX: random", count++, node->key); } break; case 4: if (SELECT_KEY_ALIGNNUM(node->key) >= 0) fprintf(stderr, "%s%s", buf, PLAYER_ALIGN(SELECT_KEY_ALIGNNUM(node->key))); else { fprintf(stderr, "[%d] ---\n", count - 1); for(i = 0; i < level; i++) fputs(" ", stderr); fprintf(stderr, "[%d] 0x%lX: random", count++, node->key); } break; } fputc('\n', stderr); } else count = 0; if (node->no_sons) { for(i = 0; i < level; i++) fputs(" ", stderr); if (level) fprintf(stderr, "%s\n", titles[level]); else fprintf(stderr, "[%d] %s\n", count++, titles[0]); for(i = 0; i < node->no_sons; i++) select_node_dump(node->sons + i, level + 1); } } #endif /* * Initialise the player selection code by creating a temporary tree * of all the possible options, using it to generate a set of menu * items that can be passed to GTK and finally freeing the tree. */ static void init_select_player(boolean init) { int num_opts, i; struct select_node *root; if (!init) { /* Exit */ for (i = 0; i < nmenu_items; i++) { free(menu_items[i].path); free(menu_items[i].accelerator); } nmenu_items = 0; free(menu_items); menu_items = NULL; #ifdef GTK_PROXY proxy_cb_valid_selection_close(); if (player_choices) proxy_cb_free_player_choices(player_choices); player_choices = NULL; #endif return; } #ifdef GTK_PROXY player_choices = proxy_cb_get_player_choices(); proxy_cb_valid_selection_open(); #else for(number_roles = 0; roles[number_roles].name.m; number_roles++) ; for(number_races = 0; races[number_races].noun; number_races++) ; #endif root = (struct select_node *)alloc(sizeof(struct select_node)); root->key = 0; num_opts = select_node_fill(root, 0); #ifdef DEBUG select_node_dump(root, 0); #endif menu_items = (GtkItemFactoryEntry *)alloc(sizeof(GtkItemFactoryEntry) * num_opts); nmenu_items = num_opts; nmenu_items = select_node_traverse(root, 0, 0); if (nmenu_items != num_opts) panic("GTK: init_select_player: Expecting %d options, got %d", num_opts, nmenu_items); select_node_free(root); free(root); } /* If you want to change these you probably also want to change the * equivalent values in the non-proxified version of GTK_procs. */ static char *GTK_capv[] = { "color", "hilite_pet", #if 0 "ascii_map", "tiled_map", "splash_screen", "popup_dialog", "eight_bit_tty", #endif "perm_invent", (char *)0 }; #ifdef GTK_PROXY #define set_option_mod_status(option, status) \ proxy_cb_set_option_mod_status(option, status) #endif void GTK_init_gtk(int *argc, char **argv) { gtk_set_locale(); g_type_init(); nh_rc(); gtk_init(argc, &argv); } void GTK_init_nhwindows(char ***capvp) { char *credit_file; int i; GtkWidget *credit_window, *credit_vbox, *credit_credit, *main_hbox; GtkWidget *main_bar; GtkStyle *credit_style; GdkPixmap *credit_pixmap; GdkBitmap *credit_mask; GdkColormap *cmap; *capvp = GTK_capv; /* None of these options are supported in the GTK interface * and their display may be confusing. */ set_option_mod_status("extmenu", SET_IN_FILE); set_option_mod_status("msg_window", SET_IN_FILE); set_option_mod_status("menucolors", SET_IN_FILE); set_option_mod_status("standout", SET_IN_FILE); set_option_mod_status("timed_delay", SET_IN_FILE); nh_option_cache_set_bool_addr("color", &copts.use_color); nh_option_cache_set_bool_callback("color", nh_map_color_changed); nh_option_cache_set_bool_addr("hilite_pet", &copts.hilite_pet); copts.num_pad = nh_option_cache_get_bool("number_pad"); nh_option_cache_set_bool_callback("hilite_pet", nh_map_hilite_pet_changed); /* Init windows to nothing. */ for (i = 0; i < MAXWIN; i++) gtkWindows[i].type = NHW_NONE; /* * create credit widget and show */ credit_window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_position(GTK_WINDOW(credit_window), GTK_WIN_POS_CENTER); gtk_container_border_width(GTK_CONTAINER(credit_window), 2); gtk_signal_connect(GTK_OBJECT(credit_window), "expose_event", GTK_SIGNAL_FUNC(credit_expose_event), NULL); gtk_widget_realize(credit_window); root_width = gdk_screen_width(); root_height = gdk_screen_height(); credit_vbox = nh_gtk_new_and_add(gtk_vbox_new(FALSE, 0), credit_window, ""); credit_style = gtk_widget_get_style(credit_window); #if defined(GTK_PROXY) || !defined(FILE_AREAS) # ifdef UNIX credit_file = "/usr/share/games/gtkhack/credit.xpm"; # else credit_file = "credit.xpm"; # endif #else credit_file = make_file_name(FILE_AREA_SHARE, "credit.xpm"); #endif credit_pixmap = gdk_pixmap_create_from_xpm(credit_window->window, &credit_mask, &credit_style->bg[GTK_STATE_NORMAL], credit_file); #if !defined(GTK_PROXY) && defined(FILE_AREAS) free(credit_file); #endif if (credit_pixmap) { credit_credit = nh_gtk_new_and_pack(gtk_pixmap_new(credit_pixmap, credit_mask), credit_vbox, "", FALSE, FALSE, NH_PAD); gdk_pixmap_unref(credit_pixmap); } gtk_widget_show_all(credit_window); gtk_main(); /* * create main widget */ main_window = nh_session_window_new("main"); if (!(nh_session_window_flags("main") & NH_SESSION_USER_SIZE)) gtk_window_set_default_size(GTK_WINDOW(main_window), min(1000, root_width - 50), min(700, root_height * 0.75)); nh_gtk_focus_set_master(GTK_WINDOW(main_window), GTK_SIGNAL_FUNC(GTK_default_key_press), 0, FALSE); gtk_signal_connect(GTK_OBJECT(main_window), "delete_event", GTK_SIGNAL_FUNC(main_window_delete), 0); gtk_window_set_title(GTK_WINDOW(main_window), DEF_GAME_NAME); gtk_widget_set_name(main_window, DEF_GAME_NAME); gtk_widget_set_events(main_window, GDK_KEY_PRESS_MASK); gtk_widget_realize(main_window); /* * allocate color */ cmap = gdk_window_get_colormap(main_window->window); for(i = 0; i < N_NH_COLORS; i++) if (!gdk_colormap_alloc_color(cmap, &nh_color[i], FALSE, TRUE)) fprintf(stderr, "cannot allocate color\n"); main_vbox = nh_gtk_new_and_add(gtk_vbox_new(FALSE, 0), main_window, ""); accel_group = gtk_accel_group_new(); #if GTK_CHECK_VERSION(1,3,12) gtk_window_add_accel_group(GTK_WINDOW(main_window), accel_group); #else gtk_accel_group_attach(accel_group, G_OBJECT(main_window)); #endif main_item_factory = gtk_item_factory_new(GTK_TYPE_MENU_BAR, "<main>", accel_group); main_bar = nh_gtk_new_and_pack( gtk_item_factory_get_widget(main_item_factory, "<main>"), main_vbox, "", FALSE, FALSE, 0); main_hbox = nh_gtk_new_and_pack(gtk_hbox_new(FALSE, 1), main_vbox, "", FALSE, FALSE, 0); gtk_item_factory_create_items(main_item_factory, SIZE(mainmenu_items), mainmenu_items, NULL); gtk_item_factory_create_items(main_item_factory, SIZE(playmenu_items), playmenu_items, NULL); gtk_item_factory_create_items(main_item_factory, SIZE(helpmenu_items), helpmenu_items, NULL); nh_menu_sensitive("/Game/Play", FALSE); nh_option_lock(TRUE); (void) nh_gtk_new_and_pack(nh_message_new(), main_hbox, "", TRUE, TRUE, 0); (void) nh_gtk_new_and_pack(nh_status_new(), main_hbox, "", FALSE, FALSE, 0); #ifdef WINGTK_RADAR main_radar = nh_radar_new(); nh_gtk_focus_set_slave_for(GTK_WINDOW(main_radar), GTK_WINDOW(main_window)); #endif (void) nh_gtk_new_and_pack(nh_map_new(main_window), main_vbox, "", TRUE, TRUE, 0); /* * Initialize standard windows. It used to be the case that window type * and id were equivalent (and therefore there could only be one type * of each window). We maintain this correlation for the standard * windows for compatibility -ALI */ gtkWindows[NHW_MESSAGE].type = NHW_MESSAGE; gtkWindows[NHW_MESSAGE].w = main_window; gtkWindows[NHW_STATUS].type = NHW_STATUS; gtkWindows[NHW_STATUS].w = main_window; gtkWindows[NHW_MAP].type = NHW_MAP; gtkWindows[NHW_MAP].w = main_window; #if !defined(GTKHACK) && defined(GTK_PROXY) /* * GtkHack doesn't have (or need) this variable. Conventional window * interfaces share it with the game core (which is responsible for * setting it). Proxified window interfaces, however, need to maintain * their own copy so that pline() can be called from the window interface * and still direct its output to the mesage window. */ WIN_MESSAGE = NHW_MESSAGE; #endif #ifdef GTK_PROXY proxy_cb_interface_mode(EXT_IM_STATUS|EXT_IM_DISPLAY_LAYERS); #else bot_set_handler(GTK_ext_status); #endif GTK_initialized = 1; gtk_widget_hide(credit_window); gtk_widget_destroy(credit_window); gtk_widget_show_all(main_window); } int GTK_ext_init_nhwindows(int *argc, char **argv, char ***capvp) { GTK_init_gtk(argc, argv); GTK_init_nhwindows(capvp); return TRUE; } #ifdef MONITOR_XRESOURCES static int GTK_X11_error_handler(Display *dpy, XErrorEvent *e) { return 0; } #endif void GTK_exit_nhwindows(const char *str) { int id; if (str && *str) { id = GTK_create_nhwindow(NHW_MENU); GTK_putstr(id, 0, str); GTK_display_nhwindow(id, TRUE); GTK_destroy_nhwindow(id); } init_select_player(FALSE); text_destroy_all(); for(id = 0; id < MAXWIN; id++) if (gtkWindows[id].type != NHW_NONE) GTK_destroy_nhwindow(id); nh_map_destroy(); nh_status_destroy(); #ifdef WINGTK_RADAR nh_radar_destroy(); #endif nh_message_destroy(); gtk_widget_destroy(main_window); g_blow_chunks(); #ifdef MONITOR_XRESOURCES /* ALI: An exceedingly unportable way of checking that * there are no X drawables still allocated at this point. */ { struct _XDisplay *dpy = (struct _XDisplay *)GDK_DISPLAY(); XID i; Drawable d; Window root; int x, y; unsigned int w, h, bw, dp; XWindowAttributes wa; char *type; fprintf(stderr, "X Drawables not freed:\n"); fprintf(stderr, "XID Type Width Height\n"); XSetErrorHandler(GTK_X11_error_handler); for(i = 0; i < dpy->resource_id; i++) { d = (Drawable)(dpy->resource_base + (i << dpy->resource_shift)); if (XGetGeometry(dpy, d, &root, &x, &y, &w, &h, &bw, &dp)) { if (x || y || bw) type = "Window"; else if (XGetWindowAttributes(dpy, (Window)d, &wa)) type = wa.screen ? "Window" : "Pixmap"; else type = "Pixmap"; fprintf(stderr, "%-10lX%-8s%-8u%u\n", (unsigned long)d, type, w, h); } } } #endif #if defined(GTK_PROXY) proxy_exit_client_services(); #endif } static GtkTextTagTable *text_tag_table; static void init_text_nhwindow(NHWindow *w) { GtkTextTag *tag; w->text_information = (struct text_info_t *)alloc(sizeof(*w->text_information)); md5_init(&w->text_information->md5_state); if (!text_tag_table) { text_tag_table = gtk_text_tag_table_new(); tag = gtk_text_tag_new("uline"); g_object_set(G_OBJECT(tag), "underline", PANGO_UNDERLINE_SINGLE, NULL); gtk_text_tag_table_add(text_tag_table, tag); g_object_unref(G_OBJECT(tag)); tag = gtk_text_tag_new("bold"); g_object_set(G_OBJECT(tag), "weight", PANGO_WEIGHT_BOLD, NULL); gtk_text_tag_table_add(text_tag_table, tag); g_object_unref(G_OBJECT(tag)); tag = gtk_text_tag_new("blink"); gtk_text_tag_table_add(text_tag_table, tag); g_object_unref(G_OBJECT(tag)); tag = gtk_text_tag_new("inverse"); g_object_set(G_OBJECT(tag), "foreground", "white", "background", "black", NULL); gtk_text_tag_table_add(text_tag_table, tag); g_object_unref(G_OBJECT(tag)); } w->text_information->buffer = gtk_text_buffer_new(text_tag_table); } winid GTK_create_nhwindow(int type) { int retval = -1; winid id; NHWindow *w; switch(type) { /* * these windows have already been created */ case NHW_MESSAGE: case NHW_STATUS: case NHW_MAP: if (gtkWindows[type].type != type) panic("GTK_create_nhwindow: standard window (%d) not valid", type); retval = type; break; /* * create new window */ case NHW_MENU: case NHW_TEXT: for (id = 0; id < MAXWIN; id++) { w = >kWindows[id]; if (w->type == NHW_NONE) { memset(w, 0, sizeof(NHWindow)); w->type = type; if (type == NHW_MENU) GTK_create_menu_window(w); retval = id; break; } } if (retval < 0) panic("GTK_create_nhwindow: no free windows!"); if (type == NHW_TEXT) init_text_nhwindow(w); break; default: panic("GTK_create_nhwindow: Unknown type (%d)!", type); } return retval; } void GTK_destroy_nhwindow(winid id) { NHWindow *w = >kWindows[id]; switch (w->type) { case NHW_STATUS: case NHW_MESSAGE: case NHW_MAP: return; case NHW_MENU: GTK_destroy_menu_window(w); break; case NHW_TEXT: if (w->w) { gtk_widget_hide_all(w->w); if(w->hid > 0) gtk_signal_disconnect(GTK_OBJECT(w->w), w->hid); gtk_widget_destroy(w->w); } free(w->text_information); break; } memset(w, 0, sizeof(NHWindow)); w->type = NHW_NONE; } /* * Used for close button on blocking text windows. */ static gint blocking_text_clicked(GtkWidget *widget, gpointer data) { nh_key_add('\033'); quit_hook(); return FALSE; } /* * Used for close button on non-blocking text windows. Don't affect the * game state (eg., by setting keysym) and don't call quit_hook. Instead * all we do is close the window. */ static gint text_clicked(GtkWidget *widget, gpointer data) { GtkWidget *window; window = GTK_WIDGET(data); gtk_widget_destroy(window); return FALSE; } /* * Used for destroy signal on non-blocking text windows. All we need to do * is remove the window from the linked list of such windows. */ static gint text_destroy(GtkWidget *widget, gpointer data) { struct nbtw *n = (struct nbtw *)data, *nn; if (n == non_blocking_text_windows) non_blocking_text_windows = n->next; else { for(nn = non_blocking_text_windows; nn; nn = nn->next) if (nn->next == n) { nn->next = n->next; break; } if (!nn) g_warning("Non-blocking text window not in linked list"); } free(n); } /* * Used to destroy all non-blocking text windows when main window is destroyed. */ static void text_destroy_all(void) { struct nbtw *n, *next; for(n = non_blocking_text_windows; n; n = next) { gtk_widget_destroy(n->w); next = n->next; free(n); } non_blocking_text_windows = NULL; } void GTK_display_nhwindow(winid id, BOOLEAN_P blocking) { NHWindow *w = >kWindows[id]; struct nbtw *n, *nbtw; int type = w->type; extern int root_height; GtkWidget *tv; switch(type) { case NHW_STATUS: case NHW_MESSAGE: return; /* We never block on status or message windows */ case NHW_MAP: /* flush out */ nh_map_flush(); break; case NHW_TEXT: /* * [ALI] This probably needs some tidying up. Menus will * already have the relevant signals connected. Text windows * are postponed until now. This allows us to treat blocking * and non-blocking windows differently. */ if (!blocking) { nbtw = (struct nbtw *) alloc(sizeof(struct nbtw)); md5_finish(&w->text_information->md5_state, nbtw->digest); /* See if there already exists a non-blocking text window * with the same contents and if so present it rather than * creating a duplicate window. */ for (n = non_blocking_text_windows; n; n = n->next) if (!memcmp(nbtw->digest, n->digest, sizeof(n->digest))) { gtk_window_present(GTK_WINDOW(n->w)); g_object_unref(w->text_information->buffer); w->text_information->buffer = NULL; free(nbtw); return; } nbtw->next = non_blocking_text_windows; non_blocking_text_windows = nbtw; nbtw->w = w->w = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_transient_for(GTK_WINDOW(w->w), GTK_WINDOW(main_window)); } else { w->w = nh_gtk_window_dialog(TRUE); #if GTK_CHECK_VERSION(1,3,2) gtk_window_set_destroy_with_parent(GTK_WINDOW(w->w), TRUE); #endif } gtk_widget_set_name(GTK_WIDGET(w->w), "fixed font"); nh_gtk_focus_set_slave_for(GTK_WINDOW(w->w), GTK_WINDOW(main_window)); w->frame = nh_gtk_new_and_add(gtk_frame_new(NULL), w->w, ""); w->vbox = nh_gtk_new_and_add(gtk_vbox_new(FALSE, 0), w->frame, ""); w->scrolled = nh_gtk_new_and_add(gtk_scrolled_window_new(NULL, NULL), w->vbox, ""); /* We switch to automatic after the window is first displayed. * This has the effect of sizing the window based on the contents. */ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(w->scrolled), GTK_POLICY_NEVER, GTK_POLICY_NEVER); tv = gtk_text_view_new_with_buffer(w->text_information->buffer); g_object_unref(w->text_information->buffer); w->text_information->buffer = NULL; GTK_WIDGET_UNSET_FLAGS(tv, GTK_CAN_FOCUS); gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(tv), GTK_WRAP_NONE); gtk_text_view_set_editable(GTK_TEXT_VIEW(tv), FALSE); gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(tv), FALSE); gtk_container_add(GTK_CONTAINER(w->scrolled), tv); w->hbox = nh_gtk_new_and_pack(gtk_hbox_new(FALSE, 0), w->vbox, "", FALSE, FALSE, NH_PAD); w->button[0] = nh_gtk_new_and_pack( gtk_button_new_from_stock(GTK_STOCK_CLOSE), w->hbox, "", TRUE, FALSE, 0); GTK_WIDGET_SET_FLAGS(w->button[0], GTK_CAN_DEFAULT); gtk_widget_grab_default(w->button[0]); if (!blocking) { gtk_signal_connect(GTK_OBJECT(w->w), "destroy", GTK_SIGNAL_FUNC(text_destroy), nbtw); gtk_signal_connect(GTK_OBJECT(w->button[0]), "clicked", GTK_SIGNAL_FUNC(text_clicked), (gpointer)w->w); } else { w->hid = gtk_signal_connect(GTK_OBJECT(w->w), "destroy", GTK_SIGNAL_FUNC(default_destroy), &w->w); gtk_signal_connect(GTK_OBJECT(w->button[0]), "clicked", GTK_SIGNAL_FUNC(blocking_text_clicked), (gpointer)w->w); } w->flags |= NHWF_DISPLAYED; nh_position_popup_dialog(GTK_WIDGET(w->w)); gtk_widget_show_all(w->w); while(gtk_events_pending()) gtk_main_iteration(); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(w->scrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); nh_position_popup_dialog(GTK_WIDGET(w->w)); if (!blocking) w->w = NULL; /* Gtk window now independant */ break; case NHW_MENU: if (w->clist && w->clist->requisition.height >= (2 * root_height) / 3) gtk_widget_set_usize(w->clist, -1, (2 * root_height) / 3); blocking = TRUE; /* Menus always block */ #if 0 if (blocking) gtk_grab_add(w->w); #endif w->flags |= NHWF_DISPLAYED; gtk_widget_show_all(w->w); break; } if (blocking && !main_hook(NULL)) (void) nh_key_get(); } void GTK_ext_clear_nhwindow(winid id, int rows, int cols, int layers) { if (gtkWindows[id].type == NHW_MAP) nh_map_clear(rows, cols, layers); } void GTK_putstr(winid id, int attr, const char *str) { const gchar *text[1]; NHWindow *w = >kWindows[id]; int len; char *buf, *tag; GtkTextIter iter; GtkTextBuffer *t; switch (w->type) { case NHW_MESSAGE: nh_message_putstr(str); break; case NHW_STATUS: case NHW_MAP: panic("bad window"); break; case NHW_MENU: /* We don't treat windows of type NHW_MENU any differently from * NHW_TEXT windows once putstr() has been called and it makes * it easier if all text windows have type NHW_TEXT. */ GTK_destroy_menu_window(w); w->type = NHW_TEXT; init_text_nhwindow(w); /* Fall through */ case NHW_TEXT: len = strlen(str); md5_append(&w->text_information->md5_state, str, len); t = w->text_information->buffer; gtk_text_buffer_get_end_iter(t, &iter); if (gtk_text_buffer_get_char_count(t) > 0) { buf = (char *)alloc(++len + 1); sprintf(buf, "\n%s", str); } else buf = (char *)str; if (attr == ATR_NONE) gtk_text_buffer_insert(t, &iter, buf, len); else { if (attr == ATR_ULINE) tag = "uline"; else if (attr == ATR_BOLD) tag = "bold"; else if (attr == ATR_BLINK) tag = "blink"; else tag = "inverse"; gtk_text_buffer_insert_with_tags_by_name(t, &iter, buf, len, tag, NULL); } if (buf != str) free(buf); } } void GTK_get_nh_event() { return; } int GTK_nhgetch(void) { for(;;) { #ifdef WINGTK_RADAR nh_radar_update(); #endif if (!main_hook(NULL)) return nh_key_get(); else { exiting = 0; game_quit(main_window, 0); } } } int GTK_nh_poskey(int *x, int *y, int *mod) { extern int cursm; if (exiting) { exiting = 0; game_quit(main_window, 0); } for(;;) { #ifdef WINGTK_RADAR nh_radar_update(); #endif nh_map_click(TRUE); cursm = 0; if (!main_hook(&cursm)) { nh_map_pos(x, y, mod); nh_map_click(FALSE); return nh_key_check() ? nh_key_get() : 0; } else { exiting = 0; game_quit(main_window, 0); } } } #ifdef GTK_PROXY static char *nh_proxy_cache_defaultdir = #ifdef WIN32 "cache"; #else "$(HOME)/.gtkhack/cache"; #endif static char *nh_proxy_cache_dir = NULL; static int nh_proxy_cache_dir_set = FALSE; /* * Setting the default cache directory (by passing dir as NULL) * has the side effect of creating the directory. If a non-default * directory is used, then it should already exist (if not, then * the cache will never be utilized). */ void nh_proxy_cache_set_dir(const char *dir) { if (nh_proxy_cache_dir) g_free(nh_proxy_cache_dir); nh_proxy_cache_dir_set = !!dir; if (dir) nh_proxy_cache_dir = g_strdup(dir); else { #ifdef WIN32 nh_proxy_cache_dir = g_strdup("cache"); CreateDirectory("cache", NULL); #else char *home = getenv("HOME"); if (!home) home = "/tmp"; nh_proxy_cache_dir = g_strdup_printf("%s/.gtkhack", home); mkdir(nh_proxy_cache_dir, 0777); g_free(nh_proxy_cache_dir); nh_proxy_cache_dir = g_strdup_printf("%s/.gtkhack/cache", home); mkdir(nh_proxy_cache_dir, 0777); #endif } } int nh_proxy_cache_save(struct gtkhackrc *rc) { if (nh_proxy_cache_dir_set) nh_gtkhackrc_store(rc, "proxy.cachedir = \"%s\"", nh_proxy_cache_dir); } char *nh_proxy_cache_file(const char *class, const char *name) { char *path; if (!nh_proxy_cache_dir) nh_proxy_cache_set_dir(NULL); #ifdef WIN32 path = g_strdup_printf("%s\\%s\\%s", nh_proxy_cache_dir, class, name); #else path = g_strdup_printf("%s/%s/%s", nh_proxy_cache_dir, class, name); #endif return path; } void nh_proxy_cache_mkdir(const char *class, const char *name) { char *path; if (!nh_proxy_cache_dir) nh_proxy_cache_set_dir(NULL); #ifdef WIN32 path = g_strdup_printf("%s\\%s", nh_proxy_cache_dir, class); CreateDirectory(path, NULL); #else path = g_strdup_printf("%s/%s", nh_proxy_cache_dir, class); mkdir(path, 0777); #endif g_free(path); } static char *nh_proxy_game_cache_subdir = NULL; /* Take a NhExt sub-protocol 0 value (up to 64 printable ASCII characters * (space to "~") and produce a legal filename. */ char *GTK_regularize(const char *value) { /* * Based on win32 (UNIX is more lenient). Illegal characters are replaced * by a two character code starting with "!" (with "!!" representing "!") * as follows: * / !f (forward slash) * \ !b (backward slash) * < !l (less than) * > !g (greater than) * : !c (colon) * " !q (quote) * | !p (pipe) */ int i, j; char fname[129]; for(i = j = 0; value[i]; i++) switch (value[i]) { case '!': fname[j++] = '!'; fname[j++] = '!'; break; case '/': fname[j++] = '!'; fname[j++] = 'f'; break; case '\\': fname[j++] = '!'; fname[j++] = 'b'; break; case '<': fname[j++] = '!'; fname[j++] = 'l'; break; case '>': fname[j++] = '!'; fname[j++] = 'g'; break; case ':': fname[j++] = '!'; fname[j++] = 'c'; break; case '"': fname[j++] = '!'; fname[j++] = 'q'; break; case '|': fname[j++] = '!'; fname[j++] = 'p'; break; default: fname[j++] = value[i]; break; } fname[j] = '\0'; return strdup(fname); } void nh_proxy_game_cache_set_dir(void) { char *game, *version, *dir; #ifdef WIN32 const char sep = '\\'; #else const char sep = '/'; #endif if (!nh_proxy_cache_dir) nh_proxy_cache_set_dir(NULL); if (nh_proxy_game_cache_subdir) free(nh_proxy_game_cache_subdir); game = GTK_regularize(win_proxy_clnt_gettag("game")); version = GTK_regularize(win_proxy_clnt_gettag("version")); nh_proxy_game_cache_subdir = g_strdup_printf("%s%c%s", game, sep, version); dir = g_strdup_printf("%s%c%s", nh_proxy_cache_dir, sep, game); #ifdef WIN32 CreateDirectory(dir, NULL); #else mkdir(dir, 0777); #endif g_free(dir); dir = g_strdup_printf("%s%c%s", nh_proxy_cache_dir, sep, nh_proxy_game_cache_subdir); #ifdef WIN32 CreateDirectory(dir, NULL); #else mkdir(dir, 0777); #endif g_free(dir); free(game); free(version); } char *nh_proxy_game_cache_file(const char *name) { if (!nh_proxy_game_cache_subdir) nh_proxy_game_cache_set_dir(); return nh_proxy_cache_file(nh_proxy_game_cache_subdir, name); } static int GTK_fp_read(void *handle, void *buf, unsigned int len) { int nb; nb = fread(buf, 1, len, (FILE *)handle); return nb >= 0 ? nb : -1; } static int GTK_fp_write(void *handle, void *buf, unsigned int len) { int nb; nb = fwrite(buf, 1, len, (FILE *)handle); return nb >= 0 ? nb : -1; } static GHashTable *GTK_io_hash = NULL; NhExtIO *GTK_io_open(const char *filename, unsigned int flags) { FILE *fp; NhExtIO *io; if (!GTK_io_hash) { GTK_io_hash = g_hash_table_new(NULL, NULL); if (!GTK_io_hash) return NULL; } if (flags & NHEXT_IO_WRONLY) { fp = fopen(filename, "wb"); if (fp) io = nhext_io_open(GTK_fp_write, (void *)fp, flags); else return NULL; } else { fp = fopen(filename, "rb"); if (fp) io = nhext_io_open(GTK_fp_read, (void *)fp, flags); else return NULL; } if (!io) { fclose(fp); if (!g_hash_table_size(GTK_io_hash)) { g_hash_table_destroy(GTK_io_hash); GTK_io_hash = NULL; } } else g_hash_table_insert(GTK_io_hash, (gpointer)io, (gpointer)fp); return io; } int GTK_io_close(NhExtIO *io) { int retval; FILE *fp; if (!GTK_io_hash) return -1; fp = (FILE *)g_hash_table_lookup(GTK_io_hash, io); if (!fp) return -1; retval = nhext_io_close(io); retval |= fclose(fp); g_hash_table_remove(GTK_io_hash, io); if (!g_hash_table_size(GTK_io_hash)) { g_hash_table_destroy(GTK_io_hash); GTK_io_hash = NULL; } return retval; } static GHashTable *GTK_dlbh_md5sum_hash = NULL; char * nh_proxy_cache_dlbh_fmd5sum(const char *name) { char *md5sum = NULL; if (!GTK_dlbh_md5sum_hash) GTK_dlbh_md5sum_hash = g_hash_table_new(g_str_hash, g_str_equal); else { md5sum = g_hash_table_lookup(GTK_dlbh_md5sum_hash, name); if (md5sum) md5sum = strdup(md5sum); } if (!md5sum) { md5sum = proxy_cb_dlbh_fmd5sum(name); if (GTK_dlbh_md5sum_hash) g_hash_table_insert(GTK_dlbh_md5sum_hash, strdup(name), strdup(md5sum)); } return md5sum; } static int GTK_display_file(char *name) { int fh; fh = proxy_cb_dlbh_fopen(name, "r"); if (fh < 0) return FALSE; GTK_ext_display_file(fh); proxy_cb_dlbh_fclose(fh); return TRUE; } #define NH_DLBH_PROXY_FREE 1 #define NH_DLBH_PROXY_DATACACHED 2 struct nh_dlbh_proxy { int fh; FILE *cache; char *cname; long read_ahead; char *buffer; unsigned long flags; }; static struct nh_dlbh_proxy *nh_dlbh_nodes = NULL; static int n_nh_dlbh_nodes = 0; static int nh_dlbh_proxy_new() { int i; for(i = 0; i < n_nh_dlbh_nodes; i++) if (nh_dlbh_nodes[i].flags & NH_DLBH_PROXY_FREE) { memset(nh_dlbh_nodes + i, 0, sizeof(*nh_dlbh_nodes)); return i; } ++n_nh_dlbh_nodes; nh_dlbh_nodes = g_renew(struct nh_dlbh_proxy, nh_dlbh_nodes, n_nh_dlbh_nodes); memset(nh_dlbh_nodes + n_nh_dlbh_nodes - 1, 0, sizeof(*nh_dlbh_nodes)); return n_nh_dlbh_nodes - 1; } static void nh_dlbh_proxy_free(int n) { int i; for(i = n + 1; i < n_nh_dlbh_nodes; i++) if (!(nh_dlbh_nodes[i].flags & NH_DLBH_PROXY_FREE)) { nh_dlbh_nodes[n].flags |= NH_DLBH_PROXY_FREE; return; } for(i = n - 1; i >= 0; i--) if (!(nh_dlbh_nodes[i].flags & NH_DLBH_PROXY_FREE)) { n_nh_dlbh_nodes = i + 1; return; } n_nh_dlbh_nodes = 0; g_free(nh_dlbh_nodes); nh_dlbh_nodes = NULL; } #endif /* GTK_PROXY */ int nh_dlbh_fopen(const char *class, const char *name, const char *mode) { #ifdef GTK_PROXY int fh; char *md5sum; md5sum = nh_proxy_cache_dlbh_fmd5sum(name); if (!md5sum) return -1; fh = nh_dlbh_proxy_new(); nh_dlbh_nodes[fh].cname = nh_proxy_cache_file(class, md5sum); nh_dlbh_nodes[fh].cache = fopen(nh_dlbh_nodes[fh].cname, mode); if (nh_dlbh_nodes[fh].cache) { g_free(md5sum); nh_dlbh_nodes[fh].fh = -1; return fh; } nh_dlbh_nodes[fh].fh = proxy_cb_dlbh_fopen(name, mode); if (nh_dlbh_nodes[fh].fh >= 0) { nh_dlbh_nodes[fh].cache = fopen(nh_dlbh_nodes[fh].cname, "wb"); if (!nh_dlbh_nodes[fh].cache) { nh_proxy_cache_mkdir(class, md5sum); nh_dlbh_nodes[fh].cache = fopen(nh_dlbh_nodes[fh].cname, "wb"); } if (!nh_dlbh_nodes[fh].cache) { g_free(nh_dlbh_nodes[fh].cname); nh_dlbh_nodes[fh].cname = NULL; } g_free(md5sum); return fh; } g_free(nh_dlbh_nodes[fh].cname); g_free(md5sum); nh_dlbh_proxy_free(fh); return -1; #else # ifdef FILE_AREAS return dlbh_fopen(FILE_AREA_SHARE, name, mode); # else return dlbh_fopen(name, mode); # endif #endif } int nh_dlbh_fclose(int fh) { #ifdef GTK_PROXY int retval = 0; char *buf; if (nh_dlbh_nodes[fh].fh >= 0) { if (nh_dlbh_nodes[fh].cache) { if (nh_dlbh_nodes[fh].flags & NH_DLBH_PROXY_DATACACHED) { /* Caller closed file before EOF. To ensure the cached copy * is valid we must finish reading the file. nh_dlbh_fread() * will close the cache file on completion or error. */ buf = g_malloc(1024); while(nh_dlbh_nodes[fh].cache) (void) nh_dlbh_fread(buf, 1, 1024, fh); g_free(buf); } else { /* No data cached (typically used to check file is available * for reading). Discard the empty cache file. */ fclose(nh_dlbh_nodes[fh].cache); nh_dlbh_nodes[fh].cache = NULL; remove(nh_dlbh_nodes[fh].cname); g_free(nh_dlbh_nodes[fh].cname); nh_dlbh_nodes[fh].cname = NULL; } } retval = proxy_cb_dlbh_fclose(nh_dlbh_nodes[fh].fh); } if (nh_dlbh_nodes[fh].cache) fclose(nh_dlbh_nodes[fh].cache); if (nh_dlbh_nodes[fh].cname) g_free(nh_dlbh_nodes[fh].cname); nh_dlbh_proxy_free(fh); return retval; #else return dlbh_fclose(fh); #endif } char *nh_dlbh_fgets(char *buf, int len, int fh) { #ifdef GTK_PROXY int nr; /* Number of bytes read */ char *s; if (nh_dlbh_nodes[fh].fh >= 0) { if (!nh_dlbh_nodes[fh].cache) return proxy_cb_dlbh_fgets(buf, len, nh_dlbh_nodes[fh].fh); if (nh_dlbh_nodes[fh].read_ahead > 0) { s = memchr(nh_dlbh_nodes[fh].buffer, '\n', nh_dlbh_nodes[fh].read_ahead); if (s) { nr = min(len - 1, s - nh_dlbh_nodes[fh].buffer + 1); memcpy(buf, nh_dlbh_nodes[fh].buffer, nr); buf[nr] = '\0'; nh_dlbh_nodes[fh].read_ahead -= nr; if (nh_dlbh_nodes[fh].read_ahead) memmove(nh_dlbh_nodes[fh].buffer, nh_dlbh_nodes[fh].buffer + nr, nh_dlbh_nodes[fh].read_ahead); else { g_free(nh_dlbh_nodes[fh].buffer); nh_dlbh_nodes[fh].buffer = NULL; } return buf; } nr = nh_dlbh_nodes[fh].read_ahead; memcpy(buf, nh_dlbh_nodes[fh].buffer, nr); nh_dlbh_nodes[fh].read_ahead = 0; g_free(nh_dlbh_nodes[fh].buffer); nh_dlbh_nodes[fh].buffer = NULL; } else nr = 0; s = proxy_cb_dlbh_fgets(buf + nr, len - nr, nh_dlbh_nodes[fh].fh); if (!s) { /* * On EOF/ERROR, finish up the cache file * (which we assume is now complete). */ fclose(nh_dlbh_nodes[fh].cache); nh_dlbh_nodes[fh].cache = NULL; g_free(nh_dlbh_nodes[fh].cname); nh_dlbh_nodes[fh].cname = NULL; } else { if (fputs(buf + nr, nh_dlbh_nodes[fh].cache) < 0) { /* Write error occured - discard cached copy */ fclose(nh_dlbh_nodes[fh].cache); nh_dlbh_nodes[fh].cache = NULL; remove(nh_dlbh_nodes[fh].cname); g_free(nh_dlbh_nodes[fh].cname); nh_dlbh_nodes[fh].cname = NULL; } nh_dlbh_nodes[fh].flags |= NH_DLBH_PROXY_DATACACHED; } return s ? buf : NULL; } else return fgets(buf, len, nh_dlbh_nodes[fh].cache); #else return dlbh_fgets(buf, len, fh); #endif } int nh_dlbh_fread(char *buf, int size, int quan, int fh) { #ifdef GTK_PROXY int retval; int nb; /* Number of bytes still to read */ int nr; /* Number of bytes read */ char *buffer; if (nh_dlbh_nodes[fh].fh >= 0) { if (!nh_dlbh_nodes[fh].cache) return proxy_cb_dlbh_fread(buf, size, quan, nh_dlbh_nodes[fh].fh); /* * Note: proxy_cb_dlbh_fread() may discard bytes on EOF if size is * greater than 1, so we have to take care never to call it with * size > 1 if we are caching a copy. */ nb = size * quan; nr = 0; if (nh_dlbh_nodes[fh].read_ahead > 0) { nr = min(nh_dlbh_nodes[fh].read_ahead, nb); memcpy(buf, nh_dlbh_nodes[fh].buffer, nr); nb -= nr; nh_dlbh_nodes[fh].read_ahead -= nr; if (nh_dlbh_nodes[fh].read_ahead) memmove(nh_dlbh_nodes[fh].buffer, nh_dlbh_nodes[fh].buffer + nr, nh_dlbh_nodes[fh].read_ahead); else { g_free(nh_dlbh_nodes[fh].buffer); nh_dlbh_nodes[fh].buffer = NULL; } } /* At this point, either nb or read_ahead must be zero */ while (nb) { retval = proxy_cb_dlbh_fread(buf + nr, 1, nb, nh_dlbh_nodes[fh].fh); if (retval < 0) { /* * If we get a read error, then discard the cache file and * return an error immediately. * Note: We could do better than this by returning what * data we do have now and setting a flag so that an error * can be returned later, but there seems little point. */ fclose(nh_dlbh_nodes[fh].cache); nh_dlbh_nodes[fh].cache = NULL; remove(nh_dlbh_nodes[fh].cname); g_free(nh_dlbh_nodes[fh].cname); nh_dlbh_nodes[fh].cname = NULL; return -1; } else if (!retval) { /* * On EOF, finish up the cache file (which is now complete), * save any part objects in the read-ahead buffer and return * the number of complete objects read. */ fclose(nh_dlbh_nodes[fh].cache); nh_dlbh_nodes[fh].cache = NULL; g_free(nh_dlbh_nodes[fh].cname); nh_dlbh_nodes[fh].cname = NULL; nh_dlbh_nodes[fh].read_ahead = nr % size; if (nh_dlbh_nodes[fh].read_ahead) { nh_dlbh_nodes[fh].buffer = g_malloc(nh_dlbh_nodes[fh].read_ahead); memcpy(nh_dlbh_nodes[fh].buffer, buf + nr - nh_dlbh_nodes[fh].read_ahead, nh_dlbh_nodes[fh].read_ahead); } return nr / size; } else { if (fwrite(buf + nr, 1, retval, nh_dlbh_nodes[fh].cache) != retval) { /* Write error occured - discard cached copy */ fclose(nh_dlbh_nodes[fh].cache); nh_dlbh_nodes[fh].cache = NULL; remove(nh_dlbh_nodes[fh].cname); g_free(nh_dlbh_nodes[fh].cname); nh_dlbh_nodes[fh].cname = NULL; } nr += retval; nb -= retval; nh_dlbh_nodes[fh].flags |= NH_DLBH_PROXY_DATACACHED; } } /* All requested data read */ return quan; } else return fread(buf, size, quan, nh_dlbh_nodes[fh].cache); #else return dlbh_fread(buf, size, quan, fh); #endif } int nh_dlbh_fseek(int fh, long pos, int whence) { #ifdef GTK_PROXY if (nh_dlbh_nodes[fh].fh >= 0) return -1; else return fseek(nh_dlbh_nodes[fh].cache, pos, whence); #else return dlbh_fseek(fh, pos, whence); #endif } int nh_dlbh_ftell(int fh) { #ifdef GTK_PROXY if (nh_dlbh_nodes[fh].fh >= 0) return -1; else return ftell(nh_dlbh_nodes[fh].cache); #else return dlbh_ftell(fh); #endif } #if GTK_CHECK_VERSION(2,0,0) # define USE_TEXTVIEW #endif int nh_set_help_font(gchar *name) { if (help_font_name) g_free(help_font_name); help_font_name = g_strdup(name); return 0; } int nh_help_save(struct gtkhackrc *rc) { if (help_font_name) nh_gtkhackrc_store(rc, "help.font = \"%s\"", help_font_name); } #ifdef USE_TEXTVIEW static void GTK_ext_display_file_setfont_apply(GtkButton *button, GtkFontSelectionDialog *fsd) { GtkTextBuffer *buffer; GtkTextTagTable *tagtable; GtkTextTag *tag; GtkTextIter start, end; if (help_font_name) g_free(help_font_name); help_font_name = gtk_font_selection_dialog_get_font_name(fsd); if (help_font_name) { buffer = GTK_TEXT_BUFFER(g_object_get_data(G_OBJECT(fsd), "display-file-buffer")); tagtable = gtk_text_buffer_get_tag_table(buffer); tag = gtk_text_tag_table_lookup(tagtable, "body"); g_object_set(tag, "font", help_font_name, NULL); gtk_text_buffer_get_bounds(buffer, &start, &end); gtk_text_buffer_apply_tag(buffer, tag, &start, &end); } } static void GTK_ext_display_file_setfont(GtkButton *button, GtkTextBuffer *buffer) { static GtkWidget *SetFont = NULL; if (SetFont) gtk_window_present(GTK_WINDOW(SetFont)); else { SetFont = gtk_font_selection_dialog_new("Set font for documentation"); gtk_font_selection_dialog_set_font_name( GTK_FONT_SELECTION_DIALOG(SetFont), help_font_name); g_object_ref(G_OBJECT(buffer)); g_object_set_data_full(G_OBJECT(SetFont), "display-file-buffer", buffer, g_object_unref); gtk_widget_show(GTK_FONT_SELECTION_DIALOG(SetFont)->apply_button); g_signal_connect( GTK_OBJECT(GTK_FONT_SELECTION_DIALOG(SetFont)->apply_button), "clicked", G_CALLBACK(GTK_ext_display_file_setfont_apply), SetFont); g_signal_connect( GTK_OBJECT(GTK_FONT_SELECTION_DIALOG(SetFont)->ok_button), "clicked", G_CALLBACK(GTK_ext_display_file_setfont_apply), SetFont); g_signal_connect_swapped( GTK_OBJECT(GTK_FONT_SELECTION_DIALOG(SetFont)->ok_button), "clicked", G_CALLBACK(gtk_widget_destroy), SetFont); g_signal_connect_swapped( GTK_OBJECT(GTK_FONT_SELECTION_DIALOG(SetFont)->cancel_button), "clicked", G_CALLBACK(gtk_widget_destroy), SetFont); gtk_widget_show(SetFont); gtk_signal_connect(GTK_OBJECT(SetFont), "destroy", GTK_SIGNAL_FUNC(gtk_widget_destroyed), &SetFont); } } #endif void GTK_ext_display_file(int fh) { guint hid; GtkWidget *w; #ifdef USE_TEXTVIEW GtkWidget *scrolledwindow; static GtkTextTagTable *tagtable = NULL; static GtkTextTag *tag = NULL; GtkTextBuffer *buffer; GtkTextIter start, end; #else GtkWidget *scrollbar; GtkWidget *hbox; #endif GtkWidget *label; GtkWidget *vbox; GtkWidget *bbox; GtkWidget *text; GtkWidget *button; char buf[NH_BUFSIZ]; w = nh_gtk_window_dialog(FALSE); gtk_widget_set_name(GTK_WIDGET(w), "fixed font"); nh_position_popup_dialog(GTK_WIDGET(w)); nh_gtk_focus_set_slave_for(GTK_WINDOW(w), GTK_WINDOW(main_window)); hid = gtk_signal_connect(GTK_OBJECT(w), "destroy", GTK_SIGNAL_FUNC(default_destroy), &w); vbox = nh_gtk_new_and_add(gtk_vbox_new(FALSE, 0), w, ""); label = nh_gtk_new_and_pack(gtk_label_new("HELP"), vbox, "", FALSE, FALSE, NH_PAD); #ifdef USE_TEXTVIEW gtk_window_set_default_size(GTK_WINDOW(w), 600, (root_height * 2)/3); scrolledwindow = nh_gtk_new_and_pack(gtk_scrolled_window_new(NULL, NULL), vbox, "", TRUE, TRUE, NH_PAD); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); if (!tagtable) { tagtable = gtk_text_tag_table_new(); tag = gtk_text_tag_new("body"); if (!help_font_name) help_font_name = g_strdup("Courier 12"); g_object_set(G_OBJECT(tag), "font", help_font_name, NULL); gtk_text_tag_table_add(tagtable, tag); } buffer = gtk_text_buffer_new(tagtable); text = nh_gtk_new_and_add(gtk_text_view_new_with_buffer(buffer), scrolledwindow, ""); g_object_unref(buffer); GTK_WIDGET_UNSET_FLAGS(text, GTK_CAN_FOCUS); gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(text), GTK_WRAP_WORD); gtk_text_view_set_editable(GTK_TEXT_VIEW(text), FALSE); #else hbox = nh_gtk_new_and_pack(gtk_hbox_new(FALSE, 0), vbox, "", FALSE, FALSE, NH_PAD); text = nh_gtk_new_and_pack(gtk_text_new(NULL, NULL), hbox, "", FALSE, FALSE, NH_PAD); gtk_widget_set_usize(GTK_WIDGET(text), 600, (root_height * 2)/3); scrollbar = nh_gtk_new_and_pack(gtk_vscrollbar_new(GTK_TEXT(text)->vadj), hbox, "", FALSE, FALSE, NH_PAD); #endif bbox = nh_gtk_new_and_pack(gtk_hbutton_box_new(), vbox, "", FALSE, FALSE, NH_PAD); gtk_container_set_border_width(GTK_CONTAINER(bbox), 5); gtk_box_set_spacing(GTK_BOX(bbox), 5); gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_END); #ifdef USE_TEXTVIEW button = nh_gtk_new_and_add(gtk_button_new_with_mnemonic("_Set font..."), bbox, ""); gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(GTK_ext_display_file_setfont), buffer); #endif button = nh_gtk_new_and_add(gtk_button_new_from_stock(GTK_STOCK_CLOSE), bbox, ""); gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(default_button_press), (gpointer)'\033'); #ifndef GTK_PROXY while(dlbh_fgets(buf, NH_BUFSIZ, fh)) { #else while(proxy_cb_dlbh_fgets(buf, NH_BUFSIZ, fh)) { #endif char *s; if ((s = index(buf, '\r')) != 0) memmove(s, s + 1, strlen(s)); #ifdef USE_TEXTVIEW gtk_text_buffer_insert_at_cursor(buffer, buf, strlen(buf)); #else gtk_text_insert(GTK_TEXT(text), NULL, NULL, NULL, buf, strlen(buf)); #endif } #ifdef USE_TEXTVIEW gtk_text_buffer_get_bounds(buffer, &start, &end); gtk_text_buffer_apply_tag(buffer, tag, &start, &end); #endif gtk_widget_show_all(w); if (!main_hook(NULL)) (void)nh_key_get(); if (w) { gtk_signal_disconnect(GTK_OBJECT(w), hid); #ifndef USE_TEXTVIEW gtk_widget_destroy(hbox2); gtk_widget_destroy(scrollbar); #endif gtk_widget_destroy(text); gtk_widget_destroy(bbox); gtk_widget_destroy(label); gtk_widget_destroy(vbox); gtk_widget_destroy(w); } } int GTK_ext_player_selection(int *role, int *race, int *gend, int *align) { in_player_selection = TRUE; select_player_flags.role = *role; select_player_flags.race = *race; select_player_flags.gend = *gend; select_player_flags.align = *align; init_select_player(TRUE); gtk_item_factory_create_items(main_item_factory, nmenu_items, menu_items, NULL); nh_menu_sensitive("/Game/Play", TRUE); nh_menu_sensitive("/Game/Save", FALSE); nh_menu_sensitive("/Move", FALSE); nh_menu_sensitive("/Fight", FALSE); nh_menu_sensitive("/Check", FALSE); nh_menu_sensitive("/Equip", FALSE); nh_menu_sensitive("/You", FALSE); nh_menu_sensitive("/Adventure", FALSE); nh_menu_sensitive("/Action", FALSE); nh_menu_sensitive("/Religion", FALSE); nh_menu_sensitive("/Special", FALSE); nh_option_lock(FALSE); gtk_main(); nh_menu_sensitive("/Game/Play", FALSE); nh_menu_sensitive("/Game/Save", TRUE); nh_menu_sensitive("/Game/Save", TRUE); nh_menu_sensitive("/Move", TRUE); nh_menu_sensitive("/Fight", TRUE); nh_menu_sensitive("/Check", TRUE); nh_menu_sensitive("/Equip", TRUE); nh_menu_sensitive("/You", TRUE); nh_menu_sensitive("/Adventure", TRUE); nh_menu_sensitive("/Action", TRUE); nh_menu_sensitive("/Religion", TRUE); nh_menu_sensitive("/Special", TRUE); nh_option_lock(TRUE); *role = select_player_flags.role; *race = select_player_flags.race; *gend = select_player_flags.gend; *align = select_player_flags.align; in_player_selection = FALSE; return exiting; } static void GTK_display_inventory(void) { display_inventory_needed = FALSE; #ifdef GTK_PROXY proxy_cb_display_inventory(); #else (void) display_inventory((char *)0, FALSE); #endif } void GTK_update_inventory(void) { #ifdef GTK_PROXY winid inven = proxy_cb_get_standard_winid("INVEN"); #else winid inven = WIN_INVEN; #endif copts.perm_invent = nh_option_cache_get_bool("perm_invent"); if (copts.perm_invent) { if (inven == WIN_ERR || !(gtkWindows[inven].flags & NHWF_DISPLAYED)) display_inventory_needed = TRUE; else GTK_display_inventory(); } else if (inven != WIN_ERR) GTK_unmap_menu_window(>kWindows[inven]); } void GTK_wait_synch() { } void GTK_mark_synch() { } volatile int delay_finished; static gint delay_timeout(gpointer data) { delay_finished++; return FALSE; } void GTK_number_pad(int state) { copts.num_pad = (boolean)state; } void GTK_delay_output() { if (GTK_initialized) { delay_finished = 0; gtk_timeout_add(50L, delay_timeout, 0); while (!delay_finished) gtk_main_iteration(); } } #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 */ static struct{ GdkWChar str[NH_BUFSIZ]; int len; int width; } rip_line[YEAR_LINE + 1]; int GTK_ext_outrip(winid id, char *str) { int x, y; int width; int total_len, len, line; GtkWidget *w; GtkWidget *vbox; GtkWidget *rip; GdkPixmap *rip_pixmap; char mstr[NH_BUFSIZ]; GdkWChar *wc; GdkWChar wstr[NH_BUFSIZ]; extern const char *killed_by_prefix[]; char *rip_file; GdkFont *rip_font; char *gold; char *player; gint dummy; gint height = 0, ascent, descent; w = nh_gtk_window_dialog(TRUE); gtk_window_set_position(GTK_WINDOW(w), GTK_WIN_POS_CENTER); gtk_widget_set_events(w, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK); gtk_signal_connect(GTK_OBJECT(w), "button_press_event", GTK_SIGNAL_FUNC(default_button_press), NULL); nh_gtk_focus_set_slave_for(GTK_WINDOW(w), GTK_WINDOW(main_window)); gtk_signal_connect(GTK_OBJECT(w), "destroy", GTK_SIGNAL_FUNC(default_destroy), &w); gtk_widget_realize(w); vbox = nh_gtk_new_and_add(gtk_vbox_new(FALSE, 0), w, ""); #if defined(GTK_PROXY) || !defined(FILE_AREAS) # ifdef UNIX rip_file = "/usr/share/games/gtkhack/rip.xpm"; # else rip_file = "rip.xpm"; # endif #else rip_file = make_file_name(FILE_AREA_SHARE, "rip.xpm"); #endif rip_pixmap = gdk_pixmap_create_from_xpm(w->window, 0, 0, rip_file); #if !defined(GTK_PROXY) && defined(FILE_AREAS) free(rip_file); #endif if (!rip_pixmap) { rip_pixmap = gdk_pixmap_new(w->window, 310, 200, -1); gdk_draw_rectangle(rip_pixmap, w->style->white_gc, TRUE, 0, 0, 310, 200); } rip = nh_gtk_new_and_pack(gtk_pixmap_new(rip_pixmap, 0), vbox, "", FALSE, FALSE, NH_PAD); rip_font = gtk_style_get_font(rip->style); player = nh_status_last_displayed("player"); Sprintf(mstr, "%s", player ? player : "Rodney"); rip_line[NAME_LINE].len = gdk_mbstowcs(rip_line[NAME_LINE].str, mstr, NH_BUFSIZ); gold = nh_status_last_displayed("gold"); Sprintf(mstr, "%s Au", gold ? gold : "0"); rip_line[GOLD_LINE].len = gdk_mbstowcs(rip_line[GOLD_LINE].str, mstr, NH_BUFSIZ); Sprintf(mstr, "%4d", getyear()); rip_line[YEAR_LINE].len = gdk_mbstowcs(rip_line[YEAR_LINE].str, mstr, NH_BUFSIZ); total_len = gdk_mbstowcs(wstr, str, NH_BUFSIZ); line = DEATH_LINE; wc = wstr; while(total_len > 0 && line < YEAR_LINE) { len = total_len; while(1) { width = gdk_text_width_wc(rip_font, wc, len); if (width < 96) break; --len; } memcpy(rip_line[line].str, wc, len * sizeof(GdkWChar)); rip_line[line].len = len; wc += len; total_len -= len; ++line; } x = 155; y = 78; for(line = 0; line <= YEAR_LINE; line++) { gdk_text_extents_wc(rip_font, rip_line[line].str, rip_line[line].len, &dummy, &dummy, &rip_line[line].width, &ascent, &descent); if (height < (ascent + descent)) height = ascent + descent; } for(line = 0; line <= YEAR_LINE; line++) { gdk_draw_text_wc(rip_pixmap, rip_font, rip->style->black_gc, x - rip_line[line].width / 2, y, rip_line[line].str, rip_line[line].len); y += height; } gtk_widget_show_all(w); if (!main_hook(NULL)) (void) nh_key_get(); return TRUE; } void GTK_raw_print(const char *str) { if (rawprint_win != WIN_ERR) GTK_putstr(rawprint_win, 0, str); else { #if defined(TTY_GRAPHICS) && !defined(GTK_PROXY) tty_raw_print(str); #else puts(str); (void) fflush(stdout); #endif } } void GTK_raw_print_bold(const char *str) { if (rawprint_win != WIN_ERR) GTK_putstr(rawprint_win, ATR_BOLD, str); else { #if defined(TTY_GRAPHICS) && !defined(GTK_PROXY) tty_raw_print_bold(str); #else puts(str); (void) fflush(stdout); #endif } } �����������������������������������������������������������slashem-0.0.7E7F3/win/gtk/gtkyn.c�������������������������������������������������������������������0000664�0000764�0000764�00000014340�10545462317�014540� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* $Id: gtkyn.c,v 1.12.2.1 2005/01/22 19:09:35 j_ali Exp $ */ /* GTK+ NetHack Copyright (c) Issei Numata 1999-2000 Copyright (c) Slash'EM Development Team 2000-2003 GTK+ NetHack may be freely redistributed. See license for details. */ #include <sys/types.h> #include <signal.h> #include <gtk/gtk.h> #include <gdk/gdkkeysyms.h> #include "winGTK.h" static struct yn_params { const char *query; const char *resp; CHAR_P def; int *count; int isdir; int watch; GtkWidget *w; } params; static gint yn_clicked(GtkWidget *widget, gpointer data) { nh_key_add((char)GPOINTER_TO_INT(data)); return TRUE; } static gint yn_destroy(GtkWidget *widget, gpointer data) { params.w = 0; params.watch++; return FALSE; } static int yn_valid_response(int keysym) { if (!*params.resp || index(params.resp, keysym)) return keysym; else if (keysym == '\n' || keysym == ' ' || keysym == '\033') return params.def; else return 0; } static gint yn_key_press(GtkWidget *widget, GdkEventKey *event, gpointer data) { char keysym; keysym = params.isdir ? nh_dir_keysym(event) : 0; if (!keysym) keysym = nh_keysym(event); keysym = yn_valid_response(keysym); if (keysym) nh_key_add(keysym); return TRUE; } static gboolean yn_show_window(gpointer data) { GtkWidget *window; GtkWidget *frame; GtkWidget *vbox; GtkWidget *hbox; GtkWidget *table = NULL; GtkWidget *y, *n, *q; GtkWidget *d; gchar buf[NH_BUFSIZ], *bp; if (nh_key_check()) /* Avoid race condition */ return FALSE; if (*params.resp) { sprintf(buf, "%s [", params.query); bp = eos(buf); strcpy(bp, params.resp); bp = index(bp, '\033'); if (bp) *bp = '\0'; bp = eos(buf); *bp++ = ']'; if (params.def) sprintf(bp, "(%c) ", params.def); else { *bp++ = ' '; *bp = '\0'; } } else sprintf(buf, "%s ", params.query); window = params.w; gtk_signal_connect(GTK_OBJECT(window), "destroy", GTK_SIGNAL_FUNC(yn_destroy), 0); frame = nh_gtk_new_and_add(gtk_frame_new(buf), window, ""); gtk_container_border_width(GTK_CONTAINER(frame), NH_PAD); vbox = nh_gtk_new_and_add(gtk_vbox_new(FALSE, 0), frame, ""); if (*params.resp) { hbox = nh_gtk_new_and_pack(gtk_hbox_new(FALSE, 0), vbox, "", FALSE, FALSE, NH_PAD); if (!strcmp(params.resp, "yn") || !strcmp(params.resp, "ynq")) { y = nh_gtk_new_and_pack(gtk_button_new_from_stock(GTK_STOCK_YES), hbox, "", FALSE, FALSE, NH_PAD); gtk_signal_connect(GTK_OBJECT(y), "clicked", GTK_SIGNAL_FUNC(yn_clicked), (gpointer)'y'); } if (!strcmp(params.resp, "yn") || !strcmp(params.resp, "ynq") || !strcmp(params.resp, "ynaq") || !strcmp(params.resp, "yn#aq")) { n = nh_gtk_new_and_pack(gtk_button_new_from_stock(GTK_STOCK_NO), hbox, "", FALSE, FALSE, NH_PAD); gtk_signal_connect(GTK_OBJECT(n), "clicked", GTK_SIGNAL_FUNC(yn_clicked), (gpointer)'n'); } if (!strcmp(params.resp, "ynaq") || !strcmp(params.resp, "yn#aq")) { q = nh_gtk_new_and_pack(gtk_button_new_with_label("All"), hbox, "", FALSE, FALSE, NH_PAD); gtk_signal_connect(GTK_OBJECT(q), "clicked", GTK_SIGNAL_FUNC(yn_clicked), (gpointer)'a'); } if (!strcmp(params.resp, "ynq") || !strcmp(params.resp, "ynaq") || !strcmp(params.resp, "yn#aq")) { q = nh_gtk_new_and_pack(gtk_button_new_from_stock(GTK_STOCK_CANCEL), hbox, "", FALSE, FALSE, NH_PAD); gtk_signal_connect(GTK_OBJECT(q), "clicked", GTK_SIGNAL_FUNC(yn_clicked), (gpointer)'q'); } } else { hbox = nh_gtk_new_and_pack(gtk_hbox_new(FALSE, 0), vbox, "", FALSE, FALSE, NH_PAD); if (index(params.query, '*')) { q = nh_gtk_new_and_pack(gtk_button_new_with_label("List"), hbox, "", FALSE, FALSE, NH_PAD); gtk_signal_connect(GTK_OBJECT(q), "clicked", GTK_SIGNAL_FUNC(yn_clicked), (gpointer)'?'); q = nh_gtk_new_and_pack(gtk_button_new_with_label("All List"), hbox, "", FALSE, FALSE, NH_PAD); gtk_signal_connect(GTK_OBJECT(q), "clicked", GTK_SIGNAL_FUNC(yn_clicked), (gpointer)'*'); } else if (params.isdir) { /* maybe direction */ int i, j; struct { char *str; int key; } dirstr[4][3] = { { {"Y", 'y'}, {"K", 'k'}, {"U", 'u'}, }, { {"H", 'h'}, {".", '.'}, {"L", 'l'}, }, { {"B", 'b'}, {"J", 'j'}, {"N", 'n'}, }, { {"Up", '<'}, {"", 0}, {"Down", '>'}, } }, np_dirstr[4][3] = { { {"7", '7'}, {"8", '8'}, {"9", '9'}, }, { {"4", '4'}, {".", '.'}, {"6", '6'}, }, { {"1", '1'}, {"2", '2'}, {"3", '3'}, }, { {"Up", '<'}, {"", 0}, {"Down", '>'}, } }; table = nh_gtk_new_and_pack(gtk_table_new(4, 3, TRUE), hbox, "", FALSE, FALSE, NH_PAD); for(i = 0; i < 4; i++) for(j = 0; j < 3; j++) { d = nh_gtk_new_and_attach( gtk_button_new_with_label(copts.num_pad ? np_dirstr[i][j].str : dirstr[i][j].str), table, "", j, j+1, i, i+1); gtk_signal_connect(GTK_OBJECT(d), "clicked", GTK_SIGNAL_FUNC(yn_clicked), copts.num_pad ? (gpointer)np_dirstr[i][j].key : (gpointer)dirstr[i][j].key); } } } gtk_widget_show_all(window); return FALSE; } char GTK_ext_yn_function(const char *query, const char *resp, CHAR_P def, int *count) { int keysym = 0, exiting; guint timeout_id; while (nh_key_check()) { keysym = nh_key_get(); keysym = yn_valid_response(keysym); } if (!keysym) { params.query = query; params.resp = resp; params.def = def; params.count = count; params.watch = 0; params.isdir = !*resp && strstr(query, "In what direction"); params.w = nh_gtk_window_dialog(FALSE); nh_position_popup_dialog(GTK_WIDGET(params.w)); nh_gtk_focus_set_master(GTK_WINDOW(params.w), GTK_SIGNAL_FUNC(yn_key_press), 0, TRUE); timeout_id = g_timeout_add(500, yn_show_window, 0); exiting = main_hook(¶ms.watch); g_source_remove(timeout_id); if (exiting || params.watch) { /* Either exiting or dialog was created and then closed by user */ nh_key_add(def); } if (params.w) { gtk_widget_destroy(params.w); params.w = 0; } keysym = nh_key_get(); } return keysym; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/gtk/gtkhackrc.c���������������������������������������������������������������0000664�0000764�0000764�00000077244�10545462317�015361� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* $Id: gtkhackrc.c,v 1.12 2004/01/17 12:30:01 j_ali Exp $ */ /* Copyright (c) Slash'EM Development Team 2003 */ /* NetHack may be freely redistributed. See license for details. */ #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #ifdef WIN32 #include <windows.h> #endif #include <glib.h> #include "winGTK.h" #include "prxyclnt.h" /* * This is the version of the gtkhackrc file format only. It has no * relation to the version of gtkhack. Increase the minor version * number when the new file format can not be read by earlier versions * of gtkhack. Increase the major version number (and set minor to 0) * when the new version of gtkhack can not read earlier file formats. * * Note: adding new settings will not normally require changing the * file format version since gtkhack ignores (and preserves) settings * it does not recognize as long as they follow the supported syntax. */ #define GTKHACKRC_VER_MAJOR 0 #define GTKHACKRC_VER_MINOR 2 #define GTKHACKRC_VERSTR(major, minor) #major "." #minor #define GTKHACKRC_VERSTRING(major, minor) GTKHACKRC_VERSTR(major, minor) #define GTKHACKRC_VERSION GTKHACKRC_VERSTRING(GTKHACKRC_VER_MAJOR,\ GTKHACKRC_VER_MINOR) #define PARSE_OK 0 #define PARSE_FAIL 1 #define PARSE_ERROR 2 #ifndef SIZE #define SIZE(array) (sizeof(array)/sizeof(*(array))) #endif #define GTKHACKRC(scanner) ((struct gtkhackrc *)(scanner)->user_data) typedef struct gtkhackrc_variable { /* ident [.ident] ... */ int n_idents; gchar **idents; } GtkHackRcVariable; typedef struct gtkhackrc_value GtkHackRcValue; typedef struct gtkhackrc_valuelist { /* [value [,value] ...] */ int n_values; GtkHackRcValue **values; } GtkHackRcVList; typedef struct gtkhackrc_func { /* var([value [,value] ...]) */ GtkHackRcVariable var; GtkHackRcVList params; } GtkHackRcFunc; #define PARSE_VALUE_TYPE_NUMBER 0 #define PARSE_VALUE_TYPE_STRING 1 #define PARSE_VALUE_TYPE_VARIABLE 2 #define PARSE_VALUE_TYPE_FUNCTION 3 #define PARSE_VALUE_TYPE_RECORD 4 #define PARSE_VALUE_TYPE_VECTOR 5 #define PARSE_VALUE_TYPE_VALUE_LIST 6 #define PARSE_VALUE_TYPE_FREE -1 struct gtkhackrc_value { int type; union { long number; gchar *string; GtkHackRcVariable var; GtkHackRcFunc func; GtkHackRcVList record; GtkHackRcVList vector; GtkHackRcVList vlist; GtkHackRcValue *next; /* For free list */ } u; }; extern int check_rc_version(GScanner *scanner, GtkHackRcValue *value); extern void rc_window_position(GScanner *scanner, GtkHackRcVList *params, GtkHackRcValue *value); extern void rc_window_size(GScanner *scanner, GtkHackRcVList *params, GtkHackRcValue *value); extern void rc_map_font(GScanner *scanner, GtkHackRcValue *value); extern void rc_map_clip_dist2(GScanner *scanner, GtkHackRcValue *value); extern void rc_radar(GScanner *scanner, GtkHackRcValue *value); #ifdef GTKHACK extern void rc_connections(GScanner *scanner, GtkHackRcValue *value); extern void rc_default_connection(GScanner *scanner, GtkHackRcValue *value); #endif #ifdef GTK_PROXY extern void rc_proxy_cachedir(GScanner *scanner, GtkHackRcValue *value); #endif extern void rc_help_font(GScanner *scanner, GtkHackRcValue *value); #define GTKHACKRC_VARIABLE 0 #define GTKHACKRC_FUNCTION 1 typedef struct gtkhackrc_setting GtkHackRcSetting; struct gtkhackrc_setting { int type; const char *name; union { void (*dummy)(); /* For initialization prototyping */ void (*v)(GScanner *scanner, GtkHackRcValue *value); void (*f)(GScanner *scanner, GtkHackRcVList *params, GtkHackRcValue *value); } handler; } gtkhackrc_settings[] = { GTKHACKRC_FUNCTION, "window.position", rc_window_position, GTKHACKRC_FUNCTION, "window.size", rc_window_size, GTKHACKRC_VARIABLE, "map.font", rc_map_font, GTKHACKRC_VARIABLE, "map.clip_dist2", rc_map_clip_dist2, GTKHACKRC_VARIABLE, "radar", rc_radar, #ifdef GTKHACK GTKHACKRC_VARIABLE, "connections", rc_connections, GTKHACKRC_VARIABLE, "default_connection", rc_default_connection, #endif #ifdef GTK_PROXY GTKHACKRC_VARIABLE, "proxy.cachedir", rc_proxy_cachedir, #endif GTKHACKRC_VARIABLE, "help.font", rc_help_font, }; #define PARSE_ERROR_NONE 0 #define PARSE_ERROR_TOKEN 1 /* Expecting token ... */ #define PARSE_ERROR_RULE 2 /* Expecting rule ... */ #define PARSE_ERROR_RESOURCE 3 /* Not enough memory */ #define PARSE_ERROR_INCOMPATIBLE 4 /* Incompatible profile */ struct gtkhackrc { int error_type; union { GTokenType token; gchar *rule; } error; GtkHackRcValue *value; GtkHackRcValue *freelist; gchar *variable; /* Only valid in settings handler */ #ifdef WIN32 /* Only valid in nh_write_gtkhackrc */ HKEY key; #else FILE *fp; #endif }; /* Preserved for writing back to file */ static GSList *unrecognized_settings = NULL; #ifndef WIN32 static gboolean write_verspecific_file = FALSE; #endif static int action_setting(GScanner *scanner, GtkHackRcValue *lhs, GtkHackRcValue *rhs); GtkHackRcValue *new_value(GScanner *scanner, int type) { GtkHackRcValue *v = GTKHACKRC(scanner)->freelist; if (v) GTKHACKRC(scanner)->freelist = v->u.next; else v = g_malloc(sizeof(*v)); v->type = type; return v; } static void free_value(GScanner *scanner, GtkHackRcValue *value) { int i; if (value) { switch(value->type) { case PARSE_VALUE_TYPE_FREE: case PARSE_VALUE_TYPE_NUMBER: break; case PARSE_VALUE_TYPE_STRING: g_free(value->u.string); break; case PARSE_VALUE_TYPE_VARIABLE: for(i = value->u.var.n_idents - 1; i >= 0; i--) g_free(value->u.var.idents[i]); g_free(value->u.var.idents); break; case PARSE_VALUE_TYPE_FUNCTION: for(i = value->u.func.var.n_idents - 1; i >= 0; i--) g_free(value->u.func.var.idents[i]); g_free(value->u.func.var.idents); for(i = value->u.func.params.n_values - 1; i >= 0; i--) free_value(scanner, value->u.func.params.values[i]); g_free(value->u.func.params.values); break; case PARSE_VALUE_TYPE_RECORD: case PARSE_VALUE_TYPE_VECTOR: case PARSE_VALUE_TYPE_VALUE_LIST: for(i = value->u.vlist.n_values - 1; i >= 0; i--) free_value(scanner, value->u.vlist.values[i]); g_free(value->u.vlist.values); break; } value->type = PARSE_VALUE_TYPE_FREE; value->u.next = GTKHACKRC(scanner)->freelist; GTKHACKRC(scanner)->freelist = value; } } /* * Syntax of a GtkHack profile: * * profile : profile setting * | * ; * * setting : lval = value * ; * * lval : variable * | variable '(' ')' * | variable '(' value_list ')' * ; * * variable : identifier * | variable '.' identifier * ; * * value : number * | string * | lval * | record * | vector * ; * * record : '{' value_list '}' * ; * * vector : '[' value_list ']' * | '[' ']' * ; * * value_list : value_list ',' value * | value * ; */ static int parse_setting(GScanner *scanner, int failok); static int parse_lval(GScanner *scanner, int failok); static int parse_variable(GScanner *scanner, int failok); static int parse_value(GScanner *scanner, int failok); static int parse_record(GScanner *scanner, int failok); static int parse_vector(GScanner *scanner, int failok); static int parse_value_list(GScanner *scanner, int failok); static int match(GScanner *scanner, GTokenType token) { if (g_scanner_peek_next_token(scanner) == token) { g_scanner_get_next_token(scanner); return TRUE; } else return FALSE; } /* * Conventions of parse_ functions: * - Must only return PARSE_FAIL if failok set * - If PARSE_OK is returned, then value must be set accordingly * - If PARSE_FAIL is returned, then the read pointer and value * must be unchanged. */ static int parse_setting(GScanner *scanner, int failok) { int i, n, retval; gchar *name; GtkHackRcValue *lhs; GtkHackRcVariable *var; retval = parse_lval(scanner, failok); lhs = GTKHACKRC(scanner)->value; GTKHACKRC(scanner)->value = NULL; if (retval != PARSE_OK) { free_value(scanner, lhs); return retval; } if (!match(scanner, G_TOKEN_EQUAL_SIGN)) { GTKHACKRC(scanner)->error_type = PARSE_ERROR_TOKEN; GTKHACKRC(scanner)->error.token = G_TOKEN_EQUAL_SIGN; free_value(scanner, lhs); return PARSE_ERROR; } retval = parse_value(scanner, FALSE); if (retval == PARSE_OK) retval = action_setting(scanner, lhs, GTKHACKRC(scanner)->value); free_value(scanner, lhs); free_value(scanner, GTKHACKRC(scanner)->value); GTKHACKRC(scanner)->value = NULL; return retval; } static int parse_lval(GScanner *scanner, int failok) { int retval; GtkHackRcValue *func; retval = parse_variable(scanner, failok); if (retval != PARSE_OK) return retval; if (match(scanner, G_TOKEN_LEFT_PAREN)) { func = GTKHACKRC(scanner)->value; GTKHACKRC(scanner)->value = NULL; func->type = PARSE_VALUE_TYPE_FUNCTION; func->u.func.var = func->u.var; retval = parse_value_list(scanner, TRUE); if (retval == PARSE_OK) { func->u.func.params = GTKHACKRC(scanner)->value->u.vlist; GTKHACKRC(scanner)->value->u.vlist.n_values = 0; GTKHACKRC(scanner)->value->u.vlist.values = NULL; free_value(scanner, GTKHACKRC(scanner)->value); } else if (retval == PARSE_FAIL) { func->u.func.params.n_values = 0; func->u.func.params.values = NULL; } GTKHACKRC(scanner)->value = func; if (retval != PARSE_ERROR) if (!match(scanner, G_TOKEN_RIGHT_PAREN)) { GTKHACKRC(scanner)->error_type = PARSE_ERROR_TOKEN; GTKHACKRC(scanner)->error.token = G_TOKEN_RIGHT_PAREN; retval = PARSE_ERROR; } } return retval; } static int parse_variable(GScanner *scanner, int failok) { int n, matched; gchar **new; GtkHackRcValue *var; var = new_value(scanner, PARSE_VALUE_TYPE_VARIABLE); n = 0; var->u.var.idents = NULL; do { matched = match(scanner, G_TOKEN_IDENTIFIER); if (matched) { new = g_realloc(var->u.var.idents, ++n * sizeof(*new)); if (!new) { free_value(scanner, var); GTKHACKRC(scanner)->error_type = PARSE_ERROR_RESOURCE; return PARSE_ERROR; } var->u.var.idents = new; var->u.var.idents[n - 1] = g_strdup(g_scanner_cur_value(scanner).v_identifier); if (!var->u.var.idents[n - 1]) { GTKHACKRC(scanner)->error_type = PARSE_ERROR_RESOURCE; return PARSE_ERROR; } } } while (matched && match(scanner, '.')); var->u.var.n_idents = n; if (!matched) free_value(scanner, var); else GTKHACKRC(scanner)->value = var; if (!failok && !matched) { GTKHACKRC(scanner)->error_type = PARSE_ERROR_TOKEN; GTKHACKRC(scanner)->error.token = G_TOKEN_IDENTIFIER; return PARSE_ERROR; } else return matched ? PARSE_OK : PARSE_FAIL; } static int parse_value(GScanner *scanner, int failok) { int retval; GtkHackRcValue *var; retval = match(scanner, G_TOKEN_INT) ? PARSE_OK : PARSE_FAIL; if (retval == PARSE_OK) { var = new_value(scanner, PARSE_VALUE_TYPE_NUMBER); var->u.number = g_scanner_cur_value(scanner).v_int; } else { retval = match(scanner, G_TOKEN_STRING) ? PARSE_OK : PARSE_FAIL; if (retval == PARSE_OK) { var = new_value(scanner, PARSE_VALUE_TYPE_STRING); var->u.string = g_strdup(g_scanner_cur_value(scanner).v_string); } } if (retval == PARSE_OK) GTKHACKRC(scanner)->value = var; else retval = parse_lval(scanner, TRUE); if (retval == PARSE_FAIL) retval = parse_record(scanner, TRUE); if (retval == PARSE_FAIL) retval = parse_vector(scanner, TRUE); if (!failok && retval == PARSE_FAIL) { GTKHACKRC(scanner)->error_type = PARSE_ERROR_RULE; GTKHACKRC(scanner)->error.rule = "value"; retval = PARSE_ERROR; } return retval; } static int parse_record(GScanner *scanner, int failok) { int retval; if (match(scanner, G_TOKEN_LEFT_CURLY)) { retval = parse_value_list(scanner, FALSE); if (retval == PARSE_OK) { GTKHACKRC(scanner)->value->type = PARSE_VALUE_TYPE_RECORD; if (!match(scanner, G_TOKEN_RIGHT_CURLY)) { GTKHACKRC(scanner)->error_type = PARSE_ERROR_TOKEN; GTKHACKRC(scanner)->error.token = G_TOKEN_RIGHT_CURLY; retval = PARSE_ERROR; } } } else if (!failok) { GTKHACKRC(scanner)->error_type = PARSE_ERROR_TOKEN; GTKHACKRC(scanner)->error.token = G_TOKEN_LEFT_CURLY; retval = PARSE_ERROR; } else retval = PARSE_FAIL; return retval; } static int parse_vector(GScanner *scanner, int failok) { int retval; if (match(scanner, G_TOKEN_LEFT_BRACE)) { retval = parse_value_list(scanner, TRUE); if (retval != PARSE_ERROR) if (match(scanner, G_TOKEN_RIGHT_BRACE)) { if (retval == PARSE_OK) GTKHACKRC(scanner)->value->type = PARSE_VALUE_TYPE_VECTOR; else { GTKHACKRC(scanner)->value = new_value(scanner, PARSE_VALUE_TYPE_VECTOR); GTKHACKRC(scanner)->value->u.vector.n_values = 0; GTKHACKRC(scanner)->value->u.vector.values = NULL; } retval = PARSE_OK; } else { GTKHACKRC(scanner)->error_type = PARSE_ERROR_TOKEN; GTKHACKRC(scanner)->error.token = G_TOKEN_RIGHT_BRACE; retval = PARSE_ERROR; } } else if (!failok) { GTKHACKRC(scanner)->error_type = PARSE_ERROR_TOKEN; GTKHACKRC(scanner)->error.token = G_TOKEN_LEFT_BRACE; retval = PARSE_ERROR; } else retval = PARSE_FAIL; return retval; } static int parse_value_list(GScanner *scanner, int failok) { int n, retval; GtkHackRcValue *vl; GtkHackRcValue **new; vl = new_value(scanner, PARSE_VALUE_TYPE_VALUE_LIST); n = 0; vl->u.vlist.values = NULL; do { retval = parse_value(scanner, failok); if (retval == PARSE_OK) { new = g_realloc(vl->u.vlist.values, ++n * sizeof(*new)); if (!new) { free_value(scanner, vl); GTKHACKRC(scanner)->error_type = PARSE_ERROR_RESOURCE; return PARSE_ERROR; } vl->u.vlist.values = new; vl->u.vlist.values[n - 1] = GTKHACKRC(scanner)->value; GTKHACKRC(scanner)->value = NULL; failok = FALSE; } } while (retval == PARSE_OK && match(scanner, ',')); vl->u.vlist.n_values = n; if (retval != PARSE_OK) free_value(scanner, vl); else GTKHACKRC(scanner)->value = vl; if (!failok && retval == PARSE_FAIL) { GTKHACKRC(scanner)->error_type = PARSE_ERROR_TOKEN; GTKHACKRC(scanner)->error.token = G_TOKEN_IDENTIFIER; retval = PARSE_ERROR; } return retval; } static GString *print_value_list(GtkHackRcVList *vl); static GString *print_variable(GtkHackRcVariable *var) { int i, n; GString *str; n = var->n_idents; for(i = 0; i < var->n_idents; i++) n += strlen(var->idents[i]); str = g_string_sized_new(n - 1); for(i = 0; i < var->n_idents; i++) { if (i) g_string_append_c(str, '.'); g_string_append(str, var->idents[i]); } return str; } static GString *print_value(GtkHackRcValue *var) { int i; GString *str, *vl; switch(var->type) { case PARSE_VALUE_TYPE_NUMBER: str = g_string_new(""); g_string_printf(str, "%ld", var->u.number); return str; case PARSE_VALUE_TYPE_STRING: str = g_string_new(""); g_string_printf(str, "\"%s\"", g_strescape(var->u.string, "")); return str; case PARSE_VALUE_TYPE_VARIABLE: return print_variable(&var->u.var); case PARSE_VALUE_TYPE_FUNCTION: str = print_variable(&var->u.func.var); g_string_append_c(str, '('); if (var->u.func.params.n_values) { vl = print_value_list(&var->u.func.params); g_string_append_len(str, vl->str, vl->len); g_string_free(vl, TRUE); } g_string_append_c(str, ')'); return str; case PARSE_VALUE_TYPE_RECORD: str = g_string_new("{"); vl = print_value_list(&var->u.record); g_string_append_len(str, vl->str, vl->len); g_string_free(vl, TRUE); g_string_append_c(str, '}'); return str; case PARSE_VALUE_TYPE_VECTOR: str = g_string_new("["); if (var->u.vector.n_values) { vl = print_value_list(&var->u.vector); g_string_append_len(str, vl->str, vl->len); g_string_free(vl, TRUE); } g_string_append_c(str, ']'); return str; case PARSE_VALUE_TYPE_VALUE_LIST: return print_value_list(&var->u.vlist); } } static GString *print_value_list(GtkHackRcVList *vl) { int i; GString *str, *v; str = print_value(vl->values[0]); for(i = 1; i < vl->n_values; i++) { g_string_append_c(str, ','); v = print_value(vl->values[i]); g_string_append_len(str, v->str, v->len); g_string_free(v, TRUE); } return str; } static int action_setting(GScanner *scanner, GtkHackRcValue *lhs, GtkHackRcValue *rhs) { int i, n, retval = 0; gchar *name; GString *str, *value; GtkHackRcVariable *var; { if (lhs->type == PARSE_VALUE_TYPE_VARIABLE) var = &lhs->u.var; else var = &lhs->u.func.var; n = var->n_idents; for(i = 0; i < var->n_idents; i++) n += strlen(var->idents[i]); name = g_malloc(n); if (!name) { GTKHACKRC(scanner)->error_type = PARSE_ERROR_RESOURCE; retval = PARSE_ERROR; } else { *name = '\0'; for(i = n = 0; i < var->n_idents; i++) { if (i) name[n++] = '.'; strcpy(name + n, var->idents[i]); n += strlen(var->idents[i]); } GTKHACKRC(scanner)->variable = name; if (lhs->type == PARSE_VALUE_TYPE_VARIABLE) { for(i = 0; i < SIZE(gtkhackrc_settings); i++) if (gtkhackrc_settings[i].type == GTKHACKRC_VARIABLE && !strcmp(gtkhackrc_settings[i].name, name)) break; if (i < SIZE(gtkhackrc_settings)) gtkhackrc_settings[i].handler.v(scanner, rhs); else if (!strcmp(name, "version")) { i = -1; retval = check_rc_version(scanner, rhs); } #ifdef DEBUG else fprintf(stderr, "gtkhackrc: variable %s ignored\n", name); #endif } else { for(i = 0; i < SIZE(gtkhackrc_settings); i++) if (gtkhackrc_settings[i].type == GTKHACKRC_FUNCTION && !strcmp(gtkhackrc_settings[i].name, name)) break; if (i < SIZE(gtkhackrc_settings)) gtkhackrc_settings[i].handler.f(scanner, &lhs->u.func.params, rhs); #ifdef DEBUG else fprintf(stderr, "gtkhackrc: function %s ignored\n", name); #endif } g_free(name); if (i >= SIZE(gtkhackrc_settings)) { str = print_value(lhs); g_string_append(str, " = "); value = print_value(rhs); g_string_append_len(str, value->str, value->len); g_string_free(value, TRUE); unrecognized_settings = g_slist_append(unrecognized_settings, str->str); g_string_free(str, FALSE); } } } return retval; } static void clear_unrecognized() { if (unrecognized_settings) { g_slist_foreach(unrecognized_settings, (GFunc)g_free, NULL); g_slist_free(unrecognized_settings); unrecognized_settings = NULL; } } /* * Return TRUE if okay to write file on exit; FALSE if we failed to read * file due to lack of resources. */ #ifdef WIN32 static int nh_scan_gtkhackrc(GScanner *scanner) { int i, retval; struct gtkhackrc *rc = GTKHACKRC(scanner); GtkHackRcValue *v; HKEY key; DWORD type, no_values, value_len, data_len, value_count, data_count; char *s, *value, *data; int minor; for(minor = GTKHACKRC_VER_MINOR; minor >= 0; minor--) { s = g_strdup_printf("Software\\NetHack\\GtkHack\\%d.%d", GTKHACKRC_VER_MAJOR, minor); retval = RegOpenKeyEx(HKEY_CURRENT_USER, s, 0, KEY_READ, &key); g_free(s); if (retval == ERROR_SUCCESS) break; } if (minor < 0) return TRUE; if (RegQueryInfoKey(key, NULL, NULL, NULL, NULL, NULL, NULL, &no_values, &value_len, &data_len, NULL, NULL) != ERROR_SUCCESS) { RegCloseKey(key); return TRUE; } value = malloc(value_len + 1); data = malloc(data_len + 1); if (!value || !data) { free(value); free(data); RegCloseKey(key); return FALSE; } clear_unrecognized(); for(i = no_values - 1; i >= 0; i--) { value_count = value_len + 1; data_count = data_len + 1; if (RegEnumValue(key, i, value, &value_count, NULL, &type, data, &data_count) == ERROR_SUCCESS && type == REG_SZ) { scanner->input_name = value; g_scanner_input_text(scanner, value, strlen(value)); retval = parse_lval(scanner, FALSE); if (retval == PARSE_OK) { v = GTKHACKRC(scanner)->value; GTKHACKRC(scanner)->value = NULL; g_scanner_input_text(scanner, data, strlen(data)); retval = parse_value(scanner, FALSE); } if (retval == PARSE_OK) retval = action_setting(scanner, v, GTKHACKRC(scanner)->value); if (retval == PARSE_ERROR) { switch (rc->error_type) { case PARSE_ERROR_TOKEN: g_scanner_get_next_token(scanner); g_scanner_unexp_token(scanner, rc->error.token, NULL, NULL, NULL, NULL, TRUE); break; case PARSE_ERROR_RULE: g_scanner_get_next_token(scanner); g_scanner_unexp_token(scanner, scanner->token == G_TOKEN_SYMBOL ? G_TOKEN_IDENTIFIER : G_TOKEN_SYMBOL, rc->error.rule, rc->error.rule, NULL, NULL, TRUE); break; case PARSE_ERROR_RESOURCE: g_scanner_error(scanner, "%s%s%s", "Resource failure", " - ", "Read of GtkHack profile aborted"); i = -1; break; } } } } free(value); free(data); RegCloseKey(key); return retval != PARSE_ERROR || rc->error_type != PARSE_ERROR_RESOURCE; } #else /* WIN32 */ static int nh_scan_gtkhackrc(GScanner *scanner) { int fd, retval; struct gtkhackrc *rc = GTKHACKRC(scanner); char *home, *file; home = getenv("HOME"); if (!home) return FALSE; /* Can't write file */ file = malloc(strlen(home) + 13 + strlen(GTKHACKRC_VERSION)); if (!file) return FALSE; sprintf(file, "%s/.gtkhackrc-" GTKHACKRC_VERSION, home); fd = open(file, O_RDONLY); if (fd < 0) { write_verspecific_file = FALSE; sprintf(file, "%s/.gtkhackrc", home); fd = open(file, O_RDONLY); if (fd < 0) { free(file); return TRUE; } } else write_verspecific_file = TRUE; scanner->input_name = file; g_scanner_input_file(scanner, fd); clear_unrecognized(); while((retval = parse_setting(scanner, TRUE)) == PARSE_OK) ; if (retval == PARSE_ERROR) { switch (rc->error_type) { case PARSE_ERROR_TOKEN: g_scanner_get_next_token(scanner); g_scanner_unexp_token(scanner, rc->error.token, NULL, NULL, NULL, "Read of GtkHack profile aborted", TRUE); break; case PARSE_ERROR_RULE: g_scanner_get_next_token(scanner); g_scanner_unexp_token(scanner, scanner->token == G_TOKEN_SYMBOL ? G_TOKEN_IDENTIFIER : G_TOKEN_SYMBOL, rc->error.rule, rc->error.rule, NULL, "Read of GtkHack profile aborted", TRUE); break; case PARSE_ERROR_RESOURCE: g_scanner_error(scanner, "%s%s%s", "Resource failure", " - ", "Read of GtkHack profile aborted"); break; case PARSE_ERROR_INCOMPATIBLE: g_scanner_error(scanner, "%s%s%s", "Incompatible profile", " - ", "Read of GtkHack profile aborted"); break; default: g_scanner_error(scanner, "%s%s%s", "Unknown error", " - ", "Read of GtkHack profile aborted"); break; } } close(fd); free(file); return retval != PARSE_ERROR || rc->error_type != PARSE_ERROR_RESOURCE; } #endif /* WIN32 */ int nh_read_gtkhackrc(void) { int retval; struct gtkhackrc rc; GScanner *scanner; GtkHackRcValue *v, *vn; scanner = g_scanner_new(NULL); if (!scanner) return -1; rc.error_type = PARSE_ERROR_NONE; rc.value = NULL; rc.freelist = NULL; scanner->user_data = (gpointer)&rc; scanner->config->scan_float = FALSE; /* Don't treat '.' as special */ /* * Don't update the file on exit if we failed to read it correctly * due to a (presumably temporary) resource failure. */ if (nh_scan_gtkhackrc(scanner)) atexit(nh_write_gtkhackrc); free_value(scanner, rc.value); for(v = rc.freelist; v; ) { vn = v->u.next; g_free(v); v = vn; } g_scanner_destroy(scanner); return 0; } void nh_gtkhackrc_store(struct gtkhackrc *rc, const char *fmt, ...) { #ifdef WIN32 gchar *value, *data, *s; #endif va_list args; va_start(args, fmt); #ifdef WIN32 value = g_strdup_vprintf(fmt, args); s = strchr(value, '='); if (s) { for(data = s + 1; *data == ' '; data++) ; for(s--; *s == ' '; s--) ; s[1] = '\0'; RegSetValueEx(rc->key, value, 0, REG_SZ, data, strlen(data) + 1); } free(value); #else vfprintf(rc->fp, fmt, args); putc('\n', rc->fp); #endif va_end(args); } void nh_write_gtkhackrc(void) { struct gtkhackrc rc; GSList *list; #ifdef WIN32 RegDeleteKey(HKEY_CURRENT_USER, "Software\\NetHack\\GtkHack\\" GTKHACKRC_VERSION); RegCreateKeyEx(HKEY_CURRENT_USER, "Software\\NetHack\\GtkHack\\" GTKHACKRC_VERSION, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &rc.key, NULL); #else char *home, *file; home = getenv("HOME"); if (!home) return; if (write_verspecific_file) file = malloc(strlen(home) + 13 + strlen(GTKHACKRC_VERSION)); else file = malloc(strlen(home) + 12); if (!file) return; if (write_verspecific_file) sprintf(file, "%s/.gtkhackrc-" GTKHACKRC_VERSION, home); else sprintf(file, "%s/.gtkhackrc", home); rc.fp = fopen(file, "w"); if (!rc.fp) { perror(file); free(file); return; } fprintf(rc.fp, "# This file is generated by the Gtk interface of NetHack & friends.\n" "# Do not edit.\n" "\n" "version = \"" GTKHACKRC_VERSION "\"\n"); #endif nh_session_save(&rc); GTK_preferences_save(&rc); #ifdef GTKHACK GTK_connection_save(&rc); #endif #ifdef GTK_PROXY nh_proxy_cache_save(&rc); #endif nh_help_save(&rc); if (unrecognized_settings) for(list = unrecognized_settings; list; list = list->next) nh_gtkhackrc_store(&rc, "%s", (gchar *)list->data); #ifdef WIN32 RegCloseKey(rc.key); #else fclose(rc.fp); free(file); #endif } /* Helper functions for handlers to check the value being set and, for * functions, the parameters. */ int gtkhackrc_check_no(GScanner *scanner, GtkHackRcVList *params, const char *names, int mn, int mx) { if (params->n_values > mx) { g_scanner_warn(scanner, "too many %s to function `%s'", names, GTKHACKRC(scanner)->variable); return FALSE; } else if (params->n_values < mn) { g_scanner_warn(scanner, "too few %s to function `%s'", names, GTKHACKRC(scanner)->variable); return FALSE; } else return TRUE; } int gtkhackrc_check_type(GScanner *scanner, GtkHackRcValue *value, const char *name, int type) { char *types[]={"number", "string", "variable", "function", "record", "vector", "value list"}; if (value->type != type) { g_scanner_warn(scanner, "incompatible type for %s of `%s'", name, GTKHACKRC(scanner)->variable); g_scanner_warn(scanner, "(expected %s, got %s)", types[type], value->type >= 0 && value->type < SIZE(types) ? types[value->type] : "value of unknown type"); return FALSE; } else return TRUE; } int check_rc_version(GScanner *scanner, GtkHackRcValue *value) { int major, minor; if (!gtkhackrc_check_type(scanner, value, "value", PARSE_VALUE_TYPE_STRING)) { GTKHACKRC(scanner)->error_type = PARSE_ERROR_INCOMPATIBLE; #ifndef WIN32 write_verspecific_file = TRUE; #endif return PARSE_ERROR; } if (sscanf(value->u.string, "%d.%d", &major, &minor) != 2) { GTKHACKRC(scanner)->error_type = PARSE_ERROR_INCOMPATIBLE; #ifndef WIN32 write_verspecific_file = TRUE; #endif return PARSE_ERROR; } if (major != GTKHACKRC_VER_MAJOR || minor > GTKHACKRC_VER_MINOR) { GTKHACKRC(scanner)->error_type = PARSE_ERROR_INCOMPATIBLE; #ifndef WIN32 if (major >= GTKHACKRC_VER_MAJOR) write_verspecific_file = TRUE; #endif return PARSE_ERROR; } return 0; } void rc_window_position(GScanner *scanner, GtkHackRcVList *params, GtkHackRcValue *value) { if (!gtkhackrc_check_no(scanner, params, "arguments", 1, 1) || !gtkhackrc_check_type(scanner, params->values[0], "argument 1", PARSE_VALUE_TYPE_STRING) || !gtkhackrc_check_type(scanner, value, "value", PARSE_VALUE_TYPE_RECORD) || !gtkhackrc_check_no(scanner, &value->u.record, "fields in value", 2, 2) || !gtkhackrc_check_type(scanner, value->u.record.values[0], "x- value", PARSE_VALUE_TYPE_NUMBER) || !gtkhackrc_check_type(scanner, value->u.record.values[1], "y- value", PARSE_VALUE_TYPE_NUMBER)) return; nh_session_set_geometry(params->values[0]->u.string, value->u.record.values[0]->u.number, value->u.record.values[1]->u.number, -1, -1); } void rc_window_size(GScanner *scanner, GtkHackRcVList *params, GtkHackRcValue *value) { if (!gtkhackrc_check_no(scanner, params, "arguments", 1, 1) || !gtkhackrc_check_type(scanner, params->values[0], "argument 1", PARSE_VALUE_TYPE_STRING) || !gtkhackrc_check_type(scanner, value, "value", PARSE_VALUE_TYPE_RECORD) || !gtkhackrc_check_no(scanner, &value->u.record, "fields in value", 2, 2) || !gtkhackrc_check_type(scanner, value->u.record.values[0], "width", PARSE_VALUE_TYPE_NUMBER) || !gtkhackrc_check_type(scanner, value->u.record.values[1], "height", PARSE_VALUE_TYPE_NUMBER)) return; nh_session_set_geometry(params->values[0]->u.string, -1, -1, value->u.record.values[0]->u.number, value->u.record.values[1]->u.number); } void rc_map_font(GScanner *scanner, GtkHackRcValue *value) { if (!gtkhackrc_check_type(scanner, value, "value", PARSE_VALUE_TYPE_STRING)) return; nh_set_map_font(value->u.string); } void rc_map_clip_dist2(GScanner *scanner, GtkHackRcValue *value) { if (!gtkhackrc_check_type(scanner, value, "value", PARSE_VALUE_TYPE_NUMBER)) return; map_clip_dist2 = value->u.number; nh_map_check_visibility(); } void rc_radar(GScanner *scanner, GtkHackRcValue *value) { if (!gtkhackrc_check_type(scanner, value, "value", PARSE_VALUE_TYPE_NUMBER)) return; nh_radar_set_use(value->u.number); } #ifdef GTKHACK void rc_connections(GScanner *scanner, GtkHackRcValue *value) { int i, j, n, nflags; unsigned long flags; GtkHackRcValue *con, *flag; if (!gtkhackrc_check_type(scanner, value, "value", PARSE_VALUE_TYPE_VECTOR)) return; n = value->u.vector.n_values; for(i = 0; i < n; i++) { con = value->u.vector.values[i]; if (gtkhackrc_check_type(scanner, con, "connection", PARSE_VALUE_TYPE_RECORD) && gtkhackrc_check_no(scanner, &con->u.record, "fields in connection", 3, 4) && gtkhackrc_check_type(scanner, con->u.record.values[0], "name", PARSE_VALUE_TYPE_STRING) && gtkhackrc_check_type(scanner, con->u.record.values[1], "scheme", PARSE_VALUE_TYPE_STRING) && gtkhackrc_check_type(scanner, con->u.record.values[2], "address", PARSE_VALUE_TYPE_STRING)) { if (con->u.record.n_values < 4 || gtkhackrc_check_type(scanner, con->u.record.values[3], "flags", PARSE_VALUE_TYPE_VECTOR)) { flags = 0; if (con->u.record.n_values >= 4) { nflags = con->u.record.values[3]->u.vector.n_values; for(j = 0; j < nflags; j++) { flag = con->u.record.values[3]->u.vector.values[j]; if (gtkhackrc_check_type(scanner, flag, "flag", PARSE_VALUE_TYPE_STRING)) { if (!strcmp(flag->u.string, "synchronous")) flags |= PROXY_CLNT_SYNCHRONOUS; else if (!strcmp(flag->u.string, "logged")) flags |= PROXY_CLNT_LOGGED; } } } GTK_connection_add(con->u.record.values[0]->u.string, con->u.record.values[1]->u.string, con->u.record.values[2]->u.string, flags); } } } } void rc_default_connection(GScanner *scanner, GtkHackRcValue *value) { if (!gtkhackrc_check_type(scanner, value, "value", PARSE_VALUE_TYPE_STRING)) return; GTK_connection_set_default(value->u.string); } #endif #ifdef GTK_PROXY void rc_proxy_cachedir(GScanner *scanner, GtkHackRcValue *value) { if (!gtkhackrc_check_type(scanner, value, "value", PARSE_VALUE_TYPE_STRING)) return; nh_proxy_cache_set_dir(value->u.string); } #endif void rc_help_font(GScanner *scanner, GtkHackRcValue *value) { if (!gtkhackrc_check_type(scanner, value, "value", PARSE_VALUE_TYPE_STRING)) return; nh_set_help_font(value->u.string); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/gtk/gtkextcmd.c���������������������������������������������������������������0000664�0000764�0000764�00000011521�10545462317�015374� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* $Id: gtkextcmd.c,v 1.7 2003/12/28 18:43:40 j_ali Exp $ */ /* GTK+ NetHack Copyright (c) Issei Numata 1999-2000 Modifications Copyright (c) J. Ali Harlow 2000 GTK+ NetHack may be freely redistributed. See license for details. */ #include <sys/types.h> #include <signal.h> #include <gtk/gtk.h> #include <gdk/gdkkeysyms.h> #include "winGTK.h" #include "proxycb.h" #ifndef GTK_PROXY #include "func_tab.h" extern struct ext_func_tab extcmdlist[]; #endif static int n_extcmds = 0; static const char **extcmds = NULL; /* * These must agree with the list in winGTK.h -ALI */ struct ext_cmd_map { char *txt; } extcmdmap[NO_EXT_CMD_MAPS] = { { "adjust" }, { "borrow" }, { "chat" }, { "conduct" }, { "dip" }, { "enhance" }, { "explore" }, { "force" }, { "invoke" }, { "jump" }, { "loot" }, { "monster" }, { "name" }, { "offer" }, { "pray" }, { "quit" }, { "ride" }, { "rub" }, { "sit" }, { "technique" }, { "turn" }, { "twoweapon" }, { "untrap" }, { "version" }, { "wipe" }, { "youpoly" }, }; static int extcmd = 0; static void extcmd_init(boolean init) { int i; #ifdef GTK_PROXY struct proxycb_get_extended_commands_res *list; #endif if (!init) { /* Exit */ for(i = 0; i < n_extcmds; i++) free((char *)extcmds[i]); free(extcmds); extcmds = NULL; n_extcmds = 0; } #ifdef GTK_PROXY list = proxy_cb_get_extended_commands(); n_extcmds = list->n_commands; extcmds = (const char **)malloc(n_extcmds * sizeof(const char *)); for(i = 0; i < n_extcmds; i++) extcmds[i] = strdup(list->commands[i]); proxy_cb_free_extended_commands(list); #else for(n_extcmds = 0; extcmdlist[n_extcmds].ef_txt; n_extcmds++) ; extcmds = (const char **)malloc(n_extcmds * sizeof(const char *)); for(i = 0; i < n_extcmds; i++) extcmds[i] = strdup(extcmdlist[i].ef_txt); #endif } void GTK_extcmd_set(int cmd) { int j; if (!extcmds) extcmd_init(TRUE); extcmd = -1; if (cmd < 0 || cmd >= NO_EXT_CMD_MAPS) return; else { for(j = 0; j < n_extcmds; j++) if (!nh_strncmpi(extcmdmap[cmd].txt, extcmds[j], -1)) { extcmd = j; return; } } } static void extcmd_clicked(GtkWidget *widget, gpointer data) { extcmd = (int)data; gtk_main_quit(); } static gint extcmd_destroy(GtkWidget *widget, gpointer data) { guint *hid = (guint *)data; *hid = 0; extcmd = -1; gtk_main_quit(); return FALSE; } /* * This is not ideal since you can't choose between extended commands * that start with the same letter from the keyboard, but it will do * for now. --- ALI */ static gint extcmd_key_press(GtkWidget *widget, GdkEventKey *event, gpointer data) { int i, keysym; keysym = nh_keysym(event); if (keysym) { extcmd = -1; for (i = 0; i < n_extcmds; i++) if (extcmds[i][0] == keysym) extcmd = i; if (extcmd >= 0 || keysym == '\033') gtk_main_quit(); } return FALSE; } int GTK_get_ext_cmd() { guint hid; GtkWidget *window; GtkWidget *frame; GtkWidget *vbox; GtkWidget *hbox; GtkWidget *table = NULL; GtkWidget *d; int i, col, data; const char *label; if (!extcmds) extcmd_init(TRUE); if (extcmd) { i = extcmd; extcmd = 0; return i; } window = nh_gtk_window_dialog(TRUE); nh_position_popup_dialog(GTK_WIDGET(window)); nh_gtk_focus_set_master(GTK_WINDOW(window), GTK_SIGNAL_FUNC(extcmd_key_press), 0, TRUE); hid = gtk_signal_connect(GTK_OBJECT(window), "destroy", GTK_SIGNAL_FUNC(extcmd_destroy), &hid); frame = nh_gtk_new_and_add(gtk_frame_new(NULL), window, ""); vbox = nh_gtk_new_and_add(gtk_vbox_new(FALSE, 0), frame, ""); hbox = nh_gtk_new_and_pack(gtk_hbox_new(FALSE, 0), vbox, "", FALSE, FALSE, NH_PAD); table = nh_gtk_new_and_pack(gtk_table_new((n_extcmds+2)/3, 3, TRUE), hbox, "", FALSE, FALSE, NH_PAD); gtk_table_set_row_spacings(GTK_TABLE(table), NH_PAD); gtk_table_set_col_spacings(GTK_TABLE(table), NH_PAD); for(i = 0; i < n_extcmds; i++) { if (!strcmp(extcmds[i], "?")) { /* * Rather more useful than '?' in these circumstances -ALI */ d = gtk_button_new_from_stock(GTK_STOCK_CANCEL); col = (i == n_extcmds - 1 && i%3 == 0) ? 1 : i%3; data = -1; } else { d = gtk_button_new_with_label(extcmds[i]); col = i%3; data = i; } d = nh_gtk_new_and_attach(d, table, "", col, col+1, i/3, i/3+1); gtk_signal_connect(GTK_OBJECT(d), "clicked", GTK_SIGNAL_FUNC(extcmd_clicked), (gpointer)data); } gtk_grab_add(window); gtk_widget_show_all(window); gtk_main(); if (hid > 0) { gtk_widget_unmap(window); gtk_signal_disconnect(GTK_OBJECT(window), hid); gtk_widget_destroy(vbox); gtk_widget_destroy(frame); gtk_widget_destroy(window); } i = extcmd; extcmd = 0; return i; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/gtk/xshmmap.c�����������������������������������������������������������������0000664�0000764�0000764�00000062360�10545462317�015066� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* $Id: xshmmap.c,v 1.10 2003/12/13 16:35:16 j_ali Exp $ */ /* GTK+ NetHack Copyright (c) Issei Numata 1999-2000 Copyright (c) Slash'EM Development Team 2000-2003 GTK+ NetHack may be freely redistributed. See license for details. */ #include <stdio.h> #include <stdarg.h> #include <ctype.h> #include "winGTK.h" /* * [ALI] This module deals with displaying the map on the screen. * * API: * * xshm_map_init(mode, width, height) * Initialize the map. This function should also be called if the * size needs to be changed (ie., when changing tilesets). It is * better not to call xshm_map_destroy() first. Mode should be * set to XSHM_MAP_IMAGE if the data to be sent to the map requires * uploading raster data to the server and XSHM_MAP_PIXMAP if the * data will either already be present on the server or if it can * be created with back-end rendering calls. In the first case * xshm_map_image will be initialised and xshm_map_pixmap will be * NULL, in the second case the reverse applies. * Note: XSHM_MAP_PIXBUF is supported (but unused by default). * It appears to have no advantages over XSHM_MAP_IMAGE. * xshm_map_destroy() * Free all resources allocated by xshm_map_init(). * xshm_map_get_hadjustment() and xshm_map_get_vadjustment() * Get the current scrolling adjustment controls. * xshm_map_cliparound(x, y) * Arrange for xshm_map_flush() to scroll the map so that it is centered * on pixel (x, y). * xshm_map_set_button_handler(func, data) * Register a function to be called when a button press event is * received on the map. * * Drawing: * * xshm_map_draw(area) * Mark the given area in map as needing to be propagated to the screen. * xshm_map_flush() * Action the draw queue and cliparound requested. * * It is perfectly permissible to draw directly to xshm_map_pixbuf, * xshm_map_image or xshm_map_pixmap as appropriate and then call * xshm_map_draw() to request the areas to be updated. The following * functions are provided for convenience: * * xshm_map_clear() * Clear the map to zero. * xshm_map_draw_image(src, src_x, src_y, dest_x, dest_y, width, height) * Copy the src image to the map. The image must be of the same * format as the map. This can be guaranteed by using gdk_image_new() * and using the visual of a realised window on the same display. * Supported modes: image and pixmap. * xshm_map_draw_drawable(src, src_x, src_y, dest_x, dest_y, width, height) * Copy the src drawable to the map. * Supported modes: image and pixmap. * xshm_map_draw_pixbuf(src, src_x, src_y, dest_x, dest_y, width, height) * Copy the src pixbuf to the map. * Supported modes: pixbuf only. */ GdkImage *xshm_map_image; GdkPixmap *xshm_map_pixmap; GdkPixbuf *xshm_map_pixbuf; static struct xshm_private { GdkPixmap *pixmap; /* Backing store if needed */ GtkWidget *area; /* The on-screen window */ GdkRegion *dirty; /* The draw list */ GdkGC *gc; /* gc used to draw to xshm_map_pixmap */ enum xshm_map_mode mode; int map_width, map_height; GtkAdjustment *hadj, *vadj; GtkWidget *hscrollbar; GtkWidget *vscrollbar; GtkWidget *vbox, *hbox; int areax, areay; /* The current offset of area within map */ /* Handler for button press events */ void (*button_press)(void *, GdkEventButton *, gpointer); gpointer button_press_data; int is_pending; /* True if flush() needed to update map */ } xshm; #ifdef DEBUG #include <sys/time.h> #include <unistd.h> static void time_stamp(FILE *fp) { struct timeval tv; gettimeofday(&tv,NULL); fprintf(fp, "%d.%06d: ",tv.tv_sec,tv.tv_usec); } #endif GtkAdjustment * xshm_map_get_hadjustment(void) { return xshm.hadj; } GtkAdjustment * xshm_map_get_vadjustment(void) { return xshm.vadj; } /* * This routine maintains the dirty region which is the set of rectangles * which have been modified in the map since the last xshm_map_flush(). * If we are in non-shared image or pixbuf mode then this region needs * copying to the backing store. In all cases, this region needs copying * from the backing store to the screen. */ void xshm_map_draw(GdkRectangle *rect) { if (xshm.dirty) gdk_region_union_with_rect(xshm.dirty, rect); else xshm.dirty = gdk_region_rectangle(rect); xshm.is_pending = TRUE; } /* * This routine is responsible for arranging for the expose handler * to be called and for providing it with the correct area of the * screen to be exposed. This will be the whole of the visble map * if scrolling has taken place, or the visible part of the dirty * list otherwise. * * Note: The expose handler is responsible for clearing the dirty * list in due course. */ void xshm_map_flush(void) { int i; GdkRectangle clip, expose_area; g_return_if_fail(xshm.area != NULL); xshm.is_pending = FALSE; if (xshm.areax != (int)xshm.hadj->value || xshm.areay != (int)xshm.vadj->value) { clip.x = clip.y = 0; clip.width = xshm.hadj->page_size; clip.height = xshm.vadj->page_size; #ifdef DEBUG time_stamp(stderr); fprintf(stderr, "Map: flush at (%d, %d) size %d x %d\n", (int)xshm.hadj->value, (int)xshm.vadj->value, clip.width, clip.height); #endif gtk_widget_draw(xshm.area, &clip); } else if (xshm.dirty) { gdk_region_get_clipbox(xshm.dirty, &expose_area); #ifdef DEBUG time_stamp(stderr); fprintf(stderr, "Map: flush at (%d, %d) size %d x %d\n", expose_area.x, expose_area.y, expose_area.width, expose_area.height); #endif expose_area.x -= xshm.hadj->value; expose_area.y -= xshm.vadj->value; clip.x = clip.y = 0; clip.width = xshm.hadj->page_size; clip.height = xshm.vadj->page_size; if (gdk_rectangle_intersect(&expose_area, &clip, &expose_area)) gtk_widget_draw(xshm.area, &expose_area); } } /* * Adjust clipping so that pixel (x, y) on the map is approximately * in the centre of the drawing area. */ void xshm_map_cliparound(int x, int y) { int vx, vy; #ifdef DEBUG time_stamp(stderr); fprintf(stderr, "Map: Cliparound (%d, %d)\n", x, y); #endif vx = x - xshm.hadj->page_size / 2; vy = y - xshm.vadj->page_size / 2; if (vx < xshm.hadj->lower) vx = xshm.hadj->lower; else if (vx > xshm.hadj->upper - xshm.hadj->page_size) vx = xshm.hadj->upper - xshm.hadj->page_size; if (vy < xshm.vadj->lower) vy = xshm.vadj->lower; else if (vy > xshm.vadj->upper - xshm.vadj->page_size) vy = xshm.vadj->upper - xshm.vadj->page_size; /* Must be done before changing the adjustments so that scroll_event() * knows that a xshm_map_flush() is pending. */ xshm.is_pending = TRUE; if (vx != xshm.hadj->value) gtk_adjustment_set_value(xshm.hadj, vx); if (vy != xshm.vadj->value) gtk_adjustment_set_value(xshm.vadj, vy); } /* * Re-configure the drawing area. If the drawing area is bigger than the * map (ie., the user has stretched it), the area beyond the map will * just be background. */ static int configure_event(GtkWidget *widget, GdkEventConfigure *event) { #ifdef DEBUG fprintf(stderr, "Area: Configure (%d x %d)\n", event->width, event->height); #endif xshm.hadj->page_size = (gfloat)event->width; xshm.hadj->page_increment = (gfloat)event->width; if (xshm.hadj->value < xshm.hadj->lower) gtk_adjustment_set_value(xshm.hadj, xshm.hadj->lower); else if (xshm.hadj->value > xshm.hadj->upper - xshm.hadj->page_size) gtk_adjustment_set_value(xshm.hadj, xshm.hadj->upper - xshm.hadj->page_size); gtk_signal_emit_by_name(GTK_OBJECT(xshm.hadj), "changed"); xshm.vadj->page_size = (gfloat)event->height; xshm.vadj->page_increment = (gfloat)event->height; if (xshm.vadj->value < xshm.vadj->lower) gtk_adjustment_set_value(xshm.vadj, xshm.vadj->lower); else if (xshm.vadj->value > xshm.vadj->upper - xshm.vadj->page_size) gtk_adjustment_set_value(xshm.vadj, xshm.vadj->upper - xshm.vadj->page_size); gtk_signal_emit_by_name(GTK_OBJECT(xshm.vadj), "changed"); } /* * This function serves three purposes: * - It updates the backing store from the master copy. * (only needed in non-shared image and pibxuf modes) * - It copies the dirty region of the backing store to the window. * - It refreshes the exposed area of the window from backing store. * * By doing all these at the same time, we can reduce problems with jerky * motion caused by either updating the map and then scrolling it or by * scrolling it and then updating (neither of which look good). * * In order to maintain this, callers shouldn't flush the map until all * updating and scrolling has been completed. */ static gint expose_event(GtkWidget *widget, GdkEventExpose *event) { GdkGC *gc; int x = (int)xshm.hadj->value; int y = (int)xshm.vadj->value; #ifdef DEBUG time_stamp(stderr); fprintf(stderr, "Map: expose_event at (%d, %d) size %d x %d ... ", event->area.x, event->area.y, event->area.width, event->area.height); #endif gc = gdk_gc_new(widget->window); /* First update the backing store if that needs doing */ if (xshm.pixmap && xshm.dirty && (xshm_map_image || xshm_map_pixbuf)) { /* TODO: Should restrict this to the visible portion */ gdk_gc_set_clip_region(gc, xshm.dirty); if (xshm_map_image) gdk_draw_image(xshm.pixmap, gc, xshm_map_image, 0, 0, 0, 0, xshm.map_width, xshm.map_height); else /* if (xshm_map_pixbuf) */ gdk_pixbuf_render_to_drawable(xshm_map_pixbuf, xshm.pixmap, gc, 0, 0, 0, 0, xshm.map_width, xshm.map_height, GDK_RGB_DITHER_NORMAL, 0, 0); gdk_gc_set_clip_region(gc, NULL); #ifdef DEBUG fprintf(stderr, "backing pixmap updated ... "); #endif } /* Now update the screen from the backing store */ if (xshm.pixmap) gdk_draw_pixmap(widget->window, gc, xshm.pixmap, x + event->area.x, y + event->area.y, event->area.x, event->area.y, min(event->area.width, xshm.map_width), min(event->area.height, xshm.map_height)); else gdk_draw_image(widget->window, gc, xshm_map_image, x + event->area.x, y + event->area.y, event->area.x, event->area.y, min(event->area.width, xshm.map_width), min(event->area.height, xshm.map_height)); if (event->area.width > xshm.map_width || event->area.height > xshm.map_height) { gdk_gc_set_foreground(gc, &widget->style->bg[GTK_STATE_NORMAL]); if (event->area.width > xshm.map_width) gdk_draw_rectangle(widget->window, gc, TRUE, xshm.map_width, 0, event->area.width - xshm.map_width, xshm.map_height); if (event->area.height > xshm.map_height) gdk_draw_rectangle(widget->window, gc, TRUE, 0, xshm.map_height, event->area.width, event->area.height - xshm.map_height); } xshm.areax = x; xshm.areay = y; #ifdef DEBUG fprintf(stderr, "screen updated\n"); #endif /* And clean up */ if (xshm.dirty) { gdk_region_destroy(xshm.dirty); xshm.dirty = NULL; } gdk_gc_unref(gc); return TRUE; } static void scroll_event(GtkAdjustment *adj, gpointer data) { GdkRectangle view; g_return_if_fail(adj == xshm.hadj || adj == xshm.vadj); #ifdef DEBUG time_stamp(stderr); #endif if (!xshm.is_pending) { #ifdef DEBUG if (adj == xshm.hadj) fprintf(stderr, "Horizontal scroll event\n"); else fprintf(stderr, "Vertical scroll event\n"); #endif view.x = view.y = 0; view.width = xshm.hadj->page_size; view.height = xshm.vadj->page_size; gtk_widget_draw(xshm.area, &view); } #ifdef DEBUG else fprintf(stderr, "Clipping scroll event\n"); #endif } static int xshm_map_size(int mode, int width, int height) { GdkGC *gc; GdkVisual *visual; GdkRectangle rect; int i, j; xshm.hadj->upper = width - 1; if (xshm.hadj->value < xshm.hadj->lower) gtk_adjustment_set_value(xshm.hadj, xshm.hadj->lower); else if (xshm.hadj->value > xshm.hadj->upper - xshm.hadj->page_size) gtk_adjustment_set_value(xshm.hadj, xshm.hadj->upper - xshm.hadj->page_size); gtk_signal_emit_by_name(GTK_OBJECT(xshm.hadj), "changed"); xshm.vadj->upper = height - 1; if (xshm.vadj->value < xshm.vadj->lower) gtk_adjustment_set_value(xshm.vadj, xshm.vadj->lower); else if (xshm.vadj->value > xshm.vadj->upper - xshm.vadj->page_size) gtk_adjustment_set_value(xshm.vadj, xshm.vadj->upper - xshm.vadj->page_size); gtk_signal_emit_by_name(GTK_OBJECT(xshm.vadj), "changed"); if (width == xshm.map_width && height == xshm.map_height && (mode == XSHM_MAP_IMAGE ? xshm_map_image != 0 : mode == XSHM_MAP_PIXMAP ? xshm_map_pixmap != 0 : xshm_map_pixbuf != 0)) return 0; /* Map configuration unchanged */ #ifdef DEBUG time_stamp(stderr); fprintf(stderr, "Map: Resize (%d x %d)\n", width, height); #endif if (xshm.dirty) { gdk_region_destroy(xshm.dirty); xshm.dirty = NULL; } if (xshm.gc) { gdk_gc_unref(xshm.gc); xshm.gc = NULL; } if (xshm_map_pixmap) { gdk_pixmap_unref(xshm_map_pixmap); xshm_map_pixmap = NULL; xshm.pixmap = NULL; } else if (xshm_map_image) { gdk_image_destroy(xshm_map_image); xshm_map_image = NULL; if (xshm.pixmap) { gdk_pixmap_unref(xshm.pixmap); xshm.pixmap = NULL; } } else if (xshm_map_pixbuf) { gdk_pixbuf_unref(xshm_map_pixbuf); xshm_map_pixbuf = NULL; gdk_pixmap_unref(xshm.pixmap); xshm.pixmap = NULL; } if (mode == XSHM_MAP_PIXBUF) { #ifdef DEBUG fprintf(stderr, "Map: Switching to pixbuf mode\n"); #endif /* We don't really want an alpha channel (it doesn't have * any meaning) but GDK doesn't support alpha -> non-alpha. */ xshm_map_pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE, 8, width, height); memset(gdk_pixbuf_get_pixels(xshm_map_pixbuf), 0, height * gdk_pixbuf_get_rowstride(xshm_map_pixbuf)); xshm.pixmap = gdk_pixmap_new(xshm.area->window, width, height, -1); /* Pixmap needs updating; mark it as such */ rect.x = rect.y = 0; rect.width = max(width, xshm.map_width); rect.height = max(height, xshm.map_height); xshm.dirty = gdk_region_rectangle(&rect); } else if (mode == XSHM_MAP_IMAGE) { #ifdef DEBUG fprintf(stderr, "Map: Switching to image mode\n"); #endif visual = gdk_drawable_get_visual(xshm.area->window); xshm_map_image = gdk_image_new(GDK_IMAGE_SHARED, visual, width, height); if (!xshm_map_image) { xshm_map_image = gdk_image_new(GDK_IMAGE_NORMAL, visual, width, height); xshm.pixmap = gdk_pixmap_new(xshm.area->window, width, height, -1); } else xshm.pixmap = NULL; memset(xshm_map_image->mem, 0, height * xshm_map_image->bpl); if (xshm.pixmap) { /* Pixmap also needs updating; mark it as such */ rect.x = rect.y = 0; rect.width = max(width, xshm.map_width); rect.height = max(height, xshm.map_height); xshm.dirty = gdk_region_rectangle(&rect); } else xshm.dirty = NULL; } else { #ifdef DEBUG fprintf(stderr, "Map: Switching to pixmap mode\n"); #endif xshm.pixmap = gdk_pixmap_new(xshm.area->window, width, height, -1); xshm.gc = gdk_gc_new(xshm.pixmap); gdk_gc_set_foreground(xshm.gc, &xshm.area->style->bg[GTK_STATE_NORMAL]); gdk_draw_rectangle(xshm.pixmap, xshm.gc, TRUE, 0, 0, width, height); xshm_map_pixmap = xshm.pixmap; /* Area outside new map needs updating; mark it as such */ if (width < xshm.map_width) { rect.x = width; rect.y = 0; rect.width = xshm.map_width - width; rect.height = xshm.map_height; xshm.dirty = gdk_region_rectangle(&rect); } else xshm.dirty = NULL; if (height < xshm.map_height) { rect.x = 0; rect.y = height; rect.width = xshm.map_width; rect.height = xshm.map_height - height; xshm.dirty = gdk_region_rectangle(&rect); if (xshm.dirty) gdk_region_union_with_rect(xshm.dirty, &rect); else xshm.dirty = gdk_region_rectangle(&rect); } } xshm.map_width = width; xshm.map_height = height; #ifdef DEBUG fprintf(stderr, "New configuration:\n"); if (xshm_map_image) fprintf(stderr, "\txshm_map_image: %d x %d\n", xshm_map_image->width, xshm_map_image->height); else fprintf(stderr, "\txshm_map_image: none\n"); if (xshm_map_pixmap) { gdk_drawable_get_size(xshm_map_pixmap, &i, &j); fprintf(stderr, "\txshm_map_pixmap: %d x %d\n", i, j); } else fprintf(stderr, "\txshm_map_pixmap: none\n"); if (xshm_map_pixbuf) fprintf(stderr, "\txshm_map_pixbuf: %d x %d\n", gdk_pixbuf_get_width(xshm_map_pixbuf), gdk_pixbuf_get_height(xshm_map_pixbuf)); else fprintf(stderr, "\txshm_map_pixbuf: none\n"); if (xshm.pixmap) { gdk_drawable_get_size(xshm.pixmap, &i, &j); fprintf(stderr, "\tpixmap: %d x %d\n",i, j); } else fprintf(stderr, "\tpixmap: none\n"); fprintf(stderr, "\tarea: %d x %d\n", (int)xshm.hadj->page_size, (int)xshm.vadj->page_size); #endif } static void realize_event(GtkWidget *w, gpointer data) { xshm_map_size(xshm.mode, xshm.map_width, xshm.map_height); } GtkWidget * xshm_map_init(enum xshm_map_mode mode, int width, int height) { #ifdef DEBUG time_stamp(stderr); fprintf(stderr, "Map: Init (%s, %d, %d)\n", mode == XSHM_MAP_PIXMAP ? "Pixmap" : mode == XSHM_MAP_PIXBUF ? "Pixbuf" : mode == XSHM_MAP_IMAGE ? "Image" : "None", width, height); #endif if (!xshm.area) { /* TODO: Tweak scrollbar placement to be more like scrolled_window * and remove them when not necessary */ xshm.vbox = gtk_vbox_new(FALSE, 0); xshm.hbox = nh_gtk_new_and_pack(gtk_hbox_new(FALSE, 0), xshm.vbox, "", TRUE, TRUE, 0); xshm.area = nh_gtk_new_and_pack(gtk_drawing_area_new(), xshm.hbox, "", TRUE, TRUE, 0); /* FIXME: step_adjustment is 1. It should probably be one square */ xshm.hadj = GTK_ADJUSTMENT( gtk_adjustment_new(0.0, 0.0, 0.0, 1.0, 0.0, 0.0)); gtk_signal_connect(GTK_OBJECT(xshm.hadj), "value_changed", (GtkSignalFunc) scroll_event, 0); xshm.hscrollbar = gtk_hscrollbar_new(xshm.hadj); (void) nh_gtk_new_and_pack(xshm.hscrollbar, xshm.vbox, "", FALSE, FALSE, 0); xshm.vadj = GTK_ADJUSTMENT( gtk_adjustment_new(0.0, 0.0, 0.0, 1.0, 0.0, 0.0)); gtk_signal_connect(GTK_OBJECT(xshm.vadj), "value_changed", (GtkSignalFunc) scroll_event, 0); xshm.vscrollbar = gtk_vscrollbar_new(xshm.vadj); (void) nh_gtk_new_and_pack(xshm.vscrollbar, xshm.hbox, "", FALSE, FALSE, 0); #if GTK_CHECK_VERSION(1,3,2) gtk_widget_set_double_buffered(xshm.area, FALSE); #endif gtk_widget_set_events(xshm.area, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK); gtk_signal_connect(GTK_OBJECT(xshm.area), "configure_event", GTK_SIGNAL_FUNC(configure_event), 0); gtk_signal_connect(GTK_OBJECT(xshm.area), "expose_event", GTK_SIGNAL_FUNC(expose_event), 0); gtk_signal_connect(GTK_OBJECT(xshm.area), "realize", GTK_SIGNAL_FUNC(realize_event), 0); gtk_widget_ref(xshm.area); } if (mode != XSHM_MAP_NONE) { if (GTK_WIDGET_REALIZED(xshm.area)) xshm_map_size(mode, width, height); else { xshm.mode = mode; xshm.map_width = width; xshm.map_height = height; } } return xshm.vbox; } static void button_press_event(GtkWidget *widget, GdkEventButton *event, gpointer data) { GdkEventButton map_event = *event; map_event.x += xshm.areax; map_event.y += xshm.areay; xshm.button_press(xshm_map_pixmap ? (void *)xshm_map_pixmap : xshm_map_pixbuf ? (void *)xshm_map_pixbuf : (void *)xshm_map_image, &map_event, data); } void xshm_map_button_handler(GtkSignalFunc func, gpointer data) { if (xshm.button_press) gtk_signal_disconnect_by_func(GTK_OBJECT(xshm.area), GTK_SIGNAL_FUNC(button_press_event), xshm.button_press_data); xshm.button_press = (void (*)())func; xshm.button_press_data = data; if (func) gtk_signal_connect(GTK_OBJECT(xshm.area), "button_press_event", GTK_SIGNAL_FUNC(button_press_event), data); } void xshm_map_destroy() { #ifdef DEBUG fprintf(stderr, "Map: Destroy\n"); #endif if (xshm.pixmap) { gdk_pixmap_unref(xshm.pixmap); xshm.pixmap = NULL; } if (xshm.dirty) { gdk_region_destroy(xshm.dirty); xshm.dirty = NULL; } if (xshm_map_image) { gdk_image_destroy(xshm_map_image); xshm_map_image = NULL; } if (xshm_map_pixbuf) { gdk_pixbuf_unref(xshm_map_pixbuf); xshm_map_pixmap = NULL; } if (xshm.gc) { gdk_gc_unref(xshm.gc); xshm.gc = NULL; } xshm_map_pixmap = NULL; xshm_map_button_handler(NULL, 0); if (xshm.area) { gtk_widget_unref(xshm.area); xshm.area = NULL; } xshm.map_width = xshm.map_height = 0; } void xshm_map_clear() { GdkRectangle area; g_return_if_fail(xshm_map_image != NULL || xshm_map_pixmap != NULL); if (xshm_map_image) memset(xshm_map_image->mem, 0, xshm_map_image->height * xshm_map_image->bpl); else if (xshm_map_pixmap) gdk_draw_rectangle(xshm_map_pixmap, xshm.gc, TRUE, 0, 0, xshm.map_width, xshm.map_height); else if (xshm_map_pixbuf) memset(gdk_pixbuf_get_pixels(xshm_map_pixbuf), 0, gdk_pixbuf_get_height(xshm_map_pixbuf) * gdk_pixbuf_get_rowstride(xshm_map_pixbuf)); area.x = area.y = 0; area.width = xshm.map_width; area.height = xshm.map_height; xshm_map_draw(&area); } void xshm_map_draw_image(GdkImage *src, int src_x, int src_y, int dest_x, int dest_y, int width, int height) { int i, j; unsigned char *dp, *sp; GdkRectangle area; g_return_if_fail(xshm_map_image != NULL || xshm_map_pixmap != NULL); g_return_if_fail(src != NULL); /* Clip to src */ if (src_x < 0) { width += src_x; dest_x -= src_x; src_x = 0; } if (src_y < 0) { height += src_y; dest_y -= src_y; src_y = 0; } if (src_x + width > src->width) width = src->width - src_x; if (src_y + height > src->height) height = src->height - src_y; /* Clip to dest */ if (dest_x < 0) { width += dest_x; src_x -= dest_x; dest_x = 0; } if (dest_y < 0) { height += dest_y; src_y -= dest_y; dest_y = 0; } if (dest_x + width > xshm.map_width) width = xshm.map_width - dest_x; if (dest_y + height > xshm.map_height) height = xshm.map_height - dest_y; /* Copy */ if (xshm_map_image) { if (xshm_map_image->bpp != src->bpp || xshm_map_image->byte_order != src->byte_order) for(j = 0; j < height; j++) for(i = 0; i < width; i++) gdk_image_put_pixel(xshm_map_image, dest_x + i, dest_y + j, gdk_image_get_pixel(src, src_x + i, src_y + j)); else { dp = xshm_map_image->mem + dest_y * xshm_map_image->bpl + dest_x * xshm_map_image->bpp; sp = src->mem + src_y * src->bpl + src_x * src->bpp; i = width * xshm_map_image->bpp; for(j = 0; j < height; j++) { memcpy(dp, sp, i); dp += xshm_map_image->bpl; sp += src->bpl; } } } else gdk_draw_image(xshm_map_pixmap, xshm.gc, src, src_x, src_y, dest_x, dest_y, width, height); /* Propagate changes */ area.x = dest_x; area.y = dest_y; area.width = width; area.height = height; xshm_map_draw(&area); } void xshm_map_draw_drawable(GdkDrawable *src, int src_x, int src_y, int dest_x, int dest_y, int width, int height) { int i, j; gint src_width, src_height; GdkRectangle area; g_return_if_fail(xshm_map_image != NULL || xshm_map_pixmap != NULL); g_return_if_fail(src != NULL); /* Clip to src */ if (src_x < 0) { width += src_x; dest_x -= src_x; src_x = 0; } if (src_y < 0) { height += src_y; dest_y -= src_y; src_y = 0; } gdk_drawable_get_size(src, &src_width, &src_height); if (src_x + width > src_width) width = src_width - src_x; if (src_y + height > src_height) height = src_height - src_y; /* Clip to dest */ if (dest_x < 0) { width += dest_x; src_x -= dest_x; dest_x = 0; } if (dest_y < 0) { height += dest_y; src_y -= dest_y; dest_y = 0; } if (dest_x + width > xshm.map_width) width = xshm.map_width - dest_x; if (dest_y + height > xshm.map_height) height = xshm.map_height - dest_y; /* Copy */ if (xshm_map_image) { /* [ALI] You shouldn't be doing this. If you need to draw drawables * then xshm_map should be in pixmap mode. */ GdkImage *tmp_img; g_warning("xshm_map_draw_drawable: Not in pixmap mode"); tmp_img = gdk_drawable_get_image(src, src_x, src_y, width, height); for(j = 0; j < height; j++) for(i = 0; i < width; i++) gdk_image_put_pixel(xshm_map_image, dest_x + i, dest_y + j, gdk_image_get_pixel(tmp_img, i, j)); gdk_image_destroy(tmp_img); } else gdk_draw_drawable(xshm_map_pixmap, xshm.gc, src, src_x, src_y, dest_x, dest_y, width, height); /* Propagate changes */ area.x = dest_x; area.y = dest_y; area.width = width; area.height = height; xshm_map_draw(&area); } void xshm_map_draw_pixbuf(GdkPixbuf *src, int src_x, int src_y, int dest_x, int dest_y, int width, int height) { GdkRectangle area; int src_width; int src_height; g_return_if_fail(xshm_map_pixbuf != NULL); g_return_if_fail(src != NULL); src_width = gdk_pixbuf_get_width(src); src_height = gdk_pixbuf_get_height(src); /* Clip to src */ if (src_x < 0) { width += src_x; dest_x -= src_x; src_x = 0; } if (src_y < 0) { height += src_y; dest_y -= src_y; src_y = 0; } if (src_x + width > src_width) width = src_width - src_x; if (src_y + height > src_height) height = src_height - src_y; /* Clip to dest */ if (dest_x < 0) { width += dest_x; src_x -= dest_x; dest_x = 0; } if (dest_y < 0) { height += dest_y; src_y -= dest_y; dest_y = 0; } if (dest_x + width > xshm.map_width) width = xshm.map_width - dest_x; if (dest_y + height > xshm.map_height) height = xshm.map_height - dest_y; /* Copy */ gdk_pixbuf_copy_area(src, src_x, src_y, width, height, xshm_map_pixbuf, dest_x, dest_y); /* Propagate changes */ area.x = dest_x; area.y = dest_y; area.width = width; area.height = height; xshm_map_draw(&area); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/win32/������������������������������������������������������������������������0000775�0000764�0000764�00000000000�10545462317�013413� 5����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/win32/mhmsg.h�����������������������������������������������������������������0000664�0000764�0000764�00000002644�10545462317�014705� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (C) 2001 by Alex Kompel <shurikk@pacbell.net> */ /* 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 #define MSNH_MSG_CARET 110 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 ��������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/win32/mhsplash.c��������������������������������������������������������������0000664�0000764�0000764�00000015504�10545462317�015403� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (C) 2001 by Alex Kompel <shurikk@pacbell.net> */ /* 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" #include "dlb.h" #define LLEN 128 PNHWinApp GetNHApp(void); BOOL CALLBACK NHSplashWndProc(HWND, UINT, WPARAM, LPARAM); #define SPLASH_WIDTH 350 #define SPLASH_HEIGHT 482 #if 0 #define SPLASH_VERSION_X 290 #define SPLASH_VERSION_Y 10 #else #define SPLASH_VERSION_X 225 #define SPLASH_VERSION_Y 145 #endif #define SPLASH_OFFSET_X 10 #define SPLASH_OFFSET_Y 10 extern HFONT version_splash_font; void mswin_display_splash_window (BOOL show_ver) { MSG msg; HWND mapWnd; int left, top; RECT splashrt; RECT clientrt; RECT controlrt; HWND hWnd; int buttop; int strsize = 0; int bufsize = 400; /* Enough for 4 lines plus extras */ char *buf = malloc(bufsize); if (buf == NULL) panic("out of memory"); buf[0] = '\0'; 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 */ /* On the screen, not on the parent window */ left = (GetSystemMetrics(SM_CXSCREEN) - splashrt.right) / 2; top = (GetSystemMetrics(SM_CYSCREEN) - splashrt.bottom) / 2; MoveWindow(hWnd, left, top, splashrt.right, splashrt.bottom, TRUE); /* Place the OK 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); buttop = clientrt.bottom - controlrt.bottom - SPLASH_OFFSET_Y; /* Place the text control */ GetWindowRect (GetDlgItem(hWnd, IDC_EXTRAINFO), &controlrt); controlrt.right -= controlrt.left; controlrt.bottom -= controlrt.top; GetClientRect (hWnd, &clientrt); MoveWindow (GetDlgItem(hWnd, IDC_EXTRAINFO), clientrt.left + SPLASH_OFFSET_X, buttop - controlrt.bottom - SPLASH_OFFSET_Y, clientrt.right - 2 * SPLASH_OFFSET_X, controlrt.bottom, TRUE); /* Fill the text control */ Sprintf(buf, "%s\r\n%s\r\n%s\r\n\r\n", COPYRIGHT_BANNER_A, COPYRIGHT_BANNER_B, COPYRIGHT_BANNER_C); strsize = strlen(buf); if (show_ver) { /* Show complete version information */ dlb *f; getversionstring(buf + strsize); strcat(buf, "\r\n\r\n"); strsize = strlen(buf); /* Add compile options */ f = dlb_fopen(NH_OPTIONS_USED, RDTMODE); if (f) { char line[LLEN + 1]; while (dlb_fgets(line, LLEN, f)) { size_t len; len = strlen(line); if (len > 0 && line[len - 1] == '\n') { line[len - 1] = '\r'; line[len] = '\n'; line[len + 1] = '\0'; len++; } if (strsize + (int)len + 1 > bufsize) { bufsize += BUFSZ; buf = realloc(buf, bufsize); if (buf == NULL) panic("out of memory"); } strcat(buf, line); strsize += len; } (void) dlb_fclose(f); } } else { /* Show news, if any */ if (iflags.news) { FILE *nf; iflags.news = 0; /* prevent newgame() from re-displaying news */ nf = fopen(NEWS, "r"); if (nf != NULL) { char line[LLEN + 1]; while (fgets(line, LLEN, nf)) { size_t len; len = strlen(line); if (len > 0 && line[len - 1] == '\n') { line[len - 1] = '\r'; line[len] = '\n'; line[len + 1] = '\0'; len++; } if (strsize + (int)len + 1 > bufsize) { bufsize += BUFSZ; buf = realloc(buf, bufsize); if (buf == NULL) panic("out of memory"); } strcat(buf, line); strsize += len; } (void) fclose(nf); } else { strcat(buf, "No news."); } } } SetWindowText(GetDlgItem(hWnd, IDC_EXTRAINFO), buf); free(buf); 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); 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_PAINT: { char VersionString[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); nhapply_image_transparent(hdc, SPLASH_OFFSET_X, SPLASH_OFFSET_Y, SPLASH_WIDTH, SPLASH_HEIGHT, hdcBitmap, 0, 0, SPLASH_WIDTH, SPLASH_HEIGHT, TILE_BK_COLOR); 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; #if 0 Sprintf (VersionString, "%d.%d.%d", VERSION_MAJOR, VERSION_MINOR, PATCHLEVEL); #else /* Slash'EM splash screen already has "vampire", so all * we need is the sub-version. The full version number is * available elsewhere. */ #ifdef FIXLEVEL Sprintf (VersionString, "%d.%d", EDITLEVEL - 5, FIXLEVEL); #else Sprintf (VersionString, "%d.0", EDITLEVEL - 5); #endif #endif 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); 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; } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/win32/txtbg.dsp���������������������������������������������������������������0000664�0000764�0000764�00000012011�10545462317�015246� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Microsoft Developer Studio Project File - Name="txtbg" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=txtbg - 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 "txtbg.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 "txtbg.mak" CFG="txtbg - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "txtbg - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "txtbg - 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)" == "txtbg - 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\txtbg.exe" !ELSEIF "$(CFG)" == "txtbg - 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\txtbg.exe" /pdbtype:sept !ENDIF # Begin Target # Name "txtbg - Win32 Release" # Name "txtbg - 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\txtbg.c !IF "$(CFG)" == "txtbg - Win32 Release" !ELSEIF "$(CFG)" == "txtbg - Win32 Debug" # ADD CPP /D "PACKED_FILE" !ENDIF # End Source File # Begin Source File SOURCE=..\win\share\tiletext.c !IF "$(CFG)" == "txtbg - Win32 Release" !ELSEIF "$(CFG)" == "txtbg - 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 �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/win32/winmain.c���������������������������������������������������������������0000664�0000764�0000764�00000020037�10545462317�015223� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* SCCS Id: @(#)winmain.c 3.2 95/09/06 */ /* Copyright (c) NetHack PC Development Team 1995 */ /* NetHack may be freely redistributed. See license for details. */ /* Builds on original MS Windows 3.1.0 Port code by Bill Dyer */ #include "hack.h" #ifdef WIN32_GRAPHICS # ifndef NO_SIGNAL #include <signal.h> # endif #include <ctype.h> #include <sys\stat.h> #include "win32api.h" #include "nhwin32.h" extern struct window_procs win32_procs; static int getargs(char *cmdline); extern int main(int argc, char *argv[]); /* in sys/share/pcmain.c */ int winmode; int HaveConsole; int argc; int NHnCmdShow; char *xargv[20]; WNDCLASS wcNetHack; WNDCLASS wcNHText; WNDCLASS wcNHPopup; WNDCLASS wcNHListbox; char GameName[]="NetHack"; char NHTextClassName[] = "NHTextWin"; char NHPopupClassName[] = "NHPopupWin"; char NHListboxClassName[] = "NHListboxWin"; HINSTANCE NHhPreInst; HWND BasehWnd; char winstyle[20]; char NHMenu[]="AboutMenu"; unsigned char *pchBuf; unsigned char *pchGet; unsigned char *pchPut; int pchCount; int BaseUnits; int BaseHeight; int BaseWidth; int MessageHeight; int MessageWidth; int MessageX; int MessageY; int MessageCount; char *MessagePtr[MAX_MESSAGE_COUNT]; int MapHeight; int MapWidth; int MapX; int MapY; int StatusHeight; int StatusWidth; int StatusX; int StatusY; int tiles_on; int DefCharWidth; int DefCharHeight; int DefBackGroundColor; int DefNormalTextColor; struct win32_menuitem *MenuPtr[MAX_MENU_WINDOWS][MAX_INVENTORY]; int MenuCount[MAX_MENU_WINDOWS]; int MenuWindowCount = 0; HFONT hDefFnt; TEXTMETRIC tm; RECT rcClient; int inputstatus; char input_text[BUFSZ]; int input_text_size; COLORREF colormap[] = { RGB( 0, 0, 0), /* BLACK */ RGB(255, 0, 0), /* RED */ RGB( 0,160, 0), /* GREEN */ RGB(200,160, 20), /* BROWN */ RGB( 0, 0,160), /* BLUE */ RGB(160, 0,160), /* MAGENTA */ RGB( 0,160,160), /* CYAN */ RGB(200,200,200), /* GRAY */ RGB( 0, 0, 0), /* NO_COLOR */ RGB(100,255, 0), /* ORANGE */ RGB( 0,255, 0), /* BR GREEN */ RGB(255,255, 0), /* YELLOW */ RGB( 0, 0,255), /* BR BLUE */ RGB(255, 0,255), /* BR MAGENTA */ RGB( 0,255,255), /* BR CYAN */ RGB(255,255,255) /* WHITE */ }; int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPreInst, LPSTR lpszCmdLine, int nCmdShow) { int tmp; HaveConsole = 0; wcNetHack.hInstance = hInst; NHhPreInst = hPreInst; NHnCmdShow = nCmdShow; argc = getargs(lpszCmdLine); /* temporary */ if (getenv("WINMODE") != (char *)0) { if (strncmpi("WIN32",getenv("WINMODE"),5) == 0) winmode = WINMODE_WIN32; } switch(winmode) { # ifndef WIN32S case WINMODE_TTY: strcpy(winstyle,"tty"); tmp = AllocConsole(); if (tmp) HaveConsole = 1; break; # endif case WINMODE_WIN32: strcpy(winstyle,"win32"); break; default: strcpy(winstyle,DEFAULT_WINDOW_SYS); break; } choose_windows(winstyle); return main(argc, xargv); } int getargs(char *cmdline) { int maxchars; int count; int argcount = 1; int between = 0; char *tmpbuf; xargv[0] = "nethack.exe"; if (strlen(cmdline) == 0) return argcount; tmpbuf = (char *)alloc(strlen(cmdline)+1); strcpy(tmpbuf,cmdline); xargv[argcount] = (char *)&tmpbuf[0]; ++argcount; maxchars = strlen(tmpbuf); for (count = 0; count < maxchars; ++count) { if (!between) { if (isspace(tmpbuf[count])) { between = 1; tmpbuf[count] = '\0'; } } else { if (!isspace(tmpbuf[count])) { between = 0; xargv[argcount] = (char *)&tmpbuf[count]; ++argcount; } } } return argcount; } BOOL InitBaseWindow(void) { if (!NHhPreInst) { wcNetHack.lpszClassName="NHBaseWin"; wcNetHack.lpfnWndProc =BaseWndProc; wcNetHack.hCursor =LoadCursor((HINSTANCE)0,IDC_ARROW); wcNetHack.hIcon =LoadIcon(wcNetHack.hInstance, "NETHACK_"); wcNetHack.lpszMenuName ="NHMenu"; wcNetHack.hbrBackground=GetStockObject(BLACK_BRUSH); wcNetHack.style =CS_HREDRAW|CS_VREDRAW; wcNetHack.cbClsExtra =0; wcNetHack.cbWndExtra =0; if (!RegisterClass (&wcNetHack)) { return FALSE; } } BasehWnd = CreateWindow("NHBaseWin", "NetHack 3.1", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, (HWND)0, (HMENU)0, wcNetHack.hInstance, (LPSTR)0); return 1; } BOOL InitTextWindow(void) { ATOM status; wcNHText.hInstance =wcNetHack.hInstance; wcNHText.lpszClassName=NHTextClassName; wcNHText.lpfnWndProc =TextWndProc; wcNHText.hCursor =LoadCursor((HINSTANCE)0,IDC_ARROW); wcNHText.hIcon =LoadIcon(0,IDI_APPLICATION); wcNHText.lpszMenuName =(char *)0; wcNHText.hbrBackground=GetStockObject(BLACK_BRUSH); wcNHText.style =CS_HREDRAW|CS_VREDRAW; wcNHText.cbClsExtra =0; wcNHText.cbWndExtra =0; status = RegisterClass(&wcNHText); if (status == (ATOM)0) return 0; else return 1; } BOOL InitPopupWindow(void) { ATOM status; wcNHPopup.hInstance =wcNetHack.hInstance; wcNHPopup.lpszClassName=NHPopupClassName; wcNHPopup.lpfnWndProc =PopupWndProc; wcNHPopup.hCursor =LoadCursor((HINSTANCE)0,IDC_ARROW); wcNHPopup.hIcon =LoadIcon(0,IDI_APPLICATION); wcNHPopup.lpszMenuName =(char *)0; wcNHPopup.hbrBackground=GetStockObject(BLACK_BRUSH); wcNHPopup.style =CS_HREDRAW|CS_VREDRAW; wcNHPopup.cbClsExtra =0; wcNHPopup.cbWndExtra =0; status = RegisterClass(&wcNHPopup); if (status == (ATOM)0) return 0; else return 1; } BOOL InitListboxWindow(void) { ATOM status; wcNHListbox.hInstance =wcNetHack.hInstance; wcNHListbox.lpszClassName=NHListboxClassName; wcNHListbox.lpfnWndProc =ListboxWndProc; wcNHListbox.hCursor =LoadCursor((HINSTANCE)0,IDC_ARROW); wcNHListbox.hIcon =LoadIcon(0,IDI_APPLICATION); wcNHListbox.lpszMenuName =(char *)0; wcNHListbox.hbrBackground=GetStockObject(WHITE_BRUSH); wcNHListbox.style =CS_HREDRAW|CS_VREDRAW; wcNHListbox.cbClsExtra =0; wcNHListbox.cbWndExtra =0; status = RegisterClass(&wcNHListbox); if (status == (ATOM)0) return 0; else return 1; } void win_win32_init() { nt_kbhit = win32_kbhit; } int win32_kbhit() { return pchCount; } /* * Virtual Key translation tables. * (Adopted from the MSDOS port) */ #define VKEYPADLO 0x60 #define VKEYPADHI 0x6E #define VPADKEYS (VKEYPADHI - VKEYPADLO + 1) #define isvkeypad(x) (VKEYPADLO <= (x) && (x) <= VKEYPADHI) /* * Keypad keys are translated to the normal values below from * Windows virtual keys. Shifted keypad keys are translated to the * shift values below. */ static const struct vkpad { uchar normal, shift, cntrl; } vkeypad[VPADKEYS] = { {'i', 'I', C('i')}, /* Ins */ {'b', 'B', C('b')}, /* 1 */ {'j', 'J', C('j')}, /* 2 */ {'n', 'N', C('n')}, /* 3 */ {'h', 'H', C('h')}, /* 4 */ {'g', 'g', 'g'}, /* 5 */ {'l', 'L', C('l')}, /* 6 */ {'y', 'Y', C('y')}, /* 7 */ {'k', 'K', C('k')}, /* 8 */ {'u', 'U', C('u')}, /* 9 */ { 0 , 0, 0}, /* * */ {'p', 'P', C('p')}, /* + */ { 0 , 0, 0}, /* sep */ {'m', C('p'), C('p')}, /* - */ {'.', ':', ':'} /* Del */ }, vnumpad[VPADKEYS] = { {'i', 'I', C('i')}, /* Ins */ {'1', M('1'), '1'}, /* 1 */ {'2', M('2'), '2'}, /* 2 */ {'3', M('3'), '3'}, /* 3 */ {'4', M('4'), '4'}, /* 4 */ {'g', 'G', 'g'}, /* 5 */ {'6', M('6'), '6'}, /* 6 */ {'7', M('7'), '7'}, /* 7 */ {'8', M('8'), '8'}, /* 8 */ {'9', M('9'), '9'}, /* 9 */ { 0 , 0, 0}, /* * */ {'p', 'P', C('p')}, /* + */ { 0 , 0, 0}, /* sep */ {'m', C('p'), C('p')}, /* - */ {'.', ':', ':'} /* Del */ }; /* * Unlike Ctrl-letter, the Alt-letter keystrokes have no specific ASCII * meaning unless assigned one by a virtual key conversion table. * To interpret Alt-letters, we use a virtual key code table to * translate the virtual key code into a letter, then set the "meta" * bit for it. */ static const char vkmap[] = { /* ... */ 'a','b','c','d','e','f','g','h','i','j','k','l','m', 'n','o','p','q','r','s','t','u','v','w','x','y','z' }; #define VKLO 0x41 #define invkmap(x) (VKLO <= (x) && (x) < VKLO + SIZE(vkmap)) #endif /* WIN32_GRAPHICS */ �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/win32/petmark.uu��������������������������������������������������������������0000664�0000764�0000764�00000000560�10545462317�015432� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������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 ������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/win32/magtile.dsp�������������������������������������������������������������0000664�0000764�0000764�00000012055�10545462317�015550� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Microsoft Developer Studio Project File - Name="magtile" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=magtile - 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 "magtile.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 "magtile.mak" CFG="magtile - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "magtile - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "magtile - 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)" == "magtile - 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\magtile.exe" !ELSEIF "$(CFG)" == "magtile - 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\magtile.exe" /pdbtype:sept !ENDIF # Begin Target # Name "magtile - Win32 Release" # Name "magtile - 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\magtile.c !IF "$(CFG)" == "magtile - Win32 Release" !ELSEIF "$(CFG)" == "magtile - Win32 Debug" # ADD CPP /D "PACKED_FILE" !ENDIF # End Source File # Begin Source File SOURCE=..\win\share\tiletext.c !IF "$(CFG)" == "magtile - Win32 Release" !ELSEIF "$(CFG)" == "magtile - 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 �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/win32/mnselcnt.uu�������������������������������������������������������������0000664�0000764�0000764�00000000313�10545462317�015606� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������begin 600 mnselcnt.bmp M0DU^`````````#X````H````$````!`````!``$``````$````!T$@``=!(` M`````````````````/___P```````````#_\```__```.]P``#`,```[W``` D.]P``#O<```[W```,`P``#O<```__```/_P````````````` ` end ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/win32/nethackw.dsp������������������������������������������������������������0000664�0000764�0000764�00000103117�10545462317�015732� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# 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 GTK 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 GTK 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 "NetHackW - Win32 GTK Debug" (based on "Win32 (x86) Application") !MESSAGE "NetHackW - Win32 GTK Release " (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 /Ot /Og /Oy /Ob1 /Gf /Gy /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /Yu"stdafx.h" /FD /Gs /Oi- /c # ADD CPP /nologo /W3 /GX /Ot /Og /Oy /Ob1 /Gf /Gy /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 /Gs /Oi- /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 winmm.lib /nologo /subsystem:windows /map /debug /machine:I386 /out:"Release/slashemw.exe" /MAPINFO:EXPORTS /MAPINFO:LINES # SUBTRACT LINK32 /pdb:none # Begin Special Build Tool OutDir=.\Release SOURCE="$(InputPath)" PostBuild_Desc=Install exe PostBuild_Cmds=copy $(OutDir)\slashemw.exe ..\binary copy ..\dat\nhshare ..\binary copy ..\dat\nhushare ..\binary copy ..\dat\license ..\binary if exist ..\src\tiles32.bmp copy ..\src\tiles32.bmp ..\binary\tiles32.bmp if exist ..\src\tiles128.bmp copy ..\src\tiles128.bmp ..\binary\tiles128.bmp if exist ..\doc\Guidebook.txt copy ..\doc\Guidebook.txt ..\binary\Guidebook.txt if exist ..\doc\slashem.txt copy ..\doc\slashem.txt ..\binary\SlashEM.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" /FR /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 winmm.lib /nologo /subsystem:windows /debug /machine:I386 /out:"Debug/slashemw.exe" /pdbtype:sept # Begin Special Build Tool OutDir=.\Debug SOURCE="$(InputPath)" PostBuild_Desc=Install exe PostBuild_Cmds=if NOT exist ..\binary\*.* mkdir ..\binary copy $(OutDir)\slashemw.exe ..\binary copy ..\dat\nhshare ..\binary copy ..\dat\nhushare ..\binary copy ..\dat\license ..\binary rem if exist ..\src\tiles.bmp copy ..\src\tiles.bmp ..\binary if exist ..\src\tiles32.bmp copy ..\src\tiles32.bmp ..\binary if exist ..\doc\Guidebook.txt copy ..\doc\Guidebook.txt ..\binary\Guidebook.txt if exist ..\doc\slashem.txt copy ..\doc\slashem.txt ..\binary\SlashEM.txt copy ..\sys\winnt\defaults.nh ..\binary\defaults.nh # End Special Build Tool !ELSEIF "$(CFG)" == "NetHackW - Win32 GTK Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "NetHackW___Win32_GTK_Debug" # PROP BASE Intermediate_Dir "NetHackW___Win32_GTK_Debug" # PROP BASE Ignore_Export_Lib 0 # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "NetHackW___Win32_GTK_Debug" # PROP Intermediate_Dir "NetHackW___Win32_GTK_Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE 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" /FR /FD /GZ /c # SUBTRACT BASE CPP /YX /Yc /Yu # 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" /D "GTK_GRAPHICS" /FR /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 comctl32.lib advapi32.lib winmm.lib /nologo /subsystem:windows /debug /machine:I386 /out:"Debug/slashemw.exe" /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib comctl32.lib advapi32.lib winmm.lib libgtk-win32-2.0.dll.a libgdk-win32-2.0.dll.a libglib-2.0.dll.a libgdk_pixbuf-2.0.dll.a libgobject-2.0.dll.a libpango-1.0.dll.a /nologo /subsystem:windows /debug /machine:I386 /out:"Debug/slashemw.exe" /pdbtype:sept # Begin Special Build Tool OutDir=.\NetHackW___Win32_GTK_Debug SOURCE="$(InputPath)" PostBuild_Desc=Install exe PostBuild_Cmds=if NOT exist ..\binary\*.* mkdir ..\binary copy $(OutDir)\Debug\slashemw.exe ..\binary copy ..\dat\nhshare ..\binary copy ..\dat\nhushare ..\binary copy ..\dat\license ..\binary rem if exist ..\src\tiles.bmp copy ..\src\tiles.bmp ..\binary if exist ..\src\tiles32.bmp copy ..\src\tiles32.bmp ..\binary if exist ..\doc\Guidebook.txt copy ..\doc\Guidebook.txt ..\binary\Guidebook.txt if exist ..\doc\slashem.txt copy ..\doc\slashem.txt ..\binary\SlashEM.txt copy ..\sys\winnt\defaults.nh ..\binary\defaults.nh # End Special Build Tool !ELSEIF "$(CFG)" == "NetHackW - Win32 GTK Release " # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "NetHackW___Win32_GTK_Release_" # PROP BASE Intermediate_Dir "NetHackW___Win32_GTK_Release_" # PROP BASE Ignore_Export_Lib 0 # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "NetHackW___Win32_GTK_Release_" # PROP Intermediate_Dir "NetHackW___Win32_GTK_Release_" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /Ot /Og /Oy /Ob1 /Gf /Gy /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 /Gs /Oi- /c # SUBTRACT BASE CPP /YX /Yc /Yu # ADD CPP /nologo /W3 /GX /Ot /Og /Oy /Ob1 /Gf /Gy /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" /D "GTK_GRAPHICS" /FD /Gs /Oi- /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 comctl32.lib advapi32.lib winmm.lib /nologo /subsystem:windows /map /debug /machine:I386 /out:"Release/slashemw.exe" /MAPINFO:EXPORTS /MAPINFO:LINES # SUBTRACT BASE LINK32 /pdb:none # ADD LINK32 kernel32.lib user32.lib gdi32.lib comctl32.lib advapi32.lib winmm.lib libgtk-win32-2.0.dll.a libgdk-win32-2.0.dll.a libglib-2.0.dll.a libgdk_pixbuf-2.0.dll.a libgobject-2.0.dll.a libpango-1.0.dll.a /nologo /subsystem:windows /map /debug /machine:I386 /out:"Release/slashemw.exe" /MAPINFO:EXPORTS /MAPINFO:LINES # SUBTRACT LINK32 /pdb:none # Begin Special Build Tool OutDir=.\NetHackW___Win32_GTK_Release_ SOURCE="$(InputPath)" PostBuild_Desc=Install exe PostBuild_Cmds=copy $(OutDir)\slashemw.exe ..\binary copy ..\dat\nhdat ..\binary copy ..\dat\license ..\binary if exist ..\src\tiles32.bmp copy ..\src\tiles32.bmp ..\binary if exist ..\doc\Guidebook.txt copy ..\doc\Guidebook.txt ..\binary\Guidebook.txt if exist ..\doc\slashem.txt copy ..\doc\slashem.txt ..\binary\SlashEM.txt copy ..\sys\winnt\defaults.nh ..\binary\defaults.nh # End Special Build Tool !ENDIF # Begin Target # Name "NetHackW - Win32 Release" # Name "NetHackW - Win32 Debug" # Name "NetHackW - Win32 GTK Debug" # Name "NetHackW - Win32 GTK Release " # 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\gypsy.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=..\sys\winnt\ntsound.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\tech.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=..\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\mnselcnt.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\petmark.bmp # End Source File # Begin Source File SOURCE=..\win\win32\rip.bmp # End Source File # Begin Source File SOURCE=..\win\win32\slashem.ico # End Source File # Begin Source File SOURCE=..\win\win32\small.ico # End Source File # Begin Source File SOURCE=..\win\win32\splash.bmp # 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\mhrip.c # End Source File # Begin Source File SOURCE=..\win\win32\mhrip.h # End Source File # Begin Source File SOURCE=..\win\win32\mhsplash.c # End Source File # Begin Source File SOURCE=..\win\win32\mhsplash.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 Group "wnd-gtk" # PROP Default_Filter "" # Begin Source File SOURCE=..\win\proxy\dlbh.c !IF "$(CFG)" == "NetHackW - Win32 Release" # PROP Exclude_From_Build 1 !ELSEIF "$(CFG)" == "NetHackW - Win32 Debug" # PROP Exclude_From_Build 1 !ELSEIF "$(CFG)" == "NetHackW - Win32 GTK Debug" !ELSEIF "$(CFG)" == "NetHackW - Win32 GTK Release " # PROP BASE Exclude_From_Build 1 !ENDIF # End Source File # Begin Source File SOURCE=..\win\proxy\getopt.c !IF "$(CFG)" == "NetHackW - Win32 Release" # PROP Exclude_From_Build 1 !ELSEIF "$(CFG)" == "NetHackW - Win32 Debug" # PROP Exclude_From_Build 1 !ELSEIF "$(CFG)" == "NetHackW - Win32 GTK Debug" !ELSEIF "$(CFG)" == "NetHackW - Win32 GTK Release " # PROP BASE Exclude_From_Build 1 !ENDIF # End Source File # Begin Source File SOURCE=..\win\proxy\glyphmap.c !IF "$(CFG)" == "NetHackW - Win32 Release" # PROP Exclude_From_Build 1 !ELSEIF "$(CFG)" == "NetHackW - Win32 Debug" # PROP Exclude_From_Build 1 !ELSEIF "$(CFG)" == "NetHackW - Win32 GTK Debug" !ELSEIF "$(CFG)" == "NetHackW - Win32 GTK Release " # PROP BASE Exclude_From_Build 1 !ENDIF # End Source File # Begin Source File SOURCE=..\win\gtk\gtk.c !IF "$(CFG)" == "NetHackW - Win32 Release" # PROP Exclude_From_Build 1 !ELSEIF "$(CFG)" == "NetHackW - Win32 Debug" # PROP Exclude_From_Build 1 !ELSEIF "$(CFG)" == "NetHackW - Win32 GTK Debug" !ELSEIF "$(CFG)" == "NetHackW - Win32 GTK Release " # PROP BASE Exclude_From_Build 1 !ENDIF # End Source File # Begin Source File SOURCE=..\win\gtk\gtkext.c !IF "$(CFG)" == "NetHackW - Win32 Release" # PROP Exclude_From_Build 1 !ELSEIF "$(CFG)" == "NetHackW - Win32 Debug" # PROP Exclude_From_Build 1 !ELSEIF "$(CFG)" == "NetHackW - Win32 GTK Debug" !ELSEIF "$(CFG)" == "NetHackW - Win32 GTK Release " # PROP BASE Exclude_From_Build 1 !ENDIF # End Source File # Begin Source File SOURCE=..\win\gtk\gtkextcmd.c !IF "$(CFG)" == "NetHackW - Win32 Release" # PROP Exclude_From_Build 1 !ELSEIF "$(CFG)" == "NetHackW - Win32 Debug" # PROP Exclude_From_Build 1 !ELSEIF "$(CFG)" == "NetHackW - Win32 GTK Debug" !ELSEIF "$(CFG)" == "NetHackW - Win32 GTK Release " # PROP BASE Exclude_From_Build 1 !ENDIF # End Source File # Begin Source File SOURCE=..\win\gtk\gtkgetlin.c !IF "$(CFG)" == "NetHackW - Win32 Release" # PROP Exclude_From_Build 1 !ELSEIF "$(CFG)" == "NetHackW - Win32 Debug" # PROP Exclude_From_Build 1 !ELSEIF "$(CFG)" == "NetHackW - Win32 GTK Debug" !ELSEIF "$(CFG)" == "NetHackW - Win32 GTK Release " # PROP BASE Exclude_From_Build 1 !ENDIF # End Source File # Begin Source File SOURCE=..\win\gtk\gtkhackrc.c !IF "$(CFG)" == "NetHackW - Win32 Release" # PROP Exclude_From_Build 1 !ELSEIF "$(CFG)" == "NetHackW - Win32 Debug" # PROP Exclude_From_Build 1 !ELSEIF "$(CFG)" == "NetHackW - Win32 GTK Debug" !ELSEIF "$(CFG)" == "NetHackW - Win32 GTK Release " # PROP BASE Exclude_From_Build 1 !ENDIF # End Source File # Begin Source File SOURCE=..\win\gtk\gtkint.c !IF "$(CFG)" == "NetHackW - Win32 Release" # PROP Exclude_From_Build 1 !ELSEIF "$(CFG)" == "NetHackW - Win32 Debug" # PROP Exclude_From_Build 1 !ELSEIF "$(CFG)" == "NetHackW - Win32 GTK Debug" !ELSEIF "$(CFG)" == "NetHackW - Win32 GTK Release " # PROP BASE Exclude_From_Build 1 !ENDIF # End Source File # Begin Source File SOURCE=..\win\gtk\gtkmap.c !IF "$(CFG)" == "NetHackW - Win32 Release" # PROP Exclude_From_Build 1 !ELSEIF "$(CFG)" == "NetHackW - Win32 Debug" # PROP Exclude_From_Build 1 !ELSEIF "$(CFG)" == "NetHackW - Win32 GTK Debug" !ELSEIF "$(CFG)" == "NetHackW - Win32 GTK Release " # PROP BASE Exclude_From_Build 1 !ENDIF # End Source File # Begin Source File SOURCE=..\win\gtk\gtkmenu.c !IF "$(CFG)" == "NetHackW - Win32 Release" # PROP Exclude_From_Build 1 !ELSEIF "$(CFG)" == "NetHackW - Win32 Debug" # PROP Exclude_From_Build 1 !ELSEIF "$(CFG)" == "NetHackW - Win32 GTK Debug" !ELSEIF "$(CFG)" == "NetHackW - Win32 GTK Release " # PROP BASE Exclude_From_Build 1 !ENDIF # End Source File # Begin Source File SOURCE=..\win\gtk\gtkmessage.c !IF "$(CFG)" == "NetHackW - Win32 Release" # PROP Exclude_From_Build 1 !ELSEIF "$(CFG)" == "NetHackW - Win32 Debug" # PROP Exclude_From_Build 1 !ELSEIF "$(CFG)" == "NetHackW - Win32 GTK Debug" !ELSEIF "$(CFG)" == "NetHackW - Win32 GTK Release " # PROP BASE Exclude_From_Build 1 !ENDIF # End Source File # Begin Source File SOURCE=..\win\gtk\gtkmisc.c !IF "$(CFG)" == "NetHackW - Win32 Release" # PROP Exclude_From_Build 1 !ELSEIF "$(CFG)" == "NetHackW - Win32 Debug" # PROP Exclude_From_Build 1 !ELSEIF "$(CFG)" == "NetHackW - Win32 GTK Debug" !ELSEIF "$(CFG)" == "NetHackW - Win32 GTK Release " # PROP BASE Exclude_From_Build 1 !ENDIF # End Source File # Begin Source File SOURCE=..\win\gtk\gtkprefs.c !IF "$(CFG)" == "NetHackW - Win32 Release" # PROP Exclude_From_Build 1 !ELSEIF "$(CFG)" == "NetHackW - Win32 Debug" !ELSEIF "$(CFG)" == "NetHackW - Win32 GTK Debug" !ELSEIF "$(CFG)" == "NetHackW - Win32 GTK Release " !ENDIF # End Source File # Begin Source File SOURCE=..\win\gtk\gtkstatus.c !IF "$(CFG)" == "NetHackW - Win32 Release" # PROP Exclude_From_Build 1 !ELSEIF "$(CFG)" == "NetHackW - Win32 Debug" # PROP Exclude_From_Build 1 !ELSEIF "$(CFG)" == "NetHackW - Win32 GTK Debug" !ELSEIF "$(CFG)" == "NetHackW - Win32 GTK Release " # PROP BASE Exclude_From_Build 1 !ENDIF # End Source File # Begin Source File SOURCE=..\win\gtk\gtktile.c !IF "$(CFG)" == "NetHackW - Win32 Release" # PROP Exclude_From_Build 1 !ELSEIF "$(CFG)" == "NetHackW - Win32 Debug" # PROP Exclude_From_Build 1 !ELSEIF "$(CFG)" == "NetHackW - Win32 GTK Debug" !ELSEIF "$(CFG)" == "NetHackW - Win32 GTK Release " # PROP BASE Exclude_From_Build 1 !ENDIF # End Source File # Begin Source File SOURCE=..\win\gtk\gtkyn.c !IF "$(CFG)" == "NetHackW - Win32 Release" # PROP Exclude_From_Build 1 !ELSEIF "$(CFG)" == "NetHackW - Win32 Debug" # PROP Exclude_From_Build 1 !ELSEIF "$(CFG)" == "NetHackW - Win32 GTK Debug" !ELSEIF "$(CFG)" == "NetHackW - Win32 GTK Release " # PROP BASE Exclude_From_Build 1 !ENDIF # End Source File # Begin Source File SOURCE=..\win\proxy\mapid.c !IF "$(CFG)" == "NetHackW - Win32 Release" # PROP Exclude_From_Build 1 !ELSEIF "$(CFG)" == "NetHackW - Win32 Debug" # PROP Exclude_From_Build 1 !ELSEIF "$(CFG)" == "NetHackW - Win32 GTK Debug" !ELSEIF "$(CFG)" == "NetHackW - Win32 GTK Release " # PROP BASE Exclude_From_Build 1 !ENDIF # End Source File # Begin Source File SOURCE=..\win\proxy\riputil.c !IF "$(CFG)" == "NetHackW - Win32 Release" # PROP Exclude_From_Build 1 !ELSEIF "$(CFG)" == "NetHackW - Win32 Debug" # PROP Exclude_From_Build 1 !ELSEIF "$(CFG)" == "NetHackW - Win32 GTK Debug" !ELSEIF "$(CFG)" == "NetHackW - Win32 GTK Release " # PROP BASE Exclude_From_Build 1 !ENDIF # End Source File # Begin Source File SOURCE=..\include\winGTK.h !IF "$(CFG)" == "NetHackW - Win32 Release" # PROP Exclude_From_Build 1 !ELSEIF "$(CFG)" == "NetHackW - Win32 Debug" # PROP Exclude_From_Build 1 !ELSEIF "$(CFG)" == "NetHackW - Win32 GTK Debug" !ELSEIF "$(CFG)" == "NetHackW - Win32 GTK Release " # PROP BASE Exclude_From_Build 1 !ENDIF # End Source File # Begin Source File SOURCE=..\win\gtk\xshmmap.c !IF "$(CFG)" == "NetHackW - Win32 Release" # PROP Exclude_From_Build 1 !ELSEIF "$(CFG)" == "NetHackW - Win32 Debug" # PROP Exclude_From_Build 1 !ELSEIF "$(CFG)" == "NetHackW - Win32 GTK Debug" !ELSEIF "$(CFG)" == "NetHackW - Win32 GTK Release " # PROP BASE Exclude_From_Build 1 !ENDIF # End Source File # End Group # Begin Source File SOURCE=..\win\win32\ReadMe.txt # End Source File # End Target # End Project �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/win32/mnsel.uu����������������������������������������������������������������0000664�0000764�0000764�00000000310�10545462317�015076� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������begin 600 mnsel.bmp M0DU^`````````#X````H````$````!`````!``$``````$````!T$@``=!(` M`````````````````/___P```````````#_\```W_```,_P``"7\```F_``` D)WP``">\```_W```/^P``#_T```__```/_P````````````` ` end ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/win32/mhdlg.c�����������������������������������������������������������������0000664�0000764�0000764�00000053377�10545462317�014671� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (C) 2001 by Alex Kompel <shurikk@pacbell.net> */ /* 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; LRESULT unchecked; 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 { NHMessageBox(hWnd, TEXT("Cannot match this role. Try something else."), MB_ICONSTOP | 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" */ unchecked = (SendMessage((HWND)lParam, BM_GETCHECK, 0, 0)==BST_UNCHECKED); EnableWindow( GetDlgItem(hWnd, IDC_PLSEL_ROLE_LIST), unchecked ); if (!unchecked) plselAdjustLists( hWnd, -1); } break; case IDC_PLSEL_RACE_RANDOM: if( HIWORD(wParam)==BN_CLICKED ) { unchecked = (SendMessage((HWND)lParam, BM_GETCHECK, 0, 0)==BST_UNCHECKED); EnableWindow( GetDlgItem(hWnd, IDC_PLSEL_RACE_LIST), unchecked ); if (!unchecked) plselAdjustLists( hWnd, -1); } break; case IDC_PLSEL_GENDER_RANDOM: if( HIWORD(wParam)==BN_CLICKED ) { unchecked = (SendMessage((HWND)lParam, BM_GETCHECK, 0, 0)==BST_UNCHECKED); EnableWindow( GetDlgItem(hWnd, IDC_PLSEL_GENDER_LIST), unchecked ); if (!unchecked) plselAdjustLists( hWnd, -1); } break; case IDC_PLSEL_ALIGN_RANDOM: if( HIWORD(wParam)==BN_CLICKED ) { unchecked = (SendMessage((HWND)lParam, BM_GETCHECK, 0, 0)==BST_UNCHECKED); EnableWindow( GetDlgItem(hWnd, IDC_PLSEL_ALIGN_LIST), unchecked ); if (!unchecked) plselAdjustLists( hWnd, -1); } break; case IDC_PLSEL_ROLE_LIST: if( HIWORD(wParam)==CBN_SELENDOK ) { /* filter out invalid options if the selection was made */ plselAdjustLists( hWnd, LOWORD(wParam) ); } break; case IDC_PLSEL_RACE_LIST: if( HIWORD(wParam)==CBN_SELENDOK ) { plselAdjustLists( hWnd, LOWORD(wParam) ); } break; case IDC_PLSEL_GENDER_LIST: if( HIWORD(wParam)==CBN_SELENDOK ) { plselAdjustLists( hWnd, LOWORD(wParam) ); } break; case IDC_PLSEL_ALIGN_LIST: if( HIWORD(wParam)==CBN_SELENDOK ) { plselAdjustLists( hWnd, LOWORD(wParam) ); } break; } break; } return FALSE; } void setComboBoxValue(HWND hWnd, int combo_box, int value) { int index_max = SendDlgItemMessage(hWnd, combo_box, CB_GETCOUNT, 0, 0); int index; int value_to_set = LB_ERR; for (index = 0; index < index_max; index++) { if (SendDlgItemMessage(hWnd, combo_box, CB_GETITEMDATA, (WPARAM)index, 0) == value) { value_to_set = index; break; } } SendDlgItemMessage(hWnd, combo_box, CB_SETCURSEL, (WPARAM)value_to_set, 0); } /* initialize player selector dialog */ void plselInitDialog(HWND hWnd) { TCHAR wbuf[BUFSZ]; /* set player name */ SetDlgItemText(hWnd, IDC_PLSEL_NAME, NH_A2W(plname, wbuf, sizeof(wbuf))); /* check flags for consistency */ if( flags.initrole>=0 ) { if (flags.initrace>=0 && !validrace(flags.initrole, flags.initrace)) { flags.initrace = ROLE_NONE; } if (flags.initgend>=0 && !validgend(flags.initrole, flags.initrace, flags.initgend)) { flags.initgend = ROLE_NONE; } if (flags.initalign>=0 && !validalign(flags.initrole, flags.initrace, flags.initalign)) { flags.initalign = ROLE_NONE; } } /* populate select boxes */ plselAdjustLists(hWnd, -1); /* intialize roles list */ if( flags.initrole<0 || !ok_role(flags.initrole, ROLE_NONE, ROLE_NONE, ROLE_NONE)) { CheckDlgButton(hWnd, IDC_PLSEL_ROLE_RANDOM, BST_CHECKED); EnableWindow(GetDlgItem(hWnd, IDC_PLSEL_ROLE_LIST), FALSE); } else { CheckDlgButton(hWnd, IDC_PLSEL_ROLE_RANDOM, BST_UNCHECKED); EnableWindow(GetDlgItem(hWnd, IDC_PLSEL_ROLE_LIST), TRUE); setComboBoxValue(hWnd, IDC_PLSEL_ROLE_LIST, flags.initrole); } /* intialize races list */ if( flags.initrace<0 || !ok_race(flags.initrole, flags.initrace, ROLE_NONE, ROLE_NONE) ) { CheckDlgButton(hWnd, IDC_PLSEL_RACE_RANDOM, BST_CHECKED); EnableWindow(GetDlgItem(hWnd, IDC_PLSEL_RACE_LIST), FALSE); } else { CheckDlgButton(hWnd, IDC_PLSEL_RACE_RANDOM, BST_UNCHECKED); EnableWindow(GetDlgItem(hWnd, IDC_PLSEL_RACE_LIST), TRUE); setComboBoxValue(hWnd, IDC_PLSEL_RACE_LIST, flags.initrace); } /* intialize genders list */ if( flags.initgend<0 || !ok_gend(flags.initrole, flags.initrace, flags.initgend, ROLE_NONE)) { CheckDlgButton(hWnd, IDC_PLSEL_GENDER_RANDOM, BST_CHECKED); EnableWindow(GetDlgItem(hWnd, IDC_PLSEL_GENDER_LIST), FALSE); } else { CheckDlgButton(hWnd, IDC_PLSEL_GENDER_RANDOM, BST_UNCHECKED); EnableWindow(GetDlgItem(hWnd, IDC_PLSEL_GENDER_LIST), TRUE); setComboBoxValue(hWnd, IDC_PLSEL_GENDER_LIST, flags.initgend); } /* intialize alignments list */ if( flags.initalign<0 || !ok_align(flags.initrole, flags.initrace, flags.initgend, flags.initalign) ) { CheckDlgButton(hWnd, IDC_PLSEL_ALIGN_RANDOM, BST_CHECKED); EnableWindow(GetDlgItem(hWnd, IDC_PLSEL_ALIGN_LIST), FALSE); } else { CheckDlgButton(hWnd, IDC_PLSEL_ALIGN_RANDOM, BST_UNCHECKED); EnableWindow(GetDlgItem(hWnd, IDC_PLSEL_ALIGN_LIST), TRUE); setComboBoxValue(hWnd, IDC_PLSEL_ALIGN_LIST, flags.initalign); } } /* adjust role/race/alignment/gender list - filter out invalid combinations changed_sel points to the list where selection occured (-1 if unknown) WAC - allow filtering in any order. */ void plselAdjustLists(HWND hWnd, int changed_sel) { HWND control_role, control_race, control_gender, control_align; int initrole, initrace, initgend, initalign; int selrole, selrace, selgend, selalign; int i; int ind; 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); selrole = initrole = (ind==LB_ERR)? flags.initrole : SendMessage(control_role, CB_GETITEMDATA, ind, 0); if (!IsWindowEnabled(control_role)) initrole = flags.initrole; ind = SendMessage(control_race, CB_GETCURSEL, 0, 0); selrace = initrace = (ind==LB_ERR)? flags.initrace : SendMessage(control_race, CB_GETITEMDATA, ind, 0); if (!IsWindowEnabled(control_race)) initrace = flags.initrace; ind = SendMessage(control_gender, CB_GETCURSEL, 0, 0); selgend = initgend = (ind==LB_ERR)? flags.initgend : SendMessage(control_gender, CB_GETITEMDATA, ind, 0); if (!IsWindowEnabled(control_gender)) initgend = flags.initgend; ind = SendMessage(control_align, CB_GETCURSEL, 0, 0); selalign = initalign = (ind==LB_ERR)? flags.initalign : SendMessage(control_align, CB_GETITEMDATA, ind, 0); if (!IsWindowEnabled(control_align)) initalign = flags.initalign; if (!ok_role(selrole, selrace, selgend, selalign)) { if (changed_sel != IDC_PLSEL_ROLE_LIST) { selrole = flags.initrole; SendMessage(control_role, CB_SETCURSEL, (WPARAM)-1, (LPARAM)0 ); } if (changed_sel != IDC_PLSEL_RACE_LIST) { selrace = flags.initrace; SendMessage(control_race, CB_SETCURSEL, (WPARAM)-1, (LPARAM)0 ); } if (changed_sel != IDC_PLSEL_GENDER_LIST) { selgend = flags.initgend; SendMessage(control_gender, CB_SETCURSEL, (WPARAM)-1, (LPARAM)0 ); } if (changed_sel != IDC_PLSEL_ALIGN_LIST) { selalign = flags.initalign; SendMessage(control_align, CB_SETCURSEL, (WPARAM)-1, (LPARAM)0 ); } } /* reset content and populate the list */ SendMessage(control_role, CB_RESETCONTENT, 0, 0); for (i = 0; roles[i].name.m; i++) { 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==selrole ) { SendMessage(control_role, CB_SETCURSEL, (WPARAM)ind, (LPARAM)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==selrace ) { SendMessage(control_race, CB_SETCURSEL, (WPARAM)ind, (LPARAM)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==selgend ) { SendMessage(control_gender, CB_SETCURSEL, (WPARAM)ind, (LPARAM)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==selalign ) { SendMessage(control_align, CB_SETCURSEL, (WPARAM)ind, (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) { NHMessageBox(hWnd, TEXT("Incompatible role!"), MB_ICONSTOP | 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) { NHMessageBox(hWnd, TEXT("Incompatible race!"), MB_ICONSTOP | 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) { NHMessageBox(hWnd, TEXT("Incompatible gender!"), MB_ICONSTOP | 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 { NHMessageBox(hWnd, TEXT("Incompatible alignment!"), MB_ICONSTOP | MB_OK); return FALSE; } } return TRUE; } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/win32/resource.h��������������������������������������������������������������0000664�0000764�0000764�00000014555�10545462317�015425� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������//{{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 IDS_APP_TITLE_SHORT 110 #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 IDC_EXTRAINFO 1331 #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 1332 #define _APS_NEXT_SYMED_VALUE 110 #endif #endif ���������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/win32/mhrip.c�����������������������������������������������������������������0000664�0000764�0000764�00000016266�10545462317�014711� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (C) 2001 by Alex Kompel <shurikk@pacbell.net> */ /* 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); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/win32/txtmerge.dsp������������������������������������������������������������0000664�0000764�0000764�00000012077�10545462317�015771� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Microsoft Developer Studio Project File - Name="txtmerge" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=txtmerge - 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 "txtmerge.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 "txtmerge.mak" CFG="txtmerge - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "txtmerge - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "txtmerge - 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)" == "txtmerge - 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\txtmerge.exe" !ELSEIF "$(CFG)" == "txtmerge - 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\txtmerge.exe" /pdbtype:sept !ENDIF # Begin Target # Name "txtmerge - Win32 Release" # Name "txtmerge - 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\txtmerge.c !IF "$(CFG)" == "txtmerge - Win32 Release" !ELSEIF "$(CFG)" == "txtmerge - Win32 Debug" # ADD CPP /D "PACKED_FILE" !ENDIF # End Source File # Begin Source File SOURCE=..\win\share\tiletext.c !IF "$(CFG)" == "txtmerge - Win32 Release" !ELSEIF "$(CFG)" == "txtmerge - 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 �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/win32/mhaskyn.c���������������������������������������������������������������0000664�0000764�0000764�00000000442�10545462317�015231� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (C) 2001 by Alex Kompel <shurikk@pacbell.net> */ /* NetHack may be freely redistributed. See license for details. */ #include <assert.h> #include "winMS.h" #include "mhaskyn.h" int mswin_yes_no_dialog( const char *question, const char *choices, int def) { return '\032'; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/win32/mswproc.c���������������������������������������������������������������0000664�0000764�0000764�00000220564�10545462317�015262� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (C) 2001 by Alex Kompel <shurikk@pacbell.net> */ /* 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 "func_tab.h" /* for extended commands */ #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" #include "resource.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_AMOUNT|WC_SCROLL_MARGIN|WC_MAP_MODE| WC_FONT_MESSAGE|WC_FONT_STATUS|WC_FONT_MENU|WC_FONT_TEXT|WC_FONT_MAP| WC_FONTSIZ_MESSAGE|WC_FONTSIZ_STATUS|WC_FONTSIZ_MENU|WC_FONTSIZ_TEXT| WC_TILE_WIDTH|WC_TILE_HEIGHT|WC_TILE_FILE|WC_VARY_MSGCOUNT| WC_WINDOWCOLORS|WC_PLAYER_SELECTION|WC_SPLASH_SCREEN|WC_POPUP_DIALOG, 0L, 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 */ /* First set safe defaults */ GetNHApp()->regMainMinX = CW_USEDEFAULT; mswin_read_reg(); /* Create the main window */ GetNHApp()->hMainWnd = mswin_init_main_window(); if (!GetNHApp()->hMainWnd) { panic("Cannot create main window"); } /* Set menu check mark for interface mode */ mswin_menu_check_intf_mode(); /* check default values */ if( iflags.wc_fontsiz_status<NHFONT_SIZE_MIN || iflags.wc_fontsiz_status>NHFONT_SIZE_MAX ) iflags.wc_fontsiz_status = NHFONT_DEFAULT_SIZE; if( iflags.wc_fontsiz_message<NHFONT_SIZE_MIN || iflags.wc_fontsiz_message>NHFONT_SIZE_MAX ) iflags.wc_fontsiz_message = NHFONT_DEFAULT_SIZE; if( iflags.wc_fontsiz_text<NHFONT_SIZE_MIN || iflags.wc_fontsiz_text>NHFONT_SIZE_MAX ) iflags.wc_fontsiz_text = NHFONT_DEFAULT_SIZE; if( iflags.wc_fontsiz_menu<NHFONT_SIZE_MIN || iflags.wc_fontsiz_menu>NHFONT_SIZE_MAX ) iflags.wc_fontsiz_menu = NHFONT_DEFAULT_SIZE; if( iflags.wc_align_message==0 ) iflags.wc_align_message = ALIGN_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_scroll_amount==0 ) iflags.wc_scroll_amount = DEF_CLIPAROUND_AMOUNT; 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); set_option_mod_status("perm_invent", 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_AMOUNT | 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(FALSE); 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 = NHMessageBox(NULL, prompt, MB_ICONQUESTION | 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) { MSG msg; logDebug("mswin_get_nh_event()\n"); while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)!=0 ) { if (!TranslateAccelerator(msg.hwnd, GetNHApp()->hAccelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } 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; i<MAXWINDOWS; i++) if (GetNHApp()->windowlist[i].win == NULL && !GetNHApp()->windowlist[i].dead) break; if (i == MAXWINDOWS) panic ("ERROR: No windows available...\n"); switch (type) { case NHW_MAP: { GetNHApp()->windowlist[i].win = mswin_init_map_window(); GetNHApp()->windowlist[i].type = type; GetNHApp()->windowlist[i].dead = 0; break; } case NHW_MESSAGE: { GetNHApp()->windowlist[i].win = mswin_init_message_window(); GetNHApp()->windowlist[i].type = type; GetNHApp()->windowlist[i].dead = 0; break; } case NHW_STATUS: { GetNHApp()->windowlist[i].win = mswin_init_status_window(); GetNHApp()->windowlist[i].type = type; GetNHApp()->windowlist[i].dead = 0; break; } case NHW_MENU: { GetNHApp()->windowlist[i].win = NULL; //will create later GetNHApp()->windowlist[i].type = type; GetNHApp()->windowlist[i].dead = 1; break; } case NHW_TEXT: { GetNHApp()->windowlist[i].win = mswin_init_text_window(); GetNHApp()->windowlist[i].type = type; GetNHApp()->windowlist[i].dead = 0; break; } } ZeroMemory(&data, sizeof(data) ); data.wid = i; SendMessage( GetNHApp()->hMainWnd, WM_MSNH_COMMAND, (WPARAM)MSNH_MSG_ADDWND, (LPARAM)&data ); return i; } /* Clear the given window, when asked to. */ void mswin_clear_nhwindow(winid wid) { logDebug("mswin_clear_nhwindow(%d)\n", wid); if ((wid >= 0) && (wid < MAXWINDOWS) && (GetNHApp()->windowlist[wid].win != NULL)) { #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 && wid<MAXWINDOWS) { return GetNHApp()->windowlist[wid].win; } else { return NULL; } } winid mswin_winid_from_handle(HWND hWnd) { winid i = 0; for (i=1; i<MAXWINDOWS; i++) if (GetNHApp()->windowlist[i].win == hWnd) return i; return -1; } winid mswin_winid_from_type(int type) { winid i = 0; for (i=1; i<MAXWINDOWS; i++) if (GetNHApp()->windowlist[i].type == type) return i; return -1; } void mswin_window_mark_dead(winid wid) { if( wid>=0 && wid<MAXWINDOWS) { GetNHApp()->windowlist[wid].win = NULL; GetNHApp()->windowlist[wid].dead = 1; } } /* Destroy will dismiss the window if the window has not * already been dismissed. */ void mswin_destroy_nhwindow(winid wid) { logDebug("mswin_destroy_nhwindow(%d)\n", wid); if ((GetNHApp()->windowlist[wid].type == NHW_MAP) || (GetNHApp()->windowlist[wid].type == NHW_MESSAGE) || (GetNHApp()->windowlist[wid].type == NHW_STATUS)) { /* main windows is going to take care of those */ return; } if (wid != -1) { if( !GetNHApp()->windowlist[wid].dead && GetNHApp()->windowlist[wid].win != NULL ) DestroyWindow(GetNHApp()->windowlist[wid].win); GetNHApp()->windowlist[wid].win = NULL; GetNHApp()->windowlist[wid].type = 0; GetNHApp()->windowlist[wid].dead = 0; } } /* Next output to window will start at (x,y), also moves displayable cursor to (x,y). For backward compatibility, 1 <= x < cols, 0 <= y < rows, where cols and rows are the size of window. */ void mswin_curs(winid wid, int x, int y) { logDebug("mswin_curs(%d, %d, %d)\n", wid, x, y); if ((wid >= 0) && (wid < MAXWINDOWS) && (GetNHApp()->windowlist[wid].win != NULL)) { MSNHMsgCursor data; data.x = x; data.y = y; SendMessage( GetNHApp()->windowlist[wid].win, WM_MSNH_COMMAND, (WPARAM)MSNH_MSG_CURSOR, (LPARAM)&data ); } } /* putstr(window, attr, str) -- Print str on the window with the given attribute. Only printable ASCII characters (040-0126) must be supported. Multiple putstr()s are output on separate lines. Attributes can be one of ATR_NONE (or 0) ATR_ULINE ATR_BOLD ATR_BLINK ATR_INVERSE If a window-port does not support all of these, it may map unsupported attributes to a supported one (e.g. map them all to ATR_INVERSE). putstr() may compress spaces out of str, break str, or truncate str, if necessary for the display. Where putstr() breaks a line, it has to clear to end-of-line. -- putstr should be implemented such that if two putstr()s are done consecutively the user will see the first and then the second. In the tty port, pline() achieves this by calling more() or displaying both on the same line. */ void mswin_putstr(winid wid, int attr, const char *text) { logDebug("mswin_putstr(%d, %d, %s)\n", wid, attr, text); mswin_putstr_ex(wid, attr, text, 0); } void mswin_putstr_ex(winid wid, int attr, const char *text, int 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 ); } /* yield a bit so it gets done immediately */ mswin_get_nh_event(); } 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))); NHMessageBox(GetNHApp()->hMainWnd, message, MB_OK | MB_ICONEXCLAMATION ); } } else { winid text; char line[LLEN]; text = mswin_create_nhwindow(NHW_TEXT); while (dlb_fgets(line, LLEN, f)) { size_t len; len = strlen(line); if( line[len-1]=='\n' ) line[len-1]='\x0'; mswin_putstr(text, ATR_NONE, line); } (void) dlb_fclose(f); mswin_display_nhwindow(text, 1); mswin_destroy_nhwindow(text); } } /* Start using window as a menu. You must call start_menu() before add_menu(). After calling start_menu() you may not putstr() to the window. Only windows of type NHW_MENU may be used for menus. */ void mswin_start_menu(winid wid) { logDebug("mswin_start_menu(%d)\n", wid); if( (wid >= 0) && (wid < MAXWINDOWS) ) { if( GetNHApp()->windowlist[wid].win==NULL && GetNHApp()->windowlist[wid].type==NHW_MENU ) { GetNHApp()->windowlist[wid].win = mswin_init_menu_window(MENU_TYPE_MENU); GetNHApp()->windowlist[wid].dead = 0; } if(GetNHApp()->windowlist[wid].win != NULL) { SendMessage( GetNHApp()->windowlist[wid].win, WM_MSNH_COMMAND, (WPARAM)MSNH_MSG_STARTMENU, (LPARAM)NULL ); } } } /* add_menu(windid window, int glyph, const anything identifier, char accelerator, char groupacc, int attr, char *str, boolean preselected) -- Add a text line str to the given menu window. If identifier is 0, then the line cannot be selected (e.g. a title). Otherwise, identifier is the value returned if the line is selected. Accelerator is a keyboard key that can be used to select the line. If the accelerator of a selectable item is 0, the window system is free to select its own accelerator. It is up to the window-port to make the accelerator visible to the user (e.g. put "a - " in front of str). The value attr is the same as in putstr(). Glyph is an optional glyph to accompany the line. If window port cannot or does not want to display it, this is OK. If there is no glyph applicable, then this value will be NO_GLYPH. -- All accelerators should be in the range [A-Za-z]. -- It is expected that callers do not mix accelerator choices. Either all selectable items have an accelerator or let the window system pick them. Don't do both. -- Groupacc is a group accelerator. It may be any character outside of the standard accelerator (see above) or a number. If 0, the item is unaffected by any group accelerator. If this accelerator conflicts with the menu command (or their user defined 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 ) NHMessageBox(GetNHApp()->hMainWnd, NH_A2W(str, wbuf, sizeof(wbuf)), MB_ICONINFORMATION | 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 ) NHMessageBox(GetNHApp()->hMainWnd, NH_A2W(str, wbuf, sizeof(wbuf)), MB_ICONINFORMATION | MB_OK ); } /* int nhgetch() -- Returns a single character input from the user. -- In the tty window-port, nhgetch() assumes that tgetch() will be the routine the OS provides to read a character. Returned character _must_ be non-zero. */ int mswin_nhgetch() { PMSNHEvent event; int key = 0; logDebug("mswin_nhgetch()\n"); while( (event = mswin_input_pop()) == NULL || event->type != NHEVENT_CHAR ) mswin_main_loop(); key = event->kbd.ch; return (key); } /* int nh_poskey(int *x, int *y, int *mod) -- Returns a single character input from the user or a a positioning event (perhaps from a mouse). If the return value is non-zero, a character was typed, else, a position in the MAP window is returned in x, y and mod. mod may be one of CLICK_1 -- mouse click type 1 CLICK_2 -- mouse click type 2 The different click types can map to whatever the hardware supports. If no mouse is supported, this routine always returns a non-zero character. */ int mswin_nh_poskey(int *x, int *y, int *mod) { PMSNHEvent event; int key; logDebug("mswin_nh_poskey()\n"); while( (event = mswin_input_pop())==NULL ) mswin_main_loop(); if( event->type==NHEVENT_MOUSE ) { *mod = event->ms.mod; *x = event->ms.x; *y = event->ms.y; key = 0; } else { key = event->kbd.ch; } return (key); } /* nhbell() -- Beep at user. [This will exist at least until sounds are redone, since sounds aren't attributable to windows anyway.] */ void mswin_nhbell() { logDebug("mswin_nhbell()\n"); } /* doprev_message() -- Display previous messages. Used by the ^P command. -- On the tty-port this scrolls WIN_MESSAGE back one line. */ int mswin_doprev_message() { logDebug("mswin_doprev_message()\n"); SendMessage(mswin_hwnd_from_winid(WIN_MESSAGE), WM_VSCROLL, MAKEWPARAM(SB_LINEUP, 0), (LPARAM)NULL); return 0; } /* char yn_function(const char *ques, const char *choices, char default) -- Print a prompt made up of ques, choices and default. Read a single character response that is contained in choices or default. If choices is NULL, all possible inputs are accepted and returned. This overrides everything else. The choices are expected to be in lower case. Entering ESC always maps to 'q', or 'n', in that order, if present in choices, otherwise it maps to default. Entering any other quit character (SPACE, RETURN, NEWLINE) maps to default. -- If the choices string contains ESC, then anything after it is an acceptable response, but the ESC and whatever follows is not included in the prompt. -- If the choices string contains a '#' then accept a count. Place this value in the global "yn_number" and return '#'. -- This uses the top line in the tty window-port, other ports might use a popup. */ char mswin_yn_function(const char *question, const char *choices, CHAR_P def) { char ch; char yn_esc_map='\033'; char message[BUFSZ]; char res_ch[2]; int createcaret; boolean digit_ok, allow_num; 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 = NHMessageBox(NULL, NH_W2A(text, message, sizeof(message)), MB_YESNOCANCEL | MB_ICONQUESTION | ((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]; allow_num = (index(choices, '#') != 0); Strcpy(choicebuf, choices); if ((cb = index(choicebuf, '\033')) != 0) { /* anything beyond <esc> 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, " "); } createcaret = 1; SendMessage(mswin_hwnd_from_winid(WIN_MESSAGE), WM_MSNH_COMMAND, (WPARAM)MSNH_MSG_CARET, (LPARAM)&createcaret ); mswin_clear_nhwindow(WIN_MESSAGE); mswin_putstr(WIN_MESSAGE, ATR_BOLD, message); /* Only here if main window is not present */ ch = 0; do { ShowCaret(mswin_hwnd_from_winid(WIN_MESSAGE)); ch=mswin_nhgetch(); HideCaret(mswin_hwnd_from_winid(WIN_MESSAGE)); if (choices) ch = lowc(ch); else break; /* If choices is NULL, all possible inputs are accepted and returned. */ digit_ok = allow_num && digit(ch); if (ch=='\033') { if (index(choices, 'q')) ch = 'q'; else if (index(choices, 'n')) ch = 'n'; else ch = def; break; } else if (index(quitchars, ch)) { ch = def; break; } else if (!index(choices, ch) && !digit_ok) { mswin_nhbell(); ch = (char)0; /* and try again... */ } else if (ch == '#' || digit_ok) { char z, digit_string[2]; int n_len = 0; long value = 0; mswin_putstr_ex(WIN_MESSAGE, ATR_BOLD, ("#"), 1); n_len++; digit_string[1] = '\0'; if (ch != '#') { digit_string[0] = ch; mswin_putstr_ex(WIN_MESSAGE, ATR_BOLD, digit_string, 1); n_len++; value = ch - '0'; ch = '#'; } do { /* loop until we get a non-digit */ z = lowc(readchar()); if (digit(z)) { value = (10 * value) + (z - '0'); if (value < 0) break; /* overflow: try again */ digit_string[0] = z; mswin_putstr_ex(WIN_MESSAGE, ATR_BOLD, digit_string, 1); n_len++; } else if (z == 'y' || index(quitchars, z)) { if (z == '\033') value = -1; /* abort */ z = '\n'; /* break */ } else if (z == '\b') { if (n_len <= 1) { value = -1; break; } else { value /= 10; mswin_putstr_ex(WIN_MESSAGE, ATR_BOLD, digit_string, -1); n_len--; } } else { value = -1; /* abort */ mswin_nhbell(); break; } } while (z != '\n'); if (value > 0) yn_number = value; else if (value == 0) ch = 'n'; /* 0 => "no" */ else { /* remove number from top line, then try again */ mswin_putstr_ex(WIN_MESSAGE, ATR_BOLD, digit_string, -n_len); n_len = 0; ch = (char)0; } } } while( !ch ); createcaret = 0; SendMessage(mswin_hwnd_from_winid(WIN_MESSAGE), WM_MSNH_COMMAND, (WPARAM)MSNH_MSG_CARET, (LPARAM)&createcaret ); /* display selection in the message window */ if( isprint(ch) && ch!='#' ) { res_ch[0] = ch; res_ch[1] = '\x0'; mswin_putstr_ex(WIN_MESSAGE, ATR_BOLD, res_ch, 1); } return ch; } /* 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 (!iflags.wc_popup_dialog) { char c; int len; int done; int createcaret; createcaret = 1; SendMessage(mswin_hwnd_from_winid(WIN_MESSAGE), WM_MSNH_COMMAND, (WPARAM)MSNH_MSG_CARET, (LPARAM)&createcaret ); mswin_clear_nhwindow(WIN_MESSAGE); mswin_putstr_ex(WIN_MESSAGE, ATR_BOLD, question, 0); mswin_putstr_ex(WIN_MESSAGE, ATR_BOLD, " ", 1); input[0] = '\0'; len = 0; ShowCaret(mswin_hwnd_from_winid(WIN_MESSAGE)); done = FALSE; while (!done) { c = mswin_nhgetch(); switch (c) { case VK_ESCAPE: strcpy(input, "\033"); done = TRUE; break; case '\n': case '\r': case -115: done = TRUE; break; default: if (input[0]) mswin_putstr_ex(WIN_MESSAGE, ATR_NONE, input, -len); if (c == VK_BACK) { if (len > 0) len--; input[len] = '\0'; } else { input[len++] = c; input[len] = '\0'; } mswin_putstr_ex(WIN_MESSAGE, ATR_NONE, input, 1); break; } } HideCaret(mswin_hwnd_from_winid(WIN_MESSAGE)); createcaret = 0; SendMessage(mswin_hwnd_from_winid(WIN_MESSAGE), WM_MSNH_COMMAND, (WPARAM)MSNH_MSG_CARET, (LPARAM)&createcaret ); } else { 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 (!iflags.wc_popup_dialog) { char c; char cmd[BUFSZ]; int i, len; int createcaret; createcaret = 1; SendMessage(mswin_hwnd_from_winid(WIN_MESSAGE), WM_MSNH_COMMAND, (WPARAM)MSNH_MSG_CARET, (LPARAM)&createcaret ); cmd[0] = '\0'; i = -2; mswin_clear_nhwindow(WIN_MESSAGE); mswin_putstr_ex(WIN_MESSAGE, ATR_BOLD, "#", 0); len = 0; ShowCaret(mswin_hwnd_from_winid(WIN_MESSAGE)); while (i == -2) { int oindex, com_index; c = mswin_nhgetch(); switch (c) { case VK_ESCAPE: i = -1; break; case '\n': case '\r': case -115: for (i = 0; extcmdlist[i].ef_txt != (char *)0; i++) if (!strcmpi(cmd, extcmdlist[i].ef_txt)) break; if (extcmdlist[i].ef_txt == (char *)0) { pline("%s: unknown extended command.", cmd); i = -1; } break; default: if (cmd[0]) mswin_putstr_ex(WIN_MESSAGE, ATR_BOLD, cmd, -(int)strlen(cmd)); if (c == VK_BACK) { if (len > 0) len--; cmd[len] = '\0'; } else { cmd[len++] = c; cmd[len] = '\0'; /* Find a command with this prefix in extcmdlist */ com_index = -1; for (oindex = 0; extcmdlist[oindex].ef_txt != (char *)0; oindex++) { if (!strncmpi(cmd, extcmdlist[oindex].ef_txt, len)) { if (com_index == -1) /* no matches yet */ com_index = oindex; else com_index = -2; /* two matches, don't complete */ } } if (com_index >= 0) { Strcpy(cmd, extcmdlist[com_index].ef_txt); } } mswin_putstr_ex(WIN_MESSAGE, ATR_BOLD, cmd, 1); break; } } HideCaret(mswin_hwnd_from_winid(WIN_MESSAGE)); createcaret = 0; SendMessage(mswin_hwnd_from_winid(WIN_MESSAGE), WM_MSNH_COMMAND, (WPARAM)MSNH_MSG_CARET, (LPARAM)&createcaret ); return i; } else { 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_menu<NHFONT_SIZE_MIN || iflags.wc_fontsiz_menu>NHFONT_SIZE_MAX ) iflags.wc_fontsiz_menu = NHFONT_DEFAULT_SIZE; hdc = GetDC(GetNHApp()->hMainWnd); mswin_get_font(NHW_MENU, ATR_NONE, hdc, TRUE); mswin_get_font(NHW_MENU, ATR_BOLD, hdc, TRUE); mswin_get_font(NHW_MENU, ATR_DIM, hdc, TRUE); mswin_get_font(NHW_MENU, ATR_ULINE, hdc, TRUE); mswin_get_font(NHW_MENU, ATR_BLINK, hdc, TRUE); mswin_get_font(NHW_MENU, ATR_INVERSE, hdc, TRUE); ReleaseDC(GetNHApp()->hMainWnd, hdc); mswin_layout_main_window(NULL); return; } if( stricmp( pref, "font_status")==0 || stricmp( pref, "font_size_status")==0 ) { if( iflags.wc_fontsiz_status<NHFONT_SIZE_MIN || iflags.wc_fontsiz_status>NHFONT_SIZE_MAX ) iflags.wc_fontsiz_status = NHFONT_DEFAULT_SIZE; hdc = GetDC(GetNHApp()->hMainWnd); mswin_get_font(NHW_STATUS, ATR_NONE, hdc, TRUE); mswin_get_font(NHW_STATUS, ATR_BOLD, hdc, TRUE); mswin_get_font(NHW_STATUS, ATR_DIM, hdc, TRUE); mswin_get_font(NHW_STATUS, ATR_ULINE, hdc, TRUE); mswin_get_font(NHW_STATUS, ATR_BLINK, hdc, TRUE); mswin_get_font(NHW_STATUS, ATR_INVERSE, hdc, TRUE); ReleaseDC(GetNHApp()->hMainWnd, hdc); InvalidateRect(mswin_hwnd_from_winid(WIN_STATUS), NULL, TRUE); mswin_layout_main_window(NULL); return; } if( stricmp( pref, "font_message")==0 || stricmp( pref, "font_size_message")==0 ) { if( iflags.wc_fontsiz_message<NHFONT_SIZE_MIN || iflags.wc_fontsiz_message>NHFONT_SIZE_MAX ) iflags.wc_fontsiz_message = NHFONT_DEFAULT_SIZE; hdc = GetDC(GetNHApp()->hMainWnd); mswin_get_font(NHW_MESSAGE, ATR_NONE, hdc, TRUE); mswin_get_font(NHW_MESSAGE, ATR_BOLD, hdc, TRUE); mswin_get_font(NHW_MESSAGE, ATR_DIM, hdc, TRUE); mswin_get_font(NHW_MESSAGE, ATR_ULINE, hdc, TRUE); mswin_get_font(NHW_MESSAGE, ATR_BLINK, hdc, TRUE); mswin_get_font(NHW_MESSAGE, ATR_INVERSE, hdc, TRUE); ReleaseDC(GetNHApp()->hMainWnd, hdc); InvalidateRect(mswin_hwnd_from_winid(WIN_MESSAGE), NULL, TRUE); mswin_layout_main_window(NULL); return; } if( stricmp( pref, "font_text")==0 || stricmp( pref, "font_size_text")==0 ) { if( iflags.wc_fontsiz_text<NHFONT_SIZE_MIN || iflags.wc_fontsiz_text>NHFONT_SIZE_MAX ) iflags.wc_fontsiz_text = NHFONT_DEFAULT_SIZE; hdc = GetDC(GetNHApp()->hMainWnd); mswin_get_font(NHW_TEXT, ATR_NONE, hdc, TRUE); mswin_get_font(NHW_TEXT, ATR_BOLD, hdc, TRUE); mswin_get_font(NHW_TEXT, ATR_DIM, hdc, TRUE); mswin_get_font(NHW_TEXT, ATR_ULINE, hdc, TRUE); mswin_get_font(NHW_TEXT, ATR_BLINK, hdc, TRUE); mswin_get_font(NHW_TEXT, ATR_INVERSE, hdc, TRUE); ReleaseDC(GetNHApp()->hMainWnd, hdc); mswin_layout_main_window(NULL); return; } if( stricmp( pref, "scroll_amount")==0 ) { mswin_cliparound(u.ux, u.uy); 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_num<total_tiles_used ) { DeleteObject(hBmp); raw_print("Number of tiles in the bitmap is less than required by the game. Reverting back to default."); return FALSE; } /* set the tile information */ if( GetNHApp()->bmpMapTiles!=GetNHApp()->bmpTiles ) { DeleteObject(GetNHApp()->bmpMapTiles); } GetNHApp()->bmpMapTiles = hBmp; GetNHApp()->mapTile_X = iflags.wc_tile_width; GetNHApp()->mapTile_Y = iflags.wc_tile_height; GetNHApp()->mapTilesPerLine = bm.bmWidth / iflags.wc_tile_width; map_size.cx = GetNHApp()->mapTile_X * COLNO; map_size.cy = GetNHApp()->mapTile_Y * ROWNO; mswin_map_stretch( mswin_hwnd_from_winid(WIN_MAP), &map_size, TRUE ); return TRUE; } void mswin_popup_display(HWND hWnd, int* done_indicator) { MSG msg; HWND hChild; HMENU hMenu; int mi_count; int i; /* activate the menu window */ GetNHApp()->hPopupWnd = hWnd; mswin_layout_main_window(hWnd); /* disable game windows */ for( hChild=GetWindow(GetNHApp()->hMainWnd, GW_CHILD); hChild; hChild = GetWindow(hChild, GW_HWNDNEXT) ) { if( hChild!= hWnd) EnableWindow(hChild, FALSE); } /* disable menu */ hMenu = GetMenu( GetNHApp()->hMainWnd ); mi_count = GetMenuItemCount( hMenu ); for( i=0; i<mi_count; i++ ) { EnableMenuItem(hMenu, i, MF_BYPOSITION | MF_GRAYED); } DrawMenuBar( GetNHApp()->hMainWnd ); /* 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) && (done_indicator==NULL || !*done_indicator) && GetMessage(&msg, NULL, 0, 0)!=0 ) { if( !IsDialogMessage(hWnd, &msg) ) { if (!TranslateAccelerator(msg.hwnd, GetNHApp()->hAccelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } } } void mswin_popup_destroy(HWND hWnd) { HWND hChild; HMENU hMenu; int mi_count; int i; /* enable game windows */ for( hChild=GetWindow(GetNHApp()->hMainWnd, GW_CHILD); hChild; hChild = GetWindow(hChild, GW_HWNDNEXT) ) { if( hChild!= hWnd) { EnableWindow(hChild, TRUE); } } /* enable menu */ hMenu = GetMenu( GetNHApp()->hMainWnd ); mi_count = GetMenuItemCount( hMenu ); for( i=0; i<mi_count; i++ ) { EnableMenuItem(hMenu, i, MF_BYPOSITION | MF_ENABLED); } DrawMenuBar( GetNHApp()->hMainWnd ); 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 ); } #ifdef _DEBUG #include <stdarg.h> 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.3" #define SETTINGSKEY "Settings" #define MAINSHOWSTATEKEY "MainShowState" #define MAINMINXKEY "MainMinX" #define MAINMINYKEY "MainMinY" #define MAINMAXXKEY "MainMaxX" #define MAINMAXYKEY "MainMaxY" #define MAINLEFTKEY "MainLeft" #define MAINRIGHTKEY "MainRight" #define MAINTOPKEY "MainTop" #define MAINBOTTOMKEY "MainBottom" /* #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; size = sizeof(DWORD); /* Read the keys here. */ RegQueryValueEx(key, INTFKEY, 0, NULL, (unsigned char *)(&(GetNHApp()->regNetHackMode)), &size); /* Main window placement */ RegQueryValueEx(key, MAINSHOWSTATEKEY, 0, NULL, (unsigned char *)(&(GetNHApp()->regMainShowState)), &size); RegQueryValueEx(key, MAINMINXKEY, 0, NULL, (unsigned char *)(&(GetNHApp()->regMainMinX)), &size); RegQueryValueEx(key, MAINMINYKEY, 0, NULL, (unsigned char *)(&(GetNHApp()->regMainMinY)), &size); RegQueryValueEx(key, MAINMAXXKEY, 0, NULL, (unsigned char *)(&(GetNHApp()->regMainMaxX)), &size); RegQueryValueEx(key, MAINMAXYKEY, 0, NULL, (unsigned char *)(&(GetNHApp()->regMainMaxY)), &size); RegQueryValueEx(key, MAINLEFTKEY, 0, NULL, (unsigned char *)(&(GetNHApp()->regMainLeft)), &size); RegQueryValueEx(key, MAINRIGHTKEY, 0, NULL, (unsigned char *)(&(GetNHApp()->regMainRight)), &size); RegQueryValueEx(key, MAINTOPKEY, 0, NULL, (unsigned char *)(&(GetNHApp()->regMainTop)), &size); RegQueryValueEx(key, MAINBOTTOMKEY, 0, NULL, (unsigned char *)(&(GetNHApp()->regMainBottom)), &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)); /* Main window placement */ RegSetValueEx(key, MAINSHOWSTATEKEY, 0, REG_DWORD, (unsigned char *)(&(GetNHApp()->regMainShowState)), sizeof(DWORD)); RegSetValueEx(key, MAINMINXKEY, 0, REG_DWORD, (unsigned char *)(&(GetNHApp()->regMainMinX)), sizeof(DWORD)); RegSetValueEx(key, MAINMINYKEY, 0, REG_DWORD, (unsigned char *)(&(GetNHApp()->regMainMinY)), sizeof(DWORD)); RegSetValueEx(key, MAINMAXXKEY, 0, REG_DWORD, (unsigned char *)(&(GetNHApp()->regMainMaxX)), sizeof(DWORD)); RegSetValueEx(key, MAINMAXYKEY, 0, REG_DWORD, (unsigned char *)(&(GetNHApp()->regMainMaxY)), sizeof(DWORD)); RegSetValueEx(key, MAINLEFTKEY, 0, REG_DWORD, (unsigned char *)(&(GetNHApp()->regMainLeft)), sizeof(DWORD)); RegSetValueEx(key, MAINRIGHTKEY, 0, REG_DWORD, (unsigned char *)(&(GetNHApp()->regMainRight)), sizeof(DWORD)); RegSetValueEx(key, MAINTOPKEY, 0, REG_DWORD, (unsigned char *)(&(GetNHApp()->regMainTop)), sizeof(DWORD)); RegSetValueEx(key, MAINBOTTOMKEY, 0, REG_DWORD, (unsigned char *)(&(GetNHApp()->regMainBottom)), 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, green_value, blue_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; } int NHMessageBox(HWND hWnd, LPCTSTR text, UINT type) { TCHAR title[MAX_LOADSTRING]; LoadString(GetNHApp()->hApp, IDS_APP_TITLE_SHORT, title, MAX_LOADSTRING); return MessageBox(hWnd, text, title, type); } ��������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/win32/nhprocs.c���������������������������������������������������������������0000664�0000764�0000764�00000067154�10545462317�015250� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* SCCS Id: @(#)nhprocs.c 3.2 96/02/02 */ /* Copyright (c) NetHack Windows Porting Team 1995 */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" #ifdef WIN32_GRAPHICS # ifndef NO_SIGNAL #include <signal.h> # endif #include <ctype.h> #include <sys\stat.h> #include "win32api.h" #include "nhwin32.h" #define DEBUG /* * Interface definition, for windows.c */ struct window_procs win32_procs = { "win32", win32_init_nhwindows, win32_player_selection, win32_askname, win32_get_nh_event, win32_exit_nhwindows, win32_suspend_nhwindows, win32_resume_nhwindows, win32_create_nhwindow, win32_clear_nhwindow, win32_display_nhwindow, win32_destroy_nhwindow, win32_curs, win32_putstr, win32_display_file, win32_start_menu, win32_add_menu, win32_end_menu, win32_select_menu, genl_message_menu, win32_update_inventory, win32_mark_synch, win32_wait_synch, #ifdef CLIPPING win32_cliparound, #endif #ifdef POSITIONBAR donull, #endif win32_print_glyph, win32_raw_print, win32_raw_print_bold, win32_nhgetch, win32_nh_poskey, win32_nhbell, win32_doprev_message, win32_yn_function, win32_getlin, win32_get_ext_cmd, win32_number_pad, win32_delay_output, /* other defs that really should go away (they're tty specific) */ win32_start_screen, win32_end_screen, genl_outrip, }; /* Local functions */ static void win32_putsym(winid, int, int, int, unsigned char, boolean); static int has_color(int color); static int key_from_buf(); static HANDLE new_dialog(); static void deferred_init(winid, int); struct win32_WinDesc *wins[MAXWIN]; struct win32_DisplayDesc *win32Display; /* the win32 display descriptor */ winid WIN_BASE; static int maxwin = 0; /* number of windows in use */ static char winpanicstr[] = "Bad window id %d"; # ifdef CLIPPING static boolean clipping = FALSE; /* clipping on? */ static int clipx = 0, clipy = 0, clipxmax = 0, clipymax = 0; # endif #define PICK_PROMPT "Shall I pick a character for you? [Y, N, or Q(quit)] " static char to_continue[] = "to continue"; winid window; int x, y; int color; unsigned char ch; #ifdef DEBUG_FULL static char debugbuf[256]; #endif void win32_init_nhwindows(argcp, argv) int *argcp; char **argv; { int status; static FARPROC pfnNameDialog; hDefFnt = GetStockObject(OEM_FIXED_FONT); if (!hDefFnt) hDefFnt = GetStockObject(SYSTEM_FIXED_FONT); WIN_BASE = win32_create_nhwindow(NHW_BASE); pfnNameDialog = MakeProcInstance(CopyrightProc, wcNetHack.hInstance); DialogBox(wcNetHack.hInstance,"HACK_COPYRIGHT",BasehWnd, pfnNameDialog); status = InitTextWindow(); status = InitPopupWindow(); status = InitListboxWindow(); ShowWindow(BasehWnd,SW_SHOWDEFAULT); UpdateWindow(BasehWnd); pchBuf = (char *)alloc(RINGBUFSIZE); /* allocate the input buffer */ pchGet = pchBuf; pchPut = pchBuf; pchCount = 0; return; } void win32_player_selection() { char pc; if ((pc = highc(pl_character[0])) != 0) { if (index(pl_classes, pc) != (char *)0) { pl_character[0] = pc; return; } } DialogBox(wcNetHack.hInstance,"CHAR_SEL_DIALOG",BasehWnd, (DLGPROC)PlayerSelectProc); return; } /* * plname is filled either by an option (-u Player or -uPlayer) or * explicitly (by being the wizard) or by askname. * It may still contain a suffix denoting pl_character. * Always called after init_nhwindows() and before display_gamewindows(). */ void win32_askname() { input_text_size = 0; while (input_text_size == 0) { DialogBox(wcNetHack.hInstance,"ASK_NAME_DIAL",BasehWnd, (DLGPROC)AskNameProc); } strncpy(plname, input_text, input_text_size); *(plname + input_text_size) = '\0'; return; } void win32_get_nh_event() { MSG lpMsg; if (PeekMessage(&lpMsg,0,0,0,PM_REMOVE)) { /* if (msg.message == WM_QUIT) */ TranslateMessage(&lpMsg); DispatchMessage(&lpMsg); } } void win32_suspend_nhwindows(str) const char *str; { } void win32_resume_nhwindows() { } void win32_exit_nhwindows(str) const char *str; { } winid win32_create_nhwindow(type) int type; { RECT rcClient; struct win32_WinDesc *newwin; winid newid; char WindowName[80]; int status; int msize = 0; int i; /* allocate the Window Descriptor */ newwin = (struct win32_WinDesc *)alloc(sizeof(struct win32_WinDesc)); memset(newwin,0,sizeof(struct win32_WinDesc)); newwin->type = TYPE_INVALID; /* Get an unused Window ID number */ for(newid = 0; newid < MAXWIN; newid++) { if(wins[newid] == 0) { wins[newid] = newwin; break; } } if (newid == MAXWIN) { panic("No free window slots!"); return WIN_ERR; } newwin->WindowWidth = 0; newwin->WindowHeight = 0; newwin->dwCharX = DefCharWidth; newwin->dwCharY = DefCharHeight; newwin->morestr = (char *)0; /* Build the appropriate type of Win32 Window */ switch(type) { case NHW_BASE: InitBaseWindow(); newwin->hWnd = BasehWnd; newwin->type = NHW_BASE; newwin->wflags = 0L; newwin->BackGroundColor = colormap[CLR_BLACK]; newwin->NormalTextColor = colormap[CLR_GRAY]; break; case NHW_MESSAGE: strcpy(WindowName,"NetHack Message Window"); newwin->hWnd=CreateWindowEx( 0, NHTextClassName, WindowName, WS_CHILD|WS_VISIBLE #if 0 |WS_BORDER|WS_VSCROLL, #endif |WS_BORDER, 0,0, newwin->WindowWidth, newwin->WindowHeight, BasehWnd,(HMENU)(int)newid, wcNetHack.hInstance, (LPSTR)0); if (!newwin->hWnd) status = GetLastError(); newwin->type = NHW_MESSAGE; newwin->wflags = 0L; newwin->maxrows = 5; newwin->maxcols = COLNO; newwin->BackGroundColor = colormap[CLR_BLACK]; newwin->NormalTextColor = colormap[CLR_GRAY]; newwin->cursy = 0; newwin->cursx = 0; break; case NHW_STATUS: strcpy(WindowName,"NetHack Status Window"); newwin->hWnd=CreateWindowEx( 0, NHTextClassName, WindowName, WS_CHILD|WS_VISIBLE|WS_BORDER, 0,0, newwin->WindowWidth, newwin->WindowHeight, BasehWnd,(HMENU)(int)newid, wcNetHack.hInstance, (LPSTR)0); if (!newwin->hWnd) status = GetLastError(); newwin->type = NHW_STATUS; newwin->wflags = 0L; newwin->maxrows = 2; newwin->maxcols = COLNO; newwin->cursy = 0; newwin->cursx = 0; newwin->BackGroundColor = colormap[CLR_BLACK]; newwin->NormalTextColor = colormap[CLR_GRAY]; break; case NHW_MAP: strcpy(WindowName,"NetHack Map Window"); newwin->hWnd=CreateWindowEx( 0, NHTextClassName, WindowName, WS_CHILD|WS_VISIBLE|WS_BORDER, 0,0, newwin->WindowWidth, newwin->WindowHeight, BasehWnd,(HMENU)(int)newid, wcNetHack.hInstance, (LPSTR)0); if (!newwin->hWnd) status = GetLastError(); newwin->type = NHW_MAP; newwin->wflags = 0; newwin->maxrows = ROWNO; newwin->maxcols = COLNO; #if 0 newwin->BackGroundColor = RGB(80,80,80); newwin->NormalTextColor = RGB(175,175,175); #endif newwin->BackGroundColor = colormap[CLR_BLACK]; newwin->NormalTextColor = colormap[CLR_GRAY]; if (tiles_on) newwin->wflags |= WFLAGS_TILED; break; case NHW_TEXT: case NHW_MENU: /* This will be a menu or text window * The first call to place something into * it is what determines the type, so all * we can do for now is allocate the structure * and flag that the type has not been * determined yet. The window will actually * be created later, after type determination. */ newwin->type = TYPE_UNDETERMINED; newwin->BackGroundColor = colormap[CLR_BLACK]; newwin->NormalTextColor = colormap[CLR_GRAY]; newwin->extra = newid; newwin->widest = 0; newwin->wflags = 0L; newwin->morestr = "--more--"; break; } if ((newwin->type != TYPE_UNDETERMINED) && ((newwin == (struct win32_WinDesc *)0) || (!newwin->hWnd))) { panic("Win32 Window creation failure!"); return WIN_ERR; } #if 0 ShowWindow(newwin->hWnd,SW_SHOWDEFAULT); UpdateWindow(newwin->hWnd); #endif if (newwin->type != TYPE_UNDETERMINED) { msize = newwin->maxrows * newwin->maxcols; newwin->data = (uchar *)alloc(msize * sizeof(uchar)); if (newwin->wflags & WFLAGS_TILED) newwin->glyph = (int *)alloc(msize * sizeof(int)); memset(newwin->data,' ',msize * sizeof(uchar)); newwin->color = (int *)alloc(msize * sizeof(int)); for (i = 0; i < msize; ++i) *(newwin->color + i) = newwin->NormalTextColor; newwin->hFnt = hDefFnt; if (newid == 3) { /* the last of the default windows */ GetClientRect(BasehWnd, &rcClient); EnumChildWindows(BasehWnd, EnumChildProc,(LPARAM)&rcClient); } newwin->active = TRUE; } return newid; } void win32_clear_nhwindow(window) winid window; { int i; int msize; if (window != NHW_MESSAGE) { msize = wins[window]->maxrows * wins[window]->maxcols; memset(wins[window]->data,' ',msize * sizeof(uchar)); for (i = 0; i < msize ; ++i) *(wins[window]->color + i) = wins[window]->BackGroundColor; } else { /* gray old messages out */ msize = (wins[window]->maxrows) * wins[window]->maxcols; for (i = 0; i < msize ; ++i) *(wins[window]->color + i) = RGB(140,140,140); } InvalidateRect(wins[window]->hWnd, (RECT *)0, FALSE); } /*ARGSUSED*/ void win32_display_nhwindow(window, blocking) winid window; boolean blocking; { if (window == WIN_MESSAGE) iflags.window_inited = TRUE; if (blocking && wins[window]->morestr) win32_putstr(window, 1, wins[window]->morestr); if (wins[window]->type == NHW_TEXT && !wins[window]->active) { deferred_init(window, 2); } ShowWindow(wins[window]->hWnd,SW_SHOWNORMAL); if (blocking) { win32_nhgetch(); } } void win32_destroy_nhwindow(window) winid window; { int i; int stat; if (wins[window]->type == NHW_MENU) { for (i = 0; i < MenuCount[window]; ++i) { if (MenuPtr[window][i]) { if (MenuPtr[window][i]->str) free((genericptr_t)MenuPtr[window][i]->str); free((genericptr_t)MenuPtr[window][i]); MenuPtr[window][i] = (struct win32_menuitem *)0; } } MenuCount[window] = 0; --MenuWindowCount; } if (wins[window]->hWnd != 0) { stat = DestroyWindow(wins[window]->hWnd); } if (wins[window]) free(wins[window]); else impossible("attempt to free wins[window] = 0 [%d]", window); wins[window] = 0; } void win32_curs(window, col, row) winid window; register int col, row; /* not xchar: perhaps xchar is unsigned and curx-x would be unsigned as well */ { wins[window]->cursx = col; wins[window]->cursy = row; wins[window]->nCaretPosX = col * wins[window]->dwCharX; wins[window]->nCaretPosY = row * wins[window]->dwCharY; SetCaretPos(wins[window]->nCaretPosX,wins[window]->nCaretPosY); } static void win32_putsym(window, col, row, rgbcolor, ch, flushflag) winid window; int col, row; int rgbcolor; unsigned char ch; boolean flushflag; { RECT rect; /* char tch[2]="X"; */ int offset; uchar *pch; int *pcolor; offset = (row * wins[window]->maxcols) + col; pch = wins[window]->data + offset; pcolor = wins[window]->color + offset; *pch = ch; *pcolor = rgbcolor; if (flushflag) { /* signal to windows that the display is outdated */ rect.left = col * DefCharWidth; rect.top = row * DefCharHeight; rect.right = col * DefCharWidth + DefCharWidth; rect.bottom = row * DefCharHeight + DefCharHeight; InvalidateRect(wins[window]->hWnd, &rect, FALSE); } } void win32_putstr(window, attr, str) winid window; int attr; const char *str; { int i, j; RECT rect; int cnt,start; char *tmp; int offset; uchar *pch; int *pcolor; if (wins[window]->type == TYPE_UNDETERMINED) { /* Okay, now we know...its destined to be a text window */ deferred_init(window, 1); } switch(wins[window]->type) { case NHW_MESSAGE: tmp = (char *)alloc(strlen(str)+1); Strcpy(toplines, str); /* for Norep() */ Strcpy(tmp, str); if (MessageCount >= MAX_MESSAGE_COUNT) { free((genericptr_t)MessagePtr[0]); for (i = 0; i < (MessageCount - 1); ++i) { MessagePtr[i] = MessagePtr[i + 1]; } MessagePtr[MessageCount - 1] = tmp; } else { MessagePtr[MessageCount++] = tmp; } /* clear out old data */ i = wins[window]->maxrows * wins[window]->maxcols; memset(wins[window]->data,' ',i * sizeof(uchar)); /* add the new data */ for (i = 0; i < MessageCount; ++i) { offset = (i * wins[window]->maxcols); pch = wins[window]->data + offset; pcolor = wins[window]->color + offset; if (i == MessageCount - 1) { for (j = 0; j < wins[window]->maxcols; ++j) *(wins[window]->color + (offset + j)) = RGB(200,200,200); } memcpy(pch, MessagePtr[i], strlen(MessagePtr[i])); } InvalidateRect(wins[window]->hWnd, (RECT *)0, FALSE); break; case NHW_MENU: impossible("putstr to a menu window (%d)", window); break; case NHW_STATUS: for (cnt=0; cnt < strlen(str); ++cnt) { win32_putsym(window,wins[window]->cursx++,wins[window]->cursy, wins[window]->NormalTextColor,*(str + cnt), TRUE); } break; case NHW_TEXT: /* fall through */ default: if (strlen(str) > wins[window]->widest) { wins[window]->widest = strlen(str); } for (cnt=0; cnt < (int)strlen(str); ++cnt) { win32_putsym(window,wins[window]->cursx++,wins[window]->cursy, wins[window]->NormalTextColor,*(str + cnt), FALSE); } win32_curs(window,0,wins[window]->cursy+1); } } void #ifdef FILE_AREAS win32_display_file(farea, fname, complain) const char *farea; #else win32_display_file(fname, complain) #endif const char *fname; boolean complain; { } void win32_update_inventory() { #ifdef DEBUG_FULL DEBUG_MSG("into update_inventory"); #endif } void win32_mark_synch() { } void win32_wait_synch() { } void #ifdef CLIPPING win32_setclipped() { } void win32_cliparound(x, y) int x, y; { } #endif /* CLIPPING */ /* * win32_print_glyph * * Print the glyph to the output device. Don't flush the output device. * * Since this is only called from show_glyph(), it is assumed that the * position and glyph are always correct (checked there)! */ void win32_print_glyph(window, col, row, glyph) winid window; xchar col, row; int glyph; { uchar ch; register int offset; int *ip; int color; /* In this routine 'color' is a NetHack color, not a WIN32 color */ color = NO_COLOR; if (wins[window]->wflags & WFLAGS_TILED) { ip = wins[window]->glyph + ((row * wins[window]->maxcols) + col); *ip = glyph; } else { /* * 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_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_BODY_OFF)) >= 0) { /* corpse */ ch = oc_syms[(int)objects[CORPSE].oc_class]; mon_color(offset); } else if ((offset = (glyph - GLYPH_PET_OFF)) >= 0) { /* pet */ ch = monsyms[(int)mons[offset].mlet]; pet_color(offset); } else { /* monster */ ch = monsyms[(int)mons[glyph].mlet]; mon_color(glyph); } #ifdef REINCARNATION if (Is_rogue_level(&u.uz)) color = NO_COLOR; #endif win32_curs(window,col,row); win32_putsym(window,wins[window]->cursx, wins[window]->cursy,colormap[color],ch, TRUE); } } void win32_raw_print(str) const char *str; { int button; if (str) if (strlen(str) != 0) { button = MessageBox((HWND)0,str,"raw_print", MB_APPLMODAL|MB_ICONSTOP #ifndef DEBUG |MB_OK); #else |MB_OKCANCEL); if (button == IDCANCEL) button = *((int *)0); /* Bombs away ! */ #endif } } void win32_raw_print_bold(str) const char *str; { win32_raw_print(str); } int win32_nhgetch() { return key_from_buf(); } /* * return a key, or 0, in which case a mouse button was pressed * mouse events should be returned as character postitions in the map window. */ /*ARGSUSED*/ int win32_nh_poskey(x, y, mod) int *x, *y, *mod; { return key_from_buf(); /* mouse support to come later */ } int win32_doprev_message() { register struct win32_WinDesc *cw = wins[WIN_MESSAGE]; return 0; } char win32_yn_function(query, choices, def) const char *query,*choices; char def; /* * Generic yes/no function. 'def' is the default (returned by space or * return; 'esc' returns 'q', or 'n', or the default, depending on * what's in the string. The 'query' string is printed before the user * is asked about the string. * If choices is NULL, any single character is accepted and returned. */ { unsigned int style; int button; char buf[QBUFSZ]; int i; if (choices) { char *cb, choicebuf[QBUFSZ]; Strcpy(choicebuf, choices); /* anything beyond <esc> is hidden */ if ((cb = index(choicebuf, '\033')) != 0) *cb = '\0'; if ((1 + strlen(query) + 2 + strlen(choicebuf) + 4) >= QBUFSZ) panic("yn_function: question too long"); if (query) { Sprintf(buf, "%s [%s] ", query, choicebuf); if (def) Sprintf(eos(buf), "(%c) ", def); } }else return key_from_buf(); i = strlen(buf); style = MB_APPLMODAL|MB_ICONQUESTION|MB_YESNOCANCEL; if ((def == 'y') || (def == 'Y')) style |= MB_DEFBUTTON1; else if((def == 'n') || (def == 'N')) style |= MB_DEFBUTTON2; else if((def == 'q') || (def == 'Q')) style |= MB_DEFBUTTON3; button = MessageBox( BasehWnd, buf, "Question", style); if (button == IDYES) return 'y'; else if (button == IDNO) return 'n'; else if (button == IDCANCEL) return 'q'; else return button; } void win32_delay_output() { } void win32_end_screen() { } int win32_get_ext_cmd() { return 0; } void win32_getlin(pr,inline) const char *pr; char *inline; { } void win32_nhbell() { } void win32_number_pad(x) int x; { } void win32_start_screen() { } static int has_color(int color) { return 1; } int key_from_buf() { int ch; inputstatus = WAITING_FOR_KEY; while (!pchCount) { win32_get_nh_event(); } inputstatus = 0; ch = *pchGet++; if (pchGet >= pchBuf + (RINGBUFSIZE - 1)) pchGet = pchBuf; /* wrap */ --pchCount; return ch; } void deferred_init(window,part) winid window; int part; { int i, msize, status; char WindowName[80]; #ifdef DEBUG_FULL DEBUG_MSG("Initializing a text window"); #endif /* Do all the initialization that we couldn't do earlier */ if (part == 1) { /* the stuff NetHack depends on */ #ifdef DEBUG_FULL DEBUG_MSG("About to do deferred init part 1"); #endif wins[window]->active = FALSE; wins[window]->type = NHW_TEXT; wins[window]->wflags = 0L; wins[window]->maxrows = ROWNO; wins[window]->maxcols = COLNO; wins[window]->hFnt = hDefFnt; msize = wins[window]->maxrows * wins[window]->maxcols; wins[window]->data = (uchar *)alloc(msize * sizeof(uchar)); memset(wins[window]->data,' ',msize * sizeof(uchar)); wins[window]->color = (int *)alloc(msize * sizeof(int)); for (i = 0; i < msize; ++i) *(wins[window]->color + i) = wins[window]->NormalTextColor; } else if (part == 2) { /* the stuff WIN32 depends on */ #ifdef DEBUG_FULL DEBUG_MSG("About to do deferred init part 2"); #endif wins[window]->WindowWidth = max((BaseWidth / COLNO) * wins[window]->widest, (BaseWidth / COLNO) * 40); wins[window]->WindowHeight = (BaseHeight / ROWNO) * wins[window]->cursy; wins[window]->nWindowX = 0; wins[window]->nWindowY = 0; Sprintf(WindowName,"NetHack Text Window %d",window); wins[window]->hWnd=CreateWindowEx( 0, NHTextClassName, WindowName, WS_CHILD|WS_VISIBLE|WS_BORDER, wins[window]->nWindowX, wins[window]->nWindowY, wins[window]->WindowWidth, wins[window]->WindowHeight, BasehWnd,(HMENU)(int)window, wcNetHack.hInstance, (LPSTR)0); if (!wins[window]->hWnd) { status = GetLastError(); DEBUG_MSG("Deferred init: Init of Window failed"); } wins[window]->active = TRUE; /* mark it active */ } #ifdef DEBUG_FULL else DEBUG_MSG("Deferred init: Unrecognized part"); #endif } /* * ----------------------------------------------------------------------- * Menu support routines * ----------------------------------------------------------------------- */ void win32_start_menu(window) winid window; { int i,status; char WindowName[80]; if (wins[window]->type == TYPE_UNDETERMINED) { /* Okay, now we know...its destined to be a menu window */ strcpy(WindowName,"NetHack Menu"); wins[window]->type = NHW_MENU; wins[window]->hFnt = hDefFnt; wins[window]->wflags = 0L; wins[window]->maxrows = 52; wins[window]->maxcols = COLNO; wins[window]->cursy = 0; wins[window]->cursx = 0; wins[window]->data = (uchar *)0; wins[window]->color = (int *)0; wins[window]->hWnd = CreateWindowEx( 0, NHListboxClassName, WindowName, WS_POPUP | WS_VISIBLE | WS_BORDER, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, (HWND)0,(HMENU)0, wcNetHack.hInstance, (LPSTR)0); if (!wins[window]->hWnd) status = GetLastError(); else /* Add the list box to the window */ wins[window]->hDlg = CreateWindowEx( 0, "LISTBOX", "NetHack List", LBS_NOTIFY | WS_BORDER | WS_VISIBLE | LBS_WANTKEYBOARDINPUT | LBS_USETABSTOPS, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, wins[window]->hWnd, (HMENU)0, wcNetHack.hInstance, (LPSTR)0); if (!wins[window]->hDlg) DEBUG_MSG("Problem with CreateDialog"); MenuWindowCount++; } else if (wins[window]->type = NHW_MENU) { #ifdef DEBUG_FULL DEBUG_MSG("Clearing already used menu out"); #endif for (i = 0; i < MenuCount[window]; ++i) { if (MenuPtr[window][i]) { if (MenuPtr[window][i]->str) free((genericptr_t)MenuPtr[window][i]->str); free((genericptr_t)MenuPtr[window][i]); MenuPtr[window][i] = (struct win32_menuitem *)0; } } MenuCount[window] = 0; SendMessage(wins[window]->hDlg, LB_RESETCONTENT, (WPARAM)0, (LPARAM)0); } else impossible("Start_menu on window type %d", wins[window]->type); } /* * 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 (ch) 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 * the 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. */ void win32_add_menu(window, glyph, identifier, ch, gch, attr, str, preselected) winid window; int glyph; /* unused (for now) */ const anything *identifier; char ch; char gch; /* group accelerator, 0 => none */ int attr; const char *str; boolean preselected; { struct win32_menuitem *menuitem; /* char buf[BUFSZ]; */ char *tmp; char *extra = "? - "; #ifdef DEBUG_FULL DEBUG_MSG("into add_menu"); #endif if (wins[window]->type == TYPE_UNDETERMINED) { impossible("Trying to add to a non-existant menu window %d", window); return; } if (wins[window]->type != NHW_MENU) impossible("Window type %d in add_menu", wins[window]->type); if (str) { tmp = (char *)alloc(strlen(str) + 1 + strlen(extra)); } else tmp = (char *)0; menuitem = (struct win32_menuitem *)alloc(sizeof(struct win32_menuitem)); if (!menuitem) return; menuitem->glyph = glyph; menuitem->identifier = *identifier; menuitem->ch = ch; menuitem->attr = attr; menuitem->str = tmp; if (MenuCount[window] >= MAX_INVENTORY) { impossible("Too many inventory items in add_menu (%d)", MenuCount[window]); return; } if (menuitem->identifier.a_void) { if (menuitem->str) strcpy(menuitem->str, (str != (char *)0) ? str : "Oops!"); } else Sprintf(menuitem->str,"%s", (str != (char *)0) ? str : "Oops"); MenuPtr[window][MenuCount[window]] = menuitem; ++MenuCount[window]; } /* * Stop adding entries to the menu. * Prompt is a prompt to give the user. If prompt is NULL, no prompt will * be printed. */ #if 0 char mbuf[BUFSZ * 8]; #endif void win32_end_menu(window, ch, str, morestr) winid window; char ch; const char *str; const char *morestr; { int i, j, junk; char buf[BUFSZ]; #ifdef DEBUG_FULL char buf2[BUFSZ]; #endif boolean sflag; if (wins[window]->type != NHW_MENU) impossible("Window type %d in end_menu", wins[window]->type); /* sprintf(buf,"Total items in menu: %d\r", MenuCount[window]); */ for (i = 0, j = 'a', junk = 0; i < MenuCount[window]; ++i) { sflag = FALSE; if (MenuPtr[window][i]) { if (MenuPtr[window][i]->str) { if (MenuPtr[window][i]->identifier.a_void) { if (!MenuPtr[window][i]->ch) MenuPtr[window][i]->ch = j++; Sprintf(buf,"%c - %s", MenuPtr[window][i]->ch, MenuPtr[window][i]->str); } else { Sprintf(buf,"\t%s", MenuPtr[window][i]->str); MenuPtr[window][i]->ch = junk++; } /* Win32 Listbox control messages */ SendMessage(wins[window]->hDlg, LB_ADDSTRING, (WPARAM)0, (LPARAM)buf); SendMessage(wins[window]->hDlg, LB_SETITEMDATA, (WPARAM)i, (LPARAM)MenuPtr[window][i]->ch); } #ifdef DEBUG_FULL else { Sprintf(buf2,"Listbox empty string: %d",i); DEBUG_MSG(buf2); } #endif } if (j > 'z') j = 'A'; if ((j > 'Z') && (j < 'a')) j = '?'; } #ifdef DEBUG_FULL DEBUG_MSG(buf); #endif /* TODO: add code to move menu data to the display buffer here */ } /* * Return the number of items selected. If the value is * zero, none were selected. 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. * PICK_NONE Nothing is selectable, * PICK_ONE Only one thing is selectable * PICK_N Any number valid items may selected * (If how is PICK_NONE, this function should never return anything but 0) * * 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 win32_select_menu(window, how, menu_list) winid window; int how; menu_item **menu_list; { /* win32_menu_item *curr; */ /* struct menu_info_t *menu_info; */ #if 0 ShowWindow(wins[window]->hWnd,SW_SHOWDEFAULT); #endif if (wins[window]->type != NHW_MENU) impossible("Window type %d in select_menu", wins[window]->type); ShowWindow(wins[window]->hWnd,SW_SHOWDEFAULT); #ifdef DEBUG_FULL POP_MESSAGE(mbuf); #endif return 0; } #endif /* WIN32_GRAPHICS */ ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/win32/mhtext.c����������������������������������������������������������������0000664�0000764�0000764�00000015266�10545462317�015102� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (C) 2001 by Alex Kompel <shurikk@pacbell.net> */ /* 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; #define DEFAULT_COLOR_BG_TEXT COLOR_WINDOW #define DEFAULT_COLOR_FG_TEXT COLOR_WINDOWTEXT 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) { PNHTextWindow data; 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); } mswin_popup_display(hWnd, NULL); mswin_popup_destroy(hWnd); } 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_CTLCOLORSTATIC: { /* sent by edit control before it is drawn */ HDC hdcEdit = (HDC) wParam; HWND hwndEdit = (HWND) lParam; if( hwndEdit == GetDlgItem(hWnd, IDC_TEXT_CONTROL) ) { SetBkColor(hdcEdit, text_bg_brush ? text_bg_color : (COLORREF)GetSysColor(DEFAULT_COLOR_BG_TEXT) ); SetTextColor(hdcEdit, text_fg_brush ? text_fg_color : (COLORREF)GetSysColor(DEFAULT_COLOR_FG_TEXT) ); return (BOOL)(text_bg_brush ? text_bg_brush : SYSCLR_TO_BRUSH(DEFAULT_COLOR_BG_TEXT)); } } return FALSE; 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; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/win32/dgnstuff.mak������������������������������������������������������������0000664�0000764�0000764�00000002352�10545462317�015727� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#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 ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/win32/tilemap.dsp�������������������������������������������������������������0000664�0000764�0000764�00000017063�10545462317�015565� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# 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 �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/win32/mhmap.c�����������������������������������������������������������������0000664�0000764�0000764�00000067227�10545462317�014677� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (C) 2001 by Alex Kompel <shurikk@pacbell.net> */ /* 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 "mhfont.h" #include "patchlevel.h" #define NHMAP_FONT_NAME TEXT("Terminal") #define MAXWINDOWTEXT 255 extern short glyph2tile[]; /* map window data */ typedef struct mswin_nethack_map_window { int map[COLNO][ROWNO]; /* glyph map */ int mapMode; /* current map mode */ boolean bAsciiMode; /* switch ASCII/tiled mode */ boolean bFitToScreenMode; /* switch Fit map to screen mode on/off */ int xPos, yPos; /* scroll position */ int xPageSize, yPageSize; /* scroll page size */ int xCur, yCur; /* position of the cursor */ int xScrTile, yScrTile; /* size of display tile */ POINT map_orig; /* map origin point */ HFONT hMapFont; /* font for ASCII mode */ } 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 = max(1, (data->bFitToScreenMode? wnd_size.cx : lpsz->cx) / COLNO); data->yScrTile = max(1, (data->bFitToScreenMode? wnd_size.cy : lpsz->cy) / ROWNO); /* set map origin point */ data->map_orig.x = max(0, client_rt.left + (wnd_size.cx - data->xScrTile*COLNO)/2 ); data->map_orig.y = max(0, client_rt.top + (wnd_size.cy - data->yScrTile*ROWNO)/2 ); data->map_orig.x -= data->map_orig.x % data->xScrTile; data->map_orig.y -= data->map_orig.y % data->yScrTile; /* adjust horizontal scroll bar */ if( data->bFitToScreenMode ) data->xPageSize = COLNO+1; /* disable scroll bar */ else data->xPageSize = wnd_size.cx/data->xScrTile; if( data->xPageSize >= COLNO ) { data->xPos = 0; GetNHApp()->bNoHScroll = TRUE; } else { GetNHApp()->bNoHScroll = FALSE; data->xPos = max(0, min(COLNO-data->xPageSize+1, u.ux - data->xPageSize/2)); } 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 = mswin_charset(); // character set identifier lgfnt.lfOutPrecision = OUT_DEFAULT_PRECIS; // output precision lgfnt.lfClipPrecision = CLIP_DEFAULT_PRECIS; // clipping precision lgfnt.lfQuality = DEFAULT_QUALITY; // output quality if( iflags.wc_font_map && *iflags.wc_font_map ) { lgfnt.lfPitchAndFamily = DEFAULT_PITCH; // pitch and family NH_A2W(iflags.wc_font_map, lgfnt.lfFaceName, LF_FACESIZE); } else { lgfnt.lfPitchAndFamily = FIXED_PITCH; // pitch and family NH_A2W(NHMAP_FONT_NAME, lgfnt.lfFaceName, LF_FACESIZE); } data->hMapFont = CreateFontIndirect(&lgfnt); mswin_cliparound(data->xCur, data->yCur); if(redraw) InvalidateRect(hWnd, NULL, TRUE); } /* set map mode */ int mswin_map_mode(HWND hWnd, int mode) { PNHMapWindow data; int oldMode; SIZE mapSize; data = (PNHMapWindow)GetWindowLong(hWnd, GWL_USERDATA); if( mode == data->mapMode ) return mode; oldMode = data->mapMode; data->mapMode = mode; switch( data->mapMode ) { case MAP_MODE_ASCII4x6: data->bAsciiMode = TRUE; data->bFitToScreenMode = FALSE; mapSize.cx = 4*COLNO; mapSize.cy = 6*ROWNO; break; case MAP_MODE_ASCII6x8: data->bAsciiMode = TRUE; data->bFitToScreenMode = FALSE; mapSize.cx = 6*COLNO; mapSize.cy = 8*ROWNO; break; case MAP_MODE_ASCII8x8: data->bAsciiMode = TRUE; data->bFitToScreenMode = FALSE; mapSize.cx = 8*COLNO; mapSize.cy = 8*ROWNO; break; case MAP_MODE_ASCII16x8: data->bAsciiMode = TRUE; data->bFitToScreenMode = FALSE; mapSize.cx = 16*COLNO; mapSize.cy = 8*ROWNO; break; case MAP_MODE_ASCII7x12: data->bAsciiMode = TRUE; data->bFitToScreenMode = FALSE; mapSize.cx = 7*COLNO; mapSize.cy = 12*ROWNO; break; case MAP_MODE_ASCII8x12: data->bAsciiMode = TRUE; data->bFitToScreenMode = FALSE; mapSize.cx = 8*COLNO; mapSize.cy = 12*ROWNO; break; case MAP_MODE_ASCII16x12: data->bAsciiMode = TRUE; data->bFitToScreenMode = FALSE; mapSize.cx = 16*COLNO; mapSize.cy = 12*ROWNO; break; case MAP_MODE_ASCII12x16: data->bAsciiMode = TRUE; data->bFitToScreenMode = FALSE; mapSize.cx = 12*COLNO; mapSize.cy = 16*ROWNO; break; case MAP_MODE_ASCII10x18: data->bAsciiMode = TRUE; data->bFitToScreenMode = FALSE; mapSize.cx = 10*COLNO; mapSize.cy = 18*ROWNO; break; case MAP_MODE_ASCII_FIT_TO_SCREEN: { RECT client_rt; GetClientRect(hWnd, &client_rt); mapSize.cx = client_rt.right - client_rt.left; mapSize.cy = client_rt.bottom - client_rt.top; data->bAsciiMode = TRUE; data->bFitToScreenMode = TRUE; } break; case MAP_MODE_TILES_FIT_TO_SCREEN: { RECT client_rt; GetClientRect(hWnd, &client_rt); mapSize.cx = client_rt.right - client_rt.left; mapSize.cy = client_rt.bottom - client_rt.top; data->bAsciiMode = FALSE; data->bFitToScreenMode = TRUE; } break; case MAP_MODE_TILES: default: data->bAsciiMode = FALSE; data->bFitToScreenMode = FALSE; mapSize.cx = GetNHApp()->mapTile_X*COLNO; mapSize.cy = GetNHApp()->mapTile_Y*ROWNO; break; } mswin_map_stretch(hWnd, &mapSize, TRUE); return oldMode; } /* 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) ); mcam += iflags.wc_scroll_amount - 1; /* get page size and center horizontally on x-position */ if( scroll_x ) { if( data->xPageSize<=2*mcam ) { x = max(0, min(COLNO, msg_data->x - data->xPageSize/2)); } else if( msg_data->x < data->xPos+data->xPageSize/2 ) { x = max(0, min(COLNO, msg_data->x - mcam)); } else { x = max(0, min(COLNO, msg_data->x - data->xPageSize + mcam)); } SendMessage( hWnd, WM_HSCROLL, (WPARAM)MAKELONG(SB_THUMBTRACK, x), (LPARAM)NULL ); } /* get page size and center vertically on y-position */ if( scroll_y ) { if( data->yPageSize<=2*mcam ) { y = max(0, min(ROWNO, msg_data->y - data->yPageSize/2)); } else if( msg_data->y < data->yPos+data->yPageSize/2 ) { y = max(0, min(ROWNO, msg_data->y - mcam)); } else { y = max(0, min(ROWNO, msg_data->y - data->yPageSize + mcam)); } SendMessage( hWnd, WM_VSCROLL, (WPARAM)MAKELONG(SB_THUMBTRACK, y), (LPARAM)NULL ); } } break; case MSNH_MSG_CLEAR_WINDOW: { int i, j; for(i=0; i<COLNO; i++) for(j=0; j<ROWNO; j++) { data->map[i][j] = -1; } InvalidateRect(hWnd, NULL, TRUE); } break; case MSNH_MSG_CURSOR: { PMSNHMsgCursor msg_data = (PMSNHMsgCursor)lParam; HDC hdc; RECT rt; /* move focus rectangle at the cursor postion */ hdc = GetDC(hWnd); nhcoord2display(data, data->xCur, data->yCur, &rt); if( data->bAsciiMode ) { PatBlt(hdc, rt.left, rt.top, rt.right-rt.left, rt.bottom-rt.top, DSTINVERT); } else { DrawFocusRect(hdc, &rt); } data->xCur = msg_data->x; data->yCur = msg_data->y; nhcoord2display(data, data->xCur, data->yCur, &rt); if( data->bAsciiMode ) { PatBlt(hdc, rt.left, rt.top, rt.right-rt.left, rt.bottom-rt.top, DSTINVERT); } else { DrawFocusRect(hdc, &rt); } ReleaseDC(hWnd, hdc); } break; } } /* on WM_CREATE */ void onCreate(HWND hWnd, WPARAM wParam, LPARAM lParam) { PNHMapWindow data; int i,j; /* set window data */ data = (PNHMapWindow)malloc(sizeof(NHMapWindow)); if( !data ) panic("out of memory"); ZeroMemory(data, sizeof(NHMapWindow)); for(i=0; i<COLNO; i++) for(j=0; j<ROWNO; j++) { data->map[i][j] = -1; } data->bAsciiMode = FALSE; data->xScrTile = GetNHApp()->mapTile_X; data->yScrTile = GetNHApp()->mapTile_Y; 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; i<paint_rt.right; i++) for(j=paint_rt.top; j<paint_rt.bottom; j++) if(data->map[i][j]>=0) { char ch; TCHAR wch; RECT glyph_rect; int color; unsigned special; int mgch; HBRUSH back_brush; COLORREF OldFg; nhcoord2display(data, i, j, &glyph_rect); #if (VERSION_MAJOR < 4) && (VERSION_MINOR < 4) && (PATCHLEVEL < 2) nhglyph2charcolor(data->map[i][j], &ch, &color); OldFg = SetTextColor (hDC, nhcolor_to_RGB(color) ); #else /* rely on NetHack core helper routine */ 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(nhcolor_to_RGB(CLR_GRAY)); FillRect (hDC, &glyph_rect, back_brush); DeleteObject (back_brush); switch (color) { case CLR_GRAY: case CLR_WHITE: OldFg = SetTextColor( hDC, nhcolor_to_RGB(CLR_BLACK)); break; default: OldFg = SetTextColor (hDC, nhcolor_to_RGB(color) ); } } else { OldFg = SetTextColor (hDC, nhcolor_to_RGB(color) ); } #endif DrawText(hDC, NH_A2W(&ch, &wch, 1), 1, &glyph_rect, DT_CENTER | DT_VCENTER | DT_NOPREFIX ); SetTextColor (hDC, OldFg); } SelectObject(hDC, oldFont); } else { /* prepare tiles DC for mapping */ tileDC = CreateCompatibleDC(hDC); saveBmp = SelectObject(tileDC, GetNHApp()->bmpMapTiles); /* draw the map */ for(i=paint_rt.left; i<paint_rt.right; i++) for(j=paint_rt.top; j<paint_rt.bottom; j++) if(data->map[i][j]>=0) { short ntile; int t_x, t_y; RECT glyph_rect; /* ntile = glyph2tile[ data->map[i][j] ];*/ ntile = glyph2tile[ back_to_glyph(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 (ntile != glyph2tile[ data->map[i][j] ]) { ntile = glyph2tile[ data->map[i][j] ]; t_x = (ntile % GetNHApp()->mapTilesPerLine)*GetNHApp()->mapTile_X; t_y = (ntile / GetNHApp()->mapTilesPerLine)*GetNHApp()->mapTile_Y; nhapply_image_transparent( hDC, glyph_rect.left, glyph_rect.top, data->xScrTile, data->yScrTile, tileDC, t_x, t_y, GetNHApp()->mapTile_X, GetNHApp()->mapTile_Y, TILE_BK_COLOR ); } 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 */ typedef BOOL (WINAPI* LPTRANSPARENTBLT)(HDC, int, int, int, int, HDC, int, int, int, int, UINT); 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 ) { /* Don't use TransparentBlt; According to Microsoft, it contains a memory leak in Window 95/98. */ 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, width, height); /* Monochrome DC */ bmAndBack = CreateBitmap(width, height, 1, 1, NULL); bmAndObject = CreateBitmap(width, height, 1, 1, NULL); /* resulting bitmap */ bmAndMem = CreateCompatibleBitmap(hDC, width, 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 */ StretchBlt(hdcSave, 0, 0, width, height, sourceDC, s_x, s_y, s_width, s_height, 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, width, 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, width, height, hdcObject, 0, 0, NOTSRCCOPY); /* Copy background to the resulting image */ BitBlt(hdcMem, 0, 0, width, height, hDC, x, y, SRCCOPY); /* Mask out the places where the source image will be placed. */ BitBlt(hdcMem, 0, 0, width, height, hdcObject, 0, 0, SRCAND); /* Mask out the transparent colored pixels on the source image. */ BitBlt(hdcSave, 0, 0, width, height, hdcBack, 0, 0, SRCAND); /* XOR the source image with the beckground. */ BitBlt(hdcMem, 0, 0, width, height, hdcSave, 0, 0, SRCPAINT); /* blt resulting image to the screen */ BitBlt( hDC, x, y, width, height, hdcMem, 0, 0, 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); } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/win32/mhrip.h�����������������������������������������������������������������0000664�0000764�0000764�00000000607�10545462317�014706� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (C) 2001 by Alex Kompel <shurikk@pacbell.net> */ /* 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 */ �������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/win32/rip.uu������������������������������������������������������������������0000664�0000764�0000764�00000332164�10545462317�014571� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������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`?("``<WAY`"XL+`!*0D(` M04-#`!<?'P`B.R<`'RXN`'1]?@"$BXL`&!T=`'Z%A0!/2TL`S,[.``%#`P`! M00,`*"<G``(S!``Y-34`%2LH`%!;6@`;)"0`OL#``"HP,`!A7EX`#S,?`-S? MWP"'C(P``3P$``(V!0`[.#@``C`%`#<T-`!*1$0`6U)2``DI$P`#!@8`(BDI M`#="0@`Z.SL`````````````````````````````````W@T-``(````-#0T` M```````````0`0$```@(``````#0+C8`.$9!`+4Q+P``(S4`:`)'`#8*+@"S M'C$``"LI```1-0``&B(``**F```X.@``:W0``!0:``!X?@``#1(``!,G```* M,P```3X``!88```!.@```C@``!06``!-1@``)20```H,```,%0``144``#=+ M```/,```#RX``#\_```]/0``%1L```TN``"#AP``+2T``"DI``![?P``$R\` M`#0Q``!630``#A@``+&T``"2F```(28``(J0```8'```?8(``&1L```?(``` M<W@``"XL``!*0@``04,``!<?```B.P``'RX``'1]``"$BP``&!T``'Z%``!/ M2P``S,X```%#```!00``*"<```(S```Y-0``%2L``%!;```;)```OL```"HP M``!A7@``#S,``-S?``"'C````3P```(V```[.````C```#<T``!*1```6U(` M``DI```#!@``(BD``#="```Z.P`````````````````````````````````` MW@T```(````-#0`````````````0`0````@```````#0+@``.$8``+4Q```` M(P``:`(``#8*``"S'@```"L````1````&@```*(````X````:P```!0```!X M````#0```!,````*`````0```!8````!`````@```!0```!-````)0````H` M```,````10```#<````/````#P```#\````]````%0````T```"#````+0`` M`"D```![````$P```#0```!6````#@```+$```"2````(0```(H````8`$!` M0$!`0$!`0$!`0$!`0$!`0$!`0$!.3DY`0$!`0$!`0$!`0$!`0$!`0$Y.3DY` M0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!.3DY.3DY# M3DY.3DY.3DY.3DY.3DY.3DY#3D-#0T-.3DY.3DY.0$!.3DY.3DY.3DY.3DY. M3D!`0$Y.0T-#3D-.3DY.3DY.3DY#3DY.3DY.3DY.0T-#8D-#0T-B0T-#0T-# M3DY.3DY.3DY#3D-#0TY.3D!`3D-#0T-#3DY.3D!`3D-#3A$1$4-#0T-#0T-# M0T-#0T-#0T-#0T-#0P5#0T-#0T-#!4-#$4-#0T,%0P5#!04%(DM%(B)%2T4B M(D4B"$M%2T4B(@@("`A%2P@(2P@(""(0"$4("`A+"`@(10@("`@((D5+"$L( M2T4B12((2T4B"`@("`A%(@A%2P@(2T5+14M%(@A%"$4((D4B10A+"`A%14M% M"`A+"`A+12)%(D4B"`@B"")%"$M%2R)%(@@(12)%2P@((D5+14M`0$!`0$!` M0$!`0$!`0$Y`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$Y.3DY.0$!` M0$!`0$!`0$!.0$!`0$!.3DY`0$!`0$!`0$!`0$!`0$!.3DY#0T-#3D-#0T-# M0T-#0TY#0TY.3DY#0T-#0T-#0T-#0TY.3DY.3DY.3DY.3DY.3D-#0TY`0$Y. M3DY.3DY`3DY.3DY.3D!.3D!.3DY.3DY.3D-#0T-B0U9#0T-#0T-#0TY.3DY# M0T-.3DY.0TY`0$!`3D-#0T-#0T-#3DY.0T,13D,(0$!`0T-#0T-#0T-#0T-# M0T-#0T-#3D-#0T-#$4Y#0T,%0T-#$4,%0P5#$04B(D4("")%(B)+"`@B14M% M2P@B12(("$L((@@("`@(2T4B"$M+2TL(2PA%2P@((DM%(B)%2T4("$4B10@( M"$4("`A%"`@B10@((D5+"$5+10@("`A%2P@(2T4("`A%(D5+"")%"")%(D5% M(D4B12)%(D5+145+11`((D4(14M%2T4B12)%2T5+12)%0$!`0$!`0$!`0$!` M0$!`0$!`3DY.3DY.0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`3DY.0$!`0$!` M0$!`0$Y.3DY.3DY.3DY.3DY.0$!.0$!`0$!`0$!`3DY#0T-#0T-#0T-#0T-# M0T-#0TY.3DY#0T-#0T-#0T-#3DY.3DY.3DY.3DY#0T-#0T-.3DY.3DY.0$!. M3DY#3DY.3D!`0$!`3DY`0$!`3DY#0T-#0T-#0T-#0T-#0TY`0$Y.0T-.3DY` M0$!`0$!.3DY#0T-#0T-.0T-#3DX(0!P<#$9&1AQ.0T-#0T-#0T-#0P5#3A%# M0P5#3D-#0T-#0T,%0$,%0T-#!4,%$2((14L(2P@B2P@("`A+(DM+2PA+"$L( M"`@("`A+"")+(@@B"`@("`@("$4B2TM%(B)%2T5+"`@((@@("`A+"$4(2R)% M"`@("`A+"`@("$4(2P@B"$4B(@A+14M+2T4B"$5+10@(2T4("`@((D5+12(( M""((12)%$$4B144B12)%(D5+14M%2T4B12)%2T!`0$!`0$!`0$!`0$!`0$!` M0$!`0$!.3DY.3D!`0$!.0$Y.0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!. M3DY.3DY.3DY.3DY.3D-.3DY.3D!`0$!`0$!`0$!.3DY#0T-#0T-#3DY.3D-. M3DY.3DY#0T-#0T-#3D-.3DY.3DY.3DY`3DY.3DY.3DY`0$Y.3D!`0$Y#0T-. M3DY`0$!`0$Y.3DY.3DY.3DY#0T-#0T-#3DY`3DY`0$Y.3DY.0T-.0$!.0$Y. M0T-#0T-#0T-#3D-#0TY`'`Q&##H,#`PZ,4-#!4,%0T,%0T-#0T-#0T-#0T,1 M0T-#!4-.0P5#0P4%0Q%#!2((2TL("`A+"$L(2P@("`A+"$L("$L(2TM+2TL( M2TL("")+"$M+"$L(2Q!+"`@(2P@(""(("`@(2P@("$L("$L((D4(2PA%2T4( M"$5+"$L("$5%"$4B10@("`A%"$5+12(B"$5+12)%2T5+12)%2T4B12)%(D4( M2T5+14M%(D4014M%2Q!%(D40"$4(14M`0$!`0$!`0$!`0$!`0$!`0$!`0$!` M0$!.3DY.3D!`3DY.3D!`0$!`0$!`0$!`0$!.0$!`0$!`0$!`0$!`0$Y.3DY# M0T-.3D-#0T-#0TY.3DY.3D!`0$!`0$!`0$!.0T-#0T-#0T-.3D!.0$!`3DY. M3DY.0T-#0TY.3DY.3DY`0$!`0$!.3DY.3DY.3D!`0$!`3D-#0T-#0TY.3DY. M3DY.3D-#3D-.3DY.0$Y#0T-#3DY.3DY.3DY#0T-#3D-.3DY.3DY.3DY#0T-# M0$`10!P<'!Q.,3%&1D8,.CHZ##$<1@P<0T-#0T,10T-#0TY#0Q%.0T-#$4-# M!4-#0P5#0P4%(DM+(@@(2TM+(DL(2R)+2TL("$L(2TM+2TM+"`A+"$L(2P@B M"`A+"$L("$L(2TLB2TL(2TM+2PA+"`A+(DL((@A%(D5+"$M+2PA+"`@(10@( M12)%(@@B"$5+"$M%"`A+11`(14L(10@("$4B14M%12)%(@A%(D5+14M%(@A% M2R)%2T5+12)%"$5+"$4B""((0$!`0$!`0$!`0$!`0$!`0$!.3DY`0$!`0$!` M0$!`0$!`0$!`0$Y`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!.0T-#0T-. M0T-#0T-#0T-.3DY.0$!`0$!`0$!`0$Y.0T-#0T-.3DY.0$!`0$!`3DY#0TY. M3D-.0TY.3DY.3D!`0$Y.3DY#0T-#0TY.3D!`3D-#0T-#0T-#0TY#0T-.0T-# M0T-#0TY.3DY.3DY.0T-#3DY#3DY.3DY.3DY.3DY.0$Y.0T-#0T-#0SA&1C`Z M#`P,.@PQ1D8Q.CHZ.CHZ1C$Q,4,%0T-#3D!#0P5#0T-.0T-#$4-#0T,%0P5# M!05+2TL(2TL(2P@(2TM+(B((2PA+2TLB2PA+"$L(2R)+"$L(2TM+2R)+2TM+ M2R)+2TL(2P@(2P@((D5+"$LB14L(2PA+2PA+""(("`@B10@B(DM+"$M%(@A% M2P@(12)%"`A+10@(14M%"")%(D4B12(B12)%"")%(D4((D5+12(((D4B12(B M14M%2TM%"!`((D5%2T!`0$!`0$!`0$!`3DY.0$!`0$Y.3DY`3D!`0$!`0$!` M0$!`0$!.0$Y.3D!.3D!`0$!`0$!`0$!`0$!.3DY`0$!`0$!.3D-#0T-#0T-# M0T-#0TY.3DY.0$Y`0$!`3DY.0T-#0T-#0T-.0$!`0$!.3DY.3DY.3DY#3DY. M3DY.0$Y`0$!`3DY.3DY#0T-#0TY.3D!`0$!.3DY.3DY.3D-#3D-#3D-#0T-. M3D!.0$!`3DY#3D!.3DY.3DY`3DY.3DY.0$Y#0TY`0$!`0P@X1D8P.@P,##H, M,49&,3HZ.CHZ.D8Q,3%.3D-#3DX13DY#0T-#!4,10T-#0P5#!05#$04(2P@( M2TL((B)+2TL(2TM+2TM+2R(B2TM+2TM+(B)+2TM+2TM+(DM+2TM+2TM+2PA+ M(DM+(DM+(DM+2TLB2TM+"$M+(@A+2PA+14LB(@@B2T4(14M%(D4B"$M%(A!% M"$M%"$L((D4B(D4B12)%(D5+10A+2PA%(D4B12)%12)%12)%2T4B10@((D4( M"$LB144B"$5`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`3D!`0$!`0$!`0$!` M0$!`0$!`3DY.3DY.0$Y.0$!`0$!`3DY.3DY`0$!`0$!.3DY.0TY.3D!`3DY. M3D!.3DY.3DY.3DY.0T-#0T-#0T-.0T-.0$!`0$!`0$!.3DY.3DY`0$!`0$!` M3DY.3DY.3DY.3D-.3DY.3D!`3DY.3D!.3DY`0$!.3D-#0T-#0T-#0T-#3D!` M0$Y`0$Y`3D!.0$Y.3DY#3DY`0$!#0T-#0$!`0`@(.$9&,#H,#`PZ##%&1C$Z M.CHZ.CI&,3$Q0T-#0T-.0TY#!4,%0T-.0T,%0P5#$4,%!4M+2TLB(DM+2TM+ M2TM+2TLB2TM+2TM+2TM+(DM+2TM+2TM+2TM+(DM+2TM+2TLB2TM+2TM+2TLB M2TLB2TLB"$L(2TL((@@B2T5+(B(((D5+2PA+2TM+(DM+2P@(2T5+""((2PA% M2T5+144B14L(2T5+12)%14M%(D4B12(B(D4B(B)%"")+144B10A%2T4(10@B M12(B3DY.0$Y.3D!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!` M0$!`0$!`0$!`0$Y`0$!.3DY.3DY.3DY.3DY.3DY.3DY.0$!`0$!`0$!`0$!` M3DY.0$Y.3DY.3D-#0T-#3DY.3D!`0$!`0$!`0$Y.0$!`0$Y.3DY.3DY#0T-# M3DY#0TY.3DY.3DY.3D-#3DY.3DY.0$Y.0$!`3DY#0T-#0T-#0TY.0$!`0$Y` M0$!`0$!.0$Y#0T-#3DY.3DY#.!PQ,3$Q.CHZ,#HZ.SL[,#L[#`P,.CL[.SHZ M##$Z.D,%0TY#$4-#0T,%0T-#0Q%#0P5#0Q$%2TLB(DLB(DM+2TM+2TM+2R(B M2TM+2TM+(DLB(DM+2TM+2TM+(DM+2TM+(DM+2TM+2TM+2TM+2TM+2R(B2R(B M2TM+2TLB2R(B(B(B(DM+"$M+2P@((B(("$M%(D4B""((14M%(D5+"")%2T4B M"$M%"$5+12((12)%(D4012)%"$4B10A%"$M%"$4B12)+12)%(D4B"`@(14!` M0$!`0$Y.3D!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!` M0$!`0$!`3DY.3DY.0T-#0T-#0T-#0T-#0TY.3D!`0$!`0$!`0$!`0$!`0$Y` M3D!`0$!.3DY`0$!.3DY.3D!`0$!`0$!`0$Y`3DY.3DY.3DY.3DY.3DY.0$!` M0$Y.3DY.3DY#0T-.3DY.3D-.0$!`0$!.3D-#0T-#0T-#3D!`3DY`0$!.3DY. M3DY#0T,1$1%`'$Y#.C`[.CHZ.CLP.SHP+CL[.SH[.CL[.CH[.SLZ.SHZ.RY# M3DY.0T-#0P5#0P5#!4-#!4,%!04B(DM+2TM+2TM+2TLB2TM+2R(B(B)+(DM+ M2TM+2TM+2TM+2TM+(DM+2TLB(DM+2R)+2TM+2TM+2R)+2R)+2R(0(DM+(B(B M2TM+(B)+2TM+2TM+2R)+(B((2R(0(B(B(D5+""(B(D4B11!%(B(((D4B10@B M14M%$"(((D40"")%(DLB144B"$M%(@@((@A%(D4B14L("`@("`A`0$!`0$!` M0$!`3DY.3D!`0$!`0$!`0$!`0$!`0$!.3DY.0$!`0$!`0$!`0$!`0$!`0$!` M0$!`3DY.3DY.0T-#0T-#0T-#0T-#0TY.0$!`0$!`0$!`3DY.3DY.0$!`0$!` M0$!`3DY#3DY.3DY.0$!.0$!`0$!`0$!.3DY`0$!.3DY.3DY`0$!`0$!`0$!` M0$Y#0T-#3DY`3DY.0T-#3D!.3D-#0T-#0T-#3D!`0$Y.3DY`0$!`0$!`"$Y. M+BXN+CLN+CHZ.CHZ.CHL+CHZ,#L[.SLP.S`Z.CH[.SL[.SHZ.SLZ3DX%0T-# M$4-#!4-#0Q%#!4,%!05+2TM+2TM+2TM+2R(02TM+2TLB(B(B(B(0$")+2TM+ M(DM+2TM+2TM+2TM+2TM+2TM+2TM+(B(B2R(B2TM+2R(B2TLB(B(B2TM+2TM+ M2TM+(B)+2R(B2TLB2R(B2R)+2PA+(B)+"$LB(@@B(DM%(@@B12(B14M%(D5+ M12)%2T4("`A%"$4B"$5+14M%2T40"$4B"`@("`@("`@(0$!`0$!`0$!`0$!` M0$!.3DY.3DY.3D!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!` M0$!`0$!.3DY.3D-#0T-#0T-#0T-.0$!`0$!`0$!`3DY.3D!`3DY.3DY`3DY. M3DY.3DY.0$Y.3DY`0$!`0$!`0$Y.3DY.3D!`0$!`0$!`0$!`0$!`3DY.0T-# M0T-.3D!.3DY.3DY`0$!`3D-.0$Y.0TY.0$Y.3D-#.#@X'$8Z.RP*+#L[.RXN M+"P[.CH,#`P[.SLZ.C`[.CHZ.SHN.SH[+#HZ.BPZ+CHP.P5#0T,10T-#0T,% M3A%#0P4%!4LB2R(B2TM+2TM+2Q`B(B)+2TM+2TM+2R(0(A`B2TLB(DM+2TM+ M2TM+2TM+2TM+2TM+2TM+(B(B(DM+(DM+2TM+2TM+(DM+2TM+2R(B(DM+2R(B M2R(B(B)+2TLB(B)+2TM+(DM+""(B12(((D4B2P@B11!%(DLB14L(12)%"`A+ M"$4B12)%"$4B12)%(D5+"`@("`@("`@("`@("$Y`0$!`0$!`0$!`0$!`0$Y. M3DY.3DY#3DY`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!.3DY.3DY. M0$!.3DY.3DY#0TY.3D-#3DY`0$!`0$!`0$!`3DY.0$!`3DY#3DY.3DY.3DY` M0$!`0$!.3DY`3DY.0$!`0$!`0$!`0$!`0$Y.3DY#3D!`0$Y.3D-#0T-#0TY. M3DY.3D!`0$!.3DY.3DY.0$Y.3DY.3D-&,"XN+@PZ,"P*+"XN+BXN+"PL+@PZ M.CHZ.CL[.@PZ.CHZ.CLL,#LN.RPL+"PZ.RPL.PI#!4-#0T-#!1%#0P5#!04B M(DM+(B)+2R(B(DM+2R(B(B(B2TM+2TLB2R(B(B)+(DLB2TL12R)+2R)+2R)+ M(B(12R(B(DM+(DLB(B(B(B)+(DM+2TM+2R(B2R(B(A`B(B)+2TM+2R(B(B(B M2R(B(B(B(B(B2Q`B2TLB(DLB2R(B14LB(B(B(D4(14M%(B(B2T4B"$4B"$4B M"$LB"")%(@@("`@("`@("`@("`@("`A#3DY.0$!`0$!`0$!`0$!`0$!`0$!` M3D!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$Y#0TY.3DY`0$!` M0$!`0$!`0$!`0$!`0$!`3DY.3D!.3DY`3D`10`@(0$!`.#@X.#@<'!P<'!P< M'!Q&,49&1D8Q,48Q,3%&,3$Q,0PQ##$,,3$Q,0PQ,3$Q##$Q,3$Q1C$,,3$Q M,3$Q,3$,##$Q,3$Q,3$,#`P,,3$Q,3$Q,3$Q,3H,.CHQ,0PQ,3%&1D9&1C$Q M,3$Q,3$Q,3$<.SLL,"PL.CHZ.SLL+`H*0T-#!4-#$4-#$05#!2(B(B(B(A`B M2R)+2TM+2TM+2R(B(B)+(B(B2TM+(DLB2TM+(B)+2TLB2TM+(B)+(DM+2TLB M2TLB2TM+(DLB2R)+(DLB2R)+2R(B2TM+(B(B2TLB(DM+2TM+(A`0(DLB$")+ M(B(0(A`B2R(02R)+(B(B(B(((D4B(B(B(A`B"!!%2T4(""(("$M%(D5%(D4( M"`@("`@("`@("`@("`@("`@(0TY.3D!`0$!`3D!`0$!`3DY.3D!`0$!`0$!` M0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$Y.0T-.0$!`,#`P,#HN M"CI&##H[.SM&1D8Q,3$Q,3$Q,3%&,48Q,3$Q,3$Q1C%&,3%&1D8Q1C$Q,3$Q M,3$Q,48Q,48Z,3$Q,3$Q##$,#`PQ,3$,,0PQ,3$Q,3$Q,3$Q,0PQ,3$Q,3$, M,3$Q,3$Q,3$Q#`P,#`PQ,3$Q,0PQ,3$Q#`P,,48Q,3$Q,3$Q,3%&,3$,,3$Q M,3$Q'#L[.RPL.RPL+"P*"@H*"D-.$4-#$4-#!4,%(DM+2TM+2R(B(DM+2TM+ M(B(B(B(B2R)+(DM+2TM+2R(B2TLB(B(B2TLB(DM+(DLB2TM+2R)+2R(B(DLB M2R)+(B)+(B(B(B)+2R)+(B)+(B)+2TLB2R)+2R(B$"(B(B(B(B)+(B(B(B)+ M(B(B(DLB(DM+(B)+(B)+(B((2P@B"$M%2T5+"$M%2T402R)%(@@("`@(.`@( M"`@("`@("`@("`@("$-#0TY`0$!`0$!`0$!`0$!`0$!.3DY`0$!`0$!`0$!. M0$!`0$!`0$Y.3D!`0$!`0$!`0$!`3D!`0$!`0$!`0$!`0`HL+"P*+`H[.SLL M+"PL1D8Q1@Q&,49&1C$Q,3$Q1D8Q,3%&,48Q,48Q,3$Q,3$Q,48Q,49&1C$Q M,3$Q1C$,#`P,,3$Q,0P,,3$Q#`PQ#`P,##$Q,3$Q,3$,,3$,#`PQ,3HQ,3$Q M,3$Q,3$,#`PQ,3$Q,3$Q,0PQ,3HQ,3$Q,3$Q#`PQ,3$Q,48Q1@P,#`P,#!PP M+BP*"@H*"@H*"@H*+`H%0T,%0T,1!2)+2TM+(B(B(B)+2TM+2R(B2R(B(B)+ M(DLB$!`B(B(B(DL12R(B(B)+2TLB2R)+(DLB(B(B(B)+(DLB2R(B(B(B2R)+ M(B)+(B(B2TM+(DM+(DLB(B)+2R(B(B(B(B(B(DM+2R(B(B)+2R(B2R)+(B(B M(A!+2R)+2TLB2TM+2TM+2P@B(DL($")%(D4B10A%"`@("`@("`@("`@("`@( M"`@("`@((D5`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!.3D-#0TY. M3DY.3DY.3DY`0$!`0$!`0$!`0$!`0$!`0$!`0`HL"@H*+`HL,#H[+#L[.S%& M,48Q,3$Q,3$Q,0PQ,3$Q,3$Q,3$Q1C$Q1C$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q M,3$Q,3$Q,3$Q,3HZ.@P,,0PQ.@PQ,3$Q,3$Q.C$Q,3$Q,0P,,3$Q,3$Q,0PQ M#`P,##H,#`P,,3$Q##$,#`PQ,3$Q,0P,,3$Q,3%&,48,#`P,#`P<,"XL"@H* M"@H*"@H*"BP*0T,%0T,%(B(B(B)+(DM+2R)+2TM+2R(B$"(B(B(B(B)+(B(B M(B)+(B)+2TLB(DM+(DLB(B(B2R(0(A`0(DM+2TLB2TM+(B(B2R(B$"(0(B(B M(B(B2R)+(A`B2TM+(B)+2R(B(B)+(B)+(B(B(DLB(B(0(B(B(B(B(B(B$"(B M2R)+(@A+""((2T4B"$M%(@A+12)%"`@("`@("`@("`@("`@("`@("`@("`@( M"`@(0$!`0$!`0$!`0$!`0$!`0$Y`0$!`0$!`0$!`3D!`0$Y.3DY.3DY.3DY. M0TY.3DY.3DY`0$!`0$!`0$!.3D!`3D`*"BPL+`HK+"XP.SLP,#`,1C%&#`PQ M,3$Q#`PQ,3$Q,0P,##$,,3$,,3$Q,3%&,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q M,3$Q,0P,#`PQ,3$Z,3H,#`P,,3$Q##HQ#`P,##$,,3$Q,3$Q,3$Q,3H,#`P, M.CHZ.@P,.C$Z##HZ,3$Q,3$,##$Q,3$Q1C%&#`P,#`P,'#`N+`H*"@H*"@H* M"@HL"@5#!04B(A`B2R(B$"(B2R(B(DLB(B(B2R(B(B(B(B)+(DL12TLB(DLB M(B(B(DLB(B(B2Q%+2Q$B(B(B(B(B(B(B(B(B(B(B(B(B(B(0(B(B$`4B(DLB M(B(B(DLB(DLB(B(B2TLB(DLB2R)+(DM+2R(B(DL0(B)+2R(B2TM+(B)+2R)+ M2TM+(B(B(B(0(D5+10@("`@("`@("`@("`@("`@("`@("`@("`@("`A%2T!` M0$!`0$!`0$Y.3DY.3DY.0$!`0$Y.3DY.0$!`3DY.3DY.3DY.3DY`3DY.3DY. M3DY.3DY.3DY.3DY#0T-.3D-#+`H*"@H*"BP[,"P[+BXN.T8Q1@P,,3$Q,0P, M##$Q,3$Q,3$,,3$,#`PQ,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q##$Q,3$, M#`P,,0P,.@PQ.@P,##$Q#`P,#`PQ,3$,##$,,0PQ#`P,##$Z#`PZ##$Q,0P, M##HZ.CH,##$,#`P,#$8Q,3$Q##$Q,3$Q#`P,#`,P+`HK"@HL+"P*"@H*"BQ# M!4M+(B(B2TLB$")+(B(B(B)+2R(B2TLB(B(B(DM+(B(B2R)+(B)+2R(B(DLB M(B(B2R(B$2(B2R(B(B(0(B(B!1`B(B(B(B(B(DLB(B(B$")+(DLB(B)+(B(B M2R(B2R(B(B)+(B(B(DLB(B(B(B(B(B(B(B(B2TLB2TLB2TLB(DM+(B((2Q!+ M14LB2T5+10@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`A`0$Y.3DY. M3DY.0$!`3DY.3DY.0$!`0$!`0$!.3DY.3DY`3DY.0T-#3DY.0$Y.3DY.3DY. M3DY#0T-.3DY.3DY`0"P*"@H*"@HL.S`L.RXN+CM&,48,##$Q,3$,#`PQ,3$Q M,3$Q##$Q#`P,,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,0PQ,3$Q#`P,##$, M##H,,3H,#`PQ,0P,#`P,,3$Q#`PQ##$,,0P,#`PQ.@P,.@PQ,3$,#`PZ.CHZ M#`PQ,3$Q#`P,,0P,##$Q,3$,#`PQ,3%8#"PK"@HL"@H*"@H*"@HL2TLB(DLB M(B(B(B(B2R(B(B(B(B(B2R(B(DLB(B(B(B(B2R(B(B(B(B(B2R(B(B(B(B(B M2R)+(B(B(DLB(DLB(A`B(DLB(DL1(A`%(B(B(B(B(DLB(DLB(DLB2TLB2R(B M$")+(B(B(B(B2TM+$"(B2R(B2TM+2TM+2TLB(DM+2R(B(B(B(A`B(B(0"$4B M"`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@(0$!`0$!`0$Y.3DY. M3DY`0$!`0$!`0$!`0$!`0$!`3DY.0$Y`3DY`0$!.0$Y`0$!`0$!.3DY#3D-. M3DY.3DY.3D,L"@H*"@H*+#LP+#LN+BX[1C%&#`PQ,3$Q#`P,,3$Q,3$Q,0PQ M,0P,##$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$,,3$Q,0P,#`PQ#`PZ##$Z M#`P,,3$,#`P,##$Q,0P,,0PQ##$,#`P,,3H,##H,,3$Q#`P,.CHZ.@P,.C$, M,0P,.@PZ.CH,#`PQ#`P,#`P,!@P*"@H*"@H*"@HK"CLN+"(0(B(B(A`B(B(0 M$$LB2R(B(B)+2Q%+(B)+(B(B2R(B(B(B(B(B(B(B(@4B(B(B(B(B(B(B(B(B M(B(B(DL1(B(B(B(B(B(B$"(B(B(B(B(B(B(B(B(B(B(B(B(B(B(B(B(B(B(B M(B(B(B(B(B(B(DLB2R)+2TM+2TLB(B)+(DM+(B(B(B(B"!`("`@("`@("`@( M"`@("`@("`@("`@("`@("`@("`@("`@(2P@("$Y.3DY.0$!`0$!`0$Y.3DY. M3DY`0$!`0$!`0$!`0$!`0$!`0$!`0$Y`0$!`0$!`0$!`0$!`0$!.3DY.3D!` M0$-."@H*"@HK"BP[+BPN"@H*+D8Q,3$Q,3$Q,3$Q1C$,##$Q,3$Q#`PQ,3$, M#`P,,3$Q,3$Q,3$Q,3$,,3$Q##$Q,3$Q,0PQ,3$,#`P,#`P,,0P,,0P,##$, M.C$Q##$Q,3$,##$Q#`PQ,3$Q,0PZ.@P,#`P,##HZ.@PZ##H,#`P,#`PZ#`P, M,3$Q#`PQ.@P,##$Q,0,Q+`H*+`H*"@HK*RPL+`HB(B)+(B(0(B(B(B(B(B)+ M(A`B(B(B(B(B(A%+$4LB$`4B(B(B(B(B$2(0!2(B(B(B(B(B(A$B(B(B(B(B M(B(B(B(B(B(B(B(B(B(B(B(B(B(B(B(B(B(B(B(B(B)+(B(B(B(B$"(B(B(B M2R(B2TM+(DM+(DLB2R(B2TM+(B)+(A`B(B(B2R(("`@("`@("`@("`@("`@( M"`@("`@("`@("`@("`@(2P@("`@("`A`3DY.3DY#3DY.3DY`0$!`0$!.3DY# M0$Y.3DY#0T-#3D!`0$!`0$!`0$!`3DY.0$!`0$!`0$!`0$!`0$!`0$!#3@H* M"@H*"BP[.RPL*PH*"BM&,0PQ,3%&1D8Q,3$Q,0PQ,3$Q,3$Q,3$Q##$Q,0P, M##$Q,3$Q,3$Q,3$Q,3$,,3$Q,0P,,3$,##HZ.C$,#`P,#`PQ,3$Z,3H,,3H, M#`P,#`P,,3$Q#`P,##$,.@PZ##H,#`PZ.CH,##HZ.CHQ#`PQ#`P,,0P,#`P, M##$,,0P,#`P#,3H*"@H**RLK*PHN+@H*(DM+2TLB(B)+(B(B2R(B(B(B(B(B M(B(B(B(B(A$B(B(B(B(B(B(B(B(B$2(1(B(B(B(%(B(B(B(B(B(B(B(B!2(B M!1`B(B(B(B(B(B(B(B(B(B(B(B(B(B(B(B(B(B(B(A`%$"(B(B(B(DLB2R(B M(B(B(B(B2R(B(B(B2R(B(A!+2R(B2P@("`@("`@("`@("`@("$4B"`@("`@( M"`@("`@("`@("`@(14M%(D4(0$!`0$!`3DY.3DY.0T-#0TY#3DY#0T-.0T!` M0$Y.0T-#0T-#0TY`0$!`0$!`0$!.3D!`0$!.0$!`0$!`0$!`0$`K"BLK*PHN M.SLL"@HK*RL*1C$Q##%&,3$Q,48Q,48,,0P,#`P,#`P,##$,#`P,##H,##$Q M#`P,,0PQ,0PQ##$Q,0PQ##$Q.C$Z.CH,##HZ##H,.CHZ##$,,0PZ##$Q,3HZ M#`P,#`PQ,3$,#`P,.CHZ#`P,#`P,#`P,.CHZ#`PQ##H,#`PZ.CHZ#`P,,3$, M#`P,6`P,+"LK*RLK*RLL"BL*+"(B(B(B(B(0!1`B(B(B(B(B(B(B(B(B(B(B M(A$B(B(1(B(B$2(B(B(B(B(B(B(B!040$2(B(A$B(B(B(A$B(B(B(B(B(B(B M(B(1(B(B(B(B(B(B(B(B(B(0!1`B*B(B(B(B(DLB(DL12R)+(DLB(DLB(B(B M2R(B(B(B2R(B(B(B2P@("`@("`@("`@("`@("`@(2P@("`@("`@("`@B10@( M"`@("`@("`@("`@("$!`3DY.3DY`0$!`0$!`0$!`0$!.0$Y`3DY.3D!`0$!` M0$!.0T-#0T-.0$!`0$!`0$Y.3DY#3D-.3D-#0T-.3DY`"@HL+"P**RPN,#L[ M,#`P#$8Q1@P,,3$Q,0P,,3$Q,3$,#`PQ##$Q##$Q,3$Q1C$Q,3$Q,3$Q,3$Q M,3$Q,3$Q,3$Q,3$Q,3$,#`P,,3$Q.C$Z#`P,##$Q,0PZ,0P,#`PQ##$Q,3$Q M,3$Q,3$Z#`P,##HZ.CH,##HQ.@PZ.CHZ.@P,.CHZ.CHZ.CHZ,3$,,0P,#!P* M.CLK2"LK*RLK"@H*"@H%(B(B(B(0!2(B!2(B(B(B(B(1(B(B(B(%(A$B(@4B M(B(B(B(B(B(1(B(1(B(B(B(B(B(B(B(1(B(B!2(B(B(B(@40!2(B!2(B(B(B M(B(B(B(B(B(B(B(B(B(B(B)+(B(12Q%+$4LB(DL12R(B2R(B(DM+(DLB(A`B M2R(02TL(.`@("`@("`@("`@("`A%2P@("`@("`@("`@("`@("$L("`@("`@( M"`@("`@("`A`0$!`0$!`0$!`0$Y`0$!`0$!`0$!`0$!`0$!`0$Y`0$!`0$Y` M0$!`0$Y#0T-#0TY#3D!`0$!`0$X13DY.3DY#0RP*"@H*"@HL.S`L.RXN+CM& M,48,##$Q,3$,#`PQ,3$Q,3$Q##$Q#`P,,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q M,3$Q,0PQ,3$Q#`P,##$,##H,,3H,#`PQ,0P,#`P,,3$Q#`PQ##$,,0P,#`PQ M.@P,.@PQ,3$,#`PZ.CHZ#`P,.CHZ.CHZ#`P,#`P,.CH,,0P,#`P`*RPP"BLK M*RLK+`H**PHL$`4B(B(B(BHB(A`J(B(B(B(B(B(B(A$B(B(B(A`B(B(B(B(B M(@4B(B(%(@4%(@4B!2(%(B(%(B(%(B(B!2(B!2(%!2(B(B(B(B(1(@4B(B(% M(B(B(A$B(B(B(DL1(A%+$4L12R(B2R(B2P4B(DLB2R(B(DLB(B(B(B(B"`@( M"`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@B10A%"`@( M"`@(3DY#0T-#0T-.3DY`0$Y.0$!`0$!`0$!`0$Y.3DY`0$Y`0$Y.3D-#0T-# M3DY`3DY.0$Y.3DY`0$!`0$!.0$!`0$`L"@H*"@H*+#LP+#LN+BX[1C%&#`PQ M,3$Q#`P,,3$Q,3$Q,0PQ,0P,##$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$, M,3$Q,0P,#`PQ#`PZ##$Z#`P,,3$,#`P,##$Q,0P,,0PQ##$,#`P,,3H,##H, M,3$Q#`P,.CHZ.@P,##HZ.CHZ.@P,#`P,##HZ##$,#`P,`"LL,`HK*RLK*RP* M"BL*+!`B(A`%$"(0(B(B(B(B$2(B(B(1(B(B(B(%!2(%(@4B!2(B!04B(@4B M(B(B(B(B(B(%(A$B(B(1(@4B!2(%(A$B(B(B!2(%(@4B*B(B(B(B(B(1(B(1 M(A$B$2(1(B(B(B(B2R(1(B(B(B)+2R(B2R(B(A`B(DM+2P@("`@("`@("`@( M"`@("`@("`@("`@("`@("`@("`@("`@("`@("$M%2P@(""(("`@("`@("$-# M0T,%0P5#0T-#0T-`3DY`3DY`0$!`0$!`0$!`0$!.0T-#3DY`0$!`0$!`$4!. M0T-#0$Y`0$!`0$!.0$!.3DY#+`H*"@H*"BP[,"P[+BXN.T8Q1@P,,3$Q,0P, M##$Q,3$Q,3$,,3$,#`PQ,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q##$Q,3$, M#`P,,0P,.@PQ.@P,##$Q#`P,#`PQ,3$,##$,,0PQ#`P,##$Z#`PZ##$Q,0P, M##HZ.CH,#`PZ.CHZ.CH,#`P,#`PZ.@PQ#`P,#``K+#`**RLK*RLL"@HK"BPB M(B(%$`4B!2(B(@4B!2(B(B(B(@4B$2(%$`4B!2(J!04B(B(%(@4B(@4B(@4B M(B(%$`4B(@4B(B(B(B(B(B(B!2HB!2(1$2(%(@4B(A$B(@412Q%+$4L1(A$B M(B(1(A$B$2(B(B)+(B(B(B(B(B(0(B(B(B(("`@(2T4("`@("`@("`@("`@( M"`@("`@("$L("`@("`@("$4("`@((D4("`@B10@("`@("`@("`A.3D-.3D!` M0$`13DY`$4-#3DY`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$Y. M0$Y`0$Y`0$Y.0T-#3@H*"@H**PHL.RXL+@H*"BY&,3$Q,3$Q,3$Q,48Q#`PQ M,3$Q,0P,,3$Q#`P,##$Q,3$Q,3$Q,3$Q##$Q,0PQ,3$Q,3$,,3$Q#`P,#`P, M##$,##$,#`PQ##HQ,0PQ,3$Q#`PQ,0P,,3$Q,3$,.CH,#`P,#`PZ.CH,.@PZ M#`P,#`P,.CHF.CHZ.CHZ)CHZ.@P,#`P#2"LL.RLK+"PL+`H*+`HN(@4B(B(% M(B(B!2(B(@4B(B(%!2(B(B(B!2(B!1`%(B(B(@4B(B(B(@4%(@4%(@4%!2(B M(@4B!04B!04%(@4%*B(%(B(B(BHB(B(%(A$B$1$B(A$B$1$1(A$B$2(B$2(B M$2(B(B(B$2(B$"(B(B(B(B(("`@("`@("`@("`@("`@("`@("`@("`@("`@( M"`@("`@("`@("`A+"`@("`@("`@("`@("`@("`@(2P@(0$!.3D!`0$!`0$!` M0$!.0$!`0$!`0$!`0!%.0T-.0$!`0$!`0$!`0$!`0$Y`0$!`0$Y.3DY.3DY. M0$Y.3D-.0TX*"@H*"@HL.SLL+"L*"@HK1C$,,3$Q1D9&,3$Q,3$,,3$Q,3$Q M,3$Q,0PQ,3$,#`PQ,3$Q,3$Q,3$Q,3$Q##$Q,3$,##$Q#`PZ.CHQ#`P,#`P, M,3$Q.C$Z##$Z#`P,#`P,##$Q,0P,#`PQ##H,.@PZ#`P,.CHZ#`PZ.CHZ.CH, M##$,#`PZ.CHZ#`P,.CHZ.CHZ'$@K"C`L+"PL+`H*"BP*"B(B(@4B(B(%(B(B M!040!04B(B(B!2(B$2(B$04B!04B!2(%(@4%(BH1!2(%(@4B!2(%!04B$04B M!2(%(@4B!2(%(@4B!2(B$1$12Q$1(@4B!1$1(A$B$2(B$4L1(B(1(B(B(B(B M(B(B(B(B$$LB"`@("`@("`@("`@("`@("$L("`@("`@("`@("`@("$L("`@( M"`@("`@("$M%"`@("$M%(D4("$5+14M%"`@("$-#0$!`0$!`0$!`0$!`0$!` M3A%#0TY.3D!`0$!`0$!`0$Y.0$!`0$!`0$!`0$!.0$!.0$!`0$!`0$!`0$!` M0$!`*PHK*RL*+CL[+`H**RLK"D8Q,0PQ1C$Q,3%&,3%&##$,#`P,#`P,#`PQ M#`P,#`PZ#`PQ,0P,##$,,3$,,0PQ,3$,,0PQ,3HQ.CHZ#`PZ.@PZ##HZ.@PQ M##$,.@PQ,3$Z.@P,#`P,,3$Q#`P,##HZ.@P,#`P,#`P,##HZ.CHZ,0P,#`P, M#`P,#`P,#`P,##HZ.@,K2"LL,#L*"@H*"BP*2"PB!2(%(@4B(A$B!2(B!2(B M!2(%(@4%!04B(@4%(@4B!2(%(@4%(@4%!2(%!04B!04%(@4B!2(B!2(%(A$B M!04B$041!1$1(A$B$041(B(B(B(1(A$B$1$B!2(1!2(B(B(B(B(B(B(B(DLB M(@@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@( M"`@((D4("`@("`@("$L("`@(2T5+"$M#0T-#3DY.0$!.3D!`0$!.3D!`0$!` M0$!`0$!`0$!`0!%.$4-#!4-#0T-.0$!`0$!`0$!`0$!`0$!`0$!.0$!`0`HK M+"PL+"XN.RPK"BLK*PI&,48Q,4HQ,3$Q,3$Q,3$,#`P,,3$Q.CHZ,0P,##$Q M,3$Q.C$Q,3$,,0PQ,0P,#`P,,3$,,0PZ.C$Q,0PQ##H,.@PQ,3$,#`P,,3HP M#`P,#`P,#`P,,28F)CHZ.@P,.@P,#`P,#`P,.CHZ#`P,)C`P.CHZ#`P,##H, M##$P.CHZ.CI'2#\K+#LZ+"PL*RL*"D@L!1`%(B(B!2(%(B(%(@4%(@4%!04B M!2(%!04B!04%$`4B!2(B!2(B!2(1(B(B!1`%(@4B!2(%!2(1$1$1$1$1$1$B M$2(1$1$1$1$B!1$1(A$1(B(%$2(1(A$B(B(B(B(B(@40(B(B(B(("`@("`@( M"`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("$5+10@("`@("`@( M2P@("")+"`A%2PA+"`@B"")+0$!`3D-#0T-.0$!`0!%`0$!`0$!`$4Y`0$!` M0$!`0$!`0$!`0$!`0$Y#0T-#0T-#0T-`$4!`0$!.0$Y#0TX10$`K"BXN+CL[ M+"PK"BLK*RLK1C$Q2C$Q,3$Q,3$Q,3$Q##$Q,3$Q,3$Q#`PZ.CHZ#`PZ,0PZ M,3$Q##$Q##$Q#`P,#`P,#`P,,0P,#`PZ#`P,.B8,,3$Q#`PZ#`PF#`P,##HZ M#`P,.@PZ.CH,.CHZ.CH,)B8F.CHZ##HZ.C`P,#H,#`P,#`P,#`P,##HZ#`P, M#`P,'$A(*RPP,#`P,"P*"BPK"DL1(B(1(A$B(B(%(@4B!2(B(B(B!2(%!2(1 M(B(B!04%!2(%!041$1$1(@4%$1$1!1$1$1$1$1$1$041$1$B!1$1!2(1$1$1 M!1$1(@41$04B$1$B(B(1!2(B$2(B(A$B!2(B(B(("`@("`@("`@("`@("`@( M"`@("`@("`@("`@("`@("`@(2T4B"`@("`@("$L("`@(2P@("")%"$L("`@( M"$M+2TL(2PA+"$L((DY`0$Y`0$!`0$!`0$!.0$Y.0$!`0$!`0$!`0$Y.3D!` M0$!`0$!`0$!`0$!`0$!`$4!.0$!`0$Y.$4Y.0$!`0$Y.3BX*"@H[.RXK"BLK M*RLK*T8Q,3$Q,3$Q,3$Q,3$Q.CHZ.CHZ,3$Q,0PQ,3$Q,3$Q.CH,.C$Q,3$, M#`P,#`P,#`P,#`P,##$,.CHZ.@P,.@P,.@P,#`PQ.@P,##HP,#`Z,`P,.@PZ M,#`P.C`Z.CHZ,`P,##HP,#HZ##H,#`P,#`P,.@PZ#`P,.@P,.CHZ.@P,#"$K M"BPL.SHZ.CHL*PH*"BQ`"$L1$0@1$1$1$04%$!$1$1$1$2(1$2(1!04%(B(1 M$2(1$04B$1$1$1$1$1$1$1$1!1$1$1$1$1$1$1$1$1$1$041$1$B$2(B$1$1 M(A$B$2(1!2(1(B(1(B(%(B(B(B(B"`@("`@("`@("`@("`@("`@("`@("`A% M2P@("`@("`@("`@B10@("`@("$L("`A+"`@((@@("$M+2TL((DM+2P@B(@A+ M2TLB2TM+2TM%"$5%0`A`0$`10$!`0$!.3D!`0$Y`0$-#0$!.3D-#0T-.3DY. M0TY`0$!`3D!`0$!`0$Y`0$!`0$!`3DY.3DY.3DX[+BXN+"X**PHK*RLK*RM& M,3$Q,3$Q,3$Q,3$Q##$Q,3$Q,3HZ,3$Q#`P,##$Q,3HZ,0P,#`P,#`PQ#`P, M#`P,.@P,#`PZ#`P,##H,)CHZ.CH,#`P,.B8,#`P,)B8F.C`Z##H,,#`P,`PZ M,#HZ.CHZ.CHZ.CHZ##HZ.CHZ,`PZ#`PZ##HZ.@PZ#`P,.@PZ.CI%"@H*"BXL M+"PL"@HK2#]($0A`$0A`$1$1$0@1"$`1$1$1$0A`"!$1$4L1$4M`$4M`$1$1 M$1$1$1$1$1$1$1$1$1$1$041$1$%$1$%!1$1$2(B$1$1$1$1$1$1!2(B!1$% M(A$B!1$B(@4B(B(B(@@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`A+ M"`@("`A+12(("`A+(@A+"`@("`A+2TLB(DL(2PA+2TLB2TM+2TM+2TM+2TM+ M2TM+145%145%145%108("$4(10A`$4!.0$Y`0$,%0T!`0$Y.3DY`0$Y`3DY. M3A%#3D!`0$!`0$!`0$!`0$`10$!`0$Y..BXN+BPL*PH*"@HK*RLK,3$Q,3$Q M,3$Q,3$Q##$Z##HZ.C$Q.@PQ,0PQ,3$,#`PQ#`P,,3$Q#`P,#`P,##HZ.CH, M.@P,##HZ.CHP##`,.CH,#`P,##HF#`P,.CHZ.C`F.CHZ##HZ.CHZ,#HP.CH, M.CHZ.CHP.C`Z)CHZ.CHP.@P,#`PZ.CHZ.@PZ.CHZ#`P,6`H*"@HL"DA(2`HK M+`HK"DL1$1$1$1$1$1%`"!$1$1$1$1$1$4!+$1%`"$!+$1$1$1$1$1$1$1$1 M!1$1$1$1$1$%!1$1$04%$1$1$1$1$1$1!1$1$2(%(@4B(A$%!2(B!2(%(@4B M!2(B$0@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("$L("`@("$L( M2PA+2TL(2TM+"$M+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2R(B(DM+2R)+(@9% M!D4&109%!@@&108(!D4&109%!D4&109%109%2TM.0TY`0$!`0$-#0$Y`0$!` M3D!#0T-#0TX10$!`0$Y`0$Y.0#HN+BXL+"L*"@H**RLK*S$Q,3$Q,3$Q,3$Q M,0PQ.@PZ.CHQ,3H,,3$,,3$Q#`P,,0P,##$Q,0P,#`P,#`PZ.CHZ##H,#`PZ M.CHZ,`PP##HZ#`P,#`PZ)@P,##HZ.CHP)CHZ.@PZ.CHZ.C`Z,#HZ##HZ.CHZ M,#HP.B8Z.CHZ,#H,#`P,.CHZ.CH,.CHZ.@P,#%@*"@H*+`I(2$@**RP**PI+ M$1$($1$1$1$1$1$12Q$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1$1 M$1$1$041$1$1$1$1$1$%$04B!1$%!2(%$1$%(@4%(B(1!2(%!2(B(@@("`@( M"`@("`@("`@("`@("`@("`@("`@("`@(2P@("$L(2PA+"`A+"`@("$M+2TL( M2P@(2TM+2TLB(B(B(DM+2TM+2TM+2TM+2TM+2TM+2TM+2TLB(B)%145%109% M!D4&109%!D5%!D4&!D4&!D4&!D4&108&109%!D4&109%!D5%14!.3A%.3DY# M0TY`0$!.0$!`3DY`3DXZ+BXN+"PK"@H*"BLK*RLQ,3$Q,3$Q,3$Q,3$,,3H, M.CHZ,3$Z##$Q##$Q,0P,##$,#`PQ,3$,#`P,#`P,.CHZ.@PZ#`P,.CHZ.C`, M,`PZ.@P,#`P,.B8,#`PZ.CHZ,"8Z.CH,.CHZ.CHP.C`Z.@PZ.CHZ.C`Z,#HF M.CHZ.C`Z#`P,##HZ.CHZ##HZ.CH,#`Q8"@H*"BP*2$A("BLL"BL*0`@10`A` M"!$1$1$1$4`($1$1$1$%$1$1$1$1$1$1$1$1!1$1$4`1$1$1$1$%$1$1$1$1 M!041$04%$1$%$1$1(@4%$2(%(@4%!04%(B(%(B(%(B(("`A%2P@("`@("`@( M"`@("`A%"`@("`@("`@("$M+2P@(2TL(2PA+"$L(2PA+2R(B2TM+2TM+2TM+ M2TM+2TM+2R)+2TM+(B)+2TM+2TLB2R(B2TM+2R(B$")+109%!D5%!D4&109% M109%!D5%145%145%145%!D5%144&144&145%145%145%145%109%!D4&109% M109%!D4&109`##`P,`H*"@HK"@I(2$@K,3$Q##$Q,3$Q,0PQ,0PQ,3HZ.@PZ M,0PZ#`P,#`P,,0P,.@PQ#`P,#`P,#`P,#`P,#`P,##H,.CHZ.CHF.CHP##H, M#`P,.C`,#`PZ.C`P,#HP##HZ,#HZ.CHZ.C`P.CHZ.CHZ,#`,,#HZ.C`P,`PP M,#HP##H,#`P,##HZ.CH,.CHZ1BL*"BPK2"LK*RLK"C`L"A$1$1$1$1%+0!$1 M$1%+$4`1$1$1$1$1$1%.$1$1$1$1!1$1$1$1$1$1$04%!1$%$1$%!1$1$04% M$041!1$%!04%(@4%(@4B(B(%(@4%!04("`@("`@("$4("`@("`@("`@("`@( M2T5+2TM+"$L(2PA+"$LB(DM+"$M+2TM+2TM+2TM+(B)+2TM+2TM+2R(B2R(B M2TM+2TM+2TM+2TM+2TM+(B(B(B(B2TM+2R(0(D4&109%!D4&109%!@9%!@9% M!D4&109%!D4&145%145%145%145%145%145%145%145%145%145%145%!D4& M109%1DHF)B8P*PHK"@HK*RLK2#$,#`PQ,3$Q,3$,,3HQ,3$Q,3$Z,3$,#`P, M,3$Q#`P,,0PP#`P,#`P,#`P,.CHZ.CHZ.CH,#`PZ.CHZ.@P,,`PP##`P,`PF M#`PZ.C`P,#`P#`PZ#"8Z#`P,.C`P,#HZ,#HZ.CHP,#`Z,#`P,#`P.CHZ,#HP M,#`P,`PZ.CH,.CHZ.D8*"BPK*RLK*RL**T@[##H1$1%+$1$1$1$1$1$10$L1 M$1$1$4`%!1$1$1$1$4`%!1$1$1$1$041!1$1$1$1$1$1$1$%!1$%!04%(@4% M!04B!04B!04%!04%(@4B"`@("`@("`@(2PA+"`A+"`@("$M+"`A+(B)+(DL( M2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+(B)+(DM+2TM+2TM+2TLB2R(B(B)+ M$4M+2R(B(B)+2Q%+2TM+(B(B2R(B(B)%!D4&109%!D4&145%145%145%145% M145%145%145%145%145%145%!D4&109%!D5%!D4&!D4&!D4&!D4&109%!@Q& M,3$Q.@H**RL**RLK*T@,,0PQ,3$Q,3$Q##$Z,0P,,3$Q##$Q##$,#`P,#`P, M,0PZ#`P,#`P,#`PZ.@PZ.CHZ.CHZ.@P,)CHZ.CHP.B8Z,`PZ.CHZ,`P,##`P M#`P,.@PZ#"8,##HZ.CHP,#`P,#HZ.CHZ.C`P,#HP.SL[.CHP.S`P)CHZ.C`P M##H,.@PZ.CH`"@HL"@H**RLK*PH*+CHQ$1$10!$1$1$1$1$1$1$1$1$1$1$1 M$1$1$1$1$1$1$1$%$1$1$1$1$04%$041!04%$04%$04%$04B!04%(@4B!2(% M!2(%(@4B"`@("`A+10A+"`A+"`@(14L("$L(2TL(2TM+"$LB2TM+2TM+2TM+ M2TM+2TM+(DM+2TM+(DM+2TM+2R(B2TM+(B)+(DM+2R(B$4LB(B(B(DLB(B)+ M2R(1(B(B(DL1(B)+(B(B(B(B145%145%145%145%145%145%145%145%!D4& M109%109%109%109%!D4&109%!D4&109%145%145%145%145%144P,4I*2CHN M*RM(*RM(2$@K2@PQ#`P,,3$Q#`PQ.C$Q,0P,##$,##$Q#`PQ,3$,#`P,##H, M#`P,#`P,#`PZ.CHZ.@PZ##HZ.C`Z.CHZ,#`P.C`Z.CHZ.CH,.@PZ##HZ.@PZ M.@P[##HZ.CHZ.B8P.CHP#`P,)CHZ##`P.C`P,#`F,#LP)C`Z.CHP,#`Z,"8P M.CHZ1@H*"@HK*PH*"BL*"@HN+A$1$1$1$1$1$1%`2P4%$1$%$1$1$1$1$1$1 M$041!1$1$04%!1$1$04%!1$%!1$1!1$1$04%!1$1!04%(@4%(@4B!2(012I% M144("`@("`@("$L(2PA+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2R)+ M2TM+2TLB2TLB2TM+2TLB(B(B2TL12TL12R(B2R)+$4LB(B(B2R)+$2(B2Q%+ M(B)+2TM+(B(B(@4B$$5%145%145%145%145%!D4&108&109%!D4&144&109% M!D4&109%145%145%145%145%145%145%145%144&109%+@Q&1D8,,"Q(*TA( M*RLK2#HQ##$Q,0P,##$Q,0PQ,0P,#`PQ#`P,,0P,#`P,##$,)B8,.CHZ.@P, M##H,##H,#`P,.CHZ#`P,.CHZ.C`P)@PP.CHZ.CHZ.@PZ##HZ.CHZ#`PZ)CH, M.CHZ##H,,#LP,#HZ.CHZ##HP,"8Z.CHF,"8P.S`P)B8F,#`P,#`P,#`P,``L M"BLK*RLK*RLK*PH**RP1$1$1$1$1$1$1$1%`$1$10!$1$1$1$1$1$04%!1$1 M$04%!1$1!1$%!04%$041!04%$041!041(@4%(@4B!05%12HB11`B$$4J(B(B M(DL((B)+"$M+2TM+2TM+2TM+2TM+2TM+(B)+2TM+(DM+2TM+(DL12TLB2TL1 M2Q%+2TLB(DLB2TLB2TLB2TLB2R)+(B)+(B(B2R(B(B(B(B(B(B)+(B)+(B(B M(B(%(B(B(B)%145%144&109%!D4&144&145%144&144&109%145%145%145% M145%145%145%145%144&144&144&109%109%!BXN,3$Q2CH[*RM(*TA(2$@Z M#`P,,3$Q,3$,,3H,#`P,#`P,##$,#`P,##HZ.@P,.C$F)C`Z.CHF)B8,##HZ M.CHZ.@P,#`PZ,#`P,`PF,#HP.@PZ.CH,,"8Z##HZ.CHZ.@PZ##`Z.CHZ.CHZ M.CHP.S`P,#`,.CHZ,#`Z.CHZ,"8Z)B8F,#L[.S`P,"8P,#`P,#`Q"BLK*RM( M*RLK*RL**S\*!A$1$1$1$1$1$1$1$1$1$1$1$1$1$1%.$1$1$04%!1$1$04% M$1$1!1$%$04%!04%!1$%!2H1!041!05%*D4B*D5%12I%$!!%(D4012)+"`A+ M"$M+2TM+2R)+2TM+2TM+2TM+2TM+2TL12TM+2TL1(B)+2TL12R(B2TM+$4LB M2TLB(B)+(B(B(B(B(B)+$2(B(B(B(B)+(B(B(B(B2Q$B$2(B(B(B(@4B(B(B M!2(B145%!D4&145%!D5%109%109%!D4&145%145%145%145%145%145%145% M144&109%!D4&109%!D4&109%109%144L+"8F)@PQ.@HK2$A(2$@K##$,##$Q M#`P,##HZ.C$,##$Q,0P,#`P,.@P,#`P,.@P,#"8Z#`P,##HZ.B8,#`P,#`P, M##HZ)C`P,#`P.CHP,#HZ.CHZ.CHP)CHZ.CHZ.CHZ)CHZ.CHZ.CHZ.CHP,#`P M.SL[.CHZ.CHP,"8F)B8F)CHF,#LP,#`[.SLF.B8F,#`P`"LK*RM(2"LK*RM( M*RL_*P8%$041$1%.$1$1$1$1!04%$1$1$1$1!1$1$04%!041!1$1!1$%$04% M!04%!04%!04%!04J(A!%*A`0(A`012)%*B)%(A`B*D4J$"(0(DLB2TM+2TM+ M2TM+(DM+2R(B(DM+2R(B(B)+2R(B(DL12TLB(DL12R)+2TL12R)+(B(B(B(B M(B(B$4LB(B(B(BHB(B(B(B(B(@4B(B(B(B(B(B(B(B(B(@4B(B(B(B(J(D5% M145%145%145%145%145%145%144&109%145%144&144&144&145%145%145% M145%145%145%145%!D5%!D5%+"PL+"P[)CHP"BLK*RLK*S`Q,3$Q,3HZ.@PZ M)CH,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`PZ#`P,.CHZ.CHP#`P,,#`P M)B8F.CHP.C`,)CHZ.CHP.CHZ.CHZ.CHZ.CHZ.CHZ.CHZ.CHZ,#HZ(SL[.R,Z M.CHP,#`P,#`Z,"8F)C`C.CHZ,"8P,"8P,#`P,#DK*RL**TA(2$@K*RL*/RL& M!1$1$1$1$1$1$1$1$1$1!04%!04%$1$1!1$1!1$%!1$%!1$%$041!1$%!04B M!04%(A`0$!`0$$40$!`0$!`J$"(0*D4J12(J(A`J12HB(B(B2TLB2R)+(DLB M2R(B2TL12TLB2Q%+(B)+(B(B2Q%+(DL1(B(B(B(12R(12R(B(B(B(B(B(B(B M(B(B(B(B(B(B(@4B$`4B!2(%(B(%(B(B(B(%(@4B(@4B(@40!2)%145%145% M145%109%!D5%145%!D5%145%145%145%145%145%145%145%145%!D5%145% M145%145%145%145%12PL+"PL.R8Z,`HK*RLK*RLP,3$Q,3$Z.CH,.B8Z#`P, M#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,.@P,##HZ.CHZ,`P,##`P,"8F)CHZ M,#HP#"8Z.CHZ,#HZ.CHZ.CHZ.CHZ.CHZ.CHZ.CHZ.C`Z.B,[.SLC.CHZ,#`P M,#`P.C`F)B8P(SHZ.C`F,#`F,#`P,#`Y*RLK"BM(2$A(*RLK"C\K!A$%$041 M$041$04%!04%$1$%$041!1$%$1$%!1$1!04%!04%!1$1$04B(B(1`P,#`P9% M$!`0$!`0*A`0$!`B$$4J$!`0(BH0$"(J(BHB*D4J(BHB(B(B(A%+2Q%+(B(B M2R(B(B)+(DLB(B(B(B)+(DL1(B(B(A$B(B(B(B(B(B(B(B(B(B(B$2(B(B(B M(B(B!2(B(@4B(B(B(B(B(B(%(B(B(B(B*B(%(@4B!2(B145%145%109%109% M145%!D5%145%145%145%145%145%145%145%!D4&109%145%145%145%145% M145%144&108L+"PL+#LF.C`**RLK*RLK,#$Q,3$Q.CHZ##HF.@P,#`P,#`P, M#`P,#`P,#`P,#`P,#`P,#`P,##H,#`PZ.CHZ.C`,#`PP,#`F)B8Z.C`Z,`PF M.CHZ.C`Z.CHZ.CHZ.CHZ.CHZ.CHZ.CHZ.CHP.CHC.SL[(SHZ.C`P,#`P,#HP M)B8F,",Z.CHP)C`P)C`P,#`P.2LK*PHK2$A(2"LK*PH_*P81$1$%!04%$1$% M!04%$04%!1$1!041!04%!04%!041!1$B$04%2P,#`P,#`P,#`P,#`P8#`P,0 M$!`A$!`0*A`J$!`J$"I%*D4J12HB$"(J(BI%*B(J(B(B2Q%+(B)+$2(B(B(B M(B(B2R(B(B(B(B(B$`4B$2(B!2(B(B(B(B(B(B(1(@4B(B(B!2(B(B(B!1`% M(B(B!04B!1`B!2(%(B(%*B(%(B(B*B(B*B(J$$5%145%145%145%144&144& M109%145%145%145%145%109%.44&145%145%145%145%145%145%144&145% M145%+"XL+"P[+"8,,"P*+"PL"CL,##H,,0P,##$Q,3HF,0P,#`P,#`P,#`P, M#`P,#`P,#`P,.@P,#`P,.@PZ##`P,#`F.CHZ#"8Z.CHZ##`P,#`Z)B8F)@P[ M.B8Z.CHZ.CHZ.CHZ.CHZ.CHZ.CHZ.CHZ,#HZ.CLZ,#LP.SL[.SLP,"8F)CLZ M,#`P)CHP,#L[,#L[.R$**RLL*T@K*RLK*PH*2$@Y!04%$04%!1$1!04%!1$% M!1$%$1$%$1$%$1$%$0@B!5@#`P-8`P,#`P,#`P,#`P,#`P8#`P,&!@,#!@-% M*A`0$`40(BHB*B(J(BH0*B(J(BHJ(BH0*B(J(BHB2TLB(B(B(B(B(B(0(@4B M(B(B(A`%(@4B(B(B(DL1(B(B!2(B!2(B(B(B(@4B!2(%(BHB!2(%(@4B*B(B M(B(%!2(B(BH%(B(J(B)%*D5%*D4J11!%145%145%145%145%145%145%144& M145%145%145%145%145%145%!D5%145%145%145%109%109%144&145%12P* M"@H*+"PC##HL"@H*"@HP,3H,#"8Z.CH,.C$,)C`P)B8F.C$,#`P,#`P,#`P, M.CH,#`PZ.CH,.CH,.CHZ#`P,.C`P,#HP.CHZ.CH,.C`P.CHZ.CHZ.B8F,#HZ M.CHZ.CHF)B8Z.CHZ.B8Z.CHZ.C`Z.CHZ.SHP.S`[,#`P.SLP.CHP,#HZ.B8N M.S`Z,#LP,#``+@H**TA(2$A(*PI(*S\*!@4%$041!04%!1$%(@4%$04%!1%+ M$4L(!@,#`P,#6`,#`P,#`P,#`P,#`P`#`P,#`P,#!@,#`P8&!@8#!@8#!E@# M!@80*B(J*A`J(A`J(BHB$"HB*B(J$"HB*BHJ(B)+(B(B!1`%!2(B!04B!2(B M(B(B(B(B*B(J(@4B(B(B(B(B!1`%!2(B*B(%(@4B*B(B*BHB(B(J(BHB(B(B M*D4J12I%12I%*D4J12I%*BH0145%145%109%!D5%145%145%!D5%145%145% M145%145%145%144&145%109%145%145%145%145%109%145%144*+"PL+"PL M+CHQ)BX*"@H*+$HZ.C$,)B8F##HZ)B8Z.CHZ.@P,)B8P#`PZ.CH,#`P,#`P, M.CHZ#`P,.@P,##HZ.@PZ##L,##HZ.CHZ.CHP)CHZ.CHZ.CH[,#HZ.CHZ.CHZ M)B8Z)CHZ.CHZ)C`P)C`[.SL[.S`[,#L[.SL[.SL[,#`P,#L[.SL[,#LF.CHN M,#`P&SLL"BLK*PH*"@HK*T@_*SD%!04%!04%*@4B!04%!2H%(@@<'$8<1AQ& M'!P#6`,#`P-8`P`#`P`#`P,#`P,#`P,#`P8#`SD#`P,#!@,Y!@,<6!P<(D4B M12(B12HJ*A`J*BHB*BHJ*B(J*B(J$"HB*@40!2(B(B)+(B(B(B(B(@4B(B(% M!2(B(B(B(B(B!2(B(BHB(A`B*@4J(B(0*BI%*D5%12I%*D5%10,#145%12I% M*BI%*D4J12I%*D5%(44&109%!D5%145%144&145%!D5%!D5%145%145%145% M145%145%145%145%145%145%145%145%145%145%145%+"PL+"PN+"PN(R8F M(R,C"@HQ.CHZ#`P,##HQ##$Z,#`Z.CH,##HF.CHZ#`P,)B8,.@P,##HZ.CHZ M.@PZ##H,#`PZ.@PP,#HZ.CHZ##HZ.C`,)CHZ.CHZ.S`Z.CHF)B8Z.B8F,"8Z M)B8F)C`P)CH[.SHZ.C`[.S`[.SL[.SLP,#`P.S`[.SL[,"XP,#HF)CL[.U@L M+BPL+`HK*RM(2$@_/S\&!44B$$4B(D4B$$4J12)%12(#1C$Q'$9&'$8#`P!8 M`U@#`P,#`P,#`P,``P,#`P,#`P,#`P,Y`P8#`P8&`P8#6%A8`T4B12)%144B M1440145%*D5%144J12HJ!D5%12HJ*BHJ*B$J*BHJ(A`J(BHB$"HJ(B(J(BHJ M(BHJ*BHB*D5%!@,&`T4B12I%145%*D5%145%145%108<'$8<'`9%!D5%*BI% M*D4J12HJ*A```P`#``,#`P`#`P,#`P`#`P,#`P,#`P,#`P,``P`#`SD#`P,Y M`P8#.0,Y`P,#`#D#!@`#!CD&!@8Y.3DY.08Y.0HL+"PL"BPL"BP[)BPL+"P[ M1@PZ.CH,#`PZ,0P,##HZ)B8F.C`P.CHZ.B8F)@P,.CHZ##HZ.CHF#`PZ.CH, M,#`P##HP.C`[.C`P,#HZ.CHP.S`C(R,Z,#H[.CHZ.CHZ.CHF,"8Z)B8F)C`F M,#H[.SHZ.CHP+CL[.SL[.SL[,"8[.RXN.SL[.SLP,#LZ.CHP,#``+"PC+@HK M2$A(/S\_/TP*144B14401440$$4B145%*B)%`PP,1D9&'$8<`U@#`P`#`U@` M`U@#``,#`P,``P,#`P,&`P,#!@,#!@8&.08Y'%A86%A%$$5%12I%145%144J M145%12I%12$&!APQ1D8<!@,Y`T5%14=%1T5%12%%(45%145%12%%12%%(45% M12%%144Y`T5%145%144J145%*D4J144J144<1AQ&1AQ%109%*D5%12I%12I% M11!%`P,#`P,``P-8`U@#`P,#`P,``P`#`P,#`P,#`P,#`P,#`P8#6`8#.0,# M`P8``QPY`SD&!@`&.0!8!@8&.3DY`P8L"@H*"BPL+"PN,",K*RL*+$8Q#"8Z M.CHZ#`P,#`P,.CHZ.CHP.CHZ.B8Z.CHP,#`Z.C`Z.CHZ,#`Z.CHP##HZ.CHP M,"8P.CHZ.CH[.CHZ(S`P.CHZ.C`Z.SLZ.B8F)CHZ)C`F,"8P,#`F,#HZ.S`Z M,#`P.SLP,"XP,#`P,#`N.C`P.CHF)B8P.R8[.SLN.SL[5PHN,"PK/TQ,3$P_ M/S\_2$5%(44A12I%145%12I%145%10,,##%&1D9&'%@#`U@#6`,#`P`#``,` M`P`#`P,``P,``P,``P,#.0,`!@8&.1Q8'%@#145%*D5%12I%12I%144J145% M12I%108<,49&1@,#'`-%1T5%1T4A12%%144A144A12%%12%%144A12I%12%% M!D4#12I%12I%*D4J145%12I%12I%`QP<,48<`P8&144J12I%12I%12I%*@`# M6`,``P,<``,#``,``P`#`P,#`P,``P,#`P,#`P`#`P`#`P,&6`,&`#D#`P`# M``8#``8#!@8&!@8&``8&.3DY+`HL+"P**PHL+",P+"PL+"X^,3H,)C`P,"8P M)@P,##HZ.CHZ,"8Z)CHZ.CHZ)C`P#"8Z)B,C(S`Z##HP##HZ.CH,,#`P,#`F M.SL[.S`Z.SLF(SHZ.C`C(SL[,#HP,#`F.B8F)C`P,#`P.C`F)CLP.C`P,"X[ M,#`C,"8[.SLP,#HP.SHZ+BXN.SL[,#`N+C`P,#DK*PH*+"L_/S],/S],/RQ% M145%!CE%!@9%(45%(45%*D4###HZ1D9&1AQ8`U@#6`,#6`,#```#``,#``,# M`P,#`P,#`P,``P,&`P`Y.08`6`,`6`9%(45%*D5%12I%12I%12I%12I%144# M'$9&1AP#````145'145%145%144A144A145%(45%12I%(45%(44A.08Y!BI% M12I%144J145%12I%12I%11Q&#$9&1@8&!D4J145%*D5%12I%$"$#``,#`P`# M``,``P,#`P,#`P`#``,``P-8`P,#`P,<`P,#`P,#``,#`P,#``,#`P,Y`SD& M!@`&``8Y.08&``8&.2P**RLK*PHL+"PC)C`P,"P*&PPQ)@PZ.CHZ)B8,#`P, M,#`P,#HZ)C`Z.CHZ.CHZ,#`P)CHZ.CHZ(SH,.CHZ.CHZ.CHZ,#LZ(SHZ.C`Z M)CLZ.CHZ.CHF,#L[,"8[.CHZ.CHF)B8P,#`P,#`F.C`[)BXP,#`P.SLN,"8P M+BXN,#`Z+BXN.SL[.S`[,#HP,"X[.SL`*TA,/RPL2$A(/S],/S\L.45%108Y M(08Y(44J!D4J144J'`PZ#$9&1D8<`````P`#6`,```,#``,```,#``,``P`# M`P,#`P8`!@,#!@,Y6%@#6``&144J144J12I%12I%12I%12I%12H&!AQ&'!Q& M`U@#`T=%1T4A12%%(44A12%%(44J12I%*D4A12%%*D4A10,Y.0-%(0-%*@-% M*D4J144J12I%11Q&,49&,1P#!CDJ12I%*D4J12I%*D5%``,``````P`#``,` M`P`#``,``P`#``,``P`#``,#`P,``P`#`P,#``,#``,#``,``P,&`P,&`P8Y M`P8Y.08Y.08L"BLK*RL*+"PL(R8P,#`L"AL,,28,.CHZ.B8F#`P,##`P,#`Z M.B8P.CHZ.CHZ.C`P,"8Z.CHZ.B,Z##HZ.CHZ.CHZ.C`[.B,Z.CHP.B8[.CHZ M.CHZ)C`[.S`F.SHZ.CHZ)B8F,#`P,#`P)CHP.R8N,#`P,#L[+C`F,"XN+C`P M.BXN+CL[.SLP.S`Z,#`N.SL[`"M(3#\L+$A(2#\_3#\_+#DA14<#`T4Y144A M12%%12I%148Q.@PQ1C%&1E@#6`-8`````U@#```#`P`#```#`P,#``,``P`Y M`P`Y`P`Y.1P<6!Q8`RI%144J145%*D5%*D5%*D5%*D5%10-&1D8Q1@!8`P-' M144A12%%(44A12%%(44A144A12%%(44J12%%$"$#.3D#*D4J144J144J144J M12I%12I%'#$Q,0Q&108Y12I%*D4J12I%*D4J$``#`P,#`P,``P,#`P`#`P,` M`P,``P`#`P`#`P,#``,#`P,#`P`#`P,#`P,#``,#`P,``SD`!CD&`SD#.0,Y M.0,#+`HK*RLK"BPL+",F,#`P+`H;##$F##HZ.CHF)@P,#`PP,#`P.CHF,#HZ M.CHZ.CHP,#`F.CHZ.CHC.@PZ.CHZ.CHZ.CHP.SHC.CHZ,#HF.SHZ.CHZ.B8P M.SLP)CLZ.CHZ.B8F)C`P,#`P,"8Z,#LF+C`P,#`[.RXP)C`N+BXP,#HN+BX[ M.SL[,#LP.C`P+CL[.P`K2$P_+"Q(2$@_/TP_/RPY145%`P9%!@9%(45%*D4J M12H<,3`Z,49&1AP`6`,```,``P`#```#`P`#`P`#``,``P,Y`SD#`P`#.0`& M.0`</E@`6`9%12I%12I%144J144J144J144J108&,3$Q#!P`6`-'12%%(44A M12%%(44A12I%(2$A12I%*D4J12I%*D4A!@,Y`T5%12I%*D4J144J145%*D5% M148Q#`PQ'`8Y12I%*D4J12I%*D4J12H#6``#6`````,<``,#`P```U@#``,# M`P`#``,``P,#`P,#`P,#`P,#`P`#``,#`P,#`P,#`P,#`SD#.0,&`P8Y.3LK M"@H*"@HL+"PN#`P,#"8L1CH,##H,#`PZ#"8,)CH,)B8F.B8F.B8Z)CHZ.CHZ M,#`[)CHZ.CHP)C`P)CHZ)B8F.CHZ.CHP,",C(S`P,#LZ)B8F)B8Z.SLP)B8C M.CHZ.B8F)B8P,#`P,"8P.CLP.B,F)B8C)CL[.S`[.SL[)B8[.RXN+C`P,"XP M,#`F,"8[.SLY2#\_3$@N"@H*2$P_3$PL144A10,&(08&(45%*D5%12I%'`PP M.D8Q1D9&6`,`6`-8`U@``P`#``,``P`#`P,``P,``P`#``,#.0,&`#DY(!P< M`!P#*D5%*D5%*D4J12I%12I%12I%$`8#`PP,#`P<6`,`14<A12%%(44A(44J M12$A12I%12I%(44J12$0(2$A`SD&`P,A12I%*D5%(44J12H#*D4J109&1@PQ M1@`0.080*D4J*D4J12I%*A`J``,#``,#`P,``P``6``#`P````-8`P`#`P,` M`P`#`P,#`P,#`P,``P,#``,#`%@#``,``P,&``,Y`SD&!@8`!@,P"BPL+`HL M+`HL"BXQ,3%*.B`Z,`P,.CHZ.CHZ#`PZ.B8F)C`Z.B8Z)B8P,#`P.B8F)C`P M,#`P)C`P,#`P,",C(S`[.SLF,#LP,#`C.SL[.CHZ)B8F)CLP,#LP.S`P,#HZ M)B8P,#`P,#`F)B8[)B8[,#`P,#`P,"X[.SL[.RX[+BX[+CL[.SLN+CLZ,"X[ M.SL[($@_3#\_"BXN+BL_3#],+#E%144&!D5%13E%144J145%11PP,#HQ1D8Q M'%A8`U@``U@``P!8`P````,#``,``P`#``,Y``,``SD``SDY`QP</@,#!B%% M*D4J12I%*D5%*D4J12I%*D4&.0,,#`P,'````T5'12%%(44A12I%(2%%*D4A M*B$A*D4J12$J12I%*CD#`#DY(44A144J`T4&12%%!B%%145%1D8,,3$#.3DY M$"I%*D4J*BI%*A`J10`#6`,#6`-8``,``U@#6%@#``,``P`#``,``P,#`U@` M`QQ8``,#`P,#``,#``,#``,#6`,``SD#`P,&`P`Y`P8Y.PH*"@HL"@H*"BLK M,#`P,3$`.CHZ##HZ.CHF##HP.@PP,#`P)CH,.C`P#`P,#",F,#`F)CHZ.C`P M)B,F.SHP,#`P)CLZ.B8Z.CHZ)CHC,#`P.R8F)B8F)B,Z(S`Z.CHF.B8P)C`P M)B8F)CHN.R8F.S`P,"8[)C`N.RXN+BX[.RXN+BX[,#`P.RXN(R8F+CL[.SD_ M3#\_/T@[.SLN/TQ,3"Q'144A!CDA109%*D4J145%*D5&.SLZ1AQ&2AQ8`%@` M`%@``U@``P`#``,#``,```,``P,``P`Y`P`Y!@`Y.0`</AP``P9%*D4J12I% M*D4J*D4J12I%*A`A!@8&##H,.AQ8`P`A12%%(2$A12%%(2%%(44J12%%*D4J M(2$J12HA$"$Y.0-7.44A144J12%%*D4J145%109%10PZ.CHZ6#DY`RHJ$"HJ M$"I%*BH0*BH```-8`````P!8`P`#``,```!8`P```P,#`P`#``,`6`,#``,# M``,<`P`#``,#``,#``,#`P,#.0`&`SD#!@,Y`SHL+"PL*PHK*RLK"BPL+"PZ M6`P,.CHZ.CHZ.CHP##`P.CHZ,#`,#`P,##HZ.CHZ.CHZ.@PZ.CHZ.CHZ(S`F M,#`P(R8Z)CHP.SHZ.C`P.B8P(R8F)B8P,"8Z)C`Z)B8F.B8P)C`F,#HZ.CHP M+C`F)BXC(R,[+C`P)BXN+BXN(R,C+BXN.SL[.SLN+CLF+CL[.SM7/S](2$A( M*RLK+BL_3$PL.1`A108#13E%(45%12I%*D4J,3L[#$9&1AP@`UA8`U@#`%@` M`%@#`````P```P,`!@`#.0`#```#``-7`SD`'$8<``,&$"I%*BI%*D4J12I% M*BI%*D4J$$4#`#`Z.@Q8`%@`12$A(44J12$A*D4J(2$J12$J$"HA12I%*B$0 M*B$J13D#`SE'12%%(45%145%12I%109%*AP,,`P,.@-%12HJ$"H0*BH0*BH0 M*A`J`U@```-8`U@``U@#6%@#6!P#```#`P-8`P`#`P,#``,#``,#``,``P`# M``,#``,#``,``P,#`P,#`SD#.0,&`P8Z"BPL+"PL"BP*"@I(2$@K"E0Q#`PZ M.CHZ.CHP,#`F.CHZ.C`,##H,.CHZ.CHZ.CHZ.CHF)B8F)CHZ)C`P.S`P,"8F M)CLZ.B8Z.CHP,"8F)B8Z+BXN,"8F,#`P)CHZ.C`F,#`P,"8P,#`P(SLP,#`F M,#`P.RXN+BX[+B,C(S`C,",[.RPN+BXN+CLN+C`[.SL[5RLK*RLK2"LK*PHL M/S\_+$<A$"$Y12%%144J145%*D5%13$P.PQ&'$9&'`!8`````````````P`` M``,``P```P`#``,`.0,#`#DY`SD`!D8</E@&`RH0*D4J*D4J$"I%*BI%*BH0 M*B$&`!PZ+CHZ6%@@`R%%(44J12$A(44J12$0(2$J(1`A$"H0*A`A*A`J(3D` M`P`&12I%(45%12I%*D5%*D4J144<.C`[##H&``8J$"HJ*A`J*BH0*BHJ*@`` M6`-8`U@``%@#6`,``%@#6`,#6`,#`P```U@#`P`#``,``P,``P```P-8`P`# M``,``P,``P,#`P,#`P,`!@`&.BPL+"P*"BP*2$A(2$A(*PH<#`P,#"8F)CHZ M.C`,.B8Z.CHZ#`P,##HZ.CHZ.CHZ.CHZ)CHZ.CHF.CHZ.CL[.SL[.SL[,"8Z M(R,C)B8F)B8F.CL[.R8F,#`P)B8F)B8P,"8P,#`P,#`P)BXN,#LF,"8F)C`N M.RXN(SL[.SLP,#`P(SL[+BXN+C`[+#LP.RXN+@`K*RLK*RM(2$@K+"M,3"Q% M$"$0.3DJ!CE%12I%*D4J12I&1C$Z1D8</E@``%A8`P```````````P`#``,` M`P`#``8``P`Y`#D`.0`Y```<'%@``RHJ$"HJ12H0*BI%*BI%*A`J*A`J!CD< M,3LZ#%A86`-'(1`A(1`J12HA(1`J(1`A$"HA*A`J(2HA*A`J(2H#``,#12%% M144A12I%144J144J12I%'#HP.CH,`P,Y*BHJ!2HJ*@4J*BH%*BI8`%@#6`!8 M`U@`````6`-8`UA8```#```#`P`#```#```#``,``P`#`P`#``,#``,``P`` M`P,#`P`#`P,#!@,#`S$*+"PL"@HK2#](2"LK*PH*2@P,.@P,#`P,#`PP,#`P M,#`P,`PZ.CHZ.CHZ.CHZ.B8F.CHZ.CHZ.CHZ(S`F,#`P.S`[.CHF)CHZ.CLZ M,#`F.CHN+BXP)C`P,#`P,#`P,#`P,#`P,#`P,#HN.S`P)C`[.SLF)BXP.RXP M(R,C,#`P,#`P+BXN+BXL.S`P,"X[.SLA*PHK*RM(*RLK*RQ(3$P*1R$0(0,# M(0,&*D4J145%*D4&1C%&,1PQ,48;6````%A8```#``,``P`#```#``,``P`` M.0`Y```&`#D`.0,`/AM8``80*BH0*BH0*BH0*BH0*BHJ(BH0*D4Y'`PZ,0P# M```#(1`A$"$A(2$A$"$J$"$J(2H0*B$J(2H0*B$J*A`J``,`!B%%(44J109% M*D4J144J145%`QPZ##HZ.CDY!BHJ*BHJ*BHJ*BHJ*BHJ`%@#6`,``U@#6`-8 M`P`````#6`,#6`,#6`,``P,#`P,#`P,#``,``P,#`P`#``,#``,#`P`#`P,# M`P,``P,``P-*"BPL+"P*"DA(*TA(2$@**R8Z.CHZ.CHZ#`P,.C`P)B8F)B8F M.CHZ##H,#`PZ.CHZ.C`P,#`P)B8Z.B8C(S`P,#`F)B,P.B8F)B8C.C`F+C`F M)B8F+BXZ,#`P,",C(S`F,#`P,#`P,#`C(S`P,#LN,#`P,#`P+CLN(R,C(RX[ M+#`C.RPN+BX[+CLL,#`P+BXN1TA(*RLK*RLK*RL**S],+$<A$"$&`R%%.44J M12I%*D5%*APN.S%&,49&'```6`,``````%@``````P`#```#`#D`.0`Y``,Y M```Y.5<Y`$8<'``&(2H0*BH0*BH0*BH0*BH0*BHJ*BH&.48Z##$,.5<Y.4<A M(2$A$"$0*B$J(2H0(2H0*B$J(2HA*BH0*A`J*CD#5SE%(45%12I%12I%*D4J M12I%*D5&.CHZ.S$&.0,J*BHJ*BHJ*BHJ*BHJ*E@``%A86%@``%@``%@#6`-8 M``!8``,```,#`U@#6`-8`UA8`P`#``-8`P`#``,``P`#6`,``P`#`P,#`P,` M`P,&2@HL+"PL"@I(2"M(2$A("BLF.CHZ.CHZ.@P,##HP,"8F)B8F)CHZ.@PZ M#`P,.CHZ.CHP,#`P,"8F.CHF(R,P,#`P)B8C,#HF)B8F(SHP)BXP)B8F)BXN M.C`P,#`C(R,P)C`P,#`P,#`P(R,P,#`[+C`P,#`P,"X[+B,C(R,N.RPP(SLL M+BXN.RX[+#`P,"XN+D=(2"LK*RLK*RLK"BL_3"Q'*A`J`P,J.08J145%*D5% M*A`Q+BXZ'#$Q,5@`6```````6````P`#```````#``,``P`Y`#D``#DY`#D` M.0`;'#Y8!BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ!@-&##$Q.@`#`P`A(2H0(2$J M(2$J$"$A*B$J(2HA*BHA*A`J(2HA*B%'`P!712I%`RI%12I%145%*D5%*D5% M1CL[,#!&.3DY&BH:*BHJ*BHJ*BH:*BH`6`-8`%@#6`-8`U@#6`-8`U@#`%@# M``-8`P,``P,``P`#`P`#`P,``P`#``,#`P`#`P`#``,```,``P,#`P,#`$H* M+"PL+`H*2$@K2$A(2`HK)CHZ.CHZ.CH,#`PZ,#`F)B8F)B8Z.CH,.@P,##HZ M.CHZ,#`P,#`F)CHZ)B,C,#`P,"8F(S`Z)B8F)B,Z,"8N,"8F)B8N+CHP,#`P M(R,C,"8P,#`P,#`P,",C,#`P.RXP,#`P,#`N.RXC(R,C+CLL,",[+"XN+CLN M.RPP,#`N+BY'2$@K*RLK*RLK*PHK/TPL1R$J(3E'144Y12I%*D4J1440,2XL M,#%&2D8<6```6`!8`P,````````#``,``````P`Y`#D`.3D`.5<`.3D`/AP@ M6#DJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*@8Y1C`P##I8`%@`$"$A(2H0(2H0(2HJ M$"HA*BHA*A`J*BHA*B$J(2HJ1SDY`T5%145%12I%*D4J12I%*D5%*C$[.SHP M1CD`.2HJ*BHJ*BHJ*BHJ*AHJ6`-8`U@`6`!8`U@`6`!8``!8`U@#6`,``U@` M``-8`P,#6``#6`-8`P`#`P,```,``P`#`P`#`P,``P````,``P-&"@H*"BP* M"BLK*RLK*RL*"CLZ.CHZ)B8F.CH,,"8P,#`P,#HP##HZ,#`P,#`Z.CH[,#`F M.CHZ.CHF)B8Z.B8F)C`P.RX[(R8P,#`P)B8Z)BXF.CHZ)CLF.R8P,#`P,#`P M)B8P,",P,#`P.S`C(SLC.SL[,#`P,",N(S`P,"X[.SL[,"PN+BXN.SLN+C`C M.SL[*DA(2$A(2"LK*RM("DA,+$<J$"$#1U<Y!BI%*D4J144J!CHL+"Y*,0Q& M6%A8``!8`%@``````P`#`````P`#`#D``#D`.0`Y`#DY.5<``!Q8'%A%*BHJ M*BHJ*BHJ*BHJ*BHJ&BHJ*BH&.3$L.SLQ6`!8`"$0*B$A*B$A*B$A(2HA*A`J M(2HJ(2HA*BHJ*BHJ*D=71SDJ12I%12I%144J145%109%*D4[.SHZ.SXY.3D: M&AH:&AH:&AH:&AH:&@!8`U@#6`-8`%@#6`-8`U@#6`,```-8`P`#```#``!8 M`U@#``,``P`#`%@#`P,#``,#``,#```#``,#`P,``P`#,2P*"@H*+`I("@I( M*RLK*RL,.CHF)CHZ.CHZ#`PZ.B8Z.CHZ)CLZ.B,F.CHZ.B8F)CHZ.CHZ.B8Z M)B8F.CHZ.CHZ.CHZ.CHF,#`P,"8Z,#`C.B8F)B8P)B8N.C`P,#`P)C`P,"8P M,#`P,",P,",[(S`P,#LL,#`N+"X[.SLN.RXN+B,N+BXN.RPN+BXP.SL[.S%( M2$A(*T@K*RLK3`H*/PH`*BHA.0,Y1RI%*D4J12HJ12HZ+BPF,49&1B`````` M``!8`"`````````#`````#D``#D``%<Y5P`Y)#D`.5<@1D98`"HJ*BHJ*BHJ M*AHJ*BHJ*BHJ*BH:15<Z+C`Z,0``6``A(2$J(1`J(2H0*B$J(2HA(2HA*BHJ M*BHJ*BHJ*BI71SDY(44J12I%*D4J12I%*D4J144J.@PQ.CH<.5<Y&AH:&AH: M&AH:&AH:&AH`6`!8`%@`6`!8`%@`6`!8``!8`U@``%@#6`-8`U@#```#6`,` M`U@#6`,``U@#6`,```````,#``,``P`#``-8`#$*+"PL+`I(*RLK2$A(2$A( M(SHZ.@P,#`P,#`P,,#HZ,#`P)B8F.CHZ.B8F)B8F)B8Z.CHZ.CHZ.SLC.CHF M.CHZ)B8F)B8F)C`P,"8P.CLP,",F)B8F)C`P)C`P)B8F)B8F,"8P,#`P,"8P M+BX[,",C(R,P+CLC+C`N+BXN+"XN.RP[(RXN+BXN.SL[.RPN+BX^/S](2"M( M*RLK3$P*+C\L6"$J*@-7.440*A!%*D4J12H01C`Z,3$Q1D8<````6```(``` M`P`#``,``````P```#D``#DY`#E7.3E7.5<Y6!L;6#DJ*AHJ&BH:*BHJ*BH: M*AH:&AH:&E<Y#"X[,$8@6``Y*A`A(2HA*B$J(2$J(2$A*BHJ(2$J*BHJ*BHJ M*BHJ`T<`.44J12I%*D4J12I%*D4J12I%10P,.@Q&`U<Y!AH:&AH:&AH:&AH: M&AH:6`!8`%A8(%A8(%@`6`!8`%@``%@#6`,```!8`P``6`-8````6`,```,` M```#``````,#``-8`P,``P```P`#``,`+"LK*RM(*TA(2"L_/S\_2#LZ.@P, M#`P,)@PZ,#HP.CHZ.CHZ.CHF.CHF)B8Z.CHZ.CH[.CHZ,#LF)B8C,#L[.R,Z M.CHZ)B8F)B8F)B,[.S`[,#`P+C`F,#LP)C`P,"8F,#`P,"8P,#`F+CLP,"PN M(R,C.S`L+#`C(RPL+#`N.RPN.R,[.SLL(SL[(RPC.SL[5S\_*RLK2#\_/TQ, M"CLK+"``.1@Y.44A$"H0*D4J$"H0*C$Z,48Q2D9&&P`````````#```````` M``,``P`Y``,``#E7`#E7`%=75SE7`!L#6"`Y*BHJ*BH:*AH:&AH:&AH:&AH: M&B$Y.3`L,#%&6"`#`"$A*B$A*B$J(2HA*B$J(2HJ*BHJ*BHJ*BHJ*BHJ5P!' M.3DJ$"I%*D4J12I%*D4J12I%*E@,.C`,,1`J.1H:&AH:&AH:&AH:&AH:&B!8 M6%@@6%A8/AP@6"!8`%@@6"!8`%@`6`!8`U@`6`!8``!8``!8`%A86````%@` M````6``````````#``,```,``PHK*RLK*RM(2$@K/S\_2#\*,0P,#`P,#"8F M)CHF(R,Z.CHZ.CHZ.C`Z.CHZ.B8[,#H[.S`P,#HZ)B8Z)C`P,#`F)B,[.B8F M)B8F.BX[)C`F.R8F)C`[.R8P,"8F)B8P,#`P,#`P,#`P,#`P,"8P.SL[.RXN M+BXP,"PN+BXN+BXN(R,C+BXN.SLN(RP[+"XN+@!(*RLK2$Q,3$Q,3"L[+"Y8 M`#DY(44J*BH0*A`J*A`J$"H[,#H,'#%*1E@`6%@````````````````````` M````.0``.3D`5SE7.3E7.0!86`!8.1H:&AH:&AH:&AH:&AH:&AH:&AH:5SDP M.RX,'%@```8A(2$J(2HA(2HA*B$J(2HA*BHJ*BHJ*BHJ*AHJ*D=7.4=%12I% M*D4J$"I%*A`J12H0*A`#,0PP#$I'1R$:&AH:&AH:&AH:&AH:&AI86"!86%A8 M6%A86%A86%A86%A8(%@`6`!8`%@`6`!8`%@``%@`6```6```6````%@#```` M``````!8```````````K*RLK"@H*/RM(*RLK*S\_+$H,##HF)B8Z,"8P,#HZ M)B8F.CHZ.S`P)C`P,#`F,",Z.CL[.SL[)CHZ.CHZ.CHZ.B8P,#`[.SL[.R,[ M)C`C(S`F)B8P.SL[)C`C.SL[,#`C(R,P,#`P,#`P,#`P(S`N+BXN+#LL+BXC M+BXN(RXL+CLC.SL[.RP[.R,N(S`[.SL`2"LK/S],3$Q,3$Q,*RXF`#DY`"$J M$$4J*BHJ$"HJ*BH0#"PN,3$;1D98(````````````````P`#````.0``.0`Y M````.5<Y5U=75T=8&U@;6$4:&AH:&AH:&AH:&AH:&AH:&AH:&E<Y)BX[,%@` M``,8(2$J(2$J(2HA*B$J*BHA*BHJ(2HJ*AHJ*BHJ*BI'5P!'1RH0*D4J12I% M*A`J12H0*D4J`S$,##%&13DA&AH:&AH:&AH:&AH:&AH:6%A86%A86%A8&UA8 M6%A86"!86%@@6"!8(%@@6%@`6`!8(%@`6`!8`%@`6```6```6```6```6``` M````(!P````#/TA(2`HL*S]("@HL+"Q(/PHQ##HP#`P,(S`Z(PP,.@P,##LP M.CHF.S`F)B8P.SLC.S`C(R,C)CHZ(SHF)B8F)C`P,"8F+BXP,#`[+C`P,#`P M,#`P)BX[+B,P,",C(SLC(R,C(R,C(R,P,#`P(R,P,#`P+BXC+BXL(RPL+#LN M+"PL+B,N+BXN.SLC.RXC,#`P6$A(/TP_/TQ,3#],3$PK,%@`.3DY*BHJ$"HJ M*BHJ*A`J*BXL+B9&,1Q&6`!8```````````````````#````5P`Y`%=7`#E7 M`%=75U=76%@<6"``&AH:&AH:&AH:&AH:&AH:&AH:(3D`!BX*.RP;6``@1R$J M(2HA*B$A*BHJ(2HJ*BHJ*BHJ*BHJ*AH:*AH:`%='11`J$"HJ*BHJ*D4J*A`J M*A`J*C$N,#HQ1D=7(1H:&AH:&AH:&AH:&AH:&EA8'$98&U@;6%@;&QM8&UA8 M6%A86%A8(%@@6"!8(%@@(!P<6"``6`!8`"!8`%@`6"``6``@```@6`!8'``` M````6$A(2$@K*T@_/RP["@H*"C\K2@PP,`P,#"8Z.B8P,#HF)B8F.B8F,",C M(R,C(SLF)B,F,#HZ.CHZ.CHZ)B8F)B8F,"8P)B8F)B8F)C`P,#`C(S`P,#`P M)B8C)BXP,#`P,",P(R,C.SL[(R,C(R,C(S`P,"PC+"PL+CL[.SL[+BXL(RX[ M.SL[.SLN+"XN(S`P,`!(/S],/T@_/S\_/TQ,3"P@!E<`*BHJ*BHJ*A`J*BHJ M*CDP+BXZ,3$;&R``6"`````````````#```&```Y`#D`.0`Y`%=7`#E7.5=7 M5UA8&SY8.5<81R%'.3E'5T='.3E'5U<Y.3E'.0`*"BXL1E<@`$<A(2HA*B$J M*B$J*BHJ*BHJ*BHJ*BHJ&BH:&AH:&CE7&%<J*BHB*B(J$"HJ*A`J*A`J*A!& M"@HN+C$0`#D:&AIB&AH:8AH:&AIB&F)86!M86%A86%@;6!L<&QM8&QL;6"!8 M(%A86%A8(%@@6%A8/B!8(%@@6"!8`"`@6!Q8`%A86%@`6`!8`"``(``@``!( M2$A(*RM(/S\L.PH*"@H_*TH,,#`,#`PF.CHF,#`Z)B8F)CHF)C`C(R,C(R,[ M)B8C)C`Z.CHZ.CHZ.B8F)B8F)C`F,"8F)B8F)B8P,#`P(R,P,#`P,"8F(R8N M,#`P,#`C,",C(SL[.R,C(R,C(R,P,#`L(RPL+"X[.SL[.RXN+",N.SL[.SL[ M+BPN+B,P,#``2#\_3#](/S\_/S],3$PL```#.2HJ*BHJ*BHJ*BHJ*BHJ.RP[ M)C%*1AP`````````````````````````````.0```%<Y5U=75U=75U=8/E@; M`$='`P`#!@,&.3DY1P9%10-75U=7.4=8"BXL+$8`1P`A*B$A*B$A(2$J(2$J M*BHJ*BHJ&BH:*AH:&AH:&AI75U=%*A`J*BHJ*BHJ$"HJ$"HJ$"I%+"PL+"Q* M(4=%&F(:&AIB&AH:&F(:&AH:6!M8&U@;6!L<&U@;&QL<1AL<&QL<6%A86"!8 M6%A86"!86%@@6%@@6"!8(%@@6"`@("`@(!P@(`!&6"``6```6%@@2$A(2"LK M2#\_+#L*"@H*/RM*##`P#`P,)CHZ)C`P.B8F)B8Z)B8P(R,C(R,C.R8F(R8P M.CHZ.CHZ.CHF)B8F)B8P)C`F)B8F)B8F,#`P,",C,#`P,#`F)B,F+C`P,#`P M(S`C(R,[.SLC(R,C(R,C,#`P+",L+"PN.SL[.SLN+BPC+CL[.SL[.RXL+BXC M,#`P`$@_/TP_2#\_/S\_3$Q,+`,A(2$A*B$J*BHJ*BHJ*BHJ*CHC+CHQ2D9& M6"``6``#`````````````P``.0``5P``5SDY5U=75T<Y5T=7``!8(``A1P`` M144#10,Y13E'145%13E75U<Y6"PL"BX<`%=7(2HA*B$J*BHJ*BHJ%BHJ%AH: M*AH:&AH:&AH:&AH:&#E'5RHJ*BHJ*BHJ*BHJ*BHJ*BHJ*@PL+"X*,2$A1QH: M&F(:&AIB&F(:&F(:&AM8&QM8&QL</AL;'!M8/AL;&QL;&QL<&UA86%A8(%A8 M6!L@6%@@6"!8(%@@6"!8(%@@6%@@("!8(%@@(!L<6"!8($A(2$A(*T@_2"P[ M+"PL+@I(,0PF.B8F)C`Z)B8,.CHZ.CHZ.B8Z.C`[,#`P.CHZ)B,F.S`P,"8F M.CHZ)B8F)B8F)C`F,#`P,#`P,#`P,",[(S`P,"8F)B8P+BXN+BX[,#`P,#`P M(R,C(R,C(S`P,"XN+BXN,",L.RX[.SLN+CLL(R,[(R,C.S`L+"XP,"XN+@`_ M3$P_/S\_/S],/S\_3"Q'*BHJ*BHA(2$A(2HA*D=7*D<Q,#LZ#$8^,0``(``@ M`"```````````````#D`.0```#E75P!7.5=75U<8.5@@`!Q8`#E7`P,&!D5% M144Y108&109'.5='.3XP.RPL1@!8`"HA(2$J(2H6*BHJ*BH:*BH:*AH:*AH: M&AH:&AH:&CE7(08J*BHJ*BHJ*BHJ*BHJ*BHJ*BHP+BPL+!Q'(3EB&F(:&F(: M8AH:8AH:8AH;6!L<&UA8&QP;&QL;'!L<&QP;&QL;&QL;6#Y86%A8(%A86%@@ M6%A86%A86"!8(%@@6"`@6%A8&QP@6%@@&R`@6"!(2$A("D@_/RLL.R,C(R,* M"D8,.@PP,#`P,#`Z.CHF)B8F)CHZ)B8F,#`P,#HZ.B8F.CHP,#`C,#HZ)B8F M)B8F)B8P,#`P)B8F)C`P,#`P(S`F)B8P,#`P(RX[+"PL+CL[,#`P,#`P,#`C M,#`P(S`P,#`P(S`N(R,[+BXN(SLL.RPL,"XN+BP[.RXL,#LL+"Q&3$Q,3#\_ M/S\_/S](/TPN`"HJ*BHJ*BHJ*BHJ(2HA(2$`)CHL##%*6$8@```````````` M``,``````P```#D`5U=75P!75U=7&%=75U<;'#X@`%=71U='145%!@-%.4=% M!D5%`U='.5=8+BPL+#Y86``A*BHJ*B$J*BHJ*A8J*AH:*AHJ&AH:&AH:&AH: M&AI'&"H`*BHJ*BHJ*BHJ*BHJ*BHJ*D4J.S`Z.CM&*D=7&AH:&F(:&AH:8AH: M8AH:6!M8&U@^&QL;'!L<&QL;&QL;&QL<&QL<&QL;&QL;6!M8&U@@6%@@6"!8 M2EA8(%A86%@@6%@;("`@("`@("!8("!8*PH*"@I(/S\K.SHQ,3%*.PI*.@P, M.CHZ)C`P)@PZ)B8F)CHF.C`[.R,[.SLZ.CHZ,#`P,#`P.SLZ.B8F,"8F)B8F M)B8F,#`F)B8F)B8P,"8F)B8F.SLP+BPP.SL[.RXN,#LN.RP[.SL[.SL[.R,[ M,#`P(R,C,#`C.RXN+CLN+BXP,",P,#`L+BXL+#`P+"PL2DQ,3$P_*TA(2"LK M2#\_)BHJ*BHJ&AHJ&AH:&BHJ*BHJ(2XL"CH,1D8^```````````````````` M`````%<`5U<`.0!75SE75U=75T<`6!L<&P!7&#DY145%!D5%14=%145%`$=' M&!A'/BPN.RP@6```*B$J%BHJ%BHJ%AH:*BHJ*AH:&AH:&AH:&AH:&AH:5T=' M1RHJ*BHJ*BHJ*D<J*BHJ12HJ10HL+@PP("$A16(:8AIB&F(:8AIB&F(:8D8; M&U@;&QP;&QL;&QL<&QL<&QL<&QL;/AL<&QP;&QL;6!L;6!L;&U@;1AL;&UA8 M&U@;6!L;&QM8&R!8("!8(%@@("PK*RL**RLK"B,,,3$Q2C$L*0PZ##HZ.C`Z M.CHZ##HF)B8Z)B8Z,"8C.SL[(SHZ(SLF(SL[.RX[.SL[)B8Z.CHF.B8F)B8P M)B8F)B8P)B8P,#`P,#LN(SLN,",[.SLP,#`N+BXN+BXN(S`N+#`P.R,C(SL[ M(S`C,",L+"PN+BXL(SLC(R,C+BP[+BXP,"XN+EA,3$P_*RM(2$@K2"M(/R8J M*BHJ*BH:&BH:&AH:&AHJ*BHL+`H,,4I&&P``(``@````````````````.5<` M.0`Y)%=7`%=75SE7&%<85QL</EA&&#E'`%=%144Y1P9%1P!7(3D`1RI7*E@P M.RPL6"```"$J%BHJ(2HJ&BHJ*AH:*AH:&AH:&AH:&AH:&AH:&CD:.0`J&AH: M1RHJ*BHJ*BHJ*D<J*@,L+"X[.P`A1R$:8AIB&F(:8AH:8AH:8AH;'#Y&&QM8 M&QL;&QP;&QL;&QP;&QL;'!L;/AL;&QL<&QL</AL;'!L;'#X;&QL</AL;&QL; M&QL;&U@@("!8("`@6"`**RLK"@HL"@HC#"8F)CHQ,1LZ##HZ.CH,)CH,)CHF M)B8F.B8F)C`Z,#L[.S`F,#LN.R,F)B8F)C`P+B,[.SL[.R,P+C`F,#`P,#`P M)CLN.R8F)B8P(S`[(SLN,#`P,",[(S`[(RXN+BPN(RPP+#`P,#`C+BX[(R,[ M+BXN+"XN.SL[.S`P,"X[+B,C(RP[.SL;/T@_2$@K*RLK2#],3#\,*BHJ*BHJ M*BH:&AH:&AH:&AH:+"X*,3$Q1D8@````````````````.0``````5U<`5U=7 M5SE75Q@85QA71P!8/B`<.@-'`$=75T=75P!'5QA7````5U=7*AHQ.CH[+@`` M5U<A*BHJ*A8J&A8:&A8:&AH:&AH:&AH:&AH:&AH:&B%7&%<`&AH:10-'*BHJ M*B$J*BHJ*AI%+"P*+"Q'1T<J8AIB&F(:8AIB&F(:8AH:&QM8&U@;&QL;'!L; M&QL<&QL;&QP;&QL^'%,;/AP^&QL^&QL;&QL;&QL;'!L;&SX;1CX;&QL;&SX^ M6%@@(%@@/B`@6"XN+CLN.RP*+C$Z.CHC,3$;)@PZ#`P,.@PZ.B,Z)B8F)CHF M)C`Z)C`[.SL[,",[.SLF)B8F,"8P(SLP,#`P,",[(S`P,#LF)B8P,"8F+C`P M.SL[.RXC(RXN,#`P,#LP.SLC,#`C(R,N+BP[.RPN+BXN(SLN+CL[(SL[.RPN M.S`[.SL[.SL[.SL[(SLN(R,C1DA(2"M(*TA(2#],3$Q(.BHJ*BHJ*AHJ&AHJ M&AH:&AH:&BXN+`PQ,4I&````````````````````.0`D`%<`5P!7.2175U=7 M1U=75QA76%@</@PZ(`!'5P!'.2\8(3$L6``#*E<8*BHJ,3$Z"@PY5P``*A8J M*AHJ*BH:*AH:&AH:&AH:&AH:&AH:&AH:&AHA&%<8.1H:&AH:11HJ*BHJ*BH8 M*BHJ6"P*+"P[.2\A&F(:8F(:8AIB&F(:8AIB&AM8&QL;&QM8&QL;&QP;&QL; M'!L;&QL<&QL<&SX;&QL;&T9&/AL^&QL;&QM*&QL;&QL;&QL;&QL;&R`@(!L@ M&QL;6#XC(R,P+@HK"BXZ.CHZ(SHF5"8,)@P,##HZ.@PP.B8F)B8Z)B8Z.CHZ M.SL[.SLP,#`P.RXN+CL[(SL[.SL[.SL[)C`C.RXP.SL[.RPN+BX[,#L[.RX[ M.S`[+B,P,#`P,#`P+#LN,#`P,"XC+B,N+C`P,",C.SL[(S`C(R,L+"P[(SL[ M.SL[+CLN+BPN+#L[.RI(*TA(*T@K*RM(3$P_*SHA*BHA'"HJ*BH:&AHJ&AH: M&BHN"@HQ2DI&2@````````````````````!7`#E75SE75U=75SE7&!A'&$=' M`%@@1CX#2C%8.0``5U<J5T98``!'5R%'%BHA*C`P+"Q*5T=75RHJ%BH6&BH6 M&AH:*AH:&AH:&AH:&AH:&AH:&AH:1T<O5U<:&AH:&AHJ*BHA(2HJ*BHJ*AP* M"@HL.U='5V(:8AH:*F(:*AHJ(2$A5U<;6!M8&QL;&QL;&QL;&QL;&QL;'!L; M/AL;/AL;/CX^/AL^&QL;&QL^&QL^&QL;&QL;&QL;&SX<&QM8&QL;&QL;&R`@ M+"PL"BL**PH*(S$Q,3HC(T8,##HZ.CHZ.CHZ,#HF)B8F)CHF.CHF)BXN+B8F M,#L[.SHF)B8F)B8P)B8F(R,C(SLN.S`N+CL[.R,C+CLN+CLN+BXN.R,P.RPN M+BXN.RXP,#`N+BPL+#`C(S`L+",[.SLC,#LC(R,C+BXN+",N(RXC.SL[.RX[ M.RXN+#LL+"Q&3$@K2$A(2$A(2$A(2"LQ*BHJ*ALJ*BH:*AH:&A@`*AI'+"P* M2CY&,48```````````````!7``!7`%=7`%=75P!75U<8&%=75Q@8&``;1CX^ M`%<^,1LY5Q@Y(1L*+```5P!'*BHA*BHF"BL*#%=7&!@J%BHJ&BH:&AH:&AH: M&AH:&AH:&AH:&AH:&AH:&D<`1T<Y&AH:&AH:&AHJ*BHJ5RHJ(2$;*PH**S`Y M5T='5T<Y1T<A1SE7.5<Y1SE'&U@;&U@;6!L;6!L;&QL<&QL;&QL;&QP;&QP^ M'#X</AL^&SX;1AL^&T8;/AL^&QL;&QL;1CX;&QL;&QL;&QL;&QL;("PL+`HK M"BL*"B,Q,3$Z(R-&#`PZ.CHZ.CHZ.C`Z)B8F)B8Z)CHZ)B8N+BXF)C`[.SLZ M)B8F)B8F,"8F)B,C(R,[+CLP+BX[.SLC(RX[+BX[+BXN+CLC,#LL+BXN+CLN M,#`P+BXL+"PP(R,P+"PC.SL[(S`[(R,C(RXN+BPC+B,N(SL[.SLN.SLN+BP[ M+"PL1DQ(*TA(2$A(2$A(2$@K,2$J(2HJ*BH6*BHJ&AHJ&QHJ&PHL+$9&2D9* M`````````````#D``%<``%<`5U<`5U=75U=75U='&%='1T<Y/B`</B\A(5=7 M&UA'5SD^(RP8(5<:`!H:*A8:"@H**PQ7`%@8*BHJ&AH:&AH:&AH:*AH:*AHJ M*A8J(2\A1U<81R$85U<Y&AH:&AH:&AH:&AHJ*BHJ*BHA'"LK*RLF.0!'5U<A M`#E%10-%.3D#`P-'1R`@6!L;&QL;&QL;&QL;&QL<&QL;1AL;/AL^&SX;/AL; M&SX;/D8;/AM&4QL;&SX<&QL;&QL^&QL;&QL;&QL;&QL;&QLL+"P**PHK"@HC M,3$Q.B,C1@P,.CHZ.CHZ.CHP.B8F)B8F.B8Z.B8F+BXN)B8P.SL[.B8F)B8F M)C`F)B8C(R,C.RX[,"XN.SL[(R,N.RXN.RXN+BX[(S`[+"XN+BX[+C`P,"XN M+"PL,",C,"PL(SL[.R,P.R,C(R,N+BXL(RXC+B,[.SL[+CL[+BXL.RPL+$9, M2"M(2$A(2$A(2$A(*S$J(2HJ5RHJ*BHJ&BH:&AHJ&@`L"@HQ,4HQ1@`````` M`````````%<``#E7`%=7.5=7.2175U=7&!@85QA'`!L;1@``(2$J*BHJ(2$: M&BH:&AH:&AH:&AH:*BXP*PI*.0`@`$=75Q@Y`%<`.0,`6```.0```%<Y)#D` M5Q@````A(5<`5RH:&AH:&AH:&AH:&AHJ*AHJ*DHK*RM(+CD8`#E71T='!@9% M!@8&`T4&13D@6"!8(!M8&QL;&QL;&QL;&QL;&QL;&QL<&QL</AM&1CX</AP^ M/AP^&QP^&SX;&QL;&QL;&QL<&QL;&QL;&QL;&QL;+"PL"C](*RL*+`P,#$H, M.AL,##`C(R,Z.CH,,#HP)B8F)B8F)CHF.R,C(SLC(R8P.CHZ.CHF)B8F)B8P M.SL[+CL[.R8F)BXN+CLC,#`N.RXL+"P[+BX[(R,L+BXN+"PP+C`C.RXN+BPP M(R,C.R,P,#`C,",[.R,N.SL[.SL[(SL[(R,C(RP[+BXN+#LL+"P^3#\K*S\_ M/S\_2$A(/RM*(2$J(2HA*BHA*BHJ*BHJ&BH`"BPK,49*1CX````````````` M``!7`````%=75P!75U=75QA'1R$A(2\A&%<;'#X@(2$A*BHJ&BH:*AH:&AH: M&AH`&AH:&D<N,"P*,0``(%<``"$````#.0!8'`,#!@8#`P,Y.5=7``!'```` M1U<`5T<:8AIB&A`:&AH:&AH:&AH:&B%&2"LK"@Q75R$``"%'`T5%!@9%`P-% M!D5%("`@("!8(!M8&QL;&QL;&QL;&QP;1AL;/AL^&QL^&SX;2CX;/AL^&SX; M&QP;&QL;&U,;1AL;&QL;&QL;&QL;1D8;&PH*"@H**RP*"B,Z.CI*,0P^.C`, M#`P,)CHZ.C`Z,"8F)B8Z)B8Z.CLP,#`C,",P)B8F.CHZ)C`[.SLP.SL[.SL[ M+C`N+BXF)B8P,#L[+BXN+BXN,#`P+BXN.R,C(S`[.RX[+C`[.SLC(R,[(RP[ M+"PL(S`[.R,C(S`P,",N.SL[(R,C(R,L+BXL+"X[.SL[5#](*T@_/TA(2#\_ M/S](1B$J6"I7(%<J*BHA*BH6*BH:`"PL"D9&1D8^``````!'5P!75T<A```8 M1T<A5U='&%<85P,``R``6"```"!8(``@6!8A*A8J%BH:*AHJ*AH:&AH:&AH: M&AH:,3LK"C``5P`A1Q@A1P!8`P-8`T4&`P`&!@,Y!@,#5P!'````&`!7&!@8 M&AH:&AH0&F(:&F(:&AH:&AH:'"L**RP,.1@A5T<A5SE%144#!@,Y145'!B!8 M(%@@(!L@&U@;&QL;&QL;&QL;&QL;&QL;'#Y*&QM&/AM&/CX^/CX;/AL^&QL; M1D8<&QL;&QL;&SY&&QP;&QL;4QLL+"P*+"LK+",,5%14#"XC5#`F.CHZ.@PZ M.CH[.B8F)B8F)B8F.CHZ)B8F)CHZ.B8F)CHZ.B8N(SLN,",C(R,F,"8N+BX[ M+BXN+#`P)C`N.S`P,#LP,#`N+CLL+"PC(R,[+"PP.SL[+BPC(SLC+CL[.RXC M.SL[(SLC(R,[(RX[(SL[.SL[+BX[+"PL+CL[.T8_/T@K/S\_/S\_2"L_2#$A M(2$A(2$A(2HA*BHJ*BHJ*A@*+@I*2D9*1B`;6%@^&QP`'!Q&1AQ8&T9&1AM8 M(%@;'#Y&/AM&/EA&&UA81@`@(%A7%BHJ*BHJ%AHJ&AH:*AH:&AH:&AH:&C$L M2$@[(%@8&%<`1R%8`T4<`P8&```#!@`Y`P8Y10,Y(1A'5P```#E711IB&AIB M&AH:&A`:&AH:&AH:&AH**PH*)D<A5T<8(0`#!D4&108Y!D57!D4@("`@6"!8 M(!L;&U@;&QL;&QL;&QL;&QL;&SX;'#X;1CX;/AP^&T94/AP^&SX;/AL;&SX; M/AP^&QL;&QL^&QL;/AL^"@H*"BPK*RPZ,#HZ.B8*"@PZ#`PZ.CHZ.CHF.CHF M)B8F)B8F)CHZ.CHZ.B8F)CHZ)CLN+BXN+C`[.RXP,#`P,#`C.R,N+BXN+CLC M.S`P,#`[.SL[,#`P,",P,#`P.RPL+"XN(SL[.RX[(R,C,"PL+"P[(SL[.SL[ M.SL[.R,[(R,C(RXN+CL[+BXN+CL[.SL;/TA(2$@_2$A(2$A(2$A&(2$A(2$A M(2$A*B$J5R$J%BHJ"@HL2D9&2D9*,48^1D9&1AQ&1D9&'``;1AP<6%A8`QQ& M&QP^6#X;6!M8/B`@6!L`5U<J%BHJ*BHJ*BH@&BH:&AH:&AH:&AH,2"L_)@!8 M``````!7`$4#!@,#!@8Y``8#.0-%144#!BI'*B]7&%=75QIB&F(:8AIB&F(: M&AH:&D8:$&)%,"X**RP`1U='5R%'1T4#145%!CD&`SD&6"!8("`@("`@($8^ M&QL;&QL;&QL;&QL;&QL;&QL^&SX</CX;/CX^'#X^'#X;/AP^&SX;&QL^&QL^ M'#X;/AL^/AL^&TA(2`H**T@*)B,*"@HL"@HC#"8Z)B8F.CHZ(SHF)CHZ.B8F M)CHZ.CHF)B8P)CHF)C`P,#`P+C`F.SLP,#`P,#`P,",C+CLN+BXN,#`N)C`P M,#`P,#`P(R,C(R,C(S`[+BPN+BX[.SLL(RXC.R,P.SL[.R,[(R,[.SL[.SLC M+BXL+"PL+"PC+"XC+CLN+"PL1C\_/RL_2$A(2"LK2"LK1B$`(2$Y(2$A(2$J M(2$J*BHA1PI(2$8^1D8Q1D8^`%A&'$8<'$9&'!P`6!P#'`,#'`,<'$9&1CX< M&QM8(%@@`%@``"I7*BHJ%BHJ*BHJ5QHJ&BH:&AH:&AH:2@HK2"L``"!85P`` M5P,&`P,#!@,Y``,#.08#!@8&!D4Y5R$A(4<A`"$:&AH:&AH:&AH:8AH:&F(: M8AH:8E@Q,`H*/A@A5T<A`#E%!@8&10`&12$#12`@("`@6"`@6"`;/AL;&QL; M&QL;&QL;&QL;1DH;/AL;/AL^&SX</CX;/CX^/CX^/CX</CX^&PQ4/CX^/AL^ M&SX;/AM(2$@**PI(*R,P*RLK*PI(#"8P,#L[.SHZ#",Z.B8F)B8Z.CHZ)CHP M.CHZ)B8F)CHP)BXN+B,F.RXF,#`P,#`P,#`P,",P(R,C(RXN+BXP,#`P,#`P M,",C.R,C(R,C(S`C,"PN+"PL.RPC(SLC(RXN+BPN+BPC.SL[.SL[(RPL,",L M+"PL+BPL+B,L+"PL+!M,3$A(2"LK*RM(2"M(2$I'`"$`(2$A(2$A("$A(2$J M(2HN*T@Q,4942CX^1AM8/D8#'!P<'`,#'!Q8`P,#'!P#'!Q&1AQ&/E@;6"`@ M&P`;&Q@J(2H6*B$J%BH6*BHJ&A8:*AH:&AH:&E<_*RLK&R`@````(%A'109% M!D5%`P``109710,&`T4&!CE71R$A+P!7&F(:8AIB&F(:8AH0&F(:&AIB&AHY M,4HF,$I%(4<`(4=7109%108`5T4A.08@("!8("`@("`@(!L@&QL;&QL^2AL; M&QL;&QL;&QL;/AL;/AP^&SX^/DH^/AP^/AP^/CY&'#X^'#X^/CX^/CX^/CX^ M/BLK"BL*"@HK+BPL+"M(2#`P,#`C(R,P.CHZ.B8F)B8F)B8Z,#H[,#HZ.B8F M)B8P+BXN+BXP(R,C,#`N(R,C+CL[.R,P,",C(R,N+BXN+CLC(R,P,#`P,",C M(R,C(R,C(R,C+BXN+CL[+B,[(R,N+BX[+#LN+B,[.SL[.R,C(RX[+CL[.RPN M+#L[.RPL+"P@3$Q(/T@_2$A(/S](/T@Z1T<;+R$A(2$A(2$A(2$A(2$A#"LK M.C$Q1D8Q/D8^1D8Q`QQ&1@,<'!L<'`,#'$8<`QP<'!Q&&T8@6!L;6!L@'#XJ M*BHJ(2HA*BHJ(2H65RHJ&BH:%AH:&AH:+$@**T985P`Y(``@144&`T5%!E<` M!@8Y144&`P-%`P``5QA7&$<Y&F(:8AIB&F(:8AIB&F(:8AIB&F(:8D9&2C`C M&U='`"%'`#D``"$D5P`8(0!7("`@("!8("!8("`^6"`;&QL;&QL;&QL;&QL; M&QL;&QL^&SX^/AL^'#X^1CX^/CX^/CX^/CX^/CX^/D8^/CX^/CXI2CX*"@HL M"BLK2"LL+"PK*RLC.CHF,#`P,#`C,"8Z)B8F)CHF.CHF.S`F)B8F)B8F)CLC M+BXN,",[.R,P+C`P,"8F)B,P)B8C(R,C(SL[+B,[.SL[(S`P+C`P,",C(SL[ M(R,C,"XN+BXL+",N.SL[+BXN+B,C(R,C.SL[.R,L+CL[(RPL+"PL.R,N.RXC M+BXN2DQ,2#],/TQ,3#\_2$A(2D='1R\O+R\A(2$`(2$A(2$A(3$_2"Y&1E0^ M1D8Q2D9&1@,<1AP#`QQ&'!P#`QP<'`,<'!P#'!P<1B!8(!L``!M8%B$J(2HA M*B$A*BHJ*BHJ%BHJ&BH:&B`:&CY("D@C````("`@`#E%!@,#144&`#E%!E<& M145%144#5P`8````.6(:8AIB&F(:8AIB&F(:8AIB&AIB&F(:##HZ,#$8`%<8 M1P``5P`O1U=7`!A8)"`@("`@(%@@("!8/B`;(!L;&QL;&QL;&QL;&QM&&QL^ M&QL;&QL^&SX;/CX</AL^/CY&/CX^/CX</CX^/CX^/CX^/CX^"@H*+`HK*T@K M+"PL*RLK(SHZ)C`P,#`P(S`F.B8F)B8Z)CHZ)CLP)B8F)B8F)B8[(RXN+C`C M.SLC,"XP,#`F)B8C,"8F(R,C(R,[.RXC.SL[.R,P,"XP,#`C(R,[.R,C(S`N M+BXN+"PC+CL[.RXN+BXC(R,C(SL[.SLC+"X[.R,L+"PL+#LC+CLN(RXN+DI, M3$@_3#],3$P_/TA(2$I'``!'+R\O+R\O(2$A(2$A(2$`/S\N2D9&1D9*1D9& M1C$#`QP#'`,<'!P<`QP<'!P#!D4#`P,<'#X@```@6``;1R$A(2$A(2$A5R$6 M(2$J%BHJ%BH6&BH:2AI7*T@*"AL``"``(``#145%109%`````Q@#145%!D4` M1U<`&```.6(:8AIB&F(:8AIB&F(:8AIB&F)B&AIB&ALP+BPC1@!7&!@`5U=7 M1U<``"0Z"D8@("`@("`@("`@("`@(!L@&QL;&QL;&QL;&QL;&QL;&QL^&SX; M&SX;/AL^/CX^/AP^/CX^'#X^/CX^/CY&/CX^1BD^/@H*"BP**RM(*RPL+"LK M*R,Z.B8P,#`P,",P)CHF)B8F.B8Z.B8[,"8F)B8F)B8F.R,N+BXP(SL[(S`N M,#`P)B8F(S`F)B,C(R,C.SLN(SL[.SLC,#`N,#`P(R,C.SLC(R,P+BXN+BPL M(RX[.SLN+BXN(R,C(R,[.SL[(RPN.SLC+"PL+"P[(RX[+B,N+BY*3$Q(/TP_ M3$Q,/S](2$A*1T='&"$O+R\O+R\O+R$A(2$A(2X_*T8^1CY*2D9&/D9&`T4# M'`,#'$9&1@,#1D8#'!P<'`,#'!Q&6````"`;(%<A(2$A(2$A(2$A(2H6*B$J M%BHJ*BH6*AHJ&D8*+BP,```@``!7)$4`5P``1P``4@```$<A5P`8)`!'&%=7 M```:&F(:&F(:&F(:8AIB&AH:8AH:&AIB&AH06#`P+C``5U<8``!7(5='5SE7 M1DI8("`@("`@("`@("`@(!L@&SX;&QL;&QL;&QL;&QL;&QL;&U,;&SX;&SX; M/AL^&SX^&SX;/CX^/CX^/CX^/CX^/BDI/CX*"D@*+"L**RLK*RLK2"LZ,3HC M,#`P(SLZ.S`Z)B8F)CHZ,"8Z.CHF)B8F.B8F+CL[+BXN(R,[+CL[,"8F)B8F M,#`C,",P,#`P.RPN.R,C(R,C+C`P.RXN,#`P,",[.SLC(RX[.SL[(SLL+"PL M.SL[+",C(SLN.SL[.RPN+CLC+"X[.SL[.RXN.RX[.SL[1DQ,2$@_3#\_/TA( M2#],+D='1QA'+R$`+R\`+R\O+R\O(2%&2$@F1D8Q,49&1D8Q'!P<1AP<'`,< M1AP#`QQ&`QP<'!P#`U@^&SY8&P!8($<A(2$D`"$A(2$A(2$A(2$A5R$J%BH6 M*BH6*A8:,2X*"CX````@``!'`%<`)$<``````%=')"%7`%<`5U<A5R%'&AH: M&AH:&AH:&F(:&@-B&AH#&F(:&F(:&AH`.B8F,0`8&$<8)$=8"BP[,$881R`@ M("`@("`@("`@("`@&R`;(!L;&QL;&QL;&QL;&QL;&QL;&QL;/AL^&SX;/AL^ M&SX^/CX;/CX^/CX^/CX^/CY&*3Y*"@H*"@H*"BL**RLK2$@K.S$C)B8F)C`P M.CHP.CHZ.CHZ.B8Z.CHF)B8F)B8F.SL[+BXN+C`C.RXC)B,F)B8F)C`P,#`P M,#`P,#`N+BPN.RXN+BXN+"XN+#`C(R,[.SL[.S`L.SL[.RPN.RX[+"PL+"PL M(R,N+BXL+"PN+B,[(RX[.SL[.RXN+CLL+CL[.SY,3$A(2$A(2$A(2#],3#%' M1T<8&$='1R\A1R\O+R\O+R\O+PI(+$HQ2D9&1BE*,1P#`QP<'`,#'!P;`QQ& M1@,#"$4&`P,<6!M8(#X`(``A(2$A(2$A(2$A(2$A(2$A(2$J(2HA*A8J*A8J M*A@Q+BXZ`"````!7&"0``"!75Q@``!LQ1AA'&"085P!7(1H:&AH:&AH:&AH: M&AH:&AH:&AH:&AH:&AH:&AH:&@!*.C`,`!A'5P!7`$8**T@K5U<@("`@("`@ M("`@("`@("`@/B`@&QL;&QL;&QL;&QL;&QL;&QL;4QL;&QM3&SX;/CX;/AL^ M/AL^/CY&1CX^/CXI/E0^/BPL"@H*"@H*"BLK*T@K"@I&.C`C(R,F)CHF.S`Z M.CHZ.CHZ.CHF.B8F)B8Z,#LN.R,P,#`[(R,C+B8F,#`P,#`C,#`P,#`P,",P M,#`P+"XL+"PC+BPL+BXL,#`P+B,[.SL[+"XN+CLC(SLL(RXC(R,L+",L+"X[ M+"PL+",C.SLL.R,C(RXN+BX[+"P[.SL83$Q,2$A(2$A(2$Q,3$Q*&$='&!A' M``!'1R$A(4<O+QL`+R]&*RLF2D9*2D9&,49&10,#"`,#'$8^'`,#1CX<`P98 M6!M&/AL`(!L;6!LA(2$A(2$A(2$A(2$A(2$A(2$A(2$6*B$J%B$J%BH61PPF M(S$@`"```%<`(```)%<Y`"1&#"-7)```5Q@D`"$:&AH:&AH:&AH:&AH:&AH: M&AH:&AH:&AH:&AH:&AH:(0`;,0P;5Q@`1P`,*T@*"E<`("`@("`@("`@("`@ M("`@($H@&R`^&QL;*1L;&QL;&QL;&QL;&QL;4U1&4QL^&U,;/AL^&SX^&SX^ M&SX^/CX^1BE41CXK*T@K*T@K"BLK*RLK"BLN2CHZ.CHZ.B8F,"8P,#HZ.B8Z M.CHZ.B8Z.CHF.CLC,#`P(R,C)CLC(R8F,#`P,#`P,#`P(S`P,#`P,#`P(R8L M+BXN,#`[+#LN.R,C(SLC.R,[+BXL+"P[+#`N.RXC(R,C.RPL+"PL(R,C(RPL M+"PL+#L[.SLN+BX[+"X[.SL[2DQ,3$Q,/TQ,3$Q,3#],.AA'1Q@8($='1T=' M1P(A(2%'+R$O`@P**S%*,49&2D9*/AP<'!P^'#X</E@^1D9&'$98&UA&&QP@ M`"!8/AL8+R\O+R\O+R\O+R$A(2$A+R\@(2$A(2$A%E@6(2H6*A9&)C`P,0`` M)%<D````5RI'2CY8+T<O5P`8```8(2$:&AH:&AH:&AH:&@`8&AH:&AH:&AH: M&AH:&AH:&AH:&AH:&CD;!AL#(4<Y/CHL+"Q'1R!2("`@("`@("`@("`@("`@ M("`@2B`;&SX;&QL;&QL;&QL;&QL;&QL;&U-&&QL^&SX;/AL^&SX;/CX;/AL^ M/CY4/CX^"@H_/TA("@HK2$A("DA(*T8,.C`P,#HF)CLF,#L[.SLC.R8Z)CHF M)B8F.C`[.SLF)C`P,"8P)BXF,#`P,#`P)B8P)C`P,#`P,#`C,#`P,"XN+BXP M,"X[(S`C(R,[(R,N+"X[+BXN+BPL(RXN(SL[.SLN.R,N+BPL+"PL+"PN.RX[ M.SL[.RXL+"XL(SL[.T9,3$Q,3$Q,3$Q,/S],3$H8&$<80AM'1T='1T='1T=' M`"$"(2$D,`HN,4I&2D8Q/D9&&SX</D8^&SX;'#X^/CX^/AL@1CX^&R18&U@@ M`"\O+R\O+R\O+R\O+R\O+R\O+R\O+R\A+R$D(2$A(2$A(2H^)CI*`"1'```@ M5U=7`"8K"C`;5U<81P`D+QH:&AH:&AH:&AH:&AI7&!H:&AH:&AH:&AH:&AH: M&AH:&AH:&AH:&AH:&F(:&AI'&@-B&D<@("`@("`@("`@("`@("`@("`@("`; M&QL;&QL;&QL;&QL;&QL;&QL;&PP;4U,;4QL;/AL^&U,^/AL^/CX^/CX^*2D^ M/BPL/S]("@HK*PH*"DA(*TA*.@PC(R,Z)C`F)B8P)B8F,#`F.CHZ)B8F)CHC M(SLF)B8[.SLP,#`[,#`P,#`P,"8P.R,P(S`P,#`C,",P(S`L+"PC+BXN,#`C M(R,C(SLC+BP[+"PL+"P[+CL[.R,[.SL[+CL[+BPL+BXN.RPL+"PL+BPL+"PL M+"PL+",[.SM&3$Q,3$Q,/S\_/S\_3$P,&$=2&$(8&$='1T='1T='1T='1T=' M(0`N"CI*2D9*1D8^1EA&/D8^1B``&T8^,2X[&U@;1B`^'!L`&QL@`"\O+R\O M+R\`+R\O+R\O`$<O1T='+R\O+R\O+R\A(2$A(2$A(0`;,4HY&%<`)%=7)!LP M.RPN/@```!8`+R$6&AH:&B`:&AH:&AHJ&AH:&AH:&AH:&AH:&AH:%A86%AH6 M&AH:&AH:&AH:8AIB&F(:8AIB4@`@&R`@("`@("`@("`@("`@("`;("`@&QL@ M&QL;&QL;&QL;&QL;&QM4&QL;&QL;4QM3&U-&&QL^&SX;/AL^/BDI/CXL+#]( M"@HK2$A(2$A(*S](2@PF(R,C)B8[.R8P.SL[.S`C)B8F.B8Z.CHC+B,[.SL[ M.SL[.SLP,#`P)C`P,#`P(R,F,",P,#`P,",C(S`C,#`P+"XN.R,P,#`P,#`C M.RXL+"PL+"PC(RXL+#L[.SL[.SL[(RXN.SL[.R,C.R,[.SLL+"PL+"PL+",[ M.SL[/DQ,3$Q,/S\_/S],3$Q,2A@8&$HD0A@81T<81T='1T='1T='1T='`",* M.DI*1C$I'$H^/CY&&QM75QL^1AM&)C$;&U@</B!8(```+R\O1R\O+T<A+T<O M+R\O+R]'1T='1R]'+R]'+R\O+P`A(2$A(2$A(1@`&QL`````5U=*"@HL.AL` M``!'(2$A%A8:%AH6&AH:&AH:&AH:&A@:&AH:&AH:&AH:&AH6%A86*A8:%AH: M&AH:&AH:8AIB&F(:&D0@1"``(!L@("`@("`@("`@("`@/B`@("`;&QL;(!L; M&QL;&QL;&QM4&QL;&QL;&QL;&QM3&U-4/AL^&SX^&SXI/CX^"@H_2`H*"BLK M2$A(*S\_/THP(R,C(R8[(S`F,#`F)B8C.CHF)CHZ.SL[.RXP(SLF)CL[.RX[ M+CLF,#LF)B8P.S`[,#`P,#`P,#`P,",C(S`P,"PN+#LC,#`N+BX[.RPL+BPP M.SL[.RXL+",C(R,C(R,[(R,[(R,C(R,[.SL[.SL[.SL[+"PL+",[+BPL+`!, M3$Q,/TP_/S],3#\_3#!7&!A"0B1"&%(81T<81T='1T='1T='1T<`#`H,1DI& M&SY&&QP;/B`A&QL81CX81Q@`&U@;/E@;`!L8+T<`1R\O1R\O+R\O(2\A+T=' M1T='1T<O+T<O1U(;1R\;(2$A(2$A(2$A(2]2+R$D)``D+R0^##H"0D<A+R$O M(2$A%AH:&AH6&AH6&AH:&AH6&A@:&AH:&AH:&A86%B$6(20A%AH:&AH:&AH: M&AH:&AH:&AH`1`!21"`;("`@("`@("`@("`@(#X@("`@("`@(!L;&SX;&QL; M&QL;&QL;5!L;&QL;&QM3&QM3#!M3&U,;/AL^/BD^/@H*/T@*"@HK*TA(2"L_ M/S]*,",C(R,F.R,P)C`P)B8F(SHZ)B8Z.CL[.SLN,",[)B8[.SLN.RX[)C`[ M)B8F,#LP.S`P,#`P,#`P,#`C(R,P,#`L+BP[(S`P+BXN.SLL+"XL,#L[.SLN M+"PC(R,C(R,C.R,C.R,C(R,C.SL[.SL[.SL[.RPL+"PC.RXL+"P`3$Q,3#], M/S\_3$P_/TPP5Q@80B0D)$(8&!@8&$<81Q@8&T='1QA'1T<;,#I&2D9&/AL^ M```@&$<A`"XL+C$@6"``&SX@("``1R$A`B$A1R$O1R%'+P(O+R\O1T='1T=' M1T='1T='4D='1R\O+R\O+R\A(2\O+R]'+R\O+R]'+T<O+R$A(2$O(4<A+Q86 M%BH6&A8:&A8:&A8:&AH:&AH:&AH:%AH6%B$6%A86%A86%A8:5U<8&AH:&AH: M&AH:4@!$(`!$("!$("`@("`@("`@("`@("`@("`@("`@(#X;(!L^&QL;&QL; M&QL;5!L;&QL;&QM3&QL;4QM34QM3/CXI/CX*"C]("@H**RM(2$@K/S\_2C`C M(R,C)CLC,"8P,"8F)B,Z.B8F.CH[.SL[+C`C.R8F.SL[+CLN.R8P.R8F)C`[ M,#LP,#`P,#`P,#`P(R,C,#`P+"XL.R,P,"XN+CL[+"PN+#`[.SL[+BPL(R,C M(R,C(SLC(SLC(R,C(SL[.SL[.SL[.SLL+"PL(SLN+"PL`$Q,3$P_3#\_/TQ, M/S],,%<80D(D)"1"&!@8&!@8&!@`4AA'&$='&$<81T<;#$8^1AL<1CY8``!' M1T<*+`H*(!M8/E@;("0`1R%'1R]'`B%'1R]'+R$A1R]'1T='1T='+QM21T=' M1T='1T='1T<O+R\O+R\O+T='+T<O+T<O1R\O+R\O(2\O(4<A+R\A(2$6*BH: M%BH:%AH:&A8:&BH6&A8:%AH6%B$A%B$6(186(186%A8:5QH:&B`:&AH:(%)2 M`%)2(`!2("`@("`@("`@("`@("`@("`@("`@("`@("`@/AL@&QL;&QL;&QL; M&QL;&QL;&QL;4QM3&QM3&U,^2CX^+"P_2`H**TA(*RLK/S],/S$P(S`P,#H[ M.R8[.CLZ.CHP.B8F.C`F.SL[.R,N.SLF)BXN+BX[.SLN+CLP,#`F(SLN)C`P M,#`P)C`P,#`[(S`P,#LN+"PP(R,[.SLL+BX[+"PL+"PL+BXN+"PL.RPL+#LC M.SL[.R,[.SLL+"X[.SL[+BXN+"PL+"PL+BPL+$H_/S\_/S\_/S\_3#],3$I7 M5T(D)"0D)%<8&!@8&!@8&!@8&!@8&!@81QA'1Q@"1D8;/AM&/AL;)$='"@HK M(P`@("``($='1T='1T='(0!'1T='1T='1T='1T='1T='1T=21T<81T='1T=' M1U)'1T='1R]'1T='1T='1T='1R]'+R\O+R\A+T<A(2$A1R$O(186%BH6*AH6 M&A8:&A86%A86%A86%A8A(186%A8A%A86(186%D(:&AH:&AH:&AH`4E(`1%(@ M1%)&&R`@("`@("`@/B`@("`^("`@("`@("`@("`@("`;(!L;&QL;&QL;&QL; M&QL;&QL;&QM3&QM34SXI/B,C/RLK"BM(2"LK*TA,/TQ4,#`Z.CHC,#HP,"8[ M(R,C.B8F)B8F)CL[.SLN,#`F)C`C(R,F)B8[.RXN)B8F,",L.RXN.RXN+B,C M(RXP(SLP,#`[.RXL(SLC.SL[(SL[+"PL.RPL+",[(RPL+"PL+"PN+#L[+BX[ M(R,C(SL[.R,C+BPL+"XC(RX[(RXL+"PZ/S\_3#\_3$Q,3$Q,/S\I5R!"0B0D M)"08&!@8&!@8&!@8&!@8&!@8&!@8&!A'1QA'`!L^&T8;&R!'1QLL"DH``"!7 M`$='1T='1T='1T='1T='1T='1T='1T='&!A'1T='&QA'4D='+T<O1T='1T=' M1P!'1T='1T='1R]'+T='1R]'(4<O1R\A1T<O1R%'(2$A(186%A86*A8J%BH6 M%B$6(2$A(2$A(186&A865R$6%B$6%A97&E<:&AH:&AH:4@!24@!24@`@&U(@ M1"`@("`@("`^("`@("`@("`@(#X^("`@("`@("`@&R`;&QLI2AL;&QL;&QL; M&QM3&QM3&SY4/CXF)C\K"@I(2$@K*RM(3$P_2C`P,#`P)CHZ.S`Z.S`P,#`P M,#HF)CHN+BXC.S`[.SLN)B8F,#`F+CLP+BXN+B8C.R,N+"XN+BXN+#LC+C`C M(R,C(RXC+BPN+BPL+"XL+BXL.SL[.SLC.SLC+BXN+"PL+CLN(SLL+"PL+"PL M+",C+"PL+"P[(RPN.SLC+BXN2C\K/S\_3#\_/TQ,/TA(1B0@5T(D)"0D0E=" M5T)"5T(80E<85Q@8("`8&!@8&!@8&!A2&``@`$8D1T='1P!'&$='1T='1T=' M4D9'1T='1T='1T='1T<8&!@8&!@81T='1Q@8&$='1T<O1T='1T='&!A21T<8 M1T='1T='+T='1R]'+T<O1R]'+R\O1R%'(4<O(2$A(2$A%A86%A8A(2$A(2$A M(2$A(186%A8J(3X6%B$A%A8:%AH:&AH8&AH:&E)2`%)2`%)2(%(@1"`@1"`@ M("`@("`@("`@("`@("`@("`@("`@("`@("`@&R`;&R`;&QL;&QL;*1L;&QL; M&QL;4SX^.SL_/RL*2$@K"@H*2#\_2"DF(SHZ.CHF.CH[.CH[.SLC,",[.SHZ M.SL[,#LF+CLF)C`P,#`P,",[+C`N+BXP,"PP(R,[+BXN(RXL.SLL(S`P,#`N M+BXN.RPN+BXL+"PN+#LL(R,C(SL[.R,[+"PL+"XL+#LN.SLL+"PL.RPN+#LL M"@H*(SL[+BX[.RXN+AM(*RL_/TQ,3$Q,/RM(2$I75T)"5R0D)$)"5T)70D)" M0D(80AA"5Q@@&%<8&!@8&$)"0A@8&!@8&!@81QA'&$='`$='1T='1T<`1P`; M&$='1T='1Q@8&$08&!@8&!@8&!@8&T='1T='1T='(4='1T='&!A'4D='1T=' M1T='1T<O1R\O1R]'+T<O1R%'(4<A1R$O(2$A+R\A(2$A(2$A(2$O)"$6%A86 M&AH6%A86%A8A(2$6%AH6%AH:&A8:&AI2`%(`4E(`4E(`1``@4B`@1"`@("`@ M("`@("`@("`@("`@("`@("`@("`@("`@("`;(!L@&QL;&QLI&QL;&QL;&U,; M4R8F/TA("DA(*PH*"BLK*RM*.CH[.SLZ.CHZ.B,F.CHZ.SLC,",[,#L[.S`[ M)CLC)B8P,#`P,#`P,",C,#`P.RX[+BXN+BPL+#L[+"PL.S`P,#`P+B,P(S`C M,#`P.RPL.RXL+",C(R,C.R,C.RXL+"PL.R,C+CLN(R,C(SL[(RXL+"PL+#L[ M.SLN+BXL+"P@+`H**S],/S\_/S],2$@@)"0D)"0D)"0D)"0@("!7)%="0D)" M5T)70E<8&"`8&$)"0B0@0D)"&!A"&!@81QA'&%(81QA'1QA'2D='1T='&!A' M1T='&!@8&!A'&!@8&!@8&`!'&$='1T='1T<O1T='&$<8&!@8&$='1T<81T<O M+R\O1R]'+R\O1R]'+T='+T<O1R]'1R\O+R\O+R\A+R\O(206*A86%A86&AH6 M&A86%B$A(186%A86%AH:&AH64E)24@!24@!24E)2($0@4B`@("`;("`@("`@ M("`@("`@("`@("`@("`@("`@("`@("`@&R`I(!L@2AL;&QL;&QL;&U,Q,3]( M2`HK2`HK*RL*"@HK2B8Z(R,C.CHZ.CHC,#HZ.CHF.CHC)CHC(R,F.S`C(R8F M,#`P,"8P,"8C+B,C(SLL+BPN+#LN+BX[+"PN.SLL+"PL+"XN.R,C,",C(R,N M+BPC.SL[.SL[.R,C+BPL+BXN+"X[.SLN+BXN+CL[+CLC+"PL+"PN.RXL+BXN M+"PL`"PL+@I(/S\_/TA(3$Q,2B`D)"0D)"0")"0D)#XD)"0D)"0D)"1"0D)" M0E="&$(8)"0@/B`D)$(D0D(8&!@8&$<81QA'&$='1T<81Q@81T='1T='1Q@8 M&!@81T<8&!@8&!@8&$='1T='1T='1R]'1T='1T='1T='1T<81T='`B\O+R\O M+R]'+T<O1R]'(4<O1R\O+R\O+R\O+R\O+R\A(2$A%A86&AH:&A8:&A8:%A8A M(2$A)"$A(206%A86&E(`4@!24@!24E(`4E(`4B!2($0@("`@("`@("`@("!& M2B`@("`@/B`@("`@("`@("`@("`@(!L@&R`@&R`;&QL;&QL;&S$_*T@*"BLK M*RLK"@I(/THF.CHZ.B,Z.CHZ,"8[.SLC.CHZ.CHP,#`P,#LN,",F)C`P,#`P M)C`P)BXC(R,L.R,N+BX[+BXN+BXL+"PL+CL[.RXL+"XP(R,C(R,L+#LN+",[ M.SL[.R,C(R,N+"PL+"PL+",[+BXN+BXN+CLL+"PL+"PL(RPN+BPN.RPL+!M( M+`HL"BM(2$A,3$Q,3$HD)"0D)"0D`@("`B0D)"0D)"0D)"0D)"0D)"1"0B1" M&$)")"0D)$(D)$)"&!@8&!@8&!@8&$<8&$<81T='1QA'&$='1QA2&$(8&!@8 M&!@^/D(8&!@81QA'1T='1T='4@!'1T='1T='1T='1T='1R]'+R\O(4<O+R]' M1T='+T<O1R\O+R$A(2$A(2\A(2$A%A86%A8:%AH6&A8:%AH6&A86(2$A(20O M+R$A(2$A%AI24@(`4@!2`%(`4AM24E(`1$0@4B!$("`@1"`@("`@("`@("`@ M("`@("`@("`@("`^/B`@("`@("`;("`;(!L;&QL;&QL^/T@_*PH**PH*"BM( M/TA*)B8F)B8Z.B8Z.CLF)B8F)B8C.B8F)CHZ.BX[.SLZ)B8P,#`P,#`P)CL[ M+BXN+B8P+"XL+BXN+B,P.RXC,#`P,#`C.RXP,#`C.SL[+B,N.RPL+",C(R,L M+B,N+"PL+"PL+"PL+",C.SL[(R,C+"PN+CL[.RP[+BXN+CLL+"Q*3$@*(PI( M/S\_3$Q,3$P,)"0D)"0D)`("`@)24E("`B0D)"0D)"0D)"0D)"0D0D)")"0D M)$)"0D)"0A@8&!@8&!@8&!@81T<8&!@8&!A'1T<81T='&!@@0A@8&!@8&$(8 M&!@8&!@8&!A'1T='1T='1T<A1T='1T<81QA'1T<O+R\O+T<O+R]'1T='+T=' M+T<O+R$O(2$A(2$A(2$6%BH6%A8J%BHJ%AH6&A8:&A8:%A86(2$A(2$O+R\A M(2$6`@!24E)24E)24E(`4E(`4E(`4D12(%(@1"`@("`@("`@("`@("`@("`@ M("`@("`@("`@("`@("`@(!L@&R`@&R`;&QL;/C](/RL*"BL*"@HK2#](2B8F M)B8F.CHF.CH[)B8F)B8F(SHF)B8Z.CHN.SL[.B8F,#`P,#`P,"8[.RXN+BXF M,"PN+"XN+BXC,#LN(S`P,#`P(SLN,#`P(SL[.RXC+CLL+"PC(R,C+"XC+BPL M+"PL+"PL+"PC(SL[.R,C(RPL+BX[.SLL.RXN+BX[+"PL2DQ("B,*2#\_/TQ, M3$Q,#"0D)"0D)"0D)"0"`@("`@)2`@(D)"0D)"0D)"0D)"0D)"0D)"0D0D)" M0A@80A@8&!@8&$(8&!@8&!@8&!@8&!@81QA'&$<8&!A"0D(80AA"0A@8&$<8 M&$<8&$='1T='``!'1T='1T='1Q@81T<O+R\O+P(O1R\"1R]'1T='1T='+R\O M+R$A(2$A(2$6(2$6*A8J%BH6%A8J%AH6*A8:%BHJ%A8A(2$A+R$O(2\A%@)2 M`%(`4@!2`%)2&U(`4E)24E(`4@!$4B!2($0@($0@("`@("`@("`@("`@("`@ M("`@("`@("`@("`@("`@&R`;(!L;&SX_2#\K"@HK"@H**T@_2$HF)B8F)CHZ M)CHZ.R8F)B8F)B,Z)B8F.CHZ+CL[.SHF)C`P,#`P,#`F.SLN+BXN)C`L+BPN M+BXN(S`[+B,P,#`P,",[+C`P,",[.SLN(RX[+"PL(R,C(RPN(RXL+"PL+"PL M+"PL(R,[.SLC(R,L+"XN.SL[+#LN+BXN.RPL+$I,2`HC"D@_/S],3$Q,3`PD M)"0D)"0D)"0D`B0@)`(D`E)2&P("(`("`@(")`(D)"0D)"0D)$(80E<80A@8 M0A@85T(8&!@8&!@80A@8&!@81QA'1T='&$<8&$)"0D)"0AA"&!@81T<8&$=' M1T='1T='1T='1T='&!@8&$='1R]'+R]'+R\O1P)'+T='1T='1R%'+R$O(2$A M(2$A(2$A)"$6%A86%BH6%A8J%BH6%A86%A86(2$A(2$O(4<A(2$``E(`4@)2 M4E)24@!24E)24@!24E)24E(@5$9$(%(@1"`@("`@("`@("`@("`@("`@("`@ M("`@("`@("`@("`@("`@&R`^/S\_*PH**RLK*PHK*RL,)C`F)B8Z.B8F.R,P M(R,C,#LF+CLZ.CL[.SL[.R,P)B8F)B8P)B8P,#LC,#`P)B8F.RXC(R,C(R,C M.RPP,",N+BX[,#`C(SLC+"PL.RX[(R,N+CL[.RPN+CL[+BPL+"PL+",[+BXC M.SL[+BPC+BPL.RPL+"PN(SLC.R,L+"PC3$PK+"PK/S\_3$Q,3$Q4)"0D("0D M)"0D)"0D)`(D)`("4E)2&U)2`B0D)"0D`@(")`(D)"1"0D)"5T)"0A@^(!@8 M5Q@8&"`8&!@8&!@81QA'1QA'&!@8&$)"0AA"0D(8&!@8&!@8&$='&$='1T=' M1T='1T='1T<8&!A'&$='+R\O+T<O+T<O+R]'1T='1T='+T<O+R\O(2$A(2$A M(20A%B$A*A86%BH6*A8J%BH6*A8J%A8A%B$A(2\A1R\O`@(``@(``@!&`@!2 M&U)2`%)24@!24E(`4AM2`$0@4B!2($0@1DI$("`@("`@("`@("`@("`@("`@ M("`@("`@("`@("`;/C],2`HK"BL*"@H*"@H*)B8F,#`P)CHF(SLC.SL[.SL[ M.SHF.CLC(R,C,#LP.R8F)B8F)C`P)C`P,#`P,"8P(S`C(SLN+BXC(RXN(R,P M+BXN.S`C(R,[(RPL+"XL(SLC+"PN+BX[(RPL+#LN+BXN+"P[+BPN(SL[.RXN M+"P[+BX[.SLL+"PL+"X[.SL[2DQ,2`HL*RLK*TA(2$A(2@(")"0")"0D)"0" M)"0D)`(D)"0D)"0")"0D)"0D)"0D)"0")"0D0D)"0D)"5T)70D(80A@8&$(8 M&!@8&!@81QA'&%)'&!A'&!@80D)"0A@80AA"&!@8&!@81T<81QA'1T='1T=' M1T<8&!@8&!@8&$='1R\O1R]&1T='1T<81T=21T<O+R\O+R\O(2$A(2$A(2$A M(2$A(2$6%A86%A86%A86%BHA(2$A(2\O+R\O+R0"`@("``("`E("`E)24E)2 M4E)24@!24E)24E)24E)2(%)$(!M$("!$(#X@("`@("`@("`@("`@("`@("`@ M("`@/AL@("!,/PHK"@H*"@H*"BL*"B8Z)C`P,"8F.CHF(R,Z.CHF.CHZ)B8N M.SL[.RXN.R8N)B8F)B8F,#`P,#`P,#`P,#`[.SLN+"PL.R,N,#`P(R,C(R,[ M(SL[.R,N+BX[+CLN+BXC(R,C+"PC.SL[.R,C(R,C+"PN+",L+"PN+CLN+"PL M+"PL+#LL+"PL.RXN+C%,/TQ(*RPK*RL_/S\_3#$"`@("``(``@`")`("``(" M)`(D("0D)"0D)"0D)"0D)"0D`B0D)"0D)"0D0B1"0D)72E<80D)"0A@8&!@8 M&!@8&$<8&$<81T<8&"`D0D)"&!@8&!A"0A@8&$<81T='&$<81QA'1Q@81Q@8 M&!@8&!A'1R%'1R%'1T='1T<81QA'1T='1R\O+R\O+R\O(2$A)"$A(2$A(2$A M%B$A(2$A(2$A(2$A(2$A(2$O+T<O1R\D)``")`("&T8@`E)2``(``@!24@!2 M4E(`4@!24E)24E)2($1$($0@1"`;("`@("`@("`@("`@("`@("`@("`@("`@ M(!L@2$@K"@H*"@H*"@H*"@HF.B,P,#`P,#`Z.S`F,#`P.B8F)CHF)B8F)B,C M(RXP)CLF)B8F)B8P(R,C(R,C,#`P.RX[+BXN+BXN+"X[,#`P,#`C,#LN+BX[ M.SL[.R,[.RXN+BXN+BX[+BX[.RPL+"PN+"PL+#LC+BXN+"PL+BPL+"XN+CLL M+"PN+BPN+BX^3$A,/S](/S\_3#\_3$PZ`@("`@("`@("4@(;`@("`@(D`B`D M)"0D)"0D)"0D)"0D)"0")`(D)"0D)"1"0D)"0D)"0D)"0A@8&!@@&!@`&$<8 M1Q@81T<8&!@80D)"&!@80D(80D)"&!@8&$<8&$='1T='1Q@8&!@80A@@ M&$='1T=21T='&!@81QA'1T<O+R\O+R\O+R\O+R\O(2$A(2$A(2$A(2$A(2$A M(2$A(2$A(2$A(2$`+R\O1P)')"0D)"0D`B0"`@(``@("`@("``)24@!24E)2 M4E(`4E(`4E(`4D124B!$1$1$("`@1"`@("`@(#X@/B`@("`@("`@("`@(`HK M"BLK*TA(2$A(*PH*.SHF)B8F,#`P)B8Z(R8F)B,F.CHF)B8F)B8P,#`C)C`F M,#`P)B8P,",C(R,C(R,P,"8P.RXN+BXL.RP[+BPN+BXN+BPC(SL[(R,C(RXN M.SLN+BX[.SLN.SLN+B,L+"PL+CLC.R,[.SL[.R,C.RXL+"X[.SLN+"PL.RPC M+"PL&$Q(/TQ,3#\_/TQ,3$Q,&P)24E)2`@)2``("&P("`@`"`AL"`B0D)"0D M)"0D)"0D)"0D)`(D&P("`@(D)"0D0D)"0B0D0D)"0A@8&!@8(!@8&$<81QA' M&$<80D(D0D)"&$)"0D)"&!@8&!@81QA'&$<8&!@8&$(8&!@80AA"&!@8&$<8 M1Q@8&!@8&$='1T='1T<O1R\O+R\O+R\O+R\O(2\A+R$O(2$A(2$A(2$A(2$A M(2$A1B$A)"\A+T<O1R0D`"0D`"0D)`(``B0"`@("`@("4@!2`@!24@!24E(` M4E)24E(`4B!2($0@1$0@1"!$("`@("!3("`@("`@("`@("`@("`C*RL**TA( M2$A(2$@K"CLQ.CHZ.CHZ.B8Z.B8C(R,F,#L[(R8C.CHZ)BX[(R,P)C`P,"8F M,#`C(R,C(R,P,",L(R8L.SL[+C`N+"PN+"PL+"X[(S`C,#L[.SL[+CL[.R,[ M.SL[.SL[.RX[+"PL+"XC(SLN.SL[.SL[.SL[.SL[(R,C.SLL+"PN+CL[.T8_ M/TQ,3$Q,3$Q,3$Q,3$HQ4E)24@!24E)24E(;4@("`@)2`@(``B0D)"0D)"0D M)"0D)"0D)"0D)"0")"0D)"0D)$(D)"1"0D(80AA"0AA"&"`8&!A'&$<8&$)" M0D)")$)"0D)"0D(@0A@8&$<81Q@8&!A"0D)"&!@8&!A"&$(8&!@8&$)"&$<8 M1QM'1R%'+R]'1R\O+T<O+R\O+R\O`B\O+R$O(2$O(2\A(2$A+R$A+R$A(2$A M(2$O+R\O+R\D)"0D)"0D)"0`)"0D("```@("``("`E("&QM4`%)24E)24E)2 M4E)2&U(`4E(@4E)$1"!$($0@("`@("`@("`@("`@("`@(PHK*RL**RLK*TA( M/RLL2CHZ.CHF.B8Z)CHZ,#`P(R8P.SL[(SL[.SLP(SLF,"8F)B8F)C`P(R,C M,#`P,"XL+CLF,"XN+C`P+B,[+BXL+"PN+#`C(R,C.SL[(SLC.SL[.RXN+CL[ M(RPL+BPL+"PN.RXL+BX[.SL[.SL[.R,N+BXN+CLL+"XL+"X[.SL^3$Q,3$Q, M3$Q,3$Q,3$Q44E)24E)24E)24E)2`E("4@("`@`"`B0")"0D)"0D)"0D)"0D M("0D)"0D)"0"`@(D)"0D)"0D)"0D0D(D)"`@)"!"&!A'&!@8&!A")"0@("1" M($)"0D)"0D(8&!@8&!A'&!@@0D)"0A@8&!@8&$)"&$)"0A@81T='1T=21T=' M1T='1R]'1T<O1R\O`B\O+R\O+R\O+R\O+R\A+R$O(2\A+R$A+R\A+R$O(2\O M+R\O`B0D)"0`)"0D)"0D)"0@)"0D(`("`@`"`AL"``)2`%)24AM&4E)24E)2 M4E)24E(@4B!21$0@1$0@1"`@(!L@("`@("`@,2,K*RL**PHK*RLK"BM("DHF M,#`P,#HZ.B8F.CHZ.B8C(SHF,",[.SLN(S`N,"8P,#`P)B8F,#`C(S`P,#`[ M.RXP,#`P,#`C(SLN+CLL+"PL+BPP,#LC(SL[.SLC.SL[.R,[.SL[+BPL+"PN M+"PL+#L[+CL[(SL[.SLC.SL[.SL[.SLN+BPL+"PL+BXN($Q,3$Q,3$Q,3$Q, M3$Q,*5)$1%)24E)24E)24@!24E("4@("`@("`@`")"0D)"0D)"0D)"`D)"0D M)"0D)"0"`@(D)"0D)"0D)"0D)"0D)"0D0A@8&!@80D(D)$)"0D(D0D)"0D)" M&!A"&!@8&!@8&!@80D(D0B1"&$(80D)"0D)"&"`8&$='2D='`$='1T='1T=' M(4<A1R%'+QLO1R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\"+R\O+R\O+R`D M)"0D/B0D)"0D)"0D)"0D)"0D)"0"`@(;`@("`@)24@!24E(`4E(`4E)24@!2 M4E)24D924D0@(!L@("`@("`@("`@,3$C*RLK"BL**RLK*PHK2`I*)C`P,#`Z M.CHF)CHZ.CHF(R,Z)C`C.SL[+B,P+C`F,#`P,"8F)C`P(R,P,#`P.SLN,#`P M,#`P(R,[+BX[+"PL+"XL,#`[(R,[.SL[(SL[.SLC.SL[.RXL+"PL+BPL+"P[ M.RX[.R,[.SL[(SL[.SL[.SL[+BXL+"PL+"XN+B!,3$Q,3$Q,3$Q,3$Q,3"D@ M("!24E)24E(`4E)24E)24E("4@("`@("`@(")"0@,20D("`D)"`@("0D)"0D M`B0"`@(D`B0D)"0@&R0D)"0D)"1"&!@80B0D)$)"&$)")"1"0AA"&!@8&!@8 M&!@8&!@@&!A"0D(D0D)"0D)"0A@8&!@81T='&$='1T='1T='1T='1T='1T=' M1QLO1R\O+R\O1R]'+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\O+R\")"0D)"0D M)"0D)"0D)"0D)"0D)"0D)"0D`@("`@("`@)2`@!24E)24E)24E)24E(;4E)2 M4E(@("`@("`;(!L@("`@(#XQ(RLK*PHK"BLK*RL**T@*2B8P,#`P.CHZ)B8Z M.CHZ)B,C.B8P(SL[.RXC,"XP)C`P,#`F)B8P,",C,#`P,#L[+C`P,#`P,",C M.RXN.RPL+"PN+#`P.R,C.SL[.R,[.SL[(SL[.SLN+"PL+"XL+"PL.SLN.SLC M.SL[.R,[.SL[.SL[.RXN+"PL+"PN+BX@3$Q,3$Q,3$Q,3$Q,3$PI("!*($12 M4E)24E)24E)24E(`4E("4@("`@("`@(D)"0D)"0D)"0D)"0D)"0D)"0D)"0" M`@("`B0D`B0D)"`D0B0D)$)"0D(D)$)"0D)"0B0@($(8&!@8&!@8&"`8&!@8 M&!@80D)"0D(80A@8&!@8&!@81Q@81T='&$='1T='1T='1T='1T='1T='1R%' M1R]'+R\O+R\O+R\O+R\O+R]'+R]'+R\O+T<O+R]'+QLO`B0D)"0D/B0D)"0D M)"0D)"0@)"0D)"0D)"0D)`("&P(`5`("4E)2`%)24@!2&QM24E)24E)$("`@ M("`@("`@&R`@("`@4S$K"@HK/TA(2$A(*PHK"DHF(R,C.B8P,"8Z)CHZ.CHZ M)B8F.C`C(R,P)B,[(R8P)B8F)BXF,#`C,#`P,#`C+C`L,",C(R,P,",P,#`C M.SL[.RP[.R,C.R,C(R,[+BXN+BX[.SLC+#LL+"PL+BXN.SLN.RXN+CL[.SLC M.RX[+"PL+"P*+BPL+"PN+BXN2DQ,3$Q,3$Q,3$Q,3$Q,#"`;("!$4E)24E)2 M4E)2`%)24E)24E)2`E("4@("`B0")"0D)"0D)"0D)"0D)"0D)"0D`E("4@(" M`B0D)"1"0AA")"0D)"0D)$(80AA"0D)"0B`8&!@8&!@8&!@@&!@8&!@8&!@8 M&!@81Q@8&!A'&$<81QA'&$<8&$='&$='1QA'1T='1T='1T='1T='1R]'+T<O M1R]'+R\``B\O+R\O+R\O+T<O1R\O+T<O+R\O+R0D)"0D)$)")"0D)"0D)"0D M)"0D)"`@)"0D)"0D)"0"`@("4E)2`E)2`AM24E)24E)24E)21"`@4R!$("`@ M/B`;("`@(%,C*PH**T@K2$A(2#\K*RM4.CHZ.C`C,#`[)CHF)B8Z.CHF)B8F M.SL[)B8Z,"8F)B8F)CLP)C`F,"8F)B8C(RP[+BPP(R,C(R,P(R,P(S`P,#`P M(R,[(SLC(R,[(SL[.RXN+BXN.R,N+BPL+"PL+"PN.RPL+"XL+"PC.RX[(RPN M.SL[+BXL+`HL+"PL+"!,3$Q,3$Q,3$Q,3$Q,3#H@(!M$($1$1%)24E)24E)2 M4E)24E)24E)24E)24@("`@(D`B0D)"0D)"0D)"0D)"0D)"0D`B0D)"0D)"0D M0D(80D(D)"0D)$)"&!A"0D)"0D)"&!@8&!@8&!@8&!@8&!@8&!@8&!@8&!@8 M&$H8&!@8&!@8&$<8`!A'&!A'&$='1QA'&$='1T<81T='1T='1T<`1R]'+R]' M+U(O4B\O1R]'+T<O1R]'+T<O+T<O1R\D)"0D)$)"0B0D)$(D0B0D)"0D)"0@ M("0D)"0D)"0"`@("4E)24E)2`E)24E)24E)21$1$("`@(%-$1$1$("`@("`; M("!32BL*"@I(2$A(2"LK2"LK5#HF)B8Z)B8P)B,F)B8F.B8Z.B8F)B8F)CL[ M.SLP)B8F)B8F.RX[.R,C+BXN.R,N+",C(S`P,",C(S`C(S`C(R,P(R,C(R,C M.SL[.SL[.SL[(R,C(SL[+CLC(RXL+"PL+"PN+"PL+"PL.R,[.RPN+BXN+BXN M+B,[.SL[.SLQ3$Q,3$Q,3$Q,3$Q,3$Q*&QL@("`@($1$1$124E)24E)24E)2 M4E)24E)24E)2`@("`@(")`(D)"0D)"0D)"0D)"0D)"0D)"0D)"0D0D)"0AA" M&$)"0D)"&!@8&!@8&!@8&"`8&!@8&!A7&!@8&!@8&!@8&!@8&!@8&!@8&!@8 M&!@8&!@@4B`8&!A'&$<8&!A'&$='&$<8&!A'1T='1Q@;1T<;1R]'+U(Q1R\O M1R%'1R%'(4<A1T<O1P!'+T<O("0D)"1"0D(8("!")$(D0B0D)"0D)#XD)"0D M)`)24E)24E)24E)2`@("`@)24E)21$0@($0@1$124E)24E(;/D0@(!L@4SL* M"@I(/T@_/S]("@I(2%0C)B8F)B8C)CLF,#`P,#HZ)B8F)B8P,#`P)B8F+B,F M.SL[)B8[+BXC)B8F)B8P)BX[,"PC(R,P(S`P(R,C(R,C,",C(R,[.R,C(R,[ M(SL[(R,L+"PL+BPC.R,[(R,C.R,[+BP[+"XN+CL[+BX[.SLL+"P[.SLN.RXN M+BXN&S](2$Q,3$Q,3$Q,3$P_/AL@("`@("`@($1$1$121%)24E)24E)24E-2 M4E)$4E("`@("`@(")`(D`B0;)"0D)"0D)"0D)"0D)"0D)"0D0D)"0D(8&$(8 M0A@8&!@8&!@8&!@8&!A"&$(8&!@8&!@8&"`@&!@8&!@8&!@8&!@8&!@8&!@8 M&"`8&!@8&!@81QA'&``^1T=2/A@81QA'&$='&$='1T='1T='`$='1T='(4=' M1T='1T<A1T<;(4='1R0D)"0D)$)"0AA"&$)"&"1"0D(D)"0@)"0D)`)24E)2 M4E)21%)2`@("`@("`E)24D1$1$124E(`4E(`4E)24E)$1"`@(%,Z"@H*"BL* M*RLK2"P**T@Z(R8F)CHF,",C)C`C(R,P.B,Z)C`P,#`P(S`F)B,C+BXN+B8F M,#LF,",C(R,P,#`N+",C+"PL+#`P(R,C.S`P,",C(SLC,",[.SL[(R,[.SLN M+BXN.RPL.R,C(R,C(R,C(SLL+BPL+"PN+",[.RPN+"PL.RXN+"XL+BXN+CX_ M/TA(3$Q,3$Q,3$Q,3$HI&QL@("`@("`@($1$1$124E)24D121$1$4E)21$12 M4E("`@("`@("`B0")`(D`B0D)"0D)"0D)"0D)"0D)"1"0D)"0D)"&!A"/B`@ M(!@8&!@8&!@8&!@8&$(85QA7&!@8("`@&$(8&!@8&!@8&!@8&!@8&!@8&$H8 M&!@8&!@8&!@8&!@@&!@81T<8&$='1T='1T='1T='1T='1U)'1T='1T=' M1T='1TH`1T="0B0D)"0D0A@8&!A"&"080D(D0D(D("`D`@("`B0"`@("4E)2 M4QL")`("4E)24D124E)24E)24E)24E)24E)24E(@(!L;,0H*"@H**S\_/S\* M(PH*2B8Z.CHF,"8[(SHP.SL[(R8F(SHF,#`P,#`P(R8F+CL[.SLF)B8F)C`P M(R,C,#`N.RXC(RXN+BXC,#`P,#`C(R,[,",C,",N.SL[(S`C,",C(RPL+#LN M+B,L+CL[.SL[.R,[.SLN+BXN.RPL+",L+#L[.RXL+BXN+BXN+BX;2$A(2$Q, M3$Q,3$Q,3$Q35!L@("`@("`@("`@("!$1$1$1$1$4T1$1$1$1$1$1%)24E(" M`@("`@("`@("`B0")`(")"0D)"0D)"0D)"0D)$)"0D)"0D(@0AA"&"`80E<8 M0AA7&$(@($(80AA"&$(85Q@8&!@8&!@82E<8&!@80A@8&!@80AA"0D)"0AA" M&!@8&$)"(!@8&$<8&$='1T='1T='1T='1T='1T='1T<81Q@81QA'1T=' M1T='&!A"&$(D)"0D0B08&!@80A@80AA")"0D)"0"`@("`@("`E)24E("`@(" M4E)24E)24U)24@)24E)2`%)24E(`4E)2("`@5#$*"@H*"BM(2$A("DHC*S$C M(R,C)CHF.S`F,#`P,#LP.B,F)C`P,#`P,#`F)B8N)B8F(R,F)B8P(S`P,#`P M+B,N(RXN+BXC,"XC,",[,#`P(R,P,",C+#L[.RXN,",C(SLC(R,L.RXL+"PN M+"PL+"XL+BXN+"PL+"PL+BPL+"PN+BXN+BPN+BX[.SL[&TA(/TQ,3$Q,3$Q, M3$Q,2AL@&R`@("`@("`@("`@(#!$1$0@1"D@($1$1$0@4T1$4E)24E)2`@(" M`@("`@("`@(")`(D`B0D)"0D)"0D)"0D)$)"0D)"0D)"0D(80A@8&$(80A@8 M0B`8&!A"&$(80AA"&"`@&!@80A@8&!@8&!@80B`D0B`D)"0D)"0D0B0D)$(D M0B1"0D(@&$<81$<81T<81T<81T='4D='1T<81Q@8&!@8&!A$&!A'1T='1Q@8 M&!@8&$(D)"0D&"08&!@D0B0D)"0D)`("`B0D("0")%("4@("`B0"`E)24E)2 M4E("`@("`@)24E)24E)24E)24D0@("`Z*T@*"BL*"@H*"B-4(PI*.R8F)B,C M)C`F(R,P,#`[(SHF)CHF,#`P,#`P,"8F)BXN+CLP(R8C,",C(R,P)C`C.RX[ M+"PL+BXN+"PP,#L[.S`P+",C(RPL+"PL.SLP.R,C.SL[(R,C+"XL.SL[.SLL M+"XN+"PN+BX[.R,[+"PL.SL[+BPL+BP[+CL[.QM(3#],3$Q,3$Q,3$Q,3$I3 M&R`I&R`@&R`@("`@("`@("`@("`@("`@("`@1"!$1$124E)24E)24@("`@(" M`@("`@("`@(D`B0D)"0D)"0D)"0D)$(D)"1"0D)"0D)"0D)"0D)"0D)"0D)" M5T(8&$(80AA"0D)7&!@80AA"&$(8)"0@)"0D)"0D)"0D)"0D)"0D)"0D)"0D M&!@8&#Y$/@`81T='1T='&$<81T<8&$(80AA"0D(80D)"&!@8&!A'1T='&!@8 M&!@8)"0D&"0D)"0D)"0D)"0D)"0D("0D)`(D`E(")"0D)`)24@("4@("`B0" M)`("`E)24E(`4E)24E)$1"`@.BM("@HK"@H*"@HC5",*2CLF)B8C(R8P)B,C M,#`P.R,Z)B8Z)C`P,#`P,#`F)B8N+BX[,",F(S`C(R,C,"8P(SLN.RPL+"XN M+BPL,#`[.SLP,"PC(R,L+"PL+#L[,#LC(SL[.R,C(RPN+#L[.SL[+"PN+BPL M+BXN.SLC.RPL+#L[.RXL+"XL.RX[.SL;2$P_3$Q,3$Q,3$Q,3$Q*4QL;("`; M&R`;("`@("`@/B`@("!$("`@1%,@("!$4R!$4E)24E)24E)24@)2`E("`@)2 M`@(D`@(D`B0D)"0D)"0D)"0D)"0D)"0D0D)"0D)"0B!"0D)"0D)"0D)"0D)" M5T(8&!@8&!A"&$(80A@D)"0D)"0D)"0D)"`D)"0D)"0D)"0D)"0D)"0D)$)" M&!@81Q@8&!A'&$='1Q@8&!A")"0D)"0D)$)"0D(80D)"1T='1T='&$<8&!@8 M)"0D)"0D)"0D)"0D)"0D(#XD)"0D)`("4B0D)`("4@("4B0D)`(D`@("`@(" M`E)24E)24E)24D0@*3HK2`H**PH*"@H*(U0C"DH[)B8F(R,F,"8C(S`P,#LC M.B8F.B8P,#`P,#`P)B8F+BXN.S`C)B,P(R,C(S`F,",[+CLL+"PN+BXL+#`P M.SL[,#`L(R,C+"PL+"P[.S`[(R,[.SLC(R,L+BP[.SL[.RPL+BXL+"XN+CL[ M(SLL+"P[.SLN+"PN+#LN.SL[&TA,/TQ,3$Q,3$Q,3$Q,2E,;(#H;&R`;("`@ M("`@("D@("`@&T0@4R`;(%-$("`@($1$4E)24E)24E)24E("4@)2`@)24@(D M`@(")`("4E)24@("`B0")"0D)"1"($)"0D)"0D)"0D(D0D)"0D)"0D)"0D)" M0D)"0AA"&$(8)"0D)!LD)"0D)"0D)"0D)"0D)"0D)"0D)"0Z)"0D0AA"&!@8 M1QA'&$<8&!@8&!A"0B0D)"0D)"0D)"0D)"0D)$='1T='1T<8&!@8&!@8&!@8 M)"0D)"0@)"0D0D)")"0D)"0D`@(")"0D`E)2`E0;)"0D)`(D`B0"`@("4E)2 M`%)24E)$("`I2"LK"BL*"@H*"B8Z.PI*.CHZ.CHC,#`P)C`C(R,[,"8Z)B8Z M,#`P)C`P,#`F)C`P,",F+B8N+B,C(R,F)B,C(RXL+BXN+",P(S`P(S`P,#`C M+CLC(RPL+"PL+BXC(RXC+BXN.R,[+#LL+"PL+"PN+B,[+"P[.SLN.RXN+"PL M+"PL(SL[+BXN+CL[.QM(/TQ,3$Q,3$Q,3$Q,3%0;&R`;(!L;(!L@&R`;("`@ M("`;("`;&R`;(!L@4R!3("`@1$124E)24E)24E)24E)24E)$4E)24@("4E)2 M4E)24E)24@)2`@("`@(D)#$D)"0D)"0D)"1"0D)"0D(D0D)"0D)"0D)"0B!" M0D(8)"0D)"0I)"0D)$)"0D)")$(D0D(D)"0D)"0D)"0D)"0D0D(8&!@8&!@8 M&$)"0D(D0B0D)"0D)"1"0D)"0D)"0D)'1T='1T='1Q@81T<81Q@8&!@D)"0D M)"1"(#Y"0D(D)"0D)"0"`B0D1%,;*5144U-2`@(D`B0"`@("`E)24E)24E)2 M1%,@&RLK2$@K"@H*"@HZ.BP*2CHZ.CHZ)B,F,#`F(R,C.SLP)CH[.B8F)C`P M,"8F,#`P,#`F.RXP)CLP,#`P,#`N,",C.RXN+C`P,#`P,#`P,#`P,#`C,",L M+BXN+"XL+BXN+"XN+BPL+",[.SL[.SLL+"P[+"PL.SL[.SL[.SLL+BPL+"PL M.RPN+BX[.SL;/S],3$Q,3$Q,3$Q,3$Q4&R`;("`;("`@("`@("`@(!L@&QL; M(%,;*2D@&R`@(%-$($1$1%)24E)24E)24E)24E)24T124E)$1$1$1$124E)2 M`AL"`@("`@)2)`(D)"0D)"0D)"0D)"0D)"1"0D)"0B1"0D)"0D)"0D)"0B0D M4B0D)$)"0D)"0D)"0D)"0D)"0D(D)"0D)"0D)"0D)"1"0AA"0D)"0D(D)"0D M)"0D)"0@("0D0D(8&!@8&!@8+T='(4<"1T='1U)'1T='1T08&$)"($)"0D)7 M&$(80B0D)"0D($I*.@PZ#`PQ,0PQ#$I*4U(D`B0"`@("`E("4E)24E)$1%,* M"BLK"BL*"@HN)B8L*THZ.CHZ.CHF.R8[,",C(SL[.SHF)B8F)B8P,#`F)C`P M,#`P)BX[,#`[+BXN+B8P.SLC,",L+"P[+"X[+C`N,#`P,",C(S`[+"PL+"P[ M+BP[.RX[.SL[.RXN+#L[+BXN.R,L+CLL(SL[.SLN+BXL+"PL+"PL+"PL+"X[ M.SL[4TA,3$Q,3$Q,3$Q,3$P_/AL;(%0I("`I(!L@&R`@(!L@&QL;&QM3(!L@ M&R`;(!L@4R`@1$1$4E)24E)24E)24E)21$1$1$0@1$1$1%)24E)2`@(")"0D M5`)24E(D)"0D)"0D)"0D)"0D)"0D)"0D)$)"0B1"0D)"&$(@0D(D)"0D)$(D M)"1"0D)"0D)"0D)")"!")$(D)"0D)"0D)"0D)"0D)"0D)"`D)"0D)"0D)"`@ M)"0D0D)"&!@8&!@8&"]'+T='1T='1U)21T='1QA'&!@8&!@8&$(80A@@ M)"0@1B8F)C`,)B,F.C$Q,0PQ,3$Z5$0D)`("`@("4E)24E)24E(;"@H*2$@* M"@H*+",F"C\N(R,C(R8F)CHF)C`P,#`[.R,F.CHF,#`P)B8P,"8P,",C(S`N M(RXF,#LN+BXP+B,N,#`[.SL[+"P[+BXP,#`P,",C.SLC(S`L+"PN,#`C+"XN M+"PL+BX[.RPN.SL[.RXL(RPN+",[.SL[.RXN.SLC+"PL+"XL+"XN+"PL+$9( M2$Q,3$Q,3$Q,3$Q(2"D;&QL@&R`;&R`;(!L;&QL;&U,;(!L;("`@&R`@(!L@ M4R`;1"!$1$1$1%)24E-44E)31$1$1$0@1"`@1%)24E)2&P(D)"0D)"0"`E(" M`@(D)"0D)"0D)"0D)"0D)"0D)"0D)"1"0B0D)"0D("0D)"0D4B0D)"0D0D)" M0D)"0B1"0D)"0D)")"0D)"0D)`(")"0D)"0D)"0D)"0D)$(D)"0D($)"&!@8 M&$)7&$)7&$)'(4<A1R%'(4='1T='1T='1T='&$<81Q@8&!@8&!A"0ALF,#`N M.B,P,#`F,"8F.B8Q,3HQ,3$Q5%,D)`("`@("4@)24E)2&T@K2#\_"@H*"BLN M+D@_+#HC(R,P,`PF)C$,.CHZ.SH[,#HZ)C`P,"8F)CH,.@PP,#`P,#`P.S`Z M.SL[,#L[.R,N+BXN+BXP+BPN.S`P,#`P,",P.S`,+BXN,#`Z,#LP+BPL+"PC M+CLN+CLC(R,[)CLC+#L[)B8F.SLF+CL[+",C(SLQ.SLN(RPN+BXI2$Q,3$Q, M3$Q,3$A(2$A44QL;&QL;("`;(!L;&QM34U-3&QL;(!L;("`@("`;(%,@4R`; M($1$1$1$1$1$1$1$4T1$1%,@("!$1%)24E("`@("`@(D)"0D)%)24E)2`@(D M)"0D)"0D)"0D)"0D)"0D)"0D)"0D)"0D)"0D)"0D)`(D)"0D)$)"0B1")$)" M0B1"0B0D)"0D)"0"`B0D)"0D)"0D)"0D)"0D)$)"0D(D)"1"&!A"5T(8&!@8 M&!@@+R\O1R%'1T<A1T<A&$='1T='1T<81Q@8&!@8&!@@(#HN+`HN+CLL+"XL M+BXL,",F(R8Q,3HQ.DI*4R0")`("`@("4E)24AL**S\_/RM(2$A(*PI(3`IB M8F)B5E965E965E965E965E965E965E965E9B8AIB&AH:&AH:&F(:8F)B8AIB M5E965E965E965E968F(:8F)B&F(:&F)B8AH:&AH:&AH:8F)B8F)68E965E96 M5E965E965E965E965E965E965E965E965E965E965E964TA,3$Q,3$Q,3$A( M*T@K4QL;&QL;&QL;("`;&QL;4U-34U,;(!L@&R`@("`@&R`;(!L@("`@1"!$ M1$1$1$1$1$0;1"`@("!$("!$4E)2`@)2`@(")`(;5"124E)24U)24B0D)"0D M)"0D)"0D)"0D)"0D)"0D)"0D)"0D)"12)`(D`B0D)"0@0D)"0D)")$(D)"0D M)"`D)"0"&U0")`("4R0D("0D(`(D)$)"0AA"0D)"0D)"0CY"0D)"0D)"0B\A M1R%'(4<A1R%'1R%'(4='1T<81T<81QA'&!@8/B8[+#`**RPL+"XL"BP[+BPF M.B8Q##I*.DHZ,3%3)"0")`("`@("`@(@*S\_2#\_/S\_2"L*/S\L*20D)"D@ M2E-**51'1T=34R`^1`)"&QL;'!Q&'!P<'$9&1AQ&'!P<'!PQ,3$<1D4#`QP` M'!P<1D8Q1AP,'#$Q,1P<'!Q&1AQ&1D8Q1C$<1C$<145%1D8#,49&1C$Q,0`Q M2E0,)C$,#`Q&/BD;4B0"4E)2/E0,4U14/E145"8_3$Q,3$Q(2$A(*TA(2%13 M&QL;&QL;&R`;&QL;4U-34U-3&QL;(!L@("`;("!3("DI*5,@("`@($0@1"!$ M1$1$($13("`@("!$1%)24E("`@("`@(")`(D`E(;`@)24E("`B0D)"0D)"0D M)`(D)"0D)"0D)"0D)%(D)%(D)%(D`@(D)$)"($)"0B0D)"0D2B0D)"0@)"0D M)`("`@(")`("`B0D)!LD)"0D0D)"0D)"0D)"0D)"0D)"0D)"0D(O(2\A(4<A M1R%'(4='1T='1T='1T<81Q@8&!@8&RXL+`H*"BP*"@H*+#L*.PH[+"8P(R,Z M.C$Q,3$Z,5,D)!LD)`(;&P("2@I(2"M(/TA(2$@*+`HK*RL*"@HK2#],/TP_ M/S\_/S\K"BXC+"PL+"M(2#](2$Q,3$PK/T@K/TQ,3$Q,3$Q(+#LL"DA(2$A, M3$Q,3$Q,3$Q,2#],3#](3$Q,3$P_3$Q,3$A(2$A(2$Q,*PHK*RM,3$Q,3$Q, M3$Q,3$Q(3#\*.SHZ.BQ,3#](3$P_/S\_2$Q,3$Q(/S\_2$A(*TA3&QL;&QL; M&QM4&QM3&U-34U-34QL@("`@("`@("`@(%,I("E3(%-$("!$($1$1$0@(%-$ M("`@1"!$1%-24E)24E("4@("`@("`@)2`@("&P)24E)2)"0D)"0"`@)2`@(" M)"0D)`("`@)2`E,D4E("4R0D)"0D)$(D)"0D)"0D)"0D)"0D)"0D)"0"4@)2 M)`(D)`)2`B0D)"0D)$(D0D)"0D)"0B`@0B1")$(D0B1"(2\A(4<A(2%'(4<A M1R%'1R%'1T='1T='&!A"'`HL"BL*"@H**RPL*PH*"BP*+`HP,#HF)CI*.C$Z M2CHQ4R0D)`(D`B0"`DH*2$@K2#](2$A("BP**RLK"@H**T@_3#],/S\_/S\_ M*PHN(RPL+"PK2$@_2$A,3$Q,*S](*S],3$Q,3$Q,2"P[+`I(2$A(3$Q,3$Q, M3$Q,3$@_3$P_2$Q,3$Q,/TQ,3$Q(2$A(2$A,3"L**RLK3$Q,3$Q,3$Q,3$Q, M2$P_"CLZ.CHL3$P_2$Q,/S\_/TA,3$Q,2#\_/TA(2"M(4U,;4QL;4QL;&U-3 M4U-34U-34QL;(!L@("`@&R`;(!L@&QL@&U,@4R!3("`@("`@4T13(!L@("!$ M1%)34E)24E)24@("`@("`@("`@(")`)24E)$4E("`B124E)2&U)24E("`@(" M4U)24B0D4E(D4B0D)"0D)"0D)"0D)"0D("0D)"0D)"0D)"0D(`("`@(D`B0D M)"0D)"0D)"1"0D)"0D)"0D)"0D)"0D)"0D)"0B$A(2$A(4<6(4<A1R%'(4=' M1T='1T<81T='&PH*"BLK*PH**PH*"BLK"@H*"CHL+`HL.CHZ.DHZ2CI*.DH" M)"0D)`("`@)*"DA(*T@_2$A(2`HL"BLK*PH*"BM(/TP_3#\_/S\_/RL*+B,L M+"PL*TA(/TA(3$Q,3"L_2"L_3$Q,3$Q,3$@L.RP*2$A(2$Q,3$Q,3$Q,3$Q( M/TQ,/TA,3$Q,3#],3$Q,2$A(2$A(3$PK"BLK*TQ,3$Q,3$Q,3$Q,3$A,/PH[ M.CHZ+$Q,/TA,3#\_/S](3$Q,3$@_/S](2$@K2%-34U-34U-34U-34U-34U-3 M4QL@(!L@("DI("`@("`@&R`;*1L@4U,@("`@1"`@("!3("`@("!$1$1$1$12 M4E)24E)24@("`@(;`@("`@("4E)34E)24E)24E)2`E0D)`)2`E)24E(D4@(D M4E(D4@(")"0D)"0D)"0D)"0D)"0D)"0D)"0D)"0D)"0"`@("`B0D,2`D)"0D M)"DD)"0D)"0D)"0D)"0D)"0D)"0D)"0A(20A(2$A1R$61R%'(4='(1@A1T=' M1T='(`H*"@HK*PHK*RL**PHK"BL**RL[+BXL*SH[)CHZ.C$Z,3$,*20D)"0D M)"0"`BP**RM(2"LK*PH*+"M(*PHK*RM(/S\_/TP_/S\_/S](*PHZ+"PL+`H_ M2#](2#],3$Q(/TA(3$A,3$Q,3$Q,*SLP"DA(2`H_3$Q,3$Q,3$Q,*S\_/TA( M3$Q,3$P_/S],3$A(2#](2$Q,3"L*"@HK3$Q,3$Q,3$Q,3#](/TA,*R,C(R8K M3#](/S\_/S](3$Q,/S\_2$A(2"L_/TA34U-34U,I4U-34U-34U-3&QL;(!L@ M(!L@5"`;(!L@("`;("`@(!L@4U-$4R!$("`@(%,I*5,@("!$4T1$4E)24E)2 M4E)24@("`@("`@("`@("4E)24E)24E)2`@(D)"0D`@("`@)2`@("4B12`@)2 M)"0D)"0D)"0D)"0D)"0D)"0D)"0D)"0D)"0D)!L"`@(")"0D)"0D*20D)"0D M)"0D)"0D)"0D)"0D)"0D)"`@%A93%B$A(2$A1Q8A1R%'(1@A&$='1T='("PK M*RLK*TA(2"L_"BLK"BLK"BLL+`HL+`H[.RXC)CI*.C$Z2CI2)`(D)%0D)"0F M"@I(/S\*"@HK"BPK*PHK*RLK/S\_/S\_/S\_/S](/T@*.C`*"@HL*T@_2$A, M2$A(/S](*TA(/S\_/S](2"L*+"PK*RLK*TQ,/TQ,3$Q,/T@_3$@K/TQ,3#\_ M3$PK2$Q(2$A,/T@_3$Q,*RLK+BM,3$Q,3$Q,3$P_*RM(/TP*"@H[+"M(2#]( M2$A(3#],3$A(/TA(2$A(/S](*5-34U,I4RE32E0I4U-3&QL@&R`;(!L@&R`@ M(!L@&R`@("`;("`@&R!3&R`@&R`@4R!3("!31$0@1$I$1$124E)24E)24E)2 M`@("&P("`@("4E)24E)24E)2`@(D&R0D)"0D)"0D`E)24E)2`E)24B0D)"0D M)"0@("0D)"0D)"0D)"0D)"0D("`D)"0D)`("`B0D)"0D)"`D)"0D)"0D)"0D M)"0D)"0D)"0D)"0D)!86%A86(2$A(2%'(2$A(4<A1R%'(4='4CLK*S](2$A( M/S\_*RLK2$@K*PHK/PH*"BPN.R8*(RXF.DHZ,3HQ5"0")"0D)"0D2@HK*T@K M*RLK"BL[.PHL"C\_/S\_/S\_/S](2$@_/S](*R-*,#`P.RM(2#](2$A(2#]( M"BLK2$@K*RLK2$A("BLL"@H*"@H_/TQ,3#\_/S](/S](2$Q,3$Q,2$A,*PI( M/S\_2$A(3$Q,3#\_/SLN2$Q,3$Q,3$P_2#](2$Q,/S\_/RL*"BM(*RLK*TQ, M/TA(2#](2$@K2"M(*RDI*2DI4RE34U-34U-3&QL;&QL;(!L@&R`;&R`@&R`; M("`@("D@("`;(%,@4R`@("!3(%-3(%,@("`@("!$1$124E)24E(;4E)24AL" M`@)2`@)24E)24E)24@(D)!LD)"0D)"0D)"0"4E)24E)24@(")"0D)"0D)"0D M)"0D)"0D)"0D)"0D)"0D)"1&)"0D)"0D)"0D)"0D)"0D)"0D)"0D("0D)"0@ M("0D)"0D)"06%A86%A8A(2$A(2$8(4<A1R%'1T='1R0*"BLK/TA(/T@_*TA( M2$A("D@**RM(*S`[+"XL+",N+B8Z2CI*.DI2)"0D)"0D)#$*"@H*"@H*"BL* M(SH[+"L_/S\_/S\_/S\_2$A(/TA(2$@[2C$Q,3H*2#\_/RL_/S\_2`I("@I( M2$A(2#](2"LK*RLK*RLL2#],/RLK*RM(2#\K*TA,3$Q,3#\K2$@*+"LK*S\_ M/TQ,3$Q,3$P_#"PK3$Q,3$Q,/TA(2#],3$Q,3$Q,2`H**RPK*RM,/TA(2$A, M2$A(2$@_*RQ3*5,I*3Y34U-34U-3&QL;&QL;&QL;(!L;("`;(!L@(!L@&R`@ M&R`@&QM34R`;(%,@4R!3(%,@4T0@1"`@1$1$4E)24E)24E)24E)24@("`@)2 M`E)24E)2`@(")"0D)"0")"0D)"0D)%)24E)24E("`B0D)"0D)"0D)"0D)"0D M)"0@)"0D5"0D)"0D5"`D)"0D)"0D)"0D)"0D)"0D)"0D)%0@)"0D)"0D)"0D M)"0D%A86%A8A(21'(4<A(2$A1R%'(5)'+T<Z*TA(2"L_2$A(2$@_2$A(2"LK M*RLK*RLL.PHL+"PL.R8C2CHQ.C$Q("0D)"0D)"0D+B,C"BLK*RLK"B,Z)B-( M/S\_/S\_/S\_/S\_/TA(/TA("@Q*2DHZ+CLL"BP*2$A(2"LK+`H*"@H*"BPL M+#LP"D@_/S](*PH*2#LL"@H*+`I(*TA,3$A(2$P**SLL.@PN+BY(2#],3$Q, M3$Q,3"P[+"M,3$Q,3$@K/S],3$Q,3$Q,3$@K"@H[+BXN2#](*S](3#\_/TA( M2"LP*3X^/E-34U-34U-3&U,;&QL;&QL;(!L@(!L;(!L@&R`@("`;("`@(!L@ M4R`;4R!3(%,@&R!3(%-3(%,@("!$1$124E)24E)24E)24E)24E("`@("&U)2 M`@("`@(D`B0D)"0D)"0D)"0"`E)24E)2`B0D)"0D)"0D)"0D)"0D)"0D)"0D M("0D)"0D)"0D)"`D)"0D)"0D)"0D)"14)"0D("0D)"0D)"0D)"0D)"0D)!86 M%A86(2%'(4<A1R$A1R$A1R%21T<"*TA(/S](/T@_/TQ,2#](2$A(2$A("BM( M+"P*(RPL+"PL)B8Z2CHQ.B`;("0D)"0D)#HP)B,L"@H*2`H[.B8C2$Q,3#\_ M3#\_/S\_/S\_/TA(2$@[,3$Q,0P<'!P<1BLK*T@*"BPL"BPZ.CH<'!P<`RY( M3$Q,3#\K"@H<'!P<'!P,2$A,3#\_/S\_#!P<'!P[#`P,+BM(3$P_3$Q,3$PK M+"X*"DQ,3$Q(2$A,3$Q,3$Q,3$P_2$@*"CL[.RPK*RM(/S\_/S](2$@K2E-3 M4U-34U-34U-34U,;4QL;&QL;&QL;&QL@(!L@&R`;(!L@("`;("`@4U,;4QM3 M&QL@(!L@(!L@4R!3("`@1$1$1%(;4E)24E)24E)24E)24E)2`AL"4@("`@(" M`@(D`B0D)`(D)"0D)"0"4E("`@(D)"0D)"0D)"0D)"0D)"0D)"`D)"0D)"0D M)"0D)"0D)"0D)"0D)"0D)"0D)"0D)"0D)%0D)"0D)"0D)"0D)"0:%A8A(2$A M(2%'1T='1R$8(4='(4=2.D@_3$@_/S\_3$@_/TA(2#\_2$A(2"LK/RPL"B8C M"CLL(R8Q.C$Z,0Q3)"0D)"0D)"1*.B8Z(PH*"BL*+",L.RL_/S\_/S\_/S], M/S\_/S\_2#\_+"8F)D8Q'!P<'$8K*RLK2"L*"BPL'!P<'!P<10,K2$Q,3$Q, M/RL*'!P<'!P<'"L_3$P_/S\_3#H<'!P<.S`P,#HL*S](/TQ,3$Q,/RL*"BY( M/S\_*TA,3$Q,3$Q,3$Q,2#](*TPK*RLL"@HK/S\_2$A(/S](2#HI4SY34U-3 M4U-34U-34U-44QL;&QL;&QL@&QL;(!L@&TH@&R`;(!L@&R`;4U-34U,@(!L@ M("`;1%,@(!L@1"!$1$124U)24E)24E)24E)24E)24E)2`E("`@("`@("`@(D M`B0D)`(D)"0D)"0"`B0D)"0D)"0D)"0D)"0D)"0D)"0D)"0D)"0@5"0D)"0D M`B0D`B0D&R0D)`(D)%0;)"0D)"0D)"0D)"14)"0D)"0D%AH6%B%'(4<A1R$8 M(1A'(4<A(4<A1RQ(2$@_3#\_3$A(/S],/S](/TA(2$@K2#\*+`H*+#LC"B,Z M)DHZ2CHQ5"0D)"0D)"0D2DHZ.B,[.SLC.RPC)BP*"@H*2#\_/S],/S\_/S\_ M/T@_/RLF)B8Q,1P<'!Q&*RLK*RLK2"LL'!P<'!P<!@8K/RM,3$Q,3$P_*QP< M'!P<'!Q(3$P_3#\_/TQ&'!P<'`H*"@HN+"X**TA,3$Q,3$P_*RPL"BLK*TA( M3$Q,3$Q,3$Q,/S\_2#](2$A(*T@K"BM(2$A(2$A(2$PI4U-42E-34U-34U-3 M4U-34QM3&QL;&QL;&QL@&QL@&R`;("`@("`@("!3&U,I5%,;&QL@&R`@1!L@ M4U,I*40@1#Y$($1$4E)24E)24E)24E)24E)24E)24@("`@)2`@("`@(D`B0D M)"0D)"0D)"0D)"0D)"0D)"0D)"0D)"0D)"0D)"0D)"0D)"0D)"0D)"0D)"0D M)%0D)"0D)"0D)"0D)"0D)"0D)"0D)"0D)"0D)&(6%B$A(2%'(4<A&"$8(4<8 M(4<A1R0*/S\_/S\_/S\_3$P_3$Q,2$@_/T@K*TA("BP*"BL*(R-*.CHZ.CI* M.DHD)"0D)"0D)$I*.CHC.SL[(SLL(R8L"@H*"D@_/S\_3#\_/S\_/S](/S\K M)B8F,3$<'!P<1BLK*RLK*T@K+!P<'!P<'`8&*S\K3$Q,3$Q,/RL<'!P<'!P< M2$Q,/TP_/S],1AP<'!P*"@H*+BPN"BM(3$Q,3$Q,/RLL+`HK*RM(2$Q,3$Q, M3$Q,3#\_/T@_2$A(2"M(*PHK2$A(2$A(2$A,*2E3*5-34U-34U-34U-34U-3 M4QM3&U0;&QM4&R`;(!L@&R`;(!L@&R`;(%-3&QM3&U,@&R`;&U,@4U-4(!L@ M("!*1$1$1$1$4E(;2E)24E)24E)24E)24E)24@)24E("`@("`@(D`B0")`(D M)"0D)"0D)"0D)"0D)"0D)"0D)"0D)"0D)"0D)"0D)`(D)"0")`("`B0;)`(D M)`(D`B0")`(D)"0")"0D)"0D)"0D)"06%A86(2%'(4<A1R$8(1@A(4<A&$<I M*TP_3#],3$Q,3$Q,/S\_3#\_/T@K/S]("BLK*RPK+"XZ.B,F.DHZ,3I*)"0D M)"0D)"0D2CHZ(SL[.R,[+",F+`H*"@I(/S\_/TP_/S\_/S\_2#\_*R8F)C$Q M'!P<'$8K*RLK*RM(*RP<'!P<'!P&!BL_*TQ,3$Q,3#\K'!P<'!P<'$A,3#], M/S\_3$8<'!P<"@H*"BXL+@HK2$Q,3$Q,3#\K+"P**RLK2$A,3$Q,3$Q,3$P_ M/S](/TA(2$@K2"L**TA(2$A(2$A(3"E3*5-3*5-32E-4/E-34U-34U-3&U,; M&U0Q2E,;&R`;(!L@&R`;("`;&SH;4U-3&U,;(%,;&R!34U,@2E,@("`@("`@ M1$1$1$1$4E-24E)24E)24E)24E(;4E)24E)24@("`@("`@(D`B0;)`(D)%,; M)"0D)"0D)"0D)"0D)"0D)"0D)"0D5"0D)"0D)`("`@(D`B0"`@("`@("`@(" M`B0")`(D)"0D)"0")"0D)"0D)!86(2$A(2$A1R%'(4='1T<A1R%'2D@_/S], M3$Q,3$Q,3#\_/S\_3#](/S\_"BL*"D@K*RLC.CLC)CHQ.C$Z5$08)"0D)"0D M)%0Q.B,L+"PC(SLC.B8N+"PL*RL_/S\_3#\_/S\_/TQ,3$@C(R,Q1AP<'!P< M*RLK*RLK"@H<'!P<'!Q%!CM(/T@_/S\_3$Q,+!P<'!P<'!P_3$Q,/S\_/TPZ M'!P<'"M(2$@*.RP*2$A,3$Q,3$Q,/PH*"@H*"BM(3$Q,3$Q,3$Q,2#\_3$P_ M/S\_/TP_/T@K*TA(2#](/PI*4RDI4U,I5$I34U-34U-34U-34U-3&U,;&QL; M&QL@&R`;(!L@&R`;("`;4U-34U,;&QL;&QM34U,@&U,@&R`@("`^("`@1$1$ M1%)34E)24E)24E)24E)24E)24AM24@(;`@("`@(D`@(")"0D)`(D4P(D)`(D M)"0D)"0D)"0D)"0@)"0D`B0")"0D`@(D`B0"`@("`@("`@("`@("`@("`@(" M`B0D`B0D)"0D`B0D)"06%B$A(4=2)"%'1R%'(1@A&"%'1TH_/TQ,3$Q,3$Q, M3$Q,3$Q,3$Q(/S](/PHK"@H*"BLK(R,N)B8F.DHZ2E,D)"08)"0D)"0I2CHF M+"PL+`HL.SHZ(PH*"@HK/TP_3#\_/S\_/S\_/TA(+"PL)C$<'!P<'"LK*RLK M*RL<'!P<'!P#'"XK*S\_2$A(3$Q,/T@<'!P<'!P<3$Q,/S],3$Q,'!P<'!PK M2$A("BXL+"LK3$Q,3$Q,3#],2`H*"@I(*TQ,/TQ,3$Q,2$@_3$Q,/S\_/S\_ M3#](2"M(2$@_2#\Z*2E34RE34RE4*5-34U-34U-34U-34U,;4QL;&QL;&QL; M(!L@("`@(!L;(!M34U-34QL;&QL;4QL@&R`@&R`@&T0@("`@("!$1"!$1%)$ M4E)24E)24E)24E)24E)24E)2`@("`@("`@(D`B13)`(D)`(D)"0D)`(D)`(D M)"0D)"0D)"0D)"0D)"0"`B0"`@("`@("`@("`@("`@("&P("`E0"`@("`@(D M`B0D)"0D&R06%B$A(2$A(5-'(2$8(4<A&"%'1R$Q2$A,3$Q,3$Q,3$Q,3$P_ M3$Q,/S](/S\K"BL**PHK"BP[.SLZ(THZ.CI2)"0D)"0D&"0D*3I*.BPL+`H* M"BPC,4HF)B8*"BL_3#],/S\_/RLK*T@_2"PL+#M&'!P<'!P*"@HL2#]&'!P< M145%`SM(*S](*TA(2$P_3#\K'!P<'!P<'$Q,/S\_3$Q,3#H<'!P<*TA(2"LL M"BP**TQ,3$Q,3$@_2#](2$A(/TA,3#],3#\_/S\_3$Q,/T@_/S],3#],2$@_ M*RLK2"LK2E,I*2DI*5,I4U,I4U-34U-34U-34U134U,;4QL;&QL;&R`;(!L@ M&R`;(!M34U-3)E,;&RD;4U-3&QL;&R`;&R`@("`@2B`@($1$1$131$1$1$12 M4E)24E)24E)24E(;&U)2`E("`@("`@(D4U(D)`(D`B0D)!LD`B0D`B0D)"0" M)`(D)"0D&R0")`("`@("`@("&QL"`@("`@("`E("4@("`@("`@("`@(")`(D M`B0D%A8D(2$A(2%'(4<A4B$81R%'(4='5#](3$Q,3$Q,3$Q,3$Q,3#],2#\_ M/S],/RP*"BLK*R,C.SLF)B8Z2CI*4U(D)"0D)"0D&"0Z,3HL+"PK"BL*"B8F M.CHZ+`H**TA,/TQ,3#\L.R,L*RL*"@HP,1P<'!P<"@H**T@Q'!P<`QP<'#`_ M*T@_*RM,3$Q,3#](/QP<'!P<'!Q,3$P_3#\_/TP<'!P<'`I(2$@_"@HK*PH_ M3$Q,3$@K2"LK*RLK*TP_3#](3#],3$Q(3$Q,3$A(2$A(/TQ,/S],3#\_/S\K M.RDI*50I*50I*2DI4U,I5"E34U-34U-44U-34QM3&QL;&QL;&R`;("D@(!L; M4U-34U-3&QM4&QL;4U,;(%0;("`@("`@("`@("!*/D1$("!$1$1$1$124E)2 M4U)24E)24E)24E("`@("`@("`E(D4B0D4B0"4U,D`B0"`B0")"0D)"0D)`(" M`E0"`@("`@("`@("`@(;4@("`@("&P("`@("`E("5`("&P("`@("`B0")!86 M)!86)"12(2$A(4<A(2%'1T='(2D_/TQ,3$Q,3$Q,3$Q,3$Q,3#],2$A(/S\K M*PH**PH["B,[(SHC2CHZ5"0D)"0D&"08)"1")#HF+"PL*RM(2$@*(R,C(R8N M+#L**TA(2$@*(R8C(PHL"@H*,`P<'!P<'#HZ.CL,'!P<'!P<'!Q(2"LK2`HL M/S\_/S],2"L<'!P<'!P</S\_3$Q,3$Q,.AP<'!PZ.SL["CLZ+#L[.S\_/S], M2#\_3#],3$Q(3$A(2#](/S\_/TQ,3$A(2#\_/TP_/TQ,/TQ,3$P_*SI*5%14 M5%145%0I*2DI4RE34U-34U-34U-34U-4&U,;&QL;&QL;&R!4(!L;&U-34U-3 M4QM44QM34U-3&QLI(!L@&R`@*2`@("`@("`@($1$1"!$1$1$1$1$4E)24E)2 M&U)24E)24E)2&U12`E(D4B124B125%(D4R0")"0")`(D`B0")`(D`B0"`@(" M`@("`@("4@)2`@)2`@)24E)24E("4@("`AM2`@("`@("`@("`@(6&A86%A86 M%B$A1R%'(4<A1R%'(4<;2$P_3$Q,3$Q,3$Q,3$Q,/TQ,2$P_2#](/TA(*PH* M+",L(SL[.CI*.BDD)"0D)"0D)!@D&"0Z(R,C(RX**PH**PH*"@HN(RPC+BX* M"@H*+#HF)BXL.PH*"BPZ'!P<'!P<'!P<'!P<'!P<'!P<'!PZ"BL*+BPL+"XK M2#\L'!P<'!P<'#](/TQ,3$Q,3`P<'!P<'!P<'!P<'!P<'!P<'!Q&.S](2$Q, M3$Q,3$P_/TA(2#\_/S],3$Q(*TA,3$P_3$Q,/TP_3$Q,/TA45%145%145%14 M*50I*5-3*5,I4U-34U-34U-34U-34U,;&QL;&QL;&QL;&U-34U-34U-35%-3 M4U-34U,;("`@("`@&R`@("`@("`@("`@($1$1"!$1$1$1$1$4E)24E)24E)2 M4E)24E)2`E)24E)2)%)2)%,D4@)3`E-3)`("`@("`@("`@(;,0("`@("`E(" M`@("`@)24E)24E)24E)24E)24@("`@("`@("`@("`@("&A@68A86%A86(2$A M(4<A4T<A1R$A`C\_3$Q,3$Q,3$Q,3#],3$Q,3#\_/TA(2$@K*RL*+B,L+"PC M)CM*.DHD)"0D)"0D)!@D&"0D&#L*"@H**RLK*RL*"@H*"BPC+`H[+"PL+"P[ M)B,[)B8L+"PL+AP<'!P<'!P<'!P<'!P<'!P<'!P<'$8L+"PL+"PN+#LK"AP< M'!P<'!Q(*RL_3#\_/T@,'!P<'!P<'!P<'!P<'!P<'!P<'!P<"DQ,3$Q,3$@_ M3#\_/S](2$A,3$Q(*T@_/S\_3$P_/TP_2$Q,3$PL5$I45%145%145%14*2DI M*5,I4U-34U,I4U-35%-34U,;4QM3&QL;&QL;&U-34U-34U-34U-35%-34U,; M("DI&R`@("!$&R`@("D@("`@(#X@("!$($1$1$0^4T1$4E)24E)24E)24E)2 M4E)21%)$4E)2)%(D4E(D4B12,5("`@("`@("`@("`@("`@)2`@("`@)2`E)2 M4E)24AM24E)24E)24E)24E)2`@)24@("`@("`F(:&AH6&A86%A86(2$A(4<A M(4<6(2$Z/TQ,3$Q,3$Q,3$Q,3$P_3$P_/S](/RM(2"L*"@H[(RXC(R9*.CI$ M&"0D)"0D&!@D&"1$&"0F+"PL"BLK"@H**PH*"@H*)BXK"@HK*RLK"BPL*RXF M+BXN+`H<'!P<'`,#`QP#'!P<'`,<'!P<'!P<'"PL+"PL"BXP,`H<'!P<'!P< M"BL**T@K*RLK,1P<'!P<'!P<'!P<'!P<`QP<'!P<'!Q(3$Q,3$P_2#\_/S], M/S\_3$Q,/T@K/S\_/TP_/S](2$A,3$Q,,51*5$I45%145%145%14*2DI*2DI M4RE34U-34U-34U-34U-3&S%4&QL;&U-34U-34U-34U-35#%34U-3&QL@&R`; M(!L@&R`@&R`@("`@("`@("!**40@1"!$1$1$1$124E)24E)24E)24E)24D1$ M1%)24E)24B124B12)%(D4@("`@("`@("`@("`@("`@)2`E)24E)24E)24E)2 M4E)24E)24E)24E)24E("`C%2`E("4@)B8AH:&AH6&A86%B06%A861R$A%A86 M(#\_3$Q,3$Q,3$Q,3$Q,/TQ,/T@_/TA(2"L*"BLK.R,C.R8Z.CI4&"0D)"0D M)"0D)!@D)"0D)BPL+`HK*PH*"BL*"@H*"B8N*PH**RLK*PHL+"LN)BXN+BP* M'!P<'!P#`P,<`QP<'!P#'!P<'!P<'!PL+"PL+`HN,#`*'!P<'!P<'`HK"BM( M*RLK*S$<'!P<'!P<'!P<'!P<'`,<'!P<'!P<2$Q,3$Q,/T@_/S\_3#\_/TQ, M3#](*S\_/S],/S\_2$A(3$Q,3#%42E145%145"DI5%145%14*2DI.BDI*5,I M4U-34U-34U-34U,;4QM3&QL;5%-34U,I4U-34U-34U134U,@&R`;("D@("`@ M("`@("`@&R`@("`@("`@("`^("!$1$1$1$124E)24E)24E)24D1$1$1$1$1$ M4E)24E)24E)24@("`@)2`@("`E("`@("4@)24E)24E)24E)24E)24E)24E)2 M4E)24E)24E)24E)24@("`@("8D=B&!H:8AH6&A86%A86)"%'%A86%A8*3$P_ M3#],3$Q,3$Q,3$P_3#],/TA(2"L*2"LK*PHZ(R8C.CI*1!@8)"0D)"0D)"0D M("0D)"8L+"P**RL*"@HK"@H*"@HF+BL*"BLK*RL*+"PK+B8N+BXL"AP<'!P< M`P,#'`,<'!P<`QP<'!P<'!P<+"PL+"P*+C`P"AP<'!P<'!P**PHK2"LK*RLQ M'!P<'!P<'!P<'!P<'!P#'!P<'!P<'$A,3$Q,3#](/S\_/TP_/S],3$P_2"L_ M/S\_3#\_/TA(2$Q,3$PQ5$I*.E14*2DI5%145%145%145$I4*2E34U-*4U-3 M4U-34U-34U-34U-3&U-34U-34U-34U-34U-34U,;&R`;(!LI(!L@&R`@&R`; M("`@&R`@("`@("`@("`@1"!$1"!$1$124E)24E)24E)$1$0@4T1$1$124E)2 M4E)24E)24E)2&P("`@("`E)24E)24E)2&U124E)24E(;4E)24E)24E)24E)2 M4E)24E)24E)24E)2`F)B8AAB8AIB&F(6%F(6%B0A(2$6%A8A2DA,3#],3$Q, M3#],3#],3#\_/T@K/S\*"@HK*PHL(R8Z)B9*1!@D&"0D)"0D)"0D)%,D)"0Z M.SL["@HK"BL*"BLK*RLK"BXK*S](2$@*"BP**T@L+BXN+BP<'!P<'!P<'!PQ M'$9&##$<'!P<'!P<'#$Z,#`P"@H*,"P<'!P<'!P#"@I("BPK*RM(#!P<'!Q& M#`P,,3H,##HL#!P<'!P<'!P,3$Q,3$Q(*S\_/TP_3$Q,3$Q,/S](/TQ,3$Q( M/TA(2$P_/S](*4I42E145%0I5"DI5"945%145%145"DI*5,I4U-34U-34U-3 M4U-34U-44U-34U-34U-34U-34U-34U,@&R`I&R`;(!L@("`;("`@("`@("`@ M($I*("`@("`@("`@("!$1"!$1$122E)24U-$1%-$1$1$4T1$1$1$1$124E)2 M4E)24E)24E)24E)24E)24E)24DH;4E(;4E)24E)24E)24E)24E)24E)24E)2 M4E)24E)24E)B8F)B8F)B8AH:%F(6%A86(2$A%A86%A8F/S],3#],3#],3$P_ M3#],2#](/S]("@H**PH["@HC)B9**1@D)"08)"0D)"0D&"08(!@8&",C(PHK M2$@K"BLK*RLK*RM(*RL**RLK2"L*2#]("BPL+`HL'!P<'!PQ,3$Z.PHK"D@_ M/S\_.AP<'!P<.CHZ.BP**RPN'!P<'!P<'#`K2`H*+"PL2#H<'!P<"C\_/S\_ M2#],3$P*"@H<'!P<'$Q,3$Q,2$@_/T@_2#\_/TQ,3$Q(3#\_/S](3#](/S\_ M3$Q,.BE42E145%14*4HI5%145%145%145"DI*2DI4RE3*5-34U-34U-34U-3 M,5134U-34U-34U-34U-34U,;&R`;(!L@&R`@(!L@&R`;(!L@&R`@("`@("`@ M("`@("`@("`@("!$1$1$1$1$1%)$1"`@1%-$1$1$1$1$1$1$1%)24E)24E)2 M4E)24E)24E)24E)24AM24E)24E)24E)24E)24E)24E)24E)24E)24E)24E)2 M4E)28F)68F)B8F(:8AH:%F(6%A8A%A86%B$A%BL_/TQ,3$Q,3#],/S\_/S]( M/TA(*T@L+"X*+`HL(R,Z5!A$1$08)!@D)"08&!@8&!A'&!A'2DH**T@*"@H* M*RLK2"M(2$A(*TA(2"LK*T@_*RLL+"PL.QP<'!P<.CHZ.RPK"BL*2#\_/S\< M'!P<'"XL+"PN"BL*+AP<'!P<'`,[+$@K*TA(2$@['!P<'"Q(2$@_/S\_3$Q, M3$Q,'!P<'`-,3$Q,3#](2#\_/TA,3$Q,3$P_/S](/S\_2#](2#],3`H*"E1* M5$I45%145%145"E45%1*5%145%14*50I*2DI*5,I4SY34U-34U-44U-34U-3 M4U-34U-34U-34QL;&R`;&R`;(!L@&R!*&R`;(!L@("`I(!L@("`@("`@("`@ M("`@("`@("D@($1$1$1$1$1$1%-$1$131%-$4T1$1$1$4E)$,5)34E)24E)2 M4E)24E)24E)34E)24E)24E)24E)24E)24E)24E(;4U)24E)24E)24E)24E9B M5F)B8F)B8F(:&F(6&A86%A86%E-44D=4"D@_2$A,3#],/TQ(/S\_2$A(*RLK M+`H*+`HF+"8Z*4<81Q@8&!@8&!@8&!@8&$08&$<8&$1$"@H**RL*2$Q,3#\_ M*RLK*RLK*RLK*RM(/RLK*RLK*RX<'!P<'"PL+"PL"BP**TA(2$@L'!P<'!PL M*RLK*PH*2$@<'!P<'!P<+BPK*RM,3$P_,1P<'!PL/S\_/RM(/TQ,3"PL+!P< M'!P#3$Q,3$Q,2$@_2$@_/S\_/TQ,3#],3$Q,3#\_/S\_/TPF)B945$I45%14 M5%145%0I5%145%142E145%145"DI*2DI*5-3/E-34U-34U-34U-34U-34U-3 M4U,;4QL;&QL;&R`;("`@&R`;*2`@(!L@&R`;("`@(!M$("D^("`@("`@("`@ M("`@("`@($0@1$1$1$0@*5-$1"!$1"!$1$I$1$1$4E-24E)24E(;2@)24E)2 M4E)24E)24E)21$1$1$1$1$1$1$124E)24E)24E)24E)24E)2&QM68E9B5F)B M8F(:8AH:8AIB%A86%A93(2$A(20C3#\_3$Q,/TP_/RM(/TA(2$@K+`HL.RP[ M.R-*1$='1QA'&$<8&!@8&!A'&$<81T<81T<81"D*"BLK*PH_/S\_3#]("@H* M2$A(2"M(/S\K"BLK*PH*1AP<'!P<'!Q&'#$<,1Q&'!P<'!P<'`8N2$A(2#], M/RM('!P<'!P<`RP**T@_3$Q,3$8<'!P<1D9&1@P,1CHZ#`P<'!P<'!Q%,3], M/S\_/RM(2$@_2$A(2$Q,3$Q,3$Q,3$Q(/TQ,3$P*5%145$I*5%1*5%145%14 M5%145%1*5%1*5%145%0I5"DI*2DQ*5-3/E-34U-34U-34SY34U-34U-34U,; M&QL;&QL;&R`;&R`;(!L@&QL@&R`;(!L@&R`@&R`@(!L@("`@("`@("`@("`@ M("`@($1$*41$("!$4T1$4T1$1$0I1$1$1%)$4E)24E)24E)24E)24E)24E)2 M2D1$1$1$1$1$1$1$1$1$1$1$1$1$1%)24E)24E)24E)25E9B5F)B5F)B8F(: M8AI"&AH6%B0A%A86%A86%B,_*T@_/S\_2#\K/S](2"M("CLN"B,L(R94&!A' M1T='1T='&$081T='1T='1T<81Q@81T1$,0HK*TA("@H*/S],/PHK*TA(2$@K M/TQ,*PH*"@H**T8<'!P<'!P<'!P<'!P<'!P<'!P<144</TA(2$A,2$@**QP< M'!P<'!P["BM,3$Q,3$@,'!P<'!P<'!P<'!P<'!P<'!P<'`-%'$@_2#\_/S\K M2$A(2#](2$A,3$Q,3$Q,2$A(/TP_/S\K5%142CI45%145%145%145$I4*2E4 M5%145%1*5%145"DI*50I*2DI4SY3/E-34U-34U-45%-34U-34U-34QL;&QL; M&QL;*2`;(!L@&R`@(!L@&R`@&R`@&R`@&R`@(!L@("`I("`@("`@("`@("`@ M($0@($13($131"!31$1$1$0@1$1$1%)24U)24E)24E)24E)24D1$1$I$1$0@ M1$1$1$1$1$0@1$1$1$1$1$1$1$1$1$1$4E)24E965F)65F)B8F)B8F)B8AH: M&AH6&A868A868A86("PK/S](2$@K/TA(2"LK*RL*"BP[(U1$&!@A&"%'1R%' M1R%'(4='1T='1T='1T='1T<81%,[*T@K"BLK*TA,/T@**RLK*RLK*S](/T@* M"@H*"@I&`T5%`P,#`T5%145%145%145%10@</S\_2$A(*PHK*S\Q`T5%145% M#"PK/TP_/S](.@,<145%145%145%145%145%144#'`H_3#\_/S\_2$@_/S]( M2$A(3$Q,3$Q,3#\_/TA(3$P_#%145%142E145%145#%*5%145%145%145%14 M5$I45%145"DI*2DI*5,^/E,^4SY34U-32E-34U-35%-34U,;4QL;&QL;&QL; M&QLI&QL;&U,@&QL;&R`;&R`@&R`@&R`@(!L@&R`;("`@("`@("`@("`@($0; M("!31%,@("!$1%,@($1$1$1$1%-$4E)24E)24E)21$1$1$1$1"!$1$0^("`@ M($0@1$0@4T1$1$1$1$0@1$1$1$1$1$165E965F)68F)B8F)B8F)B8F(:8AH: M&AH68A868A8D4SHK2$A(2"LK*RL*"BP*+"XC5%)'1T<A&"$A1R%'(4='1T=' M(4='1T='1T='1T='1T=$4PH*"@H*"@I(2"LK"BL*"@H*"BLK"BLK"@H*"@H* M,45%!D4#`P,(!@A%!@@&"`@(!D4[3$PK/TA(2"LK*RM,,0@#`P,(`S$C+"LK M"@H**SH&!@8&"`,#`P,#`P@#`P@&!@8&.BM,3$Q(/S\_3#\_/TP_2$A(2#], M/TQ,3$Q,3$Q(/S],+E142E1*2E145%0Q2DI45%145%145"E45"E45%145%14 M5%14*51**2DI*5,I4SY3*5-3/E-34U-34U-34U-34QM3&QL;&QL;&QL;4U-3 M4U-34U-34U,;("D@&R`@&R`@&R`@("`@("`;("`;/CX@("`@("`@(%,@4T0@ M1$0@("!$("`@($1$1$1$1$1$1$121$1$1$1$1$1$1"!$("`@("`@("`@("!$ M("`@("`@("`@1$1$1$1$1$1$5E965E965E9B5F)B8F)B8F)B8F)B&F(:8A9B M8A9B%F(6&%,C"@HK"BLL"BP[.E1$1T='1R$A&"%'(4<A1R%'(4<A1T='1R%' M1T='1T='1T='1%,*"@H*"@H*2$@K*PHK"@H*"@HK*PHK*PH*"@H*"C%%109% M`P,#"`8(108(!@@("`9%.TQ,*S](2$@K*RLK3#$(`P,#"`,Q(RPK*PH*"BLZ M!@8&!@@#`P,#`P,(`P,(!@8&!CHK3$Q,2#\_/TP_/S],/TA(2$@_3#],3$Q, M3$Q,2#\_3"Y45$I42E145%145%145%1*5%145%145%145%145#I*5%145%14 M5%0I*2DI*5,I4U,^/E,^4U-34U-34U-34U-34U,;4QL;&U-34U-34U-34U-3 M4U-35%,@&R`@&R`;("`@&R`@&R`;("`@("`I("`@("`@("!$4R!$1%,@("!$ M.D0@($1$1$1$1$1$1$1$1$1$1$1$/D1$("!$("`@("`@("`@("`@/B`@("`@ M("`@("`@("`@("`@(%965E961U965F)B8F)B8F(88F(88AIB&AIB%F(68A9B M%F(68A861%131"%2)%)21T<A(2$8(4<A1R%24B%'4D<A1T<A1U)'1T='1T=' M(4='4D13"@H*"@H*"DA(*RL**PH*"@H**RL**RL*"@H*"@HQ144&10,#`P@& M"$4&"`8("`@&13M,3"L_2$A(*RLK*TPQ"`,#`P@#,2,L*RL*"@HK.@8&!@8( M`P,#`P,#"`,#"`8&!@8Z*TQ,3$@_/S],/S\_3#](2$A(/TP_3$Q,3$Q,3$@_ M/TPN5$I45%145%145%145%145$HQ5%14,5142E145%142E1*5%145%145"DI M*2DI*5,I4U,I4U,^4U-34U-34U-34U-34U,;4QM34U-34U-34U-34U-34U-3 M(!L@&R`@&R`;("`;("`;("`;("`;("`@("`@&T0@4T0@4T0@1"!31$I31"`@ M("!$1$1$1$1$("`@($0@1#X@("`@2B`@("`@("`@("`@("D@("`@("`@("`@ M("`@("`@("!65E965E961U968E9B8F)68F(@8F)B8F)B%F)B0A9B%F(68A86 M(2$A(2%'(4<A(2$A(4<A(4<A(2$A(2$A1R$A1R%'1R%'1U-31R%'1T='1T=' M4E,*2"L*"@H*"@H*"BM(2$A(*TA(2"L**RLK*PH*+B8P,#`L+"PL.R8L+B,N M+BXN)BL_3$A(/S\_/S\_*TA,"BPN+BXL.CHF(PH*"@H*"BXL+#`N.RPL+"PL M"@H*+"P_/S](2$Q,3$P_2$A(2$@_3#](2$A(2$A(2#](3$P_/S](/S\*5%14 M5%145"E4*5145%145%1*2E145%145%145%145%145%145%1*5%145"E4*2DI M*5,I4U,I4SY34U-34U-34U-34U-34U-34U-34U-34U-34U-34U134QL@&R`; M(%-*("`;("`;("`;(!L@("D^*2`;("`@&R!3($132E,@("`I("!$1$1$1$1$ M($1$($1$1$1$($0@("`@("D@("`@("`@("`@("`@("`@("`@("`@("`@("`@ M("`@5E9'5E965E9'5E9B5F)68F)B1QAB8B!B8AIB%F)B%A9B%F(68A86(4<A M(4<6%A86(2$A1R$A(4<A4E(A(2%'(2%'1R%'(4='4D='1R%'1R%'1T=2)C\K M*RLK*PH**PI(2"LK*TA(2#](*T@K*RLK*RX["BLK2$A(/T@K/T@_2$A(2"L_ M/S\K/S\_/S\_/TA(3$@K2$A(/PHL)B,F"BLK*PI(*RLK2"L_/S],/S],2$A, M3$Q,/S],3$Q,3$Q,3$Q(/S](2#\_/S\_3#](*TA(2$A(*S](5%145%145%14 M5%145%145%145$I45%145%145%145#I*5"E45%145%145%145%145"DI4RE3 M4U-3/E-34U-34U-34U-34U-34U,I4U-3&QM34U-34U-35%-3&R`;(!M*2AL@ M&R`;(!L@*2`@&R`@*2D;(!L@&R`;(!L@("D@(%,@(%-$4RE31%-$1$0@1"`@ M("`@("`@("`@("`@("`;("`;("`@("`@("`@("`@("`@("`@&R`@("`@(%96 M(%965E96(5965E968E9B5F)B8F)B8F)B8F)B%F)B8A9B%A86(2$A(2$6%A86 M%B0A(2%'(4<A(4<A1R%'(2%'1R%'(4='(4='(4='(4='1T<A1U)*/RLK*RL* M"@HK"@HK*RLK*T@_2$A(*RLK+`H*"BP*"BLK*S](/TP_/S](2$A(3$Q(2#\_ M/S\_/T@K2$@K*S\_/TA("BPF(RQ(2$@K3$@*"BLK/S\_/S\_2$@_3$Q,3#\_ M3$Q,3$Q,3$Q,2#\_2#],/S\_2$@K*S\_2"LK*RM(.U145%14(U142E0I5%14 M5%145%145%145%145%145%145%145"E4*5145%145%145%0I*4HI*5,I2E-3 M4U-34U,I4RE34U-34U-3*5-34U-34U-34RE3*5134QL;(!L@&R`;(!L@&R`; M(!L@&R`I*1L@(!M3&U,@&R`@4R!34QL@4T13(%,@(%,@1%,@($H@("`@("`@ M("`@("`@(!L@("`@("`;(!L@&R`;("D@&R`@&R`@("`@(!L@("!65E965E96 M5E965E965E965F)B5F(@8F)B8F)B8F(68A9B%A9B%A8A(2$A%A86%A86(2%' M(2$A(2$A(2$A(2%'1R%'(4<A1R%'(4<A1T<A1R%'1R%'`B,_/S\_/S\_*PHK M/S\_/PHK2$@_/PH*"BLK/T@L"D@K*RL_/T@_/TA(3$Q,/S\_*RM(/S\_/S\_ M*RLK2$@_/S](2$@K,#HF"@H*2"LK*PHL*TA(2$@_2$@_3$Q,3$Q,2$Q,3$Q, M3$Q,3$A(2#],/TA(2$A(*S\_3#](2$A(.TI45%1*5%145%0I5%1*5%145%14 M5%1*5%1*5%145%14)E145%14*50I5%145"DI5%145%0I*5,I4U,I4U,^4RDI M*2DI4U-34RDI4RE35%-34U-34U-34U-34U-3(!L@&QL@&RD@("D;(!L;(!L@ M&R`;&QM34U-3&QL@&QM3&R!3&R!3&R!34U,@4U-$("`I1"`@("`@&R`@("`@ M&R`@("`@&R`@("`@("`@("`@("`@("`@&R`;("`@("`;5E961U965E965E96 M5E968E9B5F)'1V)68F)B8F)B8F(6%F(6%A86%A86%A86%A86(2$A(4<A(4<A M(4<A1R%'(2%'(2$A(4<A1R%'1R$A1R%'(2%'(4<D)B8F/TA(/S\_/S\_/T@K M"DA(2"LK*RL_/T@*"BPK/S\_2#](*RLK*S\_/TP_2"M(2#\_/S](2$A(2#\_ M2$A(*TA(*PHL)@H*"BLK/RLK+CLK*RLK*TA(3$Q,3$Q,/TA,3$Q,3$Q,3$Q( M2$A(3$@_/S\K2$@_/S](/S\_(TI45%0I5%14*50I*5142E145%0Q2E145%14 M5%0Q5%145%14)E145%0I5"DI5"DI*5145%14*2DI*5,I4RDI4U,I*2DI*2DI M4RDI4RE34S$Q4U-34U-34U-34U13&QL;(%,@&QLZ*1L@(!L@(!L;(!L@&R!3 M4U-34U,;&QL@&QM34R`;4R!3(%,@4T13(%,@(!L@("`;("`@&R`@("`@("`; M("`@("`;(!L@&R`;(!L@*2`@&R`@("`;(!L@(%965E965E965E965E965E96 M8E9B8E9B8F)B8F)B8A86%A86%A9B%A86%A86%A86%A86%B$A1R$A(2$A(2$A M(4<A1R%'(4<A(4<A(2%'(4<A1T<A4T<A1R$D)",K2$@_/S],3$Q,/T@K"BL* M/S\_/S\*"BLK"DA(2#\K"@H**RM(2$@_*RM(2#](2$A(2#](2#\_2"LK*S\_ M2$@K*RPL+"PK/S](*RLC2$A(3$A(*TQ,3$Q,3$Q(3$Q,3$P_/S\_2$A(2#]( M2$A(2$A,/S\_/R,C(U14*5145%14*50I*2DI2DI4*5145%145%145%142E14 M2E145$I*5%145%145"DI*2DI5%145%14*2DI*2E*5"DI*2DI*5,I*2D^/E-3 M4U-34U-34U-34U,I4U-34U,;&QL@&QL@4R`;&QL@&QM*2E,;&R`;4U-44U-3 M4U,;&QL;(!LI&R`;(!L;4QM34U,@&R`@("`@("`@("`@&R`;("`;("`;*1L@ M("`@&R`;("`@(!L@&TH@("D@(!L@("!65E965E965E965E8A5E965E965E9B M8E9B8F)B8A9B%F(6%A8D4Q86%A868A9B%A86%A86(2$A(2$A(2$A(2$A(2$A M(2$A(4<A(4I'(2%'(2$A1R$A1R%'(20D2D@_/S\_/S\_/S\_/S\K2#\_/T@K M"@I(/PHK*RLK"BL*"BLK2$A(*TA(2"LQ2B0D4S$F"BM(/T@K*RM(*RLK2$@N M2E-34U-3*S\_"BLK*S\K2"M,2#],3$Q(*S],3$P_*RLK*T@K/S\_2"LK*TA, M/TQ(/R-*2BE4*2E45"E45"DI/BDI*2E*5#I*5%145%145%145%145%145%0Q M5%145%145"E4*50I*5145%145%14*50I*2DI*50I*2DI4RE34U-34U-34U-3 M4U-34U-34U-3*5-3&QL;&R`;&R`;(!L@&R`;(!L@&R`;&U-45%-34U-34U-3 M&QL;&R`;("`;(%-34U-34U,@1!L@&R`;("`;("`@("`;(!L@&R`@(!L@&R!3 M(!L@(!L@("`;(!M*(!L@&R`@5E965E965D=65E8A1%965E968E9B5E9B5F)B M8F)B%A9B%F(6%A868A868A86%A86%A86(186(18A(186%A86%A86(2$A(2$A M(4<A(4<A(4<A4B%'(2$A1R$A)"0I2#](/TA(2#\_/S\_2#\_/S\K*S](/S]( M"@H*+`HL+`H_3$Q,3"LK/SI$5P`I)"0D)%,*2$@K*RLK2#\K*RQ34RE34U-3 M4U(L/RLK*RM(2$A(2"M,/S\_2$@_3$P_2"LK*TA(3$Q(/TA(2$@_3#\_*R-4 M5%13*2E**514*2DI*2DI/BDI*2E*5%0I5%145%145%145%142E14,5145%14 M5%145%0I*50I5%145%145%145"DI5%0I5"D^4SY3*5-34SY34U-34U-35%-3 M4RDI*5-44U-3&QL;&R`;&QL@&QL;&QL@&QL;(%-34U134U-34U-34U,;(!L@ M&R`;(!M34U-34U0I&RD@("`@2AL@(!L@&R`;("`@("`;&R`;(!L;&QL;&QL; M&QL@("`;(!L@&R`;(%965E965E8A5E965B%65E965E965E9B5F)B%F(6%F(6 M8A868A86%A9"%A9B%A9B%A8D5!86%A86%A86%A86%A86%A8A(2$A(2$A(2$A M(2$A(5,A(2%'(2%'(4<D1T<8&#](2$@_/S\_/T@_/S\_*RL_2#\_2`H*"BP* M+"P*/TQ,3$PK*S\Z1%<D)"0D)"13"DA(*RLK*T@_*RLL4U-34U-34U-2+#\K M*RLK2$A(2$@K3#\_/TA(/TQ,/T@K*RM(2$Q,2#](2$A(/TP_/RLC5%134RDI M*50I*2DI*4H^*2DI*2DI*50I5%145%145%0Z5%145%145%145$I45%145%14 M5%0I*2E45"E45%145%145%14*2DI*3X^/E,^/E-34U-34U,^5%-34U-34U,I M4U-34U-34QL;&QL@&QL@&TH@&QL@&QM34U-34U-34U-34U-34U,;&QL;(!M3 M4U-34U-34QL;(!L@&R`;(!L@&R`;(!L@&R`;("`;&QL;4U-34U-34U-34QL; M(!L@&R`;(!LA5E965E965E965E965E965E965E965F)B8F)B8F(68A9B%A9B M%E0:&A9B%AH6%A86)!9B%A86%A86%A86%A86%A86%A86(2$A(2$A(2$A`B$A M(2$A(2%'(2$A1T='&$='2$A(/S\_/S](/S\_/RLK/T@_/T@*"@HL"BPL"C], M3$Q,*RL_.D0D)"0D)"0D4PI(2"LK*RM(/RLK+%-34U-34U-34BP_*RLK*TA( M2$A(*TP_/S](2#],3#](*RLK2$A,3$@_2$A(2#],/S\K(U0I4RDI*2DI*2DI M*3XI/CXI/BDI*4HI5"E4*514*514.BE45%1*)E142E145%145%142E145%0I M*2E4*50I5%145%145"DI*3X^*3X^/E,^2E-3/E-34U-34U-34U-34RE3*5-3 M4U-34U13&QL@&QL;&R`;&QM34U-34U-34QM34U-34U-34U-34QL;*4I34U-3 M4U-3&QL@&R`@&R`;(!L@("`;("`;(%-34U-34U-34U-34U-34U-44QL@(!L@ M&R`@5E965E965E965E964E965E965E965E968F)B8F)B8F(6%F(:8AH:8AIB M%AH68A9B%A8:%AH6%AH6%A9B%A86%A86)!86%A86%A86(2$6(2$6(2$A(2$A M(2$A1R%21T='1T<_/T@_/S],2#\K*RLK/S\_2$Q(+BXN)CL["BY(/TQ,3"M( M/U,8)"0D)"0D)"1**T@K/S\_/T@K*S%*4U-34U-31"0@/TP_/S](/S](/RM, M/S\_2"M,3$Q(2#\_/TQ,3$Q(2$A(2$@_/S\K2E0I4U-3*2DI*2DI4RE3/E,I M/BDI/BDI*2DI*5145%14*3I45%145%145%145$I45%145%145%0I5"DZ*50I M*2DI5%145$HI/BD^*3X^/BD^4RD^/E,I4SY34U-34U134U1*4U-3*5-34U-3 M4QL;&QL;&QL;&QM34U-34U,;4U-34QL;&U-35%-34U-34U-34U-34U-34U-3 M4U,;&R`;(!L;(!L@5"D;4U-34U-34U-34U,;4U,;&U-34U-3&U-44QL;&U96 M5E965E965E965D=65E965E965E9B5F)B8F)B5AAB8F(68F)B8F)B&AH:&AH: M&AH:&AH:%AH6%A8:%A8:%A86%A86%A8D%A86%A86%A86%A8A(2$A(2$A(2$O M4D='1R%'/S](2#\_/S](*RLK/S\_/S\_*RPL+#HZ+`H*"DA(2$A(2"LD)"0D M)"0D)"0D&PHD)"0D)"0D)"134U-34RE34U-31RP_/S\_*T@_/S](3#\_/TA( M/S](/T@_/S],3$Q,2$@K*RLK/TP*#"E4*5,I4RDI*2DI4SX^/CXI4RE3*2DI M*2DI*5145%0I5%145%145%145%145%145$I45%145%145%14*50I*2E4.DHI M*2E**2DI/BDI/CY*2BE3/CY3/E-3/E-34U-34U-34U-34U-3*5,F4U-34U-3 M&QL;&QM34U-34U-3&U-34U-34QL;4U-34U134U-34U-34U-34U-34U-44U-3 M&QL@("`;4U-34U-34U-34U,;&QL;&QL;&R`;&U-35%-3,5-35%165E965E96 M5E965E965E965E965E965E968F)B8F(@&!9B8F)B8F)B8F)B8B`:8F(:&F(: M8AH:&AH:)&(6&A9B%A9B%A86&Q8D%A86%A86%A86%A86(2$A(2$A(2\A&$=' M1RLK/T@_2#],/S\_/TA(/S\K*RL*"@HL(R8L"@HK*RLK/S\L0B0D)"0D)"0D M)"0D*20D)"0D)$I*)%-34U-34U-34U,C*TA(2"L_2#\_2$A(2$@_*T@K/TQ, M3$Q,3$Q,/T@K3$A(2#\[*50I*5,I4RDI*4HI/E-34SY3/E,I*5,I*5,I*2DI M*5145"DI5"E45"E45%142E145%145%145%14,5145%14*50I*50I*50I*2DI M*2DI*2DI*3X^*3XI/CX^*5-3/E-34U-34U-34U-34U-3*5-34U-34U-34U-3 M4U,Q*5-34U,;4U-34U,;&QM34U-34U-34U-44U-34U-34U-34U-34U,;&QL; M4U-34U-34U-34U,;&QM4(!LI&RD;(!M34U-34U-34U-35E965E965E965E96 M5E965D=65E965E9B8F)B8F)B&&)B8F)B8F)B8F)B8F)B8F(:8F(:&AI"&F(6 M0AL:&A8:%AH6%A9B%A86%A86%F(6%A86%A8D%A86(2$A(1LA+T='1T<@("Q( M2#],/TA(2$@K/S\K2"M(2$A(2`HF(RP*+`H*"DA(2%,O)"0D)"0D)"0D)"0D M)"0D)"1*)$I34U-34U-34U-3"BM(2$@K*S\K2#\K/S\_2$@K/T@_3$Q,3$Q, M3$Q(3#](2$A*5"DI.E-3*5,I4RE3*5-34U-3/E,^4PQ3*5,I*2DI*2E4*50I M5"DI5"E45%145%145%145%0Q,5145%145%145%145#I*.BDI*2DI5"DI*2DI M*2DI*3XI4RDI4U,^/E,^4THQ4U-34U-34U-34U,I4RE34U-34U-34U,I4U-3 M4U-35!M34U-3&U-34U-34RE34U-34U-34U-44U-34U-34U-34U-34U-34U-3 M4QL;&U-3&QL@&R`;(!L;&QL;&U-34U-34U-34U965E965E965E965E965D=6 M5E9B5E9B5F)B8F)B8F)B8AAB8F(@1V)B8F)B8F)B8F(:8F)B0D(:&F(68A9B M%F(6&A9B%A86%F(6&A86%A86%A86)!86%A86(2%3(5)31T='1R0D2D@_2$@K M2$A(/TA(/RLK/TQ,3$P_"BX*"BP*"@HK*RL**4<D)"0D&R0D)"0D)"0D)"0D M)"0D4U-34U-34U-34RLK2$A("@HK2$A(3#\_/S\K/S\_3$Q,3$Q,3$Q,3#\P M5"DI*2DI*4HI*5,I*3I3*5-34U-34U,^/E,I4RDI*2DI*2E4*2DI5"DI5%0I M*5145%145%145%145%142E145%145%14.E1*5%145"E4*2DI5$HI*2DI*2DI M*2E*4RDI/CY3/E,^4U-34U-34U-34U-34U,,4RE34U-34U-34U-34U-3&U13 M4U-3&U-3,1M34U-34RE34U-35%,I5%,I4U-34U-34U-34U-34U-3&QL;&QL; M&QL;&QL;&QL;&QL;&QL;&U-34U-34U-65E965E965E965E965F)68E8Q5F)6 M8F)B8F)68F)B8F)B8F)B5F)68F)68F)B8F)B8F(:&&(:8AIB&AH:&AH:&A9B M%AH:%AH6&A86&A8:%A868B06%A86%A8A(2$A4D<A(4<A)"0Q+$A(2$A(2#\K M2$@*/S\_/S],/T@L+`HN.SL[+`H*2"LC5"`D("`D)"0D`@("`@)24E)$1"`@ M4T13(%,@4QM(*TA(2"LL/TA(2#\_/S](*S](/TQ,3$Q,3$P_/PI*5"D^*2DI M*2DI*5,I4RD,4U-32E-34U-34U-34RDI*2DI*2DI*50I5"DI5"E45%145%14 M2E145%145%145%145%145%145%145%145%145"E4*50I*50I*2DI*2DI*2E3 M*5,I4SY3/E-34U-34U-34U-34U-35#X^*5,I4U,I4RE34U-34U-34U-34U-3 M4U-34U-34U-34U-34U-34U-34U-34U-34U-34U-34U-34QL;&QL;&QL;&QL; M&QL;&QL;&QL;4QL;&QM3&U-35E965E965E965F)65F)65E961U9B8F)B8F)B M8F)65E965E965E968E9B8F)B8F)B8F)B8F(:8AIB&AIB&F(68A9B%AH:%F(6 M&A9B%AH6%A8:%A86&A86%A86%B$A(2$A(4<A(4<A1QLI"C\_/S\K*RLK"BM, M/S\_3$Q(2`HN.SL[.S`N"DA(2$@[.SL;)"0D)"0")`)24E)$1$0I($13(%,@ M3$P_/T@_/S](*TQ(*T@_2$A(*RM(*TQ,3$Q,3$@_3$I**2E34U,I*5,I*2E3 M2BD^4U-35"Y34U-34U-34RDI*50I*2DI5%0I*2DI*2E45%145%145%145%14 M5%145%142E145%145%145#%45%145%145%14*50I*2E4*50I5$HI*2D^*3X^ M*5,^4SY34U-34U-34U-34U-34TH^4RE**5-34U-34U-35%-34U-34U-34U-3 M4U-34U-34U,;4U-34U-34U-34U-34U-34U-34U,;&QL;&QL;&QM4&QM3&QL; M5!L;&QL;5%13&U,;4U965E965E965E965E965E9'5F)B8F)B8F)B8E965E96 M5E965E965F)68E9B8E9B8F)B8F)B8F(:8AIB&F(:8AIB%F(68A8:&AH6&A8: M%F(6%AH6%A86%A86%A8A(2$A(2\A(4<A(4<A1R0^+"PL*RLK*PI(/TQ,3$A( M2"LL(RXN+BXL+"PL*PHL.SL[("0D)"0D)`("`@)24D0@4T13(%,L&TQ,3$A( M2$A(2$Q,/RM(2`H*"BLK*S],3$@K*RLK)DHZ4RE34U-3/E,I*2E3*2E34U-3 M4U-34U0^4U-34U-3*2DI*2DI*2DI*2E4*5145%145%145%145%142E142E14 M5%142E145$I4,51*5%1*5%145%145%145%145%145%142BDI*5,I4SX^4SY3 M4SY34U-34U-34U-34U-34U,^4SY34U-34U-34U-34U-34U134U-34U-34U-3 M4U-34U-34U-34U-34U-34QM34U-34U-3&QL;&QL;&QL;&QL;&QM3&U,;4QM3 M&U-34U-34U-65E965E965E965E965E961U968F)B8F)B8D='4E965E965E96 M5E965E9B5F)B5F)B8F)B8F)B8F)B&F(:8AH:&F(:8AH:&AH:)&(68A8:&A8: M%AH6%A86%B0;)!8;(2$A(2\A(4<A1R%'/BPL+"LK*RL*2#],3$Q(2$@K+",N M+BXN+"PL+"L*+#L[.R`D)"0D)"0")`("4D1$("`@("`@+$Q,3$Q(2$A(2$A, M3#\K2$@*"@HK*RL_3$Q(*RLK*R9*.E-34U-34U-3*2E3*2E34U-34U-34TI4 M4U-34U-3*5,Z*2DI*51*5"DI*5145%145%142E145%145%145%142E145%14 M.DI45%145%145%145%145%145%145%145%145%14*2DI*3XI4RD^/CY3*5,^ M4U-34U-34U-34U-*4U-34U-34U-34U-34U-34U,Q4U-34U-34U-35%-34U-3 M4U-34QM34U-44QM34U-34U-34QM3&U,;4QM3&U14&U,;4QM3&U-34U-34U-3 M4U-35E965E965E9'5E965E965E9B8E9B8F)B8F)B1U965E965E965E965E96 M8E9B5F)B5F)B8F)B8F)B8F)B&F(:8AIB&AIB&F(:&B`:&AHD&QH6&A86&A8: M%A86%A86`A8A(2$A+R\O(4<A1R]'+RPK*RLK"D@_3$Q,2$A(*RPC+BXN+BPL M+"PK"BP[.SL@)"0D)"0D)`("`@)21"`@4R`@4RQ,3$Q,2$A(2$A(3$P_*TA( M"@H**RLK/TQ,2"LK*RLF4U-34U-34U-34U-34U-34U-34U0Q4U-35%-34U-3 M4RDI*5,I*2DI*2DI5"DI*2DI*2DI5#I45%145%145%145%145%145%0Q.DI* M5%0Q5$I*5%145%145%145%1*5%145%145%145"DI*2E3/CY3/E,^4U,^/E-3 M4U-34U-34U-34U-34U-34U-34U-34U-34U-34U-34U-34U134U-34U-34U-3 M4U-34QM3&U,;4U-34U-34U-34U-34U-34U-34U-34U-34U-34U-34U-34U96 M5E965E965E965E965E965E9B8AAB8F)68E965E965E965E965E965E965F)6 M8AA'8E9B8F)B8F)B8F)B8F)B&F)B&F(:&AH:&AH:&AH:&AH:%AH6%AH6%A86 M%A8A(2$A(2$A(2\O+U(O+T<O/BXK*PHK"BLK*RM(*PH*+`HK*RL*"CLL"@HC M.CHZ("0D)"0D)"0D`@("4D0@("`@(%,[3$P_3$A(*RLK3$Q,*RLK2"LK*T@_ M3$P_2`HC(U1*4U-34U-34U-34U-34U-34U-3&U,;4U,;4U-34U-34U-34RDI M*2DI4RDI*2DI/CX^/BD^*2DI*2DI5%145%145%145%145%142E0Q5#%*5%14 M5%1*5%0Q2E145%145%1*5%1*5$I45%145"E*/BD^*3X^4SX^4U-3/E,^4U-3 M4U-34U-34TI34U-34U,^4U-34U-34U-34U-34U-34U-34U-34U-34U-34U-3 M4U-34U-34U-34U-34U-34U-34U-34U-34U-34U-34U-34U-34U-65E965E96 M5E965E965E965F)B8F)B8F)'8E965E965E965E965E965E965E961U96&%9B M8F)B8F)B8F)B8F)B8F)B&F(:8AIB&F(:&AH:&AH6&AH6&A86%A86%A86%A8A M(2$A(2\A+R\O+R\O1U)21T<K*RLK*RM(2$@K*RL*"@H**RPC.RLL.SHZ.B!" M)"0D)"0D)"0"`E)$("`@*4I3.C\_3#](2#\_/TQ,3"M(2"L_/S\_3$Q("DI4 M&U0Q5%-45!M34QM3&U-34QM3&U-3&U-34QM35%,;4U-34U-4/BE34U-34U,^ M4SY3/E,^4SX^/CX^*2DI*2E45%145%145%145%14,4I45%145%0Q5%145%14 M5#%45%145$I42E1*5%145%142E14(RDI/CX^/CX^/CX^2E,^4SY3/E,^4SY3 M/E-32E-3/E-34U-34U-34U-34U-32B934U-34U-34U-34U-34U-34U-34U-3 A4U-34U-34U-34U-34U-34U-34U-34U-34U-34U-34U-3 ` end ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/win32/mhaskyn.h���������������������������������������������������������������0000664�0000764�0000764�00000000465�10545462317�015243� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (C) 2001 by Alex Kompel <shurikk@pacbell.net> */ /* 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 */ �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/win32/uudecode.dsp������������������������������������������������������������0000664�0000764�0000764�00000012567�10545462317�015733� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# 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 �����������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/win32/mhinput.h���������������������������������������������������������������0000664�0000764�0000764�00000001574�10545462317�015257� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (C) 2001 by Alex Kompel <shurikk@pacbell.net> */ /* 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 */ ������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/win32/winMS.h�����������������������������������������������������������������0000664�0000764�0000764�00000013537�10545462317�014632� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (C) 2001 by Alex Kompel <shurikk@pacbell.net> */ /* NetHack may be freely redistributed. See license for details. */ #ifndef WINMS_H #define WINMS_H #define WIN32_LEAN_AND_MEAN #include <windows.h> #include <commctrl.h> #include <tchar.h> #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 */ LONG regMainMinX; LONG regMainMinY; LONG regMainMaxX; LONG regMainMaxY; LONG regMainLeft; LONG regMainTop; LONG regMainBottom; LONG regMainRight; DWORD regMainShowState; } 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, int); 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_popup_display(HWND popup, int* done_indicator); void mswin_popup_destroy(HWND popup); void mswin_read_reg(void); void mswin_destroy_reg(void); void mswin_write_reg(void); int NHMessageBox(HWND hWnd, LPCTSTR text, UINT type); 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 */ �����������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/win32/tiles128.dsp������������������������������������������������������������0000664�0000764�0000764�00000005177�10545462317�015510� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Microsoft Developer Studio Project File - Name="tiles128" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) External Target" 0x0106 CFG=tiles128 - 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 "tiles128.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 "tiles128.mak" CFG="tiles128 - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "tiles128 - Win32 Release" (based on "Win32 (x86) External Target") !MESSAGE "tiles128 - Win32 Debug" (based on "Win32 (x86) External Target") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" !IF "$(CFG)" == "tiles128 - 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 tiles128.mak" # PROP BASE Rebuild_Opt "/a" # PROP BASE Target_File "tiles128.exe" # PROP BASE Bsc_Name "tiles128.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 "tiles128.mak"" # PROP Rebuild_Opt "/a" # PROP Target_File "..\binary\tiles128.bmp" # PROP Bsc_Name "" # PROP Target_Dir "" !ELSEIF "$(CFG)" == "tiles128 - 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 Cmd_Line "NMAKE /f tiles128.mak" # PROP BASE Rebuild_Opt "/a" # PROP BASE Target_File "tiles128.exe" # PROP BASE Bsc_Name "tiles128.bsc" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Cmd_Line "nmake /f "tiles128.mak"" # PROP Rebuild_Opt "/a" # PROP Target_File "..\binary\tiles128.bmp" # PROP Bsc_Name "" # PROP Target_Dir "" !ENDIF # Begin Target # Name "tiles128 - Win32 Release" # Name "tiles128 - Win32 Debug" !IF "$(CFG)" == "tiles128 - Win32 Release" !ELSEIF "$(CFG)" == "tiles128 - 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 �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/win32/winhack.c���������������������������������������������������������������0000664�0000764�0000764�00000017166�10545462317�015216� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (C) 2001 by Alex Kompel <shurikk@pacbell.net> */ /* NetHack may be freely redistributed. See license for details. */ // winhack.cpp : Defines the entry point for the application. // #include <process.h> #include "winMS.h" #include "hack.h" #include "dlb.h" #include "resource.h" #include "mhmain.h" #include "mhmap.h" #ifndef __BORLANDC__ #include <shlwapi.h> #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: 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); /* get command line parameters */ p = _get_cmd_arg(GetCommandLine()); p = _get_cmd_arg(NULL); /* skip first paramter - command name */ for( argc = 1; p && argc<MAX_CMDLINE_PARAM; argc++ ) { len = _tcslen(p); if( len>0 ) { argv[argc] = _strdup( NH_W2A(p, buf, BUFSZ) ); } else { argv[argc] = ""; } p = _get_cmd_arg(NULL); } GetModuleFileName(NULL, wbuf, BUFSZ); argv[0] = _strdup(NH_W2A(wbuf, buf, BUFSZ)); if (argc == 2) { TCHAR *savefile = strdup(argv[1]); TCHAR *plname; for (p = savefile; *p && *p != '-'; p++) ; if (*p) { /* we found a '-' */ plname = p + 1; for (p = plname; *p && *p != '.'; p++) ; if (*p) { if (strcmp(p + 1, "NetHack-saved-game") == 0) { *p = '\0'; argv[1] = "-u"; argv[2] = _strdup(plname); argc = 3; } } } free(savefile); } pcmain(argc,argv); moveloop(); return 0; } 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; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/win32/mhmsgwnd.h��������������������������������������������������������������0000664�0000764�0000764�00000000575�10545462317�015417� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (C) 2001 by Alex Kompel <shurikk@pacbell.net> */ /* 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 */ �����������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/win32/recover.dsp�������������������������������������������������������������0000664�0000764�0000764�00000012435�10545462317�015575� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# 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 \ if exist ..\doc\recover.txt copy ..\doc\recover.txt ..\binary\recover.txt # 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 \ if exist ..\doc\recover.txt copy ..\doc\recover.txt ..\binary\recover.txt # 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 �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/win32/mhmain.h����������������������������������������������������������������0000664�0000764�0000764�00000000675�10545462317�015045� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (C) 2001 by Alex Kompel <shurikk@pacbell.net> */ /* 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 */ �������������������������������������������������������������������slashem-0.0.7E7F3/win/win32/mhstatus.h��������������������������������������������������������������0000664�0000764�0000764�00000000567�10545462317�015444� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (C) 2001 by Alex Kompel <shurikk@pacbell.net> */ /* 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 */ �����������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/win32/tiles128.mak������������������������������������������������������������0000664�0000764�0000764�00000002175�10545462317�015465� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������default: all all: ..\binary\tiles128.bmp clean: -del ..\win\share\mon128.txt -del ..\win\share\obj128.txt -del ..\win\share\oth128.txt #========================================================== # Building the tiles file tile.bmp, tile32.bmp, tile128.bmp #========================================================== ..\src\tiles128.bmp : ..\win\share\mon128.txt ..\win\share\obj128.txt \ ..\win\share\oth128.txt ..\util\tile2bmp.exe chdir ..\src ..\util\tile2bmp.exe tiles128.bmp ..\win\share\mon128.txt ..\win\share\obj128.txt \ ..\win\share\oth128.txt chdir ..\build ..\binary\tiles128.bmp: ..\src\tiles128.bmp @copy ..\src\tiles128.bmp ..\binary\tiles128.bmp ..\win\share\mon128.txt: ..\util\txtbg.exe ..\win\share\absurd\mon128ab.txt ..\util\txtbg ..\win\share\absurd\mon128ab.txt ..\win\share\mon128.txt ..\win\share\obj128.txt: ..\util\txtbg.exe ..\win\share\absurd\obj128ab.txt ..\util\txtbg ..\win\share\absurd\obj128ab.txt ..\win\share\obj128.txt ..\win\share\oth128.txt: ..\util\txtbg.exe ..\win\share\absurd\oth128ab.txt ..\util\txtbg ..\win\share\absurd\oth128ab.txt ..\win\share\oth128.txt ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/win32/mhstatus.c��������������������������������������������������������������0000664�0000764�0000764�00000010635�10545462317�015434� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (C) 2001 by Alex Kompel <shurikk@pacbell.net> */ /* 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 BUFSZ typedef struct mswin_nethack_status_window { int index; char window_text[NHSW_LINES][MAXWINDOWTEXT+1]; } 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; i<NHSW_LINES; i++ ) { GetTextExtentPoint32(hdc, NH_A2W(data->window_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); } } ���������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/win32/mhsplash.h��������������������������������������������������������������0000664�0000764�0000764�00000000456�10545462317�015410� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* 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 (BOOL); #endif /* MSWINSplashWindow_h */ ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/win32/mhdlg.h�����������������������������������������������������������������0000664�0000764�0000764�00000000703�10545462317�014657� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (C) 2001 by Alex Kompel <shurikk@pacbell.net> */ /* 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 */ �������������������������������������������������������������slashem-0.0.7E7F3/win/win32/mhmenu.h����������������������������������������������������������������0000664�0000764�0000764�00000000766�10545462317�015066� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (C) 2001 by Alex Kompel <shurikk@pacbell.net> */ /* 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 */ ����������slashem-0.0.7E7F3/win/win32/tile2bmp.dsp������������������������������������������������������������0000664�0000764�0000764�00000012077�10545462317�015650� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# 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 �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/win32/dgncomp.dsp�������������������������������������������������������������0000664�0000764�0000764�00000017641�10545462317�015563� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# 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 �����������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/win32/mhmenu.c����������������������������������������������������������������0000664�0000764�0000764�00000120056�10545462317�015054� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* 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 <assert.h> #include "resource.h" #include "mhmenu.h" #include "mhmain.h" #include "mhmsg.h" #include "mhfont.h" #include "mhdlg.h" #define MENU_MARGIN 0 #define NHMENU_STR_SIZE BUFSZ #define MIN_TABSTOP_SIZE 0 #define NUMTABS 15 #define TAB_SEPARATION 10 /* pixels between each tab stop */ #define DEFAULT_COLOR_BG_TEXT COLOR_WINDOW #define DEFAULT_COLOR_FG_TEXT COLOR_WINDOWTEXT #define DEFAULT_COLOR_BG_MENU COLOR_WINDOW #define DEFAULT_COLOR_FG_MENU COLOR_WINDOWTEXT 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[NUMTABS];/* 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) { 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; i<data->menu.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 */ for( i=0; i<data->menu.size; i++) { 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); } mswin_popup_display(hWnd, &data->done); /* get the result */ if( data->result != -1 ) { if(how==PICK_NONE) { if(data->result>=0) ret_val=0; else ret_val=-1; } else if(how==PICK_ONE || how==PICK_ANY) { /* count selected items */ ret_val = 0; for(i=0; i<data->menu.size; i++ ) { if( NHMENU_IS_SELECTABLE(data->menu.items[i]) && NHMENU_IS_SELECTED(data->menu.items[i]) ) { ret_val++; } } if( ret_val > 0 ) { int sel_ind; selected = (MENU_ITEM_P*)malloc(ret_val*sizeof(MENU_ITEM_P)); if( !selected ) panic("out of memory"); sel_ind = 0; for(i=0; i<data->menu.size; i++ ) { if( NHMENU_IS_SELECTABLE(data->menu.items[i]) && NHMENU_IS_SELECTED(data->menu.items[i]) ) { selected[sel_ind].item = data->menu.items[i].identifier; selected[sel_ind].count = data->menu.items[i].count; sel_ind++; } } ret_val = sel_ind; *_selected = selected; } } } mswin_popup_destroy(hWnd); 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->iItem<data->menu.size && NHMENU_IS_SELECTABLE(data->menu.items[lpnmlv->iItem]) ) { SelectMenuItem( lpnmlv->hdr.hwndFrom, data, lpnmlv->iItem, -1 ); data->done = 1; data->result = 0; return TRUE; } } } 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_CTLCOLORSTATIC: { /* sent by edit control before it is drawn */ HDC hdcEdit = (HDC) wParam; HWND hwndEdit = (HWND) lParam; if( hwndEdit == GetDlgItem(hWnd, IDC_MENU_TEXT) ) { SetBkColor(hdcEdit, text_bg_brush ? text_bg_color : (COLORREF)GetSysColor(DEFAULT_COLOR_BG_TEXT) ); SetTextColor(hdcEdit, text_fg_brush ? text_fg_color : (COLORREF)GetSysColor(DEFAULT_COLOR_FG_TEXT) ); return (BOOL)(text_bg_brush ? text_bg_brush : SYSCLR_TO_BRUSH(DEFAULT_COLOR_BG_TEXT)); } } 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: { int i; if( data->type!=MENU_TYPE_MENU ) SetMenuType(hWnd, MENU_TYPE_MENU); if( data->menu.items ) free(data->menu.items); data->how = PICK_NONE; data->menu.items = NULL; data->menu.size = 0; data->menu.allocated = 0; data->done = 0; data->result = 0; for (i = 0; i < NUMTABS; ++i) data->menu.tab_stop_size[i] = MIN_TABSTOP_SIZE; } break; case MSNH_MSG_ADDMENU: { PMSNHMsgAddMenu msg_data = (PMSNHMsgAddMenu)lParam; char *p, *p1; int new_item; HDC hDC; int column; HFONT saveFont; if( data->type!=MENU_TYPE_MENU ) break; if( strlen(msg_data->str)==0 ) break; if( data->menu.size==data->menu.allocated ) { data->menu.allocated += 10; data->menu.items = (PNHMenuItem)realloc(data->menu.items, data->menu.allocated*sizeof(NHMenuItem)); } new_item = data->menu.size; ZeroMemory( &data->menu.items[new_item], sizeof(data->menu.items[new_item])); data->menu.items[new_item].glyph = msg_data->glyph; data->menu.items[new_item].identifier = *msg_data->identifier; data->menu.items[new_item].accelerator = msg_data->accelerator; data->menu.items[new_item].group_accel = msg_data->group_accel; data->menu.items[new_item].attr = msg_data->attr; 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 */ hDC = GetDC(hWnd); saveFont = SelectObject(hDC, mswin_get_font(NHW_MENU, msg_data->attr, hDC, FALSE)); p1 = data->menu.items[new_item].str; p = strchr(data->menu.items[new_item].str, '\t'); column = 0; for (;;) { TCHAR wbuf[BUFSZ]; RECT drawRect; SetRect ( &drawRect, 0, 0, 1, 1 ); if (p != NULL) *p = '\0'; /* for time being, view tab field as zstring */ DrawText(hDC, NH_A2W(p1, wbuf, BUFSZ), strlen(p1), &drawRect, DT_CALCRECT | DT_LEFT | DT_VCENTER | DT_EXPANDTABS | DT_SINGLELINE ); data->menu.tab_stop_size[column] = max( data->menu.tab_stop_size[column], drawRect.right - drawRect.left ); if (p != NULL) *p = '\t'; else /* last string so, */ break; ++column; p1 = p + 1; p = strchr(p1, '\t'); } SelectObject(hDC, saveFont); ReleaseDC(hWnd, hDC); /* 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 colors */ ListView_SetBkColor(control, menu_bg_brush ? menu_bg_color : (COLORREF)GetSysColor(DEFAULT_COLOR_BG_MENU)); ListView_SetTextBkColor(control, menu_bg_brush ? menu_bg_color : (COLORREF)GetSysColor(DEFAULT_COLOR_BG_MENU)); ListView_SetTextColor(control, menu_fg_brush ? menu_fg_color : (COLORREF)GetSysColor(DEFAULT_COLOR_FG_MENU)); /* 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; i<data->menu.size; i++ ) { LVITEM lvitem; ZeroMemory( &lvitem, sizeof(lvitem) ); sprintf(buf, "%c - %s", max(data->menu.items[i].accelerator, ' '), data->menu.items[i].str ); lvitem.mask = LVIF_PARAM | LVIF_STATE | LVIF_TEXT; lvitem.iItem = i; lvitem.iSubItem = 0; lvitem.state = data->menu.items[i].presel? LVIS_SELECTED : 0; lvitem.pszText = NH_A2W(buf, wbuf, BUFSZ); lvitem.lParam = (LPARAM)&data->menu.items[i]; nItem = SendMessage(control, LB_ADDSTRING, (WPARAM)0, (LPARAM) buf); if( ListView_InsertItem(control, &lvitem)==-1 ) { panic("cannot insert menu item"); } } SetFocus(control); } /*-----------------------------------------------------------------------------*/ HWND GetMenuControl(HWND hWnd) { PNHMenuWindow data; data = (PNHMenuWindow)GetWindowLong(hWnd, GWL_USERDATA); if(data->type==MENU_TYPE_TEXT) { return GetDlgItem(hWnd, IDC_MENU_TEXT); } else { return GetDlgItem(hWnd, IDC_MENU_LIST); } } /*-----------------------------------------------------------------------------*/ 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; COLORREF OldBg, OldFg, NewBg; char *p, *p1; int column; lpdis = (LPDRAWITEMSTRUCT) lParam; /* If there are no list box items, skip this message. */ if (lpdis->itemID == -1) return FALSE; data = (PNHMenuWindow)GetWindowLong(hWnd, GWL_USERDATA); item = &data->menu.items[lpdis->itemID]; tileDC = CreateCompatibleDC(lpdis->hDC); saveFont = SelectObject(lpdis->hDC, mswin_get_font(NHW_MENU, item->attr, lpdis->hDC, FALSE)); NewBg = menu_bg_brush ? menu_bg_color : (COLORREF)GetSysColor(DEFAULT_COLOR_BG_MENU); OldBg = SetBkColor(lpdis->hDC, NewBg); OldFg = SetTextColor(lpdis->hDC, menu_fg_brush ? menu_fg_color : (COLORREF)GetSysColor(DEFAULT_COLOR_FG_MENU)); GetTextMetrics(lpdis->hDC, &tm); x = lpdis->rcItem.left + 1; /* print check mark and letter */ if( NHMENU_IS_SELECTABLE(*item) ) { char buf[2]; if (data->how != PICK_NONE) { HGDIOBJ saveBrush; HBRUSH hbrCheckMark; switch(item->count) { case -1: hbrCheckMark = CreatePatternBrush(data->bmpChecked); break; case 0: hbrCheckMark = CreatePatternBrush(data->bmpNotChecked); break; default: hbrCheckMark = CreatePatternBrush(data->bmpCheckedCount); break; } y = (lpdis->rcItem.bottom + lpdis->rcItem.top - TILE_Y) / 2; SetBrushOrgEx(lpdis->hDC, x, y, NULL); saveBrush = SelectObject(lpdis->hDC, hbrCheckMark); PatBlt(lpdis->hDC, x, y, TILE_X, TILE_Y, PATCOPY); SelectObject(lpdis->hDC, saveBrush); DeleteObject(hbrCheckMark); } x += TILE_X + 5; if(item->accelerator!=0) { buf[0] = item->accelerator; buf[1] = '\x0'; SetRect( &drawRect, x, lpdis->rcItem.top, lpdis->rcItem.right, lpdis->rcItem.bottom ); DrawText(lpdis->hDC, NH_A2W(buf, wbuf, 2), 1, &drawRect, DT_LEFT | DT_VCENTER | DT_SINGLELINE | DT_NOPREFIX); } x += tm.tmAveCharWidth + tm.tmOverhang + 5; } else { x += TILE_X + tm.tmAveCharWidth + tm.tmOverhang + 10; } /* print glyph if present */ if( item->glyph != NO_GLYPH ) { HGDIOBJ saveBmp; saveBmp = SelectObject(tileDC, GetNHApp()->bmpTiles); ntile = glyph2tile[ item->glyph ]; t_x = (ntile % TILES_PER_LINE)*TILE_X; t_y = (ntile / TILES_PER_LINE)*TILE_Y; y = (lpdis->rcItem.bottom + lpdis->rcItem.top - TILE_Y) / 2; nhapply_image_transparent( lpdis->hDC, x, y, TILE_X, TILE_Y, tileDC, t_x, t_y, TILE_X, TILE_Y, TILE_BK_COLOR ); SelectObject(tileDC, saveBmp); } x += TILE_X + 5; /* draw item text */ p1 = item->str; p = strchr(item->str, '\t'); column = 0; SetRect( &drawRect, x, lpdis->rcItem.top, min(x + data->menu.tab_stop_size[0], lpdis->rcItem.right), lpdis->rcItem.bottom ); for (;;) { TCHAR wbuf[BUFSZ]; if (p != NULL) *p = '\0'; /* for time being, view tab field as zstring */ DrawText(lpdis->hDC, NH_A2W(p1, wbuf, BUFSZ), strlen(p1), &drawRect, DT_LEFT | DT_VCENTER | DT_SINGLELINE ); if (p != NULL) *p = '\t'; else /* last string so, */ break; p1 = p + 1; p = strchr(p1, '\t'); drawRect.left = drawRect.right + TAB_SEPARATION; ++column; drawRect.right = min (drawRect.left + data->menu.tab_stop_size[column], lpdis->rcItem.right); } /* draw focused item */ if( item->has_focus || (NHMENU_IS_SELECTABLE(*item) && data->menu.items[lpdis->itemID].count!=-1)) { 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, menu_bg_brush ? menu_bg_brush : SYSCLR_TO_BRUSH(DEFAULT_COLOR_BG_MENU)); /* draw text */ DrawText(lpdis->hDC, wbuf, _tcslen(wbuf), &drawRect, DT_RIGHT | DT_VCENTER | DT_SINGLELINE | DT_NOPREFIX ); } } if (item->has_focus) { /* draw focus rect */ RECT client_rt; GetClientRect(lpdis->hwndItem, &client_rt); SetRect( &drawRect, client_rt.left, lpdis->rcItem.top, client_rt.right, lpdis->rcItem.bottom ); DrawFocusRect(lpdis->hDC, &drawRect); } SetTextColor (lpdis->hDC, OldFg); SetBkColor (lpdis->hDC, OldBg); SelectObject(lpdis->hDC, saveFont); DeleteDC(tileDC); return TRUE; } /*-----------------------------------------------------------------------------*/ BOOL onListChar(HWND hWnd, HWND hwndList, WORD ch) { int i = 0; PNHMenuWindow data; int curIndex, topIndex, pageSize; boolean is_accelerator = FALSE; data = (PNHMenuWindow)GetWindowLong(hWnd, GWL_USERDATA); switch( ch ) { case MENU_FIRST_PAGE: i = 0; ListView_SetItemState(hwndList, i, LVIS_FOCUSED, LVIS_FOCUSED); ListView_EnsureVisible(hwndList, i, FALSE); return -2; case MENU_LAST_PAGE: i = max(0, data->menu.size-1); ListView_SetItemState(hwndList, i, LVIS_FOCUSED, LVIS_FOCUSED); ListView_EnsureVisible(hwndList, i, FALSE); return -2; case MENU_NEXT_PAGE: topIndex = ListView_GetTopIndex( hwndList ); pageSize = ListView_GetCountPerPage( hwndList ); curIndex = ListView_GetNextItem(hwndList, -1, LVNI_FOCUSED); /* Focus down one page */ i = min(curIndex+pageSize, data->menu.size-1); ListView_SetItemState(hwndList, i, LVIS_FOCUSED, LVIS_FOCUSED); /* Scrollpos down one page */ i = min(topIndex+(2*pageSize - 1), data->menu.size-1); ListView_EnsureVisible(hwndList, i, FALSE); return -2; case MENU_PREVIOUS_PAGE: topIndex = ListView_GetTopIndex( hwndList ); pageSize = ListView_GetCountPerPage( hwndList ); curIndex = ListView_GetNextItem(hwndList, -1, LVNI_FOCUSED); /* Focus up one page */ i = max(curIndex-pageSize, 0); ListView_SetItemState(hwndList, i, LVIS_FOCUSED, LVIS_FOCUSED); /* Scrollpos up one page */ i = max(topIndex-pageSize, 0); ListView_EnsureVisible(hwndList, i, FALSE); break; case MENU_SELECT_ALL: if( data->how == PICK_ANY ) { reset_menu_count(hwndList, data); for(i=0; i<data->menu.size; i++ ) { SelectMenuItem(hwndList, data, i, -1); } return -2; } break; case MENU_UNSELECT_ALL: if( data->how == PICK_ANY ) { reset_menu_count(hwndList, data); for(i=0; i<data->menu.size; i++ ) { SelectMenuItem(hwndList, data, i, 0); } return -2; } break; case MENU_INVERT_ALL: if( data->how == PICK_ANY ) { reset_menu_count(hwndList, data); for(i=0; i<data->menu.size; i++ ) { SelectMenuItem( hwndList, data, i, NHMENU_IS_SELECTED(data->menu.items[i])? 0 : -1 ); } return -2; } break; case MENU_SELECT_PAGE: if( data->how == PICK_ANY ) { int from, to; reset_menu_count(hwndList, data); topIndex = ListView_GetTopIndex( hwndList ); pageSize = ListView_GetCountPerPage( hwndList ); from = max(0, topIndex); to = min(data->menu.size, from+pageSize); for(i=from; i<to; i++ ) { SelectMenuItem(hwndList, data, i, -1); } return -2; } break; case MENU_UNSELECT_PAGE: if( data->how == PICK_ANY ) { int from, to; reset_menu_count(hwndList, data); topIndex = ListView_GetTopIndex( hwndList ); pageSize = ListView_GetCountPerPage( hwndList ); from = max(0, topIndex); to = min(data->menu.size, from+pageSize); for(i=from; i<to; i++ ) { SelectMenuItem(hwndList, data, i, 0); } return -2; } break; case MENU_INVERT_PAGE: if( data->how == PICK_ANY ) { int from, to; reset_menu_count(hwndList, data); topIndex = ListView_GetTopIndex( hwndList ); pageSize = ListView_GetCountPerPage( hwndList ); from = max(0, topIndex); to = min(data->menu.size, from+pageSize); for(i=from; i<to; i++ ) { SelectMenuItem( hwndList, data, i, NHMENU_IS_SELECTED(data->menu.items[i])? 0 : -1 ); } return -2; } break; case MENU_SEARCH: if( data->how==PICK_ANY || data->how==PICK_ONE ) { char buf[BUFSZ]; reset_menu_count(hwndList, data); if( mswin_getlin_window("Search for:", buf, BUFSZ)==IDCANCEL ) { strcpy(buf, "\033"); } SetFocus(hwndList); // set focus back to the list control if (!*buf || *buf == '\033') return -2; for(i=0; i<data->menu.size; i++ ) { if( NHMENU_IS_SELECTABLE(data->menu.items[i]) && strstr(data->menu.items[i].str, buf) ) { if (data->how == PICK_ANY) { SelectMenuItem( hwndList, data, i, NHMENU_IS_SELECTED(data->menu.items[i])? 0 : -1 ); } 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 ((int)ch < 0 || ch > 255) break; if( strchr(data->menu.gacc, ch) && !(ch=='0' && data->menu.counting) ) { /* matched a group accelerator */ if (data->how == PICK_ANY || data->how == PICK_ONE) { reset_menu_count(hwndList, data); for(i=0; i<data->menu.size; i++ ) { if( NHMENU_IS_SELECTABLE(data->menu.items[i]) && data->menu.items[i].group_accel == ch ) { if( data->how == PICK_ANY ) { SelectMenuItem( hwndList, data, i, NHMENU_IS_SELECTED(data->menu.items[i])? 0 : -1 ); } else if( data->how == PICK_ONE ) { SelectMenuItem( hwndList, data, i, -1 ); data->result = 0; data->done = 1; return -2; } } } return -2; } else { mswin_nhbell(); return -2; } } if (isdigit(ch)) { int count; i = ListView_GetNextItem(hwndList, -1, LVNI_FOCUSED); if( i>=0 ) { count = data->menu.items[i].count; if( count==-1 ) count=0; count *= 10L; count += (int)(ch - '0'); if (count != 0) /* ignore leading zeros */ { data->menu.counting = TRUE; data->menu.items[i].count = min(100000, count); ListView_RedrawItems( hwndList, i, i ); /* update count mark */ } } return -2; } is_accelerator = FALSE; for(i=0; i<data->menu.size; i++) { if( data->menu.items[i].accelerator == ch ) { is_accelerator = TRUE; break; } } if( (ch>='a' && ch<='z') || (ch>='A' && ch<='Z') || is_accelerator) { if (data->how == PICK_ANY || data->how == PICK_ONE) { for(i=0; i<data->menu.size; i++ ) { if( data->menu.items[i].accelerator == ch ) { if( data->how == PICK_ANY ) { SelectMenuItem( hwndList, data, i, NHMENU_IS_SELECTED(data->menu.items[i])? 0 : -1 ); ListView_SetItemState(hwndList, i, LVIS_FOCUSED, LVIS_FOCUSED); ListView_EnsureVisible(hwndList, i, FALSE); return -2; } else if( data->how == PICK_ONE ) { SelectMenuItem( hwndList, data, i, -1 ); data->result = 0; data->done = 1; return -2; } } } } } break; } reset_menu_count(hwndList, data); return -1; } /*-----------------------------------------------------------------------------*/ void mswin_menu_window_size (HWND hWnd, LPSIZE sz) { TEXTMETRIC tm; HWND control; HGDIOBJ saveFont; HDC hdc; PNHMenuWindow data; int i; RECT rt, wrt; int extra_cx; GetClientRect(hWnd, &rt); sz->cx = rt.right - rt.left; sz->cy = rt.bottom - rt.top; GetWindowRect(hWnd, &wrt); extra_cx = (wrt.right-wrt.left) - sz->cx; data = (PNHMenuWindow)GetWindowLong(hWnd, GWL_USERDATA); if(data) { control = GetMenuControl(hWnd); hdc = GetDC(control); if( data->type==MENU_TYPE_MENU ) { /* Calculate the width of the list box. */ saveFont = SelectObject(hdc, mswin_get_font(NHW_MENU, ATR_NONE, hdc, FALSE)); GetTextMetrics(hdc, &tm); for(i=0; i<data->menu.size; i++ ) { LONG menuitemwidth = 0; int column; char *p, *p1; p1 = data->menu.items[i].str; p = strchr(data->menu.items[i].str, '\t'); column = 0; for (;;) { TCHAR wbuf[BUFSZ]; RECT tabRect; SetRect ( &tabRect, 0, 0, 1, 1 ); if (p != NULL) *p = '\0'; /* for time being, view tab field as zstring */ DrawText(hdc, NH_A2W(p1, wbuf, BUFSZ), strlen(p1), &tabRect, DT_CALCRECT | DT_LEFT | DT_VCENTER | DT_SINGLELINE ); /* it probably isn't necessary to recompute the tab width now, but do so * just in case, honoring the previously computed value */ menuitemwidth += max(data->menu.tab_stop_size[column], tabRect.right - tabRect.left); if (p != NULL) *p = '\t'; else /* last string so, */ break; /* add the separation only when not the last item */ /* in the last item, we break out of the loop, in the statement just above */ menuitemwidth += TAB_SEPARATION; ++column; p1 = p + 1; p = strchr(p1, '\t'); } sz->cx = max(sz->cx, (LONG)(2*TILE_X + menuitemwidth + tm.tmAveCharWidth*12 + tm.tmOverhang)); } SelectObject(hdc, saveFont); } else { /* 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 += extra_cx; ReleaseDC(control, hdc); } } /*-----------------------------------------------------------------------------*/ void SelectMenuItem(HWND hwndList, PNHMenuWindow data, int item, int count) { int i; if( item<0 || item>=data->menu.size ) return; if( data->how==PICK_ONE && count!=0 ) { for(i=0; i<data->menu.size; i++) if( item!=i && data->menu.items[i].count!=0 ) { data->menu.items[i].count = 0; ListView_RedrawItems( hwndList, i, i ); }; } data->menu.items[item].count = count; ListView_RedrawItems( hwndList, item, item ); reset_menu_count(hwndList, data); } /*-----------------------------------------------------------------------------*/ void reset_menu_count(HWND hwndList, PNHMenuWindow data) { int i; data->menu.counting = FALSE; if( IsWindow(hwndList) ) { i = ListView_GetNextItem((hwndList), -1, LVNI_FOCUSED); if( i>=0 ) ListView_RedrawItems( hwndList, i, i ); } } /*-----------------------------------------------------------------------------*/ /* List window Proc */ LRESULT CALLBACK NHMenuListWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { BOOL bUpdateFocusItem; 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, 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; } /*-----------------------------------------------------------------------------*/ ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/win32/mhfont.h����������������������������������������������������������������0000664�0000764�0000764�00000000653�10545462317�015063� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (C) 2001 by Alex Kompel <shurikk@pacbell.net> */ /* 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); UINT mswin_charset(void); #endif /* MSWINFont_h */ �������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/win32/tiles.dsp���������������������������������������������������������������0000664�0000764�0000764�00000005070�10545462317�015245� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# 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 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/win32/mhtext.h����������������������������������������������������������������0000664�0000764�0000764�00000000545�10545462317�015101� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (C) 2001 by Alex Kompel <shurikk@pacbell.net> */ /* 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 */ �����������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/win32/levcomp.dsp�������������������������������������������������������������0000664�0000764�0000764�00000024362�10545462317�015577� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# 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 beholder.des ..\util\levcomp.exe beholder.des \ echo bigroom.des ..\util\levcomp.exe bigroom.des \ echo blkmar.des ..\util\levcomp.exe blkmar.des \ echo castle.des ..\util\levcomp.exe castle.des \ echo Caveman.des ..\util\levcomp.exe Caveman.des \ echo caves.des ..\util\levcomp.exe caves.des \ echo dragons.des ..\util\levcomp.exe dragons.des \ echo endgame.des ..\util\levcomp.exe endgame.des \ echo Flame.des ..\util\levcomp.exe Flame.des \ echo frnknstn.des ..\util\levcomp.exe frnknstn.des \ echo gehennom.des ..\util\levcomp.exe gehennom.des \ echo giants.des ..\util\levcomp.exe giants.des \ echo guild.des ..\util\levcomp.exe guild.des \ echo Healer.des ..\util\levcomp.exe Healer.des \ echo Ice.des ..\util\levcomp.exe Ice.des \ echo Knight.des ..\util\levcomp.exe Knight.des \ echo knox.des ..\util\levcomp.exe knox.des \ echo kobold-1.des ..\util\levcomp.exe kobold-1.des \ echo kobold-2.des ..\util\levcomp.exe kobold-2.des \ echo lich.des ..\util\levcomp.exe lich.des \ echo mall-1.des ..\util\levcomp.exe mall-1.des \ echo mall-2.des ..\util\levcomp.exe mall-2.des \ echo medusa.des ..\util\levcomp.exe medusa.des \ echo mines.des ..\util\levcomp.exe mines.des \ echo mtemple.des ..\util\levcomp.exe mtemple.des \ echo Monk.des ..\util\levcomp.exe Monk.des \ echo Necro.des ..\util\levcomp.exe Necro.des \ echo newmall.des ..\util\levcomp.exe newmall.des \ echo nightmar.des ..\util\levcomp.exe nightmar.des \ echo nymph.des ..\util\levcomp.exe nymph.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 rats.des ..\util\levcomp.exe rats.des \ echo Rogue.des ..\util\levcomp.exe Rogue.des \ echo Samurai.des ..\util\levcomp.exe Samurai.des \ echo sea.des ..\util\levcomp.exe sea.des \ echo sokoban.des ..\util\levcomp.exe sokoban.des \ echo spiders.des ..\util\levcomp.exe spiders.des \ echo stor-1.des ..\util\levcomp.exe stor-1.des \ echo stor-2.des ..\util\levcomp.exe stor-2.des \ echo stor-3.des ..\util\levcomp.exe stor-3.des \ echo Tourist.des ..\util\levcomp.exe Tourist.des \ echo tomb.des ..\util\levcomp.exe tomb.des \ echo tower.des ..\util\levcomp.exe tower.des \ echo Slayer.des ..\util\levcomp.exe Slayer.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 beholder.des ..\util\levcomp.exe beholder.des \ echo bigroom.des ..\util\levcomp.exe bigroom.des \ echo blkmar.des ..\util\levcomp.exe blkmar.des \ echo castle.des ..\util\levcomp.exe castle.des \ echo Caveman.des ..\util\levcomp.exe Caveman.des \ echo caves.des ..\util\levcomp.exe caves.des \ echo dragons.des ..\util\levcomp.exe dragons.des \ echo endgame.des ..\util\levcomp.exe endgame.des \ echo Flame.des ..\util\levcomp.exe Flame.des \ echo frnknstn.des ..\util\levcomp.exe frnknstn.des \ echo gehennom.des ..\util\levcomp.exe gehennom.des \ echo giants.des ..\util\levcomp.exe giants.des \ echo guild.des ..\util\levcomp.exe guild.des \ echo Healer.des ..\util\levcomp.exe Healer.des \ echo Ice.des ..\util\levcomp.exe Ice.des \ echo Knight.des ..\util\levcomp.exe Knight.des \ echo knox.des ..\util\levcomp.exe knox.des \ echo kobold-1.des ..\util\levcomp.exe kobold-1.des \ echo kobold-2.des ..\util\levcomp.exe kobold-2.des \ echo lich.des ..\util\levcomp.exe lich.des \ echo mall-1.des ..\util\levcomp.exe mall-1.des \ echo mall-2.des ..\util\levcomp.exe mall-2.des \ echo medusa.des ..\util\levcomp.exe medusa.des \ echo mines.des ..\util\levcomp.exe mines.des \ echo mtemple.des ..\util\levcomp.exe mtemple.des \ echo Monk.des ..\util\levcomp.exe Monk.des \ echo Necro.des ..\util\levcomp.exe Necro.des \ echo newmall.des ..\util\levcomp.exe newmall.des \ echo nightmar.des ..\util\levcomp.exe nightmar.des \ echo nymph.des ..\util\levcomp.exe nymph.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 rats.des ..\util\levcomp.exe rats.des \ echo Rogue.des ..\util\levcomp.exe Rogue.des \ echo Samurai.des ..\util\levcomp.exe Samurai.des \ echo sea.des ..\util\levcomp.exe sea.des \ echo sokoban.des ..\util\levcomp.exe sokoban.des \ echo spiders.des ..\util\levcomp.exe spiders.des \ echo stor-1.des ..\util\levcomp.exe stor-1.des \ echo stor-2.des ..\util\levcomp.exe stor-2.des \ echo stor-3.des ..\util\levcomp.exe stor-3.des \ echo Tourist.des ..\util\levcomp.exe Tourist.des \ echo tomb.des ..\util\levcomp.exe tomb.des \ echo tower.des ..\util\levcomp.exe tower.des \ echo Slayer.des ..\util\levcomp.exe Slayer.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 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/win32/mhmain.c����������������������������������������������������������������0000664�0000764�0000764�00000060425�10545462317�015037� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (C) 2001 by Alex Kompel <shurikk@pacbell.net> */ /* 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]; extern void mswin_display_splash_window(BOOL); 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; WINDOWPLACEMENT wp; /* 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"); if (GetNHApp()->regMainMinX != CW_USEDEFAULT) { wp.length = sizeof(wp); wp.showCmd = GetNHApp()->regMainShowState; wp.ptMinPosition.x = GetNHApp()->regMainMinX; wp.ptMinPosition.y = GetNHApp()->regMainMinY; wp.ptMaxPosition.x = GetNHApp()->regMainMaxX; wp.ptMaxPosition.y = GetNHApp()->regMainMaxY; wp.rcNormalPosition.left = GetNHApp()->regMainLeft; wp.rcNormalPosition.top = GetNHApp()->regMainTop; wp.rcNormalPosition.right = GetNHApp()->regMainRight; wp.rcNormalPosition.bottom = GetNHApp()->regMainBottom; SetWindowPlacement(ret, &wp); } else ShowWindow(ret, SW_SHOWDEFAULT); UpdateWindow(ret); 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 */ {'5', M('5'), '5'}, /* 5 */ {'6', M('6'), '6'}, /* 6 */ {'+', 'P', C('p')}, /* + */ {'1', M('1'), '1'}, /* 1 */ {'2', M('2'), '2'}, /* 2 */ {'3', M('3'), '3'}, /* 3 */ {'0', M('0'), '0'}, /* 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: { WINDOWPLACEMENT wp; mswin_layout_main_window(NULL); wp.length = sizeof(wp); if (GetWindowPlacement(hWnd, &wp)) { GetNHApp()->regMainShowState = (wp.showCmd == SW_SHOWMAXIMIZED ? SW_SHOWMAXIMIZED : SW_SHOWNORMAL); GetNHApp()->regMainMinX = wp.ptMinPosition.x; GetNHApp()->regMainMinY = wp.ptMinPosition.y; GetNHApp()->regMainMaxX = wp.ptMaxPosition.x; GetNHApp()->regMainMaxY = wp.ptMaxPosition.y; GetNHApp()->regMainLeft = wp.rcNormalPosition.left; GetNHApp()->regMainTop = wp.rcNormalPosition.top; GetNHApp()->regMainRight = wp.rcNormalPosition.right; GetNHApp()->regMainBottom = wp.rcNormalPosition.bottom; } 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 if (!program_state.something_worth_saving) { /* User exited before the game started, e.g. during splash display */ /* Just get out. */ bail((char *)0); } else { switch (NHMessageBox(hWnd, TEXT("Save?"), 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; i<MAXWINDOWS; i++ ) { if(GetNHApp()->windowlist[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_TEXT: // same as the map window 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; 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: mswin_display_splash_window(TRUE); break; case IDM_EXIT: done2(); break; case IDM_SAVE: if (!program_state.gameover && !program_state.done_hup) dosave(); else MessageBeep(0); 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. */ NHMessageBox(GetNHApp()->hMainWnd, "Your Windows Settings will not be stored when you exit this time.", MB_OK | MB_ICONINFORMATION); break; } case IDM_HELP_LONG: display_file(NH_HELP, TRUE); break; case IDM_HELP_COMMANDS: display_file(NH_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(NH_OPTIONFILE, TRUE); break; case IDM_HELP_EXTCMD: (void) doextlist(); break; case IDM_HELP_LICENSE: display_file(NH_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; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/win32/levstuff.mak������������������������������������������������������������0000664�0000764�0000764�00000002306�10545462317�015744� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#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 ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/win32/nhwin32.h���������������������������������������������������������������0000664�0000764�0000764�00000024154�10545462317�015062� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* SCCS Id: @(#)nhwin32.h 3.2 95/09/06 */ /* Copyright (c) NetHack MS Windows Porting Team 1995 */ /* NetHack may be freely redistributed. See license for details. */ #ifndef WIN32_H #define WIN32_H struct win32_WinDesc { int type; /* type of window */ boolean active; /* true if window is active */ boolean wasup; /* true if menu/text window was already open */ short rowcount; /* Rows displayed in window */ int widest; /* largest string in window */ /* Win32 stuff */ HWND hWnd; /* win32 window handle */ HWND hDlg; /* dialog box hande (for menus mostly) */ HFONT hFnt; /* handle of current font */ HFONT hOldFnt; /* handle of old font */ DWORD dwCharX; /* average width of characters */ DWORD dwCharY; /* height of characters */ #if 0 DWORD dwClientX; /* width of client area */ DWORD dwClientY; /* height of client area */ #endif DWORD dwLineLen; /* line length */ DWORD dwLines; /* text lines in client area */ int nWindowX; /* horizontal position of window */ int nWindowY; /* vertical position of window */ int WindowWidth; /* width of window */ int WindowHeight; /* height of window */ int nCaretPosX; /* horizontal position of the carat */ int nCaretPosY; /* vertical position of the carat */ int nCharWidth; /* width of a character */ int nCurChar; /* current character */ int BackGroundColor; /* background color */ int NormalTextColor; /* default text color */ int maxrows, maxcols; /* the maximum size used */ /* maxcols is also used by WIN_MESSAGE for */ /* tracking the ^P command */ /* NetHack data */ int *glyph; /* the glyph values for a tiled map window */ uchar *data; /* the character value if not tiled */ int *color; /* the text color for the data in the window */ char *resp; /* valid menu responses (for NHW_INVEN) */ char *canresp; /* cancel responses; 1st is the return value */ char *morestr; /* string to display instead of default */ long wflags; short cursx, cursy; /* Where the cursor is displayed at */ short curs_apen, /* Color cursor is displayed in */ curs_bpen; short extra; /* temporary values between window calls */ }; struct win32_DisplayDesc { /* we need this for Screen size (which will vary with display mode) */ uchar rows, cols; /* width & height of display in text units */ short xpix, ypix; /* width and height of display in pixels */ int toplin; /* flag for topl stuff */ int rawprint; /* number of raw_printed lines since synch */ winid lastwin; /* last window used for I/O */ }; struct win32_menuitem { int glyph; anything identifier; char ch; int attr; char *str; }; #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 : \ /* If no color, try to hilite pets; black */ \ /* should be HI */ \ ((iflags.hilite_pet && has_color(CLR_BLACK)) ? \ CLR_BLACK : 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) #endif #define WINMODE_TTY 0 #define WINMODE_WIN32 1 #define MAXWIN 20 /* maximum number of windows, cop-out */ #define NHIcon 500 #define MAX_KEYS 100 #define BUFSIZE 65535 #define SHIFTED 0x8000 #define RINGBUFSIZE 132 #define MAX_MESSAGE_COUNT 5 #define MAX_INVENTORY 52 /* maximum items allowed in inventory */ #define MAX_MENU_WINDOWS MAXWIN /* max inventory windows on the go */ #define WFLAGS_TILED 0x0001L #define TYPE_INVALID -1 #define TYPE_UNDETERMINED -2 #define IDM_SAVE 100 #define IDM_QUIT 101 #define IDM_EXIT 102 #define IDM_GAMEOPT 300 #define IDM_ENVOPT 301 #define IDM_DISPOPT 302 #define IDM_HELPCONTENTS 400 #define IDM_HELPSEARCH 401 #define IDM_HELPHELP 402 #define IDM_ABOUT 403 #define IDD_INPUTTEXT 501 #define IDD_QUESTION 502 #define IDD_NAME 503 #define IDD_ARCH 601 #define IDD_BARB 602 #define IDD_CAVEMAN 603 #define IDD_ELF 604 #define IDD_HEAL 605 #define IDD_KNIGHT 606 #define IDD_PRIEST 607 #define IDD_ROGUE 608 #define IDD_SAM 609 #define IDD_TOUR 610 #define IDD_VAL 611 #define IDD_WIZ 612 #define IDD_RAND 613 #define IDD_ABOUT1 616 #define IDD_ABOUT2 617 #define IDD_ABOUT3 618 #define IDD_ABOUT4 619 #define IDD_ABOUT5 620 #define IDD_ABOUT6 621 #define IDD_ABOUT7 622 #define IDD_ABOUT8 623 #define IDD_ABOUT9 624 #define IDD_LB1 700 #define DEBUG_MSG(str) \ if (strlen(str) != 0) \ MessageBox(BasehWnd,str,"Debug",MB_SYSTEMMODAL|MB_ICONHAND); #define POP_MESSAGE(str) \ if (strlen(str) != 0) \ MessageBox(BasehWnd,str,"NetHackMenu",MB_SYSTEMMODAL); #define NHW_BASE 0 /* * The following global variables are defined in nhprocs.c */ extern struct win32_WinDesc *wins[MAXWIN]; extern struct win32_DisplayDesc *win32Display; extern char morc; /* last character typed to xwaitforspace */ extern char defmorestr[]; /* default --more-- prompt */ extern winid WIN_BASE; /* * The following global variables are defined in winmain.c */ extern WNDCLASS wcNetHack; extern WNDCLASS wcNHText; extern WNDCLASS wcNHPopup; extern WNDCLASS wcNHListbox; extern char GameName[]; extern char NHTextClassName[]; extern char NHPopupClassName[]; extern char NHListboxClassName[]; extern HANDLE hGlobInstance; extern HWND BasehWnd; extern unsigned char *pchBuf; /* input "ring" buffer */ extern unsigned char *pchGet; /* "Get" chars from here */ extern unsigned char *pchPut; /* "Put" chars here */ extern int pchCount; /* characters in ring buffer */ extern int BaseUnits; extern int BaseHeight; extern int BaseWidth; extern int MessageHeight; extern int MessageWidth; extern int MessageX; extern int MessageY; extern int MessageCount; extern char *MessagePtr[MAX_MESSAGE_COUNT]; extern int MapHeight; extern int MapWidth; extern int MapX; extern int MapY; extern int StatusHeight; extern int StatusWidth; extern int StatusX; extern int StatusY; extern int tiles_on; /* tiles enabled */ extern int DefCharWidth; extern int DefCharHeight; extern int DefBackGroundColor; extern int DefNormalTextColor; extern struct win32_menuitem *MenuPtr[MAX_MENU_WINDOWS][MAX_INVENTORY]; extern int MenuCount[MAX_MENU_WINDOWS]; extern int MenuWindowCount; extern COLORREF colormap[]; extern HFONT hDefFnt; extern TEXTMETRIC tm; extern RECT rcClient; extern int inputstatus; extern char input_text[BUFSZ]; extern int input_text_size; # define WAITING_FOR_KEY 1 # define WAITING_FOR_MOUSE 2 # define WAITING_FOR_KEY_OR_MOUSE (WAITING_FOR_KEY | WAITING_FOR_MOUSE) /* JUNK TO GO */ /* extern winid WIN_VIEW; */ /* extern winid WIN_VIEWBOX; */ /* #define NHW_VIEW 7 */ /* #define NHW_VIEWBOX 8 */ /* extern struct win32_WinDesc *win32_wins[MAXWIN + 6]; */ /*############################################################ * External function prototypes *############################################################ */ #define E extern /* #### nhproc.c #### */ E void NDECL(win32_init_nhwindows); E void NDECL(win32_player_selection); E void NDECL(win32_askname); E void NDECL(win32_get_nh_event) ; E void FDECL(win32_exit_nhwindows, (const char *)); E void FDECL(win32_suspend_nhwindows, (const char *)); E void NDECL(win32_resume_nhwindows); E winid FDECL(win32_create_nhwindow, (int)); E void FDECL(win32_clear_nhwindow, (winid)); E void FDECL(win32_display_nhwindow, (winid, BOOLEAN_P)); E void FDECL(win32_dismiss_nhwindow, (winid)); E void FDECL(win32_destroy_nhwindow, (winid)); E void FDECL(win32_curs, (winid,int,int)); E void FDECL(win32_putstr, (winid, int, const char *)); #ifdef FILE_AREAS E void FDECL(win32_display_file, (const char *, const char *, BOOLEAN_P)); #else E void FDECL(win32_display_file, (const char *, BOOLEAN_P)); #endif E void FDECL(win32_start_menu, (winid)); E void FDECL(win32_add_menu, (winid,int,const ANY_P, CHAR_P,int,const char *, BOOLEAN_P)); E void FDECL(win32_end_menu, (winid, const char *)); E int FDECL(win32_select_menu, (winid, int, MENU_ITEM_P **)); E void NDECL(win32_update_inventory); E void NDECL(win32_mark_synch); E void NDECL(win32_wait_synch); #ifdef CLIPPING E void FDECL(win32_cliparound, (int, int)); #endif E void FDECL(win32_print_glyph, (winid,XCHAR_P,XCHAR_P,int)); E void FDECL(win32_raw_print, (const char *)); E void FDECL(win32_raw_print_bold, (const char *)); E int NDECL(win32_nhgetch); E int FDECL(win32_nh_poskey, (int *, int *, int *)); E void NDECL(win32_nhbell); E int NDECL(win32_doprev_message); E char FDECL(win32_yn_function, (const char *, const char *, CHAR_P)); E void FDECL(win32_getlin, (const char *,char *)); E int NDECL(win32_get_ext_cmd); E void FDECL(win32_number_pad, (int)); E void NDECL(win32_delay_output); /* other defs that really should go away (they're win32 specific) */ E void NDECL(win32_start_screen); E void NDECL(win32_end_screen); E void FDECL(genl_outrip, (winid,int)); /* #### win32msg.c #### */ E LONG WINAPI BaseWndProc(HWND,UINT,UINT,LONG); E LONG WINAPI TextWndProc(HWND,UINT,UINT,LONG); E LONG WINAPI PopupWndProc(HWND,UINT,UINT,LONG); E LONG WINAPI ListboxWndProc(HWND,UINT,UINT,LONG); E BOOL WINAPI PlayerSelectProc(HWND,UINT,UINT,LONG); E BOOL WINAPI CopyrightProc(HWND,UINT,UINT,LONG); E BOOL WINAPI AskNameProc(HWND,UINT,UINT,LONG); E LRESULT CALLBACK MenuDialogProc(HWND,UINT,UINT,LONG); E int win32_kbhit(void); /* #### winmain.c #### */ E void NDECL(win_win32_init); E BOOL InitBaseWindow(void); E BOOL InitTextWindow(void); E BOOL InitPopupWindow(void); E BOOL InitListboxWindow(void); E BOOL CALLBACK EnumChildProc(HWND,LPARAM); #if 0 E void WinClear(HWND); E int WinGetChar(HWND); E int WinPutChar(HWND,int,int,int); E void WinMinSize(HWND,int,int); E void WinHackGetText(const char *,char *); #endif #undef E #endif /* WIN32_H */ ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/win32/mhinput.c���������������������������������������������������������������0000664�0000764�0000764�00000003436�10545462317�015251� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (C) 2001 by Alex Kompel <shurikk@pacbell.net> */ /* NetHack may be freely redistributed. See license for details. */ #include <assert.h> #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; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/win32/mhmsgwnd.c��������������������������������������������������������������0000664�0000764�0000764�00000053713�10545462317�015414� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (C) 2001 by Alex Kompel <shurikk@pacbell.net> */ /* 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 TBUFSZ #define DEFAULT_COLOR_BG_MSG COLOR_WINDOW #define DEFAULT_COLOR_FG_MSG COLOR_WINDOWTEXT #define MORE "--More--" 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]; #ifdef MSG_WRAP_TEXT int window_text_lines[MAX_MSG_LINES]; /* How much space this text line takes */ #endif int lines_last_turn; /* lines added during the last turn */ int cleared; /* clear was called */ int last_line; /* last line in the message history */ struct window_line new_line; int lines_not_seen; /* lines not yet seen by user after last turn or --More-- */ int in_more; /* We are in a --More-- prompt */ int nevermore; /* We want no more --More-- prompts */ 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 COLORREF setMsgTextColor(HDC hdc, int gray); static void onPaint(HWND hWnd); static void onCreate(HWND hWnd, WPARAM wParam, LPARAM lParam); #ifdef USER_SOUNDS extern void play_sound_for_message(const char* str); #endif HWND mswin_init_message_window () { static int run_once = 0; HWND ret; DWORD style; if( !run_once ) { register_message_window_class( ); run_once = 1; } #ifdef MSG_WRAP_TEXT style = WS_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-1; data->yPos = min(data->yPos, data->yMax); ZeroMemory(&si, sizeof(si)); si.cbSize = sizeof(si); si.fMask = SIF_RANGE | SIF_PAGE | SIF_POS; si.nMin = MSG_VISIBLE_LINES; si.nMax = data->yMax + MSG_VISIBLE_LINES - 1; si.nPage = MSG_VISIBLE_LINES; si.nPos = data->yPos; SetScrollInfo(hWnd, SB_VERT, &si, TRUE); } } break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } void onMSNHCommand(HWND hWnd, WPARAM wParam, LPARAM lParam) { PNHMessageWindow data; data = (PNHMessageWindow)GetWindowLong(hWnd, GWL_USERDATA); switch( wParam ) { case MSNH_MSG_PUTSTR: { PMSNHMsgPutstr msg_data = (PMSNHMsgPutstr)lParam; SCROLLINFO si; if( msg_data->append == 1) { /* Forcibly append to line, even if we pass the edge */ strncat(data->window_text[data->last_line].text, msg_data->text, MAXWINDOWTEXT - strlen(data->window_text[data->last_line].text)); } else if( msg_data->append < 0) { /* remove that many chars */ int len = strlen(data->window_text[data->last_line].text); int newend = max(len + msg_data->append, 0); data->window_text[data->last_line].text[newend] = '\0'; } else { /* Try to append but move the whole message to the next line if it doesn't fit */ /* just schedule for displaying */ data->new_line.attr = msg_data->attr; strncpy(data->new_line.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); #ifdef USER_SOUNDS play_sound_for_message(msg_data->text); #endif } break; case MSNH_MSG_CLEAR_WINDOW: { data->cleared = 1; data->lines_not_seen = 0; /* do --More-- again if needed */ data->nevermore = 0; break; } case MSNH_MSG_CARET: /* Create or destroy a caret */ if (*(int *)lParam) CreateCaret(hWnd, NULL, 0, data->yChar); else { DestroyCaret(); /* this means we just did something interactive in this window, so we don't need a --More-- for the lines above. */ data->lines_not_seen = 0; } break; } } void onMSNH_VScroll(HWND hWnd, WPARAM wParam, LPARAM lParam) { PNHMessageWindow data; SCROLLINFO si; int yInc; /* get window data */ data = (PNHMessageWindow)GetWindowLong(hWnd, GWL_USERDATA); ZeroMemory(&si, sizeof(si)); si.cbSize = sizeof(si); si.fMask = SIF_PAGE | SIF_POS; GetScrollInfo(hWnd, SB_VERT, &si); switch(LOWORD (wParam)) { // User clicked the shaft above the scroll box. case SB_PAGEUP: yInc = -(int)si.nPage; break; // User clicked the shaft below the scroll box. case SB_PAGEDOWN: yInc = si.nPage; break; // User clicked the top arrow. case SB_LINEUP: yInc = -1; break; // User clicked the bottom arrow. case SB_LINEDOWN: yInc = 1; break; // User dragged the scroll box. case SB_THUMBTRACK: yInc = HIWORD(wParam) - data->yPos; break; default: yInc = 0; } // If applying the vertical scrolling increment does not // take the scrolling position out of the scrolling range, // increment the scrolling position, adjust the position // of the scroll box, and update the window. UpdateWindow // sends the WM_PAINT message. if (yInc = max( MSG_VISIBLE_LINES - data->yPos, min(yInc, data->yMax - data->yPos))) { data->yPos += yInc; /* ScrollWindowEx(hWnd, 0, -data->yChar * yInc, (CONST RECT *) NULL, (CONST RECT *) NULL, (HRGN) NULL, (LPRECT) NULL, SW_INVALIDATE | SW_ERASE); */ InvalidateRect(hWnd, NULL, TRUE); ZeroMemory(&si, sizeof(si)); si.cbSize = sizeof(si); si.fMask = SIF_POS; si.nPos = data->yPos; SetScrollInfo(hWnd, SB_VERT, &si, TRUE); UpdateWindow (hWnd); } } #ifndef MSG_WRAP_TEXT void onMSNH_HScroll(HWND hWnd, WPARAM wParam, LPARAM lParam) { PNHMessageWindow data; SCROLLINFO si; int xInc; /* get window data */ data = (PNHMessageWindow)GetWindowLong(hWnd, GWL_USERDATA); ZeroMemory(&si, sizeof(si)); si.cbSize = sizeof(si); si.fMask = SIF_PAGE; GetScrollInfo(hWnd, SB_HORZ, &si); switch(LOWORD (wParam)) { // User clicked shaft left of the scroll box. case SB_PAGEUP: xInc = - (int)si.nPage; break; // User clicked shaft right of the scroll box. case SB_PAGEDOWN: xInc = si.nPage; break; // User clicked the left arrow. case SB_LINEUP: xInc = -1; break; // User clicked the right arrow. case SB_LINEDOWN: xInc = 1; break; // User dragged the scroll box. case SB_THUMBTRACK: xInc = HIWORD(wParam) - data->xPos; break; default: xInc = 0; } // If applying the horizontal scrolling increment does not // take the scrolling position out of the scrolling range, // increment the scrolling position, adjust the position // of the scroll box, and update the window. if (xInc = max (-data->xPos, min (xInc, data->xMax - data->xPos))) { data->xPos += xInc; ScrollWindowEx (hWnd, -data->xChar * xInc, 0, (CONST RECT *) NULL, (CONST RECT *) NULL, (HRGN) NULL, (LPRECT) NULL, SW_INVALIDATE | SW_ERASE); ZeroMemory(&si, sizeof(si)); si.cbSize = sizeof(si); si.fMask = SIF_POS; si.nPos = data->xPos; SetScrollInfo(hWnd, SB_HORZ, &si, TRUE); UpdateWindow (hWnd); } } #endif // MSG_WRAP_TEXT COLORREF setMsgTextColor(HDC hdc, int gray) { COLORREF fg, color1, color2; if (gray) { if (message_bg_brush) { color1 = message_bg_color; color2 = message_fg_color; } else { color1 = (COLORREF)GetSysColor(DEFAULT_COLOR_BG_MSG); color2 = (COLORREF)GetSysColor(DEFAULT_COLOR_FG_MSG); } /* Make a "gray" color by taking the average of the individual R,G,B components of two colors. Thanks to Jonathan del Strother */ fg = RGB((GetRValue(color1)+GetRValue(color2))/2, (GetGValue(color1)+GetGValue(color2))/2, (GetBValue(color1)+GetBValue(color2))/2); } else { fg = message_fg_brush ? message_fg_color : (COLORREF)GetSysColor(DEFAULT_COLOR_FG_MSG); } return SetTextColor(hdc, fg); } void onPaint(HWND hWnd) { PAINTSTRUCT ps; HDC hdc; PNHMessageWindow data; RECT client_rt, draw_rt; int FirstLine, LastLine; int i, x, y; HGDIOBJ oldFont; TCHAR wbuf[MAXWINDOWTEXT+2]; size_t wlen; COLORREF OldBg, OldFg; int do_more = 0; hdc = BeginPaint(hWnd, &ps); OldBg = SetBkColor(hdc, message_bg_brush ? message_bg_color : (COLORREF)GetSysColor(DEFAULT_COLOR_BG_MSG)); OldFg = setMsgTextColor(hdc, 0); data = (PNHMessageWindow)GetWindowLong(hWnd, GWL_USERDATA); GetClientRect(hWnd, &client_rt); if( !IsRectEmpty(&ps.rcPaint) ) { FirstLine = max (0, data->yPos - (client_rt.bottom - ps.rcPaint.top)/data->yChar + 1); LastLine = min (MSG_LINES-1, data->yPos - (client_rt.bottom - ps.rcPaint.bottom)/data->yChar); y = min( ps.rcPaint.bottom, client_rt.bottom ); for (i=LastLine; i>=FirstLine; i--) { int lineidx = (data->last_line + 1 + i) % MSG_LINES; x = data->xChar * (2 - data->xPos); 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[lineidx].attr, hdc, FALSE)); /* find out if we can concatenate the scheduled message without wrapping, but only if no clear_nhwindow was done just before putstr'ing this one, and only if not in a more prompt already (to prevent concatenating to a line containing --More-- when resizing while --More-- is displayed.) */ if (i == MSG_LINES-1 && strlen(data->new_line.text) > 0 && !data->in_more) { /* concatenate to the previous line if that is not empty, and if it has the same attribute, and no clear was done. */ if (strlen(data->window_text[lineidx].text) > 0 && (data->window_text[lineidx].attr == data->new_line.attr) && !data->cleared) { RECT tmpdraw_rt = draw_rt; /* assume this will never work when textsize is near MAXWINDOWTEXT */ char tmptext[MAXWINDOWTEXT]; TCHAR tmpwbuf[MAXWINDOWTEXT+2]; strcpy(tmptext, data->window_text[lineidx].text); strncat(tmptext, " ", MAXWINDOWTEXT - strlen(tmptext)); strncat(tmptext, data->new_line.text, MAXWINDOWTEXT - strlen(tmptext)); /* Always keep room for a --More-- */ strncat(tmptext, MORE, MAXWINDOWTEXT - strlen(tmptext)); NH_A2W(tmptext, tmpwbuf, sizeof(tmpwbuf)); /* Find out how large the bounding rectangle of the text is */ DrawText(hdc, tmpwbuf, _tcslen(tmpwbuf), &tmpdraw_rt, DT_NOPREFIX | DT_WORDBREAK | DT_CALCRECT); if ((tmpdraw_rt.bottom - tmpdraw_rt.top) == (draw_rt.bottom - draw_rt.top) /* fits pixelwise */ && (strlen(data->window_text[lineidx].text) + strlen(data->new_line.text) < MAXWINDOWTEXT)) /* fits charwise */ { /* strip off --More-- of this combined line and make it so */ tmptext[strlen(tmptext) - strlen(MORE)] = '\0'; strcpy(data->window_text[lineidx].text, tmptext); data->new_line.text[0] = '\0'; i++; /* Start from the last line again */ continue; } } if (strlen(data->new_line.text) > 0) { /* if we get here, the new line was not concatenated. Add it on a new line, but first check whether we should --More--. */ RECT tmpdraw_rt = draw_rt; TCHAR tmpwbuf[MAXWINDOWTEXT+2]; HGDIOBJ oldFont; int new_screen_lines; int screen_lines_not_seen = 0; /* Count how many screen lines we haven't seen yet. */ #ifdef MSG_WRAP_TEXT { int n; for (n = data->lines_not_seen - 1; n >= 0; n--) { screen_lines_not_seen += data->window_text_lines[(data->last_line - n + MSG_LINES) % MSG_LINES]; } } #else screen_lines_not_seen = data->lines_not_seen; #endif /* Now find out how many screen lines we would like to add */ NH_A2W(data->new_line.text, tmpwbuf, sizeof(tmpwbuf)); /* Find out how large the bounding rectangle of the text is */ oldFont = SelectObject(hdc, mswin_get_font(NHW_MESSAGE, data->window_text[lineidx].attr, hdc, FALSE)); DrawText(hdc, tmpwbuf, _tcslen(tmpwbuf), &tmpdraw_rt, DT_NOPREFIX | DT_WORDBREAK | DT_CALCRECT); SelectObject(hdc, oldFont); new_screen_lines = (tmpdraw_rt.bottom - tmpdraw_rt.top) / data->yChar; /* If this together is more than fits on the window, we must --More--, unless: - We are in --More-- already (the user is scrolling the window) - The user pressed ESC */ if (screen_lines_not_seen + new_screen_lines > MSG_VISIBLE_LINES && !data->in_more && !data->nevermore) { data->in_more = 1; /* Show --More-- on last line */ strcat(data->window_text[data->last_line].text, MORE); /* Go on drawing, but remember we must do a more afterwards */ do_more = 1; } else if (!data->in_more) { data->last_line++; data->last_line %= MSG_LINES; data->window_text[data->last_line].attr = data->new_line.attr; strncpy(data->window_text[data->last_line].text, data->new_line.text, MAXWINDOWTEXT); data->new_line.text[0] = '\0'; if (data->cleared) { /* now we are drawing a new line, the old lines can be redrawn in grey.*/ data->lines_last_turn = 0; data->cleared = 0; } data->lines_last_turn++; data->lines_not_seen++; /* and start over */ i++; /* Start from the last line again */ continue; } } } /* convert to UNICODE */ NH_A2W(data->window_text[lineidx].text, wbuf, sizeof(wbuf)); wlen = _tcslen(wbuf); setMsgTextColor(hdc, i < (MSG_LINES - data->lines_last_turn)); #ifdef MSG_WRAP_TEXT /* Find out how large the bounding rectangle of the text is */ DrawText(hdc, wbuf, wlen, &draw_rt, DT_NOPREFIX | DT_WORDBREAK | DT_CALCRECT); /* move that rectangle up, so that the bottom remains at the same height */ draw_rt.top = y - (draw_rt.bottom - draw_rt.top); draw_rt.bottom = y; /* Remember the height of this line for subsequent --More--'s */ data->window_text_lines[lineidx] = (draw_rt.bottom - draw_rt.top) / data->yChar; /* Now really draw it */ DrawText(hdc, wbuf, wlen, &draw_rt, DT_NOPREFIX | DT_WORDBREAK); /* Find out the cursor (caret) position */ if (i == MSG_LINES-1) { int nnum, numfit; SIZE size; TCHAR *nbuf; int nlen; nbuf = wbuf; nlen = wlen; while (nlen) { /* Get the number of characters that fit on the line */ GetTextExtentExPoint(hdc, nbuf, nlen, draw_rt.right - draw_rt.left, &numfit, NULL, &size); /* Search back to a space */ nnum = numfit; if (numfit < nlen) { while (nnum > 0 && nbuf[nnum] != ' ') nnum--; /* If no space found, break wherever */ if (nnum == 0) nnum = numfit; } nbuf += nnum; nlen -= nnum; if (*nbuf == ' ') { nbuf++; nlen--; } } /* The last size is the size of the last line. Set the caret there. This will fail automatically if we don't own the caret (i.e., when not in a question.) */ SetCaretPos(draw_rt.left + size.cx, draw_rt.bottom - data->yChar); } #else DrawText(hdc, wbuf, wlen, &draw_rt, DT_NOPREFIX ); SetCaretPos(draw_rt.left + size.cx, draw_rt.bottom - data->yChar); #endif SelectObject(hdc, oldFont); y -= draw_rt.bottom - draw_rt.top; } if (do_more) { int okkey = 0; int chop; // @@@ Ok respnses while (!okkey) { char c = mswin_nhgetch(); switch (c) { /* space or enter */ case ' ': case '\015': okkey = 1; break; /* ESC */ case '\033': data->nevermore = 1; okkey = 1; break; default: break; } } chop = strlen(data->window_text[data->last_line].text) - strlen(MORE); data->window_text[data->last_line].text[chop] = '\0'; data->in_more = 0; data->lines_not_seen = 0; /* We did the --More--, reset the lines_not_seen; now draw that new line. This is the easiest method */ InvalidateRect(hWnd, NULL, TRUE); } } SetTextColor (hdc, OldFg); SetBkColor (hdc, OldBg); EndPaint(hWnd, &ps); } void onCreate(HWND hWnd, WPARAM wParam, LPARAM lParam) { PNHMessageWindow data; SIZE dummy; /* 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); /* re-calculate window size (+ font size) */ mswin_message_window_size(hWnd, &dummy); } void mswin_message_window_size (HWND hWnd, LPSIZE sz) { HDC hdc; HGDIOBJ saveFont; TEXTMETRIC tm; PNHMessageWindow data; RECT rt, client_rt; data = (PNHMessageWindow)GetWindowLong(hWnd, GWL_USERDATA); if( !data ) return; /* -- Calculate the font size -- */ /* Get the handle to the client area's device context. */ hdc = GetDC(hWnd); saveFont = SelectObject(hdc, mswin_get_font(NHW_MESSAGE, ATR_NONE, hdc, FALSE)); /* Extract font dimensions from the text metrics. */ GetTextMetrics (hdc, &tm); data->xChar = tm.tmAveCharWidth; data->xUpper = (tm.tmPitchAndFamily & 1 ? 3 : 2) * data->xChar/2; data->yChar = tm.tmHeight + tm.tmExternalLeading; data->xPage = 1; /* Free the device context. */ SelectObject(hdc, saveFont); ReleaseDC (hWnd, hdc); /* -- calculate window size -- */ GetWindowRect(hWnd, &rt); sz->cx = rt.right - rt.left; sz->cy = rt.bottom - rt.top; /* set size to accomodate MSG_VISIBLE_LINES 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; } �����������������������������������������������������slashem-0.0.7E7F3/win/win32/winhack.rc��������������������������������������������������������������0000664�0000764�0000764�00000025734�10545462317�015400� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������//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 "SLASHEM.ICO" ///////////////////////////////////////////////////////////////////////////// // // Menu // IDC_NETHACKW MENU DISCARDABLE BEGIN POPUP "&File" BEGIN MENUITEM "&Save and Exit", 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 "Slash'EM 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 Slash'EM", 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 "Slash'EM 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 "Slash'EM",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_CHILD | 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_CHILD | 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 DIALOG DISCARDABLE 0, 0, 281, 257 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Welcome to Slash'EM" FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "OK",IDOK,224,236,50,14 EDITTEXT IDC_EXTRAINFO,7,176,267,52,ES_MULTILINE | ES_READONLY | WS_VSCROLL 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 IDD_SPLASH, DIALOG BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 274 BOTTOMMARGIN, 250 END END #endif // APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Version // VS_VERSION_INFO VERSIONINFO FILEVERSION 0,0,7,7 PRODUCTVERSION 0,0,7,7 FILEFLAGSMASK 0x1fL #ifdef _DEBUG FILEFLAGS 0x9L #else FILEFLAGS 0x8L #endif FILEOS 0x4L FILETYPE 0x0L FILESUBTYPE 0x0L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904b0" BEGIN VALUE "FileDescription", "Slash'EM for Windows - Native Graphical Interface\0" VALUE "FileVersion", "0.0.7E7\0" VALUE "InternalName", "SlashEM\0" VALUE "LegalCopyright", "Copyright (C) 1985 - 2003. By Stichting Mathematisch Centrum and M. Stephenson. See license for details.\0" VALUE "OriginalFilename", "slashem.exe\0" VALUE "PrivateBuild", "0\0" VALUE "ProductName", "SlashEM\0" VALUE "ProductVersion", "0.0.7E7\0" END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x409, 1200 END END ///////////////////////////////////////////////////////////////////////////// // // String Table // STRINGTABLE DISCARDABLE BEGIN IDS_APP_TITLE "Slash'EM for Windows - Native Graphical Interface" IDC_NETHACKW "SLASHEM" IDS_APP_TITLE_SHORT "Slash'EM for Windows" END #endif // English (U.S.) resources ///////////////////////////////////////////////////////////////////////////// #ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 3 resource. // ///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED ������������������������������������slashem-0.0.7E7F3/win/win32/dlb_main.dsp������������������������������������������������������������0000664�0000764�0000764�00000015047�10545462317�015677� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# 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 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 license >>dlb.lst ..\util\dlb_main.exe cIf dlb.lst nhshare echo dungeon > dlb2.lst echo quest.dat >>dlb2.lst for %%N in (*.lev) do echo %%N >>dlb2.lst ..\util\dlb_main.exe cIf dlb2.lst nhushare 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 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 license >>dlb.lst ..\util\dlb_main.exe cIf dlb.lst nhshare echo quest.dat >dlb2.lst echo dungeon >>dlb2.lst for %%N in (*.lev) do echo %%N >>dlb2.lst ..\util\dlb_main.exe cIf dlb2.lst nhushare 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 �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/win32/tiles.mak���������������������������������������������������������������0000664�0000764�0000764�00000007526�10545462317�015237� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������default: all all: ..\win\win32\tiles.bmp ..\win\win32\tiles32.bmp ..\win\win32\tiles128.bmp clean: -del ..\src\tiles.bmp -del ..\src\tiles32.bmp -del ..\win\win32\tiles.bmp -del ..\win\win32\tiles32.bmp -del ..\win\win32\tiles128.bmp -del ..\win\share\mon32-t.txt -del ..\win\share\obj32-t.txt -del ..\win\share\oth32-t.txt -del ..\win\share\mon32.txt -del ..\win\share\obj32.txt -del ..\win\share\oth32.txt -del ..\win\share\mon128.txt -del ..\win\share\obj128.txt -del ..\win\share\oth128.txt #========================================================== # Building the tiles file tile.bmp, tile32.bmp, tile128.bmp #========================================================== ..\src\tiles.bmp : ..\win\share\monsters.txt ..\win\share\objects.txt \ ..\win\share\other.txt ..\util\tile2bmp.exe chdir ..\src ..\util\tile2bmp.exe tiles.bmp ..\win\share\monsters.txt ..\win\share\objects.txt \ ..\win\share\other.txt chdir ..\build ..\src\tiles32.bmp : ..\win\share\mon32.txt ..\win\share\obj32.txt \ ..\win\share\oth32.txt ..\util\tile2bmp.exe chdir ..\src ..\util\tile2bmp.exe tiles32.bmp ..\win\share\mon32.txt ..\win\share\obj32.txt \ ..\win\share\oth32.txt chdir ..\build ..\src\tiles128.bmp : ..\win\share\mon128.txt ..\win\share\obj128.txt \ ..\win\share\oth128.txt ..\util\tile2bmp.exe chdir ..\src ..\util\tile2bmp.exe tiles128.bmp ..\win\share\mon128.txt ..\win\share\obj128.txt \ ..\win\share\oth128.txt chdir ..\build ..\win\win32\tiles.bmp: ..\src\tiles.bmp @copy ..\src\tiles.bmp ..\win\win32\tiles.bmp ..\win\win32\tiles32.bmp: ..\src\tiles32.bmp @copy ..\src\tiles32.bmp ..\win\win32\tiles32.bmp ..\win\win32\tiles128.bmp: ..\src\tiles128.bmp @copy ..\src\tiles128.bmp ..\win\win32\tiles128.bmp ..\win\share\monmag.txt: ..\util\magtile.exe ..\win\share\monsters.txt ..\util\magtile ..\win\share\objmag.txt: ..\util\magtile.exe ..\win\share\objects.txt ..\util\magtile ..\win\share\othmag.txt: ..\util\magtile.exe ..\win\share\other.txt ..\util\magtile ..\win\share\mon32.txt: ..\util\txtbg.exe ..\win\share\mon32-t.txt ..\util\txtbg ..\win\share\mon32-t.txt ..\win\share\mon32.txt ..\win\share\obj32.txt: ..\util\txtbg.exe ..\win\share\obj32-t.txt ..\util\txtbg ..\win\share\obj32-t.txt ..\win\share\obj32.txt ..\win\share\oth32.txt: ..\util\txtbg.exe ..\win\share\oth32-t.txt ..\util\txtbg ..\win\share\oth32-t.txt ..\win\share\oth32.txt ..\win\share\mon128.txt: ..\util\txtbg.exe ..\win\share\mon128ab.txt ..\util\txtbg ..\win\share\mon128ab.txt ..\win\share\mon128.txt ..\win\share\obj128.txt: ..\util\txtbg.exe ..\win\share\obj128ab.txt ..\util\txtbg ..\win\share\obj128ab.txt ..\win\share\obj128.txt ..\win\share\oth128.txt: ..\util\txtbg.exe ..\win\share\oth128ab.txt ..\util\txtbg ..\win\share\oth128ab.txt ..\win\share\oth128.txt ..\win\share\mon32-t.txt: ..\util\txtmerge.exe ..\win\share\monmag.txt \ ..\win\share\mon32mi.txt ..\win\share\mon32alg.txt \ ..\win\share\mon32aw.txt chdir ..\win\share ..\..\util\txtmerge mon32-t.txt monmag.txt -b mon32mi.txt -bff00ff mon32alg.txt ..\..\util\txtmerge mon32-t.txt mon32-t.txt -bff00ff mon32aw.txt chdir ..\..\build ..\win\share\obj32-t.txt: ..\util\txtmerge.exe ..\win\share\objmag.txt \ ..\win\share\obj32mi.txt ..\win\share\obj32se.txt \ ..\win\share\obj32alg.txt chdir ..\win\share ..\..\util\txtmerge obj32-t.txt objmag.txt -b obj32mi.txt -b obj32se.txt ..\..\util\txtmerge obj32-t.txt obj32-t.txt -bff00ff obj32alg.txt chdir ..\..\build ..\win\share\oth32-t.txt: ..\util\txtmerge.exe ..\win\share\othmag.txt \ ..\win\share\oth32mi.txt ..\win\share\oth32se.txt \ ..\win\share\oth32alg.txt chdir ..\win\share ..\..\util\txtmerge oth32-t.txt othmag.txt -b oth32mi.txt -b oth32se.txt ..\..\util\txtmerge oth32-t.txt oth32-t.txt -bff00ff oth32alg.txt chdir ..\..\build ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/win32/nhwin32.rc��������������������������������������������������������������0000664�0000764�0000764�00000012611�10545462317�015232� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* NetHack may be freely redistributed. See license for details. */ /* Resources for Windows 3.x Nethack */ #include "..\include\win32api.h" #include "..\include\nhwin32.h" #include "..\include\patchlevel.h" NHIcon ICON SlashEm_.ico NHMenu MENU BEGIN POPUP "&File" { MENUITEM "&Save + Exit", IDM_SAVE, GRAYED MENUITEM SEPARATOR MENUITEM "&Quit", IDM_QUIT, GRAYED } POPUP "&Options" { MENUITEM "&Game", IDM_GAMEOPT, GRAYED MENUITEM "&Display", IDM_DISPOPT, GRAYED MENUITEM "&Environment", IDM_ENVOPT, GRAYED } POPUP "&Help" { MENUITEM "&Contents", IDM_HELPCONTENTS MENUITEM "&Search for Help On...", IDM_HELPSEARCH MENUITEM "&How to Use Help", IDM_HELPHELP MENUITEM SEPARATOR MENUITEM "&About NetHack...", IDM_ABOUT } END AboutMenu MENU { POPUP "Information" { MENUITEM "About Box...", IDM_ABOUT MENUITEM "Exit", IDM_EXIT } } AboutDiaBox DIALOG 6,18,160,100 LANGUAGE LANG_NEUTRAL,SUBLANG_NEUTRAL STYLE DS_MODALFRAME|WS_POPUP|WS_VISIBLE|WS_CAPTION|WS_SYSMENU CAPTION "About NetHack" FONT 8, "MS Sans Serif" { CTEXT "ABOUT Dialog Box",-1,34,10,91,8 CTEXT "By",-1,61,25,32,8 CTEXT "Michael Allison and",-1,38,42,86,8 CTEXT "The NetHack PC Team",-1,45,59,70,8 ICON NHIcon ,-1,6,14,18,20 PUSHBUTTON "Okay",IDOK,58,80,40,14 } CHAR_SEL_DIALOG DIALOG 51, 22, 108, 134 CAPTION "Select Character Class" STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION BEGIN CONTROL "Archeologist", IDD_ARCH, "BUTTON", BS_RADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 6, 10, 55, 12 CONTROL "Barbarian", IDD_BARB, "BUTTON", BS_RADIOBUTTON | WS_CHILD | WS_VISIBLE, 6, 25, 45, 12 CONTROL "Elf", IDD_ELF, "BUTTON", BS_RADIOBUTTON | WS_CHILD | WS_VISIBLE, 6, 52, 20, 12 CONTROL "Healer", IDD_HEAL, "BUTTON", BS_RADIOBUTTON | WS_CHILD | WS_VISIBLE, 6, 66, 35, 12 CONTROL "Knight", IDD_KNIGHT, "BUTTON", BS_RADIOBUTTON | WS_CHILD | WS_VISIBLE, 6, 80, 35, 12 CONTROL "Priest", IDD_PRIEST, "BUTTON", BS_RADIOBUTTON | WS_CHILD | WS_VISIBLE, 6, 94, 40, 12 CONTROL "Rogue", IDD_ROGUE, "BUTTON", BS_RADIOBUTTON | BS_LEFTTEXT | WS_CHILD | WS_VISIBLE, 66, 10, 35, 12 CONTROL "Samurai", IDD_SAM, "BUTTON", BS_RADIOBUTTON | BS_LEFTTEXT | WS_CHILD | WS_VISIBLE, 61, 24, 40, 12 CONTROL "Tourist", IDD_TOUR, "BUTTON", BS_RADIOBUTTON | BS_LEFTTEXT | WS_CHILD | WS_VISIBLE, 66, 38, 35, 12 CONTROL "Valkyrie", IDD_VAL, "BUTTON", BS_RADIOBUTTON | BS_LEFTTEXT | WS_CHILD | WS_VISIBLE, 61, 52, 40, 12 CONTROL "Wizard", IDD_WIZ, "BUTTON", BS_RADIOBUTTON | BS_LEFTTEXT | WS_CHILD | WS_VISIBLE, 66, 66, 35, 12 CONTROL "Random", IDD_RAND, "BUTTON", BS_RADIOBUTTON | BS_LEFTTEXT | WS_CHILD | WS_VISIBLE, 63, 80, 38, 12 CONTROL "Ok", IDOK, "BUTTON", BS_DEFPUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 6, 113, 24, 14 CONTROL "Quit", IDCANCEL, "BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 77, 113, 24, 14 CONTROL "Caveman", IDD_CAVEMAN, "BUTTON", BS_RADIOBUTTON | WS_CHILD | WS_VISIBLE, 6, 38, 45, 12 END ASK_NAME_DIAL DIALOG 18, 54, 142, 44 CAPTION "" STYLE DS_MODALFRAME | WS_POPUP BEGIN CONTROL "Ok", IDOK, "BUTTON", BS_DEFPUSHBUTTON | WS_CHILD | WS_VISIBLE, 54, 24, 24, 14 LTEXT "Who Are You?", -1, 10, 6, 50, 8, WS_CHILD | WS_VISIBLE | WS_GROUP EDITTEXT IDD_NAME, 59, 4, 70, 12, ES_LEFT | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP END ENTER_TEXT DIALOG 18, 37, 222, 61 CAPTION "" STYLE DS_MODALFRAME | WS_POPUP BEGIN LTEXT "Test", IDD_QUESTION, 10, 8, 200, 8, WS_CHILD | WS_VISIBLE | WS_GROUP EDITTEXT IDD_INPUTTEXT, 11, 24, 200, 12, ES_LEFT | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP DEFPUSHBUTTON "OK", IDOK, 153, 42, 24, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP PUSHBUTTON "Cancel", IDCANCEL, 187, 42, 24, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP END OKBUTTON DIALOG 204, 79, 25, 14 CAPTION "" STYLE WS_POPUP BEGIN DEFPUSHBUTTON "OK", IDOK, 0, 0, 24, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP END NHLISTBOX DIALOG 10,10,140,110 CAPTION "NetHack 3.2 Menu" STYLE WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE { PUSHBUTTON "EXIT", IDM_EXIT, 8, 82, 38, 16, WS_CHILD | WS_VISIBLE | WS_TABSTOP LISTBOX IDD_LB1, 66, 5, 63, 33, LBS_NOTIFY | WS_VISIBLE | WS_BORDER | WS_VSCROLL | WS_TABSTOP } HACK_COPYRIGHT DIALOG 6, 18, 246, 126 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE CAPTION "About NetHack for Windows" FONT 8, "MS Sans Serif" BEGIN CTEXT "NetHack", IDD_ABOUT1, 8, 13, 222, 8 LTEXT COPYRIGHT_BANNER_A, IDD_ABOUT2, 8, 27, 238, 8 LTEXT COPYRIGHT_BANNER_B, IDD_ABOUT3, 8, 35, 224, 8 LTEXT COPYRIGHT_BANNER_C, IDD_ABOUT4, 7, 43, 223, 8 CTEXT "NetHack 3.2 for Windows", 105, 8, 63, 214, 8 CTEXT "Initial MS Windows port by Bill Dyer 1992", IDD_ABOUT5, 8, 78, 215, 8 CTEXT "WIN32 port by Michael Allison 1995", IDD_ABOUT6, 8, 94, 212, 8 CTEXT "Windows NT port by Michael Allison 1993", IDD_ABOUT7, 8, 86, 211, 8 PUSHBUTTON "OK", IDOK, 95, 110, 40, 14 CONTROL "", IDD_ABOUT8, "Static", SS_BLACKFRAME, 101, 8, 37, 17 CONTROL "", IDD_ABOUT9, "Static", SS_BLACKFRAME, 70, 59, 92, 16 END �����������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/win32/dgnstuff.dsp������������������������������������������������������������0000664�0000764�0000764�00000005202�10545462317�015742� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# 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 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/win32/levstuff.dsp������������������������������������������������������������0000664�0000764�0000764�00000005275�10545462317�015772� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# 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 �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/win32/mnunsel.uu��������������������������������������������������������������0000664�0000764�0000764�00000000312�10545462317�015443� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������begin 600 mnunsel.bmp M0DU^`````````#X````H````$````!`````!``$``````$````!T$@``=!(` M`````````````````/___P```````````#_\```__```/_P``#_\```__``` D/_P``#_\```__```/_P``#_\```__```/_P````````````` ` end ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/win32/splash.uu���������������������������������������������������������������0000664�0000764�0000764�00002154441�10545462317�015273� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������begin 600 splash.bmp M0DWV:P8``````#8````H````7@$``)`!```!`!@``````,!K!@#K"@``ZPH` M````````````9%T'8UT'8UT'8UP'8EP'8EP'8EP'85L'85L'85L'85H'8%H' M8%H'8%H'7UD'7UD'7UD'7E@'7E@'7E@'75<'75<'75<'7%<'7%8'7%8'7%8& M6U4&6U4&6U4&6E4&6E0&6E0&650&65,&65,&6%,&6%(&6%(&5U(&5U(&5U$& M5E$&5E$&5E`&5E`&55`&55`&54\&5$\&5$\&5$X&4TX&4TX&4TT&4DT&4DT& M4DT&44P&44P&44P&44L&4$L&4$L&4$L&3TH&3TH&3TH&3DD%3DD%3DD%34@% M34@%34@%3$@%3$<%3$<%2T<%2T8%2T8%2T8%2D8%2D4%2D4%244%240%240% M2$0%2$,%2$,%1T,%1T,%1T(%1D(%1D(%1D$%1D$%14$%14$%14`%1$`%1$`% M1#\%0S\%0S\%0SX%0CX%0CX%0CX%03T%03T$03T$0#P$0#P$0#P$0#L$/SL$ M/SL$/SL$/CH$/CH$/CH$/3D$/3D$/3D$/#D$/#@$/#@$.S@$.S<$.S<$.S<$ M.C8$.C8$.C8$.38$.34$.34$.#4$.#0$.#0$-S0$-S0$-S,$-C,$-C,$-C($ M-3($-3($-3$$-3$$-#$$-#$#-#`#,S`#,S`#,R\#,B\#,B\#,B\#,2X#,2X# M,2X#,"T#,"T#,"T#,"P#+RP#+RP#+RP#+BL#+BL#+BL#+2H#+2H#+2H#+"H# M+"D#+"D#*RD#*R@#*R@#*B@#*B<#*B<#*B<#*2<#*28#*28#*"8#*"4#*"4# M)R4#)R4#)R0")B0")B0")B,")2,")2,")2(")2(")"(")"(")"$"(R$"(R$" M(R`"(B`"(B`"(B`"(1\"(1\"(1\"(!X"(!X"(!X"'QT"'QT"'QT"'QT"'AP" M'AP"'AP"'1L"'1L"'1L"'!L"'!H"'!H"&QH"&QD"&QD"&AD"&A@"&A@"&A@! M&1@!&1<!&1<!&!<!&!8!&!8!%Q8!%Q8!%Q4!%A4!%A4!%A0!%10!%10!%1,! M%!,!%!,!%!,!%!(!$Q(!$Q(!$Q$!$A$!$A$!$A$!$1`!$1`!$1`!$`\!$`\! M$`\!#PX!#PX!#PX!#PX!#@T!#@T!#@T!#0P!#0P!#0P`#`P`#`L`#`L`"PL` M"PH`"PH`"@H`"@D`"@D`"0D`"0D`"0@`"0@`"`@`"`<`"`<`!P<`!P<`!P8` M!@8`!@8`!@4`!04`!04`!00`!`0`!`0`!`0`!`,``P,``P,``P(``@(``@(` M`@(``0$``0$``0$````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M``````````````````````````````````!D7@=D70=C70=C70=C70=B7`=B M7`=B7`=B6P=A6P=A6P=A6@=@6@=@6@=@6@=?60=?60=?60=>6`=>6`=>6`== M6`==5P==5P==5P=<5@=<5@=<5@9;509;509;509:509:5`9:5`995`994P99 M4P984P984@984@974@974@974097409640964`964`954`954`953P943P94 M3P943@933@933@9330923092309230923`913`913`912P902P902P902P9/ M2@9/2@9/2@9.205.205.205-2`5-2`5-2`5,2`5,1P5,1P5,1P5+1@5+1@5+ M1@5*1@5*105*105)105)1`5)1`5(1`5(0P5(0P5'0P5'0P5'0@5'0@5&0@5& M005&005%005%005%0`5$0`5$0`5$/P5#/P5#/P5#/@5"/@5"/@5"/@5!/05! M/01!/01!/`1`/`1`/`1`/`0_.P0_.P0_.P0^.@0^.@0^.@0].00].00].00\ M.00\.`0\.`0\.`0[-P0[-P0[-P0Z-P0Z-@0Z-@0Y-@0Y-00Y-00X-00X-`0X M-`0W-`0W-`0W,P0V,P0V,P0V,@0V,@0U,@0U,@0U,00T,00T,0,T,`,S,`,S M,`,S+P,R+P,R+P,R+P,Q+@,Q+@,Q+@,Q+0,P+0,P+0,P+0,O+`,O+`,O+`,N M*P,N*P,N*P,M*@,M*@,M*@,L*@,L*0,L*0,K*0,K*`,K*`,K*`,J*`,J)P,J M)P,I)P,I)@,I)@,H)@,H)0,H)0,G)0,G)0,G)`(F)`(F)`(F(P(F(P(E(P(E M(P(E(@(D(@(D(@(D(0(C(0(C(0(C(`(B(`(B(`(B(`(A'P(A'P(A'P(@'@(@ M'@(@'@(@'@(?'0(?'0(?'0(>'`(>'`(>'`(=&P(=&P(=&P(<&P(<&@(<&@(; M&@(;&0(;&0(;&0(:&0(:&`(:&`$9&`$9%P$9%P$8%P$8%@$8%@$7%@$7%@$7 M%0$6%0$6%0$6%`$5%`$5%`$5%`$5$P$4$P$4$P$4$@$3$@$3$@$3$0$2$0$2 M$0$2$0$1$`$1$`$1$`$0#P$0#P$0#P$0#@$/#@$/#@$/#@$.#0$.#0$.#0$- M#`$-#`$-#`$,#``,"P`,"P`+"P`+"@`+"@`*"@`*"0`*"0`*"0`)"0`)"``) M"``("``(!P`(!P`'!P`'!P`'!@`&!@`&!@`&!0`%!0`%!0`%!``%!``$!``$ M!``$`P`#`P`#`P`#`@`"`@`"`@`"`@`!`0`!`0`!`0`````````````````` M```````````````````````````````````````````````````````````` M`````````````````````````````````````````````````````````&1> M!V1>!V1=!V-=!V-=!V-=!V-<!V)<!V)<!V);!V%;!V%;!V%:!V!:!V!:!V!: M!U]9!U]9!U]9!UY8!UY8!UY8!UU8!UU7!UU7!UU7!UQ6!UQ6!UQ6!EM5!EM5 M!EM5!EI5!EI4!EI4!EE4!EE3!EE3!EA3!EA3!EA2!EA2!E=2!E=1!E=1!E91 M!E90!E90!E50!E50!E5/!E1/!E1/!E1.!E-.!E-.!E-.!E)-!E)-!E)-!E), M!E%,!E%,!E%+!E!+!E!+!E!+!D]*!D]*!D]*!DY)!4Y)!4Y)!4U)!4U(!4U( M!4U(!4Q'!4Q'!4Q'!4M&!4M&!4M&!4I&!4I%!4I%!4E%!4E$!4E$!4A$!4A$ M!4A#!4=#!4=#!4="!4="!49"!49!!49!!45!!45!!45`!41`!41`!40_!4,_ M!4,_!4,_!4(^!4(^!4(^!4(]!4$]!$$]!$$\!$`\!$`\!$`\!#\[!#\[!#\[ M!#XZ!#XZ!#XZ!#TZ!#TY!#TY!#PY!#PX!#PX!#PX!#LW!#LW!#LW!#HW!#HV M!#HV!#DV!#DU!#DU!#@U!#@U!#@T!#<T!#<T!#<S!#<S!#8S!#8R!#8R!#4R M!#4R!#4Q!#0Q!#0Q`S0P`S,P`S,P`S,P`S(O`S(O`S(O`S$N`S$N`S$N`S$M M`S`M`S`M`S`M`R\L`R\L`R\L`RXK`RXK`RXK`RTK`RTJ`RTJ`RPJ`RPI`RPI M`RPI`RLH`RLH`RLH`RHH`RHG`RHG`RDG`RDF`RDF`R@F`R@E`R@E`R<E`R<E M`R<D`B8D`B8D`B8C`B8C`B4C`B4C`B4B`B0B`B0B`B0A`B,A`B,A`B,@`B(@ M`B(@`B(@`B$?`B$?`B$?`B$>`B`>`B`>`B`>`A\=`A\=`A\=`AX<`AX<`AX< M`AT;`AT;`AT;`AP;`AP:`AP:`AL:`AL9`AL9`AL9`AH9`AH8`AH8`1D8`1D7 M`1D7`1@7`1@6`1@6`1<6`1<6`1<5`185`185`184`184`144`144`143`103 M`103`102`1,2`1,2`1,1`1(1`1(1`1(1`1$0`1$0`1$0`1`/`1`/`1`/`1`/ M`0\.`0\.`0\.`0X-`0X-`0X-`0T,`0T,`0T,`0P,``P+``P+``L+``L*``L* M``L*``H*``H)``H)``D)``D(``D(``@(``@'``@'``<'``<'``<&``8&``8& M``8%``4%``4%``4%``4$``0$``0$``0#``,#``,#``,"``("``("``("``$! M``$!``$!```````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M````````````````````95X'9%X'9%X'9%T'9%T'8UT'8UT'8UP'8EP'8EP' M8EL'85L'85L'85L'8%H'8%H'8%H'7UD'7UD'7UD'7E@'7E@'7E@'7E@'75<' M75<'75<'7%8'7%8'7%8&6U8&6U4&6U4&6E4&6E0&6E0&650&65,&65,&65,& M6%,&6%(&6%(&5U(&5U$&5U$&5E$&5E$&5E`&55`&55`&54\&5$\&5$\&5$X& M4TX&4TX&4TX&4TT&4DT&4DT&4DP&44P&44P&44P&4$L&4$L&4$L&3TH&3TH& M3TH&3DD%3DD%3DD%3DD%34@%34@%34@%3$<%3$<%3$<%2T<%2T8%2T8%2D8% M2D4%2D4%244%240%240%2$0%2$0%2$,%2$,%1T,%1T(%1T(%1D(%1D(%1D$% M14$%14$%14`%1$`%1$`%1#\%0S\%0S\%0S\%0SX%0CX%0CX%0CT%03T$03T$ M03P$0#P$0#P$0#P$/SL$/SL$/SL$/CH$/CH$/CH$/3H$/3D$/3D$/3D$/#@$ M/#@$/#@$.S<$.S<$.S<$.C<$.C8$.C8$.38$.34$.34$.#4$.#4$.#0$.#0$ M-S0$-S,$-S,$-C,$-C($-C($-3($-3($-3$$-#$$-#$#-#`#,S`#,S`#,S`# M,B\#,B\#,B\#,BX#,2X#,2X#,2T#,"T#,"T#,"T#+RP#+RP#+RP#+BL#+BL# M+BL#+2L#+2H#+2H#+2H#+"D#+"D#+"D#*R@#*R@#*R@#*B@#*B<#*B<#*2<# M*28#*28#*"8#*"8#*"4#)R4#)R4#)R0")R0")B0")B,")B,")2,")2,")2(" M)"(")"(")"$"(R$"(R$"(R$"(B`"(B`"(B`"(A\"(1\"(1\"(1X"(!X"(!X" M(!X"'QT"'QT"'QT"'AP"'AP"'AP"'1P"'1L"'1L"'!L"'!H"'!H"'!H"&QD" M&QD"&QD"&AD"&A@"&A@!&1@!&1<!&1<!&!<!&!<!&!8!%Q8!%Q8!%Q4!%Q4! M%A4!%A0!%A0!%10!%10!%1,!%!,!%!,!%!(!$Q(!$Q(!$Q(!$A$!$A$!$A$! M$1`!$1`!$1`!$0\!$`\!$`\!$`\!#PX!#PX!#PX!#@T!#@T!#@T!#0T!#0P! M#0P!#`P`#`L`#`L`#`L`"PH`"PH`"PH`"@H`"@D`"@D`"0D`"0@`"0@`"`@` M"`@`"`<`!P<`!P<`!P8`!@8`!@8`!@4`!@4`!04`!04`!00`!`0`!`0`!`,` M`P,``P,``P,``@(``@(``@(``0$``0$``0$``0`````````````````````` M```````````````````````````````````````````````````````````` M``````````````````````````````````````````!E7P=E7@=D7@=D7@=D M7@=D70=C70=C70=C7`=B7`=B7`=B6P=A6P=A6P=A6P=@6@=@6@=@6@=?60=? M60=?60=?60=>6`=>6`=>6`==5P==5P==5P=<5@=<5@=<5@=;5@9;509;509: M509:5`9:5`995`995`994P994P984P984@984@974@974097409640964096 M4`954`954`953P943P943P943@943@933@933@933092309230923`913`91 M3`913`902P902P902P9/2@9/2@9/2@9.205.205.205.205-2`5-2`5-2`5, M1P5,1P5,1P5+1P5+1@5+1@5*1@5*105*105)105)1`5)1`5)1`5(1`5(0P5( M0P5'0P5'0@5'0@5&0@5&0@5&005%005%005%0`5$0`5$0`5$/P5#/P5#/P5# M/P5#/@5"/@5"/@5"/05!/01!/01!/01`/`1`/`1`/`0_.P0_.P0_.P0^.@0^ M.@0^.@0^.@0].00].00].00\.`0\.`0\.`0[.`0[-P0[-P0Z-P0Z-@0Z-@0Y M-@0Y-00Y-00X-00X-00X-`0X-`0W-`0W,P0W,P0V,P0V,P0V,@0U,@0U,@0U M,00T,00T,0,T,`,S,`,S,`,S,`,S+P,R+P,R+P,R+@,Q+@,Q+@,Q+@,P+0,P M+0,P+0,O+`,O+`,O+`,N*P,N*P,N*P,M*P,M*@,M*@,M*@,L*0,L*0,L*0,K M*0,K*`,K*`,J*`,J)P,J)P,I)P,I)@,I)@,H)@,H)@,H)0,H)0,G)0,G)`(G M)`(F)`(F)`(F(P(E(P(E(P(E(@(D(@(D(@(D(0(C(0(C(0(C(0(B(`(B(`(B M(`(B'P(A'P(A'P(A'P(@'@(@'@(@'@(?'0(?'0(?'0(>'`(>'`(>'`(='`(= M&P(=&P(=&P(<&@(<&@(<&@(;&@(;&0(;&0(:&0(:&`(:&`$9&`$9%P$9%P$8 M%P$8%P$8%@$7%@$7%@$7%0$7%0$6%0$6%0$6%`$5%`$5%`$5$P$4$P$4$P$4 M$@$3$@$3$@$3$@$2$0$2$0$2$0$2$`$1$`$1$`$1$`$0#P$0#P$0#P$/#@$/ M#@$/#@$.#0$.#0$.#0$-#0$-#`$-#`$,#``,"P`,"P`,"P`+"@`+"@`+"@`* M"@`*"0`*"0`)"0`)"``)"``("``("``(!P`'!P`'!P`'!@`'!@`&!@`&!0`& M!0`%!0`%!0`%!``$!``$!``$`P`#`P`#`P`#`P`"`@`"`@`"`@`!`0`!`0`! M`0`!```````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M`````&5?!V5?!V5>!V5>!V1>!V1>!V1=!V-=!V-=!V-<!V)<!V)<!V);!V%; M!V%;!V%;!V!:!V!:!V!:!V!9!U]9!U]9!U]9!UY8!UY8!UY8!UU7!UU7!UU7 M!UQ6!UQ6!UQ6!UM6!EM5!EM5!EI5!EI4!EI4!EI4!EE4!EE3!EE3!EA3!EA2 M!EA2!E=2!E=1!E=1!E91!E91!E90!E50!E50!E5/!E5/!E1/!E1/!E1.!E-. M!E-.!E--!E)-!E)-!E),!E%,!E%,!E%,!E!+!E!+!E!+!D]*!D]*!D]*!D]* M!DY)!4Y)!4Y)!4U(!4U(!4U(!4Q'!4Q'!4Q'!4M'!4M&!4M&!4I&!4I%!4I% M!4I%!4E%!4E$!4E$!4A$!4A#!4A#!4=#!4="!4="!49"!49"!49!!45!!45! M!45`!41`!41`!41`!40_!4,_!4,_!4,^!4(^!4(^!4(]!4$]!4$]!$$]!$`\ M!$`\!$`\!#\[!#\[!#\[!#\[!#XZ!#XZ!#XZ!#TY!#TY!#TY!#PX!#PX!#PX M!#LX!#LW!#LW!#HW!#HV!#HV!#DV!#DV!#DU!#DU!#@U!#@T!#@T!#<T!#<S M!#<S!#8S!#8S!#8R!#4R!#4R!#4Q!#0Q!#0Q`S0Q`S0P`S,P`S,P`S,O`S(O M`S(O`S(N`S$N`S$N`S$N`S`M`S`M`S`M`R\L`R\L`R\L`RXL`RXK`RXK`RXK M`RTJ`RTJ`RTJ`RPI`RPI`RPI`RLI`RLH`RLH`RHH`RHG`RHG`RDG`RDG`RDF M`RDF`R@F`R@E`R@E`R<E`R<D`B<D`B8D`B8D`B8C`B4C`B4C`B4B`B0B`B0B M`B0A`B,A`B,A`B,A`B,@`B(@`B(@`B(?`B$?`B$?`B$?`B`>`B`>`B`>`A\= M`A\=`A\=`AX<`AX<`AX<`AX<`AT;`AT;`AT;`AP:`AP:`AP:`AL:`AL9`AL9 M`AH9`AH8`AH8`1D8`1D7`1D7`1@7`1@7`1@6`1@6`1<6`1<5`1<5`185`185 M`184`144`144`143`103`103`102`1,2`1,2`1,2`1,1`1(1`1(1`1(0`1$0 M`1$0`1$0`1`/`1`/`1`/`0\.`0\.`0\.`0X-`0X-`0X-`0T-`0T,`0T,`0T, M``P+``P+``P+``L+``L*``L*``H*``H)``H)``D)``D(``D(``@(``@(``@' M``@'``<'``<&``<&``8&``8&``8%``4%``4%``4$``0$``0$``0#``,#``,# M``,#``("``("``("``(!``$!``$!``$!```````````````````````````` M```````````````````````````````````````````````````````````` M````````````````````````````9E\'9E\'95\'95X'95X'9%X'9%X'9%T' M8UT'8UT'8UP'8EP'8EP'8EP'85L'85L'85L'8%H'8%H'8%H'8%D'7UD'7UD' M7UD'7E@'7E@'7E@'75<'75<'75<'7%<'7%8'7%8'6U8&6U4&6U4&6U4&6E0& M6E0&6E0&650&65,&65,&6%,&6%(&6%(&5U(&5U(&5U$&5E$&5E$&5E`&55`& M55`&54\&54\&5$\&5$\&5$X&4TX&4TX&4TT&4DT&4DT&4DT&44P&44P&44P& M4$L&4$L&4$L&4$H&3TH&3TH&3TH&3DD%3DD%3DD%34@%34@%34@%3$@%3$<% M3$<%2T<%2T8%2T8%2D8%2D4%2D4%2D4%244%240%240%2$0%2$,%2$,%1T,% M1T,%1T(%1D(%1D(%1D$%14$%14$%14`%14`%1$`%1$`%1#\%0S\%0S\%0SX% M0CX%0CX%0CX%03T%03T$03T$0#P$0#P$0#P$/SL$/SL$/SL$/SL$/CH$/CH$ M/CH$/3D$/3D$/3D$/#@$/#@$/#@$.S@$.S<$.S<$.C<$.C8$.C8$.C8$.38$ M.34$.34$.#4$.#0$.#0$-S0$-S,$-S,$-C,$-C,$-C($-3($-3($-3$$-#$$ M-#$$-#$#-#`#,S`#,S`#,R\#,B\#,B\#,BX#,2X#,2X#,2X#,"T#,"T#,"T# M+RP#+RP#+RP#+RP#+BL#+BL#+BL#+2H#+2H#+2H#+"D#+"D#+"D#*RD#*R@# M*R@#*B@#*B<#*B<#*2<#*2<#*28#*28#*"8#*"4#*"4#)R4#)R0")R0")B0" M)B0")B,")2,")2,")2(")"(")"(")"(")"$"(R$"(R$"(R`"(B`"(B`"(A\" M(1\"(1\"(1\"(!X"(!X"(!X"'QT"'QT"'QT"'AT"'AP"'AP"'AP"'1L"'1L" M'1L"'!H"'!H"'!H"&QH"&QD"&QD"&AD"&A@"&A@!&1@!&1@!&1<!&1<!&!<! M&!8!&!8!%Q8!%Q4!%Q4!%A4!%A4!%A0!%10!%10!%1,!%!,!%!,!%!,!$Q(! M$Q(!$Q(!$Q$!$A$!$A$!$A`!$1`!$1`!$1`!$`\!$`\!$`\!#PX!#PX!#PX! M#@X!#@T!#@T!#@T!#0P!#0P!#0P`#`L`#`L`#`L`"PL`"PH`"PH`"@H`"@D` M"@D`"0D`"0D`"0@`"`@`"`@`"`<`"`<`!P<`!P8`!P8`!@8`!@8`!@4`!04` M!04`!00`!`0`!`0`!`0``P,``P,``P,``P(``@(``@(``@$``0$``0$``0$` M```````````````````````````````````````````````````````````` M``````````````````````````````````````````````````!F8`=F7P=F M7P=E7P=E7P=E7@=D7@=D7@=D70=C70=C70=C7`=B7`=B7`=B7`=A6P=A6P=A M6P=A6@=@6@=@6@=@6@=?60=?60=?60=>6`=>6`=>6`==5P==5P==5P=<5P=< M5@=<5@=<5@9;509;509;509:509:5`9:5`995`994P994P984P984@984@97 M4@974@974096409640964`964`954`954`953P943P943P943@933@933@93 M30923092309230913`913`913`912P902P902P902@9/2@9/2@9/2@9.205. M205.205-2`5-2`5-2`5,2`5,1P5,1P5+1P5+1@5+1@5+1@5*105*105*105) M105)1`5)1`5(1`5(0P5(0P5'0P5'0P5'0@5&0@5&0@5&005&005%005%0`5% M0`5$0`5$0`5$/P5#/P5#/P5#/@5"/@5"/@5"/@5!/05!/01!/01`/`1`/`1` M/`1`.P0_.P0_.P0_.P0^.@0^.@0^.@0].00].00].00\.00\.`0\.`0[.`0[ M-P0[-P0[-P0Z-@0Z-@0Z-@0Y-@0Y-00Y-00X-00X-`0X-`0W-`0W-`0W,P0V M,P0V,P0V,@0U,@0U,@0U,00U,00T,00T,0,T,`,S,`,S,`,S+P,R+P,R+P,R M+P,Q+@,Q+@,Q+@,P+0,P+0,P+0,P+`,O+`,O+`,O+`,N*P,N*P,N*P,M*@,M M*@,M*@,L*@,L*0,L*0,K*0,K*`,K*`,J*`,J)P,J)P,J)P,I)P,I)@,I)@,H M)@,H)0,H)0,G)0,G)0,G)`(F)`(F)`(F(P(E(P(E(P(E(@(E(@(D(@(D(@(D M(0(C(0(C(0(C(`(B(`(B(`(B(`(A'P(A'P(A'P(@'@(@'@(@'@(?'0(?'0(? M'0(?'0(>'`(>'`(>'`(=&P(=&P(=&P(<&P(<&@(<&@(;&@(;&0(;&0(:&0(: M&`(:&`$:&`$9&`$9%P$9%P$8%P$8%@$8%@$7%@$7%@$7%0$6%0$6%0$6%`$5 M%`$5%`$5$P$4$P$4$P$4$P$4$@$3$@$3$@$3$0$2$0$2$0$2$0$1$`$1$`$1 M$`$0#P$0#P$0#P$/#@$/#@$/#@$/#@$.#0$.#0$.#0$-#`$-#`$-#``,#``, M"P`,"P`+"P`+"@`+"@`*"@`*"0`*"0`)"0`)"0`)"``)"``("``(!P`(!P`' M!P`'!@`'!@`&!@`&!@`&!0`%!0`%!0`%!``$!``$!``$!``$`P`#`P`#`P`# M`@`"`@`"`@`"`0`!`0`!`0`!`0`````````````````````````````````` M```````````````````````````````````````````````````````````` M`````````````&=@!V9@!V9?!V9?!V5?!V5?!V5>!V1>!V1>!V1=!V-=!V-= M!V-<!V)<!V)<!V)<!V);!V%;!V%;!V%:!V!:!V!:!V!:!U]9!U]9!U]9!UY8 M!UY8!UY8!UU7!UU7!UU7!UQ7!UQ6!UQ6!UQ6!EM5!EM5!EM5!EI5!EI4!EI4 M!EE4!EE3!EE3!EA3!EA2!EA2!E=2!E=2!E=1!E=1!E91!E90!E90!E50!E50 M!E5/!E1/!E1/!E1.!E-.!E-.!E--!E)-!E)-!E)-!E%,!E%,!E%,!E%+!E!+ M!E!+!E!+!D]*!D]*!D]*!DY)!4Y)!4Y)!4U(!4U(!4U(!4Q(!4Q'!4Q'!4Q' M!4M&!4M&!4M&!4I&!4I%!4I%!4E%!4E$!4E$!4A$!4A#!4A#!4=#!4=#!4=" M!49"!49"!49!!49!!45!!45!!45`!41`!41`!40_!4,_!4,_!4,^!4(^!4(^ M!4(^!4$]!4$]!$$]!$$\!$`\!$`\!$`\!#\[!#\[!#\[!#XZ!#XZ!#XZ!#TY M!#TY!#TY!#PY!#PX!#PX!#LX!#LW!#LW!#LW!#HW!#HV!#HV!#DV!#DU!#DU M!#@U!#@T!#@T!#<T!#<T!#<S!#8S!#8S!#8R!#8R!#4R!#4R!#4Q!#0Q!#0Q M`S0P`S,P`S,P`S,O`S(O`S(O`S(O`S$N`S$N`S$N`S`M`S`M`S`M`S`M`R\L M`R\L`R\L`RXK`RXK`RXK`RTJ`RTJ`RTJ`RPJ`RPI`RPI`RLI`RLH`RLH`RLH M`RHH`RHG`RHG`RDG`RDF`RDF`R@F`R@E`R@E`R<E`R<E`R<D`B8D`B8D`B8C M`B4C`B4C`B4C`B4B`B0B`B0B`B0A`B,A`B,A`B,@`B(@`B(@`B(@`B$?`B$? M`B$?`B`>`B`>`B`>`B`=`A\=`A\=`A\=`AX<`AX<`AX<`AT;`AT;`AT;`AP; M`AP:`AP:`AL:`AL9`AL9`AH9`AH8`AH8`AH8`1D8`1D7`1D7`1@7`1@6`1@6 M`1<6`1<6`1<5`185`185`184`144`144`143`143`103`103`102`1,2`1,2 M`1,1`1(1`1(1`1(1`1$0`1$0`1$0`1`/`1`/`1`/`0\.`0\.`0\.`0\.`0X- M`0X-`0X-`0T,`0T,`0T,`0P,``P+``P+``L+``L*``L*``H*``H)``H)``H) M``D)``D(``D(``@(``@'``@'``<'``<'``<&``8&``8&``8%``4%``4%``4$ M``0$``0$``0$``0#``,#``,#``,"``("``("``("``$!``$!``$!```````` M```````````````````````````````````````````````````````````` M````````````````````````````````````9V`'9V`'9F`'9E\'9E\'95\' M95\'95X'9%X'9%X'9%T'8UT'8UT'8UT'8UP'8EP'8EP'8EL'85L'85L'85H' M8%H'8%H'8%H'7UD'7UD'7UD'7E@'7E@'7E@'75@'75<'75<'75<'7%8'7%8' M7%8&6U4&6U4&6U4&6E4&6E0&6E0&650&65,&65,&6%,&6%,&6%(&6%(&5U(& M5U$&5U$&5E$&5E`&5E`&55`&55`&54\&5$\&5$\&5$X&4TX&4TX&4TX&4DT& M4DT&4DT&4DP&44P&44P&44L&4$L&4$L&4$L&3TH&3TH&3TH&3DD%3DD%3DD% M34D%34@%34@%34@%3$<%3$<%3$<%2T8%2T8%2T8%2D8%2D4%2D4%244%240% M240%2$0%2$0%2$,%1T,%1T,%1T(%1T(%1D(%1D$%1D$%14$%14$%14`%1$`% M1$`%1#\%0S\%0S\%0S\%0CX%0CX%0CX%0CT%03T$03T$03P$0#P$0#P$0#P$ M/SL$/SL$/SL$/CH$/CH$/CH$/3H$/3D$/3D$/#D$/#@$/#@$/#@$.S<$.S<$ M.S<$.C<$.C8$.C8$.38$.34$.34$.#4$.#0$.#0$-S0$-S0$-S,$-S,$-C,$ M-C($-C($-3($-3($-3$$-#$$-#$#-#`#,S`#,S`#,R\#,B\#,B\#,B\#,2X# M,2X#,2X#,2T#,"T#,"T#,"T#+RP#+RP#+RP#+BL#+BL#+BL#+2H#+2H#+2H# M+"H#+"D#+"D#+"D#*R@#*R@#*R@#*B@#*B<#*B<#*2<#*28#*28#*"8#*"4# M*"4#)R4#)R4#)R0")B0")B0")B,")B,")2,")2,")2(")"(")"(")"$"(R$" M(R$"(R`"(B`"(B`"(B`"(1\"(1\"(1\"(1X"(!X"(!X"(!X"'QT"'QT"'QT" M'AP"'AP"'AP"'1L"'1L"'1L"'!L"'!H"'!H"&QH"&QD"&QD"&QD"&AD"&A@" M&A@!&1@!&1<!&1<!&!<!&!8!&!8!%Q8!%Q8!%Q4!%A4!%A4!%A0!%A0!%10! M%10!%1,!%!,!%!,!%!(!$Q(!$Q(!$Q$!$A$!$A$!$A$!$1`!$1`!$1`!$`\! M$`\!$`\!$`\!#PX!#PX!#PX!#@T!#@T!#@T!#0P!#0P!#0P!#`P`#`L`#`L` M"PL`"PH`"PH`"PH`"@H`"@D`"@D`"0D`"0@`"0@`"`@`"`<`"`<`!P<`!P<` M!P8`!@8`!@8`!@4`!04`!04`!04`!00`!`0`!`0`!`,``P,``P,``P(``@(` M`@(``@(``0$``0$``0$````````````````````````````````````````` M``````````````````````````````````````````````````````````!G M80=G8`=G8`=F8`=F8`=F7P=E7P=E7P=E7@=D7@=D7@=D70=C70=C70=C70=C M7`=B7`=B7`=B6P=A6P=A6P=A6P=@6@=@6@=@6@=?60=?60=?60=>6`=>6`=> M6`=>6`==5P==5P==5P=<5@=<5@=<5@9;5@9;509;509:509:5`9:5`995`99 M4P994P984P984P984@984@974@9740974096409640964`954`954`953P94 M3P943P943@933@933@933@933092309230923`913`913`913`902P902P90 M2P9/2@9/2@9/2@9.205.205.205-205-2`5-2`5-2`5,1P5,1P5,1P5+1@5+ M1@5+1@5*1@5*105*105)105)1`5)1`5(1`5(1`5(0P5(0P5'0P5'0@5'0@5& M0@5&005&005%005%005%0`5$0`5$0`5$/P5#/P5#/P5#/P5"/@5"/@5"/@5" M/05!/01!/01!/`1`/`1`/`1`/`0_.P0_.P0_.P0^.@0^.@0^.@0].@0].00] M.00].00\.`0\.`0\.`0[-P0[-P0[-P0Z-P0Z-@0Z-@0Y-@0Y-00Y-00X-00X M-00X-`0W-`0W-`0W,P0W,P0V,P0V,@0V,@0U,@0U,@0U,00T,00T,0,T,`,S M,`,S,`,S,`,R+P,R+P,R+P,R+@,Q+@,Q+@,Q+0,P+0,P+0,P+0,O+`,O+`,O M+`,N*P,N*P,N*P,M*P,M*@,M*@,L*@,L*0,L*0,L*0,K*`,K*`,K*`,J*`,J M)P,J)P,I)P,I)@,I)@,H)@,H)@,H)0,G)0,G)0,G)`(G)`(F)`(F(P(F(P(E M(P(E(P(E(@(D(@(D(@(D(0(C(0(C(0(C(0(B(`(B(`(B(`(A'P(A'P(A'P(A M'@(@'@(@'@(@'@(?'0(?'0(?'0(>'`(>'`(>'`(='`(=&P(=&P(<&P(<&@(< M&@(<&@(;&0(;&0(;&0(:&0(:&`(:&`$9&`$9%P$9%P$8%P$8%P$8%@$7%@$7 M%@$7%0$6%0$6%0$6%`$6%`$5%`$5%`$5$P$4$P$4$P$4$@$3$@$3$@$3$@$2 M$0$2$0$2$0$1$`$1$`$1$`$1#P$0#P$0#P$0#P$/#@$/#@$/#@$.#0$.#0$. M#0$-#0$-#`$-#`$,#``,"P`,"P`+"P`+"@`+"@`+"@`*"@`*"0`*"0`)"0`) M"``)"``("``("``(!P`'!P`'!P`'!@`&!@`&!@`&!0`&!0`%!0`%!0`%!``$ M!``$!``$`P`#`P`#`P`#`@`"`@`"`@`"`@`!`0`!`0`!`0`````````````` M```````````````````````````````````````````````````````````` M`````````````````````&AA!V=A!V=@!V=@!V9@!V9@!V9?!V5?!V5?!V5> M!V1>!V1>!V1=!V1=!V-=!V-=!V-<!V)<!V)<!V);!V%;!V%;!V%;!V!:!V!: M!V!:!U]9!U]9!U]9!U]8!UY8!UY8!UY8!UU7!UU7!UU7!UQ6!UQ6!UQ6!UM6 M!EM5!EM5!EI5!EI4!EI4!EE4!EE3!EE3!EE3!EA3!EA2!EA2!E=2!E=1!E=1 M!E91!E91!E90!E50!E50!E5/!E1/!E1/!E1.!E1.!E-.!E-.!E--!E)-!E)- M!E),!E%,!E%,!E%,!E!+!E!+!E!+!D]*!D]*!D]*!DY)!4Y)!4Y)!4Y)!4U( M!4U(!4U(!4Q'!4Q'!4Q'!4M'!4M&!4M&!4I&!4I%!4I%!4E%!4E$!4E$!4E$ M!4A$!4A#!4A#!4=#!4="!4="!49"!49"!49!!45!!45!!45`!41`!41`!40_ M!4,_!4,_!4,_!4,^!4(^!4(^!4(]!4$]!$$]!$$]!$`\!$`\!$`\!#\[!#\[ M!#\[!#XZ!#XZ!#XZ!#XZ!#TY!#TY!#TY!#PX!#PX!#PX!#LX!#LW!#LW!#HW M!#HV!#HV!#DV!#DU!#DU!#@U!#@U!#@T!#@T!#<T!#<S!#<S!#8S!#8S!#8R M!#4R!#4R!#4Q!#0Q!#0Q`S0P`S,P`S,P`S,P`S,O`S(O`S(O`S(N`S$N`S$N M`S$N`S`M`S`M`S`M`R\L`R\L`R\L`RXK`RXK`RXK`RTK`RTJ`RTJ`RTJ`RPI M`RPI`RPI`RLI`RLH`RLH`RHH`RHG`RHG`RDG`RDF`RDF`R@F`R@F`R@E`R@E M`R<E`R<D`B<D`B8D`B8D`B8C`B4C`B4C`B4B`B0B`B0B`B0A`B,A`B,A`B,A M`B(@`B(@`B(@`B(?`B$?`B$?`B$?`B`>`B`>`B`>`A\=`A\=`A\=`AX<`AX< M`AX<`AT<`AT;`AT;`AT;`AP:`AP:`AP:`AL9`AL9`AL9`AH9`AH8`AH8`1D8 M`1D7`1D7`1@7`1@7`1@6`1<6`1<6`1<5`1<5`185`184`184`144`144`143 M`103`103`102`1,2`1,2`1,2`1(1`1(1`1(1`1(0`1$0`1$0`1$/`1`/`1`/ M`1`/`0\.`0\.`0\.`0X-`0X-`0X-`0T-`0T,`0T,`0P,``P+``P+``P+``L* M``L*``L*``H*``H)``H)``D)``D(``D(``@(``@(``@'``<'``<'``<&``<& M``8&``8%``8%``4%``4%``4$``0$``0$``0#``,#``,#``,#``("``("``(" M``$!``$!``$!``$````````````````````````````````````````````` M````````````````````````````````````````````:&$':&$'9V$'9V`' M9V`'9F`'9F`'9E\'95\'95\'95X'95X'9%X'9%X'9%T'8UT'8UT'8UP'8EP' M8EP'8EL'85L'85L'85L'8%H'8%H'8%H'7UD'7UD'7UD'7UD'7E@'7E@'7E@' M75<'75<'75<'7%8'7%8'7%8'6U8&6U4&6U4&6E4&6E0&6E0&6E0&650&65,& M65,&6%,&6%(&6%(&5U(&5U$&5U$&5E$&5E$&5E`&55`&55`&54\&5$\&5$\& M5$\&5$X&4TX&4TX&4TT&4DT&4DT&4DP&44P&44P&44P&4$L&4$L&4$L&3TH& M3TH&3TH&3TH&3DD%3DD%3DD%34@%34@%34@%3$<%3$<%3$<%2T<%2T8%2T8% M2D8%2D4%2D4%244%244%240%240%2$0%2$,%2$,%1T,%1T(%1T(%1D(%1D(% M1D$%14$%14$%14`%1$`%1$`%1$`%1#\%0S\%0S\%0SX%0CX%0CX%0CT%03T$ M03T$03T$0#P$0#P$0#P$/SL$/SL$/SL$/CL$/CH$/CH$/CH$/3D$/3D$/3D$ M/#@$/#@$/#@$.S@$.S<$.S<$.C<$.C8$.C8$.38$.38$.34$.34$.#4$.#0$ M.#0$-S0$-S,$-S,$-C,$-C,$-C($-3($-3($-3$$-#$$-#$#-#`#,S`#,S`# M,S`#,R\#,B\#,B\#,BX#,2X#,2X#,2X#,"T#,"T#,"T#+RP#+RP#+RP#+BL# M+BL#+BL#+BL#+2H#+2H#+2H#+"D#+"D#+"D#*RD#*R@#*R@#*B@#*B<#*B<# M*2<#*28#*28#*"8#*"8#*"4#*"4#)R4#)R0")R0")B0")B0")B,")2,")2," M)2(")"(")"(")"$"(R$"(R$"(R$"(R`"(B`"(B`"(A\"(1\"(1\"(1\"(!X" M(!X"(!X"'QT"'QT"'QT"'AP"'AP"'AP"'1P"'1L"'1L"'1L"'!H"'!H"'!H" M&QH"&QD"&QD"&AD"&A@"&A@!&1@!&1<!&1<!&!<!&!<!&!8!&!8!%Q8!%Q4! M%Q4!%A4!%A4!%A0!%10!%10!%1,!%!,!%!,!%!(!$Q(!$Q(!$Q(!$A$!$A$! M$A$!$A`!$1`!$1`!$1`!$`\!$`\!$`\!#PX!#PX!#PX!#@T!#@T!#@T!#0T! M#0P!#0P!#0P`#`L`#`L`#`L`"PL`"PH`"PH`"@H`"@D`"@D`"0D`"0@`"0@` M"`@`"`@`"`<`!P<`!P<`!P8`!P8`!@8`!@8`!@4`!04`!04`!00`!`0`!`0` M!`,``P,``P,``P,``@(``@(``@(``@$``0$``0$``0$````````````````` M```````````````````````````````````````````````````````````` M``````!H8@=H80=H80=G80=G80=G8`=F8`=F8`=F7P=F7P=E7P=E7@=E7@=D M7@=D7@=D70=C70=C70=C7`=B7`=B7`=B7`=A6P=A6P=A6P=@6@=@6@=@6@=@ M60=?60=?60=?60=>6`=>6`=>6`==5P==5P==5P=<5P=<5@=<5@=;5@9;509; M509;509:5`9:5`9:5`995`994P994P984P984@984@974@974@9740964096 M40964`954`954`953P953P943P943P943@933@933@933092309230923091 M3`913`913`902P902P902P902@9/2@9/2@9/2@9.205.205.205-2`5-2`5- M2`5,1P5,1P5,1P5+1P5+1@5+1@5*1@5*105*105*105)105)1`5)1`5(1`5( M0P5(0P5'0P5'0@5'0@5&0@5&0@5&005%005%005%0`5%0`5$0`5$0`5$/P5# M/P5#/P5#/@5"/@5"/@5"/05!/05!/01!/01`/`1`/`1`/`0_.P0_.P0_.P0_ M.P0^.@0^.@0^.@0].00].00].00\.`0\.`0\.`0[.`0[-P0[-P0Z-P0Z-@0Z M-@0Z-@0Y-@0Y-00Y-00X-00X-`0X-`0W-`0W,P0W,P0V,P0V,P0V,@0U,@0U M,@0U,00T,00T,0,T,0,T,`,S,`,S,`,S+P,R+P,R+P,R+@,Q+@,Q+@,Q+@,P M+0,P+0,P+0,O+`,O+`,O+`,O+`,N*P,N*P,N*P,M*@,M*@,M*@,L*0,L*0,L M*0,K*0,K*`,K*`,J*`,J)P,J)P,I)P,I)P,I)@,I)@,H)@,H)0,H)0,G)0,G M)`(G)`(F)`(F)`(F(P(E(P(E(P(E(@(D(@(D(@(D(@(D(0(C(0(C(0(C(`(B M(`(B(`(B'P(A'P(A'P(A'P(@'@(@'@(@'@(?'0(?'0(?'0(>'0(>'`(>'`(> M'`(=&P(=&P(=&P(<&@(<&@(<&@(;&@(;&0(;&0(:&0(:&`(:&`$9&`$9&`$9 M%P$9%P$8%P$8%@$8%@$7%@$7%0$7%0$6%0$6%0$6%`$5%`$5%`$5$P$4$P$4 M$P$4$P$3$@$3$@$3$@$3$0$2$0$2$0$2$`$1$`$1$`$1$`$0#P$0#P$0#P$/ M#@$/#@$/#@$.#@$.#0$.#0$.#0$-#`$-#`$-#``,"P`,"P`,"P`+"P`+"@`+ M"@`*"@`*"0`*"0`)"0`)"0`)"``("``("``(!P`(!P`'!P`'!@`'!@`&!@`& M!@`&!0`%!0`%!0`%!``$!``$!``$!``#`P`#`P`#`P`#`@`"`@`"`@`"`0`! M`0`!`0`!`0`````````````````````````````````````````````````` M`````````````````````````````&EB!VAB!VAA!VAA!V=A!V=A!V=@!V9@ M!V9@!V9?!V9?!V5?!V5?!V5>!V1>!V1>!V1=!V-=!V-=!V-<!V)<!V)<!V)< M!V%;!V%;!V%;!V%:!V!:!V!:!V!9!U]9!U]9!U]9!UY8!UY8!UY8!UU7!UU7 M!UU7!UQ7!UQ6!UQ6!UM6!EM5!EM5!EM5!EI4!EI4!EI4!EE4!EE3!EE3!EA3 M!EA2!EA2!E=2!E=2!E=1!E91!E91!E90!E90!E50!E5/!E5/!E1/!E1/!E1. M!E-.!E-.!E--!E)-!E)-!E)-!E%,!E%,!E%,!E!+!E!+!E!+!E!*!D]*!D]* M!D]*!DY)!4Y)!4Y)!4U(!4U(!4U(!4Q(!4Q'!4Q'!4M'!4M&!4M&!4M&!4I% M!4I%!4I%!4E%!4E$!4E$!4A$!4A#!4A#!4=#!4=#!4="!49"!49"!49!!45! M!45!!45`!45`!41`!41`!40_!4,_!4,_!4,^!4(^!4(^!4(^!4$]!4$]!$$] M!$`\!$`\!$`\!$`[!#\[!#\[!#\[!#XZ!#XZ!#XZ!#TY!#TY!#TY!#PY!#PX M!#PX!#LX!#LW!#LW!#HW!#HV!#HV!#HV!#DV!#DU!#DU!#@U!#@T!#@T!#<T M!#<T!#<S!#8S!#8S!#8R!#4R!#4R!#4Q!#4Q!#0Q!#0Q`S0P`S,P`S,P`S,O M`S(O`S(O`S(O`S$N`S$N`S$N`S`M`S`M`S`M`R\L`R\L`R\L`R\L`RXK`RXK M`RXK`RTJ`RTJ`RTJ`RPJ`RPI`RPI`RLI`RLH`RLH`RHH`RHG`RHG`RHG`RDG M`RDF`RDF`R@F`R@E`R@E`R<E`R<E`R<D`B8D`B8D`B8C`B4C`B4C`B4B`B0B M`B0B`B0B`B0A`B,A`B,A`B,@`B(@`B(@`B(@`B$?`B$?`B$?`B`>`B`>`B`> M`A\=`A\=`A\=`A\=`AX<`AX<`AX<`AT;`AT;`AT;`AP;`AP:`AP:`AL:`AL9 M`AL9`AH9`AH8`AH8`1D8`1D8`1D7`1D7`1@7`1@6`1@6`1<6`1<5`1<5`185 M`185`184`144`144`143`103`103`103`102`1,2`1,2`1,1`1(1`1(1`1(0 M`1$0`1$0`1$0`1`/`1`/`1`/`0\.`0\.`0\.`0X.`0X-`0X-`0X-`0T,`0T, M`0T,``P+``P+``P+``L+``L*``L*``H*``H)``H)``D)``D)``D(``D(``@( M``@'``@'``<'``<&``<&``8&``8&``8%``4%``4%``4$``0$``0$``0$``,# M``,#``,#``,"``("``("``(!``$!``$!``$!```````````````````````` M````````````````````````````````````````````````````:6((:6(' M:&(':&$':&$'9V$'9V$'9V`'9V`'9F`'9E\'9E\'95\'95\'95X'9%X'9%X' M9%T'8UT'8UT'8UP'8EP'8EP'8EP'8EL'85L'85L'85H'8%H'8%H'8%H'7UD' M7UD'7UD'7E@'7E@'7E@'75<'75<'75<'7%<'7%8'7%8'7%8&6U4&6U4&6U4& M6E4&6E0&6E0&650&65,&65,&6%,&6%(&6%(&5U(&5U(&5U$&5U$&5E$&5E`& M5E`&55`&55`&54\&5$\&5$\&5$X&4TX&4TX&4TT&4DT&4DT&4DT&44P&44P& M44P&44L&4$L&4$L&4$L&3TH&3TH&3TH&3DD%3DD%3DD%34@%34@%34@%3$@% M3$<%3$<%3$<%2T8%2T8%2T8%2D8%2D4%2D4%244%240%240%2$0%2$,%2$,% M1T,%1T,%1T(%1D(%1D(%1D$%1D$%14$%14$%14`%1$`%1$`%1#\%0S\%0S\% M0SX%0CX%0CX%0CX%03T%03T$03T$03P$0#P$0#P$0#P$/SL$/SL$/SL$/CH$ M/CH$/CH$/3D$/3D$/3D$/#D$/#@$/#@$.S@$.S<$.S<$.S<$.C<$.C8$.C8$ M.38$.34$.34$.#4$.#0$.#0$-S0$-S0$-S,$-C,$-C,$-C($-C($-3($-3($ M-3$$-#$$-#$#-#`#,S`#,S`#,R\#,B\#,B\#,B\#,2X#,2X#,2X#,"T#,"T# M,"T#,"P#+RP#+RP#+RP#+BL#+BL#+BL#+2H#+2H#+2H#+"H#+"D#+"D#*RD# M*R@#*R@#*R@#*B<#*B<#*B<#*2<#*28#*28#*"8#*"4#*"4#)R4#)R4#)R0" M)B0")B0")B,")2,")2,")2(")2(")"(")"(")"$"(R$"(R$"(R`"(B`"(B`" M(B`"(1\"(1\"(1\"(!X"(!X"(!X"(!T"'QT"'QT"'QT"'AP"'AP"'AP"'1L" M'1L"'1L"'!L"'!H"'!H"&QH"&QD"&QD"&AD"&A@"&A@"&A@!&1@!&1<!&1<! M&!<!&!8!&!8!%Q8!%Q8!%Q4!%A4!%A4!%A0!%10!%10!%1,!%1,!%!,!%!,! M%!(!$Q(!$Q(!$Q$!$A$!$A$!$A$!$1`!$1`!$1`!$`\!$`\!$`\!#PX!#PX! M#PX!#PX!#@T!#@T!#@T!#0P!#0P!#0P`#`P`#`L`#`L`"PL`"PH`"PH`"@H` M"@D`"@D`"@D`"0D`"0@`"0@`"`@`"`<`"`<`!P<`!P<`!P8`!@8`!@8`!@4` M!04`!04`!00`!`0`!`0`!`0`!`,``P,``P,``P(``@(``@(``@(``0$``0$` M`0$````````````````````````````````````````````````````````` M``````````````!I8PAI8@AI8@=H8@=H8@=H80=H80=G80=G8`=G8`=F8`=F M7P=F7P=E7P=E7P=E7@=D7@=D7@=D70=C70=C70=C70=B7`=B7`=B7`=B6P=A M6P=A6P=A6@=@6@=@6@=@6@=?60=?60=?60=>6`=>6`=>6`==6`==5P==5P== M5P=<5@=<5@=<5@9;509;509;509:509:5`9:5`995`994P994P984P984P98 M4@974@974@974097409640964`964`954`954`953P943P943P943@933@93 M3@933@923092309230923`913`913`912P902P902P902P9/2@9/2@9/2@9. M205.205.205-205-2`5-2`5,2`5,1P5,1P5,1P5+1@5+1@5+1@5*1@5*105* M105)105)1`5)1`5(1`5(0P5(0P5'0P5'0P5'0@5'0@5&0@5&005&005%005% M005%0`5$0`5$0`5$/P5#/P5#/P5#/@5"/@5"/@5"/@5!/05!/01!/01!/`1` M/`1`/`1`/`0_.P0_.P0_.P0^.@0^.@0^.@0].00].00].00\.00\.`0\.`0\ M.`0[-P0[-P0[-P0Z-P0Z-@0Z-@0Y-@0Y-00Y-00X-00X-`0X-`0W-`0W-`0W M,P0V,P0V,P0V,@0V,@0U,@0U,@0U,00T,00T,0,T,`,S,`,S,`,S+P,R+P,R M+P,R+P,Q+@,Q+@,Q+@,Q+0,P+0,P+0,P+0,O+`,O+`,O+`,N*P,N*P,N*P,M M*@,M*@,M*@,L*@,L*0,L*0,K*0,K*`,K*`,K*`,J*`,J)P,J)P,I)P,I)@,I M)@,H)@,H)0,H)0,G)0,G)0,G)`(F)`(F)`(F(P(F(P(E(P(E(P(E(@(D(@(D M(@(D(0(C(0(C(0(C(`(B(`(B(`(B(`(A'P(A'P(A'P(@'@(@'@(@'@(@'@(? M'0(?'0(?'0(>'`(>'`(>'`(=&P(=&P(=&P(<&P(<&@(<&@(;&@(;&0(;&0(; M&0(:&0(:&`(:&`$9&`$9%P$9%P$8%P$8%@$8%@$7%@$7%@$7%0$6%0$6%0$6 M%`$5%`$5%`$5%`$5$P$4$P$4$P$4$@$3$@$3$@$3$0$2$0$2$0$2$0$1$`$1 M$`$1$`$0#P$0#P$0#P$0#P$/#@$/#@$/#@$.#0$.#0$.#0$-#`$-#`$-#`$, M#``,"P`,"P`+"P`+"@`+"@`*"@`*"@`*"0`*"0`)"0`)"``)"``("``(!P`( M!P`'!P`'!P`'!@`&!@`&!@`&!0`%!0`%!0`%!0`%!``$!``$!``$`P`#`P`# M`P`#`@`"`@`"`@`"`@`!`0`!`0`!`0`````````````````````````````` M`````````````````````````````````````&IC"&EC"&EB"&EB!VEB!VAB M!VAA!VAA!V=A!V=@!V=@!V9@!V9@!V9?!V5?!V5?!V5>!V1>!V1>!V1=!V-= M!V-=!V-=!V-<!V)<!V)<!V);!V%;!V%;!V%;!V!:!V!:!V!:!U]9!U]9!U]9 M!UY8!UY8!UY8!UY8!UU7!UU7!UU7!UQ6!UQ6!UQ6!EM5!EM5!EM5!EI5!EI4 M!EI4!EE4!EE3!EE3!EA3!EA3!EA2!EA2!E=2!E=1!E=1!E91!E90!E90!E50 M!E50!E5/!E1/!E1/!E1.!E-.!E-.!E-.!E--!E)-!E)-!E),!E%,!E%,!E%+ M!E!+!E!+!E!+!D]*!D]*!D]*!DY)!4Y)!4Y)!4U)!4U(!4U(!4U(!4Q'!4Q' M!4Q'!4M&!4M&!4M&!4I&!4I%!4I%!4E%!4E$!4E$!4A$!4A$!4A#!4A#!4=# M!4="!4="!49"!49!!49!!45!!45!!45`!41`!41`!40_!4,_!4,_!4,_!4(^ M!4(^!4(^!4(]!4$]!$$]!$$\!$`\!$`\!$`\!#\[!#\[!#\[!#XZ!#XZ!#XZ M!#TZ!#TY!#TY!#TY!#PX!#PX!#PX!#LW!#LW!#LW!#HW!#HV!#HV!#DV!#DU M!#DU!#@U!#@U!#@T!#<T!#<T!#<S!#<S!#8S!#8R!#8R!#4R!#4R!#4Q!#0Q M!#0Q`S0P`S,P`S,P`S,P`S(O`S(O`S(O`S(N`S$N`S$N`S$M`S`M`S`M`S`M M`R\L`R\L`R\L`RXK`RXK`RXK`RTK`RTJ`RTJ`RPJ`RPI`RPI`RPI`RLH`RLH M`RLH`RHH`RHG`RHG`RDG`RDF`RDF`R@F`R@F`R@E`R<E`R<E`R<D`B<D`B8D M`B8C`B8C`B4C`B4C`B4B`B0B`B0B`B0A`B,A`B,A`B,A`B(@`B(@`B(@`B$? M`B$?`B$?`B$>`B`>`B`>`B`>`A\=`A\=`A\=`AX<`AX<`AX<`AT<`AT;`AT; M`AP;`AP:`AP:`AP:`AL9`AL9`AL9`AH9`AH8`AH8`1D8`1D7`1D7`1@7`1@7 M`1@6`1<6`1<6`1<5`185`185`184`184`144`144`143`103`103`102`1,2 M`1,2`1,1`1(1`1(1`1(1`1$0`1$0`1$0`1$/`1`/`1`/`1`/`0\.`0\.`0\. M`0X-`0X-`0X-`0T,`0T,`0T,`0P,``P+``P+``L+``L*``L*``L*``H*``H) M``H)``D)``D(``D(``@(``@'``@'``<'``<'``<&``8&``8&``8%``8%``4% M``4%``4$``0$``0$``0#``,#``,#``,"``("``("``("``$!``$!``$!```` M```````````````````````````````````````````````````````````` M:F,(:F,(:6,(:6((:6((:6(':&(':&$':&$'9V$'9V`'9V`'9F`'9F`'9E\' M95\'95\'95X'9%X'9%X'9%T'9%T'8UT'8UT'8UP'8EP'8EP'8EL'85L'85L' M85L'8%H'8%H'8%H'7UD'7UD'7UD'7E@'7E@'7E@'7E@'75<'75<'75<'7%8' M7%8'7%8&6U8&6U4&6U4&6E4&6E0&6E0&650&65,&65,&65,&6%,&6%(&6%(& M5U(&5U$&5U$&5E$&5E$&5E`&55`&55`&54\&5$\&5$\&5$X&4TX&4TX&4TX& M4TT&4DT&4DT&4DP&44P&44P&44P&4$L&4$L&4$L&3TH&3TH&3TH&3DD%3DD% M3DD%3DD%34@%34@%34@%3$<%3$<%3$<%2T<%2T8%2T8%2D8%2D4%2D4%244% M240%240%2$0%2$0%2$,%2$,%1T,%1T(%1T(%1D(%1D(%1D$%14$%14$%14`% M1$`%1$`%1#\%0S\%0S\%0S\%0SX%0CX%0CX%0CT%03T$03T$03T$0#P$0#P$ M0#P$/SL$/SL$/SL$/CH$/CH$/CH$/3H$/3D$/3D$/3D$/#@$/#@$/#@$.S@$ M.S<$.S<$.C<$.C8$.C8$.38$.34$.34$.#4$.#4$.#0$.#0$-S0$-S,$-S,$ M-C,$-C,$-C($-3($-3($-3$$-#$$-#$#-#`#,S`#,S`#,S`#,B\#,B\#,B\# M,BX#,2X#,2X#,2X#,"T#,"T#,"T#+RP#+RP#+RP#+BL#+BL#+BL#+2L#+2H# M+2H#+2H#+"D#+"D#+"D#*R@#*R@#*R@#*B@#*B<#*B<#*2<#*28#*28#*"8# M*"8#*"4#)R4#)R4#)R0")R0")B0")B,")B,")2,")2,")2(")"(")"(")"$" M(R$"(R$"(R$"(B`"(B`"(B`"(A\"(1\"(1\"(1X"(!X"(!X"(!X"'QT"'QT" M'QT"'AP"'AP"'AP"'1P"'1L"'1L"'!L"'!H"'!H"'!H"&QD"&QD"&QD"&AD" M&A@"&A@!&1@!&1<!&1<!&!<!&!<!&!8!%Q8!%Q8!%Q4!%Q4!%A4!%A0!%A0! M%10!%10!%1,!%!,!%!,!%!(!$Q(!$Q(!$Q(!$A$!$A$!$A$!$1`!$1`!$1`! M$0\!$`\!$`\!$`\!#PX!#PX!#PX!#@T!#@T!#@T!#0T!#0P!#0P!#`P`#`L` M#`L`#`L`"PH`"PH`"PH`"@H`"@D`"@D`"0D`"0@`"0@`"`@`"`@`"`<`!P<` M!P<`!P8`!@8`!@8`!@4`!@4`!04`!04`!00`!`0`!`0`!`,``P,``P,``P,` M`@(``@(``@(``0$``0$``0$``0`````````````````````````````````` M``````````````````````!J9`AJ8PAJ8PAJ8PAI8PAI8@AI8@=H8@=H80=H M80=G80=G8`=G8`=F8`=F8`=F7P=E7P=E7P=E7@=E7@=D7@=D7@=D70=C70=C M70=C7`=B7`=B7`=B6P=A6P=A6P=A6P=@6@=@6@=@6@=?60=?60=?60=?60=> M6`=>6`=>6`==5P==5P==5P=<5@=<5@=<5@=;5@9;509;509:509:5`9:5`9: M5`995`994P994P984P984@984@974@9740974096409640964`954`954`95 M3P943P943P943P943@933@933@933092309230923`913`913`913`902P90 M2P902P9/2@9/2@9/2@9/2@9.205.205.205-2`5-2`5-2`5,1P5,1P5,1P5+ M1P5+1@5+1@5*1@5*105*105)105)105)1`5)1`5(1`5(0P5(0P5'0P5'0@5' M0@5&0@5&0@5&005%005%005%0`5$0`5$0`5$/P5$/P5#/P5#/P5#/@5"/@5" M/@5"/05!/01!/01!/01`/`1`/`1`/`0_.P0_.P0_.P0^.@0^.@0^.@0^.@0] M.00].00].00\.`0\.`0\.`0[.`0[-P0[-P0Z-P0Z-@0Z-@0Y-@0Y-00Y-00Y M-00X-00X-`0X-`0W-`0W,P0W,P0V,P0V,P0V,@0U,@0U,@0U,00T,00T,0,T M,`,S,`,S,`,S,`,S+P,R+P,R+P,R+@,Q+@,Q+@,Q+@,P+0,P+0,P+0,O+`,O M+`,O+`,N*P,N*P,N*P,N*P,M*@,M*@,M*@,L*0,L*0,L*0,K*0,K*`,K*`,J M*`,J)P,J)P,I)P,I)@,I)@,H)@,H)@,H)0,H)0,G)0,G)`(G)`(F)`(F)`(F M(P(E(P(E(P(E(@(D(@(D(@(D(0(C(0(C(0(C(0(C(`(B(`(B(`(B'P(A'P(A M'P(A'P(@'@(@'@(@'@(?'0(?'0(?'0(>'`(>'`(>'`(='`(=&P(=&P(=&P(< M&@(<&@(<&@(;&@(;&0(;&0(:&0(:&`(:&`$9&`$9%P$9%P$8%P$8%P$8%@$8 M%@$7%@$7%0$7%0$6%0$6%0$6%`$5%`$5%`$5$P$4$P$4$P$4$@$3$@$3$@$3 M$@$2$0$2$0$2$0$2$`$1$`$1$`$1$`$0#P$0#P$0#P$/#@$/#@$/#@$.#0$. M#0$.#0$-#0$-#`$-#`$-#``,"P`,"P`,"P`+"P`+"@`+"@`*"@`*"0`*"0`) M"0`)"``)"``("``("``(!P`'!P`'!P`'!@`'!@`&!@`&!@`&!0`%!0`%!0`% M!``$!``$!``$`P`#`P`#`P`#`P`"`@`"`@`"`@`"`0`!`0`!`0`!`0`````` M`````````````````````````````````````````````&MD"&MD"&IC"&IC M"&IC"&EC"&EB"&EB!VAB!VAA!VAA!V=A!V=A!V=@!V9@!V9@!V9?!V5?!V5? M!V5>!V5>!V1>!V1>!V1=!V-=!V-=!V-<!V)<!V)<!V)<!V%;!V%;!V%;!V!: M!V!:!V!:!V!9!U]9!U]9!U]9!UY8!UY8!UY8!UU7!UU7!UU7!UQ6!UQ6!UQ6 M!UM6!EM5!EM5!EI5!EI4!EI4!EI4!EE4!EE3!EE3!EA3!EA2!EA2!E=2!E=1 M!E=1!E91!E91!E90!E50!E50!E5/!E5/!E1/!E1/!E1.!E-.!E-.!E--!E)- M!E)-!E),!E%,!E%,!E%,!E!+!E!+!E!+!D]*!D]*!D]*!D]*!DY)!4Y)!4Y) M!4U(!4U(!4U(!4Q'!4Q'!4Q'!4M'!4M&!4M&!4I&!4I%!4I%!4I%!4E%!4E$ M!4E$!4A$!4A#!4A#!4=#!4="!4="!49"!49"!49!!45!!45!!45`!41`!41` M!41`!40_!4,_!4,_!4,^!4(^!4(^!4(]!4$]!4$]!$$]!$`\!$`\!$`\!#\[ M!#\[!#\[!#\[!#XZ!#XZ!#XZ!#TY!#TY!#TY!#PX!#PX!#PX!#LX!#LW!#LW M!#HW!#HV!#HV!#DV!#DV!#DU!#DU!#@U!#@T!#@T!#<T!#<S!#<S!#8S!#8S M!#8R!#4R!#4R!#4Q!#0Q!#0Q`S0Q`S0P`S,P`S,P`S,O`S(O`S(O`S(N`S$N M`S$N`S$N`S`M`S`M`S`M`R\L`R\L`R\L`RXL`RXK`RXK`RXK`RTJ`RTJ`RTJ M`RPI`RPI`RPI`RLI`RLH`RLH`RHH`RHG`RHG`RDG`RDG`RDF`RDF`R@F`R@E M`R@E`R<E`R<D`B<D`B8D`B8D`B8C`B4C`B4C`B4B`B0B`B0B`B0B`B,A`B,A M`B,A`B,@`B(@`B(@`B(?`B$?`B$?`B$?`B`>`B`>`B`>`A\=`A\=`A\=`AX= M`AX<`AX<`AX<`AT;`AT;`AT;`AP:`AP:`AP:`AL:`AL9`AL9`AH9`AH8`AH8 M`1D8`1D8`1D7`1@7`1@7`1@6`1@6`1<6`1<5`1<5`185`185`184`144`144 M`143`103`103`103`1,2`1,2`1,2`1,1`1(1`1(1`1(0`1$0`1$0`1$0`1`/ M`1`/`1`/`0\.`0\.`0\.`0X-`0X-`0X-`0T-`0T,`0T,`0T,``P+``P+``P+ M``L+``L*``L*``H*``H)``H)``D)``D(``D(``@(``@(``@'``@'``<'``<& M``<&``8&``8&``8%``4%``4%``4$``0$``0$``0#``,#``,#``,#``,"``(" M``("``(!``$!``$!``$!```````````````````````````````````````` M````````:V0(:V0(:V0(:F,(:F,(:F,(:6,(:6((:6(':&(':&$':&$'9V$' M9V$'9V`'9F`'9F`'9E\'9E\'95\'95X'95X'9%X'9%X'9%T'8UT'8UT'8UP' M8EP'8EP'8EP'85L'85L'85L'85H'8%H'8%H'8%D'7UD'7UD'7UD'7E@'7E@' M7E@'75<'75<'75<'7%<'7%8'7%8'6U8&6U4&6U4&6U4&6E0&6E0&6E0&650& M65,&65,&6%,&6%(&6%(&5U(&5U(&5U$&5E$&5E$&5E`&5E`&55`&54\&54\& M5$\&5$\&5$X&4TX&4TX&4TT&4DT&4DT&4DT&44P&44P&44P&4$L&4$L&4$L& M4$H&3TH&3TH&3TH&3DD%3DD%3DD%34@%34@%34@%3$@%3$<%3$<%2T<%2T8% M2T8%2T8%2D4%2D4%2D4%244%240%240%2$0%2$,%2$,%1T,%1T,%1T(%1D(% M1D(%1D$%14$%14$%14`%14`%1$`%1$`%1#\%0S\%0S\%0SX%0CX%0CX%0CX% M03T%03T$03T$0#P$0#P$0#P$0#L$/SL$/SL$/SL$/CH$/CH$/CH$/3D$/3D$ M/3D$/#D$/#@$/#@$.S@$.S<$.S<$.C<$.C8$.C8$.C8$.38$.34$.34$.#4$ M.#0$.#0$-S0$-S0$-S,$-C,$-C,$-C($-3($-3($-3$$-3$$-#$$-#$#-#`# M,S`#,S`#,R\#,B\#,B\#,B\#,2X#,2X#,2X#,"T#,"T#,"T#+RP#+RP#+RP# M+RP#+BL#+BL#+BL#+2H#+2H#+2H#+"H#+"D#+"D#*RD#*R@#*R@#*B@#*B<# M*B<#*B<#*2<#*28#*28#*"8#*"4#*"4#)R4#)R0")R0")B0")B0")B,")2," M)2,")2(")"(")"(")"(")"$"(R$"(R$"(R`"(B`"(B`"(A\"(1\"(1\"(1\" M(!X"(!X"(!X"'QT"'QT"'QT"'QT"'AP"'AP"'AP"'1L"'1L"'1L"'!H"'!H" M'!H"&QH"&QD"&QD"&AD"&A@"&A@!&1@!&1@!&1<!&1<!&!<!&!8!&!8!%Q8! M%Q4!%Q4!%A4!%A4!%A0!%10!%10!%1,!%!,!%!,!%!,!%!(!$Q(!$Q(!$Q$! M$A$!$A$!$A`!$1`!$1`!$1`!$`\!$`\!$`\!#PX!#PX!#PX!#@X!#@T!#@T! M#@T!#0P!#0P!#0P`#`L`#`L`#`L`"PL`"PH`"PH`"@H`"@D`"@D`"0D`"0D` M"0@`"0@`"`@`"`<`"`<`!P<`!P8`!P8`!@8`!@8`!@4`!04`!04`!00`!`0` M!`0`!`0``P,``P,``P,``P(``@(``@(``@$``0$``0$``0$````````````` M``````````````````````````````!L90AK9`AK9`AK9`AJ9`AJ8PAJ8PAI M8PAI8@AI8@=H8@=H80=H80=G80=G80=G8`=G8`=F8`=F7P=F7P=E7P=E7P=E M7@=D7@=D7@=D70=C70=C70=C7`=B7`=B7`=B7`=A6P=A6P=A6P=A6@=@6@=@ M6@=@6@=?60=?60=?60=>6`=>6`=>6`==5P==5P==5P=<5P=<5@=<5@=<5@9; M509;509;509:509:5`9:5`995`994P994P984P984@984@974@974@974096 M409640964`964`954`954`953P943P943P943@933@933@93309230923092 M30913`913`913`912P902P902P902P9/2@9/2@9/2@9.205.205.205-2`5- M2`5-2`5,2`5,1P5,1P5+1P5+1@5+1@5+1@5*1@5*105*105)105)1`5)1`5( M1`5(0P5(0P5'0P5'0P5'0@5&0@5&0@5&005&005%005%005%0`5$0`5$0`5$ M/P5#/P5#/P5#/@5"/@5"/@5"/@5!/05!/01!/01`/`1`/`1`/`1`.P0_.P0_ M.P0_.P0^.@0^.@0^.@0].00].00].00\.00\.`0\.`0[.`0[-P0[-P0[-P0Z M-@0Z-@0Z-@0Y-@0Y-00Y-00X-00X-`0X-`0W-`0W-`0W,P0V,P0V,P0V,@0U M,@0U,@0U,00U,00T,00T,0,T,`,S,`,S,`,S+P,R+P,R+P,R+P,Q+@,Q+@,Q M+@,P+0,P+0,P+0,P+`,O+`,O+`,O+`,N*P,N*P,N*P,M*@,M*@,M*@,L*@,L M*0,L*0,K*0,K*`,K*`,J*`,J)P,J)P,J)P,I)P,I)@,I)@,H)@,H)0,H)0,G M)0,G)0,G)`(F)`(F)`(F(P(E(P(E(P(E(@(E(@(D(@(D(@(D(0(C(0(C(0(C M(`(B(`(B(`(B(`(A'P(A'P(A'P(@'@(@'@(@'@(?'0(?'0(?'0(?'0(>'`(> M'`(>'`(=&P(=&P(=&P(<&P(<&@(<&@(;&@(;&0(;&0(:&0(:&`(:&`(:&`$9 M&`$9%P$9%P$8%P$8%@$8%@$7%@$7%@$7%0$6%0$6%0$6%`$5%`$5%`$5$P$4 M$P$4$P$4$P$4$@$3$@$3$@$3$0$2$0$2$0$2$0$1$`$1$`$1$`$0#P$0#P$0 M#P$/#@$/#@$/#@$/#@$.#0$.#0$.#0$-#`$-#`$-#``,#``,"P`,"P`+"P`+ M"@`+"@`*"@`*"0`*"0`)"0`)"0`)"``)"``("``(!P`(!P`'!P`'!P`'!@`& M!@`&!@`&!0`%!0`%!0`%!``$!``$!``$!``$`P`#`P`#`P`#`@`"`@`"`@`" M`@`!`0`!`0`!`0```````````````````````````````````````&QE"&QE M"&MD"&MD"&MD"&ID"&IC"&IC"&EC"&EB"&EB!VAB!VAB!VAA!VAA!V=A!V=@ M!V=@!V9@!V9?!V9?!V5?!V5?!V5>!V1>!V1>!V1=!V-=!V-=!V-=!V)<!V)< M!V)<!V);!V%;!V%;!V%:!V!:!V!:!V!:!U]9!U]9!U]9!UY8!UY8!UY8!UU8 M!UU7!UU7!UU7!UQ6!UQ6!UQ6!EM5!EM5!EM5!EI5!EI4!EI4!EE4!EE3!EE3 M!EA3!EA2!EA2!E=2!E=2!E=1!E=1!E91!E90!E90!E50!E50!E5/!E1/!E1/ M!E1.!E-.!E-.!E--!E)-!E)-!E)-!E),!E%,!E%,!E%+!E!+!E!+!E!+!D]* M!D]*!D]*!DY)!4Y)!4Y)!4U(!4U(!4U(!4Q(!4Q'!4Q'!4Q'!4M&!4M&!4M& M!4I&!4I%!4I%!4E%!4E$!4E$!4A$!4A#!4A#!4=#!4=#!4="!4="!49"!49! M!49!!45!!45!!45`!41`!41`!40_!4,_!4,_!4,^!4(^!4(^!4(^!4$]!4$] M!$$]!$$\!$`\!$`\!$`\!#\[!#\[!#\[!#XZ!#XZ!#XZ!#TY!#TY!#TY!#PY M!#PX!#PX!#PX!#LW!#LW!#LW!#HW!#HV!#HV!#DV!#DU!#DU!#@U!#@T!#@T M!#<T!#<T!#<S!#8S!#8S!#8R!#8R!#4R!#4R!#4Q!#0Q!#0Q`S0P`S,P`S,P M`S,O`S(O`S(O`S(O`S$N`S$N`S$N`S$M`S`M`S`M`S`M`R\L`R\L`R\L`RXK M`RXK`RXK`RTJ`RTJ`RTJ`RPJ`RPI`RPI`RLI`RLH`RLH`RLH`RHH`RHG`RHG M`RDG`RDF`RDF`R@F`R@E`R@E`R<E`R<E`R<D`B8D`B8D`B8C`B8C`B4C`B4C M`B4B`B0B`B0B`B0A`B,A`B,A`B,@`B(@`B(@`B(@`B$?`B$?`B$?`B`>`B`> M`B`>`B`>`A\=`A\=`A\=`AX<`AX<`AX<`AT;`AT;`AT;`AP;`AP:`AP:`AL: M`AL9`AL9`AL9`AH9`AH8`AH8`1D8`1D7`1D7`1@7`1@6`1@6`1<6`1<6`1<5 M`185`185`184`144`144`144`143`103`103`102`1,2`1,2`1,1`1(1`1(1 M`1(1`1$0`1$0`1$0`1`/`1`/`1`/`1`/`0\.`0\.`0\.`0X-`0X-`0X-`0T, M`0T,`0T,`0P,``P+``P+``L+``L*``L*``H*``H)``H)``H)``D)``D(``D( M``@(``@'``@'``<'``<'``<&``8&``8&``8%``4%``4%``4$``4$``0$``0$ M``0#``,#``,#``,"``("``("``("``$!``$!``$!```````````````````` M````````````````;&4(;&4(;&4(:V0(:V0(:V0(:F0(:F,(:F,(:6,(:6(( M:6(':&(':&(':&$':&$'9V$'9V`'9V`'9F`'9E\'9E\'95\'95\'95X'9%X' M9%X'9%T'8UT'8UT'8UT'8UP'8EP'8EP'8EL'85L'85L'85H'8%H'8%H'8%H' M7UD'7UD'7UD'7E@'7E@'7E@'75@'75<'75<'75<'7%8'7%8'7%8&6U4&6U4& M6U4&6E4&6E0&6E0&650&65,&65,&6%,&6%,&6%(&6%(&5U(&5U$&5U$&5E$& M5E`&5E`&55`&55`&54\&5$\&5$\&5$X&4TX&4TX&4TX&4DT&4DT&4DT&4DP& M44P&44P&44L&4$L&4$L&4$L&3TH&3TH&3TH&3DD%3DD%3DD%34D%34@%34@% M34@%3$<%3$<%3$<%2T8%2T8%2T8%2D8%2D4%2D4%244%240%240%2$0%2$0% M2$,%1T,%1T,%1T(%1T(%1D(%1D$%1D$%14$%14$%14`%1$`%1$`%1#\%0S\% M0S\%0S\%0CX%0CX%0CX%0CT%03T$03T$03P$0#P$0#P$0#P$/SL$/SL$/SL$ M/CH$/CH$/CH$/3H$/3D$/3D$/#D$/#@$/#@$/#@$.S<$.S<$.S<$.C<$.C8$ M.C8$.38$.34$.34$.#4$.#4$.#0$-S0$-S0$-S,$-S,$-C,$-C($-C($-3($ M-3($-3$$-#$$-#$#-#`#,S`#,S`#,S`#,B\#,B\#,B\#,2X#,2X#,2X#,2T# M,"T#,"T#,"T#+RP#+RP#+RP#+BL#+BL#+BL#+2L#+2H#+2H#+"H#+"D#+"D# M+"D#*R@#*R@#*R@#*B@#*B<#*B<#*2<#*28#*28#*"8#*"8#*"4#)R4#)R4# M)R0")B0")B0")B,")B,")2,")2,")2(")"(")"(")"$"(R$"(R$"(R`"(B`" M(B`"(B`"(1\"(1\"(1\"(1X"(!X"(!X"(!X"'QT"'QT"'QT"'AP"'AP"'AP" M'1L"'1L"'1L"'!L"'!H"'!H"&QH"&QD"&QD"&QD"&AD"&A@"&A@!&1@!&1<! M&1<!&!<!&!8!&!8!%Q8!%Q8!%Q4!%A4!%A4!%A0!%A0!%10!%10!%1,!%!,! M%!,!%!(!$Q(!$Q(!$Q$!$A$!$A$!$A$!$1`!$1`!$1`!$`\!$`\!$`\!$`\! M#PX!#PX!#PX!#@T!#@T!#@T!#0P!#0P!#0P!#`P`#`L`#`L`"PL`"PH`"PH` M"PH`"@H`"@D`"@D`"0D`"0@`"0@`"`@`"`<`"`<`!P<`!P<`!P8`!@8`!@8` M!@4`!@4`!04`!04`!00`!`0`!`0`!`,``P,``P,``P(``@(``@(``@(``0$` M`0$``0$```````````````````````````````!M9@AL90AL90AL90AK90AK M9`AK9`AJ9`AJ8PAJ8PAI8PAI8@AI8@AI8@=H8@=H80=H80=G80=G8`=G8`=F M8`=F8`=F7P=E7P=E7P=E7@=D7@=D7@=D70=D70=C70=C70=C7`=B7`=B7`=B M6P=A6P=A6P=A6P=@6@=@6@=@6@=?60=?60=?60=>6`=>6`=>6`=>6`==5P== M5P==5P=<5@=<5@=<5@9;5@9;509;509:509:5`9:5`995`994P994P994P98 M4P984@984@974@9740974096409640964`954`954`953P943P943P943@93 M3@933@933@933092309230923`913`913`913`902P902P902P9/2@9/2@9/ M2@9.205.205.205.205-2`5-2`5-2`5,1P5,1P5,1P5+1P5+1@5+1@5*1@5* M105*105)105)1`5)1`5(1`5(1`5(0P5(0P5'0P5'0@5'0@5&0@5&0@5&005% M005%005%0`5$0`5$0`5$/P5#/P5#/P5#/P5#/@5"/@5"/@5"/05!/01!/01! M/01`/`1`/`1`/`0_.P0_.P0_.P0^.@0^.@0^.@0].@0].00].00].00\.`0\ M.`0\.`0[-P0[-P0[-P0Z-P0Z-@0Z-@0Y-@0Y-00Y-00X-00X-00X-`0X-`0W M-`0W,P0W,P0V,P0V,@0V,@0U,@0U,@0U,00T,00T,0,T,`,S,`,S,`,S,`,R M+P,R+P,R+P,R+@,Q+@,Q+@,Q+0,P+0,P+0,P+0,O+`,O+`,O+`,N*P,N*P,N M*P,M*P,M*@,M*@,M*@,L*0,L*0,L*0,K*`,K*`,K*`,J*`,J)P,J)P,I)P,I M)@,I)@,H)@,H)@,H)0,G)0,G)0,G)`(G)`(F)`(F(P(F(P(E(P(E(P(E(@(D M(@(D(@(D(0(C(0(C(0(C(0(B(`(B(`(B(`(B'P(A'P(A'P(A'@(@'@(@'@(@ M'@(?'0(?'0(?'0(>'`(>'`(>'`(='`(=&P(=&P(<&P(<&@(<&@(<&@(;&0(; M&0(;&0(:&0(:&`(:&`$9&`$9%P$9%P$8%P$8%P$8%@$7%@$7%@$7%0$7%0$6 M%0$6%`$6%`$5%`$5%`$5$P$4$P$4$P$4$@$3$@$3$@$3$@$2$0$2$0$2$0$1 M$`$1$`$1$`$1#P$0#P$0#P$0#P$/#@$/#@$/#@$.#0$.#0$.#0$-#0$-#`$- M#`$,#``,"P`,"P`,"P`+"@`+"@`+"@`*"@`*"0`*"0`)"0`)"``)"``("``( M"``(!P`'!P`'!P`'!@`&!@`&!@`&!0`&!0`%!0`%!0`%!``$!``$!``$`P`# M`P`#`P`#`P`"`@`"`@`"`@`!`0`!`0`!`0`!```````````````````````` M`&UF"&UF"&QE"&QE"&QE"&ME"&MD"&MD"&ID"&IC"&IC"&IC"&EC"&EB"&EB M!VAB!VAA!VAA!V=A!V=@!V=@!V9@!V9@!V9?!V5?!V5?!V5>!V1>!V1>!V1> M!V1=!V-=!V-=!V-<!V)<!V)<!V);!V%;!V%;!V%;!V!:!V!:!V!:!U]9!U]9 M!U]9!U]9!UY8!UY8!UY8!UU7!UU7!UU7!UQ6!UQ6!UQ6!UM6!EM5!EM5!EI5 M!EI4!EI4!EE4!EE4!EE3!EE3!EA3!EA2!EA2!E=2!E=1!E=1!E91!E91!E90 M!E50!E50!E5/!E1/!E1/!E1.!E1.!E-.!E-.!E--!E)-!E)-!E),!E%,!E%, M!E%,!E!+!E!+!E!+!D]*!D]*!D]*!DY)!4Y)!4Y)!4Y)!4U(!4U(!4U(!4Q' M!4Q'!4Q'!4M'!4M&!4M&!4I&!4I%!4I%!4E%!4E$!4E$!4E$!4A$!4A#!4A# M!4=#!4="!4="!49"!49"!49!!45!!45!!45`!41`!41`!40_!4,_!4,_!4,_ M!4,^!4(^!4(^!4(]!4$]!$$]!$$]!$`\!$`\!$`\!#\[!#\[!#\[!#XZ!#XZ M!#XZ!#XZ!#TY!#TY!#TY!#PX!#PX!#PX!#LX!#LW!#LW!#HW!#HV!#HV!#DV M!#DU!#DU!#@U!#@U!#@T!#@T!#<T!#<S!#<S!#8S!#8S!#8R!#4R!#4R!#4Q M!#0Q!#0Q`S0P`S,P`S,P`S,P`S,O`S(O`S(O`S(N`S$N`S$N`S$N`S`M`S`M M`S`M`R\L`R\L`R\L`RXK`RXK`RXK`RTK`RTJ`RTJ`RTJ`RPI`RPI`RPI`RLI M`RLH`RLH`RHH`RHG`RHG`RDG`RDF`RDF`R@F`R@F`R@E`R@E`R<E`R<D`B<D M`B8D`B8D`B8C`B4C`B4C`B4B`B0B`B0B`B0A`B,A`B,A`B,A`B(@`B(@`B(@ M`B(?`B$?`B$?`B$?`B`>`B`>`B`>`A\=`A\=`A\=`AX<`AX<`AX<`AT<`AT; M`AT;`AT;`AP:`AP:`AP:`AL:`AL9`AL9`AH9`AH8`AH8`1D8`1D7`1D7`1@7 M`1@7`1@6`1<6`1<6`1<5`1<5`185`185`184`144`144`143`103`103`102 M`1,2`1,2`1,2`1(1`1(1`1(1`1(0`1$0`1$0`1$0`1`/`1`/`1`/`0\.`0\. M`0\.`0X-`0X-`0X-`0T-`0T,`0T,`0T,``P+``P+``P+``L*``L*``L*``H* M``H)``H)``D)``D(``D(``@(``@(``@'``<'``<'``<&``<&``8&``8%``8% M``4%``4%``4$``0$``0$``0#``,#``,#``,#``("``("``("``(!``$!``$! M``$`````````````````````;68(;68(;68(;&8(;&4(;&4(:V4(:V0(:V0( M:V0(:F,(:F,(:F,(:6,(:6((:6(':&(':&$':&$'9V$'9V`'9V`'9F`'9F`' M9E\'95\'95\'95X'95X'9%X'9%X'9%T'8UT'8UT'8UP'8EP'8EP'8EL'85L' M85L'85L'8%H'8%H'8%H'8%D'7UD'7UD'7UD'7E@'7E@'7E@'75<'75<'75<' M7%8'7%8'7%8'6U8&6U4&6U4&6E4&6E0&6E0&6E0&650&65,&65,&6%,&6%(& M6%(&5U(&5U$&5U$&5E$&5E$&5E`&55`&55`&54\&54\&5$\&5$\&5$X&4TX& M4TX&4TT&4DT&4DT&4DP&44P&44P&44P&4$L&4$L&4$L&3TH&3TH&3TH&3TH& M3DD%3DD%3DD%34@%34@%34@%3$<%3$<%3$<%2T<%2T8%2T8%2D8%2D4%2D4% M2D4%244%240%240%2$0%2$,%2$,%1T,%1T(%1T(%1D(%1D(%1D$%14$%14$% M14`%1$`%1$`%1$`%1#\%0S\%0S\%0SX%0CX%0CX%0CT%03T%03T$03T$0#P$ M0#P$0#P$/SL$/SL$/SL$/SL$/CH$/CH$/CH$/3D$/3D$/3D$/#@$/#@$/#@$ M.S@$.S<$.S<$.C<$.C8$.C8$.38$.38$.34$.34$.#4$.#0$.#0$-S0$-S,$ M-S,$-C,$-C,$-C($-3($-3($-3$$-#$$-#$#-#$#-#`#,S`#,S`#,R\#,B\# M,B\#,BX#,2X#,2X#,2X#,"T#,"T#,"T#+RP#+RP#+RP#+BP#+BL#+BL#+BL# M+2H#+2H#+2H#+"D#+"D#+"D#*RD#*R@#*R@#*B@#*B<#*B<#*2<#*2<#*28# M*28#*"8#*"4#*"4#)R4#)R0")R0")B0")B0")B,")2,")2,")2(")"(")"(" M)"("(R$"(R$"(R$"(R`"(B`"(B`"(A\"(1\"(1\"(1\"(!X"(!X"(!X"'QT" M'QT"'QT"'AP"'AP"'AP"'AP"'1L"'1L"'1L"'!H"'!H"'!H"&QH"&QD"&QD" M&AD"&A@"&A@!&1@!&1<!&1<!&!<!&!<!&!8!&!8!%Q8!%Q4!%Q4!%A4!%A4! M%A0!%10!%10!%1,!%!,!%!,!%!(!$Q(!$Q(!$Q(!$Q$!$A$!$A$!$A`!$1`! M$1`!$1`!$`\!$`\!$`\!#PX!#PX!#PX!#@T!#@T!#@T!#0T!#0P!#0P!#0P` M#`L`#`L`#`L`"PL`"PH`"PH`"@H`"@D`"@D`"0D`"0@`"0@`"`@`"`@`"`<` M"`<`!P<`!P8`!P8`!@8`!@8`!@4`!04`!04`!00`!`0`!`0`!`,``P,``P,` M`P,``@(``@(``@(``@$``0$``0$``0$```````````````!N9PAM9@AM9@AM M9@AL9@AL90AL90AK90AK9`AK9`AK9`AJ8PAJ8PAJ8PAI8PAI8@AI8@=H8@=H M80=H80=G80=G80=G8`=F8`=F8`=F7P=F7P=E7P=E7@=E7@=D7@=D7@=D70=C M70=C70=C7`=B7`=B7`=B7`=A6P=A6P=A6P=@6@=@6@=@6@=@60=?60=?60=? M60=>6`=>6`=>6`==5P==5P==5P=<5P=<5@=<5@=;5@9;509;509;509:5`9: M5`9:5`995`994P994P984P984@984@974@974@974096409640964`954`95 M4`953P953P943P943P943@933@933@9330923092309230913`913`913`90 M2P902P902P902@9/2@9/2@9/2@9.205.205.205-2`5-2`5-2`5,2`5,1P5, M1P5+1P5+1@5+1@5*1@5*105*105*105)105)1`5)1`5(1`5(0P5(0P5'0P5' M0P5'0@5&0@5&0@5&005%005%005%0`5%0`5$0`5$0`5$/P5#/P5#/P5#/@5" M/@5"/@5"/@5!/05!/01!/01`/`1`/`1`/`0_.P0_.P0_.P0_.P0^.@0^.@0^ M.@0].00].00].00\.00\.`0\.`0[.`0[-P0[-P0Z-P0Z-@0Z-@0Z-@0Y-@0Y M-00Y-00X-00X-`0X-`0W-`0W,P0W,P0V,P0V,P0V,@0U,@0U,@0U,00T,00T M,00T,0,T,`,S,`,S,`,S+P,R+P,R+P,R+@,Q+@,Q+@,Q+@,P+0,P+0,P+0,O M+`,O+`,O+`,O+`,N*P,N*P,N*P,M*@,M*@,M*@,L*0,L*0,L*0,K*0,K*`,K M*`,J*`,J)P,J)P,I)P,I)P,I)@,I)@,H)@,H)0,H)0,G)0,G)`(G)`(F)`(F M)`(F(P(E(P(E(P(E(@(D(@(D(@(D(@(D(0(C(0(C(0(C(`(B(`(B(`(B'P(A M'P(A'P(A'P(@'@(@'@(@'@(?'0(?'0(?'0(>'0(>'`(>'`(>'`(=&P(=&P(= M&P(<&@(<&@(<&@(;&@(;&0(;&0(:&0(:&`(:&`$9&`$9&`$9%P$9%P$8%P$8 M%@$8%@$7%@$7%0$7%0$6%0$6%0$6%`$5%`$5%`$5$P$4$P$4$P$4$P$3$@$3 M$@$3$@$3$0$2$0$2$0$2$`$1$`$1$`$1$`$0#P$0#P$0#P$/#@$/#@$/#@$. M#@$.#0$.#0$.#0$-#`$-#`$-#``,"P`,"P`,"P`+"P`+"@`+"@`*"@`*"0`* M"0`)"0`)"0`)"``)"``("``(!P`(!P`'!P`'!@`'!@`&!@`&!@`&!0`%!0`% M!0`%!``$!``$!``$!``#`P`#`P`#`P`#`@`"`@`"`@`"`0`!`0`!`0`!`0`` M`````````&YG"&YG"&UF"&UF"&UF"&QF"&QE"&QE"&QE"&MD"&MD"&MD"&ID M"&IC"&IC"&EC"&EB"&EB!VAB!VAA!VAA!V=A!V=A!V=@!V=@!V9@!V9?!V9? M!V5?!V5?!V5>!V1>!V1>!V1=!V-=!V-=!V-<!V)<!V)<!V)<!V%;!V%;!V%; M!V%:!V!:!V!:!V!:!U]9!U]9!U]9!UY8!UY8!UY8!UU7!UU7!UU7!UQ7!UQ6 M!UQ6!UQ6!EM5!EM5!EM5!EI5!EI4!EI4!EE4!EE3!EE3!EA3!EA2!EA2!E=2 M!E=2!E=1!E91!E91!E90!E90!E50!E50!E5/!E1/!E1/!E1.!E-.!E-.!E-- M!E)-!E)-!E)-!E%,!E%,!E%,!E%+!E!+!E!+!E!*!D]*!D]*!D]*!DY)!4Y) M!4Y)!4U(!4U(!4U(!4Q(!4Q'!4Q'!4M'!4M&!4M&!4M&!4I%!4I%!4I%!4E% M!4E$!4E$!4A$!4A#!4A#!4=#!4=#!4="!49"!49"!49!!49!!45!!45`!45` M!41`!41`!40_!4,_!4,_!4,^!4(^!4(^!4(^!4$]!4$]!$$]!$`\!$`\!$`\ M!$`[!#\[!#\[!#\[!#XZ!#XZ!#XZ!#TY!#TY!#TY!#PY!#PX!#PX!#LX!#LW M!#LW!#LW!#HV!#HV!#HV!#DV!#DU!#DU!#@U!#@T!#@T!#<T!#<T!#<S!#8S M!#8S!#8R!#4R!#4R!#4Q!#4Q!#0Q!#0Q`S0P`S,P`S,P`S,O`S(O`S(O`S(O M`S$N`S$N`S$N`S`M`S`M`S`M`S`L`R\L`R\L`R\L`RXK`RXK`RXK`RTJ`RTJ M`RTJ`RPJ`RPI`RPI`RLI`RLH`RLH`RHH`RHG`RHG`RHG`RDG`RDF`RDF`R@F M`R@E`R@E`R<E`R<E`R<D`B8D`B8D`B8C`B4C`B4C`B4B`B4B`B0B`B0B`B0A M`B,A`B,A`B,@`B(@`B(@`B(@`B$?`B$?`B$?`B`>`B`>`B`>`A\=`A\=`A\= M`A\=`AX<`AX<`AX<`AT;`AT;`AT;`AP;`AP:`AP:`AL:`AL9`AL9`AH9`AH8 M`AH8`1H8`1D8`1D7`1D7`1@7`1@6`1@6`1<6`1<6`1<5`185`185`184`144 M`144`143`103`103`103`102`1,2`1,2`1,1`1(1`1(1`1(1`1$0`1$0`1$0 M`1`/`1`/`1`/`0\.`0\.`0\.`0\.`0X-`0X-`0X-`0T,`0T,`0T,``P,``P+ M``P+``L+``L*``L*``H*``H)``H)``D)``D)``D(``D(``@(``@'``@'``<' M``<&``<&``8&``8&``8%``4%``4%``4$``0$``0$``0$``0#``,#``,#``," M``("``("``(!``$!``$!``$!````````;F<(;F<(;F<(;6<(;68(;68(;68( M;&4(;&4(;&4(:V0(:V0(:V0(:F0(:F,(:F,(:6,(:6((:6(':&(':&$':&$' M9V$'9V$'9V`'9V`'9F`'9E\'9E\'95\'95\'95X'9%X'9%X'9%T'8UT'8UT' M8UP'8EP'8EP'8EP'8EL'85L'85L'85H'8%H'8%H'8%H'7UD'7UD'7UD'7E@' M7E@'7E@'75<'75<'75<'7%<'7%8'7%8'7%8&6U4&6U4&6U4&6E4&6E0&6E0& M650&65,&65,&6%,&6%(&6%(&5U(&5U(&5U$&5U$&5E$&5E`&5E`&55`&55`& M54\&5$\&5$\&5$X&4TX&4TX&4TT&4DT&4DT&4DT&44P&44P&44P&44L&4$L& M4$L&4$L&3TH&3TH&3TH&3DD%3DD%3DD%34@%34@%34@%3$@%3$<%3$<%3$<% M2T8%2T8%2T8%2D8%2D4%2D4%244%240%240%2$0%2$,%2$,%1T,%1T,%1T(% M1D(%1D(%1D$%1D$%14$%14$%14`%1$`%1$`%1#\%0S\%0S\%0SX%0CX%0CX% M0CX%03T%03T$03T$03P$0#P$0#P$0#P$/SL$/SL$/SL$/CH$/CH$/CH$/3D$ M/3D$/3D$/#D$/#@$/#@$.S@$.S<$.S<$.S<$.C<$.C8$.C8$.38$.34$.34$ M.#4$.#0$.#0$-S0$-S0$-S,$-C,$-C,$-C($-C($-3($-3($-3$$-#$$-#$# M-#`#,S`#,S`#,R\#,B\#,B\#,B\#,2X#,2X#,2X#,"T#,"T#,"T#,"T#+RP# M+RP#+RP#+BL#+BL#+BL#+2H#+2H#+2H#+"H#+"D#+"D#*RD#*R@#*R@#*R@# M*B@#*B<#*B<#*2<#*28#*28#*"8#*"4#*"4#)R4#)R4#)R0")B0")B0")B," M)2,")2,")2,")2(")"(")"(")"$"(R$"(R$"(R`"(B`"(B`"(B`"(1\"(1\" M(1\"(!X"(!X"(!X"(!X"'QT"'QT"'QT"'AP"'AP"'AP"'1L"'1L"'1L"'!L" M'!H"'!H"&QH"&QD"&QD"&AD"&A@"&A@"&A@!&1@!&1<!&1<!&!<!&!8!&!8! M%Q8!%Q8!%Q4!%A4!%A4!%A0!%10!%10!%1,!%1,!%!,!%!,!%!(!$Q(!$Q(! M$Q$!$A$!$A$!$A$!$1`!$1`!$1`!$`\!$`\!$`\!$`X!#PX!#PX!#PX!#@T! M#@T!#@T!#0P!#0P!#0P!#`P`#`L`#`L`"PL`"PH`"PH`"@H`"@D`"@D`"@D` M"0D`"0@`"0@`"`@`"`<`"`<`!P<`!P<`!P8`!@8`!@8`!@4`!04`!04`!00` M!00`!`0`!`0`!`,``P,``P,``P(``@(``@(``@(``0$``0$``0$```!O:`AN M9PAN9PAN9PAN9PAM9@AM9@AM9@AL90AL90AL90AK9`AK9`AK9`AJ9`AJ8PAJ M8PAI8PAI8@AI8@=H8@=H8@=H80=H80=G80=G8`=G8`=F8`=F7P=F7P=E7P=E M7P=E7@=D7@=D7@=D70=C70=C70=C70=C7`=B7`=B7`=B6P=A6P=A6P=A6@=@ M6@=@6@=@6@=?60=?60=?60=>6`=>6`=>6`==6`==5P==5P==5P=<5@=<5@=< M5@9;509;509;509:509:5`9:5`995`994P994P984P984P984@984@974@97 M4097409640964`964`954`954`953P943P943P943@933@933@933@923092 M309230923`913`913`912P902P902P902P9/2@9/2@9/2@9.205.205.205- M205-2`5-2`5-2`5,1P5,1P5,1P5+1@5+1@5+1@5*1@5*105*105)105)1`5) M1`5(1`5(1`5(0P5'0P5'0P5'0@5'0@5&0@5&005&005%005%005%0`5$0`5$ M0`5$/P5#/P5#/P5#/P5"/@5"/@5"/@5"/05!/01!/01!/`1`/`1`/`1`/`0_ M.P0_.P0_.P0^.@0^.@0^.@0].@0].00].00\.00\.`0\.`0\.`0[-P0[-P0[ M-P0Z-P0Z-@0Z-@0Y-@0Y-00Y-00X-00X-00X-`0W-`0W-`0W,P0W,P0V,P0V M,@0V,@0U,@0U,@0U,00T,00T,0,T,`,S,`,S,`,S+P,R+P,R+P,R+P,Q+@,Q M+@,Q+@,Q+0,P+0,P+0,P+0,O+`,O+`,O+`,N*P,N*P,N*P,M*@,M*@,M*@,L M*@,L*0,L*0,L*0,K*`,K*`,K*`,J*`,J)P,J)P,I)P,I)@,I)@,H)@,H)0,H M)0,G)0,G)0,G)`(F)`(F)`(F(P(F(P(E(P(E(P(E(@(D(@(D(@(D(0(C(0(C M(0(C(`(B(`(B(`(B(`(A'P(A'P(A'P(A'@(@'@(@'@(@'@(?'0(?'0(?'0(> M'`(>'`(>'`(=&P(=&P(=&P(<&P(<&@(<&@(;&@(;&0(;&0(;&0(:&0(:&`(: M&`$9&`$9%P$9%P$8%P$8%@$8%@$7%@$7%@$7%0$6%0$6%0$6%`$6%`$5%`$5 M%`$5$P$4$P$4$P$4$@$3$@$3$@$3$0$2$0$2$0$2$0$1$`$1$`$1$`$0#P$0 M#P$0#P$0#P$/#@$/#@$/#@$.#0$.#0$.#0$-#`$-#`$-#`$,#``,"P`,"P`+ M"P`+"@`+"@`+"@`*"@`*"0`*"0`)"0`)"``)"``("``(!P`(!P`'!P`'!P`' M!@`&!@`&!@`&!0`%!0`%!0`%!0`%!``$!``$!``$`P`#`P`#`P`#`@`"`@`" M`@`"`@`!`0`!`0```&]H"&]H"&YG"&YG"&YG"&YG"&UF"&UF"&UF"&QE"&QE M"&QE"&ME"&MD"&MD"&ID"&IC"&IC"&EC"&EB"&EB"&EB!VAB!VAA!VAA!V=A M!V=@!V=@!V9@!V9@!V9?!V5?!V5?!V5>!V1>!V1>!V1=!V-=!V-=!V-=!V-< M!V)<!V)<!V);!V%;!V%;!V%;!V!:!V!:!V!:!U]9!U]9!U]9!UY8!UY8!UY8 M!UY8!UU7!UU7!UU7!UQ6!UQ6!UQ6!EM6!EM5!EM5!EI5!EI4!EI4!EE4!EE3 M!EE3!EA3!EA3!EA2!EA2!E=2!E=1!E=1!E91!E91!E90!E50!E50!E5/!E1/ M!E1/!E1.!E-.!E-.!E-.!E--!E)-!E)-!E),!E%,!E%,!E%,!E!+!E!+!E!+ M!D]*!D]*!D]*!DY)!4Y)!4Y)!4U)!4U(!4U(!4U(!4Q'!4Q'!4Q'!4M&!4M& M!4M&!4I&!4I%!4I%!4E%!4E$!4E$!4A$!4A$!4A#!4A#!4=#!4="!4="!49" M!49!!49!!45!!45!!45`!41`!41`!40_!4,_!4,_!4,_!4(^!4(^!4(^!4(] M!4$]!$$]!$$\!$`\!$`\!$`\!#\[!#\[!#\[!#XZ!#XZ!#XZ!#TZ!#TY!#TY M!#TY!#PX!#PX!#PX!#LW!#LW!#LW!#HW!#HV!#HV!#DV!#DU!#DU!#@U!#@U M!#@T!#<T!#<T!#<S!#<S!#8S!#8R!#8R!#4R!#4R!#4Q!#0Q!#0Q`S0P`S,P M`S,P`S,P`S(O`S(O`S(O`S(N`S$N`S$N`S$M`S`M`S`M`S`M`R\L`R\L`R\L M`RXK`RXK`RXK`RTK`RTJ`RTJ`RPJ`RPI`RPI`RPI`RLH`RLH`RLH`RHH`RHG M`RHG`RDG`RDF`RDF`R@F`R@F`R@E`R<E`R<E`R<D`B<D`B8D`B8C`B8C`B4C M`B4C`B4B`B0B`B0B`B0A`B,A`B,A`B,A`B(@`B(@`B(@`B$?`B$?`B$?`B$> M`B`>`B`>`B`>`A\=`A\=`A\=`AX<`AX<`AX<`AT<`AT;`AT;`AP;`AP:`AP: M`AP:`AL9`AL9`AL9`AH9`AH8`AH8`1D8`1D7`1D7`1@7`1@7`1@6`1<6`1<6 M`1<5`1<5`185`184`184`144`144`143`103`103`102`1,2`1,2`1,2`1(1 M`1(1`1(1`1$0`1$0`1$0`1$/`1`/`1`/`1`/`0\.`0\.`0\.`0X-`0X-`0X- M`0T-`0T,`0T,`0P,``P+``P+``P+``L*``L*``L*``H*``H)``H)``D)``D( M``D(``@(``@(``@'``<'``<'``<&``8&``8&``8%``8%``4%``4%``4$``0$ M``0$``0#``,#``,#``,"``("``("``("``$!````;V@(;V@(;V@(;V@(;F<( M;F<(;F<(;68(;68(;68(;&4(;&4(;&4(:V4(:V0(:V0(:F0(:F,(:F,(:F,( M:6,(:6((:6(':&(':&$':&$'9V$'9V`'9V`'9F`'9F`'9E\'95\'95\'95X' M9%X'9%X'9%T'9%T'8UT'8UT'8UP'8EP'8EP'8EL'85L'85L'85L'8%H'8%H' M8%H'7UD'7UD'7UD'7U@'7E@'7E@'7E@'75<'75<'75<'7%8'7%8'7%8'6U8& M6U4&6U4&6E4&6E0&6E0&650&65,&65,&65,&6%,&6%(&6%(&5U(&5U$&5U$& M5E$&5E$&5E`&55`&55`&54\&5$\&5$\&5$X&5$X&4TX&4TX&4TT&4DT&4DT& M4DP&44P&44P&44P&4$L&4$L&4$L&3TH&3TH&3TH&3DD%3DD%3DD%3DD%34@% M34@%34@%3$<%3$<%3$<%2T<%2T8%2T8%2D8%2D4%2D4%244%240%240%240% M2$0%2$,%2$,%1T,%1T(%1T(%1D(%1D(%1D$%14$%14$%14`%1$`%1$`%1#\% M0S\%0S\%0S\%0SX%0CX%0CX%0CT%03T$03T$03T$0#P$0#P$0#P$/SL$/SL$ M/SL$/CH$/CH$/CH$/CH$/3D$/3D$/3D$/#@$/#@$/#@$.S@$.S<$.S<$.C<$ M.C8$.C8$.38$.34$.34$.#4$.#4$.#0$.#0$-S0$-S,$-S,$-C,$-C,$-C($ M-3($-3($-3$$-#$$-#$#-#`#,S`#,S`#,S`#,R\#,B\#,B\#,BX#,2X#,2X# M,2X#,"T#,"T#,"T#+RP#+RP#+RP#+BL#+BL#+BL#+2L#+2H#+2H#+2H#+"D# M+"D#+"D#*RD#*R@#*R@#*B@#*B<#*B<#*2<#*28#*28#*"8#*"8#*"4#*"4# M)R4#)R0")R0")B0")B0")B,")2,")2,")2(")"(")"(")"$"(R$"(R$"(R$" M(B`"(B`"(B`"(A\"(1\"(1\"(1\"(!X"(!X"(!X"'QT"'QT"'QT"'AP"'AP" M'AP"'1P"'1L"'1L"'1L"'!H"'!H"'!H"&QH"&QD"&QD"&AD"&A@"&A@!&1@! M&1<!&1<!&!<!&!<!&!8!%Q8!%Q8!%Q4!%Q4!%A4!%A0!%A0!%10!%10!%1,! M%!,!%!,!%!(!$Q(!$Q(!$Q(!$A$!$A$!$A$!$A`!$1`!$1`!$0\!$`\!$`\! M$`\!#PX!#PX!#PX!#@T!#@T!#@T!#0T!#0P!#0P!#`P`#`L`#`L`#`L`"PH` M"PH`"PH`"@H`"@D`"@D`"0D`"0@`"0@`"`@`"`@`"`<`!P<`!P<`!P8`!P8` M!@8`!@4`!@4`!04`!04`!00`!`0`!`0`!`,``P,``P,``P,``@(``@(``@(` M``!P:0AP:`AO:`AO:`AO:`AN9PAN9PAN9PAM9@AM9@AM9@AL90AL90AL90AK M90AK9`AK9`AJ9`AJ8PAJ8PAJ8PAI8PAI8@AI8@=H8@=H80=H80=G80=G8`=G M8`=F8`=F8`=F7P=E7P=E7P=E7@=E7@=D7@=D7@=D70=C70=C70=C7`=B7`=B M7`=B6P=A6P=A6P=A6P=@6@=@6@=@6@=?60=?60=?60=?60=>6`=>6`=>6`== M5P==5P==5P=<5@=<5@=<5@=;5@9;509;509:509:5`9:5`9:5`995`994P99 M4P984P984@984@974@9740974096409640964`954`954`953P943P943P94 M3P943@933@933@933092309230923`913`913`913`902P902P902P9/2@9/ M2@9/2@9/2@9.205.205.205-2`5-2`5-2`5,1P5,1P5,1P5+1P5+1@5+1@5* M1@5*105*105)105)105)1`5)1`5(1`5(0P5(0P5'0P5'0@5'0@5&0@5&0@5& M005%005%005%0`5$0`5$0`5$0`5$/P5#/P5#/P5#/@5"/@5"/@5"/05!/01! M/01!/01`/`1`/`1`/`0_.P0_.P0_.P0^.P0^.@0^.@0^.@0].00].00].00\ M.`0\.`0\.`0[.`0[-P0[-P0Z-P0Z-@0Z-@0I)P,8%P(2$0$9%P(E(P,T,00X M-`0W-`0W,P0W,P0V,P0V,P0O+`0H)@,L*0,U,00T,00T,0,T,0,S,`,S,`,S M,`,S+P,R+P,R+P,R+@,Q+@,Q+@,Q+@,P+0,P+0,P+0,O+`,O+`,O+`,N*P,N M*P,N*P,N*P,M*@,M*@,M*@,L*0,L*0,L*0,K*0,K*`,K*`,J*`,J)P,J)P,I M)P,I)@,I)@,H)@,H)@,H)0,H)0,G)0,G)`(G)`(F)`(F)`(F(P(E(P(E(P(E M(@(D(@(D(@(D(0(C(0(C(0(C(0(C(`(B(`(B(`(B'P(A'P(A'P(A'P(@'@(@ M'@(@'@(?'0(?'0(?'0(>'`(>'`(>'`(='`(=&P(=&P(=&P(<&@(<&@(<&@(; M&@(;&0(;&0(:&0(:&`(:&`$9&`$9%P$9%P$8%P$8%P$8%@$8%@$7%@$7%0$7 M%0$6%0$6%0$6%`$5%`$5%`$5$P$4$P$4$P$4$@$3$@$3$@$3$@$3$0$2$0$2 M$0$2$`$1$`$1$`$1$`$0#P$0#P$0#P$/#@$/#@$/#@$.#0$.#0$.#0$-#0$- M#`$-#`$-#``,"P`,"P`,"P`+"P`+"@`+"@`*"@`*"0`*"0`)"0`)"``)"``( M"``("``(!P`(!P`'!P`'!@`'!@`&!@`&!@`&!0`%!0`%!0`%!``$!``$!``$ M`P`#`P`#`P`#`P`"`@`"`@```'!I"'!I"'!H"&]H"&]H"&]H"&YG"&YG"&YG M"&UF"&UF"&UF"&QF"&QE"&QE"&ME"&MD"&MD"&MD"&IC"&IC"&IC"&EC"&EB M"&EB!VAB!VAA!VAA!V=A!V=A!V=@!V9@!V9@!V9?!V9?!V5?!V5>!V5>!V1> M!V1>!V1=!V-=!V-=!V-<!V)<!V)<!V)<!V%;!V%;!V%;!V!:!V!:!V!:!V!9 M!U]9!U]9!U]9!UY8!UY8!UY8!UU7!UU7!UU7!UQ7!UQ6!UQ6!UM6!EM5!EM5 M!EM5!EI4!EI4!EI4!EE4!EE3!EE3!EA3!EA2!EA2!E=2!E=2!E=1!E91!E91 M!E90!E50!E50!E5/!E5/!E1/!E1/!E1.!E-.!E-.!E--!E)-!E)-!E)-!E%, M!E%,!E%,!E!+!E!+!E!+!E!*!D]*!D]*!D]*!DY)!4Y)!4Y)!4U(!4U(!4U( M!4Q(!4Q'!4Q'!4M'!4M&!4M&!4I&!4I%!4I%!4I%!4E%!4E$!4E$!4A$!4A# M!4A#!4=#!4="!4="!49"!49"!49!!45!!45!!45`!45`!41`!41`!40_!4,_ M!4,_!4,^!4(^!4(^!4(]!4$]!4$]!$$]!$`\!$`\!$`\!#\[!#\[!#\[!#\[ M!#XZ!#XZ!#XZ!#LW!#<S!#,P`S,O`S,O`S(O`S`M`RXK`RTJ`RPJ`RXK`R0B M`A02`04%``````````$!``,#``4%``<'`0L+`0T,`0<'`1$0`2`=`B8D`RPI M`RXK!#(O!#0Q!#0Q`S0P`S,P`S,P`S,O`S(O`S(O`S(N`S$N`S$N`S$N`S`M M`S`M`S`M`R\L`R\L`R\L`R\L`RXK`RXK`RXK`RTJ`RTJ`RTJ`RPI`RPI`RPI M`RLI`RLH`RLH`RHH`RHG`RHG`RDG`RDG`RDF`RDF`R@F`R@E`R@E`R<E`R<D M`B<D`B8D`B8D`B8C`B4C`B4C`B4B`B0B`B0B`B0B`B0A`B,A`B,A`B,@`B(@ M`B(@`B(?`B$?`B$?`B$?`B`>`B`>`B`>`A\=`A\=`A\=`AX=`AX<`AX<`AX< M`AT;`AT;`AT;`AP:`AP:`AP:`AL:`AL9`AL9`AH9`AH8`AH8`1D8`1D8`1D7 M`1D7`1@7`1@6`1@6`1<6`1<5`1<5`185`185`184`144`144`143`103`103 M`103`1,2`1,2`1,2`1,1`1(1`1(1`1(0`1$0`1$0`1$0`1`/`1`/`1`/`0\. M`0\.`0\.`0X.`0X-`0X-`0X-`0T,`0T,`0T,``P+``P+``P+``L+``L*``L* M``H*``H)``H)``D)``D)``D(``@(``@(``@'``@'``<'``<&``<&``8&``8& M``8%``4%``4%``4$``0$``0$``0$``,#``,#``,#``,"````<6D(<&D(<&D( M<&D(;V@(;V@(;V@(;F<(;F<(;F<(;68(;68(;68(;&8(;&4(;&4(;&4(:V0( M:V0(:V0(:F0(:F,(:F,(:6,(:6((:6(':&(':&$':&$'9V$'9V$'9V`'9F`' M9F`'9E\'9E\'95\'95\'95X'9%X'9%X'9%T'8UT'8UT'8UP'8EP'8EP'8EP' M85L'85L'85L'85H'8%H'8%H'8%D'7UD'7UD'7UD'7E@'7E@'7E@'75<'75<' M75<'7%<'7%8'7%8'6U8&6U4&6U4&6U4&6E0&6E0&6E0&650&65,&65,&6%,& M6%(&6%(&5U(&5U(&5U$&5E$&5E$&5E`&5E`&55`&54\&54\&5$\&5$\&5$X& M4TX&4TX&4TT&4DT&4DT&4DT&44P&44P&44P&4$L&4$L&4$L&4$H&3TH&3TH& M3TH&3DD%3DD%3DD%34@%34@%34@%3$@%3$<%3$<%2T<%2T8%2T8%2T8%2D4% M2D4%2D4%244%240%240%2$0%2$,%2$,%1T,%1T,%1T(%1D(%1D(%1D$%14$% M14$%14`%14`%1$`%1$`%1#\%0S\%0S\%0SX%0CX%0CX%0CX%03T%03T$03T$ M0#P$0#P$0#P$0#L$/SL$/SL$/SL$/CH$/CH$.S<$,BX#*B<#*"4#)R4#)B0# M(R$"'QT"'!H"'!H"(!X"(1\"%Q4""`<!````````````#`P,)"0D,#`P+"PL M%Q<7`P,##0P!&1@"(!T"(B`#)R4#,2T$-3$$-#$$-#$#-#`#,S`#,S`#,R\# M,B\#,B\#,B\#,2X#,2X#,2X#,"T#,"T#,"T#+RP#+RP#+RP#+RP#+BL#+BL# M+BL#+2H#+2H#+2H#+"H#+"D#+"D#*RD#*R@#*R@#*B@#*B<#*B<#*B<#*2<# M*28#*28#*"8#*"4#*"4#)R4#)R4#)R0")B0")B0")B,")2,")2,")2(")"(" M)"(")"(")"$"(R$"(R$"(R`"(B`"(B`"(B`"(1\"(1\"(1\"(!X"(!X"(!X" M'QT"'QT"'QT"'QT"'AP"'AP"'AP"'1L"'1L"'1L"'!L"'!H"'!H"&QH"&QD" M&QD"&AD"&A@"&A@!&A@!&1@!&1<!&1<!&!<!&!8!&!8!%Q8!%Q4!%Q4!%A4! M%A4!%A0!%10!%10!%1,!%!,!%!,!%!,!%!(!$Q(!$Q(!$Q$!$A$!$A$!$A`! M$1`!$1`!$1`!$`\!$`\!$`\!#PX!#PX!#PX!#PX!#@T!#@T!#@T!#0P!#0P! M#0P`#`L`#`L`#`L`"PL`"PH`"PH`"@H`"@D`"@D`"0D`"0D`"0@`"0@`"`@` M"`<`"`<`!P<`!P8`!P8`!@8`!@8`!@4`!04`!04`!00`!`0`!`0`!`0`!`,` M`P,``P,```!Q:@AQ:0AP:0AP:0AP:0AO:`AO:`AO:`AN9PAN9PAN9PAM9@AM M9@AM9@AM9@AL90AL90AL90AK9`AK9`AK9`AJ9`AJ8PAJ8PAI8PAI8@AI8@=H M8@=H80=H80=G80=G80=G8`=G8`=F8`=F7P=F7P=E7P=E7P=E7@=D7@=D7@=D M70=C70=C70=C7`=B7`=B7`=B7`=B6P=A6P=A6P=A6@=@6@=@6@=@6@=?60=? M60=?60=>6`=>6`=>6`==5P==5P==5P=<5P=<5@=<5@=<5@9;509;509;509: M509:5`9:5`995`994P994P984P984@984@974@974@974097409640964`96 M4`954`954`953P943P943P943@933@933@9330923092309230913`913`91 M3`912P902P902P902P9/2@9/2@9/2@9.205.205.205-2`5-2`5-2`5,2`5, M1P5,1P5,1P5+1@5+1@5+1@5*1@5*105*105)105)1`5)1`5(1`5(0P5(0P5' M0P5'0P5'0@5&0@5&0@5&005&005%005%005%0`5$0`5$0`5$/P5#/P5#/P5# M/@5"/@5"/@5"/@5!/05!/01!/01!/`1`/`1`/`1`/`0_.P0_.P0_.P0].00Y M-00N*P,<&P(3$@$3$@$2$0$0#P$-#0$+"P$+"@$/#@$4$P$0#P$&!0`````` M```-#0TO+R]`0$!`0$!`0$`Z.CH4%!0#`P`*"@$2$0$:&0(D(@,O+`0T,00U M,00T,00T,0,T,`,S,`,S,`,S+P,R+P,R+P,R+P,Q+@,Q+@,Q+@,P+0,P+0,P M+0,P+0,O+`,O+`,O+`,N*P,N*P,N*P,M*@,M*@,M*@,L*@,L*0,L*0,K*0,K M*`,K*`,K*`,J)P,J)P,J)P,I)P,I)@,I)@,H)@,H)0,H)0,G)0,G)0,G)`(F M)`(F)`(F(P(E(P(E(P(E(@(E(@(D(@(D(@(D(0(C(0(C(0(C(`(B(`(B(`(B M(`(A'P(A'P(A'P(@'@(@'@(@'@(@'0(?'0(?'0(?'0(>'`(>'`(>'`(=&P(= M&P(=&P(<&P(<&@(<&@(;&@(;&0(;&0(:&0(:&`(:&`(:&`$9&`$9%P$9%P$8 M%P$8%@$8%@$7%@$7%@$7%0$6%0$6%0$6%`$5%`$5%`$5$P$5$P$4$P$4$P$4 M$@$3$@$3$@$3$0$2$0$2$0$2$0$1$`$1$`$1$`$0#P$0#P$0#P$/#@$/#@$/ M#@$/#@$.#0$.#0$.#0$-#`$-#`$-#``,#``,"P`,"P`+"P`+"@`+"@`*"@`* M"0`*"0`*"0`)"0`)"``)"``("``(!P`(!P`'!P`'!P`'!@`&!@`&!@`&!0`% M!0`%!0`%!``$!``$!``$!``$`P`#`P```'%J"'%J"'%I"'!I"'!I"'!I"&]H M"&]H"&]H"&YG"&YG"&YG"&UG"&UF"&UF"&UF"&QE"&QE"&QE"&MD"&MD"&MD M"&ID"&IC"&IC"&EC"&EB"&EB!VAB!VAB!VAA!VAA!V=A!V=@!V=@!V9@!V9? M!V9?!V5?!V5?!V5>!V1>!V1>!V1=!V-=!V-=!V-=!V)<!V)<!V)<!V);!V%; M!V%;!V%:!V!:!V!:!V!:!U]9!U]9!U]9!UY8!UY8!UY8!UU8!UU7!UU7!UU7 M!UQ6!UQ6!UQ6!EM5!EM5!EM5!EI5!EI4!EI4!EE4!EE3!EE3!EA3!EA3!EA2 M!E=2!E=2!E=1!E=1!E91!E90!E90!E50!E50!E5/!E1/!E1/!E1.!E-.!E-. M!E-.!E)-!E)-!E)-!E),!E%,!E%,!E%+!E!+!E!+!E!+!D]*!D]*!D]*!DY) M!4Y)!4Y)!4U)!4U(!4U(!4Q(!4Q'!4Q'!4Q'!4M&!4M&!4M&!4I&!4I%!4I% M!4E%!4E$!4E$!4A$!4A$!4A#!4=#!4=#!4="!4="!49"!49!!49!!45!!45! M!45`!41`!41`!40_!4,_!4,_!4,^!4(^!4(^!4(^!4$]!4$]!$$]!$$\!$`\ M!$`\!$`\!#\[!#HV!#4Q`RXK`R(@!!,2!@D)"`@("`8&!@("`@`````````` M``````````("`@D)"1$1$1X>'C,S,SX^/D!`0$!`0$!`0#\_/S(R,A(2$@,# M`P0$`!,2`2`>`BHG`RTJ`S`M!#4Q!#0Q!#0Q`S0P`S,P`S,P`S,O`S(O`S(O M`S(O`S$N`S$N`S$N`S$M`S`M`S`M`S`M`R\L`R\L`R\L`RXK`RXK`RXK`RTJ M`RTJ`RTJ`RPJ`RPI`RPI`RLI`RLH`RLH`RLH`RHH`RHG`RHG`RDG`RDF`RDF M`R@F`R@E`R@E`R<E`R<E`R<D`B8D`B8D`B8C`B8C`B4C`B4C`B4B`B0B`B0B M`B0A`B,A`B,A`B,@`B(@`B(@`B(@`B$?`B$?`B$?`B$>`B`>`B`>`B`>`A\= M`A\=`A\=`AX<`AX<`AX<`AT;`AT;`AT;`AP;`AP:`AP:`AL:`AL9`AL9`AL9 M`AH9`AH8`AH8`1D8`1D7`1D7`1@7`1@6`1@6`1<6`1<6`1<5`185`185`184 M`184`144`144`143`103`103`102`1,2`1,2`1,1`1(1`1(1`1(1`1$0`1$0 M`1$0`1`/`1`/`1`/`1`/`0\.`0\.`0\.`0X-`0X-`0X-`0T,`0T,`0T,`0P, M``P+``P+``L+``L*``L*``L*``H*``H)``H)``D)``D(``D(``@(``@'``@' M``<'``<'``<&``8&``8&``8%``4%``4%``4%``4$``0$``0$``0#````<FH( M<6H(<6H(<6H(<&D(<&D(<&D(;V@(;V@(;V@(;F<(;F<(;F<(;F<(;68(;68( M;68(;&4(;&4(;&4(:V4(:V0(:V0(:F0(:F,(:F,(:6,(:6((:6(':6(':&(' M:&$':&$'9V$'9V`'9V`'9F`'9F`'9E\'95\'95\'95X'9%X'9%X'9%T'8UT' M8UT'8UT'8UP'8EP'8EP'8EL'85L'85L'85L'8%H'8%H'8%H'7UD'7UD'7UD' M7E@'7E@'7E@'7E@'75<'75<'75<'7%8'7%8'7%8&6U4&6U4&6U4&6E4&6E0& M6E0&650&65,&65,&6%,&6%,&6%(&6%(&5U(&5U$&5U$&5E$&5E`&5E`&55`& M55`&54\&5$\&5$\&5$X&4TX&4TX&4TX&4TT&4DT&4DT&4DP&44P&44P&44L& M4$L&4$L&4$L&3TH&3TH&3TH&3DD%3DD%3DD%34D%34@%34@%34@%3$<%3$<% M3$<%2T8%2T8%2T8%2D8%2D4%2D4%244%240%240%2$0%2$0%2$,%2$,%1T,% M1T(%1T(%1D(%1D$%1D$%14$%14$%14`%1$`%1$`%1#\%0S\%0S\%0S\%0CX% M0CX%0CX%0CT%03T$03T$03P$0#P$0#P$0#P$-S,#*B<#'!H#$Q()%Q<5&QL; M'!P<&1D9#`P,`@("````````````````&AH:.3DY0$!`0$!`0$!`0$!`0$!` M0$!`0$!`0$!`.SL[+R\O%145!`0#"@D!%10"'AP")B,#+BL#-3($-3$$-#$$ M-#$#-#`#,S`#,S`#,S`#,B\#,B\#,B\#,BX#,2X#,2X#,2T#,"T#,"T#,"T# M+RP#+RP#+RP#+BL#+BL#+BL#+2L#+2H#+2H#+"H#+"D#+"D#+"D#*R@#*R@# M*R@#*B@#*B<#*B<#*2<#*28#*28#*"8#*"8#*"4#)R4#)R4#)R0")R0")B0" M)B,")B,")2,")2,")2(")"(")"(")"$"(R$"(R$"(R$"(B`"(B`"(B`"(1\" M(1\"(1\"(1X"(!X"(!X"(!X"'QT"'QT"'QT"'AP"'AP"'AP"'1P"'1L"'1L" M'!L"'!H"'!H"'!H"&QD"&QD"&QD"&AD"&A@"&A@!&1@!&1<!&1<!&!<!&!<! M&!8!%Q8!%Q8!%Q4!%A4!%A4!%A0!%A0!%10!%10!%1,!%!,!%!,!%!(!$Q(! M$Q(!$Q$!$A$!$A$!$A$!$1`!$1`!$1`!$0\!$`\!$`\!$`\!#PX!#PX!#PX! M#@T!#@T!#@T!#0P!#0P!#0P!#`P`#`L`#`L`"PL`"PH`"PH`"PH`"@H`"@D` M"@D`"0D`"0@`"0@`"`@`"`<`"`<`!P<`!P<`!P8`!@8`!@8`!@4`!@4`!04` M!04`!00`!`0`!`0```!R:PAR:@AQ:@AQ:@AQ:@AP:0AP:0AP:0AO:`AO:`AO M:`AO9PAN9PAN9PAN9PAM9@AM9@AM9@AL90AL90AL90AK90AK9`AK9`AJ9`AJ M8PAJ8PAI8PAI8@AI8@AI8@=H8@=H80=H80=G80=G8`=G8`=F8`=F8`=F7P=E M7P=E7P=E7@=D7@=D7@=D70=D70=C70=C70=C7`=B7`=B7`=B6P=A6P=A6P=A M6P=@6@=@6@=@6@=?60=?60=?60=>6`=>6`=>6`=>6`==5P==5P==5P=<5@=< M5@=<5@=;5@9;509;509:509:5`9:5`995`994P994P994P984P984@984@97 M4@9740974096409640964`954`954`953P943P943P943@933@933@933@93 M3092309230923`913`913`913`902P902P902P9/2@9/2@9/2@9.205.205. M205.205-2`5-2`5-2`5,1P5,1P5,1P5+1P5+1@5+1@5*1@5*105*105)105) M1`5)1`5(1`5(1`5(0P5(0P5'0P5'0@5'0@5&0@5&0@5&005%005%005%0`5$ M0`5$0`5$/P5#/P5#/P5#/P5#/@5"/@5"/@5"/05!/01!/00_.P0[.`0Z-@0S M,`,?'0,-#083$Q,>'AX?'Q\@("`?'Q\8&!@*"@H$`@(%`0$(`0$4!@8X+R]` M0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$`\/#PT-#0I*2D3$Q,%!00&!@$/ M#@(=&P,K*`,P+00O+`0M*@,M*@,P+0,S+P,S,`,S,`,S,`,R+P,R+P,R+P,R M+@,Q+@,Q+@,Q+@,P+0,P+0,P+0,O+`,O+`,O+`,N*P,N*P,N*P,M*P,M*@,M M*@,M*@,L*0,L*0,L*0,K*0,K*`,K*`,J*`,J)P,J)P,I)P,I)@,I)@,H)@,H M)@,H)0,G)0,G)0,G)`(G)`(F)`(F(P(F(P(E(P(E(P(E(@(D(@(D(@(D(0(C M(0(C(0(C(0(B(`(B(`(B(`(B'P(A'P(A'P(A'@(@'@(@'@(@'@(?'0(?'0(? M'0(>'`(>'`(>'`(='`(=&P(=&P(=&P(<&@(<&@(<&@(;&0(;&0(;&0(:&0(: M&`(:&`$9&`$9%P$9%P$8%P$8%P$8%@$7%@$7%@$7%0$7%0$6%0$6%`$6%`$5 M%`$5%`$5$P$4$P$4$P$4$@$3$@$3$@$3$@$2$0$2$0$2$0$2$`$1$`$1$`$1 M#P$0#P$0#P$0#P$/#@$/#@$/#@$.#0$.#0$.#0$-#0$-#`$-#`$,#``,"P`, M"P`,"P`+"@`+"@`+"@`*"@`*"0`*"0`)"0`)"``)"``("``("``(!P`'!P`' M!P`'!@`'!@`&!@`&!0`&!0`%!0`%!0`%!``$!````')K"')K"')J"'%J"'%J M"'%J"'!I"'!I"'!I"'!H"&]H"&]H"&]H"&YG"&YG"&YG"&UF"&UF"&UF"&QE M"&QE"&QE"&ME"&MD"&MD"&ID"&IC"&IC"&IC"&EC"&EB"&EB!VAB!VAA!VAA M!V=A!V=@!V=@!V9@!V9@!V9?!V5?!V5?!V5>!V5>!V1>!V1>!V1=!V-=!V-= M!V-<!V)<!V)<!V);!V%;!V%;!V%;!V!:!V!:!V!:!U]9!U]9!U]9!U]9!UY8 M!UY8!UY8!UU7!UU7!UU7!UQ6!UQ6!UQ6!UM6!EM5!EM5!EI5!EI4!EI4!EI4 M!EE4!EE3!EE3!EA3!EA2!EA2!E=2!E=1!E=1!E91!E91!E90!E50!E50!E5/ M!E1/!E1/!E1/!E1.!E-.!E-.!E--!E)-!E)-!E),!E%,!E%,!E%,!E!+!E!+ M!E!+!D]*!D]*!D]*!D]*!DY)!4Y)!4Y)!4U(!4U(!4U(!4Q'!4Q'!4Q'!4M' M!4M&!4M&!4I&!4I%!4I%!4E%!4E%!4E$!4E$!4A$!4A#!4A#!4=#!4="!4=" M!49"!49"!49!!45!!45!!45`!41`!41`!41`!40_!4,_!4,_!4,^!4(^!4(^ M!4(]!4$]!#LX!#0Q`RTK`R4C`Q85!Q`0$!L;&Q\?'R`@("`@(!\?'QT='1<7 M%Q8/#QT)"2@%!3D-#4`W-T!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0#\_/SL[ M.S4U-3`P,"PL+"(B(A<7%Q$1#A44!Q\=`R4B`R(@`R`>`B$?`R@F`S(O`S0P M`S,P`S,P`S,P`S,O`S(O`S(O`S(N`S$N`S$N`S$N`S`M`S`M`S`M`R\L`R\L M`R\L`RXK`RXK`RXK`RXK`RTJ`RTJ`RTJ`RPI`RPI`RPI`RLI`RLH`RLH`RHH M`RHG`RHG`RDG`RDF`RDF`R@F`R@F`R@E`R@E`R<E`R<D`B<D`B8D`B8D`B8C M`B4C`B4C`B4B`B0B`B0B`B0A`B,A`B,A`B,A`B,@`B(@`B(@`B(?`B$?`B$? M`B$?`B`>`B`>`B`>`A\=`A\=`A\=`AX<`AX<`AX<`AT<`AT;`AT;`AT;`AP: M`AP:`AP:`AL:`AL9`AL9`AH9`AH8`AH8`1D8`1D7`1D7`1@7`1@7`1@6`1@6 M`1<6`1<5`1<5`185`185`184`144`144`143`103`103`102`1,2`1,2`1,2 M`1(1`1(1`1(1`1(0`1$0`1$0`1$0`1`/`1`/`1`/`0\.`0\.`0\.`0X-`0X- M`0X-`0T-`0T,`0T,`0T,``P+``P+``P+``L+``L*``L*``H*``H)``H)``D) M``D(``D(``@(``@(``@'``<'``<'``<&``<&``8&``8&``8%``4%``4%``4$ M````<VL(<FL(<FL(<FL(<6H(<6H(<6H(<&D(<&D(<&D(<&@(;V@(;V@(;V@( M;F<(;F<(;F<(;68(;68(;68(;&8(;&4(;&4(:V4(:V0(:V0(:V0(:F,(:F,( M:F,(:6,(:6((:6(':&(':&$':&$'9V$'9V$'9V`'9F`'9F`'9E\'95\'95\' M95X'95X'9%X'9%X'9%T'8UT'8UT'8UP'8EP'8EP'8EP'85L'85L'85L'8%H' M8%H'8%H'8%D'7UD'7UD'7UD'7E@'7E@'7E@'75<'75<'75<'7%<'7%8'7%8' M6U8&6U4&6U4&6E4&6E0&6E0&6E0&650&65,&65,&6%,&6%(&6%(&5U(&5U$& M5U$&5E$&5E$&5E`&55`&55`&54\&54\&5$\&5$\&5$X&4TX&4TX&4TT&4DT& M4DT&4DP&44P&44P&44P&4$L&4$L&4$L&3TH&3TH&3TH&3TH&3DD%3DD%3DD% M34@%34@%34@%3$<%3$<%3$<%2T<%2T8%2T8%2D8%2D4%2D4%2D4%244%240% M240%2$0%2$,%2$,%1T,%1T(%1T(%1D(%1D(%1D$%14$%14$%14`%1$`%1$`% M1$`%1#\%0S\%0S\%0SX%0CX%0CX%0CT%.#4$+RP#(1\"$`\"%100'!P<'Q\? M("`@("`@("`@(!\?(!\?(!X>*AD9.Q`02P@(5!`003L[0$!`0$!`0$!`0$!` M0$!`0$!`0$!`0$!`/CX^.3DY,S,S,#`P,#`P+BXN*"@H("`@%104#0T'#PX! M$`\!$1`!%Q8")"$#,2X$-#$#-#$#-#`#,S`#,S`#,R\#,B\#,B\#,BX#,2X# M,2X#,2X#,"T#,"T#,"T#+RP#+RP#+RP#+BP#+BL#+BL#+BL#+2H#+2H#+2H# M+"D#+"D#+"D#*RD#*R@#*R@#*B@#*B<#*B<#*2<#*2<#*28#*28#*"8#*"4# M*"4#)R4#)R0")R0")B0")B0")B,")2,")2,")2(")"(")"(")"(")"$"(R$" M(R$"(R`"(B`"(B`"(A\"(1\"(1\"(1\"(!X"(!X"(!X"'QT"'QT"'QT"'AT" M'AP"'AP"'AP"'1L"'1L"'1L"'!H"'!H"'!H"&QH"&QD"&QD"&AD"&A@"&A@! M&1@!&1@!&1<!&1<!&!<!&!8!&!8!%Q8!%Q4!%Q4!%A4!%A4!%A0!%10!%10! M%1,!%!,!%!,!%!,!$Q(!$Q(!$Q(!$Q$!$A$!$A$!$A`!$1`!$1`!$1`!$`\! M$`\!$`\!#PX!#PX!#PX!#@T!#@T!#@T!#@T!#0P!#0P!#0P`#`L`#`L`#`L` M"PL`"PH`"PH`"@H`"@D`"@D`"0D`"0@`"0@`"`@`"`@`"`<`"`<`!P<`!P8` M!P8`!@8`!@8`!@4`!04`!04```!S;`AS:PAR:PAR:PAR:PAQ:@AQ:@AQ:@AQ M:0AP:0AP:0AP:`AO:`AO:`AO:`AN9PAN9PAN9PAM9@AM9@AM9@AL9@AL90AL M90AL90AK9`AK9`AK9`AJ8PAJ8PAJ8PAI8PAI8@AI8@=H8@=H80=H80=G80=G M80=G8`=F8`=F8`=F7P=F7P=E7P=E7@=E7@=D7@=D7@=D70=C70=C70=C7`=B M7`=B7`=B7`=A6P=A6P=A6P=A6@=@6@=@6@=@60=?60=?60=?60=>6`=>6`=> M6`==5P==5P==5P=<5P=<5@=<5@=;5@9;509;509;509:5`9:5`9:5`995`99 M4P994P984P984@984@974@974@974096409640964`964`954`953P953P94 M3P943P943@933@933@9330923092309230913`913`913`902P902P902P90 M2@9/2@9/2@9/2@9.205.205.205-2`5-2`5-2`5,2`5,1P5,1P5+1P5+1@5+ M1@5+1@5*105*105*105)105)1`5)1`5(1`5(0P5(0P5'0P5'0P5'0@5&0@5& M0@5&005%005%005%0`5%0`5$0`5$0`5$/P5#/P5#/P5#/@5"/@5"/@4Z-@0Q M+@0?'0($!`(;&QLE)24A(2$@("`@("`@("`@'Q\E'1TT&!A($!!2"@I8!@97 M$1%!/#Q`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$`^/CXX.#@Q,3$P,#`P,#`N M+BXI*2DB(B(='1T4%!0("`<#`P(&!0`1$`$=&P(E(P,J)P,O+`0T,0,T,`,S M,`,S,`,S+P,R+P,R+P,R+P,Q+@,Q+@,Q+@,P+0,P+0,P+0,O+`,O+`,O+`,O M+`,N*P,N*P,N*P,M*@,M*@,M*@,L*@,L*0,L*0,K*0,K*`,K*`,J*`,J)P,J M)P,J)P,I)P,I)@,I)@,H)@,H)0,H)0,G)0,G)0,G)`(F)`(F)`(F(P(E(P(E M(P(E(@(D(@(D(@(D(@(D(0(C(0(C(0(C(`(B(`(B(`(B'P(A'P(A'P(A'P(@ M'@(@'@(@'@(?'0(?'0(?'0(?'0(>'`(>'`(>'`(=&P(=&P(=&P(<&@(<&@(< M&@(;&@(;&0(;&0(:&0(:&`(:&`$9&`$9&`$9%P$9%P$8%P$8%@$8%@$7%@$7 M%0$7%0$6%0$6%0$6%`$5%`$5%`$5$P$4$P$4$P$4$P$4$@$3$@$3$@$3$0$2 M$0$2$0$2$`$1$`$1$`$1$`$0#P$0#P$0#P$/#@$/#@$/#@$.#@$.#0$.#0$. M#0$-#`$-#`$-#``,"P`,"P`,"P`+"P`+"@`+"@`*"@`*"0`*"0`)"0`)"0`) M"``)"``("``(!P`(!P`'!P`'!@`'!@`&!@`&!@`&!0`%!0```'-L"'-L"'-K M"')K"')K"')K"')J"'%J"'%J"'%I"'!I"'!I"'!I"&]H"&]H"&]H"&YG"&YG M"&YG"&UF"&UF"&UF"&QF"&QE"&QE"&QE"&MD"&MD"&MD"&ID"&IC"&IC"&EC M"&EB"&EB!VAB!VAA!VAA!V=A!V=A!V=@!V=@!V9@!V9?!V9?!V5?!V5?!V5> M!V1>!V1>!V1=!V-=!V-=!V-<!V)<!V)<!V)<!V%;!V%;!V%;!V%:!V!:!V!: M!V!:!U]9!U]9!U]9!UY8!UY8!UY8!UU7!UU7!UU7!UQ7!UQ6!UQ6!UQ6!EM5 M!EM5!EM5!EI5!EI4!EI4!EE4!EE3!EE3!EA3!EA2!EA2!E=2!E=2!E=1!E91 M!E91!E90!E90!E50!E50!E5/!E1/!E1/!E1.!E-.!E-.!E--!E)-!E)-!E)- M!E%,!E%,!E%,!E%+!E!+!E!+!E!+!D]*!D]*!D]*!DY)!4Y)!4Y)!4U(!4U( M!4U(!4Q(!4Q'!4Q'!4M'!4M&!4M&!4M&!4I&!4I%!4I%!4E%!4E$!4E$!4A$ M!4A#!4A#!4=#!4=#!4="!49"!49"!49!!49!!45!!45!!45`!41`!41`!40_ M!4,_!4,_!4,^!4(^!3LW!#0Q!"(@`P,#`B8F)BTM+20D)"`@("`@("`@("$? M'S$:&E<-#6D%!6@#`V,"`E@/#T$\/$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!` M0#X^/C<W-S`P,#`P,#`P,"XN+BDI*2,C(R`@(!X>'AD9&0L+"P,#`0H)`1,2 M`1D8`B`>`BLH`S0Q!#0Q`S0P`S,P`S,P`S,O`S(O`S(O`S(O`S$N`S$N`S$N M`S`M`S`M`S`M`S`L`R\L`R\L`R\L`RXK`RXK`RXK`RTJ`RTJ`RTJ`RPJ`RPI M`RPI`RLI`RLH`RLH`RHH`RHG`RHG`RHG`RDG`RDF`RDF`R@F`R@E`R@E`R<E M`R<E`R<D`B8D`B8D`B8C`B4C`B4C`B4B`B4B`B0B`B0B`B0A`B,A`B,A`B,@ M`B(@`B(@`B(@`B$?`B$?`B$?`B`>`B`>`B`>`B`=`A\=`A\=`A\=`AX<`AX< M`AX<`AT;`AT;`AT;`AP;`AP:`AP:`AL:`AL9`AL9`AH9`AH8`AH8`AH8`1D8 M`1D7`1D7`1@7`1@6`1@6`1<6`1<6`1<5`185`185`184`144`144`143`143 M`103`103`102`1,2`1,2`1,1`1(1`1(1`1(1`1$0`1$0`1$0`1`/`1`/`1`/ M`0\.`0\.`0\.`0\.`0X-`0X-`0X-`0T,`0T,`0T,``P,``P+``P+``L+``L* M``L*``H*``H)``H)``H)``D)``D(``D(``@(``@'``@'``<'``<'``<&``8& M``8&``8%````=&P(<VP(<VP(<VP(<VL(<FL(<FL(<FH(<6H(<6H(<6D(<&D( M<&D(<&D(;V@(;V@(;V@(;F<(;F<(;F<(;6<(;68(;68(;68(;&4(;&4(;&4( M:V0(:V0(:V0(:F0(:F,(:F,(:6,(:6((:6(':&(':&(':&$':&$'9V$'9V`' M9V`'9F`'9E\'9E\'95\'95\'95X'9%X'9%X'9%T'8UT'8UT'8UT'8EP'8EP' M8EP'8EL'85L'85L'85H'8%H'8%H'8%H'7UD'7UD'7UD'7E@'7E@'7E@'75@' M75<'75<'75<'7%8'7%8'7%8&6U4&6U4&6U4&6E4&6E0&6E0&650&65,&65,& M6%,&6%,&6%(&5U(&5U(&5U$&5U$&5E$&5E`&5E`&55`&55`&54\&5$\&5$\& M5$X&4TX&4TX&4TT&4DT&4DT&4DT&4DP&44P&44P&44L&4$L&4$L&4$L&3TH& M3TH&3TH&3DD%3DD%3DD%34@%34@%34@%3$@%3$<%3$<%3$<%2T8%2T8%2T8% M2D8%2D4%2D4%244%240%240%2$0%2$,%2$,%1T,%1T,%1T(%1T(%1D(%1D$% M1D$%14$%14$%14`%1$`%1$`%1#\%0S\%0S\%0SX%.S@$-S,$*B@##0P!*2DG M,3$Q*"@H(R(B(B`@)!\?+1T=51`0=P,#>0``=0``;0``6@P,0CL[0$!`0$!` M0$!`0$!`0$!`0$!`0$!`0$!`/3T]-C8V,#`P,#`P,#`P+BXN*2DI(B(B("`@ M("`@("`@&!@8"`@(`P,!!P8`#PX!&A@")B,#,2T$,2\$,S`#-#`#,S`#,S`# M,R\#,B\#,B\#,B\#,2X#,2X#,2X#,2T#,"T#,"T#,"T#+RP#+RP#+RP#+BL# M+BL#+BL#+2H#+2H#+2H#+"H#+"D#+"D#*RD#*R@#*R@#*R@#*B@#*B<#*B<# M*2<#*28#*28#*"8#*"4#*"4#)R4#)R4#)R0")B0")B0")B,")B,")2,")2," M)2(")"(")"(")"$"(R$"(R$"(R`"(B`"(B`"(B`"(1\"(1\"(1\"(!X"(!X" M(!X"(!X"'QT"'QT"'QT"'AP"'AP"'AP"'1L"'1L"'1L"'!L"'!H"'!H"&QH" M&QD"&QD"&QD"&AD"&A@"&A@!&1@!&1<!&1<!&!<!&!8!&!8!%Q8!%Q8!%Q4! M%A4!%A4!%A0!%10!%10!%10!%1,!%!,!%!,!%!(!$Q(!$Q(!$Q$!$A$!$A$! M$A$!$1`!$1`!$1`!$`\!$`\!$`\!$`\!#PX!#PX!#PX!#@T!#@T!#@T!#0P! M#0P!#0P!#`P`#`L`#`L`"PL`"PH`"PH`"@H`"@D`"@D`"@D`"0D`"0@`"0@` M"`@`"`<`"`<`!P<`!P<`!P8`!@8`!@8```!T;0AT;`AS;`AS;`AS;`AS:PAR M:PAR:PAR:@AQ:@AQ:@AQ:@AP:0AP:0AP:0AO:`AO:`AO:`AN9PAN9PAN9PAN M9PAM9@AM9@AM9@AL90AL90AL90AK9`AK9`AK9`AJ9`AJ8PAJ8PAI8PAI8@AI M8@=H8@=H8@=H80=H80=G80=G8`=G8`=F8`=F7P=F7P=E7P=E7P=E7@=D7@=D M7@=D70=C70=C70=C70=C7`=B7`=B7`=B6P=A6P=A6P=A6@=@6@=@6@=@6@=? M60=?60=?60=>6`=>6`=>6`==6`==5P==5P==5P=<5@=<5@=<5@9;509;509; M509:509:5`9:5`995`994P994P984P984P984@984@974@97409740964096 M4`964`954`954`953P943P943P943@933@933@933@923092309230923`91 M3`913`912P902P902P902P9/2@9/2@9/2@9.205.205.205-205-2`5-2`5- M2`5,1P5,1P5,1P5+1@5+1@5+1@5*1@5*105*105)105)1`5)1`5(1`5(1`5( M0P5'0P5'0P5'0@5'0@5&0@5&005&005%005%005%0`5$0`5$0`5$/P5#/P5# M/P4_.P4\.`4Y-00R+P0>'0TC(R,J*BHL*2DU)"1/'1U[$!"*!06"`0%Y``!W M``!P``!<!P=#.#A`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$`]/3TV-C8P,#`P M,#`P,#`N+BXH*"@A(2$@("`@("`@("`>'AX6%A8*"@H"`@('!@$3$@$<&P(C M(0,I)@,P+@0T,0,T,`,S,`,S,`,S,`,R+P,R+P,R+P,Q+@,Q+@,Q+@,Q+0,P M+0,P+0,P+0,O+`,O+`,O+`,N*P,N*P,N*P,M*P,M*@,M*@,L*@,L*0,L*0,L M*0,K*`,K*`,K*`,J*`,J)P,J)P,I)P,I)@,I)@,H)@,H)@,H)0,G)0,G)0,G M)`(G)`(F)`(F(P(F(P(E(P(E(P(E(@(D(@(D(@(D(0(C(0(C(0(C(`(B(`(B M(`(B(`(A'P(A'P(A'P(A'@(@'@(@'@(@'@(?'0(?'0(?'0(>'`(>'`(>'`(= M&P(=&P(=&P(<&P(<&@(<&@(<&@(;&0(;&0(;&0(:&0(:&`(:&`$9&`$9%P$9 M%P$8%P$8%@$8%@$7%@$7%@$7%0$6%0$6%0$6%`$6%`$5%`$5%`$5$P$4$P$4 M$P$4$@$3$@$3$@$3$0$2$0$2$0$2$0$1$`$1$`$1$`$1#P$0#P$0#P$0#P$/ M#@$/#@$/#@$.#0$.#0$.#0$-#`$-#`$-#`$,#``,"P`,"P`+"P`+"@`+"@`+ M"@`*"@`*"0`*"0`)"0`)"``)"``("``(!P`(!P`'!P`'!P`'!@`&!@```'1M M"'1M"'1L"'1L"'-L"'-L"'-K"')K"')K"')J"'%J"'%J"'%J"'!I"'!I"'!I M"&]H"&]H"&]H"&]G"&YG"&YG"&YG"&UF"&UF"&UF"&QE"&QE"&QE"&ME"&MD M"&MD"&ID"&IC"&IC"&EC"&EB"&EB"&EB!VAB!VAA!VAA!V=A!V=@!V=@!V9@ M!V9@!V9?!V5?!V5?!V5>!V1>!V1>!V1=!V1=!V-=!V-=!V-<!V)<!V)<!V); M!V%;!V%;!V%;!V!:!V!:!V!:!U]9!U]9!U]9!UY8!UY8!UY8!UY8!UU7!UU7 M!UU7!UQ6!UQ6!UQ6!EM6!EM5!EM5!EI5!EI4!EI4!EE4!EE3!EE3!EE3!EA3 M!EA2!EA2!E=2!E=1!E=1!E91!E91!E90!E50!E50!E5/!E1/!E1/!E1.!E-. M!E-.!E-.!E--!E)-!E)-!E),!E%,!E%,!E%,!E!+!E!+!E!+!D]*!D]*!D]* M!DY)!4Y)!4Y)!4Y)!4U(!4U(!4U(!4Q'!4Q'!4Q'!4M'!4M&!4M&!4I&!4I% M!4I%!4E%!4E$!4E$!4A$!4A$!4A#!4A#!4=#!4="!4="!49"!49"!49!!45! M!45!!45`!41`!41`!40_!4,_!4(^!4$]!4$]!4$^!2LI`Q03""8E(C8V-F`L M++(3$\X"`J0``(@``'P``'D``'0``&```$<R,D!`0$!`0$!`0$!`0$!`0$!` M0$!`0$!`0#T]/38V-C`P,#`P,#`P,"XN+B@H*"$A(2`@("`@("`@(!\?'QX> M'AD9&0H*"@("``H)`1`/`185`B$?`R\K!#0Q!#0Q`S0P`S,P`S,P`S,P`S(O M`S(O`S(O`S(N`S$N`S$N`S$M`S`M`S`M`S`M`R\L`R\L`R\L`RXK`RXK`RXK M`RTK`RTJ`RTJ`RTJ`RPI`RPI`RPI`RLH`RLH`RLH`RHH`RHG`RHG`RDG`RDF M`RDF`R@F`R@F`R@E`R<E`R<E`R<D`B<D`B8D`B8C`B8C`B4C`B4C`B4B`B0B M`B0B`B0A`B,A`B,A`B,A`B(@`B(@`B(@`B(?`B$?`B$?`B$>`B`>`B`>`B`> M`A\=`A\=`A\=`AX<`AX<`AX<`AT<`AT;`AT;`AP;`AP:`AP:`AP:`AL9`AL9 M`AL9`AH9`AH8`AH8`1D8`1D7`1D7`1@7`1@7`1@6`1<6`1<6`1<5`1<5`185 M`184`184`144`144`143`103`103`102`1,2`1,2`1,2`1(1`1(1`1(1`1$0 M`1$0`1$0`1$/`1`/`1`/`1`/`0\.`0\.`0\.`0X-`0X-`0X-`0T-`0T,`0T, M`0P,``P+``P+``P+``L*``L*``L*``H*``H)``H)``D)``D(``D(``@(``@( M``@'``<'``<'``<&````=6T(=6T(=&T(=&T(=&P(<VP(<VP(<VL(<FL(<FL( M<FH(<6H(<6H(<6H(<&D(<&D(<&D(;V@(;V@(;V@(;V@(;F<(;F<(;F<(;68( M;68(;68(;&4(;&4(;&4(:V4(:V0(:V0(:F0(:F,(:F,(:F,(:6,(:6((:6(' M:&(':&$':&$'9V$'9V`'9V`'9F`'9F`'9E\'95\'95\'95X'9%X'9%X'9%X' M9%T'8UT'8UT'8UP'8EP'8EP'8EL'85L'85L'85L'8%H'8%H'8%H'7UD'7UD' M7UD'7UD'7E@'7E@'7E@'75<'75<'75<'7%8'7%8'7%8'6U8&6U4&6U4&6E4& M6E0&6E0&650&650&65,&65,&6%,&6%(&6%(&5U(&5U$&5U$&5E$&5E$&5E`& M55`&55`&54\&5$\&5$\&5$\&5$X&4TX&4TX&4TT&4DT&4DT&4DP&44P&44P& M44P&4$L&4$L&4$L&3TH&3TH&3TH&3DD%3DD%3DD%3DD%34@%34@%34@%3$<% M3$<%3$<%2T<%2T8%2T8%2D8%2D4%2D4%244%240%240%240%2$0%2$,%2$,% M1T,%1T(%1T(%1D(%1D(%1D$%14$%14$%14`%1$`%1$`%1#\%0S\%0S\%0S\% M0CT%.34$,"T$,B\/.C@<;B\;S@\(V@``J```C```?P``>P``>0``;P``4QX> M0CL[0#\_0$!`0$!`0$!`0$!`0$!`0$!`/3T]-C8V,#`P,#`P,#`P+BXN*"@H M(2$A("`@("`@("`@("`@("`@'AX>%145!P<'!`0"!@8`$A$!(1\"+BP$-3$$ M-#$$-#$#-#`#,S`#,S`#,S`#,R\#,B\#,B\#,BX#,2X#,2X#,2X#,"T#,"T# M,"T#+RP#+RP#+RP#+BL#+BL#+BL#+BL#+2H#+2H#+2H#+"D#+"D#+"D#*RD# M*R@#*R@#*B@#*B<#*B<#*2<#*28#*28#*"8#*"8#*"4#*"4#)R4#)R0")R0" M)B0")B0")B,")2,")2,")2(")"(")"(")"$"(R$"(R$"(R$"(R`"(B`"(B`" M(A\"(1\"(1\"(1\"(!X"(!X"(!X"'QT"'QT"'QT"'AP"'AP"'AP"'1P"'1L" M'1L"'1L"'!H"'!H"'!H"&QH"&QD"&QD"&AD"&A@"&A@!&1@!&1<!&1<!&!<! M&!<!&!8!&!8!%Q8!%Q4!%Q4!%A4!%A4!%A0!%10!%10!%1,!%!,!%!,!%!(! M$Q(!$Q(!$Q(!$A$!$A$!$A$!$A`!$1`!$1`!$1`!$`\!$`\!$`\!#PX!#PX! M#PX!#@T!#@T!#@T!#0T!#0P!#0P!#0P`#`L`#`L`#`L`"PL`"PH`"PH`"@H` M"@D`"@D`"0D`"0@`"0@`"`@`"`@`"`<`!P<`!P<```!U;@AU;0AU;0AT;0AT M;0AT;`AS;`AS;`AS:PAR:PAR:PAR:PAQ:@AQ:@AQ:@AP:0AP:0AP:0AP:`AO M:`AO:`AO:`AN9PAN9PAN9PAM9@AM9@AM9@AL9@AL90AL90AK90AK9`AK9`AK M9`AJ8PAJ8PAJ8PAI8PAI8@AI8@=H8@=H80=H80=G80=G8`=G8`=F8`=F8`=F M7P=E7P=E7P=E7@=E7@=D7@=D7@=D70=C70=C70=C7`=B7`=B7`=B6P=A6P=A M6P=A6P=@6@=@6@=@6@=@60=?60=?60=?60=>6`=>6`=>6`==5P==5P==5P=< M5@=<5@=<5@=;5@9;509;509:509:5`9:5`9:5`995`994P994P984P984@98 M4@974@9740974096409640964`954`954`953P953P943P943P943@933@93 M3@933092309230923`913`913`913`902P902P902P9/2@9/2@9/2@9/2@9. M205.205.205-2`5-2`5-2`5,1P5,1P5,1P5+1P5+1@5+1@5*1@5*105*105* M105)105)1`5)1`5(1`5(0P5(0P5'0P5'0@5'0@5&0@5&0@5&005%005%005% M0`5$0`5$0`5$0`5$/P5#/P5!/@5"/05"/@5"/@5"/05@+P3,$`'@``"O``"/ M``"!``!^``!_``!_``!N`P-1'!Q!.SM`0$!`0$!`0$!`0$!`0$!`0$`]/3TV M-C8P,#`P,#`P,#`N+BXH*"@A(2$@("`@("`@("`@("`@("`?'Q\='1T6%A8) M"0D$!`$4$P$D(0,O+`0U,@0U,00T,00T,0,T,0,T,`,S,`,S,`,S+P,R+P,R M+P,R+@,Q+@,Q+@,Q+@,P+0,P+0,P+0,O+`,O+`,O+`,N+`,N*P,N*P,N*P,M M*@,M*@,M*@,L*0,L*0,L*0,K*0,K*`,K*`,J*`,J)P,J)P,I)P,I)P,I)@,I M)@,H)@,H)0,H)0,G)0,G)`(G)`(F)`(F)`(F(P(E(P(E(P(E(@(D(@(D(@(D M(@(C(0(C(0(C(0(C(`(B(`(B(`(B'P(A'P(A'P(A'P(@'@(@'@(@'@(?'0(? M'0(?'0(>'`(>'`(>'`(>'`(=&P(=&P(=&P(<&@(<&@(<&@(;&@(;&0(;&0(: M&0(:&`(:&`$9&`$9%P$9%P$8%P$8%P$8%@$8%@$7%@$7%0$7%0$6%0$6%0$6 M%`$5%`$5%`$5$P$4$P$4$P$4$@$3$@$3$@$3$@$3$0$2$0$2$0$2$`$1$`$1 M$`$1$`$0#P$0#P$0#P$/#@$/#@$/#@$.#0$.#0$.#0$-#0$-#`$-#`$-#``, M"P`,"P`,"P`+"P`+"@`+"@`*"@`*"0`*"0`)"0`)"``)"``("``("``(!P`( M!P```'9N"'5N"'5M"'5M"'1M"'1M"'1L"'-L"'-L"'-K"')K"')K"')K"'%J M"'%J"'%J"'%I"'!I"'!I"'!H"&]H"&]H"&]H"&YG"&YG"&YG"&UF"&UF"&UF M"&QF"&QE"&QE"&ME"&MD"&MD"&MD"&IC"&IC"&IC"&EC"&EB"&EB!VAB!VAA M!VAA!V=A!V=A!V=@!V9@!V9@!V9?!V9?!V5?!V5>!V5>!V1>!V1>!V1=!V-= M!V-=!V-<!V)<!V)<!V)<!V%;!V%;!V%;!V!:!V!:!V!:!V!9!U]9!U]9!U]9 M!UY8!UY8!UY8!UU7!UU7!UU7!UQ7!UQ6!UQ6!UM6!EM5!EM5!EM5!EI4!EI4 M!EI4!EE4!EE3!EE3!EA3!EA2!EA2!E=2!E=2!E=1!E91!E91!E90!E50!E50 M!E5/!E5/!E1/!E1/!E1.!E-.!E-.!E--!E)-!E)-!E)-!E%,!E%,!E%,!E!+ M!E!+!E!+!E!*!D]*!D]*!D]*!DY)!4Y)!4Y)!4U(!4U(!4U(!4Q(!4Q'!4Q' M!4M'!4M&!4M&!4I&!4I%!4I%!4I%!4E%!4E$!4E$!4A$!4A#!4A#!4=#!4=# M!4="!49"!49"!49!!45!!45!!45`!45`!41`!41`!40_!4,_!4,_!4,^!4(^ M!4(^!5TQ!,(3`NL``+H``)(``(```(```(```(```'<``&$#`T<P,$!`0$!` M0$!`0$!`0$!`0$!`0#T]/38V-C`P,#`P,#`P,"XN+B<G)R$A(2`@("`@("`@ M("`@("`@("`@("`@("`@(!,3$P4%`A<5`B8D`R\L!#0Q!#4R!#4Q!#0Q!#0Q M!#0Q`S0P`S,P`S,P`S,O`S(O`S(O`S(N`S$N`S$N`S$N`S`M`S`M`S`M`R\L M`R\L`R\L`R\L`RXK`RXK`RXK`RTJ`RTJ`RTJ`RPI`RPI`RPI`RLI`RLH`RLH M`RHH`RHG`RHG`RHG`RDG`RDF`RDF`R@F`R@E`R@E`R<E`R<D`B<D`B8D`B8D M`B8C`B4C`B4C`B4B`B0B`B0B`B0B`B0A`B,A`B,A`B,@`B(@`B(@`B(?`B$? M`B$?`B$?`B`>`B`>`B`>`A\=`A\=`A\=`A\=`AX<`AX<`AX<`AT;`AT;`AT; M`AP:`AP:`AP:`AL:`AL9`AL9`AH9`AH8`AH8`1D8`1D8`1D7`1D7`1@7`1@6 M`1@6`1<6`1<5`1<5`185`185`184`144`144`143`103`103`103`102`1,2 M`1,2`1,1`1(1`1(1`1(0`1$0`1$0`1$0`1`/`1`/`1`/`0\.`0\.`0\.`0X. M`0X-`0X-`0X-`0T,`0T,`0T,``P+``P+``P+``L+``L*``L*``H*``H)``H) M``D)``D)``D(``D(``@(``@'````=FX(=FX(=6X(=6X(=6T(=&T(=&T(=&P( M<VP(<VP(<VL(<FL(<FL(<FL(<FH(<6H(<6H(<6D(<&D(<&D(<&D(;V@(;V@( M;V@(;F<(;F<(;F<(;68(;68(;68(;&8(;&4(;&4(;&4(:V0(:V0(:V0(:F0( M:F,(:F,(:6,(:6((:6(':&(':&$':&$'9V$'9V$'9V`'9V`'9F`'9E\'9E\' M95\'95\'95X'9%X'9%X'9%T'8UT'8UT'8UP'8EP'8EP'8EP'85L'85L'85L' M85H'8%H'8%H'8%H'7UD'7UD'7UD'7E@'7E@'7E@'75<'75<'75<'7%<'7%8' M7%8'7%8&6U4&6U4&6U4&6E4&6E0&6E0&650&65,&65,&6%,&6%(&6%(&5U(& M5U(&5U$&5E$&5E$&5E`&5E`&55`&55`&54\&5$\&5$\&5$X&4TX&4TX&4TT& M4DT&4DT&4DT&44P&44P&44P&44L&4$L&4$L&4$L&3TH&3TH&3TH&3DD%3DD% M3DD%34@%34@%34@%3$@%3$<%3$<%2T<%2T8%2T8%2T8%2D4%2D4%2D4%244% M240%240%2$0%2$,%2$,%1T,%1T,%1T(%1D(%1D(%1D$%1D$%14$%14`%14`% M1$`%1$`%1#\%0S\%0S\%0SX%0CX%73$$N!<"]@``P@``E```@```@```@``` M@```>0``9P``2RDI0$!`0$!`0$!`0$!`0$!`0$!`/3T]-C8V,#`P,#`P,#`P M+BXN)R<G(2$A("`@("`@("`@("`@("`@("`@(2$A)24E&QL;!@8$$`X!&1@" M'QT")B,#+2H#-3($-3$$-3$$-#$$-#$#-#`#,S`#,S`#,R\#,B\#,B\#,B\# M,2X#,2X#,2X#,"T#,"T#,"T#,"P#+RP#+RP#+RP#+BL#+BL#+BL#+2H#+2H# M+2H#+"H#+"D#+"D#*RD#*R@#*R@#*B@#*B<#*B<#*B<#*2<#*28#*28#*"8# M*"4#*"4#)R4#)R4#)R0")B0")B0")B,")2,")2,")2(")2(")"(")"(")"$" M(R$"(R$"(R`"(B`"(B`"(B`"(1\"(1\"(1\"(!X"(!X"(!X"'QT"'QT"'QT" M'QT"'AP"'AP"'AP"'1L"'1L"'1L"'!L"'!H"'!H"&QH"&QD"&QD"&AD"&A@" M&A@!&A@!&1@!&1<!&1<!&!<!&!8!&!8!%Q8!%Q8!%Q4!%A4!%A4!%A0!%10! M%10!%1,!%!,!%!,!%!,!%!(!$Q(!$Q(!$Q$!$A$!$A$!$A$!$1`!$1`!$1`! M$`\!$`\!$`\!#PX!#PX!#PX!#PX!#@T!#@T!#@T!#0P!#0P!#0P`#`P`#`L` M#`L`"PL`"PH`"PH`"@H`"@D`"@D`"0D`"0D`"0@`"0@`"`@```!V;PEV;@AV M;@AU;@AU;@AU;0AT;0AT;0AT;`AS;`AS;`AS;`AR:PAR:PAR:PAR:@AQ:@AQ M:@AQ:0AP:0AP:0AP:0AO:`AO:`AO:`AN9PAN9PAN9PAM9PAM9@AM9@AM9@AL M90AL90AL90AK9`AK9`AK9`AJ9`AJ8PAJ8PAI8PAI8@AI8@=H8@=H8@=H80=G M80=G80=G8`=G8`=F8`=F7P=F7P=E7P=E7P=E7@=D7@=D7@=D70=C70=C70=C M7`=B7`=B7`=B7`=B6P=A6P=A6P=A6@=@6@=@6@=@6@=?60=?60=?60=>6`=> M6`=>6`==5P==5P==5P=<5P=<5@=<5@=<5@9;509;509;509:509:5`9:5`99 M5`994P994P984P984@984@974@974@974097409640964`964`954`954`95 M3P943P943P943@933@933@9330923092309230913`913`913`912P902P90 M2P902P9/2@9/2@9/2@9.205.205.205-2`5-2`5-2`5,2`5,1P5,1P5,1P5+ M1@5+1@5+1@5*1@5*105*105)105)1`5)1`5(1`5(0P5(0P5'0P5'0P5'0@5& M0@5&0@5&005&005%005%005%0`5$0`5$0`5$/P5#/P5#/P5#/@5=,02N&@+P M`@#(``"5``"```"```"```!_``!Y``!J``!-)"1`0$!`0$!`0$!`0$!`0$!` M0$`]/3TW-S<P,#`P,#`P,#`N+BXG)R<A(2$@("`@("`@("`@("`@("`@("`C M(R,H*"@A(2$&!@4&!@`*"@$/#@$7%0(F(P,V,@0U,@0U,@0U,00T,00T,0,T M,`,S,`,S,`,S+P,R+P,R+P,R+P,Q+@,Q+@,Q+@,Q+0,P+0,P+0,P+0,O+`,O M+`,O+`,N*P,N*P,N*P,M*@,M*@,M*@,L*@,L*0,L*0,K*0,K*`,K*`,K*`,J M*`,J)P,J)P,I)P,I)@,I)@,H)@,H)0,H)0,G)0,G)0,G)`(F)`(F)`(F(P(F M(P(E(P(E(P(E(@(D(@(D(@(D(0(C(0(C(0(C(`(B(`(B(`(B(`(A'P(A'P(A M'P(@'@(@'@(@'@(@'@(?'0(?'0(?'0(>'`(>'`(>'`(=&P(=&P(=&P(<&P(< M&@(<&@(;&@(;&0(;&0(;&0(:&`(:&`(:&`$9&`$9%P$9%P$8%P$8%@$8%@$7 M%@$7%@$7%0$6%0$6%0$6%`$5%`$5%`$5$P$5$P$4$P$4$P$4$@$3$@$3$@$3 M$0$2$0$2$0$2$0$1$`$1$`$1$`$0#P$0#P$0#P$0#@$/#@$/#@$/#@$.#0$. M#0$.#0$-#`$-#`$-#`$,#``,"P`,"P`+"P`+"@`+"@`*"@`*"0`*"0`*"0`) M"0`)"``)"````'=O"79O"79N"'9N"'5N"'5N"'5M"'1M"'1M"'1L"'-L"'-L M"'-L"'-K"')K"')K"')J"'%J"'%J"'%I"'!I"'!I"'!I"&]H"&]H"&]H"&YG M"&YG"&YG"&YG"&UF"&UF"&UF"&QE"&QE"&QE"&MD"&MD"&MD"&ID"&IC"&IC M"&EC"&EB"&EB!VAB!VAB!VAA!VAA!V=A!V=@!V=@!V9@!V9?!V9?!V5?!V5? M!V5>!V1>!V1>!V1=!V-=!V-=!V-=!V-<!V)<!V)<!V);!V%;!V%;!V%:!V!: M!V!:!V!:!U]9!U]9!U]9!UY8!UY8!UY8!UU8!UU7!UU7!UU7!UQ6!UQ6!UQ6 M!EM5!EM5!EM5!EI5!EI4!EI4!EE4!EE3!EE3!EA3!EA3!EA2!EA2!E=2!E=1 M!E=1!E91!E90!E90!E50!E50!E5/!E1/!E1/!E1.!E-.!E-.!E-.!E)-!E)- M!E)-!E),!E%,!E%,!E%+!E!+!E!+!E!+!D]*!D]*!D]*!DY)!4Y)!4Y)!4U) M!4U(!4U(!4U(!4Q'!4Q'!4Q'!4M&!4M&!4M&!4I&!4I%!4I%!4E%!4E$!4E$ M!4A$!4A$!4A#!4=#!4=#!4="!4="!49"!49!!49!!45!!45!!45`!41`!41` M!40_!4,_!4,_!5LQ!*$:`MP#`,8``*0``)```(@``((``'\``'H``&L``$XB M(D!`0$!`0$!`0$!`0$!`0$!`0#T]/3<W-S`P,"\O+RXN+BPL+"4E)2$A(2`@ M("`@("`@("`@("`@("$A(20D)"DI*28F)@<'!P$!``("``@'`1$/`2(@`C8R M!#8R!#4R!#4R!#4Q!#0Q!#0Q`S0P`S,P`S,P`S,P`S(O`S(O`S(O`S$N`S$N M`S$N`S$M`S`M`S`M`S`M`R\L`R\L`R\L`RXK`RXK`RXK`RTJ`RTJ`RTJ`RPJ M`RPI`RPI`RPI`RLH`RLH`RLH`RHH`RHG`RHG`RDG`RDF`RDF`R@F`R@E`R@E M`R<E`R<E`R<D`B8D`B8D`B8C`B8C`B4C`B4C`B4B`B0B`B0B`B0A`B,A`B,A M`B,@`B(@`B(@`B(@`B$?`B$?`B$?`B$>`B`>`B`>`B`>`A\=`A\=`A\=`AX< M`AX<`AX<`AT;`AT;`AT;`AP;`AP:`AP:`AL:`AL9`AL9`AL9`AH9`AH8`AH8 M`1D8`1D7`1D7`1@7`1@6`1@6`1<6`1<6`1<5`185`185`184`184`144`144 M`143`103`103`102`1,2`1,2`1,1`1(1`1(1`1(1`1$0`1$0`1$0`1`/`1`/ M`1`/`1`/`0\.`0\.`0\.`0X-`0X-`0X-`0T,`0T,`0T,`0P,``P+``P+``L+ M``L*``L*``L*``H*``H)``H)``D)``D(````=V\)=V\)=F\)=F\)=FX(=6X( M=6X(=6T(=&T(=&T(=&P(=&P(<VP(<VP(<VL(<FL(<FL(<FH(<6H(<6H(<6H( M<&D(<&D(<&D(;V@(;V@(;V@(;F<(;F<(;F<(;F<(;68(;68(;68(;&4(;&4( M;&4(:V4(:V0(:V0(:F0(:F,(:F,(:6,(:6((:6((:6(':&(':&$':&$'9V$' M9V`'9V`'9F`'9F`'9E\'95\'95\'95X'9%X'9%X'9%T'8UT'8UT'8UT'8UP' M8EP'8EP'8EL'85L'85L'85L'8%H'8%H'8%H'7UD'7UD'7UD'7E@'7E@'7E@' M7E@'75<'75<'75<'7%8'7%8'7%8&6U8&6U4&6U4&6E4&6E0&6E0&650&65,& M65,&6%,&6%,&6%(&6%(&5U(&5U$&5U$&5E$&5E$&5E`&55`&55`&54\&5$\& M5$\&5$X&4TX&4TX&4TX&4TT&4DT&4DT&4DP&44P&44P&44P&4$L&4$L&4$L& M3TH&3TH&3TH&3DD%3DD%3DD%34D%34@%34@%34@%3$<%3$<%3$<%2T<%2T8% M2T8%2D8%2D4%2D4%244%240%240%2$0%2$0%2$,%2$,%1T,%1T(%1T(%1D(% M1D$%1D$%14$%14$%14`%1$`%1$`%1#\%0S\%4S$$A1L"L`0`O@``PP``MP`` MFP``AP``?P``>@``:P``3R$A0$!`0$!`0$!`0$!`0$!`0$!`/3T]-S<W,#`P M+2TM*BHJ)24E(B(B("`@("`@("`@("`@("`@("`@(2$A)"0D*2DI*2DI"@H* M````````"`<!$Q(!)"$#-C,$-C($-C($-3($-3($-3$$-#$$-#$#-#`#,S`# M,S`#,S`#,B\#,B\#,B\#,BX#,2X#,2X#,2T#,"T#,"T#,"T#+RP#+RP#+RP# M+BL#+BL#+BL#+2L#+2H#+2H#+2H#+"D#+"D#+"D#*R@#*R@#*R@#*B@#*B<# M*B<#*2<#*28#*28#*"8#*"8#*"4#)R4#)R4#)R0")R0")B0")B,")B,")2," M)2,")2(")"(")"(")"$"(R$"(R$"(R$"(B`"(B`"(B`"(A\"(1\"(1\"(1X" M(!X"(!X"(!X"'QT"'QT"'QT"'AP"'AP"'AP"'1P"'1L"'1L"'!L"'!H"'!H" M'!H"&QD"&QD"&QD"&AD"&A@"&A@!&1@!&1<!&1<!&!<!&!<!&!8!%Q8!%Q8! M%Q4!%Q4!%A4!%A0!%A0!%10!%10!%1,!%!,!%!,!%!(!$Q(!$Q(!$Q(!$A$! M$A$!$A$!$1`!$1`!$1`!$0\!$`\!$`\!$`\!#PX!#PX!#PX!#@T!#@T!#@T! M#0T!#0P!#0P!#`P`#`L`#`L`#`L`"PH`"PH`"PH`"@H`"@D`"@D`"0D```!W M<`EW;PEW;PEV;PEV;PEV;@AU;@AU;@AU;0AU;0AT;0AT;0AT;`AS;`AS;`AS M:PAR:PAR:PAR:@AQ:@AQ:@AQ:@AP:0AP:0AP:0AO:`AO:`AO:`AO:`AN9PAN M9PAN9PAM9@AM9@AM9@AL90AL90AL90AK90AK9`AK9`AJ9`AJ8PAJ8PAJ8PAI M8PAI8@AI8@=H8@=H80=H80=G80=G8`=G8`=F8`=F8`=F7P=E7P=E7P=E7@=D M7@=D7@=D7@=D70=C70=C70=C7`=B7`=B7`=B6P=A6P=A6P=A6P=@6@=@6@=@ M6@=?60=?60=?60=?6`=>6`=>6`=>6`==5P==5P==5P=<5@=<5@=<5@=;5@9; M509;509:509:5`9:5`995`994P994P994P984P984@984@974@9740974096 M409640964`954`954`953P943P943P943@943@933@933@93309230923092 M3`913`913`913`902P902P902P9/2@9/2@9/2@9.205.205.205.205-2`5- M2`5-2`5,1P5,1P5,1P5+1P5+1@5+1@5*1@5*105*105)105)1`5)1`5)1`5( M1`5(0P5(0P5'0P5'0@5'0@5&0@5&0@5&005%005%005%0`5$0`5$0`5$/P5, M,01J&P*'!`"T``#A``#@``"S``"-``"```!Z``!K``!/(2%`0$!`0$!`0$!` M0$!`0$!`0$`]/3TW-S<Q,3$J*BHD)"0@("`@("`@("`@("`@("`@("`@("`@ M("`A(2$E)24I*2DL+"P.#@X````````*"0$8%@(G)`,W,P0V,P0V,P0V,@0U M,@0U,@0U,00T,00T,0,T,`,S,`,S,`,S,`,S+P,R+P,R+P,R+@,Q+@,Q+@,Q M+@,P+0,P+0,P+0,O+`,O+`,O+`,N*P,N*P,N*P,M*P,M*@,M*@,M*@,L*0,L M*0,L*0,K*0,K*`,K*`,J*`,J)P,J)P,I)P,I)@,I)@,H)@,H)@,H)0,H)0,G M)0,G)`(G)`(F)`(F)`(F(P(E(P(E(P(E(@(D(@(D(@(D(0(C(0(C(0(C(0(B M(`(B(`(B(`(B'P(A'P(A'P(A'P(@'@(@'@(@'@(?'0(?'0(?'0(>'`(>'`(> M'`(='`(=&P(=&P(=&P(<&@(<&@(<&@(;&@(;&0(;&0(:&0(:&`(:&`$9&`$9 M%P$9%P$8%P$8%P$8%@$7%@$7%@$7%0$7%0$6%0$6%`$6%`$5%`$5%`$5$P$4 M$P$4$P$4$@$3$@$3$@$3$@$2$0$2$0$2$0$2$`$1$`$1$`$1#P$0#P$0#P$0 M#P$/#@$/#@$/#@$.#0$.#0$.#0$-#0$-#`$-#`$,#``,"P`,"P`,"P`+"@`+ M"@`+"@`*"@`*"0`*"0```'AP"7=P"7=O"7=O"79O"79O"79N"'5N"'5N"'5M M"'5M"'1M"'1M"'1L"'-L"'-L"'-K"')K"')K"')J"'%J"'%J"'%J"'!I"'!I M"'!I"'!H"&]H"&]H"&]H"&YG"&YG"&YG"&UF"&UF"&UF"&QE"&QE"&QE"&ME M"&MD"&MD"&ID"&IC"&IC"&IC"&EC"&EB"&EB!VAB!VAA!VAA!V=A!V=@!V=@ M!V9@!V9@!V9?!V5?!V5?!V5>!V5>!V1>!V1>!V1=!V-=!V-=!V-<!V)<!V)< M!V);!V%;!V%;!V%;!V!:!V!:!V!:!U]9!U]9!U]9!U]9!UY8!UY8!UY8!UU7 M!UU7!UU7!UQ6!UQ6!UQ6!UM6!EM5!EM5!EI5!EI4!EI4!EI4!EE4!EE3!EE3 M!EA3!EA2!EA2!E=2!E=1!E=1!E91!E91!E90!E50!E50!E5/!E1/!E1/!E1/ M!E1.!E-.!E-.!E--!E)-!E)-!E),!E%,!E%,!E%,!E!+!E!+!E!+!D]*!D]* M!D]*!D]*!DY)!4Y)!4Y)!4U(!4U(!4U(!4Q'!4Q'!4Q'!4M'!4M&!4M&!4I& M!4I%!4I%!4E%!4E%!4E$!4E$!4A$!4A#!4A#!4=#!4="!4="!49"!49"!49! M!45!!45!!45`!41`!41`!4PQ!&<;`G\$`+$``.4``.8``+<``(X``(```'H` M`&L``$\A(4!`0$!`0$!`0#\_/SX^/CP\/#DY.30T-#$Q,2HJ*B0D)"`@("`@ M("`@("`@("`@("`@("$A(2,C(R8F)BHJ*BPL+"\O+QX>'@@("`$!`0L*`1<6 M`A\>`B<D`RPI`S(O!#8S!#8R!#4R!#4R!#4Q!#0Q!#0Q`S0Q`S0P`S,P`S,P M`S,O`S(O`S(O`S(N`S$N`S$N`S$N`S`M`S`M`S`M`R\L`R\L`R\L`RXK`RXK M`RXK`RXK`RTJ`RTJ`RTJ`RPI`RPI`RPI`RLI`RLH`RLH`RHH`RHG`RHG`RDG M`RDF`RDF`RDF`R@F`R@E`R@E`R<E`R<D`B<D`B8D`B8D`B8C`B4C`B4C`B4B M`B0B`B0B`B0A`B,A`B,A`B,A`B,@`B(@`B(@`B(?`B$?`B$?`B$?`B`>`B`> M`B`>`A\=`A\=`A\=`AX<`AX<`AX<`AX<`AT;`AT;`AT;`AP:`AP:`AP:`AL: M`AL9`AL9`AH9`AH8`AH8`1D8`1D7`1D7`1@7`1@7`1@6`1@6`1<6`1<5`1<5 M`185`185`184`144`144`143`103`103`102`1,2`1,2`1,2`1,1`1(1`1(1 M`1(0`1$0`1$0`1$0`1`/`1`/`1`/`0\.`0\.`0\.`0X-`0X-`0X-`0T-`0T, M`0T,`0T,``P+``P+``P+``L+``L*``L*``H*``H)````>'`)>'`)=W`)=W`) M=V\)=F\)=F\)=FX(=FX(=6X(=6T(=6T(=&T(=&T(=&P(<VP(<VP(<VL(<FL( M<FL(<FL(<6H(<6H(<6H(<6D(<&D(<&D(<&@(;V@(;V@(;V@(;F<(;F<(;F<( M;68(;68(;68(;&8(;&4(;&4(:V4(:V0(:V0(:V0(:F,(:F,(:F,(:6,(:6(( M:6(':&(':&$':&$'9V$'9V$'9V`'9F`'9F`'9E\'9E\'95\'95X'95X'9%X' M9%X'9%T'8UT'8UT'8UP'8EP'8EP'8EP'85L'85L'85L'8%H'8%H'8%H'8%D' M7UD'7UD'7UD'7E@'7E@'7E@'75<'75<'75<'7%<'7%8'7%8'6U8&6U4&6U4& M6U4&6E0&6E0&6E0&650&65,&65,&6%,&6%(&6%(&5U(&5U(&5U$&5E$&5E$& M5E`&55`&55`&54\&54\&5$\&5$\&5$X&4TX&4TX&4TT&4DT&4DT&4DT&44P& M44P&44P&4$L&4$L&4$L&4$H&3TH&3TH&3TH&3DD%3DD%3DD%34@%34@%34@% M3$@%3$<%3$<%2T<%2T8%2T8%2D8%2D4%2D4%2D4%244%240%240%2$0%2$,% M2$,%1T,%1T,%1T(%1D(%1D(%1D$%14$%14$%14`%14`%33$$9AL"?P4`L``` MXP``Y0``MP``CP``@```>@``:P``3R$A0$!`/S\_0$!`0$!`/#P\-S<W,S,S M,3$Q,#`P*RLK(R,C("`@("`@("`@("`@("`@("`@(R,C*"@H+"PL+BXN+R\O M+R\O+2TM(B(B"`@(!04`#0P!$A$!%Q4"(1\"+BL#-C,$-C,$-C($-3($-3($ M-3$$-#$$-#$$-#$#-#`#,S`#,S`#,R\#,B\#,B\#,BX#,2X#,2X#,2X#,"T# M,"T#,"T#+RP#+RP#+RP#+RP#+BL#+BL#+BL#+2H#+2H#+2H#+"D#+"D#+"D# M*RD#*R@#*R@#*B@#*B<#*B<#*2<#*2<#*28#*28#*"8#*"4#*"4#)R4#)R0" M)R0")B0")B0")B,")2,")2,")2(")"(")"(")"(")"$"(R$"(R$"(R`"(B`" M(B`"(A\"(1\"(1\"(1\"(!X"(!X"(!X"'QT"'QT"'QT"'AT"'AP"'AP"'AP" M'1L"'1L"'1L"'!H"'!H"'!H"&QH"&QD"&QD"&AD"&A@"&A@!&1@!&1@!&1<! M&1<!&!<!&!8!&!8!%Q8!%Q4!%Q4!%A4!%A4!%A0!%10!%10!%1,!%!,!%!,! M%!,!$Q(!$Q(!$Q(!$Q$!$A$!$A$!$A`!$1`!$1`!$1`!$`\!$`\!$`\!#PX! M#PX!#PX!#@X!#@T!#@T!#@T!#0P!#0P!#0P`#`L`#`L`#`L`"PL`"PH`"PH` M"@H```!X<0EX<`EX<`EW<`EW<`EW;PEW;PEV;PEV;@AV;@AU;@AU;@AU;0AT M;0AT;0AT;`AS;`AS;`AS:PAR:PAR:PAR:PAQ:@AQ:@AQ:@AQ:0AP:0AP:0AP M:0AO:`AO:`AO:`AN9PAN9PAN9PAM9@AM9@AM9@AL9@AL90AL90AL90AK9`AK M9`AK9`AJ9`AJ8PAJ8PAI8PAI8@AI8@=H8@=H80=H80=G80=G80=G8`=F8`=F M8`=F7P=F7P=E7P=E7P=E7@=D7@=D7@=D70=C70=C70=C7`=B7`=B7`=B7`=A M6P=A6P=A6P=A6@=@6@=@6@=@6@=?60=?60=?60=>6`=>6`=>6`==5P==5P== M5P=<5P=<5@=<5@=;5@9;509;509;509:5`9:5`9:5`995`994P994P984P98 M4@984@974@974@974096409640964`964`954`953P953P943P943P943@93 M3@933@9330923092309230913`913`913`902P902P902P902@9/2@9/2@9/ M2@9.205.205.205-2`5-2`5-2`5,2`5,1P5,1P5+1P5+1@5+1@5+1@5*105* M105*105)105)1`5)1`5(1`5(0P5(0P5'0P5'0P5'0@5&0@5&0@5&005%005% M005%0`5-,@1C'P)Y#`&K!0#A`@#E``"W``"0``"```!Z``!J``!/(2%`0$`_ M/S\_/S\_/S\Y.3DR,C(P,#`P,#`P,#`K*RLD)"0@("`@("`@("`@("`@("`@ M("`D)"0M+2TP,#`P,#`P,#`P,#`P,#`N+BX4%!0!`0`$!``("`$.#0$;&@(K M*0,T,00S,`0R+P0S+P0T,00U,@0U,00U,00T,00T,0,T,`,S,`,S,`,S+P,R M+P,R+P,R+P,Q+@,Q+@,Q+@,P+0,P+0,P+0,P+`,O+`,O+`,O+`,N*P,N*P,N M*P,M*@,M*@,M*@,L*@,L*0,L*0,K*0,K*`,K*`,J*`,J)P,J)P,J)P,I)P,I M)@,I)@,H)@,H)0,H)0,G)0,G)0,G)`(F)`(F)`(F(P(E(P(E(P(E(@(E(@(D M(@(D(@(D(0(C(0(C(0(C(`(B(`(B(`(B(`(A'P(A'P(A'P(@'@(@'@(@'@(? M'0(?'0(?'0(?'0(>'`(>'`(>'`(=&P(=&P(=&P(<&P(<&@(<&@(;&@(;&0(; M&0(:&0(:&`(:&`$:&`$9&`$9%P$9%P$8%P$8%@$8%@$7%@$7%@$7%0$6%0$6 M%0$6%`$5%`$5%`$5$P$4$P$4$P$4$P$4$@$3$@$3$@$3$0$2$0$2$0$2$`$1 M$`$1$`$1$`$0#P$0#P$0#P$/#@$/#@$/#@$/#@$.#0$.#0$.#0$-#`$-#`$- M#``,"P`,"P`,"P`+"P`+"@`+"@```'EQ"7AQ"7AQ"7AP"7AP"7=P"7=O"7=O M"79O"79N"'9N"'5N"'5N"'5M"'1M"'1M"'1L"'-L"'-L"'-K"')K"')K"')K M"')J"'%J"'%J"'%I"'!I"'!I"'!I"&]H"&]H"&]H"&YG"&YG"&YG"&UF"&UF M"&UF"&UF"&QE"&QE"&QE"&MD"&MD"&MD"&ID"&IC"&IC"&EC"&EB"&EB!VAB M!VAA!VAA!V=A!V=A!V=@!V=@!V9@!V9?!V9?!V5?!V5?!V5>!V1>!V1>!V1= M!V-=!V-=!V-<!V)<!V)<!V)<!V);!V%;!V%;!V%:!V!:!V!:!V!:!U]9!U]9 M!U]9!UY8!UY8!UY8!UU7!UU7!UU7!UQ7!UQ6!UQ6!UQ6!EM5!EM5!EM5!EI5 M!EI4!EI4!EE4!EE3!EE3!EA3!EA2!EA2!E=2!E=2!E=1!E=1!E91!E90!E90 M!E50!E50!E5/!E1/!E1/!E1.!E-.!E-.!E--!E)-!E)-!E)-!E%,!E%,!E%, M!E%+!E!+!E!+!E!+!D]*!D]*!D]*!DY)!4Y)!4Y)!4U(!4U(!4U(!4Q(!4Q' M!4Q'!4Q'!4M&!4M&!4M&!4I&!4I%!4I%!4E%!4E$!4E$!4A$!4A#!4A#!4=# M!4=#!4="!49"!49"!49!!49!!45!!4LY!%8M!&8B`YD5`M@(`>4!`+@``)`` M`(```'H``&H``$\A(4!`0#\_/S\_/S\_/SDY.3(R,C`P,#`P,#`P,"LK*R0D M)"`@("`@("`@("`@("`@("`@("0D)"TM+3`P,#`P,#`P,#`P,#`P,#`P,!X> M'@,#`P````("``8%`!<5`B@F`S(P!"XJ`R@F`RDG`R\L`S8R!#4R!#4R!#4Q M!#0Q!#0Q`S0P`S,P`S,P`S,O`S(O`S(O`S(O`S$N`S$N`S$N`S`M`S`M`S`M M`S`M`R\L`R\L`R\L`RXK`RXK`RXK`RTJ`RTJ`RTJ`RPJ`RPI`RPI`RLI`RLH M`RLH`RLH`RHG`RHG`RHG`RDG`RDF`RDF`R@F`R@E`R@E`R<E`R<E`R<D`B8D M`B8D`B8C`B4C`B4C`B4B`B4B`B0B`B0B`B0A`B,A`B,A`B,@`B(@`B(@`B(@ M`B$?`B$?`B$?`B`>`B`>`B`>`B`=`A\=`A\=`A\=`AX<`AX<`AX<`AT;`AT; M`AT;`AP;`AP:`AP:`AL:`AL9`AL9`AH9`AH8`AH8`AH8`1D8`1D7`1D7`1@7 M`1@6`1@6`1<6`1<6`1<5`185`185`184`144`144`143`143`103`103`102 M`1,2`1,2`1,1`1(1`1(1`1(1`1$0`1$0`1$0`1`/`1`/`1`/`0\.`0\.`0\. M`0\.`0X-`0X-`0X-`0T,`0T,`0T,``P,``P+``P+``L+``L*````>7$)>7$) M>'$)>'$)>'`)>'`)=W`)=V\)=V\)=F\)=FX(=FX(=6X(=6X(=6T(=&T(=&T( M=&P(<VP(<VP(<VP(<VL(<FL(<FL(<FH(<6H(<6H(<6D(<&D(<&D(<&D(;V@( M;V@(;V@(;F<(;F<(;F<(;6<(;68(;68(;68(;&4(;&4(;&4(:V0(:V0(:V0( M:F0(:F,(:F,(:6,(:6((:6(':&(':&(':&$':&$'9V$'9V`'9V`'9F`'9E\' M9E\'95\'95\'95X'9%X'9%X'9%T'8UT'8UT'8UT'8EP'8EP'8EP'8EL'85L' M85L'85H'8%H'8%H'8%H'7UD'7UD'7UD'7E@'7E@'7E@'75@'75<'75<'75<' M7%8'7%8'7%8&6U4&6U4&6U4&6E4&6E0&6E0&650&65,&65,&6%,&6%,&6%(& M5U(&5U(&5U$&5U$&5E$&5E`&5E`&55`&55`&54\&5$\&5$\&5$X&4TX&4TX& M4TX&4DT&4DT&4DT&4DP&44P&44P&44L&4$L&4$L&4$L&3TH&3TH&3TH&3DD% M3DD%3DD%34D%34@%34@%3$@%3$<%3$<%3$<%2T8%2T8%2T8%2D8%2D4%2D4% M244%240%240%2$0%2$0%2$,%1T,%1T,%1T(%1T(%1D(%1D$%1D$%1C\%2#P% M4S8$BR,#T`X!Y0$`N@``D@``@0``>@``:@``3R$A0$!`/S\_/S\_/S\_.3DY M,C(R,#`P,#`P,#`P*RLK)"0D("`@("`@("`@("`@("`@("`@)24E+2TM,#`P M,#`P,#`P,#`P,#`P,#`P*"@H"0D)````````````#@T!(!X")B,#(!X"'AP" M(R$#*RD#-C($-C($-3($-3($-3$$-#$$-#$#-#`#,S`#,S`#,R\#,B\#,B\# M,B\#,2X#,2X#,2X#,2T#,"T#,"T#,"T#+RP#+RP#+RP#+BL#+BL#+BL#+2H# M+2H#+2H#+"H#+"D#+"D#+"D#*R@#*R@#*R@#*B@#*B<#*B<#*2<#*28#*28# M*"8#*"4#*"4#)R4#)R4#)R0")B0")B0")B,")B,")2,")2,")2(")"(")"(" M)"$"(R$"(R$"(R`"(B`"(B`"(B`"(1\"(1\"(1\"(1X"(!X"(!X"(!X"'QT" M'QT"'QT"'AP"'AP"'AP"'1L"'1L"'1L"'!L"'!H"'!H"&QH"&QD"&QD"&QD" M&AD"&A@"&A@!&1@!&1<!&1<!&!<!&!8!&!8!%Q8!%Q8!%Q4!%A4!%A4!%A0! M%A0!%10!%10!%1,!%!,!%!,!%!(!$Q(!$Q(!$Q$!$A$!$A$!$A$!$1`!$1`! M$1`!$`\!$`\!$`\!$`\!#PX!#PX!#PX!#@T!#@T!#@T!#0P!#0P!#0P!#`P` M#`L`#`L`"PL```!Y<@EY<0EY<0EY<0EX<0EX<`EX<`EW<`EW;PEW;PEV;PEV M;PEV;@AU;@AU;@AU;0AT;0AT;0AT;`AT;`AS;`AS;`AS:PAR:PAR:PAR:@AQ M:@AQ:@AQ:@AP:0AP:0AP:0AO:`AO:`AO:`AN9PAN9PAN9PAN9PAM9@AM9@AM M9@AL90AL90AL90AK90AK9`AK9`AJ9`AJ8PAJ8PAI8PAI8@AI8@=I8@=H8@=H M80=H80=G80=G8`=G8`=F8`=F8`=F7P=E7P=E7P=E7@=D7@=D7@=D70=C70=C M70=C70=C7`=B7`=B7`=B6P=A6P=A6P=A6P=@6@=@6@=@6@=?60=?60=?60=> M6`=>6`=>6`=>6`==5P==5P==5P=<5@=<5@=<5@9;5@9;509;509:509:5`9: M5`995`994P994P984P984P984@984@974@974097409640964`964`954`95 M4`953P943P943P943@933@933@933@933092309230923`913`913`912P90 M2P902P902P9/2@9/2@9/2@9.205.205.205-205-2`5-2`5-2`5,1P5,1P5, M1P5+1@5+1@5+1@5*1@5*105*105)105)1`5)1`5(1`5(1`5(0P5(0P5'0P5' M0@5'0@5&0@5&005&005%005+/@6'*0/-$0'J`@#-``"O``"?``"6``!Y``!2 M("!`0$`_/S\_/S\^/CXX.#@R,C(P,#`P,#`P,#`K*RLD)"0@("`@("`@("`@ M("`@("`@("`E)24M+2TP,#`P,#`P,#`P,#`P,#`P,#`M+2T9&1D&!@8!`0$` M```$!``*"0$,"P$(!P$5%`(C(0,M*@,V,P0V,@0V,@0U,@0U,@0U,00T,00T M,0,T,`,S,`,S,`,S,`,R+P,R+P,R+P,R+@,Q+@,Q+@,Q+0,P+0,P+0,P+0,O M+`,O+`,O+`,N*P,N*P,N*P,M*P,M*@,M*@,L*@,L*0,L*0,L*0,K*`,K*`,K M*`,J*`,J)P,J)P,I)P,I)@,I)@,H)@,H)@,H)0,G)0,G)0,G)`(G)`(F)`(F M(P(F(P(E(P(E(P(E(@(D(@(D(@(D(0(C(0(C(0(C(0(B(`(B(`(B(`(A'P(A M'P(A'P(A'@(@'@(@'@(@'@(?'0(?'0(?'0(>'`(>'`(>'`(='`(=&P(=&P(< M&P(<&@(<&@(<&@(;&0(;&0(;&0(:&0(:&`(:&`$9&`$9%P$9%P$8%P$8%P$8 M%@$7%@$7%@$7%0$6%0$6%0$6%`$6%`$5%`$5%`$5$P$4$P$4$P$4$@$3$@$3 M$@$3$@$2$0$2$0$2$0$1$`$1$`$1$`$1#P$0#P$0#P$0#P$/#@$/#@$/#@$. M#0$.#0$.#0$-#`$-#`$-#`$,#``,"P`,"P```'IR"7IR"7ER"7EQ"7EQ"7AQ M"7AP"7AP"7=P"7=O"7=O"79O"79O"79N"'5N"'5N"'5M"'1M"'1M"'1M"'1L M"'-L"'-L"'-K"')K"')K"')J"'%J"'%J"'%J"'!I"'!I"'!I"&]H"&]H"&]H M"&]G"&YG"&YG"&YG"&UF"&UF"&UF"&QE"&QE"&QE"&ME"&MD"&MD"&ID"&IC M"&IC"&EC"&EB"&EB"&EB!VAB!VAA!VAA!V=A!V=@!V=@!V9@!V9@!V9?!V5? M!V5?!V5>!V1>!V1>!V1=!V1=!V-=!V-=!V-<!V)<!V)<!V);!V%;!V%;!V%; M!V!:!V!:!V!:!U]9!U]9!U]9!UY8!UY8!UY8!UY8!UU7!UU7!UU7!UQ6!UQ6 M!UQ6!UM6!EM5!EM5!EI5!EI4!EI4!EE4!EE3!EE3!EE3!EA3!EA2!EA2!E=2 M!E=1!E=1!E91!E91!E90!E50!E50!E5/!E1/!E1/!E1.!E-.!E-.!E-.!E-- M!E)-!E)-!E),!E%,!E%,!E%,!E!+!E!+!E!+!D]*!D]*!D]*!DY)!4Y)!4Y) M!4Y)!4U(!4U(!4U(!4Q'!4Q'!4Q'!4M'!4M&!4M&!4I&!4I%!4I%!4E%!4E$ M!4E$!4A$!4A$!4A#!4A#!4=#!4="!4="!49"!49"!49!!4L^!8<J`\X1`?$" M`.<``-H``-$``,,``)8``%L:&D`^/C\_/S\_/ST]/3<W-S(R,C`P,#`P,#`P M,"LK*R0D)"`@("`@("`@("`@("`@("`@("4E)2TM+3`P,#`P,#`P,#`P,#`P M,#`P,#`P,#8V-CL[.SHZ.C<W-S(R,BHJ*A<7%P,#`A<5`B<E`R\L`S<S!#8S M!#8S!#8R!#4R!#4R!#4Q!#0Q!#0Q`S0P`S,P`S,P`S,P`S,O`S(O`S(O`S(N M`S$N`S$N`S$N`S`M`S`M`S`M`R\L`R\L`R\L`RXK`RXK`RXK`RTK`RTJ`RTJ M`RTJ`RPI`RPI`RPI`RLI`RLH`RLH`RHH`RHG`RHG`RDG`RDF`RDF`R@F`R@F M`R@E`R@E`R<E`R<D`B<D`B8D`B8C`B8C`B4C`B4C`B4B`B0B`B0B`B0A`B,A M`B,A`B,A`B(@`B(@`B(@`B(?`B$?`B$?`B$>`B`>`B`>`B`>`A\=`A\=`A\= M`AX<`AX<`AX<`AT<`AT;`AT;`AT;`AP:`AP:`AP:`AL9`AL9`AL9`AH9`AH8 M`AH8`1D8`1D7`1D7`1@7`1@7`1@6`1<6`1<6`1<5`1<5`185`184`184`144 M`144`143`103`103`102`1,2`1,2`1,2`1(1`1(1`1(1`1(0`1$0`1$0`1$/ M`1`/`1`/`1`/`0\.`0\.`0\.`0X-`0X-`0X-`0T-`0T,`0T,`0P,``P+```` M>G()>G()>G()>7()>7$)>7$)>'$)>'`)>'`)=W`)=V\)=V\)=F\)=F\)=FX( M=6X(=6X(=6T(=6T(=&T(=&T(=&P(<VP(<VP(<VL(<FL(<FL(<FH(<6H(<6H( M<6H(<&D(<&D(<&D(<&@(;V@(;V@(;V@(;F<(;F<(;F<(;68(;68(;68(;&4( M;&4(;&4(:V4(:V0(:V0(:F0(:F,(:F,(:F,(:6,(:6((:6(':&(':&$':&$' M9V$'9V`'9V`'9F`'9F`'9E\'95\'95\'95X'95X'9%X'9%X'9%T'8UT'8UT' M8UP'8EP'8EP'8EL'85L'85L'85L'8%H'8%H'8%H'7UD'7UD'7UD'7UD'7E@' M7E@'7E@'75<'75<'75<'7%8'7%8'7%8'6U8&6U4&6U4&6E4&6E0&6E0&6E0& M650&65,&65,&6%,&6%(&6%(&5U(&5U$&5U$&5E$&5E$&5E`&55`&55`&54\& M5$\&5$\&5$\&5$X&4TX&4TX&4TT&4DT&4DT&4DP&44P&44P&44P&4$L&4$L& M4$L&3TH&3TH&3TH&3TH&3DD%3DD%3DD%34@%34@%34@%3$<%3$<%3$<%2T<% M2T8%2T8%2D8%2D4%2D4%244%244%240%240%2$0%2$,%2$,%1T,%1T(%1T(% M1D(%1D(%3#X%ABH#SA$!^0(`_0``_@``^0``Y0``M@``;!(20SP\0$!`/S\_ M.SL[-C8V,C(R,#`P,#`P,#`P*RLK)"0D("`@("`@("`@("`@("`@("`@)B8F M+2TM,#`P,#`P,#`P,#`P,#`P,#`P,#`P.#@X/S\_0$!`0$!`/3T].SL[,3$Q M"`@(%Q4"*28#,2\$-S,$-S,$-C,$-C,$-C($-3($-3($-3$$-#$$-#$#-#`# M,S`#,S`#,S`#,R\#,B\#,B\#,BX#,2X#,2X#,2X#,"T#,"T#,"T#+RP#+RP# M+RP#+BL#+BL#+BL#+BL#+2H#+2H#+2H#+"D#+"D#+"D#*RD#*R@#*R@#*B@# M*B<#*B<#*2<#*28#*28#*"8#*"8#*"4#*"4#)R4#)R0")R0")B0")B0")B," M)2,")2,")2(")"(")"(")"$"(R$"(R$"(R$"(R`"(B`"(B`"(A\"(1\"(1\" M(1\"(!X"(!X"(!X"'QT"'QT"'QT"'AP"'AP"'AP"'1P"'1L"'1L"'1L"'!H" M'!H"'!H"&QH"&QD"&QD"&AD"&A@"&A@!&1@!&1<!&1<!&!<!&!<!&!8!&!8! M%Q8!%Q4!%Q4!%A4!%A4!%A0!%10!%10!%1,!%!,!%!,!%!(!$Q(!$Q(!$Q(! M$A$!$A$!$A$!$A`!$1`!$1`!$1`!$`\!$`\!$`\!#PX!#PX!#PX!#@T!#@T! M#@T!#0T!#0P!#0P!#0P```![<PEZ<@EZ<@EZ<@EY<@EY<0EY<0EX<0EX<`EX M<`EW<`EW<`EW;PEV;PEV;PEV;@AV;@AU;@AU;0AU;0AT;0AT;0AT;`AS;`AS M;`AS:PAR:PAR:PAR:PAQ:@AQ:@AQ:@AP:0AP:0AP:0AP:`AO:`AO:`AO:`AN M9PAN9PAN9PAM9@AM9@AM9@AL9@AL90AL90AK90AK9`AK9`AK9`AJ8PAJ8PAJ M8PAI8PAI8@AI8@=H8@=H80=H80=G80=G80=G8`=F8`=F8`=F7P=E7P=E7P=E M7@=E7@=D7@=D7@=D70=C70=C70=C7`=B7`=B7`=B7`=A6P=A6P=A6P=@6@=@ M6@=@6@=@60=?60=?60=?60=>6`=>6`=>6`==5P==5P==5P=<5P=<5@=<5@=; M5@9;509;509:509:5`9:5`9:5`995`994P994P984P984@984@974@974@97 M4096409640964`954`954`953P953P943P943P943@933@933@9330923092 M30923`913`913`913`902P902P902P9/2@9/2@9/2@9/2@9.205.205.205- M2`5-2`5-2`5,1P5,1P5,1P5+1P5+1@5+1@5*1@5*105*105*105)105)1`5) M1`5(1`5(0P5(0P5'0P5'0@5'0@5&0@5*/P5U*P.J$0'3`@#G``#V``#R``#> M``"V``!X!`12(B)#.3D^/CXY.3DU-34Q,3$P,#`P,#`P,#`K*RLD)"0@("`@ M("`@("`A(2$C(R,E)24K*RLN+BXP,#`P,#`P,#`P,#`P,#`P,#`S,S,[.SL_ M/S\^/CX^/CX\/#PY.3DQ,3$/#P\4$P$I)@,T,`0W-`0W,P0W,P0V,P0V,P0V M,@0U,@0U,@0U,00T,00T,0,T,0,T,`,S,`,S,`,S+P,R+P,R+P,R+@,Q+@,Q M+@,Q+@,P+0,P+0,P+0,O+`,O+`,O+`,O+`,N*P,N*P,N*P,M*@,M*@,M*@,L M*0,L*0,L*0,K*0,K*`,K*`,J*`,J)P,J)P,I)P,I)P,I)@,I)@,H)@,H)0,H M)0,G)0,G)`(G)`(F)`(F)`(F(P(E(P(E(P(E(@(D(@(D(@(D(@(D(0(C(0(C M(0(C(`(B(`(B(`(B'P(A'P(A'P(A'P(@'@(@'@(@'@(?'0(?'0(?'0(>'0(> M'`(>'`(>'`(=&P(=&P(=&P(<&@(<&@(<&@(;&@(;&0(;&0(:&0(:&`(:&`$9 M&`$9&`$9%P$9%P$8%P$8%@$8%@$7%@$7%0$7%0$6%0$6%0$6%`$5%`$5%`$5 M$P$4$P$4$P$4$P$3$@$3$@$3$@$3$0$2$0$2$0$2$`$1$`$1$`$1$`$0#P$0 M#P$0#P$/#@$/#@$/#@$.#@$.#0$.#0$.#0$-#`$-#`$``'MS"7MS"7IS"7IR M"7IR"7ER"7EQ"7EQ"7AQ"7AP"7AP"7=P"7=P"7=O"7=O"79O"79N"'9N"'5N M"'5N"'5M"'1M"'1M"'1L"'-L"'-L"'-K"')K"')K"')K"'%J"'%J"'%J"'%I M"'!I"'!I"'!I"&]H"&]H"&]H"&YG"&YG"&YG"&UF"&UF"&UF"&QF"&QE"&QE M"&QE"&MD"&MD"&MD"&IC"&IC"&IC"&EC"&EB"&EB!VAB!VAA!VAA!V=A!V=A M!V=@!V9@!V9@!V9?!V9?!V5?!V5>!V5>!V1>!V1>!V1=!V-=!V-=!V-<!V)< M!V)<!V)<!V%;!V%;!V%;!V%:!V!:!V!:!V!9!U]9!U]9!U]9!UY8!UY8!UY8 M!UU7!UU7!UU7!UQ7!UQ6!UQ6!UM6!EM5!EM5!EM5!EI4!EI4!EI4!EE4!EE3 M!EE3!EA3!EA2!EA2!E=2!E=2!E=1!E91!E91!E90!E90!E50!E5/!E5/!E1/ M!E1/!E1.!E-.!E-.!E--!E)-!E)-!E)-!E%,!E%,!E%,!E!+!E!+!E!+!E!* M!D]*!D]*!D]*!DY)!4Y)!4Y)!4U(!4U(!4U(!4Q(!4Q'!4Q'!4M'!4M&!4M& M!4M&!4I%!4I%!4I%!4E%!4E$!4E$!4A$!4A#!4A#!4=#!4=#!4="!4@_!6(L M`X01`:L!`-0``/0``.H``-(``*X``($``&@#`T\A(3X^/C@X.#0T-#$Q,3`P M,#`P,#`P,"LK*R,C(R`@("`@("`@("(B(B<G)RPL+"XN+B\O+S`P,#`P,#`P M,#`P,#`P,#`P,#8V-CT]/3\_/SX^/CX^/CP\/#@X.#$Q,1<7%P\.`2<E`S4Q M!#@T!#<T!#<T!#<S!#8S!#8S!#8R!#4R!#4R!#4Q!#4Q!#0Q!#0Q`S0P`S,P M`S,P`S,O`S(O`S(O`S(O`S$N`S$N`S$N`S`M`S`M`S`M`R\L`R\L`R\L`R\L M`RXK`RXK`RXK`RTJ`RTJ`RTJ`RPJ`RPI`RPI`RLI`RLH`RLH`RHH`RHG`RHG M`RHG`RDG`RDF`RDF`R@F`R@E`R@E`R<E`R<E`R<D`B8D`B8D`B8C`B4C`B4C M`B4B`B0B`B0B`B0B`B0A`B,A`B,A`B,@`B(@`B(@`B(?`B$?`B$?`B$?`B`> M`B`>`B`>`A\=`A\=`A\=`A\=`AX<`AX<`AX<`AT;`AT;`AT;`AP:`AP:`AP: M`AL:`AL9`AL9`AH9`AH8`AH8`1D8`1D8`1D7`1D7`1@7`1@6`1@6`1<6`1<5 M`1<5`185`185`184`144`144`143`103`103`103`102`1,2`1,2`1,1`1(1 M`1(1`1(0`1$0`1$0`1$0`1`/`1`/`1`/`0\.`0\.`0\.`0X.`0X-`0X-`0X- M`0T,`0``>W,)>W,)>W,)>G,)>G()>G()>7()>7$)>7$)>'$)>'`)>'`)=W`) M=W`)=V\)=V\)=F\)=FX(=FX(=6X(=6X(=6T(=&T(=&T(=&P(<VP(<VP(<VL( M<FL(<FL(<FL(<FH(<6H(<6H(<6D(<&D(<&D(<&D(;V@(;V@(;V@(;F<(;F<( M;F<(;68(;68(;68(;&8(;&4(;&4(;&4(:V0(:V0(:V0(:F0(:F,(:F,(:6,( M:6((:6(':&(':&$':&$'9V$'9V$'9V`'9V`'9F`'9E\'9E\'95\'95\'95X' M9%X'9%X'9%T'8UT'8UT'8UP'8EP'8EP'8EP'85L'85L'85L'85H'8%H'8%H' M8%H'7UD'7UD'7UD'7E@'7E@'7E@'75<'75<'75<'7%<'7%8'7%8'7%8&6U4& M6U4&6U4&6E4&6E0&6E0&650&65,&65,&6%,&6%(&6%(&5U(&5U(&5U$&5E$& M5E$&5E`&5E`&55`&55`&54\&5$\&5$\&5$X&4TX&4TX&4TT&4DT&4DT&4DT& M44P&44P&44P&44L&4$L&4$L&4$L&3TH&3TH&3TH&3DD%3DD%3DD%34@%34@% M34@%3$@%3$<%3$<%3$<%2T8%2T8%2T8%2D8%2D4%2D4%244%240%240%2$0% M2$,%2$,%1T,%1T,%23\%6BP#<!(!E`(`R```]0``X@``P0``H```@P``<``` M6`\/0#L[.#@X-#0T,3$Q+R\O+R\O+BXN*"@H(B(B("`@("`@("`@(B(B*2DI M,#`P,#`P,#`P,#`P,#`P,#`P,#`P,3$Q,S,S.3DY/CX^/CX^/CX^/#P\.3DY M-34U,3$Q(2$A#@X'(B`$,2\$-#$$-3$$-C,$-S0$-S,$-C,$-C,$-C($-C($ M-3($-3$$-3$$-#$$-#$#-#`#,S`#,S`#,R\#,B\#,B\#,B\#,2X#,2X#,2X# M,"T#,"T#,"T#,"P#+RP#+RP#+RP#+BL#+BL#+BL#+2H#+2H#+2H#+"H#+"D# M+"D#*RD#*R@#*R@#*R@#*B<#*B<#*B<#*2<#*28#*28#*"8#*"4#*"4#)R4# M)R4#)R0")B0")B0")B,")2,")2,")2(")2(")"(")"(")"$"(R$"(R$"(R`" M(B`"(B`"(B`"(1\"(1\"(1\"(!X"(!X"(!X"(!T"'QT"'QT"'QT"'AP"'AP" M'AP"'1L"'1L"'1L"'!L"'!H"'!H"&QH"&QD"&QD"&AD"&A@"&A@"&A@!&1@! M&1<!&1<!&!<!&!8!&!8!%Q8!%Q8!%Q4!%A4!%A4!%A0!%10!%10!%1,!%1,! M%!,!%!,!%!(!$Q(!$Q(!$Q$!$A$!$A$!$A$!$1`!$1`!$1`!$`\!$`\!$`\! M#PX!#PX!#PX!#PX!#@T!#@T!#@T!``!\=`E[<PE[<PE[<PEZ<PEZ<@EZ<@EY M<@EY<0EY<0EX<0EX<0EX<`EX<`EW<`EW;PEW;PEV;PEV;@AV;@AU;@AU;@AU M;0AT;0AT;0AT;`AS;`AS;`AS;`AS:PAR:PAR:PAR:@AQ:@AQ:@AQ:0AP:0AP M:0AP:0AO:`AO:`AO:`AN9PAN9PAN9PAM9PAM9@AM9@AM9@AL90AL90AL90AK M9`AK9`AK9`AJ9`AJ8PAJ8PAI8PAI8@AI8@=H8@=H8@=H80=H80=G80=G8`=G M8`=F8`=F7P=F7P=E7P=E7P=E7@=D7@=D7@=D70=C70=C70=C70=B7`=B7`=B M7`=B6P=A6P=A6P=A6@=@6@=@6@=@6@=?60=?60=?60=>6`=>6`=>6`==6`== M5P==5P==5P=<5@=<5@=<5@9;509;509;509:509:5`9:5`995`994P994P98 M4P984P984@974@974@974097409640964`964`954`954`953P943P943P94 M3@933@933@933@923092309230923`913`913`912P902P902P902P9/2@9/ M2@9/2@9.205.205.205-2`5-2`5-2`5,2`5,1P5,1P5,1P5+1@5+1@5+1@5* M1@5*105*105)105)1`5)1`5(1`5(0P5(0P5'0P5)0`5;*P-P$P&3`@#(``#W M``#<``"T``"5``"```!R``!<"0E#-S<X.#@T-#0Q,3$M+2TK*RLG)R<D)"0A M(2$@("`@("`@("`C(R,J*BHP,#`P,#`P,#`P,#`P,#`P,#`Q,3$U-34X.#@\ M/#P^/CX^/CX[.SLW-S<T-#0R,C(P,#`L+"P?'Q\:&0LA'P,I)P,O+`,T,00W M-`0W-`0W,P0V,P0V,P0V,@0V,@0U,@0U,@0U,00T,00T,0,T,`,S,`,S,`,S M+P,R+P,R+P,R+P,Q+@,Q+@,Q+@,Q+0,P+0,P+0,P+0,O+`,O+`,O+`,N*P,N M*P,N*P,M*@,M*@,M*@,L*@,L*0,L*0,K*0,K*`,K*`,K*`,J*`,J)P,J)P,I M)P,I)@,I)@,H)@,H)0,H)0,G)0,G)0,G)`(F)`(F)`(F(P(F(P(E(P(E(P(E M(@(D(@(D(@(D(0(C(0(C(0(C(`(B(`(B(`(B(`(A'P(A'P(A'P(@'@(@'@(@ M'@(@'@(?'0(?'0(?'0(>'`(>'`(>'`(=&P(=&P(=&P(<&P(<&@(<&@(;&@(; M&0(;&0(;&0(:&0(:&`(:&`$9&`$9%P$9%P$8%P$8%@$8%@$7%@$7%@$7%0$6 M%0$6%0$6%`$5%`$5%`$5%`$5$P$4$P$4$P$4$@$3$@$3$@$3$0$2$0$2$0$2 M$0$1$`$1$`$1$`$0#P$0#P$0#P$0#P$/#@$/#@$/#@$.#0$.#0$``'QT"7QT M"7MT"7MS"7MS"7IS"7IR"7IR"7ER"7EQ"7EQ"7EQ"7AQ"7AP"7AP"7=P"7=O M"7=O"79O"79O"79N"'5N"'5N"'5M"'1M"'1M"'1L"'-L"'-L"'-L"'-K"')K M"')K"')J"'%J"'%J"'%J"'!I"'!I"'!I"&]H"&]H"&]H"&YG"&YG"&YG"&YG M"&UF"&UF"&UF"&QE"&QE"&QE"&ME"&MD"&MD"&ID"&IC"&IC"&EC"&EB"&EB M!VAB!VAB!VAA!VAA!V=A!V=@!V=@!V9@!V9?!V9?!V5?!V5?!V5>!V1>!V1> M!V1=!V-=!V-=!V-=!V-<!V)<!V)<!V);!V%;!V%;!V%:!V!:!V!:!V!:!U]9 M!U]9!U]9!UY8!UY8!UY8!UU8!UU7!UU7!UU7!UQ6!UQ6!UQ6!EM5!EM5!EM5 M!EI5!EI4!EI4!EE4!EE3!EE3!EA3!EA3!EA2!EA2!E=2!E=1!E=1!E91!E90 M!E90!E50!E50!E5/!E1/!E1/!E1.!E-.!E-.!E-.!E)-!E)-!E)-!E),!E%, M!E%,!E%+!E!+!E!+!E!+!D]*!D]*!D]*!DY)!4Y)!4Y)!4U)!4U(!4U(!4U( M!4Q'!4Q'!4Q'!4M&!4M&!4M&!4I&!4I%!4I%!4E%!4E$!4E$!4A$!4A$!4A# M!4I`!5LK`W`3`9,"`,@``/D``-D``+$``)4``(<``'D``%\&!D0U-3DY.30T M-#$Q,2PL+"<G)R$A(2`@("`@("`@("`@("`@(",C(RLK*S`P,#`P,#`P,#`P M,#`P,#`P,#,S,SDY.3\_/SX^/C\_/ST]/3<W-S$Q,3`P,"\O+RTM+2PL+"PL M+!L;&0H)`QL9`BDG`S(O!#@T!#<T!#<T!#<S!#<S!#8S!#8R!#8R!#4R!#4R M!#4Q!#0Q!#0Q`S0P`S,P`S,P`S,P`S(O`S(O`S(O`S(N`S$N`S$N`S$M`S`M M`S`M`S`M`R\L`R\L`R\L`RXK`RXK`RXK`RTK`RTJ`RTJ`RPJ`RPI`RPI`RPI M`RLH`RLH`RLH`RHH`RHG`RHG`RDG`RDF`RDF`R@F`R@F`R@E`R<E`R<E`R<D M`B<D`B8D`B8C`B8C`B4C`B4C`B4B`B0B`B0B`B0A`B,A`B,A`B,A`B(@`B(@ M`B(@`B$?`B$?`B$?`B$>`B`>`B`>`B`>`A\=`A\=`A\=`AX<`AX<`AX<`AT; M`AT;`AT;`AP;`AP:`AP:`AP:`AL9`AL9`AL9`AH9`AH8`AH8`1D8`1D7`1D7 M`1@7`1@6`1@6`1<6`1<6`1<5`185`185`184`184`144`144`143`103`103 M`102`1,2`1,2`1,1`1(1`1(1`1(1`1$0`1$0`1$0`1$/`1`/`1`/`1`/`0\. M`0\.`0\.`0X-`0``?'0)?'0)?'0)>W0)>W,)>W,)>G,)>G()>G()>G()>7$) M>7$)>7$)>'$)>'`)>'`)=W`)=V\)=V\)=F\)=F\)=FX(=6X(=6X(=6T(=&T( M=&T(=&P(=&P(<VP(<VP(<VL(<FL(<FL(<FH(<6H(<6H(<6H(<&D(<&D(<&D( M;V@(;V@(;V@(;V<(;F<(;F<(;F<(;68(;68(;68(;&4(;&4(;&4(:V4(:V0( M:V0(:F0(:F,(:F,(:6,(:6((:6((:6(':&(':&$':&$'9V$'9V`'9V`'9F`' M9F`'9E\'95\'95\'95X'9%X'9%X'9%T'9%T'8UT'8UT'8UP'8EP'8EP'8EL' M85L'85L'85L'8%H'8%H'8%H'7UD'7UD'7UD'7E@'7E@'7E@'7E@'75<'75<' M75<'7%8'7%8'7%8&6U8&6U4&6U4&6E4&6E0&6E0&650&65,&65,&65,&6%,& M6%(&6%(&5U(&5U$&5U$&5E$&5E$&5E`&55`&55`&54\&5$\&5$\&5$X&4TX& M4TX&4TX&4TT&4DT&4DT&4DP&44P&44P&44P&4$L&4$L&4$L&3TH&3TH&3TH& M3DD%3DD%3DD%3DD%34@%34@%34@%3$<%3$<%3$<%2T<%2T8%2T8%2D8%2D4% M2D4%244%240%240%2$0%2$0%2D`%7"L#<!,!D@(`R```^0``XP``R```L0`` MI```CP``808&1#0T.3DY-#0T,3$Q+"PL)24E("`@("`@("`@("`@(2$A(R,C M*"@H+2TM,#`P,#`P,#`P,#`P,#`P,#`P,S,S.CHZ/S\_/CX^/#P\.#@X,S,S M,#`P+BXN*RLK*2DI*"@H*"@H'!P<!@8$&!8"*28#,B\$.#4$.#0$.#0$-S0$ M-S,$-S,$-C,$-C($-C($-3($-3($-3$$-#$$-#$#-#`#,S`#,S`#,S`#,B\# M,B\#,B\#,BX#,2X#,2X#,2T#,"T#,"T#,"T#+RP#+RP#+RP#+BL#+BL#+BL# M+2L#+2H#+2H#+2H#+"D#+"D#+"D#*R@#*R@#*R@#*B@#*B<#*B<#*2<#*28# M*28#*"8#*"8#*"4#)R4#)R4#)R0")R0")B0")B,")B,")2,")2,")2(")"(" M)"(")"$"(R$"(R$"(R$"(B`"(B`"(B`"(A\"(1\"(1\"(1X"(!X"(!X"(!X" M'QT"'QT"'QT"'AP"'AP"'AP"'1P"'1L"'1L"'!L"'!H"'!H"'!H"&QD"&QD" M&QD"&AD"&A@"&A@!&1@!&1<!&1<!&!<!&!<!&!8!%Q8!%Q8!%Q4!%Q4!%A4! M%A0!%A0!%10!%10!%1,!%!,!%!,!%!(!$Q(!$Q(!$Q(!$A$!$A$!$A$!$1`! M$1`!$1`!$0\!$`\!$`\!$`\!#PX!#PX!#PX!``!]=0E\=`E\=`E\=`E[=`E[ M<PE[<PEZ<PEZ<@EZ<@EZ<@EY<@EY<0EY<0EX<0EX<`EX<`EW<`EW;PEW;PEV M;PEV;PEV;@AU;@AU;@AU;0AU;0AT;0AT;0AT;`AS;`AS;`AS:PAR:PAR:PAR M:@AQ:@AQ:@AQ:@AP:0AP:0AP:0AO:`AO:`AO:`AO:`AN9PAN9PAN9PAM9@AM M9@AM9@AL90AL90AL90AK90AK9`AK9`AJ9`AJ8PAJ8PAJ8PAI8PAI8@AI8@=H M8@=H80=H80=G80=G8`=G8`=F8`=F8`=F7P=E7P=E7P=E7@=D7@=D7@=D7@=D M70=C70=C70=C7`=B7`=B7`=B6P=A6P=A6P=A6P=@6@=@6@=@6@=?60=?60=? M60=?60=>6`=>6`=>6`==5P==5P==5P=<5@=<5@=<5@=;5@9;509;509:509: M5`9:5`995`995`994P994P984P984@984@974@9740974096409640964`95 M4`954`953P943P943P943P943@933@933@933092309230923`913`913`91 M3`902P902P902P9/2@9/2@9/2@9/2@9.205.205.205-2`5-2`5-2`5,1P5, M1P5,1P5+1P5+1@5+1@5*1@5*105*105)105)1`5)1`5)1`5*005<*P-P$P&1 M`@#&``#X``#Q``#G``#8``#-``"L``!E!@9$-#0Y.3DT-#0Q,3$K*RLE)24@ M("`@("`@("`@("`C(R,J*BHL+"PN+BXP,#`P,#`P,#`P,#`P,#`P,#`T-#0[ M.SL^/CX[.SLV-C8S,S,Q,3$P,#`L+"PG)R<D)"0C(R,B(B(:&AH'!P46%0(H M)0,R+P0Y-00X-00X-`0X-`0W-`0W,P0W,P0V,P0V,P0V,@0U,@0U,@0U,00T M,00T,0,T,`,S,`,S,`,S,`,S+P,R+P,R+P,R+@,Q+@,Q+@,Q+@,P+0,P+0,P M+0,O+`,O+`,O+`,N*P,N*P,N*P,N*P,M*@,M*@,M*@,L*0,L*0,L*0,K*0,K M*`,K*`,J*`,J)P,J)P,I)P,I)@,I)@,H)@,H)@,H)0,H)0,G)0,G)`(G)`(F M)`(F)`(F(P(E(P(E(P(E(@(D(@(D(@(D(0(C(0(C(0(C(0(C(`(B(`(B(`(B M'P(A'P(A'P(A'P(@'@(@'@(@'@(?'0(?'0(?'0(>'`(>'`(>'`(='`(=&P(= M&P(=&P(<&@(<&@(<&@(;&@(;&0(;&0(:&0(:&`(:&`$9&`$9%P$9%P$8%P$8 M%P$8%@$8%@$7%@$7%0$7%0$6%0$6%0$6%`$5%`$5%`$5$P$4$P$4$P$4$@$3 M$@$3$@$3$@$2$0$2$0$2$0$2$`$1$`$1$`$1$`$0#P$0#P$0#P$/#@$/#@$` M`'UU"7UU"7QU"7QT"7QT"7MT"7MS"7MS"7MS"7IR"7IR"7IR"7ER"7EQ"7EQ M"7AQ"7AP"7AP"7=P"7=P"7=O"79O"79O"79N"'9N"'5N"'5M"'5M"'1M"'1M M"'1L"'-L"'-L"'-K"')K"')K"')K"'%J"'%J"'%J"'!I"'!I"'!I"'!H"&]H M"&]H"&]H"&YG"&YG"&YG"&UF"&UF"&UF"&QF"&QE"&QE"&ME"&MD"&MD"&MD M"&IC"&IC"&IC"&EC"&EB"&EB!VAB!VAA!VAA!V=A!V=A!V=@!V9@!V9@!V9? M!V5?!V5?!V5>!V5>!V1>!V1>!V1=!V-=!V-=!V-<!V)<!V)<!V);!V%;!V%; M!V%;!V!:!V!:!V!:!V!9!U]9!U]9!U]9!UY8!UY8!UY8!UU7!UU7!UU7!UQ6 M!UQ6!UQ6!UM6!EM5!EM5!EI5!EI4!EI4!EI4!EE4!EE3!EE3!EA3!EA2!EA2 M!E=2!E=1!E=1!E91!E91!E90!E50!E50!E5/!E5/!E1/!E1/!E1.!E-.!E-. M!E--!E)-!E)-!E),!E%,!E%,!E%,!E!+!E!+!E!+!D]*!D]*!D]*!D]*!DY) M!4Y)!4Y)!4U(!4U(!4U(!4Q'!4Q'!4Q'!4M'!4M&!4M&!4I&!4I%!4I%!4I% M!4E%!4E$!4M!!5LM`VP8`HT(`<,#`/<!`/H``/@``.P``.```+@``&<&!D0T M-#DY.30T-#$Q,2LK*R4E)2`@("`@("`@("$A(2<G)RXN+C`P,#`P,#`P,#`P M,#`P,#`P,#`P,#`P,#4U-3P\/#X^/CDY.3$Q,3`P,#`P,#`P,"HJ*B0D)"`@ M("`@("`@(!@8&`8&!1(1`2,A`BXK`S4Q!#<S!#@U!#@T!#@T!#<T!#<S!#<S M!#8S!#8S!#8R!#4R!#4R!#4Q!#0Q!#0Q`S0Q`S0P`S,P`S,P`S,O`S(O`S(O M`S(N`S$N`S$N`S$N`S`M`S`M`S`M`R\L`R\L`R\L`RXL`RXK`RXK`RXK`RTJ M`RTJ`RTJ`RPI`RPI`RPI`RLI`RLH`RLH`RHH`RHG`RHG`RDG`RDG`RDF`RDF M`R@F`R@E`R@E`R<E`R<D`B<D`B8D`B8D`B8C`B4C`B4C`B4B`B0B`B0B`B0B M`B,A`B,A`B,A`B,@`B(@`B(@`B(?`B$?`B$?`B$?`B`>`B`>`B`>`A\=`A\= M`A\=`AX=`AX<`AX<`AX<`AT;`AT;`AT;`AP:`AP:`AP:`AL:`AL9`AL9`AH9 M`AH8`AH8`1D8`1D7`1D7`1@7`1@7`1@6`1@6`1<6`1<5`1<5`185`185`184 M`144`144`143`103`103`102`1,2`1,2`1,2`1,1`1(1`1(1`1(0`1$0`1$0 M`1$0`1`/`1`/`1`/`0\.`0``?74)?74)?74)?'4)?'0)?'0)?'0)>W,)>W,) M>W,)>G()>G()>G()>7()>7$)>7$)>'$)>'`)>'`)=W`)=W`)=V\)=F\)=F\) M=FX(=FX(=6X(=6T(=6T(=&T(=&T(=&P(<VP(<VP(<VL(<FL(<FL(<FL(<6H( M<6H(<6H(<6D(<&D(<&D(<&@(;V@(;V@(;V@(;F<(;F<(;F<(;68(;68(;68( M;&8(;&4(;&4(:V4(:V0(:V0(:V0(:F,(:F,(:F,(:6,(:6((:6(':&(':&$' M:&$'9V$'9V$'9V`'9F`'9F`'9E\'9E\'95\'95X'95X'9%X'9%X'9%T'8UT' M8UT'8UP'8EP'8EP'8EP'85L'85L'85L'8%H'8%H'8%H'8%D'7UD'7UD'7UD' M7E@'7E@'7E@'75<'75<'75<'7%<'7%8'7%8'6U8&6U4&6U4&6U4&6E0&6E0& M6E0&650&65,&65,&6%,&6%(&6%(&5U(&5U(&5U$&5E$&5E$&5E`&55`&55`& M54\&54\&5$\&5$\&5$X&4TX&4TX&4TT&4DT&4DT&4DT&44P&44P&44P&4$L& M4$L&4$L&4$H&3TH&3TH&3TH&3DD%3DD%3DD%34@%34@%34@%3$@%3$<%3$<% M2T<%2T8%2T8%2T8%2D4%2D4%2D4%244%2D(%4S<$72L#?!T"MP\!]`(`ZP`` MV0``QP``M@``F0``9`8&1#0T.3DY-#0T,3$Q*RLK)24E("`@("`@("`@(2$A M)R<G+BXN,#`P,#`P,#`P,#`P,#`P,#`P,C(R-C8V.CHZ/3T]/CX^.3DY,3$Q M,#`P,#`P,#`P*BHJ(R,C("`@("`@("`@&!@8!@8%"@H!%!,!'!H")",#+BL# M.34$.#4$.#0$.#0$-S0$-S0$-S,$-C,$-C,$-C($-3($-3($-3$$-3$$-#$$ M-#$#-#`#,S`#,S`#,R\#,B\#,B\#,BX#,2X#,2X#,2X#,"T#,"T#,"T#+RP# M+RP#+RP#+RP#+BL#+BL#+BL#+2H#+2H#+2H#+"D#+"D#+"D#*RD#*R@#*R@# M*B@#*B<#*B<#*B<#*2<#*28#*28#*"8#*"4#*"4#)R4#)R0")R0")B0")B0" M)B,")2,")2,")2(")"(")"(")"(")"$"(R$"(R$"(R`"(B`"(B`"(A\"(1\" M(1\"(1\"(!X"(!X"(!X"'QT"'QT"'QT"'QT"'AP"'AP"'AP"'1L"'1L"'1L" M'!H"'!H"'!H"&QH"&QD"&QD"&AD"&A@"&A@!&1@!&1@!&1<!&1<!&!<!&!8! M&!8!%Q8!%Q4!%Q4!%A4!%A4!%A0!%10!%10!%1,!%!,!%!,!%!,!%!(!$Q(! M$Q(!$Q$!$A$!$A$!$A`!$1`!$1`!$1`!$`\!$`\!$`\!``!^=@E]=0E]=0E] M=0E]=0E\=`E\=`E\=`E[<PE[<PE[<PEZ<PEZ<@EZ<@EY<@EY<0EY<0EX<0EX M<`EX<`EW<`EW<`EW;PEW;PEV;PEV;@AV;@AU;@AU;@AU;0AT;0AT;0AT;`AS M;`AS;`AS:PAR:PAR:PAR:PAR:@AQ:@AQ:@AQ:0AP:0AP:0AP:0AO:`AO:`AO M:`AN9PAN9PAN9PAM9@AM9@AM9@AL9@AL90AL90AL90AK9`AK9`AK9`AJ9`AJ M8PAJ8PAI8PAI8@AI8@=H8@=H80=H80=G80=G80=G8`=G8`=F8`=F7P=F7P=E M7P=E7P=E7@=D7@=D7@=D70=C70=C70=C7`=B7`=B7`=B7`=A6P=A6P=A6P=A M6@=@6@=@6@=@6@=?60=?60=?60=>6`=>6`=>6`==5P==5P==5P=<5P=<5@=< M5@=<5@9;509;509;509:509:5`9:5`995`994P994P984P984@984@974@97 M4@974096409640964`964`954`954`953P943P943P943@933@933@933092 M3092309230913`913`913`912P902P902P902P9/2@9/2@9/2@9.205.205. M205-2`5-2`5-2`5,2`5,1P5,1P5+1P5+1@5+1@5+1@5*105*105*105)105, M0`5./01I,02H&P+K!@#C`0#"``"F``"2``!^``!@!@9%-#0Y.3DT-#0Q,3$K M*RLE)24@("`@("`@("`A(2$G)R<N+BXP,#`P,#`P,#`P,#`P,#`Q,3$V-C8] M/3T^/CX_/S\_/S\Y.3DQ,3$P,#`P,#`P,#`I*2DC(R,@("`@("`@("`9&1D& M!@8#`P`&!@`+"@$4$P$F)`,X-`0Y-00X-00X-`0X-`0W-`0W-`0W,P0V,P0V M,P0V,@0U,@0U,@0U,00U,00T,00T,0,T,`,S,`,S,`,S+P,R+P,R+P,R+P,Q M+@,Q+@,Q+@,P+0,P+0,P+0,P+`,O+`,O+`,O+`,N*P,N*P,N*P,M*@,M*@,M M*@,L*@,L*0,L*0,K*0,K*`,K*`,J*`,J)P,J)P,J)P,I)P,I)@,I)@,H)@,H M)0,H)0,G)0,G)0,G)`(F)`(F)`(F(P(E(P(E(P(E(@(E(@(D(@(D(@(D(0(C M(0(C(0(C(`(B(`(B(`(B(`(A'P(A'P(A'P(@'@(@'@(@'@(?'0(?'0(?'0(? M'0(>'`(>'`(>'`(=&P(=&P(=&P(<&P(<&@(<&@(;&@(;&0(;&0(:&0(:&`(: M&`(:&`$9&`$9%P$9%P$8%P$8%@$8%@$7%@$7%@$7%0$6%0$6%0$6%`$5%`$5 M%`$5$P$4$P$4$P$4$P$4$@$3$@$3$@$3$0$2$0$2$0$2$0$1$`$1$`$1$`$0 M#P$0#P$``'YV"7YV"7UV"7UU"7UU"7UU"7QT"7QT"7QT"7MS"7MS"7MS"7IS M"7IR"7IR"7ER"7EQ"7EQ"7AQ"7AQ"7AP"7AP"7=P"7=O"7=O"79O"79N"'9N M"'5N"'5N"'5M"'1M"'1M"'1L"'-L"'-L"'-L"')K"')K"')K"')J"'%J"'%J M"'%I"'!I"'!I"'!I"&]H"&]H"&]H"&YG"&YG"&YG"&UG"&UF"&UF"&UF"&QE M"&QE"&QE"&MD"&MD"&MD"&ID"&IC"&IC"&EC"&EB"&EB!VAB!VAB!VAA!V=A M!V=A!V=@!V=@!V9@!V9?!V9?!V5?!V5?!V5>!V1>!V1>!V1=!V-=!V-=!V-= M!V)<!V)<!V)<!V);!V%;!V%;!V%:!V!:!V!:!V!:!U]9!U]9!U]9!UY8!UY8 M!UY8!UU7!UU7!UU7!UQ7!UQ6!UQ6!UQ6!EM5!EM5!EM5!EI5!EI4!EI4!EE4 M!EE3!EE3!EA3!EA2!EA2!E=2!E=2!E=1!E=1!E91!E90!E90!E50!E50!E5/ M!E1/!E1/!E1.!E-.!E-.!E--!E)-!E)-!E)-!E),!E%,!E%,!E%+!E!+!E!+ M!E!+!D]*!D]*!D]*!DY)!4Y)!4Y)!4U(!4U(!4U(!4Q(!4Q'!4Q'!4Q'!4M& M!4M&!4M&!4I&!4I%!4I%!4E%!4E#!58Z!)$F`]@,`>(!`+@``)<``(,``',` M`%T("$0T-#DY.30T-#$Q,2LK*R4E)2`@("`@("`@("$A(2<G)RXN+C`P,#`P M,#`P,#`P,#(R,C4U-3HZ.C\_/T!`0$!`0#\_/SDY.3$Q,2\O+RXN+BPL+"<G M)R(B(B`@("`@("`@(!D9&08&!@````````,#``T,`2,@`C@U!#DU!#DU!#@U M!#@T!#@T!#<T!#<T!#<S!#8S!#8S!#8R!#8R!#4R!#4R!#4Q!#0Q!#0Q`S0P M`S,P`S,P`S,O`S(O`S(O`S(O`S$N`S$N`S$N`S$M`S`M`S`M`S`M`R\L`R\L M`R\L`RXK`RXK`RXK`RTJ`RTJ`RTJ`RPJ`RPI`RPI`RLI`RLH`RLH`RLH`RHH M`RHG`RHG`RDG`RDF`RDF`R@F`R@E`R@E`R<E`R<E`R<D`B8D`B8D`B8C`B8C M`B4C`B4C`B4B`B0B`B0B`B0A`B,A`B,A`B,@`B(@`B(@`B(@`B$?`B$?`B$? M`B`>`B`>`B`>`B`>`A\=`A\=`A\=`AX<`AX<`AX<`AT;`AT;`AT;`AP;`AP: M`AP:`AL:`AL9`AL9`AL9`AH9`AH8`AH8`1D8`1D7`1D7`1@7`1@6`1@6`1<6 M`1<6`1<5`185`185`184`144`144`143`143`103`103`102`1,2`1,2`1,1 M`1(1`1(1`1(1`1$0`1$0`1$0`1`/`0``?G8)?G8)?G8)?G8)?74)?74)?74) M?'0)?'0)?'0)>W0)>W,)>W,)>G,)>G()>G()>7()>7$)>7$)>7$)>'$)>'`) M>'`)=W`)=V\)=V\)=F\)=FX(=FX(=6X(=6X(=6T(=&T(=&T(=&P(<VP(<VP( M<VP(<VL(<FL(<FL(<FH(<6H(<6H(<6D(<&D(<&D(<&D(;V@(;V@(;V@(;F<( M;F<(;F<(;F<(;68(;68(;68(;&4(;&4(;&4(:V0(:V0(:V0(:F0(:F,(:F,( M:6,(:6((:6(':&(':&(':&$':&$'9V$'9V`'9V`'9F`'9E\'9E\'95\'95\' M95X'9%X'9%X'9%T'8UT'8UT'8UT'8UP'8EP'8EP'8EL'85L'85L'85H'8%H' M8%H'8%H'7UD'7UD'7UD'7E@'7E@'7E@'75@'75<'75<'75<'7%8'7%8'7%8& M6U4&6U4&6U4&6E4&6E0&6E0&650&65,&65,&6%,&6%,&6%(&6%(&5U(&5U$& M5U$&5E$&5E`&5E`&55`&55`&54\&5$\&5$\&5$X&4TX&4TX&4TX&4DT&4DT& M4DT&4DP&44P&44P&44L&4$L&4$L&4$L&3TH&3TH&3TH&3DD%3DD%3DD%34D% M34@%34@%34@%3$<%3$<%3$<%2T8%2T8%2T8%2D8%2D4%2D4%244%2$(%;#<$ MO1@"Z0$`MP``C0``=P``:@``60T-0S8V.3DY-#0T,3$Q*RLK)24E("`@("`@ M("`@(2$A)R<G+BXN,#`P,#`P,#`P,C(R-S<W.SL[/CX^0$!`0$!`0$!`/S\_ M.CHZ,C(R+2TM*BHJ)24E(B(B("`@("`@("`@("`@&1D9!@8&````````!`,` M#@T!(R`".34$.38$.34$.34$.#4$.#4$.#0$-S0$-S0$-S,$-S,$-C,$-C($ M-C($-3($-3($-3$$-#$$-#$#-#`#,S`#,S`#,S`#,B\#,B\#,B\#,2X#,2X# M,2X#,2T#,"T#,"T#,"T#+RP#+RP#+RP#+BL#+BL#+BL#+2H#+2H#+2H#+"H# M+"D#+"D#+"D#*R@#*R@#*R@#*B@#*B<#*B<#*2<#*28#*28#*"8#*"4#*"4# M)R4#)R4#)R0")B0")B0")B,")B,")2,")2,")2(")"(")"(")"$"(R$"(R$" M(R`"(B`"(B`"(B`"(1\"(1\"(1\"(1X"(!X"(!X"(!X"'QT"'QT"'QT"'AP" M'AP"'AP"'1L"'1L"'1L"'!L"'!H"'!H"&QH"&QD"&QD"&QD"&AD"&A@"&A@! M&1@!&1<!&1<!&!<!&!8!&!8!%Q8!%Q8!%Q4!%A4!%A4!%A0!%A0!%10!%10! M%1,!%!,!%!,!%!(!$Q(!$Q(!$Q$!$A$!$A$!$A$!$1`!$1`!$1`!``!_=PE_ M=@E^=@E^=@E^=@E]=0E]=0E]=0E\=`E\=`E\=`E[=`E[<PE[<PEZ<PEZ<@EZ M<@EY<@EY<0EY<0EY<0EX<0EX<`EX<`EW<`EW;PEW;PEV;PEV;PEV;@AU;@AU M;@AU;0AT;0AT;0AT;`AT;`AS;`AS;`AS:PAR:PAR:PAR:@AQ:@AQ:@AQ:@AP M:0AP:0AP:0AO:`AO:`AO:`AN9PAN9PAN9PAN9PAM9@AM9@AM9@AL90AL90AL M90AK90AK9`AK9`AJ9`AJ8PAJ8PAI8PAI8@AI8@AI8@=H8@=H80=H80=G80=G M8`=G8`=F8`=F8`=F7P=E7P=E7P=E7@=D7@=D7@=D70=C70=C70=C70=C7`=B M7`=B7`=B6P=A6P=A6P=A6P=@6@=@6@=@6@=?60=?60=?60=>6`=>6`=>6`=> M6`==5P==5P==5P=<5@=<5@=<5@9;5@9;509;509:509:5`9:5`995`994P99 M4P994P984P984@984@974@9740974096409640964`954`954`953P943P94 M3P943@933@933@933@933092309230923`913`913`913`902P902P902P9/ M2@9/2@9/2@9.205.205.205.205-2`5-2`5-2`5,1P5,1P5,1P5+1P5+1@5+ M1@5*1@5*105*105)105-/@6C(@/L`@"O``!^``!O``!D``!4%A9".3DY.3DT M-#0Q,3$K*RLE)24@("`@("`@("`A(2$G)R<N+BXP,#`P,#`P,#`T-#0\/#Q` M0$!`0$!`0$!`0$!`0$`_/S\Z.CHR,C(K*RLE)24@("`@("`@("`@("`@("`@ M("`9&1D%!04````````$!``.#0$C(0(Y-00Z-@0Y-@0Y-00Y-00X-00X-00X M-`0X-`0W-`0W,P0W,P0V,P0V,@0V,@0U,@0U,@0U,00T,00T,0,T,`,S,`,S M,`,S,`,R+P,R+P,R+P,R+@,Q+@,Q+@,Q+0,P+0,P+0,P+0,O+`,O+`,O+`,N M*P,N*P,N*P,M*P,M*@,M*@,M*@,L*0,L*0,L*0,K*`,K*`,K*`,J*`,J)P,J M)P,I)P,I)@,I)@,H)@,H)@,H)0,G)0,G)0,G)`(G)`(F)`(F(P(F(P(E(P(E M(P(E(@(D(@(D(@(D(0(C(0(C(0(C(0(B(`(B(`(B(`(B'P(A'P(A'P(A'@(@ M'@(@'@(@'@(?'0(?'0(?'0(>'`(>'`(>'`(='`(=&P(=&P(<&P(<&@(<&@(< M&@(;&0(;&0(;&0(:&0(:&`(:&`$9&`$9%P$9%P$8%P$8%P$8%@$7%@$7%@$7 M%0$7%0$6%0$6%`$6%`$5%`$5%`$5$P$4$P$4$P$4$@$3$@$3$@$3$@$2$0$2 M$0$2$0$1$`$1$`$``']W"7]W"7]W"7YV"7YV"7YV"7UU"7UU"7UU"7QT"7QT M"7QT"7MT"7MS"7MS"7IS"7IR"7IR"7IR"7ER"7EQ"7EQ"7AQ"7AP"7AP"7=P M"7=O"7=O"79O"79O"79N"'5N"'5N"'5M"'5M"'1M"'1M"'1L"'-L"'-L"'-K M"')K"')K"')J"'%J"'%J"'%J"'!I"'!I"'!I"&]H"&]H"&]H"&]H"&YG"&YG M"&YG"&UF"&UF"&UF"&QE"&QE"&QE"&ME"&MD"&MD"&ID"&IC"&IC"&IC"&EC M"&EB"&EB!VAB!VAA!VAA!V=A!V=@!V=@!V9@!V9@!V9?!V5?!V5?!V5>!V1> M!V1>!V1>!V1=!V-=!V-=!V-<!V)<!V)<!V);!V%;!V%;!V%;!V!:!V!:!V!: M!U]9!U]9!U]9!U]9!UY8!UY8!UY8!UU7!UU7!UU7!UQ6!UQ6!UQ6!UM6!EM5 M!EM5!EI5!EI4!EI4!EE4!EE3!EE3!EE3!EA3!EA2!EA2!E=2!E=1!E=1!E91 M!E91!E90!E50!E50!E5/!E1/!E1/!E1.!E1.!E-.!E-.!E--!E)-!E)-!E), M!E%,!E%,!E%,!E!+!E!+!E!+!D]*!D]*!D]*!DY)!4Y)!4Y)!4Y)!4U(!4U( M!4U(!4Q'!4Q'!4Q'!4M'!4M&!4M&!4I&!4I%!4I%!4A$!8DU%.`0$J@%!GD! M`FL#`V`*"E0?'T$\/#DY.30T-#$Q,2LK*R4E)2`@("`@("`@("$A(2<G)RXN M+C`P,#`P,#`P,#4U-3T]/4!`0$!`0$!`0$!`0$!`0#\_/SHZ.C(R,BLK*R0D M)"`@("`@("`@("`@("$A(2(B(AT='04%!0````````,#``D(`184`2,A`BPI M`S4Q!#DV!#DU!#DU!#@U!#@U!#@T!#@T!#<T!#<S!#<S!#8S!#8S!#8R!#4R M!#4R!#4Q!#0Q!#0Q`S0P`S,P`S,P`S,P`S,O`S(O`S(O`S(N`S$N`S$N`S$N M`S`M`S`M`S`M`R\L`R\L`R\L`RXK`RXK`RXK`RTK`RTJ`RTJ`RTJ`RPI`RPI M`RPI`RLI`RLH`RLH`RHH`RHG`RHG`RDG`RDF`RDF`R@F`R@F`R@E`R@E`R<E M`R<D`B<D`B8D`B8D`B8C`B4C`B4C`B4B`B0B`B0B`B0A`B,A`B,A`B,A`B(@ M`B(@`B(@`B(?`B$?`B$?`B$?`B`>`B`>`B`>`A\=`A\=`A\=`AX<`AX<`AX< M`AT<`AT;`AT;`AT;`AP:`AP:`AP:`AL:`AL9`AL9`AH9`AH8`AH8`1D8`1D7 M`1D7`1@7`1@7`1@6`1<6`1<6`1<5`1<5`185`185`184`144`144`143`103 M`103`102`1,2`1,2`1,2`1(1`1(1`1(1`1(0`0``@'<)?W<)?W<)?W<)?G8) M?G8)?G8)?74)?74)?74)?'4)?'0)?'0)>W0)>W,)>W,)>W,)>G()>G()>G() M>7()>7$)>7$)>'$)>'`)>'`)=W`)=W`)=V\)=F\)=F\)=FX(=6X(=6X(=6T( M=6T(=&T(=&T(=&P(<VP(<VP(<VL(<FL(<FL(<FH(<6H(<6H(<6H(<&D(<&D( M<&D(<&@(;V@(;V@(;V@(;F<(;F<(;F<(;68(;68(;68(;&4(;&4(;&4(:V4( M:V0(:V0(:F0(:F,(:F,(:F,(:6,(:6((:6(':&(':&$':&$'9V$'9V`'9V`' M9F`'9F`'9E\'95\'95\'95X'95X'9%X'9%X'9%T'8UT'8UT'8UP'8EP'8EP' M8EL'85L'85L'85L'8%H'8%H'8%H'7UD'7UD'7UD'7UD'7E@'7E@'7E@'75<' M75<'75<'7%8'7%8'7%8'6U8&6U4&6U4&6E4&6E0&6E0&6E0&650&65,&65,& M6%,&6%(&6%(&5U(&5U$&5U$&5E$&5E$&5E`&55`&55`&54\&54\&5$\&5$\& M5$X&4TX&4TX&4TT&4DT&4DT&4DP&44P&44P&44P&4$L&4$L&4$L&3TH&3TH& M3TH&3TH&3DD%3DD%3DD%34@%34@%34@%3$<%3$<%3$<%2T<%2T8%2T8%2D8% M2D4%2$4)5VM5;IF[9I"R8FR%;B,K:1`15B8F0#T].3DY-#0T,3$Q*RLK)24E M("`@("`@("`@(2$A)R<G+BXN,#`P,#`P,#`P-34U/3T]0$!`0$!`0$!`0$!` M0$!`/S\_.CHZ,3$Q*BHJ)"0D("`@("`@("`@(2$A(R,C)R<G(R,C!@8&```` M`````0$``P,`"`@!#@T!'AP"+RP#.C8$.38$.38$.34$.34$.#4$.#0$.#0$ M-S0$-S,$-S,$-C,$-C,$-C($-3($-3($-3$$-#$$-#$#-#$#-#`#,S`#,S`# M,R\#,B\#,B\#,BX#,2X#,2X#,2X#,"T#,"T#,"T#+RP#+RP#+RP#+BP#+BL# M+BL#+BL#+2H#+2H#+2H#+"D#+"D#+"D#*RD#*R@#*R@#*B@#*B<#*B<#*2<# M*28#*28#*28#*"8#*"4#*"4#)R4#)R0")R0")B0")B0")B,")2,")2,")2(" M)"(")"(")"$"(R$"(R$"(R$"(R`"(B`"(B`"(A\"(1\"(1\"(1\"(!X"(!X" M(!X"'QT"'QT"'QT"'AP"'AP"'AP"'AP"'1L"'1L"'1L"'!H"'!H"'!H"&QH" M&QD"&QD"&AD"&A@"&A@!&1@!&1<!&1<!&!<!&!<!&!8!&!8!%Q8!%Q4!%Q4! M%A4!%A4!%A0!%10!%10!%1,!%!,!%!,!%!(!$Q(!$Q(!$Q(!$Q$!$A$!$A$! M``"`>`F`=PE_=PE_=PE_=PE^=@E^=@E^=@E]=0E]=0E]=0E\=0E\=`E\=`E\ M=`E[<PE[<PE[<PEZ<@EZ<@EZ<@EY<@EY<0EY<0EX<0EX<`EX<`EW<`EW<`EW M;PEV;PEV;PEV;@AV;@AU;@AU;0AU;0AT;0AT;0AT;`AS;`AS;`AS:PAR:PAR M:PAR:PAQ:@AQ:@AQ:@AQ:0AP:0AP:0AP:`AO:`AO:`AO:`AN9PAN9PAN9PAM M9@AM9@AM9@AL9@AL90AL90AK90AK9`AK9`AK9`AJ8PAJ8PAJ8PAI8PAI8@AI M8@=H8@=H80=H80=G80=G80=G8`=F8`=F8`=F7P=F7P=E7P=E7@=E7@=D7@=D M7@=D70=C70=C70=C7`=B7`=B7`=B7`=A6P=A6P=A6P=@6@=@6@=@6@=@60=? M60=?60=?60=>6`=>6`=>6`==5P==5P==5P=<5P=<5@=<5@=;5@9;509;509; M509:5`9:5`9:5`995`994P994P984P984@984@974@974@97409640964096 M4`954`954`953P953P943P943P943@933@933@9330923092309230913`91 M3`913`902P902P902P902@9/2@9/2@9/2@9.205.205.205-2`5-2`5-2`5, M2`5,1P5,1P5+1P5+1PA*2@Y*5"!+;$U,DY9,P.M'N>-,H,5O,CYO$1%7*"@_ M/CXY.3DT-#0Q,3$K*RLE)24@("`@("`@("`A(2$G)R<N+BXP,#`P,#`R,C(X M.#@]/3U`0$!`0$!`0$`_/S\^/CX]/3TW-S<O+R\H*"@C(R,@("`@("`A(2$C M(R,E)24J*BHG)R<&!@8````````````````````````6%`$K*0,Z-@0Z-@0Z M-@0Y-@0Y-00Y-00X-00X-`0X-`0W-`0W,P0W,P0V,P0V,P0V,@0U,@0U,@0U M,00T,00T,00T,0,T,`,S,`,S,`,S+P,R+P,R+P,R+@,Q+@,Q+@,Q+@,P+0,P M+0,P+0,O+`,O+`,O+`,O+`,N*P,N*P,N*P,M*@,M*@,M*@,L*0,L*0,L*0,K M*0,K*`,K*`,J*`,J)P,J)P,I)P,I)P,I)@,I)@,H)@,H)0,H)0,G)0,G)`(G M)`(F)`(F)`(F(P(E(P(E(P(E(@(D(@(D(@(D(@(D(0(C(0(C(0(C(`(B(`(B M(`(B'P(A'P(A'P(A'P(@'@(@'@(@'@(?'0(?'0(?'0(>'0(>'`(>'`(>'`(= M&P(=&P(=&P(<&@(<&@(<&@(;&@(;&0(;&0(:&0(:&`(:&`$9&`$9&`$9%P$9 M%P$8%P$8%@$8%@$7%@$7%0$7%0$6%0$6%0$6%`$5%`$5%`$5$P$4$P$4$P$4 M$P$3$@$3$@$3$@$3$0$2$0$``(!X"8!X"8!X"7]W"7]W"7]W"7YV"7YV"7YV M"7UU"7UU"7UU"7QU"7QT"7QT"7QT"7MS"7MS"7MS"7IS"7IR"7IR"7ER"7EQ M"7EQ"7AQ"7AP"7AP"7=P"7=P"7=O"7=O"79O"79N"'9N"'5N"'5N"'5M"'1M M"'1M"'1L"'-L"'-L"'-K"')K"')K"')K"'%J"'%J"'%J"'%I"'!I"'!I"'!I M"&]H"&]H"&]H"&YG"&YG"&YG"&UF"&UF"&UF"&QF"&QE"&QE"&QE"&MD"&MD M"&MD"&ID"&IC"&IC"&EC"&EB"&EB!VAB!VAA!VAA!V=A!V=A!V=@!V9@!V9@ M!V9?!V9?!V5?!V5?!V5>!V1>!V1>!V1=!V-=!V-=!V-<!V)<!V)<!V)<!V%; M!V%;!V%;!V%:!V!:!V!:!V!:!U]9!U]9!U]9!UY8!UY8!UY8!UU7!UU7!UU7 M!UQ7!UQ6!UQ6!UQ6!EM5!EM5!EM5!EI5!EI4!EI4!EE4!EE3!EE3!EA3!EA2 M!EA2!E=2!E=2!E=1!E91!E91!E90!E90!E50!E5/!E5/!E1/!E1/!E1.!E-. M!E-.!E--!E)-!E)-!E)-!E%,!E%,!E%,!E%+!E!+!E!+!E!*!D]*!D]*!D]* M!DY)!4Y)!4Y)!4U(!4U(!4U(!4Q(!4Q'!4Q'!DM,#DM5(4MD/DR"=4RDMDW" M[4"KT3R&H&HI,6\1$5<H*#\^/CDY.30T-#$Q,2LK*R4E)2`@("`@("`@("$A M(28F)BXN+C$Q,30T-#DY.3P\/#X^/D!`0$!`0$!`0#X^/CL[.S<W-S`P,"@H M*"0D)"(B(B`@("(B(B8F)BDI*2LK*RTM+2@H*`<'!P`````````````````` M`````!84`2PI`SLW!#HV!#HV!#HV!#DV!#DU!#DU!#@U!#@T!#@T!#<T!#<T M!#<S!#8S!#8S!#8R!#4R!#4R!#4Q!#4Q!#0Q!#0Q`S0P`S,P`S,P`S,O`S(O M`S(O`S(O`S$N`S$N`S$N`S`M`S`M`S`M`S`L`R\L`R\L`R\L`RXK`RXK`RXK M`RTJ`RTJ`RTJ`RPJ`RPI`RPI`RLI`RLH`RLH`RHH`RHG`RHG`RHG`RDG`RDF M`RDF`R@F`R@E`R@E`R<E`R<E`R<D`B8D`B8D`B8C`B4C`B4C`B4B`B4B`B0B M`B0B`B0A`B,A`B,A`B,@`B(@`B(@`B(@`B$?`B$?`B$?`B`>`B`>`B`>`A\= M`A\=`A\=`A\=`AX<`AX<`AX<`AT;`AT;`AT;`AP;`AP:`AP:`AL:`AL9`AL9 M`AH9`AH8`AH8`1H8`1D8`1D7`1D7`1@7`1@6`1@6`1<6`1<6`1<5`185`185 M`184`144`144`143`103`103`103`102`1,2`1,2`1,1`0``@7@)@'@)@'@) M@'@)?W<)?W<)?W<)?G8)?G8)?G8)?78)?74)?74)?74)?'0)?'0)?'0)>W,) M>W,)>W,)>G,)>G()>G()>7()>7$)>7$)>'$)>'$)>'`)>'`)=W`)=V\)=V\) M=F\)=FX(=FX(=6X(=6X(=6T(=&T(=&T(=&P(<VP(<VP(<VP(<FL(<FL(<FL( M<FH(<6H(<6H(<6D(<&D(<&D(<&D(;V@(;V@(;V@(;F<(;F<(;F<(;68(;68( M;68(;68(;&4(;&4(;&4(:V0(:V0(:V0(:F0(:F,(:F,(:6,(:6((:6(':&(' M:&$':&$'9V$'9V$'9V`'9V`'9F`'9E\'9E\'95\'95\'95X'9%X'9%X'9%T' M8UT'8UT'8UP'8EP'8EP'8EP'8EL'85L'85L'85H'8%H'8%H'8%H'7UD'7UD' M7UD'7E@'7E@'7E@'75<'75<'75<'7%<'7%8'7%8'7%8&6U4&6U4&6U4&6E4& M6E0&6E0&650&65,&65,&6%,&6%(&6%(&5U(&5U(&5U$&5U$&5E$&5E`&5E`& M55`&55`&54\&5$\&5$\&5$X&4TX&4TX&4TT&4DT&4DT&4DT&44P&44P&44P& M44L&4$L&4$L&4$L&3TH&3TH&3TH&3DD%3DD%3DD%34@%34@%34@%3$@%3$<% M3$H+3&(Y3'MH3)FA3;752KWH-IJX+FI\92$F;Q`06"<G0#T].3DY-#0T,3$Q M*RLK)24E("`@("`@("`@(2$A)B8F+2TM-#0T.3DY/S\_/S\_/S\_/S\_0$!` M0$!`/#P\-S<W,#`P*2DI(B(B("`@("`@("`@)24E*BHJ+BXN+R\O+R\O*2DI M!P<'````````````````````````%10!+"D#.S<$.S<$.C<$.C8$.C8$.38$ M.34$.34$.#4$.#0$.#0$-S0$-S0$-S,$-C,$-C,$-C($-C($-3($-3($-3$$ M-#$$-#$#-#`#,S`#,S`#,R\#,B\#,B\#,B\#,2X#,2X#,2X#,"T#,"T#,"T# M,"T#+RP#+RP#+RP#+BL#+BL#+BL#+2H#+2H#+2H#+"H#+"D#+"D#*RD#*R@# M*R@#*R@#*B@#*B<#*B<#*2<#*28#*28#*"8#*"4#*"4#)R4#)R4#)R0")B0" M)B0")B,")2,")2,")2(")2(")"(")"(")"$"(R$"(R$"(R`"(B`"(B`"(B`" M(1\"(1\"(1\"(!X"(!X"(!X"(!T"'QT"'QT"'QT"'AP"'AP"'AP"'1L"'1L" M'1L"'!L"'!H"'!H"&QH"&QD"&QD"&AD"&A@"&A@"&A@!&1@!&1<!&1<!&!<! M&!8!&!8!%Q8!%Q8!%Q4!%A4!%A4!%A0!%10!%10!%1,!%1,!%!,!%!,!%!(! M$Q(!$Q(!``"!>0F!>`F`>`F`>`F`>`E_=PE_=PE_=PE^=@E^=@E^=@E^=@E] M=0E]=0E]=0E\=`E\=`E\=`E[<PE[<PE[<PEZ<PEZ<@EZ<@EY<@EY<0EY<0EX M<0EX<0EX<`EX<`EW<`EW;PEW;PEV;PEV;@AV;@AU;@AU;@AU;0AT;0AT;0AT M;`AS;`AS;`AS;`AS:PAR:PAR:PAR:@AQ:@AQ:@AQ:0AP:0AP:0AP:0AO:`AO M:`AO:`AN9PAN9PAN9PAM9PAM9@AM9@AM9@AL90AL90AL90AK9`AK9`AK9`AJ M9`AJ8PAJ8PAI8PAI8@AI8@=H8@=H8@=H80=H80=G80=G8`=G8`=F8`=F7P=F M7P=E7P=E7P=E7@=D7@=D7@=D70=C70=C70=C70=C7`=B7`=B7`=B6P=A6P=A M6P=A6@=@6@=@6@=@6@=?60=?60=?60=>6`=>6`=>6`==6`==5P==5P==5P=< M5@=<5@=<5@9;509;509;509:509:5`9:5`995`994P994P984P984P984@98 M4@974@974097409640964`964`954`954`953P943P943P943@933@933@93 M3@923092309230923`913`913`912P902P902P902P9/2@9/2@9/2@9.205. M205.205-205-2`=230Y23A!35R%5>5Y3I[=2N=I(LM4VF+<J@YLJ:'=A)"EO M$!!8)R<_/CXY.3DU-34Q,3$K*RLE)24@("`@("`@("`A(2$F)B8M+2TT-#0[ M.SM`0$!`0$!`0$`_/S\]/3T\/#PX.#@S,S,O+R\H*"@A(2$@("`@("`@("`E M)24L+"PO+R\P,#`P,#`I*2D'!P<````````````````````````0#@$?'0(L M*0,R+P,Y-00Z-P0Z-@0Z-@0Y-@0Y-00Y-00X-00X-`0X-`0W-`0W-`0W,P0W M,P0V,P0V,@0V,@0U,@0U,@0U,00T,00T,0,T,`,S,`,S,`,S+P,R+P,R+P,R M+P,Q+@,Q+@,Q+@,Q+0,P+0,P+0,P+0,O+`,O+`,O+`,N*P,N*P,N*P,M*@,M M*@,M*@,L*@,L*0,L*0,L*0,K*`,K*`,K*`,J*`,J)P,J)P,I)P,I)@,I)@,H M)@,H)0,H)0,G)0,G)0,G)`(F)`(F)`(F(P(F(P(E(P(E(P(E(@(D(@(D(@(D M(0(C(0(C(0(C(`(B(`(B(`(B(`(A'P(A'P(A'P(A'@(@'@(@'@(@'@(?'0(? M'0(?'0(>'`(>'`(>'`(=&P(=&P(=&P(<&P(<&@(<&@(;&@(;&0(;&0(;&0(: M&0(:&`(:&`$9&`$9%P$9%P$8%P$8%@$8%@$7%@$7%@$7%0$6%0$6%0$6%`$6 M%`$5%`$5%`$5$P$4$P$4$P$4$@$3$@$``(%Y"8%Y"8%Y"8!X"8!X"8!X"7]W M"7]W"7]W"7]V"7YV"7YV"7YV"7UU"7UU"7UU"7QT"7QT"7QT"7MT"7MS"7MS M"7IS"7IR"7IR"7ER"7EQ"7EQ"7EQ"7AQ"7AP"7AP"7=P"7=O"7=O"79O"79O M"79N"'5N"'5N"'5M"'1M"'1M"'1L"'1L"'-L"'-L"'-K"')K"')K"')J"'%J M"'%J"'%J"'!I"'!I"'!I"&]H"&]H"&]H"&YG"&YG"&YG"&YG"&UF"&UF"&UF M"&QE"&QE"&QE"&ME"&MD"&MD"&ID"&IC"&IC"&EC"&EB"&EB!VEB!VAB!VAA M!VAA!V=A!V=@!V=@!V9@!V9@!V9?!V5?!V5?!V5>!V1>!V1>!V1=!V-=!V-= M!V-=!V-<!V)<!V)<!V);!V%;!V%;!V%;!V!:!V!:!V!:!U]9!U]9!U]9!UY8 M!UY8!UY8!UY8!UU7!UU7!UU7!UQ6!UQ6!UQ6!EM6!EM5!EM5!EI5!EI4!EI4 M!EE4!EE3!EE3!EA3!EA3!EA2!EA2!E=2!E=1!E=1!E91!E90!E90!E50!E50 M!E5/!E1/!E1/!E1.!E-.!E-.!E-.!E--!E)-!E)-!E),!E%,!E%,!E%+!E!+ M!E!+!E!+!D]*!D]*!D]*!DY)!4Y)!4Y)!5!,#F9C*'9T/HB'6(V6<(JBBV*4 MD"AXB"!P@"!P@"9K>E<N-6\0$%8I*3X^/CDY.34U-3$Q,2LK*R4E)2`@("`@ M("`@("$A(28F)BTM+30T-#L[.T!`0$!`0$!`0#X^/CL[.S8V-C,S,S$Q,2XN M+B<G)R$A(2`@("`@("`@("4E)2PL+"\O+S`P,#`P,"HJ*@<'!P`````````` M``````````````<'``X-`1@7`B<E`S<S!#LW!#HW!#HV!#HV!#DV!#DU!#DU M!#@U!#@U!#@T!#<T!#<T!#<S!#<S!#8S!#8R!#8R!#4R!#4R!#4Q!#0Q!#0Q M`S0P`S,P`S,P`S,P`S(O`S(O`S(O`S(N`S$N`S$N`S$M`S`M`S`M`S`M`R\L M`R\L`R\L`RXK`RXK`RXK`RTK`RTJ`RTJ`RPJ`RPI`RPI`RPI`RLH`RLH`RLH M`RHH`RHG`RHG`RDG`RDF`RDF`R@F`R@F`R@E`R<E`R<E`R<D`B<D`B8D`B8C M`B8C`B4C`B4C`B4B`B0B`B0B`B0A`B,A`B,A`B,A`B(@`B(@`B(@`B$?`B$? M`B$?`B$>`B`>`B`>`B`>`A\=`A\=`A\=`AX<`AX<`AX<`AT<`AT;`AT;`AP; M`AP:`AP:`AP:`AL9`AL9`AL9`AH9`AH8`AH8`1D8`1D7`1D7`1@7`1@7`1@6 M`1<6`1<6`1<5`185`185`184`184`144`144`143`103`103`102`0``@GD) M@7D)@7D)@7D)@'@)@'@)@'@)?W<)?W<)?W<)?W<)?G8)?G8)?G8)?74)?74) M?74)?'0)?'0)?'0)>W0)>W,)>W,)>G,)>G()>G()>G()>7()>7$)>7$)>'$) M>'`)>'`)=W`)=V\)=V\)=F\)=F\)=FX(=6X(=6X(=6T(=&T(=&T(=&T(=&P( M<VP(<VP(<VL(<FL(<FL(<FH(<6H(<6H(<6H(<&D(<&D(<&D(;V@(;V@(;V@( M;V@(;F<(;F<(;F<(;68(;68(;68(;&4(;&4(;&4(:V4(:V0(:V0(:F0(:F,( M:F,(:6,(:6((:6((:6(':&(':&$':&$'9V$'9V`'9V`'9F`'9F`'9E\'95\' M95\'95X'9%X'9%X'9%T'9%T'8UT'8UT'8UP'8EP'8EP'8EL'85L'85L'85L' M8%H'8%H'8%H'7UD'7UD'7UD'7U@'7E@'7E@'7E@'75<'75<'75<'7%8'7%8' M7%8'6U8&6U4&6U4&6E4&6E0&6E0&650&65,&65,&65,&6%,&6%(&6%(&5U(& M5U$&5U$&5E$&5E$&5E`&55`&55`&54\&5$\&5$\&5$X&5$X&4TX&4TX&4TT& M4DT&4DT&4DP&44P&44P&44P&4$L&4$L&4$L&3TH&3TH&3TH&44P)5%`.9V,H M>WE$BXI;FIEOH*!XFIUX6X9\(W&`('"`('"`(6Y^2#]':!@84"XN/CX^.3DY M-34U,3$Q*RLK)24E("`@("`@("`@(B(B)R<G+2TM-#0T.SL[0$!`0$!`0$!` M/CX^.#@X,3$Q,#`P+BXN+2TM)B8F(2$A("`@("`@("`@)24E+"PL+R\O,#`P M,#`P*RLK"`@(````````````````````````````````"`<!'QT"-3($.S<$ M.S<$.C<$.C8$.C8$.38$.34$.34$.#4$.#4$.#0$.#0$-S0$-S,$-S,$-C,$ M-C,$-C($-3($-3($-3$$-#$$-#$#-#`#,S`#,S`#,S`#,R\#,B\#,B\#,BX# M,2X#,2X#,2X#,"T#,"T#,"T#+RP#+RP#+RP#+BL#+BL#+BL#+2L#+2H#+2H# M+2H#+"D#+"D#+"D#*RD#*R@#*R@#*B@#*B<#*B<#*2<#*28#*28#*"8#*"8# M*"4#*"4#)R4#)R0")R0")B0")B0")B,")2,")2,")2(")"(")"(")"$"(R$" M(R$"(R$"(B`"(B`"(B`"(A\"(1\"(1\"(1X"(!X"(!X"(!X"'QT"'QT"'QT" M'AP"'AP"'AP"'1P"'1L"'1L"'1L"'!H"'!H"'!H"&QD"&QD"&QD"&AD"&A@" M&A@!&1@!&1<!&1<!&!<!&!<!&!8!%Q8!%Q8!%Q4!%Q4!%A4!%A0!%A0!%10! M%10!%1,!%!,!%!,!``"">@F">0F!>0F!>0F!>0F`>`F`>`F`>`F`=PE_=PE_ M=PE_=PE^=@E^=@E^=@E]=0E]=0E]=0E\=`E\=`E\=`E[=`E[<PE[<PE[<PEZ M<@EZ<@EZ<@EY<@EY<0EY<0EX<0EX<`EX<`EW<`EW;PEW;PEV;PEV;PEV;@AU M;@AU;@AU;0AU;0AT;0AT;0AT;`AS;`AS;`AS:PAR:PAR:PAR:@AQ:@AQ:@AQ M:@AP:0AP:0AP:0AP:`AO:`AO:`AO:`AN9PAN9PAN9PAM9@AM9@AM9@AL90AL M90AL90AK90AK9`AK9`AJ9`AJ8PAJ8PAJ8PAI8PAI8@AI8@=H8@=H80=H80=G M80=G8`=G8`=F8`=F8`=F7P=E7P=E7P=E7@=E7@=D7@=D7@=D70=C70=C70=C M7`=B7`=B7`=B6P=A6P=A6P=A6P=@6@=@6@=@6@=?60=?60=?60=?60=>6`=> M6`=>6`==5P==5P==5P=<5@=<5@=<5@=;5@9;509;509:509:5`9:5`9:5`99 M5`994P994P984P984@984@974@9740974096409640964`954`954`953P94 M3P943P943P943@933@933@933092309230923`913`913`913`902P902P90 M2P9/2@923@MA71]P;31]>T>'A560CV&;FW&@H'B4FWA-@7TB<8`@<(`@<(`@ M;W\[3%1-,C-%.CH^/CXZ.CHW-S<R,C(L+"PE)24A(2$A(2$D)"0G)R<J*BHN M+BXT-#0[.SM`0$!`0$!`0$`]/3TW-S<Q,3$N+BXJ*BHF)B8C(R,@("`@("`@ M("`@("`E)24L+"PO+R\P,#`P,#`M+2T+"PL````````````````````````` M```````(!P$?'0(V,@0[.`0[-P0[-P0Z-P0Z-@0Z-@0Y-@0Y-00Y-00Y-00X M-00X-`0X-`0W-`0W,P0W,P0V,P0V,P0V,@0U,@0U,@0U,00T,00T,0,T,`,S M,`,S,`,S,`,S+P,R+P,R+P,R+@,Q+@,Q+@,Q+@,P+0,P+0,P+0,O+`,O+`,O M+`,N*P,N*P,N*P,N*P,M*@,M*@,M*@,L*0,L*0,L*0,K*0,K*`,K*`,J*`,J M)P,J)P,I)P,I)@,I)@,H)@,H)@,H)0,H)0,G)0,G)`(G)`(F)`(F)`(F(P(E M(P(E(P(E(@(D(@(D(@(D(0(C(0(C(0(C(0(C(`(B(`(B(`(B'P(A'P(A'P(A M'P(@'@(@'@(@'@(?'0(?'0(?'0(>'`(>'`(>'`(='`(=&P(=&P(=&P(<&@(< M&@(<&@(;&@(;&0(;&0(:&0(:&`(:&`$9&`$9%P$9%P$8%P$8%P$8%@$8%@$7 M%@$7%0$7%0$6%0$6%0$6%`$5%`$5%`$5$P$4$P$``()Z"8)Z"8)Z"8%Y"8%Y M"8%Y"8%X"8!X"8!X"8!W"7]W"7]W"7]W"7YV"7YV"7YV"7UU"7UU"7UU"7QU M"7QT"7QT"7MT"7MS"7MS"7MS"7IR"7IR"7IR"7ER"7EQ"7EQ"7AQ"7AP"7AP M"7=P"7=P"7=O"79O"79O"79N"'9N"'5N"'5M"'5M"'1M"'1M"'1L"'-L"'-L M"'-K"')K"')K"')K"'%J"'%J"'%J"'!I"'!I"'!I"'!H"&]H"&]H"&]H"&YG M"&YG"&YG"&UF"&UF"&UF"&QF"&QE"&QE"&ME"&MD"&MD"&MD"&IC"&IC"&IC M"&EC"&EB"&EB!VAB!VAA!VAA!V=A!V=A!V=@!V9@!V9@!V9?!V9?!V5?!V5> M!V5>!V1>!V1>!V1=!V-=!V-=!V-<!V)<!V)<!V)<!V%;!V%;!V%;!V!:!V!: M!V!:!V!9!U]9!U]9!U]9!UY8!UY8!UY8!UU7!UU7!UU7!UQ7!UQ6!UQ6!UM6 M!EM5!EM5!EM5!EI4!EI4!EI4!EE4!EE3!EE3!EA3!EA2!EA2!E=2!E=2!E=1 M!E91!E91!E90!E50!E50!E5/!E5/!E1/!E1/!E1.!E-.!E-.!E--!E)-!E)- M!E),!E%,!E%,!E%,!E!+!E!+!E!+!E90#VUJ,8*`3HJ(68R+7(^.8)J:<*"@ M>(Z9>4=^?2)Q@"%P@"!P@")L>SM*3T`_/S\_/S\_/SP\/#@X.#(R,BPL+"4E M)2$A(2,C(RDI*2TM+2\O+S`P,#0T-#L[.T!`0$!`0$!`0#T]/3<W-S$Q,2LK M*R8F)B$A(2`@("`@("`@("`@("`@("4E)2PL+"\O+S`P,#`P,#`P,!(2$@`` M``````````````````````````````@(`1\=`C8R!#PX!#LX!#LW!#LW!#HW M!#HV!#HV!#HV!#DV!#DU!#DU!#@U!#@T!#@T!#<T!#<S!#<S!#8S!#8S!#8R M!#4R!#4R!#4Q!#0Q!#0Q`S0Q`S0P`S,P`S,P`S,O`S(O`S(O`S(N`S$N`S$N M`S$N`S`M`S`M`S`M`R\L`R\L`R\L`R\L`RXK`RXK`RXK`RTJ`RTJ`RTJ`RPI M`RPI`RPI`RLI`RLH`RLH`RHH`RHG`RHG`RDG`RDG`RDF`RDF`R@F`R@E`R@E M`R<E`R<D`B<D`B8D`B8D`B8C`B4C`B4C`B4B`B0B`B0B`B0B`B0A`B,A`B,A M`B,@`B(@`B(@`B(?`B$?`B$?`B$?`B`>`B`>`B`>`A\=`A\=`A\=`AX=`AX< M`AX<`AX<`AT;`AT;`AT;`AP:`AP:`AP:`AL:`AL9`AL9`AH9`AH8`AH8`1D8 M`1D8`1D7`1D7`1@7`1@6`1@6`1<6`1<5`1<5`185`185`184`144`144`143 M`0``@WH)@GH)@GH)@GH)@GD)@7D)@7D)@7@)@'@)@'@)@'@)?W<)?W<)?W<) M?G8)?G8)?G8)?74)?74)?74)?'4)?'0)?'0)?'0)>W,)>W,)>W,)>G,)>G() M>G()>7()>7$)>7$)>'$)>'`)>'`)=W`)=W`)=V\)=V\)=F\)=FX(=FX(=6X( M=6X(=6T(=&T(=&T(=&P(<VP(<VP(<VL(<FL(<FL(<FL(<6H(<6H(<6H(<6D( M<&D(<&D(<&D(;V@(;V@(;V@(;F<(;F<(;F<(;68(;68(;68(;&8(;&4(;&4( M;&4(:V0(:V0(:V0(:F0(:F,(:F,(:6,(:6((:6(':&(':&$':&$'9V$'9V$' M9V`'9F`'9F`'9E\'9E\'95\'95X'95X'9%X'9%X'9%T'8UT'8UT'8UP'8EP' M8EP'8EP'85L'85L'85L'85H'8%H'8%H'8%D'7UD'7UD'7UD'7E@'7E@'7E@' M75<'75<'75<'7%<'7%8'7%8'6U8&6U4&6U4&6U4&6E0&6E0&6E0&650&65,& M65,&6%,&6%(&6%(&5U(&5U(&5U$&5E$&5E$&5E`&5E`&55`&54\&54\&5$\& M5$\&5$X&4TX&4TX&4TT&4DT&4DT&4DT&44P&44P&44P&4$L&4$L&4TX-;6DP MA()0CXU?DI%EEY9KG9UTH*!XB9=Y17Y](W&`(7"`(6Y^+5]K/D-%0$!`/S\_ M/S\_/3T].3DY,S,S+"PL)24E(2$A)"0D*BHJ+R\O,C(R,S,S-S<W.SL[/S\_ M/S\_/3T].CHZ-C8V,3$Q*BHJ)"0D("`@("`@("`@("`@(2$A(B(B*"@H+2TM M+R\O,#`P,#`P,#`P'Q\?`P,#````````````````````````````!@8`&!<" M*B@#,B\#.#0$.S@$.S<$.S<$.C<$.C8$.C8$.C8$.38$.34$.34$.#4$.#0$ M.#0$-S0$-S0$-S,$-C,$-C,$-C($-3($-3($-3$$-3$$-#$$-#$#-#`#,S`# M,S`#,R\#,B\#,B\#,B\#,2X#,2X#,2X#,"T#,"T#,"T#+RP#+RP#+RP#+RP# M+BL#+BL#+BL#+2H#+2H#+2H#+"H#+"D#+"D#*RD#*R@#*R@#*B@#*B<#*B<# M*B<#*2<#*28#*28#*"8#*"4#*"4#)R4#)R4#)R0")B0")B0")B,")2,")2," M)2(")"(")"(")"(")"$"(R$"(R$"(R`"(B`"(B`"(B`"(1\"(1\"(1\"(!X" M(!X"(!X"'QT"'QT"'QT"'QT"'AP"'AP"'AP"'1L"'1L"'1L"'!H"'!H"'!H" M&QH"&QD"&QD"&AD"&A@"&A@!&1@!&1@!&1<!&1<!&!<!&!8!&!8!%Q8!%Q4! M%Q4!%A4!%A4!%A0!%10!%10!``"#>PF#>PF">@F">@F">@F">0F!>0F!>0F! M>`F`>`F`>`F`>`E_=PE_=PE_=PE^=@E^=@E^=@E]=0E]=0E]=0E]=0E\=`E\ M=`E\=`E[<PE[<PE[<PEZ<PEZ<@EZ<@EY<@EY<0EY<0EX<0EX<`EX<`EW<`EW M<`EW;PEW;PEV;PEV;@AV;@AU;@AU;@AU;0AT;0AT;0AT;`AS;`AS;`AS:PAR M:PAR:PAR:PAR:@AQ:@AQ:@AQ:0AP:0AP:0AP:0AO:`AO:`AO:`AN9PAN9PAN M9PAM9@AM9@AM9@AM9@AL90AL90AL90AK9`AK9`AK9`AJ9`AJ8PAJ8PAI8PAI M8@AI8@=H8@=H80=H80=G80=G80=G8`=G8`=F8`=F7P=F7P=E7P=E7P=E7@=D M7@=D7@=D70=C70=C70=C7`=B7`=B7`=B7`=B6P=A6P=A6P=A6@=@6@=@6@=@ M6@=?60=?60=?60=>6`=>6`=>6`==5P==5P==5P=<5P=<5@=<5@=<5@9;509; M509;509:509:5`9:5`995`994P994P984P984@984@974@974@9740974096 M40964`964`954`954`953P943P943P943@933@933@933092309230923091 M3`913`913`912P9/2@=@7!U\>D63DF6:FG">GG:?GG>4@F%T:EA!;G$D;GTI M970Z45Q--SU#/3U`0$`_/S\_/S\_/S\Z.CHS,S,L+"PE)24A(2$D)"0J*BHP M,#`U-34X.#@\/#P^/CX_/S\\/#PX.#@U-34R,C(P,#`J*BHC(R,@("`@("`@ M("`A(2$D)"0I*2DL+"PN+BXO+R\P,#`P,#`P,#`O+R\C(R,'!P<````````` M```````````````#`P`-#`$6%`$B(`(P+0,\.`0[.`0[-P0[-P0[-P0Z-P0Z M-@0Z-@0Y-@0Y-00Y-00X-00X-`0X-`0W-`0W-`0W,P0V,P0V,P0V,@0V,@0U M,@0U,00U,00T,00T,0,T,`,S,`,S,`,S+P,R+P,R+P,R+P,Q+@,Q+@,Q+@,P M+0,P+0,P+0,P+`,O+`,O+`,O+`,N*P,N*P,N*P,M*@,M*@,M*@,L*@,L*0,L M*0,K*0,K*`,K*`,K*`,J)P,J)P,J)P,I)P,I)@,I)@,H)@,H)0,H)0,G)0,G M)0,G)`(F)`(F)`(F(P(E(P(E(P(E(@(E(@(D(@(D(@(D(0(C(0(C(0(C(`(B M(`(B(`(B(`(A'P(A'P(A'P(@'@(@'@(@'@(@'0(?'0(?'0(?'0(>'`(>'`(> M'`(=&P(=&P(=&P(<&P(<&@(<&@(;&@(;&0(;&0(:&0(:&`(:&`(:&`$9&`$9 M%P$9%P$8%P$8%@$8%@$7%@$7%@$7%0$6%0$6%0$6%`$5%`$``(-["H-["H-[ M"8-Z"8)Z"8)Z"8)Y"8%Y"8%Y"8%X"8!X"8!X"8!X"7]W"7]W"7]W"7YV"7YV M"7YV"7YV"7UU"7UU"7UU"7QT"7QT"7QT"7MS"7MS"7MS"7IS"7IR"7IR"7ER M"7EQ"7EQ"7AQ"7AQ"7AP"7AP"7=P"7=O"7=O"79O"79N"'9N"'5N"'5N"'5M M"'1M"'1M"'1L"'-L"'-L"'-L"'-K"')K"')K"')J"'%J"'%J"'%I"'!I"'!I M"'!I"&]H"&]H"&]H"&YG"&YG"&YG"&UG"&UF"&UF"&UF"&QE"&QE"&QE"&MD M"&MD"&MD"&ID"&IC"&IC"&EC"&EB"&EB!VAB!VAB!VAA!VAA!V=A!V=@!V=@ M!V9@!V9?!V9?!V5?!V5?!V5>!V1>!V1>!V1=!V-=!V-=!V-=!V)<!V)<!V)< M!V);!V%;!V%;!V%:!V!:!V!:!V!:!U]9!U]9!U]9!UY8!UY8!UY8!UU8!UU7 M!UU7!UU7!UQ6!UQ6!UQ6!EM5!EM5!EM5!EI5!EI4!EI4!EE4!EE3!EE3!EA3 M!EA3!EA2!E=2!E=2!E=1!E=1!E91!E90!E90!E50!E50!E5/!E1/!E1/!E1. M!E-.!E-.!E-.!E)-!E)-!E)-!E),!E%,!E%,!E%+!E%-#'-P.)B8;:"@>)^> M=Y2"8G(M(E06&3='425H>$1%3VD7&VH5%48Y.4!`0#\_/S\_/S\_/SHZ.C,S M,RPL+"4E)2$A(20D)"HJ*C$Q,3@X.#X^/D!`0$!`0$!`0#L[.S0T-#`P,"\O M+R\O+RHJ*B,C(R`@("`@("`@(",C(RDI*2\O+R\O+R\O+R\O+S`P,#$Q,3,S M,S<W-SP\/!X>'@````````````````````````````````$!`!(1`2@F`SPX M!#PX!#PX!#LW!#LW!#LW!#HW!#HV!#HV!#DV!#DU!#DU!#@U!#@T!#@T!#<T M!#<T!#<S!#8S!#8S!#8R!#8R!#4R!#4R!#4Q!#0Q!#0Q`S0P`S,P`S,P`S,O M`S(O`S(O`S(O`S$N`S$N`S$N`S$M`S`M`S`M`S`M`R\L`R\L`R\L`RXK`RXK M`RXK`RTJ`RTJ`RTJ`RPJ`RPI`RPI`RLI`RLH`RLH`RLH`RHH`RHG`RHG`RDG M`RDF`RDF`R@F`R@E`R@E`R<E`R<E`R<D`B8D`B8D`B8C`B8C`B4C`B4C`B4B M`B0B`B0B`B0A`B,A`B,A`B,@`B(@`B(@`B(@`B$?`B$?`B$?`B`>`B`>`B`> M`B`>`A\=`A\=`A\=`AX<`AX<`AX<`AT;`AT;`AT;`AP;`AP:`AP:`AL:`AL9 M`AL9`AL9`AH9`AH8`AH8`1D8`1D7`1D7`1@7`1@6`1@6`1<6`1<6`1<5`185 M`185`184`0``A'L*A'L*@WL*@WL)@WH)@GH)@GH)@GD)@7D)@7D)@7D)@'@) M@'@)@'@)?W<)?W<)?W<)?G8)?G8)?G8)?G8)?74)?74)?74)?'0)?'0)?'0) M>W0)>W,)>W,)>G,)>G()>G()>7()>7$)>7$)>7$)>'$)>'`)>'`)=W`)=V\) M=V\)=F\)=F\)=FX(=6X(=6X(=6T(=&T(=&T(=&P(<VP(<VP(<VP(<VL(<FL( M<FL(<FH(<6H(<6H(<6H(<&D(<&D(<&D(;V@(;V@(;V@(;F<(;F<(;F<(;F<( M;68(;68(;68(;&4(;&4(;&4(:V4(:V0(:V0(:F0(:F,(:F,(:6,(:6((:6(' M:6(':&(':&$':&$'9V$'9V`'9V`'9F`'9F`'9E\'95\'95\'95X'9%X'9%X' M9%T'8UT'8UT'8UT'8UP'8EP'8EP'8EL'85L'85L'85H'8%H'8%H'8%H'7UD' M7UD'7UD'7E@'7E@'7E@'7E@'75<'75<'75<'7%8'7%8'7%8&6U4&6U4&6U4& M6E4&6E0&6E0&650&65,&65,&6%,&6%,&6%(&6%(&5U(&5U$&5U$&5E$&5E`& M5E`&55`&55`&54\&5$\&5$\&5$X&4TX&4TX&4TX&4TT&4DT&4DT&4DP&44P& M44P&4$H'<V`II81?IGU>DU]'>20;9P<%604%10X1+2$F3Q(5;@<(;Q`02C4U M0$!`/S\_/S\_/S\_.CHZ,S,S+"PL)24E(2$A)"0D*2DI,C(R.3DY/CX^0$!` M0$!`0$!`.SL[,S,S+R\O+"PL*BHJ)B8F(B(B("`@(B(B)"0D)R<G*RLK+R\O M,3$Q-#0T-34U-C8V-S<W.3DY/#P\/CX^+R\O$!`0!`0$```````````````` M````````````"PH!&1@")R4#,"P#.#0$/#@$.S<$.S<$.S<$.C<$.C8$.C8$ M.38$.34$.34$.#4$.#4$.#0$-S0$-S0$-S,$-S,$-C,$-C($-C($-3($-3($ M-3$$-#$$-#$#-#`#,S`#,S`#,S`#,B\#,B\#,B\#,BX#,2X#,2X#,2T#,"T# M,"T#,"T#+RP#+RP#+RP#+BL#+BL#+BL#+2L#+2H#+2H#+"H#+"D#+"D#+"D# M*R@#*R@#*R@#*B@#*B<#*B<#*2<#*28#*28#*"8#*"8#*"4#)R4#)R4#)R0" M)R0")B0")B,")B,")2,")2,")2(")"(")"(")"$"(R$"(R$"(R$"(B`"(B`" M(B`"(1\"(1\"(1\"(1X"(!X"(!X"(!X"'QT"'QT"'QT"'AP"'AP"'AP"'1P" M'1L"'1L"'!L"'!H"'!H"'!H"&QD"&QD"&QD"&AD"&A@"&A@!&1@!&1<!&1<! M&!<!&!8!&!8!%Q8!%Q8!%Q4!%A4!%A4!``"$?`J$?`J$>PJ#>PJ#>PF#>@F" M>@F">@F">0F!>0F!>0F!>0F`>`F`>`F`>`E_=PE_=PE_=PE_=PE^=@E^=@E^ M=@E]=0E]=0E]=0E\=`E\=`E\=`E[=`E[<PE[<PEZ<PEZ<@EZ<@EZ<@EY<0EY M<0EY<0EX<0EX<`EX<`EW<`EW;PEW;PEV;PEV;PEV;@AU;@AU;@AU;0AT;0AT M;0AT;`AT;`AS;`AS;`AS:PAR:PAR:PAR:@AQ:@AQ:@AQ:@AP:0AP:0AP:0AO M:`AO:`AO:`AO9PAN9PAN9PAN9PAM9@AM9@AM9@AL90AL90AL90AK90AK9`AK M9`AJ9`AJ8PAJ8PAI8PAI8@AI8@AI8@=H8@=H80=H80=G80=G8`=G8`=F8`=F M8`=F7P=E7P=E7P=E7@=D7@=D7@=D70=D70=C70=C70=C7`=B7`=B7`=B6P=A M6P=A6P=A6P=@6@=@6@=@6@=?60=?60=?60=>6`=>6`=>6`=>6`==5P==5P== M5P=<5@=<5@=<5@9;5@9;509;509:509:5`9:5`995`994P994P994P984P98 M4@984@974@9740974096409640964`954`954`953P943P943P943@933@93 M3@933@933092309230923`913`912@:4.Q'8&Q*H!P5Z``!N``!E``!;``!+ M```U``!.``!K``!W"`A1+BX_/S\_/S\_/S\_/S\Z.CHS,S,K*RLE)24A(2$D M)"0I*2DR,C(Y.3D^/CY`0$!`0$!`0$`[.SLS,S,M+2TH*"@D)"0B(B(@("`@ M("`D)"0I*2DL+"PN+BXO+R\T-#0Y.3D\/#P\/#P\/#P\/#P]/3T\/#PS,S,? M'Q\-#0T!`0$````````````````````````$!``*"0$1$`$C(`(T,`,\.`0\ M.`0[.`0[-P0[-P0Z-P0Z-@0Z-@0Y-@0Y-00Y-00X-00X-00X-`0X-`0W-`0W M,P0W,P0V,P0V,P0V,@0U,@0U,@0U,00T,00T,0,T,`,S,`,S,`,S,`,R+P,R M+P,R+P,R+@,Q+@,Q+@,Q+0,P+0,P+0,P+0,O+`,O+`,O+`,N*P,N*P,N*P,M M*P,M*@,M*@,M*@,L*0,L*0,L*0,K*`,K*`,K*`,J*`,J)P,J)P,I)P,I)@,I M)@,H)@,H)@,H)0,G)0,G)0,G)`(G)`(F)`(F(P(F(P(E(P(E(P(E(@(D(@(D M(@(D(0(C(0(C(0(C(0(B(`(B(`(B(`(B'P(A'P(A'P(A'@(@'@(@'@(@'@(? M'0(?'0(?'0(>'`(>'`(>'`(='`(=&P(=&P(<&P(<&@(<&@(<&@(;&0(;&0(; M&0(:&0(:&`(:&`$9&`$9%P$9%P$8%P$8%P$8%@$7%@$7%@$7%0$7%0$``(5\ M"H1\"H1\"H1["H-["H-["8-Z"8)Z"8)Z"8)Y"8%Y"8%Y"8%Y"8!X"8!X"8!X M"8!W"7]W"7]W"7]W"7YV"7YV"7YV"7UU"7UU"7UU"7QT"7QT"7QT"7MT"7MS M"7MS"7IS"7IR"7IR"7IR"7ER"7EQ"7EQ"7AQ"7AP"7AP"7=P"7=O"7=O"79O M"79O"79N"'5N"'5N"'5M"'5M"'1M"'1M"'1L"'-L"'-L"'-K"')K"')K"')J M"'%J"'%J"'%J"'!I"'!I"'!I"'!H"&]H"&]H"&]H"&YG"&YG"&YG"&UF"&UF M"&UF"&QE"&QE"&QE"&ME"&MD"&MD"&ID"&IC"&IC"&IC"&EC"&EB"&EB!VAB M!VAA!VAA!V=A!V=@!V=@!V9@!V9@!V9?!V5?!V5?!V5>!V5>!V1>!V1>!V1= M!V-=!V-=!V-<!V)<!V)<!V);!V%;!V%;!V%;!V!:!V!:!V!:!U]9!U]9!U]9 M!U]9!UY8!UY8!UY8!UU7!UU7!UU7!UQ6!UQ6!UQ6!UM6!EM5!EM5!EI5!EI4 M!EI4!EI4!EE4!EE3!EE3!EA3!EA2!EA2!E=2!E=1!E=1!E51!U11"51/"%-/ M!U1/!E1.!E-.!E-.!E1/!E1.!E-.!E)-!E),!E%,!E%,!E!+!UQ*#[XA#=D` M`)<``'<``&P``&0``%L``$P``#@``$4``%\``',$!%8I*3X^/CX^/CX^/CT] M/3@X.#`P,"DI*24E)2$A(20D)"DI*3(R,CDY.3X^/C\_/S\_/SX^/C@X.#,S M,RPL+"8F)B`@("`@("`@("`@("4E)2TM+3`P,#`P,#(R,C<W-ST]/3\_/S\_ M/SX^/CT]/3L[.S<W-RTM+2,C(Q45%00$!``````````````````````````` M``````,"`!<5`2LH`S4R!#DU!#PX!#LX!#LW!#LW!#HW!#HV!#HV!#DV!#DU M!#DU!#DU!#@U!#@T!#@T!#<T!#<S!#<S!#8S!#8S!#8R!#4R!#4R!#4Q!#0Q M!#0Q`S0P`S,P`S,P`S,P`S,O`S(O`S(O`S(N`S$N`S$N`S$N`S`M`S`M`S`M M`R\L`R\L`R\L`RXK`RXK`RXK`RXK`RTJ`RTJ`RTJ`RPI`RPI`RPI`RLI`RLH M`RLH`RHH`RHG`RHG`RDG`RDF`RDF`R@F`R@F`R@E`R@E`R<E`R<D`B<D`B8D M`B8D`B8C`B4C`B4C`B4B`B0B`B0B`B0A`B,A`B,A`B,A`B,@`B(@`B(@`B(? M`B$?`B$?`B$?`B`>`B`>`B`>`A\=`A\=`A\=`AX<`AX<`AX<`AT<`AT;`AT; M`AT;`AP:`AP:`AP:`AL:`AL9`AL9`AH9`AH8`AH8`1D8`1D7`1D7`1@7`1@7 M`1@6`1@6`1<6`1<5`0``A7P*A7P*A'P*A'P*A'L*@WL*@WL)@WH)@GH)@GH) M@GH)@7D)@7D)@7D)@7@)@'@)@'@)@'<)?W<)?W<)?W<)?G8)?G8)?G8)?74) M?74)?74)?'4)?'0)?'0)>W0)>W,)>W,)>W,)>G()>G()>G()>7()>7$)>7$) M>'$)>'`)>'`)=W`)=W`)=V\)=F\)=F\)=FX(=FX(=6X(=6T(=6T(=&T(=&T( M=&P(<VP(<VP(<VL(<FL(<FL(<FL(<6H(<6H(<6H(<&D(<&D(<&D(<&@(;V@( M;V@(;V@(;F<(;F<(;F<(;68(;68(;68(;&8(;&4(;&4(:V4(:V0(:V0(:V0( M:F,(:F,(:F,(:6,(:6((:6(':&(':&$':&$'9V$'9V$'9V`'9F`'9F`'9E\' M95\'95\'95X'95X'9%X'9%X'9%T'8UT'8UT'8UP'8EP'8EP'8EL'85L'85L' M85L'8%H'8%H'8%H'8%D'7UD'7UD'7UD'7E@'7E@'7E@'75<'75<'75<'7%8' M7%8'7%8'6U8&6U4&6U4&6E4&6E0&6E0&6E0&650&65,&65,&6%,&6%(&6%(& M5U(&5U$&5%`)5%H:4UD:4E4445(045,145(245(24%$/3T\.3TX.3U$34%48 M4%4:3U8<4%@?;4L@Y`X)O@``@0``<@``:P``8@``5P``20``.```/```3P`` M;@$!6B4E/3T].CHZ.3DY-S<W,3$Q*2DI)"0D(B(B("`@(R,C*BHJ,C(R.3DY M/3T]/CX^.SL[.#@X-34U,3$Q+"PL)B8F("`@("`@("`@("`@)24E+2TM,C(R M-34U.#@X.SL[/CX^/CX^/#P\.3DY-C8V,3$Q*BHJ)"0D(B(B&1D9"`@(```` M`````````````````````````````0$`#0P!&!8"(R$"+RP#.S<$/#@$.S@$ M.S<$.S<$.C<$.C8$.C8$.38$.38$.34$.34$.#4$.#0$.#0$-S0$-S,$-S,$ M-C,$-C,$-C($-3($-3($-3$$-#$$-#$#-#$#-#`#,S`#,S`#,R\#,B\#,B\# M,BX#,2X#,2X#,2X#,"T#,"T#,"T#+RP#+RP#+RP#+BP#+BL#+BL#+BL#+2H# M+2H#+2H#+"D#+"D#+"D#*RD#*R@#*R@#*B@#*B<#*B<#*2<#*2<#*28#*28# M*"8#*"4#*"4#)R4#)R0")R0")B0")B0")B,")2,")2,")2(")"(")"(")"(" M(R$"(R$"(R$"(R`"(B`"(B`"(A\"(1\"(1\"(1\"(!X"(!X"(!X"'QT"'QT" M'QT"'AT"'AP"'AP"'AP"'1L"'1L"'1L"'!H"'!H"'!H"&QH"&QD"&QD"&AD" M&A@"&A@!&1@!&1@!&1<!&!<!&!<!&!8!&!8!%Q8!``"%?0J%?0J%?`J$?`J$ M?`J$>PJ#>PJ#>PF#>@F">@F">@F">@F!>0F!>0F!>0F!>`F`>`F`>`F`>`E_ M=PE_=PE_=PE^=@E^=@E^=@E]=0E]=0E]=0E\=0E\=`E\=`E\=`E[<PE[<PE[ M<PEZ<PEZ<@EZ<@EY<@EY<0EY<0EX<0EX<`EX<`EW<`EW<`EW;PEW;PEV;PEV M;@AV;@AU;@AU;0AU;0AT;0AT;0AT;`AS;`AS;`AS:PAR:PAR:PAR:PAQ:@AQ M:@AQ:@AQ:0AP:0AP:0AP:`AO:`AO:`AO:`AN9PAN9PAN9PAM9@AM9@AM9@AL M9@AL90AL90AL90AK9`AK9`AK9`AJ8PAJ8PAJ8PAI8PAI8@AI8@=H8@=H80=H M80=G80=G80=G8`=F8`=F8`=F7P=F7P=E7P=E7@=E7@=D7@=D7@=D70=C70=C M70=C7`=B7`=B7`=B7`=A6P=A6P=A6P=A6@=@6@=@6@=@60=?60=?60=?60=> M6`=>6`=>6`==5P==5P==5P=<5P=<5@=<5@=;5@9;509;509;509:5`9:5`9: M5`995`994P994P984P984@984@974@964091935-<5-,;DU-93M-9S],;$A, M;DU):4=#8#M"8#U':TY*=%Y)>&5(>VY(?7)X7%3I"@FT``![``!O``!G``!? M``!4``!%```X```U``!#``!G``!;(R,\.SLW-S<T-#0P,#`J*BHC(R,A(2$A M(2$@("`C(R,J*BHS,S,Y.3D]/3T\/#PW-S<R,C(P,#`O+R\L+"PE)24@("`@ M("`@("`@("`F)B8M+2TS,S,Y.3D^/CX^/CX_/S\^/CXY.3DT-#0M+2TG)R<A M(2$@("`@("`<'!P,#`P````````````````````````````````````#`P`% M!``1$`$F)`(Z-P0\.`0\.`0[.`0[-P0[-P0Z-P0Z-@0Z-@0Z-@0Y-@0Y-00Y M-00X-00X-`0X-`0W-`0W-`0W,P0V,P0V,P0V,@0U,@0U,@0U,00U,00T,00T M,0,T,`,S,`,S,`,S+P,R+P,R+P,R+P,Q+@,Q+@,Q+@,P+0,P+0,P+0,O+`,O M+`,O+`,O+`,N*P,N*P,N*P,M*@,M*@,M*@,L*0,L*0,L*0,K*0,K*`,K*`,J M*`,J)P,J)P,J)P,I)P,I)@,I)@,H)@,H)0,H)0,G)0,G)`(G)`(F)`(F)`(F M(P(E(P(E(P(E(@(D(@(D(@(D(@(D(0(C(0(C(0(C(`(B(`(B(`(B'P(A'P(A M'P(A'P(@'@(@'@(@'@(?'0(?'0(?'0(?'0(>'`(>'`(>'`(=&P(=&P(=&P(< M&@(<&@(<&@(;&@(;&0(;&0(:&0(:&`(:&`$9&`$9&`$9%P$9%P$8%P$8%@$8 M%@$``(9]"H5]"H5]"H5\"H1\"H1\"H1["H-["H-["8-Z"8)Z"8)Z"8)Z"8)Y M"8%Y"8%Y"8%X"8!X"8!X"8!X"7]W"7]W"7]W"7YV"7YV"7YV"7UU"7UU"7UU M"7UU"7QT"7QT"7QT"7MS"7MS"7MS"7IS"7IR"7IR"7ER"7EQ"7EQ"7AQ"7AP M"7AP"7=P"7=P"7=O"7=O"79O"79N"'9N"'5N"'5N"'5M"'1M"'1M"'1L"'-L M"'-L"'-K"')K"')K"')K"')J"'%J"'%J"'%I"'!I"'!I"'!I"&]H"&]H"&]H M"&YG"&YG"&YG"&UF"&UF"&UF"&QF"&QE"&QE"&QE"&MD"&MD"&MD"&ID"&IC M"&IC"&EC"&EB"&EB!VAB!VAA!VAA!V=A!V=A!V=@!V=@!V9@!V9?!V9?!V5? M!V5?!V5>!V1>!V1>!V1=!V-=!V-=!V-<!V)<!V)<!V)<!V%;!V%;!V%;!V%: M!V!:!V!:!V!:!U]9!U]9!U]9!UY8!UY8!UY8!UU7!UU7!UU7!UQ7!UQ6!UQ6 M!UQ6!EM5!EM5!EM5!EI5!EI4!EI4!EE4!EE3!EE3!EA3!EA2!EA2!E=2!DYH M0$>1FD*7JD*(C$*-ED*6J4&<M3F3K"Q_D#"%F#R8L4*AOT.CPD.FQT.GR6N` MF=$C*K4'"(<``'4``&8``%T``%$``$,``#@``#,``#L``%0``%$C(SP[.S8V M-C,S,RXN+B@H*"(B(B$A(2(B(B,C(R@H*#`P,#<W-SL[.ST]/3P\/#8V-C`P M,"XN+BLK*RDI*20D)"`@("`@("(B(B4E)2DI*2TM+30T-#HZ.C\_/SX^/CP\ M/#HZ.C4U-3$Q,2LK*R0D)"`@("`@("`@(!X>'A45%0@("`("`@`````````` M``````````````````````````P+`20A`CLW!#PY!#PX!#PX!#LX!#LW!#LW M!#LW!#HV!#HV!#HV!#DV!#DU!#DU!#@U!#@T!#@T!#<T!#<T!#<S!#8S!#8S M!#8R!#4R!#4R!#4Q!#4Q!#0Q!#0Q`S0P`S,P`S,P`S,O`S(O`S(O`S(O`S$N M`S$N`S$N`S`M`S`M`S`M`S`L`R\L`R\L`R\L`RXK`RXK`RXK`RTJ`RTJ`RTJ M`RPJ`RPI`RPI`RLI`RLH`RLH`RHH`RHG`RHG`RHG`RDG`RDF`RDF`R@F`R@E M`R@E`R<E`R<E`R<D`B8D`B8D`B8C`B4C`B4C`B4B`B4B`B0B`B0B`B0A`B,A M`B,A`B,@`B(@`B(@`B(@`B$?`B$?`B$?`B`>`B`>`B`>`A\=`A\=`A\=`A\= M`AX<`AX<`AX<`AT;`AT;`AT;`AP;`AP:`AP:`AL:`AL9`AL9`AH9`AH8`AH8 M`AH8`1D8`1D7`1D7`1@7`1@6`0``AGT*AGT*A7T*A7T*A7P*A'P*A'P*A'L* M@WL*@WL)@WL)@WH)@GH)@GH)@GD)@7D)@7D)@7@)@'@)@'@)@'@)?W<)?W<) M?W<)?G8)?G8)?G8)?78)?74)?74)?74)?'0)?'0)?'0)>W,)>W,)>W,)>G,) M>G()>G()>7()>7$)>7$)>'$)>'$)>'`)>'`)=W`)=V\)=V\)=F\)=FX(=FX( M=6X(=6X(=6T(=&T(=&T(=&P(<VP(<VP(<VP(<VL(<FL(<FL(<FH(<6H(<6H( M<6D(<&D(<&D(<&D(;V@(;V@(;V@(;F<(;F<(;F<(;6<(;68(;68(;68(;&4( M;&4(;&4(:V0(:V0(:V0(:F0(:F,(:F,(:6,(:6((:6(':&(':&(':&$':&$' M9V$'9V`'9V`'9F`'9E\'9E\'95\'95\'95X'9%X'9%X'9%T'8UT'8UT'8UT' M8EP'8EP'8EP'8EL'85L'85L'85H'8%H'8%H'8%H'7UD'7UD'7UD'7E@'7E@' M7E@'75<'75<'75<'75<'7%8'7%8'7%8&6U4&6U4&6U4&6E4&6E0&6E0&650& M65,&65,&6%,&6%(&6%(&4G=63Z>X3;SC3;SB3;SC3;SC3;WD3;[F3<+N3<3R M3,+P3,+O3,+O3,+P3,'O3K3>;W^9JR\YM0``A```9P``6@``3P``0@``-P`` M,@``-0``/@``0B,C/#L[-C8V,S,S+BXN)R<G(B(B(B(B)"0D*"@H+BXN-S<W M/#P\/3T]/S\_/#P\-C8V,#`P*RLK)R<G(R,C(2$A("`@(B(B)R<G*BHJ+2TM M+R\O,S,S.CHZ/S\_/#P\.#@X-#0T,3$Q+R\O*BHJ)"0D("`@("`@("`@'Q\? M'1T=%Q<7"0D)`0$!````````````````````````````````#`P!(R$".S<$ M/3D$/#D$/#@$/#@$/#@$.S<$.S<$.S<$.C<$.C8$.C8$.38$.34$.34$.#4$ M.#0$.#0$-S0$-S0$-S,$-C,$-C,$-C($-C($-3($-3($-3$$-#$$-#$#-#`# M,S`#,S`#,R\#,B\#,B\#,B\#,2X#,2X#,2X#,2T#,"T#,"T#,"T#+RP#+RP# M+RP#+BL#+BL#+BL#+2H#+2H#+2H#+"H#+"D#+"D#*RD#*R@#*R@#*R@#*B@# M*B<#*B<#*2<#*28#*28#*"8#*"4#*"4#)R4#)R4#)R0")B0")B0")B,")B," M)2,")2,")2(")"(")"(")"$"(R$"(R$"(R`"(B`"(B`"(B`"(1\"(1\"(1\" M(!X"(!X"(!X"(!X"'QT"'QT"'QT"'AP"'AP"'AP"'1L"'1L"'1L"'!L"'!H" M'!H"&QH"&QD"&QD"&QD"&AD"&A@"&A@!&1@!&1<!&1<!&!<!``"&?@J&?@J& M?0J%?0J%?0J%?`J$?`J$?`J$>PJ$>PJ#>PJ#>PF#>@F">@F">@F">0F!>0F! M>0F!>0F`>`F`>`F`>`E_=PE_=PE_=PE^=@E^=@E^=@E^=@E]=0E]=0E]=0E\ M=`E\=`E\=`E[=`E[<PE[<PEZ<PEZ<@EZ<@EY<@EY<0EY<0EY<0EX<0EX<`EX M<`EW<`EW;PEW;PEV;PEV;PEV;@AU;@AU;@AU;0AT;0AT;0AT;`AS;`AS;`AS M;`AS:PAR:PAR:PAR:@AQ:@AQ:@AQ:0AP:0AP:0AP:0AO:`AO:`AO:`AN9PAN M9PAN9PAN9PAM9@AM9@AM9@AL90AL90AL90AK9`AK9`AK9`AJ9`AJ8PAJ8PAI M8PAI8@AI8@=H8@=H8@=H80=H80=G80=G8`=G8`=F8`=F7P=F7P=E7P=E7P=E M7@=D7@=D7@=D70=C70=C70=C70=C7`=B7`=B7`=B6P=A6P=A6P=A6@=@6@=@ M6@=@6@=?60=?60=?60=>6`=>6`=>6`==6`==5P==5P==5P=<5@=<5@=<5@9; M509;509;509:509:5`9:5`995`994P994P984P9540=5;T%4>%94=4]4<4=4 M<4=4<4=3<DI2A'!/K,%-Q/%-Q/)-Q/)-Q/)-Q/)-Q/),PN]'M-Q];X;N``"7 M``!J``!7``!.``!"```W```T```U```R```X(B(\.SLW-S<S,S,N+BXG)R<B M(B(B(B(F)B8K*RLT-#0\/#Q`0$!`0$!`0$`\/#PW-S<P,#`I*2DB(B(@("`@ M("`@("`E)24J*BHP,#`P,#`Q,3$T-#0Y.3D^/CXY.3DT-#0P,#`O+R\N+BXI M*2DC(R,@("`@("`@("`?'Q\>'AX<'!P-#0T"`@(````````````````````` M```````````,"P$B(`(X-00Y-@0Z-@0Y-@0\.`0\.`0\.`0[-P0[-P0[-P0Z M-P0Z-@0Z-@0Y-@0Y-00Y-00X-00X-00X-`0W-`0W-`0W,P0W,P0V,P0V,@0V M,@0U,@0U,@0U,00T,00T,0,T,`,S,`,S,`,S,`,R+P,R+P,R+P,Q+@,Q+@,Q M+@,Q+0,P+0,P+0,P+0,O+`,O+`,O+`,N*P,N*P,N*P,M*P,M*@,M*@,L*@,L M*0,L*0,L*0,K*`,K*`,K*`,J*`,J)P,J)P,I)P,I)@,I)@,H)@,H)0,H)0,G M)0,G)0,G)`(F)`(F)`(F(P(F(P(E(P(E(P(E(@(D(@(D(@(D(0(C(0(C(0(C M(`(B(`(B(`(B(`(A'P(A'P(A'P(A'@(@'@(@'@(@'@(?'0(?'0(?'0(>'`(> M'`(>'`(=&P(=&P(=&P(<&P(<&@(<&@(;&@(;&0(;&0(;&0(:&0(:&`(:&`$9 M&`$9%P$9%P$``(=^"H9^"H9^"H9]"H5]"H5]"H5\"H1\"H1\"H1["H1["H-[ M"H-["8-Z"8)Z"8)Z"8)Y"8%Y"8%Y"8%Y"8!X"8!X"8!X"7]W"7]W"7]W"7]V M"7YV"7YV"7YV"7UU"7UU"7UU"7QT"7QT"7QT"7MT"7MS"7MS"7IS"7IR"7IR M"7IR"7EQ"7EQ"7EQ"7AQ"7AP"7AP"7=P"7=O"7=O"79O"79O"79N"'5N"'5N M"'5M"'1M"'1M"'1L"'1L"'-L"'-L"'-K"')K"')K"')J"'%J"'%J"'%J"'!I M"'!I"'!I"&]H"&]H"&]H"&]G"&YG"&YG"&YG"&UF"&UF"&UF"&QE"&QE"&QE M"&ME"&MD"&MD"&ID"&IC"&IC"&EC"&EB"&EB"&EB!VAB!VAA!VAA!V=A!V=@ M!V=@!V9@!V9@!V9?!V5?!V5?!V5>!V1>!V1>!V1=!V1=!V-=!V-=!V-<!V)< M!V)<!V);!V%;!V%;!V%;!V!:!V!:!V!:!U]9!U]9!U]9!UY8!UY8!UY8!UY8 M!UU7!UU7!UU7!UQ6!UQ6!UQ6!EM6!EM5!EM5!EI5!EI4!EI4!EE4!EE3!EE3 M!E94#%=B)55>(518&5-5%%-4%%-6%U1A*%9_9%6JNU+#[DW$\DW$\DW$\DW$ M\D[#\$W#\$O`[&>4M><1%:H``'0``%L``%(``$L``$8``$0``$(``#<``#@A M(3P[.S<W-S,S,RXN+B<G)R(B(B(B(B,C(R<G)S`P,#L[.T!`0$!`0$!`0#T] M/3<W-S`P,"DI*2(B(B$A(2,C(R8F)BDI*2TM+3$Q,3,S,S8V-C<W-S<W-S@X M.#8V-C(R,B\O+RLK*RDI*24E)2(B(B`@("`@("`@(!\?'QH:&A`0$`8&!@$! M`0````````````````````````````````<'`!03`2(?`B(A`B(@`B(@`CTY M!#PX!#PX!#PX!#LW!#LW!#LW!#HW!#HV!#HV!#DV!#DU!#DU!#@U!#@U!#@T M!#@T!#<T!#<S!#<S!#8S!#8R!#8R!#4R!#4R!#4Q!#0Q!#0Q`S0P`S,P`S,P M`S,P`S(O`S(O`S(O`S(N`S$N`S$N`S$M`S`M`S`M`S`M`R\L`R\L`R\L`RXK M`RXK`RXK`RTK`RTJ`RTJ`RTJ`RPI`RPI`RPI`RLH`RLH`RLH`RHH`RHG`RHG M`RDG`RDF`RDF`R@F`R@F`R@E`R<E`R<E`R<D`B<D`B8D`B8C`B8C`B4C`B4C M`B4B`B0B`B0B`B0A`B,A`B,A`B,A`B(@`B(@`B(@`B(?`B$?`B$?`B$>`B`> M`B`>`B`>`A\=`A\=`A\=`AX<`AX<`AX<`AT<`AT;`AT;`AP;`AP:`AP:`AP: M`AL9`AL9`AL9`AH9`AH8`AH8`1D8`1D7`0``AWX*AWX*AGX*AGX*AGT*A7T* MA7T*A7P*A7P*A'P*A'P*A'L*@WL*@WL)@WH)@GH)@GH)@GD)@7D)@7D)@7D) M@'@)@'@)@'@)@'<)?W<)?W<)?W<)?G8)?G8)?G8)?74)?74)?74)?'0)?'0) M?'0)>W0)>W,)>W,)>G,)>G()>G()>G()>7()>7$)>7$)>'$)>'`)>'`)=W`) M=V\)=V\)=F\)=F\)=FX(=6X(=6X(=6T(=6T(=&T(=&T(=&P(<VP(<VP(<VL( M<FL(<FL(<FH(<6H(<6H(<6H(<&D(<&D(<&D(;V@(;V@(;V@(;V@(;F<(;F<( M;F<(;68(;68(;68(;&4(;&4(;&4(:V4(:V0(:V0(:F0(:F,(:F,(:F,(:6,( M:6((:6(':&(':&$':&$'9V$'9V`'9V`'9F`'9F`'9E\'95\'95\'95X'9%X' M9%X'9%X'9%T'8UT'8UT'8UP'8EP'8EP'8EL'85L'85L'85L'8%H'8%H'8%H' M7UD'7UD'7UD'7UD'7E@'7E@'7E@'75<'75<'75<'7%8'7%8'7%8'6U8&6U4& M6U4&6E4&6E0&6E0&650&65,&5U,)5E,,5%(+55$)55$(5%$)4U`+5EP?5G]D M5*FY3L+L3<3R3<3R3<3R3<3R3\+N3L#L2\#L5;7?T"TXP@``@P``9```6P`` M5P``50``5```3@``/```."$A/#L[-S<W,S,S+2TM)R<G(B(B(2$A(2$A(B(B M+"PL.CHZ0$!`0$!`0$!`/#P\-C8V,#`P*2DI(B(B(B(B)B8F*RLK+BXN+R\O M,3$Q-C8V.CHZ.CHZ-S<W,S,S,3$Q,3$Q+2TM*"@H(R,C(2$A("`@("`@("`@ M("`@'!P<$!`0`P,#`0$!`````````````````````````````````````@(` M!P8`"PH!"PH!"PH!"PH!/3D$/3D$/#@$/#@$/#@$.S@$.S<$.S<$.C<$.C8$ M.C8$.38$.34$.34$.#4$.#4$.#0$.#0$-S0$-S,$-S,$-C,$-C,$-C($-3($ M-3($-3$$-#$$-#$#-#`#,S`#,S`#,S`#,R\#,B\#,B\#,BX#,2X#,2X#,2X# M,"T#,"T#,"T#+RP#+RP#+RP#+BL#+BL#+BL#+2L#+2H#+2H#+2H#+"D#+"D# M+"D#*RD#*R@#*R@#*B@#*B<#*B<#*2<#*28#*28#*"8#*"8#*"4#*"4#)R4# M)R0")R0")B0")B0")B,")2,")2,")2(")"(")"(")"$"(R$"(R$"(R$"(B`" M(B`"(B`"(A\"(1\"(1\"(1\"(!X"(!X"(!X"'QT"'QT"'QT"'AP"'AP"'AP" M'1P"'1L"'1L"'1L"'!H"'!H"'!H"&QH"&QD"&QD"&AD"&A@"&A@!&1@!``"' M?PJ'?PJ'?@J&?@J&?@J&?0J&?0J%?0J%?`J%?`J$?`J$?`J$>PJ#>PJ#>PF# M>@F">@F">@F">@F!>0F!>0F!>0F`>`F`>`F`>`F`=PE_=PE_=PE_=PE^=@E^ M=@E^=@E]=0E]=0E]=0E\=0E\=`E\=`E[=`E[<PE[<PE[<PEZ<@EZ<@EZ<@EY M<@EY<0EY<0EX<0EX<`EX<`EW<`EW<`EW;PEV;PEV;PEV;@AV;@AU;@AU;0AU M;0AT;0AT;0AT;`AS;`AS;`AS:PAR:PAR:PAR:PAQ:@AQ:@AQ:@AP:0AP:0AP M:0AP:`AO:`AO:`AO:`AN9PAN9PAN9PAM9@AM9@AM9@AL90AL90AL90AK90AK M9`AK9`AK9`AJ8PAJ8PAJ8PAI8PAI8@AI8@=H8@=H80=H80=G80=G8`=G8`=F M8`=F8`=F7P=E7P=E7P=E7@=E7@=D7@=D7@=D70=C70=C70=C7`=B7`=B7`=B M6P=A6P=A6P=A6P=@6@=@6@=@6@=@60=?60=?60=?60=>6`=>6`=>6`==5P== M5P==5P=<5@=<5@=<5@=;5@9;509;509:509:5`9:5`9:5`995`994P994P98 M4P984@984@974@964PQ<<D5?GZ!?O^!;Q>Y7Q.]4P^]1PNU/O^I-O.9)NN5, MPN^A9G_,$!20`@)Q``!E``!>``!<``!:``!3```]```X("`[.CHU-34P,#`J M*BHE)24B(B(@("`@("`@("`I*2DY.3D_/S\^/CX]/3TZ.CHU-34P,#`I*2DC M(R,C(R,H*"@N+BXQ,3$R,C(T-#0X.#@Z.CHZ.CHU-34P,#`O+R\M+2TJ*BHE M)24@("`@("`@("`@("`?'Q\='1T4%!0&!@8````````````````````````` M```````````````````````````````````````````].00].00].00\.`0\ M.`0\.`0[.`0[-P0[-P0Z-P0Z-@0Z-@0Y-@0Y-@0Y-00Y-00X-00X-`0X-`0W M-`0W,P0W,P0V,P0V,P0V,@0U,@0U,@0U,00T,00T,0,T,0,T,`,S,`,S,`,S M+P,R+P,R+P,R+@,Q+@,Q+@,Q+@,P+0,P+0,P+0,O+`,O+`,O+`,N+`,N*P,N M*P,N*P,M*@,M*@,M*@,L*0,L*0,L*0,K*0,K*`,K*`,J*`,J)P,J)P,I)P,I M)P,I)@,I)@,H)@,H)0,H)0,G)0,G)`(G)`(F)`(F)`(F(P(E(P(E(P(E(@(D M(@(D(@(D(0(C(0(C(0(C(0(C(`(B(`(B(`(B'P(A'P(A'P(A'P(@'@(@'@(@ M'@(?'0(?'0(?'0(>'`(>'`(>'`(>'`(=&P(=&P(=&P(<&@(<&@(<&@(;&@(; M&0(;&0(:&0(:&`(:&`$``(A_"H=_"H=_"H=^"H=^"H9^"H9]"H9]"H5]"H5\ M"H5\"H1\"H1\"H1["H-["H-["8-Z"8)Z"8)Z"8)Z"8%Y"8%Y"8%Y"8%X"8!X M"8!X"8!W"7]W"7]W"7]W"7YV"7YV"7YV"7UU"7UU"7UU"7QU"7QT"7QT"7QT M"7MS"7MS"7MS"7IR"7IR"7IR"7ER"7EQ"7EQ"7AQ"7AP"7AP"7=P"7=P"7=O M"79O"79O"79N"'9N"'5N"'5M"'5M"'1M"'1M"'1L"'-L"'-L"'-K"')K"')K M"')K"'%J"'%J"'%J"'%I"'!I"'!I"'!H"&]H"&]H"&]H"&YG"&YG"&YG"&UF M"&UF"&UF"&QF"&QE"&QE"&ME"&MD"&MD"&MD"&IC"&IC"&IC"&EC"&EB"&EB M!VAB!VAA!VAA!V=A!V=A!V=@!V9@!V9@!V9?!V9?!V5?!V5>!V5>!V1>!V1> M!V1=!V-=!V-=!V-<!V)<!V)<!V)<!V%;!V%;!V%;!V!:!V!:!V!:!V!9!U]9 M!U]9!U]9!UY8!UY8!UY8!UU7!UU7!UU7!UQ7!UQ6!UQ6!UM6!EM5!EM5!EM5 M!EI4!EI4!EI4!EE4!EE3!EE3!EA3!EA2!EA2!E=3"FAN-X&;B9#`S8W)X8?) MXG3#X5V[WE"WW4>SVD>TW4O`[&6HT)9C>HL6&W4``&8``%T``%H``%D``%,` M`#T``#<?'SHY.3(R,BLK*R4E)2(B(B`@("`@("`@("`@("DI*3DY.3T]/3HZ M.C@X.#0T-#$Q,3`P,"DI*2,C(R,C(R@H*"XN+C,S,S<W-S@X.#@X.#<W-S4U M-3,S,S`P,"PL+"@H*"0D)"(B(B`@("`@("`@(!\?'QL;&Q`0$`8&!@$!`0`` M```````````````````````````````````````````````````````````` M`````#XZ!#TY!#TY!#TY!#PX!#PX!#PX!#LX!#LW!#LW!#HW!#HV!#HV!#HV M!#DV!#DU!#DU!#@U!#@T!#@T!#<T!#<S!#<S!#8S!#8S!#8R!#4R!#4R!#4Q M!#0Q!#0Q!#0Q`S0P`S,P`S,P`S,O`S(O`S(O`S(N`S$N`S$N`S$N`S`M`S`M M`S`M`R\L`R\L`R\L`R\L`RXK`RXK`RXK`RTJ`RTJ`RTJ`RPI`RPI`RPI`RLI M`RLH`RLH`RHH`RHG`RHG`RDG`RDG`RDF`RDF`R@F`R@E`R@E`R<E`R<D`B<D M`B8D`B8D`B8C`B4C`B4C`B4B`B0B`B0B`B0B`B0A`B,A`B,A`B,@`B(@`B(@ M`B(?`B$?`B$?`B$?`B`>`B`>`B`>`A\=`A\=`A\=`AX=`AX<`AX<`AX<`AT; M`AT;`AT;`AP:`AP:`AP:`AL:`AL9`AL9`AH9`AH8`@``B'\*B'\*AW\*AW\* MAWX*AWX*AGX*AGT*AGT*A7T*A7T*A7P*A'P*A'P*A'L*@WL*@WL)@WH)@GH) M@GH)@GH)@GD)@7D)@7D)@7@)@'@)@'@)@'@)?W<)?W<)?W<)?G8)?G8)?G8) M?74)?74)?74)?74)?'0)?'0)?'0)>W,)>W,)>W,)>G,)>G()>G()>7()>7$) M>7$)>'$)>'`)>'`)=W`)=W`)=V\)=V\)=F\)=FX(=FX(=6X(=6X(=6T(=&T( M=&T(=&P(<VP(<VP(<VL(<FL(<FL(<FL(<FH(<6H(<6H(<6D(<&D(<&D(<&D( M;V@(;V@(;V@(;F<(;F<(;F<(;68(;68(;68(;&8(;&4(;&4(;&4(:V0(:V0( M:V0(:F0(:F,(:F,(:6,(:6((:6(':&(':&$':&$'9V$'9V$'9V`'9V`'9F`' M9E\'9E\'95\'95\'95X'9%X'9%X'9%T'8UT'8UT'8UP'8EP'8EP'8EP'85L' M85L'85L'85H'8%H'8%H'8%H'7UD'7UD'7UD'7E@'7E@'7E@'75<'75<'75<' M7%<'7%8'7%8'7%8&6U4&6U4&6U4&6E4&6E0&6E0&650&65,&65,&6%,&6%(& M65,*<6XRF)AVO\&YRL_1QL_2G\//<+3*4:S+0ZO/2[7<8LCO7\CQ4[CC<$!. M=0``90``6P``6```6```4P``/0``-Q\?.C@X+R\O)24E("`@("`@("`@("`@ M("`@("`@*RLK.#@X.SL[-S<W,C(R+R\O+R\O+R\O*2DI(R,C(R,C*"@H+BXN M-34U.SL[/3T].3DY,S,S,#`P,#`P,#`P*BHJ(R,C("`@("`@("`@("`@("`@ M'AX>$A(2!`0$```````````````````````````````````````````````` M````````````````````````````/CH$/CH$/3D$/3D$/3D$/#D$/#@$/#@$ M.S@$.S<$.S<$.S<$.C8$.C8$.C8$.38$.34$.34$.#4$.#0$.#0$-S0$-S0$ M-S,$-C,$-C,$-C($-3($-3($-3$$-3$$-#$$-#$#-#`#,S`#,S`#,R\#,B\# M,B\#,B\#,2X#,2X#,2X#,"T#,"T#,"T#,"P#+RP#+RP#+RP#+BL#+BL#+BL# M+2H#+2H#+2H#+"H#+"D#+"D#*RD#*R@#*R@#*B@#*B<#*B<#*B<#*2<#*28# M*28#*"8#*"4#*"4#)R4#)R4#)R0")B0")B0")B,")2,")2,")2(")2(")"(" M)"(")"$"(R$"(R$"(R`"(B`"(B`"(B`"(1\"(1\"(1\"(!X"(!X"(!X"'QT" M'QT"'QT"'QT"'AP"'AP"'AP"'1L"'1L"'1L"'!L"'!H"'!H"&QH"&QD"&QD" M&AD"``"(@`J(@`J(?PJ(?PJ'?PJ'?@J'?@J&?@J&?0J&?0J%?0J%?0J%?`J$ M?`J$?`J$>PJ#>PJ#>PF#>PF#>@F">@F">@F">0F!>0F!>0F!>`F`>`F`>`F` M>`E_=PE_=PE_=PE^=@E^=@E^=@E]=@E]=0E]=0E]=0E\=`E\=`E\=`E[<PE[ M<PE[<PEZ<PEZ<@EZ<@EY<@EY<0EY<0EX<0EX<0EX<`EX<`EW<`EW;PEW;PEV M;PEV;@AV;@AU;@AU;@AU;0AT;0AT;0AT;`AS;`AS;`AS;`AR:PAR:PAR:PAR M:@AQ:@AQ:@AQ:0AP:0AP:0AP:0AO:`AO:`AO:`AN9PAN9PAN9PAM9@AM9@AM M9@AM9@AL90AL90AL90AK9`AK9`AK9`AJ9`AJ8PAJ8PAI8PAI8@AI8@=H8@=H M80=H80=G80=G80=G8`=G8`=F8`=F7P=F7P=E7P=E7P=E7@=D7@=D7@=D70=C M70=C70=C7`=B7`=B7`=B7`=B6P=A6P=A6P=A6@=@6@=@6@=@6@=?60=?60=? M60=>6`=>6`=>6`==5P==5P==5P=<5P=<5@=<5@=<5@9;509;509;509:509: M5`9:5`995`994P994P984P9:5`QT<#:7E'"]OK.^RLZKP\R.O,QML\Q3K]!9 MN=QXS.N5VO6%UO9:P>MY3V&+``!U``!F``!A``!A``!;``!````W'Q\Y-S<O M+R\E)24@("`@("`@("`@("`C(R,I*2DQ,3$V-C8V-C8T-#0Q,3$N+BXK*RLI M*2DG)R<G)R<G)R<J*BHN+BXU-34[.SL^/CXY.3DR,C(O+R\L+"PJ*BHF)B8B M(B(@("`@("`@("`>'AX;&QL3$Q,'!P<!`0$````````````````````````` M```````````````````````````````````````````````````^.@0^.@0^ M.@0].00].00].00\.00\.`0\.`0[.`0[-P0[-P0[-P0Z-P0Z-@0Z-@0Y-@0Y M-00Y-00X-00X-`0X-`0W-`0W-`0W,P0V,P0V,P0V,@0V,@0U,@0U,@0U,00T M,00T,0,T,`,S,`,S,`,S+P,R+P,R+P,R+P,Q+@,Q+@,Q+@,P+0,P+0,P+0,P M+0,O+`,O+`,O+`,N*P,N*P,N*P,M*@,M*@,M*@,L*@,L*0,L*0,K*0,K*`,K M*`,K*`,J*`,J)P,J)P,I)P,I)@,I)@,H)@,H)0,H)0,G)0,G)0,G)`(F)`(F M)`(F(P(E(P(E(P(E(P(E(@(D(@(D(@(D(0(C(0(C(0(C(`(B(`(B(`(B(`(A M'P(A'P(A'P(@'@(@'@(@'@(@'0(?'0(?'0(?'0(>'`(>'`(>'`(=&P(=&P(= M&P(<&P(<&@(<&@(;&@(;&0(;&0(``(F`"HF`"HB`"HA_"HA_"H=_"H=^"H=^ M"H9^"H9^"H9]"H5]"H5]"H5\"H1\"H1\"H1["H1["H-["H-["8-Z"8)Z"8)Z M"8)Y"8%Y"8%Y"8%X"8!X"8!X"8!X"7]W"7]W"7]W"7YV"7YV"7YV"7YV"7UU M"7UU"7UU"7QT"7QT"7QT"7MS"7MS"7MS"7IS"7IR"7IR"7ER"7EQ"7EQ"7EQ M"7AQ"7AP"7AP"7=P"7=O"7=O"79O"79N"'9N"'5N"'5N"'5M"'1M"'1M"'1L M"'-L"'-L"'-L"'-K"')K"')K"')J"'%J"'%J"'%I"'!I"'!I"'!I"&]H"&]H M"&]H"&YG"&YG"&YG"&YG"&UF"&UF"&UF"&QE"&QE"&QE"&MD"&MD"&MD"&ID M"&IC"&IC"&EC"&EB"&EB!VAB!VAB!VAA!VAA!V=A!V=@!V=@!V9@!V9?!V9? M!V5?!V5?!V5>!V1>!V1>!V1=!V-=!V-=!V-=!V-<!V)<!V)<!V);!V%;!V%; M!V%:!V!:!V!:!V!:!U]9!U]9!U]9!UY8!UY8!UY8!UU8!UU7!UU7!UU7!UQ6 M!UQ6!UQ6!EM5!EM5!EM5!EI5!EI4!EI4!EE4!EE3!EE3!EM6#7=S.I62;+N[ MK['%S(FXR'"TRUNTU%>]XH;2[;'A\,;G\:W@\V?$ZHE.8*(``(8``',``&P` M`&P``&,``$(``#<?'SDW-RXN+B0D)"`@("`@("`@("$A(2HJ*C8V-C8V-C0T M-#(R,C$Q,3`P,"TM+2DI*2,C(R8F)BDI*2PL+"XN+C`P,#4U-3L[.SX^/CDY M.3(R,BTM+2DI*24E)2,C(R$A(2`@("`@("`@(!L;&Q`0$`4%!0$!`0`````` M```````````````````````````````````````````````````````````` M`````````````#\[!#XZ!#XZ!#XZ!#TZ!#TY!#TY!#PY!#PX!#PX!#PX!#LW M!#LW!#LW!#HW!#HV!#HV!#DV!#DU!#DU!#@U!#@T!#@T!#<T!#<T!#<S!#<S M!#8S!#8R!#8R!#4R!#4R!#4Q!#0Q!#0Q`S0P`S,P`S,P`S,O`S(O`S(O`S(O M`S$N`S$N`S$N`S$M`S`M`S`M`S`M`R\L`R\L`R\L`RXK`RXK`RXK`RTJ`RTJ M`RTJ`RPJ`RPI`RPI`RPI`RLH`RLH`RLH`RHH`RHG`RHG`RDG`RDF`RDF`R@F M`R@E`R@E`R<E`R<E`R<D`B8D`B8D`B8C`B8C`B4C`B4C`B4B`B0B`B0B`B0A M`B,A`B,A`B,@`B(@`B(@`B(@`B$?`B$?`B$?`B$>`B`>`B`>`B`>`A\=`A\= M`A\=`AX<`AX<`AX<`AT;`AT;`AT;`AP;`AP:`AP:`AL:`AL9`@``B8`*B8`* MB8`*B(`*B'\*B'\*AW\*AWX*AWX*AGX*AGX*AGT*A7T*A7T*A7P*A'P*A'P* MA'L*A'L*@WL*@WL)@WH)@GH)@GH)@GD)@7D)@7D)@7D)@'@)@'@)@'@)?W<) M?W<)?W<)?W8)?G8)?G8)?G8)?74)?74)?74)?'0)?'0)?'0)>W0)>W,)>W,) M>G,)>G()>G()>7()>7$)>7$)>7$)>'$)>'`)>'`)=W`)=V\)=V\)=F\)=F\) M=FX(=6X(=6X(=6T(=&T(=&T(=&P(=&P(<VP(<VP(<VL(<FL(<FL(<FH(<6H( M<6H(<6H(<&D(<&D(<&D(;V@(;V@(;V@(;F<(;F<(;F<(;F<(;68(;68(;68( M;&4(;&4(;&4(:V4(:V0(:V0(:F0(:F,(:F,(:6,(:6((:6(':6(':&(':&$' M:&$'9V$'9V`'9V`'9F`'9F`'9E\'95\'95\'95X'9%X'9%X'9%T'8UT'8UT' M8UT'8UP'8EP'8EP'8EL'85L'85L'85L'8%H'8%H'8%H'7UD'7UD'7UD'7E@' M7E@'7E@'7E@'75<'75<'75<'7%8'7%8'7%8&6U8&6U4&6U4&6E4&6E0&6E0& M650'65,)85P6?WM'FIAUO;RPJL3,;+#'5*_/6+[D@='NJL_2M<F_P\JYN[ZZ MB9NTJ#,_JP``C0``?```=P``=```9@``0@$!-A\?-S4U+2TM)24E("`@("`@ M(2$A)24E,C(R/3T].3DY,S,S,#`P,#`P,#`P+"PL)B8F("`@)24E+"PL+R\O M,#`P,C(R-C8V/#P\/CX^.CHZ,C(R+"PL)B8F(2$A'Q\?'Q\?'AX>'AX>'1T= M$Q,3!04%```````````````````````````````````````````````````` M````````````````````````````````````/SL$/SL$/CH$/CH$/CH$/3H$ M/3D$/3D$/3D$/#@$/#@$/#@$.S<$.S<$.S<$.C<$.C8$.C8$.38$.34$.34$ M.#4$.#4$.#0$-S0$-S0$-S,$-S,$-C,$-C($-C($-3($-3($-3$$-#$$-#$# M-#`#,S`#,S`#,S`#,B\#,B\#,B\#,BX#,2X#,2X#,2T#,"T#,"T#,"T#+RP# M+RP#+RP#+BL#+BL#+BL#+2L#+2H#+2H#+"H#+"D#+"D#+"D#*R@#*R@#*R@# M*B@#*B<#*B<#*2<#*28#*28#*"8#*"8#*"4#)R4#)R4#)R0")R0")B0")B," M)B,")2,")2,")2(")"(")"(")"$"(R$"(R$"(R$"(B`"(B`"(B`"(1\"(1\" M(1\"(1X"(!X"(!X"(!X"'QT"'QT"'QT"'AP"'AP"'AP"'1P"'1L"'1L"'!L" M'!H"'!H"'!H"``"*@0J)@0J)@`J)@`J(@`J(?PJ(?PJ'?PJ'?@J'?@J&?@J& M?@J&?0J%?0J%?0J%?`J%?`J$?`J$?`J$>PJ#>PJ#>PF#>@F">@F">@F">0F! M>0F!>0F!>0F`>`F`>`F`>`F`=PE_=PE_=PE_=PE^=@E^=@E^=@E]=0E]=0E] M=0E\=`E\=`E\=`E[=`E[<PE[<PEZ<PEZ<@EZ<@EZ<@EY<@EY<0EY<0EX<0EX M<`EX<`EW<`EW;PEW;PEV;PEV;PEV;@AU;@AU;@AU;0AU;0AT;0AT;0AT;`AS M;`AS;`AS:PAR:PAR:PAR:@AQ:@AQ:@AQ:@AP:0AP:0AP:0AO:`AO:`AO:`AO M:`AN9PAN9PAN9PAM9@AM9@AM9@AL90AL90AL90AK90AK9`AK9`AJ9`AJ8PAJ M8PAJ8PAI8@AI8@AI8@=H8@=H80=H80=G80=G8`=G8`=F8`=F8`=F7P=E7P=E M7P=E7@=D7@=D7@=D70=D70=C70=C70=C7`=B7`=B7`=B6P=A6P=A6P=A6P=@ M6@=@6@=@6@=?60=?60=?60=?6`=>6`=>6`=>6`==5P==5P==5P=<5@=<5@=< M5@=;5@9;509;509:509:5`9:5`A@7!-I9"*)A5BJJ)#`PKNEQ=!AM-)CP.&B MVNZZS,*BIX64EFM_?4>,5BC5(Q_/!PBK``"1``"#``!^``!U``!B```^`@(S M'AXQ+R\J*BHD)"0@("`B(B(D)"0K*RLW-S<^/CXY.3DS,S,P,#`P,#`P,#`L M+"PF)B8@("`E)24L+"PP,#`S,S,W-S<[.SL]/3T^/CXZ.CHR,C(L+"PF)B8A M(2$<'!P6%A80$!`.#@X,#`P%!04!`0$````````````````````````````` M```````````````````````````````````````````````````````````_ M.P0_.P0_.P0^.@0^.@0^.@0^.@0].00].00].00\.`0\.`0\.`0[.`0[-P0[ M-P0Z-P0Z-@0Z-@0Y-@0Y-00Y-00X-00X-00X-`0X-`0W-`0W,P0W,P0V,P0V M,P0V,@0U,@0U,@0U,00T,00T,0,T,`,S,`,S,`,S,`,S+P,R+P,R+P,R+@,Q M+@,Q+@,Q+@,P+0,P+0,P+0,O+`,O+`,O+`,N*P,N*P,N*P,M*P,M*@,M*@,M M*@,L*0,L*0,L*0,K*0,K*`,K*`,J*`,J)P,J)P,I)P,I)@,I)@,H)@,H)@,H M)0,H)0,G)0,G)`(G)`(F)`(F)`(F(P(E(P(E(P(E(@(D(@(D(@(D(0(C(0(C M(0(C(0(B(`(B(`(B(`(B'P(A'P(A'P(A'P(@'@(@'@(@'@(?'0(?'0(?'0(> M'`(>'`(>'`(='`(=&P(=&P(=&P(<&@(<&@(``(J!"HJ!"HF!"HF`"HF`"HB` M"HA_"HA_"H=_"H=_"H=^"H9^"H9^"H9]"H9]"H5]"H5\"H5\"H1\"H1\"H1[ M"H-["H-["8-Z"8)Z"8)Z"8)Z"8%Y"8%Y"8%Y"8!X"8!X"8!X"8!W"7]W"7]W M"7]W"7YV"7YV"7YV"7UU"7UU"7UU"7QT"7QT"7QT"7MT"7MS"7MS"7MS"7IR M"7IR"7IR"7ER"7EQ"7EQ"7AQ"7AP"7AP"7=P"7=O"7=O"79O"79O"79N"'5N M"'5N"'5M"'5M"'1M"'1M"'1L"'-L"'-L"'-K"')K"')K"')J"'%J"'%J"'%J M"'!I"'!I"'!I"'!H"&]H"&]H"&]H"&YG"&YG"&YG"&UF"&UF"&UF"&QE"&QE M"&QE"&ME"&MD"&MD"&ID"&IC"&IC"&IC"&EC"&EB"&EB!VAB!VAA!VAA!V=A M!V=@!V=@!V9@!V9@!V9?!V5?!V5?!V5>!V5>!V1>!V1>!V1=!V-=!V-=!V-< M!V)<!V)<!V);!V%;!V%;!V%;!V!:!V!:!V!:!U]9!U]9!U]9!U]9!UY8!UY8 M!UY8!UU7!UU7!UU7!UQ6!UQ6!UQ6!UM6!EM5!EM5!EI5!EI4!F]J*H:"4:6C MA\"_M+[)RIW(V%O!Z:+?]N'KZ;Z[GIR8;(Z+67%L+80\!N8*`<0``)4``(<` M`(<``(8``'<``%L``#8$!#`@("XL+"DI*20D)"`@("0D)"DI*3$Q,3HZ.CX^ M/CHZ.C0T-#`P,#`P,#`P,"PL+"8F)B`@("4E)2PL+#$Q,3<W-SP\/#X^/CX^ M/CX^/CDY.3(R,BLK*R<F)2,B(!L:%A(2"0P,`@<'``$!```````````````` M```````````````````````````````````````````````````````````` M`````````````````````$`\!#\[!#\[!#\[!#X[!#XZ!#XZ!#XZ!#TY!#TY M!#TY!#PX!#PX!#PX!#LX!#LW!#LW!#HW!#HV!#HV!#DV!#DV!#DU!#DU!#@U M!#@T!#@T!#<T!#<S!#<S!#8S!#8S!#8R!#4R!#4R!#4Q!#0Q!#0Q`S0P`S,P M`S,P`S,P`S,O`S(O`S(O`S(N`S$N`S$N`S$N`S`M`S`M`S`M`R\L`R\L`R\L M`RXK`RXK`RXK`RXK`RTJ`RTJ`RTJ`RPI`RPI`RPI`RLI`RLH`RLH`RHH`RHG M`RHG`RDG`RDF`RDF`R@F`R@F`R@E`R@E`R<E`R<D`B<D`B8D`B8D`B8C`B4C M`B4C`B4B`B0B`B0B`B0A`B,A`B,A`B,A`B,@`B(@`B(@`B(?`B$?`B$?`B$? M`B`>`B`>`B`>`A\=`A\=`A\=`AX<`AX<`AX<`AT<`AT;`AT;`AT;`AP:`@`` MBH$*BH$*BH$*B8$*B8`*B8`*B(`*B'\*B'\*AW\*AW\*AWX*AWX*AGX*AGT* MAGT*A7T*A7P*A7P*A'P*A'P*A'L*@WL*@WL)@WH)@GH)@GH)@GH)@7D)@7D) M@7D)@7@)@'@)@'@)@'<)?W<)?W<)?W<)?G8)?G8)?G8)?74)?74)?74)?'4) M?'0)?'0)?'0)>W,)>W,)>W,)>G()>G()>G()>7()>7$)>7$)>'$)>'`)>'`) M=W`)=W`)=V\)=F\)=F\)=FX(=FX(=6X(=6T(=6T(=&T(=&T(=&P(<VP(<VP( M<VL(<FL(<FL(<FL(<6H(<6H(<6H(<6D(<&D(<&D(<&@(;V@(;V@(;V@(;F<( M;F<(;F<(;68(;68(;68(;&8(;&4(;&4(:V4(:V0(:V0(:V0(:F,(:F,(:F,( M:6,(:6((:6(':&(':&$':&$'9V$'9V$'9V`'9F`'9F`'9E\'9E\'95\'95X' M95X'9%X'9%X'9%T'8UT'8UT'8UP'8EP'8EP'8EP'85L'85L'85L'8%H'8%H' M8%H'8%D'7UD'7UD'7UD'7E@'7E@'7E@'75<'75<'75<'7%<'7%8'7%8'650( M6%(,5E`-55`*?GI)M;.AQ\?!S,W,N<[4G,_CF=SWW?/\ZNOCN[F:G)ELB(-. M:V(@EC,$Z0@!O0``BP``?0``@```?@``:P$!2P8&,!,3,"<G+2PL*2DI)24E M(2$A)24E+R\O.#@X/#P\/CX^.SL[-#0T+R\O+BXN+"PL*BHJ)R<G)24E*2DI M+2TM,3$Q-34U.CHZ/#P\/#P\.SL[-#0T+2TM+"LF+"L=,2\5+BP-+"D&)2(# M%!,!`P,````````````````````````````````````````````````````` M````````````````````````````````!@8`#0P!$A$!0#P$0#P$/SL$/SL$ M/SL$/SL$/CH$/CH$/CH$/3D$/3D$/3D$/#@$/#@$/#@$.S@$.S<$.S<$.C<$ M.C8$.C8$.C8$.38$.34$.34$.#4$.#0$.#0$-S0$-S,$-S,$-C,$-C,$-C($ M-3($-3($-3$$-#$$-#$#-#$#-#`#,S`#,S`#,R\#,B\#,B\#,BX#,2X#,2X# M,2X#,"T#,"T#,"T#+RP#+RP#+RP#+RP#+BL#+BL#+BL#+2H#+2H#+2H#+"D# M+"D#+"D#*RD#*R@#*R@#*B@#*B<#*B<#*2<#*2<#*28#*28#*"8#*"4#*"4# M)R4#)R0")R0")B0")B0")B,")2,")2,")2(")"(")"(")"(")"$"(R$"(R$" M(R`"(B`"(B`"(A\"(1\"(1\"(1\"(!X"(!X"(!X"'QT"'QT"'QT"'AT"'AP" M'AP"'AP"'1L"'1L"'1L"``"+@@J*@@J*@0J*@0J)@0J)@`J)@`J(@`J(?PJ( M?PJ'?PJ'?PJ'?@J'?@J&?@J&?0J&?0J%?0J%?0J%?`J$?`J$?`J$>PJ#>PJ# M>PF#>@F">@F">@F">@F">0F!>0F!>0F!>`F`>`F`>`F`>`E_=PE_=PE_=PE^ M=@E^=@E^=@E]=0E]=0E]=0E\=0E\=`E\=`E\=`E[<PE[<PE[<PEZ<PEZ<@EZ M<@EY<@EY<0EY<0EX<0EX<`EX<`EW<`EW<`EW;PEW;PEV;PEV;@AV;@AU;@AU M;@AU;0AT;0AT;0AT;`AS;`AS;`AS:PAR:PAR:PAR:PAQ:@AQ:@AQ:@AQ:0AP M:0AP:0AP:0AO:`AO:`AO:`AN9PAN9PAN9PAM9@AM9@AM9@AL9@AL90AL90AL M90AK9`AK9`AK9`AJ9`AJ8PAJ8PAI8PAI8@AI8@=H8@=H80=H80=G80=G80=G M8`=F8`=F8`=F7P=F7P=E7P=E7@=E7@=D7@=D7@=D70=C70=C70=C7`=B7`=B M7`=B7`=A6P=A6P=A6P=A6@=@6@=@6@=@60=?60=?60=?60=>6`=>6`=>6`== M5P==5P==5P=<5P=<5@=84@U33AM(0SLR+W4_/9UI:+Z?G\S"Q=#!U=W%X_#F M]OKX^??FY=J]NIR=FVY_>T)V6AVM)P/R`P#```".``!Z``!S``!F``!-`P,W M%A8P)R<O+2TM+"PJ*BHF)B8B(B(H*"@U-34\/#P^/CX_/S\[.SLU-34N+BXK M*RLG)R<G)R<H*"@K*RLM+2TO+R\P,#`R,C(T-#0T-#0T-#0S,S,L+"PG)R4L M*QTU,Q-`/`=!/05`/04T,00<&@(&!@`!`0`!`0`!`0`````````````````` M```````````````````````````````````````````````````````/#@$? M'0(K*`-`/`1`/`1`/`1`.P0_.P0_.P0_.P0^.@0^.@0^.@0].00].00].00\ M.00\.`0\.`0[.`0[-P0[-P0Z-P0Z-@0Z-@0Z-@0Y-@0Y-00Y-00X-00X-`0X M-`0W-`0W-`0W,P0V,P0V,P0V,@0U,@0U,@0U,00U,00T,00T,0,T,`,S,`,S M,`,S+P,R+P,R+P,R+P,Q+@,Q+@,Q+@,P+0,P+0,P+0,O+`,O+`,O+`,O+`,N M*P,N*P,N*P,M*@,M*@,M*@,L*@,L*0,L*0,K*0,K*`,K*`,J*`,J)P,J)P,J M)P,I)P,I)@,I)@,H)@,H)0,H)0,G)0,G)0,G)`(F)`(F)`(F(P(E(P(E(P(E M(@(D(@(D(@(D(@(D(0(C(0(C(0(C(`(B(`(B(`(B(`(A'P(A'P(A'P(@'@(@ M'@(@'@(?'0(?'0(?'0(?'0(>'`(>'`(>'`(=&P(=&P(``(N""HN""HJ""HJ! M"HJ!"HF!"HF`"HF`"HB`"HB`"HA_"HA_"H=_"H=^"H=^"H9^"H9]"H9]"H5] M"H5]"H5\"H1\"H1\"H1["H-["H-["8-["8-Z"8)Z"8)Z"8)Y"8%Y"8%Y"8%X M"8!X"8!X"8!X"7]W"7]W"7]W"7YV"7YV"7YV"7UU"7UU"7UU"7UU"7QT"7QT M"7QT"7MS"7MS"7MS"7IS"7IR"7IR"7ER"7EQ"7EQ"7AQ"7AP"7AP"7AP"7=P M"7=O"7=O"79O"79N"'9N"'5N"'5N"'5M"'1M"'1M"'1L"'-L"'-L"'-K"')K M"')K"')K"')J"'%J"'%J"'%I"'!I"'!I"'!I"&]H"&]H"&]H"&YG"&YG"&YG M"&UF"&UF"&UF"&UF"&QE"&QE"&QE"&MD"&MD"&MD"&ID"&IC"&IC"&EC"&EB M"&EB!VAB!VAA!VAA!V=A!V=A!V=@!V=@!V9@!V9?!V9?!V5?!V5?!V5>!V1> M!V1>!V1=!V-=!V-=!V-<!V)<!V)<!V)<!V);!V%;!V%;!V%:!V!:!V!:!V!: M!U]9!U]9!U]9!UY8!UY8!UY8!UU7!UU7!UU7!UQ7!U50$$]*)SXZ5QH9MP$! MZP@(REY>Q[FZT.#BX_O[^^WMY=74P<+`I+&NBYN7:G5Q,G],$L(=`O<!`,8` M`)4``'@``&4``$P``#$(""\E)2\O+RTM+2PL+"HJ*B8F)B(B(BHJ*CL[.S\_ M/S\_/S\_/SHZ.C0T-"TM+28F)B(B(B,C(RDI*2\O+R\O+S`P,#`P,#`P,#`P M,"\O+R\O+RPL+"8F)B,C("PK&#LX#$I&!4I%!4E$!3XZ!"<D`PX-`0<'``4$ M``0#``("``$!```````````````````````````````````````````````` M`````````````````!<6`C`M!$$]!$$]!$$\!$`\!$`\!$`\!#\[!#\[!#\[ M!#XZ!#XZ!#XZ!#TY!#TY!#TY!#PY!#PX!#PX!#LX!#LW!#LW!#LW!#HW!#HV M!#HV!#DV!#DU!#DU!#@U!#@T!#@T!#<T!#<T!#<S!#8S!#8S!#8R!#8R!#4R M!#4R!#4Q!#0Q!#0Q`S0P`S,P`S,P`S,O`S(O`S(O`S(O`S$N`S$N`S$N`S`M M`S`M`S`M`S`L`R\L`R\L`R\L`RXK`RXK`RXK`RTJ`RTJ`RTJ`RPJ`RPI`RPI M`RLI`RLH`RLH`RLH`RHG`RHG`RHG`RDG`RDF`RDF`R@F`R@E`R@E`R<E`R<E M`R<D`B8D`B8D`B8C`B4C`B4C`B4B`B4B`B0B`B0B`B0A`B,A`B,A`B,@`B(@ M`B(@`B(@`B$?`B$?`B$?`B`>`B`>`B`>`B`=`A\=`A\=`A\=`AX<`AX<`AX< M`AT;`@``BX(*BX(*BX(*BH(*BH$*BH$*B8$*B8`*B8`*B8`*B(`*B'\*B'\* MAW\*AWX*AWX*AGX*AGT*AGT*A7T*A7T*A7P*A'P*A'P*A'L*@WL*@WL*@WL) M@WH)@GH)@GH)@GD)@7D)@7D)@7@)@'@)@'@)@'@)?W<)?W<)?W<)?G8)?G8) M?G8)?G8)?74)?74)?74)?'0)?'0)?'0)>W,)>W,)>W,)>G,)>G()>G()>7() M>7$)>7$)>'$)>'$)>'`)>'`)=W`)=V\)=V\)=F\)=FX(=FX(=6X(=6X(=6T( M=&T(=&T(=&P(<VP(<VP(<VP(<VL(<FL(<FL(<FH(<6H(<6H(<6D(<&D(<&D( M<&D(;V@(;V@(;V@(;F<(;F<(;F<(;6<(;68(;68(;68(;&4(;&4(;&4(:V0( M:V0(:V0(:F0(:F,(:F,(:6,(:6((:6(':&(':&(':&$':&$'9V$'9V`'9V`' M9F`'9E\'9E\'95\'95\'95X'9%X'9%X'9%T'8UT'8UT'8UT'8EP'8EP'8EP' M8EL'85L'85L'85H'8%H'8%H'8%H'7UD'7UD'7UD'7E@'7E@'7E@'75@'75<' M75<'5E$03THI/3E<&QFW`0'J!07-34W%N+C0Y^?G^?GWTM&\M;*0IZ1[FYAK MB(1-:F4A@D0+R1H"^```R@``FP``?@``:```2P``,0L++R<G+"PL*BHJ*"@H M)B8F)"0D(2$A*RLK.SL[/CX^/#P\.CHZ-#0T+2TM)B8F(R,C("`@(R,C*2DI M,#`P,C(R-#0T-34U,C(R,#`P+BXN*BHJ)B8F(R,C(B(?*RH9.S@,2T8%2D8% M2D4%1#\%-#$$)"$"(!X"'QT"'1L"$1`!!04````````````````````````` M````````````````````````````````````````%Q8","T$03T%03T$03T$ M03P$0#P$0#P$0#P$/SL$/SL$/SL$/CH$/CH$/CH$/3D$/3D$/3D$/#D$/#@$ M/#@$/#@$.S<$.S<$.S<$.C<$.C8$.C8$.38$.34$.34$.#4$.#0$.#0$-S0$ M-S0$-S,$-C,$-C,$-C($-C($-3($-3($-3$$-#$$-#$#-#`#,S`#,S`#,R\# M,B\#,B\#,B\#,2X#,2X#,2X#,2T#,"T#,"T#,"T#+RP#+RP#+RP#+BL#+BL# M+BL#+2H#+2H#+2H#+"H#+"D#+"D#*RD#*R@#*R@#*R@#*B@#*B<#*B<#*2<# M*28#*28#*"8#*"4#*"4#)R4#)R4#)R0")B0")B0")B,")B,")2,")2,")2(" M)"(")"(")"$"(R$"(R$"(R`"(B`"(B`"(B`"(1\"(1\"(1\"(!X"(!X"(!X" M(!X"'QT"'QT"'QT"'AP"'AP"'AP"``",@PJ+@PJ+@@J+@@J*@@J*@0J*@0J* M@0J)@`J)@`J)@`J(@`J(?PJ(?PJ'?PJ'?@J'?@J&?@J&?@J&?0J%?0J%?0J% M?`J$?`J$?`J$>PJ$>PJ#>PJ#>PF#>@F">@F">@F">0F!>0F!>0F!>0F`>`F` M>`F`>`E_=PE_=PE_=PE_=@E^=@E^=@E^=@E]=0E]=0E]=0E\=`E\=`E\=`E[ M=`E[<PE[<PEZ<PEZ<@EZ<@EY<@EY<0EY<0EY<0EX<0EX<`EX<`EW<`EW;PEW M;PEV;PEV;PEV;@AU;@AU;@AU;0AT;0AT;0AT;`AT;`AS;`AS;`AS:PAR:PAR M:PAR:@AQ:@AQ:@AQ:@AP:0AP:0AP:0AO:`AO:`AO:`AN9PAN9PAN9PAN9PAM M9@AM9@AM9@AL90AL90AL90AK90AK9`AK9`AJ9`AJ8PAJ8PAI8PAI8@AI8@=I M8@=H8@=H80=H80=G80=G8`=G8`=F8`=F8`=F7P=E7P=E7P=E7@=D7@=D7@=D M70=C70=C70=C70=C7`=B7`=B7`=B6P=A6P=A6P=A6@=@6@=@6@=@6@=?60=? M60=?60=>6`=>6`=>6`=>6`==5P=84@Q13",].5H9%[P!`>L%!<Q04,:^OM+L M[.SO[^B^O)VAGG&)@4IR;2QJ9B%?6A""1`O)&@+X``#*``"=``!^``!H``!* M```P#0TO*"@K*RLG)R<C(R,A(2$A(2$@("`K*RL[.SL\/#PY.3DT-#0N+BXF M)B8B(B(A(2$@("`C(R,I*2DP,#`U-34Y.3DZ.CHU-34Q,3$L+"PF)B8C(B(B M(A\D(QXL*QD[.`U+1@5+1@5*1@5(0P5#/@4\.00[-P0[-P0V,P0@'P(*"0$` M```````````````````````````````````````````````````````````` M```7%@(P+01"/@5"/05!/01!/01!/`1`/`1`/`1`/`0_.P0_.P0_.P0^.@0^ M.@0^.@0].@0].00].00].00\.`0\.`0\.`0[-P0[-P0[-P0Z-P0Z-@0Z-@0Y M-@0Y-00Y-00X-00X-00X-`0W-`0W-`0W,P0W,P0V,P0V,@0V,@0U,@0U,@0U M,00T,00T,0,T,`,S,`,S,`,S,`,R+P,R+P,R+P,R+@,Q+@,Q+@,Q+0,P+0,P M+0,P+0,O+`,O+`,O+`,N*P,N*P,N*P,M*P,M*@,M*@,L*@,L*0,L*0,L*0,K M*`,K*`,K*`,J*`,J)P,J)P,I)P,I)@,I)@,H)@,H)@,H)0,G)0,G)0,G)`(G M)`(F)`(F(P(F(P(E(P(E(P(E(@(D(@(D(@(D(0(C(0(C(0(C(0(B(`(B(`(B M(`(A'P(A'P(A'P(A'@(@'@(@'@(@'@(?'0(?'0(?'0(>'`(>'`(``(R#"HR# M"HN#"HN""HN""HJ""HJ!"HJ!"HJ!"HF!"HF`"HF`"HB`"HA_"HA_"H=_"H=^ M"H=^"H9^"H9^"H9]"H5]"H5]"H5\"H5\"H1\"H1\"H1["H-["H-["8-Z"8)Z M"8)Z"8)Y"8%Y"8%Y"8%Y"8!X"8!X"8!X"7]W"7]W"7]W"7]W"7YV"7YV"7YV M"7UU"7UU"7UU"7QT"7QT"7QT"7MT"7MS"7MS"7IS"7IR"7IR"7IR"7EQ"7EQ M"7EQ"7AQ"7AP"7AP"7=P"7=O"7=O"79O"79O"79N"'5N"'5N"'5M"'1M"'1M M"'1L"'1L"'-L"'-L"'-K"')K"')K"')J"'%J"'%J"'%J"'!I"'!I"'!I"&]H M"&]H"&]H"&]G"&YG"&YG"&YG"&UF"&UF"&UF"&QE"&QE"&QE"&ME"&MD"&MD M"&ID"&IC"&IC"&EC"&EB"&EB"&EB!VAB!VAA!VAA!V=A!V=@!V=@!V9@!V9@ M!V9?!V5?!V5?!V5>!V1>!V1>!V1=!V1=!V-=!V-=!V-<!V)<!V)<!V);!V%; M!V%;!V%;!V!:!V!:!V!:!U]9!U]9!U]9!UY8!UY8!UY8!UY8!UM5"%5/%$$] M4!03Q0<'Y2(BR7IZS=?7X/7U]>[MYKZ\G9^<;GIK+%]0!FA,!7%(!HXX!L$8 M`N@``,$``)@``'L``&4``$@``#`.#BXH*"HJ*B4E)2$A(2`@("`@("`@("LK M*SHZ.CL[.S<W-S$Q,2HJ*B,C(R`@("`@("`@("(B(BDI*3`P,#8V-CT]/3T] M/3<W-S$Q,2HJ*B,C(R(B'R<F'"LJ&3,Q%$`\#$M'!4M&!4M&!4I&!4I%!4I% M!4E%!4E$!45!!2XL`Q@7`@X-`0X-`0X-`0X-`0X-`0X-`0X-`0X-`0X-`0X- M`0X-`0T-`0T-`0T,`0T,`0T,`2`>`C4Q!$(^!4(^!4(]!4$]!$$]!$$]!$`\ M!$`\!$`\!#\[!#\[!#\[!#XZ!#XZ!#XZ!#TZ!#TY!#TY!#TY!#PX!#PX!#PX M!#LX!#LW!#LW!#HW!#HV!#HV!#DV!#DU!#DU!#@U!#@U!#@T!#@T!#<T!#<S M!#<S!#8S!#8S!#8R!#4R!#4R!#4Q!#0Q!#0Q`S0P`S,P`S,P`S,P`S(O`S(O M`S(O`S(N`S$N`S$N`S$N`S`M`S`M`S`M`R\L`R\L`R\L`RXK`RXK`RXK`RTK M`RTJ`RTJ`RTJ`RPI`RPI`RPI`RLH`RLH`RLH`RHH`RHG`RHG`RDG`RDF`RDF M`R@F`R@F`R@E`R<E`R<E`R<D`B<D`B8D`B8C`B8C`B4C`B4C`B4B`B0B`B0B M`B0A`B,A`B,A`B,A`B(@`B(@`B(@`B(?`B$?`B$?`B$>`B`>`B`>`B`>`A\= M`A\=`A\=`AX<`@``C(,*C(,*C(,*BX,*BX(*BX(*BX(*BH$*BH$*BH$*B8$* MB8`*B8`*B(`*B'\*B'\*AW\*AWX*AWX*AGX*AGX*AGT*AGT*A7T*A7P*A7P* MA'P*A'P*A'L*@WL*@WL)@WH)@GH)@GH)@GD)@7D)@7D)@7D)@'@)@'@)@'@) M@'<)?W<)?W<)?W<)?G8)?G8)?G8)?74)?74)?74)?'0)?'0)?'0)>W0)>W,) M>W,)>W,)>G()>G()>G()>7()>7$)>7$)>'$)>'`)>'`)=W`)=V\)=V\)=F\) M=F\)=FX(=6X(=6X(=6T(=6T(=&T(=&T(=&P(<VP(<VP(<VL(<FL(<FL(<FH( M<6H(<6H(<6H(<&D(<&D(<&D(<&@(;V@(;V@(;V@(;F<(;F<(;F<(;68(;68( M;68(;&4(;&4(;&4(:V4(:V0(:V0(:F0(:F,(:F,(:F,(:6,(:6((:6(':&(' M:&$':&$'9V$'9V`'9V`'9F`'9F`'9E\'95\'95\'95X'95X'9%X'9%X'9%T' M8UT'8UT'8UP'8EP'8EP'8EL'85L'85L'85L'8%H'8%H'8%H'7UD'7UD'7UD' M7UD'7E@'7E@'7E@'6%(,03U*#`O(,3'4>WO+R,C@]O;V_?W]\_/MRLBOK:J# M@'4Y:DP%A#X$FS($J2<#N14!S@$`LP``D@``=@``8```0P``,!`0+BDI*BHJ M)24E(2$A("`@("`@("`@*RLK.CHZ.SL[-S<W,3$Q*BHJ(R,C("`@("`@("`@ M(B(B*2DI,#`P-C8V/3T]/3T]-S<W,3$Q*BHJ)"0C)B4<,"X6.#81/SP-1D() M3$<%2T<%2T8%2T8%2D8%2D4%2D4%244%1T,%.S<$,"T#*B@#*B<#*B<#*2<# M*28#*28#*28#*28#*28#*"8#*"8#*"4#)R4#)R4#)R4#)R4#,2X$.S@$0SX% M0CX%0CX%0CT%03T$03T$03T$0#P$0#P$0#P$/SL$/SL$/SL$/CH$/CH$/CH$ M/CH$/3D$/3D$/3D$/#@$/#@$/#@$.S@$.S<$.S<$.C<$.C8$.C8$.38$.34$ M.34$.34$.#4$.#0$.#0$-S0$-S,$-S,$-C,$-C,$-C($-3($-3($-3$$-#$$ M-#$#-#`#,S`#,S`#,S`#,R\#,B\#,B\#,BX#,2X#,2X#,2X#,"T#,"T#,"T# M+RP#+RP#+RP#+BL#+BL#+BL#+BL#+2H#+2H#+2H#+"D#+"D#+"D#*RD#*R@# M*R@#*B@#*B<#*B<#*2<#*28#*28#*"8#*"8#*"4#*"4#)R4#)R0")R0")B0" M)B0")B,")2,")2,")2(")"(")"(")"$"(R$"(R$"(R$"(R`"(B`"(B`"(A\" M(1\"(1\"(1\"(!X"(!X"(!X"'QT"'QT"'QT"``"-A`J,A`J,@PJ,@PJ,@PJ+ M@@J+@@J+@@J*@0J*@0J*@0J)@0J)@`J)@`J(@`J(?PJ(?PJ'?PJ'?PJ'?@J& M?@J&?@J&?0J&?0J%?0J%?`J%?`J$?`J$?`J$>PJ#>PJ#>PF#>@F">@F">@F" M>@F!>0F!>0F!>0F!>`F`>`F`>`F`=PE_=PE_=PE_=PE^=@E^=@E^=@E]=0E] M=0E]=0E\=0E\=`E\=`E[=`E[<PE[<PE[<PEZ<@EZ<@EZ<@EY<@EY<0EY<0EX M<0EX<`EX<`EW<`EW<`EW;PEV;PEV;PEV;@AV;@AU;@AU;0AU;0AT;0AT;0AT M;`AS;`AS;`AS:PAR:PAR:PAR:PAQ:@AQ:@AQ:@AP:0AP:0AP:0AP:`AO:`AO M:`AO:`AN9PAN9PAN9PAM9@AM9@AM9@AL9@AL90AL90AK90AK9`AK9`AK9`AJ M8PAJ8PAJ8PAI8PAI8@AI8@=H8@=H80=H80=G80=G80=G8`=F8`=F8`=F7P=E M7P=E7P=E7@=E7@=D7@=D7@=D70=C70=C70=C7`=B7`=B7`=B7`=A6P=A6P=A M6P=@6@=@6@=@6@=@60=?60=?60=?60=>6`=>6`=:5`H].4D-#;9S<\G.SM/M M[>[S\^[8U\3,RK+!OZ&QKXJ$@$5O2P>6-02Y)`/,%`&Y"@&D`0"6``"'``!R M``!;```^```P$A(N*2DI*2DE)24A(2$@("`@("`@("`K*RLZ.CH[.SLW-S<Q M,3$J*BHC(R,@("`@("`@("`B(B(I*2DP,#`W-S<\/#P\/#PW-S<Q,3$K*BDE M)2(J*1HY-A%&00E,1P9+1@5,1P5,1P5+1P5+1@5+1@5*1@5*105*105*105( M1`5'0@5&0@5%0@5%005%005$005$0`5$0`5$0`5$0`5$/P5#/P5#/P5#/@5" M/@5"/@5"/@5"/@5"/@5#/P5#/@5"/@5"/@5"/05!/05!/01!/01`/`1`/`1` M/`0_.P0_.P0_.P0_.P0^.@0^.@0^.@0].00].00].00\.`0\.`0\.`0[.`0[ M-P0[-P0Z-P0Z-@0Z-@0Y-@0Y-@0Y-00Y-00X-00X-`0X-`0W-`0W,P0W,P0V M,P0V,P0V,@0U,@0U,@0U,00T,00T,0,T,0,T,`,S,`,S,`,S+P,R+P,R+P,R M+@,Q+@,Q+@,Q+@,P+0,P+0,P+0,O+`,O+`,O+`,N+`,N*P,N*P,N*P,M*@,M M*@,M*@,L*0,L*0,L*0,K*0,K*`,K*`,J*`,J)P,J)P,I)P,I)P,I)@,I)@,H M)@,H)0,H)0,G)0,G)`(G)`(F)`(F)`(F(P(E(P(E(P(E(@(D(@(D(@(D(@(C M(0(C(0(C(0(C(`(B(`(B(`(B'P(A'P(A'P(A'P(@'@(@'@(@'@(?'0(?'0(` M`(V$"HV$"HV$"HR#"HR#"HR#"HN""HN""HN""HJ""HJ!"HJ!"HF!"HF`"HF` M"HB`"HA_"HA_"H=_"H=_"H=^"H=^"H9^"H9]"H9]"H5]"H5]"H5\"H1\"H1\ M"H1["H-["H-["8-Z"8)Z"8)Z"8)Z"8)Y"8%Y"8%Y"8%X"8!X"8!X"8!X"7]W M"7]W"7]W"7YV"7YV"7YV"7UU"7UU"7UU"7QU"7QT"7QT"7QT"7MS"7MS"7MS M"7IS"7IR"7IR"7ER"7EQ"7EQ"7AQ"7AP"7AP"7=P"7=P"7=O"7=O"79O"79N M"'9N"'5N"'5M"'5M"'1M"'1M"'1L"'-L"'-L"'-K"')K"')K"')K"'%J"'%J M"'%J"'%I"'!I"'!I"'!H"&]H"&]H"&]H"&YG"&YG"&YG"&UF"&UF"&UF"&QF M"&QE"&QE"&QE"&MD"&MD"&MD"&IC"&IC"&IC"&EC"&EB"&EB!VAB!VAA!VAA M!V=A!V=A!V=@!V9@!V9@!V9?!V9?!V5?!V5>!V5>!V1>!V1>!V1=!V-=!V-= M!V-<!V)<!V)<!V)<!V%;!V%;!V%;!V%:!V!:!V!:!V!9!U]9!U]9!U]9!UY8 M!UI5"UE56&%@NYZ>S-;6UO+R\N3CUKNXEZFF?*FF?)V9:GYY.W%0#90W!,4= M`N(&!*H!%6D`*6,`*6(`)EH`'$H`$38`!#`4%"XJ*BDI*24E)2$A(2`@("`@ M("`@("LK*SHZ.CL[.S<W-S$Q,2HJ*B,C(R`@("`@("`@("(B(BPL+#8V-C<W M-S@X.#@X.#0T-#`P,#`O)C$O&S<T$T$]#4E$!TU(!4U(!4Q(!4Q'!4Q'!4M' M!4M&!4M&!4M&!4I%!4I%!4I%!4E%!4E$!4E$!4A$!4A#!4A#!4=#!4=#!4=" M!49"!49"!49!!45!!45!!45`!45`!41`!41`!40_!4,_!4,_!4,^!4(^!4(^ M!4(^!4$]!4$]!$$]!$`\!$`\!$`\!$`[!#\[!#\[!#\[!#XZ!#XZ!#XZ!#TY M!#TY!#TY!#PY!#PX!#PX!#LX!#LW!#LW!#HW!#HV!#HV!#HV!#DV!#DU!#DU M!#@U!#@T!#@T!#<T!#<T!#<S!#8S!#8S!#8R!#4R!#4R!#4Q!#4Q!#0Q!#0Q M`S0P`S,P`S,P`S,O`S(O`S(O`S(O`S$N`S$N`S$N`S`M`S`M`S`M`R\L`R\L M`R\L`R\L`RXK`RXK`RXK`RTJ`RTJ`RTJ`RPI`RPI`RPI`RLI`RLH`RLH`RHH M`RHG`RHG`RHG`RDG`RDF`RDF`R@F`R@E`R@E`R<E`R<D`B<D`B8D`B8D`B8C M`B4C`B4C`B4B`B0B`B0B`B0B`B0A`B,A`B,A`B,@`B(@`B(@`B(?`B$?`B$? M`B$?`B`>`B`>`B`>`A\=`@``C84*C80*C80*C80*C(,*C(,*C(,*BX(*BX(* MBX(*BH(*BH$*BH$*B8$*B8`*B8`*B(`*B'\*B'\*B'\*AW\*AWX*AWX*AGX* MAGT*AGT*A7T*A7T*A7P*A'P*A'P*A'L*@WL*@WL)@WH)@GH)@GH)@GH)@GD) M@7D)@7D)@7@)@'@)@'@)@'@)?W<)?W<)?W<)?G8)?G8)?G8)?74)?74)?74) M?74)?'0)?'0)?'0)>W,)>W,)>W,)>G,)>G()>G()>7()>7$)>7$)>'$)>'`) M>'`)=W`)=W`)=V\)=V\)=F\)=FX(=FX(=6X(=6X(=6T(=&T(=&T(=&P(<VP( M<VP(<VL(<FL(<FL(<FL(<FH(<6H(<6H(<6D(<&D(<&D(<&D(;V@(;V@(;V@( M;F<(;F<(;F<(;68(;68(;68(;&8(;&4(;&4(;&4(:V0(:V0(:V0(:F0(:F,( M:F,(:6,(:6((:6(':&(':&$':&$'9V$'9V$'9V`'9V`'9F`'9E\'9E\'95\' M95\'95X'9%X'9%X'9%T'8UT'8UT'8UP'8EP'8EP'8EP'85L'85L'85L'85H' M8%H'8%H'8%H'7UD'7UD'7UD'75@0?'EJGI[`M[?.UM;6\_/SU]7"I*%UC(A0 M@WY">W8W;VHD;E@2BSP$QQP"V000?`!-(@"*'P"&'P!])@!@+0`Y,``,,!45 M+BLK*2DI)"0D(2$A("`@("`@("`@+2TM.CHZ.SL[-S<W,3$Q*BHJ(R,C("`@ M("`@("`@)"0D,3$Q.SL[.#@X-34U,S,S,3$Q+R\O-C4C/CL41$`*240(3$@& M34@%34@%34@%3$@%3$<%3$<%2T<%2T8%2T8%2T8%2D8%2D4%2D4%244%240% M240%2$0%2$,%2$,%1T,%1T,%1T(%1D(%1D(%1D$%1D$%14$%14$%14`%1$`% M1$`%1#\%0S\%0S\%0SX%0CX%0CX%0CX%03T%03T$03T$0#P$0#P$0#P$0#L$ M/SL$/SL$/SL$/CH$/CH$/CH$/3D$/3D$/3D$/#D$/#@$/#@$.S@$.S<$.S<$ M.S<$.C8$.C8$.C8$.38$.34$.34$.#4$.#0$.#0$-S0$-S0$-S,$-C,$-C,$ M-C($-3($-3($-3$$-3$$-#$$-#$#-#`#,S`#,S`#,R\#,B\#,B\#,B\#,2X# M,2X#,2X#,"T#,"T#,"T#,"P#+RP#+RP#+RP#+BL#+BL#+BL#+2H#+2H#+2H# M+"H#+"D#+"D#*RD#*R@#*R@#*B@#*B<#*B<#*B<#*2<#*28#*28#*"8#*"4# M*"4#)R4#)R4#)R0")B0")B0")B,")2,")2,")2(")2(")"(")"(")"$"(R$" M(R$"(R`"(B`"(B`"(B`"(1\"(1\"(1\"(!X"(!X"(!X"``".A0J.A0J-A`J- MA`J-A`J,@PJ,@PJ,@PJ+@@J+@@J+@@J*@@J*@0J*@0J)@0J)@`J)@`J)@`J( M@`J(?PJ(?PJ'?PJ'?@J'?@J&?@J&?0J&?0J%?0J%?0J%?`J$?`J$?`J$>PJ# M>PJ#>PF#>PF#>@F">@F">@F">0F!>0F!>0F!>`F`>`F`>`F`>`E_=PE_=PE_ M=PE^=@E^=@E^=@E^=@E]=0E]=0E]=0E\=`E\=`E\=`E[<PE[<PE[<PEZ<PEZ M<@EZ<@EY<@EY<0EY<0EX<0EX<0EX<`EX<`EW<`EW;PEW;PEV;PEV;@AV;@AU M;@AU;@AU;0AT;0AT;0AT;`AS;`AS;`AS;`AS:PAR:PAR:PAR:@AQ:@AQ:@AQ M:0AP:0AP:0AP:0AO:`AO:`AO:`AN9PAN9PAN9PAM9PAM9@AM9@AM9@AL90AL M90AL90AK9`AK9`AK9`AJ9`AJ8PAJ8PAI8PAI8@AI8@=H8@=H8@=H80=H80=G M80=G8`=G8`=F8`=F7P=F7P=E7P=E7P=E7@=D7@=D7@=D70=C70=C70=C70=B M7`=B7`=B7`=B6P=A6P=A6P=A6@=@6@=@6@=?60==5PE;5@MA7">2CWZ]O,3` MP-''Q]CO[_3)QZR'@D=H8AEA6Q!<5Q-:5!AA51E\/PW#&@J[`B]$`(@``+H` M`+$``*<%`)(0`&HD`"<N%1PN*RPH*"@D)"0A(2$A(2$A(2$C(R,P,#`Y.3DZ M.CHU-34Q,3$J*BHD)"0@("`@("`A(2$G)R<V-C8^/CXX.#@R,C(P,#`O+R\N M+BXY-Q]%00U/2@9.205.205.205-2`5-2`5-2`5,2`5,1P5,1P5,1P5+1@5+ M1@5+1@5*1@5*105*105)105)1`5)1`5(1`5(0P5(0P5'0P5'0P5'0@5'0@5& M0@5&005&005%005%005%0`5$0`5$0`5$/P5#/P5#/P5#/@5"/@5"/@5"/@5! M/05!/01!/01!/`1`/`1`/`1`/`0_.P0_.P0_.P0^.@0^.@0^.@0].00].00] M.00\.00\.`0\.`0\.`0[-P0[-P0[-P0Z-P0Z-@0Z-@0Y-@0Y-00Y-00X-00X M-`0X-`0W-`0W-`0W,P0V,P0V,P0V,@0V,@0U,@0U,@0U,00T,00T,0,T,`,S M,`,S,`,S+P,R+P,R+P,R+P,Q+@,Q+@,Q+@,Q+0,P+0,P+0,P+0,O+`,O+`,O M+`,N*P,N*P,N*P,M*@,M*@,M*@,L*@,L*0,L*0,K*0,K*`,K*`,K*`,J*`,J M)P,J)P,I)P,I)@,I)@,H)@,H)0,H)0,G)0,G)0,G)`(F)`(F)`(F(P(F(P(E M(P(E(P(E(@(D(@(D(@(D(0(C(0(C(0(C(`(B(`(B(`(B(`(A'P(A'P(A'P(@ M'@(@'@(``(Z%"HZ%"HZ%"HV$"HV$"HV$"HR#"HR#"HR#"HN#"HN""HN""HJ" M"HJ!"HJ!"HF!"HF`"HF`"HF`"HB`"HA_"HA_"H=_"H=^"H=^"H9^"H9^"H9] M"H5]"H5]"H5\"H1\"H1\"H1["H1["H-["H-["8-Z"8)Z"8)Z"8)Y"8%Y"8%Y M"8%Y"8!X"8!X"8!X"7]W"7]W"7]W"7YV"7YV"7YV"7YV"7UU"7UU"7UU"7QT M"7QT"7QT"7MT"7MS"7MS"7IS"7IR"7IR"7ER"7EQ"7EQ"7EQ"7AQ"7AP"7AP M"7=P"7=O"7=O"79O"79O"79N"'5N"'5N"'5M"'1M"'1M"'1L"'-L"'-L"'-L M"'-K"')K"')K"')J"'%J"'%J"'%I"'!I"'!I"'!I"&]H"&]H"&]H"&YG"&YG M"&YG"&YG"&UF"&UF"&UF"&QE"&QE"&QE"&MD"&MD"&MD"&ID"&IC"&IC"&EC M"&EB"&EB!VAB!VAB!VAA!VAA!V=A!V=@!V=@!V9@!V9?!V9?!V5?!V5?!V5> M!V1>!V1>!V1=!V-=!V-=!V-=!V-<!V)<!V)<!V);!V%;!V%;!V%:!V!:!V!: M!UA2$DY)*%U939J8E\#`RJ6EV8N+Y]W=^<7#IH-_069@%6!:#EY8&TY))TI$ M,&0Z*:\6(9``5QP`JP``MP``K@``IP$`G04`C1``9B,3/"TL+R@H*"0D)"(B M(B,C(R<G)S`P,#0T-#4U-38V-C,S,S`P,"HJ*B0D)"$A(2,C(R8F)BTM+3<W M-S\_/SDY.3(R,BXN+BLK*RDI)S8U&T1`"T]*!D]*!DY)!4Y)!4Y)!4U)!4U( M!4U(!4U(!4Q'!4Q'!4Q'!4M&!4M&!4M&!4I&!4I%!4I%!4E%!4E$!4E$!4A$ M!4A$!4A#!4=#!4=#!4="!4="!49"!49!!49!!45!!45!!45`!41`!41`!40_ M!4,_!4,_!4,_!4(^!4(^!4(^!4(]!4$]!$$]!$$\!$`\!$`\!$`\!#\[!#\[ M!#\[!#XZ!#XZ!#XZ!#TZ!#TY!#TY!#PY!#PX!#PX!#PX!#LW!#LW!#LW!#HW M!#HV!#HV!#DV!#DU!#DU!#@U!#@U!#@T!#<T!#<T!#<S!#<S!#8S!#8R!#8R M!#4R!#4R!#4Q!#0Q!#0Q`S0P`S,P`S,P`S,P`S(O`S(O`S(O`S$N`S$N`S$N M`S$M`S`M`S`M`S`M`R\L`R\L`R\L`RXK`RXK`RXK`RTK`RTJ`RTJ`RPJ`RPI M`RPI`RPI`RLH`RLH`RLH`RHH`RHG`RHG`RDG`RDF`RDF`R@F`R@E`R@E`R<E M`R<E`R<D`B8D`B8D`B8C`B8C`B4C`B4C`B4B`B0B`B0B`B0A`B,A`B,A`B,@ M`B(@`B(@`B(@`B$?`B$?`B$?`B$>`@``CX8*CH4*CH4*CH4*C80*C80*C80* MC(,*C(,*C(,*BX,*BX(*BX(*BH(*BH$*BH$*BH$*B8`*B8`*B8`*B(`*B'\* MB'\*AW\*AWX*AWX*AGX*AGX*AGT*A7T*A7T*A7P*A7P*A'P*A'L*A'L*@WL* M@WL)@WH)@GH)@GH)@GD)@7D)@7D)@7D)@'@)@'@)@'@)?W<)?W<)?W<)?W8) M?G8)?G8)?G8)?74)?74)?74)?'0)?'0)?'0)>W0)>W,)>W,)>G,)>G()>G() M>G()>7$)>7$)>7$)>'$)>'`)>'`)=W`)=V\)=V\)=F\)=F\)=FX(=6X(=6X( M=6T(=&T(=&T(=&P(=&P(<VP(<VP(<VL(<FL(<FL(<FH(<6H(<6H(<6H(<&D( M<&D(<&D(;V@(;V@(;V@(;V<(;F<(;F<(;F<(;68(;68(;68(;&4(;&4(;&4( M:V4(:V0(:V0(:F0(:F,(:F,(:6,(:6((:6((:6(':&(':&$':&$'9V$'9V`' M9V`'9F`'9F`'9E\'95\'95\'95X'9%X'9%X'9%T'9%T'8UT'8UT'8UP'8EP' M8EP'8EL'85L'85L'85L'8%H'4DT4-C)8/#N/E).WKZ_39&3H147ZS\_^QL.F MA(!#:&,985L-9%\B1D(^-3%C,2"!7PMX2@"3"`"Z``"S``"K``"G``"D``"? M`@"7%!!L+"PR)R<G)"0D(B(B)24E,#`P.SL[-C8V,S,S,3$Q,#`P+R\O*BHJ M)"0D(2$A)24E*RLK,C(R.#@X/S\_.3DY,C(R+2TM)R<G)B4@-#(61$`*3TH& M3TH&3TH&3DD%3DD%3DD%3DD%34@%34@%34@%3$<%3$<%3$<%2T<%2T8%2T8% M2D8%2D4%2D4%244%240%240%2$0%2$0%2$,%2$,%1T,%1T(%1T(%1D(%1D(% M1D$%14$%14$%14`%1$`%1$`%1#\%0S\%0S\%0S\%0SX%0CX%0CX%0CT%03T$ M03T$03T$0#P$0#P$0#P$/SL$/SL$/SL$/CH$/CH$/CH$/3H$/3D$/3D$/3D$ M/#@$/#@$/#@$.S<$.S<$.S<$.C<$.C8$.C8$.38$.34$.34$.#4$.#4$.#0$ M.#0$-S0$-S,$-S,$-C,$-C($-C($-3($-3($-3$$-#$$-#$#-#`#,S`#,S`# M,S`#,B\#,B\#,B\#,BX#,2X#,2X#,2T#,"T#,"T#,"T#+RP#+RP#+RP#+BL# M+BL#+BL#+2L#+2H#+2H#+2H#+"D#+"D#+"D#*R@#*R@#*R@#*B@#*B<#*B<# M*2<#*28#*28#*"8#*"8#*"4#)R4#)R4#)R0")R0")B0")B,")B,")2,")2," M)2(")"(")"(")"$"(R$"(R$"(R$"(B`"(B`"(B`"(A\"(1\"(1\"``"/A@J/ MA@J.A0J.A0J.A0J-A`J-A`J-A`J,@PJ,@PJ,@PJ+@PJ+@@J+@@J+@@J*@0J* M@0J*@0J)@0J)@`J)@`J(@`J(?PJ(?PJ'?PJ'?@J'?@J&?@J&?@J&?0J%?0J% M?0J%?`J%?`J$?`J$?`J$>PJ#>PJ#>PF#>@F">@F">@F">0F!>0F!>0F!>0F` M>`F`>`F`>`F`=PE_=PE_=PE_=PE^=@E^=@E^=@E]=0E]=0E]=0E\=`E\=`E\ M=`E[=`E[<PE[<PEZ<PEZ<@EZ<@EZ<@EY<@EY<0EY<0EX<0EX<`EX<`EW<`EW M;PEW;PEV;PEV;PEV;@AU;@AU;@AU;0AU;0AT;0AT;0AT;`AS;`AS;`AS:PAR M:PAR:PAR:@AQ:@AQ:@AQ:@AP:0AP:0AP:0AO:`AO:`AO:`AO:`AN9PAN9PAN M9PAM9@AM9@AM9@AL90AL90AL90AK90AK9`AK9`AJ9`AJ8PAJ8PAJ8PAI8PAI M8@AI8@=H8@=H80=H80=G80=G8`=G8`=F8`=F8`=F7P=E7P=E7P=E7@=D7@=D M7@=D7@=D70=C70=C70=A6@I74AM-22Y/2BE64!Q;50Y?60A43@\I)W`I*;R7 ME\JJJMEW=_&-C?_DY/_)QZR+ATUQ:R5L9QYE8!A544,H)80*"=(9$=03#,P! M`<,``+8``*X``*P``*P``*H``*0.#G\K*S4G)R<D)"0B(B(F)B8T-#0]/3TW M-S<R,C(O+R\N+BXK*RLH*"@F)B8E)24I*2DM+2TR,C(V-C8[.SLU-34N+BXK M*R4N+1TR,!8].A!'0PE02P9/2@9/2@9/2@9.205.205.205.205-2`5-2`5- M2`5,1P5,1P5,1P5+1P5+1@5+1@5*1@5*105*105)105)1`5)1`5)1`5(1`5( M0P5(0P5'0P5'0@5'0@5&0@5&0@5&005%005%005%0`5$0`5$0`5$/P5#/P5# M/P5#/P5#/@5"/@5"/@5"/05!/01!/01!/01`/`1`/`1`/`0_.P0_.P0_.P0^ M.@0^.@0^.@0^.@0].00].00].00\.`0\.`0\.`0[.`0[-P0[-P0Z-P0Z-@0Z M-@0Y-@0Y-00Y-00X-00X-00X-`0X-`0W-`0W,P0W,P0V,P0V,P0V,@0U,@0U M,@0U,00T,00T,0,T,`,S,`,S,`,S,`,S+P,R+P,R+P,R+@,Q+@,Q+@,Q+@,P M+0,P+0,P+0,O+`,O+`,O+`,N*P,N*P,N*P,M*P,M*@,M*@,M*@,L*0,L*0,L M*0,K*0,K*`,K*`,J*`,J)P,J)P,I)P,I)@,I)@,H)@,H)@,H)0,H)0,G)0,G M)`(G)`(F)`(F)`(F(P(E(P(E(P(E(@(D(@(D(@(D(0(C(0(C(0(C(0(B(`(B M(`(B(`(B'P(A'P(``(^&"H^&"H^&"HZ%"HZ%"HZ%"HV$"HV$"HV$"HR$"HR# M"HR#"HR#"HN""HN""HN""HJ!"HJ!"HJ!"HF!"HF`"HF`"HB`"HA_"HA_"H=_ M"H=_"H=^"H9^"H9^"H9]"H9]"H5]"H5\"H5\"H1\"H1\"H1["H-["H-["8-Z M"8)Z"8)Z"8)Z"8%Y"8%Y"8%Y"8%X"8!X"8!X"8!W"7]W"7]W"7]W"7YV"7YV M"7YV"7UU"7UU"7UU"7QU"7QT"7QT"7MT"7MS"7MS"7MS"7IR"7IR"7IR"7ER M"7EQ"7EQ"7AQ"7AP"7AP"7=P"7=P"7=O"79O"79O"79N"'9N"'5N"'5M"'5M M"'1M"'1M"'1L"'-L"'-L"'-K"')K"')K"')K"'%J"'%J"'%J"'!I"'!I"'!I M"'!H"&]H"&]H"&]H"&YG"&YG"&YG"&UF"&UF"&UF"&QE"&QE"&QE"&ME"&MD M"&MD"&MD"&IC"&IC"&IC"&EC"&EB"&EB!VAB!VAA!VAA!V=A!V=@!V=@!V9@ M!V9@!V9?!V5?!V5?!V5>!V5>!V1>!V1>!V1=!V-=!UY8$$="/"XK:C(O8D1` M/U)-&EE4"UE3"BLH;2DIPJBHS<G)W]S<]?GY_?GX]<[-M):27H![/'=R+V!: M"U]:/"8CC0P/Z3]/Y35"W00&TP``PP``N0``M@``M0``LP``J@P,A"LK-B<G M)R0D)"(B(B8F)C4U-3T]/3<W-S(R,BTM+2DI*24E)28F)B@H*"HJ*BTM+2\O M+S`P,#(R,C0T-"XN+B@H)BTL'3DV%$,_#4=#"4Q'!U!+!E!+!D]*!D]*!D]* M!D]*!DY)!4Y)!4Y)!4U(!4U(!4U(!4Q'!4Q'!4Q'!4M'!4M&!4M&!4I&!4I% M!4I%!4I%!4E%!4E$!4E$!4A$!4A#!4A#!4=#!4="!4="!49"!49"!49!!45! M!45!!45`!41`!41`!41`!40_!4,_!4,_!4,^!4(^!4(^!4(]!4$]!4$]!$$] M!$`\!$`\!$`\!#\[!#\[!#\[!#\[!#XZ!#XZ!#XZ!#TY!#TY!#TY!#PX!#PX M!#PX!#LX!#LW!#LW!#HW!#HV!#HV!#DV!#DV!#DU!#DU!#@U!#@T!#@T!#<T M!#<S!#<S!#8S!#8S!#8R!#4R!#4R!#4Q!#0Q!#0Q`S0Q`S0P`S,P`S,P`S,O M`S(O`S(O`S(N`S$N`S$N`S$N`S`M`S`M`S`M`R\L`R\L`R\L`RXL`RXK`RXK M`RXK`RTJ`RTJ`RTJ`RPI`RPI`RPI`RLI`RLH`RLH`RHH`RHG`RHG`RDG`RDG M`RDF`RDF`R@F`R@E`R@E`R<E`R<D`B<D`B8D`B8D`B8C`B4C`B4C`B4B`B0B M`B0B`B0A`B,A`B,A`B,A`B,@`B(@`B(@`B(?`@``D(<*CX8*CX8*CX8*CH4* MCH4*CH4*C80*C80*C80*C(0*C(,*C(,*C(,*BX(*BX(*BX(*BH(*BH$*BH$* MB8$*B8`*B8`*B(`*B'\*B'\*AW\*AW\*AWX*AWX*AGX*AGT*AGT*A7T*A7P* MA7P*A'P*A'P*A'L*@WL*@WL)@WH)@GH)@GH)@GH)@7D)@7D)@7D)@7@)@'@) M@'@)@'<)?W<)?W<)?W<)?G8)?G8)?G8)?74)?74)?74)?'4)?'0)?'0)?'0) M>W,)>W,)>W,)>G()>G()>G()>7()>7$)>7$)>'$)>'`)>'`)=W`)=W`)=V\) M=F\)=F\)=FX(=FX(=6X(=6T(=6T(=&T(=&T(=&P(<VP(<VP(<VL(<FL(<FL( M<FL(<6H(<6H(<6H(<6D(<&D(<&D(<&@(;V@(;V@(;V@(;F<(;F<(;F<(;68( M;68(;68(;&8(;&4(;&4(:V4(:V0(:V0(:V0(:F,(:F,(:F,(:6,(:6((:6(' M:&(':&$':&$'9V$'9V$'9V`'9F`'9F`'9E\'9E\'95\'95X'95X'9%X'9%X' M9%T'6U85-S-:$Q*<%A27,B]B244F5$\06U4)+2IJ,C+$Q<74[N[N^/CVX>#0 MN[B5I:%SDHY8B85)@7P\9V(78ETX(R&8'23M97OF5VKC#!#@``#0``#$``"_ M``"\``"Z``"N"PN%*BHW)R<G)"0D(B(B)B8F-#0T/3T]-S<W,C(R+"PL)B8F M(2$A)"0D*BHJ+R\O+R\O+R\O,#`P,#`P,#`P*2DI)"0A+RX803T/3DD'44P& M44P&4$L&4$L&4$L&4$H&3TH&3TH&3TH&3DD%3DD%3DD%34@%34@%34@%3$@% M3$<%3$<%2T<%2T8%2T8%2D8%2D4%2D4%2D4%244%240%240%2$0%2$,%2$,% M1T,%1T,%1T(%1D(%1D(%1D$%14$%14$%14`%14`%1$`%1$`%1#\%0S\%0S\% M0SX%0CX%0CX%0CX%03T%03T$03T$0#P$0#P$0#P$/SL$/SL$/SL$/SL$/CH$ M/CH$/CH$/3D$/3D$/3D$/#D$/#@$/#@$.S@$.S<$.S<$.C<$.C8$.C8$.C8$ M.38$.34$.34$.#4$.#0$.#0$-S0$-S,$-S,$-C,$-C,$-C($-3($-3($-3$$ M-#$$-#$$-#$#-#`#,S`#,S`#,R\#,B\#,B\#,BX#,2X#,2X#,2X#,"T#,"T# M,"T#+RP#+RP#+RP#+RP#+BL#+BL#+BL#+2H#+2H#+2H#+"D#+"D#+"D#*RD# M*R@#*R@#*B@#*B<#*B<#*2<#*2<#*28#*28#*"8#*"4#*"4#)R4#)R0")R0" M)B0")B0")B,")2,")2,")2(")"(")"(")"(")"$"(R$"(R$"(R`"(B`"(B`" M``"0APJ0APJ/A@J/A@J/A@J.A0J.A0J.A0J-A`J-A`J-A`J-A`J,@PJ,@PJ, M@PJ+@@J+@@J+@@J*@@J*@0J*@0J)@0J)@`J)@`J(@`J(?PJ(?PJ(?PJ'?PJ' M?@J'?@J&?@J&?0J&?0J%?0J%?0J%?`J$?`J$?`J$>PJ#>PJ#>PF#>@F">@F" M>@F">@F">0F!>0F!>0F!>`F`>`F`>`F`>`E_=PE_=PE_=PE^=@E^=@E^=@E] M=0E]=0E]=0E]=0E\=`E\=`E\=`E[<PE[<PE[<PEZ<PEZ<@EZ<@EY<@EY<0EY M<0EX<0EX<`EX<`EW<`EW<`EW;PEW;PEV;PEV;@AV;@AU;@AU;@AU;0AT;0AT M;0AT;`AS;`AS;`AS:PAR:PAR:PAR:PAR:@AQ:@AQ:@AQ:0AP:0AP:0AP:0AO M:`AO:`AO:`AN9PAN9PAN9PAM9@AM9@AM9@AL9@AL90AL90AL90AK9`AK9`AK M9`AJ9`AJ8PAJ8PAI8PAI8@AI8@=H8@=H80=H80=G80=G80=G8`=G8`=F8`=F M7P=F7P=E7P=E7P=E7@=D7@=D7@=<5A4W,UH3$IP6%)<Q+F-(0RE231-=5P@L M*6Q*2LOBXNO[^_OU]?#1S[>DH7*(A$>%@4)_>CIV<2QF8!-B738?'9\D*>=C M<.-68>0/$>8``-0``,4``+\``+T``+H``*X+"X8J*C<G)R<C(R,B(B(E)24P M,#`W-S<T-#0Q,3$L+"PF)B8A(2$D)"0J*BHP,#`R,C(U-34T-#0R,C(P,#`I M*2DE)"`O+AA`/0]/2@=13`913`913`912P902P902P902@9/2@9/2@9/2@9. M205.205.205-2`5-2`5-2`5,2`5,1P5,1P5+1P5+1@5+1@5+1@5*105*105* M105)105)1`5)1`5(1`5(0P5(0P5'0P5'0P5'0@5&0@5&0@5&005&005%005% M0`5%0`5$0`5$0`5$/P5#/P5#/P5#/@5"/@5"/@5"/@5!/05!/01!/01`/`1` M/`1`/`1`.P0_.P0_.P0_.P0^.@0^.@0^.@0].00].00].00\.00\.`0\.`0[ M.`0[-P0[-P0[-P0Z-@0Z-@0Z-@0Y-@0Y-00Y-00X-00X-`0X-`0W-`0W-`0W M,P0V,P0V,P0V,@0U,@0U,@0U,00U,00T,00T,0,T,`,S,`,S,`,S+P,R+P,R M+P,R+P,Q+@,Q+@,Q+@,P+0,P+0,P+0,P+`,O+`,O+`,O+`,N*P,N*P,N*P,M M*@,M*@,M*@,L*@,L*0,L*0,K*0,K*`,K*`,J*`,J)P,J)P,J)P,I)P,I)@,I M)@,H)@,H)0,H)0,G)0,G)0,G)`(F)`(F)`(F(P(E(P(E(P(E(@(E(@(D(@(D M(@(D(0(C(0(C(0(C(`(B(`(``)"'"Y"'"I"'"H^&"H^&"H^&"HZ%"HZ%"HZ% M"HZ%"HV$"HV$"HV$"HR#"HR#"HR#"HN""HN""HN""HJ""HJ!"HJ!"HF!"HF` M"HF`"HB`"HB`"HA_"HA_"H=_"H=^"H=^"H9^"H9]"H9]"H5]"H5]"H5\"H1\ M"H1\"H1["H-["H-["8-["8-Z"8)Z"8)Z"8)Y"8%Y"8%Y"8%X"8!X"8!X"8!X M"7]W"7]W"7]W"7YV"7YV"7YV"7UV"7UU"7UU"7UU"7QT"7QT"7QT"7MS"7MS M"7MS"7IS"7IR"7IR"7ER"7EQ"7EQ"7AQ"7AQ"7AP"7AP"7=P"7=O"7=O"79O M"79N"'9N"'5N"'5N"'5M"'1M"'1M"'1L"'-L"'-L"'-L"')K"')K"')K"')J M"'%J"'%J"'%I"'!I"'!I"'!I"&]H"&]H"&]H"&YG"&YG"&YG"&UG"&UF"&UF M"&UF"&QE"&QE"&QE"&MD"&MD"&MD"&ID"&IC"&IC"&EC"&EB"&EB!VAB!VAA M!VAA!V=A!V=A!V=@!V=@!V9@!V9?!V9?!V5?!V5?!V5>!V1>!UQ7%3<S6A,2 MG!84ES`M9D9"+E!+%U]9!RHG<&IJUOCX^OO[^>_NYLS*KZ:C=7ET,VED&VEC M&&5?$F!:"F!;,!P:H2<IXF!FX5-8Y1$2ZP``V0``QP``P```O0``N0``K@L+ MABHJ."<G)R,C(R(B(B0D)"LK*S(R,C$Q,3`P,"PL+"<G)R$A(20D)"HJ*C$Q M,34U-3HZ.CDY.30T-"\O+R@H*"0D'R\N&$`\$$]*!U)-!E%,!E%,!E%,!E%+ M!E!+!E!+!E!+!D]*!D]*!D]*!DY)!4Y)!4Y)!4U(!4U(!4U(!4Q(!4Q'!4Q' M!4Q'!4M&!4M&!4M&!4I&!4I%!4I%!4E%!4E$!4E$!4A$!4A#!4A#!4=#!4=# M!4="!49"!49"!49!!49!!45!!45!!45`!41`!41`!40_!4,_!4,_!4,^!4(^ M!4(^!4(^!4$]!4$]!$$]!$$\!$`\!$`\!$`\!#\[!#\[!#\[!#XZ!#XZ!#XZ M!#TY!#TY!#TY!#PY!#PX!#PX!#LX!#LW!#LW!#LW!#HW!#HV!#HV!#DV!#DU M!#DU!#@U!#@T!#@T!#<T!#<T!#<S!#8S!#8S!#8R!#8R!#4R!#4R!#4Q!#0Q M!#0Q`S0P`S,P`S,P`S,O`S(O`S(O`S(O`S$N`S$N`S$N`S`M`S`M`S`M`S`M M`R\L`R\L`R\L`RXK`RXK`RXK`RTJ`RTJ`RTJ`RPJ`RPI`RPI`RLI`RLH`RLH M`RLH`RHH`RHG`RHG`RDG`RDF`RDF`R@F`R@E`R@E`R<E`R<E`R<D`B8D`B8D M`B8C`B4C`B4C`B4C`B4B`B0B`B0B`B0A`B,A`B,A`B,@`@``D8@+D(<+D(<* MD(<*CX8*CX8*CX8*CX4*CH4*CH4*CH4*C80*C80*C80*C(,*C(,*C(,*BX,* MBX(*BX(*BH(*BH$*BH$*B8$*B8`*B8`*B8`*B(`*B'\*B'\*AW\*AWX*AWX* MAGX*AGX*AGT*A7T*A7T*A7P*A'P*A'P*A'L*A'L*@WL*@WL)@WH)@GH)@GH) M@GD)@7D)@7D)@7@)@'@)@'@)@'@)?W<)?W<)?W<)?G8)?G8)?G8)?G8)?74) M?74)?74)?'0)?'0)?'0)>W,)>W,)>W,)>G,)>G()>G()>7()>7$)>7$)>7$) M>'$)>'`)>'`)=W`)=V\)=V\)=F\)=FX(=FX(=6X(=6X(=6T(=&T(=&T(=&P( M<VP(<VP(<VP(<VL(<FL(<FL(<FH(<6H(<6H(<6D(<&D(<&D(<&D(;V@(;V@( M;V@(;F<(;F<(;F<(;F<(;68(;68(;68(;&4(;&4(;&4(:V0(:V0(:V0(:F0( M:F,(:F,(:6,(:6((:6(':&(':&(':&$':&$'9V$'9V`'9V`'9F`'9E\'9E\' M95\'95\'95X'75<4.#58$Q*<$Q*=*"5V.3930CX_4$LF(!Z%BHKB____^OKW MY^;:T<^WKZR#=G`J7UD'7UD'7UD'7E@'34@;'1N@)RGB8&7A4U?E$Q3M``#> M``#-``#%``#!``"]``"T"@J+)R<Y)R<G(B(B(B(B(R,C*BHJ+R\O+BXN+2TM M*BHJ)R<G(R,C)B8F+2TM-#0T.3DY/3T].SL[-#0T+"PL)B8F)20?+RT9/SP0 M3TH(4DT&4DT&4DP&44P&44P&44L&4$L&4$L&4$L&3TH&3TH&3TH&3DD%3DD% M3DD%34D%34@%34@%34@%3$<%3$<%3$<%2T8%2T8%2T8%2D8%2D4%2D4%244% M240%240%2$0%2$0%2$,%1T,%1T,%1T(%1T(%1D(%1D$%1D$%14$%14$%14`% M1$`%1$`%1#\%0S\%0S\%0S\%0CX%0CX%0CX%0CT%03T$03T$03P$0#P$0#P$ M0#P$/SL$/SL$/SL$/CH$/CH$/CH$/3H$/3D$/3D$/#D$/#@$/#@$/#@$.S<$ M.S<$.S<$.C<$.C8$.C8$.38$.34$.34$.#4$.#0$.#0$-S0$-S0$-S,$-S,$ M-C,$-C($-C($-3($-3($-3$$-#$$-#$#-#`#,S`#,S`#,R\#,B\#,B\#,B\# M,2X#,2X#,2X#,2T#,"T#,"T#,"T#+RP#+RP#+RP#+BL#+BL#+BL#+2H#+2H# M+2H#+"H#+"D#+"D#+"D#*R@#*R@#*R@#*B@#*B<#*B<#*2<#*28#*28#*"8# M*"4#*"4#)R4#)R4#)R0")B0")B0")B,")B,")2,")2,")2(")"(")"(")"$" M(R$"(R$"``"1B`N1B`N0APN0APJ0APJ/A@J/A@J/A@J/A0J.A0J.A0J.A0J- MA`J-A`J-A`J,@PJ,@PJ,@PJ+@PJ+@@J+@@J*@@J*@0J*@0J*@0J)@`J)@`J) M@`J(@`J(?PJ(?PJ'?PJ'?@J'?@J&?@J&?@J&?0J%?0J%?0J%?`J$?`J$?`J$ M>PJ$>PJ#>PJ#>PF#>@F">@F">@F">0F!>0F!>0F!>0F`>`F`>`F`>`E_=PE_ M=PE_=PE_=@E^=@E^=@E^=@E]=0E]=0E]=0E\=`E\=`E\=`E[=`E[<PE[<PEZ M<PEZ<@EZ<@EY<@EY<0EY<0EY<0EX<0EX<`EX<`EW<`EW;PEW;PEV;PEV;PEV M;@AU;@AU;@AU;0AT;0AT;0AT;`AT;`AS;`AS;`AS:PAR:PAR:PAR:@AQ:@AQ M:@AQ:@AP:0AP:0AP:0AO:`AO:`AO:`AN9PAN9PAN9PAN9PAM9@AM9@AM9@AL M90AL90AL90AK90AK9`AK9`AJ9`AJ8PAJ8PAI8PAI8@AI8@AI8@=H8@=H80=H M80=G80=G8`=G8`=F8`=F8`=F7P=E7P=E7P=>6!$\.%$6%)@.#:<9&)$F(WHN M*VHS,&`/#J2CH^C____Y^?7IZ-S5U+ZULXQX<RU@6@=?60=?60=?60=.21@@ M'IXE+.AC<>199.88&^X``.0``-4``,P``,@``,@``,`'!Y<A(3LD)"0A(2$B M(B(E)24J*BHO+R\K*RLH*"@G)R<G)R<H*"@M+2TT-#0Z.CH\/#P^/CX[.SLP M,#`E)24B(B(C(QXM+!D^.Q%02PA33092309230923`913`913`913`902P90 M2P902P9/2@9/2@9/2@9.205.205.205-205-2`5-2`5-2`5,1P5,1P5,1P5+ M1@5+1@5+1@5*1@5*105*105)105)1`5)1`5(1`5(1`5(0P5(0P5'0P5'0@5' M0@5&0@5&005&005%005%005%0`5$0`5$0`5$/P5#/P5#/P5#/P5"/@5"/@5" M/@5"/05!/01!/01!/`1`/`1`/`1`/`0_.P0_.P0_.P0^.@0^.@0^.@0].@0] M.00].00].00\.`0\.`0\.`0[-P0[-P0[-P0Z-P0Z-@0Z-@0Y-@0Y-00Y-00X M-00X-00X-`0W-`0W-`0W,P0W,P0V,P0V,@0V,@0U,@0U,@0U,00T,00T,0,T M,`,S,`,S,`,S,`,R+P,R+P,R+P,R+@,Q+@,Q+@,Q+0,P+0,P+0,P+0,O+`,O M+`,O+`,N*P,N*P,N*P,M*P,M*@,M*@,L*@,L*0,L*0,L*0,K*`,K*`,K*`,J M*`,J)P,J)P,I)P,I)@,I)@,H)@,H)@,H)0,G)0,G)0,G)`(G)`(F)`(F(P(F M(P(E(P(E(P(E(@(D(@(D(@(D(0(C(0(``)&("Y&("Y&("Y"'"Y"'"I"'"I"& M"H^&"H^&"H^&"HZ%"HZ%"HZ%"HV$"HV$"HV$"HR#"HR#"HR#"HN#"HN""HN" M"HN""HJ!"HJ!"HJ!"HF!"HF`"HF`"HB`"HA_"HA_"H=_"H=^"H=^"H9^"H9^ M"H9]"H5]"H5]"H5\"H5\"H1\"H1\"H1["H-["H-["8-Z"8)Z"8)Z"8)Y"8%Y M"8%Y"8%Y"8!X"8!X"8!X"8!W"7]W"7]W"7]W"7YV"7YV"7YV"7UU"7UU"7UU M"7QT"7QT"7QT"7MT"7MS"7MS"7IS"7IR"7IR"7IR"7ER"7EQ"7EQ"7AQ"7AP M"7AP"7=P"7=O"7=O"79O"79O"79N"'5N"'5N"'5M"'5M"'1M"'1M"'1L"'-L M"'-L"'-K"')K"')K"')J"'%J"'%J"'%J"'!I"'!I"'!I"&]H"&]H"&]H"&]H M"&YG"&YG"&YG"&UF"&UF"&UF"&QE"&QE"&QE"&ME"&MD"&MD"&ID"&IC"&IC M"&IC"&EC"&EB"&EB!VAB!VAA!VAA!V=A!V=@!V=@!V9@!V9@!V9?!V5?!U]9 M#T$\21D8D@D)KPL*K!(1GAD7DA43F@T-O+N[[O?W\NGHW>?GVMC6PK.QB'5P M*6!:!V!:!U]9!U]9!U%,&"XJ@"$GVE]UY%]VYR`G[@``Z@``W@``U0``T``` MT0``RP0$IQD91"$A(2`@("(B(B8F)BLK*RXN+BHJ*B0D)",C(R<G)RPL+#,S M,SL[.S\_/S\_/S\_/SDY.2HJ*B`@("`@(",C'BPK&CXZ$5!+"%-.!E--!E)- M!E)-!E),!E%,!E%,!E%,!E!+!E!+!E!+!D]*!D]*!D]*!DY)!4Y)!4Y)!4Y) M!4U(!4U(!4U(!4Q'!4Q'!4Q'!4M'!4M&!4M&!4I&!4I%!4I%!4E%!4E$!4E$ M!4E$!4A$!4A#!4A#!4=#!4="!4="!49"!49"!49!!45!!45!!45`!41`!41` M!40_!4,_!4,_!4,_!4,^!4(^!4(^!4(]!4$]!$$]!$$]!$`\!$`\!$`\!#\[ M!#\[!#\[!#XZ!#XZ!#XZ!#XZ!#TY!#TY!#TY!#PX!#PX!#PX!#LX!#LW!#LW M!#HW!#HV!#HV!#DV!#DU!#DU!#@U!#@U!#@T!#@T!#<T!#<S!#<S!#8S!#8S M!#8R!#4R!#4R!#4Q!#0Q!#0Q`S0P`S,P`S,P`S,P`S,O`S(O`S(O`S(N`S$N M`S$N`S$N`S`M`S`M`S`M`R\L`R\L`R\L`RXK`RXK`RXK`RTK`RTJ`RTJ`RTJ M`RPI`RPI`RPI`RLI`RLH`RLH`RHH`RHG`RHG`RDG`RDF`RDF`R@F`R@F`R@E M`R@E`R<E`R<D`B<D`B8D`B8D`B8C`B4C`B4C`B4B`B0B`B0B`B0A`@``DHD+ MD8@+D8@+D8@+D8<+D(<*D(<*D(8*CX8*CX8*CX8*CH4*CH4*CH4*C80*C80* MC80*C(0*C(,*C(,*BX,*BX(*BX(*BX(*BH$*BH$*BH$*B8$*B8`*B8`*B(`* MB'\*B'\*AW\*AW\*AWX*AGX*AGX*AGT*AGT*A7T*A7P*A7P*A'P*A'P*A'L* M@WL*@WL)@WH)@GH)@GH)@GH)@7D)@7D)@7D)@'@)@'@)@'@)@'<)?W<)?W<) M?W<)?G8)?G8)?G8)?74)?74)?74)?'0)?'0)?'0)>W0)>W,)>W,)>W,)>G() M>G()>G()>7()>7$)>7$)>'$)>'`)>'`)=W`)=V\)=V\)=F\)=F\)=FX(=6X( M=6X(=6T(=6T(=&T(=&T(=&P(<VP(<VP(<VL(<FL(<FL(<FH(<6H(<6H(<6H( M<&D(<&D(<&D(<&@(;V@(;V@(;V@(;F<(;F<(;F<(;68(;68(;68(;&4(;&4( M;&4(:V4(:V0(:V0(:F0(:F,(:F,(:F,(:6,(:6((:6(':&(':&$':&$'9V$' M9V`'9V`'9F`'9F`'9E\'8%H.1T)$(!V0"0BY`0'#`@*^`P.[#@Z\3$S)X>'U MV]K'P\"@Q<*CM[2-EI):;6<;8%H'8%H'8%H'7E@'5E$52D4\-C5[.T7#1E7A M-#KI%A;K!@;F``#<``#4``#1``#,`0&U#0UV&AHY("`G)24F*BHJ+2TM+BXN M*2DI(R,C(R,C)R<G+BXN-34U.SL[/CX^/3T].SL[-#0T)B8F("`@("`@(B(? M*RH;/3H244L(4TX&4TX&4TT&4DT&4DT&4DP&44P&44P&44P&4$L&4$L&4$L& M3TH&3TH&3TH&3TH&3DD%3DD%3DD%34@%34@%34@%3$<%3$<%3$<%2T<%2T8% M2T8%2D8%2D4%2D4%244%244%240%240%2$0%2$,%2$,%1T,%1T(%1T(%1D(% M1D(%1D$%14$%14$%14`%1$`%1$`%1$`%1#\%0S\%0S\%0SX%0CX%0CX%0CT% M03T$03T$03T$0#P$0#P$0#P$/SL$/SL$/SL$/CL$/CH$/CH$/CH$/3D$/3D$ M/3D$/#@$/#@$/#@$.S@$.S<$.S<$.C<$.C8$.C8$.38$.38$.34$.34$.#4$ M.#0$.#0$-S0$-S,$-S,$-C,$-C,$-C($-3($-3($-3$$-#$$-#$#-#`#,S`# M,S`#,S`#,R\#,B\#,B\#,BX#,2X#,2X#,2X#,"T#,"T#,"T#+RP#+RP#+RP# M+BL#+BL#+BL#+BL#+2H#+2H#+2H#+"D#+"D#+"D#*RD#*R@#*R@#*B@#*B<# M*B<#*2<#*28#*28#*"8#*"8#*"4#*"4#)R4#)R0")R0")B0")B0")B,")2," M)2,")2(")"(")"("``"2B0N2B0N2B`N1B`N1B`N1APN0APJ0APJ0A@J/A@J/ MA@J/A@J.A0J.A0J.A0J-A`J-A`J-A`J,A`J,@PJ,@PJ,@PJ+@@J+@@J+@@J* M@0J*@0J*@0J)@0J)@`J)@`J(@`J(?PJ(?PJ'?PJ'?PJ'?@J'?@J&?@J&?0J& M?0J%?0J%?`J%?`J$?`J$?`J$>PJ#>PJ#>PF#>@F">@F">@F">@F!>0F!>0F! M>0F!>`F`>`F`>`F`=PE_=PE_=PE_=PE^=@E^=@E^=@E]=0E]=0E]=0E\=0E\ M=`E\=`E\=`E[<PE[<PE[<PEZ<@EZ<@EZ<@EY<@EY<0EY<0EX<0EX<`EX<`EW M<`EW<`EW;PEV;PEV;PEV;@AV;@AU;@AU;0AU;0AT;0AT;0AT;`AS;`AS;`AS M:PAR:PAR:PAR:PAQ:@AQ:@AQ:@AQ:0AP:0AP:0AP:`AO:`AO:`AO:`AN9PAN M9PAN9PAM9@AM9@AM9@AL9@AL90AL90AK90AK9`AK9`AK9`AJ8PAJ8PAJ8PAI M8PAI8@AI8@=H8@=H80=H80=G80=G80=G8`=F8`=F8`=A6@Y*148F(Y<,"\L$ M!-4``-(``,)$1,6RLMCX^/K"OYZ2CEB$?T*"?3IS;B1D7PYA6P=@6@=@6@=> M6`A>5PA>6`=231\L+(\G+-I!1.-$1.89&>D!`>,``-4``,X``,D``+T"`J0, M#'0A(3TK*RPM+2TN+BXN+BXI*2DC(R,C(R,H*"@N+BXT-#0[.SL^/CX[.SLV M-C8M+2TD)"0@("`A(2`B(A\J*1L\.1)13`A43@933@933@93309230923092 M30913`913`913`902P902P902P902@9/2@9/2@9/2@9.205.205.205-2`5- M2`5-2`5,2`5,1P5,1P5+1P5+1@5+1@5*1@5*105*105*105)105)1`5)1`5( M1`5(0P5(0P5'0P5'0@5'0@5&0@5&0@5&005%005%005%0`5%0`5$0`5$0`5$ M/P5#/P5#/P5#/@5"/@5"/@5"/05!/05!/01!/01`/`1`/`1`/`0_.P0_.P0_ M.P0_.P0^.@0^.@0^.@0].00].00].00\.`0\.`0\.`0[.`0[-P0[-P0Z-P0Z M-@0Z-@0Z-@0Y-@0Y-00Y-00X-00X-`0X-`0W-`0W,P0W,P0V,P0V,P0V,@0U M,@0U,@0U,00T,00T,00T,0,T,`,S,`,S,`,S+P,R+P,R+P,R+@,Q+@,Q+@,Q M+@,P+0,P+0,P+0,O+`,O+`,O+`,O+`,N*P,N*P,N*P,M*@,M*@,M*@,L*0,L M*0,L*0,K*0,K*`,K*`,J*`,J)P,J)P,I)P,I)P,I)@,I)@,H)@,H)0,H)0,G M)0,G)`(G)`(F)`(F)`(F(P(E(P(E(P(E(@(D(@(``)*)"Y*)"Y*)"Y*("Y&( M"Y&("Y&'"Y"'"I"'"I"'"H^&"H^&"H^&"HZ%"HZ%"HZ%"HV$"HV$"HV$"HV$ M"HR#"HR#"HR#"HN""HN""HN""HJ""HJ!"HJ!"HF!"HF`"HF`"HB`"HA_"HA_ M"H=_"H=_"H=^"H=^"H9^"H9]"H9]"H5]"H5]"H5\"H1\"H1\"H1["H-["H-[ M"8-Z"8)Z"8)Z"8)Z"8)Y"8%Y"8%Y"8%X"8!X"8!X"8!X"7]W"7]W"7]W"7YV M"7YV"7YV"7UU"7UU"7UU"7QU"7QT"7QT"7QT"7MS"7MS"7MS"7IS"7IR"7IR M"7ER"7EQ"7EQ"7AQ"7AP"7AP"7=P"7=P"7=O"7=O"79O"79N"'9N"'5N"'5N M"'5M"'1M"'1M"'1L"'-L"'-L"'-K"')K"')K"')K"'%J"'%J"'%J"'%I"'!I M"'!I"'!I"&]H"&]H"&]H"&YG"&YG"&YG"&UF"&UF"&UF"&QF"&QE"&QE"&QE M"&MD"&MD"&MD"&ID"&IC"&IC"&EC"&EB"&EB!VAB!VAA!VAA!V=A!V=A!V=@ M!V9@!V!;$$I%3"LHEQ`/UP@'Y```XP``P)24SNGIZ?;U\<3!H9F57F-=$V)< M!V)<!V%;!V%;!V%;!V%:!V!:!V!:!V!9!UA2$#8R:!$2U49)X6MOX3`QZ0(" MYP``TP``R0``Q```O@``LP,#G!X>5B\O,"XN+BXN+BTM+2DI*20D)"0D)"DI M*2XN+C0T-#DY.3P\/#@X.#`P,"@H*"(B(B(B'R0D'B8E'2XL&3\[$5%,"%1/ M!E1.!E-.!E-.!E--!E)-!E)-!E)-!E%,!E%,!E%,!E!+!E!+!E!+!E!*!D]* M!D]*!D]*!DY)!4Y)!4Y)!4U(!4U(!4U(!4Q(!4Q'!4Q'!4M'!4M&!4M&!4M& M!4I%!4I%!4I%!4E%!4E$!4E$!4A$!4A#!4A#!4=#!4=#!4="!49"!49"!49! M!45!!45!!45`!45`!41`!41`!40_!4,_!4,_!4,^!4(^!4(^!4(^!4$]!4$] M!$$]!$`\!$`\!$`\!$`[!#\[!#\[!#\[!#XZ!#XZ!#XZ!#TY!#TY!#TY!#PY M!#PX!#PX!#LX!#LW!#LW!#HW!#HV!#HV!#HV!#DV!#DU!#DU!#@U!#@T!#@T M!#<T!#<T!#<S!#8S!#8S!#8R!#4R!#4R!#4Q!#4Q!#0Q!#0Q`S0P`S,P`S,P M`S,O`S(O`S(O`S(O`S$N`S$N`S$N`S`M`S`M`S`M`R\L`R\L`R\L`R\L`RXK M`RXK`RXK`RTJ`RTJ`RTJ`RPJ`RPI`RPI`RLI`RLH`RLH`RHH`RHG`RHG`RHG M`RDG`RDF`RDF`R@F`R@E`R@E`R<E`R<E`R<D`B8D`B8D`B8C`B4C`B4C`B4B M`@``DXH+DXD+DHD+DHD+DH@+D8@+D8@+D8<+D(<*D(<*D(<*CX8*CX8*CX8* MCH4*CH4*CH4*CH4*C80*C80*C80*C(,*C(,*C(,*BX(*BX(*BX(*BH(*BH$* MBH$*B8$*B8`*B8`*B(`*B(`*B'\*B'\*AW\*AWX*AWX*AGX*AGT*AGT*A7T* MA7T*A7P*A'P*A'P*A'L*@WL*@WL)@WL)@WH)@GH)@GH)@GD)@7D)@7D)@7@) M@'@)@'@)@'@)?W<)?W<)?W<)?G8)?G8)?G8)?78)?74)?74)?74)?'0)?'0) M?'0)>W,)>W,)>W,)>G,)>G()>G()>7()>7$)>7$)>'$)>'`)>'`)>'`)=W`) M=V\)=V\)=F\)=FX(=FX(=6X(=6X(=6T(=&T(=&T(=&P(<VP(<VP(<VL(<FL( M<FL(<FL(<FH(<6H(<6H(<6D(<&D(<&D(<&D(;V@(;V@(;V@(;F<(;F<(;F<( M;68(;68(;68(;68(;&4(;&4(;&4(:V0(:V0(:V0(:F0(:F,(:F,(:6,(:6(( M:6(':&(':&$':&$'9V$'9V$'9V`'85H22$10+"F3%Q7("@GA``#G"PO!OK[B M^/CX\?#IR<>IJ:5V:V4?8EP'8EP'8EP'8EL'85L'85L'85H'8%H'8%H'6E0. M/SM4#@[82E7E<X3C.D+E!`7A``#/``#$``#```"]``"U`0&B'!Q>+2TN*RLK M*2DI*"@H*"@H)R<G*2DI+"PL+R\O,C(R-34U-C8V,#`P*"@H(R,C(2$A)20> M+2P:-3,6/CL1244,4TT'5$\&5$\&5$X&4TX&4TX&4TT&4DT&4DT&4DT&44P& M44P&44P&44L&4$L&4$L&4$L&3TH&3TH&3TH&3DD%3DD%3DD%34@%34@%34@% M3$@%3$<%3$<%3$<%2T8%2T8%2T8%2D8%2D4%2D4%244%240%240%2$0%2$,% M2$,%1T,%1T,%1T(%1D(%1D(%1D$%1D$%14$%14$%14`%1$`%1$`%1#\%0S\% M0S\%0SX%0CX%0CX%0CX%03T%03T$03T$03P$0#P$0#P$0#P$/SL$/SL$/SL$ M/CH$/CH$/CH$/3D$/3D$/3D$/#D$/#@$/#@$.S@$.S<$.S<$.S<$.C<$.C8$ M.C8$.38$.34$.34$.#4$.#0$.#0$-S0$-S0$-S,$-C,$-C,$-C($-C($-3($ M-3($-3$$-#$$-#$#-#`#,S`#,S`#,R\#,B\#,B\#,B\#,2X#,2X#,2X#,"T# M,"T#,"T#,"P#+RP#+RP#+RP#+BL#+BL#+BL#+2H#+2H#+2H#+"H#+"D#+"D# M*RD#*R@#*R@#*R@#*B<#*B<#*B<#*2<#*28#*28#*"8#*"4#*"4#)R4#)R4# M)R0")B0")B0")B,")2,")2,"``"3B@N3B@N3B0N2B0N2B0N2B`N1B`N1B`N1 MAPN0APN0APJ0APJ/A@J/A@J/A@J.A0J.A0J.A0J.A0J-A`J-A`J-A`J,@PJ, M@PJ,@PJ+@@J+@@J+@@J*@@J*@0J*@0J)@0J)@`J)@`J)@`J(@`J(?PJ(?PJ' M?PJ'?@J'?@J&?@J&?0J&?0J%?0J%?0J%?`J$?`J$?`J$>PJ#>PJ#>PJ#>PF# M>@F">@F">@F">0F!>0F!>0F!>`F`>`F`>`F`>`E_=PE_=PE_=PE^=@E^=@E^ M=@E^=@E]=0E]=0E]=0E\=`E\=`E\=`E[<PE[<PE[<PEZ<PEZ<@EZ<@EY<@EY M<0EY<0EX<0EX<0EX<`EX<`EW<`EW;PEW;PEV;PEV;@AV;@AU;@AU;@AU;0AT M;0AT;0AT;`AS;`AS;`AS;`AS:PAR:PAR:PAR:@AQ:@AQ:@AQ:0AP:0AP:0AP M:0AO:`AO:`AO:`AN9PAN9PAN9PAM9PAM9@AM9@AM9@AL90AL90AL90AK9`AK M9`AK9`AJ9`AJ8PAJ8PAI8PAI8@AI8@=H8@=H8@=H80=H80=G80=A6A)(0U(L M*948%\0+"N```.@5%<3;V_'O[N;4TKK`O9JKJ'IP:R9C70=B7`=B7`=B7`=B M6P=A6P=A6P=A6@=?60=:50U%04@+"]I-7NAXD>1`3N,&!]X``,T``,,``+\` M`+P``+8``*49&6,K*RTF)B8D)"0D)"0G)R<K*RLM+2TN+BXP,#`P,#`Q,3$P M,#`I*2DB(B(A(2$@("`E)!XT,A9%00Y02PE230=54`953P943P943P943@93 M3@933@933@923092309230923`913`913`912P902P902P902P9/2@9/2@9/ M2@9.205.205.205-205-2`5-2`5,2`5,1P5,1P5,1P5+1@5+1@5+1@5*1@5* M105*105)105)1`5)1`5(1`5(1`5(0P5'0P5'0P5'0@5'0@5&0@5&005&005% M005%005%0`5$0`5$0`5$/P5#/P5#/P5#/@5"/@5"/@5"/@5!/05!/01!/01! M/`1`/`1`/`1`/`0_.P0_.P0_.P0^.@0^.@0^.@0].00].00].00\.00\.`0\ M.`0\.`0[-P0[-P0[-P0Z-P0Z-@0Z-@0Y-@0Y-00Y-00X-00X-`0X-`0W-`0W M-`0W,P0V,P0V,P0V,@0V,@0U,@0U,@0U,00T,00T,0,T,`,S,`,S,`,S+P,R M+P,R+P,R+P,Q+@,Q+@,Q+@,Q+0,P+0,P+0,P+0,O+`,O+`,O+`,N*P,N*P,N M*P,M*@,M*@,M*@,L*@,L*0,L*0,K*0,K*`,K*`,K*`,J*`,J)P,J)P,I)P,I M)@,I)@,H)@,H)0,H)0,G)0,G)0,G)`(F)`(F)`(F(P(F(P(``)2*"Y.*"Y.* M"Y.)"Y*)"Y*)"Y*("Y&("Y&("Y&("Y"'"Y"'"I"'"H^&"H^&"H^&"H^%"HZ% M"HZ%"HZ%"HV$"HV$"HV$"HR#"HR#"HR#"HN#"HN""HN""HJ""HJ!"HJ!"HJ! M"HF`"HF`"HF`"HB`"HA_"HA_"H=_"H=^"H=^"H9^"H9^"H9]"H5]"H5]"H5\ M"H1\"H1\"H1["H1["H-["H-["8-Z"8)Z"8)Z"8)Y"8%Y"8%Y"8%Y"8!X"8!X M"8!X"7]W"7]W"7]W"7]V"7YV"7YV"7YV"7UU"7UU"7UU"7QT"7QT"7QT"7MT M"7MS"7MS"7IS"7IR"7IR"7ER"7EQ"7EQ"7EQ"7AQ"7AP"7AP"7=P"7=O"7=O M"79O"79O"79N"'5N"'5N"'5M"'1M"'1M"'1L"'1L"'-L"'-L"'-K"')K"')K M"')J"'%J"'%J"'%J"'!I"'!I"'!I"&]H"&]H"&]H"&YG"&YG"&YG"&YG"&UF M"&UF"&UF"&QE"&QE"&QE"&ME"&MD"&MD"&ID"&IC"&IC"&EC"&EB"&EB!VEB M!VAB!VAA!VAA!V)<#TI%3BHGFQ02SPH)X0``YQT=Q^;F\='/M;.PA:NG>)V8 M87!K(F-=!V-=!V-<!V)<!V)<!V);!V%;!V%;!U]9"%I5#4A$0`H)UDI8YW:- MY$%/XP@*X```T@``R```P@``OP``N0``IA8692@H+"0D)"(B(B(B(B<G)RPL M+#`P,#$Q,3,S,S(R,C$Q,2XN+B<G)R$A(2`@("`@(",C'S8S%DI&#%90!E90 M!E50!E50!E5/!E1/!E1/!E1.!E-.!E-.!E-.!E--!E)-!E)-!E),!E%,!E%, M!E%+!E!+!E!+!E!+!D]*!D]*!D]*!DY)!4Y)!4Y)!4U)!4U(!4U(!4U(!4Q' M!4Q'!4Q'!4M&!4M&!4M&!4I&!4I%!4I%!4E%!4E$!4E$!4A$!4A$!4A#!4A# M!4=#!4="!4="!49"!49!!49!!45!!45!!45`!41`!41`!40_!4,_!4,_!4,_ M!4(^!4(^!4(^!4(]!4$]!$$]!$$\!$`\!$`\!$`\!#\[!#\[!#\[!#XZ!#XZ M!#XZ!#TZ!#TY!#TY!#TY!#PX!#PX!#PX!#LW!#LW!#LW!#HW!#HV!#HV!#DV M!#DU!#DU!#@U!#@U!#@T!#<T!#<T!#<S!#<S!#8S!#8R!#8R!#4R!#4R!#4Q M!#0Q!#0Q`S0P`S,P`S,P`S,P`S(O`S(O`S(O`S(N`S$N`S$N`S$M`S`M`S`M M`S`M`R\L`R\L`R\L`RXK`RXK`RXK`RTK`RTJ`RTJ`RPJ`RPI`RPI`RPI`RLH M`RLH`RLH`RHH`RHG`RHG`RDG`RDF`RDF`R@F`R@F`R@E`R<E`R<E`R<D`B<D M`B8D`B8C`@``E(L+E(H+DXH+DXH+DXD+DHD+DHD+DH@+D8@+D8@+D8@+D(<+ MD(<*D(<*D(8*CX8*CX8*CX8*CH4*CH4*CH4*C80*C80*C80*C(,*C(,*C(,* MBX,*BX(*BX(*BH(*BH$*BH$*BH$*B8$*B8`*B8`*B(`*B'\*B'\*AW\*AWX* MAWX*AGX*AGX*AGT*A7T*A7T*A7P*A7P*A'P*A'P*A'L*@WL*@WL)@WH)@GH) M@GH)@GD)@7D)@7D)@7D)@'@)@'@)@'@)?W<)?W<)?W<)?W<)?G8)?G8)?G8) M?74)?74)?74)?'0)?'0)?'0)>W0)>W,)>W,)>G,)>G()>G()>G()>7()>7$) M>7$)>'$)>'`)>'`)=W`)=V\)=V\)=F\)=F\)=FX(=6X(=6X(=6T(=&T(=&T( M=&P(=&P(<VP(<VP(<VL(<FL(<FL(<FH(<6H(<6H(<6H(<&D(<&D(<&D(;V@( M;V@(;V@(;V<(;F<(;F<(;F<(;68(;68(;68(;&4(;&4(;&4(:V4(:V0(:V0( M:F0(:F,(:F,(:6,(:6((:6((:6(':&(':&$'95X)3TI!)"*H#0S>!P?E``#E M*2G*Z.?GJ:5T?WHW=W(M<FTC9V`09%T'8UT'8UT'8UP'8EP'8EP'8EL'85L' M7ED(6E4/240\$`_`/D7C<'WB04KE#`WE``#;``#0``#(``##``"]``"G$1%G M(R,J(B(B(2$A(B(B)R<G+2TM,3$Q-34U.3DY-C8V,S,S+2TM)B8F(2$A("`@ M("`@(2$?-3(62T8+5E$&5E$&5E`&55`&55`&54\&5$\&5$\&5$X&4TX&4TX& M4TX&4TT&4DT&4DT&4DP&44P&44P&44P&4$L&4$L&4$L&3TH&3TH&3TH&3DD% M3DD%3DD%3DD%34@%34@%34@%3$<%3$<%3$<%2T<%2T8%2T8%2D8%2D4%2D4% M244%240%240%2$0%2$0%2$,%2$,%1T,%1T(%1T(%1D(%1D(%1D$%14$%14$% M14`%1$`%1$`%1#\%0S\%0S\%0S\%0SX%0CX%0CX%0CT%03T$03T$03T$0#P$ M0#P$0#P$/SL$/SL$/SL$/CH$/CH$/CH$/3H$/3D$/3D$/3D$/#@$/#@$/#@$ M.S@$.S<$.S<$.C<$.C8$.C8$.38$.34$.34$.#4$.#4$.#0$.#0$-S0$-S,$ M-S,$-C,$-C,$-C($-3($-3($-3$$-#$$-#$#-#`#,S`#,S`#,S`#,B\#,B\# M,B\#,BX#,2X#,2X#,2X#,"T#,"T#,"T#+RP#+RP#+RP#+BL#+BL#+BL#+2L# M+2H#+2H#+2H#+"D#+"D#+"D#*R@#*R@#*R@#*B@#*B<#*B<#*2<#*28#*28# M*"8#*"8#*"4#)R4#)R4#)R0")R0")B0"``"4BPN4BPN4B@N3B@N3B@N3B0N2 MB0N2B0N2B0N1B`N1B`N1B`N1APN0APJ0APJ0A@J/A@J/A@J/A@J.A0J.A0J. MA0J-A`J-A`J-A`J,@PJ,@PJ,@PJ+@PJ+@@J+@@J+@@J*@0J*@0J*@0J)@0J) M@`J)@`J(@`J(?PJ(?PJ'?PJ'?@J'?@J&?@J&?@J&?0J&?0J%?0J%?`J%?`J$ M?`J$?`J$>PJ#>PJ#>PF#>@F">@F">@F">0F!>0F!>0F!>0F`>`F`>`F`>`F` M=PE_=PE_=PE_=PE^=@E^=@E^=@E]=0E]=0E]=0E\=`E\=`E\=`E[=`E[<PE[ M<PE[<PEZ<@EZ<@EZ<@EY<@EY<0EY<0EX<0EX<`EX<`EW<`EW;PEW;PEV;PEV M;PEV;@AU;@AU;@AU;0AU;0AT;0AT;0AT;`AS;`AS;`AS:PAR:PAR:PAR:@AQ M:@AQ:@AQ:@AP:0AP:0AP:0AP:`AO:`AO:`AO:`AN9PAN9PAN9PAM9@AM9@AM M9@AL90AL90AL90AK90AK9`AK9`AJ9`AJ8PAJ8PAJ8PAI8PAI8@AI8@=H8@=H M80=64#,>'+<'!^4"`NP``.`V-LWEY-N.BDEH8@YD70=E7@=D7@=D7@=D70=C M70=C70=C7`=B7`=B7`=B6P==5PI:5!).2C$E(XPO+]=C9-\_0N80$.L``.0` M`-H``,X``,0``+P!`:8,#&T>'BL@("$@("$C(R,H*"@M+2TS,S,X.#@]/3T[ M.SLT-#0M+2TF)B8A(2$@("`@("`A(1\V-!9,1PM74096409640964`954`95 M4`953P943P943P943P943@933@933@933092309230923`913`913`913`90 M2P902P902P9/2@9/2@9/2@9/2@9.205.205.205-2`5-2`5-2`5,1P5,1P5, M1P5+1P5+1@5+1@5*1@5*105*105)105)105)1`5)1`5(1`5(0P5(0P5'0P5' M0@5'0@5&0@5&0@5&005%005%005%0`5$0`5$0`5$/P5$/P5#/P5#/P5#/@5" M/@5"/@5"/05!/01!/01!/01`/`1`/`1`/`0_.P0_.P0_.P0^.@0^.@0^.@0^ M.@0].00].00].00\.`0\.`0\.`0[.`0[-P0[-P0Z-P0Z-@0Z-@0Y-@0Y-00Y M-00Y-00X-00X-`0X-`0W-`0W,P0W,P0V,P0V,P0V,@0U,@0U,@0U,00T,00T M,0,T,`,S,`,S,`,S,`,S+P,R+P,R+P,R+@,Q+@,Q+@,Q+@,P+0,P+0,P+0,O M+`,O+`,O+`,N*P,N*P,N*P,N*P,M*@,M*@,M*@,L*0,L*0,L*0,K*0,K*`,K M*`,J*`,J)P,J)P,I)P,I)@,I)@,H)@,H)@,H)0,H)0,G)0,G)`(G)`(``)6+ M"Y2+"Y2+"Y2*"Y.*"Y.*"Y.)"Y*)"Y*)"Y*)"Y&("Y&("Y&("Y&'"Y"'"I"' M"I"&"H^&"H^&"H^&"HZ%"HZ%"HZ%"HV$"HV$"HV$"HR$"HR#"HR#"HR#"HN" M"HN""HN""HJ!"HJ!"HJ!"HF!"HF`"HF`"HB`"HA_"HA_"H=_"H=_"H=^"H9^ M"H9^"H9]"H9]"H5]"H5\"H5\"H1\"H1\"H1["H-["H-["8-Z"8)Z"8)Z"8)Z M"8%Y"8%Y"8%Y"8%X"8!X"8!X"8!W"7]W"7]W"7]W"7YV"7YV"7YV"7UU"7UU M"7UU"7QU"7QT"7QT"7MT"7MS"7MS"7MS"7IR"7IR"7IR"7ER"7EQ"7EQ"7AQ M"7AP"7AP"7=P"7=P"7=O"79O"79O"79N"'9N"'5N"'5M"'5M"'1M"'1M"'1L M"'-L"'-L"'-K"')K"')K"')K"'%J"'%J"'%J"'!I"'!I"'!I"'!H"&]H"&]H M"&]H"&YG"&YG"&YG"&UF"&UF"&UF"&QF"&QE"&QE"&ME"&MD"&MD"&MD"&IC M"&IC"&IC"&EC"&AA"6QE#FYH$UM6,1D8PP,#Z@``Y```T4]/T^CGV8Z(1VAB M#F1>!V5>!V5>!V1>!V1>!V1=!V-=!V-=!V-<!V)<!V)<!U]9"EQ7$%=2'$I& M.C(PB$!`R3]"WR<MZA$5Z0,$X@``T0``P0``MP$!I`<'@A,34AL;,B`@(R0D M)"DI*2TM+3,S,S@X.#T]/3L[.S0T-"PL+"4E)2$A(2`@("`@("(A'SDW%$U) M"5=1!E=1!E91!E91!E90!E50!E50!E5/!E5/!E1/!E1/!E1.!E-.!E-.!E-- M!E)-!E)-!E),!E%,!E%,!E%,!E!+!E!+!E!+!D]*!D]*!D]*!D]*!DY)!4Y) M!4Y)!4U(!4U(!4U(!4Q'!4Q'!4Q'!4M'!4M&!4M&!4I&!4I%!4I%!4I%!4E% M!4E$!4E$!4A$!4A#!4A#!4=#!4="!4="!49"!49"!49!!45!!45!!45`!41` M!41`!41`!40_!4,_!4,_!4,^!4(^!4(^!4(]!4$]!4$]!$$]!$`\!$`\!$`\ M!#\[!#\[!#\[!#\[!#XZ!#XZ!#XZ!#TY!#TY!#TY!#PX!#PX!#PX!#LX!#LW M!#LW!#HW!#HV!#HV!#DV!#DV!#DU!#DU!#@U!#@T!#@T!#<T!#<S!#<S!#8S M!#8S!#8R!#4R!#4R!#4Q!#0Q!#0Q`S0Q`S0P`S,P`S,P`S,O`S(O`S(O`S(N M`S$N`S$N`S$N`S`M`S`M`S`M`R\L`R\L`R\L`RXL`RXK`RXK`RXK`RTJ`RTJ M`RTJ`RPI`RPI`RPI`RLI`RLH`RLH`RHH`RHG`RHG`RDG`RDG`RDF`RDF`R@F M`R@E`R@E`R<E`R<D`@``E8P+E8L+E(L+E(L+E(H+DXH+DXH+DXD+DHD+DHD+ MDHD+DH@+D8@+D8@+D8<+D(<*D(<*D(<*CX8*CX8*CX8*CH4*CH4*CH4*C80* MC80*C80*C80*C(,*C(,*C(,*BX(*BX(*BX(*BH(*BH$*BH$*B8$*B8`*B8`* MB(`*B'\*B'\*AW\*AW\*AWX*AWX*AGX*AGT*AGT*A7T*A7T*A7P*A'P*A'P* MA'L*@WL*@WL)@WH)@GH)@GH)@GH)@GD)@7D)@7D)@7@)@'@)@'@)@'@)?W<) M?W<)?W<)?G8)?G8)?G8)?74)?74)?74)?'4)?'0)?'0)?'0)>W,)>W,)>W,) M>G,)>G()>G()>7()>7$)>7$)>'$)>'`)>'`)=W`)=W`)=V\)=V\)=F\)=FX( M=FX(=6X(=6X(=6T(=&T(=&T(=&P(<VP(<VP(<VL(<FL(<FL(<FL(<6H(<6H( M<6H(<6D(<&D(<&D(<&@(;V@(;V@(;V@(;F<(;F<(;F<(;68(;68(;68(;&8( M;&4(;&4(;&4(:V0(:V0(:V0(:F,(:F,(:F,(:6,(;&87BX9)BXF%(R/&`@+6 M``#0``#$=W?:UM6]BX=#:F,095X(95\'95X'95X'9%X'9%X'9%T'8UT'8UT' M8UP'8EP'85L(8%H*7ED)7%8,240V)R6D-S_535[D.4?E#Q/A``'1``#```"S M``"B!`2-"0EX%!10'AXG)24E*2DI+BXN,C(R-S<W/#P\/#P\,C(R*"@H)"0D M("`@("`@("`@)"0>/CL244L'5U(&5U(&5U$&5E$&5E$&5E`&5E`&55`&54\& M54\&5$\&5$\&5$X&4TX&4TX&4TT&4DT&4DT&4DT&44P&44P&44P&4$L&4$L& M4$L&4$H&3TH&3TH&3TH&3DD%3DD%3DD%34@%34@%34@%3$@%3$<%3$<%2T<% M2T8%2T8%2T8%2D4%2D4%2D4%244%240%240%2$0%2$,%2$,%1T,%1T,%1T(% M1D(%1D(%1D$%14$%14$%14`%14`%1$`%1$`%1#\%0S\%0S\%0SX%0CX%0CX% M0CX%03T%03T$03T$0#P$0#P$0#P$0#L$/SL$/SL$/SL$/CH$/CH$/CH$/3D$ M/3D$/3D$/#D$/#@$/#@$.S@$.S<$.S<$.C<$.C8$.C8$.C8$.38$.34$.34$ M.#4$.#0$.#0$-S0$-S0$-S,$-C,$-C,$-C($-3($-3($-3$$-3$$-#$$-#$# M-#`#,S`#,S`#,R\#,B\#,B\#,B\#,2X#,2X#,2X#,"T#,"T#,"T#+RP#+RP# M+RP#+RP#+BL#+BL#+BL#+2H#+2H#+2H#+"H#+"D#+"D#*RD#*R@#*R@#*B@# M*B<#*B<#*B<#*2<#*28#*28#*"8#*"4#*"4#)R4#``"5C`N5C`N5BPN4BPN4 MBPN4B@N3B@N3B@N3B@N3B0N2B0N2B0N2B`N1B`N1B`N1APN0APJ0APJ0APJ/ MA@J/A@J/A@J.A0J.A0J.A0J-A0J-A`J-A`J-A`J,@PJ,@PJ,@PJ+@@J+@@J+ M@@J*@@J*@0J*@0J)@0J)@`J)@`J(@`J(?PJ(?PJ(?PJ'?PJ'?@J'?@J&?@J& M?0J&?0J%?0J%?0J%?`J$?`J$?`J$>PJ#>PJ#>PF#>@F">@F">@F">@F">0F! M>0F!>0F!>`F`>`F`>`F`>`E_=PE_=PE_=PE^=@E^=@E^=@E]=0E]=0E]=0E] M=0E\=`E\=`E\=`E[<PE[<PE[<PEZ<PEZ<@EZ<@EY<@EY<0EY<0EX<0EX<`EX M<`EW<`EW<`EW;PEW;PEV;PEV;@AV;@AU;@AU;@AU;0AT;0AT;0AT;`AS;`AS M;`AS:PAR:PAR:PAR:PAR:@AQ:@AQ:@AQ:0AP:0AP:0AP:0AO:`AO:`AO:`AN M9PAN9PAN9PAM9@AM9@AM9@AL9@AL90AL90AL90AK9`AK9`AK9`AJ9`AJ8PAJ M8PAI9!B=F6RPK\(S,\,'!\4,#,4L+,BCHK>@G&1_>B]K91!F7PEF7P=E7P=E M7P=E7@=D7@=D7@=D70=C70=C70=C7`=B7`=B7`=B7`=A6P=:5`LL*GPR.\9: M;]U'6>,8'N$"`],!`<$!`:X#`YL%!8\("(84%%HA(2HG)R<J*BHM+2TQ,3$V M-C8Z.CH[.SPN+C(A(2<@("4?'R,?'R(?'R(G)B$_/!E-2!)230Y43PQ640=7 M4096409640964`964`954`954`953P943P943P943@933@933@9330923092 M309230913`913`913`912P902P902P902P9/2@9/2@9/2@9.205.205.205- M2`5-2`5-2`5,2`5,1P5,1P5+1P5+1@5+1@5+1@5*1@5*105*105)105)1`5) M1`5(1`5(0P5(0P5'0P5'0P5'0@5&0@5&0@5&005&005%005%005%0`5$0`5$ M0`5$/P5#/P5#/P5#/@5"/@5"/@5"/@5!/05!/01!/01`/`1`/`1`/`1`.P0_ M.P0_.P0_.P0^.@0^.@0^.@0].00].00].00\.00\.`0\.`0[.`0[-P0[-P0[ M-P0Z-@0Z-@0Z-@0Y-@0Y-00Y-00X-00X-`0X-`0W-`0W-`0W,P0V,P0V,P0V M,@0U,@0U,@0U,00U,00T,00T,0,T,`,S,`,S,`,S+P,R+P,R+P,R+P,Q+@,Q M+@,Q+@,P+0,P+0,P+0,P+`,O+`,O+`,O+`,N*P,N*P,N*P,M*@,M*@,M*@,L M*@,L*0,L*0,K*0,K*`,K*`,J*`,J)P,J)P,J)P,I)P,I)@,I)@,H)@,H)0,H M)0,``):,"Y6,"Y6,"Y6+"Y2+"Y2+"Y2*"Y2*"Y.*"Y.*"Y.)"Y*)"Y*)"Y*( M"Y&("Y&("Y&'"Y"'"Y"'"I"'"H^&"H^&"H^&"HZ%"HZ%"HZ%"HZ%"HV$"HV$ M"HV$"HR#"HR#"HR#"HN""HN""HN""HJ""HJ!"HJ!"HF!"HF`"HF`"HF`"HB` M"HA_"HA_"H=_"H=^"H=^"H9^"H9]"H9]"H5]"H5]"H5\"H1\"H1\"H1["H-[ M"H-["8-["8-Z"8)Z"8)Z"8)Y"8%Y"8%Y"8%X"8!X"8!X"8!X"7]W"7]W"7]W M"7YV"7YV"7YV"7YV"7UU"7UU"7UU"7QT"7QT"7QT"7MS"7MS"7MS"7IS"7IR M"7IR"7ER"7EQ"7EQ"7AQ"7AQ"7AP"7AP"7=P"7=O"7=O"79O"79N"'9N"'5N M"'5N"'5M"'1M"'1M"'1L"'-L"'-L"'-L"'-K"')K"')K"')J"'%J"'%J"'%I M"'!I"'!I"'!I"&]H"&]H"&]H"&YG"&YG"&YG"&UG"&UF"&UF"&UF"&QE"&QE M"&QE"&MD"&MD"&MD"&ID"&IC"&ID%YR9;+R\SC\_Q!H:Q5=7U:RKR)&,4FMF M#VMD#6MD#6=A"69?!V9?!V5?!V5?!V5>!V1>!V1>!V1=!V-=!V-=!V-=!V)< M!V)<!V)<!UU7"$I(8#H_KT%/US-`XA@>X0,$UP4%N0L+DA04;AP<7",C2R@H M.RLK+RLK*RLK*RPL+"\O+S0T-#DY.34U/"$A20\/7@X.90T-9PT-9PT-9A,3 M92,A8C(P4D(^-$U('550"5=2!E=1!E=1!E91!E90!E90!E50!E50!E5/!E1/ M!E1/!E1.!E-.!E-.!E--!E)-!E)-!E)-!E),!E%,!E%,!E%+!E!+!E!+!E!+ M!D]*!D]*!D]*!DY)!4Y)!4Y)!4U(!4U(!4U(!4Q(!4Q'!4Q'!4Q'!4M&!4M& M!4M&!4I&!4I%!4I%!4E%!4E$!4E$!4A$!4A#!4A#!4=#!4=#!4="!4="!49" M!49!!49!!45!!45!!45`!41`!41`!40_!4,_!4,_!4,^!4(^!4(^!4(^!4$] M!4$]!$$]!$$\!$`\!$`\!$`\!#\[!#\[!#\[!#XZ!#XZ!#XZ!#TY!#TY!#TY M!#PY!#PX!#PX!#PX!#LW!#LW!#LW!#HW!#HV!#HV!#DV!#DU!#DU!#@U!#@T M!#@T!#<T!#<T!#<S!#8S!#8S!#8R!#8R!#4R!#4R!#4Q!#0Q!#0Q`S0P`S,P M`S,P`S,O`S(O`S(O`S(O`S$N`S$N`S$N`S$M`S`M`S`M`S`M`R\L`R\L`R\L M`RXK`RXK`RXK`RTJ`RTJ`RTJ`RPJ`RPI`RPI`RLI`RLH`RLH`RLH`RHH`RHG M`RHG`RDG`RDF`RDF`R@F`R@E`P``EHT+EHP+E8P+E8P+E8L+E(L+E(L+E(H+ ME(H+DXH+DXH+DXD+DHD+DHD+DH@+D8@+D8@+D8@+D(<+D(<*D(<*CX8*CX8* MCX8*CX4*CH4*CH4*CH4*C80*C80*C80*C(,*C(,*C(,*BX,*BX(*BX(*BH(* MBH$*BH$*B8$*B8`*B8`*B8`*B(`*B'\*B'\*AW\*AWX*AWX*AGX*AGX*AGT* MA7T*A7T*A7P*A'P*A'P*A'L*A'L*@WL*@WL)@WH)@GH)@GH)@GD)@7D)@7D) M@7D)@'@)@'@)@'@)?W<)?W<)?W<)?G8)?G8)?G8)?G8)?74)?74)?74)?'0) M?'0)?'0)>W0)>W,)>W,)>G,)>G()>G()>7()>7$)>7$)>7$)>'$)>'`)>'`) M=W`)=V\)=V\)=F\)=F\)=FX(=6X(=6X(=6T(=&T(=&T(=&P(<VP(<VP(<VP( M<VL(<FL(<FL(<FH(<6H(<6H(<6H(<&D(<&D(<&D(;V@(;V@(;V@(;F<(;F<( M;F<(;F<(;68(;68(;68(;&4(;&4(;&4(:V0(:V0(:V0(:F0(;6@?G9ILOKW* M0T/%.SO.S,SRQ<.C?7<N:&$'9V$'9V`'9V`'9F`'9E\'9E\'95\'95\'95X' M9%X'9%X'9%T'8UT'8UT'8UT'8UP'8EP'7%<,:&5)3T^2(2;.%AO@#A'@`@+< M#@Z@(B)6+2TU+R\Q,#`P+R\P+R\P+BXN+"PL+2TM+R\O,C(R-#0T)B9+"PN# M``"A``"E``"G``"G``"E``"D`P.L$A&6+RQ>1D(K54\*6%(&5U(&5U$&5U$& M5E$&5E`&5E`&55`&55`&54\&5$\&5$\&5$X&4TX&4TX&4TX&4DT&4DT&4DT& M4DP&44P&44P&44L&4$L&4$L&4$L&3TH&3TH&3TH&3DD%3DD%3DD%34D%34@% M34@%34@%3$<%3$<%3$<%2T8%2T8%2T8%2D8%2D4%2D4%244%240%240%2$0% M2$0%2$,%1T,%1T,%1T(%1T(%1D(%1D$%1D$%14$%14$%14`%1$`%1$`%1#\% M0S\%0S\%0S\%0CX%0CX%0CX%0CT%03T$03T$03P$0#P$0#P$0#P$/SL$/SL$ M/SL$/CH$/CH$/CH$/3H$/3D$/3D$/#D$/#@$/#@$/#@$.S<$.S<$.S<$.C<$ M.C8$.C8$.38$.34$.34$.#4$.#4$.#0$-S0$-S0$-S,$-S,$-C,$-C($-C($ M-3($-3($-3$$-#$$-#$#-#`#,S`#,S`#,S`#,B\#,B\#,B\#,2X#,2X#,2X# M,2T#,"T#,"T#,"T#+RP#+RP#+RP#+BL#+BL#+BL#+2L#+2H#+2H#+"H#+"D# M+"D#+"D#*R@#*R@#*R@#*B@#*B<#*B<#*2<#*28#*28#*"8#``"6C0N6C0N6 MC`N5C`N5C`N5BPN5BPN4BPN4BPN4B@N3B@N3B@N3B0N2B0N2B0N2B`N1B`N1 MB`N1B`N0APN0APJ0APJ0A@J/A@J/A@J/A@J.A0J.A0J.A0J-A`J-A`J-A`J, M@PJ,@PJ,@PJ+@PJ+@@J+@@J*@@J*@0J*@0J*@0J)@0J)@`J)@`J(@`J(?PJ( M?PJ'?PJ'?@J'?@J&?@J&?@J&?0J%?0J%?0J%?`J%?`J$?`J$>PJ$>PJ#>PJ# M>PF#>@F">@F">@F">0F!>0F!>0F!>0F`>`F`>`F`>`E_=PE_=PE_=PE_=@E^ M=@E^=@E^=@E]=0E]=0E]=0E\=`E\=`E\=`E[=`E[<PE[<PEZ<PEZ<@EZ<@EZ M<@EY<0EY<0EY<0EX<0EX<`EX<`EW<`EW;PEW;PEV;PEV;PEV;@AU;@AU;@AU M;0AT;0AT;0AT;`AT;`AS;`AS;`AS:PAR:PAR:PAR:@AQ:@AQ:@AQ:@AP:0AP M:0AP:0AO:`AO:`AO:`AO9PAN9PAN9PAN9PAM9@AM9@AM9@AL90AL90AK90EL M9Q!U;R21C5.BGW:SL9C&QLJ-C=BNKNOY^?V^NY-^>3!H80=H80=G80=G8`=G M8`=F8`=F8`=F7P=E7P=E7P=E7@=D7@=D7@=D70=C70=B7`AA7`EG81%X=3!V M=55I:7M*2J4P,+\H*,0A(<@H*'XO+S<P,#`P,#`P,#`P,#`O+S`O+S`N+C`M M+30K*SHH*$,C(TT0$'\"`J<``+,``+0``+0``+0``+(``*\``+<&!K4>'(0^ M.C]230]43@E64`A74@9740974096409640964`954`954`953P943P943P94 M3@933@933@933@933092309230923`913`913`913`902P902P902P9/2@9/ M2@9/2@9.205.205.205.205-2`5-2`5-2`5,1P5,1P5,1P5+1P5+1@5+1@5* M1@5*105*105)105)1`5)1`5(1`5(1`5(0P5(0P5'0P5'0@5'0@5&0@5&0@5& M005%005%005%0`5$0`5$0`5$/P5#/P5#/P5#/P5#/@5"/@5"/@5"/05!/01! M/01!/01`/`1`/`1`/`0_.P0_.P0_.P0^.@0^.@0^.@0].@0].00].00].00\ M.`0\.`0\.`0[-P0[-P0[-P0Z-P0Z-@0Z-@0Y-@0Y-00Y-00X-00X-00X-`0X M-`0W-`0W,P0W,P0V,P0V,@0V,@0U,@0U,@0U,00T,00T,0,T,`,S,`,S,`,S M,`,R+P,R+P,R+P,R+@,Q+@,Q+@,Q+0,P+0,P+0,P+0,O+`,O+`,O+`,N*P,N M*P,N*P,M*P,M*@,M*@,M*@,L*0,L*0,L*0,K*`,K*`,K*`,J*`,J)P,J)P,I M)P,I)@,I)@,``)>-"Y:-"Y:-"Y:,"Y:,"Y6,"Y6+"Y6+"Y2+"Y2+"Y2*"Y.* M"Y.*"Y.)"Y*)"Y*)"Y*("Y&("Y&("Y&("Y"'"Y"'"I"'"I"&"H^&"H^&"H^& M"HZ%"HZ%"HZ%"HV$"HV$"HV$"HR#"HR#"HR#"HN#"HN""HN""HN""HJ!"HJ! M"HJ!"HF!"HF`"HF`"HB`"HA_"HA_"H=_"H=^"H=^"H9^"H9^"H9]"H5]"H5] M"H5\"H5\"H1\"H1\"H1["H-["H-["8-Z"8)Z"8)Z"8)Y"8%Y"8%Y"8%Y"8!X M"8!X"8!X"8!W"7]W"7]W"7]W"7YV"7YV"7YV"7UU"7UU"7UU"7QT"7QT"7QT M"7MT"7MS"7MS"7IS"7IR"7IR"7IR"7ER"7EQ"7EQ"7AQ"7AP"7AP"7=P"7=O M"7=O"79O"79O"79N"'5N"'5N"'5M"'5M"'1M"'1M"'1L"'-L"'-L"'-K"')K M"')K"')J"'%J"'%J"'%J"'!I"'!I"'!I"&]H"&]H"&]H"&]H"&YG"&YG"&YG M"&UF"&UF"&UF"&QE"&ME"G]Y+IR9:;:TG,'`M,K*Q=+2TN[N\?;U\-W<QZZJ M>8J$/69@"VAA!VAA!V=A!V=@!V=@!V9@!V9@!V9?!V5?!V5?!V5>!V1>!V1> M!V1>!V5?"6YI%'QY*H*!3GI[9WM[<I&1=9N;>)*2?(:&@EE99C,S-C`P,#`P M,#`P,#`P,#`P,"\O,"LK.AP<70T-@`@(C`8&E`,#J@``N0``O```N@``N0`` MN```M0``L@``N```QP\.KBPI;T(^.TQ')51."EA2!E=2!E=1!E=1!E91!E91 M!E90!E50!E50!E5/!E1/!E1/!E1/!E1.!E-.!E-.!E--!E)-!E)-!E),!E%, M!E%,!E%,!E!+!E!+!E!+!D]*!D]*!D]*!DY)!4Y)!4Y)!4Y)!4U(!4U(!4U( M!4Q'!4Q'!4Q'!4M'!4M&!4M&!4I&!4I%!4I%!4E%!4E$!4E$!4E$!4A$!4A# M!4A#!4=#!4="!4="!49"!49"!49!!45!!45!!45`!41`!41`!40_!4,_!4,_ M!4,_!4,^!4(^!4(^!4(]!4$]!$$]!$$]!$`\!$`\!$`\!#\[!#\[!#\[!#XZ M!#XZ!#XZ!#XZ!#TY!#TY!#TY!#PX!#PX!#PX!#LX!#LW!#LW!#HW!#HV!#HV M!#DV!#DU!#DU!#@U!#@U!#@T!#@T!#<T!#<S!#<S!#8S!#8S!#8R!#4R!#4R M!#4Q!#0Q!#0Q`S0P`S,P`S,P`S,P`S,O`S(O`S(O`S(N`S$N`S$N`S$N`S`M M`S`M`S`M`R\L`R\L`R\L`RXK`RXK`RXK`RTK`RTJ`RTJ`RTJ`RPI`RPI`RPI M`RLI`RLH`RLH`RHH`RHG`RHG`RDG`RDF`P``EXX+EXT+EXT+EHT+EHP+EHP+ ME8P+E8L+E8L+E(L+E(L+E(H+DXH+DXH+DXD+DHD+DHD+DHD+D8@+D8@+D8@+ MD8<+D(<*D(<*D(8*CX8*CX8*CX8*CH4*CH4*CH4*C80*C80*C80*C(0*C(,* MC(,*C(,*BX(*BX(*BX(*BH$*BH$*BH$*B8$*B8`*B8`*B(`*B'\*B'\*AW\* MAW\*AWX*AGX*AGX*AGT*AGT*A7T*A7P*A7P*A'P*A'P*A'L*@WL*@WL)@WH) M@GH)@GH)@GH)@7D)@7D)@7D)@7@)@'@)@'@)@'<)?W<)?W<)?W<)?G8)?G8) M?G8)?74)?74)?74)?'4)?'0)?'0)>W0)>W,)>W,)>W,)>G()>G()>G()>7() M>7$)>7$)>'$)>'`)>'`)=W`)=W`)=V\)=F\)=F\)=FX(=FX(=6X(=6T(=6T( M=&T(=&T(=&P(<VP(<VP(<VL(<FL(<FL(<FL(<6H(<6H(<6H(<&D(<&D(<&D( M<&@(;V@(;V@(;V@(;F<(;F<(;F<(;68(;&4(:V0):60+C(=*N+:BR<C"T-#0 MT-#0U=75]_?WU-*WI*!IEI%2B80];&84:&(':&$':&$'9V$'9V`'9V`'9F`' M9F`'9E\'95\'95\'95X'9%T'8UT'9%X*>G8BAX9'>WUF?GYRD9%UFYMWG)QX MEY=YDI)Y?X9O1DM$+S$T+R\P,#`P,#`P+R\P+2TU'1U<"`B-``"B``"K``"R M``"[``#!``#!``"^``"\``"[``"Z``"Y``"^``#3!076%!*W)B.-/SM+5$\( M5E`'5U$(5E$'5U$&5U$&5E$&5E$&5E`&55`&55`&54\&54\&5$\&5$\&5$X& M4TX&4TX&4TT&4DT&4DT&4DP&44P&44P&44P&4$L&4$L&4$L&3TH&3TH&3TH& M3TH&3DD%3DD%3DD%34@%34@%34@%3$<%3$<%3$<%2T<%2T8%2T8%2D8%2D4% M2D4%2D4%244%240%240%2$0%2$,%2$,%1T,%1T(%1T(%1D(%1D(%1D$%14$% M14$%14`%1$`%1$`%1$`%1#\%0S\%0S\%0SX%0CX%0CX%0CT%03T%03T$03T$ M0#P$0#P$0#P$/SL$/SL$/SL$/SL$/CH$/CH$/CH$/3D$/3D$/3D$/#@$/#@$ M/#@$.S@$.S<$.S<$.C<$.C8$.C8$.38$.38$.34$.34$.#4$.#0$.#0$-S0$ M-S,$-S,$-C,$-C,$-C($-3($-3($-3$$-#$$-#$#-#$#-#`#,S`#,S`#,R\# M,B\#,B\#,BX#,2X#,2X#,2X#,"T#,"T#,"T#+RP#+RP#+RP#+BP#+BL#+BL# M+BL#+2H#+2H#+2H#+"D#+"D#+"D#*RD#*R@#*R@#*B@#*B<#*B<#*2<#``"7 MC@N7C@N7C0N7C0N6C0N6C`N6C`N5C`N5C`N5BPN4BPN4BPN4B@N3B@N3B@N3 MB0N2B0N2B0N2B0N2B`N1B`N1B`N1APN0APJ0APJ0APJ/A@J/A@J/A@J.A0J. MA0J.A0J-A`J-A`J-A`J,A`J,@PJ,@PJ,@PJ+@@J+@@J+@@J*@@J*@0J*@0J) M@0J)@`J)@`J(@`J(?PJ(?PJ'?PJ'?PJ'?@J'?@J&?@J&?0J&?0J%?0J%?0J% M?`J$?`J$?`J$>PJ#>PJ#>PF#>@F">@F">@F">@F!>0F!>0F!>0F!>`F`>`F` M>`F`=PE_=PE_=PE_=PE^=@E^=@E^=@E]=0E]=0E]=0E\=0E\=`E\=`E\=`E[ M<PE[<PE[<PEZ<@EZ<@EZ<@EY<@EY<0EY<0EX<0EX<`EX<`EW<`EW<`EW;PEV M;PEV;PEV;@AV;@AU;@AU;0AU;0AT;0AT;0AT;`AS;`AS;`AS:PAR:PAR:PAR M:PAQ:@AQ:@AQ:@AQ:0AP:0AP:0AP:`AO:`AO:`AO:`AN9PAN9PAN9PAK9`ID M719>6"&1CG#+R\G0T-#0T-#0T-#>WM[R\>W!OIB*A3Z&@#:!>R]N:!1I8@=H M8@=H80=H80=G80=G80=G8`=F8`=F8`=F7P=F7P=D7@=E7@IH80UK9Q5]@$)^ MA&E^@'.1D76<G'>?GW><G'>7EW>-C7B#AGUB@'DV4%TI,$TF*$@C(TT>'E@7 M%VH*"H@#`YD``*4``*\``+8``+X``,4``,<``,4``,0``,,``,4``,<#!,\4 M&>,A)^X?(NTA(=$R,'Q$/S)*1B102Q=53PM74@974@974096409640964`95 M4`954`953P953P943P943P943@933@933@9330923092309230913`913`91 M3`902P902P902P902@9/2@9/2@9/2@9.205.205.205-2`5-2`5-2`5,2`5, M1P5,1P5+1P5+1@5+1@5*1@5*105*105*105)105)1`5)1`5(1`5(0P5(0P5' M0P5'0P5'0@5&0@5&0@5&005%005%005%0`5%0`5$0`5$0`5$/P5#/P5#/P5# M/@5"/@5"/@5"/@5!/05!/01!/01`/`1`/`1`/`0_.P0_.P0_.P0_.P0^.@0^ M.@0^.@0].00].00].00\.00\.`0\.`0[.`0[-P0[-P0Z-P0Z-@0Z-@0Z-@0Y M-@0Y-00Y-00X-00X-`0X-`0W-`0W,P0W,P0V,P0V,P0V,@0U,@0U,@0U,00T M,00T,00T,0,T,`,S,`,S,`,S+P,R+P,R+P,R+@,Q+@,Q+@,Q+@,P+0,P+0,P M+0,O+`,O+`,O+`,O+`,N*P,N*P,N*P,M*@,M*@,M*@,L*0,L*0,L*0,K*0,K M*`,K*`,J*`,J)P,J)P,``)B."YB."Y>."Y>-"Y>-"Y:-"Y:,"Y:,"Y6,"Y6, M"Y6+"Y2+"Y2+"Y2*"Y.*"Y.*"Y.)"Y.)"Y*)"Y*)"Y*("Y&("Y&("Y&'"Y"' M"I"'"I"'"H^&"H^&"H^&"HZ%"HZ%"HZ%"HV$"HV$"HV$"HV$"HR#"HR#"HR# M"HN""HN""HN""HJ""HJ!"HJ!"HF!"HF`"HF`"HB`"HA_"HA_"HA_"H=_"H=^ M"H=^"H9^"H9]"H9]"H5]"H5]"H5\"H1\"H1\"H1["H-["H-["8-Z"8)Z"8)Z M"8)Z"8)Y"8%Y"8%Y"8%X"8!X"8!X"8!X"7]W"7]W"7]W"7YV"7YV"7YV"7UU M"7UU"7UU"7UU"7QT"7QT"7QT"7MS"7MS"7MS"7IS"7IR"7IR"7ER"7EQ"7EQ M"7AQ"7AP"7AP"7=P"7=P"7=O"7=O"79O"79N"'9N"'5N"'5N"'5M"'1M"'1M M"'1L"'-L"'-L"'-K"')K"')K"')K"')J"'%J"'%J"'%I"'!I"'!I"'!I"&]H M"&]H"&]H"&YG"&YG"&UF"EU7(SLW77=UG<K*S-#0T-#0T-+2TNGIZ>SKX+VZ MDGIU+6]H%&]H$FID"VEB"&EB!VAB!VAA!VAA!V=A!V=A!V=@!V=@!V9@!V9? M!V9?!V%<"V]K&W!Q.4%9@$YEDY.5>)V==Y^?=YZ>=YR<=Y:6=HV-=(*"<FN, MATB*F",^C@\3C`H)D08&G`$!IP$!HP$!G0``H@``KP``OP``RP``TP``V``` MUP``UP``UP``VP``X!8;Y4Q?YVI_XV1MV%97R3$PM1<5D38R4$E%)5%,#EA2 M!E=2!E=2!E=1!E91!E91!E90!E90!E50!E50!E5/!E1/!E1/!E1.!E-.!E-. M!E--!E)-!E)-!E)-!E%,!E%,!E%,!E%+!E!+!E!+!E!*!D]*!D]*!D]*!DY) M!4Y)!4Y)!4U(!4U(!4U(!4Q(!4Q'!4Q'!4M'!4M&!4M&!4M&!4I%!4I%!4I% M!4E%!4E$!4E$!4A$!4A#!4A#!4=#!4=#!4="!49"!49"!49!!49!!45!!45` M!45`!41`!41`!40_!4,_!4,_!4,^!4(^!4(^!4(^!4$]!4$]!$$]!$`\!$`\ M!$`\!$`[!#\[!#\[!#\[!#XZ!#XZ!#XZ!#TY!#TY!#TY!#PY!#PX!#PX!#LX M!#LW!#LW!#LW!#HV!#HV!#HV!#DV!#DU!#DU!#@U!#@T!#@T!#<T!#<T!#<S M!#8S!#8S!#8R!#4R!#4R!#4Q!#4Q!#0Q!#0Q`S0P`S,P`S,P`S,O`S(O`S(O M`S(O`S$N`S$N`S$N`S`M`S`M`S`M`S`L`R\L`R\L`R\L`RXK`RXK`RXK`RTJ M`RTJ`RTJ`RPJ`RPI`RPI`RLI`RLH`RLH`RHH`RHG`P``F(\+F(X+F(X+EXX+ MEXT+EXT+EHT+EHP+EHP+E8P+E8P+E8L+E(L+E(L+E(H+DXH+DXH+DXH+DXD+ MDHD+DHD+DH@+D8@+D8@+D8<+D(<+D(<*D(<*CX8*CX8*CX8*CH4*CH4*CH4* MCH4*C80*C80*C80*C(,*C(,*C(,*BX(*BX(*BX(*BH(*BH$*BH$*B8$*B8`* MB8`*B(`*B(`*B'\*B'\*AW\*AWX*AWX*AGX*AGT*AGT*A7T*A7T*A7P*A'P* MA'P*A'L*@WL*@WL)@WL)@WH)@GH)@GH)@GD)@7D)@7D)@7@)@'@)@'@)@'@) M?W<)?W<)?W<)?G8)?G8)?G8)?78)?74)?74)?74)?'0)?'0)?'0)>W,)>W,) M>W,)>G,)>G()>G()>7()>7$)>7$)>'$)>'$)>'`)>'`)=W`)=V\)=V\)=F\) M=FX(=FX(=6X(=6X(=6T(=&T(=&T(=&P(<VP(<VP(<VP(<FL(<FL(<FL(<FH( M<6H(<6H(<6D(<&D(<&D(<&D(;V@(;V@(;V@(;F<(;68)85L=*"9]8%_`R\O/ MTM+2U=75W]_?]/3TZ>C;PK^9<FTD:F0(:F,(:F,(:6,(:6((:6(':&(':&(' M:&$'9V$'9V$'9V`'9V`'9F`'9E\'7UD*<W`L9&U?'$&D.%BFGIYXH*!XGY]W MGIYWG)QWEI9VBHIQ@(%H:(V"29.C/EQM.3Q6)2-Z$1"F``#(``"_``"R`0&L M!0:[#1#7$!+B$!'H#P_L#A#L#Q/M$13M$Q7M&!GL,SKG2US;45RY6EM_6%12 M3$A%.39.0#L[2T8B4DX-6%(&6%(&5U(&5U(&5U$&5U$&5E$&5E`&5E`&55`& M55`&54\&5$\&5$\&5$X&4TX&4TX&4TT&4DT&4DT&4DT&44P&44P&44P&44L& M4$L&4$L&4$L&3TH&3TH&3TH&3DD%3DD%3DD%34@%34@%34@%3$@%3$<%3$<% M3$<%2T8%2T8%2T8%2D8%2D4%2D4%244%240%240%2$0%2$,%2$,%1T,%1T,% M1T(%1D(%1D(%1D$%1D$%14$%14$%14`%1$`%1$`%1#\%0S\%0S\%0SX%0CX% M0CX%0CX%03T%03T$03T$03P$0#P$0#P$0#P$/SL$/SL$/SL$/CH$/CH$/CH$ M/3D$/3D$/3D$/#D$/#@$/#@$.S@$.S<$.S<$.S<$.C<$.C8$.C8$.38$.34$ M.34$.#4$.#0$.#0$-S0$-S0$-S,$-C,$-C,$-C($-C($-3($-3($-3$$-#$$ M-#$#-#`#,S`#,S`#,R\#,B\#,B\#,B\#,2X#,2X#,2X#,"T#,"T#,"T#,"T# M+RP#+RP#+RP#+BL#+BL#+BL#+2H#+2H#+2H#+"H#+"D#+"D#*RD#*R@#*R@# M*R@#``"9CPN8CPN8C@N8C@N7C@N7C0N7C0N6C0N6C0N6C`N5C`N5C`N5BPN4 MBPN4BPN4B@N4B@N3B@N3B@N3B0N2B0N2B0N2B`N1B`N1B`N1B`N0APN0APJ0 MAPJ/A@J/A@J/A@J/A0J.A0J.A0J.A0J-A`J-A`J-A`J,@PJ,@PJ,@PJ+@PJ+ M@@J+@@J*@@J*@0J*@0J)@0J)@`J)@`J)@`J(@`J(?PJ(?PJ'?PJ'?@J'?@J& M?@J&?@J&?0J%?0J%?0J%?`J$?`J$?`J$>PJ$>PJ#>PJ#>PF#>@F">@F">@F" M>0F!>0F!>0F!>0F`>`F`>`F`>`E_=PE_=PE_=PE^=@E^=@E^=@E^=@E]=0E] M=0E]=0E\=`E\=`E\=`E[<PE[<PE[<PEZ<PEZ<@EZ<@EY<@EY<0EY<0EY<0EX M<0EX<`EX<`EW<`EW;PEW;PEV;PEV;@AV;@AU;@AU;@AU;0AT;0AT;0AT;`AS M;`AS;`AS;`AS:PAR:PAR:PAR:@AQ:@AQ:@AQ:0AP:0AP:0AP:0AO:`AO:`AO M:`AM9@EE7Q8J)WI34\;+R]+=W=WHZ.CU]?7[^_OKZMW+R*A\=S)K9`AJ9`AJ M8PAJ8PAI8PAI8@AI8@=H8@=H8@=H80=H80=G80=G8`=G8`=F8`=>6`IR<#U1 M87D2.[`[6:6>GGB@H'B@H'B?GW>=G7:5E7"(B&9YA&5>D8I$E:=6<D-45RT[ M-ULA'Y8&!M(``-H``-<``=@F,-U?=N)C<^)@9^)=8.)C;^-H?>5F>>5>:>19 M6N%!0]8>(,$D(7=,1R584PA:5`9:5`9640=33@Q64`E84P984P984@984@97 M4@974097409640964`964`954`954`953P943P943P943@933@933@933@92 M3092309230923`913`913`912P902P902P902P9/2@9/2@9/2@9.205.205. M205-205-2`5-2`5-2`5,1P5,1P5,1P5+1@5+1@5+1@5*1@5*105*105)105) M1`5)1`5(1`5(1`5(0P5'0P5'0P5'0@5'0@5&0@5&005&005%005%005%0`5$ M0`5$0`5$/P5#/P5#/P5#/P5"/@5"/@5"/@5"/05!/01!/01!/`1`/`1`/`1` M/`0_.P0_.P0_.P0^.@0^.@0^.@0].@0].00].00\.00\.`0\.`0\.`0[-P0[ M-P0[-P0Z-P0Z-@0Z-@0Y-@0Y-00Y-00X-00X-00X-`0W-`0W-`0W,P0W,P0V M,P0V,@0V,@0U,@0U,@0U,00T,00T,0,T,`,S,`,S,`,S+P,R+P,R+P,R+P,Q M+@,Q+@,Q+@,Q+0,P+0,P+0,P+0,O+`,O+`,O+`,N*P,N*P,N*P,M*@,M*@,M M*@,L*@,L*0,L*0,L*0,K*`,K*`,``)F/"YF/"YB/"YB."YB."Y>."Y>-"Y>- M"Y:-"Y:-"Y:,"Y6,"Y6,"Y6+"Y6+"Y2+"Y2*"Y2*"Y.*"Y.*"Y.)"Y*)"Y*) M"Y*("Y&("Y&("Y&("Y"'"Y"'"I"'"H^&"H^&"H^&"H^%"HZ%"HZ%"HZ%"HV$ M"HV$"HV$"HR#"HR#"HR#"HN#"HN""HN""HJ""HJ!"HJ!"HJ!"HF`"HF`"HF` M"HB`"HA_"HA_"H=_"H=^"H=^"H9^"H9^"H9]"H5]"H5]"H5\"H1\"H1\"H1[ M"H1["H-["H-["8-Z"8)Z"8)Z"8)Y"8%Y"8%Y"8%Y"8!X"8!X"8!X"7]W"7]W M"7]W"7]V"7YV"7YV"7YV"7UU"7UU"7UU"7QT"7QT"7QT"7MT"7MS"7MS"7IS M"7IR"7IR"7ER"7EQ"7EQ"7EQ"7AQ"7AP"7AP"7=P"7=O"7=O"79O"79O"79N M"'5N"'5N"'5M"'1M"'1M"'1L"'1L"'-L"'-L"'-K"')K"')K"')J"'%J"'%J M"'%J"'!I"'!I"'!I"&]H"&]H"6YG"F5?%RHG>DU-QLS,U.OKZ_S\^_3S[.7D MT]?5O,+`F8%\-VMD"&MD"&ID"&IC"&IC"&EC"&EB"&EB"&EB!VAB!VAA!VAA M!V=A!V=@!V=@!U]:"6YL2T=9B0TXMD=BGY^?>)Z>=Z"@>*"@>)V==)24:(>' M5'*'8%"9H$N2DEMN-E=7)$E%/3@T9"DG@B(@E"8CCRHHB4M/?FUX<6MQ;&AI M:6=E9VEL:&QT:FQU;6MO=69D>T],=3DV8$,_-U1/%%I4!UI5!EI4!EI4!EE4 M!EE3!EE3!EA3!EA3!EA2!EA2!E=2!E=1!E=1!E91!E91!E90!E50!E50!E5/ M!E1/!E1/!E1.!E-.!E-.!E-.!E--!E)-!E)-!E),!E%,!E%,!E%,!E!+!E!+ M!E!+!D]*!D]*!D]*!DY)!4Y)!4Y)!4U)!4U(!4U(!4U(!4Q'!4Q'!4Q'!4M& M!4M&!4M&!4I&!4I%!4I%!4E%!4E$!4E$!4A$!4A$!4A#!4A#!4=#!4="!4=" M!49"!49!!49!!45!!45!!45`!41`!41`!40_!4,_!4,_!4,_!4(^!4(^!4(^ M!4(]!4$]!$$]!$$\!$`\!$`\!$`\!#\[!#\[!#\[!#XZ!#XZ!#XZ!#TZ!#TY M!#TY!#TY!#PX!#PX!#PX!#LW!#LW!#LW!#HW!#HV!#HV!#DV!#DU!#DU!#@U M!#@U!#@T!#<T!#<T!#<S!#<S!#8S!#8R!#8R!#4R!#4R!#4Q!#0Q!#0Q`S0P M`S,P`S,P`S,P`S(O`S(O`S(O`S(N`S$N`S$N`S$M`S`M`S`M`S`M`R\L`R\L M`R\L`RXK`RXK`RXK`RTK`RTJ`RTJ`RPJ`RPI`RPI`RPI`RLH`P``F9`+F8\+ MF8\+F(\+F(X+F(X+EXX+EXT+EXT+EHT+EHT+EHP+EHP+E8P+E8L+E8L+E(L+ ME(L+E(H+DXH+DXH+DXD+DHD+DHD+DH@+D8@+D8@+D8@+D(<+D(<*D(<*D(8* MCX8*CX8*CX8*CH4*CH4*CH4*C80*C80*C80*C(,*C(,*C(,*BX,*BX(*BX(* MBX(*BH$*BH$*BH$*B8$*B8`*B8`*B(`*B'\*B'\*AW\*AWX*AWX*AGX*AGX* MAGT*A7T*A7T*A7P*A7P*A'P*A'P*A'L*@WL*@WL)@WH)@GH)@GH)@GD)@7D) M@7D)@7D)@'@)@'@)@'@)@'<)?W<)?W<)?W<)?G8)?G8)?G8)?74)?74)?74) M?'0)?'0)?'0)>W0)>W,)>W,)>G,)>G()>G()>G()>7()>7$)>7$)>'$)>'`) M>'`)=W`)=V\)=V\)=F\)=F\)=FX(=6X(=6X(=6T(=6T(=&T(=&T(=&P(<VP( M<VP(<VL(<FL(<FL(<FH(<6H(<6H(<6H(<&D(:&(185L>7E@E650L2$-)&AB5 M4%#&S<W5[^_O]?3NUM2ZPK^8M;&"H9UA>W4F:V4(:V0(:V0(:F0(:F,(:F,( M:F,(:6,(:6((:6(':&(':&$':&$'9V$'9V`'8%L*8X%R5'JA1&*B=(&,GIYX MF)AWFIIWFYMWE9=RAX]J<XIG6Y>22ZG"4I*)7FPM6U@;5$\E2T8Y1$!(1T)! M3THE55`4650,6U8+6U8,6U0,6E0,6E4,6E4-650-650-65,.5E$.5$\.5E`- M6%,+6E0'6U4&6E4&6E0&6E0&650&65,&65,&65,&6%,&6%(&6%(&5U(&5U$& M5U$&5E$&5E$&5E`&55`&55`&54\&5$\&5$\&5$X&5$X&4TX&4TX&4TT&4DT& M4DT&4DP&44P&44P&44P&4$L&4$L&4$L&3TH&3TH&3TH&3DD%3DD%3DD%3DD% M34@%34@%34@%3$<%3$<%3$<%2T<%2T8%2T8%2D8%2D4%2D4%244%240%240% M240%2$0%2$,%2$,%1T,%1T(%1T(%1D(%1D(%1D$%14$%14$%14`%1$`%1$`% M1#\%0S\%0S\%0S\%0SX%0CX%0CX%0CT%03T$03T$03T$0#P$0#P$0#P$/SL$ M/SL$/SL$/CH$/CH$/CH$/CH$/3D$/3D$/3D$/#@$/#@$/#@$.S@$.S<$.S<$ M.C<$.C8$.C8$.38$.34$.34$.#4$.#4$.#0$.#0$-S0$-S,$-S,$-C,$-C,$ M-C($-3($-3($-3$$-#$$-#$#-#`#,S`#,S`#,S`#,R\#,B\#,B\#,BX#,2X# M,2X#,2X#,"T#,"T#,"T#+RP#+RP#+RP#+BL#+BL#+BL#+2L#+2H#+2H#+2H# M+"D#+"D#+"D#``":D`N9D`N9CPN9CPN8CPN8C@N8C@N7C@N7C@N7C0N6C0N6 MC0N6C`N6C`N5C`N5BPN5BPN4BPN4BPN4B@N3B@N3B@N3B0N2B0N2B0N2B0N1 MB`N1B`N1B`N1APN0APJ0APJ0A@J/A@J/A@J/A@J.A0J.A0J.A0J-A`J-A`J- MA`J,A`J,@PJ,@PJ+@PJ+@@J+@@J+@@J*@0J*@0J*@0J)@0J)@`J)@`J(@`J( M?PJ(?PJ'?PJ'?PJ'?@J&?@J&?@J&?0J&?0J%?0J%?`J%?`J$?`J$?`J$>PJ# M>PJ#>PF#>@F">@F">@F">@F!>0F!>0F!>0F`>`F`>`F`>`F`=PE_=PE_=PE_ M=PE^=@E^=@E^=@E]=0E]=0E]=0E\=0E\=`E\=`E[=`E[<PE[<PE[<PEZ<@EZ M<@EZ<@EY<@EY<0EY<0EX<0EX<`EX<`EW<`EW;PEW;PEV;PEV;PEV;@AU;@AU M;@AU;0AU;0AT;0AT;0AT;`AS;`AS;`AS:PAR:PAR:PAR:@AQ:@AQ:@AQ:@AD M71574C!02SU"/E,I)GP*":]@8,?1T=?Q\?'HY]C!OI6HI&R/BD1X<B%N:!!L M90AK90AK9`AK9`AJ9`AJ8PAJ8PAJ8PAI8PAI8@AI8@=H8@=H80=H80=G80=> M7`Y7GIMBKL6`E8^/EX*;G'F7EW:5E7:0D'6"B79IBX-/F*))J\A-MMA6EHI> M;C%>6P]=5@U84Q)641-;50M@6@=@6@=@6@=?60=?60=?60=?60=>6`=>6`=> M6`==5P==5P==5P=<5@=<5@=;50=;5@9;509;509:509:5`9:5`9:5`995`99 M4P994P984P984@984@974@9740974096409640964`954`954`953P943P94 M3P943P943@933@933@933092309230923`913`913`913`902P902P902P9/ M2@9/2@9/2@9/2@9.205.205.205-2`5-2`5-2`5,1P5,1P5,1P5+1P5+1@5+ M1@5*1@5*105*105)105)105)1`5)1`5(1`5(0P5(0P5'0P5'0@5'0@5&0@5& M0@5&005%005%005%0`5$0`5$0`5$0`5$/P5#/P5#/P5#/@5"/@5"/@5"/05! M/01!/01!/01`/`1`/`1`/`0_.P0_.P0_.P0^.P0^.@0^.@0^.@0].00].00] M.00\.`0\.`0\.`0[.`0[-P0[-P0Z-P0Z-@0Z-@0Y-@0Y-@0Y-00Y-00X-00X M-`0X-`0W-`0W,P0W,P0V,P0V,P0V,@0U,@0U,@0U,00T,00T,0,T,0,S,`,S M,`,S,`,S+P,R+P,R+P,R+@,Q+@,Q+@,Q+@,P+0,P+0,P+0,O+`,O+`,O+`,N M*P,N*P,N*P,N*P,M*@,M*@,M*@,L*0,L*0,``)J0"YJ0"YF0"YF/"YF/"YB/ M"YB."YB."Y>."Y>."Y>-"Y>-"Y:-"Y:,"Y:,"Y6,"Y6,"Y6+"Y2+"Y2+"Y2* M"Y.*"Y.*"Y.)"Y*)"Y*)"Y*)"Y*("Y&("Y&("Y&'"Y"'"I"'"I"&"H^&"H^& M"H^&"HZ%"HZ%"HZ%"HV$"HV$"HV$"HR$"HR#"HR#"HR#"HN""HN""HN""HJ! M"HJ!"HJ!"HF!"HF`"HF`"HB`"HA_"HA_"H=_"H=_"H=^"H=^"H9^"H9]"H9] M"H5]"H5\"H5\"H1\"H1\"H1["H-["H-["8-Z"8)Z"8)Z"8)Z"8%Y"8%Y"8%Y M"8%X"8!X"8!X"8!W"7]W"7]W"7]W"7YV"7YV"7YV"7UU"7UU"7UU"7QU"7QT M"7QT"7QT"7MS"7MS"7MS"7IR"7IR"7IR"7ER"7EQ"7EQ"7AQ"7AP"7AP"7=P M"7=P"7=O"79O"79O"79N"'9N"'5N"'5M"'5M"'1M"'1M"'1L"'-L"'-L"'-K M"')K"')K"')K"'%J"'%J"&=A#EI3+41`4"0AA@X-K1T=OX:&S>'AX_7U\^7D MTKNXC)Z:6WAR'VUF"&QF"&QE"&QE"&ME"&MD"&MD"&MD"&IC"&IC"&IC"&EC M"&EB"&EB!VAB!VAA!VAA!UMC'U:AGU7`Y72RMX&FF8R@AY";?XN2?'Z%>F:$ MBDR5KD*CQ4:QV4VXVU:8CEYR.E]<#&)<!V)<!V%;!V%;!V%;!V!:!V!:!V!: M!V!9!U]9!U]9!U]9!UY8!UY8!UY8!UU7!UU7!UU7!UQ7!UQ6!UQ6!UM6!EM5 M!EM5!EM5!EI4!EI4!EI4!EE4!EE3!EE3!EA3!EA2!EA2!E=2!E=2!E=1!E91 M!E91!E90!E50!E50!E5/!E5/!E1/!E1/!E1.!E-.!E-.!E--!E)-!E)-!E)- M!E%,!E%,!E%,!E!+!E!+!E!+!E!*!D]*!D]*!D]*!DY)!4Y)!4Y)!4U(!4U( M!4U(!4Q(!4Q'!4Q'!4M'!4M&!4M&!4I&!4I%!4I%!4I%!4E%!4E$!4E$!4A$ M!4A#!4A#!4=#!4="!4="!49"!49"!49!!45!!45!!45`!45`!41`!41`!40_ M!4,_!4,_!4,^!4(^!4(^!4(]!4$]!4$]!$$]!$`\!$`\!$`\!#\[!#\[!#\[ M!#\[!#XZ!#XZ!#XZ!#TY!#TY!#TY!#PX!#PX!#PX!#LX!#LW!#LW!#HW!#HV M!#HV!#HV!#DV!#DU!#DU!#@U!#@T!#@T!#<T!#<S!#<S!#8S!#8S!#8R!#4R M!#4R!#4Q!#0Q!#0Q!#0Q`S0P`S,P`S,P`S,O`S(O`S(O`S(N`S$N`S$N`S$N M`S`M`S`M`S`M`R\L`R\L`R\L`R\L`RXK`RXK`RXK`RTJ`RTJ`RTJ`RPI`P`` MFI$+FI`+FI`+F9`+F8\+F8\+F(\+F(X+F(X+F(X+EXX+EXT+EXT+EHT+EHP+ MEHP+E8P+E8P+E8L+E(L+E(L+E(H+DXH+DXH+DXD+DHD+DHD+DHD+DH@+D8@+ MD8@+D8<+D(<*D(<*D(<*CX8*CX8*CX8*CH4*CH4*CH4*C80*C80*C80*C80* MC(,*C(,*C(,*BX(*BX(*BX(*BH(*BH$*BH$*B8$*B8`*B8`*B(`*B'\*B'\* MAW\*AW\*AWX*AWX*AGX*AGT*AGT*A7T*A7T*A7P*A'P*A'P*A'L*@WL*@WL) M@WH)@GH)@GH)@GH)@GD)@7D)@7D)@7@)@'@)@'@)@'@)?W<)?W<)?W<)?G8) M?G8)?G8)?74)?74)?74)?'4)?'0)?'0)?'0)>W,)>W,)>W,)>G,)>G()>G() M>7()>7$)>7$)>'$)>'`)>'`)=W`)=W`)=V\)=V\)=F\)=FX(=FX(=6X(=6X( M=6T(=&T(=&T(=&P(<VP(<VP(<VL(<FL(<FL(<FL(<6H(<6H(7ED;/CI:"@JQ M*"C"=G;,T='D]_?W^_OYZ^K<Q,*;IJ%G>G,A;68(;68(;&8(;&4(;&4(;&4( M:V0(:V0(:V0(:F0(:F,(:F,(:6,(:6((:6(':&(':&$'77M,5YV54+?54,#H M5+737*:W8*"J8*&N6Z2[4*;%1*+#0Z;)1[+93;C<59R877I(7UT08EP'8EP' M8EP'85L'85L'85L'85H'8%H'8%H'8%H'7UD'7UD'7UD'7E@'7E@'7E@'75<' M75<'75<'7%<'7%8'7%8'6U8&6U4&6U4&6U4&6E0&6E0&6E0&650&65,&65,& M6%,&6%(&6%(&5U(&5U(&5U$&5E$&5E$&5E`&5E`&55`&54\&54\&5$\&5$\& M5$X&4TX&4TX&4TT&4DT&4DT&4DT&44P&44P&44P&4$L&4$L&4$L&4$H&3TH& M3TH&3TH&3DD%3DD%3DD%34@%34@%34@%3$@%3$<%3$<%2T<%2T8%2T8%2T8% M2D4%2D4%2D4%244%240%240%2$0%2$,%2$,%1T,%1T,%1T(%1D(%1D(%1D$% M14$%14$%14`%14`%1$`%1$`%1#\%0S\%0S\%0SX%0CX%0CX%0CX%03T%03T$ M03T$0#P$0#P$0#P$0#L$/SL$/SL$/SL$/CH$/CH$/CH$/3D$/3D$/3D$/#D$ M/#@$/#@$.S@$.S<$.S<$.C<$.C8$.C8$.C8$.38$.34$.34$.#4$.#0$.#0$ M-S0$-S0$-S,$-C,$-C,$-C($-3($-3($-3$$-3$$-#$$-#$#-#`#,S`#,S`# M,R\#,B\#,B\#,B\#,2X#,2X#,2X#,"T#,"T#,"T#+RP#+RP#+RP#+RP#+BL# M+BL#+BL#+2H#+2H#+2H#``";D0N:D0N:D`N:D`N9D`N9CPN9CPN9CPN8CPN8 MC@N8C@N7C@N7C0N7C0N6C0N6C`N6C`N5C`N5C`N5BPN4BPN4BPN4B@N3B@N3 MB@N3B@N3B0N2B0N2B0N2B`N1B`N1B`N1APN0APN0APJ0APJ/A@J/A@J/A@J. MA0J.A0J.A0J.A0J-A`J-A`J-A`J,@PJ,@PJ,@PJ+@@J+@@J+@@J*@@J*@0J* M@0J)@0J)@`J)@`J(@`J(@`J(?PJ(?PJ'?PJ'?@J'?@J&?@J&?0J&?0J%?0J% M?0J%?`J$?`J$?`J$>PJ#>PJ#>PF#>PF#>@F">@F">@F">0F!>0F!>0F!>`F` M>`F`>`F`>`E_=PE_=PE_=PE^=@E^=@E^=@E]=@E]=0E]=0E]=0E\=`E\=`E\ M=`E[<PE[<PE[<PEZ<PEZ<@EZ<@EY<@EY<0EY<0EX<0EX<0EX<`EX<`EW<`EW M;PEW;PEV;PEV;@AV;@AU;@AU;@AU;0AT;0AT;0AT;`AS;`AS;`AS:PAR:PAR M:PAR:PAR:@AD7A(Z-F$(",!\?,G2TMGS\_3P[^;@WLK8UKS$P9JFHFAZ="!M M9@AM9@AM9@AM9@AL90AL90AL90AK9`AK9`AK9`AJ9`AJ8PAJ8PAI8PAI8@AI M8@=@7Q!>A%M;DGQ7GIE1M,U)N^1$J]!"H\-$J\]*N^9(N>)"I\I"ILA&L-=, MN=Y4HZ=;@5I?8!)C7`=B7`=B7`=B7`=B6P=A6P=A6P=A6@=@6@=@6@=@6@=? M60=?60=?60=>6`=>6`=>6`==5P==5P==5P=<5P=<5@=<5@=<5@9;509;509; M509:509:5`9:5`995`994P994P984P984@984@974@974@97409740964096 M4`964`954`954`953P943P943P943@933@933@9330923092309230913`91 M3`913`912P902P902P902P9/2@9/2@9/2@9.205.205.205-2`5-2`5-2`5, M2`5,1P5,1P5,1P5+1@5+1@5+1@5*1@5*105*105)105)1`5)1`5(1`5(0P5( M0P5'0P5'0P5'0@5&0@5&0@5&005&005%005%005%0`5$0`5$0`5$/P5#/P5# M/P5#/@5"/@5"/@5"/@5!/05!/01!/01!/`1`/`1`/`1`/`0_.P0_.P0_.P0^ M.@0^.@0^.@0].00].00].00\.00\.`0\.`0[.`0[-P0[-P0[-P0Z-P0Z-@0Z M-@0Y-@0Y-00Y-00X-00X-`0X-`0W-`0W-`0W,P0V,P0V,P0V,@0V,@0U,@0U M,@0U,00T,00T,0,T,`,S,`,S,`,S+P,R+P,R+P,R+P,Q+@,Q+@,Q+@,P+0,P M+0,P+0,P+0,O+`,O+`,O+`,N*P,N*P,N*P,M*@,M*@,``)N1"YN1"YJ1"YJ0 M"YJ0"YF0"YF/"YF/"YF/"YB/"YB."YB."Y>."Y>-"Y>-"Y:-"Y:-"Y:,"Y6, M"Y6,"Y6+"Y2+"Y2+"Y2*"Y2*"Y.*"Y.*"Y.)"Y*)"Y*)"Y*("Y&("Y&("Y&( M"Y"'"Y"'"I"'"H^&"H^&"H^&"HZ%"HZ%"HZ%"HZ%"HV$"HV$"HV$"HR#"HR# M"HR#"HN""HN""HN""HJ""HJ!"HJ!"HF!"HF`"HF`"HF`"HB`"HA_"HA_"H=_ M"H=^"H=^"H9^"H9]"H9]"H5]"H5]"H5\"H1\"H1\"H1["H-["H-["H-["8-Z M"8)Z"8)Z"8)Y"8%Y"8%Y"8%X"8!X"8!X"8!X"7]W"7]W"7]W"7YV"7YV"7YV M"7YV"7UU"7UU"7UU"7QT"7QT"7QT"7MS"7MS"7MS"7IS"7IR"7IR"7ER"7EQ M"7EQ"7AQ"7AQ"7AP"7AP"7=P"7=O"7=O"79O"79N"'9N"'5N"'5N"'5M"'1M M"'1M"'1L"'-L"'-L"'-L"'-K"')K"')K"&AA$551;EU=Q[6USM_?W_CX^.'? MR\C&H<"]D[*N>YB34'9P&6YG"&UG"&UF"&UF"&UF"&QE"&QE"&QE"&MD"&MD M"&MD"&ID"&IC"&IC"&EC"&EB"&)D%V!_35V(8UN0=U6HKTN[XD2LT4&BPT6M MTDJ[YTFZY$.ISD&DQD6NU$NZXT^PQ560@5IL,UU=$F!<"F)<!V)<!V)<!V); M!V%;!V%;!V%:!V!:!V!:!V!:!U]9!U]9!U]9!UY8!UY8!UY8!UU8!UU7!UU7 M!UU7!UQ6!UQ6!UQ6!EM5!EM5!EM5!EI5!EI4!EI4!EE4!EE3!EE3!EA3!EA3 M!EA2!E=2!E=2!E=1!E=1!E91!E90!E90!E50!E50!E5/!E1/!E1/!E1.!E-. M!E-.!E-.!E)-!E)-!E)-!E),!E%,!E%,!E%+!E!+!E!+!E!+!D]*!D]*!D]* M!DY)!4Y)!4Y)!4U)!4U(!4U(!4Q(!4Q'!4Q'!4Q'!4M&!4M&!4M&!4I&!4I% M!4I%!4E%!4E$!4E$!4A$!4A$!4A#!4=#!4=#!4="!4="!49"!49!!49!!45! M!45!!45`!41`!41`!40_!4,_!4,_!4,^!4(^!4(^!4(^!4$]!4$]!$$]!$$\ M!$`\!$`\!$`\!#\[!#\[!#\[!#XZ!#XZ!#XZ!#TY!#TY!#TY!#PY!#PX!#PX M!#PX!#LW!#LW!#LW!#HW!#HV!#HV!#DV!#DU!#DU!#@U!#@T!#@T!#<T!#<T M!#<S!#8S!#8S!#8R!#8R!#4R!#4R!#4Q!#0Q!#0Q`S0P`S,P`S,P`S,O`S(O M`S(O`S(O`S$N`S$N`S$N`S$M`S`M`S`M`S`M`R\L`R\L`R\L`RXK`RXK`RXK M`RTJ`P``FY(+FY$+FY$+FI$+FI`+FI`+FI`+F8\+F8\+F8\+F(\+F(X+F(X+ MEXX+EXT+EXT+EHT+EHT+EHP+E8P+E8P+E8L+E8L+E(L+E(H+E(H+DXH+DXH+ MDXD+DHD+DHD+DH@+D8@+D8@+D8@+D(<+D(<*D(<*CX8*CX8*CX8*CX4*CH4* MCH4*CH4*C80*C80*C80*C(,*C(,*C(,*BX,*BX(*BX(*BH(*BH$*BH$*BH$* MB8`*B8`*B8`*B(`*B'\*B'\*AW\*AWX*AWX*AGX*AGX*AGT*A7T*A7T*A7P* MA'P*A'P*A'L*A'L*@WL*@WL)@WH)@GH)@GH)@GD)@7D)@7D)@7D)@'@)@'@) M@'@)?W<)?W<)?W<)?W8)?G8)?G8)?G8)?74)?74)?74)?'0)?'0)?'0)>W0) M>W,)>W,)>G,)>G()>G()>7()>7$)>7$)>7$)>'$)>'`)>'`)=W`)=V\)=V\) M=F\)=F\)=FX(=6X(=6X(=6T(=&T(=&T(=&P(=&P(<VP(<VP(<VL(<6H)=6\? MEY1^N+C.S<W2X^/C^OKZU]6ZN+6%EY)3B8,W?G@C<&H.;F<(;F<(;F<(;68( M;68(;68(;&4(;&4(;&4(:V4(:V0(:V0(:F0(:F,(:F,(:6,(96(.8F8;8',W M7HAB5Z&>3+O@1*W30:3%1:_52KSG2;KE1*S20*+$1:W22KGC3+K?3J2S4(AX M6'-"75L/8UT'8UP'8EP'8EP'8EL'85L'85L'85L'8%H'8%H'8%H'7UD'7UD' M7UD'7E@'7E@'7E@'7E@'75<'75<'75<'7%8'7%8'7%8&6U4&6U4&6U4&6E4& M6E0&6E0&650&65,&65,&6%,&6%,&6%(&6%(&5U(&5U$&5U$&5E$&5E`&5E`& M55`&55`&54\&5$\&5$\&5$X&4TX&4TX&4TX&4TT&4DT&4DT&4DP&44P&44P& M44L&4$L&4$L&4$L&3TH&3TH&3TH&3DD%3DD%3DD%34D%34@%34@%34@%3$<% M3$<%3$<%2T8%2T8%2T8%2D8%2D4%2D4%244%240%240%2$0%2$0%2$,%2$,% M1T,%1T(%1T(%1D(%1D$%1D$%14$%14$%14`%1$`%1$`%1#\%0S\%0S\%0S\% M0CX%0CX%0CX%0CT%03T$03T$03P$0#P$0#P$0#P$/SL$/SL$/SL$/CH$/CH$ M/CH$/3H$/3D$/3D$/3D$/#@$/#@$/#@$.S<$.S<$.S<$.C<$.C8$.C8$.38$ M.34$.34$.#4$.#4$.#0$-S0$-S0$-S,$-S,$-C,$-C($-C($-3($-3($-3$$ M-#$$-#$#-#`#,S`#,S`#,S`#,B\#,B\#,B\#,BX#,2X#,2X#,2T#,"T#,"T# M,"T#+RP#+RP#+RP#+BL#+BL#+BL#``"<D@N;D@N;D0N;D0N;D0N:D`N:D`N: MD`N9D`N9CPN9CPN8CPN8C@N8C@N7C@N7C0N7C0N6C0N6C0N6C`N5C`N5C`N5 MBPN5BPN4BPN4BPN4B@N3B@N3B@N3B0N2B0N2B0N2B`N1B`N1B`N1B`N0APN0 MAPJ0APJ0A@J/A@J/A@J/A@J.A0J.A0J.A0J-A`J-A`J-A`J,@PJ,@PJ,@PJ+ M@PJ+@@J+@@J*@@J*@0J*@0J*@0J)@0J)@`J)@`J(@`J(?PJ(?PJ'?PJ'?@J' M?@J&?@J&?@J&?0J%?0J%?0J%?`J%?`J$?`J$?`J$>PJ#>PJ#>PF#>@F">@F" M>@F">0F!>0F!>0F!>0F`>`F`>`F`>`E_=PE_=PE_=PE_=PE^=@E^=@E^=@E] M=0E]=0E]=0E\=`E\=`E\=`E[=`E[<PE[<PEZ<PEZ<@EZ<@EZ<@EY<@EY<0EY M<0EX<0EX<`EX<`EW<`EW;PEW;PEV;PEV;PEV;@AU;@AU;@AU;0AT;0AT;0AT M;0AT;`EV;PY\=AR(@C6>FV:YMY_2TM+;V]OIZ>G[^_O5T[>PK7=V<!]O:`AO M:`AO:`AO9PAN9PAN9PAN9PAM9@AM9@AM9@AL90AL90AL90AK90AK9`AK9`AJ M9`AJ8PAJ8PAI8PAI8@AD9QE@@E18G95.N]]&L=A"I\I&L=A)N>-(N.%%K]5" MI\E%K=-(N.)*O>A&LMA#H;U0@VY;60]C70=C70=C7`=B7`=B7`=B6P=A6P=A M6P=A6P=@6@=@6@=@6@=?60=?60=?60=>6`=>6`=>6`=>6`==5P==5P==5P=< M5@=<5@=<5@=;5@9;509;509:509:5`9:5`995`994P994P994P984P984@98 M4@974@9740974096409640964`954`954`953P943P943P943@933@933@93 M3@933092309230923`913`913`913`902P902P902P9/2@9/2@9/2@9.205. M205.205.205-2`5-2`5-2`5,1P5,1P5,1P5+1P5+1@5+1@5*1@5*105*105) M105)1`5)1`5(1`5(1`5(0P5(0P5'0P5'0@5'0@5&0@5&0@5&005%005%005% M0`5$0`5$0`5$/P5#/P5#/P5#/P5#/@5"/@5"/@5"/05!/01!/01!/01`/`1` M/`1`/`0_.P0_.P0_.P0^.@0^.@0^.@0].@0].00].00].00\.`0\.`0\.`0[ M.`0[-P0[-P0Z-P0Z-@0Z-@0Y-@0Y-00Y-00X-00X-00X-`0X-`0W-`0W,P0W M,P0V,P0V,P0V,@0U,@0U,@0U,00T,00T,0,T,`,S,`,S,`,S,`,R+P,R+P,R M+P,R+@,Q+@,Q+@,Q+@,P+0,P+0,P+0,O+`,O+`,O+`,N*P,N*P,``)R2"YR2 M"YR2"YN1"YN1"YN1"YJ0"YJ0"YJ0"YF0"YF/"YF/"YB/"YB."YB."Y>."Y>. M"Y>-"Y:-"Y:-"Y:,"Y:,"Y6,"Y6+"Y6+"Y2+"Y2+"Y2*"Y.*"Y.*"Y.)"Y*) M"Y*)"Y*)"Y&("Y&("Y&("Y&'"Y"'"I"'"I"&"H^&"H^&"H^&"HZ%"HZ%"HZ% M"HV$"HV$"HV$"HR$"HR#"HR#"HN#"HN""HN""HN""HJ!"HJ!"HJ!"HF!"HF` M"HF`"HB`"HA_"HA_"H=_"H=^"H=^"H9^"H9^"H9]"H9]"H5]"H5\"H5\"H1\ M"H1\"H1["H-["H-["8-Z"8)Z"8)Z"8)Y"8%Y"8%Y"8%Y"8!X"8!X"8!X"8!W M"7]W"7]W"7]W"7YV"7YV"7YV"7UU"7UU"7UU"7QT"7QT"7QT"7MT"7MS"7MS M"7MS"7IR"7IR"7IR"7ER"7EQ"7EQ"7AQ"7AP"7AP"7=P"7=O"7=O"79O"79O M"79N"'5N"'5N"'5M"'5M"'1M"'=P#X1^*Y&-2:.@<+6SE\/"M-/3T^+BXO#P M\/S\_-73M["M=W9P'W!I"'!H"&]H"&]H"&]H"&YG"&YG"&YG"&UF"&UF"&UF M"&QE"&QE"&QE"&ME"&MD"&MD"&ID"&IC"&IC"&IC"&1I&U^&7E>@FTZ[X$J[ MYT:RV4:RV4:RV$:QV$:RV4:RV$:RV$:RV4:RVD:RV46PU5&/@UM:#V1=!V-= M!V-=!V-<!V)<!V)<!V);!V%;!V%;!V%;!V!:!V!:!V!:!U]9!U]9!U]9!U]9 M!UY8!UY8!UY8!UU7!UU7!UU7!UQ6!UQ6!UQ6!UM6!EM5!EM5!EI5!EI4!EI4 M!EI4!EE4!EE3!EE3!EA3!EA2!EA2!E=2!E=1!E=1!E91!E91!E90!E50!E50 M!E5/!E1/!E1/!E1/!E1.!E-.!E-.!E--!E)-!E)-!E),!E%,!E%,!E%,!E!+ M!E!+!E!+!D]*!D]*!D]*!D]*!DY)!4Y)!4Y)!4U(!4U(!4U(!4Q'!4Q'!4Q' M!4M'!4M&!4M&!4I&!4I%!4I%!4E%!4E%!4E$!4E$!4A$!4A#!4A#!4=#!4=" M!4="!49"!49"!49!!45!!45!!45`!41`!41`!41`!40_!4,_!4,_!4,^!4(^ M!4(^!4(]!4$]!$$]!$$]!$`\!$`\!$`\!#\[!#\[!#\[!#XZ!#XZ!#XZ!#XZ M!#TY!#TY!#TY!#PX!#PX!#PX!#LX!#LW!#LW!#HW!#HV!#HV!#DV!#DU!#DU M!#DU!#@U!#@T!#@T!#<T!#<S!#<S!#8S!#8S!#8R!#4R!#4R!#4Q!#0Q!#0Q M`S0P`S,P`S,P`S,P`S,O`S(O`S(O`S(N`S$N`S$N`S$N`S`M`S`M`S`M`R\L M`R\L`R\L`RXK`P``G),+G)(+G)(+G)(+FY$+FY$+FY$+FI`+FI`+FI`+F9`+ MF8\+F8\+F(\+F(X+F(X+EXX+EXX+EXT+EXT+EHT+EHP+EHP+E8P+E8L+E8L+ ME(L+E(L+E(H+DXH+DXH+DXD+DHD+DHD+DHD+D8@+D8@+D8@+D8<+D(<*D(<* MD(8*CX8*CX8*CX8*CH4*CH4*CH4*C80*C80*C80*C(0*C(,*C(,*C(,*BX(* MBX(*BX(*BH$*BH$*BH$*B8$*B8`*B8`*B(`*B'\*B'\*AW\*AW\*AWX*AGX* MAGX*AGT*AGT*A7T*A7P*A7P*A'P*A'P*A'L*@WL*@WL)@WH)@GH)@GH)@GH) M@7D)@7D)@7D)@7@)@'@)@'@)@'<)?W<)?W<)?W<)?G8)?G8)?G8)?74)?74) M?74)?'4)?'0)?'0)>W0)>W,)>W,)>W,)>G()>G()>G()>7()>7$)>7$)>'$) M>'`)>'`)=W`)=W`)=V\)=F\)=F\)=FX(=FX(=6X(=6T(=6T(>7(4CXM$H9UK MLJ^/O;RGQL6[TM+2Z>GI^/CX_?W]T]&SK*AO<VT:<&D(<&D(<&@(;V@(;V@( M;V@(;F<(;F<(;F<(;68(;68(;68(;&8(;&4(;&4(:V4(:V0(:V0(:V0(:F,( M:F,(9FD;7HED5Y^;4;+(3KS@2K[I1K/:1*K.1*S01K/;2KSG2+;>1*W20ZK- M1;'72[GB59B06UL19%X'9%T'8UT'8UT'8UP'8EP'8EP'8EP'85L'85L'85L' M8%H'8%H'8%H'8%D'7UD'7UD'7UD'7E@'7E@'7E@'75<'75<'75<'7%<'7%8' M7%8'6U8&6U4&6U4&6E4&6E0&6E0&6E0&650&65,&65,&6%,&6%(&6%(&5U(& M5U$&5U$&5E$&5E$&5E`&55`&55`&54\&54\&5$\&5$\&5$X&4TX&4TX&4TT& M4DT&4DT&4DP&44P&44P&44P&4$L&4$L&4$L&3TH&3TH&3TH&3TH&3DD%3DD% M3DD%34@%34@%34@%3$<%3$<%3$<%2T<%2T8%2T8%2D8%2D4%2D4%2D4%244% M240%240%2$0%2$,%2$,%1T,%1T(%1T(%1D(%1D(%1D$%14$%14$%14`%1$`% M1$`%1$`%1#\%0S\%0S\%0SX%0CX%0CX%0CT%03T%03T$03T$0#P$0#P$0#P$ M/SL$/SL$/SL$/SL$/CH$/CH$/CH$/3D$/3D$/3D$/#@$/#@$/#@$.S@$.S<$ M.S<$.C<$.C8$.C8$.38$.38$.34$.34$.#4$.#0$.#0$-S0$-S,$-S,$-C,$ M-C,$-C($-3($-3($-3$$-#$$-#$#-#$#-#`#,S`#,S`#,R\#,B\#,B\#,BX# M,2X#,2X#,2X#,"T#,"T#,"T#+RP#+RP#+RP#``"=DPN=DPN<D@N<D@N<D@N; MD0N;D0N;D0N:D0N:D`N:D`N9D`N9CPN9CPN8CPN8C@N8C@N8C@N7C@N7C0N7 MC0N6C0N6C`N6C`N5C`N5C`N5BPN4BPN4BPN4B@N3B@N3B@N3B0N2B0N2B0N2 MB0N2B`N1B`N1B`N1APN0APJ0APJ0APJ/A@J/A@J/A@J.A0J.A0J.A0J-A`J- MA`J-A`J-A`J,@PJ,@PJ,@PJ+@@J+@@J+@@J*@@J*@0J*@0J)@0J)@`J)@`J( M@`J(?PJ(?PJ'?PJ'?PJ'?@J'?@J&?@J&?0J&?0J%?0J%?0J%?`J$?`J$?`J$ M>PJ#>PJ#>PF#>@F">@F">@F">@F">0F!>0F!>0F!>`F`>`F`>`F`>`E_=PE_ M=PE_=PE^=@E^=@E^=@E]=0E]=0E]=0E\=0E\=`E\=`E\=`E[<PE[<PE[<PEZ M<PEZ<@EZ<@EY<@EY<0EY<0EX<0EX<`EX<`EW<`EW<`EW;PEW;PER:P]H81U? M62EE7QYN:!!Y<A>1C$BGI'>\NJ3&Q;O.SLG6UMG6UO/3T^C6U,*UL7^8DTQR M;!1Q:0AP:0AP:0AP:0AO:`AO:`AO:`AN9PAN9PAN9PAM9@AM9@AM9@AL9@AL M90AL90AL90AK9`AK9`AK9`AJ8PAG:1AA@E-;E8!8GYE4K+E.O>))N^5$K-%$ MK-%'M-M*N^5'LME#J,M"I,=&LME-NM]7FI):71AD7@=D7@=D70=C70=C70=C M7`=B7`=B7`=B7`=A6P=A6P=A6P=A6@=@6@=@6@=@60=?60=?60=?60=>6`=> M6`=>6`==5P==5P==5P=<5P=<5@=<5@=;5@9;509;509;509:5`9:5`9:5`99 M5`994P994P984P984@984@974@974@974096409640964`964`954`953P95 M3P943P943P943@933@933@9330923092309230913`913`913`902P902P90 M2P902@9/2@9/2@9/2@9.205.205.205-2`5-2`5-2`5,2`5,1P5,1P5+1P5+ M1@5+1@5+1@5*105*105*105)105)1`5)1`5(1`5(0P5(0P5'0P5'0P5'0@5& M0@5&0@5&005%005%005%0`5%0`5$0`5$0`5$/P5#/P5#/P5#/@5"/@5"/@5" M/@5!/05!/01!/01`/`1`/`1`/`1`.P0_.P0_.P0_.P0^.@0^.@0^.@0].00] M.00].00\.00\.`0\.`0[.`0[-P0[-P0Z-P0Z-@0Z-@0Z-@0Y-@0Y-00Y-00X M-00X-`0X-`0W-`0W-`0W,P0V,P0V,P0V,@0U,@0U,@0U,00U,00T,00T,0,T M,`,S,`,S,`,S+P,R+P,R+P,R+P,Q+@,Q+@,Q+@,P+0,P+0,P+0,O+`,O+`,` M`)V3"YV3"YV3"YR2"YR2"YR2"YN1"YN1"YN1"YJ1"YJ0"YJ0"YF0"YF/"YF/ M"YB/"YB/"YB."YB."Y>."Y>-"Y>-"Y:-"Y:,"Y:,"Y6,"Y6,"Y6+"Y2+"Y2+ M"Y2*"Y.*"Y.*"Y.*"Y.)"Y*)"Y*)"Y*("Y&("Y&("Y&'"Y"'"I"'"I"'"H^& M"H^&"H^&"HZ%"HZ%"HZ%"HV%"HV$"HV$"HV$"HR#"HR#"HR#"HN""HN""HN" M"HJ""HJ!"HJ!"HF!"HF`"HF`"HB`"HB`"HA_"HA_"H=_"H=^"H=^"H9^"H9] M"H9]"H5]"H5]"H5\"H1\"H1\"H1["H-["H-["8-Z"8)Z"8)Z"8)Z"8)Y"8%Y M"8%Y"8%X"8!X"8!X"8!X"7]W"7]W"7]W"7YV"7YV"7YV"7UU"7UU"7UU"7UU M"7QT"7QT"7QT"7MS"7MS"7MS"7IS"7IR"7IR"7ER"7EQ"7EQ"7AQ"7AP"7AP M"7=P"7=P"7=O"6MD&U!+13HV9D9"4EY8+75O'(V'/:FF>\3$M]/3TMS<W,_/ M[(!_\VIGIGAR18-])WYW'7)L#G%J"'%I"'!I"'!I"'!I"&]H"&]H"&]H"&YG M"&YG"&YG"&UF"&UF"&UF"&QF"&QE"&QE"&QE"&MD"&MD"&MD"&AF#V5R+F)^ M2%V+:%B=E5&TS4S![DJ[YD:SVT:QV$6NU4.IS4&DQD&CQ4:SVTVYVE><E%IC M(65>!V1>!V1>!V1=!V-=!V-=!V-<!V)<!V)<!V)<!V%;!V%;!V%;!V%:!V!: M!V!:!V!:!U]9!U]9!U]9!UY8!UY8!UY8!UU7!UU7!UU7!UQ7!UQ6!UQ6!UQ6 M!EM5!EM5!EM5!EI5!EI4!EI4!EE4!EE3!EE3!EA3!EA2!EA2!E=2!E=2!E=1 M!E91!E91!E90!E90!E50!E50!E5/!E1/!E1/!E1.!E-.!E-.!E--!E)-!E)- M!E)-!E%,!E%,!E%,!E%+!E!+!E!+!E!+!D]*!D]*!D]*!DY)!4Y)!4Y)!4U( M!4U(!4U(!4Q(!4Q'!4Q'!4M'!4M&!4M&!4M&!4I&!4I%!4I%!4E%!4E$!4E$ M!4A$!4A#!4A#!4=#!4=#!4="!49"!49"!49!!49!!45!!45!!45`!41`!41` M!40_!4,_!4,_!4,^!4(^!4(^!4(^!4$]!4$]!$$]!$`\!$`\!$`\!$`\!#\[ M!#\[!#\[!#XZ!#XZ!#XZ!#TY!#TY!#TY!#PY!#PX!#PX!#LX!#LW!#LW!#LW M!#HV!#HV!#HV!#DV!#DU!#DU!#@U!#@T!#@T!#<T!#<T!#<S!#8S!#8S!#8R M!#8R!#4R!#4Q!#4Q!#0Q!#0Q`S0P`S,P`S,P`S,O`S(O`S(O`S(O`S$N`S$N M`S$N`S`M`S`M`S`M`S`L`P``GI0,G9,+G9,+G9,+G)(+G)(+G)(+FY$+FY$+ MFY$+FI$+FI`+FI`+F9`+F8\+F8\+F8\+F(\+F(X+F(X+EXX+EXT+EXT+EHT+ MEHP+EHP+E8P+E8P+E8L+E(L+E(L+E(H+E(H+DXH+DXH+DXD+DHD+DHD+DH@+ MD8@+D8@+D8<+D(<+D(<*D(<*CX8*CX8*CX8*CH4*CH4*CH4*CH4*C80*C80* MC80*C(,*C(,*C(,*BX(*BX(*BX(*BH(*BH$*BH$*B8$*B8`*B8`*B8`*B(`* MB'\*B'\*AW\*AWX*AWX*AGX*AGT*AGT*A7T*A7T*A7P*A'P*A'P*A'L*@WL* M@WL)@WL)@WH)@GH)@GH)@GD)@7D)@7D)@7@)@'@)@'@)@'@)?W<)?W<)?W<) M?G8)?G8)?G8)?G8)?74)?74)?74)?'0)?'0)?'0)>W,)>W,)>W,)>G,)>G() M>G()>7()>7$)>7$)>'$)>'$)>'`)>'`)=W`)8UTE.C9F&QJ6(1^,0S]7:F0G MAH$NJJ9\RLG`W=W=[^_QIZ?_.#?J5%!X<&D6<FL(<FL(<FH(<6H(<6H(<6D( M<&D(<&D(<&D(;V@(;V@(;V@(;F<(;F<(;F<(;6<(;68(;68(;68(;&4(;&4( M;&4(:V0(:V0(:V0(:F0(:F,)8W8X6Y1]5:BO4;7/3K_E2K[I1*[40:+"0*#` M0*#`0J3%2;+44*_#5YR466\Z95\'95X'9%X'9%X'9%T'8UT'8UT'8UT'8EP' M8EP'8EP'8EL'85L'85L'85H'8%H'8%H'8%H'7UD'7UD'7UD'7E@'7E@'7E@' M75@'75<'75<'75<'7%8'7%8'7%8&6U4&6U4&6U4&6E4&6E0&6E0&650&65,& M65,&6%,&6%,&6%(&5U(&5U(&5U$&5U$&5E$&5E`&5E`&55`&55`&54\&5$\& M5$\&5$X&4TX&4TX&4TT&4DT&4DT&4DT&4DP&44P&44P&44L&4$L&4$L&4$L& M3TH&3TH&3TH&3DD%3DD%3DD%34@%34@%34@%3$@%3$<%3$<%3$<%2T8%2T8% M2T8%2D8%2D4%2D4%244%240%240%2$0%2$,%2$,%1T,%1T,%1T(%1T(%1D(% M1D$%1D$%14$%14$%14`%1$`%1$`%1#\%0S\%0S\%0SX%0CX%0CX%0CX%03T% M03T$03T$03P$0#P$0#P$0#P$/SL$/SL$/SL$/CH$/CH$/CH$/3D$/3D$/3D$ M/#D$/#@$/#@$/#@$.S<$.S<$.S<$.C<$.C8$.C8$.38$.34$.34$.#4$.#0$ M.#0$-S0$-S0$-S,$-C,$-C,$-C($-C($-3($-3($-3$$-#$$-#$#-#`#,S`# M,S`#,R\#,B\#,B\#,B\#,2X#,2X#,2X#,2T#,"T#,"T#``">E`R>E`R=DPN= MDPN=DPN<D@N<D@N<D@N;D@N;D0N;D0N:D0N:D`N:D`N:D`N9CPN9CPN9CPN8 MCPN8C@N8C@N7C@N7C0N7C0N6C0N6C0N6C`N5C`N5C`N5BPN4BPN4BPN4B@N4 MB@N3B@N3B@N3B0N2B0N2B0N2B`N1B`N1B`N1B`N0APN0APJ0APJ/A@J/A@J/ MA@J/A0J.A0J.A0J.A0J-A`J-A`J-A`J,@PJ,@PJ,@PJ+@PJ+@@J+@@J*@@J* M@0J*@0J)@0J)@`J)@`J)@`J(@`J(?PJ(?PJ'?PJ'?@J'?@J&?@J&?@J&?0J% M?0J%?0J%?`J$?`J$?`J$>PJ$>PJ#>PJ#>PF#>@F">@F">@F">0F!>0F!>0F! M>0F`>`F`>`F`>`E_=PE_=PE_=PE^=@E^=@E^=@E^=@E]=0E]=0E]=0E\=`E\ M=`E\=`E[=`E[<PE[<PEZ<PEZ<@EZ<@EY<@EY<0EY<0EY<0EX<0EX<`EX<`ED M7B,].6,;&9<+"J\@'HY.24:$?BFPKI#6U=3JZNKY^?K5U?^<F^F!?G=T;11S M:PAR:PAR:PAR:@AQ:@AQ:@AQ:@AP:0AP:0AP:0AO:`AO:`AO:`AN9PAN9PAN M9PAN9PAM9@AM9@AM9@AL90AL90AL90AK9`AK9`AK9`AJ9`AD:R%@A%A;DWM8 MG)-3KKU,O.-%K]5`H<)!I,9#J<U)J\=4G)A9CWA:CW=9DGY;B&9@<C-C81%D M7@=D7@=D70=C70=C70=C70=C7`=B7`=B7`=B6P=A6P=A6P=A6@=@6@=@6@=@ M6@=?60=?60=?60=>6`=>6`=>6`==6`==5P==5P==5P=<5@=<5@=<5@9;509; M509;509:509:5`9:5`995`994P994P984P984P984@984@974@9740974096 M40964`964`954`954`953P943P943P943@933@933@933@92309230923092 M3`913`913`912P902P902P902P9/2@9/2@9/2@9.205.205.205-205-2`5- M2`5-2`5,1P5,1P5,1P5+1@5+1@5+1@5*1@5*105*105)105)1`5)1`5(1`5( M1`5(0P5'0P5'0P5'0@5'0@5&0@5&005&005%005%005%0`5$0`5$0`5$/P5# M/P5#/P5#/P5"/@5"/@5"/@5"/05!/01!/01!/`1`/`1`/`1`/`0_.P0_.P0_ M.P0^.@0^.@0^.@0].@0].00].00\.00\.`0\.`0\.`0[-P0[-P0[-P0Z-P0Z M-@0Z-@0Y-@0Y-00Y-00X-00X-00X-`0W-`0W-`0W,P0W,P0V,P0V,@0V,@0U M,@0U,@0U,00T,00T,0,T,`,S,`,S,`,S,`,R+P,R+P,R+P,R+@,Q+@,Q+@,Q M+0,P+0,``)Z4#)Z4#)Z4#)V3"YV3"YV3"YR2"YR2"YR2"YN2"YN1"YN1"YN1 M"YJ0"YJ0"YJ0"YF0"YF/"YF/"YB/"YB."YB."Y>."Y>-"Y>-"Y:-"Y:-"Y:, M"Y6,"Y6,"Y6+"Y6+"Y2+"Y2+"Y2*"Y.*"Y.*"Y.)"Y*)"Y*)"Y*("Y&("Y&( M"Y&("Y"'"Y"'"I"'"I"&"H^&"H^&"H^&"HZ%"HZ%"HZ%"HV$"HV$"HV$"HR# M"HR#"HR#"HN#"HN""HN""HJ""HJ!"HJ!"HJ!"HF!"HF`"HF`"HB`"HA_"HA_ M"H=_"H=^"H=^"H9^"H9^"H9]"H5]"H5]"H5\"H5\"H1\"H1\"H1["H-["H-[ M"8-Z"8)Z"8)Z"8)Y"8%Y"8%Y"8%Y"8!X"8!X"8!X"7]W"7]W"7]W"7]V"7YV M"7YV"7YV"7UU"7UU"7UU"7QT"7QT"7QT"7MT"7MS"7MS"7IS"7IR"7IR"7IR M"7EQ"7EQ"7EQ"7AQ"7AP"6=@'4,_62$>C@<'M0X-JB4CAUA4<[.SO>+BXO3S M\_W]_?7U[N7DT:VI=GES%G)K"'-K"')K"')K"')J"'%J"'%J"'%J"'!I"'!I M"'!I"&]H"&]H"&]H"&]G"&YG"&YG"&YG"&UF"&UF"&UF"&QE"&QE"&QE"&ME M"&MD"&MD"&AE#V5J'F-U-U^'7UF<DD^TST>MSD&?O$2HR4BUVU&JMUV%7F!X M0%Z!4UB9C5.KN%N*:V!H(65>!V1>!V1>!V1=!V1=!V-=!V-=!V-<!V)<!V)< M!V);!V%;!V%;!V%;!V!:!V!:!V!:!U]9!U]9!U]9!UY8!UY8!UY8!UY8!UU7 M!UU7!UU7!UQ6!UQ6!UQ6!EM6!EM5!EM5!EI5!EI4!EI4!EE4!EE3!EE3!EE3 M!EA3!EA2!EA2!E=2!E=1!E=1!E91!E91!E90!E50!E50!E5/!E1/!E1/!E1. M!E-.!E-.!E-.!E--!E)-!E)-!E),!E%,!E%,!E%,!E!+!E!+!E!+!D]*!D]* M!D]*!DY)!4Y)!4Y)!4Y)!4U(!4U(!4U(!4Q'!4Q'!4Q'!4M'!4M&!4M&!4I& M!4I%!4I%!4E%!4E$!4E$!4A$!4A$!4A#!4A#!4=#!4="!4="!49"!49"!49! M!45!!45!!45`!41`!41`!40_!4,_!4,_!4,_!4,^!4(^!4(^!4(]!4$]!$$] M!$$]!$`\!$`\!$`\!#\[!#\[!#\[!#XZ!#XZ!#XZ!#TZ!#TY!#TY!#TY!#PX M!#PX!#PX!#LX!#LW!#LW!#HW!#HV!#HV!#DV!#DU!#DU!#@U!#@U!#@T!#@T M!#<T!#<S!#<S!#8S!#8R!#8R!#4R!#4R!#4Q!#0Q!#0Q`S0P`S,P`S,P`S,P M`S(O`S(O`S(O`S(N`S$N`S$N`S$M`P``GY4,GI0,GI0,GI0,G9,+G9,+G9,+ MG),+G)(+G)(+FY(+FY$+FY$+FY$+FI`+FI`+FI`+F9`+F8\+F8\+F(\+F(X+ MF(X+EXX+EXT+EXT+EHT+EHT+EHP+EHP+E8P+E8L+E8L+E(L+E(L+E(H+DXH+ MDXH+DXD+DHD+DHD+DH@+D8@+D8@+D8@+D(<+D(<*D(<*D(8*CX8*CX8*CX8* MCH4*CH4*CH4*C80*C80*C80*C(,*C(,*C(,*BX,*BX(*BX(*BX(*BH$*BH$* MBH$*B8$*B8`*B8`*B(`*B'\*B'\*AW\*AWX*AWX*AGX*AGX*AGT*A7T*A7T* MA7P*A7P*A'P*A'P*A'L*@WL*@WL)@WH)@GH)@GH)@GD)@7D)@7D)@7D)@'@) M@'@)@'@)@'<)?W<)?W<)?W<)?G8)?G8)?G8)?74)?74)?74)?'0)?'0)?'0) M>W0)>W,)>W,)>G,)>G()>G()>G()>7()>7$)>7$)>'$):F,72452)B2)#`NR M!06\"`>V/3VVP\/4[^_O_/S[\O'HVM>\LJYVEY)&?W@;<VP)<VP(<VL(<FL( M<FL(<FH(<6H(<6H(<6H(<&D(<&D(<&D(;V@(;V@(;V@(;V@(;F<(;F<(;F<( M;68(;68(;68(;&4(;&4(;&4(:V4(:V0(:V0(:F0(:64.9'@Z7HMI5YR44I>3 M3(^,3)^L3;755::K7W].8VXG878Z6H]W5*FR6XUS86PG95\'95X'9%X'9%X' M9%X'9%T'8UT'8UT'8UP'8EP'8EP'8EL'85L'85L'85L'8%H'8%H'8%H'7UD' M7UD'7UD'7UD'7E@'7E@'7E@'75<'75<'75<'7%8'7%8'7%8'6U8&6U4&6U4& M6E4&6E0&6E0&650&650&65,&65,&6%,&6%(&6%(&5U(&5U$&5U$&5E$&5E$& M5E`&55`&55`&54\&5$\&5$\&5$\&5$X&4TX&4TX&4TT&4DT&4DT&4DP&44P& M44P&44P&4$L&4$L&4$L&3TH&3TH&3TH&3DD%3DD%3DD%3DD%34@%34@%34@% M3$<%3$<%3$<%2T<%2T8%2T8%2D8%2D4%2D4%244%240%240%240%2$0%2$,% M2$,%1T,%1T(%1T(%1D(%1D(%1D$%14$%14$%14`%1$`%1$`%1#\%0S\%0S\% M0S\%0SX%0CX%0CX%0CT%03T$03T$03T$0#P$0#P$0#P$/SL$/SL$/SL$/CH$ M/CH$/CH$/CH$/3D$/3D$/3D$/#@$/#@$/#@$.S@$.S<$.S<$.C<$.C8$.C8$ M.38$.34$.34$.34$.#4$.#0$.#0$-S0$-S,$-S,$-C,$-C,$-C($-3($-3($ M-3$$-#$$-#$#-#`#,S`#,S`#,S`#,R\#,B\#,B\#,BX#,2X#,2X#``"?E0R? ME0R>E`R>E`R>E`R=DPN=DPN=DPN<DPN<D@N<D@N<D@N;D0N;D0N;D0N:D`N: MD`N:D`N9D`N9CPN9CPN8CPN8C@N8C@N7C@N7C@N7C0N7C0N6C0N6C`N6C`N5 MC`N5BPN5BPN4BPN4BPN4B@N3B@N3B@N3B0N2B0N2B0N2B0N1B`N1B`N1B`N1 MAPN0APJ0APJ0A@J/A@J/A@J/A@J.A0J.A0J.A0J-A`J-A`J-A`J,A`J,@PJ, M@PJ,@PJ+@@J+@@J+@@J*@0J*@0J*@0J)@0J)@`J)@`J(@`J(?PJ(?PJ'?PJ' M?PJ'?@J&?@J&?@J&?0J&?0J%?0J%?`J%?`J$?`J$?`J$>PJ#>PJ#>PF#>@F" M>@F">@F">@F!>0F!>0F!>0F!>`F`>`F`>`F`=PE_=PE_=PE_=PE^=@E^=@E^ M=@E]=0E]=0E]=0E\=0E\=`E\=`E[=`E[<PE[<PE[<PEZ<@EZ<@EZ<@EY<@EY M<0EY<0EK91=.250L*9`1$+\$!-(``,M)2<SAX>OZ^OKX^/+AW\G(Q9V8DD=] M=A=[=!1T;0IS;`AS;`AS:PAR:PAR:PAR:PAQ:@AQ:@AQ:@AP:0AP:0AP:0AP M:`AO:`AO:`AO:`AN9PAN9PAN9PAM9@AM9@AM9@AL9@AL90AL90AK90AK9`AK M9`AJ90MG;B-D>#IB>D!@=SY>=#Q8C791L<95IJM?@UAD;")D;21@?$E<B6A@ M>4-D9AEE7P=E7P=E7@=E7@=D7@=D7@=D70=C70=C70=C7`=B7`=B7`=B6P=A M6P=A6P=A6P=@6@=@6@=@6@=@60=?60=?60=?60=>6`=>6`=>6`==5P==5P== M5P=<5@=<5@=<5@=;5@9;509;509:509:5`9:5`9:5`995`994P994P984P98 M4@984@974@9740974096409640964`954`954`953P953P943P943P943@93 M3@933@933092309230923`913`913`913`902P902P902P9/2@9/2@9/2@9/ M2@9.205.205.205-2`5-2`5-2`5,1P5,1P5,1P5+1P5+1@5+1@5*1@5*105* M105*105)105)1`5)1`5(1`5(0P5(0P5'0P5'0@5'0@5&0@5&0@5&005%005% M005%0`5$0`5$0`5$0`5$/P5#/P5#/P5#/@5"/@5"/@5"/05!/05!/01!/01` M/`1`/`1`/`0_.P0_.P0_.P0_.P0^.@0^.@0^.@0].00].00].00\.`0\.`0\ M.`0[.`0[-P0[-P0Z-P0Z-@0Z-@0Y-@0Y-@0Y-00Y-00X-00X-`0X-`0W-`0W M,P0W,P0V,P0V,P0V,@0U,@0U,@0U,00T,00T,0,T,0,T,`,S,`,S,`,S+P,R M+P,R+P,R+@,Q+@,``)^5#)^5#)^5#)Z4#)Z4#)Z4#)V3"YV3"YV3"YV3"YR2 M"YR2"YR2"YN1"YN1"YN1"YJ1"YJ0"YJ0"YF0"YF/"YF/"YB/"YB."YB."Y>. M"Y>."Y>-"Y>-"Y:-"Y:,"Y:,"Y6,"Y6,"Y6+"Y2+"Y2+"Y2*"Y.*"Y.*"Y.) M"Y*)"Y*)"Y*)"Y*("Y&("Y&("Y&'"Y"'"I"'"I"'"H^&"H^&"H^&"HZ%"HZ% M"HZ%"HV$"HV$"HV$"HR$"HR#"HR#"HR#"HN""HN""HN""HJ""HJ!"HJ!"HF! M"HF`"HF`"HB`"HA_"HA_"H=_"H=_"H=^"H=^"H9^"H9]"H9]"H5]"H5]"H5\ M"H1\"H1\"H1["H-["H-["8-Z"8)Z"8)Z"8)Z"8%Y"8%Y"8%Y"8%X"8!X"8!X M"8!X"7]W"7]W"7]W"7YV"7YV"7YV"7UU"7UU"7UU"7QU"7QT"7QT"7QT"7MS M"7MS"7MS"7IR"7IR"7IR"7ER"7EQ"6QE&%!,6#$NEA85S`0$Z0``U&-CUOCX M^_W]_._NXMK8O,/`DY*,/G5N#'5N"G1M"71L"'-L"'-L"'-K"')K"')K"')K M"'%J"'%J"'%J"'%I"'!I"'!I"'!H"&]H"&]H"&]H"&YG"&YG"&YG"&UF"&UF M"&UF"&QF"&QE"&QE"&ME"&MD"&MD"&IE#&AD#V=C#6=B#&9B#%][25:EJ5:D MIEZ&7V5K'V9C#&5F$V5F%V1D$65A"F9?!V9?!V5?!V5>!V5>!V1>!V1>!V1= M!V-=!V-=!V-<!V)<!V)<!V)<!V%;!V%;!V%;!V!:!V!:!V!:!V!9!U]9!U]9 M!U]9!UY8!UY8!UY8!UU7!UU7!UU7!UQ7!UQ6!UQ6!UM6!EM5!EM5!EM5!EI4 M!EI4!EI4!EE4!EE3!EE3!EA3!EA2!EA2!E=2!E=2!E=1!E91!E91!E90!E50 M!E50!E5/!E5/!E1/!E1/!E1.!E-.!E-.!E--!E)-!E)-!E)-!E%,!E%,!E%, M!E!+!E!+!E!+!E!*!D]*!D]*!D]*!DY)!4Y)!4Y)!4U(!4U(!4U(!4Q(!4Q' M!4Q'!4M'!4M&!4M&!4I&!4I%!4I%!4I%!4E%!4E$!4E$!4A$!4A#!4A#!4=# M!4=#!4="!49"!49"!49!!45!!45!!45`!45`!41`!41`!40_!4,_!4,_!4,^ M!4(^!4(^!4(^!4$]!4$]!$$]!$`\!$`\!$`\!#\[!#\[!#\[!#\[!#XZ!#XZ M!#XZ!#TY!#TY!#TY!#PY!#PX!#PX!#LX!#LW!#LW!#HW!#HV!#HV!#HV!#DV M!#DU!#DU!#@U!#@T!#@T!#<T!#<T!#<S!#8S!#8S!#8R!#4R!#4R!#4Q!#4Q M!#0Q!#0Q`S0P`S,P`S,P`S,O`S(O`S(O`S(N`P``H)8,GY4,GY4,GY4,GI0, MGI0,GI0,GI0,G9,+G9,+G9,+G)(+G)(+G)(+FY$+FY$+FY$+FI$+FI`+FI`+ MF9`+F8\+F8\+F(\+F(\+F(X+F(X+EXX+EXT+EXT+EHT+EHP+EHP+E8P+E8P+ ME8L+E(L+E(L+E(H+DXH+DXH+DXD+DXD+DHD+DHD+DH@+D8@+D8@+D8<+D(<* MD(<*D(<*CX8*CX8*CX8*CH4*CH4*CH4*C80*C80*C80*C80*C(,*C(,*C(,* MBX(*BX(*BX(*BH(*BH$*BH$*B8$*B8`*B8`*B(`*B'\*B'\*B'\*AW\*AWX* MAWX*AGX*AGT*AGT*A7T*A7T*A7P*A'P*A'P*A'L*@WL*@WL)@WH)@GH)@GH) M@GH)@GD)@7D)@7D)@7@)@'@)@'@)@'@)?W<)?W<)?W<)?G8)?G8)?G8)?74) M?74)?74)?74)?'0)?'0)?'0)>W,)>W,)>W,)>G,)>G()>G()>7();&495E!0 M.C>''1O#!`3M``#4>GK=_____?W\[>S>V]F^P\"3CHDX=6X(=6T(=&T(=&T( M=&P(<VP(<VP(<VL(<FL(<FL(<FL(<FH(<6H(<6H(<6D(<&D(<&D(<&D(;V@( M;V@(;V@(;F<(;F<(;F<(;68(;68(;68(;&8(;&4(;&4(;&4(:V0(:V0(:V0( M:F0(:F,(:F,(8FXI7(]R6Y2`8'Y*9685:&$'9V$'9V$'9V`'9V`'9F`'9E\' M9E\'95\'95\'95X'9%X'9%X'9%T'8UT'8UT'8UP'8EP'8EP'8EP'85L'85L' M85L'85H'8%H'8%H'8%H'7UD'7UD'7UD'7E@'7E@'7E@'75<'75<'75<'7%<' M7%8'7%8'7%8&6U4&6U4&6U4&6E4&6E0&6E0&650&65,&65,&6%,&6%(&6%(& M5U(&5U(&5U$&5E$&5E$&5E`&5E`&55`&55`&54\&5$\&5$\&5$X&4TX&4TX& M4TT&4DT&4DT&4DT&44P&44P&44P&44L&4$L&4$L&4$L&3TH&3TH&3TH&3DD% M3DD%3DD%34@%34@%34@%3$@%3$<%3$<%2T<%2T8%2T8%2T8%2D4%2D4%2D4% M244%240%240%2$0%2$,%2$,%1T,%1T,%1T(%1D(%1D(%1D$%1D$%14$%14`% M14`%1$`%1$`%1#\%0S\%0S\%0SX%0CX%0CX%0CX%03T%03T$03T$0#P$0#P$ M0#P$0#L$/SL$/SL$/SL$/CH$/CH$/CH$/3D$/3D$/3D$/#D$/#@$/#@$.S@$ M.S<$.S<$.S<$.C8$.C8$.C8$.38$.34$.34$.#4$.#0$.#0$-S0$-S0$-S,$ M-C,$-C,$-C($-3($-3($-3$$-3$$-#$$-#$#-#`#,S`#,S`#,R\#,B\#,B\# M``"@E@R@E@R?E0R?E0R?E0R>E`R>E`R>E`R>E`R=DPN=DPN=DPN<D@N<D@N< MD@N;D0N;D0N;D0N:D0N:D`N:D`N9D`N9CPN9CPN9CPN8CPN8C@N8C@N7C@N7 MC0N7C0N6C0N6C`N6C`N5C`N5C`N5BPN4BPN4BPN4B@N3B@N3B@N3B@N3B0N2 MB0N2B0N2B`N1B`N1B`N1APN0APN0APJ0APJ/A@J/A@J/A@J.A0J.A0J.A0J. MA0J-A`J-A`J-A`J,@PJ,@PJ,@PJ+@@J+@@J+@@J*@@J*@0J*@0J)@0J)@`J) M@`J(@`J(@`J(?PJ(?PJ'?PJ'?@J'?@J&?@J&?0J&?0J%?0J%?0J%?`J$?`J$ M?`J$>PJ#>PJ#>PF#>PF#>@F">@F">@F">0F!>0F!>0F!>`F`>`F`>`F`>`E_ M=PE_=PE_=PE^=@E^=@E^=@E]=@E]=0E]=0E]=0E\=`E\=`E\=`E[<PE[<PE[ M<PEZ<PEZ<@EZ<@EM9Q9?63Y'0FXA'[L"`NT$!,^1D>/^_OWZ^O;KZMO>W,/& MPI>1BCIU;@AU;@AU;0AT;0AT;0AT;`AS;`AS;`AS;`AR:PAR:PAR:PAR:@AQ M:@AQ:@AQ:0AP:0AP:0AP:0AO:`AO:`AO:`AN9PAN9PAN9PAM9PAM9@AM9@AM M9@AL90AL90AL90AK9`AK9`AK9`AJ9`AJ8PAF8P]@:2)@;B]D:R!G8PQH8@=H M80=G80=G80=G8`=G8`=F8`=F7P=F7P=E7P=E7P=E7@=D7@=D7@=D70=C70=C M70=C7`=B7`=B7`=B7`=B6P=A6P=A6P=A6@=@6@=@6@=@6@=?60=?60=?60=> M6`=>6`=>6`==5P==5P==5P=<5P=<5@=<5@=<5@9;509;509;509:509:5`9: M5`995`994P994P984P984@984@974@974@974097409640964`964`954`95 M4`953P943P943P943@933@933@9330923092309230913`913`913`912P90 M2P902P902P9/2@9/2@9/2@9.205.205.205-2`5-2`5-2`5,2`5,1P5,1P5, M1P5+1@5+1@5+1@5*1@5*105*105)105)1`5)1`5(1`5(0P5(0P5'0P5'0P5' M0@5&0@5&0@5&005&005%005%005%0`5$0`5$0`5$/P5#/P5#/P5#/@5"/@5" M/@5"/@5!/05!/01!/01!/`1`/`1`/`1`/`0_.P0_.P0_.P0^.@0^.@0^.@0] M.00].00].00\.00\.`0\.`0\.`0[-P0[-P0[-P0Z-P0Z-@0Z-@0Y-@0Y-00Y M-00X-00X-`0X-`0W-`0W-`0W,P0V,P0V,P0V,@0V,@0U,@0U,@0U,00T,00T M,0,T,`,S,`,S,`,S+P,R+P,``*"6#*"6#*"6#)^5#)^5#)^5#)^4#)Z4#)Z4 M#)Z4#)V3"YV3"YV3"YR2"YR2"YR2"YN2"YN1"YN1"YJ1"YJ0"YJ0"YJ0"YF/ M"YF/"YF/"YB/"YB."YB."Y>."Y>-"Y>-"Y:-"Y:-"Y:,"Y6,"Y6,"Y6+"Y2+ M"Y2+"Y2*"Y2*"Y.*"Y.*"Y.)"Y*)"Y*)"Y*("Y&("Y&("Y&("Y"'"Y"'"I"' M"H^&"H^&"H^&"H^%"HZ%"HZ%"HZ%"HV$"HV$"HV$"HR#"HR#"HR#"HN#"HN" M"HN""HJ""HJ!"HJ!"HF!"HF`"HF`"HF`"HB`"HA_"HA_"H=_"H=^"H=^"H9^ M"H9^"H9]"H5]"H5]"H5\"H1\"H1\"H1["H1["H-["H-["8-Z"8)Z"8)Z"8)Y M"8%Y"8%Y"8%Y"8!X"8!X"8!X"7]W"7]W"7]W"7YV"7YV"7YV"7YV"7UU"7UU M"7UU"7QT"7QT"7QT"7MT"7MS"7MS"7IS"7IR"7)J#VAB)%5/4B(@N@("Z145 MS+"PZO7T[>;ETN'?R-K7N[^\C(R%,G9N"'5N"'5N"'5M"'1M"'1M"'1L"'-L M"'-L"'-L"'-K"')K"')K"')J"'%J"'%J"'%I"'!I"'!I"'!I"&]H"&]H"&]H M"&YG"&YG"&YG"&YG"&UF"&UF"&UF"&QE"&QE"&QE"&MD"&MD"&MD"&ID"&IC M"&IC"&EC"&EB"&EB!VAB!VAB!VAA!VAA!V=A!V=@!V=@!V9@!V9?!V9?!V5? M!V5?!V5>!V1>!V1>!V1=!V-=!V-=!V-=!V-<!V)<!V)<!V);!V%;!V%;!V%: M!V!:!V!:!V!:!U]9!U]9!U]9!UY8!UY8!UY8!UU8!UU7!UU7!UU7!UQ6!UQ6 M!UQ6!EM5!EM5!EM5!EI5!EI4!EI4!EE4!EE3!EE3!EA3!EA3!EA2!EA2!E=2 M!E=1!E=1!E91!E90!E90!E50!E50!E5/!E1/!E1/!E1.!E-.!E-.!E-.!E)- M!E)-!E)-!E),!E%,!E%,!E%+!E!+!E!+!E!+!D]*!D]*!D]*!DY)!4Y)!4Y) M!4U)!4U(!4U(!4U(!4Q'!4Q'!4Q'!4M&!4M&!4M&!4I&!4I%!4I%!4E%!4E$ M!4E$!4A$!4A$!4A#!4=#!4=#!4="!4="!49"!49!!49!!45!!45!!45`!41` M!41`!40_!4,_!4,_!4,_!4(^!4(^!4(^!4(]!4$]!$$]!$$\!$`\!$`\!$`\ M!#\[!#\[!#\[!#XZ!#XZ!#XZ!#TZ!#TY!#TY!#PY!#PX!#PX!#PX!#LW!#LW M!#LW!#HW!#HV!#HV!#DV!#DU!#DU!#@U!#@U!#@T!#<T!#<T!#<S!#<S!#8S M!#8R!#8R!#4R!#4R!#4Q!#0Q!#0Q`S0P`S,P`S,P`S,P`P``H9<,H)8,H)8, MH)8,H)4,GY4,GY4,GY4,GI0,GI0,GI0,G9,+G9,+G9,+G)(+G)(+G)(+FY(+ MFY$+FY$+FI$+FI`+FI`+FI`+F9`+F8\+F8\+F(\+F(X+F(X+EXX+EXT+EXT+ MEHT+EHT+EHP+E8P+E8P+E8L+E8L+E(L+E(L+E(H+DXH+DXH+DXD+DHD+DHD+ MDH@+D8@+D8@+D8@+D(<+D(<*D(<*CX8*CX8*CX8*CX4*CH4*CH4*CH4*C80* MC80*C80*C(,*C(,*C(,*BX,*BX(*BX(*BH(*BH$*BH$*BH$*B8`*B8`*B8`* MB(`*B'\*B'\*AW\*AWX*AWX*AGX*AGX*AGT*A7T*A7T*A7P*A'P*A'P*A'L* MA'L*@WL*@WL)@WH)@GH)@GH)@GD)@7D)@7D)@7D)@'@)@'@)@'@)?W<)?W<) M?W<)?W8)?G8)?G8)?G8)?74)?74)?74)?'0)?'0)?'0)>W0)>W,)>W,)>G,) M=V\*<&D275A"&QG('1WD:6G-W-SQX-['P+R,NK>#M+!XH)I3@7L?=F\)=FX( M=6X(=6X(=6T(=&T(=&T(=&P(=&P(<VP(<VP(<VL(<FL(<FL(<FH(<6H(<6H( M<6H(<&D(<&D(<&D(;V@(;V@(;V@(;F<(;F<(;F<(;F<(;68(;68(;68(;&4( M;&4(;&4(:V4(:V0(:V0(:F0(:F,(:F,(:6,(:6((:6((:6(':&(':&$':&$' M9V$'9V`'9V`'9F`'9F`'9E\'95\'95\'95X'9%X'9%X'9%T'8UT'8UT'8UT' M8UP'8EP'8EP'8EL'85L'85L'85L'8%H'8%H'8%H'7UD'7UD'7UD'7E@'7E@' M7E@'7E@'75<'75<'75<'7%8'7%8'7%8&6U8&6U4&6U4&6E4&6E0&6E0&650& M65,&65,&6%,&6%,&6%(&6%(&5U(&5U$&5U$&5E$&5E$&5E`&55`&55`&54\& M5$\&5$\&5$X&4TX&4TX&4TX&4TT&4DT&4DT&4DP&44P&44P&44P&4$L&4$L& M4$L&3TH&3TH&3TH&3DD%3DD%3DD%34D%34@%34@%34@%3$<%3$<%3$<%2T<% M2T8%2T8%2D8%2D4%2D4%244%240%240%2$0%2$0%2$,%2$,%1T,%1T(%1T(% M1D(%1D$%1D$%14$%14$%14`%1$`%1$`%1#\%0S\%0S\%0S\%0SX%0CX%0CX% M0CT%03T$03T$03P$0#P$0#P$0#P$/SL$/SL$/SL$/CH$/CH$/CH$/3H$/3D$ M/3D$/3D$/#@$/#@$/#@$.S<$.S<$.S<$.C<$.C8$.C8$.38$.34$.34$.#4$ M.#4$.#0$.#0$-S0$-S,$-S,$-C,$-C($-C($-3($-3($-3$$-#$$-#$#-#`# M,S`#,S`#``"AEPRAEPRAE@R@E@R@E@R@E0R?E0R?E0R?E0R>E`R>E`R>E`R= MDPN=DPN=DPN<D@N<D@N<D@N;D@N;D0N;D0N;D0N:D`N:D`N:D`N9D`N9CPN9 MCPN8CPN8C@N8C@N7C@N7C0N7C0N6C0N6C0N6C`N6C`N5C`N5BPN5BPN4BPN4 MBPN4B@N3B@N3B@N3B0N2B0N2B0N2B`N1B`N1B`N1B`N0APN0APJ0APJ0A@J/ MA@J/A@J/A@J.A0J.A0J.A0J-A`J-A`J-A`J,@PJ,@PJ,@PJ+@PJ+@@J+@@J+ M@@J*@0J*@0J*@0J)@0J)@`J)@`J(@`J(?PJ(?PJ'?PJ'?@J'?@J&?@J&?@J& M?0J%?0J%?0J%?`J%?`J$?`J$?`J$>PJ#>PJ#>PF#>@F">@F">@F">0F!>0F! M>0F!>0F`>`F`>`F`>`F`=PE_=PE_=PE_=PE^=@E^=@E^=@E]=0E]=0E]=0E\ M=`E\=`E\=`E[=`E[<PE[<PEZ<PEU;@M=5T0.#>)@8.#$Q-CS\_;4TK&>F5:) M@BV(@B>!>1MY<0YV;PEV;PEV;@AU;@AU;@AU;0AU;0AT;0AT;0AT;`AS;`AS M;`AS:PAR:PAR:PAR:@AQ:@AQ:@AQ:@AP:0AP:0AP:0AO:`AO:`AO:`AO:`AN M9PAN9PAN9PAM9@AM9@AM9@AL90AL90AL90AK90AK9`AK9`AJ9`AJ8PAJ8PAJ M8PAI8PAI8@AI8@=H8@=H80=H80=G80=G8`=G8`=F8`=F8`=F7P=E7P=E7P=E M7@=D7@=D7@=D7@=D70=C70=C70=C7`=B7`=B7`=B6P=A6P=A6P=A6P=@6@=@ M6@=@6@=?60=?60=?60=?6`=>6`=>6`=>6`==5P==5P==5P=<5@=<5@=<5@=; M5@9;509;509:509:5`9:5`995`994P994P994P984P984@984@974@974097 M4096409640964`954`954`953P943P943P943@943@933@933@9330923092 M30923`913`913`913`902P902P902P9/2@9/2@9/2@9.205.205.205.205- M2`5-2`5-2`5,1P5,1P5,1P5+1P5+1@5+1@5*1@5*105*105)105)1`5)1`5) M1`5(1`5(0P5(0P5'0P5'0@5'0@5&0@5&0@5&005%005%005%0`5$0`5$0`5$ M/P5#/P5#/P5#/P5#/@5"/@5"/@5"/05!/01!/01!/01`/`1`/`1`/`0_.P0_ M.P0_.P0^.@0^.@0^.@0^.@0].00].00].00\.`0\.`0\.`0[.`0[-P0[-P0Z M-P0Z-@0Z-@0Y-@0Y-00Y-00X-00X-00X-`0X-`0W-`0W,P0W,P0V,P0V,P0V M,@0U,@0U,@0U,00T,00T,0,T,`,S,`,``*&7#*&7#*&7#*&6#*"6#*"6#*"5 M#)^5#)^5#)^5#)Z4#)Z4#)Z4#)V3"YV3"YV3"YR3"YR2"YR2"YR2"YN1"YN1 M"YN1"YJ0"YJ0"YJ0"YF0"YF/"YF/"YB/"YB."YB."Y>."Y>."Y>-"Y:-"Y:- M"Y:,"Y:,"Y6,"Y6+"Y6+"Y2+"Y2+"Y2*"Y.*"Y.*"Y.)"Y*)"Y*)"Y*)"Y&( M"Y&("Y&("Y&'"Y"'"I"'"I"&"H^&"H^&"H^&"HZ%"HZ%"HZ%"HV$"HV$"HV$ M"HR$"HR#"HR#"HN#"HN""HN""HN""HJ!"HJ!"HJ!"HF!"HF`"HF`"HB`"HA_ M"HA_"H=_"H=_"H=^"H9^"H9^"H9]"H9]"H5]"H5\"H5\"H1\"H1\"H1["H-[ M"H-["8-Z"8)Z"8)Z"8)Z"8%Y"8%Y"8%Y"8!X"8!X"8!X"8!W"7]W"7]W"7]W M"7YV"7YV"7YV"7UU"7UU"7UU"7QU"7QT"7QT"G5N$7)J$W%J$6QE&$I%80T- MZ965V=_?W_CX^-32L:BD8G-K#7AP"7=P"7=O"7=O"79O"79O"79N"'5N"'5N M"'5M"'5M"'1M"'1M"'1L"'-L"'-L"'-K"')K"')K"')J"'%J"'%J"'%J"'!I M"'!I"'!I"'!H"&]H"&]H"&]H"&YG"&YG"&YG"&UF"&UF"&UF"&QE"&QE"&QE M"&ME"&MD"&MD"&ID"&IC"&IC"&IC"&EC"&EB"&EB!VAB!VAA!VAA!V=A!V=@ M!V=@!V9@!V9@!V9?!V5?!V5?!V5>!V5>!V1>!V1>!V1=!V-=!V-=!V-<!V)< M!V)<!V);!V%;!V%;!V%;!V!:!V!:!V!:!U]9!U]9!U]9!U]9!UY8!UY8!UY8 M!UU7!UU7!UU7!UQ6!UQ6!UQ6!UM6!EM5!EM5!EI5!EI4!EI4!EI4!EE4!EE3 M!EE3!EA3!EA2!EA2!E=2!E=1!E=1!E91!E91!E90!E50!E50!E5/!E1/!E1/ M!E1/!E1.!E-.!E-.!E--!E)-!E)-!E),!E%,!E%,!E%,!E!+!E!+!E!+!D]* M!D]*!D]*!D]*!DY)!4Y)!4Y)!4U(!4U(!4U(!4Q'!4Q'!4Q'!4M'!4M&!4M& M!4I&!4I%!4I%!4E%!4E%!4E$!4E$!4A$!4A#!4A#!4=#!4="!4="!49"!49" M!49!!45!!45!!45`!41`!41`!41`!40_!4,_!4,_!4,^!4(^!4(^!4(]!4$] M!$$]!$$]!$`\!$`\!$`\!#\[!#\[!#\[!#\[!#XZ!#XZ!#XZ!#TY!#TY!#TY M!#PX!#PX!#PX!#LX!#LW!#LW!#HW!#HV!#HV!#DV!#DV!#DU!#DU!#@U!#@T M!#@T!#<T!#<S!#<S!#8S!#8S!#8R!#4R!#4R!#4Q!#0Q!#0Q`S0Q`P``HI@, MHI<,H9<,H9<,H98,H)8,H)8,H)8,GY4,GY4,GY4,GI0,GI0,GI0,G9,+G9,+ MG9,+G9,+G)(+G)(+G)(+FY$+FY$+FY$+FI$+FI`+FI`+F9`+F8\+F8\+F(\+ MF(X+F(X+EXX+EXX+EXT+EXT+EHT+EHP+EHP+E8P+E8P+E8L+E(L+E(L+E(H+ MDXH+DXH+DXD+DHD+DHD+DHD+DH@+D8@+D8@+D8<+D(<*D(<*D(<*CX8*CX8* MCX8*CH4*CH4*CH4*C80*C80*C80*C(0*C(,*C(,*C(,*BX(*BX(*BX(*BH$* MBH$*BH$*B8$*B8`*B8`*B(`*B'\*B'\*AW\*AW\*AWX*AWX*AGX*AGT*AGT* MA7T*A7P*A7P*A'P*A'P*A'L*@WL*@WL)@WH)@GH)@GH)@GH)@7D)@7D)@7D) M@7@)@'@)@'@)@'<)?W<)?W<)?W<)?G8)?G8)?G8)?74)?74)?74)?'4)>W,+ M;F<>9F`I7E@T34A/)R24("#8I*33X^/C]/3QU]2ULJUQ=&X3>'`)>'`)=W`) M=W`)=V\)=F\)=F\)=FX(=FX(=6X(=6T(=6T(=&T(=&T(=&P(<VP(<VP(<VL( M<FL(<FL(<FL(<6H(<6H(<6H(<6D(<&D(<&D(<&@(;V@(;V@(;V@(;F<(;F<( M;F<(;68(;68(;68(;&8(;&4(;&4(:V4(:V0(:V0(:V0(:F,(:F,(:F,(:6,( M:6((:6(':&(':&$':&$'9V$'9V$'9V`'9F`'9F`'9E\'9E\'95\'95X'95X' M9%X'9%X'9%T'8UT'8UT'8UP'8EP'8EP'8EP'85L'85L'85L'8%H'8%H'8%H' M8%D'7UD'7UD'7UD'7E@'7E@'7E@'75<'75<'75<'7%<'7%8'7%8'6U8&6U4& M6U4&6U4&6E0&6E0&6E0&650&65,&65,&6%,&6%(&6%(&5U(&5U(&5U$&5E$& M5E$&5E`&55`&55`&54\&54\&5$\&5$\&5$X&4TX&4TX&4TT&4DT&4DT&4DT& M44P&44P&44P&4$L&4$L&4$L&4$H&3TH&3TH&3TH&3DD%3DD%3DD%34@%34@% M34@%3$@%3$<%3$<%2T<%2T8%2T8%2D8%2D4%2D4%2D4%244%240%240%2$0% M2$,%2$,%1T,%1T,%1T(%1D(%1D(%1D$%14$%14$%14`%14`%1$`%1$`%1#\% M0S\%0S\%0SX%0CX%0CX%0CT%03T%03T$03T$0#P$0#P$0#P$/SL$/SL$/SL$ M/SL$/CH$/CH$/CH$/3D$/3D$/3D$/#@$/#@$/#@$.S@$.S<$.S<$.C<$.C8$ M.C8$.C8$.38$.34$.34$.#4$.#0$.#0$-S0$-S,$-S,$-C,$-C,$-C($-3($ M-3($-3$$-#$$-#$$``"BF`RBF`RBEPRAEPRAEPRAE@R@E@R@E@R@E@R?E0R? ME0R?E0R>E`R>E`R>E`R=DPN=DPN=DPN=DPN<D@N<D@N<D@N;D0N;D0N;D0N: MD0N:D`N:D`N9D`N9CPN9CPN8CPN8C@N8C@N8C@N7C@N7C0N7C0N6C0N6C`N6 MC`N5C`N5C`N5BPN4BPN4BPN4B@N3B@N3B@N3B0N2B0N2B0N2B0N2B`N1B`N1 MB`N1APN0APJ0APJ0APJ/A@J/A@J/A@J.A0J.A0J.A0J-A`J-A`J-A`J-A`J, M@PJ,@PJ,@PJ+@@J+@@J+@@J*@@J*@0J*@0J)@0J)@`J)@`J(@`J(?PJ(?PJ' M?PJ'?PJ'?@J'?@J&?@J&?0J&?0J%?0J%?0J%?`J$?`J$?`J$>PJ#>PJ#>PF# M>@F">@F">@F">@F">0F!>0F!>0F!>`F`>`F`>`F`>`E_=PE_=PE_=PE^=@E^ M=@E^=@E]=0E]=0E]=0EZ<PMO:!Q@6C))150C((T(![HT-,6UM='@W]?=V\/& MPY>MJ&EW<!9X<0EX<`EX<`EW<`EW<`EW;PEW;PEV;PEV;@AV;@AU;@AU;@AU M;0AT;0AT;0AT;`AS;`AS;`AS:PAR:PAR:PAR:PAQ:@AQ:@AQ:@AQ:0AP:0AP M:0AP:0AO:`AO:`AO:`AN9PAN9PAN9PAM9@AM9@AM9@AL9@AL90AL90AL90AK M9`AK9`AK9`AJ9`AJ8PAJ8PAI8PAI8@AI8@=H8@=H80=H80=G80=G80=G8`=F M8`=F8`=F7P=F7P=E7P=E7P=E7@=D7@=D7@=D70=C70=C70=C7`=B7`=B7`=B M7`=A6P=A6P=A6P=A6@=@6@=@6@=@6@=?60=?60=?60=>6`=>6`=>6`==5P== M5P==5P=<5P=<5@=<5@=;5@9;509;509;509:5`9:5`9:5`995`994P994P98 M4P984@984@974@974@974096409640964`964`954`953P953P943P943P94 M3@933@933@9330923092309230913`913`913`902P902P902P902@9/2@9/ M2@9/2@9.205.205.205-2`5-2`5-2`5,2`5,1P5,1P5+1P5+1@5+1@5+1@5* M105*105*105)105)1`5)1`5(1`5(0P5(0P5'0P5'0P5'0@5&0@5&0@5&005& M005%005%0`5%0`5$0`5$0`5$/P5#/P5#/P5#/@5"/@5"/@5"/@5!/05!/01! M/01`/`1`/`1`/`1`.P0_.P0_.P0_.P0^.@0^.@0^.@0].00].00].00\.00\ M.`0\.`0[.`0[-P0[-P0[-P0Z-@0Z-@0Z-@0Y-@0Y-00Y-00X-00X-`0X-`0W M-`0W-`0W,P0V,P0V,P0V,@0U,@0U,@0U,00U,00``*.8#**8#**8#**7#*&7 M#*&7#*&6#*"6#*"6#*"6#)^5#)^5#)^5#)Z4#)Z4#)Z4#)Z4#)V3"YV3"YV3 M"YR2"YR2"YR2"YN1"YN1"YN1"YJ1"YJ0"YJ0"YF0"YF/"YF/"YF/"YB/"YB. M"YB."Y>."Y>-"Y>-"Y:-"Y:,"Y:,"Y6,"Y6,"Y6+"Y2+"Y2+"Y2*"Y.*"Y.* M"Y.*"Y.)"Y*)"Y*)"Y*("Y&("Y&("Y&'"Y"'"Y"'"I"'"H^&"H^&"H^&"HZ% M"HZ%"HZ%"HZ%"HV$"HV$"HV$"HR#"HR#"HR#"HN""HN""HN""HJ""HJ!"HJ! M"HF!"HF`"HF`"HB`"HB`"HA_"HA_"H=_"H=^"H=^"H9^"H9]"H9]"H5]"H5] M"H5\"H1\"H1\"H1["H-["H-["8-["8-Z"8)Z"8)Z"8)Y"8%Y"8%Y"8%X"8!X M"8!X"8!X"7]W"7]W"7]W"7YV"7YV"7YV"7UV"7UU"7MS"GIR#F=@*#PX:`T, MM"HJPH2$T-K9WLS*J*^J;**=5)>207IS%7EQ"7AQ"7AQ"7AP"7AP"7=P"7=O M"7=O"79O"79N"'9N"'5N"'5N"'5M"'1M"'1M"'1L"'-L"'-L"'-K"')K"')K M"')K"')J"'%J"'%J"'%I"'!I"'!I"'!I"&]H"&]H"&]H"&YG"&YG"&YG"&UF M"&UF"&UF"&UF"&QE"&QE"&QE"&MD"&MD"&MD"&ID"&IC"&IC"&EC"&EB"&EB M!VAB!VAA!VAA!V=A!V=A!V=@!V=@!V9@!V9?!V9?!V5?!V5?!V5>!V1>!V1> M!V1=!V-=!V-=!V-<!V)<!V)<!V)<!V);!V%;!V%;!V%:!V!:!V!:!V!:!U]9 M!U]9!U]9!UY8!UY8!UY8!UU7!UU7!UU7!UQ7!UQ6!UQ6!UQ6!EM5!EM5!EM5 M!EI5!EI4!EI4!EE4!EE3!EE3!EA3!EA2!EA2!E=2!E=2!E=1!E=1!E91!E90 M!E90!E50!E50!E5/!E1/!E1/!E1.!E-.!E-.!E--!E)-!E)-!E)-!E%,!E%, M!E%,!E%+!E!+!E!+!E!+!D]*!D]*!D]*!DY)!4Y)!4Y)!4U(!4U(!4U(!4Q( M!4Q'!4Q'!4Q'!4M&!4M&!4M&!4I&!4I%!4I%!4E%!4E$!4E$!4A$!4A#!4A# M!4=#!4=#!4="!49"!49"!49!!49!!45!!45!!45`!41`!41`!40_!4,_!4,_ M!4,^!4(^!4(^!4(^!4$]!4$]!$$]!$$\!$`\!$`\!$`\!#\[!#\[!#\[!#XZ M!#XZ!#XZ!#TY!#TY!#TY!#PY!#PX!#PX!#LX!#LW!#LW!#LW!#HW!#HV!#HV M!#DV!#DU!#DU!#@U!#@T!#@T!#<T!#<T!#<S!#8S!#8S!#8R!#8R!#4R!#4R M!```HYD,HY@,HI@,HI@,HI<,H9<,H9<,H9<,H)8,H)8,H)8,GY4,GY4,GY4, MGY0,GI0,GI0,GI0,G9,+G9,+G9,+G)(+G)(+G)(+FY(+FY$+FY$+FI$+FI`+ MFI`+F9`+F8\+F8\+F8\+F(\+F(X+F(X+EXX+EXT+EXT+EHT+EHT+EHP+E8P+ ME8P+E8L+E(L+E(L+E(H+E(H+DXH+DXH+DXD+DHD+DHD+DH@+D8@+D8@+D8@+ MD(<+D(<*D(<*CX8*CX8*CX8*CH4*CH4*CH4*CH4*C80*C80*C80*C(,*C(,* MC(,*BX,*BX(*BX(*BH(*BH$*BH$*B8$*B8`*B8`*B8`*B(`*B'\*B'\*AW\* MAWX*AWX*AGX*AGT*AGT*A7T*A7T*A7P*A'P*A'P*A'L*@WL*@WL*@WL)@WH) M@GH)@GH)@GD)@7D)@7D)@7@)@'@)@'@)@'@)?W<)?W<)?W<)?G8)?G8)?G8) M?G8)?'0)>W,+;V@=-3)Q&QO"@X/)T-#A[^[FNK9_BH0I>7$1>G,1>'(,>7$) M>7$)>'$)>'$)>'`)>'`)=W`)=V\)=V\)=F\)=FX(=FX(=6X(=6X(=6T(=&T( M=&T(=&P(<VP(<VP(<VP(<VL(<FL(<FL(<FH(<6H(<6H(<6D(<&D(<&D(<&D( M;V@(;V@(;V@(;F<(;F<(;F<(;6<(;68(;68(;68(;&4(;&4(;&4(:V0(:V0( M:V0(:F0(:F,(:F,(:6,(:6((:6(':&(':&(':&$':&$'9V$'9V`'9V`'9F`' M9E\'9E\'95\'95\'95X'9%X'9%X'9%T'8UT'8UT'8UT'8EP'8EP'8EP'8EL' M85L'85L'85H'8%H'8%H'8%H'7UD'7UD'7UD'7E@'7E@'7E@'75@'75<'75<' M75<'7%8'7%8'7%8&6U4&6U4&6U4&6E4&6E0&6E0&650&65,&65,&6%,&6%,& M6%(&5U(&5U(&5U$&5U$&5E$&5E`&5E`&55`&55`&54\&5$\&5$\&5$X&4TX& M4TX&4TX&4DT&4DT&4DT&4DP&44P&44P&44L&4$L&4$L&4$L&3TH&3TH&3TH& M3DD%3DD%3DD%34D%34@%34@%34@%3$<%3$<%3$<%2T8%2T8%2T8%2D8%2D4% M2D4%244%240%240%2$0%2$0%2$,%1T,%1T,%1T(%1T(%1D(%1D$%1D$%14$% M14$%14`%1$`%1$`%1#\%0S\%0S\%0S\%0CX%0CX%0CX%0CT%03T$03T$03P$ M0#P$0#P$0#P$/SL$/SL$/SL$/CH$/CH$/CH$/3D$/3D$/3D$/#D$/#@$/#@$ M/#@$.S<$.S<$.S<$.C<$.C8$.C8$.38$.34$.34$.#4$.#0$.#0$-S0$-S0$ M-S,$-S,$-C,$-C($-C($-3($``"CF0RCF0RCF`RBF`RBF`RBEPRAEPRAEPRA MEPR@E@R@E@R@E@R@E0R?E0R?E0R?E`R>E`R>E`R>E`R=DPN=DPN=DPN<D@N< MD@N<D@N;D@N;D0N;D0N:D0N:D`N:D`N:D`N9CPN9CPN9CPN8CPN8C@N8C@N7 MC@N7C0N7C0N6C0N6C0N6C`N5C`N5C`N5BPN5BPN4BPN4B@N4B@N3B@N3B@N3 MB0N2B0N2B0N2B`N1B`N1B`N1B`N0APN0APJ0APJ/A@J/A@J/A@J/A0J.A0J. MA0J.A0J-A`J-A`J-A`J,@PJ,@PJ,@PJ+@PJ+@@J+@@J*@@J*@0J*@0J*@0J) M@`J)@`J)@`J(@`J(?PJ(?PJ'?PJ'?@J'?@J&?@J&?@J&?0J%?0J%?0J%?`J$ M?`J$?`J$>PJ$>PJ#>PJ#>PF#>@F">@F">@F">0F!>0F!>0F!>0F`>`F`>`F` M>`E_=PE_=PE_=PE_=@E]=0I[<PM[<PMW;P]F7RLG)8E&1LG)R=+KZ^OO[^*Y MM'R0B3!X<@QZ<@EZ<@EY<@EY<0EY<0EY<0EX<0EX<`EX<`EW<`EW;PEW;PEV M;PEV;PEV;@AU;@AU;@AU;0AT;0AT;0AT;`AT;`AS;`AS;`AS:PAR:PAR:PAR M:@AQ:@AQ:@AQ:@AP:0AP:0AP:0AO:`AO:`AO:`AN9PAN9PAN9PAN9PAM9@AM M9@AM9@AL90AL90AL90AK90AK9`AK9`AJ9`AJ8PAJ8PAI8PAI8@AI8@=I8@=H M8@=H80=H80=G80=G8`=G8`=F8`=F8`=F7P=E7P=E7P=E7@=D7@=D7@=D70=C M70=C70=C70=C7`=B7`=B7`=B6P=A6P=A6P=A6P=@6@=@6@=@6@=?60=?60=? M60=>6`=>6`=>6`=>6`==5P==5P==5P=<5@=<5@=<5@9;5@9;509;509:509: M5`9:5`995`994P994P984P984P984@984@974@974097409640964`964`95 M4`954`953P943P943P943@933@933@933@933092309230923`913`913`91 M2P902P902P902P9/2@9/2@9/2@9.205.205.205-205-2`5-2`5-2`5,1P5, M1P5,1P5+1@5+1@5+1@5*1@5*105*105)105)1`5)1`5(1`5(1`5(0P5(0P5' M0P5'0@5'0@5&0@5&005&005%005%005%0`5$0`5$0`5$/P5#/P5#/P5#/P5" M/@5"/@5"/@5"/05!/01!/01!/`1`/`1`/`1`/`0_.P0_.P0_.P0^.@0^.@0^ M.@0].@0].00].00].00\.`0\.`0\.`0[-P0[-P0[-P0Z-P0Z-@0Z-@0Y-@0Y M-00Y-00X-00X-00X-`0W-`0W-`0W,P0W,P0V,P0V,@0V,@0``*29#*.9#*.9 M#*.8#**8#**8#**7#*&7#*&7#*&7#*"6#*"6#*"6#*"5#)^5#)^5#)^5#)Z4 M#)Z4#)Z4#)V3"YV3"YV3"YR2"YR2"YR2"YN2"YN1"YN1"YN1"YJ0"YJ0"YJ0 M"YF0"YF/"YF/"YB/"YB."YB."Y>."Y>-"Y>-"Y:-"Y:-"Y:,"Y6,"Y6,"Y6+ M"Y6+"Y2+"Y2+"Y2*"Y.*"Y.*"Y.)"Y*)"Y*)"Y*("Y&("Y&("Y&("Y"'"Y"' M"I"'"I"&"H^&"H^&"H^&"HZ%"HZ%"HZ%"HV$"HV$"HV$"HR#"HR#"HR#"HN# M"HN""HN""HJ""HJ!"HJ!"HJ!"HF!"HF`"HF`"HB`"HA_"HA_"H=_"H=^"H=^ M"H9^"H9^"H9]"H5]"H5]"H5\"H5\"H1\"H1\"H1["H-["H-["8-Z"8)Z"8)Z M"8)Y"8%Y"8%Y"8%Y"8!X"8!X"8!X"7]W"7]W"7]W"7QT"GAP$G5M%FMD)$=" M7!$0N65EUM+2V/#P\.CGU;FU?):0.WMT$'IS"7IR"7IR"7IR"7ER"7EQ"7EQ M"7AQ"7AP"7AP"7=P"7=O"7=O"79O"79O"79N"'5N"'5N"'5M"'1M"'1M"'1M M"'1L"'-L"'-L"'-K"')K"')K"')J"'%J"'%J"'%J"'!I"'!I"'!I"&]H"&]H M"&]H"&]G"&YG"&YG"&YG"&UF"&UF"&UF"&QE"&QE"&QE"&ME"&MD"&MD"&ID M"&IC"&IC"&EC"&EB"&EB"&EB!VAB!VAA!VAA!V=A!V=@!V=@!V9@!V9@!V9? M!V5?!V5?!V5>!V1>!V1>!V1=!V1=!V-=!V-=!V-<!V)<!V)<!V);!V%;!V%; M!V%;!V!:!V!:!V!:!U]9!U]9!U]9!UY8!UY8!UY8!UY8!UU7!UU7!UU7!UQ6 M!UQ6!UQ6!UM6!EM5!EM5!EI5!EI4!EI4!EE4!EE3!EE3!EE3!EA3!EA2!EA2 M!E=2!E=1!E=1!E91!E91!E90!E50!E50!E5/!E1/!E1/!E1.!E-.!E-.!E-. M!E--!E)-!E)-!E),!E%,!E%,!E%,!E!+!E!+!E!+!D]*!D]*!D]*!DY)!4Y) M!4Y)!4Y)!4U(!4U(!4U(!4Q'!4Q'!4Q'!4M'!4M&!4M&!4I&!4I%!4I%!4E% M!4E$!4E$!4E$!4A$!4A#!4A#!4=#!4="!4="!49"!49"!49!!45!!45!!45` M!41`!41`!40_!4,_!4,_!4,_!4,^!4(^!4(^!4(]!4$]!$$]!$$]!$`\!$`\ M!$`\!#\[!#\[!#\[!#XZ!#XZ!#XZ!#XZ!#TY!#TY!#TY!#PX!#PX!#PX!#LX M!#LW!#LW!#HW!#HV!#HV!#DV!#DU!#DU!#@U!#@U!#@T!#@T!#<T!#<S!#<S M!#8S!#8S!```I)H,I)D,HYD,HYD,HY@,HI@,HI@,HI@,H9<,H9<,H9<,H98, MH)8,H)8,H)4,GY4,GY4,GY4,GI0,GI0,GI0,G9,+G9,+G9,+G),+G)(+G)(+ MG)(+FY$+FY$+FY$+FI`+FI`+FI`+F9`+F8\+F8\+F(\+F(X+F(X+EXX+EXX+ MEXT+EHT+EHT+EHP+EHP+E8P+E8L+E8L+E(L+E(L+E(H+DXH+DXH+DXD+DHD+ MDHD+DHD+D8@+D8@+D8@+D8<+D(<*D(<*D(8*CX8*CX8*CX8*CH4*CH4*CH4* MC80*C80*C80*C(0*C(,*C(,*BX,*BX(*BX(*BX(*BH$*BH$*BH$*B8$*B8`* MB8`*B(`*B'\*B'\*AW\*AW\*AWX*AGX*AGX*AGT*AGT*A7T*A7P*A7P*A'P* MA'P*A'L*@WL*@WL)@WH)@GH)@GH)@GD)@7D)@7D)@7D)@'@)@'@)@'@)@'<) M?W<)?W<)<FH76E4]/#AI&QFJ$A+A>WO@V-C9YN79UM.RLJYOEY$]?784>W,) M>W,)>G()>G()>G()>7()>7$)>7$)>'$)>'`)>'`)=W`)=V\)=V\)=F\)=F\) M=FX(=6X(=6X(=6T(=6T(=&T(=&T(=&P(<VP(<VP(<VL(<FL(<FL(<FH(<6H( M<6H(<6H(<&D(<&D(<&D(<&@(;V@(;V@(;V@(;F<(;F<(;F<(;68(;68(;68( M;&4(;&4(;&4(:V4(:V0(:V0(:F0(:F,(:F,(:F,(:6,(:6((:6(':&(':&$' M:&$'9V$'9V`'9V`'9F`'9F`'9E\'95\'95\'95X'95X'9%X'9%X'9%T'8UT' M8UT'8UP'8EP'8EP'8EL'85L'85L'85L'8%H'8%H'8%H'7UD'7UD'7UD'7UD' M7E@'7E@'7E@'75<'75<'75<'7%8'7%8'7%8'6U8&6U4&6U4&6E4&6E0&6E0& M6E0&650&65,&65,&6%,&6%(&6%(&5U(&5U$&5U$&5E$&5E$&5E`&55`&55`& M54\&5$\&5$\&5$\&5$X&4TX&4TX&4TT&4DT&4DT&4DP&44P&44P&44P&4$L& M4$L&4$L&3TH&3TH&3TH&3TH&3DD%3DD%3DD%34@%34@%34@%3$<%3$<%3$<% M2T<%2T8%2T8%2D8%2D4%2D4%244%244%240%240%2$0%2$,%2$,%1T,%1T(% M1T(%1D(%1D(%1D$%14$%14$%14`%1$`%1$`%1$`%1#\%0S\%0S\%0SX%0CX% M0CX%0CT%03T$03T$03T$0#P$0#P$0#P$/SL$/SL$/SL$/CL$/CH$/CH$/CH$ M/3D$/3D$/3D$/#@$/#@$/#@$.S@$.S<$.S<$.C<$.C8$.C8$.38$.34$.34$ M.34$.#4$.#0$.#0$-S0$-S,$-S,$-C,$``"DF@RDF@RDF0RCF0RCF0RCF`RB MF`RBF`RBF`RBEPRAEPRAEPRAE@R@E@R@E@R@E@R?E0R?E0R?E0R>E`R>E`R> ME`R=DPN=DPN=DPN<DPN<D@N<D@N<D@N;D0N;D0N;D0N:D`N:D`N:D`N9D`N9 MCPN9CPN8CPN8C@N8C@N7C@N7C@N7C0N7C0N6C0N6C`N6C`N5C`N5BPN5BPN4 MBPN4BPN4B@N3B@N3B@N3B0N2B0N2B0N2B0N1B`N1B`N1B`N1APN0APJ0APJ0 MA@J/A@J/A@J/A@J.A0J.A0J.A0J-A`J-A`J-A`J,A`J,@PJ,@PJ,@PJ+@@J+ M@@J+@@J*@0J*@0J*@0J)@0J)@`J)@`J(@`J(?PJ(?PJ'?PJ'?PJ'?@J&?@J& M?@J&?0J&?0J%?0J%?`J%?`J$?`J$?`J$>PJ#>PJ#>PF#>@F">@F">@F">@F! M>0F!>0F!>0F!>`F`>`F`>`F`=PE_=PES;!%*1F@8&+X.#N(A(?68F.G:V<W( MQ9VVLG6CG5*2BS)]=Q%[<PE[<PE[<PEZ<@EZ<@EZ<@EY<@EY<0EY<0EX<0EX M<`EX<`EW<`EW<`EW;PEV;PEV;PEV;@AV;@AU;@AU;0AU;0AT;0AT;0AT;`AS M;`AS;`AS:PAR:PAR:PAR:PAQ:@AQ:@AQ:@AP:0AP:0AP:0AP:`AO:`AO:`AO M:`AN9PAN9PAN9PAM9@AM9@AM9@AL9@AL90AL90AK90AK9`AK9`AK9`AJ8PAJ M8PAJ8PAI8PAI8@AI8@=H8@=H80=H80=G80=G80=G8`=F8`=F8`=F7P=E7P=E M7P=E7@=E7@=D7@=D7@=D70=C70=C70=C7`=B7`=B7`=B7`=A6P=A6P=A6P=@ M6@=@6@=@6@=@60=?60=?60=?60=>6`=>6`=>6`==5P==5P==5P=<5P=<5@=< M5@=;5@9;509;509:509:5`9:5`9:5`995`994P994P984P984@984@974@97 M4@974096409640964`954`954`953P953P943P943P943@933@933@933092 M309230923`913`913`913`902P902P902P902@9/2@9/2@9/2@9.205.205. M205-2`5-2`5-2`5,1P5,1P5,1P5+1P5+1@5+1@5*1@5*105*105*105)105) M1`5)1`5(1`5(0P5(0P5'0P5'0@5'0@5&0@5&0@5&005%005%005%0`5%0`5$ M0`5$0`5$/P5#/P5#/P5#/@5"/@5"/@5"/05!/05!/01!/01`/`1`/`1`/`0_ M.P0_.P0_.P0_.P0^.@0^.@0^.@0].00].00].00\.`0\.`0\.`0[.`0[-P0[ M-P0Z-P0Z-@0Z-@0Z-@0Y-@0Y-00Y-00X-00X-`0X-`0W-`0W,P0W,P0``*6: M#*2:#*2:#*29#*.9#*.9#*.8#*.8#**8#**8#**7#*&7#*&7#*&6#*"6#*"6 M#*"6#)^5#)^5#)^5#)Z4#)Z4#)Z4#)V3"YV3"YV3"YV3"YR2"YR2"YR2"YN1 M"YN1"YN1"YJ1"YJ0"YJ0"YF0"YF/"YF/"YB/"YB."YB."YB."Y>."Y>-"Y>- M"Y:-"Y:,"Y:,"Y6,"Y6,"Y6+"Y2+"Y2+"Y2*"Y.*"Y.*"Y.)"Y*)"Y*)"Y*) M"Y*("Y&("Y&("Y&'"Y"'"I"'"I"'"H^&"H^&"H^&"HZ%"HZ%"HZ%"HV$"HV$ M"HV$"HV$"HR#"HR#"HR#"HN""HN""HN""HJ""HJ!"HJ!"HF!"HF`"HF`"HB` M"HA_"HA_"H=_"H=_"H=^"H=^"H9^"H9]"H9]"H5]"H5]"H5\"H1\"H1\"H1[ M"H-["H-["8-Z"8)Z"8)Z"8)Z"8)Y"8%Y"8%Y"8%X"8!X"8!X"8!X"7EQ#(:" M;&MKTB,C\34U^[N[]];4M9N62WIS%'YX%X!Y%GUU#'QT"7MS"7MS"7MS"7IS M"7IR"7IR"7ER"7EQ"7EQ"7AQ"7AP"7AP"7=P"7=P"7=O"7=O"79O"79N"'9N M"'5N"'5N"'5M"'1M"'1M"'1L"'-L"'-L"'-K"')K"')K"')K"'%J"'%J"'%J M"'%I"'!I"'!I"'!I"&]H"&]H"&]H"&YG"&YG"&YG"&UF"&UF"&UF"&QF"&QE M"&QE"&QE"&MD"&MD"&MD"&IC"&IC"&IC"&EC"&EB"&EB!VAB!VAA!VAA!V=A M!V=A!V=@!V9@!V9@!V9?!V9?!V5?!V5>!V5>!V1>!V1>!V1=!V-=!V-=!V-< M!V)<!V)<!V)<!V%;!V%;!V%;!V%:!V!:!V!:!V!9!U]9!U]9!U]9!UY8!UY8 M!UY8!UU7!UU7!UU7!UQ7!UQ6!UQ6!UM6!EM5!EM5!EM5!EI4!EI4!EI4!EE4 M!EE3!EE3!EA3!EA2!EA2!E=2!E=2!E=1!E91!E91!E90!E90!E50!E5/!E5/ M!E1/!E1/!E1.!E-.!E-.!E--!E)-!E)-!E)-!E%,!E%,!E%,!E!+!E!+!E!+ M!E!*!D]*!D]*!D]*!DY)!4Y)!4Y)!4U(!4U(!4U(!4Q(!4Q'!4Q'!4M'!4M& M!4M&!4M&!4I%!4I%!4I%!4E%!4E$!4E$!4A$!4A#!4A#!4=#!4=#!4="!49" M!49"!49!!45!!45!!45`!45`!41`!41`!40_!4,_!4,_!4,^!4(^!4(^!4(^ M!4$]!4$]!$$]!$`\!$`\!$`\!$`[!#\[!#\[!#\[!#XZ!#XZ!#XZ!#TY!#TY M!#TY!#PY!#PX!#PX!#LX!#LW!#LW!#HW!#HV!#HV!#HV!#DV!#DU!#DU!#@U M!#@T!#@T!#<T!#<T!```I9L,I9H,I)H,I)H,I)D,HYD,HYD,HYD,HY@,HI@, MHI@,HI<,H9<,H9<,H98,H)8,H)8,H)8,GY4,GY4,GY4,GI0,GI0,GI0,GI0, MG9,+G9,+G9,+G)(+G)(+G)(+FY$+FY$+FY$+FI$+FI`+FI`+F9`+F8\+F8\+ MF(\+F(\+F(X+F(X+EXX+EXT+EXT+EHT+EHP+EHP+E8P+E8P+E8L+E(L+E(L+ ME(H+DXH+DXH+DXH+DXD+DHD+DHD+DH@+D8@+D8@+D8<+D(<*D(<*D(<*CX8* MCX8*CX8*CH4*CH4*CH4*C84*C80*C80*C80*C(,*C(,*C(,*BX(*BX(*BX(* MBH(*BH$*BH$*B8$*B8`*B8`*B(`*B(`*B'\*B'\*AW\*AWX*AWX*AGX*AGT* MAGT*A7T*A7T*A7P*A'P*A'P*A'L*@WL*@WL)@WH)@GH)@GH)@GH)@GD)@7D) M@7D)@7@)@'@)@'@)>W,-I*!EN;G62DKT<'#_W]__TM"JEY%`?'0)?74)?74) M?'0)?'0)?'0)>W,)>W,)>W,)>G,)>G()>G()>7()>7$)>7$)>'$)>'`)>'`) M=W`)=W`)=V\)=V\)=F\)=FX(=FX(=6X(=6X(=6T(=&T(=&T(=&P(<VP(<VP( M<VL(<FL(<FL(<FL(<FH(<6H(<6H(<6D(<&D(<&D(<&D(;V@(;V@(;V@(;F<( M;F<(;F<(;68(;68(;68(;&8(;&4(;&4(;&4(:V0(:V0(:V0(:F0(:F,(:F,( M:6,(:6((:6(':&(':&$':&$'9V$'9V$'9V`'9V`'9F`'9E\'9E\'95\'95\' M95X'9%X'9%X'9%T'8UT'8UT'8UP'8EP'8EP'8EP'85L'85L'85L'85H'8%H' M8%H'8%H'7UD'7UD'7UD'7E@'7E@'7E@'75<'75<'75<'7%<'7%8'7%8'7%8& M6U4&6U4&6U4&6E4&6E0&6E0&650&65,&65,&6%,&6%(&6%(&5U(&5U(&5U$& M5U$&5E$&5E`&5E`&55`&55`&54\&5$\&5$\&5$X&4TX&4TX&4TT&4DT&4DT& M4DT&44P&44P&44P&44L&4$L&4$L&4$L&3TH&3TH&3TH&3DD%3DD%3DD%34@% M34@%34@%3$@%3$<%3$<%3$<%2T8%2T8%2T8%2D8%2D4%2D4%244%240%240% M2$0%2$,%2$,%1T,%1T,%1T(%1D(%1D(%1D$%1D$%14$%14$%14`%1$`%1$`% M1#\%0S\%0S\%0SX%0CX%0CX%0CX%03T%03T$03T$03P$0#P$0#P$0#P$/SL$ M/SL$/SL$/CH$/CH$/CH$/3D$/3D$/3D$/#D$/#@$/#@$.S@$.S<$.S<$.S<$ M.C<$.C8$.C8$.38$.34$.34$.#4$.#0$.#0$-S0$``"EFPREFPREF@RDF@RD MF@RDF0RDF0RCF0RCF0RCF`RBF`RBF`RBEPRAEPRAEPRAEPR@E@R@E@R@E@R? ME0R?E0R?E0R?E`R>E`R>E`R>E`R=DPN=DPN=DPN<D@N<D@N<D@N;D@N;D0N; MD0N:D0N:D`N:D`N9D`N9CPN9CPN9CPN8CPN8C@N8C@N7C@N7C0N7C0N6C0N6 MC`N6C`N5C`N5C`N5BPN4BPN4BPN4B@N4B@N3B@N3B@N3B0N2B0N2B0N2B`N1 MB`N1B`N1APN0APN0APJ0APJ/A@J/A@J/A@J.A0J.A0J.A0J.A0J-A`J-A`J- MA`J,@PJ,@PJ,@PJ+@@J+@@J+@@J*@@J*@0J*@0J)@0J)@`J)@`J)@`J(@`J( M?PJ(?PJ'?PJ'?@J'?@J&?@J&?0J&?0J%?0J%?0J%?`J$?`J$?`J$>PJ#>PJ# M>PJ#>PF#>@F">@F">@F">0F!>0F!>0F!>`F`>`E\=1.CGV'-S=2RLO70T/_X M^/_2T*JBG4YZ<@Q]=0E]=0E]=0E\=`E\=`E\=`E[<PE[<PE[<PEZ<PEZ<@EZ M<@EY<@EY<0EY<0EX<0EX<0EX<`EX<`EW<`EW;PEW;PEV;PEV;@AV;@AU;@AU M;@AU;0AT;0AT;0AT;`AS;`AS;`AS;`AS:PAR:PAR:PAR:@AQ:@AQ:@AQ:0AP M:0AP:0AP:0AO:`AO:`AO:`AN9PAN9PAN9PAM9PAM9@AM9@AM9@AL90AL90AL M90AK9`AK9`AK9`AJ9`AJ8PAJ8PAI8PAI8@AI8@=H8@=H8@=H80=H80=G80=G M8`=G8`=F8`=F7P=F7P=E7P=E7P=E7@=D7@=D7@=D70=C70=C70=C70=B7`=B M7`=B7`=B6P=A6P=A6P=A6@=@6@=@6@=@6@=?60=?60=?60=>6`=>6`=>6`== M6`==5P==5P==5P=<5@=<5@=<5@9;509;509;509:509:5`9:5`995`994P99 M4P984P984P984@974@974@974097409640964`964`954`954`953P943P94 M3P943@933@933@933@923092309230923`913`913`912P902P902P902P9/ M2@9/2@9/2@9.205.205.205-2`5-2`5-2`5,2`5,1P5,1P5,1P5+1@5+1@5+ M1@5*1@5*105*105)105)1`5)1`5(1`5(0P5(0P5'0P5'0P5'0@5'0@5&0@5& M005&005%005%005%0`5$0`5$0`5$/P5#/P5#/P5#/@5"/@5"/@5"/@5!/05! M/01!/01!/`1`/`1`/`1`/`0_.P0_.P0_.P0^.@0^.@0^.@0].00].00].00\ M.00\.`0\.`0\.`0[-P0[-P0[-P0Z-P0Z-@0Z-@0Y-@0Y-00Y-00X-00X-`0X M-`0``*:;#*6;#*6;#*6:#*6:#*2:#*29#*29#*.9#*.9#*.8#**8#**8#**7 M#*&7#*&7#*&7#*"6#*"6#*"6#)^5#)^5#)^5#)^4#)Z4#)Z4#)Z4#)V3"YV3 M"YV3"YR2"YR2"YR2"YN2"YN1"YN1"YJ1"YJ0"YJ0"YJ0"YF/"YF/"YF/"YB/ M"YB."YB."Y>."Y>-"Y>-"Y:-"Y:-"Y:,"Y6,"Y6,"Y6+"Y2+"Y2+"Y2*"Y2* M"Y.*"Y.*"Y.)"Y*)"Y*)"Y*("Y&("Y&("Y&("Y"'"Y"'"I"'"H^&"H^&"H^& M"H^%"HZ%"HZ%"HZ%"HV$"HV$"HV$"HR#"HR#"HR#"HN#"HN""HN""HJ""HJ! M"HJ!"HF!"HF`"HF`"HF`"HB`"HA_"HA_"H=_"H=^"H=^"H9^"H9^"H9]"H5] M"H5]"H5\"H1\"H1\"H1["H1["H-["H-["8-Z"8)Z"8)Z"8)Y"8%Y"8%Y"7QU M#H^).:VI>-/3T_;V]?'PY-O9N\"\AJ:@57QU%'YV"7UU"7UU"7UU"7QT"7QT M"7QT"7MT"7MS"7MS"7IS"7IR"7IR"7ER"7EQ"7EQ"7EQ"7AQ"7AP"7AP"7=P M"7=O"7=O"79O"79O"79N"'5N"'5N"'5M"'1M"'1M"'1L"'-L"'-L"'-L"'-K M"')K"')K"')J"'%J"'%J"'%J"'!I"'!I"'!I"&]H"&]H"&]H"&YG"&YG"&YG M"&YG"&UF"&UF"&UF"&QE"&QE"&QE"&ME"&MD"&MD"&ID"&IC"&IC"&EC"&EB M"&EB!VAB!VAB!VAA!VAA!V=A!V=@!V=@!V9@!V9?!V9?!V5?!V5?!V5>!V1> M!V1>!V1=!V-=!V-=!V-=!V-<!V)<!V)<!V);!V%;!V%;!V%:!V!:!V!:!V!: M!U]9!U]9!U]9!UY8!UY8!UY8!UU8!UU7!UU7!UU7!UQ6!UQ6!UQ6!EM5!EM5 M!EM5!EI5!EI4!EI4!EE4!EE3!EE3!EA3!EA3!EA2!EA2!E=2!E=1!E=1!E91 M!E90!E90!E50!E50!E5/!E1/!E1/!E1.!E-.!E-.!E-.!E--!E)-!E)-!E), M!E%,!E%,!E%+!E!+!E!+!E!+!D]*!D]*!D]*!DY)!4Y)!4Y)!4U)!4U(!4U( M!4U(!4Q'!4Q'!4Q'!4M&!4M&!4M&!4I&!4I%!4I%!4E%!4E$!4E$!4A$!4A$ M!4A#!4A#!4=#!4="!4="!49"!49!!49!!45!!45!!45`!41`!41`!40_!4,_ M!4,_!4,_!4(^!4(^!4(^!4(]!4$]!$$]!$$\!$`\!$`\!$`\!#\[!#\[!#\[ M!#XZ!#XZ!#XZ!#TZ!#TY!#TY!#TY!#PX!#PX!#PX!#LW!#LW!#LW!#HW!#HV M!#HV!#DV!#DU!#DU!#@U!#@U!```IIP,IIL,IIL,I9L,I9H,I9H,I)H,I)H, MI)D,HYD,HYD,HY@,HI@,HI@,HI<,H9<,H9<,H9<,H)8,H)8,H)8,H)4,GY4, MGY4,GY4,GI0,GI0,GI0,G9,+G9,+G9,+G)(+G)(+G)(+FY(+FY$+FY$+FY$+ MFI`+FI`+FI`+F9`+F8\+F8\+F(\+F(X+F(X+EXX+EXT+EXT+EHT+EHT+EHP+ ME8P+E8P+E8L+E8L+E(L+E(L+E(H+DXH+DXH+DXD+DHD+DHD+DH@+D8@+D8@+ MD8@+D(<+D(<*D(<*D(8*CX8*CX8*CX8*CH4*CH4*CH4*C80*C80*C80*C(,* MC(,*C(,*BX,*BX(*BX(*BH(*BH$*BH$*BH$*B8$*B8`*B8`*B(`*B'\*B'\* MAW\*AWX*AWX*AGX*AGX*AGT*A7T*A7T*A7P*A7P*A'P*A'P*A'L*@WL*@WL) M@WH)@GH)@GH)?W8*?G8/D(HYIJ%EN[F<V-C8]/3QU=.OKJEDI:!2GI=%A'T= M?G8)?G8)?74)?74)?74)?'0)?'0)?'0)>W0)>W,)>W,)>G,)>G()>G()>G() M>7$)>7$)>7$)>'$)>'`)>'`)=W`)=V\)=V\)=F\)=F\)=FX(=6X(=6X(=6T( M=&T(=&T(=&P(=&P(<VP(<VP(<VL(<FL(<FL(<FH(<6H(<6H(<6H(<&D(<&D( M<&D(;V@(;V@(;V@(;V<(;F<(;F<(;F<(;68(;68(;68(;&4(;&4(;&4(:V4( M:V0(:V0(:F0(:F,(:F,(:6,(:6((:6((:6(':&(':&$':&$'9V$'9V`'9V`' M9F`'9F`'9E\'95\'95\'95X'9%X'9%X'9%T'9%T'8UT'8UT'8UP'8EP'8EP' M8EL'85L'85L'85L'8%H'8%H'8%H'7UD'7UD'7UD'7E@'7E@'7E@'7E@'75<' M75<'75<'7%8'7%8'7%8&6U8&6U4&6U4&6E4&6E0&6E0&650&65,&65,&65,& M6%,&6%(&6%(&5U(&5U$&5U$&5E$&5E$&5E`&55`&55`&54\&5$\&5$\&5$X& M4TX&4TX&4TX&4TT&4DT&4DT&4DP&44P&44P&44P&4$L&4$L&4$L&3TH&3TH& M3TH&3DD%3DD%3DD%3DD%34@%34@%34@%3$<%3$<%3$<%2T<%2T8%2T8%2D8% M2D4%2D4%244%240%240%2$0%2$0%2$,%2$,%1T,%1T(%1T(%1D(%1D(%1D$% M14$%14$%14`%1$`%1$`%1#\%0S\%0S\%0S\%0SX%0CX%0CX%0CT%03T$03T$ M03T$0#P$0#P$0#P$/SL$/SL$/SL$/CH$/CH$/CH$/3H$/3D$/3D$/3D$/#@$ M/#@$/#@$.S@$.S<$.S<$.C<$.C8$.C8$.38$.34$.34$.#4$``"FG`RFG`RF MFPRFFPREFPREF@REF@RDF@RDF@RDF0RCF0RCF0RCF`RBF`RBF`RBF`RAEPRA MEPRAEPRAE@R@E@R@E@R@E0R?E0R?E0R?E0R>E`R>E`R>E`R=DPN=DPN=DPN< MDPN<D@N<D@N;D@N;D0N;D0N;D0N:D`N:D`N:D`N9D`N9CPN9CPN8CPN8C@N8 MC@N7C@N7C@N7C0N6C0N6C0N6C`N6C`N5C`N5BPN5BPN4BPN4BPN4B@N3B@N3 MB@N3B0N2B0N2B0N2B`N1B`N1B`N1B`N0APN0APJ0APJ0A@J/A@J/A@J/A@J. MA0J.A0J.A0J-A`J-A`J-A`J,@PJ,@PJ,@PJ+@PJ+@@J+@@J+@@J*@0J*@0J* M@0J)@0J)@`J)@`J(@`J(?PJ(?PJ'?PJ'?@J'?@J&?@J&?@J&?0J%?0J%?0J% M?`J%?`J$?`J$?`J$>PJ#>PJ#>PF#>@F">@E]=0V3C#6CGU^ULHS(Q[S@X.#P M[^;!O8:7D#60B2J0B2J%?1=^=@E^=@E^=@E]=0E]=0E]=0E\=`E\=`E\=`E[ M=`E[<PE[<PEZ<PEZ<@EZ<@EZ<@EY<@EY<0EY<0EX<0EX<`EX<`EW<`EW;PEW M;PEV;PEV;PEV;@AU;@AU;@AU;0AU;0AT;0AT;0AT;`AS;`AS;`AS:PAR:PAR M:PAR:@AQ:@AQ:@AQ:@AP:0AP:0AP:0AO:`AO:`AO:`AO:`AN9PAN9PAN9PAM M9@AM9@AM9@AL90AL90AL90AK90AK9`AK9`AJ9`AJ8PAJ8PAJ8PAI8PAI8@AI M8@=H8@=H80=H80=G80=G8`=G8`=F8`=F8`=F7P=E7P=E7P=E7@=D7@=D7@=D M7@=D70=C70=C70=C7`=B7`=B7`=B6P=A6P=A6P=A6P=@6@=@6@=@6@=?60=? M60=?60=?60=>6`=>6`=>6`==5P==5P==5P=<5@=<5@=<5@=;5@9;509;509: M509:5`9:5`9:5`995`994P994P984P984@984@974@974097409640964096 M4`954`954`953P943P943P943P943@933@933@933092309230923`913`91 M3`913`902P902P902P9/2@9/2@9/2@9/2@9.205.205.205-2`5-2`5-2`5, M1P5,1P5,1P5+1P5+1@5+1@5*1@5*105*105)105)1`5)1`5)1`5(1`5(0P5( M0P5'0P5'0@5'0@5&0@5&0@5&005%005%005%0`5$0`5$0`5$/P5$/P5#/P5# M/P5#/@5"/@5"/@5"/05!/01!/01!/01`/`1`/`1`/`0_.P0_.P0_.P0^.@0^ M.@0^.@0^.@0].00].00].00\.`0\.`0\.`0[.`0[-P0[-P0Z-P0Z-@0Z-@0Y M-@0Y-00Y-00``*><#*><#*:<#*:;#*:;#*6;#*6:#*6:#*2:#*2:#*29#*.9 M#*.9#*.8#**8#**8#**8#**7#*&7#*&7#*&6#*"6#*"6#*"5#)^5#)^5#)^5 M#)Z4#)Z4#)Z4#)V3"YV3"YV3"YR3"YR2"YR2"YR2"YN1"YN1"YN1"YJ0"YJ0 M"YJ0"YF0"YF/"YF/"YB/"YB."YB."Y>."Y>."Y>-"Y>-"Y:-"Y:,"Y:,"Y6, M"Y6+"Y6+"Y2+"Y2+"Y2*"Y.*"Y.*"Y.)"Y*)"Y*)"Y*)"Y&("Y&("Y&("Y&' M"Y"'"I"'"I"&"H^&"H^&"H^&"HZ%"HZ%"HZ%"HV$"HV$"HV$"HR$"HR#"HR# M"HR#"HN""HN""HN""HJ!"HJ!"HJ!"HF!"HF`"HF`"HB`"HA_"HA_"H=_"H=_ M"H=^"H9^"H9^"H9]"H9]"H5]"H5\"H5\"H1\"H1\"H1["H-["H-["8-Z"8)Z M":ZJ>;>TD,7$M-#0S^?GY-K7N+&L:96/,H5\$X!X#']W"G]W"7YV"7YV"7YV M"7UU"7UU"7UU"7QU"7QT"7QT"7MT"7MS"7MS"7MS"7IR"7IR"7IR"7ER"7EQ M"7EQ"7AQ"7AP"7AP"7=P"7=P"7=O"79O"79O"79N"'9N"'5N"'5M"'5M"'1M M"'1M"'1L"'-L"'-L"'-K"')K"')K"')K"'%J"'%J"'%J"'!I"'!I"'!I"'!H M"&]H"&]H"&]H"&YG"&YG"&YG"&UF"&UF"&UF"&QF"&QE"&QE"&ME"&MD"&MD M"&MD"&IC"&IC"&IC"&EC"&EB"&EB!VAB!VAA!VAA!V=A!V=A!V=@!V9@!V9@ M!V9?!V5?!V5?!V5>!V5>!V1>!V1>!V1=!V-=!V-=!V-<!V)<!V)<!V);!V%; M!V%;!V%;!V!:!V!:!V!:!V!9!U]9!U]9!U]9!UY8!UY8!UY8!UU7!UU7!UU7 M!UQ6!UQ6!UQ6!UM6!EM5!EM5!EI5!EI4!EI4!EI4!EE4!EE3!EE3!EA3!EA2 M!EA2!E=2!E=1!E=1!E91!E91!E90!E50!E50!E5/!E5/!E1/!E1/!E1.!E-. M!E-.!E--!E)-!E)-!E),!E%,!E%,!E%,!E!+!E!+!E!+!D]*!D]*!D]*!D]* M!DY)!4Y)!4Y)!4U(!4U(!4U(!4Q'!4Q'!4Q'!4M'!4M&!4M&!4I&!4I%!4I% M!4I%!4E%!4E$!4E$!4A$!4A#!4A#!4=#!4="!4="!49"!49"!49!!45!!45! M!45`!41`!41`!41`!40_!4,_!4,_!4,^!4(^!4(^!4(]!4$]!4$]!$$]!$`\ M!$`\!$`\!#\[!#\[!#\[!#\[!#XZ!#XZ!#XZ!#TY!#TY!#TY!#PX!#PX!#PX M!#LX!#LW!#LW!#HW!#HV!#HV!#DV!#DV!```IYT,IYP,IYP,IIP,IIL,IIL, MI9L,I9L,I9H,I)H,I)H,I)D,HYD,HYD,HY@,HI@,HI@,HI@,HI<,H9<,H9<, MH98,H)8,H)8,H)8,GY4,GY4,GY4,GI0,GI0,GI0,G9,+G9,+G9,+G9,+G)(+ MG)(+G)(+FY$+FY$+FY$+FI$+FI`+FI`+F9`+F8\+F8\+F(\+F(X+F(X+EXX+ MEXX+EXT+EXT+EHT+EHP+EHP+E8P+E8P+E8L+E(L+E(L+E(H+DXH+DXH+DXD+ MDHD+DHD+DHD+DH@+D8@+D8@+D8<+D(<*D(<*D(<*CX8*CX8*CX8*CH4*CH4* MCH4*C80*C80*C80*C(0*C(,*C(,*C(,*BX(*BX(*BX(*BH(*BH$*BH$*B8$* MB8`*B8`*B(`*B'\*B'\*AW\*AW\*AWX*AWX*AGX*AGT*AGT*A7T*A7T*A7P* MA'P*A'P*A'L*@WL*@WL)@WH)T]/0U-32U]?6W=S6T]&RN;5XHYQ+D(DH@7D, M@'@)?W<)?W<)?W<)?G8)?G8)?G8)?74)?74)?74)?'4)?'0)?'0)?'0)>W,) M>W,)>W,)>G()>G()>G()>7()>7$)>7$)>'$)>'`)>'`)=W`)=W`)=V\)=F\) M=F\)=FX(=FX(=6X(=6T(=6T(=&T(=&T(=&P(<VP(<VP(<VL(<FL(<FL(<FL( M<6H(<6H(<6H(<6D(<&D(<&D(<&@(;V@(;V@(;V@(;F<(;F<(;F<(;68(;68( M;68(;&8(;&4(;&4(:V4(:V0(:V0(:V0(:F,(:F,(:F,(:6,(:6((:6(':&(' M:&$':&$'9V$'9V$'9V`'9F`'9F`'9E\'9E\'95\'95X'95X'9%X'9%X'9%T' M8UT'8UT'8UP'8EP'8EP'8EP'85L'85L'85L'85H'8%H'8%H'8%D'7UD'7UD' M7UD'7E@'7E@'7E@'75<'75<'75<'7%<'7%8'7%8'6U8&6U4&6U4&6U4&6E0& M6E0&6E0&650&65,&65,&6%,&6%(&6%(&5U(&5U(&5U$&5E$&5E$&5E`&5E`& M55`&54\&54\&5$\&5$\&5$X&4TX&4TX&4TT&4DT&4DT&4DT&44P&44P&44P& M4$L&4$L&4$L&4$H&3TH&3TH&3TH&3DD%3DD%3DD%34@%34@%34@%3$@%3$<% M3$<%2T<%2T8%2T8%2T8%2D4%2D4%2D4%244%240%240%2$0%2$,%2$,%1T,% M1T,%1T(%1D(%1D(%1D$%14$%14$%14`%14`%1$`%1$`%1#\%0S\%0S\%0SX% M0CX%0CX%0CX%03T%03T$03T$0#P$0#P$0#P$0#L$/SL$/SL$/SL$/CH$/CH$ M/CH$/3D$/3D$/3D$/#D$/#@$/#@$.S@$.S<$.S<$.C<$.C8$.C8$.C8$``"H MG0RGG0RGG`RGG`RFG`RFFPRFFPREFPREFPREF@RDF@RDF@RDF0RCF0RCF0RC MF0RCF`RBF`RBF`RBEPRAEPRAEPRAE@R@E@R@E@R@E@R?E0R?E0R?E0R>E`R> ME`R>E`R>E`R=DPN=DPN=DPN<D@N<D@N<D@N;D0N;D0N;D0N:D0N:D`N:D`N9 MD`N9CPN9CPN8CPN8CPN8C@N8C@N7C@N7C0N7C0N6C0N6C`N6C`N5C`N5C`N5 MBPN4BPN4BPN4B@N3B@N3B@N3B@N3B0N2B0N2B0N2B`N1B`N1B`N1APN0APJ0 MAPJ0APJ/A@J/A@J/A@J.A0J.A0J.A0J-A`J-A`J-A`J-A`J,@PJ,@PJ,@PJ+ M@@J+@@J+@@J*@@J*@0J*@0J)@0J)@`J)@`J(@`J(?PJ(?PJ(?PJ'?PJ'?@J' M?@J&?@J&?0J&?0J%?0J%?0J%?`J$?`J$?`J$>PJ#>PJ#>PGR\O+R\O+R\O#; MVL"RK&B(@2.%?AF%?!.`>`J`>`F`>`E_=PE_=PE_=PE^=@E^=@E^=@E]=0E] M=0E]=0E]=0E\=`E\=`E\=`E[<PE[<PE[<PEZ<PEZ<@EZ<@EY<@EY<0EY<0EX M<0EX<`EX<`EW<`EW<`EW;PEW;PEV;PEV;@AV;@AU;@AU;@AU;0AT;0AT;0AT M;`AS;`AS;`AS:PAR:PAR:PAR:PAR:@AQ:@AQ:@AQ:0AP:0AP:0AP:0AO:`AO M:`AO:`AN9PAN9PAN9PAM9@AM9@AM9@AL9@AL90AL90AL90AK9`AK9`AK9`AJ M9`AJ8PAJ8PAI8PAI8@AI8@=H8@=H80=H80=G80=G80=G8`=G8`=F8`=F7P=F M7P=E7P=E7P=E7@=D7@=D7@=D70=C70=C70=C7`=B7`=B7`=B7`=A6P=A6P=A M6P=A6@=@6@=@6@=@6@=?60=?60=?60=>6`=>6`=>6`==5P==5P==5P=<5P=< M5@=<5@=<5@9;509;509;509:509:5`9:5`995`994P994P984P984@984@97 M4@974@974096409640964`964`954`954`953P943P943P943@933@933@93 M30923092309230913`913`913`912P902P902P902P9/2@9/2@9/2@9.205. M205.205-2`5-2`5-2`5,2`5,1P5,1P5+1P5+1@5+1@5+1@5*1@5*105*105) M105)1`5)1`5(1`5(0P5(0P5'0P5'0P5'0@5&0@5&0@5&005&005%005%0`5% M0`5$0`5$0`5$/P5#/P5#/P5#/@5"/@5"/@5"/@5!/05!/01!/01`/`1`/`1` M/`1`.P0_.P0_.P0_.P0^.@0^.@0^.@0].00].00].00\.00\.`0\.`0[.`0[ M-P0[-P0[-P0Z-@0Z-@0``*B=#*B=#*>=#*><#*><#*:<#*:;#*:;#*6;#*6; M#*6:#*2:#*2:#*29#*29#*.9#*.9#*.8#**8#**8#**7#*&7#*&7#*&6#*"6 M#*"6#*"6#)^5#)^5#)^5#)Z4#)Z4#)Z4#)Z4#)V3"YV3"YV3"YR2"YR2"YR2 M"YN1"YN1"YN1"YJ1"YJ0"YJ0"YF0"YF/"YF/"YF/"YB/"YB."YB."Y>."Y>- M"Y>-"Y:-"Y:,"Y:,"Y6,"Y6,"Y6+"Y2+"Y2+"Y2*"Y.*"Y.*"Y.*"Y.)"Y*) M"Y*)"Y*("Y&("Y&("Y&'"Y"'"Y"'"I"'"H^&"H^&"H^&"HZ%"HZ%"HZ%"HZ% M"HV$"HV$"HV$"HR#"HR#"HR#"HN""HN""HN""HJ""HJ!"HJ!"HF!"HF`"HF` M"HB`"HB`"HA_"HA_"H=_"H=^"H=^"H9^"H9]"H9]"H5]"H5]"H5\"H1\"H1\ M"H1["H-["O________W\^MG7M:*<2']V"H%Y"8%Y"8%X"8!X"8!X"8!X"7]W M"7]W"7]W"7YV"7YV"7YV"7UV"7UU"7UU"7UU"7QT"7QT"7QT"7MS"7MS"7MS M"7IS"7IR"7IR"7ER"7EQ"7EQ"7AQ"7AQ"7AP"7AP"7=P"7=O"7=O"79O"79N M"'9N"'5N"'5N"'5M"'1M"'1M"'1L"'-L"'-L"'-L"')K"')K"')K"')J"'%J M"'%J"'%I"'!I"'!I"'!I"&]H"&]H"&]H"&YG"&YG"&YG"&UG"&UF"&UF"&UF M"&QE"&QE"&QE"&MD"&MD"&MD"&ID"&IC"&IC"&EC"&EB"&EB!VAB!VAB!VAA M!V=A!V=A!V=@!V=@!V9@!V9?!V9?!V5?!V5?!V5>!V1>!V1>!V1=!V-=!V-= M!V-=!V)<!V)<!V)<!V);!V%;!V%;!V%:!V!:!V!:!V!:!U]9!U]9!U]9!UY8 M!UY8!UY8!UU7!UU7!UU7!UU7!UQ6!UQ6!UQ6!EM5!EM5!EM5!EI5!EI4!EI4 M!EE4!EE3!EE3!EA3!EA2!EA2!E=2!E=2!E=1!E=1!E91!E90!E90!E50!E50 M!E5/!E1/!E1/!E1.!E-.!E-.!E--!E)-!E)-!E)-!E),!E%,!E%,!E%+!E!+ M!E!+!E!+!D]*!D]*!D]*!DY)!4Y)!4Y)!4U(!4U(!4U(!4Q(!4Q'!4Q'!4Q' M!4M&!4M&!4M&!4I&!4I%!4I%!4E%!4E$!4E$!4A$!4A#!4A#!4=#!4=#!4=" M!4="!49"!49!!49!!45!!45!!45`!41`!41`!40_!4,_!4,_!4,^!4(^!4(^ M!4(^!4$]!4$]!$$]!$$\!$`\!$`\!$`\!#\[!#\[!#\[!#XZ!#XZ!#XZ!#TY M!#TY!#TY!#PY!#PX!#PX!#PX!#LW!#LW!#LW!#HW!```J)X,J)T,J)T,IYT, MIYP,IYP,IIP,IIP,IIL,I9L,I9L,I9H,I9H,I)H,I)D,I)D,HYD,HYD,HY@, MHI@,HI@,HI<,H9<,H9<,H9<,H)8,H)8,H)8,GY4,GY4,GY4,GY0,GI0,GI0, MGI0,G9,+G9,+G9,+G)(+G)(+G)(+FY(+FY$+FY$+FI$+FI`+FI`+FI`+F8\+ MF8\+F8\+F(\+F(X+F(X+EXX+EXT+EXT+EHT+EHT+EHP+E8P+E8P+E8L+E(L+ ME(L+E(H+E(H+DXH+DXH+DXD+DHD+DHD+DH@+D8@+D8@+D8@+D(<+D(<*D(<* MCX8*CX8*CX8*CX4*CH4*CH4*CH4*C80*C80*C80*C(,*C(,*C(,*BX,*BX(* MBX(*BH(*BH$*BH$*B8$*B8`*B8`*B8`*B(`*B'\*B'\*AW\*AWX*AWX*AGX* MAGX*AGT*A7T*A7T*A7P*A'P*A'P*A'L*A'L*@WL*@WL)@WH)?G8*@'@*@GD) M@7D)@7D)@7D)@'@)@'@)@'@)?W<)?W<)?W<)?G8)?G8)?G8)?G8)?74)?74) M?74)?'0)?'0)?'0)>W0)>W,)>W,)>G,)>G()>G()>7()>7$)>7$)>7$)>'$) M>'`)>'`)=W`)=V\)=V\)=F\)=FX(=FX(=6X(=6X(=6T(=&T(=&T(=&P(<VP( M<VP(<VP(<VL(<FL(<FL(<FH(<6H(<6H(<6D(<&D(<&D(<&D(;V@(;V@(;V@( M;F<(;F<(;F<(;F<(;68(;68(;68(;&4(;&4(;&4(:V0(:V0(:V0(:F0(:F,( M:F,(:6,(:6((:6(':&(':&(':&$':&$'9V$'9V`'9V`'9F`'9E\'9E\'95\' M95\'95X'9%X'9%X'9%T'8UT'8UT'8UT'8UP'8EP'8EP'8EL'85L'85L'85H' M8%H'8%H'8%H'7UD'7UD'7UD'7E@'7E@'7E@'75@'75<'75<'75<'7%8'7%8' M7%8&6U4&6U4&6U4&6E4&6E0&6E0&650&65,&65,&6%,&6%,&6%(&6%(&5U(& M5U$&5U$&5E$&5E`&5E`&55`&55`&54\&5$\&5$\&5$X&4TX&4TX&4TX&4DT& M4DT&4DT&4DP&44P&44P&44L&4$L&4$L&4$L&3TH&3TH&3TH&3DD%3DD%3DD% M34D%34@%34@%34@%3$<%3$<%3$<%2T8%2T8%2T8%2D8%2D4%2D4%244%240% M240%2$0%2$0%2$,%1T,%1T,%1T(%1T(%1D(%1D$%1D$%14$%14$%14`%1$`% M1$`%1#\%0S\%0S\%0S\%0CX%0CX%0CX%0CT%03T$03T$03P$0#P$0#P$0#P$ M/SL$/SL$/SL$/CH$/CH$/CH$/3H$/3D$/3D$/#D$/#@$/#@$/#@$.S<$.S<$ M.S<$``"IG@RHG@RHG0RHG0RGG0RGG`RGG`RFG`RFG`RFFPREFPREFPREF@RE MF@RDF@RDF@RDF0RCF0RCF0RCF`RBF`RBF`RBEPRAEPRAEPRAEPR@E@R@E@R@ ME@R@E0R?E0R?E0R?E0R>E`R>E`R>E`R=DPN=DPN=DPN<D@N<D@N<D@N;D@N; MD0N;D0N:D0N:D`N:D`N:D`N9D`N9CPN9CPN8CPN8C@N8C@N7C@N7C0N7C0N6 MC0N6C0N6C`N5C`N5C`N5BPN5BPN4BPN4BPN4B@N3B@N3B@N3B0N2B0N2B0N2 MB`N1B`N1B`N1B`N0APN0APJ0APJ/A@J/A@J/A@J/A0J.A0J.A0J.A0J-A`J- MA`J-A`J,@PJ,@PJ,@PJ+@PJ+@@J+@@J*@@J*@0J*@0J*@0J)@`J)@`J)@`J( M@`J(?PJ(?PJ'?PJ'?@J'?@J&?@J&?@J&?0J%?0J%?0J%?`J$?`J$?`J$>PJ$ M>PJ#>PJ#>PF#>@F">@F">@F">0F!>0F!>0F!>0F`>`F`>`F`>`E_=PE_=PE_ M=PE_=@E^=@E^=@E^=@E]=0E]=0E]=0E\=`E\=`E\=`E[=`E[<PE[<PEZ<PEZ M<@EZ<@EY<@EY<0EY<0EY<0EX<0EX<`EX<`EW<`EW;PEW;PEV;PEV;PEV;@AU M;@AU;@AU;0AT;0AT;0AT;`AT;`AS;`AS;`AS:PAR:PAR:PAR:@AQ:@AQ:@AQ M:@AP:0AP:0AP:0AO:`AO:`AO:`AN9PAN9PAN9PAN9PAM9@AM9@AM9@AL90AL M90AL90AK90AK9`AK9`AJ9`AJ8PAJ8PAI8PAI8@AI8@AI8@=H8@=H80=H80=G M80=G8`=G8`=F8`=F8`=F7P=E7P=E7P=E7@=D7@=D7@=D70=D70=C70=C70=C M7`=B7`=B7`=B6P=A6P=A6P=A6P=@6@=@6@=@6@=?60=?60=?60=>6`=>6`=> M6`=>6`==5P==5P==5P=<5@=<5@=<5@9;5@9;509;509:509:5`9:5`995`99 M4P994P994P984P984@984@974@9740974096409640964`954`954`953P94 M3P943P943@933@933@933@933092309230923`913`913`913`902P902P90 M2P9/2@9/2@9/2@9.205.205.205.205-2`5-2`5-2`5,1P5,1P5,1P5+1P5+ M1@5+1@5*1@5*105*105)105)1`5)1`5(1`5(1`5(0P5(0P5'0P5'0@5'0@5& M0@5&0@5&005%005%005%0`5$0`5$0`5$/P5#/P5#/P5#/P5#/@5"/@5"/@5" M/05!/01!/01!/`1`/`1`/`1`/`0_.P0_.P0_.P0^.@0^.@0^.@0].@0].00] M.00].00\.`0\.`0\.`0[-P0[-P0``*F>#*F>#*B>#*B=#*B=#*>=#*>=#*>< M#*:<#*:<#*:;#*:;#*6;#*6:#*6:#*2:#*2:#*29#*.9#*.9#*.8#**8#**8 M#**7#*&7#*&7#*&7#*&6#*"6#*"6#*"5#)^5#)^5#)^5#)Z4#)Z4#)Z4#)V3 M"YV3"YV3"YR2"YR2"YR2"YN2"YN1"YN1"YN1"YJ0"YJ0"YJ0"YF0"YF/"YF/ M"YB/"YB."YB."Y>."Y>-"Y>-"Y:-"Y:-"Y:,"Y:,"Y6,"Y6+"Y6+"Y2+"Y2+ M"Y2*"Y.*"Y.*"Y.)"Y*)"Y*)"Y*("Y&("Y&("Y&("Y"'"Y"'"I"'"I"&"H^& M"H^&"H^&"HZ%"HZ%"HZ%"HV$"HV$"HV$"HR#"HR#"HR#"HN#"HN""HN""HN" M"HJ!"HJ!"HJ!"HF!"HF`"HF`"HB`"HA_"HA_"H=_"H=^"H=^"H9^"H9^"H9] M"H5]"H5]"H5\"H5\"H1\"H1\"H1["H-["H-["8-Z"8)Z"8)Z"8)Y"8%Y"8%Y M"8%Y"8!X"8!X"8!X"8!W"7]W"7]W"7]W"7YV"7YV"7YV"7UU"7UU"7UU"7QT M"7QT"7QT"7MT"7MS"7MS"7IS"7IR"7IR"7IR"7ER"7EQ"7EQ"7AQ"7AP"7AP M"7=P"7=O"7=O"79O"79O"79N"'5N"'5N"'5M"'5M"'1M"'1M"'1L"'-L"'-L M"'-K"')K"')K"')J"'%J"'%J"'%J"'!I"'!I"'!I"&]H"&]H"&]H"&]H"&YG M"&YG"&YG"&UF"&UF"&UF"&QE"&QE"&QE"&ME"&MD"&MD"&ID"&IC"&IC"&IC M"&EC"&EB"&EB!VAB!VAA!VAA!V=A!V=@!V=@!V9@!V9@!V9?!V5?!V5?!V5> M!V1>!V1>!V1>!V1=!V-=!V-=!V-<!V)<!V)<!V);!V%;!V%;!V%;!V!:!V!: M!V!:!U]9!U]9!U]9!U]9!UY8!UY8!UY8!UU7!UU7!UU7!UQ6!UQ6!UQ6!UM6 M!EM5!EM5!EI5!EI4!EI4!EE4!EE3!EE3!EE3!EA3!EA2!EA2!E=2!E=1!E=1 M!E91!E91!E90!E50!E50!E5/!E1/!E1/!E1.!E1.!E-.!E-.!E--!E)-!E)- M!E),!E%,!E%,!E%,!E!+!E!+!E!+!D]*!D]*!D]*!DY)!4Y)!4Y)!4Y)!4U( M!4U(!4U(!4Q'!4Q'!4Q'!4M'!4M&!4M&!4I&!4I%!4I%!4E%!4E$!4E$!4E$ M!4A$!4A#!4A#!4=#!4="!4="!49"!49"!49!!45!!45!!45`!41`!41`!40_ M!4,_!4,_!4,_!4,^!4(^!4(^!4(]!4$]!$$]!$$]!$`\!$`\!$`\!#\[!#\[ M!#\[!#XZ!#XZ!#XZ!#XZ!#TY!#TY!#TY!#PX!#PX!#PX!#LX!```J9\,J9X, MJ9X,J)X,J)T,J)T,IYT,IYT,IYP,IYP,IIP,IIL,IIL,I9L,I9H,I9H,I)H, MI)H,I)D,HYD,HYD,HY@,HI@,HI@,HI@,H9<,H9<,H9<,H98,H)8,H)8,H)4, MGY4,GY4,GY4,GI0,GI0,GI0,G9,+G9,+G9,+G),+G)(+G)(+G)(+FY$+FY$+ MFY$+FI`+FI`+FI`+F9`+F8\+F8\+F(\+F(X+F(X+EXX+EXX+EXT+EHT+EHT+ MEHP+EHP+E8P+E8L+E8L+E(L+E(L+E(H+DXH+DXH+DXD+DHD+DHD+DHD+D8@+ MD8@+D8@+D8<+D(<*D(<*D(8*CX8*CX8*CX8*CH4*CH4*CH4*C80*C80*C80* MC(0*C(,*C(,*BX,*BX(*BX(*BX(*BH$*BH$*BH$*B8$*B8`*B8`*B(`*B'\* MB'\*AW\*AW\*AWX*AGX*AGX*AGT*AGT*A7T*A7P*A7P*A'P*A'P*A'L*@WL* M@WL)@WH)@GH)@GH)@GH)@7D)@7D)@7D)@'@)@'@)@'@)@'<)?W<)?W<)?W<) M?G8)?G8)?G8)?74)?74)?74)?'4)?'0)?'0)>W0)>W,)>W,)>W,)>G()>G() M>G()>7()>7$)>7$)>'$)>'`)>'`)=W`)=W`)=V\)=F\)=F\)=FX(=6X(=6X( M=6T(=6T(=&T(=&T(=&P(<VP(<VP(<VL(<FL(<FL(<FH(<6H(<6H(<6H(<&D( M<&D(<&D(<&@(;V@(;V@(;V@(;F<(;F<(;F<(;68(;68(;68(;&4(;&4(;&4( M:V4(:V0(:V0(:F0(:F,(:F,(:F,(:6,(:6((:6(':&(':&$':&$'9V$'9V`' M9V`'9F`'9F`'9E\'95\'95\'95X'95X'9%X'9%X'9%T'8UT'8UT'8UP'8EP' M8EP'8EL'85L'85L'85L'8%H'8%H'8%H'8%D'7UD'7UD'7UD'7E@'7E@'7E@' M75<'75<'75<'7%8'7%8'7%8'6U8&6U4&6U4&6E4&6E0&6E0&6E0&650&65,& M65,&6%,&6%(&6%(&5U(&5U$&5U$&5E$&5E$&5E`&55`&55`&54\&54\&5$\& M5$\&5$X&4TX&4TX&4TT&4DT&4DT&4DP&44P&44P&44P&4$L&4$L&4$L&3TH& M3TH&3TH&3TH&3DD%3DD%3DD%34@%34@%34@%3$<%3$<%3$<%2T<%2T8%2T8% M2D8%2D4%2D4%2D4%244%240%240%2$0%2$,%2$,%1T,%1T(%1T(%1D(%1D(% M1D$%14$%14$%14`%1$`%1$`%1$`%1#\%0S\%0S\%0SX%0CX%0CX%0CT%03T$ M03T$03T$0#P$0#P$0#P$/SL$/SL$/SL$/SL$/CH$/CH$/CH$/3D$/3D$/3D$ M/#@$/#@$/#@$``"JGPRIGPRIG@RIG@RHG@RHG0RHG0RHG0RGG0RGG`RGG`RF MG`RFFPRFFPREFPREFPREF@RDF@RDF@RDF0RCF0RCF0RCF`RBF`RBF`RBF`RB MEPRAEPRAEPRAE@R@E@R@E@R@E@R?E0R?E0R?E0R>E`R>E`R>E`R=DPN=DPN= MDPN=DPN<D@N<D@N<D@N;D0N;D0N;D0N:D0N:D`N:D`N9D`N9CPN9CPN8CPN8 MC@N8C@N7C@N7C@N7C0N7C0N6C0N6C`N6C`N5C`N5C`N5BPN4BPN4BPN4B@N3 MB@N3B@N3B0N2B0N2B0N2B0N2B`N1B`N1B`N1APN0APJ0APJ0APJ/A@J/A@J/ MA@J.A0J.A0J.A0J-A`J-A`J-A`J,A`J,@PJ,@PJ,@PJ+@@J+@@J+@@J*@0J* M@0J*@0J)@0J)@`J)@`J(@`J(?PJ(?PJ'?PJ'?PJ'?@J'?@J&?@J&?0J&?0J% M?0J%?`J%?`J$?`J$?`J$>PJ#>PJ#>PF#>@F">@F">@F">@F!>0F!>0F!>0F! M>`F`>`F`>`F`=PE_=PE_=PE_=PE^=@E^=@E^=@E]=0E]=0E]=0E\=0E\=`E\ M=`E\=`E[<PE[<PE[<PEZ<@EZ<@EZ<@EY<@EY<0EY<0EX<0EX<`EX<`EW<`EW M<`EW;PEV;PEV;PEV;@AV;@AU;@AU;0AU;0AT;0AT;0AT;`AS;`AS;`AS:PAR M:PAR:PAR:PAQ:@AQ:@AQ:@AQ:0AP:0AP:0AP:`AO:`AO:`AO:`AN9PAN9PAN M9PAM9@AM9@AM9@AL9@AL90AL90AK90AK9`AK9`AK9`AJ8PAJ8PAJ8PAI8PAI M8@AI8@=H8@=H80=H80=G80=G80=G8`=F8`=F8`=F7P=F7P=E7P=E7@=E7@=D M7@=D7@=D70=C70=C70=C7`=B7`=B7`=B7`=A6P=A6P=A6P=@6@=@6@=@6@=@ M60=?60=?60=?60=>6`=>6`=>6`==5P==5P==5P=<5P=<5@=<5@=;5@9;509; M509;509:5`9:5`9:5`995`994P994P984P984@984@974@974@9740964096 M40964`954`954`953P953P943P943P943@933@933@933092309230923091 M3`913`913`902P902P902P902@9/2@9/2@9/2@9.205.205.205-2`5-2`5- M2`5,2`5,1P5,1P5+1P5+1@5+1@5*1@5*105*105*105)105)1`5)1`5(1`5( M0P5(0P5'0P5'0P5'0@5&0@5&0@5&005%005%005%0`5%0`5$0`5$0`5$/P5# M/P5#/P5#/@5"/@5"/@5"/@5!/05!/01!/01`/`1`/`1`/`0_.P0_.P0_.P0_ M.P0^.@0^.@0^.@0].00].00].00\.`0\.`0``*J?#*J?#*F?#*F>#*F>#*B> M#*B>#*B=#*B=#*>=#*><#*><#*:<#*:;#*:;#*6;#*6;#*6:#*2:#*2:#*29 M#*.9#*.9#*.9#*.8#**8#**8#**7#*&7#*&7#*&6#*"6#*"6#*"6#)^5#)^5 M#)^5#)Z4#)Z4#)Z4#)V3"YV3"YV3"YV3"YR2"YR2"YR2"YN1"YN1"YN1"YJ1 M"YJ0"YJ0"YF0"YF/"YF/"YB/"YB."YB."YB."Y>."Y>-"Y>-"Y:-"Y:,"Y:, M"Y6,"Y6,"Y6+"Y2+"Y2+"Y2*"Y.*"Y.*"Y.)"Y*)"Y*)"Y*)"Y*("Y&("Y&( M"Y&'"Y"'"I"'"I"'"H^&"H^&"H^&"HZ%"HZ%"HZ%"HV$"HV$"HV$"HV$"HR# M"HR#"HR#"HN""HN""HN""HJ""HJ!"HJ!"HF!"HF`"HF`"HB`"HA_"HA_"H=_ M"H=_"H=^"H=^"H9^"H9]"H9]"H5]"H5]"H5\"H1\"H1\"H1["H-["H-["8-Z M"8)Z"8)Z"8)Z"8)Y"8%Y"8%Y"8%X"8!X"8!X"8!X"7]W"7]W"7]W"7YV"7YV M"7YV"7UU"7UU"7UU"7QU"7QT"7QT"7QT"7MS"7MS"7MS"7IS"7IR"7IR"7ER M"7EQ"7EQ"7AQ"7AP"7AP"7=P"7=P"7=O"7=O"79O"79N"'9N"'5N"'5N"'5M M"'1M"'1M"'1L"'-L"'-L"'-K"')K"')K"')K"'%J"'%J"'%J"'%I"'!I"'!I M"'!I"&]H"&]H"&]H"&YG"&YG"&YG"&UF"&UF"&UF"&QF"&QE"&QE"&QE"&MD M"&MD"&MD"&ID"&IC"&IC"&EC"&EB"&EB!VAB!VAA!VAA!V=A!V=A!V=@!V=@ M!V9@!V9?!V9?!V5?!V5?!V5>!V1>!V1>!V1=!V-=!V-=!V-<!V)<!V)<!V)< M!V%;!V%;!V%;!V%:!V!:!V!:!V!:!U]9!U]9!U]9!UY8!UY8!UY8!UU7!UU7 M!UU7!UQ7!UQ6!UQ6!UQ6!EM5!EM5!EM5!EI5!EI4!EI4!EE4!EE3!EE3!EA3 M!EA2!EA2!E=2!E=2!E=1!E91!E91!E90!E90!E50!E5/!E5/!E1/!E1/!E1. M!E-.!E-.!E--!E)-!E)-!E)-!E%,!E%,!E%,!E%+!E!+!E!+!E!*!D]*!D]* M!D]*!DY)!4Y)!4Y)!4U(!4U(!4U(!4Q(!4Q'!4Q'!4M'!4M&!4M&!4M&!4I% M!4I%!4I%!4E%!4E$!4E$!4A$!4A#!4A#!4=#!4=#!4="!49"!49"!49!!49! M!45!!45`!45`!41`!41`!40_!4,_!4,_!4,^!4(^!4(^!4(^!4$]!4$]!$$] M!$`\!$`\!$`\!$`[!#\[!#\[!#\[!#XZ!#XZ!#XZ!#TY!#TY!#TY!#PY!``` MJJ`,JI\,JI\,J9\,J9X,J9X,J9X,J)X,J)T,J)T,IYT,IYP,IYP,IIP,IIL, MIIL,I9L,I9L,I9H,I)H,I)H,I)D,I)D,HYD,HYD,HY@,HI@,HI@,HI<,H9<, MH9<,H98,H)8,H)8,H)8,GY4,GY4,GY4,GI0,GI0,GI0,GI0,G9,+G9,+G9,+ MG)(+G)(+G)(+FY$+FY$+FY$+FI$+FI`+FI`+F9`+F8\+F8\+F8\+F(\+F(X+ MF(X+EXX+EXT+EXT+EHT+EHP+EHP+E8P+E8P+E8L+E(L+E(L+E(H+DXH+DXH+ MDXH+DXD+DHD+DHD+DH@+D8@+D8@+D8<+D(<+D(<*D(<*CX8*CX8*CX8*CH4* MCH4*CH4*CH4*C80*C80*C80*C(,*C(,*C(,*BX(*BX(*BX(*BH(*BH$*BH$* MB8$*B8`*B8`*B(`*B(`*B'\*B'\*AW\*AWX*AWX*AGX*AGT*AGT*A7T*A7T* MA7P*A'P*A'P*A'L*@WL*@WL)@WL)@WH)@GH)@GH)@GD)@7D)@7D)@7@)@'@) M@'@)@'@)?W<)?W<)?W<)?G8)?G8)?G8)?78)?74)?74)?74)?'0)?'0)?'0) M>W,)>W,)>W,)>G,)>G()>G()>7()>7$)>7$)>'$)>'$)>'`)>'`)=W`)=V\) M=V\)=F\)=FX(=FX(=6X(=6X(=6T(=&T(=&T(=&P(<VP(<VP(<VP(<FL(<FL( M<FL(<FH(<6H(<6H(<6D(<&D(<&D(<&D(;V@(;V@(;V@(;F<(;F<(;F<(;68( M;68(;68(;68(;&4(;&4(;&4(:V0(:V0(:V0(:F0(:F,(:F,(:6,(:6((:6(' M:&(':&$':&$'9V$'9V$'9V`'9V`'9F`'9E\'9E\'95\'95\'95X'9%X'9%X' M9%T'8UT'8UT'8UP'8EP'8EP'8EP'8EL'85L'85L'85H'8%H'8%H'8%H'7UD' M7UD'7UD'7E@'7E@'7E@'75<'75<'75<'7%<'7%8'7%8'7%8&6U4&6U4&6U4& M6E4&6E0&6E0&650&65,&65,&6%,&6%(&6%(&5U(&5U(&5U$&5U$&5E$&5E`& M5E`&55`&55`&54\&5$\&5$\&5$X&4TX&4TX&4TT&4DT&4DT&4DT&44P&44P& M44P&44L&4$L&4$L&4$L&3TH&3TH&3TH&3DD%3DD%3DD%34@%34@%34@%3$@% M3$<%3$<%3$<%2T8%2T8%2T8%2D8%2D4%2D4%244%240%240%2$0%2$,%2$,% M1T,%1T,%1T(%1D(%1D(%1D$%1D$%14$%14$%14`%1$`%1$`%1#\%0S\%0S\% M0SX%0CX%0CX%0CX%03T%03T$03T$03P$0#P$0#P$0#P$/SL$/SL$/SL$/CH$ M/CH$/CH$/3D$/3D$/3D$``"KH`VJH`RJGPRJGPRJGPRIG@RIG@RIG@RHG@RH MG0RHG0RGG0RGG`RGG`RFG`RFG`RFFPREFPREFPREF@RDF@RDF@RDF0RDF0RC MF0RCF0RCF`RBF`RBF`RBEPRAEPRAEPRAEPR@E@R@E@R@E@R?E0R?E0R?E0R? ME`R>E`R>E`R>E`R=DPN=DPN=DPN<D@N<D@N<D@N;D@N;D0N;D0N:D0N:D`N: MD`N9D`N9CPN9CPN9CPN8CPN8C@N8C@N7C@N7C0N7C0N6C0N6C0N6C`N5C`N5 MC`N5BPN4BPN4BPN4B@N4B@N3B@N3B@N3B0N2B0N2B0N2B`N1B`N1B`N1B`N0 MAPN0APJ0APJ/A@J/A@J/A@J.A0J.A0J.A0J.A0J-A`J-A`J-A`J,@PJ,@PJ, M@PJ+@PJ+@@J+@@J*@@J*@0J*@0J)@0J)@`J)@`J)@`J(@`J(?PJ(?PJ'?PJ' M?@J'?@J&?@J&?0J&?0J%?0J%?0J%?`J$?`J$?`J$>PJ#>PJ#>PJ#>PF#>@F" M>@F">@F">0F!>0F!>0F!>`F`>`F`>`F`>`E_=PE_=PE_=PE^=@E^=@E^=@E^ M=@E]=0E]=0E]=0E\=`E\=`E\=`E[<PE[<PE[<PEZ<PEZ<@EZ<@EY<@EY<0EY M<0EX<0EX<0EX<`EX<`EW<`EW;PEW;PEV;PEV;@AV;@AU;@AU;@AU;0AT;0AT M;0AT;`AS;`AS;`AS;`AS:PAR:PAR:PAR:@AQ:@AQ:@AQ:0AP:0AP:0AP:0AO M:`AO:`AO:`AN9PAN9PAN9PAN9PAM9@AM9@AM9@AL90AL90AL90AK9`AK9`AK M9`AJ9`AJ8PAJ8PAI8PAI8@AI8@=H8@=H8@=H80=H80=G80=G8`=G8`=F8`=F M7P=F7P=E7P=E7P=E7@=D7@=D7@=D70=C70=C70=C70=C7`=B7`=B7`=B6P=A M6P=A6P=A6@=@6@=@6@=@6@=?60=?60=?60=>6`=>6`=>6`==6`==5P==5P== M5P=<5@=<5@=<5@9;509;509;509:509:5`9:5`995`994P994P984P984P98 M4@984@974@974097409640964`964`954`954`953P943P943P943@933@93 M3@933@923092309230923`913`913`912P902P902P902P9/2@9/2@9/2@9. M205.205.205-205-2`5-2`5-2`5,1P5,1P5,1P5+1@5+1@5+1@5*1@5*105* M105)105)1`5)1`5(1`5(1`5(0P5'0P5'0P5'0@5'0@5&0@5&005&005%005% M005%0`5$0`5$0`5$/P5#/P5#/P5#/P5"/@5"/@5"/@5"/05!/01!/01!/`1` M/`1`/`1`/`0_.P0_.P0_.P0^.@0^.@0^.@0].00].00``*N@#:N@#:N@#*J? M#*J?#*J?#*F?#*F>#*F>#*B>#*B=#*B=#*>=#*><#*><#*:<#*:<#*:;#*6; M#*6;#*6:#*6:#*2:#*2:#*29#*.9#*.9#*.8#**8#**8#**7#*&7#*&7#*&7 M#*"6#*"6#*"6#*"5#)^5#)^5#)^5#)Z4#)Z4#)Z4#)V3"YV3"YV3"YR2"YR2 M"YR2"YN2"YN1"YN1"YJ1"YJ0"YJ0"YJ0"YF/"YF/"YF/"YB/"YB."YB."Y>. M"Y>-"Y>-"Y:-"Y:-"Y:,"Y6,"Y6,"Y6+"Y6+"Y2+"Y2*"Y2*"Y.*"Y.*"Y.) M"Y*)"Y*)"Y*("Y&("Y&("Y&("Y"'"Y"'"I"'"H^&"H^&"H^&"H^%"HZ%"HZ% M"HZ%"HV$"HV$"HV$"HR#"HR#"HR#"HN#"HN""HN""HJ""HJ!"HJ!"HJ!"HF` M"HF`"HF`"HB`"HA_"HA_"H=_"H=^"H=^"H9^"H9^"H9]"H5]"H5]"H5\"H1\ M"H1\"H1["H1["H-["H-["8-Z"8)Z"8)Z"8)Y"8%Y"8%Y"8%Y"8!X"8!X"8!X M"7]W"7]W"7]W"7]V"7YV"7YV"7YV"7UU"7UU"7UU"7QT"7QT"7QT"7MT"7MS M"7MS"7IS"7IR"7IR"7ER"7EQ"7EQ"7EQ"7AQ"7AP"7AP"7=P"7=O"7=O"79O M"79O"79N"'5N"'5N"'5M"'1M"'1M"'1L"'1L"'-L"'-L"'-K"')K"')K"')J M"'%J"'%J"'%J"'!I"'!I"'!I"&]H"&]H"&]H"&YG"&YG"&YG"&YG"&UF"&UF M"&UF"&QE"&QE"&QE"&ME"&MD"&MD"&ID"&IC"&IC"&EC"&EB"&EB!VEB!VAB M!VAA!VAA!V=A!V=@!V=@!V9@!V9@!V9?!V5?!V5?!V5>!V1>!V1>!V1=!V-= M!V-=!V-=!V-<!V)<!V)<!V);!V%;!V%;!V%;!V!:!V!:!V!:!U]9!U]9!U]9 M!UY8!UY8!UY8!UY8!UU7!UU7!UU7!UQ6!UQ6!UQ6!EM6!EM5!EM5!EI5!EI4 M!EI4!EE4!EE3!EE3!EA3!EA3!EA2!EA2!E=2!E=1!E=1!E91!E91!E90!E50 M!E50!E5/!E1/!E1/!E1.!E-.!E-.!E-.!E--!E)-!E)-!E),!E%,!E%,!E%+ M!E!+!E!+!E!+!D]*!D]*!D]*!DY)!4Y)!4Y)!4U)!4U(!4U(!4U(!4Q'!4Q' M!4Q'!4M&!4M&!4M&!4I&!4I%!4I%!4E%!4E$!4E$!4A$!4A$!4A#!4A#!4=# M!4="!4="!49"!49!!49!!45!!45!!45`!41`!41`!40_!4,_!4,_!4,_!4(^ M!4(^!4(^!4(]!4$]!$$]!$$\!$`\!$`\!$`\!#\[!#\[!#\[!#XZ!#XZ!#XZ M!#TZ!```JZ$-JZ`-JZ`-JZ`,JI\,JI\,JI\,J9\,J9X,J9X,J)X,J)T,J)T, MIYT,IYP,IYP,IIP,IIP,IIL,IIL,I9L,I9H,I9H,I)H,I)H,I)D,HYD,HYD, MHY@,HI@,HI@,HI<,H9<,H9<,H9<,H)8,H)8,H)8,H)4,GY4,GY4,GY4,GI0, MGI0,GI0,G9,+G9,+G9,+G)(+G)(+G)(+FY(+FY$+FY$+FY$+FI`+FI`+FI`+ MF9`+F8\+F8\+F(\+F(X+F(X+EXX+EXT+EXT+EHT+EHT+EHP+E8P+E8P+E8L+ ME8L+E(L+E(L+E(H+DXH+DXH+DXD+DHD+DHD+DH@+D8@+D8@+D8@+D(<+D(<* MD(<*D(8*CX8*CX8*CX8*CH4*CH4*CH4*C80*C80*C80*C(,*C(,*C(,*BX,* MBX(*BX(*BH(*BH$*BH$*BH$*B8$*B8`*B8`*B(`*B'\*B'\*AW\*AWX*AWX* MAGX*AGX*AGT*A7T*A7T*A7P*A7P*A'P*A'P*A'L*@WL*@WL)@WH)@GH)@GH) M@GD)@7D)@7D)@7D)@'@)@'@)@'@)?W<)?W<)?W<)?W<)?G8)?G8)?G8)?74) M?74)?74)?'0)?'0)?'0)>W0)>W,)>W,)>G,)>G()>G()>G()>7()>7$)>7$) M>'$)>'`)>'`)=W`)=V\)=V\)=F\)=F\)=FX(=6X(=6X(=6T(=&T(=&T(=&T( M=&P(<VP(<VP(<VL(<FL(<FL(<FH(<6H(<6H(<6H(<&D(<&D(<&D(;V@(;V@( M;V@(;V@(;F<(;F<(;F<(;68(;68(;68(;&4(;&4(;&4(:V4(:V0(:V0(:F0( M:F,(:F,(:F,(:6((:6((:6(':&(':&$':&$'9V$'9V`'9V`'9F`'9F`'9E\' M95\'95\'95X'9%X'9%X'9%T'9%T'8UT'8UT'8UP'8EP'8EP'8EL'85L'85L' M85L'8%H'8%H'8%H'7UD'7UD'7UD'7U@'7E@'7E@'7E@'75<'75<'75<'7%8' M7%8'7%8'6U8&6U4&6U4&6E4&6E0&6E0&650&65,&65,&65,&6%,&6%(&6%(& M5U(&5U$&5U$&5E$&5E$&5E`&55`&55`&54\&5$\&5$\&5$X&5$X&4TX&4TX& M4TT&4DT&4DT&4DP&44P&44P&44P&4$L&4$L&4$L&3TH&3TH&3TH&3DD%3DD% M3DD%3DD%34@%34@%34@%3$<%3$<%3$<%2T<%2T8%2T8%2D8%2D4%2D4%244% M240%240%240%2$0%2$,%2$,%1T,%1T(%1T(%1D(%1D(%1D$%14$%14$%14`% M1$`%1$`%1#\%0S\%0S\%0S\%0SX%0CX%0CX%0CT%03T$03T$03T$0#P$0#P$ M0#P$/SL$/SL$/SL$/CH$/CH$/CH$``"LH0VLH0VKH`VKH`VKH`RJGPRJGPRJ MGPRIGPRIG@RIG@RHG@RHG0RHG0RGG0RGG0RGG`RGG`RFG`RFFPRFFPREFPRE MF@REF@RDF@RDF@RDF0RCF0RCF0RCF`RBF`RBF`RBF`RAEPRAEPRAEPRAE@R@ ME@R@E@R@E0R?E0R?E0R?E0R>E`R>E`R>E`R=DPN=DPN=DPN<DPN<D@N<D@N< MD@N;D0N;D0N;D0N:D`N:D`N:D`N9D`N9CPN9CPN8CPN8C@N8C@N7C@N7C@N7 MC0N6C0N6C0N6C`N6C`N5C`N5BPN5BPN4BPN4BPN4B@N3B@N3B@N3B0N2B0N2 MB0N2B0N1B`N1B`N1B`N1APN0APJ0APJ0A@J/A@J/A@J/A@J.A0J.A0J.A0J- MA`J-A`J-A`J,A`J,@PJ,@PJ+@PJ+@@J+@@J+@@J*@0J*@0J*@0J)@0J)@`J) M@`J(@`J(?PJ(?PJ'?PJ'?PJ'?@J&?@J&?@J&?0J&?0J%?0J%?`J%?`J$?`J$ M?`J$>PJ#>PJ#>PF#>@F">@F">@F">0F!>0F!>0F!>0F`>`F`>`F`>`F`=PE_ M=PE_=PE_=PE^=@E^=@E^=@E]=0E]=0E]=0E\=`E\=`E\=`E[=`E[<PE[<PE[ M<PEZ<@EZ<@EZ<@EY<@EY<0EY<0EX<0EX<`EX<`EW<`EW;PEW;PEV;PEV;PEV M;@AU;@AU;@AU;0AU;0AT;0AT;0AT;`AS;`AS;`AS:PAR:PAR:PAR:@AQ:@AQ M:@AQ:@AP:0AP:0AP:0AP:`AO:`AO:`AO:`AN9PAN9PAN9PAM9@AM9@AM9@AL M90AL90AL90AK90AK9`AK9`AJ9`AJ8PAJ8PAJ8PAI8PAI8@AI8@=H8@=H80=H M80=G80=G8`=G8`=F8`=F8`=F7P=E7P=E7P=E7@=E7@=D7@=D7@=D70=C70=C M70=C7`=B7`=B7`=B6P=A6P=A6P=A6P=@6@=@6@=@6@=?60=?60=?60=?60=> M6`=>6`=>6`==5P==5P==5P=<5@=<5@=<5@=;5@9;509;509:509:5`9:5`9: M5`995`994P994P984P984@984@974@9740974096409640964`954`954`95 M3P943P943P943P943@933@933@933092309230923`913`913`913`902P90 M2P902P9/2@9/2@9/2@9/2@9.205.205.205-2`5-2`5-2`5,1P5,1P5,1P5+ M1P5+1@5+1@5*1@5*105*105)105)105)1`5)1`5(1`5(0P5(0P5'0P5'0@5' M0@5&0@5&0@5&005%005%005%0`5$0`5$0`5$0`5$/P5#/P5#/P5#/@5"/@5" M/@5"/05!/01!/01!/01`/`1`/`1`/`0_.P0_.P0_.P0^.P0^.@0``*RA#:RA M#:RA#:N@#:N@#:N@#*J@#*J?#*J?#*F?#*F>#*F>#*B>#*B=#*B=#*>=#*>= M#*><#*><#*:<#*:;#*:;#*6;#*6;#*6:#*2:#*2:#*29#*.9#*.9#*.8#**8 M#**8#**8#**7#*&7#*&7#*&6#*"6#*"6#*"6#)^5#)^5#)^5#)Z4#)Z4#)Z4 M#)V3"YV3"YV3"YR3"YR2"YR2"YR2"YN1"YN1"YN1"YJ0"YJ0"YJ0"YF0"YF/ M"YF/"YB/"YB."YB."Y>."Y>."Y>-"Y>-"Y:-"Y:,"Y:,"Y6,"Y6+"Y6+"Y2+ M"Y2+"Y2*"Y.*"Y.*"Y.)"Y*)"Y*)"Y*)"Y&("Y&("Y&("Y&'"Y"'"I"'"I"& M"H^&"H^&"H^&"HZ%"HZ%"HZ%"HV$"HV$"HV$"HR$"HR#"HR#"HR#"HN""HN" M"HN""HJ!"HJ!"HJ!"HF!"HF`"HF`"HB`"HA_"HA_"H=_"H=_"H=^"H9^"H9^ M"H9]"H9]"H5]"H5\"H5\"H1\"H1\"H1["H-["H-["8-Z"8)Z"8)Z"8)Z"8%Y M"8%Y"8%Y"8%X"8!X"8!X"8!W"7]W"7]W"7]W"7YV"7YV"7YV"7UU"7UU"7UU M"7QU"7QT"7QT"7MT"7MS"7MS"7MS"7IR"7IR"7IR"7ER"7EQ"7EQ"7AQ"7AP M"7AP"7=P"7=P"7=O"79O"79O"79N"'9N"'5N"'5M"'5M"'1M"'1M"'1L"'-L M"'-L"'-K"')K"')K"')K"'%J"'%J"'%J"'%I"'!I"'!I"'!H"&]H"&]H"&]H M"&YG"&YG"&YG"&UF"&UF"&UF"&QF"&QE"&QE"&ME"&MD"&MD"&MD"&IC"&IC M"&IC"&EC"&EB"&EB!VAB!VAA!VAA!V=A!V=A!V=@!V9@!V9@!V9?!V9?!V5? M!V5>!V5>!V1>!V1>!V1=!V-=!V-=!V-<!V)<!V)<!V)<!V%;!V%;!V%;!V!: M!V!:!V!:!V!9!U]9!U]9!U]9!UY8!UY8!UY8!UU7!UU7!UU7!UQ7!UQ6!UQ6 M!UM6!EM5!EM5!EM5!EI4!EI4!EI4!EE4!EE3!EE3!EA3!EA2!EA2!E=2!E=2 M!E=1!E91!E91!E90!E50!E50!E5/!E5/!E1/!E1/!E1.!E-.!E-.!E--!E)- M!E)-!E)-!E%,!E%,!E%,!E!+!E!+!E!+!E!*!D]*!D]*!D]*!DY)!4Y)!4Y) M!4U(!4U(!4U(!4Q'!4Q'!4Q'!4M'!4M&!4M&!4I&!4I%!4I%!4I%!4E%!4E$ M!4E$!4A$!4A#!4A#!4=#!4="!4="!49"!49"!49!!45!!45!!45`!45`!41` M!41`!40_!4,_!4,_!4,^!4(^!4(^!4(]!4$]!4$]!$$]!$`\!$`\!$`\!#\[ M!#\[!#\[!#\[!```K:(-K*$-K*$-K*$-JZ`-JZ`-JZ`-JJ`,JI\,JI\,J9\, MJ9X,J9X,J)X,J)T,J)T,J)T,IYT,IYP,IYP,IIP,IIL,IIL,I9L,I9L,I9H, MI)H,I)H,I)D,HYD,HYD,HY@,HY@,HI@,HI@,HI<,H9<,H9<,H98,H)8,H)8, MH)8,GY4,GY4,GY4,GI0,GI0,GI0,G9,+G9,+G9,+G9,+G)(+G)(+G)(+FY$+ MFY$+FY$+FI$+FI`+FI`+F9`+F8\+F8\+F(\+F(X+F(X+F(X+EXX+EXT+EXT+ MEHT+EHP+EHP+E8P+E8P+E8L+E(L+E(L+E(H+DXH+DXH+DXD+DHD+DHD+DHD+ MDH@+D8@+D8@+D8<+D(<*D(<*D(<*CX8*CX8*CX8*CH4*CH4*CH4*C80*C80* MC80*C80*C(,*C(,*C(,*BX(*BX(*BX(*BH(*BH$*BH$*B8$*B8`*B8`*B(`* MB'\*B'\*AW\*AW\*AWX*AWX*AGX*AGT*AGT*A7T*A7T*A7P*A'P*A'P*A'L* M@WL*@WL)@WH)@GH)@GH)@GH)@GD)@7D)@7D)@7@)@'@)@'@)@'@)?W<)?W<) M?W<)?G8)?G8)?G8)?74)?74)?74)?'4)?'0)?'0)?'0)>W,)>W,)>W,)>G,) M>G()>G()>7()>7$)>7$)>'$)>'`)>'`)=W`)=W`)=V\)=V\)=F\)=FX(=FX( M=6X(=6X(=6T(=&T(=&T(=&P(<VP(<VP(<VL(<FL(<FL(<FL(<6H(<6H(<6H( M<6D(<&D(<&D(<&D(;V@(;V@(;V@(;F<(;F<(;F<(;68(;68(;68(;&8(;&4( M;&4(;&4(:V0(:V0(:V0(:F0(:F,(:F,(:6,(:6((:6(':&(':&$':&$'9V$' M9V$'9V`'9F`'9F`'9E\'9E\'95\'95X'95X'9%X'9%X'9%T'8UT'8UT'8UP' M8EP'8EP'8EP'85L'85L'85L'85H'8%H'8%H'8%D'7UD'7UD'7UD'7E@'7E@' M7E@'75<'75<'75<'7%<'7%8'7%8'6U8&6U4&6U4&6U4&6E0&6E0&6E0&650& M65,&65,&6%,&6%(&6%(&5U(&5U(&5U$&5E$&5E$&5E`&5E`&55`&54\&54\& M5$\&5$\&5$X&4TX&4TX&4TT&4DT&4DT&4DT&44P&44P&44P&4$L&4$L&4$L& M4$H&3TH&3TH&3TH&3DD%3DD%3DD%34@%34@%34@%3$@%3$<%3$<%2T<%2T8% M2T8%2T8%2D4%2D4%2D4%244%240%240%2$0%2$,%2$,%1T,%1T,%1T(%1D(% M1D(%1D$%14$%14$%14`%14`%1$`%1$`%1#\%0S\%0S\%0SX%0CX%0CX%0CX% M03T%03T$03T$0#P$0#P$0#P$0#L$/SL$/SL$``"MH@VMH@VLH0VLH0VLH0VK MH`VKH`VKH`VJH`RJGPRJGPRIGPRIG@RIG@RIG@RHG@RHG0RHG0RGG0RGG`RG MG`RFG`RFFPRFFPREFPREFPREF@RDF@RDF@RDF0RCF0RCF0RCF0RCF`RBF`RB MF`RBEPRAEPRAEPRAE@R@E@R@E@R@E@R?E0R?E0R?E0R>E`R>E`R>E`R>E`R= MDPN=DPN=DPN<D@N<D@N<D@N;D0N;D0N;D0N:D0N:D`N:D`N9D`N9CPN9CPN8 MCPN8CPN8C@N8C@N7C@N7C0N7C0N6C0N6C`N6C`N5C`N5C`N5BPN4BPN4BPN4 MB@N3B@N3B@N3B@N3B0N2B0N2B0N2B`N1B`N1B`N1APN0APJ0APJ0APJ/A@J/ MA@J/A@J.A0J.A0J.A0J-A0J-A`J-A`J-A`J,@PJ,@PJ,@PJ+@@J+@@J+@@J* M@@J*@0J*@0J)@0J)@`J)@`J(@`J(@`J(?PJ(?PJ'?PJ'?@J'?@J&?@J&?0J& M?0J%?0J%?0J%?`J$?`J$?`J$>PJ#>PJ#>PF#>PF">@F">@F">@F">0F!>0F! M>0F!>`F`>`F`>`F`>`E_=PE_=PE_=PE^=@E^=@E^=@E]=0E]=0E]=0E]=0E\ M=`E\=`E\=`E[<PE[<PE[<PEZ<PEZ<@EZ<@EY<@EY<0EY<0EX<0EX<`EX<`EX M<`EW<`EW;PEW;PEV;PEV;@AV;@AU;@AU;@AU;0AT;0AT;0AT;`AS;`AS;`AS M:PAR:PAR:PAR:PAR:@AQ:@AQ:@AQ:0AP:0AP:0AP:0AO:`AO:`AO:`AN9PAN M9PAN9PAM9@AM9@AM9@AM9@AL90AL90AL90AK9`AK9`AK9`AJ9`AJ8PAJ8PAI M8PAI8@AI8@=H8@=H80=H80=G80=G80=G8`=G8`=F8`=F7P=F7P=E7P=E7P=E M7@=D7@=D7@=D70=C70=C70=C7`=B7`=B7`=B7`=B6P=A6P=A6P=A6@=@6@=@ M6@=@6@=?60=?60=?60=>6`=>6`=>6`==5P==5P==5P=<5P=<5@=<5@=<5@9; M509;509;509:509:5`9:5`995`994P994P984P984@984@974@974@974097 M409640964`964`954`954`953P943P943P943@933@933@93309230923092 M30913`913`913`912P902P902P902P9/2@9/2@9/2@9.205.205.205-2`5- M2`5-2`5,2`5,1P5,1P5,1P5+1@5+1@5+1@5*1@5*105*105)105)1`5)1`5( M1`5(0P5(0P5'0P5'0P5'0@5&0@5&0@5&005&005%005%005%0`5$0`5$0`5$ M/P5#/P5#/P5#/@5"/@5"/@5"/@5!/05!/01!/01!/`1`/`1`/`1`/`0_.P0` M`*VB#:VB#:VB#:RA#:RA#:RA#:NA#:N@#:N@#:J@#*J?#*J?#*J?#*F>#*F> M#*F>#*B>#*B=#*B=#*>=#*><#*><#*:<#*:<#*:;#*6;#*6;#*6:#*2:#*2: M#*29#*29#*.9#*.9#*.8#**8#**8#**7#*&7#*&7#*&7#*"6#*"6#*"6#)^5 M#)^5#)^5#)^4#)Z4#)Z4#)Z4#)V3"YV3"YV3"YR2"YR2"YR2"YN2"YN1"YN1 M"YJ1"YJ0"YJ0"YF0"YF/"YF/"YF/"YB/"YB."YB."Y>."Y>-"Y>-"Y:-"Y:, M"Y:,"Y6,"Y6,"Y6+"Y2+"Y2+"Y2*"Y2*"Y.*"Y.*"Y.)"Y*)"Y*)"Y*("Y&( M"Y&("Y&'"Y"'"Y"'"I"'"H^&"H^&"H^&"HZ%"HZ%"HZ%"HZ%"HV$"HV$"HV$ M"HR#"HR#"HR#"HN""HN""HN""HJ""HJ!"HJ!"HF!"HF`"HF`"HF`"HB`"HA_ M"HA_"H=_"H=^"H=^"H9^"H9]"H9]"H5]"H5]"H5\"H1\"H1\"H1["H-["H-[ M"H-["8-Z"8)Z"8)Z"8)Y"8%Y"8%Y"8%X"8!X"8!X"8!X"7]W"7]W"7]W"7YV M"7YV"7YV"7YV"7UU"7UU"7UU"7QT"7QT"7QT"7MS"7MS"7MS"7IS"7IR"7IR M"7ER"7EQ"7EQ"7AQ"7AQ"7AP"7AP"7=P"7=O"7=O"79O"79N"'9N"'5N"'5N M"'5M"'1M"'1M"'1L"'-L"'-L"'-L"'-K"')K"')K"')J"'%J"'%J"'%I"'!I M"'!I"'!I"&]H"&]H"&]H"&YG"&YG"&YG"&UG"&UF"&UF"&UF"&QE"&QE"&QE M"&MD"&MD"&MD"&ID"&IC"&IC"&EC"&EB"&EB!VAB!VAB!VAA!VAA!V=A!V=@ M!V=@!V9@!V9?!V9?!V5?!V5?!V5>!V1>!V1>!V1=!V-=!V-=!V-=!V)<!V)< M!V)<!V);!V%;!V%;!V%:!V!:!V!:!V!:!U]9!U]9!U]9!UY8!UY8!UY8!UU8 M!UU7!UU7!UU7!UQ6!UQ6!UQ6!EM5!EM5!EM5!EI5!EI4!EI4!EE4!EE3!EE3 M!EA3!EA3!EA2!E=2!E=2!E=1!E=1!E91!E90!E90!E50!E50!E5/!E1/!E1/ M!E1.!E-.!E-.!E-.!E)-!E)-!E)-!E),!E%,!E%,!E%+!E!+!E!+!E!+!D]* M!D]*!D]*!DY)!4Y)!4Y)!4U(!4U(!4U(!4Q(!4Q'!4Q'!4Q'!4M&!4M&!4M& M!4I&!4I%!4I%!4E%!4E$!4E$!4A$!4A#!4A#!4=#!4=#!4="!4="!49"!49! M!49!!45!!45!!45`!41`!41`!40_!4,_!4,_!4,^!4(^!4(^!4(^!4$]!4$] M!$$]!$$\!$`\!$`\!$`\!```KJ,-K:(-K:(-K:(-K*$-K*$-K*$-JZ$-JZ`- MJZ`-JJ`,JI\,JI\,JI\,J9X,J9X,J9X,J)X,J)T,J)T,IYT,IYP,IYP,IIP, MIIP,IIL,I9L,I9L,I9H,I9H,I)H,I)D,I)D,HYD,HYD,HY@,HI@,HI@,HI<, MH9<,H9<,H9<,H)8,H)8,H)8,GY4,GY4,GY4,GY0,GI0,GI0,GI0,G9,+G9,+ MG9,+G)(+G)(+G)(+FY(+FY$+FY$+FI$+FI`+FI`+FI`+F8\+F8\+F8\+F(\+ MF(X+F(X+EXX+EXT+EXT+EHT+EHT+EHP+E8P+E8P+E8L+E(L+E(L+E(H+E(H+ MDXH+DXH+DXD+DHD+DHD+DH@+D8@+D8@+D8@+D(<+D(<*D(<*CX8*CX8*CX8* MCX4*CH4*CH4*CH4*C80*C80*C80*C(,*C(,*C(,*BX,*BX(*BX(*BH(*BH$* MBH$*B8$*B8`*B8`*B8`*B(`*B'\*B'\*AW\*AWX*AWX*AGX*AGX*AGT*A7T* MA7T*A7P*A'P*A'P*A'L*A'L*@WL*@WL)@WH)@GH)@GH)@GD)@7D)@7D)@7D) M@'@)@'@)@'@)?W<)?W<)?W<)?G8)?G8)?G8)?G8)?74)?74)?74)?'0)?'0) M?'0)>W0)>W,)>W,)>G,)>G()>G()>7()>7$)>7$)>7$)>'$)>'`)>'`)=W`) M=V\)=V\)=F\)=F\)=FX(=6X(=6X(=6T(=&T(=&T(=&P(=&P(<VP(<VP(<VL( M<FL(<FL(<FH(<6H(<6H(<6H(<&D(<&D(<&D(;V@(;V@(;V@(;F<(;F<(;F<( M;F<(;68(;68(;68(;&4(;&4(;&4(:V4(:V0(:V0(:F0(:F,(:F,(:6,(:6(( M:6(':6(':&(':&$':&$'9V$'9V`'9V`'9F`'9F`'9E\'95\'95\'95X'9%X' M9%X'9%T'8UT'8UT'8UT'8UP'8EP'8EP'8EL'85L'85L'85H'8%H'8%H'8%H' M7UD'7UD'7UD'7E@'7E@'7E@'7E@'75<'75<'75<'7%8'7%8'7%8&6U4&6U4& M6U4&6E4&6E0&6E0&650&65,&65,&6%,&6%,&6%(&6%(&5U(&5U$&5U$&5E$& M5E`&5E`&55`&55`&54\&5$\&5$\&5$X&4TX&4TX&4TX&4TT&4DT&4DT&4DP& M44P&44P&44L&4$L&4$L&4$L&3TH&3TH&3TH&3DD%3DD%3DD%34D%34@%34@% M34@%3$<%3$<%3$<%2T8%2T8%2T8%2D8%2D4%2D4%244%240%240%2$0%2$0% M2$,%2$,%1T,%1T(%1T(%1D(%1D$%1D$%14$%14$%14`%1$`%1$`%1#\%0S\% M0S\%0S\%0CX%0CX%0CX%0CT%03T$03T$03P$0#P$0#P$``"NHPVNHPVMH@VM MH@VMH@VLH0VLH0VLH0VKH0VKH`VKH`VKH`RJGPRJGPRJGPRIGPRIG@RIG@RH MG@RHG0RHG0RGG0RGG`RGG`RFG`RFG`RFFPRFFPREFPREF@REF@RDF@RDF@RD MF0RCF0RCF0RCF`RBF`RBF`RBEPRAEPRAEPRAEPR@E@R@E@R@E@R@E0R?E0R? ME0R?E0R>E`R>E`R>E`R=DPN=DPN=DPN<D@N<D@N<D@N;D@N;D0N;D0N;D0N: MD`N:D`N:D`N9D`N9CPN9CPN8CPN8C@N8C@N7C@N7C0N7C0N6C0N6C0N6C`N5 MC`N5C`N5BPN5BPN4BPN4BPN4B@N3B@N3B@N3B0N2B0N2B0N2B`N1B`N1B`N1 MB`N0APN0APJ0APJ0A@J/A@J/A@J/A@J.A0J.A0J.A0J-A`J-A`J-A`J,@PJ, M@PJ,@PJ+@PJ+@@J+@@J*@@J*@0J*@0J*@0J)@0J)@`J)@`J(@`J(?PJ(?PJ' M?PJ'?@J'?@J&?@J&?@J&?0J%?0J%?0J%?`J%?`J$?`J$?`J$>PJ#>PJ#>PF# M>@F">@F">@F">0F!>0F!>0F!>0F`>`F`>`F`>`E_=PE_=PE_=PE_=PE^=@E^ M=@E^=@E]=0E]=0E]=0E\=`E\=`E\=`E[=`E[<PE[<PEZ<PEZ<@EZ<@EZ<@EY M<0EY<0EY<0EX<0EX<`EX<`EW<`EW;PEW;PEV;PEV;PEV;@AU;@AU;@AU;0AT M;0AT;0AT;`AT;`AS;`AS;`AS:PAR:PAR:PAR:@AQ:@AQ:@AQ:@AP:0AP:0AP M:0AO:`AO:`AO:`AO9PAN9PAN9PAN9PAM9@AM9@AM9@AL90AL90AL90AK90AK M9`AK9`AJ9`AJ8PAJ8PAI8PAI8@AI8@AI8@=H8@=H80=H80=G80=G8`=G8`=F M8`=F8`=F7P=E7P=E7P=E7@=D7@=D7@=D70=D70=C70=C70=C7`=B7`=B7`=B M6P=A6P=A6P=A6P=@6@=@6@=@6@=?60=?60=?60=>6`=>6`=>6`=>6`==5P== M5P==5P=<5@=<5@=<5@9;5@9;509;509:509:5`9:5`995`994P994P994P98 M4P984@984@974@9740974096409640964`954`954`953P943P943P943@93 M3@933@933@933092309230923`913`913`913`902P902P902P9/2@9/2@9/ M2@9.205.205.205.205-2`5-2`5-2`5,1P5,1P5,1P5+1P5+1@5+1@5*1@5* M105*105)105)1`5)1`5(1`5(1`5(0P5(0P5'0P5'0@5'0@5&0@5&0@5&005% M005%005%0`5$0`5$0`5$/P5#/P5#/P5#/P5#/@5"/@5"/@5"/05!/01!/01! M/01`/`0``*ZC#:ZC#:ZC#:VB#:VB#:VB#:RB#:RA#:RA#:RA#:N@#:N@#:N@ M#*J?#*J?#*J?#*F?#*F>#*F>#*B>#*B=#*B=#*>=#*>=#*><#*:<#*:<#*:; M#*:;#*6;#*6:#*6:#*2:#*2:#*29#*.9#*.9#*.8#**8#**8#**8#*&7#*&7 M#*&7#*&6#*"6#*"6#*"5#)^5#)^5#)^5#)Z4#)Z4#)Z4#)V3"YV3"YV3"YR3 M"YR2"YR2"YN2"YN1"YN1"YN1"YJ0"YJ0"YJ0"YF0"YF/"YF/"YB/"YB."YB. M"Y>."Y>."Y>-"Y:-"Y:-"Y:,"Y:,"Y6,"Y6+"Y6+"Y2+"Y2+"Y2*"Y.*"Y.* M"Y.)"Y*)"Y*)"Y*("Y&("Y&("Y&("Y"'"Y"'"I"'"I"&"H^&"H^&"H^&"HZ% M"HZ%"HZ%"HV$"HV$"HV$"HR#"HR#"HR#"HN#"HN""HN""HN""HJ!"HJ!"HJ! M"HF!"HF`"HF`"HB`"HA_"HA_"H=_"H=^"H=^"H9^"H9^"H9]"H5]"H5]"H5\ M"H5\"H1\"H1\"H1["H-["H-["8-Z"8)Z"8)Z"8)Y"8%Y"8%Y"8%Y"8!X"8!X M"8!X"8!W"7]W"7]W"7]W"7YV"7YV"7YV"7UU"7UU"7UU"7QT"7QT"7QT"7MT M"7MS"7MS"7MS"7IR"7IR"7IR"7ER"7EQ"7EQ"7AQ"7AP"7AP"7=P"7=O"7=O M"79O"79O"79N"'5N"'5N"'5M"'5M"'1M"'1M"'1L"'-L"'-L"'-K"')K"')K M"')J"'%J"'%J"'%J"'!I"'!I"'!I"'!H"&]H"&]H"&]H"&YG"&YG"&YG"&UF M"&UF"&UF"&QE"&QE"&QE"&ME"&MD"&MD"&ID"&IC"&IC"&IC"&EC"&EB"&EB M!VAB!VAA!VAA!V=A!V=@!V=@!V9@!V9@!V9?!V5?!V5?!V5>!V5>!V1>!V1> M!V1=!V-=!V-=!V-<!V)<!V)<!V);!V%;!V%;!V%;!V!:!V!:!V!:!U]9!U]9 M!U]9!U]9!UY8!UY8!UY8!UU7!UU7!UU7!UQ6!UQ6!UQ6!UM6!EM5!EM5!EI5 M!EI4!EI4!EI4!EE4!EE3!EE3!EA3!EA2!EA2!E=2!E=1!E=1!E91!E91!E90 M!E50!E50!E5/!E1/!E1/!E1/!E1.!E-.!E-.!E--!E)-!E)-!E),!E%,!E%, M!E%,!E!+!E!+!E!+!D]*!D]*!D]*!D]*!DY)!4Y)!4Y)!4U(!4U(!4U(!4Q' M!4Q'!4Q'!4M'!4M&!4M&!4I&!4I%!4I%!4E%!4E$!4E$!4E$!4A$!4A#!4A# M!4=#!4="!4="!49"!49"!49!!45!!45!!45`!41`!41`!40_!40_!4,_!4,_ M!4,^!4(^!4(^!4(]!4$]!$$]!$$]!```KZ0-KJ,-KJ,-KJ,-K:(-K:(-K:(- MK:(-K*$-K*$-K*$-JZ`-JZ`-JZ`,JI\,JI\,JI\,J9\,J9X,J9X,J)X,J)T, MJ)T,IYT,IYT,IYP,IYP,IIP,IIL,IIL,I9L,I9H,I9H,I)H,I)H,I)D,HYD, MHYD,HY@,HI@,HI@,HI@,HI<,H9<,H9<,H98,H)8,H)8,H)4,GY4,GY4,GY4, MGI0,GI0,GI0,G9,+G9,+G9,+G),+G)(+G)(+G)(+FY$+FY$+FY$+FI`+FI`+ MFI`+F9`+F8\+F8\+F(\+F(X+F(X+EXX+EXX+EXT+EXT+EHT+EHP+EHP+E8P+ ME8L+E8L+E(L+E(L+E(H+DXH+DXH+DXD+DHD+DHD+DHD+D8@+D8@+D8@+D8<+ MD(<*D(<*D(8*CX8*CX8*CX8*CH4*CH4*CH4*C80*C80*C80*C(0*C(,*C(,* MC(,*BX(*BX(*BX(*BH$*BH$*BH$*B8$*B8`*B8`*B(`*B'\*B'\*AW\*AW\* MAWX*AGX*AGX*AGT*AGT*A7T*A7P*A7P*A'P*A'P*A'L*@WL*@WL)@WH)@GH) M@GH)@GH)@7D)@7D)@7D)@7@)@'@)@'@)@'<)?W<)?W<)?W<)?G8)?G8)?G8) M?74)?74)?74)?'4)?'0)?'0)>W0)>W,)>W,)>W,)>G()>G()>G()>7()>7$) M>7$)>'$)>'`)>'`)=W`)=W`)=V\)=F\)=F\)=FX(=FX(=6X(=6T(=6T(=&T( M=&T(=&P(<VP(<VP(<VL(<FL(<FL(<FL(<6H(<6H(<6H(<&D(<&D(<&D(<&@( M;V@(;V@(;V@(;F<(;F<(;F<(;68(;68(;68(;&8(;&4(;&4(:V4(:V0(:V0( M:V0(:F,(:F,(:F,(:6,(:6((:6(':&(':&$':&$'9V$'9V$'9V`'9F`'9F`' M9E\'95\'95\'95X'95X'9%X'9%X'9%T'8UT'8UT'8UP'8EP'8EP'8EP'85L' M85L'85L'8%H'8%H'8%H'8%D'7UD'7UD'7UD'7E@'7E@'7E@'75<'75<'75<' M7%8'7%8'7%8'6U8&6U4&6U4&6E4&6E0&6E0&6E0&650&65,&65,&6%,&6%(& M6%(&5U(&5U$&5U$&5E$&5E$&5E`&55`&55`&54\&54\&5$\&5$\&5$X&4TX& M4TX&4TT&4DT&4DT&4DP&44P&44P&44P&4$L&4$L&4$L&3TH&3TH&3TH&3TH& M3DD%3DD%3DD%34@%34@%34@%3$<%3$<%3$<%2T<%2T8%2T8%2D8%2D4%2D4% M2D4%244%240%240%2$0%2$,%2$,%1T,%1T(%1T(%1D(%1D(%1D$%14$%14$% M14`%1$`%1$`%1$`%1#\%0S\%0S\%0SX%0CX%0CX%0CT%03T%03T$``"OI`VO MI`VNHPVNHPVNHPVMH@VMH@VMH@VMH@VLH0VLH0VLH0VKH`VKH`VKH`VJH`RJ MGPRJGPRIGPRIG@RIG@RHG@RHG0RHG0RHG0RGG0RGG`RGG`RFG`RFFPRFFPRE MFPREFPREF@RDF@RDF@RDF0RCF0RCF0RCF`RBF`RBF`RBF`RBEPRAEPRAEPRA ME@R@E@R@E@R@E@R?E0R?E0R?E0R>E`R>E`R>E`R=DPN=DPN=DPN=DPN<D@N< MD@N<D@N;D0N;D0N;D0N:D0N:D`N:D`N9D`N9CPN9CPN8CPN8C@N8C@N7C@N7 MC@N7C0N7C0N6C0N6C`N6C`N5C`N5C`N5BPN4BPN4BPN4B@N3B@N3B@N3B0N2 MB0N2B0N2B0N2B`N1B`N1B`N1APN0APJ0APJ0APJ/A@J/A@J/A@J.A0J.A0J. MA0J-A`J-A`J-A`J,A`J,@PJ,@PJ,@PJ+@@J+@@J+@@J*@@J*@0J*@0J)@0J) M@`J)@`J(@`J(?PJ(?PJ'?PJ'?PJ'?@J'?@J&?@J&?0J&?0J%?0J%?0J%?`J$ M?`J$?`J$>PJ#>PJ#>PF#>@F">@F">@F">@F">0F!>0F!>0F!>`F`>`F`>`F` M>`E_=PE_=PE_=PE^=@E^=@E^=@E]=0E]=0E]=0E\=0E\=`E\=`E\=`E[<PE[ M<PE[<PEZ<PEZ<@EZ<@EY<@EY<0EY<0EX<0EX<`EX<`EW<`EW<`EW;PEW;PEV M;PEV;@AV;@AU;@AU;0AU;0AT;0AT;0AT;`AS;`AS;`AS:PAR:PAR:PAR:PAQ M:@AQ:@AQ:@AQ:0AP:0AP:0AP:`AO:`AO:`AO:`AN9PAN9PAN9PAM9@AM9@AM M9@AL9@AL90AL90AL90AK9`AK9`AK9`AJ8PAJ8PAJ8PAI8PAI8@AI8@=H8@=H M80=H80=G80=G80=G8`=F8`=F8`=F7P=F7P=E7P=E7@=E7@=D7@=D7@=D70=C M70=C70=C7`=B7`=B7`=B7`=A6P=A6P=A6P=A6@=@6@=@6@=@60=?60=?60=? M60=>6`=>6`=>6`==5P==5P==5P=<5P=<5@=<5@=;5@9;509;509;509:5`9: M5`9:5`995`994P994P984P984@984@974@974@974096409640964`964`95 M4`953P953P943P943P943@933@933@9330923092309230913`913`913`90 M2P902P902P902@9/2@9/2@9/2@9.205.205.205-2`5-2`5-2`5,2`5,1P5, M1P5+1P5+1@5+1@5+1@5*105*105*105)105)1`5)1`5(1`5(0P5(0P5'0P5' M0P5'0@5&0@5&0@5&005%005%005%0`5%0`5$0`5$0`5$/P5#/P5#/P5#/@5" M/@5"/@5"/@5!/04``*^D#:^D#:^D#:ZC#:ZC#:ZC#:ZC#:VB#:VB#:VB#:RA M#:RA#:RA#:N@#:N@#:N@#:J@#*J?#*J?#*F?#*F>#*F>#*F>#*B>#*B=#*B= M#*>=#*><#*><#*:<#*:;#*:;#*6;#*6;#*6:#*2:#*2:#*29#*.9#*.9#*.9 M#*.8#**8#**8#**7#*&7#*&7#*&6#*"6#*"6#*"6#)^5#)^5#)^5#)Z4#)Z4 M#)Z4#)Z4#)V3"YV3"YV3"YR2"YR2"YR2"YN1"YN1"YN1"YJ1"YJ0"YJ0"YF0 M"YF/"YF/"YB/"YB/"YB."YB."Y>."Y>-"Y>-"Y:-"Y:,"Y:,"Y6,"Y6,"Y6+ M"Y2+"Y2+"Y2*"Y.*"Y.*"Y.*"Y.)"Y*)"Y*)"Y*("Y&("Y&("Y&'"Y"'"I"' M"I"'"H^&"H^&"H^&"HZ%"HZ%"HZ%"HV$"HV$"HV$"HV$"HR#"HR#"HR#"HN" M"HN""HN""HJ""HJ!"HJ!"HF!"HF`"HF`"HB`"HA_"HA_"HA_"H=_"H=^"H=^ M"H9^"H9]"H9]"H5]"H5]"H5\"H1\"H1\"H1["H-["H-["8-Z"8)Z"8)Z"8)Z M"8)Y"8%Y"8%Y"8%X"8!X"8!X"8!X"7]W"7]W"7]W"7YV"7YV"7YV"7UU"7UU M"7UU"7UU"7QT"7QT"7QT"7MS"7MS"7MS"7IS"7IR"7IR"7ER"7EQ"7EQ"7AQ M"7AP"7AP"7=P"7=P"7=O"7=O"79O"79N"'9N"'5N"'5N"'5M"'1M"'1M"'1L M"'-L"'-L"'-K"')K"')K"')K"')J"'%J"'%J"'%I"'!I"'!I"'!I"&]H"&]H M"&]H"&YG"&YG"&YG"&UF"&UF"&UF"&QF"&QE"&QE"&QE"&MD"&MD"&MD"&ID M"&IC"&IC"&EC"&EB"&EB!VAB!VAA!VAA!V=A!V=A!V=@!V=@!V9@!V9?!V9? M!V5?!V5?!V5>!V1>!V1>!V1=!V-=!V-=!V-<!V)<!V)<!V)<!V%;!V%;!V%; M!V%:!V!:!V!:!V!:!U]9!U]9!U]9!UY8!UY8!UY8!UU7!UU7!UU7!UQ7!UQ6 M!UQ6!UQ6!EM5!EM5!EM5!EI5!EI4!EI4!EE4!EE3!EE3!EA3!EA2!EA2!E=2 M!E=2!E=1!E91!E91!E90!E90!E50!E50!E5/!E1/!E1/!E1.!E-.!E-.!E-- M!E)-!E)-!E)-!E%,!E%,!E%,!E%+!E!+!E!+!E!+!D]*!D]*!D]*!DY)!4Y) M!4Y)!4U(!4U(!4U(!4Q(!4Q'!4Q'!4M'!4M&!4M&!4M&!4I&!4I%!4I%!4E% M!4E$!4E$!4A$!4A#!4A#!4=#!4=#!4="!49"!49"!49!!49!!45!!45`!45` M!41`!41`!40_!4,_!4,_!4,^!4(^!4(^!4(^!0``L*4-KZ0-KZ0-KZ0-KZ,- MKJ,-KJ,-KJ,-K:(-K:(-K:(-K*$-K*$-K*$-JZ$-JZ`-JZ`-JJ`,JI\,JI\, MJ9\,J9X,J9X,J9X,J)X,J)T,J)T,IYT,IYP,IYP,IIP,IIL,IIL,I9L,I9L, MI9H,I)H,I)H,I)D,I)D,HYD,HYD,HY@,HI@,HI@,HI<,H9<,H9<,H98,H)8, MH)8,H)8,GY4,GY4,GY4,GI0,GI0,GI0,GI0,G9,+G9,+G9,+G)(+G)(+G)(+ MFY$+FY$+FY$+FI$+FI`+FI`+F9`+F8\+F8\+F8\+F(\+F(X+F(X+EXX+EXT+ MEXT+EHT+EHP+EHP+E8P+E8P+E8L+E(L+E(L+E(H+DXH+DXH+DXH+DXD+DHD+ MDHD+DH@+D8@+D8@+D8<+D(<+D(<*D(<*CX8*CX8*CX8*CH4*CH4*CH4*CH4* MC80*C80*C80*C(,*C(,*C(,*BX(*BX(*BX(*BH(*BH$*BH$*B8$*B8`*B8`* MB(`*B(`*B'\*B'\*AW\*AWX*AWX*AGX*AGT*AGT*A7T*A7T*A7P*A'P*A'P* MA'L*@WL*@WL)@WL)@WH)@GH)@GH)@GD)@7D)@7D)@7@)@'@)@'@)@'@)?W<) M?W<)?W<)?G8)?G8)?G8)?G8)?74)?74)?74)?'0)?'0)?'0)>W,)>W,)>W,) M>G,)>G()>G()>7()>7$)>7$)>'$)>'$)>'`)>'`)=W`)=V\)=V\)=F\)=FX( M=FX(=6X(=6X(=6T(=&T(=&T(=&P(<VP(<VP(<VP(<VL(<FL(<FL(<FH(<6H( M<6H(<6D(<&D(<&D(<&D(;V@(;V@(;V@(;F<(;F<(;F<(;6<(;68(;68(;68( M;&4(;&4(;&4(:V0(:V0(:V0(:F0(:F,(:F,(:6,(:6((:6(':&(':&(':&$' M:&$'9V$'9V`'9V`'9F`'9E\'9E\'95\'95\'95X'9%X'9%X'9%T'8UT'8UT' M8UT'8EP'8EP'8EP'8EL'85L'85L'85H'8%H'8%H'8%H'7UD'7UD'7UD'7E@' M7E@'7E@'75@'75<'75<'75<'7%8'7%8'7%8&6U4&6U4&6U4&6E4&6E0&6E0& M650&65,&65,&6%,&6%(&6%(&5U(&5U(&5U$&5U$&5E$&5E`&5E`&55`&55`& M54\&5$\&5$\&5$X&4TX&4TX&4TT&4DT&4DT&4DT&4DP&44P&44P&44L&4$L& M4$L&4$L&3TH&3TH&3TH&3DD%3DD%3DD%34@%34@%34@%3$@%3$<%3$<%3$<% M2T8%2T8%2T8%2D8%2D4%2D4%244%240%240%2$0%2$,%2$,%1T,%1T,%1T(% M1T(%1D(%1D$%1D$%14$%14$%14`%1$`%1$`%1#\%0S\%0S\%0SX%0CX%0CX% M``"PI0VPI0VPI`VOI`VOI`VOHPVNHPVNHPVNHPVMH@VMH@VMH@VLH0VLH0VL MH0VKH0VKH`VKH`VJH`RJGPRJGPRJGPRIG@RIG@RIG@RHG@RHG0RHG0RGG0RG MG`RGG`RFG`RFG`RFFPREFPREFPREF@REF@RDF@RDF0RDF0RCF0RCF0RCF`RB MF`RBF`RBEPRAEPRAEPRAEPR@E@R@E@R@E@R?E0R?E0R?E0R?E`R>E`R>E`R> ME`R=DPN=DPN=DPN<D@N<D@N<D@N;D@N;D0N;D0N:D0N:D`N:D`N:D`N9CPN9 MCPN9CPN8CPN8C@N8C@N7C@N7C0N7C0N6C0N6C0N6C`N5C`N5C`N5BPN4BPN4 MBPN4B@N4B@N3B@N3B@N3B0N2B0N2B0N2B`N1B`N1B`N1B`N0APN0APJ0APJ/ MA@J/A@J/A@J/A0J.A0J.A0J.A0J-A`J-A`J-A`J,@PJ,@PJ,@PJ+@PJ+@@J+ M@@J*@@J*@0J*@0J)@0J)@`J)@`J)@`J(@`J(?PJ(?PJ'?PJ'?@J'?@J&?@J& M?@J&?0J%?0J%?0J%?`J$?`J$?`J$>PJ$>PJ#>PJ#>PF#>@F">@F">@F">0F! M>0F!>0F!>0F`>`F`>`F`>`E_=PE_=PE_=PE^=@E^=@E^=@E^=@E]=0E]=0E] M=0E\=`E\=`E\=`E[=`E[<PE[<PEZ<PEZ<@EZ<@EY<@EY<0EY<0EY<0EX<0EX M<`EX<`EW<`EW;PEW;PEV;PEV;PEV;@AU;@AU;@AU;0AT;0AT;0AT;`AS;`AS M;`AS;`AS:PAR:PAR:PAR:@AQ:@AQ:@AQ:0AP:0AP:0AP:0AO:`AO:`AO:`AN M9PAN9PAN9PAN9PAM9@AM9@AM9@AL90AL90AL90AK9`AK9`AK9`AJ9`AJ8PAJ M8PAI8PAI8@AI8@=H8@=H8@=H80=H80=G80=G8`=G8`=F8`=F7P=F7P=E7P=E M7P=E7@=D7@=D7@=D70=C70=C70=C70=C7`=B7`=B7`=B6P=A6P=A6P=A6@=@ M6@=@6@=@6@=?60=?60=?60=>6`=>6`=>6`==6`==5P==5P==5P=<5@=<5@=< M5@9;509;509;509:509:5`9:5`995`994P994P984P984P984@984@974@97 M4097409640964`964`954`954`953P943P943P943@933@933@933@923092 M309230923`913`913`912P902P902P902P9/2@9/2@9/2@9.205.205.205- M205-2`5-2`5-2`5,1P5,1P5,1P5+1@5+1@5+1@5*1@5*105*105)105)1`5) M1`5(1`5(1`5(0P5'0P5'0P5'0@5'0@5&0@5&005&005%005%005%0`5$0`5$ M0`5$/P5#/P5#/P5#/P5"/@4``+"E#;"E#;"E#;"D#:^D#:^D#:^D#:ZC#:ZC M#:ZC#:VB#:VB#:VB#:RA#:RA#:RA#:NA#:N@#:N@#:N@#*J?#*J?#*J?#*F? M#*F>#*F>#*B>#*B=#*B=#*>=#*><#*><#*:<#*:<#*:;#*6;#*6;#*6:#*6: M#*2:#*2:#*29#*.9#*.9#*.8#**8#**8#**7#*&7#*&7#*&7#*"6#*"6#*"6 M#*"5#)^5#)^5#)^5#)Z4#)Z4#)Z4#)V3"YV3"YV3"YR2"YR2"YR2"YN2"YN1 M"YN1"YJ1"YJ0"YJ0"YJ0"YF0"YF/"YF/"YB/"YB."YB."Y>."Y>-"Y>-"Y:- M"Y:-"Y:,"Y6,"Y6,"Y6+"Y6+"Y2+"Y2+"Y2*"Y.*"Y.*"Y.)"Y*)"Y*)"Y*( M"Y&("Y&("Y&("Y"'"Y"'"I"'"H^&"H^&"H^&"H^&"HZ%"HZ%"HZ%"HV$"HV$ M"HV$"HR#"HR#"HR#"HN#"HN""HN""HJ""HJ!"HJ!"HJ!"HF`"HF`"HF`"HB` M"HA_"HA_"H=_"H=^"H=^"H9^"H9^"H9]"H5]"H5]"H5\"H5\"H1\"H1["H1[ M"H-["H-["8-Z"8)Z"8)Z"8)Y"8%Y"8%Y"8%Y"8!X"8!X"8!X"7]W"7]W"7]W M"7]V"7YV"7YV"7YV"7UU"7UU"7UU"7QT"7QT"7QT"7MT"7MS"7MS"7IS"7IR M"7IR"7IR"7EQ"7EQ"7EQ"7AQ"7AP"7AP"7=P"7=O"7=O"79O"79O"79N"'5N M"'5N"'5M"'1M"'1M"'1L"'1L"'-L"'-L"'-K"')K"')K"')J"'%J"'%J"'%J M"'!I"'!I"'!I"&]H"&]H"&]H"&]G"&YG"&YG"&YG"&UF"&UF"&UF"&QE"&QE M"&QE"&ME"&MD"&MD"&ID"&IC"&IC"&EC"&EB"&EB"&EB!VAB!VAA!VAA!V=A M!V=@!V=@!V9@!V9@!V9?!V5?!V5?!V5>!V1>!V1>!V1=!V1=!V-=!V-=!V-< M!V)<!V)<!V);!V%;!V%;!V%;!V!:!V!:!V!:!U]9!U]9!U]9!UY8!UY8!UY8 M!UY8!UU7!UU7!UU7!UQ6!UQ6!UQ6!EM6!EM5!EM5!EI5!EI4!EI4!EE4!EE3 M!EE3!EE3!EA3!EA2!EA2!E=2!E=1!E=1!E91!E91!E90!E50!E50!E5/!E1/ M!E1/!E1.!E-.!E-.!E-.!E--!E)-!E)-!E),!E%,!E%,!E%,!E!+!E!+!E!+ M!D]*!D]*!D]*!DY)!4Y)!4Y)!4Y)!4U(!4U(!4U(!4Q'!4Q'!4Q'!4M'!4M& M!4M&!4I&!4I%!4I%!4E%!4E$!4E$!4A$!4A$!4A#!4A#!4=#!4="!4="!49" M!49"!49!!45!!45!!45`!41`!41`!40_!4,_!4,_!4,_!0``L:8-L:4-L*4- ML*4-L*0-KZ0-KZ0-KZ0-KJ,-KJ,-KJ,-K:(-K:(-K:(-K*(-K*$-K*$-K*$- MJZ`-JZ`-JZ`,JI\,JI\,JI\,J9\,J9X,J9X,J)X,J)T,J)T,IYT,IYT,IYP, MIIP,IIP,IIL,IIL,I9L,I9H,I9H,I)H,I)H,I)D,HYD,HYD,HY@,HI@,HI@, MHI<,H9<,H9<,H9<,H98,H)8,H)8,H)4,GY4,GY4,GY4,GI0,GI0,GI0,G9,+ MG9,+G9,+G)(+G)(+G)(+FY(+FY$+FY$+FY$+FI`+FI`+FI`+F9`+F8\+F8\+ MF(\+F(X+F(X+EXX+EXT+EXT+EHT+EHT+EHP+EHP+E8P+E8L+E8L+E(L+E(L+ ME(H+DXH+DXH+DXD+DHD+DHD+DH@+D8@+D8@+D8@+D(<+D(<*D(<*D(8*CX8* MCX8*CX8*CH4*CH4*CH4*C80*C80*C80*C(,*C(,*C(,*BX,*BX(*BX(*BX(* MBH$*BH$*BH$*B8$*B8`*B8`*B(`*B'\*B'\*AW\*AWX*AWX*AGX*AGX*AGT* MA7T*A7T*A7P*A7P*A'P*A'P*A'L*@WL*@WL)@WH)@GH)@GH)@GD)@7D)@7D) M@7D)@'@)@'@)@'@)@'<)?W<)?W<)?W<)?G8)?G8)?G8)?74)?74)?74)?'0) M?'0)?'0)>W0)>W,)>W,)>G,)>G()>G()>G()>7()>7$)>7$)>'$)>'`)>'`) M=W`)=V\)=V\)=F\)=F\)=FX(=6X(=6X(=6T(=6T(=&T(=&T(=&P(<VP(<VP( M<VL(<FL(<FL(<FH(<6H(<6H(<6H(<&D(<&D(<&D(;V@(;V@(;V@(;V@(;F<( M;F<(;F<(;68(;68(;68(;&4(;&4(;&4(:V4(:V0(:V0(:F0(:F,(:F,(:F,( M:6,(:6((:6(':&(':&$':&$'9V$'9V`'9V`'9F`'9F`'9E\'95\'95\'95X' M9%X'9%X'9%X'9%T'8UT'8UT'8UP'8EP'8EP'8EL'85L'85L'85L'8%H'8%H' M8%H'7UD'7UD'7UD'7UD'7E@'7E@'7E@'75<'75<'75<'7%8'7%8'7%8'6U8& M6U4&6U4&6E4&6E0&6E0&650&65,&65,&65,&6%,&6%(&6%(&5U(&5U$&5U$& M5E$&5E$&5E`&55`&55`&54\&5$\&5$\&5$X&5$X&4TX&4TX&4TT&4DT&4DT& M4DP&44P&44P&44P&4$L&4$L&4$L&3TH&3TH&3TH&3DD%3DD%3DD%3DD%34@% M34@%34@%3$<%3$<%3$<%2T<%2T8%2T8%2D8%2D4%2D4%244%240%240%240% M2$0%2$,%2$,%1T,%1T(%1T(%1D(%1D(%1D$%14$%14$%14`%1$`%1$`%1#\% M0S\%0S\%``"QI@VQI@VQI0VPI0VPI0VPI`VOI`VOI`VOI`VNHPVNHPVNHPVM MH@VMH@VMH@VLH@VLH0VLH0VLH0VKH`VKH`VKH`RJGPRJGPRJGPRIGPRIG@RI MG@RHG@RHG0RHG0RGG0RGG0RGG`RGG`RFG`RFFPRFFPREFPREF@REF@RDF@RD MF@RDF0RCF0RCF0RCF`RBF`RBF`RBF`RAEPRAEPRAEPRAE@R@E@R@E@R@E0R? ME0R?E0R?E0R>E`R>E`R>E`R=DPN=DPN=DPN<DPN<D@N<D@N<D@N;D0N;D0N; MD0N:D`N:D`N:D`N9D`N9CPN9CPN8CPN8C@N8C@N7C@N7C@N7C0N6C0N6C0N6 MC`N6C`N5C`N5BPN5BPN4BPN4BPN4B@N3B@N3B@N3B0N2B0N2B0N2B0N1B`N1 MB`N1B`N1APN0APJ0APJ0A@J/A@J/A@J/A@J.A0J.A0J.A0J-A`J-A`J-A`J, MA`J,@PJ,@PJ+@PJ+@@J+@@J+@@J*@0J*@0J*@0J)@0J)@`J)@`J(@`J(?PJ( M?PJ'?PJ'?PJ'?@J&?@J&?@J&?0J&?0J%?0J%?`J%?`J$?`J$?`J$>PJ#>PJ# M>PF#>@F">@F">@F">@F!>0F!>0F!>0F!>`F`>`F`>`F`=PE_=PE_=PE_=PE^ M=@E^=@E^=@E]=0E]=0E]=0E\=0E\=`E\=`E[=`E[<PE[<PE[<PEZ<@EZ<@EZ M<@EY<@EY<0EY<0EX<0EX<`EX<`EW<`EW<`EW;PEV;PEV;PEV;@AV;@AU;@AU M;0AU;0AT;0AT;0AT;`AS;`AS;`AS:PAR:PAR:PAR:PAQ:@AQ:@AQ:@AP:0AP M:0AP:0AP:`AO:`AO:`AO:`AN9PAN9PAN9PAM9@AM9@AM9@AL90AL90AL90AK M90AK9`AK9`AK9`AJ8PAJ8PAJ8PAI8PAI8@AI8@=H8@=H80=H80=G80=G8`=G M8`=F8`=F8`=F7P=E7P=E7P=E7@=E7@=D7@=D7@=D70=C70=C70=C7`=B7`=B M7`=B6P=A6P=A6P=A6P=@6@=@6@=@6@=@60=?60=?60=?60=>6`=>6`=>6`== M5P==5P==5P=<5@=<5@=<5@=;5@9;509;509:509:5`9:5`9:5`995`994P99 M4P984P984@984@974@9740974096409640964`954`954`953P953P943P94 M3P943@933@933@933092309230923`913`913`913`902P902P902P9/2@9/ M2@9/2@9/2@9.205.205.205-2`5-2`5-2`5,1P5,1P5,1P5+1P5+1@5+1@5* M1@5*105*105*105)105)1`5)1`5(1`5(0P5(0P5'0P5'0@5'0@5&0@5&0@5& M005%005%005%0`5$0`5$0`5$0`5$/P4``+*F#;&F#;&F#;&E#;"E#;"E#;"E M#:^D#:^D#:^D#:ZC#:ZC#:ZC#:VB#:VB#:VB#:VB#:RA#:RA#:RA#:N@#:N@ M#:N@#*J@#*J?#*J?#*F?#*F>#*F>#*B>#*B=#*B=#*B=#*>=#*><#*><#*:< M#*:;#*:;#*6;#*6;#*6:#*2:#*2:#*29#*.9#*.9#*.8#**8#**8#**8#**7 M#*&7#*&7#*&6#*"6#*"6#*"6#)^5#)^5#)^5#)Z4#)Z4#)Z4#)V3"YV3"YV3 M"YV3"YR2"YR2"YR2"YN1"YN1"YN1"YJ1"YJ0"YJ0"YF0"YF/"YF/"YB/"YB. M"YB."Y>."Y>."Y>-"Y>-"Y:-"Y:,"Y:,"Y6,"Y6,"Y6+"Y2+"Y2+"Y2*"Y.* M"Y.*"Y.)"Y*)"Y*)"Y*)"Y*("Y&("Y&("Y&'"Y"'"I"'"I"'"H^&"H^&"H^& M"HZ%"HZ%"HZ%"HV$"HV$"HV$"HR$"HR#"HR#"HR#"HN""HN""HN""HJ""HJ! M"HJ!"HF!"HF`"HF`"HB`"HA_"HA_"H=_"H=_"H=^"H=^"H9^"H9]"H9]"H5] M"H5\"H5\"H1\"H1\"H1["H-["H-["8-Z"8)Z"8)Z"8)Z"8%Y"8%Y"8%Y"8%X M"8!X"8!X"8!W"7]W"7]W"7]W"7YV"7YV"7YV"7UU"7UU"7UU"7QU"7QT"7QT M"7QT"7MS"7MS"7MS"7IR"7IR"7IR"7ER"7EQ"7EQ"7AQ"7AP"7AP"7=P"7=P M"7=O"79O"79O"79N"'9N"'5N"'5M"'5M"'1M"'1M"'1L"'-L"'-L"'-K"')K M"')K"')K"'%J"'%J"'%J"'%I"'!I"'!I"'!H"&]H"&]H"&]H"&YG"&YG"&YG M"&UF"&UF"&UF"&QF"&QE"&QE"&ME"&MD"&MD"&MD"&IC"&IC"&IC"&EC"&EB M"&EB!VAB!VAA!VAA!V=A!V=A!V=@!V9@!V9@!V9?!V9?!V5?!V5>!V5>!V1> M!V1>!V1=!V-=!V-=!V-<!V)<!V)<!V)<!V%;!V%;!V%;!V!:!V!:!V!:!V!9 M!U]9!U]9!U]9!UY8!UY8!UY8!UU7!UU7!UU7!UQ7!UQ6!UQ6!UM6!EM5!EM5 M!EM5!EI4!EI4!EI4!EE4!EE3!EE3!EA3!EA2!EA2!E=2!E=2!E=1!E91!E91 M!E90!E50!E50!E5/!E5/!E1/!E1/!E1.!E-.!E-.!E--!E)-!E)-!E)-!E%, M!E%,!E%,!E!+!E!+!E!+!E!*!D]*!D]*!D]*!DY)!4Y)!4Y)!4U(!4U(!4U( M!4Q(!4Q'!4Q'!4M'!4M&!4M&!4I&!4I%!4I%!4I%!4E%!4E$!4E$!4A$!4A# M!4A#!4=#!4=#!4="!49"!49"!49!!45!!45!!45`!45`!41`!41`!0``LJ<- MLJ8-L:8-L:8-L:4-L*4-L*4-L*4-KZ0-KZ0-KZ0-KJ,-KJ,-KJ,-KJ,-K:(- MK:(-K:(-K*$-K*$-K*$-JZ`-JZ`-JZ`-JJ`,JI\,JI\,J9\,J9X,J9X,J)X, MJ)X,J)T,J)T,IYT,IYP,IYP,IIP,IIL,IIL,I9L,I9L,I9H,I)H,I)H,I)D, MHYD,HYD,HYD,HY@,HI@,HI@,HI<,H9<,H9<,H98,H)8,H)8,H)8,GY4,GY4, MGY4,GI0,GI0,GI0,G9,+G9,+G9,+G9,+G)(+G)(+G)(+FY$+FY$+FY$+FI$+ MFI`+FI`+F9`+F8\+F8\+F(\+F(X+F(X+F(X+EXX+EXT+EXT+EHT+EHP+EHP+ ME8P+E8P+E8L+E(L+E(L+E(H+DXH+DXH+DXD+DHD+DHD+DHD+DH@+D8@+D8@+ MD8<+D(<*D(<*D(<*CX8*CX8*CX8*CH4*CH4*CH4*C80*C80*C80*C80*C(,* MC(,*C(,*BX(*BX(*BX(*BH(*BH$*BH$*B8$*B8`*B8`*B(`*B'\*B'\*B'\* MAW\*AWX*AWX*AGX*AGT*AGT*A7T*A7T*A7P*A'P*A'P*A'L*@WL*@WL)@WH) M@GH)@GH)@GH)@GD)@7D)@7D)@7@)@'@)@'@)@'@)?W<)?W<)?W<)?G8)?G8) M?G8)?74)?74)?74)?74)?'0)?'0)?'0)>W,)>W,)>W,)>G,)>G()>G()>7() M>7$)>7$)>'$)>'`)>'`)=W`)=W`)=V\)=V\)=F\)=FX(=FX(=6X(=6X(=6T( M=&T(=&T(=&P(<VP(<VP(<VL(<FL(<FL(<FL(<FH(<6H(<6H(<6D(<&D(<&D( M<&D(;V@(;V@(;V@(;F<(;F<(;F<(;68(;68(;68(;&8(;&4(;&4(;&4(:V0( M:V0(:V0(:F0(:F,(:F,(:6,(:6((:6(':&(':&$':&$'9V$'9V$'9V`'9V`' M9F`'9E\'9E\'95\'95\'95X'9%X'9%X'9%T'8UT'8UT'8UP'8EP'8EP'8EP' M85L'85L'85L'85H'8%H'8%H'8%H'7UD'7UD'7UD'7E@'7E@'7E@'75<'75<' M75<'7%<'7%8'7%8'7%8&6U4&6U4&6U4&6E4&6E0&6E0&650&65,&65,&6%,& M6%(&6%(&5U(&5U(&5U$&5E$&5E$&5E`&5E`&55`&54\&54\&5$\&5$\&5$X& M4TX&4TX&4TT&4DT&4DT&4DT&44P&44P&44P&44L&4$L&4$L&4$H&3TH&3TH& M3TH&3DD%3DD%3DD%34@%34@%34@%3$@%3$<%3$<%2T<%2T8%2T8%2T8%2D4% M2D4%2D4%244%240%240%2$0%2$,%2$,%1T,%1T,%1T(%1D(%1D(%1D$%1D$% M14$%14`%14`%1$`%``"RIPVRIPVRI@VQI@VQI@VQI0VPI0VPI0VPI0VOI`VO MI`VOI`VOHPVNHPVNHPVNHPVMH@VMH@VMH@VLH0VLH0VLH0VKH`VKH`VKH`VJ MH`RJGPRJGPRIGPRIG@RIG@RIG@RHG@RHG0RHG0RGG0RGG`RGG`RFG`RFFPRF MFPREFPREFPREF@RDF@RDF@RDF0RDF0RCF0RCF0RCF`RBF`RBF`RBEPRAEPRA MEPRAE@R@E@R@E@R@E@R?E0R?E0R?E0R>E`R>E`R>E`R>E`R=DPN=DPN=DPN< MD@N<D@N<D@N;D0N;D0N;D0N:D0N:D`N:D`N9D`N9CPN9CPN9CPN8CPN8C@N8 MC@N7C@N7C0N7C0N6C0N6C`N6C`N5C`N5C`N5BPN4BPN4BPN4B@N3B@N3B@N3 MB@N3B0N2B0N2B0N2B`N1B`N1B`N1APN0APN0APJ0APJ/A@J/A@J/A@J.A0J. MA0J.A0J.A0J-A`J-A`J-A`J,@PJ,@PJ,@PJ+@@J+@@J+@@J*@@J*@0J*@0J) M@0J)@`J)@`J(@`J(@`J(?PJ(?PJ'?PJ'?@J'?@J&?@J&?0J&?0J%?0J%?0J% M?`J$?`J$?`J$>PJ#>PJ#>PF#>PF#>@F">@F">@F">0F!>0F!>0F!>`F`>`F` M>`F`>`E_=PE_=PE_=PE^=@E^=@E^=@E]=@E]=0E]=0E]=0E\=`E\=`E\=`E[ M<PE[<PE[<PEZ<PEZ<@EZ<@EY<@EY<0EY<0EX<0EX<0EX<`EX<`EW<`EW;PEW M;PEV;PEV;@AV;@AU;@AU;@AU;0AT;0AT;0AT;`AS;`AS;`AS;`AR:PAR:PAR M:PAR:@AQ:@AQ:@AQ:0AP:0AP:0AP:0AO:`AO:`AO:`AN9PAN9PAN9PAM9PAM M9@AM9@AM9@AL90AL90AL90AK9`AK9`AK9`AJ9`AJ8PAJ8PAI8PAI8@AI8@=H M8@=H80=H80=G80=G80=G8`=G8`=F8`=F7P=F7P=E7P=E7P=E7@=D7@=D7@=D M70=C70=C70=C7`=B7`=B7`=B7`=B6P=A6P=A6P=A6@=@6@=@6@=@6@=?60=? M60=?60=>6`=>6`=>6`==5P==5P==5P=<5P=<5@=<5@=<5@9;509;509;509: M509:5`9:5`995`994P994P984P984@984@974@974@974097409640964`96 M4`954`954`953P943P943P943@933@933@9330923092309230913`913`91 M3`912P902P902P902P9/2@9/2@9/2@9.205.205.205-2`5-2`5-2`5,2`5, M1P5,1P5,1P5+1@5+1@5+1@5*1@5*105*105)105)1`5)1`5(1`5(0P5(0P5' M0P5'0P5'0@5&0@5&0@5&005&005%005%005%0`4``+.G#;*G#;*G#;*F#;&F M#;&F#;&F#;"E#;"E#;"E#:^D#:^D#:^D#:^C#:ZC#:ZC#:ZC#:VB#:VB#:VB M#:RA#:RA#:RA#:NA#:N@#:N@#:J@#*J?#*J?#*J?#*F>#*F>#*F>#*B>#*B= M#*B=#*>=#*><#*><#*:<#*:<#*:;#*6;#*6;#*6:#*2:#*2:#*29#*29#*.9 M#*.9#*.8#**8#**8#**7#*&7#*&7#*&7#*"6#*"6#*"6#)^5#)^5#)^5#)^4 M#)Z4#)Z4#)Z4#)V3"YV3"YV3"YR2"YR2"YR2"YN2"YN1"YN1"YJ1"YJ0"YJ0 M"YF0"YF/"YF/"YF/"YB/"YB."YB."Y>."Y>-"Y>-"Y:-"Y:-"Y:,"Y6,"Y6, M"Y6+"Y2+"Y2+"Y2*"Y2*"Y.*"Y.*"Y.)"Y*)"Y*)"Y*("Y&("Y&("Y&("Y"' M"Y"'"I"'"H^&"H^&"H^&"H^%"HZ%"HZ%"HZ%"HV$"HV$"HV$"HR#"HR#"HR# M"HN#"HN""HN""HJ""HJ!"HJ!"HF!"HF`"HF`"HF`"HB`"HA_"HA_"H=_"H=^ M"H=^"H9^"H9^"H9]"H5]"H5]"H5\"H1\"H1\"H1["H1["H-["H-["8-Z"8)Z M"8)Z"8)Y"8%Y"8%Y"8%X"8!X"8!X"8!X"7]W"7]W"7]W"7YV"7YV"7YV"7YV M"7UU"7UU"7UU"7QT"7QT"7QT"7MS"7MS"7MS"7IS"7IR"7IR"7ER"7EQ"7EQ M"7EQ"7AQ"7AP"7AP"7=P"7=O"7=O"79O"79N"'9N"'5N"'5N"'5M"'1M"'1M M"'1L"'-L"'-L"'-L"'-K"')K"')K"')J"'%J"'%J"'%I"'!I"'!I"'!I"&]H M"&]H"&]H"&YG"&YG"&YG"&YG"&UF"&UF"&UF"&QE"&QE"&QE"&MD"&MD"&MD M"&ID"&IC"&IC"&EC"&EB"&EB!VAB!VAB!VAA!VAA!V=A!V=@!V=@!V9@!V9? M!V9?!V5?!V5?!V5>!V1>!V1>!V1=!V-=!V-=!V-=!V-<!V)<!V)<!V);!V%; M!V%;!V%:!V!:!V!:!V!:!U]9!U]9!U]9!UY8!UY8!UY8!UU8!UU7!UU7!UU7 M!UQ6!UQ6!UQ6!EM5!EM5!EM5!EI5!EI4!EI4!EE4!EE3!EE3!EA3!EA3!EA2 M!EA2!E=2!E=1!E=1!E91!E90!E90!E50!E50!E5/!E1/!E1/!E1.!E-.!E-. M!E-.!E)-!E)-!E)-!E),!E%,!E%,!E%+!E!+!E!+!E!+!D]*!D]*!D]*!DY) M!4Y)!4Y)!4U)!4U(!4U(!4U(!4Q'!4Q'!4Q'!4M&!4M&!4M&!4I&!4I%!4I% M!4E%!4E$!4E$!4A$!4A$!4A#!4=#!4=#!4="!4="!49"!49!!49!!45!!45! M!0``LZ@-LZ<-LJ<-LJ<-LJ8-L:8-L:8-L:8-L*4-L*4-L*4-L*0-KZ0-KZ0- MKZ0-KJ,-KJ,-KJ,-K:(-K:(-K:(-K*$-K*$-K*$-JZ$-JZ`-JZ`-JZ`,JI\, MJI\,JI\,J9\,J9X,J9X,J)X,J)T,J)T,IYT,IYP,IYP,IIP,IIP,IIL,I9L, MI9L,I9H,I9H,I)H,I)H,I)D,HYD,HYD,HY@,HI@,HI@,HI<,H9<,H9<,H9<, MH)8,H)8,H)8,H)4,GY4,GY4,GY4,GI0,GI0,GI0,G9,+G9,+G9,+G)(+G)(+ MG)(+FY(+FY$+FY$+FI$+FI`+FI`+FI`+F8\+F8\+F8\+F(\+F(X+F(X+EXX+ MEXT+EXT+EHT+EHT+EHP+E8P+E8P+E8L+E8L+E(L+E(H+E(H+DXH+DXH+DXD+ MDHD+DHD+DH@+D8@+D8@+D8@+D(<+D(<*D(<*CX8*CX8*CX8*CX4*CH4*CH4* MCH4*C80*C80*C80*C(,*C(,*C(,*BX,*BX(*BX(*BH(*BH$*BH$*BH$*B8`* MB8`*B8`*B(`*B'\*B'\*AW\*AWX*AWX*AGX*AGX*AGT*A7T*A7T*A7P*A'P* MA'P*A'L*A'L*@WL*@WL)@WH)@GH)@GH)@GD)@7D)@7D)@7D)@'@)@'@)@'@) M?W<)?W<)?W<)?W8)?G8)?G8)?G8)?74)?74)?74)?'0)?'0)?'0)>W0)>W,) M>W,)>G,)>G()>G()>7()>7$)>7$)>7$)>'$)>'`)>'`)=W`)=V\)=V\)=F\) M=F\)=FX(=6X(=6X(=6T(=&T(=&T(=&P(=&P(<VP(<VP(<VL(<FL(<FL(<FH( M<6H(<6H(<6H(<&D(<&D(<&D(;V@(;V@(;V@(;F<(;F<(;F<(;F<(;68(;68( M;68(;&4(;&4(;&4(:V4(:V0(:V0(:F0(:F,(:F,(:6,(:6((:6(':6(':&(' M:&$':&$'9V$'9V`'9V`'9F`'9F`'9E\'95\'95\'95X'9%X'9%X'9%T'8UT' M8UT'8UT'8UP'8EP'8EP'8EL'85L'85L'85L'8%H'8%H'8%H'7UD'7UD'7UD' M7E@'7E@'7E@'7E@'75<'75<'75<'7%8'7%8'7%8&6U8&6U4&6U4&6E4&6E0& M6E0&650&65,&65,&6%,&6%,&6%(&6%(&5U(&5U$&5U$&5E$&5E$&5E`&55`& M55`&54\&5$\&5$\&5$X&4TX&4TX&4TX&4TT&4DT&4DT&4DP&44P&44P&44L& M4$L&4$L&4$L&3TH&3TH&3TH&3DD%3DD%3DD%34D%34@%34@%34@%3$<%3$<% M3$<%2T8%2T8%2T8%2D8%2D4%2D4%244%240%240%2$0%2$0%2$,%2$,%1T,% M1T(%1T(%1D(%1D$%1D$%14$%``"SJ`VSJ`VSIPVRIPVRIPVRI@VQI@VQI@VQ MI@VQI0VPI0VPI0VPI`VOI`VOI`VOI`VNHPVNHPVNHPVMH@VMH@VMH@VLH0VL MH0VLH0VKH0VKH`VKH`VKH`RJGPRJGPRJGPRIGPRIG@RIG@RHG@RHG0RHG0RG MG0RGG`RGG`RFG`RFG`RFFPRFFPREFPREF@REF@RDF@RDF@RDF0RCF0RCF0RC MF`RBF`RBF`RBEPRAEPRAEPRAEPR@E@R@E@R@E@R@E0R?E0R?E0R?E0R>E`R> ME`R>E`R=DPN=DPN=DPN<D@N<D@N<D@N;D@N;D0N;D0N;D0N:D`N:D`N:D`N9 MD`N9CPN9CPN8CPN8C@N8C@N7C@N7C0N7C0N6C0N6C0N6C`N5C`N5C`N5BPN5 MBPN4BPN4BPN4B@N3B@N3B@N3B0N2B0N2B0N2B`N1B`N1B`N1B`N0APN0APJ0 MAPJ0A@J/A@J/A@J/A@J.A0J.A0J.A0J-A`J-A`J-A`J,@PJ,@PJ,@PJ+@PJ+ M@@J+@@J+@@J*@0J*@0J*@0J)@0J)@`J)@`J(@`J(?PJ(?PJ'?PJ'?@J'?@J& M?@J&?@J&?0J%?0J%?0J%?`J%?`J$?`J$?`J$>PJ#>PJ#>PF#>@F">@F">@F" M>0F!>0F!>0F!>0F`>`F`>`F`>`F`=PE_=PE_=PE_=PE^=@E^=@E^=@E]=0E] M=0E]=0E\=`E\=`E\=`E[=`E[<PE[<PEZ<PEZ<@EZ<@EZ<@EY<@EY<0EY<0EX M<0EX<`EX<`EW<`EW;PEW;PEV;PEV;PEV;@AU;@AU;@AU;0AU;0AT;0AT;0AT M;`AS;`AS;`AS:PAR:PAR:PAR:@AQ:@AQ:@AQ:@AP:0AP:0AP:0AO:`AO:`AO M:`AO:`AN9PAN9PAN9PAM9@AM9@AM9@AL90AL90AL90AK90AK9`AK9`AJ9`AJ M8PAJ8PAJ8PAI8PAI8@AI8@=H8@=H80=H80=G80=G8`=G8`=F8`=F8`=F7P=E M7P=E7P=E7@=D7@=D7@=D70=D70=C70=C70=C7`=B7`=B7`=B6P=A6P=A6P=A M6P=@6@=@6@=@6@=?60=?60=?60=?6`=>6`=>6`=>6`==5P==5P==5P=<5@=< M5@=<5@=;5@9;509;509:509:5`9:5`995`994P994P994P984P984@984@97 M4@9740974096409640964`954`954`953P943P943P943@943@933@933@93 M3092309230923`913`913`913`902P902P902P9/2@9/2@9/2@9.205.205. M205.205-2`5-2`5-2`5,1P5,1P5,1P5+1P5+1@5+1@5*1@5*105*105)105) M1`5)1`5)1`5(1`5(0P5(0P5'0P5'0@5'0@5&0@5&0@5&004``+2H#;.H#;.H M#;.G#;*G#;*G#;*G#;*F#;&F#;&F#;&E#;"E#;"E#;"D#:^D#:^D#:^D#:ZC M#:ZC#:ZC#:VB#:VB#:VB#:RB#:RA#:RA#:RA#:N@#:N@#:N@#*J?#*J?#*J? M#*F?#*F>#*F>#*B>#*B=#*B=#*>=#*>=#*><#*><#*:<#*:;#*:;#*6;#*6: M#*6:#*2:#*2:#*29#*.9#*.9#*.8#**8#**8#**8#*&7#*&7#*&7#*&6#*"6 M#*"6#*"5#)^5#)^5#)^5#)Z4#)Z4#)Z4#)V3"YV3"YV3"YR3"YR2"YR2"YR2 M"YN1"YN1"YN1"YJ0"YJ0"YJ0"YF0"YF/"YF/"YB/"YB."YB."Y>."Y>."Y>- M"Y:-"Y:-"Y:,"Y:,"Y6,"Y6+"Y6+"Y2+"Y2+"Y2*"Y.*"Y.*"Y.)"Y*)"Y*) M"Y*)"Y&("Y&("Y&("Y&'"Y"'"I"'"I"&"H^&"H^&"H^&"HZ%"HZ%"HZ%"HV$ M"HV$"HV$"HR$"HR#"HR#"HN#"HN""HN""HN""HJ!"HJ!"HJ!"HF!"HF`"HF` M"HB`"HA_"HA_"H=_"H=_"H=^"H9^"H9^"H9]"H9]"H5]"H5\"H5\"H1\"H1\ M"H1["H-["H-["8-Z"8)Z"8)Z"8)Z"8%Y"8%Y"8%Y"8!X"8!X"8!X"8!W"7]W M"7]W"7]W"7YV"7YV"7YV"7UU"7UU"7UU"7QT"7QT"7QT"7MT"7MS"7MS"7MS M"7IR"7IR"7IR"7ER"7EQ"7EQ"7AQ"7AP"7AP"7=P"7=O"7=O"79O"79O"79N M"'5N"'5N"'5M"'5M"'1M"'1M"'1L"'-L"'-L"'-K"')K"')K"')J"'%J"'%J M"'%J"'!I"'!I"'!I"'!H"&]H"&]H"&]H"&YG"&YG"&YG"&UF"&UF"&UF"&QE M"&QE"&QE"&ME"&MD"&MD"&ID"&IC"&IC"&IC"&EC"&EB"&EB!VAB!VAA!VAA M!V=A!V=@!V=@!V9@!V9@!V9?!V5?!V5?!V5>!V5>!V1>!V1>!V1=!V-=!V-= M!V-<!V)<!V)<!V);!V%;!V%;!V%;!V!:!V!:!V!:!U]9!U]9!U]9!U]9!UY8 M!UY8!UY8!UU7!UU7!UU7!UQ6!UQ6!UQ6!UM6!EM5!EM5!EI5!EI4!EI4!EI4 M!EE4!EE3!EE3!EA3!EA2!EA2!E=2!E=1!E=1!E91!E91!E90!E50!E50!E5/ M!E1/!E1/!E1/!E1.!E-.!E-.!E--!E)-!E)-!E),!E%,!E%,!E%,!E!+!E!+ M!E!+!D]*!D]*!D]*!D]*!DY)!4Y)!4Y)!4U(!4U(!4U(!4Q'!4Q'!4Q'!4M' M!4M&!4M&!4I&!4I%!4I%!4E%!4E%!4E$!4E$!4A$!4A#!4A#!4=#!4="!4=" M!49"!49"!0``M*D-M*@-LZ@-LZ@-LZ<-LJ<-LJ<-LJ<-LJ8-L:8-L:8-L:4- ML*4-L*4-L*4-KZ0-KZ0-KZ0-KJ,-KJ,-KJ,-K:(-K:(-K:(-K:(-K*$-K*$- MK*$-JZ`-JZ`-JZ`,JJ`,JI\,JI\,J9\,J9X,J9X,J)X,J)T,J)T,IYT,IYT, MIYP,IYP,IIP,IIL,IIL,I9L,I9L,I9H,I)H,I)H,I)D,HYD,HYD,HY@,HI@, MHI@,HI@,HI<,H9<,H9<,H98,H)8,H)8,H)8,GY4,GY4,GY4,GI0,GI0,GI0, MG9,+G9,+G9,+G),+G)(+G)(+G)(+FY$+FY$+FY$+FI$+FI`+FI`+F9`+F8\+ MF8\+F(\+F(X+F(X+EXX+EXX+EXT+EXT+EHT+EHP+EHP+E8P+E8L+E8L+E(L+ ME(L+E(H+DXH+DXH+DXD+DHD+DHD+DHD+DH@+D8@+D8@+D8<+D(<*D(<*D(8* MCX8*CX8*CX8*CH4*CH4*CH4*C80*C80*C80*C(0*C(,*C(,*C(,*BX(*BX(* MBX(*BH$*BH$*BH$*B8$*B8`*B8`*B(`*B'\*B'\*AW\*AW\*AWX*AWX*AGX* MAGT*AGT*A7T*A7P*A7P*A'P*A'P*A'L*@WL*@WL)@WH)@GH)@GH)@GH)@7D) M@7D)@7D)@7@)@'@)@'@)@'<)?W<)?W<)?W<)?G8)?G8)?G8)?74)?74)?74) M?'4)?'0)?'0)?'0)>W,)>W,)>W,)>G()>G()>G()>7()>7$)>7$)>'$)>'`) M>'`)=W`)=W`)=V\)=F\)=F\)=FX(=FX(=6X(=6T(=6T(=&T(=&T(=&P(<VP( M<VP(<VL(<FL(<FL(<FL(<6H(<6H(<6H(<6D(<&D(<&D(<&@(;V@(;V@(;V@( M;F<(;F<(;F<(;68(;68(;68(;&8(;&4(;&4(:V4(:V0(:V0(:V0(:F,(:F,( M:F,(:6,(:6((:6(':&(':&$':&$'9V$'9V$'9V`'9F`'9F`'9E\'9E\'95\' M95X'95X'9%X'9%X'9%T'8UT'8UT'8UP'8EP'8EP'8EP'85L'85L'85L'8%H' M8%H'8%H'8%D'7UD'7UD'7UD'7E@'7E@'7E@'75<'75<'75<'7%<'7%8'7%8' M6U8&6U4&6U4&6U4&6E0&6E0&6E0&650&65,&65,&6%,&6%(&6%(&5U(&5U(& M5U$&5E$&5E$&5E`&55`&55`&54\&54\&5$\&5$\&5$X&4TX&4TX&4TT&4DT& M4DT&4DT&44P&44P&44P&4$L&4$L&4$L&4$H&3TH&3TH&3TH&3DD%3DD%3DD% M34@%34@%34@%3$<%3$<%3$<%2T<%2T8%2T8%2D8%2D4%2D4%2D4%244%240% M240%2$0%2$,%2$,%1T,%1T(%1T(%1D(%``"TJ0VTJ0VTJ`VSJ`VSJ`VSJ`VS MIPVRIPVRIPVRI@VQI@VQI@VQI0VPI0VPI0VPI0VOI`VOI`VOI`VNHPVNHPVN MHPVNH@VMH@VMH@VMH@VLH0VLH0VLH0VKH`VKH`VKH`VJH`RJGPRJGPRIGPRI MG@RIG@RHG@RHG0RHG0RHG0RGG0RGG`RGG`RFG`RFFPRFFPREFPREFPREF@RD MF@RDF@RDF0RCF0RCF0RCF`RCF`RBF`RBF`RBEPRAEPRAEPRAE@R@E@R@E@R@ ME@R?E0R?E0R?E0R>E`R>E`R>E`R=DPN=DPN=DPN=DPN<D@N<D@N<D@N;D0N; MD0N;D0N:D0N:D`N:D`N9D`N9CPN9CPN8CPN8C@N8C@N8C@N7C@N7C0N7C0N6 MC0N6C`N6C`N5C`N5C`N5BPN4BPN4BPN4B@N3B@N3B@N3B0N2B0N2B0N2B0N2 MB`N1B`N1B`N1APN0APJ0APJ0APJ/A@J/A@J/A@J.A0J.A0J.A0J-A`J-A`J- MA`J-A`J,@PJ,@PJ,@PJ+@@J+@@J+@@J*@@J*@0J*@0J)@0J)@`J)@`J(@`J( M?PJ(?PJ'?PJ'?PJ'?@J'?@J&?@J&?0J&?0J%?0J%?0J%?`J$?`J$?`J$>PJ# M>PJ#>PF#>@F">@F">@F">@F">0F!>0F!>0F!>`F`>`F`>`F`>`E_=PE_=PE_ M=PE^=@E^=@E^=@E]=0E]=0E]=0E\=0E\=`E\=`E\=`E[<PE[<PE[<PEZ<PEZ M<@EZ<@EY<@EY<0EY<0EX<0EX<`EX<`EW<`EW<`EW;PEW;PEV;PEV;@AV;@AU M;@AU;@AU;0AT;0AT;0AT;`AS;`AS;`AS:PAR:PAR:PAR:PAQ:@AQ:@AQ:@AQ M:0AP:0AP:0AP:0AO:`AO:`AO:`AN9PAN9PAN9PAM9@AM9@AM9@AL9@AL90AL M90AL90AK9`AK9`AK9`AJ9`AJ8PAJ8PAI8PAI8@AI8@=H8@=H80=H80=G80=G M80=G8`=F8`=F8`=F7P=F7P=E7P=E7@=E7@=D7@=D7@=D70=C70=C70=C7`=B M7`=B7`=B7`=A6P=A6P=A6P=A6@=@6@=@6@=@60=?60=?60=?60=>6`=>6`=> M6`==5P==5P==5P=<5P=<5@=<5@=;5@9;509;509;509:5`9:5`9:5`995`99 M4P994P984P984@984@974@974@974096409640964`964`954`953P953P94 M3P943P943@933@933@9330923092309230913`913`913`902P902P902P90 M2@9/2@9/2@9/2@9.205.205.205-2`5-2`5-2`5,2`5,1P5,1P5+1P5+1@5+ M1@5+1@5*105*105*105)105)1`5)1`5(1`5(0P5(0P5'0P5'0P5'0@4``+6I M#;2I#;2I#;2H#;2H#;.H#;.H#;.G#;*G#;*G#;*F#;&F#;&F#;&E#;"E#;"E M#;"E#:^D#:^D#:^D#:ZC#:ZC#:ZC#:ZC#:VB#:VB#:VB#:RA#:RA#:RA#:N@ M#:N@#:N@#:J@#*J?#*J?#*F?#*F>#*F>#*F>#*B>#*B=#*B=#*>=#*><#*>< M#*:<#*:;#*:;#*6;#*6;#*6:#*2:#*2:#*29#*.9#*.9#*.9#*.8#**8#**8 M#**7#*&7#*&7#*&6#*"6#*"6#*"6#)^5#)^5#)^5#)Z4#)Z4#)Z4#)Z4#)V3 M"YV3"YV3"YR2"YR2"YR2"YN1"YN1"YN1"YJ1"YJ0"YJ0"YF0"YF/"YF/"YF/ M"YB/"YB."YB."Y>."Y>-"Y>-"Y:-"Y:,"Y:,"Y6,"Y6,"Y6+"Y2+"Y2+"Y2* M"Y.*"Y.*"Y.*"Y.)"Y*)"Y*)"Y*("Y&("Y&("Y&'"Y"'"I"'"I"'"H^&"H^& M"H^&"HZ%"HZ%"HZ%"HZ%"HV$"HV$"HV$"HR#"HR#"HR#"HN""HN""HN""HJ" M"HJ!"HJ!"HF!"HF`"HF`"HB`"HB`"HA_"HA_"H=_"H=^"H=^"H9^"H9]"H9] M"H5]"H5]"H5\"H1\"H1\"H1["H-["H-["8-["8-Z"8)Z"8)Z"8)Y"8%Y"8%Y M"8%X"8!X"8!X"8!X"7]W"7]W"7]W"7YV"7YV"7YV"7UV"7UU"7UU"7UU"7QT M"7QT"7QT"7MS"7MS"7MS"7IS"7IR"7IR"7ER"7EQ"7EQ"7AQ"7AP"7AP"7AP M"7=P"7=O"7=O"79O"79N"'9N"'5N"'5N"'5M"'1M"'1M"'1L"'-L"'-L"'-K M"')K"')K"')K"')J"'%J"'%J"'%I"'!I"'!I"'!I"&]H"&]H"&]H"&YG"&YG M"&YG"&UF"&UF"&UF"&UF"&QE"&QE"&QE"&MD"&MD"&MD"&ID"&IC"&IC"&EC M"&EB"&EB!VAB!VAA!VAA!V=A!V=A!V=@!V=@!V9@!V9?!V9?!V5?!V5?!V5> M!V1>!V1>!V1=!V-=!V-=!V-<!V)<!V)<!V)<!V);!V%;!V%;!V%:!V!:!V!: M!V!:!U]9!U]9!U]9!UY8!UY8!UY8!UU7!UU7!UU7!UQ7!UQ6!UQ6!UQ6!EM5 M!EM5!EM5!EI5!EI4!EI4!EE4!EE3!EE3!EA3!EA2!EA2!E=2!E=2!E=1!E=1 M!E91!E90!E90!E50!E50!E5/!E1/!E1/!E1.!E-.!E-.!E--!E)-!E)-!E)- M!E%,!E%,!E%,!E%+!E!+!E!+!E!+!D]*!D]*!D]*!DY)!4Y)!4Y)!4U(!4U( M!4U(!4Q(!4Q'!4Q'!4Q'!4M&!4M&!4M&!4I&!4I%!4I%!4E%!4E$!4E$!4A$ M!4A#!4A#!4=#!4=#!0``M:H-M:D-M:D-M*D-M*@-M*@-LZ@-LZ@-LZ<-LJ<- MLJ<-LJ8-L:8-L:8-L:8-L*4-L*4-L*4-KZ0-KZ0-KZ0-KZ,-KJ,-KJ,-KJ,- MK:(-K:(-K:(-K*$-K*$-K*$-JZ$-JZ`-JZ`-JJ`,JI\,JI\,JI\,J9X,J9X, MJ9X,J)X,J)T,J)T,IYT,IYP,IYP,IIP,IIP,IIL,I9L,I9L,I9H,I)H,I)H, MI)D,I)D,HYD,HYD,HY@,HI@,HI@,HI<,H9<,H9<,H9<,H)8,H)8,H)8,GY4, MGY4,GY4,GY0,GI0,GI0,GI0,G9,+G9,+G9,+G)(+G)(+G)(+FY(+FY$+FY$+ MFI$+FI`+FI`+F9`+F8\+F8\+F8\+F(\+F(X+F(X+EXX+EXT+EXT+EHT+EHT+ MEHP+E8P+E8P+E8L+E(L+E(L+E(H+E(H+DXH+DXH+DXD+DHD+DHD+DH@+D8@+ MD8@+D8<+D(<+D(<*D(<*CX8*CX8*CX8*CH4*CH4*CH4*CH4*C80*C80*C80* MC(,*C(,*C(,*BX(*BX(*BX(*BH(*BH$*BH$*B8$*B8`*B8`*B8`*B(`*B'\* MB'\*AW\*AWX*AWX*AGX*AGT*AGT*A7T*A7T*A7P*A'P*A'P*A'L*@WL*@WL* M@WL)@WH)@GH)@GH)@GD)@7D)@7D)@7@)@'@)@'@)@'@)?W<)?W<)?W<)?G8) M?G8)?G8)?G8)?74)?74)?74)?'0)?'0)?'0)>W,)>W,)>W,)>G,)>G()>G() M>7()>7$)>7$)>'$)>'$)>'`)>'`)=W`)=V\)=V\)=F\)=FX(=FX(=6X(=6X( M=6T(=&T(=&T(=&P(<VP(<VP(<VP(<VL(<FL(<FL(<FH(<6H(<6H(<6D(<&D( M<&D(<&D(;V@(;V@(;V@(;F<(;F<(;F<(;6<(;68(;68(;68(;&4(;&4(;&4( M:V0(:V0(:V0(:F0(:F,(:F,(:6,(:6((:6(':&(':&(':&$':&$'9V$'9V`' M9V`'9F`'9E\'9E\'95\'95\'95X'9%X'9%X'9%T'8UT'8UT'8UT'8EP'8EP' M8EP'8EL'85L'85L'85H'8%H'8%H'8%H'7UD'7UD'7UD'7E@'7E@'7E@'75@' M75<'75<'75<'7%8'7%8'7%8&6U4&6U4&6U4&6E4&6E0&6E0&650&65,&65,& M6%,&6%,&6%(&5U(&5U(&5U$&5U$&5E$&5E`&5E`&55`&55`&54\&5$\&5$\& M5$X&4TX&4TX&4TX&4DT&4DT&4DT&4DP&44P&44P&44L&4$L&4$L&4$L&3TH& M3TH&3TH&3DD%3DD%3DD%34D%34@%34@%3$@%3$<%3$<%3$<%2T8%2T8%2T8% M2D8%2D4%2D4%244%240%240%2$0%2$,%2$,%1T,%``"UJ@VUJ@VUJ0VUJ0VT MJ0VTJ0VTJ`VSJ`VSJ`VSIPVRIPVRIPVRI@VQI@VQI@VQI@VPI0VPI0VPI0VP MI`VOI`VOI`VOI`VNHPVNHPVNHPVMH@VMH@VMH@VLH0VLH0VLH0VKH0VKH`VK MH`VJH`RJGPRJGPRJGPRIG@RIG@RIG@RHG@RHG0RHG0RGG0RGG`RGG`RFG`RF MG`RFFPREFPREFPREF@REF@RDF@RDF0RDF0RCF0RCF0RCF`RBF`RBF`RBEPRA MEPRAEPRAEPR@E@R@E@R@E@R?E0R?E0R?E0R?E`R>E`R>E`R>E`R=DPN=DPN= MDPN<D@N<D@N<D@N;D@N;D0N;D0N:D0N:D`N:D`N:D`N9CPN9CPN9CPN8CPN8 MC@N8C@N7C@N7C0N7C0N6C0N6C0N6C`N5C`N5C`N5BPN5BPN4BPN4B@N4B@N3 MB@N3B@N3B0N2B0N2B0N2B`N1B`N1B`N1B`N0APN0APJ0APJ/A@J/A@J/A@J/ MA0J.A0J.A0J.A0J-A`J-A`J-A`J,@PJ,@PJ,@PJ+@PJ+@@J+@@J*@@J*@0J* M@0J*@0J)@`J)@`J)@`J(@`J(?PJ(?PJ'?PJ'?@J'?@J&?@J&?@J&?0J%?0J% M?0J%?`J$?`J$?`J$>PJ$>PJ#>PJ#>PF#>@F">@F">@F">0F!>0F!>0F!>0F` M>`F`>`F`>`E_=PE_=PE_=PE_=@E^=@E^=@E^=@E]=0E]=0E]=0E\=`E\=`E\ M=`E[=`E[<PE[<PEZ<PEZ<@EZ<@EY<@EY<0EY<0EY<0EX<0EX<`EX<`EW<`EW M;PEW;PEV;PEV;PEV;@AU;@AU;@AU;0AT;0AT;0AT;`AT;`AS;`AS;`AS:PAR M:PAR:PAR:@AQ:@AQ:@AQ:@AP:0AP:0AP:0AO:`AO:`AO:`AN9PAN9PAN9PAN M9PAM9@AM9@AM9@AL90AL90AL90AK90AK9`AK9`AJ9`AJ8PAJ8PAI8PAI8@AI M8@=I8@=H8@=H80=H80=G80=G8`=G8`=F8`=F8`=F7P=E7P=E7P=E7@=D7@=D M7@=D70=C70=C70=C70=C7`=B7`=B7`=B6P=A6P=A6P=A6@=@6@=@6@=@6@=? M60=?60=?60=>6`=>6`=>6`=>6`==5P==5P==5P=<5@=<5@=<5@9;509;509; M509:509:5`9:5`995`994P994P984P984P984@984@974@97409740964096 M4`964`954`954`953P943P943P943@933@933@933@933092309230923`91 M3`913`912P902P902P902P9/2@9/2@9/2@9.205.205.205-205-2`5-2`5- M2`5,1P5,1P5,1P5+1@5+1@5+1@5*1@5*105*105)105)1`5)1`5(1`5(1`5( M0P4``+:J#;:J#;6J#;6I#;6I#;2I#;2I#;2H#;.H#;.H#;.G#;*G#;*G#;*F M#;&F#;&F#;&F#;&E#;"E#;"E#;"D#:^D#:^D#:^D#:ZC#:ZC#:ZC#:VB#:VB M#:VB#:RA#:RA#:RA#:NA#:N@#:N@#:N@#*J?#*J?#*J?#*F?#*F>#*F>#*B> M#*B=#*B=#*>=#*><#*><#*:<#*:<#*:;#*:;#*6;#*6:#*6:#*2:#*2:#*29 M#*.9#*.9#*.8#**8#**8#**7#*&7#*&7#*&7#*"6#*"6#*"6#*"5#)^5#)^5 M#)^5#)Z4#)Z4#)Z4#)V3"YV3"YV3"YR2"YR2"YR2"YN2"YN1"YN1"YN1"YJ0 M"YJ0"YJ0"YF0"YF/"YF/"YB/"YB."YB."Y>."Y>-"Y>-"Y:-"Y:-"Y:,"Y6, M"Y6,"Y6+"Y6+"Y2+"Y2+"Y2*"Y.*"Y.*"Y.)"Y*)"Y*)"Y*("Y&("Y&("Y&( M"Y"'"Y"'"I"'"I"&"H^&"H^&"H^&"HZ%"HZ%"HZ%"HV$"HV$"HV$"HR#"HR# M"HR#"HN#"HN""HN""HJ""HJ!"HJ!"HJ!"HF!"HF`"HF`"HB`"HA_"HA_"H=_ M"H=^"H=^"H9^"H9^"H9]"H5]"H5]"H5\"H5\"H1\"H1\"H1["H-["H-["8-Z M"8)Z"8)Z"8)Y"8%Y"8%Y"8%Y"8!X"8!X"8!X"7]W"7]W"7]W"7]W"7YV"7YV M"7YV"7UU"7UU"7UU"7QT"7QT"7QT"7MT"7MS"7MS"7IS"7IR"7IR"7IR"7ER M"7EQ"7EQ"7AQ"7AP"7AP"7=P"7=O"7=O"79O"79O"79N"'5N"'5N"'5M"'1M M"'1M"'1L"'1L"'-L"'-L"'-K"')K"')K"')J"'%J"'%J"'%J"'!I"'!I"'!I M"&]H"&]H"&]H"&]G"&YG"&YG"&YG"&UF"&UF"&UF"&QE"&QE"&QE"&ME"&MD M"&MD"&ID"&IC"&IC"&EC"&EB"&EB"&EB!VAB!VAA!VAA!V=A!V=@!V=@!V9@ M!V9@!V9?!V5?!V5?!V5>!V1>!V1>!V1=!V1=!V-=!V-=!V-<!V)<!V)<!V); M!V%;!V%;!V%;!V!:!V!:!V!:!U]9!U]9!U]9!UY8!UY8!UY8!UY8!UU7!UU7 M!UU7!UQ6!UQ6!UQ6!EM6!EM5!EM5!EI5!EI4!EI4!EE4!EE3!EE3!EE3!EA3 M!EA2!EA2!E=2!E=1!E=1!E91!E91!E90!E50!E50!E5/!E1/!E1/!E1.!E-. M!E-.!E-.!E--!E)-!E)-!E),!E%,!E%,!E%,!E!+!E!+!E!+!D]*!D]*!D]* M!DY)!4Y)!4Y)!4Y)!4U(!4U(!4U(!4Q'!4Q'!4Q'!4M'!4M&!4M&!4I&!4I% M!4I%!4E%!4E$!4E$!4A$!4A$!0``MJL-MJH-MJH-M:H-M:D-M:D-M*D-M*D- MM*@-LZ@-LZ@-LZ<-LJ<-LJ<-LJ<-L:8-L:8-L:8-L:4-L*4-L*4-L*0-KZ0- MKZ0-KZ0-KJ,-KJ,-KJ,-K:(-K:(-K:(-K*(-K*$-K*$-K*$-JZ`-JZ`-JZ`, MJI\,JI\,JI\,J9\,J9X,J9X,J)X,J)T,J)T,IYT,IYT,IYP,IIP,IIP,IIL, MIIL,I9L,I9H,I9H,I)H,I)H,I)D,HYD,HYD,HY@,HI@,HI@,HI@,H9<,H9<, MH9<,H98,H)8,H)8,H)4,GY4,GY4,GY4,GI0,GI0,GI0,G9,+G9,+G9,+G),+ MG)(+G)(+G)(+FY$+FY$+FY$+FI`+FI`+FI`+F9`+F8\+F8\+F(\+F(X+F(X+ MEXX+EXX+EXT+EHT+EHT+EHP+EHP+E8P+E8L+E8L+E(L+E(L+E(H+DXH+DXH+ MDXD+DHD+DHD+DHD+D8@+D8@+D8@+D8<+D(<*D(<*D(8*CX8*CX8*CX8*CH4* MCH4*CH4*C80*C80*C80*C(,*C(,*C(,*BX,*BX(*BX(*BX(*BH$*BH$*BH$* MB8$*B8`*B8`*B(`*B'\*B'\*AW\*AWX*AWX*AGX*AGX*AGT*AGT*A7T*A7P* MA7P*A'P*A'P*A'L*@WL*@WL)@WH)@GH)@GH)@GD)@7D)@7D)@7D)@'@)@'@) M@'@)@'<)?W<)?W<)?W<)?G8)?G8)?G8)?74)?74)?74)?'0)?'0)?'0)>W0) M>W,)>W,)>W,)>G()>G()>G()>7()>7$)>7$)>'$)>'`)>'`)=W`)=V\)=V\) M=F\)=F\)=FX(=6X(=6X(=6T(=6T(=&T(=&T(=&P(<VP(<VP(<VL(<FL(<FL( M<FH(<6H(<6H(<6H(<&D(<&D(<&D(<&@(;V@(;V@(;V@(;F<(;F<(;F<(;68( M;68(;68(;&4(;&4(;&4(:V4(:V0(:V0(:F0(:F,(:F,(:F,(:6,(:6((:6(' M:&(':&$':&$'9V$'9V`'9V`'9F`'9F`'9E\'95\'95\'95X'95X'9%X'9%X' M9%T'8UT'8UT'8UP'8EP'8EP'8EL'85L'85L'85L'8%H'8%H'8%H'7UD'7UD' M7UD'7UD'7E@'7E@'7E@'75<'75<'75<'7%8'7%8'7%8'6U8&6U4&6U4&6E4& M6E0&6E0&6E0&650&65,&65,&6%,&6%(&6%(&5U(&5U$&5U$&5E$&5E$&5E`& M55`&55`&54\&5$\&5$\&5$\&5$X&4TX&4TX&4TT&4DT&4DT&4DP&44P&44P& M44P&4$L&4$L&4$L&3TH&3TH&3TH&3TH&3DD%3DD%3DD%34@%34@%34@%3$<% M3$<%3$<%2T<%2T8%2T8%2D8%2D4%2D4%244%244%240%240%``"WJPVVJPVV MJ@VVJ@VUJ@VUJ@VUJ0VTJ0VTJ0VTJ`VSJ`VSJ`VSIPVRIPVRIPVRIPVRI@VQ MI@VQI@VQI0VPI0VPI0VPI0VOI`VOI`VOI`VNHPVNHPVNHPVMH@VMH@VMH@VM MH@VLH0VLH0VLH0VKH`VKH`VKH`RJH`RJGPRJGPRIGPRIG@RIG@RHG@RHG0RH MG0RGG0RGG0RGG`RGG`RFG`RFFPRFFPREFPREF@REF@RDF@RDF@RDF0RCF0RC MF0RCF`RBF`RBF`RBF`RBEPRAEPRAEPRAE@R@E@R@E@R@E0R?E0R?E0R?E0R> ME`R>E`R>E`R=DPN=DPN=DPN<DPN<D@N<D@N<D@N;D0N;D0N;D0N:D`N:D`N: MD`N9D`N9CPN9CPN8CPN8C@N8C@N7C@N7C@N7C0N7C0N6C0N6C`N6C`N5C`N5 MBPN5BPN4BPN4BPN4B@N3B@N3B@N3B0N2B0N2B0N2B0N1B`N1B`N1B`N1APN0 MAPJ0APJ0A@J/A@J/A@J/A@J.A0J.A0J.A0J-A`J-A`J-A`J,A`J,@PJ,@PJ, M@PJ+@@J+@@J+@@J*@0J*@0J*@0J)@0J)@`J)@`J(@`J(?PJ(?PJ'?PJ'?PJ' M?@J&?@J&?@J&?0J&?0J%?0J%?`J%?`J$?`J$?`J$>PJ#>PJ#>PF#>@F">@F" M>@F">@F!>0F!>0F!>0F!>`F`>`F`>`F`=PE_=PE_=PE_=PE^=@E^=@E^=@E] M=0E]=0E]=0E\=0E\=`E\=`E[=`E[<PE[<PE[<PEZ<@EZ<@EZ<@EY<@EY<0EY M<0EX<0EX<`EX<`EW<`EW<`EW;PEV;PEV;PEV;@AV;@AU;@AU;0AU;0AT;0AT M;0AT;`AS;`AS;`AS:PAR:PAR:PAR:PAQ:@AQ:@AQ:@AP:0AP:0AP:0AP:`AO M:`AO:`AO:`AN9PAN9PAN9PAM9@AM9@AM9@AL9@AL90AL90AK90AK9`AK9`AK M9`AJ8PAJ8PAJ8PAI8PAI8@AI8@=H8@=H80=H80=G80=G80=G8`=F8`=F8`=F M7P=E7P=E7P=E7@=E7@=D7@=D7@=D70=C70=C70=C7`=B7`=B7`=B7`=A6P=A M6P=A6P=@6@=@6@=@6@=@60=?60=?60=?60=>6`=>6`=>6`==5P==5P==5P=< M5@=<5@=<5@=;5@9;509;509:509:5`9:5`9:5`995`994P994P984P984@98 M4@974@9740974096409640964`954`954`953P953P943P943P943@933@93 M3@933092309230923`913`913`913`902P902P902P9/2@9/2@9/2@9/2@9. M205.205.205-2`5-2`5-2`5,1P5,1P5,1P5+1P5+1@5+1@5*1@5*105*105* M105)105)1`4``+>K#;>K#;:K#;:J#;:J#;6J#;6J#;6I#;2I#;2I#;2H#;.H M#;.H#;.G#;.G#;*G#;*G#;*F#;&F#;&F#;&E#;"E#;"E#;"E#:^D#:^D#:^D M#:ZC#:ZC#:ZC#:VB#:VB#:VB#:VB#:RA#:RA#:RA#:N@#:N@#:N@#:J@#*J? M#*J?#*F?#*F>#*F>#*B>#*B=#*B=#*B=#*>=#*><#*><#*:<#*:;#*:;#*6; M#*6;#*6:#*2:#*2:#*29#*.9#*.9#*.8#*.8#**8#**8#**7#*&7#*&7#*&6 M#*"6#*"6#*"6#)^5#)^5#)^5#)Z4#)Z4#)Z4#)V3"YV3"YV3"YV3"YR2"YR2 M"YR2"YN1"YN1"YN1"YJ1"YJ0"YJ0"YF0"YF/"YF/"YB/"YB."YB."YB."Y>. M"Y>-"Y>-"Y:-"Y:,"Y:,"Y6,"Y6,"Y6+"Y2+"Y2+"Y2*"Y.*"Y.*"Y.)"Y&( M#)&(#)&(#9&'#)"'#)&("Y&'"Y"'"I"'"I"'"H^&"H^&"H^&"HZ%"HZ%"HZ% M"HV$"HV$"HV$"HV$"HR#"HR#"HR#"HN""HN""HN""HJ""HJ!"HJ!"HF!"HF` M"HF`"HB`"HA_"HA_"H=_"H=_"H=^"H=^"H9^"H9]"H9]"H5]"H5]"H5\"H1\ M"H1\"H1["H-["H-["8-Z"8)Z"8)Z"8)Z"8)Y"8%Y"8%Y"8%X"8!X"8!X"8!X M"7]W"7]W"7]W"7YV"7YV"7YV"7UU"7UU"7UU"7QU"7QT"7QT"7QT"7MS"7MS M"7MS"7IS"7IR"7IR"7ER"7EQ"7EQ"7AQ"7AP"7AP"7=P"7=P"7=O"7=O"79O M"79N"'9N"'5N"'5N"'5M"'1M"'1M"'1L"'-L"'-L"'-K"')K"')K"')K"'%J M"'%J"'%J"'%I"'!I"'!I"'!H"&]H"&]H"&]H"&YG"&YG"&YG"&UF"&UF"&UF M"&QF"&QE"&QE"&QE"&MD"&MD"&MD"&IC"&IC"&IC"&EC"&EB"&EB!VAB!VAA M!VAA!V=A!V=A!V=@!V9@!V9@!V9?!V9?!V5?!V5>!V5>!V1>!V1>!V1=!V-= M!V-=!V-<!V)<!V)<!V)<!V%;!V%;!V%;!V%:!V!:!V!:!V!9!U]9!U]9!U]9 M!UY8!UY8!UY8!UU7!UU7!UU7!UQ7!UQ6!UQ6!UM6!EM5!EM5!EM5!EI4!EI4 M!EI4!EE4!EE3!EE3!EA3!EA2!EA2!E=2!E=2!E=1!E91!E91!E90!E90!E50 M!E5/!E5/!E1/!E1/!E1.!E-.!E-.!E--!E)-!E)-!E)-!E%,!E%,!E%,!E!+ M!E!+!E!+!E!*!D]*!D]*!D]*!DY)!4Y)!4Y)!4U(!4U(!4U(!4Q(!4Q'!4Q' M!4M'!4M&!4M&!4M&!4I%!4I%!4I%!4E%!0``MZP-MZL-MZL-MJL-MJH-MJH- MM:H-M:H-M:D-M*D-M*D-M*@-M*@-LZ@-LZ@-LZ<-LJ<-LJ<-LJ8-L:8-L:8- ML:4-L*4-L*4-L*4-KZ0-KZ0-KZ0-KJ,-KJ,-KJ,-KJ,-K:(-K:(-K:(-K*$- MK*$-K*$-JZ`-JZ`-JZ`-JJ`,JI\,JI\,J9\,J9X,J9X,J9X,J)X,J)T,J)T, MIYT,IYP,IYP,IIP,IIL,IIL,I9L,I9L,I9H,I)H,I)H,I)D,HYD,HYD,HYD, MHY@,HI@,HI@,HI<,H9<,H9<,H98,H)8,H)8,H)8,GY4,GY4,GY4,GI0,GI0, MGI0,GI0,G9,+G9,+G9,+G)(+G)(+G)(+FY$+FY$+FY$+FI$+FI`+FI`+F9`+ MF8\+F8\+F(\+F(\+F(X+F(X+EXX+EXT+EXT+EHT+EHP+EHP+E8P+E8P+E8L+ ME(L+E(L+E(H+DHD,DHD-D(<0CH43C(05C843CX40D(<-D8@+D8<+D(<*D(<* MD(<*CX8*CX8*CX8*CH4*CH4*CH4*C84*C80*C80*C80*C(,*C(,*C(,*BX(* MBX(*BX(*BH(*BH$*BH$*B8$*B8`*B8`*B(`*B'\*B'\*B'\*AW\*AWX*AWX* MAGX*AGT*AGT*A7T*A7T*A7P*A'P*A'P*A'L*@WL*@WL)@WH)@GH)@GH)@GH) M@GD)@7D)@7D)@7@)@'@)@'@)@'@)?W<)?W<)?W<)?G8)?G8)?G8)?74)?74) M?74)?74)?'0)?'0)?'0)>W,)>W,)>W,)>G,)>G()>G()>7()>7$)>7$)>'$) M>'`)>'`)=W`)=W`)=V\)=V\)=F\)=FX(=FX(=6X(=6X(=6T(=&T(=&T(=&P( M<VP(<VP(<VL(<FL(<FL(<FL(<FH(<6H(<6H(<6D(<&D(<&D(<&D(;V@(;V@( M;V@(;F<(;F<(;F<(;68(;68(;68(;&8(;&4(;&4(;&4(:V0(:V0(:V0(:F0( M:F,(:F,(:6,(:6((:6(':&(':&$':&$'9V$'9V$'9V`'9V`'9F`'9E\'9E\' M95\'95\'95X'9%X'9%X'9%T'8UT'8UT'8UP'8EP'8EP'8EP'85L'85L'85L' M85H'8%H'8%H'8%H'7UD'7UD'7UD'7E@'7E@'7E@'75<'75<'75<'7%<'7%8' M7%8'7%8&6U4&6U4&6U4&6E4&6E0&6E0&650&65,&65,&6%,&6%(&6%(&5U(& M5U(&5U$&5E$&5E$&5E`&5E`&55`&55`&54\&5$\&5$\&5$X&4TX&4TX&4TT& M4DT&4DT&4DT&44P&44P&44P&44L&4$L&4$L&4$L&3TH&3TH&3TH&3DD%3DD% M3DD%34@%34@%34@%3$@%3$<%3$<%2T<%2T8%2T8%2T8%2D8%2D4%2D4%``"X MK`VWK`VWJPVWJPVVJPVVJPVVJ@VUJ@VUJ@VUJ0VTJ0VTJ0VTJ`VTJ`VSJ`VS MJ`VSIPVRIPVRIPVRI@VQI@VQI@VQI@VPI0VPI0VPI0VOI`VOI`VOI`VOHPVN MHPVNHPVNHPVMH@VMH@VMH@VLH0VLH0VLH0VKH0VKH`VKH`VJH`RJGPRJGPRI MGPRIG@RIG@RIG@RHG@RHG0RHG0RGG0RGG`RGG`RFG`RFG`RFFPREFPREFPRE MF@RDF@RDF@RDF0RDF0RCF0RCF0RCF`RBF`RBF`RBEPRAEPRAEPRAE@R@E@R@ ME@R@E@R?E0R?E0R?E0R?E`R>E`R>E`R>E`R=DPN=DPN=DPN<D@N<D@N<D@N; MD0N;D0N;D0N:D0N:D`N:D`N9D`N9CPN9CPN9CPN8CPN8C@N8C@N7C@N7C0N7 MC0N6C0N6C`N6C`N5C`N5C`N5BPN4BPN3B@R2B`Z/A12(@!V!>2E^=BV`>"F% M?2",@A:/A@^0APR1APN0APN0APJ0APJ/A@J/A@J/A@J.A0J.A0J.A0J.A0J- MA`J-A`J-A`J,@PJ,@PJ,@PJ+@@J+@@J+@@J*@@J*@0J*@0J)@0J)@`J)@`J) M@`J(@`J(?PJ(?PJ'?PJ'?@J'?@J&?@J&?0J&?0J%?0J%?0J%?`J$?`J$?`J$ M>PJ#>PJ#>PF#>PF#>@F">@F">@F">0F!>0F!>0F!>`F`>`F`>`F`>`E_=PE_ M=PE_=PE^=@E^=@E^=@E^=@E]=0E]=0E]=0E\=`E\=`E\=`E[<PE[<PE[<PEZ M<PEZ<@EZ<@EY<@EY<0EY<0EX<0EX<0EX<`EX<`EW<`EW;PEW;PEV;PEV;@AV M;@AU;@AU;@AU;0AT;0AT;0AT;`AS;`AS;`AS;`AS:PAR:PAR:PAR:@AQ:@AQ M:@AQ:0AP:0AP:0AP:0AO:`AO:`AO:`AN9PAN9PAN9PAM9PAM9@AM9@AM9@AL M90AL90AL90AK9`AK9`AK9`AJ9`AJ8PAJ8PAI8PAI8@AI8@=H8@=H8@=H80=H M80=G80=G8`=G8`=F8`=F7P=F7P=E7P=E7P=E7@=D7@=D7@=D70=C70=C70=C M70=B7`=B7`=B7`=B6P=A6P=A6P=A6@=@6@=@6@=@6@=?60=?60=?60=>6`=> M6`=>6`==6`==5P==5P==5P=<5@=<5@=<5@9;509;509;509:509:5`9:5`99 M5`994P994P984P984@984@974@974@974097409640964`964`954`954`95 M3P943P943P943@933@933@9330923092309230923`913`913`912P902P90 M2P902P9/2@9/2@9/2@9.205.205.205-2`5-2`5-2`5,2`5,1P5,1P5,1P5+ M1@5+1@5+1@5*1@5*104``+BL#KBL#;>L#;>K#;>K#;:K#;:K#;:J#;6J#;6J M#;6I#;6I#;2I#;2H#;2H#;.H#;.H#;.G#;*G#;*G#;*F#;&F#;&F#;&F#;"E M#;"E#;"E#;"D#:^D#:^D#:^C#:ZC#:ZC#:ZC#:VB#:VB#:VB#:RA#:RA#:RA M#:NA#:N@#:N@#:J@#*J?#*J?#*J?#*F>#*F>#*F>#*B>#*B=#*B=#*>=#*>< M#*><#*:<#*:<#*:;#*6;#*6;#*6:#*6:#*2:#*29#*29#*.9#*.9#*.8#**8 M#**8#**7#*&7#*&7#*&7#*"6#*"6#*"6#)^5#)^5#)^5#)^4#)Z4#)Z4#)Z4 M#)V3"YV3"YV3"YR2"YR2"YR2"YN2"YN1"YN1"YJ1"YJ0"YJ0"YJ0"YF/"YF/ M"YF/"YB/"YB."YB."Y>."Y>-"Y>-"Y:-"Y:-"Y:,"Y6,"Y6,"Y2*#).*#8Z& M%85\(W=O.VAA4V%;7F5>6'!I1'UV+8F`&8Z%$)"'#)&("Y"'"Y"'"I"'"H^& M"H^&"H^&"H^%"HZ%"HZ%"HZ%"HV$"HV$"HV$"HR#"HR#"HR#"HN#"HN""HN" M"HJ""HJ!"HJ!"HF!"HF`"HF`"HF`"HB`"HA_"HA_"H=_"H=^"H=^"H9^"H9^ M"H9]"H5]"H5]"H5\"H1\"H1\"H1["H1["H-["H-["8-Z"8)Z"8)Z"8)Y"8%Y M"8%Y"8%Y"8!X"8!X"8!X"7]W"7]W"7]W"7YV"7YV"7YV"7YV"7UU"7UU"7UU M"7QT"7QT"7QT"7MT"7MS"7MS"7IS"7IR"7IR"7ER"7EQ"7EQ"7EQ"7AQ"7AP M"7AP"7=P"7=O"7=O"79O"79O"79N"'5N"'5N"'5M"'1M"'1M"'1L"'-L"'-L M"'-L"'-K"')K"')K"')J"'%J"'%J"'%I"'!I"'!I"'!I"&]H"&]H"&]H"&YG M"&YG"&YG"&YG"&UF"&UF"&UF"&QE"&QE"&QE"&MD"&MD"&MD"&ID"&IC"&IC M"&EC"&EB"&EB!VAB!VAB!VAA!VAA!V=A!V=@!V=@!V9@!V9?!V9?!V5?!V5? M!V5>!V1>!V1>!V1=!V-=!V-=!V-=!V-<!V)<!V)<!V);!V%;!V%;!V%:!V!: M!V!:!V!:!U]9!U]9!U]9!UY8!UY8!UY8!UU8!UU7!UU7!UU7!UQ6!UQ6!UQ6 M!EM5!EM5!EM5!EI5!EI4!EI4!EE4!EE3!EE3!EA3!EA3!EA2!EA2!E=2!E=1 M!E=1!E91!E90!E90!E50!E50!E5/!E1/!E1/!E1.!E-.!E-.!E-.!E)-!E)- M!E)-!E),!E%,!E%,!E%+!E!+!E!+!E!+!D]*!D]*!D]*!DY)!4Y)!4Y)!4U) M!4U(!4U(!4U(!4Q'!4Q'!4Q'!4M&!4M&!4M&!4I&!0``N*T.N*P.N*P-MZP- MMZL-MZL-MJL-MJL-MJH-MJH-M:H-M:D-M:D-M*D-M*D-M*@-LZ@-LZ@-LZ<- MLJ<-LJ<-LJ8-L:8-L:8-L:8-L*4-L*4-L*4-L*0-KZ0-KZ0-KZ0-KJ,-KJ,- MKJ,-K:(-K:(-K:(-K*$-K*$-K*$-JZ$-JZ`-JZ`-JZ`,JI\,JI\,JI\,J9\, MJ9X,J9X,J)X,J)T,J)T,IYT,IYP,IYP,IIP,IIP,IIL,IIL,I9L,I9H,I9H, MI)H,I)H,I)D,HYD,HYD,HY@,HI@,HI@,HI<,H9<,H9<,H9<,H)8,H)8,H)8, MH)4,GY4,GY4,GY4,GI0,GI0,GI0,G9,+G9,+G9,+G)(+G)(+G)(+FY(+FY$+ MFY$+FY$+FI`+FI`+FI`+F9`+F8\+F8\+F(\+F(X+F(X+EXX+EXT+EXT+EHT+ MEHT+EHP+E8P+E(L-D(<3AGTD=&U`6U9I1$"..SB<0#R54$I[95]6>W0QB7\: MCX8/D8@+D8@+D(<+D(<*D(<*D(8*CX8*CX8*CX8*CH4*CH4*CH4*C80*C80* MC80*C(,*C(,*C(,*BX,*BX(*BX(*BH(*BH$*BH$*BH$*B8$*B8`*B8`*B(`* MB'\*B'\*AW\*AWX*AWX*AGX*AGX*AGT*A7T*A7T*A7P*A7P*A'P*A'L*A'L* M@WL*@WL)@WH)@GH)@GH)@GD)@7D)@7D)@7D)@'@)@'@)@'@)?W<)?W<)?W<) M?W8)?G8)?G8)?G8)?74)?74)?74)?'0)?'0)?'0)>W0)>W,)>W,)>G,)>G() M>G()>G()>7$)>7$)>7$)>'$)>'`)>'`)=W`)=V\)=V\)=F\)=F\)=FX(=6X( M=6X(=6T(=&T(=&T(=&P(=&P(<VP(<VP(<VL(<FL(<FL(<FH(<6H(<6H(<6H( M<&D(<&D(<&D(;V@(;V@(;V@(;V<(;F<(;F<(;F<(;68(;68(;68(;&4(;&4( M;&4(:V4(:V0(:V0(:F0(:F,(:F,(:6,(:6((:6((:6(':&(':&$':&$'9V$' M9V`'9V`'9F`'9F`'9E\'95\'95\'95X'9%X'9%X'9%T'9%T'8UT'8UT'8UP' M8EP'8EP'8EL'85L'85L'85L'8%H'8%H'8%H'7UD'7UD'7UD'7E@'7E@'7E@' M7E@'75<'75<'75<'7%8'7%8'7%8&6U8&6U4&6U4&6E4&6E0&6E0&650&65,& M65,&65,&6%,&6%(&6%(&5U(&5U$&5U$&5E$&5E$&5E`&55`&55`&54\&5$\& M5$\&5$X&4TX&4TX&4TX&4TT&4DT&4DT&4DP&44P&44P&44P&4$L&4$L&4$L& M3TH&3TH&3TH&3DD%3DD%3DD%3DD%34@%34@%34@%3$<%3$<%3$<%2T<%2T8% M2T8%``"YK0ZXK0ZXK`ZXK`VWK`VWK`VWJPVWJPVVJPVVJ@VVJ@VUJ@VUJ0VU MJ0VTJ0VTJ0VTJ`VSJ`VSJ`VSIPVRIPVRIPVRIPVQI@VQI@VQI@VQI0VPI0VP MI0VPI`VOI`VOI`VOI`VNHPVNHPVNHPVMH@VMH@VMH@VLH@VLH0VLH0VLH0VK MH`VKH`VKH`RJGPRJGPRJGPRIGPRIG@RIG@RHG@RHG0RHG0RGG0RGG0RGG`RF MG`RFG`RFFPRFFPREFPREF@REF@RDF@RDF@RDF0RCF0RCF0RCF`RBF`RBF`RB MF`RAEPRAEPRAEPRAE@R@E@R@E@R@E0R?E0R?E0R?E0R>E`R>E`R>E`R=DPN= MDPN=DPN<D@N<D@N<D@N;D@N;D0N;D0N;D0N:D`N:D`N:D`N9D`N9CPN9CPN8 MCPN8C@N8C@N7C@N7C0N7C0N6C0N6C0N5BPR2B!*(?R%U;C];56H^.IDF(\$< M&]`?'<LP+:]*181L94N$?"*/A1"0APR1B`N1B`N0APN0APJ0APJ0A@J/A@J/ MA@J/A@J.A0J.A0J.A0J-A`J-A`J-A`J,@PJ,@PJ,@PJ+@PJ+@@J+@@J+@@J* M@0J*@0J*@0J)@0J)@`J)@`J(@`J(?PJ(?PJ'?PJ'?@J'?@J&?@J&?@J&?0J% M?0J%?0J%?`J%?`J$?`J$?`J$>PJ#>PJ#>PF#>@F">@F">@F">0F!>0F!>0F! M>0F`>`F`>`F`>`F`=PE_=PE_=PE_=PE^=@E^=@E^=@E]=0E]=0E]=0E\=`E\ M=`E\=`E[=`E[<PE[<PEZ<PEZ<@EZ<@EZ<@EY<@EY<0EY<0EX<0EX<`EX<`EW M<`EW;PEW;PEV;PEV;PEV;@AU;@AU;@AU;0AU;0AT;0AT;0AT;`AS;`AS;`AS M:PAR:PAR:PAR:@AQ:@AQ:@AQ:@AP:0AP:0AP:0AO:`AO:`AO:`AO:`AN9PAN M9PAN9PAM9@AM9@AM9@AL90AL90AL90AK90AK9`AK9`AJ9`AJ8PAJ8PAJ8PAI M8PAI8@AI8@=H8@=H80=H80=G80=G8`=G8`=F8`=F8`=F7P=E7P=E7P=E7@=D M7@=D7@=D7@=D70=C70=C70=C7`=B7`=B7`=B6P=A6P=A6P=A6P=@6@=@6@=@ M6@=?60=?60=?60=?60=>6`=>6`=>6`==5P==5P==5P=<5@=<5@=<5@=;5@9; M509;509:509:5`9:5`995`995`994P994P984P984@984@974@9740974096 M409640964`954`954`953P943P943P943@943@933@933@93309230923092 M3`913`913`913`902P902P902P9/2@9/2@9/2@9.205.205.205.205-2`5- M2`5-2`5,1P5,1P5,1P5+1P5+1@4``+FM#KFM#KBM#KBL#KBL#;>L#;>L#;>K M#;>K#;:K#;:J#;:J#;6J#;6I#;6I#;2I#;2I#;2H#;.H#;.H#;.G#;*G#;*G M#;*G#;*F#;&F#;&F#;&E#;"E#;"E#;"D#:^D#:^D#:^D#:ZC#:ZC#:ZC#:VB M#:VB#:VB#:VB#:RA#:RA#:RA#:N@#:N@#:N@#*J?#*J?#*J?#*F?#*F>#*F> M#*B>#*B=#*B=#*>=#*>=#*><#*><#*:<#*:;#*:;#*6;#*6:#*6:#*2:#*2: M#*29#*.9#*.9#*.8#**8#**8#**8#**7#*&7#*&7#*&6#*"6#*"6#*"5#)^5 M#)^5#)^5#)Z4#)Z4#)Z4#)V3"YV3"YV3"YR3"YR2"YR2"YR2"YN1"YN1"YN1 M"YJ0"YJ0"YJ0"YF0"YF/"YF/"YB/"YB."YB."Y>."Y>."Y>-"Y:,#9*)$HJ! M'G=O/EQ7:#\ZF24BPQ,1X`H*[@X-Z!T<SCHWGF%;78!X*8^&$9*)"Y&("Y&( M"Y&("Y&'"Y"'"I"'"I"&"H^&"H^&"H^&"HZ%"HZ%"HZ%"HV$"HV$"HV$"HR$ M"HR#"HR#"HR#"HN""HN""HN""HJ!"HJ!"HJ!"HF!"HF`"HF`"HB`"HA_"HA_ M"H=_"H=_"H=^"H9^"H9^"H9]"H9]"H5]"H5\"H5\"H1\"H1\"H1["H-["H-[ M"8-Z"8)Z"8)Z"8)Z"8%Y"8%Y"8%Y"8%X"8!X"8!X"8!W"7]W"7]W"7]W"7YV M"7YV"7YV"7UU"7UU"7UU"7QU"7QT"7QT"7MT"7MS"7MS"7MS"7IR"7IR"7IR M"7ER"7EQ"7EQ"7AQ"7AP"7AP"7=P"7=P"7=O"79O"79O"79N"'9N"'5N"'5M M"'5M"'1M"'1M"'1L"'-L"'-L"'-K"')K"')K"')K"'%J"'%J"'%J"'!I"'!I M"'!I"'!H"&]H"&]H"&]H"&YG"&YG"&YG"&UF"&UF"&UF"&QE"&QE"&QE"&ME M"&MD"&MD"&MD"&IC"&IC"&IC"&EC"&EB"&EB!VAB!VAA!VAA!V=A!V=@!V=@ M!V9@!V9@!V9?!V5?!V5?!V5>!V5>!V1>!V1>!V1=!V-=!V-=!V-<!V)<!V)< M!V);!V%;!V%;!V%;!V!:!V!:!V!:!V!9!U]9!U]9!U]9!UY8!UY8!UY8!UU7 M!UU7!UU7!UQ6!UQ6!UQ6!UM6!EM5!EM5!EI5!EI4!EI4!EI4!EE4!EE3!EE3 M!EA3!EA2!EA2!E=2!E=1!E=1!E91!E91!E90!E50!E50!E5/!E5/!E1/!E1/ M!E1.!E-.!E-.!E--!E)-!E)-!E),!E%,!E%,!E%,!E!+!E!+!E!+!D]*!D]* M!D]*!D]*!DY)!4Y)!4Y)!4U(!4U(!4U(!4Q'!4Q'!4Q'!4M'!0``N:X.N:T. MN:T.N*T.N*P.N*P.N*P-MZP-MZL-MZL-MJL-MJH-MJH-M:H-M:H-M:D-M*D- MM*D-M*@-LZ@-LZ@-LZ<-LZ<-LJ<-LJ<-LJ8-L:8-L:8-L:4-L*4-L*4-L*4- MKZ0-KZ0-KZ0-KJ,-KJ,-KJ,-K:(-K:(-K:(-K:(-K*$-K*$-K*$-JZ`-JZ`- MJZ`,JJ`,JI\,JI\,J9\,J9X,J9X,J)X,J)T,J)T,J)T,IYT,IYP,IYP,IIP, MIIL,IIL,I9L,I9L,I9H,I)H,I)H,I)D,HYD,HYD,HY@,HI@,HI@,HI@,HI<, MH9<,H9<,H98,H)8,H)8,H)8,GY4,GY4,GY4,GI0,GI0,GI0,G9,+G9,+G9,+ MG9,+G)(+G)(+G)(+FY$+FY$+FY$+FI$+FI`+FI`+F9`+F8\+F8\+F(\+F(X+ MF(X+EXX+EHT-DHD3BX$?>7(Z7UED03V5)2/"$A'A"`CR!`3X"`CR%Q;9-3*G M7%=F?W8LC843D8@,DHD+DH@+D8@+D8@+D8<+D(<*D(<*D(<*CX8*CX8*CX8* MCH4*CH4*CH4*C80*C80*C80*C(0*C(,*C(,*C(,*BX(*BX(*BX(*BH(*BH$* MBH$*B8$*B8`*B8`*B(`*B'\*B'\*AW\*AW\*AWX*AWX*AGX*AGT*AGT*A7T* MA7T*A7P*A'P*A'P*A'L*@WL*@WL)@WH)@GH)@GH)@GH)@7D)@7D)@7D)@7@) M@'@)@'@)@'<)?W<)?W<)?W<)?G8)?G8)?G8)?74)?74)?74)?'4)?'0)?'0) M?'0)>W,)>W,)>W,)>G()>G()>G()>7()>7$)>7$)>'$)>'`)>'`)=W`)=W`) M=V\)=F\)=F\)=FX(=FX(=6X(=6T(=6T(=&T(=&T(=&P(<VP(<VP(<VL(<FL( M<FL(<FL(<6H(<6H(<6H(<6D(<&D(<&D(<&@(;V@(;V@(;V@(;F<(;F<(;F<( M;68(;68(;68(;&8(;&4(;&4(:V4(:V0(:V0(:V0(:F,(:F,(:F,(:6,(:6(( M:6(':&(':&$':&$'9V$'9V$'9V`'9F`'9F`'9E\'9E\'95\'95X'95X'9%X' M9%X'9%T'8UT'8UT'8UP'8EP'8EP'8EP'85L'85L'85L'8%H'8%H'8%H'8%D' M7UD'7UD'7UD'7E@'7E@'7E@'75<'75<'75<'7%<'7%8'7%8'6U8&6U4&6U4& M6U4&6E0&6E0&6E0&650&65,&65,&6%,&6%(&6%(&5U(&5U(&5U$&5E$&5E$& M5E`&55`&55`&54\&54\&5$\&5$\&5$X&4TX&4TX&4TT&4DT&4DT&4DT&44P& M44P&44P&4$L&4$L&4$L&4$H&3TH&3TH&3TH&3DD%3DD%3DD%34@%34@%34@% M3$@%3$<%3$<%``"ZK@ZYK@ZYK0ZYK0ZYK0ZXK0ZXK`ZXK`VWK`VWJPVWJPVV MJPVVJ@VVJ@VUJ@VUJ@VUJ0VTJ0VTJ0VTJ`VSJ`VSJ`VSJ`VSIPVRIPVRIPVR MI@VQI@VQI@VQI0VPI0VPI0VPI0VOI`VOI`VOI`VNHPVNHPVNHPVNHPVMH@VM MH@VMH@VLH0VLH0VLH0VKH`VKH`VKH`VJH`RJGPRJGPRIGPRIG@RIG@RIG@RH MG@RHG0RHG0RGG0RGG`RGG`RFG`RFFPRFFPREFPREFPREF@RDF@RDF@RDF0RC MF0RCF0RCF0RCF`RBF`RBF`RBEPRAEPRAEPRAE@R@E@R@E@R@E@R?E0R?E0R? ME0R>E`R>E`R>E`R>E`R=DPN=DPN=DPN<D@N<D@N<D@N;D0N;D0N;D0N:D0N: MD`N:D`N9D`N9CPN9CPN8CPN8C@N7C0V4BA*,@QU[<SAB6V%#/Y(I)KT3$M\( M!_,$!/@"`OL&!O05%-TT,:E;5FA\=#&-A!62B`R2B0N2B0N2B`N1B`N1B`N1 MAPN0APJ0APJ0APJ/A@J/A@J/A@J.A0J.A0J.A0J-A`J-A`J-A`J-A`J,@PJ, M@PJ,@PJ+@@J+@@J+@@J*@@J*@0J*@0J)@0J)@`J)@`J(@`J(?PJ(?PJ(?PJ' M?PJ'?@J'?@J&?@J&?0J&?0J%?0J%?0J%?`J$?`J$?`J$>PJ#>PJ#>PF#>@F" M>@F">@F">@F">0F!>0F!>0F!>`F`>`F`>`F`>`E_=PE_=PE_=PE^=@E^=@E^ M=@E]=0E]=0E]=0E]=0E\=`E\=`E\=`E[<PE[<PE[<PEZ<PEZ<@EZ<@EY<@EY M<0EY<0EX<0EX<`EX<`EW<`EW<`EW;PEW;PEV;PEV;@AV;@AU;@AU;@AU;0AT M;0AT;0AT;`AS;`AS;`AS:PAR:PAR:PAR:PAR:@AQ:@AQ:@AQ:0AP:0AP:0AP M:0AO:`AO:`AO:`AN9PAN9PAN9PAM9@AM9@AM9@AL9@AL90AL90AL90AK9`AK M9`AK9`AJ9`AJ8PAJ8PAI8PAI8@AI8@=H8@=H80=H80=G80=G80=G8`=G8`=F M8`=F7P=F7P=E7P=E7P=E7@=D7@=D7@=D70=C70=C70=C7`=B7`=B7`=B7`=A M6P=A6P=A6P=A6@=@6@=@6@=@6@=?60=?60=?60=>6`=>6`=>6`==5P==5P== M5P=<5P=<5@=<5@=<5@9;509;509;509:509:5`9:5`995`994P994P984P98 M4@984@974@974@974096409640964`964`954`954`953P943P943P943@93 M3@933@9330923092309230913`913`913`912P902P902P902@9/2@9/2@9/ M2@9.205.205.205-2`5-2`5-2`5,2`5,1P4``+JN#KJN#KJN#KFM#KFM#KFM M#KBM#KBL#KBL#;>L#;>K#;>K#;:K#;:K#;:J#;6J#;6J#;6I#;2I#;2I#;2H M#;2H#;.H#;.H#;.G#;*G#;*G#;*F#;&F#;&F#;&E#;"E#;"E#;"E#:^D#:^D M#:^D#:^C#:ZC#:ZC#:ZC#:VB#:VB#:VB#:RA#:RA#:RA#:N@#:N@#:N@#:J@ M#*J?#*J?#*F?#*F>#*F>#*F>#*B>#*B=#*B=#*>=#*><#*><#*:<#*:;#*:; M#*6;#*6;#*6:#*2:#*2:#*29#*29#*.9#*.9#*.8#**8#**8#**7#*&7#*&7 M#*&6#*"6#*"6#*"6#)^5#)^5#)^5#)Z4#)Z4#)Z4#)Z4#)V3"YV3"YV3"YR2 M"YR2"YR2"YN1"YN1"YN1"YJ1"YJ0"YJ0"YF0"YF/"YF/"YF/"Y6,$(V#'7YV M-&1>749!CBHGNQ84W`P+[`<']`4%]@0#^08&]!44W#0QJEQ6:'QT,8V%%9*) M#).)"Y*)"Y*)"Y*("Y&("Y&("Y&'"Y"'"Y"'"I"'"H^&"HZ%"XZ%"XV$"XV$ M#(V$"XV$"XR#"XV$"HV$"HR#"HR#"HR#"HN""HN""HN""HJ""HJ!"HJ!"HF! M"HF`"HF`"HB`"HB`"HA_"HA_"H=_"H=^"H=^"H9^"H9]"H9]"H5]"H5]"H5\ M"H1\"H1\"H1["H-["H-["8-["8-Z"8)Z"8)Z"8)Y"8%Y"8%Y"8%X"8!X"8!X M"8!X"7]W"7]W"7]W"7YV"7YV"7YV"7UV"7UU"7UU"7UU"7QT"7QT"7QT"7MS M"7MS"7MS"7IS"7IR"7IR"7ER"7EQ"7EQ"7AQ"7AQ"7AP"7AP"7=P"7=O"7=O M"79O"79N"'9N"'5N"'5N"'5M"'1M"'1M"'1L"'-L"'-L"'-L"')K"')K"')K M"')J"'%J"'%J"'%I"'!I"'!I"'!I"&]H"&]H"&]H"&YG"&YG"&YG"&UG"&UF M"&UF"&UF"&QE"&QE"&QE"&MD"&MD"&MD"&ID"&IC"&IC"&EC"&EB"&EB!VAB M!VAA!VAA!V=A!V=A!V=@!V=@!V9@!V9?!V9?!V5?!V5?!V5>!V1>!V1>!V1= M!V-=!V-=!V-<!V)<!V)<!V)<!V);!V%;!V%;!V%:!V!:!V!:!V!:!U]9!U]9 M!U]9!UY8!UY8!UY8!UU7!UU7!UU7!UQ7!UQ6!UQ6!UQ6!EM5!EM5!EM5!EI5 M!EI4!EI4!EE4!EE3!EE3!EA3!EA2!EA2!E=2!E=2!E=1!E=1!E91!E90!E90 M!E50!E50!E5/!E1/!E1/!E1.!E-.!E-.!E--!E)-!E)-!E)-!E%,!E%,!E%, M!E%+!E!+!E!+!E!+!D]*!D]*!D]*!DY)!4Y)!4Y)!4U(!4U(!4U(!4Q(!0`` MNJ\.NJX.NJX.NJX.N:T.N:T.N:T.N*T.N*P.N*P-MZP-MZL-MZL-MJL-MJL- MMJH-M:H-M:H-M:D-M:D-M*D-M*@-M*@-LZ@-LZ@-LZ<-LJ<-LJ<-LJ8-L:8- ML:8-L:8-L*4-L*4-L*4-L*0-KZ0-KZ0-KZ,-KJ,-KJ,-KJ,-K:(-K:(-K:(- MK*$-K*$-K*$-JZ$-JZ`-JZ`-JJ`,JI\,JI\,JI\,J9X,J9X,J9X,J)X,J)T, MJ)T,IYT,IYP,IYP,IIP,IIP,IIL,I9L,I9L,I9H,I9H,I)H,I)D,I)D,HYD, MHYD,HY@,HI@,HI@,HI<,H9<,H9<,H9<,H)8,H)8,H)8,GY4,GY4,GY4,GY0, MGI0,GI0,GI0,G9,+G9,+G9,+G)(+G)(+G)(+FY(+FY$+FY$+FI$+FI`+FI`+ MFI`+F(X,EXT.D8@7?G<T9V!91T*-*BB[&!;9#0SJ#@WI#@WH#`SK"`?S"`?S M%A3<-#&I7%=G?74PCH45DHD,DXH+DXD+DHD+DHD+DH@+D8@+D8@+D8@+CX8, MCX8,CH4-C(,/BX(1BH$3B7\5B'\5B8`3BX(0BX(.C(,,C(,+C(,*C(,*C(,* MBX,*BX(*BX(*BH(*BH$*BH$*B8$*B8`*B8`*B8`*B(`*B'\*B'\*AW\*AWX* MAWX*AGX*AGX*AGT*A7T*A7T*A7P*A'P*A'P*A'L*A'L*@WL*@WL)@WH)@GH) M@GH)@GD)@7D)@7D)@7D)@'@)@'@)@'@)?W<)?W<)?W<)?G8)?G8)?G8)?G8) M?74)?74)?74)?'0)?'0)?'0)>W,)>W,)>W,)>G,)>G()>G()>7()>7$)>7$) M>7$)>'$)>'`)>'`)=W`)=V\)=V\)=F\)=FX(=FX(=6X(=6X(=6T(=&T(=&T( M=&P(<VP(<VP(<VP(<VL(<FL(<FL(<FH(<6H(<6H(<6D(<&D(<&D(<&D(;V@( M;V@(;V@(;F<(;F<(;F<(;F<(;68(;68(;68(;&4(;&4(;&4(:V0(:V0(:V0( M:F0(:F,(:F,(:6,(:6((:6(':&(':&(':&$':&$'9V$'9V`'9V`'9F`'9E\' M9E\'95\'95\'95X'9%X'9%X'9%T'8UT'8UT'8UT'8UP'8EP'8EP'8EL'85L' M85L'85H'8%H'8%H'8%H'7UD'7UD'7UD'7E@'7E@'7E@'75@'75<'75<'75<' M7%8'7%8'7%8&6U4&6U4&6U4&6E4&6E0&6E0&650&65,&65,&6%,&6%,&6%(& M6%(&5U(&5U$&5U$&5E$&5E`&5E`&55`&55`&54\&5$\&5$\&5$X&4TX&4TX& M4TX&4DT&4DT&4DT&4DP&44P&44P&44L&4$L&4$L&4$L&3TH&3TH&3TH&3DD% M3DD%3DD%34D%34@%34@%``"[KPZ[KPZZK@ZZK@ZZK@ZYK@ZYK0ZYK0ZXK0ZX MK`ZXK`VWK`VWJPVWJPVVJPVVJPVVJ@VVJ@VUJ@VUJ0VUJ0VTJ0VTJ0VTJ`VS MJ`VSJ`VSIPVRIPVRIPVRI@VQI@VQI@VQI@VPI0VPI0VPI0VPI`VOI`VOI`VO MI`VNHPVNHPVNHPVMH@VMH@VMH@VLH0VLH0VLH0VKH0VKH`VKH`VKH`RJGPRJ MGPRJGPRIGPRIG@RIG@RHG@RHG0RHG0RGG0RGG`RGG`RFG`RFG`RFFPREFPRE MFPREF@REF@RDF@RDF@RDF0RCF0RCF0RCF`RBF`RBF`RBEPRAEPRAEPRAEPR@ ME@R@E@R@E@R@E0R?E0R?E0R?E0R>E`R>E`R>E`R=DPN=DPN=DPN<D@N<D@N< MD@N;D@N;D0N;D0N:D0N:D`N9CPR8C@^1B!B%?"QJ8U=)18DL*;D5%-T/#N81 M#^0;&=0?'<P9&-8-#.H)"/$6%-PU,JA?66-_=RV/A123B0R3B@N3B@N3B0N2 MB0N2B0N2B`N0APR0APR.A1&*@1:%?1R">B%^=BA[<RUW<#)Y<#![<RQ_=R2$ M?!N'?A6*@1"+@@V+@@N,@PJ,@PJ+@PJ+@@J+@@J*@@J*@0J*@0J*@0J)@`J) M@`J)@`J(@`J(?PJ(?PJ'?PJ'?@J'?@J&?@J&?@J&?0J%?0J%?0J%?`J$?`J$ M?`J$>PJ$>PJ#>PJ#>PF#>@F">@F">@F">0F!>0F!>0F!>0F`>`F`>`F`>`E_ M=PE_=PE_=PE_=@E^=@E^=@E^=@E]=0E]=0E]=0E\=`E\=`E\=`E[=`E[<PE[ M<PEZ<PEZ<@EZ<@EY<@EY<0EY<0EY<0EX<0EX<`EX<`EW<`EW;PEW;PEV;PEV M;PEV;@AU;@AU;@AU;0AT;0AT;0AT;`AT;`AS;`AS;`AS:PAR:PAR:PAR:@AQ M:@AQ:@AQ:@AP:0AP:0AP:0AO:`AO:`AO:`AN9PAN9PAN9PAN9PAM9@AM9@AM M9@AL90AL90AL90AK90AK9`AK9`AJ9`AJ8PAJ8PAI8PAI8@AI8@AI8@=H8@=H M80=H80=G80=G8`=G8`=F8`=F8`=F7P=E7P=E7P=E7@=D7@=D7@=D70=C70=C M70=C70=C7`=B7`=B7`=B6P=A6P=A6P=A6P=@6@=@6@=@6@=?60=?60=?60=> M6`=>6`=>6`=>6`==5P==5P==5P=<5@=<5@=<5@9;5@9;509;509:509:5`9: M5`995`994P994P984P984P984@984@974@9740974096409640964`954`95 M4`953P943P943P943@933@933@933@933092309230923`913`913`913`90 M2P902P902P9/2@9/2@9/2@9.205.205.205-205-2`4``+NO#KNO#KNO#KJN M#KJN#KJN#KFN#KFM#KFM#KBM#KBL#KBL#;>L#;>L#;>K#;:K#;:K#;:J#;:J M#;6J#;6I#;6I#;2I#;2I#;2H#;.H#;.H#;.G#;*G#;*G#;*G#;&F#;&F#;&F M#;&E#;"E#;"E#;"D#:^D#:^D#:^D#:ZC#:ZC#:ZC#:VB#:VB#:VB#:RA#:RA M#:RA#:RA#:N@#:N@#:N@#*J?#*J?#*J?#*F?#*F>#*F>#*B>#*B=#*B=#*>= M#*><#*><#*:<#*:<#*:;#*:;#*6;#*6:#*6:#*2:#*2:#*29#*.9#*.9#*.8 M#**8#**8#**7#*&7#*&7#*&7#*&6#*"6#*"6#*"5#)^5#)^5#)^5#)Z4#)Z4 M#)Z4#)V3"YV3"YV3"YR2"YR2"YR2"YN2"YN1"YN1"YJ0#)B.#Y*(&(1[+FUF M4DY)@R\LM!D8UPX-Z!,2X"`>RS`ML30PK"8CPA03W@L*[1<5VC8SIE]98X!W M+8^'$Y.*#)2*"Y.*"Y.*"Y.)"Y*)"Y&(#8^%$(R#%(1\(7MT+W!I0FAB36!: M7%M59%=1:EE49E]9769@3G!I/GER+H!X((9^%HJ!#XN""XR#"HR#"HN#"HN" M"HN""HN""HJ!"HJ!"HJ!"HF!"HF`"HF`"HB`"HA_"HA_"H=_"H=^"H=^"H9^ M"H9^"H9]"H5]"H5]"H5\"H5\"H1\"H1\"H1["H-["H-["8-Z"8)Z"8)Z"8)Y M"8%Y"8%Y"8%Y"8!X"8!X"8!X"8!W"7]W"7]W"7]W"7YV"7YV"7YV"7UU"7UU M"7UU"7QT"7QT"7QT"7MT"7MS"7MS"7IS"7IR"7IR"7IR"7ER"7EQ"7EQ"7AQ M"7AP"7AP"7=P"7=O"7=O"79O"79O"79N"'5N"'5N"'5M"'5M"'1M"'1M"'1L M"'-L"'-L"'-K"')K"')K"')J"'%J"'%J"'%J"'!I"'!I"'!I"&]H"&]H"&]H M"&]H"&YG"&YG"&YG"&UF"&UF"&UF"&QE"&QE"&QE"&ME"&MD"&MD"&ID"&IC M"&IC"&IC"&EC"&EB"&EB!VAB!VAA!VAA!V=A!V=@!V=@!V9@!V9@!V9?!V5? M!V5?!V5>!V1>!V1>!V1=!V1=!V-=!V-=!V-<!V)<!V)<!V);!V%;!V%;!V%; M!V!:!V!:!V!:!U]9!U]9!U]9!U]8!UY8!UY8!UY8!UU7!UU7!UU7!UQ6!UQ6 M!UQ6!UM6!EM5!EM5!EI5!EI4!EI4!EE4!EE3!EE3!EE3!EA3!EA2!EA2!E=2 M!E=1!E=1!E91!E91!E90!E50!E50!E5/!E1/!E1/!E1.!E1.!E-.!E-.!E-- M!E)-!E)-!E),!E%,!E%,!E%,!E!+!E!+!E!+!D]*!D]*!D]*!DY)!4Y)!4Y) M!4Y)!0``O+`.NZ\.NZ\.NZ\.NJX.NJX.NJX.N:X.N:T.N:T.N*T.N*P.N*P- MMZP-MZP-MZL-MZL-MJL-MJH-MJH-M:H-M:D-M:D-M*D-M*D-M*@-LZ@-LZ@- MLZ<-LJ<-LJ<-LJ<-LJ8-L:8-L:8-L:4-L*4-L*4-L*0-KZ0-KZ0-KZ0-KJ,- MKJ,-KJ,-K:(-K:(-K:(-K*(-K*$-K*$-K*$-JZ`-JZ`-JZ`,JI\,JI\,JI\, MJ9\,J9X,J9X,J)X,J)T,J)T,IYT,IYT,IYP,IYP,IIP,IIL,IIL,I9L,I9H, MI9H,I)H,I)H,I)D,HYD,HYD,HY@,HI@,HI@,HI@,H9<,H9<,H9<,H98,H)8, MH)8,H)4,GY4,GY4,GY4,GI0,GI0,GI0,G9,+G9,+G9,+G),+G)(+G)(+G)(+ MFI`,F8\.DHD8A'PM;F=13TJ",2ZQ&1C7$`_F$A'B(1_*-S.G1T.,1D*.,2VQ M&!?8#@WI&!?8.#2D8%IB@'<MD(84DXH,E(L+E(H+DXH+DXH+DH@-CX81B8$9 M?W<K;VE#7EAA3DI[03R2-S.B,"VM+RRN,2ZJ.36>0CZ.3TIX7EA=;69$>G(L MA'P9BH$0BX,,BX(+BX(+BX,*BX(*BX(*BX(*BH$*BH$*BH$*B8$*B8`*B8`* MB(`*B'\*B'\*AW\*AW\*AWX*AGX*AGX*AGT*AGT*A7T*A7P*A7P*A'P*A'P* MA'L*@WL*@WL)@WH)@GH)@GH)@GH)@7D)@7D)@7D)@'@)@'@)@'@)@'<)?W<) M?W<)?W<)?G8)?G8)?G8)?74)?74)?74)?'0)?'0)?'0)>W0)>W,)>W,)>W,) M>G()>G()>G()>7()>7$)>7$)>'$)>'`)>'`)=W`)=V\)=V\)=F\)=F\)=FX( M=6X(=6X(=6T(=6T(=&T(=&T(=&P(<VP(<VP(<VL(<FL(<FL(<FH(<6H(<6H( M<6H(<&D(<&D(<&D(<&@(;V@(;V@(;V@(;F<(;F<(;F<(;68(;68(;68(;&4( M;&4(;&4(:V4(:V0(:V0(:F0(:F,(:F,(:F,(:6,(:6((:6(':&(':&$':&$' M9V$'9V`'9V`'9F`'9F`'9E\'95\'95\'95X'95X'9%X'9%X'9%T'8UT'8UT' M8UP'8EP'8EP'8EL'85L'85L'85L'8%H'8%H'8%H'7UD'7UD'7UD'7UD'7E@' M7E@'7E@'75<'75<'75<'7%8'7%8'7%8'6U8&6U4&6U4&6E4&6E0&6E0&6E0& M650&65,&65,&6%,&6%(&6%(&5U(&5U$&5U$&5E$&5E$&5E`&55`&55`&54\& M5$\&5$\&5$\&5$X&4TX&4TX&4TT&4DT&4DT&4DP&44P&44P&44P&4$L&4$L& M4$L&3TH&3TH&3TH&3TH&3DD%3DD%``"\L`Z\L`Z[KPZ[KPZ[KPZZKPZZK@ZZ MK@ZYK@ZYK0ZYK0ZXK0ZXK`ZXK`ZXK`VWK`VWJPVWJPVVJPVVJ@VVJ@VUJ@VU MJ@VUJ0VTJ0VTJ0VTJ`VSJ`VSJ`VSIPVSIPVRIPVRIPVRI@VQI@VQI@VQI0VP MI0VPI0VPI0VOI`VOI`VOI`VNHPVNHPVNHPVMH@VMH@VMH@VMH@VLH0VLH0VL MH0VKH`VKH`VKH`RJH`RJGPRJGPRIGPRIG@RIG@RHG@RHG0RHG0RHG0RGG0RG MG`RGG`RFG`RFFPRFFPREFPREFPREF@RDF@RDF@RDF0RCF0RCF0RCF`RBF`RB MF`RBF`RBEPRAEPRAEPRAE@R@E@R@E@R@E@R?E0R?E0R?E0R>E`R>E`R>E`R= MDPN=DPN=DPN=DPN<D@N<D@N:D`^4BQ:&?BQP:4]13'\R+K$9&-<,"^P0#^4? M'<TW-*9237M?66943W<W-*8:&-4.#>D:&-4Z-J!B6V"`>"V0AQ24B@R4BPN4 MBPN4B@N2B0V/AA*(?QU[=#%F8%102WDZ-ITJ)[D>',T5%-P3$=\3$=\4$]P9 M&-0?'<DK*+8Z-YI.27AD75-V;C*">AR(?Q.)@0^*@0Z+@@R+@@N+@@J+@@J+ M@@J*@0J*@0J*@0J)@0J)@`J)@`J(@`J(?PJ(?PJ'?PJ'?PJ'?@J'?@J&?@J& M?0J&?0J%?0J%?`J%?`J$?`J$?`J$>PJ#>PJ#>PF#>@F">@F">@F">@F!>0F! M>0F!>0F!>`F`>`F`>`F`=PE_=PE_=PE_=PE^=@E^=@E^=@E]=0E]=0E]=0E\ M=0E\=`E\=`E\=`E[<PE[<PE[<PEZ<@EZ<@EZ<@EY<@EY<0EY<0EX<0EX<`EX M<`EW<`EW<`EW;PEV;PEV;PEV;@AV;@AU;@AU;0AU;0AT;0AT;0AT;`AS;`AS M;`AS:PAR:PAR:PAR:PAQ:@AQ:@AQ:@AQ:0AP:0AP:0AP:`AO:`AO:`AO:`AN M9PAN9PAN9PAM9@AM9@AM9@AL9@AL90AL90AK90AK9`AK9`AK9`AJ8PAJ8PAJ M8PAI8PAI8@AI8@=H8@=H80=H80=G80=G80=G8`=F8`=F8`=F7P=F7P=E7P=E M7@=E7@=D7@=D7@=D70=C70=C70=C7`=B7`=B7`=B7`=A6P=A6P=A6P=@6@=@ M6@=@6@=@60=?60=?60=?60=>6`=>6`=>6`==5P==5P==5P=<5P=<5@=<5@=; M5@9;509;509;509:5`9:5`9:5`995`994P994P984P984@984@974@974@97 M4096409640964`954`954`953P953P943P943P943@933@933@9330923092 M309230913`913`913`902P902P902P902@9/2@9/2@9/2@9.204``+RP#KRP M#KRP#KNO#KNO#KNO#KJO#KJN#KJN#KFN#KFM#KFM#KFM#KBM#KBL#KBL#;>L M#;>K#;>K#;:K#;:J#;:J#;6J#;6J#;6I#;2I#;2I#;2H#;.H#;.H#;.H#;.G M#;*G#;*G#;*F#;&F#;&F#;&E#;"E#;"E#;"E#:^D#:^D#:^D#:ZC#:ZC#:ZC M#:ZC#:VB#:VB#:VB#:RA#:RA#:RA#:N@#:N@#:N@#:J@#*J?#*J?#*F?#*F> M#*F>#*B>#*B=#*B=#*B=#*>=#*><#*><#*:<#*:;#*:;#*6;#*6;#*6:#*2: M#*2:#*29#*.9#*.9#*.8#*.8#**8#**8#**7#*&7#*&7#*&6#*"6#*"6#*"6 M#)^5#)^5#)^5#)Z4#)Z4#)Z4#)V3"YV3"YV3"YV3"YJ0#I6,%HJ!)W)K2U-. M?#0PKAD8UPT,Z@P+[!L9U#4QJU-->VQF47%J25Y8:#HWH1H9U0\.YQL9U#HW MH&-=78)Y+)"'%)2+#)6+"Y2+"Y.*#)&'$8B`'7IS-&1=64A#AS`ML!P:T!`/ MY`H*[@8&]`<'\P@(\0H)[PL*[0T,Z1`/XQP:SR\LKD="A6%;6'1M-7YV)8%Y M'X)Z'81[&(=^$XJ!#8J!#(J!"XN""HJ""HJ!"HJ!"HF!"HF`"HF`"HB`"HA_ M"HA_"H=_"H=_"H=^"H=^"H9^"H9]"H9]"H5]"H5]"H5\"H1\"H1\"H1["H-[ M"H-["8-Z"8)Z"8)Z"8)Z"8)Y"8%Y"8%Y"8%X"8!X"8!X"8!X"7]W"7]W"7]W M"7YV"7YV"7YV"7UU"7UU"7UU"7QU"7QT"7QT"7QT"7MS"7MS"7MS"7IS"7IR M"7IR"7ER"7EQ"7EQ"7AQ"7AP"7AP"7=P"7=P"7=O"7=O"79O"79N"'9N"'5N M"'5N"'5M"'1M"'1M"'1L"'-L"'-L"'-K"')K"')K"')K"'%J"'%J"'%J"'%I M"'!I"'!I"'!I"&]H"&]H"&]H"&YG"&YG"&YG"&UF"&UF"&UF"&QF"&QE"&QE M"&QE"&MD"&MD"&MD"&ID"&IC"&IC"&EC"&EB"&EB!VAB!VAA!VAA!V=A!V=A M!V=@!V9@!V9@!V9?!V9?!V5?!V5?!V5>!V1>!V1>!V1=!V-=!V-=!V-<!V)< M!V)<!V)<!V%;!V%;!V%;!V%:!V!:!V!:!V!9!U]9!U]9!U]9!UY8!UY8!UY8 M!UU7!UU7!UU7!UQ7!UQ6!UQ6!UM6!EM5!EM5!EM5!EI4!EI4!EI4!EE4!EE3 M!EE3!EA3!EA2!EA2!E=2!E=2!E=1!E91!E91!E90!E90!E50!E5/!E5/!E1/ M!E1/!E1.!E-.!E-.!E--!E)-!E)-!E)-!E%,!E%,!E%,!E!+!E!+!E!+!E!* M!D]*!D]*!D]*!@``O;$.O+`.O+`.O+`.NZ\.NZ\.NZ\.NJ\.NJX.NJX.NJX. MN:T.N:T.N:T.N*T.N*P.N*P-MZP-MZL-MZL-MJL-MJH-MJH-M:H-M:H-M:D- MM*D-M*D-M*@-M*@-LZ@-LZ@-LZ<-LJ<-LJ<-LJ8-L:8-L:8-L:4-L*4-L*4- ML*4-KZ0-KZ0-KZ0-KZ,-KJ,-KJ,-KJ,-K:(-K:(-K:(-K*$-K*$-K*$-JZ`- MJZ`-JZ`-JJ`,JI\,JI\,J9\,J9X,J9X,J9X,J)X,J)T,J)T,IYT,IYP,IYP, MIIP,IIL,IIL,I9L,I9L,I9H,I)H,I)H,I)D,I)D,HYD,HYD,HY@,HI@,HI@, MHI<,H9<,H9<,H98,H)8,H)8,H)8,GY4,GY4,GY4,GI0,GI0,GI0,GI0,G)(, MFY$.EHT6BX(F=6U(5U)V-3*K&AC6#`OM"PKN%A7<+RRT4$N`;F=0@WHN?W8U M8EUA.S>@&1?7#0SJ&1?7.S>@8UU=@WHKD8@3E(L,E8P+E8L+DHD.C(,8?74P M9%Y91T.)*RBX&!;8"POL!P?S!P?S"@KN#@WG$1#B$A#A$`_D#`SJ"@GO#0WH M&1?5*RFT14&(7%=@:6)*:V1&;&5#<VPW?'0GA'L8B8`0BH$,BX(*BX(*BH(* MBH$*BH$*B8$*B8`*B8`*B(`*B(`*B'\*B'\*AW\*AWX*AWX*AGX*AGT*AGT* MA7T*A7T*A7P*A'P*A'P*A'L*@WL*@WL)@WL)@WH)@GH)@GH)@GD)@7D)@7D) M@7@)@'@)@'@)@'@)?W<)?W<)?W<)?G8)?G8)?G8)?78)?74)?74)?74)?'0) M?'0)?'0)>W,)>W,)>W,)>G,)>G()>G()>7()>7$)>7$)>'$)>'`)>'`)>'`) M=W`)=V\)=V\)=F\)=FX(=FX(=6X(=6X(=6T(=&T(=&T(=&P(<VP(<VP(<VL( M<FL(<FL(<FL(<FH(<6H(<6H(<6D(<&D(<&D(<&D(;V@(;V@(;V@(;F<(;F<( M;F<(;68(;68(;68(;68(;&4(;&4(;&4(:V0(:V0(:V0(:F0(:F,(:F,(:6,( M:6((:6(':&(':&$':&$'9V$'9V$'9V`'9V`'9F`'9E\'9E\'95\'95\'95X' M9%X'9%X'9%T'8UT'8UT'8UP'8EP'8EP'8EP'8EL'85L'85L'85H'8%H'8%H' M8%H'7UD'7UD'7UD'7E@'7E@'7E@'75<'75<'75<'7%<'7%8'7%8'7%8&6U4& M6U4&6U4&6E4&6E0&6E0&650&65,&65,&6%,&6%(&6%(&5U(&5U(&5U$&5U$& M5E$&5E`&5E`&55`&55`&54\&5$\&5$\&5$X&4TX&4TX&4TT&4DT&4DT&4DT& M44P&44P&44P&44L&4$L&4$L&4$L&3TH&3TH&``"]L0Z]L0Z\L`Z\L`Z\L`Z[ ML`Z[KPZ[KPZZKPZZK@ZZK@ZZK@ZYK0ZYK0ZYK0ZXK0ZXK`ZXK`VWK`VWJPVW MJPVVJPVVJPVVJ@VUJ@VUJ@VUJ0VUJ0VTJ0VTJ`VTJ`VSJ`VSJ`VSIPVRIPVR MIPVRI@VQI@VQI@VQI@VPI0VPI0VPI0VOI`VOI`VOI`VOHPVNHPVNHPVNHPVM MH@VMH@VMH@VLH0VLH0VLH0VKH0VKH`VKH`VJH`RJGPRJGPRJGPRIG@RIG@RI MG@RHG@RHG0RHG0RGG0RGG`RGG`RFG`RFG`RFFPREFPREFPREF@RDF@RDF@RD MF0RDF0RCF0RCF0RCF`RBF`RBF`RBEPRAEPRAEPRAEPR@E@R@E@R@E@R?E0R? ME0R?E0R?E`R>E`R=DPV<DA"6C!:+@B=Y<D)95',Y-:8>'-`-#.L+"NX5%-XM M*KA+1HAK9%:">C"+@B*">3!E7EXY-J,7%=L+"NX7%=LX-*5C75Z#>RJ2B1*5 MBPR5C`N4BPR0AQ.#>R=M9DM-2(`M*K06%=H*"NX)"/$-#.H5$]T>',PH)KLN M*[$M*K,G);T>',P4$]T/#N8/#N49&-0M*K)!/9!*18!*17],1WM64&IF7TYU M;C&">1R(?Q&)@`V*@0R*@0R)@0N)@`N*@0J)@0J)@`J)@`J)@`J(@`J(?PJ( M?PJ'?PJ'?@J'?@J&?@J&?0J&?0J%?0J%?0J%?`J$?`J$?`J$>PJ#>PJ#>PJ# M>PF#>@F">@F">@F">0F!>0F!>0F!>`F`>`F`>`F`>`E_=PE_=PE_=PE^=@E^ M=@E^=@E^=@E]=0E]=0E]=0E\=`E\=`E\=`E[<PE[<PE[<PEZ<PEZ<@EZ<@EY M<@EY<0EY<0EX<0EX<0EX<`EX<`EW<`EW;PEW;PEV;PEV;@AV;@AU;@AU;@AU M;0AT;0AT;0AT;`AS;`AS;`AS;`AS:PAR:PAR:PAR:@AQ:@AQ:@AQ:0AP:0AP M:0AP:0AO:`AO:`AO:`AN9PAN9PAN9PAM9PAM9@AM9@AM9@AL90AL90AL90AK M9`AK9`AK9`AJ9`AJ8PAJ8PAI8PAI8@AI8@=H8@=H8@=H80=H80=G80=G8`=G M8`=F8`=F7P=F7P=E7P=E7P=E7@=D7@=D7@=D70=C70=C70=C70=B7`=B7`=B M7`=B6P=A6P=A6P=A6@=@6@=@6@=@6@=?60=?60=?60=>6`=>6`=>6`==6`== M5P==5P==5P=<5@=<5@=<5@9;509;509;509:509:5`9:5`995`994P994P98 M4P984P984@974@974@974097409640964`964`954`954`953P943P943P94 M3@933@933@933@923092309230923`913`913`912P902P902P902P9/2@8` M`+VQ#KVQ#KVQ#KRP#KRP#KRP#KNP#KNO#KNO#KNO#KJN#KJN#KJN#KFN#KFM M#KFM#KBM#KBL#KBL#;>L#;>K#;>K#;:K#;:K#;:J#;:J#;6J#;6I#;6I#;2I M#;2I#;2H#;.H#;.H#;.G#;*G#;*G#;*F#;&F#;&F#;&F#;"E#;"E#;"E#;"D M#:^D#:^D#:^D#:ZC#:ZC#:ZC#:VB#:VB#:VB#:RA#:RA#:RA#:NA#:N@#:N@ M#:N@#*J?#*J?#*J?#*F?#*F>#*F>#*B>#*B=#*B=#*>=#*><#*><#*:<#*:< M#*:;#*6;#*6;#*6:#*6:#*2:#*29#*29#*.9#*.9#*.8#**8#**8#**7#*&7 M#*&7#*&7#*"6#*"6#*"6#*"5#)^5#)^5#)^4#)R2#Y>.%HN#*7=P15Q6;SPX MHB`>S0\.YPH*[Q03WR@FP$E$C&AB6H!X-(^%'9"'&H)Z+V);8S@UI1<6V@P+ M[!D7USDVHF-<7X-[*Y*)$I6,#):,"Y.*#HR$&7EQ.5I4;#<SI1@7UPH*[@<& M]!`/Y1X<S3$NKD(^D%!+>550;U1.<DQ'?S\[E"\LKQ\=RA,2WA$0XAH8TR8C MORHHMB<EO"DGN#0QI4I%?F1>47EQ+(-[&85]%H1\%H1\%H=^$8B`#HF`#(F` M"XJ!"HF`"HF`"HF`"HB`"HA_"HA_"H=_"H=^"H=^"H9^"H9^"H9]"H5]"H5] M"H5\"H1\"H1\"H1["H1["H-["H-["8-Z"8)Z"8)Z"8)Y"8%Y"8%Y"8%Y"8!X M"8!X"8!X"7]W"7]W"7]W"7]V"7YV"7YV"7YV"7UU"7UU"7UU"7QT"7QT"7QT M"7MT"7MS"7MS"7IS"7IR"7IR"7ER"7EQ"7EQ"7EQ"7AQ"7AP"7AP"7=P"7=O M"7=O"79O"79O"79N"'5N"'5N"'5M"'1M"'1M"'1L"'1L"'-L"'-L"'-K"')K M"')K"')J"'%J"'%J"'%J"'!I"'!I"'!I"&]H"&]H"&]H"&YG"&YG"&YG"&YG M"&UF"&UF"&UF"&QE"&QE"&QE"&ME"&MD"&MD"&ID"&IC"&IC"&EC"&EB"&EB M!VEB!VAB!VAA!VAA!V=A!V=@!V=@!V9@!V9@!V9?!V5?!V5?!V5>!V1>!V1> M!V1=!V-=!V-=!V-=!V-<!V)<!V)<!V);!V%;!V%;!V%;!V!:!V!:!V!:!U]9 M!U]9!U]9!UY8!UY8!UY8!UY8!UU7!UU7!UU7!UQ6!UQ6!UQ6!EM5!EM5!EM5 M!EI5!EI4!EI4!EE4!EE3!EE3!EA3!EA3!EA2!EA2!E=2!E=1!E=1!E91!E90 M!E90!E50!E50!E5/!E1/!E1/!E1.!E-.!E-.!E-.!E--!E)-!E)-!E),!E%, M!E%,!E%+!E!+!E!+!E!+!@``OK(.O;$.O;$.O;$.O+`.O+`.O+`.O+`.NZ\. MNZ\.NZ\.NJX.NJX.NJX.N:X.N:T.N:T.N*T.N*P.N*P-MZP-MZL-MZL-MJL- MMJL-MJH-MJH-M:H-M:D-M:D-M*D-M*D-M*@-LZ@-LZ@-LZ<-LJ<-LJ<-LJ8- ML:8-L:8-L:8-L:4-L*4-L*4-L*0-KZ0-KZ0-KZ0-KJ,-KJ,-KJ,-K:(-K:(- MK:(-K*$-K*$-K*$-JZ$-JZ`-JZ`-JZ`,JI\,JI\,JI\,J9\,J9X,J9X,J)X, MJ)T,J)T,IYT,IYP,IYP,IIP,IIP,IIL,IIL,I9L,I9H,I9H,I)H,I)H,I)D, MHYD,HYD,HY@,HI@,HI@,HI<,H9<,H9<,H9<,H)8,H)8,H)8,H)4,GY4,G9,/ MF9`5CH4E>7)$7EAO/3F@(1_+$`_F"PKN$A'B*"7!14&29F!>@'<VCX8>E8L3 MDHD7@GDQ8%IF-S.H%Q7;#0SK&AC6/#B?95]<@WLKDXD2E8P,E8P,D8@3A'PG M:F111T.*)2/"#P[F"0CQ#0SI(![).C:?54]R:F-.=&T]>G(S=F\X<6I"9E]4 M4DUT.C:=(B#$$Q'?#P[E$Q'?%!+=$`_C$A'@'1O-.#2>5U%H<FLX?74D>7(K M=6TR=&TR>W,F@'@=A'P5AWX/B8`+BH$*B8$*B8`*B8`*B(`*B'\*B'\*AW\* MAWX*AWX*AGX*AGX*AGT*A7T*A7T*A7P*A7P*A'P*A'P*A'L*@WL*@WL)@WH) M@GH)@GH)@GD)@7D)@7D)@7D)@'@)@'@)@'@)?W<)?W<)?W<)?W<)?G8)?G8) M?G8)?74)?74)?74)?'0)?'0)?'0)>W0)>W,)>W,)>G,)>G()>G()>G()>7() M>7$)>7$)>'$)>'`)>'`)=W`)=V\)=V\)=F\)=F\)=FX(=6X(=6X(=6T(=&T( M=&T(=&P(=&P(<VP(<VP(<VL(<FL(<FL(<FH(<6H(<6H(<6H(<&D(<&D(<&D( M;V@(;V@(;V@(;V<(;F<(;F<(;F<(;68(;68(;68(;&4(;&4(;&4(:V4(:V0( M:V0(:F0(:F,(:F,(:6,(:6((:6((:6(':&(':&$':&$'9V$'9V`'9V`'9F`' M9F`'9E\'95\'95\'95X'9%X'9%X'9%T'9%T'8UT'8UT'8UP'8EP'8EP'8EL' M85L'85L'85L'8%H'8%H'8%H'7UD'7UD'7UD'7E@'7E@'7E@'7E@'75<'75<' M75<'7%8'7%8'7%8&6U8&6U4&6U4&6E4&6E0&6E0&650&65,&65,&65,&6%,& M6%(&6%(&5U(&5U$&5U$&5E$&5E$&5E`&55`&55`&54\&5$\&5$\&5$X&4TX& M4TX&4TX&4TT&4DT&4DT&4DP&44P&44P&44P&4$L&4$L&``"^L@Z^L@Z]L0Z] ML0Z]L0Z]L0Z\L`Z\L`Z\L`Z[KPZ[KPZ[KPZZK@ZZK@ZZK@ZYK@ZYK0ZYK0ZX MK0ZXK`ZXK`VWK`VWK`VWJPVWJPVVJPVVJ@VVJ@VUJ@VUJ0VUJ0VTJ0VTJ0VT MJ`VSJ`VSJ`VSIPVRIPVRIPVRIPVRI@VQI@VQI@VQI0VPI0VPI0VPI`VOI`VO MI`VOI`VNHPVNHPVNHPVMH@VMH@VMH@VLH@VLH0VLH0VLH0VKH`VKH`VKH`RJ MGPRJGPRJGPRIGPRIG@RIG@RHG@RHG0RHG0RGG0RGG0RGG`RGG`RFG`RFFPRF MFPREFPREF@REF@RDF@RDF@RDF0RCF0RCF0RCF`RBF`RBF`RBF`RAEPRAEPRA MEPRAE@R@E@R@E@R?E`V:D!21B"%]=3]@6FL_.YXA'\P/#N<)"?$0#^8B(,E! M/9ID76-_=SB/AAZ7C1*9CPZ3BA:!>#->6&HT,:P6%-T-#.H<&M(^.IMG8%F% M?2F2BA.6C`V4BPZ.A1A]=#1>5V<X-:,:&-4+"NX,"^P;&=,W,Z5646]R:T*$ M>R2(@!N,@Q:*@1B'?AQ_=RIQ:D)84FPZ-IT>',P.#><("/$'!_,&!O0)"/`7 M%=@T,:5:5&-T;#9V;S%G8$M94V-54&I>65EJ8T5V;R^">1J'?@^)@`N*@0J) M@0J)@`J)@`J(@`J(?PJ(?PJ'?PJ'?@J'?@J&?@J&?@J&?0J&?0J%?0J%?`J% M?`J$?`J$?`J$>PJ#>PJ#>PF#>@F">@F">@F">0F!>0F!>0F!>0F`>`F`>`F` M>`F`=PE_=PE_=PE_=PE^=@E^=@E^=@E]=0E]=0E]=0E\=`E\=`E\=`E[=`E[ M<PE[<PE[<PEZ<@EZ<@EZ<@EY<@EY<0EY<0EX<0EX<`EX<`EW<`EW;PEW;PEV M;PEV;PEV;@AU;@AU;@AU;0AU;0AT;0AT;0AT;`AS;`AS;`AS:PAR:PAR:PAR M:@AQ:@AQ:@AQ:@AP:0AP:0AP:0AP:`AO:`AO:`AO:`AN9PAN9PAN9PAM9@AM M9@AM9@AL90AL90AL90AK90AK9`AK9`AJ9`AJ8PAJ8PAJ8PAI8PAI8@AI8@=H M8@=H80=H80=G80=G8`=G8`=F8`=F8`=F7P=E7P=E7P=E7@=E7@=D7@=D7@=D M70=C70=C70=C7`=B7`=B7`=B6P=A6P=A6P=A6P=@6@=@6@=@6@=?60=?60=? M60=?60=>6`=>6`=>6`==5P==5P==5P=<5@=<5@=<5@=;5@9;509;509:509: M5`9:5`9:5`995`994P994P984P984@984@974@9740974096409640964`95 M4`954`953P943P943P943P943@933@933@933092309230923`913`913`91 M3`902P8``+ZR#KZR#KZR#KVQ#KVQ#KVQ#KVQ#KRP#KRP#KRP#KNO#KNO#KNO M#KJO#KJN#KJN#KFN#KFM#KFM#KBM#KBL#KBL#;BL#;>L#;>K#;>K#;:K#;:J M#;:J#;6J#;6J#;6I#;2I#;2I#;2H#;.H#;.H#;.G#;*G#;*G#;*G#;*F#;&F M#;&F#;&E#;"E#;"E#;"E#:^D#:^D#:^D#:ZC#:ZC#:ZC#:VB#:VB#:VB#:VB M#:RA#:RA#:RA#:N@#:N@#:N@#*J@#*J?#*J?#*F?#*F>#*F>#*B>#*B=#*B= M#*>=#*>=#*><#*><#*:<#*:;#*:;#*6;#*6;#*6:#*2:#*2:#*29#*.9#*.9 M#*.8#**8#**8#**8#**7#*&7#*&7#*"5#9^5#IV3$9.)'X%Y.F1=9T(^FB,A MR0X-Z0D)\0T,ZQ\=SSLWHUY8;7UU/(^&'YB.$IJ0#9J0#9.*%W]W-5Q6;3(O ML!03W@T,ZQL9U#\[FVAA6(9]*)**$Y:-#96+#XN"'G1M0E%,>RPIMQ,2X`L* M[A,1X"HGNDQ'@FUF2X)Z)XZ%%)&'#I&(#9&(#9"'#HR$$X1\(6YG14]*>BPI MM!,1WP8&]`,#^@0$^`L+[!\=RCXZDV%;6'-L-VQE0U-.;SHVFC`MJC8RH4E$ M?V!:57=O+H1\%HF`#(J!"HJ!"HF!"HF`"HF`"HB`"HA_"HA_"H=_"H=_"H=^ M"H9^"H9^"H9]"H9]"H5]"H5\"H5\"H1\"H1\"H1["H-["H-["8-Z"8)Z"8)Z M"8)Z"8%Y"8%Y"8%Y"8%X"8!X"8!X"8!W"7]W"7]W"7]W"7YV"7YV"7YV"7UU M"7UU"7UU"7QU"7QT"7QT"7MT"7MS"7MS"7MS"7IR"7IR"7IR"7ER"7EQ"7EQ M"7AQ"7AP"7AP"7=P"7=P"7=O"79O"79O"79N"'9N"'5N"'5M"'5M"'1M"'1M M"'1L"'-L"'-L"'-K"')K"')K"')K"'%J"'%J"'%J"'!I"'!I"'!I"'!H"&]H M"&]H"&]H"&YG"&YG"&YG"&UF"&UF"&UF"&QF"&QE"&QE"&ME"&MD"&MD"&MD M"&IC"&IC"&IC"&EC"&EB"&EB!VAB!VAA!VAA!V=A!V=A!V=@!V9@!V9@!V9? M!V5?!V5?!V5>!V5>!V1>!V1>!V1=!V-=!V-=!V-<!V)<!V)<!V)<!V%;!V%; M!V%;!V!:!V!:!V!:!V!9!U]9!U]9!U]9!UY8!UY8!UY8!UU7!UU7!UU7!UQ7 M!UQ6!UQ6!UM6!EM5!EM5!EI5!EI4!EI4!EI4!EE4!EE3!EE3!EA3!EA2!EA2 M!E=2!E=1!E=1!E91!E91!E90!E50!E50!E5/!E5/!E1/!E1/!E1.!E-.!E-. M!E--!E)-!E)-!E),!E%,!E%,!E%,!@``O[,.OK(.OK(.OK(.OK(.O;$.O;$. MO;$.O+`.O+`.O+`.NZ\.NZ\.NZ\.NJ\.NJX.NJX.N:X.N:T.N:T.N:T.N*P. MN*P.N*P-MZP-MZL-MZL-MJL-MJH-MJH-M:H-M:H-M:D-M*D-M*D-M*@-LZ@- MLZ@-LZ<-LZ<-LJ<-LJ<-LJ8-L:8-L:8-L:4-L*4-L*4-L*4-KZ0-KZ0-KZ0- MKJ,-KJ,-KJ,-KJ(-K:(-K:(-K:(-K*$-K*$-K*$-JZ`-JZ`-JZ`-JJ`,JI\, MJI\,J9\,J9X,J9X,J)X,J)T,J)T,J)T,IYT,IYP,IYP,IIP,IIL,IIL,I9L, MI9L,I9H,I)H,I)H,I)D,HYD,HYD,HY@,HY@,HI@,HI@,HI<,H9<,H)8.G9(3 MDXH?@GHZ9F!D14&5)B3%$1#E"0CR#@WI'1O3.#2H6U5R>G)"DHD<F(X2FY$, MFY$,FI`-E8L5@'@U6E5P,"VS$Q+A"POM'!K20#N::6-7AWXGE(H2EXT-DXL1 MB8`B;V=,1T.+(R#'#@WI"0GP&!?8.#2D7%=G>W0TC((8D8@/DHD,DXD+DHD+ MDHD+D8@-C((6?'0N7UE?.36>&1C4"`?R`@+[!07V$1#A*RBV34AZ:F1'<FLZ M7UE:0#R0(R'"%Q78&QG0+RRL3TEV;&5`@'@=B8`.B8$+BH$*BH$*B8$*B8`* MB8`*B(`*B'\*B'\*AW\*AW\*AWX*AWX*AGX*AGT*AGT*A7T*A7T*A7P*A'P* MA'P*A'L*@WL*@WL)@WH)@GH)@GH)@GH)@GD)@7D)@7D)@7@)@'@)@'@)@'@) M?W<)?W<)?W<)?G8)?G8)?G8)?74)?74)?74)?'4)?'0)?'0)?'0)>W,)>W,) M>W,)>G,)>G()>G()>7()>7$)>7$)>'$)>'`)>'`)=W`)=W`)=V\)=V\)=F\) M=FX(=FX(=6X(=6X(=6T(=&T(=&T(=&P(<VP(<VP(<VL(<FL(<FL(<FL(<6H( M<6H(<6H(<6D(<&D(<&D(<&@(;V@(;V@(;V@(;F<(;F<(;F<(;68(;68(;68( M;&8(;&4(;&4(;&4(:V0(:V0(:V0(:F,(:F,(:F,(:6,(:6((:6(':&(':&$' M:&$'9V$'9V$'9V`'9F`'9F`'9E\'9E\'95\'95X'95X'9%X'9%X'9%T'8UT' M8UT'8UP'8EP'8EP'8EP'85L'85L'85L'85H'8%H'8%H'8%D'7UD'7UD'7UD' M7E@'7E@'7E@'75<'75<'75<'7%<'7%8'7%8'6U8&6U4&6U4&6U4&6E0&6E0& M6E0&650&65,&65,&6%,&6%(&6%(&5U(&5U(&5U$&5E$&5E$&5E`&5E`&55`& M54\&54\&5$\&5$\&5$X&4TX&4TX&4TT&4DT&4DT&4DT&44P&44P&``"_LPZ_ MLPZ_L@Z^L@Z^L@Z^L@Z]L0Z]L0Z]L0Z\L`Z\L`Z\L`Z[KPZ[KPZ[KPZZKPZZ MK@ZZK@ZYK@ZYK0ZYK0ZYK0ZXK0ZXK`ZXK`VWK`VWJPVWJPVVJPVVJ@VVJ@VU MJ@VUJ@VUJ0VTJ0VTJ0VTJ`VTJ`VSJ`VSJ`VSIPVRIPVRIPVRI@VQI@VQI@VQ MI0VPI0VPI0VPI0VOI`VOI`VOI`VNHPVNHPVNHPVNHPVMH@VMH@VMH@VLH0VL MH0VLH0VKH`VKH`VKH`VJH`RJGPRJGPRIGPRIG@RIG@RIG@RHG@RHG0RHG0RG MG0RGG`RGG`RFG`RFFPRFFPREFPREFPREF@RDF@RDF@RDF0RCF0RCF0RCF0RC MF`RBF`RBF`RAE@V=DQ*5C!Z$>SAH8F%'0I,I)L$3$N$)"/(-#.L=&](W-*I7 M4GEW;TB,@R68CA.<D@R<D@N<D@N;D0V3BA>`=S9;56\O++42$.,*"N\:&=5` M.YIK9%2(@"64C!&7C0R4BQ&'?R5J8U1!/98=&]`+"NX+"NX=&\]`/)9G8%:# M>R>/AQ.3B0R3B@N3B@N3B@N3B0N2B0N0AP^$>R-H8E!!/9(=&\X)"/`$!/@) M"/`:&=(Y-9Y:561O:$!L945237(P+:L7%=@,"^L1$.(F)+Q*17YK9$6`=QZ) M@`Z*@0N*@@J*@0J)@`N'?PV'?@V'?@V&?@V'?PN'?PN(?PJ'?PJ'?@J'?@J& M?@J&?0J&?0J%?0J%?0J%?`J$?`J$?`J$>PJ#>PJ#>PF#>@F">@F">@F">@F" M>0F!>0F!>0F!>`F`>`F`>`F`>`E_=PE_=PE_=PE^=@E^=@E^=@E]=0E]=0E] M=0E]=0E\=`E\=`E\=`E[<PE[<PE[<PEZ<PEZ<@EZ<@EY<@EY<0EY<0EX<0EX M<`EX<`EW<`EW<`EW;PEW;PEV;PEV;@AV;@AU;@AU;@AU;0AT;0AT;0AT;`AS M;`AS;`AS:PAR:PAR:PAR:PAR:@AQ:@AQ:@AQ:0AP:0AP:0AP:0AO:`AO:`AO M:`AN9PAN9PAN9PAM9@AM9@AM9@AL9@AL90AL90AL90AK9`AK9`AK9`AJ9`AJ M8PAJ8PAI8PAI8@AI8@=H8@=H80=H80=G80=G80=G8`=G8`=F8`=F7P=F7P=E M7P=E7P=E7@=D7@=D7@=D70=C70=C70=C7`=B7`=B7`=B7`=A6P=A6P=A6P=A M6@=@6@=@6@=@6@=?60=?60=?60=>6`=>6`=>6`==5P==5P==5P=<5P=<5@=< M5@=<5@9;509;509;509:509:5`9:5`995`994P994P984P984@984@974@97 M4@974096409640964`964`954`954`953P943P943P943@933@933@933092 M3092309230913`8``,"S#K^S#K^S#K^R#KZR#KZR#KZR#KVQ#KVQ#KVQ#KRP M#KRP#KRP#KNP#KNO#KNO#KJO#KJN#KJN#KJN#KFM#KFM#KFM#KBM#KBL#KBL M#;>L#;>K#;>K#;:K#;:K#;:J#;6J#;6J#;6I#;6I#;2I#;2H#;2H#;.H#;.H M#;.G#;*G#;*G#;*F#;&F#;&F#;&F#;"E#;"E#;"E#:^D#:^D#:^D#:^C#:ZC M#:ZC#:ZC#:VB#:VB#:VB#:RA#:RA#:RA#:NA#:N@#:N@#:J@#*J?#*J?#*J? M#*F>#*F>#*F>#*B>#*B=#*B=#*>=#*><#*><#*:<#*:<#*:;#*6;#*6;#*6: M#*2:#*2:#*29#*29#*.9#*.9#*.8#**8#*&7#IJ0%XF!,&UF6TM&CBLHOA43 MX`H)\`L+[AD7V3,PL590>W1M3(N"*IB.%IR2#9V3"YV3"YR2"YJ0#I.*&']W M-UI4<2\LM!,2X0T,ZQX<T$$]F&IC5HF`)96,$9>.#92*$HA_)6EC5CXZFQH8 MU0@'\PD)\!\=S$5!CFUG3(A_()&($)2+"Y2*"Y2*"Y.*"Y.*"Y.)"Y"'#H9^ M'VUE240_C1\=R@H*[@4%]@X-YR4CP$="AF=@3W)K.V-<54,_BR,AP@X.Y@D) M[Q03W"XKKU%,<7%I.H-[&8F`#8J!"XN""HF!#(9]$8)Z%WYV'GQT(7]V'(-Z M%85]#X=_"XA_"H=_"H=^"H=^"H9^"H9]"H9]"H5]"H5]"H5\"H1\"H1\"H1[ M"H-["H-["8-["8-Z"8)Z"8%Z"H%Y"H!Y"H!Y"H%X"8!X"8!X"8!X"7]W"7]W M"7]W"7YV"7YV"7YV"7YV"7UU"7UU"7UU"7QT"7QT"7QT"7MS"7MS"7MS"7IS M"7IR"7IR"7ER"7EQ"7EQ"7AQ"7AQ"7AP"7AP"7=P"7=O"7=O"79O"79N"'9N M"'5N"'5N"'5M"'1M"'1M"'1L"'-L"'-L"'-L"'-K"')K"')K"')J"'%J"'%J M"'%I"'!I"'!I"'!I"&]H"&]H"&]H"&YG"&YG"&YG"&UG"&UF"&UF"&UF"&QE M"&QE"&QE"&MD"&MD"&MD"&ID"&IC"&IC"&EC"&EB"&EB!VAB!VAB!VAA!VAA M!V=A!V=@!V=@!V9@!V9?!V9?!V5?!V5?!V5>!V1>!V1>!V1=!V-=!V-=!V-= M!V)<!V)<!V)<!V);!V%;!V%;!V%:!V!:!V!:!V!:!U]9!U]9!U]9!UY8!UY8 M!UY8!UU8!UU7!UU7!UU7!UQ6!UQ6!UQ6!EM5!EM5!EM5!EI5!EI4!EI4!EE4 M!EE3!EE3!EA3!EA3!EA2!E=2!E=2!E=1!E=1!E91!E90!E90!E50!E50!E5/ M!E1/!E1/!E1.!E-.!E-.!E--!E)-!E)-!E)-!@``P+0.P+,.O[,.O[,.O[,. MOK(.OK(.OK(.O;$.O;$.O;$.O+`.O+`.O+`.N[`.NZ\.NZ\.NZ\.NJX.NJX. MNJX.N:X.N:T.N:T.N*T.N*P.N*P-MZP-MZL-MZL-MJL-MJL-MJH-M:H-M:H- MM:D-M:D-M*D-M*@-M*@-LZ@-LZ@-LZ<-LJ<-LJ<-LJ8-L:8-L:8-L:8-L*4- ML*4-L*4-L*0-KZ0-KZ0-KZ,-KJ,-KJ,-KJ,-K:(-K:(-K:(-K*$-K*$-K*$- MJZ$-JZ`-JZ`-JJ`,JI\,JI\,JI\,J9X,J9X,J9X,J)X,J)T,J)T,IYT,IYP, MIYP,IIP,IIP,IIL,I9L,I9L,I9H,I9H,I)H,I)D,I)D,HYD,HYD,HY@,H)8/ MEXT=@'<_6E1X-C.M&QG6#@[I#0SL%Q;<+BNX3TJ&<6I2BH`LEXT7G9,.G9,- MG9,+G9,+G9,+FI`.DXD9?W<Y6%-T+RRU$Q+A#`OL'!O20CZ7:V16B'\GE8L2 MF(X-E(L2AWXG:F-6/SR9'!K2"0GP"PKN'QW-1#^1;&9.AGXCD8@1DXH,E(L+ ME(H+E(H+DXH+DXH+D(80A'PB:F-.03R3'!K0"@GO!P;T%13<,B^J55!N;FA" M;VA!65-G-3*D&!;6"@GN"PKL'!K/.S>87UE:>7(KAWX3BX(+BX,*BH$+AWX1 M?G8@<6HV9%U.7EE79E])<6HT?',B@GH5AGX-AW\+AW\*AWX*AWX*AGX*AGX* MAGT*A7T*A7T*A7P*A'P*A'P*A'L*A'L*@WL*@GL*@GD+?G<0?782?G41?G<. M@'@+@7D)@'@)@'@)@'@)?W<)?W<)?W<)?G8)?G8)?G8)?G8)?74)?74)?74) M?'0)?'0)?'0)>W0)>W,)>W,)>G,)>G()>G()>7()>7$)>7$)>7$)>'$)>'`) M>'`)=W`)=V\)=V\)=F\)=F\)=FX(=6X(=6X(=6T(=&T(=&T(=&P(<VP(<VP( M<VP(<VL(<FL(<FL(<FH(<6H(<6H(<6H(<&D(<&D(<&D(;V@(;V@(;V@(;F<( M;F<(;F<(;F<(;68(;68(;68(;&4(;&4(;&4(:V0(:V0(:V0(:F0(:F,(:F,( M:6,(:6((:6(':&(':&(':&$':&$'9V$'9V`'9V`'9F`'9E\'9E\'95\'95\' M95X'9%X'9%X'9%T'8UT'8UT'8UT'8UP'8EP'8EP'8EL'85L'85L'85H'8%H' M8%H'8%H'7UD'7UD'7UD'7E@'7E@'7E@'75@'75<'75<'75<'7%8'7%8'7%8& M6U4&6U4&6U4&6E4&6E0&6E0&650&65,&65,&6%,&6%,&6%(&6%(&5U(&5U$& M5U$&5E$&5E`&5E`&55`&55`&54\&5$\&5$\&5$X&4TX&4TX&4TX&4DT&4DT& M``#`M`[`M`[`LPZ_LPZ_LPZ_LPZ^L@Z^L@Z^L@Z]L0Z]L0Z]L0Z\L`Z\L`Z\ ML`Z\L`Z[KPZ[KPZ[KPZZK@ZZK@ZZK@ZYK@ZYK0ZYK0ZXK0ZXK`ZXK`VWK`VW MJPVWJPVVJPVVJPVVJ@VVJ@VUJ@VUJ0VUJ0VTJ0VTJ0VTJ`VSJ`VSJ`VSIPVR MIPVRIPVRI@VQI@VQI@VQI@VQI0VPI0VPI0VPI`VOI`VOI`VOI`VNHPVNHPVN MHPVMH@VMH@VMH@VLH0VLH0VLH0VKH0VKH`VKH`VKH`RJGPRJGPRJGPRIGPRI MG@RIG@RHG@RHG0RHG0RGG0RGG`RGG`RFG`RFG`RFFPRFFPREFPREF@REF@RD MF@RDF@RDF0RCF0RCF0RBEPZ8CAN`>#];578X-:HB(,P8%]L<&M4N*[E,1XQN M9EB(?R^6C1F=DP^>E`R>E`R>E`R=DPN=DPN;D0Z2B!MZ<T!43GPK*;L1$.0, M"^P>',]"/I9L956(@">5C!*8C@V6C!"*@B)M9E!$/Y(?'<T)"?`)"/$:&=0] M.9QE7EN!>2R/AQ64B@V4B@R4BPN4BPN4B@N2B0V-A!9]=2]?66`Y-:`9%]8) M"?`*"NX>',P_.Y1B7%AX<#-K8TE,1WTH);L/#N8'!_,.#N8G);Q*17YL94." M>AV*@0Z,@PJ,@PJ*@@R$>Q9R:S554&@Z-I@R+Z8^.I%02W!F7TAX<"B">A6& M?@V(?PJ'?PJ'?@J'?@J&?@J&?@J&?0J%?0J%?0J%?`J%?`J$?`J$>PJ#>PN! M>@U\=19U;2-Q:BIR:RAW;QU\=!-_>`R`>0J`>`F`>`F`>`E_=PE_=PE_=PE_ M=@E^=@E^=@E^=@E]=0E]=0E]=0E\=`E\=`E\=`E[=`E[<PE[<PEZ<PEZ<@EZ M<@EZ<@EY<0EY<0EY<0EX<0EX<`EX<`EW<`EW;PEW;PEV;PEV;PEV;@AU;@AU M;@AU;0AT;0AT;0AT;`AT;`AS;`AS;`AS:PAR:PAR:PAR:@AQ:@AQ:@AQ:@AP M:0AP:0AP:0AO:`AO:`AO:`AO9PAN9PAN9PAN9PAM9@AM9@AM9@AL90AL90AL M90AK90AK9`AK9`AJ9`AJ8PAJ8PAI8PAI8@AI8@AI8@=H8@=H80=H80=G80=G M8`=G8`=F8`=F8`=F7P=E7P=E7P=E7@=D7@=D7@=D70=D70=C70=C70=C7`=B M7`=B7`=B6P=A6P=A6P=A6P=@6@=@6@=@6@=?60=?60=?60=>6`=>6`=>6`=> M6`==5P==5P==5P=<5@=<5@=<5@9;5@9;509;509:509:5`9:5`995`994P99 M4P994P984P984@984@974@9740974096409640964`954`954`953P943P94 M3P943@933@933@933@93308``,&T#L"T#L"T#L"S#K^S#K^S#K^S#KZR#KZR M#KZR#KVQ#KVQ#KVQ#KRQ#KRP#KRP#KRP#KNO#KNO#KNO#KJN#KJN#KJN#KFN M#KFM#KFM#KBM#KBL#KBL#;>L#;>L#;>K#;>K#;:K#;:J#;:J#;6J#;6I#;6I M#;2I#;2I#;2H#;.H#;.H#;.G#;*G#;*G#;*G#;&F#;&F#;&F#;&E#;"E#;"E M#;"D#:^D#:^D#:^D#:ZC#:ZC#:ZC#:VB#:VB#:VB#:RB#:RA#:RA#:RA#:N@ M#:N@#:N@#*J?#*J?#*J?#*F?#*F>#*F>#*B>#*B=#*B=#*>=#*>=#*><#*:< M#*:<#*:;#*:;#*6;#*6:#*6:#*2:#*2:#*29#*.9#**8#IV2%HN#+G%J55-. M@C\[H#0QL#DVJ$Y(BFQE6X=^,I>-&9V3$)Z4#9^5#)Z4#)Z4#)Z4#)V3"YN1 M#Y*)''IS05!+@B<EP@\.YPL*[AX<T$5!DFYG48J!)9:-$9B/#)>-#XR#'W)L M1TM&AB4CQ`X-Z0@'\Q02WR\LLE50=75M08J`'Y&($I2*#92*#).*#9*)#H^& M$X5\(W!I15!*>RTJM!,2W@L*[1,2WRLIMDY)?&MD2G-L.U]973XYEAT;S0L* M[0H)[Q84VC,PIUE397=O,(A_$XR#"XR#"HR#"HJ!#G]X'V9?2S\[D2`>QQ84 MV1T;S"\LJTQ(=VIC0G]W&X9^#8A_"HA_"H=_"H=^"H=^"H9^"H9^"H9]"H5] M"H5]"H5\"H5\"H1\"H-\"W]W$W-L*6)<2%=17%A36&-=1&]G+7AP&GUV$(!Y M"H!X"8!X"8!X"8!W"7]W"7]W"7]W"7YV"7YV"7YV"7UU"7UU"7UU"7QT"7QT M"7QT"7MT"7MS"7MS"7IS"7IR"7IR"7IR"7ER"7EQ"7EQ"7AQ"7AP"7AP"7=P M"7=O"7=O"79O"79O"79N"'5N"'5N"'5M"'5M"'1M"'1M"'1L"'-L"'-L"'-K M"')K"')K"')J"'%J"'%J"'%J"'!I"'!I"'!I"&]H"&]H"&]H"&]H"&YG"&YG M"&YG"&UF"&UF"&UF"&QE"&QE"&QE"&ME"&MD"&MD"&ID"&IC"&IC"&IC"&EC M"&EB"&EB!VAB!VAA!VAA!V=A!V=@!V=@!V9@!V9@!V9?!V5?!V5?!V5>!V1> M!V1>!V1>!V1=!V-=!V-=!V-<!V)<!V)<!V);!V%;!V%;!V%;!V!:!V!:!V!: M!U]9!U]9!U]9!U]9!UY8!UY8!UY8!UU7!UU7!UU7!UQ6!UQ6!UQ6!UM6!EM5 M!EM5!EI5!EI4!EI4!EE4!EE4!EE3!EE3!EA3!EA2!EA2!E=2!E=1!E=1!E91 M!E91!E90!E50!E50!E5/!E1/!E1/!E1/!E1.!E-.!E-.!@``P;4.P;0.P+0. MP+0.P+0.O[,.O[,.O[,.OK(.OK(.OK(.O;$.O;$.O;$.O;$.O+`.O+`.O+`. MNZ\.NZ\.NZ\.NJ\.NJX.NJX.N:X.N:T.N:T.N*T.N*P.N*P-N*P-MZP-MZL- MMZL-MJL-MJH-MJH-M:H-M:H-M:D-M*D-M*D-M*@-LZ@-LZ@-LZ<-LJ<-LJ<- MLJ<-LJ8-L:8-L:8-L:4-L*4-L*4-L*0-KZ0-KZ0-KZ0-KJ,-KJ,-KJ,-K:(- MK:(-K:(-K:(-K*$-K*$-K*$-JZ`-JZ`-JZ`,JI\,JI\,JI\,J9\,J9X,J9X, MJ)X,J)T,J)T,IYT,IYT,IYP,IYP,IIP,IIL,IIL,I9L,I9H,I9H,I)H,I)H, MI)D,HI@-H)81F(X<BH$P>'%+:&)C8%EO8UUI<VQ2AGTUEHT;G9,1GY0-GY4, MGY4,GY4,GI0,GI0,GI0,G)(-DXH:>G)"4$N#)2/%#0WJ#`OM(![-1T*0<6I- MC(,AEXT0F8\,F(\-DH@6?'0Y5E%T+BNU$1#D!P;T#`OL(![+0#R88%IC>7$Z MAWXCC808CX85CX85C806AWXA=FX]6U5I.C>>'AS-#0SI#`OK&QK1.3:>7%9E M<FM`;V=$4TYR,"VM%1/;"@GO#@WG(B#%0CZ-95]0?W<DBH$0C(,+C80*BX,, MAGT5=FXP6%)E,"VJ$A'?"`CQ#@WG(A_#1#^':F1!@'@9B'\,B(`*B'\*B'\* MAG\+AGX,AGT,A'T-A7X+AGT*AGT*A7T*A7P*A7P*@WL,?7479V!`2$1X-3*< M-3*;0S^!5E%<:F0V=W`;?G<.@7D)@7@)@'@)@'@)@'<)?W<)?W<)?W<)?G8) M?G8)?G8)?74)?74)?74)?'4)?'0)?'0)>W0)>W,)>W,)>W,)>G()>G()>G() M>7()>7$)>7$)>'$)>'`)>'`)=W`)=W`)=V\)=F\)=F\)=FX(=FX(=6X(=6T( M=6T(=&T(=&T(=&P(<VP(<VP(<VL(<FL(<FL(<FL(<6H(<6H(<6H(<&D(<&D( M<&D(<&@(;V@(;V@(;V@(;F<(;F<(;F<(;68(;68(;68(;&8(;&4(;&4(:V4( M:V0(:V0(:V0(:F,(:F,(:F,(:6,(:6((:6(':&(':&$':&$'9V$'9V`'9V`' M9F`'9F`'9E\'95\'95\'95X'95X'9%X'9%X'9%T'8UT'8UT'8UP'8EP'8EP' M8EL'85L'85L'85L'8%H'8%H'8%H'8%D'7UD'7UD'7UD'7E@'7E@'7E@'75<' M75<'75<'7%8'7%8'7%8'6U8&6U4&6U4&6E4&6E0&6E0&6E0&650&65,&65,& M6%,&6%(&6%(&5U(&5U$&5U$&5E$&5E$&5E`&55`&55`&54\&54\&5$\&5$\& M5$X&4TX&``#!M0[!M0[!M`[`M`[`M`[`M`Z_LPZ_LPZ_LPZ^L@Z^L@Z^L@Z^ ML0Z]L0Z]L0Z]L0Z\L`Z\L`Z\L`Z[KPZ[KPZ[KPZZKPZZK@ZZK@ZYK@ZYK0ZY MK0ZXK0ZXK`ZXK`ZXK`VWK`VWJPVWJPVVJPVVJ@VVJ@VUJ@VUJ@VUJ0VTJ0VT MJ0VTJ`VSJ`VSJ`VSIPVSIPVRIPVRIPVRI@VQI@VQI@VQI0VPI0VPI0VPI0VO MI`VOI`VOI`VNHPVNHPVNHPVMH@VMH@VMH@VMH@VLH0VLH0VLH0VKH`VKH`VK MH`RJH`RJGPRJGPRIGPRIG@RIG@RHG@RHG0RHG0RHG0RGG0RGG`RGG`RFG`RF MFPRFFPREFPREFPREF@RDF@RDF@RDF0RBF`Z@EA&<D1:2B22*@3"%?3B'?C6/ MABB7CAN>DQ&?E0V@E@R@E@R?E0R?E0R?E0R>E`R>E`R<D@^3B1MZ<D)02X,F M),0-#>H*"N\>'-!'0X]R:TN.A1^8CP^:D`N9CPR5C!*&?BEG8%H_.YL=&]$+ M"NX'!_02$>(G),!#/I->6&9Q:4=[<S=_=R^`>"U^=C!R:T);5FD_.Y<D(L01 M$.,)"?`0#^0F)+](1(9H85%R:S]D7E=%0(LD(<(/#N8*">\5$]LN*[!13'1Q M:CR%?!J,@PZ,@PN,@PN*@0^`>1]I8T='0H,C(,(+"^L&!O0/#N4I)K=.275Q M:3>#>Q6(?PR)@`J(@`J'?PN&?0Z`>19]=AQ\=!V!>!:#?`^%?0N%?0N%?0J% M?0J#>PUW;R-95%HR+J,9%]$7%M0C(;T\.(Y;55-T;21]=A"`>0J!>0F!>`F` M>`F`>`F`=PE_=PE_=PE_=PE^=@E^=@E^=@E]=0E]=0E]=0E\=0E\=`E\=`E\ M=`E[<PE[<PE[<PEZ<@EZ<@EZ<@EY<@EY<0EY<0EX<0EX<`EX<`EW<`EW<`EW M;PEV;PEV;PEV;@AV;@AU;@AU;0AU;0AT;0AT;0AT;`AS;`AS;`AS:PAR:PAR M:PAR:PAQ:@AQ:@AQ:@AQ:0AP:0AP:0AP:`AO:`AO:`AO:`AN9PAN9PAN9PAM M9@AM9@AM9@AL9@AL90AL90AK90AK9`AK9`AK9`AJ8PAJ8PAJ8PAI8PAI8@AI M8@=H8@=H80=H80=G80=G80=G8`=F8`=F8`=F7P=F7P=E7P=E7@=E7@=D7@=D M7@=D70=C70=C70=C7`=B7`=B7`=B7`=A6P=A6P=A6P=@6@=@6@=@6@=@60=? M60=?60=?60=>6`=>6`=>6`==5P==5P==5P=<5P=<5@=<5@=;5@9;509;509; M509:5`9:5`9:5`995`994P994P984P984@984@974@974@97409640964096 M4`954`954`953P953P943P943P943@8``,*U#L&U#L&U#L&T#L"T#L"T#L"T M#K^S#K^S#K^S#K^R#KZR#KZR#KZR#KVQ#KVQ#KVQ#KRP#KRP#KRP#KNO#KNO M#KNO#KJO#KJN#KJN#KFN#KFM#KFM#KFM#KBM#KBL#KBL#;>L#;>K#;>K#;:K M#;:J#;:J#;6J#;6J#;6I#;2I#;2I#;2H#;2H#;.H#;.H#;.G#;*G#;*G#;*F M#;&F#;&F#;&E#;"E#;"E#;"E#:^D#:^D#:^D#:ZC#:ZC#:ZC#:ZC#:VB#:VB M#:VB#:RA#:RA#:RA#:N@#:N@#:N@#:J@#*J?#*J?#*F?#*F>#*F>#*F>#*B> M#*B=#*B=#*>=#*><#*><#*:<#*:;#*:;#*6;#*6;#*6:#*2:#*2:#*29#**8 M#:*8#I^5$IR1%IJ0&)J1%YZ3$Y^5#Z"6#:&6#*"6#*"6#*"6#)^5#)^5#)^5 M#)Z4#)R2$)*('WAQ1D]*A28DQ`X-Z0P+[!\=SD9!DG!I3HV$(9B.$)F0#)J0 M"YB.#XZ&''AP0%1/>2TJMQ43W@D(\0H)\!,2X"8CPCLWGTQ(@UE3;F!98V%; M8%Q7:$]*?3DVH",AQA$0XP@(\@@(\A43W3,OJU91;W%J0G)J05E3:C4RI1@6 MUPH*[@L+[!T<S3TYEV!:6WQT*XB`%(V$#(Z%"HR##(A_$WIR+%Q67S8RH1<5 MV`<&\P<'\Q85V#<SGEU76WEQ*(9]$8B`"XF`"HF`"H9^#8!X&')K,65>26-= M2VUE.GAP)8!X%H-[#X5]"X1]"X!X%&YF-4A$>"$?P@H)[0@'\1$0WRXKJ%1. M87)K*'YW$(%Y"H%Y"8%Y"8%X"8!X"8!X"8!X"7]W"7]W"7]W"7YV"7YV"7YV M"7UU"7UU"7UU"7UU"7QT"7QT"7QT"7MS"7MS"7MS"7IS"7IR"7IR"7ER"7EQ M"7EQ"7AQ"7AP"7AP"7=P"7=P"7=O"7=O"79O"79N"'9N"'5N"'5N"'5M"'1M M"'1M"'1L"'-L"'-L"'-K"')K"')K"')K"')J"'%J"'%J"'%I"'!I"'!I"'!I M"&]H"&]H"&]H"&YG"&YG"&YG"&UF"&UF"&UF"&QF"&QE"&QE"&QE"&MD"&MD M"&MD"&ID"&IC"&IC"&EC"&EB"&EB!VAB!VAA!VAA!V=A!V=A!V=@!V=@!V9@ M!V9?!V9?!V5?!V5?!V5>!V1>!V1>!V1=!V-=!V-=!V-<!V)<!V)<!V)<!V%; M!V%;!V%;!V%:!V!:!V!:!V!:!U]9!U]9!U]9!UY8!UY8!UY8!UU7!UU7!UU7 M!UQ7!UQ6!UQ6!UQ6!EM5!EM5!EM5!EI5!EI4!EI4!EE4!EE3!EE3!EA3!EA2 M!EA2!E=2!E=2!E=1!E91!E91!E90!E90!E50!E50!E5/!E1/!E1/!@``PK8. MPK4.P;4.P;4.P;4.P+0.P+0.P+0.O[,.O[,.O[,.O[(.OK(.OK(.OK(.O;$. MO;$.O;$.O+`.O+`.O+`.N[`.NZ\.NZ\.NJ\.NJX.NJX.NJX.N:T.N:T.N:T. MN*T.N*P.N*P-MZP-MZL-MZL-MJL-MJL-MJH-M:H-M:H-M:D-M*D-M*D-M*@- MM*@-LZ@-LZ@-LZ<-LJ<-LJ<-LJ8-L:8-L:8-L:8-L*4-L*4-L*4-KZ0-KZ0- MKZ0-KZ,-KJ,-KJ,-KJ,-K:(-K:(-K:(-K*$-K*$-K*$-JZ`-JZ`-JZ`-JJ`, MJI\,JI\,J9\,J9X,J9X,J9X,J)X,J)T,J)T,IYT,IYP,IYP,IIP,IIL,IIL, MI9L,I9L,I9H,I)H,I)H,I)D,I)D,HI@-HI@.HI<.H9<.H9<-HI<,H9<,H9<, MH98,H)8,H)8,H)8,GY4,GY4,GY4,G)(0D8@@=F])34B))"+'#0SK"@KO'QW. M1D&2<&E0C(,BF(X0FI`,FI$+F8\-E(H5A7TK:V15242+*2>]%!/>"POM"POM M$1#C&QG4*":^,2ZO-S2E-S2E,S"K*"6^&QK2#0WI!@;T!`3X"PKM'QW+03V3 M9%U9=F\Z:V1,3$:!*"6\#P[F"`?R$`_D*":[3$=];F=#A'L=C80.CH4*CH4* MC(,-A7T9<&D\34AX*"6Z#P[E!@;T#`OJ(B##1T*":F-$?W@=B'\.B8`+B8$* MB(`+A7P2=6XM651?03V*/3F1241[7%98;V<V>W0=@WH0A'L.>G(?7UI/.#67 M%A37!@7T!@;S%!+:,2ZB5U);=6TD?W</@7H*@GD)@7D)@7D)@7@)@'@)@'@) M@'@)?W<)?W<)?W<)?G8)?G8)?G8)?78)?74)?74)?74)?'0)?'0)?'0)>W,) M>W,)>W,)>G,)>G()>G()>7()>7$)>7$)>'$)>'$)>'`)>'`)=W`)=V\)=V\) M=F\)=FX(=FX(=6X(=6X(=6T(=&T(=&T(=&P(<VP(<VP(<VP(<FL(<FL(<FL( M<FH(<6H(<6H(<6D(<&D(<&D(<&D(;V@(;V@(;V@(;F<(;F<(;F<(;6<(;68( M;68(;68(;&4(;&4(;&4(:V0(:V0(:V0(:F0(:F,(:F,(:6,(:6((:6(':&(' M:&(':&$'9V$'9V$'9V`'9V`'9F`'9E\'9E\'95\'95\'95X'9%X'9%X'9%T' M8UT'8UT'8UP'8EP'8EP'8EP'8EL'85L'85L'85H'8%H'8%H'8%H'7UD'7UD' M7UD'7E@'7E@'7E@'75<'75<'75<'7%<'7%8'7%8'7%8&6U4&6U4&6U4&6E4& M6E0&6E0&650&65,&65,&6%,&6%(&6%(&5U(&5U(&5U$&5U$&5E$&5E`&5E`& M55`&55`&54\&5$\&``#"M@["M@["M0[!M0[!M0[!M0[`M`[`M`[`M`[`LPZ_ MLPZ_LPZ_L@Z^L@Z^L@Z^L@Z]L0Z]L0Z]L0Z\L`Z\L`Z\L`Z[L`Z[KPZ[KPZ[ MKPZZK@ZZK@ZZK@ZYK0ZYK0ZYK0ZXK0ZXK`ZXK`VWK`VWJPVWJPVVJPVVJPVV MJ@VUJ@VUJ@VUJ0VUJ0VTJ0VTJ`VTJ`VSJ`VSJ`VSIPVRIPVRIPVRI@VQI@VQ MI@VQI@VPI0VPI0VPI0VPI`VOI`VOI`VOHPVNHPVNHPVNHPVMH@VMH@VMH@VL MH0VLH0VLH0VKH0VKH`VKH`VJH`RJGPRJGPRJGPRIG@RIG@RIG@RHG@RHG0RH MG0RGG0RGG`RGG`RFG`RFG`RFFPREFPREFPREF@REF@RDF@RDF0RDF0RCF0RC MF0RCF`RBF`RBF`RBEPRAEPRAEPRAEPR@E@R@E@R@E@R?E0R?E0R=DP^1AR%U M;DM,1XLE(L<.#>D,#.P@'LU'0I!R:DV-A"*8CQ":D`R;D0N9D`R8C@^0AQJ! M>#-E7UU&09`L*;D:&-80#^4,"^P,"^P1$.,6%-P8%]@6%=L4$]X.#>@+"NX$ M!/@#`_H&!?43$>`L*;=02WIN9TAU;3UB7%L].9D=&\\*">\(!_(6%-LU,:9; M561Z<B^)@12.A0N/A@J.A`N+@@^`>")F7T\^.I(<&L\("/$%!?82$=\P+:I8 M4V-W<"V&?12)@0R*@0J*@0J(@`R`=QIG8$="/HDC(<$:&-`B'\(V,YU53V5R M:R^!>12`>15R:B]13&HI)[,.#>4$!/<)">X>&\@_.XIB7$AX<!Z`>`Z!>@J" M>@F">0F!>0F!>0F!>0F`>`F`>`F`>`E_=PE_=PE_=PE^=@E^=@E^=@E^=@E] M=0E]=0E]=0E\=`E\=`E\=`E[<PE[<PE[<PEZ<PEZ<@EZ<@EY<@EY<0EY<0EY M<0EX<0EX<`EX<`EW<`EW;PEW;PEV;PEV;@AV;@AU;@AU;@AU;0AT;0AT;0AT M;`AS;`AS;`AS;`AS:PAR:PAR:PAR:@AQ:@AQ:@AQ:0AP:0AP:0AP:0AO:`AO M:`AO:`AN9PAN9PAN9PAN9PAM9@AM9@AM9@AL90AL90AL90AK9`AK9`AK9`AJ M9`AJ8PAJ8PAI8PAI8@AI8@=H8@=H8@=H80=H80=G80=G8`=G8`=F8`=F7P=F M7P=E7P=E7P=E7@=D7@=D7@=D70=C70=C70=C70=C7`=B7`=B7`=B6P=A6P=A M6P=A6@=@6@=@6@=@6@=?60=?60=?60=>6`=>6`=>6`==6`==5P==5P==5P=< M5@=<5@=<5@9;509;509;509:509:5`9:5`995`994P994P984P984P984@98 M4@974@974097409640964`964`954`954`953P8``,.V#L*V#L*V#L*U#L&U M#L&U#L&U#L&T#L"T#L"T#L"S#K^S#K^S#K^S#KZR#KZR#KZR#KVQ#KVQ#KVQ M#KRP#KRP#KRP#KNP#KNO#KNO#KNO#KJN#KJN#KJN#KFN#KFM#KFM#KBM#KBL M#KBL#;>L#;>K#;>K#;:K#;:K#;:J#;:J#;6J#;6I#;6I#;2I#;2I#;2H#;.H M#;.H#;.G#;*G#;*G#;*F#;&F#;&F#;&F#;"E#;"E#;"E#;"D#:^D#:^D#:^D M#:ZC#:ZC#:ZC#:VB#:VB#:VB#:RA#:RA#:RA#:NA#:N@#:N@#:N@#*J?#*J? M#*J?#*F?#*F>#*F>#*B>#*B=#*B=#*>=#*><#*><#*:<#*:<#*:;#*6;#*6; M#*6:#*6:#*2:#*2:#*29#*.9#*.9#*.8#**8#**8#**7#*&7#*&7#*&7#*"6 M#*"6#*"6#*"5#)V3#Y2+''IS1%%+@RLHO103X1`/YB,AR$M&BW1L2H^%()F/ M$)J1#)N1"YN1"YF0#):-$8^%'7]W-F5?74Q'A38RJ2,AQQ<5VP\.YPX-Z`\. MYP\.Y@\.YPT,Z@L*[@<']`,#^@,#^@D)\!P:T3LWG5]88W1M/V]H1U1.<S`M ML!,2W@<'\PH*[A\=RT$]D6AA3X%Y(XV$$(Z%"X^&"HZ%#(F`%'AP,%=2:"\L MK1$0X@4%]@<&\QH9T3\[D6AB2(%Y'(F`#8N""HJ""HJ!"HA_#GMS)%I47R\L MJQ(1WP@(\0P+ZB$?PT=#?FQE.W]W&'QU'&5?1C\[C!L9S@@'\00$]Q`/XBLH MKT]);6UF-'QU%H%Z#(-Z"8)Z"8)Z"8)Y"8%Y"8%Y"8%Y"8!X"8!X"8!X"7]W M"7]W"7]W"7]V"7YV"7YV"7YV"7UU"7UU"7UU"7QT"7QT"7QT"7MT"7MS"7MS M"7IS"7IR"7IR"7ER"7EQ"7EQ"7EQ"7AQ"7AP"7AP"7=P"7=O"7=O"79O"79O M"79N"'5N"'5N"'5M"'1M"'1M"'1L"'1L"'-L"'-L"'-K"')K"')K"')J"'%J M"'%J"'%J"'!I"'!I"'!I"&]H"&]H"&]H"&YG"&YG"&YG"&YG"&UF"&UF"&UF M"&QE"&QE"&QE"&ME"&MD"&MD"&ID"&IC"&IC"&EC"&EB"&EB"&EB!VAB!VAA M!VAA!V=A!V=@!V=@!V9@!V9@!V9?!V5?!V5?!V5>!V1>!V1>!V1=!V-=!V-= M!V-=!V-<!V)<!V)<!V);!V%;!V%;!V%;!V!:!V!:!V!:!U]9!U]9!U]9!UY8 M!UY8!UY8!UY8!UU7!UU7!UU7!UQ6!UQ6!UQ6!EM6!EM5!EM5!EI5!EI4!EI4 M!EE4!EE3!EE3!EA3!EA3!EA2!EA2!E=2!E=1!E=1!E91!E91!E90!E50!E50 M!@``P[<.P[8.PK8.PK8.PK8.PK4.P;4.P;4.P;0.P+0.P+0.P+,.O[,.O[,. MO[,.OK(.OK(.OK(.O;$.O;$.O;$.O+$.O+`.O+`.O+`.NZ\.NZ\.NZ\.NJX. MNJX.NJX.N:X.N:T.N:T.N*T.N*P.N*P-MZP-MZP-MZL-MZL-MJL-MJH-MJH- MM:H-M:D-M:D-M*D-M*D-M*@-LZ@-LZ@-LZ<-LJ<-LJ<-LJ<-L:8-L:8-L:8- ML:4-L*4-L*4-L*0-KZ0-KZ0-KZ0-KJ,-KJ,-KJ,-K:(-K:(-K:(-K*(-K*$- MK*$-K*$-JZ`-JZ`-JZ`,JI\,JI\,JI\,J9\,J9X,J9X,J)X,J)T,J)T,IYT, MIYP,IYP,IIP,IIP,IIL,IIL,I9L,I9H,I9H,I)H,I)H,I)D,HYD,HYD,HY@, MHI@,HI@,HI<,H9<,H9<,H9<,H98,H)8,H)8,GY0.EHT9@GHX7UEM/SN?*"7" M(![-+"F[4$N#>'!$D(<>FI`/G)(+FY(+FY$+FY$+FI`,EHT1CX8<@'@T;6=1 M6%)S0S^4,S"M)R7`(B#('QW-'QW,'QW-'!O1%A7;#0SJ!07V!07V$`_E)R6_ M2D6%:F-1=FX]9V!51D&+(R'%#0SI!@7U#0SI)B2_3$=_<6I"AGT<CH4-D(<* MCX4+C(,/@WL>;69%1T.$(R##"PKL!`3W#`OJ)R6[3TEV=&PTAWX3BH(+BX(* MBX(*BX(*AGT2<FLT241]'QW'"0CP`P/Z"PKL(R'`3$=V<6HR@'<7>'`F6%-> M+"JN#P[D!`3W!@7T%Q75.#677%95=6XF?W<3@7H-@GL*@WH)@GH)@GH)@GD) M@7D)@7D)@7D)@'@)@'@)@'@)@'<)?W<)?W<)?W<)?G8)?G8)?G8)?74)?74) M?74)?'0)?'0)?'0)>W0)>W,)>W,)>G,)>G()>G()>G()>7()>7$)>7$)>'$) M>'`)>'`)=W`)=V\)=V\)=F\)=F\)=FX(=6X(=6X(=6T(=6T(=&T(=&T(=&P( M<VP(<VP(<VL(<FL(<FL(<FH(<6H(<6H(<6H(<&D(<&D(<&D(;V@(;V@(;V@( M;V@(;F<(;F<(;F<(;68(;68(;68(;&4(;&4(;&4(:V4(:V0(:V0(:F0(:F,( M:F,(:F,(:6,(:6((:6(':&(':&$':&$'9V$'9V`'9V`'9F`'9F`'9E\'95\' M95\'95X'9%X'9%X'9%X'9%T'8UT'8UT'8UP'8EP'8EP'8EL'85L'85L'85L' M8%H'8%H'8%H'7UD'7UD'7UD'7U@'7E@'7E@'7E@'75<'75<'75<'7%8'7%8' M7%8'6U8&6U4&6U4&6E4&6E0&6E0&650&65,&65,&65,&6%,&6%(&6%(&5U(& M5U$&5U$&5E$&5E$&5E`&55`&``##MP[#MP[#M@["M@["M@["M@["M0[!M0[! MM0[!M`[`M`[`M`[`LPZ_LPZ_LPZ_LPZ^L@Z^L@Z^L@Z]L0Z]L0Z]L0Z]L0Z\ ML`Z\L`Z\L`Z[KPZ[KPZ[KPZZK@ZZK@ZZK@ZYK@ZYK0ZYK0ZXK0ZXK`ZXK`VW MK`VWK`VWJPVWJPVVJPVVJ@VVJ@VUJ@VUJ0VUJ0VTJ0VTJ0VTJ`VSJ`VSJ`VS MIPVRIPVRIPVRIPVRI@VQI@VQI@VQI0VPI0VPI0VPI`VOI`VOI`VOI`VNHPVN MHPVNHPVMH@VMH@VMH@VLH@VLH0VLH0VLH0VKH`VKH`VKH`RJGPRJGPRJGPRI MGPRIG@RIG@RHG@RHG0RHG0RGG0RGG0RGG`RGG`RFG`RFFPRFFPREFPREF@RE MF@RDF@RDF@RDF0RCF0RCF0RCF`RBF`RBF`RBF`RAEPRAEPRAEPRAE@R@E@R? ME0Z<D1..A2=W<$E?66U*18X_.Y]$0)9?66Q_=SJ3BAJ:D0^;D0R<D@N<D@N; MD0N:D`R:D`V7C1"1B!F'?BIW<$%H85E:5&].28)&0HY"/I5"/I5!/98[-Z`L M*;<9&-8+"NT*">\7%MDU,:E84F]Q:D1S;$);5&HW,Z09%]8("/(%!/</#^4L M*;553W!Y<32*@A:0A@V0APJ/A@N*@11[<RU>6%\X-*`7%M<(!_('!_,7%M<W M-)]@6EE\=2:)@!"+@@N+@PJ+@@J)@`U^=B!B7%`W,YX3$MP%!?8$!/@2$=\Q M+J=;55QZ<B2`>19Q:C)*17D>'<<'!_(#`OH("/`?'<9$/X)D74=V;R1[=!I^ M=19^=A2`>0Z">0N!>@J!>@J">@F!>0F!>0F!>0F`>`F`>`F`>`F`=PE_=PE_ M=PE_=PE^=@E^=@E^=@E]=0E]=0E]=0E\=0E\=`E\=`E[=`E[<PE[<PE[<PEZ M<@EZ<@EZ<@EY<@EY<0EY<0EX<0EX<`EX<`EW<`EW;PEW;PEV;PEV;PEV;@AU M;@AU;@AU;0AU;0AT;0AT;0AT;`AS;`AS;`AS:PAR:PAR:PAR:@AQ:@AQ:@AQ M:@AP:0AP:0AP:0AP:`AO:`AO:`AO:`AN9PAN9PAN9PAM9@AM9@AM9@AL90AL M90AL90AK90AK9`AK9`AJ9`AJ8PAJ8PAJ8PAI8PAI8@AI8@=H8@=H80=H80=G M80=G8`=G8`=F8`=F8`=F7P=E7P=E7P=E7@=E7@=D7@=D7@=D70=C70=C70=C M7`=B7`=B7`=B6P=A6P=A6P=A6P=@6@=@6@=@6@=?60=?60=?60=?60=>6`=> M6`=>6`==5P==5P==5P=<5@=<5@=<5@=;5@9;509;509:509:5`9:5`9:5`99 M5`994P994P984P984@984@974@9740974096409640964`8``,2W#L.W#L.W M#L.V#L.V#L*V#L*V#L*U#L&U#L&U#L&T#L"T#L"T#L"T#K^S#K^S#K^S#KZR M#KZR#KZR#KZQ#KVQ#KVQ#KVQ#KRP#KRP#KRP#KNO#KNO#KNO#KJO#KJN#KJN M#KFN#KFM#KFM#KBM#KBL#KBL#KBL#;>L#;>K#;>K#;:K#;:J#;:J#;6J#;6J M#;6I#;2I#;2I#;2H#;.H#;.H#;.G#;.G#;*G#;*G#;*F#;&F#;&F#;&E#;"E M#;"E#;"E#:^D#:^D#:^D#:ZC#:ZC#:ZC#:VB#:VB#:VB#:VB#:RA#:RA#:RA M#:N@#:N@#:N@#*J@#*J?#*J?#*F?#*F>#*F>#*B>#*B=#*B=#*B=#*>=#*>< M#*><#*:<#*:;#*:;#*6;#*6;#*6:#*2:#*2:#*29#*.9#*.9#*.8#**8#**8 M#**8#**7#*&7#*&7#*&6#*"6#)Z4#YB.&(V$*(!X/'-L4&=A8&=A8'1M3(=_ M+)6,%YR2#9V3"YR2"YR2"YR2"YN1"YN1"YJ0#)B/#Y.*%HV$((-\+7QT.G1M M16UG4&MD5&IC5FAA6%Q7:D9!CBLHNA85VQ03WB(@R$1`D&AB57=O/&UF3$Q' M@B@EO1`/Y`4$]P0$^`\.YBTJLUA2;7EQ-(J"%H^&#I"&#(Z%#H9]&W%I/TU( M>R@ENP\.Y@8%]0L*[",APDE$@&]H/H5\&(J"#8R#"HR#"HN""X=^$G5M,5%+ M<2<DN@L+ZP,#^0@(\1T;RT(^B6EC0G]W&GQT(&-=2SDUF!,2W`0$]P("^PL* MZR,@P$5!@%U75&9?0VIC.VUG-'%I+G9N(WMS&']V$8!Y#(%Z"H)Z"8%Y"8%Y M"8%Y"8%X"8!X"8!X"8!W"7]W"7]W"7]W"7YV"7YV"7YV"7UU"7UU"7UU"7QU M"7QT"7QT"7QT"7MS"7MS"7MS"7IR"7IR"7IR"7ER"7EQ"7EQ"7AQ"7AP"7AP M"7=P"7=P"7=O"79O"79O"79N"'9N"'5N"'5M"'5M"'1M"'1M"'1L"'-L"'-L M"'-K"')K"')K"')K"'%J"'%J"'%J"'%I"'!I"'!I"'!H"&]H"&]H"&]H"&YG M"&YG"&YG"&UF"&UF"&UF"&QF"&QE"&QE"&ME"&MD"&MD"&MD"&IC"&IC"&IC M"&EC"&EB"&EB!VAB!VAA!VAA!V=A!V=A!V=@!V9@!V9@!V9?!V9?!V5?!V5> M!V5>!V1>!V1>!V1=!V-=!V-=!V-<!V)<!V)<!V)<!V%;!V%;!V%;!V!:!V!: M!V!:!V!9!U]9!U]9!U]9!UY8!UY8!UY8!UU7!UU7!UU7!UQ7!UQ6!UQ6!UM6 M!EM5!EM5!EM5!EI4!EI4!EI4!EE4!EE3!EE3!EA3!EA2!EA2!E=2!E=2!E=1 M!E91!E91!@``Q+@.Q+<.Q+<.P[<.P[<.P[8.PK8.PK8.PK4.P;4.P;4.P;0. MP+0.P+0.P+0.O[,.O[,.O[,.OK(.OK(.OK(.OK(.O;$.O;$.O;$.O+`.O+`. MO+`.NZ\.NZ\.NZ\.NJ\.NJX.NJX.N:X.N:T.N:T.N:T.N*T.N*P.N*P-MZP- MMZL-MZL-MJL-MJH-MJH-M:H-M:H-M:D-M*D-M*D-M*@-LZ@-LZ@-LZ@-LZ<- MLJ<-LJ<-LJ8-L:8-L:8-L:4-L*4-L*4-L*4-KZ0-KZ0-KZ0-KJ,-KJ,-KJ,- MKJ,-K:(-K:(-K:(-K*$-K*$-K*$-JZ`-JZ`-JZ`-JJ`,JI\,JI\,J9\,J9X, MJ9X,J)X,J)X,J)T,J)T,IYT,IYP,IYP,IIP,IIL,IIL,I9L,I9L,I9H,I)H, MI)H,I)D,HYD,HYD,HY@,HY@,HI@,HI@,HI<,H9<,H9<,H98,GY4-G900FI$5 ME(L<CH4FB8`NA7PSB8`LDH@?F(X3G)(-G9,+G9,+G)(+G)(+G)(+FY$+FY$+ MFI`,F(\.EHT1DXH6D(@9C(,@B8`DAW\FAWXGA'LL>'`^85MB1D*-,2ZP+"FX M.36B6%)P=&U!>G(X95Y:/3F;&QG3"0CQ`@+\`@+[#`OL)B/`44QX<VP_A7P@ MBX,5C802BX$6?G8I8EQ9/#B9&AG2"`CQ!07V$Q+>,BZI6E1C>W,JB8`1C(,+ MC80*C(,*BX(+A'L8:F-%0#R.&AC1!P?S!`3X#P[E*BBS4TYJ=&PP?W@9<VPO M4DUK*":V#`OI`P+Z`@+["PKL'1O)-3&?0S^#14&`241Y34AP5$]B7EA0:6([ M<VPH>W(8?W@.@7H*@GH)@GD)@7D)@7D)@7@)@'@)@'@)@'@)?W<)?W<)?W<) M?G8)?G8)?G8)?74)?74)?74)?'4)?'0)?'0)?'0)>W,)>W,)>W,)>G,)>G() M>G()>7()>7$)>7$)>'$)>'`)>'`)=W`)=W`)=V\)=V\)=F\)=FX(=FX(=6X( M=6X(=6T(=&T(=&T(=&P(<VP(<VP(<VL(<FL(<FL(<FL(<6H(<6H(<6H(<6D( M<&D(<&D(<&D(;V@(;V@(;V@(;F<(;F<(;F<(;68(;68(;68(;&8(;&4(;&4( M;&4(:V0(:V0(:V0(:F0(:F,(:F,(:6,(:6((:6(':&(':&$':&$'9V$'9V$' M9V`'9F`'9F`'9E\'9E\'95\'95\'95X'9%X'9%X'9%T'8UT'8UT'8UP'8EP' M8EP'8EP'85L'85L'85L'85H'8%H'8%H'8%H'7UD'7UD'7UD'7E@'7E@'7E@' M75<'75<'75<'7%<'7%8'7%8'6U8&6U4&6U4&6U4&6E0&6E0&6E0&650&65,& M65,&6%,&6%(&6%(&5U(&5U(&5U$&5E$&``#%N`[$N`[$MP[$MP[#MP[#MP[# MM@["M@["M@["M0[!M0[!M0[!M0[`M`[`M`[`M`Z_LPZ_LPZ_LPZ_L@Z^L@Z^ ML@Z^L@Z]L0Z]L0Z]L0Z\L`Z\L`Z\L`Z[KPZ[KPZ[KPZZKPZZK@ZZK@ZZK@ZY MK0ZYK0ZYK0ZXK0ZXK`ZXK`VWK`VWJPVWJPVVJPVVJ@VVJ@VUJ@VUJ@VUJ0VT MJ0VTJ0VTJ`VTJ`VSJ`VSJ`VSIPVRIPVRIPVRI@VQI@VQI@VQI0VPI0VPI0VP MI0VOI`VOI`VOI`VOHPVNHPVNHPVNHPVMH@VMH@VMH@VLH0VLH0VLH0VKH`VK MH`VKH`VJH`RJGPRJGPRIGPRIG@RIG@RIG@RHG@RHG0RHG0RGG0RGG`RGG`RF MG`RFFPRFFPREFPREFPREF@RDF@RDF@RDF0RDF0RCF0RCF0RCF`RBF`RBF`RB MEPRAEPRAEPRAE@R?E0V?E0Z=E!";D1*9CQ:6C1F6C!B9CQ2<D@^=DPV=DPN= MDPN=DPN<D@N<D@N<D@N;D0N;D0N;D0N9D`R9CPV8C@Z6C1"5C!&5BQ*5BQ*1 MB1:+@A]^=C5K9%-:5&Y237I95&YL94]]=3-W;SU:56PS+ZP4$]X&!O0"`OL" M`OL'!O0:&-0\.)M=5V1U;CQ_=BN">B1^=BMO9T1-27PI)KH/#N4$!/@&!O09 M&-1!/9!I8DJ#>QR,@PV-A`J-A`J-A`J*@0Y]=21;56`P+:H1$.`$!/<&!O08 M%M4\.)5C7DU]="!_=AQH8D1!/8L:&-`&!?0!`?T!`?T&!O,1$.`<&LPA'\(B M(,$D(KTI)K0P+:<Z-Y)*1'=:559K935Y<1Q_=Q"!>0N">@F">0F!>0F!>0F! M>`F`>`F`>`F`>`E_=PE_=PE_=PE^=@E^=@E^=@E]=@E]=0E]=0E]=0E\=`E\ M=`E\=`E[<PE[<PE[<PEZ<PEZ<@EZ<@EY<@EY<0EY<0EX<0EX<0EX<`EX<`EW M<`EW;PEW;PEV;PEV;@AV;@AU;@AU;@AU;0AT;0AT;0AT;`AS;`AS;`AS:PAR M:PAR:PAR:PAR:@AQ:@AQ:@AQ:0AP:0AP:0AP:0AO:`AO:`AO:`AN9PAN9PAN M9PAM9@AM9@AM9@AM9@AL90AL90AL90AK9`AK9`AK9`AJ9`AJ8PAJ8PAI8PAI M8@AI8@=H8@=H80=H80=G80=G80=G8`=G8`=F8`=F7P=F7P=E7P=E7P=E7@=D M7@=D7@=D70=C70=C70=C7`=B7`=B7`=B7`=B6P=A6P=A6P=A6@=@6@=@6@=@ M6@=?60=?60=?60=>6`=>6`=>6`==5P==5P==5P=<5P=<5@=<5@=<5@9;509; M509;509:509:5`9:5`995`994P994P984P984@984@974@974@97408``,6X M#L6X#L2X#L2W#L2W#L.W#L.W#L.V#L*V#L*V#L*U#L&U#L&U#L&U#L"T#L"T M#L"T#L"S#K^S#K^S#K^R#KZR#KZR#KZR#KVQ#KVQ#KVQ#KRP#KRP#KRP#KNP M#KNO#KNO#KJO#KJN#KJN#KJN#KFM#KFM#KFM#KBM#KBL#KBL#;>L#;>K#;>K M#;:K#;:K#;:J#;6J#;6J#;6I#;6I#;2I#;2H#;2H#;.H#;.H#;.G#;*G#;*G M#;*F#;&F#;&F#;&F#;"E#;"E#;"E#:^D#:^D#:^D#:^C#:ZC#:ZC#:ZC#:VB M#:VB#:VB#:RA#:RA#:RA#:NA#:N@#:N@#:J@#*J?#*J?#*J?#*F>#*F>#*F> M#*B>#*B=#*B=#*>=#*><#*><#*:<#*:<#*:;#*6;#*6;#*6:#*2:#*2:#*29 M#*29#*.9#*.9#*.8#**8#**8#**7#*&7#*&7#*&7#*"6#)^5#9^5#9Z4#9V3 M#YV3#YZ3#IV3#9Z4#)Z4#)V3"YV3"YV3"YR2"YR2"YR2"YN2"YN1"YN1"YJ1 M"YJ0"YJ0"YB/#)B.#)B.#)B.#):-#Y"&&(=^)WUV-7AP/GMR.8%Z+(1\*'=O M/5=2<#,PK!<5V@H*[@@(\@@'\P@'\PX.YR$?R#TYFE50<6)<6FEB3V1>5U1. M<C0QIQ<5V0<'\P("^P@'\B(@Q4]*>'9O,XF`$XV$"XZ%"HV$"HR#"XA_$W-K M-DI%?1\=R0D)[P("^PD)[R,APDU(=W-K,X%Y&'IR)5I47B\LJA$0X0,#^0`` M_P$!_0,#^0@'\0L*ZPP+Z0T,Z`X-YA`/XA,2W!D8T"<EMCLWD5%,9V9@0'9N M(GYV$H%Y"X)Z"8)Y"8%Y"8%Y"8%X"8!X"8!X"8!X"7]W"7]W"7]W"7YV"7YV M"7YV"7YV"7UU"7UU"7UU"7QT"7QT"7QT"7MS"7MS"7MS"7IS"7IR"7IR"7ER M"7EQ"7EQ"7AQ"7AQ"7AP"7AP"7=P"7=O"7=O"79O"79N"'9N"'5N"'5N"'5M M"'1M"'1M"'1L"'-L"'-L"'-L"'-K"')K"')K"')J"'%J"'%J"'%I"'!I"'!I M"'!I"&]H"&]H"&]H"&YG"&YG"&YG"&UG"&UF"&UF"&UF"&QE"&QE"&QE"&MD M"&MD"&MD"&ID"&IC"&IC"&EC"&EB"&EB!VAB!VAB!VAA!VAA!V=A!V=@!V=@ M!V9@!V9?!V9?!V5?!V5?!V5>!V1>!V1>!V1=!V-=!V-=!V-=!V)<!V)<!V)< M!V);!V%;!V%;!V%:!V!:!V!:!V!:!U]9!U]9!U]9!UY8!UY8!UY8!UU8!UU7 M!UU7!UU7!UQ6!UQ6!UQ6!EM5!EM5!EM5!EI5!EI4!EI4!EE4!EE3!EE3!EA3 M!EA3!EA2!E=2!E=2!@``Q;D/Q;@.Q;@.Q+@.Q+@.Q+<.P[<.P[<.P[8.PK8. MPK8.PK4.P;4.P;4.P;4.P;0.P+0.P+0.P+,.O[,.O[,.O[,.OK(.OK(.OK(. MO;$.O;$.O;$.O+`.O+`.O+`.N[`.NZ\.NZ\.NZ\.NJX.NJX.NJX.N:X.N:T. MN:T.N*T.N*P.N*P-MZP-MZL-MZL-MJL-MJL-MJH-MJH-M:H-M:D-M:D-M*D- MM*D-M*@-LZ@-LZ@-LZ<-LJ<-LJ<-LJ8-L:8-L:8-L:8-L*4-L*4-L*4-L*0- MKZ0-KZ0-KZ0-KJ,-KJ,-KJ,-K:(-K:(-K:(-K*$-K*$-K*$-JZ$-JZ`-JZ`- MJZ`,JI\,JI\,JI\,J9\,J9X,J9X,J)X,J)T,J)T,IYT,IYP,IYP,IIP,IIP, MIIL,I9L,I9L,I9H,I9H,I)H,I)D,I)D,HYD,HYD,HY@,HI@,HI@,HI<,H9<, MH9<,H9<,H)8,H)8,H)8,H)4,GY4,GY4,GY0,GI0,GI0,GI0,G9,+G9,+G9,+ MG)(+G)(+G)(+FY(+FY$+FY$+FI$+FI`+FI`+FI`+F8\+F8\+F(X,EHT.E(H2 MD8@6CH89CX48D(86C(0;?G8R8EQ?0CZ3*2:\'1O0&1?6%A7;#P[F"@KN$`_D M'QW+,"VP/#B;03V2/CJ7,2ZM'1O."@KN`P/Z`0']"@GO)B2^5E%K?'0KC((0 MCH4*CH4*CH4*BX(.@GH=95]/.#2=%!+<!`3W`P/Z#P[D,BZH7EA9?G8?A7P3 M=&TP2D5['AS*"`?R`0']`0'^`@+[!07U"0CO#`OI#0SG#@WF#0SH"@KL"0CO M"0GN$1#@'AS',R^A3$=R9%Y$=W`?@'</@7H*@GH)@GD)@7D)@7D)@7D)@'@) M@'@)@'@)?W<)?W<)?W<)?W8)?G8)?G8)?G8)?74)?74)?74)?'0)?'0)?'0) M>W0)>W,)>W,)>G,)>G()>G()>7()>7$)>7$)>7$)>'$)>'`)>'`)=W`)=V\) M=V\)=F\)=F\)=FX(=6X(=6X(=6T(=&T(=&T(=&P(=&P(<VP(<VP(<VL(<FL( M<FL(<FH(<6H(<6H(<6H(<&D(<&D(<&D(;V@(;V@(;V@(;F<(;F<(;F<(;F<( M;68(;68(;68(;&4(;&4(;&4(:V4(:V0(:V0(:F0(:F,(:F,(:6,(:6((:6(' M:6(':&(':&$':&$'9V$'9V`'9V`'9F`'9F`'9E\'95\'95\'95X'9%X'9%X' M9%T'8UT'8UT'8UT'8UP'8EP'8EP'8EL'85L'85L'85L'8%H'8%H'8%H'7UD' M7UD'7UD'7E@'7E@'7E@'7E@'75<'75<'75<'7%8'7%8'7%8&6U8&6U4&6U4& M6E4&6E0&6E0&650&65,&65,&6%,&6%,&6%(&6%(&``#&N0_%N0_%N`[%N`[$ MN`[$N`[$MP[#MP[#MP[#M@["M@["M@["M@[!M0[!M0[!M0[!M`[`M`[`M`[` MLPZ_LPZ_LPZ_LPZ^L@Z^L@Z^L@Z]L0Z]L0Z]L0Z\L0Z\L`Z\L`Z\L`Z[KPZ[ MKPZ[KPZZK@ZZK@ZZK@ZYK@ZYK0ZYK0ZXK0ZXK`ZXK`VWK`VWJPVWJPVVJPVV MJPVVJ@VVJ@VUJ@VUJ0VUJ0VTJ0VTJ0VTJ`VSJ`VSJ`VSIPVRIPVRIPVRI@VQ MI@VQI@VQI@VQI0VPI0VPI0VPI`VOI`VOI`VOI`VNHPVNHPVNHPVMH@VMH@VM MH@VLH0VLH0VLH0VKH0VKH`VKH`VKH`RJGPRJGPRJGPRIGPRIG@RIG@RHG@RH MG0RHG0RGG0RGG`RGG`RFG`RFG`RFFPRFFPREFPREF@REF@RDF@RDF@RDF0RC MF0RCF0RCF`RBF`RBF`RBEPRAEPRAEPRAEPR@E@R@E@R@E@R@E0R?E0R?E0R? ME0R>E`R>E`R>E`R=DPN=DPN=DPN<D@N<D@N<D@N;D@N;D0N;D0N;D0N:D`N: MD`N:D`N9D`N9CPN9CPN7C@R7C0V6C`Z5C`Z5BPZ3B1*)@2!W<#UB7%].28!` M/)<Z-Y\R+ZTB(,@0#^0(!_,,"^L4$MX;&=(>',T;&M$5%-P-#.H%!/<!`?T" M`OP,#.HK*+994VA]=2F,@Q".A0N.A0J-A`N)@!-W;S!237`H);H,"^L#`_D( M"/$<&\U$0(=L94"!>1J`>!MG84<Y-ID2$=X#`_D!`?X$!/@)"/`3$MP9&-$B M(,(E(KTD(KT>'<<7%M4.#>8'!_('!_(-#.<:&<XQ+J1.26YH83UY<AN`>`Z! M>@J">@F">0F`>0J`>`N`>`M_=PN`>`J`>`E_=PE_=PE_=PE_=PE^=@E^=@E^ M=@E]=0E]=0E]=0E\=`E\=`E\=`E[=`E[<PE[<PEZ<PEZ<@EZ<@EZ<@EY<@EY M<0EY<0EX<0EX<`EX<`EW<`EW;PEW;PEV;PEV;PEV;@AU;@AU;@AU;0AT;0AT M;0AT;0AT;`AS;`AS;`AS:PAR:PAR:PAR:@AQ:@AQ:@AQ:@AP:0AP:0AP:0AO M:`AO:`AO:`AO9PAN9PAN9PAN9PAM9@AM9@AM9@AL90AL90AL90AK90AK9`AK M9`AJ9`AJ8PAJ8PAI8PAI8@AI8@AI8@=H8@=H80=H80=G80=G8`=G8`=F8`=F M8`=F7P=E7P=E7P=E7@=D7@=D7@=D70=D70=C70=C70=C7`=B7`=B7`=B6P=A M6P=A6P=A6P=@6@=@6@=@6@=?60=?60=?60=>6`=>6`=>6`=>6`==5P==5P== M5P=<5@=<5@=<5@=;5@9;509;509:509:5`9:5`995`994P994P994P984P98 M4@8``,:Y#\:Y#\6Y#\6X#L6X#L2X#L2X#L2W#L.W#L.W#L.V#L*V#L*V#L*V M#L*U#L&U#L&U#L&T#L"T#L"T#L"S#K^S#K^S#K^S#KZR#KZR#KZR#KVQ#KVQ M#KVQ#KVQ#KRP#KRP#KRP#KNO#KNO#KNO#KJN#KJN#KJN#KFN#KFM#KFM#KBM M#KBL#KBL#;>L#;>L#;>K#;>K#;:K#;:J#;:J#;6J#;6I#;6I#;2I#;2I#;2H M#;.H#;.H#;.G#;*G#;*G#;*G#;*F#;&F#;&F#;&E#;"E#;"E#;"D#:^D#:^D M#:^D#:ZC#:ZC#:ZC#:VB#:VB#:VB#:RB#:RA#:RA#:RA#:N@#:N@#:N@#*J? M#*J?#*J?#*F?#*F>#*F>#*B>#*B=#*B=#*>=#*>=#*><#*><#*:<#*:;#*:; M#*6;#*6:#*6:#*2:#*2:#*29#*.9#*.9#*.8#**8#**8#**8#*&7#*&7#*&7 M#*&6#*"6#*"6#*"5#)^5#)^5#)^5#)Z4#)Z4#)Z4#)V3"YV3"YV3"YR3"YR2 M"YR2"YR2"YN1"YN1"YN1"YJ0"YJ0"YJ0"YF0"YF/"YF/"YB/"YB."YB."Y>. M"Y:-#).)$HN#'(!Y+G9N0&IC4V-=75=1<$`\EB4CPA`/Y`H*[@D)\`L*[0H* M[@H)[PD(\0D)\`<'\P0$^`("^PD(\24CP%)-<W=O-(A_%HV$#HZ%"XR##8-[ M'6EB2CXZDAL9T0<'\P0$^`\.Y2PJL5=29GAQ*X-Z&'AQ*U909BHGM`P,Z0(" M^P0$]PT,Z!H9T"TJKCLWE$=#?4Q'=4E$>T`\BC0PH20AOA03V@D)[@8&\PL* MZQL:S#8SFE=277)K*WYV$X)Y"X)Z"8%Y"W]V#WMS%7IR%WIS%GQU$'YW#(!X M"H!W"7]W"7]W"7]W"7YV"7YV"7YV"7UU"7UU"7UU"7QT"7QT"7QT"7MT"7MS M"7MS"7MS"7IR"7IR"7IR"7ER"7EQ"7EQ"7AQ"7AP"7AP"7=P"7=O"7=O"79O M"79O"79N"'5N"'5N"'5M"'5M"'1M"'1M"'1L"'-L"'-L"'-K"')K"')K"')J M"'%J"'%J"'%J"'!I"'!I"'!I"'!H"&]H"&]H"&]H"&YG"&YG"&YG"&UF"&UF M"&UF"&QE"&QE"&QE"&ME"&MD"&MD"&ID"&IC"&IC"&IC"&EC"&EB"&EB!VAB M!VAA!VAA!V=A!V=@!V=@!V9@!V9@!V9?!V5?!V5?!V5>!V5>!V1>!V1>!V1= M!V-=!V-=!V-<!V)<!V)<!V);!V%;!V%;!V%;!V!:!V!:!V!:!U]9!U]9!U]9 M!U]9!UY8!UY8!UY8!UU7!UU7!UU7!UQ6!UQ6!UQ6!UM6!EM5!EM5!EI5!EI4 M!EI4!EI4!EE4!EE3!EE3!EA3!@``QKH/QKD/QKD/Q;D/Q;D/Q;@.Q+@.Q+@. MQ+<.P[<.P[<.P[8.P[8.PK8.PK8.PK4.P;4.P;4.P;0.P+0.P+0.P+0.O[,. MO[,.O[,.OK(.OK(.OK(.O;$.O;$.O;$.O;$.O+`.O+`.O+`.NZ\.NZ\.NZ\. MNJ\.NJX.NJX.N:X.N:T.N:T.N*T.N*P.N*P-N*P-MZP-MZL-MZL-MJL-MJH- MMJH-M:H-M:H-M:D-M*D-M*D-M*@-LZ@-LZ@-LZ<-LJ<-LJ<-LJ<-LJ8-L:8- ML:8-L:4-L*4-L*4-L*4-KZ0-KZ0-KZ0-KJ,-KJ,-KJ,-K:(-K:(-K:(-K:(- MK*$-K*$-K*$-JZ`-JZ`-JZ`,JJ`,JI\,JI\,J9\,J9X,J9X,J)X,J)T,J)T, MIYT,IYT,IYP,IYP,IIP,IIL,IIL,I9L,I9L,I9H,I)H,I)H,I)D,HYD,HYD, MHY@,HI@,HI@,HI@,HI<,H9<,H9<,H98,H)8,H)8,H)4,GY4,GY4,GY4,GI0, MGI0,GI0,G9,+G9,+G9,+G),+G)(+G)(+G)(+FY$+FY$+FY$+FI`+FI`+FI`+ MF9`+F8\+F8\+F(\+F(X+F(X+EXX+EHT,E8L/DH@4C(0;AGTE@GDL>7(Y9E]9 M14".*2:\&QK2$A'A#@[G"PKM#`OL#0SJ%!/>%1/=#0SI!07V!@;T&1?5/SN3 M95]3?',MA7T;B8$4B'\6=V\R5$]N*RBU#@WF!`3X!P;S&1?4/3F49V!+@'@> M@'<>:F-$0SZ*'!K-"`CQ!`3W#0SH'QW'-S.=34ET8%I2;68[;VDU:F0_8EQ, M55!C0S^%*RBQ%A77"0GN!@;S#P[C)2.[14%_95Y$>7$=@'D.@GD+?G81=V\> M;F<P:&$Y:V0S<FLE>7$7?'40?W<+@'<*?W<)?W<)?W<)?G8)?G8)?G8)?74) M?74)?74)?'4)?'0)?'0)>W0)>W,)>W,)>W,)>G()>G()>G()>7()>7$)>7$) M>'$)>'`)>'`)=W`)=W`)=V\)=F\)=F\)=FX(=FX(=6X(=6T(=6T(=&T(=&T( M=&P(<VP(<VP(<VL(<FL(<FL(<FL(<6H(<6H(<6H(<&D(<&D(<&D(<&@(;V@( M;V@(;V@(;F<(;F<(;F<(;68(;68(;68(;&8(;&4(;&4(:V4(:V0(:V0(:V0( M:F,(:F,(:F,(:6,(:6((:6(':&(':&$':&$'9V$'9V$'9V`'9F`'9F`'9E\' M95\'95\'95X'95X'9%X'9%X'9%T'8UT'8UT'8UP'8EP'8EP'8EP'85L'85L' M85L'8%H'8%H'8%H'8%D'7UD'7UD'7UD'7E@'7E@'7E@'75<'75<'75<'7%<' M7%8'7%8'6U8&6U4&6U4&6E4&6E0&6E0&6E0&650&65,&65,&``#'N@_&N@_& MN0_&N0_%N0_%N0_%N`[$N`[$N`[$MP[$MP[#MP[#MP[#M@["M@["M@["M0[! MM0[!M0[!M`[`M`[`M`[`M`Z_LPZ_LPZ_LPZ^L@Z^L@Z^L@Z^L@Z]L0Z]L0Z] ML0Z\L`Z\L`Z\L`Z[KPZ[KPZ[KPZZKPZZK@ZZK@ZYK@ZYK0ZYK0ZYK0ZXK0ZX MK`ZXK`VWK`VWJPVWJPVVJPVVJ@VVJ@VUJ@VUJ@VUJ0VTJ0VTJ0VTJ`VSJ`VS MJ`VSIPVSIPVRIPVRIPVRI@VQI@VQI@VQI0VPI0VPI0VPI0VOI`VOI`VOI`VN MHPVNHPVNHPVNH@VMH@VMH@VMH@VLH0VLH0VLH0VKH`VKH`VKH`VJH`RJGPRJ MGPRIGPRIG@RIG@RHG@RHG0RHG0RHG0RGG0RGG`RGG`RFG`RFFPRFFPREFPRE MFPREF@RDF@RDF@RDF0RCF0RCF0RCF`RCF`RBF`RBF`RBEPRAEPRAEPRAE@R@ ME@R@E@R@E@R?E0R?E0R?E0R>E`R>E`R>E`R=DPN=DPN=DPN=DPN<D@N<D@N< MD@N;D0N;D0N;D0N:D0N:D`N:D`N9D`N9CPN9CPN8CPN8C@N8C@N8C@N7C@N6 MC`R5BPZ2BA&0AQ6-A!F!>2QJ9%%23'D\.9LN++(E(\(@'LH@'LDE(\$Q+JTR M+ZLA'\@+"^P#`_D,"^LF([]'0H=?65UO:$)T;3AQ:CY;56,W-*`9%]0(!_(# M`_D,"^LF([Y/2G9S:S:#>QE]=25;55\P+:H1$.$%!?8)">\;&=`V,YY53V=K M9#]Y<2:!>!>!>19]=AMY<B1P:3-@65%&0GXJ)[(3$MP(!_$*">T9%]$U,IU7 M4EUR:RM^=Q-_>!!X;QYG83M74EI-2&U02VA;55%I8S9T;")[<Q-_=PN`>`I_ M=PE_=PE_=PE^=@E^=@E^=@E]=0E]=0E]=0E\=0E\=`E\=`E\=`E[<PE[<PE[ M<PEZ<PEZ<@EZ<@EY<@EY<0EY<0EX<0EX<`EX<`EW<`EW<`EW;PEW;PEV;PEV M;@AV;@AU;@AU;@AU;0AT;0AT;0AT;`AS;`AS;`AS:PAR:PAR:PAR:PAQ:@AQ M:@AQ:@AQ:0AP:0AP:0AP:0AO:`AO:`AO:`AN9PAN9PAN9PAM9@AM9@AM9@AL M9@AL90AL90AL90AK9`AK9`AK9`AJ8PAJ8PAJ8PAI8PAI8@AI8@=H8@=H80=H M80=G80=G80=G8`=F8`=F8`=F7P=F7P=E7P=E7@=E7@=D7@=D7@=D70=C70=C M70=C7`=B7`=B7`=B7`=A6P=A6P=A6P=A6@=@6@=@6@=@60=?60=?60=?60=> M6`=>6`=>6`==5P==5P==5P=<5P=<5@=<5@=;5@9;509;509;509:5`9:5`9: M5`995`994P8``,>Z#\>Z#\:Z#\:Y#\:Y#\6Y#\6Y#\6X#L2X#L2X#L2W#L2W M#L.W#L.W#L.V#L*V#L*V#L*U#L&U#L&U#L&T#L"T#L"T#L"T#K^S#K^S#K^S M#K^R#KZR#KZR#KZR#KVQ#KVQ#KVQ#KRP#KRP#KRP#KNO#KNO#KNO#KJO#KJN M#KJN#KFN#KFM#KFM#KFM#KBM#KBL#KBL#;>L#;>K#;>K#;:K#;:J#;:J#;6J M#;6J#;6I#;2I#;2I#;2H#;2H#;.H#;.H#;.G#;*G#;*G#;*F#;&F#;&F#;&E M#;"E#;"E#;"E#:^D#:^D#:^D#:ZC#:ZC#:ZC#:ZC#:VB#:VB#:VB#:RA#:RA M#:RA#:N@#:N@#:N@#:J@#*J?#*J?#*F?#*F>#*F>#*F>#*B>#*B=#*B=#*>= M#*><#*><#*:<#*:;#*:;#*6;#*6;#*6:#*2:#*2:#*29#*.9#*.9#*.9#*.8 M#**8#**8#**7#*&7#*&7#*&6#*"6#*"6#*"6#)^5#)^5#)^5#)Z4#)Z4#)Z4 M#)Z4#)V3"YV3"YV3"YR2"YR2"YR2"YN1"YN1"YN1"YJ1"YJ0"YJ0"YF0"YF/ M"YF/"YB/"YB/"YB."YB."Y>."Y>-"Y:,#)6,#92*#I"'%89^)'=P/&5>6E50 M<DM'@T9!C$5!C$U)?U=2;U91;SXZF!X<S0D)\`8%]1`/XR,@Q3<TH45!B4Q' M?DA$@S4QI1D7U0L*[0,#^@0$]Q03VS<TGV%;5GYV)81[&'-K-DM&>R$?Q0H) M[@4%]A$0X"PIL%!+<6YG.WUU'X5\$H=_#(=_#(9]#H1\$7]X&'5M*UY85#XZ MCB`=Q0T,Z`@'\1(1W2LHKTU(<6ME.'MS&GMS&6YG,5=17#TYBR\LIC`MI#TY MBU!+9F9@/'5M'WQU$'YV#7YV#7UU#7UU#7YV"WYV"GYV"7YV"7UU"7UU"7UU M"7UU"7QT"7QT"7QT"7MS"7MS"7MS"7IS"7IR"7IR"7ER"7EQ"7EQ"7AQ"7AP M"7AP"7=P"7=P"7=O"7=O"79O"79N"'9N"'5N"'5N"'5M"'1M"'1M"'1L"'-L M"'-L"'-K"')K"')K"')K"')J"'%J"'%J"'%I"'!I"'!I"'!I"&]H"&]H"&]H M"&YG"&YG"&YG"&UF"&UF"&UF"&QF"&QE"&QE"&QE"&MD"&MD"&MD"&ID"&IC M"&IC"&EC"&EB"&EB!VAB!VAA!VAA!V=A!V=A!V=@!V=@!V9@!V9?!V9?!V5? M!V5?!V5>!V1>!V1>!V1=!V-=!V-=!V-<!V)<!V)<!V)<!V%;!V%;!V%;!V%: M!V!:!V!:!V!:!U]9!U]9!U]9!UY8!UY8!UY8!UU7!UU7!UU7!UQ7!UQ6!UQ6 M!UQ6!EM5!EM5!EM5!EI5!EI4!EI4!EE4!@``Q[L/Q[H/Q[H/QKH/QKH/QKD/ MQ;D/Q;D/Q;@.Q;@.Q+@.Q+<.Q+<.P[<.P[<.P[8.PK8.PK8.PK4.P;4.P;4. MP;4.P+0.P+0.P+0.P+,.O[,.O[,.O[(.OK(.OK(.OK(.O;$.O;$.O;$.O+`. MO+`.O+`.N[`.NZ\.NZ\.NJ\.NJX.NJX.NJX.N:T.N:T.N:T.N*T.N*P.N*P- MMZP-MZL-MZL-MJL-MJL-MJH-M:H-M:H-M:D-M:D-M*D-M*@-M*@-LZ@-LZ@- MLZ<-LJ<-LJ<-LJ8-L:8-L:8-L:8-L*4-L*4-L*4-KZ0-KZ0-KZ0-KZ,-KJ,- MKJ,-KJ,-K:(-K:(-K:(-K*$-K*$-K*$-JZ$-JZ`-JZ`-JJ`,JI\,JI\,JI\, MJ9X,J9X,J9X,J)X,J)T,J)T,IYT,IYP,IYP,IIP,IIP,IIL,I9L,I9L,I9H, MI)H,I)H,I)D,I)D,HYD,HYD,HY@,HI@,HI@,HI<,H9<,H9<,H9<,H)8,H)8, MH)8,GY4,GY4,GY4,GY0,GI0,GI0,GI0,G9,+G9,+G9,+G)(+G)(+G)(+FY$+ MFY$+FY$+FI$+FI`+FI`+F9`+F8\+F8\+F8\+F(\+F(X+F(X+EXX+EXT+EXT+ MEHT+E8L-DH@2C(,:@GHJ>G$X<FM";FA);F=)<FM">'$W=FX\7EAC-C.D%1/= M"`?R!P;T#`OK%A3;&QG1'AW+'1S-%13:"`?R`P/Y`P/Y#0SI)"+!34EY<FLX MA'P9@WL;:&%).36;%!/;!07V!@;T&1?3/CJ19%U.?'0BA7T1B'\,B8`*B8`* MB(`*AW\+A7T/?G<:;68Y3TIP*RFP$A'="`CP#0SH(B#`14%_95]#=W`B=VXC M8UU&1D)\*B>Q&1?1&!?1)R2V/CJ)6U51<&DI>G(6>7(6=F\;=6X==6X<>7$6 M>W,1?74,?G8*?G8)?G8)?74)?74)?74)?'0)?'0)?'0)>W,)>W,)>W,)>G,) M>G()>G()>7()>7$)>7$)>'$)>'$)>'`)>'`)=W`)=V\)=V\)=F\)=FX(=FX( M=6X(=6X(=6T(=&T(=&T(=&P(<VP(<VP(<VP(<VL(<FL(<FL(<FH(<6H(<6H( M<6D(<&D(<&D(<&D(;V@(;V@(;V@(;F<(;F<(;F<(;6<(;68(;68(;68(;&4( M;&4(;&4(:V0(:V0(:V0(:F0(:F,(:F,(:6,(:6((:6(':&(':&(':&$':&$' M9V$'9V`'9V`'9F`'9E\'9E\'95\'95\'95X'9%X'9%X'9%T'8UT'8UT'8UT' M8EP'8EP'8EP'8EL'85L'85L'85H'8%H'8%H'8%H'7UD'7UD'7UD'7E@'7E@' M7E@'75@'75<'75<'75<'7%8'7%8'7%8&6U4&6U4&6U4&6E4&6E0&6E0&``#( MNP_'NP_'N@_'N@_&N@_&N@_&N0_&N0_%N0_%N`[%N`[$N`[$N`[$MP[#MP[# MMP[#M@["M@["M@["M0[!M0[!M0[!M0[`M`[`M`[`M`[`LPZ_LPZ_LPZ_LPZ^ ML@Z^L@Z^L@Z]L0Z]L0Z]L0Z\L`Z\L`Z\L`Z[L`Z[KPZ[KPZ[KPZZK@ZZK@ZZ MK@ZYK@ZYK0ZYK0ZXK0ZXK`ZXK`VWK`VWJPVWJPVVJPVVJPVVJ@VUJ@VUJ@VU MJ0VUJ0VTJ0VTJ0VTJ`VSJ`VSJ`VSIPVRIPVRIPVRI@VQI@VQI@VQI@VPI0VP MI0VPI0VPI`VOI`VOI`VOHPVNHPVNHPVNHPVMH@VMH@VMH@VLH0VLH0VLH0VK MH0VKH`VKH`VJH`RJGPRJGPRJGPRIG@RIG@RIG@RHG@RHG0RHG0RGG0RGG`RG MG`RFG`RFG`RFFPREFPREFPREF@REF@RDF@RDF0RDF0RCF0RCF0RCF`RBF`RB MF`RBEPRAEPRAEPRAEPR@E@R@E@R@E@R?E0R?E0R?E0R?E`R>E`R>E`R>E`R= MDPN=DPN=DPN<D@N<D@N<D@N;D@N;D0N;D0N:D0N:D`N:D`N:D`N9CPN9CPN9 MCPN8CPN8C@N8C@N7C@N7C0N7C0N6C0N5C`R4B@Z0AQ2-A!B*@1R(@!Z(@!Z) M@!V,@AB(@!UW;SI64'`Q+JX7%M@+"NT'!O0'!O0'!_,'!O0(!_(&!O0#`_D$ M!/@,"^L@'L@_.Y)D75-_=R2%?!AY<2Y54&LI)K@-#.D$!/@*"NTB(,-)1'YO M:3J#>A:)@`R)@0J)@`J)@`J)@`J(@`J'?@R$>Q)T;BQ84F`S+Z,5%-D(!_$+ M"NL?'<5!/8AC7$ET;2AO:3!94ELW-)@;&LP-#>8/#N,?'<4[-Y!;55)P:2IV M;QUP:2IE7SQ@6D9B7$-I8C1Q:B1Y<19\=`U^=@I^=@E^=@E]=0E]=0E]=0E\ M=`E\=`E\=`E[=`E[<PE[<PEZ<PEZ<@EZ<@EY<@EY<0EY<0EY<0EX<0EX<`EX M<`EW<`EW;PEW;PEV;PEV;PEV;@AU;@AU;@AU;0AT;0AT;0AT;`AS;`AS;`AS M;`AS:PAR:PAR:PAR:@AQ:@AQ:@AQ:@AP:0AP:0AP:0AO:`AO:`AO:`AN9PAN M9PAN9PAN9PAM9@AM9@AM9@AL90AL90AL90AK90AK9`AK9`AJ9`AJ8PAJ8PAI M8PAI8@AI8@=H8@=H8@=H80=H80=G80=G8`=G8`=F8`=F7P=F7P=E7P=E7P=E M7@=D7@=D7@=D70=C70=C70=C70=C7`=B7`=B7`=B6P=A6P=A6P=A6@=@6@=@ M6@=@6@=?60=?60=?60=>6`=>6`=>6`==6`==5P==5P==5P=<5@=<5@=<5@9; M509;509;509:509:5`8``,B[#\B[#\>[#\>Z#\>Z#\>Z#\:Z#\:Y#\:Y#\6Y M#\6X#L6X#L2X#L2X#L2W#L.W#L.W#L.V#L*V#L*V#L*U#L&U#L&U#L&U#L&T M#L"T#L"T#L"S#K^S#K^S#K^S#KZR#KZR#KZR#KVQ#KVQ#KVQ#KRP#KRP#KRP M#KRP#KNO#KNO#KNO#KJN#KJN#KJN#KFN#KFM#KFM#KBM#KBL#KBL#;>L#;>K M#;>K#;:K#;:K#;:J#;:J#;6J#;6I#;6I#;2I#;2I#;2H#;.H#;.H#;.G#;*G M#;*G#;*F#;&F#;&F#;&F#;&E#;"E#;"E#;"D#:^D#:^D#:^D#:ZC#:ZC#:ZC M#:VB#:VB#:VB#:RA#:RA#:RA#:NA#:N@#:N@#:N@#*J?#*J?#*J?#*F?#*F> M#*F>#*B>#*B=#*B=#*>=#*><#*><#*:<#*:<#*:;#*:;#*6;#*6:#*6:#*2: M#*2:#*29#*.9#*.9#*.8#**8#**8#**7#*&7#*&7#*&7#*"6#*"6#*"6#*"5 M#)^5#)^5#)^5#)Z4#)Z4#)Z4#)V3"YV3"YV3"YR2"YR2"YR2"YN2"YN1"YN1 M"YN1"YJ0"YJ0"YJ0"YF0"YF/"YF/"YB/"YB."YB."Y>."Y>-"Y>-"Y:-"Y:- M"Y6+#)2+#9.*#I.)#I.)#Y*)#Y*)#I&'$8=_'G-L051.=#4RIB`>R1,2WPP+ MZP<'\P4%]@4$]P8%]0@(\0\.Y1\=RCLXF5U78'=P,85]&8)Z'FMD14,_BAP: MS@<'\P,#^0T,Z2<DNTU(=W%J.(1\%HF`#(J!"HJ!"HF!"HF`"HF`"H>`"X-[ M$WAP)UU75S<SG!84V`<&\PD([QP:RT`\B6-=271L*6IC/$Q'<BHHL!(0W@D( M[PX-Y2,AO$(^@V%;1W-K)7!I*6!:24M&<#\[AD$]@TY):5Y826YG*GEQ%7YU M#'YV"GYV"7YV"7UU"7UU"7UU"7QT"7QT"7QT"7MT"7MS"7MS"7IS"7IR"7IR M"7IR"7EQ"7EQ"7EQ"7AQ"7AP"7AP"7=P"7=O"7=O"79O"79O"79N"'5N"'5N M"'5M"'1M"'1M"'1L"'1L"'-L"'-L"'-K"')K"')K"')J"'%J"'%J"'%J"'!I M"'!I"'!I"&]H"&]H"&]H"&]G"&YG"&YG"&YG"&UF"&UF"&UF"&QE"&QE"&QE M"&ME"&MD"&MD"&ID"&IC"&IC"&EC"&EB"&EB"&EB!VAB!VAA!VAA!V=A!V=@ M!V=@!V9@!V9@!V9?!V5?!V5?!V5>!V1>!V1>!V1=!V1=!V-=!V-=!V-<!V)< M!V)<!V);!V%;!V%;!V%;!V!:!V!:!V!:!U]9!U]9!U]9!UY8!UY8!UY8!UY8 M!UU7!UU7!UU7!UQ6!UQ6!UQ6!EM6!EM5!EM5!EI5!@``R+P/R+L/R+L/Q[L/ MQ[L/Q[H/Q[H/QKH/QKD/QKD/Q;D/Q;@.Q;@.Q+@.Q+@.Q+<.P[<.P[<.P[8. MPK8.PK8.PK8.PK4.P;4.P;4.P;0.P+0.P+0.P+,.O[,.O[,.O[,.OK(.OK(. MOK(.O;$.O;$.O;$.O+$.O+`.O+`.O+`.NZ\.NZ\.NZ\.NJX.NJX.NJX.N:X. MN:T.N:T.N*T.N*P.N*P-MZP-MZP-MZL-MZL-MJL-MJH-MJH-M:H-M:D-M:D- MM*D-M*D-M*@-LZ@-LZ@-LZ<-LJ<-LJ<-LJ<-L:8-L:8-L:8-L:4-L*4-L*4- ML*0-KZ0-KZ0-KZ0-KJ,-KJ,-KJ,-K:(-K:(-K:(-K*(-K*$-K*$-K*$-JZ`- MJZ`-JZ`,JI\,JI\,JI\,J9\,J9X,J9X,J)X,J)T,J)T,IYT,IYT,IYP,IIP, MIIP,IIL,IIL,I9L,I9H,I9H,I)H,I)H,I)D,HYD,HYD,HY@,HI@,HI@,HI@, MH9<,H9<,H9<,H98,H)8,H)8,H)4,GY4,GY4,GY4,GI0,GI0,GI0,G9,+G9,+ MG9,+G),+G)(+G)(+FY(+FY$+FY$+FY$+FI`+FI`+FI`+F9`+F8\+F8\+F(\+ MF(X+F(X+EXX+EXT+EXT+EHT+EHT+EHP+EHP+E8P+E8L+E8L+E(L+DXH,D(82 MAGXA=&T^7%5G1#^.,2ZM)2+"&1?5$Q+?$A'A%Q79'AS,*BBW0#R175=@=FXU MA7T;AW\6>W,K7%9@,S"G$Q+>!`3W!`3W#P[E*":Y3$=Y;V<\@WH8B8`-BH$* MBH$*BH$*B8$*B8`*B(`+@WL3=FXK6E1=-3*?%A38"`?Q#`OI(![$0CV'85M, M;F<U7EA1/SN+'QW%"PKK"`CP$A'<+2JK3TIJ:V0U=F\@:V,U3DEJ,"VD(![" M(B"],2ZA241S85M$<FHC>W,1?G8+?G8)?G8)?G8)?74)?74)?74)?'0)?'0) M?'0)>W0)>W,)>W,)>G,)>G()>G()>G()>7()>7$)>7$)>'$)>'`)>'`)=W`) M=V\)=V\)=F\)=F\)=FX(=6X(=6X(=6T(=6T(=&T(=&T(=&P(<VP(<VP(<VL( M<FL(<FL(<FH(<6H(<6H(<6H(<&D(<&D(<&D(;V@(;V@(;V@(;V@(;F<(;F<( M;F<(;68(;68(;68(;&4(;&4(;&4(:V4(:V0(:V0(:F0(:F,(:F,(:F,(:6,( M:6((:6(':&(':&$':&$'9V$'9V`'9V`'9F`'9F`'9E\'95\'95\'95X'9%X' M9%X'9%X'9%T'8UT'8UT'8UP'8EP'8EP'8EL'85L'85L'85L'8%H'8%H'8%H' M7UD'7UD'7UD'7UD'7E@'7E@'7E@'75<'75<'75<'7%8'7%8'7%8'6U8&6U4& M6U4&``#)O`_(O`_(NP_(NP_(NP_'NP_'N@_'N@_&N@_&N0_&N0_%N0_%N0_% MN`[$N`[$N`[$MP[#MP[#MP[#M@[#M@["M@["M@["M0[!M0[!M0[!M`[`M`[` MM`[`M`Z_LPZ_LPZ_LPZ^L@Z^L@Z^L@Z]L0Z]L0Z]L0Z]L0Z\L`Z\L`Z\L`Z[ MKPZ[KPZ[KPZZKPZZK@ZZK@ZYK@ZYK0ZYK0ZXK0ZXK`ZXK`VXK`VWK`VWJPVW MJPVVJPVVJ@VVJ@VUJ@VUJ@VUJ0VTJ0VTJ0VTJ`VSJ`VSJ`VSIPVRIPVRIPVR MIPVRI@VQI@VQI@VQI0VPI0VPI0VPI`VOI`VOI`VOI`VNHPVNHPVNHPVMH@VM MH@VMH@VMH@VLH0VLH0VLH0VKH`VKH`VKH`RJGPRJGPRJGPRIGPRIG@RIG@RH MG@RHG0RHG0RGG0RGG0RGG`RGG`RFG`RFFPRFFPREFPREF@REF@RDF@RDF@RD MF0RCF0RCF0RCF`RBF`RBF`RBF`RBEPRAEPRAEPRAE@R@E@R@E@R@E0R?E0R? ME0R?E0R>E`R>E`R>E`R=DPN=DPN=DPN<DPN<D@N<D@N<D@N;D0N;D0N;D0N: MD`N:D`N:D`N9D`N9CPN9CPN8CPN8C@N8C@N7C@N7C@N7C0N7C0N6C0N6C`N6 MC`N5C`N5BPN5BPN4BPN3B@R1AQ")@!QZ<C5I8E%95&I,1X%`/)4X-:`W-*(\ M.9I'0HA53V]L94=\="R&?AF+@A&'?Q=Q:CQ+1GXC(<(+"NP#`_H#`_D,"^HD M(<%&085H8DA^=B&(?Q"*@0N*@0J*@0J*@0J(@`N'?@Z!>!AO:3912VXM*JT3 M$=T'!_(-#.<D(KY%08!A6TUF8$113&DR+J07%=4)">X,"^D=&\D[-Y%:555Q M:2QS;"5@6DH_.X@?'<0-#.</#N(>',4[.(U95%-R:B-\=!!_=PI_=PE^=@E^ M=@E^=@E]=0E]=0E]=0E\=0E\=`E\=`E[=`E[<PE[<PE[<PEZ<@EZ<@EZ<@EY M<@EY<0EY<0EX<0EX<`EX<`EW<`EW<`EW;PEV;PEV;PEV;@AV;@AU;@AU;0AU M;0AT;0AT;0AT;`AS;`AS;`AS:PAR:PAR:PAR:PAQ:@AQ:@AQ:@AP:0AP:0AP M:0AP:`AO:`AO:`AO:`AN9PAN9PAN9PAM9@AM9@AM9@AL9@AL90AL90AK90AK M9`AK9`AK9`AJ8PAJ8PAJ8PAI8PAI8@AI8@=H8@=H80=H80=G80=G80=G8`=F M8`=F8`=F7P=E7P=E7P=E7@=E7@=D7@=D7@=D70=C70=C70=C7`=B7`=B7`=B M6P=A6P=A6P=A6P=@6@=@6@=@6@=@60=?60=?60=?60=>6`=>6`=>6`==5P== M5P==5P=<5@=<5@=<5@=;5@9;508``,F\#\F\#\F\#\B\#\B[#\B[#\>[#\>Z M#\>Z#\:Z#\:Y#\:Y#\6Y#\6Y#\6X#L2X#L2X#L2W#L.W#L.W#L.V#L.V#L*V M#L*V#L*U#L&U#L&U#L&T#L"T#L"T#L"T#K^S#K^S#K^S#KZR#KZR#KZR#KZQ M#KVQ#KVQ#KVQ#KRP#KRP#KRP#KNO#KNO#KNO#KJO#KJN#KJN#KFN#KFM#KFM M#KBM#KBL#KBL#KBL#;>L#;>K#;>K#;:K#;:J#;:J#;6J#;6J#;6I#;2I#;2I M#;2H#;.H#;.H#;.G#;.G#;*G#;*G#;*F#;&F#;&F#;&E#;"E#;"E#;"E#:^D M#:^D#:^D#:ZC#:ZC#:ZC#:VB#:VB#:VB#:VB#:RA#:RA#:RA#:N@#:N@#:N@ M#*J@#*J?#*J?#*F?#*F>#*F>#*B>#*B=#*B=#*B=#*>=#*><#*><#*:<#*:; M#*:;#*6;#*6;#*6:#*2:#*2:#*29#*.9#*.9#*.8#**8#**8#**8#**7#*&7 M#*&7#*&6#*"6#*"6#*"6#)^5#)^5#)^5#)Z4#)Z4#)Z4#)V3"YV3"YV3"YV3 M"YR2"YR2"YR2"YN1"YN1"YN1"YJ1"YJ0"YJ0"YF0"YF/"YF/"YB/"YB."YB. M"Y>."Y>."Y>-"Y>-"Y:-"Y:,"Y:,"Y6,"Y6,"Y6+"Y2+"Y.*#)&'$(N"&(1\ M)'MS,G-K0&MD3&9@561=6&EB3W%J07IQ,H5]'(N#$HZ%#8R##X-['F5?4CDV MG!85V04%]@$!_0("^PD)[QH9T3<TGEI4871M,X)Z&8A_#XJ!"XF!"XF`"XA_ M#81\%'IR)6-=34(^B2(?P@T,Z`@'\1(1WBLIL$U(=&%;35Y75$1`@B4BO`\. MXPD([Q(1WB@FM$E$>&9@07-L)VUE,E-.8C`MHQ44UPD([PP+Z!X<QCTXBUM6 M3W)K)'UU#W]W"G]W"7]W"7YV"7YV"7YV"7UU"GUU"7UU"GQU"GQT"GQT"GQT M"GMS"GMS"7MS"7IR"7IR"7IR"7ER"7EQ"7EQ"7AQ"7AP"7AP"7=P"7=P"7=O M"79O"79O"79N"'9N"'5N"'5M"'5M"'1M"'1M"'1L"'-L"'-L"'-K"')K"')K M"')K"'%J"'%J"'%J"'%I"'!I"'!I"'!H"&]H"&]H"&]H"&YG"&YG"&YG"&UF M"&UF"&UF"&QF"&QE"&QE"&ME"&MD"&MD"&MD"&IC"&IC"&IC"&EC"&EB"&EB M!VAB!VAA!VAA!V=A!V=A!V=@!V9@!V9@!V9?!V9?!V5?!V5>!V5>!V1>!V1> M!V1=!V-=!V-=!V-<!V)<!V)<!V)<!V%;!V%;!V%;!V!:!V!:!V!:!V!9!U]9 M!U]9!U]9!UY8!UY8!UY8!UU7!UU7!UU7!UQ7!UQ6!UQ6!UM6!@``RKT/R;P/ MR;P/R;P/R+P/R+L/R+L/Q[L/Q[H/Q[H/QKH/QKD/QKD/Q;D/Q;D/Q;@.Q+@. MQ+@.Q+<.Q+<.P[<.P[<.P[8.PK8.PK8.PK4.P;4.P;4.P;0.P+0.P+0.P+0. MO[,.O[,.O[,.O[(.OK(.OK(.OK(.O;$.O;$.O;$.O+`.O+`.O+`.NZ\.NZ\. MNZ\.NJ\.NJX.NJX.N:X.N:T.N:T.N:T.N*T.N*P.N*P-MZP-MZL-MZL-MJL- MMJH-MJH-M:H-M:H-M:D-M*D-M*D-M*@-M*@-LZ@-LZ@-LZ<-LJ<-LJ<-LJ8- ML:8-L:8-L:4-L*4-L*4-L*4-KZ0-KZ0-KZ0-KJ,-KJ,-KJ,-KJ,-K:(-K:(- MK:(-K*$-K*$-K*$-JZ`-JZ`-JZ`-JJ`,JI\,JI\,J9\,J9X,J9X,J9X,J)X, MJ)T,J)T,IYT,IYP,IYP,IIP,IIL,IIL,I9L,I9L,I9H,I)H,I)H,I)D,HYD, MHYD,HYD,HY@,HI@,HI@,HI<,H9<,H9<,H98,H)8,H)8,H)8,GY4,GY4,GY4, MGI0,GI0,GI0,GI0,G9,+G9,+G9,+G)(+G)(+G)(+FY$+FY$+FY$+FI$+FI`+ MFI`+F9`+F8\+F8\+F(\+F(\+F(X+F(X+EXX+EXT+EXT+EHT+EHP+EHP+E8P+ ME8P+E8L+E(L+DXH,DH@.D(<1C806BH$9AWX>A7TA@WLDAGT?B'\:C(03CX4/ MCX8,CX8,BX(3>G,N6%-H*B>W#0WH`P/Z`0']`@+\!@7U$`_C)R2\14&&85M5 M=6XQ@7@<AWX2B'\0AGX1@WH6>W,D:V4_44MO+RRJ%13:"`?Q"0CO&!;4-3*> M54]E8EM-55!C-S.:&QG."PKK"@KL&AC0-3*<55!@;F8S<VPI9%Y$14!^)"&[ M#@WE!P?Q$`_A)B2V1D)Y95X_=F\;?G8-@'@)?W<)?W<)?W<)?G8)?G8*?74, M>W,->G(/>G(/>G(0>7$0>7$/>G(.>G(,>W,*>W,)>G,)>G()>G()>7()>7$) M>7$)>'$)>'`)>'`)=W`)=W`)=V\)=V\)=F\)=FX(=FX(=6X(=6X(=6T(=&T( M=&T(=&P(<VP(<VP(<VL(<FL(<FL(<FL(<FH(<6H(<6H(<6D(<&D(<&D(<&D( M;V@(;V@(;V@(;F<(;F<(;F<(;68(;68(;68(;&8(;&4(;&4(;&4(:V0(:V0( M:V0(:F0(:F,(:F,(:6,(:6((:6(':&(':&$':&$'9V$'9V$'9V`'9V`'9F`' M9E\'9E\'95\'95\'95X'9%X'9%X'9%T'8UT'8UT'8UP'8EP'8EP'8EP'85L' M85L'85L'85H'8%H'8%H'8%H'7UD'7UD'7UD'7E@'7E@'7E@'75<'75<'75<' M7%<'7%8'7%8'``#*O0_*O0_)O`_)O`_)O`_(O`_(NP_(NP_'NP_'N@_'N@_& MN@_&N@_&N0_%N0_%N0_%N`[%N`[$N`[$MP[$MP[#MP[#MP[#M@["M@["M@[" MM0[!M0[!M0[!M0[`M`[`M`[`M`Z_LPZ_LPZ_LPZ_L@Z^L@Z^L@Z^L@Z]L0Z] ML0Z]L0Z\L`Z\L`Z\L`Z[L`Z[KPZ[KPZZKPZZK@ZZK@ZZK@ZYK0ZYK0ZYK0ZX MK0ZXK`ZXK`VWK`VWJPVWJPVVJPVVJPVVJ@VUJ@VUJ@VUJ0VTJ0VTJ0VTJ`VT MJ`VSJ`VSJ`VSIPVRIPVRIPVRI@VQI@VQI@VQI@VPI0VPI0VPI0VOI`VOI`VO MI`VOHPVNHPVNHPVNHPVMH@VMH@VMH@VLH0VLH0VLH0VKH`VKH`VKH`VJH`RJ MGPRJGPRIGPRIG@RIG@RIG@RHG@RHG0RHG0RGG0RGG`RGG`RFG`RFFPRFFPRE MFPREFPREF@RDF@RDF@RDF0RDF0RCF0RCF0RCF`RBF`RBF`RBEPRAEPRAEPRA ME@R@E@R@E@R@E@R?E0R?E0R?E0R>E`R>E`R>E`R>E`R=DPN=DPN=DPN<D@N< MD@N<D@N;D0N;D0N;D0N:D0N:D`N:D`N9D`N9CPN9CPN9CPN8CPN8C@N8C@N7 MC@N7C0N7C0N6C0N6C`N6C`N5C`N5C`N5BPN4BPN4BPN3B0R2B0V2B0V2B0V1 MAP^/AA"0APZ1APV0APR1B`N1APN.A0Z'?QER:SU-27HG)+T/#N4&!O0&!?4( M!_()">\,"^L7%=@L*;)%089=5UQP:3MZ<BE[<R=\="5T;3%H8D9236TV,Y\< M<*"NT&!O0.#>8D(;]#/X9=5U=@65%*17@K*;`2$=T("/`.#>8C(;]#/X-B M7$ET;2=P:2]94UDW-)@9%]$)">X)">X7%M,S+Y]33F%M9B][<A5_=PN`>`F` M>`E_=PI^=@M^=@QZ<A%W<!=T;1QQ:B%Q:B%O:"1P:2-P:2%S:QMV;A9X<!!Y M<0UZ<@MZ<PIZ<@EZ<@EY<@EY<0EY<0EX<0EX<0EX<`EX<`EW<`EW;PEW;PEV M;PEV;@AV;@AU;@AU;@AU;0AT;0AT;0AT;`AS;`AS;`AS;`AR:PAR:PAR:PAR M:@AQ:@AQ:@AQ:0AP:0AP:0AP:0AO:`AO:`AO:`AN9PAN9PAN9PAM9PAM9@AM M9@AM9@AL90AL90AL90AK9`AK9`AK9`AJ9`AJ8PAJ8PAI8PAI8@AI8@=H8@=H M8@=H80=G80=G80=G8`=G8`=F8`=F7P=F7P=E7P=E7P=E7@=D7@=D7@=D70=C M70=C70=C70=B7`=B7`=B7`=B6P=A6P=A6P=A6@=@6@=@6@=@6@=?60=?60=? M60=>6`=>6`=>6`==5P==5P==5P=<5P=<5@<``,J]#\J]#\J]#\F]#\F\#\F\ M#\B\#\B[#\B[#\>[#\>Z#\>Z#\:Z#\:Z#\:Y#\:Y#\6Y#\6X#L6X#L2X#L2X M#L2W#L.W#L.W#L.V#L*V#L*V#L*U#L&U#L&U#L&U#L"T#L"T#L"T#L"S#K^S M#K^S#K^R#KZR#KZR#KZR#KVQ#KVQ#KVQ#KRP#KRP#KRP#KNP#KNO#KNO#KNO M#KJN#KJN#KJN#KFM#KFM#KFM#KBM#KBL#KBL#;>L#;>K#;>K#;:K#;:K#;:J M#;6J#;6J#;6I#;6I#;2I#;2H#;2H#;.H#;.H#;.G#;*G#;*G#;*F#;&F#;&F M#;&F#;"E#;"E#;"E#;"D#:^D#:^D#:^C#:ZC#:ZC#:ZC#:VB#:VB#:VB#:RA M#:RA#:RA#:NA#:N@#:N@#:J@#*J?#*J?#*J?#*F>#*F>#*F>#*B>#*B=#*B= M#*>=#*><#*><#*:<#*:<#*:;#*6;#*6;#*6:#*6:#*2:#*29#*29#*.9#*.9 M#*.8#**8#**8#**7#*&7#*&7#*&7#*"6#*"6#*"6#)^5#)^5#)^5#)^4#)Z4 M#)Z4#)Z4#)V3"YV3"YV3"YR2"YR2"YR2"YN2"YN1"YN1"YJ1"YJ0"YJ0"YJ0 M"YF/"YF/"YF/"YB/"YB."YB."Y>."Y>-"Y>-"Y:-"Y:-"Y:,"Y6,"Y6,"Y6+ M"Y2+"Y2+"Y2*"Y2*"Y.*"Y.*"Y.)"Y*)"Y*)"Y*("Y&("Y&("X^&#H9^&W)K M/51/<#0QIA\=R1<6V!<5V!H8TQ85V1`/Y`\.Y1@6UB@FN3LWETU(>%A39%U8 M6UY86E919T=#@3(OIAP:S@T,Z`4%]0D)[Q<5US,PHU-.:61>2EQ76#TYD!\= MQPP+Z0@'\1,2VRXLJ5%,:FQE.'9O)&ID.DQ'<BDGLA`/X0<&\@P+Z2$?P$$] MA&!:275N'WYW#H!Y"H!X"7]W"WUV#GIR%'9N&V]H*&9@-U]915I53EA24U90 M5E=24UM53&%;/VAA,6]H(G-L&79N$WEQ#GER"WIR"7IR"7ER"7EQ"7EQ"7EQ M"7AQ"7AP"7AP"7=P"7=O"7=O"79O"79N"'9N"'5N"'5N"'5M"'1M"'1M"'1L M"'-L"'-L"'-L"'-K"')K"')K"')J"'%J"'%J"'%I"'!I"'!I"'!I"&]H"&]H M"&]H"&YG"&YG"&YG"&YG"&UF"&UF"&UF"&QE"&QE"&QE"&MD"&MD"&MD"&ID M"&IC"&IC"&EC"&EB"&EB!VAB!VAB!VAA!VAA!V=A!V=@!V=@!V9@!V9?!V9? M!V5?!V5?!V5>!V1>!V1>!V1=!V-=!V-=!V-=!V-<!V)<!V)<!V);!V%;!V%; M!V%:!V!:!V!:!V!:!U]9!U]9!U]9!UY8!UY8!UY8!UU8!UU7!UU7!UU7!P`` MR[X/RKT/RKT/RKT/R;T/R;P/R;P/R+P/R+L/R+L/Q[L/Q[H/Q[H/QKH/QKH/ MQKD/QKD/Q;D/Q;@.Q;@.Q+@.Q+@.Q+<.P[<.P[<.P[8.PK8.PK8.PK4.P;4. MP;4.P;4.P;0.P+0.P+0.P+,.O[,.O[,.O[,.OK(.OK(.OK(.O;$.O;$.O;$. MO+`.O+`.O+`.N[`.NZ\.NZ\.NZ\.NJX.NJX.NJX.N:X.N:T.N:T.N*T.N*P. MN*P-MZP-MZL-MZL-MJL-MJL-MJH-MJH-M:H-M:D-M:D-M*D-M*D-M*@-LZ@- MLZ@-LZ<-LJ<-LJ<-LJ8-L:8-L:8-L:8-L*4-L*4-L*4-L*0-KZ0-KZ0-KZ0- MKJ,-KJ,-KJ,-K:(-K:(-K:(-K*$-K*$-K*$-JZ$-JZ`-JZ`-JZ`,JI\,JI\, MJI\,J9\,J9X,J9X,J)X,J)T,J)T,IYT,IYP,IYP,IIP,IIP,IIL,I9L,I9L, MI9H,I9H,I)H,I)H,I)D,HYD,HYD,HY@,HI@,HI@,HI<,H9<,H9<,H9<,H)8, MH)8,H)8,H)4,GY4,GY4,GY4,GI0,GI0,GI0,G9,+G9,+G9,+G)(+G)(+G)(+ MFY(+FY$+FY$+FI$+FI`+FI`+FI`+F9`+F8\+F8\+F(\+F(X+F(X+EXX+EXT+ MEXT+EHT+EHT+EHP+E8P+E8P+E8L+E8L+E(L+E(L+E(H+DXH+DXH+DXD+DHD+ MDHD+DH@+D8@+D(<-BX(6?78K:V5(6%-I1D&(/#B8.C>;.36=+BNP'!K/#P[E M#0SI$A'?'!K.)B2\,"VJ-C*A-C.@,"VJ)"+`%A78"POK!@;T"`CQ$Q+<*":W M1T*`85M195Y)4DUK,2ZG%139"`CP"@GM'!O+.S>275A3=6XH=FXE8%I,/CJ- M'!K+"0CO!@;S$A'=+2JK3TII;&4S?',5@'@+@7D)?W@,?'40=W`:;V@J8EQ! M55!:241R/CJ&-S23,S";,B^=-3*6/#B)1$!Y3DEE65-.8UTZ;&8G<VP8>'`/ M>7(+>G()>G()>7()>7$)>7$)>7$)>'$)>'`)>'`)=W`)=V\)=V\)=F\)=F\) M=FX(=6X(=6X(=6T(=&T(=&T(=&P(=&P(<VP(<VP(<VL(<FL(<FL(<FH(<6H( M<6H(<6H(<&D(<&D(<&D(;V@(;V@(;V@(;F<(;F<(;F<(;F<(;68(;68(;68( M;&4(;&4(;&4(:V4(:V0(:V0(:F0(:F,(:F,(:6,(:6((:6((:6(':&(':&$' M:&$'9V$'9V`'9V`'9F`'9F`'9E\'95\'95\'95X'9%X'9%X'9%T'8UT'8UT' M8UT'8UP'8EP'8EP'8EL'85L'85L'85L'8%H'8%H'8%H'7UD'7UD'7UD'7E@' M7E@'7E@'7E@'75<'75<'``#+O@_+O@_*O0_*O0_*O0_)O0_)O`_)O`_(O`_( MNP_(NP_'NP_'NP_'N@_'N@_&N@_&N0_&N0_%N0_%N`[%N`[$N`[$N`[$MP[# MMP[#MP[#M@["M@["M@["M@["M0[!M0[!M0[!M`[`M`[`M`[`LPZ_LPZ_LPZ_ MLPZ^L@Z^L@Z^L@Z]L0Z]L0Z]L0Z\L0Z\L`Z\L`Z\L`Z[KPZ[KPZ[KPZZK@ZZ MK@ZZK@ZYK@ZYK0ZYK0ZXK0ZXK`ZXK`VWK`VWK`VWJPVWJPVVJPVVJ@VVJ@VU MJ@VUJ0VUJ0VTJ0VTJ0VTJ`VSJ`VSJ`VSIPVRIPVRIPVRIPVQI@VQI@VQI@VQ MI0VPI0VPI0VPI`VOI`VOI`VOI`VNHPVNHPVNHPVMH@VMH@VMH@VLH@VLH0VL MH0VLH0VKH`VKH`VKH`RJGPRJGPRJGPRIGPRIG@RIG@RHG@RHG0RHG0RGG0RG MG`RGG`RFG`RFG`RFFPRFFPREFPREF@REF@RDF@RDF@RDF0RCF0RCF0RCF`RB MF`RBF`RBEPRAEPRAEPRAEPRAE@R@E@R@E@R@E0R?E0R?E0R?E0R>E`R>E`R> ME`R=DPN=DPN=DPN<D@N<D@N<D@N;D@N;D0N;D0N;D0N:D`N:D`N:D`N9D`N9 MCPN9CPN8CPN8C@N8C@N7C@N7C0N7C0N6C0N6C0N6C`N6C`N5C`N5BPN5BPN4 MBPN4BPN4B@N3B@N3B@N3B0N2B0N2B0N2B`N0APR.A1"+@A:$>R!Z<B]N9T5G M8%!D7E1?65U-2'LR+ZD<&\X/#N4+"NT+"NP.#><2$=\5%-H5%-H2$=\-#.D' M!_,%!?4("/$2$=\E(KX_/(Y;55QJ8T)A6U!&0H`E([P/#N0("/`1$.`I)[1* M1GAI8D!V;R5P:3%43V,P+:<3$ML'!_()">X:&<XZ-I-<5E%T;21_=P^!>0J` M>`M\=!-V;QUH83=95%-%0'LS+YXF([8<&LD8%]`4$]@5$]88%M$=',4E(K<N M*Z0Z-HQ*16Q:5$UG83%Q:AQX<!!Y<@MZ<@EZ<@EZ<@EY<@EY<0EY<0EX<0EX M<`EX<`EW<`EW;PEW;PEV;PEV;PEV;@AU;@AU;@AU;0AU;0AT;0AT;0AT;`AS M;`AS;`AS:PAR:PAR:PAR:@AQ:@AQ:@AQ:@AP:0AP:0AP:0AO:`AO:`AO:`AO M:`AN9PAN9PAN9PAM9@AM9@AM9@AL90AL90AL90AK90AK9`AK9`AJ9`AJ8PAJ M8PAJ8PAI8PAI8@AI8@=H8@=H80=H80=G80=G8`=G8`=F8`=F8`=F7P=E7P=E M7P=E7@=D7@=D7@=D7@=D70=C70=C70=C7`=B7`=B7`=B6P=A6P=A6P=A6P=@ M6@=@6@=@6@=?60=?60=?60=?6`=>6`=>6`=>6`==5P<``,N^#\N^#\N^#\J^ M#\J]#\J]#\F]#\F\#\F\#\B\#\B[#\B[#\B[#\>[#\>Z#\>Z#\:Z#\:Y#\:Y M#\6Y#\6Y#\6X#L2X#L2X#L2W#L.W#L.W#L.V#L*V#L*V#L*V#L*U#L&U#L&U M#L&T#L"T#L"T#L"T#K^S#K^S#K^S#KZR#KZR#KZR#KVQ#KVQ#KVQ#KVQ#KRP M#KRP#KRP#KNO#KNO#KNO#KJN#KJN#KJN#KFN#KFM#KFM#KBM#KBL#KBL#;>L M#;>L#;>K#;>K#;:K#;:J#;:J#;6J#;6I#;6I#;2I#;2I#;2H#;.H#;.H#;.G M#;*G#;*G#;*G#;*F#;&F#;&F#;&E#;"E#;"E#;"D#:^D#:^D#:^D#:ZC#:ZC M#:ZC#:VB#:VB#:VB#:RB#:RA#:RA#:RA#:N@#:N@#:N@#*J?#*J?#*J?#*F? M#*F>#*F>#*B>#*B=#*B=#*>=#*>=#*><#*><#*:<#*:;#*:;#*6;#*6:#*6: M#*2:#*2:#*29#*.9#*.9#*.8#**8#**8#**8#*&7#*&7#*&7#*&6#*"6#*"6 M#*"5#)^5#)^5#)^5#)Z4#)Z4#)Z4#)V3"YV3"YV3"YR3"YR2"YR2"YR2"YN1 M"YN1"YN1"YJ0"YJ0"YJ0"YF0"YF/"YF/"YB/"YB."YB."Y>."Y>."Y>-"Y:- M"Y:-"Y:,"Y:,"Y6,"Y6+"Y6+"Y2+"Y2+"Y2*"Y.*"Y.*"Y.)"Y*)"Y*)"Y*) M"Y"'#)"'#8^&#XN!%H5]'()Z(8%X)'IR+VIC25!+=S4RI"`>QQ,2W0H)[@<& M\P<&\P<'\P<'\P<&\P4%]@8&]`H*[143VB4CO3XZD5E38&QF/FYF.UE38#@U MFAL9S@L*ZPH)[1D8T3<SFUA37W)K+WAP)&=@0T9"?20BO0T,Z`<&\Q`/XB<E MMD=#>6=@/GIQ&H!X#8%Y"WYV$71M(65?/E!+9S@UDR4CN!85U0X-Y`@([P@( M[P4%]0@([PD([@T,Y@\.X143UAX<Q"TKI4`\@%1/6&5?-7%J''AP$'IR"WIR M"7IR"7IR"7ER"7EQ"7EQ"7AQ"7AP"7AP"7=P"7=P"7=O"79O"79O"79N"'5N M"'5N"'5M"'5M"'1M"'1M"'1L"'-L"'-L"'-K"')K"')K"')J"'%J"'%J"'%J M"'!I"'!I"'!I"'!H"&]H"&]H"&]H"&YG"&YG"&YG"&UF"&UF"&UF"&QE"&QE M"&QE"&ME"&MD"&MD"&ID"&IC"&IC"&IC"&EC"&EB"&EB!VAB!VAA!VAA!V=A M!V=@!V=@!V9@!V9@!V9?!V5?!V5?!V5>!V5>!V1>!V1>!V1=!V-=!V-=!V-< M!V)<!V)<!V);!V%;!V%;!V%;!V!:!V!:!V!:!U]9!U]9!U]9!U]9!UY8!UY8 M!UY8!P``S+\/R[X/R[X/R[X/RKX/RKT/RKT/R;T/R;P/R;P/R;P/R+L/R+L/ MR+L/Q[L/Q[H/Q[H/QKH/QKD/QKD/Q;D/Q;D/Q;@.Q+@.Q+@.Q+<.P[<.P[<. MP[8.P[8.PK8.PK8.PK4.P;4.P;4.P;0.P+0.P+0.P+0.O[,.O[,.O[,.OK(. MOK(.OK(.OK$.O;$.O;$.O;$.O+`.O+`.O+`.NZ\.NZ\.NZ\.NJ\.NJX.NJX. MN:X.N:T.N:T.N*T.N*P.N*P.N*P-MZP-MZL-MZL-MJL-MJH-MJH-M:H-M:H- MM:D-M*D-M*D-M*@-LZ@-LZ@-LZ<-LZ<-LJ<-LJ<-LJ8-L:8-L:8-L:4-L*4- ML*4-L*4-KZ0-KZ0-KZ0-KJ,-KJ,-KJ,-K:(-K:(-K:(-K:(-K*$-K*$-K*$- MJZ`-JZ`-JZ`,JJ`,JI\,JI\,J9\,J9X,J9X,J)X,J)T,J)T,J)T,IYT,IYP, MIYP,IIP,IIL,IIL,I9L,I9L,I9H,I)H,I)H,I)D,HYD,HYD,HY@,HI@,HI@, MHI@,HI<,H9<,H9<,H98,H)8,H)8,H)8,GY4,GY4,GY4,GI0,GI0,GI0,G9,+ MG9,+G9,+G9,+G)(+G)(+G)(+FY$+FY$+FY$+FI$+FI`+FI`+F9`+F8\+F8\+ MF(\+F(X+F(X+EXX+EXX+EXT+EXT+EHT+EHP+EHP+E8P+E8P+E8L+E(L+E(L+ ME(H+DXH+DXH+DXD+DHD+DHD+DHD+DH@+D8@+D(<-CX4/C80/C800B8$6?G8G M;&5'5E!L/SN2+"FS'AS,$Q+>#@WG#`OK"@KM#`OJ#`OJ$Q'>'1S++BNM1#^( M6E1?<6DW>'`K:V4_34AU*BBS$A'>"0CP#@WF(R&_14&"95Y(=V\H<VPN6U59 M.#28&AC0"0GN"`CP%Q;4-#&>5E!@;V@O?784@7D,?W</=W`=9V$\3DEJ-#"= M'!O)#P[B"0CN"`?Q"0CO"POI#`OH#P[B#0SE#0SF"@GL"@GL#`OH%Q;2)R6R M/3F&54]7:6(P<VP8>'`/>W,*>G()>G()>G()>7()>7$)>7$)>'$)>'`)>'`) M=W`)=W`)=V\)=F\)=F\)=FX(=FX(=6X(=6T(=6T(=&T(=&T(=&P(<VP(<VP( M<VL(<FL(<FL(<FL(<6H(<6H(<6H(<6D(<&D(<&D(<&@(;V@(;V@(;V@(;F<( M;F<(;F<(;68(;68(;68(;&8(;&4(;&4(:V4(:V0(:V0(:V0(:F,(:F,(:F,( M:6,(:6((:6(':&(':&$':&$'9V$'9V$'9V`'9F`'9F`'9E\'9E\'95\'95X' M95X'9%X'9%X'9%T'8UT'8UT'8UP'8EP'8EP'8EP'85L'85L'85L'8%H'8%H' M8%H'8%D'7UD'7UD'7UD'7E@'7E@'``#,OP_,OP_+O@_+O@_+O@_*O@_*O0_* MO0_)O0_)O`_)O`_)O`_(O`_(NP_(NP_'NP_'N@_'N@_&N@_&N0_&N0_%N0_% MN0_%N`[$N`[$N`[$MP[$MP[#MP[#MP[#M@["M@["M@["M0[!M0[!M0[!M`[` MM`[`M`[`M`Z_LPZ_LPZ_LPZ^L@Z^L@Z^L@Z^L@Z]L0Z]L0Z]L0Z\L`Z\L`Z\ ML`Z[KPZ[KPZ[KPZZKPZZK@ZZK@ZYK@ZYK0ZYK0ZYK0ZXK0ZXK`ZXK`VWK`VW MJPVWJPVVJPVVJ@VVJ@VUJ@VUJ@VUJ0VTJ0VTJ0VTJ`VSJ`VSJ`VSJ`VSIPVR MIPVRIPVRI@VQI@VQI@VQI0VPI0VPI0VPI0VOI`VOI`VOI`VNHPVNHPVNHPVN MHPVMH@VMH@VMH@VLH0VLH0VLH0VKH`VKH`VKH`VJH`RJGPRJGPRIGPRIG@RI MG@RHG@RHG@RHG0RHG0RGG0RGG`RGG`RFG`RFFPRFFPREFPREFPREF@RDF@RD MF@RDF0RCF0RCF0RCF`RCF`RBF`RBF`RBEPRAEPRAEPRAE@R@E@R@E@R@E@R? ME0R?E0R?E0R>E`R>E`R>E`R=DPN=DPN=DPN=DPN<D@N<D@N<D@N;D0N;D0N; MD0N:D0N:D`N:D`N9D`N9CPN9CPN8CPN8C@N8C@N8C@N7C@N7C0N7C0N6C0N6 MC`N6C`N5C`N5C`N5BPN4BPN4BPN4B@N3B@N3B@N3B0N2B0N2B0N2B0N2B`N1 MB`N1B`N1APN/A@N.A0V*@A2!>2)T;#EB7%=02W8_.Y$R+JDH)KDC(<(B(,,C M(<(H);HP+:I`/(]13'!D7DYU;3%_>!UZ<B=E7DP_/(X>',D+"^L'!_(3$MPO M+*E236IO:35Z<B)N9CA-2',J)[,1$.`'!O,,"^DA'\)"/H5B7$EW;R)_>!&! M>0U\<Q=M9C%43V`V,YD=&\@,"^@&!O,("/`.#>06%=4?'<,E([@G)+0D(KH= M&\86%-4/#N(+"^D-#.86%-4G);$_.X-84E%J9"QU;A5Z<@Q[<PEZ<PEZ<@EZ M<@EY<@EY<0EY<0EX<0EX<`EX<`EW<`EW<`EW;PEW;PEV;PEV;@AV;@AU;@AU M;@AU;0AT;0AT;0AT;`AS;`AS;`AS:PAR:PAR:PAR:PAQ:@AQ:@AQ:@AQ:0AP M:0AP:0AP:0AO:`AO:`AO:`AN9PAN9PAN9PAM9@AM9@AM9@AL9@AL90AL90AL M90AK9`AK9`AK9`AJ9`AJ8PAJ8PAI8PAI8@AI8@=H8@=H80=H80=G80=G80=G M8`=F8`=F8`=F7P=F7P=E7P=E7P=E7@=D7@=D7@=D70=C70=C70=C7`=B7`=B M7`=B7`=A6P=A6P=A6P=A6@=@6@=@6@=@6@=?60=?60=?60=>6`<``,R_#\R_ M#\R_#\N_#\N^#\N^#\J^#\J]#\J]#\J]#\F\#\F\#\F\#\B\#\B[#\B[#\>[ M#\>Z#\>Z#\:Z#\:Z#\:Y#\6Y#\6Y#\6X#L6X#L2X#L2W#L2W#L.W#L.W#L.V M#L*V#L*V#L*U#L&U#L&U#L&U#L"T#L"T#L"T#K^S#K^S#K^S#K^R#KZR#KZR M#KZR#KVQ#KVQ#KVQ#KRP#KRP#KRP#KNO#KNO#KNO#KJO#KJN#KJN#KJN#KFM M#KFM#KFM#KBM#KBL#KBL#;>L#;>K#;>K#;:K#;:J#;:J#;6J#;6J#;6I#;2I M#;2I#;2H#;2H#;.H#;.H#;.G#;*G#;*G#;*F#;&F#;&F#;&E#;"E#;"E#;"E M#:^D#:^D#:^D#:^C#:ZC#:ZC#:ZC#:VB#:VB#:VB#:RA#:RA#:RA#:N@#:N@ M#:N@#:J@#*J?#*J?#*F?#*F>#*F>#*F>#*B>#*B=#*B=#*>=#*><#*><#*:< M#*:;#*:;#*6;#*6;#*6:#*2:#*2:#*29#*29#*.9#*.9#*.8#**8#**8#**7 M#*&7#*&7#*&6#*"6#*"6#*"6#)^5#)^5#)^5#)Z4#)Z4#)Z4#)Z4#)V3"YV3 M"YV3"YR2"YR2"YR2"YN1"YN1"YN1"YJ1"YJ0"YJ0"YF0"YF/"YF/"YF/"YB/ M"YB."YB."Y>."Y>-"Y>-"Y:-"Y:,"Y:,"Y6,"Y6,"Y6+"Y2+"Y2+"Y2*"Y.* M"Y.*"Y.*"Y.)"Y*)"Y*)"Y*("Y&("Y&("Y&'"Y"'"X^&#(N#$H5]&WQU*G)K M/&9?3UM685%,<TQ'?$I%?TM&?%%,<UE48F9?37)J.'MS)H-[%X-[%W1N,%=1 M9#(OIQ,2W`<'\PD(\!P;S#TYD6%:47AP)WAQ)F1=23\[C1P:S`H)[0<&\Q(1 MWBPJK4]*;6QE-WQU&()Y#H!Y#W9O(6!:2T$]A"(@O@X-Y`4%]08&\P\.XQT; MR"XKICXZB$E$<TI%<$1`>SLXC"\LHR`>P!,2V@P,YPT,Y1@6T2PIJ$="<U]9 M0W!I(7=O$7MS"GMS"7IS"7IR"7IR"7ER"7EQ"7EQ"7AQ"7AQ"7AP"7AP"7=P M"7=O"7=O"79O"79N"'9N"'5N"'5N"'5M"'1M"'1M"'1L"'-L"'-L"'-L"')K M"')K"')K"')J"'%J"'%J"'%I"'!I"'!I"'!I"&]H"&]H"&]H"&YG"&YG"&YG M"&UF"&UF"&UF"&UF"&QE"&QE"&QE"&MD"&MD"&MD"&ID"&IC"&IC"&EC"&EB M"&EB!VAB!VAA!VAA!V=A!V=A!V=@!V=@!V9@!V9?!V9?!V5?!V5?!V5>!V1> M!V1>!V1=!V-=!V-=!V-<!V)<!V)<!V)<!V);!V%;!V%;!V%:!V!:!V!:!V!: M!U]9!U]9!U]9!P``S<`/S+\/S+\/S+\/R[\/R[X/R[X/R[X/RKT/RKT/RKT/ MR;P/R;P/R;P/R+P/R+L/R+L/Q[L/Q[H/Q[H/QKH/QKH/QKD/Q;D/Q;D/Q;@. MQ;@.Q+@.Q+<.Q+<.P[<.P[<.P[8.PK8.PK8.PK4.P;4.P;4.P;4.P+0.P+0. MP+0.P+,.O[,.O[,.O[(.OK(.OK(.OK(.O;$.O;$.O;$.O+`.O+`.O+`.N[`. MNZ\.NZ\.NJ\.NJX.NJX.NJX.N:T.N:T.N:T.N*T.N*P.N*P-MZP-MZL-MZL- MMJL-MJL-MJH-M:H-M:H-M:D-M:D-M*D-M*@-M*@-LZ@-LZ@-LZ<-LJ<-LJ<- MLJ8-L:8-L:8-L:8-L*4-L*4-L*4-KZ0-KZ0-KZ0-KZ,-KJ,-KJ,-KJ,-K:(- MK:(-K:(-K*$-K*$-K*$-JZ$-JZ`-JZ`-JJ`,JI\,JI\,JI\,J9X,J9X,J9X, MJ)X,J)T,J)T,IYT,IYP,IYP,IIP,IIP,IIL,I9L,I9L,I9H,I)H,I)H,I)D, MI)D,HYD,HYD,HY@,HI@,HI@,HI<,H9<,H9<,H9<,H)8,H)8,H)8,GY4,GY4, MGY4,GY0,GI0,GI0,GI0,G9,+G9,+G9,+G)(+G)(+G)(+FY(+FY$+FY$+FI$+ MFI`+FI`+F9`+F8\+F8\+F8\+F(\+F(X+F(X+EXX+EXT+EXT+EHT+EHT+EHP+ ME8P+E8P+E8L+E(L+E(L+E(H+E(H+DXH+DXH+DXD+DHD+DHD+DH@+D8@+D8@+ MD8@+D(<+CX8,C80/BH$3AWX8@GH@?'0J=6XU<FH[<&D]<FLY=6XS>W,I?W<A MA'P7B'\2AW\1?W<?:F-$1T.`)"*_#@WG!@;S#P[E*"6X3$=W;&4]>W,A=&PO M5E%B,2VG$Q'=!@;S!P?R&1?2.#286U97=6TG@'@2@GL-?G85;V@O4DUE+RRG M%!/9!@;S`P/Y"`?Q%A36*B>O1#]^5U)795\]9%X^85M$65-334AJ.C>-)R6S M%Q73#@WD#P[A'AS$-S.34TU;:F,N=FX6>G(,>W,*>W,)>G,)>G()>G()>7() M>7$)>7$)>'$)>'$)>'`)>'`)=W`)=V\)=V\)=F\)=FX(=FX(=6X(=6X(=6T( M=&T(=&T(=&P(<VP(<VP(<VP(<VL(<FL(<FL(<FH(<6H(<6H(<6D(<&D(<&D( M<&D(;V@(;V@(;V@(;F<(;F<(;F<(;6<(;68(;68(;68(;&4(;&4(;&4(:V0( M:V0(:V0(:F0(:F,(:F,(:6,(:6((:6(':&(':&(':&$':&$'9V$'9V`'9V`' M9F`'9E\'9E\'95\'95\'95X'9%X'9%X'9%T'8UT'8UT'8UT'8EP'8EP'8EP' M8EL'85L'85L'85H'8%H'8%H'8%H'7UD'7UD'``#-P`_-P`_,OP_,OP_,OP_, MOP_+O@_+O@_+O@_*O0_*O0_*O0_)O0_)O`_)O`_(O`_(NP_(NP_'NP_'N@_' MN@_&N@_&N@_&N0_&N0_%N0_%N`[%N`[$N`[$N`[$MP[#MP[#MP[#M@["M@[" MM@["M0[!M0[!M0[!M0[!M`[`M`[`M`[`LPZ_LPZ_LPZ_LPZ^L@Z^L@Z^L@Z] ML0Z]L0Z]L0Z\L`Z\L`Z\L`Z[L`Z[KPZ[KPZ[KPZZK@ZZK@ZZK@ZYK@ZYK0ZY MK0ZXK0ZXK`ZXK`VWK`VWJPVWJPVVJPVVJPVVJ@VVJ@VUJ@VUJ0VUJ0VTJ0VT MJ0VTJ`VSJ`VSJ`VSIPVRIPVRIPVRI@VQI@VQI@VQI@VPI0VPI0VPI0VPI`VO MI`VOI`VOI`VNHPVNHPVNHPVMH@VMH@VMH@VLH0VLH0VLH0VKH0VKH`VKH`VK MH`RJGPRJGPRJGPRIGPRIG@RIG@RHG@RHG0RHG0RGG0RGG`RGG`RFG`RFG`RF MFPREFPREFPREF@REF@RDF@RDF@RDF0RCF0RCF0RCF`RBF`RBF`RBEPRAEPRA MEPRAEPR@E@R@E@R@E@R@E0R?E0R?E0R?E`R>E`R>E`R>E`R=DPN=DPN=DPN< MD@N<D@N<D@N;D@N;D0N;D0N:D0N:D`N:D`N:D`N9CPN9CPN9CPN8CPN8C@N8 MC@N7C@N7C0N7C0N6C0N6C0N6C`N5C`N5C`N5BPN5BPN4BPN4B@N4B@N3B@N3 MB@N3B0N2B0N2B0N2B`N1B`N1B`N1B`N0APN/A@N/A@N-A`V,@P^+@A*(?Q:& M?A>&?A>'?A:'?Q2)@!**@0^+@@R+@@R(?Q%[="9@6E4\.)4<&LX+"NP*">X9 M%],V,I]94V!T;#!Y<B5I8D-'0WXD(KX-#.@%!?4+"NP>'<=!/(EC74EY<B"" M>1"">@YZ<QQF8$%$0(`A'\(+"NL#`OH#`OH("/`6%=4K**U"/H)54%QB7$)H M8C9L9B]I8C-C73]53UL_.X0G);,5%-8.#>,5%-8K**M(0W%B6SUR:QQZ<@Y[ M=`I[<PE[<PEZ<PEZ<@EZ<@EY<@EY<0EY<0EY<0EX<0EX<`EX<`EW<`EW;PEW M;PEV;PEV;PEV;@AU;@AU;@AU;0AT;0AT;0AT;`AT;`AS;`AS;`AS:PAR:PAR M:PAR:@AQ:@AQ:@AQ:@AP:0AP:0AP:0AO:`AO:`AO:`AN9PAN9PAN9PAN9PAM M9@AM9@AM9@AL90AL90AL90AK90AK9`AK9`AJ9`AJ8PAJ8PAI8PAI8@AI8@=I M8@=H8@=H80=H80=G80=G8`=G8`=F8`=F8`=F7P=E7P=E7P=E7@=D7@=D7@=D M70=C70=C70=C70=C7`=B7`=B7`=B6P=A6P=A6P=A6P=@6@=@6@=@6@=?60<` M`,W`#\W`#\W`#\S`#\R_#\R_#\R_#\N^#\N^#\N^#\J]#\J]#\J]#\F]#\F\ M#\F\#\B\#\B[#\B[#\>[#\>[#\>Z#\>Z#\:Z#\:Y#\:Y#\6Y#\6X#L6X#L2X M#L2X#L2W#L.W#L.W#L.V#L*V#L*V#L*V#L&U#L&U#L&U#L&T#L"T#L"T#L"S M#K^S#K^S#K^S#KZR#KZR#KZR#KVQ#KVQ#KVQ#KRQ#KRP#KRP#KRP#KNO#KNO M#KNO#KJN#KJN#KJN#KFN#KFM#KFM#KBM#KBL#KBL#;>L#;>K#;>K#;:K#;:K M#;:J#;:J#;6J#;6I#;6I#;2I#;2I#;2H#;.H#;.H#;.G#;*G#;*G#;*F#;&F M#;&F#;&F#;&E#;"E#;"E#;"D#:^D#:^D#:^D#:ZC#:ZC#:ZC#:VB#:VB#:VB M#:RA#:RA#:RA#:NA#:N@#:N@#:N@#*J?#*J?#*J?#*F?#*F>#*F>#*B>#*B= M#*B=#*>=#*><#*><#*:<#*:<#*:;#*:;#*6;#*6:#*6:#*2:#*2:#*29#*.9 M#*.9#*.8#**8#**8#**7#*&7#*&7#*&7#*"6#*"6#*"6#*"5#)^5#)^5#)^5 M#)Z4#)Z4#)Z4#)V3"YV3"YV3"YR2"YR2"YR2"YN2"YN1"YN1"YN1"YJ0"YJ0 M"YJ0"YF0"YF/"YF/"YB/"YB."YB."Y>."Y>-"Y>-"Y:-"Y:-"Y:,"Y6,"Y6, M"Y6+"Y6+"Y2+"Y2+"Y2*"Y.*"Y.*"Y.)"Y*)"Y*)"Y*("Y&("Y&("Y&("Y"' M"Y"'"I"'"I"&"HZ%"XZ%#(Z%#(V$#(V$#(V$"XR#"XR#"XV$"HN""XA_$GEQ M+%U77#DVFAT<RP\.Y!$0X"0BOT5!A&9@2'AP*'=O*UY85CDUF!H8T`@(\`0# M^`L*ZR$?PT(^AF-=27AQ(8%Y$H!X$W5M*%Q653@UEQ@6TP<'\@(!_`(!_`8& M\Q`/X1\<Q2TJJ3TYBDM&<%9166!:1F9@.F=A-V%;0U%,8CDUD20ANA<6TA<5 MTR4BMS\[@UU72&]H(GEQ$'MS"WMT"7MS"7MS"7IS"7IR"7IR"7IR"7ER"7EQ M"7EQ"7AQ"7AP"7AP"7=P"7=O"7=O"79O"79O"79N"'5N"'5N"'5M"'1M"'1M M"'1M"'1L"'-L"'-L"'-K"')K"')K"')J"'%J"'%J"'%J"'!I"'!I"'!I"&]H M"&]H"&]H"&]H"&YG"&YG"&YG"&UF"&UF"&UF"&QE"&QE"&QE"&ME"&MD"&MD M"&ID"&IC"&IC"&EC"&EB"&EB"&EB!VAB!VAA!VAA!V=A!V=@!V=@!V9@!V9@ M!V9?!V5?!V5?!V5>!V1>!V1>!V1=!V1=!V-=!V-=!V-<!V)<!V)<!V);!V%; M!V%;!V%;!V!:!V!:!V!:!P``SL$/S<`/S<`/S<`/S<`/S+\/S+\/S+\/R[X/ MR[X/R[X/RKT/RKT/RKT/R;T/R;P/R;P/R+P/R+L/R+L/R+L/Q[L/Q[H/Q[H/ MQKH/QKD/QKD/Q;D/Q;@.Q;@.Q+@.Q+@.Q+<.P[<.P[<.P[8.PK8.PK8.PK8. MPK4.P;4.P;4.P;0.P+0.P+0.P+,.O[,.O[,.O[,.OK(.OK(.OK(.O;$.O;$. MO;$.O;$.O+`.O+`.O+`.NZ\.NZ\.NZ\.NJX.NJX.NJX.N:X.N:T.N:T.N*T. MN*P.N*P-MZP-MZP-MZL-MZL-MJL-MJH-MJH-M:H-M:D-M:D-M*D-M*D-M*@- MLZ@-LZ@-LZ<-LJ<-LJ<-LJ<-LJ8-L:8-L:8-L:4-L*4-L*4-L*0-KZ0-KZ0- MKZ0-KJ,-KJ,-KJ,-K:(-K:(-K:(-K*(-K*$-K*$-K*$-JZ`-JZ`-JZ`,JI\, MJI\,JI\,J9\,J9X,J9X,J)X,J)T,J)T,IYT,IYT,IYP,IYP,IIP,IIL,IIL, MI9L,I9H,I9H,I)H,I)H,I)D,HYD,HYD,HY@,HI@,HI@,HI@,H9<,H9<,H9<, MH98,H)8,H)8,H)4,GY4,GY4,GY4,GI0,GI0,GI0,G9,+G9,+G9,+G),+G)(+ MG)(+G)(+FY$+FY$+FY$+FI`+FI`+FI`+F9`+F8\+F8\+F(\+F(X+F(X+EXX+ MEXX+EXT+EHT+EHT+EHP+EHP+E8P+E8L+E8L+E(L+E(L+E(H+DXH+DXH+DXD+ MDHD+DHD+DHD+D8@+D8@+D8@+D8<+D(<*D(<*D(8*CX8*CX8*CX8*CH4*CH4* MCH4*C80*C80*C(,+B(`1?'0F9%Y01T."+RRK(B##)"+`.#2<5U%E<FHU>7(F M;F<Z4$IQ*RFQ$A#?!03V`P+Z"@GM'1O*/3F07EA4=&PK?W<6?G87;V@R4DQH M+RRI$Q+<!@7T`@'\`@+[!07U"@KL$`_A%A75'QW$*BBN-S261$!]4$MF6513 M7UA)5U%71T)V-C.6*"6Q(B"\*BBL03V`7%9+<&DC>7$0?'0*?'0)>W0)>W,) M>W,)>W,)>G()>G()>G()>7()>7$)>7$)>'$)>'`)>'`)=W`)=V\)=V\)=F\) M=F\)=FX(=6X(=6X(=6T(=6T(=&T(=&T(=&P(<VP(<VP(<VL(<FL(<FL(<FH( M<6H(<6H(<6H(<&D(<&D(<&D(<&@(;V@(;V@(;V@(;F<(;F<(;F<(;68(;68( M;68(;&4(;&4(;&4(:V4(:V0(:V0(:F0(:F,(:F,(:F,(:6,(:6((:6(':&(' M:&$':&$'9V$'9V`'9V`'9F`'9F`'9E\'95\'95\'95X'95X'9%X'9%X'9%T' M8UT'8UT'8UP'8EP'8EP'8EL'85L'85L'85L'8%H'8%H'``#.P0_.P0_.P`_- MP`_-P`_-P`_,OP_,OP_,OP_+O@_+O@_+O@_*O@_*O0_*O0_)O0_)O`_)O`_( MO`_(NP_(NP_(NP_'NP_'N@_'N@_&N@_&N0_&N0_%N0_%N0_%N`[$N`[$N`[$ MMP[#MP[#MP[#M@[#M@["M@["M@["M0[!M0[!M0[!M`[`M`[`M`[`M`Z_LPZ_ MLPZ_LPZ^L@Z^L@Z^L@Z]L0Z]L0Z]L0Z]L0Z\L`Z\L`Z\L`Z[KPZ[KPZ[KPZZ MKPZZK@ZZK@ZYK@ZYK0ZYK0ZXK0ZXK`ZXK`ZXK`VWK`VWJPVWJPVVJPVVJ@VV MJ@VUJ@VUJ@VUJ0VTJ0VTJ0VTJ`VSJ`VSJ`VSIPVRIPVRIPVRIPVRI@VQI@VQ MI@VQI0VPI0VPI0VPI0VOI`VOI`VOI`VNHPVNHPVNHPVMH@VMH@VMH@VMH@VL MH0VLH0VLH0VKH`VKH`VKH`RJH`RJGPRJGPRIGPRIG@RIG@RHG@RHG0RHG0RG MG0RGG0RGG`RGG`RFG`RFFPRFFPREFPREFPREF@RDF@RDF@RDF0RCF0RCF0RC MF`RBF`RBF`RBF`RBEPRAEPRAEPRAE@R@E@R@E@R@E@R?E0R?E0R?E0R>E`R> ME`R>E`R=DPN=DPN=DPN<DPN<D@N<D@N<D@N;D0N;D0N;D0N:D`N:D`N:D`N9 MD`N9CPN9CPN8CPN8C@N8C@N7C@N7C@N7C0N7C0N6C0N6C`N6C`N5C`N5BPN5 MBPN4BPN4BPN4B@N3B@N3B@N3B0N2B0N2B0N2B0N1B`N1B`N1B`N1APN0APJ0 MAPJ0A@J/A@J/A@J/A@J.A0J.A0J.A0J-A`J+@@Z'?A5\=29N9S]=5UU-2'A" M/HM!/8Q12W%H8D9Z<B9Z<B=E7TI!/8L?'<<+"^L#`OH"`OL'!_(7%M4R+J50 M2VUI8S]X<"1Y<2)I8SY+1G4I)K00#^$&!?0%!/8(!_$,"^D.#>4-#.8,"^D- M#.<3$ML;&<PE([@Q+J$].8I'0G=+1FY)1')"/G\[.(PW,Y0[.(M+1FQ@6D)Q M:B%Z<A!\=0I\=`E\=`E[=`E[<PE[<PE[<PEZ<@EZ<@EZ<@EY<@EY<0EY<0EX M<0EX<`EX<`EW<`EW<`EW;PEV;PEV;PEV;@AV;@AU;@AU;0AU;0AT;0AT;0AT M;`AS;`AS;`AS:PAR:PAR:PAR:PAQ:@AQ:@AQ:@AP:0AP:0AP:0AP:`AO:`AO M:`AO:`AN9PAN9PAN9PAM9@AM9@AM9@AL9@AL90AL90AK90AK9`AK9`AK9`AJ M8PAJ8PAJ8PAI8PAI8@AI8@=H8@=H80=H80=G80=G80=G8`=F8`=F8`=F7P=E M7P=E7P=E7@=E7@=D7@=D7@=D70=C70=C70=C7`=B7`=B7`=B7`=A6P=A6P=A M6P=@6@<``,_!#\[!#\[!#\[!#\W`#\W`#\W`#\R_#\R_#\R_#\N^#\N^#\N^ M#\J^#\J]#\J]#\F]#\F\#\F\#\F\#\B\#\B[#\B[#\>[#\>Z#\>Z#\:Z#\:Y M#\:Y#\6Y#\6Y#\6X#L2X#L2X#L2W#L2W#L.W#L.W#L.V#L*V#L*V#L*U#L&U M#L&U#L&T#L"T#L"T#L"T#K^S#K^S#K^S#KZR#KZR#KZR#KZR#KVQ#KVQ#KVQ M#KRP#KRP#KRP#KNO#KNO#KNO#KJO#KJN#KJN#KFN#KFM#KFM#KFM#KBM#KBL M#KBL#;>L#;>K#;>K#;:K#;:J#;:J#;6J#;6J#;6I#;2I#;2I#;2H#;.H#;.H M#;.G#;.G#;*G#;*G#;*F#;&F#;&F#;&E#;"E#;"E#;"E#:^D#:^D#:^D#:ZC M#:ZC#:ZC#:ZB#:VB#:VB#:VB#:RA#:RA#:RA#:N@#:N@#:N@#:J@#*J?#*J? M#*F?#*F>#*F>#*B>#*B=#*B=#*B=#*>=#*><#*><#*:<#*:;#*:;#*6;#*6; M#*6:#*2:#*2:#*29#*.9#*.9#*.8#*.8#**8#**8#**7#*&7#*&7#*&6#*"6 M#*"6#*"6#)^5#)^5#)^5#)Z4#)Z4#)Z4#)V3"YV3"YV3"YV3"YR2"YR2"YR2 M"YN1"YN1"YN1"YJ1"YJ0"YJ0"YF0"YF/"YF/"YB/"YB."YB."YB."Y>."Y>- M"Y>-"Y:-"Y:,"Y:,"Y6,"Y6,"Y6+"Y2+"Y2+"Y2*"Y.*"Y.*"Y.)"Y*)"Y*) M"Y*)"Y*("Y&("Y&("Y&'"Y"'"I"'"I"'"H^&"H^&"H^&"HZ%"HZ%"HR##89^ M%G]W(W)K.6EB2&);5&!:5UY86F-<46QE07IR*(!Y&WEQ*%Y863<TG!@6U0D) M[P0$]P0$]P8%]`T,Z"$?PSTYD%E37FYG-G1L+&9?14=#>R<DN`\.XP<'\@H) M[1,2VQP:RR`>PQP:RA44UPX-Y`P+Z0T,YQ$0WA@6TB`>PBDGL#,PG3LWCC\[ MA4$]@D0_?$M&;%=25&AA-'1L&WMS#GUU"GQU"7QT"7QT"7QT"7MS"7MS"7MS M"7IS"7IR"7IR"7ER"7EQ"7EQ"7AQ"7AP"7AP"7=P"7=P"7=O"7=O"79O"79N M"'9N"'5N"'5N"'5M"'1M"'1M"'1L"'-L"'-L"'-K"')K"')K"')K"'%J"'%J M"'%J"'%I"'!I"'!I"'!I"&]H"&]H"&]H"&YG"&YG"&YG"&UF"&UF"&UF"&QF M"&QE"&QE"&QE"&MD"&MD"&MD"&IC"&IC"&IC"&EC"&EB"&EB!VAB!VAA!VAA M!V=A!V=A!V=@!V9@!V9@!V9?!V9?!V5?!V5>!V5>!V1>!V1>!V1=!V-=!V-= M!V-<!V)<!V)<!V)<!V%;!V%;!V%;!P``S\(/S\$/SL$/SL$/SL$/S<`/S<`/ MS<`/S+\/S+\/S+\/R[X/R[X/R[X/RKX/RKT/RKT/RKT/R;P/R;P/R;P/R+P/ MR+L/R+L/Q[L/Q[H/Q[H/QKH/QKD/QKD/Q;D/Q;D/Q;@.Q+@.Q+@.Q+<.Q+<. MP[<.P[<.P[8.PK8.PK8.PK4.P;4.P;4.P;0.P+0.P+0.P+0.O[,.O[,.O[,. MO[(.OK(.OK(.OK(.O;$.O;$.O;$.O+`.O+`.O+`.NZ\.NZ\.NZ\.NJ\.NJX. MNJX.N:X.N:T.N:T.N:T.N*T.N*P.N*P-MZP-MZL-MZL-MJL-MJH-MJH-M:H- MM:H-M:D-M*D-M*D-M*@-M*@-LZ@-LZ@-LZ<-LJ<-LJ<-LJ8-L:8-L:8-L:4- ML*4-L*4-L*4-KZ0-KZ0-KZ0-KJ,-KJ,-KJ,-KJ,-K:(-K:(-K:(-K*$-K*$- MK*$-JZ`-JZ`-JZ`-JJ`,JI\,JI\,J9\,J9X,J9X,J9X,J)X,J)T,J)T,IYT, MIYP,IYP,IIP,IIL,IIL,I9L,I9L,I9H,I)H,I)H,I)D,HYD,HYD,HYD,HY@, MHI@,HI@,HI<,H9<,H9<,H98,H)8,H)8,H)8,GY4,GY4,GY4,GI0,GI0,GI0, MGI0,G9,+G9,+G9,+G)(+G)(+G)(+FY$+FY$+FY$+FI$+FI`+FI`+F9`+F8\+ MF8\+F(\+F(\+F(X+F(X+EXX+EXT+EXT+EHT+EHP+EHP+E8P+E8P+E8L+E(L+ ME(L+E(H+DXH+DXH+DXH+DXD+DHD+DHD+DH@+D8@+D8@+D8<+D(<*D(<*D(<* MCX8*CX8*CX8*C80+BH$2?G8E:V5%6%)F34AX3TIV651B9E]-<VPU>W,F@WH8 M@WL7>'$J7UE7/#B5(B#"%!/;#P[D#`SI"@KM"PKL%1/:*RBQ1T)^8EQ,;F@U M9V!#2D5X)R2X$`_B"`CP#P[C(1_",R^A.S>1.#66+BNI(1_`&1?0$Q+;#P[C M#0SF#@WD$A#=&QG,)"&[+"FK-#&;/SN$3DEI7%=+;&4M=V\7>W,-?74)?74) M?74)?'0)?'0)?'0)>W,)>W,)>W,)>G,)>G()>G()>7()>7$)>7$)>'$)>'`) M>'`)=W`)=W`)=V\)=V\)=F\)=FX(=FX(=6X(=6X(=6T(=&T(=&T(=&P(<VP( M<VP(<VL(<FL(<FL(<FL(<FH(<6H(<6H(<6D(<&D(<&D(<&D(;V@(;V@(;V@( M;F<(;F<(;F<(;68(;68(;68(;&8(;&4(;&4(;&4(:V0(:V0(:V0(:F0(:F,( M:F,(:6,(:6((:6(':&(':&$':&$'9V$'9V$'9V`'9V`'9F`'9E\'9E\'95\' M95\'95X'9%X'9%X'9%T'8UT'8UT'8UP'8EP'8EP'8EP'8EL'85L'``#/P@_/ MP@_/P0_.P0_.P0_.P0_-P`_-P`_-P`_,OP_,OP_,OP_+OP_+O@_+O@_+O@_* MO0_*O0_*O0_)O`_)O`_)O`_(O`_(NP_(NP_'NP_'N@_'N@_&N@_&N@_&N0_% MN0_%N0_%N`[%N`[$N`[$MP[$MP[#MP[#MP[#M@["M@["M@["M0[!M0[!M0[! MM0[`M`[`M`[`M`[`LPZ_LPZ_LPZ_L@Z^L@Z^L@Z^L@Z]L0Z]L0Z]L0Z\L`Z\ ML`Z\L`Z[L`Z[KPZ[KPZZKPZZK@ZZK@ZZK@ZYK0ZYK0ZYK0ZXK0ZXK`ZXK`VW MK`VWJPVWJPVVJPVVJPVVJ@VUJ@VUJ@VUJ0VUJ0VTJ0VTJ`VTJ`VSJ`VSJ`VS MIPVRIPVRIPVRI@VQI@VQI@VQI@VPI0VPI0VPI0VOI`VOI`VOI`VOHPVNHPVN MHPVNHPVMH@VMH@VMH@VLH0VLH0VLH0VKH0VKH`VKH`VJH`RJGPRJGPRJGPRI MG@RIG@RIG@RHG@RHG0RHG0RGG0RGG`RGG`RFG`RFG`RFFPREFPREFPREF@RD MF@RDF@RDF0RDF0RCF0RCF0RCF`RBF`RBF`RBEPRAEPRAEPRAEPR@E@R@E@R@ ME@R?E0R?E0R?E0R?E`R>E`R>E`R>E`R=DPN=DPN=DPN<D@N<D@N<D@N;D@N; MD0N;D0N:D0N:D`N:D`N9D`N9CPN9CPN9CPN8CPN8C@N8C@N7C@N7C0N7C0N6 MC0N6C`N6C`N5C`N5C`N5BPN4BPN4BPN4B@N4B@N3B@N3B@N3B0N2B0N2B0N2 MB`N1B`N1B`N1APN0APN0APJ0APJ/A@J/A@J-A`V%?1ES:SE646HZ-YHM*K`Q M+JE!/8Y74F9M9D%^=B.&?12&?1-]=2-J8T113&\].9,N*ZTF)+L@'L88%M4/ M#N01$.`B'\(^.H]<5EAN9S=H8D%.27$L*:X3$MP*"NP3$MPG);9!/8923696 M45].26Y"/H,V,IHI)K(?'<44$]@.#>0*">P-#.<1$-\6%=4?'<,M*JA!/8%9 M4U-L92UX<!5]=0Q^=@I]=0E]=0E]=0E\=`E\=`E\=`E[<PE[<PE[<PEZ<PEZ M<@EZ<@EY<@EY<0EY<0EX<0EX<0EX<`EX<`EW<`EW;PEW;PEV;PEV;@AV;@AU M;@AU;@AU;0AT;0AT;0AT;`AS;`AS;`AS;`AS:PAR:PAR:PAR:@AQ:@AQ:@AQ M:0AP:0AP:0AP:0AO:`AO:`AO:`AN9PAN9PAN9PAM9PAM9@AM9@AM9@AL90AL M90AL90AK9`AK9`AK9`AJ9`AJ8PAJ8PAI8PAI8@AI8@=H8@=H8@=H80=H80=G M80=G8`=G8`=F8`=F7P=F7P=E7P=E7P=E7@=D7@=D7@=D70=C70=C70=C70=B M7`=B7`=B7`=B6P<``-#"#\_"#\_"#\_"#\[!#\[!#\[!#\W`#\W`#\W`#\R_ M#\R_#\R_#\N_#\N^#\N^#\N^#\J]#\J]#\J]#\F]#\F\#\F\#\B\#\B[#\B[ M#\>[#\>Z#\>Z#\:Z#\:Z#\:Y#\:Y#\6Y#\6X#L6X#L2X#L2X#L2W#L.W#L.W M#L.V#L*V#L*V#L*U#L&U#L&U#L&U#L"T#L"T#L"T#L"S#K^S#K^S#K^S#KZR M#KZR#KZR#KVQ#KVQ#KVQ#KRP#KRP#KRP#KNP#KNO#KNO#KNO#KJN#KJN#KJN M#KFN#KFM#KFM#KBM#KBL#KBL#;>L#;>K#;>K#;:K#;:K#;:J#;6J#;6J#;6I M#;6I#;2I#;2I#;2H#;.H#;.H#;.G#;*G#;*G#;*F#;&F#;&F#;&F#;"E#;"E M#;"E#;"D#:^D#:^D#:^C#:ZC#:ZC#:ZC#:VB#:VB#:VB#:RA#:RA#:RA#:NA M#:N@#:N@#:J@#*J?#*J?#*J?#*F>#*F>#*F>#*B>#*B=#*B=#*>=#*><#*>< M#*:<#*:<#*:;#*6;#*6;#*6:#*6:#*2:#*29#*29#*.9#*.9#*.8#**8#**8 M#**7#*&7#*&7#*&7#*"6#*"6#*"6#)^5#)^5#)^5#)^4#)Z4#)Z4#)Z4#)V3 M"YV3"YV3"YR2"YR2"YR2"YN2"YN1"YN1"YJ1"YJ0"YJ0"YJ0"YF/"YF/"YF/ M"YB/"YB."YB."Y>."Y>-"Y>-"Y:-"Y:-"Y:,"Y6,"Y6,"Y6+"Y2+"Y2+"Y2* M"Y2*"Y.*"Y.*"Y.)"Y*)"Y*)"Y*("Y&("Y&("Y&("Y"'"Y"'"I"'"HZ%"XR# M#X)Y(6EB2D9!AR<EO!<5V!L9T2PILDE$@&=@2WUU)(A_$HB`#X1[%GMS)FUG M/5Y86%%,;T=#?SXZD2\LJB`>Q1L9SR4CO$$\BUU85F]H-6UF.5918C4QGQH8 MT`T,Z!`/XB0BO4`\B5A37&5>1&9?0F)<2%9174E$=3LWD"PJJR`=PQ,2V@P+ MZ0<'\0D([PX-Y!T;QS4RF%5/6VUF+'EQ%'UU"WYV"7YV"7UU"7UU"7UU"7QT M"7QT"7QT"7MT"7MS"7MS"7IS"7IR"7IR"7ER"7EQ"7EQ"7EQ"7AQ"7AP"7AP M"7=P"7=O"7=O"79O"79O"79N"'5N"'5N"'5M"'1M"'1M"'1L"'-L"'-L"'-L M"'-K"')K"')K"')J"'%J"'%J"'%J"'!I"'!I"'!I"&]H"&]H"&]H"&YG"&YG M"&YG"&YG"&UF"&UF"&UF"&QE"&QE"&QE"&ME"&MD"&MD"&ID"&IC"&IC"&EC M"&EB"&EB!VAB!VAB!VAA!VAA!V=A!V=@!V=@!V9@!V9?!V9?!V5?!V5?!V5> M!V1>!V1>!V1=!V-=!V-=!V-=!V-<!V)<!V)<!P``T,,/T,(/S\(/S\(/S\(/ MSL$/SL$/SL$/S<`/S<`/S<`/S,`/S+\/S+\/S+\/R[X/R[X/R[X/RKT/RKT/ MRKT/R;T/R;P/R;P/R+P/R+L/R+L/Q[L/Q[H/Q[H/Q[H/QKH/QKD/QKD/Q;D/ MQ;@.Q;@.Q+@.Q+@.Q+<.P[<.P[<.P[8.PK8.PK8.PK4.P;4.P;4.P;4.P;0. MP+0.P+0.P+,.O[,.O[,.O[,.OK(.OK(.OK(.O;$.O;$.O;$.O+`.O+`.O+`. MO+`.NZ\.NZ\.NZ\.NJX.NJX.NJX.N:X.N:T.N:T.N*T.N*P.N*P-MZP-MZL- MMZL-MJL-MJL-MJH-MJH-M:H-M:D-M:D-M*D-M*D-M*@-LZ@-LZ@-LZ<-LJ<- MLJ<-LJ8-L:8-L:8-L:8-L:4-L*4-L*4-L*0-KZ0-KZ0-KZ0-KJ,-KJ,-KJ,- MK:(-K:(-K:(-K*$-K*$-K*$-JZ$-JZ`-JZ`-JZ`,JI\,JI\,JI\,J9\,J9X, MJ9X,J)X,J)T,J)T,IYT,IYP,IYP,IIP,IIP,IIL,IIL,I9L,I9H,I9H,I)H, MI)H,I)D,HYD,HYD,HY@,HI@,HI@,HI<,H9<,H9<,H9<,H)8,H)8,H)8,H)4, MGY4,GY4,GY4,GI0,GI0,GI0,G9,+G9,+G9,+G)(+G)(+G)(+FY(+FY$+FY$+ MFY$+FI`+FI`+FI`+F9`+F8\+F8\+F(\+F(X+F(X+EXX+EXT+EXT+EHT+EHT+ MEHP+E8P+E8P+E8L+E8L+E(L+E(L+E(H+DXH+DXH+DXD+DHD+DHD+DH@+D8@+ MD8@+D8@+D(<+D(<*CX8+C((1?W<E95]20#R1)"+!%!/<%A79*"6Z2$.":&%* M?G8BB8`0BX(,B8$.AGT4@7D;>'$J<6DW:&)&7EA93$=X.#6:+RRK-C.=34AT M9V!&=F\J<VLO7EA4/SN,(B#!$`_A#@WE&QG-,R^B3$=T7UE/:V4X<6HM;&8T M9%Y#6%):2$1V-C.9(B"^$1#?!P?Q!03V"0CN&AC.-3*95U%7;V@H>W,1?W<* M?G8)?G8)?G8)?74)?74)?74)?'0)?'0)?'0)>W0)>W,)>W,)>G,)>G()>G() M>G()>7$)>7$)>7$)>'$)>'`)>'`)=W`)=V\)=V\)=F\)=F\)=FX(=6X(=6X( M=6T(=&T(=&T(=&P(=&P(<VP(<VP(<VL(<FL(<FL(<FH(<6H(<6H(<6H(<&D( M<&D(<&D(;V@(;V@(;V@(;V<(;F<(;F<(;F<(;68(;68(;68(;&4(;&4(;&4( M:V4(:V0(:V0(:F0(:F,(:F,(:6,(:6((:6((:6(':&(':&$':&$'9V$'9V`' M9V`'9F`'9F`'9E\'95\'95\'95X'9%X'9%X'9%T'9%T'8UT'8UT'8UP'8EP' M``#0PP_0PP_0P@_/P@_/P@_/P@_.P0_.P0_.P0_-P`_-P`_-P`_-P`_,OP_, MOP_,OP_+O@_+O@_+O@_*O0_*O0_*O0_)O0_)O`_)O`_(O`_(NP_(NP_'NP_' MNP_'N@_'N@_&N@_&N0_&N0_%N0_%N`[%N`[$N`[$N`[$MP[#MP[#MP[#M@[" MM@["M@["M@["M0[!M0[!M0[!M`[`M`[`M`[`LPZ_LPZ_LPZ_LPZ^L@Z^L@Z^ ML@Z]L0Z]L0Z]L0Z\L0Z\L`Z\L`Z\L`Z[KPZ[KPZ[KPZZK@ZZK@ZZK@ZYK@ZY MK0ZYK0ZXK0ZXK`ZXK`VWK`VWK`VWJPVWJPVVJPVVJ@VVJ@VUJ@VUJ0VUJ0VT MJ0VTJ0VTJ`VSJ`VSJ`VSIPVRIPVRIPVRIPVQI@VQI@VQI@VQI0VPI0VPI0VP MI`VOI`VOI`VOI`VNHPVNHPVNHPVMH@VMH@VMH@VLH@VLH0VLH0VLH0VKH`VK MH`VKH`RJGPRJGPRJGPRIGPRIG@RIG@RHG@RHG0RHG0RGG0RGG0RGG`RFG`RF MG`RFFPRFFPREFPREF@REF@RDF@RDF@RDF0RCF0RCF0RCF`RBF`RBF`RBF`RA MEPRAEPRAEPRAE@R@E@R@E@R@E0R?E0R?E0R?E0R>E`R>E`R>E`R=DPN=DPN= MDPN<DPN<D@N<D@N;D@N;D0N;D0N;D0N:D`N:D`N:D`N9D`N9CPN9CPN8CPN8 MC@N8C@N7C@N7C@N7C0N6C0N6C0N6C`N6C`N5C`N5BPN5BPN4BPN4BPN4B@N3 MB@N3B@N3B0N2B0N2B0N2B`N1B`N1B`N1B`N0APN/A@N,@Q&!>"1I8TI+1GXT M,*<C(,,C(,,T,:533FYS;#>$?!F*@0V+@@N+@@N*@@R)@`Z&?12#>AA^=2!U M;B]G84=54&9+1GA02G%@6E)S:S!]=1U[="!J8SY.27(N*ZL6%=<,"^H1$.`A M'\(V,YM,1W-=5U-H8CYK9#AI8SIC74964%Y"/H,J)[`4$]@("/`'!O(/#N,B M(+X_.X5?64ET;"!\=`]_=PI_=PE^=@E^=@E^=@E]=0E]=0E]=0E\=`E\=`E\ M=`E[=`E[<PE[<PEZ<PEZ<@EZ<@EZ<@EY<@EY<0EY<0EX<0EX<`EX<`EW<`EW M;PEW;PEV;PEV;PEV;@AU;@AU;@AU;0AU;0AT;0AT;0AT;`AS;`AS;`AS:PAR M:PAR:PAR:@AQ:@AQ:@AQ:@AP:0AP:0AP:0AO:`AO:`AO:`AO:`AN9PAN9PAN M9PAM9@AM9@AM9@AL90AL90AL90AK90AK9`AK9`AJ9`AJ8PAJ8PAJ8PAI8PAI M8@AI8@=H8@=H80=H80=G80=G8`=G8`=F8`=F8`=F7P=E7P=E7P=E7@=E7@=D M7@=D7@=D70=C70=C70=C7`<``-'##]###]###]###\_"#\_"#\_"#\[!#\[! M#\[!#\[`#\W`#\W`#\W`#\R_#\R_#\R_#\N^#\N^#\N^#\J^#\J]#\J]#\F] M#\F\#\F\#\B\#\B[#\B[#\B[#\>[#\>Z#\>Z#\:Z#\:Y#\:Y#\6Y#\6Y#\6X M#L2X#L2X#L2W#L.W#L.W#L.V#L.V#L*V#L*V#L*U#L&U#L&U#L&T#L"T#L"T M#L"T#K^S#K^S#K^S#KZR#KZR#KZR#KVQ#KVQ#KVQ#KVQ#KRP#KRP#KRP#KNO M#KNO#KNO#KJO#KJN#KJN#KFN#KFM#KFM#KBM#KBL#KBL#;BL#;>L#;>K#;>K M#;:K#;:J#;:J#;6J#;6J#;6I#;2I#;2I#;2H#;.H#;.H#;.G#;*G#;*G#;*G M#;*F#;&F#;&F#;&E#;"E#;"E#;"E#:^D#:^D#:^D#:ZC#:ZC#:ZC#:VB#:VB M#:VB#:VB#:RA#:RA#:RA#:N@#:N@#:N@#*J?#*J?#*J?#*F?#*F>#*F>#*B> M#*B=#*B=#*>=#*>=#*><#*><#*:<#*:;#*:;#*6;#*6:#*6:#*2:#*2:#*29 M#*.9#*.9#*.8#**8#**8#**8#**7#*&7#*&7#*&6#*"6#*"6#*"5#)^5#)^5 M#)^5#)Z4#)Z4#)Z4#)V3"YV3"YV3"YR3"YR2"YR2"YR2"YN1"YN1"YN1"YJ0 M"YJ0"YJ0"YF0"YF/"YF/"YB/"YB."YB."Y>."Y>."Y>-"Y>-"Y:-"Y:,"Y:, M"Y6,"Y6+"Y6+"Y2+"Y2+"Y2*"Y.*"Y.*"Y.)"Y*)"Y*)"Y*)"Y&("Y&("Y&( M"Y"&#(Z%#H9^&GAP,F5?4E)-<D1`BD$]CT]*=V=@37QT)XA_$XR#"XR$"HR# M"HR#"HR#"HJ!#(F`#8A_$(-Z%GMS)&]H.69@2&EB1')K,GUV'8-[$X)Y%G1N M+%U75SXZCB,AOQ$0WPT,Z!$0WQ\=QB\LJ$`[BDQ'<E1/8EE36E508$I%=#@T MEB(@OQ`/X`@(\`L*ZAD8SS(OGU!+9FEC-'AQ%WYU#7]W"7]W"7]W"7YV"7YV M"7YV"7UU"7UU"7UU"7QU"7QT"7QT"7MT"7MS"7MS"7MS"7IR"7IR"7IR"7ER M"7EQ"7EQ"7AQ"7AP"7AP"7=P"7=P"7=O"79O"79O"79N"'9N"'5N"'5M"'5M M"'1M"'1M"'1L"'-L"'-L"'-K"')K"')K"')K"'%J"'%J"'%J"'!I"'!I"'!I M"'!H"&]H"&]H"&]H"&YG"&YG"&YG"&UF"&UF"&UF"&QF"&QE"&QE"&ME"&MD M"&MD"&MD"&IC"&IC"&IC"&EC"&EB"&EB!VAB!VAA!VAA!V=A!V=A!V=@!V9@ M!V9@!V9?!V5?!V5?!V5>!V5>!V1>!V1>!V1=!V-=!V-=!P``T<0/T<,/T,,/ MT,,/T,,/S\(/S\(/S\(/SL$/SL$/SL$/SL$/S<`/S<`/S<`/S+\/S+\/S+\/ MR[X/R[X/R[X/RKX/RKT/RKT/R;T/R;P/R;P/R;P/R+P/R+L/R+L/Q[L/Q[H/ MQ[H/QKH/QKD/QKD/Q;D/Q;D/Q;@.Q+@.Q+@.Q+<.P[<.P[<.P[8.P[8.PK8. MPK8.PK4.P;4.P;4.P;0.P+0.P+0.P+0.O[,.O[,.O[,.OK(.OK(.OK(.OK$. MO;$.O;$.O;$.O+`.O+`.O+`.NZ\.NZ\.NZ\.NJ\.NJX.NJX.N:X.N:T.N:T. MN*T.N*P.N*P.N*P-MZP-MZL-MZL-MJL-MJH-MJH-M:H-M:H-M:D-M*D-M*D- MM*@-LZ@-LZ@-LZ<-LZ<-LJ<-LJ<-LJ8-L:8-L:8-L:4-L*4-L*4-L*4-KZ0- MKZ0-KZ0-KJ,-KJ,-KJ,-K:(-K:(-K:(-K:(-K*$-K*$-K*$-JZ`-JZ`-JZ`, MJJ`,JI\,JI\,J9\,J9X,J9X,J)X,J)T,J)T,J)T,IYT,IYP,IYP,IIP,IIL, MIIL,I9L,I9L,I9H,I)H,I)H,I)D,HYD,HYD,HY@,HI@,HI@,HI@,HI<,H9<, MH9<,H98,H)8,H)8,H)8,GY4,GY4,GY4,GI0,GI0,GI0,G9,+G9,+G9,+G9,+ MG)(+G)(+G)(+FY$+FY$+FY$+FI$+FI`+FI`+F9`+F8\+F8\+F(\+F(X+F(X+ MEXX+EXX+EXT+EXT+EHT+EHP+EHP+E8P+E8P+E8L+E(L+E(L+E(H+DXH+DXH+ MDXD+DHD+DHD+DHD+DH@+D8@+D8@+D(8-BX,2AGT;?G<H<FL[:&),9E]1;69$ M>G(MAGT8BX(.C(,+C80*C(0*C(,*C(,*C(,*BX(*BH$+B8`.A7T3@'@;>W,D M?'0B?W<;A7P2AGX-AGT.?G8;;&8[4TYI-C*='1O+$`_B#`OJ#P[C%Q;4(1_" M*B>Q,S"A-S29-3&=*RBO'AS&$`_@"@KL"@KL%136*B>O1D%Z8EQ$=&PA?'01 M@'@*@'@)?W<)?W<)?W<)?G8)?G8)?G8)?74)?74)?74)?'4)?'0)?'0)?'0) M>W,)>W,)>W,)>G()>G()>G()>7()>7$)>7$)>'$)>'`)>'`)=W`)=W`)=V\) M=F\)=F\)=FX(=FX(=6X(=6T(=6T(=&T(=&T(=&P(<VP(<VP(<VL(<FL(<FL( M<FL(<6H(<6H(<6H(<6D(<&D(<&D(<&@(;V@(;V@(;V@(;F<(;F<(;F<(;68( M;68(;68(;&8(;&4(;&4(;&4(:V0(:V0(:V0(:F,(:F,(:F,(:6,(:6((:6(' M:&(':&$':&$'9V$'9V$'9V`'9F`'9F`'9E\'9E\'95\'95X'95X'9%X'9%X' M9%T'8UT'``#1Q`_1Q`_1PP_0PP_0PP_0PP_/P@_/P@_/P@_/P0_.P0_.P0_. MP0_-P`_-P`_-P`_,OP_,OP_,OP_+O@_+O@_+O@_*O@_*O0_*O0_*O0_)O`_) MO`_)O`_(O`_(NP_(NP_'NP_'N@_'N@_&N@_&N0_&N0_%N0_%N0_%N`[$N`[$ MN`[$MP[$MP[#MP[#MP[#M@["M@["M@["M0[!M0[!M0[!M`[`M`[`M`[`M`Z_ MLPZ_LPZ_LPZ_L@Z^L@Z^L@Z^L@Z]L0Z]L0Z]L0Z\L`Z\L`Z\L`Z[KPZ[KPZ[ MKPZZKPZZK@ZZK@ZYK@ZYK0ZYK0ZYK0ZXK0ZXK`ZXK`VWK`VWJPVWJPVVJPVV MJ@VVJ@VUJ@VUJ@VUJ0VTJ0VTJ0VTJ`VTJ`VSJ`VSJ`VSIPVRIPVRIPVRI@VQ MI@VQI@VQI0VPI0VPI0VPI0VOI`VOI`VOI`VNHPVNHPVNHPVNHPVMH@VMH@VM MH@VLH0VLH0VLH0VKH`VKH`VKH`VJH`RJGPRJGPRIGPRIG@RIG@RIG@RHG@RH MG0RHG0RGG0RGG`RGG`RFG`RFFPRFFPREFPREFPREF@RDF@RDF@RDF0RCF0RC MF0RCF0RCF`RBF`RBF`RBEPRAEPRAEPRAE@R@E@R@E@R@E@R?E0R?E0R?E0R> ME`R>E`R>E`R>E`R=DPN=DPN=DPN<D@N<D@N<D@N;D0N;D0N;D0N:D0N:D`N: MD`N9D`N9CPN9CPN8CPN8CPN8C@N8C@N7C@N7C0N7C0N6C0N6C`N6C`N5C`N5 MC`N5BPN4BPN4BPN4B@N3B@N3B@N3B@N3B0N2B0N2B0N2B`N1B`N0APR0A@R. MA0Z+@Q*&?AJ`>"-_=R:#>A^(?Q6+@@^-A`N-A`J-A`J-A`J-A`J,@PJ,@PJ, M@PJ+@@J+@@J*@0R'?P^&?1*&?1*&?A"(?PR(@`N'?PR#>Q-Y<25G845.2G$T M,:`@'L43$MP-#.@,"^D.#>81$.`6%-<8%M,6%=80#^$+"^H(!_$+"^H4$]DG M);5!/81;55)P:2I[<Q5_=PR`>`F`>`F`>`E_=PE_=PE_=PE^=@E^=@E^=@E] M=0E]=0E]=0E]=0E\=`E\=`E\=`E[<PE[<PE[<PEZ<PEZ<@EZ<@EY<@EY<0EY M<0EX<0EX<`EX<`EW<`EW<`EW;PEW;PEV;PEV;@AV;@AU;@AU;@AU;0AT;0AT M;0AT;`AS;`AS;`AS:PAR:PAR:PAR:PAR:@AQ:@AQ:@AQ:0AP:0AP:0AP:0AO M:`AO:`AO:`AN9PAN9PAN9PAM9@AM9@AM9@AL9@AL90AL90AL90AK9`AK9`AK M9`AJ9`AJ8PAJ8PAI8PAI8@AI8@=H8@=H80=H80=G80=G80=G8`=G8`=F8`=F M7P=F7P=E7P=E7P=E7@=D7@=D7@=D70<``-+$#]'$#]'$#]'$#]###]###]## M#]#"#\_"#\_"#\_!#\[!#\[!#\[!#\W`#\W`#\W`#\R_#\R_#\R_#\N_#\N^ M#\N^#\J^#\J]#\J]#\J]#\F\#\F\#\F\#\B\#\B[#\B[#\>[#\>Z#\>Z#\:Z M#\:Z#\:Y#\6Y#\6Y#\6X#L6X#L2X#L2W#L2W#L.W#L.W#L.V#L*V#L*V#L*U M#L&U#L&U#L&U#L"T#L"T#L"T#K^S#K^S#K^S#K^R#KZR#KZR#KZR#KVQ#KVQ M#KVQ#KRP#KRP#KRP#KNP#KNO#KNO#KJO#KJN#KJN#KJN#KFM#KFM#KFM#KBM M#KBL#KBL#;>L#;>K#;>K#;:K#;:K#;:J#;6J#;6J#;6I#;2I#;2I#;2H#;2H M#;.H#;.H#;.G#;*G#;*G#;*F#;&F#;&F#;&F#;"E#;"E#;"E#:^D#:^D#:^D M#:^C#:ZC#:ZC#:ZC#:VB#:VB#:VB#:RA#:RA#:RA#:NA#:N@#:N@#:J@#*J? M#*J?#*F?#*F>#*F>#*F>#*B>#*B=#*B=#*>=#*><#*><#*:<#*:;#*:;#*6; M#*6;#*6:#*2:#*2:#*29#*29#*.9#*.9#*.8#**8#**8#**7#*&7#*&7#*&6 M#*"6#*"6#*"6#)^5#)^5#)^5#)Z4#)Z4#)Z4#)Z4#)V3"YV3"YV3"YR2"YR2 M"YR2"YN1"YN1"YN1"YJ1"YJ0"YJ0"YF0"YF/"YF/"YF/"YB/"YB."YB."Y>. M"Y>-"Y>-"Y:-"Y:,"Y:,"Y6,"Y6,"Y6+"Y2+"Y2+"Y2*"Y.*"Y.*"Y.*"Y.) M"Y*)"Y*)"Y*("Y&("Y&("Y"&#(^&#(Z%#HV$$(N"$8R##XZ%#(V$"XZ%"HZ% M"HZ%"HV$"HV$"HV$"HR#"HR#"HR#"HN""HN""HN""HF!"XF`"XF`"XF!"HF` M"HB`"X9^#8)Z%GAP)VAA1%!,;3HVE2<DN1<6U0\.XPL*[`D)[@D)[@L*ZPD) M[@D([P@(\`X.Y!D8T"LHKT(]A%M54VYG+WMR%W]X#(%Y"8%X"8!X"8!X"8!X M"7]W"7]W"7]W"7YV"7YV"7YV"7UV"7UU"7UU"7UU"7QT"7QT"7QT"7MS"7MS M"7MS"7IS"7IR"7IR"7ER"7EQ"7EQ"7AQ"7AQ"7AP"7AP"7=P"7=O"7=O"79O M"79N"'9N"'5N"'5N"'5M"'1M"'1M"'1L"'-L"'-L"'-L"')K"')K"')K"')J M"'%J"'%J"'%I"'!I"'!I"'!I"&]H"&]H"&]H"&YG"&YG"&YG"&UG"&UF"&UF M"&UF"&QE"&QE"&QE"&MD"&MD"&MD"&ID"&IC"&IC"&EC"&EB"&EB!VAB!VAB M!VAA!VAA!V=A!V=@!V=@!V9@!V9?!V9?!V5?!V5?!V5>!V1>!V1>!P``TL4/ MTL0/T<0/T<0/T<0/T<,/T,,/T,,/T,(/S\(/S\(/S\(/SL$/SL$/SL$/S<`/ MS<`/S<`/S+\/S+\/S+\/R[\/R[X/R[X/R[X/RKT/RKT/RKT/R;T/R;P/R;P/ MR+P/R+L/R+L/Q[L/Q[H/Q[H/QKH/QKH/QKD/QKD/Q;D/Q;@.Q;@.Q+@.Q+@. MQ+<.P[<.P[<.P[8.PK8.PK8.PK4.P;4.P;4.P;4.P+0.P+0.P+0.P+,.O[,. MO[,.O[(.OK(.OK(.OK(.O;$.O;$.O;$.O+`.O+`.O+`.N[`.NZ\.NZ\.NZ\. MNJX.NJX.NJX.N:T.N:T.N:T.N*T.N*P.N*P-MZP-MZL-MZL-MJL-MJL-MJH- MM:H-M:H-M:D-M:D-M*D-M*@-M*@-LZ@-LZ@-LZ<-LJ<-LJ<-LJ8-L:8-L:8- ML:8-L*4-L*4-L*4-L*0-KZ0-KZ0-KZ,-KJ,-KJ,-KJ,-K:(-K:(-K:(-K*$- MK*$-K*$-JZ$-JZ`-JZ`-JJ`,JI\,JI\,JI\,J9X,J9X,J9X,J)X,J)T,J)T, MIYT,IYP,IYP,IIP,IIP,IIL,I9L,I9L,I9H,I9H,I)H,I)D,I)D,HYD,HYD, MHY@,HI@,HI@,HI<,H9<,H9<,H9<,H)8,H)8,H)8,GY4,GY4,GY4,GY0,GI0, MGI0,GI0,G9,+G9,+G9,+G)(+G)(+G)(+FY(+FY$+FY$+FI$+FI`+FI`+FI`+ MF8\+F8\+F8\+F(\+F(X+F(X+EXX+EXT+EXT+EHT+EHT+EHP+E8P+E8P+E8L+ ME(L+E(L+E(H+E(H+DXH+DXH+DXD+DHD+DHD+DH@+D8@+D8@+D8@+D(<+CX8+ MCX8+CH4+CX8*CX8*CX4*CH4*CH4*CH4*C80*C80*C80*C(,*C(,*C(,*BX,* MBX(*BX(*BH(*BH$*BH$*B8$*B8`*B(`+AWX-@GH6>7$E:V0^5U)@0S^%,2ZF M(R&_&AC0%!/:$1#@$1#?$A'>%!+:&!;3)B.Y-C*;241W7EA/;V@N>G(8?W</ M@7D*@7D)@7D)@7D)@'@)@'@)@'@)?W<)?W<)?W<)?G8)?G8)?G8)?G8)?74) M?74)?74)?'0)?'0)?'0)>W0)>W,)>W,)>G,)>G()>G()>7()>7$)>7$)>7$) M>'$)>'`)>'`)=W`)=V\)=V\)=F\)=FX(=FX(=6X(=6X(=6T(=&T(=&T(=&P( M<VP(<VP(<VP(<VL(<FL(<FL(<FH(<6H(<6H(<6D(<&D(<&D(<&D(;V@(;V@( M;V@(;F<(;F<(;F<(;F<(;68(;68(;68(;&4(;&4(;&4(:V0(:V0(:V0(:F0( M:F,(:F,(:6,(:6((:6(':&(':&(':&$':&$'9V$'9V`'9V`'9F`'9E\'9E\' M95\'95\'95X'9%X'``#2Q1#2Q0_2Q`_1Q`_1Q`_1Q`_1PP_0PP_0PP_0P@_/ MP@_/P@_/P@_.P0_.P0_.P0_-P`_-P`_-P`_,OP_,OP_,OP_,OP_+O@_+O@_+ MO@_*O0_*O0_*O0_)O0_)O`_)O`_(O`_(NP_(NP_'NP_'N@_'N@_&N@_&N@_& MN0_&N0_%N0_%N`[%N`[$N`[$N`[$MP[#MP[#MP[#M@["M@["M@["M0[!M0[! MM0[!M0[!M`[`M`[`M`[`LPZ_LPZ_LPZ_LPZ^L@Z^L@Z^L@Z]L0Z]L0Z]L0Z\ ML`Z\L`Z\L`Z[L`Z[KPZ[KPZ[KPZZK@ZZK@ZZK@ZYK@ZYK0ZYK0ZXK0ZXK`ZX MK`VWK`VWJPVWJPVVJPVVJPVVJ@VVJ@VUJ@VUJ0VUJ0VTJ0VTJ0VTJ`VSJ`VS MJ`VSIPVRIPVRIPVRI@VQI@VQI@VQI@VPI0VPI0VPI0VPI`VOI`VOI`VOI`VN MHPVNHPVNHPVMH@VMH@VMH@VLH0VLH0VLH0VKH0VKH`VKH`VKH`RJGPRJGPRJ MGPRIGPRIG@RIG@RHG@RHG0RHG0RGG0RGG`RGG`RFG`RFG`RFFPREFPREFPRE MF@REF@RDF@RDF@RDF0RCF0RCF0RCF`RBF`RBF`RBEPRAEPRAEPRAEPR@E@R@ ME@R@E@R@E0R?E0R?E0R?E0R>E`R>E`R>E`R=DPN=DPN=DPN<D@N<D@N<D@N; MD@N;D0N;D0N:D0N:D`N:D`N:D`N9D`N9CPN9CPN8CPN8C@N8C@N7C@N7C0N7 MC0N6C0N6C0N6C`N5C`N5C`N5BPN5BPN4BPN4BPN4B@N3B@N3B@N3B0N2B0N2 MB0N2B`N1B`N1B`N1B`N0APN0APJ0APJ/A@J/A@J/A@J/A@J.A0J.A0J.A0J- MA`J-A`J-A`J,@PJ,@PJ,@PJ+@PJ+@@J+@@J*@@J*@0J*@0J*@0J)@`J(@`N' M?@V$?!)]=1YP:35@6U!13&Q$0(,Z-I4R+Z0M*JPK*:\M*ZLR+J0Y-I1(1'A7 M4EUF8$%S;"A\=!>!>`V!>0N">@F">0F!>0F!>0F!>0F`>`F`>`F`>`E_=PE_ M=PE_=PE_=@E^=@E^=@E^=@E]=0E]=0E]=0E\=`E\=`E\=`E[=`E[<PE[<PEZ M<PEZ<@EZ<@EY<@EY<0EY<0EY<0EX<0EX<`EX<`EW<`EW;PEW;PEV;PEV;PEV M;@AU;@AU;@AU;0AT;0AT;0AT;`AT;`AS;`AS;`AS:PAR:PAR:PAR:@AQ:@AQ M:@AQ:@AP:0AP:0AP:0AO:`AO:`AO:`AO9PAN9PAN9PAN9PAM9@AM9@AM9@AL M90AL90AL90AK90AK9`AK9`AJ9`AJ8PAJ8PAI8PAI8@AI8@AI8@=H8@=H80=H M80=G80=G8`=G8`=F8`=F8`=F7P=E7P=E7P=E7@<``-/%$-+%$-+%#]+%#]+$ M#]'$#]'$#]'##]###]###]#"#\_"#\_"#\_"#\[!#\[!#\[!#\W`#\W`#\W` M#\W`#\R_#\R_#\R_#\N^#\N^#\N^#\J]#\J]#\J]#\F]#\F\#\F\#\B\#\B[ M#\B[#\>[#\>[#\>Z#\>Z#\:Z#\:Y#\:Y#\6Y#\6X#L6X#L2X#L2X#L2W#L.W M#L.W#L.V#L*V#L*V#L*V#L*U#L&U#L&U#L&T#L"T#L"T#L"S#K^S#K^S#K^S M#KZR#KZR#KZR#KVQ#KVQ#KVQ#KRQ#KRP#KRP#KRP#KNO#KNO#KNO#KJN#KJN M#KJN#KFN#KFM#KFM#KBM#KBL#KBL#;>L#;>L#;>K#;>K#;:K#;:J#;:J#;6J M#;6I#;6I#;2I#;2I#;2H#;.H#;.H#;.G#;*G#;*G#;*G#;&F#;&F#;&F#;&E M#;"E#;"E#;"D#:^D#:^D#:^D#:ZC#:ZC#:ZC#:VB#:VB#:VB#:RB#:RA#:RA M#:RA#:N@#:N@#:N@#*J?#*J?#*J?#*F?#*F>#*F>#*B>#*B=#*B=#*>=#*>= M#*><#*:<#*:<#*:;#*:;#*6;#*6:#*6:#*2:#*2:#*29#*.9#*.9#*.8#**8 M#**8#**7#*&7#*&7#*&7#*&6#*"6#*"6#*"5#)^5#)^5#)^5#)Z4#)Z4#)Z4 M#)V3"YV3"YV3"YR2"YR2"YR2"YN2"YN1"YN1"YN1"YJ0"YJ0"YJ0"YF0"YF/ M"YF/"YB/"YB."YB."Y>."Y>-"Y>-"Y:-"Y:-"Y:,"Y:,"Y6,"Y6+"Y6+"Y2+ M"Y2+"Y2*"Y.*"Y.*"Y.)"Y*)"Y*)"Y*("Y&("Y&("Y&("Y"'"Y"'"I"'"I"& M"H^&"H^&"H^&"HZ%"HZ%"HZ%"HV$"HV$"HV$"HR#"HR#"HR#"HN#"HN""HN" M"HN""HJ!"HJ!"HJ!"HF!"HB`"XA_#(1\$7]W&7=P*&YH-V9?1U]94EA37U-. M9U),:5-.9EA27F!:36MD.G)K*WIS'']W$X%Y#H)["H-Z"8)Z"8)Z"8)Y"8%Y M"8%Y"8%Y"8!X"8!X"8!X"8!W"7]W"7]W"7]W"7YV"7YV"7YV"7UU"7UU"7UU M"7QT"7QT"7QT"7MT"7MS"7MS"7IS"7IR"7IR"7IR"7ER"7EQ"7EQ"7AQ"7AP M"7AP"7=P"7=O"7=O"79O"79O"79N"'5N"'5N"'5M"'5M"'1M"'1M"'1L"'-L M"'-L"'-K"')K"')K"')J"'%J"'%J"'%J"'!I"'!I"'!I"&]H"&]H"&]H"&]H M"&YG"&YG"&YG"&UF"&UF"&UF"&QE"&QE"&QE"&ME"&MD"&MD"&ID"&IC"&IC M"&IC"&EC"&EB"&EB!VAB!VAA!VAA!V=A!V=@!V=@!V9@!V9@!V9?!V5?!V5? M!P``T\80T\40T\40TL40TL4/TL0/T<0/T<0/T<,/T,,/T,,/T,,/S\(/S\(/ MS\(/SL$/SL$/SL$/S<`/S<`/S<`/S<`/S+\/S+\/S+\/R[X/R[X/R[X/RKX/ MRKT/RKT/R;T/R;P/R;P/R+P/R+L/R+L/R+L/Q[L/Q[H/Q[H/QKH/QKD/QKD/ MQ;D/Q;D/Q;@.Q+@.Q+@.Q+<.P[<.P[<.P[8.PK8.PK8.PK8.PK4.P;4.P;4. MP;0.P+0.P+0.P+0.O[,.O[,.O[,.OK(.OK(.OK(.O;$.O;$.O;$.O;$.O+`. MO+`.O+`.NZ\.NZ\.NZ\.NJX.NJX.NJX.N:X.N:T.N:T.N*T.N*P.N*P-MZP- MMZP-MZL-MZL-MJL-MJH-MJH-M:H-M:D-M:D-M*D-M*D-M*@-LZ@-LZ@-LZ<- MLJ<-LJ<-LJ<-LJ8-L:8-L:8-L:4-L*4-L*4-L*0-KZ0-KZ0-KZ0-KJ,-KJ,- MKJ,-K:(-K:(-K:(-K*(-K*$-K*$-K*$-JZ`-JZ`-JZ`,JI\,JI\,JI\,J9\, MJ9X,J9X,J)X,J)T,J)T,IYT,IYT,IYP,IYP,IIP,IIL,IIL,I9L,I9H,I9H, MI)H,I)H,I)D,HYD,HYD,HY@,HI@,HI@,HI@,H9<,H9<,H9<,H98,H)8,H)8, MH)4,GY4,GY4,GY4,GI0,GI0,GI0,G9,+G9,+G9,+G),+G)(+G)(+G)(+FY$+ MFY$+FY$+FI`+FI`+FI`+F9`+F8\+F8\+F(\+F(X+F(X+EXX+EXX+EXT+EHT+ MEHT+EHP+EHP+E8P+E8L+E8L+E(L+E(L+E(H+DXH+DXH+DXD+DHD+DHD+DHD+ MD8@+D8@+D8@+D8<+D(<*D(<*D(8*CX8*CX8*CX8*CH4*CH4*CH4*C80*C80* MC80*C(0*C(,*C(,*BX,*BX(*BX(*BX(*BH$*BH$*BH$*B8$*B8`*B(`+AGX. M@WL3@7@7?'4>>G,A=6TK<FLO<6HP=&PK=FXH>G,>?G47@7@2@GH.@WL,A'L* M@WL*@WL)@WH)@GH)@GH)@GH)@7D)@7D)@7D)@'@)@'@)@'@)@'<)?W<)?W<) M?W<)?G8)?G8)?G8)?74)?74)?74)?'4)?'0)?'0)>W0)>W,)>W,)>W,)>G() M>G()>G()>7()>7$)>7$)>'$)>'`)>'`)=W`)=W`)=V\)=F\)=F\)=FX(=6X( M=6X(=6T(=6T(=&T(=&T(=&P(<VP(<VP(<VL(<FL(<FL(<FH(<6H(<6H(<6H( M<&D(<&D(<&D(<&@(;V@(;V@(;V@(;F<(;F<(;F<(;68(;68(;68(;&4(;&4( M;&4(:V4(:V0(:V0(:V0(:F,(:F,(:F,(:6,(:6((:6(':&(':&$':&$'9V$' M9V`'9V`'9F`'9F`'9E\'95\'``#4QA#3QA#3Q1#3Q1#2Q1#2Q0_2Q`_1Q`_1 MQ`_1PP_0PP_0PP_0PP_/P@_/P@_/P@_.P0_.P0_.P0_.P`_-P`_-P`_-P`_, MOP_,OP_,OP_+O@_+O@_+O@_*O@_*O0_*O0_)O0_)O`_)O`_)O`_(NP_(NP_( MNP_'NP_'N@_'N@_&N@_&N0_&N0_%N0_%N0_%N`[$N`[$N`[$MP[#MP[#MP[# MM@[#M@["M@["M@["M0[!M0[!M0[!M`[`M`[`M`[`M`Z_LPZ_LPZ_LPZ^L@Z^ ML@Z^L@Z^L0Z]L0Z]L0Z]L0Z\L`Z\L`Z\L`Z[KPZ[KPZ[KPZZKPZZK@ZZK@ZY MK@ZYK0ZYK0ZXK0ZXK`ZXK`ZXK`VWK`VWJPVWJPVVJPVVJ@VVJ@VUJ@VUJ@VU MJ0VTJ0VTJ0VTJ`VSJ`VSJ`VSIPVSIPVRIPVRIPVRI@VQI@VQI@VQI0VPI0VP MI0VPI0VOI`VOI`VOI`VNHPVNHPVNHPVMH@VMH@VMH@VMH@VLH0VLH0VLH0VK MH`VKH`VKH`RJH`RJGPRJGPRIGPRIG@RIG@RHG@RHG0RHG0RHG0RGG0RGG`RG MG`RFG`RFFPRFFPREFPREFPREF@RDF@RDF@RDF0RCF0RCF0RCF`RBF`RBF`RB MF`RBEPRAEPRAEPRAE@R@E@R@E@R@E@R?E0R?E0R?E0R>E`R>E`R>E`R=DPN= MDPN=DPN=DPN<D@N<D@N<D@N;D0N;D0N;D0N:D0N:D`N:D`N9D`N9CPN9CPN8 MCPN8C@N8C@N7C@N7C@N7C0N7C0N6C0N6C`N6C`N5C`N5C`N5BPN4BPN4BPN4 MB@N3B@N3B@N3B0N2B0N2B0N2B0N2B`N1B`N1B`N1APN0APJ0APJ0APJ/A@J/ MA@J/A@J.A0J.A0J.A0J-A`J-A`J-A`J,A`J,@PJ,@PJ,@PJ+@@J+@@J+@@J* M@@J*@0J*@0J)@0J)@`J(@`N'?PR&?0Z&?0Z%?0Z#>Q*">A.!>16#>Q"#>A"$ M?`V$?`R$?`N$?`N$?`J$?`J$>PJ#>PJ#>PF#>@F">@F">@F">@F!>0F!>0F! M>0F!>`F`>`F`>`F`=PE_=PE_=PE_=PE^=@E^=@E^=@E]=0E]=0E]=0E\=0E\ M=`E\=`E\=`E[<PE[<PE[<PEZ<@EZ<@EZ<@EY<@EY<0EY<0EX<0EX<`EX<`EW M<`EW<`EW;PEV;PEV;PEV;@AV;@AU;@AU;0AU;0AT;0AT;0AT;`AS;`AS;`AS M:PAR:PAR:PAR:PAQ:@AQ:@AQ:@AQ:0AP:0AP:0AP:`AO:`AO:`AO:`AN9PAN M9PAN9PAM9@AM9@AM9@AL9@AL90AL90AK90AK9`AK9`AK9`AJ8PAJ8PAJ8PAI M8PAI8@AI8@=H8@=H80=H80=G80=G80=G8`=F8`=F8`=F7P<``-3&$-3&$-/& M$-/&$-/%$-+%$-+%#]+$#]'$#]'$#]'##]###]###]###\_"#\_"#\_"#\_! M#\[!#\[!#\[!#\W`#\W`#\W`#\R_#\R_#\R_#\N^#\N^#\N^#\J^#\J]#\J] M#\F]#\F\#\F\#\F\#\B\#\B[#\B[#\>[#\>Z#\>Z#\:Z#\:Y#\:Y#\6Y#\6Y M#\6X#L2X#L2X#L2W#L2W#L.W#L.W#L.V#L*V#L*V#L*U#L&U#L&U#L&T#L"T M#L"T#L"T#K^S#K^S#K^S#KZR#KZR#KZR#KZR#KVQ#KVQ#KVQ#KRP#KRP#KRP M#KNO#KNO#KNO#KJO#KJN#KJN#KFN#KFM#KFM#KFM#KBM#KBL#KBL#;>L#;>K M#;>K#;:K#;:J#;:J#;6J#;6J#;6I#;2I#;2I#;2H#;.H#;.H#;.H#;.G#;*G M#;*G#;*F#;&F#;&F#;&E#;"E#;"E#;"E#:^D#:^D#:^D#:ZC#:ZC#:ZC#:ZC M#:VB#:VB#:VB#:RA#:RA#:RA#:N@#:N@#:N@#:J@#*J?#*J?#*F?#*F>#*F> M#*B>#*B>#*B=#*B=#*>=#*><#*><#*:<#*:;#*:;#*6;#*6;#*6:#*2:#*2: M#*29#*.9#*.9#*.9#*.8#**8#**8#**7#*&7#*&7#*&6#*"6#*"6#*"6#)^5 M#)^5#)^5#)Z4#)Z4#)Z4#)V3"YV3"YV3"YV3"YR2"YR2"YR2"YN1"YN1"YN1 M"YJ1"YJ0"YJ0"YF0"YF/"YF/"YB/"YB."YB."YB."Y>."Y>-"Y>-"Y:-"Y:, M"Y:,"Y6,"Y6,"Y6+"Y2+"Y2+"Y2*"Y.*"Y.*"Y.)"Y*)"Y*)"Y*)"Y*("Y&( M"Y&("Y&'"Y"'"I"'"I"'"H^&"H^&"H^&"HZ%"HZ%"HZ%"HV$"HV$"HV$"HV$ M"HR#"HR#"HR#"HN""HN""HN""HJ""HJ!"HJ!"HF!"HF`"HF`"H>`"X=_"XA_ M"H9_"X9_"X9^"X9^"X5^"X9]"H9]"H5]"H5]"H5\"H1\"H1\"H1["H-["H-[ M"8-Z"8)Z"8)Z"8)Z"8)Y"8%Y"8%Y"8%X"8!X"8!X"8!X"7]W"7]W"7]W"7YV M"7YV"7YV"7UU"7UU"7UU"7QU"7QT"7QT"7QT"7MS"7MS"7MS"7IS"7IR"7IR M"7ER"7EQ"7EQ"7AQ"7AP"7AP"7=P"7=P"7=O"7=O"79O"79N"'9N"'5N"'5N M"'5M"'1M"'1M"'1L"'-L"'-L"'-K"')K"')K"')K"')J"'%J"'%J"'%I"'!I M"'!I"'!I"&]H"&]H"&]H"&YG"&YG"&YG"&UF"&UF"&UF"&QF"&QE"&QE"&QE M"&MD"&MD"&MD"&ID"&IC"&IC"&EC"&EB"&EB!VAB!VAA!VAA!V=A!V=A!V=@ M!V=@!V9@!P``U,<0U,80U,80T\80T\80T\40TL40TL4/TL0/T<0/T<0/T<0/ MT,,/T,,/T,,/T,(/S\(/S\(/S\$/SL$/SL$/SL$/S<`/S<`/S<`/S+\/S+\/ MS+\/R[\/R[X/R[X/RKX/RKT/RKT/RKT/R;P/R;P/R;P/R+P/R+L/R+L/Q[L/ MQ[H/Q[H/QKH/QKH/QKD/Q;D/Q;D/Q;@.Q;@.Q+@.Q+<.Q+<.P[<.P[<.P[8. MPK8.PK8.PK4.P;4.P;4.P;4.P+0.P+0.P+0.O[,.O[,.O[,.O[(.OK(.OK(. MOK(.O;$.O;$.O;$.O+`.O+`.O+`.N[`.NZ\.NZ\.NJ\.NJX.NJX.NJX.N:T. MN:T.N:T.N*T.N*P.N*P-MZP-MZL-MZL-MJL-MJH-MJH-M:H-M:H-M:D-M*D- MM*D-M*@-M*@-LZ@-LZ@-LZ<-LJ<-LJ<-LJ8-L:8-L:8-L:4-L*4-L*4-L*4- MKZ0-KZ0-KZ0-KZ,-KJ,-KJ,-KJ,-K:(-K:(-K:(-K*$-K*$-K*$-JZ`-JZ`- MJZ`-JJ`,JI\,JI\,J9\,J9X,J9X,J9X,J)X,J)T,J)T,IYT,IYP,IYP,IIP, MIIL,IIL,I9L,I9L,I9H,I)H,I)H,I)D,I)D,HYD,HYD,HY@,HI@,HI@,HI<, MH9<,H9<,H98,H)8,H)8,H)8,GY4,GY4,GY4,GI0,GI0,GI0,GI0,G9,+G9,+ MG9,+G)(+G)(+G)(+FY$+FY$+FY$+FI$+FI`+FI`+F9`+F8\+F8\+F8\+F(\+ MF(X+F(X+EXX+EXT+EXT+EHT+EHP+EHP+E8P+E8P+E8L+E(L+E(L+E(H+DXH+ MDXH+DXH+DXD+DHD+DHD+DH@+D8@+D8@+D8<+D(<+D(<*D(<*CX8*CX8*CX8* MCH4*CH4*CH4*CH4*C80*C80*C80*C(,*C(,*C(,*BX(*BX(*BX(*BH(*BH$* MBH$*B8$*B8`*B8`*B(`*B(`*B'\*B'\*AW\*AWX*AWX*AGX*AGT*AGT*A7T* MA7T*A7P*A'P*A'P*A'L*@WL*@WL)@WL)@WH)@GH)@GH)@GD)@7D)@7D)@7@) M@'@)@'@)@'@)?W<)?W<)?W<)?G8)?G8)?G8)?78)?74)?74)?74)?'0)?'0) M?'0)>W,)>W,)>W,)>G,)>G()>G()>7()>7$)>7$)>'$)>'$)>'`)>'`)=W`) M=V\)=V\)=F\)=FX(=FX(=6X(=6X(=6T(=&T(=&T(=&P(<VP(<VP(<VP(<FL( M<FL(<FL(<FH(<6H(<6H(<6D(<&D(<&D(<&D(;V@(;V@(;V@(;F<(;F<(;F<( M;68(;68(;68(;68(;&4(;&4(;&4(:V0(:V0(:V0(:F0(:F,(:F,(:6,(:6(( M:6(':&(':&$':&$'9V$'9V$'9V`'9V`'``#5QQ#4QQ#4QQ#4QA#3QA#3QA#3 MQ1#2Q1#2Q0_2Q`_1Q`_1Q`_1Q`_0PP_0PP_0PP_0P@_/P@_/P@_/P0_.P0_. MP0_.P0_-P`_-P`_-P`_,OP_,OP_,OP_+OP_+O@_+O@_+O@_*O0_*O0_*O0_) MO`_)O`_)O`_(O`_(NP_(NP_'NP_'N@_'N@_&N@_&N@_&N0_%N0_%N0_%N`[% MN`[$N`[$MP[$MP[#MP[#MP[#M@["M@["M@["M0[!M0[!M0[!M0[`M`[`M`[` MM`[`LPZ_LPZ_LPZ_L@Z^L@Z^L@Z^L@Z]L0Z]L0Z]L0Z\L`Z\L`Z\L`Z[L`Z[ MKPZ[KPZZKPZZK@ZZK@ZZK@ZYK0ZYK0ZYK0ZXK0ZXK`ZXK`VWK`VWJPVWJPVV MJPVVJPVVJ@VUJ@VUJ@VUJ0VUJ0VTJ0VTJ`VTJ`VSJ`VSJ`VSIPVRIPVRIPVR MI@VQI@VQI@VQI@VPI0VPI0VPI0VOI`VOI`VOI`VOHPVNHPVNHPVNHPVMH@VM MH@VMH@VLH0VLH0VLH0VKH0VKH`VKH`VJH`RJGPRJGPRJGPRIG@RIG@RIG@RH MG@RHG0RHG0RGG0RGG`RGG`RFG`RFG`RFFPREFPREFPREF@RDF@RDF@RDF0RD MF0RCF0RCF0RCF`RBF`RBF`RBEPRAEPRAEPRAEPR@E@R@E@R@E@R?E0R?E0R? ME0R?E`R>E`R>E`R>E`R=DPN=DPN=DPN<D@N<D@N<D@N;D@N;D0N;D0N:D0N: MD`N:D`N9D`N9CPN9CPN9CPN8CPN8C@N8C@N7C@N7C0N7C0N6C0N6C0N6C`N5 MC`N5C`N5BPN4BPN4BPN4B@N4B@N3B@N3B@N3B0N2B0N2B0N2B`N1B`N1B`N1 MB`N0APN0APJ0APJ/A@J/A@J/A@J.A0J.A0J.A0J.A0J-A`J-A`J-A`J,@PJ, M@PJ,@PJ+@PJ+@@J+@@J*@@J*@0J*@0J)@0J)@`J)@`J)@`J(@`J(?PJ(?PJ' M?PJ'?@J'?@J&?@J&?0J&?0J%?0J%?0J%?`J$?`J$?`J$>PJ#>PJ#>PJ#>PF# M>@F">@F">@F">0F!>0F!>0F!>`F`>`F`>`F`>`E_=PE_=PE_=PE^=@E^=@E^ M=@E^=@E]=0E]=0E]=0E\=`E\=`E\=`E[<PE[<PE[<PEZ<PEZ<@EZ<@EY<@EY M<0EY<0EY<0EX<0EX<`EX<`EW<`EW;PEW;PEV;PEV;@AV;@AU;@AU;@AU;0AT M;0AT;0AT;`AS;`AS;`AS;`AS:PAR:PAR:PAR:@AQ:@AQ:@AQ:0AP:0AP:0AP M:0AO:`AO:`AO:`AN9PAN9PAN9PAN9PAM9@AM9@AM9@AL90AL90AL90AK9`AK M9`AK9`AJ9`AJ8PAJ8PAI8PAI8@AI8@=H8@=H8@=H80=H80=G80=G8`<``-7' M$-7'$-3'$-3'$-3&$-/&$-/&$-/%$-+%$-+%#]+$#]'$#]'$#]'$#]'##]## M#]###]#"#\_"#\_"#\_"#\[!#\[!#\[!#\W`#\W`#\W`#\R_#\R_#\R_#\R_ M#\N^#\N^#\N^#\J]#\J]#\J]#\F]#\F\#\F\#\B\#\B[#\B[#\>[#\>Z#\>Z M#\:Z#\:Z#\:Y#\:Y#\6Y#\6X#L6X#L2X#L2X#L2W#L.W#L.W#L.V#L*V#L*V M#L*U#L&U#L&U#L&U#L&T#L"T#L"T#L"S#K^S#K^S#K^S#KZR#KZR#KZR#KVQ M#KVQ#KVQ#KRP#KRP#KRP#KNP#KNO#KNO#KNO#KJN#KJN#KJN#KFN#KFM#KFM M#KBM#KBL#KBL#;>L#;>K#;>K#;:K#;:K#;:J#;:J#;6J#;6I#;6I#;2I#;2I M#;2H#;.H#;.H#;.G#;*G#;*G#;*F#;&F#;&F#;&F#;"E#;"E#;"E#;"D#:^D M#:^D#:^D#:ZC#:ZC#:ZC#:VB#:VB#:VB#:RA#:RA#:RA#:NA#:N@#:N@#:N@ M#*J?#*J?#*J?#*F?#*F>#*F>#*B>#*B=#*B=#*>=#*><#*><#*:<#*:<#*:; M#*6;#*6;#*6:#*6:#*2:#*2:#*29#*.9#*.9#*.8#**8#**8#**7#*&7#*&7 M#*&7#*"6#*"6#*"6#*"5#)^5#)^5#)^5#)Z4#)Z4#)Z4#)V3"YV3"YV3"YR2 M"YR2"YR2"YN2"YN1"YN1"YJ1"YJ0"YJ0"YJ0"YF/"YF/"YF/"YB/"YB."YB. M"Y>."Y>-"Y>-"Y:-"Y:-"Y:,"Y6,"Y6,"Y6+"Y6+"Y2+"Y2*"Y2*"Y.*"Y.* M"Y.)"Y*)"Y*)"Y*("Y&("Y&("Y&("Y"'"Y"'"I"'"H^&"H^&"H^&"H^%"HZ% M"HZ%"HZ%"HV$"HV$"HV$"HR#"HR#"HR#"HN#"HN""HN""HJ""HJ!"HJ!"HJ! M"HF`"HF`"HF`"HB`"HA_"HA_"H=_"H=^"H=^"H9^"H9^"H9]"H5]"H5]"H5\ M"H1\"H1\"H1["H1["H-["H-["8-Z"8)Z"8)Z"8)Y"8%Y"8%Y"8%Y"8!X"8!X M"8!X"7]W"7]W"7]W"7]V"7YV"7YV"7YV"7UU"7UU"7UU"7QT"7QT"7QT"7MT M"7MS"7MS"7IS"7IR"7IR"7ER"7EQ"7EQ"7EQ"7AQ"7AP"7AP"7=P"7=O"7=O M"79O"79O"79N"'5N"'5N"'5M"'1M"'1M"'1L"'1L"'-L"'-L"'-K"')K"')K M"')J"'%J"'%J"'%J"'!I"'!I"'!I"&]H"&]H"&]H"&YG"&YG"&YG"&YG"&UF M"&UF"&UF"&QE"&QE"&QE"&ME"&MD"&MD"&ID"&IC"&IC"&EC"&EB"&EB!VEB M!VAB!VAA!VAA!V=A!P``U<@0U<<0U<<0U,<0U,<0U,80T\80T\80T\40TL40 MTL4/TL4/TL0/T<0/T<0/T<,/T,,/T,,/T,(/S\(/S\(/S\(/SL$/SL$/SL$/ MS<`/S<`/S<`/S,`/S+\/S+\/S+\/R[X/R[X/R[X/RKT/RKT/RKT/R;T/R;P/ MR;P/R+P/R+L/R+L/Q[L/Q[L/Q[H/Q[H/QKH/QKD/QKD/Q;D/Q;@.Q;@.Q+@. MQ+@.Q+<.P[<.P[<.P[8.PK8.PK8.PK8.P;4.P;4.P;4.P;0.P+0.P+0.P+,. MO[,.O[,.O[,.OK(.OK(.OK(.O;$.O;$.O;$.O+$.O+`.O+`.O+`.NZ\.NZ\. MNZ\.NJX.NJX.NJX.N:X.N:T.N:T.N*T.N*P.N*P-MZP-MZP-MZL-MJL-MJL- MMJH-MJH-M:H-M:D-M:D-M*D-M*D-M*@-LZ@-LZ@-LZ<-LJ<-LJ<-LJ8-L:8- ML:8-L:8-L:4-L*4-L*4-L*0-KZ0-KZ0-KZ0-KJ,-KJ,-KJ,-K:(-K:(-K:(- MK*$-K*$-K*$-JZ$-JZ`-JZ`-JZ`,JI\,JI\,JI\,J9\,J9X,J9X,J)X,J)T, MJ)T,IYT,IYP,IYP,IIP,IIP,IIL,IIL,I9L,I9H,I9H,I)H,I)H,I)D,HYD, MHYD,HY@,HI@,HI@,HI<,H9<,H9<,H9<,H)8,H)8,H)8,H)4,GY4,GY4,GY4, MGI0,GI0,GI0,G9,+G9,+G9,+G)(+G)(+G)(+FY(+FY$+FY$+FY$+FI`+FI`+ MFI`+F9`+F8\+F8\+F(\+F(X+F(X+EXX+EXT+EXT+EHT+EHT+EHP+E8P+E8P+ ME8L+E8L+E(L+E(L+E(H+DXH+DXH+DXD+DHD+DHD+DH@+D8@+D8@+D8@+D(<+ MD(<*D(<*D(8*CX8*CX8*CX8*CH4*CH4*CH4*C80*C80*C80*C(,*C(,*C(,* MBX,*BX(*BX(*BH(*BH$*BH$*BH$*B8$*B8`*B8`*B(`*B'\*B'\*AW\*AWX* MAWX*AGX*AGX*AGT*A7T*A7T*A7P*A7P*A'P*A'P*A'L*@WL*@WL)@WH)@GH) M@GH)@GD)@7D)@7D)@7D)@'@)@'@)@'@)?W<)?W<)?W<)?W<)?G8)?G8)?G8) M?74)?74)?74)?'0)?'0)?'0)>W0)>W,)>W,)>G,)>G()>G()>G()>7()>7$) M>7$)>'$)>'`)>'`)=W`)=V\)=V\)=F\)=F\)=FX(=6X(=6X(=6T(=6T(=&T( M=&T(=&P(<VP(<VP(<VL(<FL(<FL(<FH(<6H(<6H(<6H(<&D(<&D(<&D(;V@( M;V@(;V@(;V@(;F<(;F<(;F<(;68(;68(;68(;&4(;&4(;&4(:V4(:V0(:V0( M:F0(:F,(:F,(:F,(:6((:6((:6(':&(':&$':&$'``#6R!#5R!#5R!#5QQ#4 MQQ#4QQ#4QA#3QA#3QA#3Q1#3Q1#2Q1#2Q0_2Q`_1Q`_1Q`_1PP_0PP_0PP_0 MPP_/P@_/P@_/P@_.P0_.P0_.P0_-P`_-P`_-P`_-P`_,OP_,OP_,OP_+O@_+ MO@_+O@_*O0_*O0_*O0_)O0_)O`_)O`_(O`_(NP_(NP_(NP_'NP_'N@_'N@_& MN@_&N0_&N0_%N0_%N`[%N`[$N`[$N`[$MP[#MP[#MP[#M@["M@["M@["M@[" MM0[!M0[!M0[!M`[`M`[`M`[`LPZ_LPZ_LPZ_LPZ^L@Z^L@Z^L@Z]L0Z]L0Z] ML0Z]L0Z\L`Z\L`Z\L`Z[KPZ[KPZ[KPZZK@ZZK@ZZK@ZYK@ZYK0ZYK0ZXK0ZX MK`ZXK`VWK`VWK`VWJPVWJPVVJPVVJ@VVJ@VUJ@VUJ0VUJ0VTJ0VTJ0VTJ`VS MJ`VSJ`VSIPVRIPVRIPVRIPVRI@VQI@VQI@VQI0VPI0VPI0VPI`VOI`VOI`VO MI`VNHPVNHPVNHPVMH@VMH@VMH@VLH@VLH0VLH0VLH0VKH`VKH`VKH`RJGPRJ MGPRJGPRIGPRIG@RIG@RHG@RHG0RHG0RGG0RGG0RGG`RGG`RFG`RFFPRFFPRE MFPREF@REF@RDF@RDF@RDF0RCF0RCF0RCF`RBF`RBF`RBF`RAEPRAEPRAEPRA ME@R@E@R@E@R@E0R?E0R?E0R?E0R>E`R>E`R>E`R=DPN=DPN=DPN<DPN<D@N< MD@N<D@N;D0N;D0N;D0N:D`N:D`N:D`N9D`N9CPN9CPN8CPN8C@N8C@N7C@N7 MC@N7C0N6C0N6C0N6C`N6C`N5C`N5BPN5BPN4BPN4BPN4B@N3B@N3B@N3B0N2 MB0N2B0N2B0N1B`N1B`N1B`N1APN0APJ0APJ0A@J/A@J/A@J/A@J.A0J.A0J. MA0J-A`J-A`J-A`J,A`J,@PJ,@PJ+@PJ+@@J+@@J+@@J*@0J*@0J*@0J)@0J) M@`J)@`J(@`J(?PJ(?PJ'?PJ'?PJ'?@J&?@J&?@J&?0J&?0J%?0J%?`J%?`J$ M?`J$?`J$>PJ#>PJ#>PF#>@F">@F">@F">0F!>0F!>0F!>0F`>`F`>`F`>`F` M=PE_=PE_=PE_=PE^=@E^=@E^=@E]=0E]=0E]=0E\=`E\=`E\=`E[=`E[<PE[ M<PE[<PEZ<@EZ<@EZ<@EY<@EY<0EY<0EX<0EX<`EX<`EW<`EW;PEW;PEV;PEV M;PEV;@AU;@AU;@AU;0AU;0AT;0AT;0AT;`AS;`AS;`AS:PAR:PAR:PAR:@AQ M:@AQ:@AQ:@AP:0AP:0AP:0AP:`AO:`AO:`AO:`AN9PAN9PAN9PAM9@AM9@AM M9@AL90AL90AL90AK90AK9`AK9`AJ9`AJ8PAJ8PAJ8PAI8PAI8@AI8@=H8@=H M80<``-;($-;($-7($-7($-7'$-3'$-3'$-3&$-/&$-/&$-/%$-/%$-+%$-+% M#]+$#]'$#]'$#]'##]###]###]###\_"#\_"#\_"#\[!#\[!#\[!#\[`#\W` M#\W`#\W`#\R_#\R_#\R_#\N^#\N^#\N^#\J^#\J]#\J]#\F]#\F\#\F\#\B\ M#\B[#\B[#\B[#\>[#\>Z#\>Z#\:Z#\:Y#\:Y#\6Y#\6Y#\6X#L2X#L2X#L2W M#L.W#L.W#L.V#L.V#L*V#L*V#L*U#L&U#L&U#L&T#L"T#L"T#L"T#K^S#K^S M#K^S#KZR#KZR#KZR#KVQ#KVQ#KVQ#KVQ#KRP#KRP#KRP#KNO#KNO#KNO#KJO M#KJN#KJN#KFN#KFM#KFM#KBM#KBL#KBL#KBL#;>L#;>K#;>K#;:K#;:J#;:J M#;6J#;6J#;6I#;2I#;2I#;2H#;.H#;.H#;.G#;*G#;*G#;*G#;*F#;&F#;&F M#;&E#;"E#;"E#;"E#:^D#:^D#:^D#:ZC#:ZC#:ZC#:VB#:VB#:VB#:VB#:RA M#:RA#:RA#:N@#:N@#:N@#*J@#*J?#*J?#*F?#*F>#*F>#*B>#*B=#*B=#*>= M#*>=#*><#*><#*:<#*:;#*:;#*6;#*6;#*6:#*2:#*2:#*29#*.9#*.9#*.8 M#**8#**8#**8#**7#*&7#*&7#*&6#*"6#*"6#*"6#)^5#)^5#)^5#)Z4#)Z4 M#)Z4#)V3"YV3"YV3"YR3"YR2"YR2"YR2"YN1"YN1"YN1"YJ1"YJ0"YJ0"YF0 M"YF/"YF/"YB/"YB."YB."Y>."Y>."Y>-"Y>-"Y:-"Y:,"Y:,"Y6,"Y6+"Y6+ M"Y2+"Y2+"Y2*"Y.*"Y.*"Y.)"Y*)"Y*)"Y*)"Y&("Y&("Y&("Y&'"Y"'"I"' M"I"&"H^&"H^&"H^&"HZ%"HZ%"HZ%"HV$"HV$"HV$"HR$"HR#"HR#"HR#"HN" M"HN""HN""HJ!"HJ!"HJ!"HF!"HF`"HF`"HB`"HA_"HA_"H=_"H=_"H=^"H9^ M"H9^"H9]"H9]"H5]"H5\"H5\"H1\"H1\"H1["H-["H-["8-Z"8)Z"8)Z"8)Z M"8%Y"8%Y"8%Y"8%X"8!X"8!X"8!W"7]W"7]W"7]W"7YV"7YV"7YV"7UU"7UU M"7UU"7QU"7QT"7QT"7QT"7MS"7MS"7MS"7IR"7IR"7IR"7ER"7EQ"7EQ"7AQ M"7AP"7AP"7=P"7=P"7=O"79O"79O"79N"'9N"'5N"'5M"'5M"'1M"'1M"'1L M"'-L"'-L"'-K"')K"')K"')K"'%J"'%J"'%J"'%I"'!I"'!I"'!H"&]H"&]H M"&]H"&YG"&YG"&YG"&UF"&UF"&UF"&QF"&QE"&QE"&ME"&MD"&MD"&MD"&IC M"&IC"&IC"&EC"&EB"&EB!VAB!P``ULD0UL@0UL@0U<@0U<@0U<<0U,<0U,<0 MU,80U,80T\80T\80T\40TL40TL4/TL0/T<0/T<0/T<,/T,,/T,,/T,,/S\(/ MS\(/S\(/S\$/SL$/SL$/SL$/S<`/S<`/S<`/S+\/S+\/S+\/R[X/R[X/R[X/ MRKX/RKT/RKT/R;T/R;P/R;P/R;P/R+P/R+L/R+L/Q[L/Q[H/Q[H/QKH/QKD/ MQKD/Q;D/Q;D/Q;@.Q+@.Q+@.Q+<.Q+<.P[<.P[<.P[8.PK8.PK8.PK4.P;4. MP;4.P;0.P+0.P+0.P+0.O[,.O[,.O[,.OK(.OK(.OK(.OK(.O;$.O;$.O;$. MO+`.O+`.O+`.NZ\.NZ\.NZ\.NJ\.NJX.NJX.N:X.N:T.N:T.N:T.N*T.N*P. MN*P-MZP-MZL-MZL-MJL-MJH-MJH-M:H-M:H-M:D-M*D-M*D-M*@-LZ@-LZ@- MLZ@-LZ<-LJ<-LJ<-LJ8-L:8-L:8-L:4-L*4-L*4-L*4-KZ0-KZ0-KZ0-KJ,- MKJ,-KJ,-KJ(-K:(-K:(-K:(-K*$-K*$-K*$-JZ`-JZ`-JZ`-JJ`,JI\,JI\, MJ9\,J9X,J9X,J)X,J)T,J)T,J)T,IYT,IYP,IYP,IIP,IIL,IIL,I9L,I9L, MI9H,I)H,I)H,I)D,HYD,HYD,HY@,HY@,HI@,HI@,HI<,H9<,H9<,H98,H)8, MH)8,H)8,GY4,GY4,GY4,GI0,GI0,GI0,G9,+G9,+G9,+G9,+G)(+G)(+G)(+ MFY$+FY$+FY$+FI$+FI`+FI`+F9`+F8\+F8\+F(\+F(X+F(X+F(X+EXX+EXT+ MEXT+EHT+EHP+EHP+E8P+E8P+E8L+E(L+E(L+E(H+DXH+DXH+DXD+DHD+DHD+ MDHD+DH@+D8@+D8@+D8<+D(<*D(<*D(<*CX8*CX8*CX8*CH4*CH4*CH4*C80* MC80*C80*C80*C(,*C(,*C(,*BX(*BX(*BX(*BH(*BH$*BH$*B8$*B8`*B8`* MB(`*B'\*B'\*AW\*AW\*AWX*AWX*AGX*AGT*AGT*A7T*A7T*A7P*A'P*A'P* MA'L*@WL*@WL)@WH)@GH)@GH)@GH)@GD)@7D)@7D)@7@)@'@)@'@)@'@)?W<) M?W<)?W<)?G8)?G8)?G8)?74)?74)?74)?'4)?'0)?'0)?'0)>W,)>W,)>W,) M>G,)>G()>G()>7()>7$)>7$)>'$)>'`)>'`)=W`)=W`)=V\)=V\)=F\)=FX( M=FX(=6X(=6X(=6T(=&T(=&T(=&P(<VP(<VP(<VL(<FL(<FL(<FL(<6H(<6H( M<6H(<6D(<&D(<&D(<&D(;V@(;V@(;V@(;F<(;F<(;F<(;68(;68(;68(;&8( M;&4(;&4(;&4(:V0(:V0(:V0(:F0(:F,(:F,(:6,(:6((:6('``#7R1#6R1#6 MR1#6R!#5R!#5R!#5QQ#5QQ#4QQ#4QA#4QA#3QA#3QA#3Q1#2Q1#2Q0_2Q`_1 MQ`_1Q`_1Q`_0PP_0PP_0PP_/P@_/P@_/P@_/P0_.P0_.P0_.P0_-P`_-P`_- MP`_,OP_,OP_,OP_+OP_+O@_+O@_*O@_*O0_*O0_*O0_)O`_)O`_)O`_(O`_( MNP_(NP_'NP_'N@_'N@_&N@_&N0_&N0_%N0_%N0_%N`[$N`[$N`[$MP[$MP[# MMP[#MP[#M@["M@["M@["M0[!M0[!M0[!M`[`M`[`M`[`M`Z_LPZ_LPZ_LPZ_ ML@Z^L@Z^L@Z^L@Z]L0Z]L0Z]L0Z\L`Z\L`Z\L`Z[KPZ[KPZ[KPZZKPZZK@ZZ MK@ZYK@ZYK0ZYK0ZYK0ZXK0ZXK`ZXK`VWK`VWJPVWJPVVJPVVJ@VVJ@VUJ@VU MJ@VUJ0VTJ0VTJ0VTJ`VTJ`VSJ`VSJ`VSIPVRIPVRIPVRI@VQI@VQI@VQI0VP MI0VPI0VPI0VOI`VOI`VOI`VNHPVNHPVNHPVNHPVMH@VMH@VMH@VLH0VLH0VL MH0VKH`VKH`VKH`VJH`RJGPRJGPRIGPRIG@RIG@RIG@RHG@RHG0RHG0RGG0RG MG`RGG`RFG`RFFPRFFPREFPREFPREF@RDF@RDF@RDF0RCF0RCF0RCF0RCF`RB MF`RBF`RBEPRAEPRAEPRAE@R@E@R@E@R@E@R?E0R?E0R?E0R>E`R>E`R>E`R> ME`R=DPN=DPN=DPN<D@N<D@N<D@N;D0N;D0N;D0N:D0N:D`N:D`N9D`N9CPN9 MCPN8CPN8CPN8C@N8C@N7C@N7C0N7C0N6C0N6C`N6C`N5C`N5C`N5BPN4BPN4 MBPN4B@N3B@N3B@N3B@N3B0N2B0N2B0N2B`N1B`N1B`N1APN0APJ0APJ0APJ/ MA@J/A@J/A@J.A0J.A0J.A0J-A0J-A`J-A`J-A`J,@PJ,@PJ,@PJ+@@J+@@J+ M@@J*@@J*@0J*@0J)@0J)@`J)@`J(@`J(@`J(?PJ(?PJ'?PJ'?@J'?@J&?@J& M?0J&?0J%?0J%?0J%?`J$?`J$?`J$>PJ#>PJ#>PF#>PF#>@F">@F">@F">0F! M>0F!>0F!>`F`>`F`>`F`>`E_=PE_=PE_=PE^=@E^=@E^=@E]=0E]=0E]=0E] M=0E\=`E\=`E\=`E[<PE[<PE[<PEZ<PEZ<@EZ<@EY<@EY<0EY<0EX<0EX<`EX M<`EX<`EW<`EW;PEW;PEV;PEV;@AV;@AU;@AU;@AU;0AT;0AT;0AT;`AS;`AS M;`AS:PAR:PAR:PAR:PAR:@AQ:@AQ:@AQ:0AP:0AP:0AP:0AO:`AO:`AO:`AN M9PAN9PAN9PAM9@AM9@AM9@AM9@AL90AL90AL90AK9`AK9`AK9`AJ9`AJ8PAJ M8PAI8PAI8@@``-?)$-?)$-;)$-;)$-;($-;($-7($-7'$-7'$-3'$-3&$-3& M$-/&$-/&$-/%$-+%$-+%#]+$#]'$#]'$#]'$#]###]###]###]#"#\_"#\_" M#\_!#\[!#\[!#\[!#\W`#\W`#\W`#\R_#\R_#\R_#\N_#\N^#\N^#\N^#\J] M#\J]#\J]#\F\#\F\#\F\#\B\#\B[#\B[#\>[#\>Z#\>Z#\:Z#\:Z#\:Y#\6Y M#\6Y#\6X#L6X#L2X#L2W#L2W#L.W#L.W#L.V#L*V#L*V#L*U#L&U#L&U#L&U M#L"T#L"T#L"T#L"S#K^S#K^S#K^R#KZR#KZR#KZR#KVQ#KVQ#KVQ#KRP#KRP M#KRP#KNP#KNO#KNO#KJO#KJN#KJN#KJN#KFM#KFM#KFM#KBM#KBL#KBL#;>L M#;>K#;>K#;:K#;:K#;:J#;6J#;6J#;6I#;6I#;2I#;2H#;2H#;.H#;.H#;.G M#;*G#;*G#;*F#;&F#;&F#;&F#;"E#;"E#;"E#:^D#:^D#:^D#:^C#:ZC#:ZC M#:ZC#:VB#:VB#:VB#:RA#:RA#:RA#:NA#:N@#:N@#:J@#*J?#*J?#*J?#*F> M#*F>#*F>#*B>#*B=#*B=#*>=#*><#*><#*:<#*:<#*:;#*6;#*6;#*6:#*2: M#*2:#*29#*29#*.9#*.9#*.8#**8#**8#**7#*&7#*&7#*&7#*"6#*"6#*"6 M#)^5#)^5#)^5#)^4#)Z4#)Z4#)Z4#)V3"YV3"YV3"YR2"YR2"YR2"YN2"YN1 M"YN1"YJ1"YJ0"YJ0"YF0"YF/"YF/"YF/"YB/"YB."YB."Y>."Y>-"Y>-"Y:- M"Y:-"Y:,"Y6,"Y6,"Y6+"Y2+"Y2+"Y2*"Y2*"Y.*"Y.*"Y.)"Y*)"Y*)"Y*( M"Y&("Y&("Y&'"Y"'"Y"'"I"'"H^&"H^&"H^&"HZ%"HZ%"HZ%"HZ%"HV$"HV$ M"HV$"HR#"HR#"HR#"HN""HN""HN""HJ""HJ!"HJ!"HF!"HF`"HF`"HF`"HB` M"HA_"HA_"H=_"H=^"H=^"H9^"H9]"H9]"H5]"H5]"H5\"H1\"H1\"H1["H-[ M"H-["H-["8-Z"8)Z"8)Z"8)Y"8%Y"8%Y"8%X"8!X"8!X"8!X"7]W"7]W"7]W M"7YV"7YV"7YV"7YV"7UU"7UU"7UU"7QT"7QT"7QT"7MS"7MS"7MS"7IS"7IR M"7IR"7ER"7EQ"7EQ"7AQ"7AQ"7AP"7AP"7=P"7=O"7=O"79O"79N"'9N"'5N M"'5N"'5M"'1M"'1M"'1L"'-L"'-L"'-L"'-K"')K"')K"')J"'%J"'%J"'%I M"'!I"'!I"'!I"&]H"&]H"&]H"&YG"&YG"&YG"&UG"&UF"&UF"&UF"&QE"&QE M"&QE"&MD"&MD"&MD"&ID"&IC"&IC"&EC"```U\H0U\D0U\D0ULD0ULD0UL@0 MUL@0U<@0U<<0U<<0U,<0U,<0U,80T\80T\80T\40TL40TL4/TL0/T<0/T<0/ MT<0/T<,/T,,/T,,/T,(/S\(/S\(/S\(/SL$/SL$/SL$/S<`/S<`/S<`/S+\/ MS+\/S+\/R[\/R[X/R[X/R[X/RKT/RKT/RKT/R;T/R;P/R;P/R+P/R+L/R+L/ MQ[L/Q[H/Q[H/QKH/QKH/QKD/QKD/Q;D/Q;@.Q;@.Q+@.Q+@.Q+<.P[<.P[<. MP[8.PK8.PK8.PK4.P;4.P;4.P;4.P+0.P+0.P+0.P+,.O[,.O[,.O[,.OK(. MOK(.OK(.O;$.O;$.O;$.O+`.O+`.O+`.N[`.NZ\.NZ\.NZ\.NJX.NJX.NJX. MN:X.N:T.N:T.N*T.N*P.N*P-MZP-MZL-MZL-MJL-MJL-MJH-M:H-M:H-M:D- MM:D-M*D-M*D-M*@-LZ@-LZ@-LZ<-LJ<-LJ<-LJ8-L:8-L:8-L:8-L*4-L*4- ML*4-L*0-KZ0-KZ0-KZ0-KJ,-KJ,-KJ,-K:(-K:(-K:(-K*$-K*$-K*$-JZ$- MJZ`-JZ`-JJ`,JI\,JI\,JI\,J9X,J9X,J9X,J)X,J)T,J)T,IYT,IYP,IYP, MIIP,IIP,IIL,I9L,I9L,I9H,I9H,I)H,I)D,I)D,HYD,HYD,HY@,HI@,HI@, MHI<,H9<,H9<,H9<,H)8,H)8,H)8,GY4,GY4,GY4,GY0,GI0,GI0,GI0,G9,+ MG9,+G9,+G)(+G)(+G)(+FY(+FY$+FY$+FI$+FI`+FI`+FI`+F8\+F8\+F8\+ MF(\+F(X+F(X+EXX+EXT+EXT+EHT+EHT+EHP+E8P+E8P+E8L+E(L+E(L+E(H+ ME(H+DXH+DXH+DXD+DHD+DHD+DH@+D8@+D8@+D8@+D(<+D(<*D(<*CX8*CX8* MCX8*CX4*CH4*CH4*CH4*C80*C80*C80*C(,*C(,*C(,*BX,*BX(*BX(*BH(* MBH$*BH$*B8$*B8`*B8`*B8`*B(`*B'\*B'\*AW\*AWX*AWX*AGX*AGX*AGT* MA7T*A7T*A7P*A'P*A'P*A'L*A'L*@WL*@WL)@WH)@GH)@GH)@GD)@7D)@7D) M@7D)@'@)@'@)@'@)?W<)?W<)?W<)?W8)?G8)?G8)?G8)?74)?74)?74)?'0) M?'0)?'0)>W0)>W,)>W,)>G,)>G()>G()>7()>7$)>7$)>7$)>'$)>'`)>'`) M=W`)=V\)=V\)=F\)=F\)=FX(=6X(=6X(=6T(=&T(=&T(=&P(=&P(<VP(<VP( M<VL(<FL(<FL(<FH(<6H(<6H(<6H(<&D(<&D(<&D(;V@(;V@(;V@(;F<(;F<( M;F<(;F<(;68(;68(;68(;&4(;&4(;&4(:V4(:V0(:V0(:F0(:F,(:F,(``#8 MRA#7RA#7RA#7R1#7R1#6R1#6R!#6R!#5R!#5QQ#5QQ#4QQ#4QQ#4QA#3QA#3 MQA#3Q1#2Q1#2Q0_2Q0_2Q`_1Q`_1Q`_1PP_0PP_0PP_0P@_/P@_/P@_/P@_. MP0_.P0_.P0_-P`_-P`_-P`_,P`_,OP_,OP_,OP_+O@_+O@_+O@_*O0_*O0_* MO0_)O0_)O`_)O`_(O`_(NP_(NP_'NP_'NP_'N@_'N@_&N@_&N0_&N0_%N0_% MN`[%N`[$N`[$N`[$MP[#MP[#MP[#M@["M@["M@["M0[!M0[!M0[!M0[!M`[` MM`[`M`[`LPZ_LPZ_LPZ_LPZ^L@Z^L@Z^L@Z]L0Z]L0Z]L0Z\L`Z\L`Z\L`Z\ ML`Z[KPZ[KPZ[KPZZK@ZZK@ZZK@ZYK@ZYK0ZYK0ZXK0ZXK`ZXK`VWK`VWJPVW MJPVVJPVVJPVVJ@VVJ@VUJ@VUJ0VUJ0VTJ0VTJ0VTJ`VSJ`VSJ`VSIPVRIPVR MIPVRI@VQI@VQI@VQI@VQI0VPI0VPI0VPI`VOI`VOI`VOI`VNHPVNHPVNHPVM MH@VMH@VMH@VLH0VLH0VLH0VKH0VKH`VKH`VKH`RJGPRJGPRJGPRIGPRIG@RI MG@RHG@RHG0RHG0RGG0RGG`RGG`RFG`RFG`RFFPRFFPREFPREF@REF@RDF@RD MF@RDF0RCF0RCF0RCF`RBF`RBF`RBEPRAEPRAEPRAEPR@E@R@E@R@E@R@E0R? ME0R?E0R?E0R>E`R>E`R>E`R=DPN=DPN=DPN<D@N<D@N<D@N;D@N;D0N;D0N; MD0N:D`N:D`N:D`N9D`N9CPN9CPN8CPN8C@N8C@N7C@N7C0N7C0N6C0N6C0N6 MC`N5C`N5C`N5BPN5BPN4BPN4BPN4B@N3B@N3B@N3B0N2B0N2B0N2B`N1B`N1 MB`N1B`N0APN0APJ0APJ0A@J/A@J/A@J/A@J.A0J.A0J.A0J-A`J-A`J-A`J, M@PJ,@PJ,@PJ+@PJ+@@J+@@J*@@J*@0J*@0J*@0J)@0J)@`J)@`J(@`J(?PJ( M?PJ'?PJ'?@J'?@J&?@J&?@J&?0J%?0J%?0J%?`J%?`J$?`J$?`J$>PJ#>PJ# M>PF#>@F">@F">@F">0F!>0F!>0F!>0F`>`F`>`F`>`E_=PE_=PE_=PE_=PE^ M=@E^=@E^=@E]=0E]=0E]=0E\=`E\=`E\=`E[=`E[<PE[<PEZ<PEZ<@EZ<@EZ M<@EY<0EY<0EY<0EX<0EX<`EX<`EW<`EW;PEW;PEV;PEV;PEV;@AU;@AU;@AU M;0AT;0AT;0AT;`AT;`AS;`AS;`AS:PAR:PAR:PAR:@AQ:@AQ:@AQ:@AP:0AP M:0AP:0AO:`AO:`AO:`AO9PAN9PAN9PAN9PAM9@AM9@AM9@AL90AL90AL90AK M90AK9`AK9`AJ9`AJ8P@``-C*$-C*$-C*$-?*$-?)$-?)$-;)$-;($-;($-7( M$-7'$-7'$-3'$-3'$-3&$-/&$-/&$-/%$-+%$-+%$-+%#]+$#]'$#]'$#]'# M#]###]###]#"#\_"#\_"#\_"#\[!#\[!#\[!#\W`#\W`#\W`#\W`#\R_#\R_ M#\R_#\N^#\N^#\N^#\J]#\J]#\J]#\F]#\F\#\F\#\B\#\B[#\B[#\>[#\>[ M#\>Z#\>Z#\:Z#\:Y#\:Y#\6Y#\6X#L6X#L2X#L2X#L2W#L.W#L.W#L.V#L*V M#L*V#L*V#L*U#L&U#L&U#L&T#L"T#L"T#L"S#K^S#K^S#K^S#KZR#KZR#KZR M#KVQ#KVQ#KVQ#KRQ#KRP#KRP#KRP#KNO#KNO#KNO#KJN#KJN#KJN#KFN#KFM M#KFM#KBM#KBL#KBL#;>L#;>L#;>K#;>K#;:K#;:J#;:J#;6J#;6I#;6I#;2I M#;2I#;2H#;.H#;.H#;.G#;*G#;*G#;*G#;&F#;&F#;&F#;&E#;"E#;"E#;"D M#:^D#:^D#:^D#:ZC#:ZC#:ZC#:VB#:VB#:VB#:RB#:RA#:RA#:RA#:N@#:N@ M#:N@#*J?#*J?#*J?#*F?#*F>#*F>#*B>#*B=#*B=#*>=#*>=#*><#*:<#*:< M#*:;#*:;#*6;#*6:#*6:#*2:#*2:#*29#*.9#*.9#*.8#**8#**8#**8#*&7 M#*&7#*&7#*&6#*"6#*"6#*"5#)^5#)^5#)^5#)Z4#)Z4#)Z4#)V3"YV3"YV3 M"YR3"YR2"YR2"YN2"YN1"YN1"YN1"YJ0"YJ0"YJ0"YF0"YF/"YF/"YB/"YB. M"YB."Y>."Y>."Y>-"Y:-"Y:-"Y:,"Y:,"Y6,"Y6+"Y6+"Y2+"Y2+"Y2*"Y.* M"Y.*"Y.)"Y*)"Y*)"Y*("Y&("Y&("Y&("Y"'"Y"'"I"'"I"&"H^&"H^&"H^& M"HZ%"HZ%"HZ%"HV$"HV$"HV$"HR#"HR#"HR#"HN#"HN""HN""HN""HJ!"HJ! M"HJ!"HF!"HF`"HF`"HB`"HA_"HA_"H=_"H=^"H=^"H9^"H9^"H9]"H9]"H5] M"H5\"H5\"H1\"H1\"H1["H-["H-["8-Z"8)Z"8)Z"8)Y"8%Y"8%Y"8%Y"8!X M"8!X"8!X"8!W"7]W"7]W"7]W"7YV"7YV"7YV"7UU"7UU"7UU"7QT"7QT"7QT M"7MT"7MS"7MS"7MS"7IR"7IR"7IR"7ER"7EQ"7EQ"7AQ"7AP"7AP"7=P"7=O M"7=O"79O"79O"79N"'5N"'5N"'5M"'5M"'1M"'1M"'1L"'-L"'-L"'-K"')K M"')K"')J"'%J"'%J"'%J"'!I"'!I"'!I"'!H"&]H"&]H"&]H"&YG"&YG"&YG M"&UF"&UF"&UF"&QE"&QE"&QE"&ME"&MD"&MD"&ID"```V<L0V,H0V,H0V,H0 MU\H0U\D0U\D0ULD0UL@0UL@0U<@0U<@0U<<0U,<0U,<0U,80T\80T\80T\40 MT\40TL40TL4/TL0/T<0/T<0/T<,/T,,/T,,/T,,/S\(/S\(/S\(/SL$/SL$/ MSL$/SL`/S<`/S<`/S<`/S+\/S+\/S+\/R[X/R[X/R[X/RKX/RKT/RKT/R;T/ MR;P/R;P/R+P/R+L/R+L/R+L/Q[L/Q[H/Q[H/QKH/QKD/QKD/Q;D/Q;D/Q;@. MQ+@.Q+@.Q+<.P[<.P[<.P[8.P[8.PK8.PK8.PK4.P;4.P;4.P;0.P+0.P+0. MP+0.O[,.O[,.O[,.OK(.OK(.OK(.O;$.O;$.O;$.O;$.O+`.O+`.O+`.NZ\. MNZ\.NZ\.NJ\.NJX.NJX.N:X.N:T.N:T.N*T.N*P.N*P-N*P-MZP-MZL-MZL- MMJL-MJH-MJH-M:H-M:H-M:D-M*D-M*D-M*@-LZ@-LZ@-LZ<-LJ<-LJ<-LJ<- MLJ8-L:8-L:8-L:4-L*4-L*4-L*4-KZ0-KZ0-KZ0-KJ,-KJ,-KJ,-K:(-K:(- MK:(-K:(-K*$-K*$-K*$-JZ`-JZ`-JZ`,JJ`,JI\,JI\,J9\,J9X,J9X,J)X, MJ)T,J)T,IYT,IYT,IYP,IYP,IIP,IIL,IIL,I9L,I9H,I9H,I)H,I)H,I)D, MHYD,HYD,HY@,HI@,HI@,HI@,HI<,H9<,H9<,H98,H)8,H)8,H)4,GY4,GY4, MGY4,GI0,GI0,GI0,G9,+G9,+G9,+G),+G)(+G)(+G)(+FY$+FY$+FY$+FI`+ MFI`+FI`+F9`+F8\+F8\+F(\+F(X+F(X+EXX+EXX+EXT+EXT+EHT+EHP+EHP+ ME8P+E8L+E8L+E(L+E(L+E(H+DXH+DXH+DXD+DHD+DHD+DHD+D8@+D8@+D8@+ MD8<+D(<*D(<*D(8*CX8*CX8*CX8*CH4*CH4*CH4*C80*C80*C80*C(0*C(,* MC(,*C(,*BX(*BX(*BX(*BH$*BH$*BH$*B8$*B8`*B8`*B(`*B'\*B'\*AW\* MAW\*AWX*AGX*AGX*AGT*AGT*A7T*A7P*A7P*A'P*A'P*A'L*@WL*@WL)@WH) M@GH)@GH)@GH)@7D)@7D)@7D)@7@)@'@)@'@)@'<)?W<)?W<)?W<)?G8)?G8) M?G8)?74)?74)?74)?'4)?'0)?'0)>W0)>W,)>W,)>W,)>G()>G()>G()>7() M>7$)>7$)>'$)>'`)>'`)=W`)=W`)=V\)=F\)=F\)=FX(=FX(=6X(=6T(=6T( M=&T(=&T(=&P(<VP(<VP(<VL(<FL(<FL(<FL(<6H(<6H(<6H(<&D(<&D(<&D( M<&@(;V@(;V@(;V@(;F<(;F<(;F<(;68(;68(;68(;&8(;&4(;&4(:V4(:V0( M:V0(``#9RQ#9RQ#8RQ#8RA#8RA#7RA#7R1#7R1#6R1#6R!#6R!#5R!#5R!#5 MQQ#4QQ#4QQ#4QA#4QA#3QA#3QA#3Q1#2Q1#2Q0_2Q`_1Q`_1Q`_1PP_0PP_0 MPP_0PP_/P@_/P@_/P@_.P0_.P0_.P0_.P0_-P`_-P`_-P`_,OP_,OP_,OP_+ MO@_+O@_+O@_*O@_*O0_*O0_)O0_)O`_)O`_)O`_(O`_(NP_(NP_'NP_'N@_' MN@_&N@_&N0_&N0_%N0_%N0_%N`[$N`[$N`[$MP[#MP[#MP[#MP[#M@["M@[" MM@["M0[!M0[!M0[!M`[`M`[`M`[`M`Z_LPZ_LPZ_LPZ^L@Z^L@Z^L@Z^L0Z] ML0Z]L0Z]L0Z\L`Z\L`Z\L`Z[KPZ[KPZ[KPZZKPZZK@ZZK@ZYK@ZYK0ZYK0ZX MK0ZXK`ZXK`ZXK`VWK`VWJPVWJPVVJPVVJ@VVJ@VUJ@VUJ@VUJ0VTJ0VTJ0VT MJ`VSJ`VSJ`VSIPVSIPVRIPVRIPVRI@VQI@VQI@VQI0VPI0VPI0VPI0VOI`VO MI`VOI`VNHPVNHPVNHPVMH@VMH@VMH@VMH@VLH0VLH0VLH0VKH`VKH`VKH`VJ MH`RJGPRJGPRIGPRIG@RIG@RHG@RHG0RHG0RHG0RGG0RGG`RGG`RFG`RFFPRF MFPREFPREFPREF@RDF@RDF@RDF0RCF0RCF0RCF`RBF`RBF`RBF`RBEPRAEPRA MEPRAE@R@E@R@E@R@E@R?E0R?E0R?E0R>E`R>E`R>E`R=DPN=DPN=DPN=DPN< MD@N<D@N<D@N;D0N;D0N;D0N:D0N:D`N:D`N9D`N9CPN9CPN8CPN8C@N8C@N7 MC@N7C@N7C0N7C0N6C0N6C`N6C`N5C`N5C`N5BPN4BPN4BPN4B@N3B@N3B@N3 MB0N2B0N2B0N2B0N2B`N1B`N1B`N1APN0APJ0APJ0APJ/A@J/A@J/A@J.A0J. MA0J.A0J-A`J-A`J-A`J-A`J,@PJ,@PJ,@PJ+@@J+@@J+@@J*@@J*@0J*@0J) M@0J)@`J)@`J(@`J(?PJ(?PJ'?PJ'?PJ'?@J'?@J&?@J&?0J&?0J%?0J%?0J% M?`J$?`J$?`J$>PJ#>PJ#>PF#>@F">@F">@F">@F">0F!>0F!>0F!>`F`>`F` M>`F`>`E_=PE_=PE_=PE^=@E^=@E^=@E]=0E]=0E]=0E\=0E\=`E\=`E\=`E[ M<PE[<PE[<PEZ<PEZ<@EZ<@EY<@EY<0EY<0EX<0EX<`EX<`EW<`EW<`EW;PEW M;PEV;PEV;@AV;@AU;@AU;0AU;0AT;0AT;0AT;`AS;`AS;`AS:PAR:PAR:PAR M:PAQ:@AQ:@AQ:@AQ:0AP:0AP:0AP:`AO:`AO:`AO:`AN9PAN9PAN9PAM9@AM M9@AM9@AL9@AL90AL90AL90AK9`@``-G+$-G+$-G+$-C+$-C*$-C*$-?*$-?) M$-?)$-;)$-;($-;($-7($-7($-7'$-7'$-3'$-3&$-3&$-/&$-/&$-/%$-+% M$-+%#]+$#]'$#]'$#]'##]###]###]###\_"#\_"#\_"#\_!#\[!#\[!#\[! M#\W`#\W`#\W`#\R_#\R_#\R_#\N^#\N^#\N^#\J^#\J]#\J]#\J]#\F\#\F\ M#\F\#\B\#\B[#\B[#\>[#\>Z#\>Z#\:Z#\:Y#\:Y#\6Y#\6Y#\6X#L2X#L2X M#L2W#L2W#L.W#L.W#L.V#L*V#L*V#L*U#L&U#L&U#L&T#L"T#L"T#L"T#K^S M#K^S#K^S#K^R#KZR#KZR#KZR#KVQ#KVQ#KVQ#KRP#KRP#KRP#KNO#KNO#KNO M#KJO#KJN#KJN#KFN#KFM#KFM#KFM#KBM#KBL#KBL#;>L#;>K#;>K#;:K#;:J M#;:J#;6J#;6J#;6I#;2I#;2I#;2H#;2H#;.H#;.H#;.G#;*G#;*G#;*F#;&F M#;&F#;&E#;"E#;"E#;"E#:^D#:^D#:^D#:ZC#:ZC#:ZC#:ZC#:VB#:VB#:VB M#:RA#:RA#:RA#:N@#:N@#:N@#:J@#*J?#*J?#*F?#*F>#*F>#*F>#*B>#*B= M#*B=#*>=#*><#*><#*:<#*:;#*:;#*6;#*6;#*6:#*2:#*2:#*29#*.9#*.9 M#*.9#*.8#**8#**8#**7#*&7#*&7#*&6#*"6#*"6#*"6#)^5#)^5#)^5#)Z4 M#)Z4#)Z4#)Z4#)V3"YV3"YV3"YR2"YR2"YR2"YN1"YN1"YN1"YJ1"YJ0"YJ0 M"YF0"YF/"YF/"YB/"YB/"YB."YB."Y>."Y>-"Y>-"Y:-"Y:,"Y:,"Y6,"Y6, M"Y6+"Y2+"Y2+"Y2*"Y.*"Y.*"Y.*"Y.)"Y*)"Y*)"Y*("Y&("Y&("Y&'"Y"' M"I"'"I"'"H^&"H^&"H^&"HZ%"HZ%"HZ%"HV$"HV$"HV$"HV$"HR#"HR#"HR# M"HN""HN""HN""HJ""HJ!"HJ!"HF!"HF`"HF`"HB`"HA_"HA_"HA_"H=_"H=^ M"H=^"H9^"H9]"H9]"H5]"H5]"H5\"H1\"H1\"H1["H-["H-["8-Z"8)Z"8)Z M"8)Z"8)Y"8%Y"8%Y"8%X"8!X"8!X"8!X"7]W"7]W"7]W"7YV"7YV"7YV"7UU M"7UU"7UU"7UU"7QT"7QT"7QT"7MS"7MS"7MS"7IS"7IR"7IR"7ER"7EQ"7EQ M"7AQ"7AP"7AP"7=P"7=P"7=O"7=O"79O"79N"'9N"'5N"'5N"'5M"'1M"'1M M"'1L"'-L"'-L"'-K"')K"')K"')K"')J"'%J"'%J"'%I"'!I"'!I"'!I"&]H M"&]H"&]H"&YG"&YG"&YG"&UF"&UF"&UF"&QF"&QE"&QE"&QE"```VLP0V<L0 MV<L0V<L0V,L0V,H0V,H0U\H0U\D0U\D0ULD0ULD0UL@0U<@0U<@0U<<0U<<0 MU,<0U,80U,80T\80T\80T\40TL40TL4/TL0/T<0/T<0/T<0/T,,/T,,/T,,/ MT,(/S\(/S\(/S\$/SL$/SL$/SL$/S<`/S<`/S<`/S+\/S+\/S+\/R[\/R[X/ MR[X/RKX/RKT/RKT/RKT/R;P/R;P/R;P/R+P/R+L/R+L/Q[L/Q[H/Q[H/QKH/ MQKH/QKD/Q;D/Q;D/Q;@.Q;@.Q+@.Q+<.Q+<.P[<.P[<.P[8.PK8.PK8.PK4. MP;4.P;4.P;4.P+0.P+0.P+0.O[,.O[,.O[,.O[(.OK(.OK(.OK(.O;$.O;$. MO;$.O+`.O+`.O+`.N[`.NZ\.NZ\.NJ\.NJX.NJX.NJX.N:T.N:T.N:T.N*T. MN*P.N*P-MZP-MZL-MZL-MJL-MJL-MJH-M:H-M:H-M:D-M*D-M*D-M*@-M*@- MLZ@-LZ@-LZ<-LJ<-LJ<-LJ8-L:8-L:8-L:8-L*4-L*4-L*4-KZ0-KZ0-KZ0- MKZ,-KJ,-KJ,-KJ,-K:(-K:(-K:(-K*$-K*$-K*$-JZ$-JZ`-JZ`-JJ`,JI\, MJI\,J9\,J9X,J9X,J9X,J)X,J)T,J)T,IYT,IYP,IYP,IIP,IIP,IIL,I9L, MI9L,I9H,I)H,I)H,I)D,I)D,HYD,HYD,HY@,HI@,HI@,HI<,H9<,H9<,H98, MH)8,H)8,H)8,GY4,GY4,GY4,GI0,GI0,GI0,GI0,G9,+G9,+G9,+G)(+G)(+ MG)(+FY$+FY$+FY$+FI$+FI`+FI`+F9`+F8\+F8\+F8\+F(\+F(X+F(X+EXX+ MEXT+EXT+EHT+EHP+EHP+E8P+E8P+E8L+E(L+E(L+E(H+DXH+DXH+DXH+DXD+ MDHD+DHD+DH@+D8@+D8@+D8<+D(<+D(<*D(<*CX8*CX8*CX8*CH4*CH4*CH4* MCH4*C80*C80*C80*C(,*C(,*C(,*BX(*BX(*BX(*BH(*BH$*BH$*B8$*B8`* MB8`*B8`*B(`*B'\*B'\*AW\*AWX*AWX*AGX*AGT*AGT*A7T*A7T*A7P*A'P* MA'P*A'L*@WL*@WL)@WL)@WH)@GH)@GH)@GD)@7D)@7D)@7@)@'@)@'@)@'@) M?W<)?W<)?W<)?G8)?G8)?G8)?G8)?74)?74)?74)?'0)?'0)?'0)>W,)>W,) M>W,)>G,)>G()>G()>7()>7$)>7$)>'$)>'$)>'`)>'`)=W`)=V\)=V\)=F\) M=FX(=FX(=6X(=6X(=6T(=&T(=&T(=&P(<VP(<VP(<VP(<VL(<FL(<FL(<FH( M<6H(<6H(<6D(<&D(<&D(<&D(;V@(;V@(;V@(;F<(;F<(;F<(;6<(;68(;68( M;68(;&4(;&4(``#:S!#:S!#9S!#9RQ#9RQ#8RQ#8RA#8RA#7RA#7R1#7R1#6 MR1#6R1#6R!#6R!#5R!#5QQ#5QQ#4QQ#4QQ#4QA#3QA#3QA#3Q1#2Q1#2Q0_2 MQ`_1Q`_1Q`_1Q`_1PP_0PP_0PP_0P@_/P@_/P@_/P@_.P0_.P0_.P0_-P`_- MP`_-P`_,OP_,OP_,OP_+OP_+O@_+O@_+O@_*O0_*O0_*O0_)O0_)O`_)O`_( MO`_(NP_(NP_'NP_'N@_'N@_&N@_&N@_&N0_&N0_%N0_%N`[%N`[$N`[$N`[$ MMP[#MP[#MP[#M@["M@["M@["M0[!M0[!M0[!M0[`M`[`M`[`M`[`LPZ_LPZ_ MLPZ_LPZ^L@Z^L@Z^L@Z]L0Z]L0Z]L0Z\L`Z\L`Z\L`Z[L`Z[KPZ[KPZ[KPZZ MK@ZZK@ZZK@ZYK0ZYK0ZYK0ZXK0ZXK`ZXK`VWK`VWJPVWJPVVJPVVJPVVJ@VU MJ@VUJ@VUJ0VUJ0VTJ0VTJ`VTJ`VSJ`VSJ`VSIPVRIPVRIPVRI@VQI@VQI@VQ MI@VPI0VPI0VPI0VPI`VOI`VOI`VOHPVNHPVNHPVNHPVMH@VMH@VMH@VLH0VL MH0VLH0VKH0VKH`VKH`VJH`RJGPRJGPRJGPRIG@RIG@RIG@RHG@RHG0RHG0RG MG0RGG`RGG`RFG`RFG`RFFPREFPREFPREF@REF@RDF@RDF0RDF0RCF0RCF0RC MF`RBF`RBF`RBEPRAEPRAEPRAEPR@E@R@E@R@E@R?E0R?E0R?E0R?E`R>E`R> ME`R>E`R=DPN=DPN=DPN<D@N<D@N<D@N;D@N;D0N;D0N:D0N:D`N:D`N:D`N9 MCPN9CPN9CPN8CPN8C@N8C@N7C@N7C0N7C0N6C0N6C0N6C`N5C`N5C`N5BPN4 MBPN4BPN4B@N4B@N3B@N3B@N3B0N2B0N2B0N2B`N1B`N1B`N1B`N0APN0APJ0 MAPJ/A@J/A@J/A@J/A0J.A0J.A0J.A0J-A`J-A`J-A`J,@PJ,@PJ,@PJ+@PJ+ M@@J+@@J*@@J*@0J*@0J)@0J)@`J)@`J)@`J(@`J(?PJ(?PJ'?PJ'?@J'?@J& M?@J&?@J&?0J%?0J%?0J%?`J$?`J$?`J$>PJ$>PJ#>PJ#>PF#>@F">@F">@F" M>0F!>0F!>0F!>0F`>`F`>`F`>`E_=PE_=PE_=PE^=@E^=@E^=@E^=@E]=0E] M=0E]=0E\=`E\=`E\=`E[=`E[<PE[<PEZ<PEZ<@EZ<@EY<@EY<0EY<0EY<0EX M<0EX<`EX<`EW<`EW;PEW;PEV;PEV;PEV;@AU;@AU;@AU;0AT;0AT;0AT;`AS M;`AS;`AS;`AS:PAR:PAR:PAR:@AQ:@AQ:@AQ:0AP:0AP:0AP:0AO:`AO:`AO M:`AN9PAN9PAN9PAN9PAM9@AM9@AM9@AL90@``-K,$-K,$-K,$-G,$-G+$-G+ M$-C+$-C*$-C*$-?*$-?*$-?)$-?)$-;)$-;($-;($-7($-7'$-7'$-3'$-3' M$-3&$-/&$-/&$-/%$-+%$-+%#]+$#]'$#]'$#]'$#]'##]###]###]#"#\_" M#\_"#\_"#\[!#\[!#\[!#\W`#\W`#\W`#\R_#\R_#\R_#\R_#\N^#\N^#\N^ M#\J]#\J]#\J]#\F]#\F\#\F\#\B\#\B[#\B[#\>[#\>Z#\>Z#\:Z#\:Z#\:Y M#\:Y#\6Y#\6X#L6X#L2X#L2X#L2W#L.W#L.W#L.V#L*V#L*V#L*U#L&U#L&U M#L&U#L&T#L"T#L"T#L"S#K^S#K^S#K^S#KZR#KZR#KZR#KVQ#KVQ#KVQ#KRP M#KRP#KRP#KNP#KNO#KNO#KNO#KJN#KJN#KJN#KFN#KFM#KFM#KBM#KBL#KBL M#;>L#;>K#;>K#;:K#;:K#;:J#;:J#;6J#;6I#;6I#;2I#;2I#;2H#;.H#;.H M#;.G#;*G#;*G#;*F#;&F#;&F#;&F#;"E#;"E#;"E#;"D#:^D#:^D#:^D#:ZC M#:ZC#:ZC#:VB#:VB#:VB#:RA#:RA#:RA#:NA#:N@#:N@#:N@#*J?#*J?#*J? M#*F?#*F>#*F>#*B>#*B=#*B=#*>=#*><#*><#*:<#*:<#*:;#*6;#*6;#*6: M#*6:#*2:#*2:#*29#*.9#*.9#*.8#**8#**8#**7#*&7#*&7#*&7#*"6#*"6 M#*"6#*"5#)^5#)^5#)^5#)Z4#)Z4#)Z4#)V3"YV3"YV3"YR2"YR2"YR2"YN2 M"YN1"YN1"YJ1"YJ0"YJ0"YJ0"YF0"YF/"YF/"YB/"YB."YB."Y>."Y>-"Y>- M"Y:-"Y:-"Y:,"Y6,"Y6,"Y6+"Y6+"Y2+"Y2+"Y2*"Y.*"Y.*"Y.)"Y*)"Y*) M"Y*("Y&("Y&("Y&("Y"'"Y"'"I"'"I"&"H^&"H^&"H^&"HZ%"HZ%"HZ%"HV$ M"HV$"HV$"HR#"HR#"HR#"HN#"HN""HN""HJ""HJ!"HJ!"HJ!"HF`"HF`"HF` M"HB`"HA_"HA_"H=_"H=^"H=^"H9^"H9^"H9]"H5]"H5]"H5\"H5\"H1\"H1[ M"H1["H-["H-["8-Z"8)Z"8)Z"8)Y"8%Y"8%Y"8%Y"8!X"8!X"8!X"7]W"7]W M"7]W"7]V"7YV"7YV"7YV"7UU"7UU"7UU"7QT"7QT"7QT"7MT"7MS"7MS"7IS M"7IR"7IR"7IR"7EQ"7EQ"7EQ"7AQ"7AP"7AP"7=P"7=O"7=O"79O"79O"79N M"'5N"'5N"'5M"'1M"'1M"'1L"'1L"'-L"'-L"'-K"')K"')K"')J"'%J"'%J M"'%J"'!I"'!I"'!I"&]H"&]H"&]H"&]G"&YG"&YG"&YG"&UF"&UF"&UF"``` MV\T0VLP0VLP0VLP0V<P0V<L0V<L0V,L0V,H0V,H0V,H0U\H0U\D0U\D0ULD0 MUL@0UL@0U<@0U<<0U<<0U,<0U,<0U,80T\80T\80T\40TL40TL4/TL4/TL0/ MT<0/T<0/T<,/T,,/T,,/T,(/S\(/S\(/S\(/SL$/SL$/SL$/S<`/S<`/S<`/ MS<`/S+\/S+\/S+\/R[X/R[X/R[X/RKT/RKT/RKT/R;T/R;P/R;P/R+P/R+L/ MR+L/Q[L/Q[L/Q[H/Q[H/QKH/QKD/QKD/Q;D/Q;@.Q;@.Q+@.Q+@.Q+<.P[<. MP[<.P[8.PK8.PK8.PK8.PK4.P;4.P;4.P;0.P+0.P+0.P+,.O[,.O[,.O[,. MOK(.OK(.OK(.O;$.O;$.O;$.O+$.O+`.O+`.O+`.NZ\.NZ\.NZ\.NJX.NJX. MNJX.N:X.N:T.N:T.N*T.N*P.N*P-MZP-MZP-MZL-MZL-MJL-MJH-MJH-M:H- MM:D-M:D-M*D-M*D-M*@-LZ@-LZ@-LZ<-LJ<-LJ<-LJ<-L:8-L:8-L:8-L:4- ML*4-L*4-L*0-KZ0-KZ0-KZ0-KJ,-KJ,-KJ,-K:(-K:(-K:(-K*(-K*$-K*$- MK*$-JZ`-JZ`-JZ`,JI\,JI\,JI\,J9\,J9X,J9X,J)X,J)T,J)T,IYT,IYT, MIYP,IIP,IIP,IIL,IIL,I9L,I9H,I9H,I)H,I)H,I)D,HYD,HYD,HY@,HI@, MHI@,HI@,H9<,H9<,H9<,H98,H)8,H)8,H)4,GY4,GY4,GY4,GI0,GI0,GI0, MG9,+G9,+G9,+G)(+G)(+G)(+FY(+FY$+FY$+FY$+FI`+FI`+FI`+F9`+F8\+ MF8\+F(\+F(X+F(X+EXX+EXT+EXT+EHT+EHT+EHP+EHP+E8P+E8L+E8L+E(L+ ME(L+E(H+DXH+DXH+DXD+DHD+DHD+DH@+D8@+D8@+D8@+D(<+D(<*D(<*D(8* MCX8*CX8*CX8*CH4*CH4*CH4*C80*C80*C80*C(,*C(,*C(,*BX,*BX(*BX(* MBX(*BH$*BH$*BH$*B8$*B8`*B8`*B(`*B'\*B'\*AW\*AWX*AWX*AGX*AGX* MAGT*A7T*A7T*A7P*A7P*A'P*A'P*A'L*@WL*@WL)@WH)@GH)@GH)@GD)@7D) M@7D)@7D)@'@)@'@)@'@)@'<)?W<)?W<)?W<)?G8)?G8)?G8)?74)?74)?74) M?'0)?'0)?'0)>W0)>W,)>W,)>G,)>G()>G()>G()>7()>7$)>7$)>'$)>'`) M>'`)=W`)=V\)=V\)=F\)=F\)=FX(=6X(=6X(=6T(=6T(=&T(=&T(=&P(<VP( M<VP(<VL(<FL(<FL(<FH(<6H(<6H(<6H(<&D(<&D(<&D(;V@(;V@(;V@(;V@( M;F<(;F<(;F<(;68(;68(``#;S1#;S1#:S1#:S!#:S!#9S!#9RQ#9RQ#8RQ#8 MRA#8RA#8RA#7RA#7R1#7R1#6R1#6R!#6R!#5R!#5R!#5QQ#4QQ#4QQ#4QA#3 MQA#3QA#3Q1#3Q1#2Q1#2Q0_2Q`_1Q`_1Q`_1PP_0PP_0PP_0PP_/P@_/P@_/ MP@_.P0_.P0_.P0_-P`_-P`_-P`_-P`_,OP_,OP_,OP_+O@_+O@_+O@_*O@_* MO0_*O0_)O0_)O`_)O`_(O`_(NP_(NP_(NP_'NP_'N@_'N@_&N@_&N0_&N0_% MN0_%N0_%N`[$N`[$N`[$MP[#MP[#MP[#M@["M@["M@["M@["M0[!M0[!M0[! MM`[`M`[`M`[`M`Z_LPZ_LPZ_LPZ^L@Z^L@Z^L@Z]L0Z]L0Z]L0Z]L0Z\L`Z\ ML`Z\L`Z[KPZ[KPZ[KPZZKPZZK@ZZK@ZYK@ZYK0ZYK0ZXK0ZXK`ZXK`VWK`VW MK`VWJPVWJPVVJPVVJ@VVJ@VUJ@VUJ0VUJ0VTJ0VTJ0VTJ`VSJ`VSJ`VSIPVR MIPVRIPVRIPVRI@VQI@VQI@VQI0VPI0VPI0VPI`VOI`VOI`VOI`VNHPVNHPVN MHPVMH@VMH@VMH@VLH@VLH0VLH0VLH0VKH`VKH`VKH`RJGPRJGPRJGPRIGPRI MG@RIG@RHG@RHG0RHG0RGG0RGG0RGG`RGG`RFG`RFFPRFFPREFPREF@REF@RD MF@RDF@RDF0RCF0RCF0RCF`RBF`RBF`RBF`RAEPRAEPRAEPRAE@R@E@R@E@R@ ME0R?E0R?E0R?E0R>E`R>E`R>E`R=DPN=DPN=DPN<DPN<D@N<D@N<D@N;D0N; MD0N;D0N:D`N:D`N:D`N9D`N9CPN9CPN8CPN8C@N8C@N7C@N7C@N7C0N7C0N6 MC0N6C`N6C`N5C`N5BPN5BPN4BPN4BPN4B@N3B@N3B@N3B0N2B0N2B0N2B0N1 MB`N1B`N1B`N1APN0APJ0APJ0A@J/A@J/A@J/A@J.A0J.A0J.A0J-A`J-A`J- MA`J,A`J,@PJ,@PJ,@PJ+@@J+@@J+@@J*@0J*@0J*@0J)@0J)@`J)@`J(@`J( M?PJ(?PJ'?PJ'?PJ'?@J&?@J&?@J&?0J&?0J%?0J%?`J%?`J$?`J$?`J$>PJ# M>PJ#>PF#>@F">@F">@F">@F!>0F!>0F!>0F!>`F`>`F`>`F`=PE_=PE_=PE_ M=PE^=@E^=@E^=@E]=0E]=0E]=0E\=0E\=`E\=`E[=`E[<PE[<PE[<PEZ<@EZ M<@EZ<@EY<@EY<0EY<0EX<0EX<`EX<`EW<`EW<`EW;PEV;PEV;PEV;@AV;@AU M;@AU;0AU;0AT;0AT;0AT;`AS;`AS;`AS:PAR:PAR:PAR:PAQ:@AQ:@AQ:@AP M:0AP:0AP:0AP:`AO:`AO:`AO:`AN9PAN9PAN9PAM9@@``-O-$-O-$-O-$-K- M$-K,$-K,$-G,$-G+$-G+$-G+$-C+$-C*$-C*$-?*$-?)$-?)$-;)$-;($-;( M$-7($-7($-7'$-3'$-3'$-3&$-3&$-/&$-/&$-/%$-+%$-+%#]+$#]'$#]'$ M#]'##]###]###]###\_"#\_"#\_"#\[!#\[!#\[!#\[`#\W`#\W`#\W`#\R_ M#\R_#\R_#\N^#\N^#\N^#\J^#\J]#\J]#\F]#\F\#\F\#\F\#\B[#\B[#\B[ M#\>[#\>Z#\>Z#\:Z#\:Y#\:Y#\6Y#\6Y#\6X#L2X#L2X#L2W#L.W#L.W#L.V M#L.V#L*V#L*V#L*U#L&U#L&U#L&T#L"T#L"T#L"T#K^S#K^S#K^S#KZR#KZR M#KZR#KZQ#KVQ#KVQ#KVQ#KRP#KRP#KRP#KNO#KNO#KNO#KJO#KJN#KJN#KFN M#KFM#KFM#KBM#KBL#KBL#KBL#;>L#;>K#;>K#;:K#;:J#;:J#;6J#;6J#;6I M#;2I#;2I#;2H#;.H#;.H#;.G#;.G#;*G#;*G#;*F#;&F#;&F#;&E#;"E#;"E M#;"E#:^D#:^D#:^D#:ZC#:ZC#:ZC#:VB#:VB#:VB#:VB#:RA#:RA#:RA#:N@ M#:N@#:N@#*J@#*J?#*J?#*F?#*F>#*F>#*B>#*B=#*B=#*B=#*>=#*><#*>< M#*:<#*:;#*:;#*6;#*6;#*6:#*2:#*2:#*29#*.9#*.9#*.8#**8#**8#**8 M#**7#*&7#*&7#*&6#*"6#*"6#*"6#)^5#)^5#)^5#)Z4#)Z4#)Z4#)V3"YV3 M"YV3"YV3"YR2"YR2"YR2"YN1"YN1"YN1"YJ1"YJ0"YJ0"YF0"YF/"YF/"YB/ M"YB."YB."Y>."Y>."Y>-"Y>-"Y:-"Y:,"Y:,"Y6,"Y6,"Y6+"Y2+"Y2+"Y2* M"Y.*"Y.*"Y.)"Y*)"Y*)"Y*)"Y*("Y&("Y&("Y&'"Y"'"I"'"I"'"H^&"H^& M"H^&"HZ%"HZ%"HZ%"HV$"HV$"HV$"HR$"HR#"HR#"HR#"HN""HN""HN""HJ" M"HJ!"HJ!"HF!"HF`"HF`"HB`"HA_"HA_"H=_"H=_"H=^"H=^"H9^"H9]"H9] M"H5]"H5\"H5\"H1\"H1\"H1["H-["H-["8-Z"8)Z"8)Z"8)Z"8%Y"8%Y"8%Y M"8%X"8!X"8!X"8!W"7]W"7]W"7]W"7YV"7YV"7YV"7UU"7UU"7UU"7QU"7QT M"7QT"7QT"7MS"7MS"7MS"7IR"7IR"7IR"7ER"7EQ"7EQ"7AQ"7AP"7AP"7=P M"7=P"7=O"79O"79O"79N"'9N"'5N"'5M"'5M"'1M"'1M"'1L"'-L"'-L"'-K M"')K"')K"')K"'%J"'%J"'%J"'%I"'!I"'!I"'!H"&]H"&]H"&]H"&YG"&YG M"&YG"```W,X0V\T0V\T0V\T0VLT0VLP0VLP0VLP0V<L0V<L0V<L0V,L0V,H0 MV,H0U\H0U\D0U\D0ULD0UL@0UL@0U<@0U<@0U<<0U,<0U,<0U,80U,80T\80 MT\80T\40TL40TL4/TL0/T<0/T<0/T<,/T,,/T,,/T,,/S\(/S\(/S\(/S\$/ MSL$/SL$/SL$/S<`/S<`/S<`/S+\/S+\/S+\/R[X/R[X/R[X/RKX/RKT/RKT/ MR;T/R;P/R;P/R;P/R+P/R+L/R+L/Q[L/Q[H/Q[H/QKH/QKD/QKD/Q;D/Q;D/ MQ;@.Q+@.Q+@.Q+<.Q+<.P[<.P[<.P[8.PK8.PK8.PK4.P;4.P;4.P;0.P+0. MP+0.P+0.O[,.O[,.O[,.OK(.OK(.OK(.OK(.O;$.O;$.O;$.O+`.O+`.O+`. MNZ\.NZ\.NZ\.NJ\.NJX.NJX.N:X.N:T.N:T.N:T.N*T.N*P.N*P-MZP-MZL- MMZL-MJL-MJH-MJH-M:H-M:H-M:D-M*D-M*D-M*@-LZ@-LZ@-LZ@-LZ<-LJ<- MLJ<-LJ8-L:8-L:8-L:4-L*4-L*4-L*4-KZ0-KZ0-KZ0-KJ,-KJ,-KJ,-KJ,- MK:(-K:(-K:(-K*$-K*$-K*$-JZ`-JZ`-JZ`-JJ`,JI\,JI\,J9\,J9X,J9X, MJ)X,J)X,J)T,J)T,IYT,IYP,IYP,IIP,IIL,IIL,I9L,I9L,I9H,I)H,I)H, MI)D,HYD,HYD,HYD,HY@,HI@,HI@,HI<,H9<,H9<,H98,H)8,H)8,H)8,GY4, MGY4,GY4,GI0,GI0,GI0,G9,+G9,+G9,+G9,+G)(+G)(+G)(+FY$+FY$+FY$+ MFI$+FI`+FI`+F9`+F8\+F8\+F(\+F(X+F(X+F(X+EXX+EXT+EXT+EHT+EHP+ MEHP+E8P+E8P+E8L+E(L+E(L+E(H+DXH+DXH+DXD+DXD+DHD+DHD+DH@+D8@+ MD8@+D8<+D(<*D(<*D(<*CX8*CX8*CX8*CH4*CH4*CH4*C80*C80*C80*C80* MC(,*C(,*C(,*BX(*BX(*BX(*BH(*BH$*BH$*B8$*B8`*B8`*B(`*B'\*B'\* MB'\*AW\*AWX*AWX*AGX*AGT*AGT*A7T*A7T*A7P*A'P*A'P*A'L*@WL*@WL) M@WH)@GH)@GH)@GH)@GD)@7D)@7D)@7@)@'@)@'@)@'@)?W<)?W<)?W<)?G8) M?G8)?G8)?74)?74)?74)?74)?'0)?'0)?'0)>W,)>W,)>W,)>G,)>G()>G() M>7()>7$)>7$)>'$)>'`)>'`)=W`)=W`)=V\)=V\)=F\)=FX(=FX(=6X(=6X( M=6T(=&T(=&T(=&P(<VP(<VP(<VL(<FL(<FL(<FL(<FH(<6H(<6H(<6D(<&D( M<&D(<&D(;V@(;V@(;V@(;F<(;F<(``#<SA#<SA#;SA#;S1#;S1#;S1#:S!#: MS!#:S!#9RQ#9RQ#9RQ#8RQ#8RA#8RA#7RA#7R1#7R1#6R1#6R1#6R!#5R!#5 MR!#5QQ#5QQ#4QQ#4QA#4QA#3QA#3QA#3Q1#2Q1#2Q0_2Q`_1Q`_1Q`_1Q`_0 MPP_0PP_0PP_0P@_/P@_/P@_/P0_.P0_.P0_.P0_-P`_-P`_-P`_,OP_,OP_, MOP_+OP_+O@_+O@_*O@_*O0_*O0_*O0_)O`_)O`_)O`_(O`_(NP_(NP_'NP_' MN@_'N@_&N@_&N@_&N0_%N0_%N0_%N`[%N`[$N`[$MP[$MP[#MP[#MP[#M@[" MM@["M@["M0[!M0[!M0[!M0[`M`[`M`[`M`Z_LPZ_LPZ_LPZ_L@Z^L@Z^L@Z^ ML@Z]L0Z]L0Z]L0Z\L`Z\L`Z\L`Z[L`Z[KPZ[KPZZKPZZK@ZZK@ZZK@ZYK0ZY MK0ZYK0ZXK0ZXK`ZXK`VWK`VWJPVWJPVVJPVVJPVVJ@VUJ@VUJ@VUJ0VTJ0VT MJ0VTJ`VTJ`VSJ`VSJ`VSIPVRIPVRIPVRI@VQI@VQI@VQI0VPI0VPI0VPI0VO MI`VOI`VOI`VOHPVNHPVNHPVNHPVMH@VMH@VMH@VLH0VLH0VLH0VKH`VKH`VK MH`VJH`RJGPRJGPRIGPRIG@RIG@RIG@RHG@RHG0RHG0RGG0RGG`RGG`RFG`RF MFPRFFPREFPREFPREF@RDF@RDF@RDF0RDF0RCF0RCF0RCF`RBF`RBF`RBEPRA MEPRAEPRAE@R@E@R@E@R@E@R?E0R?E0R?E0R>E`R>E`R>E`R>E`R=DPN=DPN= MDPN<D@N<D@N<D@N;D0N;D0N;D0N:D0N:D`N:D`N9D`N9CPN9CPN9CPN8CPN8 MC@N8C@N7C@N7C0N7C0N6C0N6C`N6C`N5C`N5C`N5BPN4BPN4BPN4B@N3B@N3 MB@N3B@N3B0N2B0N2B0N2B`N1B`N1B`N1APN0APN0APJ0APJ/A@J/A@J/A@J. MA0J.A0J.A0J.A0J-A`J-A`J-A`J,@PJ,@PJ,@PJ+@@J+@@J+@@J*@@J*@0J* M@0J)@0J)@`J)@`J(@`J(@`J(?PJ(?PJ'?PJ'?@J'?@J&?@J&?0J&?0J%?0J% M?0J%?`J$?`J$?`J$>PJ#>PJ#>PF#>PF#>@F">@F">@F">0F!>0F!>0F!>`F` M>`F`>`F`>`E_=PE_=PE_=PE^=@E^=@E^=@E]=@E]=0E]=0E]=0E\=`E\=`E\ M=`E[<PE[<PE[<PEZ<PEZ<@EZ<@EY<@EY<0EY<0EX<0EX<0EX<`EX<`EW<`EW M;PEW;PEV;PEV;@AV;@AU;@AU;@AU;0AT;0AT;0AT;`AS;`AS;`AS;`AR:PAR M:PAR:PAR:@AQ:@AQ:@AQ:0AP:0AP:0AP:0AO:`AO:`AO:`AN9P@``-S.$-S. M$-S.$-O.$-O-$-O-$-O-$-K,$-K,$-K,$-G,$-G+$-G+$-C+$-C*$-C*$-?* M$-?)$-?)$-;)$-;)$-;($-;($-7($-7'$-7'$-3'$-3'$-3&$-/&$-/&$-/% M$-+%$-+%#]+$#]'$#]'$#]'$#]###]###]###]#"#\_"#\_"#\_"#\[!#\[! M#\[!#\W`#\W`#\W`#\R_#\R_#\R_#\N_#\N^#\N^#\N^#\J]#\J]#\J]#\F\ M#\F\#\F\#\B\#\B[#\B[#\>[#\>Z#\>Z#\:Z#\:Z#\:Y#\6Y#\6Y#\6X#L6X M#L2X#L2W#L2W#L.W#L.W#L.V#L*V#L*V#L*U#L&U#L&U#L&U#L"T#L"T#L"T M#L"S#K^S#K^S#K^R#KZR#KZR#KZR#KVQ#KVQ#KVQ#KRP#KRP#KRP#KNP#KNO M#KNO#KJO#KJN#KJN#KJN#KFM#KFM#KFM#KBM#KBL#KBL#;>L#;>K#;>K#;:K M#;:K#;:J#;6J#;6J#;6I#;6I#;2I#;2H#;2H#;.H#;.H#;.G#;*G#;*G#;*F M#;&F#;&F#;&F#;"E#;"E#;"E#:^D#:^D#:^D#:^C#:ZC#:ZC#:ZC#:VB#:VB M#:VB#:RA#:RA#:RA#:NA#:N@#:N@#:J@#*J?#*J?#*J?#*F>#*F>#*F>#*B> M#*B=#*B=#*>=#*><#*><#*:<#*:<#*:;#*6;#*6;#*6:#*2:#*2:#*29#*29 M#*.9#*.9#*.8#**8#**8#**7#*&7#*&7#*&7#*"6#*"6#*"6#)^5#)^5#)^5 M#)^4#)Z4#)Z4#)Z4#)V3"YV3"YV3"YR2"YR2"YR2"YN2"YN1"YN1"YJ1"YJ0 M"YJ0"YJ0"YF/"YF/"YF/"YB/"YB."YB."Y>."Y>-"Y>-"Y:-"Y:-"Y:,"Y6, M"Y6,"Y6+"Y2+"Y2+"Y2*"Y2*"Y.*"Y.*"Y.)"Y*)"Y*)"Y*("Y&("Y&("Y&( M"Y"'"Y"'"I"'"H^&"H^&"H^&"H^%"HZ%"HZ%"HZ%"HV$"HV$"HV$"HR#"HR# M"HR#"HN#"HN""HN""HJ""HJ!"HJ!"HF!"HF`"HF`"HF`"HB`"HA_"HA_"H=_ M"H=^"H=^"H9^"H9^"H9]"H5]"H5]"H5\"H1\"H1\"H1["H1["H-["H-["8-Z M"8)Z"8)Z"8)Y"8%Y"8%Y"8%X"8!X"8!X"8!X"7]W"7]W"7]W"7YV"7YV"7YV M"7YV"7UU"7UU"7UU"7QT"7QT"7QT"7MS"7MS"7MS"7IS"7IR"7IR"7ER"7EQ M"7EQ"7EQ"7AQ"7AP"7AP"7=P"7=O"7=O"79O"79N"'9N"'5N"'5N"'5M"'1M M"'1M"'1L"'-L"'-L"'-L"'-K"')K"')K"')J"'%J"'%J"'%I"'!I"'!I"'!I M"&]H"&]H"&]H"```W<\0W,X0W,X0W,X0W,X0V\T0V\T0V\T0VLP0VLP0VLP0 MV<P0V<L0V<L0V,L0V,H0V,H0U\H0U\D0U\D0U\D0ULD0UL@0UL@0U<@0U<<0 MU<<0U,<0U,<0U,80T\80T\80T\40TL40TL4/TL0/T<0/T<0/T<0/T<,/T,,/ MT,,/T,(/S\(/S\(/S\(/SL$/SL$/SL$/S<`/S<`/S<`/S+\/S+\/S+\/S+\/ MR[X/R[X/R[X/RKT/RKT/RKT/R;T/R;P/R;P/R+P/R+L/R+L/Q[L/Q[H/Q[H/ MQKH/QKH/QKD/QKD/Q;D/Q;@.Q;@.Q+@.Q+@.Q+<.P[<.P[<.P[8.PK8.PK8. MPK4.P;4.P;4.P;4.P;0.P+0.P+0.P+,.O[,.O[,.O[,.OK(.OK(.OK(.O;$. MO;$.O;$.O+`.O+`.O+`.N[`.NZ\.NZ\.NZ\.NJX.NJX.NJX.N:X.N:T.N:T. MN*T.N*P.N*P-MZP-MZL-MZL-MJL-MJL-MJH-MJH-M:H-M:D-M:D-M*D-M*D- MM*@-LZ@-LZ@-LZ<-LJ<-LJ<-LJ8-L:8-L:8-L:8-L*4-L*4-L*4-L*0-KZ0- MKZ0-KZ0-KJ,-KJ,-KJ,-K:(-K:(-K:(-K*$-K*$-K*$-JZ$-JZ`-JZ`-JZ`, MJI\,JI\,JI\,J9\,J9X,J9X,J)X,J)T,J)T,IYT,IYP,IYP,IIP,IIP,IIL, MI9L,I9L,I9H,I9H,I)H,I)H,I)D,HYD,HYD,HY@,HI@,HI@,HI<,H9<,H9<, MH9<,H)8,H)8,H)8,H)4,GY4,GY4,GY4,GI0,GI0,GI0,G9,+G9,+G9,+G)(+ MG)(+G)(+FY(+FY$+FY$+FI$+FI`+FI`+FI`+F8\+F8\+F8\+F(\+F(X+F(X+ MEXX+EXT+EXT+EHT+EHT+EHP+E8P+E8P+E8L+E8L+E(L+E(H+E(H+DXH+DXH+ MDXD+DHD+DHD+DH@+D8@+D8@+D8@+D(<+D(<*D(<*CX8*CX8*CX8*CX4*CH4* MCH4*CH4*C80*C80*C80*C(,*C(,*C(,*BX,*BX(*BX(*BH(*BH$*BH$*BH$* MB8`*B8`*B8`*B(`*B'\*B'\*AW\*AWX*AWX*AGX*AGX*AGT*A7T*A7T*A7P* MA'P*A'P*A'L*A'L*@WL*@WL)@WH)@GH)@GH)@GD)@7D)@7D)@7D)@'@)@'@) M@'@)?W<)?W<)?W<)?W8)?G8)?G8)?G8)?74)?74)?74)?'0)?'0)?'0)>W0) M>W,)>W,)>G,)>G()>G()>7()>7$)>7$)>7$)>'$)>'`)>'`)=W`)=V\)=V\) M=F\)=F\)=FX(=6X(=6X(=6T(=&T(=&T(=&P(=&P(<VP(<VP(<VL(<FL(<FL( M<FH(<6H(<6H(<6H(<&D(<&D(<&D(;V@(;V@(``#=SQ#=SQ#=SQ#<SA#<SA#< MSA#;S1#;S1#;S1#:S!#:S!#:S!#9S!#9RQ#9RQ#8RQ#8RA#8RA#7RA#7RA#7 MR1#7R1#6R1#6R!#6R!#5R!#5QQ#5QQ#4QQ#4QQ#4QA#3QA#3QA#3Q1#2Q1#2 MQ0_2Q0_2Q`_1Q`_1Q`_1PP_0PP_0PP_0P@_/P@_/P@_/P@_.P0_.P0_.P0_- MP`_-P`_-P`_,P`_,OP_,OP_,OP_+O@_+O@_+O@_*O0_*O0_*O0_)O0_)O`_) MO`_(O`_(NP_(NP_'NP_'NP_'N@_'N@_&N@_&N0_&N0_%N0_%N`[%N`[$N`[$ MN`[$MP[#MP[#MP[#M@["M@["M@["M@[!M0[!M0[!M0[!M`[`M`[`M`[`LPZ_ MLPZ_LPZ_LPZ^L@Z^L@Z^L@Z]L0Z]L0Z]L0Z\L0Z\L`Z\L`Z\L`Z[KPZ[KPZ[ MKPZZK@ZZK@ZZK@ZYK@ZYK0ZYK0ZXK0ZXK`ZXK`VWK`VWK`VWJPVVJPVVJPVV MJ@VVJ@VUJ@VUJ0VUJ0VTJ0VTJ0VTJ`VSJ`VSJ`VSIPVRIPVRIPVRIPVQI@VQ MI@VQI@VQI0VPI0VPI0VPI`VOI`VOI`VOI`VNHPVNHPVNHPVMH@VMH@VMH@VL MH0VLH0VLH0VKH0VKH`VKH`VKH`RJGPRJGPRJGPRIGPRIG@RIG@RHG@RHG0RH MG0RGG0RGG`RGG`RFG`RFG`RFFPRFFPREFPREF@REF@RDF@RDF@RDF0RCF0RC MF0RCF`RBF`RBF`RBEPRAEPRAEPRAEPR@E@R@E@R@E@R@E0R?E0R?E0R?E0R> ME`R>E`R>E`R=DPN=DPN=DPN<D@N<D@N<D@N;D@N;D0N;D0N;D0N:D`N:D`N: MD`N9D`N9CPN9CPN8CPN8C@N8C@N7C@N7C0N7C0N6C0N6C0N6C`N6C`N5C`N5 MBPN5BPN4BPN4BPN4B@N3B@N3B@N3B0N2B0N2B0N2B`N1B`N1B`N1B`N0APN0 MAPJ0APJ0A@J/A@J/A@J/A@J.A0J.A0J.A0J-A`J-A`J-A`J,@PJ,@PJ,@PJ+ M@PJ+@@J+@@J+@@J*@0J*@0J*@0J)@0J)@`J)@`J(@`J(?PJ(?PJ'?PJ'?@J' M?@J&?@J&?@J&?0J%?0J%?0J%?`J%?`J$?`J$?`J$>PJ#>PJ#>PF#>@F">@F" M>@F">0F!>0F!>0F!>0F`>`F`>`F`>`F`=PE_=PE_=PE_=PE^=@E^=@E^=@E] M=0E]=0E]=0E\=`E\=`E\=`E[=`E[<PE[<PEZ<PEZ<@EZ<@EZ<@EY<@EY<0EY M<0EX<0EX<`EX<`EW<`EW;PEW;PEV;PEV;PEV;@AU;@AU;@AU;0AU;0AT;0AT M;0AT;`AS;`AS;`AS:PAR:PAR:PAR:@AQ:@AQ:@AQ:@AP:0AP:0AP:0AO:`@` M`-[/$-W/$-W/$-W/$-S.$-S.$-S.$-O-$-O-$-O-$-K-$-K,$-K,$-G,$-G+ M$-G+$-C+$-C*$-C*$-C*$-?*$-?)$-?)$-;)$-;($-;($-7($-7($-7'$-3' M$-3'$-3&$-/&$-/&$-/%$-/%$-+%$-+%#]+$#]'$#]'$#]'##]###]###]## M#\_"#\_"#\_"#\[!#\[!#\[!#\W`#\W`#\W`#\W`#\R_#\R_#\R_#\N^#\N^ M#\N^#\J^#\J]#\J]#\F]#\F\#\F\#\B\#\B[#\B[#\B[#\>[#\>Z#\>Z#\:Z M#\:Y#\:Y#\6Y#\6X#L6X#L2X#L2X#L2W#L.W#L.W#L.V#L*V#L*V#L*V#L*U M#L&U#L&U#L&T#L"T#L"T#L"S#K^S#K^S#K^S#KZR#KZR#KZR#KVQ#KVQ#KVQ M#KVQ#KRP#KRP#KRP#KNO#KNO#KNO#KJN#KJN#KJN#KFN#KFM#KFM#KBM#KBL M#KBL#;>L#;>L#;>K#;>K#;:K#;:J#;:J#;6J#;6I#;6I#;2I#;2I#;2H#;.H M#;.H#;.G#;*G#;*G#;*G#;*F#;&F#;&F#;&E#;"E#;"E#;"D#:^D#:^D#:^D M#:ZC#:ZC#:ZC#:VB#:VB#:VB#:RB#:RA#:RA#:RA#:N@#:N@#:N@#*J?#*J? M#*J?#*F?#*F>#*F>#*B>#*B=#*B=#*>=#*>=#*><#*><#*:<#*:;#*:;#*6; M#*6:#*6:#*2:#*2:#*29#*.9#*.9#*.8#**8#**8#**8#*&7#*&7#*&7#*&6 M#*"6#*"6#*"5#)^5#)^5#)^5#)Z4#)Z4#)Z4#)V3"YV3"YV3"YR3"YR2"YR2 M"YR2"YN1"YN1"YN1"YJ0"YJ0"YJ0"YF0"YF/"YF/"YB/"YB."YB."Y>."Y>. M"Y>-"Y:-"Y:-"Y:,"Y:,"Y6,"Y6+"Y6+"Y2+"Y2+"Y2*"Y.*"Y.*"Y.)"Y*) M"Y*)"Y*)"Y&("Y&("Y&("Y&'"Y"'"I"'"I"&"H^&"H^&"H^&"HZ%"HZ%"HZ% M"HV$"HV$"HV$"HR$"HR#"HR#"HN#"HN""HN""HN""HJ!"HJ!"HJ!"HF!"HF` M"HF`"HB`"HA_"HA_"H=_"H=_"H=^"H9^"H9^"H9]"H9]"H5]"H5\"H5\"H1\ M"H1\"H1["H-["H-["8-Z"8)Z"8)Z"8)Z"8%Y"8%Y"8%Y"8!X"8!X"8!X"8!W M"7]W"7]W"7]W"7YV"7YV"7YV"7UU"7UU"7UU"7QT"7QT"7QT"7MT"7MS"7MS M"7MS"7IR"7IR"7IR"7ER"7EQ"7EQ"7AQ"7AP"7AP"7=P"7=O"7=O"79O"79O M"79N"'5N"'5N"'5M"'5M"'1M"'1M"'1L"'-L"'-L"'-K"')K"')K"')J"'%J M"'%J"'%J"'!I"'!I"'!I"```WM`0WL\0W<\0W<\0W<\0W,X0W,X0W,X0V\T0 MV\T0V\T0VLT0VLP0VLP0V<P0V<L0V<L0V<L0V,H0V,H0V,H0U\H0U\D0U\D0 MULD0UL@0UL@0U<@0U<@0U<<0U,<0U,<0U,80T\80T\80T\40T\40TL40TL4/ MTL0/T<0/T<0/T<,/T,,/T,,/T,,/S\(/S\(/S\(/SL$/SL$/SL$/SL`/S<`/ MS<`/S<`/S+\/S+\/S+\/R[X/R[X/R[X/RKX/RKT/RKT/R;T/R;P/R;P/R+P/ MR+L/R+L/R+L/Q[L/Q[H/Q[H/QKH/QKD/QKD/Q;D/Q;D/Q;@.Q+@.Q+@.Q+<. MP[<.P[<.P[8.P[8.PK8.PK8.PK4.P;4.P;4.P;0.P+0.P+0.P+0.O[,.O[,. MO[,.OK(.OK(.OK(.O;$.O;$.O;$.O;$.O+`.O+`.O+`.NZ\.NZ\.NZ\.NJ\. MNJX.NJX.N:X.N:T.N:T.N*T.N*P.N*P.N*P-MZP-MZL-MZL-MJL-MJH-MJH- MM:H-M:H-M:D-M*D-M*D-M*@-LZ@-LZ@-LZ<-LJ<-LJ<-LJ<-LJ8-L:8-L:8- ML:4-L*4-L*4-L*4-KZ0-KZ0-KZ0-KJ,-KJ,-KJ,-K:(-K:(-K:(-K:(-K*$- MK*$-K*$-JZ`-JZ`-JZ`,JJ`,JI\,JI\,J9\,J9X,J9X,J)X,J)T,J)T,IYT, MIYT,IYP,IYP,IIP,IIL,IIL,I9L,I9L,I9H,I)H,I)H,I)D,HYD,HYD,HY@, MHI@,HI@,HI@,HI<,H9<,H9<,H98,H)8,H)8,H)8,GY4,GY4,GY4,GI0,GI0, MGI0,G9,+G9,+G9,+G9,+G)(+G)(+G)(+FY$+FY$+FY$+FI$+FI`+FI`+F9`+ MF8\+F8\+F(\+F(X+F(X+EXX+EXX+EXT+EXT+EHT+EHP+EHP+E8P+E8L+E8L+ ME(L+E(L+E(H+DXH+DXH+DXD+DHD+DHD+DHD+DH@+D8@+D8@+D8<+D(<*D(<* MD(8*CX8*CX8*CX8*CH4*CH4*CH4*C80*C80*C80*C(0*C(,*C(,*C(,*BX(* MBX(*BX(*BH$*BH$*BH$*B8$*B8`*B8`*B(`*B'\*B'\*AW\*AW\*AWX*AWX* MAGX*AGT*AGT*A7T*A7P*A7P*A'P*A'P*A'L*@WL*@WL)@WH)@GH)@GH)@GH) M@7D)@7D)@7D)@7@)@'@)@'@)@'<)?W<)?W<)?W<)?G8)?G8)?G8)?74)?74) M?74)?'4)?'0)?'0)?'0)>W,)>W,)>W,)>G()>G()>G()>7()>7$)>7$)>'$) M>'`)>'`)=W`)=W`)=V\)=F\)=F\)=FX(=FX(=6X(=6T(=6T(=&T(=&T(=&P( M<VP(<VP(<VL(<FL(<FL(<FL(<6H(<6H(<6H(<6D(<&D(``#>T!#>T!#>T!#= MSQ#=SQ#=SQ#<SA#<SA#<SA#;S1#;S1#;S1#:S1#:S!#:S!#:S!#9RQ#9RQ#9 MRQ#8RQ#8RA#8RA#7RA#7R1#7R1#6R1#6R!#6R!#5R!#5R!#5QQ#4QQ#4QQ#4 MQA#4QA#3QA#3QA#3Q1#2Q1#2Q0_2Q`_1Q`_1Q`_1PP_0PP_0PP_0PP_/P@_/ MP@_/P@_/P0_.P0_.P0_.P0_-P`_-P`_-P`_,OP_,OP_,OP_+O@_+O@_+O@_* MO@_*O0_*O0_)O0_)O`_)O`_)O`_(O`_(NP_(NP_'NP_'N@_'N@_&N@_&N0_& MN0_%N0_%N0_%N`[$N`[$N`[$MP[$MP[#MP[#MP[#M@["M@["M@["M0[!M0[! MM0[!M`[`M`[`M`[`M`Z_LPZ_LPZ_LPZ^L@Z^L@Z^L@Z^L@Z]L0Z]L0Z]L0Z\ ML`Z\L`Z\L`Z[KPZ[KPZ[KPZZKPZZK@ZZK@ZYK@ZYK0ZYK0ZYK0ZXK0ZXK`ZX MK`VWK`VWJPVWJPVVJPVVJ@VVJ@VUJ@VUJ@VUJ0VTJ0VTJ0VTJ`VSJ`VSJ`VS MJ`VSIPVRIPVRIPVRI@VQI@VQI@VQI0VPI0VPI0VPI0VOI`VOI`VOI`VNHPVN MHPVNHPVNHPVMH@VMH@VMH@VLH0VLH0VLH0VKH`VKH`VKH`VJH`RJGPRJGPRI MGPRIG@RIG@RHG@RHG0RHG0RHG0RGG0RGG`RGG`RFG`RFFPRFFPREFPREFPRE MF@RDF@RDF@RDF0RCF0RCF0RCF`RCF`RBF`RBF`RBEPRAEPRAEPRAE@R@E@R@ ME@R@E@R?E0R?E0R?E0R>E`R>E`R>E`R=DPN=DPN=DPN=DPN<D@N<D@N<D@N; MD0N;D0N;D0N:D0N:D`N:D`N9D`N9CPN9CPN8CPN8C@N8C@N8C@N7C@N7C0N7 MC0N6C0N6C`N6C`N5C`N5C`N5BPN4BPN4BPN4B@N3B@N3B@N3B0N2B0N2B0N2 MB0N2B`N1B`N1B`N1APN0APJ0APJ0APJ/A@J/A@J/A@J.A0J.A0J.A0J-A`J- MA`J-A`J-A`J,@PJ,@PJ,@PJ+@@J+@@J+@@J*@@J*@0J*@0J)@0J)@`J)@`J( M@`J(?PJ(?PJ'?PJ'?PJ'?@J'?@J&?@J&?0J&?0J%?0J%?0J%?`J$?`J$?`J$ M>PJ#>PJ#>PF#>@F">@F">@F">@F">0F!>0F!>0F!>`F`>`F`>`F`>`E_=PE_ M=PE_=PE^=@E^=@E^=@E]=0E]=0E]=0E\=0E\=`E\=`E\=`E[<PE[<PE[<PEZ M<PEZ<@EZ<@EY<@EY<0EY<0EX<0EX<`EX<`EW<`EW<`EW;PEW;PEV;PEV;@AV M;@AU;@AU;@AU;0AT;0AT;0AT;`AS;`AS;`AS:PAR:PAR:PAR:PAQ:@AQ:@AQ M:@AQ:0@``-_0$-[0$-[0$-[0$-W/$-W/$-W/$-S.$-S.$-S.$-O.$-O-$-O- M$-K-$-K,$-K,$-K,$-G+$-G+$-G+$-C+$-C*$-C*$-?*$-?)$-?)$-;)$-;) M$-;($-7($-7($-7'$-7'$-3'$-3&$-3&$-/&$-/&$-/%$-+%$-+%#]+$#]'$ M#]'$#]'$#]###]###]###\_"#\_"#\_"#\_!#\[!#\[!#\[!#\W`#\W`#\W` M#\R_#\R_#\R_#\N_#\N^#\N^#\J^#\J]#\J]#\J]#\F\#\F\#\F\#\B\#\B[ M#\B[#\>[#\>Z#\>Z#\:Z#\:Z#\:Y#\6Y#\6Y#\6X#L2X#L2X#L2W#L2W#L.W M#L.W#L.V#L*V#L*V#L*U#L&U#L&U#L&T#L"T#L"T#L"T#K^S#K^S#K^S#K^R M#KZR#KZR#KZR#KVQ#KVQ#KVQ#KRP#KRP#KRP#KNO#KNO#KNO#KJO#KJN#KJN M#KFN#KFM#KFM#KFM#KBM#KBL#KBL#;>L#;>K#;>K#;:K#;:J#;:J#;6J#;6J M#;6I#;2I#;2I#;2H#;2H#;.H#;.H#;.G#;*G#;*G#;*F#;&F#;&F#;&E#;"E M#;"E#;"E#:^D#:^D#:^D#:ZC#:ZC#:ZC#:ZC#:VB#:VB#:VB#:RA#:RA#:RA M#:N@#:N@#:N@#:J@#*J?#*J?#*F?#*F>#*F>#*F>#*B>#*B=#*B=#*>=#*>< M#*><#*:<#*:;#*:;#*6;#*6;#*6:#*2:#*2:#*29#*29#*.9#*.9#*.8#**8 M#**8#**7#*&7#*&7#*&6#*"6#*"6#*"6#)^5#)^5#)^5#)Z4#)Z4#)Z4#)Z4 M#)V3"YV3"YV3"YR2"YR2"YR2"YN1"YN1"YN1"YJ1"YJ0"YJ0"YF0"YF/"YF/ M"YF/"YB/"YB."YB."Y>."Y>-"Y>-"Y:-"Y:,"Y:,"Y6,"Y6,"Y6+"Y2+"Y2+ M"Y2*"Y.*"Y.*"Y.*"Y.)"Y*)"Y*)"Y*("Y&("Y&("Y&'"Y"'"I"'"I"'"H^& M"H^&"H^&"HZ%"HZ%"HZ%"HZ%"HV$"HV$"HV$"HR#"HR#"HR#"HN""HN""HN" M"HJ""HJ!"HJ!"HF!"HF`"HF`"HB`"HB`"HA_"HA_"H=_"H=^"H=^"H9^"H9] M"H9]"H5]"H5]"H5\"H1\"H1\"H1["H-["H-["8-["8-Z"8)Z"8)Z"8)Y"8%Y M"8%Y"8%X"8!X"8!X"8!X"7]W"7]W"7]W"7YV"7YV"7YV"7UV"7UU"7UU"7UU M"7QT"7QT"7QT"7MS"7MS"7MS"7IS"7IR"7IR"7ER"7EQ"7EQ"7AQ"7AP"7AP M"7AP"7=P"7=O"7=O"79O"79N"'9N"'5N"'5N"'5M"'1M"'1M"'1L"'-L"'-L M"'-K"')K"')K"')K"')J"'%J"'%J"```W]$0W]$0WM`0WM`0WM`0W<\0W<\0 MW<\0W,X0W,X0W,X0V\X0V\T0V\T0V\T0VLP0VLP0VLP0V<L0V<L0V<L0V,L0 MV,H0V,H0U\H0U\D0U\D0ULD0ULD0UL@0UL@0U<@0U<<0U<<0U,<0U,80U,80 MT\80T\80T\40TL40TL4/TL0/T<0/T<0/T<0/T,,/T,,/T,,/T,(/S\(/S\(/ MS\$/SL$/SL$/SL$/S<`/S<`/S<`/S+\/S+\/S+\/R[\/R[X/R[X/R[X/RKT/ MRKT/RKT/R;P/R;P/R;P/R+P/R+L/R+L/Q[L/Q[H/Q[H/QKH/QKH/QKD/Q;D/ MQ;D/Q;@.Q;@.Q+@.Q+<.Q+<.P[<.P[<.P[8.PK8.PK8.PK4.P;4.P;4.P;4. MP+0.P+0.P+0.P+,.O[,.O[,.O[(.OK(.OK(.OK(.O;$.O;$.O;$.O+`.O+`. MO+`.N[`.NZ\.NZ\.NJ\.NJX.NJX.NJX.N:T.N:T.N:T.N*T.N*P.N*P-MZP- MMZL-MZL-MJL-MJL-MJH-M:H-M:H-M:D-M:D-M*D-M*@-M*@-LZ@-LZ@-LZ<- MLJ<-LJ<-LJ8-L:8-L:8-L:8-L*4-L*4-L*4-KZ0-KZ0-KZ0-KZ,-KJ,-KJ,- MKJ,-K:(-K:(-K:(-K*$-K*$-K*$-JZ$-JZ`-JZ`-JJ`,JI\,JI\,JI\,J9X, MJ9X,J9X,J)X,J)T,J)T,IYT,IYP,IYP,IIP,IIP,IIL,I9L,I9L,I9H,I)H, MI)H,I)D,I)D,HYD,HYD,HY@,HI@,HI@,HI<,H9<,H9<,H9<,H)8,H)8,H)8, MGY4,GY4,GY4,GY0,GI0,GI0,GI0,G9,+G9,+G9,+G)(+G)(+G)(+FY(+FY$+ MFY$+FI$+FI`+FI`+F9`+F8\+F8\+F8\+F(\+F(X+F(X+EXX+EXT+EXT+EHT+ MEHT+EHP+E8P+E8P+E8L+E(L+E(L+E(H+E(H+DXH+DXH+DXD+DHD+DHD+DH@+ MD8@+D8@+D8<+D(<+D(<*D(<*CX8*CX8*CX8*CH4*CH4*CH4*CH4*C80*C80* MC80*C(,*C(,*C(,*BX(*BX(*BX(*BH(*BH$*BH$*B8$*B8`*B8`*B8`*B(`* MB'\*B'\*AW\*AWX*AWX*AGX*AGT*AGT*A7T*A7T*A7P*A'P*A'P*A'L*@WL* M@WL*@WL)@WH)@GH)@GH)@GD)@7D)@7D)@7@)@'@)@'@)@'@)?W<)?W<)?W<) M?G8)?G8)?G8)?G8)?74)?74)?74)?'0)?'0)?'0)>W,)>W,)>W,)>G,)>G() M>G()>7()>7$)>7$)>'$)>'$)>'`)>'`)=W`)=V\)=V\)=F\)=FX(=FX(=6X( M=6X(=6T(=&T(=&T(=&P(<VP(<VP(<VP(<VL(<FL(<FL(<FH(<6H(``#?T1#? MT1#?T1#>T!#>T!#>T!#=SQ#=SQ#=SQ#<SA#<SA#<SA#<SA#;S1#;S1#;S1#: MS!#:S!#:S!#9S!#9RQ#9RQ#8RQ#8RA#8RA#7RA#7R1#7R1#6R1#6R1#6R!#6 MR!#5R!#5QQ#5QQ#4QQ#4QQ#4QA#3QA#3QA#3Q1#2Q1#2Q0_2Q`_1Q`_1Q`_1 MQ`_1PP_0PP_0PP_0P@_/P@_/P@_/P@_.P0_.P0_.P0_-P`_-P`_-P`_,OP_, MOP_,OP_+OP_+O@_+O@_+O@_*O0_*O0_*O0_)O0_)O`_)O`_(O`_(NP_(NP_' MNP_'N@_'N@_&N@_&N@_&N0_&N0_%N0_%N`[%N`[$N`[$N`[$MP[#MP[#MP[# MM@["M@["M@["M0[!M0[!M0[!M0[`M`[`M`[`M`[`LPZ_LPZ_LPZ_LPZ^L@Z^ ML@Z^L@Z]L0Z]L0Z]L0Z\L`Z\L`Z\L`Z[L`Z[KPZ[KPZ[KPZZK@ZZK@ZZK@ZY MK@ZYK0ZYK0ZXK0ZXK`ZXK`VWK`VWJPVWJPVVJPVVJPVVJ@VUJ@VUJ@VUJ0VU MJ0VTJ0VTJ0VTJ`VSJ`VSJ`VSIPVRIPVRIPVRI@VQI@VQI@VQI@VPI0VPI0VP MI0VPI`VOI`VOI`VOI`VNHPVNHPVNHPVMH@VMH@VMH@VLH0VLH0VLH0VKH0VK MH`VKH`VJH`RJGPRJGPRJGPRIG@RIG@RIG@RHG@RHG0RHG0RGG0RGG`RGG`RF MG`RFG`RFFPREFPREFPREF@REF@RDF@RDF0RDF0RCF0RCF0RCF`RBF`RBF`RB MEPRAEPRAEPRAEPR@E@R@E@R@E@R@E0R?E0R?E0R?E`R>E`R>E`R>E`R=DPN= MDPN=DPN<D@N<D@N<D@N;D@N;D0N;D0N:D0N:D`N:D`N:D`N9CPN9CPN9CPN8 MCPN8C@N8C@N7C@N7C0N7C0N6C0N6C0N6C`N5C`N5C`N5BPN5BPN4BPN4B@N4 MB@N3B@N3B@N3B0N2B0N2B0N2B`N1B`N1B`N1B`N0APN0APJ0APJ/A@J/A@J/ MA@J/A0J.A0J.A0J.A0J-A`J-A`J-A`J,@PJ,@PJ,@PJ+@PJ+@@J+@@J*@@J* M@0J*@0J*@0J)@`J)@`J)@`J(@`J(?PJ(?PJ'?PJ'?@J'?@J&?@J&?@J&?0J% M?0J%?0J%?`J$?`J$?`J$>PJ$>PJ#>PJ#>PF#>@F">@F">@F">0F!>0F!>0F! M>0F`>`F`>`F`>`E_=PE_=PE_=PE_=@E^=@E^=@E^=@E]=0E]=0E]=0E\=`E\ M=`E\=`E[=`E[<PE[<PEZ<PEZ<@EZ<@EY<@EY<0EY<0EY<0EX<0EX<`EX<`EW M<`EW;PEW;PEV;PEV;PEV;@AU;@AU;@AU;0AT;0AT;0AT;`AT;`AS;`AS;`AS M:PAR:PAR:PAR:@@``.#1$=_1$=_1$-_1$-[0$-[0$-[0$-W/$-W/$-W/$-W/ M$-S.$-S.$-S.$-O-$-O-$-O-$-K,$-K,$-K,$-G,$-G+$-G+$-C+$-C*$-C* M$-?*$-?*$-?)$-?)$-;)$-;($-;($-7($-7'$-7'$-3'$-3'$-3&$-/&$-/& M$-/%$-+%$-+%#]+%#]+$#]'$#]'$#]'##]###]###]#"#\_"#\_"#\_"#\[! M#\[!#\[!#\W`#\W`#\W`#\S`#\R_#\R_#\R_#\N^#\N^#\N^#\J]#\J]#\J] M#\F]#\F\#\F\#\B\#\B[#\B[#\>[#\>[#\>Z#\>Z#\:Z#\:Y#\:Y#\6Y#\6X M#L6X#L2X#L2X#L2W#L.W#L.W#L.V#L*V#L*V#L*V#L&U#L&U#L&U#L&T#L"T M#L"T#L"S#K^S#K^S#K^S#KZR#KZR#KZR#KVQ#KVQ#KVQ#KRP#KRP#KRP#KRP M#KNO#KNO#KNO#KJN#KJN#KJN#KFN#KFM#KFM#KBM#KBL#KBL#;>L#;>K#;>K M#;:K#;:K#;:J#;:J#;6J#;6I#;6I#;2I#;2I#;2H#;.H#;.H#;.G#;*G#;*G M#;*F#;&F#;&F#;&F#;&E#;"E#;"E#;"D#:^D#:^D#:^D#:ZC#:ZC#:ZC#:VB M#:VB#:VB#:RA#:RA#:RA#:NA#:N@#:N@#:N@#*J?#*J?#*J?#*F?#*F>#*F> M#*B>#*B=#*B=#*>=#*><#*><#*:<#*:<#*:;#*:;#*6;#*6:#*6:#*2:#*2: M#*29#*.9#*.9#*.8#**8#**8#**7#*&7#*&7#*&7#*"6#*"6#*"6#*"5#)^5 M#)^5#)^5#)Z4#)Z4#)Z4#)V3"YV3"YV3"YR2"YR2"YR2"YN2"YN1"YN1"YN1 M"YJ0"YJ0"YJ0"YF0"YF/"YF/"YB/"YB."YB."Y>."Y>-"Y>-"Y:-"Y:-"Y:, M"Y6,"Y6,"Y6+"Y6+"Y2+"Y2+"Y2*"Y.*"Y.*"Y.)"Y*)"Y*)"Y*("Y&("Y&( M"Y&("Y"'"Y"'"I"'"I"&"H^&"H^&"H^&"HZ%"HZ%"HZ%"HV$"HV$"HV$"HR# M"HR#"HR#"HN#"HN""HN""HJ""HJ!"HJ!"HJ!"HF!"HF`"HF`"HB`"HA_"HA_ M"H=_"H=^"H=^"H9^"H9^"H9]"H5]"H5]"H5\"H5\"H1\"H1\"H1["H-["H-[ M"8-Z"8)Z"8)Z"8)Y"8%Y"8%Y"8%Y"8!X"8!X"8!X"7]W"7]W"7]W"7]W"7YV M"7YV"7YV"7UU"7UU"7UU"7QT"7QT"7QT"7MT"7MS"7MS"7IS"7IR"7IR"7IR M"7ER"7EQ"7EQ"7AQ"7AP"7AP"7=P"7=O"7=O"79O"79O"79N"'5N"'5N"'5M M"'1M"'1M"'1L"'1L"'-L"'-L"'-K"')K"')K"```X-(1X-(1W]$1W]$0W]$0 MWM`0WM`0WM`0W<\0W<\0W<\0W<\0W,X0W,X0W,X0V\T0V\T0V\T0VLT0VLP0 MVLP0V<P0V<L0V<L0V,L0V,H0V,H0V,H0U\H0U\D0U\D0ULD0UL@0UL@0U<@0 MU<<0U<<0U,<0U,<0U,80T\80T\80T\40TL40TL40TL4/TL0/T<0/T<0/T<,/ MT,,/T,,/T,(/S\(/S\(/S\(/SL$/SL$/SL$/S<`/S<`/S<`/S<`/S+\/S+\/ MS+\/R[X/R[X/R[X/RKT/RKT/RKT/R;T/R;P/R;P/R+P/R+L/R+L/Q[L/Q[L/ MQ[H/Q[H/QKH/QKD/QKD/Q;D/Q;@.Q;@.Q+@.Q+@.Q+<.P[<.P[<.P[8.PK8. MPK8.PK8.PK4.P;4.P;4.P;0.P+0.P+0.P+,.O[,.O[,.O[,.OK(.OK(.OK(. MO;$.O;$.O;$.O+$.O+`.O+`.O+`.NZ\.NZ\.NZ\.NJX.NJX.NJX.N:X.N:T. MN:T.N*T.N*P.N*P-MZP-MZP-MZL-MZL-MJL-MJH-MJH-M:H-M:D-M:D-M*D- MM*D-M*@-LZ@-LZ@-LZ<-LJ<-LJ<-LJ<-L:8-L:8-L:8-L:4-L*4-L*4-L*0- MKZ0-KZ0-KZ0-KJ,-KJ,-KJ,-K:(-K:(-K:(-K*(-K*$-K*$-K*$-JZ`-JZ`- MJZ`,JI\,JI\,JI\,J9\,J9X,J9X,J)X,J)T,J)T,IYT,IYT,IYP,IYP,IIP, MIIL,IIL,I9L,I9H,I9H,I)H,I)H,I)D,HYD,HYD,HY@,HI@,HI@,HI@,H9<, MH9<,H9<,H98,H)8,H)8,H)4,GY4,GY4,GY4,GI0,GI0,GI0,G9,+G9,+G9,+ MG),+G)(+G)(+G)(+FY$+FY$+FY$+FI`+FI`+FI`+F9`+F8\+F8\+F(\+F(X+ MF(X+EXX+EXX+EXT+EHT+EHT+EHP+EHP+E8P+E8L+E8L+E(L+E(L+E(H+DXH+ MDXH+DXD+DHD+DHD+DHD+D8@+D8@+D8@+D8<+D(<*D(<*D(8*CX8*CX8*CX8* MCH4*CH4*CH4*C80*C80*C80*C(,*C(,*C(,*BX,*BX(*BX(*BX(*BH$*BH$* MBH$*B8$*B8`*B8`*B(`*B'\*B'\*AW\*AWX*AWX*AGX*AGX*AGT*AGT*A7T* MA7P*A7P*A'P*A'P*A'L*@WL*@WL)@WH)@GH)@GH)@GD)@7D)@7D)@7D)@'@) M@'@)@'@)@'<)?W<)?W<)?W<)?G8)?G8)?G8)?74)?74)?74)?'0)?'0)?'0) M>W0)>W,)>W,)>W,)>G()>G()>G()>7()>7$)>7$)>'$)>'`)>'`)=W`)=V\) M=V\)=F\)=F\)=FX(=6X(=6X(=6T(=6T(=&T(=&T(=&P(<VP(<VP(<VL(<FL( M``#@TA'@TA'@TA'?T1'?T1#?T1#>T!#>T!#>T!#>SQ#=SQ#=SQ#=SQ#<SA#< MSA#<SA#;S1#;S1#;S1#:S1#:S!#:S!#9S!#9RQ#9RQ#9RQ#8RA#8RA#8RA#7 MRA#7R1#7R1#6R1#6R!#6R!#5R!#5R!#5QQ#4QQ#4QQ#4QA#3QA#3QA#3Q1#3 MQ1#2Q1#2Q0_2Q`_1Q`_1Q`_1PP_0PP_0PP_0PP_/P@_/P@_/P@_.P0_.P0_. MP0_.P`_-P`_-P`_-P`_,OP_,OP_,OP_+O@_+O@_+O@_*O@_*O0_*O0_)O0_) MO`_)O`_(O`_(NP_(NP_(NP_'NP_'N@_'N@_&N@_&N0_&N0_%N0_%N0_%N`[$ MN`[$N`[$MP[#MP[#MP[#M@[#M@["M@["M@["M0[!M0[!M0[!M`[`M`[`M`[` MM`Z_LPZ_LPZ_LPZ^L@Z^L@Z^L@Z]L0Z]L0Z]L0Z]L0Z\L`Z\L`Z\L`Z[KPZ[ MKPZ[KPZZKPZZK@ZZK@ZYK@ZYK0ZYK0ZXK0ZXK`ZXK`VXK`VWK`VWJPVWJPVV MJPVVJ@VVJ@VUJ@VUJ@VUJ0VTJ0VTJ0VTJ`VSJ`VSJ`VSIPVRIPVRIPVRIPVR MI@VQI@VQI@VQI0VPI0VPI0VPI0VOI`VOI`VOI`VNHPVNHPVNHPVMH@VMH@VM MH@VMH@VLH0VLH0VLH0VKH`VKH`VKH`RJH`RJGPRJGPRIGPRIG@RIG@RHG@RH MG0RHG0RGG0RGG0RGG`RGG`RFG`RFFPRFFPREFPREF@REF@RDF@RDF@RDF0RC MF0RCF0RCF`RBF`RBF`RBF`RBEPRAEPRAEPRAE@R@E@R@E@R@E0R?E0R?E0R? ME0R>E`R>E`R>E`R=DPN=DPN=DPN<DPN<D@N<D@N<D@N;D0N;D0N;D0N:D`N: MD`N:D`N9D`N9CPN9CPN8CPN8C@N8C@N7C@N7C@N7C0N7C0N6C0N6C`N6C`N5 MC`N5BPN5BPN4BPN4BPN4B@N3B@N3B@N3B0N2B0N2B0N2B0N1B`N1B`N1B`N1 MAPN0APJ0APJ0A@J/A@J/A@J/A@J.A0J.A0J.A0J-A`J-A`J-A`J,A`J,@PJ, M@PJ,@PJ+@@J+@@J+@@J*@0J*@0J*@0J)@0J)@`J)@`J(@`J(?PJ(?PJ'?PJ' M?PJ'?@J&?@J&?@J&?0J&?0J%?0J%?`J%?`J$?`J$?`J$>PJ#>PJ#>PF#>@F" M>@F">@F">@F!>0F!>0F!>0F!>`F`>`F`>`F`=PE_=PE_=PE_=PE^=@E^=@E^ M=@E]=0E]=0E]=0E\=0E\=`E\=`E[=`E[<PE[<PE[<PEZ<@EZ<@EZ<@EY<@EY M<0EY<0EX<0EX<`EX<`EW<`EW<`EW;PEV;PEV;PEV;@AV;@AU;@AU;0AU;0AT M;0AT;0AT;`AS;`AS;`AS:P@``.'2$>#2$>#2$>#2$=_1$=_1$-_1$-_0$-[0 M$-[0$-[0$-W/$-W/$-W/$-S.$-S.$-S.$-O-$-O-$-O-$-K-$-K,$-K,$-G, M$-G+$-G+$-G+$-C+$-C*$-C*$-?*$-?)$-?)$-;)$-;($-;($-7($-7($-7' M$-3'$-3'$-3&$-3&$-/&$-/&$-/%$-+%$-+%#]+$#]'$#]'$#]'##]###]## M#]###\_"#\_"#\_"#\[!#\[!#\[!#\[!#\W`#\W`#\W`#\R_#\R_#\R_#\N^ M#\N^#\N^#\J^#\J]#\J]#\F]#\F\#\F\#\F\#\B\#\B[#\B[#\>[#\>Z#\>Z M#\:Z#\:Y#\:Y#\6Y#\6Y#\6X#L2X#L2X#L2W#L.W#L.W#L.W#L.V#L*V#L*V M#L*U#L&U#L&U#L&T#L"T#L"T#L"T#K^S#K^S#K^S#KZR#KZR#KZR#KZR#KVQ M#KVQ#KVQ#KRP#KRP#KRP#KNO#KNO#KNO#KJO#KJN#KJN#KFN#KFM#KFM#KBM M#KBL#KBL#KBL#;>L#;>K#;>K#;:K#;:J#;:J#;6J#;6J#;6I#;2I#;2I#;2H M#;.H#;.H#;.G#;.G#;*G#;*G#;*F#;&F#;&F#;&E#;"E#;"E#;"E#:^D#:^D M#:^D#:ZC#:ZC#:ZC#:ZB#:VB#:VB#:VB#:RA#:RA#:RA#:N@#:N@#:N@#:J@ M#*J?#*J?#*F?#*F>#*F>#*B>#*B=#*B=#*B=#*>=#*><#*><#*:<#*:;#*:; M#*6;#*6;#*6:#*2:#*2:#*29#*.9#*.9#*.8#*.8#**8#**8#**7#*&7#*&7 M#*&6#*"6#*"6#*"6#)^5#)^5#)^5#)Z4#)Z4#)Z4#)V3"YV3"YV3"YV3"YR2 M"YR2"YR2"YN1"YN1"YN1"YJ1"YJ0"YJ0"YF0"YF/"YF/"YB/"YB."YB."YB. M"Y>."Y>-"Y>-"Y:-"Y:,"Y:,"Y6,"Y6,"Y6+"Y2+"Y2+"Y2*"Y.*"Y.*"Y.) M"Y*)"Y*)"Y*)"Y*("Y&("Y&("Y&'"Y"'"I"'"I"'"H^&"H^&"H^&"HZ%"HZ% M"HZ%"HV$"HV$"HV$"HV$"HR#"HR#"HR#"HN""HN""HN""HJ""HJ!"HJ!"HF! M"HF`"HF`"HB`"HA_"HA_"H=_"H=_"H=^"H=^"H9^"H9]"H9]"H5]"H5]"H5\ M"H1\"H1\"H1["H-["H-["8-Z"8)Z"8)Z"8)Z"8)Y"8%Y"8%Y"8%X"8!X"8!X M"8!X"7]W"7]W"7]W"7YV"7YV"7YV"7UU"7UU"7UU"7QU"7QT"7QT"7QT"7MS M"7MS"7MS"7IS"7IR"7IR"7ER"7EQ"7EQ"7AQ"7AP"7AP"7=P"7=P"7=O"7=O M"79O"79N"'9N"'5N"'5N"'5M"'1M"'1M"'1L"'-L"'-L"```X=,1X=,1X-(1 MX-(1X-(1X-$1W]$0W]$0W]`0WM`0WM`0WM`0W<\0W<\0W<\0W,X0W,X0W,X0 MV\X0V\T0V\T0VLT0VLP0VLP0VLP0V<L0V<L0V<L0V,L0V,H0V,H0U\H0U\D0 MU\D0ULD0ULD0UL@0U<@0U<@0U<<0U<<0U,<0U,80U,80T\80T\80T\40TL40 MTL4/TL0/T<0/T<0/T<,/T,,/T,,/T,,/S\(/S\(/S\(/S\$/SL$/SL$/SL$/ MS<`/S<`/S<`/S+\/S+\/S+\/R[X/R[X/R[X/RKX/RKT/RKT/RKT/R;P/R;P/ MR;P/R+P/R+L/R+L/Q[L/Q[H/Q[H/QKH/QKD/QKD/Q;D/Q;D/Q;@.Q+@.Q+@. MQ+<.Q+<.P[<.P[<.P[8.PK8.PK8.PK4.P;4.P;4.P;0.P+0.P+0.P+0.O[,. MO[,.O[,.O[(.OK(.OK(.OK(.O;$.O;$.O;$.O+`.O+`.O+`.NZ\.NZ\.NZ\. MNJ\.NJX.NJX.N:X.N:T.N:T.N:T.N*T.N*P.N*P-MZP-MZL-MZL-MJL-MJH- MMJH-M:H-M:H-M:D-M*D-M*D-M*@-M*@-LZ@-LZ@-LZ<-LJ<-LJ<-LJ8-L:8- ML:8-L:4-L*4-L*4-L*4-KZ0-KZ0-KZ0-KJ,-KJ,-KJ,-KJ,-K:(-K:(-K:(- MK*$-K*$-K*$-JZ`-JZ`-JZ`-JJ`,JI\,JI\,J9\,J9X,J9X,J9X,J)X,J)T, MJ)T,IYT,IYP,IYP,IIP,IIL,IIL,I9L,I9L,I9H,I)H,I)H,I)D,HYD,HYD, MHYD,HY@,HI@,HI@,HI<,H9<,H9<,H98,H)8,H)8,H)8,GY4,GY4,GY4,GI0, MGI0,GI0,GI0,G9,+G9,+G9,+G)(+G)(+G)(+FY$+FY$+FY$+FI$+FI`+FI`+ MF9`+F8\+F8\+F(\+F(\+F(X+F(X+EXX+EXT+EXT+EHT+EHP+EHP+E8P+E8P+ ME8L+E(L+E(L+E(H+DXH+DXH+DXH+DXD+DHD+DHD+DH@+D8@+D8@+D8<+D(<* MD(<*D(<*CX8*CX8*CX8*CH4*CH4*CH4*C84*C80*C80*C80*C(,*C(,*C(,* MBX(*BX(*BX(*BH(*BH$*BH$*B8$*B8`*B8`*B(`*B'\*B'\*B'\*AW\*AWX* MAWX*AGX*AGT*AGT*A7T*A7T*A7P*A'P*A'P*A'L*@WL*@WL)@WH)@GH)@GH) M@GH)@GD)@7D)@7D)@7@)@'@)@'@)@'@)?W<)?W<)?W<)?G8)?G8)?G8)?74) M?74)?74)?74)?'0)?'0)?'0)>W,)>W,)>W,)>G,)>G()>G()>7()>7$)>7$) M>'$)>'`)>'`)=W`)=W`)=V\)=V\)=F\)=FX(=FX(=6X(=6X(=6T(=&T(=&T( M=&P(<VP(``#ATQ'ATQ'ATQ'@TA'@TA'@TA'@T1'?T1#?T1#?T!#>T!#>T!#> MT!#=SQ#=SQ#=SQ#<SA#<SA#<SA#;SA#;S1#;S1#;S1#:S!#:S!#:S!#9RQ#9 MRQ#9RQ#8RQ#8RA#8RA#7RA#7R1#7R1#6R1#6R1#6R!#5R!#5R!#5QQ#5QQ#4 MQQ#4QA#4QA#3QA#3QA#3Q1#2Q1#2Q0_2Q`_1Q`_1Q`_1Q`_0PP_0PP_0PP_0 MP@_/P@_/P@_/P0_.P0_.P0_.P0_-P`_-P`_-P`_,OP_,OP_,OP_+OP_+O@_+ MO@_*O@_*O0_*O0_*O0_)O`_)O`_)O`_(O`_(NP_(NP_'NP_'N@_'N@_&N@_& MN@_&N0_%N0_%N0_%N`[%N`[$N`[$MP[$MP[#MP[#MP[#M@["M@["M@["M0[! MM0[!M0[!M0[`M`[`M`[`M`Z_LPZ_LPZ_LPZ_L@Z^L@Z^L@Z^L@Z]L0Z]L0Z] ML0Z\L`Z\L`Z\L`Z[L`Z[KPZ[KPZZKPZZK@ZZK@ZZK@ZYK0ZYK0ZYK0ZXK0ZX MK`ZXK`VWK`VWJPVWJPVVJPVVJPVVJ@VUJ@VUJ@VUJ0VTJ0VTJ0VTJ`VTJ`VS MJ`VSJ`VSIPVRIPVRIPVRI@VQI@VQI@VQI@VPI0VPI0VPI0VOI`VOI`VOI`VO MHPVNHPVNHPVNHPVMH@VMH@VMH@VLH0VLH0VLH0VKH0VKH`VKH`VJH`RJGPRJ MGPRJGPRIG@RIG@RIG@RHG@RHG0RHG0RGG0RGG`RGG`RFG`RFG`RFFPREFPRE MFPREF@RDF@RDF@RDF0RDF0RCF0RCF0RCF`RBF`RBF`RBEPRAEPRAEPRAE@R@ ME@R@E@R@E@R?E0R?E0R?E0R?E`R>E`R>E`R>E`R=DPN=DPN=DPN<D@N<D@N< MD@N;D0N;D0N;D0N:D0N:D`N:D`N9D`N9CPN9CPN9CPN8CPN8C@N8C@N7C@N7 MC0N7C0N6C0N6C`N6C`N5C`N5C`N5BPN4BPN4BPN4B@N4B@N3B@N3B@N3B0N2 MB0N2B0N2B`N1B`N1B`N1APN0APN0APJ0APJ/A@J/A@J/A@J.A0J.A0J.A0J. MA0J-A`J-A`J-A`J,@PJ,@PJ,@PJ+@@J+@@J+@@J*@@J*@0J*@0J)@0J)@`J) M@`J)@`J(@`J(?PJ(?PJ'?PJ'?@J'?@J&?@J&?0J&?0J%?0J%?0J%?`J$?`J$ M?`J$>PJ#>PJ#>PF#>PF#>@F">@F">@F">0F!>0F!>0F!>`F`>`F`>`F`>`E_ M=PE_=PE_=PE^=@E^=@E^=@E^=@E]=0E]=0E]=0E\=`E\=`E\=`E[<PE[<PE[ M<PEZ<PEZ<@EZ<@EY<@EY<0EY<0EX<0EX<0EX<`EX<`EW<`EW;PEW;PEV;PEV M;@AV;@AU;@AU;@AU;0AT;0AT;0AT;`@``.+3$>'3$>'3$>'3$>'2$>#2$>#2 M$>#1$=_1$-_1$-_1$-[0$-[0$-[0$-W/$-W/$-W/$-S.$-S.$-S.$-S.$-O- M$-O-$-O-$-K,$-K,$-K,$-G,$-G+$-G+$-C+$-C*$-C*$-?*$-?)$-?)$-;) M$-;)$-;($-;($-7($-7'$-7'$-3'$-3'$-3&$-/&$-/&$-/%$-+%$-+%#]+$ M#]'$#]'$#]'$#]'##]###]###]#"#\_"#\_"#\_"#\[!#\[!#\[!#\W`#\W` M#\W`#\R_#\R_#\R_#\N_#\N^#\N^#\N^#\J]#\J]#\J]#\F]#\F\#\F\#\B\ M#\B[#\B[#YN2#+&F#<>Z#\:Z#\:Z#\:Y#\:Y#\6Y#\6X#IJ0"X-["5A2!D$] M!4$]!4$]!8)Y"9>."\*V#L*U#L&U#L&U#L&U#L"T#L"T#L"T#L"S#K^S#K^S M#K^S#KZR#KZR#KZR#KVQ#KVQ#KVQ#KRP#KRP#KRP#KNP#KNO#KNO#KNO#KJN M#KJN#KJN#KFM#KFM#KFM#KBM#KBL#KBL#;>L#;>K#;>K#;:K#;:K#;:J#;6J M#;6J#;6I#;6I#;2I#;2H#;2H#;.H#;.H#;.G#;*G#;*G#;*F#;&F#;&F#;&F M#;"E#;"E#;"E#;"D#:^D#:^D#:^C#71M"71M"71M"7-L"7-L"9J0#*RA#:RA M#:RA#:NA#:N@#:N@#:J@#*J?#*J?#*J?#*F>#*F>#*F>#*B>#*B=#*B=#*>= M#*><#*><#*:<#*:<#*:;#*6;#*6;#*6:#*6:#*2:#*29#*29#*.9#*.9#*.8 M#**8#**8#**7#*&7#*&7#*&7#*"6#*"6#*"6#)^5#)^5#)^5#)^4#)Z4#)Z4 M#)Z4#)V3"YV3"YV3"YR2"YR2"YR2"YN2"YN1"YN1"YJ1"YJ0"YJ0"YJ0"YF/ M"YF/"YF/"YB/"YB."YB."Y>."Y>-"Y>-"Y:-"Y:-"Y:,"Y6,"Y6,"Y6+"Y2+ M"Y2+"Y2*"Y2*"Y.*"Y.*"Y.)"Y*)"Y*)"Y*("Y&("Y&("Y&("Y"'"Y"'"I"' M"H^&"H^&"H^&"H^%"HZ%"HZ%"HZ%"HV$"HV$"HV$"HR#"HR#"HR#"HN#"HN" M"HN""HJ""HJ!"HJ!"HF!"HF`"HF`"HF`"HB`"HA_"HA_"H=_"H=^"H=^"H9^ M"H9^"H9]"H5]"H5]"H5\"H1\"H1\"H1["H1["H-["H-["8-Z"8)Z"8)Z"8)Y M"8%Y"8%Y"8%Y"8!X"8!X"8!X"7]W"7]W"7]W"7YV"7YV"7YV"7YV"7UU"7UU M"7UU"7QT"7QT"7QT"7MT"7MS"7MS"7IS"7IR"7IR"7ER"7EQ"7EQ"7EQ"7AQ M"7AP"7AP"7=P"7=O"7=O"79O"79O"79N"'5N"'5N"'5M"'1M"'1M"```XM01 MXM01XM,1X=,1X=,1X=(1X-(1X-(1X-$1W]$0W]$0W]$0WM`0WM`0WM`0W<\0 MW<\0W<\0W,\0W,X0W,X0W,X0V\T0V\T0V\T0VLP0VLP0VLP0V<P0V<L0V<L0 MV,L0V,H0V,H0U\H0U\H0U\D0U\D0ULD0UL@0UL@0U<@0U<<0U<<0U,<0U,<0 MU,80T\80T\80T\40TL40TL4/TL4/T<0/T<0/T<0/T<,/T,,/T,,/T,(/S\(/ MS\(/S\(/SL$/SL$/SL$/S<`/S<`/S<`/S+\/S+\/S+\/S+\/R[X/R[X/R[X/ MRKT/RKT/RKT/R;T/R;P/R;P/R+P/R+L/0SX%0CX%L:8-Q[H/QKH/QKH/QKD/ M;F<(+"D#0CT%@WL)@WL)KJ0,KJ,,@GH);68(+"D#%A4";&4(PK4.P;4.P;4. MP;4.P;0.EHP+0#P%0#P%%A0"*R@#0#P%/SL%*B@#````*B@#/SL%/SL%/SL% M%10"*B<#/CL%/CH%*B<#````/CH%NJX.NJX.9V$(%10"*2<#/3H%%10"```` M%10!/3D$CX4*MJL-/3D$/3D$%1,!/#D$/#@$/#@$/#@$%!,!````````*"8# M/#@$LJ<-LJ<-LJ8-L:8-%!,!8UP'L:4-L*4-L*4-G9(,3DD&.C<$=6T)=&T) MKJ,-FY$,<VP).C8$)R0#AGX*K*$-K*$-JZ$-JZ`-JZ`-JZ`,7UD'.34$.34$ M$Q(!.#4$.#4$.#4$$Q(!````$Q(!.#0$75<'@GH)-S0$)2,#)2,#-S0$-S,$ M-S,$````````)2(#-C,$-C,$HY@,HI@,HI@,HI<,6E0'-C($-C($````)"(# M-3($-3($-3($)"$#````$A$!-3$$-3$$-#$$-#$$````(R$"-#$$-#$$-#$$ M(R`"````````FI`+FI`+FI`+F9`+F8\+F8\+,S`$(B`"````,B\$,B\$```` M````$1`!,B\$=&T)E8P+E8L+E8L+8UT',2X$E(H+DXH+DXH+<VL),2X$,2X$ M$0\!$`\!,"T$,"T$,"T$,"T#$`\!````````(!X","T#+RP#CH4*CH4*C80* MC80*C80*C(,*C(,*C(,*BX,*BX(*BX(*BH(*BH$*BH$*BH$*B8$*B8`*B8`* MB(`*B'\*B'\*AW\*AWX*AWX*AGX*AGX*AGT*A7T*A7T*A7P*A7P*A'P*A'L* MA'L*@WL*@WL)@WH)@GH)@GH)@GD)@7D)@7D)@7D)@'@)@'@)@'@)?W<)?W<) M?W<)?W8)?G8)?G8)?G8)?74)?74)?74)?'0)?'0)?'0)>W0)>W,)>W,)>G,) M>G()>G()>G()>7$)>7$)>7$)>'$)>'`)>'`)=W`)=V\)=V\)=F\)=F\)=FX( M=6X(=6X(=6T(=&T(``#CU!'BU!'BU!'BTQ'ATQ'ATQ'ATA'@TA'@TA'@T1'? MT1'?T1#?T1#>T!#>T!#>T!#=SQ#=SQ#=SQ#=SQ#<SA#<SA#<SA#;S1#;S1#; MS1#:S!#:S!#:S!#9S!#9RQ#9RQ#8RQ#8RA#8RA#8RA#7RA#7R1#7R1#6R1#6 MR!#6R!#5R!#5QQ#5QQ#4QQ#4QQ#4QA#3QA#3QA#3Q1#2Q1#2Q1#2Q0_2Q`_1 MQ`_1Q`_1PP_0PP_0PP_0P@_/P@_/P@_/P@_.P0_.P0_.P0_-P`_-P`_-P`_- MP`_,OP_,OP_,OP_+O@_+O@_+O@_*O0_*O0_*O0_)O0_)O`_)O`_(O`]#/@7( MNP]"/@6%?0K'N@^;D0Q"/@6$>PK&N0_%N0_%N`[%N`[$N`[$N`[$MP[#MP[# MMPZ">0E7409!/07"M@["M0[!M0[!M0[!M`[`M`[`M`ZKGPQ`/`5_=PE_=PE5 M4`8```!_=PF]L0Z]L0Z]L0Z\L0YI8@A43P8_.P4J)P,````^.@6ZK@ZZK@ZZ MK@ZYK@YG8`@5%`(5%`(I)@.XK`VWK`VWK`VWJPVWJPVVJPUY<0E13`9Y<0EY M<0EY<0D```````!X<`FSJ`VSJ`VSIPVRIPVRIPVRIPT[-P2*@@I/2@:QI0U/ M2@9B7`>PI`VOI`VOI`VOI`VNHPVNHPVNHPVMH@U@6@<Z-@1S;`FLH0VLH0VL MH0VKH`VKH`VKH`RJGPRJGPQ,1P5Q:@AQ:0AQ:0@F(P,```"6C`NGG0RGG0RG MG`RFG`RFG`Q*105O9PAN9PAN9P@````E(@.DF@RDF0RCF0RCF0RCF`RBF`RB MF`RBF`RAEPRAEPR/A@LV,@1K9`AK9`AK8PA'0P4````U,@2>E`R>E`R>E`R= MDPN=DPM74@97409H80=H80=%004```````";D0N:D`N:D`N:D`N9D`N9CPN9 MCPN8CPMW;PDS+P143P8````R+P26C0N6C0N6C`N6C`N5C`N%?`HA'P(A'P)T M;`F4B@N3B@N3B@N3B0N2B0N2B0M!/05A6P=A6P=A6P=@6@<0#P$```!02P:/ MA@J/A@J/A@J.A0J.A0J.A0J-A`J-A`J-A`J,@PJ,@PJ,@PJ+@PJ+@@J+@@J+ M@@J*@0J*@0J*@0J)@0J)@`J)@`J(@`J(?PJ(?PJ'?PJ'?@J'?@J&?@J&?@J& M?0J%?0J%?0J%?`J%?`J$?`J$?`J$>PJ#>PJ#>PF#>@F">@F">@F">0F!>0F! M>0F!>0F`>`F`>`F`>`F`=PE_=PE_=PE_=PE^=@E^=@E^=@E]=0E]=0E]=0E\ M=`E\=`E\=`E[=`E[<PE[<PEZ<PEZ<@EZ<@EZ<@EY<@EY<0EY<0EX<0EX<`EX M<`EW<`EW;PEW;PEV;PEV;PEV;@AU;@AU;@AU;0@``./4$>/4$>+4$>+4$>+3 M$>'3$>'3$>'2$>#2$>#2$>#2$=_1$=_1$-_1$-[0$-[0$-[0$-[/$-W/$-W/ M$-W/$-S.$-S.$-S.$-O-$-O-$-O-$-K-$-K,$-K,$-G,$-G+$-G+$-C+$-C* M$-C*$-C*$-?*$-?)$-?)$-;)$-;($-;($-7($-7($-7'$-3'$-3'$-3&$-/& M$-/&$-/%$-/%$-+%$-+%#]+$#]'$#]'$#]'##]###]###]###\_"#\_"#\_" M#\[!#\[!#\[!#\W`#\W`#\W`#\W`#\R_#\R_#\R_#\N^#\N^#\N^#\J^#\J] M#\J]#\F]#\F\#\F\#T,_!85]"F]H"````$(^!6]H",>Z#\:Z#\:Y#\:Y#\6Y M#\6Y#\6X#L2X#L2X#L2W#L.W#L.W#D$]!4$]!6QE",*V#L*U#L&U#L&U#L&T M#L"T#L"T#D`\!;^S#K^S#G]W"0```']W";ZR#KVQ#KVQ#KVQ#KVQ#J>=#&EB M"'UU"0```#XZ!;NO#KJO#KJN#KJN#KFN#E--!@```'MS";BL#KBL#;BL#;>L M#;>K#;>K#5%,!GEQ"7EQ"7EQ"2@F`P```&1>![2I#;2H#;.H#;.H#;.G#;*G M#;*G#2@E`V-<!P```"@E`YZ3#+"E#;"E#;"D#:^D#:^D#:^D#:ZC#:ZC#:ZC M#7-L"8=^"A02`:VB#:RA#:RA#:RA#:N@#:N@#:N@#*J?#'%J"*J?#*F?#*F> M##@U!````*B=#*B=#*>=#*>=#*><#*><##<T!*:;#*:;#*6;#````#<S!*2: M#*2:#*29#*.9#*.9#*.8#**8#**8#**8#**7#*&7#$A$!:&6#*"6#*"6#&MC M"````#4R!)^5#)Z4#)Z4#)Z4#)V3"YV3"XR#"C0Q!%=1!D9!!0```````)N1 M"YN1"YJ0"YJ0"YJ0"YF0"YF/"YF/"YB/"W=O"3,O!"(@`I>."Y>-"Y>-"Y:- M"Y:,"Y:,"T,_!85\"I6+"S$N!)2+"Y2*"Y.*"Y.*"Y.)"Y*)"V%;!V%;!Y&( M"Y&("Y&("P```````)"'"I"&"H^&"H^&"H^&"HZ%"HZ%"HZ%"HV$"HV$"HV$ M"HR$"HR#"HR#"HR#"HN""HN""HN""HJ!"HJ!"HJ!"HF!"HF`"HF`"HB`"HA_ M"HA_"H=_"H=_"H=^"H9^"H9^"H9]"H9]"H5]"H5\"H5\"H1\"H1\"H1["H-[ M"H-["8-Z"8)Z"8)Z"8)Z"8%Y"8%Y"8%Y"8%X"8!X"8!X"8!W"7]W"7]W"7]W M"7YV"7YV"7YV"7UU"7UU"7UU"7QU"7QT"7QT"7MT"7MS"7MS"7MS"7IR"7IR M"7IR"7ER"7EQ"7EQ"7AQ"7AP"7AP"7=P"7=P"7=O"79O"79O"79N"'9N"'5N M"```X]41X]41X]01XM01XM01XM,1X=,1X=,1X=(1X-(1X-(1X-(1W]$1W]$0 MW]$0W]`0WM`0WM`0WM`0W<\0W<\0W<\0W,X0W,X0W,X0V\T0V\T0V\T0VLT0 MVLP0VLP0V<P0V<L0V<L0V<L0V,L0V,H0V,H0U\H0U\D0U\D0ULD0UL@0UL@0 MU<@0U<@0U<<0U,<0U,<0U,80U,80T\80T\80T\40TL40TL4/TL0/T<0/T<0/ MT<,/T,,/T,,/T,,/S\(/S\(/S\(/SL$/SL$/SL$/SL$/S<`/S<`/S<`/S+\/ MS+\/S+\/R[X/R[X/R[X/RKX/RKT/RKT/R;T/R;P/0S\%LZ<-%Q4"%Q4"A7T* MQ[L/Q[H/Q[H/QKH/QKD/QKD/Q;D/Q;D/Q;@.Q+@.Q+@.Q+<.@GH)+"D#+"D# M%A4"PK8.PK8.PK4.P;4.P;4.P;0.P+0.*R@#@'@)?W<)55`&````?W<)OK(. MOK(.OK$.O;$.O;$.O;$.O+`.5$\&````/CH%NZ\.NZ\.NJ\.NJX.NJX.N:X. M%10">W,)N*T.N*P.N*P.N*P-MZP-HY@,/3D$>7()>7$)95\'````%1,!M:D- MM*D-M*D-M*@-LZ@-LZ@-LZ<-LZ<-*"4#%!,!.S<$L:8-L:8-L:4-L*4-L*4- ML*4-KZ0-KZ0-KZ0-KJ,-=&T).C8$<VP)````<VP)K:(-K*$-K*$-K*$-JZ`- MJZ`-JZ`,<6L(7UD'<6H(<6H()B,#````J)X,J)T,J)T,J)T,IYT,IYP,.#0$ M;V@(;V<(;V<(````-S0$I9H,I)H,I)H,I)D,HYD,HYD,HY@,HI@,HI@,HI@, MHI<,-C($-C($-C($-3($)"(#````-3($GY4,GY4,GI0,GI0,GI0,G9,+G9,+ MG9,+-#$$1D$%````````FY$+FY$+FY$+FI$+FI`+FI`+F9`+F8\+F8\+F(\+ M(B`"95\'EXX+EXX+EXT+EXT+EHT+=6T)(A\",B\$,B\$(1\"=&P)E(L+E(H+ MDXH+DXH+DXD+85L'(1\",2X$,2T$,"T$````````D(<*D(<*D(<*CX8*CX8* MCX8*CH4*CH4*CH4*C80*C80*C80*C(0*C(,*C(,*C(,*BX(*BX(*BX(*BH(* MBH$*BH$*B8$*B8`*B8`*B(`*B'\*B'\*AW\*AW\*AWX*AWX*AGX*AGT*AGT* MA7T*A7T*A7P*A'P*A'P*A'L*@WL*@WL)@WH)@GH)@GH)@GH)@7D)@7D)@7D) M@7@)@'@)@'@)@'<)?W<)?W<)?W<)?G8)?G8)?G8)?74)?74)?74)?'4)?'0) M?'0)?'0)>W,)>W,)>W,)>G()>G()>G()>7()>7$)>7$)>'$)>'`)>'`)=W`) M=W`)=V\)=F\)=F\)=FX(=FX(``#DU1'CU1'CU1'CU!'BU!'BU!'BTQ'ATQ'A MTQ'ATA'@TA'@TA'@TA'?T1'?T1#?T1#?T!#>T!#>T!#>T!#=SQ#=SQ#=SQ#< MSA#<SA#<SA#;S1#;S1#;S1#:S1#:S!#:S!#:S!#9RQ#9RQ#9RQ#8RQ#8RA#8 MRA#7RA#7R1#7R1#6R1#6R!#6R!#5R!#5R!#5QQ#4QQ#4QQ#4QA#4QA#3QA#3 MQA#3Q1#2Q1#2Q0_2Q`_1Q`_1Q`_1PP_0PP_0PP_0PP_/P@_/P@_/P@_/P0_. MP0_.P0_.P0_-P`_-P`_-P`_,OP_,OP_,OP_+O@_+O@_+O@_*O@_*O0_*O0_) MO0]#/P5#/P47%0*RIPW(NP_(NP_'NP_'N@_'N@_&N@_&N0_&N0_%N0_%N0_% MN`Z9D`M84@86%0*#>@E74@8```"8C@O"M@["M@["M0[!M0[!M0[!M`XK*`.` M>`F`>`E54`8```!_=PF^L@Z^L@Z^L@Z^L@Z]L0Z]L0Z]L0Z\L`X5%`(_.P6[ MKPZ[KPZ[KPZZKPZZK@ZZK@Z0B`L5%`(^.@4^.@4].@4].04].005%`&WJPVW MJPVVJPTI)@,```!E7P>UJ@VUJ0VTJ0VTJ0VTJ`VTJ`VSJ`VSJ`T````[.`2R MIPVRI@VQI@VQI@VQI0VPI0V)@0IU;@EA6P<Z-P0G)0-.209T;0ET;0D```!S M;`FMH@VMH@VLH0VLH0VLH0VKH`VKH`UR:PE,2`5Q:@AQ:@@F)`,```"IG@RI MG@RHG@RHG0RHG0RGG0PX-`1O:`AO:`AO9P@````W-`2EFPREF@RDF@RDF@RD MF0RCF0RCF0RCF0RCF`RBF`RBF`PV,@1K90AK90AK9`A(0P4````U,@2?E0R? ME0R?E0R>E`R>E`R>E`R>E`R=DPN=DPLT,00```````"<D@N;D0N;D0N;D0N: MD0N:D`N:D`N9D`N9CPN9CPLS,`1W;PF8C@N8C@N7C@N7C0N7C0LB(`)D70=D M70=C70=C70<A'P*4BPN4BPN4B@N3B@N3B@MB6P="/05A6P=A6P=A6P<````` M``"1APN0APJ0APJ0APJ/A@J/A@J/A@J.A0J.A0J.A0J-A`J-A`J-A`J-A`J, M@PJ,@PJ,@PJ+@@J+@@J+@@J*@@J*@0J*@0J)@0J)@`J)@`J(@`J(?PJ(?PJ( M?PJ'?PJ'?@J'?@J&?@J&?0J&?0J%?0J%?0J%?`J$?`J$?`J$>PJ#>PJ#>PF# M>@F">@F">@F">@F">0F!>0F!>0F!>`F`>`F`>`F`>`E_=PE_=PE_=PE^=@E^ M=@E^=@E]=0E]=0E]=0E]=0E\=`E\=`E\=`E[<PE[<PE[<PEZ<PEZ<@EZ<@EY M<@EY<0EY<0EX<0EX<`EX<`EW<`EW<`EW;PEW;PEV;PEV;@@``.35$>35$>/5 M$>/5$>/4$>+4$>+4$>+3$>'3$>'3$>'3$>#2$>#2$>#2$>#1$=_1$-_1$-_0 M$-[0$-[0$-[0$-W/$-W/$-W/$-S.$-S.$-S.$-O.$-O-$-O-$-O-$-K,$-K, M$-K,$-G+$-G+$-G+$-C+$-C*$-C*$-?*$-?)$-?)$-;)$-;)$-;($-7($-7( M$-7'$-7'$-3'$-3&$-3&$-/&$-/&$-/%$-+%$-+%#]+$#]'$#]'$#]'$#]## M#]###]###]#"#\_"#\_"#\_!#\[!#\[!#\[!#\W`#\W`#\W`#\R_#\R_#\R_ M#\N_#\N^#\N^#\J^#\J]#\J]#T,_!0```)V3#,F\#\B\#\B[#\B[#\>[#\>Z M#\>Z#X1\"H1\"D(^!5A3!T(^!6YF"*^D#,2X#L2W#H-Z"0```()Z"<.V#L*V M#L*V#L*U#L&U#L&U#BLH`X!X"8!X"590!@```']W";^S#K^R#KZR#KZR#KZR M#KVQ#KVQ#KVQ#J>=#&EB"+RP#KNP#KNO#KNO#KJO#KJN#KJN#CXZ!:6:#+FM M#KFM#KBM#I"&"V9@!WIS"7IR"5),!@```"DF`[:J#;6J#;6J#;6I#;2I#;2I M#;2H#;2H#;.H#103`;.G#;*G#7=O"6-<!W9O"79O"79N"75N"75N"75N"75M M"75M"75M"75M"4Y)!@```'1M":VB#:VB#:VB#:RA#:RA#:RA#:N@#7)K"4Q( M!G%K"'%J""8D`P```*F>#*F>#*F>#*B>#*B=#*B=##@T!&]H"&]H"&]H"``` M`#<T!*6;#*6;#*6:#*2:#*2:#*29#*29#*.9#*.9#*.8#**8##8S!**7#*&7 M#*&7##8R!````#4R!*"6#)^5#)^5#)^5#)Z4#)Z4#)Z4#)Z4#)V3"YV3"S0Q M!````)R2"YR2"YN1"YN1"YN1"YJ1"YJ0"YJ0"YF0"YF/"S,P!)F/"YB/"YB. M"YB."Y>."U1/!G9N"9:-"Y:,"Y:,"R$?`@```'1L"92+"Y2+"Y2*"Y.*"V)< M!V)<!Y.)"Y*)"Y*)"P```````)&("Y&'"Y"'"Y"'"I"'"H^&"H^&"H^&"HZ% M"HZ%"HZ%"HZ%"HV$"HV$"HV$"HR#"HR#"HR#"HN""HN""HN""HJ""HJ!"HJ! M"HF!"HF`"HF`"HB`"HB`"HA_"HA_"H=_"H=^"H=^"H9^"H9]"H9]"H5]"H5] M"H5\"H1\"H1\"H1["H-["H-["8-["8-Z"8)Z"8)Z"8)Y"8%Y"8%Y"8%X"8!X M"8!X"8!X"7]W"7]W"7]W"7YV"7YV"7YV"7UV"7UU"7UU"7UU"7QT"7QT"7QT M"7MS"7MS"7MS"7IS"7IR"7IR"7ER"7EQ"7EQ"7AQ"7AQ"7AP"7AP"7=P"7=O M"7=O"79O"0``Y-81Y-81Y-41X]41X]41X]01XM01XM01XM,1X=,1X=,1X=,1 MX=(1X-(1X-(1X-$1W]$0W]$0W]$0WM`0WM`0WM`0W<\0W<\0W<\0W,X0W,X0 MW,X0V\X0V\T0V\T0V\T0VLP0VLP0VLP0V<P0V<L0V<L0V,L0V,H0V,H0U\H0 MU\D0U\D0ULD0ULD0UL@0UL@0U<@0U<<0U<<0U,<0U,<0U,80T\80T\80T\40 MTL40TL4/TL0/T<0/T<0/T<0/T,,/T,,/T,,/T,(/S\(/S\(/S\(/SL$/SL$/ MSL$/S<`/S<`/S<`/S+\/S+\/S+\/R[\/R[X/R[X/R[X/RKT/0S\%<&D(R;T/ MR;P/G9,,A7T*;V@(A7T*0CX%0CX%0CX%65,'A'P*A'L*@WL*@WL*@WL)@WL) M@WL)+"D#````KJ,,P[<.P[8.PK8.PK8.PK4.P;4.%A4"0#P%0#P%*R@#```` M@'<)O[,.O[,.O[(.OK(.OK(.OK(.O;$.O;$.O;$.O+`.O+`.O+`.N[`.NZ\. MNZ\.NZ\.NJX.D8@+4TX&N:T.N:T.N:T.*2<#/3D%/3D$/3D$%1,!````CH4* MMJL-MJH-M:H-M:H-M:D-M:D-M*D-M*@-M*@-LZ@-9%X'4$L&4$L&=V\)=V\) M=F\)=F\)=F\)=6X)=6X)=6X)=6T)=6T)3DD&%!,!%!,!KJ,-KJ,-K:(-K:(- MK:(-K*$-K*$-K*$-<FL)3$@&<FL)<6L()B0#````JI\,J9X,J9X,J9X,J)X, MJ)T,.#0$.#0$.#0$.#0$````-S0$IIL,I9L,I9L,I9H,I9H,I)H,I)D,I)D, MHYD,HYD,HY@,-C,$;&4(;&4(:V4(-C($````-3($H)8,H)8,GY4,GY4,?'0) M````GI0,GI0,GI0,G9,+G9,+1D(%G)(+G)(+G)(+FY(+FY$+FY$+FI$+FI`+ MFI`+FI`+,S`$F8\+F8\+F(\+F(X+AWX*,B\$95X'95X'9%X'0S\%```````` M,B\$E8L+E(L+E(L+E(H+8UP'0CX%8EP'8EL'85L'````````D8@+D8@+D8@+ MD(<+D(<*D(<*CX8*CX8*CX8*CX4*CH4*CH4*CH4*C80*C80*C80*C(,*C(,* MC(,*BX,*BX(*BX(*BH(*BH$*BH$*B8$*B8`*B8`*B8`*B(`*B'\*B'\*AW\* MAWX*AWX*AGX*AGX*AGT*A7T*A7T*A7P*A'P*A'P*A'L*A'L*@WL*@WL)@WH) M@GH)@GH)@GD)@7D)@7D)@7D)@'@)@'@)@'@)?W<)?W<)?W<)?G8)?G8)?G8) M?G8)?74)?74)?74)?'0)?'0)?'0)>W,)>W,)>W,)>G,)>G()>G()>7()>7$) M>7$)>7$)>'$)>'`)>'`)=W`)=V\)=V\)``#EUA'DUA'DUA'DU1'CU1'CU1'C MU!'BU!'BU!'BU!'BTQ'ATQ'ATQ'ATA'@TA'@TA'@T1'?T1#?T1#?T1#>T!#> MT!#>T!#=SQ#=SQ#=SQ#<SA#<SA#<SA#<SA#;S1#;S1#;S1#:S!#:S!#:S!#9 MS!#9RQ#9RQ#8RQ#8RA#8RA#7RA#7R1#7R1#7R1#6R1#6R!#6R!#5R!#5QQ#5 MQQ#4QQ#4QQ#4QA#3QA#3QA#3Q1#2Q1#2Q0_2Q`_1Q`_1Q`_1Q`_1PP_0PP_0 MPP_0P@_/P@_/P@_/P@_.P0_.P0_.P0_-P`_-P`_-P`_,OP_,OP_,OP_,OP_+ MO@_+O@_+O@_*O0_*O0]P:0A#/P6&?0K)O`_(O`_(NP_(NP_'NP_'N@_'N@_& MN@_&N@_&N0_&N0_%N0_%N`YN9@@````6%0+$MP[#MP[#MP[#M@["M@["M@[" MM0Y`/`7!M0[!M0Z!>`D```"`>`G`LPZ_LPZ_LPZ_LPZ^L@Z^L@Z^L@Z]L0Z] ML0Z]L0Z\L`Z\L`Z\L`Z[L`Z[KPZ[KPZ[KPZZK@Y33@:FFPRYK@YG8`B0APNX MK0ZXK`YF8`<````I)@.WJPVVJPVVJPVVJ@VVJ@VUJ@VUJ0VUJ0VTJ0VTJ0U0 M2P:?E@RSJ`VSIPVRIPVRIPVRI@VQI@VQI@VQI@VPI0V)@0IB7`<G)0,````` M``!U;0FNHPVNHPVNHPVMH@VMH@VMH@VLH0VLH0US:PER:PFKH`VKH`TY-00` M``!Q:@AQ:@AQ:@AQ:0AQ:0AP:0@F(P.HG0RGG0RGG`P````W-`2FG`RFFPRE MFPREFPREF@REF@RDF@RDF@RDF0RCF0RCF0PV,P2BF`RBF`RBEPQK90@````V M,@2@E@R@E@R@E@R.A0LD(0,```"?E0R>E`R>E`R>E`R=DPN=DPN=DPN<D@N< MD@N<D@N;D@N;D0N;D0N:D0N:D`N:D`LS,`29D`N9CPN9CPN8CPM$/P6'?@J7 MC@N7C0N7C0L1$`$````R+P133@9T;0F5BPN5BPN4BPMC7`=C7`>3B@N3B@N3 MB0L```````"2B`N1B`N1B`N1B`N0APN0APJ0APJ/A@J/A@J/A@J/A0J.A0J. MA0J.A0J-A`J-A`J-A`J,@PJ,@PJ,@PJ+@PJ+@@J+@@J*@@J*@0J*@0J*@0J) M@`J)@`J)@`J(@`J(?PJ(?PJ'?PJ'?@J'?@J&?@J&?@J&?0J%?0J%?0J%?`J$ M?`J$?`J$>PJ$>PJ#>PJ#>PF#>@F">@F">@F">0F!>0F!>0F!>0F`>`F`>`F` M>`E_=PE_=PE_=PE_=@E^=@E^=@E^=@E]=0E]=0E]=0E\=`E\=`E\=`E[=`E[ M<PE[<PEZ<PEZ<@EZ<@EY<@EY<0EY<0EY<0EX<0EX<`EX<`EW<`EW;PD``.76 M$>76$>36$>36$>35$>/5$>/5$>/4$>+4$>+4$>+4$>+3$>'3$>'3$>'2$>#2 M$>#2$>#1$=_1$=_1$-_1$-[0$-[0$-[0$-W/$-W/$-W/$-W/$-S.$-S.$-S. M$-O-$-O-$-O-$-K,$-K,$-K,$-G,$-G+$-G+$-C+$-C*$-C*$-?*$-?*$-?) M$-?)$-;)$-;($-;($-7($-7'$-7'$-3'$-3'$-3&$-/&$-/&$-/%$-+%$-+% M#]+%#]+$#]'$#]'$#]'##]###]###]#"#\_"#\_"#\_"#\[!#\[!#\[!#\W` M#\W`#\W`#\S`#\R_#\R_#\R_#\N^#\N^#\N^#UI4!X=^"H=^"H9^"H9]"H9] M"H5]"H5]"H5]"H5]"H5]"H5\"H5\"H1\"H1["D(^!0```````````)F0"\2X M#L2W#L.W#L.W#L.V#L*V#L*V#BLI`X%Y"8%Y"591!@```(!X"<"T#L"S#K^S M#K^S#K^S#KZR#KZR#KZR#KVQ#KVQ#KVQ#KRQ#KRP#KRP#KRP#KNO#KNO#KNO M#J:;#%-.!KJN#CXZ!3XZ!3XZ!3TZ!0```````*.9#+>L#;>K#;>K#;:K#;:J M#;:J#;6J#;6I#;6I#:"6#%!,!GAP"7=P"7=P"7=O"3LX!"@E`P`````````` M`````````````````$])!IR2#*^D#:^D#:ZC#:ZC#:ZC#:VB#:VB#:VB#:RA M#7-K"4U(!G-K"7)K"28D`P```*J?#*J?#*J?#*F?#*F>#*F>##@U!'!I"'!I M"&]I"````#@T!*:<#*:<#*:;#*:;#*6;#*6:#*6:#*2:#*2:#*29#*.9##8S M!&UE"&QE"&QE"$A$!0```#8R!*&7#'YU"4A#!6MD"#4R!````)^5#)^5#)Z4 M#)Z4#)Z4#)V3"YV3"YV3"YR2"YR2"YR2"YN2"YN1"YN1"YN1"YJ0"S,P!)J0 M"YF0"YF/"W=P"41`!65?!V5?!V5?!R(@`@```!$0`89^"I:,"S(O!)6,"Y6+ M"Y6+"V-=!T(^!6-<!V)<!V)<!P```````)*)"Y*("Y&("Y&("Y&("Y"'"Y"' M"I"'"I"&"H^&"H^&"H^&"HZ%"HZ%"HZ%"HV$"HV$"HV$"HR#"HR#"HR#"HN# M"HN""HN""HN""HJ!"HJ!"HJ!"HF!"HF`"HF`"HB`"HA_"HA_"H=_"H=^"H=^ M"H9^"H9^"H9]"H5]"H5]"H5\"H5\"H1\"H1\"H1["H-["H-["8-Z"8)Z"8)Z M"8)Y"8%Y"8%Y"8%Y"8!X"8!X"8!X"8!W"7]W"7]W"7]W"7YV"7YV"7YV"7UU M"7UU"7UU"7QT"7QT"7QT"7MT"7MS"7MS"7IS"7IR"7IR"7IR"7ER"7EQ"7EQ M"7AQ"7AP"7AP"7=P"0``Y=<1Y=<1Y=81Y-81Y-81Y-41X]41X]41X]01X]01 MXM01XM01XM,1X=,1X=,1X=(1X-(1X-(1X-(1W]$1W]$0W]$0WM`0WM`0WM`0 MWL\0W<\0W<\0W<\0W,X0W,X0W,X0V\T0V\T0V\T0VLT0VLP0VLP0V<P0V<L0 MV<L0V,L0V,H0V,H0V,H0U\H0U\D0U\D0ULD0UL@0UL@0U<@0U<@0U<<0U,<0 MU,<0U,80T\80T\80T\40T\40TL40TL4/TL0/T<0/T<0/T<,/T,,/T,,/T,,/ MS\(/S\(/S\(/SL$/SL$/SL$/S<`/S<`/S<`/S<`/S+\/S+\/S+\/R[X/6U4' M+2H#0S\%0S\%0S\%0S\%0S\%0S\%0S\%0SX%0SX%0SX%0CX%0CX%0CX%```` M````````%A4"FI`+Q;@.Q+@.Q+@.Q+<.P[<.P[<.P[8.PK8.*RD#@7D)@7D) M5E$&````@7@)P+0.P+0.P+,.O[,.O[,.O[,.OK(.OK(.OK(.O;$.O;$.O;$. MO;$.O+`.O+`.O+`.NZ\.NZ\.NZ\.4TX&/CH%:&$(>W0)>W,)/CH%````4DT& MN*P-MZP-MZP-MZL-MZL-MJL-MJH-MJH-M:H-M:D->7$)9%X'>'$)9%X'*"8# M````````````````````.S<$.S<$=F\)BH$*L*4-L*4-=6T)KZ0-KZ0-KZ0- MKJ,-KJ,-KJ,-K:(-K:(-K:(-<VP)34@&<VL)<VL))B0#````JZ`,JI\,JI\, MJI\,J9\,J9X,.#4$<&D(<&D(<&D(````.#0$IYP,IYP,IIP,IIL,IIL,I9L, MI9H,I9H,I)H,I)H,I)D,-C,$-C,$-C,$-C,$)"(#````$A$!-C($-C($$A$! M650')"(#````GY4,GY4,GY4,GI0,GI0,GI0,G9,+G9,+G9,+G),+G)(+G)(+ MG)(+FY$+FY$+FY$+,S`$FI`+FI`+F9`+(B`",S`$,S`$,R\$,R\$```````` M5$\&EHT+EHT+5$X&=6T)E8P+E8L+8UT'(1\",2X$,2X$,2X$````````DHD+ MDHD+DHD+D8@+D8@+D8@+D8<+D(<*D(<*D(8*CX8*CX8*CX8*CH4*CH4*CH4* MC80*C80*C80*C(0*C(,*C(,*BX,*BX(*BX(*BX(*BH$*BH$*BH$*B8$*B8`* MB8`*B(`*B'\*B'\*AW\*AW\*AWX*AGX*AGX*AGT*AGT*A7T*A7P*A7P*A'P* MA'P*A'L*@WL*@WL)@WH)@GH)@GH)@GH)@7D)@7D)@7D)@'@)@'@)@'@)@'<) M?W<)?W<)?W<)?G8)?G8)?G8)?74)?74)?74)?'4)?'0)?'0)>W0)>W,)>W,) M>W,)>G()>G()>G()>7()>7$)>7$)>'$)>'`)>'`)``#FUQ'EUQ'EUQ'EUA'D MUA'DUA'DU1'DU1'CU1'CU1'CU!'BU!'BU!'BTQ'ATQ'ATQ'ATA'@TA'@TA'@ MTA'?T1'?T1#?T1#>T!#>T!#>T!#>T!#=SQ#=SQ#=SQ#<SA#<SA#<SA#;S1#; MS1#;S1#:S1#:S!#:S!#9S!#9RQ#9RQ#9RQ#8RA#8RA#8RA#7RA#7R1#7R1#6 MR1#6R!#6R!#5R!#5R!#5QQ#4QQ#4QQ#4QA#3QA#3QA#3Q1#3Q1#2Q1#2Q0_2 MQ`_1Q`_1Q`_1PP_0PP_0PP_0PP_/P@_/P@_/P@_.P0_.P0_.P0_.P`_-P`_- MP`_-P`_,OP_,OP_,OP\M*@/+O@_+O@_*O@_*O0^'?@I:5`=#/P4M*@,````` M```````````````````````L*@-N9PC&N0_%N0_%N0_%N`[$N`[$N`[$MP[# MMP[#MP[#M@Y!/07"M@["M@Z!>0D```"!>0G!M`[`M`[`M`[`M`Z_LPZ_LPZ_ MLPZ^L@Z^L@Z^L@Z^L0Z]L0Z]L0Z]L0Z\L`Z\L`Z\L`Z[KPZ[KPZ[KPX^.@6Z MK@ZZK@ZEFPP```````"DF@RXK`ZXK`ZXK`VWK`VWJPVWJPVVJPVVJ@VVJ@VU MJ@UY<0FUJ0UX<0D````````\.`1D7@=W;PFSIPVRIPVRIPVRI@VQI@VQI@VQ MI0UU;@D[-P2PI0VOI`VOI`VOI`VNHPVNHPVNHPVMH@VMH@US;`ES;`FLH0VL MH0TY-@0```"KH`VKH`RJH`RJGPRJGPRIGPPX-02IG@RHG@RHG0P````X-`2G MG0RGG`RGG`RFG`RFFPRFFPREFPREFPREF@RDF@RDF@PW,P2CF0RCF0RCF`QL M90@````V,P2BEPRAEPR/A@M(0P4D(@,```"@E@R?E0R?E0R?E0R>E`R>E`R> ME`R=DPN=DPN=DPN=DPN<D@N<D@N<D@N;D0N;D0LT,`2:D0N:D`M64`9W<`F9 MCPN9CPN8CPLB(`(````B(`*7C@N7C0N7C0N6C0LR+P26C`N5C`MC70=C70>4 MBPN4BPN4B@L```````"3B0N2B0N2B0N2B0N2B`N1B`N1B`N1APN0APJ0APJ0 MA@J/A@J/A@J/A@J.A0J.A0J.A0J-A`J-A`J-A`J,A`J,@PJ,@PJ,@PJ+@@J+ M@@J+@@J*@0J*@0J*@0J)@0J)@`J)@`J(@`J(?PJ(?PJ'?PJ'?PJ'?@J'?@J& M?@J&?0J&?0J%?0J%?`J%?`J$?`J$?`J$>PJ#>PJ#>PF#>@F">@F">@F">@F! M>0F!>0F!>0F!>`F`>`F`>`F`=PE_=PE_=PE_=PE^=@E^=@E^=@E]=0E]=0E] M=0E\=0E\=`E\=`E\=`E[<PE[<PE[<PEZ<@EZ<@EZ<@EY<@EY<0EY<0EX<0EX M<`D``.;7$>;7$>77$>77$>76$>76$>36$>35$>35$>/5$>/5$>/4$>+4$>+4 M$>+3$>'3$>'3$>'2$>#2$>#2$>#2$=_1$=_1$-_1$-_0$-[0$-[0$-[0$-W/ M$-W/$-W/$-S.$-S.$-S.$-O-$-O-$-O-$-K-$-K,$-K,$-K,$-G+$-G+$-G+ M$-C+$-C*$-C*$-?*$-?)$-?)$-;)$-;($-;($-7($-7($-7'$-3'$-3'$-3& M$-3&$-/&$-/&$-/%$-+%$-+%#]+$#]'$#]'$#]'##]###]###]###\_"#\_" M#\_"#\_!#\[!#\[!#\[!#\W`#\W`#\W`#\R_#Y^5#%M5!X=_"H=_"A<6`@`` M`````````````````````!<5`D,_!5E4!X5]"IN2#,>Z#\>Z#\:Z#YN0#)N0 M#,6Y#\6Y#\6X#L2X#L2X#L2W#L2W#L.W#A85`D$]!4$]!2LI`P```(%Y"<&U M#L&T#L"T#L"T#L"T#K^S#K^S#K^S#KZR#KZR#KZR#KZR#KVQ#KVQ#KVQ#KRP M#KRP#KRP#KNO#KNO#FAA"&AA"'QT"2HG`P```&=@"+FM#KFM#KBM#KBL#KBL M#;>L#;>K#;>K#;:K#;:J#;:J#8V%"B@F`Q43`103`:"6#+2H#;.H#;.H#;.H M#;.G#;*G#;*G#;*F#;&F#9Z4#$]*!CLW!+"E#;"E#:^D#:^D#:^D#:ZC#:ZC M#:ZC#:ZC#7-L"2<D`SHV!#DV!!02`0```*N@#:N@#:N@#:J@#*J?#*J?##@U M!#@U!#@U!#@U!````#@T!*B=#*>=#*><#*><#*:<#*:;#*:;#*6;#*6;#*6: M#*2:##<S!&UF"&UF"&UF""0B`P```#8S!**8#**7#*&7#*&7##8R!````*"6 M#*"6#)^5#)^5#(Z%"UA2!YZ4#)Z4#)V3"YV3"YV3"YV3"YR2"YR2"YR2"YN1 M"S0P!)N1"XF!"B(@`C,P!#,P!#,P!!$0`0```````'=O"9B."Y>."Y>-"Y>- M"U1/!G5M"9:,"V-=!T,_!6-=!V-=!V-=!P```````).*"Y.)"Y*)"Y*)"Y*) M"Y*("Y&("Y&("Y&'"Y"'"I"'"I"'"H^&"H^&"H^&"HZ%"HZ%"HZ%"HV$"HV$ M"HV$"HV$"HR#"HR#"HR#"HN""HN""HN""HJ""HJ!"HJ!"HF!"HF`"HF`"HB` M"HA_"HA_"H=_"H=_"H=^"H=^"H9^"H9]"H9]"H5]"H5]"H5\"H1\"H1\"H1[ M"H-["H-["8-Z"8)Z"8)Z"8)Z"8)Y"8%Y"8%Y"8%X"8!X"8!X"8!X"7]W"7]W M"7]W"7YV"7YV"7YV"7UU"7UU"7UU"7QU"7QT"7QT"7QT"7MS"7MS"7MS"7IS M"7IR"7IR"7ER"7EQ"7EQ"7AQ"0``YM@1YM@1YM<1Y=<1Y=<1Y=81Y=81Y-81 MY-41Y-41X]41X]41X]01XM01XM01XM,1X=,1X=,1X=,1X-(1X-(1X-(1X-$1 MW]$0W]$0W]`0WM`0WM`0WM`0W<\0W<\0W<\0W,X0W,X0W,X0V\X0V\T0V\T0 MVLT0VLP0VLP0VLP0V<L0V<L0V<L0V,L0V,H0V,H0U\H0U\D0U\D0ULD0ULD0 MUL@0U<@0U<@0U<<0U<<0U,<0U,80U,80T\80T\80T\40TL40TL4/TL0/T<0/ MT<0/T<0/T,,/T,,/T,,/S\(/S\(/S\(/S\$/SL$/SL$/SL$/S<`/S<`/S<`/ MMJH-6U4'B'\*1$`%````````+2H#6E0'AWX*GI,,R;P/R;P/R;P/R+P/R+L/ MR+L/Q[L/Q[H/Q[H/%Q4"A'P*QKD/Q;D/Q;D/Q;@.Q;@.Q+@.Q+<.Q+<.+"D# M@GH)@GD)5U$&````;&4(P;4.P;4.P;0.P+0.P+0.P+0.O[,.O[,.O[,.O[(. MOK(.OK(.OK(.O;$.O;$.O;$.O+`.O+`.O+`.NZ\.NZ\./CH%D8D+````%10" MNJX.N:T.N:T.N:T.N*T.N*P.N*P-MZP-MZL-MZL-MJL-MJH-MJH-/#D$/#D$ M95X'M*D-M*D-M*@-M*@-LZ@-LZ@-LZ<-LJ<-LJ<-=V\)BH(*=F\).S<$L*4- ML*4-L*4-KZ0-KZ0-KZ0-KZ,-KJ,-KJ,-=&T)34@&<VP)<VP))B0#````K*$- MJZ`-JZ`-JZ`-JJ`,JI\,.34$<6H(<6D(<6D(````.#4$J)T,J)T,IYT,IYP, MIYP,IIP,IIL,IIL,I9L,I9L,I9H,-S,$;6<(;68(;68()"(#````-C,$HI@, MHI@,HI<,H9<,CX8+-C($H)8,H)8,H)8,CH4+$A$!-3($GI0,GI0,GI0,GI0, MG9,+G9,+G9,+G)(+G)(+G)(+-#`$>7$)-#`$5E$&9V`'9V`'9F`'$1`!```` M1$`%F(\+F(X+F(X+EXX+EXT+EXT+,B\$EHP+9%T'0S\%8UT'8UT'8UT'```` M````DXH+DXH+DXH+DXD+DHD+DHD+DH@+D8@+D8@+D8<+D(<*D(<*D(<*CX8* MCX8*CX8*CH4*CH4*CH4*CH4*C80*C80*C80*C(,*C(,*C(,*BX(*BX(*BX(* MBH(*BH$*BH$*B8$*B8`*B8`*B(`*B(`*B'\*B'\*AW\*AWX*AWX*AGX*AGT* MAGT*A7T*A7T*A7P*A'P*A'P*A'L*@WL*@WL)@WL)@WH)@GH)@GH)@GD)@7D) M@7D)@7@)@'@)@'@)@'@)?W<)?W<)?W<)?G8)?G8)?G8)?78)?74)?74)?74) M?'0)?'0)?'0)>W,)>W,)>W,)>G,)>G()>G()>7()>7$)>7$)``#GV!'FV!'F MV!'FUQ'FUQ'EUQ'EUA'EUA'DUA'DUA'DU1'CU1'CU1'CU!'BU!'BU!'BTQ'A MTQ'ATQ'ATQ'ATA'@TA'@TA'@T1'?T1#?T1#?T1#>T!#>T!#>T!#=SQ#=SQ#= MSQ#<SA#<SA#<SA#;SA#;S1#;S1#;S1#:S!#:S!#:S!#9S!#9RQ#9RQ#8RQ#8 MRA#8RA#7RA#7R1#7R1#6R1#6R1#6R!#6R!#5R!#5QQ#5QQ#4QQ#4QA#4QA#3 MQA#3QA#3Q1#2Q1#2Q0_2Q`_1Q`_1Q`_1Q`_0PP_0PP_0PP_0P@_/P@_/P@_/ MP0_.P0_.P0_.P0_-P`_-P`_-P`]$0`7,OP\````7%@*>E`S+O@_+O@_*O0_* MO0_*O0_)O`_)O`_)O`_(O`_(NP_(NP_'NP]"/@4```"$?`K&N@_&N0_%N0_% MN0_%N`[%N`[$N`ZNHPQ84@:">@F">@E7408````K*0/"M0[!M0[!M0[!M0[` MM`[`M`[`M`[`LPZ_LPZ_LPZ_L@Z^L@Z^L@Z^L@Z]L0Z]L0Z]L0Z\L`Z\L`Z\ ML`Z[L`Z2B0L```````!H80BZK@ZZK@ZYK0ZYK0ZYK0ZXK0ZXK`ZXK`VWK`VW MJPVWJPVVJPVVJPVBEPP5$P$H)@.UJ0VUJ0VTJ0VTJ`VTJ`VSJ`VSJ`V?E0QC M70=W;PE02@9C7`<[-P2QI@VPI0VPI0VPI0VOI`VOI`VOI`VOHPVNHPU.209T M;0ES;`ES;`DG)`,```!S:PFLH0VKH0VKH`VKH`V7C@LY-01Q:@AQ:@AQ:0@` M```3$@&6C0NHG0RHG0RGG0RGG`RGG`RFG`RFG`RFFPREFPREFPPW,P2DF@RD MF@RDF0QM9@@````V,P2CF`RBF`RBF`RBEPRAEPRAEPRAEPR@E@R@E@P2$0$` M```U,@2?E0R?E`R>E`R>E`R>E`R=DPN=DPN=DPN<D@N<D@LT,01%005640:; MD0N:D0N:D`M%0`4````1$`&(?PJ9CPN8CPN8C@N8C@N7C@N7C0MV;@EU;@ED M7@=D70>5C`N5C`N5BPL```````"4B@N4B@N3B@N3B@N3B0N2B0N2B0N2B`N1 MB`N1B`N1B`N0APN0APJ0APJ/A@J/A@J/A@J.A0J.A0J.A0J.A0J-A`J-A`J- MA`J,@PJ,@PJ,@PJ+@@J+@@J+@@J*@@J*@0J*@0J)@0J)@`J)@`J)@`J(@`J( M?PJ(?PJ'?PJ'?@J'?@J&?@J&?0J&?0J%?0J%?0J%?`J$?`J$?`J$>PJ#>PJ# M>PJ#>PF#>@F">@F">@F">0F!>0F!>0F!>`F`>`F`>`F`>`E_=PE_=PE_=PE^ M=@E^=@E^=@E^=@E]=0E]=0E]=0E\=`E\=`E\=`E[<PE[<PE[<PEZ<PEZ<@EZ M<@EY<@EY<0D``.?8$>?8$>?8$>;8$>;7$>;7$>77$>76$>76$>36$>36$>35 M$>/5$>/5$>/4$>+4$>+4$>+3$>'3$>'3$>'3$>'2$>#2$>#2$>#1$=_1$-_1 M$-_1$-[0$-[0$-[0$-W/$-W/$-W/$-S.$-S.$-S.$-S.$-O-$-O-$-O-$-K, M$-K,$-K,$-G,$-G+$-G+$-C+$-C*$-C*$-?*$-?)$-?)$-;)$-;)$-;($-;( M$-7($-7'$-7'$-3'$-3'$-3&$-/&$-/&$-/%$-+%$-+%#]+$#]'$#]'$#]'$ M#]'##]###]###]#"#\_"#\_"#\_"#\[!#\[!#\[!#\W`#\W`#UQ6!W)J"``` M`(A_"LN_#\N^#\N^#\N^#\J]#\J]#\J]#\F]#\F\#\F\#\B\#\B[#UE4!V]H M"````(5\"L:Z#\:Z#\:Y#\:Y#Z^E#8-["5A2!D$]!8-["8-Z"8)Z"6UF"$$] M!4$]!4$]!6QE")>-"\&U#L&U#L&T#L"T#L"T#L"S#K^S#K^S#K^S#KZR#KZR M#KZR#KVQ#KVQ#KVQ#KRP#KRP#KRP#KNP#BHG`RHG`[NO#KJN#KJN#KJN#KFN M#KFM#KFM#KBM#KBL#KBL#;>L#;>K#;>K#;:K#;:K#;:J#65?!R@F`U%,!GEQ M"7AQ"7AQ"61>!SPX!&1>![.G#;*G#;*G#7=O"3LW!+&F#;&F#;"E#;"E#;"E M#;"D#8F`"G5M"4Y)!DY)!G1M"71M"7-L"4U(!CHV!#DV!&!:!X9^"IB/#')K M"3DU!%]9!W%J"'%J"'%J"#@U!#@U!#@U!'!I"'!I"*B=#*>=#*><#*><#*:< M#*:<#*:;#*6;##<T!#<S!#<S!#<S!"4B`P```#8S!*.9#*.8#**8#**8#**7 M#*&7#*&7#*&7#$A#!5E4!P```#4R!)^5#)^5#)^4#)Z4#)Z4#)Z4#)V3"YV3 M"YV3"YR2"S0Q!!(1`6=A!V=A!V=A!U91!@```````%90!IF/"YF/"YF/"YB/ M"YB."YB."Y>."Y>-"S(O!&1>!T,_!61=!V-=!V-=!P```````)2+"Y2*"Y2* M"Y.*"Y.*"Y.)"Y*)"Y*)"Y*("Y&("Y&("Y&("Y"'"Y"'"I"'"H^&"H^&"H^& M"H^%"HZ%"HZ%"HZ%"HV$"HV$"HV$"HR#"HR#"HR#"HN#"HN""HN""HJ""HJ! M"HJ!"HJ!"HF`"HF`"HF`"HB`"HA_"HA_"H=_"H=^"H=^"H9^"H9^"H9]"H5] M"H5]"H5\"H1\"H1\"H1["H1["H-["H-["8-Z"8)Z"8)Z"8)Y"8%Y"8%Y"8%Y M"8!X"8!X"8!X"7]W"7]W"7]W"7]V"7YV"7YV"7YV"7UU"7UU"7UU"7QT"7QT M"7QT"7MT"7MS"7MS"7IS"7IR"7IR"7ER"0``Z-D1Y]D1Y]@1Y]@1YM@1YM<1 MYM<1Y=<1Y=81Y=81Y-81Y-81Y-41X]41X]41X]01XM01XM01XM01XM,1X=,1 MX=,1X=(1X-(1X-(1X-$1W]$1W]$0W]$0WM`0WM`0WM`0W<\0W<\0W<\0W<\0 MW,X0W,X0W,X0V\T0V\T0V\T0VLP0VLP0VLP0V<P0V<L0V<L0V,L0V,H0V,H0 MU\H0U\H0U\D0U\D0ULD0UL@0UL@0U<@0U<<0U<<0U,<0U,<0U,80T\80T\80 MT\40TL40TL4/TL4/TL0/T<0/T<0/T<,/T,,/T,,/T,(/S\(/S\(/S\(/SL$/ MSL$/SL$/S<`/MJL-7%8'1$`%B'\*S+\/S+\/R[X/R[X/R[X/RKT/RKT/RKT/ MR;T/R;P/G9,,0S\%0SX%650'````A7T*Q[H/Q[H/QKH/QKD/QKD/Q;D/Q;@. MQ;@.Q+@.Q+@.Q+<.P[<.P[<.P[8.PK8.PK8.PK8.P;4.P;4.P;4.P;0.P+0. MP+0.P+,.O[,.O[,.O[,.OK(.OK(.OK(.O;$.O;$.O;$.O+`.O+`.O+`.IYT, MIIP,NZ\.NZ\.NJX.NJX.NJX.N:X.N:T.N:T.N*T.N*P.N*P-MZP-MZL-MZL- MMJL-MJL-MJH-MJH-H9<,>7$)>7$)>'$)H)8,M*@-LZ@-LZ@-LZ<-LJ<-LJ<- MLJ8-L:8-L:8-L:8-L:4-L*4-L*4-L*0-KZ0-KZ0-KZ0-KJ,-KJ,-KJ,-K:(- MK:(-K:(-K*$-K*$-K*$-JZ$-JZ`-JZ`-JZ`,JI\,JI\,JI\,J9\,J9X,J9X, MJ)X,J)T,J)T,IYT,IYP,IYP,IIP,IIP,IIL,)2,#;F<(;F<(;F<(244%```` M-S,$HYD,HYD,HY@,HI@,HI@,HI<,CX8+$A$!)"(#)"(#````-3($H)4,GY4, MGY4,GY4,GI0,GI0,GI0,G9,+G9,+G9,+-#$$1D$%:&$'9V$'9V$'(R`"```` M(B`"FI`+FI`+F9`+F8\+F8\+F(\+F(X+F(X+EXX+=FX)(B`"0S\%9%X'9%T' M8UT'````````=&P)E(L+E(L+E(H+DXH+DXH+DXD+DHD+DHD+DH@+D8@+D8@+ MD8@+D(<+D(<*D(<*D(8*CX8*CX8*CX8*CH4*CH4*CH4*C80*C80*C80*C(,* MC(,*C(,*BX,*BX(*BX(*BH(*BH$*BH$*BH$*B8$*B8`*B8`*B(`*B'\*B'\* MAW\*AWX*AWX*AGX*AGX*AGT*A7T*A7T*A7P*A7P*A'P*A'P*A'L*@WL*@WL) M@WH)@GH)@GH)@GD)@7D)@7D)@7D)@'@)@'@)@'@)?W<)?W<)?W<)?W<)?G8) M?G8)?G8)?74)?74)?74)?'0)?'0)?'0)>W0)>W,)>W,)>G,)>G()>G()``#H MV1'HV1'GV1'GV!'GV!'FV!'FUQ'FUQ'EUQ'EUQ'EUA'DUA'DUA'DU1'CU1'C MU1'CU!'CU!'BU!'BU!'BTQ'ATQ'ATQ'ATA'@TA'@TA'@TA'?T1'?T1#?T1#> MT!#>T!#>T!#=SQ#=SQ#=SQ#=SQ#<SA#<SA#<SA#;S1#;S1#;S1#:S1#:S!#: MS!#9S!#9RQ#9RQ#8RQ#8RA#8RA#8RA#7RA#7R1#7R1#6R1#6R!#6R!#5R!#5 MR!#5QQ#4QQ#4QQ#4QA#3QA#3QA#3Q1#2Q1#2Q1#2Q0_2Q`_1Q`_1Q`_1PP_0 MPP_0PP_0P@_/P@_/P@_/P@_.P0_.P0_.P0_-P`^VJPTN*P,7%@*VJ@W,OP_, MOP_+O@_+O@_+O@_*O0_*O0^>DPQP:0B&?0K)O`^%?0I#/@4```"%?0K'NP_' MN@_'N@_&N@_&N0_&N0_%N0_%N`[%N`[$N`[$N`[$MP[#MP[#MP[#M@["M@[" MM@["M@["M0[!M0[!M0[!M`[`M`[`M`[`LPZ_LPZ_LPZ_LPZ^L@Z^L@Z^L@Z] ML0Z]L0Z]L0Z]L0Z\L`Z\L`Z\L`Z[KPZ[KPZ[KPZZK@ZZK@ZZK@ZYK@ZYK0ZY MK0ZXK0ZXK`ZXK`VWK`VWK`VWJPVWJPVVJPVVJ@VVJ@VUJ@VUJ0VUJ0VTJ0VT MJ0VTJ`VSJ`VSJ`VSIPVRIPVRIPVRIPVRI@VQI@VQI@VQI0VPI0VPI0VPI`VO MI`VOI`VOI`VNHPVNHPVNHPVMH@VMH@VMH@VLH@VLH0VLH0VLH0VKH`VKH`VK MH`RJGPRJGPRJGPRIGPQQ:0@X-02HG@RHG0RHG0RGG0RGG0RGG`RGG`QO:`A* M105O9PAN9PAN9PA*104````W,P2DF0RCF0RCF0RCF`R0APM:50=(1`6AEPRA MEPQK90@````U,@2@E@R@E0R?E0R?E0R?E0R>E`R>E`R>E`R,@PI&0@574@9H M8@=H80=H80<T,00```````"*@0J:D`N:D`N:D`N9D`N9CPN9CPN8CPN8C@N8 MC@N7C@LB(`)$/P5D7@=D7@=D70<1$`$````R+@2%?`J4BPN4BPN4B@N3B@N3 MB@N3B0N2B0N2B0N2B0N1B`N1B`N1B`N1APN0APJ0APJ0A@J/A@J/A@J/A@J. MA0J.A0J.A0J-A`J-A`J-A`J,A`J,@PJ,@PJ+@PJ+@@J+@@J+@@J*@0J*@0J* M@0J)@0J)@`J)@`J(@`J(?PJ(?PJ'?PJ'?@J'?@J&?@J&?@J&?0J&?0J%?0J% M?`J%?`J$?`J$?`J$>PJ#>PJ#>PF#>@F">@F">@F">0F!>0F!>0F!>0F`>`F` M>`F`>`F`=PE_=PE_=PE_=PE^=@E^=@E^=@E]=0E]=0E]=0E\=`E\=`E\=`E[ M=`E[<PE[<PE[<PEZ<@D``.C9$>C9$>C9$>?9$>?8$>?8$>;8$>;7$>;7$>77 M$>77$>76$>36$>36$>35$>35$>/5$>/4$>/4$>+4$>+4$>+3$>'3$>'3$>'2 M$>#2$>#2$>#2$=_1$=_1$-_1$-[0$-[0$-[0$-[/$-W/$-W/$-W/$-S.$-S. M$-S.$-O-$-O-$-O-$-K-$-K,$-K,$-G,$-G+$-G+$-G+$-C*$-C*$-C*$-?* M$-?)$-?)$-;)$-;($-;($-7($-7($-7'$-3'$-3'$-3&$-/&$-/&$-/%$-/% M$-+%$-+%#]+$#]'$#]'$#]'##]###]###]###\_"#\_"#\_"#\[!#\[!#\[! M#\[`#\W`#W)K""XK`T1`!7)J"(A_"H=_"H=_"D0_!4,_!5I4!\J]#\F]#\F\ M#\F\#[*G#1<5`H5]"LB[#\>[#\>Z#\>Z#\:Z#\:Y#\:Y#\6Y#\6Y#\6X#L2X M#L2X#L2W#L.W#L.W#L.V#L.V#L*V#L*V#L*U#L&U#L&U#L&T#L"T#L"T#L"T M#K^S#K^S#K^S#KZR#KZR#KZR#KVQ#KVQ#KVQ#KVQ#KRP#KRP#KRP#KNO#KNO M#KNO#KJO#KJN#KJN#KFN#KFM#KFM#KBM#KBL#KBL#;BL#;>L#;>K#;>K#;:K M#;:J#;:J#;6J#;6J#;6I#;2I#;2I#;2H#;.H#;.H#;.G#;*G#;*G#;*G#;*F M#;&F#;&F#;&E#;"E#;"E#;"E#:^D#:^D#:^D#:ZC#:ZC#:ZC#:VB#:VB#:VB M#:VB#:RA#:RA#:RA#:N@#:N@#:N@#*J@#*J?#'%J"!,2`4Q'!:F>#*B>#*B= M#*B=#%U7!S@T!#@T!#@T!#<T!#<T!#<T!#<T!#<T!#<S!#<S!#<S!#<S!#8S M!#8S!#8S!#8S!#8S!#8S!#8R!#8R!#8R!%I4!Z"6#*"6#*"5#)^5#)^5#)^5 M##4Q!#4Q!#4Q!#0Q!#0Q!#0Q!#0Q!#0Q!#0Q!#0Q!%91!IN1"YN1"YJ0"YJ0 M"YJ0"YF0"YF/"YF/"YB/"YB."YB."W9O"3(O!#(O!#(O!#(O!#(O!#(O!#(O M!#(N!#(N!#$N!)2+"Y2*"Y.*"Y.*"Y.)"Y*)"Y*)"Y*)"Y&("Y&("Y&("Y&' M"Y"'"I"'"I"&"H^&"H^&"H^&"HZ%"HZ%"HZ%"HV$"HV$"HV$"HR$"HR#"HR# M"HR#"HN""HN""HN""HJ!"HJ!"HJ!"HF!"HF`"HF`"HB`"HA_"HA_"H=_"H=_ M"H=^"H9^"H9^"H9]"H9]"H5]"H5\"H5\"H1\"H1\"H1["H-["H-["8-Z"8)Z M"8)Z"8)Z"8%Y"8%Y"8%Y"8%X"8!X"8!X"8!W"7]W"7]W"7]W"7YV"7YV"7YV M"7UU"7UU"7UU"7QU"7QT"7QT"7MT"7MS"7MS"7MS"0``Z=H1Z-H1Z-D1Z-D1 MY]D1Y]@1Y]@1YM@1YM<1YM<1Y=<1Y=<1Y=81Y-81Y-81Y-41Y-41X]41X]41 MX]01XM01XM01XM,1X=,1X=,1X=(1X-(1X-(1X-(1W]$1W]$0W]$0W]`0WM`0 MWM`0WM`0W<\0W<\0W<\0W,X0W,X0W,X0V\T0V\T0V\T0VLT0VLP0VLP0V<P0 MV<L0V<L0V<L0V,L0V,H0V,H0U\H0U\D0U\D0ULD0UL@0UL@0U<@0U<@0U<<0 MU,<0U,<0U,80U,80T\80T\80T\40TL40TL4/TL0/T<0/T<0/T<,/T,,/T,,/ MT,,/S\(/S\(/S\(/S\$/SL$/SL$/SL$/S<`/S<`/S<`/B'\*B'\*B'\*AW\* MM:D-R[X/RKX/RKT/RKT/R;T/R;P/R;P/R;P/LJ<-R+L/R+L/Q[L/Q[H/Q[H/ MQKH/QKD/QKD/Q;D/Q;D/Q;@.Q+@.Q+@.Q+<.Q+<.P[<.P[<.P[8.PK8.PK8. MPK4.P;4.P;4.P;0.P+0.P+0.P+0.O[,.O[,.O[,.OK(.OK(.OK(.OK(.O;$. MO;$.O;$.O+`.O+`.O+`.NZ\.NZ\.NZ\.NJ\.NJX.NJX.N:X.N:T.N:T.N:T. MN*P.N*P.N*P-MZP-MZL-MZL-MJL-MJH-MJH-M:H-M:H-M:D-M*D-M*D-M*@- MLZ@-LZ@-LZ<-LZ<-LJ<-LJ<-LJ8-L:8-L:8-L:4-L*4-L*4-L*4-KZ0-KZ0- MKZ0-KJ,-KJ,-KJ,-KJ(-K:(-K:(-K:(-K*$-K*$-K*$-JZ`-JZ`-JZ`-3$@% M<6H()B0#A'P)J9X,J9X,J)X,J)T,J)T,J)T,IYT,IYP,IYP,IIP,IIL,IIL, MI9L,I9L,I9H,I)H,I)H,I)D,HYD,HYD,HY@,HY@,HI@,HI@,HI<,H9<,H9<, MH98,H)8,H)8,H)8,GY4,GY4,GY4,GI0,GI0,GI0,G9,+G9,+G9,+G9,+G)(+ MG)(+G)(+FY$+FY$+FY$+FI$+FI`+FI`+F9`+F8\+F8\+F(\+F(X+F(X+F(X+ MEXX+EXT+EXT+EHT+EHP+EHP+E8P+E8P+E8L+E(L+E(L+E(H+DXH+DXH+DXD+ MDHD+DHD+DHD+DH@+D8@+D8@+D8<+D(<*D(<*D(<*CX8*CX8*CX8*CH4*CH4* MCH4*C80*C80*C80*C80*C(,*C(,*C(,*BX(*BX(*BX(*BH(*BH$*BH$*B8$* MB8`*B8`*B(`*B'\*B'\*AW\*AW\*AWX*AWX*AGX*AGT*AGT*A7T*A7T*A7P* MA'P*A'P*A'L*@WL*@WL)@WH)@GH)@GH)@GH)@GD)@7D)@7D)@7@)@'@)@'@) M@'@)?W<)?W<)?W<)?G8)?G8)?G8)?74)?74)?74)?'4)?'0)?'0)?'0)>W,) M>W,)``#IVA'IVA'HVA'HV1'HV1'GV1'GV!'GV!'FV!'FV!'FUQ'EUQ'EUQ'E MUA'EUA'DUA'DU1'DU1'CU1'CU1'CU!'BU!'BU!'BTQ'ATQ'ATQ'ATQ'@TA'@ MTA'@TA'@T1'?T1#?T1#?T!#>T!#>T!#>T!#=SQ#=SQ#=SQ#<SA#<SA#<SA#; MSA#;S1#;S1#:S1#:S!#:S!#:S!#9RQ#9RQ#9RQ#8RQ#8RA#8RA#7RA#7R1#7 MR1#6R1#6R1#6R!#5R!#5R!#5QQ#5QQ#4QQ#4QA#4QA#3QA#3QA#3Q1#2Q1#2 MQ0_2Q`_1Q`_1Q`_1PP_0PP_0PP_0PP_/P@_/P@_/P@_/P0_.P0_.P0_.P0_- MP`_-P`_-P`_,OP_,OP_,OP_+O@_+O@_+O@_*O@_*O0_*O0_*O0_)O`_)O`_) MO`_(O`_(NP_(NP_'NP_'N@_'N@_&N@_&N0_&N0_%N0_%N0_%N`[$N`[$N`[$ MMP[$MP[#MP[#MP[#M@["M@["M@["M0[!M0[!M0[!M`[`M`[`M`[`M`Z_LPZ_ MLPZ_LPZ_L@Z^L@Z^L@Z^L@Z]L0Z]L0Z]L0Z\L`Z\L`Z\L`Z[KPZ[KPZ[KPZZ MKPZZK@ZZK@ZYK@ZYK0ZYK0ZYK0ZXK0ZXK`ZXK`VWK`VWJPVWJPVVJPVVJ@VV MJ@VUJ@VUJ@VUJ0VTJ0VTJ0VTJ`VTJ`VSJ`VSJ`VSIPVRIPVRIPVRI@VQI@VQ MI@VQI0VPI0VPI0VPI0VOI`VOI`VOI`VNHPVNHPVNHPVNHPVMH@VMH@VMH@VL MH0VLH0VLH0VKH`TY-00F)`,Y-00```"JGPRIGPRIG@RIG@RIG@RHG@RHG0RH MG0RGG0RGG`RGG`RFG`RFFPRFFPREFPREFPREF@RDF@RDF@RDF0RCF0RCF0RC MF0RCF`RBF`RBF`RBEPRAEPRAEPRAE@R@E@R@E@R@E@R?E0R?E0R?E0R>E`R> ME`R>E`R>E`R=DPN=DPN=DPN<D@N<D@N<D@N;D0N;D0N;D0N:D0N:D`N:D`N9 MD`N9CPN9CPN8CPN8CPN8C@N8C@N7C@N7C0N7C0N6C0N6C`N6C`N5C`N5C`N5 MBPN4BPN4BPN4B@N3B@N3B@N3B@N3B0N2B0N2B0N2B`N1B`N1B`N1APN0APJ0 MAPJ0APJ/A@J/A@J/A@J.A0J.A0J.A0J-A0J-A`J-A`J-A`J,@PJ,@PJ,@PJ+ M@@J+@@J+@@J*@@J*@0J*@0J)@0J)@`J)@`J(@`J(@`J(?PJ(?PJ'?PJ'?@J' M?@J&?@J&?0J&?0J%?0J%?0J%?`J$?`J$?`J$>PJ#>PJ#>PF#>@F">@F">@F" M>@F">0F!>0F!>0F!>`F`>`F`>`F`>`E_=PE_=PE_=PE^=@E^=@E^=@E]=0E] M=0E]=0E]=0E\=`E\=`E\=`E[<PD``.G;$>G:$>G:$>C:$>C9$>C9$>?9$>?8 M$>?8$>;8$>;8$>;7$>;7$>77$>76$>76$>36$>35$>35$>/5$>/5$>/4$>+4 M$>+4$>+3$>'3$>'3$>'3$>#2$>#2$>#2$>#1$=_1$-_1$-_0$-[0$-[0$-[0 M$-W/$-W/$-W/$-S.$-S.$-S.$-O.$-O-$-O-$-O-$-K,$-K,$-K,$-G+$-G+ M$-G+$-C+$-C*$-C*$-?*$-?)$-?)$-;)$-;)$-;($-7($-7($-7'$-7'$-3' M$-3&$-3&$-/&$-/&$-/%$-+%$-+%#]+$#]'$#]'$#]'$#]###]###]###]#" M#\_"#\_"#\_!#\[!#\[!#\[!#\W`#\W`#\W`#\R_#\R_#\R_#\N_#\N^#\N^ M#\N^#\J]#\J]#\J]#\F\#\F\#\F\#\B\#\B[#\B[#\>[#\>Z#\>Z#\:Z#\:Z M#\:Y#\6Y#\6Y#\6X#L6X#L2X#L2W#L2W#L.W#L.W#L.V#L*V#L*V#L*U#L&U M#L&U#L&U#L"T#L"T#L"T#L"S#K^S#K^S#K^R#KZR#KZR#KZR#KVQ#KVQ#KVQ M#KRP#KRP#KRP#KNP#KNO#KNO#KJO#KJN#KJN#KJN#KFM#KFM#KFM#KBM#KBL M#KBL#;>L#;>K#;>K#;:K#;:K#;:J#;6J#;6J#;6I#;6I#;2I#;2H#;2H#;.H M#;.H#;.G#;*G#;*G#;*F#;&F#;&F#;&F#;"E#;"E#;"E#:^D#:^D#:^D#:^C M#:ZC#:ZC#:ZC#:VB#:VB#:VB#:RA#:RA#:RA#:NA#:N@#:N@#:J@#*J?#*J? M#*J?#*F>#*F>#*F>#*B>#*B=#*B=#*>=#*><#*><#*:<#*:<#*:;#*6;#*6; M#*6:#*2:#*2:#*29#*29#*.9#*.9#*.8#**8#**8#**7#*&7#*&7#*&7#*"6 M#*"6#*"6#)^5#)^5#)^5#)^4#)Z4#)Z4#)Z4#)V3"YV3"YV3"YR2"YR2"YR2 M"YN1"YN1"YN1"YJ1"YJ0"YJ0"YF0"YF/"YF/"YF/"YB/"YB."YB."Y>."Y>- M"Y>-"Y:-"Y:,"Y:,"Y6,"Y6,"Y6+"Y2+"Y2+"Y2*"Y2*"Y.*"Y.*"Y.)"Y*) M"Y*)"Y*("Y&("Y&("Y&'"Y"'"Y"'"I"'"H^&"H^&"H^&"HZ%"HZ%"HZ%"HZ% M"HV$"HV$"HV$"HR#"HR#"HR#"HN""HN""HN""HJ""HJ!"HJ!"HF!"HF`"HF` M"HF`"HB`"HA_"HA_"H=_"H=^"H=^"H9^"H9]"H9]"H5]"H5]"H5\"H1\"H1\ M"H1["H-["H-["8-["8-Z"8)Z"8)Z"8)Y"8%Y"8%Y"8%X"8!X"8!X"8!X"7]W M"7]W"7]W"7YV"7YV"7YV"7YV"7UU"7UU"7UU"7QT"7QT"7QT"0``ZML1Z=L1 MZ=H1Z=H1Z-H1Z-D1Z-D1Y]D1Y]@1Y]@1Y]@1YM@1YM<1YM<1Y=<1Y=81Y=81 MY-81Y-81Y-41X]41X]41X]01XM01XM01XM,1X=,1X=,1X=,1X=(1X-(1X-(1 MX-$1W]$0W]$0W]$0WM`0WM`0WM`0W<\0W<\0W<\0W,X0W,X0W,X0W,X0V\T0 MV\T0V\T0VLP0VLP0VLP0V<P0V<L0V<L0V,L0V,H0V,H0U\H0U\D0U\D0ULD0 MULD0UL@0UL@0U<@0U<<0U<<0U,<0U,<0U,80T\80T\80T\40TL40TL4/TL0/ MT<0/T<0/T<0/T<,/T,,/T,,/T,(/S\(/S\(/S\(/SL$/SL$/SL$/S<`/S<`/ MS<`/S+\/S+\/S+\/R[\/R[X/R[X/R[X/RKT/RKT/RKT/R;T/R;P/R;P/R+P/ MR+L/R+L/Q[L/Q[H/Q[H/QKH/QKH/QKD/QKD/Q;D/Q;@.Q;@.Q+@.Q+@.Q+<. MP[<.P[<.P[8.PK8.PK8.PK4.P;4.P;4.P;4.P+0.P+0.P+0.P+,.O[,.O[,. MO[,.OK(.OK(.OK(.O;$.O;$.O;$.O+`.O+`.O+`.N[`.NZ\.NZ\.NZ\.NJX. MNJX.NJX.N:X.N:T.N:T.N*T.N*P.N*P-MZP-MZL-MZL-MJL-MJL-MJH-M:H- MM:H-M:D-M:D-M*D-M*@-M*@-LZ@-LZ@-LZ<-LJ<-LJ<-LJ8-L:8-L:8-L:8- ML*4-L*4-L*4-L*0-KZ0-KZ0-KZ,-KJ,-KJ,-KJ,-K:(-K:(-K:(-K*$-K*$- MK*$-JZ$-JZ`-JZ`-JJ`,JI\,JI\,JI\,J9X,J9X,J9X,J)X,J)T,J)T,IYT, MIYP,IYP,IIP,IIP,IIL,I9L,I9L,I9H,I9H,I)H,I)D,I)D,HYD,HYD,HY@, MHI@,HI@,HI<,H9<,H9<,H9<,H)8,H)8,H)8,GY4,GY4,GY4,GY0,GI0,GI0, MGI0,G9,+G9,+G9,+G)(+G)(+G)(+FY(+FY$+FY$+FI$+FI`+FI`+FI`+F8\+ MF8\+F8\+F(\+F(X+F(X+EXX+EXT+EXT+EHT+EHT+EHP+E8P+E8P+E8L+E(L+ ME(L+E(H+E(H+DXH+DXH+DXD+DHD+DHD+DH@+D8@+D8@+D8@+D(<+D(<*D(<* MCX8*CX8*CX8*CX4*CH4*CH4*CH4*C80*C80*C80*C(,*C(,*C(,*BX,*BX(* MBX(*BH(*BH$*BH$*B8$*B8`*B8`*B8`*B(`*B'\*B'\*AW\*AWX*AWX*AGX* MAGX*AGT*A7T*A7T*A7P*A'P*A'P*A'L*A'L*@WL*@WL)@WH)@GH)@GH)@GD) M@7D)@7D)@7D)@'@)@'@)@'@)?W<)?W<)?W<)?G8)?G8)?G8)?G8)?74)?74) M?74)?'0)?'0)``#JVQ'JVQ'IVQ'IVA'IVA'HVA'HV1'HV1'GV1'GV1'GV!'G MV!'FV!'FUQ'FUQ'EUQ'EUA'EUA'DUA'DUA'DU1'CU1'CU1'CU!'BU!'BU!'B MU!'BTQ'ATQ'ATQ'ATA'@TA'@TA'@T1'?T1#?T1#?T1#>T!#>T!#>T!#=SQ#= MSQ#=SQ#<SQ#<SA#<SA#<SA#;S1#;S1#;S1#:S!#:S!#:S!#9S!#9RQ#9RQ#8 MRQ#8RA#8RA#7RA#7RA#7R1#7R1#6R1#6R!#6R!#5R!#5QQ#5QQ#4QQ#4QQ#4 MQA#3QA#3QA#3Q1#2Q1#2Q0_2Q0_2Q`_1Q`_1Q`_1PP_0PP_0PP_0P@_/P@_/ MP@_/P@_.P0_.P0_.P0_-P`_-P`_-P`_,OP_,OP_,OP_,OP_+O@_+O@_+O@_* MO0_*O0_*O0_)O0_)O`_)O`_(O`_(NP_(NP_'NP_'N@_'N@_'N@_&N@_&N0_& MN0_%N0_%N`[%N`[$N`[$N`[$MP[#MP[#MP[#M@["M@["M@["M0[!M0[!M0[! MM0[!M`[`M`[`M`[`LPZ_LPZ_LPZ_LPZ^L@Z^L@Z^L@Z]L0Z]L0Z]L0Z\L`Z\ ML`Z\L`Z\L`Z[KPZ[KPZ[KPZZK@ZZK@ZZK@ZYK@ZYK0ZYK0ZXK0ZXK`ZXK`VW MK`VWJPVWJPVVJPVVJPVVJ@VVJ@VUJ@VUJ0VUJ0VTJ0VTJ0VTJ`VSJ`VSJ`VS MIPVRIPVRIPVRI@VQI@VQI@VQI@VQI0VPI0VPI0VPI`VOI`VOI`VOI`VNHPVN MHPVNHPVMH@VMH@VMH@VLH0VLH0VLH0VKH0VKH`VKH`VKH`RJGPRJGPRJGPRI MGPRIG@RIG@RHG@RHG0RHG0RGG0RGG`RGG`RFG`RFG`RFFPRFFPREFPREF@RE MF@RDF@RDF@RDF0RCF0RCF0RCF`RBF`RBF`RBEPRAEPRAEPRAEPR@E@R@E@R@ ME@R@E0R?E0R?E0R?E0R>E`R>E`R>E`R=DPN=DPN=DPN<D@N<D@N<D@N;D@N; MD0N;D0N;D0N:D`N:D`N:D`N9D`N9CPN9CPN8CPN8C@N8C@N7C@N7C0N7C0N6 MC0N6C0N6C`N5C`N5C`N5BPN5BPN4BPN4BPN4B@N3B@N3B@N3B0N2B0N2B0N2 MB`N1B`N1B`N1B`N0APN0APJ0APJ0A@J/A@J/A@J/A@J.A0J.A0J.A0J-A`J- MA`J-A`J,@PJ,@PJ,@PJ+@PJ+@@J+@@J*@@J*@0J*@0J*@0J)@0J)@`J)@`J( M@`J(?PJ(?PJ'?PJ'?@J'?@J&?@J&?@J&?0J%?0J%?0J%?`J%?`J$?`J$?`J$ M>PJ#>PJ#>PF#>@F">@F">@F">0F!>0F!>0F!>0F`>`F`>`F`>`E_=PE_=PE_ M=PE_=@E^=@E^=@E^=@E]=0E]=0E]=0E\=`D``.K<$>K;$>K;$>G;$>G:$>G: M$>C:$>C9$>C9$>C9$>?9$>?8$>?8$>;8$>;7$>;7$>77$>77$>76$>36$>36 M$>35$>/5$>/5$>/4$>/4$>+4$>+4$>+3$>'3$>'3$>'2$>#2$>#2$>#1$=_1 M$=_1$-_1$-[0$-[0$-[0$-W/$-W/$-W/$-W/$-S.$-S.$-S.$-O-$-O-$-O- M$-K,$-K,$-K,$-G,$-G+$-G+$-C+$-C*$-C*$-C*$-?*$-?)$-?)$-;)$-;( M$-;($-7($-7'$-7'$-3'$-3'$-3&$-/&$-/&$-/%$-+%$-+%$-+%#]+$#]'$ M#]'$#]'##]###]###]#"#\_"#\_"#\_"#\[!#\[!#\[!#\W`#\W`#\W`#\W` M#\R_#\R_#\R_#\N^#\N^#\N^#\J]#\J]#\J]#\F]#\F\#\F\#\B\#\B[#\B[ M#\>[#\>[#\>Z#\>Z#\:Z#\:Y#\:Y#\6Y#\6X#L6X#L2X#L2X#L2W#L.W#L.W M#L.V#L*V#L*V#L*V#L*U#L&U#L&U#L&T#L"T#L"T#L"S#K^S#K^S#K^S#KZR M#KZR#KZR#KVQ#KVQ#KVQ#KRQ#KRP#KRP#KRP#KNO#KNO#KNO#KJN#KJN#KJN M#KFN#KFM#KFM#KBM#KBL#KBL#;>L#;>L#;>K#;>K#;:K#;:J#;:J#;6J#;6I M#;6I#;2I#;2I#;2H#;.H#;.H#;.G#;*G#;*G#;*G#;&F#;&F#;&F#;&E#;"E M#;"E#;"D#:^D#:^D#:^D#:ZC#:ZC#:ZC#:VB#:VB#:VB#:RB#:RA#:RA#:RA M#:N@#:N@#:N@#*J?#*J?#*J?#*F?#*F>#*F>#*B>#*B=#*B=#*>=#*>=#*>< M#*:<#*:<#*:;#*:;#*6;#*6:#*6:#*2:#*2:#*29#*.9#*.9#*.8#**8#**8 M#**8#*&7#*&7#*&7#*&6#*"6#*"6#*"5#)^5#)^5#)^5#)Z4#)Z4#)Z4#)V3 M"YV3"YV3"YR3"YR2"YR2"YN2"YN1"YN1"YN1"YJ0"YJ0"YJ0"YF0"YF/"YF/ M"YB/"YB."YB."Y>."Y>-"Y>-"Y:-"Y:-"Y:,"Y:,"Y6,"Y6+"Y6+"Y2+"Y2+ M"Y2*"Y.*"Y.*"Y.)"Y*)"Y*)"Y*("Y&("Y&("Y&("Y"'"Y"'"I"'"I"&"H^& M"H^&"H^&"HZ%"HZ%"HZ%"HV$"HV$"HV$"HR#"HR#"HR#"HN#"HN""HN""HN" M"HJ!"HJ!"HJ!"HF!"HF`"HF`"HB`"HA_"HA_"H=_"H=^"H=^"H9^"H9^"H9] M"H5]"H5]"H5\"H5\"H1\"H1\"H1["H-["H-["8-Z"8)Z"8)Z"8)Y"8%Y"8%Y M"8%Y"8!X"8!X"8!X"8!W"7]W"7]W"7]W"7YV"7YV"7YV"7UU"7UU"7UU"0`` MZ]P1ZMP1ZML1ZML1Z=L1Z=H1Z=H1Z=H1Z-D1Z-D1Z-D1Y]D1Y]@1Y]@1YM@1 MYM<1YM<1Y=<1Y=<1Y=81Y-81Y-81Y-41X]41X]41X]01X]01XM01XM01XM,1 MX=,1X=,1X=(1X-(1X-(1X-(1W]$1W]$0W]$0WM`0WM`0WM`0WL\0W<\0W<\0 MW<\0W,X0W,X0W,X0V\T0V\T0V\T0VLT0VLP0VLP0V<P0V<L0V<L0V<L0V,H0 MV,H0V,H0U\H0U\D0U\D0ULD0UL@0UL@0U<@0U<@0U<<0U,<0U,<0U,80T\80 MT\80T\40T\40TL40TL4/TL0/T<0/T<0/T<,/T,,/T,,/T,,/S\(/S\(/S\(/ MSL$/SL$/SL$/SL`/S<`/S<`/S<`/S+\/S+\/S+\/R[X/R[X/R[X/RKX/RKT/ MRKT/R;T/R;P/R;P/R+P/R+L/R+L/R+L/Q[L/Q[H/Q[H/QKH/QKD/QKD/Q;D/ MQ;D/Q;@.Q+@.Q+@.Q+<.P[<.P[<.P[8.P[8.PK8.PK8.PK4.P;4.P;4.P;0. MP+0.P+0.P+0.O[,.O[,.O[,.OK(.OK(.OK(.O;$.O;$.O;$.O;$.O+`.O+`. MO+`.NZ\.NZ\.NZ\.NJ\.NJX.NJX.N:X.N:T.N:T.N*T.N*P.N*P-N*P-MZP- MMZL-MZL-MJL-MJH-MJH-M:H-M:H-M:D-M*D-M*D-M*@-LZ@-LZ@-LZ<-LJ<- MLJ<-LJ<-LJ8-L:8-L:8-L:4-L*4-L*4-L*0-KZ0-KZ0-KZ0-KJ,-KJ,-KJ,- MK:(-K:(-K:(-K:(-K*$-K*$-K*$-JZ`-JZ`-JZ`,JI\,JI\,JI\,J9\,J9X, MJ9X,J)X,J)T,J)T,IYT,IYT,IYP,IYP,IIP,IIL,IIL,I9L,I9H,I9H,I)H, MI)H,I)D,HYD,HYD,HY@,HI@,HI@,HI@,HI<,H9<,H9<,H98,H)8,H)8,H)4, MGY4,GY4,GY4,GI0,GI0,GI0,G9,+G9,+G9,+G),+G)(+G)(+G)(+FY$+FY$+ MFY$+FI`+FI`+FI`+F9`+F8\+F8\+F(\+F(X+F(X+EXX+EXX+EXT+EXT+EHT+ MEHP+EHP+E8P+E8L+E8L+E(L+E(L+E(H+DXH+DXH+DXD+DHD+DHD+DHD+D8@+ MD8@+D8@+D8<+D(<*D(<*D(8*CX8*CX8*CX8*CH4*CH4*CH4*C80*C80*C80* MC(0*C(,*C(,*C(,*BX(*BX(*BX(*BH$*BH$*BH$*B8$*B8`*B8`*B(`*B'\* MB'\*AW\*AW\*AWX*AGX*AGX*AGT*AGT*A7T*A7P*A7P*A'P*A'P*A'L*@WL* M@WL)@WH)@GH)@GH)@GH)@7D)@7D)@7D)@7@)@'@)@'@)@'<)?W<)?W<)?W<) M?G8)?G8)?G8)?74)?74)``#KW!'KW!'JW!'JVQ'JVQ'JVQ'IVA'IVA'IVA'H MVA'HV1'HV1'GV1'GV!'GV!'FV!'FUQ'FUQ'EUQ'EUQ'EUA'DUA'DUA'DU1'D MU1'CU1'CU1'CU!'BU!'BU!'BTQ'ATQ'ATQ'ATA'@TA'@TA'@TA'?T1'?T1#? MT1#?T!#>T!#>T!#>T!#=SQ#=SQ#=SQ#<SA#<SA#<SA#;S1#;S1#;S1#:S1#: MS!#:S!#9S!#9RQ#9RQ#9RQ#8RQ#8RA#8RA#7RA#7R1#7R1#6R1#6R!#6R!#5 MR!#5R!#5QQ#4QQ#4QQ#4QA#4QA#3QA#3QA#3Q1#2Q1#2Q0_2Q`_1Q`_1Q`_1 MPP_0PP_0PP_0PP_/P@_/P@_/P@_.P0_.P0_.P0_.P0_-P`_-P`_-P`_,OP_, MOP_,OP_+O@_+O@_+O@_*O@_*O0_*O0_)O0_)O`_)O`_)O`_(NP_(NP_(NP_' MNP_'N@_'N@_&N@_&N0_&N0_%N0_%N0_%N`[$N`[$N`[$MP[#MP[#MP[#M@[# MM@["M@["M@["M0[!M0[!M0[!M`[`M`[`M`[`M`Z_LPZ_LPZ_LPZ^L@Z^L@Z^ ML@Z^L0Z]L0Z]L0Z]L0Z\L`Z\L`Z\L`Z[KPZ[KPZ[KPZZKPZZK@ZZK@ZYK@ZY MK0ZYK0ZXK0ZXK`ZXK`ZXK`VWK`VWJPVWJPVVJPVVJ@VVJ@VUJ@VUJ@VUJ0VT MJ0VTJ0VTJ`VSJ`VSJ`VSIPVSIPVRIPVRIPVRI@VQI@VQI@VQI0VPI0VPI0VP MI0VOI`VOI`VOI`VNHPVNHPVNHPVMH@VMH@VMH@VMH@VLH0VLH0VLH0VKH`VK MH`VKH`RJH`RJGPRJGPRIGPRIG@RIG@RHG@RHG0RHG0RHG0RGG0RGG`RGG`RF MG`RFFPRFFPREFPREFPREF@RDF@RDF@RDF0RCF0RCF0RCF`RBF`RBF`RBF`RB MEPRAEPRAEPRAE@R@E@R@E@R@E@R?E0R?E0R?E0R>E`R>E`R>E`R=DPN=DPN= MDPN=DPN<D@N<D@N<D@N;D0N;D0N;D0N:D0N:D`N:D`N9D`N9CPN9CPN8CPN8 MC@N8C@N7C@N7C@N7C0N7C0N6C0N6C`N6C`N5C`N5C`N5BPN4BPN4BPN4B@N3 MB@N3B@N3B0N2B0N2B0N2B0N2B`N1B`N1B`N1APN0APJ0APJ0APJ/A@J/A@J/ MA@J.A0J.A0J.A0J-A`J-A`J-A`J,A`J,@PJ,@PJ,@PJ+@@J+@@J+@@J*@@J* M@0J*@0J)@0J)@`J)@`J(@`J(?PJ(?PJ'?PJ'?PJ'?@J'?@J&?@J&?0J&?0J% M?0J%?0J%?`J$?`J$?`J$>PJ#>PJ#>PF#>@F">@F">@F">@F!>0F!>0F!>0F! M>`F`>`F`>`F`=PE_=PE_=PE_=PE^=@E^=@E^=@E]=0D``.O=$>O<$>O<$>K< M$>K;$>K;$>K;$>G:$>G:$>G:$>C:$>C9$>C9$>?9$>?8$>?8$>;8$>;8$>;7 M$>77$>77$>76$>76$>36$>35$>35$>/5$>/5$>/4$>+4$>+4$>+3$>'3$>'3 M$>'3$>#2$>#2$>#2$=_1$=_1$-_1$-_0$-[0$-[0$-[0$-W/$-W/$-W/$-S. M$-S.$-S.$-O-$-O-$-O-$-K-$-K,$-K,$-K,$-G+$-G+$-G+$-C+$-C*$-C* M$-?*$-?)$-?)$-;)$-;($-;($-7($-7($-7'$-7'$-3'$-3&$-3&$-/&$-/& M$-/%$-+%$-+%#]+$#]'$#]'$#]'##]###]###]###\_"#\_"#\_"#\_!#\[! M#\[!#\[!#\W`#\W`#\W`#\R_#\R_#\R_#\N^#\N^#\N^#\J^#\J]#\J]#\J] M#\F\#\F\#\F\#\B\#\B[#\B[#\>[#\>Z#\>Z#\:Z#\:Y#\:Y#\6Y#\6Y#\6X M#L2X#L2X#L2W#L2W#L.W#L.W#L.V#L*V#L*V#L*U#L&U#L&U#L&T#L"T#L"T M#L"T#K^S#K^S#K^S#K^R#KZR#KZR#KZR#KVQ#KVQ#KVQ#KRP#KRP#KRP#KNO M#KNO#KNO#KJO#KJN#KJN#KFN#KFM#KFM#KFM#KBM#KBL#KBL#;>L#;>K#;>K M#;:K#;:J#;:J#;6J#;6J#;6I#;2I#;2I#;2H#;2H#;.H#;.H#;.G#;*G#;*G M#;*F#;&F#;&F#;&E#;"E#;"E#;"E#:^D#:^D#:^D#:ZC#:ZC#:ZC#:ZC#:VB M#:VB#:VB#:RA#:RA#:RA#:N@#:N@#:N@#:J@#*J?#*J?#*F?#*F>#*F>#*F> M#*B>#*B=#*B=#*>=#*><#*><#*:<#*:;#*:;#*6;#*6;#*6:#*2:#*2:#*29 M#*.9#*.9#*.9#*.8#**8#**8#**7#*&7#*&7#*&6#*"6#*"6#*"6#)^5#)^5 M#)^5#)Z4#)Z4#)Z4#)Z4#)V3"YV3"YV3"YR2"YR2"YR2"YN1"YN1"YN1"YJ1 M"YJ0"YJ0"YF0"YF/"YF/"YB/"YB/"YB."YB."Y>."Y>-"Y>-"Y:-"Y:,"Y:, M"Y6,"Y6,"Y6+"Y2+"Y2+"Y2*"Y.*"Y.*"Y.)"Y.)"Y*)"Y*)"Y*("Y&("Y&( M"Y&'"Y"'"I"'"I"'"H^&"H^&"H^&"HZ%"HZ%"HZ%"HV$"HV$"HV$"HV$"HR# M"HR#"HR#"HN""HN""HN""HJ""HJ!"HJ!"HF!"HF`"HF`"HB`"HA_"HA_"HA_ M"H=_"H=^"H=^"H9^"H9]"H9]"H5]"H5]"H5\"H1\"H1\"H1["H-["H-["8-Z M"8)Z"8)Z"8)Z"8)Y"8%Y"8%Y"8%X"8!X"8!X"8!X"7]W"7]W"7]W"7YV"7YV M"7YV"0``[-T1Z]T1Z]P1Z]P1Z]P1ZML1ZML1ZML1Z=H1Z=H1Z=H1Z-H1Z-D1 MZ-D1Y]D1Y]@1Y]@1YM@1YM@1YM<1YM<1Y=<1Y=81Y=81Y-81Y-41Y-41X]41 MX]41X]01XM01XM01XM,1X=,1X=,1X=,1X-(1X-(1X-(1X-$1W]$0W]$0W]`0 MWM`0WM`0WM`0W<\0W<\0W<\0W,X0W,X0W,X0V\X0V\T0V\T0V\T0VLP0VLP0 MVLP0V<L0V<L0V<L0V,L0V,H0V,H0U\H0U\D0U\D0ULD0ULD0UL@0U<@0U<@0 MU<<0U<<0U,<0U,80U,80T\80T\80T\40TL40TL4/TL0/T<0/T<0/T<0/T,,/ MT,,/T,,/T,(/S\(/S\(/S\$/SL$/SL$/SL$/S<`/S<`/S<`/S+\/S+\/S+\/ MR[\/R[X/R[X/RKX/RKT/RKT/RKT/R;P/R;P/R;P/R+P/R+L/R+L/Q[L/Q[H/ MQ[H/QKH/QKH/QKD/Q;D/Q;D/Q;@.Q;@.Q+@.Q+<.Q+<.P[<.P[<.P[8.PK8. MPK8.PK4.P;4.P;4.P;4.P+0.P+0.P+0.O[,.O[,.O[,.O[(.OK(.OK(.OK(. MO;$.O;$.O;$.O+`.O+`.O+`.N[`.NZ\.NZ\.NJ\.NJX.NJX.NJX.N:T.N:T. MN:T.N*T.N*P.N*P-MZP-MZL-MZL-MJL-MJL-MJH-M:H-M:H-M:D-M*D-M*D- MM*@-M*@-LZ@-LZ@-LZ<-LJ<-LJ<-LJ8-L:8-L:8-L:8-L*4-L*4-L*4-KZ0- MKZ0-KZ0-KZ,-KJ,-KJ,-KJ,-K:(-K:(-K:(-K*$-K*$-K*$-JZ`-JZ`-JZ`- MJJ`,JI\,JI\,J9\,J9X,J9X,J9X,J)X,J)T,J)T,IYT,IYP,IYP,IIP,IIL, MIIL,I9L,I9L,I9H,I)H,I)H,I)D,I)D,HYD,HYD,HY@,HI@,HI@,HI<,H9<, MH9<,H98,H)8,H)8,H)8,GY4,GY4,GY4,GI0,GI0,GI0,GI0,G9,+G9,+G9,+ MG)(+G)(+G)(+FY$+FY$+FY$+FI$+FI`+FI`+F9`+F8\+F8\+F8\+F(\+F(X+ MF(X+EXX+EXT+EXT+EHT+EHP+EHP+E8P+E8P+E8L+E(L+E(L+E(H+DXH+DXH+ MDXH+DXD+DHD+DHD+DH@+D8@+D8@+D8<+D(<+D(<*D(<*CX8*CX8*CX8*CH4* MCH4*CH4*CH4*C80*C80*C80*C(,*C(,*C(,*BX(*BX(*BX(*BH(*BH$*BH$* MB8$*B8`*B8`*B(`*B(`*B'\*B'\*AW\*AWX*AWX*AGX*AGT*AGT*A7T*A7T* MA7P*A'P*A'P*A'L*@WL*@WL)@WL)@WH)@GH)@GH)@GD)@7D)@7D)@7@)@'@) M@'@)@'@)?W<)?W<)?W<)?G8)?G8)``#LW1'LW1'LW1'KW!'KW!'KW!'JVQ'J MVQ'JVQ'IVQ'IVA'IVA'HVA'HV1'HV1'GV1'GV!'GV!'FV!'FV!'FUQ'FUQ'E MUQ'EUA'EUA'DUA'DUA'DU1'CU1'CU1'CU!'BU!'BU!'BTQ'ATQ'ATQ'ATQ'A MTA'@TA'@TA'@T1'?T1#?T1#?T1#>T!#>T!#>T!#=SQ#=SQ#=SQ#<SA#<SA#< MSA#<SA#;S1#;S1#;S1#:S!#:S!#:S!#9S!#9RQ#9RQ#8RQ#8RA#8RA#7RA#7 MR1#7R1#6R1#6R1#6R!#6R!#5R!#5QQ#5QQ#4QQ#4QQ#4QA#3QA#3QA#3Q1#2 MQ1#2Q0_2Q`_1Q`_1Q`_1Q`_1PP_0PP_0PP_0P@_/P@_/P@_/P@_.P0_.P0_. MP0_-P`_-P`_-P`_,OP_,OP_,OP_+OP_+O@_+O@_+O@_*O0_*O0_*O0_)O0_) MO`_)O`_(O`_(NP_(NP_'NP_'N@_'N@_&N@_&N@_&N0_&N0_%N0_%N`[%N`[$ MN`[$MP[$MP[#MP[#MP[#M@["M@["M@["M0[!M0[!M0[!M0[`M`[`M`[`M`[` MLPZ_LPZ_LPZ_L@Z^L@Z^L@Z^L@Z]L0Z]L0Z]L0Z\L`Z\L`Z\L`Z[L`Z[KPZ[ MKPZ[KPZZK@ZZK@ZZK@ZYK0ZYK0ZYK0ZXK0ZXK`ZXK`VWK`VWJPVWJPVVJPVV MJPVVJ@VUJ@VUJ@VUJ0VUJ0VTJ0VTJ`VTJ`VSJ`VSJ`VSIPVRIPVRIPVRI@VQ MI@VQI@VQI@VPI0VPI0VPI0VPI`VOI`VOI`VOHPVNHPVNHPVNHPVMH@VMH@VM MH@VLH0VLH0VLH0VKH0VKH`VKH`VJH`RJGPRJGPRJGPRIG@RIG@RIG@RHG@RH MG0RHG0RGG0RGG`RGG`RFG`RFG`RFFPREFPREFPREF@REF@RDF@RDF0RDF0RC MF0RCF0RCF`RBF`RBF`RBEPRAEPRAEPRAEPR@E@R@E@R@E@R?E0R?E0R?E0R? ME`R>E`R>E`R>E`R=DPN=DPN=DPN<D@N<D@N<D@N;D@N;D0N;D0N:D0N:D`N: MD`N:D`N9CPN9CPN9CPN8CPN8C@N8C@N7C@N7C0N7C0N6C0N6C0N6C`N5C`N5 MC`N5BPN4BPN4BPN4B@N4B@N3B@N3B@N3B0N2B0N2B0N2B`N1B`N1B`N1B`N0 MAPN0APJ0APJ/A@J/A@J/A@J/A0J.A0J.A0J.A0J-A`J-A`J-A`J,@PJ,@PJ, M@PJ+@PJ+@@J+@@J*@@J*@0J*@0J)@0J)@`J)@`J)@`J(@`J(?PJ(?PJ'?PJ' M?@J'?@J&?@J&?@J&?0J%?0J%?0J%?`J$?`J$?`J$>PJ$>PJ#>PJ#>PF#>@F" M>@F">@F">0F!>0F!>0F!>0F`>`F`>`F`>`E_=PE_=PE_=PE^=@D``.W>$>S= M$>S=$>S=$>O<$>O<$>O<$>K;$>K;$>K;$>G;$>G:$>G:$>C:$>C9$>C9$>?9 M$>?9$>?8$>?8$>;8$>;7$>;7$>77$>76$>76$>36$>36$>35$>/5$>/5$>/4 M$>+4$>+4$>+4$>+3$>'3$>'3$>'2$>#2$>#2$>#1$=_1$-_1$-_1$-[0$-[0 M$-[0$-W/$-W/$-W/$-S.$-S.$-S.$-S.$-O-$-O-$-O-$-K,$-K,$-K,$-G, M$-G+$-G+$-C+$-C*$-C*$-?*$-?)$-?)$-?)$-;)$-;($-;($-7($-7'$-7' M$-3'$-3'$-3&$-/&$-/&$-/%$-+%$-+%#]+$#]'$#]'$#]'$#]'##]###]## M#]#"#\_"#\_"#\_"#\[!#\[!#\[!#\W`#\W`#\W`#\R_#\R_#\R_#\R_#\N^ M#\N^#\N^#\J]#\J]#\J]#\F]#\F\#\F\#\B\#\B[#\B[#\>[#\>Z#\>Z#\:Z M#\:Z#\:Y#\:Y#\6Y#\6X#L6X#L2X#L2X#L2W#L.W#L.W#L.V#L*V#L*V#L*U M#L&U#L&U#L&U#L&T#L"T#L"T#L"S#K^S#K^S#K^S#KZR#KZR#KZR#KVQ#KVQ M#KVQ#KRP#KRP#KRP#KNP#KNO#KNO#KNO#KJN#KJN#KJN#KFN#KFM#KFM#KBM M#KBL#KBL#;>L#;>K#;>K#;:K#;:K#;:J#;:J#;6J#;6I#;6I#;2I#;2I#;2H M#;.H#;.H#;.G#;*G#;*G#;*F#;&F#;&F#;&F#;"E#;"E#;"E#;"D#:^D#:^D M#:^D#:ZC#:ZC#:ZC#:VB#:VB#:VB#:RA#:RA#:RA#:NA#:N@#:N@#:N@#*J? M#*J?#*J?#*F?#*F>#*F>#*B>#*B=#*B=#*>=#*><#*><#*:<#*:<#*:;#*6; M#*6;#*6:#*6:#*2:#*2:#*29#*.9#*.9#*.8#**8#**8#**7#*&7#*&7#*&7 M#*"6#*"6#*"6#*"5#)^5#)^5#)^5#)Z4#)Z4#)Z4#)V3"YV3"YV3"YR2"YR2 M"YR2"YN2"YN1"YN1"YJ1"YJ0"YJ0"YJ0"YF0"YF/"YF/"YB/"YB."YB."Y>. M"Y>-"Y>-"Y:-"Y:-"Y:,"Y6,"Y6,"Y6+"Y6+"Y2+"Y2+"Y2*"Y.*"Y.*"Y.) M"Y*)"Y*)"Y*("Y&("Y&("Y&("Y"'"Y"'"I"'"H^&"H^&"H^&"H^%"HZ%"HZ% M"HZ%"HV$"HV$"HV$"HR#"HR#"HR#"HN#"HN""HN""HJ""HJ!"HJ!"HJ!"HF` M"HF`"HF`"HB`"HA_"HA_"H=_"H=^"H=^"H9^"H9^"H9]"H5]"H5]"H5\"H1\ M"H1\"H1["H1["H-["H-["8-Z"8)Z"8)Z"8)Y"8%Y"8%Y"8%Y"8!X"8!X"8!X M"7]W"7]W"7]W"0``[=X1[=X1[-T1[-T1[-T1Z]P1Z]P1Z]P1ZML1ZML1ZML1 MZ=L1Z=H1Z=H1Z-H1Z-D1Z-D1Z-D1Y]D1Y]@1Y]@1YM@1YM<1YM<1Y=<1Y=81 MY=81Y-81Y-81Y-41X]41X]41X]01X]01XM01XM01XM,1X=,1X=,1X=(1X-(1 MX-(1X-$1W]$1W]$0W]$0WM`0WM`0WM`0W<\0W<\0W<\0W<\0W,X0W,X0W,X0 MV\T0V\T0V\T0VLP0VLP0VLP0V<P0V<L0V<L0V,L0V,H0V,H0V,H0U\H0U\D0 MU\D0ULD0UL@0UL@0U<@0U<<0U<<0U,<0U,<0U,80T\80T\80T\40TL40TL4/ MTL4/TL0/T<0/T<0/T<,/T,,/T,,/T,(/S\(/S\(/S\(/SL$/SL$/SL$/S<`/ MS<`/S<`/S<`/S+\/S+\/S+\/R[X/R[X/R[X/RKT/RKT/RKT/R;T/R;P/R;P/ MR+P/R+L/R+L/Q[L/Q[L/Q[H/Q[H/QKH/QKD/QKD/Q;D/Q;@.Q;@.Q+@.Q+@. MQ+<.P[<.P[<.P[8.PK8.PK8.PK8.PK4.P;4.P;4.P;0.P+0.P+0.P+,.O[,. MO[,.O[,.OK(.OK(.OK(.O;$.O;$.O;$.O+$.O+`.O+`.O+`.NZ\.NZ\.NZ\. MNJX.NJX.NJX.N:X.N:T.N:T.N*T.N*P.N*P-MZP-MZP-MZL-MZL-MJL-MJH- MMJH-M:H-M:D-M:D-M*D-M*D-M*@-LZ@-LZ@-LZ<-LJ<-LJ<-LJ<-L:8-L:8- ML:8-L:4-L*4-L*4-L*0-KZ0-KZ0-KZ0-KJ,-KJ,-KJ,-K:(-K:(-K:(-K*(- MK*$-K*$-K*$-JZ`-JZ`-JZ`,JI\,JI\,JI\,J9\,J9X,J9X,J)X,J)T,J)T, MIYT,IYP,IYP,IIP,IIP,IIL,IIL,I9L,I9H,I9H,I)H,I)H,I)D,HYD,HYD, MHY@,HI@,HI@,HI<,H9<,H9<,H9<,H98,H)8,H)8,H)4,GY4,GY4,GY4,GI0, MGI0,GI0,G9,+G9,+G9,+G)(+G)(+G)(+FY(+FY$+FY$+FY$+FI`+FI`+FI`+ MF9`+F8\+F8\+F(\+F(X+F(X+EXX+EXT+EXT+EHT+EHT+EHP+EHP+E8P+E8L+ ME8L+E(L+E(L+E(H+DXH+DXH+DXD+DHD+DHD+DH@+D8@+D8@+D8@+D(<+D(<* MD(<*D(8*CX8*CX8*CX8*CH4*CH4*CH4*C80*C80*C80*C(,*C(,*C(,*BX,* MBX(*BX(*BX(*BH$*BH$*BH$*B8$*B8`*B8`*B(`*B'\*B'\*AW\*AWX*AWX* MAGX*AGX*AGT*A7T*A7T*A7P*A7P*A'P*A'P*A'L*@WL*@WL)@WH)@GH)@GH) M@GD)@7D)@7D)@7D)@'@)@'@)@'@)@'<)?W<)``#MWA'MWA'MWA'LW1'LW1'L MW1'KW!'KW!'KW!'JW!'JVQ'JVQ'IVQ'IVA'IVA'IVA'HV1'HV1'HV1'GV1'G MV!'GV!'FV!'FUQ'FUQ'EUQ'EUQ'EUA'DUA'DUA'DU1'CU1'CU1'CU!'CU!'B MU!'BU!'BTQ'ATQ'ATQ'ATA'@TA'@TA'@TA'?T1'?T1#?T1#>T!#>T!#>T!#> MSQ#=SQ#=SQ#=SQ#<SA#<SA#<SA#;S1#;S1#;S1#:S1#:S!#:S!#9S!#9RQ#9 MRQ#8RQ#8RA#8RA#8RA#7RA#7R1#7R1#6R1#6R!#6R!#5R!#5R!#5QQ#4QQ#4 MQQ#4QA#3QA#3QA#3Q1#3Q1#2Q1#2Q0_2Q`_1Q`_1Q`_1PP_0PP_0PP_0PP_/ MP@_/P@_/P@_.P0_.P0_.P0_-P`_-P`_-P`_-P`_,OP_,OP_,OP_+O@_+O@_+ MO@_*O@_*O0_*O0_)O0_)O`_)O`_(O`_(NP_(NP_(NP_'NP_'N@_'N@_&N@_& MN0_&N0_%N0_%N0_%N`[$N`[$N`[$MP[#MP[#MP[#M@["M@["M@["M@["M0[! MM0[!M0[!M`[`M`[`M`[`LPZ_LPZ_LPZ_LPZ^L@Z^L@Z^L@Z]L0Z]L0Z]L0Z] ML0Z\L`Z\L`Z\L`Z[KPZ[KPZ[KPZZK@ZZK@ZZK@ZYK@ZYK0ZYK0ZXK0ZXK`ZX MK`VWK`VWK`VWJPVWJPVVJPVVJ@VVJ@VUJ@VUJ0VUJ0VTJ0VTJ0VTJ`VSJ`VS MJ`VSIPVRIPVRIPVRIPVRI@VQI@VQI@VQI0VPI0VPI0VPI`VOI`VOI`VOI`VN MHPVNHPVNHPVMH@VMH@VMH@VLH@VLH0VLH0VLH0VKH`VKH`VKH`RJGPRJGPRJ MGPRIGPRIG@RIG@RHG@RHG0RHG0RGG0RGG0RGG`RGG`RFG`RFFPRFFPREFPRE MF@REF@RDF@RDF@RDF0RCF0RCF0RCF`RBF`RBF`RBF`RAEPRAEPRAEPRAE@R@ ME@R@E@R@E0R?E0R?E0R?E0R>E`R>E`R>E`R=DPN=DPN=DPN<DPN<D@N<D@N< MD@N;D0N;D0N;D0N:D`N:D`N:D`N9D`N9CPN9CPN8CPN8C@N8C@N7C@N7C@N7 MC0N6C0N6C0N6C`N6C`N5C`N5BPN5BPN4BPN4BPN4B@N3B@N3B@N3B0N2B0N2 MB0N2B0N1B`N1B`N1B`N1APN0APJ0APJ0A@J/A@J/A@J/A@J.A0J.A0J.A0J- MA`J-A`J-A`J,A`J,@PJ,@PJ+@PJ+@@J+@@J+@@J*@0J*@0J*@0J)@0J)@`J) M@`J(@`J(?PJ(?PJ'?PJ'?PJ'?@J&?@J&?@J&?0J&?0J%?0J%?`J%?`J$?`J$ M?`J$>PJ#>PJ#>PF#>@F">@F">@F">@F!>0F!>0F!>0F`>`F`>`F`>`F`=PD` M`.W>$>W>$>W>$>W>$>S=$>S=$>S=$>O<$>O<$>O<$>K<$>K;$>K;$>G;$>G: M$>G:$>G:$>C:$>C9$>C9$>?9$>?8$>?8$>;8$>;7$>;7$>77$>77$>76$>36 M$>36$>35$>35$>/5$>/5$>/4$>+4$>+4$>+3$>'3$>'3$>'2$>#2$>#2$>#2 M$=_1$=_1$-_1$-_0$-[0$-[0$-[0$-W/$-W/$-W/$-S.$-S.$-S.$-O-$-O- M$-O-$-K-$-K,$-K,$-G,$-G+$-G+$-G+$-C*$-C*$-C*$-?*$-?)$-?)$-;) M$-;($-;($-7($-7($-7'$-3'$-3'$-3&$-3&$-/&$-/%$-/%$-+%$-+%#]+$ M#]'$#]'$#]'##]###]###]###\_"#\_"#\_"#\[!#\[!#\[!#\[`#\W`#\W` M#\W`#\R_#\R_#\R_#\N^#\N^#\N^#\J^#\J]#\J]#\F]#\F\#\F\#\F\#\B[ M#\B[#\B[#\>[#\>Z#\>Z#\:Z#\:Y#\:Y#\6Y#\6Y#\6X#L2X#L2X#L2W#L.W M#L.W#L.V#L.V#L*V#L*V#L*U#L&U#L&U#L&T#L"T#L"T#L"T#K^S#K^S#K^S M#KZR#KZR#KZR#KZQ#KVQ#KVQ#KVQ#KRP#KRP#KRP#KNO#KNO#KNO#KJO#KJN M#KJN#KFN#KFM#KFM#KBM#KBL#KBL#KBL#;>L#;>K#;>K#;:K#;:J#;:J#;6J M#;6J#;6I#;2I#;2I#;2H#;.H#;.H#;.G#;.G#;*G#;*G#;*F#;&F#;&F#;&E M#;"E#;"E#;"E#:^D#:^D#:^D#:ZC#:ZC#:ZC#:VB#:VB#:VB#:VB#:RA#:RA M#:RA#:N@#:N@#:N@#*J@#*J?#*J?#*F?#*F>#*F>#*B>#*B=#*B=#*B=#*>= M#*><#*><#*:<#*:;#*:;#*6;#*6;#*6:#*2:#*2:#*29#*.9#*.9#*.8#**8 M#**8#**8#**7#*&7#*&7#*&6#*"6#*"6#*"6#)^5#)^5#)^5#)Z4#)Z4#)Z4 M#)V3"YV3"YV3"YV3"YR2"YR2"YR2"YN1"YN1"YN1"YJ1"YJ0"YJ0"YF0"YF/ M"YF/"YB/"YB."YB."Y>."Y>."Y>-"Y>-"Y:-"Y:,"Y:,"Y6,"Y6,"Y6+"Y2+ M"Y2+"Y2*"Y.*"Y.*"Y.)"Y*)"Y*)"Y*)"Y*("Y&("Y&("Y&'"Y"'"I"'"I"' M"H^&"H^&"H^&"HZ%"HZ%"HZ%"HV$"HV$"HV$"HR$"HR#"HR#"HR#"HN""HN" M"HN""HJ!"HJ!"HJ!"HF!"HF`"HF`"HB`"HA_"HA_"H=_"H=_"H=^"H=^"H9^ M"H9]"H9]"H5]"H5\"H5\"H1\"H1\"H1["H-["H-["8-Z"8)Z"8)Z"8)Z"8%Y M"8%Y"8%Y"8%X"8!X"8!X"0``[=X1[=X1[=X1[=X1[=X1[-T1[-T1[-T1Z]P1 MZ]P1Z]P1ZMP1ZML1ZML1ZML1Z=H1Z=H1Z=H1Z-H1Z-D1Z-D1Y]D1Y]@1Y]@1 MYM@1YM<1YM<1Y=<1Y=<1Y=81Y=81Y-81Y-41Y-41X]41X]41X]01XM01XM01 MXM,1X=,1X=,1X=(1X-(1X-(1X-(1W]$1W]$0W]$0W]`0WM`0WM`0WM`0W<\0 MW<\0W<\0W,X0W,X0W,X0V\T0V\T0V\T0VLT0VLP0VLP0VLP0V<L0V<L0V<L0 MV,L0V,H0V,H0U\H0U\D0U\D0ULD0UL@0UL@0U<@0U<@0U<<0U,<0U,<0U,80 MU,80T\80T\80T\40TL40TL4/TL0/T<0/T<0/T<,/T,,/T,,/T,,/S\(/S\(/ MS\(/S\$/SL$/SL$/SL$/S<`/S<`/S<`/S+\/S+\/S+\/R[X/R[X/R[X/RKX/ MRKT/RKT/R;T/R;P/R;P/R;P/R+P/R+L/R+L/Q[L/Q[H/Q[H/QKH/QKD/QKD/ MQ;D/Q;D/Q;@.Q+@.Q+@.Q+<.Q+<.P[<.P[<.P[8.PK8.PK8.PK4.P;4.P;4. MP;0.P+0.P+0.P+0.O[,.O[,.O[,.OK(.OK(.OK(.OK(.O;$.O;$.O;$.O+`. MO+`.O+`.NZ\.NZ\.NZ\.NJ\.NJX.NJX.N:X.N:T.N:T.N:T.N*T.N*P.N*P- MMZP-MZL-MZL-MJL-MJH-MJH-M:H-M:H-M:D-M*D-M*D-M*@-LZ@-LZ@-LZ@- MLZ<-LJ<-LJ<-LJ8-L:8-L:8-L:4-L*4-L*4-L*4-KZ0-KZ0-KZ0-KJ,-KJ,- MKJ,-KJ,-K:(-K:(-K:(-K*$-K*$-K*$-JZ`-JZ`-JZ`-JJ`,JI\,JI\,J9\, MJ9X,J9X,J)X,J)X,J)T,J)T,IYT,IYP,IYP,IIP,IIL,IIL,I9L,I9L,I9H, MI)H,I)H,I)D,HYD,HYD,HY@,HY@,HI@,HI@,HI<,H9<,H9<,H98,H)8,H)8, MH)8,GY4,GY4,GY4,GI0,GI0,GI0,G9,+G9,+G9,+G9,+G)(+G)(+G)(+FY$+ MFY$+FY$+FI$+FI`+FI`+F9`+F8\+F8\+F(\+F(X+F(X+F(X+EXX+EXT+EXT+ MEHT+EHP+EHP+E8P+E8P+E8L+E(L+E(L+E(H+DXH+DXH+DXD+DHD+DHD+DHD+ MDH@+D8@+D8@+D8<+D(<*D(<*D(<*CX8*CX8*CX8*CH4*CH4*CH4*C80*C80* MC80*C80*C(,*C(,*C(,*BX(*BX(*BX(*BH(*BH$*BH$*B8$*B8`*B8`*B(`* MB'\*B'\*AW\*AW\*AWX*AWX*AGX*AGT*AGT*A7T*A7T*A7P*A'P*A'P*A'L* M@WL*@WL)@WH)@GH)@GH)@GH)@GD)@7D)@7D)@7@)@'@)``#MWA'MWA'MWA'M MWA'MWA'MWA'LW1'LW1'LW1'KW1'KW!'KW!'KW!'JVQ'JVQ'JVQ'IVA'IVA'I MVA'HVA'HV1'HV1'GV1'GV!'GV!'FV!'FV!'FUQ'FUQ'EUQ'EUA'EUA'DUA'D MU1'DU1'CU1'CU1'CU!'BU!'BU!'BTQ'ATQ'ATQ'ATQ'@TA'@TA'@TA'@T1'? MT1#?T1#?T!#>T!#>T!#>T!#=SQ#=SQ#=SQ#<SA#<SA#<SA#;SA#;S1#;S1#; MS1#:S!#:S!#:S!#9RQ#9RQ#9RQ#8RQ#8RA#8RA#7RA#7R1#7R1#6R1#6R1#6 MR!#5R!#5R!#5QQ#5QQ#4QQ#4QA#4QA#3QA#3QA#3Q1#2Q1#2Q0_2Q`_1Q`_1 MQ`_1Q`_0PP_0PP_0PP_0P@_/P@_/P@_/P0_.P0_.P0_.P0_-P`_-P`_-P`_, MOP_,OP_,OP_+OP_+O@_+O@_*O@_*O0_*O0_*O0_)O`_)O`_)O`_(O`_(NP_( MNP_'NP_'N@_'N@_&N@_&N@_&N0_%N0_%N0_%N`[%N`[$N`[$MP[$MP[#MP[# MMP[#M@["M@["M@["M0[!M0[!M0[!M0[`M`[`M`[`M`Z_LPZ_LPZ_LPZ_L@Z^ ML@Z^L@Z^L@Z]L0Z]L0Z]L0Z\L`Z\L`Z\L`Z[KPZ[KPZ[KPZZKPZZK@ZZK@ZZ MK@ZYK0ZYK0ZYK0ZXK0ZXK`ZXK`VWK`VWJPVWJPVVJPVVJ@VVJ@VUJ@VUJ@VU MJ0VTJ0VTJ0VTJ`VTJ`VSJ`VSJ`VSIPVRIPVRIPVRI@VQI@VQI@VQI0VPI0VP MI0VPI0VOI`VOI`VOI`VOHPVNHPVNHPVNHPVMH@VMH@VMH@VLH0VLH0VLH0VK MH`VKH`VKH`VJH`RJGPRJGPRIGPRIG@RIG@RIG@RHG@RHG0RHG0RGG0RGG`RG MG`RFG`RFFPRFFPREFPREFPREF@RDF@RDF@RDF0RDF0RCF0RCF0RCF`RBF`RB MF`RBEPRAEPRAEPRAE@R@E@R@E@R@E@R?E0R?E0R?E0R>E`R>E`R>E`R>E`R= MDPN=DPN=DPN<D@N<D@N<D@N;D0N;D0N;D0N:D0N:D`N:D`N9D`N9CPN9CPN9 MCPN8CPN8C@N8C@N7C@N7C0N7C0N6C0N6C`N6C`N5C`N5C`N5BPN4BPN4BPN4 MB@N3B@N3B@N3B@N3B0N2B0N2B0N2B`N1B`N1B`N1APN0APN0APJ0APJ/A@J/ MA@J/A@J.A0J.A0J.A0J.A0J-A`J-A`J-A`J,@PJ,@PJ,@PJ+@@J+@@J+@@J* M@@J*@0J*@0J)@0J)@`J)@`J(@`J(@`J(?PJ(?PJ'?PJ'?@J'?@J&?@J&?0J& M?0J%?0J%?0J%?`J$?`J$?`J$>PJ#>PJ#>PF#>PF#>@F">@F">@F">0F!>0F! M>0F!>`D``.W>$>W>$>W>$>W>$>W>$>W>$>W>$>S=$>S=$>S=$>S=$>O<$>O< M$>O<$>K;$>K;$>K;$>G;$>G:$>G:$>C:$>C9$>C9$>?9$>?8$>?8$>;8$>;8 M$>;7$>;7$>77$>76$>76$>36$>36$>35$>/5$>/5$>/4$>+4$>+4$>+3$>'3 M$>'3$>'3$>'2$>#2$>#2$>#1$=_1$-_1$-_1$-[0$-[0$-[0$-W/$-W/$-W/ M$-S.$-S.$-S.$-O.$-O-$-O-$-O-$-K,$-K,$-K,$-G,$-G+$-G+$-C+$-C* M$-C*$-?*$-?)$-?)$-;)$-;)$-;($-;($-7($-7'$-7'$-3'$-3&$-3&$-/& M$-/&$-/%$-+%$-+%#]+$#]'$#]'$#]'$#]###]###]###]#"#\_"#\_"#\_! M#\[!#\[!#\[!#\W`#\W`#\W`#\R_#\R_#\R_#\N_#\N^#\N^#\N^#\J]#\J] M#\J]#\F\#\F\#\F\#\B\#\B[#\B[#\>[#\>Z#\>Z#\:Z#\:Z#\:Y#\6Y#\6Y M#\6X#L6X#L2X#L2W#L2W#L.W#L.W#L.V#L*V#L*V#L*U#L&U#L&U#L&U#L"T M#L"T#L"T#L"S#K^S#K^S#K^R#KZR#KZR#KZR#KVQ#KVQ#KVQ#KRP#KRP#KRP M#KNP#KNO#KNO#KJO#KJN#KJN#KJN#KFM#KFM#KFM#KBM#KBL#KBL#;>L#;>K M#;>K#;:K#;:K#;:J#;6J#;6J#;6I#;6I#;2I#;2H#;2H#;.H#;.H#;.G#;*G M#;*G#;*F#;&F#;&F#;&F#;"E#;"E#;"E#:^D#:^D#:^D#:^C#:ZC#:ZC#:ZC M#:VB#:VB#:VB#:RA#:RA#:RA#:NA#:N@#:N@#:J@#*J?#*J?#*J?#*F>#*F> M#*F>#*B>#*B=#*B=#*>=#*><#*><#*:<#*:<#*:;#*6;#*6;#*6:#*2:#*2: M#*29#*29#*.9#*.9#*.8#**8#**8#**7#*&7#*&7#*&7#*"6#*"6#*"6#)^5 M#)^5#)^5#)^4#)Z4#)Z4#)Z4#)V3"YV3"YV3"YR2"YR2"YR2"YN2"YN1"YN1 M"YJ1"YJ0"YJ0"YF0"YF/"YF/"YF/"YB/"YB."YB."Y>."Y>-"Y>-"Y:-"Y:- M"Y:,"Y6,"Y6,"Y6+"Y2+"Y2+"Y2*"Y2*"Y.*"Y.*"Y.)"Y*)"Y*)"Y*("Y&( M"Y&("Y&("Y"'"Y"'"I"'"H^&"H^&"H^&"HZ%"HZ%"HZ%"HZ%"HV$"HV$"HV$ M"HR#"HR#"HR#"HN""HN""HN""HJ""HJ!"HJ!"HF!"HF`"HF`"HF`"HB`"HA_ M"HA_"H=_"H=^"H=^"H9^"H9]"H9]"H5]"H5]"H5\"H1\"H1\"H1["H-["H-[ M"H-["8-Z"8)Z"8)Z"8)Y"8%Y"8%Y"0``[=X1[=X1[=X1[=X1[=X1[=X1[=X1 M[=X1[=X1[-T1[-T1[-T1Z]P1Z]P1Z]P1ZML1ZML1ZML1Z=L1Z=H1Z=H1Z-H1 MZ-D1Z-D1Y]D1Y]@1Y]@1Y]@1YM@1YM<1YM<1Y=<1Y=81Y=81Y-81Y-81Y-41 MX]41X]41X]01XM01XM01XM,1XM,1X=,1X=,1X=(1X-(1X-(1X-$1W]$0W]$0 MW]$0WM`0WM`0WM`0W<\0W<\0W<\0W,X0W,X0W,X0W,X0V\T0V\T0V\T0VLP0 MVLP0VLP0V<P0V<L0V<L0V,L0V,H0V,H0U\H0U\D0U\D0U\D0ULD0UL@0UL@0 MU<@0U<<0U<<0U,<0U,<0U,80T\80T\80T\40TL40TL4/TL0/T<0/T<0/T<0/ MT<,/T,,/T,,/T,(/S\(/S\(/S\(/SL$/SL$/SL$/S<`/S<`/S<`/S+\/S+\/ MS+\/S+\/R[X/R[X/R[X/RKT/RKT/RKT/R;T/R;P/R;P/R+P/R+L/R+L/Q[L/ MQ[H/Q[H/QKH/QKH/QKD/QKD/Q;D/Q;@.Q;@.Q+@.Q+@.Q+<.P[<.P[<.P[8. MPK8.PK8.PK4.P;4.P;4.P;4.P;0.P+0.P+0.P+,.O[,.O[,.O[,.OK(.OK(. MOK(.O;$.O;$.O;$.O+`.O+`.O+`.N[`.NZ\.NZ\.NZ\.NJX.NJX.NJX.N:X. MN:T.N:T.N*T.N*P.N*P-MZP-MZL-MZL-MJL-MJL-MJH-MJH-M:H-M:D-M:D- MM*D-M*D-M*@-LZ@-LZ@-LZ<-LJ<-LJ<-LJ8-L:8-L:8-L:8-L*4-L*4-L*4- ML*0-KZ0-KZ0-KZ0-KJ,-KJ,-KJ,-K:(-K:(-K:(-K*$-K*$-K*$-JZ$-JZ`- MJZ`-JZ`,JI\,JI\,JI\,J9\,J9X,J9X,J)X,J)T,J)T,IYT,IYP,IYP,IIP, MIIP,IIL,I9L,I9L,I9H,I9H,I)H,I)H,I)D,HYD,HYD,HY@,HI@,HI@,HI<, MH9<,H9<,H9<,H)8,H)8,H)8,H)4,GY4,GY4,GY0,GI0,GI0,GI0,G9,+G9,+ MG9,+G)(+G)(+G)(+FY(+FY$+FY$+FI$+FI`+FI`+FI`+F8\+F8\+F8\+F(\+ MF(X+F(X+EXX+EXT+EXT+EHT+EHT+EHP+E8P+E8P+E8L+E8L+E(L+E(H+E(H+ MDXH+DXH+DXD+DHD+DHD+DH@+D8@+D8@+D8@+D(<+D(<*D(<*CX8*CX8*CX8* MCX4*CH4*CH4*CH4*C80*C80*C80*C(,*C(,*C(,*BX,*BX(*BX(*BH(*BH$* MBH$*BH$*B8`*B8`*B8`*B(`*B'\*B'\*AW\*AWX*AWX*AGX*AGX*AGT*A7T* MA7T*A7P*A'P*A'P*A'L*A'L*@WL*@WL)@WH)@GH)@GH)@GD)@7D)``#MWA'M MWA'MWA'MWA'MWA'MWA'MWA'MWA'MWA'MWA'LW1'LW1'LW1'KW!'KW!'KW!'J MVQ'JVQ'JVQ'IVQ'IVA'IVA'HVA'HV1'HV1'HV1'GV1'GV!'GV!'FV!'FUQ'F MUQ'EUQ'EUA'EUA'DUA'DUA'DU1'CU1'CU1'CU!'BU!'BU!'BU!'BTQ'ATQ'A MTQ'ATA'@TA'@TA'@T1'?T1'?T1#?T1#>T!#>T!#>T!#=SQ#=SQ#=SQ#=SQ#< MSA#<SA#<SA#;S1#;S1#;S1#:S!#:S!#:S!#9S!#9RQ#9RQ#8RQ#8RA#8RA#7 MRA#7RA#7R1#7R1#6R1#6R!#6R!#5R!#5QQ#5QQ#4QQ#4QQ#4QA#3QA#3QA#3 MQ1#2Q1#2Q0_2Q0_2Q`_1Q`_1Q`_1PP_0PP_0PP_0P@_/P@_/P@_/P@_.P0_. MP0_.P0_-P`_-P`_-P`_,P`_,OP_,OP_,OP_+O@_+O@_+O@_*O0_*O0_*O0_) MO0_)O`_)O`_(O`_(NP_(NP_'NP_'NP_'N@_'N@_&N@_&N0_&N0_%N0_%N`[% MN`[$N`[$N`[$MP[#MP[#MP[#M@["M@["M@["M@[!M0[!M0[!M0[!M`[`M`[` MM`[`LPZ_LPZ_LPZ_LPZ^L@Z^L@Z^L@Z]L0Z]L0Z]L0Z\L0Z\L`Z\L`Z\L`Z[ MKPZ[KPZ[KPZZK@ZZK@ZZK@ZYK@ZYK0ZYK0ZXK0ZXK`ZXK`VWK`VWJPVWJPVV MJPVVJPVVJ@VVJ@VUJ@VUJ0VUJ0VTJ0VTJ0VTJ`VSJ`VSJ`VSIPVRIPVRIPVR MI@VQI@VQI@VQI@VQI0VPI0VPI0VPI`VOI`VOI`VOI`VNHPVNHPVNHPVMH@VM MH@VMH@VLH0VLH0VLH0VKH0VKH`VKH`VKH`RJGPRJGPRJGPRIGPRIG@RIG@RH MG@RHG0RHG0RGG0RGG`RGG`RFG`RFG`RFFPRFFPREFPREF@REF@RDF@RDF@RD MF0RCF0RCF0RCF`RBF`RBF`RBEPRAEPRAEPRAEPR@E@R@E@R@E@R@E0R?E0R? ME0R?E0R>E`R>E`R>E`R=DPN=DPN=DPN<D@N<D@N<D@N;D@N;D0N;D0N;D0N: MD`N:D`N:D`N9D`N9CPN9CPN8CPN8C@N8C@N7C@N7C0N7C0N6C0N6C0N6C`N5 MC`N5C`N5BPN5BPN4BPN4BPN4B@N3B@N3B@N3B0N2B0N2B0N2B`N1B`N1B`N1 MB`N0APN0APJ0APJ0A@J/A@J/A@J/A@J.A0J.A0J.A0J-A`J-A`J-A`J,@PJ, M@PJ,@PJ+@PJ+@@J+@@J*@@J*@0J*@0J*@0J)@0J)@`J)@`J(@`J(?PJ(?PJ' M?PJ'?@J'?@J&?@J&?@J&?0J%?0J%?0J%?`J%?`J$?`J$?`J$>PJ#>PJ#>PF# M>@F">@F">@F">0D``.W>$>W>$>W>$>W>$>W>$>W>$>W>$>W>$>W>$>W>$>W> M$>S=$>S=$>S=$>O<$>O<$>O<$>K<$>K;$>K;$>G;$>G:$>G:$>G:$>C9$>C9 M$>C9$>?9$>?8$>?8$>;8$>;7$>;7$>77$>77$>76$>36$>36$>35$>/5$>/5 M$>/4$>/4$>+4$>+4$>+3$>'3$>'3$>'2$>#2$>#2$>#2$=_1$=_1$-_1$-[0 M$-[0$-[0$-[/$-W/$-W/$-W/$-S.$-S.$-S.$-O-$-O-$-O-$-K-$-K,$-K, M$-G,$-G+$-G+$-C+$-C*$-C*$-C*$-?*$-?)$-?)$-;)$-;($-;($-7($-7( M$-7'$-3'$-3'$-3&$-/&$-/&$-/%$-/%$-+%$-+%#]+$#]'$#]'$#]'##]## M#]###]#"#\_"#\_"#\_"#\[!#\[!#\[!#\W`#\W`#\W`#\W`#\R_#\R_#\R_ M#\N^#\N^#\N^#\J]#\J]#\J]#\F]#\F\#\F\#\B\#\B[#\B[#\B[#\>[#\>Z M#\>Z#\:Z#\:Y#\:Y#\6Y#\6X#L6X#L2X#L2X#L2W#L.W#L.W#L.V#L*V#L*V M#L*V#L*U#L&U#L&U#L&T#L"T#L"T#L"S#K^S#K^S#K^S#KZR#KZR#KZR#KVQ M#KVQ#KVQ#KVQ#KRP#KRP#KRP#KNO#KNO#KNO#KJN#KJN#KJN#KFN#KFM#KFM M#KBM#KBL#KBL#;>L#;>L#;>K#;>K#;:K#;:J#;:J#;6J#;6I#;6I#;2I#;2I M#;2H#;.H#;.H#;.G#;*G#;*G#;*G#;*F#;&F#;&F#;&E#;"E#;"E#;"D#:^D M#:^D#:^D#:ZC#:ZC#:ZC#:VB#:VB#:VB#:RB#:RA#:RA#:RA#:N@#:N@#:N@ M#*J?#*J?#*J?#*F?#*F>#*F>#*B>#*B=#*B=#*>=#*>=#*><#*><#*:<#*:; M#*:;#*6;#*6:#*6:#*2:#*2:#*29#*.9#*.9#*.8#**8#**8#**8#*&7#*&7 M#*&7#*&6#*"6#*"6#*"5#)^5#)^5#)^5#)Z4#)Z4#)Z4#)V3"YV3"YV3"YR3 M"YR2"YR2"YR2"YN1"YN1"YN1"YJ0"YJ0"YJ0"YF0"YF/"YF/"YB/"YB."YB. M"Y>."Y>."Y>-"Y:-"Y:-"Y:,"Y:,"Y6,"Y6+"Y6+"Y2+"Y2+"Y2*"Y.*"Y.* M"Y.)"Y*)"Y*)"Y*)"Y&("Y&("Y&("Y&'"Y"'"I"'"I"&"H^&"H^&"H^&"HZ% M"HZ%"HZ%"HV$"HV$"HV$"HR$"HR#"HR#"HN#"HN""HN""HN""HJ!"HJ!"HJ! M"HF!"HF`"HF`"HB`"HA_"HA_"H=_"H=^"H=^"H9^"H9^"H9]"H9]"H5]"H5\ M"H5\"H1\"H1\"H1["H-["H-["8-Z"8)Z"8)Z"0``[=X1[=X1[=X1[=X1[=X1 M[=X1[=X1[=X1[=X1[=X1[=X1[=X1[-T1[-T1[-T1Z]P1Z]P1Z]P1ZMP1ZML1 MZML1Z=L1Z=H1Z=H1Z=H1Z-D1Z-D1Z-D1Y]D1Y]@1Y]@1YM@1YM<1YM<1Y=<1 MY=<1Y=81Y-81Y-81Y-41Y-41X]41X]01X]01XM01XM01XM,1X=,1X=,1X=(1 MX-(1X-(1X-(1W]$1W]$0W]$0WM`0WM`0WM`0WL\0W<\0W<\0W<\0W,X0W,X0 MW,X0V\T0V\T0V\T0VLT0VLP0VLP0V<P0V<L0V<L0V<L0V,H0V,H0V,H0U\H0 MU\D0U\D0ULD0UL@0UL@0U<@0U<@0U<<0U,<0U,<0U,80T\80T\80T\40T\40 MTL40TL4/TL0/T<0/T<0/T<,/T,,/T,,/T,,/S\(/S\(/S\(/SL$/SL$/SL$/ MSL`/S<`/S<`/S<`/S+\/S+\/S+\/R[X/R[X/R[X/RKX/RKT/RKT/R;T/R;P/ MR;P/R+P/R+L/R+L/R+L/Q[L/Q[H/Q[H/QKH/QKD/QKD/Q;D/Q;D/Q;@.Q+@. MQ+@.Q+<.P[<.P[<.P[8.P[8.PK8.PK8.PK4.P;4.P;4.P;0.P+0.P+0.P+0. MO[,.O[,.O[,.OK(.OK(.OK(.O;$.O;$.O;$.O;$.O+`.O+`.O+`.NZ\.NZ\. MNZ\.NJ\.NJX.NJX.N:X.N:T.N:T.N*T.N*P.N*P.N*P-MZP-MZL-MZL-MJL- MMJH-MJH-M:H-M:H-M:D-M*D-M*D-M*@-LZ@-LZ@-LZ<-LJ<-LJ<-LJ<-LJ8- ML:8-L:8-L:4-L*4-L*4-L*4-KZ0-KZ0-KZ0-KJ,-KJ,-KJ,-K:(-K:(-K:(- MK:(-K*$-K*$-K*$-JZ`-JZ`-JZ`,JJ`,JI\,JI\,J9\,J9X,J9X,J)X,J)T, MJ)T,IYT,IYT,IYP,IYP,IIP,IIL,IIL,I9L,I9L,I9H,I)H,I)H,I)D,HYD, MHYD,HY@,HI@,HI@,HI@,HI<,H9<,H9<,H98,H)8,H)8,H)8,GY4,GY4,GY4, MGI0,GI0,GI0,G9,+G9,+G9,+G),+G)(+G)(+G)(+FY$+FY$+FY$+FI`+FI`+ MFI`+F9`+F8\+F8\+F(\+F(X+F(X+EXX+EXX+EXT+EXT+EHT+EHP+EHP+E8P+ ME8L+E8L+E(L+E(L+E(H+DXH+DXH+DXD+DHD+DHD+DHD+D8@+D8@+D8@+D8<+ MD(<*D(<*D(8*CX8*CX8*CX8*CH4*CH4*CH4*C80*C80*C80*C(0*C(,*C(,* MC(,*BX(*BX(*BX(*BH$*BH$*BH$*B8$*B8`*B8`*B(`*B'\*B'\*AW\*AW\* MAWX*AGX*AGX*AGT*AGT*A7T*A7P*A7P*A'P*A'P*A'L*@WL*@WL)@WH)@GH) M``#MWA'MWA'MWA'MWA'MWA'MWA'MWA'MWA'MWA'MWA'MWA'MWA'MWA'LW1'L MW1'LW1'KW!'KW!'KW!'JW!'JVQ'JVQ'JVQ'IVA'IVA'IVA'HVA'HV1'HV1'G MV1'GV!'GV!'FV!'FUQ'FUQ'EUQ'EUQ'EUA'EUA'DUA'DU1'DU1'CU1'CU1'C MU!'BU!'BU!'BTQ'ATQ'ATQ'ATA'@TA'@TA'@TA'?T1'?T1#?T1#?T!#>T!#> MT!#>T!#=SQ#=SQ#=SQ#<SA#<SA#<SA#;S1#;S1#;S1#:S1#:S!#:S!#:S!#9 MRQ#9RQ#9RQ#8RQ#8RA#8RA#7RA#7R1#7R1#6R1#6R!#6R!#5R!#5R!#5QQ#4 MQQ#4QQ#4QA#4QA#3QA#3QA#3Q1#2Q1#2Q0_2Q`_1Q`_1Q`_1PP_0PP_0PP_0 MPP_/P@_/P@_/P@_/P0_.P0_.P0_.P0_-P`_-P`_-P`_,OP_,OP_,OP_+O@_+ MO@_+O@_*O@_*O0_*O0_)O0_)O`_)O`_)O`_(O`_(NP_(NP_'NP_'N@_'N@_& MN@_&N0_&N0_%N0_%N0_%N`[$N`[$N`[$MP[$MP[#MP[#MP[#M@["M@["M@[" MM0[!M0[!M0[!M`[`M`[`M`[`M`Z_LPZ_LPZ_LPZ^L@Z^L@Z^L@Z^L@Z]L0Z] ML0Z]L0Z\L`Z\L`Z\L`Z[KPZ[KPZ[KPZZKPZZK@ZZK@ZYK@ZYK0ZYK0ZYK0ZX MK0ZXK`ZXK`VWK`VWJPVWJPVVJPVVJ@VVJ@VUJ@VUJ@VUJ0VTJ0VTJ0VTJ`VS MJ`VSJ`VSIPVSIPVRIPVRIPVRI@VQI@VQI@VQI0VPI0VPI0VPI0VOI`VOI`VO MI`VNHPVNHPVNHPVNH@VMH@VMH@VMH@VLH0VLH0VLH0VKH`VKH`VKH`VJH`RJ MGPRJGPRIGPRIG@RIG@RHG@RHG0RHG0RHG0RGG0RGG`RGG`RFG`RFFPRFFPRE MFPREFPREF@RDF@RDF@RDF0RCF0RCF0RCF`RCF`RBF`RBF`RBEPRAEPRAEPRA ME@R@E@R@E@R@E@R?E0R?E0R?E0R>E`R>E`R>E`R=DPN=DPN=DPN=DPN<D@N< MD@N<D@N;D0N;D0N;D0N:D0N:D`N:D`N9D`N9CPN9CPN8CPN8C@N8C@N8C@N7 MC@N7C0N7C0N6C0N6C`N6C`N5C`N5C`N5BPN4BPN4BPN4B@N3B@N3B@N3B0N2 MB0N2B0N2B0N2B`N1B`N1B`N1APN0APJ0APJ0APJ/A@J/A@J/A@J.A0J.A0J. MA0J-A`J-A`J-A`J-A`J,@PJ,@PJ,@PJ+@@J+@@J+@@J*@@J*@0J*@0J)@0J) M@`J)@`J(@`J(?PJ(?PJ'?PJ'?PJ'?@J'?@J&?@J&?0J&?0J%?0J%?0J%?`J$ M?`J$?`J$>PJ#>PJ#>PF#>@D``.W>$>W>$>W>$>W>$>W>$>W>$>W>$>W>$>W> M$>W>$>W>$>W>$>W>$>W>$>S=$>S=$>S=$>O=$>O<$>O<$>O<$>K;$>K;$>K; M$>G:$>G:$>G:$>C:$>C9$>C9$>?9$>?8$>?8$>;8$>;8$>;7$>77$>77$>76 M$>76$>36$>35$>35$>/5$>/5$>/4$>+4$>+4$>+3$>'3$>'3$>'3$>#2$>#2 M$>#2$>#1$=_1$-_1$-_0$-[0$-[0$-[0$-W/$-W/$-W/$-S.$-S.$-S.$-O. M$-O-$-O-$-K-$-K,$-K,$-K,$-G+$-G+$-G+$-C+$-C*$-C*$-?*$-?)$-?) M$-;)$-;)$-;($-7($-7($-7'$-7'$-3'$-3&$-3&$-/&$-/&$-/%$-+%$-+% M#]+$#]'$#]'$#]'$#]###]###]###\_"#\_"#\_"#\_!#\[!#\[!#\[!#\W` M#\W`#\W`#\R_#\R_#\R_#\N^#\N^#\N^#\J^#\J]#\J]#\J]#\F\#\F\#\F\ M#\B\#\B[#\B[#\>[#\>Z#\>Z#\:Z#\:Y#\:Y#\6Y#\6Y#\6X#L2X#L2X#L2W M#L2W#L.W#L.W#L.V#L*V#L*V#L*U#L&U#L&U#L&T#L"T#L"T#L"T#K^S#K^S M#K^S#K^R#KZR#KZR#KZR#KVQ#KVQ#KVQ#KRP#KRP#KRP#KNO#KNO#KNO#KJO M#KJN#KJN#KFN#KFM#KFM#KFM#KBM#KBL#KBL#;>L#;>K#;>K#;:K#;:J#;:J M#;6J#;6J#;6I#;2I#;2I#;2H#;2H#;.H#;.H#;.G#;*G#;*G#;*F#;&F#;&F M#;&E#;"E#;"E#;"E#:^D#:^D#:^D#:ZC#:ZC#:ZC#:ZC#:VB#:VB#:VB#:RA M#:RA#:RA#:N@#:N@#:N@#:J@#*J?#*J?#*F?#*F>#*F>#*F>#*B>#*B=#*B= M#*>=#*><#*><#*:<#*:;#*:;#*6;#*6;#*6:#*2:#*2:#*29#*.9#*.9#*.9 M#*.8#**8#**8#**7#*&7#*&7#*&6#*"6#*"6#*"6#)^5#)^5#)^5#)Z4#)Z4 M#)Z4#)Z4#)V3"YV3"YV3"YR2"YR2"YR2"YN1"YN1"YN1"YJ1"YJ0"YJ0"YF0 M"YF/"YF/"YB/"YB/"YB."YB."Y>."Y>-"Y>-"Y:-"Y:,"Y:,"Y6,"Y6,"Y6+ M"Y2+"Y2+"Y2*"Y.*"Y.*"Y.*"Y.)"Y*)"Y*)"Y*("Y&("Y&("Y&'"Y"'"I"' M"I"'"H^&"H^&"H^&"HZ%"HZ%"HZ%"HV%"HV$"HV$"HV$"HR#"HR#"HR#"HN" M"HN""HN""HJ""HJ!"HJ!"HF!"HF`"HF`"HB`"HB`"HA_"HA_"H=_"H=^"H=^ M"H9^"H9]"H9]"H5]"H5]"H5\"H1\"H1\"H1["H-["H-["0``[=X1[=X1[=X1 M[=X1[=X1[=X1[=X1[=X1[=X1[=X1[=X1[=X1[=X1[=X1[=X1[-T1[-T1[-T1 M[-T1Z]P1Z]P1Z]P1ZML1ZML1ZML1Z=L1Z=H1Z=H1Z-H1Z-D1Z-D1Y]D1Y]@1 MY]@1YM@1YM@1YM<1YM<1Y=<1Y=81Y=81Y-81Y-41Y-41X]41X]41X]01XM01 MXM01XM,1X=,1X=,1X=,1X=(1X-(1X-(1X-$1W]$0W]$0W]`0WM`0WM`0WM`0 MW<\0W<\0W<\0W,X0W,X0W,X0V\X0V\T0V\T0V\T0VLP0VLP0VLP0V<L0V<L0 MV<L0V,L0V,H0V,H0U\H0U\D0U\D0ULD0ULD0UL@0UL@0U<@0U<<0U<<0U,<0 MU,80U,80T\80T\80T\40TL40TL4/TL0/T<0/T<0/T<0/T,,/T,,/T,,/T,(/ MS\(/S\(/S\$/SL$/SL$/SL$/S<`/S<`/S<`/S+\/S+\/S+\/R[\/R[X/R[X/ MR[X/RKT/RKT/RKT/R;P/R;P/R;P/R+P/R+L/R+L/Q[L/Q[H/Q[H/QKH/QKH/ MQKD/Q;D/Q;D/Q;@.Q;@.Q+@.Q+<.Q+<.P[<.P[<.P[8.PK8.PK8.PK4.P;4. MP;4.P;4.P+0.P+0.P+0.P+,.O[,.O[,.O[(.OK(.OK(.OK(.O;$.O;$.O;$. MO+`.O+`.O+`.N[`.NZ\.NZ\.NJ\.NJX.NJX.NJX.N:T.N:T.N:T.N*T.N*P. MN*P-MZP-MZL-MZL-MJL-MJL-MJH-M:H-M:H-M:D-M:D-M*D-M*@-M*@-LZ@- MLZ@-LZ<-LJ<-LJ<-LJ8-L:8-L:8-L:8-L*4-L*4-L*4-KZ0-KZ0-KZ0-KZ,- MKJ,-KJ,-KJ,-K:(-K:(-K:(-K*$-K*$-K*$-JZ$-JZ`-JZ`-JJ`,JI\,JI\, MJI\,J9X,J9X,J9X,J)X,J)T,J)T,IYT,IYP,IYP,IIP,IIP,IIL,I9L,I9L, MI9H,I)H,I)H,I)D,I)D,HYD,HYD,HY@,HI@,HI@,HI<,H9<,H9<,H9<,H)8, MH)8,H)8,GY4,GY4,GY4,GY0,GI0,GI0,GI0,G9,+G9,+G9,+G)(+G)(+G)(+ MFY$+FY$+FY$+FI$+FI`+FI`+F9`+F8\+F8\+F8\+F(\+F(X+F(X+EXX+EXT+ MEXT+EHT+EHP+EHP+E8P+E8P+E8L+E(L+E(L+E(H+E(H+DXH+DXH+DXD+DHD+ MDHD+DH@+D8@+D8@+D8<+D(<+D(<*D(<*CX8*CX8*CX8*CH4*CH4*CH4*CH4* MC80*C80*C80*C(,*C(,*C(,*BX(*BX(*BX(*BH(*BH$*BH$*B8$*B8`*B8`* MB8`*B(`*B'\*B'\*AW\*AWX*AWX*AGX*AGT*AGT*A7T*A7T*A7P*A'P*A'P* MA'L*@WL*``#MWA'MWA'MWA'MWA'MWA'MWA'MWA'MWA'MWA'MWA'MWA'MWA'M MWA'MWA'MWA'MWA'LW1'LW1'LW1'LW1'KW!'KW!'KW!'JVQ'JVQ'JVQ'IVQ'I MVA'IVA'HVA'HV1'HV1'GV1'GV!'GV!'GV!'FV!'FUQ'FUQ'EUQ'EUA'EUA'D MUA'DUA'DU1'CU1'CU1'CU!'BU!'BU!'BTQ'ATQ'ATQ'ATQ'ATA'@TA'@TA'@ MT1'?T1#?T1#?T1#>T!#>T!#>T!#=SQ#=SQ#=SQ#<SA#<SA#<SA#<SA#;S1#; MS1#;S1#:S!#:S!#:S!#9S!#9RQ#9RQ#8RQ#8RA#8RA#7RA#7R1#7R1#6R1#6 MR1#6R!#6R!#5R!#5QQ#5QQ#4QQ#4QQ#4QA#3QA#3QA#3Q1#2Q1#2Q0_2Q`_1 MQ`_1Q`_1Q`_1PP_0PP_0PP_0P@_/P@_/P@_/P@_.P0_.P0_.P0_-P`_-P`_- MP`_,OP_,OP_,OP_+OP_+O@_+O@_+O@_*O0_*O0_*O0_)O0_)O`_)O`_(O`_( MNP_(NP_'NP_'N@_'N@_&N@_&N@_&N0_&N0_%N0_%N`[%N`[$N`[$N`[$MP[# MMP[#MP[#M@["M@["M@["M0[!M0[!M0[!M0[`M`[`M`[`M`[`LPZ_LPZ_LPZ_ MLPZ^L@Z^L@Z^L@Z]L0Z]L0Z]L0Z\L`Z\L`Z\L`Z[L`Z[KPZ[KPZ[KPZZK@ZZ MK@ZZK@ZYK@ZYK0ZYK0ZXK0ZXK`ZXK`VWK`VWJPVWJPVVJPVVJPVVJ@VUJ@VU MJ@VUJ0VUJ0VTJ0VTJ0VTJ`VSJ`VSJ`VSIPVRIPVRIPVRI@VQI@VQI@VQI@VP MI0VPI0VPI0VPI`VOI`VOI`VOHPVNHPVNHPVNHPVMH@VMH@VMH@VLH0VLH0VL MH0VKH0VKH`VKH`VJH`RJGPRJGPRJGPRIG@RIG@RIG@RHG@RHG0RHG0RGG0RG MG`RGG`RFG`RFG`RFFPREFPREFPREF@REF@RDF@RDF0RDF0RCF0RCF0RCF`RB MF`RBF`RBEPRAEPRAEPRAEPR@E@R@E@R@E@R?E0R?E0R?E0R?E`R>E`R>E`R> ME`R=DPN=DPN=DPN<D@N<D@N<D@N;D@N;D0N;D0N:D0N:D`N:D`N:D`N9CPN9 MCPN9CPN8CPN8C@N8C@N7C@N7C0N7C0N6C0N6C0N6C`N5C`N5C`N5BPN4BPN4 MBPN4B@N4B@N3B@N3B@N3B0N2B0N2B0N2B`N1B`N1B`N1B`N0APN0APJ0APJ/ MA@J/A@J/A@J/A0J.A0J.A0J.A0J-A`J-A`J-A`J,@PJ,@PJ,@PJ+@PJ+@@J+ M@@J*@@J*@0J*@0J)@0J)@`J)@`J)@`J(@`J(?PJ(?PJ'?PJ'?@J'?@J&?@J& M?@J&?0J%?0J%?0J%?`J$?`J$?`J$>PH``.W>$>W>$>W>$>W>$>W>$>W>$>W> M$>W>$>W>$>W>$>W>$>W>$>W>$>W>$>W>$>W>$>W>$>W>$>S=$>S=$>S=$>O< M$>O<$>O<$>K;$>K;$>K;$>G;$>G:$>G:$>C:$>C9$>C9$>C9$>?9$>?8$>?8 M$>;8$>;7$>;7$>77$>76$>76$>36$>36$>35$>/5$>/5$>/4$>+4$>+4$>+4 M$>+3$>'3$>'3$>'2$>#2$>#2$>#1$=_1$-_1$-_1$-[0$-[0$-[0$-W/$-W/ M$-W/$-W/$-S.$-S.$-S.$-O-$-O-$-O-$-K,$-K,$-K,$-G,$-G+$-G+$-C+ M$-C*$-C*$-?*$-?*$-?)$-?)$-;)$-;($-;($-7($-7'$-7'$-3'$-3'$-3& M$-/&$-/&$-/%$-+%$-+%#]+%#]+$#]'$#]'$#]'##]###]###]#"#\_"#\_" M#\_"#\[!#\[!#\[!#\W`#\W`#\W`#\S`#\R_#\R_#\R_#\N^#\N^#\N^#\J] M#\J]#\J]#\F]#\F\#\F\#\B\#\B[#\B[#\>[#\>Z#\>Z#\>Z#\:Z#\:Y#\:Y M#\6Y#\6X#L6X#L2X#L2X#L2W#L.W#L.W#L.V#L*V#L*V#L*U#L&U#L&U#L&U M#L&T#L"T#L"T#L"S#K^S#K^S#K^S#KZR#KZR#KZR#KVQ#KVQ#KVQ#KRP#KRP M#KRP#KRP#KNO#KNO#KNO#KJN#KJN#KJN#KFN#KFM#KFM#KBM#KBL#KBL#;>L M#;>K#;>K#;:K#;:K#;:J#;:J#;6J#;6I#;6I#;2I#;2I#;2H#;.H#;.H#;.G M#;*G#;*G#;*F#;&F#;&F#;&F#;&E#;"E#;"E#;"D#:^D#:^D#:^D#:ZC#:ZC M#:ZC#:VB#:VB#:VB#:RA#:RA#:RA#:NA#:N@#:N@#:N@#*J?#*J?#*J?#*F? M#*F>#*F>#*B>#*B=#*B=#*>=#*><#*><#*:<#*:<#*:;#*:;#*6;#*6:#*6: M#*2:#*2:#*29#*.9#*.9#*.8#**8#**8#**7#*&7#*&7#*&7#*"6#*"6#*"6 M#*"5#)^5#)^5#)^5#)Z4#)Z4#)Z4#)V3"YV3"YV3"YR2"YR2"YR2"YN2"YN1 M"YN1"YN1"YJ0"YJ0"YJ0"YF0"YF/"YF/"YB/"YB."YB."Y>."Y>-"Y>-"Y:- M"Y:-"Y:,"Y6,"Y6,"Y6+"Y6+"Y2+"Y2+"Y2*"Y.*"Y.*"Y.)"Y*)"Y*)"Y*( M"Y&("Y&("Y&("Y"'"Y"'"I"'"I"&"H^&"H^&"H^&"HZ%"HZ%"HZ%"HV$"HV$ M"HV$"HR#"HR#"HR#"HN#"HN""HN""HJ""HJ!"HJ!"HJ!"HF!"HF`"HF`"HB` M"HA_"HA_"H=_"H=^"H=^"H9^"H9^"H9]"H5]"H5]"H5\"H5\"H1\"@``[=X1 M[=X1[=X1[=X1[=X1[=X1[=X1[=X1[=X1[=X1[=X1[=X1[=X1[=X1[=X1[=X1 M[=X1[=X1[=X1[-T1[-T1[-T1Z]P1Z]P1Z]P1ZMP1ZML1ZML1Z=L1Z=H1Z=H1 MZ-H1Z-D1Z-D1Z-D1Y]D1Y]@1Y]@1YM@1YM<1YM<1Y=<1Y=<1Y=81Y-81Y-81 MY-41X]41X]41X]01X]01XM01XM01XM,1X=,1X=,1X=(1X-(1X-(1X-$1W]$1 MW]$0W]$0WM`0WM`0WM`0W<\0W<\0W<\0W<\0W,X0W,X0W,X0V\T0V\T0V\T0 MVLP0VLP0VLP0V<P0V<L0V<L0V,L0V,H0V,H0V,H0U\H0U\D0U\D0ULD0UL@0 MUL@0U<@0U<<0U<<0U,<0U,<0U,80T\80T\80T\40TL40TL40TL4/TL0/T<0/ MT<0/T<,/T,,/T,,/T,(/S\(/S\(/S\(/SL$/SL$/SL$/S<`/S<`/S<`/S<`/ MS+\/S+\/S+\/R[X/R[X/R[X/RKT/RKT/RKT/R;T/R;P/R;P/R+P/R+L/R+L/ MQ[L/Q[L/Q[H/Q[H/QKH/QKD/QKD/Q;D/Q;@.Q;@.Q+@.Q+@.Q+<.P[<.P[<. MP[8.PK8.PK8.PK8.PK4.P;4.P;4.P;0.P+0.P+0.P+,.O[,.O[,.O[,.OK(. MOK(.OK(.O;$.O;$.O;$.O+$.O+`.O+`.O+`.NZ\.NZ\.NZ\.NJX.NJX.NJX. MN:X.N:T.N:T.N*T.N*P.N*P-MZP-MZP-MZL-MZL-MJL-MJH-MJH-M:H-M:D- MM:D-M*D-M*D-M*@-LZ@-LZ@-LZ<-LJ<-LJ<-LJ<-L:8-L:8-L:8-L:4-L*4- ML*4-L*0-KZ0-KZ0-KZ0-KJ,-KJ,-KJ,-K:(-K:(-K:(-K*(-K*$-K*$-K*$- MJZ`-JZ`-JZ`,JI\,JI\,JI\,J9\,J9X,J9X,J)X,J)T,J)T,IYT,IYT,IYP, MIIP,IIP,IIL,IIL,I9L,I9H,I9H,I)H,I)H,I)D,HYD,HYD,HY@,HI@,HI@, MHI@,H9<,H9<,H9<,H98,H)8,H)8,H)4,GY4,GY4,GY4,GI0,GI0,GI0,G9,+ MG9,+G9,+G),+G)(+G)(+FY(+FY$+FY$+FY$+FI`+FI`+FI`+F9`+F8\+F8\+ MF(\+F(X+F(X+EXX+EXT+EXT+EHT+EHT+EHP+EHP+E8P+E8L+E8L+E(L+E(L+ ME(H+DXH+DXH+DXD+DHD+DHD+DH@+D8@+D8@+D8@+D(<+D(<*D(<*D(8*CX8* MCX8*CX8*CH4*CH4*CH4*C80*C80*C80*C(,*C(,*C(,*BX,*BX(*BX(*BX(* MBH$*BH$*BH$*B8$*B8`*B8`*B(`*B'\*B'\*AW\*AWX*AWX*AGX*AGX*AGT* .A7T*A7T*A7P*A7P*```` ` end �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/win32/mhmap.h�����������������������������������������������������������������0000664�0000764�0000764�00000001023�10545462317�014662� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (C) 2001 by Alex Kompel <shurikk@pacbell.net> */ /* 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 #define DEF_CLIPAROUND_AMOUNT 1 #endif /* MSWINMapWindow_h */ �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/win32/makedefs.dsp������������������������������������������������������������0000664�0000764�0000764�00000016042�10545462317�015705� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# 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 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/win32/mhfont.c����������������������������������������������������������������0000664�0000764�0000764�00000017310�10545462317�015054� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (C) 2001 by Alex Kompel <shurikk@pacbell.net> */ /* 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; #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) ); #if 0 lgfnt.lfHeight = -80; // height of font #else lgfnt.lfHeight = -40; // height of font #endif 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 = ANSI_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); ReleaseDC(hWnd, hdc); } void mswin_destroy_splashfonts() { DeleteObject (version_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<font_table_size; font_index++) if(NHFONT_CODE(win_type, attr)==font_table[font_index].code) break; if( !replace && font_index<font_table_size ) return font_table[font_index].hFont; switch(win_type) { case NHW_STATUS: lgfnt.lfHeight = -iflags.wc_fontsiz_status*GetDeviceCaps(hdc, LOGPIXELSY)/72; // height of font lgfnt.lfWidth = 0; // average character width lgfnt.lfEscapement = 0; // angle of escapement lgfnt.lfOrientation = 0; // base-line orientation angle lgfnt.lfWeight = FW_BOLD; // font weight lgfnt.lfItalic = FALSE; // italic attribute option lgfnt.lfUnderline = FALSE; // underline attribute option lgfnt.lfStrikeOut = FALSE; // strikeout attribute option lgfnt.lfCharSet = mswin_charset(); // character set identifier lgfnt.lfOutPrecision = OUT_DEFAULT_PRECIS; // output precision lgfnt.lfClipPrecision = CLIP_DEFAULT_PRECIS; // clipping precision lgfnt.lfQuality = DEFAULT_QUALITY; // output quality if( iflags.wc_font_status && *iflags.wc_font_status ) { lgfnt.lfPitchAndFamily = DEFAULT_PITCH; // pitch and family NH_A2W( iflags.wc_font_status, lgfnt.lfFaceName, LF_FACESIZE); } else { lgfnt.lfPitchAndFamily = FIXED_PITCH; // pitch and family } break; case NHW_MENU: lgfnt.lfHeight = -iflags.wc_fontsiz_menu*GetDeviceCaps(hdc, LOGPIXELSY)/72; // height of font lgfnt.lfWidth = 0; // average character width lgfnt.lfEscapement = 0; // angle of escapement lgfnt.lfOrientation = 0; // base-line orientation angle lgfnt.lfWeight = (attr==ATR_BOLD || attr==ATR_INVERSE)? FW_BOLD : FW_NORMAL; // font weight lgfnt.lfItalic = (attr==ATR_BLINK)? TRUE: FALSE; // italic attribute option lgfnt.lfUnderline = (attr==ATR_ULINE)? TRUE : FALSE; // underline attribute option lgfnt.lfStrikeOut = FALSE; // strikeout attribute option lgfnt.lfCharSet = mswin_charset(); // character set identifier lgfnt.lfOutPrecision = OUT_DEFAULT_PRECIS; // output precision lgfnt.lfClipPrecision = CLIP_DEFAULT_PRECIS; // clipping precision lgfnt.lfQuality = DEFAULT_QUALITY; // output quality if( iflags.wc_font_menu && *iflags.wc_font_menu ) { lgfnt.lfPitchAndFamily = DEFAULT_PITCH; // pitch and family NH_A2W( iflags.wc_font_menu, lgfnt.lfFaceName, LF_FACESIZE); } else { lgfnt.lfPitchAndFamily = FIXED_PITCH; // pitch and family } break; case NHW_MESSAGE: font_size = (attr==ATR_INVERSE)? iflags.wc_fontsiz_message+1 : iflags.wc_fontsiz_message; lgfnt.lfHeight = -font_size*GetDeviceCaps(hdc, LOGPIXELSY)/72; // height of font lgfnt.lfWidth = 0; // average character width lgfnt.lfEscapement = 0; // angle of escapement lgfnt.lfOrientation = 0; // base-line orientation angle lgfnt.lfWeight = (attr==ATR_BOLD || attr==ATR_INVERSE)? FW_BOLD : FW_NORMAL; // font weight lgfnt.lfItalic = (attr==ATR_BLINK)? TRUE: FALSE; // italic attribute option lgfnt.lfUnderline = (attr==ATR_ULINE)? TRUE : FALSE; // underline attribute option lgfnt.lfStrikeOut = FALSE; // strikeout attribute option lgfnt.lfCharSet = mswin_charset(); // character set identifier lgfnt.lfOutPrecision = OUT_DEFAULT_PRECIS; // output precision lgfnt.lfClipPrecision = CLIP_DEFAULT_PRECIS; // clipping precision lgfnt.lfQuality = DEFAULT_QUALITY; // output quality if( iflags.wc_font_message && *iflags.wc_font_message ) { lgfnt.lfPitchAndFamily = DEFAULT_PITCH; // pitch and family NH_A2W( iflags.wc_font_message, lgfnt.lfFaceName, LF_FACESIZE); } else { lgfnt.lfPitchAndFamily = VARIABLE_PITCH; // pitch and family } break; case NHW_TEXT: lgfnt.lfHeight = -iflags.wc_fontsiz_text*GetDeviceCaps(hdc, LOGPIXELSY)/72; // height of font lgfnt.lfWidth = 0; // average character width lgfnt.lfEscapement = 0; // angle of escapement lgfnt.lfOrientation = 0; // base-line orientation angle lgfnt.lfWeight = (attr==ATR_BOLD || attr==ATR_INVERSE)? FW_BOLD : FW_NORMAL; // font weight lgfnt.lfItalic = (attr==ATR_BLINK)? TRUE: FALSE; // italic attribute option lgfnt.lfUnderline = (attr==ATR_ULINE)? TRUE : FALSE; // underline attribute option lgfnt.lfStrikeOut = FALSE; // strikeout attribute option lgfnt.lfCharSet = mswin_charset(); // character set identifier lgfnt.lfOutPrecision = OUT_DEFAULT_PRECIS; // output precision lgfnt.lfClipPrecision = CLIP_DEFAULT_PRECIS; // clipping precision lgfnt.lfQuality = DEFAULT_QUALITY; // output quality if( iflags.wc_font_text && *iflags.wc_font_text ) { lgfnt.lfPitchAndFamily = DEFAULT_PITCH; // pitch and family NH_A2W( iflags.wc_font_text, lgfnt.lfFaceName, LF_FACESIZE); } else { lgfnt.lfPitchAndFamily = FIXED_PITCH; // pitch and family } break; } fnt = CreateFontIndirect(&lgfnt); /* add font to the table */ if( font_index==font_table_size ) { if( font_table_size>=MAXFONTS ) panic( "font table overflow!" ); font_table_size++; } else { DeleteObject(font_table[font_index].hFont); } font_table[font_index].code = NHFONT_CODE(win_type, attr); font_table[font_index].hFont = fnt; return fnt; } UINT mswin_charset() { CHARSETINFO cis; if( iflags.IBMgraphics ) if( TranslateCharsetInfo((DWORD*)GetOEMCP(), &cis, TCI_SRCCODEPAGE) ) return cis.ciCharset; else return OEM_CHARSET; else if( TranslateCharsetInfo((DWORD*)GetACP(), &cis, TCI_SRCCODEPAGE) ) return cis.ciCharset; else return ANSI_CHARSET; } void __cdecl font_table_cleanup(void) { int i; for(i=0; i<font_table_size; i++) { DeleteObject(font_table[i].hFont); } font_table_size = 0; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/win32/nethack.dsw�������������������������������������������������������������0000664�0000764�0000764�00000011270�10545462317�015550� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Microsoft Developer Studio Workspace File, Format Version 6.00 # WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! ############################################################################### 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 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: "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: "magtile"=.\build\magtile.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "makedefs"=.\build\makedefs.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### 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 Begin Project Dependency Project_Dep_Name magtile End Project Dependency Begin Project Dependency Project_Dep_Name txtbg End Project Dependency Begin Project Dependency Project_Dep_Name txtmerge End Project Dependency }}} ############################################################################### Project: "txtbg"=.\build\txtbg.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "txtmerge"=.\build\txtmerge.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "uudecode"=.\build\uudecode.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/win32/win32msg.c��������������������������������������������������������������0000664�0000764�0000764�00000032324�10545462317�015234� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* SCCS Id: @(#)win32msg.c 3.2 95/09/06 */ /* Copyright (c) NetHack MS Windows Porting Team 1993, 1994 */ /* NetHack may be freely redistributed. See license for details. */ /* * The routines in this file build on the initial MS Windows NetHack * groundwork done by Bill Dyer. * * This file contains all of the Win32 Window Procedures. */ #include "hack.h" #ifdef WIN32_GRAPHICS # ifndef NO_SIGNAL #include <signal.h> # endif #include <ctype.h> #include <sys\stat.h> #include "win32api.h" #include "nhwin32.h" #ifdef DEBUG_FULL static char debugbuf[256]; #endif LONG WINAPI BaseWndProc(HWND hWnd,UINT messg,UINT wParam,LONG lParam) { HDC hdc; static int xClientView,yClientView; static HWND hInst; static FARPROC fpfnAboutDiaProc; static RECT rcWindow; RECT rect; unsigned char ch; switch (messg) { case WM_CREATE: hdc = GetDC(hWnd); SelectObject(hdc,hDefFnt); GetTextMetrics(hdc, &tm); ReleaseDC(hWnd,hdc); DefCharWidth = tm.tmAveCharWidth; DefCharHeight = tm.tmHeight; BaseUnits = DefCharHeight; GetClientRect(hWnd, &rect); rect.top += GetSystemMetrics(SM_CYMENU) + (GetSystemMetrics(SM_CYFRAME) * 2) + GetSystemMetrics(SM_CYSIZE); rect.left += GetSystemMetrics(SM_CXFRAME) * 2; rect.right = rect.left + (COLNO * DefCharWidth); rect.bottom = rect.top + ((5 + ROWNO + 2) * BaseUnits); (void) AdjustWindowRect(&rect,WS_OVERLAPPEDWINDOW, TRUE); BaseWidth = rect.right - rect.left + 1; BaseHeight = rect.bottom - rect.top + 1; MoveWindow(hWnd, rect.left, rect.top, BaseWidth, BaseHeight, TRUE); GetClientRect(hWnd, &rcClient); MessageHeight = BaseUnits * 5; MessageWidth = BaseWidth - GetSystemMetrics(SM_CXVSCROLL); MessageX = rcClient.left; MessageY = rcClient.top; MapHeight = BaseUnits * ROWNO; MapWidth = BaseWidth; MapX = rcClient.left; MapY = rcClient.top + MessageHeight; StatusHeight = BaseUnits * 2; StatusWidth = BaseWidth; StatusX = rcClient.left; StatusY = rcClient.top + MessageHeight + MapHeight; break; case WM_SIZE: GetClientRect(hWnd, &rcClient); EnumChildWindows(hWnd, EnumChildProc,(LPARAM)&rcClient); return 0; break; case WM_CHAR: switch(wParam) { default: ch = (unsigned char) wParam; if (pchPut >= pchBuf + (RINGBUFSIZE - 1)) { pchPut = pchBuf; /* wrap it */ } *pchPut++ = ch; ++pchCount; } #ifdef DEBUG_FULL sprintf(debugbuf,"Message = %X, wParam = %d, pchCount = %d", messg, wParam, pchCount); DEBUG_MSG(debugbuf); #endif break; case WM_DESTROY: PostQuitMessage(0); exit(EXIT_SUCCESS); break; default: return(DefWindowProc(hWnd,messg,wParam,lParam)); } return(0L); } LONG WINAPI TextWndProc(HWND hWnd,UINT messg,UINT wParam,LONG lParam) { int idChild; HDC hdc; #if 0 char buf[BUFSZ]; #endif PAINTSTRUCT ps; static int xClientView,yClientView; static HWND hInst; static FARPROC fpfnAboutDiaProc; int row,col; int srow, scol; int colcount, rowcount; int offset; uchar ch; uchar *pch; int color; int *pcolor; /* RECT rect; */ char tch[2]="X"; idChild = GetWindowLong(hWnd, GWL_ID); switch (messg) { case WM_CREATE: wins[idChild]->dwCharX = DefCharWidth; wins[idChild]->dwCharY = DefCharHeight; return 0; #if 0 case WM_SIZE: break; #endif case WM_PAINT: HideCaret(hWnd); hdc=BeginPaint(hWnd,&ps); SelectObject(hdc,wins[idChild]->hFnt); scol = ps.rcPaint.left / DefCharWidth; srow = ps.rcPaint.top / DefCharHeight; rowcount = ((ps.rcPaint.bottom / DefCharHeight) - srow) + 1; colcount = ((ps.rcPaint.right / DefCharWidth) - scol) + 1; switch(wins[idChild]->type) { case NHW_MESSAGE: col = ps.rcPaint.left / wins[NHW_MESSAGE]->dwCharX; offset = (srow * wins[NHW_MESSAGE]->maxcols) + col; SelectObject(hdc,wins[NHW_MESSAGE]->hFnt); SetBkColor(hdc,wins[NHW_MESSAGE]->BackGroundColor); for (row = srow; row <= srow + rowcount; ++row) { offset = (row * wins[NHW_MESSAGE]->maxcols + col); pcolor = wins[NHW_MESSAGE]->color + offset; pch = wins[NHW_MESSAGE]->data + offset; color = *pcolor; SetTextColor(hdc,color); TextOut(hdc, ps.rcPaint.left, (row * wins[NHW_MESSAGE]->dwCharY), pch, colcount); } break; case NHW_TEXT: SelectObject(hdc,wins[idChild]->hFnt); SetBkColor(hdc,wins[idChild]->BackGroundColor); colcount = wins[idChild]->widest; for (row = srow; row <= srow + rowcount; ++row) { for (col = scol; col <= scol + colcount; ++col) { offset = (row * wins[idChild]->maxcols) + col; pch = wins[idChild]->data + offset; pcolor = wins[idChild]->color + offset; ch = *pch; color = *pcolor; SetTextColor(hdc,color); TextOut(hdc, (col * wins[idChild]->dwCharX), (row * wins[idChild]->dwCharY), &ch, 1); } } break; default: SelectObject(hdc,wins[idChild]->hFnt); SetBkColor(hdc,wins[idChild]->BackGroundColor); colcount = wins[idChild]->maxcols; for (row = srow; row <= srow + rowcount; ++row) { for (col = scol; col <= scol + colcount; ++col) { offset = (row * wins[idChild]->maxcols) + col; pch = wins[idChild]->data + offset; pcolor = wins[idChild]->color + offset; ch = *pch; color = *pcolor; SetTextColor(hdc,color); TextOut(hdc, (col * wins[idChild]->dwCharX), (row * wins[idChild]->dwCharY), &ch, 1); } } } EndPaint(hWnd,&ps); ShowCaret(hWnd); break; case WM_SETFOCUS: if (idChild == WIN_MAP) { CreateCaret(hWnd,(HBITMAP)1,0,0); SetCaretPos(wins[idChild]->nCaretPosX, wins[idChild]->nCaretPosY * wins[idChild]->dwCharY); ShowCaret(hWnd); } else { SetFocus(wins[WIN_MAP]->hWnd); } break; case WM_KILLFOCUS: if (idChild == WIN_MAP) { HideCaret(hWnd); DestroyCaret(); } break; case WM_CHAR: switch(wParam) { default: ch = (unsigned char) wParam; if (pchPut >= pchBuf + (RINGBUFSIZE - 1)) { pchPut = pchBuf; /* wrap it */ } *pchPut++ = ch; ++pchCount; } #ifdef DEBUG_FULL sprintf(debugbuf,"Message = %X, wParam = %d, pchCount = %d", messg, wParam, pchCount); DEBUG_MSG(debugbuf); #endif break; case WM_DESTROY: PostQuitMessage(0); break; case WM_VSCROLL: switch(wParam) { case SB_LINEUP: break; } break; case WM_HSCROLL: default: return(DefWindowProc(hWnd,messg,wParam,lParam)); } return(0L); } LONG WINAPI PopupWndProc(HWND hWnd,UINT messg,UINT wParam,LONG lParam) { int idPopup; HDC hdc; PAINTSTRUCT ps; static int xClientView,yClientView; static HWND hInst; static FARPROC fpfnAboutDiaProc; idPopup = GetWindowLong(hWnd, GWL_ID); switch (messg) { case WM_CREATE: hdc =GetDC(hWnd); GetTextMetrics(hdc, &tm); ReleaseDC(hWnd,hdc); wins[idPopup]->dwCharX = tm.tmAveCharWidth; wins[idPopup]->dwCharY = tm.tmHeight; return 0; case WM_PAINT: hdc=BeginPaint(hWnd,&ps); ValidateRect(hWnd,0); EndPaint(hWnd,&ps); break; case WM_DESTROY: PostQuitMessage(0); break; case WM_VSCROLL: case WM_HSCROLL: default: return(DefWindowProc(hWnd,messg,wParam,lParam)); } return(0L); } LONG WINAPI ListboxWndProc(HWND hWnd,UINT messg,UINT wParam,LONG lParam) { int idListbox; HDC hdc; static int xClientView,yClientView; static HWND hInst; idListbox = GetWindowLong(hWnd, GWL_ID); switch (messg) { case WM_CREATE: hdc =GetDC(hWnd); GetTextMetrics(hdc, &tm); ReleaseDC(hWnd,hdc); return 0; case WM_SETFOCUS: #if 0 CreateCaret(hWnd,(HBITMAP)1,0,0); SetCaretPos(wins[idListbox]->nCaretPosX, wins[idListbox]->nCaretPosY * wins[idListbox]->dwCharY); ShowCaret(hWnd); break; #endif #if 0 case WM_KILLFOCUS: HideCaret(hWnd); DestroyCaret(); break; #endif case WM_DESTROY: PostQuitMessage(0); break; case WM_COMMAND: switch (HIWORD(wParam)) { case LBN_DBLCLK: DEBUG_MSG("Got LBN_DBLCLK"); return(DefWindowProc(hWnd,messg,wParam,lParam)); break; case LBN_KILLFOCUS: DEBUG_MSG("Got LBN_KILLFOCUS"); return(DefWindowProc(hWnd,messg,wParam,lParam)); break; case LBN_SELCANCEL: DEBUG_MSG("Got LBN_SELCANCEL"); return(DefWindowProc(hWnd,messg,wParam,lParam)); break; case LBN_SELCHANGE: DEBUG_MSG("Got LBN_SELCHANGE"); return(DefWindowProc(hWnd,messg,wParam,lParam)); break; case LBN_SETFOCUS: DEBUG_MSG("Got LBN_SETFOCUS"); return(DefWindowProc(hWnd,messg,wParam,lParam)); break; case WM_VKEYTOITEM: DEBUG_MSG("Got LBN_VKEYTOITEM"); return(DefWindowProc(hWnd,messg,wParam,lParam)); break; default: return(DefWindowProc(hWnd,messg,wParam,lParam)); } break; case WM_VSCROLL: case WM_HSCROLL: default: return(DefWindowProc(hWnd,messg,wParam,lParam)); } return(0L); } LRESULT CALLBACK MenuDialogProc(HWND hdlg,UINT messg,UINT wParam,LONG lParam) { switch(messg) { case WM_INITDIALOG: break; case WM_COMMAND: switch(LOWORD(wParam)) { case IDOK: EndDialog(hdlg,0); break; default: return FALSE; } break; default: return FALSE; } return TRUE; } BOOL WINAPI AskNameProc(HWND hDlg, UINT messg, UINT wParam, LONG lParam) { char buf[BUFSZ]; HWND hEditBox; WPARAM maxsize; switch(messg) { case WM_INITDIALOG: SendMessage(hDlg, DM_SETDEFID, (WPARAM)IDD_NAME, (LPARAM)0); maxsize = (WPARAM)((sizeof plname) - 1); hEditBox = GetDlgItem(hDlg, IDD_NAME); SendMessage(hEditBox, EM_LIMITTEXT, maxsize, (LPARAM)0); return TRUE; case WM_COMMAND: switch(LOWORD(wParam)) { case IDOK: /* Get number of characters */ input_text_size = (int)SendDlgItemMessage( hDlg, IDD_NAME, EM_LINELENGTH, (WPARAM)0, (LPARAM)0); Sprintf(buf, "input_text_size = %d", input_text_size); /* Get the characters */ if (input_text_size != 0) { *((LPWORD)input_text) = input_text_size; SendDlgItemMessage(hDlg, IDD_NAME, EM_GETLINE, (WPARAM)0, (LPARAM)(LPCSTR)input_text); } EndDialog(hDlg, TRUE); return TRUE; case IDCANCEL: EndDialog(hDlg, 0); return TRUE; } return 0; } return FALSE; } static int nCurrentChar; BOOL WINAPI PlayerSelectProc(HWND hDlg, UINT messg, UINT wParam, LONG lParam) { int i; switch (messg) { case WM_INITDIALOG: CheckRadioButton(hDlg,IDD_ARCH,IDD_RAND,IDD_RAND); nCurrentChar = IDD_RAND; return TRUE; case WM_COMMAND: switch (wParam) { case IDOK: if (nCurrentChar == IDD_RAND) { i = rn2((int)strlen(pl_classes)); pl_character[0] = pl_classes[i]; } else { pl_character[0] = pl_classes[nCurrentChar-IDD_ARCH]; } EndDialog(hDlg,TRUE); return TRUE; break; case IDCANCEL: pl_character[0] = 0; EndDialog(hDlg,FALSE); return TRUE; break; case IDD_ARCH: case IDD_BARB: case IDD_CAVEMAN: case IDD_ELF: case IDD_HEAL: case IDD_KNIGHT: case IDD_PRIEST: case IDD_ROGUE: case IDD_SAM: case IDD_TOUR: case IDD_VAL: case IDD_WIZ: case IDD_RAND: nCurrentChar = wParam; CheckRadioButton(hDlg,IDD_ARCH, IDD_RAND,wParam); return TRUE; break; } } return FALSE; } BOOL WINAPI CopyrightProc(HWND hDlg, UINT messg, UINT wParam, LONG lParam) { switch (messg) { case WM_COMMAND: switch (wParam) { case IDOK: EndDialog(hDlg,TRUE); return TRUE; break; } break; default: return FALSE; } return FALSE; } BOOL CALLBACK EnumChildProc(hwndChild, lParam) HWND hwndChild; LPARAM lParam; { LPRECT rcParent; int idChild; idChild = GetWindowLong(hwndChild, GWL_ID); rcParent = (LPRECT) lParam; switch(idChild) { case NHW_MESSAGE: MoveWindow(hwndChild, MessageX, MessageY, MessageWidth, MessageHeight, TRUE); wins[NHW_MESSAGE]->WindowWidth = MessageWidth; wins[NHW_MESSAGE]->WindowHeight = MessageHeight; wins[NHW_MESSAGE]->nWindowX = MessageX; wins[NHW_MESSAGE]->nWindowY = MessageY; break; case NHW_MAP: MoveWindow(hwndChild, MapX, MapY, MapWidth, MapHeight, TRUE); wins[NHW_MAP]->WindowWidth = MapWidth; wins[NHW_MAP]->WindowHeight = MapHeight; wins[NHW_MAP]->nWindowX = MapX; wins[NHW_MAP]->nWindowY = MapY; break; case NHW_STATUS: MoveWindow(hwndChild, 0, StatusY, StatusWidth, StatusHeight, TRUE); wins[NHW_STATUS]->WindowWidth = StatusWidth; wins[NHW_STATUS]->WindowHeight = StatusHeight; wins[NHW_STATUS]->nWindowX = 0; wins[NHW_STATUS]->nWindowY = StatusY; break; } ShowWindow(hwndChild, SW_SHOW); return TRUE; } BOOL WINAPI AboutDiaProc(HWND hdlg,UINT messg,UINT wParam,LONG lParam) { switch(messg) { case WM_INITDIALOG: break; case WM_COMMAND: switch(LOWORD(wParam)) { case IDOK: EndDialog(hdlg,0); break; default: return FALSE; } break; default: return FALSE; } return TRUE; } #endif /* WIN32_GRAPHICS */ /* win32msg.c */ ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/share/������������������������������������������������������������������������0000775�0000764�0000764�00000000000�10545462320�013545� 5����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/share/oth32mi.txt�������������������������������������������������������������0000664�0000764�0000764�00001301621�10545462317�015605� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������__ = (71, 108, 108) _A = (0, 0, 0) _B = (0, 0, 16) _C = (0, 0, 32) _D = (0, 0, 48) _E = (0, 0, 64) _F = (0, 0, 96) _G = (0, 0, 128) _H = (0, 0, 160) _I = (0, 0, 192) _J = (0, 0, 224) _K = (0, 0, 255) _L = (0, 16, 0) _M = (0, 16, 16) _N = (0, 24, 0) _O = (0, 24, 24) _P = (0, 24, 48) _Q = (0, 32, 0) _R = (0, 32, 32) _S = (0, 32, 64) _T = (0, 48, 0) _U = (0, 48, 24) _V = (0, 48, 48) _W = (0, 48, 96) _X = (0, 64, 0) _Y = (0, 64, 32) _Z = (0, 64, 64) _a = (0, 64, 128) _b = (0, 80, 160) _c = (0, 96, 0) _d = (0, 96, 48) _e = (0, 96, 96) _f = (0, 96, 192) _g = (0, 112, 224) _h = (0, 128, 0) _i = (0, 128, 64) _j = (0, 128, 128) _k = (0, 128, 255) _l = (0, 144, 0) _m = (0, 160, 0) _n = (0, 160, 80) _o = (0, 160, 160) _p = (0, 182, 255) _q = (0, 192, 0) _r = (0, 192, 96) _s = (0, 192, 192) _t = (0, 224, 0) _u = (0, 224, 112) _v = (0, 224, 224) _w = (0, 255, 0) _x = (0, 255, 128) _y = (0, 255, 255) _z = (16, 0, 0) _0 = (16, 0, 16) _1 = (16, 16, 0) _2 = (16, 16, 16) _3 = (16, 48, 48) _4 = (24, 0, 0) _5 = (24, 24, 0) _6 = (24, 24, 48) _7 = (24, 48, 0) _8 = (24, 48, 24) _9 = (24, 48, 48) _$ = (32, 0, 0) A_ = (32, 0, 32) AA = (32, 32, 0) AB = (32, 32, 32) AC = (32, 64, 0) AD = (32, 64, 32) AE = (32, 64, 64) AF = (32, 242, 186) AG = (48, 0, 0) AH = (48, 0, 48) AI = (48, 12, 0) AJ = (48, 24, 0) AK = (48, 24, 24) AL = (48, 36, 0) AM = (48, 48, 0) AN = (48, 48, 24) AO = (48, 48, 48) AP = (48, 48, 96) AQ = (48, 96, 0) AR = (48, 96, 48) AS = (48, 96, 96) AT = (64, 0, 0) AU = (64, 0, 32) AV = (64, 0, 64) AW = (64, 0, 128) AX = (64, 16, 0) AY = (64, 32, 0) AZ = (64, 32, 32) Aa = (64, 32, 64) Ab = (64, 48, 0) Ac = (64, 64, 0) Ad = (64, 64, 32) Ae = (64, 64, 64) Af = (64, 64, 128) Ag = (64, 128, 0) Ah = (64, 128, 64) Ai = (64, 128, 128) Aj = (72, 108, 108) Ak = (80, 0, 160) Al = (80, 80, 80) Am = (80, 80, 160) An = (80, 160, 0) Ao = (80, 160, 80) Ap = (80, 160, 160) Aq = (96, 0, 0) Ar = (96, 0, 48) As = (96, 0, 96) At = (96, 0, 192) Au = (96, 16, 0) Av = (96, 24, 0) Aw = (96, 48, 0) Ax = (96, 48, 48) Ay = (96, 48, 96) Az = (96, 72, 0) A0 = (96, 96, 0) A1 = (96, 96, 48) A2 = (96, 96, 96) A3 = (96, 96, 128) A4 = (96, 96, 192) A5 = (96, 128, 96) A6 = (96, 128, 128) A7 = (96, 192, 0) A8 = (96, 192, 96) A9 = (96, 192, 192) A$ = (96, 144, 178) B_ = (104, 84, 31) BA = (108, 144, 182) BB = (108, 255, 0) BC = (112, 0, 224) BD = (112, 112, 112) BE = (112, 112, 224) BF = (112, 160, 160) BG = (112, 224, 0) BH = (112, 224, 112) BI = (112, 224, 224) BJ = (117, 105, 88) BK = (120, 120, 160) BL = (120, 160, 120) BM = (120, 160, 160) BN = (128, 0, 0) BO = (128, 0, 64) BP = (128, 0, 128) BQ = (128, 0, 255) BR = (128, 32, 0) BS = (128, 64, 0) BT = (128, 64, 64) BU = (128, 64, 128) BV = (128, 90, 72) BW = (128, 96, 0) BX = (128, 96, 96) BY = (128, 96, 128) BZ = (128, 112, 32) Ba = (128, 128, 0) Bb = (128, 128, 64) Bc = (128, 128, 96) Bd = (128, 128, 128) Be = (128, 128, 255) Bf = (128, 255, 0) Bg = (128, 255, 128) Bh = (128, 255, 255) Bi = (144, 72, 0) Bj = (144, 135, 110) Bk = (144, 144, 144) Bl = (144, 144, 192) Bm = (144, 192, 144) Bn = (144, 192, 192) Bo = (160, 0, 0) Bp = (160, 0, 80) Bq = (160, 0, 160) Br = (160, 40, 0) Bs = (160, 80, 0) Bt = (160, 80, 80) Bu = (160, 80, 160) Bv = (160, 120, 0) Bw = (160, 120, 120) Bx = (160, 120, 160) By = (160, 160, 0) Bz = (160, 160, 80) B0 = (160, 160, 120) B1 = (160, 160, 160) B2 = (160, 160, 224) B3 = (165, 118, 96) B4 = (168, 168, 224) B5 = (168, 224, 168) B6 = (168, 224, 224) B7 = (170, 136, 52) B8 = (170, 154, 128) B9 = (176, 176, 176) B$ = (178, 64, 0) C_ = (178, 224, 16) CA = (182, 72, 0) CB = (192, 0, 0) CC = (192, 0, 96) CD = (192, 0, 192) CE = (192, 48, 0) CF = (192, 96, 0) CG = (192, 96, 96) CH = (192, 96, 192) CI = (192, 144, 0) CJ = (192, 144, 144) CK = (192, 144, 192) CL = (192, 160, 64) CM = (192, 192, 0) CN = (192, 192, 96) CO = (192, 192, 144) CP = (192, 192, 192) CQ = (192, 192, 255) CR = (192, 255, 192) CS = (192, 255, 255) CT = (202, 144, 114) CU = (208, 168, 80) CV = (208, 208, 208) CW = (210, 210, 178) CX = (218, 218, 182) CY = (224, 0, 0) CZ = (224, 0, 112) Ca = (224, 0, 224) Cb = (224, 56, 0) Cc = (224, 112, 0) Cd = (224, 112, 112) Ce = (224, 112, 224) Cf = (224, 168, 0) Cg = (224, 168, 168) Ch = (224, 168, 224) Ci = (224, 192, 160) Cj = (224, 224, 0) Ck = (224, 224, 112) Cl = (224, 224, 168) Cm = (224, 224, 224) Cn = (229, 162, 130) Co = (240, 240, 240) Cp = (242, 0, 0) Cq = (242, 96, 0) Cr = (242, 196, 77) Cs = (248, 224, 96) Ct = (252, 252, 153) Cu = (255, 0, 0) Cv = (255, 0, 128) Cw = (255, 0, 255) Cx = (255, 64, 0) Cy = (255, 108, 0) Cz = (255, 128, 0) C0 = (255, 128, 128) C1 = (255, 128, 255) C2 = (255, 182, 144) C3 = (255, 192, 0) C4 = (255, 192, 192) C5 = (255, 192, 255) C6 = (255, 211, 176) C7 = (255, 255, 0) C8 = (255, 255, 128) C9 = (255, 255, 192) C$ = (255, 255, 255) # tile 0 (wall) { CPCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPBk CPAe_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zAlBk AeCm_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zCPAe CPCmCm_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zCVBk CPCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zCPBk CPCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zCVBk CPCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zCPCPBk CPCm_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_z_zCVBk CPCm_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPBk CPAe_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zAlBk AeCm_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPAe CPCmCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCVBk CPCm_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPBk CPCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zCVBk CPCm_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPCPBk CPCm_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zCVBk CPCm_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zCPBk CPAe_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zAlBk AeCm_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPAe CPCmCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCVBk CPCmCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zCPBk CPCm_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zCVBk CPCm_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPCPBk CPCm_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPCVBk CPCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zCPBk CPAe_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zAlBk AeCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPAe CPCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCVBk CPCmCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPBk CPCm_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPCVBk CPCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_z_zCPBk CPCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCVBk } # tile 1 (wall) { BkBkBnCJAeBkBkCPBkBkBnCJAeBkBkBnCJBkBlBmAeBkBkCPBkBkBnAeBkBkCPBk CVCPCPCPAeCVCPCPCPCPCPCPAeCVCPCPCPCPCPCPAeCVCPCPCPCPCPAeCVCPCPCP CP_z_z_z_z_zCPCP_z_z_z_z_z_z_z_z_z_zCP_$_z_z_z_z_zCP_$_z_z_z_z_z _z_zAE_z_z_z_z_z_zAEAE_z_z_zAEAEAE_z_z_z_z_zAEAE_z_z_z_z_z_zAEAE AEAEAEAEAE_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zAEAEAEAEAE AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAE_z_zAEAEAE_zAEAEAE_z_z_zAEAEAEAEAEAE_z_zAEAEAEAE_z_z _z_z_zAE_z_z_zCm_z_z_z_z_zAE_z_z_z_z_zAE_z_zAE_z_z_z_z_zAE_z_z_z CmCm_z_z_z_zCmCmCm_z_z_z_z_zCmCmCm_z_z_z_z_z_z_zCmCm_z_z_z_z_zCm CmCmCmCmAeCmCmCmCmCmCmCmAeCmCmCmCmCmCmCmAeCmCmCmCmCmCmCmAeCmCmCm CmCPCmCmAeCmCmCPCmCmCmCmAeCmCmCPCmCmCmCmAeCmCmCPCmCmCmCmAeCmCmCm CPCPCPCPAeCPCPCPCPCPCPCPAeCPCPCPCPCPCPCPAeCPCPCPCPCPCPCPAeCPCPCP CPCPCPCPAeAeCPCPCPCPCPCPAeCPCPCPCPBkBkCVAeCPCPCPCPBkCPCPAeCPCPCP BkCPBkBkAlBkBkBkCPBkBkAeAeBnBkBkCPBkCPBkAeAeBkBkCPBkCPBkAOCPBkBk AeAeAeAlAeAeAlAeAeAeAlAeAeAeAeAeAeAeAeAeAeAeAlAeAeAeAeAeAeAeAeAl AeBnBkBkBkCPBkBkAeBnBkBkCJBkCJBkAeCJBnBkBkCPBkAlAeBnBkBkBkCPBkBk AeCJBkCPBkBkCPBkAeCJBnCJBnBkBnCJAeBMCJBkCPBkBkCPAeCJBkCPBkBkCPBk AeBkCPBkBkBDBkAeAlBkBkAlBJBnCJBMAlAlCPBkBkBnCJBkAeBkBDBkCPBkBDBk ABABABABAOABABABABAOABAOABABABABABABABABABABABABABABABABABABABAB BdBdBdBdABBdBdBdBdBdBdBdABBJBdBdBdBdBdBdABBdBdBdBdBdBdBdABBdBdBd BdBdBdBdABBdBdBdBJAlBdBdABBdBdBdBdBJBdBdABBdBdBDBdBdBJBdABBJAjBJ BJAjBJAeABAeBJAjBJAjBDAlABBDAlBDAlAjBJAjABBJAjBJAlBDAlAjABAlBDAl } # tile 2 (wall) { BkBkCPBkAeBkBkCPBkBkBmCKAeBkBmBxBmBxBmBkAlBkBkCPBkBkBmCKAeBkBmBx CPCVBkCPAeCVCPCPCPCKCPCPAeCPCPCVCPCPCVCPAeCVCPCPCPCVBkCPAeCPCPCP CPCPCPCP_z_zCP_z_z_A_z_z_z_z_z_zCPCP_z_z_z_z_z_z_z_zCP_z_z_z_z_z CPCm_zCP_z_z_z_zAEAEAEAEAEAE_z_z_z_z_z_zAEAEAE_z_z_z_z_zAEAE_z_z CPCm_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE CPCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE CPCmCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE CPCm_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE CPCm_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE CPAe_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AeCm_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE CPCmCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE CPCm_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE CmCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE CPCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE CPCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE CPCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zAEAE CPAe_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_z_z AeCm_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_z_z_z CPCmCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zCPBk CPCmCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zCPBn CPCm_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCmCJBk CPCm_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCmBnBk CPCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zCPBk CPCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zCPCJ CPAe_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zAlBk AeCm_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPAe CPCm_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPBk CPCmCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zBkCP CPCm_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCmCPBk CPCm_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zCPBk CPCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCVBk } # tile 3 (wall) { BkBkCPBkAeBkBkCPBkBkCPBkAeBkBnCJCPBkBkCPAOBkBlCOBkBkCVBkAeBkBkCP CPCVBkCPAeCVCPCPCPCPCVCPAlCPCPCPCPBnCPCPAeCWCPCPBlCPCPCPAlCPBnBk _zCPCP_z_z_z_z_zCP_z_z_z_z_z_z_zCPCP_$_z_z_z_z_z_$_z_z_z_zCPCJBk _z_z_z_zAE_z_z_z_z_z_zAEAEAE_z_z_z_z_z_zAE_zAEAE_z_zAE_z_zCPCVBk AEAEAEAEAEAEAEAEAE_zAEAEAEAEAEAE_z_zAEAEAEAEAEAEAEAEAEAE_z_zCPBk AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPCP AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPBk AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zCVBk AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPBk AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zAlBk AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zCPAe AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zCVBk AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zBkCP AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPCPBk AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPBk AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCVBk _zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zBkCP _z_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zAeBk _z_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPAe CPCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zCPCVBk CPCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPCPCPBk CPCPCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zCPCP CPCm_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPBk CmCm_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zCVBk CPCm_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPCPBk CPAe_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zAlBk AeCm_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_z_zCPAe CPCmCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_z_zCVBk CPCP_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPBkCP CPCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zCPBk CPCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPCP CPCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zCVBk } # tile 4 (wall) { CPCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE CPAe_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AeCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE CPCm_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE CPCmCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE CPCmCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE CPCm_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE CPCm_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE CPCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE CPAe_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AeCmCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE CPCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE CPCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE CPCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE CPCm_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE CPCmCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE CPCm_z_zAEAEAEAEAEAEAEAEAEAEAEAEAE_zAEAEAEAEAEAEAEAEAEAEAEAEAEAE CPAe_z_zAEAE_z_zAE_z_z_z_zAEAEAE_z_z_zAE_zAE_z_z_z_z_zAE_z_zAEAE AeCmCm_z_z_zCmCm_z_z_zCm_z_z_z_zCmCm_z_z_z_z_zCmCmCm_z_z_zCm_z_z CPCmCmAeAeCmCmCmCmCmCmCmAeCmCmCmCmCmCmCmAeCmCmCmCmCmCmCmAeCmCmCm CmCmCmCPAeCmCmCmCmCPCmCmAeCmCmCmCmCmCPCmAeCmCmCmCmCPCmCmAeCPCmCm CPCPCPCPAeCPCPCPCPCPCPCPAeCPCPCPCPCPCPCPAeCPCPCPCPCPCPCPAeCPCPCP CPCPCPBkAeCPCPCPBkBkCVCPAeCPCPCPCPBkCPCPAeCPCPCPBkCPCPCPAeCPCPCP BkBkCPBkAlBkBkCPBkCPBkBkAlBkBkBkCPBkCPBkAeBnBkBkCPBkCPBkAOCPBkBk AeAeAeAeAeAeAeAeAeAeAeAlAeAeAlAeAeAeAeAeAeAxAeAeAeAeAeAeAeAeAeAl AeBdBnCJBkBnCJBkAeBnBkBkCPBkBkAeAlBkBkBkCJBkBnBkAeBkBkBkBkCPBkBk AeBkCJBMCPBkBkCPAeCJBkCPBkBkCPBkAeBnCJBnBdBkCJBnAeBkCPBkCPBkBkCP AeAeCPBkBDCPBkBdAeBkBkBkCPBkBdBdAeBkCPBkBdBdBkBkAeCJBkBdBdBkCPBk ABABABABABABABABABABABABABABABABABABABABABABABABABABAOABABABABAB AlBdBdBJABBdBdBdBdBdBdBdABBJBdBdBdBdBdABABBJBdBdBdBdAjBdABBdBdBd BDBdBdBdABBdBdBdBdBJAjBdABBdBdBdBdBdBdBdABBdBdBDBdBdBdBdABBdBdBJ ABBJAlAjABAlBDAlBDAlBJAlABBDAlBDAlBJAjBJABABBDAlAlBDAlBJABAlBJAj } # tile 5 (wall) { AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPBk AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zAlBk AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zCPCPAe AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zCVBk AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPBk AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCVBk AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPCPBk AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zCVBk AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zCPBk AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zAlBk AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPCPAe AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zCPCVBk AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_z_zCPBk AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zCVBk AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPBk AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCVBk AEAE_zAEAEAEAEAE_z_zAEAEAEAEAE_zAEAEAEAEAEAEAE_zAEAEAEAE_zCPCPBk _zAE_z_z_z_zAE_z_zCm_z_zAEAE_z_z_z_zAEAE_z_z_z_zAEAE_z_z_z_zAlBk _z_zCm_z_z_z_zCm_zCmCm_z_z_z_zCmCm_z_z_z_z_zCmCm_z_zCm_z_zCPCPAe CmCmCmCmAeCmCmCmCmCmCmCmAeCmCmCmCmCmCmCmAeCmCmCmCmCmCmCmAeCmCmCP CPCmCmCmAeCmCPCmCmCPCmCmAeCPCmCmCmCmCmAeAeCmCmCPCmCmCPCmAeCmCPCP CPCPCPCPAeCPCPCPCPCPCPCPAeCPCPCPCPCPCPCPAeCPCPCPCPCPCPCPAeCPCPCP CPCPBkCPAeCPCPCPBkCPCPCPAeCPCPCPCPBkBkCVAeCPBkCPBkCVCPCPAeCPCPCP BkCPBkAeAlBkBkCPBkCPBkAeAeBnBkBkCPBkCPBkAeBkCPBkCPBkBkAeAeBlBkBJ AeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAlAeAeAeAeAe AeCJBnBkCJBnBkBJAeBkBkBnCJBkCJBkAeAeBkBdBkCPBkBkAeBnBkBkBJBmBkBJ AeBkBkCPBkBkCKBmAeCKBmCJBMCPBkAlAeBkCPBkCPBkBkCPAeCJBkCPBkCKBkBD AeBkBmBkCKBmBdBJAeAjCJBlBdBkBdBdAeCPBkBdBkBkBdBkAeAlBkBdBnBkBkAl ABABABABABABABABABABABABABAOABABABABABABAOAOABABABABABABAKABABAB BdAlBDBdABAlBdBdBdBdBdBdABBdBdBdBdBdBdBdABBdBdBdBdBdBdBdABBdBdBJ BdBdBdBdABBdBdBJAjBJBdBdABBdBdBdBJBdBdBdABBJBdBdBdBdBdBJABBdBdAj BJAjBJAeABAlBDAlBXAjAlBJABAeBDAlBDAlAjBJABAOBDAlBDAlBDAlABBDAlBJ } # tile 6 (wall) { CPCm_z_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPCPBk CPAe_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_$Bk CP_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_z _zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_z AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE _zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z _z_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_z_z CPCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPBk CPCm_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPBkCP CPCmCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPCVBk CmCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zCPCP CPCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPBk CPCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPBk CPAe_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zAlBk AeCm_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zCPAe CPCmCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zCVBk CPCPCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPCPBk CPCm_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zBkCP CPCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPBk CPCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPBk } # tile 7 (wall) { CPCP_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zCPCP CPCP_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPCP _z_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_z_z _z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAE_z_z_zAEAEAEAEAEAEAEAEAE_zAEAEAEAEAEAEAE_z_z_z_z_zAEAEAE AE_z_z_z_zCm_z_zAE_z_zAEAE_z_z_z_z_z_zAE_z_z_z_z_z_z_z_z_z_z_zAE _z_zCm_z_zCmCm_z_z_zCm_z_z_z_zCmCm_z_z_z_z_zCm_z_zCmCm_z_zCm_z_z CmCmCmCmAeCmCmCmCmCmCmCmAeCmCmCmCmCmCmCmAeCmCmCmCmCmCmCmAeCmCmCm CmCmCPCmAeCPCmCmCmCmCPCmAeCmCmCmCPCmCmCmAeCmCmCPCPCmCmCmAeCmCPCm CPCPCPCPAeCPCPCPCPCPCPCPAeCPCPCPCPCPCPCPAeCPCPCPCPCPCPCPAeCPCPCP CPCPBkCPAeCPCPCPBkCPCPAeAeCPBkBkCVCPCPCPAeCPBkCPCPCPCPBkAeCPBkCP BkCJBnAeAeCJBkBnCJBnCJBkAeBnCJBnCJBnBkBkAeAlBkCPBkBkCPBkAlBkCPBk AeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAlAeAeAeAeAeAeAeAeAeAeAeAe AeAeCJBnBkBkCPBkAeBkBnBkAeCJBkBkAeAeBkBkCPBkBkBdAeBdCPBkBkBkBkBk AeBkBnCJBkCPBkBdAeCJBkCPBkBnCJBnAeCJBnCJBkBnCJBnAeBkBkCPBkCPBkCP AeBdCJBkBnBkBdBdAeBnBdBkCPBkBkBdAlBkBkBdBdCJBkBdAeAlBkBdBkBkBdBd ABABABABAKABABABABAKABABABABAOABABABAOABABABABABABABABABAOABABAB BdBdBdABABBdBdBdBdBJBdBdABBdBdBdBdBdBdAjABBdBdBdBdBdBdABABBdBdBd BdBJBdBdABBdBdBdBdBdBdABABBdBdBJBdAlBdBdABBdBdBJBdBdBdBdABBJBdBd BJAjAlBDABAlBDAlBDAlAjBJABAlBDAlAjBJAjBJAKAjBJAjAlBJAjBJABAlAjBJ } # tile 8 (wall) { BkBkCPBkAeCPBkBmCKBkBkBnAeBkBkCPBkBkCPBkAeBkBnCPBkBkCPBkAeBkBkCP CVBkCPCPAeCPCPCPCPCOCPCPAeCPCVBkCPCPCVCPAlCPCPCPCPBkCPCPAeCVCPCP CP_z_z_z_z_z_zCPCP_B_z_$_z_z_z_zCPCP_z_z_z_z_z_z_z_zCP_z_z_z_zCP _z_zAEAEAE_z_z_z_z_z_zAEAE_z_z_z_z_z_z_z_z_z_zAEAE_z_z_z_z_zAE_z AEAEAEAEAEAEAEAEAEAE_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE _z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_z _z_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_z_z_z CmCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zCPBk CPCm_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPBn CPCmCm_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPCPBk CPCm_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPCJBn CPCP_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_z_zCPBk CPCm_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_z_zCPCP CPAe_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zAlBk AeCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zCPAe CPCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPBk CPCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPBn CPBkCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_$BkCP CmCmCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPCPCP CPCm_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zCVBk } # tile 9 (wall) { CPCm_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPBk CPAe_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zAlBk _z_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zCPAe _zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zCVBk AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zCPCPCP AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPCPBk AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPCPBn AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zCJBk AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zCPBn AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zAeBk AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPAe AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_ACPBk AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zCPBk AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPCVBk AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zCPBkCP AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_z_zCPBk AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zCPCP _z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zAlBk _z_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zCPAe CPCm_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zCPBk CPCPCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPBn CPCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zCPCP CPCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPCPBk CmCmCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPCPBk CPCmCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zCPBk CPAe_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zAlBk AeCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPAe CPCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPBk CPCP_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zBkCP CPCmCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPCPBk CmCmCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPCPCP CPCm_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zCVBk } # tile 10 (wall) { CPCm_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zBkBk CPAe_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zAlBk Ae_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_z_$ CPCm_z_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_z CPCPCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE CPCm_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE CmCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE CmCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE CPCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE CPAe_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AeCm_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE CmCm_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE CPCmCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE CPCPCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE CPCm_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE CmCm_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE CPCm_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE CPAe_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z AeCm_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_z_z CPCm_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zCPBk CmCm_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPCPBn CmCmCm_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPCPCP CPCPCm_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zBkCP CPCm_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPBk CPCm_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zAE_zCPBk CPAe_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_z_zAlBk AeCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_z_zCPAe CPCm_z_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPCVBk CPCPCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPCP CPCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_zCPCP CmCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zCPBk CPCm_zAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE_z_zCVBk } # tile 12 (open door) { AeAeAeAeAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAO_A_A_A_A AeAeAeAeAOAOAOAOAOAOAOAOAOAOAOAOBsBsAOAOAOAOAOAOAOAOAOAO_A_A_A_A AeAeAeAeAOAOAOAOAOAOAOAOAOAOAOAOBsBsBsBsAOAOAOAOAOAOAOAO_A_A_A_A AeAeAeAeAOAOAOAOAOAOAOAOAOAOAOAOBsBsBsBsBsBsAOAOAOAOAOAO_A_A_A_A AeAeAeAeAOAOAOAOAOAOAOAOAOAOAOAOBsBsBsBsBsBsBsBsAOAOAOAO_A_A_A_A AeAeAeAeAOAOAOAOAOAOAOAOAOAOAOAOBsBsBsBsBsBsBsBsBsBsAOAO_A_A_A_A AeAeAeAeAOAOAOAOAOAOAOAOAOAOAOAOBsBsBsBsBsBsBsBsBsBsAOAO_A_A_A_A AeAeAeAeAOAOAOAOAOAOAOAOAOAOAOAOBsBsBsBsBsBsBsBsBsBsAOAO_A_A_A_A AeAeAeAeAOAOAOAOAOAOAOAOAOAOAOAOBdBdBsBsBsBsBsBsBsBsAOAO_A_A_A_A AeAeAeAeAOAOAOAOAOAOAOAOAOAOAOAOBdBdBdBdBsBsBsBsBsBsAOAO_A_A_A_A AeAeAeAeAOAOAOAOAOAOAOAOAOAOAOAOBsBsBdBdBdBdBsBsBsBsAOAO_A_A_A_A AeAeAeAeAOAOAOAOAOAOAOAOAOAOAOAOBsBsBsBsBdBDCPCPBdBdAOAO_A_A_A_A __AeAeAeAOAOAOAOAOAOAOAOAOAOAOAOBsBsBsBsBsBsCPBkBdBdAOAO_A_A_A__ ____AeAeAOAOAOAOAOAOAOAOAOAOAOAOBsBsBsBsBsBsBsBsBsBsAOAO_A_A____ ______AeAOAOAOAOAOAOAOAOAOAOAOAOBsBsBsBsBsBsBsBsBsBsAOAO_A______ ________________________________BsBsBsBsBsBsBsBsBsBs_A__________ _________________________________A_ABsBsBsBsBsBsBsBs_A__________ _____________________________________A_ABsBsBsBsBsBs_A__________ _________________________________________A_ABsBsBsBs_A__________ _____________________________________________A_ABsBs_A__________ _________________________________________________A_A_A__________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________BsBs____________ ____________________________________________BsBsBsBs____________ ________________________________________BsBsBsBsBsBs____________ ____________________________________BsBsBsBsBsBsBsBs____________ ________________________________BsBsBsBsBsBsBsBsBsBs____________ } # tile 13 (open door) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______Bs________________________________________________Bs______ ______Bs________________________________________________Bs______ ____BsBs________________________________________________BsBs____ ____BsBs________________________________________________BsBs____ __BsBsBs________________________________________________BsBsBs__ __BsBsBs________________________________________________BsBsBs__ BsBsBsBs________________________________________________BsBsBsBs BsBsBsBs________________________________________________BsBsBsBs BsBsBsBd________________________________________________BdBsBsBs BsBsBsBd________________________________________________BdBsBsBs BsBsBdBd________________________________________________BdBdBsBs BsBsBdBs________________________________________________BsBdBsBs BsBdBdBs________________________________________________BsBdBdBs BsBdBsBs________________________________________________BsBsBdBs BdBsBsBs________________________________________________BsBsBdBd BdBsBsBs________________________________________________BsBsBsBd BdBsBsBs________________________________________________BsBsBsBd BsBsBsBs_________________________________________________ABsBsBs BsBsBs_A_________________________________________________ABsBsBs BsBsBs_A___________________________________________________ABsBs BsBs_A_____________________________________________________ABsBs BsBs_A______________________________________________________BsBs Bs_A_________________________________________________________ABs Bs_A_________________________________________________________ABs _A_____________________________________________________________A _A_____________________________________________________________A ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 14 (closed door) { AeAeAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAO_A_A _A_ACFCFCFCFCFCFCFCFCFCFCFCFCFCFBsCFCFCFCFCFCFCFCFCFCFCFCFCF_A_A _A_ACFCFCFCFCFCFCFCFCFCFCFCFCFCFBsCFCFCFCFCFCFCFCFCFCFCFCFCF_A_A _A_ACFBsBsCFBsCFBsBsCFBsBsCFBsBsCFBsBsBsCFBsBsBsCFBsCFBsBsCF_A_A _A_ACFBsBsCFBsCFBsBsCFBsBsCFBsBsCFBsBsBsCFBsBsBsCFBsCFBsBsCF_A_A _A_ABsBsBsCFBsCFBsBsCFBsBsCFBsBsCFBsBsBsCFBsBsCFBsBsBsBsBsCF_A_A _A_ABsBsBsCFBsCFBsBsCFBsBsCFBsBsCFCFBsBsCFBsBsCFBsBsBsBsBsCF_A_A _A_ACFBsBsCFBsCFBsBsCFBsCFBsBsBsCFCFBsBsCFBsCFBsCFBsCFBsBsCF_A_A _A_ACFBsBsCFCFCFBsBsCFBsCFBsCFBsCFBsCFBsCFBsCFBsCFBsCFBsBsCF_A_A _A_ACFBsBsCFCFBsBsCFCFBsCFBsCFBsCFBsCFBsCFBsCFBsCFBsCFBsBsCF_A_A _A_ACFBsCFBsCFBsBsCFBsBsCFBsCFBsCFBsCFBsCFBsCFBsCFBsCFBsCFBs_A_A _A_ACFBsCFBsCFBsBsCFBsBsCFBsCFBsCFBsCFBsCFBsCFBsCFBsCFBsCFBs_A_A _A_ACFBsCFBsCFBsBsCFBsBsBsCFBsBsCFBsBsCFBsBsBsCFCFBsCFBsCFBs_A_A _A_ABsBsCFBsCFBsBsCFBsCFBsCFBsBsCFBsBsCFBsBsBsCFBsBsBsBsCFBs_A_A _A_ABsBsCFBsCFBsBsCFBsCFBsCFBsBsCFBsBsCFBsBsBsCFBsBsBsBsCFBs_A_A _A_ABdBdBdBdBdBdBdBdBdBdBdBdBdBdCFBdBdBdBdBdBdBdBdBdBdBdBdBd_A_A _A_ABdBdBdBdBdBdBdBdBdBdBdCPCPBDCFBdCPCPBDBdBdBdBdBdBdBdBdBd_A_A _A_ABdBdBdBdBdBdBdBdBdBdBdBkCPBdCFBdBkCPBdBdBdBdBdBdBdBdBdBd_A_A _A_ABsBsCFBsCFBsBsCFBsCFBsCFBsBsCFBsBsBsCFBsBsCFBsBsBsBsCFBs_A_A _A_ABsBsCFBsCFBsBsCFBsCFBsCFBsBsCFBsBsBsCFBsBsCFBsBsBsBsCFBs_A_A _A_ABsBsCFBsCFBsBsCFBsCFBsCFBsBsCFBsBsBsCFBsBsCFBsBsBsBsCFBs_A_A _A_ABsCFBsBsCFBsBsCFBsBsBsCFBsBsCFBsBsBsCFBsBsCFBsCFBsCFBsBs_A_A _A_ABsCFBsCFBsCFBsCFBsBsBsCFBsBsCFBsBsCFBsBsCFBsBsCFBsCFBsCF_A_A _A_ABsCFBsCFBsCFBsCFBsBsBsCFBsBsCFBsBsCFBsBsCFBsBsCFBsCFBsCF_A_A _A_ABsCFBsBsBsCFBsCFBsBsCFBsBsBsCFBsBsCFBsBsCFBsBsCFBsCFBsBs_A_A _A_ABsCFBsBsBsCFBsCFBsBsCFBsBsBsCFBsBsCFBsBsCFBsBsCFBsCFBsBs_A_A _A_ABsCFBsCFBsCFBsCFBsBsCFBsBsBsCFBsBsCFBsBsCFBsBsCFBsCFBsCF_A_A _A_ABsCFBsCFBsCFBsCFBsBsCFBsBsBsCFBsBsCFBsBsCFBsBsCFBsCFBsCF_A_A _A_ABsBsCFBsBsCFBsCFBsBsBsCFBsBsCFBsBsBsCFBsBsCFBsBsBsBsCFBs_A_A _A_ABsBsCFBsBsCFBsCFBsBsBsCFBsBsCFBsBsBsCFBsBsCFBsBsBsBsCFBs_A_A _A_ABsBsCFBsBsCFBsBsCFBsBsCFBsBsCFBsBsBsCFBsBsCFBsBsBsBsCFBs_A_A _A_ABsBsCFBsBsCFBsBsCFBsBsCFBsBsCFBsBsBsCFBsBsCFBsBsBsBsCFBs_A_A } # tile 15 (closed door) { AeAeAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAO_A_A _A_ACFCFCFCFCFCFCFCFCFCFCFCFCFCFBsCFCFCFCFCFCFCFCFCFCFCFCFCF_A_A _A_ACFCFCFCFCFCFCFCFCFCFCFCFCFCFBsCFCFCFCFCFCFCFCFCFCFCFCFCF_A_A _A_ACFBsBsCFBsCFBsBsCFBsBsCFBsBsCFBsBsBsCFBsBsBsCFBsCFBsBsCF_A_A _A_ACFBsBsCFBsCFBsBsCFBsBsCFBsBsCFBsBsBsCFBsBsBsCFBsCFBsBsCF_A_A _A_ABsBsBsCFBsCFBsBsCFBsBsCFBsBsCFBsBsBsCFBsBsCFBsBsBsBsBsCF_A_A _A_ABsBsBsCFBsCFBsBsCFBsBsCFBsBsCFCFBsBsCFBsBsCFBsBsBsBsBsCF_A_A _A_ACFBsBsCFBsCFBsBsCFBsCFBsBsBsCFCFBsBsCFBsCFBsCFBsCFBsBsCF_A_A _A_ACFBsBsCFCFCFBsBsCFBsCFBsCFBsCFBsCFBsCFBsCFBsCFBsCFBsBsCF_A_A _A_ACFBsBsCFCFBsBsCFCFBsCFBsCFBsCFBsCFBsCFBsCFBsCFBsCFBsBsCF_A_A _A_ACFBsCFBsCFBsBsCFBsBsCFBsCFBsCFBsCFBsCFBsCFBsCFBsCFBsCFBs_A_A _A_ACFBsCFBsCFBsBsCFBsBsCFBsCFBsCFBsCFBsCFBsCFBsCFBsCFBsCFBs_A_A _A_ACFBsCFBsCFBsBsCFBsBsBsCFBsBsCFBsBsCFBsBsBsCFCFBsCFBsCFBs_A_A _A_ABsBsCFBsCFBsBsCFBsCFBsCFBsBsCFBsBsCFBsBsBsCFBsBsBsBsCFBs_A_A _A_ABsBsCFBsCFBsBsCFBsCFBsCFBsBsCFBsBsCFBsBsBsCFBsBsBsBsCFBs_A_A _A_ABdBdBdBdBdBdBdBdBdBdBdBdBdBdCFBdBdBdBdBdBdBdBdBdBdBdBdBd_A_A _A_ABdBdBdBdBdBdBdBdBdBdBdCPCPBDCFBdCPCPBDBdBdBdBdBdBdBdBdBd_A_A _A_ABdBdBdBdBdBdBdBdBdBdBdBkCPBdCFBdBkCPBdBdBdBdBdBdBdBdBdBd_A_A _A_ABsBsCFBsCFBsBsCFBsCFBsCFBsBsCFBsBsBsCFBsBsCFBsBsBsBsCFBs_A_A _A_ABsBsCFBsCFBsBsCFBsCFBsCFBsBsCFBsBsBsCFBsBsCFBsBsBsBsCFBs_A_A _A_ABsBsCFBsCFBsBsCFBsCFBsCFBsBsCFBsBsBsCFBsBsCFBsBsBsBsCFBs_A_A _A_ABsCFBsBsCFBsBsCFBsBsBsCFBsBsCFBsBsBsCFBsBsCFBsCFBsCFBsBs_A_A _A_ABsCFBsCFBsCFBsCFBsBsBsCFBsBsCFBsBsCFBsBsCFBsBsCFBsCFBsCF_A_A _A_ABsCFBsCFBsCFBsCFBsBsBsCFBsBsCFBsBsCFBsBsCFBsBsCFBsCFBsCF_A_A _A_ABsCFBsBsBsCFBsCFBsBsCFBsBsBsCFBsBsCFBsBsCFBsBsCFBsCFBsBs_A_A _A_ABsCFBsBsBsCFBsCFBsBsCFBsBsBsCFBsBsCFBsBsCFBsBsCFBsCFBsBs_A_A _A_ABsCFBsCFBsCFBsCFBsBsCFBsBsBsCFBsBsCFBsBsCFBsBsCFBsCFBsCF_A_A _A_ABsCFBsCFBsCFBsCFBsBsCFBsBsBsCFBsBsCFBsBsCFBsBsCFBsCFBsCF_A_A _A_ABsBsCFBsBsCFBsCFBsBsBsCFBsBsCFBsBsBsCFBsBsCFBsBsBsBsCFBs_A_A _A_ABsBsCFBsBsCFBsCFBsBsBsCFBsBsCFBsBsBsCFBsBsCFBsBsBsBsCFBs_A_A _A_ABsBsCFBsBsCFBsBsCFBsBsCFBsBsCFBsBsBsCFBsBsCFBsBsBsBsCFBs_A_A _A_ABsBsCFBsBsCFBsBsCFBsBsCFBsBsCFBsBsBsCFBsBsCFBsBsBsBsCFBs_A_A } # tile 18 (floor of a room) { AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AE_VAO_VAO_VABAE_R_R_RAO_VAO_VAO_VAO_VAO_VAO_VAO_R_R_VAO_VAO_V_O AEAO_VAEAEAEAE_VAO_R_R_VAEAEAEAEAEAEAEAEAE_VAEAE_O_RAOAEAEAEAB_R AE_VAEAOAEAOAEAE_V_R_RAOAEAEAEAEABAEAEAEAEAEAEAB_RAO_VAEABAEAE_R AEAOAEAEAEAEAEAEAO_V_R_VAB_VAEAEAEAEAEABAEAEAE_V_R_VAEAEAEAE_V_R AE_VAEAEAE_VAEAEAEAO_RABAEAO_VAO_VAEABAE_VAEAB_RABAEAOAEAEAEAO_R AEAO_VAEAEAOAE_VAE_V_RAE_V_O_R_R_R_R_R_VAO_O_R_R_R_R_VAO_VAO_V_R AEAEAEAEAEAEAEAEAEAO_R_O_RAO_VAO_VAO_R_R_R_RAO_VAO_R_R_R_R_VAO_R AEAB_VAEAOAEAEAEAB_R_RAO_VAO_VAEAO_VAO_R_R_VAOAE_VAO_VAO_R_R_R_R AEAEAEAE_VAO_VAO_V_RAO_VAEAEAEAEAE_VAO_V_RAOAEAEAEAEAE_VAE_R_R_R AE_O_RAO_V_R_R_R_R_R_VAEAEAEAOAE_VAEAEAO_R_VAEAEAEAEAEAEAEAB_R_R AE_R_R_R_R_VAO_VAO_RAOAOAEAE_VAEAEAEAE_V_R_RABAEAEABAEAB_R_R_R_R AEAEABAEABAEAEAB_VAE_O_VAOAEAEAEAEAEAEAO_R_R_RAE_VAB_R_R_R_R_R_R AEAB_VAEAEAEAEAEAEAB_R_VAO_VAEAEAOAEAO_V_R_R_R_R_R_R_R_R_RABAE_R AEAEAEAEAEAE_VAEAE_V_R_RAOAEAEAEAEAE_V_R_RAO_VAO_V_R_R_R_RAE_V_O AEABAE_VAEAOAEAEAEAOAO_R_RAO_VAO_VAO_R_RAO_VAEAEABAE_R_RAO_VAO_R AEAEAEAOAEAEAEAEAE_V_V_R_R_R_R_R_V_R_R_R_VAEAEAE_VAO_V_R_VAEAB_R AE_VAEAEAEAEAEAO_VAO_R_RAO_VAO_R_R_R_R_VAOAEAEAOAE_VAO_RAOAEAE_R AEAO_VAB_VAE_VAB_R_RAEAB_VAEAEABAE_O_RAOAEAEAEAEAEAO_V_R_VAO_V_R AE_R_R_R_R_R_R_R_RAO_VAEAEAEAEAE_VAO_R_VAEAE_VAEAEAE_R_R_VAEAO_R AEAEABAEABAE_O_R_R_VAEAEAEAOAEAEAE_V_RAOAEAEAOAEAEAB_RAOAOAE_V_R AE_VAB_VAE_VABAE_OAEAOAEAEAEAEAE_VAO_RAB_VAEAE_VAE_V_R_VAE_V_R_R AEAOAEAEAEAEAE_V_R_O_VAO_VAO_VAOAE_O_R_RAEABAEAEAEAO_R_R_O_R_R_R AE_VAEABAEAEAE_VAO_R_RABAE_R_R_R_R_R_R_R_OAEABAEAE_R_RAO_VAO_R_R AEAOAEAEAEAOAEAEAO_V_R_R_R_RABAEAB_VAO_VAO_R_R_VAB_R_VAOAE_VAO_R AE_VAEAEAEAEAEAEAEAO_R_R_R_VAO_VAEAE_VAEAO_VAO_R_R_RAOAEAEAE_V_R AEAOAE_VAEAEAEAEAE_VAO_RAO_VAEAEAEAEAEAOAEAE_VAO_R_R_VAEAOAEAO_R AE_VAEAE_VAEAEAEAEAO_V_R_VAEAEABAEAEAEAEAEAEAEAO_V_RAOAEAEAE_V_R AEAOAEAEAEAEAE_VAE_VAO_RAO_VAEAEAEAEAEAE_VAEAE_VAO_R_VAOAEAEAO_R AE_VAOAEAEAEAEAEAOAO_V_OAEABAEAEAEAEAEAEAEAE_VAO_R_R_VAEAEAO_V_R AEAO_VAO_VAO_VAO_V_V_R_R_R_VAO_VAO_VABAEABAEAB_R_R_R_RAO_V_V_R_R _V_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R } # tile 19 (corridor) { AEAB_VAO_VAO_VAO_VAO_VAO_VAO_VAO_VAO_VAO_VAO_VAO_VAO_VAO_V_OAO_R _V_M_M_V_OAE_R_R_M_M_R_RABAE_R_R_R_V_R_R_R_R_R_M_M_MABAE_R_R_A_A AO_MAO_RAO_R_R_R_R_M_M_M_V_R_RAO_O_R_R_R_R_R_R_R_MAE_O_O_R_O_R_A _V_R_V_R_V_RAB_R_R_M_M_M_R_R_V_R_R_RAO_OAE_R_R_R_MAB_MAE_R_R_R_A AO_R_OAO_R_R_R_R_R_R_MAO_V_R_O_RAO_R_R_R_RAB_R_R_MAE_R_OAB_R_R_A _V_OAE_R_R_R_O_R_R_R_M_R_R_R_R_R_R_R_R_R_R_R_R_M_R_O_R_R_R_R_R_A AO_V_R_RAB_R_R_RAE_O_M_M_R_M_M_M_M_M_M_R_R_M_M_M_M_M_R_R_R_R_R_A AE_R_R_R_R_O_O_R_R_R_M_M_MAO_O_R_O_O_M_M_M_OABAE_R_M_M_M_M_R_R_A AB_R_RAE_RAE_O_O_R_M_MAEAB_R_R_R_R_R_R_M_MAE_O_R_R_R_R_R_M_M_M_M AE_R_R_R_O_R_R_R_R_OAB_R_O_R_R_OAE_R_R_R_M_OAE_RAB_R_O_R_R_M_M_M AB_M_M_R_R_M_M_M_M_MAE_RAE_O_RAE_OAB_R_R_MAB_V_R_RAE_R_R_R_R_M_M AE_M_M_M_MAE_R_R_R_MAB_O_RAB_R_R_R_R_R_R_MAE_RAO_R_R_R_R_M_M_M_M _V_RAO_VAB_RAB_R_R_R_MAE_O_R_R_O_R_RAE_O_M_M_R_R_R_R_M_M_M_MAE_A AEAB_R_R_RAE_RAE_R_R_M_V_R_RAE_R_R_R_R_R_M_M_M_M_M_M_M_M_M_V_O_A ABAE_O_R_R_O_R_OAB_R_M_M_O_R_O_R_R_R_R_M_MAEAB_R_R_M_M_MAO_R_R_A _V_R_OAE_R_R_R_O_R_R_R_M_M_R_R_R_R_O_M_OAB_R_R_R_R_R_M_M_V_R_R_A AO_RAE_O_O_RAE_O_O_R_R_M_M_M_M_M_O_M_M_MAE_R_RAE_O_R_R_M_RAO_R_A _V_R_O_R_R_O_R_R_R_R_M_M_RAO_R_M_M_M_OAB_O_O_O_R_R_O_R_MAE_R_R_A AO_M_R_R_R_R_R_R_M_MAEAB_R_V_R_R_R_M_M_RAE_OAE_O_R_R_R_M_O_R_R_A _V_M_M_M_M_M_M_M_OAB_R_R_R_O_R_R_R_R_OAB_R_O_R_R_R_R_M_M_RAB_R_A AO_M_MAEAB_V_M_M_MAE_RAB_R_O_R_R_R_R_MAE_R_R_R_O_R_R_M_R_R_R_R_A _VAEAB_R_R_RAO_R_M_R_R_RAE_R_OAE_R_O_M_O_R_OAE_R_R_R_M_R_R_R_M_M AO_R_RAE_OAE_O_R_M_M_R_R_R_R_R_O_O_M_M_M_R_R_R_R_R_O_M_M_M_M_M_M _V_RAB_RAB_R_R_O_R_M_M_R_R_R_M_M_M_M_M_M_M_R_R_R_O_M_MAE_R_R_M_M AO_V_R_R_R_R_R_R_R_R_M_M_M_MAEAB_VAO_R_R_R_M_M_O_O_MAB_RAB_R_R_A AE_R_R_O_O_OAE_R_R_R_M_M_OAB_OAE_R_R_OAE_R_R_R_M_M_M_VAE_R_R_R_A AB_R_R_R_R_R_R_R_R_R_R_MAE_R_R_R_O_R_R_R_R_R_R_R_M_MAO_R_R_O_R_A AE_R_R_O_RAEAB_OAE_R_R_MABAE_RAB_R_RAB_R_R_R_R_R_R_M_V_OAE_R_R_A _V_R_R_R_R_R_R_R_R_R_R_M_V_R_R_R_R_RAE_R_RAB_R_R_R_M_R_R_O_R_R_A AO_R_R_R_R_O_R_R_R_R_R_M_R_R_RABAE_R_R_OAE_R_R_O_M_M_R_R_O_R_R_A _V_M_R_R_R_R_R_R_R_R_M_M_M_R_R_R_R_R_R_R_R_R_O_M_M_M_M_R_R_R_M_M _R_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M } # tile 20 (lit corridor) { AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AE_M_MAE_OAE_R_R_M_M_R_OAEAE_OAE_RABAEAE_R_R_R_M_M_MAEAEAE_R_A_A AE_MABAE_V_OABAE_R_M_M_MAEAEAEABAE_R_R_O_VAEAO_R_MAEAEABAE_O_R_A AEAEAE_RAEAEAE_RAE_M_M_MAEAE_VAE_R_RAE_RAO_R_V_R_MAEAEAE_VAE_R_A AEAEAEAEAEAB_V_R_R_R_MAEAEABAEAEAEAE_O_V_RAE_R_R_MABAE_VAOAE_R_A AEABAEAE_VAEAEAO_R_R_M_O_VAEABAE_R_RAOAE_R_RAO_M_RAEAEAE_RABAE_A AEAE_RABAE_O_R_VAE_R_M_M_R_M_M_M_M_M_M_R_R_M_M_M_M_MAB_RAE_R_R_A AEAE_VAE_RAE_O_R_R_R_M_M_MAE_MAE_O_O_M_M_M_MAEAEAE_M_M_O_M_R_R_A AEABAEAB_RAO_R_O_R_M_MAEAEAOAE_RABAE_R_M_MAEAEABAE_RAE_R_M_M_M_M AE_R_R_R_R_R_RAE_R_MAEAEAEAE_V_R_V_RAE_R_MAE_VAE_V_R_OAE_R_M_M_M AE_M_M_R_R_M_M_M_M_MAEABAEAE_OAEAEAO_O_R_MAEAEAE_RAE_R_R_R_R_M_M AE_M_M_M_MAEAE_R_R_MAEAEAEAEAOAE_R_R_V_R_MAEAEAO_R_VAO_R_M_M_M_M AE_RAEAEAE_RAE_O_R_R_M_VAE_V_R_VAOAEAO_R_M_MAE_RAO_R_M_M_M_MAE_A AEAE_RAE_RAB_OAEAE_R_MAEAO_R_VAO_R_RAE_R_M_M_M_M_M_M_M_M_MAE_R_A AEAEAE_VAE_RAEAEAB_R_M_MAEAOAE_V_RAO_R_M_MAEAE_O_R_M_M_MABAE_V_A AEAE_OAEAE_RAB_O_R_R_R_M_MAEAO_RAE_O_M_MAEAEAE_OAE_R_M_MAEAOAE_A AE_RABAE_OAE_VAE_OAE_R_M_M_M_M_M_O_M_M_MAEAE_OAE_O_RAB_OAE_VAO_A AE_RAEAO_VAEAO_R_R_R_M_MAEABAE_M_M_M_MAEAEABAE_VAB_O_R_MAOAE_R_A AE_M_RAEAE_R_R_R_M_MAEAE_R_V_RABAE_M_MAE_V_RAEAO_RAE_R_M_R_VAO_A AE_M_M_M_M_M_M_M_OABAEAEAE_OAEAE_VAE_MAOAE_R_RAO_V_R_M_M_VAO_R_A AE_M_MAEAEAE_M_M_MAEAEAE_RAOAEABAE_O_M_V_RAO_VAO_RAO_MAOAE_V_R_A AEAEAEAEAB_RAB_R_MAEAEAO_V_R_VAE_R_O_MAEAE_RAE_R_R_R_M_RAO_R_M_M AEAE_RAEAE_V_R_R_M_MAE_V_RAE_R_O_O_M_M_M_OAEAEAEAE_M_M_M_M_M_M_M AEAEAE_RAB_R_OAE_R_M_M_RAO_R_M_M_M_M_M_M_MAE_R_R_M_M_MAEAEAE_M_M AEAE_RAEAEAE_OAB_R_R_M_M_M_MAEAEAEAE_RAB_R_M_M_O_O_MABAE_VAO_R_A AE_RABAE_VAO_V_RAE_R_M_M_MAEAEAB_OAE_RAE_RAE_R_M_M_OAEAOAE_VAE_A AEAE_R_RAB_R_R_RAB_R_R_MAEAEAE_RAEAB_VAO_V_R_R_R_M_MAEAE_VAe_R_A AE_OAEAEAE_VAO_RAE_R_R_MAEAO_VAE_R_RAE_R_R_RAE_R_R_M_VAEAO_V_R_A AEAEAEAB_V_RAE_O_R_R_R_MAE_VAE_RAO_OAE_O_RAO_R_RAE_MAEAOAEAE_R_A AE_O_VAEAEAEAB_R_R_RAB_M_RAe_VAO_VAE_R_RAE_RAE_O_M_M_RAE_O_RAO_A AE_M_RAO_V_O_R_R_R_R_O_M_MAEAO_RAE_RAEAE_R_R_O_M_M_M_M_R_V_R_M_M AE_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M } # tile 21 (staircase up) { ________________________________________________________________ __CVCVCPCPCP____________________________________________________ __CVCVCVCVBkCVCVCV______________________________________________ __CVCVCVCVCPCVCVCVCP____________________________________________ __CVCVCVCVCPCVCVCVCPBkCmCV______________________________________ __CVCVCVCVBnCVCVCPCPCVCVCV______________________________________ __CVCVCVCVCJCVCVCVCPCPCVCVCPCVCVCP______________________________ __CVCVCPCPCPCVCmBkCPCVCVCVBkCVCPBkCVCVCVCP______________________ __CVCVCVCPBkCVCVCVCPCPCVCVCPCVCVCPCVCVCVBn______________________ __CVCVCVBnCPCVCVCPCPCVCVCVCPCVCPCPCVCVCVCJCVCVCV________________ __CVCVCVCVCJCVCVCVCPCPCVCVCPCPCVCPCPCVCVCPCVCVCV________________ __CVCVCVCVCPCVCmBkCPCVCVCPCPCVCPCPCVCVCVBnCVCVCVCPCVCVCV________ __CVCVCVCVBnCVCVCVCPCPCVCPBkCVCVCPCPCVCPCJCVCVCVBnCVCVCV________ __CVCVCVCVCJCVCVCPCPCVCVCVCPCVCPCPCVCVBkCPCVCVCVCJCVCVCVCPCVCV__ __BdCVCVCPBnCVCVCVCPCPCVCVCPBkCmCPCPCVCPBnCVCVCVCPCVCVCVCPCPCV__ __AeBdBdAlBdCVCVCPCPCVCVCPCPCVCPCPCVCVCVCJCVCVCPCPCVCPCPBkCPCV_A __AeAeBJBJAeCPCVCVCPCPCVCVCPCPCVCPCPCVCVCPCVCVCVCPCPCVCPCPCPCV_A __BdBdBdBdBDCPBkCPAlCVCVCPCPCVCPCPCVCVCVBnCVCVCPCPCVCVBkCPCVCV_A __BdBdBdBdBdBdBdBdBJBdCVCPBkCVCVCPCPCVCVCPCPCVCVCPCPCVCVCPCPCV_A __BJBdBdBdBdBdBDAlBDAlBdBdBkCVCPCPCVCVCPCPCVCVCPCPCVCVCPCPCVCV_A __BdAjBJAlAeAeAlBdBdBdBDAlBJAeAjAlCVCVCVCPCPCVCVCPCPCVCVCPCPCV_A __BdBdBdBdBDBdBdBdBdBdBdBdBdAeBdBdCPCVCPCPCVCVCPCPCVCVCPCPCVCV_A __BdBdBdBdAlBdBdBdBdBdBdBdBdAlBdBdBdBdCPBkCVCVCPBkCVCVCVCPCPCV_A __AlAeAeBDAlBDBdBDAlBDAlBdBdBDBJBdBdAeAeBkBdCJCPCPCVCVCPCPCVCV_A __BDBdBdAlBDBdAlBDAlBDAlBDAlAjAlBDAlBJAeAlBDBdBnCVCVCVCPBkCVCV_A __BdBdBdBdBdBdBdBdBJBdBdBdBdBdBdBdBdBdAjBdBdBdBdBdBdCPCPCPCVCV_A __BdBdBdBdBdBdBdBdAjBdBdBdBdBdBJBdBdBdBJBdBdBdBdBdBdBdCPBkCVCV_A __BDAlAeBDAlBDAlAeAeAlBDAlBDAlBDAlBDAlBDAlBDAlBdBJAeAlBnCPBdCV_A __BdBdBdBdBdBJBdBdBdBdBdBdBdBJBdBdBdBdBdBdBdBJAjAlBdBdBwBdBdBd_A __AeBdBdBdBdAeBdBdBdBdBdBdBdAeAlBdBdBdBdBdBdAlBdBdBdBdBdBdAeAe_A _______A_A_A_A_A_A_A_A_A_A_A_B_A_A_A_A_A_A_A_B_z_A_A_A_A_A_A_A__ ________________________________________________________________ } # tile 22 (staircase down) { ________________________________________________________________ _____________________________________________A__________________ _______A_A_A_A_A_A_A_A_A_A_A_A_A_A_____A_A_A_A_A_A_A_A_A_A_A____ ___A_A_A_A_A_A_A_A_A_AAO_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A____ ___A_A_A_A_A_A_A_AAlAOAOAlAOAlAlAlAlAOAlAlAlAlAlAOAlAlAl_A_A____ ___ABkBkBD_ABDAl_A_AAOAOAlAlAlAlAlAOAOAlAlAOAlAlAOAOAlAl_A_A_A__ ___ABkBkBDBDBDAlAl_A_A_A_AAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAO_A____ _ABkBkBkBkBDBDAlAl_A_A_A_A_A_AAlAlAlAlAlAlAlAlAOAlAlAlAlAl_A_A__ _ABkBkBkBkBDAlAlAlBDBDBD_A_A_A_A_AAlAlAlAlAlAlAOAlAlAlAlAl_A_A__ _A_ABkBkBkBDBDAlAlBkBDBDBDBDAlAl_A_A_AAOAOAOAlAOAOAOAOAOAOAO_A_A ___ABkBkBkBkBDAlAlBkBkBDBDAlAlAl_A_A_A_A_A_A_A_A_AAlAlAlAOAO_A_A ___ABkBkBkBDBDAlAlBkBDBDBDAlAlAlBDBDBDBDBDAl_A_A_AAOAOAOAOAO_A_A ___ABkBkBkBDBDBDAlBkBDBDBDBDAlAlBkBDBDBDAlAlAl_A_A_AAOAOAO_A_A_A ___ABkBkBkBkBDBDAlBDBDBDBDBDAlAlBDBDBDBDBDAlAl_A_A_A_AAOAO_A_A__ ___ABkBkBkBkBDBDAlBkBDBDBDBDAlAlBDBDBDBDAlAlAl_A_A_A_A_AAO_A____ ___ABkBkBkBkBDAlAlBkBkBDBDAlAlAlBkBDBDBDAlAlAlAlBDBDAl_AAO_A_A__ _A_ABkBkBkBDBDAlAlBkBkBDBDAlAlAlBkBDBDAlAlAlAlBDAlBDAlAl_A_A_A__ _A__BkBkBkBkBDAlAlBkBkBDBDAlAlAlBDBDBDBDAlAlAlBDBDBDAlAl_A_A____ ___ABkBkBkBkBDAlAlBkBkBDBDBDAlAlBDBDBDBDAlAlAlBDBDAlAlAl_A_A____ ___ABkBkBkBDBDAlAlBkBkBDBkBDAlAlBDBDBDBDBDAlAlBDBDBDAlAl_A_A_A__ ___ABkBkBkBDBDAlAlBkBkBDBDAlAlAlBDBkBDBDAlAlAlBDBDBDAlAlAl_A_A__ ___ABkBkBkBkBDAlAlBDBkBDBDBDAlAlBkBDBDBDAlAlAlBDBDBDAlAlAlAl_A__ ____BkBkBkBkBDAlAlBDBkBDBDAlAlAlBDBDBDBDBDAlAlBDBDBDAlAlAlAl_A__ ___ABkBkBkBDBDAlAlBDBDBDBDAlAlAlBDBDBDAlAlAlAlBDBDBDAlAlAlAl_A__ ____BkBkBkBkBDAlAlBkBDBDBDAlAlAlBkBDBDAlAlAlAlBDBDAlAlAlAlAl_A__ ___ABkBkBkBDAlAlAlBkBDBDBDBDAlAlBkBDBDAlAlAlAlBkBDAlAlAlAlAl_A__ ___ABkBkBkBDBDAlAlBkBDBDBDBDAlAlBDBDBDBDAlAlAlBDBDBDAlAlAlAl_A__ ___ABkBkBkBDBDAlAlBkBkBDBDBDAlAlBDBDBDBDAlAlAlBDBDBDAlAlAlAl_A__ ___A_ABkBkBkBDAlAlBDBkBDBDBDAlAlBDBDBDBDBDAlAlBDBDAlAlAlAlAl_A__ _____A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A____ _______A_A_A_______A_A_A___A_____A_A_____A_A_A_A________________ ________________________________________________________________ } # tile 23 (ladder up) { ________________________________________________________________ ________________BSBSAY__________________BSBSAY__________________ ________________BSBSAYAY________________BSBSAYAY________________ ________________BSBSAYAY________________BSBSAYAY________________ ________________BSBSAYAY________________BSBSAYAY________________ ________________BSBSAYAY________________BSBSAYAY________________ ________________BSBSBSBSBSBSBSBSBSBSBSBSBSBSAYAY________________ ________________BSBSBSBSBSBSBSBSBSBSBSBSBSBSAYAY________________ ________________BSBSAYAYAYAYAYAYAYAYAYAYBSBSAYAY________________ ________________BSBSAYAY________________BSBSAYAY________________ ________________BSBSAYAY________________BSBSAYAY________________ ________________BSBSAYAY________________BSBSAYAY________________ ________________BSBSAYAY________________BSBSAYAY________________ ________________BSBSBSBSBSBSBSBSBSBSBSBSBSBSAYAY________________ ________________BSBSBSBSBSBSBSBSBSBSBSBSBSBSAYAY________________ ________________BSBSAYAYAYAYAYAYAYAYAYAYBSBSAYAY________________ ________________BSBSAYAY_______________ABSBSAYAY________________ ________________BSBSAYAY_____________A_ABSBSAYAY_A_A_A_A_A_A_A_A ________________BSBSAYAY___________A_A_ABSBSAYAY___________A_A_A ________________BSBSAYAY_________A_A_A_ABSBSAYAY_________A_A_A_A ________________BSBSBSBSBSBSBSBSBSBSBSBSBSBSAYAY_A_A_A_A_A_A_A__ ________________BSBSBSBSBSBSBSBSBSBSBSBSBSBSAYAY_____A_A_A_A____ ________________BSBSAYAYAYAYAYAYAYAYAYAYBSBSAYAY___A_A_A_A______ ________________BSBSAYAY_A_A_A_A_A_A_A_ABSBSAYAY_A_A_A_A________ ________________BSBSAYAY_A_A_A__________BSBSAYAY_A_A_A__________ ________________BSBSAYAY_A_A____________BSBSAYAY_A_A____________ ________________BSBSAYAY_A_A_A_A_A_A_A_ABSBSAYAY_A______________ ________________BSBSAY_A________________BSBSAY_A________________ _________________A_A_A___________________A_A_A__________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 24 (ladder down) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________BSBS____________________BSBS________________ __________________BSBSAY__________________BSBSAY________________ ________________AwAwAYAY________________AwAwAYAY________________ ________________AwAwAYAY________________AwAwAYAY________________ ________________AwAwAYAY________________AwAwAYAY________________ ________________AwAwAYAY________________AwAwAYAY________________ ________________AwAwAYBSBSBSBSBSBSBSBSBSAwAwAYAY________________ ________________AwAwBSBSBSBSBSBSBSBSBSBSAwAwAYAY________________ ______BJAjBJAlBDAwAwAwAwAwAwAwAwAwAwAwAwAwAwAYAYBJAjBJAlBD______ ______AlBDAlBDAlAwAwAwAwAwAwAwAwAwAwAwAwAwAwAYAYAlBDAlBDAl______ ______BDAlBD_A_AAwAwAYAY_A_A_A_A_A_A_A_AAwAwAYAY_A_ABJAjBJ______ ______AlBDAl_A_AAwAwAYAY_A_A_A_A_A_A_A_AAwAwAYAY_A_BAlBDAl______ ______BDAlBD_A_AAwAwAYAY_A_A_A_A_A_A_A_AAwAwAYAY_A_ABJAlBD______ ______AlBDAl_A_AAwAwAYBSBSBSBSBSBSBSBSBSAwAwAYAY_A_AAjBDAl______ ______BDAlBD_A_AAwAwBSBSBSBSBSBSBSBSBSBSAwAwAYAY_A_ABJAlBD______ ______AlBDAl_A_AAwAwAwAwAwAwAwAwAwAwAwAwAwAwAYAY_A_BAlBDAl______ ______BDAlBD_A_AAwAwAwAwAwAwAwAwAwAwAwAwAwAwAYAY_A_ABDAlBD______ ______AlBDAl_A_AAwAwAYAA_A_A_A_A_A_A_A_AAwAwAYAA_A_AAlBDAl______ ______BDAlBD_A_AAYAYAA_z_A_A_A_A_A_A_A_AAYAYAA_z_A_ABDAlBD______ ______AlBDAl_A_AAYAYAAAA_A_A_A_A_A_A_A_AAYAYAAAA_A_AAlBDAl______ ______BDAlBDBJAlBDAlAjBJAlBDAlBDAlBDAlBDAlBDAlAjBJAlBDAlBD______ ______AlBJAjAlBDAlBDAlBDAlBDAlBDAlBDAlBDAlBDAlBDAlBDAlBDAl______ ______BDAlBDAlBDAlBDAlBDAlBDAlBDAlBDAlBDAlBDAlBDAlBDAlBDAl______ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 25 (altar) { ____________________CBCBCBCBCBCBCBCBCBCB________________________ ________________CBCBCBBNBNBNBNBNBNBNBNCBCBCB____________________ ______________CBCBBNBNBNCBCBC$C$CBCBBNBNBNCBCB__________________ ____________CBCBBNBNCBCECBBdC$C$BdCBCECBBNCuCBCB________________ __________CoCBBNCBCBCECEBdCBC$C$CBBdCBCECBCuCuCBCm______________ __________CoCBBNCBCBBrBdCBCBC$C$CBCBBdBrCBCBCuCBCm______________ __________CoCBBNCBCBC$C$C$C$C$C$C$C$C$C$CBCBCuCBCm______________ __________CoCBBNBrCBCPCPCPCPC$C$CPCPCPCPCBBrCuCBCm______________ __________CoCBBNBrCBBdCBCBCBC$C$CBCBCBBdCBBrCuCBCm______________ __________CoCBBNCBBrBrBdCBCBC$C$CBCBBdBrBrCBCuCBCm______________ __________CoCBBNCBCBCBCBBdCBC$C$CBBdCBCBCBCBCuCBCm______________ __________CoCBBNCBCEBrCBCBBdC$C$BdCBCBBrCECBCuCBCm______________ __________CoCBBNCBCEBrBrCBCBC$C$CBCBBrBrCECBCuCBCm______________ __________CoCBBNCBCECECECBCBC$C$CBCBCECECECBCuCBCm______________ __________CoCBBNCBBRCECBBrCBC$C$CBBrCBCEBRCBCuCBCm______________ __________CoCBBNCBBRCECBBrCBCPCPCBBrCBCEBRCBCuCBCm______________ __________CoCBBNCBCBCECBCBCBCBCBCBCBCBCECBCBCuCBCm______________ __________CoCBBNCBCECBCBCBCBCBCBCBCBCBCBCECBCuCBCm______________ __________CoCBBNCEBRCBCBCECECECECECECBCBBRCECuCBCm______________ __________CoCBBNBRCBCBCBCBBrBrBrBrCBCBCBCBBRCuCBCm______________ ______CfCjCfCjCfCjCfCjCfCjCfCjCfCjCfCjCfCjCfCjCfCjCfCj__________ ______CfCzCzCzCzCzCzCfCjCfCfCjCfCfCjCfCfCzCzCzCzCzCzCy__________ ___________ACzCFCFCFCzCzCzCzCzCzCzCzCzCzCFCFCFCF_A_A____________ ____________CzCFCFCFCFCFCFCFCFCFCFCFCFCFCFBsBsAw_A______________ ____________CzCFCFBsBsBsBsBsBsBsBsBsBsBsBsBsBsAw_A______________ ____________CzCFCFBsBsBsBsBsBsBsBsBsBsBsBsBsBsAw_A_A_A_A_A_A_A__ ________CzCzCFCFCFBsBsBsBsBsBsBsBsBsBsBsBsBsAwAwAwAw_A_A_A_A_A_A ________CzAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw_A_A_A_A_A_A ___________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A__ _______________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A______ ________________________________________________________________ ________________________________________________________________ } # tile 27 (opulent throne) { ________________________________________________________________ ________________________________________________________________ ____________________CsCsCsCsCrCrCrCrCLCL________________________ __________________CtCtCsCsCrCrCrCrCrCrCLCL______________________ ________________CsCtCtCYCBCBBoBoBoBNBNCrCLCL____________________ ________________CsCsCuCuCYCYCYCBCBBoBoBoCrCL____________________ ________________CsCsCuCuCYCY_K_KCBBoBoBoCrCL____________________ ________________CsCrCuCuCYCY_K_KCBBoBoBoCrCL____________________ ________________CsCrCuCu_K_K_K_K_K_KBoBoCrCL____________________ ________________CsCrCuCu_K_K_K_K_K_KBoCrCLCL____________________ ________________CsCrCrCuCYCY_K_KCBBoBoCrCLCL____________________ __________________CsCrCuCYCY_K_KCBBoBoCrCL______________________ __________________CsCrCuCuCY_K_KCBBoBoCrCL______________________ __________________CsCrCuCuCY_K_KCBBoBoCrCL_________A_A_A_A_A____ __________________CsCrCrCuCYCYCBCBBoCrCLCL_A_A_A_A_A_A_A_A_A_A__ ____________________CsCrCuCYCYCBCBBoCrCL_A_A_A_A_A_A_A_A_A_A_A__ __________CYBoBoBo__CsCrCuCYCYCBCBBoCrCL_ABoAqAqAq_A_A_A_A_A_A__ ______CYCYBoBoBoAqAqCsCrCuCYCYCBCBBoCrCLCYBoBoAqAqAqAT_A_A_A_A__ ____CYCrCrCrCrAqAqAqCLCLCLCLCLCLCLCLCLCLCYCYBoCrCrCrCrAT_A_A_A__ ____CrCrCLCLCrCrAqAqBoBoBoBoBoBoBoBoBoBoCYCYCrCrCLCLCrCr_A_A_A__ ____CrCLCLCLCLCrAqBNBoBoBoBoBoBoBoBoBoBoBoCYCrCLCLCLCLCr_A_A_A__ ____CrCLCL____CrBNBoBoBoBoBoBoBoBoBoBoBoBoBoCr_A_ACLCLCr_A_A____ ______________CrCrCrCrCrCrCrCrCrCrCrCrCrCrCrCr_A_A_A_A_A_A_A____ ____________CrCrCLCLCLCLCLCLCLCLCLCLCLCLCLCLCrCL_A_A_A_A_A_A____ ____________CrCL_A_ACLBb_z_A_A_A_A_ACLBb_z_ACrCL_A_A_A_A_A______ __________CrCrCL_A_zBZCL_A_A_A_A_A_zBZCL_A_ACrCrCL_A_A_A________ ________CrCrCL_A_A_A_z_A_A_A_A_A_A_A_z_A_A_A_ACrCrCL_A_A________ _______ACrCL_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_ACrCr_A_A________ _______A_A_A_A_A___________________________A_A_A_A_A_A__________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 28 (sink) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________BMC$_v_v_________v_vC$BM________________________ ____________C$BMC$_v_v_vC$BMBMC$_v_v_vC$BMBk____________________ ________C$CmBM_v_vBMC$_v_v_v_v_v_vC$BM_v_vBMCmBk________________ ______C$C$CmBM_v_vBMBMBMBM_v_vBMBMBMBM_v_vBMCmCoBk______________ ____C$C$Cm_a_f_vBMBM_k_kBMBMBMBM_k_k_kBM_v_f_aCmCmBk____________ ____C$C$_a_f_fBM_k_k_k_k_kBMBM_k_k_k_k_kBM_f_f_aCmCP____________ ____C$C$_a_f_f_k_k_v_k_k_kBMBM_k_k_k_v_k_k_f_f_aCmBk____________ ____C$C$_a_fBM_k_k_k_k_k_kBMBM_k_k_k_k_k_kBM_f_aCoBk____________ ____C$Cm_a_f_fBM_k_kBM_k_kBMBM_k_kBM_k_kBM_f_f_aCmBk_M_A_A_A____ ____C$Cm_a_f_f_k_k_k_k_kBMBMBMBM_k_k_k_k_k_f_f_aCmCJ_A_A_A_A_A__ ____C$C$_a_f_f_f_k_k_k_k_k_k_k_k_k_k_k_k_f_f_f_aCmBn_A_A_A_A_A_A ____C$C$_a_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_aCmBk_A_A_A_A_A_A ____C$C$Cm_a_a_f_f_f_f_f_f_f_f_f_f_f_f_f_f_a_aCmCmBk_z_A_A_A_A_A ____C$C$C$CmCm_a_a_a_a_a_a_a_a_a_a_a_a_a_aCmCmCmCJBn_A_A_A_A_A_A ______C$C$C$C$C$C$C$CmCmCmCmCmCmCmCmCmCmCmCmCmBkBn_z_A_A_A_A_A_A __________C$C$C$C$C$C$C$C$C$C$C$CmCmCmCmCVCPBk_A_A_A_A_A_A_A_A_A ________________C$C$C$C$C$CmCmCmCmCmCmCm_A_A_A_A_A_A_A_A_A_A_A__ ______________CPAlCPBkBkBdBdBdBdBdBdBdBDBk_A_A_A_A_A_A_A_A_A____ ______________CPCPAlCVBkCPBdBdBdBdBdBJBkBl_L_A_A_A_A_A_A_A______ ________________CPCPCPCVBkBkBkBdBdBkBlBm_z_A_A_A_A_A_A_A________ __________________CPCPCPCPCVBkCPBkCOBk_z_A_A_A_A_A______________ ______________________CPCPCPCPBkBk_B_B_A_A_A____________________ ___________________________A_A_A_M_A_A_A________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 29 (fountain) { ________________________________________________________________ ________BsAw______________BsBSAwAw________BsBs__Aw______________ ________BsBsAw__________BsBsBSBSAwAw__BsBsBsBSBSAwAw____________ ______BsBsBSAwAwAw____BsBsBSBSBSAwAwAwBsBsBSBSBSAwAwAw__________ ____BsBsBsBSAwAwAw__BsBsBsBSBSBSBSAwAwBsBsBSBSBSAwAwAwAw________ ____BsBsBsBSBSAwAwAwBsBsBsBSBSBSBSBsAwBsBsBSBSBSBSAwAwBsBsAw____ ____BsBsBsBSBSBSAwAwBs_HBSBSBSBSBS_H_H_HBSBSBSBSBSBSBsBsBsAwAw__ __BsAwAwBsBSBSBS_H_H_H_H_H_H_H_H_H_H_H_H_HBSBS_H_HBsBsBsBsBSAw__ BsBsBSAwAwBSBSBS_H_H_H_H_H_H_H_H_H_H_H_H_H_H_H_HBsBsBsBsBsBSAwAw BsBsBSAwAwBS_H_H_H_H_H_H_H_H_H_H_H_H_H_H_H_H_H_H_HBsBsBsBSBSAwAw BsBsBSBSAw_H_H_H_H_H_H_H_J_J_J_J_J_J_J_H_H_H_H_H_H_HBsBSBSBSAwAw BsBsBSBSAwAw_H_H_H_J_J_J_J_J_J_J_J_J_J_J_J_J_H_H_H_H_HBSBSBSAw_A BsBsBSBSBSAw_H_H_J_J_J_J_J_J_J_J_J_J_J_J_J_J_J_H_H_H_HBsAwAw_A_A BsBsBSBSBS_H_H_J_J_J_J_J_J_J_J_J_J_J_J_J_J_J_J_J_H_HBsBsBSAwAw_A _ABsBSBSBsBs_H_J_J_J_J_J_J_J_J_J_J_J_J_J_J_J_J_J_H_HBsBSBSAwAw_A ___A_ABsBsBSAw_J_J_J_J_J_J_J_J_J_J_J_J_J_J_J_J_J_HBsBsBSBSBSAwAw ___ABsBsBsBSAwAw_J_J_J_J_J_J_J_J_J_J_J_J_J_JAwAw_HBsBsBSBSBSBSAw _A_ABsBsBSBSAwAwAw_J_JBsBsBSAw_J_J_J_J_JBsBsAwAwAwBsBsBSBSBSBS_A _ABsBsBsBSBSAwAwAw_JBsBsBsBSAwAw_J_J_J_JBsBSAwAwAwAw_A_ABSBS_A_A _A_ABsBsBSBSAwAwAw_JBsBsBsBSAwAwAw_JBsBsBsBSBSAwAwAw_A_A_A_A_A__ ___A_ABSBSBSAwAw_ABsBsBsBSBSAwAwAwAwBsBsBsBSBSBSAwAw_A_A_A______ ___A_A_ABSBSAwAw_ABsBsBsBSBSAwAwAwAwBsBsBsBSBSBSAw_A_A_A________ _____A_A_A_A_A_A_A_ABsBsBSBSAwAwAwAwBsBsBsBSBS_A_A_A_A__________ _____A_A_A_A_A_A_A_A_ABsBSBSAw_A_A_A_ABsBsBS_A_A_A_A____________ _________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A______________ ___________________A_A_A_A_A_A_A_A_____A_A_A_A_A________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 30 (water) { _K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_k_k_k_g_g_g_g_g_k_k_k _K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K _K_K_K_K_K_K_K_K_K_K_K_K_k_k_k_k_k_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K _K_K_K_K_K_K_K_K_K_k_k_k_g_g_g_g_g_k_k_k_k_K_K_K_K_K_K_K_K_K_K_K _K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K _k_k_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_k_k_k _g_g_k_k_k_k_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_k_k_k_g_g_g _K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K _K_K_K_K_K_K_K_K_K_K_K_K_K_k_k_k_k_k_K_K_K_K_K_K_K_K_K_K_K_K_K_K _K_K_K_K_K_K_K_K_K_K_k_k_k_g_g_g_g_g_k_k_k_k_K_K_K_K_K_K_K_K_K_K _K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K _K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K _K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_k_k_k_k_k_K_K_K_K_K_K _K_K_K_K_K_k_k_k_k_k_K_K_K_K_K_K_K_K_k_k_k_g_g_g_g_g_k_k_k_k_K_K _K_k_k_k_k_g_g_g_g_g_k_k_k_k_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K _K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K _k_k_k_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_k_k_k _g_g_g_k_k_k_k_K_K_K_K_K_K_k_k_k_k_k_K_K_K_K_K_K_K_K_k_k_k_g_g_g _K_K_K_K_K_K_K_K_K_K_k_k_k_g_g_g_g_g_k_k_k_K_K_K_K_K_K_K_K_K_K_K _K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K _K_K_K_k_k_k_k_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K _K_k_k_g_g_g_g_k_k_k_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K _K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_k_k_k_k_k_K_K_K_K_K_K _K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_k_k_k_g_g_g_g_g_k_k_k_k_K_K _K_K_K_K_K_K_K_K_K_K_k_k_k_k_k_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K _K_K_K_K_K_K_K_k_k_k_g_g_g_g_g_k_k_k_K_K_K_K_K_K_K_K_K_K_K_K_K_K _K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K _K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_k_k_k_k_k_K_K_K_K_K_K _K_K_K_k_k_k_k_k_k_k_K_K_K_K_K_K_K_K_k_k_k_g_g_g_g_g_k_k_k_k_K_K _K_k_k_g_g_g_g_g_g_g_k_k_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K _K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K _K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_k_k_k_k_k_K_K_K } # tile 31 (ice) { _A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A _A_A_ABdBdCVBdCVBdBdCVCVCVBdCVBdCVBdBdBdBdBdBdBdBkCV_A_A_A_A_A_A _A_ABkBkCPCPBkCmBkBkCmCVCVBkCVBkCmBkBkCPBkBkCPBkCPCVCVCV_A_A_A_A _ABdBdCPBkBkCmBkCVCPBkCVCVCmBkCmBkCVCPBkBkCPBkBkBkCVCVCVCP_A_A_A _ABdBdBdBkCPCVBkCmBkBkCmCVCVBkCmBkCmBkBkCPBkBkCPBkCVCVCVCPBk_A_A _ABdBdBdBdBkCmBkCVCPBkCVCVCmBkCmBkCVBnCJBkBnBkCPBkCVCVCVBkCPCP_A _ABdBdBdBdBdCVBkCmBkBkCmCVCVBkCmBkCmBkBkCPBkCJBkBnCVCVCVCPCPBk_A _ABdBdBdBdBdBdCVBJCVBDBJCVCVCVBDCVBJCVAjBJAlBDAjBJCJCPCPBdBdBd_A _ABdBdBdBdBdBdCVAjCVAlAjCVCVCVAlCVBDCVBJAlBDAlBJAlCPBlCOBDBdBd_A _ABdBdBdBdBdBdCVAlCVBDBJCVCVCVBDCVAlCVBDAlBDAlBDAjCOBnCPBdBdBd_A _ABdBdBdBdBdBdCVBDCVAlAlCVCVCVAlCVBDCVAlBDAlBDAlBXBlCPCJBdBdBd_A _ABdBdBdBdBdBdAlCVBJCVBDBDCVCVCVBDCPBDCVAlBDAlBJAjCJCPBnBdBdBd_A _ABdBdBdBdBdBdBDCVAlCVAlAlCVCVCVAlCVAlCVBDAlBDAlBDBnCJCPBdBdBd_A _ABdBdBdBdBdBdAlCVBDCVBDBDCVCVCVBDCVBDCVBDAlBDAlBDCJBnCPBdBdBd_A _ABdBdBdBdBdBdBDCVAlCVAlAlCVCVCVAlCVAlCVAlBDAlBDAlCPCKBmBdBdBd_A _ABdBdBdBdBdBdBDAlCVBDCVBJBDCVCVCVBDCVBDCVAlBDAlBJBnCOCKBdBdBd_A _ABdBdBdBdBdBdAlBDCVAlCVAjAlCVCVCVAlCVAlCVBDAlBDAlCPBlCPBdBdBd_A _ABdBdBdBdBdBdBDAlCVBDCVAlBDCVCVCVBDCVBDCVAlBDAlBDBkCPCOBdBdBd_A _ABdBdBdBdBdBdAlBDCVAlCVBDAlCVCVCVAlCVAlCVBDAlBDAlCPCPBlBdBdBd_A _ABdBdBdBdBdBdBDAlBDCVBJCVAjBJCVCVCVBDCVBJCVAjBJAjCOBlCOBdBdBd_A _ABdBdBdBdBdBdAlBDAlCVAjCVBXAlCVCVCVAlCVAjCVBXAlBDCKCPBnBdBdBd_A _ABdBdBdBdBdBdBDAlBDCVBJCVAlBDCVCVCVBDCVBJCVAlBDAlBmCPCJBdBdBd_A _ABdBdBdBdBdBdAlBDAlCVAlCVBDAlCVCVCVAlCVAlCVBDAlBDCKBnCPBdBdBd_A _ABdBdBdBdBdBdAlBDAlBDCVBDCVAlBDCVCVCVBDCVBDCVAlCPBmCKCOBdBdBd_A _ABdBdBdBdBdBdBDAlBDAlCVAlCVBDAlCVCVCVAlCVAlCVBdBdCPBnCKBnBdBd_A _ABDAlBDAlBDAlBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBnCJCPCOBdBd_A _A_ABJAjBJAlBDBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdCPBkCPCKBd_A _A_AAlBDAlBDAlBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdCKCPBmCP_A _A_A_ABJAjBJAjBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBmCKCP_A _A_A_A_ABDAlBJBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdCP_A_A _A_A_A_A_AAlBDBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBd_A_A_A _A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A } # tile 32 (molten lava) { CuCuCuCuCuCuCuCuCuCuCuCuCzCzCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCu CuCuCuCuCuCuCuCuCuCuCuCzCzCzCFCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCu CuCuCuCuCuCuCuCuCuCuCzCzCuCuCFCFCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCu CuCuCuCuCuCuCuCuCuCuCzCzCuCuCFCFCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCu CuCuCuCuCzCzCzCzCuCuCuCFCFCFCuCuCuCuCuCuCuCuCuCzCzCzCzCuCuCuCuCu CuCuCuCzCzBsBsBsCFCuCuCuCFCFCuCuCuCuCuCuCuCuCzCzCzCzCzCzCzCuCuCu CuCuCzCzBsBsBsBsCFCFCuCuCuCuCuCuCuCuCuCuCuCzCzCFBsBsBsBsCFCFCuCu CuCuCzBsBsCuCuCuCFCFCuCuCuCuCuCuCuCuCuCuCzCzCFCFBsBsBsBsCFCFCuCu CuCuCzBsBsCuCuCuCFCFCuCuCuCuCuCuCuCuCuCuCzCzBsBsCFCFCuCuCFCFCuCu CuCuCzBsBsCuCuCFCFCFCuCuCuCuCuCuCuCuCuCuCzCzBsBsCFCuCuCuCFCFCuCu CuCuCuCFCFCFCFCFCFCuCuCuCuCuCuCuCuCuCuCuCzCzBsBsCuCuCuCFCFCFCuCu CuCuCuCuCFCFCFCFCuCuCuCuCuCuCuCuCuCuCuCuCzCzBsBsCuCuCFCFCFCFCuCu CuCuCuCuCuCuCuCuCuCuCuCuCuCuCzCzCuCuCuCuCuCzCFCFCFCFCFCFCFCuCuCu CuCuCuCuCuCuCuCuCuCuCuCuCuCuCzCzCuCuCuCuCuCuCFCFCFCFCFCFCuCuCuCu CuCuCuCuCuCuCuCzCFCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCu CuCuCuCuCuCuCzCzCFCFCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCu CuCuCuCuCuCuCFCFBsBsCuCuCzCzCuCuCuCuCuCuCuCuCzCzCuCuCuCuCuCuCuCu CuCuCuCuCuCuCuCFBsCuCuCuCzCzCuCuCuCuCuCuCuCzCzCzCFCuCuCuCuCuCuCu CuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCzCzCuCuCFCFCuCuCuCuCuCu CuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCzCzCuCuCFCFCuCuCuCuCuCu CuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCFCFCFCFCuCuCuCuCuCzCz CuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCFCFCuCuCuCuCuCuCzCz CuCuCuCuCuCuCuCuCzCzCzCzCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCu CuCuCuCuCuCuCuCzCzBsBsBsCFCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCu CuCuCuCuCuCuCzCzBsBsBsBsCFCFCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCu CuCuCuCuCuCuCzBsBsCuCuCuCFCFCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCu CzCzCuCuCuCuCzBsBsCuCuCuCFCFCuCuCuCuCuCuCuCuCuCuCuCuBsBsCuCuCuCu CzCzCuCuCuCuCzBsBsCuCuCFCFCFCuCuCuCuCuCuCuCuCuCuCuCuBsBsCuCuCuCu CuCuCuCuCuCuCuCFCFCFCFCFCFCuCuCuCuCuCuCuCzCzCuCuCuCuCuCuCuCuCuCu CuCuCuCuCuCuCuCuCFCFCFCFCuCuCuCuCuCuCuCuCzCzCuCuCuCuCuCuCuCuCuCu CuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCFCFCuCuCuCuCuCuCuCu CuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCFCFCuCuCuCuCuCuCuCu } # tile 39 (water) { _K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K _K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K _K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K _K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K _K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K _K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K _K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K _K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K _K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K _K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K _K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K _K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K _K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K _K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K _K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K _K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K _K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K _K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K _K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K _K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K _K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K _K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K _K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K _K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K _K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K _K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K _K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K _K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K _K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K _K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K _K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K _K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K } # tile 44 (bear trap) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________Cm____________Cm______________________ __________________Cm______Cm____________Cm______Cm______________ __________Cm______Cm____CmCm__________CmCm______Cm______________ __________Cm____CmCm__BkCPBkBkBkCPBkBkBkCm____CmCm______________ __________CmCmBkCPBkBkBdCPBkBkBdBnBkBkBkCPBkBkCPCm______Cm______ ____Cm____BkBkBkBnBwBk_A_A_A_ABd_z_A_A_ACPBdBkCPBkBk____Cm______ ____Cm__BkBkBk_A_A_A_A________Bd_A_______A_A_A_A_ABkBkCmCm______ ____CmBkBk_A_A________________Bd_A_________________ABkBkCm______ ____CPBk_A____________________Bd_A___________________ABkBk______ __CPBd_A______________BkBkCPBkBkBnCJBkBkBn_____________ABkCP____ __Cm_A________________CP______Bd_A______CJ_______________ABn____ __CmBkBkBkBkBkBkBkBkBkBdBkBk_ABd_ABkBkBkBkBkBkBkBkBkBkBkCmCP____ __Cm_ACm_A_A_A_A_A_A_A_A_A_A_ABd_A_A_A_A_A_A_A_A_A_A_A_ACVCP____ __Bk__Cm______________________Bd_A__________________Cm__CmCP____ __BkBkCmCm____Cm______________Bd_A____________Cm____Cm__BdCP____ ___ABkBkCm____Cm______Cm______Bd_A____Cm______Cm____CmCPBk_A____ _____ABkCP__CmCm______Cm______Bd_A____Cm______CmCm__CPCP_A______ _______ACPBdBkCm____CmCm______Bd_A____CmCm____CmBkBkCV_A________ _________ABkBkBnCPBkCPCmCm____Bd_A____CmBkCPCVCPBkBk_A__________ ___________A_ACJCPBdCPBdBkCVCPCmCPBnBkBkBkBkCVCP_A_A____________ _______________A_A_A_ABkBkCPCP_ACPCJBkBk_A_A_A_A________________ _______________________A_A_A_A_A_A_A_A_A________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 49 (fire trap) { __________________CuCu______________Cu__________Cu______________ __________________CuCu______________CuCz__Cu____Cu______________ ________________CuCfCzCu____________CuCu________CuCu____________ ____________Cu__CuCjCzCu______________Cu__________Cu____________ __________Cu____CuCfCuCu______________Cu______Cu__Cu____________ __________Cu____CuCz______________________CuCz______Cu__________ __________________Cu__Cu______CuCu__Cu____CuCuCu__CuCu__________ ______________________Cu________Cu__Cu______CuCu________________ __________CuCu__CuCzCuCu________Cu__CuCu______Cu________________ __________CuCu__CuCfCzCx__Cu________CfCu__Cu__Cu________________ ______Cu____Cu__CzCjCzCxCu__Cu____CuCjCzCuCu____________________ ______Cu______CuCuCfCzCxCu__Cu______CfCzCxCu______Cu____________ ____CuCu____CuCuCuCxCxCuCuCu________CxCzCxCu____CuCu____________ ____CuCzCu__CuCfCxCu__CuCuCu________CxCzCxCu____CuCu____________ ______CzCu__CxCjCxCx__CuCu______Cu__CzCfCzCuCu__Cu______________ ____CzCzCz__CxCfCzCxCx____Cu__CfCu__CzCjCzCfCu__Cu______________ ____CzCz____CxCzCjCyCx____Cu__CjCu__CzCfCzCjCu__________________ ______CuCu__CxCzCfCzCxCxCz____CfCu__CzCjCzCxCu__________________ ________Cu__CxCjC$CzCxCxCz__CjCu____CfCfCzCx____________________ __________CuCzCfC$CjCzCjCfCuCfCu__CzCjC$Cz____Cu________________ __________CuCzCjC$CjCzCfCzCuCxCzCzCzC$C$Cf____Cu________________ ________CuCfCzCfCjCjCzCxCxCxCzCzCfCzC$CfCjCzCxCu________________ ________CuCjCzCjCjC$CzCzCzCzCjC$CjCfCjCfCzCzCzCzCu______________ ________CuCfCzCyCjC$C$CjCzCzCfC$CfC$C$CfCzCjCfCxCu______________ ________CuCxCxCzC$C$CfCjCjCzCzCzCzC$CfCzCzCfCjCxCu______________ __________CuCxCfCzCfCjCzCjCjC$C$CjCzCjCzCzCfCuCxCu______________ __________CuCuCxCzCjCfCzCzCjC$CfC$CfCzCuCzCzCuCu________________ ____________CuCuCuCxCzCjCzCfCjCfCjCfCjCzCxCuCuCu________________ ________________CuCuCzCzCzCzCzCzCzCzCzCxCuCuCu__________________ ____________________CuCuCuCuCuCuCuCuCuCu________________________ ________________________________________________________________ ________________________________________________________________ } # tile 50 (pit) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______AeABAeAeAeBJAeAeBJAeAeABAeAeAeAeAeAeAeAeAeAeAeBJAeAe______ ______AeABAeBJAeAeAeAeAeAeAeAeAeAeABAeAeBJAeAeAeABAeAeAeAl______ ______BJABAeAeAeABABABAeABABAeAeAeABABAeAeAeAeAeAeAeAeAeAe______ ______AeAeABAeABAjAeAeAeAeAeAeAeAeAeAeAeAeABAeAlABAeABAeAe______ ______AeAlAeABAeAeAeAlAeAeABABAeAeABAeAeABAeAeAeAeAeAeAeAe______ ______BDAeAeABABABAeAeABABAeABAeAeAeAeAeABAeABAeAeAeAeAeBJ______ ______AlAeAjAeABABABAeAeAeAeABABABAeABABAeAeAeABABAeAeAeAB______ ______AeBJAeAeAeABAeAeAeABABAeAeABABABAeABAeAeABABAeABABAe______ ______AeAeAeAeAeABAeABAeABABABAeAeABAeAeABAeAeAeAeABAeAeAB______ ______BJAeAeAlAeAeABABABABAeABABABAeABABAeAeABABABABABAeAB______ ______AeAjAeAeABABABAeABAeABABAeABABAeABABABABAeAeABAeABAe______ ______AlAeAeAeAeAeAeABABABAeABABABABAeABABABAeABABABABABAB______ ______AeBJAeAeAeABAeABABABABAeABAeABABABAeABABABABABABAeAB______ ______AeAeAeBJAeABAeABAeABABABAeABABABAeABABABAeAeABAeABAB______ ______BDAeAeAeABAeABAeABABAB_MABAB_MABABABABAB_MABABABABAB______ ______AeAlAeAeAeAeABABABABABABABABABABAB_MABABABABABAB_MAB______ ______BDAeAeAeABAeABABAeABABABABAK_MABABABABABABABABABABAB______ ______AeAeBDAeAeABAeAeAB_MABABABABABABABABABAB_MAKABAB_MAA______ ______AlAeAeABABABAeABABABABAB_MABABABABABABABAK_MABABABAB______ ______AeAeAeAeAeABABABABABABABAKABAB_MAK_MABABABABABABABAB______ ______BJAeAeAeAeABAeABAeABABABABABABABABABABABABABAB_MABAB______ ______AeAeAlAeABABABABABABABABABABABABABABABABABABABABABAB______ ______AlBDAeAeAeAeAeAeABABAB_MABAB_OAK_MABABAB_MABABABAB_M______ ______AeAeAeBJAeAeABABAB_MAKABABABABABABAB_MAKABABABABABAB______ ______AjAeAeAeABABABABABABABABABAB_zABABABABABABAK_MABABAB______ ______BJAeAlAeABAeABABAeABABABABABABABABABABABABABABAB_zAB______ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 51 (spiked pit) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______AeABAeAeAeBJAeAeBJAeAeABAeAeAeAeAeAeAeBJAeAeAeBJAeAe______ ______AeABBJAjAeAlBDAeAlAeBJAeAeBJABABAeBJAeAjAeABAeAeAlBD______ ______AlABAeAeBJABABABAeABABAlAeAjABABAeAeAlAeAeBJAeAjAeAe______ ______AeAeABAeABAlBDAeAjAeBDAeAeAeAeAlBDAlAOAeAlABAeABBJAe______ ______AeBJAeAjAeAeAeAlAeAeABABAlAeABBDAeABAeAeAeAeAlAeAeAe______ ______AjAeAeAKAeAeAeAeABAeAlCpAeBDAeAeAeABBJABAeAeAeAeAeCY______ ______BJAeAlAeABABBJAjBJAeBDCYABABAeABABAeAeAjABABBDAeAeCY______ ______AeBDAeAeABABAeAeAlABABCYAeABABABABABAeBJABAeAeABABCY______ ______AeAeAeAeAeABAeABAeABCYCPABAeABAeAeABCYABABAeABAeAeCV______ ______AlBDAeABABAeAeABABABCVBnCYABABABABAeCYABABABABABAeCV______ ______AeAlAeAeABAeABAeABAeCPCPBkABABAeABABCVABABAeABAeABBo______ ______BDAeAeABAeAeAeABABABCVBkBkABABAeABABCYABABABABABCVCP______ ______BJAlAeAeABABAeABABABCVBoBkABABABABCYCPBkABABABABCVBn______ ______AjAeAeBJAeABABABABABCPBkBkABABABABCVBnBkABABABABCVCJ______ ______AlBJAjAeAeAeABABAOBkCPBkBDABABABABCVCKBoABABABABCPBk______ ______AeBDAaAeABABABABABCPBkBkBDBDABABABCVCOBkABABABABCPBd______ ______BDAlAeAeAeAeABABABBkCPBkBDBDABABABCVCPBkABABAB_MCPBk______ ______AeAeBJAeABABABABABBkBkBDBDBDABABABCVBkBDABABABABABBk______ ______AlAeAeAeABABABABABABBkBDBDABABABABCVBkBDABABABABABAB______ ______AeAeAjAeAeAeABABABABABABABABABABCPBdBkBDBDABABABABAB______ ______AjBJAeABAeABABABABABABABABABABABCPBkBkBDBDABABABABAB______ ______AeAeAlAeAeAeABABABABABABABABABABBkBkBkBDBDABABABCYAB______ ______AlBDAeAeBJAeABABABABABCYABABABABCPBkBkBDBDABABABCYAB______ ______BJAeAlABAeABABABABABABCYABABABABABBkBDBDABABABCYBoAB______ ______AjAeBDABAeABABABABABABCVBoABABABABABABABABABABCYCPCP______ ______BJAlBDAeABAeABABABABABCVCPABABABABABABABABABABCVCPBn______ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 52 (hole) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________________ABABABABABABAB______________________ ________________________ABABABABABAeABABABABAB__________________ ______________________ABABABABABABABABABABAeABAB________________ __________________ABABABAeABAeABABAeABAeABABABAeAB______________ ________________ABABABABABABABABABAeABABABABABAeABAB____________ ______________ABABABAeABABABABABABABABABABAeABABABAeAB__________ ____________ABABABABABABAB_A_A_A_A_A_A_A_A_AABABAeABABAB________ ____________ABABABAeABAB_A_A_A_A_A_A_A_A_A_A_A_AABABABAB________ ____________ABABABAB_A_A_A_A_A_A_A_A_A_A_A_A_A_A_AABAeAB________ __________ABAeABAB_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_AABAeAB______ __________ABAB_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_AABAB______ __________AeAB_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_AABAB______ __________ABAB_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_AABAB______ __________ABAB_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_AABAB______ ____________AB_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_AABAB______ ____________AB_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_AAB________ ____________AB_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_AAB________ ____________AB_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_AAB________ _______________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A__________ _________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A____________ ___________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A______________ _____________________A_A_A_A_A_A_A_A_A_A_A_A_A_A________________ ___________________________A_A_A_A_A_A_A_A_A____________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 53 (trap door) { ASASASASASASASASASASASASASASASASASASASASASASASASASASASASASASASAS ASASASASASASASASASASASASASASASASASASASASASASASASASASASASASASASAS ASASAAABAe_A_A_AAB_A_AAeABAe_A_AABABAeABABAeABAeABAB_A_AABAAASAS ASASAAAB_AAeAeABAeABAeABABABABAeAeAe_AABAe_AAB_AAeABAeABABAAASAS ASASAYAAABABABAeABAB_A_AAeAB_AAeAB_AABABABABAeABABAB_AABAAAJASAS ASASAJAAABABABAB_AABAe_AABAeABABAB_AAe_AABABABABABAeAeABAAAYASAS ASASAYAYAA_AAeAeAeABAe_A_A_AAB_A_AABABAe_A_AAeABAB_A_AAAAJAYASAS ASASAYAJAA_AABABAe_A_AAeAB_A_A_AAe_AABAe_AABAB_A_A_AABAAAYAYASAS ASASAYAYAYAAAB_AAB_A_A_A_AAB_AABAB_AAB_A_AAB_AABAB_AAAAJAYAYASAS ASASAAAYAJAAAB_A_A_AAB_A_A_A_A_A_AABAB_A_A_A_AAeAB_AAAAYAYAAASAS ASASAAAYAYAYAAAB_AAB_A_AAB_A_AAB_A_A_A_A_AAB_AAB_AAAAYAYAYAAASAS ASASAXAAAYAJAA_A_AAB_A_A_A_A_AAB_A_A_AAB_A_A_A_A_AAAAYAY_zAYASAS ASASAYAAAYAYAYAA_AAB_AAB_A_A_A_A_AAB_A_A_A_A_A_AAAAJAYAYAAAYASAS ASASAYAJAAAYAXAAAB_A_AABAB_A_A_AAB_A_A_AABAB_AABAAAYAYAAAYAYASAS ASASAYAYAAAYAYAYAAAB_A_A_A_AAB_A_A_A_AAB_A_A_AAAAJAYAYAAAJAYASAS ASASAYAYAJAAAYAJAA_A_A_AAB_A_A_A_A_A_AAB_AAB_AAAAYAYAAAYAYAYASAS ASASAYAYAYAAAYAYAYAAAB_A_A_A_AAB_A_AAB_A_A_AAAAYAYAY_zAYAYAYASAS ASASAYAYAYAJAAAYAJAA_A_A_AAB_A_A_A_A_A_A_A_A_zAYAYAAAYAYAYAYASAS ASASAAAYAYAYAAAXAYAY_A_A_A_A_A_A_A_A_AAB_A_AAYAYAYAAAYAYAYAAASAS ASASAAAYAYAYAJAAAYAY_A_A_A_A_A_A_A_A_A_A_A_AAYAYAAAYAYAYAYAAASAS ASASAYAAAYAYAYAAAYAY_A_A_AAB_A_A_A_A_A_A_A_AAYAYAAAJAYAYAAAJASAS ASASAY_zAYAYAYAJAAAY_A_A_A_A_A_A_A_A_A_A_A_AAYAAAYAYAYAJAAAYASAS ASASAYAYAAAYAYAYAAAY_AAB_A_A_A_A_A_AAB_A_A_AAYAAAJAYAYAAAYAYASAS ASASAYAYAAAYAYAYAJAA_A_A_A_A_A_A_A_A_A_A_A_AAAAYAYAYAYAAAYAYASAS ASASAYAYAYAAAYAYAYAA_A_A_A_A_A_A_A_A_A_A_A_AAAAJAYAYAAAJAYAYASAS ASASAYAYAY_zAYAYAYAY_A_A_A_A_A_A_A_A_A_A_A_AAYAYAYAYAAAYAYAYASAS ASASAYAYAYAYAAAYAYAY_A_A_A_A_A_A_A_A_A_A_A_AAYAYAYAAAXAYAYAYASAS ASASAAAYAYAYAAAYAYAY_A_A_A_A_A_A_A_A_A_A_A_AAYAYAJAAAYAYAYAYASAS ASASAAAYAYAYAYAAAYAY_A_A_A_A_A_A_A_A_A_A_A_AAYAYAAAYAYAYAYAYASAS ASASAJAAAYAYAY_LAYAY_A_A_A_A_A_A_A_A_A_A_A_AAYAYAAAYAYAYAYAYASAS ASASASASASASASASASASASASASASASASASASASASASASASASASASASASASASASAS ASASASASASASASASASASASASASASASASASASASASASASASASASASASASASASASAS } # tile 54 (teleportation trap) { ASASASASASASASASASASASASASASASASASASASASASASASASASASASASASASASAS AS_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_AAS AS_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_AAS AS_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_AAS AS_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_AAS AS_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_AAS AS_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_AAS AS_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_AAS AS_A_A_A_A_A_ACx_A_A_A_A_A_A_A_A_A_A_A_A_A_A_k_A_A_A_A_A_A_A_AAS AS_A_A_A_A_A_ACx_A_A_A_A_A_A_A_A_A_A_A_A_A_A_k_A_A_A_A_A_A_A_AAS AS_A_A_A_A_ACxCx_A_A_A_A_A_A_A_A_A_A_A_A_A_A_k_k_A_A_A_A_A_A_AAS AS_A_A_A_A_ACxCx_A_A_A_A_A_A_A_A_A_A_A_A_A_A_k_k_A_A_A_A_A_A_AAS AS_A_A_A_ACuCxCxCzCzCfCjCjCjCMCM_t_t_u_u_s_s_k_k_K_A_A_A_A_A_AAS AS_A_A_A_ACuCxCxCzCzCjCfCjCjCMCM_t_t_u_u_s_s_k_k_K_A_A_A_A_A_AAS AS_A_A_ACuCuCxCxCzCzCfCjCjCjCMCM_t_t_u_u_s_s_k_k_K_K_A_A_A_A_AAS AS_A_A_ACuCuCxCxCzCzCjCfCjCjCMCM_t_t_u_u_s_s_k_k_K_K_A_A_A_A_AAS AS_A_ACuCuCuCxCxCzCzCfCjCjCjCMCM_t_t_u_u_s_s_k_k_K_K_K_A_A_A_AAS AS_A_A_ACuCuCxCxCzCzCfCfCjCjCMCM_t_t_u_u_s_s_k_k_K_K_A_A_A_A_AAS AS_A_A_ACuCuCxCxCzCzCjCfCjCjCMCM_t_t_u_u_s_s_k_k_K_K_A_A_A_A_AAS AS_A_A_A_ACuCxCxCzCzCfCjCjCjCMCM_t_t_u_u_s_s_k_k_K_A_A_A_A_A_AAS AS_A_A_A_ACuCxCxCzCzCjCfCjCjCMCM_t_t_u_u_s_s_k_k_K_A_A_A_A_A_AAS AS_A_A_A_A_ACxCx_A_A_z_z_z_z_A_A_A_A_A_A_A_A_k_k_A_A_A_A_A_A_AAS AS_A_A_A_A_ACxCx_A_A_A_A_A_A_A_A_A_A_A_A_A_A_k_k_A_A_A_A_A_A_AAS AS_A_A_A_A_A_ACx_A_A_A_A_A_A_A_A_A_A_A_A_A_A_k_A_A_A_A_A_A_A_AAS AS_A_A_A_A_A_ACx_A_A_A_A_A_A_A_A_A_A_A_A_A_A_k_A_A_A_A_A_A_A_AAS AS_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_AAS AS_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_AAS AS_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_AAS AS_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_AAS AS_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_AAS AS_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_AAS ASASASASASASASASASASASASASASASASASASASASASASASASASASASASASASASAS } # tile 55 (level teleporter) { ASASASASASASASASASASASASASASASASASASASASASASASASASASASASASASASAS AS_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_AAS AS_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_AAS AS_A_A_A_A_A_A_A_A_A_A_A_A_A_A_ACu_A_A_A_A_A_A_A_A_A_A_A_A_A_AAS AS_A_A_A_A_A_A_A_A_A_A_A_A_ACuCuCuCuCu_A_A_A_A_A_A_A_A_A_A_A_AAS AS_A_A_A_A_A_A_A_A_A_A_ACuCuCuCuCuCuCuCuCu_A_A_A_A_A_A_A_A_A_AAS AS_A_A_A_A_A_A_A_A_ACxCxCxCxCxCxCxCxCxCxCxCxCx_A_A_A_A_A_A_A_AAS AS_A_A_A_A_A_A_ACxCxCxCxCxCxCxCxCxCxCxCxCxCxCxCxCx_A_A_A_A_A_AAS AS_A_A_A_A_A_A_A_A_A_A_ACzCzCzCzCzCzCzCzCz_A_A_A_A_A_A_A_A_A_AAS AS_A_A_A_A_A_A_A_A_A_A_ACzCzCzCzCzCzCzCzCz_A_A_A_A_A_A_A_A_A_AAS AS_A_A_A_A_A_A_A_A_A_A_ACfCjCfCjCfCjCfCjCf_z_A_A_A_A_A_A_A_A_AAS AS_A_A_A_A_A_A_A_A_A_A_zCjCfCjCfCfCjCfCfCj_A_A_A_A_A_A_A_A_A_AAS AS_A_A_A_A_A_A_A_A_A_A_ACjCjCjCjCjCjCjCjCj_z_A_A_A_A_A_A_A_A_AAS AS_A_A_A_AASASASASASASASCMCMCfCMCMCMCfCMCMASASASASASASASASAS_AAS AS_A_A_A_AASASASASASASASCMCMCMCMCMCMCMCMCMASASASASASASASASAS_AAS AS_A_A_AASASASASASASASAS_t_t_t_t_t_t_t_t_tASASASASASASASAS_A_AAS AS_A_A_AASASASASASASASAS_t_t_t_t_t_t_t_t_tASASASASASASASAS_A_AAS AS_A_AASASASASASASASASASASASASASASASASASASASASASASASASAS_A_A_AAS AS_A_AASASASASASASASASASASASASASASASASASASASASASASASASAS_A_A_AAS AS_AASASASASASASASASASASASASASASASASASASASASASASASASAS_A_A_A_AAS AS_AASASASASASASASASASASASASASASASASASASASASASASASASAS_A_A_A_AAS AS_A_A_A_A_A_A_A_A_A_A_A_u_u_u_u_u_u_u_u_u_A_A_A_A_A_A_A_A_A_AAS AS_A_A_A_A_A_A_A_A_A_A_A_u_u_u_u_u_u_u_u_u_A_A_A_A_A_A_A_A_A_AAS AS_A_A_A_A_A_A_A_A_A_A_A_s_s_s_s_s_s_s_s_s_A_A_A_A_A_A_A_A_A_AAS AS_A_A_A_A_A_A_A_A_A_A_A_s_s_s_s_s_s_s_s_s_A_A_A_A_A_A_A_A_A_AAS AS_A_A_A_A_A_A_A_A_A_A_A_g_g_g_g_g_g_g_g_g_A_A_A_A_A_A_A_A_A_AAS AS_A_A_A_A_A_A_A_A_A_A_A_g_g_g_g_g_g_g_g_g_A_A_A_A_A_A_A_A_A_AAS AS_A_A_A_A_A_A_A_A_A_A_A_K_K_K_K_K_K_K_K_K_A_A_A_A_A_A_A_A_A_AAS AS_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_AAS AS_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_AAS AS_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_AAS ASASASASASASASASASASASASASASASASASASASASASASASASASASASASASASASAS } # tile 56 (magic portal) { ________CsCsCsCsCsCsCsCsCsCsCsCsCsCsCsCsCsCsCsCsCsCs____________ ______CsCsCsCsCsCsCsCsCsCsCsCsCsCsCsCsCsCsCsCsCsCsBZ____________ ____CsCsCsCsCsCsCsCsCsCsCsCsCsCsCsCsCsCsCsCsCsCsBZBZ____________ ____CLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLBZBZ____________ ____CLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLBZBZ____________ ____CLCLCuCxCzCfCjCjCMCM_t_t_u_u_s_s_k_k_K_KCLCLBZBZ____________ ____CLCLCuCxCzCjCjCjCMCM_t_t_u_u_s_s_k_k_K_KCLCLBZBZ____________ ____CLCLCuCxCzCfCjCjCMCM_t_t_u_u_s_s_k_k_K_KCLCLBZBZ____________ ____CLCLCuCxCzCjCjCjCMCM_t_t_u_u_s_s_k_k_K_KCLCLBZBZ____________ ____CLCLCuCxCzCfCjCjCMCM_t_t_u_u_s_s_k_k_K_KCLCLBZBZ____________ ____CLCLCuCxCzCjCjCjCMCM_t_t_u_u_s_s_k_k_K_KCLCLBZBZ____________ ____CLCLCuCxCzCfCjCjCMCM_t_t_u_u_s_s_k_k_K_KCLCLBZBZ____________ ____CLCLCuCxCzCfCjCjCMCM_t_t_u_u_s_s_k_k_K_KCLCLBZBZ____________ ____CLCLCuCxCzCjCjCjCMCM_t_t_u_u_s_s_k_k_K_KCLCLBZBZ____________ ____CLCLCuCxCzCfCjCjCMCM_t_t_u_u_s_s_k_k_K_KCLCLBZBZ____________ ____CLCLCuCxCzCjCjCjCMCM_t_t_u_u_s_s_k_k_K_KCLCLBZBZ____________ ____CLCLCuCxCzCfCjCjCMCM_t_t_u_u_s_s_k_k_K_KCLCLBZBZ____________ ____CLCLCuCxCyCjCjCjCMCM_t_t_u_u_s_s_k_k_k_kCLCLBZBZ____________ ____CLCLCuCxCzCfCjCjCMCM_t_t_u_u_s_s_s_s_s_sCLCLBZBZ____________ ____CLCLCuCxCzCjCjCjCMCM_t_t_u_u_u_u_u_u_u_uCLCLBZBZ____________ ____CLCLCuCxCzCfCjCjCMCM_t_t_t_t_t_t_t_t_t_tCLCLBZBZ_A_A_A_A_A_A ____CLCLCuCxCyCjCjCjCMCMCMCMCMCMCMCMCMCMCMCMCLCLBZBZ_A_A_A_A_A_A ____CLCLCuCxCzCfCjCjCjCjCjCjCjCjCjCjCjCjCjCjCLCLBZBZ_A_A_A_A_A_A ____CLCLCuCxCzCfCjCfCjCfCjCfCjCfCjCfCjCfCjCfCLCLBZBZ_A_A_A_A_A__ ____CLCLCuCxCzCzCzCzCzCzCzCzCzCzCzCzCzCzCzCzCLCLBZBZ_A_A_A_A____ ____CLCLCuCxCxCxCxCxCxCxCxCxCxCxCxCxCxCxCxCxCLCLBZBZ_A_A_A______ ____CLCLCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCLCLBZBZ_A_A________ ____CLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLBZ_A_A__________ ____CLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCL_A_A____________ _____A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A______________ ________________________________________________________________ ________________________________________________________________ } # tile 62 (wall) { ____________________________C$C$C$C$____________________________ ____________________________C$C$C$C$____________________________ ________________________C$C$C$C$________________________________ ________________________C$C$C$C$________________________________ ____________________C$C$C$C$____________________________________ ____________________C$C$C$C$____________________________________ ________________________C$C$C$C$________________________________ ________________________C$C$C$C$________________________________ ____________________________C$C$C$C$____________________________ ____________________________C$C$C$C$____________________________ ________________________________C$C$C$C$________________________ ________________________________C$C$C$C$________________________ ____________________________________C$C$C$C$____________________ ____________________________________C$C$C$C$____________________ ________________________________C$C$C$C$________________________ ________________________________C$C$C$C$________________________ ____________________________C$C$C$C$____________________________ ____________________________C$C$C$C$____________________________ ________________________C$C$C$C$________________________________ ________________________C$C$C$C$________________________________ ____________________C$C$C$C$____________________________________ ____________________C$C$C$C$____________________________________ ________________________C$C$C$C$________________________________ ________________________C$C$C$C$________________________________ ____________________________C$C$C$C$____________________________ ____________________________C$C$C$C$____________________________ ________________________________C$C$C$C$________________________ ________________________________C$C$C$C$________________________ ____________________________________C$C$C$C$____________________ ____________________________________C$C$C$C$____________________ ________________________________C$C$C$C$________________________ ________________________________C$C$C$C$________________________ } # tile 63 (wall) { ____________________________C$C$C$C$____________________________ ____________________________C$C$C$C$____________________________ ________________________C$C$C$C$________________________________ ________________________C$C$C$C$________________________________ ____________________C$C$C$C$____________________________________ ____________________C$C$C$C$____________________________________ ________________________C$C$C$C$________________________________ ________________________C$C$C$C$________________________________ ____________________________C$C$C$C$____________________________ ____________________________C$C$C$C$____________________________ ________________________________C$C$C$C$________________________ ________________________________C$C$C$C$________________________ ____________________________________C$C$C$C$____________________ ____________________________________C$C$C$C$____________________ ________________________________C$C$C$C$________________________ ________________________________C$C$C$C$________________________ ____________________________C$C$C$C$____________________________ ____________________________C$C$C$C$____________________________ ________________________C$C$C$C$________________________________ ________________________C$C$C$C$________________________________ ____________________C$C$C$C$____________________________________ ____________________C$C$C$C$____________________________________ ________________________C$C$C$C$________________________________ ________________________C$C$C$C$________________________________ ____________________________C$C$C$C$____________________________ ____________________________C$C$C$C$____________________________ ________________________________C$C$C$C$________________________ ________________________________C$C$C$C$________________________ ____________________________________C$C$C$C$____________________ ____________________________________C$C$C$C$____________________ ________________________________C$C$C$C$________________________ ________________________________C$C$C$C$________________________ } # tile 64 (wall) { C$C$C$C$C$C$C$C$C$C$____________________________________________ C$C$C$C$C$C$C$C$C$C$____________________________________________ ________________C$C$____________________________________________ ________________C$C$____________________________________________ ________________C$C$____________________________________________ ________________C$C$____________________________________________ ________________C$C$____________________________________________ ________________C$C$____________________________________________ ________________C$C$____________________________________________ ________________C$C$____________________________________________ ________________C$C$____________________________________________ ________________C$C$____________________________________________ ________________C$C$____________________________________________ ________________C$C$____________________________________________ ________________C$C$____________________________________________ ________________C$C$____________________________________________ ________________C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$____________ ________________C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$____________ ________________________________________________C$C$____________ ________________________________________________C$C$____________ ________________________________________________C$C$____________ ________________________________________________C$C$____________ ________________________________________________C$C$____________ ________________________________________________C$C$____________ ________________________________________________C$C$____________ ________________________________________________C$C$____________ ________________________________________________C$C$____________ ________________________________________________C$C$____________ ________________________________________________C$C$____________ ________________________________________________C$C$____________ ________________________________________________C$C$C$C$C$C$C$C$ ________________________________________________C$C$C$C$C$C$C$C$ } # tile 65 (wall) { ________________________________________________C$C$C$C$C$C$C$C$ ________________________________________________C$C$C$C$C$C$C$C$ ________________________________________________C$C$____________ ________________________________________________C$C$____________ ________________________________________________C$C$____________ ________________________________________________C$C$____________ ________________________________________________C$C$____________ ________________________________________________C$C$____________ ________________________________________________C$C$____________ ________________________________________________C$C$____________ ________________________________________________C$C$____________ ________________________________________________C$C$____________ ________________________________________________C$C$____________ ________________________________________________C$C$____________ ________________C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$____________ ________________C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$____________ ________________C$C$____________________________________________ ________________C$C$____________________________________________ ________________C$C$____________________________________________ ________________C$C$____________________________________________ ________________C$C$____________________________________________ ________________C$C$____________________________________________ ________________C$C$____________________________________________ ________________C$C$____________________________________________ ________________C$C$____________________________________________ ________________C$C$____________________________________________ ________________C$C$____________________________________________ ________________C$C$____________________________________________ ________________C$C$____________________________________________ ________________C$C$____________________________________________ C$C$C$C$C$C$C$C$C$C$____________________________________________ C$C$C$C$C$C$C$C$C$C$____________________________________________ } # tile 70 (cmap / magic shield 1) { ________________________________________________________________ _________________________K_K_K_K_K_K_K_K________________________ ___________________K_K_K_K_K_K_K_K_K_K_K_K_K_K__________________ _________________K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K________________ _____________K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K____________ ___________K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K__________ _________K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K________ _________K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K________ _______K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K______ _____K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K____ _____K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K____ _____K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K____ ___K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K__ ___K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K__ ___K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K__ ___K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K__ ___K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K__ ___K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K__ ___K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K__ ___K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K__ _____K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K____ _____K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K____ _____K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K____ _______K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K______ _________K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K________ _________K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K________ ___________K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K__________ _____________K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K____________ _________________K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K________________ ___________________K_K_K_K_K_K_K_K_K_K_K_K_K_K__________________ _________________________K_K_K_K_K_K_K_K________________________ ________________________________________________________________ } # tile 71 (cmap / magic shield 2) { ________________________________________________________________ _________________________y_y_y_y_y_y_y_y________________________ ___________________y_y_y_y_y_y_y_y_y_y_y_y_y_y__________________ _________________y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y________________ _____________y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y____________ ___________y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y__________ _________y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y________ _________y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y________ _______y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y______ _____y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y____ _____y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y____ _____y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y____ ___y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y___________y_y_y_y_y_y__ ___y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y___________________y_y_y_y__ ___y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_______________________y_y_y__ ___y_y_y_y_y_y_y_y_y_y_y_y_y_y_y___________________________y_y__ ___y_y_y_y_y_y_y_y_y_y_y_y_y_y_y___________________________y_y__ ___y_y_y_y_y_y_y_y_y_y_y_y_y_y_______________________________y__ ___y_y_y_y_y_y_y_y_y_y_y_y_y_y_______________________________y__ ___y_y_y_y_y_y_y_y_y_y_y_y_y_y_______________________________y__ _____y_y_y_y_y_y_y_y_y_y_y_y_y__________________________________ _____y_y_y_y_y_y_y_y_y_y_y_y_y_y___________________________y____ _____y_y_y_y_y_y_y_y_y_y_y_y_y_y___________________________y____ _______y_y_y_y_y_y_y_y_y_y_y_y_y_y_______________________y______ _________y_y_y_y_y_y_y_y_y_y_y_y_y_y___________________y________ _________y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y___________y_y_y________ ___________y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y__________ _____________y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y____________ _________________y_y_y_y_y_y_y_y_y_y_y_y_y_y_y_y________________ ___________________y_y_y_y_y_y_y_y_y_y_y_y_y_y__________________ _________________________y_y_y_y_y_y_y_y________________________ ________________________________________________________________ } # tile 72 (cmap / magic shield 3) { ________________________________________________________________ _________________________w_w_w_w_w_w_w_w________________________ ___________________w_w_w_w_w_w_w_w_w_w_w_w_w_w__________________ _________________w_w_w_w_w_w_w_w_w_w_w_w_w_w_w_w________________ _____________w_w_w_w_w_w_w_w_w_w_w_w_w_w_w_w_w_w_w_w____________ ___________w_w_w_w_w_w_w_w_w_w_w_w_w_w_w_w_w_w_w_w_w_w__________ _________w_w_w_w_w_w_w_w_w_w_w_w_w_w_____________w_w_w_w________ _________w_w_w_w_w_w_w_w_w_w_w_________________________w________ _______w_w_w_w_w_w_w_w_w_w_w_____________________________w______ _____w_w_w_w_w_w_w_w_w_w_w_________________________________w____ _____w_w_w_w_w_w_w_w_w_w________________________________________ _____w_w_w_w_w_w_w_w_w__________________________________________ ___w_w_w_w_w_w_w_w_w_w__________________________________________ ___w_w_w_w_w_w_w_w_w_w__________________________________________ ___w_w_w_w_w_w_w_w_w____________________________________________ ___w_w_w_w_w_w_w_w_w____________________________________________ ___w_w_w_w_w_w_w_w_w____________________________________________ ___w_w_w_w_w_w_w_w_w____________________________________________ ___w_w_w_w_w_w_w_w_w____________________________________________ ___w_w_w_w_w_w_w_w_w____________________________________________ _____w_w_w_w_w_w_w_w_w__________________________________________ _____w_w_w_w_w_w_w_w_w__________________________________________ _____w_w_w_w_w_w_w_w_w__________________________________________ _______w_w_w_w_w_w_w_w_w________________________________________ _________w_w_w_w_w_w_w_w_w______________________________________ _________w_w_w_w_w_w_w_w_w_w____________________________________ ___________w_w_w_w_w_w_w_w_w_w__________________________________ _____________w_w_w_w_w_w_w_w_w_w_w_w_____________w_w____________ _________________w_w_w_w_w_w_w_w_w_w_w_w_w_w_w_w________________ ___________________w_w_w_w_w_w_w_w_w_w_w_w_w_w__________________ _________________________w_w_w_w_w_w_w_w________________________ ________________________________________________________________ } # tile 73 (cmap / magic shield 4) { ________________________________________________________________ ________________________CuCuCu__________________________________ __________________CuCuCu________________________________________ ________________CuCuCu__________________________________________ ____________CuCuCu______________________________________________ __________CuCuCu________________________________________________ ________CuCuCuCu________________________________________________ ________CuCuCu__________________________________________________ ______CuCuCu____________________________________________________ ____CuCuCuCu____________________________________________________ ____CuCuCuCu____________________________________________________ ____CuCuCu______________________________________________________ __CuCuCuCu______________________________________________________ __CuCuCuCu______________________________________________________ __CuCuCuCu______________________________________________________ __CuCuCuCu______________________________________________________ __CuCuCuCu______________________________________________________ __CuCuCuCu______________________________________________________ __CuCuCuCuCu____________________________________________________ __CuCuCuCuCu____________________________________________________ ____CuCuCuCu____________________________________________________ ____CuCuCuCuCu__________________________________________________ ____CuCuCuCuCuCu________________________________________________ ______CuCuCuCuCu________________________________________________ ________CuCuCuCuCu______________________________________________ ________CuCuCuCuCuCuCu__________________________________________ __________CuCuCuCuCuCuCu________________________________________ ____________CuCuCuCuCuCuCuCuCu__________________CuCu____________ ________________CuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCu________________ __________________CuCuCuCuCuCuCuCuCuCuCuCuCuCu__________________ ________________________CuCuCuCuCuCuCuCu________________________ ________________________________________________________________ } # tile 82 (explosion dark 0) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ _______________________________________________________z________ _________________________________________________________zABABAB _______________________________________________z________BkAlBdBk ________________________________________________BdBd__BD_M_MAAAl ________________________________________________Bd__AeAAAl_MA__M _____________________________________________z__Bd_MA_Al_MAK_M_z __________________________________________AeBDBkBD___O_z_MAlAA_O __________________________________________AO___MAA_MBDBdAlAl_MA_ __________________________________________AlBD_MBDA_BDBDBdA__A_z __________________________________________Ae_M_$BDBD_MAA_M_MAAAl __________________________________________AeAA_MBDBDAB_zAB_zAlAl __________________________________________ABBdBD_M_zBkBdAl_z_M_M ______________________________________________Bk_z_OAlBDAlAAAl_M _____________________z_________A_______A________Bk_z_MBdAl_zAl_$ _______________z______AlBdBkAe__________AOBkBd____BdAl_M_AAl_AAl _________________zAeAlBd_M_MAl__________Bd_z__BdABAOAlAlAlAlAlAl ________________AeAl_A_MAKBkAe___A______Bk_M_MBDBD_zABAl_zAlAlAl ________________AlBD_M_$AlAeBkAlBd____BdAlBdAK_z_BAB_z_zAlAlBkBk ________________Ae__BkBdBd_zBD_zBd__AO_MAl_M_AAl_AAl_ACPBkBkBkAl ________________AlBdAl_A_z_A_zBDBkAe_MBdAKAlAlCPCPBkAlBkBJBkBkAl ___________________z_A_z_A_z_A_zBd___$BDAlAlAlAlBdCPBkBkBlCPBDBk _______________________A_z_A_z_A_zBk_O_MAl_zAlCPAlBkAlBkAlBkAlBk _________________________ABdBdBkAB_zBDA_AA_MAlBkBkBkBkBkBkAlAlBJ ________________________Bd_M___zBkAOBkBd_MA_AlBkCPCPBkCPAl_zCPBd ________________________AO_MBDBDBDBD_M_zAA_M_AAlCPBkBkCPBkCPAeCP ________________________Bd_$_MBD_MAKAl_z_BAlAl_zAlBkCP_zAlCPBkBk ________________________ABBk_MAK_MAlBd_MAlAl_AAl_AAlAlAl_ABkAjBJ } # tile 83 (explosion dark 1) { ____________BdAl_MBd____________________________________________ ____________AeAK_MBd____________________________________________ ________ABABBkBD_MBkABAe________________________________________ _A______Bd_M_MAlAKBD_MAl_A______________________________________ __AeBkBdAB_zAB_zAlAl_MAKBkBdAl__BkAB_________z__AlBdBd__________ __Bd_z_M_MBDBdAl_MAlAA_MAl_MBdBdABBkAeBdBD_______ABkAe__________ _zBk_MAKBDAl_M_MAKAl_BAB_zAB_z_O_z_O_zAB_MAe___A_z_____A________ AlBkBdAl_z_M_zAl_z_O_$_M_A_MABAlBDAlBd_z_MAlAeAlAl_z____________ _M_zAl_OAB_zAl_z_OBdAlABAl_zAl_MABBd_MAB_MAKBkAlAl_A____________ _MAB_M_z_z_zAlAl_$AlBd_zAl_MAB_z_AAK_M_z_zAlAl_MBD_z____________ Al_z_M_$Al_z_M_z_MAB_M_MAlAl_MAB_M_M_$Al_z_OBkAAAl_A____________ _AAl_AAl_AAB_zABAl_z_A_$_O_$AlAlAB_z_A_z_MA_BdAlAl_____________z _MAlAlAl_M_z_MBdAl_zAlAl_zABBDBk_z_zAlAlAB_z_MAlBDBdBdBdBkBk_z__ _z_z_z_MAlAlAK_M_zAlAlAlAlBDBkAl_z_BAlAl_zAl_AAlAlBD_M_MAB_zBkAB _BABAl_zAl_M_z_zA__zAl_z_MBDBD_MAl_$CP_zAlAlAl_z_MAlAKAlBD_M__Al _zAlBDBDBdABAlAlAlAlAlAlAlBDBk_z_AAlBdCPBkBkBkAl_zAl_A_MBdAlBDBD AlBdBkBkAl_zAl_zAl_zAl_z_MBDBkABAlBkBDAlCPAlCPAlAlAl_M_$_MBd_zAB AlAB_MABAlAlAlAlAlAlAl_zAlBdBk_z_zBlBJBkBkAlBkAlAlAK_M_z_zAB_A_z _BAl_z_zCPBkCPAlAl_zAl_zBk_zAlAlAlBkBJAjBkBkBkCPAl_A_z_$_B_zAlAl _AAlAlCPBdBkBkBkBkBkAl_zAl_z_AAlBkBkAjCJBkBkBkBkBkAl_AAl_AAl_AAl AlBkBkBJAlBkAlBDBJAlBkAlAB_zCPBkBJAlBDAjBJBDBDAlBDBkCPAlAlCPAlAl BkBDBkBkBkAlBJBkAjBDBkAl_M_BBkAlAeAlAeAlAeAlAeAlAlBJBdCPBkCPAlAl CPAeAlBkBkAlAlAlBkBkBkCP_zAlBkBDBJAlAlAlAlAlAlBkBDBkBkBkCPAeAl_z BkCPBkBkBDAjAeAlBJBDBJCKAlCPBkAjAlAlAeBDAlAlBDBkBkBkBkBlBdCPAlCP BkBDAlBkAlAlAlAlAlAlAlBkBn_zCPBkAlAlAlBkBDAlAlBDBkBkAlBkCOAeCPBk BkBkBkAlBJABABAOAeAlAeBkCOAl_ABkAlBDAOAlAeAlAlBkBDBmBkBkBlCPBkCP BkBkAlAlAjAlABAlAlAlAlBkAjCKCPCPBkAlAlAOAlAlBDAlBkBxBJCPCOBkBkBk BDBDAeAlAeABAeAlAeAlAjBJAeAlBdCPBkBJAeAOAeAlAeBDBkBJAjBkBkAjAeBJ BkBDAlAOABABABAlAOAlAlAlAlAlBkCPAlAjAlAlAOAlAlAlBDAlAlBDAlAlAlAl BkAlAOAHAOABABAlAOAOAeAOAeBJBkBkAeAlAeAlAeAlAeAlAlAlAeAlBDAlAOAl BkAlAlABABABAlAlAOAlAlAlAlAlBnCKBJAlAlAlAlAlAlAlAlAlAOAlAlAlAOAl BDBDAeAlABABAOAOAeAOAeAlAeBkBkCPAeAlAeAlAjBJAeAlAOAOAeAlAeAOAeAl } # tile 84 (explosion dark 2) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ___________A_z_A_z______________________________________________ ________AeBkBD_MBk______________________________________________ ________Bk_MBkBDBd______________________________________________ AeAlAe__BkAl_______z____________________________________________ AlBD_MABBdBD_z__________________________________________________ AlAlAlBkBdAe_______z____________________________________________ BkBdAl_zBk_ABdBkAl______________________________________________ _$_MBd_MBkAlAl_zBk_zAeABAe_z____________________________________ Al_zAAAl__BDBDBDAlBDBDBDAlBD____________________________________ _A_zAlBkBD_MBdBkBd_MBDAA_M_MBd_____z____________________________ Al_z_MA__M_$_MAA_M_$_MA__MAlAABkAB______________________________ _z_z_A_zAlAlAlAlAlAlAlAlAlA_Al__Bd______________________________ Al_zAl_zA__zAlAlAlAlAlAlAl_MBk_zAl___z__________________________ BkCPBk_z_AAlBkCPBkAlAlAlAl_MBkBDAlAe____________________________ CPCPCPCPAl_zCPAlAlAlAlAlAl_$AlBd_MAl_z__________________________ COBlAeBdCPAl_AAl_zAlAlAlAlAlAl_MAK_MBk_z________________________ BkBkCOBkBl_z_MAlAl_zAlAlAlAl_M_$_MAlBk__________________________ BkAlBDBk_AAlAAAlAl_zAl_z_AAl_AAlAK_MBDBd_ABdBD_________z________ BkBkBDBkAl_z_MA__MAlAl_MAA_MA__M_MBD_zABABBkAlABAlAeAB__________ BDAlAlBkAlA_AA_M_z_zAl_zA_Al_MAABdAl_M_MAe_zBD_M_M_zBk__________ AlAlBDCPAe_z_MA_AlAlAl_z_z_MAlA_AlAlBDAeAB_A_zBkBdBkBd__________ AeAlAlCPAlAl_A_zAlAlAlAlAlAl_z_M_MAABDAl_A_z___________z________ } # tile 85 (explosion dark 3) { ____________________ABAe____BDBDBD_MAl_MAl_zCPCPBkAlCPAlCPBdBDAl _______________z____BkBk____ABBk_M_z_z_z_zAl_ACJCPBnBkBkCPAlBkBk _________________zBD_MBd______BDA_AlAl_z_M_zAlBkBkBkCJCPBkBkBkBD ________________ABAK_MBd_____ABk_MAl_z_M_AAl_ACPBkCPBlCOBlBkBJAO ________________Al_MBd_____ABkBDAl_z_z_zABAlAlCPBkCPBmCPCPCOAjAl _________________ABdAB______Al_zAB_M_AAlAl_z_ABkCPCPBkBkBdBlBkAl _______________A________ABBDAlAl_M_$_O_zAlAlAlCPBkCPBkBDBJBkBkBk __________________AeAe__AO__BDBk_MAlAK_MAlAlAlCPBkBkBDBkBkBkBkBD _____________z___zAlAlAOAl_MAB_zABAl_B_zAl_zCPBdBkBkAlBkBkBkBJAl ______________AeBD_M_zBd_ABdBD_MAlAl_AAl_zCPBkBkBkBJAeBDBkBlAeAl Bd_AAlAe__BD_zBk_MAlAABDAB_ABk_zAlAlAl_zCPBdBkBkBlBJAlAlBJBJAlAl _MABBkAl_ABkAOBd_zA__MAlBDABBD_z_AAlCKBkAlBkBDCOBkAjAeAlAlAjAeAO ___ABk_zAlAe_zBkAlABBk_M__BDBk_zAlCPBkBkBDBkBkAjCJAjAlAlAlBJAlAl Bd_zAlBkBk_z_A_zAO_zAlAlBd_MAl_z_ACOAjBJBkAlBDBkBkBkBJAlBDAlAlAl ____________AlAeAB_ABkBkABBkAB_zCPBlCJBMBJAjBJAlBlBJBDAlBDAlBDAl ____________Bk_zAl_z_zBdBDBk_AAlBkCPAlBkAlBxAjCOBkAlAeAlAeAlAeAO _________zBk_M_zBDBdBdBkAlAl_zAlCPCOBnCPBkBkCPBdBlBJAlAlAlAlAlAl ________AB_M_ABDAA_MAB_M_zA_AlAlBnCKBkBkBkCJBkBkAlBDAeAlAlAlABAO _________zAlAB_z_OA__z_zAlAlAl_zCPCOBkBkBnBkCPBkBkBDAlAlAlAlABAO _________ABkAlAl_M_z_AAlAlAlAlAlAeCPBkCPBkCPAlCPBkAlAeAlAeAOAOAB ______AOBkBDAl_zAl_zAl_zAlAl_zAlCPBkCPCKCOAlBlCOBkAlAlAlAlAlAlAl ______Bd_$BDAl_zAlAlAlAlAlAl_AAl_zAlAlAl_ACPBkBkBkBDAeAlAOAOAeBJ ______BD_MBDAl_M_$Al_MAlCPCPAl_z_BAlAlAlAlAlBkBkBDAeAlAlAlAlAOAl ____BdBkBDAlAB_z_A_z_zAlBkBkAl_z_AAl_AAl_ABnCOBlAlAlAeAlAeAlAeAO ____Bk_$_M_z_BAlAl_z_M_$AlCPCP_zAl_zAl_zCPCJCPBkBJAlAlAlAlAlAlAl ____Bk_MAlAB_AAlAlA_Al_zAlAlAlAlAlAlAlAlCOBlBkBkBkAjAeAlAeAlAeAO ____BkABBD_z_M_$Al_zAl_MAlAlAl_zAlAlAlBkCPBnCJBkBkBJAlAlAlBJAlAl _____ABd_$_M_A_z_A_z_MAl_ACPAlAlAlCPAlCPBkCKBmBlBJAjAeAlAeAlAeAl ___A_z_ABkBd_z_z_M_$_zAlAlCPBk_zAlBnCJBnAlCPCOBkBkBkAlBJAjAlAlAl _____A____Bk_MAB_MAlAl_MAlAlBkAlAlCPBkAl_zBkBkAlBDBJAeBDAlAlAeAl ________ABBD_zBD_zBDBDAlAl_zAlAlCPAeCP_zAlCPBkBkBDAlBlAlBJBkAlAl _________AAeAeBkBDAeBkAlAlAlBkAlBkCPBkAl_ACPBkBDAlBJBkAlAeAlAeAl } # tile 86 (explosion dark 4) { AlAlBJAlABAlAOAOABAOABAlAlBkCPAlABABABAlAlAlAOABABAlABAOABAOABAO BkBkBkAlAeAlAeAlAOAOAeBJBkBkBkBkAOABABAaAlBDAeAKABAOAOAlAeAOAOAl BkBkBDAlAlAlAOAlAOAOAlAlAlBkCPBkAlAOABABABABAlAOABAlAOAlAlAlAlAl AlBkBkAlAeAlAeAlAeAOAOAlAjBJAlBDAeAlABABABABAOAOAOABAeAlAeAlAeBJ AlBkBJAlAlAlAlAlAlAOAlAlAlAlAlAlAOABABABABABAlAOABABAlBJAlAlAlAj BkBkAeAOAeBDAlBDAlBJAeAOABBJBkAlABABABABABABABAaAOAlAeAlBDBkAeBJ BkBkAlAlAlAlBJBkAjBJAlAOABAlAlAlABABABABABABABABAlAOAlAlCPBkBlBJ BkBDAeAOAeAlAeBkAeAlAeAlAjAlAOAlABABABABABABABABABABABAlBkBkBkAl AlAlAOAlAOAlAlAlAOAlAlAlAOAlAOAOABABABABABABABABABABABBDCPCPAlAl AOAOAOAaAeAlAeAOAeABABAlAeABAOAlABABABAaABABABABABABAeAlBdBJAeAO AOAlAlABAlAlAOAlAlABABAlAlABABAlABABABABABABABABABABAlBkBDAlAlAl AeAlAOAOAeAlAeAOAeAOAOAlAeAlAeAOAeABABABABABABABABABAOAOAjBkAeAB AlAlAOAlAlBDAlAlAlABABAlAOAlAOAlAOAlABABABABABABABAlABABBJBkAlAB AeAlAeAlBDAlAeAOAeAlABAHABABABAaAeAlABABABABABAaABABABAlAeBJAeAa AlAlAlAlAlAOAlAlAlAlABABABABABABABBJAlABABABABABABABABAlAOAlAlAl AeAlAeAlAeABABAlABABABABAeABABABABAlAjAlABAOABABABABABABAjBkAeAl AOAlAlAlAlAOABAlAlAOAlAOABABABABABABABABABAlABABABABABAOBJAlBDAB AOAOAeAlAeAlAeAlAeAOAeAOABABABAHABABABAHABAOABABABABAOAlAeAlAeAl AOAOAlAlAlAlAlAlAlBJABABABABABABAOABABABAOAlABABABABAlAlAlAlAOAl AOABABAOAeAlAeAOAeAOAOABABABABABAeABABABAeAOABABAeAOAeAlAeAOAeAB AlAlABABAlAlAlAlABABABABABABABABABAOABABABAlAlAlAlAlABAOAOAOABAB AeABABABAOAlBJAlABABABAHABABABAOABABABAOABAOAOAOAeAOABAaAOABABAK ABABABABAlAlAlAlABAOAlABABABABABABABABABAOAlAlAlAOAlABABABABAOAB ABABABABAOAlBDBkAeABABABABABAeAlABABABABABABAeAlABABAeABABABABAB ABABABABAlAlAlAlAlABABABABABABABAlABABABABABAlAlABABABAOAlAOABAO ABABAeAaAeAlAeAlABABABAOABABABAHAOABABAHABAlAeAOAOABABABAeAOABAa AOAlAOAlAOAlAlAlAlAlABABABABABABABABABABABAlAOABABAlABABABABABAB AeAlAeAlAeAOAeAlAeABABAlABABABABABABABABABAOAeABABAOAeAOAOABABAB BJAlAlAlAlABABAlAlABABAlABABABABABABABABABAlAOABABAlAlABABABABAO AjAlAeAlBDABABBJAeAlAeAlABABABAOABABABAOABAOABAKABAlABAaABABABAl AlAlAOAlBkBDAlBkAlAlAlAlAOABABABAOABABABABAlABABABABAlAlAOAlAOAl AeAlAeAlAeAlAeBkBkBJAeAlAeAlAOABABABABABABABABAlABABABABABAOAOAO } # tile 87 (explosion dark 5) { AlAOAlCPCPAeAl_zAlAlCPCPBkCPAl_z_M_MAA_zAl______________________ AeAlAlCPBkCPAlAl_zCPBkCKBmCPBkAlAlA_AlBDAO___A__________________ BJAjBkBkBkCPCP_ACPBkCPCPCKBmAlAlAl_MBkBdBkAe____________________ BkBkBkBDBJBkBkCPBkCPAeCPBkAl_zAlAl_MAlAl_ABd____________________ BkBkAlAlAlBkBkBkBJBkAlBnCP_z_BAlAl_$_MAl_MBk____________________ BkAjBJAlAjBDAeBJAjBkBkBkAlAl_zAl_zAl_AAABdBkBdBkAlBd____________ BJAlABAlAlAlAlBkBkBDBkCPAlAlAlCPAl_z_MA_AlBD___zAlAe____________ AeAlABABAOAOAeAlBDBkBkAlBkCPAeCP_AAl_AAl_MAlBDAl_A___A__________ AlAlAlABABAlAlAlBJBkCPAlAlAlAl_zAl_zAl_MAKBd_MAlAl______________ AeABAeAOAOAlAeAlBDBkBkAlAlBkAlAeCPAl_A_zBdBk_M_zAe______________ ABABAOAlAlAlAlBkBlBkCP_zAlBkCPCPBkCPAlAl_MBDAlBk_z______________ ABABAeABABAOAeBJBJBkAlAlAlAlBkCPBkCPAlAlAl_$Bk__________________ ABAOABAOAOAlAOAlAjBkCP_zAl_zCPBkBJBnAlAlAl_zAlBdAB___z__________ ABAOABAHAOAOAeAlAeBkBkAl_zAlBkBlBkBJBdCPAl_z_M_zBd_z_A_z________ ABAOABABABAOAOAlBJCPAl_zAl_zCPCOBkBkBkCPAl_zBkBk_MBDAB__________ AeABABAlAOABAeBJBlBk_AAlAlAlAlBlBkAlBkCP_AABBd_zAl_zBk__________ ABAOABAlAlAOAlBkCP_zAlAl_MAlCPCOCPAlCPAe_M_zBk_zAlBdAl__________ ABAOAjBJAeBDBkCPBkAl_AAl_$_zBkCPAeCPBkAl_zAlBdAe_______z________ AlAlBkBkBkBkBkCPCPCPAe_z_BAlAl_zAl_zAlAl_MAB_MBDAB______________ ABBJBkCPBlBkBkAlBdAl_AAl_z_MAlAlAlAlAlAB_zAlBD__Ae______________ AOAlBkBJBkBkBmBDBkBkAl_z_MAB_z_z_M_M_z_MAlBD_MBDAl______________ ABABAlAlAeBDAlBJBkCPBkAlAl_zAlABAlAlBdABBDA_AA__Ae______________ ABABAlAlAlAlAlBDAlBkCPAlAlAl_M_z_MAlAlBD_M_M_MAlAl______________ AOAlBJAlAeAlAeAlAeBkBkAlAlAlAlAl_A_$_zBkBkAlA_AlAB______________ AlAlAlAlAlAlAlAlBDBkBkCPAlCPCP_zAl_zAl_OAlBDAl_MAB______________ AeAOAOAlBJAlAeAlBJBlBkAlAeAlBkCPAlAlAlAlAAAlBDAlAO______________ ABAlAOAlAlAlBkBDBkCPAlAlAlCPBl_zAl_zAlAl_MAl_zABAl______________ AOABAeAlAeAlBDBDBkAlBkAlBkCPBkCPBkAl_A_z_A_$_MBDAB______________ AlABAlAlAlAlBkCPCPCPCPBkCPAlBk_$CPAlAl_zAl_zAlBDAB______________ AOABAeBDAlCP_AAeCPBkBkBkBkAlBkAlAlAl_AAl_MAlAA_MAe______________ ABABAlBkCPBn_z_zAlAlCPBkBkBkAlAlAlAlAlAlAlBD__BDAB______________ AeAlAeBkAlAlAlCPBdCPAlCOBkAlAlCPAlAl_A_$_MBdBDAl_A______________ } # tile 88 (explosion dark 6) { ______________Bk___ABk_M_MAlCPAlAlCPAlAlAlBkBkBkBkBDBkBkAlAlABAO ______________BdBd_zBkAB_$Al_AAlAlAlAlAl_zCPBkCPCPBnCPBkBkBJAeAO _______________AAl____Bd_M_M_z_zAlAl_MAlAlCPCPBkCPBkCJAjBJBkAjAl _____________A________ABBdBdBd_M_A_z_A_zAeCPBkAl_ACPBkCPBkAlBkBJ _______________________ABdBDBkBk_z_OAl_MAlBkCPCPBkBlCPAlCPBkBkBk ______________________Bd_z_M_AAeABAlBDAl_$AlBkBlCOAlAeCP_zAlAeAl _____________z__________Bk_MAl_ABdBDBDBkAlAlCPCOCPAlAl_zAlBkBDAl ______________AlBkBkBkAB_zBdAe_zAOAlBDAl_AAlBkAl_A_z_AAlAeCPBkBk ______________BD_z_z_BBk_z_A_z_ABd_z_MAKAlAlAl_z_MAlAl_zAl_zCPBk ______________Bd_z_M_zBd_A_z_A_zBD_MBDAl_M_B_AAlABBkBd_M_zAlBkBk _________zBkAlAl_MBDABBk_z_A_zAeAlAKBDAl_z_$_M_zAlBkAlAl_M_$CPBk ________AB_MAlAl_z_M_zBk_A_zAeAl_MAlAlAB_M_z_A_zAl_z_MAK_M_z_ACP _________zBdABAB_MAK_MBD_zABAl_MAl_z___zAlAB_z_z_MABAl_zAlAl_zAl __________AB_A__Ae_zBk__ABBkBD_MAK_OBDAl_MAl_MAlAB_z_M_zAB_B_A_z __________________BD_z__Bd_z_M_$AlBDBD_zA__MAKAl_M_MAK_M_MAl_MAB _______________z________AeBkBDAlAe_$_MAlBkBk_M_zAB_$_MAl_$AlAl_z __________________________________ABAlBD__ABAlBD_M_MAlABAlBdBDAl ___________________________________zAe_z____AeBk_zAB_$_M_z_zBDBD _________________________________________z____BD_O_MAl_zBkBd_M_M ______________________________________________Bk_$BkAB_MAeABAlAl ______________________________________________Bd_M_zAlAlBd__ABBD ______________________________________________Bk_$_MAK_MBD__AK_M _________________________________________z____Bd_MAl_MAlBd___zBk ___________________________________________zAeAlAKAlAl_MBd______ __________________________________________AeAl_M_MBDBDAO________ ___________________________________________zBDAlAlA_AAAB___z____ _________________________________________z____Bk_M_M_zAe________ ______________________________________________Bk_zABBDAl________ ______________________________________________Al_MBDAB_A________ ______________________________________________BdBkBd_____A______ ________________________________________________________________ ________________________________________________________________ } # tile 89 (explosion dark 7) { AlAlAlAlAlABAOBkBJAlAlAlABAOAOAOABABABABABABABAOABABABABABAOABAB AeAlBJAlAeAlAeAjAeAlAeAlBJAlAeAOAeAlABAKAOAOAOAlBJAlAeAOAeAlAjBJ AlAlAjAlAlAlAOBJAlABABAlAlAlAlAOABABABABAOAOAlAlAlAlAlAlAlAlBJBk BDAlBJAlAeAlAOAlAeAlAOAlBJAjAeAlABABABABABABAeBJAjAOAeAlBDAlBDBk BkBkBDAeAlAlAOAlAlAOAlAlAlAlAlAlABAOABABABABAlAlBkBDBkBkBkBkBkBD BDBkBkAlAeAlAOAlAlABABAOAeAlAeAlAeABABAaAeAOAeAlBDBkBkBkCPBlBkBJ BJBkBlBkAlAlAlAlAlAlAlAlAlAlAlAlAlAOABABAOAlAlAlAlBkBDBkCPCOBkAl AjBJBkBkBkBJAeAlAlBDAeAlAeAlAeBJAeAOAOABAeAlAeAlAeAlBDBkBkCPBkBD BJAlBDBJBlBJAlAlBDAlAlAlAlAlAjBkAlAlAOAlAOAlAlAlAlAlBJCPAl_ACPBd BkBkBkBkBkAlAjBkAeBDBkAlAeBJBkBkBDAlAeAlAeAlAeAlAeAlAeBk_zAl_ABk CPCPBkBDAlBkBJBkAlAjBJAlAlAlAlBkBkBkAlAlBJAjBJAlAlAlAlBkAl_zAlCP _AAlAlBkBkBDBkBkBkBkBkAjAeAlBDBkBDBkBJAjBkAlBkAlAeAjBDBk_A_z_ACP Al_zAlCPBkBkBkBDBkBDBkBkCJBkBlBkBkBkBkBkCJBkBlBJBkBkBJCPAl_z_BAl AlAl_ACPAlAlAlBkBkBkBJBDBMBkBJBJBkCPBkCPAlCPBkAjBDBJBkBnAl_$_M_z _zBkAlAlCPBkBkBDAlBkBlAlAlBkBlCPBmBxCPAlAl_ACPBkAlCPCKAl_z_OBkA_ AlAlAlAlAeCPBlBkAlBkBkAlAlBkBkAlAlCPAl_z_AAlAeCPBdCPBkCP_B_zBdAl _MAlAl_zAl_zAlAlAlBkCOAlBDCPAlAlCP_AAl_M_M_$AlAlCPAeCPBmAl_z_MAl AlA_AlAlAA_MAlAl_$AlBkCPBlCOAlAlAlAl_A_$_M_zAlCKAlAlAlAlAlAlBdBk Al_zAl_MAlBkABAl_M_$AlBkAlAlAl_zAl_z_MAlAl_MAlAlAl_z_MAlAlA_AlBD _M_zAlA_BdAlBDBkBd_OAlAl_AAl_A_z_A_MAABkBdAl_AAl_A_z_zAl_AAlBD_M Al_MAA_MBDBDBDBDBk_$A__zAlAl_B_MAlBDAlA_Al_MAl_z_M_M_zAl_MAlAlAA _MAlA__MAlAl_$_M_z_B_A_M_z_zAlAlABAl_z_M_MAlAK_M_zA__A_z_zAK_MAl Al_z_MAAAl_MAB_zAl_z_M_$A__zAlBDAlBdABAlAl_z_M_$_O_zAlAl_z_M_zAB BdAK_MBDAlAB_z_M_AAA_AAl_A_MBdBDBDBD_zAlAl_z_AABAl_M_AAl_AAlAlAl __AeAl_MAlAlAlABAl_MA__MAABdBD_M__AlAl_zAl_M_$_MAlAK_B_MAB_MABBd BdAl_zAl_z_z_M_z_MA__NA__MBkBDAK_M_zAB_MAA_MA_Al_M_zAB_$_M_zBkBD Bd_MABBD_M_$AB_MAA_z_MAAAlBD_M_zBkBkBkBdBkBkBkBD_MAB_M_zABAl_MBD __Bd_zBDBd_M_AA__M_zAl_MBd_zABBk____________BdAA_A_z_A_z_zAlABBd __Bk_MBDAAAlBkBd_M_$A__MAB_MBkAB____________Bk_z_M_$_B_MAl_MBd_A __Bd_zA__A_MAlAlAB_z_AAlAlABBk______________BdAB_O_$_MAKAlBd____ __AeBkBdBkBdBDAl_z_O_MAl_zAlBd______________BdBD_zAB_MAlBd_____A ______________ABBDAlBdAl_MBd__________________Bd_OBk_zBk________ } # tile 90 (explosion dark 8) { AlAlAlBJBn_$CPCPBkCPAlBkBkAlCPBkAl_zBkBDBkAe______AB____________ AeAlAlBkBkBkBkCPAlCPBkCPAlCPBkAlAl_MBD_______A__________________ BJAlBlCPCPBkCPBkCPAlAlAlAl_zAlAlAB_zBk__________________________ BkBJBkBkBkBkBkCP_AAlAlCPBkAlAl_zBDBk_OBkAe______________________ BkBkBDBkCJAjBJBlAl_zAlAlAlAl_z_zBDBDAl_zBd______________________ BDBkBkAlBkBJAlCP_zCPAlAl_z_B_AAB_MAlBDAlAe______________________ BJBkBkBkBlBkCPBkAl_zAl_z_zAl_M_z_zABBkBDAl______________________ AjBkBkBmBkBkBkAl_AAlAlAl_MAlABAlAl_zAl_MAO___A__________________ BkBDBJCKCPAlCPAlAlBkAlAlAB_z_zAlAlAl_MBDBk_A____________________ BDBkAjBkBkBkAjBJBkAl_A_z_zA__O_zAl_zAKBD_MBd____________________ AlBJBkBDBJBkAlBkCPAl_M_MBkBd_M_$Al_MBD_M_$_MBk__________________ BkBkBkBkBkAlBkCPAl_z_AAABkBDBd_MAlBkBDBkBkBkBk____________BdBkBk CPAlBkCPAlAlAlCPAe_z_MA_AlBD_zAlBDBDBk____________________Bk_zAl AlCKBmCKBnCPAlAl_zA__MAlBkBDAB_MBDABBd____________________ABAeAe AlBkCPCOCK_AAlCPAe_zAABd_M_z_zBD_z_z_MBdAlBD____________________ AlAlAlBn_AAlAeCPAl_zAl_MAlBkBkBD_z_zAlBkAlBd____________________ _MAlCPBkCPAlAlAlAl_MBkBDBk__ABBDAB_MCJ__________________________ _zAlAlAlAeCPAlAl_zAlBDBd_A__AB_M_zBkAB__________________________ _zAlAlAlAlAl_z_zAlBDBk_______zBkBkAO____________________________ _M_zAlAl_A_z_MAl_MAl_____A_z_________A__________________________ _M_$AlAlAlAlAB_zABBD____________________________________________ AB_zAlAl_$_M_z_MBD_z_____A______________________________________ _M_MAl_z_MBdAB_MBkAOBdAB________________________________________ _M_$Al_zAlBkBD_zAK_M_AAl________________________________________ _M_$_z_MBk_AABBd_M_zABAe________________________________________ _$Al_MABBk____BdBkBdBD_z________________________________________ BdBk_zAlAl_______________z______________________________________ _AABBDAl________________________________________________________ _z_AAl_A________________________________________________________ _A_______A______________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 91 (explosion noxious 0) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________________________________________________BJ________ ________________________________________________________BUAyBUAy ______________________________________________BU________AyAlAeAy ________________________________________________BUAy__AyAlASAlAl ________________________________________________Ay__AlAl__Ai__Ai ____________________________________________Ay__AyAeAlASAiAiAiAi __________________________________________AyAyAyAe__Ae__AS__AiAi __________________________________________Ay__AeAeAeAlAfBD__AiAi __________________________________________BUAeAeAPAeAPAfAjAiAiAi __________________________________________AyAlAeAPAPAl__AiAiAo_r __________________________________________AyAlAlAPAPAS__AiAi_r_r __________________________________________BUAyAlAlAeAfAf__AiAiAi ______________________________________________AyAeAeASAfASAiASAi ____________________BU________Ay______Ay________AyAeAlAf__AiAoAo ______________BJ______AyAeAyAy__________AyAyAy____AyAeAiAiBHAoBH ________________BUAyAyAlAlAeBU__________BUAe__AyBUAy__AoAoBHAoAo ________________AyAlAeAlAeAyAy__Ay______AyAlAeAlAlASAiBHAoBHAoBH ________________BUAeAlAlAlAyAyAeAy____AyAlASAiAiAiAiAiAoAoAnBH_t ________________Ay__AyAyAyAyAyAeAy__AyAl__AiAoAoAoAoAoAo_t_t_tAo ________________BUAyBUAyBUBJBUAyAyAyAlAlAi_rBH_rBH_rAo_r_u_rBHBH __________________AyAyAlAyBUAyAyAy__AeAl__AoBHAo_r_r_r_r_t_r_rAo ______________________BDBUAyBUAyBUAyAeAe__AiAoBH_u_rBH_tBHAoBH_r ________________________AyAyAyAyAyAyAeASASAiBH_r_t_t_t_r_tAoBHAo ________________________BUAe__AeAyAyAyASAiAiAoAoAo_t_r_rAoAoBH_r ________________________AyAlAeAlAPAlASAiAiAiAoAo_r_r_tAo_rAoAoAo ________________________AyAeAlAeAlAS__AiAo_rBHAoBHAoAoAoBH_rAo_r ________________________AyAyAeAeAe__ASAi_rAoAoAoAoAoBHAoAoAo_uBH } # tile 92 (explosion noxious 1) { ____________AyAeAlAy____________________________________________ ____________AyAeAeAy____________________________________________ ________BUAyBUAlAlAyBUAy________________________________________ Ay______AeAeAe__ASAlAeAlAy______________________________________ __AyAyAeAlAeAl____BJAlAeAyAyBU__AyAy________BU__BUAyBU__________ __AyAeAeAeAlAS______AS__ASAlAeAyAeAyAyAyAy______AyAyAy__________ AyAyAlAS__ASAiAiAi__AiAiAiASAlAeAeAeAlAeAlAy__AyBJ____Ay________ AeAyAP__ASAi_rAoAi__AiAiAiAiASAeAeAeAP__ASAlAyAyAeAy____________ AlAS__AiAiAiBHAoAi____AiAiAi__ASAlBJAiAiAiAlAyAeAlAy____________ ASAiAiAiAiAoAoAoAi________Ai__Ai__AiAiAiAi__AeAeAeAl____________ AiAiAi_rAoAiAiAiAiAiAiAi____AiAiAiAiAi_rAiAiBJAeAlAy____________ AiAoAoBH_rAiAiAiASAiAiAiAi__AS__AiAiAoAoAiAiAfAlAe____________BU Ai_rAo_rAoAiAi____AiBH_rAiASAfAfAiAiBH_rApAiAiASAfAyBUAyAyAyBU__ AoAiAiAi_rBHAiAiAiAo_r_r_rAlAy__AiAo_rAoAoBH_rAoASAfAeAlAeAlAyAy AiAi____AiAiAiAoAoAoBH_nAiAPAf__BHAoAoAoBHAoAoAoAi__AiASAlAe__Ae Ai__APAfASAi_rBHAoBHAoBHAoAlAPAi_rAo_rAo_n_r_rBHAoBHAiAiAlAeAlAl __AfAfAf__AoAoBHAoBHAoAoAiAlAfAiAo_rBH_uAo_uBHAoAoBHAjAiAi__Ai__ __Ai__Ai_rAoBHAoBHAoBHAiASAfASAiAoAo_u_u_r_u_rBHAoAiAiAiAiAiAiAi AoAoAoAoBH_tAoBHAoAoAoAi__AiBHAoBH_rBH_u_r_r_rAoBHAoAi_rAi_rBH_r AoAoBHAo_t_r_t_r_rBH_rAiASAiAoAo_r_r_u_u_t_r_t_r_rAoAoBHAoAoAoAo BHAoBHAoBHAo_u_uBH_uAoAoAiAoBH_rBH_uBH_uBH_uBHAoBHAoBHAoBH_rBHAo _t_u_t_r_rBH_u_u_u_u_rBHAiAo_r_uBHBHBHBHBHBHBHBH_u_u_t_rAoAo_rBH AoBHAo_tBHBHBHBH_u_rAoAoAoAoBH_uBHBHBHBHBHBHBH_u_u_r_r_rAoAoBHAh _qAo_t_r_uBHBHBH_u_u_uBH_rBH_t_u_uBHBHBH_uBH_u_r_t_r_t_r_tAo_rAo Ao_u_u_uBHBHBHBHBHBHBH_rAoAoAo_rBHBHBH_rBHBHBH_u_u_tBH_tBHAoBH_r _t_r_rBHBHBgBgBHBHBHAo_r_rBHAoBH_uBHBHBHBHBH_u_u_r_r_q_r_qAo_q_t _r_rBHBHBHBHBgBHBHBHBH_rAo_rAo_tAoBHBHBHBHBHBH_u_r_r_u_r_r_rAo_r _u_uBHBHBHBgBHBHBHBH_uBHBHBH_r_t_rAoBHBHBHBHBHBH_r_u_u_r_rAoBHBH _u_uBHBHBgCWBgBHBHBHBHBHBHBHAo_wBHAoBgBHBHBHBHAoBHBHBH_uBHBHBHBH _tBHBHBgBgBmBgBHBHBHBHBHBHBH_t_rAoBHBHBHBHBHBHBHBHBHBHBHBHBHBHBH BHAoBHBgCRBgBHBHBHBHBHBHBHBHAo_tBHBHBHBHBHBHBHBHBHBHBHBHBHBHBHBH _uBHBHBHBgBgBHBHBHBHBHBHAoBL_tAoBHBHBHBH_uBHBHBHBHBHBHBHBHBHBHBH } # tile 93 (explosion noxious 2) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________AyBUBJBU______________________________________________ ________AyAyAyAlAy______________________________________________ ________BUAeAyAyBU______________________________________________ AyBUAy__AyAl______BU____________________________________________ AeAeAlAyAyAyBU__________________________________________________ AeAeAlAyAyAy______BJ____________________________________________ BDAfBDAlBUAyAyAyBU______________________________________________ AiAi__AlAyAyAeAeAyAyAyBUAyBU____________________________________ AoAi__Al__AeAyAPAeAeAyAeAlAy____________________________________ AoAiASAfASASAfAfAPASAeAlASAlAy____BJ____________________________ BHAiAiAiAiAiAiAiAiAiAiAiAi__AlAyBU______________________________ _rAiAoAi_rAo_r_r_rAo_r_r_rAiAS__Ay______________________________ AoAoBHAoAoAoBHAoBHBHAoBHAoAiAfAeAy__BU__________________________ _r_rAoAoAoBHAoAo_nBHAoBH_rAiAfAPAeAy____________________________ Ao_rAoAoAoAoAoBHAoBHAoBHAoAi__AfAlAeAy__________________________ _qAoAo_r_rBHAhBHAoBHAoBHAoBH_rAiASAlAyAy________________________ _r_rBH_tAoAoAoAoBHAoAoBHAoBHAoAiAiAlAy__________________________ _r_u_uAoAoAoAiAo_rAoBHAoAoAoAi__ASAlAeAyAyAyAy________BU________ _u_u_u_rBHAoAiAiAp_rAoAiAiAiAiAS__AeAlAeBUAyAyAyBUAyBU__________ _uBH_u_rAoAoAiAiAoAoBHAiAiAiASAiAlAeAeAeAyBUAyAeAeAlAy__________ BHBHBH_rBHAoAiAiBHAoBHAoAiAiAiAi__AeAyAyBUAyBUAyAyAyBU__________ BHBH_u_r_rAoAoAi_rBHAoBHAo_rAiAiAi__AlAyAyBJ__________BU________ } # tile 94 (explosion noxious 3) { ____________________BUAy____AyAxAl____AiBHAoBH_rAoBHAoAoAo_rBHAo ______________BJ____AyAy____AyAyASAiAiAi_rAoAoAo_q_r_nAo_r_u_r_r ________________BUAyAlAy______AyAi_rBHAiAi_rBHAo_r_t_r_r_r_rBHAo ________________AyAlAeAy____AyAyAi_r_rAi_n_rAoAo_q_r_q_r_q_r_uBH ________________BUAlAy____AyAyAy__AiAiAoAo_rAo_rBH_r_r_rAo_rAoBH ________________AyAyAy______AeAlASAiAi_r_rBHAo_r_q_t_q_r_t_r_r_u ______________BJ________BUAyAlASAiAiAiAi_u_rAoAo_r_rAo_u_u_r_r_r __________________AyAy__Ay__Ae__Ai_rAiAi_rAoBHAo_q_r_u_r_t_r_r_u ____________BU__AyAeAlAyBUAeAlASAi_rAiAoBHAoAo_t_r_rBH_r_r_rBHBH ______________AyAlAlAeAyAyAyAlAi_r_u_rAoAoAo_q_r_rBHBHBH_rBHAoBH AyAyBUAy__AyBUAyAlAlAlAlAyAyBUAiBH_uAoAoBH_t_r_t_r_uBHBHAo_uBHBH AeAyAyAlAyAyAyAyAeAlAeAeAyAyAyAi_nBH_r_r_u_r_r_r_t_uBHBH_uBHBHBH __AyAyAeAyAyBUAyAyAyAlAe__AyBDAoAo_r_r_r_u_r_u_u_u_uBHBHBHBHBHBH AyBUAyAyAyBUAyAyAyAyAeAeAyAlASAiAoBH_u_u_r_u_u_u_t_u_uBH_uBH_uBH ____________BUAyBUAyAyAyAyAfAiAoAo_rAo_r_u_uBH_u_r_uBH_uBHBHBHBH ____________AyAlAeAyAyAyAyAfAiBH_rAoAoBH_u_r_u_r_t_uBHBHBHBHBHBH ________BUAyAlAeAlAyAyAf____AiAoBH_rAo_tAo_tBH_t_u_uBHBHBHBHBHBH ________AyAeAeAlASASASAiAiAo_rAo_r_t_t_r_t_r_q_r_uBHBHBHAoBHBHBH ________BJAeAlASAiAiAi_r_r_rBHAoAo_r_r_t_r_tAo_tAo_uBHBHBHBHBgBH ________AyAy____AiAiAoBH_rAoBHAo_r_r_q_t_qAoBHAo_rBHBHBHBHBHBHBg ______AyAyAy__AiBHAoAoAoBHAoBH_rAoAoAo_rAoBHAo_tBHBHBHBHBHBHBHBH ______AyAeAlASAi_rAo_rBHAoBHAoAoAoBHAoBHAoAo_t_r_rBHBHBHBHBHBHBH ______AyAlAl__AiAoBHAoBHAoAoBHAoAo_rBHAoBHBHAo_rAoBHBHBHBHBHBHBH ____AyAyAe__AiAiAoAoAoBH_r_rAoAo_rAoAoAoAoAo_q_r_uBHBHBHBHBHBHBH ____AyAeAS__AiAoBHAiAiAoAoAoBHAoBHAoBHBHAo_r_r_rBHBHBHBHBHBHBHBH ____AyAlAlAiAiBHAoAiASAiBHAoBHAoBHAoBHAo_r_r_q_r_rBHBHBHBHBHBHBH ____AyAeAlAiAiAoBHAiAiAiAoBHAoBHAoBHAoAo_r_r_r_t_r_uBHBHBHBHBHBH ____AyAyAlAiAiAiAhAiAiAoAoAoAoBHAoBH_r_r_r_r_q_r_u_uBHBHBHBHBHBH __BJBUAyAyAlAiAiAiAiAi_rBH_rBHAoAo_rAo_rBH_r_r_r_u_uBHBHBHBHBHBH ____Ay____AyAS__AS__ASAjBHAo_nBHAoBH_rAoAoAo_t_u_uBHAoBH_uBHBHBH ________BUAeAlAlAlAPAf__AoBHAoBHAoBHAoAoBH_r_r_r_u_uAoBHBH_uBHBH ________AyAyAyAyAeAyAy___uAo_rBHAoAoAoAoAo_r_t_u_u_u_rAoBHBHBHBH } # tile 95 (explosion noxious 4) { BHBHBHBHBgBHBHBHBgBgBgBHBH_rBH_uBgBgBgBHBHBHBHBgBgBHBgBHBgBgBgBH _r_r_rBHBHBHBHBHBHBHBHBHAo_r_qAoBHBgBgBgBHBHBHBgBgBHBHBHBHBHBHBH BH_rAoBHBHBHBHBHBHBHBHBHBH_rBHAoBgBHBmCRBgBgBHBHBgBHBHBHBHBHBHBH Ao_r_rBHBHBHBHBHBHBHBHBHBH_u_rBHBHBHBgBmBgBgBHBHBHBgBHBHBHBHBHBH BH_rBHBHBHBHBHBHBHBHBHBHBHBHBHBHBgBgCWCRBmBgBHBHBgBgBHBHBHBHBH_r _r_rBHBHBHBH_u_u_uBHBHBHBHBH_uBHBgBnBgBmBgCRBgBgBHBHBHBH_rBHAo_u _r_rBHBHBHBHBH_rBH_uBHBHBgBHBHBHCOBgCRBmCRBHBmBgBHBHBHBHAoAoBH_u _rAoBHBHBHBHBH_uAoBHBHBHBHBHBHBHBgBnBgBmBgCRBgCRBgBgBgBH_qAo_rBH BHBHBHBHBHBHBHBHBHBHBHBHBHBHBHBHCRBmCRCRBmBmCRBmCRBmBgBHAo_rBHBH BHBHBHBgBHBHBHBHBHBgBgBHBHBgBHBHBHCRBgBmBgCRBgBmBgBgBH_u_uAoBHBH BHBHBHBgBHBHBHBHBHBgBgBHBHBgBgBHBgBgBmCRBmBgBnCRBmBgBHAoBHAoBHBH BHBHBHBHBHBHBHBHBHBgBHBHBHBHBHBHBHBgBgCRBgCRBgCWBgBgBHBH_uBHBHBg BHBHBHBHBHAoBHBHBHBgBgBHBHBHBHBHBHBHBmBmCRBmBmCRBgBHBgBHBH_rBHBg BHBHBHBH_uBHBHBHBHBHBgBgBgBgBgBgBHBHBgCRBHCRBgBmBgBgBgBHBHBHBHBg BHBHBHBHBHBHBHBHBHBHCWBmCRBgBmCRBgBHBHBgBmBgCWCRBmBgCWBHBHBHBHBH BHBHBHBHBHBgBgBHBHBgBgBgBHBgBgBmBgBHBHBHBgBgBgBmBgBnBgBgAo_uBHBH BHBHBHBHBHBHBgBHBHBHBHBHBgBnCRCOCRBgBgBgBgBHBnCRBmCRBgBHBHBHBHBH BHBHBHBHBHBHBHBHBHBHBHBgBgCOBgBmBgBnBgBmBgBgBgCRBgBmBHBHBHBHBHBH BHBHBHBHBHBHBHBHBHBHBgBnCRBgCRBgBgBgCRBgBgBHBmCOCRBgBHBHBHBHBHBH BHBgBgBHBHBHBHBHBHBHBHBgBgBmBgBgBHBgBgBgBHBHBgBgBHBHBHBHBHBHBHBg BHBHCWBgBHBHBHBHBgBgBmCRBmCRBmCRBgBgBmCRBgBHBHBHBHBHBgBHBgBgBgBg BHBgBgBgBHBHAoBHBgCRBgBmBgCRBgBmBgCWBgBmBgBHBHBHBHBHBgBgBHBgBgCW BgBgBmBgBHBHBHBHBgBHBgBgCRBHBmBgCRBHCRBgBgBHBHBHBHBHBgBmCRBgBgBg BgCRBgBgBHBH_uBHBHBgBgBmBgBgBHBHBHBmBgBmBgBgBHBHBgBgBHBgBgBgBgBg BgBmCRBgBHBHBHBHBHBgCWCRBmCRBmBgBgBgCRBnCRBgBHBHBgCWBgBHBHBgBgBH BgBgBHBgBHBHBHBHBHBgBgBmBgCWBgBgBHBmBgCOBgBHBHBHBHBgBgBgBHBgBgBg BHBHBHBHBHBHBHBHBHBHBnBgCRBHCRBmCRBgCRBmCRBHBHBgBgBHBgBgBgBgBmCR BHBHBHBHBHBHBHBHBHBgBgBHBHCRBHCRBgBnBgBmBgBHBHBgBgBHBHBgBHBgBgBg BHBHBHBHBHBgBgBHBHBgBgBHBgBmCRBHBmCRBmCRBgBHBgBgBgBHBHBgBnCRBmBH BHBHBHBHAoBgBHBHBHBHBHBHBgBmBgBgBgCRBgBmBgBgBgBmBgBHBHBgBgBgBgBH BHBHBHBHBHAoBHBHBHBHBHBHBgBgCRBgBgBgBmCRBmBHCRBgCRBgBHBHBgBHBgBH BHBHBHBHBHBHBH_r_rAoBHBHBHBHBHBgBgCOBgCRBgBgBgBHBgBmBgBgBgBHBHBH } # tile 96 (explosion noxious 5) { BHBHBH_rAoBHAo_rBHAoBH_rAo_rBH_rAiAiASAeBU______________________ BHBH_u_r_qAo_uAoAoAo_q_r_q_t_r_r_rAiASAlAy__Ay__________________ BH_u_u_r_r_rBHAoAo_qAo_r_t_rAo_uBHAiBDAyAyAy____________________ _r_r_r_u_u_r_qAo_rAoAoAo_rBHAoAo_rAiAS__AeAy____________________ BH_rBHBHBH_rAo_r_u_rBH_rAoAoBHBHAoAoAiASAlAy____________________ _rAoBHBH_uBHBH_u_u_r_t_rAoBHAhBHAoBHAiAiAlAyAaAyAeAy____________ BHBHBgBHBHBHBH_u_u_uBH_rBHAoBHAhBHAhAoAi__AP__AeAlAy____________ BHBHBgBgBHBHBHAo_u_r_rAoAoAoAhBHAhBHAo__AS__AeAeAy__Ay__________ BHBHBHBgBgBHBHBHBH_rBHAoBHAoBHAoAoBHAoAiAiBJAlAeBU______________ BHBgBHBHBHBHBHBH_u_r_rAoBHAoAoBHAoAoAoAi__AyAeAlAy______________ BgBgBHBHBHBHBH_u_r_tBHAoAoAoAo_r_t_rBH_rAiAlAyAyBU______________ BgBgBHBgBgBHBHAo_u_rAoBHAoBH_r_t_r_rBHAoAoAiAy__________________ CWBgBgBHBgBHBHBHBH_rAoAoBHAoAo_r_uAoBHAoBHAi__AlBU__BU__________ BgBgBgBgBHBHBHBHAoBHAoAoAhBHAo_r_r_u_r_r_rAoASAeAyAyAyBJ________ BgBHBnBgBgBHBHBHBH_rAoBHAoAoAo_t_r_r_r_rAoAiAfAeAeAeBU__________ BHBgBgBHBHBgBgAo_rAoAoAo_rBH_r_r_tBH_rAoAo__AyAyAeAeAy__________ BgBgBgBHBHBHAo_uAoAoBH_rBH_nAo_rAoBHAo_rAiASAyAyBUAyBU__________ BgBHAoBHAoBH_r_rAoAoAo_r_rAoAoAo_rAoAo_rAi__APAy______Al________ BHBH_u_rBH_n_r_t_rAoBH_nAo_rBHAoBHAoBH_rAiASAlAyBU______________ BHBH_t_r_q_t_t_u_rBHAhBH_nAi_rAo_rAo_rAiAS__Ae__Ay______________ BgBH_u_uAo_rBH_uAoAoAoAoApAiAiAiAiAiAiAS__AlAeAeBU______________ BgBgBHBHBHBH_u_u_r_rAoBH_rAiASAi____ASAlAeAeAe__Ay______________ CWBgBHBHBHBHBHBHAo_rBHAoAo_rAiAiAiAS__APAlAeAlAeBU______________ BHBHBHBHBHBHBHBHBH_r_rAoBHBH_rBH_rAiAiAfAPAeAeAeAy______________ BHBHBHBHBHBHBHBHBH_r_rAoAoAoBHAhBHAoAoAi__AlAeAeBU______________ BHBHBHBHBHBHAoBH_u_r_rAoBHBH_rAoAoBH_rBHAi__AeAeAy______________ BgBHBHBHBHBHBH_u_r_rBHAoBHAhAoAoBHAoAo_rAiASAlAeBU______________ BHBgBHBHBHBH_u_u_rAoAoBHAoAo_qAoAoBHAoAo_nAiASAPAy______________ BHBgBHBHBH_uAo_rAo_r_r_rAoBHAoAoAoBHAoAoBHAi__APBU______________ BHBgBHAo_uAoAoBH_rAo_q_r_tAoBGBHAoBHAoAoAi__AeAeAy______________ BgBgBH_rBH_rAoAoAoBGAoAo_rAoAoBHAoBHAo_u__Al__AyBU______________ BHBHBHBH_nBH_r_r_qAoAnAo_tBHBHAoBH_rAiAiASAyAyBUAy______________ } # tile 97 (explosion noxious 6) { ______________Ay__AyAyASAoBHAoBHAo_rBHAoBHAo_r_rBH_u_r_rBHBHBgBH ______________AyAyAyAyAl__AoAoBHAoBH_rAoAoAo_q_r_q_r_q_r_rBHBHBH ______________AyBU____AlAl__AiAoBHAoBH_rBH_nAoAoAoAoAo_u_u_rAoBH ____________Ay________BUAyAlAPAiAiAiAiAo_r_rAoAoAoAo_qAo_r_x_r_u ______________________AyAyAeAyAfAiAi__AiAoAoAo_rAoAoBHAoBH_rAo_u ______________________AyAeAeAyAyAl__Ae__AoBH_r_rAoBHAoAoAoAoBHBH ____________BU__________AyAeBUAyAyAPAyAfAoAoBH_rAoAoBHAoBHAoBH_r ______________BUAyAyAyBUAyAyAyBUAyAeAe__AoBH_rAoAoAoAoBHAoAo_t_r ______________AyAlAeAlAyBUAyBUAyBUAeAl__AoBHAoAoAiAS__AiAoAoAo_r ______________AyAeAeAeAyAyBUAyBUAyAlAe__AiAi_rAoAiAfASAiAoBH_r_r ________BUAyAlAeAlAeAlAyBUAyBUAyAlAeAlASAiAiAiAi__Af____AiAoAo_r ________AyAeAeAeAeAeAeAyAyAyAyAlAeAeAeASASAiAiAiASASASAiAiAiAoAo ________BUAyAyAyAlAeAeAyBUAyAyAeAeAe__AeAl__AiAiAi__AiAiBH_rAo_r __________BUAy__AyAlAy__AyAyAPAeAeAlAPAeAeAeAS__AiAi__AiAjAi_nAo __________________AyBU__AyAeAlAeAlAyAlAeAeAeAlASAiAiAiAiAi__AiAi ______________BJ________AyAyAeAeAyAyAeAeAyAyAeASASAiAi__AS__ASAi __________________________________AyAyAy__AyAyAPAlAS__AS__BJAfAS __________________________________BUAyBU____AyAyAeAeASAeAeAlAPAl ________________________________________BU____AyASAS__AeAyAeAeAe ______________________________________________AyAeAl__AlAyAyAe__ ______________________________________________AyAlAS__BJBU__AyAl ______________________________________________AyAe______Ay__AyAl ________________________________________BU____AyAl__Ai__BU__BUAy __________________________________________AyAyAeAOAlASAlAy______ __________________________________________AyAyAeAlAlAyAy________ __________________________________________BUAyAl____AeAy__BU____ ________________________________________BU____Ay__ASAlAy________ ______________________________________________AyAeAlAeBU________ ______________________________________________AeAlAyBUAy________ ______________________________________________AyAyAy____Ay______ ________________________________________________________________ ________________________________________________________________ } # tile 98 (explosion noxious 7) { BHBHBHBHBHBHBHBHBHBHBHBHBgBHBHBHBgBgCWBmCRBgBgBHBgBgCWBgBgBgBgBH BHBH_uBHBHBHBHAoBHBHBHBHBHBHBHBHBHBHBgBgBHBgBHBHBHBHBHBHBHBHBHBH BHBHBHBHBHBHBHBHBHBgBgBHBHBHBHBHBgBgBnBgBgBHBHBHBHBHBHBHBHBHBH_r _u_u_uBHBHBHBHBHBHBHBHBH_uBHBHBHBgBgBgBmBgBgBHBHAoBHBHAo_u_u_u_r _u_rBHBHBHBHBHBHBHBHBHBHBHBHBHBHBgBgCWCRBgBgBH_u_xBH_u_rBH_nBH_r _u_r_rBHBHBHBHBHBHBgBHBHBHBHBHBHBHBgBgBgBHBHBHBH_u_r_t_r_t_r_t_u _u_r_r_rBHBHBHBHBHBHBHBHBHBHBHBHBHBHBmBgBHBHBHBHBH_r_u_r_r_rAoBH _u_u_r_r_rAoBHBH_uBHBHBHBHBHBHBHBHBHBHBgBHBHBHBHBHAo_u_rAo_r_t_u Ao_u_u_u_u_uBHBHBH_uBHBHBHBHAo_rBHBHBHBHBHBHBHBHBHBHBH_rAoAoBH_r _t_r_t_r_r_u_u_uBHAo_uBHBHBH_r_r_uBHBHBHBHBHBHBHBHBHAoBHAoAoAo_r BH_rBH_u_u_u_u_rAo_uBHBHBHBHBH_r_r_rBHBHBH_uBHBHBHBHBH_rBH_rBH_n AoAoBHAo_r_u_r_r_t_r_rAoBHAo_u_r_r_r_u_u_r_u_rBHAoBH_u_rAoAi_r_r AoBHAo_rBH_r_u_u_u_uBH_rAo_rBH_nBH_t_r_rAo_r_r_u_u_r_u_rAoAoAoAo AoBHAoAoAnBHAoBH_t_r_u_u_t_r_u_u_t_r_q_r_rBH_t_u_u_u_r_r_rAiAiAo AoAoAoBHAo_tBHAoAo_tBHAoBH_tAo_rAo_rAoBHAoAoAo_r_u_rAoBHAoAi__Ai _rBHAoBH_r_r_nBHAo_t_tBHAo_t_rBHAoBH_rAoAoBHAoAo_tAo_qAoAoAiASAS Ai_r_uAoBHAoBHAoBHAo_rAoBHAoAoBHAoAoAoAiAiAoBHAoBHAoBH_rBHAiAiAS ASAi_rAoAiAi_rAoAoAo_r_r_rBHAoBHAoBHAoAiAiAiAoBHAoBHAo_r_uAoASAf __AiBHAi__AP____AiAoBHAoAoBHAoAoBHAoAi____AiBHAoBHAoBH_rAoAiAlAl ASAi_rAiAlAeAeAyASAi_rAoAoBH_rAiAiAiASASAS__AiAoAoAi_nBHAoASAeAl __AiAiAiAfAPAlAP__AiAo_rBH_nAiAi__Af______AS__AiAiAiAi_rAiASAlAS Ae__AS__AS__ASAiAiAi_nAiAoAiAS______ASAiAi____AiAiAi_r_rAiAiASAS AlAeASAS__AiAiAiBHAoAiAoAiAi__Al__AfAi_rBHAiAiAiAiAiAo_rAi__AlAS AyAlAeAlASAiAiAiAiAiAiAoAiAiAlAyAPAl__Ao_rAiAiAiASAiAoBHAi__AeAl __Ay__________AiAiAiAiAiAiAfAyAe__AeASAiBHAjAiAi__AiAiAiAi__AyAy AyAlAS__AiAiAiAiAiAiAiAi__AfAeAeAeAeAeASASAlAS__AiAiAiAi____AyAy AyAeAlAlAiAiAiAiAiAiAiAi__AlAlAeAyAyAyAyAyAyAyAlAiAiAiAiAi__AlAx __AyAeAyAlAiAiAiAiAi_rAi__AeAeAy____________AyAlAiAiAoAi____AeAy __AyAlAeAlBJAmBJAiAiAiAiAiASAyAy____________AyAeAiAiAiAi__AlAyAy __AyAeAeAeAlAeAlASAiAi__ASAlAy______________AyAlASAiAiAiBJAy____ __AyAyAyAyAeAyAeAlASAiASAlAeAy______________AyAyAlASAlAlBU____BJ ______________AyAeAlAl__AeAy__________________AyAeAeAeAy________ } # tile 99 (explosion noxious 8) { BHBHBH_uBHAoAo_rAo_rBH_tAoBHAoAoBHAi__AlAyAy______BU____________ BHBH_u_r_t_r_qAoAoAo_rAoBHAo_uAo_rAiAy______Ay__________________ BHAoBH_q_rAoAo_rBHAoBHAoBHAoBH_rAiASAy__________________________ _r_u_r_r_q_r_tAoAoAoBHAo_rAo_rAiASAeAeAyAy______________________ _u_r_u_rBH_u_u_rBHAoAoBHBHAoAoAi__APAeAeBU______________________ _u_r_tAo_q_u_uAoAoAoBHAoAoAiAiAiAS__APAeAy______________________ BH_r_r_t_r_rAoAoAoAoAoBHAi__AiAiAiAiAfAlBU______________________ _u_r_t_r_t_r_rBHAoBHBHAoAiASAi_r_rAiASAlAy__Ay__________________ _u_u_u_tBH_uAoBHAoAoAoBHAiAiAi_r_u_rAiAlBUAy____________________ _u_u_u_r_t_rBH_u_rBH_rAiAiAiAiAoBHAoASAlAeAy____________________ BH_u_u_u_u_tAo_rAoBHAjAiBDAlAiAiAo__AlAeAeAeAy__________________ _t_r_t_r_nBHAo_r_rAoAiAiAfAfAS__ASAfAyAyAyAyAy____________AyAyAy BHAoBH_rBHAoBHAoBHAiAiAiAfAPAlASAfAyAy____________________AyAlAe AoAo_q_r_rAoBHAoAoAiAi__APAPAeAlAeAlAe____________________BUAyBU BHAoAo_rAoAoAoAoBHAhAiASAlAeAlAeAlAeAlAyAyAy____________________ _nBHAoAoAoAoBHAo_rAiASAlAeAyAyAyAeAeAeAyAeAy____________________ AiAoBHAoBHAoBHAoBHAiAfAeAy__BUAeAlAeAy__________________________ AiBH_nBHAoBHAoBHAi__AyAyAy__AyAeAeAyAy__________________________ Ai_rAoBHAo_rAoAi__APAy______BUAyAyAy____________________________ Ai_rAoBHAoAoAi__AeAe____AyBJ________Ay__________________________ AiAiBHAoBHAoAiASAlAe____________________________________________ AiAiBHAoAoAi____AlAy____Ay______________________________________ AiAiAoAoAiASAlASAyAyBUBU________________________________________ ASAi_rAiASAyAeAeAeAeAeAy________________________________________ ASAiAiAiBDAyBUAyAeAeAeAy________________________________________ Ae__ASAlAy____AyAyAyAyBU________________________________________ AyAyAlAlAy______________BU______________________________________ AyAyAyAy________________________________________________________ BUAyBUAy________________________________________________________ Ay______Ay______________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 100 (explosion muddy 0) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________________________________________________AK________ ________________________________________________________AZAKAZAK ______________________________________________AK________AOAeAOAe ________________________________________________AaAO__AOAlAlAlAl ________________________________________________AO__AOAeAlBVBTBV ____________________________________________Aa__AeAeAlAlBVBTBVBT __________________________________________AZAOAeAe__AeAlBTBTBTBV __________________________________________AZ__AeAlAeAlAeAlAlBVBT __________________________________________AZAeAlAeAlAeAlAeBVBtBt __________________________________________AZAlAlAlAeAlAlBVBTCGCG __________________________________________AZAeAlAeAeAeAlBTBtBtBt __________________________________________AZAeAeAlAlAlAeAlBtBVBT ______________________________________________AeAeAlAeAlAlBVAxBT ____________________AZ________AK______AK________AeAeAlAeAlBtBtBt ______________AK______AaAOAeAK__________AKAeAe____AOAeBTBtCGBtBt ________________AZAZAaAeAlAeAa__________AeAe__AOAaAOAlBtCGCGCGBt ________________AKAeAeAlAeAeAZ__AK______AOAlAeAlAeAlBTBtBtCGBtCG ________________AaAeAlAeAeAZAeAeAO____AOAeAeBVBTBVBTBtBtCGCGCGCG ________________AK__AOAaAZAKAOAeAO__AOAeAeBTBtCGBtBtBtCGCGCGCGCG ________________AaAOAaAKAZAKAZAOAeAOAlAeBVBtCGCGCGCGCGCGCdCGCGCG __________________AZAKAKAKAKAKAKAZ__AeAlAlBtBtCGCGCGCGCGCGCGCGCG ______________________AKAKAKAKAKAZAOAlAlAlBtCGCGCdCGCGCGCdCGCGCG ________________________AKAOAOAeAKAZAeAlAlBVBtCGCGCGCGCGCGCGCGCd ________________________AaAe__AeAeAZAeAeAyBTBtBtCGCGCGCGCGBtCGCG ________________________AZAlAeAeAeAlAlBtBTBtBtBtCGCGCGCGCGCGCGCG ________________________AaAeAlAeAlAlAlBtBtBtCGBtBtBtCGBtCGCGCGCG ________________________AKAeAeAlAeAlAeBTBtCGBtBtBtBtBtBtBtCGCGCd } # tile 101 (explosion muddy 1) { ____________AxAeAlAO____________________________________________ ____________AZAeAeAa____________________________________________ ________AZAZAeAeAlAOAaAZ________________________________________ AB______AOAeAeAlAeAeAeAeAZ______________________________________ __AZAeAeAlAeAlAlAlAlAlAeAeAeAO__AeAZ________AK__AaAeAO__________ __AOAeAlAeAlAeAlBTAlBTBTAlAlAOAeAeAeAZAOAZ______AKAxAK__________ AZAOAlAlAlAlBtBTBVAlBVBTBtBTAlAeAlAeAlAeAlAZ__AKAZ____AK________ AeAeAeAlAxBTBtBtBTBTBTBVBTBTAeAeAeAeAeAlAlAeAZAaAOAK____________ AlAlAlBTBVBtCGBtBtAlAlBTBVBTAlAlAlAlAlBTBtAeAeAeAeAK____________ BTBVBTBtBtBtBtCGBtAlAeBTAlBVBTBVBTBVBTBtBtAlAeAeAeAZ____________ BVBTCGBtCGBtBtBtBVBTBVBTAlAlBVBTBVBTBtBtBtAlAlAeAeAK____________ BtBtBtCGBtBtBTBVAlBVBtBtBTBTAlAlBTBtBtBtBTBTAeAeAe____________AK CGCGCGBtCGBtBVAlBVBtCGBtBtAlAlAeBVBtCGBtCGBtBVAeAlAaAeAOAeAOAZ__ BtBtBtBtBtBtBTBTBtCGBtCGBtAlAeAlBtCGBtCGBtCGBtBTAeAlAeAlAeAeAOAZ BtBTAlBTAlBTBtBtCGBtCGBtBVAeAlBTBtBtCGCGBtBtCGBtBVAlAlAlAlAe__Ae BTAlAeAlAeBTBtCGBtBtBtCGBTAlAeAyBtCGCGCGBtCGCGCGBtBtBTBVAeAeAeAl AlAlAeAeAlBtCGBtCGBtCGBtBtAeAeAlCGBtCdCGCGCdCGCGCGBTBVBtBVAlAyAl AlAyAxBTBtCGBtCGBtCGBtBtAlAlAeBTBtCGCGCdCGCdCGCGBtBVBTBtBtBVBtBt BtBtBtBtCGCGCGCGCGBtCGBtAlAlBVBtCGCGCdCdCGCGCGCGCGBtBtBtCGBtCGCG BtCGBtCGCGCGCGCGCGCGBtBtAxBtBtCGCGCGCGCdCGCGCGCGCGCGBtCGBtCGBtCG CGCGCGCGCGCGCdCdCdCdCGBtBVBtCGCGCdCdCdCdCdCdCdCdCdCGCGCGCGCGCGBt CGCdCGCGCGCdCdCdCdCdCGBtBTBtCGCdCdCdCdCdCdCdCdCdCdCdCGCGBtCGBtCG CGCGCGCGCGCdCdCdCdCGCGBtBtCGCGCdCdCdCdCdCdCdCdCdCdCGCGCGCGCGCGBt CGCGCGCGCGCdCdCdCdCdCGCGBtCGCGCdCdCdCdCdCdCdCdCGCGCGCGCGCGCGBtCG CGCdCdCGCdCdCdCdCdCdCdCGCGBtCGCGCdCdCdCGCdCdCdCdCGCGCGCGCGCGCGCG CGCGCGCdCdCnCdCdCdCdCdCGCGCGBtCGCGCdCdCdCdCdCdCdCGCGCGCGCGCGCGCG CGCGCdCdCdCdCdCdCdCdCdCGCdCGCGCGCGCdCdCdCdCdCdCdCGCGCdCGCGCGCGCG CGCdCdCdCdCdCdCdCdCdCdCdCdCdCGCGCGCdCdCdCdCdCdCdCGCdCdCGCGCdCdCd CGCdCdCdCdCnCdCdCnCdCdCdCdCdCGCGCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCd CGCdCdCdCnCdCnCdCdCdCdCdCdCdCGCGCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCd CGCdCdCnCdCdCdCdCdCdCdCdCdCdCGCGCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCd CdCdCdCdCdCgCdCdCdCdCdCdCdCGCGCGCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCd } # tile 102 (explosion muddy 2) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________AKAZAKAK______________________________________________ ________AZAeAeAeAO______________________________________________ ________AxAeAeAeAa______________________________________________ AZAZAZ__AOAe______AK____________________________________________ AeAeAeAZAOAOAZ__________________________________________________ AeAeAeAeAZAZ______AK____________________________________________ AlAlAlAeAeAKAxAOAa______________________________________________ BtBVAeAeAOAOAeAeAOAZAKAZAKAK____________________________________ CGBtAlAe__AeAlAeAeAeAeAeAeAO____________________________________ BtBtAlAlAeAlAeAlAeAlAeAlAeAeAO____AK____________________________ CGBtBVBTBtBtBVBTBVBTBTBTBVAlAlAeAZ______________________________ BtCGBtBtBtCGBtBtBtCGBtBtBtBVAe__AO______________________________ CGBtCGBtCGBtCGCGCGBtCGCGBtBTAlAeAO__AK__________________________ CGCGBtBtBtBtBtCGBtCGBtCGBtBTAeAlAOAa____________________________ CGCGCGCGCGBtCGCGCGBtCGBtCGBtAlAeAlAeAZ__________________________ CGCGCGCGCGCGBtBtBtCGBtCGBtCGBtBTAeAlAOAa________________________ CGCGCGCGCGBtBtCGCGBtCGBtCGBtBtBTAlAeAe__________________________ CGCdCGCGBtBtBTBtBtCGBtBtBtBtBtBVAlAlAeAaAKAaAZ________AK________ CdCdCdCGCGBtBVBTCGCGBtBTBVBTBVBTAlAeAlAeAaAOAeAZAaAZAZ__________ CdCdCdCGBtBtBTBVBtCGBtBtBTAlBTBVAeAeAeAeAKAZAZAeAeAeAO__________ CdCdCdCGCGBtBtBTCGBtCGBtBtBTBVBTAlAeAeAZAZAKAZAeAeAOAa__________ CdCdCdCGBtBtBtBtBtCGBtCGBtBtBtBtBTAlAeAOAKAK__________AK________ } # tile 103 (explosion muddy 3) { ____________________AZAZ____AeAeAlAlAlBTCGCGCGCGCGCGBtBtCGCGCdCd ______________AK____AOAe____AKAeAeBtBtBtBtCGBtCGCGCGBtBtCGCdCGCG ________________AKAOAlAe______AaBVBtCGBtBtBtCGBtCGCGCGCGCGCGCGCd ________________AZAeAeAe____AKAeBTBtBtBtBtCGBtCGCGCGCGCGCGCGCdCd ________________AaAeAe____AKAeAeAlBtCGBtCGCGCGCGCGCGCGCGCGCGCdCd ________________AKAOAK______AeAlBTBtBtCGBtCGBtCGCGCGCGCGCGCGCGCd ______________AK________AKAOAeAlBVBTBtBtCGBtCGBtCGCGCGCdCdCGCGCG __________________AZAZ__AK__AeAlBTBtBTBtBtCGCGCGCGCGCGCGCGCGCGCd ____________AK__AaAeAeAZAaAeAlBTBtCGBtBtCGCGCGCGCGCGCdCGCGCGCdCd ______________AaAeAlAeAOAKAOAeBTBtCGBtCGBtCGCGCGCGCdCdCdCGCGCdCd AOAKAaAZ__AZAZAOAlAlAlAeAaAKAeAlBtBtCGCGCGCGCGCGCGCdCdCdCdCdCdCd AeAZAOAeAZAOAKAeAeAeAeAeAOAZAOBTBtCGCGCGCGCGCGCGCGCdCdCdCdCdCdCd __AKAeAeAeAZAZAOAeAOAeAe__AeAlBTCGCGCGCGCdCGCdCGCGCdCdCdCdCdCdCd AZAKAKAeAOAaAKAKAKAZAOAeAOAeAeBtCGCGCGCdCGCdCGCdCGCdCdCdCdCdCdCd ____________AZAZAZAKAeAOAaAeAlBtCGCGCGCGCdCdCdCdCGCdCdCdCdCdCdCd ____________AOAeAOAZAKAaAeAlBTCGCGCGCGCGCGCdCGCGCGCdCdCdCdCdCdCd ________AZAeAlAeAlAeAeAeAlBTBtBtCGCGCGCGCGCGCGCGCGCdCdCdCdCdCdCd ________AKAeAeAlAeAlAeBTBtBtBtCGCGCGCGCGCGCGCGCGCGCdCdCdCdCdCnCd ________AZAeAlAlBVBTBtBtCGBtCGBtCGCGCGCGCGCGCGCGCGCdCdCdCdCdCdCn ________AKAeAeAlBTBtBtCGBtCGBtCGBtCGCGCGCGCGCGCGCGCdCdCdCdCdCdCd ______AKAeAeAlBtCGBtCGBtCGCGCGCGBtBtCGCGCGCGCGCGCGCdCdCdCdCdCdCd ______AOAeAlAlBtBtCGBtCGCGCGBtCGBtCGBtCGBtCGCGCGCGCdCdCdCdCdCdCd ______AOAlAeAlBTBtBtCGCGCGCGCGBtCGCGCGBtCGCGCGCGCdCdCdCdCdCdCdCd ____AOAeAeAlBTBtBtBtBtCGCGCGBtBtBtCGBtBtBtCGCGCGCdCdCdCdCdCdCdCd ____AeAeAlBTBtBtCGBtBtBtCGCGCGBtCGBtCGBtCGCGCGCGCdCdCdCdCdCdCdCd ____AOAlAeBVBtCGBtBtBTBtBtCGBtBtBtCGBtCGCGCGCGCGCGCdCdCdCdCdCdCd ____AeAeAlBTBtBtCGBtAlBTBtBtCGBtCGBtCGBtCGCGCGCGCGCdCdCdCdCdCdCd ____AKAxAeBTBtBtBtBtBTBtBtCGBtBtBtCGBtCGCGCGCGCGCGCdCdCdCdCdCdCd __AKAKAKAeAeBtBtBtBtBtBtCGCGCGBtCGCGCGCGCGCGCGCGCGCdCdCdCdCdCdCd ____AK____AeAeBTBTAlAeBVBtCGCGCGBtCGCGCGBtCGCGCdCdCdCdCdCdCdCdCd ________AZAOAlAeAlAeAlAlBtBtCGCGCGCGCGBtCGCGCGCGCdCdCdCdCdCdCdCd ________ABAZAZAeAOAOAOAlBtCGCGCGBtCGBtBtBtCGCGCdCGCdCGCdCdCdCdCd } # tile 104 (explosion muddy 4) { CdCdCdCdCdCdCdCdCdCnCdCdCdCGCGCdCdCnCdCdCdCdCdCdCnCdCdCdCdCnCdCd CGCGCGCdCdCdCdCdCdCdCdCdCGCGCGCGCdCdCnCdCdCdCdCnCdCdCdCdCdCdCdCd CGCGCdCdCdCdCdCdCdCdCdCdCdCGCGCGCdCdCdCnCdCnCdCdCdCdCdCdCdCdCdCd CdCGCGCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCgCdCdCdCdCdCnCdCdCdCdCdCd CdCGCdCdCdCdCdCdCdCdCdCdCdCdCdCdCnCdCnCdCdCgCdCdCdCdCdCdCdCdCdCd CGCGCdCdCdCdCdCdCdCdCdCdCdCdCGCdCdCdCdCgCdCdCdCnCdCdCdCdCGCGCdCd CGCGCdCdCdCdCdCGCdCdCdCdCnCdCdCdCnCdCgCdCdCgCdCdCdCdCdCdCGBtCGCd CGCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCgCdCdCdCdCgCdCgCdCnCdCGBtCGCd CdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCgCdCgCdCdCdCdCnCdCdCGCGCdCd CdCdCdCdCdCdCdCdCdCnCdCdCdCnCdCdCdCgCdCdCdCdCgCdCgCdCdCdCGCdCdCd CdCdCdCnCdCdCdCdCdCdCnCdCdCdCdCdCgCdCdCgCdCnCdCdCdCgCdCdCdCdCdCd CdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCnCdCdCgCdCdCgCdCdCdCdCdCGCdCd CdCdCdCdCdCdCdCdCdCnCdCdCdCdCdCdCdCdCdCdCdCgCdCdCdCgCdCdCdCdCdCn CdCdCdCdCdCdCdCdCdCdCgCdCgCdCgCdCdCdCdCgCdCdCgCdCgCdCdCdCdCdCdCd CdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCnCdCdCdCdCdCgCdCdCdCnCdCdCdCdCdCd CdCdCdCdCdCnCdCdCdCdCdCnCdCgCdCdCgCdCdCdCdCdCdCgCdCgCdCnCdCdCdCd CdCdCdCdCdCdCdCdCdCdCdCdCdCdCgCdCdCdCgCdCgCdCdCdCdCdCdCdCdCdCdCd CdCdCdCdCdCdCdCdCdCdCdCdCgCdCdCgCdCgCdCdCdCdCdCgCdCgCdCdCdCdCdCd CdCdCdCdCdCdCdCdCdCdCnCdCdCgCdCdCdCdCgCdCgCdCdCdCnCdCdCdCdCdCdCd CdCdCnCdCdCdCdCdCdCdCdCdCgCdCdCdCdCgCdCdCdCdCgCdCdCdCdCdCdCdCdCd CdCdCdCnCdCdCdCdCnCdCgCdCdCdCgCdCnCdCdCgCdCdCdCdCdCdCdCdCnCdCnCd CdCdCgCdCdCdCdCdCgCdCdCdCdCgCdCdCdCgCdCdCdCdCdCdCdCdCdCgCdCdCdCn CdCnCdCdCdCdCdCdCdCdCgCdCgCdCdCgCdCdCgCdCgCdCdCdCdCdCdCdCdCgCdCd CnCdCdCnCdCdCdCdCdCdCdCdCdCdCdCdCgCdCdCdCdCdCdCdCdCgCdCdCgCdCdCn CdCgCdCdCdCdCdCdCdCgCdCgCdCgCdCdCdCgCdCgCdCgCdCdCdCdCgCdCdCdCgCd CdCdCdCgCdCdCdCdCdCdCnCdCdCdCdCgCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCd CdCdCdCdCdCdCdCdCdCdCdCgCdCgCdCdCdCgCdCgCdCdCdCnCdCdCgCdCgCdCgCd CdCdCdCdCdCdCdCdCdCgCdCdCdCdCdCgCdCdCnCdCdCdCdCdCgCdCdCdCdCnCdCd CdCdCdCdCdCdCnCdCdCdCdCdCgCdCgCdCdCgCdCdCgCdCdCgCdCdCdCdCdCdCgCd CdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCnCdCdCgCdCdCgCdCdCdCdCdCdCgCdCdCd CdCdCdCdCdCdCdCdCdCdCdCdCgCdCdCgCdCdCdCdCgCdCdCgCdCnCdCdCdCdCnCd CdCdCdCdCdCdCdCGCdCdCdCdCdCdCdCdCdCgCdCnCdCdCdCdCdCdCgCdCnCdCdCd } # tile 105 (explosion muddy 5) { CdCdCdCGBtBtCGBtCGCGCGCGCGCGCGBtBtBTAlAeAa______________________ CdCdCGCGCGCGBtCGBtCGCGCGCGCGCGCGBtAyAeAeAZ__AK__________________ CdCdCGCGCGCGCGBtCGCGCGCGCGCGCGCGBtBTAlAeAeAK____________________ CGCGCGCdCGCGCGCGCGCGBtCGCGCGBtCGBtBTAeAlAeAO____________________ CGCGCdCdCdCGCGCGCdCGCGCGCGBtCGBtCGBtBVAlAlAe____________________ CGCdCdCdCdCdCdCdCdCGCGCGBtCGBtCGBtCGBtBTAeAeAOAeAeAO____________ CdCdCdCdCdCdCdCdCdCGCGCGCGBtCGCGCGBtBtBTAlAe__AeAeAZ____________ CdCdCdCnCdCdCdCdCGCGCGCGBtCGBtCGBtCGBtBVAlAlAeAeAK__AK__________ CdCdCdCdCnCdCdCdCdCGCGBtCGBtCGBtCGBtBtBTBVAlAlAeAa______________ CdCnCdCdCdCdCdCdCdCGCGCGBtBtBtCGCGCGBtBtAeAeAeAeAZ______________ CdCdCdCdCdCdCdCdCGCGCGBtCGBtCGCGCGCGCGBtAyAeAeAeAZ______________ CdCnCdCnCdCdCdCdCGCGCGBtBtCGCGCGCGCGBtCGBtBTAe__________________ CnCdCdCdCgCdCdCdCdCGCGBtCGBtCGCGCdCGCGBtCGBtAlAeAa__AK__________ CdCdCgCdCdCdCdCdCdCGBtBtBtBtBtCGCGCdCGCGBtBtAeAeAOAZAKAK________ CnCdCdCdCnCdCdCdCdCGCGBtCGBtCGCGCGCGCGCGCGBTAeAeAeAeAa__________ CdCdCnCdCdCdCdCdCGBtBtCGBtCGBtCGCGCGCGCGBtBTAOAZAOAeAO__________ CdCgCdCdCdCdCdCGCGBtCGCGCGCGCGCGCGCGCGCGBtAlAeAKAaAOAa__________ CdCdCdCdCdCdCGCGBtCGBtCGBtCGBtCGBtCGBtCGBtAlAeAO______AK________ CdCdCdCdCGCGCGCGCGCGCGCGCGBtCGCGCGBtCGBtBtBTAlAOAZ______________ CdCdCGCGCGCGCGCdCGCGBtCGBtBtBtCGBtBtBtBtBTAlAe__AK______________ CnCdCdCGCGCGCGCdCGBtBtBtCGBTBVBtBVBTBVBTAlAeAlAeAa______________ CdCdCdCdCdCdCdCdCGCGBtCGBtBtAlBVAlAlAeAlAeAlAe__AZ______________ CnCdCdCdCdCdCdCdCdCGCGCGCGBtBVBTAlAlAlAeAlAeAlAeAa______________ CdCdCdCdCdCdCdCdCdCGCGCGBtCGBtBtBtBtBTAeAeAeAeAeAK______________ CdCdCdCdCdCdCdCdCdCGCGBtCGCGCGBtCGBtBtBTAlAeAeAeAa______________ CdCdCdCdCdCdCdCdCdCGCGCGBtCGCGCGBtCGBtBtBTAlAeAeAK______________ CdCdCdCdCdCdCdCdCGCGCGBtCGCGCGBtBtBtCGBtBVAlAlAeAa______________ CdCnCdCdCdCdCGCdCGCGCGCGBtCGCGCGBtBtBtCGBtBtAeAeAK______________ CdCdCdCdCdCdCGCGCGCGCGCGCGCGCGCGCGCGCGBtCGBtAlAeAa______________ CdCnCdCdCGCGBtCGCGCGBtCGCGCGCGCGBtCGBtBtBTAlAeAeAZ______________ CdCdCdCdCGCGCGBtCGCGCGBtCGCGCGCGCGBtCGBtAlAe__AOAZ______________ CdCdCdCGBtCGBtCGCGCGCGCGCGCGBtCGBtCGBtBtAeAeAZAZAB______________ } # tile 106 (explosion muddy 6) { ______________AO__AZAeAlBtCGCGBtCGCGCGBtCGBtCGCGCGCdCGCGCdCdCdCd ______________AOAOAZAOAlBTBtBtBtBtCGBtCGBtCGCGCGCGCGCGCGCGCdCdCd ______________AKAZ____AeAlAlBVBtCGBtCGBtCGCGCGBtBtBtCGCdCdCGCdCd ____________AK________AZAOAeAeBVBtBtBtBtBtCGBtBtBtCGCGCGCGCdCGCd ______________________AKAeAeAeAeAlBTAlBTCGBtCGCGCGBtCGCGCGCGCGCG ______________________AOAeAeAZAaAeAlAeAlBtCGCGCGBtBtBtCGBtCGCdCd ____________AK__________AeAeAaAKAaAeAeAeBtBtCGCGCGBtCGBtCGCGCdCd ______________AZAOAeAOAZAKAOAKAKAKAeAeAlBtCGCGCGBtBtBtCGBtCGCGCG ______________AOAlAeAlAOAZAKAKAKAaAeAlAlBtCGCGBtBtAlAlBtCGCGCGCG ______________AeAeAlAeAeAKAKAKAKAOAlAeAlBTBtBtBtBTAeAeBVBtCGCGCG ________AZAOAeAeAlAeAlAeAaAKAZAZAeAeAlAlBtBtBtBtAlAeAlAlBVBtCGCG ________AKAeAeAeAeAlAeAeAKAKAZAeAeAeAeAlAlBtBtBtAlAlAlBVBTBtBtCG ________AZAOAaAZAeAeAeAOAZAZAeAeAlAe__AeAlAlBVBTBVBTBVBtBtCGCGCG __________AKAK__AZAeAO__AZAeAeAlAeAlAeAeAeAlAeAlBTBVBTBVBTBtBtBt __________________AZAZ__AaAeAlAeAeAOAlAeAlAeAlAlBVBTBVBTBVAlBVBT ______________AK________AKAeAeAeAZAZAeAeAOAeAeAlAlBTBTBTAlAlAeAy __________________________________AZAeAO__AZAeAeAlAlAlAlAlAlAlAe __________________________________AKAKAK____AZAeAeAlAeAlAeAlAeAl ________________________________________AK____AeAlAlAlAeAeAeAlAl ______________________________________________AeAeAlAlAlAZAZAeAl ______________________________________________AeAlAlAlAeAa__AaAe ______________________________________________AeAeAlBTAlAa__AZAe ________________________________________AK____AeAlAlBVAlAa__AZAe __________________________________________AKAZAeAeAeAeAlAO______ __________________________________________AZAeAeAlAeAlAO________ __________________________________________AKAOAeAlAlAeAa__AK____ ________________________________________AK____AeAlAlAlAZ________ ______________________________________________AeAeAlAOAZ________ ______________________________________________AeAlAeAaAK________ ______________________________________________AOAOAO____AK______ ________________________________________________________________ ________________________________________________________________ } # tile 107 (explosion muddy 7) { CdCdCdCdCdCdCdCGCdCdCdCdCdCdCdCdCdCnCdCnCdCdCnCdCdCnCdCdCnCdCdCn CdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCnCdCdCdCdCdCdCdCdCdCdCdCdCd CdCdCdCdCdCdCdCdCdCdCnCdCdCdCdCdCdCnCdCdCgCdCdCdCdCdCdCdCdCdCdCG CdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCgCdCdCnCdCdCdCdCdCdCdCdCdCdCGCG CGCGCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCgCdCdCgCdCdCdCdCdCdCGCGCGCG CGCGCGCdCdCdCdCdCdCnCdCdCdCdCdCdCdCgCdCdCdCdCdCdCdCGCGCGCGCGCGCd CdCGCGCGCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCgCdCdCdCdCdCGCdCGCGCGCGCd CGCdCGCGCGCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCGBtCGCGCd CdCdCdCGCGCdCdCdCdCdCdCdCdCdCdCGCdCdCdCdCdCdCdCdCdCdCdCGCGCGCGCG CGCGCGCGCGCdCdCdCdCdCGCdCdCdCGCGCdCdCdCdCdCdCdCdCdCdCdCGBtCGBtCG CGCGCGCdCdCGCdCGCdCdCdCdCdCdCdCGCGCGCdCdCdCdCdCdCdCdCdCGCGBtCGCG BtCGBtCGCGCdCGCGCGCGCGCdCdCdCGCGCGCGCGCdCGCdCGCdCdCdCdCGBtBtBtCG CGBtCGCGCGCGCdCGCGCdCGCGCGCGCGCGCGCGCGCGCGCGCGCdCdCGCdCGCGBtBtBt BtBtBtCGCGCGCGCdCGCGCGCdCGCGCGCdCGCGCGCGBtCGCGCdCdCdCGCGCGBtBTBt BtBtCGCGCGCGCGCGCGCGCGCGCGCGCGCGCGCGCGCGCGBtCGCGCdCGCGCGBtBTAlBT BtCGBtCGBtCGCGCGBtCGCGCGCGCGCGCGBtCGBtBtBtCGBtCGCGCGCGCGBtBTAeAl BVBtCGBtBtBtCGCGCGBtCGCGCdCGCGBtCGCGBtBTBVBtCGCGCGCGCGCGCGBtAlAe AlBtBtBtBTAyBtBtBtCGCGCGCGCGBtCGBtCGBtBVBTBtBtCGCGCGBtCGBtBtAeAe AlBtCGBTAlAeAlAlBVBtCGBtCGBtCGBtCGBtBtAlAlBTCGCGCGBtCGCGCGBTAlAe BTBtBtBVAeAeAeAeAeBTBtCGBtCGBtBtBtBTBTAlAeAlBtCGBtBtBtCGBtAlAeAl AlBTBVBTAlAeAlAeAlBtCGBtCGCGBtBTAlAlAlAlAlAlBVBtCGBtBtBtBtAlAlAl AeAlBTBTAlAlBTBVBTCGBtBtBtBtAlAlAlAlBTBVBTAlBTBtBtBtBtCGBtBVAeAl AeAeAlAlAlBTBtBtCGBtCGBtCGBtAlAeAlAeBVBtCGBtBtBTBVBtCGCGBtBTAlAl AOAeAeAlAeBTBTBtBTBtBtBtBtBTAeAeAeAeBTBtBtBtBtBVAlBTBtBtBtAlAeAe __AaAlAlBVAlAlBTBVBTBVBTBVAlAlAe__AeAlBTBtBTBVBTBVBTBtBTBVAlAaAO AOAeAeAlBTBVBTBVBTBVBTBVBTAlAeAlAeAlAeAlAeAlAeAlBTBVBTBVBTAlAOAe AOAeAlAeBVBtBtBTBVBtBtBTAlAeAlAeAeAeAeAeAeAeAeAeBVBTBtBtBVAlAlAe __AeAeAlAeBTBTBVBTBtBtBVAeAlAeAe____________AOAlBTBtBtBtBTAlAeAO __AeAlAeAlAlAlAeBVBtBtBTBVAlAeAK____________AeAeBVBtBtBTAlAeAeAK __AeAeAlAeAlAeAeAlBtBtBTAlAlAO______________AOAlAlBVBTBTAeAe____ __AZAeAeAeAeAeAeAlBTBVAlAlAeAe______________AeAeAlAlAlAeAe____AK ______________AaAeAeAeAlAeAx__________________AeAeAeAeAe________ } # tile 108 (explosion muddy 8) { CdCdCdCGCGBtBtCGCGCGCGCGCGCGCGBtCGBtAlAeAeAZ______AK____________ CdCdCGCGCGCGCGCGCGCGCGCGCGCGCGCGBtBVAe______AK__________________ CdCdCGCGCGBtCGCGCGCGCGCGCGBtCGBtBVAlAe__________________________ CGCdCGCGCGCGCGCGBtBtBtCGCGCGBtBtAeAeAeAeAK______________________ CGCGCdCGCGCdCdCGCGBtCGBtCGCGCGBtAlAeAeAeAa______________________ CdCGCGCGCGCdCGCGBtCGBtBtBtBtBtBtBTAlAeAeAZ______________________ CdCGCGCGCGCGCGBtBtBtCGBtBtAlBVBtBtBTAlAeAa______________________ CGCGCGCGCGCGCGCGBtBtBtBtBTAlBTBtBtBtAlAlAZ__AK__________________ CdCdCdCGCGCGCGCGCGBtCGBtBtBTBtBtCGBtBVAeAeAK____________________ CGCdCGCGCGCGCGCdCGCGBtBtBTBVBTBtBtBtAlAeAeAe____________________ CdCdCdCdCdCGCGCGCGBtBtBTAlAeBVBtBtBTAlAeAlAeAe__________________ CGCGCGCGCGCGCGCGBtCGBtAyAeAeAeBVAlAlAeAeAOAeAO____________AOAOAe CGCGCGCGCGCGCGCGCGBtBtBTAlAeAlAlAlAeAe____________________AeAeAe BtCGCGCGCGCGCGCGBtBtBTAlAeAlAeAlAeAlAe____________________AZAZAZ CGBtCGCGCGBtCGCGCGBtBVAlAlAeAlAeAlAeAlAeAeAO____________________ BtCGBtCGBtBtBtCGBtBtAlAlAeAeAOAeAeAlAeAeAeAO____________________ BtBtCGBtCGCGCGCGCGBTAlAeAe__AaAeAlAeAe__________________________ BTCGBtBtCGCGBtCGBTAlAeAOAK__AKAeAeAeAK__________________________ BVBtCGBtCGBtCGBtAlAeAe______AZAeAeAZ____________________________ BTBtBtCGBtBtBTAlAeAe____ABAK________AK__________________________ BVBtCGBtCGBtBVBTAlAe____________________________________________ BTBtBtCGBtBVBTBTAeAZ____AK______________________________________ BVBTBtBtAyAeAlAlAeAZAaAK________________________________________ AlBtBtBtAeAeAeAeAeAeAeAa________________________________________ AlBtBtBTAlAZAZAeAlAeAeAZ________________________________________ AeAlAlAlAO____AOAOAaAZAK________________________________________ AeAeAlAeAO______________AK______________________________________ AKAZAOAO________________________________________________________ AKAKAZAK________________________________________________________ AK______AK______________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 109 (explosion wet 0) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________________________________________________Ae________ ________________________________________________________AeAeAeAe ______________________________________________Ae________BJBdBDBD ________________________________________________BJAl__AlBFBKBKAm ________________________________________________BD__AeBKAmAmBEAm ____________________________________________Ae__AjBdBKAmBEAmBEAm __________________________________________AlBDBDBX__BKBEAmBEAmBE __________________________________________Ae__BkBkBkBKAmAmAmBEAm __________________________________________AlBXBKBDBkAiBDAfBEBEBE __________________________________________AlBKBKAiBdBKBEAmAmBE_k __________________________________________AlBKBKBdAiBKBEBEBE_kBE __________________________________________AeBDBYBKBKAmAmAmBEBEAm ______________________________________________BDBKBKAmBdAmBEAmBE ____________________Ae________Ae______Ae________BDBjBkAmBEBEBEAm ______________Ae______AlBDBDAe__________AeBDBD____BDBdBEAmBEBEBE ________________AeAlAlBDBkBkAl__________BJBx__AlAeAeAm_kBEBQBEBQ ________________AeBdBKBKBkBDAe__Ae______AjBKBKBdAiBKBEBEBQBQBQBQ ________________AlBcBKBKBdAlBDBdBJ____AlBdAmBEBEBEAmBEBEBQBQCQBe ________________Ae__AjBJAlAeAlBkBD__AeBKAmBEBEBEBEBEBEBeBeBlBeBQ ________________AlBDAlAeAeAeAeAlBDAlBKAmBE_gBEBeBEBeBEBeChCQBlBQ __________________AeAeAeAeAeAeAeAl__BdBDAmBE_KBEBeCKBeBnBeBeCQCQ ______________________AeAeAeAeAeAeBDBkBKAmBEBEBeChBeBQBeCQBeBQBe ________________________AeBJAlAjAeAeBcBKBEAmBECQBeBnBeCKBeBQBQCh ________________________AlBk__BxBDAeBDApBEBEBEBEBeBeCQBlBQBQBeBe ________________________AeBKAiBDAiBKAmBEBEAmAmBEBeBlBeBeBeBeBQBe ________________________BDBKBKBYBKBKBEBEBE_kBEBEBEBEBeBEBEBeBnBe ________________________AeBDBdBkBKAmAmBE_kBEBEBEAmBEBEBEAmCQCQCh } # tile 110 (explosion wet 1) { ____________BJBdBkBD____________________________________________ ____________AeBkBkAl____________________________________________ ________AlAeAjBYBKBJAeAl________________________________________ Ae______BDBkBKAmBKAiBdBdAe______________________________________ __AxBJBDBkBkBKBEAmAmBKBKBDBDAl__BXAe________Ae__AlBDBJ__________ __BJBkBKBKBdAmAmBEBEAmBEAmBKBDBJBdBDAeBJAl______AeBDAe__________ AeAjBKAmBKAmBEBEAmAmBEAmBEAmBKBkBKBdBkBkBKAl__AeAe____Ae________ BDBDAiBEAmBEBEBEAmBEAmBEAmBEBKBdBXBdApBEAmBdAeAlBDAe____________ BKBKAmBEBEBEBEBEBEAmAmBEAmBEAmBKBMAmBEBEBEBkBJBdBdAe____________ AmBEBEAmBEBE_KBEBEBEAmBEAmAmBEBEAmBEAmBEBEBEBDBkBDAe____________ BEAmBEBEBEBEAmBEAmAmBEAmBEAmAmBEAmBEAm_kBEAmAmBKBdAe____________ AmBEBEBeAmBEAmBEAmBEBEBEBEAmAmBEAmBEBEBEBEBEAmBdBD____________Ae BE_kBE_kBEBEBEAmAmBEBE_kBEBKBKAiBEBEBE_gBEBEBEBEBKAlBDAlBXBJAe__ BEBEBEAm_kBEAmBEBEBE_kBE_kAiBDAmBEBE_kBEAmBEBEBEBEBDBKBKBdBkAjAe BEBEAmBEBEAmBeBEBEBEBEBEAmBdAiBEBeAmBeBEBEBEBEBEAmAmBEAmBDBd__Bd AmBEAiBDAiBE_kBE_KBEBEBE_kBdAiBEAmBEBeBeBECQBeBEBEBeBEBEAfBdAiBD BEAfAiAiBEBEBEAmBEBEBEAmBEAiAiBEBEBeChChBlChBlBQBE_kBEBEAmAmBEBE AmBeAmBE_kBE_KBEBEBE_KBEBEBdAiBEBEBlCQCQBeChBeBEBEBEAmBEBEBEBEBE BE_kBEBEBEBeBeBEBEBEBEBEAmAmBe_kBEBeChChBlBeCQBeBEBEBEBEBEBEBE_k BQBEBEBeBeCQBeBlBeCQBEBEAmBeAmBEBeBlCQCQBeCKBeBnBeBEAmBEBEBEBEBE BQBnCKChBQBlChChChChBlBeBEBEBeBeChChChChChChChChChCQBeBEBEBeBEBE BeChBeCQBeCQCQCQCQChBeBEAmBEBeChCQCQCQCQCQCQCQCQCQChBeBeBEBe_KBE BeBQBQBeBlChCoChBlBeCQBeBEBEBnChChChCoChChChChBeChBeBlCQBEBQBEBE BeBeBECQCQChCQCQCQChCQBe_KBeBeChCQChCQChCQChCQCQBECQBeBlBeBeBEBe CQChChBeChChChChChChChBeBeBEBeBeChChChBeChChChChBlCQBQBeCQBQBeBe BeBlBeCQCQChCoCQCQCQCQCQBeBEBECQCQChCQCQCQCQCQCQCQBlBeBlBeBeBeBe CQBeCoChChChChChCoChChBeChBeBeBeCKChChCQCoChChChCPBeChBeBeBeBnBe CQChCQCQCQCoCQCQCQChCQChCQChBeBeBeChCQCQCQChCQChBeChCQCQBeChCQCh BlChChCQChChChChCQChChChChChCQBeChChCoChCQChChChChChChChChChChCh BeChCQCoCQChCoCQCQCQCQCQCQChBeBlCQCQCQCQCQCQCQCQCQCQCQCQCQCQCQCQ CQChChChChCoChChCQChCoChChChBeBeChChChChChChChChCoChCQChChChCQCh CQChCQCQCoChCQCQCQCQCQCQCQCQBeBeCQChCQCQCQChCQCQCQCQCQCQCQCQCQCQ } # tile 111 (explosion wet 2) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________AeAeAeAe______________________________________________ ________AeBDBYBKBJ______________________________________________ ________BJBKBDAiBJ______________________________________________ AeAlAe__AjBd______Ae____________________________________________ BdBcBkAeBJBcAe__________________________________________________ BDBdAmBDAlAl______Ae____________________________________________ AmAmAmBKBDAOBDAlAl______________________________________________ BEBEAmBKAlAlBDBkBJAeAeAeAeAe____________________________________ BEBEBEBd__BcBKAiBdBcBwBcBdAl____________________________________ AmBEBEAmBdBKAiAmApBKBDBKBKBKAl____Ae____________________________ BEBEBEAmBEBEBEBEAm_kBEBEBEAmBKBJAe______________________________ BEBEBEBE_kBE_kBE_kBE_kBE_kBEAm__Al______________________________ BEBEBEBEBEBEBEBEBEBEBEBEBEBEAmBkAl__Ae__________________________ BeBeBEBEAmBEBEBeBeBEBEBE_kBEAiAiBDAl____________________________ BeBeBeBeBEBEBeBEBEBEBEBEBEBEAmAmBkBdAe__________________________ BeBeBCCQBeBEAmBEBEBE_KBEBEBE_kBEBKBKBJAe________________________ CQBeBlBeBeBEBEBEBEAmBEBEBEBEBEAmBEAmBD__________________________ BeChCQCQAmBEAmBE_kBEBEBeAmBEBeAmBEBKBDAjAeBJAl________Ae________ BlCQChBeBEBEBEAmBE_kBEAmBeAmBEAmBMAiBKBkAlAlBdAeAlAlAe__________ CQCQCQBlBEBEAmBEBEBE_KBeAmBEAmBEAmBdBdBkAeAeAlBkBdBkBJ__________ ChChChBeBEBEBEAmBEBEBEAmBeAmBEAmBEBdBwAlAlAeAeBDAlBDAl__________ CQChCQBe_KBEBEBE_kBEBEBE_KBEBEBEAmBEBDAlAeAe__________Ae________ } # tile 112 (explosion wet 3) { ____________________AlAl____BwBcBKAmBEAmBEBEBeBeBeBEBeBEBeCQChCh ______________Ae____AjBJ____AeBDBKBEBEBEBEBEBEBeBeCQBEBeBeChBeBl ________________AeAlBkBD______AfBE_kBEBEBEBEBEBeBlBeBlBeBnBeChCh ________________AeBKBdBD____AeAjBEBEBEBEAmBEAmBeBeBeBeBeBeCKCQCQ ________________AlBkBJ____AeAmBDAmBEBEBEBE_kBEBeCQBeBeBeBeBeChCh ________________AeAlAe______BDBKAmBEBEBE_kBEBEBeBeBeBeBlBeCQBeCh ______________Ae________AeAlBdAmBEBEAmBEBE_kBEBeBeBeCPChChBeBlBe __________________AlAe__Ae__BdAmAmBEBEAm_kBEBQBeBeBlCQBlBeCQBeCh ____________Ae__AeBdBdAeAlBkBKBEBE_kBEBEBEAmBeBeCPCQChBeCQBlChCh ______________AlBDBKBKAjAeBJAiAm_kBEBEBEBEBeBeBlBeChCQChBECQCQCQ BJAeAlAl__AlAeAjBKAmBKBDAlAeBDBEBE_kBEAmBeBeCQBeCQChChChChChChCh BdAeBJBdAeBDAeBJBKBKBdBdAiAeAfBEAmBEBeCQCQCPCQBlBeChCQCQCQChCQCQ __AeAjBxBdAlAeAlBdAeBDBk__BcAm_kBEBeBlBeChBlCQChCQChChChCoChChCh AlAeAeBDBJAeAeAeAeAeBDBdAlBkAmBEBEBeCQChBeChCQBlBeCPCQChCQCQCQCQ ____________AlAlAlAeBDBDAlAiBEBEBeBeCQBeChChChChCQChChChChChChCh ____________AjCJBDAeAeAlBDAmBEBEBeBeBQBlCQCQCQBlBeChCQCQCQChCQCQ ________AeAlBKBKBKBDBJAiBEAmBEBEBeBeBeBeBnCKBeBeCQCKChChChChCoCh ________AeBkBKBDBKBKBKAmBEBE_kBEBeBeBeCKBeCQBeBlCQChCQCQCQCQChCQ ________AeBdBKBKBEAmBEBEBE_kBEBEBeBeBnBeBlBeBeBeCQChCoChChChCoCQ ________AeBDAmBEAmBEBEBE_kBEBEBE_KBeBeBeBeBeBQBeBlChCQCQCQCQCQCh ______AeBXAiBEBEBEBEBEAmBEBEBE_kBeBeBeBeBeBQBeBeCQChChChChChChCh ______BJBkBDAfBE_kBE_kBEBQBEAmBEBEBE_KBEBEBeBeBlBeChCQCQCQCQCQCh ______AlBKAiBEAmBEBEBEBEBeBeBEBEBE_gBEBEBEBECQBeChChCoChChChCQCh ____AlBDBDBEAmBEBEBEBEBEBeBeBEBEAmBEBEBEAmBeBeCKCQChCQCQCQChCQCQ ____BJBKBFAmBeBEBEBEAmBEBEBeBeAmBeBEBEAmBeBeBeBeChChChChCoChChCh ____BJBKAmBEAmBEBEBEAmBEBEBEBQBEBEBE_KBEBeBnBeCQBeChCQCQCQCQCQCQ ____BJBkAiBEBEBEBEBEAmBEBEBEBEBEBEBEBEBeBeBeCKBeBlChCoChChChCoCh ____AeBJBKAmBEBEAmBEBEBEAmBeBQBE_KBeBEBeBeBeBeCQCQChCQCQCQChCQCQ __AeAeAeBDBdBEBEBEBEBE_kBEBeBeBEBEBeBeBeBEBeBeBeBlCQChChChChChCh ____Ae____BDBKAmBEAmBEAmBEBEBeBEBEBeBeBEBEBnBeChCQChCQChCQCQCQCQ ________AeBcBkBYBKBdBKAmBEBEBEBEBeBQBeBEBEBeCKBeChChCKChChBeChCh ________AeAlAeBJBXAlAlBE_kBEBeBEBEBeBEBEAmBeBeChCQChBeChCQChCQCQ } # tile 113 (explosion wet 4) { ChChChChChChCQCQChCQCoChCQBlBeChChCoChChChChCQCoChChChCQCoCQChCQ BeCQBeCQCQCQCQCQCQCQCQChBeCQBeCQCQChChCoCQChCQChChCQCQCQCQCQCQCQ CPBeChChCoChCQChCQCQChChCQBeBlCPChCQCoChChCoChCQCoChCQChChChCoCh CQBlBeCQCQChCQCQCQCQCQCQCQChCQChCQChChChCoChCQCQCQChCQCQCQChCQCh ChCQChChChChChChCoCQChChChChCoChCQCoChCoChChCoCQChCoChChChChChCh BeBlCQCQCQChCQChCQChCQCQCoChBeCQChChChChChCoChChCQCQCQChCQCQCQCh CQBeChChChChChBeChChChCQChChChChCoChCoChCoChChCoChCQCoChBeBECKCh BeChCQCQCQChCQChCQChCQCQCQChCQCQChChChCoChChCoChCoChChCQBeBeBeCQ ChChCQChCQChChChCQChCoChCQChCQCQCoChCoChChCoChChChCoChChBeBeChCh CQCQCQCoCQCQCQCQCQChChCQCQChCQCQChChChCoChChCoChCoChCQChBeChCQCQ CQChChChCoChCQChCoChCoChChCoChChCoChCoChChCoChChChCoChBeChChChCh CQChCQCQCQChCQCQCQCQCQCQCQChCQCQCQChChCoChChCoChCoChCQCQCQChCQCo ChChCQChChChChChChChCoChCQChCQChCQChChChCoChChChChChCoChChCQChCh CQCQCQCQCQChCQCQCQCQChChChChCoChCQCQCoChChCoChCoChCoChCQCQChCQCo CoChChChCoCQChChCoChCoChCoChChCoChChChCoChChCoChChChCoChCQChChCh CQChCQCQCQChCoCQChChChChCQCoChChCoChCQChCoCQChCoChCoChChCQCKCQCQ CQChChChChCQChChCoCQCoCQChChCoChChChCoChChChChChCoChChCQChChChCh CQCQCQCQCQCQCQCQCQCQCQChChCoChChCoChChCoChCQCoChChCoCQChCQCQCQCQ CQCQCoChChChCoChChChChCoChChCoChCQChCoChCQChChCoChChCoChChChCQCh CQChChCQCQChCQCQCQCQCQChChCoChChCQCoChChCQCQChChCQCQCQCQCQCQCQCo CoChCoChCoChChChChCoChCoChChCoChCoCQChCoChChCoChChChChCQCQCQChCh CQChChChCQCQCQCQChCoChChCoChChCoChChChChCoCQCQCQCQCQCoChCQCoChCo ChCoChCoChChChChCoChChCoChCoChChCoChCoChCQChChChCQChChCoChChCQCh ChChCoChCQChCQChCQChCoChChChCQCQChChCoChChCoCQCQChCoCQChChCoChCo CoChChChCoChChChChCoChChCoChCoChCoChChCoChChChChCoChChCQCoCQChCQ ChChCmChCQCQCQCQCoChChCoChCoChChCQCoChChCoCQCQCQCQChCoChCQCQCoCh CQChCQChCQChChChChChChChChChCoChChChCoChChChCQChCoChChChChChChCo CQChCQCQCQCQCQCQCQChCoCmChCoChCoChCoChChCoCQCQCoChCQCQCQCmChCoCh ChChCoChChCoChChCoChChChChChChChCoChChCoChChCQChChChCoChChCoChCQ CQCQCQCQCQChChChCQCQCQCQCoChCoCQChChCoChChCQChChCoCQChChCoChChCQ ChChCQChChChCoBeChChCoChCQChCoChCQCoChChCoChCoChChCoChChCQChCQCh CQChCQCQCQChCQChBeChCQCQCQChCQChCoChChCoChChChCQCoChChCoChCQCQCQ } # tile 114 (explosion wet 5) { ChCQCoBeBeBEBEBEBEBEBeBeCQBeBEBEBEAmBKBkAl______________________ CQCQCQBeBeBe_KBEAmBeBeBeBEBeBeBE_kBEBEBDAe__Ae__________________ ChChCKBeBlBeBeBEBeBeBeBeBeBeBE_kBEBEAfAmBDAe____________________ BeCQBeChCQCQBeBeBeBeBQBeBeBEBEBE_gBEAmBEBkBJ____________________ BlCQChChChBlCQBeChCPBQBeBeAmBEBEBEAmBEAmBKAj____________________ BeChCQCQCQChCQChCQBlBeCQBEBEBEBEBEBEBEBEAmBDBDBDBdBJ____________ ChChChChCoChChBeCQChBlBeBEBQBQBeBEBEBEAmBEBD__BKBdAl____________ CQChCoChCQCQCQChCQCQBeBEBEBeBQBeAmBEBEBEAmBEAiBdAe__Ae__________ ChChChCoChChChChChBlBeBEBEBEBEBEBEBEBEAmBEAmBKBdAl______________ CQCoCQCQCQCQCQChCQCQBeBEBEBe_KBEBeBEBEBEAmBDBdBkAe______________ ChChCQChChChCoBeCKBeBeBEBEBEBeBeBeBeBE_kBEAjBdBJAe______________ ChCoCQChCoCQCQChCQBnBQBE_KBEBeBeBeBeBEBE_kBEAj__________________ ChCQChCQCQChCQChChCQBeAmBEBEBeBeChBeBEBEBEBEBEBJAe__Ae__________ CoCQCoChCQCQCQCQCQBlBEBeAmBEBEBeBeChBeBeBEBEBKBkBDAeAeAe________ ChCQChCoChCQCQChChBeBEAmBeBEBeBeBlBeCPBeBEBEAiBDBkBDAl__________ CQCoChCQCQChCQChBeBeBEBE_kBEBECQBeBEBeBeBEAmAlAeBDBkAj__________ ChCQChChCoCQChBeBeAmBE_kBE_kBeBEBeBQBeBEBEBKBDAeAlBJAl__________ CoCQCQChCQChBeBeBEBEBEBEBEBEBEBeBEBeBEBEBEBEAiAl______Ae________ ChChChBeCKBeCKBeBeBeBEBEBE_kBEAmBEBEBE_kAmAmBKBcAl______________ CoChBeBeBeCQBeChBeBEAmBEAmBE_kBE_kBE_kAmBEBEBd__Ae______________ CQChBlChChBlCQChBnBeBEBEBEAmBEBEBEAmBEAmBEAjBkBcAl______________ CoChCQCQCQChCQChBeCKBEBE_kBeAmBEAfBEAmBKBDBKBd__Ae______________ ChCoChChCoChChChChBeBeBEBE_kBEAmBEAmBEAiBKBdBKBdAl______________ CQChCQCQCQChCQCQCQBnBeBEBQBE_kBEBEBeAmAmAiBdBdBdAe______________ ChChChChChChChChChCQBlBEBEBeBeAmBEAmBEBEAmBdBdBkAl______________ CQCQCQCQCQCQCQChCQCKBeBEBEBEBeBeBEBE_KBEAmBEAiBdAe______________ CoChCQChCoChCQChCPBeBEBEBEBeBeBEBEBEBE_kBEBEBKBkAl______________ CQChCQCQCQChCQChBeBEBeBEBEBeBeBeBEBEBQBEAmBEBKBDAe______________ ChCoChChChChCKBeBeBeBeBeBeBQCQBQBeBQBEBEBEBEAmApAl______________ CQChCQChCQBeBEBEBECQBEBnBeBQBeBQBQBEAmBEAmBEBKBkAe______________ CoChCoBeBeBeBEBEBQBQBeBeCKBeBQBQBEBEBE_kBEBD__BcAl______________ CQChCQCK_KBE_kBeBeBeBQCQBeBQBQBe_KBEBEBEBKAlAlAlAe______________ } # tile 115 (explosion wet 6) { __________________AeBDBKBEBEBeBEBEBeBEBEBEBeCQBECQChBlCQChChCoCQ ______________BJBDAeAlBKBEBEAmBEBEBE_KBEAmBeBeBeBeBeBeCQBeChCQCQ ______________AeAl____BDBKAmBeBEBEBEBE_kBEBeBeBeBeBEBeChChBeChCh ____________Ae________AeAlBdApAmAmBEBEBE_KBeBEBEAmBeBeBeBeChBeCh ______________________AeAjBcAjAmBeAmBEAmBEBeBeBeBeBeBeBQBeCKCQBe ______________________BJBKBKAeAlBKBEBXBEBEBEBeBeBEBEBQBeBQBQCQCQ ____________Ae__________BDBdAlAeAlBDBwAiBEBEBeBeBeBEBEBEBEBeChCh ______________AlAlBDAlAeAeBJAeAeAeBdBcBEAmBEBeBEAmBEBEBE_KBeBeBl ______________AlBkBKBkBDAeAeAeAeBJBKBKAmBe_kBEBEBEBEAmBEBEBEBeBe ______________BDBKBKBKAlAeAeAeAeAlBKBFAmBEBEBEBEAmAmAiBEBEBEBeCQ ________AeBJBdBdBKBDBABJAeAeAeAlBdBdBKAmBEBEAmBEBEAiAmAmBEBEBeBE ________AeBkBdBdBKBKBKBDAeAeAeBdBdBdBdBKAmBEBEBEAmBKBEBEAmBEBEBe ________AeBDAlAeBkBkBkAlAeAeBdBkBdBk__BwBkBEBEBEAmBEAmBEBE_kBE_k __________AeAe__AeBkAj__AeBDAiBKBdBKBDBdBjBdBKAmBEAmBEAmBEBEBEBE __________________AlAe__BJBxBKBKBdAlBKBKBkBdBKAmBEAmBEAmBEAfBEAm ______________Ae________AeBDBDBdAeAeBdBdBJBDBdBKBEAmBEAmBEAmBEBE __________________________________AeBdAl__AeBdBDBFBKAmBKBEAmBKAm __________________________________AeAeAe____AeAjBKBKBKBKBKBkAiBd ________________________________________Ae____BKBKBKBEBKBDBDBkBK ______________________________________________BDBKAmAmBKAeAeBkAm ______________________________________________BDBKBKBEAmAf__AlBd ______________________________________________BJBKBEAmBEAf__AeBK ________________________________________Ae____BDBkAmAmAmAf__AeAj __________________________________________AeAeBdBdBdAmBKAl______ __________________________________________AlBdBkBMBDBKAe________ __________________________________________AeAlBdAmBEBKAe__Ae____ ________________________________________Ae____AlBEAmBkAl________ ______________________________________________BDBKBKBcAl________ ______________________________________________BdBkBYAlAe________ ______________________________________________BJAjBD____Ae______ ________________________________________________________________ ________________________________________________________________ } # tile 116 (explosion wet 7) { ChChCoChChCoCQBeChChChChCoCQCQCQChCoChCoChCoChCQChCoChCoChCQChCo CQCQCQCQCQCQCQChCQCQCQChCQCQCQCQCQCQChChCQCQCQCQCQCQCQCQCQCQCQCh ChChChChChChCQChChCoChChChChChCQCoChCoChCQCQChChChChChChChChChBe CQChCQCQCQChCQCQCQChCQCQCQChCQCQChChChCoChCoCQChCQCQCQChCQChCQCQ CQCKChChChChCQChChCQCoChChChCoChChCmChChChChCoChChChCQBeCPCQBlCh CQCQBeCQCQCQCQCQCQChChCQCQCQCQCQCQCoChCoCQCQCQCQCQBnBeCKBeBlBeCh ChBECQBeCoChChChCoChCoChChChChChChCQChChCQChChChChBeChBeBeBeCQCh CQChBeCKBeChCQCQCQChCQCQCQChCQChCQCQCQCoCQChCQCQCQChCQBnBEBeBeCh ChChChChCQChChChChChChChChChChBeChChCQChCQChCoChChChChBeBEAmBeBe BeBnBeBlBeChCQChCQChBeCQCQChBeChCQCQCQCQCQCQCQCQCQCQCQCKBEBeAmCQ BeBeCQChChBeChBeChChChChCoChChBeCQBeChChChChChChChChChBeBEBEBEBe AmBEBCCQBlChBeBlBeCQBeChCQChCQBlCQCPCQChBeChBeChCQChCQBlBEBEBEBe BEBEBEBeCQBlCQChCKChBlBeCKCQBlBeCQBlCQBeCKCQCKChCQCPChBeBEBEBEBE BEBEAmBeBQBQCQBnBeCQCQChBeCQCQChBeBlBeBeBEBeBeChCQChBeBe_kBEAmBE BEBEBEBEBeBeCKChBQBeBlBQBQBeBlBeBeCQBeBEBEBQBeBeChBeBeBEBEBEAmBE _kBEBEBE_KBeBeBnBQCQBeBQBCCQBeBEBQBeBEBEAmBEBQBeBeBeBeBeBEAmAiAm BE_kBEBEBEAmBEBEBEBeBlChChBeBEBQBeBEBEBEBEBEBEBQBeBQBeBeBEBEBEBE AmBE_kBEBEBE_kBEBEBEBeBeBeBeBQBEBEBEAmBEAmBE_KBeBQBE_KBE_kBEAmAm AmBEBEAmAmAiBKAmBEBEBEBeBEBEBEAmBEBEBEAmBEAmBEBEBEAmBE_kBEAmBdBD BEBE_kBEAmBdBcBDAiBE_kBEBEBEBEBeAmBEAmAmAiBEBEBEBEBEBEBEAmBEBcBK AmBEAmBEBKBDBKAiAmBEBEBEBE_kBEAmBEBDBEAmBEBDBEBEBEAmBe_kBEAmBdBK BKAmBEAmAmBEAmBEBEBEBEAmBEBEAmBEAmBEAmBEAmBEAmAmBEBEBEBEBeAmBKBE BdBKBKBKAmBEBEBEBEBEBEBEBEBEAmBdAmAmBE_kBEBEBEBEAmBEBE_kBEBEBKBK AlBkBKBdAmAmBEAmBEAmBEBEAmBEAfAiBFAiAmBE_KBEBEBEAmBEAmBEBEAmBdBd __AlBEAmBEAmAmBEAmBEAmBEAmAmBKBk__BdBE_kBEAmBEAmBEAmBEBEAmBEAeBJ AlBDBKBEBEAmBEAmBEAmBEAmBEAmBDBKBdCTBdBKBKBKBKBEAmBEAmBEAmBKAjBc BJBdBKAjBEBEBEBEBEBEBEBEAmAiBKBkBDAjBJBDBDAjBDBDBEAmBEBEBEAmBkBc __AjBKBDAfAmBEAmAmBE_kAmAmBKBdBJ____________BDBKAmBeAmBEBEAmBdBJ __BJBKAiBMAmAmAmBEBEBEBEAmBlBDAe____________BJBKBEBEBEAmBEBKBJAe __AjBKBKBKBkBDBkAmBEBEBEAmBKAl______________BDBKAmBEAmBEAmAl____ __AlBDBDBJBDBwBdBKBEAmAmBKBdBD______________BJBYBKBKBKAmAl____Ae ______________AeBXBdAfBEBdAl__________________AjBdBDBdBD________ } # tile 117 (explosion wet 8) { ChChCoChBeAmBeBeBeBeBQBeCQBQBeBEBEBEAmBDBDAx______Ae____________ CQCQCQCKBeCQBeBeBQBeBeBeBCBeBeBE_kBEAf______Ae__________________ ChChCKBeBeBEBeBeBeBQBEBQBEBEBE_kAmBKBD__________________________ BeChBeBnBeBlBeBeAmBEBEBeBeBE_kBEBdBDBdBDAe______________________ CQBlChBeCQChChBeBEBEBEBQBE_kBEBEBKAiBdBKBJ______________________ CQCQBeBQBeChCQBeBEBeBQBEAmBEBEBEAmBEBDBdAe______________________ ChBeBlBeCPBeBeBeBEBEBEBEBEAmBEBEBEAmAmAiAl______________________ CQBlBeCQBeBlBeBEBQBEBEBEAmBEAmBE_kBEAmBKAe__Ae__________________ CQChChBeBeChBeBQBQBeBEBEBEBEBE_kBE_kBEBYBJAe____________________ CQBlCQCQBECQCQChBeBEBEBEBEBEAmBEBEBEAmAiBdAl____________________ ChChCQCKChBeBQBeBeBEBEAmAmAmBEBEBEBEBKBkCJBdBD__________________ BeCQBECQBeBQBeBe_KBEBEBEAiBDAmAmAmAmBDBJAjBDBJ____________BJAjBJ BeBQBlBeBEBQChBeBEBEBEAmBEAiBKAmBKAiBD____________________AlBKBd BEBeBeBeBeBeBQBEBEBEAmBEAiBdBdBKBdBKBD____________________AeAeAl BEBEBeBeBeBQBEBeBEAmBEAmBKBxBkBYBKBKBKBDBdAl____________________ _kBEBQBeBQBQBQBe_KBEAmBKBDBDBDAiBKBKBdBDBDBJ____________________ AmBEBeBEBeBQBQBQBEAmAmBcAl__AeBcBKBkBJ__________________________ BEBE_KBEBQBeBQBEBEBEAiBDAe__AeBkBkBDAe__________________________ BE_kBEBEBE_kBEBEAmBdAl______AeBJBDAe____________________________ BEBEBEBEBEBEAmBEBKBd____AeAe________Ae__________________________ AmBEBEBEBE_kBEAmBKBc____________________________________________ BEBE_KBEBEBEAmBEAiAe____Ae______________________________________ AmBEBEAmBEApBKBKBYAeBJAe________________________________________ AmBEBEBEBEBDBcBkBdBkBKAl________________________________________ BKBEBEAmAmAeAeBDBkBkBkAl________________________________________ BKAmBEBKBJ____AlBJAjAlAe________________________________________ BD__BKBdAl______________Ae______________________________________ AeAeBcAl________________________________________________________ AeAeAlAe________________________________________________________ Ae______Ae______________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 118 (explosion magical 0) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________________________________________________Bq________ ________________________________________________________CDBqCDCD ______________________________________________CD________CDCHCHCH ________________________________________________CDCD__CDCeCHCHCa ________________________________________________CH__BqCHCaCaCaCa ____________________________________________CD__CDCHCHCaCaCaCaCa __________________________________________CDCDCHCH__CHCaCaCaCaCa __________________________________________CD__CHCeCHCaCaCaCaCaCa __________________________________________CDCHCHCDCeCDCDCaCaCaCw __________________________________________BqCeCHCHCHCeCaCaCaCwCw __________________________________________CDCHCeCDCDCHCaCaCwCwCw __________________________________________CDCDCDCeCHCaCDCaCwCaCa ______________________________________________CHCeCeCaCDCaCaCaCa ____________________CD________Bq______Bq________CHCeCeCaCaCaCwCw ______________CD______CDCHCHBq__________BqCHCH____CDCHCaCaCwCaCw ________________CDCDCDCHCeCHCD__________CDCe__CDCDCDCaCwCwCwCwCa ________________BqCHCHCeCHCHBq__Bq______CDCeCHCHCHCHCaCwCaCwCaCa ________________CDCHCeCHCHBqCHCHCD____CDCHCDCaCwCaCaCwCwCwCaCeCe ________________Bq__CDCDCDBqCDCeCH__BqCHCaCaCaCwCwCwCwCeCeCeCeCw ________________CDCHCDBqCDBqCDCDCHCDCHCaCaCwCwCeCeCeCwChCeChCeCw __________________CDBqBqBqCDBqBqCD__CHCDCaCwCwCwCeChCeCeCeCeChCe ______________________BqCDBqCDBqCDCDCeCHCaCaCwCeCeCeCwCeChCeCwCe ________________________BqCDCDCDBqBqCHCHCaCaCwChCeChCeCeCeCaCwCe ________________________CDCH__CeCHCDCHCDCaCaCwCeCeCeCeChCwCaCeCh ________________________CDCHCDCDCDCaCaCwCaCaCwCwCeChCeCeCeCeCwCe ________________________CDCHCeCDCHCHCaCwCwCwCwCwCwCeCeCwCwChCeCe ________________________BqCHCHCeCHCaCDCaCwCwCaCwCaCwCwCwCwCeChCe } # tile 119 (explosion magical 1) { ____________CDCHCeCD____________________________________________ ____________BqCeCHCD____________________________________________ ________CDBqCDCDCeCDCDCD________________________________________ Bq______CHCHCHCaCHCDCHCHBq______________________________________ __CDCHCHCeCHCHCaCaCaCHCHCDCHCD__CHBq________CD__CDCHCD__________ __CDCHCeCHCaCDCaCaCaCaCaCaCeCHCDCHCHBqCDCD______BqCHBq__________ CDCDCeCaCaCaCwCaCaCaCaCaCwCaCHCHCHCHCeCHCeBq__BqCD____Bq________ CHCHCDCaCaCaCaCwCaCaCaCaCaCaCHCHCHCHCDCaCaCHBqCDCHBq____________ CeCHCaCaCaCwCwCwCwCaCaCaCaCaCaCHCeCaCaCaCwCHCHCHCHBq____________ CaCaCaCaCaCwCwCwCaCaCDCaCaCaCaCaCaCaCaCwCaCaCHCeCDCD____________ CaCaCwCwCwCaCaCwCaCaCaCaCaCaCaCaCaCaCaCwCwCaCaCHCHBq____________ CaCwCwCwCaCaCaCaCaCaCaCwCaCaCaCaCaCwCwCwCaCaCDCHCH____________CD CwCwCwCwCwCwCaCaCaCwCwCwCwCHCaCDCaCwCwCwCwCwCaCaCaCDCDCDCHCDCD__ CaCwCaCaCwCwCaCaCaCwCwCwCwCHCDCaCaCwCwCwCwCwCaCaCaCaCHCeCHCeCDCD CwCaCaCaCaCaCwCwCwCwCwCwCaCHCHCaCaCwCeCwCwCwCwCwCaCaCaCaCaCH__CH CaCaCDCHCDCaCwCwCwCwCwCwCwCDCDCaCaCwCeCeCeCeCeCwCwCaCaCaCaCHCDCa CaCaCDCDCaCwCwCwCwCwCwCwCwCDCDCaCwCeCeChCeChCeCwCwCaCaCaCaCaCaCa CaCaCaCaCwCwCwCwCwCwCwCwCaCHCDCaCwCeChCeCeCeCeCwCwCaCaCwCaCaCaCw CwCwCwCwCeCeCeCwCwCaCwCwCaCaCaCwCwCeCeCeChCeCeCeCwCwCwCwCwCaCwCw CaCwCwCeCeChCeCeCeCeCwCwCaCwCwCwCeCeChCeCeCeCeChCeCwCwCwCwCwCwCw CwCeCeChCwCeCeChCeChCeCwCaCwCeCeChCeCeChCeChCeCeCeCeCeCwCwCeCwCw CeChCeCeCeCeChCeCeCeCeCwCaCwCeCeCeChCeCeCeCeCeChCeChCeChCeCeCwCw CeCwCwCeChCeCeCeChCeCeCeCwCwChCeCeCeChCeChCeCeCeCeCeCeCeCeCwCwCw CeCeCeCeCeCeChCeCeChCeChCwCeCeCeChCeCeCeCeChCeChCeChCeCeCeChCwCe CeChCeChCeChCeCeChCeCeCeCeCwChCeCeChCeChCeCeCeCeCeCeCwChCeCwCeCh CeCeCeCeCeChChCoCeCeCeChCeCwCwCeCeCeCoCeCeChCeChCeChCeCeCeCeCeCe CeChCeChCeChChCeCeChCeCeCeChCeChCeCeCeCoCeCeCeCeCeCeCeChCeChCeCe CeCeCeCeCeChChCeChCeCeChCeCeCeCeCeChCeChCeChCeChCeChCeCeCeCeChCe CeChCeCoChCoChCeCoCeCeCeChCeCeChCeCeCeChChCeCeCeCeCeChCeCeCeCeCh CeCeChCoChChCoCeChCoCeCoCeCeCeCeCeChCeCeChCeChCeChCeCeCeChCeCoCe CeChCeChCoChCeCeCoCeCeCeCeChCeChCeCeCeChCeCeCeCeCeChChChCeCeChCe CeCeChCeChChCoChCeCoCeCeChCeCeCeCeChCeCeCeChCeChChCoCeCeChChChCe } # tile 120 (explosion magical 2) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________BqCDBqCD______________________________________________ ________BqCHCDCeCD______________________________________________ ________CDCeCHCDCD______________________________________________ BqCDBq__CDCH______CD____________________________________________ CHCHCeCDCDCHCD__________________________________________________ CHCHCaCHCDCD______Bq____________________________________________ CaCaCaCHCDBqCDCDCD______________________________________________ CaCaCDCeCDCDCHCeCDCDBqCDBqCD____________________________________ CwCaCaCH__CHCaCDCHCHCHCHCHCD____________________________________ CwCwCaCaCDCHCDCaCDCHCDCHCHCHCD____Bq____________________________ CwCwCaCaCaCwCaCaCaCaCaCaCaCaCHCDCD______________________________ CaCwCaCwCwCwCwCwCwCwCwCwCwCaCa__CD______________________________ CwCwCwCwCwCwCwCwCwCwCwCwCwCaCaCeCD__CD__________________________ CeCeCeCwCwCwCeCeCeCwCwCwCwCaCDCHCHCD____________________________ CeChCeCeCwCwCeCwCwCwCwCwCwCwCaCaCeCHCD__________________________ CeCeCwCeCeCwCwCwCaCwCwCwCwCwCwCaCHCHCDBq________________________ CeChCeChCeCwCwCwCwCwCwCwCwCwCwCaCaCaCH__________________________ CeCeCeCeCaCwCaCwCwCwCwCwCwCwCaCaCaCHCDCDBqCDCD________CD________ CeChCeChCwCwCaCaCwCwCwCaCaCaCaCaCeCDCHCHCDCDCHCDCDCDCD__________ ChCeCeCeCwCaCaCaCaCwCwCwCaCaCaCaCaCHCHCeBqCDCDCeCHCeCD__________ CeCeChCeCwCwCaCaCwCwCwCwCwCaCaCaCaCHCHCDCDBqCDCDCDCDCD__________ CeChCeCeCwCwCwCwCwCwCwCwCwCwCaCaCaCaCDCDBqBq__________CD________ } # tile 121 (explosion magical 3) { ____________________CDCD____CHCHCaCaCaCaCwCwCeCeCeCwCeCwCeCeCeCe ______________Bq____CDCD____BqCDCHCwCaCwCaCwCwChCeChCeCeCeChCeCe ________________CDCDCeCH______CDCwCwCwCwCaCaCwCeCeCeCeChCeCeChCe ________________BqCeCHCD____BqCDCaCwCaCaCaCwCwCeCeCeCeCeCeCeCeCo ________________CDCHCD____BqCDCDCaCwCwCaCwCwCwCeChCeChCeChCeCeCe ________________BqCDBq______CHCeCaCaCaCwCwCwCwCeCeCeCeCeCeCeCeCe ______________Bq________CDCDCHCaCaCaCaCwCwCwCwCeChCeCeChCeChCeCh __________________CDBq__Bq__CDCaCaCwCaCaCwCwCwCeCeChCeCeCeCeCeCe ____________CD__CDCHCHBqCDCHCHCaCwCwCwCwCwCwCeChCeCeCeChCeCeChCe ______________CDCDCHCHCDBqCDCDCaCwCwCaCwCaCeCeCeCeChCeCeCeChCeCe CDBqCDCD__CDCDCDCeCaCeCDCDBqCDCaCwCwCwCwCeChCeCeCeCeChCeCeCeCeCh CHCDCDCHBqCHBqCDCHCHCHCHCDCDCDCaCaCwCeChCeCeCeChCeCeCeCeChCeChCh __BqCDCeCHCDCDCDCHCDCHCH__CHCaCaCwCeCeCeChCeChCeCeChCeChCeCeCeCe CDCDBqCHCDCDBqBqBqCDCHCHCDCeCaCwCwCeChCeCeCeCeCeCeCeCeCeCeCeChCe ____________CDCDCDBqCDCDCDCDCaCwCeChCeCeChCeChCeChCeChCeChCeCeCh ____________CDCeCHBqBqCDCHCaCaCwCeCeCwCeCeCeCeCeCeCeCeCeCeChCeCh ________CDCDCeCHCaCHCDCDCaCaCwCwCeChCeChCeChCeChCeChCeChCeCeCeCh ________BqCeCHCDCHCHCHCaCaCaCwCwCeCeCeCeCeCeCeCeCeCeCeCeCeCeCoCh ________CDCHCHCHCaCaCwCwCwCwCwCwCeChCeChCeChCeChCeChCeChCeChChCo ________BqCDCaCaCaCwCwCwCwCwCwCwCwCeCeCeCeCeCwCeCeCeCeCeCeCoChCh ______BqCHCDCaCaCwCwCwCwCwCwCwCwCeCeCeChCeCwCeChCeChCeChCeCeCeCh ______CDCeCaCaCwCwCwCwCwCwCwCwCwCwCwCwCwCwChCeCeCeCeCeCeChCoCeCe ______CDCeCDCaCaCwCwCwCwCeCeCwCwCwCwCwCwCwCwCeChCeChCeChCeCeCoCe ____CDCHCDCaCaCwCwCwCaCwCeChCwCwCaCwCwCwCwCeCeCeCeCeCeCeChCeCeCh ____CHCeCeCaCwCwCwCwCaCwCwCeCeCwCwCwCwCwCeChCeChCeChCeCeCeCeChCe ____CDCeCaCaCwCwCwCwCaCwCwCwCwCwCwCwCwCwCeCeCeCeCeCeChCeChCeCeCo ____CHCHCaCaCaCwCwCaCaCaCwCwCwCwCwCwCwCeCeChCeCeChCeCeCeCeChCeCe ____BqCDCHCaCaCwCaCwCaCwCaCeCwCwCwCeCwChCeCeCeChCeCeCeChCeCeCeCe __BqCDBqCDCDCwCaCaCwCaCwCwChCeCaCwChCeCeCwCeCeCeCeChCeCeChCeChCe ____Bq____CHCHCaCaCaCaCaCwCwCeCwCwCeCeCwCwChCeCeChCeCeChCeCeCeCe ________CDCHCeCDCHCHCaCaCwCaCwCwCeCwCeCwCwCeCeChCeCeChCeCeChCeCh ________BqCDBqCHCHCDCDCaCwCwCeCwCeChCeCwCwChCeCeCeCeCeCeChCeCeCe } # tile 122 (explosion magical 4) { CeCeCeChChCeCoChCoChChCeCeChCeCeCoChCoCeCeCeCoChCoCeChCoChCoChCh CeChCeCeChCeCeCeChCoCeChCeCeCeCeChChChChChCeCeChChChCoCeCeChCoCe CeCeCeCeCeCeCoCeChChCeCeCeChCeChCeCoChCoChCoCeCoChCeChCeChCeCeCe CeChCeCeChCeCeCeChChCoCeChCeCeCeCeCeCoChChChCoChChCoChCeCeCeChCe CeCeCeChCeCeChCeCeCoCeCeCeChCeChChCoChChCoChCeCoChChCeCeChCeCeCe CeChCeChChCeCeChCeCeCeChCoCeCeCeCoChChCoChChCoChChChCeChCeCeChCe CeCeChCeCeCeChCeCeChCeCoChCeCeCeChCoChChCoChChCoCeChCeCeCeCeCeCh CeCeCeChChCeCeChCeCeCeCeCeCeCoChChChCoChChCoChChCoChCoChCeCeCeCe CeChCoCeChChCeCeCoCeChCeCoCeChChCoChChCoChChCoChChCoChCeCeChCeCe CoChChCoCeCeChChCeChCoCeCeChCoCeChChCoChChCoChChCoChCeCeCeCeCeCo ChCeCeChCeCeCoCeCeCoChCeChChChChChCoChChCoChChCoChChChCeChCeCeCe CeChChCoChCeCeCoCeChCoCeCeCeCeCoCeChChCoChChCoChChCoChCoCeCeCeCo CeCeCoCeCeCeCeCeCeCoChCeCoCeCoCeChChChChCoChChCoChCeChChCeChCeCh ChCeCeCeCeCeCeCoCeCeChChCoChChCoCeCeCoChChCoChChCoChCoCeChCeCeCo CeCeChCeChCoCeCeCeChChCoChChCoChChCeCeCoChChCoChChCoChCeChCeChCe ChCeCeCeCeChCoCeCoChCoChCeCoChChCoChCeCeChCoChChCoChChCoChCeCeCe ChChCeChCeChChCeCeChCeChCoChChCoChChCoChCoCeChCoChChCoChCeCeChCh ChCoCeCeChCeChCeCeCoCeCoChChCoChChChCoChChChCoChChCoChCeCeChCeCe ChChCeCeCeCeCeChCeCeChChCoChChCoChCoChChCoCeChCoChChCeChCeCeCoCe ChCoChCoChCeChChCeCoChCoChChCoChCeChChCoCeChCoChCeCoCeCeCeCoCeCh CeCeCoChCeCeCeChChChCoChChCoChChCoChCoChChCeCeCeChCeCoChCoChChCo ChChChCoChChCeCeCoChChCoChChCoChCoChChCoChCoChCoCeChChChChChCoCh ChCoChChCeCeCeCeCoChCeChCoChChChChCoChChCoCeCeCeCoCeCoChCoChChCo ChChCoChCoCeChCeCeCoChCoChChChCeCoChChCoChChChCeChChCeCoChChCoCh CoChChCoCeCeCeCeCeChCoChChCoChChCeCoChChCoChCeCeCoChCoChCeCoChCh ChCoCeChCeChCeChChCoChChCoChCoChCoChChCoChCeChChCoChChCoCeChChCo ChCeCoCeCoCeCeCeCeCeCoChChChChCoChChCoChChChChChChCeCoChChCoChCh ChCeCeCeCeChCeChCeCoChCeCoChCoChChCoChChCoChCeCoChCoCeChCoChChCo CeCeChCeCeCoChCeCeChCoCeChCoChChCoChChCoChCeCoChChCeCeCoChChCoCh ChCeCeChCeChCoCeChCeCeCeCoChChCoChChCoChChCoChChCoCeCoChChCoChCe CeCeCoCeCeCeCeCeCeCeChCeChCoChChCoChChCoChCeCoChChCoCeCeCoCeChCh ChCeCeCeCeChCeChCeChCeCeCeCeCoChChCoChChCoChChChChChCoChChChCoCh } # tile 123 (explosion magical 5) { CeCoCeCeCeCwCwCaCwCwCeCeCeCeCwCaCaCaCHCeCD______________________ CeCeCeChCeCeCwCwCwCeCeChCeChCeCwCwCaCaCDCD__Bq__________________ CeChCeCeCeChCeCwCeChCeCeCeCeCwCwCwCaCaCaCHBq____________________ CeCeCeCeChCeCeCeCeCeCwChCeCwCwCwCwCaCaCaCHCD____________________ CeChCeCeCeCeChCeChCeCwCeCeCwCwCwCwCwCaCaCeCD____________________ CeCeCeChCeChCeCeCeCeCeChCwCwCaCwCaCwCaCaCaCHCHCHCHCD____________ CeChChCeCeCeChCeChCeCeCeCwCwCwCeCwCwCaCaCaCD__CeCHBq____________ CeCeChCoChCoCeCeCeChCeCwCeCeCwCeCaCwCaCaCaCaCDCHBq__Bq__________ CeChCeCoChCeCeChCeCeCeCwCwCwCwCaCwCwCwCaCaCaCHCHCD______________ CeCoCeChChChCeCeCeChCeCwCwChCwCwCeCwCwCwCaCDCHCeBq______________ ChChCoCeChCeCeChCeCeCeCwCwCeCeChCeCeCwCwCaCDCHCDCD______________ ChCoCeChChCoCeCeCeChCwCwCwCwCeCeCeChCwCwCaCaCD__________________ CoChChCoChCeCoCeCeCeCeCwCwCwCeCeCeCeCwCwCwCwCaCHCD__CD__________ ChChCoChCoChCeChCeChCeCwCwCwCeChCeChCeCeCwCwCHCeCHCDBqBq________ CoChChChChCoChCeCeCeCwCwCwCaCeCeCeCeCeChCwCaCDCHCeCDCD__________ CeChCoCeCoChCeChCeCeCwCwCwCwCwChCeCwCeCeCwCaCDCDCHCeCD__________ CoChChCeCeCoCeCeCeCwCwCwCwCwCeCeCeCwChCwCwCHCDBqCDCDCD__________ ChCoCeChCeCeCeChCeCwCwCwCaCwCeChCwCeCeCwCaCaCDCD______Bq________ CeCeCeCeCeChCeCeCeChCwCwCwCwCwCwCwCaCwCwCaCaCHCHCD______________ CoCeCeChCeCeCeCeCeCwCwCwCaCaCwCwCwCwCwCaCaCaCD__Bq______________ ChCeChCeCeChCeChCeCeCwCwCwCaCaCaCaCaCaCaCaCDCeCHCD______________ ChCoCeCeCeCeCeCeCeCeCeCwCwCaCaCaCaCaCDCHCDCeCH__Bq______________ CoChCeChCeChCeChCeChCeCwCwCwCaCaCaCaCaCDCeCHCeCHCD______________ ChCeCeCeCeCeCeCeCeCeCeCwCwCwCwCwCaCaCaCaCDCHCHCHBq______________ CeChCeChCeChCeChCeChCeCeCwCeCeCwCwCwCwCaCaCDCHCHCD______________ CeChCoCeChCeCeCeCeCeCeCwCwCwCeCeCwCwCwCwCaCaCDCHBq______________ CoCeChCeCeChCeChCeChCwCwCwCeChCwCwCaCwCwCaCaCHCHCD______________ ChCoCeChCeCeCeCeCeCwCeCwCeCeCeCeCeCwCaCwCaCwCHCHBq______________ CeChCeCeChCeChCeCeCeChCeChCwCeCwCeCwCwCwCwCwCaCHCD______________ ChCoCeChCeCeCwCwCeCeCeCeCeCwCeCaCwCwCwCwCaCaCHCeBq______________ CoChCeCeCeChCwCwCwCwCeCeCeChCwCwCwCwCwCwCaCD__CHCD______________ CeCeCeChCwCwCwChCeCeCwChCeCaCwCeCwCwCaCwCHCDCDCDBq______________ } # tile 124 (explosion magical 6) { ______________CD__BqCHCHCaCwCeCwCwCeCwCwCwCeCeCeCeCeCeCeCeChChCo ______________CDCHCDCDCHCaCwCwCwCwCwCwCwCwCeCeChCeChCeChCeCeCeCh ______________BqCD____CHCeCaCaCwCwCwCwCwCwCeChCeCeCeCeCeCeChCeCh ____________Bq________CDCDCDCDCaCaCwCaCaCwCeCeCwCwCeCeChCeCeCeCe ______________________BqCDCHCDCDCaCaCaCaCwCeCeCeChCeCeCwCeChCeCe ______________________CDCeCHBqCDCHCaCHCaCaCwCeCeCeCwCwCeCaCwChCe ____________CD__________CHCHCDBqCDCHCHCDCwCwChCeCeCwCwCwCwCeCeCe ______________CDCDCDCDCDBqCDBqCDBqCHCHCaCaCwCeCwCaCwCaCwCwChCeCe ______________CDCeCeCeCDCDBqCDBqCDCeCHCaCaCwCwCwCwCaCaCaCwCwCeCh ______________CDCeCHCHCDBqCDBqBqCDCeCDCaCaCwCaCwCaCaCDCaCaCwCeCe ________CDCDCHCHCeCDCeCDCDBqCDCDCHCHCaCaCwCaCaCwCaCDCaCaCaCaCeCh ________BqCHCHCHCHCHCHCHBqBqBqCHCHCHCHCHCaCwCaCaCaCHCaCaCaCwCwCe ________CDCHCDCDCeCHCeCDCDCDCHCHCHCH__CHCHCaCaCaCaCaCaCaCwCwCwCw __________CDBq__BqCeCD__BqCHCDCHCHCeCDCHCHCHCHCaCaCaCaCaCaCwCaCw __________________CDCD__CDCeCeCHCHCDCaCeCeCHCHCaCaCaCaCaCaCaCaCa ______________CD________BqCHCDCHBqBqCHCHCDCHCHCHCaCaCaCaCaCaCaCa __________________________________CDCHCD__CDCHCDCeCHCaCHCaCaCaCa __________________________________CDBqBq____BqCDCHCeCHCHCHCeCDCD ________________________________________CD____CDCHCHCaCeCHCHCeCH ______________________________________________CHCHCaCaCeBqCDCHCa ______________________________________________CHCeCHCaCaCD__CDCD ______________________________________________CHCHCaCaCaCD__BqCH ________________________________________CD____CHCeCaCaCaCD__CDCD __________________________________________BqBqCHCHCHCaCeCD______ __________________________________________CDCHCHCeCDCaCD________ __________________________________________CDCDCHCaCaCHCD__CD____ ________________________________________CD____CDCaCaCeCD________ ______________________________________________CDCHCHCHCD________ ______________________________________________CHCeCDCDBq________ ______________________________________________CDCDCD____Bq______ ________________________________________________________________ ________________________________________________________________ } # tile 125 (explosion magical 7) { CeCeCeCeChChCoCeCeCeCeCeCoChCoChChCoChCoChChCoChCoChCoChChCoChCo ChCeChCeCeCeCeCeChCeChCeCeCeCeCoCeCeChChChCoChCeCeCeCeCoCeCeCeCe CeCeCeChCeChChCeCeCoChCeChCeCeChCoChCoChCoChCeChCeCeCeCeCeChCeCe ChCeChCeCeCeChChCeCeCoCeCeCeChCeChChCoChChCoCeCeCeCoCeChCeCeChCe CeCeCeChCeChChCeCeCoCeCeChCeCeChChCoChChCoChCeChCeCeCeCeCeChCeCe CeChCeCeCeCeCoChCeChCoChCeChCeCeCeChCoChCeCoCeCeChCeCeChCeCeCeCe CeCeCeChCeCeCeCeCeCeCeCeChCeCeChCeCoChChCoCeCeCeCeCeChCeCeChCeCh CeChCeCeCeChCeCeChCeChCeCeChCeCeCeChCoChCeCeCeCeChCeCeCeCeCeCeCe CeCeCeChCeCeChCeCeCeCeCeCeCeCeChCeCeChCeCoCeChCeCeChCeChCwCwCeCe CeChCeCeCeCeCeCeCeChCeChCeChCeCeCeChCeChCeCeCeCeChCeCeCeCaCwCwCe CeCeCeChCeChCeChCeCeCeCeCeCeChCeChCeCeCeCeChCeChCeCeChCeCwCaCwCh CwCwCwCeCeCeCeCeCeCeCeChCeChCeCeCeCeCeChCeCeCeCeChCeCeCeCwCwCwCe CwCwCwCeChCeChCeChCeCeCeCeCeCeChCeChCeCeCeChCeCeCeCeChCeCwCwCaCw CwCwCwCeCwCwCeCeCeChCeChCeCeChCeCeCeCeChCwCeCeCeChCeCeChCwCwCaCa CwCeCwCwCeChCeCeCwCeCeCwCwCeCeCeChCeCeCwCwCaCeChCeCeCeCwCwCaCaCa CwCwCwCwCwCeCeCeCwChCeCwCwChCeCwCwCeCwCwCaCwCwCeCeChCeCeCwCaCDCa CaCwCwCwCwCwCwCwCwCeCeCeCeCeCwCwCeCwCwCaCaCwCwCaCeCwCeChCwCwCaCa CaCwCwCwCaCaCwCwCwCwCeChCeChCwCwCwCwCwCaCaCwCwCeCwCwCwCwCwCwCDCa CaCaCwCaCaCDCHCaCaCaCwCeCwCwCwCwCwCwCwCaCaCaCwCwCwCwCwCwCwCaCHCD CaCwCwCaCDCHCHCHCDCaCwCwCwCwCaCaCaCaCaCaCDCaCaCwCwCwCaCwCwCaCHCH CaCaCaCaCaCDCaCHCaCwCwCaCwCwCwCaCaCDCaCaCaCHCaCaCwCaCwCwCwCaCHCH CHCaCaCaCaCaCaCaCaCwCaCaCaCwCaCaCaCaCaCaCaCaCaCaCaCwCaCwCaCaCHCa CHCHCHCHCaCaCwCwCwCaCwCwCwCaCaCDCaCaCaCwCwCaCwCaCaCaCwCwCwCaCHCH CDCHCHCaCaCaCaCaCaCaCaCwCaCaCaCaCDCDCaCwCwCwCaCaCaCaCwCwCaCaCHCH __CDCaCaCaCaCaCaCaCaCaCaCaCaCaCH__CHCaCaCwCaCaCaCaCaCwCaCaCaCDCD CDCHCHCaCaCaCaCaCaCaCaCaCaCaCDCeCHCeCHCHCHCeCHCaCaCaCaCaCaCHCDCH CDCHCHCDCaCaCwCaCaCaCwCaCaCDCeCHCHCDCHCHCDCDCHCDCaCaCwCwCaCaCeCH __CDCHCaCaCaCaCaCaCwCwCaCDCHCHCH____________CHCeCaCwCwCwCaCaCHCD __CDCeCDCeCaCaCaCaCwCwCaCaCHCDBq____________CHCHCaCwCwCaCaCHCDBq __CDCHCeCeCeCHCHCaCwCaCaCaCeCD______________CHCeCaCaCaCaCaCD____ __BqCHCHCHCHCHCHCHCaCaCaCHCHCD______________CDCDCHCHCHCaCD____Bq ______________CDCHCHCaCaCHCD__________________CDCHCHCHCD________ } # tile 126 (explosion magical 8) { CeCeCeCeCeCwCeCeCeCeCwCeCeCwCeCeCwCwCaCDCDCD______Bq____________ CeChCeChCeCeCeChCwChCeCeCwChCeCwCwCaCD______Bq__________________ CeCeChCeCeCeChCeCeCwCwCwCwCaCwCwCaCHCH__________________________ CeCeCeChCeCeCeCeCaCwCwCeCeCwCwCwCDCHCHCHBq______________________ CeChCeCeCeChCeCeCwCwCwCwCwCwCwCaCaCHCHCeCD______________________ CeCeCeCwCeCeCeChCaCeCwCwCwCaCaCaCaCaCDCHBq______________________ CeChCeCeChCeChCeCwCaCwCwCwCaCaCwCwCaCaCDCD______________________ CeCeCeCeCeCeCeCwCaCwCwCwCaCaCaCwCwCwCaCHBq__Bq__________________ CeChCeChCeCeCeCwCwCeCwCwCwCaCwCwCwCwCaCDCDBq____________________ ChCeCeCeCeCeChCeCeCwCaCwCaCaCaCwCwCwCaCDCHCD____________________ CeCeChCeChCeCwCeChCwCwCaCaCaCaCwCwCaCaCHCeCHCD__________________ CeCeCeCeCeCwCeCeCwCwCaCaCDCDCDCaCaCaCDCHCDCHCD____________CDCDCD CeCwChCeCwCaCeChCwCwCaCaCaCDCHCaCaCDCD____________________CDCeCH CwCeCeCeCeCeCaCwCwCwCaCaCDCaCHCeCDCHCD____________________CDBqCD CwCeChCeChCwCwCeCwCwCaCaCHCeCeCDCHCHCeCHCHCD____________________ CwCwCwCeCaCaCwCeCwCwCaCHCHCHCDCaCHCeCHCHCHCD____________________ CaCwCeCeCeCaCwCwCwCaCaCHCD__CDCHCeCHCH__________________________ CaCwCwCwCwChCwCwCaCaCDCDBq__BqCeCeCHBq__________________________ CaCwCwCwCwCwCwCwCaCDCD______CDCDCHCD____________________________ CaCwCwCwCwCaCaCaCHCH____BqBq________Bq__________________________ CaCwCwCwCwCwCaCaCeCH____________________________________________ CaCwCwCwCaCaCaCaCDCD____Bq______________________________________ CaCaCwCwCaCDCHCHCDBqCDCD________________________________________ CaCwCwCwCaCHCHCeCHCHCeCD________________________________________ CeCwCwCaCaBqCDCHCeCHCeCD________________________________________ CHCaCaCeCD____CDCDCDCDBq________________________________________ CDCDCHCHCD______________CD______________________________________ BqCDCHCD________________________________________________________ CDBqCDBq________________________________________________________ Bq______Bq______________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 127 (explosion fiery 0) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ _______________________________________________________A________ _________________________________________________________A_z_L_B _______________________________________________A________AOAlAeAe ________________________________________________ABAE__ABBTBTBTBs ________________________________________________Ae___MBTBsCECECE _____________________________________________A__ABBJBTBrCECECECE ___________________________________________MAxAeAS__BTCECEBrCECE ___________________________________________O__BJAjAlAxBRBrBrCECE ___________________________________________MASBTAxBDAxAxBSCECbCb ___________________________________________MBVBVAyAyBVCECECECbCx ___________________________________________$BTBVAxAxBTCBCECbCxCx ___________________________________________zAKB_BVBTBRBNBrCbCECE ______________________________________________AeBJBVBrAxBrCBBrCB _____________________A_________A_______A________AeBDAjBRBoCbCzCc _______________A_______MAeAe_M__________AAAeAe____ABAlCBCbCxCfCf _________________A_MAAAeBDBJ_M__________ABBc__AE_BAABrCxCzCfCjCj _________________MAlBXBVAlAeA____A______AOBVBTAyAyBTCECzCjCjCjCj _________________zASBVBTAl_OAeAlAB_____VAlBNCECbCYCBCbCfCjCjCsCs ________________AB__AOAKAK_AABBDAe__AABTBsCBCbCzCcCxCcCsCsCsCsCj _________________MAe_M_z_A_A_AABAe_MBTBSCECxCxCrCrCrCzCsCtCsCsCj ___________________A_A_A_A_A_A_AAO__BJAxBrCxCzCfCsCsCrCsCrCrCtCs _______________________A_A_A_A_A_AAOAlBTBrCbCzCrCtCsCjCsCnCsCjCs _________________________AABAEAO_z_AASBTCBCECzCsCsCsCsCsCsCjCjCt ________________________ABAl__BcAe_zAeBOCBCECzCUCrCrCsCkCjCjCrCs ________________________AABTAxAxAxAxCECbCECECcCzCrCsCsCsCrCrCjCr ________________________ABBVBVB_BTBTBrCbCbCxCzCcCzCUCrCfCzCrCsCs _________________________zAeAjBDBTBrBRCBCxCzCfCjCfCzCzCzCfCsCtCt } # tile 128 (explosion fiery 1) { ____________ABAlBDAE____________________________________________ _____________MBDAlAB____________________________________________ _________M_zAKB_BVAO_z_M________________________________________ _A______AeBDBTBrBTAxBJAl_A______________________________________ ___RAEAeAlBDBTCEBrBsBTBTAZAe_R__AE_B_________A___MAeAB__________ __AEBcBVBTAxBRBrCEBrCECEBrBVAe_VBJAe_OAEAB_______zAe_M__________ _AAOBVCEAxBrCbCECEBrCECECbCEBTBJBTAjBJAlBV_M___A_A_____A________ AlAeBNBrCECBCbCxCECECECECbCEBTAlASAlBOCBCEAlAA_MAl_A____________ BVBTBrCECBCbCzCcCbBRBrCEBrCEBrBTBTBSCBCBCbBJAEAlAl_A____________ CECECbCECbCcCzCzCbBrBRCEBrCECECECECECECbCbBrAlBJAx_A____________ BrCECbCbCxCbCECbCECECBCEBrBrCECECECECECxCbCBBRBVAl_A____________ CbCxCcCxCbCECECEBrCECbCbCECEBrBrCECbCcCcCECBBRAlAl_____________A CbCxCxCxCbCbCEBRBrCbCxCxCbBTAxArCECbCxCxCbCbCBBoAxAKABAEAEAO_A__ CbCbCbCECxCxCECBCbCxCxCxCxAyAaBrCbCbCxCxCcCxCbCuBoAxBTBVAlBJAO_M CbCEBrCEBrCECbCbCbCcCzCbCEAyAyCECuCcCrCcCzCzCxCbCEBrCBBrAxBJ__Al CEBrAxAyBNCBCxCzCzCzCzCzCxAxArCBCbCzCsCrCUCsCrCzCcCuCbCEBSAlAxAx BrBRArArBoCbCxCcCzCfCzCcCbAxArCBCxCUCtCtCsCtCsCfCzCuCBCbCEBRCBCB BrCBCBCBCxCfCzCxCzCfCzCbBoAyArCYCcCsCsCsCsCsCsCjCzCBCECbCbCBCbCb CcCxCbCcCrCsCrCzCjCfCxCbBNCBCuCxCfCsCtCsCsCsCsCrCfCcCbCbCbCbCxCx CjCfCzCrCsCsCsCsCsCsCzCbBoCbCqCjCsCsCtCsCsCsCsCsCrCjCcCxCcCzCcCz CjCsCsCtCjCsCtCtCsCtCsCzCBCcCrCsCtCsCtCsCtCtCtCtCtCsCrCzCzCrCzCz CsCtCsCsCsCtCsCsCsCtCsCzCBCcCsCtCtCtCtCtCtCtCtCtCsCtCsCrCUCrCzCx CrCjCjCsCsCtCtCtCsCsCsCUCcCzCsCsCtCtCtCtCtCtCsCsCtCsCsCkCrCfCzCf CrCrCsCsCtCtCtCtCtCsCtCrCzCrCsCtCsCtCtCtCsCtCtCsCsCsCsCsCsCrCzCr CsCtCsCsCtCtCtCtCtCtCtCsCrCfCrCsCtCtCtCsCtCsCtCtCsCsCjCsCsCjCrCr CsCsCsCtCtCtCtClCtCtCtCsCrCzCfCsCtCsClCtCtCtCtCsCsCsCsCsCrCrCrCr CsCsCtCtCtCtCoCtCtCtCtCsCtCrCrCrCsCtCtClCtCtCsCtCsCsCtCrCrCsCsCs CsCtCtCtCtCtCtCtCtCtCtCsCtCtCsCrCsCtCtCiCtCtCtCsCsCtCsCsCsCtCtCt CsCtCtClCtCoCtCtClCtCtCtCtCtCsCrCtCsCtCtClCtCtCtCtCtCtCsCtCtCtCt CsCtCXCtClCoCtCtClCiCtClCtCtCsCsCtCtCtCtCtCtCtCtCsCtCtCtCsCtClCt CsCtCtCoCtCtCtCtClCtCtCtCtCtCrCrCtCsCtCtCtCtCtCtCtCtClCtCtCtClCt CsCtCtCtCtCoCXCXCtClCtCtCtCsCrCrCtCtCtCtCtCtCtCtClClCtCtCtClCtCt } # tile 129 (explosion fiery 2) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ___________A_A_A_A______________________________________________ _________MAeB_BVAO______________________________________________ ________ANBVAeAxAB______________________________________________ AA_M_M__AOAl_______A____________________________________________ AlASBJ_zAEAS_A__________________________________________________ AlAlBsAeAB_M_______A____________________________________________ BRBRBrBVAE_AABAO_M______________________________________________ CbCEBRBVAO_MAlBJAO_z_M_M_M_A____________________________________ CxCbCBAl__ASAxAxAlASASASAlAB____________________________________ CcCbBoBRAxBTBNBRBOBTAxBTBTBTAE_____A____________________________ CxCbCBCBCYCbCBCECECYCBCBCYBsBTAO_B______________________________ CbCbCbCbCxCzCxCxCxCxCxCxCxCYBo__AE______________________________ CzCcCzCbCbCcCzCzCzCzCzCzCxCBBRBD_O___A__________________________ CrCrCUCcCcCzCUCrCrCzCzCzCxCBArAyAl_M____________________________ CrCrCrCrCfCfCrCzCzCzCzCzCzCbBrBRBJAl_A__________________________ CrCrCfCsCrCzCcCzCfCzCzCzCzCzCxCEBTBTAO_A________________________ CsCsCsCsCrCcCbCzCzCcCzCzCzCzCbCECBBsAe__________________________ CsCtCtCsCfCxCECxCxCbCzCcCcCxCbBrCEBTAxAB_AABAB_________A________ CsCsCsCsCzCbCECECbCxCzCECBCECECEBTAxBTBJ_MAOAl_z_MAB_z__________ CtCtCtCsCzCYCBCECbCbCzCbCBBoCECEBRAlAjBJ_M_AABAjBJBJAO__________ CtCtCsCrCzCcCYCECxCzCzCcCbCBBrCEBrAlAS_B_z_A_AAOANAOAB__________ CtCtCtCrCzCzCcCbCxCjCzCfCzCxCbCECECEAxAA_A_A___________A________ } # tile 130 (explosion fiery 3) { _____________________M_M____ASASAxCBBrCBCxCfCrCrCrCzCUCzCrCsCtCt _______________A____AOAO_____MAZBTCbCbCbCbCxCfCrCrCsCUCUCrCtCsCs _________________AABBDAe______AXCbCxCxCbCECbCzCUCsCsCsCrCsCsCkCt _________________LBVBJAB_____AAZCECxCbCECbCxCcCrCrCrCrCrCrCsCsCl _________________MBJAB_____AAZAxBrCbCbCbCbCxCzCrCsCrCrCrCrCrCtCt _________________AAB_A______AlBVCECECbCxCxCbCcCrCrCrCrCsCsCsCsCt _______________A_________LABAlBrCBCECECbCxCxCzCUCrCrCsCtCsCsCsCs ___________________M_M___O__AxBNCECxCECECxCxCfCrCrCsCtCsCsCsCsCt _____________A___AAlAl_O_MBJBTCECbCxCbCcCzCcCrCsCsCsCtCsCsCsCtCt _______________MAxBTBVAB_z_VAxCECxCxCbCxCfCrCrCsCsCsCtCtCsCsCtCt AB_A_M_M__AB_AAOBVBsBVAx_z_AAKCBCxCxCxCcCrCsCsCsCsCtCtCtCsCtCtCt BJ_MAOAl_AAe_OAKBVBTBJAlAx_MAXCYCbCzCrCsCtCsCtCsCsCsCtCtCtCsCtCl ___AAOBcAl_M_zAOAl_zAeAj__ASBRCYCxCrCsCsCsCsCsCtCsCtCtCtCtCtCtCt _V_z_MAeAO_A_A_A_O_AAlAlABBJBoCbCfCrCtCtCsCtCsCsCsCsCsCtCsCtCtCt _____________M_z_O_AAOAO_zArCBCcCrCrCsCsCsCtCtCsCsCtCtCsCtCtCsCt ____________AOBdAl_A_AAEAyBRCbCzCrCrCjCsCsCsCtCsCsCsCtCtCtCtCtCl _________AAOBVBVAxAeANArBrBrCbCzCrCrCrCrCsCsCrCsCsCtCtCtCtCtCtCt _________BBJBJAxBTBTBTCECbCYCxCfCrCrCsCsCsCsCrCsCtCsCtCtCtCtCtCl _________AAlBTBTCECECbCbCxCxCzCfCrCrCsCsCsCsCrCsCsCtCtCtCtCtCoCl _________AAZBsBrCECbCcCzCxCzCzCzCzCrCrCrCrCrCjCrCkCtCtCtCtClClCt _______OAEAxBrCbCxCcCzCcCzCzCbCxCUCUCrCrCrCfCrCrCsCtCtCtCtCtCtCt ______ABBDAxBrCbCxCzCxCxCjCfCcCxCcCzCzCfCfCrCsCsCsCtCtCtCiClCtCt ______ABBVAxBrCECbCzCbCzCrCrCjCqCbCxCzCzCzCzCsCsCsCtCtCtCtCtClCt _____VAeAxBrCECbCcCbCbCxCrCrCzCbCbCzCcCzCcCrCrCsCtCtCtCtCtCtCtCl ____AEBJBTCECbCzCzCbCECcCzCrCrCcCxCfCzCcCrCrCrCsCtCtCtCtCtCtCtCt ____AOBVBsCECcCzCzCbBrCbCyCjCfCzCzCzCzCjCrCsCrCsCsCsCtCtCtCtCtCl ____AEBJAxCbCECbCzCbBoCECzCzCzCcCzCzCzCUCrCrCsCsCsCtCtCtCtCtCtCt _____A_VBVCECbCbCbCbCECxCfCrCfCzCzCrCzCrCrCrCrCsCsCtCtCtCtCtCtCt ___A_A_AAOAxCbCbCBCbCYCxCzCrCrCfCzCrCrCrCfCrCrCsCsCsCtCtCsCtCtCt _____A____AeBTCECEBrBoCECzCzCrCjCzCrCrCzCfCsCsCtCsCtCtCsCtCtCtCt _________LASBJB_BTAyAxBrCxCfCzCzCrCfCrCcCzCrCsCsCtCsCsCtCtCsCtCt _________A_R_OAEAS_RAZBrCxCzCrCfCUCrCUCzCcCrCsCtCsCtCsCtCtCtCtCt } # tile 131 (explosion fiery 4) { CtCtCtCtCtCtClClCtCXCtCtCiCsCrCtCtCoCtCtCtCtClCtCoCtCtCXCtCXCtCX CsCsCsCtCtCtCtCtCXCXCtCtCsCsCrCsClCtCoCtCtCtCtCoCtClCXCtCtCXCXCt CsCsCtCtCtCtCXCtCiCXCtCtCnCsCsCkCtCXCtCoCtCtCtClCoCtClCtCtCtCtCt CtCsCsCtCtCtCtCtCtCiClCtCtCtCtCtCtCtCtCoCtCoCXClClCtCtCtCtCtCtCt CtCsCtCtCtCtCtCtCtCXCtCtCtCtCtCtClCoCtCoCtCoCtCiCoCtCtCtCtCtCtCt CsCsCtClCtCtCtCtCtCtCtClCtCsCsCtCoCtCtCoCtCtCoCtClCtCtCtCtCsCtCt CsCsCtCtCsCtCsCsCsCtCtClCoCtCtCtCtCoCtCoCtCoCtCoCtClCtCtCrCUCsCs CsCtCtClCtCtCtCsCtCtCtCtCsCtClCtCtCtCoCtCoCtCoCtCtCoCtCnCrCUCsCt CtCtClCtClCtCtCtClCtCtCtClCtClClCoCtCoCtCtCoCtCoCtCoCtCtCrCrCtCt ClCiCXCtCtCtCtClCtCoCtCtCtCoCiCtCoCtCoCtCoCtCoCtCoCtCtCtCsCsCtCl ClCtCtCoCtCtClCtCtCtCoCtCtCtCtCtCtCoCtCoCtCtCoCtCoCtCtCsCtCtCtCt CtCtCiClCtCtCtCiCtClClCtCtCtCtClCtCoCtCtCoCtCoCtCtCoClClCtCkCtCt CtCtClCtCtCtCtCtCtCoCtCtClCtCXCtClCtCtCoCtCoCtCoCtCtCtCoCsCsCtCo CtCtCtCtCtCsCtClCtCtCtCoCtCoCtCoCtCtCtCoCtCoCtCoCtCoCtCtCtCtCtCt CtCtCtCtCtClCtCtCtCtCoCtCoCtCoCtCoCtCtCtCoCtCoCtCoCtCoCtClCtCtCt CtCtCtCtCtCoCtCtCoCtCoCtCtCtCoCtCtCtCtCtCtClCtCoCtCoCtCtCtCsCtCt ClCtCtCtCtClCtCtCtClCtClCoCtCoCtCoCtCtCoCoCtCtCoCtCtCoClCtCtCsCt CiClCtCtCtCtCtCtCtClCtCoCtCtCoCtCoCtCoCtCtCXCtCoCtCoClCtCtCtCtCt ClCXCtCtCtCtCtCtCtCtCtCtCoCtCoCtClCoCtCoClCtCoCtCoCtCtCtCtCtClCt CiCoCtClCtCtCtClCtClClCoCtCoCtCoCtCtCoCtCtCtCoCtCtClCtCtCtClCtCt CtCtCoCtCtCtCtCtCoCtCoCtCoCtCtCoCtCXCtCoCtCtCtCtCtCtCtCXCiCXCoCt CtCtCtCoClCtCtCtCtCoCtCtCoCtCoCtCoCtCoCtCoCXCiClCtClCoCtCmCtCtCo CoCtCoCtCtCtCtCtCtCXCtCoCtCoCtCoCtCoCtCoCtCtCtCtClCtCtCoCtCoClCt CtCoCtCoClCtCtCsCtCoCtCtCoCtCtCtCtCoCtCtCoCtCtCtCoCtCtCoCtCoCtCo CtCoCtCtCtCtCtCtCtCtCoCtCoCtCoCtCtCtCoCtCoCtCtCtCtCoCtClCtClCtCl CoCtCtCoCtCtCtCtCtCoCtCoCtCoCtCoClCoCtCoCtCtCtCXCXCtCoCtCtCmCtCo ClCtClCtClCtCtCtCtCtCtCoCtCtCoCtCtCoCtCoCtCtCXCoCtCtCoCtCoCtCoCt CtCtCtCtCtClCtCtCtCoCtCtCoCtCoCtCoCtCoCtCoCXCtCtCoClCtClClCtCoCt CtCtCtCtCtCtCoCtCtCtCoCtCtCoCtCoCtCoCtCtCoCtClCoCtCtCtCoCtCoCtCX CtCtCtCtCsCoCtCtCtCtCtCtCtCoCtClCtCoCtCoCtClCtCtCoCtCtCtCoCtCoCt CtCtClCtCsCtCtCsCtCtCtCtClCtCoCtCXCtCoCtCoCtCoCtCoCtCtCtClCtClCt CtCtCtCtCtCtCtCsCsCtCtCtCtCtCXCtCoCtCoCtCoCtCtCtCoCtCoCtCoClCiCl } # tile 132 (explosion fiery 5) { CtClCtCrCUCzCzCbCxCzCrCrCsCrCzCbCYCBBTBD_R______________________ CtCtCtCrCrCrCzCzCcCrCrCrCrCrCrCxCxCBBoAx_z___A__________________ CtCsCsCsCsCrCrCfCrCrCrCrCrCrCfCxCxCBBRBRAe_R____________________ CsCsCsCtCtCsCrCrCrCrCfCrCrCzCcCxCxCEBoBrBcAE____________________ CsCsCtCtCsCsCsCsCtCsCjCrCrCcCbCzCzCcCEBoBVAO____________________ CsCtCsCtCtCtCtCsCtCsCsCsCzCzCfCzCfCzCbCBBRAeAeAeAlAB____________ CtCtCtCtCtCtCtCsCsCtCsCrCzCjCjCrCzCcCYCEBrAx__BJAl_M____________ CtCtCoCtClClCtCtCsCsCrCzCUCrCjCrCfCxCbBrCEBrAxAl_A___A__________ CtCtCtCtCoCtCtCtCtCsCrCzCzCzCzCfCzCfCzCECEBSBTAl_M______________ CtCtCtClClCtCtCtCsCsCrCzCzCUCzCjCrCfCcCbBRAZBJBJAA______________ CtCoClCtCtCtCtCsCsCsCrCfCzCUCrCrCrCrCzCxCBAxAlAO_B______________ CoCtCtCoCtClCtCsCtCsCjCzCzCfCrCrCrCrCzCxCuCYAZ__________________ CtCXCoCtCiCtClCtCtCsCrCcCzCcCrCsCtCrCjCyCxCbBrAe_B___A__________ CoClCoCtCXCXCtCtCtCsCUCzCcCzCUCrCsCtCsCrCzCbBTBDAe_A_A_A________ CtClCtCoCtCXCiCtCtCrCzCcCzCfCrCrCsCsCsCrCzCbArAeAjAx_M__________ CtCoCtCtCmCtCtCtCrCUCcCxCxCzCzCsCsCfCrCrCcCEAK_AAlBDAO__________ CtClCoCtCtClCtCsCrCcCzCxCbCxCrCrCrCjCrCzCbBTAZ_A_MAB_M__________ CoClCtCsCtCtCsCrCUCzCcCxCbCbCUCrCzCrCUCxCbBrAx_R_______A________ CtCtCsCsCsCsCsCrCrCrCzCbCbCxCzCcCzCfCzCxCECEBTAS_M______________ CtCtCsCrCrCsCsCtCsCfCcCxCbCECxCxCxCxCxCECEBrAx___M______________ ClCtCsCsCkCsCsCsCsCUCzCcCbCECBCbCECECECEBrAxBJAS_M______________ CoCtCtCtCtCtCsCtCsCsCUCzCxCYBoCEBrBrBRBTAxBVAl__AK______________ CtCoCtCtCtCtCtCtCsCsCrCzCxCxCECECBBoBoAxBVBDBVAl_M______________ ClCtCtCtCtCtCtCtCtCsCrCjCfCzCxCxCbCYCEBNArAlAlAl_z______________ CtCtCtCtCtCtCtCtCtCsCsCUCfCrCrCcCzCcCxCEBrAxAlBD_M______________ CtCiClCtCtCtCtCsCtCsCrCzCzCjCrCrCzCzCzCxCEBrAxAl_O______________ CtCtClCtCtCtCsCtCsCrCzCzCfCrCrCfCzCfCzCxCBBoBTBJ_M______________ ClCoCtCtCtCtCtCsCrCfCrCjCUCrCrCrCUCfCjCbCbCbBTAy_M______________ CtCtCtCtCtCsCsCrCrCrCrCsCrCfCsCjCrCjCfCcCxCbBrAy_M______________ ClCoCtCsCtCsCfCzCrCsCUCsCsCjCsCjCfCzCcCzCEBrBTBJ_M______________ CtCtCtCsCrCrCbCcCjCjCrCUCsCsCjCjCjCzCxCxBrAx__AS_M______________ CtCtCtCsCzCxCxCrCsCsCjCsCsCjCjCrCzCxCbCbBT_VAB_R_A______________ } # tile 133 (explosion fiery 6) { ______________Aa___AAeBTCYCzCrCzCzCrCzCzCzCUCsCsCsCtCsCkCtCtCtCX ______________ABAe_AAOBTCECxCcCzCzCzCzCxCcCrCrCrCrCrCrCsCsCtCtCl _______________A_M____AeBVCBCBCcCzCzCbCxCzCrCrCUCUCUCrCtCsCsCtCt _____________A_________MAEAxBOCECbCbCbCYCzCrCUCfCfCrCrCrCsCtCsCt _______________________AABASAOBNCBCEBrCECxCUCrCrCrCUCrCjCrCsCsCs ______________________ANBJBT_A_MBTBrASBrCbCjCrCrCUCzCfCrCjCjCtCt _____________A__________AeBJ_M_zAKAyASArCxCyCrCrCrCzCzCfCjCsCtCs _______________MAOAOAO_M_AAO_M_A_OAlASBrCbCzCrCjCfCbCbCxCzCrCsCs ______________ABBJBJBDAO_A_A_A_AABBJBTCBCuCxCzCqCbBoBoCbCxCfCrCs ______________ABBJBTBVAN_A_A_A_AABBVAxBrCECbCbCxCEBNBNCECbCxCrCs _________AAOAlAlBVAxBVAO_A_A_A_MAlBJAxBrCbCbCECbBrArBrBrCBCbCUCs _________BBJAlAlBJBTBVAe_A_AABAlAlAlAlBTCECbCbCYBrBTCECBCECbCcCr _________AAe_M_zBDAlBDAB_A_zAlBJAlBD__AiAlCECBCbCECEBrCbCxCxCbCx ___________L_A___MBJAO___zAeAxBTAlBVAxAlAiAlBTBrCECECECECECbCbCb __________________AB_A__ABBcBVBVAlABAxBJBDAjBTBrCECECECECEBrCBCE _______________A_________MAeAxAl_M_AAjAlAOAeBJBTCECECEBrCEBrBoCB __________________________________A_AlAB___BAlAxBTBTBrBTBrBSAxBo ___________________________________A_M_A_____MAZBTBVBTBTBVBJAxAx _________________________________________A____AxBTBTBrBJAeAeBJBT ______________________________________________AeBVBRCEBV_M_BAlBr ______________________________________________AeBVBTBrBsAX___zAx ______________________________________________AEBVCECECBAX___zBT _________________________________________A____AeBJBsCEBrAX___AAO ___________________________________________A_MAlAjAlBrBVAE______ ___________________________________________MAlBJBTAxAxAA________ ___________________________________________zABAlBsCEBT_z___A____ _________________________________________A____AOCECEBJ_M________ ______________________________________________AZBTBTAS_M________ ______________________________________________AlBDB__O_A________ ______________________________________________AEAOAB_____A______ ________________________________________________________________ ________________________________________________________________ } # tile 134 (explosion fiery 7) { CtCtCtCtCtCtCXCsCtCtCtCtCtCXClClCtCoCtCoCtCoCtClCoCtCoCtCoClCtCo CtCtCtCtCtCtCtCtCtCtCtCtCtCtCtCXCtCtCoCtClClClCtCtCtCtClCtCtCtCt CtCtCtCtCtCtClCtCtCtCtCtCtCtCtCiCoCtCtCoClCiCtCtCtCtCtCtCtCtCsCs CsCtCsCtCtCtCiCtCtCtClCtCtCtCtCtCtCoCtCoCtCoCtCsCtClCtCsCtCsCtCs CsCsCtCtCtCtClCtCtClCtCtCtCtCtCtCtCXCtCoCtCtCtCtCsCtCsCsCsCsCsCt CtCsCsCtCtCtClCtCtCoCtClCtCtCtCtCtCtCoCtCtCXCtCtCsCsCsCsCrCsCsCt CtCsCsCsCtCtCtCtCtCtCtCtCtCtCtCtCtCmCtCoClCtCtCtCtCsCtCsCrCrCsCt CtCsCsCsCsCtCtCtCsCtCtCtCtCtCtCtCtClCXCtCtCtCtCtCtCtCsCsCUCrCsCt CtCsCtCsCsCtCtCtCtCsCtCtCtCtCtCsCtCtClCtCXCtCtCtCtCtCtCrCjCqCrCs CsCsCsCsCsCtCsCsCtCtCsCtCtCsCsCsCsCtCtCtCtCtCtCtCtCtCtCsCfCxCcCs CrCrCsCtCsCsCtCsCsCtCsCtCtCtCtCsCsCsCtCtCtCtCtCtCtCtCtCsCzCbCxCr CcCzCjCsCkCsCsCsCsCsCsCtCtCtCsCsCtCsCtCtCsCsCsCsCtCtCsCsCcCbCbCr CzCcCzCrCsCsCsCtCsCtCsCsCsCsCsCsCsCsCsCsCsCsCsCtCsCsCtCrCzCbCYCz CzCzCcCrCjCjCtCsCsCsCsCtCsCsCsCtCsCsCrCrCzCrCsCsCtCsCsCrCxCbCBCY CcCUCzCzCrCsCsCtCjCsCsCjCjCsCsCrCrCkCrCzCzCjCrCsCtCrCrCzCcCEBNCE CxCzCzCzCzCrCrCsCjCsCsCjCjCsCsCfCjCrCzCbCbCjCjCrCsCrCrCrCcCEBNBo CBCxCxCcCxCcCzCzCjCrCsCtCtCrCjCfCrCfCxCBCBCyCjCjCrCjCrCrCzCbCBBo BrCbCxCxCBCBCxCxCcCzCrCrCrCrCfCzCzCfCcCYCECbCzCrCjCfCzCxCxCxBRBN BrCbCxCEBoArBTBsCBCbCzCUCzCzCzCcCxCcCbBrBoCECxCzCfCzCbCxCxCEAlAx CECbCxCEBRAlASAeBNCBCxCzCcCxCbCYCbCECEBNBNBrCbCxCcCbCbCxCcBoASBT BrCECECEAxAxAxAyBNCbCbCbCxCxCbCEBrAxBrCEBrBTBrCbCbCECbCxCbBrAlBT BTBrCECEBrBrCECECbCbCbCECbCbBrBrCEBrCECECEBrCECECbCbCbCbCbCEBTBr AlBVBTBTBrCECbCbCxCbCbCcCbCbBrAxBrBRCECxCxCbCbCECECbCxCxCbCEBTBT _VBJBTAxBrCECECECbCECbCzCbCEBSAxAxAxCECxCzCbCbCEBrCECcCxCbBrAlAl ___MBrCEBrBrBrCEBrCECECECEBRAxBJ__AlBoCYCxCECYCEBrCECbCECECE_zAE AOAlBTBrCbCECECECECECECECEBRAxBVBJAiBJBTBTBVBTBrCECECECECEBTAOAS _VBJBTAxCECbCbCECBCbCbCEBrAxBVAjAeAOAEAeAZAOAeAxCECECbCbCEBsBDAS __ABBVAxBSCECbCECECbCxCEBRBTBJAE____________AeBVCbCbCcCcCEBrBJAB __AOBVAxBTBsBRBSCECbCbCECEBTAZ_B____________AEBVCECbCbCEBrBTAK_A __ANBVBVBJBJAlAlCECbCbBrBrBVAO______________AeBVCECECECEBsAB____ ___MAeAeAEAeASAlBTCECEBrBTAlAB______________ABB_BTBTBTBsAN_____A _______________BASAlBSBrBJAB__________________AOAjAeBJAO________ } # tile 135 (explosion fiery 8) { CtCtCtCtCrCcCUCrCrCrCjCsCsCfCrCUCzCbBNAxAa_R_______B____________ CtCtCtCsCsCsCrCrCjCrCrCrCjCrCrCzCxCEAX_______A__________________ CtCtCsCrCrCUCrCrCrCfCzCjCfCfCzCxCEBTAe__________________________ CsCsCsCsCrCsCsCrCfCzCzCrCrCzCxCbAxAeBJAe_M______________________ CsCsCtCsCsCtCsCrCzCfCfCjCzCxCbCbAxAyAlBJAB______________________ CtCsCsCjCsCsCtCrCfCrCjCfCcCYCbCECEBrAxAl_M______________________ CtCsCsCsCsCsCrCUCjCfCyCcCbBrCBCbCbCEBNAx_z______________________ CsCsCsCsCsCsCrCfCjCzCzCzCEBoCECxCxCbBrBT_$___A__________________ CsCtCsCsCrCtCrCjCjCUCzCzCbCECbCxCxCxCEB_AD_A____________________ CtCsCtCsCsCsCsCtCsCzCbCbCbCECECbCzCcCEAxBJAB____________________ CtCsCsCtCsCsCjCsCrCzCbCBBRBSCECbCxCEAxAjBDAjAO__________________ CsCsCsCsCsCjCsCrCzCbCbCBArAxBRCEBrBRAxAEAOAeAO____________ABAOAO CrCjCsCrCjCjCtCrCzCbCECEBrAxBTBrAxAxAZ____________________AOBJAl CzCrCrCrCrCrCjCjCcCbCEBrArAxBJBVAxBTAx_____________________M_M_M CxCUCrCrCrCjCjCrCzCcCEBRBTBcBDB_BTBVBVAeAlAB____________________ CxCyCjCrCjCjCfCrCzCbBrBTAlAeAOAxBVBJAlAeAlAB____________________ CECzCrCUCrCjCjCjCxCEBRAS_V___BASBVAjAE__________________________ CbCxCzCzCjCrCjCzCbBoAxAB_z___BBDBcAe_z__________________________ CYCxCzCzCyCxCbCbBrAxAK_______AAOAeAA____________________________ CBCbCzCzCcCYCEBoBTAl_____A_A_________A__________________________ CECbCzCzCzCxCECEBVAS____________________________________________ CECbCzCzCbCBCECEAx_A_____A______________________________________ CECECzCcCBBOBTBTAZ_OAB_z________________________________________ CECbCzCbBoAeASBDAlBJBJ_O________________________________________ BVCbCbCEBR_A_BAeAjBJAlAB________________________________________ BVBrCEBVAO____ABAOABAB_A________________________________________ ANAZBTAl_R_______________A______________________________________ _A_BAS_R________________________________________________________ _A_A_M_A________________________________________________________ _A_______A______________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 136 (explosion frosty 0) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ _______________________________________________________a________ _________________________________________________________a_a_a_a _______________________________________________a_________aAiAfAf _________________________________________________aAf___aAmAmAm_b ________________________________________________Af___aAm_b_f_f_f _____________________________________________a__AfAmAm_f_f_f_f_f ___________________________________________a_bAfAf__Am_f_f_f_f_f ___________________________________________a__AmAmAmAm_b_f_f_f_f ___________________________________________aAfAm_bAm_b_b_b_f_f_g ___________________________________________aAmAmAiAiAm_f_f_f_g_g ___________________________________________aAmAm_b_bAm_f_f_g_g_g ___________________________________________a_b_bAmAm_b_b_f_g_f_f ______________________________________________AfAmAm_b_b_b_f_b_f _____________________a_________a_______a________AfBDAm_b_f_g_g_g _______________a_______aAfAf_a___________aAfAf____AfAf_f_f_g_f_g _________________a_a_aAfAmAm_a___________aAm___a_a_a_f_g_g_g_g_g _________________aAmAmAmAmAf_a___a_______aAmAmAiAiAm_f_g_f_g_g_g _________________aAfAmAiAm_aAmAf_a____AfAm_b_f_g_g_f_g_f_g_gBEBE _________________a___a_a_a_a_aAmAf___aAm_b_f_g_g_f_g_gBEBEBEBE_g _________________aAf_a_a_a_a_a_aAm_aAm_b_f_g_g_gBEBE_gBEBEBEBE_g ___________________a_a_a_a_a_a_a_a__Ai_b_b_g_g_gBEBE_gBE_gBEBEBE _______________________a_a_a_a_a_a_aAmAi_f_g_gBEBEBE_gBEBeBE_gBE _________________________W_a_aAf_a_aAfAm_f_f_gBEBEBEBEBEBE_g_gBE _________________________aAm__AmAm_aAf_b_g_f_gAmBEBEBEAm_g_fBEBE _________________________aAm_b_b_b_b_f_g_f_f_f_k_gBEBEBe_gBE_gBE _________________________aAmAm_bAmAm_f_g_g_g_g_g_gBEBE_f_g_gBEBE _________________________aAfAiAi_b_f_b_f_g_g_f_g_f_g_g_g_fBEBEBE } # tile 137 (explosion frosty 1) { _____________aAfAmAf____________________________________________ _____________aAmAm_a____________________________________________ _________a_a_b_bAm_a_a_a________________________________________ _W______AfAmAm_f_b_bAiAm_W______________________________________ ___aAfAfAmAmAm_f_f_fAmAm_bAf_a__Af_a_________a___aAf_a__________ __AfAmAmAm_b_b_f_f_f_f_f_bAmAfAfAmAf_aAf_a_______aAf_a__________ _a_aAm_fAm_b_g_f_f_b_f_f_g_fAmAmAmAmAmAmAm_a___a_a_____a________ AfAf_b_f_f_f_g_g_f_f_f_f_f_fAmAmAfAi_b_f_fAi_a_aAf_a____________ AmAm_f_f_g_g_g_g_g_b_f_f_f_f_fAmAm_b_g_f_gAmAfAfAm_a____________ _f_f_f_f_g_g_g_g_g_f_b_f_b_f_f_f_f_f_f_g_g_fAfAm_b_a____________ _f_f_g_g_g_g_f_g_f_f_g_f_f_b_f_f_f_f_f_g_g_f_bAmAm_a____________ _f_g_g_g_f_f_f_f_b_f_g_g_f_f_b_f_f_g_g_g_f_f_bAmAf_____________a _g_g_g_g_g_g_f_b_f_g_g_g_gAmAm_b_f_g_g_g_g_g_g_fAm_a_a_aAfAf_a__ _g_g_f_f_g_g_f_f_g_g_g_g_gAi_a_f_g_g_g_g_g_g_f_k_f_bAmAmAmAm_a_a _g_f_f_f_f_f_g_g_g_g_g_g_fAiAi_f_k_gBE_g_g_g_g_g_f_b_g_fAmAm__Af _f_f_bAi_b_f_g_g_g_g_g_g_g_b_b_f_f_gBEBEAmBE_g_g_f_k_g_f_bAi_b_b _f_b_b_b_f_g_g_g_g_f_g_g_g_b_b_f_kBEBEBEBEBEBE_g_g_k_g_g_f_b_g_f _b_f_f_f_g_g_g_g_g_g_g_g_fAi_b_g_gBEBEBEBEBEBE_g_g_f_f_g_g_f_f_g _g_g_g_gBEBEBE_g_g_f_g_g_b_f_k_g_gBEBEBEBEBEBEBE_g_g_g_g_g_g_g_g _f_g_gBEBEBEBEBEBEBE_g_g_f_g_g_gBEBEBEBEBEBEBEBE_g_g_g_g_f_g_g_g _gBEBEBE_gBEBEBEBEBEBE_g_g_gBEBEBEBEBEBEBEBEBEBEBEBEBE_g_gBE_g_g BEBEBEBEBEBeBEBEBEBEBE_g_f_gBEBEBEBeBEBeBEBeBEBeBEBEBEBEAmBE_g_g BE_g_gBEBEBEBeBEBEBEBEAm_g_gBEBEBEBEBeBEBeBEBEBEBEBEBEBEBE_g_g_f _gBEBEBEBEBEBEBeBEBEBEBe_gBEBEBEBEBeBEBEBEBeBEBEBEBEBEBEBEBE_gBE BEBEBEBEBeBEBeBEBeBEBeBEBE_fBEBEBeBEBEBEBEBEBeBEBEBE_gBEBE_gBE_g BEBEBEBeBEBeBeCQBEBeBEBE_g_g_fBEBEBEBnBeBEBeBEBEBEBEBEBE_gBE_gBE BEBEBeBEBEBEBlBEBeBEBEBEBE_gBEBEBEBEBeBeBeBEBEBEBEBEBEBEBEBEBEBE BEBEBEBeBECQBEBeBEBeBEBEBEBeBEBEBEBEBEBnBEBeBEBEBEBEBEBEBEBEBEBE BEBEBeBeBlCQBlBEBeBEBeBEBeBEBE_gBEBEBeBEBeBEBeBEBEBEBEBEBEBEBeBE BEBEApCQBeBeBeBeBeBeBECQBEBEBEBEBEBeBEBeBEBeBEBeBEBeBEBeBEBeBnBe BEBEBeBeBlBeBeBEBeBEBeBEBeBEBEBEBEBEBeBEBeBEBeBEBeBEBeBEBeBEBeBE BEBEBEBeBeCQApCQBEBeBEBeBEBE_gBEBEBeBEBeBEBEBEBeBnBeBEBeBEBeBEBe } # tile 138 (explosion frosty 2) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ___________a_a_a_a______________________________________________ _________aAf_bAm_a______________________________________________ _________aAmAf_b_a______________________________________________ _a_a_a___aAm_______a____________________________________________ AmAfAm_aAfAf_a__________________________________________________ AfAi_bAf_a_a_______a____________________________________________ _b_b_fAmAf_a_aAf_a______________________________________________ _g_f_bAm_a_aAfAm_a_a_a_a_a_a____________________________________ _g_g_gAf__AfAm_bAmAfAmAfAm_a____________________________________ _f_g_f_b_bAm_b_b_bAm_bAm_bAm_a_____a____________________________ _k_g_g_f_g_g_g_f_f_g_g_f_g_fAmAf_a______________________________ _g_g_f_g_g_g_g_g_g_g_g_g_g_g_f___a______________________________ _g_g_g_g_g_g_g_g_g_g_g_g_g_f_bBD_a___a__________________________ _gBEAm_g_f_gAmBE_g_g_g_g_g_f_bAiAf_a____________________________ BEBEBe_g_g_fBe_g_g_g_g_g_g_g_f_bAmAf_a__________________________ _gBE_gBE_g_g_f_g_f_g_g_g_g_g_g_fAmAm_a_a________________________ BEBEBEBEBE_g_g_g_g_g_g_g_g_g_g_f_f_bAm__________________________ BEBEBEBE_f_g_f_g_g_g_g_g_f_g_g_f_fAm_b_a_W_a_a_________a________ BEBEBEBE_g_g_f_f_g_g_g_f_g_f_f_fAm_bAmAm_aAfAm_a_a_a_a__________ BEBeBEBE_g_g_f_f_g_g_g_g_f_f_f_f_bAmAiAm_a_a_aAmAmAm_a__________ BeBEBEBE_g_g_g_f_g_g_g_g_g_f_f_f_fAfAm_a_a_a_aAf_a_a_a__________ BEBeBEBE_g_g_g_g_g_g_g_g_g_g_g_f_f_f_b_a_W_a___________a________ } # tile 139 (explosion frosty 3) { _____________________a_a____AmAfAm_f_f_f_k_fBE_gBE_gAm_gBEBEBEBE _______________a_____aAf_____a_bAm_g_f_g_g_g_fBE_gBEBEBE_gBEBEBE _________________a_aAmAf_______a_g_g_g_g_f_g_gAmBEBEBEBEBEBEBEBE _________________aAmAi_a_____a_b_f_g_g_f_f_g_gBE_gBE_gBE_gBEBECQ _________________aAm_a_____a_b_b_f_g_g_g_g_g_g_gBEBEBE_gBEBEBEBE _________________a_a_a______AfAm_f_f_f_g_g_g_fBE_gBE_gBEBEBEBEBE _______________a_________a_aAm_f_f_f_f_g_g_g_gBEBE_gBEBEBEBEBEBE ___________________a_a___a___b_b_f_g_f_f_g_g_gBE_gBEBEBEBEBEBEBE _____________a___aAfAm_a_aAmAm_f_g_g_g_g_g_gBEBEBEBEBeBEBEBEBEBE _______________a_bAmAm_a_aAf_b_f_g_g_f_g_fBE_gBEBEBEBEBEBEBEBEBe _a_a_a_a___a_aAfAm_bAm_b_a_a_b_f_g_g_g_gBEBEBEBEBEBEBeBEBEBEBeBE Ai_a_aAm_WAf_a_aAmAmAiAm_b_a_a_g_f_g_gBEBEBEBEBEBEBEBEBeBEBEBECQ ___aAfAmAm_a_aAfAm_aAfAm__Af_b_g_kBEBEBEBEBEBEBEBEBEBeBEBeBEBeBE _a_a_aAf_a_a_a_a_a_aAfAm_aAm_f_g_fBEBEBEBEBEBEBEBEBEBEBEBEBeBEBe _____________a_a_a_aAfAf_a_b_g_gBE_gBEBEBEBEBEBEBEBEBEBEBEBEBEBE _____________aBKAf_a_aAfAi_b_g_g_gBE_gBEBEBEBEBEBEBEBEBeBEBeBEBl _________aAfAmAmAmAf_a_b_f_f_g_gBEBEBE_gBEBEBEBEBEBEBeBEBeBEBeBE _________aAmAm_bAmAmAm_f_g_g_g_g_gBEBEBEBEBE_gBEBEBEBEBeBEBeBeCQ _________aAfAmAi_f_f_g_g_g_g_g_fBE_gBEBEBEBEBEBEBEBEBeBEBeBEBlBe _________W_b_b_f_f_g_g_g_g_g_g_g_gBE_gBE_gBE_gBEAmBeBEBeBEBeApCQ _______aAf_b_f_g_k_g_g_g_g_g_g_gAmBEBE_gBE_gBE_gBeBEBeBEBeBEBeBE _______aBD_b_b_g_g_g_g_g_g_g_f_g_g_g_g_g_fBEBEBEBEBEBEBeBeBeBEBE _______aAm_b_f_f_g_g_g_gBE_g_g_g_g_g_g_g_g_gBEBEBEBEBeBEBeBEBeBE _____aAf_b_f_f_g_f_g_g_g_gBE_g_g_f_g_g_g_fBE_gBEBEBeBEBeBEBeBECQ ____AfAmAm_f_g_g_g_g_f_g_gBEBE_g_k_f_g_gBEBEBEBEBEBEBeBEBeBEBeBE _____aAm_b_f_f_g_g_g_b_g_g_g_g_g_g_g_g_g_gBE_gBEBEBEBEBeBEBeBEBl ____AfAmAm_g_f_g_g_g_f_f_g_g_g_g_g_g_gAmBE_gBEBEBEBEBeBEBeBEBeBE _____aAfAm_f_g_g_f_g_f_g_fBE_g_g_gBE_gBe_gBE_gBEBEBEBEBeBEBeBEBe ___a_a_aAf_b_g_g_g_g_g_g_gBEBE_f_gBEBE_g_gBEBEBEBEBEBeBEBEBEBeBE _____a____AfAm_f_f_f_f_f_g_g_g_g_gBE_g_g_fBEBEBEBEBEBEBEBEBeBEBe _________aAfAm_bAmAiAm_f_g_f_g_gBE_gBE_g_g_gBEBEBEBEBEBEBEBEBeBE _________W_a_aAfAf_a_a_f_g_g_g_gBEBEAm_g_fBEBEBEBEBEBEBEBEBeBEBe } # tile 140 (explosion frosty 4) { BeBEBEBECQBEBeBeBnBeCKBEBeBEBEBECQBlCQBEBeBEBeBeCQBEBlBeCQBeBlBe BEBEBEBeBEBeBEBeBeBeBEBEBEBE_gBEBeBeBeBlBEBEBEBlBEBeBnBeBEBeBIBe BEBEBEBEBeBEBeBEBeBeBeBEBeBEBEAmBeBeCQBeCQBeBeBeCQBEBeBEBeBEBEBE BEBEBEBeBEBeBEBeBEBeApBeBEBEBEBEBEBeBeBlBeBlBIBlBIBlBEBeBEBeBEBE BEBEBEBEBeBEBeBEBeBeBeBEBeBEBeBEBeBnCQBeCQBlBeBeBlCQBeBEBeBEBeBE BEBEBEBlBEBEBEBEBEBEBECQBeBEBEBeBeBeBeBlBeBeBeCQBeBeBEBEBEBEBEBE BEBEBeBEBEBEBEBEBEBEBeBeBlBEBEBECKBeCKBeCQBeBlBeBeBeBeBEBEAmBEBE BEBEBECQBEBeBEBEBEBeBEBeBEBeBIBeBeCQBeBnBeBlBeCQBeBlBeBe_gBEBEBe BeBEBeBEBeBEBeBEBeBEBeBEBeBEBeBeBlBnCQBeCKCQBlBeBnCQBlBEBEBEBEBE BeBeBIBlBEBeBECQBEBeBeBeBEBeApBeBeBeBeBlBeBeBeCQBeBeBEBEBEBEBECQ BeBEBeBeBeBEBeBEBeBeBlBEBeBeCQBEBlBeCKBeCQBeBlBeBlBeBeBEBEBEBeBE BEBEBICKBEBeBEBlBEBeBIBeBEBeBECQBECQBeBnBeBlBeCQBeCQApCQBEBEBEBl BeBEBeBEBEBEBeBEBeBlCQBEBeBEBeBEBEBEBlBeCQBlCQBEBlBECQBEBEBEBeBe BEBeBEBeBEBEBECQBEBeBeBlBeBeBeBlBEBeBeCKBeBeBeCQBeBeBeBeBEBEBECQ BeBEBeBEBeBeBeBEBeBECQBeCPBeBlBeCQBEBeBeBnBeBlBeCKBeBnBEBeBEBEBE BEBeBEBeBEBlBeBeBeBlBeBlBECQBeCPBeBeBEBeBeBeBeBnBeCQBeCQBEBEBEBe BeBEBeBEBeBeCQBEBeBeBeBeBlCQBlBeBlCQBlBeCQBECKBeBlCQBlBeBEBEBEBe BeBeBEBeBEBeBEBeBEBeBECQBeBeBeCQBeBeBeBlBeBeBeCQBeBeA$BEBEBeBEBe BeBeBeBEBeBEBeBEBeBEBlBeBlBeBlBeBeBeCQBeBeBEBlBeBlBeBeBEBeBEBeBE BIBlBeCQBEBeBEBnBEBeApCQBeCQBeCQBEBnBeBlBEBeBeCQBEBeBEBeBEBeBECQ BeBEBlBeBeBEBeBECQBlCQBeBlCQBlBeBlBeCQBeCQBEBeBEBeBECQBeBeBeBlBe BEBeBeCKBeBeBEBeBeBeBECQBeBeBeCQBeBeBeBlBeBeBABnBEBeBeBlBeBeBeCQ CQBeBnBeBeBEBeBECKBeBeBeBlBeBlBeCKBeCQBeBeBEBeBEBeBECQBeCQBEBeBe BeBlBeCQApBeBEBEBECQBECQBeCQBEBeBeBnBeCKBeBnBEBeBeBlBEBlBECQBeBl CQBlCQBeBeBEBEBEBeBlCQBEBlCQBlBeBeCQBlBeCQBlBeBECQBnCQBeBeBeBlBe BeBeBEBlBEBeBEBeBeBeBECQBeBeBeCQBeBeBeBnBeBeBECKBeBeBeBlBEBeBeCQ BeBEBeBEBeBEBeBEBeBECQBEBlBeBnBeBlBeCKBeCQBEBeBeBnBECQBeCQBeBlBe BEBeBEBeBEBeBEBeBEBlBeBeBeCQBeCKBeCQBeBlBeBeBECKBeBeBEBlBnBlBeCQ BEBEBeBEBeCQBlBEBeCQBlBECQBlCQBeBlCQBlBeCQBEBeBeCQBEBeBeBnCQBlBe BEBeBEBeBEBeBeBEBEBeBEBeBeBeBECQBeBeBeBnBeBeBeBlBEBeBeBlBeBeBeBe BeBEBeBEBEBEBeBEBeBEBeBEBeBeBlBeBeBeCKBeBlBECQBeCQBeBeBEBeBEBeBE BEBeBEBeBEBeBEBEBEBEBEBeBEBeBIBlBeBnBeCQBeBlBeBeBeBlBeCQBeBeApCQ } # tile 141 (explosion frosty 5) { BeBeBe_gAm_g_g_g_k_gBE_gBEBE_g_g_g_fAmAm_a______________________ BEBeBEBE_gBE_g_g_gBE_gBE_gBE_g_g_g_f_f_b_a___a__________________ BEBEBEBEBE_gBE_fBE_gBEBEBE_g_g_g_g_f_b_bAf_a____________________ BEBEBEBEBEBE_gBE_gBE_gBE_g_g_g_g_g_f_f_fAmAf____________________ BEBEBeBEBEBEBEBEBEBE_g_gBE_g_g_g_g_g_f_fAmAf____________________ BEBEBEBeBEBEBEBEBEBEBEBE_g_g_f_g_f_g_f_f_bAfAfAfAf_a____________ BEBECQBEBeBEBeBEBEBEBEBE_g_g_gBE_g_g_g_f_f_b__AmAm_a____________ BEBeBECQApBeBEBEBEBE_g_gAmBE_gBE_f_g_g_f_f_f_bAm_W___a__________ BeBEBeBeCQBEBeBEBEBEBE_g_k_g_g_f_g_f_g_f_f_bAmAf_a______________ BEBeBEBlBeBeBEBEBEBE_g_g_fBE_g_g_g_g_f_g_b_bAiAm_a______________ CQBeBeBEBeBEBeBEBEBEBE_f_gAmBEBEBE_g_g_g_f_bAmAf_a______________ BeBlBECQBeBeBEBEBEBE_g_g_g_g_gBE_gBE_g_g_g_g_a__________________ CQBeBlBeBeBEBeBEBEBEBE_g_g_gBEBEBEBE_g_g_k_g_fAf_a___a__________ BeBeBeBnBeBeBEBeBEBEBE_g_g_gBEBEBEBEBEBE_g_gAmAmAf_a_a_a________ BlBeCQBeCKBeBeBEBE_g_g_g_g_fBEBEBEBEBEBE_g_g_bAfAm_b_a__________ BeBlBeBeBIBnBEBE_gAm_g_g_g_g_gBEBE_g_gBE_f_f_a_aAfAm_a__________ CPBeCKBEBeBeBEBEBE_g_g_g_g_gBE_gBE_gBE_g_gAm_b_a_a_a_a__________ BeBeBEBEBEBEBEBEBE_g_f_g_g_gAmBE_gBEAm_g_g_f_b_a_______a________ BeBEBEBEBEBEBEBEBE_g_g_g_g_g_g_g_g_f_g_g_f_fAmAf_a______________ BeBEBEBE_gBEBEBEBE_g_g_g_f_f_g_g_g_g_g_f_f_f_b___a______________ BeBEBEBEBEBEBEBEBEAm_g_g_g_f_g_g_f_f_f_f_f_bAmAf_a______________ BeBeBEBeBEBEBEBEBEBEBE_g_g_g_f_f_b_f_bAm_bAmAi___a______________ BnBeBeBEBeBEBeBEBEBEBE_g_g_g_f_f_f_f_f_bAmAmAmAf_a______________ BnBeBEBeBEBeBEBeBEBE_g_g_g_g_g_g_f_g_f_b_bAiAiAm_a______________ BeBEBeBEBeBEBeBEBEBEBEAm_gBEBE_g_g_g_g_f_f_bAmAm_a______________ BEBeApBeBEBeBEBEBEBE_g_g_g_g_gBE_g_g_g_g_f_f_bAm_a______________ BnBEBeBEBeBEBEBEBE_g_g_g_g_gBE_f_g_f_g_g_f_fAmAm_a______________ BACQBEBeBEBeBEBE_g_g_g_gBEBE_gBEBE_g_f_g_f_gAmAi_a______________ BeBnBeBEBeBEBE_gBEBEBEBEBE_gBE_fBE_g_g_g_k_g_fAi_a______________ BeBeBEBEBEBE_f_g_gBEAmBEBE_gBE_g_g_g_f_g_f_fAmAm_a______________ CKBeBeBEBE_g_g_g_g_gBEBEBEBE_g_g_g_g_g_g_f_b__Af_a______________ BEBeBEBE_g_g_gBEBEBE_gBEBE_g_gBE_g_g_g_g_bAf_a_a_W______________ } # tile 142 (explosion frosty 6) { ______________AS___aAfAm_g_gBE_g_gBE_g_g_gAmBEBEBEBEBEAmBeBECQBe _______________aAf_a_aAm_f_g_f_g_g_g_g_g_gBE_gBE_gBE_gBEBEBEBEBl _______________a_a____AfAm_f_g_g_g_g_g_g_g_gBEBEAmBEBEBEBEBEBEBE _____________a_________a_a_b_b_f_f_g_g_g_gBeAm_g_fBE_gBEBEBEBEBE _______________________a_aAfAf_b_g_f_f_f_kAmBe_gBEAmBE_gBEBEBEBE _______________________aAmAm_a_aAm_fAf_f_g_g_gBEBE_g_gBE_f_gBEBe _____________a__________AfAm_a_a_bAiAm_b_g_gBEBEBE_g_g_f_gBEBEBE _______________a_aAf_a_a_WAf_a_a_aAiAf_f_f_g_g_g_f_g_g_g_gBEBEBE _______________aAmAmAmAf_a_a_a_a_aAmAm_f_k_g_g_g_g_f_f_g_k_fBEBE _______________aAmAmAm_a_a_a_a_a_aAm_b_f_f_g_f_g_f_b_b_f_g_g_gBE _________a_aAmAfAm_bAmAf_a_a_a_aAmAmAm_f_g_g_f_g_f_b_f_f_f_gAmBE _________aAmAfAmAmAmAmAf_W_a_aAmAiAiAfAm_f_g_g_g_bAm_f_f_f_g_gBE _________aAf_a_aAmAmAm_a_a_aAmAmAmAm__AmAm_f_g_g_f_f_f_g_k_g_g_g ___________a_a___aAm_a___aAf_bAmAmAm_bAmAmAmAm_f_f_f_f_f_f_g_f_g ___________________a_a___aAmAmAmAm_aAmAmBKAmAm_f_f_f_f_f_f_b_g_f _______________a_________aAf_bAm_a_aAiAm_aAfAiAm_f_f_f_f_f_f_f_f ___________________________________aAm_a___aAm_bAmAm_fAm_f_bAm_f ___________________________________a_a_a_____a_bAmAmAmAmAmAm_b_b _________________________________________a_____bAmAm_fAmAfAfAmAi ______________________________________________AfAm_b_fAm_a_aAf_f ______________________________________________AfAmAm_f_b_b___a_b ______________________________________________AfAm_f_f_f_a___aAm _________________________________________a____AfAm_b_f_f_b___aAf ___________________________________________a_aAmAiAi_bAm_a______ ___________________________________________aAmAmAm_bAm_a________ ___________________________________________a_aAm_b_fAm_a___a____ _________________________________________a____Af_f_fAm_a________ _______________________________________________b_bAmAf_a________ ______________________________________________AfAm_b_a_a________ ______________________________________________Af_a_a_____a______ ________________________________________________________________ ________________________________________________________________ } # tile 143 (explosion frosty 7) { BeBEBeBEBeCQBeBEBEBEBeBECQBeBeBeBnCQBlBeCQBlCQBeBlCQBlBeCQBeBlBe BEBeBEBeBEBEBEBEBEBeBEBEBEBeBECKBEBeBeBlBeBeApBeBEBeBeBlBEBeBEBE BeBEBEBEBeBEBeBEBeBeBlBEBeBEBeBeCQBeCKBeBeBeBeBEBeBEBeBEBeBEBEBE BEBEBEBeBEBeBnBeBEBeBIBeBEBEBEBeBeBlBeBnBeCQBEBEBEBeBEBEBEBEBEBE BEBEBEBEBeBEBeBEBeBeBeBEBEBEBeBEBnBeCQBeCKBnBeBEBEBEBEBEBEBEBEBE BEBEBEBeBEBeApBeBEBeBeBlBEBeBEBeBEBeBECQBEBeBEBeBEBEBEBE_gBEBEBE BEBEBEBEBeBEBeBEBeBEBeBEBeBEBeBEBeBeBlBeBeBEBeBEBeBEBEBEBE_gBEBE BEBEBEBEBEBEBEBeBEBEBEBeBEBeBEBEBEBeBIBlBEBeBEBeBEBEBEBEAmBEBEBE BEBEBEBEBEBEBeBEBEBEBeBEBeBEBEBEBEBEBeBEBeBEBeBEBeBEBE_g_k_gBEBE BEBEBEBEBEBEBEBEBEBEBEBeBEBEBEBEBEBeBEBeBEBeBEBeBEBeBEBE_f_g_fBE BE_gBEBEBEBEBEBEBEBEBEBEBeBEBEBEBEBEBeBEBEBEBEBEBeBEBEBE_g_g_gBE _f_g_gBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBE_f_g_gBE _g_g_g_gBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBE_g_g_g_g_g _g_g_fBE_g_gBEBEBEBEBEBEBEBEBEBEBEBE_gBE_gBEBEBEBEBEBEBE_g_g_f_g _gAm_g_gBEBEBEBE_gBEBE_g_gBEBEBEBEAmBE_g_g_fBEBEBE_gBE_g_g_f_b_f _g_g_g_g_gBE_gBE_gBEBE_g_gBE_g_g_gBe_g_g_f_g_gBEBEBE_gBE_f_f_b_f _g_g_g_g_k_g_g_g_gAmBEBEBEBE_g_gBE_f_g_f_g_g_g_gBE_gBE_g_g_g_g_f _b_g_g_g_f_f_g_g_g_k_gBE_gBE_g_g_g_g_f_g_f_g_gBE_g_g_g_g_g_g_b_b _f_g_g_f_f_bAm_b_f_g_gBE_g_g_g_g_g_g_g_f_f_f_g_g_g_g_g_g_g_fAm_b _f_g_g_f_bAiAfAf_b_f_g_g_f_g_g_g_f_f_f_b_b_f_g_g_f_g_g_g_f_fAfAm _f_f_f_fAm_bAmAi_f_g_g_g_k_g_g_f_f_b_f_f_fAm_f_g_g_f_g_g_g_fAmAm Am_f_f_f_b_f_f_f_g_g_f_f_g_g_b_f_f_f_f_f_f_f_f_f_g_g_f_g_g_fAm_f AmAmAmAi_f_f_g_g_g_g_g_g_g_g_f_b_f_b_f_g_g_g_g_f_f_g_g_g_g_fAmAi _aAmAm_b_b_f_f_f_f_f_g_g_f_f_b_b_b_b_f_g_g_g_g_f_b_f_g_g_f_fAfAm ___a_f_f_f_f_f_f_f_f_f_f_f_bAmAm__Af_f_g_k_f_g_f_f_f_g_f_f_f_a_a _aAmAm_f_g_f_f_f_f_f_f_f_f_b_bAmAmBKAiAmAmAmAm_f_f_f_f_f_fAm_aAm AfAmAm_b_f_g_g_f_f_g_g_f_f_bAmAmAf_aAfAf_b_aAm_b_f_f_g_g_f_bAmAf ___aAm_b_b_f_g_f_f_g_g_f_bAmAiAf____________AfAm_f_g_g_g_f_fAi_a __AfAm_bAm_f_b_b_f_g_g_f_fAm_b_a____________AfAm_f_g_g_f_fAm_b_a ___aAmAmAmAmAfAm_f_g_f_f_bAm_a______________AfAm_f_f_f_f_b_a____ ___aAmAfAfAfAmAfAm_f_f_fAmAf_a_______________a_bAmAmAm_b_a_____a _______________aAfAi_b_fAi_a__________________AfAiAfAiAf________ } # tile 144 (explosion frosty 8) { BeBEBeBEBE_gAm_gBEBE_gBEBE_gBEAm_g_g_b_bAi_a_______a____________ BEBeBEBEBEBE_gBE_gBE_gBE_gBE_g_g_g_f_a_______a__________________ BEBEBEBEBEBEBEBEBE_g_g_g_g_f_g_g_fAmAm__________________________ BEBEBEBE_gBEBEBE_f_g_gBE_g_g_g_g_bAfAiAf_a______________________ BEBEBEBEBEBEBE_g_g_f_g_g_g_g_g_gAmAiAmAm_a______________________ BEBEBE_gBEBEBEBE_fBE_g_g_g_g_f_f_f_f_bAm_a______________________ BEBEBEBEBEBEBEAm_g_f_g_g_g_b_g_g_g_f_b_b_a______________________ BEBEBEBEBEBE_g_k_f_g_g_g_f_f_f_g_g_g_bAm_a___a__________________ BEBEBE_gBEBEBE_g_gBE_g_g_g_f_g_g_k_g_f_b_a_a____________________ BEBEBEBEBEBEBEBEBE_g_f_g_g_f_f_g_g_g_f_bAm_a____________________ BeBEBEBEBEBE_gBEBE_g_g_f_b_b_f_g_g_fAmAmBKAmAf__________________ BEBEBEBEBE_gBEBE_g_g_g_f_b_b_b_f_b_b_bAf_aAf_a_____________a_aAf BE_gBE_g_g_gBE_g_g_g_f_f_f_bAm_bAm_b_b____________________AfAmAf _gBE_gBE_gBE_g_g_g_g_f_f_b_bAiAm_bAm_b_____________________a_a_a _gAmBEBEBE_f_gBE_g_g_f_bAmAmAm_bAmAmAmAfAm_a____________________ _g_k_gBE_f_g_gBE_g_g_bAmAfAf_a_bAmAmAfAfAf_a____________________ _f_gBEBEBE_g_g_g_k_f_bAfAf___aAfAmAmAf__________________________ _g_g_g_g_gBE_g_g_g_f_b_a_a___aAmAmAf_a__________________________ _g_g_g_g_g_g_g_g_f_b_b_______aAfAf_a____________________________ _f_g_g_g_f_g_f_f_bAi_____W_a_________a__________________________ _f_g_g_g_g_g_f_fAmAf____________________________________________ _f_g_g_g_g_f_f_f_b_a_____a______________________________________ _f_f_g_g_f_bAmAi_b_a_a_a________________________________________ _f_g_g_g_fAfAfAiAiAmAm_a________________________________________ Am_g_g_f_b_a_aAfAmAmAm_a________________________________________ Am_f_fAm_a_____a_a_a_a_a________________________________________ _a_aAmAf_a_______________a______________________________________ _W_aAf_a________________________________________________________ _a_a_a_a________________________________________________________ _a_______a______________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 145 (zap 0 0) { ______________________________BQCu______________________________ ______________________________BQCu______________________________ ______________________________BQBQ______________________________ ______________________________BQBQBQ____________________________ ______________________________BQBQBQ____________________________ ______________________________BQBQBQ____________________________ ______________________________BQBQBQ____________________________ ________________________________BQBQ____________________________ ________________________________CuBQ____________________________ ________________________________CuBQ____________________________ ________________________________Cu______________________________ ______________________________BQCu______________________________ ______________________________BQCu______________________________ ______________________________BQBQ______________________________ ______________________________BQBQBQ____________________________ ______________________________BQBQBQ____________________________ ______________________________BQBQBQ____________________________ ______________________________BQBQBQ____________________________ ________________________________BQBQ____________________________ ________________________________CuBQ____________________________ ________________________________CuBQ____________________________ ________________________________Cu______________________________ ______________________________BQCu______________________________ ______________________________BQCu______________________________ ______________________________BQBQ______________________________ ______________________________BQBQBQ____________________________ ______________________________BQBQBQ____________________________ ______________________________BQBQBQ____________________________ ______________________________BQBQBQ____________________________ ________________________________BQBQ____________________________ ________________________________CuBQ____________________________ ________________________________CuBQ____________________________ } # tile 146 (zap 0 1) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ BQ______BQBQBQBQBQBQBQ________BQBQBQBQBQBQBQ________BQBQBQBQBQBQ CuCuCuBQBQBQBQBQBQCuCuCuCuCuBQBQBQBQBQBQCuCuCuCuCuBQBQBQBQBQBQCu __BQBQBQBQBQBQBQ________BQBQBQBQBQBQBQ________BQBQBQBQBQBQBQ____ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 147 (zap 0 2) { Cu______________________________________________________________ BQCu____________________________________________________________ BQBQBQBQBQ______________________________________________________ __BQBQBQBQBQ____________________________________________________ ____BQBQBQBQBQ__________________________________________________ ______BQBQBQBQBQ________________________________________________ ____________CuBQ________________________________________________ ______________Cu________________________________________________ ________________Cu______________________________________________ ________________BQCu____________________________________________ ________________BQBQBQBQBQ______________________________________ __________________BQBQBQBQBQ____________________________________ ____________________BQBQBQBQBQ__________________________________ ______________________BQBQBQBQBQ________________________________ ____________________________CuBQ________________________________ ______________________________Cu________________________________ ________________________________Cu______________________________ ________________________________BQCu____________________________ ________________________________BQBQBQBQBQ______________________ __________________________________BQBQBQBQBQ____________________ ____________________________________BQBQBQBQBQ__________________ ______________________________________BQBQBQBQBQ________________ ____________________________________________CuBQ________________ ______________________________________________Cu________________ ________________________________________________Cu______________ ________________________________________________BQCu____________ ________________________________________________BQBQBQBQBQ______ __________________________________________________BQBQBQBQBQ____ ____________________________________________________BQBQBQBQBQ__ ______________________________________________________BQBQBQBQBQ ____________________________________________________________CuBQ ______________________________________________________________Cu } # tile 148 (zap 0 3) { ______________________________________________________________Cu ____________________________________________________________CuBQ ______________________________________________________BQBQBQBQBQ ____________________________________________________BQBQBQBQBQ__ __________________________________________________BQBQBQBQBQ____ ________________________________________________BQBQBQBQBQ______ ________________________________________________BQCu____________ ________________________________________________Cu______________ ______________________________________________Cu________________ ____________________________________________CuBQ________________ ______________________________________BQBQBQBQBQ________________ ____________________________________BQBQBQBQBQ__________________ __________________________________BQBQBQBQBQ____________________ ________________________________BQBQBQBQBQ______________________ ________________________________BQCu____________________________ ________________________________Cu______________________________ ______________________________Cu________________________________ ____________________________CuBQ________________________________ ______________________BQBQBQBQBQ________________________________ ____________________BQBQBQBQBQ__________________________________ __________________BQBQBQBQBQ____________________________________ ________________BQBQBQBQBQ______________________________________ ________________BQCu____________________________________________ ________________Cu______________________________________________ ______________Cu________________________________________________ ____________CuBQ________________________________________________ ______BQBQBQBQBQ________________________________________________ ____BQBQBQBQBQ__________________________________________________ __BQBQBQBQBQ____________________________________________________ BQBQBQBQBQ______________________________________________________ BQCu____________________________________________________________ Cu______________________________________________________________ } # tile 149 (zap 1 0) { ____________________________________CuCfCu______________________ ________________________Cu________CuCuCjCu______________________ ________________________CuCuCuCuCuCuCfCjCuCu____________________ ______________________CuCuCfCjCfCjCfCjCfCuCu____________________ ____________________CuCuCuCuCuCuCfCjCjCjCuCu____________________ __CuCuCu____CuCuCuCuCfCuCfCjCfCjCjCjCjCfCuCu____________________ ______CuCuCuCuCfCjCfCjCfCjCfCjCjCjCjCjCjCuCu____________________ ____________CuCuCuCuCuCuCuCfCfCjCjCjCjCfCuCu____________________ ________________________CuCuCuCfCjCfCjCuCuCu____________________ __________________CuCuCuCfCjCfCjCfCjCfCuCuCu____________________ ____________________CuCuCuCuCuCuCuCfCjCuCu______________________ ____________________________CuCuCuCjCfCuCu______________________ ______________________________CuCuCuCfCuCu______________________ ______________________________CuCuCuCjCuCu______________________ ________________________CuCuCuCuCuCuCfCuCu______________________ ______________________________CuCuCfCjCuCuCu____________________ ________________CuCuCuCu__CuCuCuCuCjCjCjCuCu____________________ ____________________CuCuCuCfCjCfCjCjCjCfCuCu____________________ __________________________CuCuCuCuCjCjCuCuCu____________________ ______________________________CuCuCuCfCuCuCu____________________ ______________CuCu______CuCuCuCuCfCjCfCuCu______________________ ________________CuCuCuCuCuCfCjCfCjCfCjCuCu______________________ __________________________CuCuCuCuCfCjCuCu______________________ __________________CuCuCuCuCuCjCfCjCjCfCuCuCu____________________ ________________CuCuCuCuCuCfCfCjCjCjCjCuCuCu____________________ __________CuCuCuCuCuCuCuCfCjCjCjCjCjCfCuCuCu____________________ ____CuCuCu__CuCuCfCjCfCjCfCjCfCjCjCjCjCuCuCu____________________ __Cu__________CuCuCuCuCuCuCuCuCjCjCjCfCuCuCu____________________ ________________________CuCuCuCuCfCjCjCfCuCu____________________ ____________________CuCuCuCfCjCfCjCfCfCjCuCu____________________ ________________CuCuCuCuCuCuCuCuCuCuCuCfCuCu____________________ ______________________________CuCuCuCuCjCu______________________ } # tile 150 (zap 1 1) { ________________________________________________________________ __________Cu__________________________________________Cu________ __________Cu________________________________________Cu__________ __________CuCu______________________________________Cu__________ ____________Cu______________________________________Cu__________ ____________Cu____________________________________Cu____________ __________CuCuCu__________________________________CuCu__________ __________CuCfCu________________________Cu________CuCuCu________ __________CuCjCu________________Cu______CuCu____CuCuCfCu____Cu__ __________CuCfCu__Cu____________Cu________Cu__CuCuCuCjCu____Cu__ ________CuCjCfCu__CuCu__________CuCu______Cu__CuCuCuCfCu__CuCu__ ______CuCuCuCjCu__CuCu__________CuCu______Cu__CuCuCuCjCu__CuCu__ __CuCuCuCuCfCfCuCuCfCu______Cu____Cu____CuCu__CuCuCfCfCuCuCuCu__ ____CuCfCuCjCfCjCuCjCu______Cu__CuCfCu__CuCfCuCuCfCjCjCuCuCfCu__ ____CuCjCuCfCjCfCuCfCuCu____Cu__CuCjCu__CuCjCuCfCjCjCfCuCuCjCu__ ____CuCfCuCjCjCjCfCjCuCuCuCuCuCuCuCfCuCuCuCfCuCfCjCjCfCjCuCfCuCu ____CuCjCfCjCjCjCfCfCuCuCuCuCuCuCuCjCuCuCjCfCuCjCjCjCjCjCfCjCuCu __CuCuCfCjCjCjCjCjCfCjCfCuCuCuCfCjCjCfCuCjCfCjCjCjCjCjCjCjCfCuCu CuCuCfCjCjCjCjCjCfCjCfCjCfCjCfCjCjCjCjCfCjCfCjCfCjCjCjCfCjCfCuCu CjCfCjCfCjCjCfCjCuCuCuCuCuCuCuCuCfCjCuCuCuCuCuCuCuCuCuCuCjCfCjCf CuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCuCu ____CuCuCuCuCuCuCuCu__________CuCuCuCuCu______CuCuCuCuCuCuCuCu__ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 151 (zap 1 2) { CuCu____________Cu______________Cu______________________________ __CuCuCu________CuCu____________Cu______________________________ __CuCuCuCu______CuCu____________________________________________ ____CuCuCuCu__CuCfCu____________Cu____________Cu________________ ____CuCuCfCuCuCjCjCjCu________CuCu______________________________ ______CuCuCjCfCjCjCfCu________CuCuCu____________________________ ______CuCuCuCfCjCjCjCu______CuCfCuCu__________Cu________________ ________CuCuCjCjCjCfCu______CuCjCuCu__________Cu__________Cu____ ________CuCuCuCfCjCjCuCu__CuCfCjCu__________CuCu__________Cu____ __________CuCuCuCfCfCuCuCuCuCjCjCfCu__________Cu________CuCu____ ______________CuCuCuCuCuCfCjCfCjCjCu__________CuCu______CuCu____ ________________CuCuCuCuCfCjCjCjCfCu__________CuCu______Cu______ __________________CuCuCuCuCjCjCjCjCu__________CfCu______Cu______ ____________________CuCuCuCuCjCjCfCu________CuCjCu______________ ________________________CuCuCuCjCjCu________CuCfCu________Cu____ __________________________CuCuCuCjCfCu____CuCfCjCu________Cu____ ____________________________CuCuCuCjCu____CuCjCjCu______CuCu____ ______________________________CuCuCuCu____CuCjCjCu______CuCu____ ________________________________CuCuCu__CuCfCjCjCuCu____CuCu____ ____________________________________CuCuCjCfCjCjCjCu____Cu______ ______________________________________CuCuCfCjCjCjCu__CuCu______ ______________________________________CuCuCuCjCjCfCu__CuCf______ ________________________________________CuCuCuCjCfCu__CuCjCu____ ____________________________________________CuCuCjCuCuCfCjCfCu__ ______________________________________________CuCuCuCjCfCjCjCu__ ________________________________________________CuCuCjCjCjCfCu__ __________________________________________________CuCuCjCjCjCu__ ____________________________________________________CuCuCjCjCu__ ______________________________________________________CuCuCjCu__ ______________________________________________________CuCuCuCu__ ________________________________________________________CuCuCuCu ______________________________________________________________Cu } # tile 152 (zap 1 3) { ______________________________Cu______________Cu____________CuCu ______________________________Cu____________CuCu________CuCuCu__ ____________________________________________CuCu______CuCuCuCu__ ________________Cu____________Cu____________CuCfCu__CuCuCuCu____ ______________________________CuCu________CuCjCjCjCuCuCfCuCu____ ____________________________CuCuCu________CuCjCjCfCfCjCuCu______ ________________Cu__________CuCuCfCu______CuCfCjCjCjCuCuCu______ ____Cu__________Cu__________CuCuCjCu______CuCjCjCjCfCuCu________ ____Cu__________CuCu__________CuCfCjCu__CuCuCfCjCfCuCuCu________ ____CuCu________Cu__________CuCjCjCfCuCuCuCuCfCjCuCuCu__________ ____CuCu______CuCu__________CuCfCjCjCfCjCuCuCuCuCu______________ ______Cu______CuCu__________CuCjCjCjCjCfCuCuCuCu________________ ______Cu______CuCf__________CuCfCjCjCjCuCuCuCu__________________ ______________CuCjCu________CuCjCjCjCuCuCuCu____________________ ____Cu________CuCfCu________CuCfCjCuCuCu________________________ ____Cu________CuCfCjCu____CuCjCjCuCuCu__________________________ ____CuCu______CuCjCjCu____CuCfCuCuCu____________________________ ____CuCu______CuCjCfCu____CuCuCuCu______________________________ ____CuCu____CuCuCjCjCfCu__CuCuCu________________________________ ______Cu____CuCjCjCjCfCjCuCu____________________________________ ______CuCu__CuCfCjCjCjCuCu______________________________________ ______CfCu__CuCjCjCjCuCuCu______________________________________ ____CuCjCu__CuCfCjCuCuCu________________________________________ __CuCfCjCfCuCuCjCuCu____________________________________________ __CuCfCjCjCfCuCuCu______________________________________________ __CuCjCjCjCjCuCu________________________________________________ __CuCjCjCjCuCu__________________________________________________ __CuCjCjCuCu____________________________________________________ __CuCjCuCu______________________________________________________ __CuCuCuCu______________________________________________________ CuCuCuCu________________________________________________________ Cu______________________________________________________________ } # tile 153 (zap 2 0) { __________________C$____________________________________________ ______________C$__C$__C$________________________________________ ________________C$C$C$________C$__________C$____________________ ________________C$C$C$____C$__C$__C$____C$C$C$__________________ ______________C$__C$__C$____C$C$C$________C$____________________ __________________C$________C$C$C$______________________________ __________________________C$__C$__C$____________________________ ______________C$______________C$________________________________ ____________________________________________C$__________________ ______________________C$__________C$____________________________ ____________________C$C$C$______C$C$C$__________________________ ________________C$____C$__________C$____________________________ ________________________________________________________________ ______________________________C$________C$______________________ ________________________C$__________C$__C$__C$__________________ __________C$__________C$C$C$__________C$C$C$____________________ ________________________C$____________C$C$C$____________________ ________________C$__________________C$__C$__C$__________________ ________________________________________C$______________________ ____________________________C$__________________________________ __________________C$______________C$____________________________ ________________C$C$C$__________C$C$C$____________C$____________ __________________C$______________C$____________________________ __________________________C$____________________________________ ______________________C$__C$__C$________________________________ ________________________C$C$C$________C$________________________ ________________________C$C$C$____C$__C$__C$____________________ ______________________C$__C$__C$____C$C$C$______________________ ________________C$________C$________C$C$C$______________________ ______________C$C$C$______________C$__C$__C$____________________ ________________C$____C$______________C$________________________ ____________________________C$__________________________________ } # tile 154 (zap 2 1) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________________________C$________________________________ ________________________________________________________________ __C$____C$____C$__________________________________________C$____ ____C$C$______________C$__________C$______C$____________C$C$C$__ C$C$C$C$C$C$____________________________C$C$C$____________C$____ ____C$C$____________C$____________________C$____________________ __C$____C$________C$C$C$______C$________________C$____C$____C$__ ____________________C$______C$C$C$________________C$C$__________ ______C$____C$________________C$______________C$C$C$C$C$C$______ ________C$C$__________________________C$__________C$C$________C$ ____C$C$C$C$C$C$__________C$____________________C$____C$________ ________C$C$________C$____________________C$____________________ ______C$____C$____C$C$C$________________C$C$C$______C$____C$____ ____________________C$______C$____C$______C$__________C$C$______ ______________________________C$C$________________C$C$C$C$C$C$__ ______C$__________________C$C$C$C$C$C$________________C$C$______ ____C$C$C$____________________C$C$__________________C$____C$____ ______C$________C$__________C$____C$____________________________ ________________________________________________________________ ________________________________________________________________ __________________________________________C$____________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 155 (zap 2 2) { C$______________________________________________________________ ________________________________________________________________ ________C$__________C$__________________________________________ ____C$__C$__C$____C$C$C$________________________________________ ______C$C$C$________C$__________________________________________ ______C$C$C$__________________C$________________________________ ____C$__C$__C$__________________________________________________ ________C$______________________________________________________ __________________C$____________________________________________ ____________________________C$__________________________________ __________________________C$C$C$________________________________ __________C$________________C$________________C$________________ __________________C$____________________________________________ ______________________C$______________C$________________________ __________________C$__C$__C$______C$__C$__C$____________________ ____________________C$C$C$__________C$C$C$__________C$__________ ____________________C$C$C$__________C$C$C$______________________ __________________C$__C$__C$______C$__C$__C$__C$________________ ______________________C$______________C$________________________ __________________________________C$______________C$____________ ____________________________________________C$__________________ __________________________________________C$C$C$________________ ____________________________________________C$________C$________ ____________________________________C$__________________________ ________________________________C$__C$__C$______________________ __________________________________C$C$C$________________________ __________________________________C$C$C$__________C$______C$____ ________________________________C$__C$__C$____________C$__C$__C$ ____________________________________C$________C$________C$C$C$__ ____________________________________________C$C$C$______C$C$C$__ ______________________________________________C$______C$__C$__C$ __________________________________________________________C$____ } # tile 156 (zap 2 3) { ______________________________________________________________C$ ________________________________________________________________ __________________________________________C$__________C$________ ________________________________________C$C$C$____C$__C$__C$____ __________________________________________C$________C$C$C$______ ________________________________C$__________________C$C$C$______ __________________________________________________C$__C$__C$____ ______________________________________________________C$________ ____________________________________________C$__________________ __________________________________C$____________________________ ________________________________C$C$C$__________________________ ________________C$________________C$________________C$__________ ____________________________________________C$__________________ ________________________C$______________C$______________________ ____________________C$__C$__C$______C$__C$__C$__________________ __________C$__________C$C$C$__________C$C$C$____________________ ______________________C$C$C$__________C$C$C$____________________ ________________C$__C$__C$__C$______C$__C$__C$__________________ ________________________C$______________C$______________________ ____________C$______________C$__________________________________ __________________C$____________________________________________ ________________C$C$C$__________________________________________ ________C$________C$____________________________________________ __________________________C$____________________________________ ______________________C$__C$__C$________________________________ ________________________C$C$C$__________________________________ ____C$______C$__________C$C$C$__________________________________ C$__C$__C$____________C$__C$__C$________________________________ __C$C$C$________C$________C$____________________________________ __C$C$C$______C$C$C$____________________________________________ C$__C$__C$______C$______________________________________________ ____C$__________________________________________________________ } # tile 157 (zap 3 0) { _______________________________k_H______________________________ _______________________________k_H______________________________ _______________________________k_k______________________________ _______________________________k_k_k____________________________ _______________________________k_k_k____________________________ _______________________________k_k_k____________________________ _______________________________k_k_k____________________________ _________________________________k_k____________________________ _________________________________H_k____________________________ _________________________________H_k____________________________ _________________________________H______________________________ _______________________________k_H______________________________ _______________________________k_H______________________________ _______________________________k_k______________________________ _______________________________k_k_k____________________________ _______________________________k_k_k____________________________ _______________________________k_k_k____________________________ _______________________________k_k_k____________________________ _________________________________k_k____________________________ _________________________________H_k____________________________ _________________________________H_k____________________________ _________________________________H______________________________ _______________________________k_H______________________________ _______________________________k_H______________________________ _______________________________k_k______________________________ _______________________________k_k_k____________________________ _______________________________k_k_k____________________________ _______________________________k_k_k____________________________ _______________________________k_k_k____________________________ _________________________________k_k____________________________ _________________________________H_k____________________________ _________________________________H_k____________________________ } # tile 158 (zap 3 1) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ _k_______k_k_k_k_k_k_k_________k_k_k_k_k_k_k_________k_k_k_k_k_k _H_H_H_k_k_k_k_k_k_H_H_H_H_H_k_k_k_k_k_k_H_H_H_H_H_k_k_k_k_k_k_H ___k_k_k_k_k_k_k_________k_k_k_k_k_k_k_________k_k_k_k_k_k_k____ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 159 (zap 3 2) { _H______________________________________________________________ _k_H____________________________________________________________ _k_k_k_k_k______________________________________________________ ___k_k_k_k_k____________________________________________________ _____k_k_k_k_k__________________________________________________ _______k_k_k_k_k________________________________________________ _____________H_k________________________________________________ _______________H________________________________________________ _________________H______________________________________________ _________________k_H____________________________________________ _________________k_k_k_k_k______________________________________ ___________________k_k_k_k_k____________________________________ _____________________k_k_k_k_k__________________________________ _______________________k_k_k_k_k________________________________ _____________________________H_k________________________________ _______________________________H________________________________ _________________________________H______________________________ _________________________________k_H____________________________ _________________________________k_k_k_k_k______________________ ___________________________________k_k_k_k_k____________________ _____________________________________k_k_k_k_k__________________ _______________________________________k_k_k_k_k________________ _____________________________________________H_k________________ _______________________________________________H________________ _________________________________________________H______________ _________________________________________________k_H____________ _________________________________________________k_k_k_k_k______ ___________________________________________________k_k_k_k_k____ _____________________________________________________k_k_k_k_k__ _______________________________________________________k_k_k_k_k _____________________________________________________________H_k _______________________________________________________________H } # tile 160 (zap 3 3) { _______________________________________________________________H _____________________________________________________________H_k _______________________________________________________k_k_k_k_k _____________________________________________________k_k_k_k_k__ ___________________________________________________k_k_k_k_k____ _________________________________________________k_k_k_k_k______ _________________________________________________k_H____________ _________________________________________________H______________ _______________________________________________H________________ _____________________________________________H_k________________ _______________________________________k_k_k_k_k________________ _____________________________________k_k_k_k_k__________________ ___________________________________k_k_k_k_k____________________ _________________________________k_k_k_k_k______________________ _________________________________k_H____________________________ _________________________________H______________________________ _______________________________H________________________________ _____________________________H_k________________________________ _______________________k_k_k_k_k________________________________ _____________________k_k_k_k_k__________________________________ ___________________k_k_k_k_k____________________________________ _________________k_k_k_k_k______________________________________ _________________k_H____________________________________________ _________________H______________________________________________ _______________H________________________________________________ _____________H_k________________________________________________ _______k_k_k_k_k________________________________________________ _____k_k_k_k_k__________________________________________________ ___k_k_k_k_k____________________________________________________ _k_k_k_k_k______________________________________________________ _k_H____________________________________________________________ _H______________________________________________________________ } # tile 161 (zap 4 0) { _______________________________A_K______________________________ _______________________________A_K______________________________ _______________________________A_A______________________________ _______________________________A_A_A____________________________ _______________________________A_A_A____________________________ _______________________________A_A_A____________________________ _______________________________A_A_A____________________________ _________________________________A_A____________________________ _________________________________K_A____________________________ _________________________________K_A____________________________ _________________________________K______________________________ _______________________________A_K______________________________ _______________________________A_K______________________________ _______________________________A_A______________________________ _______________________________A_A_A____________________________ _______________________________A_A_A____________________________ _______________________________A_A_A____________________________ _______________________________A_A_A____________________________ _________________________________A_A____________________________ _________________________________K_A____________________________ _________________________________K_A____________________________ _________________________________K______________________________ _______________________________A_K______________________________ _______________________________A_K______________________________ _______________________________A_A______________________________ _______________________________A_A_A____________________________ _______________________________A_A_A____________________________ _______________________________A_A_A____________________________ _______________________________A_A_A____________________________ _________________________________A_A____________________________ _________________________________K_A____________________________ _________________________________K_A____________________________ } # tile 162 (zap 4 1) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ _A_______A_A_A_A_A_A_A_________A_A_A_A_A_A_A_________A_A_A_A_A_A _K_K_K_A_A_A_A_A_A_K_K_K_K_K_A_A_A_A_A_A_K_K_K_K_K_A_A_A_A_A_A_K ___A_A_A_A_A_A_A_________A_A_A_A_A_A_A_________A_A_A_A_A_A_A____ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 163 (zap 4 2) { _K______________________________________________________________ _A_K____________________________________________________________ _A_A_A_A_A______________________________________________________ ___A_A_A_A_A____________________________________________________ _____A_A_A_A_A__________________________________________________ _______A_A_A_A_A________________________________________________ _____________K_A________________________________________________ _______________K________________________________________________ _________________K______________________________________________ _________________A_K____________________________________________ _________________A_A_A_A_A______________________________________ ___________________A_A_A_A_A____________________________________ _____________________A_A_A_A_A__________________________________ _______________________A_A_A_A_A________________________________ _____________________________K_A________________________________ _______________________________K________________________________ _________________________________K______________________________ _________________________________A_K____________________________ _________________________________A_A_A_A_A______________________ ___________________________________A_A_A_A_A____________________ _____________________________________A_A_A_A_A__________________ _______________________________________A_A_A_A_A________________ _____________________________________________K_A________________ _______________________________________________K________________ _________________________________________________K______________ _________________________________________________A_K____________ _________________________________________________A_A_A_A_A______ ___________________________________________________A_A_A_A_A____ _____________________________________________________A_A_A_A_A__ _______________________________________________________A_A_A_A_A _____________________________________________________________K_A _______________________________________________________________K } # tile 164 (zap 4 3) { _______________________________________________________________K _____________________________________________________________K_A _______________________________________________________A_A_A_A_A _____________________________________________________A_A_A_A_A__ ___________________________________________________A_A_A_A_A____ _________________________________________________A_A_A_A_A______ _________________________________________________A_K____________ _________________________________________________K______________ _______________________________________________K________________ _____________________________________________K_A________________ _______________________________________A_A_A_A_A________________ _____________________________________A_A_A_A_A__________________ ___________________________________A_A_A_A_A____________________ _________________________________A_A_A_A_A______________________ _________________________________A_K____________________________ _________________________________K______________________________ _______________________________K________________________________ _____________________________K_A________________________________ _______________________A_A_A_A_A________________________________ _____________________A_A_A_A_A__________________________________ ___________________A_A_A_A_A____________________________________ _________________A_A_A_A_A______________________________________ _________________A_K____________________________________________ _________________K______________________________________________ _______________K________________________________________________ _____________K_A________________________________________________ _______A_A_A_A_A________________________________________________ _____A_A_A_A_A__________________________________________________ ___A_A_A_A_A____________________________________________________ _A_A_A_A_A______________________________________________________ _A_K____________________________________________________________ _K______________________________________________________________ } # tile 165 (zap 5 0) { _______________________o_vBIC$Bh_v_o____________________________ _____________________oApBIBIBhBn_o______________________________ ___________________o_vBIC$Bh_v_o________________________________ _________________oBIBIBIBhAp_o__________________________________ _______________o_vBIC$Bh_v_o____________________________________ _________________oApBhBIBIBI_o__________________________________ ___________________o_vBIC$Bh_v_o________________________________ _____________________oApBhBIBIBn_o______________________________ _______________________o_vBIC$Bh_v_o____________________________ _______________________o_vBIBhBIBIBn_o__________________________ _______________________o_v_v_vBIC$Bh_v_o________________________ _____________________oBIBIBIBIBIBhAp_o__________________________ ___________________o_vBIC$C$C$Bh_v_o____________________________ _________________oBFBIBIBhBhBhBI_o______________________________ _______________o_vBIC$Bh_v_v_v_o________________________________ _________________oBIBhBIBIBIBIBF_o______________________________ ___________________o_vBIC$C$C$Bh_v_o____________________________ _____________________oApBhBhBhBIBIBn_o__________________________ _______________________o_v_v_vBIC$Bh_v_o________________________ _________________________o_o_oApBhBIBIBn_o______________________ _______________________________s_vBIC$Bh_v_o____________________ _____________________________oApBIBIBhAp_o______________________ ___________________________o_vBIC$Bh_v_o________________________ _________________________oBIBIBIBhBI_o__________________________ _______________________o_vBIC$Bh_v_o____________________________ _____________________oBFBIBIBhBF_o______________________________ ___________________o_vBIC$Bh_v_o________________________________ _____________________oBIBhBIBIBI_o______________________________ _______________________o_vBIC$Bh_v_o____________________________ _________________________oApBhBIBIBF_o__________________________ ___________________________o_vBIC$Bh_v_o________________________ ___________________________o_vBIC$Bh_v_o________________________ } # tile 166 (zap 5 1) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ _________________________________________o______________________ _______________________________________o_v_o____________________ _o_______________________o___________oApBIBn_o___________o______ _v_o___________________o_v_o_______o_vBIC$Bh_v_o_______o_v_o____ BIBn_o_______________oApBIBn_o_o_oBIBIBIBhBIBIBn_o_o_oApBIBn_o_o C$Bh_v_o___________o_vBIC$Bh_v_v_vBIC$Bh_vBIC$Bh_v_v_vBIC$Bh_v_v BhBIBIBn_o_______oBIBIBIBhBIBIBIBIBIBhBI_vBIC$Bh_vBIBIBIBhBIBIBI _vBIC$Bh_v_o___o_vBIC$Bh_vBIC$C$C$Bh_v_v_vBIC$Bh_vBIC$Bh_vBIC$C$ _oApBhBIBIBI_oApBIBIBhBI_oApBhBhBhBF_o_o_oApBhBIBIBIBhBI_oApBhBh ___o_vBIC$Bh_vBIC$Bh_v_o___o_v_v_v_o_______o_vBIC$Bh_v_o___o_v_v _____sApBhBIBIBIBhBF_o_______o_o_o___________oBIBhBF_o_______o_o _______o_vBIC$Bh_v_o___________________________o_v_o____________ _________oApBhBI_o_______________________________o______________ ___________o_v_o________________________________________________ _____________o__________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 167 (zap 5 2) { C$Bh_v_o________________________________________________________ BhBIBIBn_o______________________________________________________ _vBIC$Bh_v_o____________________________________________________ _vBIC$Bh_v_s_o__________________________________________________ _vBIC$Bh_v_v_v_o________________________________________________ _oApBhBIBIBIBIBn_o______________________________________________ ___o_vBIC$C$C$Bh_v_o____________________________________________ _____oBIBhBhBhBIBIBn_o__________________________________________ _______o_v_v_vBIC$Bh_v_o________________________________________ _________o_s_vBIC$Bh_v_s_o_o_o__________________________________ ___________o_vBIC$Bh_v_v_v_v_v_o________________________________ _____________oApBhBIBIBIBIBIBIBn_o______________________________ _______________o_vBIC$C$C$C$C$Bh_v_o____________________________ _________________oBIBhBhBhBhBhBIBIBn_o__________________________ ___________________o_v_v_v_v_vBIC$Bh_v_o________________________ _____________________o_o_o_s_vBIC$Bh_v_o________________________ ___________________________o_vBIC$Bh_v_o________________________ ___________________________o_vBIC$Bh_v_o________________________ ___________________________o_vBIC$Bh_v_o________________________ _____________________________oApBhBIBIBn_o______________________ _______________________________o_vBIC$Bh_v_o____________________ _________________________________sApBhBIBIBn_o_o_o_o_o__________ ___________________________________o_vBIC$Bh_v_v_v_v_v_o________ _____________________________________sApBhBIBIBIBIBIBIBn_o______ _______________________________________o_vBIC$C$C$C$C$Bh_v_o____ _________________________________________sApBhBhBhBhBhBIBIBn_o_o ___________________________________________o_v_v_v_v_vBIC$Bh_v_v _____________________________________________o_o_o_s_vBIC$Bh_v_v ___________________________________________________o_vBIC$Bh_v_v _____________________________________________________oApBhBIBIBI _______________________________________________________o_vBIC$C$ _______________________________________________________o_vBIC$C$ } # tile 168 (zap 5 3) { ___________________________________________________o_v_v_vBIC$C$ _____________________________________________o_o_oBnBIBIBIBIBhBh ___________________________________________o_v_v_vBIC$C$C$Bh_v_v _________________________________________oBnBIBIBIBIBhBhBhBn_o_o _______________________________________o_vBIC$C$C$Bh_v_v_v_o____ _____________________________________oApBIBIBhBhBhAp_o_o_o______ ___________________________________o_vBIC$Bh_v_v_v_o____________ _________________________________o_s_vBIC$Bh_v_s_o______________ _______________________________o_v_v_vBIC$Bh_v_o________________ _____________________________oBnBIBIBICSC$Bh_v_o________________ ___________________________o_vBIC$C$C$C$C$Bh_v_o________________ _________________________oApBIBIBhBhBhBhBhBn_o__________________ _______________________o_vBIC$Bh_v_v_v_v_v_o____________________ _________________o_o_o_s_vBIC$Bh_v_s_o_o_o______________________ _______________o_v_v_v_v_vBIC$Bh_v_o____________________________ _____________oBnBIBIBIBIBIBIBhBn_o______________________________ ___________o_vBIC$C$C$C$C$Bh_v_o________________________________ ___________o_vBIC$CSBhBhBhAp_o__________________________________ ___________o_vBIC$Bh_v_v_v_o____________________________________ ___________o_vBIC$Bh_v_s________________________________________ ___________o_vBIC$Bh_v_o________________________________________ _________o_s_vBIC$Bh_v_o________________________________________ _______o_v_v_vBIC$Bh_v_o________________________________________ _____oBnBIBIBIBIBhBn_o__________________________________________ ___o_vBIC$C$C$Bh_v_o____________________________________________ _oApBIBIBhBhBhAp_o______________________________________________ _vBIC$Bh_v_v_v_o________________________________________________ _vBIC$Bh_v_s_o__________________________________________________ _vBIC$Bh_v_o____________________________________________________ BIBIBhBn_o______________________________________________________ C$Bh_v_o________________________________________________________ C$Bh_v_o________________________________________________________ } # tile 169 (zap 6 0) { ______________BG__An____BG_l_m_m_m___m_m_m_______m______________ _________________lBG_qAn_l__BG_m_m_m__An__BG____________________ _______________m__AnBGAn__BGAnAnBGAn__BG________________________ ______________BGAnBG__AnBGAnBGBGAnBGAnBGAn______________________ __________________AnBGBG_l__AnBG_m_mBG_l___m_____m______________ ________An_________lBGAnAnBGAnBGAn_m_m__AnBG__An________________ __________________BG_____m_mBGAnBGAnBGAn_q______________________ _______________m__An___m__AnBGAn____BG__An______________________ _________________mBG________BG_lBGAn____________________________ __________________An_m___m_m_m_mAn______BG______________________ ______________BG__BG_lBG__AnBG_m__BGAn______An__________________ __________An______BGAn__AnBG_lBGAn______________________________ ______________________BG_lAnBG_lBG__An___m______________________ ________BG____BGAnBGAn__BG_m_l_m___m__________BG________________ ____________An_mBG__An__BGAnBGAnBGAn__BG________________________ ______________An___mBGAnBGAn___m____BGAn_mAn____________________ ________________BGAn__BG__An_qAnBG__An_q________________________ ________________An_qAn_l_lBG_______lBG____AnBG__________________ ______________BGAn__BGBGAnBGAn_m__BG__An________________________ ________AnBG_____mBGAnBGAn___mBGAn__BG__________________________ ____________An______An__BGAnBG___m_mAn______BGAn________________ ________BG________BG_m__An___m__An__BG__BG______________________ _________________m____BG__BGAn__BGAn__An________________________ ________An____An_m______BGAn_m_m__BG__AnBG______________________ _____________________m____BGAn_mAnBG_m___m__An__________________ ____________________BGAnBGAn_m_mBGAn_m_____m____________________ ______________BG____An_m_m___mBG__An_q___________m______________ __________AnBGAn__AnBG__BGAnBGAn__BGAn__________________________ ________________BG_m__An_m_m_mBGAn______BG______________________ ________________BGAn____BGAn_m__AnBG__An________________________ __________________An_qAn_mBG_mBG_mAn_m__________________________ ____________BGAn___m_lBG_m_m_mAn__BG_m__BG_m____________________ } # tile 170 (zap 6 1) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________BG______________BG__________BG__An__BG________________ ______________________An______________An______________BG________ ____________________________An__________BG____________An______BG BG___mAn_______m____BG____BG_mBG____An________An____AnBG______An ___m__BG_________m________AnBG__AnBGBG_m_____m_m________AnBG____ AnBGAnBGAn_lBGAnBGAnBGAn__An___lBG_m__An__BG__________BG_mBGAn_m ___mAn__BGAn_______m_mBG__BGAnBG__AnBGAnBG_l_____mAnBGAn_____m_m __AnBGBGAnBG___m____An__An____BGAn_mAnBG____An____BG_l__BG__AnBG BG_m__An_mAn_m_____m__BG_mBGAnAn___mBGAnBGAn__BG__An_mAn_mAn_q_l _m__AnBG__BG_mBG___mAnBGAn_lBGAnBGBGAn__BG__AnBGAnBG__BG_qAnBG_m _mBGAnBGAnBGAnAnBG_mBG_lBG_mAn___m__An_mAn_mBG_lBG_l_lAn_m_m_m_m _m_mAnBGAnBGAnBG_m_m_mAn_m_lBG_mBG___mBG_______m_l_mBGAnBG__BGAn _m_mBGAn_mAnBG__AnBG__BGAn__An__An____An_mBGAn__BGAn____AnBG_l__ ___mAnBG_m_mAn__BG__An_____mBG_____mBG___m__AnBGAnBGAnBG__BGAnBG _m____BGAn_qBGAn____BG__An____BGAnBG__AnBGAn_____m_m_mAn_____m_l _mAnBGAn_m__An______________BGAn_m__BG______AnBG__________An____ _m____BG__BG_mBG__An_____m_____m__________BG__An_m______BG____BG __BG_____mAn__________________BG__An_______________m___________l ____________________BG____________BG____An______BG______________ __________An______________An____________BG______________________ _m_______m___________________________________________m__________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 171 (zap 6 2) { ___m_____m_______m______________________________________________ _m__AnBG___m__BG________________________________________________ _m_m_m___mAn_m______An__________________________________________ ____An__BG__________BG___m______________________________________ _mBG_m_____m_____mAn_m__________________________________________ __An___m_m___m__BG______________________________________________ ___m_____mAn__An_________m______BG____An________________________ _____m__BG_mBG___lBG_m__BG______________________________________ __BG_____l_____mBG_____lAn____An_________m______________________ _____l_____mAn_____mAnBG__BG____________________________________ ___m__An____BGAnBG_______lAnBG__BG___m__________________________ _________m______AnBGAn_lBG_mBGAn_l_________m____________________ _________m___mBG___m_m_m_mAn__BG__An_m_m________________________ ________________An__BG__AnBG_mAnBG___mBG_m______________________ _____________m_m__BG_l_mBG_lAnBG___l___l___m____________________ ___________m______An_______m_m_mAn_____m__An__BG_m______________ __________________BGAnBGAn___m_m_____mBG_mBG____An______________ __________________________BG__BG_m_qAn__An__An___m______________ __________________An___m____An_m__An_______mBG_m____BG__________ ______________________________AnBG_mBGBG_mBG_lBG__An__An________ __________________________BG___m_______l_l_mAn__BG_____m________ _____________________________________m____AnBGAnBGAn_mBG___m____ ________________________________An__BG___mBG_l_m____BG______BG__ _____________________________________________lBGAnBGAn_mAn___l__ ________________________________________AnBG___l_____m_________m ____________________________________________AnBG_____m__AnBG_m__ _________________________________________m___________m___m__An__ _________________________________________________m_mAnBG__BG_m__ ____________________________________________BGAn______AnBG____BG __________________________________________________BG_______m____ ____________________________________________________An___mAn___m ______________________________________________________BG____BG_m } # tile 172 (zap 6 3) { _______________________________________________m_______m_____m__ ________________________________________________BG___m__AnBG___m __________________________________________An_______lBG_m___m_m_m _______________________________________m__BG__________BG__An____ ___________________________________________mAn_m_____l_____mBG_l ______________________________________________BG___m___m_m__An__ ________________________BG____An_______m________An__BG_l_____m__ ______________________________________BG___lBG_m__An_lBG___m____ _______________________m________BG____An_m____An_q_____m____BG__ ____________________________________BG__AnBG_m____BG_m_____l____ ___________________________m__An__AnBG_l______AnBGAn____BG___m__ _____________________m_________qAnBG_mAn_mBGAnBG_______l________ _________________________m_mBG__BG__An_q_m_m_m__An_m___m________ _______________________mAn_m__AnAn_mAnBG__An__BG________________ _____________________m___m___m__BGBG_mAn_m_mBG___m_m____________ _______________mAn__BG___m____BG_m_l_m______An_______m__________ ______________BG____An_mBG_l_____l_m__BGAnBGBG__________________ _______________l__BG__BG__An_m_lBG__An__________________________ __________BG_____lAn_m______BG___lBG_____m__An__________________ ________An__An__BG_mBG_lBGAn_lBGAn______________________________ _________m____BG__An_m_m_m_______m__An__________________________ _____m__BG_mAnBGAnBGAn_____m____________________________________ __BG______An_____m_mBG_m__An__BG________________________________ ___l__An_mBGAnBGAn_m____________________________________________ _m_________m_____m__AnBG________________________________________ ___mAnBG___m____AnBG____________________________________________ __BG___m___m___________m________________________________________ ___mAn__AnBG_m_m________________________________________________ BG____BGAn______BGAn____________________________________________ _____m______An__________________________________________________ _m__An_q__BG____________________________________________________ _lBG____An______________________________________________________ } # tile 173 (zap 7 0) { ______________Cv__Cv____CvCuCuCuCu__CuCuCu______Cu______________ ________________CuCvCuCvCu__CvCuCuCu__Cv__Cv____________________ ______________Cu__CvCvCv__CvCvCvCvCv__Cv________________________ ______________CvCvCv__CvCvCvCvCvCvCvCvCvCv______________________ __________________CvCvCvCu__CvCvCuCuCvCu__Cu____Cu______________ ________Cv________CuCvCvCvCvCvCvCvCuCu__CvCv__Cv________________ __________________Cv____CuCuCvCvCvCvCvCvCu______________________ ______________Cu__Cv__Cu__CvCvCv____Cv__Cv______________________ ________________CuCv________CvCuCvCv____________________________ __________________CvCu__CuCuCuCuCv______Cv______________________ ______________Cv__CvCuCv__CvCvCu__CvCv______Cv__________________ __________Cv______CvCv__CvCvCuCvCv______________________________ ______________________CvCuCvCvCuCv__Cv__Cu______________________ ________Cv____CvCvCvCv__CvCuCuCu__Cu__________Cv________________ ____________CvCuCv__Cv__CvCvCvCvCvCv__Cv________________________ ______________Cv__CuCvCvCvCv__Cu____CvCvCuCv____________________ ________________CvCv__Cv__CvCuCvCv__CvCu________________________ ________________CvCuCvCuCuCv______CuCv____CvCv__________________ ______________CvCv__CvCvCvCvCvCu__Cv__Cv________________________ ________CvCv____CuCvCvCvCv__CuCvCv__Cv__________________________ ____________Cv______Cv__CvCvCv__CuCuCv______CvCv________________ ________Cv________CvCu__Cv__Cu__Cv__Cv__Cv______________________ ________________Cu____Cv__CvCv__CvCv__Cv________________________ ________Cv____CvCu______CvCvCuCu__Cv__CvCv______________________ ____________________Cu____CvCvCuCvCvCu__Cu__Cv__________________ ____________________CvCvCvCvCuCuCvCvCu____Cu____________________ ______________Cv____CvCuCu__CuCv__CvCu__________Cu______________ __________CvCvCv__CvCv__CvCvCvCv__CvCv__________________________ ________________CvCu__CvCuCuCuCvCv______Cv______________________ ________________CvCv____CvCvCu__CvCv__Cv________________________ __________________CvCuCvCuCvCuCvCuCvCu__________________________ ____________CvCv__CuCuCvCuCuCuCv__CvCu__CvCu____________________ } # tile 174 (zap 7 1) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________Cv______________Cv__________Cv__Cv__Cv________________ ______________________Cv______________Cv______________Cv________ ____________________________Cv__________Cv____________Cv______Cv Cv__CuCv______Cu____Cv____CvCuCv____Cv________Cv____CvCv______Cv __Cu__Cv________Cu________CvCv__CvCvCvCu____CuCu________CvCv____ CvCvCvCvCvCuCvCvCvCvCvCv__Cv__CuCvCu__Cv__Cv__________CvCuCvCvCu __CuCv__CvCv______CuCuCv__CvCvCv__CvCvCvCvCu____CuCvCvCv____CuCu __CvCvCvCvCv__Cu____Cv__Cv____CvCvCuCvCv____Cv____CvCu__Cv__CvCv CvCu__CvCuCvCu____Cu__CvCuCvCvCv__CuCvCvCvCv__Cv__CvCuCvCuCvCuCu Cu__CvCv__CvCuCv__CuCvCvCvCuCvCvCvCvCv__Cv__CvCvCvCv__CvCuCvCvCu CuCvCvCvCvCvCvCvCvCuCvCuCvCuCv__Cu__CvCuCvCuCvCuCvCuCuCvCuCuCuCu CuCuCvCvCvCvCvCvCuCuCuCvCuCuCvCuCv__CuCv______CuCuCuCvCvCv__CvCv CuCuCvCvCuCvCv__CvCv__CvCv__Cv__Cv____CvCuCvCv__CvCv____CvCvCu__ __CuCvCvCuCuCv__Cv__Cv____CuCv____CuCv__Cu__CvCvCvCvCvCv__CvCvCv Cu____CvCvCuCvCv____Cv__Cv____CvCvCv__CvCvCv____CuCuCuCv____CuCu CuCvCvCvCu__Cv______________CvCvCu__Cv______CvCv__________Cv____ Cu____Cv__CvCuCv__Cv____Cu____Cu__________Cv__CvCu______Cv____Cv __Cv____CuCv__________________Cv__Cv______________Cu__________Cu ____________________Cv____________Cv____Cv______Cv______________ __________Cv______________Cv____________Cv______________________ Cu______Cu__________________________________________Cu__________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 175 (zap 7 2) { __Cu____Cu______Cu______________________________________________ Cu__CvCv__Cu__Cv________________________________________________ CuCuCu__CuCvCu______Cv__________________________________________ ____Cv__Cv__________Cv__Cu______________________________________ CuCvCu____Cu____CuCvCu__________________________________________ __Cv__CuCu__Cu__Cv______________________________________________ __Cu____CuCv__Cv________Cu______Cv____Cv________________________ ____Cu__CvCuCv__CuCvCu__Cv____CvCv______________________________ __Cv____Cu____CuCv__CvCuCv____Cv________Cu______________________ ____Cu____CuCv____CuCvCv__Cv____________________________________ __Cu__Cv____CvCvCv______CuCvCv__Cv__Cu__________________________ ________Cu__CvCvCvCvCvCuCvCuCvCvCu______________________________ ________Cu__CuCv__CuCuCuCuCv__Cv________________________________ ______________CvCv__Cv__CvCvCuCvCv______________________________ ____________CuCuCvCvCuCuCvCuCvCv__Cu__Cu__Cu____________________ __________Cu______Cv______CuCuCuCv____Cu__Cv__CvCu______________ __________________CvCvCvCv__CuCu____CuCvCuCv____Cv______________ __________________________Cv__CvCuCuCv__Cv__Cv__Cu______________ __________________Cv__Cu____CvCu__Cv______CuCvCu____Cv__________ ______________________________CvCvCuCvCvCuCvCuCv__Cv__Cv________ __________________________Cv__Cu______CuCuCuCv__Cv____Cu________ ____________________________________Cu____CvCvCvCvCvCuCv__Cu____ ____________________________________Cv__CuCvCuCu____Cv______Cv__ ____________________________________________CuCvCvCvCvCuCv__Cu__ ________________________________________CvCv__Cu____Cu________Cu ____________________________________________CvCv____Cu__CvCvCu__ ________________________________________Cu__________Cu__Cu__Cv__ ________________________________________________CuCuCvCv__CvCu__ ____________________________________________CvCv______CvCv____Cv __________________________________________________Cv______Cu____ ____________________________________________________Cv__CuCv__Cu ______________________________________________________Cv____CvCu } # tile 176 (zap 7 3) { ______________________________________________Cu______Cu____Cu__ ________________________________________________Cv__Cu__CvCv__Cu __________________________________________Cv______CuCvCu__CuCuCu ______________________________________Cu__Cv__________Cv__Cv____ __________________________________________CuCvCu____Cu____CuCvCu ______________________________________________Cv__Cu__CuCu__Cv__ ________________________Cv____Cv______Cu________Cv__CvCu____Cu__ ______________________________CvCv____Cv__CuCvCu__CvCuCv__Cu____ ______________________Cu________Cv____CvCuCv__CvCu____Cu____Cv__ ____________________________________Cv__CvCvCu____CvCu____Cu____ __________________________Cu__Cv__CvCvCu______CvCvCv____Cv__Cu__ ______________________________CuCvCvCuCvCuCvCvCvCvCv__Cu________ ________________________________Cv__CvCuCuCuCu__CvCu__Cu________ ______________________________CvCvCuCvCv__Cv__CvCv______________ ____________________Cu__Cu__Cu__CvCvCuCvCuCuCvCvCuCu____________ ______________CuCv__Cv__Cu____CvCuCuCu______Cv______Cu__________ ______________Cv____CvCuCvCu____CuCu__CvCvCvCv__________________ ______________Cu__Cv__Cv__CvCuCuCv__Cv__________________________ __________Cv____CuCvCu______Cv__CuCv____Cu__Cv__________________ ________Cv__Cv__CvCuCvCuCvCvCuCvCv______________________________ ________Cu____Cv__CvCuCuCu______Cu__Cv__________________________ ____Cu__CvCuCvCvCvCvCv____Cu____________________________________ __Cv______Cv____CuCuCvCu__Cv____________________________________ __Cu__CvCuCvCvCvCvCu____________________________________________ Cu________Cu____Cu__CvCv________________________________________ __CuCvCv__Cu____CvCv____________________________________________ __Cv__Cu__Cu__________Cu________________________________________ __CuCv__CvCvCuCu________________________________________________ Cv____CvCv______CvCv____________________________________________ ____Cu______Cv__________________________________________________ Cu__CvCu__Cv____________________________________________________ CuCv____Cv______________________________________________________ } # tile 183 (sub mine walls 0) { _A_A_ABSAwAwAwAwAwAwATATATATATATATATATATATATBSBSBsBSBSBsBs_A_A_A _A_ABSAwAwAwAwAwBSBSATATATATATATATATATATATATBSBSBSBSBSBs_A_A_A_A _A_AAwAwAwAwAwBSBSBSATATATATATATATATATATATAwAwAwBSBSBSBS_A_A_A_A _A_AAwAwAwAwBSBSBSATATATATATATATATATATATATAwAwAwAwBSBSBSBS_A_A_A _AAwAwAwBSBSBSBSBSATATATATATATATATATATATATAwAwAwAwBSBSBSBSBS_A_A _AAwAwBSBSBSBSBSBSATATATATATATATATATATATATATAwAwAwAwAwBSBSBS_A_A _AAwBSBSBSBSBSBSATATATATATATATATATATATATATATATBSBSAwAwAwBSBSBS_A _ABSBSBSBSBSBSBSATATATATATATATATATATATATATATATBSBSBSAwAwAwBSBS_A _ABSBSBSBSBSBSATATATATATATATATATATATATATATATATBSBSBSBSAwAwAwBS_A _ABSBSBSBSBSBsBsATATATATATATATATATATATATATATATBSBSBSBSAwAwAwAw_A _ABSBSBSBSBsBsBsBsATATATATATATATATATATATATATBsBsBsBsBSBSAwAwAw_A _ABSBSBSBsBsBsBsBSATATATATATATATATATATATATBsBsBsBsBsBSBSBSAwAw_A _A_ABSBsBsBsBsBSBSBSATATATATATATATATATATBsBsBsBsBsBsBsBsBSBSBS_A _A_A_ABsBsBSBSBSAwAwATATATATATATATATATATBSBSBSBsBsBsBsBsBsBSBS_A _A_A_A_ABSBSBSAwAwATATATATATATATATATATATAwAwBSBSBsBsBsBsBsBsBS_A _A_A_A_ABSBSAwAwAwATATATATATATATATATATATATAwAwBSBSBsBsBsBs_A_A_A _A_A_A_ABSAwAwAwATATATATATATATATATATATATATATAwAwBSBSBSBsBs_A_A_A _A_A_A_AAwAwAwATATATATATATATATATATATATATATATAwAwAwBSBSBS_A_A_A_A _A_A_AAwAwAwAwATATATATATATATATATATATATATATATAwAwAwAwBSBS_A_A_A_A _A_AAwAwAwAwBSATATATATATATATATATATATATATATATATAwAwAwAwBS_A_A_A_A _A_AAwAwAwBSBSATATATATATATATATATATATATATATATATAwAwAwAwAw_A_A_A_A _AAwAwAwBSBSBSBsATATATATATATATATATATATATATATATATAwAwAwAwAw_A_A_A _AAwAwBSBSBSBsBsATATATATATATATATATATATATATATATATATAwAwAwAwAw_A_A _AAwAwBSBSBsBsBsBsATATATATATATATATATATATATATATATATBSBSBSAwAw_A_A _ABSBSBSBsBsBsBsBsBSBSATATATATATATATATATATATATATBSBSBSBSBSAwAw_A _A_ABsBsBsBsBsBsBSBSBSATATATATATATATATATATATATBsBSBSBSBSBSBSAw_A _A_A_ABsBsBsBSBSBSBSBSATATATATATATATATATATATBsBsBsBsBSBSBSBSBS_A _A_A_A_A_ABsBSBSBSAwAwATATATATATATATATATATBsBsBsBsBsBsBSBSBSBS_A _A_A_A_A_ABSBSBSBSAwATATATATATATATATATATATBSBSBsBsBsBsBSBSBSBS_A _A_A_A_A_ABSBSAwAwAwATATATATATATATATATATATBSBSBSBsBsBsBsBSBSBS_A _A_A_A_A_AAwAwAwAwAwATATATATATATATATATATATATBSBSBsBsBsBsBsBS_A_A _A_A_A_AAwAwAwAwAwATATATATATATATATATATATATATBSBSBSBsBsBsBs_A_A_A } # tile 184 (sub mine walls 1) { _A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_ABsBSBSBSAw_A_A_A_A_A_A_A_A_A_A_ABSBSAwAwAw_A_A_A_A _A_A_A_ABsBsBsBSBSBSBSAwAwAwAw_A_A_A_A_ABsBsBSBSBSAwAwAwAwAwBS_A BSBSBSBsBsBsBsBSBSBSBSAwAwAwAwBSBSBSBSBSBsBsBSBSBSBSBSAwAwAwBSBS BSBSBsBsBsBsBsATATATATAwAwAwAwAwBSBSBSBsBsBsATBSBSBSATAwAwAwAwBS BSBsBsBsBsATATATATATATATAwAwAwAwBSBSBSBsATATATATATATATATATAwAwBS ATBsBsBsATATATATATATATATATAwAwAwBSBSBSATATATATATATATATATATAwAwAw ATBsBsATATATATATATATATATATATATATBSBSATATATATATATATATATATATATATAT ATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATAT ATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATAT ATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATAT ATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATAT ATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATAT ATATATATATATATATBSBSATATATATATATATATATATATATATATATATATATATATATAT ATATATATATATAwBSBSBSBsATATATATATATATATATATATATATATATATATATATATAT ATATATATATATAwBSBSBSBsBsATATATATATATATATATATATATATAwBSBSATATATAT ATATAwAwAwAwAwBSBSBSBSBsBsBsBsATATATATATATATATAwAwAwBSBsBsATATAT BSBSAwAwAwAwBSBSBSBSBSBsBsBsBsBsBSATATATATATAwAwAwAwBSBsBsBsATAT BSBSAwAwAwAwBSBSBSBSBSBsBsBsBsBsBSBSBSBSBSAwAwAwAwBSBSBsBsBsBSBS BSBSAwAwAwAwBSBSBSBSBSBsBsBsBsBsBSBSBSBSBSAwAwAwAwBSBSBsBsBsBSBS BSBSBSAwAwAwBSBSBSBSBSBsBsBsBsBsBSBSBSBSBSAwAwAwAwBSBSBsBsBsBSBS BSBSBSAwAwAwAwBSBSBSBSBsBsBsBsBSBSBSBSBSBSAwAwAwAwBSBSBsBsBsBSBS BSBSBSAwAwAwAwBSBSBSBsBsBsBsBsBSBSBSBSBSAwAwAwAwBSBSBSBsBsBsBSBS BSBSBSBSAwAwAwBSBSBSBsBsBsBsBSBSBSBSBSBSAwAwAwAwBSBSBsBsBsBsBSBS BSBSBSBSAwAwAwBSBSBSBsBsBsBsBSBSBSBSBSBSAwAwAwAwBSBSBsBsBsBsBSBS BSBSBSBSAwAwAwAwBSBSBsBsBsBsBSBSBSBSBSBSAwAwAwAwBSBSBsBsBsBsBSBS BSBSBSAwAwAwAwAwBSBSBsBsBsBsBsBSBSBSBSBSAwAwAw_A_A_ABsBsBsBsBSBS BSBSBSAwAwAwAwAw_A_A_ABsBsBsBsBSBSBSBSAwAwAwAw_A_A_A_ABsBsBsBSBS BSBSBSAwAwAwAwAw_A_A_A_ABsBsBsBSBSBSBSAwAwAw_A_A_A_A_A_ABsBsBSBS BSBSBSAwAwAw_A_A_A_A_A_ABsBsBsBSBSBSBSAwAw_A_A_A_A_A_A_ABsBsBSBS BSBSBSAwAwAw_A_A_A_A_A_A_ABsBsBSBSBSBSAw_A_A_A_A_A_A_A_A_ABsBSBS _A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A } # tile 185 (sub mine walls 2) { _A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_ABsBsBsBSAwAwAw_A_A_A_A _A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_ABsBsBsBsBSBSAwAwAwAw_A_A_A _A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_ABsBsBsBsBSBSBSBSBSAwAwAw_A_A _A_A_A_A_A_A_A_A_A_A_AAwAwAwBsBsBsBsBsBsBsBsATATATATATAwAwAwAwAw _A_A_A_A_A_A_A_A_A_ABSAwAwAwAwBsBsBsBsBsATATATATATATATATATAwAwAw _A_A_A_A_A_A_A_A_ABSBSBSAwAwAwAwAwBsBsATATATATATATATATATATAwAwAw _A_A_A_A_A_A_A_ABSBSBSBSAwAwAwAwAwAwATATATATATATATATATATATATATAT _A_A_A_A_A_A_A_ABsBsBSBSBSBSATATATATATATATATATATATATATATATATATAT _A_A_A_A_A_A_ABsBsBsBsBsBSATATATATATATATATATATATATATATATATATATAT _A_A_A_A_A_A_ABsBsBsBsBsATATATATATATATATATATATATATATATATATATATAT _A_A_A_A_A_A_ABsBsBsBsATATATATATATATATATATATATATATATATATATATATAT _A_A_A_A_A_ABSBSBSBSATATATATATATATATATATATATATATATATATATATATATAT _A_A_A_A_A_ABSBSBSBSATATATATATATATATATATATATATATATATATATATATATAT _A_A_A_A_ABSBSBSAwAwATATATATATATATATATATATATATATATATATATATATATAT _A_A_A_A_ABSBSAwAwATATATATATATATATATATATATATATATATBSBSBSATATATAT _A_A_ABSBSBSAwAwATATATATATATATATATATATATATATATBSBSBSBSBsBsATATAT _A_A_ABSBSAwAwATATATATATATATATATATATATATATATBSBSBSBSBSBsBsBsATAT _A_ABSBSAwAwATATATATATATATATATATATATATATBSBSBSBSBSBSBSBsBsBsBSBS _A_ABSAwAwAwATATATATATATATATATATATATATATBSBSBSBSBSBSBSBsBsBsBSBS _ABSAwAwBSATATATATATATATATATATATATATATAwAwAwBSBSBSBSBSBsBsBsBSBS _AAwAwBSBSATATATATATATATATATATATATATATATAwAwAwBSBSBSBSBsBsBsBSBS _AAwBSBSBsBsATATATATATATATATATATATATATATAwAwAwAwBSBSBSBSBsBsBSBS _ABSBSBsBsBsATATATATATATATATATATATATATATATBSAwAwAwBSBSBSBsBsBSBS _ABSBsBsBsBsBSATATATATATATATATATATATATATATBSBSAwAwAwBSBSBsBsBSBS _ABsBsBsBsBSBSBSATATATATATATATATATATATATATBSBSBSAwAwAwBSBSBsBSBS _ABsBsBsBSBSBSBSATATATATATATATATATATATATATBSBSBSBSAwAwBSBSBsBSBS _A_ABsBSBSBSBSBSATATATATATATATATATATATATATBsBSBSBSBSAwAwBSBsBSBS _A_ABsBSBSBSBSAwAwATATATATATATATATATATATBsBsBsBSBSBSBSAwAwBsBSBS _A_A_ABSBSBSAwAwAwATATATATATATATATATATATBsBsBsBsBsBSBSBSAw_ABSBS _A_A_ABSBSAwAwAwAwAwATATATATATATATATATATATBsBsBsBsBsBSBSBS_A_A_A _A_A_ABSAwAwAwAwAwAwATATATATATATATATATATATATBsBsBsBsBsBs_A_A_A_A } # tile 186 (sub mine walls 3) { _A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A _A_A_A_A_ABsBSBSBSBS_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A _A_A_A_ABsBsBsBSBSBSAwAw_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A BSBSBSBsBsBsBsBSBSAwAwAwAwAwAwAw_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A BSBSBSBsBsBsATATATATATAwAwAwAwAwAw_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A BSBSBSBsBsATATATATATATATAwAwAwAwAwAw_A_A_A_A_A_A_A_A_A_A_A_A_A_A BSBSBSBsATATATATATATATATATATATATATAwAw_A_A_A_A_A_A_A_A_A_A_A_A_A ATATATATATATATATATATATATATATATATATATAwAwAw_A_A_A_A_A_A_A_A_A_A_A ATATATATATATATATATATATATATATATATATATATAwAwAw_A_A_A_A_A_A_A_A_A_A ATATATATATATATATATATATATATATATATATATATAwAwAwAw_A_A_A_A_A_A_A_A_A ATATATATATATATATATATATATATATATATATATATATAwAwAwAwAw_A_A_A_A_A_A_A ATATATATATATATATATATATATATATATATATATATATAwAwAwAwAwAw_A_A_A_A_A_A ATATATATATATATATATATATATATATATATATATATATATAwAwAwAwAw_A_A_A_A_A_A ATATATATATATATATATATATATATATATATATATATATATATAwAwAwAwAw_A_A_A_A_A ATATATATATATATATATATATATATATATATATATATATATATATBSAwAwAw_A_A_A_A_A ATATATATATATATATATATATATATATATATATATATATATATATBSBSAwAwAw_A_A_A_A ATATATATATATATATATATATATATATATATATATATATATATATBSBSBSAwAwAw_A_A_A ATATATATATATATATATATATATATATATATATATATATATBsBsBsBsBSBSBSBS_A_A_A BSBSBSATATATATATATATATATATATATATATATATATBSBSBsBsBsBsBSBSBS_A_A_A BSBSBsBsATATATATATATATATATATATATATATATATBSBSBSBsBsBsBsBSBS_A_A_A BSBSBsBsBsATATATATATATATATATATATATATATAwAwAwBSBSBSBsBsBsBs_A_A_A BSBSBsBsBsATATATATATATATATATATATATATATATAwAwAwBSBSBSBsBsBs_A_A_A BSBSBsBsBSBSATATATATATATATATATATATATATATAwAwAwAwBSBSBSBs_A_A_A_A BSBSBsBsBSBSAwAwAwAwATATATATATATATATATATATBSAwAwAwBSBSBS_A_A_A_A BSBSBsBsBSAwAwAwAwAwAwATATATATATATATATATATBSBSAwAwAwBSBS_A_A_A_A BSBSBsBsBSAwAwAwAwAwBSATATATATATATATATATATBSBSBSAwAwAw_A_A_A_A_A BSBSBsBsAwAwAwAwAwBSBSBSATATATATATATATATATBSBSBSBSAwAw_A_A_A_A_A BsBSBsAwAwAwAwBSBSBSBSBSATATATATATATATATATBsBSBSBSBSAwAw_A_A_A_A BsBSBsAwAwAwBSBSBSBSBSBSATATATATATATATATBsBsBsBSBSBSBSAwAw_A_A_A BsBS_AAwAwBSBSBSBSBSAwAwATATATATATATATATBsBsBsBsBsBSBSBSAwAw_A_A Bs_A_AAwBSBSBSBSAwAwAwATATATATATATATATATATBsBsBsBsBsBSBSBSBS_A_A _A_A_ABSBSBSAwAwAwAwATATATATATATATATATATATATBsBsBsBsBsBsBS_A_A_A } # tile 187 (sub mine walls 4) { _A_A_AAwAwAwAwBSBSBSATATATATATATATATATATATATBSBSBSBSBsBsBs_A_A_A _A_A_AAwAwBSBSBSBSAwAwATATATATATATATATATATATBSBSBSBSBSBs_A_A_A_A _A_AAwBSBSBSBSAwAwAwAwATATATATATATATATATATBSBSBSBSAwAwAw_A_A_A_A _A_ABSBSBSAwAwAwAwAwATATATATATATATATATATATBSAwAwAwAwAwAwAwAw_A_A _A_ABSAwAwAwAwAwBSATATATATATATATATATATATATATAwAwAwAwAwAwAwBSBSBS _A_AAwAwAwAwAwBSBSATATATATATATATATATATATATATAwAwAwAwAwAwBSBSBSBS _A_AAwAwAwBSBSBSBSATATATATATATATATATATATATATATAwAwAwAwBSBSBSBSBS _A_AAwBSBSBSBSBSBSATATATATATATATATATATATATATATATATATATATATATBSBS _A_ABSBSBSBSBSBSBSATATATATATATATATATATATATATATATATATATATATATATAT _ABSBSBSBSBSBSBsBsBsATATATATATATATATATATATATATATATATATATATATATAT _ABSBSBSBSBsBsBsBsBsBsATATATATATATATATATATATATATATATATATATATATAT _ABSBSBSBsBsBsBsBsBsBsBSATATATATATATATATATATATATATATATATATATATAT _ABSBsBsBSBsBsBsBsBsBSAwAwAwATATATATATATATATATATATATATATATATATAT _ABsBsBsBsBsBsBsBSBSBSAwAwAwAwATATATATATATATATATATATATATATATATAT _ABsBsBsBsBsBSBSBSAwAwAwAwAwBSATATATATATATATATATATATATATATATATAT _A_ABsBsBsBSBSBSAwAwAwAwAwAwBSBsATATATATATATATATATBSBSBSATATATAT _A_ABsBSBSBSBSAwAwAwAwAwAwBSBSBsBsATATATATATATAwAwBSBSBsBsATATAT _A_A_ABSBSAwAwAwAwAwAwAwBSBSBSBsBsBSBSBSBSBSAwAwAwBSBSBsBsBsATAT _A_A_ABSAwAwAwAwAwAwAwBSBSBSBSBsBsBSBSBSBSBSAwAwAwBSBSBsBsBsBSBS _A_A_A_AAwAwAwAwAwAwBSBSBSBSBsBsBsBSBSBSBSBSAwAwAwBSBSBsBsBsBSBS _A_A_A_A_AAwAwAwAwBSBSBSBSBSBsBsBsBSBSBSBSBSAwAwAwBSBSBsBsBsBSBS _A_A_A_A_A_A_A_A_ABSBSBSBSBSBsBsBsBSBSBSBSAwAwAwAwBSBSBsBsBsBSBS _A_A_A_A_A_A_A_A_A_ABSBSBSBsBsBsBSBSBSBSBSAwAwAwAwBSBSBSBsBsBSBS _A_A_A_A_A_A_A_A_A_ABSBSBsBsBsBsBSBSBSBSBSAwAwAwAwBSBSBSBsBsBSBS _A_A_A_A_A_A_A_A_A_ABSBsBsBsBsBsBSBSBSBSBSAwAwAwAwBSBSBSBsBsBSBS _A_A_A_A_A_A_A_A_A_ABSBsBsBsBsBSBSBSBSBSBSAwAwAwAwBSBSBSBSBsBSBS _A_A_A_A_A_A_A_A_A_ABsBsBsBsBsBSBSBSBSBSAwAwAwAwAw_ABSBSBSBsBSBS _A_A_A_A_A_A_A_A_A_A_ABsBsBsBsBSBSBSBSBSAwAwAwAwAw_A_A_ABSBsBSBS _A_A_A_A_A_A_A_A_A_A_ABsBsBsBsBSBSBSBSBSAwAwAw_A_A_A_A_ABSBsBSBS _A_A_A_A_A_A_A_A_A_A_A_A_ABsBsBSBSBSBSBSAwAw_A_A_A_A_A_A_A_ABSBS _A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_ABSBSBSAw_A_A_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A } # tile 188 (sub mine walls 5) { _A_A_A_A_AAwAwAwAwAwATATATATATATATATATATATATBSBSBSBSBsBsBs_A_A_A _A_A_A_A_AAwAwAwAwAwAwATATATATATATATATATATATBSBSBSBSBSBs_A_A_A_A _A_A_A_ABsBsBsBSAwAwAwATATATATATATATATATATBSBSBSBSBSBSBS_A_A_A_A BSBSBSBsBsBsBsBSBSAwATATATATATATATATATATATBsBsBSBSBSBSBS_A_A_A_A BSBSBSBsBsBsATATATATATATATATATATATATATATATBsBsBsBsBSBSBS_A_A_A_A BSBSBSBsBsATATATATATATATATATATATATATATATBsBsBsBsBsBSBSBS_A_A_A_A BSBSBSBsATATATATATATATATATATATATATATATBSBSBsBsBsBsBsBSBSBS_A_A_A ATATATATATATATATATATATATATATATATATATATBSBSBsBsBsBsBsBsBSBS_A_A_A ATATATATATATATATATATATATATATATATATATATBSBSBSBsBsBsBsBsBsBS_A_A_A ATATATATATATATATATATATATATATATATATATATBSBSBSBSBsBsBsBsBsBsBs_A_A ATATATATATATATATATATATATATATATATATATATATAwBSBSBSBsBsBsBsBsBs_A_A ATATATATATATATATATATATATATATATATATATATATAwAwBSBSBSBSBsBsBs_A_A_A ATATATATATATATATATATATATATATATATATATATATATAwAwBSBSBSBSBsBs_A_A_A ATATATATATATATATATATATATATATATATATATATATATBSAwAwBSBSBS_A_A_A_A_A ATATATATAwBSBSBSBSATATATATATATATATATATATATBSBSAwAwBSBS_A_A_A_A_A ATATATAwAwBSBSBSBSBsBsATATATATATATATATATATBSBSBSAwAwBS_A_A_A_A_A ATATAwAwAwBSBSBSBSBsBsBsATATATATATATATATBsBsBsBSBSAwAw_A_A_A_A_A ATAwAwAwAwBSBSBSBSBsBsBsBsATATATATATAwBSBSBsBsBsBSBSAw_A_A_A_A_A BSAwAwAwAwAwBSBSBsBsBsBsBsBSBSATBSBSAwBSBSBsBsBsBsBSBS_A_A_A_A_A BSAwAwAwAwAwBSBSBsBsBsBsBsBSBSBSBSBSAwAwBSBSBsBsBsBsBsBS_A_A_A_A BSAwAwAwAwAwBSBSBsBsBsBsBsBSBSBSBSBSAwAwBSBSBSBsBsBsBsBs_A_A_A_A BSAwAwAwAwAwBSBSBsBsBsBsBsBSBSBSBSBSAwAwAwBSBSBsBsBsBsBs_A_A_A_A BSAwAwAwAwBSBSBSBsBsBsBsBsBsBSBSBSBSAwAwAwBSBSBSBsBsBsBs_A_A_A_A BSAwAwAwAwBSBSBSBSBsBsBsBsBsBSBSBSBSAwAwAwBSBSBSBSBsBsBs_A_A_A_A BSAwAwAwAwBSBSBSBSBsBsBsBsBsBSBSBSBSBSAwAwAwBSBSBSBSBs_A_A_A_A_A BSAwAwAwAwBSBSBSBSBsBsBsBsBsBSBSBSBSBSAwAwAwBSBSBSBS_A_A_A_A_A_A BSAwAwAwAwBSBSBSBSBSBsBsBsBsBSBSBSBSBSAwAwAwBSBSBS_A_A_A_A_A_A_A BsAwAwAwAw_A_ABSBSBSBsBsBsBSBSBSBSBSBSAwAw_A_A_A_A_A_A_A_A_A_A_A BsBSAw_A_A_A_A_A_A_A_ABsBsBSBSBSBSBSBSAwAw_A_A_A_A_A_A_A_A_A_A_A BsBS_A_A_A_A_A_A_A_A_A_ABsBSBSBSBSBSBSAw_A_A_A_A_A_A_A_A_A_A_A_A Bs_A_A_A_A_A_A_A_A_A_A_A_ABSBSBSBSBSBS_A_A_A_A_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A } # tile 189 (sub mine walls 6) { _A_A_A_A_AAwAwAwAwAwATATATATATATATATATATATATBSBSBSBSBsBsBs_A_A_A _A_A_A_A_AAwAwAwAwAwAwATATATATATATATATATATATBSBSBSBSBSBs_A_A_A_A _A_A_A_ABsBsBsBSAwAwAwATATATATATATATATATATBSBSBSBSAwAwAw_A_A_A_A BSBSBSBsBsBsBsBSBSAwATATATATATATATATATATATBSAwAwAwAwAwAwAwAw_A_A BSBSBSBsBsBsATATATATATATATATATATATATATATATATAwAwAwAwAwAwAwBSBSBS BSBSBSBsBsATATATATATATATATATATATATATATATATATAwAwAwAwAwAwBSBSBSBS BSBSBSBsATATATATATATATATATATATATATATATATATATATAwAwAwAwBSBSBSBSBS ATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATBSBS ATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATAT ATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATAT ATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATAT ATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATAT ATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATAT ATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATAT ATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATAT ATATATATATATATATATATATATATATATATATATATATATATATATATBSBSBSATATATAT ATATATATATATATATATATATATATATATATATATATATATATATBSBSBSBSBsBsATATAT ATATATATATATATATATATATATATATATATATATATATATATBSBSBSBSBSBsBsBsATAT BSBSBSATATATATATATATATATATATATATATATATATBSBSBSBSBSBSBSBsBsBsBSBS BSBSBsBsATATATATATATATATATATATATATATATATBSBSBSBSBSBSBSBsBsBsBSBS BSBSBsBsBsATATATATATATATATATATATATATATAwAwAwBSBSBSBSBSBsBsBsBSBS BSBSBsBsBsATATATATATATATATATATATATATATATAwAwAwBSBSBSBSBsBsBsBSBS BSBSBsBsBSBSATATATATATATATATATATATATATATAwAwAwAwBSBSBSBSBsBsBSBS BSBSBsBsBSBSAwAwAwAwATATATATATATATATATATATBSAwAwAwBSBSBSBsBsBSBS BSBSBsBsBSAwAwAwAwAwAwATATATATATATATATATATBSBSAwAwAwBSBSBsBsBSBS BSBSBsBsBSAwAwAwAwAwBSATATATATATATATATATATBSBSBSAwAwAwBSBSBsBSBS BSBSBsBsAwAwAwAwAwBSBSBSATATATATATATATATATBSBSBSBSAwAwBSBSBsBSBS BsBSBsAwAwAwAwBSBSBSBSBSATATATATATATATATATBsBSBSBSBSAwAwBSBsBSBS BsBSBsAwAwAwBSBSBSBSBSBSATATATATATATATATBsBsBsBSBSBSBSAwAwBsBSBS BsBS_AAwAwBSBSBSBSBSAwAwATATATATATATATATBsBsBsBsBsBSBSBSAw_ABSBS Bs_A_AAwBSBSBSBSAwAwAwATATATATATATATATATATBsBsBsBsBsBSBSBS_A_A_A _A_A_ABSBSBSAwAwAwAwATATATATATATATATATATATATBsBsBsBsBsBs_A_A_A_A } # tile 190 (sub mine walls 7) { _A_A_A_A_AAwAwAwAwAwATATATATATATATATATATATATBSBSBSBSBsBsBs_A_A_A _A_A_A_A_AAwAwAwAwAwAwATATATATATATATATATATATBSBSBSBSBSBs_A_A_A_A _A_A_A_ABsBsBsBSAwAwAwATATATATATATATATATATBSBSBSBSAwAwAw_A_A_A_A BSBSBSBsBsBsBsBSBSAwATATATATATATATATATATATBSAwAwAwAwAwAwAwAw_A_A BSBSBSBsBsBsATATATATATATATATATATATATATATATATAwAwAwAwAwAwAwBSBSBS BSBSBSBsBsATATATATATATATATATATATATATATATATATAwAwAwAwAwAwBSBSBSBS BSBSBSBsATATATATATATATATATATATATATATATATATATATAwAwAwAwBSBSBSBSBS ATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATBSBS ATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATAT ATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATAT ATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATAT ATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATAT ATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATAT ATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATAT ATATATATAwBSBSBSBSATATATATATATATATATATATATATATATATATATATATATATAT ATATATAwAwBSBSBSBSBsBsATATATATATATATATATATBSBSBSBSBSBSBSATATATAT ATATAwAwAwBSBSBSBSBsBsBsATATATATATATATATAwAwBSBSBSBSBSBsBsATATAT ATAwAwAwAwBSBSBSBSBsBsBsBsATATATATATAwAwAwAwBSBSBSBSBSBsBsBsATAT BSAwAwAwAwAwBSBSBsBsBsBsBsBSBSATBSBSAwAwAwAwBSBSBSBSBSBsBsBsBSBS BSAwAwAwAwAwBSBSBsBsBsBsBsBSBSBSBSBSAwAwAwAwBSBSBSBSBSBsBsBsBSBS BSAwAwAwAwAwBSBSBsBsBsBsBsBSBSBSBSBSAwAwAwAwAwBSBSBSBSBsBsBsBSBS BSAwAwAwAwAwBSBSBsBsBsBsBsBSBSBSBSBSAwAwAwAwAwBSBSBSBSBsBsBsBSBS BSAwAwAwAwBSBSBSBsBsBsBsBsBsBSBSBSBSAwAwAwAwAwBSBSBSBSBSBsBsBSBS BSAwAwAwAwBSBSBSBSBsBsBsBsBsBSBSBSBSAwAwAwAwBSBSBSBSBSBSBsBsBSBS BSAwAwAwAwBSBSBSBSBsBsBsBsBsBSBSBSBSBSAwAwAwBSBSBSBSBSBSBsBsBSBS BSAwAwAwAwBSBSBSBSBsBsBsBsBsBSBSBSBSBSAwAwAwBSBSBSBSBSBSBSBsBSBS BSAwAwAwAwBSBSBSBSBSBsBsBsBsBSBSBSBSBSAwAwAwBSBSBSBSBSBSBSBsBSBS BsAwAwAwAw_A_ABSBSBSBsBsBsBSBSBSBSBSBSAwAw_A_A_A_A_A_ABSBSBsBSBS BsBSAw_A_A_A_A_A_A_A_ABsBsBSBSBSBSBSBSAwAw_A_A_A_A_A_A_ABSBsBSBS BsBS_A_A_A_A_A_A_A_A_A_ABsBSBSBSBSBSBSAw_A_A_A_A_A_A_A_A_A_ABSBS Bs_A_A_A_A_A_A_A_A_A_A_A_ABSBSBSBSBSBS_A_A_A_A_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A } # tile 191 (sub mine walls 8) { _A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A _A_A_A_A_ABsBSBSBSBS_A_A_A_A_A_A_A_A_A_A_ABsBsBsBSAwAwAw_A_A_A_A _A_A_A_ABsBsBsBSBSBSAwAw_A_A_A_A_A_A_ABsBsBsBsBSBSAwAwAwAw_A_A_A BSBSBSBsBsBsBsBSBSAwAwAwAw_A_A_A_A_ABsBsBsBsBSBSBSBSBSAwAwAw_A_A BSBSBSBsBsBsATATATATATAwAwAwBsBsBsBsBsBsBsBsATBSBSBSATAwAwAwAwAw BSBSBSBsBsATATATATATATATAwAwAwBsBsBsBsBsATATATATBSATATATATAwAwAw BSBSBSBsATATATATATATATATATAwAwAwAwBsBsATATATATATATATATATATAwAwAw ATATATATATATATATATATATATATATAwAwAwAwATATATATATATATATATATATATATAT ATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATAT ATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATAT ATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATAT ATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATAT ATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATAT ATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATAT ATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATAT ATATATATATATATATATATATATATATATATATATATATATATATATATBSBSBSATATATAT ATATATATATATATATATATATATATATATATATATATATATATATBSBSBSBSBsBsATATAT ATATATATATATATATATATATATATATATATATATATATATATBSBSBSBSBSBsBsBsATAT BSBSBSATATATATATATATATATATATATATATATATATBSBSBSBSBSBSBSBsBsBsBSBS BSBSBsBsATATATATATATATATATATATATATATATATBSBSBSBSBSBSBSBsBsBsBSBS BSBSBsBsBsATATATATATATATATATATATATATATAwAwAwBSBSBSBSBSBsBsBsBSBS BSBSBsBsBsATATATATATATATATATATATATATATATAwAwAwBSBSBSBSBsBsBsBSBS BSBSBsBsBSBSATATATATATATATATATATATATATATAwAwAwAwBSBSBSBSBsBsBSBS BSBSBsBsBSBSAwAwAwAwATATATATATATATATATATATBSAwAwAwBSBSBSBsBsBSBS BSBSBsBsBSAwAwAwAwAwAwATATATATATATATATATATBSBSAwAwAwBSBSBsBsBSBS BSBSBsBsBSAwAwAwAwAwBSATATATATATATATATATATBSBSBSAwAwAwBSBSBsBSBS BSBSBsBsAwAwAwAwAwBSBSBSATATATATATATATATATBSBSBSBSAwAwBSBSBsBSBS BsBSBsAwAwAwAwBSBSBSBSBSATATATATATATATATATBsBSBSBSBSAwAwBSBsBSBS BsBSBsAwAwAwBSBSBSBSBSBSATATATATATATATATBsBsBsBSBSBSBSAwAwBsBSBS BsBS_AAwAwBSBSBSBSBSAwAwATATATATATATATATBsBsBsBsBsBSBSBSAw_ABSBS Bs_A_AAwBSBSBSBSAwAwAwATATATATATATATATATATBsBsBsBsBsBSBSBS_A_A_A _A_A_ABSBSBSAwAwAwAwATATATATATATATATATATATATBsBsBsBsBsBs_A_A_A_A } # tile 192 (sub mine walls 9) { _A_A_A_A_AAwAwAwAwAwATATATATATATATATATATATATBSBSBSBSBsBsBs_A_A_A _A_A_A_A_AAwAwAwAwAwAwATATATATATATATATATATATBSBSBSBSBSBs_A_A_A_A _A_A_A_ABsBsBsBSAwAwAwATATATATATATATATATATBSBSBSBSBSBSBS_A_A_A_A BSBSBSBsBsBsBsBSBSAwATATATATATATATATATATATBsBsBSBSBSBSBS_A_A_A_A BSBSBSBsBsBsATATATATATATATATATATATATATATATBsBsBsBsBSBSBS_A_A_A_A BSBSBSBsBsATATATATATATATATATATATATATATATBsBsBsBsBsBSBSBS_A_A_A_A BSBSBSBsATATATATATATATATATATATATATATATBSBSBsBsBsBsBsBSBSBS_A_A_A ATATATATATATATATATATATATATATATATATATATBSBSBsBsBsBsBsBsBSBS_A_A_A ATATATATATATATATATATATATATATATATATATATBSBSBSBsBsBsBsBsBsBS_A_A_A ATATATATATATATATATATATATATATATATATATATBSBSBSBSBsBsBsBsBsBsBs_A_A ATATATATATATATATATATATATATATATATATATATATAwBSBSBSBsBsBsBsBsBs_A_A ATATATATATATATATATATATATATATATATATATATATAwAwBSBSBSBSBsBsBs_A_A_A ATATATATATATATATATATATATATATATATATATATATATAwAwBSBSBSBSBsBs_A_A_A ATATATATATATATATATATATATATATATATATATATATATBSAwAwBSBSBS_A_A_A_A_A ATATATATAwAwBSBSBSATATATATATATATATATATATATBSBSAwAwBSBS_A_A_A_A_A ATATATAwAwAwBSBSBSBSBsATATATATATATATATATATBSBSBSAwAwBS_A_A_A_A_A ATATAwAwAwAwBSBSBSBSBsATATATATATATATATATBsBsBsBSBSAwAw_A_A_A_A_A ATAwAwAwAwAwBSBSBSBsBsATATATATATATATAwBSBSBsBsBsBSBSAw_A_A_A_A_A BSAwAwAwAwBSBSBSBSBsBsATATATATATATATAwBSBSBsBsBsBsBSBS_A_A_A_A_A BSAwAwAwAwBSBSBSBSBsBsBsATATATATATATAwAwBSBSBsBsBsBsBsBS_A_A_A_A BSAwAwAwAwBSBSBSBSBsBsBsATATATATATATAwAwBSBSBSBsBsBsBsBs_A_A_A_A BSAwAwAwAwBSBSBSBsBsBsBsATATATATATATAwAwAwBSBSBsBsBsBsBs_A_A_A_A BSAwAwAwAwBSBSBSBsBsBsBsATATATATATATATAwAwBSBSBSBsBsBsBs_A_A_A_A BSAwAwAwAwBSBSBSBsBsBsBsATATATATATATATAwAwBSBSBSBSBsBsBs_A_A_A_A BSAwAwAwBSBSBSBsBsBsBsBsATATATATATATATAwAwAwBSBSBSBSBs_A_A_A_A_A BSAwAwAwBSBSBSBsBsBsBSBSATATATATATATATAwAwAwAwBSBSBS_A_A_A_A_A_A BSAwAwAwBSBSBsBsBsBSBSATATATATATATATATATAwAwAwBSBS_A_A_A_A_A_A_A BsAwAwAwBSBSBsBsBSBSBSATATATATATATATATATAwAwAwAw_A_A_A_A_A_A_A_A BsBSAw_ABSBsBsBsBSBSBSATATATATATATATATATATBSAwAwAw_A_A_A_A_A_A_A BsBS_A_A_ABsBsBsBSBSATATATATATATATATATATATBSBSBSAwAwAw_A_A_A_A_A Bs_A_A_A_ABsBsBSBSBSATATATATATATATATATATATATBSBSBSAwAwAw_A_A_A_A _A_A_A_A_ABsBSBSBSBSATATATATATATATATATATATATBSBSBSBSBSAw_A_A_A_A } # tile 193 (sub mine walls 10) { _A_A_AAwAwAwAwBSBSBSATATATATATATATATATATATATBSBSBSBSBsBsBs_A_A_A _A_A_AAwAwBSBSBSBSAwAwATATATATATATATATATATATBSBSBSBSBSBs_A_A_A_A _A_AAwBSBSBSBSAwAwAwAwATATATATATATATATATATBSBSBSBSAwAwAw_A_A_A_A _A_ABSBSBSAwAwAwAwAwATATATATATATATATATATATBSAwAwAwAwAwAwAwAw_A_A _A_ABSAwAwAwAwAwBSATATATATATATATATATATATATATAwAwAwAwAwAwAwBSBSBS _A_AAwAwAwAwAwBSBSATATATATATATATATATATATATATAwAwAwAwAwAwBSBSBSBS _A_AAwAwAwBSBSBSBSATATATATATATATATATATATATATATAwAwAwAwBSBSBSBSBS _A_AAwBSBSBSBSBSBSATATATATATATATATATATATATATATATATATATATATATBSBS _A_ABSBSBSBSBSBSBSATATATATATATATATATATATATATATATATATATATATATATAT _ABSBSBSBSBSBSBsBsBsATATATATATATATATATATATATATATATATATATATATATAT _ABSBSBSBSBsBsBsBsBsBsATATATATATATATATATATATATATATATATATATATATAT _ABSBSBSBsBsBsBsBsBsBsATATATATATATATATATATATATATATATATATATATATAT _ABSBsBsBSBsBsBsBsBsBSATATATATATATATATATATATATATATATATATATATATAT _ABsBsBsBsBsBsBsBSBSBSATATATATATATATATATATATATATATATATATATATATAT _ABsBsBsBsBsBSBSBSBSAwATATATATATATATATATATATATATATATATATATATATAT _A_ABsBsBsBSBSBSAwAwAwATATATATATATATATATATATATATATBSBSBSATATATAT _A_ABsBSBSBSBSAwAwAwATATATATATATATATATATATATATBSBSBSBSBsBsATATAT _A_A_ABSBSAwAwAwAwATATATATATATATATATATATATATBSBSBSBSBSBsBsBsATAT _A_A_ABSAwAwAwAwAwATATATATATATATATATATATBSBSBSBSBSBSBSBsBsBsBSBS _A_A_AAwAwAwAwAwBSATATATATATATATATATATATBSBSBSBSBSBSBSBsBsBsBSBS _A_AAwAwAwAwBSBSATATATATATATATATATATATAwAwAwBSBSBSBSBSBsBsBsBSBS _A_AAwAwBSBSBSBSBSATATATATATATATATATATATAwAwAwBSBSBSBSBsBsBsBSBS _AAwBSBSBSBSBSBSBSATATATATATATATATATATATAwAwAwAwBSBSBSBSBsBsBSBS _ABSBSBSBSBSBSBsBsBsATATATATATATATATATATATBSAwAwAwBSBSBSBsBsBSBS _ABSBSBSBSBsBsBsBsBsBsATATATATATATATATATATBSBSAwAwAwBSBSBsBsBSBS _ABSBSBSBsBsBsBsBsBsBsATATATATATATATATATATBSBSBSAwAwAwBSBSBsBSBS _ABSBsBsBsBsBsBsBsBsBSBSATATATATATATATATATBSBSBSBSAwAwBSBSBsBSBS _A_ABsBsBsBsBsBsBSBSBSBSATATATATATATATATATBsBSBSBSBSAwAwBSBsBSBS _A_ABsBsBsBsBSBSBSBSBSBSATATATATATATATATBsBsBsBSBSBSBSAwAwBsBSBS _A_A_ABsBsBSBSBSBSBSAwAwATATATATATATATATBsBsBsBsBsBSBSBSAw_ABSBS _A_A_AAwBSBSBSBSAwAwAwATATATATATATATATATATBsBsBsBsBsBSBSBS_A_A_A _A_A_ABSBSBSAwAwAwAwATATATATATATATATATATATATBsBsBsBsBsBs_A_A_A_A } # tile 205 (sub knox walls 0) { ________________CVCVCPCPCPCPCPCPCPCPCPCPCPCPBk_A_A_A_A_A_A_A_A_A ________________CmCVCPBnCPCPCPCPCPCPCPBkCPCPBk_A_A_A_A_A_A_A_A_A ________________CmCPCPCJCPBnCJCPBnCPCPCPBkBkCP_A_A_A_A_A_A_A_A_A ________________CVCVCPCPCPCPCPCJCPCPCPCPCPCPBk_A_A_____A_A_A_A_A ________________CmCVCPCPCPCPCPBnCPCPCPCPCPCPBk_A_______A_A_A_A_A ________________CmCPBnCJCPBnCJCPCPCJBnCJCPBkBk_A_______A_A_A_A_A ________________CVCVCPCPCPCPCPCPCPCPCPCPCPCPBk_________A_A_A_A_A ________________CmCVCPBnCPCPCPCPCPCPCPBnCPCPBk_________A_A_A_A_A ________________CmCPCPCJCPBkCPBnCJCPCJCPBkBkCP_________A_A_A_A_A ________________CVCVCPCPCPCPCPCPCPCPCPCPCPCPBd_______A_A_A_A_A_A ________________CmCVCPCPCPCPCPCJCPCPCPCPCPCPBk_______A_A_A_A_A_A ________________CmCPCJCPBnCJCPBnCPBnCPBnCPBkBk_____A_A_A_A_A_A_A ________________CVCVCPBnCPCPCPCPCPCPCPCJCPCPBk_A_A_A_A_A_A_A_A_A ________________CmCVCPCJCPCPCPCPCPCPCPBnCPCPBk_A_A_A_A_A_A_A_A_A ________________CmCPCPBnCPCJBnCJCPCJCPCJCPBkBk_M_A_A_A_A_A_A_A_A ________________CVCVCPCPCPCPCPBnCPCPCPCPCPCPBk_A_A_A_A_A_A_A_A_A ________________CmCVCPCPCPCPCPCPCPCPCPCPCPBnCJ_A_A_A_A_A_A_A_A_A ________________CmCPBnCJCPCPBkCPCJBnCJBnCPBkBk_A_A_A_A_A_A_A_A_A ________________CVCVCPCPCPCPCPCPCPCPCPCPCPCPBk_A_A_A_A_A_A_A_A_A ________________CmCVCPBnCPCPCPCPCPCPCPBkCPCPBk_A_A_____A_A_A_A_A ________________CmCPCPCJCPBkCPCPBnCPCPCPCJBMCJ_M_______A_A_A_A_A ________________CVCVCPCPCPCPCPCJCPCPCPCPCPCPBk_A_______A_A_A_A_A ________________CmCVCPCPCPCPCPBnCPCPCPCPCPBnBk_________A_A_A_A_A ________________CmCPBkCPCPBkCPCPCJCPCJBnCPBkCJ_________A_A_A_A_A ________________CVCVCPCPCPCPCPCPCPCPCPCPCPCPBk_________A_A_A_A_A ________________CmCVCPBnCPCPCPCPCPCPCPBkCPCPBk_______A_A_A_A_A_A ________________CmCPCPCJCPBnCJBnCPBnCPCPCJBMCJ_______A_A_A_A_A_A ________________CVCVCPCPCPCPCPCJCPCPCPCPCPCPBk_____A_A_A_A_A_A_A ________________CmCVCPCPCPCPCPCPCPCPCPCPCPBnBk_A_A_A_A_A_A_A_A_A ________________CmCPCPBkCPCPBkCPBnCJCPBkCPBkCJ_A_A_A_A_A_A_A_A_A ________________CVCVCPCPCPCPCPCPCPCPCPCPCPCPBk_A_A_A_A_A_A_A_A_A ________________CmCVCPBnCPCPCPCPCPCPCPBkCPCPBk_A_A_A_A_A_A_A_A_A } # tile 206 (sub knox walls 1) { _A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A CPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCP CPCPCPCPCPCPCPBnCPCPCPCPCPCPCPBnCPCPCPCPCPCPCPBnCPCPCPCPCPCPCPBn CPBnCJCPCPBnCJCPCJBnCJCPCPBnCJCPCJBnCJCPCPBnCJCPCJBnCJCPCPBnCJCP CPCPCPBnCgCPCPCPCPCPCPBnCPCPCPCPCPCPCPBnCPCPCPCPCPCPCPBnCPCPCPCP CPCPCPCPCPCPCPCPCPCPCPCJCPCPCPCPCPCPCPCJCPCPCPCPCPCPCPCJCPCPCPCP CPCJBnCJBnCPCPBkCPCPBnCPCPCJBnCPCPBnCPCPBkCPCPBkCPCPBnCPCPCJBnCP CPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCJCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCP CPCPCPCPCPCPCPBkCPCPCPCPCPCPCPBnCPCPCPCPCPCPCPCJCPCPCPCPCPCPCPCJ CPBnCJCPBnCJCPBkCPBnCJCPBkCPCPBkCJCPCJCPBkCPCPBkBnCPBkCPCJBnCPBk CPCJBnCPCJBnCPBkCPCJBnCPCPBkCPBkCPBnCPBnCPCJBnCJCPCJCPBnCPCJBnCJ BkBnCJBkBnBkBkCJBkBnCJBkBkBkBkCPBkBkBkCJBkBnBkBkBkBnBkCJBkBnBkBk CPCJBnCJCPCPCPBnCPCJBnCPCPCPCPBkCPCPCPBkCPCJCPCPCPCJCPBMCPCJCPCP BnCPCPBMCJBnCJCPBkCPCPBkBkCPBkCPCPBkCPBkCPBnCPBnCJBnCPBkCPCPBnCP BkBdBdBdBD_A_A_A_A_A_ACPCVCPCPBkBkBkBdBdBD_A_A_A_A_A_ACPCPCPBkBk CPBkBdBdBD_A_A_A_A_A_ACPCPCPBkCPCPBkBdBdBD_A_A_A_A_A_ACPCPCPCPCP CPBkBkBdBD_A_A_A_A_A_ACPCPCPCPCPBkBkBkBdBD_A_A_A_A_A_ACPCPCPCJBn CPBkBkBdBD_A_A_A_A_A_ACPCPCPCPBkCPCPBkBdBD_A_A_A_A_A_ACPCPCPBnCP CPBkCJBdBD_A_A_A_A_A_ACPCPCPCPCPBkBkBkBkBD_A_A_A_A_A_ACPCPCPCJCP CPBkBnBdBD_A_A_A_A_A_ABkCPCPCPBkCPCPBkBdBD_A_A_A_A_A_ABkCPCPBnCP CPBkCJBD_A_A_A_A_A_A_A_ABkCPCPCPBkBkCPBD_A_A_A_A_A_A_A_ABkCPCPCJ BkBDBDBD_A_A_A_A_A_A_A_ACVBkBkBkBkBDBDBD_A_A_A_A_A_A_A_zCVBkBkBk BkBkBdBD_A_A_A_A_A_A_A__CPCPCPBkBnBkBdBD_A_A_A_A_A_A_A__CPCPCPBk BnBkBdBD_A_A_A_A_A_A____CPCPCPBkCJBkBdBJ_A_A_A_A_A_A____CPCPCPBk BkBkBdAlAl_A_A_A_A____BkCPCPCPBkBnBkBdAlAl_A_A_A_A____BkCPCPCPBk CJBkBkAlBJ_A_A_A______CVBkCPBnCJBkBkBkAlBD_A_A_A______CVBkCPCPBk BkBDBDAjAl_B_A________CPCPCJBkBkBkBDBDAlBJ_A_A________CPCPBkBkBk BkBkBkBDBJ_A__________CPCPCPCPBnBkBkBkBJAj_A__________CPCPCPCPBk BkBkBkAl_A______________CPCPCJBkCKBkBkAj_z______________CPCPCPBk CPBkBk_A__________________CPCPBkBmBkBk_A__________________CPCPBk } # tile 207 (sub knox walls 2) { _________________________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A _______________________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A _____________________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A ________________CVCVCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCP ________________CmCVCPCPCPCPCPBnCPCPCPCPCPCPCPBnCPCPCPCPCPCPCPBn ________________CmCPCJCPCPBnCJCPCJBnCJCPCPBnCJCPCJBnCJCPCPBnCJCP ________________CVCVCPBnCPCPCPCPCPCPCPBnCPCPCPCPCPCPCPBnCPCPCPCP ________________CmCVCPCJCPCPCPCPCPCPCPCJCPCPCPCPCPCPCPCJCPCPCPCP ________________CmCPCPBnCPCJBnCPCPBnCPCPBkCPCPBkCPCPBnCPCPCJBnCP ________________CVCVCPCPCPCPCPCJCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCP ________________CmCVCPCPCPCPCPBnCPCPCPCPCPCPCPCJCPCPCPCPCPCPCPCJ ________________CmCPBnCPCJBnCPCJCPCJBnCJCPBkBkBkBnCPBkCPCJBnCPBk ________________CVCVCPCJCPCPCPCPCPCPCPCPCPCPBkBkBkCPCPBkCPCPBkCP ________________CmCVCPBnCPCPCPCPCPCPCPBnCPCPBkBdBdBdBkCPBkBkBkBk ________________CmCPCPCJCPBnCPBkCPCPCJCPBkBkCPBkBkBkBkBkCPCPCPCP ________________CVCVCPCPCPCPCPCPCPCPCPCPCPCPBdBkBkBkBkBkBkCPBkCP ________________CmCVCPCPCPCPCPCJCPCPCPCPCPCPBk_A_A_A_ABkBkCPBkBk ________________CmCPCJCPBnCJCPBnCPBnCJBnCPBkBk_A_A_A_ABkBkCPCPCP ________________CVCVCPBnCPCPCPCPCPCPCPCPCPCPBk_A_A_A_ABkBkCPCPBk ________________CmCVCPCJCPCPCPCPCPCPCPBkCPCPBk_A_A_A_ABkBkCPCPCP ________________CmCPCPBnCPCJBnCJCPCPCPCPCJBkBn_z_A_A_ABkBkBkBkCP ________________CVCVCPCPCPCPCPBnCPCPCPCPCPCPBk_A_A_A_ABdBkBkCPCP ________________CmCVCPCPCPCPCPCPCPCPCPCPCPBnBk_z_A_A_A_ABdBkBkCP ________________CmCPCPBnCJCPCPBkCPBkCPBkCPCJBk_A_A_A_A_ABkBdBkBk ________________CVCVCPCJCPCPCPCPCPCPCPCPCPBnBk_z_A_A_A_ABkBkCPBk ________________CmCVCPBnCPCPCPCPCPCPCPCJCPCPBk_A_A_A_A_ABkBkCPBk ________________CmCPCPCJCPBnCJCPBnCPBnCPBnCJBk_M_A_A_ABdBkBkBkBk ________________CVCVCPCPCPCPCPBnCgCPCPCPCPCPBk_A_A_A_ABkBdBkCPBk ________________CmCVCPCPCPCPCPCPCPCPCPCPCPCJBM_z_A_A_ABkBkBdBdBk ________________CmCPCPCJBnCPCJBnCJBnCJCPBkCPBk_A_A_A_ABkBkBkBkBk ________________CVCVCPBnCPCPCPCPCPCPCPCPCPCPBk_A_A_A_A_ABkBkBkBk ________________CmCVCPCPCPCPCPCPCPCPCPBkCPCPBk_A_A_A_A_A_ABkBkBk } # tile 208 (sub knox walls 3) { _A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A CPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPBk_A_A_A_A_A_A_A_A_A CPCPCPCPCPCPCPBnCPCPCPCPCPCPCPBnCPCPCPCPCPBnBk_z_A_A_A_A_A_A_A_A CPBnCJCPCPBnCJCPCJBnCJCPCPBnCJCPCJCPCJBnCPCJBk_A_A_____A_A_A_A_A CPCPCPBnCgCPCPCPCPCPCPBnCPCPCPCPCPCPCPCPCPBnBk_z_______A_A_A_A_A CPCPCPCPCPCPCPCPCPCPCPCJCPCPCPCPCPCPCPCJCPCPBk_________A_A_A_A_A CPCJBnCJBnCPCPBkCPCPBnCPCPBkCPBnCPBnCPBnCJBkCP_________A_A_A_A_A CPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCJCPCPCPCPCPCPBk_______A_A_A_A_A_A CPCPCPCPCPCPCPBkCPCPCPCPCPCPCPCPCPCPCPCPCPBnBk_______A_A_A_A_A_A CJCPBnCPCJBnCPCJCmCPBkCPCJCPBnCJBnCJBnCJCPBkCJ_____A_A_A_A_A_A_A CPBkCPCJBnCPCJBnCVCVCPCPCPCPCPCPCPCPCPCPCPCPBk_A_A_A_A_A_A_A_A_A BMCJBkBnCJBkBkBkCmCVCPBnCPCPCPCPCPCPCPBkCPCPBk_A_A_A_A_A_A_A_A_A CPCPBnCJBnCPCPCPCmCPCPCJCPBkCPCPCPCPCPCPBnBkBk_z_A_A_A_A_A_A_A_A BnCJCPBMCJCPBkCPCVCVCPCPCPCPCPBkCPCPCPCPCPCPBk_A_A_A_A_A_A_A_A_A BkBkBnCJBd_A_A_ACmCVCPCPCPCPCPCPCPCPCPCPCPCJBn_A_A_A_A_A_A_A_A_A CPBnCJBkBd_A_A_ACmCPCPBkCPCPBnCJBnCJBnCJCPBkBk_A_A_A_A_A_A_A_A_A CPBkBkBnBd_A_A_ACVCVCPCPCPCPCPCPCPCPCPCPCPCPBk_A_A_A_A_A_A_A_A_A BnCJBnCJBd_A_A_ACmCVCPBkCPCPCPCPCPCPCPBkCPCPBk_A_A_____A_A_A_A_A CPBkBkBkBk_A_A_ACmCPCPCPCPBkCPCPCJBnCPCPCPBkBk_M_______A_A_A_A_A CPBkCPBkBD_A_A_ACVCVCPCPCPCPCPBnCPCPCPCPCPCPBk_A_______A_A_A_A_A CPBkBkBd_A_A_A_ACmCVCPCPCPCPCPCJCPCPCPCPCPBkCP_________A_A_A_A_A BkBDBDBd_A_A_A_ACmCPCPCJBnCJCPBnCPCPBnCJCPBkBk_________A_A_A_A_A BkBkBkBd_A_A_A_ACVCVCPBnCPCPCPCPCPCPCPCPCPCPBk_________A_A_A_A_A CPBkBkBd_A_A_A_ACmCVCPCPCPCPCPCPCPCPCPBkCPCPBk_______A_A_A_A_A_A BkBkBkBdBD_A_A_ACmCPCPBkCPCJCPBkCPCJCPCPBnBkCJ_______A_A_A_A_A_A BkBkBkBDBd_A_A_ACVCVCPCPCPCPCPCPCPCPCPCPCPCPBk_____A_A_A_A_A_A_A BkBDBDBdBd_A_A__CmCVCPCPCPCPCPBnCPCPCPCPCPCJBM_z_A_A_A_A_A_A_A_A BkBkBkBdBd_A____CmCPBnCJCPBnCJCPBkCPCPBkCPBnBk_A_A_A_A_A_A_A_A_A BkBkBkBd_A______CVCVCPCPCPCPCPCPCPCPCPCPCPCJBk_M_A_A_A_A_A_A_A_A CPBkBk_A________CmCVCPBnCPCPCPCPCPCPCPBnCPCPBk_A_A_A_A_A_A_A_A_A } # tile 209 (sub knox walls 4) { ________________CmCPCPCPBkCPCPBmCKCPCPBmCKBmBk_z_A_A_A_A_A_A_A_A ________________CVCVCPCPCPCPCPCPCPCPCPCPCPCPBk_A_A_A_A_A_A_A_A_A ________________CmCVCPCPCPCPCPBkCPCPCPCPCPCKBk_M_A_A_A_A_A_A_A_A ________________CmCPBmCKCPBmCKCPCPCPCPBkCPCPCPCPCPCPCPCPCPCPCPCP ________________CVCVCPCPCPCPCPBmCPCPCPCPCPCPCPCOCPCPCPCPCPCPCPBn ________________CmCVCPCKCPBmCKCPCKBnCJBnCPCOBlCPBlCPBkCPCPBnCJCP ________________CmCPCPBmCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCP ________________CVCVCPCPCPCPCPCPCPCPCPCJCPCPCPCPCPCPCPCJCPCPCPCP ________________CmCVCPBkCPCKBmCPCOBlCPBnCPCJBnCPCOBnCPBnCJCPBnCJ ________________CmCPCPCPCPCPCPCKCPCPCPCPCPCPCPCKCPCPCPCPCPCPCPCP ________________CVCVCPCPCPCPCPBnCPCPCPCPCPCPCPBmCPCPCPCPCPCPCPCP ________________CmCVCPCKBmCPCPBkCOCKCOCPBkCPCPBkCKBnCJCPCPBkCPBk ________________CmCPBmCPCKBmCKBmCKBnCPBlCOCPBkCPCOCPBlCOBlCPCPBk ________________CVCmBkBxBmBkBkCKBmBkBkBmCJBMCJBlBkBkBkBlCOBkBkBk ________________CVCPCPBkCPCPCPBmCKCPCPBkCPCPBnCOCPCPCPBkCPCPCPCP ________________CVBmCKBmCKBmCKCPBnCJCPBkCKBnCJCPBlCOBlCOBkCPBkCP ______________________CPCPCPBkBkCJBnBkBmBd_A_A_A_A_A_ACPCPCPBkBk ______________________CPCPCPCPCPBnCJBkCKBd_A_A_A_A_A_ACPCPCPCPCP ______________________CPCPCPCPBkCPBkBnBkBd_A_A_A_A_A_ACPCPCPCPBk ______________________CPCPCPBkCPCPCJBmCJBd_A_A_A_A_A_ACPCPCPBnCP ______________________CPCPCPCPCPBkBlBkBnBd_A_A_A_A_A_ACPCPCPCJCP ______________________BkCPCPCKBmCPCKBmCJBD_A_A_A_A_A_ABkCPCPBnCP ________________________BmCPCPCKBmBkCKBD_A_A_A_A_A_A_A_ABkCPCPCJ ________________________CVBkBkBkBkBDBDBd_A_A_A_A_A_A_A_zCVBkBkBk ________________________CPCPCPBkCOBkBkBd_A_A_A_A_A_A_A__CPCPCPBk ________________________CPCPCPBkBlBkBkBd_A_A_A_A_A_A____CPCPCPBk ______________________BkCPCPCPBkCOBkBkBdBD_A_A_A_A____BkCPCPCPBk ______________________CVBkCPCOBlBkBkBkBDBd_A_A_A______CVBkCPCPBk ______________________CPCPBlBkBkBkBDBDBdBd_A_A________CPCPBkBkBk ______________________CPCPCPCOCPBkBkBkBdBd_A__________CPCPCPCPBk ________________________CPCPBnBkBkBkBkBd_A______________CPCPCPBk __________________________CPCPBkCPBkBk_A__________________CPCPBk } # tile 210 (sub knox walls 5) { _A_A_A_A_A_A_A_ACmCPCPCPBkCPCPBnCJCPCPBnCJBnBk_z_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_ACVCVCPCPCPCPCPCPCPCPCPCPCPCPBk_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_ACmCVCPCPCPCPCPBkCPCPCPCPCPCJBk_M_A_A_A_A_A_A_A_A CPCPCPCPCPCPCPCPCPCPBkCPCPBkCPCPCPCPCJBnCPCPCP_A_A_A_A_A_A_A_A_A CPCPCPCPCPCPCPBkCPCPCPCPCPCPCPBkCPCPCPCPCPCPCP_A_A_A_A_A_A_A_A_A CPCJBnCPCPBkCPCPCPCPBkCPCPBkCPCPCPCJBnCPCJBnCP_A_A_A_A_A_A_A_A_A CPCPCPCJCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCP_A_A_A_A_A_A_A_A_A CPCPCPBnCPCPCPCPCPCPCPBkCPCPCPCPCPCPCPBkCPCPCP_A_A_A_A_A_A_A_A_A CPCPCJCPCPBnCJCPBnCJCPCPCPBkCPBnCJCPBnCPCPCJBn_z_A_A_A_A_A_A_A_A CPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCP_A_A_____A_A_A_A_A CPCPCPCPCPCPCPBkCPCPCPCPCPCPCPCJCPCPCPCPCPCPCP_A_______A_A_A_A_A BnCPBkCPBnCJCPBkCPCPBnCPBkCPCPBMCPBkCPCPBkCPCP_A_______A_A_A_A_A CPCJCPBnCJCPBnCJBnCJCPCJCPBnCJBkCPCPBkCPCPBkCP_________A_A_A_A_A BkBMBkCJBnBkCJBMCJBkBkBnBkBkCJBnBkBkCPBkBMCJBk_________A_A_A_A_A CPCPCPBkCPCPBnCPCPCPCPBkCPCPBnCJCPCPBkCPCPCPBn_________A_A_A_A_A CPBkCPBkCPBkCPCJBnCJBnCJBnCJCPCPBkCPCPBkBnCJCP_______A_A_A_A_A_A BkCJBMCJBd_A_A_A_A_A_ACPCPCPBkBkCPBkBkCJBd___________A_A_A_A_A_A CPBkCPBMBd_A_A_A_A_A_ACPCPCPCPCPBnCJBnBkBd_________A_A_A_A_A_A_A CPBkBkCJBd_A_A_A_A_A_ACPCPCPCPBkCPBkBkCPBd_______A_A_A_A_A_A_A_A BkCPBkBnBd_A_A_A_A_A_ACPCPCPBnCPCJBnCJBkBd_A_A_A_A_A_A_A_A_A_A_A CPBkCJBkBd_A_A_A_A_A_ACPCPCPCJCPBnCJBMCPBD_A_A_A_A_A_A_A_A_A_A_A CJBnBkBnBD_A_A_A_A_A_ABkCPCPBnCPBkCPBkBkBD_A_A_A_A_A_A_A_A_A_A_A CPBkCJBD_A_A_A_A_A_A_A_ABkCPCPCJCPBkBkBd_A_A_A_A_A_A_A_A_A_A_A_A BkBDBDBd_A_A_A_A_A_A_A_ACVCJBkBkBkBDBdBd_A_A_A_A_A_A_A_A_A_A_A_A BkBkBkBd_A_A_A_A_A_A_A__CPCPCPBkBkBkBkBd_A_A_A_A_A_A_A_A_A_A_A_A BnBkBkBd_A_A_A_A_A_A____CPCPBnCJBnBkBkBd_A_A_A_A_A_A_____A_A_A_A BkBkBkBdBD_A_A_A_A____BkCPCPCPBkBkBkBkBdBD_A_A_A_A_______A_A_A__ CJBkBkBDBd_A_A_A______CVBkCPCPBkCPBkBkBDBd_A_A_A_________A_A____ BkBDBDBdBd_A_A________CPCPBkBkBkBkBDBDBdBd_A_A___________A______ BkBkBkBdBd_A__________CPCPCPCPBkBkBkBkBdBd_A____________________ BkBkBkBd_A______________CPCPCPBkCPBkBkBd_A______________________ CPBkBk_A__________________CPCPBkBkBkBk_A________________________ } # tile 211 (sub knox walls 6) { _A_A_A_A_A_A_A_ACmCPCPCPBkCPCPCPBkCPCPBnCJBnBk_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_ACVCVCPCPCPCPCPCPCPCPCPCPCPCPBk_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_ACmCVCPCPCPCPCPBkCPCPCPCPCPCJBk_M_A_A_A_A_A_A_A_A CPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCP CPCPCPCPCPCPCPBnCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPBn CKCPBmCPCKBnCOCKCOCKCPBkCPCPBkCPBkCPCJBnCPCPBkCPBkCPBkCPCPBnCJCP CPCPCPCKCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCP CPCPCPBmCPCPCPCPCPCPCPBmCPCPCPCPCPCPCPBkCPCPCPCPCPCPCPCJCPCPCPCP CPCPCKCPCOBnCKBmCPBlCPCKCPBmCKCPBnCPCPCPCPBkCPCPCPBnCPBnCJCPBnCJ CPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCJCPCPCPCPCPCPCPBkCPCPCPCPCPCPCPCP CPCPCPCPCPCPCPCJCPCPCPCPCPCPCPBnCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCP COBnCJBnCOBlCPBmCmCPBkCPCOBnCKCOCPCJBnCJCPBkBkBkCJCPBkCPCPBkCPBk CPCKCPCPCKCOBnBxCVCVCVCPCPCPCPCPCPCPCPCPCPCPBkBkBkCPCPBkCPCPCJBM BkBmBkBkBkBlCJBmCmCVCPBkCPCPCPCPCPCPCPBmCPCPBkBdBdBdBMCJBkBkBnBk CPCKCPBmCPCOBnCKCmCPCPCPCPBkCPBnCKCPCKCPBlBkBmBkBkBkBkBnCPCPCJCP BlCOBnCJBlCPCJCPCVCVCPCPCPCPCPCOCPCPCPCPCPCPBxBkBkBkBkBwBnCJBnCP BkBkCKBmBd_A_A_ACmCVCPCPCPCPCPCKCPCPCPCPCPCOBk_A_A_A_ABkBkCPBkBk CPCPBkBkBd_A_A_ACmCPBnCKCOBlCPBmCPBmCPBmCPBkBl_A_A_A_ABkBkCPCPCP CPBkBkCPBd_A_A_ACVCVCPCOCPCPCPCPCPCPCPCKCPCPBk_A_A_A_ABkBkCPCPBk BmCKBmBkBd_A_A_ACmCVCPBnCPCPCPCPCPCPCPBmCPCPBk_A_A_A_ABkBkCPCJCP CPBkBkCKBd_A_A_ACmCPCKCOCKBnCKCOCKBnCKCPCJBMCJ_M_A_A_ABkBkBkBnCP CKBmCKBmBD_A_A_ACVCVCPCPCPCPCPBnCPCPCPCPCPCPBk_A_A_A_ABdBkBkCJCP CPBkBkBD_A_A_A_ACmCVCPCPCPCPCPCOCPCPCPCPCPBnBk_z_A_A_A_ABdBkBnCP BkBDBdBd_A_A_A_ACmCPCJCPBnCOCPCKBnCKCOBnCPCJBk_A_A_A_A_ABkBdBkBk BkBkBkBd_A_A_A_ACVCVCPBnCgCPCPCPCPCPCPCKCPBnBk_z_A_A_A_ABkBkCPBk BkBkBkBd_A_A_A_ACmCVCPCPCPCPCPCPCPCPCPCOCPCPBk_A_A_A_A_ABkBdCPBk BkBkBkBdBD_A_A_ACmCPCPBkCPBnCJBnCOCPBlCPBkCJBn_z_A_A_ABdBkBkBkCJ CPBkBkBDBd_A_A_ACVCVCPCPCPCPCPCKCPCPCPCPCPCPBk_A_A_A_ABkBdBkBkBn BkBDBDBdBd_A_A__CmCVCPCPCPCPCPCPCPCPCPCPCPCPBk_A_A_A_ABkBkBdBkBk BkBkBkBdBd_A____CmCPCPBlCOCPBlCOBnCJCPBmCPBkBk_A_A_A_ABkBkBkBkBk BkBkBkBd_A______CVCVCPCOCPCPCPCPCPCPCPCKCPCPBk_A_A_A_A_ABkBkBkBk CPBkBk_A________CmCVCPBnCPCPCPCPCPCPCPBnCPCPBk_A_A_A_A_A_ABkBkBk } # tile 212 (sub knox walls 7) { _A_A_A_A_A_A_A_ACmCPCPCPBkCPCPCPBkCPCPCPBkCPBk_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_ACVCVCPCPCPCPCPCPCPCPCPCPCPCPBk_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_ACmCVCPCPCPCPCPBkCPCPCPCPCPBkBk_M_A_A_A_A_A_A_A_A CPCPCPCPCPCPCPCPCPCPCPBkCPCPBkCPCPCPCPBkCPCVCPCPCPCPCPCPCPCPCPCP CPCPCPCPCPCPCPBkCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPBn COCKBnCPCOBlCPCPCPCJBnCPCJBnCPBkCPBkCPBkCPCPBkCPBkCPBkCPCPBnCJCP CPCPCPCJCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCP CPCPCPBnCPCPCPCPCPCPCPBkCPCPCPCPCPCPCPBkCPCPCPCPCPCPCPCJCPCPCPCP CPCPCJCPCPBmCKBnCOCKBnCPCPCJBnCPCJCPCPCPCPBkCPCPCPBnCPBnCJCPBnCJ CPCPCPCPCPCPCPCPCPCPCPCPCPCPCPBnCPCPCPCPCPCPCPBkCPCPCPCPCPCPCPCP CPCPCPCPCPCPCPCJCPCPCPCPCPCPCPCJCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCP CPBkCPBnCJBnCPBkCPBnCOCPBkCPCPBkBnCJBnCPBkCPCPBkCPCJBnCJCPBkCPBk CPCPBkCPCPCJBnBkCPCJBnCKCPBmCKBmCPCPCJCPCPBkCPBkCPBnCPCPBnCPCJBM BkBkCKBkBkBmBlCJBkBnCJBkBMCJBkCKBkBkBMBkBkCPBkBkBkCJBkBkBkBkCPBk CPCPBmCKCPCPCOBnCPCKBnCOCPCPBnCOCPCPCPBkCPBnCPCPCPBnCPCJCPCPBkCP COBlCPBmCJBnCKCOBlCOCPBkBnCJCPBlCPBkCPBkCPCJCPCJBnCJCPBkCPBkCPCP BkCJBkBlBd_A_A_A_A_A_ACPCPCPBkCOBkBlCOBkBd_A_A_A_A_A_ACPCPCPBkBk CPBnCJBmBd_A_A_A_A_A_ACPCPCPCPBlCPCOBkBlBd_A_A_A_A_A_ACPCPCPCPCP CPBkBkCKBd_A_A_A_A_A_ACPCPCPCPCOBlBkCPBkBd_A_A_A_A_A_ACPCPCPCPBk BlCOBlBmBd_A_A_A_A_A_ACPCPCPCPBlCOCPBkBkBd_A_A_A_A_A_ACPCPCPBnCP CPBkBkCJBd_A_A_A_A_A_ACPCPCPCOCPBlBkCOBlBj_A_A_A_A_A_ACPCPCPCJCP CJBnCJBnBD_A_A_A_A_A_ABkCPCPCPBkCPCOBlBkBD_A_A_A_A_A_ABkCPCPBnCP CPBkBkBD_A_A_A_A_A_A_A_ABkCPCPBnCKBkBmBd_A_A_A_A_A_A_A_ABkCPCPCJ BkBDBdBd_A_A_A_A_A_A_A_ACVBkBkBkBkBDBDBd_A_A_A_A_A_A_A_zCVBkBkBk BkBkBkBd_A_A_A_A_A_A_A__CPCPCPBkCJBkBkBd_A_A_A_A_A_A_A__CPCPCPBk BkBkBkBd_A_A_A_A_A_A____CPCPCPBkBnBkBkBd_A_A_A_A_A_A____CPCPCPBk BkBkBkBdBD_A_A_A_A____BkCPCPCPBkCJBkBkBdBD_A_A_A_A____BkCPCPCPBk CPBkBkBDBd_A_A_A______CVBkCPBnCJBMBkBkBDBd_A_A_A______CVBkCPCPBk BkBDBDBdBd_A_A________CPCPCJBkBkBkBDBDBdBd_A_A________CPCPBkBkBk BkBkBkBdBd_A__________CPCPCPBnCPBkBkBkBdBd_A__________CPCPCPCPBk BkBkBkBd_A______________CPCPCPBkBkBkBkBd_A______________CPCPCPBk CPBkBk_A__________________CPCPBkCPBkBk_A__________________CPCPBk } # tile 213 (sub knox walls 8) { _A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A CPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCP CPCPCPCPCPCPCPBnCPCPCPCPCPCPCPBnCPCPCPCPCPCPCPBnCPCPCPCPCPCPCPBn CPBnCJCPCPBnCJCPCJBnCJCPCPBnCJCPCJBnCJCPCPBnCJCPCJBnCJCPCPBnCJCP CPCPCPBnCgCPCPCPCPCPCPBnCPCPCPCPCPCPCPBnCPCPCPCPCPCPCPBnCPCPCPCP CPCPCPCPCPCPCPCPCPCPCPCJCPCPCPCPCPCPCPCJCPCPCPCPCPCPCPCJCPCPCPCP CPCJBnCJBnCPCPBkCPCPBnCPCPCJBnCPCPBnCPCPBkCPCPBkCPCPBnCPCPCJBnCP CPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCJCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCP CPCPCPCPCPCPCPBkCPCPCPCPCPCPCPBnCPCPCPCPCPCPCPCJCPCPCPCPCPCPCPCJ CJCPBnCPCJBnCPCJCmCPBkCPCJBnCPCJCPCJBnCJCPBkBkBkBnCPBkCPCJBnCPBk CPBkCPCJBnCPCJBnCVCVCPCPCPCPCPCPCPCPCPCPCPCPBkBkBkCPCPBkCPCPBkCP BMCJBkBnCJBkBkBkCmCVCPBnCPCPCPCPCPCPCPBnCPCPBkBdBdBdBkCPBkBkBkBk CPCPBnCJBnCPCPCPCmCPCPCJCPBkCPBnCPCJCPCJBnBkCJBkBkBkBkBkCPCPCPCP BnCJCPBMCJCPBkCPCVCVCPCPCPCPCPCJCPCPCPCPCPCPBkBkBkBkBkBkBkCPBkCP BkBkBnCJBd_A_A_ACmCVCPCPCPCPCPCPCPCPCPCPCPCPBk_A_A_A_ABkBkCPBkBk CPBnCJBkBd_A_A_ACmCPBnCJBnCPCPBkCPBnCJBnCPBkBk_A_A_A_ABkBkCPCPCP CPBkBkBnBd_A_A_ACVCVCPCPCPCPCPCPCPCPCPCPCPCPBk_A_A_A_ABkBkCPCPBk BnCJBnCJBd_A_A_ACmCVCPCJCPCPCPCPCPCPCPBkCPCPBk_A_A_A_ABkBkCPCPCP CPBkBkBkBk_A_A_ACmCPCPBnCPBkCPCPBkCPCPCPCJBMCJ_M_A_A_ABkBkBkBkCP CPBkCPBkBD_A_A_ACVCVCPCPCPCPCPCPCPCPCPCPCPCPBk_A_A_A_ABdBkBkCPCP CPBkBkBd_A_A_A_ACmCVCPCPCPCPCPBkCPCPCPCPCPBnBk_A_A_A_A_ABdBkBkCP BkBDBDBd_A_A_A_ACmCPBnCJCPBkCPCPCPCPCJBnCPBkCJ_A_A_A_A_ABkBdBkBk BkBkBkBd_A_A_A_ACVCVCPCPCPCPCPCPCPCPCPCPCPCPBk_A_A_A_A_ABkBkCPBk CPBkBkBd_A_A_A_ACmCVCPCPCPCPCPCPCPCPCPBkCPCPBk_A_A_A_A_ABkBkCPBk BkBkBkBdBD_A_A_ACmCPCPBkCPBnCJBnCJBnCPCPCJBMCJ_M_A_A_ABdBkBkBkBk BkBkBkBDBd_A_A_ACVCVCPCPCPCPCPCPCPCPCPCPCPCPBk_A_A_A_ABkBdBkCPBk BkBDBDBdBd_A_A__CmCVCPCPCPCPCPCPCPCPCPCPCPBnBk_A_A_A_ABkBkBdBdBk BkBkBkBdBd_A____CmCPCPBkCPCPBkCPBkCPCJBnCPBkCJ_A_A_A_ABkBkBkBkBk BkBkBkBd_A______CVCVCPCPCPCPCPCPCPCPCPCPCPCPBk_A_A_A_A_ABkBkBkBk CPBkBk_A________CmCVCPCJCPCPCPCPCPCPCPBkCPCPBk_A_A_A_A_A_ABkBkBk } # tile 214 (sub knox walls 9) { _A_A_A_A_A_A_A_ACVCVCPCPCPCPCPCPCPCPCPCPCPCPBk_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_ACmCVCPBnCPCPCPCPCPCPCPBkCPCPBk_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_ACmCPCPCJCPBnCJCPCPBnCPCPCJBMCJ_M_A_A_A_A_A_A_A_A CPCPCPCPCPCPCPCPCPCPCPCPCPCPCVBkCPCPCPCPCPCPBk_A_A_A_A_A_A_A_A_A CPCPCPCPCPCPCPBnCPCPCPCPCPCPCPCPCPCPCPCPCPBnBk_A_A_A_A_A_A_A_A_A CPBnCJCPCPBnCJCPCJBnCJCPBkCPCPBkCPCJBnCJCPBkCJ_A_A_____A_A_A_A_A CPCPCPBnCgCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPBk_A_______A_A_A_A_A CPCPCPCPCPCPCPCPCPCPCPBnCPCPCPCPCPCPCPBnCPCPBk_________A_A_A_A_A CPCJBnCJBnCPCJBnCPCJCPCJCPBnCJCPBnCJCPCJBnBkBk_________A_A_A_A_A CPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPBk_______A_A_A_A_A_A CPCPCPCPCPCPCPBnCPCPCPCPCPCPCPBkCPCPCPCPCPCPBk_______A_A_A_A_A_A CPBkCPCPBnCJCPBkCmCPCJBnCPBkCPCPCPCJBnCPCPBkBk_____A_A_A_A_A_A_A CPCPBkCPCJBnCPBkCVCVCPCPCPCPCPCPCPCPCPCJCPCPBk_A_A_A_A_A_A_A_A_A BkBMCJBkBnBkCJBkCmCVCPCPCPCPCPCPCPCPCPBnCPCPBk_A_A_A_A_A_A_A_A_A CPCPCPBkCPCPBnCPCmCPCPBkCPBnCJBnCPCJCPCPBkBkCP_A_A_A_A_A_A_A_A_A BkCPBkCPBkCPCJCPCVCVCPCPCPCPCPCPCPCPCPCPCPCPBk_A_A_A_A_A_A_A_A_A BkCPBkBkBd_A_A_ACmCVCPCPCPCPCPCJCPCPCPCPCPCPBk_A_A_A_A_A_A_A_A_A CPBkCJBnBd_A_A_ACmCPCJCPBnCJCPBnCPBnCJBnCPBkBk_A_A_A_A_A_A_A_A_A CPBkBnCJBd_A_A_ACVCVCPBnCgCPCPCPCPCPCPCPCPCPBk_A_A_A_A_A_A_A_A_A BnCJBkBkBd_A_A_ACmCVCPCPCPCPCPCPCPCPCPBkCPCPBk_A_A_____A_A_A_A_A CPBkBnCJBd_A_A_ACmCPCPBkCPBnCJCPBnCJCPCPCPBkBk_M_______A_A_A_A_A CPBkCPBkBD_A_A_ACVCVCPCPCPCPCPCPCPCPCPCPCPCPBk_A_______A_A_A_A_A CPBkBkBd_A_A_A_ACmCVCPCPCPCPCPBkCPCPCPCPCPBkCP_________A_A_A_A_A BkBDBDBd_A_A_A_ACmCVBkCPCPBkCPCPCPCPCJBnCPBkBk_________A_A_A_A_A BkBkBkBd_A_A_A_ACVCVCPCPCPCPCPCPCPCPCPCPCPCPBk_________A_A_A_A_A BnBkBkBd_A_A_A_ACmCVCPBkCPCPCPCPCPCPCPBkCPCPBk_______A_A_A_A_A_A BkBkBkBdBD_A_A_ACmCPCPCPCPBkCPBkCPBnCPCPCJBkBn_______A_A_A_A_A_A CJBkBkBDBd_A_A_ACVCVCPCPCPCPCPCPCPCPCPCPCPCPBk_____A_A_A_A_A_A_A BkBDBDBdBd_A_A__CmCVCPCPCPCPCPCPCPCPCPCPCPBnCJ_A_A_A_A_A_A_A_A_A BkBkBkBdBd_A____CmCPCPBnCJCPBnCJBnCJBnCJCPBkBk_A_A_A_A_A_A_A_A_A BkBkBkBd_A______CVCVCPCJCPCPCPCPCPCPCPCPCPCPBk_A_A_A_A_A_A_A_A_A CPBkBk_A________CmCVCPBnCPCPCPCPCPCPCPBkCPCPBk_A_A_A_A_A_A_A_A_A } # tile 215 (sub knox walls 10) { ________________CVCVCPCPBlCOCPBnCKCOBnCPCKBmBk_A_A_A_A_A_A_A_A_A ________________CmCVCPCPCPCPCPCOCPCPCPCPCPCPBk_A_A_A_A_A_A_A_A_A ________________CmCPCPCPCPCPCPCKCPCPCPCPCPCKBk_L_A_A_A_A_A_A_A_A ________________CVCVCPCPCPCPCPBnCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCP ________________CmCVCPCPCPCPCPCOCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPBn ________________CmCPBmCKCPBmCKCPBlCOCKBnCOCPBkCPBkCPBkCPCPBnCJCP ________________CVCVCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCP ________________CmCVCPBmCPCPCPCPCPCPCPBlCPCPCPCPCPCPCPCJCPCPCPCP ________________CmCPCPCKCPBkCPCPBmCPCOCPCOBlCPCPCPBnCPBnCJCPBnCJ ________________CVCVCPCPCPCPCPCKCPCPCPCPCPCPCPBkCPCPCPCPCPCPCPCP ________________CmCVCPCPCPCPCPBmCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCP ________________CmCPBmCKCPBmCPCKCPCKBnCKCPBkBkBkCKCOBlCOCPBkCPBk ________________CVCVCPCPCPCPCPCPCPCPCPCOCPCPBkBkBkCPCPBlCPCPCJBM ________________CmCVCPBkCPCPCPCPCPCPCPBlCPCPBkBdBdBdBkCJBkBkBnBk ________________CmCPCPCPCPBkCPBmCKCOBnCOCPBkBkBkBkBkBkBmCPCPCJCP ________________CVCVCPCPCPCPCPCPCPCPCPCPCPCPBkBkBkBkBkBdBmCKBnCP ________________CmCVCPCPCPCPCPCKCPCPCPCPCPCKBm_A_A_A_ABkBkCPBkBk ________________CmCPCPBkCPCKBmCPBmCPCJBnCKBmBk_A_A_A_ABkBkCPCPCP ________________CVCVCPCPCPCPCPCPCPCPCPCPCPCPBk_A_A_A_ABkBkCPCPBk ________________CmCVCPBnCPCPCPCPCPCPCPBkCPCPBk_A_A_A_ABkBkCPCJCP ________________CmCPCPCJCPBmCKCPBnCKCPCPCOBkBl_z_A_A_ABkBkBkBnCP ________________CVCVCPCPCPCPCPCOCPCPCPCPCPCPBk_A_A_A_ABdBkBkCJCP ________________CmCVCPCPCPCPCPBlCPCPCPCPCPBlBm_z_A_A_A_ABdBkBnCP ________________CmCPBnCJCPBlCPCOCPCOCKBmCPCJBk_A_A_A_A_ABkBdBkBk ________________CVCVCPCPCPCPCPCPCPCPCPCPCPBnBk_z_A_A_A_ABkBkCPBk ________________CmCVCPBmCPCPCPCPCPCPCPBkCPCPBk_A_A_A_A_ABkBdCPBk ________________CmCPCPCKCPBkCPBnCKBnCPCPCKBkCO_B_A_A_ABdBkBkBkCJ ________________CVCVCPCPCPCPCPCOCPCPCPCPCPCPBk_A_A_A_ABkBdBkBkBn ________________CmCVCPCPCPCPCPCKCPCPCPCPCPBmBx_L_A_A_ABkBkBdBkBk ________________CmCPCKBmCPCKBmCPBmCKBmCPBkCPBk_A_A_A_ABkBkBkBkBk ________________CVCVCPCPCPCPCPCPCPCPCPCPCPCPBk_A_A_A_A_ABkBkBkBk ________________CmCVCPBmCPCPCPCPCPCPCPCJCPCPBk_A_A_A_A_A_ABkBkBk } ���������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/share/mon32se.txt�������������������������������������������������������������0000664�0000764�0000764�00000555703�10545462317�015621� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������__ = (71, 108, 108) _A = (0, 0, 0) _B = (0, 0, 16) _C = (0, 0, 32) _D = (0, 0, 48) _E = (0, 0, 64) _F = (0, 0, 96) _G = (0, 0, 128) _H = (0, 0, 160) _I = (0, 0, 192) _J = (0, 0, 224) _K = (0, 0, 255) _L = (0, 16, 0) _M = (0, 16, 16) _N = (0, 24, 0) _O = (0, 24, 24) _P = (0, 24, 48) _Q = (0, 32, 0) _R = (0, 32, 32) _S = (0, 32, 64) _T = (0, 48, 0) _U = (0, 48, 24) _V = (0, 48, 48) _W = (0, 48, 96) _X = (0, 64, 0) _Y = (0, 64, 32) _Z = (0, 64, 64) _a = (0, 64, 128) _b = (0, 80, 160) _c = (0, 96, 0) _d = (0, 96, 48) _e = (0, 96, 96) _f = (0, 96, 192) _g = (0, 112, 224) _h = (0, 128, 0) _i = (0, 128, 64) _j = (0, 128, 128) _k = (0, 128, 255) _l = (0, 144, 0) _m = (0, 160, 0) _n = (0, 160, 80) _o = (0, 160, 160) _p = (0, 182, 255) _q = (0, 192, 0) _r = (0, 192, 96) _s = (0, 192, 192) _t = (0, 224, 0) _u = (0, 224, 112) _v = (0, 224, 224) _w = (0, 255, 0) _x = (0, 255, 128) _y = (0, 255, 255) _z = (16, 0, 0) _0 = (16, 0, 16) _1 = (16, 16, 0) _2 = (16, 16, 16) _3 = (16, 48, 48) _4 = (24, 0, 0) _5 = (24, 24, 0) _6 = (24, 24, 48) _7 = (24, 48, 0) _8 = (24, 48, 24) _9 = (24, 48, 48) _$ = (32, 0, 0) A_ = (32, 0, 32) AA = (32, 32, 0) AB = (32, 32, 32) AC = (32, 64, 0) AD = (32, 64, 32) AE = (32, 64, 64) AF = (32, 242, 186) AG = (48, 0, 0) AH = (48, 0, 48) AI = (48, 12, 0) AJ = (48, 24, 0) AK = (48, 24, 24) AL = (48, 36, 0) AM = (48, 48, 0) AN = (48, 48, 24) AO = (48, 48, 48) AP = (48, 48, 96) AQ = (48, 96, 0) AR = (48, 96, 48) AS = (48, 96, 96) AT = (64, 0, 0) AU = (64, 0, 32) AV = (64, 0, 64) AW = (64, 0, 128) AX = (64, 16, 0) AY = (64, 32, 0) AZ = (64, 32, 32) Aa = (64, 32, 64) Ab = (64, 48, 0) Ac = (64, 64, 0) Ad = (64, 64, 32) Ae = (64, 64, 64) Af = (64, 64, 128) Ag = (64, 128, 0) Ah = (64, 128, 64) Ai = (64, 128, 128) Aj = (72, 108, 108) Ak = (80, 0, 160) Al = (80, 80, 80) Am = (80, 80, 160) An = (80, 160, 0) Ao = (80, 160, 80) Ap = (80, 160, 160) Aq = (96, 0, 0) Ar = (96, 0, 48) As = (96, 0, 96) At = (96, 0, 192) Au = (96, 16, 0) Av = (96, 24, 0) Aw = (96, 48, 0) Ax = (96, 48, 48) Ay = (96, 48, 96) Az = (96, 72, 0) A0 = (96, 96, 0) A1 = (96, 96, 48) A2 = (96, 96, 96) A3 = (96, 96, 128) A4 = (96, 96, 192) A5 = (96, 128, 96) A6 = (96, 128, 128) A7 = (96, 192, 0) A8 = (96, 192, 96) A9 = (96, 192, 192) A$ = (96, 144, 178) B_ = (104, 84, 31) BA = (108, 144, 182) BB = (108, 255, 0) BC = (112, 0, 224) BD = (112, 112, 112) BE = (112, 112, 224) BF = (112, 160, 160) BG = (112, 224, 0) BH = (112, 224, 112) BI = (112, 224, 224) BJ = (117, 105, 88) BK = (120, 120, 160) BL = (120, 160, 120) BM = (120, 160, 160) BN = (128, 0, 0) BO = (128, 0, 64) BP = (128, 0, 128) BQ = (128, 0, 255) BR = (128, 32, 0) BS = (128, 64, 0) BT = (128, 64, 64) BU = (128, 64, 128) BV = (128, 90, 72) BW = (128, 96, 0) BX = (128, 96, 96) BY = (128, 96, 128) BZ = (128, 112, 32) Ba = (128, 128, 0) Bb = (128, 128, 64) Bc = (128, 128, 96) Bd = (128, 128, 128) Be = (128, 128, 255) Bf = (128, 255, 0) Bg = (128, 255, 128) Bh = (128, 255, 255) Bi = (144, 72, 0) Bj = (144, 135, 110) Bk = (144, 144, 144) Bl = (144, 144, 192) Bm = (144, 192, 144) Bn = (144, 192, 192) Bo = (160, 0, 0) Bp = (160, 0, 80) Bq = (160, 0, 160) Br = (160, 40, 0) Bs = (160, 80, 0) Bt = (160, 80, 80) Bu = (160, 80, 160) Bv = (160, 120, 0) Bw = (160, 120, 120) Bx = (160, 120, 160) By = (160, 160, 0) Bz = (160, 160, 80) B0 = (160, 160, 120) B1 = (160, 160, 160) B2 = (160, 160, 224) B3 = (165, 118, 96) B4 = (168, 168, 224) B5 = (168, 224, 168) B6 = (168, 224, 224) B7 = (170, 136, 52) B8 = (170, 154, 128) B9 = (176, 176, 176) B$ = (178, 64, 0) C_ = (178, 224, 16) CA = (182, 72, 0) CB = (192, 0, 0) CC = (192, 0, 96) CD = (192, 0, 192) CE = (192, 48, 0) CF = (192, 96, 0) CG = (192, 96, 96) CH = (192, 96, 192) CI = (192, 144, 0) CJ = (192, 144, 144) CK = (192, 144, 192) CL = (192, 160, 64) CM = (192, 192, 0) CN = (192, 192, 96) CO = (192, 192, 144) CP = (192, 192, 192) CQ = (192, 192, 255) CR = (192, 255, 192) CS = (192, 255, 255) CT = (202, 144, 114) CU = (208, 168, 80) CV = (208, 208, 208) CW = (210, 210, 178) CX = (218, 218, 182) CY = (224, 0, 0) CZ = (224, 0, 112) Ca = (224, 0, 224) Cb = (224, 56, 0) Cc = (224, 112, 0) Cd = (224, 112, 112) Ce = (224, 112, 224) Cf = (224, 168, 0) Cg = (224, 168, 168) Ch = (224, 168, 224) Ci = (224, 192, 160) Cj = (224, 224, 0) Ck = (224, 224, 112) Cl = (224, 224, 168) Cm = (224, 224, 224) Cn = (229, 162, 130) Co = (240, 240, 240) Cp = (242, 0, 0) Cq = (242, 96, 0) Cr = (242, 196, 77) Cs = (248, 224, 96) Ct = (252, 252, 153) Cu = (255, 0, 0) Cv = (255, 0, 128) Cw = (255, 0, 255) Cx = (255, 64, 0) Cy = (255, 108, 0) Cz = (255, 128, 0) C0 = (255, 128, 128) C1 = (255, 128, 255) C2 = (255, 182, 144) C3 = (255, 192, 0) C4 = (255, 192, 192) C5 = (255, 192, 255) C6 = (255, 211, 176) C7 = (255, 255, 0) C8 = (255, 255, 128) C9 = (255, 255, 192) C$ = (255, 255, 255) # tile 6 (snow ant) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ _______________________KBE_K____________________________________ _______KBE_K_________KAm_KBE_KBE________________________________ __BE_KBE_K__Am_______J_________________________J_J______________ ___K_J_J_____K_____J_____________I________At_J___g______________ _______________J___gBC_gC$C$_KAm_I_____J_g______BC______________ _______________f__BC_KBE_KBE_JBE_IBE_J_____________J____________ _______JBE_KBeBE_KBE_sBC_g_KAk_K_I__BE_KBE_________f____________ _______K__AFAp_KBEAp_sAp_KAm_KBE_KAm_K_KCo_g_______K____________ _______f__Ap_sBE_K_sBI_o_IAt_f_I_HAm_KBE_KC$BC_____J____________ _______K___s_KBC_gBC_oBC_b_HAk_a___K_I_JBE_IC$_K_____J__________ _______J____BE_K__BE_K___J___J____Am_JAm_I_JC$BE_____J__________ _______f_____KBE__BE_K___J__BE_____KAf_H_JBE_K_I____Am__________ _______K_____JBE___K_____f___J_____JAf_JAm_K_IBE_____K__________ _____J_______K_________H_____J____BE_KAf_IAf_J_J_______J________ _____f_______f________Af_____KAf___K___H_HAm_JAm_______g________ _____K_____H___________H_______H_____J___H_HAf_J_______J________ _____J____Af___________H_______a_____g_________________J________ __Af_______H_________HAf_L_A_LAk_H_$_J_A_L_A_A___________J______ _H_H___J_gAk_____A_A_z_B_A_A_A_L_L_A_JAA_A_A_A_A_________f______ _______________A_A_A_A_A_A_A_A_A_AAA_J_A_A_A_A_A_A______BC_K_J_J ___________________A_A_A_A_A_A_A_A_ABC_g_z_A_A_A________________ _______________________A_A_A_A_A_A_L_A_B_A_A____________________ } # tile 9 (tsetse fly) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________CFCA____________________________ ______________________________B$CFCACA__________________________ ________________BFBABA______CACFCACACABi______BKBMBA____________ ______________BABFBAA$Am____CACFB$CACABi____BABlBKBABA__________ ______________BAAiBlBAA$BA__CACFCECABiBi__BMBAA$BABKA$__________ ________________BEBKA$BKBEBACECFCACABiBiBABFBEAiBKBA____________ ________________BABlAmA$BABACACFCACABiBiBlAmBABKA$A$_B_A_A______ __________________BABABFAiBYBACACACABiBABKBKBKApBA_A_A_A_A______ ____________________BABABlBKA$BAB$CABABlBABAA$BA_A_A_A_A_A______ ____________________CwA$BKAmBKA$CACABEA$BABABA_A_A_A_A_A________ ______________________BiBABlA$AmCACABKA$A$BABi_A_A_A_A__________ ____________________Bi____BAA$AmCAB$A$A$BA_B_ABi_A_A____________ ____________________BS____BS__BsBsBsBS__Bi_A_ABi________________ __________________Bi____Bi__BsBiBsBiBiBS__Bi_A_ABS______________ ________________________BS__BI_qBiBiBe_r__Bi____________________ ________________________BS__By_rBiBiBG_q__BS____________________ ______________________Bi____BiBiBiBiBSBS____BS__________________ _____________________________BBsBiBSBS__________________________ _________________________________B_B_A__________________________ _________________________________A_A____________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 12 (yellow jacket) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ CmCmCmCVCVCVCVCV__________________CVCVCVCVCVCV__________________ __CPCPBDBdBdCPBdCmCm__________CVCVCPBdCmCPBdBdCVCV______________ ____BDCPBdCmCmCVCPBdCm______CVBDCPBdCmBdBDCPCmCPBdCVCV__________ __________BdBdBdCPCPCPCVCm__CVCPBDBdCmBdCPBDCPCVCPBnBdCVCV______ ______________CPBdCVBdBDCPCmBdBDCP______BkCPBDCmBdBdCJCPBdCVCV__ _______________z___MCjCjCjCjCj____________________CPBnCJBdBd____ _______________M__AKCjCjCjCjCjCj________________________________ ___________MAACjCjCjANAACsCsCsCjCj___MCjCj______________________ ________AB_zABCjCjCs_M_MABCsCsCsCsAAANCjCjAA____________________ _________M_MAACsCsCsAA_MAACfCjCjCs_MA_CjCjABCj__________________ __________ABCjCsCsCs_MA_CsCjCsCf__AACsCsCjANCjAA________________ ____________CjCj__CfCj__Cj__Cj____CfCsCsAA_OCjAB________________ ____________CjCf__CjCj__Cj____Cj__CfCj_MABCsCj_M________________ ______________Cj__Cj____Cj____Cj__AAAB_zCsCsAACj________________ ________________________Cj____Cj____CfCjCs_MABCj________________ __________________________Cs__Cj______AK_zABCsCj________________ __________________________Cs____Cj______CjCfCjCj________________ ________________________________Cj__________Cf__________________ _______________________L_L_L_L_L_L_A_A_A_A_ACm__________________ ___________________L_A_A_A_A_A_A_A_A_A_A_A_ACm_L________________ _______________A_A_A_A_A_A_A_A_A_A_A_A_A_A_ACm_A________________ ___________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A________________ _______________________A_A_A_A_A_A_A_A_A_A_A____________________ } # tile 13 (black wasp) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ CmCmCmCVCVCVCVCV__________________CVCVCVCVCVCV__________________ __CPCPBDBdBdCPBdCmCm__________CVCVCPBdCmCPBdBdCVCV______________ ____BDCPBdCmCmCVCPBdCm______CVBDCPBdCmBdBDCPCmCPBdCVCV__________ __________BdBdBdCPCPCPCVCm__CVCPBDBdCmBdCPBDCPCVCPBnBdCVCV______ ______________CPBdCVBdBDCPCmBdBDCP______BkCPBDCmBdBdCJCPBdCVCV__ _______________z___M_GAtAkAtAt____________________CPBnCJBdBd____ _______________M__AA_H_GAtBPBPAk________________________________ ___________MABBPAkBPABAA_H_GAtBPAk___MAt_G______________________ _________O_$_M_HBPAt_M_MAAAt_H_G_H_zABBPAt_M____________________ _________MAB_MBPAtAtAA_MA__W_G_HAW_U_zAWAtAABP__________________ ___________MAAAkBPAt_BAAAt_GAP_G__AA_H_GAsABAk_M________________ ____________AW_G___GBP__At___G_____HAs_HAB_MAsAB________________ ____________BP_G___GAW__At____As___H_G_OAA_GBP_M________________ ______________Ay__BP____Ak____AW__AAAB_zAk_G_OBP________________ _________________________F____BP_____G_GAsAAABAk________________ ___________________________G__Ay______AB_O_MAtAs________________ ___________________________F____At_______FAW_GAW________________ ________________________________At__________BK__________________ _______________________L_A_L_A_A_A_A_A_A_A_LBl__________________ ___________________A_A_A_A_A_A_A_A_A_A_A_A_ACm_A________________ _______________A_A_A_A_A_A_A_A_A_A_A_A_A_A_ACm_A________________ ___________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A________________ _______________________A_A_A_A_A_A_A_A_A_A_A____________________ } # tile 15 (giant wasp) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __BdBdCPCVCVCV__________________________________________________ CVCmCmCmCJBnCPCVCV__________________CVCVCVCVCVCV________________ ____CPBnBdBdBdCPBDCmCm__________CVCVCPBdCmCPBdBdCVCV____________ ______BDCPBdCVCmCmCPBdCm______CVBDCPBdCmBdBDCPCmCPBdCVCV________ ____________BdBdBdCPCPCPCVCm__CVCPBDBdCmBdCPBDCPCVCPBnBdCVCV____ ________________CJBdCVBdBDCPCmBdBDCP______BkCPBDCmBdBdCJCPBdCVCV _____________M_____OCfCjCfCfCjCf____________________CPBnCJBdBd__ _____________M____AKCfCjCfCjCfCjCf______________________________ _______MAsAtCjCfCjCfAK_GBPCfCfCfCjCfCj___zCjCfCf________________ _____zAB_HBPCfCjCfCf_MAB_HBPCfCfCfCfCf_zA_CjCfCj_M______________ _____O_zAB_GCfCfCfCfAK_zABAWCICICfCfCfAB_zCfCjCfAKCf____________ ____AK_M_MABCfCfCfCI_M_M_MAKCICICICfCf_MAKCjCfCj_$Cj____________ _______M_$CfCfCICICIAK_zCfCfCICfCI_____$CfCfCfAKA_CfAK__________ __________CjCI____CICf__CjCf__CjCf____CICfCfAK_M_$Cj_M__________ __________CfCf____CICj__Cf______Cf____CICI_M_MAACfCfAK__________ ____________Cf____Cf____Cj______Cj_____M_MA_CfCfCfAA_M__________ ____________Cj____Cj____Cf______Cf____AAA__QCfCfCfA_Cf__________ ________________________CjCf____Cj______CICICfCf_MAKCj__________ __________________________CfCf__Cf_________MAB_z_MCfCf__________ ____________________________Cf__CjCf________CICICICICj__________ __________________________________CfCj__________CmCICm__________ _______________A_A_A_A_______A_A_A_z_z_A_A_A_A_A_zCICm__________ _____________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_ACm____________ ___________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_ACm_A__________ ___________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_ACm_A_A__________ _____________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A__________ _______________________A_A_A_A_A_A_A_A_A_A_A_A_A_A______________ ___________________________A_A_A_A_A_A_A_A_A_A_A_A______________ } # tile 16 (spitting beetle) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________AvAvBR______________________________________________ ________________AvBR__BrBrBrCdCXCdCpBrBrBr______________________ ________________AvAvBRAXAXAXCECuCuCpCpBrBrBrCpCp________________ ______________BrBrAvCBCBBRBRAXAXBRBRBRBRBRBRCBCpCpBr____________ ________AXAvBrBRCBCBBNBoBRBRAvAvAXBRBRBRBRBRBRBRBRBRBR__________ _______$AXAvAvBRCBBoBRAvAvAvBRBRAXAvAvAvAvAvAvAvBRBRBRBR________ ______BdAXAXAvAvAvAvAvBRBRBRCBCBBRAXBRCBCBCBBRBRBNBoAvAv________ _______$_$AXAX_XAXAvAvAvCBCBBoBNAvAXBNBoBNAvAvAvCBCBBNBR________ ____CZAv_$AXBd_X_XAXAvAvBNBNAvAvAvAXAvAvAvAvAvAvAvBoBNAv________ ____Av__CZ_$_$_X_$AXAvAvAvAvAXAXAX_$AXAXAXAXAXAXAXAXAvAv_A______ ____Cd__CdAu_$_$_$_$AXAXAXAXAXAXAX_$AXAXAXAXAXAXAXAXAX_A_A______ ________BRAu__BRBR_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_A_A_A_A______ ______Cd__BRBRAvAv_A_A_A_A_A_ABRBR_A_ABRAv_A_ABRAvAv_A_A_A______ ______CZBRAvAv_A_A_A_A_A_A_ABRAv_A_A_ABRAv_A_A_ABRBRAvAv________ ____BRAv__CZ_L_A_A_A_A_A_ABRAvAv_A_A_A_AAv_A_A_A_A_A_AAvAv______ __BRAv_A_A_L_A____________Av_A_A_A_A_A_A_AAvAv_A_A_A_A_A__AvAv__ __Av___ACd______CZ________Av___A_A_____A_A__Av_________A_A__Av__ ______________BtCZ______AvAv___A_________A_AAvAv________________ ________________________Av___A_A___________A__Av________________ __CZCZ____CZ____________Av___A________________AvAv______________ ________CGCC__________AvAv______________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 18 (assassin bug) { ________________________________________________________________ _________________h_c_h_c________________________________________ ___________________l_c_h________________________________________ _______c_____________l_c________________________________________ _____h_c_______________h________________________________________ _____c_h_______________c________________________________________ _____c_l_l_____________h________________________________________ _______h_c_l___________c________________________________________ ___________h_c_________l________________________________________ _______________c_____h_cCuCu____________________________________ _________________l_c_h_l_tCu____________________________________ ________________Cu_l_l_l_l_t____________________________________ ________________CuCu_l_l_l_q_q_t_q_____________l_c______________ _________________________q_l_q_tC$_t_______l_l___h______________ _____________c_m_l_______l_l_l_q_q_t___l_l_______c______________ _____________h_____l_l___l_l_l_l_q_q_l_____________h____________ _____________c_________l_l_l_l_l_q_l_t_q_t_________c____________ _____________h_____l_l_l_l_l_l_q_l_q_q_tC$_t_______h____________ _____________c_____l_________l_____l_q_q_qC$_t_____c____________ _____________h_____l_________l_____l_l_q_m_qC$_t_____c__________ _____________c_____l_________l_____c_l_l_q_tC$_q_____h__________ _____________h_____l_______l_______h_l_l_q_q_q_t_t___c__________ ___________c_______l_______l_______c_l_l_l_q_l_t_q___h__________ ___________h_____l_________l_______h_l_l_l_l_q_q_t_t___c________ ___________c_____l_________l_______c___l_l_l_l_q_l_q___h________ ___________h_____l_________l_________h___l_l_l_l_q_t___c________ ___________c___c_h_____c_h_c_________c_____l_l_l_q_t___c________ ___________h___A_A_A_A_A_A_A_A_A_A_A_h_________l_q_______h______ ___________c_A_A_A_A_A_A_A_A_A_A_A_c_c_A_A_A_A_l_l_A_A_A_c______ _______h_c_A_A_A_A_A_A_A_A_A_A_A_A_L_A_A_A_A_A_A_A_A_A_A_h_c_A_A ___________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A__ _________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A__________ } # tile 19 (killer beetle) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ _______________c_h_l____________________________________________ ___________________h_l___m_m_m_m_m_m_m_m_l_l____________________ ___________________c_hAC_cAgACAnAnAgAnAgAnBaAgBaBa______________ _________________m_q_hAg_c_XAgAC_TBWAgAzAgAzAgAzBaBWBW__________ _____________t_mAg_lAgAgAg_XAgAcAQACAzBWAzBaAzBWBWBWAzAz________ _______m_mBa_c_h_l_lAgAQAQAQAcAQAzACAQAQAQAQAQAQAQBWAzBWBW______ ___mBaBaBa_X_c_cAQAQ_cAQAQAzAzAzBWAzACAzAQAzAzAzAzAQAzAzAz______ __BaBa___Q_T_X_X_c_q_cAQAQAQAQAQAQAQAQAQAQAgAQAgAgBWBWBWBW______ _mBa_______Q_XBa_c_cACACACAQAcAQAQAzAQAQAQAQAQAzAQAQAQAcAz______ Ba________Ba_mBW_c_NAC_cACAQAQAMAQACAAACACACACAQACACAcAQAc_A____ ______BaAg_mBa_N_Q_N_QACACACACAC_XAC_TACAC_cACACACACACAC_z_M____ _____m_mBv_______h_h_N_N_N_L_N_QAA_TAA_T_TAAAC_TACAA_z_z_M_A____ _____________h_h_c_c_z_z_z_z_$_zAgBa_z_$AgAQ_$_$AgACAQ_M_z_M____ _________c_h_X_c_z_z_z_z_z_z_zAQAQ_z_$_$AgAQ_$_z_MAQAQAC_c______ _______h_c_____z_z_z_z_z_z_zAQ_c_c_$_$_$_$_c_$_M_M_M_L_M_c_c____ _____h_c_z_z_z_z_____________c_z_$_z_$_z_$_zAQ_c_$_z_z_z_z___c_c _____c___z__________________AC___z_z_____z_z___c_________z_z___c ___________________________c_c___z_________z_$_c_c______________ __________________________AC___z_z___________z___c______________ ___________________________c___z_________________c_c____________ _________________________cAQ____________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 24 (lava blob) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________________________CzCzCzCzCz________________________ ______________CzCzCzCzCz__CzCyCzCzCzCrCzCz______________________ ____________CzCzCrCzCzCyCzCzCfCfCzCzCzCzCyCzCz__________________ ____________CzCzCzCzCrCzCzCfCjCfCrCzCzCzCzCyCzCzCzCz____________ ____________CzCzCzCzCzCzCzCfCfCzCzCzCzCzCzCzCzCzCrCzCz__________ ____________CyCzCzCzCzCrCfCjCzCrCzCzCzCzCrCzCzCrCyCzCr__________ ____________CzCzCyCzCzCzCfCrCzCzCzCzCrCzCyCrCzCzCzCyCy__________ ____________CzCyCzCzCzCzCfCzCzCrCzCzCzCzCzCzCzCrCyCz_A_A_A_A____ ______________CzCyCzCyCzCzCzCzCzCzCzCUCzCzCzCyCyCz_A_A_A_A_A____ ____________CzCyCzCzCzCzCzCzCzCzCzCzCyCyCzCyCzCzCy_A_A_A_A_A_A__ ____________CyCzCzCyCzCyCzCyCzCyCzCyCzCzCyCyCyCqCzCz_A_A_A_A____ __________CzCzCyCzCyCqCyCyCzCzCzCzCzCyCzCyCdCqCqCyCyCz_A_A_A____ __________CzCyCyCyCqCqCdCyCzCyCzCyCzCyCyCqCqCqCyCqCyCy_A_A______ __________CzCyCqCdCqCqCxCqCqCyCyCqCdCyCqCxCqCxCyCdCqCq_B_A______ __________CqCqCqCyCxCqCqCqCxCqCdCqCqCyCbCqCbCqCxCqCx_B_A_A______ _________BCyCyCxCqCbCqCbCqCqCqCqCyCqCqCqCqCqCb_M_A_A_A_A________ _________B_CCqCqCbCqCqCqCbCqCxCyCqCyCbCqCbCq_B_A_A_A_A__________ _________A_A_BCqCq_B_BCqCqCbCqCqCdCqCqCqCbCq_B_A_A_A____________ ___________A_A_A_B_A_A_A_B_CCqCyCqCyCbCqCq_A_A_A________________ _______________A_A_A_A_A_A_A_BCqCyCqCqCb_B_A_A_A________________ ___________________________A_A_B_B_C_B_B_A_A_A__________________ _______________________________A_A_A_A_A_A______________________ ________________________________________________________________ } # tile 29 (chickatrice) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________________CXCXCXCX____________________________ __________________________CXCXCXCXCXCX__________________________ ________________________CXCX_ACXCXCXCXCW________________________ ________________________CjClCXCXCXCXCXCW________CoCm_A__________ ____________________CjCjCjCjCXCXCXCXCWCW____CoCmCXCl_A__________ ____________________CjCjCjCjClCXCXCXCWCWCXCmCoClCl_A_A__________ ______________________________CXCXCWCXClCmCoClCW_A_A_A__________ ________________________________CXCXCXCX_i_m_A_A_A_A____________ ________________________________CXCXCX_i_l_l_A_A_A______________ ________________________________Bg_i_i_i_i_l_lBg_A_A____________ ________________________________Bg_l_i_l_l_i_l_l_l_A____________ _________________________________z_A_l_i_l_l_l_l_i_A_A__________ ___________________________________A_l_l_l_lBg_l_i_A_A__________ _____________________________________A_A_A_lBg_l_i_A_A__________ ___________________________________________l_l_l_i_A_A__________ _____________________________l___________lBg_l_i_i_A____________ _____________________________l_l____BgBg_l_l_i_i_A_A____________ _____________________________A_lBg_l_l_l_i_l_z_A_A______________ _______________________________z_l_i_i_i_z_A_A__________________ _________________________________A_z_A_A_A______________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 34 (fox) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________Cd________Cd____________________________________________ ________CzCy____CzCy____________________________________________ ________CdCzCdCyCdCq____________________________________________ ________CdCqCyCqCqCy____________________CzCdCyCdCy______________ ________CyCyAaCyCdCq__________________CdCzCyCdCyCyCd____________ ______CyCdCqCyCxCqCxCy______________CqCqCdCyCqCdCyCyCy__________ ____CxCdCyCqCdCqCbCxCqCqCyCdCyCyCyCqCxCyCbABCqCyCqCdCyCd________ ____CzCyCqCxCqCbCACqCxCxCqCxCqCxCqCxCqCbABA_A_ABA_A_CyCyCy______ ______________CqCbCbCqCxCqCbCxCxCqCqCxCb_OAA_MA_AAABA_A_Cd______ ______________CdCqCECdCqCbCbCFCbCqCqCqAx_zAB_$__________________ ______________CzB$A_CyCbCACqCGCbCqCbBTAIAB_zAB__________________ ______________CdBrABCxB$A____zABCxCbAK_z_zAB_z__________________ ____________CyCxBSA_CqB$_P__A__MABCqCbAB_M_$____________________ ____________CAB$BiCbCqBS_$__AAA_CECqCb_zAB______________________ ____________A_A_ABCqCxBT_$_______MA_AB_M________________________ _________________MA_ABA_________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 59 (glowing eye) { ________________________________________________________________ __________________________C$____________________________________ __________________________C$____________________________________ ________C$______________CjC$____________________________________ __________C$____________C$Cj______________________Co____________ ________CjCjC$__________C$CjCj________________CjCo______________ __________CjCjC$______CjC$CjCj____________CjC$C$________________ __________CjCj__C$____Cj__CjCj________CjCjC$Cj__________________ __________CjCjCjC$__________________Cj__C$CjCj__________________ ____________Cj__Cj______C_CrC_CL______C$CjCj____________________ ______________Cj____CrC_CsC_CsCjCNCL______Cj____________________ __C$________Cj____CsCsCjCsCsC_CsBzC_CL__Cj______________________ __CjC$CjCj______CsCtCjCsCsCsCsC_CrC_BbCN________________________ ____C$Cj__CjCj__CsC$C$CjCjCjC_CrC_CNCLCL________________________ ______C$Cj____CtCjC$C$C$C$CjCjCNCrCjCNBbBz__CjCj________________ ________C$C$__CsCtCtC$_AC$C$CjCsCNBbC_BzCLC$C$C$Cj______________ ________Cj____CjCtC$_A_A_AC$CjCtCjCNCLCNBb__Cj__C$C$C$__________ __________Cj__CsCsC$C$_AC$C$CjC_CLBzC_BbCN__CjCjCjCj__Cj________ ________________CtCtC$C$C$CtCsCNCjCNBbBz________________________ ________________CsCjCjCjCjCjCsC_CUC_BzCLC$Cj____________________ ____________Cj____BzCjCjCjCsC_BzCLBbC_____C$Cj__________________ __________CjCjC$Cj__BzBzCLC_CLCMBbBz____Cj__C$Cj________________ ________CjCjC$__________CLBzCLCNC$________CjCjC$Cj______________ ________C$C$__Cj____Cj__Cj______C$CjCj________CjC$______________ ______C$__CjCj________CjC$C$Cj__CjC$CjCj__________Cj____________ ____Co__Cj____________CjC$Cj______CjC$Cj________________________ ____Cj________________CjC$__Cj______CjC$Co______________________ ______________________CjCo______________Co______________________ ________________________C$______________________________________ ________________________Cj______________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 61 (flaming sphere) { ______________________________________Cy________________________ ______________________________Cy______Cz________________________ ______________________________Cz______Cd________________________ ________________Cz______CyCxCyCr______Cr________________________ ______________CyCz______CyCrCrCy______Cr________________________ ______________CrCz______CdCzCUCy____CxCr________________________ ____________CxCrCz______CzCrCyCyCxCyCxCrCy______________________ ____________CxCrCrCyCzCzCrCzCyCyCzCzCzCrCz______________________ ____________CzCsCzCyCyCzCrCzCUCxCyCyCzCrCy__Cx__________________ ____________CdCrCrCyCqCrCrCzCzCyCqCyCzCrCzCyCy__________________ ____________CfCrCrCzCfCzCrCzCrCqCqCqCzCrCzCzCqCz________________ ____________CzCrCrCrCjCzCsCzCdCzCyCqCyCrCzCyCyCz________________ ____________CfCrCsCrCzCrCrCzCrCzCyCyCzCzCzCzCrCz________________ __________CjCzCrCrCrCfCzCrCzCrCnCzCyCzCzCrCzCfCy________________ __________CfCjCzCrCrCfCrCfCrCzCrCyCzCfCzCzCzCfCx________________ __________CfCfCzCrCrCfCrCzCrCrCrCzCzCzCfCzCrCzCxCx______________ __________CfCfCzCrCjCfCzCfCrCzCrCyCzCyCrCzCzCfCxCq______________ __________CzCfCzCfCfCfCrCzCrCzCrCzCqCyCfCfCzCzCxCx______________ __________CzCfCfCfCfCfCzCrCrCzCrCzCyCyCrCzCzCzCxCu______________ ____________CzCrCfCfCzCyCrCzCrCrCzCyCzCrCfCzCxCx________________ ____________CzCrCfCfCzCzCrCzCrCrCzCzCyCrCzCxCqCu________________ ____________CfCrCjCfCzCzCzCzCzCrCrCzCyCfCzCqCxCx________________ ________________CzCfCzCrCzCzCzCsCrCrCzCzCzCyCu__________________ ________________CzCfCzCfCzCyCzCzCrCfCzCzCyCyCx__________________ __________________CzCyCzCyCqCzCyCrCzCyCzCx______________________ _____________________A_BCyCyCzCqCrCxAK__________________________ _________________L_A_A_AAI_MBSBTAI_A_B_A_A_A____________________ _____________A_A_A_A_A_A_zAYBS_z_A_A_A_A_A_A_A_A________________ ___________A_A_A_A_A_A_A_AAY_z_A_A_A_A_A_A_A_A_A_A______________ _______________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A________________ ___________________A_A_A_A_A_A_A_A_A_A_A_A______________________ ________________________________________________________________ } # tile 63 (bloodshot eye) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________BkCPBkBk________________________________ ____________________CPCuCPCBCVCPCBBk____________________________ __________________CVCpCPCVCBBkCuBkBkBk__________________________ ________________CVCVCVCBCBCmCVCuCPCBBDBk________________________ ________________CVC$CmCYBnCPBkCBCBBkCBBk________________________ ______________CVCVCgCnCYCBCJCpBkCPCPBkBDBD______________________ ______________CVCBCYCYCBBNAuBkCPBdBDBkBDBk______________________ ______________CVBoCB_A_ABoBNBnBkCPBdBkCBBD______________________ ______________CVBoBo_A_ABoAqCYCpBkCYCBBDBk______________________ ________________AqBNCBBoBNAqBkBkCuBMBDBD________________________ ________________CPAqAqAqAqBkCPCBBkCuCuBk________________________ __________________BDCPCBCuCPBdCBBkBdBk__________________________ ____________________CBBDCBBkBkBkBDBD____________________________ ________________________BkCBBkBk________________________________ ________________________________________________________________ _____________________A_A_A_M_A_A_A_A_A__________________________ _________________A_A_A_A_A_A_A_A_A_A_A_A_A______________________ _________________A_A_A_A_A_A_A_A_A_A_A_A_A______________________ _____________________A_A_A_A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 64 (blinking eye) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________CgCgCnCnCJCTCT________________________ ______________________CiCiCiCgCgCnCJCdCJCTCT____________________ ____________________CgCXCmCXCmCiCgCnCnCTCJCdCT__________________ __________________CiCmCmCoCmCoCmCiCgCnCJCdCTBw__________________ __________________CgCXCmC$CdCTCdCTCdCTCGCTCJCGCT________________ ________________CgCiCmCdCTC$_p_p_k_k_gBkCTCGCTBw________________ ________________CgCdCTCoC$_g_k_k_g_g_b_aBkBkCJCdCT______________ ______________CTCTCPCVCVCo_f_gBd_A_a_f_aBkBdBdBDCJCT____________ ______________CdBmCKCPCVCV_b_f_A_A_A_f_aBkBdBdBDBDCT____________ ______________CJCTBkCPCPCP_b_f_a_A_a_f_aBkBdBdBDCGCJ____________ ________________CTCJCTBkBk_a_b_f_f_f_a_aBdBdCTCTCT______________ ________________CTCdCJCnCnBk_a_a_a_a_aBdCTCTCGCJ________________ __________________CTCJCdCTCJCnCJCTCTCJCnBwCdCJCT________________ __________________CTCGCJCTCdCTCdCTCdBwCGCTCJCT__________________ ____________________CTCTCGCTBwCTBwCJCGCTCTCTCd__________________ ______________________BwCTCGBwCdCGCTCTCJCdCJ____________________ __________________________CGCTBwCGCJCGCT________________________ ____________________________________________________Cw__________ ________________________________________________________________ ________________________________________________________________ _____________________A_A_A_A_A_A_A_A_A_A_A_A_A_A________________ ___________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A______________ _____________________A_A_A_A_A_A_A_A_A_A_A_A_A_A________________ _________________________A_A_A_A_A_A_A_A_A_A____________________ ________________________________________________________________ } # tile 83 (hobbit) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________AwAwAwAw________________________________ ____________________AwBSBSAwAwAwAwAw____________________________ __________________BSBSBSBSAwAwAwAYAYAY__________________________ ________________AwAwBSBSBSAwAwAwAYAYAYAY________________________ ________________AwBSC2AeAeCnCnAeAeB3BSAY________________________ ________________AwCnC2AeAeCnCnAeAeB3B3AY________________________ ________________AwCnC2C2CnCnCnCTCTB3B3AY________________________ ________________AwAYC2C2CnBVBVCTB3B3AYAw________________________ __________________AwAYAYCnCnCnB3AYAYAw_____A_A_A_A_A____________ ________________C2C2C2C2CTCTCTCnCTCTCTCT_A_A_A_A_A_A_A__________ ____________C2C2CnCnCnCnCnCnCnCnCTCTCTCTCTCT_A_A_A_A_A__________ __________C2CnCnCTCTC2C2CnCnCnCnB3B3B3B3CTCTCT_A_A_A_A__________ __________C2CnCTCT_AC2BSCnAwCnBSB3Aw_AB3B3CTCT_A_A_A_A__________ __________C2CnCT_A_ABSAwBSBSAwAwAYAY_A_AB3CTCT_A_A_A_A__________ __________C2CnCT_ABSAwAwAwBSAYAYAYAYAY_AB3CTCT_A_A_A____________ __________C2CnCT__BSAwBSAwBSBSAwBSAYAw_AB3CTCT_A_A_A____________ ____________CTCT__BSBSBSB3_ABSAwCnAY_A_AB3CT_A_A_A_A____________ ____________________C2CnB3_A_AB3CnB3_A_A_A_A_A_A_A_A____________ ____________________C2CnB3_A_AB3CnB3_A_A_A_A_A_A_A_A____________ ________________C2C2CnCnB3_A_AB3CnCTCTCT_A_A_A_A________________ _______________ACnCnCnCTB3_A_AB3CTCTCTCT_A_A_A__________________ _______________A_A_A_A_A_A_____A_A_A_A_A_A_A_A__________________ ________________________________________________________________ } # tile 85 (dwarf thief) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________Cm____________________________Cm________________ ________________CmCm________BsBsAqAq________CmCm________________ ________________CmCmCmCmBsBsBsBsAqAqAqAqCmCmCmCm________________ __________________CmCmCmBsBsBsBsBsAqAqAqCmCmCm__________________ ______________________BsBsBsBsBsBsAqAqAqAq______________________ ______CmCmCmCmCmCmCm__CPCPCPB1B1B1B1BdBdBd______________________ __CmCmCPCPCPCPCPCPCPCP__C2C2C2C2C2C2C2C2________________________ CmCP________AqAq________Bs_A_AC2_A_AC2BS________________________ ____________AqAq________BsC2C2C2C2C2C2BS___________A_A_A_A_A____ ____________AqAq________BsBsC2C2C2C2BSBS_______A_A_A_A_A_A_A_A__ ____________AqAq____C2C2CjBsBsBsBSBSBSCMC2C2_A_A_A_A_A_A_A_A_A__ ____________AqAq__C2C2C2CjBsBsBsBSBSBSCMC2C2CmCmCPCP_A_A_A_A_A__ ____________C2C2C2C2C2__CjCjBsBsBSBSCMCM_ACmCmBSBSCPB1_A_A_A_A__ ____________C2C2C2C2____CjCjCjBsBSCMCMCMCmCmBsBSBSAwB1B1_A_A____ ____________AqAq________CjCjCjCMCMCMCMCMCmBsBsBSBSAwAwB1_A_A____ ____________AqAq________BSBSBSBSBSBSAqAqCPBsBsBSBSAwAwB1_A______ ____________AqAq________BSBSBSBSBSBSAqAqCPCPBsBSBSAwB1B1________ ____________AqAq________BSBSBS_A_ABSAqAq_ACPCPBSBSB1B1__________ ________________________BSBSAq_A_ABSAqAq_A_ACPCPB1B1____________ ____________________BSBSBSBSAq_A_ABSAqAqAqAq_A_A_A______________ ____________________BSBSBSBSAq_A_ABSAqAqAqAq_A_A________________ _______________________A_A_A_A_A_A_A_A_A_A_A_A__________________ ________________________________________________________________ ________________________________________________________________ } # tile 107 (clear jelly) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ___________________________k_k_k_k_k____________________________ _______________________k_k_k_k_______k_k________________________ _____________________k_kCPCPCP_k_________k_k____________________ ___________________k_kCPCPCPCP_k_____________k__________________ ___________________kCPCPCPCP_k_______________k__________________ _________________k_kCPCP_k_k___________________k________________ _______________k_kCPCP_k_______________________k________________ _______________kCP_k_k___________________________k______________ _____________k_kCP_k_____________________________k______________ _____________k___g_________________________________g____________ ___________k_________________________________________g__________ ___________k___________________________________________g________ ___________g_____________________________________________g______ ___________g_________b_b_b_b___________b_b_b_b_b_b_b_______g____ _________g_____b_b_b_b_b_b_b_________b_b_b_b_b_b_b_b_b_f___g____ _________g___b_b_b_b_b_b_b_b_b_______b_b_b_b_b___________f___g__ _______g_____b_b_b_b_b_b_b_b_b_______b_b_b_b_______________f_g__ _______g___b_b_b___________b_b_______b_b_b_________________f_g__ _______g_b_b_b_______________b_______b_b___________________f_g__ _____g___b_b___________________f_______g___________________f_g__ _____g_b_b_______________________f_____g___________________g____ ___g___b_________________________f_____g_________________f_g____ _g___b_b___________________________f_____g_g____________________ _g_b_b_______________________________f_f_____g__________________ _b_______________________________________f_f_g_g________________ _______________________________________________f_g______________ ________________________________________________________________ ________________________________________________________________ } # tile 109 (yellow jelly) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________CjCjCjCjCj____________________________ ______________________CjCjCjCjCjCjCjCjCj________________________ ____________________CjCjCtCtCsCjCjCjCjCjCjCj____________________ __________________CjCjCsCtCsCtCjCjCjCjCjCjCjCj_A_A_A_A_A________ __________________CjCtCtCsCtCjCjCjCjCjCjCjCjCj_z_A_A_A_A_A_A____ ________________CjCjCsCtCjCjCjCjCjCjCjCjCjCjCjCj_A_A_A_A_A_A____ ______________CjCjCtCtCjCjCfCjCfCjCfCjCjCjCjCjCj_z_A_A_A_A_A_A__ ______________CjCtCjCjCfCjCfCjCfCjCfCjCfCfCjCjCjCj_A_A_A_A_A_A__ ____________CjCjCtCjCjCjCfCjCjCfCjCjCfCjCjCfCjCfCj_z_A_A_A_A_A__ ____________CjCjCjCfCjCfCjCjCfCjCfCjCfCjCfCjCfCjCjCj_A_A_A_A_A__ __________CjCjCjCfCfCMCfCfCjCfCjCfCjCjCfCfCMCfCjCfCfCj_A_A_A_A__ __________CjCjCfCMCMCICMCMCfCjCjCfCjCfCMCMCICMCICMCjCfCj_A_A_A_A __________CjCfCjCfCICMCICMCjCfCjCfCjCfCMCICMCICMCICjCfCjCf_A_A_A __________CfCjCMCICMByByBvBvCMCfCMCfCMBvByByBvByByBvCMCICjCj_A_A ________CjCfCMBvByBvBvByByByCICMCICMBvByBvByByBvByBvByCMCICf_A_A ________CfCjBvByBvByByBvByBvByCICMCIByByBvByBv_A_A_A_A_ACMCMCj_A ______CjCjCfByByBvByBvByBvByByCMCICMBvByByBv_L_A_A_A_A_A_ACICj_A ______CjCfByBvBy_A_A_A_A_LBvBvCMCICMByBvBy_A_A_A_________ACMCf_A ______CfByByBv_A_A_A_A_A_A_AByCICMCIByBv_A_A_A___________ACMCj_A ____CjCjBvBy_A_A_A_________A_LCICMCMCfCj_A_A_____________ACMCf_A ____CfByBv_A_A_______________A_ACMCICjCf_A_______________ACf_L_A __CjCfBy_A_A_________________A_ACICMCICj_A_A_A__________CMCj_A__ CjCfByBy_A_____________________A_ACMCMCICjCf_L_A_________A_A____ CfByBv_A_A_______________________A_ACICMCICjCj_A________________ By_A_A_A___________________________A_A_ACMCICfCj_A_A____________ _______________________________________A_A_A_LCICj_A____________ _____________________________________________A_A_A_A____________ ________________________________________________________________ } # tile 110 (orange jelly) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________CzCcCzCzCc____________________________ ______________________CcCzCcCzCzCcCzCcCz________________________ ____________________CzCzCiCiCiCyCzCzCzCcCzCc____________________ __________________CcCzCnCiCnCiCzCcCzCdCzCcCzCz_A_A_A_A_A________ __________________CzCiCiCsCiCzCyCzCcCzCzCzCcCz_C_A_A_A_A_A_A____ ________________CzCzCnCiCyCyCcCcCGCcCFCzCdCzCcCz_A_A_A_A_A_A____ ______________CzCcCiCiCzCcCFCcCFCcCcCcCFCcCyCzCc_B_A_A_A_A_A_A__ ______________CyCiCzCzCcCcCGCcCcCFCcCGCcCFCcCGCzCz_A_A_A_A_A_A__ ____________CzCzCiCyCcCFCcCcCcCFCcCcCcCcCcCFCcCcCc_B_A_A_A_A_A__ ____________CzCcCcCcCFCcCcCFCcCcCGCcCFCcCGCcCcCFCcCc_A_A_A_A_A__ __________CcCzCGCcCABtCFCFCcCGCcCcCFCcCcCFCABtCcCcCFCc_B_A_A_A__ __________CcCcCcCFCFCFCFBtCcCcCFCcCcCFCFBsCFCFCFBtCcCFCc_A_A_A_A __________CcCcCFCFBsCFCFCFCcCFCcCcCGCcCFCFBsCFCFCFCcCcCFCc_B_A_A __________CcCFCFBtCFBiBiBiBsBtCFCACFCFBsBTBsBTBiBiBiBtCFCFCc_A_A ________CcCFBtBsBsBsBTBsBsBiCFCFBsCFBiBiBsBsBsBsBsBsBsCFCFCc_B_A ________CcCcBsBsBiBsBsBiBsBiBiCFCFCFBTBsBiBsBi_B_B_A_B_CCFBsCc_A ______CcCFCcBiBsBiBsBiBsBTBsBsBtCFCFBiBsBiBs_B_A_A_A_A_A_BCFCc_B ______CcCcBTBsBi_B_B_B_B_ABsBiCFBsCFBiBsBi_B_A_A_________BBsCc_A ______CFBsBsBi_C_A_A_A_A_A_BBsCFCFBtBsBi_C_A_A___________ACFCF_B ____CcCcBiBs_B_A_A_________A_CBsCFCFCcCc_A_A_____________BCFCc_A ____CFBTBs_B_A_______________A_BCFBsCcCF_B_______________ACc_C_A __CcCcBs_A_A_________________A_BCFCFBtCc_A_A_A__________BsCc_A__ CcCFBsBi_B_____________________A_ACFCFCFCFCc_B_A_________B_A____ CcBTBs_B_A_______________________A_BBsCFCFCFCc_A________________ Bi_z_A_A___________________________A_B_BCFCFCcCF_B_A____________ _______________________________________A_B_B_CCFCc_A____________ _____________________________________________A_A_B_A____________ ________________________________________________________________ } # tile 111 (rancid jelly) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________BJBbBJBJBb____________________________ ______________________BJBbBJAhBbBJAhBJBJ________________________ ____________________BJBbBnCOCPBJBbBJBbBJBbBJ____________________ __________________BJBbCPCOCPCWAhBJBJAhBJAhBbBJ_A_A_A_A_A________ __________________BJBmCPCOCPBJBbBJBbBJBbBJBJAh_z_A_A_A_A_A_A____ ________________BJBbCPCOBJBbAlB_ARAlAhBJAhBJBbBJ_A_A_A_A_A_A____ ______________BJAhCPCOBJARAlB_AhAlB_AlB_AlBbBJBb_A_A_A_A_A_A_A__ ______________BbCPBbBJAhAlB_AhAlB_AlB_AhB_AlARBJBJ_A_A_A_A_A_A__ ____________BJBJCOBJARBVB_AlAlB_AhAlAhAlB_AhB_AlBb_A_A_A_A_A_A__ ____________BbBJAhAlB_AlAhB_AhB_AlB_B_AlB_AlAlAhB_Al_A_A_A_A_A__ __________BJAhAlB_AdARAdAlAlB_AlAhAlBJAhAdAdAdAlB_AhB__B_A_A_A__ __________BbAlB_ARAdAdAdAdB_AhAlB_AlB_AdAdAdAdARAeB_AlAl_A_A_A_A __________AlB_AhAeAdAeAdARAlB_AlAhB_AlARAdAeAdAdAdAhB_AlB__L_A_A __________AhAlAdAdAdANANANAdAdAdAdARAdANANANANANANANAdAdAhAl_A_A ________B_AlAdANANANANANANANAdAeAdAdANANANANANANANANANAdAdB__A_A ________AlB_ANANANANANANANANANARAdAdANANANANAN_A_A_A_A_LAeAdAl_A ______AlAhAlANANANABACABANANANAdAdAeANANABAC_A_A_A_A_A_A_AAdAh_z ______AlB_AMANAN_A_A_A_A_AABANAdAdAdANANAN_A_A_A_________LAdAl_A ______B_ADANAN_A_A_A_A_A_A_AANAdARAdANAD_A_A_A___________AAdB__L ____AhAlANAN_A_A_A_________A_AAeAdARB_Al_A_A_____________LAdAl_A ____B_ANAN_A_A_______________A_AAdAdAlB__L_______________AAl_L_A __AlAlAN_A_A_________________A_AAdAdARAl_A_A_A__________ARB__A__ AlB_ACAN_A_____________________A_AAdAdAdAlB__A_A_________A_A____ AhANAN_A_A_______________________A_zARAdAdAhAl_A________________ AN_A_A_A___________________________A_A_zAdAdB_Al_L_A____________ _______________________________________A_A_B_LAdAl_A____________ _____________________________________________A_A_L_A____________ ________________________________________________________________ } # tile 116 (swamp kobold) { _____________________________m__________________________________ ___________________h_q_______m_m________________________________ _____________________h_q_m___m_mAh______________________________ _____________________q_h_q_mAh_l_h_h____________________________ _______________________q_q_m_m_hAR_l____________________________ ______________________CM_q_mCuCu_lCu____________________________ ________________________CM_q_n_m_l_h_h__________________________ _________________________q_q_qAn_mBv_h__________________________ ___________________________l_q_m_nBa_h__________________________ ________________________CM_q_i_lAg_h____________________________ _____________________q_qCM_q_mAg_iAcAc_m________________________ ___________________q_m_qBv_m_m_hAcAcB__m_m______________________ ___________________m_m_qBa_m_nBWAcAcAcBa_m______________________ _________________q_m_i_q_q_q_mBWAzAc_lBZ_m_m____________________ _________________mAg_l_q_qBvB_AgAzAc_hAg_i_m____________________ _______________q_m_i___qBaBaAzBWAcAcAc__Ag_m____________________ _______________qBa_h__BaBaAzBaAgAcAcAc___h_m_m__________________ _______________mBa____BaBaAgBaBWAcAcAc___lAh_m_____A_A_A________ _______________mAg____BaBaBWAzAgAzAcAc_____h_mA__A_A_A_A________ _______________m_h____BaBaAgBWAzBWAcAc____Ba_m_A_A_A_A__________ _______________m_i____BaBaAzAzAgAzAcAc____Ba_m_B_A_A_A__________ ______________________BaBa_lBW___qAcAc___AAh_m_A_A_A_A__________ ______________________Ba_m_hB____m_mAc_A_A_A_A_z_A______________ _______________________m_m_l____Ah_m_h_A_A_A_A_A________________ _______________________qAh_l___L_q_qAR_L_A_A_A__________________ ______________________CM_q_h_A_A_q_mBa_A_A_A_A__________________ _______________________q_mAR_L_A_q_mBa_A_A_A____________________ _______________________q_m_l_A_B_q_m_l_A_A______________________ _______________________q_mAh_A_A_q_mAh_A________________________ _____________________B_q_m_h_A_z_q_m_h_A________________________ _______________________z_B_z_A___B_z_B__________________________ ________________________________________________________________ } # tile 117 (rock kobold) { ____________________________Bk__________________________________ __________________BDBk______BkBk________________________________ ____________________BDBkBk__BkBkBD______________________________ ____________________BkBdBkBkBDBDBDBD____________________________ ______________________CPBkBkBkBDBDBD____________________________ ______________________BkCPBkCuCuBDCu____________________________ ________________________BkBkBkBkBDBDBD__________________________ ________________________BkCPBkBkBkBDBD__________________________ __________________________BDBkBkBkBDBD__________________________ ________________________CJBnBDBdBDBD____________________________ ____________________BkBnBkBkBkBDBD_X_XBk________________________ __________________CPBkBkCJBkBkBD_X_X_XBkBk______________________ __________________BkBkCPBkBkBk_c_X_X_XBDBk______________________ ________________BkBkBDBkBkBkBk_c_c_XBDBDBkBk____________________ ________________BkBDBDCPBk_l_c_c_c_XBDBDBDBk____________________ ______________BkBkBD__Bk_h_h_c_c_X_X_X__BDBk____________________ ______________CPBDBD___h_h_c_h_c_X_X_X__BDBkBk__________________ ______________BkBD_____h_h_c_h_c_X_X_X__BDBDBk_____A_A_A________ ______________BkBD_____h_h_c_c_c_c_X_X____BDBk_A_A_A_A_A________ ______________BkBD_____h_h_c_c_c_c_X_X____BDBk_A_A_A_A__________ ______________BkBD_____h_h_c_c_c_c_X_X____BDBk_A_A_A_A__________ _______________________h_hBD_c__Bk_X_X___ABDBk_A_A_A_A__________ _______________________hBkBD_c__BkBk_X_A_A_A_A_A_A______________ ______________________BkBkBD____BkBkBD_A_A_A_A_A________________ ______________________BkBkBD___ABkBkBD_A_A_A_A__________________ ______________________BkBkBD_A_MBkBkBD_A_A_A_A__________________ ______________________BnBkBD_A_ACPBkBD_A_A_A____________________ ______________________CJBkBD_A_ABkBkBD_A_A______________________ ______________________BkBkBD_A_ABkBkBD_A________________________ _____________________zBnBkBD_A_ACPBkBD_A________________________ _______________________A_z_A_A___A_A_A__________________________ ________________________________________________________________ } # tile 118 (kobold warrior) { ____________________________AY__________________________________ __________________AAAw______AYAY________________________________ ____________________AAAwAY__AYAYAA______________________________ ____________________AwAAAwAYAAAA_zAA____________________________ ______________________AwAwAYAY_NAAAA____________________Bk______ ______________________AwAwAYCuCuAACu__________________CPBn______ ________________________AwAwAYAYAA_LAA________________BkCJ______ ________________________AwAwAwAYAXAAAA______________CPBk________ __________________________AAAwAYAYAA_z______________CPBk________ ________________________AwAwAAAA_NAA______________BkCPBk________ ____________________AwAwAwAwAJAA_zBsBsAY__________CPBk__________ __________________AwAYAwAwAYAYAABsBsBsAYAY______CJCPBn__________ __________________AYAYAwAwAYAYCFBsBsBsAAAY______CPBk____________ ________________AwAYAAAwAwAYAYCFCFBs_zAAAYAY__BkCPBk____________ ____________CPBkBkBdAAAwAwCcCFCFCFBsAAAA_LAY__CPBk______________ __________CPBWBSBWBvBDAwCcCcCFCFBsBsBs__AAAYCPCKBm______________ ________BkBsBWBsBWBvBSBDCcCFCcCFBsBsBs__AAAJCPBk________________ ________BkBsBWBvBSBvBSBDCcCFCcCFBsBsBs___zAAAYBk___A_A_A________ ________BnBSBWBvBSBWBsBDCcCFCFCFCFBsBs____AAAY_A_A_A_A_A________ ________CJBSBvBWBsBWBsBDCcCFCFCFCFBsBs____AAAY_A_A_A_A__________ ________BkBvBsBWBsBWBvBDCcCFCFCFCFBsBs____AAAY_A_A_A_A__________ ________BnBvBSBvBWBsBvBDCcAACF__AYBsBs___A_LAY_A_A_A_A__________ __________BkBiBvBWBSBDCcAYAACF__AYAYBs_A_A_A_A_A_A______________ ____________BkBkBkBd__AYAJAA____AYAYAA_A_A_A_A_A________________ ______________________AwAYAA___AAwAYAA_A_A_A_A__________________ ______________________AwAYAA_A_AAwAJAA_A_A_A_A__________________ ______________________AwAY_z_A_AAwAYAA_A_A_A____________________ ______________________AwAYAA_A_AAwAYAA_A_A______________________ ______________________AwAYAA_A_AAwAYAA_A________________________ _____________________AAwAYAA_A_AAwAJAA_A________________________ _______________________A_A_A_A___A_A_A__________________________ ________________________________________________________________ } # tile 119 (Kroo the Kobold King) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________________AY__________________________________ __________________AAAw______CjAb________________________________ ____________________AAAwAb__CjAYAACj____________________________ ____________________AwCjBSC$CjCjCjCj____________________________ ______________________CjC$AYAwAAAIAI____________________________ ______________________BSAwAYCuCuAACp____________________________ ________________________AwAwAYAY_zAAAA__________________________ ________________________AwAwAwAYAYAA_L__________________________ __________________________AAAwAYAYAAAA____________AYAYAYAY______ ____AYAYAYAY__________CBBoAwAAAAAAAABoCBBoBoAYAYAYAYAYAAAA______ ____AAAAAYAYAYAYAYBoCBCYCYCYAwAMAAAwBoBoBoBNAYAYAAAAAA__________ _______zAAAAAYAYAYCBCjCbCCCYAzAwAwBoCBCBBaBNAAAA_z______________ __________AA_LAAAACYCbCZCxCYBoBoCBCBCBBoBoBN____________________ ______________AT_NCYCbCpCdCYCBCBCBBoCYCBByBN____________________ ______________ATATBoCsCYCbCYCBCYCYCBBoCBBoBo____________________ ______________ATATBoCBCYCYCYCYCbCYCBCBBoBoBo____________________ ______________ATATAqBoCYCYCCCYCYCYCYCBBoByBN___A_A_A_A_A________ ________________ATAqCBCjBrCYCBCYCBBoCBBoBoBN_A_A_A_A_A_A________ ________________ATAqBoCYCBCBCBCBCYBoBoBoBN_M_A_A_A_A_A_A________ ________________ATATBoCYCBCBCYCYCBBoCBBaBN_z_A_A_A_A_A_A________ __________________ATAwCBCjCBCYCYBoCBBNAq_A_B_A_A_A_A_A_A_A_A_A_A ____________________AwCBCBCBCjCBBNByAqAA_A_A_A_A_A_A_A_A_A_A_A__ ____________________AYAwBoCBCBBoBoBoAAAA_A_A_A_A_A_A____________ ____________________AYAYANBo_C_MBoAA_MAA_A_A_A_A_A______________ ____________________AYAYAA_A_A_A_AAAAAAA_A_A_A_A________________ ____________________AYAYAA_A_A_A_AAY_zAA_A_A_A__________________ ____________________AYAYAA_A_A_A_AAYAAAA_A_A_A__________________ _____________________AAA_z_A_A_A_AAYAY_L_A_A____________________ _______________________A_A_A_A_____A_A_A_A______________________ } # tile 123 (large mimic) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________AGAwBWBWBWBWBWAX______________________ ____________________AqAqATAqBiByBvBvBvBvBWBSAL_A________________ __________________AqBNAqAqBNBRBSBvBWBvBWBvBvBWAM_z______________ ________________AqBNBNBoBNBNAqATBSBWAzBWBWBvBvBW_z_$____________ ______________AqBNBNBNBoBoBNBNBNAqAcAzAcAzAzBWBWAz_A_$__________ ____________AqBNBNBNCBBoBoBoCuCpAuAAALAJAbAcAzBvAz_L_AAG________ __________AqBNBNBoBoBoBoBoCpCuCuBo_A_A_A_AAAAbBWBWAz_AAG________ ________AqBNBNBNBoBoBoBoCYCuCuCEAA_A_A_A_A_AALBWBWAz_AAG________ ________BNAqBNBoBoBoBoCpCuCuCEAA_A_A_A_A_A_A_AAAAzAz_AAG________ ________AqAqBNCBBNBoCpCpCuCEAJ_A_A_A_A_A_A_A_A_AAJAz_AAG________ ________AqAqBNBNCBCpCuCuCBAL_A_A_A_A_$______AG_z_LAz_AAG________ ________AqAqATAqCBCpCuCEAA_A_A_A_A_$___________A_zAA_z__________ _________AAXBRBRBRBRCBAA_A_A_A_AAG_________________A____________ _________AAzByBvBvBWAc_L_A_A_A_$________________________________ _________AAzBvBvBaBWAz_A_A_A_$__________________________________ _________AAbBvBvBvBWAc_A_A_A_$__________________________________ _________AAcBWBvBvBWAb_A_A_AAG__________________________________ ________AG_$AzBvBvBWAzAb_A_A_AAG________________________________ ________AT_AAMBvBvBvBWBWAJ_A_A_z________________________________ ___________$AAAzBWBWCNBiCNAd_z_z________________________________ __________Aq_AAJBvCLCVAuChBzAA_z________________________________ _____________AAABWBSAuAvAvBSAA_z________________________________ _______________z_zBzCoAuCoBz_L_z________________________________ _________________zAABbBSBbAZ_z_z________________________________ ___________________$_zAA_z_A_z__________________________________ _____________________z_z_$_z____________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 124 (giant mimic) { ________________________________________________________________ ________________________________________________________________ __________________________AXBSBWAzBWAzBWAvAG____________________ __________________ATAqATAqBRByBvBvBvBvBvBWAwAw_z_$______________ ________________AqBNAqAqBNBNBiBvBvBvBvBvBvBvBaAc_$AG____________ ______________AqBNBNBNAqBNAuAqAwBWBWAzBWBWBvBvCIAc_A_A__________ ____________AqAqBNBNBoBoBNAqATAqAwAzAzAzAzBWBWBWBWAA_z__________ __________AqAqBNBNBoBoCBBNBNCBAqAYAzAzAcAzAzAzBWBvAb_A_z________ ________AqBNBNBNBoBoBoBNBoCuCuCpAu_NAA_$ALAbAzAzBWAzAA_A_$______ ______AqBNBNBNBoBoBoBoBoCYCuCuCuAq_A_A_A_A_AAbAzBWBWAz_A_$______ ____AqAqBNBNBoBoBoBoBoCYCuCuCuBRAA_A_A_A_A_A_zAcBWBWAc_z_$______ ____AqBNBNBoBoBoBNBoCYCuCuCuBRAA_A_A_A_A_A_A_L_zAwAzAz_A_$______ ____BNAqAqCBBoBoBoCYCuCuCpBR_T_A_A_A_A_A_A_A_A_A_AAcAz_A_$______ ____AqAqAqBoBoBoCYCuCuCuBR_Q_A_A_A_A_z_z_z_z_z_z_AAAAz_L_$______ ____AqAqAqAqBNCpCuCuCuBR_T_A_A_A_A_z_____________z_zAb_A_$______ _____zAcAqAqBNBNCYCuBRAA_A_A_A_A_z_________________$_LAG________ _____AAYBSBSBiBSBrBr_Q_A_A_A_A_z_____________________$__________ _____AAcBvCIBvBaBWAM_A_A_A_A_z__________________________________ _____AAcBvBvBvBvAzAc_A_A_A_z____________________________________ _____AALBvBvBvBWBWAc_A_A_A_z____________________________________ _____AAMBWBvBvBvBWAb_A_A_A_z____________________________________ _____zAAAzBWBvBWBWAzAJ_A_A_AAG__________________________________ _______AAABvBvBvBvBWAzAA_A_A_A__________________________________ _______z_NBWBWBvBvBWBWAz_z_A_AAG________________________________ ______AG_$ALBWBWBvClBSCiAz_z_AAG________________________________ ______Aq_$_AAzBWCUBxAuBwCTAz_AAG________________________________ _________$_zAcBWBSAvAvAvB_Az_AAG________________________________ __________AG_ABWCOCmAuCVCiAz_AAG________________________________ _____________$_ABWCTAzBzAu_A_AAG________________________________ _______________$_AAvAuAu_A_A_$__________________________________ ______________ATAG_A_A_A_A_$____________________________________ ________________________________________________________________ } # tile 128 (pixie) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________BlBn____________ ____________________________________________BnBl____BABA________ __________________________________________Bl______BABABA________ ____________BnBl__________CfCjCjCjCjCj__________BABABA__________ ______BABA______BlBn____CjCjCjCjCjCj__CjCj__BABABABA____Bn______ ______BABABABA______Bn_____pClClCjCjCj__BFBABABABA____Bl________ ____Bn__BABABABABA________CnCiCiCjCjCjCjBABABABA______Bn________ ______Bl____BABABABA________CiCn____BlBABABABA______Bn__________ ________Bn__BABABABABABA____CnCi____BABABABA______Bl____________ __________Bl____BABABABABACi_m_m_lCiCiClBA______________________ __________________BABABACiCn_n_n_l_lCiCnCiClBABABABABA__________ ______________Bn________ClCi_l_n_l_lBlBACiCnClClBABABABABA______ __________BnBl________BACiCnBl_l_l_l______BlCnCiBABABABABA______ ________Bn________BABACnCiBlBA___l_l_l__________________________ ________________BABACnCiBABA_____l_l_l_l______BnBlBnBlBnBlBn____ ____________BABABABABABlBA____Bn___n_n_l_n______________________ __________BABABABABABABA____Bl___n_n_l_n_l_l____________________ __________________________Bn_____n_l_l_nCiCn____________________ ____________________BnBlBn______CiCn______CiCi__________________ ________________________________Cn__________CnCi________________ ______________________________CiCi___________p_p________________ _______________________________p_p______________________________ ________________________________________________________________ _________________________A_A_A_A_z_A_A_A________________________ _________________________A_A_A_A_A_A_A_A________________________ _____________________________A_A_A_A_A_A_A_A_A_A_A_A____________ _____________________________A_A_A_A_A_A_A_A_A_A_A_A____________ ________________________________________________________________ ________________________________________________________________ } # tile 131 (Aphrodite) { ________________________________________________________________ ________________________________________________________________ ____________________________CfCjCfCj____________________________ __________________________CfCjCfCjCfCf__________________________ __________________________ClClCnCfCICjCf________________________ __________________________BoClBoCiCfCfCfCjCf____________________ __________________________ClCXCiCiCcCjCcCICfCfCjCf______________ __________________________CiClCnCiCfCICjCfCjCf____CjCf__________ ______CfCj____________ClCXChCiCiChChCfCfCI____CfCj______________ ____CfCQCPCj________ClCiCiChCnChChClClCfCfCfCj____CfCf__________ ____CrCVBnCj________CXCiChChChChCoCgClCl____CfCfCj______________ ____CfBnCQCf______ClCn__CoChCoChChCeCnCl__________CfCj__________ ______CfCrCf____ClCg____ChCeCeChChCh__CnCl______________________ __________CjCf__ClCn____CeChChCeChCe____CgCl____________________ ____________CfClCi________ChChChChCe____CiCl____________________ ____________ClCi__________ChChChCeCh______CnCl__________________ ____________Cn__Cf________ChChChCeCo________Ci__________________ ________________________CeC$ChCoCmChChChCe______________________ ________________________ChChChChChCeChChChCeChChCh______________ ______________________ChCeChChCeChChChCeChCoChChCeCeCoChCh______ ______________________ChChChChChCeChChChCoChChChChCo_VAD_Y_Y____ ______________________CoChChChCoChCoCoChCeChChChCo_Y_Y_Y_Y_Y____ ____________________ChChChChCoChCeChChChChChChCo_V_Y_Y_Y________ ____________________ChCeChChChChChCeChChChCeCh_Y_Y_Y_Y__________ ____________________ChChCeChChChCeChCeChChC$_YAD_Y_____A_A_A_A__ ____________________CoCoChCeChChChCoCoCh_Y_Y_Y_A_A_A_A_A_A_A_A__ ___________________A_z_ACoChChCoCoCG_A_B_z_A_A_A_A_A_A_A_A_A_A__ _________________A_A_A_ACnCn_B_zBwCn_A_A_A_A_A_A_A_A_A_A_A_A____ _________________A_A_ACnCn_A_ACnCn_A_A_A_A_A_A_A_A_A_A_A________ _________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A____________ _________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A________________ ___________________A_A_A_A_A_A_A_A_A_A_A________________________ } # tile 164 (Jumbo the Elephant) { ____________________________________________________Bk__________ ______________BkBk________________________________BkBkBk________ ______________BkBk__________________________________BkBkBk______ ____________BkCJBn____________________________________BkBk______ ____________BnBkBk______________________________________Bk______ ____________CJBk________________________________________Bk______ __________BkBnBk________________________________________Bk______ ________BkCPBk______________________CzCyCzCyBdBd______BkBk______ ________BkBkCJ______BkBkBk________CvCvCaCvCvCzBKBd__BdBk________ ________CPBkBd____BkBkBkBkBkBkBkCjCjCjCjCjCjCvCzBdBdBd__________ ________BkBkBd__BkCPBkBkCPBdBkBdBkBkBkBkCjCjCjCvCzBkBd__________ ________BnBkBdBkBkBkCPBkBkBdBkBkCPBkBkCOBkCjCjCjCaCzBd__________ ________CJBkBkBkBnCJBkBn_ABdBkBkBkCOBlBkBkBkBkCjCvCzBKBd________ ________BnBkBdCJBkBkBk_z_ABdBkBkBkBkBkCPBkBkBkCjCvCzBkBdBd______ ________BkCPBkBkBnBkBk_MBkBkBkCKBmBlCJBkBnBkBdCvCrBkBkBdBd______ __________BkBkBkCJBkBkCJBkBkBmBkBkBdBkBmCJBkBkCzBkBkBdBkBdBd____ __________CPBkBkBkBdBnBkBdBkBkCKBkBmBxBlBmBkBdBdBdBkBdBdBdBd____ __________CoBdBkBdBkBkCoCmBkBdBdBdCJBkBkCKBdBkBdCKBkBkBdBkBd____ ________CoCoCmCmBdBdBkCoCmBkBdBdBdBdBkBdBdBdBdBdBkBdBkBdBdBd____ ______CoCoCmCmBkBkBdCoCoCmBdBdBmBdBkBdBkBdBd____BdBdBkBdBdBd____ ____CoCoCmCm__BdBdBdCoCmCmBkBdBdBkBkBkBdBdBk____BkBdBkBdBkBd____ CoCoCoCmCm____BkBkCoCoCmBdBdBkBkBdBkBkBdBdBd____BkBkBkBkBdBd____ CmCmCmCo______C$CoCmCmBdBd__BdBdBkBdBkBdBkBd____BkBkBdBdBdBd____ ______________CmCmCmBdBd______BkBkBdBkBdBdBd____BdBkBdBkBkBd____ ____________BkBkBkBkBdBdAOABABBkBkBdBdBdBdBdBdABBkBkBkBkBdBdAB__ __________ABBdBdBdBdBdBdABAOABBdBdBkBdBkBdBdBkABBdBdBkBkBdBdAOAB ________ABAOBkBkBkBdBkBdABABAOBkBkBkBdBdBdBdABAOBkBkBkBdBdBdABAB ______AOABABBkBkBkBdBdAOABAOABBdBkBdBkBkBdBdAOABABBkBkBkABAOABAO ______ABABAOABABAOABABABABABABBkBkBdBkBkBdAOABABAOABAOABABABAB__ ________ABABAOABAOABAOABAOABAOAOBkBkBkABABABABAOABABABABAO______ __________ABABABABAOABABABABABABAOABABAOABAOABABAOABAOAB________ ____________________ABAOABAOABAOABABAOABABABAOABABAB____________ } # tile 166 (catoblepas) { ________________________________________________________________ ________________________________________________________________ ________________________________BABABABABABABABA________________ ______________________________BABABABABABABABABAA$______________ ____________________________BABABlBABABABABABABABAA$____________ __________________________BABABABABAA$BKA$A$BABAA$BK____________ ________________________BABABMBABA__________BABABABAA$__________ ______________________BABABABABA______________BMBAA$BK__________ ____________BABABABABABAA$A$A$A$______________BABABAA$__________ __________BABABABlBABABABKAiBKA$BA_A_A________BlBAA$A$__________ ________BABABABAA$A$BMBABABABAA$BAA$_A_ABA____BABABABK____BA____ ______BABABABAA$BKA$BABABABABABABABABA_LBABA_LBABABABA__BABA____ ____BABABABABAA$ApBABABABABABABABABABA_ABABABABABMA$BABABABA____ ____BABMBABAA$BKBABABABABABABABABABABA_LBABABlBABAA$BABABlBA____ ____BABABABAA$AiBABABABABABlBABABABABA_ABACuCFCABABACFCACuBA____ ____BlBABAA$BKA$BABABABABABABABABAA$_A_zBABiCuCABABACACuBsBA____ ____BABABABAA$BKA$BABABABABABABABAA$_A_ABABsBiCuBABACuBiBiBA____ ____BABABABAA$A$BABABABABABABA_AA$BK_A_LBABABABABnBABABABABA____ ______BABABABABKA$BABABABABA_L_ABAA$_A_A_ABABABABABABABABM______ ________BAA$BAA$BABABABABA_A_A_AA$A$_A_A_A_LBABABABABABA________ ________BAA$BKA$BA_ABABA_L_A_A_AA$BK_A_A_A_A_A_ABABA____________ ________BABAAiA$BABABABA_A_A_A_AAiA$_A_A_A_A_A_A_A_A_A_A________ ________BABl_A_AA$A$BABABA_ABdBABdBKA$_A_A_A_A_A_A_A_A_A_A_A____ ________BABA_A_A_A_ABKA$BABABABdBABd_A_A___A_A_A_A_A_A_A_A_A____ ________BABA_L_A_A_ABABAA$BKBdBABdBA_A_A_____A_A_A_A_A_A_A_A____ ________BABA_A_A____BABA_A_AA$A$Bd_A_A_A_____A_A_A_A_A_A_A______ ________BABMBA_A____BABABA_A_________________A_A_A_A_A_A________ ________BABABA_A____BABABA_A___________________A_A_A_A__________ ________A$_A_A_A____A$_z_A_A____________________________________ _________A_A_A_A_____A_A_A______________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 168 (rabbit) { ________________________________________________________________ _______________________________________________A________________ _____________________________________________A_A________________ ____________________ClCW___________________A_A_____A___A________ __________________CXCWCO_________________A_A_A___A_A_A__________ __________________ClCi____ClCX___________A_A___A_A_A____________ ________________ClCWCO__ClCXClCW_______A_A_A_A_A_A_A____________ ________________CXCi__ClCXClCW_______A_A_A_A_A_A_A______________ ________________CWCOClCXCW_________A_A_A_A_A_A_A_A_A____________ ______________ClClClCXCl___________A_A_A_A_A_A_A_A_A_A__________ ____________CXCXCXClCX_______________A_A_A_A_A_A_A_A_A_A________ __________CmCt_MClCXCl_________________A_A_A_A_A_A_A_A_A________ ________CeClCXCXClCXClCiCO___________A_A_A_A_A_A_A_A_A_A_A______ ________ClClCmClCXClCWCOClCXClCXClCX_A_A_A_A_A_A_A_A_A_A_A______ ________CXClClClCXClCiCWClCXClCXClCXCl___A_A_A_A_A_A_A_A_A______ __________COCiClCiCOCWCWClCXClCXClCXClCX_A_A_A_A_A_A_A_A_A______ __________________CiClClCXClCXClCXClCXClCW_A_A_A_A_A_A_A_A______ ________________COCXClCXClCXClCXClCXClCXClCW_A_A_A_A_A_A_A______ ______________CiCOClCWClCXClCXClCXClCXClCXCi_A_A_A_A_A_A________ ______________COClCXCiCOClCXClCXClCXClCWClCWCi_A_A_A_A__________ ______________CXCWCO____CXClCXClCXClCXClCWClCO_A_A_A_A__________ ____________CXClCi________CXClCXClCXClCiClCOCW_A_A_A_A__________ ______________CW__________ClCXClCXClCXCWCWCOCiCl_A_A____________ ________________________ClCXClCXClCXCiClCOCiCXClCX_A____________ ______________________CXCiCOCWClCXCWClCOCW_A_ACl________________ ____________________ClCOCO_ACXClCiClCOCi_A_A____________________ ____________________CiCO_ACXClCWCOCW_A_A_A______________________ ______________________CXClCWCi_A_A_A____________________________ ______________________ClCWCO_A__________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 169 (black rat) { ________________________________________________________________ ________________________________________________________________ ______________________________________________________ABABAB____ __________________________________________________ABABAB__ABAB__ ________________________________________________ABAB_________O__ ________________________________________________ABAB________AB__ ________________________________________________AB_M________AB__ ________________________________________________ABAB______AB____ ________________________________________________ABAB____________ ___________________________________________________MABAB________ ____________________________________________________ABAB_M______ ____________Al______Al________________________________ABABAB____ __________AlBD____AlBD____________AlBJAOAlBJAOAl________ABABAB__ __________BJAl__AlBJAl________BJAlAeAeAlAeAeAjAeBJAl_______MAB__ ________AlAeAlBDAlAj______AlAeAlAeAlAeAjAlAlAeAlAeAeAlAe__ABABAB ________BDAlAeAOBJAl__BJAlAeAlAeAjAeAOBJAeAeAOBDAlAlAeAlAl___MAB ______AlAeAeAlAjAlAeAlAjAeAlBDAOAeAeAlAeAlAeAlAeAeAeAlAeAeBJABAB ____AlAeAlAe_wAeAeAeAlBJAlAeAlAeAlAeAeAlAeAlBDAOBJAlAeAeAlAe_MAB ____AeAlAe_w_tAlBJAeAeAlAeAeAeAlAeAeAlAeAlBDAOAlAeAeAeAlAeAeABAB __AlBDAlAe_tAeAeAeAOAeAeAeAeAeAeAlAeAlBDAlAeAeAeAlAlAeAeABABABAB __AeAlAeAeAlAlAlAeABABAOAlAeAlAeAeAeAlAlAeAeAOAeAeAeAeAB_MAB_M_A __BJAlAeAlAeAjAqABAB_ABDAlAeAeABABABABBDAlAeABABAeAe_MABABAB_z_A __AlAjAeAeAlAqABAB_M_AAeAlAeAOAB_MABABAlAlAeAOAeABABABABA__A_A_A _AAeAeAeAeAqAqABAB_A_A_ABJAlAeABABABABABAlAeAeAOA_AB_MAB_A_A_A_A _ACmAOAeAO_AABAB_A_A_A_AAeAlAe_A_AAB_M_zAlAeAeAe_A_A_A_A_A_A_A_A _ACmCVCm_A_A_A_A_A_A_A_AAlAlAeAe_A_A_A_ABDAlAOAe_A_A_A_A_A_A_A_A _ACm_ACm_A_A_A_A_A_AAlBDAlBDAOAB_A_A_AAlAlBJAe_A_A_A_A_A_A_A_A__ __Cm_ACm_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_B_A_A_A_A_A_A__________ _______________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A______________ _____________________A_A_A_A_A_A_A_A_A_A_A_A____________________ ________________________________________________________________ ________________________________________________________________ } # tile 172 (rabid rabbit) { ________________________________________________________________ _______________________________________________A________________ _____________________________________________A_A________________ ____________________ClCW___________________A_A_____A___A________ __________________CXCWCO_________________A_A_A___A_A_A__________ __________________ClCi____ClCX___________A_A___A_A_A____________ ________________ClCWCO__ClCXClCW_______A_A_A_A_A_A_A____________ ________________CXCi__ClCXClCW_______A_A_A_A_A_A_A______________ ________________CWAeClCXCW_________A_A_A_A_A_A_A_A_A____________ ______________ClAlAlCWCl___________A_A_A_A_A_A_A_A_A_A__________ ____________CXAlAeClCl_______________A_A_A_A_A_A_A_A_A_A________ __________CXCl_AClCXAe_________________A_A_A_A_A_A_A_A_A________ ________CoCX_zCXCXClCXAeAe___________A_A_A_A_A_A_A_A_A_A_A______ ________CXCXCtCXClCXClCOCWAlAlAlAlAl_A_A_A_A_A_A_A_A_A_A_A______ ________CmCuCXCXCXClCOClClAeAeAeAlAlAl_A_A_A_A_A_A_A_A_A_A______ ________CuCOCWClCOCiCWCiAeAeAeAeAeAeAlAl_A_A_A_A_A_A_A_A_A______ __________________CWClCXAeAeAeAeAeAeAeAeAl_A_A_A_A_A_A_A_A______ ________________COClClAlAlCXClCXAeAeAeAeAeAe_A_A_A_A_A_A_A______ ______________CiCOCXCWClClCXClAlAeAeAeAeAeAeAe_A_A_A_A_A________ ______________COCXClCOCiCXClCXAeAeAeAeAeAeAeAe_A_A_A_A__________ ______________ClCWCi____ClCXClAlAeAeAeAeAeAeAe_A_A_A_A__________ ____________CXClCO________ClCXClAlAeAeClAlAeAO_A_A_A_A__________ ______________CW__________CXClCXClCXClCWClAeAeCX_A_A____________ ________________________ClCXClCXClCXClCWCOCiAeClCX_A____________ ______________________CXCiCOCXClCXCWCiCOCW_A_ACX________________ ____________________ClCOCO_ACXClCWClCOCi_A_A____________________ ____________________CiCO_ACXClCWCOCi_L_A_A______________________ ______________________CXClCWCi_A_A_A____________________________ ______________________ClCWCO_A__________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 173 (pack rat) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________________AeAeAeAeAeAeAeAe____________________ ________________________AeAeAe____________AeAeAeAe______________ ____________________AeAeAe____________________AeAeAe____________ ____________BdBd__AeAe____________________________AeAe__________ ____________BdBd____________________________________AeAe________ ____________BdBd______________BdBdBJAjBJBd__________AeAe________ __________BdBJBdBd______BdBJAlBdAjBdBdBdAlBDBd______AeAe________ ________BdBdBdBdAl__BdBJAjBdBdBJAlBDAlBJBdBdBdBd____AeAe________ ______BdBJ_AABBDAjBdBJBdBdAlBDBdBdBdBdAjBJAlBDAl__AeAeAe________ ____BdAjBdABAlBdBJAlBdAlBDBdBdBDAlBdBJBdAlBdBdBDAeAeAe_A________ ____BdBdBJAjBJAjAeAeAeBDAlBDAlAlBkAlBDAlBDAlBDAOAeAeAe_A________ ______CmAlBDAlAeAe_AAeBDAlAeAeAeBdAlBDAeAeAeAeAeAe_A_A_A________ _____ACm_AAeAeAe_A_A_AAlBDAeAeAeAeBDAlBDAeAeAe_A_A_A_A__________ ___A_ACm_A_A_A_A_A_A_ABdAlBDAeAeAeAeBDAlAe_A_A_A_A_A____________ _____A_A_A_A_A_A_ABdBdBdBDAO_A_ABJAlAjBJAj_A_A_A_A______________ ___________A_A_A_ABdBdBDAlAe_A_A_ABDAlBJ_A_A_A_A________________ _______________A_A_A_A_A_A_A_A_A_A_A_A_B_A_A_A__________________ _____________________A_A_A_A_A_A_A_A_A_A_A_A____________________ ________________________________________________________________ ________________________________________________________________ } # tile 208 (maggot) { ________________________________________________________________ ________________________________________________________________ ______________________BLBL____CWCWCOCWCW____BLBLBLBLBLBL________ __________________BLBLBLBL__COCWCOCWCWCOCOCOCWCWBLBkBLBL________ ________________BLBLBkBLCWCWCWCiClCOClCWClCOCWCOCWBLBLBLBLBL____ ________________BLBLBLCWCiCWClCOCWCOCWCOCWCiCWCOCO_zBLBLBkBL____ ________________BLBLCWCOCWCOCWCOCOCOCOCOCOCOCOCO_A_ABLBLBLBL____ __________________BLCOCWClCOCOCOCOCOCNCO_A_A_A_A_ABLBLBkBLBL____ __________________BLCWCWCOCO_L_A_A_A_A_A_ABLBLBLBLBLBLBLBL______ __________________BLClCOCWCWCW__________________BLBkBLBk________ ____________________CWCWClCWCW_ACWCWCOCW________________________ ____________________CWCOCWCOClCOCWCOClCOCWCW____________________ ____________CWCWCWCOCNCWCOCWCWCOClCWCWCWCOClCW__________________ ________CWCOCWCOCWCWCOCOCWClCOCWCWCOCOCOCWCWCOCW________________ ______CWCOClCWCOClCOCOCOCNCWCOClCOCl_ACOCOCiCWCW_A______________ ______COCOCOCOCOCOCNCO_A_ACOCWCWCWCW_ABLCOCOClCOCW______________ ________COCOCO_A_A_A_A_A____CWCOCWCO_ABLCOCOCWCOCl_A____________ ___________A_A_A__________CWCOCWCiCW_ABL__COCWCXCW_ABL__________ ______________________CWCWClCWCOCl_A_ABL__CWClCWCO_ABL__________ ____________________COCWCOCWClCOCW_ABLBL__CWCWCiCW_ABL__________ ____________BL__CWCWCWCOClCWCWCW_A_ABLBL__COCWCOCW_ABLBL________ __________BLBLCOCWClCOCWCWCO_A_A_ABLBLBL__ClCOClCW_ABLBL________ __________BLBkCWCWCWClCWCl_A_ABLBLBLBk____CWCWCWCO_ABLBk________ ________BLBLBLClCOCWCOCW_A_ABLBkBLBL______COCWCWCX_zBLBL________ ________BLBLBLCOCWCOClCO_A______________CWCWCOCOCO_ABLBL________ ________BkBLBLBLCOCOCWCWCWCW______CWCWCOClCOClCOCO_ABLBL________ ________BLBLBLBLCOCOClCWCWCiCWCOCWClCOCWCWCWCOCN_A_ABLBk________ __________BLBkBLBLCOCOCWClCOCWClCOCWCWClCOCOCO_A_ABLBL__________ ______________BLBLBLCiCOCOCOCWCOCOCOCOCOCOCN_A_ABLBLBL__________ ________________BLBLBLCWCOCOCOCOCOCNCO_A_A_A_ABLBL______________ _________________________A_L_A_L_A_A_A_A________________________ ________________________________________________________________ } # tile 209 (dung worm) { ________________________________________________________________ ________________________________________________________________ ______________________BiBV____CFBtCFBtCF____BZBsBTBsBVBs________ __________________BTBsBtBs__BtCFBtCLCFCGBZBtCFBtBsBtBsBT________ ________________BsBZBsBVCFCGCFCLCABtCFBtCFCGCFCGBvBsBVBsBZBs____ ________________BTBsBtCFBtCIBtCFBtCFCLCFCGCFBZBsBt_BBsBtBsBT____ ________________BsBVCFBtCFCGCFBtBZBtBsBtBvBtCFBt_L_ABZBsBTBs____ __________________BsCGBvCGBsBZBtBsBsBVBi_A_A_A_A_zBTBsBVBsBt____ __________________BZCFBtCFBt_L_z_A_B_z_A_ABZBsBTBsBZBtBsBT______ __________________BtCFCGBvCGCF__________________BsBTBsBs________ ____________________CFCGCFCLBt_LCFBtCFBt________________________ ____________________BtBvBtCFBtCFBtCFCGCIBtCF____________________ ____________CFBtCFBtBvCGCFCGBvCGBvCGBvBtCFCGCL__________________ ________BtCFCGBvCGCFBZBsBtBvCFCGCFBtCFBtCFBtCFBt________________ ______CFBtCIBtCFCGBZBtBsBZCGCFCLCFBt_LBZCFBtCFCF_B______________ ______BZBtCFBtBvBtBsBs_B_zCFBtBsCGCF_BBsBtCIBtCGCF______________ ________BsBVBs_B_A_A_B_A____CGCFBtBv_BBTBsBtCFBvCG_A____________ ___________A_A_A__________BtBsCLCFCG_zBZ__BvBtCGCF_BBs__________ ______________________CFCGCIBtCFBt_L_ABs__CGCFCLBt_LBT__________ ____________________CFBtBvCGCFCGCF_BBsBT__CLCFBtCF_ABs__________ ____________Bi__BtCFCGCFCGCFCLBt_L_ABVBs__BtCFCGBv_BBZBt________ __________BsBZCGCFCLCFBtBvBt_A_A_BBsBsBt__CFBtCFCG_BBsBi________ __________BTBsBtCFCGCFCLCF_B_ABsBVBsBV____CLCFCGBv_ABtBi________ ________BsBZBsCGBvBtCFBt_B_zBVBsBTBs______CFBtCFCG_BBsBZ________ ________BtBsBTBvCGCFCGBv_z______________BtCFCGBvBZ_zBTBs________ ________BsBVBsBtBsBtBvCGCFBt______BtCFCGCFBtBvBtBs_ABsBt________ ________BTBsBZBsBtBvCGCFCLCFBtCFCLCFBtBvCGCFBtBs_B_ABZBi________ __________BtBsBTBsBZBsCGCFBtCIBtCFBtCLCFBtBsBZ_A_BBiBt__________ ______________BsBtBsBtBvBtCFBtCFBtBsBsBtBvBt_A_ABsBVBs__________ ________________BsBVBsBtBsBtBvBtBsBtBZ_A_A_A_BBsBT______________ _________________________L_A_A_A_L_A_A_A________________________ ________________________________________________________________ } # tile 210 (acid worm) { ________________________________________________________________ ________________________________________________________________ _______________________w_w____BfC_BfC_Bf_____w_w_w_w_w_w________ ___________________w_w_w_w__C_BGC_BfBHC_BGBzC_Bf_w_w_w_w________ _________________w_w_w_wC_BBBfC_BHC_BfC_BBBfBfC_BG_w_w_w_w_w____ _________________w_w_wC_BfBfBHBfBfC_BfBHC_BGC_BHBz_B_w_w_w_w____ _________________w_wBfC_BGC_BfC_BzBGC_BGBHC_BHBG_z_A_w_w_w_w____ ___________________wBHBfC_BHBGC_AoC_BHBz_A_A_A_z_A_w_w_w_w_w____ ___________________wC_BfC_BG_C_B_L_A_A_A_A_w_w_w_w_w_w_w_w______ ___________________wC_BfBHC_Bf___________________w_w_w_w________ ____________________BfBfBfBfBf_AC_BfC_Bf________________________ ____________________C_C_BfC_BfC_BfBHBGC_BfC_____________________ ____________BfC_BBC_AoBfC_BHBfC_BGC_BfBHC_BBBf__________________ ________BfC_BGC_BfBGC_BzBGC_BfBHC_BfBzC_BfBBC_Bf________________ ______C_BGBHC_BfBfBHC_BGBHC_BfBfBfC__MBGBzBfC_BG_C______________ ______BHC_C_BHBGBzBGBz_B_BBGC_C_BfBf_B_wBGC_BHBfC_______________ ________BGBzBGA__L_A_L_A____BfBHC_C__C_wC_BHC_BfBf_B____________ ___________A_A_A__________C_BfC_BGBf_B_w__BGC_BfBf_A_w__________ ______________________C_BBBfC_BfBH_z_A_w__C_BBBfC__B_w__________ ____________________BfBGC_BfBfBfC__A_w_w__BfBBC_Bf_A_w__________ _____________w__C_BfC_BHBfC_BBBf_B_A_w_w__C_BfBHC__A_w_w________ ___________w_wBfBfBBC_BfC_Bf_B_B_A_w_w_w__C_BfC_Bf_A_w_w________ ___________w_wC_BHBfBfBfBf_C_B_w_w_w_w____BBBfBfC__B_w_w________ _________w_w_wC_BfC_BfC__B_A_w_w_w_w______BGC_BfBf_A_w_w________ _________w_w_wBGC_BHBfC__B______________C_BfBHC_BG_B_w_w________ _________w_w_w_wBzBfC_BfBfBf______BfC_BfBHBfC_BGBH_A_w_w________ _________w_w_w_wBGC_BHBfBfC_BfC_BGBfC_BfC_C_BHAo_L_A_w_w________ ___________w_w_w_wBzBGBfC_BfBHBfC_BfBHC_BfBzBG_L_A_w_w__________ _______________w_w_wBHC_BGC_C_BfBHC_BGC_AoC__B_A_w_w_w__________ _________________w_w_wC_BHBGBzBGBzBGBz_B_L_B_A_w_w______________ _________________________A_A_M_L_A_A_A_A________________________ ________________________________________________________________ } # tile 211 (bloodworm) { ________________________________________________________________ ________________________________________________________________ ______________________CBCB____CYCYCYCYCY____CBCBCBCBCBCB________ __________________CBCBCBCB__CYCYCYCbCpCbCBCECYCYCBCBCBCB________ ________________CBCBCBCBCYCuCYCbCpCCCpCYCuCpCYCbCYCBCBCBCBCB____ ________________CBCBCBCYCYCuCpCYCYCpCbCpCCCbCpCCCE_ACBCBCBCB____ ________________CBCBCYCbCYCbCuCCCbCYCCCbCYCYCECY_B_BCBCBCBCB____ __________________CBCYCYCpCCCYCbCCCYCECB_B_B_B_B_ACBCBCBCBCB____ __________________CBCYCbCYCb_B_A_A_L_B_B_ACBCBCBCBCBCBCBCB______ __________________CBCpCZCYCYCu__________________CBCBCBCB________ ____________________CYCuCuCuCu_ACYCYCYCY________________________ ____________________CbCYCYCbCYCYCYCbCpCbCYCY____________________ ____________CYCYCuCYCCCpCbCYCYCbCZCYCYCYCpCuCu__________________ ________CYCYCbCYCuCbCYCECYCpCCCpCYCpCECCCbCuCYCY________________ ______CYCYCYCpCYCuCYCCCbCCCbCpCbCYCb_CCYCYCbCYCb_B______________ ______CbCYCbCCCbCCCECE_A_ACpCYCYCpCY_BCBCECpCCCYCY______________ ________CCCECY_B_z_A_B_A____CYCYCCCp_MCBCYCYCbCpCu_B____________ ___________B_A_A__________CpCbCpCbCY_ACB__CCCYCuCu_ACB__________ ______________________CYCuCuCYCYCp_O_BCB__CpCuCuCY_MCB__________ ____________________CYCYCYCuCuCbCY_ACBCB__CuCuCbCY_ACB__________ ____________CB__CYCYCpCbCCCpCuCu_C_BCBCB__CYCYCYCY_MCBCB________ __________CBCBCYCuCuCbCpCpCY_B_B_ACBCBCB__CbCpCbCY_ACBCB________ __________CBCBCYCYCuCuCuCu_O_ACBCBCBCB____CuCuCuCY_CCBCB________ ________CBCBCBCYCbCYCYCY_B_ACBCBCBCB______CYCYCuCu_ACBCB________ ________CBCBCBCYCCCpCbCY_M______________CYCYCZCbCY_BCBCB________ ________CBCBCBCBCbCpCYCYCuCu______CYCYCYCpCbCYCYCE_ACBCB________ ________CBCBCBCBCYCCCbCuCuCYCYCYCYCuCbCYCCCpCECC_A_BCBCB________ __________CBCBCBCBCbCYCuCYCYCbCYCbCuCYCYCpCbCY_A_ACBCB__________ ______________CBCBCBCYCCCbCYCZCpCCCYCbCCCECC_L_ACBCBCB__________ ________________CBCBCBCbCYCYCECYCbCCCE_A_z_A_ACBCB______________ _________________________C_M_B_A_A_A_z_A________________________ ________________________________________________________________ } # tile 212 (tunnel worm) { ________________________________________________________________ ________________________________________________________________ ______________________________COCNCOCOCO____BdBdBdBd____________ ______________________BdBd__CNBkCOCOBkCOBzBzCOCOBdBdBd__________ ____________________BdBdCOCOCOCNCOBkCNCNCOCOCOCOCOBdBdBd________ __________________BdBdCOCTBmCOBjBzCNCOBkCOBjCOBzBj_ABdBd________ __________________BdCNBmBzCOCNBzBzBbBzBzBzBzBzBz_M_ABd__________ __________________BDCOCJCNBzBzBzByBbCLBb_z_L_A_A_ABd____________ __________________BdBzBzCOBz_A_A_A_L_L_A_ABdBdBdBd______________ __________________BdCOCOBmCNCO__________________________________ ____________________CNCJCOBzBz_ACNCOBzCO________________________ ____________________BmCOBzCOBzCNBkBzBbBzCNBz____________________ ____________BbBzCXBzBaCNBkCNBbCOBZBzBzBbBzCOCN__________________ ________BzBZAzBzBbBzBzBbCNBjCNBzCNBzBzBzBZCOBzBz________________ ______BzBzBbBZBzCOBZBzBaBzCNBzCOBmCN_ABzBZBzBzBz_A______________ ______BZBaBbBbB_BaAzBa_A_ACNBzBzCJCN_ABjBbBzBzBzBz______________ ________AcAgAz_N_A_A_A_A____BzCNBbBz_ABdBZBbBZCNBz_A____________ ___________A_A_A__________BzBbBzBzCO_ABd__BZBbBzB__ABd__________ ______________________BzCNCOBzCNBz_B_ABd__BzBzBzBz_ABd__________ ____________________CNBbBzCOBzCOBz_ABdBd__BzBzBzBz_ABd__________ ____________Bd__BbBzBzCNBzBzCOBz_B_ABdBd__BzBzBzBz_ABd__________ __________BdBdCOBzCOBzBzBcCN_A_A_ABd______BzBzBzBz_ABd__________ __________BdBdBzCNBbCOCOCN_A_ABdBd________BzCOBzCN_ABdBd________ __________BdBdBzCOCNBZBb_A_ABdBd________BdCNBzCOCO_ABdBd________ ____________BdBzCNBmCNCO_A__________BdBdBzAdBzBZB__ABdBd________ ____________BdBdBzBzBjBzCOBz______BzBzCNBzCNCNBzBz_ABd__________ ____________BdBdBZBzCNCNCOB_BbBbCNCOBmBzCOBzBzBb_L_ABd__________ ____________BdBdBdBzBzBjBZBzCNCNBzBzBZBbBbB_Bz_A_ABd____________ ______________BdBdBdBzBzBzB_B_BZBbBzBbCLBzBy_A_ABdBd____________ __________________BdBdCNBzBaBzBbBzBaBW_A_A_A_ABdBd______________ _________________________A_A_L_L_A_A_A_A________________________ ________________________________________________________________ } # tile 217 (rot worm) { ________________________________________________________________ ________________________________________________________________ ______________________AzB_____AAAMAzAMAA____AzB_AzAgB_Az________ __________________AzB_BWAg___A_LAMAcAM_L_A_A_L_QB_BWAgB_________ ________________B_AgBWAg_z_z_LAAAcAzAcAMALAMAMAAAMB_AzBaAzAg____ ________________AgAzB__z_LAAAzAcANAMANAAAAAAAA_LAA_NAzAgB_B_____ ________________BWB__QAAAcAMAAAAAAAA_NAA_M_zAA_z_A_AB_BWAzAg____ __________________Az_LAAAMAA_LAA_z_LAA_z_A_A_A_A_zAgAzAgB_BW____ __________________B__QALAA_M_A_A_A_A_A_A_AB_AzAgB_BWB_AzAg______ __________________BW_zAAAA_z_A__________________B_AzAgBW________ _____________________NAAAM_L_A_A_A_A_A_A________________________ _____________________LAAAzAA_z_A_A_A_L_A_A_L____________________ _____________A_A_A_LAAAMAcAcAMAAAMAcAcAcAA_A_A__________________ _________A_A_z_LAAAcAAAAAAAAAcAcAAAAAAAAAAAM_z_L________________ ______AA_LAbAMAAAAAA_MAA_MAAAAAdAA_L_AAA_MAc_L_z_A______________ ______AAAAAAAA_LAA_zAA_A_A_zAAAcAA_z_AB__zAAAM_A_L______________ ________AA_L_z_A_A_A_A_A_____LAcAA_L_AAz_QAAAMAA_z_A____________ ___________A_A_A___________AAAAL_L_z_LB____zAAAcAc_LB___________ _______________________A_A_AAcAA_z_A_ABW___NAAAcAz_AAz__________ _____________________A_AAAAcAA_z_N_AB_Ag___LAAAdAc_zAg__________ ____________B____A_A_AAMAA_MAAAA_A_AAzB____zAAAcAz_MB_BW________ __________AgAz_A_L_zAcAA_zAA_A_A_AB_AgBW___LAAAQAz_AAgAz________ __________B_BW_NAAAcAAAA_L_A_AB_AzAgBW_____zAAAcAz_AB_B_________ ________BWAgAzAAAAAcAA_z_A_LAzAgBWB________LAMAdAc_ABWAg________ ________B_AzB__QAAAcAA_B_A_______________A_zAcAAAM_AAzB_________ ________AgBWAgB_AAAMAA_A_A_A_______A_A_A_NAzAA_LAA_ABWAg________ ________B_AzB_BW_QAAAcAA_L_A_A_A_A_AAAAAAcAA_N_z_A_AB_Az________ __________AgAzAgB_AAAAAcAcALAAAAAMAcALAA_NAA_z_L_AB_Ag__________ ______________BWAzB_AAAAAcAcAcAcAcAAAA_M_$_N_A_AB_BWAz__________ ________________B_AgB_AMAdAcAzAdAcAAAA_A_A_A_AB_Ag______________ _________________________A_L_A_L_A_A_A_A________________________ ________________________________________________________________ } # tile 219 (spark bug) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________Bh____________________________________ ___________________________p____________________________________ ________________________CSC$CS__________________Bh______________ ____________________Bh_pC$C$C$_pBh_______________p______________ _______________________qCSC$CS_q______________CSC$CS____________ ___________________q_q_t_t_p_t_t_t_t______Bh_pC$C$C$_pBh________ _________________q_q_t_t_tBh_q_c_c_c_c________CSC$CS____________ _______________q_q_t_t_t_q_q_c_q_q_q_q_q_________p______________ _______________m_m_m_m_h_q_c_q_q_q_q_t_m_m_A____Bh______________ _____________q_t_t_t_q_q_c_q_q_q_q_t_tBh_m_A_A_A________________ _____________qCY_t_q_q_q_q_h_q_q_t_t_q_p_m_A_A_A________________ ____________CYCuCu_q_q_q_q_q_h_q_t_qCSC$CS_A_A_A________________ __________BoCYCuCu_q_q_q_q_q_q_hBh_pC$C$C$_pBh_A________________ __________BoCYCu_m_q_qCuCu_q_q_q_h_mCSC$CS_A_A_A________________ __________BoCYCY_m_mCuCuCuCu_q_q_h_m_m_p_A_A_A_A________________ __________BoBoCB_mCuCuCuCuCYCY_q_m_h_mBh_A_A_A__________________ ___________ABoCB_mCYCYCYCYCYBo_m_m_h_m_A_A_A_A__________________ ___________A_A_A_mBoBoBoBoBoBo_m_m_A_A_A_A_A_A__________________ ___________A_A_A_ABoBoBoBoBoBoBo_A_A_A_A_A_A____________________ _____________A_A_A_A_A_A_A_A_A_A_A_A_A_A________________________ _______________A_A_A_A_A_A_A_A_A_A_A_A__________________________ _____________________A_A_A_A_A_A________________________________ ________________________________________________________________ } # tile 220 (arc bug) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ___________________p___p_p______________________________________ ________________BhCSBhC$C$_q_q_q________________________________ ________________BhC$C$C$C$_t_t_t_t_t____________________________ _________________q_q_tCSC$BhBh_c_c_c_c__________________________ _______________q_q_t_t_tC$CSBh_q_q_q_q_q________________________ _______________m_m_m_m_hC$C$C$C$C$_q_t_m_m_A____________________ _____________q_t_t_t_q_q_c_qCS_pC$_p_t_m_m_A_A_A________________ _____________qCY_t_q_q_q_q_hCSCSC$Bh_p_m_m_A_A_A________________ ____________CYCuCu_q_q_q_q_q_hCSC$Bh_p_m_m_A_A_A________________ __________BoCYCuCu_q_q_q_q_q_q_hC$C$C$C$_m_A_A_A________________ __________BoCYCu_m_q_qCuCu_q_q_q_hCS_pC$_m_A_A_A________________ __________BoCYCY_m_mCuCuCuCu_q_q_hCSCSC$_A_A_A_A________________ __________BoBoCB_mCuCuCuCuCYCY_q_m_pBhC$_A_A_A__________________ ___________ABoCB_mCYCYCYCYCYBo_m_m_p_pC$_A_A_A__________________ ___________A_A_A_mBoBoBoBoBoBo_m_m_A_ABh_A_A_A__________________ ___________A_A_A_ABoBoBoBoBoBoBo_A_A_A_A_A_A____________________ _____________A_A_A_A_A_A_A_A_A_A_A_A_A_A________________________ _______________A_A_A_A_A_A_A_A_A_A_A_A__________________________ _____________________A_A_A_A_A_A________________________________ ________________________________________________________________ } # tile 221 (lightning bug) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________CS______ ____________CS__________________________CS__________BhBhCS______ __________CSCSBhBh______________________C$C$C$________Bh________ ___p______CS__________________________CSC$Bh__________Bh________ __BhBh____Bh__________________________CSC$____________Bh________ ____BhBh_pC$Bh________________________BhC$__________C$_p________ ______BhBhC$BhBh______________________BhC$________C$C$__________ _______pBhBhBhBh______________________BhBh________C$C$C$C$_p_p__ _______pCSCSCS__________________________BhBh_pCSCSC$____C$C$Bh__ ___________pCS__________________________BhC$CSBh__________C$C$__ _____________pC$___________________pBhBhC$_p____________________ _____________pC$Bh_____q_q_q_q_q_p_pC$C$________________________ ________________BhBh_q_t_t_t_t_tC$C$C$__________________________ _________________pBhC$C$_t_q_q_cBh_p_c__________________________ _______________q_qBhBhC$_q_q_c_qBh_q_q_q________________________ _______________m_m_mBhC$C$_c_q_q_q_q_t_m_m_A____________________ _____________q_t_t_t_q_q_c_q_q_q_q_t_t_m_m_A_A_A________________ _____________qCY_t_q_q_q_q_h_q_q_t_t_q_m_m_A_A_A________________ ____________CYCuCu_q_q_q_q_q_hBhBhBhBhBh_m_A_A_A______C$________ __________BoCYCuCu_q_q_q_q_q_q_hC$C$_pBhBh_p_p_A____BhBh________ __________BoCYCu_m_q_qCuCu_q_q_q_h_mC$C$C$Bh_p_A____Bh__________ __________BoCYCY_m_mCuCuCuCu_q_q_h_m_m_mC$C$BhBhBhC$C$C$________ __________BoBoCB_mCuCuCuCuCYCY_q_m_h_m_m_A_A_pC$C$C$BhBhBh______ ___________ABoCB_mCYCYCYCYCYBo_m_m_h_m_A_A_A_A_________pBhBh____ ___________A_A_A_mBoBoBoBoBoBo_m_m_A_A_A_A_A_A_________p_pBh____ ___________A_A_A_ABoBoBoBoBoBoBo_A_A_A_A_A_A________Bh____BhBh__ _____________A_A_A_A_A_A_A_A_A_A_A_A_A_A____________Bh______Bh_p _______________A_A_A_A_A_A_A_A_A_A_A_A______________Bh______BhC$ _____________________A_A_A_A_A_A____________________Bh__________ ________________________________________________________________ } # tile 253 (harpy) { ________________________________________________________________ ________________________________________________________________ _________________________A_A_A_A_A______________________________ _______________________A_zCiCnCi_A_A____________________________ ____________CyCy_____A_ACiBlCnBlCn_z_A____CyCy__________________ __________CyCyCn_____A_A_zCiCnCiCi_A_A____CnCyCy________________ ________CyCyBsB$Cn_A_A_A_ACnCuCi_$_A_ACnCnBsB$CyCy______________ ______CyCyBsBiBiBiBiCn_A_z_zCi_z_A___ABiBiB$BsBsCyCy____________ ____CyCyBsBiBiBiBiBiBiCnCT_zCnCnCnCnBi_ABiBiBsB$BsCyCy__________ ____CyB$BiBiBiBiBsBiCnCnCnCnCiCiCnCnCnBiBiBiBiBiB$BsCy__________ ____CyBsBiBiBiB$BsB$B$CnCiCiCnCnCiCnCnBiB$BiBiBiB$BsCy__________ ____CyB$BiBiB$BsB$CACACiCTCnCnCsCdCiCAB$BsBsBiBiB$BsCy__________ ____CyBsBiBiBsBiB$CACACACnCFB$CACiCACACAB$B$BsBiBiB$Cy__________ ____CyB$BiBsB$CACACA_z_ACACACACAB$CA__CACAB$B$BiB$BsCy__________ ______BiBiB$BiCA_______ACACACACACA________CABsBiBsBi____________ ________BiBiB$CA________CAB$BsCACA_A______B$B$BiBi______________ ________________________CACABiCACA_A_A__________________________ ________________________CACA__CACA___A__________________________ ______________________CACA______CACA____________________________ __________________CjCfCACA______CACACfCI________________________ ________________CI____CfCI______CfCf____CI______________________ ____________________CI__CI______CI__CI__________________________ ________________________________________________________________ ________________________________________________________________ _____________________________A_A_A_A_A_A_A_A_A_A________________ _____________________________A_A_A_A_A_A_A_A_A_A________________ _____________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A____________ _____________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A____________ _________________________A_A_A_A_A_A_A_A_A_A____________________ _________________________A_A_A_A_A_A_A_A_A_A____________________ ________________________________________________________________ ________________________________________________________________ } # tile 262 (baby deep dragon) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________CPCP______________________________________________ ____________CVCP____CVCV________________________________________ ____________CVCVCVCVCm__________________________________________ __________CVCVCmCPCPCP____CoCoCoCoCmCoCo________________________ __________CVCm_A_ACmCmCoCoCoCmCoCoCoCoCmCmCo____________________ ________CVCVCKCKBxCKCVCoCoCVCVCVCVCVCVCoCoCmCo__________________ ________CmCVBxBxBxBxCKCPCVCoCKCPCPCVCVCVCVCVCoCoCo______________ ________CmCKBx____BuBxCKCmCVCKCKCPCKCmCPCVCVCPCVCoCo____________ ____________________BxBxCmBxCKCKBxChCmCPCKCKCKCPCPCoCo__________ __________________A_A_CVCVCKBkCKCKCKCPCKBxBxBxBxCKCPCo__________ __________________A_A__zCmCKBxCKBxCPCKCKBxBxBxBxBxCPCVCV________ ___________________A_ACVCPCPBkA_A_CKCKBxBxAHAHA_BxCmCVCV________ _____________________A_A_A_A_z_MCKCKCPCKA_A_A_A_A_CmCVCV________ _______________________A_A_A_A_zA__MA__z_B_A_zCmCmCPCV_A________ ___________________________________________ACVCPCVCP_A__________ _____________________________________________A_A_A_A____________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 273 (deep dragon) { BdBx__________________________________________BuBUBUBUBUBuBuBu__ __BuCHBuBY__________________Co______C$C$BDBuBuBuBUBUBUBUBUBu____ ____BuBuBuBuBYBuBuBuBuBuBUCm__________BDBYBuBuBUBPCaCaCeBe______ ______BuBUAmBUCHCDCeBuBuBuBu________BDBYBUBuBuCaCHBeBuAm________ ______BuBuCHCeBqBYBuCHBuCaBu________BDCeBuBUBuBUAfCDBuBE________ ______BECeCHBuBuCHCHCmCmChCHBu______BDBqCeBqBUAfAmBUCHBx________ ____BlCHCHBqBuBEChCmBlCPCPCmBd______AjBuCaBuBuBUBUBuBYBK________ ____BABuBuBuBlCmBkCPCPBkCPBnCPCP____AlBuBUCaBuBuBuBUAmBD________ ____BYBuBuBuBECVCPBkBkCJBkBkCPBkCP__BDBuBUCwBuBuCaBEBKBYBD______ ______BuBEBlCVCPCVBkCmBFBxCHCHBxCPBk__BUBuBYCwBuCHBl____________ ________CmBlCPCVCmBkCmAmBlCHCwCHCeCPCKBDBUBuCeBeCH______________ ________BkCmCPCVCPCVBnBYBuBUBuBuBuBxCPBDAmBuBuBe________________ __________CPCmCmCVCPCo__AmAlCaCaCwBuBkCVCPBlCPBK________________ __________BkC$CPCVCPCoBkCmBdAlBuBuBuBkBkBkCmCVCPCP______________ ____________CPC$CPCVCoBCBdBDBDCeCaCeBYBdBkCJBmBlCmCPCP__________ ____________CPBQCoCVCoBCBdBkAjCaBUAyBkBkBdBlBdCJBkCPCmCP________ ____________BdCmBCCoCVCoCVBdBUCeCaCaAjBdCPBcBkBdBnCJBkCP________ __________BkBdCPCmCVCoCoCVBdCHCaBuBUBYBdBkBkBDBd____BnCPCP______ ________BkCPBdBJCPCPCVCoCPBDCHCeCaCaBlBDBDBkBD____C$BkCPCPCP____ ____BkCPBkBdAjAlC$BkCPCVCoBkBuCaBuBUBuBuBkBdCP_A_A_A_zC$CPC$____ __BdBkBdBdBJAl______BkCPCmBkBkBeCaCaCeBYBdBDBDBk_A_A_ACo_A_AC$__ __C$__BdBJC$__________BkCwBkBJBUBUBUBPBuBDBkBYBXBkBd_A_ABkBk____ C$____C$__C$____________BkBkBDAlBeCaCwBuBYBkBuCeBUAlBdBkBk_A_A__ ______C$____________CKBkBkBDAlAeAyBUBUBUBUAyCeBuBuBDBJBk_A_A_A__ ____________________CeCKBkAlBUAyAOBlBuBuCHAyBUCeCHCe_B_A_A_A____ __________________CeCeBuBuBUAaAl_A_ABuBUBUBUCDCeCeCH_A_A_A______ __________________CHCeBuCDBUAy_A_A_A_B_B_AAyBUBuCDCeCH_A_A______ __________________CeCwCHBUBUBX_A_A_A_A_A_A_ABuBUCeCwBu_A_A_A____ ________________BuCHCeBuBuBU_B_A_A_A_A_A_A_ABUCHAyBuBuBu_A_A_A__ ____________CHCHCHCHCHBuBU_A_A_A_A_A_____A_A_ABuBuBuCeBuBu_A_A__ __________CeCH_ACeBu_BBuAlCP_A_A_______A_A_AChBu_AAyCe_BBUCP_A__ ___________A_A_A_A_z_A_A_A_A_A_____________A_A_A_A_B_z_A_A_A____ } # tile 283 (stalker) { ______________________________CPBkCP____________________________ ____________________________BnCPCPCVBk__________________________ ____________________________CJC$BkC$CP__________________________ ____________________________BnCVCPCVBk__________________________ ____________________________CJBnCJBnCP__________________________ ____________________________CJBnCJBnCJ__________________________ ______________________________CPBkCP____________________________ ______________________________BkCPBk____________________________ ______________________CPBkCPBkCPCJBnCPBkCPBk____________________ ____________________BnCJBnCJBnCPBkCPBkCPBkCPCP__________________ ____________________CJBnCJBnCJBnCVCJCPBkCPBkBk__________________ ____________________BkCP__BkCPCJCVBnBkCP__CPCP__________________ ____________________CPBk__CPBkCmCVCVCPBk__BkCP__________________ ____________________CJBnCPCVCVCVCVCVCVCVCPCPBk__________________ ____________________BnCJBnCVCVCVCPCPCVCVBkCPBk__________________ __________________________CPBkCPBkCPBkCP________________________ __________________________BnCJBnCJBnCJBn________________________ __________________________CJBnCJBnCJBnCJ________________________ __________________________BnCJBnCJBnCJBn________________________ __________________________BkCPBk__CJBnCJ________________________ __________________________CJBkBn__BkBkBn________________________ __________________________BnBkCJ__BnCJBk________________________ __________________________BkBkBk__BkBkBn________________________ __________________________BMCJBk__BkCJBk________________________ ____________________________BkBk__BkBk__________________________ ____________________________BkBk__BkBk__________________________ ____________________________BkBk__BkBk__________________________ ____________________________BkBk__BkBk__________________________ ____________________________BkBd__BdBk__________________________ ____________________________BdBd__BdBd__________________________ ____________________________BdBd__BdBk__________________________ ______________________________Bd__Bd____________________________ } # tile 294 (violet fungus) { ________________________________________________________________ ________________________________BPBqBq__________________________ ______________________________BqBqBqBPBqBP______________________ ________________________BPBqBqBqBqBqBqBPAsBPBPBP________________ ____________________BPBqBqBqCDBqBqBPBqBPBqAsBPBPAsBq____________ __________________BqBPBqBqBqBqBPBqBqBqBqBPBqBqBPBPAsAs__________ ______________BPBqBqBqBqBqCDBqBqBqBPBqBPBqBPBqBPBqBPBPAsBq______ ____________BqBqBPBqBqCDBqBqBqBqBqBqBPBPBqBqBqBPBPBPBPBPAs______ __________BPBPBqBqBqBPBPBPAsAsBPAsAsBPAsAsBPBPBPAsBPBPAsBPBP____ __________BPBqAsAVAsBPAsAsBPAsBPAVAsBPAsBPAsAsBPAsAsBPBPAsBP____ ____BP______BPAsAVAsAVBPAsBPAsBPAsBPAsBPAsAVBPAsAVBPAsAsBPBP____ ____BqBq__________BPAsAsBPAVAsBPAsBPAsBPAsBPAsAsBPAsBPBP________ ____BPBPBq__________BPAsAsBPAsAVBPAsBPAsBPAsBPBPAs______________ ____AsBqBq____________BPBPBPAsBPBqBPBPBPBPBP____________________ ____BPBPBPCD______________BPBqBPBPAsBPBP_______A_A_A_A_A_A______ ______BPBPBP____________AsBqBqBqAsBqAsBPBq___A_A_A_A_A_A_A_A____ ________BPBPBPBP______BPCDBqBqBPBqBPBPBqBq___A_A_A_A_A_A_A_A_A__ ________BPBPBqBqBq__BqBqBqBPBqBPBqBPAsBPBqBPBP_A_A_A_A_A_A_A_A__ __________AsBPBqBPBqBqBPBqBPCDBPBqBPBPAsBPAsBqBPBP_A_A_A_A_A_A_A ____________BPBPBqBPBqBPBPBqBPBqBqBPBPAsBPBPAsBqBPBqBqBqBq_A_A_A __________________AsBPAsAsBqBPBqBqBPBPBP_A_A_AAsBPAsBPBPBqBq_A_A ____________________BPBPBPBPBqBqBqAsBPBPBP_A_A_A_A_A_ABPBPBPBP__ ______________________BqBqBqBqBPAsBPBPAsBP_A_A_A_A_A_A_ABPAsCD__ ______________BqBqBqBqBqBPBPBqAsBPAsBqAsBPBP_A_A_A_A_A_A__BPBP__ ____________BqBqBqBPBPAsBPBPAsBPBPAsBPBPBPBPBq_A_A_A_A__BPBqBq__ ________BqBqBPBPBPBPCeBPBPBqAsBPBPAsBPAsBqBqBP_A_A_A_A__BPBP____ ______BqBqBqAsBPCeChBqBqBqBqAsBqBPBPAsBPBPBPBq_A_A_A____________ ______BPBqAs____BqBPBqBPBPBPBPBPBPBPBPAsBPBPCDBP_A_A____________ ________________BPBqBqBPBqAsAsBPBqBqAsBPAsBPBqBqBP_A____________ ______________BqBqBPBPBPBPBPBPBPBqBPBP_ABPAsBPBq_A______________ _____________ABqBPBPAsBPAs_ABPAsBqBPBP_A_A_A_A_A________________ _____________A_A_ABqBP_A_A_A_A_BBPBq_A_A_A______________________ } # tile 295 (disgusting mold) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________CoCmCm________________________________ ________________CXCXCmClCmCmClCmCo____CmCmCo____________________ ______________CnCXCXClCmClClClClCmCmCmClClCmCm__________________ __________CnCnCXCXCXCXCXCXCXCXCXCXCoClCXCXClCoCX________________ ________CnCnCnCiCXCgCnCmCnCiCnCoCoCmCmCnCiClCXCX________________ ______CnCXCiCXCnCnClCmCXCXCiCnCoCnCnCmCoCmCiCiCmCXCn____________ ______CnCXCXCgCnCnCnCiCnCiCXCXCiCnCiCnCnClCXCmCXCXCnCn__________ ______CnCXClCnCnCnCiCnCiCnCiCXCnCiCnCiCiCXCiCnCXCXCiCn__________ ______CnCXCnCnCiCnCnCiCiCnCiCnCiCnCiCiCnCXCiCnCXCnCXCn__________ ______CdCnCXCiCnCnCiCnCiCnCnCnCnCiCnCiClCmCnCiCXCXCnCn__________ ______CnCnCiCXCiCnCnCnCnCnCnCnCnCnCnCnCnCnCnCXCXCXCn____________ ________CnCnClCnCnCnCnCnCnCiCiCiCnCnCnCiCnCnCXCXCn______________ _______ACnCnCnCXCXCiCiCnCnCiCnCnCiCnCnCnCiClCnCnCn_z____________ _____A_A_z_$CdCnCXClCXClCnClCXClClCnCXClCXCXCnCn_z_A_A__________ _____A_A_A_A_z_zCnCXCXCXCnCnCnCnCnCnCXCXCXCnCdCn_z_A_A__________ _____A_A_A_A_A_zCnCnCnCnCn_z_z_z_$CnCnCnCnCn_z_z_A_A_A__________ _______A_A_A_A_A_z_z_z_z_z_A_A_A_A_A_z_z_z_z_A_A_A_A____________ ___________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A______________ _________________A_A_A_A_A_A_A_A_A_A_A_A_A______________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 296 (black mold) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________BxBKBx________________________________ ________________BxBKBxBKBlBKAlBlBK____BxBKBx____________________ ______________BKBlAlAfBxAfAyAfAyBKBlBKAfAlBlBK__________________ __________BxBkAfAyAfAyBKAlAfAlAfBKBxAlAyAfAyBKBx________________ ________BKBlBKAyAP_L_ABx_A_A_ABxBkBlBK_A_AAfAlBl________________ ______BxAfAyAlBlBKBxBlBKBx_A_ABK_A_ABxBKBx_AAfBKBxBK____________ ______BKAlAf_A_ABx_L_A_A_ABKBl_A_A_A_A_LBKBxBxBKAfBxBk__________ ______BxAfAyBKBxBK_A_A_A_A_ABx_A_A_A_A_ABl_A_MBxAlAPBl__________ ______BKAlBl_A_ABl_A_A_A_A_ABK_A_A_A_A_ABx_A_AAfBxAfBx__________ ______BlBxAP_A_ABx_A_A_A_ABkBlBx_A_A_ABxBK_A_AAlAfBxBK__________ ______BKBxAfAl_ABKBxBKBlBx_A_ABKBl_ABxBABx_AAfAyAPBk____________ ________BlBKAyBl_A_L_zBK_A_A_A_A_ABxBK_A_ABkAfAlBl______________ _______ABxBKBlAPAy_A_ABx_A_A_A_A_A_ABl_A_AAfBxBKBx_A____________ _____A_A_A_zBKBxAlAfAlAfBKAyAfAlAfBKAyAlAfAyBKBx_A_A_A__________ _____A_A_A_A_A_ABKAfAyAfBkBKBxBKBxBkAfAPAyBMBxBK_M_A_A__________ _____A_A_A_A_A_ABlBxBkBKBx_A_L_A_BBKBxBlBKBx_A_A_A_A_A__________ _______A_A_A_A_A_A_A_B_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A____________ ___________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A______________ _________________A_A_A_A_A_A_A_A_A_A_A_A_A______________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 298 (gnome thief) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________CFBS____________________________________ ________________________BsBS____________________________________ ______________________CFBsBSBS__________________________________ ______________________CFBsBsBS__________________________________ ____________________CFCFBsBsBSBS________________________________ ____________________CFCFBsBsBSBS________________________________ __________________CFCFCTCTCTCTBSBS______________________________ ________________CFCF_A_ACiCn_A_ABSBS_________________A_A________ __________________CnCnCnClCTCnCnCT_______________A_A_A_A________ __________________CmCnClCnCiCTCnCV___________A_A_A_A_A__________ __________________C$CmClCiCnCTCVCP_____A_A_A_A_A_A_A_A__________ ______________CFCFBsCmCVCnCnCVCPBSBSBS_A_A_A_A_A_A_A____________ ____________CFBsBsCFBsC$CVCPCVBSBsBsBsBS_A_A_A_A_A_A____________ __________CFBsBs__CFBsCmCPCmCPBsBS_ABsBsBS_A_A_A_A_A_A__________ __________CFBs____CFCFBsCmCPBSBSBS_A_ABsBS_A_A_A_A_A_A__________ __________CiCn____CFCFBsC$CPAwBSBS_A_ACiCn_z_A_A___A_A__________ __________CnCi____CFCFBsCVCPAwBSBS_A_zCnCi_A_A_____A_A__________ __________________CFBsBsBSBSBsBsBS_A_A_z_z_A_____A_A____________ __________________CFBsBs_A_ACFBsBS_A_A_A_A_____A_A______________ __________________CFBsBs_A_ACFBsBS_A_A_A________________________ ________________BsBsBsBs_A_ABsBsBsBs_A_A________________________ ______________BsBsBsBSBS_A_ABsBSBSBSBS_A________________________ _________________A_A_A_A_A_A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ } # tile 301 (deep gnome) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ _____________________A_A________________________________________ _____________________A_ACh______________________________________ ________________________CoBd____________________________________ ________________________CPBd____________________________________ ______________________ChCPBdBd__________________________________ ______________________CoChCPBd__________________________________ ____________________CjCjCjCjCjCM________________________________ ____________________CoChCVCPBdBd________________________________ __________________ChChCnCgCnCnBdBd______________________________ ________________CoChAB_ACiCi_A_ABdBd_________________A_A________ __________________CiCgCiCmCnCiCiCn_______________A_A_A_A________ __________________CmCiClCiCiCnCiCV___________A_A_A_A_A__________ __________________C$CmCmClCiCnCVCP_____A_A_A_A_A_A_A_A__________ ______________ChCoCPCmCVCgCiCmCPBdBdBd_A_A_A_A_A_A_A____________ ____________CoCPChChCPC$CVCPCVBdCPCPCPBd_A_A_A_A_A_A____________ __________ChChCP__CoCPCmCPCmCPCPBd_ACPCPBd_A_A_A_A_A_A__________ __________CoCP____ChChCPCmCPBdBdBd_A_ACPBd_A_A_A_A_A_A__________ __________CgCi____CcCFBoC$CPBSCBCB_A_ACiCi_z_A_A___A_A__________ __________ClCi____CFCFBoCVCPBSCBCB_A_zClCi_A_A_____A_A__________ __________________ChCVCPBdBdCPCPBd_A_A_z_z_A_____A_A____________ __________________CoCPCP_A_zChCPBd_A_A_A_A_____A_A______________ __________________ChCVCP_A_BCoCPBd_A_A_A________________________ ________________BsCABsBs_A_AB$BsBsBs_A_A________________________ ______________BsBsBsBSBS_A_ABsBSBSBSBS_A________________________ _________________B_A_A_A_A_A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ } # tile 302 (gnome warrior) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________CuCu_t______________________________________ ____________________CuCu_t_m____________________________________ _________________________q_m____________________________________ _______________________t_q_m_m__________________________________ _______________________t_q_q_m__________________________________ _____________________t_t_q_q_m_m________________________________ _____________________t_t_q_q_m_m________________________________ ___________________t_tCTCTCTCT_m_m______________________________ _________________t_t_A_ACiCn_A_A_m_m________________BsBS________ __________________CnCnCnClCTCnCnCT_______________ABsBsBS________ __________________CmCnClCnCiCTCnCV___________A_A_ABsBS__________ ________CPBkBkBd__C$CmClCiCnCTCVCP_____A_A_A_A_ABsBS_A__________ ______CPBWBSBWBvBD_qCmCVCnCnCVCP_m_m_m_A_A_A_ABsBs_A____________ ____BkBiBWBsBWBvBSBD_qC$CVCPCV_m_q_q_q_m_A_ABvBs_A_A____________ ____BkCFBWBvBSBvBSBD_qCmCPCmCP_q_m_A_q_q_mBv_ABv_A_A_A__________ ____BlBSBWBvBSBWBsBD_t_qCmCP_m_m_m_A_A_qBv_ABv_A_A_A_A__________ ____BmBSBvBWBsBWBsBDCFBsC$CPAwBSBS_A_ACiCnBv_A_A___A_A__________ ____CJBvBsBWBsBWBvBDCFBsCVCPAwBSBS_A_zCnCi_A_A_____A_A__________ ____BlBvBSBvBWBsBvBD_q_q_m_m_q_q_m_A_A_z_z_A_____A_A____________ ______BkBSBvBWBSBD_t_q_q_A_A_t_q_m_A_A_A_A_____A_A______________ ________BmBkBkBd___t_q_q_A_A_t_q_m_A_A_A________________________ ________________BsBsBsBs_A_ABsBsBsBs_A_A________________________ ______________BsBsBsBSBS_A_ABsBSBSBSBS_A________________________ _________________A_A_A_A_A_A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ } # tile 303 (Ruggo the Gnome King) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ _______________________KCjCM_G__________________________________ __________________Cj_K_KCjCj_G_GCM______________________________ __________________CjCjCjCjCjCjCMCM______________________________ __________________CjCjCjCjCjCjCMCM______________________________ __________________CnCnCnCnCnCTCTCT______________________________ __________________CiAA_zCiCn_z_ACT______________________________ __________________CiCnCiCnCnCnCTCT______________________________ __________________CmCiCnCiCnCnCTCP___________A_A_A_A_A_A________ __________________CmCoCnCiCnCnCPCP_________A_A_A_A_A_A_A________ _______________K_KCmCmCmCmCmCPCPCP_G_G___A_A_A_A_A_A_A_A________ _____________K_G_G_GCmCmCmCmCPCP_G_K_G_G_A_A_A_A_A_A_A_A________ ___________K_G_G___KCmCmCmCmCPCP_G_A_K_G_G_A_A_A_A_A_A_A________ ___________K_G_____K_KCmCmCmCP_G_G_A_A_K_G_A_A_A_A_A_A_A________ __________CiCn____CFCFCFCmCmCFCFCF_A_ACiCn_z_A_A_A_A_A__________ __________CnCi____CFCFCFCmCmCFCFCF_A_zCnCi_A_A_A_A_A____________ ___________________K_K_G_G_G_G_G_G_A_A_z_z_A_A_A________________ ___________________K_K_G_A_A_K_G_G_A_A_A_A_A_A__________________ ___________________K_K_G_A_A_K_G_G_A_A_A_A_A____________________ ________________CFCFCFCF_A_ACFCFCFCF_A_A_A_A____________________ ______________CFCFCFCFCF_A_ACFCFCFCFCF_A________________________ _________________A_A_A_A_A_A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ } # tile 304 (gnome king) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ _______________________tCjCM_m__________________________________ __________________Cj_w_tCjCj_m_mCM______________________________ __________________CjCjCjCjCjCjCMCM______________________________ __________________CjCjCjCjCjCjCMCM______________________________ __________________CnCnCnCnCnCTCTCT______________________________ __________________CiAA_zCiCn_z_ACT______________________________ __________________CiCnCiCnCnCnCTCT______________________________ __________________C$CiCnCiCnCnCTCV___________A_A_A_A_A_A________ __________________C$CoCnCiCnCnCVCP_________A_A_A_A_A_A_A________ _______________t_tC$CmC$CmCWCVCPCV_m_q___A_A_A_A_A_A_A_A________ _____________t_q_m_mC$CmCVCmCVCV_m_t_m_m_A_A_A_A_A_A_A_A________ ___________t_q_m___tC$C$CPCPCVCP_m_A_t_m_m_A_A_A_A_A_A_A________ ___________t_m_____t_tCmCVCmCP_m_m_A_A_t_m_A_A_A_A_A_A_A________ __________CiCn____CFCFCFC$CmCFCFCF_A_ACiCn_z_A_A_A_A_A__________ __________CnCi____CFCFCFCmCPCFCFCF_A_zCnCi_A_A_A_A_A____________ ___________________t_q_m_m_m_m_m_m_A_A_z_z_A_A_A________________ ___________________t_q_m_A_A_t_q_m_A_A_A_A_A_A__________________ ___________________t_q_m_A_A_t_q_m_A_A_A_A_A____________________ ________________CFCFCFCF_A_ACFCFCFCF_A_A_A_A____________________ ______________CFCFCFCFCF_A_ACFCFCFCFCF_A________________________ _________________A_A_A_A_A_A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ } # tile 361 (genetic engineer) { _____________________________________y__________________________ _______________y___p_____y___y___y______________________________ _____________________y_________________y___y____________________ ___________p_____p_______y_y_y_y_y___y__________________________ _______________p___p___p_p_y_y_y_p_p_____y___p__________________ _______k___k_____k_p_____p_p_p_p_p_p_y_______y__________________ _____________________k_k_p_p_p_p_v_k___p___p_____p______________ _______g___k___k___k___k_k_k_k_k_k_k_p_p________________________ ___________g_______p___g_k_k_k_k_k_g_______p_p___g___K__________ _________K_____g___K_g___g_K_k_K_g___g__________________________ ___K_________K_____g___K_g_K_k_K_g_K_____g___________K__________ _________K_____K_K___K_K_k_K_k_K_g_K_K_______K__BQ______BQ______ ______________BQ___K_gBC_K_K_KBE_K_KBE_K____________BQ__________ __BQ____BQ__BQ__BQBQBQ_g_KBE_K_KBE_KBQBQBQBQ__BQ____BQ__BQ______ __________BQ__BQBQBQBQBQBQBQBQBQBQBQBQBQBQBQ__Cw________________ Cw______CwCw__CwBQBQ__BQBQBQBQBQBQBQ__BQBQCwCw____CwCw______Cw__ ______Cw____CwCwCw__BQCwBQBQBQBQBQCw__CwCwCw____Cw______________ Cx________Cw__CwCwCw__CwCwCwCwCwCwCwCw__CwCwCw________Cw__Cz____ ______________CqCdCzCzCwCwCwCwCwCwCw____CqCd__Cz______Cx__Cx____ __Cx__Cx__Cx__CyCx____CxCdCwCwCwCdCq__CwCyCx____CxCz____Cz__Cz__ ______________CdCy__CwCdCxCdCxCdCxCv____CdCZCz_ACz_C__Cx________ ____Cz__Cd__Cy__CxCz__CyCxCZCxCvCxCz_ACz_z_LCz_A_CCx_B__Cz______ Cx____________Cz__Cz__CzCzCz_MCzCzCz_L_ACxCd_zCz_A_B_B____Cz____ __________Cy__Cz__CzCzCjCzCz_LCzCjCz_BCz_BCy_A_A_A_ACz__________ ____Cj________Cj_zCzCjCzCz_MCjCzCzCj_z_ACj_z_A_ACz_A____________ ______Cz________Cj_MCjCjCjCjAACjCjCjCjCzAACj_A_A_A_zCj__Cj______ Cz__________CjCjAA_ACjCjAACj_LCjCjCjAA_ACjAA_ACj_L______________ ________Cj____AACjAACjAACjCjAACjCjAACjCj_A_A_AAACj__Cj__________ ____Cj______Cj_L_zCjAACjCjAA_ACjAA_ACjCjAACj_z________Cj________ ____________Cj__CjAACj_zAACj_AAACj_AAACj_L______________________ ________Cj____Cj__CjAACj_L_z_A_A_LCjCj__CjCj____Cj______________ ______________Cj______________Cj____Cj____Cj____________________ } # tile 377 (two-headed troll) { ____________________CGCdCdCdCUCdCG______________________________ _____________________A_zCU_z_zCdCUCGCdCUCdCdCdCG________________ __________________Cd_ACdCd_z_ACdCy_BCdCz_z_LCdCUCG______________ ________________CGCdCrCdCUCGCGCGCd_A_zCd_A_BCzCdCG______________ ______________CGCrCdCy_z_z_ACLCGCrCdCdCUCGCGCGCGCLCdCd__________ ______________CGCdBV_B_A_A_A_ACdCdCd_z_z_ACGCLCdBVCGCUCG________ ____________CGCUCdCdBVBXCGBXBVBbCG_z_A_A_A_ACGCGBbBVCdCGCG______ ______________BVBtCLCGBXBbCGCGCGBbCGCGBXBXBJBVBJCGCGCGCUCG______ ______________CdBVCGCGCLCdCGCUCGBVCGCLCGBVCGBcBVBbCGCLCdCGCL____ ______________CdCUCGBVCGCdCUCGBtCUCGBJCGBXBcBVCGBXBXCGCcCdCG____ ______________CGCGCL____CGCGCdBbCGCGCGCLBVCGCGBbBXBVCGCTCdCL____ ______________CUCGBV______CGCUCGCGCUCGCGCGBbBXBX__BXBJBVCGCd____ ______________CdCGBV______CdCGCdCUBtCGBbCGBXBVCG____BVBXCGCLCG__ ______________CdCLCG________BZCGBVCdCUCGCGCGBcCG______BbCGCdCG__ ______________CdCGCG________CGCGCUCdCdBVCLCGBVBb______BXCGCUCGCG ______________CGCUCGBV______BVCLCGCdBZCGCdCGCGBX______BVBXCzCd_A ________________CdCGBb______BXCdCGCLBtCGCUCGBbBX_______zBXCGCd_L ______________CdCLCGBX______CdCLCGCGBVCLCGCGCdBX_____A_LBtCUCd_A ______________CdCGCLBt______CdCGCGBbBX__CGCLCGBV___A_A_ABXCGCG_L ____________CdBbCGBtBJCG____CyCUCGCGBV__CGCGBbCG_A_A_ACGBVCLCG_A __________CdCGBVBVBJCG____CGCdBXCGBbBX__CGCUCGCdBb_z_ACGBJCGCG_L ________CGCdCLCG__________CUCdCLCGBVCG__CGCGCLCdBX_A_zCjBXBbCGCG ______CGCUCdCG__________CGCdBVBVBXBJ___L_ACGCdCzBX_A_ACf_zCf_LCj ____CLCdCdBZCG________CGCdCUCGCGBVBX_A_A_ACLCdCdBXCG_zCj_zCj_zCf __CGCdCcCGCdCG________CLCdCGCLBVCG_L_z_A_A_ACdCUBtCG_LCf_zCf_zCj __Cd__CdCGCU__________BtCUCGBVCG_L_A_A_A_A_LCGCdCGBJ_zCj_zCj__Cf __Cj__Cd__Cf__________BVCdCGBV_L_A_A_A_A_A_ACGCLCGBV_A_z_zCf__Cj __Cf__Cf__Cj_______A_ABVBbCGBX_A_A_A_A_A_A_LCGCGBVBJCG_A__Cj__Cf __Cj__Cj__Cf_______A_ACGBXCGBb_A_A_A_A_A_A_ACGBzBVBXBX_z__Cf__Cj ______Cf__Cf_____A_LCGCdCUCGBX_A_A_A_A_A_LCGBVCGBcBtBX_L__Cf____ ______Cf_________A_ACGCUCGCGCG_L_______A_ACGCGCGBVCG_L_A________ _________________A_A_A_z_A_L_A_A_________A_L_L_L_L_L_A__________ } # tile 380 (black troll) { ___________________________F_G_d_H_H_d_F________________________ _________________________dCPCP_dCJCP_d_H_F______________________ ___________________U_d_F_GBl_d_YBnCP_Y_d_H_F_d_G_F______________ _________________F_H_F_U_G_d_Y_F_F_G_F_F_Y_D_F_d_d_d____________ _______________U_G_d_G_U_d_dBNBNBN_F_F_H_Y_D_F_H_F_G_H__________ _______________U_H_F_Y_YBNBNBNBNBNBNBN_Y_F_F_D_F_D_F_d_F________ _____________F_d_d_F_D_U_F_D_D_U_U_D_F_Y_F_E_Y_Y_U_D_d_F_Y______ _______________D_U_F_F_U_D_d_Y_F_U_F_Y_E_Y_D_D_E_F_D_F_H_Y______ _______________G_U_Y_Y_F_H_F_d_D_D_U_Y_F_Y_F_R_U_D_Y_Y_d_F_F____ _______________d_H_Y_D_D_d_d_F_D_F_U_E_Y_D_D_O_F_E_E_Y_H_G_F____ _______________F_F_F_____F_D_G_D_F_U_F_Y_D_F_F_U_D_U_Y_F_d_d____ _______________d_F_D_______F_d_F_D_Y_Y_F_U_U_U_O___R_U_E_F_H____ _______________d_Y_D_______H_F_F_Y_D_F_D_F_E_D_D_____D_D_Y_d_F__ _______________H_Y_D_________U_d_D_D_Y_F_Y_F_U_D_______U_Y_G_F__ _______________G_F_D_________F_d_Y_F_Y_D_F_R_O_E_______U_F_d_F_F _______________F_d_F_D_______U_d_F_Y_E_Y_U_U_D_U_______E_E_d_d_A _________________d_Y_D_______D_H_F_U_E_Y_H_F_E_O_______A_U_F_H_A _______________d_F_Y_U_______G_d_Y_Y_U_F_Y_F_D_U_____A_B_U_G_d_A _______________H_F_Y_U_______d_F_Y_E_U___Y_G_F_E___A_A_A_U_d_F_A _____________G_D_F_U_U_F_____d_Y_F_F_D___Y_F_D_D_A_A_A_F_D_d_F_A ___________d_F_U_D_U_F_____F_H_Y_F_U_D___F_H_F_D_D_A_A_F_D_F_Y_A _________F_d_F_F___________G_Y_F_Y_E_F___F_Y_F_U_D_A_A_b_E_E_F_F _______F_G_H_F___________F_d_E_F_E_U___A_A_d_G_F_O_A_A_a_A_b_A_a _____d_H_d_D_F_________F_d_H_Y_F_U_D_A_A_A_F_d_Y_U_F_A_b_A_a_A_b ___d_G_d_F_G_F_________F_G_Y_U_D_F_A_A_A_A_A_H_Y_D_F_A_a_A_b_A_a ___H___d_F_H___________D_d_Y_D_U_A_A_A_A_A_A_F_d_E_D_A_b_A_a___b ___a___H___a___________D_d_F_D_A_A_A_A_A_A_A_d_F_E_D_A_A_A_b___a ___b___a___b_______A_A_Y_Y_F_U_A_A_A_A_A_A_A_d_F_E_D_F_A___a___a ___a___b___a_______A_A_F_Y_F_U_A_A_A_A_A_A_Y_F_E_Y_E_U_A___b___b _______a___b_____A_A_d_d_H_F_D_A_A_A_A_A_F_F_A_Z_E_Y_Y_A___a____ _______b_________A_F_F_A_F_A_F_A_______A_A_A_F_D_A_F_A_A________ _________________A_A_A_A_A_A_A_A_____________A_A_A_A_A__________ } # tile 388 (Vlad the Impaler) { ________________________________________________________________ ________________________________________________________________ __________________________B7CLB7CL______________________________ ________________________CLB7BMB7CLB7____________________________ ________________________CLBnBMBMB7CLB7__________________________ ______AS____Ae________CLB7ASBMASA6CLB7CL________AeASAS__________ ______ASASAeAl________B9B7BnBMBMA6B7CPB7B7____AlAeAS____________ ________AeA2A2Al________CPB7BMA6A6CPBk__B7__AlA2A2Al____________ ________AlBDA2A2AeAeAeA2AeA2BkBkAOBDAlAlAlA2A2BD__Al____________ ________Al__BDBDA2A2A2AlAlAeA2AOAeAlA2A2A2BDBD__________________ __________________BDBDA2AeAeAeAOAlA2BDBDBDBDAvAvAv______________ ________________AvAvAvAXBDAlAOAeAeBDBDATAvAvAXAvAvAvAvAvAvAvAvAv ______________AvAvAvAXAXAXA2AOAlA2BDAvAXAXAvAXAXAXAvAvAvAvAvAvAv ____________AvAvAvAXAXAXAvA2AaAlA2BDAvAXAXAvAvAXAXAXAXAvAvAvAv__ ________AvAvAvAXAXAXAXAvAvBSCLCLBSBSAvAvAXAXAvAvAXAXAXAXAXAv____ ______AvAvAvAvAXAXAXAvAvAXAOAOAOAOABAXAvAvAXAXAvAvAvAXAXAXAX____ ____AvAvAvAvAXAXAXAXAvAOAeAOABAOAOABABAXAvAXAXAvAvAvAvAXAXAX____ __AvAvAvAXAXAXAXAvAvAOAeAOABABAeAOAOABAXAvAvAXAXAvAvAvAvAv______ __AvAvAvAXAXAXAvAvAvAeAOAOABABAeAOAOABAXAvAvAXAXAXAvAvAv________ ______AXAXAXAXAvAvAOAeAOABABAvAeAOAOABAXAvAvAvAXAXAXAv__________ ________AXAXAvAvAvAOAOAOABAXAvAeAOAOABAXAXAvAvAXAXAXAX__________ ____________AvAvAvAXAOAOABAvAvAeAOAOABAXAXAvAv__________________ ________________AXAXAOAOABABAvAOAOABABAXAXAv____________________ __________________AXAXAOAOABAvAOABAB____________________________ ______________________AOAOABAvAOABABAB__________________________ ________________________AOAB__AOAOABAB__________________________ ________________________AOAO__AOAOABAB__________________________ __________________________AO__AOAOAB____________________________ ___________________________A_A_AAOAB_A_A_A_A_A__________________ _______________________A_A_A_A_AAB_A_A_A_A_A_A__________________ _____________________A_A_A_A_A_A_A_A_A_A_A______________________ _____________________A_A_A_A_A_A_A_A_A__________________________ } # tile 390 (wight) { ________________________________Cm______________________________ __________________________CV__BdCmBk__CV________________________ ____________________________CVBkCmB9CV__________________________ ____________________________BdCVCmCVBk__________________________ __________________________BDCuCuCVCuCuBk______CPCPCV____________ ____________CmCPCPCPCPCP__BDBdCuA2CuB9Bk__CPCPCPCV______________ ________________CmCPB9B9B9CmBdBkA2BkB9CVCPB9B9CV________________ __________________CVCVB9B9B9CVBkAOBkCVCPB9B9CVBd________________ ____________AeAeAOABABCVCVB1B1CVA2CVB1B1B1CVB1Bd________________ __________AlAeAeAOABABABBkCVBkBkCVBkBkCVCVBdBdB9Bd______________ ________AlAlAeC$C$CmABABABBkCVCVA2CVCVBdA2A2BdBdA2______________ ________AlAlC$_FCm_FCPABABAeBkA2BdBdB9BdBkA2A2A2Bd______________ ________AOAlC$C$CmCmCPABABAeA2A2BdBdB9BdBkBkA2BdB9A2____________ ________AOAlAlC$CmCPABABABAeA2A2BdBdB9A2Bk_AA2A2BdA2____________ ________AOAlAlAeAeABABABABAeA2A2BdB9A2Bd_A_ABkA2A2CVCV__________ ________AOAlAlAeAeABABABABAeAeAeCoCoCoAeAeAeBkBkCVCV____________ ________AOC$C$AeAeCmCVABABCoCoCVAeBkAeAeAeAeAeCVCVB1____________ ________AOAOAeC$CmABABABABAeBkAeAeCVBkAeAeBkBk_AB9B1____________ __________AOCmAeAOCVABAB__AeBkAeAeBkCVAeBkAeAe_AB9B9B1__________ __________AOAOAeAOABAB_2__AeBkAeAeAeBkAeAeBkAeBk_AB9B1__________ ____________AOAeABABAB______Ae__AeAeAeCVBkAeBkBk_AB9B9B1________ ______________AeABAB____________Ae____BkBkBkBkBk_A_AB9B1________ ________________AB____________________AeCV_A_A_A_A_AB9B9B1______ _________________________________A_A_AAe_ACV_A_A_A_A_AB9B1______ _____________________________A_A_A_A_A_A_A_A_A_A_A_A_AB9B9B1____ ___________________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_AB9B1____ ___________________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_AB9B1____ _____________________________A_A_A_A_A_A_A_A_A_A_A_A_____AB1B1__ _________________________________________________________AB9B1__ ___________________________________________________________AB1__ _____________________________________________________________A__ ________________________________________________________________ } # tile 417 (wax golem) { ________________________________CP______________________________ ______Cr______________________CP________________________________ ____Cr____________________CoCoCPCoCo______________________Cr____ __CrCtCr______________CoCoCoCoCWCoCoCoCm________________Cr______ __CrCtCy______________CmCoCoCoCoCoCoCXCX______________CrCtCz____ __CxCrCz______________CWCmCXCmCXCmCXCmCV______________CrCtCz____ ____Cy________________CWCm_z_ACm_z_ACmCW______________CqCzCz____ ____CPCoCoCo__________CVCXCmCXCmCXCmCVCW________________CzCy____ ____CoCWCoCmCW________CWCmCVCmCXCmCXCmCW__________CVCV__CP______ __CoCoCoCmCWCW__________CXCXCoCoCoCmCW__________CmCWCXC$CP______ __CoCoCXCXCVCPCm______CPCPC$CXCmCXCoCWCPCO____CmCWCPCVCXC$______ __COCXCXCPCPCWCWCmCXCmCPCOCWC$CoCoCVCOCPCP__CmCVCWCVCOCVCXCV____ ______CPCOCPCWCPCPCWCWCmCVCVCOCOCPCOCVCVCmCWCWCWCPCPCWCPCOCP____ ________BkCKCOCPCWCPCPCWCXCmCVCmCVCPCVCWCWCPCVCWCPCOCPCJBk______ ____________BkCPCWCPCiCPCVCWCWCWCVCWCWCVCgCPCWCPCJBkBkBm________ ________________CJCPCWCVCXCVCVCJCPCOCKCOCPCOCPBkCO______________ ____________________COCPCPCXCmCmCWCPCWCPBk______________________ ______________________CVCWCKCOCOCPCOCPCWCV______________________ ______________________COCPCWCVCPCPCPCPCWCPCO____________________ ______________________CPCOCPCWCVCWCVCOCPCJCP____________________ ______________________CVCPCPCOCKCOCPCJCPCPCOCP__________________ ____________________CWCmCWCVCVCOCPCWCPCWCPCPCO_A_A______________ __________________CVCVCWCPCOBk______CPCWCmCOCP_A_A_A_A_A________ __________________CPCOCVCOCP_A_B_____ACWCVCPCPCO_A_A_A__________ __________________CWCVCKCOBk_A_A_A_A_ACPCWCVCPCO_B_A_A_A_A______ ________________CVCWCVCWCPCJ_A_A_A_A_ACPCPCOCPCJBk_A_A_A_A______ ________________CWCPCWCPCOBkBm_z_A_A_ACWCPCPCWCPBk_L_A__________ ______________CWCPCPCPCOCPCPCJ_A_A_A_ACPCWCPCOCOCPCJ____________ ______________CPCWCWCPCPCPCOBk_M_A_A_ABkCPCOCKBnBkBm_A__________ _____________ACKCOCVCWCVCOCPBk_A_A_A_A_LCJBkBkCOCJ_z_A__________ _______________ACPCJCPCOCK_A_L_A_A_______A_L_A_A_A_A____________ _________________A_A_A_A_A_A____________________________________ } # tile 453 (mugger) { ______________________________Cw________________________________ ________________________CwBe__Ce________________________________ __________________________CeBeBeCnCe____________________________ __________________________CgCeBeCwBe____________________________ __________________________CnCgCwBeCiCn__________________________ ________________________CnCnCiCkCiCiCn__________________________ __________________________CTCnAaCnAdCn__________________________ __________________________CFCnCiCnCnBS__________________________ __________________________BWAGCnCuBwBs__________________________ ________Cm__________________BsBjCGBSBsBsBs______________________ ________C$______________CFCFBSBSBSCnCjBsCTCF____________________ ________C$Cm__________CiCnBsBsBiCiCjCnBsCnCT____________________ ________C$C$__Bn____CnCnCTBsBsBsCjCnCnBsCiCT____________________ __________C$ApBsCiCiCnCT__CFBsBsBsCnCnCnCnCT____________________ __________BICnCiCnCnCT____CFBsBsBsBsCTCnCTCT____________________ ________BF__CiCn____________CFBsBsBsBSCTCT______________________ ____________________________BSBsBsBSBSBSBS______________________ ____________________________B_BSBSBSCLB_________________________ ______________________________CLB_CLBsBSBS______________________ __________________________CFBsBsBsBsBsBsBS______________________ ________________________CFBsBsBSBSBsBsBsBS______________________ ______________________CFBsBsBSBS__CFBsBsBS______________________ ______________________CFBsBS______CFBsBsBS______________________ ______________________BsBsBv______CFBsBS________________________ ________________________BvBvBv____CFBsBs________________________ __________________________BvBv____BSBsBsBS______________________ __________________________CIBv_z___zBvBsBv_z_z_z_z_z____________ ________________________CIBv_z_z_z_zBvBvCIBv_z_z_z_z_z_z_z______ _________________________________z_z_zBvBvBv_z_z_z_z_z_z_z_z____ ____________________________________CfCIBv_z_z_z_z_z_z_z_z_z_z__ ____________________________________CIBv_z_z_z_z_z_z_z_z_z_z_z__ _______________________________________z_z_________z_z_z_z_z_z__ } # tile 457 (black marketeer) { ________________________________________________________________ ________________________________________________________________ ____________________________BsBSBS______________________________ __________________________BSBiBSBiBS____________________________ ________________________BSBiBsB__A_BBS__________________________ ________________________BiBS_B_ABSBSBi__________________________ ______________________BS_B_A_ACiCnCiBSBs________________________ ______________________Ci_A_A_zCnCiAQCiBs________________________ _______________________zCi_zCiCiCnCiCnCn________________________ ______________________CiCnCiCnCiCnCiCnCT________________________ ______________________CnCiCn_$_z_zCiCn__________________________ ________________________CnCnCiCnCnCnCn__________________________ ______________________CF_A_zCnCTCT_z_A__________________________ ____________________CFBsCF_A_z_A_A_ABsBsBS______________________ __________________CFBsCFCFBi_B_A_ACFBiCFB_BS____________________ __________________CFCFBZCFBs_A_A_BCFBsBiCABS____________________ ________________CFBsB_CFCFBiBsBiBsBsCFBZCFBSBS__________________ ________________CFCFBSCFBtCFBsBZCFCFCFBiCFBsBS__________________ ______________CABsB_CABSBSCFBsCFCABtBSBiBsCFBsB_________________ ______________CiCFBSAxCFBsCFCFBsCFCFCFB_BSBtCFCn________________ ____________CiCnCF__AwCFCFBtCFCFBZCFCFCAAw__CFCiCn______________ ____________CnCn____BsBsCFCFBZCFCFCFBsCFBs____CiCn______________ ____________CiBiBS__AJBiCFCFCFCFBtCFCFBZAI__CiCnCn______________ ____________BRCLAw__AYAKBsBTBiBiBsBiBiAJAJ__CnCn________________ __________BSCLAvCn____AYALAJALAKAJAKAJAK________________________ ________BiBbAw________AYAYAJAJAJAJAYAJ__________________________ __________Aw__________AYAYAJ______AYAJ__________________________ ______________________CcAYBs______AJAJAY________________________ ____________________CcBsBsBS_A_A_ACcBsBsBS_A_A_A_A_A____________ __________________CcCcBsBSBS_A_A_ABsCcBSBSBS_A_A_A_A_A_A_A_A____ __________________BsBsBSBS_A_A_A_A_ABSBSBSBS_A_A_A_A_A_A_A______ _____________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A______________ } # tile 473 (shadow) { ________________________________________________________________ ________________________________________________________________ _____________________________________________A_A________________ ___________________________________________A_A_A_A______________ _________________________________________A_A_A_A_A_A____________ _________________________________________A_A_A_A_A_A____________ _________________________A_A_A_A_A_A_A__CjCj_z_ACjCj____________ _______________________A_A_A_A_A_A_A_AAACjCj_AAACjCj____________ _____________________A_A_A_A_A_A_A_A_A_A_z_L_z_A_L_z____________ ___________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_L____________ ___________________A_A_A_A_A_A___A_A_A_A_A_A_A_A_A_A_A_A________ _________________A_A_A_A_A_A_____A_A_A_A_A_A_A_A_A_A_A_A_A______ _______________A_A_A_A_A_________A_A_A_A_A_A_A_A_A_A_A_A_A_A____ _____________A_A_A_A_A_________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A____ _____________A_A_A_A_________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A____ ___________A_A_A_A_________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A____ _________A_A_A_A_________A_A_A_A_A_A_A_A_A_A_A_A___A_A_A_A_A____ _______A_A_A_A_________A_A_A_A_A_A_A_A_A_A_A_A_______A_A_A_A____ _____A_A_A___________A_A_A_A_A_A_A_A_A_A___________A_A_A_A_A____ _____A_A___________A_A_A_A_A_A_A_A_A_A___________A_A_A_A_A_A____ _________________A_A_A_A_A_A_A_A_____________A_A_A_A_A_A_A______ _______________A_A_A_A_A_A_A_A___________A_A_A_A_A_A_A_A________ _____________A_A_A_A_A_A_____________A_A_A_A_A_A_A______________ ___________A_A_A_A_A_A___________A_A_A_A_A_A_A__________________ _________A_A_A_A_______________A_A_A_A_A________________________ _______A_A_A_A_______________A_A_A_A____________________________ _____A_A_A______________________________________________________ _____A_A________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 479 (bearded devil) { ________________________CYCYCY____CuCu__________________________ __________________________BoCBCY____CuCu________________________ ____________________________BoCBCYCYCuCu________________________ ____________________________BoBoCBCYCYCuCu______________________ ______________________________BoCBCfCpCuCu______________________ ______________________________BoBoCpCjCYCuCu____________________ ________________________________BoCBCpCYCuCu____________________ ________________________CBCYCYCuBoBoCBCmCYCuCBCuCu______________ ______________________CBCYCYCuCuCuBoBoCBCmCVCBCuCuCu____________ ____________________CBCYCYCuCuCuCuCuCmCYCYCuCVCuCuCu____________ ____________________CYCYCuCBCuCuCuCuCmCmCmCVCVCuCBCuCu__________ __________________BoCYCYCuCBCuCuCuCuCBCmCVCVCPCBCBCuCu__________ ________________BoBoCBCYCuBoCuCuCuCuCBCuCmCPCPCBCBCYCYCu________ ______________BoBoCBCBCuBoBoBoCuCuBoCuCuCPBn____CBCBCYCu________ __________BoBoBoBoCBCuBoBoBoBoBoCBBoBoBo__CV____CBCBCYCu________ _______ABoBoCYCYBoCBCuBoBoBoCYCYBoCuCu____________CBCYCu________ ___A_A_MCYCYCY_ABoCBCuBoCBCBBoBoCYBoBo____________CBCYCuCu______ ___z_MCYCY_A_A_ABoCBCuBoCBCYCYBoBoCYCYCB__________CBCYCuCu______ _A_A_MCp_A_A_ABoCBCuCuBoCYCYCuBoCBCBCYCYCB________CBCYCuCu______ _z_MCYCY_A_ACBCBCBCuBoBoCYCYCuBoBoCBCBCYCYCB________CuCYCuCu____ _A_MCpCY_A_ACBCuCuBoBoBoCYCuCu__BoBoCBCBCYCY________Cu__Cu______ _z_MCY_A_A_ACu_ACuBoBoCYCYCuCu____BoBoCBCBCYCB__________________ _A_MCp_A_A_A_A_ABoBoCYCYCuCu_A_A____BoCBCBCBCB__________________ _z_MCY_A_A_A_ABoBoCYCYCYCu_A_A_A_A__BoBoBoCBCB__________________ _A_ACY_A_A_ABoBoCYCYCY_A_A_A_A_A_ABoCBBoBoBo____________________ ___ACY_A_A_ABoCYCYCY_A_A_A_A_A_A_ACBBoBoBN______________________ _____A_A_ABNBoCY_A_A_A_A_A_A_A_ABoCBBoBN________________________ _______A_ABNCYCYCY_A_A_A_A_A_A_ACBBoBoBN________________________ _______A_ABoBoCYCY_A_A_A_A_A_A_A_ABoCBCBCB______________________ _________A_ABoBoBo_A_A_______A_A_ABoBoCBCBCB____________________ _________A_A_A_A_A_A_A___________A_ABoBoBo_A____________________ ___________________________________A_A_A_A______________________ } # tile 517 (shark) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________________BABABA____________________________________ ________________________BABABAA$________________________________ ________________________BABABABABK______________________________ ____Be__________________BABABABAA$A$____________________________ __________________________BABABABABK____________________________ ________BlBe______________BABABABABAA$__________________________ ______________BlBe________BABABABABABFBK________________________ __________________Bl____BABABABABABABAA$____Bl__________________ ______________________BABABABABABABABABABA____Be________________ ____________Be______AiAmAiBDAiAjAiBDAiAjAmAi__Bl________________ __________Bl____Be_H_H_H_H_H_H_H_I___H_H_HBlBe__________________ ___________H_HBl_H_H_H_H_H_H___H_H_H_H_HBe___H_H_H_H____________ __________BlBe_________H_H_H_H_H_H_H_H_H_H_H_H_H________________ ___________________H_H_H_H_H_H_H________________________________ ____BlBe_____________________________H_H_H______________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 531 (basilisk) { ________________________________________________________________ ____________________________________________BaBaBaBaBaBa________ ______________________________________BaBaBaBaBaByBaBaBaBa______ __________________________________BaBaBaBaBaBaAQBWAQAzAQAzBa____ ______________________________BaBaByBaBaBaBaB_BaAz_L_A_AAzAgBW__ ____________________________BaByBaBaBaBaAgBaBaAQAz_A_A_A_LAzBWBa __________________________BaBaBaBaBaBaBaBWAQBWAQ_z_A_ABa_A_AAQBa ________________________BaBaBaBaBaBWAgBaBaBaAzAz_A_LAcBa_A_LAzBa ______________________BaBaByAgBaBaBaBaAzBaAQBaAQ_z_AAzBa_A_AAzBa ____________________BaBaBaBaBaBWAgBaAQBaBaBaAz_A_A_zAQBa_ABWAgBW ____________________BaBaBaBaBaBaBWBaBaBaBaAgAz_L_A_AAzBWAgBWBa_A ____________Ba______BaBaByBWAgBaBaAcBaAcBaBaAzAz_A_A_LAzAQBW_A_A __________BaBa____BaBaBaAgBaBaBWAgBaBWAQAzBaAgBaAc_A_A_A_A_A_A__ ________BaBaBaBaBWAQBaBaBZBaAzBaAzBWAQBaAz_ABaAzAQAz_A_A_A______ ________BaBaBaBaBaAcBaBWAgBaBaAQAzAgAzAc_L_A_ABW_L_A_A_A_A______ ______BaBaBaBaBaBaAzAgBWBaBaBaBWBaBWAQAz_A_A_AAgBW_A_A_A_A______ ______BaBaBaAgBWAgBWAzAQBaAcBaAgBWAQAz_L_A___A_A_A_A_A__________ ______CjBaBWBWBaCjCuAgAzAcBaAcBaBaAzAc_A_______A_A_A_A__________ ______CjByAgBaCjCu_LCuAzAgAcAzAQBWAQAz_A________________________ ______BaBaBWBaCjCu_ACuAQAzAz_A_ABaBaAc_A________________________ ____BaBaBaAgBaBaCjCuAzAcAQ_A_L_ABWAgAz_L________________________ ____BaBaAgBWBaBaAzBaAQAz_z_A_AAQBaBWAz_A________________________ ____BWBaBaAzAQBWAQAAAcAQ_ABaBWBaBaAQ_A_A________________________ ____BaAgBaAQBWAQ_zAAAz_z_ABa_AAgBWAc_A_A________________________ ______BaBWAgBWAA_$_zAQ_A_A_A_ABWAQ_A_A__________________________ ______BaAgBWAACpAAAz_z_A_A_AAQAz_A_A____________________________ ______AgBW_AAcCu_zAQ_A_A_A_A_A_A_A______________________________ ___________ACuAgAz_z_A__________________________________________ __________CuCu_A_A_A____________________________________________ ________Cu__Cu__________________________________________________ ________Cu__Cu__________________________________________________ ________________________________________________________________ } # tile 533 (bad egg) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________ClCl____________________________________ ____________________ClClClClClCl________________________________ __________________ClClClC$C$ClClCl______________________________ ________________ClClC$C$C$C$C$ClClCl____________________________ ________________ClC$C$C$C$C$C$C$ClCl____________________________ ______________ClClC$C$C$C$C$C$C$ClClCl__________________________ ______________ClC$C$C$C$C$C$C$C$C$ClCl__________________________ ____________ClClC$C$C$C$C$C$C$C$C$ClClCl___A_A_A_A_A_A__________ ____________ClClC$C$C$C$C$C$C$C$C$ClClCl_A_A_A_A_A_A_A_A________ ____________ClClC$C$C$C$C$C$C$C$C$ClClCl_A_A_A_A_A_A_A_A________ ____________ClClC$C$C$C$C$C$C$C$C$ClClCl_A_A_A_A_A_A_A_A________ ____________ClClC$C$C$C$C$C$C$C$ClClClCl_A_A_A_A_A_A_A_A________ ______________ClClC$C$C$C$C$C$C$ClClCl_A_A_A_A_A_A_A_A__________ ______________ClClClC$C$C$C$C$ClClClCl_A_A_A_A_A_A_A_A__________ ________________ClClClC$C$C$ClClClCl_A_A_A_A_A_A_A_A____________ __________________ClClClClClClClCl_A_A_A_A_A_A_A_A______________ ____________________ClClClClClCl_A_A_A_A_A_A_A__________________ _________________________A_A_A_A_A_A_A_A________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 534 (killer tripe ration) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________AvBRBRBRBRBRAvBRBR____________________________ ______________BRAvBRBRAvAvAvBRBRBRBRBRAvBRBR____________________ ____________BRBRAvAvAvAvBRBRAXAvAvAvBRBRBRAvBRAvBR______________ __________BRAvAvAvAvAXAvAvAvAvAvAvAXAvAvAvAvAvBRBRBRBR__________ __________BRBRAvAvAvAvBRAvAvAvAXAvAvAvAvAXAvAXAvAvBRAvBR________ __________BRAvAvAvAXAvBRAvAvAvAvAvAvAXAvAvBRBRAXAvAvAvAvAv______ ________BRBRAvAXAvAvAvBRAvAvAXAvAvAvAvBRBRAvBRBRAvAXAvAvBR______ ________BRAvAvAvAvAvAXBRBRAvAvAvAXAvAvAvBRBRAvBRAvAvAvBRAv______ ________BRBRAvAvAXAvAvAvAvBRBRAvAvAvAvAXAvAvAvAvAXAvAvAvBR______ ________AvBRAXAvAvAXAvAvAvAvBRBRBRAvAvAvAvAvAXAvAvAvBRBRAX______ ________BRBRBRAvAvAvAvAvBRBRAXBRBRAvBRAvAvAvAvAvAXBRAvBRAX______ ________AXBRAvBRAvBRBRAvAXAXAXAXAXAXAXBRBRAvBRAvBRBRBRAXAX______ ________AXAXAXBRBRBRAXAXAXAXAXAXAXAXAXAXAXBRAvBRAvAvAXAX_A______ ________AXAXAXAXAXAXAXAXAXAX_AAXAXAXAXAXAXAXAXAXAXAXAXAX_A______ _________AAXAXAXAXAXAXAX_A_A_A_A_A_A_AAXAXAXAXAXAXAXAX_A________ _________A_A_AAXAXAX_A_A_A_A_A_A_A_A_A_A_AAXAXAXAXAX_A_A________ ___________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A__________ _______________A_A_A_A_A_A_____________A_A_A_A_A_A_A____________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 535 (killer food ration) { ____________BsBs________________________________________________ __________BsCFCFBs______________________________________________ __________BMBsBsBD______________________________________________ __________BMBMBMAi______________________________________________ __________BM_k_gBd______________________________________________ ________BMC$_k_g_gAi____________________________________________ ______BMC$_k_k_k_g_gBd__________________________________________ ______BM_k_k_k_k_g_gAi__________BsBsCFCFCFCFCFCFBsBs____________ ______BM_k_k_k_k_g_gBd____BsCFCFCFCFCFCFCFCFCFCFCFCFBs__________ ____BM_k_k_k_k_k_g_g_gAiBsCFCFCFCFCFCFCFCFBsBsCFCFCFCFBs________ __BM_k_k_k_k_k_k_g_g_gBsBsCFCFCFCFCFBsBsBsBsCFCFCFCFCFCFBs______ __BM_k_k_k_k_k_k_g_gBsBsCFCFCFCFCFCFCFCFCFCFCFCFCFBsCFCFBsBs____ __BMCl_k_k_k_k_k_gBsCFCFCFBsBsCFCFCFCFCFCFCFCFCFCFCFBsCFBsBs____ __BMClClClClBMBMBMCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFBsCFBsBsBsBs____ __BMClClClClClBMBsBsBsCFCFCFCFCFCFCFCFBsBsCFCFCFCFBsBsBsBsBs____ __BMClClClClClBsBsCFCFCFCFCFCFCFBsBsBsBsBsBsBsCFBsBsBsBsBsBs____ __BMClClClClBMBsCFCFCFCFCiCnCiCnCFCFCiClClBsBsBsBsBsBsBsBsBs____ __BMClClClClBMCFCFCFCFCnClClCiCtCnCiCnClClCiBsBsBsBsBsBsBsBs_A__ __BM_kClClClBMBsCFCiClClClCiClClClClClClClClCnBsBsBsBsBsBsBs_A_A __BM_k_k_kBMBMCFCFCiCnClClClClCiClClClClClClCiBsBsBsBsBsBsBs_A_A __BDBF_k_k_k_gBsCFClClCiClClClClClClClCiClClClCFBsBsBsBsBsBs_A_A ___MBDBM_k_k_gBsCFCcClClClClClClClClClCnClCiCnCFBsBsBsBsBsBs_A_A ____AiBdAiBdAiBdCFCnClClClClCnClClClClClClCnCcCFBsBsBsBsBs_A_A_A _____A_ABdAiBDBsCFCiCiClClCnCiClCiClClClClClCiCFCFBsBsBsBs_A_A_A _______A_A_A_ACFCFClClClClClCtClClClClCiClClClCFCFBsBsBs_A_A_A_A ___________A_ACFCFClClCnCiClClClClClClClClClCnCFCFBsBs_A_A_A_A__ ______________CFBsCiClClClCnCiClCnClCnCtClClClCcCFBs_A_A_A_A____ ______________BsCFCcCnClClCtCnCFCFCcClCnCiClCFCFCFBs_A_A_A______ ______________BsBsCFCFCFCFCFBsCABsCFCFCFCcCFCFCFBs_A_A_A________ ________________BsBsBsBsCFBsCF_A_ABsBsBsBsBsBsBs_A_A_A__________ ___________________A_A_A_z_A_B_A_A_A_A_A_A_A_A_A_A_A____________ _____________________A_A_A_A_A_A_A_A_A_A_A_A_A_A________________ } # tile 536 (pile of killer coins) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________CjCjCt__________________________ ________________________CjCjCt__CjCjCf__________________________ ________________________CfCjCjCjCjCtCjCjCt______________________ ____________________CjCjCtCfCfCjCfCjCjCjCj_z_A__________________ ____________________CfCjCjCjCjCtCfCjCjCtCjCt_A_A________________ ______________CjCjCt_zCjCjCtCjCfCfCjCjCjCjCfCf_B_ACjCjCt________ ______________CjCfCjA_CjCjCjCjCjCoCjCjCtCjCjCt_A_zCjCjCf_A______ ________________AA_zCjCjCtCfCjCjCfCjCjCjCjCjCf_O_z_z__AA_A______ ____________________CjCfCjA_CjCjCtCjCjCo_z_z_N_A________________ ______________________AA_z_ACjCjCfCjCjCfAA_A_ACjCjCt____________ _______________________________$_M_z_z_N_A____CjCjCf_A__________ ______________CjCjCt_A___________________________$_L_z__________ ______________CjCjCf_A__________________________________________ _________________zAA_A__________________________________________ ________________________________________________________________ } # tile 537 (large pile of killer coins) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________CtCtCr__________________________ ______________________________CtCtCLBbCLB_______________________ ____________________________CtCtCtBvCLB_B_______________________ ____________________CtCtCrCLCtCtCrCLBbB_B_______________________ __________________CtCtCtCrBbCLBZCrCrCLAzB_B_____________________ __________________CtCtCrCrCLBZCLCLCrBbB_B_B_____________________ ________________CtCtCtCrCLBZCLBtBvCLCLBZB_B__A_A_A_A____________ ________________CtCtCtCrBZCLBvCLBzBvBtCLB_B__A_A_A_A_A__________ ________________CtCtCrCrCLBtCLBZCLCLCLBvCLB_B__A_A_A_A__________ ________________CtCtCtCrBvCLBZCLCrCrBZCLBbB_B__A_A_A____________ ________________CtCtCtCrCrCLCLAxCrCrCrCLBZB__z_A_A______________ _________________ACtCrCrCrCLBZB_B_CrCrCLB__z_A_A_A______________ _________________A_A_ACrCrBbCLB_B_CrCrBZ_z_A_A_A________________ ___________________A_A_A_A_z_A_A_A_A_A_z_A_A_A__________________ _______________________A_A_A_A_____A_A_A_A_A____________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 538 (huge pile of killer coins) { ________________________________________________________________ __________________________B_B_B_________________________________ ______________________B_B_CLCLCLB_B_____________________________ ____________________B_CrCLBbCLCrCLCrB___________________________ __________________B_CrCLCLCLCrCLCrCsCrB______A_A_A_A_A__________ ________________B_CrCUBZCLCrCLCrCsCrCLCrBZ_A_A_A_A_A_A_A_A______ ________________BZCLCLCLCrCLCrCsCrCLCrCLB__A_A_A_A_A_A_A_A______ ________________B_BZCLCrCLCrCsCrCLCrCLBZB__A_A_A_A_A_A_A_A______ ________________BZB_CLCLCrCsCrCLCrCLBZB_BZ_A_A_A_A_A_A_A________ ________________B_B_CLBZCLCrCLCrBbCLB_BZB__A_A_A_A_A_A_A________ ________________BZB_BZBZCrCLCLCLBWB_BZB_BZ_A_A_A_A_A_A__________ ________________B_B_B_CLCUBZCLBZBbCLB_BZB__A_A_A_A_A_A__________ ____________B_B_CLCLCLAzB_CLCLBvBZB_BZB_BZ_A_A_A_A_A_A__________ __________B_CrCLBbCLCrCLCrB_CLBZBbCLB_BZB__A_A_A_A_A_A__________ ________B_CrCLCLCLCrCLCrCsCrB_CLBZB_BZB_B_B__A_A_A_A_A_A_A______ ______B_CrCUBZCLCrCLCrCsCrCLCrBZBZB_B_CLCLCLB_B__A_A_A_A_A_A_A__ ______BZCLCLCLCrCLCrCsCrCLCrCLB_B_CrCLBbCLCrCLCrB__A_A_A_A_A_A__ ______B_BZCLCrCLCrCsCrCLCrCLBZB_CrCLCLCLCrCLCrCsCrB__A_A_A_A_A__ ______BZB_CLCLCrCsCrCLCrCLBZB_BZCLCLCLCrCLCrCsCrCLCrBZ_A_A_A_A__ ______B_B_CLBZCLCrCLCrBZCLB_BZB_BZCLCrCLCrCsCrCLCrCLB__A_A_A____ ______BZB_BZBZCrCLCLCLBZB_BZB_BZCUCrCLCrCsCrCLCrCLBZB__A_A_A____ ______B_BZBZCLCUBZCLBZBZCLB_BZB_BvCLCrCsCrCLCrCLBZB_BZ_A_A_A____ ______BZB_BZBZCrCLCLCLBZB_BZB_BZCLBbCLCrCLCrCLBZB_BZB__A_A______ ______B_BbBvCLCUBZCLB_CLBbB_BZB_BZBZCrCLCLBbBZB_BZB_BZ_A_A______ ______BZB_BZBZCrCLCLBvBZB_BZB_BZCLBZCUCLBvBZCLCLB_BZB__A_A______ ______B_BZBZCLCUBZCLBZBtCLB_BZB_BZCLCLBtCLBZCLBZB_BZB__A________ ______BZB_BZBZCrCLCLCLBZB_BZB_BZBZBZCrCLCLBZBZB_BZB_BZ_A________ _______zBZBZCLCUBZCLB_CLBvB_BZB_CLCLCLBvCLBZCLCLB_BZ_A_A________ _______A_zBZBZCrCLCLCLB_B_BZB__ABZB_CrCLCLBbBWB_BZ_A_A__________ _________A_ACLCUBZCLBZBbCL_A_A_A_ACLCUBbCLBvBbCL_A_A____________ ___________A_A_ACLCLBv_z_A_A_____A_A_ACLCLBt_z_A_A______________ _______________A_A_z_B_A_____________A_z_A_L_A__________________ } # tile 540 (Nightmare) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________CBCB____________________________ ___________________GBPBP______CBCqCfCBCB________________________ ______________________BPBqCBABABABANABCq______________CB________ __________________________ABABABABABCfCfCB__________CBCB________ ________________________ABCuCuABABABANAOCf______CBCqCfCqCB______ ______________________ABABABAB__ABABABCqCY__CBCfABABAKCBCB______ ______________________ABABAB____ABABABABCB__CBANABABCq__________ ____________CB________________ABABABCqCq____ABABABCqCB__________ ____________Cq__CB____________ABABABABCB____ABABABAB____________ __________CqCfCBABABAB______ABABABAB__________ABAB______________ __________CqCfANAB__ABABABABABABABABAB________ABABAB____________ __________CfAKCq________ABABABABABABABAB______ABAB______________ ____________Cj__CBCBABABAB_A_AABABABABABAB__CBABAB______________ ______________CxABABAB_______A_AABABABABABABCqABAB______________ ______________CqABCB___________A_AABABABABABABAB_A______________ ____________CqABABCq______CB__CB_A_AABABABABABATAT______________ ______________CfCf________CBCB_A_A_AABABABCfCBATAT_A____________ __________________________CB_A_A_A_AABABCYCfATATAT_A_A__________ ________________________AqAB_A_AATCBABABCBCyATATAT_A_A__________ ______________________CBATABCBCBAqCBABABCqAqATATAT_A_A_A________ _____________________AATCBABCBAqCBCBABABAqAqATAT_A_A_A_A________ _____________________AAqCBABCBCBCqABABCBAqAqAT_A_A_A____________ _____________________AAqCfANCBCqCqABABCBAqAq_A_A_A______________ _____________________AATCqABCBAqCxABANCfAqAT_A__________________ _______________________ACfCY_AATAqCqABAqAqAT____________________ ________________________Cf_LCf__ATCfABAqATAT____________________ __________________________Cf______CyABCfAT______________________ ____________________________________CfCy________________________ } # tile 541 (Beholder) { ________________________________________________________________ ________________________________________________________________ ________________________________________________C$______________ __________C$____________C$____________________C$_KCP____________ ________C$CbCP________C$AgCP______________CpCpCpCV______________ __________CPCY________CYCP____________CpCpCBCCCB________________ __________BoBNCY______CpBo__________CpCqCCCB______________C$____ ____________BpBN______CZCxCZCxCpCYCYCxCB________________C$CfCP__ ____________CBBNCYCYCqCdCqCdCdCxCZCpCpCBCBCC____________CBCP____ ______________CBBOBoCxCdCdCdCdCYCYCYCZCYCBCBBo________CBBoAr____ __________________CdCdCdCnCuCpCoCjCVCBCBCBCBBo______CBBNAr______ __________________CxCdCnCYC$C$CjByCjCPBmBpCBBoBOCBCBBNBO________ ________________CbCdCdCpC$C$CjCM_MByCjCPBkCdBoCBBNBNBO__________ ________________CZCxCdCgCbC$C$CjByCjCPCJCdCBBoBNBO______________ __________CYCxCqCqCZCdCdCgCxCZCoCjCXCdCdCYCBBpBoBR______________ ________CpCYCYCBCYCuCxCdCdCdCdCdCdCdCpCYCBCBBoBNAr______________ ________CxBp____CYCpCZCxCZCxCdCxCuCuCYCCCBBoBoBOBT______________ ________CxC$____CCCYCpCpCxCpCYCYCCCBCBCBCBBoBNBOBO______________ ________C$_jCP__CBCYCBCYCCCYC$AGC$ATC$BNBOBNBOBTAyCY____________ __________CP______BpCBCYATAT_$_A_A_A_$ATATBRBOAyBoCZCY__________ __________________CBCBBpCBC$AT_$_$_$ATC$CBBOAy____BRC$CY________ ____________________BoBoBoBOATC$ATC$ATBoBOAy______C$CDCP________ ______________________BpBoBoBoBpBoBNBoAyAy__________CP__________ __________________________BNBNBNArBOAxBP________________________ ____________________________________________________Cw__________ ________________________________________________________________ ________________________________________________________________ _____________________A_A_A_A_A_A_A_A_A_A_A_A_A_A________________ ___________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A______________ _____________________A_A_A_A_A_A_A_A_A_A_A_A_A_A________________ _________________________A_A_A_A_A_A_A_A_A_A____________________ ________________________________________________________________ } # tile 542 (Vecna) { __________________________CM____Ba______________________________ ____________________CM__CMCMBa__Ba______________________________ __________________CMCMCMCMCMCMBaBaBa____________________________ __________________CMAGATAG_$_z_z_zBa____________________________ __________________AGATCVCoCmCoCP_z_z____________________________ __________________AGCV____CmCuCuCV_z____________________________ __________________ATCP____CmCuCuCP_z____________________________ __________________AGCVCmCmAOCmCmCV_z____________________________ ______________Cj__AT_A_ACmCmCm_A_A_z____________________________ __ATAGAT__Cj______AG_A_A_A_A_A_A_A_z_____z_z_z__________________ __CMAGATATAX______ATAG_ACPCPCP_A_z_z_z_z_z_zBa__________________ ____CMAGAGATAIATATAGATAGATAG_z_z_zAT_z_z_zBa____________________ ______CMATAGATAGAGATBaAGATAG_zCMCMAG_z_zBa_$ATAG________________ _______zCMBaBaByBaBa_zATAGAT_zArAqCMBaBZ_z_zAGBa________________ ____CM_z_z_z_z_z_z_zBaAGATAG_z_$CM_z_z_z_$ATBa________BgBg______ ______CMCMAGATAGATBaAGATAGAT_z_zCMATAGATBaBa_z______BgBg_s_p____ __Cj____ATBaBaBaBaAGATAGATAG_z_z_zCMCMBZAGAT_z_z____BgAF_s_p____ ____CjATAG_$_z____AGATAGAGAT_$_z_z______ATAG_z_z____Ae_p_p______ ______AXAG_z_z____CMCMAGATAG_zATBa______AGATAG_z_z__AlAl________ ______AXCj_z_z____ATAGATCMCMBZBa_z________AGAT_z_zAlAl__________ __CjAXAT_$_z______AGATAGAGATAG_z_z_z______AGAT_z_zAlAl__________ Cj__CiCj_z________AGAGAT_zAGAT_$_z_z______ATAG_zCmAl____________ CjCjCjCiCnCj______AT_zAG_zATAG_z_z_z______AGCoCoAlAl____________ __CjCiCnCjCiCj__ATAG_zAT_zAGAT_z_z_z________CmAlCm______________ __CjCiCn__Cj____AI_z_zAG_zATAG_z_z_z_z______CmAlCm______________ ____CjCj________AT_zAGAT_zAGAT_z_$_z_z______AlAl________________ ________________AG_zATAG_zAT_zAG_z_z_z______AlAl________________ _________________zATAG_z_zAG_$AT_z_z_z_A_AAlAl_A_A______________ _______L_L_N_A_z_zAGAT_zATAG_zAT_z_$_z_M_AAlAl_A_A______________ _______LA__A_z_zAGATAG_zAGAT_zAG_z_z_z_zAlAl_A_A________________ _________A_A_AA__MAG_zATAGAT_z_z_z_B_M_AAlAl____________________ _________A_z_M_A_A_z_B_A_M_z_N_A_A_z_A__________________________ } # tile 547 (flame mage) { ________________________________________________________________ ______Cz__________________CfCfCz__________________Cz__Cz__Cz____ ____Cz__________________CfCfCUCfCf________________Cj__Cz________ ____Cy__Cz____________CfCfCLCTCUCfCz____________CzCz____Cy______ __CzCj__CzCy________CzCfCUCTCnCnCLCfCy__________CzCfCz__Cz______ __CzCzCf__Cz________CfCLCnAZCnAKCnCLCz__________CjCfCy__CzCy____ __CyCzCf__Cy________CfCUCnCiCiCnCTCLCy______Cz____CfCzCy__Cz____ __CzCfCfCjCz________CyCzCUCnCnCnCLCzCz__________CzCfCz____Cy____ ______CzCjCzCz____CfCfCzCLCnCYCTCLCyCfCf______CzCyCfCj__Cz______ __CjCfCz__CzCy__CfCfCzCyCfCLCTCLCzCfCzCzCfCz______CzCj__Cz______ __CzCfCfCzCz__CzCfCzCzCzCfCUCTCLCzCfCzCzCzCfCzCwCjCzCzCfCz______ ____CfCz____CzCfCzCzCzCzCfCfCLCzCzCrCzCzCfCzCzCzCz__CfCzCf______ __Cz__Cy__CLCyCzCfCzCzCzCfCfCLCyCzCfCzCyCzCzCzCf____Cf__Cf______ __CyCf__CzCfCrCzCyCzCzCzCfCzCLCzCzCfCyCzCyCzCzCfCzCLCzCfCjCw____ __CjCzCLCrCfCrCzCzCzCzCzCfCzCLCzCzCfCzCzCyCzCyCrCrCrCLCjCjCw____ CiCjCfCfCrCzCLCzCzCyCzCzCfCzCLCzCzCzCzCyCzCyCzCLCrCrCfCzCjCz____ CnCiCfCfCUCyCLCyCz__CzCzCfCzCLCzCzCzCfCz__CzCyCLCzCLCzCfCzCi____ __CzCiCfCLCLCyCz____CzCzCfCyCLCLCzCzCfCz____CLCzCyCLCiCfCnCz____ __CzCqCqCyCLCz______CzCzCzCzCLCzCzCzCfCzCy__CwCwCLCzCyCqCqCz____ ____CyCqCzCL________CzCfCfCzCLCyCzCzCfCyCz__Cw__CwCwCzCzCy______ ______CyCy________CzCzCfCzCyCLCzCzCzCfCzCz__CwCw__Cw_____A_A____ __________________CzCzCfCzCzCLCyCzCzCfCzCy____CwCw_A_A_A_A_A_A_A __________________CzCfCfCzCyCLCzCzCzCfCzCz___A_A_A_A_A_A_B_A_A_A ________________CzCzCfCzCyCzCLCyCzCzCfCzCy_A_A_A_A_z_A_A_A_A_A_A ________________CzCzCfCzCyCLBrCLCyCzCfCfCz_A_A_A_A_B_A_A_A_A_A__ ________________CzCzCfCyCzCLCBCLCyCzCyCfCy_A_A_A_A_A_A_A_A_A____ ______________CzCzCfCzCzCyCLCBCLCzCyCzCfCzCz_A_A_A_A_A_A_A_z_A__ __________CLCrCzCzCfCzCyCzCLCBBrCLCzCzCfCzCyCL_A_A_A___A_B_A_A_A __________CrCLCrCfCfCzCyCLCBCBBoCUCLCzCfCfCLCL_A_A_A_______A_A_A _________A_ACrCLCrCLCLCLCLCBCBCBBrCLCLCLCUCLCL_A_A______________ ___________A_A_ACrCLCLCL_A_A_B_B_A_ACLCLCL_A_A_A________________ _______________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A________________ } # tile 549 (ice mage) { ________________________________________________________________ __________________________CiCPCS________________________________ ________________________CWCPCVCWCP______________________________ ______________________CgCPCmCJCVCPCS____________________________ ____C$______________CSCWCVCTCgCnCVCWCS__________________________ __C$C$CS____________CPCVCgANCnABCnCVCS________________CQCQ______ ____CS______________CPCVCiCnCiCiCTCVCS______________CQCoCQCQ____ __________C$________CSCSCVCnCJCJCmCSCS______________CQCQCQBe____ __C$____C$C$CS____C$CoCSCVCiBiCTCVCSC$Co______________CQBe______ C$C$CS____CS____C$CoC$CSC$CVCTCVCSCoC$C$C$CS________Be__________ __CS__________CSCoC$CSC$CoCVCTCVCSC$CSC$C$CoC$__________CQ______ ____________CSC$C$C$CSC$CoC$CVCSC$CoCSCSC$C$C$C$______CQ________ __________CVCSC$C$CSCSC$C$CoCWCSC$C$CSCSCSCSC$CoCS________CQ____ ________CSCoCWC$CSCSCSC$CoCSCWCSC$CoCSCSCSCSCSC$CSCVCSCQ________ __CSCSCSCWC$CgCSCSCSCSC$C$CSCPCSC$CoCSCSCSCSCSCWCoCWCVCSCS______ CnCSCQCTCSCSCVCSCSCSCSC$CoCSCVCSC$C$CSCSCSCSCSCVC$CiC$CQCQCS____ CiCnCnCnCSCSCVCSCS__CSC$C$CSCVCSCSC$C$CS__CSCSCVCoCVCQCnCnCn____ __CSCnCPCSCVCSCS____CSC$CoCSCPCVCSC$CoCS____CVCSC$CmCnCQCiCS____ __CSCQCQCSCVCS______C$C$CSCSCPCSCSC$C$CSCS______CVCSCSCQCQC$____ ____CSCQCSCV________C$CoC$CSCVCSCSC$CoCSCS__________C$CoC$______ ______CSCS________CSC$C$CSCSCiCSCSC$C$CSCS_______________A_A____ __________________CSC$CoCSCSCVCSCSC$CoCSCS_________A_A_A_A_A_A_A __________________C$C$C$CSCSCPCSCSC$C$CSCS___A_A_A_A_A_A_A_A_A_A ________________CSC$CoCSCSCSCVCSCSCSCoCSCS_A_A_A_A_z_A_B_A_A_A_A ________________CSC$C$CSCSCVBeCVCSCSC$CoCS_A_A_A_A_A_A_z_A_A_A__ ________________CSC$CoCSCSCVCQCVCSCSCSC$CS_A_A_A_A_B_A_A_A_A____ ______________CSC$C$CSCSCSCVCQCPCSCSC$CoCSCS_A_A_A_A_A_A_A_A_A__ __________CPCWCSC$CoCSCSCSCVCQBeCVCSC$C$CSCSCP_A_A_A___A_A_B_A_A __________CiCVCWC$CoCSCSCVCQCQBeCVCPC$CoC$CPCV_A_A_A_______A_A_A _________A_BCiCPCgCmCiCPCPCQCQCQBeCVCiCPCVCiCV_A_A______________ ___________A_B_ACPCVCPCV_z_A_A_A_A_ACmCVCP_A_A_A________________ _______________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A________________ } # tile 552 (necromancer) { ________________________________________________________________ ________________________AlAlAlAeAO______________________________ ____________________________BdBDAeAeAB__________________________ ______________________________BDBDAOABAB________________________ ______________________________BdBDAlAeABAB________AlAlAlAlAl____ ____________________________CDBDBDAlAOAOAsAlAlAlAlBDAlBJ________ ________________AlAlAlAlBDBDBJCDCDBqBPAsBDAlAlAlAlAl____________ ______AlAlAlAlAlBDBDBDBDBdBDAjBDBDAlBDBDAlAlAlAl________________ ______________BDBDBDBDBdBDBDBDBdBJAjAlBDBDAlBJ__________________ ______________________BDBDBDBdBDBDBDAlBTBD______________________ __________________________BkBkBtB_BTBiBtBdAe____________________ ________________________BdBDBkBkCOBtBtBmBdAlAlAl_A_A_A_A________ __As________________BdAlBDAlBkCKBmBkCOBYCPAeAeAeAl_A_A_A_A______ ___$AsBP__________BdAlBDAlBDAlBkCPBkBlBdBD_OAeCoCoBJ_A_A_A______ _______zAsBP____BDBDBdBDBDAlBJBkBkCPCOBkAB_DCo_DCmCoAl_A_A_A_A__ ___________$AsAlBDAlBDAlAlAlAjAlCOBkBlBD_AAeCmCo_ECoAeAl_A_A_A__ _____________zBdAlBdAlAlBJAeAlAlBlBkBkBk_ECo_DCoCmAlAlAl_A_A_A__ ______________AlBDBDAlAlAlAOBDAlBJBkBdAB_LBtCmBtAlAlAlAe_A_A____ ______________AeAlBDAlBPBPAlBDBDAlAlCP_M_z_DBtB_AeAeAlAB_A_A____ ________________AlAlBDAlBtBtAlBDAlAlCKAN_M_EAA_zAeAeAl_A_A______ ________________AOAlAlBDB_BTAsBPAlAjAeAO_A_AAB_AAlAOAe_A_A______ __________________AeAeBD_AAA_$AsBPBPAeAO_z_AAB_AAlAOAB_A_A______ __________________AOAlAl_AABAl_$AsAsBPAB_O_A_AABAlAB_A_A________ __________________AOAlAl_AABAlBD_z_$AsBPAB_z_A_OAB_A_A__________ _________________A_AABAl_AABBDBD_z_zAsAsAB_A_AAB_A_A____________ _______________A_A_AABAe_AAlBDAlAl_$_$AeAB_M_AAB_A_A____________ ___________A_A_A_A_AAlAOABBJAjAlAOAlAlAeAOAB_A_A_A______________ _________A_A_A_AAlAlBDBJABAeBDAlAOAlAeAeABAB_z_A_A______________ _________A_A_A_A_A_AAlAeBDBDBDAeAeAeAlAOAe_M_A_A_A______________ ___________A_A_A_A_A_A_A_AAeAB_AABAlAO_AAe_A_A_A_A______________ _________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A________________ _____________________A_A_A_A_A_A_A_A_A_A_A______________________ } # tile 572 (Bilbo Baggins) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________________Br__BrAvAvBr______________________________ ____________________BrAXBrAvBrAXAvAv____________________________ ____________________AvBrAXAXBrAXBrAI____________________________ __________________BrCTBrAvCTAXBrAXBrAI__________________________ ____________________CnCnCnCnCnCnAXAIBR__________________________ ____________________Ci_f_fCn_f_fCnBrAI__________________________ ____________________Cn_f_fCl_f_fCnAIAI__________________________ ____________________CnCnCnClCnCnCnBRBR__________________________ ____________________CGCnCgClCnCTBwAIAI__________________________ ______________________CTBVBtBVCTAIBRAI__________________________ C$____________________BwCnCnCnBwAI_________A_A_A_A_A____________ CPC$________________BSCFCVBwCWBkCFBsBS___A_A_A_A_A_A_A__________ BdCPC$____________ClBSCFCVCVCVCJCFBsBSCl_A_A_A_A_A_A_A__________ __BkCPCo________ClBjBiBsCFCVBkCFCFBSClCOCO_A_A_A_A_A_A__________ ____BdCPC$____ClCOCOBSBsCFCVBnCFBsBiBjCOCl_A_A_A_A_A_A__________ ______BkCPCoCVBjCOBm__BsCFCVCJCFBs_A_LBkBzCO_A_A_A_A_A__________ ________BkCVCGBmCT__BsBsCFAYALCFBsBS_A_LCJCiCn_A_A_A____________ ________CVAYCiCn____BsCFBWAzBWBvBSBS_A_A_ACnCG_L_A_A____________ ____________CnAYAY__BvBWAz_A_ABWBvAz_A_A_A_A_A_A_A_A____________ ______________AY____BvAzAz_A_ABWBvBW_A_A_A_A_A_A_A_A____________ ____________________CnCnBw_A_ABwCnBw_A_A_A_A_A_A_A_A____________ ________________BsCFBsCnCG_L_ACGCnBsCFBs_A_A_A_A________________ _______________ACnCnCnCTBj_A_ABjCTCTCTCT_A_A_A__________________ _________________A_A_A_A_z_____A_A_A_A_A_A_A_A__________________ ________________________________________________________________ } # tile 573 (High Ice Mage) { ___________________________H____________________________________ _________________________K_H_G__________________________________ ________________________CjCj_G__________________________________ _______________________K_I_HCj_G________________________________ _______________________K_I_HCj_G________________________________ _____________________K_ICjCM_H_H_G______________________________ _____________________K_I_I_H_H_H_G______________________________ ____________________ClC$C$CmCTC$Cm______________________________ __________________ClCiCnC$C$CmCTC$Cm____________________________ ________________CiCiC$CmCTCTCTCTC$C$Cm__________________________ ________________CiC$C$C$CmCnCTCTC$C$C$Cm________________________ __________________C$C$C$C$CoCTC$C$C$C$C$Cm______________________ __________________C$C$C$C$Cm_GC$C$C$C$C$CmCm____________________ ________________C$C$C$C$C$CmCm_GC$C$C$_GCmCmCm__________________ ________________C$C$C$C$C$CmCm_H_G_G_G_G_GCmCm__________________ ______CnCl_KCS_IC$C$C$C$CmCmCm_I_H_H_G_G_GCmCmCm________________ ______CiCl_ICV_IC$C$_HC$CmCmCmCm_I_I_H_G_GCmCmCm________________ _________z_IBh_IC$C$_HCmCmCmCmCm_I_I_I_H_G_GCmCmCm______________ __CMCjCjCjCjCjCMC$C$_HCmCmCmCmCm_I_I_I_H_G_GCmCmCm______________ ___L_______H_H_ACmC$_HCmCmCmCmCm_I_I_K_H_G_GCmCmCm______________ _A___A_______L_H_ACm_H_HCmCmCmCm_I_ICSCV_H_GCmCmCmCV____________ CjCjCM______CjCjCMCm_H_HCmCmCmCm_ICS_K_ICS_G_GCmCVCV____________ __Cj_________HCMCmCm_I_HCmCmCmCm_I_IClCn_HBn_GCmCVCV____________ _______________HCmCm_I_HCmCmCmCm_H_IClCi_GCS_GCVCVCP____________ _______________H_HCm_I_H_HCmCmCm_H_H_G_G_G_GCV_GCVCP____________ _________________HCmCV_I_HCmCmCmCV_H_H_G_G_GBh_GCPCP____________ _________________HCmCV_I_H_HCmCmCV_H_H_G_G_GCV_G_GCPCP__________ ___________________HCV_I_H_HCmCmCVCV_H_H_G_G_GCV_G_GCPCP________ ____________________CP_I_H_H_HCmCVCVCVCV_H_G_G_GCS_G_GCPCPCPCP__ ___________________A_ACVCP_H_H_HCmCVCVCVCVCPCPCPCP_G_G_G_G_G_A_A _______________A_A_A_A_A_I_H_H_H_H_HCVCVCPCPCP_ACPCPCP_A_A_A_A__ _____________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A________ } # tile 634 (apprentice) { ________________________________________________________________ ____________________________AYAYAYAY____________________________ __________________________BSBSAYAYAYAY__________________________ ________________________AYBSAY_zCiBSAYAY________________________ ________________________AYAYAYCiCiCiAY_A________________________ ________________________AYCi_zCl_zCnAYAY________________________ ________________________AYCnClCiCiCn_zAY________________________ ___________________________$CgClCn_AAY__________________________ ______________________________CTCT_z____________________________ _________________________K_KCTCT_H_G_H__________________________ ____________Ce_________K_I_I_G_H_H_H_H_G________________________ ______Ce_____________I_I_H_H_G_H_H_H_H_H_g______________________ __________Ch________Cl_H_H_H_G_H_H_H_G_HCl______________________ __________Cj__Ce__ClCn___H_H_I_G_H_H_H__CnCn____________________ ______Ce__Cj______CXCi___K_H_H_G_H_H_H__CnCi____________________ ____________CjCiCiCnCn___K_I_H_I_G_H_I__CnCl____________________ ____________ClCiCn_______K_H_H_H_H_I_G__CiCi____________________ ____________CiCj_______K_I_I_H_H_H_I_G____CnCn__________________ ______________Cj_______K_I_H_H_H_H_G_H____CnCi__________________ _______________________I_I_H_H_H_I_G_H_G____Ci__________________ _______________________I_H_H_H_H_I_G_H_H________________________ _______________________I_I_H_H_K_G_H_H_G________________________ _______________________K_H_H_H_I_G_H_H_H_G______________________ _____________________K_I_H_H_I_G_H_H_H_G_G______________________ _____________________I_H_H_H_G_H_H_H_H_H_G______________________ _____________________H_H_H_I_G_H_H_H_G_G_G______________________ _____________________H_H_I_G_H_H_H_H_H_G_G______________________ _____________________I_I_G_H_H_H_H_G_G_G_G_G_______z_z_z_z_z_z__ _______________________G_H_H_H_H_H_G_H_G_H_G_G_z_z_z_z_z_z_z____ ________________________CnCiBS_z_$CnCiBS_z_z_z_z_z_z_z_z_z______ ________________________BiBi_z_z_zBiBi_z_z_z_z_z________________ ___________________________z_z_____z_z_z________________________ } # tile 637 (invisible monster) { ________________________________________________________________ ________________________________________________________________ _________________________q_q_q_q_q_q_q__________________________ _______________________q_h_h_h_h_h_h_h_q_q______________________ _____________________q_h_h_h_h_h_h_h_h_h_h_q____________________ ___________________q_h_h_h_h_h_h_h_h_h_h_h_h_q__________________ _________________q_h_h_h_h_h_h_h_h_h_h_h_h_h_q__________________ _______________q_h_h_h_h_h_h_h_h_h_h_h_h_h_h_h_q________________ _______________q_h_h_h_h_h_q_q_q_h_h_h_h_h_h_h_q________________ _______________q_h_h_h_h_h_q_____q_h_h_h_h_h_h_q________________ _________________q_q_q_q_q_______q_h_h_h_h_h_h_q________________ _________________________________q_h_h_h_h_h_h_q________________ ___________________________q_q_q_h_h_h_h_h_h_h_q________________ _________________________q_h_h_h_h_h_h_h_h_h_q__________________ _________________________q_h_h_h_h_h_h_h_h_q____________________ _________________________q_h_h_h_h_h_h_h_q______________________ _________________________q_h_h_h_h_h_q_q________________________ _________________________q_h_h_h_h_h_q__________________________ _________________________q_h_h_h_h_h_q__________________________ ___________________________q_q_q_q_q____________________________ ________________________________________________________________ _____________________________q_q_q______________________________ ___________________________q_h_h_h_q____________________________ _________________________q_h_h_h_h_h_q__________________________ _______________________q_h_h_h_h_h_h_h_q________________________ _______________________q_h_h_h_h_h_h_h_q________________________ _______________________q_h_h_h_h_h_h_h_q________________________ _________________________q_h_h_h_h_h_q__________________________ ___________________________q_h_h_h_q____________________________ _____________________________q_q_q______________________________ ________________________________________________________________ ________________________________________________________________ } �������������������������������������������������������������slashem-0.0.7E7F3/win/share/objects.map�������������������������������������������������������������0000664�0000764�0000764�00000047157�10545462317�015721� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������tile 0 "object, illegal objects, strange object" tile 1 "object, weapons, crude dagger" tile 2 "object, weapons, dagger" tile 3 "object, weapons, athame" tile 4 "object, weapons, silver dagger" tile 5 "object, weapons, runed dagger" tile 6 "object, weapons, black runed dagger" tile 7 "object, weapons, wooden stake" tile 8 "object, weapons, great dagger" tile 9 "object, weapons, worm tooth" tile 10 "object, weapons, knife" tile 11 "object, weapons, stiletto" tile 12 "object, weapons, scalpel" tile 13 "object, weapons, crysknife" tile 14 "object, weapons, axe" tile 15 "object, weapons, double-headed axe" tile 16 "object, weapons, broad pick" tile 17 "object, weapons, crude short sword" tile 18 "object, weapons, short sword" tile 19 "object, weapons, silver short sword" tile 20 "object, weapons, broad short sword" tile 21 "object, weapons, runed short sword" tile 22 "object, weapons, black runed short sword" tile 23 "object, weapons, broadsword" tile 24 "object, weapons, runed broadsword" tile 25 "object, weapons, runed broadsword" tile 26 "object, weapons, long sword" tile 27 "object, weapons, silver long sword" tile 28 "object, weapons, samurai sword" tile 29 "object, weapons, two-handed sword" tile 30 "object, weapons, long samurai sword" tile 31 "object, weapons, curved sword" tile 32 "object, weapons, rapier" tile 33 "object, weapons, silver saber" tile 34 "object, weapons, club" tile 35 "object, weapons, thonged club" tile 36 "object, weapons, baseball bat" tile 37 "object, weapons, fly swatter" tile 38 "object, weapons, silver mace" tile 39 "object, weapons, mace" tile 40 "object, weapons, morning star" tile 41 "object, weapons, flail" tile 42 "object, weapons, war hammer" tile 43 "object, weapons, heavy hammer" tile 44 "object, weapons, staff" tile 45 "object, weapons, vulgar polearm" tile 46 "object, weapons, single-edged polearm" tile 47 "object, weapons, forked polearm" tile 48 "object, weapons, hilted polearm" tile 49 "object, weapons, long poleaxe" tile 50 "object, weapons, pole cleaver" tile 51 "object, weapons, angled poleaxe" tile 52 "object, weapons, pole sickle" tile 53 "object, weapons, pruning hook" tile 54 "object, weapons, hooked polearm" tile 55 "object, weapons, pronged polearm" tile 56 "object, weapons, beaked polearm" tile 57 "object, weapons, crude spear" tile 58 "object, weapons, spear" tile 59 "object, weapons, silver spear" tile 60 "object, weapons, runed spear" tile 61 "object, weapons, stout spear" tile 62 "object, weapons, throwing spear" tile 63 "object, weapons, trident" tile 64 "object, weapons, lance" tile 65 "object, weapons, crude bow" tile 66 "object, weapons, bow" tile 67 "object, weapons, runed bow" tile 68 "object, weapons, black runed bow" tile 69 "object, weapons, long bow" tile 70 "object, weapons, crude arrow" tile 71 "object, weapons, arrow" tile 72 "object, weapons, silver arrow" tile 73 "object, weapons, runed arrow" tile 74 "object, weapons, black runed arrow" tile 75 "object, weapons, bamboo arrow" tile 76 "object, weapons, sling" tile 77 "object, weapons, pistol" tile 78 "object, weapons, submachine gun" tile 79 "object, weapons, heavy machine gun" tile 80 "object, weapons, rifle" tile 81 "object, weapons, assault rifle" tile 82 "object, weapons, sniper rifle" tile 83 "object, weapons, shotgun" tile 84 "object, weapons, auto shotgun" tile 85 "object, weapons, rocket launcher" tile 86 "object, weapons, grenade launcher" tile 87 "object, weapons, bullet" tile 88 "object, weapons, silver bullet" tile 89 "object, weapons, shotgun shell" tile 90 "object, weapons, rocket" tile 91 "object, weapons, frag grenade" tile 92 "object, weapons, gas grenade" tile 93 "object, weapons, red stick" tile 94 "object, weapons, crossbow" tile 95 "object, weapons, crossbow bolt" tile 96 "object, weapons, dart" tile 97 "object, weapons, throwing star" tile 98 "object, weapons, boomerang" tile 99 "object, weapons, bullwhip" tile 100 "object, weapons, rubber hose" tile 101 "object, armor, Hawaiian shirt" tile 102 "object, armor, T-shirt" tile 103 "object, armor, plate mail" tile 104 "object, armor, crystal plate mail" tile 105 "object, armor, bronze plate mail" tile 106 "object, armor, splint mail" tile 107 "object, armor, banded mail" tile 108 "object, armor, dwarvish mithril-coat" tile 109 "object, armor, dark elven mithril-coat" tile 110 "object, armor, elven mithril-coat" tile 111 "object, armor, chain mail" tile 112 "object, armor, crude chain mail" tile 113 "object, armor, scale mail" tile 114 "object, armor, studded leather armor" tile 115 "object, armor, ring mail" tile 116 "object, armor, crude ring mail" tile 117 "object, armor, leather armor" tile 118 "object, armor, leather jacket" tile 119 "object, armor, red robe" tile 120 "object, armor, blue robe" tile 121 "object, armor, orange robe" tile 122 "object, armor, green robe" tile 123 "object, armor, gray dragon scale mail" tile 124 "object, armor, silver dragon scale mail" tile 125 "object, armor, shimmering dragon scale mail" tile 126 "object, armor, deep dragon scale mail" tile 127 "object, armor, red dragon scale mail" tile 128 "object, armor, white dragon scale mail" tile 129 "object, armor, orange dragon scale mail" tile 130 "object, armor, black dragon scale mail" tile 131 "object, armor, blue dragon scale mail" tile 132 "object, armor, green dragon scale mail" tile 133 "object, armor, yellow dragon scale mail" tile 134 "object, armor, gray dragon scales" tile 135 "object, armor, silver dragon scales" tile 136 "object, armor, shimmering dragon scales" tile 137 "object, armor, deep dragon scales" tile 138 "object, armor, red dragon scales" tile 139 "object, armor, white dragon scales" tile 140 "object, armor, orange dragon scales" tile 141 "object, armor, black dragon scales" tile 142 "object, armor, blue dragon scales" tile 143 "object, armor, green dragon scales" tile 144 "object, armor, yellow dragon scales" tile 145 "object, armor, mummy wrapping" tile 146 "object, armor, coarse mantelet" tile 147 "object, armor, hooded cloak" tile 148 "object, armor, slippery cloak" tile 149 "object, armor, faded pall" tile 150 "object, armor, white coat" tile 151 "object, armor, leather cloak" tile 152 "object, armor, tattered cape" tile 153 "object, armor, dirty rag" tile 154 "object, armor, opera cloak" tile 155 "object, armor, ornamental cope" tile 156 "object, armor, piece of cloth" tile 157 "object, armor, leather hat" tile 158 "object, armor, iron skull cap" tile 159 "object, armor, hard hat" tile 160 "object, armor, fedora" tile 161 "object, armor, conical hat" tile 162 "object, armor, conical hat" tile 163 "object, armor, dented pot" tile 164 "object, armor, plumed helmet" tile 165 "object, armor, etched helmet" tile 166 "object, armor, crested helmet" tile 167 "object, armor, visored helmet" tile 168 "object, armor, old gloves" tile 169 "object, armor, padded gloves" tile 170 "object, armor, riding gloves" tile 171 "object, armor, black gloves" tile 172 "object, armor, fencing gloves" tile 173 "object, armor, small shield" tile 174 "object, armor, blue and green shield" tile 175 "object, armor, white-handed shield" tile 176 "object, armor, red-eyed shield" tile 177 "object, armor, large shield" tile 178 "object, armor, large round shield" tile 179 "object, armor, polished silver shield" tile 180 "object, armor, walking shoes" tile 181 "object, armor, hard shoes" tile 182 "object, armor, jackboots" tile 183 "object, armor, combat boots" tile 184 "object, armor, jungle boots" tile 185 "object, armor, hiking boots" tile 186 "object, armor, mud boots" tile 187 "object, armor, steel boots" tile 188 "object, armor, riding boots" tile 189 "object, armor, snow boots" tile 190 "object, rings, wooden" tile 191 "object, rings, topaz" tile 192 "object, rings, ridged" tile 193 "object, rings, black onyx" tile 194 "object, rings, shiny" tile 195 "object, rings, wedding" tile 196 "object, rings, jade" tile 197 "object, rings, bronze" tile 198 "object, rings, diamond" tile 199 "object, rings, sapphire" tile 200 "object, rings, brass" tile 201 "object, rings, opal" tile 202 "object, rings, obsidian" tile 203 "object, rings, plain" tile 204 "object, rings, granite" tile 205 "object, rings, glass" tile 206 "object, rings, clay" tile 207 "object, rings, coral" tile 208 "object, rings, steel" tile 209 "object, rings, wire" tile 210 "object, rings, pearl" tile 211 "object, rings, engagement" tile 212 "object, rings, copper" tile 213 "object, rings, iron" tile 214 "object, rings, twisted" tile 215 "object, rings, agate" tile 216 "object, rings, moonstone" tile 217 "object, rings, tiger eye" tile 218 "object, rings, silver" tile 219 "object, rings, ruby" tile 220 "object, rings, ivory" tile 221 "object, rings, emerald" tile 222 "object, rings, gold" tile 223 "object, amulets, square" tile 224 "object, amulets, warped" tile 225 "object, amulets, circular" tile 226 "object, amulets, convex" tile 227 "object, amulets, spherical" tile 228 "object, amulets, octagonal" tile 229 "object, amulets, hexagonal" tile 230 "object, amulets, triangular" tile 231 "object, amulets, oval" tile 232 "object, amulets, concave" tile 233 "object, amulets, pyramidal" tile 234 "object, amulets, lunate" tile 235 "object, amulets, Amulet of Yendor" tile 236 "object, amulets, Amulet of Yendor" tile 237 "object, tools, large box" tile 238 "object, tools, chest" tile 239 "object, tools, ice box" tile 240 "object, tools, bag" tile 241 "object, tools, bag" tile 242 "object, tools, bag" tile 243 "object, tools, bag" tile 244 "object, tools, key" tile 245 "object, tools, lock pick" tile 246 "object, tools, credit card" tile 247 "object, tools, candle" tile 248 "object, tools, candle" tile 249 "object, tools, candle" tile 250 "object, tools, lamp" tile 251 "object, tools, brass lantern" tile 252 "object, tools, lamp" tile 253 "object, tools, whistle" tile 254 "object, tools, whistle" tile 255 "object, tools, flute" tile 256 "object, tools, flute" tile 257 "object, tools, horn" tile 258 "object, tools, horn" tile 259 "object, tools, horn" tile 260 "object, tools, horn" tile 261 "object, tools, harp" tile 262 "object, tools, harp" tile 263 "object, tools, bell" tile 264 "object, tools, bugle" tile 265 "object, tools, drum" tile 266 "object, tools, drum" tile 267 "object, tools, land mine" tile 268 "object, tools, beartrap" tile 269 "object, tools, spoon" tile 270 "object, tools, pick-axe" tile 271 "object, tools, fishing pole" tile 272 "object, tools, iron hook" tile 273 "object, tools, unicorn horn" tile 274 "object, tools, torch" tile 275 "object, tools, lightsaber" tile 276 "object, tools, lightsaber" tile 277 "object, tools, lightsaber" tile 278 "object, tools, double lightsaber" tile 279 "object, tools, expensive camera" tile 280 "object, tools, looking glass" tile 281 "object, tools, glass orb" tile 282 "object, tools, lenses" tile 283 "object, tools, blindfold" tile 284 "object, tools, towel" tile 285 "object, tools, saddle" tile 286 "object, tools, leash" tile 287 "object, tools, stethoscope" tile 288 "object, tools, tinning kit" tile 289 "object, tools, leather bag" tile 290 "object, tools, tin opener" tile 291 "object, tools, can of grease" tile 292 "object, tools, figurine" tile 293 "object, tools, magic marker" tile 294 "object, tools, bandage" tile 295 "object, tools, phial" tile 296 "object, tools, candelabrum" tile 297 "object, tools, silver bell" tile 298 "object, food, tripe ration" tile 299 "object, food, corpse" tile 300 "object, food, egg" tile 301 "object, food, meatball" tile 302 "object, food, meat stick" tile 303 "object, food, huge chunk of meat" tile 304 "object, food, meat ring" tile 305 "object, food, eyeball" tile 306 "object, food, severed hand" tile 307 "object, food, kelp frond" tile 308 "object, food, eucalyptus leaf" tile 309 "object, food, clove of garlic" tile 310 "object, food, sprig of wolfsbane" tile 311 "object, food, apple" tile 312 "object, food, carrot" tile 313 "object, food, pear" tile 314 "object, food, asian pear" tile 315 "object, food, banana" tile 316 "object, food, orange" tile 317 "object, food, mushroom" tile 318 "object, food, melon" tile 319 "object, food, slime mold" tile 320 "object, food, lump of royal jelly" tile 321 "object, food, cream pie" tile 322 "object, food, sandwich" tile 323 "object, food, candy bar" tile 324 "object, food, fortune cookie" tile 325 "object, food, pancake" tile 326 "object, food, tortilla" tile 327 "object, food, cheese" tile 328 "object, food, pill" tile 329 "object, food, holy wafer" tile 330 "object, food, lembas wafer" tile 331 "object, food, cram ration" tile 332 "object, food, food ration" tile 333 "object, food, K-ration" tile 334 "object, food, C-ration" tile 335 "object, food, tin" tile 336 "object, potions, brown" tile 337 "object, potions, dark" tile 338 "object, potions, magenta" tile 339 "object, potions, fizzy" tile 340 "object, potions, effervescent" tile 341 "object, potions, luminescent" tile 342 "object, potions, orange" tile 343 "object, potions, sky blue" tile 344 "object, potions, purple-red" tile 345 "object, potions, puce" tile 346 "object, potions, pink" tile 347 "object, potions, yellow" tile 348 "object, potions, muddy" tile 349 "object, potions, cloudy" tile 350 "object, potions, brilliant blue" tile 351 "object, potions, bubbly" tile 352 "object, potions, smoky" tile 353 "object, potions, swirly" tile 354 "object, potions, black" tile 355 "object, potions, cyan" tile 356 "object, potions, golden" tile 357 "object, potions, dark" tile 358 "object, potions, white" tile 359 "object, potions, murky" tile 360 "object, potions, ruby" tile 361 "object, potions, milky" tile 362 "object, potions, icy" tile 363 "object, potions, emerald" tile 364 "object, potions, clear" tile 365 "object, potions, blood-red" tile 366 "object, potions, blood-red" tile 367 "object, potions, sparkling" tile 368 "object, scrolls, LEP GEX VEN ZEA" tile 369 "object, scrolls, PRIRUTSENIE" tile 370 "object, scrolls, VERR YED HORRE" tile 371 "object, scrolls, YUM YUM" tile 372 "object, scrolls, THARR" tile 373 "object, scrolls, KERNOD WEL" tile 374 "object, scrolls, ELAM EBOW" tile 375 "object, scrolls, NR 9" tile 376 "object, scrolls, XIXAXA XOXAXA XUXAXA" tile 377 "object, scrolls, DAIYEN FOOELS" tile 378 "object, scrolls, ZELGO MER" tile 379 "object, scrolls, PRATYAVAYAH" tile 380 "object, scrolls, VENZAR BORGAVVE" tile 381 "object, scrolls, ANDOVA BEGARIN" tile 382 "object, scrolls, KIRJE" tile 383 "object, scrolls, JUYED AWK YACC" tile 384 "object, scrolls, DUAM XNAHT" tile 385 "object, scrolls, HACKEM MUCHE" tile 386 "object, scrolls, ELBIB YLOH" tile 387 "object, scrolls, VE FORBRYDERNE" tile 388 "object, scrolls, VELOX NEB" tile 389 "object, scrolls, FOOBIE BLETCH" tile 390 "object, scrolls, TEMOV" tile 391 "object, scrolls, GARVEN DEH" tile 392 "object, scrolls, READ ME" tile 393 "object, scrolls, stamped" tile 394 "object, scrolls, unlabeled" tile 395 "object, spell books, red" tile 396 "object, spell books, turquoise" tile 397 "object, spell books, velvet" tile 398 "object, spell books, dark" tile 399 "object, spell books, black" tile 400 "object, spell books, thick" tile 401 "object, spell books, white" tile 402 "object, spell books, yellow" tile 403 "object, spell books, indigo" tile 404 "object, spell books, plaid" tile 405 "object, spell books, light brown" tile 406 "object, spell books, glittering" tile 407 "object, spell books, cloth" tile 408 "object, spell books, leather" tile 409 "object, spell books, cyan" tile 410 "object, spell books, dark blue" tile 411 "object, spell books, violet" tile 412 "object, spell books, bronze" tile 413 "object, spell books, gray" tile 414 "object, spell books, dusty" tile 415 "object, spell books, orange" tile 416 "object, spell books, light green" tile 417 "object, spell books, light blue" tile 418 "object, spell books, magenta" tile 419 "object, spell books, dull" tile 420 "object, spell books, thin" tile 421 "object, spell books, wide" tile 422 "object, spell books, big" tile 423 "object, spell books, fuzzy" tile 424 "object, spell books, deep" tile 425 "object, spell books, spotted" tile 426 "object, spell books, long" tile 427 "object, spell books, wrinkled" tile 428 "object, spell books, copper" tile 429 "object, spell books, torn" tile 430 "object, spell books, purple" tile 431 "object, spell books, faded" tile 432 "object, spell books, dark brown" tile 433 "object, spell books, tan" tile 434 "object, spell books, gold" tile 435 "object, spell books, ochre" tile 436 "object, spell books, silver" tile 437 "object, spell books, pink" tile 438 "object, spell books, canvas" tile 439 "object, spell books, hardcover" tile 440 "object, spell books, dark green" tile 441 "object, spell books, parchment" tile 442 "object, spell books, shining" tile 443 "object, spell books, vellum" tile 444 "object, spell books, ragged" tile 445 "object, spell books, dog eared" tile 446 "object, spell books, mottled" tile 447 "object, spell books, stained" tile 448 "object, spell books, rainbow" tile 449 "object, spell books, tattered" tile 450 "object, spell books, colorful" tile 451 "object, spell books, tartan" tile 452 "object, spell books, stylish" tile 453 "object, spell books, psychedelic" tile 454 "object, spell books, spiral-bound" tile 455 "object, spell books, left-handed" tile 456 "object, spell books, stapled" tile 457 "object, spell books, plain" tile 458 "object, spell books, papyrus" tile 459 "object, wands, glass" tile 460 "object, wands, oak" tile 461 "object, wands, crystal" tile 462 "object, wands, bamboo" tile 463 "object, wands, aluminum" tile 464 "object, wands, marble" tile 465 "object, wands, zinc" tile 466 "object, wands, uranium" tile 467 "object, wands, balsa" tile 468 "object, wands, tin" tile 469 "object, wands, brass" tile 470 "object, wands, ebony" tile 471 "object, wands, copper" tile 472 "object, wands, ceramic" tile 473 "object, wands, platinum" tile 474 "object, wands, maple" tile 475 "object, wands, rusty" tile 476 "object, wands, silver" tile 477 "object, wands, iridium" tile 478 "object, wands, black" tile 479 "object, wands, bronze" tile 480 "object, wands, pine" tile 481 "object, wands, iron" tile 482 "object, wands, steel" tile 483 "object, wands, hexagonal" tile 484 "object, wands, short" tile 485 "object, wands, runed" tile 486 "object, wands, long" tile 487 "object, wands, curved" tile 488 "object, wands, octagonal" tile 489 "object, wands, forked" tile 490 "object, wands, spiked" tile 491 "object, wands, jeweled" tile 492 "object, coins, gold piece" tile 493 "object, rocks, white" tile 494 "object, rocks, white" tile 495 "object, rocks, red" tile 496 "object, rocks, orange" tile 497 "object, rocks, blue" tile 498 "object, rocks, black" tile 499 "object, rocks, green" tile 500 "object, rocks, green" tile 501 "object, rocks, yellow" tile 502 "object, rocks, green" tile 503 "object, rocks, yellowish brown" tile 504 "object, rocks, yellowish brown" tile 505 "object, rocks, black" tile 506 "object, rocks, white" tile 507 "object, rocks, yellow" tile 508 "object, rocks, red" tile 509 "object, rocks, violet" tile 510 "object, rocks, red" tile 511 "object, rocks, violet" tile 512 "object, rocks, black" tile 513 "object, rocks, orange" tile 514 "object, rocks, green" tile 515 "object, rocks, white" tile 516 "object, rocks, blue" tile 517 "object, rocks, red" tile 518 "object, rocks, yellowish brown" tile 519 "object, rocks, orange" tile 520 "object, rocks, yellow" tile 521 "object, rocks, black" tile 522 "object, rocks, green" tile 523 "object, rocks, violet" tile 524 "object, rocks, gray" tile 525 "object, rocks, gray" tile 526 "object, rocks, gray" tile 527 "object, rocks, gray" tile 528 "object, rocks, gray" tile 529 "object, rocks, gray" tile 530 "object, rocks, rock" tile 531 "object, large stones, boulder" tile 532 "object, large stones, statue" tile 533 "object, iron balls, heavy iron ball" tile 534 "object, chains, iron chain" tile 535 "object, venoms, splash of venom" tile 536 "object, venoms, splash of venom" �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/share/tile2bmp.c��������������������������������������������������������������0000664�0000764�0000764�00000021174�10545462317�015442� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* 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 640 /* 2 per byte, 4 bits per pixel */ #define MAX_Y 960 #else #define MAX_X (40 * 128) #define MAX_Y (40 * 128) /* Arbitrarily large */ #endif #define MAX_X_TILES 40 #define MAX_Y_TILES 120 /* GCC fix by Paolo Bonzini 1999/03/28 */ #ifdef __GNUC__ #define PACK __attribute__((packed)) #else #define PACK #endif static short leshort(short x) { #ifdef __BIG_ENDIAN__ return ((x&0xff)<<8)|((x>>8)&0xff); #else return x; #endif } static long lelong(long x) { #ifdef __BIG_ENDIAN__ return ((x&0xff)<<24)|((x&0xff00)<<8)|((x>>8)&0xff00)|((x>>24)&0xff); #else return x; #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; } PACK bmp_head; #define MAX_RGBQUAD_COUNT 256 /* WAC split the header from the colormap and pixel data * to accomodate variable sized BMP files */ RGBQUAD bmaColors[MAX_RGBQUAD_COUNT]; uchar packtile[MAX_Y][MAX_X]; #pragma pack() #define BMPFILESIZE ((sizeof(struct tagBMP)) + \ (sizeof(RGBQUAD) * rgbquad_count) + \ (sizeof(uchar) * maxbmp_x * (yoffset + tile_y))) FILE *tibfile2; /*pixel tilepixels[TILE_Y][TILE_X];*/ pixel tilepixels[MAX_TILE_Y][MAX_TILE_X]; static void FDECL(build_bmfh,(BITMAPFILEHEADER *)); static void FDECL(build_bmih,(BITMAPINFOHEADER *)); static void FDECL(build_bmptile,(pixel (*)[MAX_TILE_X])); int tilecount; int max_tiles_in_row = 40; int tiles_in_row; int filenum; int initflag; int yoffset,xoffset; char bmpname[128]; int maxbmp_x = -1, maxbmp_y = -1; int rgbquad_count = -1; FILE *fp; int main(argc, argv) int argc; char *argv[]; { int i, j; if (argc < 3) { Fprintf(stderr, "usage: %s outfile.bmp txt_file1 [txt_file2 ...]\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 = 2; fp = fopen(bmpname,"wb"); if (!fp) { printf("Error creating tile file %s, aborting.\n",bmpname); exit(1); } while ((filenum) < argc) { if (!fopen_text_file(argv[(filenum)],RDTMODE)) { Fprintf(stderr, "usage: tile2bmp (from the util directory)\n"); exit(EXIT_FAILURE); } if (colorsinmap > 256) { Fprintf(stderr, "too many colors (%d)\n", colorsinmap); exit(EXIT_FAILURE); } if (!initflag) { maxbmp_x = tile_x * 40; /* CONSTANT */ maxbmp_y = MAX_Y; if (maxbmp_x > MAX_X || maxbmp_y > MAX_Y) { Fprintf(stderr, "Calculated dimensions (%ix%i) larger than max (%ix%i). Increase MAX_X, MAX_Y\n", maxbmp_x, maxbmp_y, MAX_X, MAX_Y); exit(EXIT_FAILURE); } for (i = 0; i < maxbmp_y; ++i) for (j = 0; j < maxbmp_x; ++j) packtile[i][j] = (uchar)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 >= maxbmp_x) { yoffset += tile_y; xoffset = 0; if ((yoffset+tile_y) > maxbmp_y) { Fprintf(stderr, "Too many tiles (increase MAX_X_TILES or MAX_Y_TILES)\n"); exit(EXIT_FAILURE); } } } (void) fclose_text_file(); ++filenum; } if (tilecount<1) { Fprintf(stderr,"No tiles created! (check line end character sequence for your OS).\n"); fclose(fp); unlink(bmpname); exit(EXIT_FAILURE); } /* fill the rest with the checkerboard */ for (j=0; j < tile_y; j++) { for (i = xoffset; i < maxbmp_x; i+=2) { int y = (maxbmp_y - 1) - (j + yoffset); #if BITCOUNT==4 packtile[y][i] = (uchar)((1+y)&1) | (uchar)(((0+y)&1)<<4); #else packtile[y][i] = (uchar)((0+y)&1); packtile[y][i+1] = (uchar)((1+y)&1); #endif } } if (colorsinmap <= 16) rgbquad_count = 16; else if (colorsinmap <= 256) rgbquad_count = 256; for (i = 0; i < colorsinmap; i++) { bmaColors[i].rgbRed = MainColorMap[CM_RED][i]; bmaColors[i].rgbGreen = MainColorMap[CM_GREEN][i]; bmaColors[i].rgbBlue = MainColorMap[CM_BLUE][i]; bmaColors[i].rgbReserved = 0; } build_bmfh(&bmp_head.bmfh); build_bmih(&bmp_head.bmih); fwrite(&bmp_head, sizeof(bmp_head), 1, fp); for (i = 0; i < rgbquad_count; i++) fwrite(&bmaColors[i], sizeof(RGBQUAD), 1, fp); /* packtile[][] is filled bottom up, but is written top-down * starting at the topmost line used */ for (i = (maxbmp_y - (tile_y + yoffset)); i < maxbmp_y; i++) for (j = 0; j < maxbmp_x; j++) fwrite(&packtile[i][j], sizeof(uchar), 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 = leshort(0x4D42); pbmfh->bfSize = lelong(BMPFILESIZE); pbmfh->bfReserved1 = (UINT)0; pbmfh->bfReserved2 = (UINT)0; pbmfh->bfOffBits = lelong(sizeof(bmp_head.bmfh) + sizeof(bmp_head.bmih) + (rgbquad_count * sizeof(RGBQUAD))); } static void build_bmih(pbmih) BITMAPINFOHEADER *pbmih; { WORD cClrBits; int w,h; pbmih->biSize = lelong(sizeof(bmp_head.bmih)); #if BITCOUNT==4 pbmih->biWidth = lelong(w = maxbmp_x * 2); #else pbmih->biWidth = lelong(w = maxbmp_x); #endif pbmih->biHeight = lelong(h = yoffset + tile_y); pbmih->biPlanes = leshort(1); #if BITCOUNT==4 pbmih->biBitCount = leshort(4); cClrBits = 4; #else pbmih->biBitCount = leshort(8); cClrBits = 8; #endif 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 = lelong(BI_RGB); pbmih->biXPelsPerMeter = lelong(0); pbmih->biYPelsPerMeter = lelong(0); if (tile_x == 32) { if (cClrBits < 24) pbmih->biClrUsed = lelong(1<<cClrBits); } else { pbmih->biClrUsed = lelong(rgbquad_count); } if (tile_x == 16) { pbmih->biSizeImage = lelong(0); } else { pbmih->biSizeImage = lelong(((w * cClrBits +31) & ~31) /8 * h); } pbmih->biClrImportant = (DWORD)0; } static void build_bmptile(pixels) pixel (*pixels)[MAX_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 < colorsinmap; cur_color++) { if (MainColorMap[CM_RED][cur_color] == pixels[cur_y][cur_x].r && MainColorMap[CM_GREEN][cur_color]== pixels[cur_y][cur_x].g && MainColorMap[CM_BLUE][cur_color] == pixels[cur_y][cur_x].b) break; } if (cur_color >= colorsinmap) Fprintf(stderr, "color not in colormap!\n"); y = (maxbmp_y - 1) - (cur_y + yoffset); #if BITCOUNT==4 x = (cur_x / 2) + xoffset; packtile[y][x] = cur_x%2 ? (uchar)(packtile[y][x] | cur_color) : (uchar)(cur_color<<4); #else x = cur_x + xoffset; packtile[y][x] = (uchar)cur_color; #endif } } } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/share/txtbg.c�����������������������������������������������������������������0000664�0000764�0000764�00000011453�10545462317�015053� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) J. Ali Harlow 2000 */ /* NetHack may be freely redistributed. See license for details. */ /* * ALI * * Overlay transparent tiles on various backgrounds. * * This is a bit of a kludge. It would be much better if all window * ports would use the back_to_glyph() function. As it is, we * compromise. Monsters and objects are left transparent. This means * that they display correctly overlaid on the background in the GTK * port, but appear with a solid surround in the Qt and X11 ports. * Traps and furniture have backgrounds set. This means that they * look almost acceptable in the Qt, X11 and Gnome ports, but that * dark rooms etc. cause odd effects in the GTK port (the floor under * traps and furniture remains lit). * * I don't attempt to justify these compromises; they are based on what * the old tile system used to do. The intention is to upgrade the Qt, X11 * and Gnome ports to handle transparancy and make this program obsolete. * Presumably the Allegro port would also need attention to judge from * Kelly's comment on http://www.pinn.net/~jry/allegrohack/tileedit.htm: * "Making areas of wall/floor/trap/furniture tiles transparent * will result in HOM effects." * I am not able to test this for myself. * Note that the GTK port will also need quite a bit of work before all * its transparency problems are sorted. * * Warning: textbg uses the numbers in the files and not the position. */ #include "hack.h" #include "tile.h" #define MON_GLYPH 1 #define OBJ_GLYPH 2 #define OTH_GLYPH 3 #define eos(str) ((str) + strlen(str)) #define pixel_eq(pixa, pixb) ((pixa).r == (pixb).r && (pixa).g == (pixb).g \ && (pixa).b == (pixb).b) #define pixel_set(pixa, pixb) if (1) \ {(pixa).r = (pixb).r; (pixa).g = (pixb).g; (pixa).b = (pixb).b; } else struct backgrounds { int sequence; int first; int last; /* or -1 for end of file */ int bg_sequence; /* Currently must be the same as sequence */ int bg; pixel pixels[MAX_TILE_Y][MAX_TILE_X]; } backgrounds[] = { /* Furniture normally found in rooms */ { OTH_GLYPH, S_ndoor, S_pool, OTH_GLYPH, S_room }, /* Furniture normally outside */ { OTH_GLYPH, S_ice, S_water, OTH_GLYPH, S_corr }, /* Traps are normally (always?) found in rooms */ { OTH_GLYPH, S_arrow_trap, S_polymorph_trap, OTH_GLYPH, S_room }, /* Substitute walls */ { OTH_GLYPH, MAX_GLYPH - GLYPH_CMAP_OFF + 1, -1, OTH_GLYPH, S_corr }, }; void do_background(tile, bg) pixel tile[MAX_TILE_Y][MAX_TILE_X]; pixel bg[MAX_TILE_Y][MAX_TILE_X]; { int i, j; pixel def_background = DEFAULT_BACKGROUND; for(j = 0; j < tile_y; j++) for(i = 0; i < tile_x; i++) if (pixel_eq(tile[j][i], def_background)) pixel_set(tile[j][i], bg[j][i]); } int main(argc, argv) int argc; char **argv; { int i, seq=0; char ttype[BUFSZ]; int number; char name[BUFSZ]; pixel pixels[MAX_TILE_Y][MAX_TILE_X]; while (argc > 1 && argv[1][0] == '-') { if (argv[1][1] == 's') { seq = atoi(argv[1] + 2); if (seq < MON_GLYPH || seq > OTH_GLYPH) { Fprintf(stderr, "txtbg: Illegal sequence number %d\n", seq); exit(EXIT_FAILURE); } } } if (argc != 3) { Fprintf(stderr, "usage: txtbg [-s<seq>] infile outfile\n"); exit(EXIT_FAILURE); } if (!seq) { char *s; for(s = eos(argv[1]); s > argv[1] && *s != '/' && *s != '\\'; s--) ; if (s > argv[1]) s++; if (!strncmp(s, "mon", 3)) seq = MON_GLYPH; else if (!strncmp(s, "obj", 3)) seq = OBJ_GLYPH; else if (!strncmp(s, "oth", 3)) seq = OTH_GLYPH; } if (!seq) { Fprintf(stderr, "txtbg: Unable to determine sequence number (use -s)\n"); exit(EXIT_FAILURE); } for(i = 0; i < SIZE(backgrounds); i++) if (backgrounds[i].bg_sequence == seq) break; if (i < SIZE(backgrounds)) { /* At least one background needed from this file - read them in */ if (!fopen_text_file(argv[1], RDTMODE)) exit(EXIT_FAILURE); while (read_text_tile_info(pixels, ttype, &number, name)) { for(i = 0; i < SIZE(backgrounds); i++) if (seq == backgrounds[i].bg_sequence && number == backgrounds[i].bg) memcpy(backgrounds[i].pixels, pixels, sizeof(pixels)); } fclose_text_file(); } if (!fopen_text_file(argv[1], RDTMODE)) exit(EXIT_FAILURE); if (!fopen_text_file(argv[2], WRTMODE)) exit(EXIT_FAILURE); while (read_text_tile_info(pixels, ttype, &number, name)) { for(i = 0; i < SIZE(backgrounds); i++) if (seq == backgrounds[i].sequence && (backgrounds[i].first < 0 || number >= backgrounds[i].first) && (backgrounds[i].last < 0 || number <= backgrounds[i].last)) do_background(pixels, backgrounds[i].pixels); write_text_tile_info(pixels, ttype, number, name); } fclose_text_file(); exit(EXIT_SUCCESS); /*NOTREACHED*/ return 0; } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/share/obj32mi.txt�������������������������������������������������������������0000664�0000764�0000764�00003217515�10545462317�015577� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������__ = (71, 108, 108) _A = (0, 0, 0) _B = (0, 0, 16) _C = (0, 0, 32) _D = (0, 0, 48) _E = (0, 0, 64) _F = (0, 0, 96) _G = (0, 0, 128) _H = (0, 0, 160) _I = (0, 0, 192) _J = (0, 0, 224) _K = (0, 0, 255) _L = (0, 16, 0) _M = (0, 16, 16) _N = (0, 24, 0) _O = (0, 24, 24) _P = (0, 24, 48) _Q = (0, 32, 0) _R = (0, 32, 32) _S = (0, 32, 64) _T = (0, 48, 0) _U = (0, 48, 24) _V = (0, 48, 48) _W = (0, 48, 96) _X = (0, 64, 0) _Y = (0, 64, 32) _Z = (0, 64, 64) _a = (0, 64, 128) _b = (0, 80, 160) _c = (0, 96, 0) _d = (0, 96, 48) _e = (0, 96, 96) _f = (0, 96, 192) _g = (0, 112, 224) _h = (0, 128, 0) _i = (0, 128, 64) _j = (0, 128, 128) _k = (0, 128, 255) _l = (0, 144, 0) _m = (0, 160, 0) _n = (0, 160, 80) _o = (0, 160, 160) _p = (0, 182, 255) _q = (0, 192, 0) _r = (0, 192, 96) _s = (0, 192, 192) _t = (0, 224, 0) _u = (0, 224, 112) _v = (0, 224, 224) _w = (0, 255, 0) _x = (0, 255, 128) _y = (0, 255, 255) _z = (16, 0, 0) _0 = (16, 0, 16) _1 = (16, 16, 0) _2 = (16, 16, 16) _3 = (16, 48, 48) _4 = (24, 0, 0) _5 = (24, 24, 0) _6 = (24, 24, 48) _7 = (24, 48, 0) _8 = (24, 48, 24) _9 = (24, 48, 48) _$ = (32, 0, 0) A_ = (32, 0, 32) AA = (32, 32, 0) AB = (32, 32, 32) AC = (32, 64, 0) AD = (32, 64, 32) AE = (32, 64, 64) AF = (32, 242, 186) AG = (48, 0, 0) AH = (48, 0, 48) AI = (48, 12, 0) AJ = (48, 24, 0) AK = (48, 24, 24) AL = (48, 36, 0) AM = (48, 48, 0) AN = (48, 48, 24) AO = (48, 48, 48) AP = (48, 48, 96) AQ = (48, 96, 0) AR = (48, 96, 48) AS = (48, 96, 96) AT = (64, 0, 0) AU = (64, 0, 32) AV = (64, 0, 64) AW = (64, 0, 128) AX = (64, 16, 0) AY = (64, 32, 0) AZ = (64, 32, 32) Aa = (64, 32, 64) Ab = (64, 48, 0) Ac = (64, 64, 0) Ad = (64, 64, 32) Ae = (64, 64, 64) Af = (64, 64, 128) Ag = (64, 128, 0) Ah = (64, 128, 64) Ai = (64, 128, 128) Aj = (72, 108, 108) Ak = (80, 0, 160) Al = (80, 80, 80) Am = (80, 80, 160) An = (80, 160, 0) Ao = (80, 160, 80) Ap = (80, 160, 160) Aq = (96, 0, 0) Ar = (96, 0, 48) As = (96, 0, 96) At = (96, 0, 192) Au = (96, 16, 0) Av = (96, 24, 0) Aw = (96, 48, 0) Ax = (96, 48, 48) Ay = (96, 48, 96) Az = (96, 72, 0) A0 = (96, 96, 0) A1 = (96, 96, 48) A2 = (96, 96, 96) A3 = (96, 96, 128) A4 = (96, 96, 192) A5 = (96, 128, 96) A6 = (96, 128, 128) A7 = (96, 192, 0) A8 = (96, 192, 96) A9 = (96, 192, 192) A$ = (96, 144, 178) B_ = (104, 84, 31) BA = (108, 144, 182) BB = (108, 255, 0) BC = (112, 0, 224) BD = (112, 112, 112) BE = (112, 112, 224) BF = (112, 160, 160) BG = (112, 224, 0) BH = (112, 224, 112) BI = (112, 224, 224) BJ = (117, 105, 88) BK = (120, 120, 160) BL = (120, 160, 120) BM = (120, 160, 160) BN = (128, 0, 0) BO = (128, 0, 64) BP = (128, 0, 128) BQ = (128, 0, 255) BR = (128, 32, 0) BS = (128, 64, 0) BT = (128, 64, 64) BU = (128, 64, 128) BV = (128, 90, 72) BW = (128, 96, 0) BX = (128, 96, 96) BY = (128, 96, 128) BZ = (128, 112, 32) Ba = (128, 128, 0) Bb = (128, 128, 64) Bc = (128, 128, 96) Bd = (128, 128, 128) Be = (128, 128, 255) Bf = (128, 255, 0) Bg = (128, 255, 128) Bh = (128, 255, 255) Bi = (144, 72, 0) Bj = (144, 135, 110) Bk = (144, 144, 144) Bl = (144, 144, 192) Bm = (144, 192, 144) Bn = (144, 192, 192) Bo = (160, 0, 0) Bp = (160, 0, 80) Bq = (160, 0, 160) Br = (160, 40, 0) Bs = (160, 80, 0) Bt = (160, 80, 80) Bu = (160, 80, 160) Bv = (160, 120, 0) Bw = (160, 120, 120) Bx = (160, 120, 160) By = (160, 160, 0) Bz = (160, 160, 80) B0 = (160, 160, 120) B1 = (160, 160, 160) B2 = (160, 160, 224) B3 = (165, 118, 96) B4 = (168, 168, 224) B5 = (168, 224, 168) B6 = (168, 224, 224) B7 = (170, 136, 52) B8 = (170, 154, 128) B9 = (176, 176, 176) B$ = (178, 64, 0) C_ = (178, 224, 16) CA = (182, 72, 0) CB = (192, 0, 0) CC = (192, 0, 96) CD = (192, 0, 192) CE = (192, 48, 0) CF = (192, 96, 0) CG = (192, 96, 96) CH = (192, 96, 192) CI = (192, 144, 0) CJ = (192, 144, 144) CK = (192, 144, 192) CL = (192, 160, 64) CM = (192, 192, 0) CN = (192, 192, 96) CO = (192, 192, 144) CP = (192, 192, 192) CQ = (192, 192, 255) CR = (192, 255, 192) CS = (192, 255, 255) CT = (202, 144, 114) CU = (208, 168, 80) CV = (208, 208, 208) CW = (210, 210, 178) CX = (218, 218, 182) CY = (224, 0, 0) CZ = (224, 0, 112) Ca = (224, 0, 224) Cb = (224, 56, 0) Cc = (224, 112, 0) Cd = (224, 112, 112) Ce = (224, 112, 224) Cf = (224, 168, 0) Cg = (224, 168, 168) Ch = (224, 168, 224) Ci = (224, 192, 160) Cj = (224, 224, 0) Ck = (224, 224, 112) Cl = (224, 224, 168) Cm = (224, 224, 224) Cn = (229, 162, 130) Co = (240, 240, 240) Cp = (242, 0, 0) Cq = (242, 96, 0) Cr = (242, 196, 77) Cs = (248, 224, 96) Ct = (252, 252, 153) Cu = (255, 0, 0) Cv = (255, 0, 128) Cw = (255, 0, 255) Cx = (255, 64, 0) Cy = (255, 108, 0) Cz = (255, 128, 0) C0 = (255, 128, 128) C1 = (255, 128, 255) C2 = (255, 182, 144) C3 = (255, 192, 0) C4 = (255, 192, 192) C5 = (255, 192, 255) C6 = (255, 211, 176) C7 = (255, 255, 0) C8 = (255, 255, 128) C9 = (255, 255, 192) C$ = (255, 255, 255) # tile 1 (arrow) { ________________________________________________________________ ________________________________________________________________ ____________________________________________________CPBk_A______ ________________________________________________CPCPBkBk_A______ ______________________________________________CPBkBkBk_A________ ______________________________________________AwAbBkBk_A________ ____________________________________________AwAYAABk_A__________ __________________________________________AwAYAA_A_A____________ ________________________________________AwAYAA_A________________ ______________________________________AwAYAA_A__________________ ____________________________________AwAYAA_A____________________ __________________________________AwAYAA_A______________________ ________________________________AwAYAA_A________________________ ______________________________AwAYAA_A__________________________ ____________________________AwAYAA_A____________________________ __________________________AwAYAA_A______________________________ ________________________AwAYAA_A________________________________ ______________________AwAYAA_A__________________________________ ____________________AwAYAA_A____________________________________ ______________AYAYAwAYAA_A______________________________________ ____________AYAYAwAYAA_A________________________________________ __________AYAYAwAYAAAY_A________________________________________ ________AYAYAwAYAAAJAY_A________________________________________ _________A_AAAAAAYAY_A_A________________________________________ _____________AAYAY_A_A__________________________________________ ______________AY_A_A____________________________________________ _______________A_A______________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 2 (runed arrow / elven arrow) { ________________________________________________________________ ________________________________________________________CV_A____ ____________________________________________________CVBk_A______ ________________________________________________CVCVBkBk_A______ ______________________________________________CVCPBkBk_M________ ______________________________________________AlAOBkBk_A________ ____________________________________________AlBDABBk_A__________ __________________________________________AlAOAB_A_A____________ ________________________________________AlBDAB_A________________ ______________________________________AlAOAB_A__________________ ____________________________________AlBDAB_A____________________ __________________________________AlBDAB_A______________________ ________________________________AlAOAB_A________________________ ______________________________AlBDAB_A__________________________ ____________________________AlAOAB_A____________________________ __________________________AlBDAB_A______________________________ ________________________AlAOAB_A________________________________ ______________________AlAOAB_A__________________________________ ____________________AlAOAB_A____________________________________ _______________h_hAlAOAB_A______________________________________ _____________h_hAlAOAB_A________________________________________ ___________h_hAlAOAB_h_A________________________________________ _________h_hAlAOAB_h_h_A________________________________________ _________A_AAOAB_h_h_A_A________________________________________ _____________A_h_h_A_A__________________________________________ _______________h_A_A____________________________________________ _______________A_A______________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 3 (crude arrow / orcish arrow) { ________________________________________________________________ ________________________________________________________CV_A____ ____________________________________________________CVCP_A______ ________________________________________________CVCVBkBk_A______ ______________________________________________CVBkCPBk_A________ ______________________________________________AlAOBkBk_A________ ____________________________________________AlAOABBk_A__________ __________________________________________AlAOAB_A_A____________ ________________________________________AlAOAB_A________________ ______________________________________AlAOAB_A__________________ ____________________________________AlAOAB_A____________________ __________________________________AlAOAB_A______________________ ________________________________AlAOAB_A________________________ ______________________________AlAOAB_A__________________________ ____________________________AlAOAB_A____________________________ __________________________AlAOAB_A______________________________ ________________________AlAOAB_A________________________________ ______________________AlAOAB_A__________________________________ ____________________AlAOAB_A____________________________________ ______________CBCBAlAOAB_A______________________________________ ____________CBCBAlAOAB_A________________________________________ __________CBCBAlAOABCB_A________________________________________ ________CBCBAlAOABCBCB_A________________________________________ _________A_AAOABCBCB_A_A________________________________________ _____________ACBCB_A_A__________________________________________ ______________CB_A_A____________________________________________ _______________A_A______________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 4 (silver arrow) { ________________________________________________________________ ________________________________________________________________ ____________________________________________________CmCV_A______ ________________________________________________CmCmCVCP_A______ ______________________________________________CmCmCVCP_A________ ______________________________________________CPBdCPCP_A________ ____________________________________________CPBdAeCP_A__________ __________________________________________CPBdAe_A_A____________ ________________________________________CPBdAe_A________________ ______________________________________CPBdAe_A__________________ ____________________________________CPBdAe_A____________________ __________________________________CPBdAe_A______________________ ________________________________CPBdAe_A________________________ ______________________________CPBdAe_A__________________________ ____________________________CPBdAe_A____________________________ __________________________CPBdAe_A______________________________ ________________________CPBdAe_A________________________________ ______________________CPBdAe_A__________________________________ ____________________CPBdAe_A____________________________________ ______________CoCoCPBdAe_A______________________________________ ____________CoCoCPBdBJ_A________________________________________ __________CoCoCPBdAjCo_A________________________________________ ________CoCoCPBdBJCoCo_A________________________________________ _________A_AAeAlCoCo_A_A________________________________________ _____________ACoCo_A_A__________________________________________ ______________Co_A_A____________________________________________ _______________A_A______________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 5 (bamboo arrow / ya) { ________________________________________________________________ ________________________________________________________Bk_A____ ____________________________________________________CPBk_M______ ________________________________________________CPCPBkBk_A______ ______________________________________________CPAwAzBk_A________ ______________________________________________BWAzAzBk_A________ ____________________________________________BWAzAbBk_A__________ __________________________________________BWAzAb_A_A____________ ________________________________________BWAzAb_A________________ ______________________________________BWAzAb_A__________________ ____________________________________BWAzAb_A____________________ __________________________________BWAzAb_A______________________ ________________________________BWAzAb_A________________________ ______________________________BWAzAb_A__________________________ ____________________________BWAzAb_A____________________________ __________________________BWAzAb_A______________________________ ________________________BWAzAb_A________________________________ ______________________BWAzAb_A__________________________________ ________________CVCVBWAzAb_A____________________________________ _______________M_MBWAzAb_A______________________________________ ____________CVCVBWAzAbCV_A______________________________________ __________AB_zBWAzAb_MCV_A______________________________________ ________CVCVBWAzAbCVAA_A_A______________________________________ _________A_AAbAb_MCV_A_A________________________________________ ___________A_ACVAB_A_A__________________________________________ _____________ACV_A_A____________________________________________ _____________A_A_A______________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 6 (crossbow bolt) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________CPCP_A__________________ ______________________________________CPBkBk_A__________________ ____________________________________AlAeBk_A____________________ __________________________________AlAeAO_A______________________ ________________________________AlAeAO_A________________________ ______________________________AlAeAO_A__________________________ ____________________________AlAeAO_A____________________________ __________________________AlAeAO_A______________________________ ________________________AlAeAO_A________________________________ ______________________AlAeAO_A__________________________________ ____________________AlAeAO_A____________________________________ __________________AlAeAO_A______________________________________ ________________AlAeAO_A________________________________________ ______________AlAeAO_A__________________________________________ ____________AlAeAO_A____________________________________________ ___________AAOAO_A______________________________________________ ___________A_A_A________________________________________________ _____________A__________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 7 (dart) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________ClClClClCl______ __________________________C$CzCzC$C$________ClClClCl____________ ______________________CzCnCiCzCzCnCiCz____ClClCl_A_A_A_A_A______ ______C$C$C$C$C$C$C$BsBsCuCuBsBsCuCuCzCzClCl_A_A_A_A____________ ____CPCJBnCPCPBkCPCPBsBsCuCuBsBsCuCuCFCFCOCO_A_A________________ _______A_A_A_A_A_A_A_ABSCBCBBSBSCBCBCF_A_ACOCOCO________________ _____A_A_A_A_A_A_A_A_A_A_ACBBSBSCBCB_A_A_A_ACOCOCOCO____________ _____________________A_A_A_A_A_A_A_A_A_____A_A_ACOCOCOCOCO______ _______________________A_A_A_A_A_A_A_________A_A_A_A____________ _________________________________________________A_A_A_A_A______ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 8 (throwing star / shuriken) { ________________________________________________________________ ________________________________________________________________ ________________________________BJ______________________________ ________________________________Aj_A____________________________ ________________________________BJ_A____________________________ ______________________________BDAlAe_A__________________________ ______________________________AlAeAe_A__________________________ ______________________________BDAeAe_A__________________________ ____________________________AlBDAeABAB_A________________________ ____________________________BJAeAeABAB_A________________________ ____________________________AjAeAeABAB_A________________________ ______________________________AeAeAB_A_A________________________ ________________________________Ae_A_A__________________________ __________________BDAlBJ______BJAeAe_A_A__BJAjBJ________________ ____________BJAjAlBJAeAeAe__AlAe_AAeAe_AAeAeAeAlBDAlBD__________ ______BDAlBDAlAeAeAeAeAeAeAeAe_A_A_AAeABAeAeAeAeAeAeAeAeAeAe____ _______A_A_AAeAeAeABABABAB_AAeAe_AAeAB_AABABABABABABAB_A_A_A____ ___________A_A_A_AABABAB_A_A_AAeAeAB_A_A_AABABAB_A_A_A_A________ _________________A_A_A_A_A___A_AAB_A_A_A_A_A_A_A_A______________ ______________________________AeAeAe_A_A________________________ ____________________________BJAeAeABAB_A________________________ ____________________________AjAeAeABAB_A________________________ ____________________________BJAlAeABAB_A________________________ ______________________________BDAeAB_A_A________________________ ______________________________AlAeAB_A__________________________ ______________________________BDAeAB_A__________________________ ________________________________Ae_A_A__________________________ ________________________________Ae_A____________________________ ________________________________Ae_A____________________________ _________________________________A_A____________________________ _________________________________A______________________________ ________________________________________________________________ } # tile 10 (spear) { __________________________________________________________C$_A__ ______________________________________________________C$Co_A_A__ __________________________________________________C$CoCVCP_A____ ______________________________________________C$C$CoCVCP_A_A____ ______________________________________________CoCoCVCPCP_A______ ______________________________________________CoCVCPCP_A_A______ ____________________________________________CUCiCPCPBk_A________ __________________________________________BsBSCU_A_A_M__________ ________________________________________BsBSAw_A_A______________ ______________________________________BsBSAw_A_A________________ ____________________________________BsBSAw_A_A__________________ __________________________________BsBSAw_A_A____________________ ________________________________BsBSAw_A_A______________________ ______________________________BsBSAw_A_A________________________ ____________________________BsBSAw_A_A__________________________ __________________________BsBSAw_A_A____________________________ ________________________BsBSAw_A_A______________________________ ______________________BsBSAw_A_A________________________________ ____________________BsBSAw_A_A__________________________________ __________________BsBSAw_A_A____________________________________ ________________BsBSAw_A_A______________________________________ ______________BsBSAw_A_A________________________________________ ____________BsBSAw_A_A__________________________________________ __________BsBSAw_A_A____________________________________________ ________BsBSAw_A_A______________________________________________ ______BsBSAw_A_A________________________________________________ ____BSBSAw_A_A__________________________________________________ ___AAwAw_A_A____________________________________________________ ___A_A_A_A______________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 11 (runed spear / elven spear) { __________________________________________________________CR_A__ ________________________________________________________CR_A_A__ ____________________________________________________BmCR_A_A____ __________________________________________________BmCRBD_A_A____ ______________________________________________BdBmCRBD_A_A______ ____________________________________________BdBmCRBD_A_A_A______ ____________________________________________BmCRBDBD_A_A________ __________________________________________BmCRBDBD_A_A__________ ________________________________________BmBmBD_A_A_A____________ ______________________________________CUCiBD_A_A_A______________ ____________________________________BsBSCU_A_A_A________________ __________________________________CLBSAw_A_A____________________ ________________________________BsCrBZ_A_A______________________ ______________________________BsBSBZ_A_A________________________ ____________________________CLCrAw_A_A__________________________ __________________________BsBSBZ_A_A____________________________ ________________________BsCrAw_A_A______________________________ ______________________BsBSAw_A_A________________________________ ____________________BsBSAw_A_A__________________________________ __________________BsBSAw_A_A____________________________________ ________________BsBSAw_A_A______________________________________ ______________BsBSAw_A_A________________________________________ ____________BsBSAw_A_A__________________________________________ __________BsBSAw_A_A____________________________________________ ________BsBSAw_A_A______________________________________________ ______CsBSAw_A_A________________________________________________ ____BZCLCL_A_A__________________________________________________ ___ABZBZ_A_A____________________________________________________ ___A_A_A_A______________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 12 (crude spear / orcish spear) { __________________________________________________________C$_A__ ______________________________________________________C$Co_A_A__ ____________________________________________________CoCV_A_A____ __________________________________________________CoCV_A_A_A____ ________________________________________________CoCV_A_A_A_A____ ______________________________________________CoCV_A_A_A_A______ ____________________________________________CPCV_A_ACP_A_A______ __________________________________________AeBDCPCPBDBD_A_A______ ________________________________________AeBDAlAO_A_A_A_A________ ______________________________________AeBDAlAO_A________________ ____________________________________AeBDAlAO_A__________________ __________________________________AeBDAlAO_A____________________ ________________________________AeBDAlAO_A______________________ ______________________________AeBDAlAO_A________________________ ____________________________AeBDAlAO_A__________________________ __________________________AeBDAlAO_A____________________________ ________________________AeBDAlAO_A______________________________ ______________________AeBDAlAO_A________________________________ ____________________AeBDAlAO_A__________________________________ __________________AeBDAlAO_A____________________________________ ________________AeBDAlAO_A______________________________________ ______________AeBDAlAO_A________________________________________ ____________AeBDAlAO_A__________________________________________ __________AeBDAlAO_A____________________________________________ ________AeBDAlAO_A______________________________________________ ______AeBDAlAO_A________________________________________________ ____AOBDAlAO_A__________________________________________________ ___AAOAlAO_A____________________________________________________ ___A_A_A_A______________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 16 (trident) { ________________________________________________________________ __________________________________________BkCPCV_A____BkCPCV_A__ ____________________________________________CVBD_A______CVBD_A__ __________________________________________CP_ABD_A____CP_ABD_A__ ________________________________________CP_A_A_A_A__CP_A_A_A_A__ ______________________________________CP_A_A______CP_A_A________ ______________________________________Bd_A______CP_A_A__________ _______________________________________ABk____CP_A_A__BkCPCV_A__ _________________________________________ABkCP_A_A______CVBD_A__ ________________________________________BDCPBD_A______CP_ABD_A__ ______________________________________CsCLBDBdBk____CP_A_A_A_A__ ____________________________________BdCPBZB__A_ABdCP_A_A________ __________________________________BdCPAeAO_A_A___A_A_A__________ ________________________________BDCPAlAO_A_A____________________ ______________________________BdCPAeAO_A_A______________________ ____________________________BdCPAlAO_A_A________________________ __________________________BdCPAeAO_A_A__________________________ ________________________BDCPAlAO_A_A____________________________ ______________________BdCPAeAO_A_A______________________________ ____________________BdCPAlAO_A_A________________________________ __________________BdCPAeAO_A_A__________________________________ ________________BDCPAlAO_A_A____________________________________ ______________BdCPAeAO_A_A______________________________________ ____________BdCPAlAO_A_A________________________________________ __________BdCPAeAO_A_A__________________________________________ ________BDCPAlAO_A_A____________________________________________ ______BdCPAeAO_A_A______________________________________________ ____BdCPAlAO_A_A________________________________________________ __CsCPAeAO_A_A__________________________________________________ CsCLBZAO_A_A____________________________________________________ _ABZB__A_A______________________________________________________ _A_A_A_A________________________________________________________ } # tile 17 (dagger) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________________________________Cm_A__________ ________________________________________________Cm_A_A__________ ____________________________________________CmCm_A_A____________ __________________________________________CmCPBk_A______________ ______________________________________CmCVCPBk_A_A______________ ____________________________________CmCmCPBd_A_A________________ ____________________________Cm____CmCmCPBkBk_A_A________________ ____________________________BkCmCmCmCPBdBk_A_A__________________ ______________________________BkCmBkBkBk_A_A____________________ ______________________________AwAwCmBk_A_A______________________ ____________________________AYAwAbBkCm_A________________________ __________________________AwAwAY_z_BBkCo_A______________________ ________________________AYAwAY_A_A___A_A_A______________________ ________________________AwAY_A_A________________________________ ___________________________A_A__________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 18 (runed dagger / elven dagger) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________________________________Cm_A__________ ________________________________________________Cm_A_A__________ ____________________________________________CmCm_A_A____________ __________________________________________CmCLBk_A______________ ______________________________________CmCmCLBk_A_A______________ ____________________________________CmCmCLBk_A_A________________ ____________________________Cs____CmCmCLBkBk_A_A________________ ____________________________CLCsCmCmCLBkBk_A_A__________________ ______________________________CLCsCLBkBk_A_A____________________ ______________________________BZCLCsBk_A_A______________________ ____________________________BZCLBZCLCs_A________________________ __________________________BZCLB__A_ACLCs_A______________________ ________________________BZCLBZ_A_A___A_A_A______________________ ________________________CLBZ_A_A________________________________ ___________________________A_A__________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 19 (crude dagger / orcish dagger) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________________________________________CPBk_A____________ ____________________________________________CVBkBk_A____________ ________________________________________BkCPBkBk_M_A____________ ______________________________________BkCPCPBkBk_A______________ ______________________________________CPBkBkBk_A_A______________ __________________________________BkCPBnBk_A_A_A________________ ______________________________AOBkCVCJBkBk_A_A__________________ ______________________________AeBkBkBkBk_A_A____________________ ______________________________AwAOBkBk_A_A______________________ ____________________________AwAwAYAOAO_A_A______________________ __________________________AwAwAY_A_A_A_A________________________ ________________________AwAwAY_A_A_A_A__________________________ ________________________AYAY_A_A________________________________ ___________________________A_A__________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 21 (athame) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________CVCV____________ ____________________________________________CVCVCVCP_A__________ __________________________________________CVCVCVCP_A_A__________ ________________________________________CVCVCVCPBk_A____________ ______________________________________CVCVCmBkCP_A_A____________ ____________________________CLCL_A__CVCVCLBlCP_A_A______________ __________________________CLCL_A_ACVCVCLBlCO_A_A________________ __________________________CLCL_ACVCLBbCOCP_A_A_A________________ __________________________CLCLCVCLCLBZCK_A_A_A__________________ __________________________CLCLCLCLB_CO_A_A_A_A__________________ __________________________CLCLCLB_CP_A_ACL_A____________________ ________________________CBBoCLCLCLCLCLCLCL_A____________________ ______________________CBBoBoAqCLCLCLCLCL_A_A____________________ ____________________CBBoBoBNAq_A_A_A_A_A_A______________________ __________________CBBoBoBNAq_A_A_A______________________________ __________________CBBNBNAq_A_A__________________________________ ___________________AAqAq_A_A____________________________________ ___________________A_A_A_A______________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 22 (scalpel) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________________________________CVCV_A________ ______________________________________________CVCVCP_A_A________ __________________________________________CVCVCPBk_A_A__________ ________________________________________CVCPBkCP_A_A____________ ______________________________________CVCPBnCP_A_A______________ ____________________________________CmBkCPCJ_A_A________________ ____________________________________CVCPBn_A_A__________________ __________________________________CmBkCP_A_A____________________ __________________________________CVCP_A_A______________________ ________________________________CPBk_A_A________________________ ______________________________CPBd_A_A__________________________ ____________________________CPBk_A_A____________________________ __________________________CPBd_A_A______________________________ ________________________CPBk_A_A________________________________ ______________________CPBd_A_A__________________________________ ____________________CPBk_A_A____________________________________ _____________________A_A_A______________________________________ _____________________A_A________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 23 (knife) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________________________________Bd____________ ________________________________________________BkBd_A__________ ______________________________________________BkCVBd_A__________ ____________________________________________BkCVBk_A_A__________ __________________________________________BkCVBkBd_A____________ ________________________________________BkCVBkBk_A_A____________ ______________________________________BkCPCPBk_A_A______________ ____________________________________BkCVBkBk_M_z_A______________ __________________________________BnCPCJBn_z_A_A________________ ________________________________AwBdBkBn_z_A_A__________________ ______________________________AwAwAwBd_A_A_A____________________ ____________________________AwAwAwAwAY_A_A______________________ __________________________AwAwAwAwAY_A_A________________________ ________________________AwAwAwAwAY_A_A__________________________ ______________________AwAwAwAwAY_A_A____________________________ ____________________AwBkAwAwAY_A_A______________________________ __________________AwAwAwAwAY_A_A________________________________ __________________AYAYAYAY_A_A__________________________________ ___________________A_A_A_A_A____________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 24 (stiletto) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________CP______ ______________________________________________________CP_A_A____ __________________________________________________CPCPBk_A_A____ ________________________________________________CPCPBk_A_A______ ______________________________________________CPBkBk_A_M_A______ __________________________________________CPCPCJBn_z_A_A________ ________________________________________CPCPCPBk_A_A_A__________ ______________________________________CPCPCPBk_A_A_A____________ ____________________________________CPCPCPBk_M_z_A______________ ____________________________CrCL__CLCPCVBk_z_A_A________________ ___________________________ACLCLCLCrBbCJ_M_A_A__________________ ___________________________A_ACLCrCLCIBzCL_A_A__________________ ___________________________AAwAwCLBbCLCLCLCL_A__________________ __________________________AwAwAwAvCL_A_A_A_A_A__________________ ________________________AwAwAwAYAA_A_A_A_A_A____________________ ______________________AwAwAwAYAA_A_A_A_A________________________ ____________________AwAwAwAYAA_A_A______________________________ __________________CLAwAwAYAA_A_A________________________________ ________________CLCrCLAYAA_A_A__________________________________ _______________ACrCLCLCL_A_A____________________________________ _______________A_ACLBZ_A_A______________________________________ _________________A_A_A_A________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 27 (axe) { ________________________________________________________________ ________________________________________________________________ ________________________________________CVCV_A_A________________ __________________________________CVCVCVCVCV_A_A________________ ______________________________CVCVCVCVBJAjBJ_A_A________________ ____________________________CVCVCVBDAlBDAlAeAe_A________________ __________________________CVCVBJAlAjBJAeAeAeAeAeBDAl____________ ________________________CVCVAlAjBJAeAeAeAeAeAeBDAlAB____________ ______________________CVBJAjBXAeAeAeAeAeAeAeBDAlABAB_A__________ ____________________CPCPAlBJ_A_A_A_A_A_AAeBDAlABABAeAe_A________ ____________________CP_A_B_A_A_A_A_A_A_ABDAlABABAeAeAe_A________ _____________________A_A_A____________BSBsABABAeAeAeAeAe_A______ _____________________A______________BsBsBSAw_A_A_AAeAeAe_A______ __________________________________BsAwBSAY_A_A_A_A_AAeAeAe_A____ ________________________________CFAwBSAY_A_A_______A_AAeAe_A____ ______________________________BsAwBSAY_A_A_____________A_A______ ____________________________BsAwBSAY_A_A________________________ __________________________BsAwAwAY_A_A__________________________ ________________________CFAwBSAY_A_A____________________________ ______________________CFAwBSAY_A_A______________________________ ____________________BSBSBSAY_A_A________________________________ __________________BsBsBSAA_A_A__________________________________ ________________BsAwBSAA_A_A____________________________________ ______________BsAwBSAY_A_A______________________________________ ____________BsAwBSAY_A_A________________________________________ __________BSAwBSAw_A_A__________________________________________ ________BsAwBSAw_A_A____________________________________________ ______BSAwBSAw_A_A______________________________________________ ____BSAwAwAw_A_A________________________________________________ __BSAwAwAY_A_A__________________________________________________ ___AAwAY_A_A____________________________________________________ ___A_A_A_A______________________________________________________ } # tile 28 (double-headed axe / battle-axe) { __________________________________________CVCVCV_A______________ ______________________________________CVCVCVCV_A_A______________ __________________________________CVCVCVBJAj_A_A________________ ________________________________CVCVAlBDAlBJ_A_A________________ ______________________________CVCVBJAjAeAeAe_A_A________________ ____________________________CVCVBDAlAeAeAeAe_A_A________________ ____________________________CVAlBJAeAeAeAeAeAe_A_A___________A_A __________________________CVCPBDAeAeAeAeAeAeBdAe_A_A_A_A_A_ACP_A __________________________CVAlBDAOAeAeAeAeBdAeAe_MAe_A_A_ABJBl_A ________________________CVCVBDAeAeAeAeAeBdAeAe_MAeAeAeAeAeAlCP_A ________________________CVAlBJ_A_A_AAeBdAeAe_MAeAeAeAeAeBJCPBm_A ________________________CV_B_A_A_A_ABSBsAeAAAeAeAeAeAeAlAjCK_A_A _________________________A_A______BsBsBSAwAeAeAeAeAeAeBJCPBm_B__ ________________________________BsAwBSAY_A_AAeAeAeAeBDAlCP_A_A__ ______________________________CFAwBSAY_A_A_AAeAeAeBJAlCPBl_z____ ____________________________BsAwBSAY_A_A_A_AAeAlBDAlBnCP_A_A____ __________________________BsAwBSAY_A_A___AAeBDAlCPCKCO_A_A______ ________________________BsAwAwAY_A_A_____ABDBkCPCP_A_A_A________ ______________________CFAwBSAY_A_A______CPBlCP_A_A_A____________ ____________________CFAwBSAY_A_A_________A_A_A_A________________ __________________BSBSBSAY_A_A__________________________________ ________________BsBsBSAA_A_A____________________________________ ______________BsAwBSAA_A_A______________________________________ ____________BsAwBSAY_A_A________________________________________ __________BsAwBSAY_A_A__________________________________________ ________BSAwBSAw_A_A____________________________________________ ______BsAwBSAw_A_A______________________________________________ ____BSAwBSAw_A_A________________________________________________ __BSAwAwAw_A_A__________________________________________________ BSAwAwAY_A_A____________________________________________________ _AAwAY_A_A______________________________________________________ _A_A_A_A________________________________________________________ } # tile 30 (runed short sword / elven short sword) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________________________________CV____________ ______________________________________________CoCV___A__________ ____________________________________________CoCVCP_A____________ ________________________________________CoCoCVCP_A_A____________ ______________________________________CoCoCVCP_A_A______________ __________________________________CoCoCoCVCPBn_z_A______________ ________________________________CoCoCVCVBnCJ_A_A________________ ____________________________CoCoCoCVCVCVCP_A_A__________________ __________________Cr______CoCoCoCVCVCVCJCP_A_A__________________ _________________ACr__CoCoCoCVCVCLCVCPBn_A_A____________________ _________________ACrCoCoCoCVCrCLCmBkCP_A_A______________________ _________________ACrCoCoCVCrCLCLCVCPCP_A_A______________________ _________________ACLCLCLCrCLCLCVCJBn_A_A________________________ _________________A_A_ACrCLCLCVCPBn_z_A__________________________ ___________________ACrBbCLCLBnCJCP_A_A__________________________ __________________CrCLCL_ACLCJBn_A_A____________________________ ______________CrCrBZCL_A_ACLBbCLBbCL_A__________________________ _____________ACrCLCL_A_A_A_A_z_A_z_A_A__________________________ _____________ACUBZCL_A_A_A_A_A_A_A_A____________________________ _____________A_A_z_A_A__________________________________________ _______________A_A_A____________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 33 (curved sword / scimitar) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ___________________________________________A____________________ ________________________________________Cm_A____________________ ________________________________________Cm_A_A__________________ ________________________________________CmCm_A__________________ ______________________________________BkCPCm_A__________________ ______________________________________BkCPCm_A_A________________ ______________________________________BkCPCPCm_A________________ ______________________________________BkBkCPCm_A________________ ____________________________________BkBkBkCPCm_A________________ ____________________________________BkBkBkCPCm_A________________ ____________________________________BkBkCPCPCm_A________________ __________________________________BkBkBkCPCPCm_A________________ ________________________________BkBkBkBkCPCm_A_A________________ ________________________________BkBkBkCPCPCm_A__________________ __________________Cr________BkBkBkCPCPCPCm_A_A__________________ __________________CLCr____BkBkCPCPCPCmCm_A_A____________________ ____________________CLCrBkCPCPCPCmCm_A_A_A______________________ ____________________BrBbCrCPCmCm_A_A_A__________________________ __________________BrAXAvBZCr_A_A_A______________________________ ________________BrBRAvAX_ACL_A__________________________________ ______________BrAXAvAX_A_zBbCr__________________________________ ______________BRAvAX_A_A_A_zCL_A________________________________ ____________CrCLB__A_A_____A_A_A________________________________ ____________CLCLBZ_A____________________________________________ ____________BZB_B__A____________________________________________ _______________A_A_A____________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 34 (silver saber) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________CV_A____ ______________________________________________________BdCP_A____ ____________________________________________________BdCP_A_A____ __________________________________________________BdBkCP_A______ ________________________________________________BdBkCV_A_A______ ______________________________________________BdBkCV_A_A________ ____________________________________________BdBkCV_A_A__________ __________________________________________BdBkCV_A_A____________ ________________________________________BdBkCV_A_A______________ ______________________________________BdBkCV_A_A________________ ____________________________________BdBkCV_A_A__________________ __________________________________BdBkCV_A_A____________________ ________________________________BdBkCV_A_A______________________ ______________________________BdBkCV_A_A________________________ ____________________________BdBkCV_A_A__________________________ __________________________BdBkCV_A_A____________________________ ________________________BdBkCP_A_A______________________________ __________________CP__BdBkCP_A_A________________________________ __________________BJCPBkCP_A_A__________________________________ __________________AqBDBn_z_A____________________________________ ________________AqAGAGBJCP_A____________________________________ ______________AqATAG_ABDCP_A____________________________________ ____________AqATAG_A__BDCP_A____________________________________ __________AqATAG_A____BnBJ_A____________________________________ ________AqATAG_A____CKBD_A_A____________________________________ ______CrCL_$_A__BkBmBD_A_A______________________________________ ______BbBZBkBkBk_B_z_A_A________________________________________ ___________A_A_A_A_A____________________________________________ ________________________________________________________________ } # tile 35 (broadsword) { ________________________________________________________________ __________________________________________________________CrCL_A ________________________________________________________BsBSCL_A ______________________________________________________AXBSAw_A_A ____________________________________________________BsBSAX_A_A_A __________________________________________________AXBSAw_A_A_A__ ______________________________________CLCLCLBbCLBsBSAX_A_A_A____ ________________________________CrCrCrCrCrCLCLBZCLAw_A_A_A______ ___________________________________A_A_ACoCoBdCLBZBZ_A_A________ ______________________________________CoCoBdBkCVCUBZ_A_A________ ____________________________________CoCoBdBkCoCPCLCL_A_A________ __________________________________CoCoBdCJCmCPCPCLBb_A_A________ ________________________________CoCoBdBkCoCPCP_ACLCL_A_A________ ______________________________CoCoBkBkCmCPCP_A_ACL_A_A_A________ ____________________________CoCoBdBkCoCPCP_A_A_ACL_A_A_A________ __________________________CoCoBdBkCmCPCP_A_A_A_ACL_A_A_A________ ________________________CoCoBdBkCoCPCP_A_A_A_A__________________ ______________________CoCoBkBkCmCPCP_A_A_A_A____________________ ____________________CoCoBdBkCoCPCP_A_A_A_A______________________ __________________CoCoBkBkCmCPCP_A_A_A_A________________________ ________________CoCoBdBkCoCPCP_A_A_A_A__________________________ ______________CoCoBkBkCmCPCP_A_A_A_A____________________________ ____________CoCoBdBkCoCPCP_A_A_A_A______________________________ __________CoCoBkBkCmCPCP_A_A_A_A________________________________ ________CoCoBdBkCoCPCP_A_A_A_A__________________________________ ______CoCoBkBkCmCPCP_A_A_A_A____________________________________ ____C$C$CoBkCoCPCP_A_A_A_A______________________________________ __C$C$C$CVCPCPCP_A_A_A_A________________________________________ __C$C$CVCPCPCP_A_A_A_A__________________________________________ __C$CVCPCPCP_A_A_A_A____________________________________________ __CVCPCPCP_A_A_A_A______________________________________________ ___A_A_A_A_A_A_A________________________________________________ } # tile 36 (runed broadsword / elven broadsword) { ________________________________________________________________ __________________________________________________________CrCL_A ________________________________________________________CLBbBZ_A ______________________________________________________CrCLBZ_A_A ____________________________________________________CLCLB__A_A__ ____________________________________________CrCrCLCLBbBZ_A_A____ ______________________________________CrCrCrCLCLCLCLBZ_z_A______ _______________________________________A_ACoCoBkCLBZCL_A________ ________________________________________CoCoBkCVCVCLCL_A________ ______________________________________CoCoBkABCmCPCLBb_A________ ____________________________________CoCoBkCVCmCPCPCL_z__________ __________________________________CoCoBkABCmCPCP_ACL_A__________ ________________________________CoCoBkABCmCPCP_A_ACL_A__________ ______________________________CoC$BkCPCmCPCP_A_A_A_A_A__________ ____________________________CoCoBkABCmCPCP_A_A_A________________ __________________________CoC$BkCPCmCPCP_A_A_A__________________ ________________________CoCoBkABCmCPCP_A_A_A____________________ ______________________CoCoCJ_MCmCPCP_A_A_A______________________ ____________________CoCoBkCVCmCPCP_A_A_A________________________ __________________CoC$Bk_OCmCPCP_A_A_A__________________________ ________________CoCoBkABCmCPCP_A_A_A____________________________ ______________CoCoCJ_MCmCPCP_A_A_A______________________________ ____________CoCoBkCVCmCPCP_A_A_A________________________________ __________CoC$Bk_OCmCPCP_A_A_A__________________________________ ________CoCoBkCVCmCPCP_A_A_A____________________________________ ______CoCoCJ_MCmCPCP_A_A_A______________________________________ ____C$C$CoCPCmCPCP_A_A_A________________________________________ __C$C$C$CVCPCPCP_A_A_A__________________________________________ __C$C$CVCPCPCP_A_A_A____________________________________________ __C$CVCPCPCP_A_A_A______________________________________________ __CVCPCPCP_A_A_A________________________________________________ ___A_A_A_A_A_A__________________________________________________ } # tile 37 (long sword) { ________________________________________________________________ __________________________________________________________C$Cm_A ______________________________________________________C$C$CmCV_A __________________________________________________C$C$C$CmCV_A_A ________________________________________________C$C$C$CmCVCV_A_A ______________________________________________C$C$C$CmCVCV_A_A__ ____________________________________________CoC$C$CmCVCVCV_A____ __________________________________________CoCoC$CmCVCVCV_A_A____ ________________________________________CoCoCoCmCVCVCV_A_A______ ______________________________________CoCoCoCmCVCVCV_A_A________ ____________________________________CoCoCoCmCVCVCV_A_A__________ __________________________________CoCoCoCmCVCVCV_A_A____________ ________________________________CoCoCoCmCVCVCV_A_A______________ ______________________________CoCoCoCmCVCVCV_A_A________________ ____________________________CoCoCoCmCVCVCV_A_A__________________ __________________________CoCoCoCmCVCVCV_A_A____________________ ________________________CoCoCoCmCVCVCV_A_A______________________ ____________CrCL______CoCoCoCmCVCVCV_A_A________________________ ____________CLCL_A__CoCoCoCmCVCVCV_A_A__________________________ ____________CLCL_ACoCoCoCmCVCVCV_A_A____________________________ ____________CLCLCoCoCoCmCVCVCV_A_A______________________________ ____________CLCLCLCoCmCVCVCV_A_A________________________________ ______________CLCLCoCVCVCV_A_A__________________________________ ____________BSCLCLCLCLCV_A_A_A__________________________________ __________BS_zAwBbCLCLCLCLCLCL_A________________________________ ________AYAwAwAAAY_ACLCLBZCLBb_A________________________________ ______BSAwAAAYAY_A_A_A_A_z_A_z_A________________________________ ____CrAAAwAYAA_A_A______________________________________________ __CrCrCLAAAJ_A_A________________________________________________ __CrCLCLCL_A_A__________________________________________________ ___ACLBZ_A_A____________________________________________________ _____A_A_A______________________________________________________ } # tile 38 (two-handed sword) { ______________________________________________________________Co __________________________________________________________CoCo_A ______________________________________________________CoCoCPBk_A ____________________________________________________CoCoCVBk_A_A __________________________________________________CoCoCPBkCP_A_A ________________________________________________CoCoCPCPBk_A_A__ ______________________________________________CoCoCPBkBk_A_A____ ____________________________________________CoCoCPCJBn_A_A______ __________________________________________CoCoCPBkBn_z_A________ ________________________________________CoCoCPCPBk_A_A__________ ______________________________________CoCoCPBkBk_z_A____________ ____________________________________CoCoCPCJBn_A_A______________ __________________________________CoCoCPBkBn_z_A________________ ________________________________CoCoCPCPBk_A_A__________________ ______________________________CoCoCPBkBk_z_A____________________ ____________Cr______________CoCoCPCJBn_A_A______________________ ___________ACr____________CoCoCPBkBn_z_A________________________ ___________ACrCr________CoCoCPCPBk_A_A__________________________ ___________A_ACr______CoCoCPBkBk_z_A____________________________ _____________ACrCr__CoCoCPCJBn_A_A______________________________ _____________A_ACrCPCoCPBkBn_z_A________________________________ _______________ACrCrCPCPBk_A_A__________________________________ _______________ABSCLCLBk_A_A____________________________________ ______________BSAwAYCLCLCL______________________________________ ____________BSAwAY_A_A_ACLCLCL__________________________________ __________CrAwAY_A_A_____A_ACLCLCL_A____________________________ ________BSCLCL_A_A___________A_A_A_A____________________________ ______BSAwAY_A_A________________________________________________ ____BSAwAY_A_A__________________________________________________ _ACrAwAY_A_A____________________________________________________ _ACLCL_A_A______________________________________________________ _A_A_A_A________________________________________________________ } # tile 39 (samurai sword / katana) { ________________________________________________________________ ________________________________________________________AqAT____ ______________________________________________________AqCLAG_A__ ____________________________________________________AqATAT_A_A__ __________________________________________________AqCLAG_A_A____ ___________________________________________M_M__AqATAT_A_A______ __________________________________________AAA__M_MAT_A_A________ ___________________________________________ACLA_AA_A_A__________ __________________________________________CLBZCL_B_M_A__________ ________________________________________CPBDCL_AAA_M_A__________ ______________________________________CPBdBd_A_A_A_A____________ ____________________________________CPBdBd_A_A__________________ __________________________________CVBdBd_A_A____________________ ________________________________CVBdBd_A_A______________________ ______________________________CVBdBd_A_A________________________ ____________________________CVBdBd_A_A__________________________ __________________________CVBdBd_A_A____________________________ ________________________CVBdBd_A_A______________________________ ______________________CVBdBd_A_A________________________________ ____________________CVBdBd_A_A__________________________________ __________________CVBdBd_A_A____________________________________ ________________CVBdBd_A_A______________________________________ ______________CVBdBd_A_A________________________________________ ____________CVBdBd_A_A__________________________________________ __________CVBdBd_A_A____________________________________________ __________CVBd_A_A______________________________________________ ________CVBd_A_A________________________________________________ ________CV_A_A__________________________________________________ _________A_A____________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 40 (long samurai sword / tsurugi) { __________________________________________________________AOCL__ ________________________________________________________AOAOAO_A ______________________________________________________AOCLAO_A_A ____________________________________________________AOAOAO_A_A__ __________________________________________AOAOAO__AOCLAO_A_A____ __________________________________________AOAOAOAOAOAO_A_A______ __________________________________________AOAOCLAOAO_A_A________ ___________________________________________zBZCLBbAOAO_A________ __________________________________________CQCLBZAZAOAO_A________ ________________________________________CQBdBd_z_zAOAO_A________ ______________________________________CQBdBd_A_A_A_A_A__________ ____________________________________CQBdBd_A_A__________________ __________________________________CQBdBd_A_A____________________ ________________________________CQBdBd_A_A______________________ ______________________________CQBdBd_A_A________________________ ____________________________CQBdBd_A_A__________________________ __________________________CQBdBd_A_A____________________________ ________________________CQBdBd_A_A______________________________ ______________________CQBdBd_A_A________________________________ ____________________CQBdBd_A_A__________________________________ __________________CQBdBd_A_A____________________________________ ________________CQBdBd_A_A______________________________________ ______________CQBdBd_A_A________________________________________ ____________CQBdBd_A_A__________________________________________ __________CQBdBd_A_A____________________________________________ ________CQBdBd_A_A______________________________________________ ______CQBdBd_A_A________________________________________________ ____CQBdBd_A_A__________________________________________________ ____CQBd_A_A____________________________________________________ __CQBd_A_A______________________________________________________ __CQ_A_A________________________________________________________ ___A_A__________________________________________________________ } # tile 41 (runed broadsword / runesword) { ________________________________________________Bo_A____________ ______________________________________________BoBN_A_A_ABNBNAq_A ____________________________________________BoBN_A_A_ABNAqAqAT_A ____________________________________________BoAq_A_ABNAqAqATAT_A _________________________________________ABoATAT_ABNAqAqATAT_A_A _____________________________AAqAqBoBoBoBoAqAqAqBNAqAqATAT_A_A__ _____________________________A_A_AAqAqBoBoBoBoBoCjBoATAT_A_A____ _______________________________A_A_A_AAqAqAqBNCjCjByAT_A_A__BNAq _________________________________A_A_AAeAeAqAqBNByAqATBNBNBNAq_A ____________________________________AeAeAe_MABAqBNAqATBNAqAq_A_A __________________________________AeAeAe_MAKAeAqAqAqATAq_A_A_A__ ________________________________AeAeAe_MBoAeAOAOAqAqBN_A_A______ ______________________________AeAeAe_MCBAeAOAOAOAqAqBN_A_A______ ____________________________AeAeAe_MABAeAOAOAO_A_AAqBN_A_A______ __________________________AeAeAe_MCBAeAOAOAO_A_A_AAqBN_A_A______ ________________________AeAeAe_MABAeAOAOAO_A_A_A_A_AAq_A________ ______________________AeAeAe_MCBAeAOAOAO_A_A_A_____AAq_A________ ____________________AeAeAe_MABAeAOAOAO_A_A_A_______A_A_A________ __________________AeAeAe_MAKAeAOAOAO_A_A_A___________A__________ ________________AeAeAe_MBoAeAOAOAO_A_A_A________________________ ______________AeAeAe_MAKAeAOAOAO_A_A_A__________________________ ____________AeAeAeABBoAeAOAOAO_A_A_A____________________________ __________AeAeAe_MABAeAOAOAO_A_A_A______________________________ ________AeAeAe_zABAeAOAOAO_A_A_A________________________________ ______AeAeAe_MBoAeAOAOAO_A_A_A__________________________________ ____AeAeAe_MBoAeAOAOAO_A_A_A____________________________________ __AlAeAe_MAKAeAOAOAO_A_A_A______________________________________ __AlAl_AABAeAOAOAO_A_A_A________________________________________ __AlAlAeAeAOAOAO_A_A_A__________________________________________ __AlAOAOAOAOAO_A_A_A____________________________________________ __AOAOAOAOAO_A_A_A______________________________________________ ___A_A_A_A_A_A_A________________________________________________ } # tile 42 (vulgar polearm / partisan) { ____________________________________________________________Bk_A ________________________________________________________CPBk_A_A ____________________________________________________BkCJBMCJ_M__ ________________________________________________CPBkCPBdBn_A_A__ _________________________________________________ACPBdBJBk_z____ ________________________________________________CPBdBJBl_A_A____ ______________________________________________CPBdAe_ABk_L______ ____________________________________________BsBdAe_A_A_z_A______ __________________________________________BsBSAY_A_A_A_A________ ________________________________________BsBSAY_A_A______________ ______________________________________BsBSAY_A_A________________ ____________________________________BsBSAY_A_A__________________ __________________________________BsAwAY_A_A____________________ ________________________________BsBSAY_A_A______________________ ______________________________BsBSAY_A_A________________________ ____________________________BsBSAY_A_A__________________________ __________________________BsBSAA_A_A____________________________ ________________________BsBSAY_A_A______________________________ ______________________BsBSAY_A_A________________________________ ____________________BsAwAY_A_A__________________________________ __________________BsBSAY_A_A____________________________________ ________________BsBSAY_A_A______________________________________ ______________BsBSAY_A_A________________________________________ ____________BsBSAA_A_A__________________________________________ __________BsBSAA_A_A____________________________________________ ________BsBSAY_A_A______________________________________________ ______BsBSAY_A_A________________________________________________ ____BsBSAw_A_A__________________________________________________ __AYBSAw_A_A____________________________________________________ AYAYAY_A_A______________________________________________________ _AAY_A_A________________________________________________________ ___A_A__________________________________________________________ } # tile 43 (hilted polearm / ranseur) { ____________________________________________________________Bk_A __________________________________________________________Bk_A_A ______________________________________________________CPBD_M_z__ ____________________________________________CP_A____CPBdBk_A____ __________________________________________BDCP_A__CPBDBk_z_A____ __________________________________________BDBkCPCPBdBk_A_A______ ___________________________________________ABDBDBDBk_M_z________ ___________________________________________ABDBDBDCP_A__________ __________________________________________BkBdBDBDBkCVCP_A______ ________________________________________BsBDBd_A_ABDBD_A_A______ ______________________________________BsBSAY_A_A_A_A_A_A________ ____________________________________BsBSAY_A_A__________________ __________________________________BsAwAY_A_A____________________ ________________________________BsBSAY_A_A______________________ ______________________________BsBSAY_A_A________________________ ____________________________BsBSAY_A_A__________________________ __________________________BsBSAA_A_A____________________________ ________________________BsBSAY_A_A______________________________ ______________________BsBSAY_A_A________________________________ ____________________BsAwAY_A_A__________________________________ __________________BsBsAY_A_A____________________________________ ________________BsBSAY_A_A______________________________________ ______________BsBSAY_A_A________________________________________ ____________BsBSAA_A_A__________________________________________ __________BsBSAA_A_A____________________________________________ ________BsBSAY_A_A______________________________________________ ______BsBSAY_A_A________________________________________________ ____BsBSAw_A_A__________________________________________________ __AYBSAw_A_A____________________________________________________ AYAYAY_A_A______________________________________________________ _AAY_A_A________________________________________________________ ___A_A__________________________________________________________ } # tile 44 (forked polearm / spetum) { ____________________________________________CP______________Bk_A ____________________________________________CP_A__________Bk_A_A __________________________________________CPAl_A______BkCP_A_A__ __________________________________________BnBJ_A____BkBDBk_A____ ________________________________________CPAlBJ_A_ABkBDBk_A_A____ ______________________________________CPBDBDAlBDBkBDBk_A_A______ _______________________________________A_ABdBJAjBJBl_L_z________ __________________________________________BdAlBDAlBJ_A_A________ __________________________________________BdBDAlBDAlBDAlBDCPBn_z ________________________________________BdAlAeBdBdAlBJBnCP_A_A_A ______________________________________BsBDAe_A_A_ABdCP_A_A_A____ ____________________________________BsBSAY_A_A_A_ACP_A_A________ __________________________________BsAwAY_A_A_______A_A__________ ________________________________BsBSAY_A_A______________________ ______________________________BsBSAY_A_A________________________ ____________________________BsBSAY_A_A__________________________ __________________________BsBSAA_A_A____________________________ ________________________BsBSAY_A_A______________________________ ______________________BsBSAY_A_A________________________________ ____________________BsAwAY_A_A__________________________________ __________________BsBsAY_A_A____________________________________ ________________BsBSAY_A_A______________________________________ ______________BsBSAY_A_A________________________________________ ____________BsBSAA_A_A__________________________________________ __________BsBSAA_A_A____________________________________________ ________BsBSAY_A_A______________________________________________ ______BsBSAY_A_A________________________________________________ ____BsBSAw_A_A__________________________________________________ __AYBSAw_A_A____________________________________________________ AYAYAY_A_A______________________________________________________ _AAY_A_A________________________________________________________ ___A_A__________________________________________________________ } # tile 45 (single-edged polearm / glaive) { ____________________________________________________________CV_A __________________________________________________________CV_A_A ________________________________________________________BkCV_A__ ______________________________________________________BkCP_A_A__ ____________________________________________________BkBkCV_A____ __________________________________________________BkBdCPCV_A____ ________________________________________________BkBkBkCV_A_A____ ______________________________________________BkBkBkCPCV_A______ ____________________________________________BkBkBkCPCP_A_A______ __________________________________________BkBkBdCPCV_A_A________ ________________________________________BkBkCPCVCV_A_A__________ ______________________________________BkBkCVCV_A_A_A____________ __________________________________CrCrBkCP_A_A_A_A______________ ________________________________BSCrCLCL_A_A_A_A________________ ______________________________BsBsBSBb_A_A_A____________________ ____________________________BsAwBSAY_z_A________________________ __________________________CFAwBSAY_A_A__________________________ ________________________BsAwBSAY_A_A____________________________ ______________________BsAwBSAY_A_A______________________________ ____________________BsAwAwAY_A_A________________________________ __________________CFAwBSAY_A_A__________________________________ ________________CFAwBSAY_A_A____________________________________ ______________BSBSBSAY_A_A______________________________________ ____________BsBsBSAA_A_A________________________________________ __________BsAwBSAA_A_A__________________________________________ ________BsAwBSAY_A_A____________________________________________ ______BsAwBSAY_A_A______________________________________________ ____BSAwBSAw_A_A________________________________________________ __BsAwBSAw_A_A__________________________________________________ __AwBSAw_A_A____________________________________________________ _AAwAw_A_A______________________________________________________ _A_A_A_A________________________________________________________ } # tile 46 (lance) { ________________________________________________________________ ________________________________________________________________ __________________________________________________________CP____ ________________________________________________________CP___A__ ____________________________________________________CPCPAe_A_A__ __________________________________________________CPAlAl_A_A____ ________________________________________________CPBDAl_A_A_A____ ____________________________________________BdCVBDBJ_A_A_A______ __________________________________________BdCPBdAjAl_A_A________ ________________________________________BdCPBdAlAl_A_A__________ ____________________________________BdCVCPBDBJAl_A_A____________ __________________________________BdCPCPBdAjAl_A_A_A____________ ________________________________BdCPCPBDBdAl_A_A_A______________ ______________________________BdCPCPBdBdBJAl_A_A________________ ____________________________BdCPCPBDBdAlAl_A_A__________________ ________________________BdBdCPBkBDBdBJAl_A_A____________________ ______________________BdCPCPBdBdBdAjAl_A_A______________________ ____________________BdCPCPBkBdBdBJAl_A_A_A______________________ __________________BdCPCPCPBdBdAlAl_A_A_A________________________ ________________Bd_A_ABdBDBdBDAlAl_A_A__________________________ _________________A_ABkBdBdAlBJAl_A_A____________________________ __________________BDBdBd_AAlAl_A_A_A____________________________ ________________AlAeAO_A_AAl_A_A_A______________________________ ______________BDAeAe_A_AAl_A_A_A________________________________ ____________AlAeAe_A_A_A_A_A_A__________________________________ __________BDAeAe_A_A_____A_A____________________________________ ________AlAeAe_A_A______________________________________________ ______AlAeAe_A_A________________________________________________ ____AlAOAe_A_A__________________________________________________ ____AlAO_A_A____________________________________________________ _______A_A______________________________________________________ ________________________________________________________________ } # tile 47 (angled poleaxe / halberd) { ________________________________________________CPCP_A__________ ____________________________________________CPCPBk_A_A______CP_A __________________________________________CPBkBkBd_A_A____CP_A_A ________________________________________CPBkBdBd_A_A____CP_A_A__ ______________________________________CPBkBdBdBJ_A____CP_A_A____ ____________________________________CPBkBdBdBJAj_ACVBkBk_A_A____ __________________________________CPBk_A_AAlBDAlCPBkCP_A_A______ ___________________________________A_A_A_A_ABdBdAlBk_A_A________ __________________________________________CrCLBJBdCP_A__________ ________________________________________BsBsCLCLBdBdCP__________ ______________________________________CrCLBSAY_A_A_ABd__________ ____________________________________CFAwCLCL_A_A___A_ACP________ __________________________________BsAwBSAY_A_A_________A________ ________________________________BsAwBSAY_A_A____________________ ______________________________BsAwAwAY_A_A______________________ ____________________________CFAwBSAY_A_A________________________ __________________________CFAwBSAY_A_A__________________________ ________________________BsAwBSAY_A_A____________________________ ______________________BsAwBSAY_A_A______________________________ ____________________BsAwAwAY_A_A________________________________ __________________CFAwBSAY_A_A__________________________________ ________________CFAwBSAY_A_A____________________________________ ______________BSBSBSAY_A_A______________________________________ ____________BsBsBSAA_A_A________________________________________ __________BsAwBSAA_A_A__________________________________________ ________BsAwBSAY_A_A____________________________________________ ______BsAwBSAY_A_A______________________________________________ ____BSAwBSAw_A_A________________________________________________ __BsAwBSAw_A_A__________________________________________________ __AwBSAw_A_A____________________________________________________ _AAwAw_A_A______________________________________________________ _A_A_A_A________________________________________________________ } # tile 48 (long poleaxe / bardiche) { ______________________________________________________CPCPCPCPCP ________________________________________________CPCPCPCPBdBdBd_A ____________________________________________CPCPCPBdBdBdBdBd_A_A __________________________________________CPCPBdBd_A_A_A_A_A_A__ ________________________________________CPBdBdBdBdBk_A_A_A______ ______________________________________CPBdBd_A_ABkBkAe_A________ ______________________________________CPBd_A_ABsBiAe_A_A________ ____________________________________BkBk_A_ABsBSAY_A_A__________ ____________________________________CPBd_ABsBSAY_A_A____________ ____________________________________BkBJBsBSAA_A_A______________ ____________________________________BDBiBSAY_A_A________________ ____________________________________BsBSAY_A_A__________________ __________________________________BsBSAY_A_A____________________ ________________________________BsBSAY_A_A______________________ ______________________________BsBSAY_A_A________________________ ____________________________BsBSAY_A_A__________________________ __________________________BsBSAA_A_A____________________________ ________________________BsBSAY_A_A______________________________ ______________________BsBSAY_A_A________________________________ ____________________BsAwAY_A_A__________________________________ __________________BsBSAY_A_A____________________________________ ________________BsBSAY_A_A______________________________________ ______________BsBSAY_A_A________________________________________ ____________BsBSAA_A_A__________________________________________ __________BsBSAA_A_A____________________________________________ ________BsBSAY_A_A______________________________________________ ______BsBSAY_A_A________________________________________________ ____BsBSAw_A_A__________________________________________________ __AYBSAw_A_A____________________________________________________ AYAYAY_A_A______________________________________________________ _AAY_A_A________________________________________________________ ___A_A__________________________________________________________ } # tile 49 (pole cleaver / voulge) { ________________________________________________________________ ________________________________________________________________ ________________________________________BkBk________________CV_A _________________________________________ABkBkBk____________CV_A ___________________________________________ABkBkCVCP______BkCV_A _____________________________________________ACVCPCPBk__BkBkCV_A ____________________________________________CFBSAwBkBdBkBkBkCV_A __________________________________________CFBSAwAA_ABkBkBkCVCV_A ________________________________________BSAwBSAw_A_ABkBkBkCV_A_A ______________________________________BSBsBSAw_A_ABkBkBkCVCV_A_A ____________________________________CVCPBSAw_A_ABkBkBkBkCV_A_A_A __________________________________CVCPCPBk_A_ABkBkBkBkCVCV_A_A__ ________________________________CFAwBSBkBdBkBkBkBkCVCVCV_A_A____ ______________________________BsAwBSAY_ABkBkBkBkBkCVCV_A_A______ ____________________________BsAwBSAY_A_ABkBkBkBkCVCV_A_A________ __________________________BsAwAwAY_A_A_A_ABkCVCVCV_A_A__________ ________________________CFAwBSAY_A_A_____A_ACVCV_A_A____________ ______________________CFAwBSAY_A_A_________A_A_A_A______________ ____________________BSBSBSAY_A_A_____________A_A________________ __________________BsBsBSAA_A_A__________________________________ ________________BsAwBSAA_A_A____________________________________ ______________BsAwBSAY_A_A______________________________________ ____________BsAwBSAY_A_A________________________________________ __________BSAwBSAw_A_A__________________________________________ ________BsAwBSAw_A_A____________________________________________ ______BSAwBSAw_A_A______________________________________________ ____BSAwAwAw_A_A________________________________________________ _ABSAwAwAY_A_A__________________________________________________ _A_AAwAY_A_A____________________________________________________ ___A_A_A_A______________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 50 (broad pick / dwarvish mattock) { ________________________________________________________________ ________________________CPBkCPCP________________________________ ______________________CPBnCPCJBnCJCPBn__________________________ ______________________BkBwBkBkBkCPBkCPCJCPCP_M____Bs____________ ________________________BkBkBkBkBkBkBkBkBkBkCPCPBiBS_M__________ ________________________________________BkBkBkCJCPAv_M__________ ________________________________________BDBDBkBkBnCJBk__________ __________________________________________BsBDBDBkCPCPBk________ ________________________________________BsBSAw_M_zBDBnCJ_O______ ______________________________________BsBSBS_O_zAB_M_zCPCP_M____ ____________________________________BsBSAw_MAK_________MCJCP_M__ __________________________________BsBSAwAA_M______________CP_$_M ________________________________BsBSAw_MA_________________BkBn_$ ______________________________BsBSAwAA_M____________________CP_M ____________________________BsBSAw_MA__________________________z __________________________BsBSAwAA_M____________________________ ________________________BsBSAw_MA_______________________________ ______________________BsBSAwAA_M________________________________ ____________________BsBSAw_MA___________________________________ __________________BsBSAwAA_M____________________________________ ________________BsBSAw_MA_______________________________________ ______________BsBSAwAA_M________________________________________ ____________BsBSAw_MA___________________________________________ __________BsBSAwAA_M____________________________________________ ________BsBSAw_MA_______________________________________________ ______BsBSAwAA_M________________________________________________ ____BsBSAw_MA___________________________________________________ __BsBSAwAA_M____________________________________________________ _MBSAw_MA_______________________________________________________ A__MAA_M________________________________________________________ _MAA_C__________________________________________________________ ________________________________________________________________ } # tile 51 (pole sickle / fauchard) { ____________________________________________________________CV_A ____________________________________________________CP_A__CV_A_A ________________________________________________CPBk_A_ABkCV_A__ ______________________________________________CPBk_A_ABkCP_A_A__ ____________________________________________CPBd_A_ABkBkCV_A____ __________________________________________CPBk_A_ABkBkCPCV_A____ __________________________________________CPBkBkBkBkBkCV_A_A____ ___________________________________________ABkBkBkBkCPCV_A______ ___________________________________________ABkBkBkCPCP_A_A______ __________________________________________BkBkBdCPCV_A_A________ ________________________________________BkBkCPCVCV_A_A__________ ______________________________________BkBkCVCV_A_A_A____________ __________________________________CrCrBkCP_A_A_A_A______________ ________________________________BSCrCLCL_A_A_A_A________________ ______________________________BsBsBSBb_A_A_A____________________ ____________________________BsAwBSAY_z_A________________________ __________________________CFAwBSAY_A_A__________________________ ________________________BsAwBSAY_A_A____________________________ ______________________BsAwBSAY_A_A______________________________ ____________________BsAwAwAY_A_A________________________________ __________________CFAwBSAY_A_A__________________________________ ________________CFAwBSAY_A_A____________________________________ ______________BSBSBSAY_A_A______________________________________ ____________BsBsBSAA_A_A________________________________________ __________BsAwBSAA_A_A__________________________________________ ________BsAwBSAY_A_A____________________________________________ ______BsAwBSAY_A_A______________________________________________ ____BSAwBSAw_A_A________________________________________________ __BsAwBSAw_A_A__________________________________________________ __AwBSAw_A_A____________________________________________________ _AAwAw_A_A______________________________________________________ _A_A_A_A________________________________________________________ } # tile 52 (pruning hook / guisarme) { ____________________________________________________________CP_A ________________________________________CPCPCPBdBdBd____BdCP_A__ _________________________________________A_A_ACPCPBdBdBdBk_A____ _______________________________________________A_ACPBdBd_A_A____ _________________________________________________ABdBdBk_M______ ________________________________________________BdBkBk_z_A______ ______________________________________________BdBdBkBkBd________ ________________________________________Bk_ABdBkBk_A_ABdBd______ ________________________________________BnBdBdBk_M_z_A_ABd______ _______________________________________ACJBdBd_A_A_______A______ ______________________________________BsBSBkCJBn_A______________ ____________________________________BsBSAA_M_A_A________________ __________________________________BsBSAY_A_A____________________ ________________________________BsBSAY_A_A______________________ ______________________________BsBSAY_A_A________________________ ____________________________BsBSAY_A_A__________________________ __________________________BsBSAA_A_A____________________________ ________________________BsBSAY_A_A______________________________ ______________________BsBSAY_A_A________________________________ ____________________BsAwAY_A_A__________________________________ __________________BsBsAY_A_A____________________________________ ________________BsBSAY_A_A______________________________________ ______________BsBSAY_A_A________________________________________ ____________BsBSAA_A_A__________________________________________ __________BsBSAA_A_A____________________________________________ ________BsBSAY_A_A______________________________________________ ______BsBSAY_A_A________________________________________________ ____BsBSAw_A_A__________________________________________________ __AYBSAw_A_A____________________________________________________ AYAYAY_A_A______________________________________________________ _AAY_A_A________________________________________________________ ___A_A__________________________________________________________ } # tile 53 (hooked polearm / bill-guisarme) { ____________________________________________________________CP_A ________________________________________CPCPCPBdBdBd____BdCP_A__ _________________________________________A_A_ACPCPBdBdBdBk_A____ _______________________________________________A_ACPBdBd_A_A____ _________________________________________________ABdBdBk_M______ ________________________________________________BdBkBk_z_A______ ______________________________________________BdBdBkBkBd________ ________________________________________Bk_ABdBkBk_A_ABdBd______ ________________________________________BnBdBdBk_M_z_A_ABd______ _______________________________________ACJBdBd_A_A_______A______ ______________________________________BsBSBkCJBn_A______________ ____________________________________BsBSAA_M_A_A________________ __________________________________BsBSAY_A_A____________________ ________________________________BsBSAY_A_A______________________ ______________________________BsBSAY_A_A________________________ ____________________________BsBSAY_A_A__________________________ __________________________BsBSAA_A_A____________________________ ________________________BsBSAY_A_A______________________________ ______________________BsBSAY_A_A________________________________ ____________________BsAwAY_A_A__________________________________ __________________BsBsAY_A_A____________________________________ ________________BsBSAY_A_A______________________________________ ______________BsBSAY_A_A________________________________________ ____________BsBSAA_A_A__________________________________________ __________BsBSAA_A_A____________________________________________ ________BsBSAY_A_A______________________________________________ ______CPBdAY_A_A________________________________________________ ____CPBdBd_A_A__________________________________________________ __CPBdBd_A_A____________________________________________________ __CP_A_A_A______________________________________________________ CP_A_A__________________________________________________________ ________________________________________________________________ } # tile 54 (pronged polearm / lucern hammer) { ________________________________________________________________ ____________________________________BdCPBD______________________ __________________________________AlAlBdCPBD__________BkBD______ _________________________________AAOAlAlBDCPBD______BkBD_A______ _________________________________AABAOAlBDBDCP____BkBD_A________ _________________________________A_AABAOAlAlBd__BkBD_A__________ ___________________________________A_AABAOAlBJBkBD_A____________ _____________________________________A_A_A_AAlBDBkBD____________ _______________________________________A_ACrCL_ABDBkBDBk________ ________________________________________BsBSCL_A_ABDBk_ABk______ ______________________________________BsBSAY_A_A_ABk___A_ABk____ ____________________________________BsBSAY_A_A___A_ABk___A_ABk__ __________________________________BsBSAY_A_A_______A_ABk___A_A__ ________________________________BsBSAA_A_A___________A_ABk______ ______________________________BsBSAY_A_A_______________A_A______ ____________________________BsBSAY_A_A__________________________ __________________________BsBSAY_A_A____________________________ ________________________BsBSAY_A_A______________________________ ______________________BsBSAY_A_A________________________________ ____________________BsAwAY_A_A__________________________________ __________________BsBsAY_A_A____________________________________ ________________BsBSAY_A_A______________________________________ ______________BsBSAY_A_A________________________________________ ____________BsBSAA_A_A__________________________________________ __________BsBSAA_A_A____________________________________________ ________BsBSAY_A_A______________________________________________ ______BsBSAY_A_A________________________________________________ ____BsBSAw_A_A__________________________________________________ __AYBSAw_A_A____________________________________________________ AYAYAY_A_A______________________________________________________ _AAY_A_A________________________________________________________ ___A_A__________________________________________________________ } # tile 55 (beaked polearm / bec de corbin) { ________________________________________________________________ ____________________________________BdCPBD______________________ __________________________________AlAlBdCPBD__________BkBD______ _________________________________AAOAlAlBDCPBD______BkBD_A______ _________________________________AABAOAlBDBDCP____BkBD_A________ _________________________________A_AABAOAlAlBd__BkBD_A__________ ___________________________________A_AABAOAlBJBkBD_A____________ _____________________________________A_A_A_AAlBDBk______________ _______________________________________A_ACrCL_ABDBk____________ ________________________________________BsBSCL_A_ABDBk__________ ______________________________________BsBSAY_A_A_A_ABDBk________ ____________________________________BsBSAY_A_A_______ABk________ __________________________________BsBSAY_A_A_________ABk________ ________________________________BsBSAA_A_A_____________A________ ______________________________BsBSAY_A_A________________________ ____________________________BsBSAY_A_A__________________________ __________________________BsBSAY_A_A____________________________ ________________________BsBSAY_A_A______________________________ ______________________BsBSAY_A_A________________________________ ____________________BsAwAY_A_A__________________________________ __________________BsBsAY_A_A____________________________________ ________________BsBSAY_A_A______________________________________ ______________BsBSAY_A_A________________________________________ ____________BsBSAA_A_A__________________________________________ __________BsBSAA_A_A____________________________________________ ________BsBSAY_A_A______________________________________________ ______BsBSAY_A_A________________________________________________ ____BsBSAw_A_A__________________________________________________ __AYBSAw_A_A____________________________________________________ AYAYAY_A_A______________________________________________________ _AAY_A_A________________________________________________________ ___A_A__________________________________________________________ } # tile 56 (mace) { ________________________________________________________________ ____________________________________________Bd__________________ ____________________________________________Bd__________________ ________________________________Bd________AeBdAe________BD_A____ __________________________________Bd__AeAeAeAeAeAOAO__BD_A_A____ ____________________________________AeAeAlAlAeAeAeAOAO_A_A______ __________________________________AeAeBDBdBJAlAeAeAOAOAB_A______ __________________________________AeAlBdBDAjAlAeAeAeAOAB_A_A____ ________________________________AeAeAlBJAlAlAeAeAeAeAOAOAB_A_A__ ____________________________BdBdBdAeAeAlAlAeBdAeAeAeAOAOBDBDBD_A ________________________________AeAeAeAeAeAeAeAeAeAeAOAOAB_A____ __________________________________AOAeAeAeAeAeAeAeAOAOAB_A_A_A__ __________________________________AeAOAOAeAeAeAeAOAOABAB_A_A_A__ ________________________________BJBdAlAOAOAOAOAOAOABAB_A_A_A_A__ ______________________________AlBdBDAlABABAOAOAOABAB_ABJ_A_A_A__ ____________________________BDBdBDAlAO_A_AABBDAB_A_A_A_ABJ_A_A__ __________________________AlBdBDAlAO_A_A_A_ABD_A_A_A_A_A_A_A_A__ ________________________BDBdBDAlAO_A_A_A___ABD_A_A_A_A_A_A______ ______________________AlBdBDAlAO_A_A_A_______A_A________________ ____________________BDBdBDAlAO_A_A_A____________________________ __________________BWCIBDAlAO_A_A_A______________________________ ________________BSBsBWBWAO_A_A_A________________________________ ______________AwBsBSBSAz_A_A_A__________________________________ ____________BSBsAwBSAw_A_A_A____________________________________ __________AwBsBSBSAY_A_A_A______________________________________ ________BSBsAwBSAw_A_A_A________________________________________ ______AwBsBSBSAY_A_A_A__________________________________________ ____BSBsAwBSAw_A_A_A____________________________________________ __AYBsBSBSAY_A_A_A______________________________________________ __AYAYBSAw_A_A_A________________________________________________ ___AAYAY_A_A_A__________________________________________________ ___A_A_A_A_A____________________________________________________ } # tile 57 (morning star) { __________BdBdAO____________________________Bd__________________ ________BDBk_AAOBJ__________________________Bd__________________ ______BZBDBkB__AAOAO________________________Bd__________________ ______BZCLBZB__A_AAO____________Bd________AOBdAO________Bd_A____ ______BZBbBZB__A__BJ______________Bd__AOAOAOAOAOABAB__BdAO_A____ ______AvCLBZAY_A__AO_A____________BdAOAOAeAeAOAOAOABBdAO_A______ ______AwBSAwAY_A__AO_A____________AOAOBDBdBJAeBdBdAOAB_M_A______ ______AwBSAwAY_A__BJ_A____________AOAeBdBDAjAeBdABAOAB_z_A_A____ ______AwBSAwAY_A__AO___A________AOAOAeBJAlAlAOAOAOAOABABAB_A_A__ ______AwBSAwAY_A__AO___A__BdBdBdBdAOAOAeAeAOAOAOAOAOABABBdBdBd_A ______AwBSAwAY_A__AOAO_A____BJAjAOAOAOAOBdABAOAOAOAOABAB_M_A____ ______AwBSAwAY_A____BJ_A__________AOAOBdABAOAOBdBdABAB_M_A_A_A__ ______AwBSAwAY_A____AOAO_A________AOAOAOAOAOAOAOBdBd_MAK_A_A_A__ ______AwBSAwAY_A______AO_A________BdBJABABABABABABAK_M_A_A_A_A__ ______AwBSAwAY_A______Al_A______BdAlAlABABABABAB_M_M_ABJ_A_A_A__ ______AwBSAwAY_A______AO_A_____________A_AABAOAB_z_A_A_ABJ_A_A__ ______AwBSAwAY_A______AO_A_______________A_AAOAO_A_A_A_A_A_A_A__ ______AwBSAwAY_A______AOBJ_A_______________AAOBJ_A_A_A_A_A______ ______AwBSAwAY_A________AO_A_________________AAO________________ ______AwBSAwAY_A________AOAO__________________AO________________ ______AwBSAwAY_A__________BJ__________________BJ________________ ______AwBSAwAY_A__________AOAO______________AOAO________________ ______AwBSAwAY_A___________AAjAO____________AO_A________________ ______AwBSAwAY_A_____________zAOAO__________AO_A________________ ______AwBSAwAY_A_____________A_ABJ______AOAOBJ__________________ ______AwBSAwAY_A_______________A_AAOAOBJ_A_A_A__________________ ______AwBSAwAY_A_________________A_A_A_A________________________ ______AwBSAwAY_A________________________________________________ ______AwBSAwAY_A________________________________________________ ______AwBSAwAY_A________________________________________________ _______ABSAw_A_A________________________________________________ _________A_A_A__________________________________________________ } # tile 58 (war hammer) { ___________________________________________________________A_A__ ______________________________________________________AwAY_A_A_A ____________________________________________________AwAYAYAA_A_A __________________________________________________AwAYAYAA_A_A__ ________________________________________________AwAYAYAA_A_A____ ______________________________________________AwAYAYAA_A_A______ ______________AOAO__________________________AwAYAYAA_A_A________ ____________AOAOAOAOAO____________________AwAYAYAA_A_A__________ __________AOAOAOAeAOAeAOAO______________AwAYAYAA_A_A____________ ________AOAeAOAOAOAOAOAOAe_A_A________AwAYAYAA_A_A______________ ______AOAOAOAOAOAeAOAOAOAe_A_A_A____AwAYAYAA_A_A________________ ____AOAeAOAOAeAOAOAOAOAeAOAe_A_A_AAwAYAYAA_A_A__________________ __AOAOAOAOAOAOAOAOAeAeAOAeAe_A_AAwAYAYAA_A_A_A__________________ _M_MAOAOAeAOAOAOAeAOAeAOAOAe_AAwAYAYAA_AAOAeAO_A_A_A____________ _zAB_M_zAOAOAOAeAOAeAOAOAeAOAOAYAYAAAOAOAOAOAOAOAO_A_A_A________ AB_MAK_MAB_MAeAeAeAOAeAeAOAOAOAOAAAOAeAOAeAOAeAOAeAOAO_A_A______ _M_$_OAA_BAAABABAOAeAOAOAOAOAOAOAOAeAOAOAOAOAOAOAOAOAe_A_A_A____ _MABA__MABA_AB_MABABAe_MAOAOAOAOAeAOAOAOAOAOAOAeAOAeAe_A_A_A____ _MAA_MAB_z_OABABABAB_MAK_M_AAOAeAeAOAOAOAeAOAOAOAeAeAe_A_A_A____ _zAB_z_MAB_zABAB_MABAK_M_A_AAOAOAOAOAeAOAOAOAOAeAeAOAe_A_A_A____ AB_M_MAK_MABAB_MAKABAB_MAK_A_M_MAOAOAOAOAOAOAeAeAeAeAe_A_A______ _MAB_zAB_M_zABABABAB_A_A_M_A_zABAK_MAOAOAOAeAeAeAeAeAe_A_A______ _A_A_M_MAK_OABABAB_A_A_A_A_A_M_M_MAK_MAOAeAeAeAOAeAOAe_A________ ___A_z_z_MAAAB_A_A_A_A_A_A_AABAKAB_z_MAOAeAOAeAeAeAeAe_A________ _______A_A_A_A_A_A_A_A_A_A_A_M_z_MABABAOAeAeAeAeAOAe_A__________ _____________________A_A_A_AAK_MAB_M_zAOAeAeAOAeAe_A____________ _________________________A_A_MAB_zAB_MAOAeAeAeAe_A______________ ___________________________z_MAA_O_zABAOAeAeAe_A________________ ___________________________A_MA_AB_MABAOAeAe_A__________________ _____________________________A_AAA_M_zAOAe_A____________________ _________________________________A_AABAO_A______________________ ________________________________________________________________ } # tile 59 (club) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________________________BSBsCFBs______________ ________________________________________BSBsBsCFBsBs____________ ______________________________________BSBsBsCFCFBsBs____________ ____________________________________BSBsBsCFCFCFBsBSBS__________ __________________________________BSBSBsCFBsBsBsBSBSBS_A________ ________________________________BSBsBsCFCFBSBsBsBSBSAY_A________ ______________________________BSBsBsCFBsBsBsBsBSBSAY_A_A________ ____________________________BSBSBsCFCFCFBsBSBsBSAY_A_A_A________ ____________________________BsBsCFCFBsBsBSBSBSAY_A_A_A__________ __________________________BSBsBsBsBsBsBSBsBSAY_A_A_A____________ ________________________BSBsBsCFBsBSBSBSBSAY_A_A_A______________ ______________________BSBsBSCFCFCFBSBsBSAY_A_A_A________________ ____________________AwBsBsCFBsBsBsBSBSAY_A_A_A__________________ ____________________BsBsCFCFBsBSBSAY_A_A_A_A____________________ __________________BSBsBSCFBSBSBsAY_A_A_A_A______________________ ________________BSBsCFBsBsBSBSAY_A_A_A__________________________ ______________BsBsCFBsBSBSAY_A_A_A_A____________________________ ____________BSBsCFBsBsBSAY_A_A_A________________________________ ____________BSBSBsBSBsAY_A_A_A__________________________________ ___________AAYBsBsBSAY_A_A______________________________________ ___________A_AAYAY_A_A_A________________________________________ ___________A_A_A_A_A_A__________________________________________ _____________A_A_A______________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 60 (rubber hose) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ _____________________________q_q_q_q_q_q________________________ _________________________q_q_m_m_m_m_m_m_q_q____________________ _____________________q_q_m_m_m_h_h_h_h_m_m_m_q_X________________ ___________________q_m_m_m_h_h_A_A_A_A_h_h_m_X_X_X______________ _________________q_m_m_h_h_A_A_________A_A_h_h_X_A______________ _________________m_m_h_A_A_________________A_A_A_A______________ _________________m_m_m_A________________________________________ _________________h_m_q_A________________________________________ _________________A_h_m_q_A______________________________________ _________________A_h_m_m_q______________________________________ ___________________A_h_m_m_q_q__________________________________ _____________________A_h_m_m_m_q_q_A____________________________ _______________________A_h_h_m_m_m_m_A__________________________ _________________________A_A_h_h_q_m_h_A________________________ _____________________________A_A_q_m_h_A________________________ _______________________________q_m_m_h_A________________________ _____________________________q_m_m_h_A__________________________ _________________________q_q_m_m_h_A____________________________ _____________q_q_q_q_q_q_m_m_h_h_A______________________________ ___________m_m_m_m_m_m_h_h_h_A_A________________________________ _____________h_h_h_h_h_h_A_A____________________________________ _____________A_A_A_A_A_A________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 61 (staff / quarterstaff) { ________________________________________________________________ ________________________________________________________________ ______________________________________________________BSBS______ ____________________________________________________BSBSAwBS____ __________________________________________________BSBsAwBSAY_A__ ________________________________________________BSBsAwBSAY_A_A__ ______________________________________________BSBsAYBSAY_A_A____ ____________________________________________AYBsBSBSAY_A_A______ __________________________________________BSCFBSAwAA_A_A________ ________________________________________BSCFBSAwAA_A_A__________ ______________________________________BSBSAYBSAw_A_A____________ ____________________________________BSBSBsBSAw_A_A______________ __________________________________BSBsBsBSAw_A_A________________ ________________________________BSBsAYBSAY_A_A__________________ ______________________________BSCFAYBSAY_A_A____________________ ____________________________BSBsAYBSAY_A_A______________________ __________________________BSBsAYBSAY_A_A________________________ ________________________BSBsAYAwAY_A_A__________________________ ______________________AwCFAYBSAY_A_A____________________________ ____________________AwCFAYBSAY_A_A______________________________ __________________AwBSBSBSAY_A_A________________________________ ________________AwBsBsBSAA_A_A__________________________________ ______________BsBsAYBSAA_A_A____________________________________ ____________CFBsAYBSAY_A_A______________________________________ __________CFBsAYBSAY_A_A________________________________________ ________CFBSBSAYAw_A_A__________________________________________ ______BsBsBSAYAw_A_A____________________________________________ ____BsBSAwAYAw_A_A______________________________________________ __BsBSAwAwAw_A_A________________________________________________ _ABSAwAwAY_A_A__________________________________________________ _A_AAwAY_A_A____________________________________________________ ___A_A_A_A______________________________________________________ } # tile 62 (thonged club / aklys) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________CFCFCFCFCFCFBsBs________________ ________________________________CFCFCFCFCFBsBsBS________________ ________________________________CFCFCFCFBsBsBS_A_A_A_A__________ ______________________________CFCFCFCFBsBsBS_A_A_A_A____________ ____________________________CFCFCFCFBsBsBS_A_A_A_A______________ ____________________________CFCFCFBsBsBS_A_A_A_A________________ __________________________CFCFCFBsBsBS_A_A_A_A__________________ __________________________CFCFCFBsBS_A_A_A_A____________________ ________________________CFCFCFBsBS_A_A_A_A______________________ ______________________CFCFCFBsBS_A_A_A_A________________________ ____________________CFCFCFBsBS_A_A_A_A__________________________ ____________________CFCFBsBS_A_A_A_A____________________________ __________________CFCFBsBS_A_A_A_A______________________________ __________________CFBsBS_A_A_A_A________________________________ ________________CFBsBS_A_A_A_A__________________________________ ________________BsBS_A_A_A_A____________________________________ ___________________A_A_A_A______________________________________ ___________________A_A__________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 63 (flail) { ______________________________________________________BSBS______ ____________________________________________________BSBSAwBS____ __________________________________________________BSBsAwBSAY_A__ ________________________________________________BSBsAwBSAY_A_A__ ______________________________________________BSBsAYBSAY_A_A____ ____________________________________________AYBsBSBSAY_A_A______ __________________________________________BSCFBSAwAA_A_A________ ________________________________________BSCFBSAwAA_A_A__________ ______________________________________BSBSAYBSAw_A_A____________ ____________________________________BSBSBsBSAw_A_A______________ __________________________________BSBsBsBSAw_A_A________________ ________________________________BSBsAYBSAY_A_A__________________ ______________________________BSCFAYBSAY_A_A____________________ ____________________________BSBsAYBSAY_A_A______________________ __________________________BSBsAYBSAY_A_A________________________ ________________________BSBsAYAwAY_A_A__________________________ ______________________AwCFAYBSAY_A_A____________________________ ____________________AwCFAYBSAY_A_A______________________________ __________________AwBSBSBSAY_A_A________________________________ ________________AwBsBsBSAA_A_A__________________________________ ______________BsBsAYBSAA_A_A____________________________________ ____________CPBkBdBSAY_A_A______________________________________ __________CPBdBdBJAJ_A_A________________________________________ ________AeAeBdAlAe_A_A__________________________________________ ________AlBDAeAe_A_A____________________________________________ _______ABdAeAe_A_A______________________________________________ _____ABJAe_A_A_A__________Cm______Cm______Cm____________________ ___ABdAe_A_A_ABdBdBdBSBSBsBSBSBsBsBSBSBsBsBSBsBS_A______________ ___AAeAjBdBJBdBdBdBSBSCPBSBSBsCPBSBsBsCPBSBSBSAwAw_A____________ _____A_AAe_BAlAjBJAwBSAYAwBSAwAYBSAwAwAYAwAwBSAwAw_A____________ _________A_A_AAeAeAeAYAYAwAYAYAwAYAYAYAYAwAYAYAw_A_A____________ _____________A_A_A_A_A_A_ABd_A_A_ABd_A_A_ABd_A_A_A______________ } # tile 64 (bullwhip) { ________________________________________________________________ ________________________________________________________________ ________________________________BRBRBRBRBRBR____________________ ____________________________BRBRAvAXAXAXAvAvAvBRBR______________ ________________________BRBRAvAX_A_A_A_A_A_AAXAvAvBR____________ ____________________BRAvAX_A_A_A_A_A_A_A_A_A_A_AAXAvAvBR________ __________________BRAX_A_A_A___________________A_A_AAXAv_A______ ________________BRAX_A_A___________________________A_ABR_A______ ______________BRAv_A_A________________________________Av_A______ ______________AvAX_A________________________________BRAX_A______ ____________BRAX_A_A________________________________Av_A_A______ ____________BRAX_A________________________________BRAX_A________ ____________BRAv_A________________________________BR_A_A________ ____________BRAv_A________________________________BR_A__________ _____________AAXBR________________________________AXBR__________ _______________AAXAvBR_____________________________AAXBR________ _________________AAXAvBRBRAvBR_______________________AAXAXAvBR_A ___________________A_A_AAXAXAXAvBRAvBR_________________A_A_A_A_A _________________________A_A_A_AAXAXAvAvBR______________________ _________________________________A_A_AAXAvBR____________________ ______BWBv_____________________________AAXAvBR__________________ ____AzBWBWBv_____________________________AAvBR_A________________ _____AAzBWBWBWBW__________________________AXBRAX_A______________ _____A_AAzAzAzBWBvBv________________________BRAv_A______________ _______A_A_AAzAzAzBvBvBR____________________BRAv_A______________ ___________A_A_LAzAzAbBRBR__________________BRAX_A______________ _______________A_A_AAXAvAvAvBR____________BRAvAX_A______________ _____________________A_AAXAvAvAvBR______BRAvAX_A_A______________ _________________________AAXAXAvAvBRBRBRAvAX_A_A________________ ___________________________A_A_AAXAvAXAv_A_A_A__________________ _________________________________A_A_A_A_A______________________ ________________________________________________________________ } # tile 66 (runed bow / elven bow) { ______________________CFCF______________________________________ ____________________CFCF________________________________________ ____________________CFCF________________________________________ ____________________CFBMBM______________________________________ ____________________BMBMCFCF____________________________________ ____________________BM__CFCFBs__________________________________ ____________________BM__CFCFBs__________________________________ ____________________BM____CFCFBs________________________________ ____________________BM______CFCFBs______________________________ ____________________BM________CFCFBs____________________________ ____________________BM__________CFCF____________________________ ____________________BM__________CFCFBs__________________________ ____________________BM__________CFCFCFBs________________________ ____________________BM____________CFCnCi________________________ ____________________BM____________CFCiCn________________________ ____________________Cl____________CFCA__________________________ ____________________Cl____________CFBs__________________________ ____________________BM____________CFCnCi________________________ ____________________BM____________CFCiCn________________________ ____________________BM__________CFCFCFCF________________________ ____________________BM__________CFCFBs_________A_A_A____________ ____________________BM__________CFCF_________A_A_A_A_A__________ ____________________BM________CFCFBs_________A_A_A______________ ____________________BM______CFCFBs_________A_A_A________________ ____________________BM____CFCFBs___________A_A_A________________ ____________________BM__CFCFBs___________A_A_A__________________ ____________________BM__CFCFBs_________A_A_A____________________ ____________________BMBMCFCF_______A_A_A_A______________________ ____________________CFBMBM_A_A_A_A_A_A_A________________________ ____________________CFCF_A_A_A_A_A_A_A__________________________ ____________________CFCF_A_A_A_A_A______________________________ ______________________CFCF_A_A_A________________________________ } # tile 67 (crude bow / orcish bow) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________CFCFCF__________________________________________ __________________CFCFBMCF______________________________________ ____________________BMBMCFCF____________________________________ ____________________BM__CFCFBs__________________________________ ____________________BM____CFCFBs________________________________ ____________________BM______CFCFBs______________________________ ____________________BM________CFCFBs____________________________ ____________________BM________CFCFBs____________________________ ____________________BM__________CFCFBs__________________________ ____________________BM__________CFCFBs__________________________ ____________________Cl____________CiCn__________________________ ____________________Cl____________CnCi__________________________ ____________________Cl____________CiCn__________________________ ____________________Cl____________CnCi__________________________ ____________________BM__________CFCcBs__________________________ ____________________BM__________CFCFBs__________________________ ____________________BM________CFCFBs____________________________ ____________________BM________CFCFBs____________________________ ____________________BM______CFCFBs______________________________ ____________________BM____CFCFBs___________________z____________ ____________________BM__CFCFBs_________________z_z_z____________ ____________________BMBMCFCF_____________z_z_z_z_z______________ __________________CFCFBMCF_______z_z_z_z_z_z_z_z________________ ________________CFCFCF_z_z_z_z_z_z_z_z_z_z______________________ _____________________z_z_z_z_z_z_z______________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 69 (sling) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________________________________________AvAXAv______ __________________________________________AvAvAvAvAvAvAvAvAvAv_A __________AzAzAzAzAzAz______________AvAvAvAvAvAXAXAXAX_A_A_A_A_A ______AbAbAzAzAzAzAzAzAzAvAvAvBRAvBRAXAvAXAX_A_A_A_A_A_A________ ____CICIAbAzAzAcAzAzAzAzAXAXAXAXAXAvAv_A_A_A_A__________________ ____CICIBvBvAzAzAzAzAz_A_A_A_A_A_A_A_A_A________________________ ____CfBWBvBvBWBvBWBWBW_A_A_A_A_A_A_A_AAvAvAvAvAXAvAvAvAvAvAvAv_A ____CIBvBvBWAzBWBWBWBWAzAvAvBRAXAvAvAvAvAXAXAXAXAXAXAXAXAv_A_A__ _____ABvBvBvBWBvBWBWBWBWAYAXAXAXAXAXAXAXAX_A_A_A_A_A_A_A_A______ _____A_A_ABWBWBWBWBWBW_A_A_A_A_A_A_A_A_A_A______________________ _________A_A_A_A_A_A_A_A________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 70 (crossbow) { ________________________________________________________________ ____________________BkBkBkBkBkBkBkBkBkBkBk______________________ ____________BkBkBkBkBJAeAlBdBJAjBdBdBdBJ_MBkBkBk________________ ________BkBkAeAlBDAlAjAeBDBdAlBJBdBdBdBJ_MAlAl_MBkBk____________ ______BkAeAeAeBDAlBD_A_A_A_A_B_ABdBdBdAlAlAlAlAOBdBdBkBk________ ____BkAeAe_A_A_A_A_A_A_A_A_A_A_A_A_A_BAlAlAlAOAOBdBdAjBJBk______ ____AlBcBcBc___________________A_A_AAlAlAlAOAOAOBdBdBJAlAeBk____ ____________BcBcBc________________AlAlAlAOAOAO_A_ABdAlBDAeBk____ __________________BcBcBc________AlAlAlAOAOAO_A_A_A_A_AAlAeBDBk__ ________________________BcBcBcAlAlAlAOAOAO_A_A_______A_BAeAlBk__ ____________________________AlBcBcBcAOAO_A_A___________AAeBDBk__ __________________________AlAlAlAOAOBcBcBc_____________A_AAlBk__ ________________________BJAlAlAOAOAO_A_A__BcBcBc_________A_ABk_A ________________________BSAlAOAOAO_A_A__________BcBcBc_____ABk_A ______________________BSBSBSAOAO_A_A__________________BcBcBcAl_A ____________________BSBSBSAwAw_A_A_A_________________________A_A __________________BSBSBSAwAwAw_A_A______________________________ ________________BSBSBSAwAwAw_A_A________________________________ ______________BSBSBSAwAwAw_A_A__________________________________ ____________BSBSBSAwAwAw_A_A_A__________________________________ __________BSBSBSAwAwAw_A_A_A____________________________________ ________BSBSBSAwAwAw_A_A_A______________________________________ ______BSBSBSAwAwAwAw_A_A________________________________________ ____BSBSBSAwAwAwAw_A_A_A________________________________________ __AYBSBSAwAwAwAwAw_A_A__________________________________________ __AYAYAYAwAwAwAw_A_A____________________________________________ __AYAYAYAwAwAw_A_A_A____________________________________________ __AYAYAYAwAwAw_A_A______________________________________________ __AYAYAYAwAw_A_A________________________________________________ __AYAYAYAwAw_A__________________________________________________ ___AAYAYAw_A_A__________________________________________________ ___A_A_A_A_A____________________________________________________ } # tile 71 (leather hat / elven leather helm) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________AwAwAwAw________________________________________ CPCVCVCV________AAAYAYAwAwAw____________________________________ ____BkBkCPCV____AAAYAYAwBSAwBSAw________________________________ ______CPCPCPCV____AAAYAYAwAwAwAwBSAw____________________________ ________BkBkBkCV__AJAAAwAYAwAwAwAwBSAw___________A_A_A_A_A______ __________CPCVCV____AAAYAYAwAwAwAwAwBSAw___A_A_A_A_A_A_A_A______ ______________BkCV___zAAAwAYAYAwAwAwAwAw_A_A_A_A_A_A_A_A_A______ ____________CPBDBkCPAAAAAJAYAwAYAwAwBSBSAw_A_A_A_A_A_A_A________ ______________AABkBk_LAAAYAYAYAYAwAwAwAwAw_A_A_A_A_A_A_A________ ____________AA_zAABdBkAYAYAYAwAYAwAwBSAwAwAYAw_A_A_A_A__________ __________AAAA_NAAAABkAYAAAYAYAYAwAwAwBSBSAwAYAY_A_A_A__________ ___________zAAAA_zAYAABkAYAYAYAwAYAwAwAwAwAYAYAwAw_A____________ ___________AAA_LAAAAAYAJAAAYAYAYAwAwAwBSAYAwAwAYAw_A____________ _____________AAA_zAA_zAAAYAAAYAYAwAwAwAYAwAYAwAY_A______________ _______________AAA_NAAAA_LAA_zAAAYAYAYAYAYAwAY_A________________ _________________A_AAA_zAAAAAA_NAAAYAYAYAwAY_A__________________ ___________________A_A_AAA_LAA_zAAAYAY_A_A_A____________________ _______________________A_A_A_A_A_A_A_A_A________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 72 (iron skull cap / orcish helm) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________________________Bd________________________________ ______________________________Bd________________________________ ____________________________BkBkBD______________________________ ________________________BkBkCPBkBdBDBD__________________________ ____________________BdBdCPBkBkBkBdBdBDBDBD______________________ ____________________BdBdBkBkBkBkBdBdBDBJAj_A_A__________________ __________________BkBkBdBdBdBdBdBDBDBDAlBJ_A_A_A________________ ______________BkBkBkCPBkBkBdBdBdBDBDBDBDAlAl_A_A________________ _______________ACPBkBkBd_A_A_A_A_A_A_AABAlBDAl_A________________ _________________ABkBd_A_A_A_A_A_A_A_A_AABAl_A_A________________ ___________________A_A_A_________________B_A_A__________________ ________________________________________________________________ ________________________________________________________________ } # tile 73 (hard hat / dwarvish iron helm) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________________________________________Bk________________ ____________CV________________________________CP________________ __________CVBk________________________________CPBd______________ __________Bk____________________________________Bk______________ ________CVCP________________BkBk________________BkBk____________ ________Bk______________CPCPCPCPBd______________CPBk____________ ______CVBk____________CPCmBkCPBdBkBD______________BkBk_A_A______ ____CVBn______________CPCmBkCPBkBkBdBD___________ACPBkBd_A_A____ ____BkCJ____________CPCmBkCVCPBkBdBnBXAj___A_A_A_A_ACPBk_A_A____ __CVBn____________CPCPCoBkCPCPBkBdCJBdBD_A_A_A_A_A_A_ABkBd_A____ __BkCJ____________CPCmBkCPCPBkCPBdBkBdBD_A_A_A_A_A_ACPBkBk_A____ __CJBnBk________CPCPCoBkCPCPCPBkBkBdBdBDBD_A_A_A_ACPBkBd_A_A____ ____BkBdBkCP____CPCPCmBkCPCPCPBkCPBdBkBkBD_A_ACPCPBDBd_A_A______ ________BkBdCJBkCPCmCoBkCPCPBkBkBkBkBkBdBDCPCPBkBd_A_A_A_A______ ____________BkBkCPCmBkCVCPCPBkCPBkBdBkBkBDBDBdBd_A_A_A_A________ ______________CPCPCoBkCPCPBnCJBnBkBkBkBdBdBDAl_A_A_A_A__________ ______________CPCPCmBkCVCPCJBkBkCPBdBkCPBDBDBD_A_A_A____________ ______________CPCPCoBkCPCPCPBkCPBkBkBkBkBdBDAl_A_A______________ ______________CPCPCmBkCVCPCPBkBkCPBkBkBkBkBDBD_A________________ ______________CPCPCoBkCPCPCPBkCPBkBkBkBkBdBD_A__________________ ______________CPCPCmBkCVCPBnCJBkBnCJBdBnBd_A_A__________________ _______________A_ACoBkCPCPCPBkCPBkBk_A_z_A_A____________________ ___________________A_A_ACPCPBkBk_M_z____________________________ _________________________A_A_A_A________________________________ } # tile 74 (fedora) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________________CFCFBS__BsBsAw____________________________ ______________________CFBsBsBsBsBSAwAw__________________________ ____________________CFCFBsBsBsBsBSBSAw__________________________ ____________________CFBsBsBsBsBsBSBSAwAw________________________ ____________________CFBsBsBsBsBsBSBSBSAw________________________ ________________BS_ACFBsBsBsBsBSBsBSBS_AAw______________________ ____________BSBSBSCF_A_ABsBsBsBSBsBS_ABSAwAwAw__________________ ____________BSBSBSBSCFBs_A_A_A_A_A_ABSAwAwAwAw__________________ _____________ABSBSBSBSBsBsBsBsBSBsBSAwAwAw_A_A__________________ _______________A_ABSBSBSBSBSBSBSBSBSBSBS_A_A____________________ ___________________A_A_ABSBSBSBSBS_A_A_A________________________ _________________________A_A_A_A_A______________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 75 (conical hat / cornuthaum) { ________________________________________________________________ ________________________________Cs______________________________ _____________________________JCsCLCsCLCs________________________ _____________________________ICLBZ__Bb__CL______________________ _____________________________I_H__Cs__Cs__CsCL__________________ ___________________________K_I_H_G__CL__Bb____Cs________________ ___________________________K_I_H_G__Bv____Cs____CL______________ ___________________________J_I_H_G____Cs____CL____Cs____________ _________________________K_J_I_H_G_G__CL______Cs________________ _________________________K_J_I_H_G_G____Cs______________________ _________________________K_J_I_H_H_G____________________________ _______________________K_J_I_I_H_H_G_G__________________________ _______________________K_J_I_I_H_H_G_G_______________A__________ _______________________K_J_I_I_H_H_G_G_____________A_A__________ _____________________K_K_J_I_I_H_HCL_G_G_________A_A_A__________ _____________________K_J_J_I_I_I_HCL_GCL_______A_A_A_A__________ _____________________K_J_J_I_ICrCrCLCL_G_____A_A_A_A_A__________ ___________________K_K_J_J_I_I_ICrCLCL_G_G_A_A_A_A_A____________ ___________________K_K_J_J_I_I_ICr_H_GCL_G_A_A_A_A_A____________ ___________________K_J_J_J_I_ICr_H_H_H_G_G_A_A_A_A_A____________ _________________K_K_J_J_J_I_I_I_H_H_H_G_G_G_A_A_A_A____________ _________________K_K_J_J_J_I_I_I_I_H_H_G_G_G_A_A_A______________ _________________K_KCr_J_I_I_I_I_I_H_H_G_G_G_A_A_A______________ _______________K_K_KCr_J_I_I_I_I_I_H_H_H_G_G_G_A_A______________ _______________K_K_JCr_J_I_I_I_I_I_H_H_H_G_G_G_A_A______________ _____________K_K_K_JCrCr_I_I_I_I_I_H_H_H_G_G_G_G_A______________ _____________K_K_K_J_JCrCr_I_I_I_I_H_H_H_H_G_G_G________________ _______________K_K_J_J_JCrCLCLCL_I_H_H_H_H_G_G__________________ _________________K_J_J_J_I_I_I_I_I_I_H_H_H_G____________________ _______________________J_I_I_I_I_I_I_H__________________________ ________________________________________________________________ ________________________________________________________________ } # tile 76 (conical hat / dunce cap) { ________________________________________________________________ ________________________________Cs______________________________ _____________________________JCsCLCsCLCs________________________ _____________________________ICLBZ__Bb__CL______________________ _____________________________I_H__Cs__Cs__CsCL__________________ ___________________________K_I_H_G__CL__Bb____Cs________________ ___________________________K_I_H_G__Bv____Cs____CL______________ ___________________________J_I_H_G____Cs____CL____Cs____________ _________________________K_J_I_H_G_G__CL______Cs________________ _________________________K_J_I_H_G_G____Cs______________________ _________________________K_J_I_H_H_G____________________________ _______________________K_J_I_I_H_H_G_G__________________________ _______________________K_J_I_I_H_H_G_G_______________A__________ _______________________K_J_I_I_H_H_G_G_____________A_A__________ _____________________K_K_J_I_I_H_HCL_G_G_________A_A_A__________ _____________________K_J_J_I_I_I_HCL_GCL_______A_A_A_A__________ _____________________K_J_J_I_ICrCrCLCL_G_____A_A_A_A_A__________ ___________________K_K_J_J_I_I_ICrCLCL_G_G_A_A_A_A_A____________ ___________________K_K_J_J_I_I_ICr_H_GCL_G_A_A_A_A_A____________ ___________________K_J_J_J_I_ICr_H_H_H_G_G_A_A_A_A_A____________ _________________K_K_J_J_J_I_I_I_H_H_H_G_G_G_A_A_A_A____________ _________________K_K_J_J_J_I_I_I_I_H_H_G_G_G_A_A_A______________ _________________K_KCr_J_I_I_I_I_I_H_H_G_G_G_A_A_A______________ _______________K_K_KCr_J_I_I_I_I_I_H_H_H_G_G_G_A_A______________ _______________K_K_JCr_J_I_I_I_I_I_H_H_H_G_G_G_A_A______________ _____________K_K_K_JCrCr_I_I_I_I_I_H_H_H_G_G_G_G_A______________ _____________K_K_K_J_JCrCr_I_I_I_I_H_H_H_H_G_G_G________________ _______________K_K_J_J_JCrCLCLCL_I_H_H_H_H_G_G__________________ _________________K_J_J_J_I_I_I_I_I_I_H_H_H_G____________________ _______________________J_I_I_I_I_I_I_H__________________________ ________________________________________________________________ ________________________________________________________________ } # tile 77 (dented pot) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________BdBDBDBDBDBDBDBDBDBDBDBD______________________ ______________BdBDBDBDBDBDBDBDBDBDBDBDBDBDBDBD__________________ ____________BdBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBD________________ ____________BdBDBdBDBDBDBDBDBDBDBDBDBDBDBDBDBDBd________________ __________BdBDBdBdBdBdBdBDBDBDBDBDBDBDBDBDBDBdBdBD______________ __________BdBdBdBdBdBdBdBdBdBDBDBDBDBDBDBDBdBdBDBD_A_A_A________ __________BdBkBkBdBJBDBDBdBdBdBdBDBDBDBdBdBdBdBdBD_A_A_A_A______ __________BdBkBkBkBDAlBDBDBdBdBdBdBdBdBdBkBkBkBdBd_A_A_A_A______ __________BdBkBkCPBkBDBDBdBdBkBkBkBkBkBkBkBkBkBkBd_A_A_A________ __________BdBkBkBkCPBkBkBkBkBkBkBkBkBkBkBkCPBkBkBd_A_A__________ __________BdBkBkCPBkBkCPCPBkBkCPBkBkBkCPBkBkBkBkBd_A____________ __________BdBkBnBkCJBnCJBnCJBnBkCJBnCJBkBkBkBkBk_ABk____________ ________Bk_ABkBkCOBlBkCPCPBkBkCJBnBkBnCJBnBkBk_A_A__Bk__________ ______Bk_A____CJBlBmCJBnCJBnCJBnBkCJBkBnCJBk_ABk__Bk_A__________ _______ABk__Bk_L_zBlBkCPCPCJBMCJBkBnCJBk_A_A_A_ABk_A____________ _________ABk_A_A_A_A_A_A_A_A_M_A_A_A_A_M_A_____A_A______________ ___________A_A__________________________________________________ } # tile 78 (plumed helmet / helmet) { __________________CvCvCvCvBS____________________________________ ____________________Cv__CvBS____________________________________ ______________________CvCvCvBS__________________________________ ______________________Cv__CvBS__________________________________ ________________________Cv__BS__________________________________ __________________________CvCvBS________________________________ __________________________CvCvBS________________________________ ____________________________CvBS________________________________ ____________________________CvBS________________________________ ______________________________BSAe______________________________ ________________________BdBdBdBSAeAeAeAe________________________ ____________________BdBdBkBdBdBSBJAeAeAeAeAe____________________ __________________BdBkBkBkCPBDBSBSAeAjBJAeAeAe__________________ ________________BdBkBdCPBkBdBdBdBSBJAeAeAlAeAe__________________ ______________BdBkBkBkBkBdBdBdBdBSAlBDAeBDAeAeAe_A_A_A_A________ ______________BdBnBdCJBnBdBdBdBdBSBDAlAeAlAeAeAe_A_A_A_A_A______ ______________BdCJBdBkCJBdBdBdBdAlBDAlBDAeBJ_AAe_A_A_A_A_A_A____ ____________BdBdBkBkBkBnBdBdBdBdBDAlBDAlAeAj_AAe_A_A_A_A_A_A____ ____________BdBkBkBk_MCJBdBdBdBdAlBDAlBDAe_A_AAe_A_A_A_A_A_A____ ____________BkBkBkBk_A_A_ABdBdBdAjBJAjBJ_A_A_AAe_A_A_A_A_A_A____ ____________BdBkBkBk_M_A_A_A_ABJAlBDAl_A_A_A_AAe_A_A_A_A_A______ ____________BdBnBdCJ_A_A_A_A_A_AAjBJ_A_A_A_A_AAe_A_A_A_A_A______ ____________BdBkBdBn_A_A_A_A_A_ABJAl_B_A_A_AAeAe_A_A_A_A________ ____________BdCJBdBkBd_A_A_A_A_BAlBD_A_A_ABJAeAe_A_A_A_A________ ____________BdBnBdCJBnBd_A_A_A_A_A_A_A_AAeAjAeAe_A_A_A__________ _____________zBkBdBkBkBdBdBJ_A_A_A_A_A_AAeBJAeAe_A_A_A__________ _____________A_ABkBkCPBdBdBd_A_A_A_A_A_AAeAlAe_A_A_A____________ _____________A_ABdCJBkBdBdBd_A_A_A_A_A_AAeBDAe_A_A______________ _______________A_A_MBkBkBdBd_A_A_A_A_A_AAeAl_A_A________________ _________________A_A_ABDAlBJ_A_A_A_A_A_A_A_A_A__________________ _____________________A_A_A_A_A__________________________________ ________________________________________________________________ } # tile 79 (etched helmet / helm of brilliance) { ________________________________________________________________ __________________________BkCPBdBdBJAe__________________________ ______________________BdBkCVBkBdBdAjAlAeAe______________________ __________________AjBjBlCPCOBlBdBdBJAeBJAeAeAe__________________ ________________BdBJBkCPCPBkCOBdBdAjAlAeBDAeAeAe________________ ________________BdBdBDCPCPBlBdBdBdBdBDAeAeAlAeAeAe______________ ______________BdBdBkBkCVBkCOBdBdBdBdAeAlAeBDABABAeAe____________ ______________BdBdBDCPCOBkBlBdBdBdAeAlBDAeABBJAeABAe____________ ______________BdBkBkBlCPBDBkBdBdBJBdBdAeAlAeAeAjABAeAe__________ ____________BdBkBkCVCPBJBkAjBJAeBdBdAeBDBJAjAeBJAeABAe__________ ____________BdABABCPCPBJBlCJBdBdBdAlBdAlBDAlABABAeABAe__________ ____________BdABABABCPBkBJBmBdBdAeBdBdBDABABABABAeABAeAe________ ____________BkABABABABBlBkBDBdAeBdBdABABABABABABAeABAeAe________ __________BdBnABABABABABCPBkAeBdBdABABABABABABABAeABAeAe________ __________BdCJABABABABABABBkBdBdABABABABABABABABAeABAeAB________ __________BdBkCPABABABABABABABABABABABABABABAeBJABAeABAe________ __________AeBnCPCPABABABABABABABABABABABAlBDAeABAeAeABAe________ __________BdBJCPCPBkABABABABABABABABABAjBJAeABAlAeABAe_A________ __________BdBkBdCPCJBnAKABABABABABABBdBJAeAlAeBDABAeAe_A________ __________AlBkCPBdBnBkBdABABABABABBdBdAeAlBDAeABAeAe_A_A________ __________BdBDCPCPBJBkBdABABABABBdBdAeBDAlAeABAlAe_A_A_A________ ___________ABkBdCPBkBDBdABABABABBdAeBdAlAeBDAeBD_A_A_A_A________ ___________A_ACPBdBkCKAlABABABABAeBdBdAeBDAlAe_A_A_A_A__________ _____________A_ACPBDBmBd_A_A_A_ABdBdAeBDAl_A_A_A_A_A____________ _______________A_ABkBDBd_A_A_A_ABdAeBdAl_B_A_A_A________________ _________________A_BBkBJ_A_A_A_AAeBd_A_A_A_A_A__________________ ___________________A_ABd_A_A_A_ABd_A_A_A_A_A____________________ _____________________A_A_________A_A_A_A________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 80 (crested helmet / helm of opposite alignment) { ________________________________________________________________ ________________________________________________________________ ______________________________________________BkBkBkBkBDBD______ ______________________________________BkBkBkBkBDBkBkBDBD________ __________________________________BkBkBDBkBkBDBkBkBDBD__________ ________________________________BkBkBkBDBkBDBkBkBDBD____________ ____________________________BkBkBDBkBDBkBkBDBkBkBDBD____________ __________________________BkBDBkBDBkBDBkBDBkBkBDBD______________ ________________________BkBkBDBkBDBkBDBkBDBkBkBDBD______________ ______________________BkBDBkBDBkBkBkBkBkBDBkBDBDBd______________ ______________________BkBDBkBkBkBkCPCPBkBkBkBDBDBdBd____________ ____________________BkBkBDBkBkBkCPBkBkBkCPBkBDBDBdBd____________ ____________________BkBkBkBkCPCPCPBkCPBkBkCPBkBkBdBdBd__________ __________________BkBkBdCPBkBnCJBkBnBkCJBnBkBkBkBkBdBd__________ ________________BkBkBkBkBkCPCPCPBkCJBnBkCJBkBnBkBkBdBd__________ ________________BkBkBkBkCPBnCJBkBkBnBkCJBnBkCJBkBkBdBd__________ ________________BkBkBkCPCJCPBkBkAB_zAB_MCJBnBkBkBkAOBd__________ ______________BkBkBkBnCJBnCPBkBk_MAA_M_MABABABAOAOAOBd__________ ______________BkBkBkCJBnCPCJBnBkA__MA_AAABABABAOAOAOBd__________ ______________BkBkBkBnCJCPBkBkBk_MAA_M_MABABABAOAOAOBd__________ ______________BkBkCJCPBnCPBkBkBk_$_OA_AAABABABAOAOAOBd_A_A_A_A__ ______________BkBkBnCJCPBkBkBkAB_MAK_M_MABABABAOAOAOBd_A_A_A_A__ ______________BkBkBkCPBnCJBkBk_M_z_M_$ABABABABAOAOAOBd_A_A_A_A_A ____________BkBkCJBnCJCPBkBkBkAK_MAB_M_MABABABAOAOAOBd_A_A_A_A_A ____________BkBkBkBnCPBnCJBkBk_M_zAB_zABABABABAOAOAOBd_A_A_A_A_A ____________BkBkBnCJCPBkBkBkBk_MAB_M_M_zABABABAOAOAOBd_A_A_A_A_A ___________ABkBkBkCPCJBnCJBkBk_M_$_MAK_MABABABAOAOAOBd_A_A_A_A__ ___________A_ABkCJBnCPBkBkBk_A_A_A_A_A_A_A_A_AAOAOAOBd_A_A_A_A__ _____________A_ABkCPCJBnBkBk_A_A_A_A_A_A_A_A_A_A_AAOBd_A_A_A____ _______________A_A_ACPBkBkBk_A_A_A_A_A_A_A_A_A_A_A_ABd_A_A_A____ ___________________A_A_ABkBk_A_A_A___________A_A_A_ABd_A_A______ ________________________________________________________________ } # tile 81 (visored helmet / helm of telepathy) { __________________________CBCBCB________________________________ ______________________________CBCB______________________________ ____________________________CBCBCB______________________________ ______________________________CBCB______________________________ ____________________________BdCBBJAj____________________________ __________________________BdBdBdBDAlBJ__________________________ ________________________BdBdBdBdAlBDAlBD________________________ ______________________BdBdBdAeAeAeAeAeBDAl______________________ ____________________BdBdAeAeBdBdBJAlAjAeBJAj____________________ __________________BdBdAeBdBd_ABd_ABD_zAlAeAlBJ__________________ ________________BdBdAeBd_ABd_ABd_AAl_BBJBDAeAjBJ________________ ______________BdBdAeBdBd_ABd_ABd_ABJ_BAl_ABJAeAl________________ ____________BJBdAeBd_ABd_ABd_ABd_AAj_ABD_AAlBDAeBD______________ ____________AjAeBdBd_ABd_ABd_ABd_ABJ_AAl_ABD_AAlAeAl____________ ____________BJAeBdBd_ABd_ABd_ABd_AAl_BBJ_AAl_BBJAeAB____________ ____________AlAeBdBd_ABd_ABd_ABd_ABD_AAj_BBJ_AAjABAB____________ ______________BDAeBdBdBd_ABd_ABd_AAl_ABJ_AAjBJABAB_A_A_A_A______ ________________AlAeAeBdBdBd_ABd_ABJ_BAlBJABABAB_A_A_A_A_A_A_A__ __________________BDAlAeAeBdBdBd_AAjBJABABABAB_A_A_A_A_A_A_A_A__ ____________________BJAjBJAeAeBdBJABABABABAB_A_A_A_A_A_A_A_A_A_A ____________________AlBDAlBDAlAeABABABABABAB_A_A_A_A_A_A_A_A_A_A __________________BdBdAlBDAlBJAjAeABABABABAe_A_A_A_A_A_A_A_A_A_A ________________BdBdBkBkBdBDAlBDAeABABAeAeBJAe_A_A_A_A_A_A_A_A__ ______________BdBkBdBdBdBkBdBdAlAeAeAeAlAeAeAeAe_A_A_A_A_A_A_A__ _______________ABkBdBdBdBdBdBlBjBDAlAeAeAeAeAeBJAe_A_A_A_A_A____ _______________A_ABkBkBdBdBdBdBdBDAeAeAeAeAeAeAe_A_A_A_A_A______ _________________A_ABdBdBdBdBdBdAlAeAeAeAeBDAe_A_A_A_A__________ ___________________A_ABkBkBdBdBdBDAeAeAeAeAe_A_A_A______________ _____________________A_ABdBdBkBdAlAeBDAeAe_A_A_A________________ _______________________A_A_ABdBdBDAeAe_A_A_A____________________ _________________________A_A_A_A_A_A_A_A________________________ ________________________________________________________________ } # tile 82 (gray dragon scale mail) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ BdBdBdBdBdBJ________________________________________BdBdBdBJAjBJ ___A_ABdBkBdAjBJAl____________________________BdBdBdBdBJAl_B_A__ _____A_ABkBkBdBdBJAjBJ____________________BdBdBdBdBdBJAj_A______ _______A_ABdBkBdBdBdAlBD________________BdBdBkBkBkAlBD_A________ _________ABdBkBlBdBdBdBDAl____________AlBkBkBdBkAlBDAl__________ _________A_A_A_ABdBdBdBdBJAj_A_A_A_ABJBdBdBdBkAl________________ ________________AlBJBdBdBdBd_A_A_A_AAjBdBdBdBD__________________ __________________BdAjBdBdBkBd_A_ABkBdBJAjAlBd__________________ __________________BkBdAlCKBkBdBDBkCPBdAlCKBkBd__________________ __________________CKBdBJBmBlBjAlBkBkBdBDBmCJBd__________________ __________________BmBdAlBkBkBdBDBkBlBdBJBdBlBd__________________ ____________________BdBlBjBDBdBkBdBJBdBkBdBJ_A_______A_A_A_A_A__ ____________________COBkBdAlCPBkBdBJBnBkBdAj_A_A_A_A_A_A_A_A_A_A ____________________BlBkBkAlBkCPBdAlCJBlBjBJ_A_A_A_A_A_A_A_A_A__ ____________________BkBkBdBDBdBkBdAjBkBkBdAj_A_A_A_A_A_A_A______ ____________________CCCCBJAlBDBdBdBJAlBDBOBO_A_A_A_A_A_A________ ____________________CCCCCCBpBpCjCjBpBpBOBOBO_A_A_A_A_A_A________ ________________BkBkBkBdCCBpBpCjCjBpBpBOBkBdBJAj_A_A_A_A________ ____________CPBkBdBkAlBJ_A_zBmBjBkBJ_A_ACPBkBdBdAlBJ_A_A________ __________BkBkBkBdBJAj_A_A_ABlBdBdBJ_A_A_ABkCPBdBdAjBJ_A________ ________BkCPBdBdAj_A_A_A_BBmCJBdBdAjBJ_A_A_A_ABdBdBdAlBJ_A______ ________BkBdBJ_A_A_A_A_A_ABkBlBdBdAlBD_A_A_A_A_A_ABdBdAj_A_A____ ______CPBk_A_A_A_A_______A_ACOBdBdBJ_A_A_A_A_A_A_A_A_BAlBJ_A____ ______Bk_A_A_______________ABkBdBdAj_A_A_A_A___________ABD_A____ _____________________________BBdBd_A_A_A________________________ ______________________________BdBd_A____________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 83 (silver dragon scale mail) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ BdCJBnBkBdBk________________________________________BdBdBdBJAjBJ ___A_ABdC$BdBkCPAl____________________________BdBkBkCPAlBD_A_A__ _____A_ABdCoBdBkCPAjBJ____________________BdBkCJBnBdBJAl_A______ _______A_ABkC$CPBkCPBkBD________________BdBdCmC$BdAlBD_A________ _________ABdBdC$CPBkCVBkAl____________BJBdC$BkBdAlBDAl__________ _________A_A_A_ABdBkCPCPBDBJ_A_A_A_AAlBdBkBnBdBD________________ ________________AlBDBDBdCPBd_A_A_A_ABDBkBkBdBJ__________________ __________________BdBJBdBdBkBd_A_ABkBdAlBDBJBd__________________ __________________C$BdBDBkC$BdBDBkC$BdBJC$BkBd__________________ __________________BkBdAlBlCmBdBJBkCoBdAjCmBkBd__________________ __________________BlBdBJBkBkBdAjBkBkBdBJBjBlBd__________________ ____________________BdBkBdBJBdBkBdBDBdBkBdBJ_A_______A_A_A_A_A__ ____________________BkC$BdBDBkC$BdBDBkC$BdAj_A_A_A_A_A_A_A_A_A_A ____________________COCmBdAjCJCmBdAlBlCmBdBJ_A_A_A_A_A_A_A_A_A__ ____________________BKBkBdBJBdBlBdBJBLCJBdAl_A_A_A_A_A_A_A______ ____________________CCCCBDAlBDBdBdAjBJAjBOBO_A_A_A_A_A_A________ ____________________CCCCCCBpBpCjCjBpBpBOBOBO_A_A_A_A_A_A________ ________________BkBmBdBdCCBpBpCjCjCCBpBOBkBkBJAj_A_A_A_A________ ____________BkC$BdBxAlBJ_A_zBmBkCPBJ_A_MBkC$BdBdAlBJ_A_A________ __________CmC$BkBnAlBD_A_A_AC$BkCPAj_A_A_zBkC$BkBkAjBJ_A________ ________C$BkBkBkBJ_A_A_A_BBkC$BkCVAlBJ_A_A_A_ACPBkBdAlBJ_A______ ________BkBkBJ_A_A_A_A_A_ABkC$BkCVBJAj_A_A_A_A_A_ABlBdAj_A_A____ ______CPBk_A_A_A_A_______A_ACoBlCPAl_A_A_A_A_A_A_A_A_zAlBJ_A____ ______Bk_A_A_______________ABkCOCPBD_A_A_A_A___________ABD_A____ _____________________________ABdCP_A_A_A________________________ ______________________________BdCP_A____________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 84 (shimmering dragon scale mail) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ CnCnCiCkCtBj________________________________________ClCtCiCTCTCJ ___A_zCtCtCRBLBMBM____________________________BnBmCWClCOCT_A_A__ _____A_ACRBmBnBnBnBMBM____________________BnBhBIBnBmBjCO_A______ _______A_ABmCSBIBIBnBKBK________________BlBnCVCSBnBLBL_L________ _________ABnBnCSBIBlBlBKBx____________BxBlBnBnBhBFBLBL__________ _________A_A_A_ABnBlBlCKCKCK_A_A_A_ABxCKBlBlBnBF________________ ________________BKBKCKChChCh_A_A_A_ACKChCKBlBK__________________ __________________BlBxChChCtCl_A_ACVBhBxBxBKCK__________________ __________________CXCdCTCtCtClBLCRBIBhBMBlCQCK__________________ __________________ChCnCTCtCtClBLBmCSBhBMCQBlCK__________________ __________________CiCdCTCkCtClBLBnBnBhBMBKCQCK__________________ ____________________CnCiCkCOClCRBnBMBhCVBlBK_A_______A_A_A_A_A__ ____________________CgCXCkCOClBmBnBMCSBhBlBK_A_A_A_A_A_A_A_A_A_A ____________________CnClCsCOClCRBnBMCSCVBlBK_A_A_A_A_A_A_A_A_A__ ____________________CdCXCkCOClBmBnBMBhBIBlBK_A_A_A_A_A_A_A______ ____________________CoChCJCOBkCRBnBMBnBMBuBu_A_A_A_A_A_A________ ____________________ChCoChChCe_y_oCeCeBuBuBu_A_A_A_A_A_A________ ________________CtCXCdCgChCeCe_o_kChCeCHCgCnCJCO_A_A_A_A________ ____________BICWClCtCnCT_zA_CiCnCdCT_B_zCnClCkClBmBL_A_A________ __________CQCSBnBmCOCJ_A_A_ACiCdCnCn_A_A_zClCtBnBmBMBM_A________ ________ChBlBnBIBM_A_A_A_ACtClCnCiCJCO_A_A_z_ACRBnBIBnBM_A______ ________ChChBK_A_A_A_A_A_AClCtCtClCOBj_L_A_A_A_A_ABhCQBK_A_A____ ______ChCo_A_A_A_A_______A_MBmCRCWBL_A_A_A_A_A_A_A_A_ABKBx_A____ ______Co_z_B_______________ACVBnBnBF_A_A_A_A___________ACK_A____ _____________________________ABhBI_A_A_A________________________ ______________________________BlBl_A____________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 85 (red dragon scale mail) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ CBCBCBCBCBBo________________________________________CBCBCBBoBoBo ___A_ACBCuCBBoBoBo____________________________CBCBCBCBBoBo_A_A__ _____A_ACBCuCBCBBoBoBo____________________CBCBCBCBCBBoBo_A______ _______A_ACBCuCBCBCBBoBo________________CBCBCuCuCBBoBo_A________ _________ACBCBCuCBCBCBBoBo____________BoCBCuCBCBBoBoBo__________ _________A_A_A_ACBCBCBCBBoBo_A_A_A_ABoCBCBCBCBBo________________ ________________BoBoCBCBCBCB_A_A_A_ABoCBCBCBBo__________________ __________________CBBoCBCBCuCB_A_ACuCBBoBoBoCB__________________ __________________CuCBBoCuCuCBBoCuCuCBBoCuCuCB__________________ __________________CuCBBoCuCuCBBoCuCuCBBoCuCuCB__________________ __________________CuCBBoCBCuCBBoCBCuCBBoCBCuCB__________________ ____________________CBCuCBBoCBCuCBBoCBCuCBBo_A_______A_A_A_A_A__ ____________________CuCuCBBoCuCuCBBoCuCuCBBo_A_A_A_A_A_A_A_A_A_A ____________________CuCuCBBoCuCuCBBoCuCuCBBo_A_A_A_A_A_A_A_A_A__ ____________________CBCuCBBoCBCuCBBoCBCuCBBo_A_A_A_A_A_A_A______ _____________________K_KBoBoBoCBCBBoBoBo_G_G_A_A_A_A_A_A________ _____________________K_K_K_I_ICjCj_I_I_G_G_G_A_A_A_A_A_A________ ________________CuCuCBCB_K_I_ICjCj_I_I_GCuCBBoBo_A_A_A_A________ ____________CuCuCBCBBoBo_A_ACuCECYBo_A_ACuCuCBCBBoBo_A_A________ __________CuCuCBCBBoBo_A_A_ACuCBCBBo_A_A_ACuCuCBCBBoBo_A________ ________CuCuCBCBBo_A_A_A_ACuCuCBCBBoBo_A_A_A_ACBCBCBBoBo_A______ ________CuCBBo_A_A_A_A_A_ACuCuCBCBBoBo_A_A_A_A_A_ACBCBBo_A_A____ ______CuCu_A_A_A_A_______A_ACuCBCBBo_A_A_A_A_A_A_A_A_ABoBo_A____ ______Cu_A_A_______________ACuCBCBBo_A_A_A_A___________ABo_A____ _____________________________ACBCB_A_A_A________________________ ______________________________CBCB_A____________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 86 (white dragon scale mail) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ CmCmCmCmCmCP________________________________________CmCmCmCPCPCP ___A_ACmC$CmCPCPCP____________________________CmCmCmCmCPCP_A_A__ _____A_ACmC$CmCmCPCPCP____________________CmCmCmCmCmCPCP_A______ _______A_ACmC$CmCmCmCPCP________________CmCmC$C$CmCPCP_A________ _________ACmCmC$CmCmCmCPCP____________CPCmC$CmCmCPCPCP__________ _________A_A_A_ACmCmCmCmCPCP_A_A_A_ACPCmCmCmCmCP________________ ________________CPCPCmCmCmCm_A_A_A_ACPCmCmCmCP__________________ __________________CmCPCmCmC$Cm_A_AC$CmCPCPCPCm__________________ __________________C$CmCPC$C$CmCPC$C$CmCPC$C$Cm__________________ __________________C$CmCPC$C$CmCPC$C$CmCPC$C$Cm__________________ __________________C$CmCPCmC$CmCPCmC$CmCPCmC$Cm__________________ ____________________CmC$CmCPCmC$CmCPCmC$CmCP_A_______A_A_A_A_A__ ____________________C$C$CmCPC$C$CmCPC$C$CmCP_A_A_A_A_A_A_A_A_A_A ____________________C$C$CmCPC$C$CmCPC$C$CmCP_A_A_A_A_A_A_A_A_A__ ____________________CmC$CmCPCmC$CmCPCmC$CmCP_A_A_A_A_A_A_A______ _____________________k_kCPCPCPCmCmCPCPCP_a_a_A_A_A_A_A_A________ _____________________k_k_k_f_fCuCu_f_f_a_a_a_A_A_A_A_A_A________ ________________C$C$CmCm_k_f_fCuCu_f_f_aC$CmCPCP_A_A_A_A________ ____________C$C$CmCmCPCP_A_AC$CmCmCP_A_AC$C$CmCmCPCP_A_A________ __________C$C$CmCmCPCP_A_A_AC$CmCmCP_A_A_AC$C$CmCmCPCP_A________ ________C$C$CmCmCP_A_A_A_AC$C$CmCmCPCP_A_A_A_ACmCmCmCPCP_A______ ________C$CmCP_A_A_A_A_A_AC$C$CmCmCPCP_A_A_A_A_A_ACmCmCP_A_A____ ______C$C$_A_A_A_A_______A_AC$CmCmCP_A_A_A_A_A_A_A_A_ACPCP_A____ ______C$_A_A_______________AC$CmCmCP_A_A_A_A___________ACP_A____ _____________________________ACmCm_A_A_A________________________ ______________________________CmCm_A____________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 87 (orange dragon scale mail) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ CFCFCFCFCFBs________________________________________CFCFCFBsBsBs ___A_ACFCzCFBsBsBs____________________________CFCFCFCFBsBs_A_A__ _____A_ACFCzCFCFBsBsBs____________________CFCFCFCFCFBsBs_A______ _______A_ACFCzCFCFCFBsBs________________CFCFCzCzCFBsBs_A________ _________ACFCFCzCFCFCFBsBs____________BsCFCzCFCFBsBsBs__________ _________A_A_A_ACFCFCFCFBsBs_A_A_A_ABsCFCFCFCFBs________________ ________________BsBsCFCFCFCF_A_A_A_ABsCFCFCFBs__________________ __________________CFBsCFCFCzCF_A_ACzCFBsBsBsCF__________________ __________________CzCFBsCzCzCFBsCzCzCFBsCzCzCF__________________ __________________CzCFBsCzCzCFBsCzCzCFBsCzCzCF__________________ __________________CzCFBsCFCzCFBsCFCzCFBsCFCzCF__________________ ____________________CFCzCFBsCFCzCFBsCFCzCFBs_A_______A_A_A_A_A__ ____________________CzCzCFBsCzCzCFBsCzCzCFBs_A_A_A_A_A_A_A_A_A_A ____________________CzCzCFBsCzCzCFBsCzCzCFBs_A_A_A_A_A_A_A_A_A__ ____________________CFCzCFBsCFCzCFBsCFCzCFBs_A_A_A_A_A_A_A______ ____________________CuCuBsBsBsCFCFBsBsBsCBCB_A_A_A_A_A_A________ ____________________CuCuCuCYCpCjCjCYCYCBCBCB_A_A_A_A_A_A________ ________________CzCzCFCFCuCYCYCjCjCpCYCBCzCFBsBs_A_A_A_A________ ____________CzCzCFCFBsBs_A_ACzCFCcBs_A_ACzCzCFCFBsBs_A_A________ __________CzCzCFCFBsBs_A_A_ACzCFCFBs_A_A_ACzCzCFCFBsBs_A________ ________CzCzCFCFBs_A_A_A_ACzCzCFCFBsBs_A_A_A_ACFCFCFBsBs_A______ ________CzCFBs_A_A_A_A_A_ACzCzCFCFBsBs_A_A_A_A_A_ACFCFBs_A_A____ ______CzCz_A_A_A_A_______A_ACzCFCFBs_A_A_A_A_A_A_A_A_ABsBs_A____ ______Cz_A_A_______________ACzCFCFBs_A_A_A_A___________ABs_A____ _____________________________ACFCF_A_A_A________________________ ______________________________CFCF_A____________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 88 (black dragon scale mail) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ AOAOAOAOAOAB________________________________________AOAOAOABABAB ___A_AAOAlAOABABAB____________________________AOAOAOAOABAB_A_A__ _____A_AAOAlAOAOABABAB____________________AOAOAOAOAOABAB_A______ _______A_AAOAlAOAOAOABAB________________AOAOAlAlAOABAB_A________ _________AAOAOAlAOAOAOABAB____________ABAOAlAOAOABABAB__________ _________A_A_A_AAOAOAOAOABAB_A_A_A_AABAOAOAOAOAB________________ ________________ABABAOAOAOAO_A_A_A_AABAOAOAOAB__________________ __________________AOABAOAOAlAO_A_AAlAOABABABAO__________________ __________________AlAOABAlAlAOABAlAlAOABAlAlAO__________________ __________________AlAOABAlAlAOABAlAlAOABAlAlAO__________________ __________________AlAOABAOAlAOABAOAlAOABAOAlAO__________________ ____________________AOAlAOABAOAlAOABAOAlAOAB_A_______A_A_A_A_A__ ____________________AlAlAOABAlAlAOABAlAlAOAB_A_A_A_A_A_A_A_A_A_A ____________________AlAlAOABAlAlAOABAlAlAOAB_A_A_A_A_A_A_A_A_A__ ____________________AOAlAOABAOAlAOABAOAlAOAB_A_A_A_A_A_A_A______ ____________________CBCBABABABAOAOABABABBNBN_A_A_A_A_A_A________ ____________________CBCBCBBoBoCjCjBoBoBNBNBN_A_A_A_A_A_A________ ________________AlAlAOAOCBBoBoCjCjCBBoBNAlAOABAB_A_A_A_A________ ____________AlAlAOAOABAB_A_AAlAeAdAB_A_AAlAlAOAOABAB_A_A________ __________AlAlAOAOABAB_A_A_AAlAOAOAB_A_A_AAlAlAOAOABAB_A________ ________AlAlAOAOAB_A_A_A_AAlAlAOAOABAB_A_A_A_AAOAOAOABAB_A______ ________AlAOAB_A_A_A_A_A_AAlAlAOAOABAB_A_A_A_A_A_AAOAOAB_A_A____ ______AlAl_A_A_A_A_______A_AAlAOAOAB_A_A_A_A_A_A_A_A_AABAB_A____ ______Al_A_A_______________AAlAOAOAB_A_A_A_A___________AAB_A____ _____________________________AAOAO_A_A_A________________________ ______________________________AOAO_A____________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 89 (blue dragon scale mail) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ _I_I_I_I_I_H_________________________________________I_I_I_H_H_H ___A_A_I_K_I_H_H_H_____________________________I_I_I_I_H_H_A_A__ _____A_A_I_K_I_I_H_H_H_____________________I_I_I_I_I_H_H_A______ _______A_A_I_K_I_I_I_H_H_________________I_I_K_K_I_H_H_A________ _________A_I_I_K_I_I_I_H_H_____________H_I_K_I_I_H_H_H__________ _________A_A_A_A_I_I_I_I_H_H_A_A_A_A_H_I_I_I_I_H________________ _________________H_H_I_I_I_I_A_A_A_A_H_I_I_I_H__________________ ___________________I_H_I_I_K_I_A_A_K_I_H_H_H_I__________________ ___________________K_I_H_K_K_I_H_K_K_I_H_K_K_I__________________ ___________________K_I_H_K_K_I_H_K_K_I_H_K_K_I__________________ ___________________K_I_H_I_K_I_H_I_K_I_H_I_K_I__________________ _____________________I_K_I_H_I_K_I_H_I_K_I_H_A_______A_A_A_A_A__ _____________________K_K_I_H_K_K_I_H_K_K_I_H_A_A_A_A_A_A_A_A_A_A _____________________K_K_I_H_K_K_I_H_K_K_I_H_A_A_A_A_A_A_A_A_A__ _____________________I_K_I_H_I_K_I_H_I_K_I_H_A_A_A_A_A_A_A______ ____________________CBCB_H_H_H_I_I_H_H_HBNBN_A_A_A_A_A_A________ ____________________CBCBCBBoBoCjCjBoBoBNBNBN_A_A_A_A_A_A________ _________________K_K_I_ICBBoBoCjCjCBBoBN_K_I_H_H_A_A_A_A________ _____________K_K_I_I_H_H_A_L_K_I_I_H_A_A_K_K_I_I_H_H_A_A________ ___________K_K_I_I_H_H_A_A_A_K_I_I_H_L_A_A_K_K_I_I_H_H_A________ _________K_K_I_I_H_A_A_A_A_K_K_I_I_H_H_A_A_A_A_I_I_I_H_H_A______ _________K_I_H_A_A_A_A_A_A_K_K_I_I_H_H_A_A_A_A_A_A_I_I_H_A_A____ _______K_K_A_A_A_A_______A_A_K_I_I_H_A_A_A_A_A_A_A_A_A_H_H_A____ _______K_A_A_______________A_K_I_I_H_A_A_A_A___________A_H_A____ _____________________________A_I_I_A_A_A________________________ _______________________________I_I_A____________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 90 (green dragon scale mail) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ _m_m_m_m_m_h_________________________________________m_m_m_h_h_h ___A_A_m_t_m_h_h_h_____________________________m_m_m_m_h_h_A_A__ _____A_A_m_t_m_m_h_h_h_____________________m_m_m_m_m_h_h_A______ _______A_A_m_t_m_m_m_h_h_________________m_m_t_t_m_h_h_A________ _________A_m_m_t_m_m_m_h_h_____________h_m_t_m_m_h_h_h__________ _________A_A_A_A_m_m_m_m_h_h_A_A_A_A_h_m_m_m_m_h________________ _________________h_h_m_m_m_m_A_A_A_A_h_m_m_m_h__________________ ___________________m_h_m_m_t_m_A_A_t_m_h_h_h_m__________________ ___________________t_m_h_t_t_m_h_t_t_m_h_t_t_m__________________ ___________________t_m_h_t_t_m_h_t_t_m_h_t_t_m__________________ ___________________t_m_h_m_t_m_h_m_t_m_h_m_t_m__________________ _____________________m_t_m_h_m_t_m_h_m_t_m_h_A_______A_A_A_A_A__ _____________________t_t_m_h_t_t_m_h_t_t_m_h_A_A_A_A_A_A_A_A_A_A _____________________t_t_m_h_t_t_m_h_t_t_m_h_A_A_A_A_A_A_A_A_A__ _____________________m_t_m_h_m_t_m_h_m_t_m_h_A_A_A_A_A_A_A______ ____________________CuCu_h_h_h_m_m_h_h_hBNBN_A_A_A_A_A_A________ ____________________CuCuCuCBCBCjCjCBCBBNBNBN_A_A_A_A_A_A________ _________________t_t_m_mCuCBCBCjCjCYCBBN_t_m_h_h_A_A_A_A________ _____________t_t_m_m_h_h_A_A_t_q_m_l_A_A_t_t_m_m_h_h_A_A________ ___________t_t_m_m_h_h_A_A_A_t_m_m_h_A_A_A_t_t_m_m_h_h_A________ _________t_t_m_m_h_A_A_A_A_t_t_m_m_h_h_A_A_A_A_m_m_m_h_h_A______ _________t_m_h_A_A_A_A_A_A_t_t_m_m_h_h_A_A_A_A_A_A_m_m_h_A_A____ _______t_t_A_A_A_A_______A_A_t_m_m_h_A_A_A_A_A_A_A_A_A_h_h_A____ _______t_A_A_______________A_t_m_m_h_A_A_A_A___________A_h_A____ _____________________________A_m_m_A_A_A________________________ _______________________________m_m_A____________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 91 (yellow dragon scale mail) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ CMCMCMCMCMBy________________________________________CMCMCMByByBy ___A_ACMCjCMByByBy____________________________CMCMCMCMByBy_A_A__ _____A_ACjCjCMCMByByBy____________________CMCMCMCMCMByBy_A______ _______A_ACMCjCMCMCMByBy________________CMCMCjCjCMByBy_A________ _________ACMCjCjCMCMCMByBy____________ByCMCjCMCjByByBy__________ _________A_A_A_zCMCMCMCMByBy_A_A_A_AByCMCMCMCMBy________________ ________________ByByCMCMCMCM_A_A_A_AByCMCMCMBy__________________ __________________CMByCMCMCjCM_A_ACjCMByByByCM__________________ __________________CjCMByCjCjCMCMCjCjCMCMCjCjCM__________________ __________________CjCjByCjCjCjByCjCjCjByCjCjCj__________________ __________________CjCMByCjCjCMByCjCjCMByCjCjCM__________________ ____________________CMCjCMByCMCjCMByCMCjCMBy_z_______A_A_A_A_A__ ____________________CjCjCMCMCjCjCMCMCjCjCMBy_A_A_A_A_A_A_A_A_A_A ____________________CjCjCjByCjCjCjByCjCjCjBy_A_A_A_A_A_A_A_A_A__ ____________________CjCjCMByCjCjCMByCjCjCMBy_A_A_A_A_A_A_A______ ____________________CzCzByByByCMCMByByByBiBS_A_A_A_A_A_A________ ____________________CzCzCzCFCFCuCuCFCFBSBSBS_A_A_A_A_A_A________ ________________CjCjCMCMCzCFCFCuCuCFCFBSCjCMByBy_A_A_A_A________ ____________CjCjCMCjByBy_A_LCjCMCMBy_AAACjCjCMCMByBy_A_A________ __________CjCjCjCMByBy_A_A_ACjCjCMBy_A_A_zCjCjCMCMByBy_A________ ________CjCjCMCMBy_A_A_L_zCjCjCMCMByBy_A_z_N_zCMCMCMByBy_A______ ________CjCjBy_A_A_A_A_A_ACjCjCjCMByBy_A_A_A_A_A_ACMCMBy_A_A____ ______CjCj_A_A_A_A_______AAACjCMCMBy_A_A_A_A_A_A_A_A_AByBy_A____ ______CjAA_A_______________ACjCjCMBy_A_A_A_A___________ABy_A____ _____________________________ACMCM_A_A_A________________________ ______________________________CMCM_A____________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 92 (gray dragon scales) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________BkCPBkBkBd_A____________ ____________________________________BkBnCJBkBkBdBd_A____________ ____________________________________CJBkBdBdBdBdBd_A____________ ____________________________________BdBdBdBdBdBJAj_A____________ ________________________________BdBdBdBdAjBJAj_A_A_A_A__________ __________________BkBkCPBkBdBkBkCPBDBkCPAlBJAlCJ_BBk_A_A________ ________________BkCPBkBdBdBkBkCPBkBkBdBdBdBkBlBmCKBmBd_A_A______ ______________BkCPBDBdBdBdBdBkBkBkBkBdBdBdCJBnBdBdBdBdBd_A______ ______________BdBdBdBdBdAjBJBkBdBdBdBdAlBDBdBdBdBdBdAlBJ_A______ _____________ABdBdBdBJAlBJBdBdBdBdBJAjBdBdBdBdBdBJAj_z_B_A______ _____________A_A_ABJAjBJBlBdBdAlBDAlBJBdBdBdAlBDAlBJ_A_A_A_A____ _____________A_A_A_ABkBlCOBkBlBdBdBkBlBdBJAjBJAlBlBkBlCOBkBd_A__ _______________A_A_zBlCOBkBdBdBdBdCJBmCKBkBkBdBkBkCOBkBdBdBd_A__ _________________A_ABdBdBdBdBdBJAjBkBnBkBkBdBdBdBlBdBdBdBdBd_A__ _________________ABdBdBdBdAlBDBmBkCKBjBdBdBdBdBJBdBdBdBJAjBJ_A__ _________________A_ABdBJAjBXAlCKBdBdBdBdBJAjBJBdBdBdBDAlBD_A_A__ ___________________A_A_ABJBkBnBkBmBkBdAlBDAlBd_ABdAlBDAl_A_A_A__ _____________________A_A_ABlCJBkBkBdBdBdBJ_B_A_A_ABD_A_A_A______ _______________________BCJBmBdBkBdBdBd_A_A_A_A_A_A_A_A__________ _______________________ABdBdBdBdBdBJAj_A_A_A____________________ _______________________ABdBdBDAlBDAl_A_A_A______________________ _______________________A_A_AAlBDAl_B_A_A________________________ ___________________________A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 93 (silver dragon scales) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________C$CoCVCVCm_A____________ ____________________________________C$C$CVCVCmCmCP_A____________ ____________________________________CoCVCmCmCPCPCP_A____________ ____________________________________CVCmCPCPCPBkBk_M____________ ________________________________CPCPCPCPBnCJBk_M_z_A_A__________ __________________C$C$CVCVCmC$C$C$CoCVCVBkBDBdC$_AC$_A_A________ ________________C$CVCVCmCmCPC$CoCVCVCVCmCPC$C$C$C$C$CV_A_A______ ______________C$CVCmCmCPCPCPCoCVCmCmCPCPCPC$CoCVCVCmCPCP_A______ ______________CVCmCPCPCVBkBkCVCVCPCPCVBkBkCVCVCmCPCVBkBk_A______ _____________ACmCPCPBkBkCPCmCmCPCPBkBkCmCmCmCPCPBkBk_M_z_A______ _____________A_A_ABkCPBDC$CmCVBkBkCPBDCVCmCPBkCPBkBd_A_A_A_A____ _____________A_A_A_ACoC$C$CVCVCmCPBkCoCPBkBnCJBDC$C$C$C$CoCV_A__ _______________A_A_AC$CVCVCmCmCPCPCoC$C$C$CoCVCVC$C$CoCVCVCm_A__ _________________A_ACVCmCmCPCPBkCPC$C$CoCVCVCmCmC$CVCVCmCmCP_A__ _________________ACVCVCPCVBkBkCoC$CoCVCVCmCmCPBkCVCmCVCPBkBk_A__ _________________A_ACPBkBkCPCPC$CVCVCmCmBkBnCJCPCmCPBkBkBd_A_A__ ___________________A_A_MBDCoC$C$C$CoCmBnCJBDCP_ACPBkCPBD_A_A_A__ _____________________A_A_AC$C$CoCVCVCPCPBD_A_A_A_ABk_A_A_A______ _______________________AC$CoCVCVCmCPCP_A_A_A_A_A_A_M_A__________ _______________________ACVCVCmCPCPBkBk_z_A_A____________________ _______________________ACmCPCPBkBkBd_M_A_A______________________ _______________________A_A_ABkBDBd_A_A_A________________________ ___________________________A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 94 (shimmering dragon scales) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________CiClClClCf_A____________ ____________________________________ClClCXCXCfCfCj_z____________ ____________________________________CiClCfCjCfCjCf_A____________ ____________________________________CfCjCfCfCjBsBW_z____________ ________________________________CjCfCjCfBWBsBW_A_A_A_A__________ __________________CdCnCdCnCxCtCsCtCfCtCtBWBWBWBg_ABg_A_A________ ________________CdCnCdCxCxCxCtCtCsCtCjCjCjBgBgBgBgBg_t_A_A______ ______________CdCnCxCxCxCxCxCtCsCjCjCjCjCjBgBg_t_t_t_t_t_A______ ______________CxCxCxCxCxBrB$CjCjCjCjCjBaBy_t_t_t_t_t_c_c_A______ _____________ACxCxCxBrBrBrCjCjCjCjByBa_t_t_t_t_t_c_c_A_A_A______ _____________A_A_BBrBrBoCoCjCjByBaBaBa_t_t_t_c_c_c_c_A_A_A_A____ _____________A_A_A_AChCoChCoChChCe_s_s_t_c_c_c_cCQCQCQCQCQBQ_A__ _______________A_A_BCoChChCeCeCeCe_s_s_s_s_s_k_kCQCQCQBeBQBQ_A__ _________________A_ACeCeChCeChCHBu_s_s_s_k_k_k_kCQBeBQBQBQBQ_A__ _________________zCeChCeCeCHBu_s_s_s_k_k_k_k_k_aBeBQBQAWAWAW_A__ _________________A_BCeCHBuBuBu_s_k_k_k_k_a_a_aBQBQBQAWAWAW_A_A__ ___________________B_z_ABuCSCSCSCSCS_o_a_a_aBQ_ABQAWAWAW_A_A_A__ _____________________A_A_ACSCSCS_o_o_o_o_a_A_A_A_AAW_A_A_A______ _______________________ACSCS_o_o_o_o_o_A_A_A_A_A_A_A_A__________ _______________________A_o_o_o_o_o_Z_Z_A_A_A____________________ _______________________A_o_o_Z_Z_Z_Z_A_A_A______________________ _______________________A_A_A_Z_Z_Z_A_A_A________________________ ___________________________A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 95 (red dragon scales) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________CuCuCuCuCB_A____________ ____________________________________CuCuCuCuCBCBCB_A____________ ____________________________________CuCuCBCBCBCBCB_A____________ ____________________________________CBCBCBCBCBBoBo_A____________ ________________________________CBCBCBCBBoBoBo_A_A_A_A__________ __________________CuCuCuCuCBCuCuCuCBCuCuBoBoBoCu_ACu_A_A________ ________________CuCuCuCBCBCBCuCuCuCuCBCBCBCuCuCuCuCuCB_A_A______ ______________CuCuCBCBCBCBCBCuCuCBCBCBCBCBCuCuCBCBCBCBCB_A______ ______________CBCBCBCBCBBoBoCBCBCBCBCBBoBoCBCBCBCBCBBoBo_A______ _____________ACBCBCBBoBoBoCBCBCBCBBoBoCBCBCBCBCBBoBo_A_A_A______ _____________A_A_ABoBoBoCuCBCBBoBoBoBoCBCBCBBoBoBoBo_A_A_A_A____ _____________A_A_A_ACuCuCuCuCuCBCBCuCuCBBoBoBoBoCuCuCuCuCuCB_A__ _______________A_A_ACuCuCuCBCBCBCBCuCuCuCuCuCBCBCuCuCuCBCBCB_A__ _________________A_ACBCBCBCBCBBoBoCuCuCuCBCBCBCBCuCBCBCBCBCB_A__ _________________ACBCBCBCBBoBoCuCuCuCBCBCBCBCBBoCBCBCBBoBoBo_A__ _________________A_ACBBoBoBoBoCuCBCBCBCBBoBoBoCBCBCBBoBoBo_A_A__ ___________________A_A_ABoCuCuCuCuCuCBBoBoBoCB_ACBBoBoBo_A_A_A__ _____________________A_A_ACuCuCuCBCBCBCBBo_A_A_A_ABo_A_A_A______ _______________________ACuCuCBCBCBCBCB_A_A_A_A_A_A_A_A__________ _______________________ACBCBCBCBCBBoBo_A_A_A____________________ _______________________ACBCBBoBoBoBo_A_A_A______________________ _______________________A_A_ABoBoBo_A_A_A________________________ ___________________________A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 96 (white dragon scales) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________C$C$C$C$CP_A____________ ____________________________________C$C$C$C$CPCPCP_A____________ ____________________________________C$C$CPCPCPCPCP_A____________ ____________________________________CPCPCPCPCPBkBk_M____________ ________________________________CPCPCPCPBnCJBk_M_z_A_A__________ __________________C$C$C$C$CPC$C$C$CPC$C$BkBkCPC$_AC$_A_A________ ________________C$C$C$CPCPCPC$C$C$C$CPCPCPC$C$C$C$C$CP_A_A______ ______________C$C$CPCPCPCPCPC$C$CPCPCPCPCPC$C$CPCPCPCPCP_A______ ______________CPCPCPCPCVBkBkCPCPCPCPCPCJBkCPCPCPCPCVBkBk_A______ _____________ACPCPCPBkBkCPCPCPCPCPBkBnCPCPCPCPCPBkBk_M_z_A______ _____________A_A_ABkCPBkC$CPCPBkBnCJBkCPCPCPBkCPBkCP_A_A_A_A____ _____________A_A_A_AC$C$C$C$C$CPCPC$C$CPBkCPBkBkC$C$C$C$C$CP_A__ _______________A_A_AC$C$C$CPCPCPCPC$C$C$C$C$CPCPC$C$C$CPCPCP_A__ _________________A_ACPCPCPCPCPBkCJC$C$C$CPCPCPCPC$CPCPCPCPCP_A__ _________________ACPCPCPCPBnBkC$C$C$CPCPCPCPCVBkCPCPCPCPBkBk_A__ _________________A_ACPBkCJBkCPC$CPCPCPCPBkBkBkCVCPCPBkBkCP_A_A__ ___________________A_A_ABnC$CoC$C$C$CPBnCJBnCV_ACPBkCPBk_A_A_A__ _____________________A_A_AC$C$C$CPCPCPCPBk_z_A_A_ABk_A_A_A______ _______________________AC$C$CPCPCPCPCP_A_A_A_A_A_A_A_A__________ _______________________ACPCPCPCPCPBkCJ_A_A_A____________________ _______________________ACPCVBkBkCPBk_M_A_A______________________ _______________________A_A_ABkCPBk_A_A_A________________________ ___________________________A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 97 (orange dragon scales) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________CzCzCzCzCF_A____________ ____________________________________CzCzCzCzCFCFCF_A____________ ____________________________________CzCzCFCFCFCFCF_A____________ ____________________________________CFCFCFCFCFBsBs_A____________ ________________________________CFCFCFCFBsBsBs_A_A_A_A__________ __________________CzCzCzCzCFCzCzCzCFCzCzBsBsBsCz_ACz_A_A________ ________________CzCzCzCFCFCFCzCzCzCzCFCFCFCzCzCzCzCzCF_A_A______ ______________CzCzCFCFCFCFCFCzCzCFCFCFCFCFCzCzCFCFCFCFCF_A______ ______________CFCFCFCFCFBsBsCFCFCFCFCFBsBsCFCFCFCFCFBsBs_A______ _____________ACFCFCFBsBsBsCFCFCFCFBsBsCFCFCFCFCFBsBs_A_A_A______ _____________A_A_ABsBsBsCzCFCFBsBsBsBsCFCFCFBsBsBsBs_A_A_A_A____ _____________A_A_A_ACzCzCzCzCzCFCFCzCzCFBsBsBsBsCzCzCzCzCzCF_A__ _______________A_A_ACzCzCzCFCFCFCFCzCzCzCzCzCFCFCzCzCzCFCFCF_A__ _________________A_ACFCFCFCFCFBsBsCzCzCzCFCFCFCFCzCFCFCFCFCF_A__ _________________ACFCFCFCFBsBsCzCzCzCFCFCFCFCFBsCFCFCFBsBsBs_A__ _________________A_ACFBsBsBsBsCzCFCFCFCFBsBsBsCFCFCFBsBsBs_A_A__ ___________________A_A_ABsCzCzCzCzCzCFBsBsBsCF_ACFBsBsBs_A_A_A__ _____________________A_A_ACzCzCzCFCFCFCFBs_A_A_A_ABs_A_A_A______ _______________________ACzCzCFCFCFCFCF_A_A_A_A_A_A_A_A__________ _______________________ACFCFCFCFCFBsBs_A_A_A____________________ _______________________ACFCFBsBsBsBs_A_A_A______________________ _______________________A_A_ABsBsBs_A_A_A________________________ ___________________________A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 98 (black dragon scales) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________AlBJAjBJAe_A____________ ____________________________________BJAjBJAjAeAeAe_A____________ ____________________________________BDAlAeAeAeAeAe_A____________ ____________________________________AeAeAeAeAeABAB_A____________ ________________________________AeAeAeAeABABAB_A_A_A_A__________ __________________BJAjBJAlAeBJAjBJAeAlBDABABABBJ_ABJ_A_A________ ________________AlBDAlAeAeAeBDAlAlBDAeAeAOBDAlBDAlAjAe_A_A______ ______________BJAjAeAeAeAeAeAlBDAeAeAeAeAeAlBDAeAeAeAeAe_A______ ______________AeAeAeAeAeABABAeAeAeAeAeABABAeAeAeAeAeABAB_A______ _____________AAeAeAeABABABAeAeAeAeABABAeAeAeAeAeABAB_A_A_A______ _____________A_A_AABABABBDAeAeABABABABAeAeAeABABABAB_A_A_A_A____ _____________A_A_A_ABJAlAjBJAlAeAeBJAlAeABABABABBJAlBDAlBDAe_A__ _______________A_A_BAlBDAlAeAeAeAeBDAjBJAjBJAeAeAlAjBJAeAeAe_A__ _________________A_AAeAeAeAeAeABABAlBJAlAeAeAeAeBDAeAeAeAeAe_A__ _________________AAeAeAeAeABABBDAlBDAeAeAeAeAeABAeAeAeABABAB_A__ _________________A_AAeABABABABAlAeAeAeAeABABABAeAeAeABABAB_A_A__ ___________________A_A_AABBDAlBDAlBDAeABABABAe_AAeABABAB_A_A_A__ _____________________A_A_AAlBDAlAeAeAeAeAB_A_A_A_AAB_A_A_A______ _______________________AAlBDAeAeAeAeAe_A_A_A_A_A_A_A_A__________ _______________________AAeAeAeAeAeABAB_A_A_A____________________ _______________________AAeAeABABABAB_A_A_A______________________ _______________________A_A_AABABAB_A_A_A________________________ ___________________________A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 99 (blue dragon scales) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ _________________________________________K_K_K_K_I_A____________ _____________________________________K_K_K_K_I_I_I_A____________ _____________________________________K_K_I_I_I_I_I_A____________ _____________________________________I_I_I_I_I_H_H_A____________ _________________________________I_I_I_I_H_H_H_A_A_A_A__________ ___________________K_K_K_K_I_K_K_K_I_K_K_H_H_H_K_A_K_A_A________ _________________K_K_K_I_I_I_K_K_K_K_I_I_I_K_K_K_K_K_I_A_A______ _______________K_K_I_I_I_I_I_K_K_I_I_I_I_I_K_K_I_I_I_I_I_A______ _______________I_I_I_I_I_H_H_I_I_I_I_I_H_H_I_I_I_I_I_H_H_A______ _____________A_I_I_I_H_H_H_I_I_I_I_H_H_I_I_I_I_I_H_H_A_A_A______ _____________A_A_A_H_H_H_K_I_I_H_H_H_H_I_I_I_H_H_H_H_A_A_A_A____ _____________A_A_A_A_K_K_K_K_K_I_I_K_K_I_H_H_H_H_K_K_K_K_K_I_A__ _______________A_A_A_K_K_K_I_I_I_I_K_K_K_K_K_I_I_K_K_K_I_I_I_A__ _________________A_A_I_I_I_I_I_H_H_K_K_K_I_I_I_I_K_I_I_I_I_I_A__ _________________A_I_I_I_I_H_H_K_K_K_I_I_I_I_I_H_I_I_I_H_H_H_A__ _________________A_A_I_H_H_H_H_K_I_I_I_I_H_H_H_I_I_I_H_H_H_A_A__ ___________________A_A_A_H_K_K_K_K_K_I_H_H_H_I_A_I_H_H_H_A_A_A__ _____________________A_A_A_K_K_K_I_I_I_I_H_A_A_A_A_H_A_A_A______ _______________________A_K_K_I_I_I_I_I_A_A_A_A_A_A_A_A__________ _______________________A_I_I_I_I_I_H_H_A_A_A____________________ _______________________A_I_I_H_H_H_H_A_A_A______________________ _______________________A_A_A_H_H_H_A_A_A________________________ ___________________________A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 100 (green dragon scales) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ _________________________________________w_w_w_w_q_A____________ _____________________________________w_w_w_w_q_q_q_A____________ _____________________________________w_w_q_q_q_q_q_A____________ _____________________________________q_q_q_q_q_m_m_A____________ _________________________________q_q_q_q_m_m_m_A_A_A_A__________ ___________________w_w_w_w_q_w_w_w_q_w_w_m_m_m_w_A_w_A_A________ _________________w_w_w_q_q_q_w_w_w_w_q_q_q_w_w_w_w_w_q_A_A______ _______________w_w_q_q_q_q_q_w_w_q_q_q_q_q_w_w_q_q_q_q_q_A______ _______________q_q_q_q_q_m_m_q_q_q_q_q_m_m_q_q_q_q_q_m_m_A______ _____________A_q_q_q_m_m_m_q_q_q_q_m_m_q_q_q_q_q_m_m_A_A_A______ _____________A_A_A_m_m_m_w_q_q_m_m_m_m_q_q_q_m_m_m_m_A_A_A_A____ _____________A_A_A_A_w_w_w_w_w_q_q_w_w_q_m_m_m_m_w_w_w_w_w_q_A__ _______________A_A_A_w_w_w_q_q_q_q_w_w_w_w_w_q_q_w_w_w_q_q_q_A__ _________________A_A_q_q_q_q_q_m_m_w_w_w_q_q_q_q_w_q_q_q_q_q_A__ _________________A_q_q_q_q_m_m_w_w_w_q_q_q_q_q_m_q_q_q_m_m_m_A__ _________________A_A_q_m_m_m_m_w_q_q_q_q_m_m_m_q_q_q_m_m_m_A_A__ ___________________A_A_A_m_w_w_w_w_w_q_m_m_m_q_A_q_m_m_m_A_A_A__ _____________________A_A_A_w_w_w_q_q_q_q_m_A_A_A_A_m_A_A_A______ _______________________A_w_w_q_q_q_q_q_A_A_A_A_A_A_A_A__________ _______________________A_q_q_q_q_q_m_m_A_A_A____________________ _______________________A_q_q_m_m_m_m_A_A_A______________________ _______________________A_A_A_m_m_m_A_A_A________________________ ___________________________A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 101 (yellow dragon scales) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________CjCjCjCjCM_A____________ ____________________________________CjCjCjCjCjCMCM_A____________ ____________________________________CjCjCjCMCMCMCM_A____________ ____________________________________CjCMCMCMCMByBy_A____________ ________________________________CMCMCMCMByByBy_A_A_A_A__________ __________________CjCjCjCjCMCjCjCjCMCjCjCMByByCj_LCj_z_A________ ________________CjCjCjCjCMCjCjCjCjCjCjCMCMCjCjCjCjCjCM_A_A______ ______________CjCjCjCMCMCMCMCjCjCjCMCMCMCMCjCjCjCjCMCMCM_A______ ______________CjCMCMCMCMByByCjCMCMCMCMByByCjCMCMCMCMByBy_A______ _____________ACMCMCMByByByCMCMCMCMByByCMCMCMCMCMByBy_A_A_A______ _____________A_A_AByByCMCjCMCMByByByByCMCMCMByByByBy_A_A_A_A____ _____________A_A_A_ACjCjCjCjCjCMCMCjCjCMByByByByCjCjCjCjCjCM_A__ _______________A_AAACjCjCjCMCjCMCjCjCjCjCjCjCMCjCjCjCjCMCjCM_A__ _________________A_ACMCjCMCMCMByByCjCjCjCjCMCMCMCjCjCMCMCMCM_A__ _________________ACMCMCMCMByByCjCjCjCjCMCMCMCMByCMCMCMByByBy_A__ _________________A_ACMByByByByCjCjCMCMCMByByByCMCMCMByByBy_A_A__ ___________________A_A_ACMCjCjCjCjCjCMByByByCM_ACMByByBy_A_A_A__ _____________________A_A_ACjCjCjCjCMCMCMBy_A_A_A_ABy_A_A_A______ _______________________zCjCjCjCMCMCMCM_A_A_A_A_A_A_A_A__________ _______________________ACMCjCMCMCMByBy_z_A_A____________________ _______________________ACMCMByByByBy_A_A_A______________________ _______________________A_A_AByByBy_A_A_A________________________ ___________________________A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 102 (plate mail) { ________________________________________________________________ ________________________________________________________________ _________________________A_A_A_A_A______________________________ __________________BkBkCm_A_A_A_A_ABdBdBkAjBJ____________________ ____________BkBnCJBnCmCmCm_A_A_ABdBdBdCJBDAlBDAl________________ __________BnCJCmCmCmCmCmCoBkBkBdBdBdBdBdBdAlBJAjBJ______________ ________BkCJCmCmCmBkCJCmBkCPBdBkBkBdBdBdAjBdBDAlBDAl____________ ______BnBkCmCmCoBkCmBnCoBkBkBkBkBdBdBdBdBdAlBdBDAlAjBJ__________ ______CJCmCmCmCmBkCoCmBkCoBkBkBkCPAlBdBdBdBdBJBdBdBJAl__________ ______CmCmCmBkCPBkCmCmCmBkCPBkBdBdBDAlBDBdBdBdAlAjBd____________ ________CmBkBnBk__CmCmCmBkBdBkBkBdAlBdBJAlBDBdBdBdBX____________ ______BkBmCKBkBJ__CmCmCoCJBkBkBdBdBDBdAjBDAl__AlBDAlAj__________ ______CmCKBdBdBD__CmCmCmBMBdCPBdBdAlBdBJAlBD__BdBDAlBD__________ ______CmBmBdBdAl__CmCmCmCJBdBkBdBdBDBdAlBDAl__BdAlBDAl__________ ______CmBkBdBdBD____CmCmBMBkBkBdBdAlBdBDAlBD__BdBdBJAj__________ ______CmBlBdBdAl____CmCoBkBkBkBdBJBdBDAlBDAl____BdBDAlBJ________ ______CmCOBdBdBD____CmCmBkBkBkBkAlBdAlBDAl______BdAlBDAl_B_A____ ______CmBkBdBd______CmCoBkBkBkBdBDBdBDAlBD______BdBJAjBJ_A_A____ ______CmBlBdBd______CmCmBkBkBkBkAlBdAlBkAl_____A_AAlBDAl_B_A____ ______BdBmBd______CmCmCmBlBjBlBkBDBdBdBDAlBD_A_A_ABDAlBJ_A_A____ ________CJ______CmCmCmCmCmBdCOBkBDBdAlBDAlBDAl_B_A_A_B_A_A_A____ ______________CmCmCmCmBkCOBkBlBdBdAlBdBDAlBJAjBJ_A_A_A_A_A______ ______________CmCmCmCmBlBdBmBdBdBdBDBdAlBDAlBDAl_A_A_A_A________ _____________ACmCmCmBmBjBkCKBd_ABdAlBdBdAlBDAlBD_A_A_A__________ ___________A_ACmCmCmCKBdBmBdBd_ABdBDBdBdBDAlBDAl_A_A____________ _____________A_A_ABmBDCKBkBd_A_A_ABdAlBdBdAjBJ_A_A______________ _______________A_A_ABkBmBd_z_A_A_A_ABdBDBd_A_A_A_A______________ _________________A_B_z_B_A_A_A_A_A_A_A_A_A_A_A__________________ ___________________A_A_A_A_A_A_A_A_A_A_A_A______________________ _______________________A_A_A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ } # tile 103 (crystal plate mail) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ CVCVCVCoC$BkBk__________________________________BkBkBDBDCoC$BkBk ____CVBDCPCPCVCVCVCo________________________CPC$C$BdBDCoCoBkBkBk ______BDBDBDCmBDCoCoCoBk________________BkBkC$C$CPBDCPBkBDBD____ ________BDCmCmBDBDCoCoBnCVBd__________CoCPBkBDBDBdBdBDBD________ __________CPBDBDBkCmBDBXCVBdBD______CoCoBkBdBdBdBdBDBD__________ __________CPBDBkCPCmBDBDBkBdBD____CmBkBkCPBdBDCoBkBDBD__________ ____________BkBDBdBDBDCoCVBDCmBkBkBkCmBdCPBDBdBkBkBk____________ ______________BDBdBDCoCoCPCmBDBnCPBkBDCmCPCPCoCPBk______________ ______________CPBkCPCPCPCoBkCJCPCPCPBDBDCmCoCoCoBk______________ ______________BkBdCPBkBkCoCoBDBkBkBkBDBDCmCPBkCoBk______________ ______________BkBkBDBkBkCoBDBDBkBkCoCPBkBdBdBdBdBd______________ ______________BnCoBDBDBDCoBDBDBkCoCoBkBdBkBkBdBdBk_A_A_A_A_A_A_A ________________BkCoBDBDBkBdBkBkCVBDBdCVCmBkCPBdBk_A_A_A_A_A_A_A ________________C$CoBDBDBkCPBDBDBDBDBdBdBDCPBkBd_A_A_A_A_A_A_A_A ________________CoCoCPBdBdBkBDBDBDCPBdBdBDBDBdBk_A_A_A_A_A_A_A__ ________________BkBkCPBDBdBdCmBDBDBkCPBkCVCVBdBk_A_A_A_A_A______ ________________CPBkBkCPBkBkCmBDCoCPBkCVCVBdBd_A_A_A_A__________ __________________BkBkBdBDBkCoCPCmCoBDBkBkBdBD_A_A_A_A__________ __________________BDBdBdBdBkCmBDCoCoBDBdBdBdCo_A_A_A_A_A________ __________________BDBDBkBkCPBDBDBdBDBDBdBdCoCo_A_A_A_A_A________ ______________CPBkBkBdC$BDBDBdBDBdBDBDBdCPBkBkBkBD_A_A_A_A______ __________CoCoBkC$CoCoCPAlBdBdBkBdBDBkBkBDBdCPBDBDBDCoCo_A_A_A__ ________CoC$BkCoCoCmCPBkBDCPBk_ABdBkBkBdBDBDCoBdBDBDBkCoCoBk_A_A ____CPCoCoBkBdBDBDBkBkBDBDBk_A_M_ABdBDBkCoCoCoBdBdBdBDBDBDBDBk_A ___A_A_ABkBDBDBDBDBkBkBDBD_A_A_A_ABDAlBDBkCoCoBDBdBdBD_A_A_A_A_A _____A_A_A_A_ABDBDCPCPBD_A_A_A_A_A_ABDBDBJBkBDAlBD_A_A_A_A______ _________A_A_A_ABkBkCP_A_A_A_A_____A_A_ABDBDBk_A_A_A____________ _______________A_A_A_A_A_A_____________A_A_A_A_A________________ ________________________________________________________________ } # tile 104 (bronze plate mail) { ________________________________________________________________ ________________________________________________________________ _________________________A_A_A_A_A______________________________ __________________CICICi_A_A_A_A_ABWBWCIAzAz____________________ ____________CICICICICiCiCi_A_A_ABWBWBWCIAzAzAzAz________________ __________CICICiCiCiCiCiCiCICIBWBWBWBWBWBWAzAzAzAz______________ ________CICICiCiCiCICICiCICIBWCIBWBWBWBWAzBWAzAzAzAz____________ ______CICICiCiCiCICiCICiCICIBWCIBWBWBWBWBWAzBWAzAzAzAz__________ ______CICiCiCiCiCICiCiCICiCIBWCICIAzBWBWBWBWAzBWBWAzAz__________ ______CiCiCiCICICICiCiCiCICICIBWBWAzAzAzBWBWBWAzAzBW____________ ________CiCICICI__CiCiCiCIBWCIBWBWAzBWAzAzAzBWBWBWAz____________ ______CICICICIAz__CICiCiCIBWCIBWBWAzBWAzAzAz__AzAzAzAz__________ ______CiCIBWAzAz__CICiCiCIBWCIBWBWAzBWAzAzAz__BWAzAzAz__________ ______CiCIBWAzAz__CICiCiCIBWCIBWBWAzBWAzAzAz__BWAzAzAz__________ ______CiCIBWAzAz____CICiCIBWCIBWBWAzBWAzAzAz__BWBWAzAz__________ ______CiCIBWAzAz____CICiCIBWCIBWAzBWAzAzAzAz____BWAzAzAz________ ______CiCIBWAzAz____CICiCIBWCIBWAzBWAzAzAz______BWAzAzAz_A_A____ ______CiCIBWAz______CICiCIBWCIBWAzBWAzAzAz______BWAzAzAz_A_A____ ______CiCIBWAz______CICiCIBWCIBWAzBWAzBWAz_____A_AAzAzAz_A_A____ ______BWCIBW______CICiCiCIBWCICIAzBWBWAzAzAz_A_A_AAzAzAz_A_A____ ________CI______CICiCiCiCiBWCICIAzBWAzAzAzAzAz_A_A_A_A_A_A_A____ ______________CICiCiCiCICICICIBWBWAzBWAzAzAzAzAz_A_A_A_A_A______ ______________CiCiCiCiCIBWCIBWBWBWAzBWAzAzAzAzAz_A_A_A_A________ _____________ACiCiCiCIBWCICIBW_ABWAzBWBWAzAzAzAz_A_A_A__________ ___________A_ACiCiCiCIBWCIBWBW_ABWAzBWBWAzAzAzAz_A_A____________ _____________A_A_ACIBWCICIBW_A_A_ABWAzBWBWAzAz_A_A______________ _______________A_A_ACICIBWBW_A_A_ABWAzBWBW_A_A_A_A______________ _________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A__________________ ___________________A_A_A_A_A_A_A_A_A_A_A_A______________________ _______________________A_A_A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ } # tile 105 (splint mail) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________CPBkAOBDBDBD______________________________________ ______BkBdAOBDBDAOBkCPBkCLCLBbCLBZBZ____________________________ ____BDBDAOCPBkAOBDBDBDCLCLCL_A_z_zBZBZ__________________________ ____BdAOBkBdAOBkCPBdAuBbBv_A_A_A_A_ABZAv________________________ ____________BkBkBkAvAvCLCU_A_A_A_A_ABZAvAv______________________ ______________BdAlAvAvAvCLCL_A_A_AB_BZAvAvBk____________________ ______________BdBkAXBDAvAqCLBZCLBZB_B_BkBkBkBk__________________ ______________BdBDAXBDBDAvAuAvBZBZB_BDBDBDCPBDBD________________ ______________BdBDAXBDBDAvBDAvAvAvAvBDBDBDBDBDAOBk______________ ______________BdBDAXBDBkAXBDBDAvBJBkBkCPBdBkAOBkBkBk____________ ______________AvBkAXBDBDAXBDBDAXAjAlBDBDBDAOBDBDCPBDBD__________ ______________AvBJAIBDBDAXBDBkAXBJBkAXBkAOBDBDBDBDBDAO__________ ______________BdAvAvBDBkAXBDBDATAjBJAXAlBkBdCPBkBkAOBdBd________ ______________BdAvAvBDBDAXBDBDAXBJAlAXAlAlBDBDBDAOAlBDBk_A______ ____________BkBdAXBDAvBDAXBDBDAXAlBDAXAlAlAIBkAOAlBDAlBD_A_A____ ______________BdAXBDAvAvAvBDBkAXBDAlAXAlAlAIAlBdBdBkBd_A_A_A____ ______________BdAXBDBDAXAvAvBDATAjBkAXAlBkAIAl_A_ABd_A_A_A_A____ ______________BdAXBDBDAXBDAvAvAvBJAlAXAlAlAIAI_A_A_A_A_A_A_A____ ____________BkBdAXBDBkAXBDBDAXBDAvAXAlAXAXAeAI_A_A_A_A_A_A______ ______________BdAXBDBDAXBDBDAXAlBDAXAlAlAXAeAe_A_A_A_A_A_A______ _______________AAXBDBDAXBDBkAXBDAlAXAlBkAXAeBD_A_A_A_A_A________ _______________AAXBDBkAXBDBDAXAlBkAXAlAlAXAeAe_A_A_A_A__________ _______________A_ABDBDAXBDBDAXBJBDAXAlAlAXAeAe_A_A_A____________ _________________A_ABD_ABDBkAXAjAlAXAlAlAXAeAe_A_A______________ ___________________A_A_ABDBDATBJBkAXAlBkAXAeBD_A________________ _____________________A_A_ABDAXAjBJAXAlAlAXAe_A__________________ _________________________A_A_A_zAl_AAl_A_A_A_A__________________ _______________________________A_B_A_A_A________________________ ________________________________________________________________ } # tile 106 (banded mail) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________CPBkAOBDBDBD______________________________________ ______BkBdAOBDBDAOBkCPBkCLCLBbCLBZBZ____________________________ ____BDBDAOCPBkAOBDBDBDCLCLCL_A_z_zBZBZ__________________________ ____BdAOBkBdAOBkCPBdAuBbBv_A_A_A_A_ABZAv________________________ ____________BkBkBkAvAvCLCU_A_A_A_A_ABZAvAv______________________ ______________AlBkBDAvAvCLCL_A_A_AB_BZAvAvBk____________________ ______________BDAlAeBDAvAqCLBZCLBZB_B_BkBkBkBk__________________ ______________BDBDAeBDBDBDAuAvBZBZB_BDBDBDCPBDBD________________ ______________BdBDAeBDBkBDBDBDAvAvAvBDBDBDBDBDAOBk______________ ______________BdBkAeAlBDBDBkBDAeBJBkBkCPBdBkAOBkBkBk____________ ______________AlBDAeBDAlAlBDBDAeAjAlBDBDBDAOBDBDCPBDBD__________ ______________BdAlAeBDBDBDAlAlAeBJBkBJBkAOBDBDBDBDBDAO__________ ______________BdBDAeBDBkBDBDBDAeAeBJAjAlBkBdCPBkBkAOBdBd________ ______________BdBkAeAlBDBDBkBDAeAlAeAeAeAlBDBDBDAOAlBDBk________ ______________AeBDAeBDAlAlBDBDAeBDBDAlBDBkAlBkAOAlBDAlBD________ ______________BdAeAeBDBDBDAlAlAeAlBkBDAlAlAeAlBdBdBkBd_A_A______ ______________BdBDAeBDBkBDBDBDAeAeBDAlBDAeAlAe_A_ABd_A_A_A______ ______________BdBkAeAeBDBDBkBDAeAlAeAeAeAlAlAe_A_A_A_A_A_A______ ______________BdBDAeBDAeAeBDBDAeBDAlBDAlBkAlAe_A_A_A_A_A________ ______________BdBDAeBDBDBDAeAeAeAlBkBDAlAlAeAe_A_A_A_A_A________ ______________BD_AAeBDBkBDBDBDAeAeBDAlBDAeAlAe_A_A_A_A__________ _______________A_A_A_ABDBDBkBDAeBJAeAeAeAlAlAe_A_A_A____________ _____________________A_A_ABDBDAeAlAjAlBJBkAlAe_A_A______________ _________________________A_A_A_ABDBkBDAlAlAeAe_A________________ _______________________________A_AAlBDAlBDAe_A__________________ _________________________________A_ABJAj_A_A_A__________________ ___________________________________A_A_A_A______________________ ________________________________________________________________ ________________________________________________________________ } # tile 107 (dwarvish mithril-coat) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________BmBDCFCc_A_A_A_A_A_A_A_ABsBsBDAo_A_A______________ __________BDBmBmAoBmCcCcCc_A_A_A_ABsBsBsAlBLBDAlBD_A____________ ________AoCRBDAoCRBDAjCRCcCcCFCFBsBsAlAlBmAlAlBmAlAO_A__________ ______BmBmAjBmBmBJBmBmAjBLBLBDBLBLAlBLBLAlBLBLAjBLBDAO_A________ ______BmBmBcBmBmAjBmBmBbBLBLAoBLBLAlBLBLAlBLBLAlBLBLAO_A_A______ ____CRBcAjCRAjBcCRBcAhCRAjAoCPAlAeCRAlAlBmAlAeCRAlAlBmAO_A______ ____AjBmBLAoBLBmAjBmBmBDBLBLAjBLBLAlBLBLAlBLBcAeBLBLAlBD_L_A____ __BmBcBmBLBDBLBLAoBmBmAoBLBLBcBLBLAlBLBLAlAoAjAlAoBLAlAoBD_A____ __AoCRAjBcBmAOBDCRBDAoCRBJAoBnAlAlBmAlAlBmAlAOBmAOAlBmAOAO_A_A__ BmBmBcBLBLAoBDAoBJBLBmBDBLBLAlBLBLAlBLBLAOAjBcAOBDBLAlBLBDAO_A__ BmBmAjBLAoAO_ABLAjBLBmAoBLBLAlBLBLAlBLBLAOBcAo_AAoBDAlBLAoAl_A__ AjBcCRAlAOBm_AAOCRAoBDCRAjBJCRAlAlCRAlAlBmAOAO_AAOAOBmAlAlBn_A__ _ABLAlBLBD_A_ABDAoBdBmBcBLBLCLCLBLAeBLBLAlBDAo_A_ABDAOBLBL_z_L__ ___AAlBDAo_A_ABmBDBmBmAoBmCrCrCLCLAlBLBDAOAoBD_A_AAoADBD_A_A____ _____A_A_A_A_A__BsCFCFCFCrCrCLCLCLCLBSBSBSBS_A_A_A_A_A_A_A______ ________________BsCFCFCFCrCLCLCLCLBbBSBSBSBS_A_A_A______________ ________________BDBmBmBDBmCLCLCLBZAlBLBDAOBD_A_A________________ ______________AOCRBDAoCRAjBcBZCLAlCWAlAlBmAOAO_A________________ ______________AjAoBLBmBJBLBLAlBLBLAlBLBLAlAoBD_A________________ _______________ABJBm_A_LBmBL_A_A_AAlBL_A_ABD_A_A________________ _________________A_A_A_A_A_A_A___A_A_A_A___A_A__________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 108 (elven mithril-coat) { ________________________________________________________________ ______________BmBDCrCr_A_A_A_A_A_A_A_ACLCLAoBD_A_A______________ __________BDBmBmAoBmBmCrCr_A_A_A_ACrCLBLAlBLBDAlAo_A____________ ________AjCRAoBDCRAjBLBmBDCrCrCrCrBLAlAlBmAlAlBnAlAO_A__________ ______BmBmBcBmBmBJBmBmAoBLBLBDBLBLAlBLBLAlBLBLAlBLBcAO_A________ ______BmBmAjBmBmAoBmBmBDBLBLAoBLBLAlBLBLAlBLBLAlBLBLAO_A_A______ ____CRBcAoCRBDAoCRBDAoCOAoBDBnAlAlCRAeAlBmAlAlCRAeAlBmAO_A______ ____AjBmBLBJBLBmBDBmBmAjBLBLBcBLBLAlBLBLAlBLBJAlBLBLAlBD_A_A____ __BmBcBmBLAoBLBLAjBmBmBcBLBLAoBLBLAlBLBLAlAoBDAlAoBLAlAoBD_A____ __AjCRAoAjBmAOBJCRBcAjCRAoBcBnAlAlCWAlAlBmAlAOBmAOAlBmAOAO_A_A__ BmBmBcBLBLBDAoAjAoBLBmBDBLBLAlBLBLAlBLBLAOBDAoAOBDBLAlBLBDAO_A__ BmBmAjBLBDAO_ABLBDBLBmAoBLBLAlBLBLAlBLBLAOAoBD_AAoBDAlBLAoAl_A__ BDAoCRAlADBm_AAOCRBDAoCRBDAoBmAlAlBmAlAlBmAOAO_AAOAOBmAlAlCP_L__ _ABLAlBLBD_A_ABDAoBLBmBDBLBLAlBLBLAlBLBLAlAjBD_A_AAjAOBLBL_A_A__ ___AAlBcAo_A_ABDAjBmBmAoBmBLAlBLBLAlBLBcAOAoBJ_L_ABcAOAj_L_A____ _____A_A_A_A_A_ABmAoBDCRBJAjCRAlAlCRAlAOBmAO_A_A_A_A_A_A_A______ ________________BDBmBmAjBmBLAlBLBLAeBLAjAOBD_L_A________________ ________________AoBmBmBcBmBLAlBLBLAlBLBcAOAo_A__________________ __________________BDAoCRAoAlBmAlAlCRAeAOBmAO_A__________________ __________________AjBmBDBmBLAlBLBLAlBLBDAO_A_A__________________ __________________CLBmBJBmBLAlBLBLAlBLAoBZ_A_A__________________ __________________CLCLCLBbCLCsCrBZCLBZBZBZ_A_A__________________ __________________CLCLCLCLCsCrCrCUBbBZBZBZ_A_A__________________ ________________BDBmCLCLCLCLCrCUBvCLBZBDAOBD_A__________________ ________________CRAoBDCRBJAeBmAlAlCPADAOBmAD_A__________________ ________________BJBmBmAoBmBLAlBLBLAlBDAoAOBD_A_A________________ ______________BmAjBmBmBDBmBLAlBLBLAlAoBDAOAoBD_A________________ ______________BcCRAoBJCRAjAlCRAlAlBmAOAOBmAOAO_A________________ ______________BmAjBmBmAoBmBLAlBLBLAlBcAjAOBDAo_A________________ _______________ABcBmBmBDBmBLAlBLBLAlAoBcADBD_A_A________________ _________________A_ABDBmAoAlCWAlAlBnAOAO_A_A_A__________________ ___________________A_L_M_z_A_A_A_A_L_A_A_A______________________ } # tile 109 (chain mail) { ____________CPCVCVCV________________________CVCVCPCP____________ ________CPCVCVCVCPCPCP____________________CPCPCPCVCVCVCPCP______ ______CPCVCVCPCPCPCPCP__CLAeAeAeAeAeAeCL__CPBnCJCPCPCPCVCVCP____ ____CPCVCPCVBkCPCPBkBkCLCLCrAeAeAeAeCLCLBzBkCJBkCPBnCPCPCPCPCV__ __CVCVCPCPBnCJBkBkBdBDCPCrCrCrAeAeCLCLCLBkBkBDCPBkCJBkBkCPCPBkCm CVCPCPCPBkBk____BDCPBkBkBJCrCLCLCLCLBZBkBJCmCPBn________BkBkBkCP __CPBk__________CPBdBDCmBnBkBJCLCLBkBJCmCPBdAlCP________________ ________________AlCPBkBkBJCmBkBkAlCmCPBkAlCmCPBk________________ ________________CPBkBJCVBlBkBDCmCPBkAlCmCPBkAlCP________________ ________________AlCPBkBkBJCmBkBkAlCmCPBkAlCVCPBk________________ ________________CPBkBDCVCPBkBDCmCPBkAlCmCPBkAlCP________________ ________________AlCPBkBkAlCmBkBkAlCmCPBkAlCVCPBk________________ __________________BkBDCVCPBkBDCmCPBkAlCmCPBkAlCP_______A_A_A____ __________________CPBkBkAlCmBkBkAlCmCPBkAlCPCP_A_A_A_A_A_A_A_A_A __________________BkBDCVCPBkBDCmCPBdAlCmCPBkAl_A_A_A_A_A_A_A_A_A ____________________BkBkAlCmBkBkAlCmCPBkAlCPCP_A_A_A_A_A_A_A_A_A ____________________BDCPBkBkBDCmCPBkAlCVCPBk_A_A_A_A_A_A_A_A_A_A ____________________BkBkBDCmBkBkAlCmCPBkAlCP_A_A_A_A_A_A_A_A_A__ ____________________BDCPBkBkBDCmCPBkAlCPCPBk_A_A_A_A_A_A_A_A____ ____________________BSBSBDCVBkBkAlCmCPBkAwAw_A_A_A_A_A_A_A______ ____________________BSBsBsBSBSBSCrAwBSBSAwAw_A_A_A_A_A_A________ ____________________BSBsBsBSBSCrCLCLAwBSBSAw_A_A_A_A_A_A________ ____________________BkBkBJBSBSBSCLAwBSBSBSCP_A_A_A_A_A__________ __________________BkBDCPBnBkAlCmCPBkAlCmCPBkBJ_A_A_A_A__________ __________________CPBkBkBJCmCPBkAlCmCPBkAlCPBn_A_A_A____________ ________________AjBkBJCmCPBkAlCmCPBkAlCmCPBkAlCP_A_A____________ ________________BkCPBkBkAlCmCPBkAlCmCPBkAlCVCPAl_A______________ _________________ABkBDCmCPBkAlCmCPBkAlCmCPBkAlCP_A______________ _________________A_ABkBkAlCmCPBkAlCmCPBkAlCVCP_A________________ ___________________A_A_ACPBkAlCmCPBkAlCmCP_A_A__________________ _________________________A_A_A_A_A_A_A_A_A______________________ ________________________________________________________________ } # tile 110 (crude chain mail / orcish chain mail) { ________________________________________________________________ ____________________CPAX________________CmCP____________________ __________________CPAlBkBnAeAeAeAeAeAeBJBkBDBkCP________________ ________________CPAXBkBkBJAeAeAeAeAeAeBkAjCmCPAlCP______________ ________________BkBdBDCmBkAeAeAeAeAeAeAvBkAvBJCPBk______________ ________________BDAXBkBkBDCmAeAeAeAeCPBkBJCmBnBDCP______________ ________________CPBDBDCmCPBdBJCmCPBdAlAvCPBkAlCPBJ______________ ________________AlCPBkBkAlCmBRBkAlCmCPBkATCmCPBkBk______________ ________________CPBkBDAXCPAuAjCmCPBkAlCmCPBdAlCP________________ ________________AlCPBkAXAlCmBkBkAlAuCPBkAlCVCPBk________________ ________________CPBkBDCVCPBkBJCmCPBkAlCmCPBkAlCP________________ ________________AlAvBkBkBJCmBkBkAICmCPBkAlAuCPBk________________ __________________BkBDCVBnBkBDAuCPBkAlAvCPBkAlCP_______A_A_A____ __________________CPBkBkBJCmBkBkAlCmCPBkAlCPCP_A_A_A_A_A_A_A_A_A __________________BkBDAuCKBkBDCmCPBkAlCmCPBkAl_A_A_A_A_A_A_A_A_A ____________________BkBkAjCmBkBkAlAuCPBkAlCPCP_A_A_A_A_A_A_A_A_A ____________________BDCPBkBkBDCmCPBkAlCVCPBk_A_A_A_A_A_A_A_A_A_A ____________________BkBkBJAvBkBkAlCmCPBkAlCP_A_A_A_A_A_A_A_A_A__ ____________________BDCPBkBkBDAvCPBkAlAvCPBk_A_A_A_A_A_A_A_A____ ____________________AvAvBDCmBkBkAlCmCPBkAXAX_A_A_A_A_A_A_A______ ____________________AvBRBRAuAvAvAvBkAvAvAXAv_A_A_A_A_A_A________ ____________________AlBRBRAvAvAvAvAvAXAvAvAX_A_A_A_A_A_A________ ____________________BlBkBJAvAvBkAXAXAvAvAlCP_A_A_A_A_A__________ __________________BkBJAvCPBkAlCmCPBkAlCmCPBkBJ_A_A_A_A__________ __________________AvBkBkAlCmCPBkAlCmCPBkAlAvBn_A_A_A____________ ________________BJBkBDCmCPBkAlAXCPBkAlAvCPBkAlCP_A_A____________ ________________BkCPBkBkAjAvCPBkAlCmCPBkAlCVCPAl_A______________ _________________ABkBDAuCPBkAlAvCPBkAlCmCPBkAlCP_A______________ _________________A_ABkBkAlCmCPBkAlAvCPBkAlAvCP_A________________ ___________________A_A_ACPBkAlCmCPBkAlCmCP_A_A__________________ _________________________A_A_A_A_A_A_A_A_A______________________ ________________________________________________________________ } # tile 111 (scale mail) { ________________________________________________________________ ________________________CLCLAOAOAOAOAOAOAOBbCL__________________ ____________________CLBZAuCLAOAOAOAOAOAOAOAZCLBZCL______________ __________________BkBDCLCLCrCrCrAOAOAOAeBZCLBbBRBb______________ ________________BkBdBkCUCrAvCrCrCLCLCLCLCLAvCLBvBkBd____________ ______________BkBDBkCoBkBDCrCrAvCLCLAvCLCLCLBdCoBDBkCPBk________ __________BDBkCVBkBdBkBdCmBDBkCLCLCLCLCLCLBDBkCPBlBcBkBdBk______ ________CPBkBDBkBdCmBDBkCVBkBDBkBdCoBDBkCPBkBDBkBdCoBDBkCVBk____ ______BDBkBkCoBDBkCPBkBDBkBdCoBDBkCPBkBdBkBdCmBDBkCPBkBdBkBdBk__ ____BdCoBDBkCPBkBDBkBdCmBDBkCVBkBDBkBdCoBDBkCVBkBDBkBdCoBDBkCV__ ____BkCPBkBDBkBkCmBDBkCPBkBDBkBdCoBDBkCPBkBDBkBdCmBDBkCPBkBdBk__ ____BDBkBkCmBDBkCPBkBDBkBdCmBDBkCVBkBDBkBkCmBDBkCVBkBDBkBdCmBD__ ______BDBkCPBkBDBkBkCPBDBkCPBkBDBkBdCoBDBkCPBkBD__BdCPBDBkCP____ ________BDBkBkBk____CPBkBDBkBkCmBDBkCVBkBDBkBdCP______Bk________ ________BkBDBk______AYBdCPBDBkCPBkBDBkBdCoBDBkAY________________ ____________________AYAwAwBkBDBkBdCoBDBkCVBkAYAY_A______________ ____________________AYAwBSBSAwBDBkCPBkBDAwAYAYAY_A_A_A_A_A______ ____________________BdAwBSBSAwAwAwAwAwAwAwAYAYBk_A_A_A_A_A_A_A__ ____________________BkCPBSBSAwAwCLCLBZAwAwAYBkBD_A_A_A_A_A_A_A_A ____________________AlBkBDCmAwAwCLBbBZAwAwCmBDBk_A_A_A_A_A_A_A_A ____________________BkBJBkCPBkBDBkBXCoBDBkCPBkBD_A_A_A_A_A_A_A_A ____________________CPBkBDBkBdCmBDBkCVBkBDBkBDCP_A_A_A_A_A_A_A__ ____________________BkBDCmBDBkCPBkBDBkBDCmBDBkBkBk_A_A_A_A_A_A__ __________________CPAlBkCVBkBDBkBdCoBDBkCVBkBDBkBD_A_A_A_A_A____ __________________BkBkBDBkBDCmBDBkCPBkBDBkBDCoBDBk_A_A_A_A_A____ ________________AlBkBDBkBDBkCVBkBDBkBdCoBDBkCPBkBJBk_A_A_A______ ________________CPAlBkCPBkBDBkBDCoBDBkCPBkBdBkBDCPAl_A_A_A______ ________________BkBkBJBkBdCmBDBkCVBkBDBkBDCmBDBkBkBk_A_A________ ________________BkBdBkBDBkCPBkBDBkBDCoBDBkCPBkBDBkBD_A_A________ _________________A_ACVBkBDBkBkCmBDBkCVBkBDBkBdCPAl_A_A__________ _____________________A_BCmBDBkCPBkBDBkBdCm_A_A_A_A_A_A__________ _________________________A_A_A_A_M_A_A_A_A_A____________________ } # tile 112 (studded leather armor) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________Bd____AwAwAwAw____BJ________________________ ______________Bd__BSAwAwAw_A_A_A_AAwAYAYAJ__BJ__________________ ______________BSBSBSBdAwAw_A_A_A_AAwAwAeAYAYAJ__________________ ________BdBSBSBSBSAwAwAwBJAYAYBSBSBdAwAwAwAYAYAYAJBJ____________ ________BSBSBSBSBdAwAwAwAwAYAYBSBSBSAwAwAwAeAYAYAYAY____________ ________BSBdBSBSAwAwAwAjAYAYAYBSBSAwBJAwAwAYAYAYAeAY____________ ____________AwAwAwAwAwAYAYAYAYBSBSAwAwAwAYAYAYAY________________ ______________AwAwBJAwAYAYAYAAAYAYAYAYAYAeAYAY__________________ __________________AJAYAYAYAYAlAwAYAA_NAAAA_A_A_A_A______________ __________________AwBSBdBSAwAwAwAwAeAY_zAA_A_A_A_A_A____________ __________________BdAwBSBSAwAwAwAwAYAYAAAe_A_A_A_A_A____________ ____________________AwBdBSBSBJAwAYAeAAAA_A_A_A_A_A_A____________ ____________________AwAwBSBSAwAwAYAY_LAA_A_A_A_A_A______________ __________________BdAwBdBSBSAwAwAYAeAAAAAe_A_A_A________________ __________________BSBSAAAABSAlAwAYAA_zAA_L_A_A_A________________ ______________BdBSBSBdAw_LAAAAAA_LAAAYAeAAAe_A_A_A______________ ______________BSBSAwAwAwAAAwAwAlAYAAAYAYAYAAAA_A_A______________ ______________BdBSBdAw_zAAAwAwAwAY_zAAAYAe_zAe_A________________ _______________ABSAwAw_AAwAwAwAwAYAb_AAYAYAY_A_A________________ _________________A_A_A_A_ABDAwAwBJ_A_A_A_A_A_A__________________ _________________________A_AAwAw_A_A_A__________________________ ___________________________A_A_A_A______________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 113 (ring mail) { ________________________________________________________________ ________________________________________________________________ ____________________AeCP_M_MAA_MA__M_MAeAeCPAl__________________ ________________AeCPAjBJAe_z_CAA_M_z_zCPBJAlAeAe________________ ______________CPAlBJAeAeCPBJ_A_A_A_ABDAjAeAeCPBJ________________ ______________AlAeAeCPBDAlAeAeCPBDAlAeAeCPBJAjAe________________ ______________AeBkAlAlAeAeCPAjBJAeAeCPBJAlAeAeBk________________ ______________AlBDAeAeCPAjBJAeAeCPBJAjAeAeCPAlBJ________________ ______________AeAeBkAlBJAeAeCPAlBDAOAeCPBDAlAlAe________________ ______________BdAlAlAeAeCPBDAlAeAeCPBDAlAeAeCPAl________________ ________________AeAeBkAlAlAeAeCPBDAlAeAeCPAlBDAe________________ ________________BdAlBDAeAeCPBDAlAeAeCPAlBDAeAeBk________________ __________________AeAeBkAlAlAeAeCPBDAlAlAeCPAlBD_______A_A_A____ __________________BdAlBJAeAeCPAjBJAeAeCPAlBJAe_A_A_A_A_A_A_A_A_A __________________AlAeAeCPAlBDAeAeCPBDAlAlAeBk_A_A_A_A_A_A_A_A_A __________________AeBdAlAlAeAeCPBDAlAeAeCPBJAj_A_A_A_A_A_A_A_A_A __________________AlAlAeAeCPAlBJAeAeCPAlBDAO_A_A_A_A_A_A_A_A_A_A ____________________AeBkAlBDAeAeCPAlBDAeAeBk_A_A_A_A_A_A_A_A_A__ ____________________AlBDAeAeCPAlBDAeAeCPAlBD_A_A_A_A_A_A_A_A____ ____________________BSBSBkAlBDAeAeCVAlBDAeAw_A_A_A_A_A_A_A______ ____________________BSBsBsBSBSBSCrAwBSBSAwAw_A_A_A_A_A_A________ ____________________BSBsBsBSBSCrCLCLAwBSBSAw_A_A_A_A_A_A________ ____________________BkAlBJBSBSBSCLAwBSBSBSBJ_A_A_A_A_A__________ __________________AlAlAeAeCPAlBJAeAeCPBJAjAeAe_A_A_A_A__________ __________________AeAeBkAjBJAeAeCPAjBJAeAeCPAl_A_A_A____________ ________________AeBkAlBJAeAeCPBDAlAeAeCPAlBDAeAe_A_A____________ ________________AlBDAeAeCPAlBDAOAeCPAlBDAeAeCPBJ_A______________ _________________AAeCKAlAjAeAeCVAlBDAeAeCPBDAlAe_A______________ _________________A_AAjAeAeCPAlBDAeAeCPAlBDAOAe_A________________ ___________________A_A_zAlBJAeAeCPAlBDAeAe_A_A__________________ _________________________A_B_A_A_A_A_A_A_A______________________ ________________________________________________________________ } # tile 114 (crude ring mail / orcish ring mail) { ________________________________________________________________ ________________________________________________________________ ____________________AeCP_M_MAA_MA__M_MAeAeCPAl__________________ ________________AeCPBRBJAe_z_CAA_M_z_zCPBJAlAeAe________________ ______________CPAlBDAeAeCPBJ_A_A_A_ABDAjAeAeCPBJ________________ ______________AlAeAeBRBDAlAeAeCPBDAlAeAeBRBJAjAe________________ ______________AeBkAlAlAeAeCPAjBJAeAeCPBJAlAeAeBk________________ ______________AlBJAeAeCPAjBJAeAeCPBJAjAeAeCPAlBJ________________ ______________AeAeBRAlBJAeAeBRAlBDAOAeCPBDAlAlAe________________ ______________BdAlAjAeAeCPBDAlAeAeCPBDAlAeAXCPAl________________ ________________AeAeBkAlAlAeAeAvBDAlAeAeCPBRAlAe________________ ________________BdAlAlAeAvBRBDAlAeAeCPAlBDAeAeBk________________ __________________AeAeBkAlBJAeAeCPBDAlAlAeCPBDAl_______A_A_A____ __________________BdAlBDAeAeCPBDAlAeAeBRBDAlAe_B_A_A_A_A_A_A_A_A __________________AlAeAeBRAlAjAeAeCPBJAlAeAeBk_A_A_A_A_A_A_A_A_A __________________AeBdAlBJAeAeCPATAjAeAeBRAjBJ_A_A_A_A_A_A_A_A_A __________________AlAlAeAeCPBJAlAeAeCPBDAlAe_A_A_A_A_A_A_A_A_A_A ____________________AeBkAlAjAeAeCPBDAlAXAeBk_A_A_A_A_A_A_A_A_A__ ____________________AlBDAeAeBRBJAlAeAeCPBJAj_z_A_A_A_A_A_A_A____ ____________________AvAuBkAlBDAeAeCmAlBDAeAX_A_A_A_A_A_A_A______ ____________________AvBRBRBRAuAeAXAlAXAvAXAX_A_A_A_A_A_A________ ____________________AlBRBRAvAvAXAXAXAvAvAXAX_A_A_A_A_A_A________ ____________________BkAlBJAuAvAvAXAXAvAvAvBJ_A_A_A_A_A__________ __________________AlAjAeAeCPAlBDAeAeCPBDAlAeAe_A_A_A_A__________ __________________AeAeBkBJAjAXAeCPBJAlAeAXCPBJ_A_A_A____________ ________________AeAXAlAlAeAeBRBJAjAXAeCPBJAjAeAe_A_A____________ ________________AlBJAeAeCPBJAlAeAeCPBDAlAeAeBRAl_A______________ _________________AAeCPAlAjAeAeCPBDAlAeAeCPAlBDAe_A______________ _________________A_AAlAeAeCPBDAlAeAeBRBDAlAlAe_A________________ ___________________A_A_ABDAlAeAeCPBDAlAeAe_A_A__________________ _________________________A_A_A_A_A_A_A_A_A______________________ ________________________________________________________________ } # tile 115 (leather armor) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________AwAwAwAw______________________________ __________________BSAwAwAw_A_A_A_AAwAYAYAY______________________ ______________BSBSBSAwAwAw_A_A_A_AAwAwAwAYAYAY__________________ __________BSBSBSBSAwAwAwAwAYAYBSBSBSAwAwAwAYAYAYAY______________ ________BSBSBSBSAwAwAwAwAwAYAYBSBSBSAwAwAwAYAYAYAYAY____________ ________BSBSBSBSAwAwAwAwAYAYAYBSBSAwAwAwAwAYAYAYAYAY____________ ____________AwBSAwAwAwAYAYAYAYBSBSAwAwAwAYAYAYAY________________ ______________AwAwAwAwAYAYAYAAAYAYAYAYAYAYAYAY__________________ __________________AYAYAYAYAYAwAwAYAAAAAAAA_A_A_A_A______________ __________________AwBSBSBSAwAwAwAwAYAY_zAA_A_A_A_A_A____________ ____________________AwBSBSAwAwAwAwAYAYAA_A_A_A_A_A_A____________ ____________________AwBSBSBSAwAwAYAY_LAA_A_A_A_A_A_A____________ ____________________AwAwBSBSAwAwAYAYAAAA_A_A_A_A_A______________ ____________________AwAwBSBSAwAwAYAY_zAA_A_A_A_A________________ __________________BSBSAAAABSAwAwAYAAAA_NAA_A_A_A________________ ________________BSBSAwAwAA_LAAAA_zAAAYAY_zAA_A_A_A______________ ______________BSBSAwAwAw_zAwAwAwAYAAAYAYAYAAAA_A_A______________ ______________BSBSAwAwAAAAAwAwAwAY_LAAAYAY_LAA_A________________ _______________ABSAwAw_AAwAwAwAwAYAY_AAYAYAY_A_A________________ _________________A_A_A_A_AAwAwAwAY_A_A_A_A_A_A__________________ _________________________A_AAwAw_A_A_A__________________________ ___________________________A_A_A_A______________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 116 (leather jacket) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________AY_$_$_$AY____________________________ ________________________AwAY_$_$_$AYAA__________________________ ____________________AwAwAYAY_$_$_$AYAJAAAY______________________ __________________AwAwAwAYAY_$_$_$AYAYAAAYAA____________________ ________________AwAwAwAwAYAY_$_$_$AYAYAAAYAJAA__________________ ________________AwAwAwAAAYAY_$_$_$AYAY_zAYAYAA_z________________ ______________AwAwAwAYAY_AAY_$_$_$AY_AAAAAAYAYAA________________ ____________AwAwAwAYAwAYAY_A_$_$_$_AAYAYAAAJAYAAAA______________ __________AwAwAwAYAYAwAYAYAY_$_$_$AYAYAJAAAYAYAY_N______________ ________AwAwAwAYAYAYAwAYAY_$_$_$_$_$AYAYAA_zAYAYAAAA____________ ________AwAwAwAYAYAwAwAYAY_$_$_$_$_$AYAYAAAAAYAYAXAA____________ ________AwAwAYAY_AAwAwAYAY_$_$_$_$_$AYAY_LAAAAAYAY_N____________ __________AwAY_A_AAwAwAYAY_$_$_$_$_$AYAYAAAA_zAYAYAA_A__________ ___________A_A_A_AAwAwAYAY_$_A_A_$_$AYAYAA_LAAAYAYAA_A__________ _______________A_AAwAwAYAY_A_A_A_A_AAYAY_zAAAAAYAY_A_A__________ _________________A_AAwAYAY_A_A_A_A_AAYAYAAAA_A_A_A_A____________ ___________________A_A_A_A_A_A_A_A_A_A_A_A_A_A__________________ _______________________A_A_A_A_A_A_A_A_A_A_A____________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 120 (faded pall / elven cloak) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________BfBf_c_________________hBfBf____________________ ________________BfBfBf_c_c_________h_hBfBGAn_A_A________________ __________________BGBfBf_c_c_c_h_h_hBfBGAn_A_A_A________________ ____________________AnBf_c_c_c_c_hBfAnBG_A_A_A__________________ ______________________BGBf_c_c_c_hBfBG_A_A_A____________________ ________________________AnBf_c_h_hAn_c_A_A______________________ ______________________CLCsBf_A_ABfCs_c_c_A_A____________________ ____________________AnBGCLCs_A_ACsCL_c_c_c_A_A__________________ __________________AnBGBfAnCL_A_ACL_c_c_c_c_c_A_A________________ ________________BGAnBGBfBGCL_A_ACL_h_h_h_c_c_c_A_A______________ ______________AnBGAnBfBfAnCL_A_ACLBG_h_h_h_c_c_c_A_A____________ ____________BGAnBfBfBfBG_ACL_A_ACLBf_h_h_h_c_c_c_c_A____________ __________BGAnBfBfBfBfAn_A_A_A_A_ABf_h_h_h_h_c_c_c_A_A__________ __________AnBGBfBfBfBfBG_A_A_A_A_AAnBG_h_h_h_c_c_c_A_A__________ ________AnBGAnBfBfBfBfAn_A_A_A_X_c_LAn_h_h_h_h_c_c_c_A__________ ________BGAnBfBfBfBfBG_A_A_A_X_X_c_ABfBG_h_h_h_c_c_c_A_A________ ________AnBGBfBfBfBfAn_A_A_A_X_c_c_h_AAn_h_h_h_c_c_c_A_A________ ________BGAnBfBfBfBfBG_A_A_A_X_c_c_h_ABf_h_h_h_c_c_c_A_A________ ________AnBGBfBfBfBfAn_A_A_X_X_c_h_h_hBG_h_h_h_c_c_c_A_A________ ________BGAnBfBfBfBfBG_A_A_X_c_c_h_h_h_AAn_l_h_c_c_c_A_A________ __________BGBfBfBfAn_A_A_X_X_c_c_h_h_h_ABG_h_h_c_c_c_A_A________ ____________AnBfBfBG_A_A_X_A_A_A_A_A_h_h_AAn_l_c_c_c_A__________ ______________BGBfAn_A_A_A_A_A_A_A_A_A_h_ABG_h_c_c_A_A__________ _______________AAnBG_A_A_A_A_A_A_A_A_A_A_AAn_c_c_A_A____________ _________________LAn_A_A_A_____________A_ABf_c_A_A______________ ___________________L_A_A_________________A_ABG_A________________ _____________________A_____________________A_A__________________ ________________________________________________________________ ________________________________________________________________ } # tile 121 (coarse mantelet / orcish cloak) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________CFCc_ABs________BSBSCcAw_A____________________ __________________CFCcCc_ABsBsBSBSBSCcAwAw_A_A__________________ ____________________CFCc_A_ABsBsBSCcAwAw_A_A_A__________________ ______________________CFCc_A_ABsBSCcAw_A_A_A____________________ ________________________CFCc_ABSBSCcAw_A_A______________________ ______________________CLCsCc_A_ACcCsAwAw_A_A____________________ ____________________CFCFCLCs_A_ACsCLAwAwAw_A_A__________________ __________________CFCFCcCFCL_A_ACLAwAwAwAwAw_A_A________________ ________________CFCFCFCcCFCs_A_ACsBSBSAwAwAwAw_A_A______________ ______________CFCFCFCcCcAwCs_A_ACsCFBSAwAwAwAw_A_A______________ ______________CFCFCFCcCF_ACs_A_ACsCcBSBSAwAwAwAw_A_A____________ ______________CFCFCcCcCF_ACs_A_ACsCcBSBSAwAwAwAw_A_A____________ ____________CFCFCcCcCcCF_A_A_A_A_ACFCFBSBSAwAwAwAw_A____________ ____________CFCFCcCcCcCF_A_A_AAwBS_ACFBSBSAwBSAwAw_A____________ __________CFCFCFCcCcCFCF_A_AAwAwBS_ACcCFBSBSBSAwAw_A_A__________ __________CFCFCFCcCcCFCF_A_AAwBSBSBs_ACFBSAwAwAwAw_A_A__________ __________CFCFCFCcCcCFCF_A_AAwBSBSBs_ACcBSBSAwAwAw_A_A__________ __________CFCFCcCFCcCFCF_AAwAwBSBsBsBsCFBSBSAwAwAw_A_A__________ __________CFCFCcCcCcCF_A_AAwBSBSBsBsBs_ACFBSAwAwAw_A_A__________ __________CFCFCcCcCFCF_AAwAwBSBSBsBsBs_ACFBSBSAwAw_A_A__________ ____________CFCcCcCF_A_AAw_A_A_A_A_A_ABs_ACFBSAwAw_A_A__________ ______________CFCcCF_A_A_A_A_A_A_A_A_A_A_ACFBSAwAw_A_A__________ _______________ACFCF_A_A_A_A_A_A_A_A_A_A_ACFAwAw_A_A____________ _________________ACF_A_A_A_____________A_ACcAw_A_A______________ ___________________A_A_A_________________A_ACF_A________________ _____________________A_____________________A_A__________________ ________________________________________________________________ ________________________________________________________________ } # tile 124 (robe) { ________________________________________________________________ ________________________________________________________________ _________________________________A_A_A__________________________ _____________________________A_zBICVBn_A_A______________________ ___________________________ACVBhBdAiBdBnBF_A____________________ _________________________zBIBFBDBdAiBnBnBM_A____________________ _______________________ACVBMBnBnAiBnBMCSBM_A____________________ _______________________ABnBMBnCSBnBMBMBnBnBM_A__________________ _____________________ACSBnBMCSBFBnBMBdCSBnBM_A__________________ _____________________ABnBnBFCSBFCVBMAiCSCVBn_A__________________ _____________________ACSBnBMCSBFCSBFBdCSBIBnBM_A________________ _____________________ACSBnBMCSBMCSBMAiCSCVBnBM_A________________ _____________________ACSBnBMCVBFCSBnBDCSCSBnBM_A________________ ___________________ABnCSCVBnBhBMBIBnBdBICSBnBn_A________________ ___________________ABnBICSBnCPBMCVBnAiCVCSCVBn_A________________ _________________ABFBDBnCVAiBnBnBnAiCSBnCSBIBn_A________________ _________________ABMAiBnBIBMBdAiBdBDCSAiBDCSBn_A________________ _________________zAiBdBM_zBMBnBMBnBFBnAiBdBnBn_A________________ _________________ABMBdBF_ABnCSBnBnBFBMBnAiCSBn_A________________ ___________________A_A_A_ABnBnBFBnBnBMBnBDBn_A__________________ _________________________ABnCSBFCVBnBFBMBnBn_A__________________ _______________________ABnBFCVBMBIBFBMBnBMBM_A__________________ _______________________ABnBFBIBMCVBMAiCVBF_A____________________ _____________________ABFBnBdBnBDCSBMAiCSBM_A____________________ _____________________ABMBnAiBMAiCVBFBDBIBMBD_A__________________ _____________________ABMBnBdBMAiBnBFBdBnBMAi_A__________________ _______________________ABMAiBdBdBnAiBdBFBMBd_A__________________ _________________________A_MBDAiBFBdAiBM_A_A____________________ _____________________________A_A_A_A_A_A________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 127 (leather cloak) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________CFCF_ABs________BSBSCFAY_A____________________ __________________CFCFCF_ABsBsBSBSBSCFAYAY_A_A__________________ ____________________CFCF_A_ABsBsBSCFAYAY_A_A_A__________________ ______________________CFCF_A_ABsBSCFAY_A_A_A____________________ ________________________CFCF_ABSBSCFAY_A_A______________________ ______________________CLCsCF_A_ACcCsAYAY_A_A____________________ ____________________BsBsCLCs_A_ACsCLAYAYAY_A_A__________________ __________________BsBsCFCFCL_A_ACLAYAYAYAYAY_A_A________________ ________________BsBsBsCFCFCs_A_ACsAwAwAYAYAYAY_A_A______________ ______________BsBsBsCFCFAwCs_A_ACsCFAwAYAYAYAY_A_A______________ ______________BsBsBsCFBs_ACs_A_ACsCcAwAwAYAYAYAY_A_A____________ ______________BsBsCFCFBs_ACs_A_ACsCcAwAwAYAYAYAY_A_A____________ ____________BsBsCFCFCFBs_A_A_A_A_ACFCFAwAwAYAYAYAY_A____________ ____________BsBsCFCFCFBs_A_A_AAYAw_ACFAwAwAYAwAYAY_A____________ __________BsBsBsCFCFBsBs_A_AAYAYAw_ACFCFAwAwAwAYAY_A_A__________ __________BsBsBsCFCFBsBs_A_AAYAwAwBS_ACFAwAYAYAYAY_A_A__________ __________BsBsBsCFCFBsBs_A_AAYAwAwBS_ACFAwAwAYAYAY_A_A__________ __________BsBsCFBsCFBsBs_AAYAYAwBSBSBSCFAwAwAYAYAY_A_A__________ __________BsBsCFCFCFBs_A_AAYAwAwBSBSBS_ACFAwAYAYAY_A_A__________ __________BsBsCFCFBsBs_AAYAYAwAwBSBSBS_ACFAwAwAYAY_A_A__________ ____________BsCFCFBs_A_AAY_A_A_A_A_A_ABS_ACFAwAYAY_A_A__________ ______________CFCFBs_A_A_A_A_A_A_A_A_A_A_ACFAwAYAY_A_A__________ _______________ABsBs_A_A_A_A_A_A_A_A_A_A_ACFAYAY_A_A____________ _________________ABs_A_A_A_____________A_ACFAY_A_A______________ ___________________A_A_A_________________A_ACF_A________________ _____________________A_____________________A_A__________________ ________________________________________________________________ ________________________________________________________________ } # tile 128 (opera cloak / cloak of invisibility) { ________________________________________________________________ __________________________C$ClCO________________________________ ______________________ClC$C$C$C$ClCO____________________________ ______________________C$C$C$C$ClClClCl__________________________ ____________________C$C$C$_A_A_AClClClCO________________________ __________________C$C$C$_A_A_A_A_AClClCO________________________ __________________C$C$_A_A_A_A_A_A_AClClCO______________________ __________________C$C$C$_A_A_A_A_A_AClClCO______________________ __________________ClC$C$_A_A_A_A_A_AClCO________________________ ____________________C$C$C$_A_A_A_A_AClCO________________________ ____________________ClClClC$_A_A_AClClCO________________________ ________________ClClCIAzClClC$_AClClCIAzAzCO____________________ ______________ClClC$C$C$CIAzAzCIClCICOCOAzCO____________________ ______________ClC$C$C$C$C$C$Az_ACICIClClCOCOCO__________________ ____________ClC$C$C$C$C$C$CIC$Cl_ACICIClClClCOCO________________ ____________ClClC$C$C$C$C$C$C$Cl_A_AClClClClCOCO________________ ____________ClClC$C$C$C$C$C$C$Cl_A_A_AClClClClCOCO______________ ____________ClClC$C$C$C$C$C$C$Cl_A_A_A_AClClClClCO______________ ____________ClC$C$C$C$C$C$C$C$Cl_A_A_A_A_AClCOClCOCO____________ ____________ClC$C$C$C$C$C$C$C$C$Cl_A_A_A_AClClCOCOCO_A__________ __________ClC$C$C$C$C$C$C$C$C$C$Cl_A_A_A_AClClClClCO_A__________ __________ClC$C$C$C$C$C$C$C$C$C$Cl_A_A_A_A_AClClClCO_A__________ ________ClC$ClC$C$C$C$C$C$C$C$ClCl_A_A_A_A_AClClClCO_A__________ ________ClClC$C$C$C$C$C$C$C$C$C$Cl_A_A_A_A_AClCOClCOCO__________ ________ClC$C$C$C$C$C$C$CPC$C$ClCl_A_A_A_A_A_AClCOCOCO_A________ ________C$C$C$C$C$C$C$C$BkCPC$C$Cl_A_A_A_A_A_A_AClCOCO_A________ ______C$C$C$C$C$C$C$C$C$CPBnCoC$_A_A_A_A_A_A_A_AClClCO_A________ ______ClC$C$C$C$C$C$C$AlCJC$C$Cl_A_A_A_A_A_A_A_AClCOCO_A________ _______A_AC$ClClC$C$CPAlBnC$Cl_A_A_A_A_A_A_A_AClCOCO_A_A________ _________A_A_A_AClCl_ACPC$Cl_A_A_A_A_A_A_A_ACOCO_A_A_A__________ _______________A_A_A_A_A_A_A_A_A_A_A_ACO_A_A_A_A_A_A____________ _____________________A_A_A_A_A_A_A_A_A_A_A_A_A__________________ } # tile 131 (small shield) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________________AYAwAYAY__________________________________ ________________AYAwAYAYAwAYAYAAAYAA____________________________ ____________AYAwAYAwAYAYAwAYAYAAAJAAAYAA________________________ ____________AYAwAYAwAYAwAYAYAY_zAYAAAJAA_A______________________ ____________AYAwAYAwAYAwAYAYAAAYAAAXAAAY_A______________________ ____________AYAwAYAwAYAwAYAYAAAYAAAJAAAY_A______________________ ____________AYAwAYAwAYAwAYAY_LAYAAAYAAAJ_A______________________ ____________AYAwAYAwAYAwAYAYAAAYAAAJAAAY_A______________________ _____________AAwAYAYAwAYAwAYAY_zAAAYAA_A_A______________________ ______________AwAYAYAwAYAwAYAYAAAAAJAA_A________________________ _______________AAYAYAwAYAwAYAYAA_zAY_A_A________________________ ________________AYAwAYAwAYAYAY_NAAAY_A__________________________ _________________AAwAYAwAYAYAYAAAA_A_A__________________________ ___________________AAYAwAYAY_zAA_A_A____________________________ _____________________AAwAYAYAA_A_A______________________________ _______________________AAYAY_A_A________________________________ _________________________A_A_A__________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 132 (blue and green shield / elven shield) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ___________________________J_J_J_J_J_J_J________________________ ___________________K_K_K_J_J_J_J_J_J_J_J_H_H_G_G________________ _____________A_K_K_K_w_w_J_J_w_w_t_t_t_J_H_H_G_G_G_A____________ _____________A_K_K_K_K_K_w_w_w_w_t_t_J_J_H_H_G_G_G_A_A__________ _____________A_K_K_K_K_K_J_w_w_w_t_t_t_t_H_H_G_G_G_A_A__________ _____________A_K_K_K_K_K_J_w_w_J_t_t_t_J_H_H_G_h_h_A_A__________ _____________A_K_K_K_K_K_J_w_w_J_t_t_t_t_H_H_h_h_G_A_A__________ _____________A_K_K_K_K_K_J_J_J_J_t_t_t_J_H_H_h_h_h_A_A__________ _____________A_K_K_K_w_w_w_J_J_w_t_t_J_J_H_H_h_h_G_A_A__________ _____________A_K_K_w_w_K_w_w_w_w_t_t_t_J_H_H_h_h_h_A_A__________ _____________A_K_K_K_K_K_J_J_w_w_t_t_t_t_H_H_h_h_G_A_A__________ _____________A_K_K_K_w_w_w_w_w_w_t_t_t_t_m_H_h_h_G_A_A__________ _____________A_K_K_K_w_K_J_J_J_w_t_t_t_t_m_m_h_G_G_A_A__________ _____________A_K_K_w_w_K_J_J_J_J_t_t_t_t_m_m_G_G_G_A_A__________ _____________A_A_K_K_K_K_J_J_J_w_t_t_t_m_H_G_G_G_A_A_A__________ _______________A_K_K_K_K_J_J_w_J_J_J_t_m_H_G_G_G_A_A_A__________ _______________A_K_K_K_K_K_w_w_J_J_J_t_m_H_G_G_G_A_A____________ _______________A_A_K_K_K_K_t_J_J_J_t_m_H_G_G_G_A_A_A____________ _________________A_A_K_K_K_J_J_J_J_t_H_H_G_G_A_A_A______________ ___________________A_A_K_K_K_J_J_J_t_H_G_G_A_A_A________________ _____________________A_A_K_K_K_J_J_t_G_G_A_A_A__________________ _______________________A_A_A_K_J_J_J_G_A_A_A____________________ ___________________________A_A_A_J_A_A_A_A______________________ _______________________________A_A_A_A__________________________ ________________________________________________________________ } # tile 133 (white-handed shield / Uruk-hai shield) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________________________AO________________________________ ______________________________AO________________________________ ____________________________AeAOAB______________________________ ______________________AOAOAOAeAOABABABABAB______________________ ________________AOAOAOAOAOAOAeAOABABABABABABABAB________________ ______________AOAOAOAOAOAOAOAeAOABABABABABABABABAB______________ ____________AOAOAOAeAOAOAeAeAOAOABAOABABABABABABABAB____________ __________AOAOAOAeAOAeAeAeAOAeAOABAOABABABABABABABABAB__________ ________AOAOAOAeAOAeAeAeAeAOAeAOAOABAOABABABABABABABAB_A________ ________AOAOAOAeAOAeAeAeAOAeAOAOAOAOABAOABABABABABABABAB_A______ ________AOAOAeAOAeAeAeAeAOAeAOAOAOAOABAOABABABABABABABAB_A______ _________AAOAeAOAeAeAeAeAOAeAOAOAOAOABAOABABABABABABAB_A________ ___________AAeAOAeAeAeAeAOAeAOAOAOAOAOABAOABABABABAB_A__________ _____________AAOAeAeAeAOAOAeAOAOAOAOAOABAOABABABAB_A____________ _______________AAeAeAeAOAOAeAOAOAOAOAOABAOABABAB_A______________ _________________A_A_AAOAOAeAOAOAOAOAOABAO_A_A_A________________ _______________________A_A_A_A_A_A_A_A_A_A______________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 134 (red-eyed shield / orcish shield) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________AOAOAqAqAqAqABAB________________________ __________________AOAOAOBNBNAq_A_AAqAqAqABABAB__________________ ______________AOAOAOBoBoBoBN_A_A_A_AAqAqAqAqABABAB______________ ____________AOAOAOAeAOBoBoBNBN_A_AAqAqAqAqABABABABAB____________ __________AOAOAOAeAOAeAeAeBoBNBNBNAqAqABABABABABABABAB__________ ________AOAOAOAeAOAeAeAeAeAOAeAOAOABAOABABABABABABABABAB________ ________AOAOAOAeAOAeAeAeAeAOAeAOAOAOABAOABABABABABABABAB_A______ ________AOAOAeAOAeAeAeAeAOAeAOAOAOAOABAOABABABABABABABAB_A______ _________AAOAeAOAeAeAeAeAOAeAOAOAOAOABAOABABABABABABAB_A_A______ ___________AAeAOAeAeAeAeAOAeAOAOAOAOAOABAOABABABABAB_A_A________ _____________AAOAeAeAeAOAOAeAOAOAOAOAOABAOABABABAB_A_A__________ _______________AAeAeAeAOAOAeAOAOAOAOAOABAOABABAB_A______________ _________________A_A_AAOAOAeAOAOAOAOAOABAO_A_A_A________________ _______________________A_A_A_A_A_A_A_A_A_A______________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 135 (large shield) { ________________________________________________________________ __________________________________________________BkBk__________ __________________________________________CPCPBkCPBkBkBJ________ ____________________________________CPCVBkCPBkCBCBBNAjAl________ __________________________________CPBkCPCBCBCBCBBNBNAlBJ_A_A_A__ ________________________________CPCBCBCuCuCBCBBNBNBNAlAl_A_A_A__ ______________________________CPBoCuCuCuCBCBBNBNBNBNAlAlAl_A_A__ ____________________________CPCBCuCuCuCBCBBNBNBNBNBNATAlAlAe_A__ __________________________CPBoCuCuCuCBCBBNBNBNBNBNATBNAlAeAe_A_A ________________________CPCBCuCuCuCBCBBNBNBNBNBNATBNATATAeAlBJ_A ______________________BkCBCuCuCuCBCBBNBNBNBNBNATBNATATATATAjAe_A ____________________BkCBCuCuCuCBCBBNBNBNBNBNATBNATATATATATAeBJ_A ____________________BnCuCuCuCBCBBNBNBNBNBNATBNATATATATATAeAlAl_A __________________BkCBCuCuCBCBBNBNBNBNBNATBNATATATATATAeAlAl_A_A ________________BkCYCuCuCBCBBNBNBNBNBNATBNATATATATATAeAlAe_A_A__ ______________BnCBCuCuCuCBBNBNBNBNBNATBNATATATATATAeAeAl_A_A____ ______________BkCuCuCuCBBNBNBNBNBNATBNATATATATATAeAeAl_A_A______ ____________CPCBCuCuCBBNBNBNBNBNATBNATATATATATAlAeAl_A_A________ __________CPCBCuCuCBBNBNBNBNATATBNATATATATATAlAlAe_A_A__________ __________CPCBCuCBBNBNBNBNATBNBNATATATATATAlAlAe_A_A____________ ________CPCBCuCuBNBNBNBNATBNATATATATATATAlAlAe_A_A______________ ________CmCBCuCBBNBNBNATBNATATATATATAeAlAlAe_A_A________________ ______CmCBCuCBBNBNATATBNATATATATATAeAlAl_A_A_A__________________ ______CmCBCuBNATATBNBNATATATATAeAeBJAl_A_A______________________ ____CmCuCuATATBNBNATATATATAeAeAeAl_A_A_A________________________ ____CPCuATBNBNATATATAlAeAeAeAe_A_A_A____________________________ ____CPCuBNATATAlBJAlAeAeAe_A_A_A________________________________ ___ABdBDAlBDAlAlAeAeAe_A_A_A____________________________________ ___ABJAlAlAlAeAe_A_A_A_A________________________________________ ___A_A_B_A_A_A_A_A______________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 136 (large round shield / dwarvish roundshield) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________BkCPBkBnCJBk__________________________ ______________________CPCPCVBkCVBkBdBdBdBd_A____________________ ____________________CPCPCPCPBsBsBsBsBdBdBdBd_A__________________ __________________CPCPCPBsBsBsBsBSBSBSBSBdBdBJ_A________________ __________________CPCPBsBsBsBsBSBSBSBSBSBSBdAj_A_A______________ ________________BkCPCPBsBsBsBSBSBSBSBSBSAwBDAlBJ_A______________ ________________CPBkBsBsBsBSBSBSBSBSBSBSAwAwBJAj_A_A____________ ________________BkCVBsBsBsBSBSBSBSBSBSAwAwAwAlBJ_A_A____________ ________________BnCJBsBsBsBSBSBSBSBSAwAwAwAwBDAl_B_A____________ ________________BkBdBsBsBSBSBSBSBSBSAwAwAwAwAlBD_A_A____________ ________________BkBkBdBsBSBSBSBSBSBSAwAwAwBDAlBD_A_A____________ __________________BdBdBsBSBSBSBSBSAwAwAwAwAlBJ_A_A_A____________ __________________BdBdBdBSBSBSAwAwAwAwAwBDAlBD_A_A______________ ____________________BdBdBdBJAwAwAwAwAjBJAlBD_A_A________________ _____________________ABJAjAlBDAlBDAlBJAlBD_A_A_A________________ _______________________A_zAlBDAlBDAlBD_A_A_A_A__________________ ___________________________A_A_A_A_A_A_A_A_A____________________ _______________________________A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 137 (polished silver shield / shield of reflection) { ________________________________________________________________ ____________________________BkCPBkBk____________________________ ______________________C$BkC$BkBkCPBkBDBkBD______________________ ________________BkC$C$C$BkC$BkCPBkBkBDBkAlBDAlBJ________________ ____________BkC$BkC$C$C$BkC$BkBkCPBkBDBkBDAlBDAjAlBD____________ ____________BkC$BkC$C$C$BkC$BkCPBkBkBJBlBJAjBJAlBDAl____________ ____________CPC$BkC$C$C$BkC$BkBkCPBkBDBkBJAlBDAlBDAl_z_A________ ____________BkC$BkC$C$C$BkC$CJBnCJBkAjCJAjBDAlBDAlBD_A_A_A______ ____________BkC$BkC$C$C$BkC$BkBkBnCJBDBkBDAlBDAlBDAl_A_A_A______ ____________BkC$BkC$C$C$BkC$CJBnCJBMBJBlAlBDAlBDAlBD_A_A_A______ ____________CJC$BkC$C$C$BkC$BkBkBnCJAjCJBDAlBDAlBDAl_A_A_A______ ____________BkC$BkC$C$C$BkC$CJBnCJBkBDBmAlBDAlBJAjBJ_A_A_A______ ____________BkC$BkC$C$C$BkC$BkBkBnBkBDBkBDAlBDAlBDAl_B_A_A______ ____________BkC$BkC$C$C$BkC$COBlCJBDBkBDAlBDAlBDAlBJ_A_A_A______ ____________CPC$BkC$C$C$BkC$BkBmBkBDBkBDAlBDAlBDAlBD_A_A_A______ ______________C$BkC$C$C$BkC$BmCKBkBJBlAlBDAlBDAlBD_A_A_A_A______ ______________BkC$BkC$C$BkC$BkBlCOAjCJBDAlBDAlBDAl_A_A_A_A______ ________________C$BkC$C$C$BkC$CJBkBDBkAlBDAlBDAl_A_A_A_A_A______ ________________C$BkC$C$C$BkC$BkBnBJBlBJAjBJAlBD_A_A_A_A________ __________________C$BkC$C$BkC$CKBkBJBkAlBDAlBD_A_A_A_A_A________ __________________C$BkC$C$BkC$BkBmBDBkBDAlBDAl_A_A_A_A__________ ____________________C$BkC$BkC$CJBlBJBlBJAjBJ_A_A_A_A____________ ______________________C$C$C$C$BkBmCJAjBJAl_B_A_A_A______________ ________________________BkC$C$BnCJBlAlBD_A_A_A_A________________ __________________________BkC$BkBmCJAj_A_A_A_A__________________ ____________________________BkC$CKBk_A_A_A_A____________________ ______________________________BkBm_B_z_A_A______________________ _________________________________z_A_A_A________________________ _________________________________B_A____________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 138 (old gloves / leather gloves) { ________________________________________________________________ ________________________________________________________________ ___________________________________________________A_A_A________ __________________________________________AwAY_A_AAwAY_A________ ____________________________Aw__________AwAYAY_AAwAYAY_A_A______ __________________________AwAwAY______AwAYAYAAAwAYAYAA_A_A______ __________________________AwAwAY____AwAYAYAAAwAYAYAAAwAY_A______ __________________________AwAwAY__AwAwAwAAAwAYAJAAAwAYAY_A______ __________________________AwAwAYAwAwAwAwAYAYAYAAAwAJAYAA_A______ __________________________AwAwAwAwAwAwAYAY_zAAAwAYAYAA_A_A______ __________________________AwAwAwAwAwAYAYAYAYAYAYAYAAAwAY_A______ __________________________AwAwAwAwAYAYAYAYAYAY_zAAAwAJAA_A______ __________________________AwAwAYAYAYAYAYAYAYAAAA_NAYAA_A_A______ ____________________AwAwAwAAAwAYAYAYAYAYAAAAAA_zAAAA_A_A________ ________________AwAwAwAwAwAYAAAYAYAYAA_LAA_zAAAA_L_A_A__________ ______________AwAwAwAwAwAYAYAY_LAAAA_zAAAAAA_A_A_A_A____________ ____________AwAwAwAwAYAYAYAYAYAAAA_LAAAA_A_A_A_A_A______________ __________AYAwAwAwAYAYAYAYAYAA_zAA_A_A_A_A_A_A__________________ __________AYAwAwAYAYAYAYAYAA_LAA_A_A_A_A_A______________________ ____________AAAYAYAYAYAY_zAAAA_A_A_A_A__________________________ ____________AAAYAYAYAYAAAAAA_z_A_A_A____________________________ _____________AAAAYAYAAAA_LAA_A_A_A______________________________ _____________A_AAA_zAA_zAA_A_A_A_A______________________________ _______________A_A_A_AAA_A_A_A_A________________________________ _________________A_A_A_A_A_A_A__________________________________ ___________________A_A_A_A______________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 139 (padded gloves / gauntlets of fumbling) { ________________________________________________________________ ________________________________________________BsBS_A_ABsBS_A_A __________________________________Bs__________BsBSBS_ABsBSBS_A_A ________________________________BsBsBS______BsBSBSAwBsBSBSAw_A_A ________________________________BsBsBS____BsBSBSAwBsBSBSAwBsBS_A ________________________________BsBsBS__BsBsBsAwBsBSBSAwBsBSBS_A ________________________________BsBsBSBsBsBsBsBSBSBSAwBsBSBSAw_A ________________________________BsBsBSBsBsBsBSBSAwAwBsBSBSAw_A_A ________________________________BsBsBSBsBsBSBSBSBSBSBSBSAwBsBS_A ________________________________BsBsBSBsBSBSBSBSBSBSAwAwBsBSAw_A ________________________________BsBsBSBSBSBSBSBSBSAwAwAwBSAw_A_A __________________________BsBsBsAwBsBSBSBSBSBSAwAwAwAwAwAw_A_A__ ______________________BsBsBsBsBsBSAwBSBSBSAwAwAwAwAwAwAw_A_A____ ____________________BsBsBsBsBsBSBSBSAwAwAwAwAwAwAw_A_A_A_A______ ________________BSBsBsBsBsBSBSBSBSBSAwAwAwAwAw_A_A_A_A_A________ ______________CYBSBsBsBsBSBSBSBSBSAwAwAY_A_A_A_A_A_A____________ ____________CYCYBSBsBsBSBSBSBSBSAwAwAY_A_A_A_A_A________________ __________CYCYCYCBAwBSBSBSBSBSAwAwAY_A_A_A_A____________________ __________CYCYCBCBAwBSBSBSBSAwAwAYAY_A_A_A______________________ __________CYCBCBCBBoAwBSBSAwAwAYAY_A_A_A________________________ ___________ACBCBBoBoBoAwAwAwAYAY_A_A_A_A________________________ ___________ABoBoBoBoBNBNAqAqAY_A_A_A_A__________________________ ___________A_ABoBoBNBNBNAqAq_A_A_A_A____________________________ _____________A_ABoBNBNAqAq_A_A_A_A______________________________ _______________A_A_A_A_A_A_A_A_A________________________________ _________________A_A_A_A_A_A____________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 140 (riding gloves / gauntlets of power) { ________________________________________________________________ ________________________________________________CmBk_A_ACPBk_A_A __________________________________Bk__________CmBkBk_ACPBkBk_A_A ________________________________CPBnBd______CoBkBdAeCVBkBdAe_A_A ________________________________CPCJBd____CmBkBkAeCPBkBkAeCPBk_A ________________________________CPBkBd__CVBkBdAeCVBkBdAeCVBkBk_A ________________________________CPBnBkCPCmCPBkBkBkBkAeCPBkBkAe_A ________________________________CPBkCJCmCPCPBkBdBdBkCVBkBdAe_A_A ________________________________CPBnCmCPBkBkBkBdBdBdBdBdAeCPBk_A ________________________________CPCmBkBkCPBdBdBdBdBdAjBJCVBkAe_A ________________________________CPCJBnBdBdBdBdBdBdBJAeAeBkAl_A_A __________________________CPCmCPBDBkBdBdBdBdBdBDAlAeAeAeAe_A_A__ ______________________CPCmCmCPBkBdBDBdBdBdAlBJAeAeAeAeAe_A_A____ ____________________CPCmCPCPBkBdBdBDBDAlBJAeAeAeAe_A_A_A_A______ ________________CPCmCmCPBkBkBkBdBdBdBJAjAeAeAe_A_A_A_A_A________ ______________CPCmCPCPCPBkBdBdBdBDAlAeAe_A_A_A_A_A_A____________ ____________CPCmCPBkBkBkBkBdBdBJAlAeAe_A_A_A_A_A________________ __________CPCmCPBnBkCPBdBdBdBJAjAeAe_A_A_A_A____________________ __________CmCPBkCJBkBdBdBdAlBDAeAeAe_A_A_A______________________ __________CPBkCJBnBdBdBdAjBJAeAeAe_A_A_A________________________ ___________ABnBkBdBdBdBJAlAeAeAe_A_A_A_A________________________ ___________zBkCJBdBdAlBDAeAeAe_A_A_A_A__________________________ _____________MBdBdBDAlAeAeAe_A_A_A_A____________________________ _____________ABdBdBDAeAeAe_A_A_A_A______________________________ _____________A_A_AAlAeAe_A_A_A_A________________________________ _______________A_A_A_A_A_A_A_A__________________________________ ___________________A_A_A_A_A____________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 141 (fencing gloves / gauntlets of dexterity) { ________________________________________________________________ ________________________________________________BsBS_A_ABsBS_A_A __________________________________Bs__________BsBSBS_ABsBSBS_A_A ________________________________BsBsBS______BsBSBSAwBsBSBSAw_A_A ________________________________BsBsBS____BsBSBSAwBsBSBSAwBsBS_A ________________________________BsBsBS__BsBsBsAwBsBSBSAwBsBSBS_A ________________________________BsBsBSBsBsBsBsBSBSBSAwBsBSBSAw_A ________________________________BsBsBSBsBsBsBSBSAwAwBsBSBSAw_A_A ________________________________BsBsBSBsBsBSBSBSBSBSBSBSAwBsBS_A ________________________________BsBsBSBsBSBSBSBSBSBSAwAwBsBSAw_A ________________________________BsBsBSBSBSBSBSBSBSAwAwAwBSAw_A_A __________________________BsBsBsAwBsBSBSBSBSBSAwAwAwAwAwAw_A_A__ ______________________BsBsBsBsBsBSAwBSBSBSAwAwAwAwAwAwAw_A_A____ ____________________BsBsBsBsBsBSBSBSAwAwAwAwAwAwAw_A_A_A_A______ ________________BSBsBsBsBsBSBSBSBSBSAwAwAwAwAw_A_A_A_A_A________ _______________JBSBsBsBsBSBSBSBSBSAwAwAY_A_A_A_A_A_A____________ _____________J_JBSBsBsBSBSBSBSBSAwAwAY_A_A_A_A_A________________ ___________J_J_J_IAwBSBSBSBSBSAwAwAY_A_A_A_A____________________ ___________J_J_I_IAwBSBSBSBSAwAwAYAY_A_A_A______________________ ___________J_I_I_I_HAwBSBSAwAwAYAY_A_A_A________________________ ___________A_I_I_H_H_HAwAwAwAYAY_A_A_A_A________________________ ___________A_H_H_H_H_G_G_F_FAY_A_A_A_A__________________________ ___________A_A_H_H_G_G_G_F_F_A_A_A_A____________________________ _____________A_A_H_G_G_F_F_A_A_A_A______________________________ _______________A_A_A_A_A_A_A_A_A________________________________ _________________A_A_A_A_A_A____________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 142 (walking shoes / low boots) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________CFCF____BsBs__________________________ ________________________CFCF_ACFCFBsBsBs________________________ ______________________CFCF_A_A_A_A_A_ABsBs______________________ ______________________CF_A_A_A_A_ACFBsBsBs______________________ ______________________CFCF_A_ACFCFCFBsBS________________________ ________________________CFBsBsCFBSBSBSBsBsBsBsBs________________ __________________________BsCFBsCFCFCF_A_A_A_ABsBs______________ __________________________CFBsCFCF_A_A_A_A_A_A_ABs______________ __________CzCFCFCF__CFCFCrCrBsCFCF_A_A_A_A_ABsBsBs______________ ________CzCFCFCFCFCFCFCrCFCFCrBSCFCF_A_ABsCFCFBsBs______________ ______CFCFCFCFCFCFCFCFCFCrBsBs_ACFCF_A_ACFCFCFBs________________ ______BsCFCFCFCFCFCFCFCFBsBSBS_ACFCFBsBsCFCFBsBs________________ ______BsBsCFCFBsBsBSBSBSBSBSCrCrCFCFBsCFCFCFCFBs_A_A____________ ______BSBsBsBsBSAwCzCzCcCrCrCFCrCrCFCFCFCFCFCFBsBs_A_A__________ ________BSBSBSAwCzCFCFCFCFCrCrCFCrCFCFCFCFCFCFBsBs_A_A_A________ _________AAwAwCzCFCFCFCFCFCFCFCrCFCFCFCFCFBsBsBsBS_A_A_A_A______ ___________A_ABsCFCFCFCFCFCFCFCFCFBsBsBsBSBSBsBSBS_A_A_A_A______ _____________ABSBsBsCFCFCFCFCFBsBsBsBSBSBSBSBSBSAw_A_A_A_A______ _____________AAwBSBSBSBsBsBsBsBsBSBSBS_A_A_AAwAw_A_A_A_A________ ______________AwAwAwBSBSBSBSBSBSAw_A_A_A_A_A_A_A_A_A_A_A________ _______________AAwAwAwAwAwAwAwAw_A_A_A_A_A_A_A_A_A_A_A__________ _________________A_AAwAwAw_A_A_A_A_A_A_A_A_A_A_A________________ ___________________A_A_A_A_A_A_A_A______________________________ _______________________A_A_A_A__________________________________ ________________________________________________________________ } # tile 143 (hard shoes / iron shoes) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________________BnBnBMBMBM__________________________ __________________________BM_A_A_A_ABMBM________________________ ________________________Cm_A_A_A_A_A_A_ABM______________________ ________________________BMBM_A_A_A_ABDBMBMBMBMBM________________ ________________________BnBMBMBM_AAiBn_A_A_A_ABMBM______________ ________________________BMBnBMAiBdBM_A_A_A_A_A_ABMBM____________ ________________________ASBMBMBMBDBF_A_A_A_A_A_ABMBM____________ __________________________BMBMBMAiCmBM_A_A_A_ABMBMBM____________ __________________________BDBMASBdBMBMBMBMBMBMBMBMBD____________ __________________________BnASBdBMAiBnBMBMBMBMBFBdAi_A__________ ________________________BnCmBFASAiBMBdBFBMBMBMAiBdAS_A__________ ______________________BMBMBMBMBMASBdBFBdAiBDASBdBMAi_____A_A____ ______________BnBnBMASBDBFBMBMBMAiBdAiASASASASBFBMBd___A_A_A_A__ ____________BMBMBMBMBFASAjAiBMASBdBnBnBMASBMBMBMAiAS_A_A_A_A_A_A __________BMCmBMBMBMBMBMBFASASBDCmBnBFBMBMAiBdBMASAS_A_A_A_A_A_A __________BMBMBMBMBMBMBMAiBDAjAiBFBFBMBMBMBMASASAiBD_A_A_A_A_A_A __________BDBFBMBMBMBMBdBnBnBFASBdBFBMBMBMASASBMBMBd_A_A_A_A_A_A __________BdAiBMBFBdAiCmBnBMBMBFASASASBFBdASBMBMAiAS_A_A_A_A____ __________ASBdAiBdAiBMBMBMBMBMBMBMBMAiASASAiBMBdBdAi_A_A_A_A____ ___________AASASAiBdBMBMBMBMBMBMBMBMBMBMASASBdAiAiBd_A_A_A______ _____________A_A_AASBDBFBMBMBMBMBMBMBdAiBdASASASBd_A_A_A________ _________________A_ABdAiBMBMBMBMBFBdAiBDAS_A_A_A_A_A_A__________ ___________________AASBdAiBdBFBDAiBdAiBd_A_A_A_A_A______________ _____________________AASAiBdAiBdAiBdAiAS_A_A_A__________________ _____________________A_A_AASASAiAjAS_A_A_A_A____________________ _______________________A_A_A_A_A_A_A_A_A_A______________________ ___________________________A_A_A_A_A_A__________________________ ________________________________________________________________ } # tile 144 (jackboots / high boots) { ______________________CLCLCLCLCLCLCLBb__________________________ ____________________CL_A_A_A_A_A_A_A_ACL________________________ __________________CL_A_A_A_A_A_A_A_ACrCrCrCrCrCLCLCLCL__________ __________________BbCL_A_A_A_A_A_ACrCr_A_A_A_A_A_A_ACLBb________ __________________CLCLCLCLCLCLCLCrCt_A_A_A_A_A_A_A_A_ACLCL______ __________________BvCLCLCrCrCLBbCrCt_A_A_A_A_A_A_A_A_ACUBZ______ __________________BzCLCLCrCrCLCLCrCtCt_A_A_A_A_A_A_ACLCLCL______ ____________________CLCLCLCLCLBvCrCtCtCtCtCtCrCrCrCLCLCLBb______ ____________________AvBbCLCLCLBbCrCtCtCtCtCtCtCrCrCLCLCLCL______ ____________________AwAvAYAYAYAvCrCrCtCtCrCtCrCrCrCLCLCLBv______ ____________________AwBSAwAYAYAYAYCrCrCrCtCrCrCrCrCLCLBb________ ____________________AwBSBSBSAwAYAYAwCrCrCrCrCrCrCLCLCLAv________ ____________________AwBSBsBSAwAYAwBSAwAwAwAwAwAYAYAYAYAY________ ____________________AwBSBsBSAwAYAwBSBSBSBSBSBSAwAwAYAYAY________ ____________________AwBSBsBSAwAYAwBSBsBSBSBSBSAwAwAwAYAY________ __________________AwAwBSBSBSAwAYAwBsBsBsBsBSBSBSAwAwAYAY________ __________________AwCPCPBSBSAwAYAwBsCFCFBsBsBSBSAwAwAYAY________ ______________BSBSAwCPCPAwAwAwAYAwBsCFCFCFBsBSBSAwAwAYAY________ __________AwBSBSBSBSBSAwAwAwAYAYBSCFCFCFCFCFBSBSAwAwAYAY_A_A____ ________AwBSBsBsBSBSBSAwAwAYAYAYBSCFCFCFCFBsBSBSAwAwAYAY_A_A_A_A ______AwBSBsBsBsBsBSAwAwAwAYAYAYCoBSCFCFBsBsBSBSAwAwAYAY_A_A_A_A ______AwBSBsBsBsBSBSAYAYBSBSBSCoCPCPBSBsBsBSBSAwAwAwAYAY_A_A_A_A ______AwBSBSBSBSAwAwAYBSBsBsBsBSCPAwAwBSBSBSBSAwAwAwAYAY_A_A_A_A ______AwAwAwAwAwAwAYBSBsCFCFBsBsBSAwAwAwBSBSAwAwAwAwAYAY_A_A_A_A ______AYAwAwAwAYAYAYBsCFCFCFCFBsBsBSAwAwAwAwAwAwAwAwAYAY_A_A_A__ ________AYAYAYAYAYBSBsCFCFCFCFBsBsBSAwAwAwAwAwAwAwAwAYAY_A_A____ ___________A_A_A_ABSBSBsCFCFBsBsBSBSBSAwAwAwAw_AAwAwAw_A_A______ __________________AwBSBSBsBsBsBSBSBSAwAwAwAw_A_A_A_A_A_A________ __________________AwAwBSBSBSBSBSAwAwAwAw_A_A_A_A_A_A____________ ___________________AAwAwAwAwAwAwAwAw_A_A_A_A_A_A________________ _____________________AAwAwAwAw_A_A_A_A_A_A_A____________________ _________________________A_A_A_A_A_A_A__________________________ } # tile 145 (combat boots / speed boots) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________________AwAwAwAwAwAwAYAY__________________________ ____________________Aw_A_A_A_A_A_A_A_AAY________________________ __________________Aw_A_A_A_A_A_A_A_ABsBsBsBsBsBSBSBSAw__________ __________________AwBS_A_A_A_A_A_ABsBs_A_A_A_A_A_A_ABSAw________ __________________AwBSBSBSBSBSAwBsCF_A_A_A_A_A_A_A_A_ABSAw______ __________________AwBSBSBsBsBSAwBsCF_A_A_A_A_A_A_A_A_ABSAw______ __________________AwBSBSBsBsBSAwBsCFCF_A_A_A_A_A_A_ABSBSAw______ ____________________AwBSBSBSBSAwBsCFCFCFCFCFBsBsBsBSBSBSAw______ ____________________BkAwBSBSAwAwBsCFCFCFCFCFCFBsBsBSBSBSAw______ ____________________BkBDBDBDBDBDBsBsCFCFBsCFBsBsBsBSBSAwAw______ ____________________BkCPBkAeBDBDBDBsBsBsCFBsBsBsBsBSBSAw________ ____________________AeAeAeCPBkBDBDBkBsBsBsBsBsBsBSBSBSBD________ ____________________BkCJCPBnBkBDAlCPBkBkBkBkBkBDBDBDBDBD________ __________________BkAeAeAeCJBkBDBkAlC$C$CPCPAeCPBkBkBDBD________ ______________CPCPBkBnCPBkBkBkBDBkCPAjBJAeAeCJBnBkBkBDBD________ __________BkCPBkCPCJCPBdBkBkBDBDCPC$C$C$C$C$CPCJBkBkBDBD_A_A____ ________BkCPCPCPCJBnCPBkBkBDBDBDAlCPC$C$C$AOCPBnBkBkBDBD_A_A_A_A ______BkCPCPCPCPCPCPBdBkBkBDBDBDCPAlBJAjAeCPCPCJBkBkBDBD_A_A_A_A ______BkBkCPCPCVBkCPBDBDCKBnCPCOBlCPCPCPCPCJBnBkBkBkBDBD_A_A_A_A ______BkCPCPBkCPBkBkBDCPCPCPCPCKCOBnCJBnCPCPCPBdBkBkBDBD_A_A_A_A ______BkBkBkBkBkBkBDCKBmC$C$CPCPBnCKCPCJCPBkBkBkBkBkBDBD_A_A_A_A ______BDBkBkBkBDBDBDCPC$C$C$C$CPCPCOBnCPBlBkBkBkBkBkBDBD_A_A_A__ ________BDBDBDBDBDCPCPC$C$C$C$CPCPCPBkCPCOBkBkBkBkBkBDBD_A_A____ ___________A_A_A_ABnCJCPC$C$CPCPCPBkCPBkBkBkBk_ABkBkBk_A_A______ __________________BwBnCPCPCPCPBmCKCPBkBkBkBk_A_A_A_A_A_A________ __________________BkBkCOBlCPCPCKBLBkBkBk_A_A_A_A_A_A____________ ___________________ABkBkBkBdBkBkBkBk_A_A_A_A_A_A________________ _____________________ABkBkBkBk_A_A_A_A_A_A_A____________________ _________________________A_A_A_A_A_A_A__________________________ } # tile 146 (jungle boots / water walking boots) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________________AeAeAeAeAeAe_A_A__________________________ ____________________Ae_A_A_A_A_A_A_A_A_A________________________ __________________AeAe_A_A_A_A_A_A_ABkBkBkBkBkAlAlAlAe__________ __________________AeAl_A_A_A_A_A_ABkBk_A_A_A_A_A_A_AAlAe________ __________________AeAlAlAlAlAlAeBJBk_A_A_A_A_A_A_A_A_AAlAe______ __________________AeAlAlBJAlAlAeAjBk_A_A_A_A_A_A_A_A_AAlAe______ __________________CLAlAlAlBDAlAeBJBkBk_A_A_A_A_A_A_AAlAlAe______ ____________________CLAlAlAlAlAeAlBkBkBkBkBkBJAjBJAlAlAlAe______ _____________________mCLCrCrCLCLBDBkBkBkBkBkBdBDAlAlAlAlAe______ _____________________m_h_h_h_h_hCtAlBkBkBJBkAjBJAlAlAlAeCL______ _____________________m_q_m_h_h_h_hCtBJAjBkAlBDAlBDAlAlCL________ _____________________m_q_q_q_m_h_h_mCtCtCtCtCtCtCrCrCr_h________ _____________________m_q_t_q_m_h_m_q_m_m_m_m_m_h_h_h_h_h________ ___________________m_q_q_q_q_m_h_m_tBgBg_t_t_q_q_m_m_h_h________ _______________q_q_m_q_q_m_m_m_h_m_tBgBgBg_t_q_q_m_m_h_h________ ___________m_q_q_q_q_q_m_m_m_h_h_qBgBgBgBgBg_q_q_m_m_h_h_A_A____ _________m_q_t_t_q_q_q_m_m_h_h_h_qBgBgBgBg_t_q_q_m_m_h_h_A_A_A_A _______m_q_t_t_t_t_q_m_m_m_h_h_h_q_qBgBg_t_t_q_q_m_m_h_h_A_A_A_A _______m_q_t_t_t_q_q_h_h_q_q_q_q_q_q_q_t_t_q_q_m_m_m_h_h_A_A_A_A _______m_q_q_q_q_m_m_h_t_t_t_t_q_q_q_q_q_q_q_q_m_m_m_h_h_A_A_A_A _______m_m_m_m_m_m_h_t_tBgBg_t_t_q_q_q_q_q_q_m_m_m_m_h_h_A_A_A_A _______h_m_m_m_h_h_h_tBgBgBgBg_t_t_q_q_q_q_m_m_m_m_m_h_h_A_A_A__ _________h_h_h_h_h_q_tBgBgBgBg_t_t_q_q_q_q_m_m_m_m_m_h_h_A_A____ ___________A_A_A_A_q_q_tBgBg_t_t_q_q_q_m_m_m_m_A_m_m_m_A_A______ ___________________m_q_q_t_t_t_q_q_q_m_m_m_m_A_A_A_A_A_A________ ___________________m_m_q_q_q_q_q_m_m_m_m_A_A_A_A_A_A____________ ___________________A_m_m_m_m_m_m_m_m_A_A_A_A_A_A________________ _____________________A_m_m_m_m_A_A_A_A_A_A_A____________________ _________________________A_A_A_A_A_A_A__________________________ } # tile 147 (hiking boots / jumping boots) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ _________________________G_G_G_G_G_G____________________________ _______________________G_A_A_A_A_A_A_G__________________________ _____________________G_A_A_A_A_A_A_A_A_G________________________ _____________________G_G_A_A_A_A_A_A_G_G_J_J_J_I_I_H_G__________ _____________________H_G_G_G_G_G_G_G_G_J_A_A_A_A_A_A_A_G________ ____________________Bk_H_H_H_H_H_H_G_J_A_A_A_A_A_A_A_A_A_G______ _____________________HCPBk_H_H_H_G_G_J_J_A_A_A_A_A_A_A_G_G______ _____________________H_H_H_H_G_G_G_G_J_J_I_I_H_H_H_H_H_G_G______ __________________Bk_H_H_H_H_G_G_G_GCm_J_J_I_I_H_H_H_H_G_G_A____ _________________H_HBkCP_H_H_G_G_G_G_JCmCmBk_I_I_I_H_G_G_G_A_A__ _____________H_H_H_H_H_H_H_G_G_GCm_J_J_J_J_J_J_I_I_H_H_G_G_A_A__ ___________H_I_I_I_H_H_H_H_G_J_J_JCmBk_J_J_J_J_I_H_H_H_G_G_A_A__ _________H_I_I_I_I_I_H_H_H_J_J_J_J_J_J_J_J_J_I_I_H_H_G_GBk_A_A__ _________H_H_I_I_I_H_H_G_J_J_J_J_J_J_J_J_J_I_I_H_H_H_GBk_M_z____ _______A_G_H_H_H_H_H_H_G_J_J_J_J_J_J_J_J_I_I_I_H_H_GBk_z_A______ _____A_A_G_H_H_H_H_H_G_G_I_I_J_J_J_J_I_I_I_I_I_H_HBk_M_A_A______ _____A_ABk_G_G_G_G_G_G_G_I_I_I_I_I_I_I_I_I_H_H_HBk_M_z_A________ _____A_A_ABkCPCVCmCmBkBk_I_I_I_I_I_I_I_I_H_H_HCm_z_A_A__________ _______A_A_A_A_A_A_A_M_ACPBk_I_I_J_H_H_H_HCmCm_A_A_A____________ ___________A_A_A_A_A_A_A_A_A_ACmCmCmCmCmCm_A_A_A_A______________ _______________________A_A_A_A_A_A_A_A_A_A_A_A_A________________ _______________________________A_A_A_A_A_A_A_A__________________ ________________________________________________________________ } # tile 148 (mud boots / elven boots) { ________________________________________________________________ ________________________________________________________________ ______________________CLCLCLCLBbCLBZ____________________________ ____________________CL_A_A_A_A_A_A_zCL__________________________ __________________CL_A_A_A_A_A_A_A_ACrCrCrCrCrCrCfCf____________ __________________Cf_A_A_A_A_A_A_ACr_A_A_A_A_A_A_A_ACf__________ __________________CLCf_A_A_A_A_ACr_A_A_A_A_A_A_A_A_A_ACL________ __________________CLCLCfCfCLCLCLCr_A_A_A_A_A_A_A_A_A_zBb________ __________________CLCLCLCLCLBbCLCfCr_A_A_A_A_A_A_A_ACLCL________ __________________CLCfCPCLCLCLBZCfCfCrCrCrCrCfCfCfCLCLBZ________ __________________CLCfCPCLCLCLCLCfCfCfCfCLCLCLCLCLCLBZCL________ __________________CLC$CfC$CPCLBZCfCfCfCPCfCfCfCUBZCLBZCL________ __________________CLCfCfCPCPBZCLCfCrCrC$CfCfCfCfCLCLCLBZ________ __________________CLCLCfCUBZCLCLCrC$C$CrC$CfCfCfCLCLCLCL________ __________________CLCfCfCfCLCLBZCrC$CPCrC$C$CPCLCLCLCLBZ________ ________________CLCLCfCfCfCLCLCLCfCrCrCrC$C$CPCLCLCLCLCL________ ________________BbCLCfCfCfCLCLBbCfCrCrCrCPCPCPCLCfCLCLBZ________ __________CLCLCLCLCLCfCfCLCUBvCLCfCfCrCrCrCLCLCLCfCLBtCL________ ________BbCLCLCfCfCLCLCLCLCLCLBtCrCrCrCrCfCfCfCfCfCfCLCL_A_A____ ______CLCLCfCLCfCfCLCLCLCLCLBZCLCfCfCfCrCrCfCfCfCfCLCLBb_A_A_A__ ______BZCUCfCfCfCfCLCLCLBbCLBvCfCfCfCfCfCfCfCfCfCfCLCLCL_z_A_A__ ______CLCLCfCfCfCfCLCLCLBvCLCfCrCrCfCfCfCfCfCfCLCLCLCLAw_A_A____ ______BbCLCLCLCLCLCLCLBZCGCfCrCrCrCrCrCfCfCfCfCLCLBbAwAw_A_A____ ______BvCLCLCLCLCLCLCLBbCLCrCrCrCrCrCrCfCfCfCfCLCLAwAw_A_A______ ______BSCLBZCLBbCLBZCLAvCrCrCrCrCrCrCrCfCfCfCLCLBZBR_A_A_A______ _______ABSBSBSBrBSAvAw_ACrCrCrCrCrCrCrCrCfCfCLCLAw_A_A_A________ _________A_A_A_A_A_A_A_ACrCrCrCrCrCrCrCfCfCLBbBS_A_A_A__________ _______________________ACfCrCrCrCrCrCfCfCfCLBi_z_A______________ _______________________ABSCfCfCfCfCfCfCLCLBS_A_A________________ _________________________ABsCfCfCfCfCfBSBS_A_A_A________________ ___________________________ABsBsBsBSBS_A_A_A_A__________________ _____________________________A_A_A_A_A_A_A______________________ } # tile 150 (riding boots / fumble boots) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ _________________________A_A_A_A_A_A_A_A________________________ _______________________A_A_A_A_A_A_A_A_A_A______________________ _______________________A_A_A_A_A_A_AAeAeAeAeAeAe_A_AAe__________ _______________________AAeAeAeAe_AAe_A_A_A_A_A_A_A_A_A_A________ _______________________AAeAeAe_AAe_A_A_A_A_A_A_A_A_A_A_A_A______ _______________________AAeAe_A_AAe_A_A_A_A_A_A_A_A_A_A_A_A______ _______________________AAeAe_A_AAeAe_A_A_A_A_A_A_A_A_A_A_A______ _______________________AAeAeAe_AAeAeAeAeAeAeAeAeAeAe_A_A_A______ _______________________AAeAeAe_AAeAeBJAeAlBDAlAeAeCrCr_A_A______ _____________A_A_A_A_A_AAeAeAe_AAeAeAjAlBDAlBDAeAeCrCL_A_A______ ___________A_A_A_AAeAeAeAeAeAe_AAeAeBJBkBDAlBDAeAeAe_A_A_A______ _________A_A_AAeAeAe_AAeAeAeAe_AAeAeAlBkBkBDAlAeAe_A_A_A_A______ _________A_AAeAeAeAe_A_A_AAe_A_AAeAeBDBkBkAlBDAeAeCrCL_A_A______ _________AAeAeAeAeAeAeAe_AAe_A_AAeAeAlBkBkBDAlAeAeCLCL_A_A______ _________AAeAeAeAeAeAeAe_A_A_A_AAeAeBDBkBkAlBDAeAe_A_A_A_A______ _________AAeAeAeAeAeAe_A_A_A_A_AAeAeAlBkBkBDAlAeAe_A_A_A_A_A____ _________A_AAeAeAeAeAe_AAeAeAeAeAeAeAeBJBkAlBDAeAeCrCr_A_A_A_A__ ___________A_A_A_A_A_AAeBDAlBJAjBJAeAeAlAjBJAeAeAeCrCL_A_A_A_A__ _______A_A_A_A_A_A_AAeAlBkBkBDAlBDAlAeAeBDAeAeAeAeAe_A_A_A_A_A__ ___________A_A_A_AAeBDBkBkBkBdBDAlBDAeAeAeAeAeAeAe_A_A_A_A_A____ __________________AeAlBkBkBkBkAlBDAlAeAeAe_A_A_A_A_A_A_A_A______ __________________AeAlAlBDBkBkAlBDAeAeAe_A_A_A_A_A_A_A_A_A______ _________________AAeAeAeBJAlBDBDAeAeAe_A_A_A_A_A_A_A_A__________ _______________A_AAeAeAeAeAeAeAe_A_A_A_A_A_A_A_A_A______________ _________________A_AAeAeAeAeAeAe_A_A_A_A_A_A_A_A________________ ___________________A_A_A_A_A_A_A_A_A_A_A_A______________________ _______________________A_A_A_A_A_A_A____________________________ ________________________________________________________________ } # tile 151 (snow boots / levitation boots) { __________________________CoCoCoCo____________________Co________ ________________________CoCoCoCoCoCo____________CoCoCoCoCoCo____ ____________________CoCoCoCoCoCoCoCoCo______CoCoCmCoCoCoCoCo____ __________________CoCoCoAeAeAeCoCmCoCo______CoCoCoCoAeAeCoCoCo__ ________________CoCoCoAeAeAeAeCoCoCoCo____CoCoCoCoAeAeAeAeCoC$__ ______________CoCoCoAeAeAeAeAeCoCoCoC$__CoCoCoAeAeAeAeAeCoCoC$__ ____________CoCoCoAeAeAeAeAeCoCoCoC$C$CoCoCoCoAeAeAeAeAeCoCoC$__ ____________CoCoCoAeAeAeAeCoCoCoC$C$C$CoCoCoAeAeAeAeAeCoCoC$C$__ __________CoCoCmCoAeAeAeCoCoCoCoCmC$CoCoCoAeAeAeAeAeCoCoC$CmC$__ __________CoCoCoCoCoAeCoCoCoCoC$C$C$C$CoCoAeAeAeCoCoCoC$C$C$C$__ __________C$CoCoCoCmCoCoCoCoC$C$C$C$C$CoCmCoCoCoCoCoC$CmC$C$____ __________C$C$CoCoCoCoCoCoC$C$CmC$CPC$CoCoCoCoCoC$C$C$C$C$CP____ __________C$CmC$CoCoC$C$CmC$C$C$BkCPCmC$C$C$C$C$C$C$C$C$BkCP____ __________C$C$C$C$C$C$C$C$C$C$CPBkCPC$C$C$CmC$C$CmC$C$CPBkBk____ ____________C$CmC$CmC$C$C$CVCVBnCJC$CmC$CmC$C$C$C$C$CPBnCJBk____ ____________C$C$C$C$C$CmCmCVCVCPCP__C$C$C$C$C$C$CVCPCPCPCPBk____ ______________CLCmBWCoCLCmCVCVCPCP__CmCmCmBWCmCVCVCVCPBkCPBk____ ____________CLCPCLBWCLCmCLCVCPCPCP__CmCLCLBWCLCLCVCVCPCPCPBk_A_A ____________CLCVCmCLCoCmCLCVCVCPBk__CLCmCoCLCmCVCLCVCPBkBkBk_A_A ______________CLCLBWCLCLCmCVCVCPCP__CLCLCoBWCmCLCLCPBkCPBkBk_A_A ______________CVCmBWCoCoCmCVCVCPCP____CmCLBWCLCVCVCPCPCPBdBk_A_A ______________CVCVCVCVCmCmCVCPCPBk__CmCVCoCoCVCVCVCPBkCPBkBk_A_A ____________CVCmCmCVCVCPCPCPCPCPCP__CmCVCVCVCPCPCPCPCPCPBdBk_A_A __________CVCmCoCoCmCmCVCVCPCPCPCmCmCmCmCVCVCVCPCPCPBkCPBkCm_A__ ________CVCVCoCoCoCmCmCVCVCPCPBkCmCmCoCoCmCmCVCVCPCPCPBkCm_A_A__ ________CVCoCoCoCmCmCVCVCPCPCPCoCmCoCoCmCmCmCVCVCPCPCPCPCm_A_A__ ______CVCmCoCoCmCmCVCVCPCPCPCmCmCmCoCmCmCVCVCVCVCPCPBkCo_A_A____ ______CVCmCoCmCmCmCVCVCPCPCoCVCmCmCoCmCmCVCVCVCPCPCPC$_A_A______ ______CoCmCoCoCmCVCVCVCPCo_ACmCmCmCoCmCmCVCVCPCPCPCo_A_A________ _______ACoCmCoCmCVCVCoCo_A_ACoCVCmCoCoCmCVCVCPCoCo_A_A_A________ _______A_ACoCoCoCoCo_A_A_A_A_ACoCmCmCmCmCVCoCo_A_A_A____________ _________A_A_A_A_A_A_A_A_A_____ACoCoCoCoCo_A_A_A_A_A____________ } # tile 152 (wooden) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________CFCFCFBsBsBs____________________________ ____________________BsCFCFCFCFBsBsBsBsBS________________________ __________________BsBsCFBsBsBsBsBsBSBSBSBS______________________ __________________BsBsBSBSBSBSBSBSBSAwBSBS______________________ ________________BSBSBSBS____________AwAwAwAw____________________ ________________BSAY____________________AYAw____________________ ________________BSAYAY________________AYAYAw____________________ _________________AAwAYAY_A_A_A_A_A_AAYAYAw_A_A__________________ _________________A_AAwAYAY_A_A_A_AAYAYAw_A_A_A_A________________ _________________A_A_AAwAw_A_A_A_AAwAw_A_A_A_A__________________ ___________________A_A_A_A_A_A_A_A_A_A_A_A_A____________________ _______________________A_A_A_A_A_A_A_A_A________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 153 (granite) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________CmCmC$C$CPCP____________________________ ____________________C$CmCmCmC$CPCPCPC$C$________________________ __________________C$C$CmBkCmCmBkBkBkC$BdBd______________________ __________________C$CmBdBkCPBdBkBdBdBJBdBd______________________ ________________BdBdBdBd____________AjAlBDAl____________________ ________________CPAe____________________AeCP____________________ ________________CPAeAe________________AeBkCV____________________ _________________ABJAeBk_A_A_A_A_A_ABkAeBJ_A_A__________________ _________________A_ACPBlAe_A_A_A_AAeBlCW_B_A_A_A________________ _________________A_A_ABJBJ_A_A_A_ABJBJ_A_A_A_A__________________ ___________________A_A_A_A_A_A_A_A_A_A_A_A_A____________________ _______________________A_A_A_A_A_A_A_A_A________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 154 (opal) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ___________________________f_I_K_K______________________________ _________________________IC$Bn_k_u_K____________________________ _________________________kAp_I_k_I_K____________________________ ____________________CPCP_K_I_I_w_I_mBkBd________________________ __________________BkCPCP_K_u_k_f_f_IBnBdBd______________________ ________________BdBnCPCP___f_f_I_m__CJBdBdBJ____________________ ________________BdCJ____________________BdAj____________________ ________________BdAe____________________AeBJ____________________ ________________BdAeAeAe____________BJAeAeAl_A__________________ _________________AAeAeAeBJAjBdBdBdAlAjAeAe_B_A__________________ _________________A_AAeAeAlBJBdBdBdBDBJAe_A_A_A__________________ _________________A_A_A_ABDAlBdBdBdAl_A_A_A_A____________________ ___________________A_A_A_A_A_A_A_A_A_A_A_A______________________ _______________________A_A_A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 155 (clay) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________CiCoCdCdCiCg____________________________ ____________________CdCiCoChCdCnCgCiCdCd________________________ __________________CdCdCoCdCoCiCdCnCGCdCdCG______________________ __________________CdCoCGCdCnCdCGCGCGBTCGCG______________________ ________________CGCGCGCG____________BtBTBtBT____________________ ________________CgBR____________________AxCi____________________ ________________CiAxBR________________AxCdCg____________________ _________________zBtBTCd_A_A_A_A_A_ACdBRBT_z_A__________________ _________________A_ACnCdBR_A_A_A_AAxCdCg_z_A_A_A________________ _________________A_A_zBtBT_A_A_A_ABtBT_z_A_A_A__________________ ___________________A_A_A_A_A_A_A_A_A_A_A_A_A____________________ _______________________A_A_A_A_A_A_A_A_A________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 156 (coral) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________CvCvCvCZCZCZ____________________________ ____________________CZCvCvCvCvCZCZCZCZCC________________________ __________________CZCZCvCZCZCZCZCZCCCCCCCC______________________ __________________CZCZCCCCCCCCCCCCCCBNCCCC______________________ ________________CCCCCCCC____________BNBNBNBN____________________ ________________CCAT____________________ATBN____________________ ________________CCATAT________________ATATBN____________________ _________________ABNATAT_A_A_A_A_A_AATATBN_A_A__________________ _________________A_ABNATAT_A_A_A_AATATBN_A_A_A_A________________ _________________A_A_ABNBN_A_A_A_ABNBN_A_A_A_A__________________ ___________________A_A_A_A_A_A_A_A_A_A_A_A_A____________________ _______________________A_A_A_A_A_A_A_A_A________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 157 (black onyx) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________ABABAB_A______________________________ ________________________ABCPABAB_A_A____________________________ ________________________ABABAB_A_A_A____________________________ ____________________CPCP_A_A_A_A_A_ABkBd________________________ __________________BkCPCPBk_A_A_A_ACJBnBdBd______________________ ________________BdBnCPCP____________BkBdBdBJ____________________ ________________BdCJ____________________BdAj____________________ ________________BdAe____________________AeBJ____________________ ________________BdAeAeAe____________BJAeAeAl_A__________________ _________________AAeAeAeBJAjBdBdBdAjAlAeAe_B_A__________________ _________________A_AAeAeAlBJBdBdBdBJBDAe_A_A_A__________________ _________________A_A_A_ABDAlBdBdBdAl_A_A_A_A____________________ ___________________A_A_A_A_A_A_A_A_A_A_A_A______________________ _______________________A_A_A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 158 (moonstone) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________CfCjCfCf______________________________ ________________________CfC$CfCjCfCI____________________________ ________________________CfCjCfCfCfCI____________________________ ____________________CPCPCfCfCfCfCICIBkBd________________________ __________________BkCPCPCJCICfCICIBkCPBdBd______________________ ________________BdBnCPCP____________BkBdBdBJ____________________ ________________BdCJ____________________BdAj____________________ ________________BdAe____________________AeBJ____________________ ________________BdAeAeAe____________BJAeAeAl_A__________________ _________________AAeAeAeBJAjBdBdBdAjAlAeAe_B_A__________________ _________________A_AAeAeAlBJBdBdBdBJBDAe_A_A_A__________________ _________________A_A_A_ABDAlBdBdBdAl_A_A_A_A____________________ ___________________A_A_A_A_A_A_A_A_A_A_A_A______________________ _______________________A_A_A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 159 (tiger eye) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________CfCcCjCfCcCf____________________________ ____________________CFCfCjCzCfCfCcCfCFCI________________________ __________________CfCzCfCFCfCFCfCfCFCICFCI______________________ ________________CfCfCfCcCACIBiCIBvBSBvCFCIBv____________________ ________________CFCICICF____________BWBSBvBS____________________ ________________CIBS____________________BWBv____________________ ________________CIBWBW________________AwBWBv____________________ _________________ABSAwBW_A_A_A_A_A_ABWBWBS_A_A__________________ _________________A_ABvBWAw_A_A_A_AAwBWBv_A_A_A_A________________ _________________A_A_ABSBv_A_A_A_ABSBv_A_A_A_A__________________ ___________________A_A_A_A_A_A_A_A_A_A_A_A_A____________________ _______________________A_A_A_A_A_A_A_A_A________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 160 (jade) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ _________________________x_x_x_u_u_u____________________________ _____________________u_x_x_x_u_u_u_r_r_n________________________ ___________________u_u_u_u_u_r_r_r_n_n_n_n______________________ _________________r_u_r_r_n_n_n_n_n_i_i_n_n_n____________________ _________________r_r_n_n_____________i_i_i_n____________________ _________________n_d_____________________d_i____________________ _________________n_d_d_________________d_d_i____________________ _________________A_i_d_d_A_A_A_A_A_A_d_d_i_A_A__________________ _________________A_A_i_d_d_A_A_A_A_d_d_i_A_A_A_A________________ _________________A_A_A_i_i_A_A_A_A_i_i_A_A_A_A__________________ ___________________A_A_A_A_A_A_A_A_A_A_A_A_A____________________ _______________________A_A_A_A_A_A_A_A_A________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 161 (bronze) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________CiBmCUCIBn_o____________________________ _____________________iCUBmCiCU_n_oBv_iBW________________________ __________________Bv_oBmCiCi_oCI_n_jBv_iAz______________________ _________________d_i_o_nCiBm_n_oCI_i_j_j_dAz____________________ _________________eBvCI_o_____________i_d_e_d____________________ _________________d_d____________________Az_d____________________ ________________BWAb_Z_Z_____________d_YAb_i_A__________________ _________________dAb_ZAb_dAz_jBW_dAz_e_YAb_d_A_A________________ _________________A_ZAb_Z_eAz_j_iBW_e_dAbAb_A_A_A________________ _________________A_AAb_ZAz_e_i_jBW_eAz_Y_A_A_A_A________________ _________________A_A_A_A_e_eBWBW_iAz_A_A_A_A_A__________________ ___________________A_A_A_A_A_A_A_A_A_A_A_A_A____________________ _______________________A_A_A_A_A_A_A_A_A________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 162 (agate) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________BGAnBGAnAnAn____________________________ ____________________AnBGAnBGAnAnAnAnAnAg________________________ __________________AnAnAnAnAnAnAnAnAgAgAgAg______________________ ________________AgAnAgAgAgAgAgAgAgAgAQAQAgAg____________________ ________________AgAgAgAg____________AQAQAQAQ____________________ ________________AgAC____________________ACAQ____________________ ________________AgACAC________________ACACAQ____________________ _________________AAQACAC_A_A_A_A_A_AACACAQ_A_A__________________ _________________A_AAQACAC_A_A_A_AACACAQ_A_A_A_A________________ _________________A_A_AAQAQ_A_A_A_AAQAQ_A_A_A_A__________________ ___________________A_A_A_A_A_A_A_A_A_A_A_A_A____________________ _______________________A_A_A_A_A_A_A_A_A________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 163 (topaz) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________________CP____________CP__________________________ ______________________CICICICICICICICI__________________________ ______________________CICICjCfCjCfCICI__________________________ ____________________BkCICICfCjCfCjCICIBd________________________ __________________BmCKCICIBWBsBWBsCICIBdBd______________________ ________________BdBkBkCVBWBWBWBWBWBWCPBdBdBJ____________________ ________________BdCP____________________BdAj____________________ ________________BdAO____________________AeBJ____________________ ________________BdAeAeAe____________BJAeAeAl_A__________________ _________________AAeAeAeBJAjBdBdBdAlAjAeAe_B_A__________________ _________________A_AAeAeAlBJBdBdBdBDBJAe_A_A_A__________________ _________________A_A_A_ABDAlBdBdBdAl_A_A_A_A____________________ ___________________A_A_A_A_A_A_A_A_A_A_A_A______________________ _______________________A_A_A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 164 (sapphire) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________________CP____________CP__________________________ _______________________I_I_I_I_I_I_I_I__________________________ _______________________I_I_K_K_K_K_I_I__________________________ ____________________Bk_I_I_K_K_K_K_I_IBd________________________ __________________CJBn_I_I_G_G_G_G_I_IBdBd______________________ ________________BdBkBkCV_G_G_G_G_G_GCPBdBdBJ____________________ ________________BdCP____________________BdAj____________________ ________________BdAO____________________AeBJ____________________ ________________BdAeAeAe____________BJAeAeAl_A__________________ _________________AAeAeAeBJAjBdBdBdAlAjAeAe_B_A__________________ _________________A_AAeAeAlBJBdBdBdBDBJAe_A_A_A__________________ _________________A_A_A_ABDAlBdBdBdAl_A_A_A_A____________________ ___________________A_A_A_A_A_A_A_A_A_A_A_A______________________ _______________________A_A_A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 165 (ruby) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________________CP____________CP__________________________ ______________________BoBoBoBoBoBoBoBo__________________________ ______________________BoBoCYCYCYCYBoBo__________________________ ____________________BkBoBoCYCYCYCYBoBoBd________________________ __________________CJBnBoBoBNBNBNBNBoBoBdBd______________________ ________________BdBkBkCVBNBNBNBNBNBNCPBdBdBJ____________________ ________________BdCP____________________BdAj____________________ ________________BdAO____________________AeBJ____________________ ________________BdAeAeAe____________BJAeAeAl_A__________________ _________________AAeAeAeBJAjBdBdBdAlAjAeAe_B_A__________________ _________________A_AAeAeAlBJBdBdBdBDBJAe_A_A_A__________________ _________________A_A_A_ABDAlBdBdBdAl_A_A_A_A____________________ ___________________A_A_A_A_A_A_A_A_A_A_A_A______________________ _______________________A_A_A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 166 (diamond) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________BkC$C$Bk______________________________ ________________________C$C$BkCPC$C$____________________________ ________________________CVBkC$C$BkCP____________________________ ____________________CPCPC$C$BkBnC$C$BkBd________________________ __________________BkCPCPCPBkC$C$BkCJBnBdBd______________________ ________________BdBnCPCP____________BkBdBdBJ____________________ ________________BdCJ____________________BdAj____________________ ________________BdAe____________________AeBJ____________________ ________________BdAeAeAe____________BJAeAeAl_A__________________ _________________AAeAeAeBJAjBdBdBdAjBJAeAe_B_A__________________ _________________A_AAeAeAlBJBdBdBdBDAlAe_A_A_A__________________ _________________A_A_A_ABDAlBdBdBdAl_B_A_A_A____________________ ___________________A_A_A_A_B_A_A_A_A_A_A_A______________________ _______________________A_A_A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 167 (pearl) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________CSCSCoCh______________________________ ________________________CSC$C$CRCtCo____________________________ ________________________CSC$C$CRCoCh____________________________ ____________________CPCPCSCRCRCtCoCQCJBd________________________ __________________BkCPCVChCtCoChCoCQBkBdBd______________________ ________________BdBlCWCP__CQCQCQCQ__COBKBdBJ____________________ ________________BkBk____________________BdAj____________________ ________________BdAe____________________AeAl____________________ ________________BdAeAeAe____________AlAeAeBJ_A__________________ _________________AAeAeAeBJAjBdBdBdBJBDAeAe_A_A__________________ _________________A_AAeAeAlBJBdBdBdAjAlAe_A_A_A__________________ _________________A_A_A_ABDAlBdBdBdBJ_A_A_A_A____________________ ___________________A_A_A_A_A_A_A_A_A_A_A_A______________________ _______________________A_A_A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 168 (iron) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________BkBkCPBkBdBd____________________________ ____________________BDCPBkCPBkBkBdBdAjBJ________________________ __________________BJBdBkBkBkCPBkBkBdBJAlAe______________________ ________________AeAlBdCPBkCPBkBkBdBdAlBDAeAe____________________ ________________AeBDBdBk____________BDAlAeAe____________________ ________________AeAl____________________AeAe____________________ ________________AeABABAB____________AeABABAe_A__________________ ________________AeABABABAeAeBJAjBJAeAeABABAe_A_A________________ _________________AABABABAeAeAlBDAlAeAeABAB_A_A_A________________ _________________A_AABABAeAeBDAlBDAeAeAB_A_A_A_A________________ _________________A_A_A_AAeAeAlBDAlAe_A_A_A_A_A__________________ ___________________A_A_A_A_A_A_A_A_A_A_A_A_A____________________ _______________________A_A_A_A_A_A_A_A_A________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 169 (brass) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________CiCiCUCICIBv____________________________ ____________________CICUCiCiCUCICIBvBvBW________________________ __________________BvCICUCiCiCUCICIBvBvBWBW______________________ ________________BWBvCICUCiCiCUCICIBvBvBWBWAz____________________ ________________BWBvCICU____________BvBWBWAz____________________ ________________BWBv____________________BWAz____________________ ________________BWAbAbAb____________AzAbAbAz_A__________________ ________________BWAbAbAbAzAzBWBWBWAzAzAbAbAz_A_A________________ _________________AAbAbAbAzAzBWBWBWAzAzAbAb_A_A_A________________ _________________A_AAbAbAzAzBWBWBWAzAzAb_A_A_A_A________________ _________________A_A_A_AAzAzBWBWBWAz_A_A_A_A_A__________________ ___________________A_A_A_A_A_A_A_A_A_A_A_A_A____________________ _______________________A_A_A_A_A_A_A_A_A________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 170 (copper) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________CzCzCcCFCFBs____________________________ ____________________CFCcCzCzCcCFCFBsBsBS________________________ __________________BsCFCcCzCzCcCFCFBsBsBSBS______________________ ________________BSBsCFCcCzCzCcCFCFBsBsBSBSAw____________________ ________________BSBsCFCc____________BsBSBSAw____________________ ________________BSBs____________________BSAw____________________ ________________BSAYAYAY____________AwAYAYAw_A__________________ ________________BSAYAYAYAwAwBSBSBSAwAwAYAYAw_A_A________________ _________________AAYAYAYAwAwBSBSBSAwAwAYAY_A_A_A________________ _________________A_AAYAYAwAwBSBSBSAwAwAY_A_A_A_A________________ _________________A_A_A_AAwAwBSBSBSAw_A_A_A_A_A__________________ ___________________A_A_A_A_A_A_A_A_A_A_A_A_A____________________ _______________________A_A_A_A_A_A_A_A_A________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 171 (twisted) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________________CLCLCrCr____________________________ ________________________CtCrCrCLCLCrCr__________________________ ____________________CrCrCrCtCrCrCLB_B_B_BZ______________________ __________________CLCLCrCrCtCtCrB_B_BZBZCL______________________ __________________CLBbCLCrCr______BZCLCLCrCt____________________ ________________CrCLCLCLCr__________CLCrCtCrCr__________________ ________________CrCLBv________________CtCrCrCL__________________ ________________CrBz____________________CrCLCL__________________ ________________CrB_BZB_____________CLCLB_B_BZ__________________ ________________CLB_BZB_BZCLCrCsCsCrCLBbB_B__z_A________________ _________________AB_BZB_BZCLCrCsCsCrCLCLB__A_A_A________________ _________________A_ABZB_BZCLCrCsCsCrCLBZ_A_A_A_A________________ _________________A_A_AB_BZCLCrCsCsCr_z_z_A_A_A__________________ ___________________A_A_A_A_A_A_A_A_A_A_A_A_A____________________ _______________________A_A_A_A_A_A_A_A_A________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 172 (steel) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________BMBM_v_v_v_vBMBMBMBM________________________ ____________________BMBM_v_v_v_vBMBMBMBM________________________ ________________BMBM_v_v_A_A_A_A_A_ABMBMBMBM____________________ ________________BMBM_v_v_A_A_A_A_A_ABMBMBMBM____________________ ________________BMBM_A_A_A_A_________A_ABMBM_A_A________________ ________________BMBM_A_A_A_A_________A_ABMBM_A_A________________ ________________BMBM_A_A________________BMBM_A_A________________ ________________BMBM_A_A________________BMBM_A_A________________ ________________BMBMBMBM_A_A________BMBMBMBM_A_A________________ ________________BMBMBMBM_A_A________BMBMBMBM_A_A________________ ____________________BMBMBMBMBMBMBMBMBMBM_A_A_A_A________________ ____________________BMBMBMBMBMBMBMBMBMBM_A_A_A_A________________ _________________________A_A_A_A_A_A_A_A_A_A____________________ _________________________A_A_A_A_A_A_A_A_A_A____________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 173 (silver) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________C$C$CmCPCPBk____________________________ ____________________CPCmC$C$CmCPCPCPBkBd________________________ __________________BkCPCmC$C$CmCPCPBkBkBkBd______________________ ________________BdBnCPCmC$C$CmCPCPCOBlBdBdBJ____________________ ________________BdCJCPCm____________BkBdBdAj____________________ ________________BdBk____________________BdBJ____________________ ________________BdAeAeAe____________BDAeAeAl_A__________________ ________________BdAeAeAeAjBJBdBdBdBDAlAeAeBD_A_A________________ _________________AAeAeAeBJAlBdBdBdAlBDAeAe_A_A_A________________ _________________A_AAeAeAlBDBdBdBdBDAlAe_A_A_A_A________________ _________________A_A_A_ABDAlBdBdBdAl_B_A_A_A_A__________________ ___________________A_A_A_A_A_A_A_A_A_A_A_A_A____________________ _______________________A_A_A_A_A_A_A_A_A________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 174 (gold) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________CsCtCtCsCsCr____________________________ ____________________CrCrCsCtCtCsCsCrCrCL________________________ __________________CLCrCrCsCtCtCsCsCrCrCLCr______________________ ________________CrCLCrCrCsCtCtCsCsCrCrCLCrCL____________________ ________________CrCLCrCr____________CrCLCrCL____________________ ________________CrCLCr________________CLCrCL_A__________________ ________________CrB_____________________B_CL_A__________________ ________________CLB_BZB_____________CLCLB_CL_A_A________________ ________________CLB_BZB_BZCLCrCsCsCrCLBbB__A_A_A________________ _________________AB_BZB_BZCLCrCsCsCrCLCLB__A_A_A________________ _________________A_ABZB_BZCLCrCsCsCrCLBZ_A_A_A_A________________ _________________A_A_AB_BZCLCrCsCsCr_z_z_A_A_A__________________ ___________________A_A_A_A_A_A_A_A_A_A_A_A_A____________________ _______________________A_A_A_A_A_A_A_A_A________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 175 (ivory) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________ClClClCOCOCO____________________________ ____________________COClClClClCOCOCOCOBj________________________ __________________COCOClCOCOCOCOCOBjCOBjCO______________________ __________________COCOBzCJBjBmBjCOBjBcBmBj______________________ ________________BjBmBjBm____________BcBcBcBc____________________ ________________COB_____________________B_Bc____________________ ________________BjB_B_________________B_AhBc____________________ _________________LBcBJB__A_A_A_A_A_MB_B_Bc_A_A__________________ _________________A_ABcB_Ah_z_A_A_AB_AlBc_A_A_A_A________________ _________________A_A_ABcBc_A_A_A_ABcBc_L_A_A_A__________________ ___________________A_A_A_A_A_A_A_A_A_A_A_A_A____________________ _______________________A_A_A_A_A_A_A_A_A________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 176 (emerald) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________________CP____________CP__________________________ _______________________c_c_c_c_c_c_c_c__________________________ _______________________c_c_h_h_h_h_c_c__________________________ ____________________Bk_c_c_h_h_h_h_c_cBd________________________ __________________CJBn_c_c_X_X_X_X_c_cBdBd______________________ ________________BdBkBkCV_X_X_X_X_X_XCPBdBdBJ____________________ ________________BdCP____________________BdAj____________________ ________________BdAO____________________AeBJ____________________ ________________BdAeAeAe____________BJAeAeAl_A__________________ _________________AAeAeAeBJAjBdBdBdAlAjAeAe_B_A__________________ _________________A_AAeAeAlBJBdBdBdBDBJAe_A_A_A__________________ _________________A_A_A_ABDAlBdBdBdAl_A_A_A_A____________________ ___________________A_A_A_A_A_A_A_A_A_A_A_A______________________ _______________________A_A_A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 177 (wire) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________CPCPCPCPCPCP____________________________ ____________________CPCPBdBdBdBdBdBdBdBd________________________ __________________CPBdBd_A_A_A_A_ABdBdBdBd______________________ __________________CPBd_A_A_A_A_A_A_A_ACPBdBd_A__________________ ________________CPBd_A_A_A_A____________CPBd_A_A________________ ________________CPBd_A_A_A______________CPBdBd_A_A______________ ________________CPBd_A_A__________________CPBdBd_A_A____________ ________________CPBd_A_A____________________CPBd_A_A____________ ________________CPBd_A_A____________________CPBd_A_A____________ ________________CPBd_A_A__________________CPBdBd_A_A____________ ________________CPBd_A_A_A_A_ACPCPCPCPCPCPBdBd_A_A______________ ________________CPBdBd_A_A_ACPBdBdBdBdBdBdBd_A_A________________ __________________CPBdCPCPCPBdBd_A_A_A_A_A_A_A__________________ ___________________ABdBdBdBdBd_A_A_A_A_A_A_A____________________ ___________________A_A_A_A_A_A_A_A_A____________________________ _________________________A_A_A_A________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 178 (engagement) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________BJC$C$BJ______________________________ ________________________C$C$AlBDCoC$____________________________ ________________________BJAjC$C$AjBJ____________________________ ____________________CrCrC$C$BJAlC$C$CLCL________________________ __________________CLCrCrCrAlC$C$BJCLCLBZCL______________________ ________________CLCLCrCr____________CLCLBbBZ____________________ ________________BbCL____________________CLBZ____________________ ________________CLB_____________________B_BZ____________________ ________________BvB_B_B_____________BZB_B_BZ_A__________________ _________________BB_B_B_BZBZCLBbCLBZBZB_B__A_A__________________ _________________A_AB_B_BZBZBvCLBZBZBZB__A_A_A__________________ _________________A_A_A_ABZBZBzCLBtBZ_A_A_A_A____________________ ___________________A_A_A_A_A_A_A_L_A_A_A_A______________________ _______________________A_A_A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 179 (shiny) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________CP______________________________________CP______________ ________________________________________________________________ ____________Cm______________________________Cm__________________ ______________Cm__________________________Cm____________________ ________________Cm______________________________________________ ______________________________________Cm________________________ ____________________Cm______________C$__________________________ ______________________C$__________C$____________________________ ________________________C$BkC$C$C$______________________________ ________________________C$C$BdBdC$C$____________________________ ________________________BdBdC$C$BdBd____________________________ ____________________CPCPC$C$BdBdC$C$BkBd________________________ __________________BkCPCPC$BkC$C$C$CJBnBdBd______________________ ________________BdBnCPC$__________C$BkBdBdBJ____________________ ________________BdCJC$______________C$__BdAj____________________ ________________BdCm__________________C$AeBJ____________________ ________________CmAeAeAe____________BJAeCmAl_A__________________ ______________Cm_AAeAeAeBJAjBdBdBdAjAlAeAeCm_A__________________ _________________A_AAeAeAlBJBdBdBdBJBDAe_A_A_A__________________ __________CP_____A_A_A_ABDAlBdBdBdAl_A_A_A_A__Cm________________ ________CP_________A_A_A_A_A_A_A_A_A_A_A_A______CP______________ _______________________A_A_A_A_A_A_A_A__________________________ ____CP______________________________________________CP__________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 180 (circular) { ________________________________________________________________ ________________________________CLCLCLCLCLCL____________________ ____________________________CLCL_A_A_A_A_A_ACLCL________________ ________________________CLCL_A_A________________CL_A____________ ______________________CL_A_A____________________CL_A____________ ____________________CL_A__________________________CL_A__________ ____________________CL_A__________________________CL_A__________ __________________CL_A______CLCLCLCL________________CL_A________ __________________CL_A____CL_A_A_A_ACL______________CL_A________ ________________CL_A______CL_A_______ACL____________CL_A________ ________________CL_A____CL_A___________ACL__________CL_A________ ________________CL_A____CL_A___________ACL__________CL_A________ ________________CL_A____CL_A______________CL________CL_A________ ________________CL_A____CL_A______________CL_A______CL_A________ ________________CL_A____CL_A______________CL_A______CL_A________ __________________CL_A__CL_A______________CL_A______CL_A________ __________________CL_A__CL_A______________CL_A______CL_A________ __________________CL_A____CL_A____________CL_A______CL_A________ __________________CL_A____CL_A____________CL_A____CL_A__________ ____________________CL_A__CL_A______________CL_A__CL_A__________ ____________________CmCPCP__________________CL_A__CL_A__________ ________________C$CmCmCPCVBkBk________________CLCL_A____________ ______________C$C$CmCmCPCPBkCPBd_______________A_A______________ ______________CmCmCmCPCPCPBkBdBd_A______________________________ ____________CmCmCmCPCPCPBkBdBdBdBd_A____________________________ ____________CPCPCPCPCPBkBdBdBdBdBd_A____________________________ ____________CPCPCPBkCPBdBdBdBdBJAj_A____________________________ ______________BkCPBkBdBdBdAlBDAl_A_A____________________________ ______________BkBkBdBdBdBdBDAlBD_A_A____________________________ ________________BkBdBdBdBDAlBJ_A_A______________________________ ___________________ABdBdAl_B_A_A________________________________ _____________________A_A_A_A_A__________________________________ } # tile 181 (spherical) { ________________________________________________________________ ________________________________CLCLCLCLCLCL____________________ ____________________________CLCL_A_A_A_A_A_ACLCL________________ ________________________CLCL_A_A________________CL_A____________ ______________________CL_A_A____________________CL_A____________ ____________________CL_A__________________________CL_A__________ ____________________CL_A__________________________CL_A__________ __________________CL_A______CLCLCLCL________________CL_A________ __________________CL_A____CL_A_A_A_ACL______________CL_A________ ________________CL_A______CL_A_______ACL____________CL_A________ ________________CL_A____CL_A___________ACL__________CL_A________ ________________CL_A____CL_A___________ACL__________CL_A________ ________________CL_A____CL_A______________CL________CL_A________ ________________CL_A____CL_A______________CL_A______CL_A________ ________________CL_A____CL_A______________CL_A______CL_A________ __________________CL_A__CL_A______________CL_A______CL_A________ __________________CL_A__CL_A______________CL_A______CL_A________ __________________CL_ACL___A______________CL_A______CL_A________ __________________CL_ACL___A______________CL_A____CL_A__________ ____________________CLCL___A________________CL_A__CL_A__________ ____________________BdBdBd_A________________CL_A__CL_A__________ ________________BkBkCPCPBdBdBJ________________CLCL_A____________ ______________BkCPCmCmCPBkBdAjAe_A_____________A_A______________ ______________BkCmC$CmCWBlBdBJAe_A_A_A__________________________ ____________BdCPCmCmCmCPBkBdBJAeAB_A_A_A________________________ ____________BdCPCPCPCPCJBdAjAeAeAB_A_A_A________________________ ____________BdBdBkBnBkBkBdBJAeABAB_A_A_A________________________ ______________BdBdBdBdBDAlAeAeAB_A_A_A_A________________________ ______________BJBJAlBDAeAeAeABAB_A_A_A__________________________ ________________AeAeAeAeABABAB_A_A_A____________________________ _________________A_AABABAB_A_A_A_A______________________________ _____________________A_A_A_A_A__________________________________ } # tile 182 (oval) { ________________________________________________________________ ________________________________CLCLCLCLCLCL____________________ ____________________________CLCL_A_A_A_A_A_ACLCL________________ ________________________CLCL_A_A________________CL_A____________ ______________________CL_A_A____________________CL_A____________ ____________________CL_A__________________________CL_A__________ ____________________CL_A__________________________CL_A__________ __________________CL_A______CLCLCLCL________________CL_A________ __________________CL_A____CL_A_A_A_ACL______________CL_A________ ________________CL_A______CL_A_______ACL____________CL_A________ ________________CL_A____CL_A___________ACL__________CL_A________ ________________CL_A____CL_A___________ACL__________CL_A________ ________________CL_A____CL_A______________CL________CL_A________ ________________CL_A____CL_A______________CL_A______CL_A________ ________________CL_A____CL_A______________CL_A______CL_A________ __________________CL_A__CL_A______________CL_A______CL_A________ __________________CL_A__CL_A______________CL_A______CL_A________ __________________CL_A____CL_A____________CL_A______CL_A________ __________________CL_A____CL_A____________CL_A____CL_A__________ ____________________CL_A__CL_A______________CL_A__CL_A__________ ____________________CPCPCPCP________________CL_A__CL_A__________ ________________C$C$CPCPCPCPBdBd______________CLCL_A____________ ______________C$C$C$C$CPCPBdBdBdBd_A___________A_A______________ ______________C$C$C$BdBdBdBdBdBdBd_A_A__________________________ ____________CPCPCPBdBdBdBdBdBdAeAeAe_A__________________________ ____________CPCPCPBdBdBdBdBdBdAeAeAe_A__________________________ ______________BdBdBdBdBdBdBdABABAB_A_A__________________________ ______________BdBdBdBdAeAeABABABAB_A____________________________ _______________ABdBdAeAeAeAeABAB_A_A____________________________ _________________A_AAeAeAeAe_A_A_A______________________________ ___________________A_A_A_A_A_A__________________________________ ________________________________________________________________ } # tile 183 (triangular) { ________________________________________________________________ ________________________________CLCLCLCLCLCL____________________ ____________________________CLCL_A_A_A_A_A_ACLCL________________ ________________________CLCL_A_A_____________A_ACL_A____________ ______________________CL_A_A____________________CL_A____________ ____________________CL_A__________________________CL_A__________ ____________________CL_A__________________________CL_A__________ __________________CL_A______CLCLCLCL________________CL_A________ __________________CL_A____CL_A_A_A_ACL______________CL_A________ ________________CL_A______CL_A_______ACL____________CL_A________ ________________CL_A____CL_A___________ACL__________CL_A________ ________________CL_A____CL_A___________ACL__________CL_A________ ________________CL_A____CL_A______________CL________CL_A________ ________________CL_A____CL_A______________CL_A______CL_A________ ________________CL_A____CL_A______________CL_A______CL_A________ __________________CL_A__CL_A______________CL_A______CL_A________ __________________CL_A__CL_A______________CL_A______CL_A________ __________________CL_A__CL_A______________CL_A______CL_A________ __________________CL_A__CL_A______________CL_A____CL_A__________ ______________C$CPCPCPCPCPCPCPBd____________CL_A__CL_A__________ ____________C$C$CPCPCPCPCPCPCPBdBd_A________CL_A__CL_A__________ ____________CPCPBdBdBdBdBdBdBdAeAe_A__________CLCL_A____________ ______________CPBdBdBdBdBdBdBdAe_A_A___________A_A______________ ______________CPCPBdBdBdBdBdAeAe_A______________________________ ________________CPBdBdBdBdBdAe_A_A______________________________ ________________CPCPBdBdBdAeAe_A________________________________ __________________CPBdBdBdAe_A_A________________________________ __________________CPCPBdAeAe_A__________________________________ ____________________CPBdAe_A_A__________________________________ ____________________BdBdBd_A____________________________________ _______________________A_A_A____________________________________ ________________________________________________________________ } # tile 184 (pyramidal) { ________________________________________________________________ ________________________________CLCLCLCLCLCL____________________ ____________________________CLCL_A_A_A_A_A_ACLCL________________ ________________________CLCL_A_A_____________A_ACL_A____________ ______________________CL_A_A____________________CL_A____________ ____________________CL_A__________________________CL_A__________ ____________________CL_A__________________________CL_A__________ __________________CL_A______CLCLCLCL________________CL_A________ __________________CL_A____CL_A_A_A_ACL______________CL_A________ ________________CL_A______CL_A_______ACL____________CL_A________ ________________CL_A____CL_A___________ACL__________CL_A________ ________________CL_A____CL_A___________ACL__________CL_A________ ________________CL_A____CL_A______________CL________CL_A________ ________________CL_A____CL_A______________CL_A______CL_A________ ________________CL_A____CL_A______________CL_A______CL_A________ __________________CL_A__CL_A______________CL_A______CL_A________ __________________CL_A__CL_A______________CL_A______CL_A________ __________________CL_A____CL_A____________CL_A______CL_A________ __________________CL_A____CL_A____________CL_A____CL_A__________ ____________________CL_A__CL_A______________CL_A__CL_A__________ ____________________CL_A__CL_A______________CL_A__CL_A__________ ______________C$CPCPCPCPCPCPCPCPCP____________CLCL_A____________ ______________BkC$CPCPCPCPCPCPCPBd_A___________A_A______________ ______________CPBkC$CPCPCPCPCPBdBd_A____________________________ ______________BkBkCPCoCPCPCPBdBdBd_A____________________________ ______________BkCPBkBkC$CPBdBdBdBd_A____________________________ ______________BkBkCPBkCPBDBdBdBdBd_A____________________________ ______________BkCPBkBkAlBJBdBdBdBd_A____________________________ ______________CJBMCKBDAjBJAjBdBdBd_A____________________________ ______________BlBmAlBJAlBDAlBJBdBd_A____________________________ ______________COAlBDAjBJAlBDAlBDBd_A____________________________ _________________A_A_A_B_A_A_A_A_A_A____________________________ } # tile 185 (square) { ________________________________________________________________ ________________________________CLCLCLCLCLCL____________________ ____________________________CLCL_A_A_A_A_A_ACLCL________________ ________________________CLCL_A_A_____________A_ACL_A____________ ______________________CL_A_A____________________CL_A____________ ____________________CL_A__________________________CL_A__________ ____________________CL_A__________________________CL_A__________ __________________CL_A______CLCLCLCL________________CL_A________ __________________CL_A____CL_A_A_A_ACL______________CL_A________ ________________CL_A______CL_A_______ACL____________CL_A________ ________________CL_A____CL_A___________ACL__________CL_A________ ________________CL_A____CL_A___________ACL__________CL_A________ ________________CL_A____CL_A______________CL________CL_A________ ________________CL_A____CL_A______________CL_A______CL_A________ ________________CL_A____CL_A______________CL_A______CL_A________ __________________CL_A__CL_A______________CL_A______CL_A________ __________________CL_A__CL_A______________CL_A______CL_A________ __________________CL_A__CL_A______________CL_A______CL_A________ __________________CL_ACP_A_A______________CL_A____CL_A__________ ____________________C$CPBd_A________________CL_A__CL_A__________ __________________C$C$CPBdBd_A______________CL_A__CL_A__________ ________________C$C$C$CPBdBdBd_A______________CLCL_A____________ ______________C$C$C$CPCPCPBdBdBd_A_____________A_A______________ ____________C$C$C$CPCPCPCPCPBdBdBd_A____________________________ __________CPCPCPCPCPCPCPCPCPCPAeAeAe_A__________________________ ___________ABdBdBdCPCPCPCPCPABABAB_A____________________________ _____________ABdBdBdCPCPCPABABAB_A______________________________ _______________ABdBdBdCPABABAB_A________________________________ _________________ABdBdAeABAB_A__________________________________ ___________________ABdAeAB_A____________________________________ _____________________AAe_A______________________________________ _______________________A________________________________________ } # tile 187 (hexagonal) { ________________________________________________________________ ________________________________CLCLCLCLCLCL____________________ ____________________________CLCL_A_A_A_A_A_ACLCL________________ ________________________CLCL_A_A________________CL_A____________ ______________________CL_A_A____________________CL_A____________ ____________________CL_A__________________________CL_A__________ ____________________CL_A__________________________CL_A__________ __________________CL_A______CLCLCLCL________________CL_A________ __________________CL_A____CL_A_A_A_ACL______________CL_A________ ________________CL_A______CL_A_______ACL____________CL_A________ ________________CL_A____CL_A___________ACL__________CL_A________ ________________CL_A____CL_A___________ACL__________CL_A________ ________________CL_A____CL_A______________CL________CL_A________ ________________CL_A____CL_A______________CL_A______CL_A________ ________________CL_A____CL_A______________CL_A______CL_A________ __________________CL_A__CL_A______________CL_A______CL_A________ __________________CL_A__CL_A______________CL_A______CL_A________ __________________CL_A____CL_A____________CL_A______CL_A________ __________________CL_A____CL_A____________CL_A____CL_A__________ ____________________CL_A__CL_A______________CL_A__CL_A__________ ____________________CL_A__CL_A______________CL_A__CL_A__________ ________________C$CPCPCPCPCPBd_A______________CLCL_A____________ ________________C$CPCPCPCPCPBd_A_______________A_A______________ ______________C$C$C$CPCPCPBdBdBd_A______________________________ ______________C$C$C$CPCPCPBdBdBd_A______________________________ ____________C$C$C$C$C$CPBdBdBdBdBd_A____________________________ ____________CPCPCPCPCPBdBJAjBJAlBD_A____________________________ ______________CPCPCPCPBdBdBJAlBD_A_A____________________________ ______________CPCPCPBdBdBdAlBDAl_A______________________________ ________________CPBdBdBdBdBdAj_A_A______________________________ ________________CPBdBdBdBdBdBJ_A________________________________ _________________A_A_A_A_A_A_A_A________________________________ } # tile 188 (octagonal) { ________________________________________________________________ ________________________________CLCLCLCLCLCL____________________ ____________________________CLCL_A_A_A_A_A_ACLCL________________ ________________________CLCL_A_A________________CL_A____________ ______________________CL_A_A____________________CL_A____________ ____________________CL_A__________________________CL_A__________ ____________________CL_A__________________________CL_A__________ __________________CL_A______CLCLCLCL________________CL_A________ __________________CL_A____CL_A_A_A_ACL______________CL_A________ ________________CL_A______CL_A_______ACL____________CL_A________ ________________CL_A____CL_A___________ACL__________CL_A________ ________________CL_A____CL_A___________ACL__________CL_A________ ________________CL_A____CL_A______________CL________CL_A________ ________________CL_A____CL_A______________CL_A______CL_A________ ________________CL_A____CL_A______________CL_A______CL_A________ __________________CL_A__CL_A______________CL_A______CL_A________ __________________CL_A__CL_A______________CL_A______CL_A________ __________________CL_A____CL_A____________CL_A______CL_A________ __________________CL_A____CL_A____________CL_A____CL_A__________ ____________________CL_A__CL_A______________CL_A__CL_A__________ __________________C$CPCPCPBd_A______________CL_A__CL_A__________ ________________C$C$CPCPCPBdBd_A______________CLCL_A____________ ______________C$C$C$CPCPCPBdBdBd_A_____________A_A______________ ____________C$C$C$C$BdBdBdBdBdBdBd_A____________________________ ____________CPCPCPBdBdBdBdBdAeAeAe_A____________________________ ____________CPCPCPBdBdBdBdBdAeAeAe_A____________________________ ____________CPCPCPBdBdBdBdBdAeAeAe_A____________________________ ____________BdBdBdBdBdBdBdABABABAB_A____________________________ _____________ABdBdBdAeAeAeABABAB_A______________________________ _______________ABdBdAeAeAeABAB_A________________________________ _________________ABdAeAeAeAB_A__________________________________ ___________________A_A_A_A_A____________________________________ } # tile 189 (Amulet of Yendor / cheap plastic imitation of the Amulet of Yendor) { ________________________________________________________________ ________________________________________________________________ ________________________CL_A____________________________________ ________________________CL_A_A__________________________________ ______________________CLCrCL_A__________________________________ ______________________CLCrCL_A_A________________________________ ____________________CLBoBoBoCL_A____________________CsCL________ ____________________BoCiBoBoCY_A_A______________CsCL_A_ACr______ __________________CLBoCuCYCBCBCL_A_A__________Cs_A_A______Cs_A__ ____CLCLCLCLCLCLCLCLCYBoCBCuBoCLCLCLCLCLCLCLCL_ACL_A______CL_A__ ____CLCrCLBbByByCMCLCLCYBoCBCLCLBqBqCDCLBbCrCL_A__Cs_A______Cs_A _____ACLCrByCtCMByCjCLCLCrCLCLBqCtCDBqCaCrCL_A_A__CL_A______CL_A _____ACLCLByCjCjCMCMCLCLBbCLCLBqCwCaCDCDCLCL_A_A__Cr_A______Cs_A _______ACLCjByCjCjByCLClCgCJCLCaBqCDCwBqCL_A_A______Cr_A____CL_A _______ACLCLCjByCMCLClC$ClCgChCrCaBqCDCLCL_A_A______Cs_A____Cs_A _________ACLCLCLCLCLClBnCVCKCKCLCLCLCLCL_A_A________CL_A____CL_A _________ACLCLCLCLBbCOCSBICPCKBbCLCLCLBZ_z_A________Cs_A____Cs_A ________CLCL_i_i_iCrBzCVBnBlCLCr_a_J_aCLCL_A________CL_A____Cs_A ________CL_iCQ_i_i_rCLBbCLBzCL_aCQ_a_b_KCL_A________Cs_A____CL_A ______CLCL_i_r_r_n_nCLCLCrCLCL_a_K_H_H_bCLCL_A______CL_A____Cs_A ______CLCr_n_i_n_r_iCL_j_j_jCL_K_a_I_K_aCrCL_A____CL_A_A____CL_A ____CLCrBbCL_n_i_nCL_jCS_j_j_vCL_K_a_bBbCLCrCL_A__Cs_A______Cs_A ____CLCLCLCLCLCLCLCL_j_v_s_o_oCLCLCLCLCLCLCLCL_A__CL_A______CL_A _____A_A_A_A_A_A_ACL_s_j_o_v_jCL_A_A_z_A_A_A_A_A_ACs_A____CL_A_A _______A_A_A_A_A_A_ACL_s_j_oCL_A_A_A_A_A_A_A_A_ACs_A_A____Cs_A__ ___________________ACLCLCrCLCL_A________________Cr_A______Cr_A__ ___________________A_ACLCrCL_A_A______________Cs_A_A____Cs_A_A__ _____________________ACLCrCL_A____________CLCs_A_A______CL_A_A__ _____________________A_ACL_A_A__________Cs_A_A_A________Ct_A____ _______________________ACL_A____________CL_A________CrCs_A_A____ _______________________A_A_A_____________ACtCLCtCrCL_A_A_A______ _________________________A_A_______________A_A_A_A_A_A__________ } # tile 190 (Amulet of Yendor / Amulet of Yendor) { ________________________________________________________________ ________________________________________________________________ ________________________CL_A____________________________________ ________________________CL_A_A__________________________________ ______________________CLCrCL_A__________________________________ ______________________CLCrCL_A_A________________________________ ____________________CLBoBoBoCL_A____________________CsCL________ ____________________BoCiBoBoCY_A_A______________CsCL_A_ACr______ __________________CLBoCuCYCBCBCL_A_A__________Cs_A_A______Cs_A__ ____CLCLCLCLCLCLCLCLCYBoCBCuBoCLCLCLCLCLCLCLCL_ACL_A______CL_A__ ____CLCrCLBbByByCMCLCLCYBoCBCLCLBqBqCDCLBbCrCL_A__Cs_A______Cs_A _____ACLCrByCtCMByCjCLCLCrCLCLBqCtCDBqCaCrCL_A_A__CL_A______CL_A _____ACLCLByCjCjCMCMCLCLBbCLCLBqCwCaCDCDCLCL_A_A__Cr_A______Cs_A _______ACLCjByCjCjByCLClCgCJCLCaBqCDCwBqCL_A_A______Cr_A____CL_A _______ACLCLCjByCMCLClC$ClCgChCrCaBqCDCLCL_A_A______Cs_A____Cs_A _________ACLCLCLCLCLClBnCVCKCKCLCLCLCLCL_A_A________CL_A____CL_A _________ACLCLCLCLBbCOCSBICPCKBbCLCLCLBZ_z_A________Cs_A____Cs_A ________CLCL_i_i_iCrBzCVBnBlCLCr_a_J_aCLCL_A________CL_A____Cs_A ________CL_iCQ_i_i_rCLBbCLBzCL_aCQ_a_b_KCL_A________Cs_A____CL_A ______CLCL_i_r_r_n_nCLCLCrCLCL_a_K_H_H_bCLCL_A______CL_A____Cs_A ______CLCr_n_i_n_r_iCL_j_j_jCL_K_a_I_K_aCrCL_A____CL_A_A____CL_A ____CLCrBbCL_n_i_nCL_jCS_j_j_vCL_K_a_bBbCLCrCL_A__Cs_A______Cs_A ____CLCLCLCLCLCLCLCL_j_v_s_o_oCLCLCLCLCLCLCLCL_A__CL_A______CL_A _____A_A_A_A_A_A_ACL_s_j_o_v_jCL_A_A_z_A_A_A_A_A_ACs_A____CL_A_A _______A_A_A_A_A_A_ACL_s_j_oCL_A_A_A_A_A_A_A_A_ACs_A_A____Cs_A__ ___________________ACLCLCrCLCL_A________________Cr_A______Cr_A__ ___________________A_ACLCrCL_A_A______________Cs_A_A____Cs_A_A__ _____________________ACLCrCL_A____________CLCs_A_A______CL_A_A__ _____________________A_ACL_A_A__________Cs_A_A_A________Ct_A____ _______________________ACL_A____________CL_A________CrCs_A_A____ _______________________A_A_A_____________ACtCLCtCrCL_A_A_A______ _________________________A_A_______________A_A_A_A_A_A__________ } # tile 191 (large box) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________BsBsBsCFBsBsBsCFBsBsCFBsBsBsBsCFBsBsCFBsBsCFBsBs____ __________BsBsBsCFBsBsBsCFBsBsCFBsBsBsBsCFBsBsCFBsBsCFBsBsAw____ ________BsBsBsCFBsBsBsCFBsBsBsCFBsBsBsCFBsBsCFBsBsCFBsBsAwAw____ ______BsBsBsCFBsBsBsCFBsBsBsCFBsBsBsCFBsBsBsCFBsBsCFBsBSAwBS____ ____BsBsBsBsCFBsBsCFBsBsBsCFBsBsCFCFBsBsBsCFBsBsCFBsAwBSBSAw____ __BsBsBsBsCFBsBsBsBsCFBsCFBsBsCFBsBsBsBsCFBsCFBsBsBSAwBSBSAw____ BsBsBsBsCFBsBsBsBsBsCFBsBsBsCFBsBsBsBsCFBsBsCFBsAwBSBSAwBSAw____ BSBSBSBsBSBSBsBSBSBSBsBSBSBSBsBSBSBsBSBSBSBsBSAwAwBSAwAwBSAw____ BSBSBSBsBSBSBsBSBSBSBsBSBSBSBsBSBSBsBSBSBSBsBSAwBSBSAwAwBSAw_A_A BsBsBsBsBsBsBsBsBkCJBnBkBkCPBkBkBsBsBsBsBsBsBsBSAwBSAwAwBSAw_A_A BSBSBSBsBSBsBSAwBdBdBd_z_ABdBdBkAwBSBsBSBSBsBSAwAwBSAwBSAwBS_A_A BSBSBSBsBSBsBSAwBdBdBd_A_ABdBdBdAwBSBsBSBSBsBSAwAwBSAwBSAwBS_A_A BSBSBSBsBSBsBSAwBdBdBdBdBdBdBdBdAwBSBsBSBSBsBSAwAwBSAwBSAwBS_A_A BSBSBSBsBSBsBSBSAwAwAwAwAwAwAwAwBSBSBsBSBsBSBSAwBSAwAwBSAwBS_A_A BSBSBsBSBSBSBsBSBSBsBSBSBsBSBSBSBsBSBsBSBsBSBSAwBSAwAwBSAw_A_A_A BSBSBsBSBSBSBsBSBSBsBSBSBsBSBSBSBsBSBsBSBsBSBSAwBSAwAwBS_A_A_A_A BSBSBsBSBsBSBsBSBSBsBSBSBSBsBSBSBsBSBsBSBsBSBSAwBSAwAw_A_A_A_A__ BSBSBsBSBsBSBsBSBSBSBsBSBSBsBSBSBsBSBSBSBsBSBSAwBSAw_A_A_A_A____ BSBSBsBSBsBSBsBSBSBSBsBSBSBsBSBSBsBSBSBSBsBSBSAwBS_A_A_A_A______ BSBSBsBSBsBSBsBSBSBSBsBSBSBsBSBSBsBSBSBSBsBSBSAw_A_A_A_A________ _A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A__________ ___A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A____________ } # tile 192 (chest) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______CrCLB_BSBsBsBSBsBSBSBSCrCLB_BSBsBsBSBsBSBsCrCLBbCL________ ____CrBbB_BSBsBSBsBSBsBSBSCrBbB_BSBsBsBSBsBSBsCrCLAzB_B_BbB_____ __CrCLB_BSBsBSBsBSBsBSBSCrCLB_BSBsBSBSBSBsBSCrBbB_AwBSAvCLB_____ __CrBZB_BiBsBSBsBSBsBSBSCrBZB_BiBsBSBsBSBsBSCrCLB_BSAwAwCLAz____ CrCLCrCrCrCrCrCrCrCrCrCrCLCrCrCrCrCrCrCrCrCrCLB_AwBSAwAwBbB_____ CrBbCLCLBZCLBbCLBZCLBbCLBZCLCLBZCLBbCLBZCLBZCLAwBSBSBSCLCLB_____ CrBvB_BSBSB$BiBSBsBiBRCrCLB_BSCABSBsB$BiBSCrBbB_AwBiBZCLBZB_____ CrCLB_BSBsBsBSBSBsBSBSCrBZB_BSBsBSBsBsBSBSCrCLB_AwCLBbBSCLB__A_A CrBbB_BSBSBsBSBSBsBSBSCrCLB_BSBSBsBSBSBsBSCrCLB_BZCLB_AwBbB__A_A CrCLB_BSBsBsBSBSCrCrCrCrCrCrCrCrCrBSBsBSBSCrBZB_CLAxAwBSCLB__A_A CrBZCrCrCrCrCrCrCrCLBbCLBZCLBZCLB_CrCrCrCrCLCLB_B_AwAwBSBvB__A_A CrCLCLBZCLBbCLBZCrCLBv_z_zCLBbCLAzBzBvBzBZCLBZB_AwBSBSAwCLB__A_A CrBZB_BSB$BSBSCACrBtCLBbCLBbCIBtB_BSBsCABRCrCLB_AwAwBRBbB_B__A_A CrCLB_BSBsBSBsBSCrB_B_B_B_B_B_B_B_BSBsBSBsCrBZB_AwAwCLB_B__A_A_A CrBbB_BSBSBSBsBSBSBsBSCrCLB_BSBSBsBSBsBSBsCrCLB_BRBbB_B__A_A_A_A CrCLB_BSBsBSBsBSBSBsBSCrBZB_BiBSBsBSBsBSBsCrCLB_CLB_B__A_A_A_A__ CrBvCrCrCrCrCrCrCrCrCrCrCLCLCrCrCrCrCrCrCrCUCLBZB_B__A_A_A_A____ CrBzCLBZCLBbCLBZCLCLBZCLBZCLBZCLBbCLCLBZCLCLBZB_B__A_A_A_A______ CrCGBvCLBtCLBvCLCLBZCLCGBvCLBtCLBvCLBZCLCGBvCLB__A_A_A_A________ _A_A_A_A_A_A_B_A_A_A_A_A_A_A_A_A_B_A_A_A_A_A_A_A_A_A_A__________ ___A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A____________ } # tile 193 (ice box) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ _____________k_k_k_k_k_k_k_k_k_k_k_k_k_k_k_k_k_k_k_k_k_k_k_k____ ___________k_k_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_k_k_a____ _________k_k_k_k_k_k_k_k_k_k_k_k_k_k_k_k_k_k_k_k_k_k_k_k_a_a____ _______k_k_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_k_k_a_a_a____ _____k_k_k_k_k_k_k_k_k_k_k_k_k_k_k_k_k_k_k_k_k_k_k_k_a_a_a_a____ ___k_k_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_k_k_a_aCm_a_a____ _k_k_k_k_k_k_k_k_k_k_k_k_k_k_k_k_k_k_k_k_k_k_k_k_a_aC$AlCP______ _f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_a_aC$C$BJ______ _f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_a_a_aC$CP_A_A_A _f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_a_aBJBdC$CP_A_A _f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_aBJBdBdBdC$CP_A _f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_fAjBdBdBdBd_AC$_A BdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBJBdBdBdBdBdC$CP_A __CPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPBdBdBdBdBdBd_A_A_A __CPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPBdBdBdBdBdBd_A_A_A __CPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPBdBdBdBdBd_A_A_A_A __CPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPBdBdBdBd_A_A_A_A__ __CPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPBdBdBd_A_A_A_A____ __CPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPBdBd_A_A_A_A______ __CPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPBd_A_A_A_A________ ___A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A__________ _____A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A____________ } # tile 194 (bag / sack) { ________________________________________________________________ __________________________CcCcCF________________________________ ____________________CcCcCFCFCFCFBs______________________________ __________________CcCFCF_A_A_ACFCFBs____________________________ ______________CcCcBsBs_A_A_ACFCFCFBsBs__________________________ ______________CcBs_A_A_ABsBsCFCFCFCFBs__________________________ ______________CFCFCFBsBsBsCFCFCFBsBsBsBs________________________ ________________BsBsCFCFCFCFCFCFCFBsBsBs________________________ ____________________BsCFCFCFCFBsBsBsBsBs________________________ ______________________BsBsBsBsBsBsBsBsBs________________________ __________________________CLBsBsBsCLCrCL________________________ __________________________CrCrCrCrCrCrBs________________________ ________________________CFBsCrCrCrBsBsBsBS______________________ ________________________CFCrCLCLBsBsCFBsBs______________________ ______________________CFCrCrCFCrCLCFCFCFBsBS____________________ ______________________CFCrBsCFCrCrCFCFCFBsBS____________________ __________________CFCFCFCrBsCFCFCrBsCFCFBsBsBS__________________ ______________CcCcCFCFCrCFBsCFCFCrBsCFCFBsBsBS__________________ ____________CcCFCFCFCFCFBsCFCFCFCFBsCFCFBsBsBsBS________________ __________CFCFCFCFCFCFCFCFCFCFCFCFBsCFCFCFBsBsBSAw______________ ________CcCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFBsBsBsBSAw___________A_A ________CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFBsBsBsBSAwAw_A___A_A_A_A ______BsCFCFCFCFCFCFCFCFCFCFCFCFCFCFBsBsBsBsBsBSBSAwAY_A_A_A_A_A ______BsCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFBsBsBSBSBSBSAwAY_A_A_A_A__ ______BsBsCFCFCFCFCFCFCFCFCFCFCFCFBsBsBsBsBsBSBSBSAwAY_A_A_A____ ______BSBsBsBsCFCFCFCFCFCFBsBsBsBsBsBsBsBsBSBSBSAwAwAY_A_A_A____ ______BSBSBsBsBsBsBsBsBsBsBsBsBsBsBsBSBSBSBSBSBSAwAYAY_A_A______ ________BSBSBsBsBsBsBsBsBsBsBSBSBSBSBSBSBSBSBSAwAwAY_A_A_A______ ________BSBSBSBSBSBsBsBSBSBSBSBSBSBSBSBSBSAwAwAwAY_A_A_A________ ____________BSBSBSBSBSBSBSBSBSBSBSAwAwAwAwAwAYAY_A_A_A__________ _______________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A____________ _____________________A_A_A_A_A_A_A_A_A_A_A_A_A_A________________ } # tile 195 (bag / oilskin sack) { ________________________________________________________________ __________________________CcCcCF________________________________ ____________________CcCcCFCFCFCFBs______________________________ __________________CcCFCF_A_A_ACFCFBs____________________________ ______________CcCcBsBs_A_A_ACFCFCFBsBs__________________________ ______________CcBs_A_A_ABsBsCFCFCFCFBs__________________________ ______________CFCFCFBsBsBsCFCFCFBsBsBsBs________________________ ________________BsBsCFCFCFCFCFCFCFBsBsBs________________________ ____________________BsCFCFCFCFBsBsBsBsBs________________________ ______________________BsBsBsBsBsBsBsBsBs________________________ __________________________CLBsBsBsCLCrCL________________________ __________________________CrCrCrCrCrCrBs________________________ ________________________CFBsCrCrCrBsBsBsBS______________________ ________________________CFCrCLCLBsBsCFBsBs______________________ ______________________CFCrCrCFCrCLCFCFCFBsBS____________________ ______________________CFCrBsCFCrCrCFCFCFBsBS____________________ __________________CFCFCFCrBsCFCFCrBsCFCFBsBsBS__________________ ______________CcCcCFCFCrCFBsCFCFCrBsCFCFBsBsBS__________________ ____________CcCFCFCFCFCFBsCFCFCFCFBsCFCFBsBsBsBS________________ __________CFCFCFCFCFCFCFCFCFCFCFCFBsCFCFCFBsBsBSAw______________ ________CcCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFBsBsBsBSAw___________A_A ________CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFBsBsBsBSAwAw_A___A_A_A_A ______BsCFCFCFCFCFCFCFCFCFCFCFCFCFCFBsBsBsBsBsBSBSAwAY_A_A_A_A_A ______BsCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFBsBsBSBSBSBSAwAY_A_A_A_A__ ______BsBsCFCFCFCFCFCFCFCFCFCFCFCFBsBsBsBsBsBSBSBSAwAY_A_A_A____ ______BSBsBsBsCFCFCFCFCFCFBsBsBsBsBsBsBsBsBSBSBSAwAwAY_A_A_A____ ______BSBSBsBsBsBsBsBsBsBsBsBsBsBsBsBSBSBSBSBSBSAwAYAY_A_A______ ________BSBSBsBsBsBsBsBsBsBsBSBSBSBSBSBSBSBSBSAwAwAY_A_A_A______ ________BSBSBSBSBSBsBsBSBSBSBSBSBSBSBSBSBSAwAwAwAY_A_A_A________ ____________BSBSBSBSBSBSBSBSBSBSBSAwAwAwAwAwAYAY_A_A_A__________ _______________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A____________ _____________________A_A_A_A_A_A_A_A_A_A_A_A_A_A________________ } # tile 196 (bag / bag of holding) { ________________________________________________________________ __________________________CcCcCF________________________________ ____________________CcCcCFCFCFCFBs______________________________ __________________CcCFCF_A_A_ACFCFBs____________________________ ______________CcCcBsBs_A_A_ACFCFCFBsBs__________________________ ______________CcBs_A_A_ABsBsCFCFCFCFBs__________________________ ______________CFCFCFBsBsBsCFCFCFBsBsBsBs________________________ ________________BsBsCFCFCFCFCFCFCFBsBsBs________________________ ____________________BsCFCFCFCFBsBsBsBsBs________________________ ______________________BsBsBsBsBsBsBsBsBs________________________ __________________________CLBsBsBsCLCrCL________________________ __________________________CrCrCrCrCrCrBs________________________ ________________________CFBsCrCrCrBsBsBsBS______________________ ________________________CFCrCLCLBsBsCFBsBs______________________ ______________________CFCrCrCFCrCLCFCFCFBsBS____________________ ______________________CFCrBsCFCrCrCFCFCFBsBS____________________ __________________CFCFCFCrBsCFCFCrBsCFCFBsBsBS__________________ ______________CcCcCFCFCrCFBsCFCFCrBsCFCFBsBsBS__________________ ____________CcCFCFCFCFCFBsCFCFCFCFBsCFCFBsBsBsBS________________ __________CFCFCFCFCFCFCFCFCFCFCFCFBsCFCFCFBsBsBSAw______________ ________CcCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFBsBsBsBSAw___________A_A ________CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFBsBsBsBSAwAw_A___A_A_A_A ______BsCFCFCFCFCFCFCFCFCFCFCFCFCFCFBsBsBsBsBsBSBSAwAY_A_A_A_A_A ______BsCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFBsBsBSBSBSBSAwAY_A_A_A_A__ ______BsBsCFCFCFCFCFCFCFCFCFCFCFCFBsBsBsBsBsBSBSBSAwAY_A_A_A____ ______BSBsBsBsCFCFCFCFCFCFBsBsBsBsBsBsBsBsBSBSBSAwAwAY_A_A_A____ ______BSBSBsBsBsBsBsBsBsBsBsBsBsBsBsBSBSBSBSBSBSAwAYAY_A_A______ ________BSBSBsBsBsBsBsBsBsBsBSBSBSBSBSBSBSBSBSAwAwAY_A_A_A______ ________BSBSBSBSBSBsBsBSBSBSBSBSBSBSBSBSBSAwAwAwAY_A_A_A________ ____________BSBSBSBSBSBSBSBSBSBSBSAwAwAwAwAwAYAY_A_A_A__________ _______________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A____________ _____________________A_A_A_A_A_A_A_A_A_A_A_A_A_A________________ } # tile 197 (bag / bag of tricks) { ________________________________________________________________ __________________________CcCcCF________________________________ ____________________CcCcCFCFCFCFBs______________________________ __________________CcCFCF_A_A_ACFCFBs____________________________ ______________CcCcBsBs_A_A_ACFCFCFBsBs__________________________ ______________CcBs_A_A_ABsBsCFCFCFCFBs__________________________ ______________CFCFCFBsBsBsCFCFCFBsBsBsBs________________________ ________________BsBsCFCFCFCFCFCFCFBsBsBs________________________ ____________________BsCFCFCFCFBsBsBsBsBs________________________ ______________________BsBsBsBsBsBsBsBsBs________________________ __________________________CLBsBsBsCLCrCL________________________ __________________________CrCrCrCrCrCrBs________________________ ________________________CFBsCrCrCrBsBsBsBS______________________ ________________________CFCrCLCLBsBsCFBsBs______________________ ______________________CFCrCrCFCrCLCFCFCFBsBS____________________ ______________________CFCrBsCFCrCrCFCFCFBsBS____________________ __________________CFCFCFCrBsCFCFCrBsCFCFBsBsBS__________________ ______________CcCcCFCFCrCFBsCFCFCrBsCFCFBsBsBS__________________ ____________CcCFCFCFCFCFBsCFCFCFCFBsCFCFBsBsBsBS________________ __________CFCFCFCFCFCFCFCFCFCFCFCFBsCFCFCFBsBsBSAw______________ ________CcCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFBsBsBsBSAw___________A_A ________CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFBsBsBsBSAwAw_A___A_A_A_A ______BsCFCFCFCFCFCFCFCFCFCFCFCFCFCFBsBsBsBsBsBSBSAwAY_A_A_A_A_A ______BsCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFBsBsBSBSBSBSAwAY_A_A_A_A__ ______BsBsCFCFCFCFCFCFCFCFCFCFCFCFBsBsBsBsBsBSBSBSAwAY_A_A_A____ ______BSBsBsBsCFCFCFCFCFCFBsBsBsBsBsBsBsBsBSBSBSAwAwAY_A_A_A____ ______BSBSBsBsBsBsBsBsBsBsBsBsBsBsBsBSBSBSBSBSBSAwAYAY_A_A______ ________BSBSBsBsBsBsBsBsBsBsBSBSBSBSBSBSBSBSBSAwAwAY_A_A_A______ ________BSBSBSBSBSBsBsBSBSBSBSBSBSBSBSBSBSAwAwAwAY_A_A_A________ ____________BSBSBSBSBSBSBSBSBSBSBSAwAwAwAwAwAYAY_A_A_A__________ _______________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A____________ _____________________A_A_A_A_A_A_A_A_A_A_A_A_A_A________________ } # tile 198 (key / skeleton key) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________CrCr______________________________________________ ____________CrCLCLCL_A__________________________________________ ____________CrCLCLCL_A__________________________________________ ________CrCrCLBZBZCL_A__________________________________________ ______CrCLCLBZ_A_ACrCrCrCrCrCrCrCrCrCrCrCrCrCrCrCrCrCrCL_A______ ______BZCLCLBZ_A_ACrCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLBZ_A______ _______ABZBZCLCrCrCLBZBZBZBZBZBZBZBZBZCrCLB_CrCLB_CrCLBZ_A______ _______A_A_ABZCLCLBZ_A_A_A_A_A_A_A_A_ACrCL_ABZBZ_ACrCLBZ_A______ ___________ABZCLCLBZ_A_______________ACrCL_A_A_A_ACrCLBZ_A______ _____________ABZBZ_A_A_______________A_A_A_A_A_A_A_A_A_A_A______ _____________A_A_A_A_____________________A_A_____A_A_A_A________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 199 (lock pick) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ _______v_k_k_k_k_b_bBMBMBMBMBMBMBMBM__________BMBMBM____________ _____v_k_k_A_A_b_bBMBMBMBMBMBMAiBD_A_A________BFBD_A_A__BM______ _____v_k_b_A___bBMBMBMBMBMBMBMBMBMBMBMBMBMBMBMBMBFBM____BM_A____ _____k_k_bBMBMBMBFBdAiBdAiBdAiBdBMBMAiBdAiBDBMBMBMBMBMBMBMBM____ _____k_k_bBMBMBDAi_A_A_A_A_A_A_A_ABMBd_A_A_ABMBMAi_z_ABMBD_A_A__ _____k_k_bBMBFBd_A_A____________BMBMAi_A_A_ABFBd_z_A__BMAi_A____ _____k_k_bBMBFAi_A______________BMBD_A_A____BMBFBF____BMBd_A____ _______k_bBMAiBd_A_________________M_A________BdAiBD____Ai_A____ _________A_A_z_A_A_______________________________A_M_A_____A____ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 200 (credit card) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______CmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCm______ ____CmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCm_A__ ____CmCmAlAlAlAlAlAlAlAlAlAlAlAlAlAlAlAlAlAlAlAlAlAlAlAlCmCm_A_A ____CmCmAl_r_r_r_r_r_r_r_r_r_r_r_r_r_r_r_r_r_r_r_r_r_rAlCmCm_A_A ____CmCmAl_r_ACm_A_A_r_A_A_r_A_r_r_A_r_A_r_A_A_r_A_r_rAlCmCm_A_A ____CmCmAl_r_A_A_r_A_ACm_A_r_A_r_A_r_A_A_r_ACm_A_r_A_rAlCmCm_A_A ____CmCmAl_r_r_r_r_r_r_r_r_r_r_r_r_r_r_r_r_r_r_r_r_r_rAlCmCm_A_A ____CmCmAl_r_r_r_r_r_r_r_r_r_r_A_A_r_r_r_r_r_r_r_r_r_rAlCmCm_A_A ____CmCmAl_r_r_r_r_r_r_r_r_r_ACm_A_A_r_r_r_r_r_r_r_r_rAlCmCm_A_A ____CmCmAl_r_ACm_AC$_r_ACm_ACm_A_A_r_A_r_A_ACm_ACm_r_rAlCmCm_A_A ____CmCmAl_rC$_r_A_ACm_A_r_A_ACmCm_r_A_rC$_A_rC$_ACm_rAlCmCm_A_A ____CmCmAl_r_A_r_r_A_r_ACm_A_ACmCm_r_A_r_ACm_r_A_A_r_rAlCmCm_A_A ____CmCmAl_r_r_r_r_r_r_r_r_A_ACmCm_A_A_r_r_r_r_r_r_r_rAlCmCm_A_A ____CmCmAl_r_r_r_r_r_r_r_r_r_A_A_A_A_r_r_r_r_r_r_r_r_rAlCmCm_A_A ____CmCmAl_r_r_ACm_A_r_ACm_A_r_A_A_r_r_A_r_ACm_A_A_r_rAlCmCm_A_A ____CmCmAl_r_A_r_A_A_r_A_A_r_r_r_r_r_rCm_A_r_A_r_r_A_rAlCmCm_A_A ____CmCmAl_r_r_r_r_r_r_r_r_r_r_r_r_r_r_r_r_r_r_r_r_r_rAlCmCm_A_A ____CmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCm_A_A ______CmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCm_A_A_A _______A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A__ _________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A____ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 201 (candle / tallow candle) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________C$C$C$C$____________________________________________ ____________C$C$C$C$C$__________________________________________ _____________A_A_A_AC$C$__CPCPCP________________________________ _________________A_AC$C$C$CPCPCPCm______________________________ ___________________A_ACPC$C$CPCPC$Cm____________________________ ___________________ACPCPC$CPCPCmC$C$Cm__________________________ ___________________ACPCPCPCPCPCmCmC$C$Cm________________________ ___________________ACPCPCPCmCmCmCmCmC$C$Cm______________________ ___________________A_ACPCPCPCmCmCmCmCmC$C$Cm____________________ _____________________A_ACPCPCPCmCmCmCmCmC$C$Cm__________________ _______________________A_ACPCPCPCmCmCmCmCmC$C$Cm________________ _________________________A_ACPCPCPCmCmCmCmCmC$C$Cm______________ ___________________________A_ACPCPCPCmCmCmCmCmC$C$Cm____________ _____________________________A_ACPCPCPCmCmCmCmCmC$C$Cm__________ _______________________________A_ACPCPCPCmCmCmCmCmC$C$Cm________ _________________________________A_ACPCPCPCmCmCmCmCmC$C$_A______ ___________________________________A_ACPCPCPCmCmCmCmCmC$_A______ _____________________________________A_ACPCPCPCmCmCmCm_A_A_A____ _______________________________________A_ACPCPCPCmCmCm_A_A______ _________________________________________A_ACPCPCP_A_A_A________ ___________________________________________A_A_A_A_A_A__________ _____________________________________________A_A_A_A____________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 202 (candle / wax candle) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________C$C$C$C$____________________________________________ ____________C$C$C$C$C$__________________________________________ _____________A_A_A_AC$C$__CPCPCP________________________________ _________________A_AC$C$C$CPCPCPCm______________________________ ___________________A_ACPC$C$CPCPC$Cm____________________________ ___________________ACPCPC$CPCPCmC$C$Cm__________________________ ___________________ACPCPCPCPCPCmCmC$C$Cm________________________ ___________________ACPCPCPCmCmCmCmCmC$C$Cm______________________ ___________________A_ACPCPCPCmCmCmCmCmC$C$Cm____________________ _____________________A_ACPCPCPCmCmCmCmCmC$C$Cm__________________ _______________________A_ACPCPCPCmCmCmCmCmC$C$Cm________________ _________________________A_ACPCPCPCmCmCmCmCmC$C$Cm______________ ___________________________A_ACPCPCPCmCmCmCmCmC$C$Cm____________ _____________________________A_ACPCPCPCmCmCmCmCmC$C$Cm__________ _______________________________A_ACPCPCPCmCmCmCmCmC$C$Cm________ _________________________________A_ACPCPCPCmCmCmCmCmC$C$_A______ ___________________________________A_ACPCPCPCmCmCmCmCmC$_A______ _____________________________________A_ACPCPCPCmCmCmCm_A_A_A____ _______________________________________A_ACPCPCPCmCmCm_A_A______ _________________________________________A_ACPCPCP_A_A_A________ ___________________________________________A_A_A_A_A_A__________ _____________________________________________A_A_A_A____________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 204 (lamp / oil lamp) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________CjCj____________________________ ______________________________CiCjCjCi__________________________ ____CiCjCjCz______________CnCjCjCiCiCjCjCi______________________ ________CjCjCjCz______CjCiCiCjCjCjCjCjCjCnCiCj__________________ ____________CjCjCj__CjC$C$CjCiCjCjCjCjCiCjCjCjCjCjCjCj__________ ______________CjCjCjCjCjCjC$CjCiCiCiCiCjCjCjCjCjCzCzCjCj________ ________________CzCjCjCjCjCjCjCjCjCjCjCjCjCjCjCiCzCzCjCj_L______ _______________L__CzCnCtCjCjCjCjCjCjCjCjCjCjCiCjCzCjCj_L_z_A____ _________________A_L_zCzCzCjCjCjCjCjCjCjCMCnCzCzCjCM_A_A_A_A____ _______________________ACzCzCiCjCjCjCjCiCzCzCz_L_A_A_A_A_A______ ________________________CiCnCjCjCMCMCjCjCnCi_z_A_A_A_A__________ __________________________CiCjCjCjCjCjCjCi_z_A_A_A______________ _____________________________zCjCjCjCj_z_z_A_A__________________ ______________________________AA_z_L_z_A_A_A____________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 205 (lamp / magic lamp) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________CjCj____________________________ ______________________________CiCjCjCi__________________________ ____CiCjCjCz______________CnCjCjCiCiCjCjCi______________________ ________CjCjCjCz______CjCiCiCjCjCjCjCjCjCnCiCj__________________ ____________CjCjCj__CjC$C$CjCiCjCjCjCjCiCjCjCjCjCjCjCj__________ ______________CjCjCjCjCjCjC$CjCiCiCiCiCjCjCjCjCjCzCzCjCj________ ________________CzCjCjCjCjCjCjCjCjCjCjCjCjCjCjCiCzCzCjCj_L______ _______________L__CzCnCtCjCjCjCjCjCjCjCjCjCjCiCjCzCjCj_L_z_A____ _________________A_L_zCzCzCjCjCjCjCjCjCjCMCnCzCzCjCM_A_A_A_A____ _______________________ACzCzCiCjCjCjCjCiCzCzCz_L_A_A_A_A_A______ ________________________CiCnCjCjCMCMCjCjCnCi_z_A_A_A_A__________ __________________________CiCjCjCjCjCjCjCi_z_A_A_A______________ _____________________________zCjCjCjCj_z_z_A_A__________________ ______________________________AA_z_L_z_A_A_A____________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 206 (expensive camera) { ________________________________________________________________ ________________________________________________________________ _______________________A_A_A_A_A_AAOAO__________________________ _____________________ACjCMCMCjCsCM_AAB_A________________________ _____________________ACMCjCMCjCsCj_AAB_A________________________ ____________________AOCsCsCsCsCsCsAOAO_A________________________ ____________________AB_A_A_A_A_A_A_MAB_A________________________ ____________________AB_A_A_A_A_A_A_zAO_A________________________ ____________________AB_A_A_A_A_A_AABAB_A________________________ _______________________MABAB_MAB_MABAO__________________________ __________________________AOABAAABAO____________________________ __________________________AO_A_A_A______________________________ __________________________AOAOAOAB______________________________ __________________________CPBDBdBJBD____________________________ ________________________BkCPBkBkBkBkCP__________________________ ________________________BkBkCPCPBkBkBkBk________________________ ______________________CPCPCPBkCPBnBkCPBkBD______AlAeAl__________ _____________M_M____BkCPBlCOBnCKCOCKBkBDCPCP____BkBkBk__________ __________CPCPCJCPCPBdCPCOCKCPBmCPBdBkCPBkCPBkCPCPBnCJBnBk______ ________BkBkCPBnCJBnBkBkBkBkBkBDBkCPBkBkBnCJCPBnCJBkCPCJBk______ ________BkBdBkCPCPBdCPBkCPBnCKAlAlCPBkBdBdBDBdBDBDBdBDBdBD______ _________MAB_MBDBkAlBkBkBkBkCOCPAOBkAOAOABAB_AABAB_A_A_M_M______ ________AAA__MCJAlBkCVCo_MBkBkBkBkABBkAOABABABABAB_A_AAB_$______ _________M_MBdAOBkCoCo_M_z_MBkBkCP_MBkAOABABABABAB_A_AAB_M______ ________ABAABdAOBk_M_z_A_A_ABkCPCm_MBDAOABABABABAB_A_A_MAK______ ________A__MBdAOCP_A_A_A_A_ABkBkCV_$BDAOABABABABAB_A_AAB_M______ _________MAABDAOCK_N_A_A_A_MBkCPCP_MBdAOABABABABAB_A_A_M_$______ ________A_AO_MAOBkBk_M_AAABkBDCPBDABBkABABABABABAB_A_AAK_O______ ________ABAOAlBdAOBkBdBDBdBkCPCPABBdAOABABABABAB_M_AAB_A_A______ ________BDBkBkBkBkAOAOAOBkCPCPAlBkCPCPCPBkCPBnCPCJBkBkBkBk_A____ __________CPCPCPCPBkBnCPBkBkBdCPCJBnCPCPCPCPCJCPCPCPCPCP_A______ ___________A_A_A_A_A_A_A_A_A_A_A_A_z_A_A_A_A_A_A_A_A_A_A________ } # tile 207 (looking glass / mirror) { ________________________________________________________________ ________________________________________________________________ ______________BSBSBSBSBS________________________________________ __________BSBSBSBSBSBSBSBSBS____________________________________ ________BSBSBSBSBSBSBSBSBSBSBSBS________________________________ ______BSBSBSBSCJBnBkCPBkBSBSBSBSBS______________________________ ______BSBSBSBkBnCJCPBkCVCPCPBSBSBSBS____________________________ ____BSBSBSBnCJBkCPBkCVCPCPCPC$BSBSBSBS__________________________ ____BSBSBSBkBlCWBlCWCPCPCPC$CPC$BSBSBSBS________________________ ____BSBSBSCJCPBmCPCPCPCPC$CPC$C$C$BSBSBS________________________ ____BSBSBSCPBlCPCPCPCPC$CPC$C$C$C$C$BSBSBS______________________ ____AwBSBSBkCWCPCPCPC$CPC$C$C$C$C$C$BSBSBS______________________ _____ABSBSBiCPCPCPC$CPC$C$C$C$C$C$CPC$BSBSBS____________________ _____AAwBSBSCPCPC$CPC$C$C$C$C$C$CPC$CPBSBSBS____________________ _____A_ABSBSBSC$CPC$C$C$C$C$C$CPC$CPCPBSBSBS____________________ _______AAwBSBSBSC$C$C$C$C$C$CPC$CPCPBkBSBSBS____________________ _______A_AAwBSBSBSC$C$C$C$CPC$CPCPBkCVBSBSBS____________________ _________A_AAwBSBSBSC$C$CPC$CPCVBkCPBSBSBSBS____________________ ___________A_AAwBSBSBSBSC$CPCPBkCVBSBSBSBSBS____________________ _____________A_AAwBSBSBSBSBSBSBSBSBSBSBSBSBS____________________ _______________A_A_AAwAwBSBSBSBSBSBSBSBSBSBSBS__________________ ___________________A_A_AAwAwAwAwAwAwAwAwBSBSBSBS________________ _______________________A_A_A_A_A_A_A_A_AAwBSBSBSBS______________ _______________________________________A_AAwBSBSBSBS____________ _________________________________________A_AAwBSBSBSBS__________ ___________________________________________A_AAwBSBSBSBS________ _____________________________________________A_AAwBSAAAABS______ _______________________________________________A_AAw_zAABS______ _________________________________________________A_AAwAwAw______ ___________________________________________________A_A_A_A______ ________________________________________________________________ ________________________________________________________________ } # tile 208 (glass orb / crystal ball) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ _________________________f_f_b_b________________________________ _____________________k_g_g_f_g_f_b_b____________________________ ___________________k_k_k_k_g_b_f_f_b_a__________________________ _________________k_kC$C$_g_g_g_f_f_b_a_b________________________ _________________k_kC$C$_k_g_g_f_f_b_b_b________________________ _______________f_g_k_k_k_g_g_f_g_f_f_b_a_b______________________ _______________f_g_g_k_k_g_g_g_f_b_b_b_a_b______________________ _______________f_f_f_g_g_f_g_f_f_f_b_b_a_b___A_A_A_A____________ _______________f_f_f_f_f_f_f_b_f_b_a_b_a_b_A_A_A_A_A_A__________ _________________f_f_f_f_f_f_f_b_b_b_a_a_A_A_A_A_A_A_A_A________ _________________f_f_f_b_a_a_a_a_a_b_a_b_A_A_A_A_A_A_A_A________ ________________CZ_a_b_b_a_a_a_a_a_a_bAU_A_A_A_A_A_A_A__________ ________________CZCZ_a_a_b_a_a_a_a_aAUBO_A_A_A_A_A_A____________ ______________CZCZCZBOBO_b_a_a_aAUAUBOArAr_A_A_A_A______________ _____________ACZCZCCCCCCBOBOBOAUBpBOArArAr_A_A_A________________ _____________ACZCCCCCCCCBpBpBpBOBOBOArArAr_A_A_A_A______________ _______________ACCCCCCBpBpBpBpBOBOBOArAr_A_A_A_A________________ _______________A_ACCCCBpBpBpBpBOBOBOAr_A_A_A_A__________________ ___________________A_ABpBpBpBOBOBO_A_A_A_A______________________ _____________________A_A_A_A_A_A_A_A____________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 210 (blindfold) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________BvBvBWBvBvBvAz____BvBvBvBvBvBWBv________________ ______________BvBWBWBWBWBWBWBWAzBvBWBWBWBWBWBWBWBW______________ ____________BvBWBWAzAzAzAzBWBWBWBWBWBWAzAzAzBWBWBWAz____________ ____________BvBWAzBWBWBWBWBWBWBWBWBWAzBWBWBWBWBWBWAz_A__________ ____________BvBWBWCo_A_ACoBWBWAzBWBWBWCo_A_ACoBWBWAz_A__________ __________BvBvBWBWBWBWBWBWBWBWAzAzBWBWBWBWBWBWBWAzAzAz_A________ ________BvBW_ABWBWBWBWBWBWBWAz_A_ABWBWBWBWBWBWAzAz_ABWAz_A______ ________BvBW_A_ABWBWAzBWAzAz_A_A_A_ABWAzAzBWAzAz_A_ABWAz_A______ ________BWAz_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_ABWAz_A______ __________BWBW_A_A_A_A_A_A_A_A_____A_A_A_A_A_A_A_A__BWAz_A______ ____________BWBWAz_A_A______________________________BWAz_A______ ______________BWBWAz_A______________________________BWAz_A______ __________________BWAz____________________________BWAz_A_A______ ____________________BWAz________________________BWBW_A_A________ ____________________BWAz_A______________________BWAz_A_A________ ____________________BWBWAz______________________BWAz_A__________ ______________________BWBWAzAz________________BWAz_A_A__________ ________________________BWBWBWAz____________BWAz_A_A____________ ___________________________A_A_A_A_____________A_A______________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 211 (towel) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________________________________BM____BM__BM____BM________ __________________________________BMBMBMBMBMBMBMBMBMBMBMBM______ ________________________________BMBMBMClBMClClClBMClBMClBM_A____ ________________________________ClClClClClClClClClClClClCl_A_A__ ______________________________ClClClClClClClClClClClClClCO_A_A__ ______________________________ClClClClClClClClClClClClClCO_A_A__ ______________________________ClClClClClClClClClClClClClCO_A_A__ __________ClClClClClClClClClClClClClClClClClCOCOClClClClCO_A_A__ ________ClClClClClClClClClClClClClBM_kClClClClCOCOClCOCO_A_A_A__ ______ClClClClClClClClClClClClClClBMBMBMClClClClClClCl_A_A_A____ ______ClClClClClClClClClClClClClClBDBMBMClClClClClClCl_A_A______ ______ClClClClClClClClClClClClClClAiBdBFBMClClClClClCO_A_A______ ______COClClClClClClClClClClClClClBdAiBMBMClClClClCO_A_A_A______ ______COCOClClClClClClClClClClClClAiBMBMBMBMBMClCl_A_A_A________ ____ClClClClCOClClCOCOCOCOClClClAiBDBdBMBMBMBMBMCO_A_A_A________ __ClClClClClClClClClClClClClClBdAiBdAiBdAiBMBMBMBM_A_A__________ __ClClClClClClClClClClClClClCl_A_A_A_A_ABdBMBMBM_A_A_A__________ __ClClClClClClClClClClClBMClCl_A_A_A_A_A_A_A_A_A_A_A_A__________ __ClClClClBMClBMClBMBMBMBMBMCl_A_A___A_A_A_A_A_A_A_A____________ __ClBMClBMBMBMBMBMBMBMBM_ABMBM_A_A______________________________ __BMBMBMBM_ABM_A_ABM_A_A_A_A_A_A________________________________ _____ABM_A_A_A_A_A_A_A_A_A_A_A_A________________________________ _____A_A_A_A_A_____A_____A______________________________________ _______A________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 213 (leash) { ________________________________________________________________ ____________________________________BsCFCFCFCFCFCFCFCFBs________ __________________________________BsAwBsBsAw_A_AAwAwAwBsAw______ ________________________________BsBsCFCFAwAwAwAwAwAwBsCFBsBs____ ________________________________BsAwBsBsBsBsCFCFCFCFCFBsBsAw_A__ _________________________________A_A_A_ABsAwAwBsBsAwAwAwAw_A_A__ __________________________CFBsBsBsBsBsBsBsBsBsBs_A_A_A_A_A_A____ ______________________CFBsBsBsBsBsAwAwAwAw_A_A_A_A______________ ____________________CFBsBsAw_A_A_A_A_A_A_A_A____________________ __________________CFBsAw_A_A_A__________________________________ __________________BsBs_A_A______________________________________ ________________CFBsAw_A________________________________________ ________________BsAw_A_A________________________________________ ________________BsAwAw__________________________________________ ________________BsBsAwAw____CFCFBsAw____________________________ __________________BsBsBsCFCFAwAwBsBsBsAw________________________ ____________________AwBsAwAw_A_AAwAwBsBsAw______________________ _______________________A_A_A_A_____AAwBsBs_A____________________ ______________________________________CFBsAw_A__________________ ______________________________________CFBsAw_A__________________ ____________________________________CFCFBsAw_A__________________ ______________C$C$CSCSCSCSCSCS__CSBMCFBsBsAw_A__________________ ____________C$CSBMBDAiBdAiBMBMBMBMBMBsBsAw_A_A__________________ ____________C$BMAi_A_A_A_ABdAiBdAiBDAwAw_A_A____________________ ____________CSBMBMBd_A_______A_A_A_A_A_A_A______________________ ______________CSBMAi_A__________________________________________ ________________CSBMBd__________________________________________ __________________CSAi_A________________________________________ ____________________CSBd________________________________________ _______________________A_A______________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 214 (stethoscope) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________CVBIC$C$____________C$C$BDAi________________________ __________CSBFBMCJBk_A__________BnBkBMBMBD______________________ ________CVBFAi_A_M_A_A_____________z_ABMBMAi____________________ ________BIBM_A__________________________BMBd_A__________________ ________CVBM_A__________________________BMAi_A__________________ ________BhBM_A__________________________BFBd_A__________________ __________CVAi________________________CVAi_A_A__________________ __________CSBM_A______________________BFBd_A____________________ ____________BnBd____________________CSAi_A_A____________________ ____________CSBF_A__________________BFBD_A______________________ ______________CVAi________________BnBF_A_A______________________ ______________CSBM_A______________BMBD_A________________________ ________________BnBF____________CSAi_A_A______________CtCt______ ________________CSBFBD________BnBFBD_A______________CtCsCL_A____ __________________CVBICSBnCSCVBFBF_A_A____CcBsBsCtCtCsCsCL_A____ ____________________CVBMBMBFBMAi_A_A____CcBsAwAwCLCLCsCsCL_A____ ____________________BIBMBsAwBMBd_A______BsAw_A_A_A_ACLCsCL_A____ ____________________BMBdCcAwBDAi_A______BsAw_A________CLCL_A____ ________________________CcAw_A_A_A______BsAw_A___________A_A____ ________________________CcAw_A__________BsAw_A__________________ ________________________CcAw_A________CcBsAw_A__________________ ________________________BsBsAw______CcBsAw_A_A__________________ __________________________BsBsCcCcCcBsAw_A_A____________________ ____________________________AwAwAwAwAw_A_A______________________ _______________________________A_A_A_A_A________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 215 (tinning kit) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________ClClClClClClClClClClClClClClClClClClClCl______ ________________ClClBMCOCOCOCOCOCOCOCOCOCOCOCOCOCOCOClClBM______ ______________ClClBMBMCOCOCOCOCOCOCOCOCOCOCOCOCOCOClClBMBM______ ____________ClClBMBMBMCOCOCOCOCOCOCOCOCOCOCOCOCOClClBMBMBM______ __________ClClBMBMBMBMCOCOCOCOCOCOCOCOCOCOCOCOClClBMBMBMBM______ ________ClClClClClClClClClClClClClClClClClClClClBMBMBMBMBM______ ________ClClClClClClClClClClClClClClClClClClClClBMBMBMBMBM______ ________ClClClClClClCl_k_k_k_f_f_f_b_bClClClClClBMBMBMBMBM______ ________ClClClClClCl_k_k_kBnBnBMBM_b_b_bClClClClBMBMBMBMBM______ ________ClClClClClCl_k_kBnBnBnBMBMBM_b_bClClClClBMBMBMBMBM_A____ ________ClClClClClCl_k_k_k_f_f_f_f_b_bBDClClClClBMBMBMBM_A_A_A__ ________ClClClClClClCV_k_k_k_f_f_b_bAiBdClClClClBMBMBM_A_A_A_A__ ________ClClClClClClBICSBnBnBnBMBMBMBdAiClClClClBMBM_A_A_A_A_A__ ________ClClClClClClCVBnBnBnBnBMBMBMAiBdClClClClBM_A_A_A_A_A____ ________ClClClClClClBICSBnBnBnBMBMBMBdAiClClClCl_A_A_A_A_A______ ___________A_A_A_A_ACVBIBnBnBnBMBMBMAiBd_A_A_A_A_A_A_A_A________ _____________A_A_A_ACSCVBnBnBnBMBMBMAiBD_A_A_A_A_A_A____________ ____________________BnCSBnBnBnBMBMBMBdAi________________________ ____________________CSBnBnBnBnBMBMBMAiBd________________________ _____________________kCSBnBnBnBMBMBMBd_b________________________ _____________________k_kBnBnBnBMBMBM_b_b________________________ _____________________A_k_k_k_f_f_b_b_b_A_A_A_A_A_A_A____________ _____________________A_A_k_k_f_f_b_b_A_A_A_A_A_A_A_A_A__________ _______________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A__________ _________________________A_A_A_A_A_A_A_A_A_A_A_A_A______________ ________________________________________________________________ ________________________________________________________________ } # tile 216 (tin opener) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________CP______________________________ ________________________________CPCP_A_A________________________ ________________________________CPCPBk_A_A______________________ ________________________________CPCPBnBd_A_A____________________ ________________________________CPCPCJBd_A_A_A__________________ __________________________Bk____CPCPBkBdBd_A_A__________________ ________________________BdBn___ACPCPBnBdBd_A_A__________________ ________________________BdCJ_A_ACPCPCJBdBd_A_A__________________ ________________________BdBnBk_ACPBnBkBdBd_A_A__________________ ________________________BdBkCJBnCPCJBkBk_A_A_A__________________ ________________________BdBkBMCJBkBkBdBd_A_A_A__________________ __________________________BdBdBkCPBdBd_A_A_A_A__________________ ____________________________BdBkBkBd_A_A_A_A____________________ ____________________________BSBSAwAw_A_A_A______________________ ____________________________BSBSAwAw_A_A________________________ ____________________________BSBSAwAw_A_A________________________ ____________________________BSBSAwAw_A_A________________________ ____________________________BSBSAwAw_A_A________________________ ____________________________BSBSAwAw_A_A________________________ ____________________________BSBSAwAw_A_A________________________ ____________________________BSBSAwAw_A_A________________________ ____________________________BSBSAwAw_A_A________________________ ____________________________BSBSAwAw_A_A________________________ ____________________________BSBSAwAw_A_A________________________ ____________________________BSBSAwAw_A_A________________________ ______________________________AwAw_A_A_A________________________ _________________________________A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ } # tile 217 (can of grease) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________________BkBkCPBkBkBn______________________________ __________________CPBkBaBaBaBaBaBaCJBk__________________________ ________________BkBaBaBaBaBaBaBaBaBaBaBd___A_A_A_A_A____________ ________________BkBaBaBWAgBWAzBWAzBaBaBd_A_A_A_A_A_A_A__________ ________________CPAzAzAgAzAzAgAzAgBWAzAg_z_A_A_A_A_A_A__________ ________________BkByByAzBaAzBaAzBWAgBdAz_A_A_A_A_A_A_A__________ ________________BmByByCPBaBaAzBmBaAzBdBW_L_A_A_A_A_A_A__________ ________________CKByByCPBaBaBmBlBaBWBdAz_A_A_A_A_A_A____________ ________________BkCPByCPBkBaBkCJBdBaBdBL_A_A_A_A_A______________ ________________BmCPByCPCPBaBkBnBdBaBdBd_A_A_A_A________________ ________________BlCPByCPBkBaCPBkBdBkBdBd_A_A_A_A________________ ________________CJCPCPCVBkBaBkCJBdBnBdBd_A_A_A__________________ ________________CPCPCPCPBkBaBnBkBdCJBdBk_M_A____________________ _________________AC$C$CVBkCVCJBkBdCVBk_A_A______________________ _________________A_A_AC$CPCPCPCVBk_M_A_A________________________ _____________________A_A_A_A_A_A_A_A____________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 218 (figurine) { ________________________________________________________________ ____________CzCFCF__________CFCFBsBs____________________________ ____________CzCzCF________CzCzCzCFBsBS__________________________ ____________CzCFCF______CzCzBsCzCFBsBsBS________________________ ____________CFCF________CFCzCzBsBsBsBsBS________________________ __________CzCF________CFCzCzCFCFCFBsBsBS________________________ ________CzCFCF________CFBsBsCFCFBsBsBSBS________________________ ________CzCF__________CFCzBsCFBsBsBSBS__________________________ ________BsCFCF__________CzCFBsBSBSBS____________________________ __________BsCFCFCF______CFBsBsBS________________CzCzCz__________ ____________CFCFCFCFCzCFCzCFBs________________CzCzCzCFBs________ ____________BsCFCFCzCzCzCzCzCFBs________CzCzCzCFCFCFCFBs________ ____________BsCFCzCzCzCzCzCzCzCzCzCzCFCzCzCFBs____BsBs__________ ______________BsCFCzCzCzCzCzCzBsBsCzCzBsBsBs____________________ ______________BsBsCzBsCzCzCzBsBSBSBSBSBSBs______________________ ________________BsBsBsBSCzBsBsBSBS_______A___________A_A________ ________________CFCFBsBsBsBSBSBS_________A_A_______A_A_A_A______ ______________CFCzCFCFBsBSBSBS_____________A_A___A_A_A_A_A______ ____________CFCzCzCzCFBsBSBS_A___________A_A_A_A_A_A_A_A_A______ ____________CzCzCzCzCFBsBSBS_A_A___A_A_A_A_A_A_A_A_A_A_A________ __________CFCzCzCzCFCFCFBsBS_A_ABSAwAw_A_A_A_A_A_A_A_A_____A_A__ __________BsCFCzCFCFCFCFCFBsBsBSBSBSAwAw_A_A_A_A_A_A_A_A_A_A____ __________BSBsCFCFCFCFCFBsBsBsBsBSBSBSAwAw_A_A_A_A_A_A__________ ____________BsBsCFBsBsBsBsBsBsBSBSBSAwAwAw_A_A_A_A_A____________ ____________BSBsBsBsBsBsBsBsBsBSBSBSAwAwAw_A_A_A_A_A____________ ____________BSBSBsBsBsBsBsBsBSBSBSAwAwAwAw_A_A_A_A______________ ____________BSBSBSBSBSBsBSBSBSBSAwAwAwAwAw_A_A_A________________ __________BSBSAwBSBSBSBSBSBSBSAwAwAwAwAw_A_A_A_A________________ __________AwAwAwAwAwBSBSAwAwAwAwAwAw_A_A_A_A_A__________________ ____________Aw__AwAwAwAwAwAwAwAw_A_A_A_A________________________ _____________________________A_A_A_A____________________________ ________________________________________________________________ } # tile 219 (magic marker) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________ChCoCK_A_A______________ ______________________________________CoChCKCKCK_A_A____________ ____________________________________CgChCgCKCKBY_A_A____________ __________________________________ChCXCJCJCJBYBY_A_A____________ ________________________________CtCoCOCJCJBXBY_A_A______________ ______________________________CoCtCOCOCOBXBX_A_A________________ ____________________________CRCRBmCOCOBcBX_A_A__________________ __________________________CRCRBmBmBmBcBc_A_A____________________ ________________________CSCSBnBmBmBcBc_A_A______________________ ______________________CSCSBnBnBnBcAj_A_A________________________ ____________________CQCQBlBnBnAiBc_L_A__________________________ ____________________CQBlBlBlAiBD_A_A____________________________ __________________CVCVCPBlBDBd_B_A______________________________ __________________CVCPBdBDAm_A_A________________________________ ________________CVCPBdBk_A_A_A__________________________________ ________________AeBk_A_A_A______________________________________ ______________Ae_A_A_A__________________________________________ _______________A_A______________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 226 (horn / tooled horn) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________________________________ClClBk______________ __________________________________________ClC$ClCVBk____________ ________________________________________ClC$ClCPBkBk____________ ______________________________________ClC$ClCPCVBkBd____________ ____________________________________ClC$ClClCPBkBk______________ __________________________________ClC$ClClCPCPBkBd______________ ______________________________ClClC$ClClCPCPBkBd________________ __________________________CPCPClClClClCPCPBnBkBd________________ __________________CmCmCmBkBkCVCPClCPCPCPBkCJBd__________________ ______________CmCmCmCmCmCmCPBkCPCPCPCPCJBnBdBd__________________ ____________CmCmAwAwAwAwCmCmBkCPBkBkBnBkCJBd_________A_A________ __________CmCmAwAwAwAYAYAYCmCmBDCPBkCJBdBdBd_______A_A_A________ __________CmAwAwAwAYAY_A_A_ACmBdBdBkBkBdBd_____A_A_A_A_A________ ________CmCmAwAwAYAY_A_A_A_ACmCmBdBdBdBdBd_A_A_A_A_A_A__________ ________CmAwAwAYAYAY_A_A_A_AAYCmBdBdBdBd_A_A_A_A_A_A_A__________ ________CmAwAwAYAYAY_A_A_AAYAYCmBdBdBdBd_A_A_A_A_A_A____________ ________CmCmAwAYAYAYAYAYAYAYCmCmBdBdBd_A_A_A_A_A_A______________ __________CmAwAwAYAYAYAYAYAwCmBdBdBd_A_A_A_A_A_A________________ __________CmCmAwAwAwAwAwAwCmCmBdBd_A_A_A_A_A_A__________________ ____________CmCmAwAwAwAwCmCmBdBd_A_A_A_A_A_A____________________ ______________CmCmCmCmCmCmBdBd_A_A_A_A_A_A______________________ __________________CmCmBdBd_A_A_A_A_A_A_A________________________ ___________________A_A_A_A_A_A_A_A_A____________________________ _____________________A_A_A_A_A_A________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 227 (horn / frost horn) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________________________________ClClBk______________ __________________________________________ClC$ClCVBk____________ ________________________________________ClC$ClCPBkBk____________ ______________________________________ClC$ClCPCVBkBd____________ ____________________________________ClC$ClClCPBkBk______________ __________________________________ClC$ClClCPCPBkBd______________ ______________________________ClClC$ClClCPCPBkBd________________ __________________________CPCPClClClClCPCPBnBkBd________________ __________________CmCmCmBkBkCVCPClCPCPCPBkCJBd__________________ ______________CmCmCmCmCmCmCPBkCPCPCPCPCJBnBdBd__________________ ____________CmCmAwAwAwAwCmCmBkCPBkBkBnBkCJBd_________A_A________ __________CmCmAwAwAwAYAYAYCmCmBDCPBkCJBdBdBd_______A_A_A________ __________CmAwAwAwAYAY_A_A_ACmBdBdBkBkBdBd_____A_A_A_A_A________ ________CmCmAwAwAYAY_A_A_A_ACmCmBdBdBdBdBd_A_A_A_A_A_A__________ ________CmAwAwAYAYAY_A_A_A_AAYCmBdBdBdBd_A_A_A_A_A_A_A__________ ________CmAwAwAYAYAY_A_A_AAYAYCmBdBdBdBd_A_A_A_A_A_A____________ ________CmCmAwAYAYAYAYAYAYAYCmCmBdBdBd_A_A_A_A_A_A______________ __________CmAwAwAYAYAYAYAYAwCmBdBdBd_A_A_A_A_A_A________________ __________CmCmAwAwAwAwAwAwCmCmBdBd_A_A_A_A_A_A__________________ ____________CmCmAwAwAwAwCmCmBdBd_A_A_A_A_A_A____________________ ______________CmCmCmCmCmCmBdBd_A_A_A_A_A_A______________________ __________________CmCmBdBd_A_A_A_A_A_A_A________________________ ___________________A_A_A_A_A_A_A_A_A____________________________ _____________________A_A_A_A_A_A________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 228 (horn / fire horn) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________________________________ClClBk______________ __________________________________________ClC$ClCVBk____________ ________________________________________ClC$ClCPBkBk____________ ______________________________________ClC$ClCPCVBkBd____________ ____________________________________ClC$ClClCPBkBk______________ __________________________________ClC$ClClCPCPBkBd______________ ______________________________ClClC$ClClCPCPBkBd________________ __________________________CPCPClClClClCPCPBnBkBd________________ __________________CmCmCmBkBkCVCPClCPCPCPBkCJBd__________________ ______________CmCmCmCmCmCmCPBkCPCPCPCPCJBnBdBd__________________ ____________CmCmAwAwAwAwCmCmBkCPBkBkBnBkCJBd_________A_A________ __________CmCmAwAwAwAYAYAYCmCmBDCPBkCJBdBdBd_______A_A_A________ __________CmAwAwAwAYAY_A_A_ACmBdBdBkBkBdBd_____A_A_A_A_A________ ________CmCmAwAwAYAY_A_A_A_ACmCmBdBdBdBdBd_A_A_A_A_A_A__________ ________CmAwAwAYAYAY_A_A_A_AAYCmBdBdBdBd_A_A_A_A_A_A_A__________ ________CmAwAwAYAYAY_A_A_AAYAYCmBdBdBdBd_A_A_A_A_A_A____________ ________CmCmAwAYAYAYAYAYAYAYCmCmBdBdBd_A_A_A_A_A_A______________ __________CmAwAwAYAYAYAYAYAwCmBdBdBd_A_A_A_A_A_A________________ __________CmCmAwAwAwAwAwAwCmCmBdBd_A_A_A_A_A_A__________________ ____________CmCmAwAwAwAwCmCmBdBd_A_A_A_A_A_A____________________ ______________CmCmCmCmCmCmBdBd_A_A_A_A_A_A______________________ __________________CmCmBdBd_A_A_A_A_A_A_A________________________ ___________________A_A_A_A_A_A_A_A_A____________________________ _____________________A_A_A_A_A_A________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 229 (horn / horn of plenty) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________________________________ClClBk______________ __________________________________________ClC$ClCVBk____________ ________________________________________ClC$ClCPBkBk____________ ______________________________________ClC$ClCPCVBkBd____________ ____________________________________ClC$ClClCPBkBk______________ __________________________________ClC$ClClCPCPBkBd______________ ______________________________ClClC$ClClCPCPBkBd________________ __________________________CPCPClClClClCPCPBnBkBd________________ __________________CmCmCmBkBkCVCPClCPCPCPBkCJBd__________________ ______________CmCmCmCmCmCmCPBkCPCPCPCPCJBnBdBd__________________ ____________CmCmAwAwAwAwCmCmBkCPBkBkBnBkCJBd_________A_A________ __________CmCmAwAwAwAYAYAYCmCmBDCPBkCJBdBdBd_______A_A_A________ __________CmAwAwAwAYAY_A_A_ACmBdBdBkBkBdBd_____A_A_A_A_A________ ________CmCmAwAwAYAY_A_A_A_ACmCmBdBdBdBdBd_A_A_A_A_A_A__________ ________CmAwAwAYAYAY_A_A_A_AAYCmBdBdBdBd_A_A_A_A_A_A_A__________ ________CmAwAwAYAYAY_A_A_AAYAYCmBdBdBdBd_A_A_A_A_A_A____________ ________CmCmAwAYAYAYAYAYAYAYCmCmBdBdBd_A_A_A_A_A_A______________ __________CmAwAwAYAYAYAYAYAwCmBdBdBd_A_A_A_A_A_A________________ __________CmCmAwAwAwAwAwAwCmCmBdBd_A_A_A_A_A_A__________________ ____________CmCmAwAwAwAwCmCmBdBd_A_A_A_A_A_A____________________ ______________CmCmCmCmCmCmBdBd_A_A_A_A_A_A______________________ __________________CmCmBdBd_A_A_A_A_A_A_A________________________ ___________________A_A_A_A_A_A_A_A_A____________________________ _____________________A_A_A_A_A_A________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 230 (harp / wooden harp) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________AwAwAw______________________________AwAwAY__________ __________AwAwAwAwAY__________________________AwAwAwAwAY________ ________AwAwAwAwAwAwAY______________________AwAwAwAwAwAwAY______ ________AwAwAY__AwAwAYAYAYAYAYAYAYAYAYAYAYAYAwAwAY__AwAwAY______ ________AwAY____AwAwAAAAAAAAAAAAAAAAAAAAAAAAAwAwAY____AwAY______ ________________AwAwAY____Bk____Bk____Bk____AwAwAY______________ ______________AwAwAwAJ____Bk____Bk____Bk____AwAwAwAY____________ ______________AwAwAYBk____Bk____Bk____Bk____BkAwAwAY____________ ____________AwAwAwAYBk____Bk____Bk____Bk____BkAwAwAwAY__________ ____________AwAwAY__Bk____Bk____Bk____Bk____Bk__AwAwAY__________ ____________AwAwAY__Bk___ABk____Bk____Bk____Bk__AwAwAY___A_A____ ____________AwAwAY__Bk_A_ABk_A__Bk____Bk____Bk__AwAwAY_A_A_A_A__ ____________AwAwAY__Bk_A__Bk_A_ABk_A_ABk_A_ABk_AAwAwAY_A_A_A_A__ ____________AwAwAwAYBk___ABk_A__Bk___ABk_A__BkAwAwAwAY_A________ ______________AwAwAYBk_A_ABk____Bk_A__Bk___ABkAwAwAY_A_A________ ______________AwAwAwAY_A_ABk___ABk___ABk_A__AwAwAwAY_A__________ ________________AwAwAwAwAwBk_A__Bk_A__AwAwAwAwAwAY_A_A__________ __________________AwAwAwAwAwAwAwAwAwAwAwAwAwAwAY_A_A____________ ____________________AYAwAwAwAwAwAwAwAwAwAwAYAY_A_A______________ _____________________AAYAYAwAwAwAwAwAwAYAY_A_A_A________________ _________________________A_A_A_A_A_A_A_A_A______________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 231 (harp / magic harp) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________AwAwAw______________________________AwAwAY__________ __________AwAwAwAwAY__________________________AwAwAwAwAY________ ________AwAwAwAwAwAwAY______________________AwAwAwAwAwAwAY______ ________AwAwAY__AwAwAYAYAYAYAYAYAYAYAYAYAYAYAwAwAY__AwAwAY______ ________AwAY____AwAwAAAAAAAAAAAAAAAAAAAAAAAAAwAwAY____AwAY______ ________________AwAwAY____Bk____Bk____Bk____AwAwAY______________ ______________AwAwAwAJ____Bk____Bk____Bk____AwAwAwAY____________ ______________AwAwAYBk____Bk____Bk____Bk____BkAwAwAY____________ ____________AwAwAwAYBk____Bk____Bk____Bk____BkAwAwAwAY__________ ____________AwAwAY__Bk____Bk____Bk____Bk____Bk__AwAwAY__________ ____________AwAwAY__Bk___ABk____Bk____Bk____Bk__AwAwAY___A_A____ ____________AwAwAY__Bk_A_ABk_A__Bk____Bk____Bk__AwAwAY_A_A_A_A__ ____________AwAwAY__Bk_A__Bk_A_ABk_A_ABk_A_ABk_AAwAwAY_A_A_A_A__ ____________AwAwAwAYBk___ABk_A__Bk___ABk_A__BkAwAwAwAY_A________ ______________AwAwAYBk_A_ABk____Bk_A__Bk___ABkAwAwAY_A_A________ ______________AwAwAwAY_A_ABk___ABk___ABk_A__AwAwAwAY_A__________ ________________AwAwAwAwAwBk_A__Bk_A__AwAwAwAwAwAY_A_A__________ __________________AwAwAwAwAwAwAwAwAwAwAwAwAwAwAY_A_A____________ ____________________AYAwAwAwAwAwAwAwAwAwAwAYAY_A_A______________ _____________________AAYAYAwAwAwAwAwAwAYAY_A_A_A________________ _________________________A_A_A_A_A_A_A_A_A______________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 232 (bell) { ________________________________________________________________ ________________________________________________________________ ____________________________CzCF________________________________ __________________________CzBSBSCF______________________________ ________________________CzBS____CFBS____________________________ ________________________CFBS____CFBS____________________________ __________________________CcCzCFBS______________________________ ________________________CFCcCFCFBsBS____________________________ ______________________CFCcCzCcCFBsBSAw__________________________ ____________________CFCFCzCzCcCFBsBSAwAw________________________ ____________________CFCcCzCzCcCFBsBSBSAw________________________ ____________________CFCcCzCzCFCFBsBSBSAw_______A_A_A_A_A________ __________________CFCFCzCzCzCFCFBsBSBSAwAw_A_A_A_A_A_A_A_A______ __________________CFCFCzCzCzCFCFBsBSBSBSAw_A_A_A_A_A_A_A_A______ __________________CFCcCzCzCcCFCFBsBSBSBSAw_A_A_A_A_A_A_A_A______ __________________CFCzCcCzCcCFCFBsBsBSBSAw_A_A_A_A_A_A_A_A______ ________________BsCFCzCcCzCcCFCFBsBsBSBSAwAw_A_A_A_A_A_A_A______ ______________CFBsCFCzCcCzCcCFCFBsBsBSBSAwAwAw_A_A_A_A_A________ ____________CFCFCcBsCzCcCzCcCFCFBsBsBSBSAwAwAwAw_A_A_A_A________ ____________CFCcCcBsCzCcCzCcCFCFBsBsBSAwAwAwAwAw_A_A_A__________ ____________CFCcCcCzBsCcCzCcCFCFBsBsBSAwAwAwAwAw_A_A_A__________ ____________CFCcCcCzCzBsBsBSBSBSBSBSAwBSBSAwAwAw_A_A____________ ______________CcCzCzCzCzCzCFCFCFBsBsBSBSBSBSAw_A_A_A____________ _______________ACzCzCzCzCFCFCFCFBsBsBsBSBSBS_A_A_A______________ _______________A_A_ACzCzCFCFCFCFBsBsBsBS_A_A_A_A________________ _________________A_A_A_A_ABsBsBSBSAw_A_A_A_A_A__________________ ___________________A_A_A_ABsBsBSAwAw_A_A_A_A____________________ _______________________A_A_ABSBSAw_A_A_A________________________ ___________________________A_A_A_A_A____________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 233 (bugle) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________CICI____________________________________________________ ______CiCiCICI__________________________________________________ ______CiCiCiCICI________________________________________________ ____CICICiCiCiCICI______________________________________________ ____CiCiCICICiCiCICI____________________________________CI______ ____CiCiCiCiCICiCiCICICICI____________________________CICI______ ____CICICICICICICICICiCICICICICICICICICICICICICICICICICICI_A____ ____CICICICICICICICICIBWBWBWBWBWBWBWBWBWBWBWBWBWBWBWBWBWCI_A____ ____CICICICIBWBWBWBWBWBWBW_A_ACIAzAzAzAzAzAzCICI_A_A_ABWBW_A_A_A ____CICIBWBWCIBWBWBW_A_A_A_ACICIAzAzAzAzAzAzAzCIAz_A_A_ABW_A_A_A ____BWBWCICIBWBWBW_A_A_A_A_ACIAz_A_A_A_A_A_A_ACIAz_A_A_A_A_A____ ______CIBWBWBWBW_A_A_A_A_A_ACIAz_A_A_A_A_A_A_ACIAz_A_A_A_A_A____ _____ABWBWBWBW_A_A_A_______ACIAzAz_A_A_A_A_ACICIAz_A_A_A________ _____A_ABWBW_A_A_A_A_______A_ACICICICICICICICIAz_A_A_A_A________ _______A_A_A_A_A_____________A_AAzAzAzAzAzAzAz_A_A_A____________ _________A_A_A_A_____________A_A_A_A_A_A_A_A_A_A_A_A____________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 234 (drum / leather drum) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________ClClClClClCl__________________________ ____________________ClClClClClClClClClClClCl____________________ ________________ClClClClClClClClClClClClClClClCl________________ ______________ClClClClClClClClClClClClClClClClClCl______________ ____________ClClClClClClClClClClClClClClClClClClClCl____________ __________BdClClClClClClClClClClClClClClClClClClClClBJ__________ __________BdBdClClClClClClClClClClClClClClClClClClAlAj__________ __________BdBdBSClClClClClClClClClClClClClClClClBSBDBJ_A_A_A____ __________BdBdBSBsBsClClClClClClClClClClClClBsBSBSAlAj_A_A_A_A__ __________BdBdBSBsBsBdBdBsClClClClClClBsBdBdBsBSBSBDBJ_A_A_A_A__ ____________BSBSBsBsBdBdBsBsBsBsBsBsBsBsBdBdBsBSBSAw_A_A_A_A_A__ ____________BsBsBsBsBdBdBsBsBsBsBsBsBsBsBdBdBsBSBSAw_A_A_A_A_A__ ____________BsBsBsBsBdBdBsBsBsBsBsBsBsBsBdBdBsBSBSAw_A_A_A_A____ ______________BSBsBsBdBdBsBsBsBsBsBsBsBsBdBdBSBSAw_A_A_A_A_A____ ______________BSBSBsBSBSBsBsBsBsBsBsBsBsBSBSBSBSAw_A_A_A_A______ ________________BSBSBSBSBSBSBSBSBSBSBSBSBSBSBSAw_A_A_A_A________ __________________BSBSBSBSBSBSBSBSBSBSBSBSAwAw_A_A_A_A__________ ___________________A_AAwAwAwAwAwAwAwAwAwAw_A_A_A_A_A____________ _____________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A______________ _________________________A_A_A_A_A_A_A_A_A_A____________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 235 (drum / drum of earthquake) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________ClClClClClCl__________________________ ____________________ClClClClClClClClClClClCl____________________ ________________ClClClClClClClClClClClClClClClCl________________ ______________ClClClClClClClClClClClClClClClClClCl______________ ____________ClClClClClClClClClClClClClClClClClClClCl____________ __________BdClClClClClClClClClClClClClClClClClClClClBJ__________ __________BdBdClClClClClClClClClClClClClClClClClClAlAj__________ __________BdBdBSClClClClClClClClClClClClClClClClBSBDBJ_A_A_A____ __________BdBdBSBsBsClClClClClClClClClClClClBsBSBSAlAj_A_A_A_A__ __________BdBdBSBsBsBdBdBsClClClClClClBsBdBdBsBSBSBDBJ_A_A_A_A__ ____________BSBSBsBsBdBdBsBsBsBsBsBsBsBsBdBdBsBSBSAw_A_A_A_A_A__ ____________BsBsBsBsBdBdBsBsBsBsBsBsBsBsBdBdBsBSBSAw_A_A_A_A_A__ ____________BsBsBsBsBdBdBsBsBsBsBsBsBsBsBdBdBsBSBSAw_A_A_A_A____ ______________BSBsBsBdBdBsBsBsBsBsBsBsBsBdBdBSBSAw_A_A_A_A_A____ ______________BSBSBsBSBSBsBsBsBsBsBsBsBsBSBSBSBSAw_A_A_A_A______ ________________BSBSBSBSBSBSBSBSBSBSBSBSBSBSBSAw_A_A_A_A________ __________________BSBSBSBSBSBSBSBSBSBSBSBSAwAw_A_A_A_A__________ ___________________A_AAwAwAwAwAwAwAwAwAwAw_A_A_A_A_A____________ _____________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A______________ _________________________A_A_A_A_A_A_A_A_A_A____________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 236 (pick-axe) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ___________________________s_s_s_s______________________________ _________________________oApApBM_s_s_s__________________________ _________________________o_o_o_o_o_o_o_s_s______________________ ___________________________j_j_j_j_o_o_o_s_s____________________ ___________________________________j_jAp_o_o_sBSBs______________ _____________________________________M_MAi_o_o_sBS_M____________ ______________________________________AK_j_j_o_o_s_M____________ ________________________________________CF_j_jAp_o_s____________ ______________________________________CFBsBSAA_M_o_o_s__________ ____________________________________CFBsBS_MA__MAK_o_o_s_M______ __________________________________CFBsBSA__M_____z_M_o_o_s_M____ ________________________________CFBsBS_MAA_____________o_sAK____ ______________________________CFBsBSAB_M________________Ap_s_M__ ____________________________CFBsBS_M_z_____________________o_M__ __________________________CFBsBS_zAB_______________________oAA__ ________________________CFBsBS_MAB___________________________M__ ______________________CFBsBS_O_z________________________________ ____________________CFBsBS_MAK__________________________________ __________________CFBsBSAA_M____________________________________ ________________CFBsBS_MA_______________________________________ ______________CFBsBSAA_M________________________________________ ____________CFBsBS_MA___________________________________________ __________CFBsBSAA_M____________________________________________ _________M_MBS_MA_______________________________________________ ________AB_zAK_M________________________________________________ ___________M_M__________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 238 (unicorn horn) { __________________________________________________ChCK__________ ________________________________________________CoCK_A_A________ ______________________________________________ChChCK_z_A________ ____________________________________________CKChCK_B_A__________ __________________________________________CJCJBwCK_z_A__________ ________________________________________ChCXCgBw_A_A____________ ________________________________________CiCgCJ_z_A______________ ____________________________________COCOCJCJ_A_A_A______________ __________________________________CtCXClCOBz_M_A________________ ________________________________CoClClCOBm_A_A__________________ ________________________________BmBmBLBL_A_A_A__________________ ____________________________CRCRCOBmBmBL_A_A____________________ __________________________CRCRBnCRBmBLBL_A_A____________________ __________________________CRCRBmBmBLBL_A_A______________________ ______________________CSBnBnBnBMBM_A_A_A________________________ ____________________CSCSBICVBnBnBM_A_A_A________________________ __________________CSCSCVCSBnBnBFBM_A_A__________________________ __________________CSCVBIBnBnBFBM_A_A_A__________________________ ______________CQBlBlBlBKBKBK_A_A_A_A____________________________ ____________CQCQCQBlCQBlBlBK_A_A_A______________________________ ____________CQCQCQBlBlBlBKBK_A_A________________________________ ___________A_BCKBnBlBlBKBK_A_A_A________________________________ ___________A_A_BBlBlBKBK_A_A_A__________________________________ _____________A_A_A_B_A_A_A_A_A__________________________________ _______________A_A_A_A_A_A_A____________________________________ _________________A_A_A_A_A______________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 239 (candelabrum / Candelabrum of Invocation) { ______________________________CL________________________________ ______________________________Bb________________________________ __________________________CrCrCtCrCrCr__________________________ ____________________________CtCrBZCL____________________________ ______________________________CtCr______________________________ ______________________________CtCr______________________________ ____________CL________________CtCr______________CL______________ ____________Bb________________CtCr______________Bb______________ ________CrCrCtCrCrCr__________CtCr__________CrCrCtCrCrCr________ __________CtCrBZCL____________CtCr____________CtCrBZCL__________ ____CL______CtCr______CL______CtCr______CL______CtCr________CL__ ____BZ______CtCr______Bb______CtCr______BZ______CtCr________Bb__ CrCtCrCrCr__CtCr__CrCrCtCrCr__CtCr__CrCrCtCrCr__CtCr__CrCrCtCrCr __CrBbCL____CtCr____CtCrCL____CtCr____CtBbCL____CtCr____CtCrCL__ __CtCr______CtCr______CtCr____CtCr____CtCr______CtCr______CtCr__ __CtCr______CtCr______CtCr____CtCr____CtCr______CtCr______CtCr__ __CtCr______CtCr______CtCr____CtCr____CtCr______CtCr______CtCr__ ____CrCtCtCtCtCrCtCtCtCr______CtCr______CrCtCtCtCtCrCtCtCtCr____ ____________CrCr______________CtCr______________CrCr____________ ____________CtCr______________CtCr_______A_A____CtCr_________A__ ____________CtCrCt____________CtCr_____A_A____CtCrCL_______A_A__ ______________CLCrCrCtCtCtCtCtCtCrCtCtCtCtCtCrCrCL_______A_A____ ________________CLBbCLBZCLCLBZCrCrCLBbCLBZCLBb_________A_A_____A ______________________________CrCr___z_A_z_z_________A_A________ ______________________________CtCr_____A_A_A_____A_A_A_________A ______________________________CtCr_______A_A_A_A_A_A_________A_A ____________________________CrCtCrCL_______A_A_A_A_A_______A_A_A __________________________CrCrCtCrCLBb_A_A_A_A_A_A_A_A_A_A_A_A__ ________________________CrCrCtCtCrBZCLCL_A_A_A_A___A_A_A_A_A____ ______________________CrCrCtCtCrCrCrCLBZCL_A_______A_A_A________ _______________________A_ACtCtCrCrCrBZ_$_A______________________ _________________________A_A_A_A_A_A_z_A________________________ } # tile 240 (silver bell / Bell of Opening) { ________________________________________________________________ ________________________________________________________________ ____________________________C$Bk________________________________ __________________________C$BdBkBk______________________________ ________________________C$Bd____BkBk____________________________ ________________________BkBd____BkBd____________________________ __________________________BkC$BkBk______________________________ ________________________BkC$C$CJBdBd____________________________ ______________________BkCPC$BkBnBkBdBJ__________________________ ____________________CJBnBkC$COBkCKBdAlAj________________________ ____________________BkBkC$C$BkBnBkBdBkBJ________________________ ____________________BnC$C$C$CKBkCJBdBdAl_______A_A_A_A_A________ __________________BkCJC$C$C$BmBkBnBdBdBDAl_A_A_A_A_A_A_A_A______ __________________BnBkC$C$C$CJBlCJBdBdBdBD_A_A_A_A_A_A_A_A______ __________________CJBnC$C$C$BkBmBlBdBdBdAl_A_A_A_A_A_A_A_A______ __________________BkBkC$C$BkC$BlCOBkBdBdBJ_A_A_A_A_A_A_A_A______ ________________BdCPBkC$C$BkC$BkBkCPBdBdAjBJ_A_A_A_A_A_A_A______ ______________C$BdBkBkC$C$BkC$BnCJBkBdBdBDAlBJ_A_A_A_A_A________ ____________BkBkC$BkBkC$C$BkC$BkBnBkBdBdAlBDAlBD_A_A_A_A________ ____________CPBkC$BkBkC$C$BkC$COBkCKBdAlBDAlBDAl_A_A_A__________ ____________BkCPC$C$BdBkC$BkC$BkBlBmBdBdBDAlBDAl_B_A_A__________ ____________BkBkC$C$C$BdBdBkBdBdBjBdBkBkBdBJAjBJ_A_A____________ ______________C$C$C$C$C$C$BkBlCOBlBkCJBdBdBdAl_B_A_A____________ _______________AC$C$C$BkC$CPBkBkCOBkBnBdBdBd_A_A_A______________ _______________A_A_ABkCPCoBkCOBlBkCKBkBd_A_A_A_A________________ _________________A_A_A_A_ABdBdBdBdBJ_L_A_A_A_A__________________ ___________________A_A_A_ABdBdBdBDAl_A_A_A_A____________________ _______________________A_A_ABdBdAj_A_A_A________________________ ___________________________A_A_A_A_A____________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 241 (tripe ration) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________AvBRBRBRBRBRAvBRBR____________________________ ______________BRAvBRBRAvAvAvBRBRBRBRBRAvBRBR____________________ ____________BRBRAvAvAvAvBRBRAXAvAvAvBRBRBRAvBRAvBR______________ __________BRAvAvAvAvAXAvAvAvAvAvAvAXAvAvAvAvAvBRBRBRBR__________ __________BRBRAvAvAvAvBRAvAvAvAXAvAvAvAvAXAvAXAvAvBRAvBR________ __________BRAvAvAvAXAvBRAvAvAvAvAvAvAXAvAvBRBRAXAvAvAvAvAv______ ________BRBRAvAXAvAvAvBRAvAvAXAvAvAvAvBRBRAvBRBRAvAXAvAvBR______ ________BRAvAvAvAvAvAXBRBRAvAvAvAXAvAvAvBRBRAvBRAvAvAvBRAv______ ________BRBRAvAvAXAvAvAvAvBRBRAvAvAvAvAXAvAvAvAvAXAvAvAvBR______ ________AvBRAXAvAvAXAvAvAvAvBRBRBRAvAvAvAvAvAXAvAvAvBRBRAX______ ________BRBRBRAvAvAvAvAvBRBRAXBRBRAvBRAvAvAvAvAvAXBRAvBRAX______ ________AXBRAvBRAvBRBRAvAXAXAXAXAXAXAXBRBRAvBRAvBRBRBRAXAX______ ________AXAXAXBRBRBRAXAXAXAXAXAXAXAXAXAXAXBRAvBRAvAvAXAX_A______ ________AXAXAXAXAXAXAXAXAXAX_AAXAXAXAXAXAXAXAXAXAXAXAXAX_A______ _________AAXAXAXAXAXAXAX_A_A_A_A_A_A_AAXAXAXAXAXAXAXAX_A________ _________A_A_AAXAXAX_A_A_A_A_A_A_A_A_A_A_AAXAXAXAXAX_A_A________ ___________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A__________ _______________A_A_A_A_A_A_____________A_A_A_A_A_A_A____________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 242 (corpse) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________CiCnCi____________________CFCFCFCF________________ ______________CnCiCnCcCF______________CFCFBsBsCFBsBs____________ ____________CiCnCiCiCnCFBsBsCFCFCFCFCFCFCFCFCFCFBsBsBs__________ ____C$______CnCiCnCiCiCFCFCFCFCFBsBsCFBsBsCFCFBsBsBsBs____Cm____ __CmC$C$__CnCiCiCnCiCnCFCFCFCFBSCFCFCFCFCFBsBSBSBSBsBs__CmCmCm__ __CmCmC$C$C$C$C$CnCiCnCiCABsBsBsBsBsBsBsBsBsBsBsBsBsBsCmCmCmCm__ ____CmCmCmCmCmCmCoCnCnCiBsBsBsBSBSBsBSBsBSBSBsBsBSBsBsBsCmCmCm__ ______CmCmCmCmCmCmCnCiCnCFBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsCmCm____ ____C$CmCmCPCPCPCWCnCnCiBsBsBsBSBSBsBSBSBSBsBSBSBSBSBsBsCPCmCm__ __C$CmCPCPCPCPCPCnCnCiCnBsBSBSBsBsBsBsBsBsBsBsBsBsBsBsBsCPCPCP__ __CmCPCP__CnCnCnCnCnCnCiBSBSBsBSBSBSBSBSBSBSBSBSBSBSBSBsCPCPCP__ ____CP____CnCnCnCnCiCiCABsBSBSBSBSBsBsBsBSBSBSBsBsBSBSBS__CP____ __________CnCnCnCnCnBiBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBS________ _______A_ACnCnCnCnCiBiBSBsBsBsBSBSBSBSBSBsBsBsBSBSBSBS_A________ _____A_A_A_ACnCnCnCnBSBSBSBSBSBS_A_A_ABSBSBSBSBSBSBs_A_A_A______ _____A_A_A_A_ACnCnBSBSBSBS_A_A_A_A_A_A_A_A_ABSBSBSBS_A_A_A______ _____A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A______ _________A_A_A_A_A_A_A_A_A_A_A_A_______A_A_A_A_A_A_A_A_A________ _______________A_A_A_A_A_A_A____________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 243 (egg) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________ClCl____________________________________ ____________________ClClClClClCl________________________________ __________________ClCiCtClCmClClCl______________________________ ________________ClClCmCoCoCtCmClClBj____________________________ ________________CtCmCoC$C$CoCmClClCO____________________________ ______________CXCmCoC$C$C$C$CoCmClCOBk__________________________ ______________ClCoC$CoC$C$C$CoClClCOCO__________________________ ____________ClClCoC$C$C$C$C$CoCmCtCOCOBz___A_A_A_A_A_A__________ ____________ClClCoC$C$C$C$C$CoClClCOCOCJ_A_A_A_A_A_A_A_A________ ____________COCtCmCoC$C$C$CoCtCmClCOCOBm_A_A_A_A_A_A_A_A________ ____________ClClCoCmCoC$CoCoCtCoClCOCOBc_A_A_A_A_A_A_A_A________ ____________ClCtClCmCtCmCoCmClClClCOCJBc_A_A_A_A_A_A_A_A________ ______________ClClClCoCmClClClClCiCOBj_A_A_A_A_A_A_A_A__________ ______________COCiClClClClClClCiCOCJBc_L_A_A_A_A_A_A_A__________ ________________BjCOCOCOCOCOCOCOBzBc_A_A_A_A_A_A_A_A____________ __________________COBjCOCOCOCJBkBj_L_A_A_A_A_A_A_A______________ ____________________COBzBcBcBcBc_A_A_A_A_A_A_A__________________ _________________________A_A_A_A_A_A_A_A________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 246 (huge chunk of meat) { ________________________________________________________________ ________________________________________________________________ ______________________CnCnCnCnCnCnCnCn__________________________ ____________________CnCnCnBjCGBjCGBjCGBwCnCn____________________ ________________CnCnBwCGBjCnCnCnCnCnCnCnBjCGCnCn________________ ____________CnCnBjCGBbCnCnCGBjBtBzBtBzCnCnBtBjBwCnCn____________ __________CnCnBwCGCnCnCnBzCnCnCnCnCnCnCGBzCnCnCGBzCnCnCn________ ________CnCnCGCnCnCnBjCGCnCnCnCnCnCnCnCnBtBwCnCnBtBwCnCnCn______ ______CnCnBjBbCnCnBjCGCnCnCnCmCmCmCnCnCnCnBzCGCnCnBjCnCnCnCn____ ____CnCnCnCGCnCnCnBbCnCnCnCmCmBkCPCmCmCnCnCnBtBjCnCnCGCnCnCnCn__ ____CnCnBwCnCnCnCGCnCnCnCnCmCmCPCPCmCmCnCnCnCnBzCnCnBjCnCnCnCn__ __CnCnCGCnCnCnCnBzBwCnCnCnCnCmCmCmCmCnCnCnCnCnCnCGCnCnCGCnCnCn__ __CnCnBjBzCnCnCnCnCGBjCnCnCnCnCmCmCnCnCnCnCnCnCnBjCnCnBcCnCnCn__ __CnCnCnBtCGCnCnCnCnBbCGBwCnCnCnCnCnCnCnCnCnBjCGCnCnCGCnCnCnAJ__ __CnCnCnCnBjCGCnCnCnCnCnCnCGBjCGCnCnCnCnBwCGCnCnCnCnBzCnCnCnAJ__ __AwCnCnCnCnBjBcCGBjCGCnCnCnCnCnBjCGBjCGBbCnCnCnCnBtCnCnCnAJAJ__ __CFCFCFCnCnCnCnCnCnBzBtBzCnCnCnCnCnCnCnCnBwBzBtBzCnCnCnCnAYAY__ __CFCFCcBsBsCnCnCnCnCnCnCnBjCGBjBtBzCnCGBjCGCnCnCnCnCnAJAJAJ____ ____CFAwAwAwBsBsCnCnCnCnCnCnCnCnCnBwBtCnCnCnCnCnCnAJAJAYAJAJ____ ____CFBSBsBsBsBsAvAwBSBSBSCnCnCnCnCnCnCnCnCnAYAJAJAJALAXAY_z____ ____CzBsCcAwBsBSBSBSBSBSBSBSBsAwBSAwAzAbAvAYAYAYAXALAIAJAJALAJ__ __CFCFBsAwBsBsBSBSAYBSBSCFBSBSBSAwBSAwAvAYAYAYAJAYAJAJAJAJAJAJ__ __CFCFCFBsBSBSAvBSBSBSAwBSBSAwBSAwAwAwAvAJAYAYAYAYAIAJAIAJAJAJ__ __CFCFBSBsBsBSAwBSBSAYBSBSBSBsAwAYAYAwAvAYAYAYAJAYAXAIAJAJAJ____ ____BsBsBsBsCFBSBSBSBSBSAbBSAwAwAYAwAwAbAvAYAYAIAYAXAwAJAJ______ ______BsBsBsAwBSBSAYBSBSBSBSBSAwAwBSAwAwAYAYAJAvAYAJAXAJAJ______ ____________BsBSBSBSBSBSBsBSBSAwAwAwAJAwAvAYAYAJAIAXAY__________ ________________BSBSAwBsBSBSBsAvAwAwAwAYAYAYAvAYAY______________ ________________________BSBSBSAwAwAwAwAvAbAIAY__________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 250 (apple) { ________________________________________________________________ ____________________________BNBNBWBNBNBN________________________ ______________________BNBNBNBoBvBWAzBoBoBNBo____________________ ________________BNCBCYCBCBCBCYBvBWAzCYCBCBCBCBBN________________ ______________BNCBCYCuCuCuCuBvBWAzCuCuCuCuCuCYCBCB______________ ____________BNCBCuCiCuCYCYCBBvBWAzCBCYCYCYCuCiCYCBBN____________ __________BNBoCuChCXCpCYCBBNBvBWAzBNBoCYCYCuChCuCBBoBN__________ ________BNBoCBCpCiCuCYCBBN_$BvBWAz_$BoCBCpCXCuCYCBBoBNBN________ ________BNBoCBCYChCuCYCYBoBNBNAqBNBNCBCYCYCuCuCYCBBoBNBN________ ________BNBoBoCBCYCpCiCYCYCBCBCBCBCBCYCuCuCuCYCBBoBoBNBNBN______ ______BNBNBoBoCBCYCYCpChCuCuCuCuCuCuCuCuCYCYCBCBBoBoBNBNBN______ ______BNBNBNBoBoCBCBCYCpCYCYCYCYCYCYCYCYCYCBCBBoBoBNBNAqAq______ ______BNBNBoBoBoBoBoCBCBCBCBCYCBCYCBCBCBCBBoBoBoBNBNAqAqAqAT____ ______BNBNBoBNBoBoBoBoCBCBCBCBCBCBCBCBBoBoBoBoBNBNBNAqAqATAT____ ______AqBNBNBNBNBoBoBoBoBoBoBoBoBoBoBoBoBoBoBNBNBNAqAqATAG_$____ ______AqBNBNBNBNBNBNBoBNBoBoBoBoBoBoBoBoBNBNBNBNAqAqATATAG_$____ ______AqBNAqBNBNBNBNBNBNBNBNBoBNBoBNBNBNBNBNBNBNAqAqATATAG_$____ ________AqBNAqBNBNBNBNBNBNBNBNBNBNBNBNBNBNBNBNBNAqAqATAGAG_$____ ________AqBNAqBNBNBNBNBNBNBNBNBNBNBNBNBNBNBNBNBNAqAqATAG_$______ ________AqAqBNBNBNAqBNAqBNBNBNBNBNBNBSBNBNBNBNAqAqAbATAG_$______ __________AqAqBNBNAqBNAqBNAqBSBNBNBSBSAqBSAqAqAqAbACAbAG_$______ __________AqBNAqBSBNAqAqAqBSBSBNBNBSBWBSAqAqAqATAbACAG_$_$______ ____________AqBSBSAqAqAqBNAqBWBSBNBWAgAzAzAqACAYAbACAG_$________ ____________AqAqBWAqAgAqAqAqAgAqBSAzAQAzAbATACAYAGAAA__$_A_A____ ______________AQAgAzAQAzAwAQAQAzAwAzAQAzAbAbACACAG_T_Q_A_A_A_A__ ________________AQAzACATATACAQAzAwAbACACAbAbAA_TAAAC_Q_A_A_A_A__ ________________AQACACACAbACACACAbACACACAGACAAACAA_Q_A_A_A_A____ ___________________$AAACAGACAAACAAACAAACAGAA_TAC_Q_A_A_A_A______ _____________________Q_Q_QAA_TAC_TAA_TACAAAC_Q_N_A_A_A__________ _____________________A_AAAAC_Q_N_QAC_QAA_Q_Q_A_A_A______________ _________________________A_A_A_A_A_A_A_A_A_A____________________ ________________________________________________________________ } # tile 251 (orange) { ________________________________________________________________ ________________________________________________________________ ______________________________BGAn______________________________ ______________________________AnAn____BGAnAnBG__________________ ____________________________BsBGAnAnBGAnAnBGAnAnBG______________ ______________________CFCFCFBsAnAgAgAgAnAnAnAnAnAnAnAn__________ __________________CFCFCcCFCFBsBGAnBGAnAnBGAnBGAnBG______________ ________________BSBsBsCFCFCFCFBsCFBsBsAnAnBGAnBS________________ ______________CFBsCFCFCcCFCcCcCcCcCFCFBsCFBSBsAwBS______________ ____________BsCFCFCFCzCcCzCzCcCcCcCFBsCFCFCFBsBsBsBs____________ __________BsBsCFCcCcCcCcCzCzCzCzCcCcCFCFBsBsBSCFBsBSBS__________ ________BSBsCFCzCcCcCzCcCcCzCzCcCzCcCcCFBsCFCFCFBsBsAwBS_A_A____ ________BsBsCFCcCcCzCzCzCzCzCcCcCzCzCzCzCFCFCFBsBsBSBSBS_A_A_A__ ______BSBsBsCFCFCcCzCzCzCzCzCzCzCzCzCcCcCcCFCFBsBsBsBSBSBs_A_A_A ______BSBsBsCFCcCFCcCzCzCcCzCzCzCzCzCFCcCFCFCcCFBsBsBSBSAw_A_A_A ______BSBsBsCFCcCcCzCzCzCzCcCzCzCzCzCcCcCFCFCFCFBsBsBSBsBS_A_A_A ______BSBsBsCFCcCcCzCzCzCzCzCzCzCzCcCcCFCFCFCcCFBsBsBSBSBS_A_A_A ______BSBsBsCFCFCcCcCzCzCzCcCzCzCFCcCcBsCFCFCFCFBsBsBSBSBS_A_A_A ______BsBsBsCFCFCcCcCcCzCzCzCzCzCcCcBsCFCFCFBsBsBsBSBSBSBS_A_A_A ______BSBSBsCFCFCFCcCzCcCcCzCzCcCzCcCFCFCFBsCFBsBsBSBsBSBS_A_A__ ________BSBsBsBsCFCcCcBsCFCcCFCcBsCFCFCFCFBsBsBsBSBSBsBS_A_A_A__ ________AwBSBsBsCFCFCcCFCcCzCFCcBsBsCFBsBsBsBsBSBsBSBSBS_A_A____ __________BSBsBsCFBsCFCFCFCFCFCFCFCFCFBsBsBsBSBSBSBSBS_A_A_A____ __________AwBSBsBsCFCFCFCFCFCFCFCFBsBsBsBsBsBSBSBSBSBS_A_A______ ___________ABsBsBsBsBsBsBsCFBsBsBsBsBsBsBSBSBSBSBSBS_A_A_A______ ___________ABSBsBSBsBsBsBsCFBsBsBsBsBsBSBSBsBSBsAwBS_A_A________ ___________A_ABSBSBSBsBsBsBsBsBSBsBSBsBSBsBSBSBSBS_A_A__________ _____________A_A_ABsBSBSBSBSBsBSBSBsBSBsBSBSBS_A_A_A____________ _________________A_ABSBSBSBSBSBSBSBsBSBSBSBS_A_A________________ ___________________A_A_A_ABSBSBSBSBSBS_A_A_A_A__________________ _________________________A_A_A_A_A_A_A_A________________________ ________________________________________________________________ } # tile 252 (pear) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________________________________CfCfCfCI____________ ______________________________________AQBGCfCIBvBvBv____________ __________________________________AQAgBGBGCfBvAg________________ ________________________________AQAgAnBfAgAQAnAg________________ ______________________________AQAnByAnBGAnBfAnBG________________ ____________________________AQAgBGBGBfBGByBGAgAQ_A_A_A_A________ ________________________AQBaAnAnBGCRBfBGAnAnAgAQ_A_A_A_A________ ____________________AQAnAnBGAnBfCRBfCjBGBGAnAg_A_A_A____________ ________________AQBaBGAnBGAnBGCRBfBfBfBGAnAgAQ_A_A_A____________ ____________AQAgAnAnBGBGBGCRCRBfBfBGBGBGAnAzAQ_A_A_A____________ __________AQAgAnBGAnBGCRCRBfBfBfBGCMBGAnAnAgAQ_A_A______________ __________AgBaAnBGCMBfBfBfCjBfBGBfAnBGAnAgAQ_A_A_A______________ ________AQAgAnBGBfBfBfBfBfBfBGBGBGBGAnAnBaAQ_A_A________________ ________AzAnAnBGBGBfBfCMBGBGBGAnBGByAnAnAgAQ_A_A________________ ________AQAgAnBGAnBGBGBGBGBGBGBGAnBGAnAgAgAQ_A_A________________ ________AgAgBGByBGAnBGBGAnBGAnBGAnAnAnAgAQAz_L_A________________ __________AQAgAnAnAnBGAnBGAnByAnAnAnAgAgAQ_A_A_A________________ __________AQAgAgAgAnAnAnAnAnAnAnAgAgAgAQAQ_A_A__________________ ___________AAQAzAgAgAgBaAgAgAgAgAgBaAQAQ_A_A_A__________________ ___________A_AAQAQAQAgAgAgAgAgAQAQAQAQ_A_A_A____________________ _____________A_A_AAQAQAQAQAzAQAQAQ_A_A_A_A______________________ _________________A_A_A_A_A_L_A_A_A_A_A_A________________________ ___________________A_A_A_A_A_A_A_A_A____________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 253 (melon) { ________________________ByByByByByBy____________________________ ________________________BaBaBaBaBaByByByByByByBy________________ __________________________________ByBaBaBaBaBaBa________________ __________________________________ByBa__________________________ _____________________________q_q_qByBa_q________________________ _______________________qBy_q_q_q_qByBa_q_m_m_m__________________ _____________________qBy_q_q_q_qBy_q_q_qByBaBa_m________________ ___________________qByBaBy_qByByBy_q_qByBy_m_m_m_h______________ _________________q_qBa_q_qBy_q_qByByBy_q_mBy_m_m_h_h____________ _______________q_qByBa_qBy_q_q_qByBaBa_mByByBaBaBaBa_c__________ _______________qByBa_q_qBy_qByBy_q_qByBy_m_mBy_m_m_h_c_A________ ______________ByBy_q_qBy_qBy_q_q_qBy_m_m_m_m_mBy_m_h_c_A_A______ ____________By_qBy_qBy_q_qByBy_q_qBy_m_mByByByByByBaBaBa_A______ _____________q_qByBy_q_qBy_qBy_q_mBy_mBy_m_m_m_m_m_h_h_c_A_A____ _____________q_qByBa_q_qBy_q_qBy_mBy_mBy_m_m_m_m_h_h_h_c_A_A____ _____________q_qByBa_qBy_q_q_mByBy_mBy_m_mByByByBa_h_h_c_A_A____ _____________qByBa_q_qBy_q_mBy_m_m_mByByBy_m_m_mBa_h_h_c_A_A____ _____________qBy_q_qBa_mByBy_m_mByBy_m_m_m_m_mBy_hBa_c_c_A_A____ _______________m_mBa_mBy_m_m_mBy_m_mBy_m_m_mBy_h_hBa_c_A_A_A____ _______________m_mBa_mBy_m_mBy_m_mBy_mBy_mBy_h_h_h_cBa_A_A_A____ _______________mBa_m_mBy_m_mBy_m_mBy_m_mBa_h_h_h_h_cBa_A_A______ _________________m_m_mBa_m_mBaBy_mBy_m_m_hBa_h_h_c_c_A_A_A______ ___________________m_mBa_m_mBa_mByBy_h_h_h_hBa_c_c_A_A_A________ _____________________hBa_h_hBa_h_h_hBa_h_h_c_cBa_A_A_A_A________ ______________________Ba_h_hBa_c_c_cBa_c_c_c_c_A_A_A_A__________ _________________________A_A_c_c_c_cBa_c_A_A_A_A_A_A____________ ___________________________A_A_A_A_A_A_A_A_A_A_A_A______________ _______________________________A_A_A_A_A_A_A_A__________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 254 (banana) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________CtCX____________________ ______________________________________ClCoCkCkAM________________ ______________________________________CkCtClCNAM________________ ______________________________________CNCtCkCOAM________________ ______________________________________CkCtCXCNAM________________ ____________________________________CNClCtCkCOAM________________ ________________CjCjCjCjCjCj________COCkCtCXCNAM________________ ____________CjCMCMCMCMCMCMCMCMCj____CNCoCkCkAMAM________________ ________CjCMCMCMByBaBaByCMByCMCMCjCNCkCsClCkAMAM________________ ______CjCMBaBaAMAMAMAMAMAMBaByByCMCjCOCtCOCjCjCjCjCj____________ ____BaBaBaAMAMAM________AMAMAMBaByCjCjCWCjCjCMCMCMCMCjCj________ ____AMAMAMAMAM______________AMAMBaCjCjCjCMByBaByBaByCMCMCj______ ______________________________BaCjCjCjCjBaBWAMAMAMAMBaByCMCj____ ____________________________BaCjCjCjCjByAzAMAM____AMAMBaByCM____ __________________________BaCjCjCjCjCMBaAgAM________AMAMBaCMCj__ ________________________BaCjCjCjCjCMBaAzAbAM__________AMAMCMCj__ ______________________BaCjCjCjCjCMByBaBWAC______________AMCMCj__ ____________________BaCjCjCjCMByBaBaAzAMAM________________BaAM__ ________________BaCjCjCjCjCjByBaBWAgAMAM__________________BaAM__ ______________ByCjCjCjCjByBaBWAzAMAMAM____________________AMAM__ ______________CjByByCMAzAzAgAMACAM______________________________ ____________AMAQAgAzAzACAMAbAM__________________________________ ____________AMAMAMAcACAbAM______________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 255 (carrot) { ________________________________________________________________ _________________________________________q______________________ _________________________________________q_h_________q_h________ _________________________________________q_h_______q_h_h________ _________________________________________q_h_____q_h_A_A_A_A____ _________________________________________q_h___q_h_h_A_A_A_A____ _______________________________________q_q_h_q_h_h_A_A_A________ _______________________________________q_h_q_h_h_A_A____________ _______________________________________q_q_h_h_q_q_q_q_q________ _______________________________________q_h_h_q_h_h_h_h_h_h______ ____________________________CzCzCzCz_h_h_h_h_h_h_A_A_A_A_A______ __________________________CzCFCzCzCc_h_h_h_h_A_A_A_A____________ ________________________CzCzCzCFCcCcCcCF_A_A_A_A________________ ________________________CzCzCzCcCFCcCFBs_A_A____________________ ______________________CzCzCFCcCcCcCFCFBs_A______________________ ______________________CzCzCzCFCcCcBsCFBs_A______________________ ____________________CzCzCzCcCcCFCFCFBs_A_A______________________ __________________CzCFCzCcCcCcBsCFBs_A_A_A______________________ ________________CzCzCzCFCcCcCFCFBs_A_A_A________________________ ________________CzCzCcCFCFBsCFBs_A_A_A_A________________________ ______________CzCFCcCFCFBsBs_A_A_A_A_A__________________________ ______________CzCFCFCFBs_A_A_A_A_A_A____________________________ ____________CzCcCcCFBs_A_A_A_A_A________________________________ __________CzCFCFCFBs_A_A_A_A____________________________________ ________CzCzCcCFBs_A_A_A_A______________________________________ ________CFCFCFBs_A_A_A_A________________________________________ ______CzCcCFBs_A_A_A_A__________________________________________ ______CFCFBs_A_A_A_A____________________________________________ _________A_A_A_A_A______________________________________________ _____________A_A________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 256 (sprig of wolfsbane) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________________________________________C$C$C$C$__________ __________________________________________C$C$CjCjCjCjCjCj______ __________________________________________CjCjCjCjCjCjCjCjCj____ ________________C$C$CjCj________________CjCj__________CjCjCj____ ____________C$C$CjCjCjCjCjCj_____________l_l_L_L_A_L______Cj____ __________C$CjCjCjCjCjCjCjCj_l_________h_h_c_A_A_A_A_L____Cj____ ________C$CjCj___Q_zAA_L_z_h_h_h_____h_h_c_z_A_____A_A_A________ ________C$Cj___L_A_A_A_A_A_z_c_h_h___h_c_A_A_________A_L________ ________C$___L_A_A_A_A_________c_h_h_c_A_A______________________ ________C$___A_A_A_______________h_h_c_A_A______________________ _____________A_A___h_h_h_h___h_h_h_c_A_A________________________ _____________A___h_A_A_A_A_h_h_h_c_c_h_A________________________ _________________A_______h_h_h_c_c_A_h__________________________ ___________h_h_h_h_____h_h_h_c_c_c_A_h__________________________ _________h_A_A_A_A_h_h_h_h_c_c_c_A_A_h__________________________ _____h_h_h_h_____h_h_h_h_c_c_c_A_A_h____________________________ ___h_A_A_A_A_h_h_h_h_c_c_c_c_A_h_A_h____________________________ ___A_______c_c_c_c_c_c_c_A_A_A_h________________________________ _____________A_A_A_A_A_A_h_A_A_h________________________________ _______________________A_h_A_h__________________________________ _______________________A_h_A_h__________________________________ _____________________A_h________________________________________ _____________________h__________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 257 (clove of garlic) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________CmCmCmCm______________________________________ ________________C$CmCmCmCmCm_A_A_A_A____________________________ ________________C$CmCmCmCmCmCm_A_A_A_A__________________________ ________________C$C$CmCmCmCmCmCm_A_A_A_A________________________ ________________C$C$CmCmCmCmCmCmCm_A_A_A_A______________________ ________________C$C$CmCmCmCmCmCmCmCm_A_A_A_A____________________ ________________C$C$CmCmCmCmCmCmCmCmCm_A_A_A_A__________________ __________________C$C$CmCmCmCmCmCmCmCmCm_A_A_A_A________________ __________________C$C$C$CmCmCmCmCmCmCmCmCm_A_A_A_A______________ ____________________C$C$C$CmCmCmCmCmCmCmCmCm_A_A_A_A____________ ______________________C$C$C$C$C$CmCmCmCmCmCm_A_A_A_A____________ ________________________C$C$C$C$C$C$C$CmCmCm_A_A_A_A____________ ______________________________C$C$C$C$C$C$_A_A_A_A_A____________ _______________________________A_A_A_A_A_A_A_A_A_A______________ _________________________________A_A_A_A_A_A_A_A________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 258 (slime mold) { ________________________________________________________________ ________________________________________________________________ ________________BSBSBSBSBS______________________________________ ________________AwAwAwAwAwBSBSBSBSBSBSBS________________________ ________________________AwBSAwAwAwAwAwAw________________________ __________________________BSAw__________________________________ __________________________BSAw__________________________________ __________________________BSAw__________________________________ ___________t_t_q_q_______t_t_q_q________________________________ _________t_t_t_t_q_q___t_t_t_t_q_q_____t_t_q_q__________________ _______t_tC$_t_t_q_q_t_tC$_t_t_q_q_m_t_t_t_t_q_q________________ _______t_t_t_t_t_q_q_t_t_t_t_t_q_q_t_tC$_t_t_q_q_m_A_A__________ _______q_t_t_t_q_q_m_q_t_t_t_q_q_m_t_t_t_t_t_q_q_m_A_A__________ _______q_q_q_q_q_q_m_q_q_q_q_q_q_m_q_t_t_t_q_q_m_m_A_A__________ _________q_q_q_m_m_t_t_q_q_q_m_m_m_h_q_q_q_q_q_m_m_A_A__________ ___________m_m_m_t_t_t_t_q_q_m_m_h_t_t_q_q_m_m_m_A_A_A__________ _______________t_tC$_t_t_q_q_m_h_t_t_t_t_q_q_m_A_A_A_A__________ _______________t_t_t_t_t_q_q_m_t_tC$_t_t_q_q_m_A_A_A____________ _______________q_t_t_t_q_q_m_m_t_t_t_t_t_q_q_m_A_A______________ _______________q_q_q_q_q_q_m_m_q_t_t_t_q_q_m_m_A_A______________ _________________q_q_q_m_m_m_m_q_q_q_q_q_q_m_m_A_A______________ ___________________m_h_h_t_t_q_q_q_q_q_m_m_m_A_A_A______________ ___________________m_m_t_t_t_t_q_q_m_m_m_m_A_A_A________________ ___________________m_t_tC$_t_t_q_q_m_A_A_A_A_A__________________ ___________________A_t_t_t_t_t_q_q_m_A_A_A_A____________________ ___________________A_q_t_t_t_q_q_m_m_A_A_A______________________ ___________________A_q_q_q_q_q_q_m_m_A_A________________________ ___________________A_A_q_q_q_m_m_m_A_A__________________________ _____________________A_A_m_m_m_m_A_A_A__________________________ _______________________A_A_A_A_A_A_A____________________________ ___________________________A_A_A_A______________________________ ________________________________________________________________ } # tile 259 (lump of royal jelly) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________CfCfCfCfCfCf____________________________ ____________________CfCfCfCfCfCfCfCfCfCf________________________ __________________CfCfC$C$C$CfCfCfCfCfCfCf______________________ ________________CfCfC$C$C$CfCfCfCfCfCfCfCfCf____________________ ______________CfCfC$C$CfCfCfCfCfCfCfCfCfCfCfCf__________________ ______________CfCfC$CICICICICICICICICICICICfCf_A________________ ______________CICICICICICICICICICICICICICICICI_A_A______________ ______________CICICICICICICICICICICICICICICICI_A_A______________ ______________CICICICICICICICICICICICICICICI_A_A_A______________ ________________CICICICICICICICICICICICICI_A_A_A________________ _________________A_ACICICICICICICICICI_A_A_A_A__________________ ___________________A_A_A_A_A_A_A_A_A_A_A_A______________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 260 (cream pie) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________________CoCoCtCtCsCtCtCoCtCo_A_A_A_A______________ __________________CsCoCtCoCtCtC$CsCtCtCtCtCtCt_A_A_A_A_A________ ______________CtCoCtCoCsCtCoCtCoCtCtCtCoCtCoCtCoCs_L_A_A_A______ ____________CtCoCtCoCtCtCtCtCtCtCtCoCtCsCtCtCoCtCtCt_BCt_A_A____ __________CoCtCoCtCoCtCoCtCtCtCtCoCtCoCtCoCoCtCoCtCo_A_BCt_B_A__ ________CtCoCtCtCtCoCtCtCtCoCtCtCtCsCtCtCtCtCtCtCoCtCo_A_B_A_A_A ________CtCoCtCtCsCtCtCtCtCtCtCtCsCtCsCoCtCsCtCtCtCtCoCt_ACtCk_A ______CtCoCtCtCoCtCtCtCtCsCoCtCoCtCsCtCtCtC$CtCtCtCtCtC$_A_A_A_A ______CtCtCoCtCtCsCtCoCoCtCtCoCtCsCtCoCtCoCtCtCoCtCtC$_A_A_A_A__ ______CoCtCoCtCoCtCoCtCtCtCtCsCtCtCtCtCsCtCsCoCtCtC$Cm_A_A_A____ ______CmC$CtCtCtCtCtCoCtCoCtCtCtCtCtCtCoCtCtCtCtC$Cm_A_A_A______ ________CmC$C$CtCtCtCtCtCtCtCoCtCoCoCtCoCtCsCoC$Cm_A_A_A________ _________ACmCmC$C$C$C$CoCtCoCtCsCtCtCtCtC$C$C$Cm_A_A_A_A________ _________A_A_ACmCmCmCmCmCtC$C$C$C$CoCtC$C$CmCm_A_A_A_A__________ _____________A_A_A_A_ACmCmCmCmCmCmCmCtCmCm_A_A_A_A______________ _________________A_A_A_A_A_A_A_A_A_A_B_B_A_A_A__________________ _________________________A_A_A_A_A_A_A_A_A______________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 261 (candy bar) { ________________________________________________________________ ______________________________________CmCmCmCmCm________________ __________________________________CmCmCmCmCmCmCmCmCm____________ ________________________________CmCmCmCuCuCuCuCuCmCmCm__________ ______________________________CmCmCuCuCuCmCmCmCuCuCuCmCm________ ______________________________CmCuCuCmCmCmCmCmCmCmCuCuCm________ ____________________________CmCmCuCmCmCmCuCuCuCmCmCmCuCmCm______ ____________________________CmCuCuCmCmCuCuCmCuCuCmCmCuCmCm______ ____________________________CmCuCmCmCuCuCmCmCuCuCmCuCuCmCm______ ____________________________CmCuCmCmCuCmCmCuCuCmCmCuCmCmCm_A____ ____________________________CPCuCmCmCuCmCmCuCmCmCuCuCmCmCP_A____ ____________________________CPCPCmCmCuCuCmCmCmCuCuCmCmCmCP_A____ ______________________________CPCPCmCmCuCuCuCuCuCmCmCmCP_A_A____ ______________________________CPCPCPCmCmCmCmCmCmCmCmCPCP_A______ ________________________________BSAwCPCmCmCmCmCmCPCPCP_A_A______ ______________________________BSAwAYCPCPCPCPCPCPCPCP_A_A________ ____________________________BSAwAY_A_ACPCPCPCPCP_A_A_A__________ __________________________BSAwAY_A_A_A_A_A_A_A_A_A______________ ________________________BSAwAY_A_A_____A_A_A_A_A________________ ______________________BSAwAY_A_A________________________________ ____________________BSAwAY_A_A__________________________________ __________________BSAwAY_A_A____________________________________ ________________BSAwAY_A_A______________________________________ ______________BSAwAY_A_A________________________________________ ____________BSAwAY_A_A__________________________________________ __________BSAwAY_A_A____________________________________________ _________AAwAY_A_A______________________________________________ _________A_A_A_A________________________________________________ _________A_A_A__________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 262 (fortune cookie) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________________CICICICICICICICI__________________________ __________________CICICfCfCfCfCfCfCfCfCICI______________________ ________________CICICfCfCfCfCfCfCfCfCfCfCfCICI__________________ ______________CICICfCfCfCfCfCfCICICfCfCfCfCfCfCI________________ ______________CICICfCfCfCfCICICICICICICICICICfCf________________ ____________CICICICfCfCfCfCfCICIBvBvBvCICICICICICf_A____________ ____________CICICICfCfCfCfCfCfCICIBvBvBvBvBvBv_A_A_A____________ ___________ACICICICICfCfCfCfCfCfCICIBvBv_A_A_A_A_A______________ ___________ABWCICICICICfCfCfCfCfCfCICI_A_A_A_A__________________ ___________ACIBWCICICICICfCfCfCfCfCfCI_A_A______________________ ___________ACICIBWCICICICICICfCfCfCfCfCI_A______________________ ___________A_ACICIBWCICICICICICICfCfCfCfCI_A____________________ _____________ABvCICIBWBWBWCICICICICICfCfCfCI_A__________________ _____________A_ABvCICICICIBWBWBWCICICICICICICf_A________________ _______________A_ABvBvBvCICICICIBWBWBWBWBWBW_A_A_A______________ _________________A_A_ABvBvBvBvCICICICICICICICI_A_A_A____________ _____________________A_A_A_ABvBvBvBvBvBv_A_A_A_A_A_A____________ ___________________________A_A_A_A_A_A_A_A_A_A_A________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 263 (pancake) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________CICfCICICICfCI______________________________ ________________CICICfCICICICfCICICICICI________________________ ____________CICICICICfCfCICICICICfCICICfCICf____________________ __________CICICfCICICICICICfCfCICICICICICICICfCI________________ ________CICICfCICICfCICICfCICfCICICfCfCICfCICICI________________ ______CICICfCICfCICfCfCICICICfCICfCICICfCIClCICICI_A_A__________ ______CICICICICfCfCICICICICfCICICfCfCICIClClClCICI_A_A_A________ ______CfCfCfCfCICICICICfCfCICfCfCICICIClClClC$CfCI_A_A_A________ ______CfCICfCfCfCfCfCfCICICICICfCICfCIClClC$C$CICI_A_A_A_A______ ______CfCICfCICICfCICICfCfCfCICICICIClClC$C$C$CfCI_A_A_A_A______ _____ACfCfCfCfCfCfCfCfCfCICICfCICICfClClC$C$CICI_A_A_A_A________ _____A_ACfCfCICfCfCfCICICfCfCfCfCICIClC$C$C$CI_A_A_A_A_A________ _______A_A_ACfCICICfCfCfCfCICICfCICfCIC$C$C$_A_A_A_A_A_A________ ___________A_A_ACfCfCICICfCfCfCfCICICfCIC$_A_A_A_A_A_A__________ _____________A_A_A_ACfCfCfCICICfCfCICICI_A_A_A_A_A_A____________ _______________A_A_A_A_A_ACfCfCfCICI_A_A_A_A_A_A________________ _____________________A_A_A_A_A_A_A_A_A_A_A_A_A__________________ ___________________________A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 264 (lembas wafer) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________________________CfBvCf________________ ______________________________________CfCfBvCICICf______________ __________________________________CICfCfBvCfCfCICICfCI__________ ____________________________CfCfCICICfCICfBvCICfBvCfCfCf________ __________________________CfCICfBvBvCICfBvCICICfBvCIBvCf________ ______________________CICICfBvCICICICICfBvCICICfBvCICfCI_A______ ____________________CIBvBvCICfCfCfCfBvCfCfCfCfCfCIBvCfBv_A_A____ __________________CICfCfCfCICfCICfCICfBvBvCICICfBvCfCI_A_A_A____ ______________CfCICIBvCICICfCIBvCICICfBvCICICfCICIBv_A_A_A______ __________CfCfCICfCfCfCIBvCfCICICICICfBvCIBvCICfBvCI_A_A________ ________CICIBvCICfBvCICfBvCfCfBvCfCfCfCIBvCICfBv_A_A_A__________ ______CICfCfCICIBvBvCICICfCIBvCfBvCIBvCfCIBvCI_A_A_A____________ ______CfCIBvCfCfCfCICICICfBvCICfCICICICfCI_A_A_A_A______________ _____ABvBvCICIBvBvCfBvCfCfCICIBvCfBvCICf_A_A_A_A________________ _____A_ACIBvCfBvCICICfBvBvCfCIBvBv_A_A_A_A_A____________________ _______A_ABvCfBvCIBvCfCICICfBvBv_A_A_A_A_A______________________ _________A_ABvCfBvCfCIBvBv_A_A_A_A_A_A__________________________ ___________A_ABvBvCf_A_A_A_A_A_A_A______________________________ _____________A_A_A_A_A_A_A_A____________________________________ _________________A_A_A__________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 265 (cram ration) { ________________________________________________________________ ________________________________________________________________ ______________BsBs______________________________________________ ____________BsCFCFBs____________________________________________ ____________BMBsBs_k____________________________________________ ______________BM_k______________________________________________ ______________BMBM______________________________________________ ____________BMBM_kBM____________________________________________ __________C$BM_k_kBMBM__________________________________________ __________BMC$_k_k_kBM__________________________________________ __________BM_k_k_k_kBM________BsCFCFCFCFCFCFCFCF________________ __________BM_k_k_k_kBM____BsBsBsBsBsBsBsCFCFCFBsBs______________ ___________k_k_k_k_kBM__BsBsBsCFCFCFCFCFCFCFCFBsBsBs____________ ___________k_k_k_k_kBMBsCFCFCFCFCFCFCFCFCFCFBsBsBsBs____________ __________Cl_k_k_kBMBMBsCFCFCFCFCFCFCFCFBsBsBsBsBsBS____________ __________ClClClBMBMBsCFCFCFCFCFCFCFBsBsBsBsBsBsBSBSBS__________ __________ClClClBMBsCFCFCFBsBsBsBsBsBsBsBsBsBsBsBsBSBS__________ __________ClClClCFBsCFCFCFCFCFCFCFCFCFCFCFCFBsBsBsBSBS__________ ___________kClClClCFCFCFCFCFCFCiClCFCFCFCFBsBsBsBSBSBS__________ ___________k_k_kBsCFCFClCiClCnClClClClCFCFBsBsBsBSBSBS__________ __________BM_k_kBsCFCiCnClClCiClClClCiCnCFCFBsBsBSBSBS_A________ __________BMBMBMCFCcCnClClClClClClClClCiCFCFBsBSBSBS_A_A_A______ ___________ABMBMCFCFClClClClClClClClClCcCFCFBsBSBS_A_A_A_A______ _____________A_ACFCFClClClClClClClClClCnCFCFBSBS_A_A_A_A_A______ _______________ACFCFCFCiClClClClClClClClCFCFBS_A_A_A_A_A________ ________________CFCFCiCnClClCnClClCiClClCFCF_A_A_A_A_A_A________ ________________CFCFCFClCcCFCcCFCFCFClCFCFCF_A_A_A_A_A__________ _________________ACFCFCFCF_A_A_A_zCFCFCFCF_A_A_A_A_A____________ ___________________A_A_A_A_A_A_A_A_A_z_A_A_A_A_A_A______________ _______________________A_A_A_A_A_A_A_A_A_A_A_A__________________ ________________________________________________________________ ________________________________________________________________ } # tile 266 (food ration) { ____________BsBs________________________________________________ __________BsCFCFBs______________________________________________ __________BMBsBsBD______________________________________________ __________BMBMBMAi______________________________________________ __________BM_k_gBd______________________________________________ ________BMC$_k_g_gAi____________________________________________ ______BMC$_k_k_k_g_gBd__________________________________________ ______BM_k_k_k_k_g_gAi__________BsBsCFCFCFCFCFCFBsBs____________ ______BM_k_k_k_k_g_gBd____BsCFCFCFCFCFCFCFCFCFCFCFCFBs__________ ____BM_k_k_k_k_k_g_g_gAiBsCFCFCFCFCFCFCFCFBsBsCFCFCFCFBs________ __BM_k_k_k_k_k_k_g_g_gBsBsCFCFCFCFCFBsBsBsBsCFCFCFCFCFCFBs______ __BM_k_k_k_k_k_k_g_gBsBsCFCFCFCFCFCFCFCFCFCFCFCFCFBsCFCFBsBs____ __BMCl_k_k_k_k_k_gBsCFCFCFBsBsCFCFCFCFCFCFCFCFCFCFCFBsCFBsBs____ __BMClClClClBMBMBMCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFBsCFBsBsBsBs____ __BMClClClClClBMBsBsBsCFCFCFCFCFCFCFCFBsBsCFCFCFCFBsBsBsBsBs____ __BMClClClClClBsBsCFCFCFCFCFCFCFBsBsBsBsBsBsBsCFBsBsBsBsBsBs____ __BMClClClClBMBsCFCFCFCFCiCnCiCnCFCFCiClClBsBsBsBsBsBsBsBsBs____ __BMClClClClBMCFCFCFCFCnClClCiCtCnCiCnClClCiBsBsBsBsBsBsBsBs_A__ __BM_kClClClBMBsCFCiClClClCiClClClClClClClClCnBsBsBsBsBsBsBs_A_A __BM_k_k_kBMBMCFCFCiCnClClClClCiClClClClClClCiBsBsBsBsBsBsBs_A_A __BDBF_k_k_k_gBsCFClClCiClClClClClClClCiClClClCFBsBsBsBsBsBs_A_A ___MBDBM_k_k_gBsCFCcClClClClClClClClClCnClCiCnCFBsBsBsBsBsBs_A_A ____AiBdAiBdAiBdCFCnClClClClCnClClClClClClCnCcCFBsBsBsBsBs_A_A_A _____A_ABdAiBDBsCFCiCiClClCnCiClCiClClClClClCiCFCFBsBsBsBs_A_A_A _______A_A_A_ACFCFClClClClClCtClClClClCiClClClCFCFBsBsBs_A_A_A_A ___________A_ACFCFClClCnCiClClClClClClClClClCnCFCFBsBs_A_A_A_A__ ______________CFBsCiClClClCnCiClCnClCnCtClClClCcCFBs_A_A_A_A____ ______________BsCFCcCnClClCtCnCFCFCcClCnCiClCFCFCFBs_A_A_A______ ______________BsBsCFCFCFCFCFBsCABsCFCFCFCcCFCFCFBs_A_A_A________ ________________BsBsBsBsCFBsCF_A_ABsBsBsBsBsBsBs_A_A_A__________ ___________________A_A_A_z_A_B_A_A_A_A_A_A_A_A_A_A_A____________ _____________________A_A_A_A_A_A_A_A_A_A_A_A_A_A________________ } # tile 269 (tin) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________________CPCPCPCPCPCm______________________________ __________________CPCPBdBdBdBdBdBdCmCm__________________________ ________________CPBdBdBdBdBdBdBdBdBdBdBk___A_A_A________________ ________________CPBdBdBdBdBdBdBdBdBdBdBn_A_A_A_A_A_A____________ ________________BkC$C$BdBdBdBdBdBdCPBkBw_A_A_A_A_A_A_A__________ ________________BkCPCPC$CPCPCPCPCPBkBdBd_A_A_A_A_A_A_A__________ ________________CPCPCPCPBkCPBkBkBdBkBkBd_A_A_A_A_A_A_A__________ ________________BkCPCPCVBkCPCPBkBkBkBdBd_A_A_A_A_A_A_A__________ ________________BkCPCPCPBkCVBkBnBdCJBdBd_A_A_A_A_A_A_A__________ ________________BnCPCPCVBkCVBkCJBdBnBdBd_A_A_A_A_A_A____________ ________________CJCPCPCPBkCVBkBnBdBkBdBd_A_A_A_A_A______________ ________________BkCPCPCPBnCPCJBkBdCJBdBd_A_A_A_A________________ ________________BnCPCPCPCJCPBnCJBdBnBdBd_A_A_A_A________________ ________________CJCPCPCPBkCPBkBkBdBkBdBd_A_A_A__________________ ________________CPCPCPCPBnCPCPBkBkBkBkBk_A_A____________________ _________________AC$C$CPCJCPBkBkBdCVBk_A_A______________________ _________________A_A_AC$CPCPCVCPBk_z_A_A________________________ _____________________A_A_A_A_A_z_M_A____________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 270 (ruby) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________________BSBSBS______________________________ __________________________BkBiBSBSBk____________________________ ________________________C$CVAwAwAwCPBk__________________________ __________________________C$CVCmCPBk____________________________ __________________________BkBdBJAeBk____________________________ __________________________BkBdAjAeBk____________________________ __________________________CPBdBJAeBk_________________A_A_A______ __________________________BlBdAlAeBk_______________A_A_A_A_A____ __________________________COBdBDAeBk_____________A_A_A_A_A_A____ __________________________CPBkBJAeBk___________A_A_A_A_A_A______ __________________________CPBlAlAeBD_______A_A_A_A_A_A_A________ ______________________BdCVCVBkCOAjAeBDBD_A_A_A_A_A_A_A__________ ____________________BkCiC$C$CVBlAlBJAeAeBD_A_A_A_A_A____________ __________________BdCdChC$C$CiCnCGBNBNAeAeBD_A_A_A_A____________ ________________BdCpCdCdCXChCdCdCGBoBoBoCBCBBD_A_A_A____________ ________________BdBtCGCdCnCdCdCdCBCBCBCYCYBNBD_A_A______________ ________________BdBtBtCGCGCdCGCYCYCYBNBNBNBNBD_A_A______________ ________________BdBNBtBtBtBtBNBNBNBNBNBNCBBoBD_A_A______________ ________________BdBoBNBNBNBoBNBNBNBNCBBoBoBoBD_A_A______________ ________________BdBNBNBoBNBNBNBoBoBoBoBoCBCBBD_A________________ _________________ABdBNBNBNBoBoBoBoCBCBCBCBBD_A_A________________ _________________ABdBoBoBoBoBoCYCBCBCBCBCYBD_A_A________________ _________________A_ABkCBCBCBCBCBCBCYCYCYBD_A_A__________________ ___________________A_ABkBkCYCYCYCYCYBDBD_A_A____________________ _____________________A_A_ABDBDBDBDBD_A_A_A______________________ _________________________A_A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 271 (pink) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________________BSBSBS______________________________ __________________________BkBiBSBSBk____________________________ ________________________C$CVAwAwAwCPBk__________________________ __________________________C$CVCmCPBk____________________________ __________________________BkBdBJAeBk____________________________ __________________________BkBdAjAeBk____________________________ __________________________CPBdBJAeBk_________________A_A_A______ __________________________BlBdAlAeBk_______________A_A_A_A_A____ __________________________COBdBDAeBk_____________A_A_A_A_A_A____ __________________________CPBkBJAeBk___________A_A_A_A_A_A______ __________________________CPBlAlAeBD_______A_A_A_A_A_A_A________ ______________________BdCVCVBkCOAjAeBDBD_A_A_A_A_A_A_A__________ ____________________BkCiC$C$CVBlAlBJAeAeBD_A_A_A_A_A____________ __________________BdCgCmC$C$CiCXCJBtBtAeAeBD_A_A_A_A____________ ________________BdCnCgChCgCXChCgCJCGCGCGCdCdBD_A_A_A____________ ________________BdBwCJCgCXChCgCnCdCdCdCdCnBtBD_A_A______________ ________________BdBwBwCJCJCnCJCdCnCdBtBtBtBtBD_A_A______________ ________________BdBtBwBwBwBwBtBtCGBtBtBtCdCGBD_A_A______________ ________________BdCGBtBtBtCGBtBtBtBtCdCGCGCGBD_A_A______________ ________________BdBtBtCGBtBtBtCGCGCGCGCGCdCdBD_A________________ _________________ABdBtBtBtCGCGCGCGCdCdCdCdBD_A_A________________ _________________ABdCGCGCGCGCGCdCdCdCdCdCdBd_A_A________________ _________________A_ABkCdCdCdCdCdCdCdCnCdBD_A_A__________________ ___________________A_ABkBkCdCnCdCnCdBYBd_z_A____________________ _____________________A_A_zBDBYBYBYBd_A_A_A______________________ _________________________A_A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 272 (orange) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________________BSBSBS______________________________ __________________________BkBiBSBSBk____________________________ ________________________C$CVAwAwAwCPBk__________________________ __________________________C$CVCmCPBk____________________________ __________________________BkBdBJAeBk____________________________ __________________________BkBdAjAeBk____________________________ __________________________CPBdBJAeBk_________________A_A_A______ __________________________BlBdAlAeBk_______________A_A_A_A_A____ __________________________COBdBDAeBk_____________A_A_A_A_A_A____ __________________________CPBkBJAeBk___________A_A_A_A_A_A______ __________________________CPBlAlAeBD_______A_A_A_A_A_A_A________ ______________________BdCVCVBkCOAjAeBDBD_A_A_A_A_A_A_A__________ ____________________BkCiC$C$CVBlAlBJAeAeBD_A_A_A_A_A____________ __________________BdCgCmC$C$CiCXCJBSBSAeAeBD_A_A_A_A____________ ________________BdCyCgChCgCXChCgCJBsBsBsCFCFBD_A_A_A____________ ________________BdBwCJCgCXChCgCnCFCFCFCcCcBSBD_A_A______________ ________________BdBwBwCJCnCJCJCcCcCcBSBSBSBSBD_A_A______________ ________________BdBSBwBwBwBwBSBSBSBSBSBSCFBsBD_A_A______________ ________________BdBsBSBSBSBsBSBSBSBSCFBsBsBsBD_A_A______________ ________________BdBSBSBsBSBSBSBsBsBsBsBsCFCFBD_A________________ _________________ABdBSBSBSBsBsBsBsCFCFCFCFBD_A_A________________ _________________ABdBsBsBsBsBsCcCFCFCFCFCcBD_A_A________________ _________________A_ABkCFCFCFCFCFCFCcCcCcBD_A_A__________________ ___________________A_ABkBkCcCcCcCcCcBDBD_A_A____________________ _____________________A_A_ABDBDBDBDBD_A_A_A______________________ _________________________A_A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 273 (yellow) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________________BSBSBS______________________________ __________________________BkBiBSBSBk____________________________ ________________________C$CVAwAwAwCPBk__________________________ __________________________C$CVCmCPBk____________________________ __________________________BkBdBJAeBk____________________________ __________________________BkBdAjAeBk____________________________ __________________________CPBdBJAeBk_________________A_A_A______ __________________________BlBdAlAeBk_______________A_A_A_A_A____ __________________________COBdBDAeBk_____________A_A_A_A_A_A____ __________________________CPBkBJAeBk___________A_A_A_A_A_A______ __________________________CPBlAlAeBD_______A_A_A_A_A_A_A________ ______________________BdCVCVBkCOAjAeBDBD_A_A_A_A_A_A_A__________ ____________________BdCtC$C$CVBlAlBJAeAeBD_A_A_A_A_A____________ __________________BdCkCoC$C$CtCkBzBaBaAeAeBD_A_A_A_A____________ ________________BdCjCNCkCtCoCkCNBzByByByCMCMBD_A_A_A____________ ________________BdBbBzCNCkCkCNBzCMCMCMCjCjBaBD_A_A______________ ________________BdBbBbBzBzBzBzCjCjCjBaBaBaBaBD_A_A______________ ________________BdBaBbBbBbBbBaBaBaBaBaBaCMByBD_A_A______________ ________________BdByBaBaBaByBaBaBaBaCMByByByBD_A_A______________ ________________BdBaBaByBaBaBaByByByByByCMCMBD_A________________ _________________ABdBaBaBaByByByByCMCMCMCMBD_A_A________________ _________________ABdByByByByByCjCMCMCMCMCjBD_A_A________________ _________________A_ABkCMCMCMCMCMCMCjCjCjBD_A_A__________________ ___________________A_ABkBkCjCjCjCjCjBDBD_A_A____________________ _____________________A_A_ABDBDBDBDBD_A_A_A______________________ _________________________A_A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 274 (emerald) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________________BSBSBS______________________________ __________________________BkBiBSBSBk____________________________ ________________________C$CVAwAwAwCPBk__________________________ __________________________C$CVCmCPBk____________________________ __________________________BkBdBJAeBk____________________________ __________________________BkBdAjAeBk____________________________ __________________________CPBdBJAeBk_________________A_A_A______ __________________________BlBdAlAeBk_______________A_A_A_A_A____ __________________________COBdBDAeBk_____________A_A_A_A_A_A____ __________________________CPBkBJAeBk___________A_A_A_A_A_A______ __________________________CPBlAlAeBD_______A_A_A_A_A_A_A________ ______________________BdCVCVBkCOAjAeBDBD_A_A_A_A_A_A_A__________ ____________________BdCWC$C$CVBlAlBJAeAeBD_A_A_A_A_A____________ __________________BdAoCRCoC$CWBHAh_Y_YAeAeBD_A_A_A_A____________ ________________Bd_nAoBHBmCRAoAoAh_d_d_d_i_iBD_A_A_A____________ ________________BdARAhAoAoBHAoAh_i_i_i_n_n_YBD_A_A______________ ________________BdARARAhAhAhAh_n_n_n_Y_Y_Y_YBD_A_A______________ ________________Bd_YARARARAR_Y_Y_Y_Y_Y_Y_i_dBD_A_A______________ ________________Bd_d_Y_Y_Y_d_Y_Y_Y_Y_i_d_d_dBD_A_A______________ ________________Bd_Y_Y_d_Y_Y_Y_d_d_d_d_d_i_iBD_A________________ _________________ABd_Y_Y_Y_d_d_d_d_i_i_i_iBD_A_A________________ _________________ABd_d_d_d_d_d_n_i_i_i_i_nBD_A_A________________ _________________A_ABk_i_i_i_i_i_i_n_n_nBD_A_A__________________ ___________________A_ABkBk_n_n_n_n_nBDBD_A_A____________________ _____________________A_A_ABDBDBDBDBD_A_A_A______________________ _________________________A_A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 275 (dark green) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________________BSBSBS______________________________ __________________________BkBiBSBSBk____________________________ ________________________C$CVAwAwAwCPBk__________________________ __________________________C$CVCmCPBk____________________________ __________________________BkBdBJAeBk____________________________ __________________________BkBdAjAeBk____________________________ __________________________CPBdBJAeBk_________________A_A_A______ __________________________BlBdAlAeBk_______________A_A_A_A_A____ __________________________COBdBDAeBk_____________A_A_A_A_A_A____ __________________________CPBkBJAeBk___________A_A_A_A_A_A______ __________________________CPBlAlAeBD_______A_A_A_A_A_A_A________ ______________________BdCVCVBkCOAjAeBDBD_A_A_A_A_A_A_A__________ ____________________BdBmC$C$CVBlAlBJAeAeBD_A_A_A_A_A____________ __________________BdAoBmC$C$BmAoAR_Q_QAeAeBD_A_A_A_A____________ ________________Bd_cAhAoBmBmAoAhAR_T_T_T_X_XBD_A_A_A____________ ________________BdADARAhAoAoAhAR_X_X_X_c_c_QBD_A_A______________ ________________BdADADARARARAR_c_c_c_Q_Q_Q_QBD_A_A______________ ________________Bd_QADADADAD_Q_Q_Q_Q_Q_Q_X_TBD_A_A______________ ________________Bd_T_Q_Q_Q_T_Q_Q_Q_Q_X_T_T_TBD_A_A______________ ________________Bd_Q_Q_T_Q_Q_Q_T_T_T_T_T_X_XBD_A________________ _________________ABd_Q_Q_Q_T_T_T_T_X_X_X_XBD_A_A________________ _________________ABd_T_T_T_T_T_c_X_X_X_X_cBD_A_A________________ _________________A_ABk_X_X_X_X_X_X_c_c_cBD_A_A__________________ ___________________A_ABkBk_c_c_c_c_cBDBD_A_A____________________ _____________________A_A_ABDBDBDBDBD_A_A_A______________________ _________________________A_A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 276 (cyan) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________________BSBSBS______________________________ __________________________BkBiBSBSBk____________________________ ________________________C$CVAwAwAwCPBk__________________________ __________________________C$CVCmCPBk____________________________ __________________________BkBdBJAeBk____________________________ __________________________BkBdAjAeBk____________________________ __________________________CPBdBJAeBk_________________A_A_A______ __________________________BlBdAlAeBk_______________A_A_A_A_A____ __________________________COBdBDAeBk_____________A_A_A_A_A_A____ __________________________CPBkBJAeBk___________A_A_A_A_A_A______ __________________________CPBlAlAeBD_______A_A_A_A_A_A_A________ ______________________BdCVCVBkCOAjAeBDBD_A_A_A_A_A_A_A__________ ____________________BdCVC$C$CVBlAlBJAeAeBD_A_A_A_A_A____________ __________________BdBIBIC$C$CVBIAi_Z_ZAeAeBD_A_A_A_A____________ ________________Bd_oApApCVBhApApAi_e_e_e_j_jBD_A_A_A____________ ________________BdASAiApBIApApAi_j_j_j_o_o_ZBD_A_A______________ ________________BdASASAiAiAiAi_o_o_o_Z_Z_Z_ZBD_A_A______________ ________________Bd_ZASASASAS_Z_Z_Z_Z_Z_Z_j_eBD_A_A______________ ________________Bd_e_Z_Z_Z_e_Z_Z_Z_Z_j_e_e_eBD_A_A______________ ________________Bd_Z_Z_e_Z_Z_Z_e_e_e_e_e_j_jBD_A________________ _________________ABd_Z_Z_Z_e_e_e_e_j_j_j_jBD_A_A________________ _________________ABd_e_e_e_e_e_o_j_j_j_j_oBD_A_A________________ _________________A_ABk_j_j_j_j_j_j_o_o_oBD_A_A__________________ ___________________A_ABkBk_o_o_o_o_oBDBD_A_A____________________ _____________________A_A_ABDBDBDBDBD_A_A_A______________________ _________________________A_A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 277 (sky blue) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________________BSBSBS______________________________ __________________________BkBiBSBSBk____________________________ ________________________C$CVAwAwAwCPBk__________________________ __________________________C$CVCmCPBk____________________________ __________________________BkBdBJAeBk____________________________ __________________________BkBdAjAeBk____________________________ __________________________CPBdBJAeBk_________________A_A_A______ __________________________BlBdAlAeBk_______________A_A_A_A_A____ __________________________COBdBDAeBk_____________A_A_A_A_A_A____ __________________________CPBkBJAeBk___________A_A_A_A_A_A______ __________________________CPBlAlAeBD_______A_A_A_A_A_A_A________ ______________________BdCVCVBkCOAjAeBDBD_A_A_A_A_A_A_A__________ ____________________BdCPC$C$CVBlAlBJAeAeBD_A_A_A_A_A____________ __________________BdBEBeC$C$CPBEAmAPAPAeAeBD_A_A_A_A____________ ________________BdBEAmBECQBlBEBEAmAfAfAfAmAmBD_A_A_A____________ ________________BdAfAmBEBEBEBEAfAmAmAmBEAmAPBD_A_A______________ ________________BdAfAfAfAmAmAmAmBEAmAPAPAPAPBD_A_A______________ ________________BdAPAfAfAfAfAPAPAPAPAPAPAmAfBD_A_A______________ ________________BdAfAPAPAPAfAPAPAPAPAmAfAfAfBD_A_A______________ ________________BdAPAPAfAPAPAPAfAfAfAfAfAmAmBD_A________________ _________________ABdAPAPAPAfAfAfAfAmAmAmAmBD_A_A________________ _________________ABdAfAfAfAfAfBEAmAmAmAmAmBd_A_A________________ _________________A_ABkAmAmAmAmAmAfBEAmBEBD_A_A__________________ ___________________A_ABkBkAmBEAmBEAmBDBD_A_A____________________ _____________________A_A_ABDBDBDBDBD_A_A_A______________________ _________________________A_A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 278 (brilliant blue) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________________BSBSBS______________________________ __________________________BkBiBSBSBk____________________________ ________________________C$CVAwAwAwCPBk__________________________ __________________________C$CVCmCPBk____________________________ __________________________BkBdBJAeBk____________________________ __________________________BkBdAjAeBk____________________________ __________________________CPBdBJAeBk_________________A_A_A______ __________________________BlBdAlAeBk_______________A_A_A_A_A____ __________________________COBdBDAeBk_____________A_A_A_A_A_A____ __________________________CPBkBJAeBk___________A_A_A_A_A_A______ __________________________CPBlAlAeBD_______A_A_A_A_A_A_A________ ______________________BdCVCVBkCOAjAeBDBD_A_A_A_A_A_A_A__________ ____________________BdCPC$C$CVBlAlBJAeAeBD_A_A_A_A_A____________ __________________BdBEBlC$C$CPBEAf_F_FAeAeBD_A_A_A_A____________ ________________Bd_IAmBEBlCQAmAmAf_G_G_G_H_HBD_A_A_A____________ ________________BdAPAfAmBEAmAmAf_H_H_H_I_I_FBD_A_A______________ ________________BdAPAPAfAfAfAf_I_I_I_F_F_F_FBD_A_A______________ ________________Bd_FAPAPAPAP_F_F_F_F_F_F_H_GBD_A_A______________ ________________Bd_G_F_F_F_G_F_F_F_F_H_G_G_GBD_A_A______________ ________________Bd_F_F_G_F_F_F_G_G_G_G_G_H_HBD_A________________ _________________ABd_F_F_F_G_G_G_G_H_H_H_HBD_A_A________________ _________________ABd_G_G_G_G_G_I_H_H_H_H_IBD_A_A________________ _________________A_ABk_H_H_H_H_H_H_I_I_IBD_A_A__________________ ___________________A_ABkBk_I_I_I_I_IBDBD_A_A____________________ _____________________A_A_ABDBDBDBDBD_A_A_A______________________ _________________________A_A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 279 (magenta) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________________BSBSBS______________________________ __________________________BkBiBSBSBk____________________________ ________________________C$CVAwAwAwCPBk__________________________ __________________________C$CVCmCPBk____________________________ __________________________BkBdBJAeBk____________________________ __________________________BkBdAjAeBk____________________________ __________________________CPBdBJAeBk_________________A_A_A______ __________________________BlBdAlAeBk_______________A_A_A_A_A____ __________________________COBdBDAeBk_____________A_A_A_A_A_A____ __________________________CPBkBJAeBk___________A_A_A_A_A_A______ __________________________CPBlAlAeBD_______A_A_A_A_A_A_A________ ______________________BdCVCVBkCOAjAeBDBD_A_A_A_A_A_A_A__________ ____________________BdChC$C$CVBlAlBJAeAeBD_A_A_A_A_A____________ __________________BdCKChC$C$ChCKBYAsAsAeAeBD_A_A_A_A____________ ________________BdCDBxCKChChCKBxBYBPBPBPBqBqBD_A_A_A____________ ________________BdAyBYBxCKCKBxBYBqBqBqCDCDAsBD_A_A______________ ________________BdAyAyBYBYBYBYCDCDCDAsAsAsAsBD_A_A______________ ________________BdAsAyAyAyAyAsAsAsAsAsAsBqBPBD_A_A______________ ________________BdBPAsAsAsBPAsAsAsAsBqBPBPBPBD_A_A______________ ________________BdAsAsBPAsAsAsBPBPBPBPBPBqBqBD_A________________ _________________ABdAsAsAsBPBPBPBPBqBqBqBqBD_A_A________________ _________________ABdBPBPBPBPBPCDBqBqBqBqCDBD_A_A________________ _________________A_ABkBqBqBqBqBqBqCDCDCDBD_A_A__________________ ___________________A_ABkBkCDCDCDCDCDBDBD_A_A____________________ _____________________A_A_ABDBDBDBDBD_A_A_A______________________ _________________________A_A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 280 (purple-red) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________________BSBSBS______________________________ __________________________BkBiBSBSBk____________________________ ________________________C$CVAwAwAwCPBk__________________________ __________________________C$CVCmCPBk____________________________ __________________________BkBdBJAeBk____________________________ __________________________BkBdAjAeBk____________________________ __________________________CPBdBJAeBk_________________A_A_A______ __________________________BlBdAlAeBk_______________A_A_A_A_A____ __________________________COBdBDAeBk_____________A_A_A_A_A_A____ __________________________CPBkBJAeBk___________A_A_A_A_A_A______ __________________________CPBlAlAeBD_______A_A_A_A_A_A_A________ ______________________BdCVCVBkCOAjAeBDBD_A_A_A_A_A_A_A__________ ____________________BdChC$C$CVBlAlBJAeAeBD_A_A_A_A_A____________ __________________BdCeChC$C$ChCeBuArArAeAeBD_A_A_A_A____________ ________________BdCCCHCeChChCeCHBuBOBOBOBpBpBD_A_A_A____________ ________________BdBUBuCHCeCeCHBuBpBpBpCCCCArBD_A_A______________ ________________BdBUBUBuBuBuBuCCCCCCArArArArBD_A_A______________ ________________BdArBUBUBUBUArArArArArArBpBOBD_A_A______________ ________________BdBOArArArBOArArArArBpBOBOBOBD_A_A______________ ________________BdArArBOArArArBOBOBOBOBOBpBpBD_A________________ _________________ABdArArArBOBOBOBOBpBpBpBpBD_A_A________________ _________________ABdBOBOBOBOBOCCBpBpBpBpCCBD_A_A________________ _________________A_ABkBpBpBpBpBpBpCCCCCCBD_A_A__________________ ___________________A_ABkBkCCCCCCCCCCBDBD_A_A____________________ _____________________A_A_ABDBDBDBDBD_A_A_A______________________ _________________________A_A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 281 (puce) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________________BSBSBS______________________________ __________________________BkBiBSBSBk____________________________ ________________________C$CVAwAwAwCPBk__________________________ __________________________C$CVCmCPBk____________________________ __________________________BkBdBJAeBk____________________________ __________________________BkBdAjAeBk____________________________ __________________________CPBdBJAeBk_________________A_A_A______ __________________________BlBdAlAeBk_______________A_A_A_A_A____ __________________________COBdBDAeBk_____________A_A_A_A_A_A____ __________________________CPBkBJAeBk___________A_A_A_A_A_A______ __________________________CPBlAlAeBD_______A_A_A_A_A_A_A________ ______________________BdCVCVBkCOAjAeBDBD_A_A_A_A_A_A_A__________ ____________________BdCJC$C$CVBlAlBJAeAeBD_A_A_A_A_A____________ __________________BdBtCJC$C$CJBtAxAGAGAeAeBD_A_A_A_A____________ ________________BdBNBTBtCJCJBtBTAxATATATAqAqBD_A_A_A____________ ________________BdAZAxBTBtBtBTAxAqAqAqBNBNAGBD_A_A______________ ________________BdAZAZAxAxAxAxBNBNBNAGAGAGAGBD_A_A______________ ________________BdAGAZAZAZAZAGAGAGAGAGAGAqATBD_A_A______________ ________________BdATAGAGAGATAGAGAGAGAqATATATBD_A_A______________ ________________BdAGAGATAGAGAGATATATATATAqAqBD_A________________ _________________ABdAGAGAGATATATATAqAqAqAqBD_A_A________________ _________________ABdATATATATATBNAqAqAqAqBNBD_A_A________________ _________________A_ABkAqAqAqAqAqAqBNBNBNBD_A_A__________________ ___________________A_ABkBkBNBNBNBNBNBDBD_A_A____________________ _____________________A_A_ABDBDBDBDBD_A_A_A______________________ _________________________A_A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 282 (milky) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________________BSBSBS______________________________ __________________________BkBiBSBSBk____________________________ ________________________C$CVAwAwAwCPBk__________________________ __________________________C$CVCmCPBk____________________________ __________________________BkBdBJAeBk____________________________ __________________________BkBdAjAeBk____________________________ __________________________CPBdBJAeBk_________________A_A_A______ __________________________BlBdAlAeBk_______________A_A_A_A_A____ __________________________COBdBDAeBk_____________A_A_A_A_A_A____ __________________________CPBlBJAeBk___________A_A_A_A_A_A______ __________________________CPCPAlAeBD_______A_A_A_A_A_A_A________ ______________________BdCVCVCPCPCPAeBDBD_A_A_A_A_A_A_A__________ ____________________BdCtC$C$CtCtCPCVCVAeBD_A_A_A_A_A____________ __________________BdCtCtC$C$CtCoCtCoCtCoCWBD_A_A_A_A____________ ________________BdCtCtCtCtCtCtCoCtCtCtCtCtCtBD_A_A_A____________ ________________BdCtCtCtCoCtCtCtCtCtCtCtCtCoBD_A_A______________ ________________BdCoCtCoCtCtCtCtCtCtCoCtCoCtBD_A_A______________ ________________BdCtCoCtCoCtCoCtCoCtCtCoCtCoBc_A_A______________ ________________BKCtCoCtCoCtCoCtCoCtCoCtCoCtBD_A_A______________ ________________BdCtCoCtCoCtCtCoCtCoCtCtCoCtBD_A________________ _________________BBdCtCtCoCtCoCtCoCtCtCoCtBD_A_A________________ _________________ABdCtCtCtCoCtCoCtCoCtCtCtBD_A_A________________ _________________A_ABkCXCtCtCtCtCtCtCtClBD_A_A__________________ ___________________A_ABkBkClClClClClBDBD_A_A____________________ _____________________A_A_ABDBDBDBDBD_A_A_A______________________ _________________________A_A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 283 (swirly) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________________BSBSBS______________________________ __________________________BkBiBSBSBk____________________________ ________________________C$CVAwAwAwCPBk__________________________ __________________________C$CVCmCPBk____________________________ __________________________BkBdBJAeBk____________________________ __________________________BkBdAjAeBk____________________________ __________________________CPBdBJAeBk_________________A_A_A______ __________________________BlBdAlAeBk_______________A_A_A_A_A____ __________________________COBdBDAeBk_____________A_A_A_A_A_A____ __________________________CPBkBJAeBk___________A_A_A_A_A_A______ __________________________CPBlAlAeBD_______A_A_A_A_A_A_A________ ______________________BdCVCVBkCOAjAeBDBD_A_A_A_A_A_A_A__________ ____________________BdCQC$C$CVBlAlBJAeAeBD_A_A_A_A_A____________ __________________BdBeCQC$C$CQBeBEBpAWAeAeBD_A_A_A_A____________ ________________BdBCBEBeCQCQBeBEAmAkBpBpAtAtBD_A_A_A____________ ________________BdAmAmBEBeBeBEBEBpBpAkBCCCAWBD_A_A______________ ________________BdAmAmBEAmBEAmCCBCBCBOAWBOAWBD_A_A______________ ________________BdAWAmAmAmAmAWBOAWAWBOAWBOAkBD_A_A______________ ________________BdAkBOAWBOAkAWBOAWBOAtAkBpAkBD_A_A______________ ________________BdAWBOAkBOAWAWBpAkBpAkAkCCAtBD_A________________ _________________ABdBOAWBOAkAkBpAkCCAtAtCCBD_A_A________________ _________________ABdBpAkBpAkCCAtAtCCAtCCBCBD_A_A________________ _________________A_ABkCCAtAtCCAtCCBCCZBCBD_A_A__________________ ___________________A_ABkBkCZBCBCCZBCBDBD_A_A____________________ _____________________A_A_ABDBDBDBDBD_A_A_A______________________ _________________________A_A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 284 (bubbly) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________________BSBSBS______________________________ __________________________BkBiBSBSBk____________________________ ________________________C$CVAwAwAwCPBk__________________________ __________________________C$CVCmCPBk____________________________ __________________________BkBdBJAeBk____________________________ __________________________BkBdAjAeBk____________________________ __________________________CPBdBJAeBk_________________A_A_A______ __________________________BlBdAlAeBk_______________A_A_A_A_A____ __________________________COBdBDAeBk_____________A_A_A_A_A_A____ __________________________CPBkBJAeBk___________A_A_A_A_A_A______ __________________________CPBlAlAeBD_______A_A_A_A_A_A_A________ ______________________BdCVCVBkCOAjAeBDBD_A_A_A_A_A_A_A__________ ____________________BdBgC$C$CVBlAlBJAeAeBD_A_A_A_A_A____________ __________________BdCRBgC$C$BgCRBmBfBGAeAeBD_A_A_A_A____________ ________________BdBBCWCRBgBgCRCWBmBGAnAnBGBGBD_A_A_A____________ ________________BdBLBmBmCRCRBmBmBGBGAnBfBGAnBD_A_A______________ ________________BdBLBLBmBmBmBmBGBfBGAnBGBGAnBD_A_A______________ ________________BdAnBLBLBLBLBGAgBGAnAnAnBGAnBD_A_A______________ ________________BdBfBGAnBGBfBGAnAnAnBGBfBGBGBD_A_A______________ ________________BdBGAnBGAgBGAnBfBGAnBGBGAnBGBD_A________________ _________________ABdAnBfBGAnBGBGBGBGBGBGBGBD_A_A________________ _________________ABdBGBGBGAnBGBGBGBGBfBGBfBD_A_A________________ _________________A_ABkBGBGBGBGBGBGBfBGAnBD_A_A__________________ ___________________A_ABkBkBfBfBfBfBfBDBD_L_A____________________ _____________________A_A_ABDBDBDBDBD_A_A_A______________________ _________________________A_A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 285 (smoky) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________BSBSBS________________________________ ________________________BkBiBSBSCP______________________________ ______________________C$CVAwAwAwCPBk____________________________ ________________________C$CPCPCPBk______________________________ ________________________BkCVCVCVBk______________________________ ________________________BkCVCmCPBk______________________________ ________________________CPCVCmCmBk_________________A_A_A________ ________________________BnCmCmCVBk_______________A_A_A_A_A______ ________________________CJCmCmCVBk_____________A_A_A_A_A_A______ ________________________CPCmCmCVBk___________A_A_A_A_A_A________ ________________________CPCVCmCVCP_______A_A_A_A_A_A_A__________ ____________________BdCVCVCVCmCmCPBDBD_A_A_A_A_A_A_A____________ __________________BdCVC$C$CVCVCmCWCPCPBD_A_A_A_A_A______________ ________________BdCVCoC$C$CoCmBmCmCRCPBkBD_A_A_A_A______________ ______________BdCVCVCmCoCoCmCPCmCmBmBmCR_rBD_A_A_A______________ ______________BdAoCWCVCmCmCPBmCmCRBmCm_u_iBD_A_A________________ ______________BdAoAoCRBmBmBmCRBmCmBm_i_i_iBD_A_A________________ ______________Bd_iAoAoAoAo_i_i_i_i_i_i_r_nBD_A_A________________ ______________Bd_n_i_i_i_n_i_i_i_i_r_n_n_nBD_A_A________________ ______________Bd_i_i_n_i_i_i_n_n_n_n_n_r_rBD_A__________________ _______________ABd_i_i_i_n_n_n_n_r_r_r_rBD_A_A__________________ _______________ABd_n_n_n_n_n_u_r_r_r_r_uBD_A_A__________________ _______________A_ABk_r_r_r_r_r_r_u_u_uBD_A_A____________________ _________________A_ABkBk_u_u_u_u_uBDBD_A_A______________________ ___________________A_A_ABDBDBDBDBD_A_A_A________________________ _______________________A_A_A_A_A_A_A____________________________ ________________________________________________________________ } # tile 286 (cloudy) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________________BSBSBS______________________________ __________________________BkBiBSBSBk____________________________ ________________________C$CVAwAwAwCPBk__________________________ __________________________C$CVCmCPBk____________________________ __________________________BkBdBJAeBk____________________________ __________________________BkBdAjAeBk____________________________ __________________________CPBdBJAeBk_________________A_A_A______ __________________________BlBdAlAeBk_______________A_A_A_A_A____ __________________________COBdBDAeBk_____________A_A_A_A_A_A____ __________________________CPBkBJAeBk___________A_A_A_A_A_A______ __________________________CPBlAlAeBD_______A_A_A_A_A_A_A________ ______________________BdCVCVBkCOAjAeBDBD_A_A_A_A_A_A_A__________ ____________________BdC$C$C$CVBlAlBJAeAeBD_A_A_A_A_A____________ __________________BdC$C$C$C$C$C$CPBdBdAeAeBD_A_A_A_A____________ ________________BdCmCmC$C$C$C$CmCPCOBlBkCPCPBD_A_A_A____________ ________________BdBkCPCmC$C$CmCPCPCPCPCmCmBdBD_A_A______________ ________________BdCPBkCPCPCPCPCmCmCmBdBdBdBdBD_A_A______________ ________________BdBdBkCPBkBkBdBdBdBdBdBdCPBkBD_A_A______________ ________________BdBkBdBdBdCPBdBdBdBdCPBkCJBnBD_A_A______________ ________________BdBdBdBkBdBdBdBkBkCPBkBnCPCPBD_A________________ _________________ABdBdBkBdBkBkCPBkCPCPCPCPBD_A_A________________ _________________ABdBkBkCPBkCPCVCPCPCPCPCmBD_A_A________________ _________________A_ABkCPCPCPCPCPCPCmCmCmBD_A_A__________________ ___________________A_ABkBkCmCmCmCmCmBDBD_A_A____________________ _____________________A_A_ABDBDBDBDBD_A_A_A______________________ _________________________A_A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 287 (effervescent) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________________BSBSBS______________________________ __________________________BkBiBSBSBk____________________________ ________________________C$CVAwAwAwCPBk__________________________ __________________________C$CVCmCPBk____________________________ __________________________BkBdBJAeBk____________________________ __________________________BkBdAjAeBk____________________________ __________________________CPBdBJAeBk_________________A_A_A______ __________________________BlBdAlAeBk_______________A_A_A_A_A____ __________________________COBdBDAeBk_____________A_A_A_A_A_A____ __________________________CPBkBJAeBk___________A_A_A_A_A_A______ __________________________CPBlAlAeBD_______A_A_A_A_A_A_A________ ______________________BdCVCVBkCOChAeBDBD_A_A_A_A_A_A_A__________ ____________________BkChC$C$CVBlCmCoChAeBD_A_A_A_A_A____________ __________________BdChC$C$C$CmCoCKChCoChCmBD_A_A_A_A____________ ________________BdCoChChCoCoChCmCoCmChCoC$ChBD_A_A_A____________ ________________BdBxC$CoChCoCoCKCoChC$ChCmBYBd_A_A______________ ________________BkChBxChCoChCKCmChC$ChBYBYBYBD_A_A______________ ________________BdBYBxCKBxBxBYBYBYBYBYBYChBxBD_A_A______________ ________________BdChBYBYBYChBYBYChBYCKBxBxBxBD_A_A______________ ________________BdBYBYChBYBYBYBxBxBxBxBxCKCKBD_A________________ _________________ABdBYBYBYBxBxBxBxCKCKChCKBD_A_A________________ _________________ABdBxBxChBxBxChCKChCKCKChBD_A_A________________ _________________A_ABkCKCKCKCKCKChChChChBD_A_A__________________ ___________________A_ABkBkChCoChChChBdBD_A_A____________________ _____________________A_A_ABYBDBYBDBd_A_A_A______________________ _________________________A_A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 288 (black) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________________BSBSBS______________________________ __________________________BkBiBSBSBk____________________________ ________________________C$CVAwAwAwCPBk__________________________ __________________________C$CVCmCPBk____________________________ __________________________BkBdBJAeBk____________________________ __________________________BkBdAjAeBk____________________________ __________________________CPBdBJAeBk_________________A_A_A______ __________________________BlBdAlAeBk_______________A_A_A_A_A____ __________________________COBdBDAeBk_____________A_A_A_A_A_A____ __________________________CPBkBJAeBk___________A_A_A_A_A_A______ __________________________CPBlAlAeBD_______A_A_A_A_A_A_A________ ______________________BdCVCVBkCOAjAeBDBD_A_A_A_A_A_A_A__________ ____________________BdBdC$C$CVBlAlBJAeAeBD_A_A_A_A_A____________ __________________BdBdBdC$C$BdBdAeABABAeAeBD_A_A_A_A____________ ________________BdAeBJBdBdBdBdBJAeABABABAOAOBD_A_A_A____________ ________________BdAOAeAlBdBdBJAeAOAOAOAeAeABBD_A_A______________ ________________BdAOAOAeAeAeAeAeAeAeABABABABBD_A_A______________ ________________BdABAOAOAOAOABABABABABABAOABBD_A_A______________ ________________BdABABABABABABABABABAOABABABBD_A_A______________ ________________BdABABABABABABABABABABABAOAOBD_A________________ _________________ABdABABABABABABABAOAOAOAOBD_A_A________________ _________________ABdABABABABABAeAOAOAOAOAeBD_A_A________________ _________________A_ABkAOAOAOAOAOAOAeAeAeBD_A_A__________________ ___________________A_ABkBkAeAeAeAeAeBDBD_A_A____________________ _____________________A_A_ABDBDBDBDBD_A_A_A______________________ _________________________A_A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 289 (golden) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________________BSBSBS______________________________ __________________________BkBiBSBSBk____________________________ ________________________C$CVAwAwAwCPBk__________________________ __________________________C$CVCmCPBk____________________________ __________________________BkBdBJAeBk____________________________ __________________________BkBdAjAeBk____________________________ __________________________CPBdBJAeBk_________________A_A_A______ __________________________BlBdAlAeBk_______________A_A_A_A_A____ __________________________COBdBDAeBk_____________A_A_A_A_A_A____ __________________________CPBkBJAeBk___________A_A_A_A_A_A______ __________________________CPBZBZBZBD_______A_A_A_A_A_A_A________ ______________________BdCVCtBZBZBZAlBDBD_A_A_A_A_A_A_A__________ ____________________BdCmC$C$CtCLCrBzCLBZBD_A_A_A_A_A____________ __________________BdCrCtC$C$CtCrCLCLBZCLBZBD_A_A_A_A____________ ________________BdCLCrCrCtCtCrCrCLCLCLBbBZB_BD_A_A_A____________ ________________BdCLCLCrCrCrCrCLCrCLBvCLBZB_BD_A_A______________ ________________BdCrCLCLCLCLCLCrCLBbCLBZB_BZBD_A_A______________ ________________BdCLCrCrCrCLCrCLCLBvCGBZB_BZBD_A_A______________ ________________BdCLCLCLCLCLCLBbCLCLBZB_B_BZBD_A_A______________ ________________BdBZBbCLCLBZCLCLCLBZBZB_BZBZBD_A________________ _________________ABdBZBZBZCLCLBWCLBZB_BZBZBD_A_A________________ _________________ABdCLCLCLBZBZBZB_B_BZBZB_BD_A_A________________ _________________A_ABwB_BZBZBZBZBZBZB_B_BD_A_A__________________ ___________________A_ABkBkB_B_B_B_B_BDBD_A_A____________________ _____________________A_A_ABDBDBDBDBD_A_A_A______________________ _________________________A_A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 290 (brown) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________________BSBSBS______________________________ __________________________BkBiBSBSBk____________________________ ________________________C$CVAwAwAwCPBk__________________________ __________________________C$CVCmCPBk____________________________ __________________________BkBdBJAeBk____________________________ __________________________BkBdAjAeBk____________________________ __________________________CPBdBJAeBk_________________A_A_A______ __________________________BlBdAlAeBk_______________A_A_A_A_A____ __________________________COBdBDAeBk_____________A_A_A_A_A_A____ __________________________CPBkBJAeBk___________A_A_A_A_A_A______ __________________________CPBlAlAeBD_______A_A_A_A_A_A_A________ ______________________BdCVCVBkCOAjAeBDBD_A_A_A_A_A_A_A__________ ____________________BdCgC$C$CVBlAlBJAeAeBD_A_A_A_A_A____________ __________________BdCGCgC$C$CgCGBTAYAYAeAeBD_A_A_A_A____________ ________________BdBsBtCGCgCgCGBtBTAwAwAwBSBSBD_A_A_A____________ ________________BdAxBTBtCGCGBtBTBSBSBSBsBsAYBD_A_A______________ ________________BdAxAxBTBTBTBTBsBsBsAYAYAYAYBD_A_A______________ ________________BdAYAxAxAxAxAYAYAYAYAYAYBSAwBD_A_A______________ ________________BdAwAYAYAYAwAYAYAYAYBSAwAwAwBD_A_A______________ ________________BdAYAYAwAYAYAYAwAwAwAwAwBSBSBD_A________________ _________________ABdAYAYAYAwAwAwAwBSBSBSBSBD_A_A________________ _________________ABdAwAwAwAwAwBsBSBSBSBSBsBD_A_A________________ _________________A_ABkBSBSBSBSBSBSBsBsBsBD_A_A__________________ ___________________A_ABkBkBsBsBsBsBsBDBD_A_A____________________ _____________________A_A_ABDBDBDBDBD_A_A_A______________________ _________________________A_A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 291 (fizzy) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________________BSBSBS______________________________ __________________________BkBiBSBSBk____________________________ ________________________C$CVAwAwAwCPBk__________________________ __________________________C$CVCmCPBk____________________________ __________________________BkBdBJAeBk____________________________ __________________________BkBdAjAeBk____________________________ __________________________CPBdBJAeBk_________________A_A_A______ __________________________BlBdAlAeBk_______________A_A_A_A_A____ __________________________COBdBDAeBk_____________A_A_A_A_A_A____ __________________________CPBkBJAeBk___________A_A_A_A_A_A______ __________________________CPBlAlAeBD_______A_A_A_A_A_A_A________ ______________________BdCVCVBkCOAjAeBDBD_A_A_A_A_A_A_A__________ ____________________BdCtC$C$CVBlAlBJAeAeBD_A_A_A_A_A____________ __________________BdCkCoC$C$CtCkBzBWBWAeAeBD_A_A_A_A____________ ________________BdCfCNCkCtCoCkCNBzBvBvBvCICIBD_A_A_A____________ ________________BdBbBzCNCkCkCNBzCICICICfCfClBD_A_A______________ ________________BdBbBbBzBzBzBzCfCfCfCfBbBWBWBD_A_A______________ ________________BdBWCNBbBbBbBWBbBWBWBWBWCNBvBD_A_A______________ ________________BdBbBWBWBWBvBWBWBzBWCNBvBvBvBD_A_A______________ ________________BdBWBWBvBWBzBWBzBvBvBvBvClCIBD_A________________ _________________ABdBzBWCNBvBvBvBvCkCICICIBD_A_A________________ _________________ABdBvBvBvBvBvCkCICIClCICfBD_A_A________________ _________________A_ABkClCIClCICICICfCfCfBD_A_A__________________ ___________________A_ABkBkCfClCfClCfBDBD_A_A____________________ _____________________A_A_ABDBDBDBDBD_A_A_A______________________ _________________________A_A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 292 (dark) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________________BSBSBS______________________________ __________________________BkBiBSBSBk____________________________ ________________________C$CVAwAwAwCPBk__________________________ __________________________C$CVCmCPBk____________________________ __________________________BkBdBJAeBk____________________________ __________________________BkBdAjAeBk____________________________ __________________________CPBdBJAeBk_________________A_A_A______ __________________________BlBdAlAeBk_______________A_A_A_A_A____ __________________________COBdBDAeBk_____________A_A_A_A_A_A____ __________________________CPBkBJAeBk___________A_A_A_A_A_A______ __________________________CPBlAlAeBD_______A_A_A_A_A_A_A________ ______________________BdCVCVBkCOAjAeBDBD_A_A_A_A_A_A_A__________ ____________________BdCPC$C$CVBlAlBJAeAeBD_A_A_A_A_A____________ __________________BdBEBlC$C$CPBEAf_C_CAeAeBD_A_A_A_A____________ ________________Bd_FAmBEBlCQAmAmAf_D_D_D_E_EBD_A_A_A____________ ________________BdAPAfAmBEAmAmAf_E_E_E_F_F_CBD_A_A______________ ________________BdAPAPAfAfAfAf_F_F_F_C_C_C_CBD_A_A______________ ________________Bd_CAPAPAPAP_C_C_C_C_C_C_E_DBD_A_A______________ ________________Bd_D_C_C_C_D_C_C_C_C_E_D_D_DBD_A_A______________ ________________Bd_C_C_D_C_C_C_D_D_D_D_D_E_EBD_A________________ _________________ABd_C_C_C_D_D_D_D_E_E_E_EBD_A_A________________ _________________ABd_D_D_D_D_D_F_E_E_E_E_FBD_A_A________________ _________________A_ABk_E_E_E_E_E_E_F_F_FBD_A_A__________________ ___________________A_ABkBk_F_F_F_F_FBDBD_A_A____________________ _____________________A_A_ABDBDBDBDBD_A_A_A______________________ _________________________A_A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 293 (white) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________________BSBSBS______________________________ __________________________BkBiBSBSBk____________________________ ________________________C$CVAwAwAwCPBk__________________________ __________________________C$CVCmCPBk____________________________ __________________________BkBdBJAeBk____________________________ __________________________BkBdAjAeBk____________________________ __________________________CPBdBJAeBk_________________A_A_A______ __________________________BlBdAlAeBk_______________A_A_A_A_A____ __________________________COBdBDAeBk_____________A_A_A_A_A_A____ __________________________CPBlBJAeBk___________A_A_A_A_A_A______ __________________________CPCPAlAeBD_______A_A_A_A_A_A_A________ ______________________BdCVCVCPCPCPAeBDBD_A_A_A_A_A_A_A__________ ____________________BdCmC$C$CoCmCPCVCVAeBD_A_A_A_A_A____________ __________________BdCoCoC$C$CoCmCmCmCmCmCPBD_A_A_A_A____________ ________________BdCoCoCmCoCoCmCmCmCoCoCoCoCmBD_A_A_A____________ ________________BdCmCoCoCmCmCoCoCoCoCoCoCoCmBD_A_A______________ ________________BdCmCmCmCmCoCoCoCoCoCmCmCmCmBD_A_A______________ ________________BdCmCmCmCmCmCmCmCmCmCmCmCmCmBD_A_A______________ ________________BdCmCmCmCmCmCmCmCmCmCmCmCmCmBD_A_A______________ ________________BdCmCmCmCmCmCmCmCmCmCmCmCmCmBD_A________________ _________________ABdCVCmCmCmCmCmCmCmCmCmCVBD_A_A________________ _________________ABdCVCVCmCmCmCmCmCmCmCVCVBD_A_A________________ _________________A_ABkCPCVCVCVCVCVCVCVCPBD_A_A__________________ ___________________A_ABkBkCPCPCPCPCPBDBD_A_A____________________ _____________________A_A_ABDBDBDBDBD_A_A_A______________________ _________________________A_A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 294 (murky) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________________BSBSBS______________________________ __________________________BkBiBSBSBk____________________________ ________________________C$CVAwAwAwCPBk__________________________ __________________________C$CVCmCPBk____________________________ __________________________BkBdBJAeBk____________________________ __________________________BkBdAjAeBk____________________________ __________________________CPBdBJAeBk_________________A_A_A______ __________________________BlBdAlAeBk_______________A_A_A_A_A____ __________________________COBdBDAeBk_____________A_A_A_A_A_A____ __________________________CPBkBJAeBk___________A_A_A_A_A_A______ __________________________CPBlAlAeBD_______A_A_A_A_A_A_A________ ______________________BdCVCVBkCOAjAeBDBD_A_A_A_A_A_A_A__________ ____________________BdCOC$C$CVBlAlBJAeAeBD_A_A_A_A_A____________ __________________BdBzCOC$C$COBzB_ANALAeAeBD_A_A_A_A____________ ________________BdBWBbBzCOCOBzBbB_AbAbAbAzAzBD_A_A_A____________ ________________BdAdB_BbBzBzBbB_B_AzAzBWBWALBD_A_A______________ ________________BdAdAdAhB_AlB_BWBWBWALALALALBD_A_A______________ ________________BdALAdAdAdAdAMAMALALALALAzAbBD_A_A______________ ________________BdAbALALALAbALALALALAzAbAbAbBD_A_A______________ ________________BdALALAbALALALAbAbAbAbAbAzAzBD_A________________ _________________ABdALALALAbAbAbAbAzAzAzAzBD_A_A________________ _________________ABdAbAbAbAbAbBWAzAzAzAzBWBD_A_A________________ _________________A_ABkAzAzAzAzAzAzBWBWBWBD_A_A__________________ ___________________A_ABkBkBWBWBWBWBWBDBD_A_A____________________ _____________________A_A_ABDBDBDBDBD_A_A_A______________________ _________________________A_A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 295 (clear) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________________BSBSBS______________________________ __________________________BkBiBSBSBk____________________________ ________________________C$CVAwAwAwCPBk__________________________ __________________________C$CVCmCPBk____________________________ __________________________BkBdBJAeBk____________________________ __________________________BkBdAjAeBk____________________________ __________________________CPBdBJAeBk_________________A_A_A______ __________________________BlBdAlAeBk_______________A_A_A_A_A____ __________________________COBdBDAeBk_____________A_A_A_A_A_A____ __________________________CPBkBJAeBk___________A_A_A_A_A_A______ __________________________CPBlAlAeBD_______A_A_A_A_A_A_A________ ______________________BdCVCVBkCOAjAeBDBD_A_A_A_A_A_A_A__________ ____________________BdCVC$C$CVBlAlBJAeAeBD_A_A_A_A_A____________ __________________BdBnBIC$C$CVBnBd_R_RAeAeBD_A_A_A_A____________ ________________BdASBMBnCVBIBnBMAiAEABAEAEAEBD_A_A_A____________ ________________BdASBdBFBnBnBMBdAEAEAEASAS_RBD_A_A______________ ________________BdASASBdAiBdAiASASAS_R_R_R_RBD_A_A______________ ________________Bd_RASASASAS_R_R_R_R_R_RAEAEBD_A_A______________ ________________Bd_V_R_R_RAE_R_R_R_RAEAO_VABBD_A_A______________ ________________Bd_R_RAO_R_R_RAD_VAO_VAEAEAEBD_A________________ _________________ABd_R_R_R_VAO_VAOAEAEAEAEBD_A_A________________ _________________ABdAO_VAO_VAOASAEAEAEAEASBD_A_A________________ _________________A_ABkAEAEAEAEAEAEASASASBD_A_A__________________ ___________________A_ABkBkASASASASASBDBD_A_A____________________ _____________________A_A_ABDBDBDBDBD_A_A_A______________________ _________________________A_A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 296 (ZELGO MER) { ________________________________BSBSBS__________________________ ____________________________BSBSBSBSBsBs________________________ ________________________BSBSBSBsBsBsBsBSBs______________________ __________________BSBSBSBSBsBsBsBsBSBsBSBS______________________ ____________BSBSBSBSBSBsBsBsBsBSBsBSBSBSBSBS____________________ ________BSBSBSBSBSBsBsBsBsBSBsBsBSBSBSBSBSBS____________________ ____BSBSBSBSBSBsBsBSBsBsBSBsBSBSBSBSBSAwAwBSCPCV________________ __BdBdBdAwBSBsBSBsBsBsBSBsBSBSBSBSBSAwAwAwCPCVCmCVCPCP__________ __BkBdAwAwAwBSBsBsBsBSBsBSBSBSBSAwAwAwAwCPCVBJAjCVCPCPCVCV______ BnCJAwAjBJAwAwBsBsBSBsBSBSBSBSAwAwAwCPCPCVAlCVCVCPAeCPCVCVCm____ BkAwBdBdBdAYAwAwBSBsBSBSBSBSAwAwCPCPCPBJCmCmCVCPAeCPBJCVAlCmCm__ BkAwBkBkAwAYAwAwBsBSBSBSBSAwAwCPCPCVBDAlCmBDCVCPCPCVCVCVCmBDCm__ CPAwBkAwAYBdAwAYBSBSBSAwAwAwCPCPBJAlCmCmAjCVCPAeAeAlCVCmAjCmCm__ CPAwCPAwBdBdAYAYBSBSAwAwAwCPCPCVCmCmBJCmCVCVAeCPCVCVCVBJCmCm_A__ __CPAwBkAwBdAYBdBSAwAwAwCPCPCVAjCmAjCVCVCVCPCPAeCVCVCmAlBDCm_A__ _ACPAwCPAwAwBdBkAwAwAwCPCPCVBJCmBJCVCVCVAeCPAeCVCVBDCmCmCmCm_A__ _ACPCPAwCPCPBkCPAwAwCPCPCVAlCmAlCVCVCPAeCPCVAlCVCVCmAlBDCm_A____ _A_ACPCPAwCPCPAwAwCPCPCVCmBDBDCVCVCVCPCPCPAeCVCVCmBJCmCmCm_A____ ___A_ACPCPAwAwAwCPCPCVBJAlCmCVAlCVCPCPAeCVCVCVCmAjCmCmCm_A_A____ _____A_ACPCVCVCVCVCVCmAjCVAjCVCVCPAeCPCVCVCVCmBJCmAlCmCm_A______ _______A_ACVCVCmCmCmBJCVBJCVCPCPCPCPAeAeCVCVCmAlCoCmCmCm_A______ ___________ACmCmCmAjCVAlCVAlCPCPCPAeCVCVCVCmCmCmCmBJCm_A_A______ _____________ACmCVCVCVCVCPCPCPCPAeCVAeCVCmCmCmCmAjCmCm_A________ _______________A_ACVCVCPCPCPCPAeCVCVCVCmCmCmAjBJCmCmCm_A________ _________________A_A_A_ACPCPCPCPCVAeCVCmCmBJCmCmCmCmCm_A________ _____________________A_A_A_A_ACVCVCVCmCmCmCmAlCmCmCm_A__________ _________________________A_A_A_A_ACVCmCmCmBDCmBJCmCm_A__________ _____________________________A_A_A_ACmCmBDAlCmCmCmCm_A__________ _________________________________A_A_A_ACVCmCmCmCm_A____________ _____________________________________A_A_A_ACVCVCV_A____________ ___________________________________________A_A_A_A______________ ________________________________________________________________ } # tile 297 (JUYED AWK YACC) { ________________________________BSBSBS__________________________ ____________________________BSBSBSBSBsBs________________________ ________________________BSBSBSBsBsBsBsBSBs______________________ __________________BSBSBSBSBsBsBsBsBSBsBSBS______________________ ____________BSBSBSBSBSBsBsBsBsBSBsBSBSBSBSBS____________________ ________BSBSBSBSBSBsBsBsBsBSBsBsBSBSBSBSBSBS____________________ ____BSBSBSBSBSBsBsBSBsBsBSBsBSBSBSBSBSAwAwBSCPCV________________ __BdBdBdAwBSBsBSBsBsBsBSBsBSBSBSBSBSAwAwAwCPCVCmCVCPCP__________ __BkBdAwAwAwBSBsBsBsBSBsBSBSBSBSAwAwAwAwCPCVBJAjCVCPCPCVCV______ BnCJAwAjBJAwAwBsBsBSBsBSBSBSBSAwAwAwCPCPCVAlCVCVCPAeCPCVCVCm____ BkAwBdBdBdAYAwAwBSBsBSBSBSBSAwAwCPCPCPBJCmCmCVCPAeCPBJCVAlCmCm__ BkAwBkBkAwAYAwAwBsBSBSBSBSAwAwCPCPCVBDAlCmBDCVCPCPCVCVCVCmBDCm__ CPAwBkAwAYBdAwAYBSBSBSAwAwAwCPCPBJAlCmCmAjCVCPAeAeAlCVCmAjCmCm__ CPAwCPAwBdBdAYAYBSBSAwAwAwCPCPCVCmCmBJCmCVCVAeCPCVCVCVBJCmCm_A__ __CPAwBkAwBdAYBdBSAwAwAwCPCPCVAjCmAjCVCVCVCPCPAeCVCVCmAlBDCm_A__ _ACPAwCPAwAwBdBkAwAwAwCPCPCVBJCmBJCVCVCVAeCPAeCVCVBDCmCmCmCm_A__ _ACPCPAwCPCPBkCPAwAwCPCPCVAlCmAlCVCVCPAeCPCVAlCVCVCmAlBDCm_A____ _A_ACPCPAwCPCPAwAwCPCPCVCmBDBDCVCVCVCPCPCPAeCVCVCmBJCmCmCm_A____ ___A_ACPCPAwAwAwCPCPCVBJAlCmCVAlCVCPCPAeCVCVCVCmAjCmCmCm_A_A____ _____A_ACPCVCVCVCVCVCmAjCVAjCVCVCPAeCPCVCVCVCmBJCmAlCmCm_A______ _______A_ACVCVCmCmCmBJCVBJCVCPCPCPCPAeAeCVCVCmAlCoCmCmCm_A______ ___________ACmCmCmAjCVAlCVAlCPCPCPAeCVCVCVCmCmCmCmBJCm_A_A______ _____________ACmCVCVCVCVCPCPCPCPAeCVAeCVCmCmCmCmAjCmCm_A________ _______________A_ACVCVCPCPCPCPAeCVCVCVCmCmCmAjBJCmCmCm_A________ _________________A_A_A_ACPCPCPCPCVAeCVCmCmBJCmCmCmCmCm_A________ _____________________A_A_A_A_ACVCVCVCmCmCmCmAlCmCmCm_A__________ _________________________A_A_A_A_ACVCmCmCmBDCmBJCmCm_A__________ _____________________________A_A_A_ACmCmBDAlCmCmCmCm_A__________ _________________________________A_A_A_ACVCmCmCmCm_A____________ _____________________________________A_A_A_ACVCVCV_A____________ ___________________________________________A_A_A_A______________ ________________________________________________________________ } # tile 298 (NR 9) { ________________________________BSBSBS__________________________ ____________________________BSBSBSBSBsBs________________________ ________________________BSBSBSBsBsBsBsBSBs______________________ __________________BSBSBSBSBsBsBsBsBSBsBSBS______________________ ____________BSBSBSBSBSBsBsBsBsBSBsBSBSBSBSBS____________________ ________BSBSBSBSBSBsBsBsBsBSBsBsBSBSBSBSBSBS____________________ ____BSBSBSBSBSBsBsBSBsBsBSBsBSBSBSBSBSAwAwBSCPCV________________ __BdBdBdAwBSBsBSBsBsBsBSBsBSBSBSBSBSAwAwAwCPCVCmCVCPCP__________ __BkBdAwAwAwBSBsBsBsBSBsBSBSBSBSAwAwAwAwCPCVBJAjCVCPCPCVCV______ BnCJAwAjBJAwAwBsBsBSBsBSBSBSBSAwAwAwCPCPCVAlCVCVCPAeCPCVCVCm____ BkAwBdBdBdAYAwAwBSBsBSBSBSBSAwAwCPCPCPBJCmCmCVCPAeCPBJCVAlCmCm__ BkAwBkBkAwAYAwAwBsBSBSBSBSAwAwCPCPCVBDAlCmBDCVCPCPCVCVCVCmBDCm__ CPAwBkAwAYBdAwAYBSBSBSAwAwAwCPCPBJAlCmCmAjCVCPAeAeAlCVCmAjCmCm__ CPAwCPAwBdBdAYAYBSBSAwAwAwCPCPCVCmCmBJCmCVCVAeCPCVCVCVBJCmCm_A__ __CPAwBkAwBdAYBdBSAwAwAwCPCPCVAjCmAjCVCVCVCPCPAeCVCVCmAlBDCm_A__ _ACPAwCPAwAwBdBkAwAwAwCPCPCVBJCmBJCVCVCVAeCPAeCVCVBDCmCmCmCm_A__ _ACPCPAwCPCPBkCPAwAwCPCPCVAlCmAlCVCVCPAeCPCVAlCVCVCmAlBDCm_A____ _A_ACPCPAwCPCPAwAwCPCPCVCmBDBDCVCVCVCPCPCPAeCVCVCmBJCmCmCm_A____ ___A_ACPCPAwAwAwCPCPCVBJAlCmCVAlCVCPCPAeCVCVCVCmAjCmCmCm_A_A____ _____A_ACPCVCVCVCVCVCmAjCVAjCVCVCPAeCPCVCVCVCmBJCmAlCmCm_A______ _______A_ACVCVCmCmCmBJCVBJCVCPCPCPCPAeAeCVCVCmAlCoCmCmCm_A______ ___________ACmCmCmAjCVAlCVAlCPCPCPAeCVCVCVCmCmCmCmBJCm_A_A______ _____________ACmCVCVCVCVCPCPCPCPAeCVAeCVCmCmCmCmAjCmCm_A________ _______________A_ACVCVCPCPCPCPAeCVCVCVCmCmCmAjBJCmCmCm_A________ _________________A_A_A_ACPCPCPCPCVAeCVCmCmBJCmCmCmCmCm_A________ _____________________A_A_A_A_ACVCVCVCmCmCmCmAlCmCmCm_A__________ _________________________A_A_A_A_ACVCmCmCmBDCmBJCmCm_A__________ _____________________________A_A_A_ACmCmBDAlCmCmCmCm_A__________ _________________________________A_A_A_ACVCmCmCmCm_A____________ _____________________________________A_A_A_ACVCVCV_A____________ ___________________________________________A_A_A_A______________ ________________________________________________________________ } # tile 299 (XIXAXA XOXAXA XUXAXA) { ________________________________BSBSBS__________________________ ____________________________BSBSBSBSBsBs________________________ ________________________BSBSBSBsBsBsBsBSBs______________________ __________________BSBSBSBSBsBsBsBsBSBsBSBS______________________ ____________BSBSBSBSBSBsBsBsBsBSBsBSBSBSBSBS____________________ ________BSBSBSBSBSBsBsBsBsBSBsBsBSBSBSBSBSBS____________________ ____BSBSBSBSBSBsBsBSBsBsBSBsBSBSBSBSBSAwAwBSCPCV________________ __BdBdBdAwBSBsBSBsBsBsBSBsBSBSBSBSBSAwAwAwCPCVCmCVCPCP__________ __BkBdAwAwAwBSBsBsBsBSBsBSBSBSBSAwAwAwAwCPCVBJAjCVCPCPCVCV______ BnCJAwAjBJAwAwBsBsBSBsBSBSBSBSAwAwAwCPCPCVAlCVCVCPAeCPCVCVCm____ BkAwBdBdBdAYAwAwBSBsBSBSBSBSAwAwCPCPCPBJCmCmCVCPAeCPBJCVAlCmCm__ BkAwBkBkAwAYAwAwBsBSBSBSBSAwAwCPCPCVBDAlCmBDCVCPCPCVCVCVCmBDCm__ CPAwBkAwAYBdAwAYBSBSBSAwAwAwCPCPBJAlCmCmAjCVCPAeAeAlCVCmAjCmCm__ CPAwCPAwBdBdAYAYBSBSAwAwAwCPCPCVCmCmBJCmCVCVAeCPCVCVCVBJCmCm_A__ __CPAwBkAwBdAYBdBSAwAwAwCPCPCVAjCmAjCVCVCVCPCPAeCVCVCmAlBDCm_A__ _ACPAwCPAwAwBdBkAwAwAwCPCPCVBJCmBJCVCVCVAeCPAeCVCVBDCmCmCmCm_A__ _ACPCPAwCPCPBkCPAwAwCPCPCVAlCmAlCVCVCPAeCPCVAlCVCVCmAlBDCm_A____ _A_ACPCPAwCPCPAwAwCPCPCVCmBDBDCVCVCVCPCPCPAeCVCVCmBJCmCmCm_A____ ___A_ACPCPAwAwAwCPCPCVBJAlCmCVAlCVCPCPAeCVCVCVCmAjCmCmCm_A_A____ _____A_ACPCVCVCVCVCVCmAjCVAjCVCVCPAeCPCVCVCVCmBJCmAlCmCm_A______ _______A_ACVCVCmCmCmBJCVBJCVCPCPCPCPAeAeCVCVCmAlCoCmCmCm_A______ ___________ACmCmCmAjCVAlCVAlCPCPCPAeCVCVCVCmCmCmCmBJCm_A_A______ _____________ACmCVCVCVCVCPCPCPCPAeCVAeCVCmCmCmCmAjCmCm_A________ _______________A_ACVCVCPCPCPCPAeCVCVCVCmCmCmAjBJCmCmCm_A________ _________________A_A_A_ACPCPCPCPCVAeCVCmCmBJCmCmCmCmCm_A________ _____________________A_A_A_A_ACVCVCVCmCmCmCmAlCmCmCm_A__________ _________________________A_A_A_A_ACVCmCmCmBDCmBJCmCm_A__________ _____________________________A_A_A_ACmCmBDAlCmCmCmCm_A__________ _________________________________A_A_A_ACVCmCmCmCm_A____________ _____________________________________A_A_A_ACVCVCV_A____________ ___________________________________________A_A_A_A______________ ________________________________________________________________ } # tile 300 (PRATYAVAYAH) { ________________________________BSBSBS__________________________ ____________________________BSBSBSBSBsBs________________________ ________________________BSBSBSBsBsBsBsBSBs______________________ __________________BSBSBSBSBsBsBsBsBSBsBSBS______________________ ____________BSBSBSBSBSBsBsBsBsBSBsBSBSBSBSBS____________________ ________BSBSBSBSBSBsBsBsBsBSBsBsBSBSBSBSBSBS____________________ ____BSBSBSBSBSBsBsBSBsBsBSBsBSBSBSBSBSAwAwBSCPCV________________ __BdBdBdAwBSBsBSBsBsBsBSBsBSBSBSBSBSAwAwAwCPCVCmCVCPCP__________ __BkBdAwAwAwBSBsBsBsBSBsBSBSBSBSAwAwAwAwCPCVBJAjCVCPCPCVCV______ BnCJAwAjBJAwAwBsBsBSBsBSBSBSBSAwAwAwCPCPCVAlCVCVCPAeCPCVCVCm____ BkAwBdBdBdAYAwAwBSBsBSBSBSBSAwAwCPCPCPBJCmCmCVCPAeCPBJCVAlCmCm__ BkAwBkBkAwAYAwAwBsBSBSBSBSAwAwCPCPCVBDAlCmBDCVCPCPCVCVCVCmBDCm__ CPAwBkAwAYBdAwAYBSBSBSAwAwAwCPCPBJAlCmCmAjCVCPAeAeAlCVCmAjCmCm__ CPAwCPAwBdBdAYAYBSBSAwAwAwCPCPCVCmCmBJCmCVCVAeCPCVCVCVBJCmCm_A__ __CPAwBkAwBdAYBdBSAwAwAwCPCPCVAjCmAjCVCVCVCPCPAeCVCVCmAlBDCm_A__ _ACPAwCPAwAwBdBkAwAwAwCPCPCVBJCmBJCVCVCVAeCPAeCVCVBDCmCmCmCm_A__ _ACPCPAwCPCPBkCPAwAwCPCPCVAlCmAlCVCVCPAeCPCVAlCVCVCmAlBDCm_A____ _A_ACPCPAwCPCPAwAwCPCPCVCmBDBDCVCVCVCPCPCPAeCVCVCmBJCmCmCm_A____ ___A_ACPCPAwAwAwCPCPCVBJAlCmCVAlCVCPCPAeCVCVCVCmAjCmCmCm_A_A____ _____A_ACPCVCVCVCVCVCmAjCVAjCVCVCPAeCPCVCVCVCmBJCmAlCmCm_A______ _______A_ACVCVCmCmCmBJCVBJCVCPCPCPCPAeAeCVCVCmAlCoCmCmCm_A______ ___________ACmCmCmAjCVAlCVAlCPCPCPAeCVCVCVCmCmCmCmBJCm_A_A______ _____________ACmCVCVCVCVCPCPCPCPAeCVAeCVCmCmCmCmAjCmCm_A________ _______________A_ACVCVCPCPCPCPAeCVCVCVCmCmCmAjBJCmCmCm_A________ _________________A_A_A_ACPCPCPCPCVAeCVCmCmBJCmCmCmCmCm_A________ _____________________A_A_A_A_ACVCVCVCmCmCmCmAlCmCmCm_A__________ _________________________A_A_A_A_ACVCmCmCmBDCmBJCmCm_A__________ _____________________________A_A_A_ACmCmBDAlCmCmCmCm_A__________ _________________________________A_A_A_ACVCmCmCmCm_A____________ _____________________________________A_A_A_ACVCVCV_A____________ ___________________________________________A_A_A_A______________ ________________________________________________________________ } # tile 301 (DAIYEN FOOELS) { ________________________________BSBSBS__________________________ ____________________________BSBSBSBSBsBs________________________ ________________________BSBSBSBsBsBsBsBSBs______________________ __________________BSBSBSBSBsBsBsBsBSBsBSBS______________________ ____________BSBSBSBSBSBsBsBsBsBSBsBSBSBSBSBS____________________ ________BSBSBSBSBSBsBsBsBsBSBsBsBSBSBSBSBSBS____________________ ____BSBSBSBSBSBsBsBSBsBsBSBsBSBSBSBSBSAwAwBSCPCV________________ __BdBdBdAwBSBsBSBsBsBsBSBsBSBSBSBSBSAwAwAwCPCVCmCVCPCP__________ __BkBdAwAwAwBSBsBsBsBSBsBSBSBSBSAwAwAwAwCPCVBJAjCVCPCPCVCV______ BnCJAwAjBJAwAwBsBsBSBsBSBSBSBSAwAwAwCPCPCVAlCVCVCPAeCPCVCVCm____ BkAwBdBdBdAYAwAwBSBsBSBSBSBSAwAwCPCPCPBJCmCmCVCPAeCPBJCVAlCmCm__ BkAwBkBkAwAYAwAwBsBSBSBSBSAwAwCPCPCVBDAlCmBDCVCPCPCVCVCVCmBDCm__ CPAwBkAwAYBdAwAYBSBSBSAwAwAwCPCPBJAlCmCmAjCVCPAeAeAlCVCmAjCmCm__ CPAwCPAwBdBdAYAYBSBSAwAwAwCPCPCVCmCmBJCmCVCVAeCPCVCVCVBJCmCm_A__ __CPAwBkAwBdAYBdBSAwAwAwCPCPCVAjCmAjCVCVCVCPCPAeCVCVCmAlBDCm_A__ _ACPAwCPAwAwBdBkAwAwAwCPCPCVBJCmBJCVCVCVAeCPAeCVCVBDCmCmCmCm_A__ _ACPCPAwCPCPBkCPAwAwCPCPCVAlCmAlCVCVCPAeCPCVAlCVCVCmAlBDCm_A____ _A_ACPCPAwCPCPAwAwCPCPCVCmBDBDCVCVCVCPCPCPAeCVCVCmBJCmCmCm_A____ ___A_ACPCPAwAwAwCPCPCVBJAlCmCVAlCVCPCPAeCVCVCVCmAjCmCmCm_A_A____ _____A_ACPCVCVCVCVCVCmAjCVAjCVCVCPAeCPCVCVCVCmBJCmAlCmCm_A______ _______A_ACVCVCmCmCmBJCVBJCVCPCPCPCPAeAeCVCVCmAlCoCmCmCm_A______ ___________ACmCmCmAjCVAlCVAlCPCPCPAeCVCVCVCmCmCmCmBJCm_A_A______ _____________ACmCVCVCVCVCPCPCPCPAeCVAeCVCmCmCmCmAjCmCm_A________ _______________A_ACVCVCPCPCPCPAeCVCVCVCmCmCmAjBJCmCmCm_A________ _________________A_A_A_ACPCPCPCPCVAeCVCmCmBJCmCmCmCmCm_A________ _____________________A_A_A_A_ACVCVCVCmCmCmCmAlCmCmCm_A__________ _________________________A_A_A_A_ACVCmCmCmBDCmBJCmCm_A__________ _____________________________A_A_A_ACmCmBDAlCmCmCmCm_A__________ _________________________________A_A_A_ACVCmCmCmCm_A____________ _____________________________________A_A_A_ACVCVCV_A____________ ___________________________________________A_A_A_A______________ ________________________________________________________________ } # tile 302 (LEP GEX VEN ZEA) { ________________________________BSBSBS__________________________ ____________________________BSBSBSBSBsBs________________________ ________________________BSBSBSBsBsBsBsBSBs______________________ __________________BSBSBSBSBsBsBsBsBSBsBSBS______________________ ____________BSBSBSBSBSBsBsBsBsBSBsBSBSBSBSBS____________________ ________BSBSBSBSBSBsBsBsBsBSBsBsBSBSBSBSBSBS____________________ ____BSBSBSBSBSBsBsBSBsBsBSBsBSBSBSBSBSAwAwBSCPCV________________ __BdBdBdAwBSBsBSBsBsBsBSBsBSBSBSBSBSAwAwAwCPCVCmCVCPCP__________ __BkBdAwAwAwBSBsBsBsBSBsBSBSBSBSAwAwAwAwCPCVBJAjCVCPCPCVCV______ BnCJAwAjBJAwAwBsBsBSBsBSBSBSBSAwAwAwCPCPCVAlCVCVCPAeCPCVCVCm____ BkAwBdBdBdAYAwAwBSBsBSBSBSBSAwAwCPCPCPBJCmCmCVCPAeCPBJCVAlCmCm__ BkAwBkBkAwAYAwAwBsBSBSBSBSAwAwCPCPCVBDAlCmBDCVCPCPCVCVCVCmBDCm__ CPAwBkAwAYBdAwAYBSBSBSAwAwAwCPCPBJAlCmCmAjCVCPAeAeAlCVCmAjCmCm__ CPAwCPAwBdBdAYAYBSBSAwAwAwCPCPCVCmCmBJCmCVCVAeCPCVCVCVBJCmCm_A__ __CPAwBkAwBdAYBdBSAwAwAwCPCPCVAjCmAjCVCVCVCPCPAeCVCVCmAlBDCm_A__ _ACPAwCPAwAwBdBkAwAwAwCPCPCVBJCmBJCVCVCVAeCPAeCVCVBDCmCmCmCm_A__ _ACPCPAwCPCPBkCPAwAwCPCPCVAlCmAlCVCVCPAeCPCVAlCVCVCmAlBDCm_A____ _A_ACPCPAwCPCPAwAwCPCPCVCmBDBDCVCVCVCPCPCPAeCVCVCmBJCmCmCm_A____ ___A_ACPCPAwAwAwCPCPCVBJAlCmCVAlCVCPCPAeCVCVCVCmAjCmCmCm_A_A____ _____A_ACPCVCVCVCVCVCmAjCVAjCVCVCPAeCPCVCVCVCmBJCmAlCmCm_A______ _______A_ACVCVCmCmCmBJCVBJCVCPCPCPCPAeAeCVCVCmAlCoCmCmCm_A______ ___________ACmCmCmAjCVAlCVAlCPCPCPAeCVCVCVCmCmCmCmBJCm_A_A______ _____________ACmCVCVCVCVCPCPCPCPAeCVAeCVCmCmCmCmAjCmCm_A________ _______________A_ACVCVCPCPCPCPAeCVCVCVCmCmCmAjBJCmCmCm_A________ _________________A_A_A_ACPCPCPCPCVAeCVCmCmBJCmCmCmCmCm_A________ _____________________A_A_A_A_ACVCVCVCmCmCmCmAlCmCmCm_A__________ _________________________A_A_A_A_ACVCmCmCmBDCmBJCmCm_A__________ _____________________________A_A_A_ACmCmBDAlCmCmCmCm_A__________ _________________________________A_A_A_ACVCmCmCmCm_A____________ _____________________________________A_A_A_ACVCVCV_A____________ ___________________________________________A_A_A_A______________ ________________________________________________________________ } # tile 303 (PRIRUTSENIE) { ________________________________BSBSBS__________________________ ____________________________BSBSBSBSBsBs________________________ ________________________BSBSBSBsBsBsBsBSBs______________________ __________________BSBSBSBSBsBsBsBsBSBsBSBS______________________ ____________BSBSBSBSBSBsBsBsBsBSBsBSBSBSBSBS____________________ ________BSBSBSBSBSBsBsBsBsBSBsBsBSBSBSBSBSBS____________________ ____BSBSBSBSBSBsBsBSBsBsBSBsBSBSBSBSBSAwAwBSCPCV________________ __BdBdBdAwBSBsBSBsBsBsBSBsBSBSBSBSBSAwAwAwCPCVCmCVCPCP__________ __BkBdAwAwAwBSBsBsBsBSBsBSBSBSBSAwAwAwAwCPCVBJAjCVCPCPCVCV______ BnCJAwAjBJAwAwBsBsBSBsBSBSBSBSAwAwAwCPCPCVAlCVCVCPAeCPCVCVCm____ BkAwBdBdBdAYAwAwBSBsBSBSBSBSAwAwCPCPCPBJCmCmCVCPAeCPBJCVAlCmCm__ BkAwBkBkAwAYAwAwBsBSBSBSBSAwAwCPCPCVBDAlCmBDCVCPCPCVCVCVCmBDCm__ CPAwBkAwAYBdAwAYBSBSBSAwAwAwCPCPBJAlCmCmAjCVCPAeAeAlCVCmAjCmCm__ CPAwCPAwBdBdAYAYBSBSAwAwAwCPCPCVCmCmBJCmCVCVAeCPCVCVCVBJCmCm_A__ __CPAwBkAwBdAYBdBSAwAwAwCPCPCVAjCmAjCVCVCVCPCPAeCVCVCmAlBDCm_A__ _ACPAwCPAwAwBdBkAwAwAwCPCPCVBJCmBJCVCVCVAeCPAeCVCVBDCmCmCmCm_A__ _ACPCPAwCPCPBkCPAwAwCPCPCVAlCmAlCVCVCPAeCPCVAlCVCVCmAlBDCm_A____ _A_ACPCPAwCPCPAwAwCPCPCVCmBDBDCVCVCVCPCPCPAeCVCVCmBJCmCmCm_A____ ___A_ACPCPAwAwAwCPCPCVBJAlCmCVAlCVCPCPAeCVCVCVCmAjCmCmCm_A_A____ _____A_ACPCVCVCVCVCVCmAjCVAjCVCVCPAeCPCVCVCVCmBJCmAlCmCm_A______ _______A_ACVCVCmCmCmBJCVBJCVCPCPCPCPAeAeCVCVCmAlCoCmCmCm_A______ ___________ACmCmCmAjCVAlCVAlCPCPCPAeCVCVCVCmCmCmCmBJCm_A_A______ _____________ACmCVCVCVCVCPCPCPCPAeCVAeCVCmCmCmCmAjCmCm_A________ _______________A_ACVCVCPCPCPCPAeCVCVCVCmCmCmAjBJCmCmCm_A________ _________________A_A_A_ACPCPCPCPCVAeCVCmCmBJCmCmCmCmCm_A________ _____________________A_A_A_A_ACVCVCVCmCmCmCmAlCmCmCm_A__________ _________________________A_A_A_A_ACVCmCmCmBDCmBJCmCm_A__________ _____________________________A_A_A_ACmCmBDAlCmCmCmCm_A__________ _________________________________A_A_A_ACVCmCmCmCm_A____________ _____________________________________A_A_A_ACVCVCV_A____________ ___________________________________________A_A_A_A______________ ________________________________________________________________ } # tile 304 (ELBIB YLOH) { ________________________________BSBSBS__________________________ ____________________________BSBSBSBSBsBs________________________ ________________________BSBSBSBsBsBsBsBSBs______________________ __________________BSBSBSBSBsBsBsBsBSBsBSBS______________________ ____________BSBSBSBSBSBsBsBsBsBSBsBSBSBSBSBS____________________ ________BSBSBSBSBSBsBsBsBsBSBsBsBSBSBSBSBSBS____________________ ____BSBSBSBSBSBsBsBSBsBsBSBsBSBSBSBSBSAwAwBSCPCV________________ __BdBdBdAwBSBsBSBsBsBsBSBsBSBSBSBSBSAwAwAwCPCVCmCVCPCP__________ __BkBdAwAwAwBSBsBsBsBSBsBSBSBSBSAwAwAwAwCPCVBJAjCVCPCPCVCV______ BnCJAwAjBJAwAwBsBsBSBsBSBSBSBSAwAwAwCPCPCVAlCVCVCPAeCPCVCVCm____ BkAwBdBdBdAYAwAwBSBsBSBSBSBSAwAwCPCPCPBJCmCmCVCPAeCPBJCVAlCmCm__ BkAwBkBkAwAYAwAwBsBSBSBSBSAwAwCPCPCVBDAlCmBDCVCPCPCVCVCVCmBDCm__ CPAwBkAwAYBdAwAYBSBSBSAwAwAwCPCPBJAlCmCmAjCVCPAeAeAlCVCmAjCmCm__ CPAwCPAwBdBdAYAYBSBSAwAwAwCPCPCVCmCmBJCmCVCVAeCPCVCVCVBJCmCm_A__ __CPAwBkAwBdAYBdBSAwAwAwCPCPCVAjCmAjCVCVCVCPCPAeCVCVCmAlBDCm_A__ _ACPAwCPAwAwBdBkAwAwAwCPCPCVBJCmBJCVCVCVAeCPAeCVCVBDCmCmCmCm_A__ _ACPCPAwCPCPBkCPAwAwCPCPCVAlCmAlCVCVCPAeCPCVAlCVCVCmAlBDCm_A____ _A_ACPCPAwCPCPAwAwCPCPCVCmBDBDCVCVCVCPCPCPAeCVCVCmBJCmCmCm_A____ ___A_ACPCPAwAwAwCPCPCVBJAlCmCVAlCVCPCPAeCVCVCVCmAjCmCmCm_A_A____ _____A_ACPCVCVCVCVCVCmAjCVAjCVCVCPAeCPCVCVCVCmBJCmAlCmCm_A______ _______A_ACVCVCmCmCmBJCVBJCVCPCPCPCPAeAeCVCVCmAlCoCmCmCm_A______ ___________ACmCmCmAjCVAlCVAlCPCPCPAeCVCVCVCmCmCmCmBJCm_A_A______ _____________ACmCVCVCVCVCPCPCPCPAeCVAeCVCmCmCmCmAjCmCm_A________ _______________A_ACVCVCPCPCPCPAeCVCVCVCmCmCmAjBJCmCmCm_A________ _________________A_A_A_ACPCPCPCPCVAeCVCmCmBJCmCmCmCmCm_A________ _____________________A_A_A_A_ACVCVCVCmCmCmCmAlCmCmCm_A__________ _________________________A_A_A_A_ACVCmCmCmBDCmBJCmCm_A__________ _____________________________A_A_A_ACmCmBDAlCmCmCmCm_A__________ _________________________________A_A_A_ACVCmCmCmCm_A____________ _____________________________________A_A_A_ACVCVCV_A____________ ___________________________________________A_A_A_A______________ ________________________________________________________________ } # tile 305 (VERR YED HORRE) { ________________________________BSBSBS__________________________ ____________________________BSBSBSBSBsBs________________________ ________________________BSBSBSBsBsBsBsBSBs______________________ __________________BSBSBSBSBsBsBsBsBSBsBSBS______________________ ____________BSBSBSBSBSBsBsBsBsBSBsBSBSBSBSBS____________________ ________BSBSBSBSBSBsBsBsBsBSBsBsBSBSBSBSBSBS____________________ ____BSBSBSBSBSBsBsBSBsBsBSBsBSBSBSBSBSAwAwBSCPCV________________ __BdBdBdAwBSBsBSBsBsBsBSBsBSBSBSBSBSAwAwAwCPCVCmCVCPCP__________ __BkBdAwAwAwBSBsBsBsBSBsBSBSBSBSAwAwAwAwCPCVBJAjCVCPCPCVCV______ BnCJAwAjBJAwAwBsBsBSBsBSBSBSBSAwAwAwCPCPCVAlCVCVCPAeCPCVCVCm____ BkAwBdBdBdAYAwAwBSBsBSBSBSBSAwAwCPCPCPBJCmCmCVCPAeCPBJCVAlCmCm__ BkAwBkBkAwAYAwAwBsBSBSBSBSAwAwCPCPCVBDAlCmBDCVCPCPCVCVCVCmBDCm__ CPAwBkAwAYBdAwAYBSBSBSAwAwAwCPCPBJAlCmCmAjCVCPAeAeAlCVCmAjCmCm__ CPAwCPAwBdBdAYAYBSBSAwAwAwCPCPCVCmCmBJCmCVCVAeCPCVCVCVBJCmCm_A__ __CPAwBkAwBdAYBdBSAwAwAwCPCPCVAjCmAjCVCVCVCPCPAeCVCVCmAlBDCm_A__ _ACPAwCPAwAwBdBkAwAwAwCPCPCVBJCmBJCVCVCVAeCPAeCVCVBDCmCmCmCm_A__ _ACPCPAwCPCPBkCPAwAwCPCPCVAlCmAlCVCVCPAeCPCVAlCVCVCmAlBDCm_A____ _A_ACPCPAwCPCPAwAwCPCPCVCmBDBDCVCVCVCPCPCPAeCVCVCmBJCmCmCm_A____ ___A_ACPCPAwAwAwCPCPCVBJAlCmCVAlCVCPCPAeCVCVCVCmAjCmCmCm_A_A____ _____A_ACPCVCVCVCVCVCmAjCVAjCVCVCPAeCPCVCVCVCmBJCmAlCmCm_A______ _______A_ACVCVCmCmCmBJCVBJCVCPCPCPCPAeAeCVCVCmAlCoCmCmCm_A______ ___________ACmCmCmAjCVAlCVAlCPCPCPAeCVCVCVCmCmCmCmBJCm_A_A______ _____________ACmCVCVCVCVCPCPCPCPAeCVAeCVCmCmCmCmAjCmCm_A________ _______________A_ACVCVCPCPCPCPAeCVCVCVCmCmCmAjBJCmCmCm_A________ _________________A_A_A_ACPCPCPCPCVAeCVCmCmBJCmCmCmCmCm_A________ _____________________A_A_A_A_ACVCVCVCmCmCmCmAlCmCmCm_A__________ _________________________A_A_A_A_ACVCmCmCmBDCmBJCmCm_A__________ _____________________________A_A_A_ACmCmBDAlCmCmCmCm_A__________ _________________________________A_A_A_ACVCmCmCmCm_A____________ _____________________________________A_A_A_ACVCVCV_A____________ ___________________________________________A_A_A_A______________ ________________________________________________________________ } # tile 306 (VENZAR BORGAVVE) { ________________________________BSBSBS__________________________ ____________________________BSBSBSBSBsBs________________________ ________________________BSBSBSBsBsBsBsBSBs______________________ __________________BSBSBSBSBsBsBsBsBSBsBSBS______________________ ____________BSBSBSBSBSBsBsBsBsBSBsBSBSBSBSBS____________________ ________BSBSBSBSBSBsBsBsBsBSBsBsBSBSBSBSBSBS____________________ ____BSBSBSBSBSBsBsBSBsBsBSBsBSBSBSBSBSAwAwBSCPCV________________ __BdBdBdAwBSBsBSBsBsBsBSBsBSBSBSBSBSAwAwAwCPCVCmCVCPCP__________ __BkBdAwAwAwBSBsBsBsBSBsBSBSBSBSAwAwAwAwCPCVBJAjCVCPCPCVCV______ BnCJAwAjBJAwAwBsBsBSBsBSBSBSBSAwAwAwCPCPCVAlCVCVCPAeCPCVCVCm____ BkAwBdBdBdAYAwAwBSBsBSBSBSBSAwAwCPCPCPBJCmCmCVCPAeCPBJCVAlCmCm__ BkAwBkBkAwAYAwAwBsBSBSBSBSAwAwCPCPCVBDAlCmBDCVCPCPCVCVCVCmBDCm__ CPAwBkAwAYBdAwAYBSBSBSAwAwAwCPCPBJAlCmCmAjCVCPAeAeAlCVCmAjCmCm__ CPAwCPAwBdBdAYAYBSBSAwAwAwCPCPCVCmCmBJCmCVCVAeCPCVCVCVBJCmCm_A__ __CPAwBkAwBdAYBdBSAwAwAwCPCPCVAjCmAjCVCVCVCPCPAeCVCVCmAlBDCm_A__ _ACPAwCPAwAwBdBkAwAwAwCPCPCVBJCmBJCVCVCVAeCPAeCVCVBDCmCmCmCm_A__ _ACPCPAwCPCPBkCPAwAwCPCPCVAlCmAlCVCVCPAeCPCVAlCVCVCmAlBDCm_A____ _A_ACPCPAwCPCPAwAwCPCPCVCmBDBDCVCVCVCPCPCPAeCVCVCmBJCmCmCm_A____ ___A_ACPCPAwAwAwCPCPCVBJAlCmCVAlCVCPCPAeCVCVCVCmAjCmCmCm_A_A____ _____A_ACPCVCVCVCVCVCmAjCVAjCVCVCPAeCPCVCVCVCmBJCmAlCmCm_A______ _______A_ACVCVCmCmCmBJCVBJCVCPCPCPCPAeAeCVCVCmAlCoCmCmCm_A______ ___________ACmCmCmAjCVAlCVAlCPCPCPAeCVCVCVCmCmCmCmBJCm_A_A______ _____________ACmCVCVCVCVCPCPCPCPAeCVAeCVCmCmCmCmAjCmCm_A________ _______________A_ACVCVCPCPCPCPAeCVCVCVCmCmCmAjBJCmCmCm_A________ _________________A_A_A_ACPCPCPCPCVAeCVCmCmBJCmCmCmCmCm_A________ _____________________A_A_A_A_ACVCVCVCmCmCmCmAlCmCmCm_A__________ _________________________A_A_A_A_ACVCmCmCmBDCmBJCmCm_A__________ _____________________________A_A_A_ACmCmBDAlCmCmCmCm_A__________ _________________________________A_A_A_ACVCmCmCmCm_A____________ _____________________________________A_A_A_ACVCVCV_A____________ ___________________________________________A_A_A_A______________ ________________________________________________________________ } # tile 307 (THARR) { ________________________________BSBSBS__________________________ ____________________________BSBSBSBSBsBs________________________ ________________________BSBSBSBsBsBsBsBSBs______________________ __________________BSBSBSBSBsBsBsBsBSBsBSBS______________________ ____________BSBSBSBSBSBsBsBsBsBSBsBSBSBSBSBS____________________ ________BSBSBSBSBSBsBsBsBsBSBsBsBSBSBSBSBSBS____________________ ____BSBSBSBSBSBsBsBSBsBsBSBsBSBSBSBSBSAwAwBSCPCV________________ __BdBdBdAwBSBsBSBsBsBsBSBsBSBSBSBSBSAwAwAwCPCVCmCVCPCP__________ __BkBdAwAwAwBSBsBsBsBSBsBSBSBSBSAwAwAwAwCPCVBJAjCVCPCPCVCV______ BnCJAwAjBJAwAwBsBsBSBsBSBSBSBSAwAwAwCPCPCVAlCVCVCPAeCPCVCVCm____ BkAwBdBdBdAYAwAwBSBsBSBSBSBSAwAwCPCPCPBJCmCmCVCPAeCPBJCVAlCmCm__ BkAwBkBkAwAYAwAwBsBSBSBSBSAwAwCPCPCVBDAlCmBDCVCPCPCVCVCVCmBDCm__ CPAwBkAwAYBdAwAYBSBSBSAwAwAwCPCPBJAlCmCmAjCVCPAeAeAlCVCmAjCmCm__ CPAwCPAwBdBdAYAYBSBSAwAwAwCPCPCVCmCmBJCmCVCVAeCPCVCVCVBJCmCm_A__ __CPAwBkAwBdAYBdBSAwAwAwCPCPCVAjCmAjCVCVCVCPCPAeCVCVCmAlBDCm_A__ _ACPAwCPAwAwBdBkAwAwAwCPCPCVBJCmBJCVCVCVAeCPAeCVCVBDCmCmCmCm_A__ _ACPCPAwCPCPBkCPAwAwCPCPCVAlCmAlCVCVCPAeCPCVAlCVCVCmAlBDCm_A____ _A_ACPCPAwCPCPAwAwCPCPCVCmBDBDCVCVCVCPCPCPAeCVCVCmBJCmCmCm_A____ ___A_ACPCPAwAwAwCPCPCVBJAlCmCVAlCVCPCPAeCVCVCVCmAjCmCmCm_A_A____ _____A_ACPCVCVCVCVCVCmAjCVAjCVCVCPAeCPCVCVCVCmBJCmAlCmCm_A______ _______A_ACVCVCmCmCmBJCVBJCVCPCPCPCPAeAeCVCVCmAlCoCmCmCm_A______ ___________ACmCmCmAjCVAlCVAlCPCPCPAeCVCVCVCmCmCmCmBJCm_A_A______ _____________ACmCVCVCVCVCPCPCPCPAeCVAeCVCmCmCmCmAjCmCm_A________ _______________A_ACVCVCPCPCPCPAeCVCVCVCmCmCmAjBJCmCmCm_A________ _________________A_A_A_ACPCPCPCPCVAeCVCmCmBJCmCmCmCmCm_A________ _____________________A_A_A_A_ACVCVCVCmCmCmCmAlCmCmCm_A__________ _________________________A_A_A_A_ACVCmCmCmBDCmBJCmCm_A__________ _____________________________A_A_A_ACmCmBDAlCmCmCmCm_A__________ _________________________________A_A_A_ACVCmCmCmCm_A____________ _____________________________________A_A_A_ACVCVCV_A____________ ___________________________________________A_A_A_A______________ ________________________________________________________________ } # tile 308 (YUM YUM) { ________________________________BSBSBS__________________________ ____________________________BSBSBSBSBsBs________________________ ________________________BSBSBSBsBsBsBsBSBs______________________ __________________BSBSBSBSBsBsBsBsBSBsBSBS______________________ ____________BSBSBSBSBSBsBsBsBsBSBsBSBSBSBSBS____________________ ________BSBSBSBSBSBsBsBsBsBSBsBsBSBSBSBSBSBS____________________ ____BSBSBSBSBSBsBsBSBsBsBSBsBSBSBSBSBSAwAwBSCPCV________________ __BdBdBdAwBSBsBSBsBsBsBSBsBSBSBSBSBSAwAwAwCPCVCmCVCPCP__________ __BkBdAwAwAwBSBsBsBsBSBsBSBSBSBSAwAwAwAwCPCVBJAjCVCPCPCVCV______ BnCJAwAjBJAwAwBsBsBSBsBSBSBSBSAwAwAwCPCPCVAlCVCVCPAeCPCVCVCm____ BkAwBdBdBdAYAwAwBSBsBSBSBSBSAwAwCPCPCPBJCmCmCVCPAeCPBJCVAlCmCm__ BkAwBkBkAwAYAwAwBsBSBSBSBSAwAwCPCPCVBDAlCmBDCVCPCPCVCVCVCmBDCm__ CPAwBkAwAYBdAwAYBSBSBSAwAwAwCPCPBJAlCmCmAjCVCPAeAeAlCVCmAjCmCm__ CPAwCPAwBdBdAYAYBSBSAwAwAwCPCPCVCmCmBJCmCVCVAeCPCVCVCVBJCmCm_A__ __CPAwBkAwBdAYBdBSAwAwAwCPCPCVAjCmAjCVCVCVCPCPAeCVCVCmAlBDCm_A__ _ACPAwCPAwAwBdBkAwAwAwCPCPCVBJCmBJCVCVCVAeCPAeCVCVBDCmCmCmCm_A__ _ACPCPAwCPCPBkCPAwAwCPCPCVAlCmAlCVCVCPAeCPCVAlCVCVCmAlBDCm_A____ _A_ACPCPAwCPCPAwAwCPCPCVCmBDBDCVCVCVCPCPCPAeCVCVCmBJCmCmCm_A____ ___A_ACPCPAwAwAwCPCPCVBJAlCmCVAlCVCPCPAeCVCVCVCmAjCmCmCm_A_A____ _____A_ACPCVCVCVCVCVCmAjCVAjCVCVCPAeCPCVCVCVCmBJCmAlCmCm_A______ _______A_ACVCVCmCmCmBJCVBJCVCPCPCPCPAeAeCVCVCmAlCoCmCmCm_A______ ___________ACmCmCmAjCVAlCVAlCPCPCPAeCVCVCVCmCmCmCmBJCm_A_A______ _____________ACmCVCVCVCVCPCPCPCPAeCVAeCVCmCmCmCmAjCmCm_A________ _______________A_ACVCVCPCPCPCPAeCVCVCVCmCmCmAjBJCmCmCm_A________ _________________A_A_A_ACPCPCPCPCVAeCVCmCmBJCmCmCmCmCm_A________ _____________________A_A_A_A_ACVCVCVCmCmCmCmAlCmCmCm_A__________ _________________________A_A_A_A_ACVCmCmCmBDCmBJCmCm_A__________ _____________________________A_A_A_ACmCmBDAlCmCmCmCm_A__________ _________________________________A_A_A_ACVCmCmCmCm_A____________ _____________________________________A_A_A_ACVCVCV_A____________ ___________________________________________A_A_A_A______________ ________________________________________________________________ } # tile 309 (KERNOD WEL) { ________________________________BSBSBS__________________________ ____________________________BSBSBSBSBsBs________________________ ________________________BSBSBSBsBsBsBsBSBs______________________ __________________BSBSBSBSBsBsBsBsBSBsBSBS______________________ ____________BSBSBSBSBSBsBsBsBsBSBsBSBSBSBSBS____________________ ________BSBSBSBSBSBsBsBsBsBSBsBsBSBSBSBSBSBS____________________ ____BSBSBSBSBSBsBsBSBsBsBSBsBSBSBSBSBSAwAwBSCPCV________________ __BdBdBdAwBSBsBSBsBsBsBSBsBSBSBSBSBSAwAwAwCPCVCmCVCPCP__________ __BkBdAwAwAwBSBsBsBsBSBsBSBSBSBSAwAwAwAwCPCVBJAjCVCPCPCVCV______ BnCJAwAjBJAwAwBsBsBSBsBSBSBSBSAwAwAwCPCPCVAlCVCVCPAeCPCVCVCm____ BkAwBdBdBdAYAwAwBSBsBSBSBSBSAwAwCPCPCPBJCmCmCVCPAeCPBJCVAlCmCm__ BkAwBkBkAwAYAwAwBsBSBSBSBSAwAwCPCPCVBDAlCmBDCVCPCPCVCVCVCmBDCm__ CPAwBkAwAYBdAwAYBSBSBSAwAwAwCPCPBJAlCmCmAjCVCPAeAeAlCVCmAjCmCm__ CPAwCPAwBdBdAYAYBSBSAwAwAwCPCPCVCmCmBJCmCVCVAeCPCVCVCVBJCmCm_A__ __CPAwBkAwBdAYBdBSAwAwAwCPCPCVAjCmAjCVCVCVCPCPAeCVCVCmAlBDCm_A__ _ACPAwCPAwAwBdBkAwAwAwCPCPCVBJCmBJCVCVCVAeCPAeCVCVBDCmCmCmCm_A__ _ACPCPAwCPCPBkCPAwAwCPCPCVAlCmAlCVCVCPAeCPCVAlCVCVCmAlBDCm_A____ _A_ACPCPAwCPCPAwAwCPCPCVCmBDBDCVCVCVCPCPCPAeCVCVCmBJCmCmCm_A____ ___A_ACPCPAwAwAwCPCPCVBJAlCmCVAlCVCPCPAeCVCVCVCmAjCmCmCm_A_A____ _____A_ACPCVCVCVCVCVCmAjCVAjCVCVCPAeCPCVCVCVCmBJCmAlCmCm_A______ _______A_ACVCVCmCmCmBJCVBJCVCPCPCPCPAeAeCVCVCmAlCoCmCmCm_A______ ___________ACmCmCmAjCVAlCVAlCPCPCPAeCVCVCVCmCmCmCmBJCm_A_A______ _____________ACmCVCVCVCVCPCPCPCPAeCVAeCVCmCmCmCmAjCmCm_A________ _______________A_ACVCVCPCPCPCPAeCVCVCVCmCmCmAjBJCmCmCm_A________ _________________A_A_A_ACPCPCPCPCVAeCVCmCmBJCmCmCmCmCm_A________ _____________________A_A_A_A_ACVCVCVCmCmCmCmAlCmCmCm_A__________ _________________________A_A_A_A_ACVCmCmCmBDCmBJCmCm_A__________ _____________________________A_A_A_ACmCmBDAlCmCmCmCm_A__________ _________________________________A_A_A_ACVCmCmCmCm_A____________ _____________________________________A_A_A_ACVCVCV_A____________ ___________________________________________A_A_A_A______________ ________________________________________________________________ } # tile 310 (ELAM EBOW) { ________________________________BSBSBS__________________________ ____________________________BSBSBSBSBsBs________________________ ________________________BSBSBSBsBsBsBsBSBs______________________ __________________BSBSBSBSBsBsBsBsBSBsBSBS______________________ ____________BSBSBSBSBSBsBsBsBsBSBsBSBSBSBSBS____________________ ________BSBSBSBSBSBsBsBsBsBSBsBsBSBSBSBSBSBS____________________ ____BSBSBSBSBSBsBsBSBsBsBSBsBSBSBSBSBSAwAwBSCPCV________________ __BdBdBdAwBSBsBSBsBsBsBSBsBSBSBSBSBSAwAwAwCPCVCmCVCPCP__________ __BkBdAwAwAwBSBsBsBsBSBsBSBSBSBSAwAwAwAwCPCVBJAjCVCPCPCVCV______ BnCJAwAjBJAwAwBsBsBSBsBSBSBSBSAwAwAwCPCPCVAlCVCVCPAeCPCVCVCm____ BkAwBdBdBdAYAwAwBSBsBSBSBSBSAwAwCPCPCPBJCmCmCVCPAeCPBJCVAlCmCm__ BkAwBkBkAwAYAwAwBsBSBSBSBSAwAwCPCPCVBDAlCmBDCVCPCPCVCVCVCmBDCm__ CPAwBkAwAYBdAwAYBSBSBSAwAwAwCPCPBJAlCmCmAjCVCPAeAeAlCVCmAjCmCm__ CPAwCPAwBdBdAYAYBSBSAwAwAwCPCPCVCmCmBJCmCVCVAeCPCVCVCVBJCmCm_A__ __CPAwBkAwBdAYBdBSAwAwAwCPCPCVAjCmAjCVCVCVCPCPAeCVCVCmAlBDCm_A__ _ACPAwCPAwAwBdBkAwAwAwCPCPCVBJCmBJCVCVCVAeCPAeCVCVBDCmCmCmCm_A__ _ACPCPAwCPCPBkCPAwAwCPCPCVAlCmAlCVCVCPAeCPCVAlCVCVCmAlBDCm_A____ _A_ACPCPAwCPCPAwAwCPCPCVCmBDBDCVCVCVCPCPCPAeCVCVCmBJCmCmCm_A____ ___A_ACPCPAwAwAwCPCPCVBJAlCmCVAlCVCPCPAeCVCVCVCmAjCmCmCm_A_A____ _____A_ACPCVCVCVCVCVCmAjCVAjCVCVCPAeCPCVCVCVCmBJCmAlCmCm_A______ _______A_ACVCVCmCmCmBJCVBJCVCPCPCPCPAeAeCVCVCmAlCoCmCmCm_A______ ___________ACmCmCmAjCVAlCVAlCPCPCPAeCVCVCVCmCmCmCmBJCm_A_A______ _____________ACmCVCVCVCVCPCPCPCPAeCVAeCVCmCmCmCmAjCmCm_A________ _______________A_ACVCVCPCPCPCPAeCVCVCVCmCmCmAjBJCmCmCm_A________ _________________A_A_A_ACPCPCPCPCVAeCVCmCmBJCmCmCmCmCm_A________ _____________________A_A_A_A_ACVCVCVCmCmCmCmAlCmCmCm_A__________ _________________________A_A_A_A_ACVCmCmCmBDCmBJCmCm_A__________ _____________________________A_A_A_ACmCmBDAlCmCmCmCm_A__________ _________________________________A_A_A_ACVCmCmCmCm_A____________ _____________________________________A_A_A_ACVCVCV_A____________ ___________________________________________A_A_A_A______________ ________________________________________________________________ } # tile 311 (DUAM XNAHT) { ________________________________BSBSBS__________________________ ____________________________BSBSBSBSBsBs________________________ ________________________BSBSBSBsBsBsBsBSBs______________________ __________________BSBSBSBSBsBsBsBsBSBsBSBS______________________ ____________BSBSBSBSBSBsBsBsBsBSBsBSBSBSBSBS____________________ ________BSBSBSBSBSBsBsBsBsBSBsBsBSBSBSBSBSBS____________________ ____BSBSBSBSBSBsBsBSBsBsBSBsBSBSBSBSBSAwAwBSCPCV________________ __BdBdBdAwBSBsBSBsBsBsBSBsBSBSBSBSBSAwAwAwCPCVCmCVCPCP__________ __BkBdAwAwAwBSBsBsBsBSBsBSBSBSBSAwAwAwAwCPCVBJAjCVCPCPCVCV______ BnCJAwAjBJAwAwBsBsBSBsBSBSBSBSAwAwAwCPCPCVAlCVCVCPAeCPCVCVCm____ BkAwBdBdBdAYAwAwBSBsBSBSBSBSAwAwCPCPCPBJCmCmCVCPAeCPBJCVAlCmCm__ BkAwBkBkAwAYAwAwBsBSBSBSBSAwAwCPCPCVBDAlCmBDCVCPCPCVCVCVCmBDCm__ CPAwBkAwAYBdAwAYBSBSBSAwAwAwCPCPBJAlCmCmAjCVCPAeAeAlCVCmAjCmCm__ CPAwCPAwBdBdAYAYBSBSAwAwAwCPCPCVCmCmBJCmCVCVAeCPCVCVCVBJCmCm_A__ __CPAwBkAwBdAYBdBSAwAwAwCPCPCVAjCmAjCVCVCVCPCPAeCVCVCmAlBDCm_A__ _ACPAwCPAwAwBdBkAwAwAwCPCPCVBJCmBJCVCVCVAeCPAeCVCVBDCmCmCmCm_A__ _ACPCPAwCPCPBkCPAwAwCPCPCVAlCmAlCVCVCPAeCPCVAlCVCVCmAlBDCm_A____ _A_ACPCPAwCPCPAwAwCPCPCVCmBDBDCVCVCVCPCPCPAeCVCVCmBJCmCmCm_A____ ___A_ACPCPAwAwAwCPCPCVBJAlCmCVAlCVCPCPAeCVCVCVCmAjCmCmCm_A_A____ _____A_ACPCVCVCVCVCVCmAjCVAjCVCVCPAeCPCVCVCVCmBJCmAlCmCm_A______ _______A_ACVCVCmCmCmBJCVBJCVCPCPCPCPAeAeCVCVCmAlCoCmCmCm_A______ ___________ACmCmCmAjCVAlCVAlCPCPCPAeCVCVCVCmCmCmCmBJCm_A_A______ _____________ACmCVCVCVCVCPCPCPCPAeCVAeCVCmCmCmCmAjCmCm_A________ _______________A_ACVCVCPCPCPCPAeCVCVCVCmCmCmAjBJCmCmCm_A________ _________________A_A_A_ACPCPCPCPCVAeCVCmCmBJCmCmCmCmCm_A________ _____________________A_A_A_A_ACVCVCVCmCmCmCmAlCmCmCm_A__________ _________________________A_A_A_A_ACVCmCmCmBDCmBJCmCm_A__________ _____________________________A_A_A_ACmCmBDAlCmCmCmCm_A__________ _________________________________A_A_A_ACVCmCmCmCm_A____________ _____________________________________A_A_A_ACVCVCV_A____________ ___________________________________________A_A_A_A______________ ________________________________________________________________ } # tile 312 (ANDOVA BEGARIN) { ________________________________BSBSBS__________________________ ____________________________BSBSBSBSBsBs________________________ ________________________BSBSBSBsBsBsBsBSBs______________________ __________________BSBSBSBSBsBsBsBsBSBsBSBS______________________ ____________BSBSBSBSBSBsBsBsBsBSBsBSBSBSBSBS____________________ ________BSBSBSBSBSBsBsBsBsBSBsBsBSBSBSBSBSBS____________________ ____BSBSBSBSBSBsBsBSBsBsBSBsBSBSBSBSBSAwAwBSCPCV________________ __BdBdBdAwBSBsBSBsBsBsBSBsBSBSBSBSBSAwAwAwCPCVCmCVCPCP__________ __BkBdAwAwAwBSBsBsBsBSBsBSBSBSBSAwAwAwAwCPCVBJAjCVCPCPCVCV______ BnCJAwAjBJAwAwBsBsBSBsBSBSBSBSAwAwAwCPCPCVAlCVCVCPAeCPCVCVCm____ BkAwBdBdBdAYAwAwBSBsBSBSBSBSAwAwCPCPCPBJCmCmCVCPAeCPBJCVAlCmCm__ BkAwBkBkAwAYAwAwBsBSBSBSBSAwAwCPCPCVBDAlCmBDCVCPCPCVCVCVCmBDCm__ CPAwBkAwAYBdAwAYBSBSBSAwAwAwCPCPBJAlCmCmAjCVCPAeAeAlCVCmAjCmCm__ CPAwCPAwBdBdAYAYBSBSAwAwAwCPCPCVCmCmBJCmCVCVAeCPCVCVCVBJCmCm_A__ __CPAwBkAwBdAYBdBSAwAwAwCPCPCVAjCmAjCVCVCVCPCPAeCVCVCmAlBDCm_A__ _ACPAwCPAwAwBdBkAwAwAwCPCPCVBJCmBJCVCVCVAeCPAeCVCVBDCmCmCmCm_A__ _ACPCPAwCPCPBkCPAwAwCPCPCVAlCmAlCVCVCPAeCPCVAlCVCVCmAlBDCm_A____ _A_ACPCPAwCPCPAwAwCPCPCVCmBDBDCVCVCVCPCPCPAeCVCVCmBJCmCmCm_A____ ___A_ACPCPAwAwAwCPCPCVBJAlCmCVAlCVCPCPAeCVCVCVCmAjCmCmCm_A_A____ _____A_ACPCVCVCVCVCVCmAjCVAjCVCVCPAeCPCVCVCVCmBJCmAlCmCm_A______ _______A_ACVCVCmCmCmBJCVBJCVCPCPCPCPAeAeCVCVCmAlCoCmCmCm_A______ ___________ACmCmCmAjCVAlCVAlCPCPCPAeCVCVCVCmCmCmCmBJCm_A_A______ _____________ACmCVCVCVCVCPCPCPCPAeCVAeCVCmCmCmCmAjCmCm_A________ _______________A_ACVCVCPCPCPCPAeCVCVCVCmCmCmAjBJCmCmCm_A________ _________________A_A_A_ACPCPCPCPCVAeCVCmCmBJCmCmCmCmCm_A________ _____________________A_A_A_A_ACVCVCVCmCmCmCmAlCmCmCm_A__________ _________________________A_A_A_A_ACVCmCmCmBDCmBJCmCm_A__________ _____________________________A_A_A_ACmCmBDAlCmCmCmCm_A__________ _________________________________A_A_A_ACVCmCmCmCm_A____________ _____________________________________A_A_A_ACVCVCV_A____________ ___________________________________________A_A_A_A______________ ________________________________________________________________ } # tile 313 (KIRJE) { ________________________________BSBSBS__________________________ ____________________________BSBSBSBSBsBs________________________ ________________________BSBSBSBsBsBsBsBSBs______________________ __________________BSBSBSBSBsBsBsBsBSBsBSBS______________________ ____________BSBSBSBSBSBsBsBsBsBSBsBSBSBSBSBS____________________ ________BSBSBSBSBSBsBsBsBsBSBsBsBSBSBSBSBSBS____________________ ____BSBSBSBSBSBsBsBSBsBsBSBsBSBSBSBSBSAwAwBSCPCV________________ __BdBdBdAwBSBsBSBsBsBsBSBsBSBSBSBSBSAwAwAwCPCVCmCVCPCP__________ __BkBdAwAwAwBSBsBsBsBSBsBSBSBSBSAwAwAwAwCPCVBJAjCVCPCPCVCV______ BnCJAwAjBJAwAwBsBsBSBsBSBSBSBSAwAwAwCPCPCVAlCVCVCPAeCPCVCVCm____ BkAwBdBdBdAYAwAwBSBsBSBSBSBSAwAwCPCPCPBJCmCmCVCPAeCPBJCVAlCmCm__ BkAwBkBkAwAYAwAwBsBSBSBSBSAwAwCPCPCVBDAlCmBDCVCPCPCVCVCVCmBDCm__ CPAwBkAwAYBdAwAYBSBSBSAwAwAwCPCPBJAlCmCmAjCVCPAeAeAlCVCmAjCmCm__ CPAwCPAwBdBdAYAYBSBSAwAwAwCPCPCVCmCmBJCmCVCVAeCPCVCVCVBJCmCm_A__ __CPAwBkAwBdAYBdBSAwAwAwCPCPCVAjCmAjCVCVCVCPCPAeCVCVCmAlBDCm_A__ _ACPAwCPAwAwBdBkAwAwAwCPCPCVBJCmBJCVCVCVAeCPAeCVCVBDCmCmCmCm_A__ _ACPCPAwCPCPBkCPAwAwCPCPCVAlCmAlCVCVCPAeCPCVAlCVCVCmAlBDCm_A____ _A_ACPCPAwCPCPAwAwCPCPCVCmBDBDCVCVCVCPCPCPAeCVCVCmBJCmCmCm_A____ ___A_ACPCPAwAwAwCPCPCVBJAlCmCVAlCVCPCPAeCVCVCVCmAjCmCmCm_A_A____ _____A_ACPCVCVCVCVCVCmAjCVAjCVCVCPAeCPCVCVCVCmBJCmAlCmCm_A______ _______A_ACVCVCmCmCmBJCVBJCVCPCPCPCPAeAeCVCVCmAlCoCmCmCm_A______ ___________ACmCmCmAjCVAlCVAlCPCPCPAeCVCVCVCmCmCmCmBJCm_A_A______ _____________ACmCVCVCVCVCPCPCPCPAeCVAeCVCmCmCmCmAjCmCm_A________ _______________A_ACVCVCPCPCPCPAeCVCVCVCmCmCmAjBJCmCmCm_A________ _________________A_A_A_ACPCPCPCPCVAeCVCmCmBJCmCmCmCmCm_A________ _____________________A_A_A_A_ACVCVCVCmCmCmCmAlCmCmCm_A__________ _________________________A_A_A_A_ACVCmCmCmBDCmBJCmCm_A__________ _____________________________A_A_A_ACmCmBDAlCmCmCmCm_A__________ _________________________________A_A_A_ACVCmCmCmCm_A____________ _____________________________________A_A_A_ACVCVCV_A____________ ___________________________________________A_A_A_A______________ ________________________________________________________________ } # tile 314 (VE FORBRYDERNE) { ________________________________BSBSBS__________________________ ____________________________BSBSBSBSBsBs________________________ ________________________BSBSBSBsBsBsBsBSBs______________________ __________________BSBSBSBSBsBsBsBsBSBsBSBS______________________ ____________BSBSBSBSBSBsBsBsBsBSBsBSBSBSBSBS____________________ ________BSBSBSBSBSBsBsBsBsBSBsBsBSBSBSBSBSBS____________________ ____BSBSBSBSBSBsBsBSBsBsBSBsBSBSBSBSBSAwAwBSCPCV________________ __BdBdBdAwBSBsBSBsBsBsBSBsBSBSBSBSBSAwAwAwCPCVCmCVCPCP__________ __BkBdAwAwAwBSBsBsBsBSBsBSBSBSBSAwAwAwAwCPCVBJAjCVCPCPCVCV______ BnCJAwAjBJAwAwBsBsBSBsBSBSBSBSAwAwAwCPCPCVAlCVCVCPAeCPCVCVCm____ BkAwBdBdBdAYAwAwBSBsBSBSBSBSAwAwCPCPCPBJCmCmCVCPAeCPBJCVAlCmCm__ BkAwBkBkAwAYAwAwBsBSBSBSBSAwAwCPCPCVBDAlCmBDCVCPCPCVCVCVCmBDCm__ CPAwBkAwAYBdAwAYBSBSBSAwAwAwCPCPBJAlCmCmAjCVCPAeAeAlCVCmAjCmCm__ CPAwCPAwBdBdAYAYBSBSAwAwAwCPCPCVCmCmBJCmCVCVAeCPCVCVCVBJCmCm_A__ __CPAwBkAwBdAYBdBSAwAwAwCPCPCVAjCmAjCVCVCVCPCPAeCVCVCmAlBDCm_A__ _ACPAwCPAwAwBdBkAwAwAwCPCPCVBJCmBJCVCVCVAeCPAeCVCVBDCmCmCmCm_A__ _ACPCPAwCPCPBkCPAwAwCPCPCVAlCmAlCVCVCPAeCPCVAlCVCVCmAlBDCm_A____ _A_ACPCPAwCPCPAwAwCPCPCVCmBDBDCVCVCVCPCPCPAeCVCVCmBJCmCmCm_A____ ___A_ACPCPAwAwAwCPCPCVBJAlCmCVAlCVCPCPAeCVCVCVCmAjCmCmCm_A_A____ _____A_ACPCVCVCVCVCVCmAjCVAjCVCVCPAeCPCVCVCVCmBJCmAlCmCm_A______ _______A_ACVCVCmCmCmBJCVBJCVCPCPCPCPAeAeCVCVCmAlCoCmCmCm_A______ ___________ACmCmCmAjCVAlCVAlCPCPCPAeCVCVCVCmCmCmCmBJCm_A_A______ _____________ACmCVCVCVCVCPCPCPCPAeCVAeCVCmCmCmCmAjCmCm_A________ _______________A_ACVCVCPCPCPCPAeCVCVCVCmCmCmAjBJCmCmCm_A________ _________________A_A_A_ACPCPCPCPCVAeCVCmCmBJCmCmCmCmCm_A________ _____________________A_A_A_A_ACVCVCVCmCmCmCmAlCmCmCm_A__________ _________________________A_A_A_A_ACVCmCmCmBDCmBJCmCm_A__________ _____________________________A_A_A_ACmCmBDAlCmCmCmCm_A__________ _________________________________A_A_A_ACVCmCmCmCm_A____________ _____________________________________A_A_A_ACVCVCV_A____________ ___________________________________________A_A_A_A______________ ________________________________________________________________ } # tile 315 (HACKEM MUCHE) { ________________________________BSBSBS__________________________ ____________________________BSBSBSBSBsBs________________________ ________________________BSBSBSBsBsBsBsBSBs______________________ __________________BSBSBSBSBsBsBsBsBSBsBSBS______________________ ____________BSBSBSBSBSBsBsBsBsBSBsBSBSBSBSBS____________________ ________BSBSBSBSBSBsBsBsBsBSBsBsBSBSBSBSBSBS____________________ ____BSBSBSBSBSBsBsBSBsBsBSBsBSBSBSBSBSAwAwBSCPCV________________ __BdBdBdAwBSBsBSBsBsBsBSBsBSBSBSBSBSAwAwAwCPCVCmCVCPCP__________ __BkBdAwAwAwBSBsBsBsBSBsBSBSBSBSAwAwAwAwCPCVBJAjCVCPCPCVCV______ BnCJAwAjBJAwAwBsBsBSBsBSBSBSBSAwAwAwCPCPCVAlCVCVCPAeCPCVCVCm____ BkAwBdBdBdAYAwAwBSBsBSBSBSBSAwAwCPCPCPBJCmCmCVCPAeCPBJCVAlCmCm__ BkAwBkBkAwAYAwAwBsBSBSBSBSAwAwCPCPCVBDAlCmBDCVCPCPCVCVCVCmBDCm__ CPAwBkAwAYBdAwAYBSBSBSAwAwAwCPCPBJAlCmCmAjCVCPAeAeAlCVCmAjCmCm__ CPAwCPAwBdBdAYAYBSBSAwAwAwCPCPCVCmCmBJCmCVCVAeCPCVCVCVBJCmCm_A__ __CPAwBkAwBdAYBdBSAwAwAwCPCPCVAjCmAjCVCVCVCPCPAeCVCVCmAlBDCm_A__ _ACPAwCPAwAwBdBkAwAwAwCPCPCVBJCmBJCVCVCVAeCPAeCVCVBDCmCmCmCm_A__ _ACPCPAwCPCPBkCPAwAwCPCPCVAlCmAlCVCVCPAeCPCVAlCVCVCmAlBDCm_A____ _A_ACPCPAwCPCPAwAwCPCPCVCmBDBDCVCVCVCPCPCPAeCVCVCmBJCmCmCm_A____ ___A_ACPCPAwAwAwCPCPCVBJAlCmCVAlCVCPCPAeCVCVCVCmAjCmCmCm_A_A____ _____A_ACPCVCVCVCVCVCmAjCVAjCVCVCPAeCPCVCVCVCmBJCmAlCmCm_A______ _______A_ACVCVCmCmCmBJCVBJCVCPCPCPCPAeAeCVCVCmAlCoCmCmCm_A______ ___________ACmCmCmAjCVAlCVAlCPCPCPAeCVCVCVCmCmCmCmBJCm_A_A______ _____________ACmCVCVCVCVCPCPCPCPAeCVAeCVCmCmCmCmAjCmCm_A________ _______________A_ACVCVCPCPCPCPAeCVCVCVCmCmCmAjBJCmCmCm_A________ _________________A_A_A_ACPCPCPCPCVAeCVCmCmBJCmCmCmCmCm_A________ _____________________A_A_A_A_ACVCVCVCmCmCmCmAlCmCmCm_A__________ _________________________A_A_A_A_ACVCmCmCmBDCmBJCmCm_A__________ _____________________________A_A_A_ACmCmBDAlCmCmCmCm_A__________ _________________________________A_A_A_ACVCmCmCmCm_A____________ _____________________________________A_A_A_ACVCVCV_A____________ ___________________________________________A_A_A_A______________ ________________________________________________________________ } # tile 316 (VELOX NEB) { ________________________________BSBSBS__________________________ ____________________________BSBSBSBSBsBs________________________ ________________________BSBSBSBsBsBsBsBSBs______________________ __________________BSBSBSBSBsBsBsBsBSBsBSBS______________________ ____________BSBSBSBSBSBsBsBsBsBSBsBSBSBSBSBS____________________ ________BSBSBSBSBSBsBsBsBsBSBsBsBSBSBSBSBSBS____________________ ____BSBSBSBSBSBsBsBSBsBsBSBsBSBSBSBSBSAwAwBSCPCV________________ __BdBdBdAwBSBsBSBsBsBsBSBsBSBSBSBSBSAwAwAwCPCVCmCVCPCP__________ __BkBdAwAwAwBSBsBsBsBSBsBSBSBSBSAwAwAwAwCPCVBJAjCVCPCPCVCV______ BnCJAwAjBJAwAwBsBsBSBsBSBSBSBSAwAwAwCPCPCVAlCVCVCPAeCPCVCVCm____ BkAwBdBdBdAYAwAwBSBsBSBSBSBSAwAwCPCPCPBJCmCmCVCPAeCPBJCVAlCmCm__ BkAwBkBkAwAYAwAwBsBSBSBSBSAwAwCPCPCVBDAlCmBDCVCPCPCVCVCVCmBDCm__ CPAwBkAwAYBdAwAYBSBSBSAwAwAwCPCPBJAlCmCmAjCVCPAeAeAlCVCmAjCmCm__ CPAwCPAwBdBdAYAYBSBSAwAwAwCPCPCVCmCmBJCmCVCVAeCPCVCVCVBJCmCm_A__ __CPAwBkAwBdAYBdBSAwAwAwCPCPCVAjCmAjCVCVCVCPCPAeCVCVCmAlBDCm_A__ _ACPAwCPAwAwBdBkAwAwAwCPCPCVBJCmBJCVCVCVAeCPAeCVCVBDCmCmCmCm_A__ _ACPCPAwCPCPBkCPAwAwCPCPCVAlCmAlCVCVCPAeCPCVAlCVCVCmAlBDCm_A____ _A_ACPCPAwCPCPAwAwCPCPCVCmBDBDCVCVCVCPCPCPAeCVCVCmBJCmCmCm_A____ ___A_ACPCPAwAwAwCPCPCVBJAlCmCVAlCVCPCPAeCVCVCVCmAjCmCmCm_A_A____ _____A_ACPCVCVCVCVCVCmAjCVAjCVCVCPAeCPCVCVCVCmBJCmAlCmCm_A______ _______A_ACVCVCmCmCmBJCVBJCVCPCPCPCPAeAeCVCVCmAlCoCmCmCm_A______ ___________ACmCmCmAjCVAlCVAlCPCPCPAeCVCVCVCmCmCmCmBJCm_A_A______ _____________ACmCVCVCVCVCPCPCPCPAeCVAeCVCmCmCmCmAjCmCm_A________ _______________A_ACVCVCPCPCPCPAeCVCVCVCmCmCmAjBJCmCmCm_A________ _________________A_A_A_ACPCPCPCPCVAeCVCmCmBJCmCmCmCmCm_A________ _____________________A_A_A_A_ACVCVCVCmCmCmCmAlCmCmCm_A__________ _________________________A_A_A_A_ACVCmCmCmBDCmBJCmCm_A__________ _____________________________A_A_A_ACmCmBDAlCmCmCmCm_A__________ _________________________________A_A_A_ACVCmCmCmCm_A____________ _____________________________________A_A_A_ACVCVCV_A____________ ___________________________________________A_A_A_A______________ ________________________________________________________________ } # tile 317 (FOOBIE BLETCH) { ________________________________BSBSBS__________________________ ____________________________BSBSBSBSBsBs________________________ ________________________BSBSBSBsBsBsBsBSBs______________________ __________________BSBSBSBSBsBsBsBsBSBsBSBS______________________ ____________BSBSBSBSBSBsBsBsBsBSBsBSBSBSBSBS____________________ ________BSBSBSBSBSBsBsBsBsBSBsBsBSBSBSBSBSBS____________________ ____BSBSBSBSBSBsBsBSBsBsBSBsBSBSBSBSBSAwAwBSCPCV________________ __BdBdBdAwBSBsBSBsBsBsBSBsBSBSBSBSBSAwAwAwCPCVCmCVCPCP__________ __BkBdAwAwAwBSBsBsBsBSBsBSBSBSBSAwAwAwAwCPCVBJAjCVCPCPCVCV______ BnCJAwAjBJAwAwBsBsBSBsBSBSBSBSAwAwAwCPCPCVAlCVCVCPAeCPCVCVCm____ BkAwBdBdBdAYAwAwBSBsBSBSBSBSAwAwCPCPCPBJCmCmCVCPAeCPBJCVAlCmCm__ BkAwBkBkAwAYAwAwBsBSBSBSBSAwAwCPCPCVBDAlCmBDCVCPCPCVCVCVCmBDCm__ CPAwBkAwAYBdAwAYBSBSBSAwAwAwCPCPBJAlCmCmAjCVCPAeAeAlCVCmAjCmCm__ CPAwCPAwBdBdAYAYBSBSAwAwAwCPCPCVCmCmBJCmCVCVAeCPCVCVCVBJCmCm_A__ __CPAwBkAwBdAYBdBSAwAwAwCPCPCVAjCmAjCVCVCVCPCPAeCVCVCmAlBDCm_A__ _ACPAwCPAwAwBdBkAwAwAwCPCPCVBJCmBJCVCVCVAeCPAeCVCVBDCmCmCmCm_A__ _ACPCPAwCPCPBkCPAwAwCPCPCVAlCmAlCVCVCPAeCPCVAlCVCVCmAlBDCm_A____ _A_ACPCPAwCPCPAwAwCPCPCVCmBDBDCVCVCVCPCPCPAeCVCVCmBJCmCmCm_A____ ___A_ACPCPAwAwAwCPCPCVBJAlCmCVAlCVCPCPAeCVCVCVCmAjCmCmCm_A_A____ _____A_ACPCVCVCVCVCVCmAjCVAjCVCVCPAeCPCVCVCVCmBJCmAlCmCm_A______ _______A_ACVCVCmCmCmBJCVBJCVCPCPCPCPAeAeCVCVCmAlCoCmCmCm_A______ ___________ACmCmCmAjCVAlCVAlCPCPCPAeCVCVCVCmCmCmCmBJCm_A_A______ _____________ACmCVCVCVCVCPCPCPCPAeCVAeCVCmCmCmCmAjCmCm_A________ _______________A_ACVCVCPCPCPCPAeCVCVCVCmCmCmAjBJCmCmCm_A________ _________________A_A_A_ACPCPCPCPCVAeCVCmCmBJCmCmCmCmCm_A________ _____________________A_A_A_A_ACVCVCVCmCmCmCmAlCmCmCm_A__________ _________________________A_A_A_A_ACVCmCmCmBDCmBJCmCm_A__________ _____________________________A_A_A_ACmCmBDAlCmCmCmCm_A__________ _________________________________A_A_A_ACVCmCmCmCm_A____________ _____________________________________A_A_A_ACVCVCV_A____________ ___________________________________________A_A_A_A______________ ________________________________________________________________ } # tile 318 (TEMOV) { ________________________________BSBSBS__________________________ ____________________________BSBSBSBSBsBs________________________ ________________________BSBSBSBsBsBsBsBSBs______________________ __________________BSBSBSBSBsBsBsBsBSBsBSBS______________________ ____________BSBSBSBSBSBsBsBsBsBSBsBSBSBSBSBS____________________ ________BSBSBSBSBSBsBsBsBsBSBsBsBSBSBSBSBSBS____________________ ____BSBSBSBSBSBsBsBSBsBsBSBsBSBSBSBSBSAwAwBSCPCV________________ __BdBdBdAwBSBsBSBsBsBsBSBsBSBSBSBSBSAwAwAwCPCVCmCVCPCP__________ __BkBdAwAwAwBSBsBsBsBSBsBSBSBSBSAwAwAwAwCPCVBJAjCVCPCPCVCV______ BnCJAwAjBJAwAwBsBsBSBsBSBSBSBSAwAwAwCPCPCVAlCVCVCPAeCPCVCVCm____ BkAwBdBdBdAYAwAwBSBsBSBSBSBSAwAwCPCPCPBJCmCmCVCPAeCPBJCVAlCmCm__ BkAwBkBkAwAYAwAwBsBSBSBSBSAwAwCPCPCVBDAlCmBDCVCPCPCVCVCVCmBDCm__ CPAwBkAwAYBdAwAYBSBSBSAwAwAwCPCPBJAlCmCmAjCVCPAeAeAlCVCmAjCmCm__ CPAwCPAwBdBdAYAYBSBSAwAwAwCPCPCVCmCmBJCmCVCVAeCPCVCVCVBJCmCm_A__ __CPAwBkAwBdAYBdBSAwAwAwCPCPCVAjCmAjCVCVCVCPCPAeCVCVCmAlBDCm_A__ _ACPAwCPAwAwBdBkAwAwAwCPCPCVBJCmBJCVCVCVAeCPAeCVCVBDCmCmCmCm_A__ _ACPCPAwCPCPBkCPAwAwCPCPCVAlCmAlCVCVCPAeCPCVAlCVCVCmAlBDCm_A____ _A_ACPCPAwCPCPAwAwCPCPCVCmBDBDCVCVCVCPCPCPAeCVCVCmBJCmCmCm_A____ ___A_ACPCPAwAwAwCPCPCVBJAlCmCVAlCVCPCPAeCVCVCVCmAjCmCmCm_A_A____ _____A_ACPCVCVCVCVCVCmAjCVAjCVCVCPAeCPCVCVCVCmBJCmAlCmCm_A______ _______A_ACVCVCmCmCmBJCVBJCVCPCPCPCPAeAeCVCVCmAlCoCmCmCm_A______ ___________ACmCmCmAjCVAlCVAlCPCPCPAeCVCVCVCmCmCmCmBJCm_A_A______ _____________ACmCVCVCVCVCPCPCPCPAeCVAeCVCmCmCmCmAjCmCm_A________ _______________A_ACVCVCPCPCPCPAeCVCVCVCmCmCmAjBJCmCmCm_A________ _________________A_A_A_ACPCPCPCPCVAeCVCmCmBJCmCmCmCmCm_A________ _____________________A_A_A_A_ACVCVCVCmCmCmCmAlCmCmCm_A__________ _________________________A_A_A_A_ACVCmCmCmBDCmBJCmCm_A__________ _____________________________A_A_A_ACmCmBDAlCmCmCmCm_A__________ _________________________________A_A_A_ACVCmCmCmCm_A____________ _____________________________________A_A_A_ACVCVCV_A____________ ___________________________________________A_A_A_A______________ ________________________________________________________________ } # tile 319 (GARVEN DEH) { ________________________________BSBSBS__________________________ ____________________________BSBSBSBSBsBs________________________ ________________________BSBSBSBsBsBsBsBSBs______________________ __________________BSBSBSBSBsBsBsBsBSBsBSBS______________________ ____________BSBSBSBSBSBsBsBsBsBSBsBSBSBSBSBS____________________ ________BSBSBSBSBSBsBsBsBsBSBsBsBSBSBSBSBSBS____________________ ____BSBSBSBSBSBsBsBSBsBsBSBsBSBSBSBSBSAwAwBSCPCV________________ __BdBdBdAwBSBsBSBsBsBsBSBsBSBSBSBSBSAwAwAwCPCVCmCVCPCP__________ __BkBdAwAwAwBSBsBsBsBSBsBSBSBSBSAwAwAwAwCPCVBJAjCVCPCPCVCV______ BnCJAwAjBJAwAwBsBsBSBsBSBSBSBSAwAwAwCPCPCVAlCVCVCPAeCPCVCVCm____ BkAwBdBdBdAYAwAwBSBsBSBSBSBSAwAwCPCPCPBJCmCmCVCPAeCPBJCVAlCmCm__ BkAwBkBkAwAYAwAwBsBSBSBSBSAwAwCPCPCVBDAlCmBDCVCPCPCVCVCVCmBDCm__ CPAwBkAwAYBdAwAYBSBSBSAwAwAwCPCPBJAlCmCmAjCVCPAeAeAlCVCmAjCmCm__ CPAwCPAwBdBdAYAYBSBSAwAwAwCPCPCVCmCmBJCmCVCVAeCPCVCVCVBJCmCm_A__ __CPAwBkAwBdAYBdBSAwAwAwCPCPCVAjCmAjCVCVCVCPCPAeCVCVCmAlBDCm_A__ _ACPAwCPAwAwBdBkAwAwAwCPCPCVBJCmBJCVCVCVAeCPAeCVCVBDCmCmCmCm_A__ _ACPCPAwCPCPBkCPAwAwCPCPCVAlCmAlCVCVCPAeCPCVAlCVCVCmAlBDCm_A____ _A_ACPCPAwCPCPAwAwCPCPCVCmBDBDCVCVCVCPCPCPAeCVCVCmBJCmCmCm_A____ ___A_ACPCPAwAwAwCPCPCVBJAlCmCVAlCVCPCPAeCVCVCVCmAjCmCmCm_A_A____ _____A_ACPCVCVCVCVCVCmAjCVAjCVCVCPAeCPCVCVCVCmBJCmAlCmCm_A______ _______A_ACVCVCmCmCmBJCVBJCVCPCPCPCPAeAeCVCVCmAlCoCmCmCm_A______ ___________ACmCmCmAjCVAlCVAlCPCPCPAeCVCVCVCmCmCmCmBJCm_A_A______ _____________ACmCVCVCVCVCPCPCPCPAeCVAeCVCmCmCmCmAjCmCm_A________ _______________A_ACVCVCPCPCPCPAeCVCVCVCmCmCmAjBJCmCmCm_A________ _________________A_A_A_ACPCPCPCPCVAeCVCmCmBJCmCmCmCmCm_A________ _____________________A_A_A_A_ACVCVCVCmCmCmCmAlCmCmCm_A__________ _________________________A_A_A_A_ACVCmCmCmBDCmBJCmCm_A__________ _____________________________A_A_A_ACmCmBDAlCmCmCmCm_A__________ _________________________________A_A_A_ACVCmCmCmCm_A____________ _____________________________________A_A_A_ACVCVCV_A____________ ___________________________________________A_A_A_A______________ ________________________________________________________________ } # tile 320 (READ ME) { ________________________________BSBSBS__________________________ ____________________________BSBSBSBSBsBs________________________ ________________________BSBSBSBsBsBsBsBSBs______________________ __________________BSBSBSBSBsBsBsBsBSBsBSBS______________________ ____________BSBSBSBSBSBsBsBsBsBSBsBSBSBSBSBS____________________ ________BSBSBSBSBSBsBsBsBsBSBsBsBSBSBSBSBSBS____________________ ____BSBSBSBSBSBsBsBSBsBsBSBsBSBSBSBSBSAwAwBSCPCV________________ __BdBdBdAwBSBsBSBsBsBsBSBsBSBSBSBSBSAwAwAwCPCVCmCVCPCP__________ __BkBdAwAwAwBSBsBsBsBSBsBSBSBSBSAwAwAwAwCPCVBJAjCVCPCPCVCV______ BnCJAwAjBJAwAwBsBsBSBsBSBSBSBSAwAwAwCPCPCVAlCVCVCPAeCPCVCVCm____ BkAwBdBdBdAYAwAwBSBsBSBSBSBSAwAwCPCPCPBJCmCmCVCPAeCPBJCVAlCmCm__ BkAwBkBkAwAYAwAwBsBSBSBSBSAwAwCPCPCVBDAlCmBDCVCPCPCVCVCVCmBDCm__ CPAwBkAwAYBdAwAYBSBSBSAwAwAwCPCPBJAlCmCmAjCVCPAeAeAlCVCmAjCmCm__ CPAwCPAwBdBdAYAYBSBSAwAwAwCPCPCVCmCmBJCmCVCVAeCPCVCVCVBJCmCm_A__ __CPAwBkAwBdAYBdBSAwAwAwCPCPCVAjCmAjCVCVCVCPCPAeCVCVCmAlBDCm_A__ _ACPAwCPAwAwBdBkAwAwAwCPCPCVBJCmBJCVCVCVAeCPAeCVCVBDCmCmCmCm_A__ _ACPCPAwCPCPBkCPAwAwCPCPCVAlCmAlCVCVCPAeCPCVAlCVCVCmAlBDCm_A____ _A_ACPCPAwCPCPAwAwCPCPCVCmBDBDCVCVCVCPCPCPAeCVCVCmBJCmCmCm_A____ ___A_ACPCPAwAwAwCPCPCVBJAlCmCVAlCVCPCPAeCVCVCVCmAjCmCmCm_A_A____ _____A_ACPCVCVCVCVCVCmAjCVAjCVCVCPAeCPCVCVCVCmBJCmAlCmCm_A______ _______A_ACVCVCmCmCmBJCVBJCVCPCPCPCPAeAeCVCVCmAlCoCmCmCm_A______ ___________ACmCmCmAjCVAlCVAlCPCPCPAeCVCVCVCmCmCmCmBJCm_A_A______ _____________ACmCVCVCVCVCPCPCPCPAeCVAeCVCmCmCmCmAjCmCm_A________ _______________A_ACVCVCPCPCPCPAeCVCVCVCmCmCmAjBJCmCmCm_A________ _________________A_A_A_ACPCPCPCPCVAeCVCmCmBJCmCmCmCmCm_A________ _____________________A_A_A_A_ACVCVCVCmCmCmCmAlCmCmCm_A__________ _________________________A_A_A_A_ACVCmCmCmBDCmBJCmCm_A__________ _____________________________A_A_A_ACmCmBDAlCmCmCmCm_A__________ _________________________________A_A_A_ACVCmCmCmCm_A____________ _____________________________________A_A_A_ACVCVCV_A____________ ___________________________________________A_A_A_A______________ ________________________________________________________________ } # tile 321 (stamped / mail) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_A_A______ ________C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_A_A______ ________C$C$_K_K_KC$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_A_A______ ________C$C$_K_K_KC$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_A_A______ ________C$C$_K_K_KC$C$C$_A_AC$_A_AC$_AC$C$_A_AC$C$C$C$_A_A______ ________C$C$_K_K_KC$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_A_A______ ________C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_A_A______ ________C$C$C$C$C$C$C$_AC$C$_A_AC$C$_AC$_A_AC$_AC$C$C$_A_A______ ________C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_A_A______ ________C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_A_A______ ________C$C$C$C$C$C$C$_A_AC$C$_A_AC$_AC$_A_A_AC$C$C$C$_A_A______ ________C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_A_A______ ________C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_A_A______ _________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A______ _________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A______ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 322 (unlabeled / blank paper) { ________________________________BSBSBS__________________________ ____________________________BSBSBSBSBsBs________________________ ________________________BSBSBSBsBsBsBsBSBs______________________ __________________BSBSBSBSBsBsBsBsBSBsBSBS______________________ ____________BSBSBSBSBSBsBsBsBsBSBsBSBSBSBSBS____________________ ________BSBSBSBSBSBsBsBsBsBSBsBsBSBSBSBSBSBS____________________ ____BSBSBSBSBSBsBsBSBsBsBSBsBSBSBSBSBSAwAwBSCPCV________________ __BdBdBdAwBSBsBSBsBsBsBSBsBSBSBSBSBSAwAwAwCPCVCmCVCPCP__________ __BkBdAwAwAwBSBsBsBsBSBsBSBSBSBSAwAwAwAwCPCVCmCVCVCPCPCVCV______ BnCJAwAjBJAwAwBsBsBSBsBSBSBSBSAwAwAwCPCPCVCmCVCVCPCPCPCVCVCm____ BkAwBdBdBdAYAwAwBSBsBSBSBSBSAwAwCPCPCPCVCmCmCVCPCPCPCVCVCVCmCm__ BkAwBkBkAwAYAwAwBsBSBSBSBSAwAwCPCPCVCVCmCmCVCVCPCPCVCVCVCmCmCm__ CPAwBkAwAYBdAwAYBSBSBSAwAwAwCPCPCVCVCmCmCmCVCPCPCPCVCVCmCmCmCm__ CPAwCPAwBdBdAYAYBSBSAwAwAwCPCPCVCmCmCmCmCVCVCPCPCVCVCVCmCmCm_A__ __CPAwBkAwBdAYBdBSAwAwAwCPCPCVCmCmCmCVCVCVCPCPCVCVCVCmCmCmCm_A__ _ACPAwCPAwAwBdBkAwAwAwCPCPCVCmCmCmCVCVCVCPCPCVCVCVCVCmCmCmCm_A__ _ACPCPAwCPCPBkCPAwAwCPCPCVCmCmCmCVCVCPCPCPCVCVCVCVCmCmCmCm_A____ _A_ACPCPAwCPCPAwAwCPCPCVCmCmCmCVCVCVCPCPCPCVCVCVCmCmCmCmCm_A____ ___A_ACPCPAwAwAwCPCPCVCmCmCmCVCVCVCPCPCPCVCVCVCmCmCmCmCm_A_A____ _____A_ACPCVCVCVCVCVCmCmCVCVCVCVCPCPCPCVCVCVCmCmCmCmCmCm_A______ _______A_ACVCVCmCmCmCmCVCVCVCPCPCPCPCVCVCVCVCmCmCmCmCmCm_A______ ___________ACmCmCmCmCVCVCVCPCPCPCPCPCVCVCVCmCmCmCmCmCm_A_A______ _____________ACmCVCVCVCVCPCPCPCPCPCVCVCVCmCmCmCmCmCmCm_A________ _______________A_ACVCVCPCPCPCPCPCVCVCVCmCmCmCmCmCmCmCm_A________ _________________A_A_A_ACPCPCPCPCVCVCVCmCmCmCmCmCmCmCm_A________ _____________________A_A_A_A_ACVCVCVCmCmCmCmCmCmCmCm_A__________ _________________________A_A_A_A_ACVCmCmCmCmCmCmCmCm_A__________ _____________________________A_A_A_ACmCmCmCmCmCmCmCm_A__________ _________________________________A_A_A_ACVCmCmCmCm_A____________ _____________________________________A_A_A_ACVCVCV_A____________ ___________________________________________A_A_A_A______________ ________________________________________________________________ } # tile 323 (parchment) { ________________________________________________________________ ______________________________CoCtCl____________________________ ____________________________CtCtCXClClCt________________________ __________________________ClCoCmCtClCoClCoCl____________________ ________________________ClCtClClClCtClClClClCtCX________________ ______________________CtCoClClClCoCXClClClCtClClCoCt____________ ____________________CtCXClCtCoCtClClCtCXCoClCoCtClCtCX__________ __________________ClCXCXCtCoCtClCtCoClClCtClClCtCtCoClCoCt______ ________________CtCoClCtCXClCtCXCtClCtCoClCtCXCXCXCtClCtCXCl____ ______________CoClClCtCXClClClCoClCXClCtCoClClCXCtClCoClCoClCO__ ____________ClClClCtCmClCtCoClClCtCXClCtClClCtCoCtCXClCtClClCO__ __________ClClClCoCtClCoClClClCtClClCoCXCtCoClClCoClClClCICOCO_A ________ClClCtClClClCtClClClCtCmCtCoCtClCtClClClClCtCXClCOBvBj_L ______CtClCoClClClCoCXCtClCoClClClClCXCtCXCXCtClCtClCICOCOBvBc_A ____CoClCtCtClClCtClClClCtClCtCoClClCtCXCoClCoCtCXCXCOBvBkBW_L_A __CtClCtCXClCoClCXClCtCoCXClClClCtCoClClClCtClClCoCOCOBvBc_z_A__ CtCXCXClClCtCtCoClClClClClClCtCXClClCtCXCtCXClClCOCOCNBW_A_A____ CXClClClCoCXClClCtCoCtClClCoClCXCtCoClClCXClClCOCOBkBc_A_A______ __ClClCtClCtCXClClClClCtCoCtClCtCXClCtCXCoCtCOCOBzBj_A_A________ __CPCPCXClClCoCtClClCXCtClCoCtCXClClCXCtClCOCOBkBc_A_A__________ __CPCPCPCPClClClCoClCtCXClClClCoClClCoClCOCOBzBj_A_A____________ __CVCPCPCPCOCPClClClCXClClClClClClCtClCOCOBkBc_A_A______________ ClCVCVCVCVCPCPCPCOClCtCoClClCtCtCoClCOCOBzBj_A_A________________ _AClClCVCVCVCPCPCPCPCPClClCtCoClClCOCOBkBc_A_A__________________ ___A_AClClCVCVCVCVCPCPCPCPClClClCOCOCNBc_A_A____________________ _______A_AClClCVCVCVCPCPCPCPClCOCOBjBc_A_A______________________ ___________A_AClClCVCVCVCPCPClCOBmBc_A_A________________________ _______________A_AClClCVCVCPCOBjBc_A_A__________________________ ___________________A_AClClCPCOBc_z_A____________________________ _______________________A_ABjBc_A_A______________________________ ___________________________A_A_A________________________________ ________________________________________________________________ } # tile 324 (vellum) { ________________________________________________________________ ______________________________CNCNCN____________________________ ____________________________BzCNCNBzBzBz________________________ __________________________CNClClClClCNBzBzCN____________________ ________________________CNCNCNCNCNClCNBzCNBzBzBz________________ ______________________CNCNCNClCNBzBzBzCNCNClBzBzCNCN____________ ____________________CNCNClCNBzBzBzBzBzCNBzCNClClClCNCN__________ __________________CNCNBzBzCNBzCNCNCNBzCNBzCNCNCNCNClCNCNBz______ ________________BzBzCNCNBzCNCNCNClCNCNCNBzBzBzBzBzCNCNCNCNBz____ ______________CNBzBzBzCNBzCNClClCNCNCNBzBzBzBzBzBzBzBzCNCNBzBb__ ____________BzCNBzCNCNClCNBzCNCNCNCNBzBzCNBzCNCNCNBzBzCNBzBzBb__ __________CNBzBzBzCNCNClCNBzBzBzBzBzBzBzCNCNClClClCNCNBzBzBbBb_A ________BzCNBzBzCNCNClCNCNBzBzBzBzBzCNCNCNClCNCNCNCNBzBzBbBbB__A ______CNBzCNCNBzCNCNClClCNBzCNCNCNCNClClCNCNCNBzBzBzCIBbBbB__N_A ____CNCNClCNCNBzBzCNCNClCNCNCNBzBzBzCNCNClClBzCNBzBzBbBvB__O_A_A __CNCNClCNCNBzBzCNBzCNClClCNBzBzBzBzBzCNCNCNCNBzBzBbBbBv_N_A_A__ CNBzClCNClCNBzBzBzBzBzCNClCNBzBzBzCNBzBzBzCNBzBzBbBbB_BW_A_A____ CNCNClCNCNCNBzBzCNCNBzBzCNBzBzCNCNCNBzBzBzBzBzBbBbB__M_A_A______ __CNCNCNBzBzBzCNClClCNBzBzBzBzCNClCNCNCNBzBzBbBbB__O_A_A________ __CPCPCNBzBzBzCNBzCNClClCNBzBzCNClCNBzBzBzBbBbB__N_A_A__________ __CPCPCPBkBzCNCNBzBzCNCNCNBzCNCNClCNBzBzBbBbB__O_A_A____________ __CVCPCPCPCPCPCNBzCNBzBzCNBzBzClCNBzBzBbBbB__N_A_A______________ CNCVCVCVCVCPCPCPBkCNCNCNBzCNCNCNBzBzBbBbB__O_A_A________________ _ACNCNCVCVCVCPCPCPCPCPCNBzCNCNBzBzBbBbB__N_A_A__________________ ___A_ACNCNCVCVCVCVCPCPCPBkCNBzBzBbBbB__O_A_A____________________ _______A_ACNCNCVCVCVCVCPCPCPBzBbBbB__N_A_A______________________ ___________A_ACNCNCVCVCVCVCPBzBbB__O_A_A________________________ _______________A_ACNCNCVCVCPBbB__N_A_A__________________________ ___________________A_ACNCNCPBb_M_A_A____________________________ _______________________A_AB__L_A_A______________________________ ___________________________A_A_A________________________________ ________________________________________________________________ } # tile 325 (ragged) { ________________________________________________________________ ________________________________________________________________ ____________BSBSBk____BkBkBkBk______BkBkBk______BkBkBkBkBk_A____ ________BSBSBSBSBkBkBkBkBkBkBkBk__BkBkBkBkBkBkBkBkBkBkBkBk_A_A__ ______BSBSBSCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPBkBkBk_A_A_A__ ______BSBSBSCPBkBkCPCPCPBkBkCPCPBkCPBkBkCPCPBkCPCPCPBkBk_A_A_A__ ______BSBSBSBkBlCOBlBkBkBkBkBkBkBkBkCPBkBkBdBdBdCPCPBkBk_A_A_A__ ______BSBSBSCOBkCOBkBkBkBkBdBdBkBkBnBkBkBdBdBdBdBkCPBkBkBk_A_A__ ______BSBSBSBlBkBkBkBkBkBdBdBdBdBkCJBkBkBdBdBdBdBkCPBkBkBk_A_A__ ______BSBSBSBmBkBdBdBkBkBdBdBdBdBkBnBkBdBdBdBkBdCPCPCPBkBk_A_A__ ______BSBSBSBxBkBdBkBkCPBdBdBkBkBkBkBkBdBdBkBkCPCPCPCPBkBk_A_A__ ______BSBSBSBkBkBdBkCPBkBkBkBdBkBkBkBkBdBkBkBkBkCPCPCPBkBk_A_A__ ______BSBSBSBkBkBkBkBkCPBkBkBdBkBkBkBkBkBkCPBkBkBkCPCPBkBk_A_A__ ______BSBSBSBkBkBkBkBdBkBkBdBdBkCPBkBdBdBkBkCPBkBkCPCPBkBk_A_A__ ______BSBSBSBkBkBdBdBkBkBkBdBdBkBkCJBkBdBkBkBkBkBkCPCPBk_A_A_A__ ______BSBSBSCPBkBdBdBkBkBkBdBdBkBkBnBkBkBkBkCPBkCPCPCPBk_A_A_A__ ______BSBSBSBkBnBkBkBkBkBdBdBdBkCPBkBkBdBdBdBdCPCPCPBkBk_A_A_A__ ______BSBSBiBkCJBkBdBkBkBkBdBkCJBkBkBkBkBkBdBdBkCPCPBkBkBk_A_A__ ______BSBSBSBlBkBdBdBkBkBlCOBlBkBdBdBkBkBkBdBdBkCPCPBkBkBk_A_A__ ______BSBSBSBkBkBdBdBkBkCOBkBkBdBdBkBkBkBkBdBkBkBkCPBkBkBk_A_A__ ______BSBSBSBkBkBkBdBkBnBxBdBdBdBdBkBmCKBmBkBkBkBkCPBkBkBk_A_A__ ______BSBSBSBkBkBkBkBkBdBdBdBdBdBdBkCKBmBxBkBkBkBkCPBkBkBk_A_A__ ______BSBSBSBkBkBkBkBkBkBkBkBkBdBdBdBkBkBkBkBdBdBdCPCPBk_A_A_A__ ______BSBSBSBkBmBlCOBkBdBnCJBmBkBkBkBkBkBkBdBdBdCPCPCPBk_A_A_A__ ______BSBSBSBkCKBkBkBkBdBdBkBlCJBmBkBkBkBdBdBdBdCPCPCPBk_A_A_A__ ______BSBSBiBnBkCOBkBdBdBdBdCOBkBlBkBkBdBdBdBdBdBdCPBkBkBk_A_A__ _______ABSBSBkCKBkBkBkBdBdBdBkBkBkBkBkBdBdBdBdBdBd_A_A_A_A_A_A__ _______A_A_BCJBmBk_A_ABdBdBd_A_A_ABdBdBdBdBdBd_A_A_A_A_A_A_A_A__ _________A_A_A_B_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A______ ___________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A__________ ________________________________________________________________ ________________________________________________________________ } # tile 326 (dog eared) { ________________________________________________________________ _______________________________e_e_e____________________________ _____________________________Z_e_e_Z_Z_Z________________________ ___________________________e_e_Z_Z_e_e_e_Z_e____________________ _________________________e_e_e_Z_e_e_e_Z_e_e_e_e________________ _______________________e_Z_e_Z_Z_Z_e_Z_e_e_e_Z_e_e_e____________ _____________________e_e_Z_Z_e_e_Z_Z_e_e_Z_Z_e_e_Z_e_e__________ ___________________e_e_e_Z_e_e_e_Z_e_e_e_Z_e_e_e_Z_e_e_e_Z______ _________________e_e_e_e_Z_Z_Z_Z_e_Z_e_e_Z_e_e_e_Z_e_e_Z_e_Z____ _______________e_Z_Z_Z_Z_e_e_e_Z_Z_e_Z_Z_Z_e_Z_Z_Z_e_e_e_e_Z_V__ _____________Z_e_e_e_e_Z_e_e_Z_e_e_e_e_Z_Z_Z_Z_Z_e_Z_Z_e_Z_Z_V__ ___________e_Z_e_e_Z_Z_e_e_Z_Z_Z_Z_Z_Z_e_Z_e_Z_e_e_Z_e_Z_Z_V_V_A _________Z_e_e_Z_e_Z_e_Z_Z_e_Z_e_e_Z_e_e_e_Z_e_e_e_e_Z_Z_V_V_R_A _______e_Z_e_e_Z_e_Z_e_e_Z_e_e_Z_Z_e_Z_Z_e_e_Z_e_e_ZCI_V_V_R_O_A _____e_e_e_Z_Z_e_e_Z_e_e_e_Z_e_Z_e_Z_Z_e_e_e_Z_e_Z_Z_VBv_R_O_A_A ___e_e_e_e_Z_e_e_e_Z_e_e_e_Z_e_Z_e_Z_Z_e_Z_e_e_Z_Z_V_VBv_O_A_A__ _e_Z_e_Z_Z_Z_e_e_e_Z_e_Z_Z_e_Z_Z_Z_e_Z_e_e_Z_Z_Z_V_V_RBW_A_A____ _e_e_Z_e_e_e_e_Z_Z_Z_Z_e_e_Z_Z_Z_e_e_e_Z_e_Z_Z_V_V_R_O_A_A______ ___e_e_e_e_Z_Z_Z_Z_e_Z_Z_Z_e_e_Z_e_e_e_e_Z_Z_V_V_R_O_A_A________ __CPCP_e_e_e_e_e_Z_e_e_e_e_e_e_Z_e_Z_e_Z_Z_V_V_R_O_A_A__________ __CPCPCPBk_e_e_e_Z_e_e_e_e_e_Z_Z_Z_e_Z_Z_V_V_R_O_A_A____________ __CVCPCPCPCPCP_e_Z_e_Z_Z_Z_Z_e_e_e_Z_Z_V_V_R_O_A_A______________ _eCVCVCVCVCPCPCPBk_e_e_e_Z_e_e_e_Z_Z_V_V_R_O_A_A________________ _A_e_eCVCVCVCPCPCPCPCP_e_Z_e_e_Z_Z_V_V_R_O_A_A__________________ ___A_A_e_eCVCVCVCVCPCPCPBk_e_Z_Z_V_V_R_O_A_A____________________ _______A_A_e_eCVCVCVCVCPCPCP_Z_V_V_R_O_A_A______________________ ___________A_A_e_eCVCVCVCVCP_Z_V_R_O_A_A________________________ _______________A_A_e_eCVCVCP_V_R_O_A_A__________________________ ___________________A_A_e_eCP_R_O_A_A____________________________ _______________________A_A_R_O_A_A______________________________ ___________________________A_A_A________________________________ ________________________________________________________________ } # tile 327 (mottled) { ________________________________________________________________ ________________________________________________________________ ____________BSBSBwCGBjCGBjCGBjCGBjCGBjCGBjCGBjCGBjCGBjCG_A_A____ ________BSBSBSBSBtBzBtBzBtBzBwBbCGBcCGBzBtBjCGBbBwBbCGBj_A_A_A__ ______BSBSBSCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPBwCG_L_A_A__ ______BSBSBSCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCWCGBj_A_A_A__ ______BSBSBSBwBwCGBjBkCJBnCGBjCGBmCGBjCGBjCGBmCGCPCPBcCG_A_A_A__ ______BSBSBSCOBkBjCJBmBwBkBkCGBjBtBwBzBtBzBwBkBjCPCPCGBj_A_A_A__ ______BSBSBSBwBtBzBkCKBjCGBmBwBzCGBjCJBwBtBmCJBwCPCPBzBt_L_A_A__ ______BSBSBSBzCGBwBkBzBtBzBwCGBbCGBjBkCGBzCKBmBtCPCPCGBw_A_A_A__ ______BSBSBSBtBjCGBmCGBwCGBbCGBwBzBkCJBmBwBkBwBzCPCPBcCG_L_A_A__ ______BSBSBSBwBzCGBwBkBkBmCGBjCGBkCKBmBlCJBkBwCGCPCPCGBj_A_A_A__ ______BSBSBSBkCGBjCGBmCKBkBmBkBmBkBmBxBmBkBwBzBtCPCPBzBt_A_A_A__ ______BSBSBiBkBjCGBjCJBjBwCJBnCGBwCGBwCGBjCGCGBjCPCPCGBw_A_A_A__ ______BSBSBSBwBzBtBzBwCGBzCGBkBmCJBjBzCGBjBzBtBzCPCPBjCG_L_A_A__ ______BSBSBSCGCGBjCGBzBtBwBMCJBlBmCGBcCGBjCGBwBkCPCPCGBj_A_A_A__ ______BSBSBSBjBbCGBjBtBmCJBwBwCGBjBkCJBjCGBbCGBmCPCPBjCG_A_A_A__ ______BSBSBSBkCGBzBtCPBkBjCGBzBtBzCKBmBkBzCGBjCGCPCPCGBj_A_A_A__ ______BSBSBSBwBjCGBjBkCJBjCGBjCGBjBkCJBlBkBmCGBjCPCPBbCG_A_A_A__ ______BSBSBiBjCJBkBmCKBmBtBzCGBcCGBzBlCOBkCKBmBkCPCPCGBj_A_A_A__ ______BSBSBSBkBwCOBwBkBwBkBwBzCGBjCGBjCGBjCGBkBwCWCPBjCG_L_A_A__ ______BSBSBSCGBwBkBwCOBkCOBkCGBcCGBbCGBcCGBjCOBwCPCPCGBj_A_A_A__ ______BSBSBSBmCGBjCGBcCKBkBnCGBzBkBwBmCGBjBtBjBtCWCPBcCG_A_A_A__ ______BSBSBSBjCGBbCGBwBkBmCJBkBwBkCOBxBmCGBzCGBwCPCPCGBj_A_A_A__ ______BSBSBSCGBjCGBzCGBjCJBlBmCGBwBwBwBkBkBwBzBtCPCPBzCG_A_A_A__ ______BSBSBSBjCGBbBwBcCGBwBmCKBkBzBtCLBlCOBkCGBjCP_A_A_A_A_A_A__ _______ABSBSBkBmCGBwCGBzBtBkBmCGBwBwBtBmBkCKBzCG_A_A_A_A_A_A_A__ _______A_A_zBwBxBzCGBcCGBzBwCGBmBtBzBwCJBwBkBkBj_A_A_A_A_A_A_A__ _________A_A_A_L_A_A_A_A_A_A_A_A_A_z_A_L_A_L_z_A_A_A_A_A_A______ ___________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A__________ ________________________________________________________________ ________________________________________________________________ } # tile 328 (stained) { ________________________________________________________________ ________________________________________________________________ ____________BwCGBjCGBjCGBjCGBjCGBjCGBjCGBjCGBjCGBjCGBjCG_A_A____ ________CGBjBtBzCGBbCGBjBtBzBwBbCGBcCGBzBtBjCGBbBwBbCGBj_A_A_A__ ______BjBwBzCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPBwCG_L_A_A__ ______BzBtCGCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCWCGBj_A_A_A__ ______CGBjBjCTCTCTCTCTBwCTCTCTCGBjCGCTBjCTCTBwCTCPCPBbCG_A_A_A__ ______BcCGBzBtBwCTCGBjCTCGBzBtBwBzBtBzCTCGCTBbCGCPCPCGBj_A_A_A__ ______CGBjCGCTCTCTBbCGCTCTCTBwBzBtBwCGBjCTCGCTBjCPCPBjCG_L_A_A__ ______CGBzBtBzCTCGBwBzCGBjCTCGCTCTCTBzBtCTBzCTCGCPCPCGBj_A_A_A__ ______BjBtBwCTBwCTBbCGBcCGBbCTCTBwCGBjCGBjBtBjCTCPCPBzBt_A_A_A__ ______CGBzCGCTCTCTBwCGBzCGCTBwCTBtBzBtBzCTCGCTCTCPCPCGBw_A_A_A__ ______BjBtBjBzBtCTBzBtBjBwBzCGBjCGBjCGCTBwBzBtCTCPCPBcCG_L_A_A__ ______BzCGBjCGCTCGBwCTCGCTCGBbCTCTCGBjCTCTCGBjCTCPCPCGBj_A_A_A__ ______BtBjCGCTCTCTBbCGCTBcCTCGBjCGCUBcCTCGCTCTBzCPCPBzBt_L_A_A__ ______BjCGBbCTBjCTCTBzBjCTCGBzCGBcCGBwBtCTBzBwBtCPCPCGBw_A_A_A__ ______CGBzCGCTCGBjCGBtCGBjCTBcCGBzBwBbCTCTCTBtBzCPCPBjCG_L_A_A__ ______BjBtBjBwBzBtBzBwBzBtBzCGBwBbCGBwBtCTBwCTCTCPCPBtBj_A_A_A__ ______CGBzCGCTCTCGCTBtBwCGBjBtBzCGCTBzCGBcCGCTCTCPCPBzCG_A_A_A__ ______BjBtBjCTBcCGBjBwBzBtBzCGBjCGBjBtBwBzBtBzBwCPCPCGBw_A_A_A__ ______CGBzCGCGCTBzCTCGCTBwCTCTBtBzCGBzCGCTCTCGCTCPCPBjBt_L_A_A__ ______BjCGBcCTCTBtCTBwBbCGBjCGBjBwCTCTBwBcCGBjCTCPCPCGBj_A_A_A__ ______CGBcCGBzCTCTBwCUCGBjBtCUCTBtCTBwBtBzCGCTBbCPCPBzCG_A_A_A__ ______BzCGBjCTCGBjCGCTBcCGBzBwCTBwBzCGBzCGBbBwCTCPCPBtBj_A_A_A__ ______BwBbCGCTBcCGBbCGBwBzBtCGCTBtBjBtBwBwCGCTCGCPCPBwCG_A_A_A__ ______CGCGBjCTCTCGBwBzBtCTCGBjBzCGBzCGBzBtBzCTBjCP_A_A_L_A_A_A__ _______LBjCGBbCGBzBwCGBjBwBbCGCTCTBwCTBwCGBjCTCT_A_A_A_A_A_A_A__ _______A_A_ACTBjCGBbCTCGCTCTCTBjCTCTCTBtCTBbCGCT_A_A_A_A_A_A_A__ _________A_A_A_A_A_A_A_L_A_A_A_A_A_A_A_L_A_z_A_A_A_A_A_A_A______ ___________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A__________ ________________________________________________________________ ________________________________________________________________ } # tile 329 (cloth) { ________________________________________________________________ ______________________________CVCVBk____________________________ ____________________________CVCoBkCmCVBk________________________ __________________________CVCmBkCVC$BkCVCmBk____________________ ________________________CVCoBkCmCVBkCmCoBkCmCVBk________________ ______________________CVCVBkCVC$BkCVCmBkCVC$BkCVCmBk____________ ____________________CVCoBkCmCVBkCmCoBkCmCVBkCmCoBkCmCV__________ __________________CVCmBkCVC$BkCVCmBkCVC$BkCVCmBkCVCoBkCVCV______ ________________CVCoBkCmCVBkCmCoBkCmCVBkCmCoBkCmCVBkCmCoBkCV____ ______________CVCVBkCVC$BkCVCVBkCVC$BkCVCVBkCVC$BkCVCmBkCVCPBk__ ____________CVCoBkCmCVBkCmCoBkCmCVBkCmCoBkCmCVBkCmCoBkCmCPCPBk__ __________CVCmBkCVC$BkCVCmBkCVC$BkCVCmBkCVC$BkCVCmBkCmBkCPBkBk_A ________CVCoBkCmCVBkCmCoBkCmCVBkCmCoBkCmCVBkCmCoBkCmCPCPBkBnBk_z ______CVCVBkCVC$BkCVCmBkCVC$BkCVCmBkCVCoBnCVCVBkCVCPBvBkCJBkBd_A ____CVCoBkCmCVBkCmCoBkCmCVBkCmCoBkCmCVBkCVCoCJCmBnCJBMBvBkBd_A_A __CVCmBkCVC$BkCVCmBkCVCoBkCVCmBkCVCoCJCVCVBnCVCJCPBnCJBvBd_A_A__ CVCoBkCmCVBkCmCoBkCmCVBkCmCoBkCmCVBkCmCoBkCVCPBnBkBkBkBW_A_A____ CVBkCVC$BkCVCmBkCVC$BkCVCmBkCVCoBnCVCVBkCmCJCPBkCJBkBd_A_A______ __CVCVBkCmCoBkCmCVBkCmCoBkCmCVBkCVCoBkCmCPBnBkBnBkBd_A_A________ __CPCPCVCmBkCVC$BkCVCmBkCVCoCJCVCVCJCVBnCPBkCJBkBd_A_A__________ __CPCPCPBkCmCVBkCmCoBkCmCVBnCVCoBkCmCPCJBkBnBkBd_A_A____________ __CVCPCPCPCPCPCVCmBkCVCoBkCVCVBkCVCPBkBnCJBkBd_A_A______________ CPCVCVCVCVCPCPCPBkCmCVBkCmCoBkCmCPBnCJBkBkBd_A_A________________ _ABkCPCVCVCVCPCPCPCPCPCVCmBkCmCJBnCJBnBkBd_A_A__________________ ___A_ACPBkCmCVCVCVCPCPCPCJCVCPBnCJBkBkBd_A_A____________________ _______A_zBnCPCVCVCVCVCPCPBnCPBkBkBkBd_A_A______________________ ___________A_ACPBkCVCVCVCVCPCPBkBkBk_A_A________________________ _______________A_ACPCPCVCVCPBkBkBd_A_A__________________________ ___________________A_ACPCPCJBnBd_A_A____________________________ _______________________A_ABkBd_A_A______________________________ ___________________________A_A_A________________________________ ________________________________________________________________ } # tile 330 (leather) { ________________________________________________________________ ______________________________BNBNBN____________________________ ____________________________AqBNBNAqAqAq________________________ __________________________BNBNAqAqBNBNBNAqBN____________________ ________________________BNBNBNAqBNBNBNAqBNBNBNAq________________ ______________________BNAqBNAqAqAqBNAqBNBNBNAqBNBNBN____________ ____________________BNBNAqAqBNBNAqAqBNBNAqAqBNBNAqBNBN__________ __________________BNAqBNAqBNBNBNAqBNBNBNAqBNBNBNAqBNBNBNAq______ ________________BNBNBNBNBNAqAqAqBNAqBNBNAqBNBNBNAqBNBNAqBNAq____ ______________BNAqAqAqBNBNBNBNAqAqBNAqBNAqBNAqAqBNBNAqBNBNAqAT__ ____________AqBNBNBNBNAqBNBNAqBNBNBNBNAqAqAqAqBNAqAqAqBNAqAqAT__ __________BNAqBNBNAqAqBNBNAqAqAqAqAqAqBNAqBNAqBNBNBNBNAqAqATAT_A ________AqBNBNAqBNAqBNAqAqBNAqBNBNAqBNBNBNAqAqBNBNBNAqAqATATAG_A ______BNAqBNBNAqBNAqBNBNAqBNBNAqAqBNAqAqBNBNAqBNBNAqCIATATAG_L_A ____BNBNBNAqAqBNBNAqBNBNBNAqBNAqBNAqBNAqBNBNAqBNAqAqATBvAG_L_A_A __BNBNBNBNAqBNBNBNAqBNBNBNAqBNAqBNBNAqBNAqAqBNAqAqATATBv_L_A_A__ BNAqBNAqAqAqBNBNBNAqBNAqAqBNAqBNAqBNAqBNBNBNAqAqATATAGBW_A_A____ BNBNAqBNBNBNBNAqAqAqAqBNBNAqAqAqBNBNBNAqBNAqAqATATAG_L_A_A______ __BNBNBNBNAqAqAqBNBNAqAqAqBNBNAqBNAqBNBNAqAqATATAG_L_A_A________ __B9B9BNBNBNBNBNAqBNBNBNBNBNBNAqBNAqBNAqAqATATAG_L_A_A__________ __CPCPB9B9BNBNBNAqBNBNBNBNBNAqAqBNBNAqAqATATAG_L_A_A____________ __CVCVCPCPB9B9BNAqBNAqAqAqAqBNAqBNAqAqATATAG_L_A_A______________ BNCVCVCVCVCPCPB9B9BNBNBNAqBNBNBNAqAqATATAG_L_A_A________________ _ABNBNCVCVCVCVCPCPB9B9BNAqBNBNAqAqATATAG_L_A_A__________________ ___A_ABNBNCVCVCVCVCPCPB9B9BNAqAqATATAG_L_A_A____________________ _______A_ABNBNCVCVCVCVCPCPB9AqATATAG_L_A_A______________________ ___________A_ABNBNCVCVCVCVCPAqATAG_L_A_A________________________ _______________A_ABNBNCVCVCPATAG_L_A_A__________________________ ___________________A_ABNBNB9AT_L_A_A____________________________ _______________________A_AAG_L_A_A______________________________ ___________________________A_A_A________________________________ ________________________________________________________________ } # tile 331 (white) { ________________________________________________________________ ______________________________C$C$Cm____________________________ ____________________________CmC$CmCmC$C$________________________ __________________________C$CmCmCmC$C$CmC$C$____________________ ________________________C$C$CmCmC$C$C$CmC$CmC$Cm________________ ______________________CmCmC$CmCmCmC$C$CmC$CmCmCmC$C$____________ ____________________C$C$CmCmC$CmC$C$C$C$CmCmC$C$CmC$Cm__________ __________________C$C$CmC$CmCmCmCmCmC$CmCmC$C$C$CmC$CmC$C$______ ________________CmC$C$C$CmCmC$C$CmC$CmCmCmC$C$CmCmC$CmC$CmCm____ ______________CmCmC$CmCmCmC$C$C$C$CmCmC$CmCmC$CmC$CmC$CmC$CmCP__ ____________C$C$CmCmCmC$C$CmC$CmCmC$CmC$C$CmCmC$C$CmCmC$CmCmCP__ __________CmC$C$C$CmCmC$C$CmCmC$C$C$CmC$C$CmCmCmC$CmCmCmCmCPCP_A ________CmCmC$C$C$CmC$CmCmC$CmCmC$C$CmCmC$C$CmCmCmC$CmCmCPCPBk_A ______C$C$CmC$C$CmC$CmC$C$CmCmCmC$C$C$CmCmCmC$CmC$CmBvCPCVBkBd_A ____C$C$C$CmC$CmC$CmCmC$C$CmC$CmCmCmCmCmC$CmC$C$CmCmCPBvBkBk_A_A __CmC$C$CmCmCmCmC$CmC$C$C$CmCmCmC$CmC$CmCmC$CmCmCmCPCPBvBd_A_A__ CmC$CmCmCmCmC$C$CmCmC$C$CmCmCmC$CmCmC$CmC$CmCmCmCPCPBkBW_A_A____ C$C$CmC$C$CmC$C$C$CmC$CmCmCmCmC$C$C$C$CmCmCmCmCPCPBkBk_A_A______ __C$CmC$C$CmCmC$CmC$C$CmC$C$CmCmC$C$C$C$CmCmCPCPBkBk_A_A________ __CPCPC$C$CmC$CmC$C$CmCmC$C$C$CmCmC$CmCmCmCPCVBkBd_A_A__________ __CPCPCPBkCoCmC$C$CmCmCmCmCmC$C$C$CmCmCmCPCPBkBk_A_A____________ __CVCPCPCPBnCPCmCmCmCmC$C$CmCmCmCmC$CmCPCVBkBd_A_A______________ CmCVCVCVCVCPCPCJCPCmC$CmC$CmC$C$C$CmCPCPBkBk_A_A________________ _ACmCmCVCVCVCVCPCPBnCPCmCmC$C$CmCmCPCVBkBd_A_A__________________ ___A_ACmCmCVCVCVCVCPCPCJBnCmCmCmCPCPBkBk_A_A____________________ _______A_ACmCmCVCVCVCVCPCPCPCmCPCVBkBd_A_A______________________ ___________A_ACmCmCVCVCVCVCPCmCPBkBk_A_A________________________ _______________A_ACmCmCVCVCPCPBkBd_A_A__________________________ ___________________A_ACmCmCPCPBd_A_A____________________________ _______________________A_ABkBd_A_A______________________________ ___________________________A_A_A________________________________ ________________________________________________________________ } # tile 332 (pink) { ________________________________________________________________ ______________________________ChCiCg____________________________ ____________________________CgCXCgCgCiCh________________________ __________________________CiCgCgCgChCXCgCXCi____________________ ________________________ChCXCgCgCiCmCgCgChCgChCi________________ ______________________CgCiChCgCgCgCiChCgCXCgCgCgChCi____________ ____________________CiChCgCgCiCgChCXCiChCgCgCiCXCgCXCg__________ __________________ChCXCgCiCgCgCgCgCgChCiCgCgCmCgCgChCgChCi______ ________________CgCiChCXCgCgChCXCgCiCgCgCgCXChCgCgCiCgCXCgCg____ ______________CgCgCXCgCgCgChCXCiChCgCgCXCgCgCiCiChCgCXCgChCgCJ__ ____________CiChCgCgCgCiChCiCiCgCgCXCgChCiCgCgChClCgCgCgCiCgCJ__ __________CgCmCiCXCgCgChCXCgCgChCiChCgCXChCgCgCiChCgCgCgCgCJCJ_A ________CgCgCgChCXCgCiCgCgCiCgCgCXChCiCgCiCmCgCgCgCiCgCgCJCJBw_A ______CmCgCgCmCiCgChCgCXChCgCgCgChCXCgCgCgCgCiCgChCgCICJCJBwBX_A ____CgCiChCgCgCgChCiCgCgCXCgCXCgCgCgCgCgChCgCgCXCgCgCJBvBwBX_z_A __CgCXChCiCgCgCgCiCgChCXChCgCgCgCgCgCXCgCgCXCgCgCgCJCJBvBX_A_A__ CgCXCgCgCgCgCXChCiCgCiCXCgCgCgChCiCgChCgCiCgCgCgCJCJBwBW_z_A____ ChCgCgChCXCgCgCmCiCgChCgCgCgCgCiCXChCiCgCgCgCgCJCJBwBX_A_A______ __CXCgCiChCgCgCgCgCmCiCgChCiCgCgChClChCXCgCgCJCJBwBX_z_A________ __CPCgCmCiCiChCiChCgCgCgCXCgCmCgCgCiCgCgCgCJCJBwBX_A_A__________ __CPCPCKCPCgCgCiCmCgCgCgCgCgChCiCmCgCgCgCJCJBwBX_z_A____________ __CVCVCPCPCJCPCgCgCgCgChCXCgCgCgCgChCgCJCJBwBX_z_A______________ CgCVCVCVCVCPCPCPCJCgCXCgCgCgCXCgCXCgCnCJBwBX_z_A________________ _ACgCgCVCVCVCVCPCPCPCgCgCgCXChCgCgCJCJBwBX_A_A__________________ ___A_ACgCgCVCVCVCVCPCPCPCKCgCgCgCJCJBwBX_z_A____________________ _______A_ACgCgCVCVCVCVCPCPCPCgCJCJBwBX_A_A______________________ ___________A_ACgCgCVCVCVCVCPCgCJBwBX_z_A________________________ _______________A_ACgCgCVCVCPCJBwBX_A_A__________________________ ___________________A_ACgCgCPCJBX_z_A____________________________ _______________________A_ABwBX_A_A______________________________ ___________________________A_A_A________________________________ ________________________________________________________________ } # tile 333 (red) { ________________________________________________________________ ______________________________CuCuCY____________________________ ____________________________CYCuCYCYCuCu________________________ __________________________CuCYCYCYCuCuCYCuCu____________________ ________________________CuCuCYCYCuCuCuCYCuCYCuCY________________ ______________________CYCYCuCYCYCYCuCuCYCuCYCYCYCuCu____________ ____________________CuCuCYCYCuCYCuCuCuCuCYCYCuCuCYCuCY__________ __________________CuCuCYCuCYCYCYCYCYCuCYCYCuCuCuCYCuCYCuCu______ ________________CYCuCuCuCYCYCuCuCYCuCYCYCYCuCuCYCYCuCYCuCYCY____ ______________CYCYCuCYCYCYCuCuCuCuCYCYCuCYCYCuCYCuCYCuCYCuCYCB__ ____________CuCuCYCYCYCuCuCYCuCYCYCuCYCuCuCYCYCuCuCYCYCuCYCYCB__ __________CYCuCuCuCYCYCuCuCYCYCuCuCuCYCuCuCYCYCYCuCYCYCYCYCBCB_A ________CYCYCuCuCuCYCuCYCYCuCYCYCuCuCYCYCuCuCYCYCYCuCYCYCBCBBo_A ______CuCuCYCuCuCYCuCYCuCuCYCYCYCuCuCuCYCYCYCuCYCuCYBvCBCBBoBN_A ____CuCuCuCYCuCYCuCYCYCuCuCYCuCYCYCYCYCYCuCYCuCuCYCYCBBvBoBN_A_A __CYCuCuCYCYCYCYCuCYCuCuCuCYCYCYCuCYCuCYCYCuCYCYCYCBCBBvBN_A_A__ CYCuCYCYCYCYCuCuCYCYCuCuCYCYCYCuCYCYCuCYCuCYCYCYCBCBBoBW_A_A____ CuCuCYCuCuCYCuCuCuCYCuCYCYCYCYCuCuCuCuCYCYCYCYCBCBBoBN_A_A______ __CuCYCuCuCYCYCuCYCuCuCYCuCuCYCYCuCuCuCuCYCYCBCBBoBN_A_A________ __CPCPCuCuCYCuCYCuCuCYCYCuCuCuCYCYCuCYCYCYCBCBBoBN_A_A__________ __CPCPCPBkCpCYCuCuCYCYCYCYCYCuCuCuCYCYCYCBCBBoBN_A_A____________ __CVCPCPCPBnCPCYCYCYCYCuCuCYCYCYCYCuCYCBCBBoBN_A_A______________ CYCVCVCVCVCPCPCPCJCYCuCYCuCYCuCuCuCYCBCBBoBN_A_A________________ _ACYCYCVCVCVCVCPCPBnCPCYCYCuCuCYCYCBCBBoBN_A_A__________________ ___A_ACYCYCVCVCVCVCPCPCPBkCpCYCYCBCBBoBN_A_A____________________ _______A_ACYCYCVCVCVCVCPCPCPCYCBCBBoBN_A_A______________________ ___________A_ACYCYCVCVCVCVCPCYCBBoBN_A_A________________________ _______________A_ACYCYCVCVCPCBBoBN_A_A__________________________ ___________________A_ACYCYCPCBBN_A_A____________________________ _______________________A_ABoBN_A_A______________________________ ___________________________A_A_A________________________________ ________________________________________________________________ } # tile 334 (orange) { ________________________________________________________________ ______________________________CzCzCc____________________________ ____________________________CcCzCcCcCzCz________________________ __________________________CzCcCcCcCzCzCcCzCz____________________ ________________________CzCzCcCcCzCzCzCcCzCcCzCc________________ ______________________CcCcCzCcCcCcCzCzCcCzCcCcCcCzCz____________ ____________________CzCzCcCcCzCcCzCzCzCzCcCcCzCzCcCzCc__________ __________________CzCzCcCzCcCcCcCcCcCzCcCcCzCzCzCcCzCcCzCz______ ________________CcCzCzCzCcCcCzCzCcCzCcCcCcCzCzCcCcCzCcCzCcCc____ ______________CcCcCzCcCcCcCzCzCzCzCcCcCzCcCcCzCcCzCcCzCcCzCcCF__ ____________CzCzCcCcCcCzCzCcCzCcCcCzCcCzCzCcCcCzCzCcCcCzCcCcCF__ __________CcCzCzCzCcCcCzCzCcCcCzCzCzCcCzCzCcCcCcCzCcCcCcCcCFCF_A ________CcCcCzCzCzCcCzCcCcCzCcCcCzCzCcCcCzCzCcCcCcCzCcCcCFCFBs_A ______CzCzCcCzCzCcCzCcCzCzCcCcCcCzCzCzCcCcCcCzCcCzCcCICFCFBsBS_A ____CzCzCzCcCzCcCzCcCcCzCzCcCzCcCcCcCcCcCzCcCzCzCcCcCFBvBsBS_A_A __CcCzCzCcCcCcCcCzCcCzCzCzCcCcCcCzCcCzCcCcCzCcCcCcCFCFBvBS_A_A__ CcCzCcCcCcCcCzCzCcCcCzCzCcCcCcCzCcCcCzCcCzCcCcCcCFCFBsBW_A_A____ CzCzCcCzCzCcCzCzCzCcCzCcCcCcCcCzCzCzCzCcCcCcCcCFCFBsBS_A_A______ __CzCcCzCzCcCcCzCcCzCzCcCzCzCcCcCzCzCzCzCcCcCFCFBsBS_A_A________ __CPCPCzCzCcCzCcCzCzCcCcCzCzCzCcCcCzCcCcCcCFCFBsBS_A_A__________ __CPCPCPBkCcCcCzCzCcCcCcCcCcCzCzCzCcCcCcCFCFBsBS_A_A____________ __CVCPCPCPCPCPCcCcCcCcCzCzCcCcCcCcCzCcCFCFBsBS_A_A______________ CcCVCVCVCVCPCPCPBkCcCzCcCzCcCzCzCzCcCFCFBsBS_A_A________________ _ACcCcCVCVCVCPCPCPCPCPCcCcCzCzCcCcCFCFBsBS_A_A__________________ ___A_ACcCcCVCVCVCVCPCPCPBkCcCcCcCFCFBsBS_A_A____________________ _______A_ACcCcCVCVCVCPCPCPCPCcCFCFBsBS_A_A______________________ ___________A_ACcCcCVCVCVCVCPCcCFBsBS_A_A________________________ _______________A_ACcCcCVCVCPCFBsBS_A_A__________________________ ___________________A_ACcCcCPCFBS_A_A____________________________ _______________________A_ABiBS_A_A______________________________ ___________________________A_A_A________________________________ ________________________________________________________________ } # tile 335 (yellow) { ________________________________________________________________ ______________________________CjCjCj____________________________ ____________________________CjCjCjCjCjCj________________________ __________________________CjCjCjCjCjCjCjCjCj____________________ ________________________CjCjCjCjCjCjCjCjCjCjCjCj________________ ______________________CjCjCjCjCjCjCjCjCjCjCjCjCjCjCj____________ ____________________CjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCj__________ __________________CjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCj______ ________________CjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCj____ ______________CjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCM__ ____________CjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCM__ __________CjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCMCM_A ________CjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCMBy_A ______CjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCfCMCMByBa_A ____CjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCMBvByBa_A_A __CjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCMCMBvBa_A_A__ CjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCMByBW_A_A____ CjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCMCMByBa_A_A______ __CjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCMByBa_A_A________ __CPCWCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCMCMByBa_A_A__________ __CPCPCPCPCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCMByBa_A_A____________ __CVCVCPCPCPCWCjCjCjCjCjCjCjCjCjCjCjCjCMCMByBa_A_A______________ CjCVCVCVCVCPCPCPCPCjCjCjCjCjCjCjCjCjCjCMByBa_A_A________________ _ACjCjCVCVCVCVCPCPCPCWCjCjCjCjCjCjCMCMByBa_A_A__________________ ___A_ACjCjCVCVCVCVCPCPCPCPCjCjCjCjCMByBa_A_A____________________ _______A_ACjCjCVCVCVCVCPCPCPCjCMCMByBa_A_A______________________ ___________A_ACjCjCVCVCVCVCPCjCMByBa_A_A________________________ _______________A_ACjCjCVCVCPCMByBa_A_A__________________________ ___________________A_ACjCjCPCMBa_A_A____________________________ _______________________A_AByBa_A_A______________________________ ___________________________A_A_A________________________________ ________________________________________________________________ } # tile 336 (velvet) { ________________________________________________________________ ______________________________BPBPBP____________________________ ____________________________AsBPBPAsAsAs________________________ __________________________BPBuBuBuBuBPAsAsBP____________________ ________________________BPBPBPBPBPBuBPAsBPAsAsAs________________ ______________________BPBPBPBuBPAsAsAsBPBPBuAsAsBPBP____________ ____________________BPBPBuBPAsAsAsAsAsBPAsBPBuBuBuBPBP__________ __________________BPBPAsAsBPAsBPBPBPAsBPAsBPBPBPBPBuBPBPAs______ ________________AsAsBPBPAsBPBPBPBuBPBPBPAsAsAsAsAsBPBPBPBPAs____ ______________BPAsAsAsBPAsBPBuBuBPBPBPAsAsAsAsAsAsAsAsBPBPAsAV__ ____________AsBPAsBPBPBuBPAsBPBPBPBPAsAsBPAsBPBPBPAsAsBPAsAsAV__ __________BPAsAsAsBPBPBuBPAsAsAsAsAsAsAsBPBPBuBuBuBPBPAsAsAVAV_A ________AsBPAsAsBPBPBuBPBPAsAsAsAsAsBPBPBPBuBPBPBPBPAsAsAVAVAH_A ______BPAsBPBPAsBPBPBuBuBPAsBPBPBPBPBuBuBPBPBPAsAsAsCIAVAVAH_L_A ____BPBPBuBPBPAsAsBPBPBuBPBPBPAsAsAsBPBPBuBuAsBPAsAsAVBvAH_L_A_A __BPBPBuBPBPAsAsBPAsBPBuBuBPAsAsAsAsAsBPBPBPBPAsAsAVAVBv_L_A_A__ BPAsBuBPBuBPAsAsAsAsAsBPBuBPAsAsAsBPAsAsAsBPAsAsAVAVAHBW_A_A____ BPBPBuBPBPBPAsAsBPBPAsAsBPAsAsBPBPBPAsAsAsAsAsAVAVAH_L_A_A______ __BPBPBPAsAsAsBPBuBuBPAsAsAsAsBPBuBPBPBPAsAsAVAVAH_L_A_A________ __CPCPBPAsAsAsBPAsBPBuBuBPAsAsBPBuBPAsAsAsAVAVAH_L_A_A__________ __CPCPCPBkAsBPBPAsAsBPBPBPAsBPBPBuBPAsAsAVAVAH_L_A_A____________ __CVCPCPCPCPCPBPAsBPAsAsBPAsAsBuBPAsAsAVAVAH_L_A_A______________ BPCVCVCVCVCPCPCPBkBPBPBPAsBPBPBPAsAsAVAVAH_L_A_A________________ _ABPBPCVCVCVCPCPCPCPCPBPAsBPBPAsAsAVAVAH_L_A_A__________________ ___A_ABPBPCVCVCVCVCPCPCPBkBPAsAsAVAVAH_L_A_A____________________ _______A_ABPBPCVCVCVCVCPCPCPAsAVAVAH_L_A_A______________________ ___________A_ABPBPCVCVCVCVCPAsAVAH_L_A_A________________________ _______________A_ABPBPCVCVCPAVAH_L_A_A__________________________ ___________________A_ABPBPCPAV_L_A_A____________________________ _______________________A_AAH_L_A_A______________________________ ___________________________A_A_A________________________________ ________________________________________________________________ } # tile 337 (light green) { ________________________________________________________________ ______________________________BgBgBH____________________________ ____________________________BHBgBHBHBgBg________________________ __________________________BgBHBHBHBgBgBHBgBg____________________ ________________________BgBgBHBHBgBgBgBHBgBHBgBH________________ ______________________BHBHBgBHBHBHBgBgBHBgBHBHBHBgBg____________ ____________________BgBgBHBHBgBHBgBgBgBgBHBHBgBgBHBgBH__________ __________________BgBgBHBgBHBHBHBHBHBgBHBHBgBgBgBHBgBHBgBg______ ________________BHBgBgBgBHBHBgBgBHBgBHBHBHBgBgBHBHBgBHBgBHBH____ ______________BHBHBgBHBHBHBgBgBgBgBHBHBgBHBHBgBHBgBHBgBHBgBHBH__ ____________BgBgBHBHBHBgBgBHBgBHBHBgBHBgBgBHBHBgBgBHBHBgBHBHAo__ __________BHBgBgBgBHBHBgBgBHBHBgBgBgBHBgBgBHBHBHBgBHBHBHBHAoBH_A ________BHBHBgBgBgBHBgBHBHBgBHBHBgBgBHBHBgBgBHBHBHBgBHBHBHAoAo_A ______BgBgBHBgBgBHBgBHBgBgBHBHBHBgBgBgBHBHBHBgBHBgBHCIAoBHAoAh_A ____BgBgBgBHBgBHBgBHBHBgBgBHBgBHBHBHBHBHBgBHBgBgBHBHBHBvAoAh_A_A __BHBgBgBHBHBHBHBgBHBgBgBgBHBHBHBgBHBgBHBHBgBHBHBHBHAoBvAh_A_A__ BHBgBHBHBHBHBgBgBHBHBgBgBHBHBHBgBHBHBgBHBgBHBHBHAoBHAoBW_A_A____ BgBgBHBgBgBHBgBgBgBHBgBHBHBHBHBgBgBgBgBHBHBHBHBHAoAoAh_A_A______ __BgBHBgBgBHBHBgBHBgBgBHBgBgBHBHBgBgBgBgBHBHAoBHAoAh_A_A________ __CPCPBgBgBHBgBHBgBgBHBHBgBgBgBHBHBgBHBHBHAoBHAoAh_A_A__________ __CPCPCPBkBHBHBgBgBHBHBHBHBHBgBgBgBHBHBHBHAoAoAh_A_A____________ __CVCPCPCPCPCPBHBHBHBHBgBgBHBHBHBHBgBHAoBHAoAh_A_A______________ BHCVCVCVCVCPCPCPBkBHBgBHBgBHBgBgBgBHBHAoAoAh_A_A________________ _ABHBHCVCVCVCPCPCPCPCPBHBHBgBgBHBHBHAoAoAh_A_A__________________ ___A_ABHBHCVCVCVCVCPCPCPBkBHBHBHAoBHAoAh_A_A____________________ _______A_ABHBHCVCVCVCPCPCPCPBHAoBHAoAh_A_A______________________ ___________A_ABHBHCVCVCVCVCPBHBHAoAh_A_A________________________ _______________A_ABHBHCVCVCPAoAoAh_A_A__________________________ ___________________A_ABHBHCPBHAh_A_A____________________________ _______________________A_AAoAh_A_A______________________________ ___________________________A_A_A________________________________ ________________________________________________________________ } # tile 338 (dark green) { ________________________________________________________________ _______________________________X_X_X____________________________ _____________________________T_X_X_T_T_T________________________ ___________________________X_X_T_T_X_X_X_T_X____________________ _________________________X_X_X_T_X_X_X_T_X_X_X_X________________ _______________________X_T_X_T_T_T_X_T_X_X_X_T_X_X_X____________ _____________________X_X_T_T_X_X_T_T_X_X_T_T_X_X_T_X_X__________ ___________________X_X_X_T_X_X_X_T_X_X_X_T_X_X_X_T_X_X_X_T______ _________________X_X_X_X_T_T_T_T_X_T_X_X_T_X_X_X_T_X_X_T_X_T____ _______________X_T_T_T_T_X_X_X_T_T_X_T_T_T_X_T_T_T_X_X_X_X_T_Q__ _____________T_X_X_X_X_T_X_X_T_X_X_X_X_T_T_T_T_T_T_T_T_X_T_T_Q__ ___________X_T_X_X_T_T_X_X_T_T_T_T_T_T_X_T_X_T_X_X_X_X_T_T_Q_Q_A _________T_X_X_T_X_T_X_T_T_X_T_X_X_T_X_X_X_T_X_X_X_X_T_T_Q_Q_N_A _______X_T_X_X_T_X_T_X_X_T_X_X_T_T_X_T_T_X_X_T_X_X_TCI_Q_Q_N_L_A _____X_X_X_T_T_X_X_T_X_X_X_T_X_T_X_T_T_X_X_X_T_X_T_T_QBv_N_L_A_A ___X_X_X_X_T_X_X_X_T_X_X_X_T_X_T_X_T_T_X_T_X_X_T_T_Q_QBv_L_A_A__ _X_T_X_T_T_T_X_X_X_T_X_T_T_X_T_T_T_X_T_X_X_X_T_T_Q_Q_NBW_A_A____ _X_X_T_X_X_X_X_T_T_T_T_X_X_T_T_T_X_X_X_T_X_T_T_Q_Q_N_L_A_A______ ___X_X_X_X_T_T_T_T_X_T_T_T_X_X_T_X_X_X_X_T_T_Q_Q_N_L_A_A________ __CPCP_X_X_X_X_X_T_X_X_X_X_X_X_T_X_T_X_T_T_Q_Q_N_L_A_A__________ __CPCPCPBk_X_X_X_T_X_X_X_X_X_T_T_X_X_T_T_Q_Q_N_L_A_A____________ __CVCPCPCPCPCP_X_T_X_T_T_T_T_X_X_X_T_T_Q_Q_N_L_A_A______________ _XCVCVCVCVCPCPCPBk_X_X_X_T_X_X_X_T_T_Q_Q_N_L_A_A________________ _A_X_XCVCVCVCPCPCPCPCP_X_T_X_X_T_T_Q_Q_N_L_A_A__________________ ___A_A_X_XCVCVCVCVCPCPCPBk_X_T_T_Q_Q_N_L_A_A____________________ _______A_A_X_XCVCVCVCVCPCPCP_T_Q_Q_N_L_A_A______________________ ___________A_A_X_XCVCVCVCVCP_T_Q_N_L_A_A________________________ _______________A_A_X_XCVCVCP_Q_N_L_A_A__________________________ ___________________A_A_X_XCP_N_L_A_A____________________________ _______________________A_A_L_L_A_A______________________________ ___________________________A_A_A________________________________ ________________________________________________________________ } # tile 339 (turquoise) { ________________________________________________________________ ______________________________BhBhBI____________________________ ____________________________BIBhBIBIBhBh________________________ __________________________BhBIBIBIBhBhBIBhBh____________________ ________________________BhBhBIBIBhBhBhBIBhBIBhBI________________ ______________________BIBIBhBIBIBIBhBhBIBhBIBIBIBhBh____________ ____________________BhBhBIBIBhBIBhBhBhBhBIBIBhBhBIBhBI__________ __________________BhBhBIBhBIBIBIBIBIBhBIBIBhBhBhBIBhBIBhBh______ ________________BIBhBhBhBIBIBhBhBIBhBIBIBIBhBhBIBIBhBIBhBIBI____ ______________BIBIBhBIBIBIBhBhBhBhBIBIBhBIBIBhBIBhBIBhBIBhBIBn__ ____________BhBhBIBIBIBhBhBIBhBIBIBhBIBhBhBIBIBhBhBIBIBhBIBIAp__ __________BIBhBhBhBIBIBhBhBIBIBhBhBhBIBhBhBIBIBIBhBIBIBIBIApBI_A ________BIBIBhBhBhBIBhBIBIBhBIBIBhBhBIBIBhBhBIBIBIBhBIBIBIApAp_A ______BhBhBIBhBhBIBhBIBhBhBIBIBIBhBhBhBIBIBIBhBIBhBICIApBIApAi_A ____BhBhBhBIBhBIBhBIBIBhBhBIBhBIBIBIBIBIBhBIBhBhBIBIBIBvApAi_A_A __BIBhBhBIBIBIBIBhBIBhBhBhBIBIBIBhBIBhBIBIBhBIBIBIBIApBvAi_A_A__ BIBhBIBIBIBIBhBhBIBIBhBhBIBIBIBhBIBIBhBIBhBIBIBIApBIApBW_A_A____ BhBhBIBhBhBIBhBhBhBIBhBIBIBIBIBhBhBhBhBIBIBIBIBIApApAi_A_A______ __BhBIBhBhBIBIBhBIBhBhBIBhBhBIBIBhBhBhBhBIBIApBIApAi_A_A________ __CPCPBhBhBIBhBIBhBhBIBIBhBhBhBIBIBhBIBIBIBIBnApAi_A_A__________ __CPCPCPBkBIBIBhBhBIBIBIBIBIBhBhBhBIBIBIApApApAi_A_A____________ __CVCPCPCPCPCPBIBIBIBIBhBhBIBIBIBIBhBIApBIApAi_A_A______________ BICVCVCVCVCPCPCPBkBIBhBIBhBIBhBhBhBIBIApApAi_A_A________________ _ABIBICVCVCVCPCPCPCPCPBIBIBhBhBIBIApBIApAi_A_A__________________ ___A_ABIBICVCVCVCVCPCPCPBkBIBIBIBIApApAi_A_A____________________ _______A_ABIBICVCVCVCPCPCPCPBIApBnApAi_A_A______________________ ___________A_ABIBICVCVCVCVCPBIBIApAi_A_A________________________ _______________A_ABIBICVCVCVApApAi_A_A__________________________ ___________________A_ABIBICPApAi_A_A____________________________ _______________________A_AApAi_M_A______________________________ ___________________________A_A_A________________________________ ________________________________________________________________ } # tile 340 (cyan) { ________________________________________________________________ _______________________________y_y_v____________________________ _____________________________v_y_v_v_y_y________________________ ___________________________y_v_v_v_y_y_v_y_y____________________ _________________________y_y_v_v_y_y_y_v_y_v_y_v________________ _______________________v_v_y_v_v_v_y_y_v_y_v_v_v_y_y____________ _____________________y_y_v_v_y_v_y_y_y_y_v_v_y_y_v_y_v__________ ___________________y_y_v_y_v_v_v_v_v_y_v_v_y_y_y_v_y_v_y_y______ _________________v_y_y_y_v_v_y_y_v_y_v_v_v_y_y_v_v_y_v_y_v_v____ _______________v_v_y_v_v_v_y_y_y_y_v_v_y_v_v_y_v_y_v_y_v_y_v_s__ _____________y_y_v_v_v_y_y_v_y_v_v_y_v_y_y_v_v_y_y_v_v_y_v_v_s__ ___________v_y_y_y_v_v_y_y_v_v_y_y_y_v_y_y_v_v_v_y_v_v_v_v_s_s_A _________v_v_y_y_y_v_y_v_v_y_v_v_y_y_v_v_y_y_v_v_v_y_v_v_s_s_o_A _______y_y_v_y_y_v_y_v_y_y_v_v_v_y_y_y_v_v_v_y_v_y_vCI_s_s_o_j_A _____y_y_y_v_y_v_y_v_v_y_y_v_y_v_v_v_v_v_y_v_y_y_v_v_sBv_o_j_A_A ___v_y_y_v_v_v_v_y_v_y_y_y_v_v_v_y_v_y_v_v_y_v_v_v_s_sBv_j_A_A__ _v_y_v_v_v_v_y_y_v_v_y_y_v_v_v_y_v_v_y_v_y_v_v_v_s_s_oBW_A_A____ _y_y_v_y_y_v_y_y_y_v_y_v_v_v_v_y_y_y_y_v_v_v_v_s_s_o_j_A_A______ ___y_v_y_y_v_v_y_v_y_y_v_y_y_v_v_y_y_y_y_v_v_s_s_o_j_A_A________ __CPCP_y_y_v_y_v_y_y_v_v_y_y_y_v_v_y_v_v_v_s_s_o_j_A_A__________ __CPCPCPBk_v_v_y_y_v_v_v_v_v_y_y_y_v_v_v_s_s_o_j_A_A____________ __CVCPCPCPCPCP_v_v_v_v_y_y_v_v_v_v_y_v_s_s_o_j_A_A______________ _vCVCVCVCVCPCPCPBk_v_y_v_y_v_y_y_y_v_s_s_o_j_A_A________________ _A_v_vCVCVCVCPCPCPCPCP_v_v_y_y_v_v_s_s_o_j_A_A__________________ ___A_A_v_vCVCVCVCVCPCPCPBk_v_v_v_s_s_o_j_A_A____________________ _______A_A_v_vCVCVCVCPCPCPCP_v_s_s_o_j_A_A______________________ ___________A_A_v_vCVCVCVCVCP_v_s_o_j_A_A________________________ _______________A_A_v_vCVCVCP_s_o_j_A_A__________________________ ___________________A_A_v_vCP_s_j_A_A____________________________ _______________________A_A_o_j_A_A______________________________ ___________________________A_A_A________________________________ ________________________________________________________________ } # tile 341 (light blue) { ________________________________________________________________ _______________________________k_k_g____________________________ _____________________________g_k_g_g_k_k________________________ ___________________________k_g_g_g_k_k_g_k_k____________________ _________________________k_k_g_g_k_k_k_g_k_g_k_g________________ _______________________g_g_k_g_g_g_k_k_g_k_g_g_g_k_k____________ _____________________k_k_g_g_k_g_k_k_k_k_g_g_k_k_g_k_g__________ ___________________k_k_g_k_g_g_g_g_g_k_g_g_k_k_k_g_k_g_k_k______ _________________g_k_k_k_g_g_k_k_g_k_g_g_g_k_k_g_g_k_g_k_g_g____ _______________g_g_k_g_g_g_k_k_k_k_g_g_k_g_g_k_g_k_g_k_g_k_g_f__ _____________k_k_g_g_g_k_k_g_k_g_g_k_g_k_k_g_g_k_k_g_g_k_g_g_f__ ___________g_k_k_k_g_g_k_k_g_g_k_k_k_g_k_k_g_g_g_k_g_g_g_g_f_f_A _________g_g_k_k_k_g_k_g_g_k_g_g_k_k_g_g_k_k_g_g_g_k_g_g_f_f_b_A _______k_k_g_k_k_g_k_g_k_k_g_g_g_k_k_k_g_g_g_k_g_k_gCI_f_f_b_a_A _____k_k_k_g_k_g_k_g_g_k_k_g_k_g_g_g_g_g_k_g_k_k_g_g_fBv_b_a_A_A ___g_k_k_g_g_g_g_k_g_k_k_k_g_g_g_k_g_k_g_g_k_g_g_g_f_fBv_a_A_A__ _g_k_g_g_g_g_k_k_g_g_k_k_g_g_g_k_g_g_k_g_k_g_g_g_f_f_bBW_A_A____ _k_k_g_k_k_g_k_k_k_g_k_g_g_g_g_k_k_k_k_g_g_g_g_f_f_b_a_A_A______ ___k_g_k_k_g_g_k_g_k_k_g_k_k_g_g_k_k_k_k_g_g_f_f_b_a_A_A________ __CPCP_k_k_g_k_g_k_k_g_g_k_k_k_g_g_k_g_g_g_f_f_b_a_A_A__________ __CPCPCPBk_g_g_k_k_g_g_g_g_g_k_k_k_g_g_g_f_f_b_a_A_A____________ __CVCPCPCPCPCP_g_g_g_g_k_k_g_g_g_g_k_g_f_f_b_a_A_A______________ _gCVCVCVCVCPCPCPBk_g_k_g_k_g_k_k_k_g_f_f_b_a_A_A________________ _A_g_gCVCVCVCPCPCPCPCP_g_g_k_k_g_g_f_f_b_a_A_A__________________ ___A_A_g_gCVCVCVCVCPCPCPBk_g_g_g_f_f_b_a_A_A____________________ _______A_A_g_gCVCVCVCPCPCPCP_g_f_f_b_a_A_A______________________ ___________A_A_g_gCVCVCVCVCP_g_f_b_a_A_A________________________ _______________A_A_g_gCVCVCP_f_b_a_A_A__________________________ ___________________A_A_g_gCP_f_a_A_A____________________________ _______________________A_A_b_a_A_A______________________________ ___________________________A_A_A________________________________ ________________________________________________________________ } # tile 342 (dark blue) { ________________________________________________________________ _______________________________K_K_K____________________________ _____________________________J_K_K_J_J_J________________________ ___________________________K_K_J_J_K_K_K_J_K____________________ _________________________K_K_K_J_K_K_K_J_K_K_K_K________________ _______________________K_J_K_J_J_J_K_J_K_K_K_J_K_K_K____________ _____________________K_K_J_J_K_K_J_J_K_K_J_J_K_K_J_K_K__________ ___________________K_K_K_J_K_K_K_J_K_K_K_J_K_K_K_J_K_K_K_J______ _________________K_K_K_K_J_J_J_J_K_J_K_K_J_K_K_K_J_K_K_J_K_J____ _______________K_J_J_J_J_K_K_K_J_J_K_J_J_J_K_J_J_J_K_K_K_K_J_I__ _____________J_K_K_K_K_J_K_K_J_K_K_K_K_J_J_J_J_J_J_J_J_K_J_J_I__ ___________K_J_K_K_J_J_K_K_J_J_J_J_J_J_K_J_K_J_K_K_K_K_J_J_I_I_A _________J_K_K_J_K_J_K_J_J_K_J_K_K_J_K_K_K_J_K_K_K_K_J_J_I_I_H_A _______K_J_K_K_J_K_J_K_K_J_K_K_J_J_K_J_J_K_K_J_K_K_JCI_I_I_H_G_A _____K_K_K_J_J_K_K_J_K_K_K_J_K_J_K_J_J_K_K_K_J_K_J_J_IBv_H_G_A_A ___K_K_K_K_J_K_K_K_J_K_K_K_J_K_J_K_J_J_K_J_K_K_J_J_I_IBv_G_A_A__ _K_J_K_J_J_J_K_K_K_J_K_J_J_K_J_J_J_K_J_K_K_K_J_J_I_I_HBW_A_A____ _K_K_J_K_K_K_K_J_J_J_J_K_K_J_J_J_K_K_K_J_K_J_J_I_I_H_G_A_A______ ___K_K_K_K_J_J_J_J_K_J_J_J_K_K_J_K_K_K_K_J_J_I_I_H_G_A_A________ __CPCP_K_K_K_K_K_J_K_K_K_K_K_K_J_K_J_K_J_J_I_I_H_G_A_A__________ __CPCPCPBk_K_K_K_J_K_K_K_K_K_J_J_K_K_J_J_I_I_H_G_A_A____________ __CVCPCPCPCPCP_K_J_K_J_J_J_J_K_K_K_J_J_I_I_H_G_A_A______________ _KCVCVCVCVCPCPCPBk_K_K_K_J_K_K_K_J_J_I_I_H_G_A_A________________ _A_K_KCVCVCVCPCPCPCPCP_K_J_K_K_J_J_I_I_H_G_A_A__________________ ___A_A_K_KCVCVCVCVCPCPCPBk_K_J_J_I_I_H_G_A_A____________________ _______A_A_K_KCVCVCVCPCPCPCP_J_I_I_H_G_A_A______________________ ___________A_A_K_KCVCVCVCVCP_J_I_H_G_A_A________________________ _______________A_A_K_KCVCVCP_I_H_G_A_A__________________________ ___________________A_A_K_KCP_I_G_A_A____________________________ _______________________A_A_H_G_A_A______________________________ ___________________________A_A_A________________________________ ________________________________________________________________ } # tile 343 (indigo) { ________________________________________________________________ _______________________________G_G_G____________________________ _____________________________F_G_G_F_F_F________________________ ___________________________G_G_F_F_G_G_G_F_G____________________ _________________________G_G_G_F_G_G_G_F_G_G_G_G________________ _______________________G_F_G_F_F_F_G_F_G_G_G_F_G_G_F____________ _____________________G_G_F_F_G_G_F_F_G_G_F_F_G_G_F_G_G__________ ___________________G_G_G_F_G_G_G_F_G_G_G_F_G_G_G_F_G_G_G_F______ _________________G_G_G_G_F_F_F_F_G_F_G_G_F_G_G_G_F_G_G_F_G_F____ _______________G_F_F_F_F_G_G_G_F_F_G_F_F_F_G_F_F_F_G_G_G_G_F_E__ _____________F_G_G_G_G_F_G_G_F_G_G_G_G_F_F_F_F_F_F_F_F_G_F_F_E__ ___________G_F_G_G_F_F_G_G_F_F_F_F_F_F_G_F_G_F_G_G_G_G_F_F_E_E_A _________F_G_G_F_G_F_G_F_F_G_F_G_G_F_G_G_G_F_G_G_F_G_F_F_E_E_D_A _______G_F_G_G_F_G_F_G_G_F_G_G_F_F_G_F_F_G_G_F_G_G_FCI_E_E_D_D_A _____G_G_G_F_F_G_G_F_G_G_G_F_G_F_G_F_F_G_G_G_F_G_F_F_EBv_D_D_A_A ___G_G_G_G_F_G_G_G_F_G_G_G_F_G_F_G_F_F_G_F_G_G_F_F_E_EBv_D_A_A__ _G_F_G_F_F_F_G_G_G_F_G_F_F_G_F_F_F_G_F_G_G_G_F_F_E_E_DBW_A_A____ _G_G_F_G_G_G_G_F_F_F_F_G_G_F_F_F_G_G_G_F_G_F_F_E_E_D_D_A_A______ ___G_G_G_G_F_F_F_F_G_F_F_F_G_G_F_F_G_G_G_F_F_E_E_D_D_A_A________ __CPCP_G_G_G_G_G_F_G_G_G_G_G_G_F_G_F_G_F_F_E_E_D_D_A_A__________ __CPCPCPBk_G_G_G_F_G_G_G_G_G_F_F_G_G_F_F_E_E_D_D_A_A____________ __CVCPCPCPCPCP_G_F_G_F_F_F_F_G_G_G_F_F_E_E_D_D_A_A______________ _GCVCVCVCVCPCPCPBk_G_G_G_F_G_G_G_F_F_E_E_D_D_A_A________________ _A_G_GCVCVCVCPCPCPCPCP_G_F_G_G_F_F_E_E_D_D_A_A__________________ ___A_A_G_GCVCVCVCVCPCPCPBk_G_F_F_E_E_D_D_A_A____________________ _______A_A_G_GCVCVCVCVCPCPCP_F_E_E_D_D_A_A______________________ ___________A_A_G_GCVCVCVCVCP_F_E_D_D_A_A________________________ _______________A_A_G_GCVCVCP_E_D_D_A_A__________________________ ___________________A_A_G_GCP_E_D_A_A____________________________ _______________________A_A_C_D_A_A______________________________ ___________________________A_A_A________________________________ ________________________________________________________________ } # tile 344 (magenta) { ________________________________________________________________ ______________________________CwCwCa____________________________ ____________________________CaCwCaCaCwCw________________________ __________________________CwCaCaCaCwCwCaCwCw____________________ ________________________CwCwCaCaCwCwCwCaCwCaCwCa________________ ______________________CaCaCwCaCaCaCwCwCaCwCaCaCaCwCw____________ ____________________CwCwCaCaCwCaCwCwCwCwCaCaCwCwCaCwCa__________ __________________CwCwCaCwCaCaCaCaCaCwCaCaCwCwCwCaCwCaCwCw______ ________________CaCwCwCwCaCaCwCwCaCwCaCaCaCwCwCaCaCwCaCwCaCa____ ______________CaCaCwCaCaCaCwCwCwCwCaCaCwCaCaCwCaCwCaCwCaCwCaCD__ ____________CwCwCaCaCaCwCwCaCwCaCaCwCaCwCwCaCaCwCwCaCaCwCaCaCD__ __________CaCwCwCwCaCaCwCwCaCaCwCwCwCaCwCwCaCaCaCwCaCaCaCaCDCD_A ________CaCaCwCwCwCaCwCaCaCwCaCaCwCwCaCaCwCwCaCaCaCwCaCaCDCDBq_A ______CwCwCaCwCwCaCwCaCwCwCaCaCaCwCwCwCaCaCaCwCaCwCaBvCDCDBqBP_A ____CwCwCwCaCwCaCwCaCaCwCwCaCwCaCaCaCaCaCwCaCwCwCaCaCDBvBqBP_A_A __CaCwCwCaCaCaCaCwCaCwCwCwCaCaCaCwCaCwCaCaCwCaCaCaCDCDBvBP_A_A__ CaCwCaCaCaCaCwCwCaCaCwCwCaCaCaCwCaCaCwCaCwCaCaCaCDCDBqBW_A_A____ CwCwCaCwCwCaCwCwCwCaCwCaCaCaCaCwCwCwCwCaCaCaCaCDCDBqBP_A_A______ __CwCaCwCwCaCaCwCaCwCwCaCwCwCaCaCwCwCwCwCaCaCDCDBqBP_A_A________ __CPCPCwCwCaCwCaCwCwCaCaCwCwCwCaCaCwCaCaCaCDCDBqBP_A_A__________ __CPCPCPBkCaCaCwCwCaCaCaCaCaCwCwCwCaCaCaCDCDBqBP_A_A____________ __CVCPCPCPCPCPCaCaCaCaCwCwCaCaCaCaCwCaCDCDBqBP_A_A______________ CaCVCVCVCVCPCPCPBkCaCwCaCwCaCwCwCwCaCDCDBqBP_A_A________________ _ACaCaCVCVCVCPCPCPCPCPCaCaCwCwCaCaCDCDBqBP_A_A__________________ ___A_ACaCaCVCVCVCVCPCPCPBkCaCaCaCDCDBqBP_A_A____________________ _______A_ACaCaCVCVCVCPCPCPCPCaCDCDBqBP_A_A______________________ ___________A_ACaCaCVCVCVCVCPCaCDBqBP_A_A________________________ _______________A_ACaCaCVCVCPCDBqBP_A_A__________________________ ___________________A_ACaCaCPCDBP_A_A____________________________ _______________________A_ABqBP_A_A______________________________ ___________________________A_A_A________________________________ ________________________________________________________________ } # tile 345 (purple) { ________________________________________________________________ ______________________________BPBPBP____________________________ ____________________________AsBPBPAsAsAs________________________ __________________________BPBPAsAsBPBPBPAsBP____________________ ________________________BPBPBPAsBPBPBPAsBPBPBPAs________________ ______________________BPAsBPAsAsAsBPAsBPBPBPAsBPBPBP____________ ____________________BPBPAsAsBPBPAsAsBPBPAsAsBPBPAsBPBP__________ __________________BPAsBPAsBPBPBPAsBPBPBPAsBPBPBPAsBPBPBPAs______ ________________BPBPBPBPBPAsAsAsBPAsBPBPAsBPBPBPAsBPBPAsBPAs____ ______________BPAsAsAsBPBPBPBPAsAsBPAsBPAsBPAsAsBPBPAsBPBPAsAV__ ____________AsBPBPBPBPAsBPBPAsBPBPBPBPAsAsAsAsBPAsAsAsBPAsAsAV__ __________BPAsBPBPAsAsBPBPAsAsAsAsAsAsBPAsBPAsBPBPBPBPAsAsAVAV_A ________AsBPBPAsBPAsBPAsAsBPAsBPBPAsBPBPBPAsAsBPBPBPAsAsAVAVAH_A ______BPAsBPBPAsBPAsBPBPAsBPBPAsAsBPAsAsBPBPAsBPBPAsCIAVAVAH_L_A ____BPBPBPAsAsBPBPAsBPBPBPAsBPAsBPAsBPAsBPBPAsBPAsAsAVBvAH_L_A_A __BPBPBPBPAsBPBPBPAsBPBPBPAsBPAsBPBPAsBPAsAsBPAsAsAVAVBv_L_A_A__ BPAsBPAsAsAsBPBPBPAsBPAsAsBPAsBPAsBPAsBPBPBPAsAsAVAVAHBW_A_A____ BPBPAsBPBPBPBPAsAsAsAsBPBPAsAsAsBPBPBPAsBPAsAsAVAVAH_L_A_A______ __BPBPBPBPAsAsAsBPBPAsAsAsBPBPAsBPAsBPBPAsAsAVAVAH_L_A_A________ __CPCPBPBPBPBPBPAsBPBPBPBPBPBPAsBPAsBPAsAsAVAVAH_L_A_A__________ __CPCPCPBkBPBPBPAsBPBPBPBPBPAsAsBPBPAsAsAVAVAH_L_A_A____________ __CVCPCPCPCPCPBPAsBPAsAsAsAsBPAsBPAsAsAVAVAH_L_A_A______________ BPCVCVCVCVCPCPCPBkBPBPBPAsBPBPBPAsAsAVAVAH_L_A_A________________ _ABPBPCVCVCVCPCPCPCPCPBPAsBPBPAsAsAVAVAH_L_A_A__________________ ___A_ABPBPCVCVCVCVCPCPCPBkBPAsAsAVAVAH_L_A_A____________________ _______A_ABPBPCVCVCVCVCPCPCPAsAVAVAH_L_A_A______________________ ___________A_ABPBPCVCVCVCVCPAsAVAH_L_A_A________________________ _______________A_ABPBPCVCVCPAVAH_L_A_A__________________________ ___________________A_ABPBPCPAV_L_A_A____________________________ _______________________A_AAH_L_A_A______________________________ ___________________________A_A_A________________________________ ________________________________________________________________ } # tile 346 (violet) { ________________________________________________________________ ______________________________BQBQBC____________________________ ____________________________BCBQBCBCBQBQ________________________ __________________________BQBCBCBCBQBQBCBQBQ____________________ ________________________BQBQBCBCBQBQBQBCBQBCBQBC________________ ______________________BCBCBQBCBCBCBQBQBCBQBCBCBCBQBQ____________ ____________________BQBQBCBCBQBCBQBQBQBQBCBCBQBQBCBQBC__________ __________________BQBQBCBQBCBCBCBCBCBQBCBCBQBQBQBCBQBCBQBQ______ ________________BCBQBQBQBCBCBQBQBCBQBCBCBCBQBQBCBCBQBCBQBCBC____ ______________BCBCBQBCBCBCBQBQBQBQBCBCBQBCBCBQBCBQBCBQBCBQBCAt__ ____________BQBQBCBCBCBQBQBCBQBCBCBQBCBQBQBCBCBQBQBCBCBQBCBCAt__ __________BCBQBQBQBCBCBQBQBCBCBQBQBQBCBQBQBCBCBCBQBCBCBCBCAtAt_A ________BCBCBQBQBQBCBQBCBCBQBCBCBQBQBCBCBQBQBCBCBCBQBCBCAtAtAk_A ______BQBQBCBQBQBCBQBCBQBQBCBCBCBQBQBQBCBCBCBQBCBQBCBvAtAtAkAW_A ____BQBQBQBCBQBCBQBCBCBQBQBCBQBCBCBCBCBCBQBCBQBQBCBCAtBvAkAW_A_A __BCBQBQBCBCBCBCBQBCBQBQBQBCBCBCBQBCBQBCBCBQBCBCBCAtAtBvAW_A_A__ BCBQBCBCBCBCBQBQBCBCBQBQBCBCBCBQBCBCBQBCBQBCBCBCAtAtAkBW_A_A____ BQBQBCBQBQBCBQBQBQBCBQBCBCBCBCBQBQBQBQBCBCBCBCAtAtAkAW_A_A______ __BQBCBQBQBCBCBQBCBQBQBCBQBQBCBCBQBQBQBQBCBCAtAtAkAW_A_A________ __CPCPBQBQBCBQBCBQBQBCBCBQBQBQBCBCBQBCBCBCAtAtAkAW_A_A__________ __CPCPCPBkBCBCBQBQBCBCBCBCBCBQBQBQBCBCBCAtAtAkAW_A_A____________ __CVCPCPCPCPCPBCBCBCBCBQBQBCBCBCBCBQBCAtAtAkAW_A_A______________ BCCVCVCVCVCPCPCPBkBCBQBCBQBCBQBQBQBCAtAtAkAW_A_A________________ _ABCBCCVCVCVCPCPCPCPCPBCBCBQBQBCBCAtAtAkAW_A_A__________________ ___A_ABCBCCVCVCVCVCPCPCPBkBCBCBCAtAtAkAW_A_A____________________ _______A_ABCBCCVCVCVCPCPCPCPBCAtAtAkAW_A_A______________________ ___________A_ABCBCCVCVCVCVCPBCAtAkAW_A_A________________________ _______________A_ABCBCCVCVCPAtAkAW_A_A__________________________ ___________________A_ABCBCCPAtAW_A_A____________________________ _______________________A_AAkAW_A_A______________________________ ___________________________A_A_A________________________________ ________________________________________________________________ } # tile 347 (tan) { ________________________________________________________________ ______________________________CICIBv____________________________ ____________________________BvCIBvBvCICI________________________ __________________________CIBvBvBvCICIBvCICI____________________ ________________________CICIBvBvCICICIBvCIBvCIBv________________ ______________________BvBvCIBvBvBvCICIBvCIBvBvBvCICI____________ ____________________CICIBvBvCIBvCICICICIBvBvCICIBvCIBv__________ __________________CICIBvCIBvBvBvBvBvCIBvBvCICICIBvCIBvCICI______ ________________BvCICICIBvBvCICIBvCIBvBvBvCICIBvBvCIBvCIBvBv____ ______________BvBvCIBvBvBvCICICICIBvBvCIBvBvCIBvCIBvCIBvCIBvBW__ ____________CICIBvBvBvCICIBvCIBvBvCIBvCICIBvBvCICIBvBvCIBvBvBW__ __________BvCICICIBvBvCICIBvBvCICICIBvCICIBvBvBvCIBvBvBvBvBWBW_A ________BvBvCICICIBvCIBvBvCIBvBvCICIBvBvCICIBvBvBvCIBvBvBWBWAz_A ______CICIBvCICIBvCIBvCICIBvBvBvCICICIBvBvBvCIBvCIBvCIBWBWAzAb_A ____CICICIBvCIBvCIBvBvCICIBvCIBvBvBvBvBvCIBvCICIBvBvBWBvAzAb_A_A __BvCICIBvBvBvBvCIBvCICICIBvBvBvCIBvCIBvBvCIBvBvBvBWBWBvAb_A_A__ BvCIBvBvBvBvCICIBvBvCICIBvBvBvCIBvBvCIBvCIBvBvBvBWBWAzBW_A_A____ CICIBvCICIBvCICICIBvCIBvBvBvBvCICICICIBvBvBvBvBWBWAzAb_A_A______ __CIBvCICIBvBvCIBvCICIBvCICIBvBvCICICICIBvBvBWBWAzAb_A_A________ __CPCPCICIBvCIBvCICIBvBvCICICIBvBvCIBvBvBvBWBWAzAb_A_A__________ __CPCPCPBkBvBvCICIBvBvBvBvBvCICICIBvBvBvBWBWAzAb_A_A____________ __CVCPCPCPCPCPBvBvBvBvCICIBvBvBvBvCIBvBWBWAzAb_A_A______________ BvCVCVCVCVCPCPCPBkBvCIBvCIBvCICICIBvBWBWAzAb_A_A________________ _ABvBvCVCVCVCPCPCPCPCPBvBvCICIBvBvBWBWAzAb_A_A__________________ ___A_ABvBvCVCVCVCVCPCPCPBkBvBvBvBWBWAzAb_A_A____________________ _______A_ABvBvCVCVCVCVCPCPCPBvBWBWAzAb_A_A______________________ ___________A_ABvBvCVCVCVCVCPBvBWAzAb_A_A________________________ _______________A_ABvBvCVCVCPBWAzAb_A_A__________________________ ___________________A_ABvBvCPBWAb_A_A____________________________ _______________________A_AAzAb_A_A______________________________ ___________________________A_A_A________________________________ ________________________________________________________________ } # tile 348 (plaid) { ________________________________________________________________ ______________________________CuCuCu____________________________ ____________________________CuCuCuBoBoCj________________________ __________________________BoBoCuBoBoCjBoBoCu____________________ ________________________CjBoBoAqAqCjCEBoCuCuCu_A________________ ______________________BoBRCj_qAq_qAqBoCuCuCu_ACuCuCu____________ ____________________CuBoAqAuAq_AAqAqAqBoCu_ACuCuCuBoBoCj________ __________________CuCuCuBoAq_qAq_tCjCjBo_ACuCuCuBoBoCjBoBo______ _________________ACuCuBoBoCjAuAqBoCBBo_LCjBoBoAqAqCjCEBoCuCY____ ______________CuCu_A_ABoCjCBBoCuCuBo_ABoBRCj_qAq_qAqBoCuCuCYCB__ ____________CuCuCuBoBo_A_LBoCuCuCu_ACuBoAqAuAq_AAqAqAqCuCYCYCB__ __________BoBoCuBoBoCjBoBo_A_ACu_ACuCuCuBoAq_qAq_tCjBoBoCYCBCB_A ________CjBoBoAqAqCjCEBoCuCuCu_A_ACuCuBoBoCjBNAqBoCBCjBoBoCBBo_A ______BoBRCj_qAq_qAqBoCuCuCu_ACuCu_A_ABoCjBoBoCuBoBoBoCjBoBoBN_A ____CuBoAqAuAq_AAqAqAqBoCu_ACuCuCuBoBo_L_zBoCuCuCYBoBoByBoBN_A_A __CuCuCuBoAq_qAq_tCjCjBo_ACuCuCuBoBoCjBoBo_A_LCYCYCBBoBaBN_A_A__ CuCuCuBoBoCjAuAqBoCBBo_LCjBoBoAqAqCjCEBoCuCuCY_ACBCBBoAz_L_A____ CuCuBoBoCjCBBoCuCuBo_ABoBRCj_qAq_qAqBoCuCuCYCYCB_ABoBN_L_A______ __BoBoCjCEBoCuCuCu_ACuBoAqAuAq_AAqAqAqCuCYCYCBCB_ABN_A_A________ __CPCPBoBoCuCuCu_ACuCuCuBoAq_qAq_tCjBoBoCYCBCBBo_A_A_A__________ __CPCPCOCPCpCu_ACuCuCuBoBoCjBNAqBoCBCjBoBoCBBoBN_A_A____________ __CVCPCPCPCPCPCuCuCuBoBoCjBoBoCuBoBoCECjBoBoBN_A_A______________ CuCVCVCVCPCPCPBnCJBoBoCjCEBoCuCuCYBoBoByBoBN_A_A________________ _ACuCuCVCVCVCVCPCPCPCPBoBoCuCuCYCYCBBoBaBN_A_A__________________ ___A_ACuCuCVCVCVCVCPCPCPCOCpCYCYCBCBBoAz_L_A____________________ _______A_ACuCuCVCVCVCPCPCPCPCYCBCBBoBN_A_A______________________ ___________A_ACuCuCVCVCVCVCPCYCBBoBN_A_A________________________ _______________A_ACuCuCVCVCPCBBoBN_A_A__________________________ ___________________A_ACuCuCPCBBN_A_A____________________________ _______________________A_ABoBN_A_A______________________________ ___________________________A_A_A________________________________ ________________________________________________________________ } # tile 349 (light brown) { ________________________________________________________________ ______________________________CdCdCG____________________________ ____________________________CGCdCGCGCdCd________________________ __________________________CdCGCGCGCdCdCGCdCd____________________ ________________________CdCdCGCGCdCdCdCGCdCGCdCG________________ ______________________CGCGCdCGCGCGCdCdCGCdCGCGCGCdCd____________ ____________________CdCdCGCGCdCGCdCdCdCdCGCGCdCdCGCdCG__________ __________________CdCdCGCdCGCGCGCGCGCdCGCGCdCdCdCGCdCGCdCd______ ________________CGCdCdCdCGCGCdCdCGCdCGCGCGCdCdCGCGCdCGCdCGCG____ ______________CGCGCdCGCGCGCdCdCdCdCGCGCdCGCGCdCGCdCGCdCGCdCGBt__ ____________CdCdCGCGCGCdCdCGCdCGCGCdCGCdCdCGCGCdCdCGCGCdCGCGBt__ __________CGCdCdCdCGCGCdCdCGCGCdCdCdCGCdCdCGCGCGCdCGCGCGCGBtBt_A ________CGCGCdCdCdCGCdCGCGCdCGCGCdCdCGCGCdCdCGCGCGCdCGCGBtBtBT_A ______CdCdCGCdCdCGCdCGCdCdCGCGCGCdCdCdCGCGCGCdCGCdCGBvBtBtBTAx_A ____CdCdCdCGCdCGCdCGCGCdCdCGCdCGCGCGCGCGCdCGCdCdCGCGBtBvBTAx_A_A __CGCdCdCGCGCGCGCdCGCdCdCdCGCGCGCdCGCdCGCGCdCGCGCGBtBtBvAx_A_A__ CGCdCGCGCGCGCdCdCGCGCdCdCGCGCGCdCGCGCdCGCdCGCGCGBtBtBTBW_A_A____ CdCdCGCdCdCGCdCdCdCGCdCGCGCGCGCdCdCdCdCGCGCGCGBtBtBTAx_A_A______ __CdCGCdCdCGCGCdCGCdCdCGCdCdCGCGCdCdCdCdCGCGBtBtBTAx_A_A________ __B9B9CdCdCGCdCGCdCdCGCGCdCdCdCGCGCdCGCGCGBtBtBTAx_A_A__________ __CPCPB9B9CGCGCdCdCGCGCGCGCGCdCdCdCGCGCGBtBtBTAx_A_A____________ __CVCVCPCPB9B9CGCGCGCGCdCdCGCGCGCGCdCGBtBtBTAx_A_A______________ CGCVCVCVCVCPCPB9B9CGCdCGCdCGCdCdCdCGBtBtBTAx_A_A________________ _ACGCGCVCVCVCVCPCPB9B9CGCGCdCdCGCGBtBtBTAx_A_A__________________ ___A_ACGCGCVCVCVCVCPCPB9B9CGCGCGBtBtBTAx_A_A____________________ _______A_ACGCGCVCVCVCVCPCPB9CGBtBtBTAx_A_A______________________ ___________A_ACGCGCVCVCVCVCPCGBtBTAx_A_A________________________ _______________A_ACGCGCVCVCPBtBTAx_A_A__________________________ ___________________A_ACGCGB9BtAx_A_A____________________________ _______________________A_ABTAx_A_A______________________________ ___________________________A_A_A________________________________ ________________________________________________________________ } # tile 350 (dark brown) { ________________________________________________________________ ______________________________ATATAT____________________________ ____________________________AGATATAGAGAG________________________ __________________________ATATAGAGATATATAGAT____________________ ________________________ATATATAGATATATAGATATATAG________________ ______________________ATAGATAGAGAGATAGATATATAGATATAT____________ ____________________ATATAGAGATATAGAGATATAGAGATATAGATAT__________ __________________ATAGATAGATATATAGATATATAGATATATAGATATATAG______ ________________ATATATATATAGAGAGATAGATATAGATATATAGATATAGATAG____ ______________ATAGAGAGATATATATAGAGATAGATAGATAGAGATATAGATATAG_$__ ____________AGATATATATAGATATAGATATATATAGAGAGAGATAGAGAGATAGAG_$__ __________ATAGATATAGAGATATAGAGAGAGAGAGATAGATAGATATATATAGAG_$_$_A ________AGATATAGATAGATAGAGATAGATATAGATATATAGAGATATATAGAG_$_$_$_A ______ATAGATATAGATAGATATAGATATAGAGATAGAGATATAGATATAGCI_$_$_$_L_A ____ATATATAGAGATATAGATATATAGATAGATAGATAGATATAGATAGAG_$Bv_$_L_A_A __ATATATATAGATATATAGATATATAGATAGATATAGATAGAGATAGAG_$_$Bv_L_A_A__ ATAGATAGAGAGATATATAGATAGAGATAGATAGATAGATATATAGAG_$_$_$BW_A_A____ ATATAGATATATATAGAGAGAGATATAGAGAGATATATAGATAGAG_$_$_$_L_A_A______ __ATATATATAGAGAGATATAGAGAGATATAGATAGATATAGAG_$_$_$_L_A_A________ __CPCPATATATATATAGATATATATATATAGATAGATAGAG_$_$_$_L_A_A__________ __CPCPCPBkAXATATAGATATATATATAGAGATATAGAG_$_$_$_L_A_A____________ __CVCPCPCPCPCPATAGATAGAGAGAGATAGATAGAG_$_$_$_L_A_A______________ ATCVCVCVCVCPCPCKBmATATATAGATATATAGAG_$_$_$_L_A_A________________ _AATATCVCVCVCVCPCPCPCPATAGATATAGAG_$_$_$_L_A_A__________________ ___A_AATATCVCVCVCVCPCPCKBmATAGAG_$_$_$_L_A_A____________________ _______A_AATATCVCVCVCVCPCPCPAG_$_$_$_L_A_A______________________ ___________A_AATATCVCVCVCVCPAG_$_$_L_A_A________________________ _______________A_AATATCVCVCP_$_$_L_A_A__________________________ ___________________A_AATATCP_z_L_A_A____________________________ _______________________A_A_$_L_A_A______________________________ ___________________________A_A_A________________________________ ________________________________________________________________ } # tile 351 (gray) { ________________________________________________________________ ______________________________BdBdBD____________________________ ____________________________BDBdBDBDBdBd________________________ __________________________BdBDBDBDBdBdBDBdBd____________________ ________________________BdBdBDBDBdBdBdBDBdBDBdBD________________ ______________________BDBDBdBDBDBDBdBdBDBdBDBDBDBdBd____________ ____________________BdBdBDBDBdBDBdBdBdBdBDBDBdBdBDBdBD__________ __________________BdBdBDBdBDBDBDBDBDBdBDBDBdBdBdBDBdBDBdBd______ ________________BDBdBdBdBDBDBdBdBDBdBDBDBDBdBdBDBDBdBDBdBDBD____ ______________BDBDBdBDBDBDBdBdBdBdBDBDBdBDBDBdBDBdBDBdBDBdBDBJ__ ____________BdBdBDBDBDBdBdBDBdBDBDBdBDBdBdBDBDBdBdBDBDBdBDBDAj__ __________BDBdBdBdBDBDBdBdBDBDBdBdBdBDBdBdBDBDBDBdBDBDBDBDAlBJ_A ________BDBDBdBdBdBDBdBDBDBdBDBDBdBdBDBDBdBdBDBDBDBdBDBDBDAlAl_A ______BdBdBDBdBdBDBdBDBdBdBDBDBDBdBdBdBDBDBDBdBDBdBDBvAlBJAlAe_A ____BdBdBdBDBdBDBdBDBDBdBdBDBdBDBDBDBDBDBdBDBdBdBDBDBDBvAlAe_A_A __BDBdBdBDBDBDBDBdBDBdBdBdBDBDBDBdBDBdBDBDBdBDBDBDBDAlBvAe_A_A__ BDBdBDBDBDBDBdBdBDBDBdBdBDBDBDBdBDBDBdBDBdBDBDBDAlBJAlBW_A_A____ BdBdBDBdBdBDBdBdBdBDBdBDBDBDBDBdBdBdBdBDBDBDBDBJAjAlAe_A_A______ __BdBDBdBdBDBDBdBDBdBdBDBdBdBDBDBdBdBdBdBDBDAlBDAlAe_A_A________ __CPCPBdBdBDBdBDBdBdBDBDBdBdBdBDBDBdBDBDBDAjBJAlAe_A_A__________ __CPCPCPBkBdBDBdBdBDBDBDBDBDBdBdBdBDBDBDBJAlAlAe_A_A____________ __CVCPCPCPBnCPBDBDBDBDBdBdBDBDBDBDBdBDAlBDAlAe_A_A______________ BDCVCVCVCVCPCPCJCPBDBdBDBdBDBdBdBdBDBJAjAlAe_A_A________________ _ABDBDCVCVCVCVCPCPBnCPBDBDBdBdBDBDBDAlAlAe_A_A__________________ ___A_ABDBDCVCVCVCVCPCPCJBnBDBDBDAlBDAlAe_A_A____________________ _______A_ABDBDCVCVCVCVCPCPCPBDAjBJAlAe_A_A______________________ ___________A_ABDBDCVCVCVCVCPBDBJAlAe_A_A________________________ _______________A_ABDBDCVCVCPAlAlAe_A_A__________________________ ___________________A_ABDBDCPAlAe_A_A____________________________ _______________________A_AAlAe_A_A______________________________ ___________________________A_A_A________________________________ ________________________________________________________________ } # tile 352 (wrinkled) { ________________________________________________________________ _______________________________i_i_i____________________________ _____________________________d_i_i_d_d_d________________________ ___________________________iBLBLBLBL_i_d_d_i____________________ _________________________i_i_i_i_iBL_i_d_i_d_d_d________________ _______________________i_i_iBL_i_d_d_d_i_iBL_d_d_i_i____________ _____________________i_iBL_i_d_d_d_d_d_i_d_iBLBLBL_i_i__________ ___________________i_i_d_d_i_d_i_i_i_d_i_d_i_i_i_iBL_i_i_d______ _________________d_d_i_i_d_i_i_iBL_i_i_i_d_d_d_d_d_i_i_i_i_d____ _______________i_d_d_d_i_d_iBLBL_i_i_i_d_d_d_d_d_d_d_d_i_i_d_Y__ _____________d_i_d_i_iBL_i_d_i_i_i_i_d_d_i_d_i_i_i_d_d_i_d_d_Y__ ___________i_d_d_d_i_iBL_i_d_d_d_d_d_d_d_i_iBLBLBL_i_i_d_d_Y_Y_A _________d_i_d_d_i_iBL_i_i_d_d_d_d_d_i_i_iBL_i_i_i_i_d_d_Y_Y_U_A _______i_d_i_i_d_i_iBLBL_i_d_i_i_i_iBLBL_i_i_i_d_d_dCI_Y_Y_U_L_A _____i_iBL_i_i_d_d_i_iBL_i_i_i_d_d_d_i_iBLBL_d_i_d_d_YBv_U_L_A_A ___i_iBL_i_i_d_d_i_d_iBLBL_i_d_d_d_d_d_i_i_i_i_d_d_Y_YBv_L_A_A__ _i_dBL_iBL_i_d_d_d_d_d_iBL_i_d_d_d_i_d_d_d_i_d_d_Y_Y_UBW_A_A____ _i_iBL_i_i_i_d_d_i_i_d_d_i_d_d_i_i_i_d_d_d_d_d_Y_Y_U_L_A_A______ ___i_i_i_d_d_d_iBLBL_i_d_d_d_d_iBL_i_i_i_d_d_Y_Y_U_L_A_A________ __CPCP_i_d_d_d_i_d_iBLBL_i_d_d_iBL_i_d_d_d_Y_Y_U_L_A_A__________ __CPCPCPBk_d_i_i_d_d_i_i_i_d_i_iBL_i_d_d_Y_Y_U_L_A_A____________ __CVCPCPCPCPCP_i_d_i_d_d_i_d_dBL_i_d_d_Y_Y_U_L_A_A______________ _iCVCVCVCVCPCPCPBk_i_i_i_d_i_i_i_d_d_Y_Y_U_L_A_A________________ _A_i_iCVCVCVCPCPCPCPCP_i_d_i_i_d_d_Y_Y_U_L_A_A__________________ ___A_A_i_iCVCVCVCVCPCPCPBk_i_d_d_Y_Y_U_L_A_A____________________ _______A_A_i_iCVCVCVCVCPCPCP_d_Y_Y_U_L_A_A______________________ ___________A_A_i_iCVCVCVCVCP_d_Y_U_L_A_A________________________ _______________A_A_i_iCVCVCP_Y_U_L_A_A__________________________ ___________________A_A_i_iCP_U_L_A_A____________________________ _______________________A_A_U_L_A_A______________________________ ___________________________A_A_A________________________________ ________________________________________________________________ } # tile 353 (dusty) { ________________________________________________________________ ________________________________________________________________ ____________BSBSBwCGBjBkBkBwCGBmBkBlCGBjCGBmBkBlCJBmBwCG_A_A____ ________BSBSBSBiBkBmBkCOBwCJBmBkBwCJBmBkBmBxBzCGBjCKBkBm_A_A_A__ ______BSBSBSCPCPCPCPCPCPCPCPCPCVCPCPCPCVCPCPCPCPCPCPBwBk_z_A_A__ ______BSBSBSCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCTBk_A_A_A__ ______BSBSBSBkBwCGBmBwCGBjBkBwCGBjCGBkBkBwBkBwBkCPCPBtBm_B_A_A__ ______BSBSBSCGBmBwBkCGBjCGBjCGBmCGBwBmBwCOBwCGBmCPCPCGBw_A_A_A__ ______BSBSBSBjCGBkBzBkBwBkBzCGBcCGBzCGBwBtBzBkBwCPCPBmCG_A_A_A__ ______BSBSBSCJBmBwCGBzCGBjCGBjCGBMCGBcCGBmCGBwCJCPCPBkBj_A_A_A__ ______BSBSBSBkBwCGBmCGBjCGBbCJBjBzBkBwCGBjBwBbBwCPCPCJBw_A_A_A__ ______BSBSBSBjCGBjCGBjBtBzCGBjCGBlCJBzBkBzCGBkCJCPCPBmBw_A_A_A__ ______BSBSBSCGBmBtBjCGBzBkBwBkBzCGBjCGBkBwCGBzBwCPCPBkCG_L_A_A__ ______BSBSBSBkBwBzCGBcBwCGBzBwCGBmBtBwBzCGBjBwBkCPCPBwBk_A_A_A__ ______BSBSBSBwCJBjCGBzBkBwBtBkBwBwBzCGBkBwBkCJBmCPCPCGBm_z_A_A__ ______BSBSBSCGBcCGBcCGBwCGBzCGBzCGBxBmCGBzCGBjCGCPCPBzBl_A_A_A__ ______BSBSBSBmCGBmCGBmBtBzBkBlBzBtBjCGBMBwBzCGBmCPCPCGBk_L_A_A__ ______BSBSBSBwBkBwBMCGBjCJBwBkCGBzCGBjCJBkBwBkCGCPCPBjBw_A_A_A__ ______BSBSBSCGBzCGBzBwCGBjCGBzBkBwBjCGBzBwBkBwBjCPCPCJBj_z_A_A__ ______BSBSBiBkBcCGBwBtBzBkBjCGBjCGBkBwBkBkCGBzCJCPCPBmCG_A_A_A__ ______BSBSBSBwCGBmBwCGBjCGBzCGBjCGBzCGBzBwCGBjBtCPCPBkBk_L_A_A__ ______BSBSBSBwBmCGBbCGBjBkCGBMCJBbBwBkBjCGBjCGBmCPCPCOBl_A_A_A__ ______BSBSBSBkCGBjCGBmCGBjBzCGBjCGBmCGBwBbCGBmBwCPCPBwBk_z_A_A__ ______BSBSBSBmCGBzBjCGBjCGBkBkBwBmCGBwBkCOBtBwCGCPCPCGBw_A_A_A__ ______BSBSBSBwBkBkCGBzBtBzBwCGBzCGBjBkBwBkBwBmCGCPCPBcCG_L_A_A__ _______ABSBSBmCGBwBkBwBmCGBwBkBwBtBjCGBzCGBjCGBmCP_A_A_L_A_A_A__ _______A_ABSBkCOBwBkCJBwBkBzCJBmCGBmBkBwCGBmCGBk_A_A_A_A_A_A_A__ _______A_A_A_B_A_A_A_L_A_A_A_B_A_A_A_z_A_A_A_L_A_A_A_A_A_A_A_A__ _________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A______ ___________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A__________ ________________________________________________________________ ________________________________________________________________ } # tile 354 (bronze) { ________________________________________________________________ ______________________________Az________________________________ ____________________________AzAzAzAz____________________________ __________________________AzAzAzAzAzAzAz________________________ ________________________BWBWBWBWBWBWBWBWBWBW____________________ ______________________BvBvBvBvBvBvBvBvBvBvBvBvBv________________ ____________________CICICICICICICICICICICICICICICICI____________ __________________CfCfCfCfCfCfCfCfCfCfCfCfCfCfCfCfCfCfCf________ ________________CICICICICICICICICICICICICICICICICICICICICI______ ______________BvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBv____ ____________BWBWBWBWBWBWBWBWBWBWBWBWBWBWBWBWBWBWBWBWBWBWAzBWCI__ __________BWBWBWBWBWBWBWBWBWBWBWBWBWBWBWBWBWBWBWBWBWBWAzBWCIBW_A ________AzAzAzAzAzAzAzAzAzAzAzAzAzAzAzAzAzAzAzAzAzAzAzAzCIBWAz_A ______AzAzAzAzAzAzAzAzAzAzAzAzAzAzAzAzAzAzAzAzAzAzAzCfCIBWAzAz_A ____AzAzAzAzAzAzAzAzAzAzAzAzAzAzAzAzAzAzAzAzAzAzAzBWCICIAzAz_A_A __BWBWBWBWBWBWBWBWBWBWBWBWBWBWBWBWBWBWBWBWBWBWAzBWCIBWBvAz_A_A__ BWBWBWBWBWBWBWBWBWBWBWBWBWBWBWBWBWBWBWBWBWBWAzBWCIBWAzBW_A_A____ BvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvAzBWCIBWAzAz_A_A______ __CICICICICICICICICICICICICICICICICICICIAzBWCIBWAzAz_A_A________ __BkBkCfCfCfCfCfCfCfCfCfCfCfCfCfCfCfCfAzBWCIBWAzAz_A_A__________ __CPCPBkBkCICICICICICICICICICICICICIAzBWCIBWAzAz_A_A____________ __CPCPCPCPCPBkBvBvBvBvBvBvBvBvBvBvAzBWCIBWAzAz_A_A______________ BWCVCVCPCPBkCPBkBkBWBWBWBWBWBWBWAzBWCIBWAzAz_A_A________________ _ABWBWCVCVCPCPCPCPCPBkAzAzAzAzAzBWCIBWAzAz_A_A__________________ ___A_ABWBWCVCVCPCPBkCPBkBkAzAzBWCIBWAzAz_A_A____________________ _______A_ABWBWCVCVCPCPCPCPBkBWCIBWAzAz_A_A______________________ ___________A_ABWBWCVCVCPCPCPCIBWAzAz_A_A________________________ _______________A_ABWBWCVCVCPBvAzAz_A_A__________________________ ___________________A_ABWBWCPBvAz_A_A____________________________ _______________________A_ABWAz_A_A______________________________ ___________________________A_A_A________________________________ ________________________________________________________________ } # tile 355 (copper) { ________________________________________________________________ ______________________________BS________________________________ ____________________________BSBSBSBS____________________________ __________________________BSBSBSBSBSBSBS________________________ ________________________BsBsBsBsBsBsBsBsBsBs____________________ ______________________CECECECECECECECECECECECECE________________ ____________________CbCbCbCbCbCbCbCbCbCbCbCbCbCbCbCb____________ __________________CxCxCxCxCxCxCxCxCxCxCxCxCxCxCxCxCxCxCx________ ________________CECECECECECECECECECECECECECECECECECECECECE______ ______________BsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBS____ ____________BsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBSBsCb__ __________BSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBsCbBs_A ________BSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSCbBsBS_A ______BsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsCfCbBsBSBS_A ____BSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBsCbCIBSBS_A_A __BsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBSBsCbBsBvBS_A_A__ BsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBSBsCbBsBSBW_A_A____ CECECECECECECECECECECECECECECECECECECECECEBSBsCbBsBSBS_A_A______ __CxCxCxCxCxCxCxCxCxCxCxCxCxCxCxCxCxCxCxBSBsCbBsBSBS_A_A________ __BkBkCbCbCbCbCbCbCbCbCbCbCbCbCbCbCbCbBSBsCbBsBSBS_A_A__________ __CPCPBkBkCECECECECECECECECECECECECEBSBsCbBsBSBS_A_A____________ __CPCPCPCPCPBkBsBsBsBsBsBsBsBsBsBsBSBsCbBsBSBS_A_A______________ BsCVCVCPCPBkCPBkBkBsBsBsBsBsBsBSBSBsCbBsBSBS_A_A________________ _ABsBsCVCVCPCPCPCPCPBkBSBSBSBSBSBsCbBsBSBS_A_A__________________ ___A_ABsBsCVCVCPCPBkCPBkBkBiBSBsCbBsBSBS_A_A____________________ _______A_ABsBsCVCVCPCPCPCPBkBsCbBsBSBS_A_A______________________ ___________A_ABsBsCVCVCPCPCPCbBsBSBS_A_A________________________ _______________A_ABsBsCVCVCPCEBSBS_A_A__________________________ ___________________A_ABsBsCPCEBS_A_A____________________________ _______________________A_ABiBS_A_A______________________________ ___________________________A_A_A________________________________ ________________________________________________________________ } # tile 356 (silver) { ________________________________________________________________ ______________________________Bd________________________________ ____________________________BdBdBdBd____________________________ __________________________BdBdBdBdBdBdBd________________________ ________________________BkBkCPBkBkBnCJBkBkBn____________________ ______________________CPCVCPCPCPCPCPCPCVCPCPCPCP________________ ____________________CmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCm____________ __________________C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$________ ________________CmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCm______ ______________CPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCP____ ____________BkBkCPBkBkBnCJBkBkBnCJBkBnBkCJBMCJBMCJBMCJBMBdBkCm__ __________CPBkCPBkBkCPBkBkCPBkCJBnBkCJBnCJBnBkCPBkCPBkBkCJCoBk_A ________BdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdCmBkBk_A ______BdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdCfCmBnBdBd_A ____BdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBdBkCmCIBdBd_A_A __CJBMCJBMCJBMCJBMCJBkBnCJBkBnBkCJBnBkBkCJBnBkBdBkCoBkBvBd_A_A__ BkBnCJBnCJBnCJBnCJBnBkCJBMCPBkCJBnBkCJBnBkCJBdBnCmCJBkBW_A_A____ CPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPBdCJCmBkBdBd_A_A______ __CmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmBdBnCmBkBkBd_A_A________ __BkBkC$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$BkBkCmBkBdBd_A_A__________ __CPCPBkBkCoCmCmCmCmCmCmCmCmCmCmCmCmBdBkCoBkBkBd_A_A____________ __CPCPCPCPBkBkCPCPCPCPCPCPCPCPCPCPBdBkCoBkBdBd_A_A______________ BkCVCVCPCPCPCPBkBkCPBkBkBkCPBkBkBkBkCoBkBkBd_A_A________________ _zBnBkCVCVCPCPCPCPBkBkBkBdBdBdBkBkCoBkBdBd_A_A__________________ ___A_zBkBkCVCVCPCPCPCPBkBkBkBdBkCoBkBkBd_A_A____________________ _______M_zBnBkCVCVCPCPCPCPBkBkCoBkBdBd_A_A______________________ ___________A_zBkBkCVCVCPCPCPCmBkBkBd_A_A________________________ _______________z_MBkBkCVCVCPCPBdBd_A_A__________________________ ___________________z_MBkBkCPCPBd_A_A____________________________ _______________________z_MBkBd_A_A______________________________ ___________________________z_A_A________________________________ ________________________________________________________________ } # tile 357 (gold) { ________________________________________________________________ ______________________________CL________________________________ ____________________________BbCLBZCL____________________________ __________________________BvCLBZCLCLBZCL________________________ ________________________CLCUCLCLCLCLCLCLCLCL____________________ ______________________CrCrCrCrCrCrCrCrCrCrCrCrCr________________ ____________________CsCsCsCsCsCsCsCsCsCsCsCsCsCsCsCs____________ __________________CtCtCtCtCtCtCtCtCtCtCtCtCtCtCtCtCtCtCt________ ________________CsCsCsCsCsCsCsCsCsCsCsCsCsCsCsCsCsCsCsCsCs______ ______________CrCrCrCrCrCrCrCrCrCrCrCrCrCrCrCrCrCrCrCrCrCrCr____ ____________CLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCs__ __________CLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLBbCLCsCL_A ________CLBbCLBZCLCLBZCLBbCLBZCLBbCLBZCLBbCLBZCLCLBZCLCLCrCLCL_A ______BbCLBvCLBvCLBbCLBvCLBZCLCLBvCLCLBZCLBvCLCLBZCLCfCrCLCLBb_A ____CLBvCLBtCLBbCLCFBzCGCLBvCGBZCLBtCLCLBtCLBZCLBtCLCsCICLBZ_z_z __CLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCUBvCLCsCLBvBb_z_A__ CLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCLCsCLCLBW_z_A____ CrCrCrCrCrCrCrCrCrCrCrCrCrCrCrCrCrCrCrCrCrBZCLCsCLCLBb_A_A______ __CsCsCsCsCsCsCsCsCsCsCsCsCsCsCsCsCsCsCsCLCLCsCLBbCI_A_z________ __BkBkCtCtCtCtCtCtCtCtCtCtCtCtCtCtCtCtBZCLCsCUBvCL_B_A__________ __CPCPBkBkCsCsCsCsCsCsCsCsCsCsCsCsCsCLCLCsCLCLBb_z_A____________ __CPCPCPCPCPBkCrCrCrCrCrCrCrCrCrCrBbCLCsCLCLBb_z_A______________ CLCVCVCPCPBkCPBkBkCUCLCLCLCLCLCLCLCLCsCLBZCL_A_A________________ _ACLCLCVCVCPCPCPCPBkBkCLBbCLBZCLCLCrCLCLCL_A_A__________________ ___A_ACLCLCVCVCPCPCPCPBkCJCLBbCLCsCLCLBZ_A_A____________________ _______A_ACLCLCVCVCPCPCPCPBkCLCsCLCLBb_z_A______________________ ___________A_ACLCLCVCPCPCPCPCsCLBvCL_A_A________________________ _______________A_ACLCLCVCPCPCrCLBz_A_A__________________________ ___________________A_ACLCLCPCrBZ_z_A____________________________ _______________________A_ACLCL_z_A______________________________ ___________________________A_A_A________________________________ ________________________________________________________________ } # tile 358 (glittering) { ________________________________________________________________ ______________________________BD________________________________ ____________________________AoBDBcBc____________________________ __________________________BDBDAoBcBcBcBX________________________ ________________________BFBLBLBLBjBmBjBwBwBw____________________ ______________________BMBMBmBmBmCOCOCOCJCJCJBxBx________________ ____________________BnBnBnBmCRBmClClClCgCgCgChChChCQ____________ __________________CQCSBnCSCRCRCRCoCtCoCgCXChChCoChCQCQCQ________ ________________BlBlBnBnBnBmBmBmCOCOCOCnCJCJCKCKCKBlBlBlBl______ ______________BKBKBKBMBMBMBLBLBLBzCOBjBwBwBwBxBxBxBKBKBKBKBK____ ____________BxBKBKBKBMBMBMBLBLBLBkBzBkBwBwBwBxBxBxBKBKBKBKBDBl__ __________BYBYBYAjBYAiBDAiBcAjBcBcBcBjBXBXBXBYBYBYAmBDBKAfCQBl_A ________BYBYBYAjAmBDBDApBDAoBDAoBcBcBcBXBXBXBYBYBYBDBYAjCQBlBK_A ______BwBYBYBYBDAmBYAiBDAiBDAoBDBcBcBcBXBXBXBYBYBYBKAmBlBlBKBK_A ____BwBwBxBxBxBKBKBKBMBMBMBLBLBLBjBmBjBwBwBwBxBxBxBYCPBlBKBK_A_A __BwBwBwBxBxBxBKBKBKBMBMBMBLBLBLBkBzCTBwBwBwBxBxBYChBxBKBK_A_A__ BwBwBwBwBxBxBxBKBKBKBMBMBMBLBLBLCNBkBmBwBwBwBxBYChBxBYBK_B_A____ CJCJCJCJCKCKCKBlBlBlBnBnBnBmBmBmCOCOCOCJCJBwBXChBxBYBY_A_A______ __CiChCXChCoChCQCQCQCVBICVCRCRCRCtCoCtChBwBXCgBxBYBY_A_A________ __CPCJCgChChChCQBlCQBnBnBnCRBmCRClClClBwBXCgCJBXBY_A_A__________ __CPBnCJBlCKCKBlBlBlBFBMBFBmBmBmCOCOBzBjCgCJBXBX_A_A____________ __CPCPCPCPCJBkBKBKBKAiBdAiBLBLBLBzBkBcClCJBXBX_A_A______________ BwCVCVCPCPBnCPBkCJBKBdAiBdBLBLBLBkBjClBjBjBX_A_A________________ _ABwBxCVCVCPCPCPCPBnBkBdAiBLBLBLBcClBmBcBc_A_A__________________ ___A_ABxBxCVCVCPCPCJBnBkCJBLBLAjBmBzBcBc_A_A____________________ _______A_ABKBKCVCVCPCPCPCPBMBcBmBLBLBc_A_A______________________ ___________A_ABKBFCVCVCPCPCPBmBLBLBD_A_A________________________ _______________A_ABMBMCVCVCPBLBLBD_L_A__________________________ ___________________A_ABLBLCPBLAh_A_A____________________________ _______________________A_ABLBD_A_A______________________________ ___________________________A_A_A________________________________ ________________________________________________________________ } # tile 359 (shining) { ________________________________________________________________ ________________________________________________________________ ____________CmCmBkBkCPBkBkBnCJBkBkBnCJBkBnBkCJBMCJBMCJBM_z_A____ ________CmCmCmCmBnCJBkBnCJBkBnCJBnCJBkBnCJBkCPBkBnCJBnCJ_A_A_A__ ______CmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmBkBn_A_A_A__ ______CmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCJBk_A_A_A__ ______CmCmCmC$C$C$C$C$CPC$CPCPCPCPBkCPBkBnCJBkBnCmCmBnCJ_A_A_A__ ______CmCmCmC$C$C$C$C$C$CPC$CPCPCPCPBnCPCJBnBkCJCmCmBkBk_A_A_A__ ______CmCmCmCPC$C$C$C$C$C$CPC$CPCPCPCPCJCPBkCPBkCmCmCPBk_M_A_A__ ______CmCmCmC$CPC$C$C$C$C$C$CPC$CPCPCPCPBkCVBkBkCmCmBkBk_A_A_A__ ______CmCmCmCPC$CPC$C$C$C$C$C$CPC$CPCPCPCPBkCVBnCmCmCPBk_z_A_A__ ______CmCmCmCPCPC$CPC$C$C$C$C$C$CPC$CPCPCPCPCJCPCmCmBkBk_A_A_A__ ______CmCmCmCPCPCPC$CPC$C$C$C$C$C$CPC$CPCPCPCPBkCoCmCPBk_M_A_A__ ______CmCmCmCPCPCPCPC$CPC$C$C$C$C$C$CPC$CPCPCPCPCmCmBMCJ_A_A_A__ ______CmCmCmBkCPCPCPCPC$CPC$C$C$C$C$C$CPC$CPCPCPCmCmCJBn_A_A_A__ ______CmCmCmCVBkCPCPCPCPC$CPC$C$C$C$C$C$CPC$CPCPCmCoBkBk_A_A_A__ ______CmCmCmBkCVBkCVCPCPCPC$CPC$C$C$C$C$C$CPC$CPCmCmBkCP_A_A_A__ ______CmCmCmCPBkCVBkCPCPCPCPC$CPC$C$C$C$C$C$CPC$CmCmBnBk_A_A_A__ ______CmCmCmBkBkCPCPBkCPCPCPCPC$CPC$C$C$C$C$C$CPCmCmCJBk_M_A_A__ ______CmCmCmBkCPBkBkCVBkCPCPCPCPC$CPC$C$C$C$C$C$CmCmBnBk_A_A_A__ ______CmCmCmBkBkCPBkCPCPBkCVCPCPCPC$CPC$C$C$C$C$CmCmCJBk_M_A_A__ ______CmCmCoBkCPBkBkBkBkCVBkCPCPCPCPC$CPC$C$C$C$CmCmBnCJ_A_A_A__ ______CmCmCmBkBkCPBkCPBkCPCPBkCPCPCPCPC$CPC$C$C$CmCmBkBn_A_A_A__ ______CmCmCoBkCPBkBkCPBkBkBkCVBkCPCPCPCPC$CPC$C$CmCmCJBk_A_A_A__ ______CmCmCmBkBkCPBkBkCPBkCPBkCVBkCPCPCPCPC$CPC$CmCmBnCJ_A_A_A__ ______CmCmCoBkCPBkBkCPBkBkBkCPBkCVBkCPCPCPCPC$CPCm_A_A_A_A_A_A__ _______ACmCmBkBkCPBkBkCPBkCPBkBkCPCPBkCVCPCPCPC$_A_A_A_A_A_A_A__ _______A_A_A_M_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A__ _________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A______ ___________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A__________ ________________________________________________________________ ________________________________________________________________ } # tile 360 (dull) { ________________________________________________________________ ________________________________________________________________ ____________AYAYAzBWAzAgAzBWAzAgAzBWAzAgAzBWAzAgAzBWAzAg_z_A____ ________AYAYAYAYAgAzAgAzBWAgAzBWAzAgBWAzBWAgAzBWAzAgBWAz_A_A_A__ ______AYAYAYBkCJBlCOBkCPBkBkBmBlBmCJBMBmBlBkCOBMBkCPAzAg_z_A_A__ ______AYAYAYBnBkCOBlBkBkBnCJBlCOBxBmCKBkCOBlBkCPBkBmAzAz_A_A_A__ ______AYAYAYBWAzAzBaAzBWAzAgBWAzAgBWAzBWAzBWAzAzBmCKAzAg_z_A_A__ ______AYAYAbAzAgAzAgAzAgBWAzAgBWAzAzAgAzAgAzAgBWBlBmAzBW_A_A_A__ ______AYAYAYAzBWBWAzBWAzAgBWAzAgAzBaAzBWAgBWAzAgCJBkBaAQ_A_A_A__ ______AYAYAYAgAzAgAbAMAYAYAYAYAYAYAYAMAYAXAgAzBWBkBnAzBW_A_A_A__ ______AYAYAYBWAzBWAJAYAYAYAYAYAYAYAYAYAYAYBWAzAgCJBkBWAg_A_A_A__ ______AYAYAbAzAgAzAY_A_AAYAY_A_AAY_A_A_AAbAzAgBWBkBnAzAz_A_A_A__ ______AYAYAYAzBWAgAYAYAYAYAYAYAYAYAYAYAYAYAzBWAzBnCJAgBW_A_A_A__ ______AYAYAYAgBWAzAYAY_A_AAYAY_A_AAYAYAYAbAzAgBWBkBmAzAz_A_A_A__ ______AYAYAYAzAzAgAYAYAYAYAYAYAYAYAYAYAYAYAzBWAgCKBkBWAg_A_A_A__ ______AYAYAYBWAgBWAzBWAgAzBWAzAzAgBWAzAzBWAgAzAzBkBmBWAz_A_A_A__ ______AYAYAYAzAzBWAgAzAzBaAQBWAgAzAzAgBWAgAzBaAzBnBkB_Ag_z_A_A__ ______AYAYAMBWAgAzAzAgBWAzAgAzBWAzBWAgAzBWAzAzAgCJBmBWAz_A_A_A__ ______AYAYAYAzBWAgBWAzAgAzBWAgAzAgBWAzAgAzAgBWAzBlBkBWAg_z_A_A__ ______AYAYAYAgAzAzAgAzBWAgAzBWAzBWAgAzBWAzBWAgAzCOBmAzAz_A_A_A__ ______AYAYAYBWAzBaAzBWAgAzBWAgAzAgAzBWAgAzAgBWAzBlBkBaAz_L_A_A__ ______AYAYAbAzAgAzAgAzBWAzAgAzBWAzBWAgAzBWAzAzBWBmCKAgAz_A_A_A__ ______AYAYAYAzBWAzBWAgAzBWAzAgAzAgAzBWAgAzAgBWAgBkBkBWAg_z_A_A__ ______AYAYAYAgAzAgAzBWAgAzAgBWAzBWAgAzAzAgBWAzAzCJBnBWAz_A_A_A__ ______AYAYAYBWAzBaAzAgAzBWAzAgBWAzBWAzBaAzAzAgBWBMBkBWAg_A_A_A__ ______AYAYAYAgAzAgAzBWAzAgBWAzAgAzAgBWAQBWAgAzAzCO_A_A_A_A_A_A__ _______AAYAYBWAzBWAgAzBWAzAgBWAzBWAzAgBWAzBWAgBW_B_A_A_A_A_A_A__ _______A_A_A_A_L_A_A_A_L_A_A_A_A_L_A_A_A_L_A_A_A_A_A_A_A_A_A_A__ _________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A______ ___________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A__________ ________________________________________________________________ ________________________________________________________________ } # tile 361 (thin) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBv_A_A_A_A_A__ ________BSBSCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPBv_A_A_A_A_A__ ________BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvCPBv_A_A_A_A_A__ ________BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvCPBv_A_A_A_A_A__ ________BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvCPBv_A_A_A_A_A__ ________BSBSBvBvBvBSBSBSBSBSBSBSBSBSBSBSBSBvBvBvCPBv_A_A_A_A_A__ ________BSBSBvBvBvBSBSBSBSBSBSBSBSBSBSBSBSBvBvBvCPBv_A_A_A_A_A__ ________BSBSBvBvBvBS_A_ABSBS_A_ABS_A_A_ABSBvBvBvCPBv_A_A_A_A_A__ ________BSBSBvBvBvBSBSBSBSBSBSBSBSBSBSBSBSBvBvBvCPBv_A_A_A_A_A__ ________BSBSBvBvBvBSBS_A_ABSBS_A_ABSBSBSBSBvBvBvCPBv_A_A_A_A_A__ ________BSBSBvBvBvBSBSBSBSBSBSBSBSBSBSBSBSBvBvBvCPBv_A_A_A_A_A__ ________BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvCPBv_A_A_A_A_A__ ________BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvCPBv_A_A_A_A_A__ ________BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvCPBv_A_A_A_A_A__ ________BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvCPBv_A_A_A_A_A__ ________BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvCPBv_A_A_A_A_A__ ________BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvCPBv_A_A_A_A_A__ ________BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvCPBv_A_A_A_A_A__ ________BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvCPBv_A_A_A_A_A__ ________BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvCPBv_A_A_A_A_A__ ________BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvCPBv_A_A_A_A_A__ ________BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvCPBv_A_A_A_A_A__ ________BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBv_A_A_A_A_A_A_A__ _________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A__ _________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A______ ___________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A__________ ________________________________________________________________ ________________________________________________________________ } # tile 362 (thick) { ________________________________________________________________ ________________________________________________________________ __________________BSBSBSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBv_A____ ________________BSBSBSCJBMCJBkBnBkCJBnBkBkCJBnBkBkCPBkBkBv_A_A__ ____________BSBSBSCPCPCPCPCPCPCPCPCPCPCPCVCPCPCPCPCPCPCPBv_A_A__ __________BSBSBkCPBkBkBnBkBnCJBkCPBkBkCPBkBkBkBnCJBkCPBkBv_A_A__ ________BSBSCPCPCPCPCVCPCPCPCPCPCPCPCPCPCPCVCPCPCPBnCPBkBv_A_A__ ______BSBSBSBkCJBnBkBkCJBkCJBkBnBkCJBnBkCJBnBkCJCPBkCPCKBv_A_A__ ______BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBnCPCJCPBmBv_A_A__ ______BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvCJCPBnCPBkBv_A_A__ ______BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBkCPBkCPCKBv_A_A__ ______BSBSBvBvBvBSBSBSBSBSBSBSBSBSBSBSBSBvBvBvBnCPCJCPBmBv_A_A__ ______BSBSBvBvBvBSBSBSBSBSBSBSBSBSBSBSBSBvBvBvBkCPBnCPBkBv_A_A__ ______BSBSBvBvBvBS_A_ABSBS_A_ABS_A_A_ABSBvBvBvCJCPBkCPCJBv_A_A__ ______BSBSBvBvBvBSBSBSBSBSBSBSBSBSBSBSBSBvBvBvBnCPCJCPBnBv_A_A__ ______BSBSBvBvBvBSBS_A_ABSBS_A_ABSBSBSBSBvBvBvBkCPBnCPBkBv_A_A__ ______BSBSBvBvBvBSBSBSBSBSBSBSBSBSBSBSBSBvBvBvCJCPBkCPCJBv_A_A__ ______BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBnCPCJCPBnBv_A_A__ ______BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBkCPBlCPBkBv_A_A__ ______BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvCJCPBmCPCJBv_A_A__ ______BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBnCPCJCPBnBv_A_A__ ______BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBkCPBlCPBkBv_A_A__ ______BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvCJCPBmCPCJBv_A_A__ ______BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBkCVBkCPBnBv_A_A__ ______BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBnCPCJCP_A_A_A_A__ ______BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBkCPBl_A_A_A_A_A__ ______BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvCJCP_L_A_A_A_A_A__ ______BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBm_A_A_A_A_A_A____ _______ABSBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBv_B_A_A_A_A_A______ _______A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A__________ _________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A____________ ________________________________________________________________ } # tile 363 (plain / blank paper) { ________________________________________________________________ ________________________________________________________________ ____________CmCmC$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_A_A____ ________CmCmCmCmC$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_A_A_A__ ______CmCmCmCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPC$C$_A_A_A__ ______CmCmCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPC$C$_A_A_A__ ______CmCmCmC$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$CPCPC$C$_A_A_A__ ______CmCmCmC$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$CPCPC$C$_A_A_A__ ______CmCmCmC$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$CPCPC$C$_A_A_A__ ______CmCmCmC$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$CPCPC$C$_A_A_A__ ______CmCmCmC$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$CPCPC$C$_A_A_A__ ______CmCmCmC$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$CPCPC$C$_A_A_A__ ______CmCmCmC$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$CPCPC$C$_A_A_A__ ______CmCmCmC$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$CPCPC$C$_A_A_A__ ______CmCmCmC$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$CPCPC$C$_A_A_A__ ______CmCmCmC$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$CPCPC$C$_A_A_A__ ______CmCmCmC$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$CPCPC$C$_A_A_A__ ______CmCmCmC$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$CPCPC$C$_A_A_A__ ______CmCmCmC$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$CPCPC$C$_A_A_A__ ______CmCmCmC$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$CPCPC$C$_A_A_A__ ______CmCmCmC$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$CPCPC$C$_A_A_A__ ______CmCmCmC$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$CPCPC$C$_A_A_A__ ______CmCmCmC$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$CPCPC$C$_A_A_A__ ______CmCmCmC$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$CPCPC$C$_A_A_A__ ______CmCmCmC$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$CPCPC$C$_A_A_A__ ______CmCmCmC$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$CP_A_A_A_A_A_A__ _______ACmCmC$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_A_A_A_A_A_A_A__ _______A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A__ _________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A______ ___________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A__________ ________________________________________________________________ ________________________________________________________________ } # tile 364 (papyrus / Book of the Dead) { ________________________________________________________________ ______________________________CsCsCs____________________________ ____________________________CLAeAeAeCLAe________________________ __________________________AeAeAeAeAeAeAeAeAe____________________ ________________________AeAeAeAeAeAeAeAeAeAeAeAe________________ ______________________AeAeAeAeAeAeAeAeAeC$C$CoAeAeAe____________ ____________________AeAeAeAeAeCVCVCVAeC$C$CoCoAeAeAeAe__________ __________________AeAeAeAeCVCVCVABABCPCPCoCoAeAeAeAeAeAeCL______ ________________AeAeAeAeCVCVABCPCPCPABABCPAeAeAeAeAeAeAeAeCs____ ______________AeAeAeAeCVCVABABABCPCPABCPCPAeAeAeAeAeAeAeAeCsAO__ ____________AeAeAeAeAeCVCVABABABCPCPCPCPCPCPAOAeAeAeAeAeCLArAO__ __________AeAeAeAeAeAeCVCVCPABCPCPABABCPBkCPAeAeAeAeAeAeAeAOAO_A ________AeAeAeAeAeAeAeAeCVCPCPCPABABABABCPBkAeAeAeAeAeAeAOAO_M_A ______AeAeAeAeAeAeAeAeCPCPBkCPCPABABABBkCPCPAeAeAeAeAeAOAOAK_M_A ____AeAeAeAeAeAeAeAeCPABCPCVBkCPCPCPCPCPBkAeAeAeAeAeAOAO_M_M_z_A __CLAeAeAeAeCLAeAeAeCPC$C$CPCPABABCPBkCPAeAeAeAeAeAOAOAB_z_A_A__ CsAeAeAeAeAeCLCLAeAeC$C$CoCoABABCPBkAlAeAeAeAeAeAOAO_M_z_A_A____ CsAeAeAeAeAeAeCLCLC$C$CoCoCPBnCPAeAeAeAeAeAeAeAOAO_zAB_A_A______ __CLAeAeAeAeAeAeCLCLCoCoAeAeAeAOAeAeAeAeAeAeAOAO_MAB_A_A________ __CPCPAeAeAeAeAeCrCLCLCLAeAeAeAeAeAeAeAeAeAOAOAA_M_A_A__________ __CPCPCPBkAlAeCrCrCrAeCLCLCLAeAeAeAeAeAeAOAO_MA__A_A____________ __CVCPCPCPBnCPAeCrAeAeAeAeCLCLAeAeAeAeAOAOAB_M_A_A______________ ABCVCVCVCVCPCPCJCPAeAeAeAeAeAeAeCsAeAOAO_M_z_A_A________________ _AABABCVCVCVCVCPCPBnCPAeAeAeAeCLCsAOAOAK_M_A_A__________________ ___A_AABABCVCVCVCVCPCPCJCPCLCLCsAOAO_M_M_z_A____________________ _______A_AABABCVCVCVCVCPCPCPAOAOAOAB_z_A_A______________________ ___________A_AABABCVCVCVCVCPAOAO_M_z_A_A________________________ _______________A_AABABCVCVCP_M_z_O_A_A__________________________ ___________________A_AABABCP_zAB_A_A____________________________ _______________________A_A_A_M_A_A______________________________ ___________________________A_A_A________________________________ ________________________________________________________________ } # tile 365 (glass) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________________________________________BkAEAi_A____ __________________________________________________AEAiASAS_A____ ________________________________________________ASASCPBkAi_A____ ______________________________________________BkAiASASAS_A_A____ ____________________________________________CPAiASASAi_A_A______ __________________________________________AEAECPAiAi_A_A________ ________________________________________BkAiASAS_A_A_A__________ ______________________________________CPAiAiAiBk_A______________ ____________________________________ASASCPBkAi_A_A______________ __________________________________BkAiASASAS_A_A________________ ________________________________CPAiASAS___A_A__________________ ______________________________AEAECPAiAi_A_A____________________ ____________________________BkAiASAS_A_A_A______________________ __________________________CPAiASASBk_A__________________________ ________________________ASASCPBkAi_A_A__________________________ ______________________BkAiASASAS_A_A____________________________ ____________________CPAiASASAi_A_A______________________________ __________________AEAECPAiAi_A_A________________________________ ________________BkAiASAS_A_A_A__________________________________ ______________CPAiASASAS_A______________________________________ ____________ASASCPAiBk_A_A______________________________________ __________BkAiASASAS_A_A________________________________________ ________CPAiASASAi_A_A__________________________________________ ______AEAEAiAiAi_A_A____________________________________________ _______ACPCP_A_A_A______________________________________________ _______A_A_A_A_A________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 366 (balsa) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________________________________________________CTCn_A____ __________________________________________________CTCnCiCn_z____ ________________________________________________CnCiCiClCl_A____ ______________________________________________CnCnCiCnCi_$_A____ ____________________________________________CnCnCnCiCn_z_A______ __________________________________________CTCTCnCnCn_z_A________ __________________________________________CnCnCn_A_z_A__________ ______________________________________CnCnCnCnCl_z______________ ____________________________________CnCiCiClCl_z_A______________ __________________________________CnCnCiCiCn_$_A________________ ________________________________CnCnCiCnCn_A_A__________________ ______________________________CTCTCnCnCn_z_A____________________ ______________________________CnCnCn_A_z_A______________________ __________________________CnCnCnCnCl_z__________________________ ________________________CnCiCiClCl_z_A__________________________ ______________________CnCnCiCnCi_$_A____________________________ ____________________CnCnCnCiCn_z_A______________________________ __________________CTCTCnCnCn_z_A________________________________ __________________CnCnCn_A_z_A__________________________________ ______________CnCnCnCnCl_z______________________________________ ____________CnCiCiClCl_z_A______________________________________ __________CnCnCiCiCn_$_A________________________________________ ________CnCnCiCnCn_A_A__________________________________________ ______CTCTCnCnCn_z_A____________________________________________ _______A_A_z_A_z_A______________________________________________ _______A_A_A_A_A________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 368 (maple) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________________________________________________AYAw_A____ __________________________________________________AYAwBSBS_A____ ________________________________________________BSBSBsBsBs_A____ ______________________________________________AwAwBSBSBS_A_A____ ____________________________________________AwAwBSBSAw_A_A______ __________________________________________AYAYAwAwAw_A_A________ __________________________________________AwAwAw_A_A_A__________ ______________________________________AwAwAwAwBs_A______________ ____________________________________BSBSBsBsBs_A_A______________ __________________________________AwAwBSBSBS_A_A________________ ________________________________AwAwBSBSAw_A_A__________________ ______________________________AYAYAwAwAw_A_A____________________ ______________________________AwAwAw_A_A_A______________________ __________________________AwAwAwAwBs_A__________________________ ________________________BSBSBsBsBs_A_A__________________________ ______________________AwAwBSBSBS_A_A____________________________ ____________________AwAwBSBSAw_A_A______________________________ __________________AYAYAwAwAw_A_A________________________________ __________________AwAwAw_A_A_A__________________________________ ______________AwAwAwAwBs_A______________________________________ ____________BSBSBsBsBs_A_A______________________________________ __________AwAwBSBSBS_A_A________________________________________ ________AwAwBSBSAw_A_A__________________________________________ ______AYAYAwAwAw_A_A____________________________________________ _______A_A_A_A_A_A______________________________________________ _______A_A_A_A_A________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 369 (pine) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________________________________________________AbAz_A____ __________________________________________________AbAzBWBW_A____ ________________________________________________BWBWBvBvBv_A____ ______________________________________________AzAzBWBWBW_A_A____ ____________________________________________AzAzBWBWAz_A_A______ __________________________________________AbAbAzAzAz_A_A________ __________________________________________AzAzAz_A_A_A__________ ______________________________________AzAzAzAzBv_A______________ ____________________________________BWBWBvBvBv_A_A______________ __________________________________AzAzBWBWBW_A_A________________ ________________________________AzAzBWBWAz_A_A__________________ ______________________________AbAbAzAzAz_A_A____________________ ______________________________AzAzAz_A_A_A______________________ __________________________AzAzAzAzBv_A__________________________ ________________________BWBWBvBvBv_A_A__________________________ ______________________AzAzBWBWBW_A_A____________________________ ____________________AzAzBWBWAz_A_A______________________________ __________________AbAbAzAzAz_A_A________________________________ __________________AzAzAz_A_A_A__________________________________ ______________AzAzAzAzBv_A______________________________________ ____________BWBWBvBvBv_A_A______________________________________ __________AzAzBWBWBW_A_A________________________________________ ________AzAzBWBWAz_A_A__________________________________________ ______AbAbAzAzAz_A_A____________________________________________ _______A_A_A_A_A_A______________________________________________ _______A_A_A_A_A________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 370 (oak) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ _______________________________________________________$AT_A____ ___________________________________________________$ATAqAq_A____ ________________________________________________AqAqBNBNBN_A____ ______________________________________________ATATAqAqAq_A_A____ ____________________________________________ATATAqAqAT_A_A______ ___________________________________________$_$ATATAT_A_A________ __________________________________________ATATAT_A_A_A__________ ______________________________________ATATATATBN_A______________ ____________________________________AqAqBNBNBN_A_A______________ __________________________________ATATAqAqAq_A_A________________ ________________________________ATATAqAqAT_A_A__________________ _______________________________$_$ATATAT_A_A____________________ ______________________________ATATAT_A_A_A______________________ __________________________ATATATATBN_A__________________________ ________________________AqAqBNBNBN_A_A__________________________ ______________________ATATAqAqAq_A_A____________________________ ____________________ATATAqAqAT_A_A______________________________ ___________________$_$ATATAT_A_A________________________________ __________________ATATAT_A_A_A__________________________________ ______________ATATATATBN_A______________________________________ ____________AqAqBNBNBN_A_A______________________________________ __________ATATAqAqAq_A_A________________________________________ ________ATATAqAqAT_A_A__________________________________________ _______$_$ATATAT_A_A____________________________________________ _______A_A_A_A_A_A______________________________________________ _______A_A_A_A_A________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 371 (ebony) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ _______________________________________________________AAA_A____ ___________________________________________________AAAAYAY_A____ ________________________________________________AYAYAwAwAw_A____ ______________________________________________AAAAAYAYAY_A_A____ ____________________________________________AA_zAYAJAA_A_A______ ___________________________________________A_AAAAAAA_A_A________ ___________________________________________LAAAA_A_A_A__________ ______________________________________AAAAAA_zAw_A______________ ____________________________________AYAYAwAwAw_A_A______________ __________________________________AAAAAJAYAY_A_A________________ ________________________________AA_zAYAYAA_A_A__________________ _______________________________A_AAAAA_z_A_A____________________ ______________________________AA_NAA_A_A_A______________________ __________________________AAAA_zAAAw_A__________________________ ________________________AYAYAwAwAw_A_A__________________________ ______________________AAAAAJAYAY_A_A____________________________ ____________________AA_zAYAYAA_A_A______________________________ ___________________A_AAAAAAA_A_A________________________________ __________________AA_LAA_A_A_A__________________________________ ______________AAAA_zAAAw_A______________________________________ ____________AYAYAwAwAw_A_A______________________________________ __________AAAAAJAYAY_A_A________________________________________ ________AA_zAYAYAA_A_A__________________________________________ _______A_AAAAAAA_A_A____________________________________________ _______A_A_A_A_A_A______________________________________________ _______A_A_A_A_A________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 372 (marble) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________________________________CVCmCV________ ________________________________________________CPCPCPBkBk______ ______________________________________________CVCPBnCPBkBd_A____ ____________________________________________CPCVCVCPCJBd_A_A____ __________________________________________CVCPCVCPCJBn_A_A_A____ ________________________________________CVCmCPBkCPBk_A_A_A_A____ ______________________________________CPCmCVBkBkBd_A_A_A_A______ ____________________________________CPCPCPCPCPBd_A_A_A_A________ __________________________________BkCPCPBkCPBk_A_A_A_A__________ ________________________________CVCoCPBkCPBk_A_A_A_A____________ ______________________________CVCmCVCPBkBd_A_A_A_A______________ ____________________________CPCmCVCPCPBk_A_A_A_A________________ __________________________BnCPCPBkBkBk_A_A_A_A__________________ ________________________CVCmCVBkBkBd_A_A_A_A____________________ ______________________CVCmCVCPCPBd_A_A_A_A______________________ ____________________CPCPCPCPCJBk_A_A_A_A________________________ __________________CVCVCVBkCPBk_M_A_A_A__________________________ ________________CPCPCVCPBkBk_M_A_A_A____________________________ ______________BkCPCPCPCPBd_A_A_A_A______________________________ ______________BdBDBkCPBk_A_A_A_A________________________________ ______________BDBDBDBk_A_A_A_A__________________________________ _______________ABDBD_A_A_A_A____________________________________ _______________A_A_A_A_A_A______________________________________ _________________A_A_A_A________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 373 (tin) { ________________________________________________________________ ____________________________________Bl_A________________________ ____________________________________BDBl_A__________CQBl_A______ ____________________________________AmBlBl_A____CQCQBlBD_A______ ____________________________________BDAjBlBl_ACQCQBlAm_A________ ____________________________________AmBYBlBlCQCQBlBDBD_A________ ____________________________________BDAfBDBlCQBlBDAm_A__________ ______________________________BlBlBlBlBlAmBlBlBDAm_A_A__________ ________________________BlBlBlBlBlBlBlBlBlBDBlBlBlBl_A__________ _________________________A_AAOAOAOAOAOAOANAmAOAOBlBlBl__________ ___________________________A_A_A_ABJAOAOAOBDAOAOAOAOBlBl________ _______________________________AAlAjAeAOAOAmBDAOAOAOAOAOBl______ ______________________________BJBDAeAOABAOBDAm_A_A_A_A_A_A_A____ ____________________________BDAlAeAOAB_AAOAfBD_A_A______________ __________________________AlBDAeAOAB_A_AAOBDAm_A________________ ________________________BDAlAeAOAB_A___AAOBD_A__________________ ______________________AlBDAeAOAB_A_____A_AAm_A__________________ ____________________AjBJAeAOAB_A_________ABD_A__________________ __________________BJAlAeAOAB_A___________A_A_A__________________ ________________AlBDAeAOAB_A_______________A____________________ ______________BJAjAeAOAB_A______________________________________ ____________BDAlAeAOAB_A________________________________________ __________AlBDAeAOAB_A__________________________________________ ________AjBJAeAOAB_A____________________________________________ _______ABJAeAOAB_A______________________________________________ _______A_AAOAB_A________________________________________________ _________A_A_A__________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 374 (brass) { ________________________________________________________________ ____________________________________Cr_A________________________ ____________________________________CLCr_A__________CtCr_A______ ____________________________________BbCrCr_A____CtCtCrCL_A______ ____________________________________CLBvCrCr_ACtCtCrBb_A________ ____________________________________CLBzCrCrCtCtCrCLCL_A________ ____________________________________BZCLBZCrCtCrBbBv_A__________ ______________________________CrCrCrCrCrCLCrCrCLCL_B_A__________ ________________________CrCrCrCrCrCrCrCrCrBbCrCrCrCr_A__________ _________________________A_AB_B_B_B_B_B_BSCLB_B_CrCrCr__________ ___________________________A_A_A_ABJB_B_B_BbBSB_B_B_CrCr________ _______________________________ABDAlAeB_B_CLBzB_B_B_B_B_Cr______ ______________________________BJAlAeAOABB_BZCL_A_A_A_A_A_A_A____ ____________________________BJAjAeAOAB_zB_BZCL_A_A______________ __________________________AlBDAeAOAB_A_AB_CLBZ_z________________ ________________________AjBJAeAOAB_A___AB_CL_z__________________ ______________________BJAlAeAOAB_A_____A_ABb_z__________________ ____________________AlBDAeAOAB_A_________ACL_A__________________ __________________BJAjAeAOAB_A___________A_A_A__________________ ________________BDAlAeAOAB_A_______________A____________________ ______________AlBDAeAOAB_A______________________________________ ____________AjBJAeAOAB_A________________________________________ __________BJAlAeAOAB_A__________________________________________ ________AlBDAeAOAB_A____________________________________________ _______ABDAeAOAB_A______________________________________________ _______A_AAOAB_A________________________________________________ _________A_A_A__________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 375 (copper) { ________________________________________________________________ ____________________________________CE_A________________________ ____________________________________BRCE_A__________CxCE_A______ ____________________________________BRCECE_A____CxCxCEBR_A______ ____________________________________BRBRCECE_ACxCxCEBR_A________ ____________________________________BRBRCECECxCxCEBRBR_A________ ____________________________________BRBRBRCECxCEBRBR_A__________ ______________________________CECECECECEBRCECEBRBR_A_A__________ ________________________CECECECECECECECECEBRCECECECE_A__________ _________________________A_AAXAXAXAXAXAXAXBRAXAXCECECE__________ ___________________________A_A_A_ABJAIAXAXBRAXAXAXAXCECE________ _______________________________ABJAjAeAXAXBRBRAXAXAXAXAXCE______ ______________________________BJAlAeAOABAXBRBR_A_A_A_A_A_A_A____ ____________________________BJAjAeAOAB_AAXBRBR_A_A______________ __________________________AlBDAeAOAB_A_AAXBRBR_A________________ ________________________BDAlAeAOAB_A___AAXBR_A__________________ ______________________BJAlAeAOAB_A_____A_ABR_A__________________ ____________________BJAjAeAOAB_A_________ABR_A__________________ __________________AlBDAeAOAB_A___________A_A_A__________________ ________________AjBJAeAOAB_A_______________A____________________ ______________BJAlAeAOAB_A______________________________________ ____________AlBDAeAOAB_A________________________________________ __________BJAjAeAOAB_A__________________________________________ ________BDAlAeAOAB_A____________________________________________ _______AAlAeAOAB_A______________________________________________ _______A_BAOAB_A________________________________________________ _________A_A_A__________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 376 (silver) { ________________________________________________________________ ____________________________________CP_A________________________ ____________________________________BdCP_A__________C$CP_A______ ____________________________________BdCPCP_A____C$C$CPBd_A______ ____________________________________BdBdCPCP_AC$C$CPBd_A________ ____________________________________BdBdCPCPC$C$CPBdBd_A________ ____________________________________BdBdBdCPC$CPBdBd_A__________ ______________________________CPCPCPCPCPBdCPCPBdBd_A_A__________ ________________________CPCPCPCPCPCPCPCPCPBdCPCPCPCP_A__________ _________________________A_AAeAeAeAeAeAeAeBdAeAeCPCPCP__________ ___________________________A_A_A_ABJAeAeAeBdAeAeAeAeCPCP________ _______________________________AAlAjAeAeAeBdBdAeAeAeAeAeCP______ ______________________________BJBDAeAOABAeBdBd_A_A_A_A_A_A_A____ ____________________________BDAlAeAOAB_AAeBdBd_A_A______________ __________________________AlBDAeAOAB_A_AAeBdBd_A________________ ________________________BDAlAeAOAB_A___AAeBd_A__________________ ______________________AlBDAeAOAB_A_____A_ABd_A__________________ ____________________AjBJAeAOAB_A_________ABd_A__________________ __________________BJAlAeAOAB_A___________A_A_A__________________ ________________AlBDAeAOAB_A_______________A____________________ ______________BJAjAeAOAB_A______________________________________ ____________BDAlAeAOAB_A________________________________________ __________AlBDAeAOAB_A__________________________________________ ________AjBJAeAOAB_A____________________________________________ _______ABJAeAOAB_A______________________________________________ _______A_AAOAB_A________________________________________________ _________A_A_A__________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 377 (platinum) { ________________________________________________________________ ____________________________________CO_A________________________ ____________________________________BcCO_A__________CtCO_A______ ____________________________________BcCOCO_A____CtCoCOBc_A______ ____________________________________BcBcCOCO_ACtCoCOBc_A________ ____________________________________BcBcCOCOCoCtCOBcBc_A________ ____________________________________BcBcBcCOCtCWBcBc_A__________ ______________________________COCOCOCOCOBcCOCOBcBc_A_A__________ ________________________COCOCOCOCOCOCOCOCOBcCOCOCOCO_A__________ _________________________A_AAdAdAdAdAdAdAdBcAdAdCOCOCO__________ ___________________________A_A_A_ABJAdAdAdBcAdAdAdAdCOCO________ _______________________________AAlAjAeAdAdBcBcAdAdAdAdAdCO______ ______________________________BJBDAeAOABAdBcBc_A_A_A_A_A_A_A____ ____________________________BDAlAeAOAB_AAdBcBc_A_A______________ __________________________AlBDAeAOAB_A_AAdBcBc_A________________ ________________________BDAlAeAOAB_A___AAdBc_A__________________ ______________________AlBDAeAOAB_A_____A_ABc_A__________________ ____________________AjBJAeAOAB_A_________ABc_A__________________ __________________BJAlAeAOAB_A___________A_A_A__________________ ________________AlBDAeAOAB_A_______________A____________________ ______________BJAjAeAOAB_A______________________________________ ____________BDAlAeAOAB_A________________________________________ __________AlBDAeAOAB_A__________________________________________ ________AjBJAeAOAB_A____________________________________________ _______ABJAeAOAB_A______________________________________________ _______A_AAOAB_A________________________________________________ _________A_A_A__________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 378 (iridium) { ________________________________________________________________ ____________________________________Bm_A________________________ ____________________________________BDBm_A__________CRBm_A______ ____________________________________AoBmBm_A____CRCRBmBD_A______ ____________________________________BDAjBmBm_ACRCRBmAo_A________ ____________________________________AoBcBmBmCRCRBmBDBD_A________ ____________________________________BDAhBDBmCRBmBDAo_A__________ ______________________________BmBmBmBmBmAoBmBmBDAo_A_A__________ ________________________BmBmBmBmBmBmBmBmBmBDBmBmBmBm_A__________ _________________________A_AAOAOAOAOAOAOAOAoAOAOBmBmBm__________ ___________________________A_A_A_ABJAOAOAOBDAOAOAOAOBmBm________ _______________________________ABDAlAeAOAOAoAjAOAOAOAOAOBm______ ______________________________BJAlAeAOABAOBDBc_A_A_A_A_A_A_A____ ____________________________BJAjAeAOAB_AAOAoAj_A_A______________ __________________________AlBDAeAOAB_A_AAOBDBc_A________________ ________________________AjBJAeAOAB_A___AAOAo_A__________________ ______________________BJAlAeAOAB_A_____A_ABD_A__________________ ____________________AlBDAeAOAB_A_________ABD_A__________________ __________________BJAjAeAOAB_A___________A_A_A__________________ ________________BDAlAeAOAB_A_______________A____________________ ______________AlBDAeAOAB_A______________________________________ ____________AjBJAeAOAB_A________________________________________ __________BJAlAeAOAB_A__________________________________________ ________AlBDAeAOAB_A____________________________________________ _______ABDAeAOAB_A______________________________________________ _______A_AAOAB_A________________________________________________ _________A_A_A__________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 379 (zinc) { ________________________________________________________________ ____________________________________CJ_A________________________ ____________________________________BXCJ_A__________CiCJ_A______ ____________________________________BXCJCJ_A____CXChCJBX_A______ ____________________________________BXBXCJCJ_ACgCXCnBX_z________ ____________________________________BXBXCJCJCXChCJBXBX_A________ ____________________________________BXBXBXCJCgCgBXBX_A__________ ______________________________CJCJCJCJCJBXCJCJBXBX_A_A__________ ________________________CJCJCJCJCJCJCJCJCJBXCJCJCJCJ_A__________ _________________________A_AAOAOAOAOAOAOAOBXAOAOCJCJCJ__________ ___________________________A_A_A_ABJAOAOAOBXAOAOAOAOCJCJ________ _______________________________AAlAjAeAOAOBXBXAOAOAOAOAOCJ______ ______________________________BJBDAeAOABAOBXBX_A_A_A_A_A_A_A____ ____________________________BDAlAeAOAB_AAOBXBX_A_A______________ __________________________AlBDAeAOAB_A_AAOBXBX_A________________ ________________________BDAlAeAOAB_A___AAOBX_A__________________ ______________________AlBDAeAOAB_A_____A_ABX_A__________________ ____________________AjBJAeAOAB_A_________ABX_A__________________ __________________BJAlAeAOAB_A___________A_A_A__________________ ________________AlBDAeAOAB_A_______________A____________________ ______________BJAjAeAOAB_A______________________________________ ____________BDAlAeAOAB_A________________________________________ __________AlBDAeAOAB_A__________________________________________ ________AjBJAeAOAB_A____________________________________________ _______ABJAeAOAB_A______________________________________________ _______A_AAOAB_A________________________________________________ _________A_A_A__________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 380 (aluminum) { ________________________________________________________________ ____________________________________Bn_A________________________ ____________________________________BDBn_A__________CSBn_A______ ____________________________________AiBnBn_A____CSCSBnBD_A______ ____________________________________BdAiBnBn_ACSCSBnAi_A________ ____________________________________AiBdBnBnCSCSBnAiBd_A________ ____________________________________BdAiBdBnCSBnBDBd_A__________ ______________________________BnBnBnBnBnAiBnBnBdAi_A_A__________ ________________________BnBnBnBnBnBnBnBnBnBDBnBnBnBn_A__________ _________________________A_AAEAEAEAEAEAEAEAiAEAEBnBnBn__________ ___________________________A_A_A_ABJAEAEAEBdAEAEAEAEBnBn________ _______________________________AAlAjAeAEAEBdAiAEAEAEAEAEBn______ ______________________________BJBDAeAOABAEAiBd_A_A_A_A_A_A_A____ ____________________________BDAlAeAOAB_AAEBdAi_A_A______________ __________________________AlBDAeAOAB_A_AAEAiBd_A________________ ________________________BDAlAeAOAB_A___AAEBD_A__________________ ______________________AlBDAeAOAB_A_____A_AAi_z__________________ ____________________AjBJAeAOAB_A_________ABd_A__________________ __________________BJAlAeAOAB_A___________A_A_A__________________ ________________AlBDAeAOAB_A_______________A____________________ ______________BJAjAeAOAB_A______________________________________ ____________BDAlAeAOAB_A________________________________________ __________AlBDAeAOAB_A__________________________________________ ________AjBJAeAOAB_A____________________________________________ _______ABJAeAOAB_A______________________________________________ _______A_AAOAB_A________________________________________________ _________A_A_A__________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 381 (uranium) { ________________________________________________________________ ____________________________________CK_A________________________ ____________________________________BYCK_A__________ChCK_A______ ____________________________________BYCKCK_A____ChCoCKBY_A______ ____________________________________BYBYCKCK_AChCoCeBY_A________ ____________________________________BYBYCKCKCoChCKBYBY_A________ ____________________________________BYBYBYCKChChBYBY_A__________ ______________________________CKCKCKCKCKBYCKCKBYBY_A_A__________ ________________________CKCKCKCKCKCKCKCKCKBYCKCKCKCK_A__________ _________________________A_AAaAaAaAaAaAaAaBYAaAaCKCKCK__________ ___________________________A_A_A_ABJAaAaAaBYAaAaAaAaCKCK________ _______________________________AAlAjAeAaAaBYBYAaAaAaAaAaCK______ ______________________________BJBDAeAOABAaBYBY_A_A_A_A_A_A_A____ ____________________________BDAlAeAOAB_AAaBYBY_A_A______________ __________________________AlBDAeAOAB_A_AAaBYBY_A________________ ________________________BDAlAeAOAB_A___AAaBY_A__________________ ______________________AlBDAeAOAB_A_____A_ABY_A__________________ ____________________AjBJAeAOAB_A_________ABY_A__________________ __________________BJAlAeAOAB_A___________A_A_A__________________ ________________AlBDAeAOAB_A_______________A____________________ ______________BJAjAeAOAB_A______________________________________ ____________BDAlAeAOAB_A________________________________________ __________AlBDAeAOAB_A__________________________________________ ________AjBJAeAOAB_A____________________________________________ _______ABJAeAOAB_A______________________________________________ _______A_AAOAB_A________________________________________________ _________A_A_A__________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 382 (iron) { ________________________________________________________________ ____________________________________Bd_A________________________ ____________________________________BJBd_A__________BkBd_A______ ____________________________________AjBdBd_A____BnBkBdBD_A______ ____________________________________BJAlBdBd_ABkCJBdBD_A________ ____________________________________AlBDBdBDCPBkBdBDAl_A________ ____________________________________BDAlBDBdBkBdBDAl_A__________ ______________________________BdBdBdBdBdAlBdBdAjBJ_A_A__________ ________________________BdBdBdBdBdBdBdBdBdBDBdBdBdBd_A__________ _________________________A_AAeAeAeAeAeAeAeAlAeAeBdBdBd__________ ___________________________A_A_A_ABJAeAeAeBDAeAeAeAeBdBd________ _______________________________AAlAjAeAeAeBJAlAeAeAeAeAeBd______ ______________________________BJBDAeAOABAeAjBJ_A_A_A_A_A_A_A____ ____________________________BDAlAeAOAB_AAeBXAj_A_A______________ __________________________AlBDAeAOAB_A_AAeAlBJ_A________________ ________________________BDAlAeAOAB_A___AAeBD_A__________________ ______________________AlBDAeAOAB_A_____A_AAl_A__________________ ____________________AjBJAeAOAB_A_________ABD_A__________________ __________________BJAlAeAOAB_A___________A_A_A__________________ ________________AlBDAeAOAB_A_______________A____________________ ______________BJAjAeAOAB_A______________________________________ ____________BDAlAeAOAB_A________________________________________ __________AlBDAeAOAB_A__________________________________________ ________AjBJAeAOAB_A____________________________________________ _______ABJAeAOAB_A______________________________________________ _______A_AAOAB_A________________________________________________ _________A_A_A__________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 383 (steel) { ________________________________________________________________ ____________________________________Bk_A________________________ ____________________________________BdBk_M__________CPBk_A______ ____________________________________BdCPBk_A____CPCVBkBd_A______ ____________________________________BdBdBkCP_ACPCPBkBk_A________ ____________________________________BdBkBkBkCPCVBkBdBd_A________ ____________________________________BdBdBdCJCPBkBkBd_A__________ ______________________________BkBkCPBkBkBkBkBnBdBd_A_A__________ ________________________BkBnCJBnCJBkBnCJBnBdCJBkBnBk_z__________ _________________________z_AAeAeAeAeAeAeAeBdAeAeBkCPBk__________ ___________________________A_A_A_ABJAeAeAeBdAeAeAeAeBkCP________ _______________________________ABDAlAeAeAeBdBdAeAeAeAeAeBk______ ______________________________BJAlAeAOABAeBdBd_A_A_A_A_A_z_A____ ____________________________BJAjAeAOAB_AAeBdBd_A_A______________ __________________________AlBDAeAOAB_A_AAeBdBd_A________________ ________________________AjBJAeAOAB_A___AAeBd_A__________________ ______________________BJAlAeAOAB_A_____A_ABd_A__________________ ____________________AlBDAeAOAB_A_________ABd_A__________________ __________________BJAjAeAOAB_A___________A_A_A__________________ ________________BDAlAeAOAB_A_______________A____________________ ______________AlBDAeAOAB_A______________________________________ ____________AjBJAeAOAB_A________________________________________ __________BJAlAeAOAB_A__________________________________________ ________AlBDAeAOAB_A____________________________________________ _______ABDAeAOAB_A______________________________________________ _______A_AAOAB_A________________________________________________ _________A_A_A__________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 384 (hexagonal) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________BdBd____________________ ______________________________________BdBdBDBJ__________________ ____________________________________BdBdBDAlAl__________________ __________________________________BdBdBDBDAl_A_A________________ ________________________________BdBdBDAlAl_A_A_A________________ ______________________________BdBdBDBDAl_A_A_A_A________________ ____________________________BdBdBDAlAl_A_A_A_A__________________ __________________________BdBdBDBDAl_A_A_A_A____________________ ________________________BdBdBDAlAl_A_A_A_A______________________ ______________________BdBdBDBDAl_A_A_A_A________________________ ____________________BdBdBDAlAl_A_A_A_A__________________________ ______________C$C$C$C$BDBDAl_A_A_A_A____________________________ ____________C$C$C$C$BkBkAl_A_A_A_A______________________________ __________BdBdBdBdBnCJBn_A_A_A_A________________________________ __________BdBdBdBdBkCJBk_z_A_A__________________________________ ________BdBdBdBdBdBdBnAe_A_A_A__________________________________ ________BdBdBdBdBdBdAe_A_A_A____________________________________ _________ABdBdBdBdAe_A_A_A______________________________________ _________ABdBdBdBd_A_A_A________________________________________ _________A_A_A_A_A_A_A__________________________________________ ___________A_A_A_A_A____________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 385 (short) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________________________BD____________________ ________________________________________BDBJAl_A________________ ______________________________________BDAlAlAO_A_A______________ ____________________________________BDBDAlAO_A_A_A______________ __________________________________BDAlAlAO_A_A_A_A______________ ________________________________BDBDAlAO_A_A_A_A________________ ______________________________BDAlAlAO_A_A_A_A__________________ ____________________________BDBDAlAO_A_A_A_A____________________ __________________________BDAlAlAO_A_A_A_A______________________ ________________________BDBDAlAO_A_A_A_A________________________ ______________________BkBdAlAO_A_A_A_A__________________________ ____________________BJBdBDAl_A_A_A_A____________________________ __________________AlAjBJAj_z_A_A_A______________________________ ___________________ABDAl_A_A_A_A________________________________ ___________________A_A_A_A_A_A__________________________________ _____________________A_A_A_A____________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 386 (runed) { ________________________________________________________________ ________________________________________________________________ ______________________________________CVCVCVCVCVBd______________ ______________________________________CVCPBkCPCPBd_ACVCVBd_A____ ______________________________________BdBdBdCVBkBd_ACVCPBd_A____ _______________________________________A_A_ACVCPBd_ACPCPBd_A____ ____________________________________CVCVCVCVCVCPCVCVCVCPBD_A____ ____________________________________CVCPBkCPCPBkCPCPBkCPBd_A____ ____________________________________CVCPBdBdCVCPBDBdBdBdBd_A____ ____________________________________CPCPBdAlCPCP_A_A_A_A_A_A____ __________________________________BkCVCPBDBJCVBnCVCVCVCV_A______ ________________________________BkBkCVBdBd_ACVCJCPCJCPBd_A______ ______________________________BkBkCmBDAl_A_ABdBdBdBdBdBd_A______ ____________________________BkCmBdBDBD_A_A_A_A_A_A_A_A_A_A______ __________________________BkBkBdBDBJ_A_A________________________ ________________________BkCmBdCPAj_A_A__________________________ ______________________BkBkBdBDAl_z_A____________________________ ____________________BkCmCVBDBJ_A_A______________________________ __________________BkBkBkBDBD_A_A________________________________ ________________BkCmBdCPAl_A_A__________________________________ ______________BkCmBdBDAl_A_A____________________________________ ____________BJBDBdBDBD_A_A______________________________________ ____________AlAjBJAl_A_A________________________________________ ______________BDAl_A_A__________________________________________ _________________A_A____________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 387 (long) { ________________________________________________________BD______ ______________________________________________________BDBJAl_A__ ____________________________________________________BDAlAlAO_A_A __________________________________________________BDBDAlAO_A_A_A ________________________________________________BDAlAlAO_A_A_A_A ______________________________________________BDBDAlAO_A_A_A_A__ ____________________________________________BDAlAlAO_A_A_A_A____ __________________________________________BDBDAlAO_A_A_A_A______ ________________________________________BDAlAlAO_A_A_A_A________ ______________________________________BDBDAlAO_A_A_A_A__________ ____________________________________BDAlAlAO_A_A_A_A____________ __________________________________BDBDAlAO_A_A_A_A______________ ________________________________BDAlAlAO_A_A_A_A________________ ______________________________BDBDAlAO_A_A_A_A__________________ ____________________________BDAlAlAO_A_A_A_A____________________ __________________________BDBDAlAO_A_A_A_A______________________ ________________________BDAlAlAO_A_A_A_A________________________ ______________________BDBDAlAO_A_A_A_A__________________________ ____________________BDAlAlAO_A_A_A_A____________________________ __________________BDBDAlAO_A_A_A_A______________________________ ________________BDAlAlAO_A_A_A_A________________________________ ______________BDBDAlAO_A_A_A_A__________________________________ ____________BDAlAlAO_A_A_A_A____________________________________ __________BDBDAlAO_A_A_A_A______________________________________ ________BDAlAlAO_A_A_A_A________________________________________ ______BDBDAlAO_A_A_A_A__________________________________________ ____CYCBAlAO_A_A_A_A____________________________________________ __BNCBBoBN_A_A_A_A______________________________________________ BNBNBNBN_A_A_A_A________________________________________________ _ABNBN_A_A_A_A__________________________________________________ _A_A_A_A_A_A____________________________________________________ ___A_A_A_A______________________________________________________ } # tile 388 (curved) { ________________________________________________________________ ________________________________________________________________ __________________________________________Al____________________ ________________________________________BJAlAO_A________________ ________________________________________AjAlAO_A_A______________ ________________________________________BJAlAO_A_A______________ ________________________________________AlAlAO_A_A______________ ________________________________________BDAlAO_A_A______________ ________________________________________AlAlAO_A_A______________ ________________________________________BDAlAO_A_A______________ ________________________________________AlAlAO_A_A______________ ________________________________________BDAlAO_A_A______________ ______________________________________BDAlAlAO_A_A______________ ______________________________________BDBDAlAO_A_A______________ ____________________________________BDAlAlAO_A_A_A______________ ____________________________________BDBDAlAO_A_A_A______________ __________________________________BDBJAlAO_A_A_A________________ ________________________________BDAlAlAO_A_A_A_A________________ ______________________________BDBDAlAO_A_A_A_A__________________ ____________________________BDAlAlAO_A_A_A_A____________________ __________________________BDBJAlAO_A_A_A_A______________________ ________________________BDAjAlAO_A_A_A_A________________________ ______________________BDBJAlAO_A_A_A_A__________________________ _____________________h_hAlAO_A_A_A_A____________________________ ___________________X_h_c_X_A_A_A_A______________________________ _________________X_X_X_X_A_A_A_A________________________________ _________________A_X_X_A_A_A_A__________________________________ _________________A_A_A_A_A_A____________________________________ ___________________A_A_A_A______________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 389 (forked) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________Aw______________________ ______________________________________BSAw_A____________________ ____________________________________BSAw_A______________________ ____________________________________BSAw_A__________BSAw________ __________________________________BSAw_A__________BSAw_A________ __________________________________BSAw_A______BSBSAw_A__________ __________________________________BSBsBSBSBSBSBSAw_A____________ __________________________________BsBSBSBSAwAwAw_A______________ ________________________________BsBSBSAwAYAY_A_A________________ ______________________________BsBSBSAwAY_A_A_A__________________ ____________________________BsBSBSAwAY_A_A______________________ __________________________BsBSBSAwAY_A_A________________________ ________________________BsBSBSAwAY_A_A__________________________ ______________________BsBSBSAwAY_A_A____________________________ ____________________BsBSBSAwAY_A_A______________________________ __________________BsBSBSAwAY_A_A________________________________ ________________BsBSBSAwAY_A_A__________________________________ ______________BsBSBSAwAY_A_A____________________________________ ____________BsBSBSAwAY_A_A______________________________________ __________BsBSBSAwAY_A_A________________________________________ ________AwAwBSAwAY_A_A__________________________________________ ________AwAwAwAY_A_A____________________________________________ _________AAwAw_A_A______________________________________________ _________A_A_A_A________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 390 (spiked) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________________________________CP________________________ ________________________________________BdBdCP__________________ __________________________________CP__BdBdBDBJ__________________ ____________________________________BdBdCPAlAl_A________________ ______________________________CP__BdBdBDBDAl_ACP_A______________ ________________________________BdBdCPAlAl_A_A_A_A______________ ______________________________BdBdBDBDAl_ACP_A_A________________ ____________________________BdBdBDAlAl_A_A_A_A_A________________ __________________________BdBdBDBDAl_ACP_A_A____________________ ________________________BdBdBDAlAl_A_A_A_A_A____________________ ______________________BdBdBDBDAl_A_A_A_A________________________ ____________________BdBdBDAlAl_A_A_A_A__________________________ __________________BdBdBDBDAl_A_A_A_A____________________________ ________________BdBdBDAlAl_A_A_A_A______________________________ ______________BdBdBDBDAl_A_A_A_A________________________________ ____________BdBdBDAlAl_A_A_A_A__________________________________ __________BdBdBDBDAl_A_A_A_A____________________________________ ________BdBdBDAlAl_A_A_A_A______________________________________ ______AlAlBDBDAl_A_A_A_A________________________________________ ______AlAlAlAl_A_A_A_A__________________________________________ _______AAlAl_A_A_A_A____________________________________________ _______A_A_A_A_A_A______________________________________________ _________A_A_A__________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 391 (jeweled) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________________________________CrCsCr________ ________________________________________________CrCsCrCLCL______ ______________________________________________CrCsCrCLBbBZ_A____ ____________________________________________CrCsCrCLCLBZ_A_A____ __________________________________________CrCsCrCLCLBZ_A_A_A____ ________________________________________CrCsCrCLBbBW_A_A_A_A____ ______________________________________CrCsCrCLCLBZ_A_A_A_A______ ____________________________________CrCsCrCLCLB__A_A_A_A________ __________________________________CrCsCrCLBbBZ_A_A_A_A__________ ________________________________CrCsCrCLCLBZ_z_A_A_A____________ ______________________________CrCsCrCLCLBZ_A_A_A_A______________ ____________________________CrCsCrCLBbBW_A_A_A_A________________ __________________________CrCsCrCLCLBZ_A_A_A_A__________________ ________________________CrCsCrCLCLB__A_A_A_A____________________ ______________________CrCsCrCLBbBZ_A_A_A_A______________________ ____________________CrCsCrCLCLBZ_z_A_A_A________________________ __________________CrCsCrCLCLBZ_A_A_A_A__________________________ ________________CrCsCrCLBbBW_A_A_A_A____________________________ ____________CrCrCrCrCLCLBZ_A_A_A_A______________________________ ___________t_m_m_mCLCLB__A_A_A_A________________________________ _________w_t_m_m_cBbBZ_A_A_A_A__________________________________ _________t_h_h_h_c_cBZ_A_A_A____________________________________ _________h_h_h_h_h_cB__A_A_A____________________________________ _________A_h_h_h_cB__z_A_A______________________________________ _______A_A_m_m_m_c_A_A_A________________________________________ _______A_A_A_A_A_A_A_A__________________________________________ _________A_A_A_A_A_A____________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 392 (gold piece) { ________________________________________________________________ __________________________B_B_B_________________________________ ______________________B_B_CLCLCLB_B_____________________________ ____________________B_CrCLBbCLCrCLCrB___________________________ __________________B_CrCLCLCLCrCLCrCsCrB______A_A_A_A_A__________ ________________B_CrCUBZCLCrCLCrCsCrCLCrBZ_A_A_A_A_A_A_A_A______ ________________BZCLCLCLCrCLCrCsCrCLCrCLB__A_A_A_A_A_A_A_A______ ________________B_BZCLCrCLCrCsCrCLCrCLBZB__A_A_A_A_A_A_A_A______ ________________BZB_CLCLCrCsCrCLCrCLBZB_BZ_A_A_A_A_A_A_A________ ________________B_B_CLBZCLCrCLCrBbCLB_BZB__A_A_A_A_A_A_A________ ________________BZB_BZBZCrCLCLCLBWB_BZB_BZ_A_A_A_A_A_A__________ ________________B_B_B_CLCUBZCLBZBbCLB_BZB__A_A_A_A_A_A__________ ____________B_B_CLCLCLAzB_CLCLBvBZB_BZB_BZ_A_A_A_A_A_A__________ __________B_CrCLBbCLCrCLCrB_CLBZBbCLB_BZB__A_A_A_A_A_A__________ ________B_CrCLCLCLCrCLCrCsCrB_CLBZB_BZB_B_B__A_A_A_A_A_A_A______ ______B_CrCUBZCLCrCLCrCsCrCLCrBZBZB_B_CLCLCLB_B__A_A_A_A_A_A_A__ ______BZCLCLCLCrCLCrCsCrCLCrCLB_B_CrCLBbCLCrCLCrB__A_A_A_A_A_A__ ______B_BZCLCrCLCrCsCrCLCrCLBZB_CrCLCLCLCrCLCrCsCrB__A_A_A_A_A__ ______BZB_CLCLCrCsCrCLCrCLBZB_BZCLCLCLCrCLCrCsCrCLCrBZ_A_A_A_A__ ______B_B_CLBZCLCrCLCrBZCLB_BZB_BZCLCrCLCrCsCrCLCrCLB__A_A_A____ ______BZB_BZBZCrCLCLCLBZB_BZB_BZCUCrCLCrCsCrCLCrCLBZB__A_A_A____ ______B_BZBZCLCUBZCLBZBZCLB_BZB_BvCLCrCsCrCLCrCLBZB_BZ_A_A_A____ ______BZB_BZBZCrCLCLCLBZB_BZB_BZCLBbCLCrCLCrCLBZB_BZB__A_A______ ______B_BbBvCLCUBZCLB_CLBbB_BZB_BZBZCrCLCLBbBZB_BZB_BZ_A_A______ ______BZB_BZBZCrCLCLBvBZB_BZB_BZCLBZCUCLBvBZCLCLB_BZB__A_A______ ______B_BZBZCLCUBZCLBZBtCLB_BZB_BZCLCLBtCLBZCLBZB_BZB__A________ ______BZB_BZBZCrCLCLCLBZB_BZB_BZBZBZCrCLCLBZBZB_BZB_BZ_A________ _______zBZBZCLCUBZCLB_CLBvB_BZB_CLCLCLBvCLBZCLCLB_BZ_A_A________ _______A_zBZBZCrCLCLCLB_B_BZB__ABZB_CrCLCLBbBWB_BZ_A_A__________ _________A_ACLCUBZCLBZBbCL_A_A_A_ACLCUBbCLBvBbCL_A_A____________ ___________A_A_ACLCLBv_z_A_A_____A_A_ACLCLBt_z_A_A______________ _______________A_A_z_B_A_____________A_z_A_L_A__________________ } # tile 393 (white / dilithium crystal) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________CmCmC$C$C$C$C$BdBJ____________________ ______________________CmBkBkCoC$C$C$C$CmBdAj____________________ ____________________CoBkBkBkCmC$C$CmCmBdBdBJ_A_A________________ __________________CmBkBkBdBDCmC$CmBJBdBdAlBD_A_A________________ ________________BkBdBkAlBdBDBkCmBJAjAlBdBDAl_A_A________________ ______________BkBkBdBJAjBJBdBdBkCmBDBdBdAlBD_A_A________________ ______________CPAlBdBDAlBdBkBkBDBDBkBdBdBDAl_A_A________________ ____________BkBJAjBJAlBDBkBDBDBdAlBdBkBlBJ_A_A__________________ __________BdBDBkBDAlBDBxAjBJAjAlBJBkBdBJBk_A_A__________________ __________BdBdBkBDAlBkBDBJAlBdBdBdBdBkBn_z_A____________________ __________BdBdBJBlCJAjBDAlBdBDBdBdBnCJ_A_A______________________ __________BdAjBJBkCmBDBdAlBdBdBkBk_z_A_A________________________ __________BdBdBkAjBDBkBkBdBmBlCJ_B_A_A__________________________ __________BdBkBDBJAlBDBdCKBk_z_L_A_A____________________________ ___________ABDBJBdBdBdBkBk_L_A_A________________________________ ___________A_A_A_A_A_A_A_A_A____________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 394 (white / diamond) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________CmCmC$C$C$C$C$BdBJ____________________ ______________________CmBkBkCoC$C$C$C$CmBdAj____________________ ____________________CoBkBkBkCmC$C$CmCmBdBdBJ_A_A________________ __________________CmBkBkBdBDCmC$CmBJBdBdAlBD_A_A________________ ________________BkBdBkAlBdBDBkCmBJAjAlBdBDAl_A_A________________ ______________BkBkBdBJAjBJBdBdBkCmBDBdBdAlBD_A_A________________ ______________CPAlBdBDAlBdBkBkBDBDBkBdBdBDAl_A_A________________ ____________BkBJAjBJAlBDBkBDBDBdAlBdBkBlBJ_A_A__________________ __________BdBDBkBDAlBDBxAjBJAjAlBJBkBdBJBk_A_A__________________ __________BdBdBkBDAlBkBDBJAlBdBdBdBdBkBn_z_A____________________ __________BdBdBJBlCJAjBDAlBdBDBdBdBnCJ_A_A______________________ __________BdAjBJBkCmBDBdAlBdBdBkBk_z_A_A________________________ __________BdBdBkAjBDBkBkBdBmBlCJ_B_A_A__________________________ __________BdBkBDBJAlBDBdCKBk_z_L_A_A____________________________ ___________ABDBJBdBdBdBkBk_L_A_A________________________________ ___________A_A_A_A_A_A_A_A_A____________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 395 (red / ruby) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________CuCuC$C$C$C$C$BoBN____________________ ______________________CuCuCBCuC$C$C$C$CuBoBN____________________ ____________________CuCBBoCBCuC$C$CuCuBoBoBN_A_A________________ __________________CuCBBoBoBNCuC$CuBNBoBoBNBN_A_A________________ ________________CBBoBoBNBoBNCBCuBNBNBNBoBNBN_A_A________________ ______________CBBoBoBNBNBNBoBoCBCuBNBoBoBNBN_A_A________________ ______________CBBNBoBNBNBoCBCBBNBNCBBoBoBNBN_A_A________________ ____________CBBNBNBNBNBNCBBNBNBoBNBoCBCBBN_A_A__________________ __________BoBNCBBNBNBNCBBNBNBNBNBNBoBoBNCB_A_A__________________ __________BoBoCBBNBNCBBNBNBNBoBoBoBoCBCB_A_A____________________ __________BoBoBNCBCBBNBNBNBoBNBoBoCBCB_A_A______________________ __________BoBNBNCBCuBNBoBNBoBoCBCB_A_A_A________________________ __________BoBoCBBNBNCBCBBoCBCBCB_A_A_A__________________________ __________BoCBBNBNBNBNBoCBCB_A_A_A_A____________________________ ___________ABNBNBoBoBoBoCB_A_A_A________________________________ ___________A_A_A_A_A_A_A_A_A____________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 396 (orange / jacinth) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________CFCcC$C$C$C$C$BSAw____________________ ______________________CFCFBsCcC$C$C$C$CcBSAw____________________ ____________________CFBsBSBsCcC$C$CcCcBSBSAw_A_A________________ __________________CFBsBSBSAwCcC$CcAwBSBSAwAw_A_A________________ ________________BsBsBSAwBSAwBsCcAwAwAwBSAwAw_A_A________________ ______________BsBSBSBSAwAwBSBSBsCcAwBSBSAwAw_A_A________________ ______________BsAwBSAwAwBSBsBsAwAwBsBSBSAwAw_A_A________________ ____________BsAwBSAwAwAwBsAwAwBSAwBSBsBsAw_A_A__________________ __________BSAwBsAwBSAwBsAwAwAwAwAwBSBSAwBs_A_A__________________ __________BSBSBsAwAwBsAwAwAwBSBSBSBSBsBs_A_A____________________ __________BSBSAwBsBsAwAwBSBSAwBSBSBsBs_A_A______________________ __________BSAwAwBsCcAwBSAwBSBSBsBs_A_A_A________________________ __________BSBSBsAwAwBsBsBsBsBsBs_A_A_A__________________________ __________BSBsAwAwAwAwBSBSBs_A_A_A_A____________________________ ___________AAwAwBSBSBSBSBs_A_A_A________________________________ ___________A_A_A_A_A_A_A_A_A____________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 397 (blue / sapphire) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ___________________________K_KC$C$C$C$C$_G_F____________________ _______________________K_K_H_KC$C$C$C$_K_G_F____________________ _____________________K_H_G_H_KC$C$_K_K_G_G_F_A_A________________ ___________________K_H_G_G_F_KC$_K_F_G_G_F_F_A_A________________ _________________H_G_G_F_G_F_H_K_F_F_F_G_F_F_A_A________________ _______________H_G_G_F_F_F_G_G_H_K_F_G_G_F_F_A_A________________ _______________H_F_G_F_F_G_H_H_F_F_H_G_G_F_F_A_A________________ _____________H_F_F_F_F_F_H_F_F_G_F_G_H_H_F_A_A__________________ ___________G_F_H_F_F_F_H_F_F_F_F_F_G_G_F_H_A_A__________________ ___________G_G_H_F_F_H_F_F_F_G_G_G_G_H_H_A_A____________________ ___________G_G_F_H_H_F_F_F_G_F_G_G_H_H_A_A______________________ ___________G_F_F_H_K_F_G_F_G_G_H_H_A_A_A________________________ ___________G_G_H_F_F_H_H_G_H_H_H_A_A_A__________________________ ___________G_H_F_F_F_F_G_H_H_A_A_A_A____________________________ ___________A_F_F_G_G_G_G_H_A_A_A________________________________ ___________A_A_A_A_A_A_A_A_A____________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 398 (black / black opal) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________BJBdC$C$C$C$C$AOAB____________________ ______________________BJAjAeBdC$C$C$C$BdAOAB____________________ ____________________AlAeAOAeBdC$C$BdBdAOAOAB_A_A________________ __________________BDAeAOAOABBdC$BdABAOAOABAB_A_A________________ ________________AeAeAOABAOABAeBdABABABAOABAB_A_A________________ ______________AeAOAOAOABABAOAOAeBdABAOAOABAB_A_A________________ ______________AeABAOABABAOAeAeABABAeAOAOABAB_A_A________________ ____________AeABAOABABABAeABABAOABAOAeAeAB_A_A__________________ __________AOABAeABAOABAeABABABABABAOAOABAe_A_A__________________ __________AOAOAeABABAeABABABAOAOAOAOAeAe_A_A____________________ __________AOAOABAeAeABABAOAOABAOAOAeAe_A_A______________________ __________AOABABAeBdABAOABAOAOAeAe_A_A_A________________________ __________AOAOAeABABAeAeAeAeAeAe_A_A_A__________________________ __________AOAeABABABABAOAOAe_A_A_A_A____________________________ ___________AABABAOAOAOAOAe_A_A_A________________________________ ___________A_A_A_A_A_A_A_A_A____________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 399 (green / emerald) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ___________________________n_rC$C$C$C$C$_d_Y____________________ _______________________n_n_i_rC$C$C$C$_r_d_Y____________________ _____________________n_i_d_i_rC$C$_r_r_d_d_Y_A_A________________ ___________________n_i_d_d_Y_rC$_r_Y_d_d_Y_Y_A_A________________ _________________i_i_d_Y_d_Y_i_r_Y_Y_Y_d_Y_Y_A_A________________ _______________i_d_d_d_Y_Y_d_d_i_r_Y_d_d_Y_Y_A_A________________ _______________i_Y_d_Y_Y_d_i_i_Y_Y_i_d_d_Y_Y_A_A________________ _____________i_Y_d_Y_Y_Y_i_Y_Y_d_Y_d_i_i_Y_A_A__________________ ___________d_Y_i_Y_d_Y_i_Y_Y_Y_Y_Y_d_d_Y_i_A_A__________________ ___________d_d_i_Y_Y_i_Y_Y_Y_d_d_d_d_i_i_A_A____________________ ___________d_d_Y_i_i_Y_Y_d_d_Y_d_d_i_i_A_A______________________ ___________d_Y_Y_i_r_Y_d_Y_d_d_i_i_A_A_A________________________ ___________d_d_i_Y_Y_i_i_i_i_i_i_A_A_A__________________________ ___________d_i_Y_Y_Y_Y_d_d_i_A_A_A_A____________________________ ___________A_Y_Y_d_d_d_d_i_A_A_A________________________________ ___________A_A_A_A_A_A_A_A_A____________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 400 (green / turquoise) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ___________________________n_rC$C$C$C$C$_d_Y____________________ _______________________n_n_i_rC$C$C$C$_r_d_Y____________________ _____________________n_i_d_i_rC$C$_r_r_d_d_Y_A_A________________ ___________________n_i_d_d_Y_rC$_r_Y_d_d_Y_Y_A_A________________ _________________i_i_d_Y_d_Y_i_r_Y_Y_Y_d_Y_Y_A_A________________ _______________i_d_d_d_Y_Y_d_d_i_r_Y_d_d_Y_Y_A_A________________ _______________i_Y_d_Y_Y_d_i_i_Y_Y_i_d_d_Y_Y_A_A________________ _____________i_Y_d_Y_Y_Y_i_Y_Y_d_Y_d_i_i_Y_A_A__________________ ___________d_Y_i_Y_d_Y_i_Y_Y_Y_Y_Y_d_d_Y_i_A_A__________________ ___________d_d_i_Y_Y_i_Y_Y_Y_d_d_d_d_i_i_A_A____________________ ___________d_d_Y_i_i_Y_Y_d_d_Y_d_d_i_i_A_A______________________ ___________d_Y_Y_i_r_Y_d_Y_d_d_i_i_A_A_A________________________ ___________d_d_i_Y_Y_i_i_i_i_i_i_A_A_A__________________________ ___________d_i_Y_Y_Y_Y_d_d_i_A_A_A_A____________________________ ___________A_Y_Y_d_d_d_d_i_A_A_A________________________________ ___________A_A_A_A_A_A_A_A_A____________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 401 (yellow / citrine) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________CMCjC$C$C$C$C$BaAz____________________ ______________________CMCMByCjC$C$C$C$CjBaBW____________________ ____________________CMByBaByCjC$C$CjCjBaBaAg_A_A________________ __________________CMByBaBaAzCjC$CjAzBaBaAzBW_A_A________________ ________________ByByBaAzBaBWByCjAzAgBWBaAgAz_A_A________________ ______________ByBaBaBaAgAzBaBaByCjBWBaBaAzBW_L_A________________ ______________ByAzBaAzBWBaByByAgAzByBaBaAgAz_A_A________________ ____________ByAzBaAgBWAgByAzBWBaAzBaByByBW_A_A__________________ __________BaAgByBWBaAzByBWAzAgBWAgBaBaAzBy_A_A__________________ __________BaBaByAzAgByAzAgAzBaBaBaBaByBy_L_A____________________ __________BaBaBWByByAzBWBaBaAzBaBaByBy_A_A______________________ __________BaAzAgByCjBWBaAgBaBaByBy_A_A_A________________________ __________BaBaByBWAzByByByByByBy_A_A_A__________________________ __________BaByAzAgAzAgBaBaBy_A_A_A_A____________________________ ___________zAgBWBaBaBaBaBy_A_A_A________________________________ ___________A_A_A_A_A_A_A_A_A____________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 402 (green / aquamarine) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ___________________________n_rC$C$C$C$C$_d_Y____________________ _______________________n_n_i_rC$C$C$C$_r_d_Y____________________ _____________________n_i_d_i_rC$C$_r_r_d_d_Y_A_A________________ ___________________n_i_d_d_Y_rC$_r_Y_d_d_Y_Y_A_A________________ _________________i_i_d_Y_d_Y_i_r_Y_Y_Y_d_Y_Y_A_A________________ _______________i_d_d_d_Y_Y_d_d_i_r_Y_d_d_Y_Y_A_A________________ _______________i_Y_d_Y_Y_d_i_i_Y_Y_i_d_d_Y_Y_A_A________________ _____________i_Y_d_Y_Y_Y_i_Y_Y_d_Y_d_i_i_Y_A_A__________________ ___________d_Y_i_Y_d_Y_i_Y_Y_Y_Y_Y_d_d_Y_i_A_A__________________ ___________d_d_i_Y_Y_i_Y_Y_Y_d_d_d_d_i_i_A_A____________________ ___________d_d_Y_i_i_Y_Y_d_d_Y_d_d_i_i_A_A______________________ ___________d_Y_Y_i_r_Y_d_Y_d_d_i_i_A_A_A________________________ ___________d_d_i_Y_Y_i_i_i_i_i_i_A_A_A__________________________ ___________d_i_Y_Y_Y_Y_d_d_i_A_A_A_A____________________________ ___________A_Y_Y_d_d_d_d_i_A_A_A________________________________ ___________A_A_A_A_A_A_A_A_A____________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 403 (yellowish brown / amber) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________CICIC$C$C$C$C$BvBW____________________ ______________________CICIBvCIC$C$C$C$CIBvBW____________________ ____________________CIBvBvBvCIC$C$CICIBvBvBW_A_A________________ __________________CIBvBvBvBWCIC$CIBWBvBvBWBW_A_A________________ ________________CIBvBvBWBvBWBvCIBWBWBWBvBWBW_A_A________________ ______________CIBvBvBWBWBWBvBvCICIBWBvBvBWBW_A_A________________ ______________CIBWBvBWBWBvCICIBWBWCIBvBvBWBW_A_A________________ ____________CIBWBWBWBWBWCIBWBWBvBWBvCICIBW_A_A__________________ __________BvBWCIBWBWBWCIBWBWBWBWBWBvBvBWCI_A_A__________________ __________BvBvCIBWBWCIBWBWBWBvBvBvBvCICI_A_A____________________ __________BvBvBWCICIBWBWBWBvBWBvBvCICI_A_A______________________ __________BvBWBWCICIBWBvBWBvBvCICI_A_A_A________________________ __________BvBvCIBWBWCICIBvCICICI_A_A_A__________________________ __________BvCIBWBWBWBWBvCICI_A_A_A_A____________________________ ___________ABWBWBvBvBvBvCI_A_A_A________________________________ ___________A_A_A_A_A_A_A_A_A____________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 404 (yellowish brown / topaz) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________CICIC$C$C$C$C$BvBW____________________ ______________________CICIBvCIC$C$C$C$CIBvBW____________________ ____________________CIBvBvBvCIC$C$CICIBvBvBW_A_A________________ __________________CIBvBvBvBWCIC$CIBWBvBvBWBW_A_A________________ ________________CIBvBvBWBvBWBvCIBWBWBWBvBWBW_A_A________________ ______________CIBvBvBWBWBWBvBvCICIBWBvBvBWBW_A_A________________ ______________CIBWBvBWBWBvCICIBWBWCIBvBvBWBW_A_A________________ ____________CIBWBWBWBWBWCIBWBWBvBWBvCICIBW_A_A__________________ __________BvBWCIBWBWBWCIBWBWBWBWBWBvBvBWCI_A_A__________________ __________BvBvCIBWBWCIBWBWBWBvBvBvBvCICI_A_A____________________ __________BvBvBWCICIBWBWBWBvBWBvBvCICI_A_A______________________ __________BvBWBWCICIBWBvBWBvBvCICI_A_A_A________________________ __________BvBvCIBWBWCICIBvCICICI_A_A_A__________________________ __________BvCIBWBWBWBWBvCICI_A_A_A_A____________________________ ___________ABWBWBvBvBvBvCI_A_A_A________________________________ ___________A_A_A_A_A_A_A_A_A____________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 405 (black / jet) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________BJBdC$C$C$C$C$AOAB____________________ ______________________BJAjAeBdC$C$C$C$BdAOAB____________________ ____________________AlAeAOAeBdC$C$BdBdAOAOAB_A_A________________ __________________BDAeAOAOABBdC$BdABAOAOABAB_A_A________________ ________________AeAeAOABAOABAeBdABABABAOABAB_A_A________________ ______________AeAOAOAOABABAOAOAeBdABAOAOABAB_A_A________________ ______________AeABAOABABAOAeAeABABAeAOAOABAB_A_A________________ ____________AeABAOABABABAeABABAOABAOAeAeAB_A_A__________________ __________AOABAeABAOABAeABABABABABAOAOABAe_A_A__________________ __________AOAOAeABABAeABABABAOAOAOAOAeAe_A_A____________________ __________AOAOABAeAeABABAOAOABAOAOAeAe_A_A______________________ __________AOABABAeBdABAOABAOAOAeAe_A_A_A________________________ __________AOAOAeABABAeAeAeAeAeAe_A_A_A__________________________ __________AOAeABABABABAOAOAe_A_A_A_A____________________________ ___________AABABAOAOAOAOAe_A_A_A________________________________ ___________A_A_A_A_A_A_A_A_A____________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 406 (white / opal) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________CmCmC$C$C$C$C$BdBJ____________________ ______________________CmBkBkCoC$C$C$C$CmBdAj____________________ ____________________CoBkBkBkCmC$C$CmCmBdBdBJ_A_A________________ __________________CmBkBkBdBDCmC$CmBJBdBdAlBD_A_A________________ ________________BkBdBkAlBdBDBkCmBJAjAlBdBDAl_A_A________________ ______________BkBkBdBJAjBJBdBdBkCmBDBdBdAlBD_A_A________________ ______________CPAlBdBDAlBdBkBkBDBDBkBdBdBDAl_A_A________________ ____________BkBJAjBJAlBDBkBDBDBdAlBdBkBlBJ_A_A__________________ __________BdBDBkBDAlBDBxAjBJAjAlBJBkBdBJBk_A_A__________________ __________BdBdBkBDAlBkBDBJAlBdBdBdBdBkBn_z_A____________________ __________BdBdBJBlCJAjBDAlBdBDBdBdBnCJ_A_A______________________ __________BdAjBJBkCmBDBdAlBdBdBkBk_z_A_A________________________ __________BdBdBkAjBDBkBkBdBmBlCJ_B_A_A__________________________ __________BdBkBDBJAlBDBdCKBk_z_L_A_A____________________________ ___________ABDBJBdBdBdBkBk_L_A_A________________________________ ___________A_A_A_A_A_A_A_A_A____________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 407 (yellow / chrysoberyl) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________CMCjC$C$C$C$C$BaAz____________________ ______________________CMCMByCjC$C$C$C$CjBaBW____________________ ____________________CMByBaByCjC$C$CjCjBaBaAg_A_A________________ __________________CMByBaBaAzCjC$CjAzBaBaAzBW_A_A________________ ________________ByByBaAzBaBWByCjAzAgBWBaAgAz_A_A________________ ______________ByBaBaBaAgAzBaBaByCjBWBaBaAzBW_L_A________________ ______________ByAzBaAzBWBaByByAgAzByBaBaAgAz_A_A________________ ____________ByAzBaAgBWAgByAzBWBaAzBaByByBW_A_A__________________ __________BaAgByBWBaAzByBWAzAgBWAgBaBaAzBy_A_A__________________ __________BaBaByAzAgByAzAgAzBaBaBaBaByBy_L_A____________________ __________BaBaBWByByAzBWBaBaAzBaBaByBy_A_A______________________ __________BaAzAgByCjBWBaAgBaBaByBy_A_A_A________________________ __________BaBaByBWAzByByByByByBy_A_A_A__________________________ __________BaByAzAgAzAgBaBaBy_A_A_A_A____________________________ ___________zAgBWBaBaBaBaBy_A_A_A________________________________ ___________A_A_A_A_A_A_A_A_A____________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 408 (red / garnet) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________CuCuC$C$C$C$C$BoBN____________________ ______________________CuCuCBCuC$C$C$C$CuBoBN____________________ ____________________CuCBBoCBCuC$C$CuCuBoBoBN_A_A________________ __________________CuCBBoBoBNCuC$CuBNBoBoBNBN_A_A________________ ________________CBBoBoBNBoBNCBCuBNBNBNBoBNBN_A_A________________ ______________CBBoBoBNBNBNBoBoCBCuBNBoBoBNBN_A_A________________ ______________CBBNBoBNBNBoCBCBBNBNCBBoBoBNBN_A_A________________ ____________CBBNBNBNBNBNCBBNBNBoBNBoCBCBBN_A_A__________________ __________BoBNCBBNBNBNCBBNBNBNBNBNBoBoBNCB_A_A__________________ __________BoBoCBBNBNCBBNBNBNBoBoBoBoCBCB_A_A____________________ __________BoBoBNCBCBBNBNBNBoBNBoBoCBCB_A_A______________________ __________BoBNBNCBCuBNBoBNBoBoCBCB_A_A_A________________________ __________BoBoCBBNBNCBCBBoCBCBCB_A_A_A__________________________ __________BoCBBNBNBNBNBoCBCB_A_A_A_A____________________________ ___________ABNBNBoBoBoBoCB_A_A_A________________________________ ___________A_A_A_A_A_A_A_A_A____________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 409 (violet / amethyst) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________CvCvC$C$C$C$C$BpBO____________________ ______________________CvCCCCCvC$C$C$C$CvBpBO____________________ ____________________CvCCBpCCCvC$C$CvCvBpBpBO_A_A________________ __________________CvCCBpBpBOCvC$CvBOBpBpBOBO_A_A________________ ________________CCBpBpBOBpBOCCCvBOBOBOBpBOBO_A_A________________ ______________CCBpBpBOBOBOBpBpCCCvBOBpBpBOBO_A_A________________ ______________CCBOBpBOBOBpCCCCBOBOCCBpBpBOBO_A_A________________ ____________CCBOBOBOBOBOCCBOBOBpBOBpCCCCBO_A_A__________________ __________BpBOCCBOBOBOCCBOBOBOBOBOBpBpBOCC_A_A__________________ __________BpBpCCBOBOCCBOBOBOBpBpBpBpCCCC_A_A____________________ __________BpBpBOCCCCBOBOBOBpBOBpBpCCCC_A_A______________________ __________BpBOBOCCCvBOBpBOBpBpCCCC_A_A_A________________________ __________BpBpCCBOBOCCCCBpCCCCCC_A_A_A__________________________ __________BpCCBOBOBOBOBpCCCC_A_A_A_A____________________________ ___________ABOBOBpBpBpBpCC_A_A_A________________________________ ___________A_A_A_A_A_A_A_A_A____________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 410 (red / jasper) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________CuCuC$C$C$C$C$BoBN____________________ ______________________CuCuCBCuC$C$C$C$CuBoBN____________________ ____________________CuCBBoCBCuC$C$CuCuBoBoBN_A_A________________ __________________CuCBBoBoBNCuC$CuBNBoBoBNBN_A_A________________ ________________CBBoBoBNBoBNCBCuBNBNBNBoBNBN_A_A________________ ______________CBBoBoBNBNBNBoBoCBCuBNBoBoBNBN_A_A________________ ______________CBBNBoBNBNBoCBCBBNBNCBBoBoBNBN_A_A________________ ____________CBBNBNBNBNBNCBBNBNBoBNBoCBCBBN_A_A__________________ __________BoBNCBBNBNBNCBBNBNBNBNBNBoBoBNCB_A_A__________________ __________BoBoCBBNBNCBBNBNBNBoBoBoBoCBCB_A_A____________________ __________BoBoBNCBCBBNBNBNBoBNBoBoCBCB_A_A______________________ __________BoBNBNCBCuBNBoBNBoBoCBCB_A_A_A________________________ __________BoBoCBBNBNCBCBBoCBCBCB_A_A_A__________________________ __________BoCBBNBNBNBNBoCBCB_A_A_A_A____________________________ ___________ABNBNBoBoBoBoCB_A_A_A________________________________ ___________A_A_A_A_A_A_A_A_A____________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 411 (violet / fluorite) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________CvCvC$C$C$C$C$BpBO____________________ ______________________CvCCCCCvC$C$C$C$CvBpBO____________________ ____________________CvCCBpCCCvC$C$CvCvBpBpBO_A_A________________ __________________CvCCBpBpBOCvC$CvBOBpBpBOBO_A_A________________ ________________CCBpBpBOBpBOCCCvBOBOBOBpBOBO_A_A________________ ______________CCBpBpBOBOBOBpBpCCCvBOBpBpBOBO_A_A________________ ______________CCBOBpBOBOBpCCCCBOBOCCBpBpBOBO_A_A________________ ____________CCBOBOBOBOBOCCBOBOBpBOBpCCCCBO_A_A__________________ __________BpBOCCBOBOBOCCBOBOBOBOBOBpBpBOCC_A_A__________________ __________BpBpCCBOBOCCBOBOBOBpBpBpBpCCCC_A_A____________________ __________BpBpBOCCCCBOBOBOBpBOBpBpCCCC_A_A______________________ __________BpBOBOCCCvBOBpBOBpBpCCCC_A_A_A________________________ __________BpBpCCBOBOCCCCBpCCCCCC_A_A_A__________________________ __________BpCCBOBOBOBOBpCCCC_A_A_A_A____________________________ ___________ABOBOBpBpBpBpCC_A_A_A________________________________ ___________A_A_A_A_A_A_A_A_A____________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 412 (black / obsidian) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________BJBdC$C$C$C$C$AOAB____________________ ______________________BJAjAeBdC$C$C$C$BdAOAB____________________ ____________________AlAeAOAeBdC$C$BdBdAOAOAB_A_A________________ __________________BDAeAOAOABBdC$BdABAOAOABAB_A_A________________ ________________AeAeAOABAOABAeBdABABABAOABAB_A_A________________ ______________AeAOAOAOABABAOAOAeBdABAOAOABAB_A_A________________ ______________AeABAOABABAOAeAeABABAeAOAOABAB_A_A________________ ____________AeABAOABABABAeABABAOABAOAeAeAB_A_A__________________ __________AOABAeABAOABAeABABABABABAOAOABAe_A_A__________________ __________AOAOAeABABAeABABABAOAOAOAOAeAe_A_A____________________ __________AOAOABAeAeABABAOAOABAOAOAeAe_A_A______________________ __________AOABABAeBdABAOABAOAOAeAe_A_A_A________________________ __________AOAOAeABABAeAeAeAeAeAe_A_A_A__________________________ __________AOAeABABABABAOAOAe_A_A_A_A____________________________ ___________AABABAOAOAOAOAe_A_A_A________________________________ ___________A_A_A_A_A_A_A_A_A____________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 413 (orange / agate) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________CFCcC$C$C$C$C$BSAw____________________ ______________________CFCFBsCcC$C$C$C$CcBSAw____________________ ____________________CFBsBSBsCcC$C$CcCcBSBSAw_A_A________________ __________________CFBsBSBSAwCcC$CcAwBSBSAwAw_A_A________________ ________________BsBsBSAwBSAwBsCcAwAwAwBSAwAw_A_A________________ ______________BsBSBSBSAwAwBSBSBsCcAwBSBSAwAw_A_A________________ ______________BsAwBSAwAwBSBsBsAwAwBsBSBSAwAw_A_A________________ ____________BsAwBSAwAwAwBsAwAwBSAwBSBsBsAw_A_A__________________ __________BSAwBsAwBSAwBsAwAwAwAwAwBSBSAwBs_A_A__________________ __________BSBSBsAwAwBsAwAwAwBSBSBSBSBsBs_A_A____________________ __________BSBSAwBsBsAwAwBSBSAwBSBSBsBs_A_A______________________ __________BSAwAwBsCcAwBSAwBSBSBsBs_A_A_A________________________ __________BSBSBsAwAwBsBsBsBsBsBs_A_A_A__________________________ __________BSBsAwAwAwAwBSBSBs_A_A_A_A____________________________ ___________AAwAwBSBSBSBSBs_A_A_A________________________________ ___________A_A_A_A_A_A_A_A_A____________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 414 (green / jade) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ___________________________n_rC$C$C$C$C$_d_Y____________________ _______________________n_n_i_rC$C$C$C$_r_d_Y____________________ _____________________n_i_d_i_rC$C$_r_r_d_d_Y_A_A________________ ___________________n_i_d_d_Y_rC$_r_Y_d_d_Y_Y_A_A________________ _________________i_i_d_Y_d_Y_i_r_Y_Y_Y_d_Y_Y_A_A________________ _______________i_d_d_d_Y_Y_d_d_i_r_Y_d_d_Y_Y_A_A________________ _______________i_Y_d_Y_Y_d_i_i_Y_Y_i_d_d_Y_Y_A_A________________ _____________i_Y_d_Y_Y_Y_i_Y_Y_d_Y_d_i_i_Y_A_A__________________ ___________d_Y_i_Y_d_Y_i_Y_Y_Y_Y_Y_d_d_Y_i_A_A__________________ ___________d_d_i_Y_Y_i_Y_Y_Y_d_d_d_d_i_i_A_A____________________ ___________d_d_Y_i_i_Y_Y_d_d_Y_d_d_i_i_A_A______________________ ___________d_Y_Y_i_r_Y_d_Y_d_d_i_i_A_A_A________________________ ___________d_d_i_Y_Y_i_i_i_i_i_i_A_A_A__________________________ ___________d_i_Y_Y_Y_Y_d_d_i_A_A_A_A____________________________ ___________A_Y_Y_d_d_d_d_i_A_A_A________________________________ ___________A_A_A_A_A_A_A_A_A____________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 415 (white / worthless piece of white glass) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________CmCmC$C$C$C$C$BdBJ____________________ ______________________CmBkBkCoC$C$C$C$CmBdAj____________________ ____________________CoBkBkBkCmC$C$CmCmBdBdBJ_A_A________________ __________________CmBkBkBdBDCmC$CmBJBdBdAlBD_A_A________________ ________________BkBdBkAlBdBDBkCmBJAjAlBdBDAl_A_A________________ ______________BkBkBdBJAjBJBdBdBkCmBDBdBdAlBD_A_A________________ ______________CPAlBdBDAlBdBkBkBDBDBkBdBdBDAl_A_A________________ ____________BkBJAjBJAlBDBkBDBDBdAlBdBkBlBJ_A_A__________________ __________BdBDBkBDAlBDBxAjBJAjAlBJBkBdBJBk_A_A__________________ __________BdBdBkBDAlBkBDBJAlBdBdBdBdBkBn_z_A____________________ __________BdBdBJBlCJAjBDAlBdBDBdBdBnCJ_A_A______________________ __________BdAjBJBkCmBDBdAlBdBdBkBk_z_A_A________________________ __________BdBdBkAjBDBkBkBdBmBlCJ_B_A_A__________________________ __________BdBkBDBJAlBDBdCKBk_z_L_A_A____________________________ ___________ABDBJBdBdBdBkBk_L_A_A________________________________ ___________A_A_A_A_A_A_A_A_A____________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 416 (blue / worthless piece of blue glass) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ___________________________K_KC$C$C$C$C$_G_F____________________ _______________________K_K_H_KC$C$C$C$_K_G_F____________________ _____________________K_H_G_H_KC$C$_K_K_G_G_F_A_A________________ ___________________K_H_G_G_F_KC$_K_F_G_G_F_F_A_A________________ _________________H_G_G_F_G_F_H_K_F_F_F_G_F_F_A_A________________ _______________H_G_G_F_F_F_G_G_H_K_F_G_G_F_F_A_A________________ _______________H_F_G_F_F_G_H_H_F_F_H_G_G_F_F_A_A________________ _____________H_F_F_F_F_F_H_F_F_G_F_G_H_H_F_A_A__________________ ___________G_F_H_F_F_F_H_F_F_F_F_F_G_G_F_H_A_A__________________ ___________G_G_H_F_F_H_F_F_F_G_G_G_G_H_H_A_A____________________ ___________G_G_F_H_H_F_F_F_G_F_G_G_H_H_A_A______________________ ___________G_F_F_H_K_F_G_F_G_G_H_H_A_A_A________________________ ___________G_G_H_F_F_H_H_G_H_H_H_A_A_A__________________________ ___________G_H_F_F_F_F_G_H_H_A_A_A_A____________________________ ___________A_F_F_G_G_G_G_H_A_A_A________________________________ ___________A_A_A_A_A_A_A_A_A____________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 417 (red / worthless piece of red glass) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________CuCuC$C$C$C$C$BoBN____________________ ______________________CuCuCBCuC$C$C$C$CuBoBN____________________ ____________________CuCBBoCBCuC$C$CuCuBoBoBN_A_A________________ __________________CuCBBoBoBNCuC$CuBNBoBoBNBN_A_A________________ ________________CBBoBoBNBoBNCBCuBNBNBNBoBNBN_A_A________________ ______________CBBoBoBNBNBNBoBoCBCuBNBoBoBNBN_A_A________________ ______________CBBNBoBNBNBoCBCBBNBNCBBoBoBNBN_A_A________________ ____________CBBNBNBNBNBNCBBNBNBoBNBoCBCBBN_A_A__________________ __________BoBNCBBNBNBNCBBNBNBNBNBNBoBoBNCB_A_A__________________ __________BoBoCBBNBNCBBNBNBNBoBoBoBoCBCB_A_A____________________ __________BoBoBNCBCBBNBNBNBoBNBoBoCBCB_A_A______________________ __________BoBNBNCBCuBNBoBNBoBoCBCB_A_A_A________________________ __________BoBoCBBNBNCBCBBoCBCBCB_A_A_A__________________________ __________BoCBBNBNBNBNBoCBCB_A_A_A_A____________________________ ___________ABNBNBoBoBoBoCB_A_A_A________________________________ ___________A_A_A_A_A_A_A_A_A____________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 418 (yellowish brown / worthless piece of yellowish brown glass) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________CICIC$C$C$C$C$BvBW____________________ ______________________CICIBvCIC$C$C$C$CIBvBW____________________ ____________________CIBvBvBvCIC$C$CICIBvBvBW_A_A________________ __________________CIBvBvBvBWCIC$CIBWBvBvBWBW_A_A________________ ________________CIBvBvBWBvBWBvCIBWBWBWBvBWBW_A_A________________ ______________CIBvBvBWBWBWBvBvCICIBWBvBvBWBW_A_A________________ ______________CIBWBvBWBWBvCICIBWBWCIBvBvBWBW_A_A________________ ____________CIBWBWBWBWBWCIBWBWBvBWBvCICIBW_A_A__________________ __________BvBWCIBWBWBWCIBWBWBWBWBWBvBvBWCI_A_A__________________ __________BvBvCIBWBWCIBWBWBWBvBvBvBvCICI_A_A____________________ __________BvBvBWCICIBWBWBWBvBWBvBvCICI_A_A______________________ __________BvBWBWCICIBWBvBWBvBvCICI_A_A_A________________________ __________BvBvCIBWBWCICIBvCICICI_A_A_A__________________________ __________BvCIBWBWBWBWBvCICI_A_A_A_A____________________________ ___________ABWBWBvBvBvBvCI_A_A_A________________________________ ___________A_A_A_A_A_A_A_A_A____________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 419 (orange / worthless piece of orange glass) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________CFCcC$C$C$C$C$BSAw____________________ ______________________CFCFBsCcC$C$C$C$CcBSAw____________________ ____________________CFBsBSBsCcC$C$CcCcBSBSAw_A_A________________ __________________CFBsBSBSAwCcC$CcAwBSBSAwAw_A_A________________ ________________BsBsBSAwBSAwBsCcAwAwAwBSAwAw_A_A________________ ______________BsBSBSBSAwAwBSBSBsCcAwBSBSAwAw_A_A________________ ______________BsAwBSAwAwBSBsBsAwAwBsBSBSAwAw_A_A________________ ____________BsAwBSAwAwAwBsAwAwBSAwBSBsBsAw_A_A__________________ __________BSAwBsAwBSAwBsAwAwAwAwAwBSBSAwBs_A_A__________________ __________BSBSBsAwAwBsAwAwAwBSBSBSBSBsBs_A_A____________________ __________BSBSAwBsBsAwAwBSBSAwBSBSBsBs_A_A______________________ __________BSAwAwBsCcAwBSAwBSBSBsBs_A_A_A________________________ __________BSBSBsAwAwBsBsBsBsBsBs_A_A_A__________________________ __________BSBsAwAwAwAwBSBSBs_A_A_A_A____________________________ ___________AAwAwBSBSBSBSBs_A_A_A________________________________ ___________A_A_A_A_A_A_A_A_A____________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 420 (yellow / worthless piece of yellow glass) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________CMCjC$C$C$C$C$BaAz____________________ ______________________CMCMByCjC$C$C$C$CjBaBW____________________ ____________________CMByBaByCjC$C$CjCjBaBaAg_A_A________________ __________________CMByBaBaAzCjC$CjAzBaBaAzBW_A_A________________ ________________ByByBaAzBaBWByCjAzAgBWBaAgAz_A_A________________ ______________ByBaBaBaAgAzBaBaByCjBWBaBaAzBW_L_A________________ ______________ByAzBaAzBWBaByByAgAzByBaBaAgAz_A_A________________ ____________ByAzBaAgBWAgByAzBWBaAzBaByByBW_A_A__________________ __________BaAgByBWBaAzByBWAzAgBWAgBaBaAzBy_A_A__________________ __________BaBaByAzAgByAzAgAzBaBaBaBaByBy_L_A____________________ __________BaBaBWByByAzBWBaBaAzBaBaByBy_A_A______________________ __________BaAzAgByCjBWBaAgBaBaByBy_A_A_A________________________ __________BaBaByBWAzByByByByByBy_A_A_A__________________________ __________BaByAzAgAzAgBaBaBy_A_A_A_A____________________________ ___________zAgBWBaBaBaBaBy_A_A_A________________________________ ___________A_A_A_A_A_A_A_A_A____________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 421 (black / worthless piece of black glass) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________BJBdC$C$C$C$C$AOAB____________________ ______________________BJAjAeBdC$C$C$C$BdAOAB____________________ ____________________AlAeAOAeBdC$C$BdBdAOAOAB_A_A________________ __________________BDAeAOAOABBdC$BdABAOAOABAB_A_A________________ ________________AeAeAOABAOABAeBdABABABAOABAB_A_A________________ ______________AeAOAOAOABABAOAOAeBdABAOAOABAB_A_A________________ ______________AeABAOABABAOAeAeABABAeAOAOABAB_A_A________________ ____________AeABAOABABABAeABABAOABAOAeAeAB_A_A__________________ __________AOABAeABAOABAeABABABABABAOAOABAe_A_A__________________ __________AOAOAeABABAeABABABAOAOAOAOAeAe_A_A____________________ __________AOAOABAeAeABABAOAOABAOAOAeAe_A_A______________________ __________AOABABAeBdABAOABAOAOAeAe_A_A_A________________________ __________AOAOAeABABAeAeAeAeAeAe_A_A_A__________________________ __________AOAeABABABABAOAOAe_A_A_A_A____________________________ ___________AABABAOAOAOAOAe_A_A_A________________________________ ___________A_A_A_A_A_A_A_A_A____________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 422 (green / worthless piece of green glass) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ___________________________n_rC$C$C$C$C$_d_Y____________________ _______________________n_n_i_rC$C$C$C$_r_d_Y____________________ _____________________n_i_d_i_rC$C$_r_r_d_d_Y_A_A________________ ___________________n_i_d_d_Y_rC$_r_Y_d_d_Y_Y_A_A________________ _________________i_i_d_Y_d_Y_i_r_Y_Y_Y_d_Y_Y_A_A________________ _______________i_d_d_d_Y_Y_d_d_i_r_Y_d_d_Y_Y_A_A________________ _______________i_Y_d_Y_Y_d_i_i_Y_Y_i_d_d_Y_Y_A_A________________ _____________i_Y_d_Y_Y_Y_i_Y_Y_d_Y_d_i_i_Y_A_A__________________ ___________d_Y_i_Y_d_Y_i_Y_Y_Y_Y_Y_d_d_Y_i_A_A__________________ ___________d_d_i_Y_Y_i_Y_Y_Y_d_d_d_d_i_i_A_A____________________ ___________d_d_Y_i_i_Y_Y_d_d_Y_d_d_i_i_A_A______________________ ___________d_Y_Y_i_r_Y_d_Y_d_d_i_i_A_A_A________________________ ___________d_d_i_Y_Y_i_i_i_i_i_i_A_A_A__________________________ ___________d_i_Y_Y_Y_Y_d_d_i_A_A_A_A____________________________ ___________A_Y_Y_d_d_d_d_i_A_A_A________________________________ ___________A_A_A_A_A_A_A_A_A____________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 423 (violet / worthless piece of violet glass) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________CvCvC$C$C$C$C$BpBO____________________ ______________________CvCCCCCvC$C$C$C$CvBpBO____________________ ____________________CvCCBpCCCvC$C$CvCvBpBpBO_A_A________________ __________________CvCCBpBpBOCvC$CvBOBpBpBOBO_A_A________________ ________________CCBpBpBOBpBOCCCvBOBOBOBpBOBO_A_A________________ ______________CCBpBpBOBOBOBpBpCCCvBOBpBpBOBO_A_A________________ ______________CCBOBpBOBOBpCCCCBOBOCCBpBpBOBO_A_A________________ ____________CCBOBOBOBOBOCCBOBOBpBOBpCCCCBO_A_A__________________ __________BpBOCCBOBOBOCCBOBOBOBOBOBpBpBOCC_A_A__________________ __________BpBpCCBOBOCCBOBOBOBpBpBpBpCCCC_A_A____________________ __________BpBpBOCCCCBOBOBOBpBOBpBpCCCC_A_A______________________ __________BpBOBOCCCvBOBpBOBpBpCCCC_A_A_A________________________ __________BpBpCCBOBOCCCCBpCCCCCC_A_A_A__________________________ __________BpCCBOBOBOBOBpCCCC_A_A_A_A____________________________ ___________ABOBOBpBpBpBpCC_A_A_A________________________________ ___________A_A_A_A_A_A_A_A_A____________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 424 (gray / luckstone) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________BdBkBkBkBDBkBdBd________________________ __________________BDBdBkBDBdBJBkBlBkBDBdBJBDAl__________________ ________________BdBdBDBkBmBlBkBkBcBkBkBkBdBDBDAe________________ ______________BdBJBkBkBkBXBkBdBkBkBkBJBdBDBDBDBDAl______________ ____________BDBdBdBkBkBDBkBkBkBkAjBkBdBdBDBDAeAlBDAe____________ ____________BDBdBdAjBkBdBkBDBkBkBdBJBdBDAeBDBDAlBDAe____________ ____________AlBDBJBdBdBdBdBdBdBJBdBdBDBDBDAlAeAlAeAe____________ ____________BDAlBDBdBdBJBdBdBdBdBDBDBDAjAeBDBJAeAeAe_A_A________ ______________AlBDBDBDBDAjBDAeBDBDAlAeBJAlAeAeAeAe_A_A_A_A______ ________________BJAlAeBJAlBDAlBDAlBDAlAeAeAeAeAe_A_A_A_A_A______ __________________AeAeAeAlAeBDAlAeAeAeAeAeAeAe_A_A_A_A_A________ _________________B_A_A_BAeAeAeAeAeAeAeAe_A_A_A_A_A_A_A__________ ___________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A______________ _______________________A_A_A_A_A_A_A_A_A_A_A____________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 425 (gray / loadstone) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________BdBkBkBkBDBkBdBd________________________ __________________BDBdBkBDBdBJBkBlBkBDBdBJBDAl__________________ ________________BdBdBDBkBmBlBkBkBcBkBkBkBdBDBDAe________________ ______________BdBJBkBkBkBXBkBdBkBkBkBJBdBDBDBDBDAl______________ ____________BDBdBdBkBkBDBkBkBkBkAjBkBdBdBDBDAeAlBDAe____________ ____________BDBdBdAjBkBdBkBDBkBkBdBJBdBDAeBDBDAlBDAe____________ ____________AlBDBJBdBdBdBdBdBdBJBdBdBDBDBDAlAeAlAeAe____________ ____________BDAlBDBdBdBJBdBdBdBdBDBDBDAjAeBDBJAeAeAe_A_A________ ______________AlBDBDBDBDAjBDAeBDBDAlAeBJAlAeAeAeAe_A_A_A_A______ ________________BJAlAeBJAlBDAlBDAlBDAlAeAeAeAeAe_A_A_A_A_A______ __________________AeAeAeAlAeBDAlAeAeAeAeAeAeAe_A_A_A_A_A________ _________________B_A_A_BAeAeAeAeAeAeAeAe_A_A_A_A_A_A_A__________ ___________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A______________ _______________________A_A_A_A_A_A_A_A_A_A_A____________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 426 (gray / touchstone) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________BdBkBkBkBDBkBdBd________________________ __________________BDBdBkBDBdBJBkBlBkBDBdBJBDAl__________________ ________________BdBdBDBkBmBlBkBkBcBkBkBkBdBDBDAe________________ ______________BdBJBkBkBkBXBkBdBkBkBkBJBdBDBDBDBDAl______________ ____________BDBdBdBkBkBDBkBkBkBkAjBkBdBdBDBDAeAlBDAe____________ ____________BDBdBdAjBkBdBkBDBkBkBdBJBdBDAeBDBDAlBDAe____________ ____________AlBDBJBdBdBdBdBdBdBJBdBdBDBDBDAlAeAlAeAe____________ ____________BDAlBDBdBdBJBdBdBdBdBDBDBDAjAeBDBJAeAeAe_A_A________ ______________AlBDBDBDBDAjBDAeBDBDAlAeBJAlAeAeAeAe_A_A_A_A______ ________________BJAlAeBJAlBDAlBDAlBDAlAeAeAeAeAe_A_A_A_A_A______ __________________AeAeAeAlAeBDAlAeAeAeAeAeAeAe_A_A_A_A_A________ _________________B_A_A_BAeAeAeAeAeAeAeAe_A_A_A_A_A_A_A__________ ___________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A______________ _______________________A_A_A_A_A_A_A_A_A_A_A____________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 427 (gray / flint) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________BdBkBkBkBDBkBdBd________________________ __________________BDBdBkBDBdBJBkBlBkBDBdBJBDAl__________________ ________________BdBdBDBkBmBlBkBkBcBkBkBkBdBDBDAe________________ ______________BdBJBkBkBkBXBkBdBkBkBkBJBdBDBDBDBDAl______________ ____________BDBdBdBkBkBDBkBkBkBkAjBkBdBdBDBDAeAlBDAe____________ ____________BDBdBdAjBkBdBkBDBkBkBdBJBdBDAeBDBDAlBDAe____________ ____________AlBDBJBdBdBdBdBdBdBJBdBdBDBDBDAlAeAlAeAe____________ ____________BDAlBDBdBdBJBdBdBdBdBDBDBDAjAeBDBJAeAeAe_A_A________ ______________AlBDBDBDBDAjBDAeBDBDAlAeBJAlAeAeAeAe_A_A_A_A______ ________________BJAlAeBJAlBDAlBDAlBDAlAeAeAeAeAe_A_A_A_A_A______ __________________AeAeAeAlAeBDAlAeAeAeAeAeAeAe_A_A_A_A_A________ _________________B_A_A_BAeAeAeAeAeAeAeAe_A_A_A_A_A_A_A__________ ___________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A______________ _______________________A_A_A_A_A_A_A_A_A_A_A____________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 428 (rock) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________BsBsBS__________________________ ______________________________BsBsAwAwAwAY______________________ ____________________________BsBsBsAwAwAwAY______________________ ____________________BsBsBSAwBsBsBSAwAwAYAY______________________ __________________BsBsBsBSAwAwAwBSBSAwAYAYAY____________________ __________________BsBsBSBSAwAwAwAwBSAwAYAYAY____________________ ________________BsBsBsBSAwAwAwAwAwAwAwAwAYAY_A_A_A_A____________ ________________BsBsBsBSAwAwAwAwAwAwAwAwAYAY_A_A_A_A_A__________ ________________BsBsBSBSAwAwAwAwAwAwAwAwAwAYAY_A_A_A_A__________ ________________BsBsBsBSAwAwAwAwBSBSAwAwAwAYAY_A_A_A____________ ________________BsBsBsBSBSAwAwAYBSBSBSAwAwAY_A_A_A______________ _________________ABsBSBSBSAwAwAYAYBSBSAwAY_A_A_A_A______________ _________________A_A_ABSBSAwAwAYAYBSBSAw_A_A_A_A________________ ___________________A_A_A_A_A_A_A_A_A_A_A_A_A_A__________________ _______________________A_A_A_A_____A_A_A_A_A____________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 429 (boulder) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________________BSBS________________________________ ________________________AwAwAwAwAwAwAwAw________________________ ____________________BSBSAwAwAwBSAYAwAwBSAwAwBs__________________ ________________BSBSBSBSBSBSAYBsAwBSBSBSAwAwAwAw________________ ______________BSBsBsBsBsBsBsBSBSAwAwBsBSAYAwAwAAAw______________ ____________BSBSBsBsCFBsBsBsBsBSBSBSBSAYBSBSAwAwAwAw____________ ____________BSBsBsBSCFBsBsBSBsBSAYBsBSBSBsBSBSBSAwAw_A_A_A______ __________BSBsBsCFCFCFBSBSAwBsBSBSBSBSBSBSBSAYBSAwAwAw_A_A_A_A__ __________BsBsBSCFBsCFCFBsBsBsBSBSBSBsBSAwBSBSAwAwAwAABS_A_A_A_A ________BSAYBsBsCFCFBsBSAwBsBSBSBSAYBSAwBSAwBsBSAYAwAwAw_A_A_A_A ________BSBSBsBsBsBsBsAwBsBsAwAYBSBSAwBSAwAwBSAwBSAYAwAw_A_A_A_A ________BsBSBSBSBsBsBsBsBSBSAwBSBSBSBSBSBSBSBsBSAwAwAwAY_A_A_A_A ________BSBSBsBSBSBsBSBSAYBSBSBSBSBsBSBSBSBSBSBSAwAwAwAYAw_A_A_A ______AwBSBsBSAwBSBSBSBSBSBSBsBSBSBSAwBSAYBSAwAYAYAwAAAYAw_A_A_A ______BsAwBSAwAYBSBSAwBsBSBSBSBSBSBsAYBSBSBSAwAwBSAwAYAY_A_A_A_A ________AwBSBSBSBSBSBSBSAwBSBSBSBSBSBSBSBSBSBSAwAwAwAYAY_A_A_A_A ________AwAwBSBsBSAYBSAwAYBSBsBSAwBSBSBSBSBsAYAwAwAYAYAY_A_A_A_A ________AwAwAwAwBSBSBSBSBSBSBSBSAYAwBSAwAwAwAwAwAwAYAY_A_A_A_A_A __________AwAwAwAwBSBsBSBSAwBSBSBSBSBSBSAwAwAwAYAYAYAY_A_A_A_A__ ____________AYAwAwAwBSBSAwBsAYAwAwBSAwAwAwAwAYAYAYAY_A_A_A_A_A__ ____________AYAYAwBSAwAwAwBSBSAwAwAwAwAYAwAYAYAYAAAA_A_A_A______ ______________AYAYAYAYAYAwAwAwAwAwAYAYAYAYAYAYAA_z_A_A_A________ ________________AAAAAAAYAYAYAYAYAYAYAYAYAY_LAAAA_A_A_A__________ _____________________zAAAAAAAAAAAAAAAAAAAAAA_A_A_A______________ _____________________A_A_zAA_LAA_z_LAA_z_A_A_A_A________________ _________________________A_A_A_A_A_A_A_A_A_A____________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 430 (statue) { ________________________________________________________________ ____________CzCFCF__________CFCFBsBs____________________________ ____________CzCzCF________CzCzCzCFBsBS__________________________ ____________CzCFCF______CzCzBsCzCFBsBsBS________________________ ____________CFCF________CFCzCzBsBsBsBsBS________________________ __________CzCF________CFCzCzCFCFCFBsBsBS________________________ ________CzCFCF________CFBsBsCFCFBsBsBSBS________________________ ________CzCF__________CFCzBsCFBsBsBSBS__________________________ ________BsCFCF__________CzCFBsBSBSBS____________________________ __________BsCFCFCF______CFBsBsBS________________CzCzCz__________ ____________CFCFCFCFCzCFCzCFBs________________CzCzCzCFBs________ ____________BsCFCFCzCzCzCzCzCFBs________CzCzCzCFCFCFCFBs________ ____________BsCFCzCzCzCzCzCzCzCzCzCzCFCzCzCFBs____BsBs__________ ______________BsCFCzCzCzCzCzCzBsBsCzCzBsBsBs____________________ ______________BsBsCzBsCzCzCzBsBSBSBSBSBSBs______________________ ________________BsBsBsBSCzBsBsBSBS_______A___________A_A________ ________________CFCFBsBsBsBSBSBS_________A_A_______A_A_A_A______ ______________CFCzCFCFBsBSBSBS_____________A_A___A_A_A_A_A______ ____________CFCzCzCzCFBsBSBS_A___________A_A_A_A_A_A_A_A_A______ ____________CzCzCzCzCFBsBSBS_A_A___A_A_A_A_A_A_A_A_A_A_A________ __________CFCzCzCzCFCFCFBsBS_A_ABSAwAw_A_A_A_A_A_A_A_A_____A_A__ __________BsCFCzCFCFCFCFCFBsBsBSBSBSAwAw_A_A_A_A_A_A_A_A_A_A____ __________BSBsCFCFCFCFCFBsBsBsBsBSBSBSAwAw_A_A_A_A_A_A__________ ____________BsBsCFBsBsBsBsBsBsBSBSBSAwAwAw_A_A_A_A_A____________ ____________BSBsBsBsBsBsBsBsBsBSBSBSAwAwAw_A_A_A_A_A____________ ____________BSBSBsBsBsBsBsBsBSBSBSAwAwAwAw_A_A_A_A______________ ____________BSBSBSBSBSBsBSBSBSBSAwAwAwAwAw_A_A_A________________ __________BSBSAwBSBSBSBSBSBSBSAwAwAwAwAw_A_A_A_A________________ __________AwAwAwAwAwBSBSAwAwAwAwAwAw_A_A_A_A_A__________________ ____________Aw__AwAwAwAwAwAwAwAw_A_A_A_A________________________ _____________________________A_A_A_A____________________________ ________________________________________________________________ } # tile 431 (heavy iron ball) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________AeAeAeAeAeAe__________________________ ______________________AlAlAlAlAeAeAeAeAOAO______________________ ____________________AlAlBJAjBJAlAeAeAeAOAOAB____________________ __________________AlAlBDAlBDAlAlAlAeAeAOAOAB_M__________________ __________________AlAlBDAlBDAlAlAlAeAeAOAOAB_z__________________ ________________AeAlBDAlAjBJAlAlAeAeAeAOAOABAB_O________________ __AeAOAOAO______AeAlAlBDAlAlAlAlAeAeAOAOABAB_z_M________________ AeAOABABABAO____AeAlAlAlAlAlAlAeAeAeAOAOABAB_MAB________________ AeAe______AeAeAeAeAeAlAlAlAlAeAeAeAOAOAOABAB_z_M________________ AOAO____AOAOAOAOAeAeAeAeAeAeAeAeAOAOAOABAB_OA_AA________________ ABAB______ABABABAeAeAeAeAeAeAeAOAOAOABABAB_z_O_M________________ AOAOAOAOAOAO______AeAeAeAOAOAOAOAOABABAB_MAB_M_z_A_A_A__________ __ABABABAB________AOAOAOAOAOAOAOABABAB_MAK_z_M_z_A_A_A_A________ ____________________ABABABABABABABAB_O_$_M_M_A_A_A_A_A_A________ ___________________A_A_M_MAA_MA__MAAA__OAA_A_A_A_A_A_A__________ ___________________A_A_A_z_MA__MAA_M_M_A_A_A_A_A_A_A____________ _____________________A_A_A_A_A_A_A_A_z_A_A_A_A__________________ ___________________________A_A_A_A_A_A_A________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 432 (iron chain) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ _A_ABJAeAeAeAe_A_A_A_ABJAeAeAeAe_A_A_A_ABJAeAeAeAe_A____________ _AAlABABABABABAe_A_AAlABABABABABAe_A_AAlABABABABAeAe_A__________ AeAeAe_A_A_AAeAeAeAeAeAe_A_A_AAeAeAeAeAeAe_A_A_AABAeAB_A________ AOAOAO_A_A_AAeAOAOAOAOAO_A_A_AAeAOAOAOAOAO_A_A_A_AAeAB_A________ _MAB_M_A_A_A_M_MAB_z_O_M_z_A_A_M_MAB_z_O_M_zAO_AAeAeAB_A________ _AABAeAeAeAeAeAB_A_AAKAeAeAeAeAeAB_A_AAKAeAeAO_MAeAB_A_A________ _A_AABABABABAB_A_A_A_AABABABABAB_A_A_A_AABAeAO_MAK_A_A__________ ___A_A_A_A_A_A_A_____A_A_A_A_A_A_A___A_A_AAeAO_M_A_A____________ _______________________________________A_AAeAOAK_A_A____________ _______________________________________ABJAeAO_MAB_A_A__________ ______________________________________BJABAeAO_MAeAB_A__________ ______________________________________AeAB_A_A_zAeAB_A__________ ______________________________________AeAB_A_A_AAeAB_A__________ ______________________________________AeAB_A_A_AAeAB_A__________ ______________________________________AeABAeAe_MAeAB_A__________ _______________________________________AAeAeAO_zAB_A_A__________ _______________________________________A_AAeAOAB_A_A____________ _______________________________________A_AAeAO_M_A_A____________ _______________________________________ABJAeAO_MAB_A_A__________ ______________________________________AjABAeAOAAAeAB_A__________ ______________________________________AeAB_A_A_AAeAB_A__________ ______________________________________AeAB_A_A_AAeAB_A__________ ______________________________________AeAB_A_A_AAeAB_A__________ ______________________________________AeABAeAe_MAeAB_A__________ _______________________________________AAeAeAOABAB_A_A__________ _______________________________________A_AAeAO_z_A_A____________ _______________________________________A_AAeAO_M_A_A____________ _______________________________________ABJAeAOABAB_A_A__________ } # tile 433 (splash of venom / blinding venom) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________AOCPCPAOAOAO______CPAOAO________________________ ______________AOAOAOAOAOAOABAB____AOABAB____AOAO________________ ______CPAOAB____ABABABABABAB______________AOAOAOAOAO____________ ____AOAOAB______________________________AOCPCPAOAOAOAO__________ ____________CPAO______AOAOAOAOAO________ABABAOAOAOABAB__________ __________AOAOAOAB__AOAOCPCPAOAOAOAO____ABABABABABABAB__________ ____________ABAB__AOAOCPAOAOAOAOAOAOAO____ABABABABAB____AOAOAO__ __________________ABAOAOAOAOAOAOABABAB________________AOCPABABAB __CPAOAO__AOCP____ABABABABABABABABABAB___________A_A__ABABABAB__ AOAOAOAB____AOAO__ABABABABABABABABAB______CPAOAO________________ __ABABAB______________ABABABABABAB______ABAOAOABAB______________ ___________A_A_______________A_A_A________ABABAB_A_A_A_A________ _________A_A_A_____A_A_A_____________________A_A_A_A_A_A_A______ _A_A_A___________A_A_A_A_A_____________________A_A_A_A_A________ _A_A_A_____________A_A_A_______A_A_A_A_A________________________ ___________________________A_A_A_A_A_A_A_A_________A_A_A________ _______________A_A_A_____A_A_A_A_A_A_A_A_A___________A_A________ _______________A_A_A_______A_A_A_A_A_A_A________________________ _______________________A_A______________________________________ _______________________A_A_A____________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 434 (splash of venom / acid venom) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________BpCPCPBpBpBp______CPBpBp________________________ ______________BpBpBpBpBpBpArAr____BpArAr____BpBp________________ ______CPBpAr____ArArArArArAr______________BpBpBpBpBp____________ ____BpBpAr______________________________BpCPCPBpBpBpBp__________ ____________CPBp______BpBpBpBpBp________ArArBpBpBpArAr__________ __________BpBpBpAr__BpBpCPCPBpBpBpBp____ArArArArArArAr__________ ____________ArAr__BpBpCPBpBpBpBpBpBpBp____ArArArArAr____BpBpBp__ __________________ArBpBpBpBpBpBpArArAr________________BpCPArArAr __CPBpBp__BpCP____ArArArArArArArArArAr___________A_A__ArArArAr__ BpBpBpAr____BpBp__ArArArArArArArArAr______CPBpBp________________ __ArArAr______________ArArArArArAr______ArBpBpArAr______________ ___________A_A_______________A_A_A________ArArAr_A_A_A_A________ _________A_A_A_____A_A_A_____________________A_A_A_A_A_A_A______ _A_A_A___________A_A_A_A_A_____________________A_A_A_A_A________ _A_A_A_____________A_A_A_______A_A_A_A_A________________________ ___________________________A_A_A_A_A_A_A_A_________A_A_A________ _______________A_A_A_____A_A_A_A_A_A_A_A_A___________A_A________ _______________A_A_A_______A_A_A_A_A_A_A________________________ _______________________A_A______________________________________ _______________________A_A_A____________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/share/xpmread.c���������������������������������������������������������������0000664�0000764�0000764�00000014043�10545462317�015361� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* NetHack may be freely redistributed. See license for details. */ #include <X11/xpm.h> #include "hack.h" #include "tile.h" #ifndef MONITOR_HEAP extern long *FDECL(alloc, (unsigned int)); #endif extern const char *FDECL(tilename, (int, int)); static int tiles_across, tiles_down, curr_tiles_across, curr_tiles_down; static XpmImage image; static XpmInfo info; /* Maybe these should be in xpm.h, but there isn't one. */ boolean FDECL(fopen_xpm_file, (char *, char *)); boolean FDECL(read_xpm_tile, (pixel(*)[])); int NDECL(fclose_xpm_file); boolean fopen_xpm_file(filename, type) char *filename; char *type; { int i,n; int errorcode; char fmt[20]; unsigned long r, g, b; const pixel bg = DEFAULT_BACKGROUND; if (strcmp(type, RDBMODE)) { Fprintf(stderr, "using reading routine for non-reading?\n"); return FALSE; } errorcode = XpmReadFileToXpmImage(filename, &image, &info); if (errorcode != XpmSuccess) { Fprintf(stderr, "cannot open xpm file %s: %s\n", filename, XpmGetErrorString(errorcode)); return FALSE; } if (image.width % tile_x) { Fprintf(stderr, "error: width %d not divisible by %d\n", image.width, tile_x); exit(EXIT_FAILURE); } tiles_across = image.width / tile_x; curr_tiles_across = 0; if (image.height % tile_y) { Fprintf(stderr, "error: height %d not divisible by %d\n", image.height, tile_y); /* exit(EXIT_FAILURE) */; } tiles_down = image.height / tile_y; curr_tiles_down = 0; for (i = 0; i < image.ncolors; ++i) { if (!strcmp(image.colorTable[i].c_color, "None")) { ColorMap[CM_RED][i] = bg.r; ColorMap[CM_GREEN][i] = bg.g; ColorMap[CM_BLUE][i] = bg.b; } else if (image.colorTable[i].c_color[0] == '#') { n = strlen(image.colorTable[i].c_color + 1); if (n % 3 || n > 12 || n < 3) { Fprintf(stderr, "error: Unknown color defn for %s (%s)\n", image.colorTable[i].string, image.colorTable[i].c_color); exit(EXIT_FAILURE); } n /= 3; sprintf(fmt, "%%0%dlx%%0%dlx%%0%dlx", n, n, n); if (sscanf(image.colorTable[i].c_color + 1, fmt, &r, &g, &b) != 3) { Fprintf(stderr, "error: Unknown color defn for %s (%s)\n", image.colorTable[i].string, image.colorTable[i].c_color); exit(EXIT_FAILURE); } if (n>=2) { ColorMap[CM_RED][i]=r>>(n*4-8); ColorMap[CM_GREEN][i]=g>>(n*4-8); ColorMap[CM_BLUE][i]=b>>(n*4-8); } else { ColorMap[CM_RED][i]=r<<4; ColorMap[CM_GREEN][i]=g<<4; ColorMap[CM_BLUE][i]=b<<4; } } else { Fprintf(stderr, "error: Unknown color defn for %s (%s)\n", image.colorTable[i].string, image.colorTable[i].c_color); exit(EXIT_FAILURE); } } colorsinmap = image.ncolors; return TRUE; } /* Read a tile. Returns FALSE when there are no more tiles */ boolean read_xpm_tile(pixels) pixel (*pixels)[MAX_TILE_X]; { int i, j; unsigned int *src; if (curr_tiles_down >= tiles_down) return FALSE; if (curr_tiles_across == tiles_across) { curr_tiles_across = 0; curr_tiles_down++; if (curr_tiles_down >= tiles_down) return FALSE; } src = image.data + curr_tiles_down * tile_y * image.width + curr_tiles_across * tile_x; for (j = 0; j < tile_y; j++) { for (i = 0; i < tile_x; i++) { pixels[j][i].r = ColorMap[CM_RED][src[j * image.width + i]]; pixels[j][i].g = ColorMap[CM_GREEN][src[j * image.width + i]]; pixels[j][i].b = ColorMap[CM_BLUE][src[j * image.width + i]]; } } curr_tiles_across++; /* check for "filler" tile */ for (j = 0; j < tile_y; j++) { for (i = 0; i < tile_x && i < 4; i += 2) { if (pixels[j][i].r != ColorMap[CM_RED][0] || pixels[j][i].g != ColorMap[CM_GREEN][0] || pixels[j][i].b != ColorMap[CM_BLUE][0] || pixels[j][i+1].r != ColorMap[CM_RED][1] || pixels[j][i+1].g != ColorMap[CM_GREEN][1] || pixels[j][i+1].b != ColorMap[CM_BLUE][1]) return TRUE; } } return FALSE; } int fclose_xpm_file() { int i; XpmFreeXpmImage(&image); XpmFreeXpmInfo(&info); return FALSE; } #ifndef AMIGA static char *std_args[] = { "tilemap", /* dummy argv[0] */ "monsters.xpm", "monsters.txt", "objects.xpm", "objects.txt", "other.xpm", "other.txt" }; int main(argc, argv) int argc; char *argv[]; { int i, argn = 1; boolean split_mode = FALSE; int tile_set = 0; const char *name; pixel pixels[MAX_TILE_Y][MAX_TILE_X]; if (argc == 1) { argc = SIZE(std_args); argv = std_args; } tile_x = 16; tile_y = 16; while (argn < argc) { if (argv[argn][0] == '-' && argv[argn][1] == 'w') { if (argv[argn][2]) tile_x = atoi(argv[argn] + 2); else if (argn + 1 < argc) tile_x = atoi(argv[++argn]); else { Fprintf(stderr, "xpm2txt: -w option needs an argument\n"); exit(EXIT_FAILURE); } argn ++; } if (argv[argn][0] == '-' && argv[argn][1] == 'h') { if (argv[argn][2]) tile_y = atoi(argv[argn] + 2); else if (argn + 1 < argc) tile_y = atoi(argv[++argn]); else { Fprintf(stderr, "xpm2txt: -h option needs an argument\n"); exit(EXIT_FAILURE); } argn ++; } if (!strcmp(argv[argn], "-s")) { split_mode = TRUE; argn ++; } else break; } if (argc - argn != (split_mode ? 4 : 2)) { Fprintf(stderr, "usage: xpm2txt [-w#] [-h#] xpmfile txtfile\n"); Fprintf(stderr, " xpm2txt -s xpmfile montxt objtxt othtxt\n"); exit(EXIT_FAILURE); } if (!fopen_xpm_file(argv[argn++], RDBMODE)) exit(EXIT_FAILURE); init_colormap(); if (split_mode) tile_set = 1; while (argc > argn) { if (!fopen_text_file(argv[argn++], WRTMODE)) { (void) fclose_xpm_file(); exit(EXIT_FAILURE); } for(i = 0; ; i++) { if (tile_set) { name = tilename(tile_set, i); if (tile_set < 3 && !strncmp(name, "unknown ", 8)) break; } else name = "unknown"; if (!read_xpm_tile(pixels)) break; (void) write_text_tile_info(pixels, "tile", i, name); } if (tile_set) tile_set++; (void) fclose_text_file(); } (void) fclose_xpm_file(); exit(EXIT_SUCCESS); /*NOTREACHED*/ return 0; } #endif ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/share/obj32se.txt�������������������������������������������������������������0000664�0000764�0000764�00000714464�10545462317�015603� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������__ = (71, 108, 108) _A = (0, 0, 0) _B = (0, 0, 16) _C = (0, 0, 32) _D = (0, 0, 48) _E = (0, 0, 64) _F = (0, 0, 96) _G = (0, 0, 128) _H = (0, 0, 160) _I = (0, 0, 192) _J = (0, 0, 224) _K = (0, 0, 255) _L = (0, 16, 0) _M = (0, 16, 16) _N = (0, 24, 0) _O = (0, 24, 24) _P = (0, 24, 48) _Q = (0, 32, 0) _R = (0, 32, 32) _S = (0, 32, 64) _T = (0, 48, 0) _U = (0, 48, 24) _V = (0, 48, 48) _W = (0, 48, 96) _X = (0, 64, 0) _Y = (0, 64, 32) _Z = (0, 64, 64) _a = (0, 64, 128) _b = (0, 80, 160) _c = (0, 96, 0) _d = (0, 96, 48) _e = (0, 96, 96) _f = (0, 96, 192) _g = (0, 112, 224) _h = (0, 128, 0) _i = (0, 128, 64) _j = (0, 128, 128) _k = (0, 128, 255) _l = (0, 144, 0) _m = (0, 160, 0) _n = (0, 160, 80) _o = (0, 160, 160) _p = (0, 182, 255) _q = (0, 192, 0) _r = (0, 192, 96) _s = (0, 192, 192) _t = (0, 224, 0) _u = (0, 224, 112) _v = (0, 224, 224) _w = (0, 255, 0) _x = (0, 255, 128) _y = (0, 255, 255) _z = (16, 0, 0) _0 = (16, 0, 16) _1 = (16, 16, 0) _2 = (16, 16, 16) _3 = (16, 48, 48) _4 = (24, 0, 0) _5 = (24, 24, 0) _6 = (24, 24, 48) _7 = (24, 48, 0) _8 = (24, 48, 24) _9 = (24, 48, 48) _$ = (32, 0, 0) A_ = (32, 0, 32) AA = (32, 32, 0) AB = (32, 32, 32) AC = (32, 64, 0) AD = (32, 64, 32) AE = (32, 64, 64) AF = (32, 242, 186) AG = (48, 0, 0) AH = (48, 0, 48) AI = (48, 12, 0) AJ = (48, 24, 0) AK = (48, 24, 24) AL = (48, 36, 0) AM = (48, 48, 0) AN = (48, 48, 24) AO = (48, 48, 48) AP = (48, 48, 96) AQ = (48, 96, 0) AR = (48, 96, 48) AS = (48, 96, 96) AT = (64, 0, 0) AU = (64, 0, 32) AV = (64, 0, 64) AW = (64, 0, 128) AX = (64, 16, 0) AY = (64, 32, 0) AZ = (64, 32, 32) Aa = (64, 32, 64) Ab = (64, 48, 0) Ac = (64, 64, 0) Ad = (64, 64, 32) Ae = (64, 64, 64) Af = (64, 64, 128) Ag = (64, 128, 0) Ah = (64, 128, 64) Ai = (64, 128, 128) Aj = (72, 108, 108) Ak = (80, 0, 160) Al = (80, 80, 80) Am = (80, 80, 160) An = (80, 160, 0) Ao = (80, 160, 80) Ap = (80, 160, 160) Aq = (96, 0, 0) Ar = (96, 0, 48) As = (96, 0, 96) At = (96, 0, 192) Au = (96, 16, 0) Av = (96, 24, 0) Aw = (96, 48, 0) Ax = (96, 48, 48) Ay = (96, 48, 96) Az = (96, 72, 0) A0 = (96, 96, 0) A1 = (96, 96, 48) A2 = (96, 96, 96) A3 = (96, 96, 128) A4 = (96, 96, 192) A5 = (96, 128, 96) A6 = (96, 128, 128) A7 = (96, 192, 0) A8 = (96, 192, 96) A9 = (96, 192, 192) A$ = (96, 144, 178) B_ = (104, 84, 31) BA = (108, 144, 182) BB = (108, 255, 0) BC = (112, 0, 224) BD = (112, 112, 112) BE = (112, 112, 224) BF = (112, 160, 160) BG = (112, 224, 0) BH = (112, 224, 112) BI = (112, 224, 224) BJ = (117, 105, 88) BK = (120, 120, 160) BL = (120, 160, 120) BM = (120, 160, 160) BN = (128, 0, 0) BO = (128, 0, 64) BP = (128, 0, 128) BQ = (128, 0, 255) BR = (128, 32, 0) BS = (128, 64, 0) BT = (128, 64, 64) BU = (128, 64, 128) BV = (128, 90, 72) BW = (128, 96, 0) BX = (128, 96, 96) BY = (128, 96, 128) BZ = (128, 112, 32) Ba = (128, 128, 0) Bb = (128, 128, 64) Bc = (128, 128, 96) Bd = (128, 128, 128) Be = (128, 128, 255) Bf = (128, 255, 0) Bg = (128, 255, 128) Bh = (128, 255, 255) Bi = (144, 72, 0) Bj = (144, 135, 110) Bk = (144, 144, 144) Bl = (144, 144, 192) Bm = (144, 192, 144) Bn = (144, 192, 192) Bo = (160, 0, 0) Bp = (160, 0, 80) Bq = (160, 0, 160) Br = (160, 40, 0) Bs = (160, 80, 0) Bt = (160, 80, 80) Bu = (160, 80, 160) Bv = (160, 120, 0) Bw = (160, 120, 120) Bx = (160, 120, 160) By = (160, 160, 0) Bz = (160, 160, 80) B0 = (160, 160, 120) B1 = (160, 160, 160) B2 = (160, 160, 224) B3 = (165, 118, 96) B4 = (168, 168, 224) B5 = (168, 224, 168) B6 = (168, 224, 224) B7 = (170, 136, 52) B8 = (170, 154, 128) B9 = (176, 176, 176) B$ = (178, 64, 0) C_ = (178, 224, 16) CA = (182, 72, 0) CB = (192, 0, 0) CC = (192, 0, 96) CD = (192, 0, 192) CE = (192, 48, 0) CF = (192, 96, 0) CG = (192, 96, 96) CH = (192, 96, 192) CI = (192, 144, 0) CJ = (192, 144, 144) CK = (192, 144, 192) CL = (192, 160, 64) CM = (192, 192, 0) CN = (192, 192, 96) CO = (192, 192, 144) CP = (192, 192, 192) CQ = (192, 192, 255) CR = (192, 255, 192) CS = (192, 255, 255) CT = (202, 144, 114) CU = (208, 168, 80) CV = (208, 208, 208) CW = (210, 210, 178) CX = (218, 218, 182) CY = (224, 0, 0) CZ = (224, 0, 112) Ca = (224, 0, 224) Cb = (224, 56, 0) Cc = (224, 112, 0) Cd = (224, 112, 112) Ce = (224, 112, 224) Cf = (224, 168, 0) Cg = (224, 168, 168) Ch = (224, 168, 224) Ci = (224, 192, 160) Cj = (224, 224, 0) Ck = (224, 224, 112) Cl = (224, 224, 168) Cm = (224, 224, 224) Cn = (229, 162, 130) Co = (240, 240, 240) Cp = (242, 0, 0) Cq = (242, 96, 0) Cr = (242, 196, 77) Cs = (248, 224, 96) Ct = (252, 252, 153) Cu = (255, 0, 0) Cv = (255, 0, 128) Cw = (255, 0, 255) Cx = (255, 64, 0) Cy = (255, 108, 0) Cz = (255, 128, 0) C0 = (255, 128, 128) C1 = (255, 128, 255) C2 = (255, 182, 144) C3 = (255, 192, 0) C4 = (255, 192, 192) C5 = (255, 192, 255) C6 = (255, 211, 176) C7 = (255, 255, 0) C8 = (255, 255, 128) C9 = (255, 255, 192) C$ = (255, 255, 255) # tile 7 (wooden stake) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________CABiCACABiCA________________________________________ ____________CABiCACABiCA________________________________________ ____________CACABiCABiCA________________________________________ ______________CABiBiBiBi________________________________________ ______________BiCABiCABi________________________________________ ______________BiCABiCA_______________A_A________________________ ______________BiCABiCA_______________A_A_A_A____________________ ______________BiCABiCA___________A_A_A_A_A_A____________________ ______________BiCABiBi___________A_A_A_A_A_A_A__________________ ______________BiCABiBi_________A_A_A_A_A_A_A____________________ ________________CABiCA_______A_A_A_A_A_A_A______________________ ________________CABiCA_____A_A_A_A_A_A_A________________________ ________________CABiBi___A_A_A_A_A_A____________________________ ________________BiBi_____A_A_A_A_A_A____________________________ ________________CABi___A_A_A_A__________________________________ ________________CABi_A_A_A_A____________________________________ ________________BiBi_A_A_A______________________________________ ________________CACA_A_A________________________________________ ________________CA_A____________________________________________ ________________CA______________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 37 (fly swatter) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________________________________BdBdBd____________________ ____________________________________BdCP__CPBd__________________ __________________________________BdCP__CP__CPBd________________ ________________________________BdCP__CP__CP__CPBd______________ ______________________________BdCP__CP__CP__CP__CPBd____________ ____________________________BdCP__CP__CP__CP__CP__BdAe__________ __________________________BdCP__CP__CP__CP__CP__CPBdAe__________ ________________________BdCP__CP__CP__CP__CP__CPBdAe____________ ________________________Bd__CP__CP__CP__CP__CPBdAe______________ ________________________BdCP__CP__CP__CP__CPBdAe________________ __________________________BdCP__CP__CP__CPBdAe__________________ ____________________________BdCP__CP__CPBdAe____________________ __________________________BdAeBdCP__CPBdAe______________________ ________________________BdAe__AeBdBdBdAe________________________ ______________________BdAe______AeAeAe__________________________ ____________________BdAe________________________________________ ________________CPBdAe__________________________________________ ______________CPBdBdAe__________________________________________ ____________CPBdBdAeAe__________________________________________ __________CPBdBdAeAe____________________________________________ ________CPBdBdAeAe______________________________________________ ______CPBdBdAeAe________________________________________________ ____BdBdBdAeAe__________________________________________________ ______BdAeAe____________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 38 (silver mace) { ________________________________________________________________ ____________________________________________Cm__________________ ____________________________________________Cm__________________ ________________________________Cm________BkCmBk________CVAe____ __________________________________Cm__BkBkBkBkBkBdBd__CVAeAe____ ____________________________________BkBkCPBkBkBkBkBdBdAeAe______ __________________________________BkBkCVCmCPBkBkBkBdBdBDAe______ __________________________________BkBkCmCPCPCPBkBkBkBDBDAeAe____ ________________________________BkBkCPCPCPBkBkBkBkBkBdBdBDAeAe__ ____________________________CmCmCmBkBdCPBkBkCmBkBkBkBdBdCPCVCVAe ________________________________BkBkBkBkBkBkBkBkBkBkBdBdBD_A____ __________________________________BdBkBkBkBkBkBkBkBdBDBD_A_A_A__ __________________________________BkBdBdBkBkBkBkBdBdBDBD_A_A_A__ ________________________________CPCoBkBdBdBdBdBdBdBJBD_A_A_A_A__ ______________________________CPCmCPCPBJBDBDBdBdBDAj_ACP_A_A_A__ ____________________________CPCmCVBkBDAeAeBDCVBD_A_A_A_ACP_A_A__ __________________________CPCmCVBkBkAeAeAeAeCP_A_A_A_A_A_A_A_A__ ________________________CPCmCPBnBdAeAeAe__AeCV_A_A_A_A_A_A______ ______________________CPCmCVCJBdAeAeAe_______A_A________________ ____________________CPCmCVBkBdAeAeAe____________________________ __________________BWCICVBkBkAeAeAe______________________________ ________________BSBsBWBWBdAeAeAe________________________________ ______________AwBsBSBSAzAeAeAe__________________________________ ____________BSBsAwBSAw_AAeAe____________________________________ __________AwBsBSBSAY_A_AAe______________________________________ ________BSBsAwBSAw_A_A_A________________________________________ ______AwBsBSBSAY_A_A_A__________________________________________ ____BSBsAwBSAw_A_A_A____________________________________________ __AYBsBSBSAY_A_A_A______________________________________________ __AYAYBSAw_A_A_A________________________________________________ ___AAYAY_A_A_A__________________________________________________ ___A_A_A_A_A____________________________________________________ } # tile 43 (heavy hammer) { __________________________________________________________BDBD__ ______________________________________________________AlAlABBDAB ____________________________________________________BDBDBDBDBDAB __________________________________________________AlAlAeAlABAB__ ________________________________________________BDBDBDBDBDAB____ ______________________________________________BDAeAeAlABAB______ ______________AlAl__________________________AlAlAeAOBDAB________ ____________AlAlAlAlAl____________________BDBDBDBDBDAB__________ __________AlAlAeAlAlAlAlAl______________AlAlAeAlABAB____________ ________AlAlAlAlAlAlAlAlAlABAB________BDBDBDBDBDAB______________ ______AlAeBdBDBDBJAlAeAeAlABABAB____AlBDAeAlABAB________________ ____AlAlBDBDBJAjBDAeBDBdBdBdABABABBdBDBDBDBDAB__________________ __AlAlAeBdBDAlAlBDBdBdAlAlBkABABBDBDAlAOABABAB__________________ AOAOAlAlAlBDBdAlAlBdBDAlAeAeABBdBDAeAOABAlAlAeABABAB____________ AOABAOAO_A_A_AAlAlBDBDAeAeBDBdBJABAOAeAlAlAlAlAlAlABABAB________ AOAOAeAOAOAOAlBDAlAlAlBdBdBdBdAlAlBdBdAlAlAlAlAlAlAlAeABAB______ AOAOABAOAOAOAeAeAlBJAlAlAeBdAeAeAeAlBdAlAlAlAlAlAlAlAlABABAB____ AOAeAOAOAOAOAeAOAeAeAlAOAlBDBdBdAlAeBdBDAlAlAlAlAeBDAlABABAB____ AOAOAOAOAOAOAOAeAeAeAOAOAOABAlAlBdBDAlAlBdAlAlAlBJAlBDABABAB____ AOABAOABAOAOAeAeABAeAeABABABAlAlAlAlBJAlBDBDAlAjAlAlAl_OABAB____ AeAOAOAeAOAOAeAOAeAeAeAOAOABABAOAlAOBdBDBDAlAlBJAlBDAlABAB______ AOAOAOAOAOAOAOAeAeAOABABABABAOAOAeAOAOAlAlAlBDAlBDAlBJABAB______ ABABABAOAOAOAeAeAeABABABABABAOABAOAOABAlAlBDAlAlAlAlAlAB________ __ABABABAOAOAOABABABABABABABAOAeAOAOAOAlAlAlAlBJAjBJAjAB________ ______ABABABABABAB_OABAB_MABAOABAOAeAOAlBJAjAlBDAeAlAB__________ ____________________ABABABABAOAOAOABAOAlAlBJAlAlBJAB____________ ________________________ABABABAeAOAOAOAlAlAjAlBDA_______________ __________________________ABAOAOAOAOAeAlAlBXAlAB________________ __________________________ABABAOAOAOAOAlAjAlAB__________________ ____________________________ABABAOAOABAlBJAB____________________ ________________________________ABABAOAlAB______________________ ________________________________________________________________ } # tile 87 (bullet) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________AiBABABABABABA__________________________ ______________________AmBA_pBA_p_p_p_p_pBA______________________ ______________________AiBA_pBABABABABABABABA____________________ ______________________Am_s_pBABABABABABABAA$____________________ ______________________A$A$_pBABABAA$A$A$A$_A_A__________________ _________________________pA$BAA$A$A$A$_A_A_A____________________ _________________________A_A_A_A_A_A_A_A_A______________________ ___________________________A_A_A_A_A_A_A________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 88 (silver bullet) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________BeCQCQCQCQCQCQ__________________________ ______________________CQCQCmCQC$C$C$C$C$CQ______________________ ______________________BeCQC$CQCQCQCQCQCQCQCQ____________________ ______________________CQCQC$CQCQCQCQCQCQCQBe____________________ ______________________CQCQC$CQCQCQBeCQBeCQ_L_A__________________ ________________________C$CQBeCQBeCQBe_L_A_A____________________ _________________________A_A_A_A_A_A_A_A_A______________________ ___________________________A_A_A_A_A_A_A________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 89 (shotgun shell) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________CjCj__________________________________ ________________________CjCjCjCj________________________________ ________________________CjCjCjCj________________________________ _______________________LCjCjCjCj________________________________ _______________________zCBCjCjCu________________________________ _______________________ACBCBCuCu________________________________ _______________________zBpCECuCu________________________________ _______________________ACBCBCuCu________________________________ _______________________MCuCBCuCu________________________________ _______________________A_ACuCu__________________________________ _______________________A_A_A_B__________________________________ _________________________A_A____________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 90 (rocket) { ________________________________________________________________ ________________________________________________________________ ________________________________________________CuCu_p_p_p_p____ ______________________________________________CuCuCu_p_p_p_p____ ____________________________________________BACuCuCuCu_p_p_p____ ____________________________________________BABACuCuCuCu_p_p____ ____________________________________________BABA_pCuCuCuCuCu____ __________________________________________BABA_pBABACuCuCuCu____ ________________________________________BABA_pBABABABACuCu______ ______________________________________BABA_pBABABABABABA________ ____________________________________BABA_pBABABABA______________ __________________________________BABA_pBABABABA________________ ________________________________BABA_pBABABABA__________________ ______________________________BABA_pBABABABA____________________ _____________________K_K_K_KBA_p_pBABABABA______________________ _________________K_K_K_KBABABABABABABABA________________________ _____________K_K_K_KBABABABA_K_KBABABA__________________________ ___________K_K_K_K_KBABABA_K_K_KBA_K____________________________ _________K_K_K_K____BABA_K_K_KBABA_K____________________________ _________K_K_K______BA_K_K_KBABABA_K____________________________ _________K___________K_K_KBABABA_K_K____________________________ ___________________K_K_KBABABABA_K_K____________________________ _________________K_K_K_______K_K_K______________________________ _________________K_K_________K_K_K______________________________ ___________________________K_K_K________________________________ _________________________K_K_K_K________________________________ _________________________K_K_K__________________________________ _______________________K_K_K____________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 91 (frag grenade) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ _______________________________mAg______________________________ ____________________________AnAg_mAn__BABABA____________________ ____________________________An_qAn_mBABABABABA__________________ ________________________BABA_lAnAhBABA______BA__________________ ___________________________mAnAg_mAnBABABABABA__________________ _________________________hAg_mAn_qAn_lBABABA____________________ _____________________z_mAg_l_mAn_h_lAg_mAg______________________ ___________________A_AAg_mAh_l_hAn_mAg_lAg______________________ _________________A_MAg_lAnAg_h_h_mAh_h_mAn_l____________________ _________________A_A_mAg_q_lAn_m_h_lAn_m_hAg____________________ _______________A_A_BAnAg_h_h_mAg_lAn_lAg_lAn____________________ _______________A_AAg_m_m_hAn_lAh_l_mAn_l_mAg_m__________________ _______________A_A_h_h_lAh_mAg_h_mAg_lAh_h_mAg__________________ _____________A_A_AAn_lAn_mAn_lAn_l_h_mAnAn_lAn__________________ _____________A_A_A_M_l_lAg_hAn_mAn_hAn_m_l_l____________________ _____________A_A_A_AAgAn_lAn_mAh_lAn_hAg_lAn____________________ _______________A_A_B_m_lAn_l_h_l_qAg_m_lAg_l____________________ _______________A_A_A_zAn_mAn_l_hAgAh_lAn_m______________________ _______________A_A_A_B_mAh_m_hAn_l_mAn_mAg______________________ _________________A_A_A_zAgAn_mAg_q_hAgAh________________________ _________________A_A_A_A_MAn_mAh_lAn_m__________________________ ___________________A_A_A_A_A_B_lAg______________________________ _____________________A_A_A_A_A_A________________________________ _________________________A_A____________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 92 (gas grenade) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________BABA____________________________ ______________________________BA____BA__________________________ ______________________________BA____BA__________________________ ____________________________CXCXBABACXCX________________________ __________________________CXCyCyBABACyCyCX______________________ ________________________CXCyCyCyBABACyCyCyCX____________________ ________________________CXCyCyCyCyCyCyCyCyCX____________________ _______________________ACyCXCyCyCyCyCyCyCXCy____________________ _____________________A_ACyCyCXCXCXCXCXCXCyCy____________________ _____________________A_ACyCyCyCyCyCyCyCyCyCy____________________ _____________________A_ACXCyCyCyCyCyCyCyCyCX____________________ _____________________A_ACXCXC$C$C$C$C$C$CXCX____________________ _____________________A_ACyCXC$C$C$C$C$C$CXCy____________________ _____________________A_ACyCyCX_ACX_ACXCXCyCy____________________ _____________________A_ACXCyCX_A_ACX_A_ACyCX____________________ _____________________A_ACXCXC$C$C$C$C$C$CXCX____________________ _____________________A_ACyCXC$C$C$C$C$C$CXCy____________________ _____________________A_ACyCyCyCyCyCyCyCyCyCy____________________ _____________________A_ACyCyCyCyCyCyCyCyCyCy____________________ _____________________A_A_ACyCyCyCyCyCyCyCy______________________ _____________________A_A_A_ACyCyCyCyCyCy________________________ _______________________A_A_A_A_A_A_A_A__________________________ _________________________A_A_A_A_A_A____________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 93 (red stick / stick of dynamite) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________C$C$____________________ ______________________________________C$________________________ ____________________________________C$__________________________ __________________________________C$C$__________________________ ______________________________CuCuC$Cu__________________________ ____________________________CuCyC$C$CyCu________________________ ____________________________CuCyC$C$CyCB________________________ ____________________________CuCyCyCyCyCY________________________ ____________________________CuCuCyCyCYCB________________________ ____________________________CuCuCuCuCYCB________________________ ____________________________CuCuCuCuCYCY________________________ ____________________________CuCuCuCuCYCB________________________ ____________________________CuCuCuCuCYCY________________________ ____________________________CuCuCuCuCYCB________________________ ____________________________CuCuCuCuCYCB________________________ ____________________________CuCuCuCuCYCY________________________ ____________________________CuCuCuCuCYCB________________________ ____________________________CuCuCuCuCYCB________________________ ____________________________CuCuCuCuCYCY________________________ ____________________________CuCuCuCuCYCB________________________ ____________________________CuCuCuCuCYCY________________________ ____________________________CuCuCuCuCYCB________________________ ______________________________CuCuCuCY__________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 98 (boomerang) { ________________________________________________________________ ________________________________________________________________ ________________________CyCyCc__________________________________ ______________________CyCcB$B$B$_A______________________________ ______________________CyB$CuCAB$Bs_A____________________________ ______________________CcB$CACuCfB$Bs_A__________________________ _______________________ABsB$CfCzCACABs_A________________________ _________________________BCACACACuCAB$Bs_A______________________ ___________________________ABsCACACuCfCAB$_A____________________ _____________________________BB$CACfCzCAB$Bs_A__________________ _______________________________ABsCACACuCACABs_A________________ _________________________________BBsCACACuCzB$Bs_A______________ ___________________________________BB$BsCfCfCACAB$_A____________ _____________________________________BCACACACuCACABi_A__________ _______________________________________BCyCACACuB$Bi_A_A________ ______________________________________CyCqCACuCABsBi_A_A________ ____________________________________CyCFCzCfCAB$Bi_B_A_A________ __________________________________CyCqCACuCfB$Bi_A_A_A__________ ________________________________CyCcB$CuCACABi_B_A_A____________ ______________________________CyCqCfCzCABsBi_A_A_A______________ ____________________________CyCcB$CuCfCABi_B_A_A________________ __________________________CqCqB$CuCACABi_A_A_A__________________ ________________________CyCcCzCfCAB$Bi_B_A_A____________________ ______________________CyCACACuCfB$Bi_A_A_A______________________ ______________________CcB$CuCACABi_A_A_A________________________ ______________________CFB$CABsBi_A_A_A__________________________ ________________________B$BiBi_A_A_A____________________________ ___________________________A_A_A_A______________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 119 (red robe / robe) { ________________________________________________________________ ________________________________________________________________ _________________________________A_A_A__________________________ _____________________________A_ACYCYCB_A_A______________________ ___________________________ACYCYBNBNBNCBBo_A____________________ _________________________ACYBoBNBNBNCBCYBo_A____________________ _______________________ACYBoCBCBBNCBBoCYBo_A____________________ _______________________ACBBoCYCYCBBoBoCYCBBo_A__________________ _____________________ACYCBBoCYBoCBBoBNCuCBBo_A__________________ _____________________ACYCBBoCuBoCYBoBNCuCYCB_A__________________ _____________________ACuCBBoCuBoCuBoBNCuCYCBBo_A________________ _____________________ACuCBBoCuBoCuBoBNCuCYCBBo_A________________ _____________________ACuCBBoCYBoCuCBBNCuCuCBBo_A________________ ___________________ACBCuCYCBCYBoCYCBBNCYCuCBCB_A________________ ___________________ACBCYCYCBCYBoCYCBBNCYCuCYCB_A________________ _________________ABoBNCBCYBNCBCBCBBNCYCYCYCYCB_A________________ _________________ABoBNCBCYBoBNBNBNBNCYBNBNCYCB_A________________ _________________ABNBNBo_ABoCBBoCBBoCBBNBNCYCB_A________________ _________________ABoBNBo_ACBCYCBCBBoBoCBBNCYCB_A________________ ___________________A_A_A_ACBCYBoCBCBBoCBBNCB_A__________________ _________________________ACBCYBoCYCBBoBoCBCB_A__________________ _______________________ACBBoCYBoCYBoBoCBBoBo_A__________________ _______________________ACBBoCYBoCYBoBNCYBo_A____________________ _____________________ABoCBBNCBBNCYBoBNCYBo_A____________________ _____________________ABoCBBNBoBNCYBoBNCYBoBN_A__________________ _____________________ABoCBBNBoBNCBBoBNCBBoBN_A__________________ _______________________ABoBNBNBNCBBNBNBoBoBN_A__________________ _________________________A_ABNBNBoBNBNBo_A_A____________________ _____________________________A_A_A_A_A_A________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 120 (blue robe / robe of protection) { ________________________________________________________________ ________________________________________________________________ _________________________________A_A_A__________________________ _____________________________A_A_J_J_I_A_A______________________ ___________________________A_J_J_G_G_G_I_H_A____________________ _________________________A_J_H_G_G_G_I_J_H_A____________________ _______________________A_J_H_I_I_G_I_H_J_H_A____________________ _______________________A_I_H_J_J_I_H_H_J_I_H_A__________________ _____________________A_J_I_H_J_H_I_H_G_K_I_H_A__________________ _____________________A_J_I_H_K_H_J_H_G_K_J_I_A__________________ _____________________A_K_I_H_K_H_K_H_G_K_J_I_H_A________________ _____________________A_K_I_H_K_H_K_H_G_K_J_I_H_A________________ _____________________A_K_I_H_J_H_K_I_G_K_K_I_H_A________________ ___________________A_I_K_J_I_J_H_J_I_G_J_K_I_I_A________________ ___________________A_I_J_J_I_J_H_J_I_G_J_K_J_I_A________________ _________________A_H_G_I_J_G_I_I_I_G_J_J_J_J_I_A________________ _________________A_H_G_I_J_H_G_G_G_G_J_G_G_J_I_A________________ _________________A_G_G_H_A_H_I_H_I_H_I_G_G_J_I_A________________ _________________A_H_G_H_A_I_J_I_I_H_H_I_G_J_I_A________________ ___________________A_A_A_A_I_J_H_I_I_H_I_G_I_A__________________ _________________________A_I_J_H_J_I_H_H_I_I_A__________________ _______________________A_I_H_J_H_J_H_H_I_H_H_A__________________ _______________________A_I_H_J_H_J_H_G_J_H_A____________________ _____________________A_H_I_G_I_G_J_H_G_J_H_A____________________ _____________________A_H_I_G_H_G_J_H_G_J_H_G_A__________________ _____________________A_H_I_G_H_G_I_H_G_I_H_G_A__________________ _______________________A_H_G_G_G_I_G_G_H_H_G_A__________________ _________________________A_A_G_G_H_G_G_H_A_A____________________ _____________________________A_A_A_A_A_A________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 121 (orange robe / robe of power) { ________________________________________________________________ ________________________________________________________________ _________________________________A_A_A__________________________ _____________________________A_ACcCcCF_A_A______________________ ___________________________ACcCcBSBSBSCFBs_A____________________ _________________________ACcBsBSBSBSCFCcBs_A____________________ _______________________ACcBsCFCFBSCFBsCcBs_A____________________ _______________________ACFBsCcCcCFBsBsCcCFBs_A__________________ _____________________ACcCFBsCcBsCFBsBSCyCFBs_A__________________ _____________________ACcCFBsCyBsCcBsBSCyCcCF_A__________________ _____________________ACyCFBsCyBsCyBsBSCyCcCFBs_A________________ _____________________ACyCFBsCyBsCyBsBSCyCcCFBs_A________________ _____________________ACyCFBsCcBsCyCFBSCyCyCFBs_A________________ ___________________ACFCyCcCFCcBsCcCFBSCcCyCFCF_A________________ ___________________ACFCcCcCFCcBsCcCFBSCcCyCcCF_A________________ _________________ABsBSCFCcBSCFCFCFBSCcCcCcCcCF_A________________ _________________ABsBSCFCcBsBSBSBSBSCcBSBSCcCF_A________________ _________________ABSBSBs_ABsCFBsCFBsCFBSBSCcCF_A________________ _________________ABsBSBs_ACFCcCFCFBsBsCFBSCcCF_A________________ ___________________A_A_A_ACFCcBsCFCFBsCFBSCF_A__________________ _________________________ACFCcBsCcCFBsBsCFCF_A__________________ _______________________ACFBsCcBsCcBsBsCFBsBs_A__________________ _______________________ACFBsCcBsCcBsBSCcBs_A____________________ _____________________ABsCFBSCFBSCcBsBSCcBs_A____________________ _____________________ABsCFBSBsBSCcBsBSCcBsBS_A__________________ _____________________ABsCFBSBsBSCFBsBSCFBsBS_A__________________ _______________________ABsBSBSBSCFBSBSBsBsBS_A__________________ _________________________A_ABSBSBsBSBSBs_A_A____________________ _____________________________A_A_A_A_A_A________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 122 (green robe / robe of weakness) { ________________________________________________________________ ________________________________________________________________ _________________________________A_A_A__________________________ _____________________________A_A_t_t_q_A_A______________________ ___________________________A_t_t_h_h_h_q_m_A____________________ _________________________A_t_m_h_h_h_q_t_m_A____________________ _______________________A_t_m_q_q_h_q_m_t_m_A____________________ _______________________A_q_m_t_t_q_m_m_t_q_m_A__________________ _____________________A_t_q_m_t_m_q_m_h_w_q_m_A__________________ _____________________A_t_q_m_w_m_t_m_h_w_t_q_A__________________ _____________________A_w_q_m_w_m_w_m_h_w_t_q_m_A________________ _____________________A_w_q_m_w_m_w_m_h_w_t_q_m_A________________ _____________________A_w_q_m_t_m_w_q_h_w_w_q_m_A________________ ___________________A_q_w_t_q_t_m_t_q_h_t_w_q_q_A________________ ___________________A_q_t_t_q_t_m_t_q_h_t_w_t_q_A________________ _________________A_m_h_q_t_h_q_q_q_h_t_t_t_t_q_A________________ _________________A_m_h_q_t_m_h_h_h_h_t_h_h_t_q_A________________ _________________A_h_h_m_A_m_q_m_q_m_q_h_h_t_q_A________________ _________________A_m_h_m_A_q_t_q_q_m_m_q_h_t_q_A________________ ___________________A_A_A_A_q_t_m_q_q_m_q_h_q_A__________________ _________________________A_q_t_m_t_q_m_m_q_q_A__________________ _______________________A_q_m_t_m_t_m_m_q_m_m_A__________________ _______________________A_q_m_t_m_t_m_h_t_m_A____________________ _____________________A_m_q_h_q_h_t_m_h_t_m_A____________________ _____________________A_m_q_h_m_h_t_m_h_t_m_h_A__________________ _____________________A_m_q_h_m_h_q_m_h_q_m_h_A__________________ _______________________A_m_h_h_h_q_h_h_m_m_h_A__________________ _________________________A_A_h_h_m_h_h_m_A_A____________________ _____________________________A_A_A_A_A_A________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 156 (piece of cloth / cloak of displacement) { ________________________________________________________________ ______________________________BABA_A_A__________________________ ____________________________BABABABA_A_A________________________ __________________________BABABABA_pA$_A_A______________________ ________________________BABA_pBA_pBKA$A$_A_A____________________ ______________________BABABABA_pBAA$BK_pBA_A_A__________________ _____________________pBABABA_pBA_pBA_pBKA$BA_A_A________________ __________________BABA_pBA_pBABlBK_pA$A$BABABA_A_A______________ ________________BABABABA_pBABABA_pBM_gBABABA_pBA_A_A____________ ______________BABABABA_pBA_pBl_pBABABF_pBA_pBABABA_A_A__________ _____________pBABABA_pBABABA_pBlBMBABKA$_pBABABA_pBA_A_A________ __________BABA_pBA_pBABAA$BIBl_pBAA$A$_pBA_pBA_pBABABA_A_A______ _________pBABABA_pBABABA_pBABABA_pBK_sBABAA$_pBABABABABA_A_A____ ______BABA_pBA_pBA_pA$A$BABlBABlBM_pA$BABK_pBA_pA$BABA_pBA_A_A__ ____BABABABA_pBABAA$_pBABABABnBA_pBK_pBA_pBlBABA_pBA_pBABABA_A_A ___pBABABA_pBA_pBA_pBA_pBnBABl_pBABAA$A$BABFBABABA_pBABABABA_A_A BABA_pBA_pBKBAA$_pBABlBABIBABIBABABAA$A$_pA$A$A$A$A$_pBABA_A_A_A BABABA_pBAA$BA_pBAA$BABABA_pA$BAA$A$A$A$BK_sAmA$A$BABABA_A_A_A_A __BA_pBA_pBA_pBlBABABIBAA$A$A$A$A$A$A$A$_kBA_pAiAm_L_A_z_A_A_A__ ____BABABA_pBABABlBnBA_pA$_pA$_kA$A$A$A$BMBABM_g_M_A_A_A___A____ ______BA_pBA_pBlBnBAA$BKA$A$A$BA_sBE_pBABABABA_L_A_A_A__________ ________BABlBABIBAA$BK_sA$_pA$BABA_pA$BABABA_A_A_A_A____________ __________BABlBAA$A$_gBABAA$_pBA_pBK_pBABA_A_A_A_A______________ ____________BnBA_gApA$BKBABABK_pBABABA_p_A_A_A_A________________ ______________A$A$A$_pBABAA$_pBA_pBABA_A_A_A_A__________________ ________________A$A$BK_pBA_pBABABA_p_A_A_A_A____________________ __________________A$BABA_pBABKBABA_z_A_A_A______________________ ____________________BA_pBA_pBABA_A_A_A_A________________________ ______________________BABABA_p_A_A_A_A__________________________ ________________________BABA_A_A_A_A____________________________ ___________________________A_A_A_A______________________________ ________________________________________________________________ } # tile 171 (black gloves / gauntlets of swimming) { ________________________________________________________________ _________________________________________________G_F_A_A_G_F_A_A ___________________________________F___________G_F_F_A_G_F_F_A_A _________________________________F_G_F_______G_F_F_F_G_F_F_F_A_A _________________________________F_G_F_____G_F_F_F_G_F_F_F_G_F_A _________________________________F_G_F___F_G_G_E_G_F_F_E_G_F_F_A _________________________________F_G_G_F_F_F_G_G_F_F_F_G_F_F_F_A _________________________________F_G_F_F_G_G_F_F_F_E_G_F_F_E_A_A _________________________________F_G_F_G_G_F_F_F_F_F_F_G_S_G_F_A _________________________________F_G_G_G_F_G_F_G_F_F_F_E_G_F_F_A _________________________________G_G_F_F_F_F_F_F_F_S_F_E_F_F_A_A ___________________________F_F_F_F_G_F_F_G_F_F_F_E_F_E_F_E_A_A__ _______________________F_F_F_G_G_F_E_G_F_F_S_F_S_E_F_E_S_B_A____ _____________________F_F_G_G_G_F_F_F_S_F_E_F_E_F_E_A_A_A_A______ _________________F_F_F_G_G_G_F_F_G_F_F_E_E_E_F_A_A_A_A_A________ _______________F_F_G_G_G_F_F_F_F_F_E_E_E_A_L_A_A_A_A____________ _____________F_G_G_G_G_F_G_F_F_G_E_F_P_A_A_A_A_A________________ ___________F_G_G_F_F_F_F_F_F_F_F_S_D_A_A_A_A____________________ ___________G_G_F_F_E_F_G_F_F_F_E_E_D_A_A_A______________________ ___________G_F_F_F_G_S_F_F_F_E_P_D_A_A_A________________________ ___________A_F_G_F_F_F_F_E_S_E_D_A_A_A_A________________________ ___________A_F_F_F_F_F_E_D_E_D_A_A_A_A__________________________ ___________A_A_F_F_F_S_E_E_D_A_A_A_A____________________________ _____________A_M_F_E_E_E_P_A_A_A_A______________________________ _______________A_A_B_A_A_A_A_A_A________________________________ _________________A_A_A_A_A_A____________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 205 (glass / gain wisdom) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________C$C$C$C$C$C$C$C$BABE________________________ __________________C$C$C$C$C$C$C$BKBEBKBEBK______________________ ________________C$C$C$__________________BEBK____________________ ______________C$C$C$______________________BABE__________________ ____________C$C$C$_______A_A_A_A_A_ABABE____BKBE________________ ____________C$C$_______A_A_A_A_A_A_A_ABEBK____BK________________ ____________C$BA_____A_A_A_A_A_A_A_A_A_AC$____BE_A_A____________ ____________C$BE_____A_A_A_A_A_A_A_A_A_AC$C$__BA_A_A____________ ____________C$BK_____A_A_A_A_A__________C$C$_____A_A____________ ____________BKBE_____A_A_A_A____________C$C$_____A_A____________ ____________BEBK____BA_A_A_A__________C$C$_______A_A____________ ____________BKBE____BKBE_A_A________C$C$C$_______A_A____________ ______________BEBK______C$C$C$C$C$C$C$C$_______A_A_A____________ ________________BABE______C$C$C$C$C$_________A_A_A_A____________ __________________BKBE_____________________A_A_A________________ ____________________BEBKBEBA_____________A_A_A_A________________ _________________________A_A_A_A_A_A_A_A_A_A____________________ _________________________A_A_A_A_A_A_A_A_A_A____________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 223 (square / amulet of change) { ________________________________________________________________ ________________________________CLCLCLCLCLCL____________________ ____________________________CLCL_A_A_A_A_A_ACLCL________________ ________________________CLCL_A_A_____________A_ACL_A____________ ______________________CL_A_A____________________CL_A____________ ____________________CL_A__________________________CL_A__________ ____________________CL_A__________________________CL_A__________ __________________CL_A______CLCLCLCL________________CL_A________ __________________CL_A____CL_A_A_A_ACL______________CL_A________ ________________CL_A______CL_A_______ACL____________CL_A________ ________________CL_A____CL_A___________ACL__________CL_A________ ________________CL_A____CL_A___________ACL__________CL_A________ ________________CL_A____CL_A______________CL________CL_A________ ________________CL_A____CL_A______________CL_A______CL_A________ ________________CL_A____CL_A______________CL_A______CL_A________ __________________CL_A__CL_A______________CL_A______CL_A________ __________________CL_A__CL_A______________CL_A______CL_A________ __________________CL_A__CL_A______________CL_A______CL_A________ __________________CL_ACP_A_A______________CL_A____CL_A__________ ____________________C$CPBd_A________________CL_A__CL_A__________ __________________C$C$CPBdBd_A______________CL_A__CL_A__________ ________________C$C$C$CPBdBdBd_A______________CLCL_A____________ ______________C$C$C$BdBdBdBdBdBd_A_____________A_A______________ ____________C$C$C$BdBdBdBdBdBdBdBd_A____________________________ __________CPCPCPCPBdBdBdBdBdBJAjBJAl_A__________________________ ___________ABdBdBdBdBdBdBdBdABABAB_B____________________________ _____________ABdBdBdBdBdBdABABAB_A______________________________ _______________ABdBdBdBJABABAB_A________________________________ _________________ABdBdAjABAB_A__________________________________ ___________________ABdBJAB_A____________________________________ _____________________AAl_A______________________________________ _______________________A________________________________________ } # tile 224 (warped / amulet of drain resistance) { ________________________________________________________________ ________________________________CLCLCLCLCLCL____________________ ____________________________CLCL_A_A_A_A_A_ACLCL________________ ________________________CLCL_A_A________________CL_A____________ ______________________CL_A_A____________________CL_A____________ ____________________CL_A__________________________CL_A__________ ____________________CL_A__________________________CL_A__________ __________________CL_A______CLCLCLCL________________CL_A________ __________________CL_A____CL_A_A_A_ACL______________CL_A________ ________________CL_A______CL_A_______ACL____________CL_A________ ________________CL_A____CL_A___________ACL__________CL_A________ ________________CL_A____CL_A___________ACL__________CL_A________ ________________CL_A____CL_A______________CL________CL_A________ ________________CL_A____CL_A______________CL_A______CL_A________ ________________CL_A____CL_A______________CL_A______CL_A________ __________________CL_A__CL_A______________CL_A______CL_A________ __________________CL_A__CL_A______________CL_A______CL_A________ __________________CL_A____CL_A____________CL_A______CL_A________ __________________CL_A____CL_A____________CL_A____CL_A__________ ____________________CL_A__CL_A______________CL_A__CL_A__________ __________________C$CPCPCPCPBd______________CL_A__CL_A__________ ________________C$C$CPCPCPCPBdBd_A____________CLCL_A____________ ______________C$C$C$BdBdBdBdAeAe_A_____________A_A______________ ____________C$C$C$C$BdBdBdBdAe_A_A______________________________ ____________CPCPCPBdBdBdBdAeAe_A________________________________ ____________CPCPCPBdBdBdBdAe_A_A________________________________ ____________CPCPCPBdBdBdAeAe_A__________________________________ ____________BdBdBdBdBdBdAe_A_A__________________________________ _____________ABdBdBdBdAeAe_A____________________________________ _______________ABdBdBdAe_A_A____________________________________ _________________ABdBdAe_A______________________________________ ___________________A_A_A_A______________________________________ } # tile 225 (circular / amulet of ESP) { ________________________________________________________________ ________________________________CLCLCLCLCLCL____________________ ____________________________CLCL_A_A_A_A_A_ACLCL________________ ________________________CLCL_A_A________________CL_A____________ ______________________CL_A_A____________________CL_A____________ ____________________CL_A__________________________CL_A__________ ____________________CL_A__________________________CL_A__________ __________________CL_A______CLCLCLCL________________CL_A________ __________________CL_A____CL_A_A_A_ACL______________CL_A________ ________________CL_A______CL_A_______ACL____________CL_A________ ________________CL_A____CL_A___________ACL__________CL_A________ ________________CL_A____CL_A___________ACL__________CL_A________ ________________CL_A____CL_A______________CL________CL_A________ ________________CL_A____CL_A______________CL_A______CL_A________ ________________CL_A____CL_A______________CL_A______CL_A________ __________________CL_A__CL_A______________CL_A______CL_A________ __________________CL_A__CL_A______________CL_A______CL_A________ __________________CL_A____CL_A____________CL_A______CL_A________ __________________CL_A____CL_A____________CL_A____CL_A__________ ____________________CL_A__CL_A______________CL_A__CL_A__________ ____________________CmCPCP__________________CL_A__CL_A__________ ________________C$CmCmBdCVBkBk________________CLCL_A____________ ______________C$C$BdBdBdBdBdCPBk_______________A_A______________ ______________CmBdBdBdBdBdBdBdBk_A______________________________ ____________CmCmBdBdBdBdBdBdBdBdBD_A____________________________ ____________CPBdBdBdBdBdBdBdBdBdBD_A____________________________ ____________CPCPBdBdBdBdBdBdBdBDBD_A____________________________ ______________BkBdBdBdBdBdBdBdBD_A_A____________________________ ______________BnCJBdBdBdBdBdAlBJ_A_A____________________________ ________________BkBDBDBdBDAlBD_A_A______________________________ ___________________MBDBJAl_B_A_A________________________________ _____________________A_A_A_A_A__________________________________ } # tile 226 (convex / amulet of flying) { ________________________________________________________________ ________________________________CLCLCLCLCLCL____________________ ____________________________CLCL_A_A_A_A_A_ACLCL________________ ________________________CLCL_A_A________________CL_A____________ ______________________CL_A_A____________________CL_A____________ ____________________CL_A__________________________CL_A__________ ____________________CL_A__________________________CL_A__________ __________________CL_A______CLCLCLCL________________CL_A________ __________________CL_A____CL_A_A_A_ACL______________CL_A________ ________________CL_A______CL_A_______ACL____________CL_A________ ________________CL_A____CL_A___________ACL__________CL_A________ ________________CL_A____CL_A___________ACL__________CL_A________ ________________CL_A____CL_A______________CL________CL_A________ ________________CL_A____CL_A______________CL_A______CL_A________ ________________CL_A____CL_A______________CL_A______CL_A________ __________________CL_A__CL_A______________CL_A______CL_A________ __________________CL_A__CL_A______________CL_A______CL_A________ __________________CL_A____CL_A____________CL_A______CL_A________ __________________CL_A____CL_A____________CL_A____CL_A__________ ____________________CL_A__CL_A______________CL_A__CL_A__________ ____________________CmCPCP__________________CL_A__CL_A__________ ________________C$CmCmCPCVBkBk________________CLCL_A____________ ______________C$C$CmCmCPCPBkCPBd_______________A_A______________ ______________CmCmCmCPCPCPBkBdBd_A______________________________ ____________CmCmCmCPCPCPBkBdBdBdBd_A____________________________ ____________CPCPCPCPCPBkBdBdBdBdBd_A____________________________ ____________CPCPCPBkCPBdBdBdBdBJAj_A____________________________ ______________BkCPBkBdBdBdAlBDAl_A_A____________________________ ______________BkBkBdBdBdBdBDAlBD_A_A____________________________ ________________BkBdBdBdBDAlBJ_A_A______________________________ ___________________ABdBdAl_B_A_A________________________________ _____________________A_A_A_A_A__________________________________ } # tile 232 (concave / amulet of unchanging) { ________________________________________________________________ ________________________________CLCLCLCLCLCL____________________ ____________________________CLCL_A_A_A_A_A_ACLCL________________ ________________________CLCL_A_A________________CL_A____________ ______________________CL_A_A____________________CL_A____________ ____________________CL_A__________________________CL_A__________ ____________________CL_A__________________________CL_A__________ __________________CL_A______CLCLCLCL________________CL_A________ __________________CL_A____CL_A_A_A_ACL______________CL_A________ ________________CL_A______CL_A_______ACL____________CL_A________ ________________CL_A____CL_A___________ACL__________CL_A________ ________________CL_A____CL_A___________ACL__________CL_A________ ________________CL_A____CL_A______________CL________CL_A________ ________________CL_A____CL_A______________CL_A______CL_A________ ________________CL_A____CL_A______________CL_A______CL_A________ __________________CL_A__CL_A______________CL_A______CL_A________ __________________CL_A__CL_A______________CL_A______CL_A________ __________________CL_A____CL_A____________CL_A______CL_A________ __________________CL_A____CL_A____________CL_A____CL_A__________ ________________CPCVBkBkCPBkBk______________CL_A__CL_A__________ ______________CPBkBkBDBJAlBDBkCP____________CL_A__CL_A__________ ____________CPBkBDBDBdBdBdBdBnBkBk____________CLCL_A____________ ____________CPBkBDBDBdBdBdBkCJBlBj_A___________A_A______________ __________CPBkBDBdBdBdBkCKBmCPCVBkBd_A__________________________ __________CPBkBDBdBdBkBnCPCPCPCPBmBd_A__________________________ __________CPCPAlBdBnCJCPCPCPCmCmCKBd_A__________________________ ____________CPBkBdBkBkCVCPCmCmBkBd_A_A__________________________ ____________CPCOBkCPCPCPCmCmC$BmBd_A_A__________________________ ______________BlBkBkCPCPCmBkBkBk_A_A_A__________________________ ______________BjBnCJBnCJBkBkBd_A_A_A____________________________ _________________ABdBdBdBd_A_A_A_A______________________________ _____________________A_A_A_A_A_A________________________________ } # tile 234 (lunate / amulet versus stone) { ________________________________________________________________ ________________________________CLCLCLCLCLCL____________________ ____________________________CLCL_A_A_A_A_A_ACLCL________________ ________________________CLCL_A_A________________CL_A____________ ______________________CL_A_A____________________CL_A____________ ____________________CL_A__________________________CL_A__________ ____________________CL_A__________________________CL_A__________ __________________CL_A______CLCLCLCL________________CL_A________ __________________CL_A____CL_A_A_A_ACL______________CL_A________ ________________CL_A______CL_A_______ACL____________CL_A________ ________________CL_A____CL_A___________ACL__________CL_A________ ________________CL_A____CL_A___________ACL__________CL_A________ ________________CL_A____CL_A______________CL________CL_A________ ________________CL_A____CL_A______________CL_A______CL_A________ ________________CL_A____CL_A______________CL_A______CL_A________ __________________CL_A__CL_A______________CL_A______CL_A________ __________________CL_A__CL_A______________CL_A______CL_A________ __________________CL_A____CL_A____________CL_A______CL_A________ __________________CL_A____CL_A____________CL_A____CL_A__________ ____________________CL_A__CL_A______________CL_A__CL_A__________ __________________BJAjCPCP__________________CL_A__CL_A__________ ______________________AlBDBkBk________________CLCL_A____________ ________________________BkCPBkBk_______________A_A______________ ________________________CPBkBdBd_A______________________________ __________________________CPCPBdBd_A____________________________ __________________________CPCPBdBd_A____________________________ __________________________CmCmBJAj_A____________________________ ________________________CmCmBDAl_A_A____________________________ ________________________C$C$AlBD_A_A____________________________ ______________________CmC$AjBJ_A_A______________________________ __________________CPCmBdBJ_A_A_A________________________________ _____________________A_A_A_A_A__________________________________ } # tile 249 (candle / magic candle) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________C$C$C$C$____________________________________________ ____________C$C$C$C$C$__________________________________________ _____________A_A_A_AC$C$__CPCPCP________________________________ _________________A_AC$C$C$CPCPCPCm______________________________ ___________________A_ACPC$C$CPCPC$Cm____________________________ ___________________ACPCPC$CPCPCmC$C$Cm__________________________ ___________________ACPCPCPCPCPCmCmC$C$Cm________________________ ___________________ACPCPCPCmCmCmCmCmC$C$Cm______________________ ___________________A_ACPCPCPCmCmCmCmCmC$C$Cm____________________ _____________________A_ACPCPCPCmCmCmCmCmC$C$Cm__________________ _______________________A_ACPCPCPCmCmCmCmCmC$C$Cm________________ _________________________A_ACPCPCPCmCmCmCmCmC$C$Cm______________ ___________________________A_ACPCPCPCmCmCmCmCmC$C$Cm____________ _____________________________A_ACPCPCPCmCmCmCmCmC$C$Cm__________ _______________________________A_ACPCPCPCmCmCmCmCmC$C$Cm________ _________________________________A_ACPCPCPCmCmCmCmCmC$C$_A______ ___________________________________A_ACPCPCPCmCmCmCmCmC$_A______ _____________________________________A_ACPCPCPCmCmCmCm_A_A_A____ _______________________________________A_ACPCPCPCmCmCm_A_A______ _________________________________________A_ACPCPCP_A_A_A________ ___________________________________________A_A_A_A_A_A__________ _____________________________________________A_A_A_A____________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 255 (flute / wooden flute) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________BiBi____________ _______________________________________________ABiBi____________ _____________________________________________A_ABiBi____________ __________________________________________CABiBiBi_A____________ ________________________________________CACABiBi_A_A____________ ______________________________________CABiBiBi_A_A______________ ____________________________________CACABiBi_A_A________________ __________________________________CACACABi_A_A__________________ ________________________________CACACACA_A_A____________________ ______________________________BiBiBiBi_A_A______________________ ____________________________BiBiBiBi_A_A________________________ __________________________CABiBiBi_A_A__________________________ ________________________CACABiBi_A_A____________________________ ______________________BiBiBiBi_A_A______________________________ ____________________BiBiBiBi_A_A________________________________ __________________CACACABi_A_A__________________________________ ________________CACACACA_A_A____________________________________ ______________BiBiBiBi_A_A______________________________________ ____________BiBiBiBi_A_A________________________________________ __________CABiBi_A_A_A__________________________________________ ________CACABiBi_A_A____________________________________________ ______BiBiBiBi_A_A______________________________________________ ____BiBiBiBi_A_A________________________________________________ _______A_A_A_A__________________________________________________ _________A_A____________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 256 (flute / magic flute) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________BiBi____________ _______________________________________________ABiBi____________ _____________________________________________A_ABiBi____________ __________________________________________CABiBiBi_A____________ ________________________________________CACABiBi_A_A____________ ______________________________________CABiBiBi_A_A______________ ____________________________________CACABiBi_A_A________________ __________________________________CACACABi_A_A__________________ ________________________________CACACACA_A_A____________________ ______________________________BiBiBiBi_A_A______________________ ____________________________BiBiBiBi_A_A________________________ __________________________CABiBiBi_A_A__________________________ ________________________CACABiBi_A_A____________________________ ______________________BiBiBiBi_A_A______________________________ ____________________BiBiBiBi_A_A________________________________ __________________CACACABi_A_A__________________________________ ________________CACACACA_A_A____________________________________ ______________BiBiBiBi_A_A______________________________________ ____________BiBiBiBi_A_A________________________________________ __________CABiBi_A_A_A__________________________________________ ________CACABiBi_A_A____________________________________________ ______BiBiBiBi_A_A______________________________________________ ____BiBiBiBi_A_A________________________________________________ _______A_A_A_A__________________________________________________ _________A_A____________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 267 (land mine) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ _____________________l_l_l_l_l_l_l_l_l_l_l______________________ _________________l_l_h_h_h_l_l_m_l_l_h_h_h_l_l_l________________ _____________l_l_h_h_h_h_l_h_h_h_h_h_h_h_h_h_h_h_h______________ ___________l_h_h_h_h_h_h_l_h_h_h_h_h_h_h_h_h_h_h_h_h____________ ___________l_h_h_h_h_h_h_l_l_hAQ_h_h_c_h_h_h_h_h_h_h____________ ___________l_h_h_h_h_h_h_l_h_h_h_h_d_h_h_h_h_h_h_h_h____________ ___________l_l_l_h_h_h_h_h_h_h_d_h_h_h_h_h_h_h_h_h_h_A__________ ___________m_h_h_l_l_h_h_h_h_h_h_h_h_h_h_h_h_h_h_h_h_A_A________ ___________l_h_h_h_h_h_h_h_hAQ_h_hAQ_h_h_c_h_h_c_h_h_z_A________ _____________h_h_h_h_h_h_h_h_h_h_h_h_h_h_h_h_h_h_h_B_A_A________ _______________A_h_h_h_h_h_h_h_h_h_h_h_h_hAR_h_h_z_A_A_A________ _________________A_B_h_h_h_h_h_h_l_d_h_h_h_A_A_A_A_A_A__________ _____________________A_A_B_A_B_A_A_z_A_B_z_A_A_A_A______________ ___________________________A_A_A_A_A_A_A_A_A_A__________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 268 (beartrap) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________BkCP______________CPBk______________________ ________________CPBkBkBkBkBk______BkBkBnBwBkCP__________________ ______________BkBkCmCm__CmCmBk__BkCmCm__CmCmBkCP________________ ____________CPBd____Cm____CmBkCmBkCm_A__Cm____BkBk______________ ____________BdCPCm___________ABk_A_A_A_A____CmBkBk______________ ____________BkBkCmCmCm_____ABkBkBk_____ACmCmCmCPCP______________ ____________BnCPBk_________A_zBdBn_______A_ABkBdBk______________ ____________BwBkCmBk_____A_A__Bd_zBk______BkCmBkBk_A____________ ____________BkBkCmCmCmBk_A_A__Bd_A__BkBkCmCmCmBkBk_A_A__________ ______________BkBk______Bk_A__Bd_ABnBk______BkCP___A_A__________ ______________BkBk______CmBk__Bd_zBkCm_____ABkBk___A_A__________ ______________CPCPBkCoCm_A_A__Bk_A____CmCmBkBkBk_____A_A________ ________________BkBk_____A_A__Bd_A_A_A_A_ACPBk_A_A_A_A_A________ ________________BkBkCP___ACm__Bd_ACm____BkBkCP_______A_A________ __________________CPBkCmCm_A_ABd_A__CmCmBkBk_______A_A_A________ __________________BdBkBkCm_A_ABd_A__CmCPBkBk_______A_A__________ ____________________BkBk___ACmBdCm____BdCP_______A_A_A__________ ______________________CPBkCm_ABd_ACmBkBk_______A_A_A____________ ________________________BkBk_ABd_ABkCP_______A_A_A______________ __________________________BkBkCmBkBk_____A_A_A_A________________ __________________________BkBk_ABkBk_A_A_A_A____________________ _____________________________A___A_A_A_A________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 269 (spoon) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________________BdBdBdBd____________________________ __________________________BdBdBdBkBdBd_A________________________ ________________________BdBdBdBkCPBkBdBd_A______________________ ________________________BdBdBkCPBkBkCPBd_A_A____________________ ______________________BdBdBkBkBkCPCPBkBkBd_A_A__________________ ______________________BdBdBdBkCVCPCPBkCPBd_A_A__________________ ______________________BdBdCPBkCPCPCVBkBkBd_A_A__________________ ______________________BdBdBkCPCPCPCPCPCPBd_A_A__________________ ________________________BkBkCPCPCPCPCPBkBd_A_A__________________ ________________________BdBkCPCPCPCPCPBk_A_A_A__________________ ________________________BdBdBkCPCPCPCPBn_A_A_A__________________ __________________________BdBkCPCPCPBk_z_A_A_A__________________ ____________________________BkBkBkBk_z_A_A_A____________________ ____________________________BSBSAwAz_B_A_A______________________ ____________________________BSBSAwAw_A_A________________________ ____________________________BSBSAwAw_A_A________________________ ____________________________BSBSAwAw_A_A________________________ ____________________________BSBSAwAw_A_A________________________ ____________________________BSBSAwAw_A_A________________________ ____________________________BSBSAwAw_A_A________________________ ____________________________BSBSAwAw_A_A________________________ ____________________________BSBSAwAw_A_A________________________ ____________________________BSBSAwAw_A_A________________________ ____________________________BSBSAwAw_A_A________________________ ____________________________BSBSAwAw_A_A________________________ ______________________________AwAw_A_A_A________________________ _________________________________A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ } # tile 275 (lightsaber / green lightsaber) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________BABn________________________________________ ____________________BABnBA_A____________________________________ __________________BABlBAA$A$_A__________________________________ ________________BABnCAA$AmAi_z_A________________________________ ______________BABnBABAAi_A_A_A_A________________________________ ____________BABnBEA$Am_z_A_A____________________________________ __________BABnBAA$Ai_A_A_A______________________________________ ________BABnBAA$Am_z_A_A________________________________________ ______BABnBABKAi_A_A_A__________________________________________ ______BnBEA$Am_A_A_A____________________________________________ ________A$Ai_L_A_A______________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 276 (lightsaber / blue lightsaber) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________BABn________________________________________ ____________________BABnBA_A____________________________________ __________________BABlBAA$A$_A__________________________________ ________________BABnCAA$AmAi_z_A________________________________ ______________BABnBABAAi_A_A_A_A________________________________ ____________BABnBEA$Am_z_A_A____________________________________ __________BABnBAA$Ai_A_A_A______________________________________ ________BABnBAA$Am_z_A_A________________________________________ ______BABnBABKAi_A_A_A__________________________________________ ______BnBEA$Am_A_A_A____________________________________________ ________A$Ai_L_A_A______________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 277 (lightsaber / red lightsaber) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________BABn________________________________________ ____________________BABnBA_A____________________________________ __________________BABlBAA$A$_A__________________________________ ________________BABnCAA$AmAi_z_A________________________________ ______________BABnBABAAi_A_A_A_A________________________________ ____________BABnBEA$Am_z_A_A____________________________________ __________BABnBAA$Ai_A_A_A______________________________________ ________BABnBAA$Am_z_A_A________________________________________ ______BABnBABKAi_A_A_A__________________________________________ ______BnBEA$Am_A_A_A____________________________________________ ________A$Ai_L_A_A______________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 278 (double lightsaber / red double lightsaber) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________________________________BABn______________________ ______________________________________BABnBA_A__________________ ____________________________________BABnBEA$A$_A________________ __________________________________BABnBAA$BDAi_A_A______________ ________________________________BABnBEA$Aj_B_A_A_A______________ ______________________________BABnBAA$Ai_B_A_A__________________ ____________________________BABnBAA$Am_z_A_A____________________ __________________________BABnB$BKAi_A_A_A______________________ ________________________BABnBEA$Am_A_A_A________________________ ______________________BABnBAA$Ai_L_A_A__________________________ ____________________BABnBAA$Am_z_A_A____________________________ ________________BABABnBABKAi_A_A_A______________________________ ________________BnBlBAA$Am_A_A_A________________________________ __________________BABAAi_A_A_A__________________________________ ____________________A$Am_A_A____________________________________ _________________________A_A____________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 282 (lenses) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________________BABABABA__________________________________ ____________________BABA____BABA________________________________ __________________BABA________BA________________BABABA__________ ________________BABA__________________________BABA__BABA________ ______________BABA_______A_A_A_A____________BABA______BA________ ____________BABA_______A_A_____A_A________BABA__________________ __________BABA_______A_A________________BABA_________A_A_A______ ________BABABnCPBlBn_A__________BnCPBlBnA$BA_______A_A_A_A_A____ ________A$CQBn____BABl________CQBn____BABlBA_____A_A_______A____ ________BnCP__C$C$_ABnBA__BABnBn__C$C$_ABnBA___A_A______________ ________Bn__C$_A______Bn_ABACQ__C$_A______Bn_A_A________________ ________Bl___A________BA_A_ABM_A_A________BA_A__________________ ________BnBl_A____C$BABA_A__BnBl_A____C$BABA_A__________________ __________BABn_A__BABA_A_A____BABn____BABA_A_A__________________ ____________BABlBABA_A_A________BABlBABA_A_A____________________ _______________L_A_A_A_____________M_A_A_A______________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 283 (blindfold) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________BvBvBWBvBvBvAz____BvBvBvBvBvBWBv________________ ______________BvBWBWBWBWBWBWBWAzBvBWBWBWBWBWBWBWBW______________ ____________BvBWBWAzAzAzAzBWBWBWBWBWBWAzAzAzBWBWBWAz____________ ____________BvBWAzBWBWBWBWBWBWBWBWBWAzBWBWBWBWBWBWAz_A__________ ____________BvBWBWBWBWBWBWBWBWAzBWBWBWBWBWBWBWBWBWAz_A__________ __________BvBvBWBWBWBWBWBWBWBWAzAzBWBWBWBWBWBWBWAzAzAz_A________ ________BvBW_ABWBWBWBWBWBWBWAz_A_ABWBWBWBWBWBWAzAz_ABWAz_A______ ________BvBW_A_ABWBWAzBWAzAz_A_A_A_ABWAzAzBWAzAz_A_ABWAz_A______ ________BWAz_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_ABWAz_A______ __________BWBW_A_A_A_A_A_A_A_A_____A_A_A_A_A_A_A_A__BWAz_A______ ____________BWBWAz_A_A______________________________BWAz_A______ ______________BWBWAz_A______________________________BWAz_A______ __________________BWAz____________________________BWAz_A_A______ ____________________BWAz________________________BWBW_A_A________ ____________________BWAz_A______________________BWAz_A_A________ ____________________BWBWAz______________________BWAz_A__________ ______________________BWBWAzAz________________BWAz_A_A__________ ________________________BWBWBWAz____________BWAz_A_A____________ ___________________________A_A_A_A_____________A_A______________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 289 (leather bag / medical kit) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________AwAwAwAw________________________ ______________________________AwAwAwAwAwAw______________________ ________________C$C$________AwAwAw____AwAwAw____________________ ______________C$C$C$C$____AwAwAw________AwAw____________________ ____________C$C$C$C$C$C$AwAwAw__________AwAw____________________ __________C$C$C$C$C$C$C$AwAw__________AwAwAw____________________ ________C$C$C$C$C$C$C$C$C$C$_A_A_A__AwAwAw______________________ ______C$C$C$C$C$CuC$C$C$C$CuC$_A_AAwAwAw________________________ ______C$C$C$C$CuCuCuC$C$CuCuCuC$AwAwAw_A________________________ ____C$C$C$C$C$C$CuCuCuCuCuCuC$C$AwAw_A_A_A______________________ ____C$C$C$C$C$C$C$CuCuCuCuC$C$C$C$C$_A_A_A_A____________________ ____C$C$C$C$C$C$C$CuCuCuCuC$C$C$C$C$C$_A_A_A_A__________________ ______C$C$C$C$C$CuCuCuCuCuCuC$C$C$BkCXCX_A_A_A_A________________ ________C$C$C$CuCuCuC$C$CuCuCuC$BkCOCXCX_A_A_A_A_A______________ __________C$C$C$CuC$C$C$C$CuC$C$COBkCXCXCX_A_A_A_A_A____________ ____________C$C$C$C$C$C$C$C$C$BkBkCOCWCXCX_A_A_A_A_A_A__________ ______________C$C$C$C$C$C$C$BkCOBkCWCXCXCXCX_A_A_A_A_A_A________ ________________C$C$C$C$C$C$BkCOBkCXCXCXCXCX_A_A_A_A_A_A________ __________________C$C$C$C$C$BkCJBmCXCXCXCXCX_A_A_A_A_A__________ ____________________C$C$C$BkCOBkBk_zCXCXCXCX_A_A_A______________ _______________________A_ACOBk_L_A_A_A_A_A_A_A_A________________ ___________________________A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 302 (meat stick) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________CBCYCB__________ ______________________________________________BrCBBrBrBN________ __________________________________________BrCBCBBrCBBNBN_A______ ________________________________________CBCBCYCBCBBrBN_A_A______ ______________________________________CBCYBrCBCBBrBr_A_A_A______ __________________________________BrBrCYCBBrBrBrBr_A_A_A_A______ ________________________________BrCBCBCBCBBrBNBN_A_A_A_A________ ______________________________CBCYBrBrBrBrBrBN_A_A_A_A__________ ____________________________CBCYCBCBBrBrBr_A_A_A_A_A____________ __________________________BrCYCBCBBrBNBN_A_A_A_A_ABN____________ ________________________BrCBBrBrBNBrBr_A_A_A_A_ABNAq____________ ______________________CBCYCBBrBNBN_A_A_A_A_A_ABNAq______________ ______________________CBCYCBCBBrBN_A_A_A_A_ABN__________________ ____________________BrCBBrCBBrBr_A_A_A_A_A______________________ __________________CBCYCBBrBrBr_A_A_A_A_A________________________ __________________BrCBCBCBBNBr_A_A_A_A__________________________ ________________BrCBBrCBBrBN_A_A_A_A____________________________ ________________BNBNBrBrBr_A_A_A_ABN____________________________ ________________BNBNBNBr_A_A_A_ABN______________________________ _________________ABNBN_A_A_A_ABNBN______________________________ _________________A_A_A_A_A_ABNBN________________________________ ________________CB_A_A_A_ABNBNAq________________________________ __________________BNCBBNBNBNAq__________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 304 (meat ring) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________CuCuCuCuCuCu____________________________ ____________________CuCuCBCBCBCuCBCBBoCB________________________ __________________CuCBCB_AAqATATATCBCBCBCB______________________ __________________CuCBATATATATATATBoAqCuCBCB_A__________________ ________________CuCBATAqATAqBNBNBNBN____CpCB_A_A________________ ________________CuCuBoATATBN____________CuCBCB_A_A______________ ________________CuCBATAT________BN________CuCBCB_A_A____________ ________________CuCBATAT____________________CpCB_A_A____________ ________________CuCBAqAT____________________CuCB_A_A____________ ________________CuCBATBN__________________CuCBCB_A_A____________ ________________CpCBCBATATATATCuCuCuCYCuCuCBCu_A_A______________ ________________CuCBCBAqATATCuCBCBCBCBCBCBCB_A_A________________ __________________CuCBCuCuCuCBCBAq_A_A_A_A_A_A__________________ __________________ATCuCBCBCBCB_A_A_A_A_A_A_A____________________ __________________AT_A_A_A_A_A_A_A_ABNBNBN______________________ ____________________BNBN_A_A_A_A________________________________ ________________________BNBN______________BN____________________ ________________________BN______________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 305 (eyeball) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________________CXCXCXCXCXCXBABA____________________ __________________________CXCXCXCXCXCXCXCXBABA__________________ ________________________CXCX_l_l_l_lCXCXCXCXBABA________________ ______________________CXCX_l_l_l_l_l_lCXCXCXCXBABA______________ ______________________CX_l_lBg_A_A_l_l_lCXCXCXBABA_A____________ ______________________CX_l_l_z_A_A_A_l_lCXCXCXBABA_A_A_A________ ______________________CX_l_l_A_A_A_A_l_lCXCXCXBABA_A_A_A_A______ ______________________CX_l_l_l_A_A_l_l_lCXCXCXBABA_A_A_A_A_A____ ______________________CXCX_l_l_l_l_l_lCXCXCXCXBABA_A_A_A_A_A____ ________________________CXCX_l_l_l_lCXCXCXCXBABA_A_A_A_A_A_A____ __________________________CXCXCXCXCXCXCXCXBABA_A_A_A_A_A_A______ ____________________________CXCXCXCXCXCXBABA_A_A_A_A_A__________ ________________________________________________________________ ________________________________________________________________ } # tile 306 (severed hand) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________________________BA____BA__________________________ ____________________BABA________BA____BA________________________ ______________________BACX______BABA__BABA______________________ ________________________CXCX____CXCX__CXBm__BA__________________ ________________________CXCX____CXBm__CXCX_zBmBA________________ __________________________CXCX__CXCO__CXCX_ACOBm________________ __________________________CXCX____CXBm__CXCX_ABmCO______________ ____________________BABA__CXCX_A_ACXCO_ACXCX__COBm______________ __________________BABA______CXCX_A_ACXCX_ACWCOBmCO______________ __________________CXCX______CiCX_z_ACXCXCPCXBmCJBm_B_____A______ __________________CXCX______CmCiCX_ACXCXBmCXCOBmCX_A_____A_A____ __________________CiCX____BACiCXCgCXCXCPCXCXBmCO_B_A_____A_A____ __________________ChCXCi__BlClChCXCXCXCXCPCXCXBm_A_______A_A____ __________________BMBlCXCiCXBlCiCXCgCXCXCXCPCX_z_______A_A______ __________________BABACiChCXCiBlCXCiCmCiCXCXCX_A_____A_A________ ______________________CXClCXCXCXBlCiCXCgCmCX_z_A_A_A_A__________ ________________________CXCXCXCXCVCOBlCXClCX_A_A_A_A_A__________ ____________________________CXCXCXCXCXBACXCX_A_A_A_A____________ ______________________________CXCXCXCXBmCX_A_A_A_A______________ ______________________________CXCXCuCXCOCX_A_A_A_A______________ ______________________________CXCXCuCXCXCX_A_A_A_A______________ ______________________________CXBACXCuBABA_A_A_A________________ ______________________________CXBACXCuBACX_A_A_A________________ ___________________________________A_ABA_A_A_A__________________ ___________________________________A_A_A_A_A_A__________________ ________________________________________________________________ ________________________________________________________________ } # tile 307 (kelp frond) { _________________l______________________________________________ _________________l_l____________________________________________ _________________l_l_l_l________________________________________ ___________________l_l_l________________________________________ ___________________l_l_l_l_l____________________________________ _____________________l_l_l_l_h__________________________________ _________________________l_l_h_h_l______________________________ _____________________________l_h_h_l____________________________ _____________________________l_l_l_l____________________________ _______________________________l_l_l____________________________ _______________________________l_l_l_l__________________________ _________________________________l_l_h_l________________________ _________________________________l_l_l_h________________________ _________________________________l_l_l_h________________________ _______________________________l_l_l_h_h________________________ _______________________________l_l_l_h__________________________ _____________________________l_l_l_h_h__________________________ _____________________________l_l_h_h_l__________________________ _____________________________l_l_h_l____________________________ ___________________________l_l_h_h_l____________________________ _________________________l_l_l_h_l______________________________ _______________________l_l_l_h_h_l______________________________ _____________________l_l_l_h_h_l________________________________ _____________________l_l_l_h_l_l________________________________ _____________________l_l_l_l_l__________________________________ ___________________l_l_m_l_l_l__________________________________ ___________________l_l_l_l_h_l_l________________________________ ___________________l_l_l_l_l_h_l_l______________________________ _____________________l_l_l_l_h_h_l_l____________________________ _____________________l_l_l_l_l_h_h_l_l__________________________ _______________________l_l_l_l_l_h_h_l_l________________________ _________________________l_l_l_l_l_h_h_l________________________ } # tile 314 (asian pear) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________________________CACA________________________ ________________________________CACACA__________________________ ______________________________CACACA____________________________ ____________________________BgCACABH____________________________ ________________________CRCkCRCkCRBgBGBG________________________ ______________________BgClBgBgBgCkBgBgAoBG___________A_A_A______ ____________________CRClBgCkBgBgBgBfBgC_BgBG_____A_A_A__________ __________________CRCkBgCkBgBgC_BgCNBgBgBgAoBG_A_A_A_A__________ ________________CRBgBgCkBgCkBgBgC_BgC_BgC_BgBGAo_L_A_A_A________ ________________CkCRCkBgBgBgC_BgBgBfBgBgBgBGBHBG_A_A_A_A_A______ ________________CRBgBgCkBgCkBgBgC_BgBgBGBgBHBfBG_B_A_A_A_A_A____ ________________ClBgCkBgC_BgBgC_BgBgC_BgC_BgBHBG_A_A_A_A_A_A_A__ ________________CRCkBgBgBgBgC_BHBgBGBgBgBGBHBfAo_L_A_A_A_A_A_A__ ________________BgCRBgCNBgC_BgBgC_BgCNBgBBBHBGBG_A_A_A_A_A_A_A__ __________________CkCRBfBgBgBgC_BgBfBHBfBHBGBG_C_A_A_A_A_A_A_A__ ____________________BgBHBGC_BgBGBHBHBGAoBGBG_B_A_A_A_A_A_A_A____ _____________________z_ABGAoBBBGBGBGBGBG_B_B_A_A_A_A_A_A________ _________________________A_L_B_B_B_B_B_B_A_A_A_A_A_A____________ _____________________________A_A_A_A_A_A_A_A_A__________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 317 (mushroom) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ _________________________________pBI_p_p________________________ _____________________________pBI_p_pCuCZ_pBI____________________ __________________________BI_p_pBI_pCCCC_p_p_p__________________ _________________________p_p_pCuCC_p_p_p_p_p_p_p________________ ________________________BI_p_pCCCC_p_p_p_p_p_p_p________________ _________________________fBABABA_p_p_p_pCuCC_p_p_p______________ ________________________BA_oBM_fBA_o_p_pCCCC_p_s_g______________ __________________________BA_f_oBA_fBA_p_p_p_p_k_s_A____________ ____________________________BACXClBABA_o_p_p_pCqAw_A_A__________ ____________________________C$C$CXCX_jBA_f_p_gBr_A_A_A_A________ __________________________C$C$CXCXCX_f_oBABA_s_p_A_A_A_A________ ________________________C$C$CXCX_A_A_oBK_fBF_g_A_A_A_A__________ ________________________C$C$CXCX_A_A_A_ABA_p_L_A_A_A____________ ________________________C$C$CXCX_A_A_A_A_A_A_A_A_A______________ ________________________C$C$CXCX_A_______A_A_A_A________________ __________________________CXCX_A_A______________________________ _____________________________A_A________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 319 (slime mold) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________________CcCcCcCf______________________ ________________________________CcCqCcCcCcCcCc__________________ ____________________________CcCICcCqCcCcCcCcCcCc________________ ________________________CcCcCcCcCFCICcCcCcCfCfCcCI______________ ____________________CICcCICcCcCcCcCcCcCcCICFCfCICc______________ __________________CcCcCICcCICICcCLCzCfCICcCfCICfCI______________ ________________CICICICfCICcCfCfCICFCLCcCfCICfCICf______________ ______________CfCfCfCICfCfCLCfCfCICfCfCfCICfCICfCf_A____________ ____________CfCICfCfCfCfCfCICfCfCfCfCMCfCfCMCfCjCf_A_A__________ __________CMCMByCMCICICfCICfCfCMCICfCfCMCICMCfCMCM_A_A_A________ ________CMCMCICMCfCMCMByCMCMCMByCMCMCMCMCMCICMCMBy_A_A_A________ ______CMCMByCjCMCMCMCMCjCMCMCMByCMByCMCMCMCMCMCMBy_L_A_A________ ______CMCMCMCMByCMCMCMCMByByCMCMCMCjCMCMCMCMCMAnAn_A_A_A________ ______CMCMByC_CMCMCMCMCMCMCjCMCMCMCMCMCMCMBaByBGBa_L_A_A________ ______ByC_CMByCMC_CMCMCMCMCMCMCMCMCMC_C_ByBGByAn_L_A_A_A________ ______ByByByByCMByByCMCMCMCMC_CMC_CMCMBGByBGBGBy_A_A_A__________ ______ByBGByByCMCMC_ByByCMC_ByC_ByC_ByBGByAnBGAn_A_A_A__________ ______AnByByC_ByCMCMCMByCMByC_ByBGAnAnByAnAnAn_z_A_A____________ ______AnAnBGByBGByByByC_ByByBGByAnByBGAnBGAn_L_A_A_A____________ _______zAnAnBaAnByAnByAnAnAnBaAnBGAnAnAnAnBG_A_A_A______________ _______A_AAnAnAnByAnAnAnAnAnAnAnAnAnAnByAn_A_A_A________________ _________A_AAnBGAnByBGBaBGAnAnAnAnAnBGAn_z_A_A__________________ ___________L_zBaAnAnAnAnAnAnAnAnAnAn_A_z_A_A____________________ _____________A_L_zAnByAnBaAnAn_z_z_z_A_A_A______________________ _______________A_A_A_A_L_A_L_A_A_L_A_A_A________________________ ___________________A_A_A_A_A_A_A_A______________________________ ________________________________________________________________ } # tile 322 (sandwich) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________CACACACACACACACACABiBiBi______________ _______________________lCFCFCXCXCXCXCXCXCXCXCXCXCACA____________ ___________________l_l_lCFCXCiCXCXCXCXCOCXCOCXCXCXCACA__________ _________________l_lBgCACXCXCXCXCOCXCXCXCXCXCXCXCXCACA_l_l______ _______________l_lBgCACXCXCiCXCXCXCXCXCiCXCXCXCOCXCACA_l_l_l____ _______________lBgC_CACXCXCXCXCXCXCXCXCXCXCiCXCXCXCACABg_l_l_A_A ___________l_l_lBgCACXCXCXCXCXCXCiCXCOCXCXCXCXCXCXCACABg_l_l_A_A _________l_l_lBgCqCFCXCXCXCOCXCXCXCXCXCXCXCXCXCXCXCFCcBg_l_A_A_A _________l_mCNBgCFCFCXCXCXCXCXCXCXCXCWCWCXCOCXCXCFCFCNBg_l_A_A_A ___________m_mBgCqCFCXCXCiCXCXCOCXCWCWCXCXCXCXCXCACABg_l_z_A_A__ ___________l_lBgCFCcCFCXCXCXCXCXCXCXCXCXCXCXCXCACACABg_l_A_A_A__ ___________l_lBgCdCqCFCFCFCFCFCFCFCFCFCFCACACACACnCNBgC__M_A_A__ _______________lBgCdCFCqCGCqCFCqCFCqCFCqCACACACd_lBg_l_m_A_A_A__ _________________lBgCnCdCdCnCdCgCdCnCdCnCdCnCd_mBgC__m_B_A_A_A__ _________________lBgCkCdCnCdCnCdCdCnCdCnCdCn_l_l_lBg_B_A_A_A_A__ ________________Cc_lBgBgCNBg_lBgCkBgCN_mBgCNBgBg_l_l_z_A_A_A_A__ ________________CACc_lBg_m_lBgC_BgBg_mBg_l_m_mAgBg_l_A_A_A_A____ __________________CFCqCFCqCFCqCFCc_l_l_l_lCACACA_A_z_A_A_A_A____ ____________________CFCFCFCFCFCFCFCFCcCACACA_A_A_A_A_A_A_A_A____ _______________________B_z_C_z_B_B_z_B_A_A_A_A_A_A_A_A__________ _____________________________A_A_A_A_A_A_A_A_A_A_A_A____________ ________________________________________________________________ ________________________________________________________________ } # tile 326 (tortilla) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________ClCkCiClCkCiClCkCiClCkCl________________________ ____________ClCkCiCkCiCkCiCkCiCkCiCkCiCkClCi____________________ ________ClCkCiCkCnCkCiCkCiCkCiCkCiCkCiCkCiCkCkCl________________ ______CiCkCiCkCiClCkCiCkCiCkCiCkCiCkCiCkCiCkCiCkCT______________ ______ClCkCiCkCOCkCiCkCiCkCiCkCiCkCiCkCiCkCiCkCiCN_A____________ ______CkCiCkCiCkCiCkCOCkCiCkCiCkCOCiCkCiClCkCiCN_A_A____________ ________CnCNCiCkCiCkCiCiCkCiCkCiCkCiCkCiCkClCTCN_A_A____________ _________A_ACNCTCkCiCkCiCkCiCkCiCkCiCkCiCUCN_A_A_A______________ ___________A_A_BCNCTCNCNCTCNCNCTCNCNCnCN_A_A_A_A________________ _____________A_A_A_A_A_A_A_A_B_A_A_A_A_A_A_A_A__________________ _________________A_A_A_A_A_A_A_A_A_A_A_A_A______________________ ________________________________________________________________ ________________________________________________________________ } # tile 328 (pill) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ _________________________________p_p_p__________________________ _______________________________p_p_p_p_p________________________ _____________________________p_p_pBABABA_A______________________ __________________________Ci_p_pBABABABA_A_A____________________ ________________________C$C$CnBABABABA_A_A_A____________________ ______________________C$C$C$ClCiBABA_A_A_A______________________ ____________________C$C$C$CXCXCXCn_z_A_A________________________ ____________________C$C$CXCXCXCX_L_A_A__________________________ ____________________C$C$CXCXCX_z_A_A____________________________ ______________________C$CXCX_A_A_A______________________________ _________________________A_A_A_A________________________________ ___________________________A_A__________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 333 (K-ration) { ____________BsBs________________________________________________ __________BsCFCFBs______________________________________________ __________BMBsBsBD______________________________________________ __________BMBMBMAi______________________________________________ __________BM_k_gBd______________________________________________ ________BMC$_k_g_gAi____________________________________________ ______BMC$_k_k_k_g_gBd__________________________________________ ______BM_k_k_k_k_g_gAi__________BsBsCFCFCFCFCFCFBsBs____________ ______BM_k_k_k_k_g_gBd____BsCFCFCFCFCFCFCFCFCFCFCFCFBs__________ ____BM_k_k_k_k_k_g_g_gAiBsCFCFCFCFCFCFCFCFBsBsCFCFCFCFBs________ __BM_k_k_k_k_k_k_g_g_gBsBsCFCFCFCFCFBsBsBsBsCFCFCFCFCFCFBs______ __BM_k_k_k_k_k_k_g_gBsBsCFCFCFCFCFCFCFCFCFCFCFCFCFBsCFCFBsBs____ __BMCl_k_k_k_k_k_gBsCFCFCFBsBsCFCFCFCFCFCFCFCFCFCFCFBsCFBsBs____ __BMClClClClBMBMBMCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFBsCFBsBsBsBs____ __BMClClClClClBMBsBsBsCFCFCFCFCFCFCFCFBsBsCFCFCFCFBsBsBsBsBs____ __BMClClClClClBsBsCFCFCFCFCFCFCFBsBsBsBsBsBsBsCFBsBsBsBsBsBs____ __BMClClClClBMBsCFCFCFCFCiCnCiCnCFCFCiClClBsBsBsBsBsBsBsBsBs____ __BMClClClClBMCFCFCFCFCnClClCiCtCnCiCnClClCiBsBsBsBsBsBsBsBs_A__ __BM_kClClClBMBsCFCiClClClCiClClClClClClClClCnBsBsBsBsBsBsBs_A_A __BM_k_k_kBMBMCFCFCiCnClCt_g_gCiCl_g_gClClClCiBsBsBsBsBsBsBs_A_A __BDBF_k_k_k_gBsCFClClCiCl_g_gCt_g_g_gCnClClClCFBsBsBsBsBsBs_A_A ___MBDBM_k_k_gBsCFCcClClCl_g_g_g_g_gClCiClCiCnCFBsBsBsBsBsBs_A_A ____AiBdAiBdAiBdCFCnClClCl_g_g_g_gClClClClCnCcCFBsBsBsBsBs_A_A_A _____A_ABdAiBDBsCFCnCiClCl_g_g_g_g_gClClClClCiCFCFBsBsBsBs_A_A_A _______A_A_A_MCFCFClClClCl_g_gCl_g_g_gCiClClClCFCFBsBsBs_A_A_A_A ___________A_ACFCFClClCiCn_g_gClCl_g_gClClClCnCFCFBsBs_A_A_A_A__ ______________CFBsCiClClCtCiCnCtCnClCiClClClClCcCFBs_A_A_A_A____ ______________BsCFCcCnClClClCiCFCFCcClCiCnClCFCFCFBs_A_A_A______ ______________BsBsCFCFCFCFCFCABsBsCFCFCcCFCFCFCFBs_A_A_A________ ________________BsBsBsCACFBsCF_A_ABsBsBsBsBsBsBs_A_A_A__________ ___________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A____________ _____________________A_A_A_A_A_A_A_A_A_A_A_A_A_A________________ } # tile 334 (C-ration) { ____________BsBs________________________________________________ __________BsCFCFBs______________________________________________ __________BMBsBsBD______________________________________________ __________BMBMBMAi______________________________________________ __________BM_k_gBd______________________________________________ ________BMC$_k_g_gAi____________________________________________ ______BMC$_k_k_k_g_gBd__________________________________________ ______BM_k_k_k_k_g_gAi__________BsBsCFCFCFCFCFCFBsBs____________ ______BM_k_k_k_k_g_gBd____BsCFCFCFCFCFCFCFCFCFCFCFCFBs__________ ____BM_k_k_k_k_k_g_g_gAiBsCFCFCFCFCFCFCFCFBsBsCFCFCFCFBs________ __BM_k_k_k_k_k_k_g_g_gBsBsCFCFCFCFCFBsBsBsBsCFCFCFCFCFCFBs______ __BM_k_k_k_k_k_k_g_gBsBsCFCFCFCFCFCFCFCFCFCFCFCFCFBsCFCFBsBs____ __BMCl_k_k_k_k_k_gBsCFCFCFBsBsCFCFCFCFCFCFCFCFCFCFCFBsCFBsBs____ __BMClClClClBMBMBMCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFBsCFBsBsBsBs____ __BMClClClClClBMBsBsBsCFCFCFCFCFCFCFCFBsBsCFCFCFCFBsBsBsBsBs____ __BMClClClClClBsBsCFCFCFCFCFCFCFBsBsBsBsBsBsBsCFBsBsBsBsBsBs____ __BMClClClClBMBsCFCFCFCFCiCnCiCnCFCFCiClClBsBsBsBsBsBsBsBsBs____ __BMClClClClBMCFCFCFCFCnClClCiCtCnCiCnClClCiBsBsBsBsBsBsBsBs_A__ __BM_kClClClBMBsCFCiClClClCi_g_g_g_gClClClClCnBsBsBsBsBsBsBs_A_A __BM_k_k_kBMBMCFCFCiCnClCl_g_g_g_g_g_gClClClCiBsBsBsBsBsBsBs_A_A __BDBF_k_k_k_gBsCFClClCiCl_g_gClCl_g_gCiClClClCFBsBsBsBsBsBs_A_A ___MBDBM_k_k_gBsCFCcClClCl_g_gClClClClCnClCiCnCFBsBsBsBsBsBs_A_A ____AiBdAiBdAiBdCFCnClClCl_g_gClClClClClClCnCcCFBsBsBsBsBs_A_A_A _____A_ABdAiBDBsCFCnCiClCl_g_gClCi_g_gClClClCiCFCFBsBsBsBs_A_A_A _______A_A_A_MCFCFClClClCl_g_g_g_g_g_gCiClClClCFCFBsBsBs_A_A_A_A ___________A_ACFCFClClCiCnCl_g_g_g_gClClClClCnCFCFBsBs_A_A_A_A__ ______________CFBsCiClClCtCiCnClCnClCiClClClClCcCFBs_A_A_A_A____ ______________BsCFCcCnClClClCiCFCcCFCtCnCiClCFCFCFBs_A_A_A______ ______________BsBsCFCFCFCFCFCABsBsCFCFCFCFCFCFCFBs_A_A_A________ ________________BsBsBsCACFBsCF_A_ABsBsBsCABsBsBs_A_A_A__________ ___________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A____________ _____________________A_A_A_A_A_A_A_A_A_A_A_A_A_A________________ } # tile 341 (luminescent / clairvoyance) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________________BSBSBS______________________________ __________________________BkBiBSBSBk____________________________ ________________________C$CVAwAwAwCPBk__________________________ __________________________C$CVCmCPBk____________________________ __________________________BkBdBJAeBk____________________________ __________________________BkBdAjAeBk____________________________ __________________________CPBdBJAeBk_________________A_A_A______ __________________________BlBdAlAeBk_______________A_A_A_A_A____ __________________________COBdBDAeBk_____________A_A_A_A_A_A____ __________________________CPBkBJAeBk___________A_A_A_A_A_A______ __________________________CPBlAlAeBD_______A_A_A_A_A_A_A________ ______________________BdCVCVBkCOAjAeBDBD_A_A_A_A_A_A_A__________ ____________________BdCtC$C$CVBlAlBJAeAeBD_A_A_A_A_A____________ __________________BdCkCoC$C$CoCkBHAnAn_qAhBd_A_A_A_A____________ ________________BdCMBHBgCoCoCkCkBzBHC_BzCNByBD_A_A_A____________ ________________BdAoAoBgCkCjCsCkCkCkCkBgBgCRBD_A_A______________ ________________BdAoAoBBCsCkCkCtCtCRCtBHAnBaBD_A_A______________ ________________BdAgBg_tCsCkCkCtClCtCkBfBHAnBD_A_A______________ ________________BjAhCRCkCkCtCkCtCmClCtCkBgByBD_A_A______________ ________________BdAgAnBGC_CsCkCtCkC_By_qCRByBD_A________________ _________________ABdAoAnBgC_C_ClC_CtBGBBAnBD_A_A________________ _________________ABdAnAnCkC_C_CtCkCNCRAoC_BD_A_A________________ _________________A_ABkCRAoCRBGClBgBgCNC_BD_A_A__________________ ___________________A_ABLBLBGCVBHClC_AjAj_A_A____________________ _____________________A_A_ABDBDBJBDBD_A_A_A______________________ _________________________A_A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 348 (muddy / ESP) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________________BSBSBS______________________________ __________________________BkBiBSBSBk____________________________ ________________________C$CVAwAwAwCPBk__________________________ __________________________C$CVCmCPBk____________________________ __________________________BkBdBJAeBk____________________________ __________________________BkBdAjAeBk____________________________ __________________________CPBdBJAeBk_________________A_A_A______ __________________________BlBdAlAeBk_______________A_A_A_A_A____ __________________________COBdBDAeBk_____________A_A_A_A_A_A____ __________________________CPBkBJAeBk___________A_A_A_A_A_A______ __________________________CPBlAlAeBD_______A_A_A_A_A_A_A________ ______________________BdCVCVBkCOAjAeBDBD_A_A_A_A_A_A_A__________ ____________________BdCJC$C$CVBlAlBJAeAeBD_A_A_A_A_A____________ __________________BdBXBnCmCmCOBDAlAGAKAeAeBD_A_A_A_A____________ ________________BdBsBsBwBkCJBkBXAxAZAYAxAvAqBD_A_A_A____________ ________________BdBsBsBsBcBjBVBVB_AxAwBSBSBsBD_A_A______________ ________________BdBsBsBsBsBVBsB_BSB_BSBiBsBsBD_A_A______________ ________________BdBsBsBsBsBsBsBsBsBsBiBsBiBSBD_A_A______________ ________________BdBVBiBsBiBsBsBsBsBsBiBiBiB_BD_A_A______________ ________________BdB_B_BiBiBiBsBiBiBiBiBSBSAxBD_A________________ _________________ABVBTBTBiBSBiBSBiBSBSAwAxBD_A_A________________ _________________ABJB_BSBSBSBSBSBSBSBSBSAuBD_A_A________________ _________________A_ABJBVB_BTBRBRBRBSBiArBD_A_A__________________ ___________________A_ABDBVAxBRBNBRArBDBD_A_A____________________ _____________________A_A_ABDBDBDBDBD_A_A_A______________________ _________________________A_A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 362 (icy / invulnerability) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________________BSBSBS______________________________ __________________________BkBiBSBSBk____________________________ ________________________C$CVAwAwAwCPBk__________________________ __________________________C$CVCmCPBk____________________________ __________________________BkBdBJAeBk____________________________ __________________________BkBdAjAeBk____________________________ __________________________CPBdBJAeBk_________________A_A_A______ __________________________BlBdAlAeBk_______________A_A_A_A_A____ __________________________COBdBDAeBk_____________A_A_A_A_A_A____ __________________________CPBkBDAeBk___________A_A_A_A_A_A______ __________________________CPCPAlAeBD_______A_A_A_A_A_A_A________ ______________________BdCVCVCPBkBkAeBDBD_A_A_A_A_A_A_A__________ ____________________BdCVC$C$CmCPCPBkBkAeBD_A_A_A_A_A____________ __________________BdCPCQC$C$CVBlBlBKBlBkBkBD_A_A_A_A____________ ________________BdBeBlCPCQCmBlCPBlBlBlBlBlBlBD_A_A_A____________ ________________BdBkCPBlCPCQBlCPBEBlBEBlBEBKBD_A_A______________ ________________BdBlBlBlBlBlCPBEBEBEBKBKBKBKBD_A_A______________ ________________BdBKBkBlBkBlBKBKBKBKBKBKBEAmBD_A_A______________ ________________BdBKBKBKBKBKBKBKAmBKAmBABKBKBD_A_A______________ ________________BdBKAmBlBKBKBKBKBlBKBEBKBEBEBD_A________________ _________________ABdBKBKBKBKBEBKBKBEAmBEBKBD_A_A________________ _________________ABdBKBKAmBlAmBEBEBKBlBKBEBD_A_A________________ _________________A_ABkBEBKBEAmBKBEAmBEBEBD_A_A__________________ ___________________A_ABkBkBEBKBEAmBEBJBD_A_A____________________ _____________________A_A_ABDBDBDBDBD_A_A_A______________________ _________________________A_A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 364 (clear / water) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________________BSBSBS______________________________ __________________________BkBiBSBSBk____________________________ ________________________C$CVAwAwAwCPBk__________________________ __________________________C$CVCmCPBk____________________________ __________________________BkBdBJAeBk____________________________ __________________________BkBdAjAeBk____________________________ __________________________CPBdBJAeBk_________________A_A_A______ __________________________BlBdAlAeBk_______________A_A_A_A_A____ __________________________COBdBDAeBk_____________A_A_A_A_A_A____ __________________________CPBkBJAeBk___________A_A_A_A_A_A______ __________________________CPBlAlAeBD_______A_A_A_A_A_A_A________ ______________________BdCVCVBkCOAjAeBDBD_A_A_A_A_A_A_A__________ ____________________BdBdC$C$CmBk______AeBD_A_A_A_A_A____________ __________________BdBD____________________BD_A_A_A_A____________ ________________Bd__________________________BD_A_A_A____________ ________________Bd__________________________BD_A_A______________ ________________Bd__________________________BD_A_A______________ ________________Bd__________________________BD_A_A______________ ________________Bd__________________________BD_A_A______________ ________________Bd__________________________BD_A________________ _________________ABd______________________BD_A_A________________ _________________ABd______________________BD_A_A________________ _________________A_ABk__________________BD_A_A__________________ ___________________A_ABkBk__________BDBD_A_A____________________ _____________________A_A_ABDBDBDBDBD_A_A_A______________________ _________________________A_A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 365 (blood-red / blood) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________________BSBSBS______________________________ __________________________BkBiBSBSBk____________________________ ________________________C$CVAwAwAwCPBk__________________________ __________________________C$CVCmCPBk____________________________ __________________________BkBdBJAeBk____________________________ __________________________BkBdAjAeBk____________________________ __________________________CPBdBJAeBk_________________A_A_A______ __________________________BlBdAlAeBk_______________A_A_A_A_A____ __________________________COBdBDAeBk_____________A_A_A_A_A_A____ __________________________CPBkBJAeBk___________A_A_A_A_A_A______ __________________________CPBlAlAeBD_______A_A_A_A_A_A_A________ ______________________BdCVCVBkCOAjAeBDBD_A_A_A_A_A_A_A__________ ____________________BdCnC$C$CVBlAlBJCuCdBD_A_A_A_A_A____________ __________________BdCdCgC$C$CnCdCdCdCdCuCdBD_A_A_A_A____________ ________________BdCdCdCdCnCnCdCdCdCdCdCdCuCdBD_A_A_A____________ ________________BdCuCdCdCdCdCdCdCdCdCdCdCdCuBD_A_A______________ ________________BdCpCuCdCdCdCZCdCxCdCuCuCpCuBD_A_A______________ ________________BdCuCuCpCuCuCuCuCpCpCuCuCuCuBD_A_A______________ ________________BdCuCuCuCuCuCuCuCuCuCuCuCuCuBD_A_A______________ ________________BdCuCuCuCuCuCuCuCuCuCuCuCYCYBD_A________________ _________________ABdCuCuCuCuCuCuCuCYCYCYCYBD_A_A________________ _________________ABdCuCuCuCuCuCYCYCYCYCYBdBD_A_A________________ _________________A_ABkCYCYCYCYCYCYCBCBCBBD_A_A__________________ ___________________A_ABkBkCBCBCBCBCEBdBD_A_A____________________ _____________________A_A_ABDBdBDBdBD_A_A_A______________________ _________________________A_A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 366 (blood-red / vampire blood) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________________BSBSBS______________________________ __________________________BkBiBSBSBk____________________________ ________________________C$CVAwAwAwCPBk__________________________ __________________________C$CVCmCPBk____________________________ __________________________BkBdBJAeBk____________________________ __________________________BkBdAjAeBk____________________________ __________________________CPBdBJAeBk_________________A_A_A______ __________________________BlBdAlAeBk_______________A_A_A_A_A____ __________________________COBdBDAeBk_____________A_A_A_A_A_A____ __________________________CPBkBJAeBk___________A_A_A_A_A_A______ __________________________CPBlAlAeBD_______A_A_A_A_A_A_A________ ______________________BdCVCVBkCOAjAeBDBD_A_A_A_A_A_A_A__________ ____________________BdCnC$C$CVBlAlBJCuCdBD_A_A_A_A_A____________ __________________BdCdCgC$C$CnCdCdCdCdCuCdBD_A_A_A_A____________ ________________BdCdCdCdCnCnCdCdCdCdCdCdCuCdBD_A_A_A____________ ________________BdCuCdCdCdCdCdCdCdCdCdCdCdCuBD_A_A______________ ________________BdCpCuCdCdCdCZCdCxCdCuCuCpCuBD_A_A______________ ________________BdCuCuCpCuCuCuCuCpCpCuCuCuCuBD_A_A______________ ________________BdCuCuCuCuCuCuCuCuCuCuCuCuCuBD_A_A______________ ________________BdCuCuCuCuCuCuCuCuCuCuCuCYCYBD_A________________ _________________ABdCuCuCuCuCuCuCuCYCYCYCYBD_A_A________________ _________________ABdCuCuCuCuCuCYCYCYCYCYBdBD_A_A________________ _________________A_ABkCYCYCYCYCYCYCBCBCBBD_A_A__________________ ___________________A_ABkBkCBCBCBCBCEBdBD_A_A____________________ _____________________A_A_ABDBdBDBdBD_A_A_A______________________ _________________________A_A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 398 (dark / command undead) { ________________________________________________________________ _______________________________c_c_X____________________________ _____________________________X_c_X_X_c_c________________________ ___________________________c_X_X_c_c_c_X_c_c____________________ _________________________c_c_X_X_c_c_c_c_c_X_c_X________________ _______________________X_X_c_X_c_X_c_c_X_c_X_c_X_c_c____________ _____________________c_c_X_c_c_X_c_c_c_c_X_X_c_c_X_c_X__________ ___________________c_c_X_c_X_c_X_X_c_c_c_X_h_c_c_X_c_X_c_c______ _________________X_c_c_c_X_c_c_c_X_c_X_X_c_c_c_X_c_c_X_c_X_X____ _______________X_X_c_X_c_X_c_c_c_c_X_c_c_X_X_c_X_c_X_c_c_c_X_T__ _____________c_c_c_X_X_c_c_X_c_X_c_c_X_c_c_X_X_c_c_c_X_c_X_c_T__ ___________X_c_c_c_X_c_c_c_c_X_c_c_c_X_c_c_X_X_c_c_X_X_X_X_T_T_Q _________X_X_c_c_c_X_c_X_X_c_X_c_c_c_X_X_c_c_X_X_X_c_c_X_X_T_T_Q _______c_c_c_c_c_c_c_X_c_c_c_X_X_c_c_c_c_X_X_c_c_c_XCI_T_T_T_Q_Q _____c_c_c_X_c_X_c_c_X_c_c_c_c_X_X_X_X_X_c_c_c_c_X_X_TBv_T_T_Q_Q ___X_c_c_X_c_X_c_c_X_c_c_c_X_X_Y_c_c_c_X_X_c_X_X_X_U_TBv_Q_Q_Q__ _X_c_c_X_X_X_c_c_X_X_c_h_X_X_c_cAC_X_c_c_cAC_X_c_T_X_TBW_Q_Q____ _c_c_X_c_c_X_c_c_c_c_c_X_X_X_X_c_c_c_c_X_X_c_X_T_T_Q_T_Q_Q______ ___c_c_c_c_X_c_c_X_c_c_X_c_c_c_X_c_c_c_c_X_X_U_T_T_T_N_Q________ __CPCP_c_c_X_c_X_c_c_X_c_c_c_c_X_X_c_c_X_c_T_T_T_T_N_Q__________ __CPCPCPCP_X_c_c_c_c_X_X_X_X_c_c_c_X_X_X_U_T_T_Q_Q_Q____________ __CVCPCPCPCKCP_X_c_X_Y_c_c_X_c_X_X_h_X_T_T_T_Q_Q_Q______________ _XCVCVCVCVCPCPCPCP_X_c_X_c_X_c_c_c_X_U_X_T_Q_Q_Q________________ _Q_X_XCVCVCVCPCPCPCPCP_X_c_c_c_c_X_T_T_T_Q_Q_Q__________________ ___Q_Q_X_XCVCVCVCPCPCPCPCK_X_X_X_U_T_T_T_Q_Q____________________ _______Q_T_X_XCVCVCVCPCPCPCP_X_X_T_T_T_Q_Q______________________ ___________Q_Q_X_XCVCVCVCVCP_X_T_T_T_N_Q________________________ _______________Q_T_X_XCVCVCP_T_T_T_N_Q__________________________ ___________________Q_Q_X_cCP_T_Q_Q_Q____________________________ _______________________Q_L_T_Q_Q_Q______________________________ ___________________________Q_Q_N________________________________ ________________________________________________________________ } # tile 399 (black / summon undead) { ________________________________________________________________ ________________________________________________________________ ____________AeAe_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_AAe_A_A____ ________AeAeAeAe_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_AAe_A_A_A__ ______AeAeAeBkBkCPBkBkBnCJBkBkBnCJBkBnBkCJBMCJBMCJBM_zAe_A_A_A__ ______AeAeAeBnCJBkBnCJBkBnCJBnCJBkBnCJBkCPBkBnCJBnCJ_AAe_A_A_A__ ______AeAeAe_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_AAeBkBn_AAe_A_A_A__ ______AeAeAe_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_AAeCJBk_AAe_A_A_A__ ______AeAeAe_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_AAeBnCJ_AAe_A_A_A__ ______AeAeAe_A_A_ABDBDBDBDBDBDBDBDBDBDBDBD_A_AAlBkBk_AAe_A_A_A__ ______AeAeAe_A_A_ABDBDBDBDBDBDBDBDBDBDBDBD_A_AAeBkCP_AAe_A_A_A__ ______AeAeAe_A_A_ABD_A_ABDBD_A_ABD_A_A_ABD_A_AAeBnBk_AAe_A_A_A__ ______AeAeAe_A_A_ABDBDBDBDBDBDBDBDBDBDBDBD_A_AAeCJBk_MAe_A_A_A__ ______AeAeAe_A_A_ABDBD_A_ABDBD_A_ABDBDBDBD_A_AAeBnBk_AAe_A_A_A__ ______AeAeAe_A_A_ABDBDBDBDBDBDBDBDBDBDBDBD_A_AAeCJBk_MAe_A_A_A__ ______AeAeAe_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_AAeBnCJ_AAe_A_A_A__ ______AeAeAe_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_AAeBkBn_AAe_A_A_A__ ______AeAeAe_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_AAlBkCJ_AAe_A_A_A__ ______AeAeAe_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_AAeBkBn_AAe_A_A_A__ ______AeAeAe_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_AAeBnCJ_AAe_A_A_A__ ______AeAeAe_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_AAeBkBk_MAe_A_A_A__ ______AeAeAe_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_AAeBnCJ_AAe_A_A_A__ ______AeAeAe_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_AAeCJBM_zAe_A_A_A__ ______AeAeAe_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_AAeBnBk_AAe_A_A_A__ ______AeAeAe_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_AAeCJBkAlAe_A_A_A__ ______AeAeAe_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_AAeBn_A_A_A_A_A_A__ _______AAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAe_A_A_A_A_A_A_A__ _______A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A__ _________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A______ ___________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A__________ ________________________________________________________________ ________________________________________________________________ } # tile 421 (wide / protection) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______BSBSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBv_A_A_A_A ____BSBSCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPBv_A_A_A_A ____BSCJBMCJBMCJBMCJBMCJBkBnBkCJBnBkBkCJBnBkBkCPBkBkCPBv_A_A_A_A ____BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvCPCPBv_A_A_A_A ____BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBkCPBv_A_A_A_A ____BSBSBvBvBvBSBSBSBSBSBSBSBSBSBSBSBSBSBSBvBvBvBvBkCPBv_A_A_A_A ____BSBSBvBvBvBS_MBS_ABSBS_ABSBS_ABS_ABSBSBvBvBvBvBnCPBv_A_A_A_A ____BSBSBvBvBvBS_A_ABSBS_ABSBS_A_ABSBS_ABSBvBvBvBvCJCPBv_A_A_A_A ____BSBSBvBvBvBSBSBSBSBSBSBSBSBSBSBSBSBSBSBvBvBvBvBkCPBv_A_A_A_A ____BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBnCPBv_A_A_A_A ____BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvCJCPBv_A_A_A_A ____BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBkCPBv_A_A_A_A ____BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBnCPBv_A_A_A_A ____BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvCJCPBv_A_A_A_A ____BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBkCPBv_A_A_A_A ____BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBnCPBv_A_A_A_A ____BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBkCPBv_A_A_A_A ____BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvCJCPBv_A_A_A_A ____BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBnCPBv_A_A_A_A ____BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBk_z_A_A_A_A_A ____BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBv_A_A_A_A_A_A_A _____A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A____ _____A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A______ _______A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A____________ ________________________________________________________________ } # tile 422 (big / resist poison) { ______BSBSCFCFBsBsCFCFCFBsBsCFCFBsBsBsCFCFCFBsBsBsBsBsCFCF_A_A__ __BSBSBSBSBsBsBsCFBsBiBsBiCFBsBsBsCFBsBiBsBsBiCFCFCFBsBsBs_A_A_A BSBSBSCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCFBi_A_A_A BSBSBSCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCFBs_A_A_A BSBSBSBsCFCFBsBsCFCFBsCFCFBsBsCFCFBsCFBsBsCFBsCFBiCPCPBsBs_A_A_A BSBSBSCFBsBsBsCFBiCFBsBsCFCFCFBsBsCFCFBsCFBsBsCFBsCPCPCFCF_A_A_A BSBSBSCFCFBsCFBsCFBsCFBsCFBiCFCFCFBsCFBsCFCFCFBsCFCPCPBsCF_B_A_A BSBSBSBsBiCFCFBsBsCFBsCFBsCFCFBsCFBsCFCFCFBiCFBsBsCPCPBiCF_A_A_A BSBSBSBsCFBsBsBsCFCFBsCFBtCFCFBZCFBsBsCFBtCFCFCFCFCPCPBsCF_B_A_A BSBSBSBsCFCFCFCFBtCFBsCFCFCFCFCACFBsBsCFBsBsCFBsBiCPCPBsCF_A_A_A BSBSBSCFCFBsCFBsBsCFCFCFBsBsCFBiCFCFBsCFBsCFCFBsCFCVCPBiCF_A_A_A BSBSBSCABZCFCFBsCFCFBZCFCFBsCFCFCABZCFCFCFBiCFCFBsCPCPBsCF_A_A_A BSBSBSBsCFCACFCFBiCFBsCFCFBtCFBsCFCFBiCFBsCFBtCFBsCPCPBsCF_B_A_A BSBSBSCFBsBtCFBsCFCFCFBsCFCFCFBsCFBsBsCFBsCFCFBsBsCPCPBiCF_A_A_A BSBSBSCFCFCFCFBsCFBiCFCFBsBsCFBsCFBtCFBsBsCFBsCFCFCPCPBsCF_B_A_A BSBSBSBiCFBsBsCFBiCFCFBtCFCFCFBsCFBsCFCFCFCFCFCFBsCPCPCFBs_A_A_A BSBSBSCFBiCFBsCFBtCFCFCFBsBsCFBZCFCFBsCFBZCABsBiBsCPCPCFBi_A_A_A BSBSBSBsCFCFCFBsCFBsCFBsCFCFCFCFBsCFBsBsCFBsCFCFCFCPCPCFBs_A_A_A BSBSBSBsCFBiCFBsCFBsCFBsCFBsBsBsCFCFBsCFBsCFCFBZBsCPCPBsBs_A_A_A BSBSBSCFBsCFBZCFCFBsBsBZCFBsCFBsCFBtCFCFBsBiCFBsCFCPCPCFCF_A_A_A BSBSBSCFBsCFCACFCFCFCFCFCFBsCFCFBiCFCFBsCFCFBsCFCACVCPBsCF_B_A_A BSBSBSBsCFCFCFBsCFBiCFBsCFBsCFBsCFCFBsCFBsBsBsCFBiCPCPBiCF_A_A_A BSBSBSCFBsBsBtCFCFCFBtCFCFBtCFCFCFBsCFBtCFCFCFCFCFCPCPBsBs_A_A_A BSBSB_CFBsCFCFCFBsBsCFCFCFBsCFBsBZCFCFBsCFCFBtCFBiCPCPBsBs_A_A_A BSBSBSBsCFBsCFBsCFCFBsBsCFBsCFCFCACFBiCFBsCFCFBsCFCPCPCFBs_A_A_A BSBSBSBiCFCFCFCFBsCFCFBsCFCFBsBiCFBiCFCFBsBsBsCFBsCPCVBsCF_A_A_A BSBSBSCFBsBiCFBZCFCFCFCFBsCFCFCFBsCFCFBiCFBsCFBsCFCPCPCFCF_B_A_A _ABSBSBiCFCFBsCFBsCABZCFBsCFBtBsCFCFBZCFCFCFBsCFBsCP_A_B_A_A_A_A _A_ABSBsBsBsBsBsCFBsBsBsCFBsCFBsBsCFBsBsBsCFBsCFBi_B_A_A_A_A_A_A _A_A_A_B_B_B_B_B_B_B_B_B_B_B_A_A_B_B_B_B_M_B_B_B_B_A_A_A_A_A_A_A ___A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A____ _____A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A________ } # tile 423 (fuzzy / resist sleep) { ________________________________CJ______________________________ ______________________________COBwCO____________________________ ____________________________BwCJCTBjCJBj______CJ________________ __________________________CTBmCTBkCTCOCJCTCJCO__________________ ________________________CJBjCJCTBkCOBwCTCOBjCJCJ________________ ______________________BjCTCOCJBjCTCOCJCOBkCTBmCTBjCJ____________ ____________________CJCTBkCOCTCOCJBjCTCJCTBjCJBjCJBzCJ__CJ______ __________________CJBjCOCTBwCOBjCTBjCJBjCJBwCOCTBjCJBwCOBj______ ________________CJBzCOCJBjCJCJCJBjCOBjCOCTBjCOBwCOCJCTCOCJCT____ ______________BwCOCJCJBwCOBjCTBjCTBwCOBjCTBkCTBwCOBjCJBjCJBjBj__ __________COCJCOBwCTBjCTBjCJCOCJBjCTCJCTBkCTBjCJCOCTBjCOBwCTBj__ ________CJBjCJCTBkCTBkCOCTCJCTBjCOBjCJBjCTCOBkCTBjCJBwCOCTBjBjAY ________COCTBjCJBzCJCOBwBjCOBjCJBjCTCOBjCOBwCTBjCOCTBkCTBjBjBjAY ______CJBjCJBwCOCJBjCJCTCJBjCTCOBwCOCJBwCOCJBwCOCJBjBvBjBwBcBVAY ____BwCTBjCTCOBjCTBkCTBLCTBkCOBwCTCJBjCTBkCTBjCOBwCOBwBvBcBVAZAN __CJBjCOCJBjCOCTCJBjCTCJBjCTCOBjCJBjCOBkCTBkCOCJCTBjBjBvBVAZAY__ CJBzCOBwCTBkCTBkCTBmCOCTBkCTCJCJCOCTBkCTBkCOCTBkBjBwBcBVAbAY____ BjCJCOCJBzCJCJBzCJCJCTBkCTCJBjCOCJBjCOCJCTCOBwBzBwBcBVAYAZ______ CJCTBkCTBkCTCOBkCTCOBkCTBmCJCTCOBjCOCTBjCJBjBwBjBcBVAbAY________ CJBnCOCJBjCOCJBjCJBjCTBwCOBjCJBjCJCJCJBjCJBzBwBcBVAYAZ__________ COCPCPCPCPCJBjCTBkCTCOBjCOCTBkCOCTBjCTBkBzBwBjBVAYAY____________ CJCVCPCPCPCPCOBkCTCOBkCTBkCTCJCTBjCOCTBjBwBcBVAYAZ______________ CJCVCVCVCPCPCPCPBmCJCTBjCTBkCOBwCOBwBjBjBtBbAYAZ________________ AbBjCJCVCVCVCVCPCPCPCPBjCJCTBjCTCJBjBwBcBVAZAY__________________ __AbAYBwCJCVCVCVCVCPCPCPBmCJCJBjBjCTBbBVAbAY____________________ ______AbAMCTBwCVCVCVCVCPCPBnCNBwBjBcBVAYAZ______________________ __________ANAbCJBjCVCVCVCVCPBwBjBcBVAYAZ________________________ ______________ALAbCJBwCVCVCPBwBjBVAZAY__________________________ __________________AbANCTBkCOBwBVAbAY____________________________ ______________________ANAZBcBJANAN______________________________ __________________________ABAOAB________________________________ ________________________________________________________________ } # tile 424 (deep / endure cold) { ________________________________________________________________ ______________________________AtAtAt____________________________ ____________________________AkBCAtAkAkAk________________________ __________________________BCAtAk_IBCAtBCAkAt____________________ ________________________AtAtBCAkBCAtBCAkAtBCAtAt________________ ______________________BCAkBCAkAkAkBCAkAtBCAtAkBCAtAt____________ ____________________AtAtAkAkBCBCAkAkBCBCAkAkBCAt_IBCAt__________ __________________AtBCBCAkBCBCAtAtBCAtBCAkBCAtBCAkAtAtAtAk______ ________________AtBCAtBCAkAtAkBPBCAkBCAtAtAtBCAtAkBCAt_IAtAk____ ______________AtAtAkAkAkBCBqBCAtBqBCBPAtAkBCAkAkAtAtAtBCAt_IAW__ ____________AkBCAtBCBCAkBCBCAkBCBCBqBCAtAkAtAkAtAkAk_IBCAkAkAW__ __________AtAkAtBCAkBPBCBCBPAtBqBPAtBqBCBPBCAkBCAtBCAtAkAkAW_G_A ________AkBCAtAkBCAkBCAkBqBCBPBCBCBqBCBCBCBPBCAtBCAtAkAk_HAW_F_z ______At_IAtBCAkBCAkBCBCAkBCCDAtBqBCBPAtBqBCAkBCAtAtBWAWAW_FA__A ____AtAtBCAkAkAtBCAkBCBqBCAtBCBPBCBqAtBCBCBCBPBCAkAkAWAwAWA__A_A __AtAt_JAtAkAtBCAtAkBCBCBqAtBqAtCDAtBPBCBPBCBCAkAtAWAWAw_D_A_A__ At_IAtAkAk_IBCAtBCAkBCAkAtBCAtAkAtBCBPBCBCBCAkAkAWAW_FAw_A_A____ At_JAt_JAtBCAtAkAkAkAkBCAtAtBPAtBqBCBCBPBCBPAkAWAWAWA__A_A______ __AtAtAtAt_IAkAtAkBCAkAtBPBCBCAkBCBCBCBCAkAtAWAWAV_D_A_A________ __BdBd_JAtBCAtAtAkAtBCAtBCAtBCBPBCAkBqAtAkAWAWAV_E_A_A__________ __BkBkBdBdAt_JBCAkBCAtBCAtBCAkAtBCBCAkAkAWAWAW_D_z_A____________ __BmBlBkBkBdBdAtAkAtAkAkAkAkBCAtAtAkAtAWAWAVA__A_A______________ AtBlCOBkBlBkBkBdBKAtAtBCAkBCAtBCAkAkAWAWAW_D_A_A________________ _BAt_ICPBkCPBkBkBkBDBKAtAkAtAtAkAkAWAWAV_C_A_A__________________ ___A_AAt_JCJBnBkBnBkBkBdBdAtAtAkAWAW_FAH_B_A____________________ _______A_$_JAtCOCJBnBkBkBkAiAkAWAW_FA__A_A______________________ ___________z_A_JAtBkCPBkCPBkAk_GAW_D_z_A________________________ _______________z_z_JAtCKBkBk_HAV_D_A_A__________________________ ___________________z_A_IAtBdAW_D_A_A____________________________ _______________________M_z_F_D_A_A______________________________ ___________________________z_A_A________________________________ ________________________________________________________________ } # tile 425 (spotted / endure heat) { ________________________________________________________________ _______________________________k_k_g____________________________ _____________________________g_k_g_g_k_k________________________ ___________________________k_g_gCYCuCu_g_k_k____________________ _________________________k_k_gCYCuCuCuCY_k_g_k_g________________ ______________________CY_g_k_gCYCYCuCuCY_k_g_g_g_k_k____________ ____________________CuCuCY_g_kCYCuCuCuCu_g_g_k_k_g_k_g__________ __________________CuCuCYCu_g_g_gCYCYCu_g_g_k_k_k_g_k_g_k_k______ ________________CYCuCuCuCY_g_k_k_g_k_g_g_g_k_k_g_g_k_g_k_g_g____ _______________g_gCuCYCY_g_k_k_k_k_g_g_k_g_g_k_g_k_gCuCYCu_g_f__ _____________k_k_g_g_g_k_k_g_k_g_g_k_g_k_k_g_g_k_kCYCYCuCYCY_f__ ___________g_k_k_k_g_g_k_k_g_g_k_k_kCYCuCu_g_g_g_kCYCYCYCYCB_f_A _________g_g_k_kCuCYCu_g_g_k_g_g_kCuCYCYCuCu_g_g_gCuCYCYCBCB_b_A _______k_k_g_kCuCYCuCYCu_k_g_g_g_kCuCuCYCYCY_k_g_k_gBvCBCB_b_a_A _____k_k_k_g_kCYCuCYCYCu_k_g_k_g_gCYCYCYCuCY_k_k_g_g_fBv_b_a_A_A ___g_k_k_g_g_gCYCuCYCuCu_k_g_g_g_k_gCuCYCY_k_g_g_g_f_fBv_a_A_A__ _g_k_g_g_g_g_k_kCYCYCu_k_g_g_g_k_g_g_k_g_k_g_g_g_f_f_bBW_A_A____ _k_kCYCuCu_g_k_k_k_g_k_g_g_g_g_k_k_k_k_g_g_g_gCBCBBo_a_A_A______ __CuCYCuCuCY_g_k_g_k_k_g_k_k_g_g_k_k_k_k_g_gCBCBBoBN_A_A________ __CPCPCuCuCY_k_g_k_k_g_g_k_k_k_g_g_k_g_g_g_fCBBoBN_A_A__________ __CPCPCPBkCp_g_k_k_g_g_g_g_g_k_kCuCYCY_g_f_fBoBN_A_A____________ __CVCPCPCPBnCP_g_g_g_g_k_k_g_gCYCYCuCYCB_f_b_a_A_A______________ _gCVCVCVCVCPCPCPCJ_g_k_g_k_g_kCuCuCYCBCB_b_a_A_A________________ _A_g_gCVCVCVCVCPCPBnCP_g_g_k_kCYCYCBCBBo_a_A_A__________________ ___A_A_g_gCVCVCVCVCPCPCPCJ_g_g_gCBCBBo_a_A_A____________________ _______A_A_g_gCVCVCVCPCPCPCP_g_f_f_b_a_A_A______________________ ___________A_A_g_gCVCVCVCVCP_g_f_b_a_A_A________________________ _______________A_A_g_gCVCVCPCB_b_a_A_A__________________________ ___________________A_ACYCYCPCBBN_A_A____________________________ _______________________A_ABoBN_A_A______________________________ ___________________________A_A_A________________________________ ________________________________________________________________ } # tile 426 (long / insulate) { ________________________________________________________________ __________BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBv_A_A_A_A_A________ ________BSBSCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPBv_A_A_A_A_A________ ________BiBMCJBkBnBkCJBnBkBkCJBnBkBkCPBkBkCPBv_A_A_A_A_A________ ________BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvCPCPBv_A_A_A_A_A________ ________BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvBkCPBv_A_A_A_A_A________ ________BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvBkCPBv_A_A_A_A_A________ ________BSBSBvBvBSBSBSBSBSBSBSBSBSBSBvBvBnCPBv_A_A_A_A_A________ ________BSBSBvBvBSBSBSBSBSBSBSBSBSBSBvBvCJCPBv_A_A_A_A_A________ ________BSBSBvBvBS_A_ABSBS_A_A_A_ABSBvBvBkCPBv_A_A_A_A_A________ ________BSBSBvBvBSBSBSBSBSBSBSBSBSBSBvBvBnCPBv_A_A_A_A_A________ ________BSBSBvBvBSBS_A_ABSBS_ABSBSBSBvBvCJCPBv_A_A_A_A_A________ ________BSBSBvBvBSBSBSBSBSBSBSBSBSBSBvBvBkCPBv_A_A_A_A_A________ ________BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvBnCPBv_A_A_A_A_A________ ________BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvCJCPBv_A_A_A_A_A________ ________BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvBkCPBv_A_A_A_A_A________ ________BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvBnCPBv_A_A_A_A_A________ ________BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvBkCPBv_A_A_A_A_A________ ________BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvCJCPBv_A_A_A_A_A________ ________BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvBnCPBv_A_A_A_A_A________ ________BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvBkCPBv_A_A_A_A_A________ ________BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvCJCPBv_A_A_A_A_A________ ________BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvBnCPBv_A_A_A_A_A________ ________BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvBkCPBv_A_A_A_A_A________ ________BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvBkCVBv_A_A_A_A_A________ ________BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvBkCPBv_A_A_A_A_A________ ________BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBvCP_A_A_A_A_A_A_A________ ________BSBSBvBvBvBvBvBvBvBvBvBvBvBvBvBv_A_A_A_A_A_A_A_A________ _________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A____________ _________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A________________ ___________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A______________________ ________________________________________________________________ } # tile 429 (torn / jumping) { ________________________________________________________________ ________________________________________________________________ ____________AmAm_I_IAm_I_IAm_I_IAm_I_IAm_I_IAm_I_IAm_I_IAm_B____ ________AmAm_JAm_JAm_I_JAm_I_JAm_I_JAm_I_JAm_I_JAm_I_JAm_I_A_A__ ______Am_JBECmCoCmCmCoCmCmCoCmCmCoCmCmCoCmCmCoCmCmCoCm_I_IAA_A__ ______AmAmAmCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCmAm_I_A_A__ _______fAt_f_KAt_K_fAt_I_aCPCmCmCmCm_JAm_I_HAf_H_ICVCm_IAm_B_A__ ______AmAmAt_g_KBE_K_I_fAt_HAlBDCmAlBE_I_HAf_H_HAm_HCo_I_I_A_A__ ______Am_JBE_JAt_IAm_IAt_b_HBJCmCm_K_JAm_I_HAf_H_IAf_HAm_JAA_A__ _______fAmAt_g_I_bAk_f_I_HAf_HCmBJ_KAm_H_HAf_I_HAm_H_HAm_I_A_A__ ______AtAm_fAt_IAf_J_JBE_I_HAfCPCm_IAm_IAf_JAm_J_IAm_I_IAm_B_A__ ______Am_gAtAm_I_HBE_J_JBE_I_HCPCmAm_I_H_IBE_J_JAm_I_HAf_I_A_A__ ______AmAt_f_JAm_J_JBC_g_KAk_bCP_I_KAf_IBE_J_JAm_JAm_H_HAm_B_A__ ______At_gAmAm_I_IAf_H_IAm_H_HCPBE_KAf_H_IBE_KAm_I_IAm_H_I_A_A__ ______AmAtAm_KAm_IAf_JAm_JAfBDCm_J_JAm_I_I_J_JAm_JAf_HAf_J_z_A__ ______Am_fBE_K_J_H_HAm_I_I_HCPCm_KBE_JAm_IAm_KAm_I_H_IAf_I_L_A__ ______AmAtAm_KBE_IAm_JAm_HAfCPBJ_J_I_IAf_IAf_H_HAf_HAf_IAm_B_A__ _______JAm_fBE_J_JAf_I_I_I_HCPCmBE_IAm_JAm_H_IAm_H_IAf_I_I_A_A__ ______AmAmBC_J_fAW_HAm_KBE_J_HCm_I_H_I_JAm_HAf_JAf_H_HAm_J_z_A__ ______At_gAm_IAt_H_b_JAm_KAf_HCX_JAmAm_K_JAf_I_I_HAf_IAm_I_L_A__ ______AmAm_JAm_JAm_HAt_K_gAk_HCX_I_I_KBE_J_IAm_JAm_HCm_IAm_B_A__ _______fBCAm_f_I_I_f_IAf_HAf_HCPAf_IBE_J_KAm_JAm_I_HCo_I_I_A_A__ ______Am_fAt_JAm_IBC_I_JAm_J_ICV_IAf_I_gAt_H_HAf_IAfCmAm_J_z_A__ _______fAtAmAm_KBE_K_fAf_J_JBE_HAm_I_IAt_f_HAf_H_HCPCo_I_I_L_A__ ______AmAm_g_K_J_JBE_IAk_b_J_JAf_KAm_JAm_HAk_HAf_HCWCmAm_IAA_A__ _______fBCAmBC_gBC_I_a_HAk_HBE_KAf_I_I_H_a_H_b_HCPCV_I_I_I_A_A__ _______zAm_f_KBC_f_IAt_b_HAf_I_I_IAm_JAfAk_HAf_H_z_L_zAA_L_z_A__ _______B_B_BBC_g_J_M_A_HAf_H_M_zAA_IAf_H_HAf_H_z_A_A_A_A_A_A_A__ _________A_A_A_B_z_z_A_A_B_A_A_A_A_A_A_M_A_B_A_A_A_A_A_A_A______ ___________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A__________ ________________________________________________________________ ________________________________________________________________ } # tile 431 (faded / enlighten) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________B_BiBbBvBzBvBbCIBbCLBZCLBbCLBbCLBbCLBZCLBb_z_A_A_A_A__ ________BiBZCPCPCPCPCPCPCPCPCPCPCPCPCPCPCgCPCPCPCPCL_A_A_A_A_A__ ________BTBZBvBbBvBbCIBbCLBZCLBZCLBbCLBbCLBbCLBbCgBb_z_A_A_A_A__ ________BWBtBZCLBvCLCLBZCLBtCLCLBbCLCLBzCLBzCLBzCPCL_A_A_A_A_A__ ________BTBsBvBzBZCLBtCLCLBzCLBbCLCGBbCLBbCLBbCLCKBz_A_A_A_A_A__ ________BiBZBzBvCLBVBZBVBZBVBbCGBbBzBzBtBzCGCLBzCPBz_A_A_A_A_A__ ________BVBsBbCLBZBtBbCLBtCLBbCLBbCLBzBzBzBzBzCGCPBz_A_A_A_A_A__ ________BZBtBZCLCLBbBVBVBbBzBzBtBzBwBzCGBzCGBzBzCPBz_A_A_A_A_A__ ________BsBZCLBZCLBtCLBbCLCGBzBzBzBzBzBzBzBzBzBzCPBz_z_A_A_A_A__ ________BZBTCLBtCLBbBbBzBbBzBzBzCGBzCTBjCTBzCTBzCgBz_A_A_A_A_A__ ________BTBZCLBZCLBtCLBtCLBzCGBzBzCTBzBzCTBzBjBzCPBz_A_A_A_A_A__ ________BsBtBbCLBzCLBzBzBzBzBzBzCTBzBzCTBzCTBzCTCPBz_A_A_A_A_A__ ________BVBZCLBZCLBbCLCGBzBzCTBzBzCTBjBzCTBzCTBzCPBz_z_A_A_A_A__ ________BZBtBbCLCGCLBzBzBzCTBzBzCTBzCTBzCOBzCTBzCPCT_A_A_A_A_A__ ________BZBtCLBbCLBbCLBzCLBzCTBzCTBzCTBzCJBzBjCNCPBz_A_A_A_A_A__ ________BtBZBZCLBzCLBzCGBzBwBzBzBzCOBzCJBzCNCTBjCPBz_A_A_A_A_A__ ________BZBtCLBbCLBtBzBzCLBzCTBzCTBzCTBzCJBzBzCTCPBz_B_A_A_A_A__ ________BZBtBZCLBzCLBzCLBzBzBzCTBzBjCNBjCNBzCTBzCPCT_A_A_A_A_A__ ________BZBtCLBbCLBtBzBzCGBzCTBzBzCTBzCTBzCJBzBzCPBz_A_A_A_A_A__ ________BsBVBvCLBbCLBzCLBzBzBzCTBzBzCTBzCTBzBzCTCPBz_A_A_A_A_A__ ________BVBZCLBbCLBtCLBbCLBzBzBzCTBzBzBzBzCTBzBzCPBz_A_A_A_A_A__ ________BsBtBZCLBZCLBzCLCGBzCGBzBzBzCTBzCTBzCTBzCPBz_A_A_A_A_A__ ________BZBZCLBbCLBbCLBbCLBzCLBzCLBwBzBzBzBzBzBz_z_B_A_A_A_A_A__ _________A_A_A_z_z_A_z_A_A_A_A_A_A_A_A_z_B_z_B_A_A_A_A_A_A_A_A__ _________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A______ ___________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A__________ ________________________________________________________________ ________________________________________________________________ } # tile 433 (tan / levitation) { ________________________________________________________________ ______________________________CnCTCT____________________________ ____________________________CTCTCTBzCnCn________________________ __________________________CTCTBwCTCnCTCTCJCn____________________ ________________________CnCnBzCTCTCJCnCTCTCTCTCT________________ ______________________CTCTCTCTCTCTCnCnBjCnBzCTCTCTCn____________ ____________________CnCTBjCTCTBwCTCOCTCnCTCTCJCTCTCTCT__________ __________________CnCJCTCnBzCTCTCTCTCnBjCTCTCnCOCTCJCTCTCn______ ________________CTCTCnCOCTCTCTCTCTCTCTCTCTCTCnCTBzCnBzCnBwCT____ ______________BwCTCTCTCTBwCnCTCOCnBzCTCTBzCTCTCTCTCTCJCTCTCTBt__ ____________CnCnBzCTBwCTCnCTCTCTCTCJCTCnCJCTBjCnCTCTCTCTCTBzCG__ __________CTCTCnCTCTCTCnCTBzCTCnCTCnBjCnCTCTCTCTCnBwCTBzCTCGBbAB ________CTBwCnCOCTCTCTCTCTCnBwCTCnCTCTCTCTCnBzBwCTCTCTCTBVBbBtAB ______CnCTCTCnCTCTCTCTCTCTCTBzCTCOCnCTBzCTCTCTCTCTCTCIBbBtBtAzAB ____CnCOCnCTCTCTCOCTBjCnCOCTCTCTBwCTCTCTCTBwCnCTCTCTBbCFBbBSABAB __CTCJCnBzCTBjCTCTCTCnCnCnBwCTCTCTCTCTBwCTCnBzCTCTBbBtBvAxABAB__ CTCTCTCTBwCTCTCnCTBzCTCnBwCTBzCTCTCTCTCTCTCTCTBwBtBzBtBWABAB____ CTCnBzCnCTCTCnCJCTCTCnBzCTCTCTCnCTCOCTCTCTBzCTBtBzBTAzABAB______ __CnBwCnCnBzCTCTCTCJCnBwCTCTCTBwCnCnCnCTCTBwCGBbBtBSABAB________ __CPBnCnCTCTCTCTCnCTCTCTCnCnCTCTCTCTCTBzCTBtBzBTB_ABAB__________ __CPCPCPBnCTCTCOCnCTBzCTBwCTCOCTCnBjCTCTBVBzBTBSABAB____________ __CVCPCPCPCPBkCTCTBwCTCTCnBzCTCTCTCnCTBbCGBTB_ABAB______________ CTCVCVCVCVCPCPCPBmCTCnCTCnCTCTCTCTCTBVCGBZBSABAB________________ _MCTCTCVCVCVCVCPCPBlCOBjCTCJCTCTCTBbCGBZAxABAB__________________ __AB_MCTCTCPCVCVCVCPCPCPCOCTCTBjBtBzBTB_AKAB____________________ ______AB_MCTCTCVCVCVCVCPCPBnCGBzBtBVBSABAB______________________ __________AB_MCTCTCVCVCVCVCPCTBtBZB_ABAB________________________ ______________ABAABwCTCVCVCPBtBZAxABA___________________________ __________________ABAABwCTCOBcBSABAB____________________________ ______________________AAABBVAxABAB______________________________ __________________________AKABAB________________________________ ________________________________________________________________ } # tile 435 (ochre / passwall) { ________________________________________________________________ ______________________________CICIBv____________________________ ____________________________BvCIBvBvCICI________________________ __________________________CIBvBvBvCICIBvCICI____________________ ________________________CICIBvBvCICICIBvCIBvCIBv________________ ______________________BvBvCIBvBvBvCICIBvCIBvBvBvCICI____________ ____________________CICIBvBvCIBvCICICICIBvBvCICIBvCIBv__________ __________________CICIBvCIBvBvBvBvBvCIBvBvCICICIBvCIBvCICI______ ________________BvCICICIBvBvCICIBvCIBvBvBvCICIBvBvCIBvCIBvBv____ ______________BvBvCIBvBvBvCICICICIBvBvCIBvBvCIBvCIBvCIBvCIBvBW__ ____________CICIBvBvBvCICIBvCIBvBvCIBvCICIBvBvCICIBvBvCIBvBvBW__ __________BvCICICIBvBvCICIBvBvCICICIBvCICIBvBvBvCIBvBvBvBvBWBW_A ________BvBvCICICIBvCIBvBvCIBvBvCICIBvBvCICIBvBvBvCIBvBvBWBWAz_A ______CICIBvCICIBvCIBvCICIBvBvBvCICICIBvBvBvCIBvCIBvCIBWBWAzAb_A ____CICICIBvCIBvCIBvBvCICIBvCIBvBvBvBvBvCIBvCICIBvBvBWBvAzAb_A_A __BvCICIBvBvBvBvCIBvCICICIBvBvBvCIBvCIBvBvCIBvBvBvBWBWBvAb_A_A__ BvCIBvBvBvBvCICIBvBvCICIBvBvBvCIBvBvCIBvCIBvBvBvBWBWAzBW_A_A____ CICIBvCICIBvCICICIBvCIBvBvBvBvCICICICIBvBvBvBvBWBWAzAb_A_A______ __CIBvCICIBvBvCIBvCICIBvCICIBvBvCICICICIBvBvBWBWAzAb_A_A________ __CPCPCICIBvCIBvCICIBvBvCICICIBvBvCIBvBvBvBWBWAzAb_A_A__________ __CPCPCPBkBvBvCICIBvBvBvBvBvCICICIBvBvBvBWBWAzAb_A_A____________ __CVCPCPCPCPCPBvBvBvBvCICIBvBvBvBvCIBvBWBWAzAb_A_A______________ BvCVCVCVCVCPCPCPBkBvCIBvCIBvCICICIBvBWBWAzAb_A_A________________ _ABvBvCVCVCVCPCPCPCPCPBvBvCICIBvBvBWBWAzAb_A_A__________________ ___A_ABvBvCVCVCVCVCPCPCPBkBvBvBvBWBWAzAb_A_A____________________ _______A_ABvBvCVCVCVCVCPCPCPBvBWBWAzAb_A_A______________________ ___________A_ABvBvCVCVCVCVCPBvBWAzAb_A_A________________________ _______________A_ABvBvCVCVCPBWAzAb_A_A__________________________ ___________________A_ABvBvCPBWAb_A_A____________________________ _______________________A_AAzAb_A_A______________________________ ___________________________A_A_A________________________________ ________________________________________________________________ } # tile 438 (canvas / flame sphere) { ________________________________________________________________ ______________________________COCnCO____________________________ ____________________________CNCnCOCUCOCn________________________ __________________________COCnCOCNCnCNCOCUCO____________________ ________________________CNCnCOCUCOCOCiCUCOCNCiCU________________ ______________________COCnCOCUCOCUCOCUCOCnCOCUCOCnCO____________ ____________________CNCnCOCNCnCNCiCUCOCUCOCUCOCNCOCUCO__________ __________________CnCOCOCUCiCNCiCNCnCNCiCUCOCnCiCUCOCnCOCU______ ________________COCNCiCUCOCUCOCTCOCOCnCNCOCUCOCUCOCnCOCUCOCO____ ______________CNCOCnCNCnCNCiCUCOCUCOCNCnCNCiCUCOCUCOCUCiCNCnCU__ ____________COCnCOCUCOCOCnCNCOCnCOCUCiCOCnCNCOCnCOCUCOCUCOCOCU__ __________CNCnCOCUCOCUCOCUCOCnCOCUCOCUCOCUCiCNCOCTCNCOCnCICNCT_A ________COCnCOCUCOCnCOCUCOCUCOCUCOCnCOCUCOCUCiCUCOCnCNCOCUBvBz_A ______CnCNCOCUCOCnCOCNCnCNCiCUCiCNCOCUCOCnCOCUCiCNCOCICNCTBvBj_A ____COCNCiCUCOCUCOCUCiCOCiCUCOCUCiCUCiCNCOCUCOCUCnCOCUBvCTBW_A_A __CnCNCiCNCnCNCiCUCOCUCOCTCNCnCOCUCOCUCiCUCOCnCOCOCNCTBvBc_A_A__ COCNCiCUCOCOCiCUCOCnCOCUCOCOCOCUCOCTCOCUCOCnCNCOCUCTBzBW_A_A____ CnCOCTCOCUCOCUCiCNCOCUCOCUCiCUCiCNCiCUCOCTCNCiCNCTCUBj_A_A______ __CUCOCNCiCUCOCUCiCUCOCnCOCUCOCUCiCUCOCNCnCOCUCTBzBc_A_A________ __CPCPCnCUCOCnCOCUCiCNCOCUCNCnCOCUCOCnCOCiCNCUBzBj_A_A__________ __CPCPBnCPCTCOCUCOCUCiCUCiCOCOCUCOCUCOCnCNCTCTBc_z_A____________ __CVCPCPCPCPCOCOCnCOCUCOCUCiCUCOCNCnCOCNCUBzBc_A_A______________ COCVCVCVCVCPCPCPBmCTCOCNCiCUCOCnCOCOCUCTBzBj_z_A________________ _ACnCNCVCVCVCPCPCPCOCKCOCUCOCTCNCiCUCNCTBc_A_A__________________ ___A_ACnCNCVCVCVCVCPCPCPCKCNCOCnCNCTBzBc_z_A____________________ _______A_ACnCOCVCVCVCVCPCPCOCiCNCUBzBj_A_A______________________ ___________A_ACOCnCVCVCVCVCPCTCNCTBc_z_A________________________ _______________A_ACNCOCVCVCPCTBzBc_A_A__________________________ ___________________A_ACNCOCPCUBc_z_A____________________________ _______________________z_ABzBc_A_A______________________________ ___________________________A_A_A________________________________ ________________________________________________________________ } # tile 439 (hardcover / freeze sphere) { ________________________________________________________________ ________________________________________________________________ ____________BDAlAlAlAlAlAlAlAlAlAlAlAlAlAlAlAlAlAlAlAlAl_A_A____ __________AeAeBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDAl_A_A_A__ __________AeBDBkBkBkBkBkBkBkBkBkBkBkBkBkBkBkBkBkBkBkBDAl_A_A_A__ __________AeAeBJCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPBkBDAl_A_A_A__ __________AeAlAlAlAlAlAlAlAlAlAlAlAlAlAlAlAlAlAlCPBkBDAl_A_A_A__ __________AeAlCPCPBnCPCPBDCPBdBdBdBDBDBdBJAjBJAlCPBkBDAl_A_A_A__ __________AeAlCPAeCKAlCOCPBDCPBdBdBdBdAlBdAlBDAlBnBkBDAl_A_A_A__ __________AeAlBDCPCOCPCPBlCPBdCPBdBdBdBdBDBdBJAlCPBkBDAl_A_A_A__ __________AeAlCPAlBnCKBmCPCPCJBdCPBdBdBdBdAlBdAlCKBkBDAl_A_A_A__ __________AeAlBdCPBdCPCPCJBnCPBnBdCPBdBdBdBdBDAlCPBkBDAl_A_A_A__ __________AlAlAlAlAlAlCPCPCPCJCPCPBDCPBdBdBdBdAlCPBkAlAl_A_A_A__ __________BdAlBdBdBdAlBdCJBnCPBmCKCPBdCPAlAlAlAlCPAlAlAl_A_A_A__ __________BdBDBdAlBdAlCPBdCPCKCPCPBmCPAlBdBdBdAlAlAlAlAl_A_A_A__ __________AlBDBdBdBdAlBdCPBdCPBmCPCKAlBdBdAlBkAlAl_ABJAl_A_A_A__ __________AlAlBdBdBkAlBdBdBnBdCKCPBmAlBdAlBdBdAlAlAlAlAl_A_A_A__ __________BkAlBdBdBdAlBdBdBcCPBdCPCPAlBdBkAlBdAlBJBkBDAl_A_A_A__ __________BdBDBdAlBdAlBdBdBdBdCPBDCPCPAlBdBdBkAlCPBkBDAl_A_A_A__ __________AlBDBdBdBkAlBDBdBdBdBDCPBdCKCPAlAlAlAlCPBkBDAl_A_A_A__ __________AeAlAlAlAlAlBdBDBdBdBdBdCPBDCPCPCPCPAlBnBkBDAl_A_A_A__ __________AeAlBDBDBDBDBDBdBDBdBdBdBdCPBDCPBkCPAlCPBkBDAl_A_A_A__ __________AeAlBDAlBJAjBJBDBdBDBdBdBdBdCPBdAlCPAlCKBkBDAl_A_A_A__ __________AeAlBJAjBDBDBDAlBDBdBDBdBdBdBDCPBdCPAlCPBkBDAl_A_A_A__ __________AeAlBDAlBJAlBDBDBDAlBdBDBdBdAlBdAlBdAlCOBkAlAl_A_A_A__ __________AeAlBDBXAjBDBDAlBDBDBDBdBDBdBdBdBdCPAlCP_M_A_A_A_A_A__ __________BDAlAlAlAlAlAlAlAlAlAlAlAlAlAlAlAlAlAl_A_A_A_A_A_A_A__ ___________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A__ _____________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A______ _______________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A__________ ________________________________________________________________ ________________________________________________________________ } # tile 448 (rainbow / lightning) { ________________________________________________________________ ______________________________BeCQBe____________________________ ____________________________BeChBeBeCQBe________________________ __________________________CeCeBeBeCQBeBeBeBI____________________ ________________________CeCQBeBeCQBeCQBIBe_pBI_p________________ ______________________CeCeCeBeCeBeBeBeBeBI_pBe_pBI_p____________ ____________________CeCeCeCeBeBeCQBeBIBIBe_pBI_p_pBI_v__________ __________________CeCeCeCeCeCeBeBeBeCQ_kBI_pBIBI_p_y_p_v_y______ ________________CeCeCeCeCeCeCeCQBeBeBI_p_pBI_p_v_p_yAF_v_v_s____ ______________CwCeCwCeCwCeCeCeCQBeBIBeBI_p_p_y_v_y_v_pBI_vAF_s__ ____________CeCeCeCeCwCeCeCeChBeBeBI_p_p_yBI_sBI_vAF_s_vAF_sAp__ __________CeCeCeCeCeCeCeCeCwCeCQBeBI_pBI_y_s_v_s_y_sAF_sAF_o_s_O ________CeCvCeCeCeCHCeCeCeCeCeBeBI_v_v_v_vAFAFAF_sAFAF_sAp_sAo_O ______CdCnCdCnCdCdCdCdCdCgCdCdAF_vAFAFAF_sAFAF_sAFAFCz_u_o_r_j_M ____CdCnCdCdCdCdCdCdCdCdCnCdCfCM_t_u_u_uAF_uAFAF_uAF_oCIAi_nAK_M __CdCdCdCdCdCdCqCnCxCrCdCrCfCUC_C__w_uBH_u_x_u_uAF_r_uCI_n_OA___ CdCdCzCdCyCyCdCnCyCdCUCrCzCrCjC_BGBG_w_u_uBH_u_uAo_rAiBZABA_____ CdCnCyCnCdCdCdCrCdCyCrCzCrCjCjC_C_BHBB_w_w_w_u_r_r_n_nAA_M______ __CdCzCnCrCyCzCUCzCrCzCrCsCjCsC_BfBfBB_uBB_u_rBG_rAh_MA_________ __CPCKCUCdCyCUCzCzCrCrCjCsCsCjC_C_BHBGBG_w_t_t_n_i_MAB__________ __CPCPCOCPCzCzCrCrCzCrCrCjCjCsC_C_BGBGAoBG_rAn_nAAAA____________ __CVCVCPCPCKCPCzCfCfCjCjCsCjCjC_C_C_BGBGAn_q_lAA_M______________ CzCVCVCVCVCPCPCPCPCfCsCjCjCjCsC_BfBzBGAoAnAhABA_________________ ABCzCzCVCVCVCVCPCPCPCPCjCsCjC_C_C_BGAnAnAgAA_M__________________ __ABAOCUCzCVCVCVCVCPCPBnCOC_C_C_BbByAoBa_PAB____________________ ______ANAOCrCfCVCVCVCVCPCPBnCLBGByAnAgAB_M______________________ __________ABAOCjCfCVCVCVCVCPCMByAoBaABA_________________________ ______________AOAeCjCjCVCVCPC_BaAgAB_O__________________________ __________________AeAeCjCjBnByAhAKAB____________________________ ______________________AaAEByBZAKAB______________________________ __________________________AB_OAB________________________________ ________________________________________________________________ } # tile 449 (tattered / poison blast) { ________________________________________________________________ ________________________________________________________________ ____________BSBSBwCGBjBtBcCGBjBtBcBt____BwBVBtBcBtBc___A_A_A____ ________BSBSBSBSBbBVBbBtBjBtBbBtBjBtBXBbBtBbBwBzCGBXBt_A_A_A_A__ ______BSBSBSCPCPCPCPCPCPCPCPCPCPCPCWCPCPCPCPCPCPCOCOBwBV_A_A_A__ ______BSBSBSCiClCiCXClCiClClCiClClCiCXClCXClCiCPCPCPCGBc_A_A_A__ ______BSBSBSBtBwBtBtBwBtBXBtBwBtCiClCiCXCiCVCPCPCPCPBjBt_A_A_A__ ______BSBSBSBwBbBwBVBzCGBwBzCGBcCGCiCXCiCXCPCPCiCXCPCGBw_A_A_A__ ______BSBSBSCGBjBtBzBtBjBVCGBcCGBbCiClCiCXCPCPCXClCPBVBz_A_A_A__ ______BSBSBSBbBtBjCGBjCGBjCGBzBXCiCXCiCVCXCiClCiClCPBXCG_A_A_A__ ______BSBSBSBtBjCGBbCGBzBtBzBtBtClCiCVCPCPCiCXChClCPBtBj_A_A_A__ ______BSBSBSBjCGBzCGBcCGBjCGBjBwCiClCiClCiCXClCPCiCPBbCG_A_A_A__ ______BSBSBSCGBbBwBtBzBwBVCGBbCGBVCGBXCGCiClCiClClCVBtBj_A_A_A__ ______BSBSBSBtBcCGBjBwCGBzCGBjCGBcCGBzBwCiCiCXCiCPCPBjBt_A_A_A__ ______BSBSBSBjBtBzBtBzBVBwBbCiClCGBcCiBtBzCiCXChCPCOCGBb_A_A_A__ ______BSBSBSBzCGBjCGBwCGBwCGCiBwBzBtCiCiCXCiClCPCOCJBwBX_A_A_A__ ______BSBSBSBtBjBVBzBVBzCGBbBtBjCGBbBtBwCiClCiCVCJCPBjBt_L_A_A__ ______BSBSBSCGBbCGBtBwCGBVBjBtBzCGBwBbBtCiCiCXCPCPCPCGBw_A_A_A__ ______BSBSBSBjCGBjBzBtBzBwCGBjBVBwCGBzBtClClCiCXCXCPBbCG_L_A_A__ ______BSBSBSBbCGBcCGBwCGBbBtBzCGBwBbCGBXCiCiCXCiClCPBtBj_A_A_A__ ______BSBSBSBwBtBbCGBzBwCGBjCGBbCGBjCGBzCGBjCiClCiCVBVBt_L_A_A__ ______BSBSBSCGBcCGBjBtBwBVBzBtBcCGBzBJCGBjBtCiCiClCPBtBc_A_A_A__ ______BSBSBSBbBwBzCGBbCGBjCGBjCGBcBtBwBzBtBzBtBwCiCVBwBt_A_A_A__ ______BSBSBiBVCGBcCGBjCGBzBtBVBjBtBzBwBtClCGBjBtClCPCGBj_A_A_A__ ______BSBSBSBwBVBtBzBtBjCGBjCGBzCGBtBVBzBtBjBtBbCiCPBz_A_A_A_A__ _______ABSBSBbCGBjBtBzBtBcCGBbBtBwBzCGBwCGBzBwBtCl_A_A_A_A_A_A__ _______A_ABSBtBcCGBcBtBjBtBzBXBtBzBtBJBwBbBtBwBb_z_A_A_A_A_A_A__ _______A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_z_A_z_A_z_A_A_A_A_A_A_A_A__ _________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A______ ___________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A__________ ________________________________________________________________ ________________________________________________________________ } # tile 450 (colorful / acid stream) { ________________________________________________________________ ______________________________CjCfCF____________________________ ____________________________CjCrCcCGCGCv________________________ __________________________CjCrCcCGCdCaCDCeCa____________________ ________________________CrCUCdCGCHCvCeCaCaCHBEBE________________ ______________________CfCfCdCdCdCHCaCeCDCeBCBEAmA$_o____________ ____________________CrCUCLCGCdCDCaCeCaCHBEBEBE_gAi_oAi__________ __________________CrCfCGCdCHCvCHCaCDCeBQAmBE_gAp_jApAi_gBE______ ________________CfCrCdCdCdCDCeCaCHCaBEBEAm_gAp_jAi_gA$BEBECD____ ______________CjCLCUCGBuCvCeCaCaCDBEBE_gApAi_oAi_sAmBEBECaCHCD__ ____________CfCrCGCdCvCeCaCDCeCHBEBEAm_oA$_jAi_gBEBEBCCHBQCaBP__ __________CfCUCdCdCvCHCaCaCHBQBEBEA$_fAp_oAi_fA$BEBCBeCaCHCDBuAB ________CfCUCdCdCHCHCaCHCaCHBEAm_gA$_oAi_oA$A$BEBECaCaCHCDBuCCAO ______CrCzCGCdCHCvCaCHCaCHBEBE_gA$_oAi_oAm_fBEBEBQCHCLCDBuCCBTAO ____CfCLCdCGCvCaCeCDCaCHBEAmBEAi_fAiAi_fA$BEBCCeCaCaBuCLCCBTAZAB __CfCcCdCGCvCHCHCaCaCHBEBE_g_fAi_oAi_gBEBEBQCeCDCaBuBqCfBTANAO__ CfCLCGCGCvCHCaCaCHBEBEBE_fAiAi_oAi_gBABECHCaBQCHCDBuCCCLABAB____ CcCdCvCeCaCHCaCeBQBEBE_fAi_oAi_oA$BEBECHBQCaCHCDBuCCBiABAO______ __CdCDCaCeCaCHBEBEAm_gApApAi_oBEBEBEBQCaCeCDCHCZBtBTAZAO________ __CmCoCaCaCHBQAmBE_gAiAi_oAp_gAmBEBECaCHCaBuCZBUBrAOAB__________ __CmCmCmCmBEBEBE_gAi_oAi_j_gBEBEBQCaCHCaBuCDBtBpAOAB____________ __CoC$CmCoChCX_fApAiAi_fA$BEBKBQCeCaCaBuCCBtBTANAB______________ CDC$CoC$CoCoCoCVCV_oApA$BEBCCeCaCaCHCDBuBtBRAOAB________________ ABCHBECoC$CoCoCoCoCVCVBEBCBeCaCaCHCDCGBpBTAOAB__________________ __ABABAm_oC$CoCoC$CmCmCVCmCaCHCDBuCZBtBTAKAB____________________ ______AOAOAiAiC$CoC$C$CmCoCVCHCDBuBtAxANAB______________________ __________AB_VAmBECoCoC$CoCoCDCGBpBiAOAB________________________ ______________AO_SCHCaCoC$CmCGCCB_AOAB__________________________ __________________ABAECDCHCVBtAxANAB____________________________ ______________________ABAOBrBTABAO______________________________ __________________________AOABAO________________________________ ________________________________________________________________ } # tile 451 (tartan) { ________________________________________________________________ _______________________________hCB_h____________________________ ____________________________CB_h_h_c_XCF________________________ ___________________________c_X_h_c_XCF_m_c_h____________________ ________________________CF_X_c_T_QCF_m_c_hCB_hCU________________ _______________________m_mCFCc_TCc_T_m_h_h_hCUCB_h_h____________ ____________________CB_c_T_m_UCF_T_m_T_c_hCUCY_hCB_X_XCF________ __________________CB_h_h_X_TCc_UCcCFCFACCUCB_h_h_X_cCF_c_m______ ________________CB_hCB_c_XCF_X_m_c_m_mCUCF_c_X_T_TCF_X_m_h_h____ ______________CB_hCUCUCBCB_c_m_h_h_XCr_m_mCFCc_TCc_T_m_hCBCB_c__ ____________CB_h_h_X_cCrCL_mCB_h_hCUCB_X_T_m_UCF_T_m_T_h_hCB_c__ ___________c_X_h_X_cCF_X_lCrCUCBCrCB_h_lAC_TCc_UCcCc_X_c_c_cCB_A ________CF_X_c_T_TCF_c_m_h_h_hCUCB_hCB_c_XCF_T_m_m_mCF_c_cCBAx_A _______m_mCFCc_TCc_T_m_h_h_hCUCY_hCLCr_XCF_c_m_l_X_c_mCFCB_XB__A ____CB_c_T_m_mCF_U_m_TAC_hCrCB_h_hAC_cCUCr_lCB_h_h_X_cBs_c_X_A_A __CB_h_h_c_UCc_TCcCFCF_cCUCB_h_h_X_cCF_X_lCrCUCB_c_cCBBi_X_A_A__ CB_hCB_X_XCF_T_m_c_m_mCrCF_X_c_T_TCF_X_m_l_h_cCrCBCB_cAx_A_A____ _h_h_X_cCF_c_m_h_hACCU_m_mCFCc_TCc_T_m_h_h_h_c_cCB_X_X_A_A______ ___c_XCF_c_m_h_h_hCUCB_X_T_m_XCF_U_m_T_h_h_c_cCBCIAx_A_A________ __CKCP_c_m_hCB_hCrCB_h_h_c_UCc_TCcCF_X_c_c_cCB_cBWB__A__________ __CPCPCPCK_h_hCUCu_h_h_c_XCF_T_m_m_cCF_c_XCB_c_T_A_A____________ __CVCPCPCPCPCP_h_hCB_c_XCF_c_m_h_c_m_XCFCB_X_X_A_A______________ _hCVCVCVCVCPCPCOCK_c_XCF_c_m_h_h_c_c_mBs_c_X_A_A________________ _A_h_hCVCVCPCVCPCPCKCP_c_m_h_h_c_h_cCBBi_X_A_A__________________ ___A_A_h_hCVCVCVCVCPCPCPCKCB_h_h_cCB_cAx_A_A____________________ _______A_A_h_hCVCVCVCPCPCPCPCB_cCB_X_X_A_A______________________ ___________A_A_h_hCVCVCVCVCPCBCB_X_X_A_A________________________ _______________A_A_h_hCVCVCPCBB__X_A_A__________________________ ___________________A_A_h_hCP_cAx_A_A____________________________ _______________________A_A_X_X_A_A______________________________ ___________________________A_A_A________________________________ ________________________________________________________________ } # tile 452 (stylish) { ________________________________________________________________ ______________________________BPBPBP____________________________ ____________________________AsBPCfAsAsAs________________________ __________________________BPBPCfAsCICIBPAsBP____________________ ________________________BPBPCIAsCIBPBPCICIBPBPAs________________ ______________________BPAsCIAsAsAsBPAsBPBPCICIBPBPBP____________ ____________________BPBPCIAsBPBPAsAsBPBPAsAsBPCfCfAsBP__________ __________________BPAsCIAsBPBPAsBPBPAsBPAsBPBPBPAsCICIBPAs______ ________________BPBPCIBPBPAsAsBPBPBPAsBPAsBPAsBPAsCIAsCIBPAs____ ______________BPAsCIAsBPAsBPCICfCfBPAsBPAsBPAsAsBPBPCIBPBPAsAV__ ____________AsBPCIBPBPAsBPCIAsBPAsCIBPBPBPAsAsBPAsCfAsBPAsAsAV__ __________BPAsCIBPAsBPBPAsCfAsAsBPAsCIAsAsBPAsBPCfBPBPAsAsAVAV_A ________AsBPCIAsBPAsBPAsBPAsCIBPBPAsAsAsBPAsAsCfBPBPAsAsAVAVAH_A ______BPAsCIBPAsBPAsCIBPBPBPBPCIBPBPAsAsBPBPCIBPBPAsCIAVAVAH_L_A ____BPBPCfAsAsBPBPAsBPCIBPAsBPCfBPAsBPAsBPCIAsBPAsAsAVBvAH_L_A_A __BPBPCfBPAsBPBPBPAsBPAsCICfCfAsBPBPAsBPCIAsBPAsAsAVAVBv_L_A_A__ BPAsCIAsCIAsBPBPBPAsBPAsAsBPAsBPAsBPAsCIBPBPAsAsAVAVAHBW_A_A____ BPBPAsCICIBPBPAsAsAsAsBPBPAsAsAsBPBPCIAsBPAsAsAVAVAH_L_A_A______ __BPBPBPBPCICIAsBPBPAsAsAsBPBPAsBPCIBPBPAsAsAVAVAH_L_A_A________ __CPCPBPBPBPBPCICIBPBPBPBPBPBPAsCIAsBPAsAsAVAVAH_L_A_A__________ __CPCPCPBkBPBPBPAsCICfBPBPCIAsCIBPBPAsAsAVAVAH_L_A_A____________ __CVCPCPCPCPCPBPAsBPAsCfCfAsCIAsBPAsAsAVAVAH_L_A_A______________ BPCVCVCVCVCPCPCPBkBPBPBPAsCIBPBPAsAsAVAVAH_L_A_A________________ _ABPBPCVCVCVCPCPCPCPCPBPAsBPBPAsAsAVAVAH_L_A_A__________________ ___A_ABPBPCVCVCVCVCPCPBnCJBPAsAsAVAVAH_L_A_A____________________ _______A_ABPBPCVCVCVCVCPCPCPAsAVAVAH_L_A_A______________________ ___________A_ABPBPCVCVCVCVCPAsAVAH_L_A_A________________________ _______________A_ABPBPCVCVCPAVAH_L_A_A__________________________ ___________________A_ABPBPCPAH_L_A_A____________________________ _______________________A_AAH_L_A_A______________________________ ___________________________A_A_A________________________________ ________________________________________________________________ } # tile 453 (psychedelic) { ________________________________________________________________ ______________________________BeCeBE____________________________ ____________________________CeCeCeBeBeBe________________________ __________________________CeCeCgCHBeBeCeBeCe____________________ ________________________CeCeCeCHCgCeCeCdCeCeCeCd________________ ______________________CeCeCeCdCdCeCdCnCdCnCdCNCkCkCk____________ ____________________CeChCeCeCgCdCsCkCtCsCOCkBgBgBgCkBg__________ __________________CkCsCHCgCHCdCnCkCOCkCNBgCkBgBhBICkCkCkBg______ ________________CkCkBgCtCdCrCkCdCnCkCkBgBHCkBgBeBHBgBgCkBgCk____ ______________CNCNCRCNCnCOBgCkClBgCkBgCkBHBIBhBIBeBACtBgCkCkBz__ ____________CsBgBHCNBICkBgBHBgBgBHBIBeBIBIBIBIBIBIBeBIBgCnCkCT__ __________COBgBgBhBABIBhBgBHBIBgBgBhCeBeCQBEBABeBIBeBHBHCNCUBH_A ________BHBHBgBgBhBeBhBIBABIBeBnBhBeBlBeCgBeBeBnBEBIBmBgCNBzBt_z ______BhBgBIBgBgBIBIBHBeChBeBABIBhBeCeBEBABeCeBeCeBeBvBHBLBzBU_A ____BhBgBhBIBhBIBIBICkBgBeBgBgBIBICeCeCeBeCnBeBeCHBIBFBvAoAh_z_A __BHBhBIBIBIBIBnBhBgCkBgBhBIBIBeBnBeCeCeCeBeCeCHCeBEA$BaBb_A_A__ CdBgBIBIBHBIBgBgCNCNCkBgBHBIBlCgCdCdCtCdCgCdCHCeBEA$AoBW_A_A____ CdCtCNCsCsCNCkBgCkBgCRBHBlBECeCeCdCnCdCNCOCnCeBEA$AmAh_A_A______ __CsCkCtCdCkCOBhBHBgCkBIBeChCeCdCdCnCdCtCNCkCHBKApAi_A_A________ __CKBnCkCkCkCkBHBgBhBeCeBeCeBeBeCeCdCHCdCdBwCHAmAi_A_A__________ __CPCPCPBnBHBHBhBIBeBIBACeCeCeBeCeCdCdCdCHBuA$Ai_A_A____________ __CVCVCPCPCPBnBIBIBEBEBeCgCdBEBeBnCeCeCGBKAmAf_A_A______________ CHCXCVCVCVCPCPCJCPCNBeCHCeCdCgBeBeBECdCHBuAf_N_A________________ _zCdCnCVCVCVCVCPCPCPCPBICdCeCeCHBeBACHAmBX_A_A__________________ ___A_LCJCnCVCVCVCVCPCPCPCPBlBIBIA$BAAmBU_A_A____________________ _______z_ACeCdCVCVCVCPCPCPCPBABHApApAi_A_A______________________ ___________A_ACNBHCVCVCVCVCPBeBLAoBb_A_A________________________ _______________z_ABIBACVCVCPApAoAh_A_A__________________________ ___________________A_MBIBACPBIAh_A_A____________________________ _______________________A_MAiAj_z_A______________________________ ___________________________B_A_A________________________________ ________________________________________________________________ } # tile 454 (spiral-bound) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ _____________h_h_h_h_h_h_h_h_h_h_h_h_h_h_h_h_h_h_h_h_A_A_A_A_A__ __________CPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCP_h_A_A_A_A_A__ _________h_h_h_h_h_h_h_h_h_h_h_h_h_h_h_h_h_h_h_hCP_h_A_A_A_A_A__ ______Bd_hAR_c_h_h_h_h_h_c_h_h_h_h_h_h_h_h_h_h_hCP_h_A_A_A_A_A__ ____Bd___h_h_h_h_h_h_hAR_l_h_h_h_h_h_h_h_h_h_h_hCP_h_A_A_A_A_A__ ______CPBd_AAR_h_h_h_h_h_h_h_h_h_h_h_h_h_h_h_h_hCP_h_A_A_A_A_A__ ______Bd_h_h_h_h_h_h_h_h_h_h_h_h_h_h_h_hAR_h_h_hCP_h_A_A_A_A_A__ ____Bd___hAR_h_h_h_h_B_z_h_h_B_z_h_B_z_A_h_h_h_hCP_h_A_A_A_A_A__ ______CPBd_A_h_h_h_h_h_h_h_h_h_h_h_h_h_h_h_c_h_hCP_h_A_A_A_A_A__ ______BY_h_h_c_h_h_h_h_z_B_h_h_z_B_c_h_h_h_h_h_hCP_h_A_A_A_A_A__ ____Bd___hAR_h_h_h_h_h_h_h_h_h_h_h_h_h_h_h_h_h_hCP_h_A_A_A_A_A__ ______CPBd_z_h_h_h_h_h_h_h_h_h_h_h_hAR_h_h_hAR_hCP_h_A_A_A_A_A__ ______Bd_h_h_d_h_h_h_h_h_h_h_h_h_h_h_h_h_h_h_h_hCP_h_A_A_A_A_A__ ____Bd___hAQ_h_h_h_h_h_hAR_c_h_h_h_h_h_hAR_h_h_hCP_h_A_A_A_A_A__ ______CPBd_B_h_h_h_h_h_h_h_h_hAR_h_h_h_h_h_h_h_hCP_h_A_A_A_A_A__ ______Bd_h_hAQ_h_h_hAR_h_h_h_h_h_h_h_h_h_h_h_h_hCP_h_A_A_A_A_A__ ____Bd___d_h_d_l_h_h_h_h_h_h_h_h_hAQ_h_d_h_h_hARCP_h_A_A_A_A_A__ ______CPBd_z_h_h_d_hAQ_h_h_h_h_d_h_h_h_h_hAR_h_hCP_h_A_A_A_A_A__ ______Bd_h_hAQ_l_h_h_h_hAR_h_h_h_hAR_h_h_h_h_h_hCP_h_A_A_A_A_A__ ____Bd___h_d_h_h_h_h_h_h_h_h_h_h_h_h_h_h_h_h_h_hCP_h_A_A_A_A_A__ ______CPBd_z_h_h_hAR_h_h_h_hAQ_h_h_h_h_h_h_h_h_hCP_h_A_A_A_A_A__ _________hAQ_h_h_h_h_h_d_h_h_h_h_d_hAQ_h_h_h_c_hCP_h_A_A_A_A_A__ _________h_d_h_h_hAR_h_h_h_h_h_h_h_h_h_d_h_h_h_h_z_A_A_A_A_A_A__ _________A_z_B_z_A_A_A_A_z_z_B_z_B_z_A_A_z_z_z_B_A_A_A_A_A_A_A__ _________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A______ ___________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A__________ ________________________________________________________________ ________________________________________________________________ } # tile 455 (left-handed) { ________________________________________________________________ ________________________________________________________________ ______BE_KBE_KBE_KBE_KBE_KBE_KBE_KBE_KBE_KBE_K_I_I______________ _______KBE_KBEBE_KBEBE_KBEBE_KBEBE_KBEBE_KBEBE_I_I_I_I_A_A______ ______BE_KCXCPCPCPCPCPCVCPCPCPCPCPCVCPCPCPCPCPCPCP_I_I_I_A_A____ _______KBECPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCP_I_I_I_A_A_A__ ______BE_KCVCPBE_KBE_KBE_KBE_KBE_KBE_KBE_KBE_KBE_K_I_I_I_A_A_A__ _______KBECPCV_KBeBE_KBEBe_KBE_KBEBe_KBEBe_KBEBeBE_I_I_I_A_A_A__ ______BE_KCVCPBE_KBEBEBeBEBE_KBEBeBEBE_KBEBeBE_KBE_J_I_I_A_A_A__ _______KBECPCV_KBEBEBE_KBe_KBEBE_KBE_KBeBE_KBeBE_K_I_I_I_A_A_A__ ______BE_KCWCPBEBE_KBeBE_KBeBe_KBE_KBeBeBeBeBEBEBE_I_I_I_A_A_A__ _______KBECPCP_KBEBE_KBEBEBEBeBEBeBECQ_KBEBe_KBE_K_I_I_I_A_A_A__ ______BE_KCVCPBE_KBeBeBE_K_KBEBEBE_KBeBE_KBE_KBeBE_I_I_I_A_A_A__ _______KBECPBnBEBeBe_KBEBeBe_KBE_KBEBEBe_KBEBeBE_K_I_I_I_A_A_A__ ______BE_KCVCP_KBEBEBE_KBeBEBeBeBE_KBeBEBE_KBE_KBE_I_I_I_A_A_A__ _______KBECPCPBE_KBe_KCQ_KBEBe_KBeBeBE_KBe_KBEBeBE_I_I_I_A_A_A__ ______BE_KCVCPBE_KBEBEBeBEBEBEBE_KBE_KBEBeBE_KBe_K_I_I_I_A_A_A__ _______KBECPCV_KBEBe_KBEBE_KBEBEBEBeBeBE_KBE_KBEBE_I_I_I_A_A_A__ ______BE_KCVCPBE_KBEBE_KBE_KBE_KBe_KBeBEBeBeBeBE_K_I_I_I_A_A_A__ _______KBECPCV_KBE_KBEBe_KBEBeBEBEBe_KBEBEBe_KBEBE_I_I_I_A_A_A__ ______BE_KCWCPBEBe_KBE_KBEBe_KBE_KBE_KBE_KBeBeBE_K_I_I_I_A_A_A__ _______KBECPCP_KBEBeBEBeBE_KBeBEBe_KBeBEBeBeBE_KBE_I_I_I_A_A_A__ ______BE_KCVCPBE_KBE_KBE_KBEBe_KBEBeBe_KBEBe_KBE_K_I_I_I_A_A_A__ _______KBECPCV_KBeBE_KBeBEBe_KBEBeBeBEBE_KBeBeBEBE_I_I_I_A_A_A__ ______BE_KCVCPBE_KBEBE_KBEBeBE_KBEBE_KBeBEBEBEBe_K_I_I_I_A_A_A__ ___________ACW_KBEBe_KBE_KBE_KBE_KBEBE_KBE_KBE_KBE_I_I_I_A_A_A__ _____________ABE_KBEBEBEBEBEBE_KBeBeBeBeBEBE_KBEBE_J_I_A_A_A_A__ _______________KBE_K_KBE_KBE_KBEBE_KBE_KBE_KBEBE_K_A_A_A_A_A_A__ _______________N_z_M_z_B_A_B_A_B_B_A_B_A_B_A_B_B_A_z_A_A_A_A____ _____________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A________ ________________________________________________________________ ________________________________________________________________ } # tile 456 (stapled) { ________________________________________________________________ ________________________________________________________________ __________CmCmCmCXCmCmCmCmCmCmCXCmCmCmCmCmCmCmCXCm______________ __________CmCVCVCVCVCVCVCVCVCXCVCVCVCVCWCXCVCVCVCWCP____________ __________CmCVBkCOBkCPCVCXCVCVCVCVCXCVCVCVCVCVCXCVCPBk__________ __________CmCVCVCPCPCVCWCVCVCVCVCVCWCVCVCWCVCVCVCWCPCJ__________ __________CmCXCVCVCWCXCVCWCVCVCVCVCVCVCWCVCVCWCVCVCPBm__________ __________CmCVCVCVCVCVCXCVCXCWCVCVCVCXCVCVCWCVCVCVCWBk__________ __________CmCWCVCVCWCVCWCVA_BkAlCWCVCWCWCVCWCXCVCWCPCJ__________ __________CmCWCVCXCVCVCVCWBjBkBJBJBkCVCVCVCWCVCVCVCPBk__________ __________CmCWCWCVCiCVCXCVCPCWBDBkCPCXCVCVCWCWCVCiCPCO__________ __________CmCVCXCVCVCWCVCVCXCVBkAlCPCVCVCVCWCVCWCVCPBk__________ __________CmCWCWCVCVCVCWCVCVCVCWCWCWCWCVCiCXCWCVCWCOCJ__________ __________CmCVCWCVCVCXCWCVCVCVCVCiCVCXCVCWCVCVCVCXCPBm__________ __________CmCWCVCXCVCgBJCKCWCVCWCVCVCVCVCVCWCVCVCWCPBk__________ __________CmCVCVCVCVBDBJCWBdBDCOBkBdBwBcBdCVCVCVCWCPCJ__________ __________CXCVCVCVCVCVBkCXCPBdBDBkCPCOCPCOCWCVCWCVCPBk__________ __________CmCVCVCVCWCWCPCVCVBkBdCPCPBkCPBkCVCVCVCXCPBm__________ __________CmCVCVCVCVCVCPCWCXCVCVCVCWCPCWCVCWCVCVCVCPCJ__________ __________CmCXCVCVCVCVCVCVCVCVCWCVCVCVCVCVCVCWCWCVCPBk__________ __________CmCVCVCVCVAlCOBDCWCVCVCVCWCVCWCVCVCVCVCVCPBk__________ __________CmCWCVCVCVBJBXCPAlBJCVBJBJCVBDBDCVCWCVCVCPCO__________ __________CmCVCVCVCWBkBDCVBjBDCVBdBDCVCJCPCWCWCVCWCPBl__________ __________CmCVCXCVCVAlCPCVCPCOCWCPCOCVBdCWCVCVCVCVCPBk__________ __________CmCXCVCVCXCVCVCWCVCPCVCPCWCWCVCVCVCXCmCmCPCO__________ __________CmCVCVCVCWCWCXCVCWCVCVCVCVCVCVCVCVCoBkCJCPBk__________ __________CmCVCVCVCWCVCVCVCVCWCWCWCVCVCWCVCmCmBkCVCPBk__________ __________CmCWCVCVCVCWCVCVCWCVCWCVCVCWCVCmCmCJCPCPCPCO__________ ____________CPCPCiCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPBk__________ ______________BkBlBkBkCJBkCJBkCJBkCJBkBkCOBkBkBmCJBmBl__________ ________________________________________________________________ ________________________________________________________________ } # tile 462 (bamboo / healing) { ________________________________________________________________ _____________________________________l__________________________ ____________________________________An_m________________________ ____________________________________BG_l________________________ ____________________________________An_m_lAn_m__BGBG____________ ____________________________________BG_l_l_m__BGBG_l____________ ____________________________________An_l____BGBB_l_l____________ ____________________________________BG_l__BGBG_l_l_i_A_A________ _____________________________________l_lBGBG_m_l_i_A_A_A________ _____________________________________lBGBG_l_l_i_A_A_A_A________ ____________________________________BGBB_l_l_i_A_A_A_A__________ __________________________________BGBG_l_l_i_A_A_A_A____________ ________________________________BGBG_m_l_i_A_A_A_A______________ ______________________________BGBG_l_l_i_A_A_A_A________________ ____________________________BGBB_l_l_i_A_A_A_A__________________ __________________________BGBG_l_l_i_A_A_A_A____________________ ________________________BGBG_m_l_i_A_AAn_L______________________ ______________________BGBG_l_l_i_A_LAn_m________________________ ____________________BGBB_l_l_lAnBGAnBG_l_l_l____________________ __________________BGBG_l_l_l_l_m_l_l_l_i_i_l_l__________________ ________________BGBG_m_l_i_A_A_A_A______________________________ ______________BGBG_l_l_i_A_A_A_A________________________________ ____________BGBB_l_l_i_A_A_A_A__________________________________ ____________BG_l_l_i_A_A_A_A____________________________________ _____________l_l_i_A_A_A_A______________________________________ _____________l_i_A_A_A_A________________________________________ _________________A_A_A__________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 475 (rusty / fear) { ________________________________________________________________ ____________________________________Bd_A________________________ ____________________________________BJBd_A__________BkBd_A______ ____________________________________AwBdBS_A____BiBTBdBD_A______ ____________________________________AwAlBSBd_ABTCJBdBJ_A________ ____________________________________AwAwBdBSBmBkBdBJAj_A________ ____________________________________BJAwBDBdCKBdAjBJ_A__________ ______________________________BdBTBiBTBdAlBdBdAlBJ_A_A__________ ________________________BdBdBdBdBdBdBSBSBdBDBdBdBdBd_A__________ _________________________A_AAeAeAeAeAwAwAeAlAeAeBTBiBT__________ ___________________________A_A_A_ABJAeAeAeAwAeAwAeAeBTBs________ _______________________________ABSAjAeAeAeAwAwAeAeAeAeAeBd______ ______________________________BSBSAeAOABAeAwAw_A_A_A_A_A_A_A____ ____________________________AlBJAeAOAB_AAeAwBJ_A_A______________ __________________________BDAlAeAOAB_A_AAeAwAj_A________________ ________________________BSBDAeAOAB_A___AAeBJ_A__________________ ______________________BSAlAeAOAB_A_____A_AAj_A__________________ ____________________BSBDAeAOAB_A_________ABJ_A__________________ __________________BJAlAeAOAB_A___________A_A_A__________________ ________________BJAjAeAOAB_A_______________A____________________ ______________AlBDAeAOAB_A______________________________________ ____________AjBJAeAOAB_A________________________________________ __________BJAlAeAOAB_A__________________________________________ ________AlBDAeAOAB_A____________________________________________ _______ABDAeAOAB_A______________________________________________ _______A_AAOAB_A________________________________________________ _________A_A_A__________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 478 (black / create horde) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ _______________________________________________________A_C_A____ ___________________________________________________A_C_C_C_A____ _________________________________________________C_C_G_G_G_A____ _______________________________________________C_B_C_C_C_A_A____ _____________________________________________C_B_C_C_C_A_A______ ___________________________________________A_A_C_B_C_A_A________ ___________________________________________B_C_B_A_A_A__________ _______________________________________C_B_C_B_G_A______________ _____________________________________C_C_G_G_G_A_A______________ ___________________________________C_B_C_C_C_A_A________________ _________________________________C_B_C_C_C_A_A__________________ _______________________________A_A_C_B_C_A_A____________________ _______________________________B_C_B_A_A_A______________________ ___________________________C_B_C_B_G_A__________________________ _________________________C_C_G_G_G_A_A__________________________ _______________________C_B_C_C_C_A_A____________________________ _____________________C_B_C_C_C_A_A______________________________ ___________________A_A_C_B_C_A_A________________________________ ___________________B_C_B_A_A_A__________________________________ _______________C_B_C_B_G_A______________________________________ _____________C_C_G_G_G_A_A______________________________________ ___________C_B_C_C_C_A_A________________________________________ _________C_B_C_C_C_A_A__________________________________________ _______A_A_C_B_C_A_A____________________________________________ _______A_A_A_A_A_A______________________________________________ _______A_A_A_A_A________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 479 (bronze / extra healing) { ________________________________________________________________ ____________________________________Cc_A________________________ ____________________________________BZCc_B__________CrCc_B______ ____________________________________BsCdCc_A____CrCnCcBT_A______ ____________________________________BZBiCLCc_BCrCdCyBZ_z________ ____________________________________BsBsCdCcCdCUCcBZBs_A________ ____________________________________BTBsBZCcCrCyBtBs_B__________ ______________________________CcCLCcCLCcBTCzCGBZBi_A_A__________ ________________________CcCLCcCdCcCdCcCLCcBtCcCcCdCc_B__________ _________________________B_AAxAbAwAwAxAwAxBsAdAxCcCLCc__________ ___________________________A_A_A_BAlAwAdAwBZAwAwAdAxCcCL________ _______________________________AAlBDAeAwAwBTBsAdAwAZAwAxCc______ ______________________________BJAjAeAOABAdBsBZ_z_A_A_A_A_B_A____ ____________________________AjBJAeAOAB_AAwBtBs_A_A______________ __________________________BJAlAeAOAB_A_AAwBiBZ_B________________ ________________________BJAjAeAOAB_A___AAxBZ_A__________________ ______________________AlBDAeAOAB_A_____A_ABs_B__________________ ____________________BDAlAeAOAB_A_________BBs_A__________________ __________________BJAlAeAOAB_A___________A_B_A__________________ ________________BJAjAeAOAB_A_______________A____________________ ______________AlBDAeAOAB_A______________________________________ ____________AjBJAeAOAB_A________________________________________ __________BJAlAeAOAB_A__________________________________________ ________AlBDAeAOAB_A____________________________________________ _______ABDAeAOAB_A______________________________________________ _______A_AAOAB_A________________________________________________ _________A_A_A__________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 482 (steel / magic missile) { ________________________________________________________________ ____________________________________Bk_A________________________ ____________________________________BdBk_M__________CPBk_A______ ____________________________________BdCPBk_A____CPCVBkBd_A______ ____________________________________BdBdBkCP_ACPCPBkBk_A________ ____________________________________BdBkBkBkCPCVBkBdBd_A________ ____________________________________BdBdBdCJCPBkBkBd_A__________ ______________________________BkBkCPBkBkBkBkBnBdBd_A_A__________ ________________________BkBnCJBnCJBkBnCJBnBdCJBkBnBk_z__________ _________________________z_AAeAeAeAeAeAeAeBdAeAeBkCPBk__________ ___________________________A_A_A_ABJAeAeAeBdAeAeAeAeBkCP________ _______________________________ABDAlAeAeAeBdBdAeAeAeAeAeBk______ ______________________________BJAlAeAOABAeBdBd_A_A_A_A_A_z_A____ ____________________________BJAjAeAOAB_AAeBdBd_A_A______________ __________________________AlBDAeAOAB_A_AAeBdBd_A________________ ________________________AjBJAeAOAB_A___AAeBd_A__________________ ______________________BJAlAeAOAB_A_____A_ABd_A__________________ ____________________AlBDAeAOAB_A_________ABd_A__________________ __________________BJAjAeAOAB_A___________A_A_A__________________ ________________BDAlAeAOAB_A_______________A____________________ ______________AlBDAeAOAB_A______________________________________ ____________AjBJAeAOAB_A________________________________________ __________BJAlAeAOAB_A__________________________________________ ________AlBDAeAOAB_A____________________________________________ _______ABDAeAOAB_A______________________________________________ _______A_AAOAB_A________________________________________________ _________A_A_A__________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 486 (long / death) { ________________________________________________________BD______ ______________________________________________________BDBJAl_A__ ____________________________________________________BDAlAlAO_A_A __________________________________________________BDBDAlAO_A_A_A ________________________________________________BDAlAlAO_A_A_A_A ______________________________________________BDBDAlAO_A_A_A_A__ ____________________________________________BDAlAlAO_A_A_A_A____ __________________________________________BDBDAlAO_A_A_A_A______ ________________________________________BDAlAlAO_A_A_A_A________ ______________________________________BDBDAlAO_A_A_A_A__________ ____________________________________BDAlAlAO_A_A_A_A____________ __________________________________BDBDAlAO_A_A_A_A______________ ________________________________BDAlAlAO_A_A_A_A________________ ______________________________BDBDAlAO_A_A_A_A__________________ ____________________________BDAlAlAO_A_A_A_A____________________ __________________________BDBDAlAO_A_A_A_A______________________ ________________________BDAlAlAO_A_A_A_A________________________ ______________________BDBDAlAO_A_A_A_A__________________________ ____________________BDAlAlAO_A_A_A_A____________________________ __________________BDBDAlAO_A_A_A_A______________________________ ________________BDAlAlAO_A_A_A_A________________________________ ______________BDBDAlAO_A_A_A_A__________________________________ ____________BDAlAlAO_A_A_A_A____________________________________ __________BDBDAlAO_A_A_A_A______________________________________ ________BDAlAlAO_A_A_A_A________________________________________ ______BDBDAlAO_A_A_A_A__________________________________________ ____CYCBAlAO_A_A_A_A____________________________________________ __BNCBBoBN_A_A_A_A______________________________________________ BNBNBNBN_A_A_A_A________________________________________________ _ABNBN_A_A_A_A__________________________________________________ _A_A_A_A_A_A____________________________________________________ ___A_A_A_A______________________________________________________ } # tile 488 (octagonal / fireball) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________BdBd____________ ______________________________________________BdBdBDBJ_A________ ____________________________________________BdBdBDAlAlAl_A______ __________________________________________BdBdBDBDAl_A_A_A_A____ ________________________________________BdBdBDAlAl_A_A_A_A______ ______________________________________BdBdBDBDAl_A_A_A_A________ ____________________________________BdBdBDAlAl_A_A_A_A__________ __________________________________BdBdBDBDAl_A_A_A_A____________ ________________________________BdBdBDAlAl_A_A_A_A______________ ______________________________BdBdBDBDAl_A_A_A_A________________ ____________________________BdBdBDAlAl_A_A_A_A__________________ __________________________BdBdBDBDAl_A_A_A_A____________________ ________________________BdBdBDAlAl_A_A_A_A______________________ ______________________BdBdBDBDAl_A_A_A_A________________________ ____________________BdBdBDAlAl_A_A_A_A__________________________ ________________C$C$C$BkBDAl_A_A_A_A____________________________ ______________C$C$C$BkCPBk_A_A_A_A______________________________ ____________BdBdBdCJBnBkBk_A_A_A_A______________________________ __________BdBdBdBdBdBkCJBMBk_A_A________________________________ ________BdBdBdBdBdBdBkBkBk_z_A_A________________________________ ________BdBdBdBdBdBdBdBk_M_A_A__________________________________ ________BdBdBdBdBdBdBd_A_A_A____________________________________ __________BdBdBdBdBd_A_A_A______________________________________ ___________ABdBdBd_A_A_A________________________________________ _____________A_A_A_A_A__________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 496 (orange / jacinth) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________CyCyC$C$C$C$C$CIBs____________________ ______________________CyCcCcCyC$C$C$C$CyCIBs____________________ ____________________CyCcCICcCyC$C$CyCyCICIBs_A_A________________ __________________CyCcCICIBsCyC$CyBsCICIBsBs_A_A________________ ________________CcCICIBsCIBsCcCyBsBsBsCIBsBs_A_A________________ ______________CcCICIBsBsBsCICICcCyBsCICIBsBs_A_A________________ ______________CcBsCIBsBsCICcCcBsBsCcCICIBsBs_A_A________________ ____________CcBsBsBsBsBsCcBsBsCIBsCICcCcBs_A_A__________________ __________CIBsCcBsBsBsCcBsBsBsBsBsCICIBsCc_A_A__________________ __________CICICcBsBsCcBsBsBsCICICICICcCc_A_A____________________ __________CICIBsCcCcBsBsBsCIBsCICICcCc_A_A______________________ __________CIBsBsCcCyBsCIBsCICICcCc_A_A_A________________________ __________CICICcBsBsCcCcCICcCcCc_A_A_A__________________________ __________CICcBsBsBsBsCICcCc_A_A_A_A____________________________ ___________ABsBsCICICICICc_A_A_A________________________________ ___________A_A_A_A_A_A_A_A_A____________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 498 (black / black opal) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________B1B1C$C$C$C$C$AO_A____________________ ______________________B1A2A2B1C$C$C$C$B1AO_A____________________ ____________________B1A2AOA2B1C$C$B1B1AOAO_A_A_A________________ __________________B1A2AOAO_AB1C$B1_AAOAO_A_A_A_A________________ ________________A2AOAO_AAO_AA2B1_A_A_AAO_A_A_A_A________________ ______________A2AOAO_A_A_AAOAOA2B1_AAOAO_A_A_A_A________________ ______________A2_AAO_A_AAOA2A2_A_AA2AOAO_A_A_A_A________________ ____________A2_A_A_A_A_AA2_A_AAO_AAOA2A2_A_A_A__________________ __________AO_AA2_A_A_AA2_A_A_A_A_AAOAO_AA2_A_A__________________ __________AOAOA2_A_AA2_A_A_AAOAOAOAOA2A2_A_A____________________ __________AOAO_AA2A2_A_A_AAO_AAOAOA2A2_A_A______________________ __________AO_A_AA2B1_AAO_AAOAOA2A2_A_A_A________________________ __________AOAOA2_A_AA2A2AOA2A2A2_A_A_A__________________________ __________AOA2_A_A_A_AAOA2A2_A_A_A_A____________________________ ___________A_A_AAOAOAOAOA2_A_A_A________________________________ ___________A_A_A_A_A_A_A_A_A____________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 501 (yellow / citrine) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________C7C7C$C$C$C$C$ByBa____________________ ______________________C7CMCMC7C$C$C$C$C7ByBa____________________ ____________________C7CMByCMC7C$C$C7C7ByByBa_A_A________________ __________________C7CMByByBaC7C$C7BaByByBaBa_A_A________________ ________________CMByByBaByBaCMC7BaBaBaByBaBa_A_A________________ ______________CMByByBaBaBaByByCMC7BaByByBaBa_A_A________________ ______________CMBaByBaBaByCMCMBaBaCMByByBaBa_A_A________________ ____________CMBaBaBaBaBaCMBaBaByBaByCMCMBa_A_A__________________ __________ByBaCMBaBaBaCMBaBaBaBaBaByByBaCM_A_A__________________ __________ByByCMBaBaCMBaBaBaByByByByCMCM_A_A____________________ __________ByByBaCMCMBaBaBaByBaByByCMCM_A_A______________________ __________ByBaBaCMC7BaByBaByByCMCM_A_A_A________________________ __________ByByCMBaBaCMCMByCMCMCM_A_A_A__________________________ __________ByCMBaBaBaBaByCMCM_A_A_A_A____________________________ ___________ABaBaByByByByCM_A_A_A________________________________ ___________A_A_A_A_A_A_A_A_A____________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 505 (black / jet) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________B1B1C$C$C$C$C$AO_A____________________ ______________________B1A2A2B1C$C$C$C$B1AO_A____________________ ____________________B1A2AOA2B1C$C$B1B1AOAO_A_A_A________________ __________________B1A2AOAO_AB1C$B1_AAOAO_A_A_A_A________________ ________________A2AOAO_AAO_AA2B1_A_A_AAO_A_A_A_A________________ ______________A2AOAO_A_A_AAOAOA2B1_AAOAO_A_A_A_A________________ ______________A2_AAO_A_AAOA2A2_A_AA2AOAO_A_A_A_A________________ ____________A2_A_A_A_A_AA2_A_AAO_AAOA2A2_A_A_A__________________ __________AO_AA2_A_A_AA2_A_A_A_A_AAOAO_AA2_A_A__________________ __________AOAOA2_A_AA2_A_A_AAOAOAOAOA2A2_A_A____________________ __________AOAO_AA2A2_A_A_AAO_AAOAOA2A2_A_A______________________ __________AO_A_AA2B1_AAO_AAOAOA2A2_A_A_A________________________ __________AOAOA2_A_AA2A2AOA2A2A2_A_A_A__________________________ __________AOA2_A_A_A_AAOA2A2_A_A_A_A____________________________ ___________A_A_AAOAOAOAOA2_A_A_A________________________________ ___________A_A_A_A_A_A_A_A_A____________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 507 (yellow / chrysoberyl) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________C7C7C$C$C$C$C$ByBa____________________ ______________________C7CMCMC7C$C$C$C$C7ByBa____________________ ____________________C7CMByCMC7C$C$C7C7ByByBa_A_A________________ __________________C7CMByByBaC7C$C7BaByByBaBa_A_A________________ ________________CMByByBaByBaCMC7BaBaBaByBaBa_A_A________________ ______________CMByByBaBaBaByByCMC7BaByByBaBa_A_A________________ ______________CMBaByBaBaByCMCMBaBaCMByByBaBa_A_A________________ ____________CMBaBaBaBaBaCMBaBaByBaByCMCMBa_A_A__________________ __________ByBaCMBaBaBaCMBaBaBaBaBaByByBaCM_A_A__________________ __________ByByCMBaBaCMBaBaBaByByByByCMCM_A_A____________________ __________ByByBaCMCMBaBaBaByBaByByCMCM_A_A______________________ __________ByBaBaCMC7BaByBaByByCMCM_A_A_A________________________ __________ByByCMBaBaCMCMByCMCMCM_A_A_A__________________________ __________ByCMBaBaBaBaByCMCM_A_A_A_A____________________________ ___________ABaBaByByByByCM_A_A_A________________________________ ___________A_A_A_A_A_A_A_A_A____________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 509 (violet / amethyst) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________BqBqC$C$C$C$C$BqAs____________________ ______________________BqBqBqBqC$C$C$C$BqBPBP____________________ ____________________BqBqBqBqBqC$C$BqBqBqBPAs_A_A________________ __________________BqBqBPBPBPBqC$BqBPBPBPBPAs_A_A________________ ________________BqBqBPBPBqAsBqBqBPAsBPBPAsBP_A_A________________ ______________BqBPBPBPAsAsBqBPBqBqAsBPBqAsBP_A_A________________ ______________BqBPBPAsBPBPBqBqBPAsCDBPBPBPAs_A_A________________ ____________BqBPAsBPAsBPBqBPAsBPBPBPBqBqBP_A_A__________________ __________BPBPBqAsBPAsBqBPAsBPAsBPBPBPBPBq_A_A__________________ __________BPBPBqBPAsBqBPAsBPBPBPBPBqBqBq_A_A____________________ __________BqBPBPBqBqBPAsBPBPAsBqBPBqBq_A_A______________________ __________BPBPAsBqBqAsBPBPBPBqBqBq_A_A_A________________________ __________BPBPBqBPAsCDBqBPBqBqBq_A_A_A__________________________ __________BPBqBPAsBPAsBPCDBq_A_A_A_A____________________________ ___________zAsBPBPBPBqBPBq_A_A_A________________________________ ___________A_B_A_A_A_A_A_A_A____________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 511 (violet / fluorite) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________BqBqC$C$C$C$C$BqAs____________________ ______________________BqBqBqBqC$C$C$C$BqBPBP____________________ ____________________BqBqBqBqBqC$C$BqBqBqBPAs_A_A________________ __________________BqBqBPBPBPBqC$BqBPBPBPBPAs_A_A________________ ________________BqBqBPBPBqAsBqBqBPAsBPBPAsBP_A_A________________ ______________BqBPBPBPAsAsBqBPBqBqAsBPBqAsBP_A_A________________ ______________BqBPBPAsBPBPBqBqBPAsCDBPBPBPAs_A_A________________ ____________BqBPAsBPAsBPBqBPAsBPBPBPBqBqBP_A_A__________________ __________BPBPBqAsBPAsBqBPAsBPAsBPBPBPBPBq_A_A__________________ __________BPBPBqBPAsBqBPAsBPBPBPBPBqBqBq_A_A____________________ __________BqBPBPBqBqBPAsBPBPAsBqBPBqBq_A_A______________________ __________BPBPAsBqBqAsBPBPBPBqBqBq_A_A_A________________________ __________BPBPBqBPAsCDBqBPBqBqBq_A_A_A__________________________ __________BPBqBPAsBPAsBPCDBq_A_A_A_A____________________________ ___________zAsBPBPBPBqBPBq_A_A_A________________________________ ___________A_B_A_A_A_A_A_A_A____________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 512 (black / obsidian) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________B1B1C$C$C$C$C$AO_A____________________ ______________________B1A2A2B1C$C$C$C$B1AO_A____________________ ____________________B1A2AOA2B1C$C$B1B1AOAO_A_A_A________________ __________________B1A2AOAO_AB1C$B1_AAOAO_A_A_A_A________________ ________________A2AOAO_AAO_AA2B1_A_A_AAO_A_A_A_A________________ ______________A2AOAO_A_A_AAOAOA2B1_AAOAO_A_A_A_A________________ ______________A2_AAO_A_AAOA2A2_A_AA2AOAO_A_A_A_A________________ ____________A2_A_A_A_A_AA2_A_AAO_AAOA2A2_A_A_A__________________ __________AO_AA2_A_A_AA2_A_A_A_A_AAOAO_AA2_A_A__________________ __________AOAOA2_A_AA2_A_A_AAOAOAOAOA2A2_A_A____________________ __________AOAO_AA2A2_A_A_AAO_AAOAOA2A2_A_A______________________ __________AO_A_AA2B1_AAO_AAOAOA2A2_A_A_A________________________ __________AOAOA2_A_AA2A2AOA2A2A2_A_A_A__________________________ __________AOA2_A_A_A_AAOA2A2_A_A_A_A____________________________ ___________A_A_AAOAOAOAOA2_A_A_A________________________________ ___________A_A_A_A_A_A_A_A_A____________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 513 (orange / agate) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________CyCyC$C$C$C$C$CIBs____________________ ______________________CyCcCcCyC$C$C$C$CyCIBs____________________ ____________________CyCcCICcCyC$C$CyCyCICIBs_A_A________________ __________________CyCcCICIBsCyC$CyBsCICIBsBs_A_A________________ ________________CcCICIBsCIBsCcCyBsBsBsCIBsBs_A_A________________ ______________CcCICIBsBsBsCICICcCyBsCICIBsBs_A_A________________ ______________CcBsCIBsBsCICcCcBsBsCcCICIBsBs_A_A________________ ____________CcBsBsBsBsBsCcBsBsCIBsCICcCcBs_A_A__________________ __________CIBsCcBsBsBsCcBsBsBsBsBsCICIBsCc_A_A__________________ __________CICICcBsBsCcBsBsBsCICICICICcCc_A_A____________________ __________CICIBsCcCcBsBsBsCIBsCICICcCc_A_A______________________ __________CIBsBsCcCyBsCIBsCICICcCc_A_A_A________________________ __________CICICcBsBsCcCcCICcCcCc_A_A_A__________________________ __________CICcBsBsBsBsCICcCc_A_A_A_A____________________________ ___________ABsBsCICICICICc_A_A_A________________________________ ___________A_A_A_A_A_A_A_A_A____________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 519 (orange / worthless piece of orange glass) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________CyCyC$C$C$C$C$CIBs____________________ ______________________CyCcCcCyC$C$C$C$CyCIBs____________________ ____________________CyCcCICcCyC$C$CyCyCICIBs_A_A________________ __________________CyCcCICIBsCyC$CyBsCICIBsBs_A_A________________ ________________CcCICIBsCIBsCcCyBsBsBsCIBsBs_A_A________________ ______________CcCICIBsBsBsCICICcCyBsCICIBsBs_A_A________________ ______________CcBsCIBsBsCICcCcBsBsCcCICIBsBs_A_A________________ ____________CcBsBsBsBsBsCcBsBsCIBsCICcCcBs_A_A__________________ __________CIBsCcBsBsBsCcBsBsBsBsBsCICIBsCc_A_A__________________ __________CICICcBsBsCcBsBsBsCICICICICcCc_A_A____________________ __________CICIBsCcCcBsBsBsCIBsCICICcCc_A_A______________________ __________CIBsBsCcCyBsCIBsCICICcCc_A_A_A________________________ __________CICICcBsBsCcCcCICcCcCc_A_A_A__________________________ __________CICcBsBsBsBsCICcCc_A_A_A_A____________________________ ___________ABsBsCICICICICc_A_A_A________________________________ ___________A_A_A_A_A_A_A_A_A____________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 520 (yellow / worthless piece of yellow glass) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________C7C7C$C$C$C$C$ByBa____________________ ______________________C7CMCMC7C$C$C$C$C7ByBa____________________ ____________________C7CMByCMC7C$C$C7C7ByByBa_A_A________________ __________________C7CMByByBaC7C$C7BaByByBaBa_A_A________________ ________________CMByByBaByBaCMC7BaBaBaByBaBa_A_A________________ ______________CMByByBaBaBaByByCMC7BaByByBaBa_A_A________________ ______________CMBaByBaBaByCMCMBaBaCMByByBaBa_A_A________________ ____________CMBaBaBaBaBaCMBaBaByBaByCMCMBa_A_A__________________ __________ByBaCMBaBaBaCMBaBaBaBaBaByByBaCM_A_A__________________ __________ByByCMBaBaCMBaBaBaByByByByCMCM_A_A____________________ __________ByByBaCMCMBaBaBaByBaByByCMCM_A_A______________________ __________ByBaBaCMC7BaByBaByByCMCM_A_A_A________________________ __________ByByCMBaBaCMCMByCMCMCM_A_A_A__________________________ __________ByCMBaBaBaBaByCMCM_A_A_A_A____________________________ ___________ABaBaByByByByCM_A_A_A________________________________ ___________A_A_A_A_A_A_A_A_A____________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 521 (black / worthless piece of black glass) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________B1B1C$C$C$C$C$AO_A____________________ ______________________B1A2A2B1C$C$C$C$B1AO_A____________________ ____________________B1A2AOA2B1C$C$B1B1AOAO_A_A_A________________ __________________B1A2AOAO_AB1C$B1_AAOAO_A_A_A_A________________ ________________A2AOAO_AAO_AA2B1_A_A_AAO_A_A_A_A________________ ______________A2AOAO_A_A_AAOAOA2B1_AAOAO_A_A_A_A________________ ______________A2_AAO_A_AAOA2A2_A_AA2AOAO_A_A_A_A________________ ____________A2_A_A_A_A_AA2_A_AAO_AAOA2A2_A_A_A__________________ __________AO_AA2_A_A_AA2_A_A_A_A_AAOAO_AA2_A_A__________________ __________AOAOA2_A_AA2_A_A_AAOAOAOAOA2A2_A_A____________________ __________AOAO_AA2A2_A_A_AAO_AAOAOA2A2_A_A______________________ __________AO_A_AA2B1_AAO_AAOAOA2A2_A_A_A________________________ __________AOAOA2_A_AA2A2AOA2A2A2_A_A_A__________________________ __________AOA2_A_A_A_AAOA2A2_A_A_A_A____________________________ ___________A_A_AAOAOAOAOA2_A_A_A________________________________ ___________A_A_A_A_A_A_A_A_A____________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 523 (violet / worthless piece of violet glass) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________BqBqC$C$C$C$C$BqAs____________________ ______________________BqBqBqBqC$C$C$C$BqBPBP____________________ ____________________BqBqBqBqBqC$C$BqBqBqBPAs_A_A________________ __________________BqBqBPBPBPBqC$BqBPBPBPBPAs_A_A________________ ________________BqBqBPBPBqAsBqBqBPAsBPBPAsBP_A_A________________ ______________BqBPBPBPAsAsBqBPBqBqAsBPBqAsBP_A_A________________ ______________BqBPBPAsBPBPBqBqBPAsCDBPBPBPAs_A_A________________ ____________BqBPAsBPAsBPBqBPAsBPBPBPBqBqBP_A_A__________________ __________BPBPBqAsBPAsBqBPAsBPAsBPBPBPBPBq_A_A__________________ __________BPBPBqBPAsBqBPAsBPBPBPBPBqBqBq_A_A____________________ __________BqBPBPBqBqBPAsBPBPAsBqBPBqBq_A_A______________________ __________BPBPAsBqBqAsBPBPBPBqBqBq_A_A_A________________________ __________BPBPBqBPAsCDBqBPBqBqBq_A_A_A__________________________ __________BPBqBPAsBPAsBPCDBq_A_A_A_A____________________________ ___________zAsBPBPBPBqBPBq_A_A_A________________________________ ___________A_B_A_A_A_A_A_A_A____________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 524 (gray / luckstone) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________BdBkBkBkBDBkBdBd________________________ __________________BDBdBkBDBdBJBkBlBkBDBdBJBDAl__________________ ________________BdBdBDBkBmBlBkBkBcBkBkBkBdBDBDAe________________ ______________BdBJBkBkBkBXBkBdBkBkBkBJBdBDBDBDBDAl______________ ____________BDBdBdBkBkBDBkBkBkBkAjBkBdBdBDBDAeAlBDAe____________ ____________BDBdBdAjBkBdBkBDBkBkBdBJBdBDAeBDBDAlBDAe____________ ____________AlBDBJBdBdBdBdBdBdBJBdBdBDBDBDAlAeAlAeAe____________ ____________BDAlBDBdBdBJBdBdBdBdBDBDBDAjAeBDBJAeAeAe_A_A________ ______________AlBDBDBDBDAjBDAeBDBDAlAeBJAlAeAeAeAe_A_A_A_A______ ________________BJAlAeBJAlBDAlBDAlBDAlAeAeAeAeAe_A_A_A_A_A______ __________________AeAeAeAlAeBDAlAeAeAeAeAeAeAe_A_A_A_A_A________ _________________B_A_A_BAeAeAeAeAeAeAeAe_A_A_A_A_A_A_A__________ ___________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A______________ _______________________A_A_A_A_A_A_A_A_A_A_A____________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 525 (gray / healthstone) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________BdBkBkBkBDBkBdBd________________________ __________________BDBdBkBDBdBJBkBlBkBDBdBJBDAl__________________ ________________BdBdBDBkBmBlBkBkBcBkBkBkBdBDBDAe________________ ______________BdBJBkBkBkBXBkBdBkBkBkBJBdBDBDBDBDAl______________ ____________BDBdBdBkBkBDBkBkBkBkAjBkBdBdBDBDAeAlBDAe____________ ____________BDBdBdAjBkBdBkBDBkBkBdBJBdBDAeBDBDAlBDAe____________ ____________AlBDBJBdBdBdBdBdBdBJBdBdBDBDBDAlAeAlAeAe____________ ____________BDAlBDBdBdBJBdBdBdBdBDBDBDAjAeBDBJAeAeAe_A_A________ ______________AlBDBDBDBDAjBDAeBDBDAlAeBJAlAeAeAeAe_A_A_A_A______ ________________BJAlAeBJAlBDAlBDAlBDAlAeAeAeAeAe_A_A_A_A_A______ __________________AeAeAeAlAeBDAlAeAeAeAeAeAeAe_A_A_A_A_A________ _________________B_A_A_BAeAeAeAeAeAeAeAe_A_A_A_A_A_A_A__________ ___________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A______________ _______________________A_A_A_A_A_A_A_A_A_A_A____________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 526 (gray / loadstone) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________BdBkBkBkBDBkBdBd________________________ __________________BDBdBkBDBdBJBkBlBkBDBdBJBDAl__________________ ________________BdBdBDBkBmBlBkBkBcBkBkBkBdBDBDAe________________ ______________BdBJBkBkBkBXBkBdBkBkBkBJBdBDBDBDBDAl______________ ____________BDBdBdBkBkBDBkBkBkBkAjBkBdBdBDBDAeAlBDAe____________ ____________BDBdBdAjBkBdBkBDBkBkBdBJBdBDAeBDBDAlBDAe____________ ____________AlBDBJBdBdBdBdBdBdBJBdBdBDBDBDAlAeAlAeAe____________ ____________BDAlBDBdBdBJBdBdBdBdBDBDBDAjAeBDBJAeAeAe_A_A________ ______________AlBDBDBDBDAjBDAeBDBDAlAeBJAlAeAeAeAe_A_A_A_A______ ________________BJAlAeBJAlBDAlBDAlBDAlAeAeAeAeAe_A_A_A_A_A______ __________________AeAeAeAlAeBDAlAeAeAeAeAeAeAe_A_A_A_A_A________ _________________B_A_A_BAeAeAeAeAeAeAeAe_A_A_A_A_A_A_A__________ ___________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A______________ _______________________A_A_A_A_A_A_A_A_A_A_A____________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 527 (gray / touchstone) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________BdBkBkBkBDBkBdBd________________________ __________________BDBdBkBDBdBJBkBlBkBDBdBJBDAl__________________ ________________BdBdBDBkBmBlBkBkBcBkBkBkBdBDBDAe________________ ______________BdBJBkBkBkBXBkBdBkBkBkBJBdBDBDBDBDAl______________ ____________BDBdBdBkBkBDBkBkBkBkAjBkBdBdBDBDAeAlBDAe____________ ____________BDBdBdAjBkBdBkBDBkBkBdBJBdBDAeBDBDAlBDAe____________ ____________AlBDBJBdBdBdBdBdBdBJBdBdBDBDBDAlAeAlAeAe____________ ____________BDAlBDBdBdBJBdBdBdBdBDBDBDAjAeBDBJAeAeAe_A_A________ ______________AlBDBDBDBDAjBDAeBDBDAlAeBJAlAeAeAeAe_A_A_A_A______ ________________BJAlAeBJAlBDAlBDAlBDAlAeAeAeAeAe_A_A_A_A_A______ __________________AeAeAeAlAeBDAlAeAeAeAeAeAeAe_A_A_A_A_A________ _________________B_A_A_BAeAeAeAeAeAeAeAe_A_A_A_A_A_A_A__________ ___________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A______________ _______________________A_A_A_A_A_A_A_A_A_A_A____________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 528 (gray / whetstone) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________BdBkBkBkBDBkBdBd________________________ __________________BDBdBkBDBdBJBkBlBkBDBdBJBDAl__________________ ________________BdBdBDBkBmBlBkBkBcBkBkBkBdBDBDAe________________ ______________BdBJBkBkBkBXBkBdBkBkBkBJBdBDBDBDBDAl______________ ____________BDBdBdBkBkBDBkBkBkBkAjBkBdBdBDBDAeAlBDAe____________ ____________BDBdBdAjBkBdBkBDBkBkBdBJBdBDAeBDBDAlBDAe____________ ____________AlBDBJBdBdBdBdBdBdBJBdBdBDBDBDAlAeAlAeAe____________ ____________BDAlBDBdBdBJBdBdBdBdBDBDBDAjAeBDBJAeAeAe_A_A________ ______________AlBDBDBDBDAjBDAeBDBDAlAeBJAlAeAeAeAe_A_A_A_A______ ________________BJAlAeBJAlBDAlBDAlBDAlAeAeAeAeAe_A_A_A_A_A______ __________________AeAeAeAlAeBDAlAeAeAeAeAeAeAe_A_A_A_A_A________ _________________B_A_A_BAeAeAeAeAeAeAeAe_A_A_A_A_A_A_A__________ ___________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A______________ _______________________A_A_A_A_A_A_A_A_A_A_A____________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 529 (gray / flint) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________BdBkBkBkBDBkBdBd________________________ __________________BDBdBkBDBdBJBkBlBkBDBdBJBDAl__________________ ________________BdBdBDBkBmBlBkBkBcBkBkBkBdBDBDAe________________ ______________BdBJBkBkBkBXBkBdBkBkBkBJBdBDBDBDBDAl______________ ____________BDBdBdBkBkBDBkBkBkBkAjBkBdBdBDBDAeAlBDAe____________ ____________BDBdBdAjBkBdBkBDBkBkBdBJBdBDAeBDBDAlBDAe____________ ____________AlBDBJBdBdBdBdBdBdBJBdBdBDBDBDAlAeAlAeAe____________ ____________BDAlBDBdBdBJBdBdBdBdBDBDBDAjAeBDBJAeAeAe_A_A________ ______________AlBDBDBDBDAjBDAeBDBDAlAeBJAlAeAeAeAe_A_A_A_A______ ________________BJAlAeBJAlBDAlBDAlBDAlAeAeAeAeAe_A_A_A_A_A______ __________________AeAeAeAlAeBDAlAeAeAeAeAeAeAe_A_A_A_A_A________ _________________B_A_A_BAeAeAeAeAeAeAeAe_A_A_A_A_A_A_A__________ ___________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A______________ _______________________A_A_A_A_A_A_A_A_A_A_A____________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/share/oth3dmi.txt�������������������������������������������������������������0000664�0000764�0000764�00001371415�10545462317�015677� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������__ = (0, 0, 0) _A = (242, 96, 0) _B = (96, 48, 48) _C = (128, 64, 0) _D = (32, 64, 64) _E = (192, 96, 96) _F = (117, 105, 88) _G = (128, 32, 0) _H = (128, 0, 0) _I = (48, 48, 0) _J = (0, 32, 32) _K = (128, 112, 32) _L = (48, 0, 0) _M = (0, 0, 32) _N = (224, 224, 0) _O = (144, 135, 110) _P = (96, 72, 0) _Q = (224, 168, 0) _R = (96, 48, 0) _S = (248, 224, 96) _T = (144, 192, 192) _U = (128, 128, 64) _V = (96, 16, 0) _W = (224, 112, 0) _X = (72, 108, 108) _Y = (240, 240, 240) _Z = (96, 0, 0) _a = (144, 144, 192) _b = (0, 24, 24) _c = (224, 224, 224) _d = (224, 56, 0) _e = (16, 0, 0) _f = (208, 208, 208) _g = (144, 72, 0) _h = (255, 128, 0) _i = (255, 108, 0) _j = (192, 192, 192) _k = (128, 128, 96) _l = (255, 64, 0) _m = (178, 64, 0) _n = (128, 96, 96) _o = (192, 144, 192) _p = (48, 24, 24) _q = (64, 32, 0) _r = (64, 16, 0) _s = (144, 192, 144) _t = (64, 0, 0) _u = (255, 0, 0) _v = (0, 16, 16) _w = (120, 160, 160) _x = (0, 0, 16) _y = (160, 120, 160) _z = (144, 144, 144) _0 = (0, 64, 128) _1 = (192, 48, 0) _2 = (120, 160, 120) _3 = (120, 120, 160) _4 = (160, 120, 120) _5 = (128, 128, 128) _6 = (192, 0, 0) _7 = (71, 108, 108) _8 = (112, 112, 112) _9 = (64, 32, 32) _$ = (192, 192, 144) A_ = (160, 80, 80) AA = (252, 252, 153) AB = (32, 32, 0) AC = (160, 120, 0) AD = (0, 80, 160) AE = (192, 144, 144) AF = (80, 80, 80) AG = (32, 0, 0) AH = (255, 255, 255) AI = (242, 196, 77) AJ = (160, 80, 0) AK = (0, 192, 192) AL = (64, 64, 64) AM = (192, 160, 64) AN = (160, 40, 0) AO = (64, 32, 64) AP = (48, 48, 48) AQ = (160, 0, 0) AR = (224, 168, 168) AS = (0, 96, 192) AT = (32, 32, 32) AU = (32, 0, 32) AV = (0, 24, 0) AW = (0, 16, 0) AX = (71, 108, 108) # tile 0 (wall) { _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAL_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_jAL_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_TAL_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAT_jAEAL_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_zAL_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5AL_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5AL_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_5AL_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_FAL_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_5_5AL_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_z_5AL_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_5_5_5AL_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_5_5_FAL_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_5_X_5_5AL_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_5_5_5_5AL_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_z_5_5_5_5_5_z_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_z_5_5_z_5AF_a_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAT_jAF_z_5_5_F_5_5AF_$_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_jAL_a_O_5_5_5AF_z_5_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_zAF_s_5_5_5_5AF_a_5_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_zAF_o_5_5_5AF_z_z_5_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5AF_z_5_5_5AF_z_5_5_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_zAF_s_5_5AFAE_z_5_5_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_5AF_o_5_5AF_z_T_5_F_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_5AF_z_5AF_z_F_z_5_5_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_5_5AF_s_5AF_TAF_z_z_5_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_F_5AF_yAFAE_5AF_o_5_5_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_5_5_5AF_TAF_s_5AF_z_X_5_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_5_X_5AFAFAE_3_5AF_s_4_5_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_5_5_5_5AFAF_z_5_5AF_a_5_5_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_5_5_5_5AF_z_z_5_5AFAE_5_5_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAP_z_5_5_5_5_5_5AF_z_5_5_5AF_s_5_5_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_j_j_z_j_j_TAE_j_j_TAE_j_T_jAE_j_z_z_5_z_z_5AFAE_z_5_5_5AF_z_8AF_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_5_z_z_z_z_z_z_z_5_z_z_z_z_z_z_z_z_5_5_8_5_5AF_w_5_5_F_5AF_a_5_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_j_z_z_T_5_5_5_5AF_z_z_5_5_5_5AFAE_X_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_5_j_z_z_z_z_z_z_z_5_z_zAE_5_5_5_5AFAE_5_5_5_5_5AF_s_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_8_z_z_z_z_z_z_8_z_z_z_8_z_z_z_5_5_5AF_z_z_X_z_5_5_5AF_8_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_j_z_z_z_z_T_5_z_5AF_z_5_5_5_5_5_5AF_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_5_5AF_TAE_5_5_5_5_5_5AF_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_8_z_z_z_z_z_z_z_z_z_zAE_5_5AFAE_z_5_z_5_F_5_5_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_j_z_z_z_z_z_z_z_8_z_z_z_8_z_z_T_5AF_z_X_z_z_5_5_5_5AF_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_5AF_jAF_z_5_5_5_5_5_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_zAEAF_z_5AF_T_5_5_5_5_X_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_8_z_z_z_z_z_z_z_z_z_z_z_TAF_z_5AFAE_5_5_F_5_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_j_5_z_z_z_z_z_j_z_z_z_j_z_z_z_zAE_z_5AF_z_5_5_5AF_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_zAF_w_5_5AF_a_5_5_5_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_8_z_zAF_z_5_5AF_s_5_5_8_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF_z_5_F_5AFAE_5_5_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_j_j_z_j_j_TAE_j_TAE_j_TAE_j_j_z_j_8_5_5AF_a_5_F_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_j_z_zAE_T_zAE_T_zAE_T_z_z_z_5_5_5_5AF_z_5_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_8_z_z_z_z_z_z_z_z_z_5_5_z_5AF_s_8_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_8_z_z_z_5_5_5_5AF_y_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_5_5_5_5AF_s_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_j_z_z_z_z_z_z_z_z_z_z_z_z_5_8_5_5AF_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_j_z_z_z_z_z_z_z_5_5_5_5_8_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_8_z_z_z_z_8_z_z_z_5_z_5_5_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_8_z_z_z_z_z_z_z_z_z_z_z_z_z_5_5_5AF_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_5_5_5_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_j_z_z_z_z_z_z_5_5_F_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_5_z_z_z_z_z_z_5_5_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_j_z_z_8_z_z_z_z_z_z_z_z_8_z_5_X_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_z_j_z_5_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_5_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_F_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 } # tile 0 (wall) { _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_7_7_7_7_7 _7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_7_7_7_7_7 _7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_7_7_7_7_7 _7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_7_7_7_7_7 _7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_5_7_7_7_7_7 _7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_5_7_7_7_7_7 _7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_5_5_7_7_7_7_7 _7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_5_5_7_7_7_7_7 _7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_5_5_5_7_7_7_7_7 _7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_5_5_5_7_7_7_7_7 _7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_5_5_5_5_7_7_7_7_7 _7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_5_5_5_5_7_7_7_7_7 _7_7_7_F_T_jAE_j_T_jAE_T_j_jAE_T_j_j_z_j_j_j_z_j_j_TAE_j_j_TAE_j_T_jAE_z_5_5_5_5_5_5_5_7_7_7_7_7 _7_7_7AF_o_z_T_zAE_z_TAE_z_z_TAE_z_z_z_8_z_z_j_z_zAE_T_z_zAE_T_zAE_z_T_z_5_5_5_5_5_5_F_7_7_7_7_7 _7_7_7_8_$_zAE_5_T_zAE_w_j_z_z_TAE_TAE_X_j_z_z_z_j_z_zAE_T_z_zAE_T_zAE_z_5_5_5_5_5_5_X_7_7_7_7_7 _7_7_7AF_j_z_T_wAE_z_j_z_zAE_z_z_z_j_zAF_jAE_TAE_z_TAE_T_zAE_T_5AE_T_z_z_5_5_5_5_5AF_j_7_7_7_7_7 _7_7_7_8_TAE_zAE_T_z_j_z_j_z_TAE_z_z_jAF_j_z_5_T_zAE_w_j_z_TAE_z_TAE_z_z_5_5_5_5_5_F_5_7_7_7_7_7 _7_7_7AF_j_z_j_wAE_TAE_z_T_z_z_j_z_j_zAF_j_TAE_zAE_T_zAE_TAE_z_z_j_z_T_z_5_5_5_5_F_T_5_7_7_7_7_7 _7_7_7_F_j_z_zAE_T_z_z_j_zAE_T_z_j_z_z_8_j_z_z_TAE_z_j_z_z_TAE_T_zAE_z_z_5_5_5_5AF_5_5_7_7_7_7_7 _7_7_7AF_$_a_z_z_z_j_z_z_j_TAE_z_z_j_zAF_j_zAE_T_z_j_z_TAE_5_zAE_T_z_j_z_5_5_5AF_j_5_5_7_7_7_7_7 _7_7_7_8_a_$_z_j_z_z_j_z_zAE_w_j_z_z_jAF_j_z_TAE_z_TAE_z_T_z_j_z_zAE_w_z_5_5_5_8_5_5_5_7_7_7_7_7 _7_7_7AF_j_a_z_z_j_z_5_z_z_TAE_z_$_a_z_F_TAE_z_TAE_z_z_j_zAE_z_TAE_TAE_z_5_5AF_o_5_5_5_7_7_7_7_7 _7_7_7_F_j_z_$_a_$_aAE_z_j_z_z_T_zAE_TAF_j_z_j_z_5_TAE_z_T_z_j_z_z_a_s_z_5_5_8_5_5_5_5_7_7_7_7_7 _7_7_7AF_j_z_z_j_z_z_s_a_z_s_o_z_j_z_z_F_j_z_z_j_zAE_z_TAE_z_5_z_j_sAE_z_5AF_j_5_5_5_5_7_7_7_7_7 _7_7_7_8_TAE_a_z_$_a_$_z_j_z_j_z_z_j_z_8_a_$_z_z_T_z_jAE_TAE_TAE_z_o_w_z_5_8_8_5_5_5_5_7_7_7_7_7 _7_7_7AF_o_s_z_$_a_zAE_a_zAE_z_z_j_z_zAF_j_z_a_$_y_$_z_a_z_s_y_s_a_sAE_zAF_j_5_5_5_5_5_7_7_7_7_7 _7_7_7_F_j_z_o_s_z_j_z_s_o_s_a_$_z_o_s_8_j_z_$_a_z_TAE_s_o_z_j_zAE_a_s_z_8_5_5_5_5_5_5_7_7_7_7_7 _7_7_7AF_8AF_8AF_8AF_8_F_X_F_F_X_8AF_8AF_FAF_8AF_8_FAF_8AF_8AF_F_X_F_8AF_j_5_5_5_5_5_5_7_7_7_7_7 _7_7_7_j_T_j_$_a_j_j_a_F_o_T_o_$_a_j_j_a_j_j_a_j_$_a_jAF_j_j_T_o_j_z_j_o_5_8_5_5_5_5_5_7_7_7_7_7 _7_7_7_z_z_z_a_$_z_z_zAF_j_s_z_a_$_z_zAE_z_z_$_z_a_$_zAF_j_zAE_z_z_s_z_z_5_5_5_5_5_5_5_7_7_7_7_7 _7_7_7AE_TAE_z_a_$_a_$_XAE_z_j_z_z_TAE_T_z_j_z_z_s_aAE_X_j_z_TAE_TAE_a_z_5_5_5_5_5_5_5_7_7_7_7_7 _7_7_7_wAE_T_j_z_5_$_zAF_j_j_z_z_j_z_5AE_z_z_j_z_o_s_z_F_TAE_z_$_aAE_s_z_5_5_5_5_5_5_7_7_7_7_7_7 _7_7_7AE_T_z_zAE_a_z_T_n_T_zAE_j_z_z_T_z_TAE_z_j_z_o_z_8_j_z_T_z_s_a_5_z_5_5_5_5_5_5_7_7_7_7_7_7 _7_7_7_wAE_z_j_z_s_aAEAF_j_z_T_z_$_a_$_zAE_T_z_s_a_sAEAF_TAE_z_j_y_$_z_z_5_5_5_5_5_7_7_7_7_7_7_7 _7_7_7AE_T_5_z_j_j_z_s_n_o_zAE_a_z_s_o_T_zAE_a_OAE_a_s_8_o_s_a_z_s_o_z_z_5_5_5_5_5_7_7_7_7_7_7_7 _7_7_7_a_z_$_z_z_z_o_z_8_s_j_w_$_z_o_sAE_z_TAE_s_a_$_zAF_j_zAE_j_z_z_j_z_5_5_5_5_7_7_7_7_7_7_7_7 _7_7_7_s_o_z_TAE_s_z_TAF_o_zAE_T_z_s_y_TAE_5_5_aAE_w_o_F_TAE_T_z_j_z_j_z_5_5_5_5_7_7_7_7_7_7_7_7 _7_7_7_a_z_$_o_T_z_o_z_F_j_s_a_z_z_aAE_z_j_z_$_z_TAE_sAF_j_wAE_s_y_s_z_z_5_5_5_7_7_7_7_7_7_7_7_7 _7_7_7_$_z_T_zAE_s_z_jAF_j_zAE_s_5AE_T_z_T_z_aAE_z_T_y_8_j_z_aAE_TAE_a_z_5_5_5_7_7_7_7_7_7_7_7_7 _7_7_7_aAE_z_j_z_j_o_zAF_j_z_TAE_a_z_$_aAE_sAE_s_a_$_zAF_j_z_$_z_5AE_s_z_5_5_7_7_7_7_7_7_7_7_7_7 _7_7_7_s_a_s_5_z_z_s_o_F_TAE_z_T_$_a_z_s_o_5_a_z_$_a_z_8_j_z_a_s_a_j_z_z_5_5_7_7_7_7_7_7_7_7_7_7 _7_7_7_zAE_z_o_z_j_z_z_XAE_T_zAE_aAE_s_o_z_z_$_z_j_j_z_F_a_$_z_o_sAE_z_z_5_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_TAE_T_z_$_aAE_T_F_j_z_$_a_s_z_a_sAE_T_z_a_z_z_$_X_j_z_a_$_z_a_$_z_5_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AF_8AF_8AF_F_X_FAF_8AF_8AF_F_8_FAF_8AF_8_F_F_8AF_FAF_F_8AF_F_X_F_X_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 } # tile 0 (wall) { _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_5_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_5_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_j_z_j_j_TAE_j_z_5_5_5_5_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_z_j_z_zAE_T_z_z_5_5_5_5_5_5_F_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_z_z_TAE_wAE_z_z_5_5_5_5_5_5_X_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_TAE_z_5_j_z_T_z_5_5_5_5_5AF_j_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5AE_T_zAE_wAE_z_z_5_5_5_5_5_F_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_z_zAE_T_z_j_z_j_z_5_5_5_5_F_T_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_5_z_TAE_z_T_z_z_z_5_5_5_5AF_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAP_z_5_5_5AE_5_s_aAE_s_o_z_5_5_5AF_j_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_j_j_z_j_j_TAE_j_j_TAE_j_T_jAE_TAE_5_5_T_z_aAE_s_o_z_s_z_5_5_5_8_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_5_z_z_z_z_z_z_z_5_z_z_z_z_z_z_z_T_5_5_n_TAE_s_y_s_aAE_z_5_5AF_o_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_j_5_z_z_5_5_5_z_a_$_aAE_s_a_z_5_5_8_5_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_5_j_z_z_z_z_z_z_z_z_z_zAE_5_5_5_$_z_5AE_TAE_z_z_5_F_T_5_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_8_z_z_z_z_z_z_8_z_z_z_8_z_z_T_5_5_5_a_s_a_s_o_s_a_z_5AF_5_5_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_j_z_z_z_z_z_5_z_5_z_o_zAE_z_z_$_z_F_j_5_5_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_5_z_z_z_zAE_5_5AF_sAE_T_z_TAE_a_zAF_5_5_5_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_8_z_z_z_z_z_z_z_z_z_z_T_5_5AFAF_8AF_F_F_X_FAF_j_5_5_5_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_j_z_z_z_z_z_z_z_8_z_z_z_8_z_z_z_5AF_z_j_j_j_a_j_j_z_j_5_5_5_5_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_zAE_5AF_z_j_z_z_$_z_z_z_z_5_5_5_5_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_TAFAE_z_TAE_a_z_j_z_j_z_5_5_5_5_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_8_z_z_z_z_z_z_z_z_z_z_z_zAF_z_5_j_z_T_$_a_z_z_z_5_5_5_5_5_5_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_j_5_z_z_z_z_z_j_z_z_z_j_z_z_zAE_T_5_5_j_zAE_z_j_z_z_z_5_5_5_5_5_5_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_zAF_z_5_5_s_o_s_a_z_$_z_z_5_5_5_5_5_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_8_z_zAF_5_5_5_j_z_z_$_a_z_T_z_5_5_5_5_5_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF_z_5_F_5_o_$_a_j_z_$_o_z_5_5_5_5_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_j_j_z_j_j_TAE_j_TAE_j_TAE_j_TAE_T_5_5_5_T_z_zAE_T_z_j_z_5_5_5_5_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_j_z_zAE_T_zAE_T_zAE_T_zAE_z_5_5_5_5AE_j_z_TAE_z_z_z_5_5_5_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_8_z_z_z_z_z_z_z_z_z_5_5_z_5_T_zAE_z_TAE_T_z_5_5_5_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_8_z_z_z_5_5_5_5_jAE_T_z_z_z_z_z_5_5_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_5_5_5_5_j_z_z_j_z_jAE_z_5_5_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_j_z_z_z_z_z_z_z_z_z_z_z_z_5_8_5_5AE_TAE_z_TAE_w_z_5_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_j_z_z_z_z_z_z_z_5_5_5_5_T_z_z_j_z_z_j_z_5_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_8_z_z_z_z_8_z_z_z_5_z_5_5_F_F_8AF_F_X_FAF_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_8_z_z_z_z_z_z_z_z_z_z_z_z_z_5_5_5AF_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_5_5_5_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_j_z_z_z_z_z_z_5_5_8_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_5_z_z_z_z_z_z_5_5_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_j_z_z_8_z_z_z_z_z_z_z_z_8_z_5AF_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_z_j_z_5_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_5_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_F_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 } # tile 0 (wall) { _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_T_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAT_jAE_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_z_5_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_z_5_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAT_jAF_z_5_5_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_jAL_T_5_5_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_zAFAE_5_5_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_zAF_z_5_5_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5AF_T_5_5_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5AFAE_5_5_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_5AF_z_5_5_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_F_T_jAE_j_T_jAE_T_jAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_5AF_T_5AF_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AF_o_z_T_zAE_z_z_zAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_5_5AFAE_5AF_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_8_$_zAE_5_T_z_j_zAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_8_5AF_zAF_z_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AF_j_z_T_z_z_j_zAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_5_5_5AF_zAF_T_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_8_TAE_z_j_z_z_jAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_5_F_5AFAFAE_5_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AF_o_j_z_z_j_zAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_5_5_5_5AFAF_a_5_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_F_T_zAE_T_zAE_DAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_5_5_5_5AF_s_5_5_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_F_o_s_5AE_zAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_z_5_5_5_5_5_5AFAE_5_5_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_X_j_z_a_s_j_j_j_o_$_T_j_o_$_T_j_o_s_j_j_o_s_5_5_z_z_5AF_a_5_5_5_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AF_$_a_$_z_z_z_5_z_z_z_z_z_z_z_z_z_z_5_z_z_z_5_5_8_5_5AF_s_5_5_F_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_8_o_s_y_T_z_z_z_z_z_z_z_z_z_z_z_z_z_j_z_z_z_z_5_5_5AF_z_5_5_5_5_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AF_$_T_zAE_z_z_z_z_5_j_z_z_z_z_z_z_z_z_z_z_z_5_5_5_5AF_o_5_5_5_5_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_8_aAE_s_a_z_z_8_z_z_z_z_z_z_8_z_z_z_8_z_z_j_5_5_5AF_z_5_F_z_5_5_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AF_j_s_o_z_z_z_z_z_z_z_z_z_z_z_z_j_z_z_z_z_z_5_z_5AF_s_5_5_5_5_5_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_F_aAE_s_z_z_z_z_z_z_z_z_z_z_z_z_5_z_z_z_z_z_z_5AF_z_o_5_5_5_5_5_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AF_8AF_8_8_z_z_z_z_z_8_z_z_z_z_z_z_z_z_z_z_z_5_5AF_T_z_5_z_5AF_5_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_j_j_TAE_j_z_j_z_z_z_z_z_z_z_8_z_z_z_8_z_z_j_5AF_zAFAE_5_5_5_5_5_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_z_zAE_a_z_5_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_5AFAEAF_T_5_5_5_5_5_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_z_T_z_$_a_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_zAF_z_zAF_z_5_5_5_5_8_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_TAE_j_z_s_z_z_z_z_8_z_z_z_z_z_z_z_z_z_z_zAEAF_T_5AF_z_5_5_F_5_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_z_z_TAE_a_z_j_z_z_z_z_z_z_j_z_z_z_j_z_z_z_T_z_4_5AF_j_5_5_5AF_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_a_$_y_sAE_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_zAF_z_5_5AF_z_5_5_5_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AE_w_z_z_a_z_z_z_z_z_z_z_z_z_z_z_z_z_8_z_zAF_z_5_5AF_z_z_5_X_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_z_$_aAE_sAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF_z_5_F_5AF_z_5_5_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_T_z_z_j_z_j_$_o_T_$_j_a_$_j_a_$_j_a_$_j_z_j_5_5_5AF_T_5_F_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AE_z_j_j_z_z_a_sAE_a_z_$_a_z_$_a_z_$_z_a_z_8_5_5_5AFAE_5_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_a_s_z_z_j_z_z_z_z_z_z_8_z_z_z_z_z_z_z_z_z_z_5_z_5AF_z_8_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_zAE_TAE_z_z_z_z_z_z_z_z_z_z_z_z_z_8_z_z_z_5_5_5_5AF_z_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_TAE_z_5_T_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_5_5_5_5AF_T_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AE_z_TAE_z_z_z_z_j_z_z_z_z_z_z_z_z_z_z_z_z_5_8_5_5AF_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_T_zAE_T_z_z_z_z_z_z_z_z_z_j_z_z_z_z_z_z_z_5_5_5_5_F_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AF_F_X_F_F_z_z_z_z_z_z_z_8_z_z_z_z_8_z_z_z_5_z_5_5_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_8_z_z_z_z_z_z_z_z_z_z_z_z_z_5_5_5AF_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_5_5_5_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_j_z_z_z_z_z_z_5_5_F_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_5_z_z_z_z_z_z_5_5_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_j_z_z_8_z_z_z_z_z_z_z_z_8_z_5_X_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_5_z_z_z_z_z_z_z_z_z_z_z_j_z_5_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_5_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_F_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 } # tile 0 (wall) { _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAP_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_jAP_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_T_9_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_zAP_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_zAP_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5AP_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5AP_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_5AP_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_5_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_5_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_j_j_z_j_j_TAE_j_j_TAE_j_T_jAE_j_T_jAE_T_j_j_5_5_5_5_5_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_z_z_j_z_z_z_F_T_zAE_T_zAE_z_T_zAE_z_TAE_z_z_z_5_5_5_5_5_5_F_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_z_j_z_z_j_z_8_o_z_s_y_s_aAE_z_s_aAE_z_TAE_T_z_5_5_5_5_5_5_X_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_z_5_z_j_z_z_F_TAE_TAE_a_$_z_TAE_z_T_5AE_z_z_z_5_5_5_5_5AF_j_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_TAE_z_z_j_z_8_$_a_5_z_s_y_TAR_z_TAE_z_TAE_T_z_5_5_5_5_5_F_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_z_a_j_$_z_aAF_j_z_sAE_a_$_y_s_aAE_s_z_j_wAE_z_5_5_5_5_F_T_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_$_z_z_a_$_z_8_j_z_o_s_z_a_sAE_z_TAE_aAE_s_a_z_5_5_5_5AF_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_a_$_a_$_a_zAF_j_z_s_o_z_jAE_TAE_5_sAE_T_zAE_z_5_5_5AF_j_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_z_z_s_y_s_o_F_TAE_a_s_z_z_a_z_T_z_o_z_z_j_z_z_5_5_5_8_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_j_z_j_z_o_sAF_j_z_$_aAE_TAE_sAE_z_s_o_s_y_s_z_5_5AF_o_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_z_zAE_T_z_z_8_o_s_y_s_5_z_j_z_a_$_a_z_$_aAE_z_5_5_8_5_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_z_j_wAE_TAE_X_$_a_z_o_s_o_z_s_o_z_5_$_a_$_w_z_5_8_s_5_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_z_j_z_zAE_w_F_j_z_$_z_z_s_o_j_z_s_a_z_o_z_a_z_5AF_5_5_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_j_zAE_T_z_jAF_o_T_z_o_s_o_z_z_z_o_sAE_s_z_$_z_F_j_5_5_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_z_T_zAE_T_z_F_TAE_z_s_a_z_$_a_$_z_a_z_j_z_a_zAF_5_5_5_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_8AF_F_8AF_8AF_FAF_8_F_F_8AF_8AF_8_F_8AF_8_FAF_j_5_5_5_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_j_o_T_$_o_j_T_j_j_a_j_a_$_jAF_j_TAE_T_j_o_s_j_5_5_5_5_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_z_s_z_a_s_zAE_z_z_zAE_s_z_aAF_j_z_aAE_z_s_z_z_5_5_5_5_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_z_o_z_$_y_T_z_j_z_j_z_a_$_z_8_j_z_$_w_o_z_o_z_5_5_5_5_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_j_z_$_a_z_4_s_y_s_z_a_sAE_aAF_$_a_z_j_$_z_s_z_5_5_5_5_5_5_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_z_z_j_z_j_z_a_$_aAE_j_z_TAE_8_TAE_s_a_z_a_5_z_5_5_5_5_5_5_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_a_$_a_s_z_o_s_zAE_T_z_sAE_zAF_$_aAE_z_o_sAE_z_5_5_5_5_5_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_z_zAE_a_$_TAE_a_sAE_5_a_s_o_X_j_z_s_a_$_z_a_z_5_5_5_5_5_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_o_s_a_$_z_a_z_$_z_aAE_TAE_z_X_$_o_z_j_z_z_j_z_5_5_5_5_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_sAE_z_a_$_z_j_z_5_5_s_y_s_o_F_T_z_$_a_$_a_$_z_5_5_5_5_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_z_a_s_O_a_z_z_j_TAE_a_$_a_zAF_jAE_a_s_y_s_z_z_5_5_5_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_$_aAE_5_s_o_s_y_z_s_zAE_s_o_X_j_z_s_o_z_o_s_z_5_5_5_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_z_$_a_s_y_s_o_z_$_aAE_T_y_sAF_$_aAE_z_z_z_a_z_5_5_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_a_zAE_j_zAE_w_$_3_z_s_y_$_a_F_j_z_s_a_$_j_z_z_5_5_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_$_z_T_z_j_z_T_y_s_o_z_j_j_zAF_TAE_TAE_z_wAE_z_5_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_aAE_z_s_y_sAE_z_a_sAE_w_z_j_F_o_z_z_TAE_T_z_z_5_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_F_X_8AF_8_n_X_8_F_n_X_F_8AFAF_X_8_F_8AF_F_F_8_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 } # tile 0 (wall) { _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAL_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_jAL_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_TAL_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAT_jAEAL_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_zAL_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5AL_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5AL_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_5AL_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_FAL_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_5_5AL_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_z_5AL_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_5_5_5AL_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_5_5_FAL_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_5_X_5_5AL_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_5_5_5_5AL_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_z_5_5_5_5_5_z_7_7_7_7_7_7_7_7 _7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_z_5_5_z_5AF_a_7_7_7_7_7_7_7_7 _7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAT_jAF_z_5_5_F_5_5AF_$_7_7_7_7_7_7_7_7 _7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_jAL_a_O_5_5_5AF_z_5_7_7_7_7_7_7_7_7 _7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_zAF_s_5_5_5_5AF_a_5_7_7_7_7_7_7_7_7 _7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_zAF_o_5_5_5AF_z_z_5_7_7_7_7_7_7_7_7 _7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5AF_z_5_5_5AF_z_5_5_7_7_7_7_7_7_7_7 _7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_zAF_s_5_5AFAE_z_5_5_7_7_7_7_7_7_7_7 _7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_5AF_o_5_5AF_z_T_5_F_7_7_7_7_7_7_7_7 _7_7_7_F_T_jAE_j_T_jAE_T_j_jAE_T_j_j_z_j_j_j_z_j_j_z_j_z_j_8_5AF_z_5AF_z_F_z_5_5_7_7_7_7_7_7_7_7 _7_7_7AF_o_z_T_zAE_z_TAE_z_z_TAE_z_z_z_8_z_z_j_z_z_z_j_z_5_5_5AF_s_5AF_TAF_z_z_5_7_7_7_7_7_7_7_7 _7_7_7_8_$_zAE_5_T_zAE_w_j_z_z_TAE_TAE_X_j_z_z_j_z_j_z_z_zAF_5AF_oAF_z_4AF_T_5_5_7_7_7_7_7_7_7_7 _7_7_7AF_j_z_T_wAE_z_j_z_zAE_5AE_wAE_zAF_j_j_z_z_j_z_z_5_5_5_5AF_zAF_z_5AF_z_F_5_7_7_7_7_7_7_7_7 _7_7_7_8_TAE_zAE_T_z_j_z_j_w_T_z_j_z_T_F_o_z_5_z_z_j_z_z_5_F_5AFAF_j_5_5AFAE_5_5_7_7_7_7_7_7_7_7 _7_7_7AF_o_$_a_s_o_zAE_T_z_zAE_j_z_j_zAF_j_z_j_z_j_z_z_5_5_5_5AFAF_z_5_5AF_a_5_5_7_7_7_7_7_7_7_7 _7_7_7_F_T_z_z_o_s_z_TAE_z_j_z_z_z_z_jAF_j_z_z_s_y_s_o_5_5_5_5AF_z_z_5_5AF_s_5_5_7_7_7_7_7_7_7_7 _7_7_7_F_o_s_z_z_z_j_z_z_j_z_$_a_$_a_z_F_s_j_z_o_s_o_s_5_5_5_5AF_z_5_5_5AF_z_5_5_7_7_7_7_7_7_7_7 _7_7_7_X_j_zAE_TAE_z_TAE_a_s_a_z_$_z_jAF_j_z_a_$_z_aAE_a_5_5AF_s_z_5_5_5AF_o_F_X_7_7_7_7_7_7_7_7 _7_7_7_F_z_j_z_z_T_z_5_5_sAE_z_j_z_a_z_X_o_$_z_z_j_z_s_k_5_5AF_y_5_5_F_5AF_z_5_7_7_7_7_7_7_7_7_7 _7_7_7_X_j_z_o_s_o_$_aAE_a_s_o_z_sAE_s_n_T_z_o_s_5_z_o_5_5AF_s_z_5_5_5_5AF_s_8_7_7_7_7_7_7_7_7_7 _7_7_7AF_j_z_sAE_z_z_s_a_$_z_z_$_aAE_aAF_jAE_s_aAE_a_s_5_5AF_y_5_5_5_5_5AF_y_7_7_7_7_7_7_7_7_7_7 _7_7_7_F_j_z_o_s_a_$_y_s_y_T_j_z_z_TAE_8_T_z_o_s_z_$_z_5AF_z_z_F_z_5_5_5AF_8_7_7_7_7_7_7_7_7_7_7 _7_7_7AF_j_z_s_aAE_T_z_o_sAE_y_s_o_s_zAF_jAE_s_z_o_z_a_zAF_z_5_5_5_5_5_5AF_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_8_aAE_a_$_z_z_j_z_z_T_z_o_zAE_T_F_a_s_o_z_s_o_sAF_z_z_5_5_5_5_5_5AF_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_F_X_F_8AF_F_X_FAF_8_F_F_X_F_X_FAF_F_F_X_F_8AF_FAF_z_5_5_z_5_X_5_5_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_j_z_j_T_o_j_o_T_F_o_T_o_$_T_o_j_T_o_TAE_j_a_j_j_z_z_5_5_5_5_5_5_F_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_z_T_zAE_s_z_s_zAF_j_z_s_aAE_z_z_z_sAE_a_z_$_z_z_5_5_5_5_5_5_5_5_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AE_zAE_T_y_$_aAE_8_TAE_z_$_w_j_z_o_z_s_z_j_z_a_$_5_5_5_5_5_5_5AF_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_z_T_j_z_z_5_z_TAF_$_a_s_aAE_z_5_s_aAE_T_zAE_s_a_5_5_5_5_5_F_5_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_zAE_z_j_z_j_zAE_8_j_zAE_j_z_TAE_z_$_aAE_j_z_aAE_5_5_5_5_5_5_X_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_a_s_o_wAE_z_T_z_XAE_T_z_a_$_z_a_$_a_z_s_z_j_z_s_5_5_5_5_5_5_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_$_z_5_s_a_jAE_z_8_j_zAE_s_aAE_j_z_s_o_z_5_z_j_z_5_5_5_5_5_F_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_a_z_j_zAE_z_TAE_XAE_T_z_o_s_z_s_o_z_z_j_z_j_z_z_5_5_5_5_5_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_sAE_a_s_a_$_z_z_8_j_z_s_z_o_z_T_z_$_5_5_z_z_j_z_z_5_5_5AF_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_z_a_$_j_z_aAE_TAF_j_z_o_z_5_TAE_z_o_s_a_z_j_z_z_5_5_5_5_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AE_s_aAE_sAE_s_y_F_TAE_s_o_5_z_$_a_s_o_z_$_z_a_$_5_5_5_8_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_T_zAE_T_z_o_T_z_8AE_T_z_z_$_a_z_j_z_z_$_a_z_$_a_5_5_5_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_z_o_s_5_z_$_z_o_X_j_z_j_z_j_z_s_y_s_z_z_a_$_a_z_5_5_F_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AE_s_z_aAE_a_s_z_F_TAE_z_T_z_z_j_z_o_z_j_z_$_j_z_5_5_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_aAE_TAE_s_aAE_a_F_j_z_zAE_TAE_z_s_z_a_zAE_a_z_$_5_X_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_8AF_F_X_F_F_X_FAFAF_8_8AF_F_X_8_F_8_F_F_X_8_F_X_5_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 } # tile 0 (wall) { _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAP_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_jAP_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_T_9_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_zAP_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_zAP_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5AP_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5AP_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_5AP_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_7_7_7_7_7 _7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_7_7_7_7_7 _7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_7_7_7_7_7 _7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_7_7_7_7_7 _7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_5_7_7_7_7_7 _7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_5_7_7_7_7_7 _7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_5_5_7_7_7_7_7 _7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_5_5_7_7_7_7_7 _7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_5_5_5_7_7_7_7_7 _7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_5_5_5_7_7_7_7_7 _7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_5_5_5_5_7_7_7_7_7 _7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_5_5_5_5_7_7_7_7_7 _7_7_7_F_T_jAE_j_T_jAE_T_jAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_j_z_j_j_TAE_j_z_5_5_5_5_5_5_5_7_7_7_7_7 _7_7_7AF_o_z_T_zAE_z_z_zAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_z_j_z_zAE_T_z_z_5_5_5_5_5_5_F_7_7_7_7_7 _7_7_7_8_$_zAE_5_T_z_j_zAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_z_z_TAE_wAE_z_z_5_5_5_5_5_5_X_7_7_7_7_7 _7_7_7AF_j_z_T_z_z_j_zAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_TAE_z_5_j_z_T_z_5_5_5_5_5AF_j_7_7_7_7_7 _7_7_7_8_TAE_z_j_z_z_jAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5AE_T_zAE_wAE_z_z_5_5_5_5_5_F_5_7_7_7_7_7 _7_7_7AF_o_j_z_z_j_zAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_z_zAE_T_z_j_z_j_z_5_5_5_5_F_T_5_7_7_7_7_7 _7_7_7_F_T_zAE_T_zAE_DAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_5_z_TAE_z_T_z_z_z_5_5_5_5AF_5_5_7_7_7_7_7 _7_7_7_F_o_s_5AE_zAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_z_5_5_5AE_5_s_aAE_s_o_z_5_5_5AF_j_5_5_7_7_7_7_7 _7_7_7_X_j_z_a_s_j_j_j_o_$_T_j_o_$_T_j_o_s_j_j_a_$_5_5_a_s_aAE_s_o_z_s_z_5_5_5_8_5_5_5_7_7_7_7_7 _7_7_7AF_$_a_$_z_z_z_5_z_z_z_z_z_z_z_z_z_z_z_z_z_z_5_5_k_aAE_s_y_s_aAE_z_5_5AF_o_5_5_5_7_7_7_7_7 _7_7_7_8_o_s_y_T_z_z_z_z_z_z_z_z_z_z_z_z_z_j_5_z_z_z_5_5_z_TAE_a_$_z_T_z_5_5_8_5_5_5_5_7_7_7_7_7 _7_7_7AF_$_T_zAE_z_z_z_z_5_j_z_z_z_z_z_z_z_z_z_z_z_5_5_5_$_z_5AE_TAE_z_z_5_F_T_5_5_5_5_7_7_7_7_7 _7_7_7_8_aAE_s_a_z_z_8_z_z_z_z_z_z_8_z_z_z_8_z_z_j_5_5_5_a_z_T_z_o_s_a_z_5AF_5_5_5_5_5_7_7_7_7_7 _7_7_7AF_j_s_o_z_z_z_z_z_z_z_z_z_z_z_5_j_z_z_z_z_z_5_z_5_s_o_z_$_z_sAE_zAF_j_5_5_5_5_5_7_7_7_7_7 _7_7_7_F_aAE_s_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_5AF_z_$_a_z_o_z_T_z_F_5_5_5_5_5_5_7_7_7_7_7 _7_7_7AF_8AF_8_8_z_z_z_z_z_8_z_z_z_z_z_z_z_z_z_z_z_5_5AF_F_X_F_F_X_8_FAF_j_5_5_5_5_5_5_7_7_7_7_7 _7_7_7_j_j_TAE_j_z_j_z_z_z_z_z_z_z_8_z_z_z_8_z_z_j_5AF_z_j_o_T_o_$_a_j_j_8_5_5_5_5_5_5_7_7_7_7_7 _7_7_7_z_zAE_a_z_5_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_5AF_z_o_s_z_z_s_z_z_z_5_5_5_5_5_5_5_7_7_7_7_7 _7_7_7_z_T_z_$_a_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_zAF_a_O_j_z_o_s_o_z_j_5_5_5_5_5_5_5_5_7_7_7_7_7 _7_7_7_TAE_j_z_s_z_z_z_z_8_z_z_z_z_z_z_z_z_z_z_z_oAF_s_5_j_s_a_$_a_$_z_z_5_5_5_5_5_5_7_7_7_7_7_7 _7_7_7_z_z_TAE_a_z_j_z_z_z_z_z_z_j_z_z_z_j_z_z_z_s_z_z_5_o_zAE_s_a_z_z_z_5_5_5_5_5_5_7_7_7_7_7_7 _7_7_7_a_$_y_sAE_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_zAF_z_5_5_$_a_s_o_z_$_z_z_5_5_5_5_5_7_7_7_7_7_7_7 _7_7_7AE_w_z_z_a_z_z_z_z_z_z_z_z_z_z_z_z_z_8_z_zAF_z_5_5_j_z_z_s_o_z_a_z_5_5_5_5_5_7_7_7_7_7_7_7 _7_7_7_z_$_aAE_sAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF_z_5AF_5_o_s_o_j_z_s_j_z_5_5_5_5_7_7_7_7_7_7_7_7 _7_7_7_T_z_z_j_z_j_$_o_T_$_j_a_$_j_a_$_j_a_j_$_a_$_5_5_5_j_z_z_z_j_z_j_z_5_5_5_5_7_7_7_7_7_7_7_7 _7_7_7AE_z_j_j_z_z_a_sAE_a_z_$_a_z_$_a_z_$_z_a_z_5_5_5_5_s_j_z_j_z_z_z_z_5_5_5_7_7_7_7_7_7_7_7_7 _7_7_7_a_s_z_z_j_z_z_z_z_z_z_8_z_z_z_z_z_z_z_z_z_5_5_z_5_o_z_z_z_j_z_j_z_5_5_5_7_7_7_7_7_7_7_7_7 _7_7_7_zAE_TAE_z_z_z_z_z_z_z_z_z_z_z_z_z_8_z_z_z_5_5_5_5_T_o_s_o_5_z_z_z_5_5_7_7_7_7_7_7_7_7_7_7 _7_7_7_TAE_z_5_T_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_5_5_5_5_$_z_s_z_j_j_z_z_5_5_7_7_7_7_7_7_7_7_7_7 _7_7_7AE_z_TAE_z_z_z_z_j_z_z_z_z_z_z_z_z_z_z_z_z_5_8_5_5_o_j_z_o_z_z_z_z_5_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_T_zAE_T_z_z_z_z_z_z_z_z_z_j_z_z_z_z_z_z_z_5_5_5_5_T_z_z_s_o_s_o_z_5_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AF_F_X_F_F_z_z_z_z_z_z_z_8_z_z_z_z_8_z_z_z_5_z_5_5_F_F_8_F_X_F_X_F_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_8_z_z_z_z_z_z_z_z_z_z_z_z_z_5_5_5AF_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_5_5_5_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_j_z_z_z_z_z_z_5_5_F_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_5_z_z_z_z_z_z_5_5_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_j_z_z_8_z_z_z_z_z_z_z_z_8_z_5_X_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_5_z_z_z_z_z_z_z_z_z_z_z_j_z_5_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_5_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_F_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 } # tile 0 (wall) { _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAP_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_jAP_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_T_9_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_zAP_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_zAP_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5AP_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5AP_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_5AP_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_7_7_7_7_7 _7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_7_7_7_7_7 _7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_7_7_7_7_7 _7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_7_7_7_7_7 _7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_5_7_7_7_7_7 _7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_5_7_7_7_7_7 _7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_5_5_7_7_7_7_7 _7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_5_5_7_7_7_7_7 _7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_5_5_5_7_7_7_7_7 _7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_5_5_5_7_7_7_7_7 _7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_5_5_5_5_7_7_7_7_7 _7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_5_5_5_5_7_7_7_7_7 _7_7_7_F_T_jAE_j_T_jAE_T_j_jAE_T_j_j_z_j_j_j_z_j_j_TAE_j_j_TAE_j_T_jAE_z_5_5_5_5_5_5_5_7_7_7_7_7 _7_7_7AF_o_z_T_zAE_z_TAE_z_z_TAE_z_z_z_8_z_z_j_z_zAE_T_z_zAE_T_zAE_z_T_z_5_5_5_5_5_5_F_7_7_7_7_7 _7_7_7_8_$_zAE_5_T_zAE_w_j_z_z_TAE_TAE_X_j_z_z_z_j_z_zAE_T_z_zAE_T_zAE_z_5_5_5_5_5_5_X_7_7_7_7_7 _7_7_7AF_j_z_T_wAE_z_j_z_zAE_z_z_z_j_zAF_jAE_TAE_z_TAE_T_zAE_T_5AE_T_z_z_5_5_5_5_5AF_j_7_7_7_7_7 _7_7_7_8_TAE_zAE_T_z_j_z_j_z_TAE_z_z_jAF_j_z_5_T_zAE_w_j_z_TAE_z_TAE_z_z_5_5_5_5_5_F_5_7_7_7_7_7 _7_7_7AF_j_z_j_wAE_TAE_z_T_z_z_j_z_j_zAF_j_TAE_zAE_T_zAE_TAE_z_z_j_z_T_z_5_5_5_5_F_T_5_7_7_7_7_7 _7_7_7_F_j_z_zAE_T_z_z_j_zAE_T_z_j_z_z_8_j_z_z_TAE_z_j_z_z_TAE_T_zAE_z_z_5_5_5_5AF_5_5_7_7_7_7_7 _7_7_7AF_$_a_z_z_z_j_z_z_j_TAE_z_z_j_zAF_j_zAE_T_z_j_z_TAE_5_zAE_T_z_j_z_5_5_5AF_j_5_5_7_7_7_7_7 _7_7_7_8_a_$_z_j_z_z_j_z_zAE_w_j_z_z_jAF_j_z_TAE_z_TAE_z_T_z_j_z_zAE_w_z_5_5_5_8_5_5_5_7_7_7_7_7 _7_7_7AF_j_a_z_z_j_z_5_z_z_TAE_z_$_a_z_F_TAE_z_TAE_z_z_j_zAE_z_TAE_TAE_z_5_5AF_o_5_5_5_7_7_7_7_7 _7_7_7_F_j_z_$_a_$_aAE_z_j_z_z_T_zAE_TAF_j_z_j_z_5_TAE_z_T_z_j_z_z_a_s_z_5_5_8_5_5_5_5_7_7_7_7_7 _7_7_7AF_j_z_z_j_z_z_s_a_z_s_o_z_j_z_z_F_j_z_z_j_zAE_z_TAE_z_5_z_j_sAE_z_5AF_j_5_5_5_5_7_7_7_7_7 _7_7_7_8_TAE_a_z_$_a_$_z_j_z_j_z_z_j_z_8_a_$_z_z_T_z_jAE_TAE_TAE_z_o_w_z_5_8_8_5_5_5_5_7_7_7_7_7 _7_7_7AF_o_s_z_$_a_zAE_a_zAE_z_z_j_z_zAF_j_z_a_$_y_$_z_a_z_s_y_s_a_sAE_zAF_j_5_5_5_5_5_7_7_7_7_7 _7_7_7_F_j_z_o_s_z_j_z_s_o_s_a_$_z_o_s_8_j_z_$_a_z_TAE_s_o_z_j_zAE_a_s_z_8_5_5_5_5_5_5_7_7_7_7_7 _7_7_7AF_8AF_8AF_8AF_8_F_X_F_F_X_8AF_8AF_FAF_8AF_8_FAF_8AF_8AF_F_X_F_8AF_j_5_5_5_5_5_5_7_7_7_7_7 _7_7_7_j_T_j_$_a_j_j_a_F_o_T_o_$_a_j_j_a_j_j_a_j_$_a_jAF_j_j_T_o_j_z_j_o_5_8_5_5_5_5_5_7_7_7_7_7 _7_7_7_z_z_z_a_$_z_z_zAF_j_s_z_a_$_z_zAE_z_z_$_z_a_$_zAF_j_zAE_z_z_s_z_z_5_5_5_5_5_5_5_7_7_7_7_7 _7_7_7AE_TAE_z_a_$_a_$_XAE_z_j_z_z_TAE_T_z_j_z_z_s_aAE_X_j_z_TAE_TAE_a_z_5_5_5_5_5_5_5_7_7_7_7_7 _7_7_7_wAE_T_j_z_5_$_zAF_j_j_z_z_j_z_5AE_z_z_j_z_o_s_z_F_TAE_z_$_aAE_s_z_5_5_5_5_5_5_7_7_7_7_7_7 _7_7_7AE_T_z_zAE_a_z_T_n_T_zAE_j_z_z_T_z_TAE_z_j_z_o_z_8_j_z_T_z_s_a_5_z_5_5_5_5_5_5_7_7_7_7_7_7 _7_7_7_wAE_z_j_z_s_aAEAF_j_z_T_z_$_a_$_zAE_T_z_s_a_sAEAF_TAE_z_j_y_$_z_z_5_5_5_5_5_7_7_7_7_7_7_7 _7_7_7AE_T_5_z_j_j_z_s_n_o_zAE_a_z_s_o_T_zAE_a_OAE_a_s_8_o_s_a_z_s_o_z_z_5_5_5_5_5_7_7_7_7_7_7_7 _7_7_7_a_z_$_z_z_z_o_z_8_s_j_w_$_z_o_sAE_z_TAE_s_a_$_zAF_j_zAE_j_z_z_j_z_5_5_5_5_7_7_7_7_7_7_7_7 _7_7_7_s_o_z_TAE_s_z_TAF_o_zAE_T_z_s_y_TAE_5_5_aAE_w_o_F_TAE_T_z_j_z_j_z_5_5_5_5_7_7_7_7_7_7_7_7 _7_7_7_a_z_$_o_T_z_o_z_F_j_s_a_z_z_aAE_z_j_z_$_z_TAE_sAF_j_wAE_s_y_s_z_z_5_5_5_7_7_7_7_7_7_7_7_7 _7_7_7_$_z_T_zAE_s_z_jAF_j_zAE_s_5AE_T_z_T_z_aAE_z_T_y_8_j_z_aAE_TAE_a_z_5_5_5_7_7_7_7_7_7_7_7_7 _7_7_7_aAE_z_j_z_j_o_zAF_j_z_TAE_a_z_$_aAE_sAE_s_a_$_zAF_j_z_$_z_5AE_s_z_5_5_7_7_7_7_7_7_7_7_7_7 _7_7_7_s_a_s_5_z_z_s_o_F_TAE_z_T_$_a_z_s_o_5_a_z_$_a_z_8_j_z_a_s_a_j_z_z_5_5_7_7_7_7_7_7_7_7_7_7 _7_7_7_zAE_z_o_z_j_z_z_XAE_T_zAE_aAE_s_o_z_z_$_z_j_j_z_F_a_$_z_o_sAE_z_z_5_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_TAE_T_z_$_aAE_T_F_j_z_$_a_s_z_a_sAE_T_z_a_z_z_$_X_j_z_a_$_z_a_$_z_5_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AF_8AF_8AF_F_X_FAF_8AF_8AF_F_8_FAF_8AF_8_F_F_8AF_FAF_F_8AF_F_X_F_X_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 } # tile 0 (wall) { _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_7_7_7_7_7 _7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_7_7_7_7_7 _7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_7_7_7_7_7 _7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_7_7_7_7_7 _7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_5_7_7_7_7_7 _7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_5_7_7_7_7_7 _7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_5_5_7_7_7_7_7 _7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_5_5_7_7_7_7_7 _7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_5_5_5_7_7_7_7_7 _7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_5_5_5_7_7_7_7_7 _7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_5_5_5_5_7_7_7_7_7 _7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_5_5_5_5_7_7_7_7_7 _7_7_7_F_T_jAE_j_T_jAE_T_jAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_j_z_j_j_TAE_j_z_5_5_5_5_5_5_5_7_7_7_7_7 _7_7_7AF_o_z_T_zAE_z_z_zAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_z_j_z_zAE_T_z_z_5_5_5_5_5_5_F_7_7_7_7_7 _7_7_7_8_$_zAE_5_T_z_j_zAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_z_z_TAE_wAE_z_z_5_5_5_5_5_5_X_7_7_7_7_7 _7_7_7AF_j_z_T_z_z_j_zAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_TAE_z_5_j_z_T_z_5_5_5_5_5AF_j_7_7_7_7_7 _7_7_7_8_TAE_z_j_z_z_jAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5AE_T_zAE_wAE_z_z_5_5_5_5_5_F_5_7_7_7_7_7 _7_7_7AF_o_j_z_z_j_zAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_z_zAE_T_z_j_z_j_z_5_5_5_5_F_T_5_7_7_7_7_7 _7_7_7_F_T_zAE_T_zAE_DAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_5_z_TAE_z_T_z_z_z_5_5_5_5AF_5_5_7_7_7_7_7 _7_7_7_F_o_s_5AE_zAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_z_5_5_5AE_5_s_aAE_s_o_z_5_5_5AF_j_5_5_7_7_7_7_7 _7_7_7_X_j_z_a_s_j_j_j_o_$_T_j_o_$_T_j_o_s_j_j_a_$_5_5_a_s_aAE_s_o_z_s_z_5_5_5_8_5_5_5_7_7_7_7_7 _7_7_7AF_$_a_$_z_z_z_5_z_z_z_z_z_z_z_z_z_z_z_z_z_z_5_5_k_aAE_s_y_s_aAE_z_5_5AF_o_5_5_5_7_7_7_7_7 _7_7_7_8_o_s_y_T_z_z_z_z_z_z_z_z_z_z_z_z_z_j_5_z_z_z_5_5_z_TAE_a_$_z_T_z_5_5_8_5_5_5_5_7_7_7_7_7 _7_7_7AF_$_T_zAE_z_z_z_z_5_j_z_z_z_z_z_z_z_z_z_z_z_5_5_5_$_z_5AE_TAE_z_z_5_F_T_5_5_5_5_7_7_7_7_7 _7_7_7_8_aAE_s_a_z_z_8_z_z_z_z_z_z_8_z_z_z_8_z_z_j_5_5_5_a_z_T_z_o_s_a_z_5AF_5_5_5_5_5_7_7_7_7_7 _7_7_7AF_j_s_o_z_z_z_z_z_z_z_z_z_z_z_5_j_z_z_z_z_z_5_z_5_s_o_z_$_z_sAE_zAF_j_5_5_5_5_5_7_7_7_7_7 _7_7_7_F_aAE_s_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_5AF_z_$_a_z_o_z_T_z_F_5_5_5_5_5_5_7_7_7_7_7 _7_7_7AF_8AF_8_8_z_z_z_z_z_8_z_z_z_z_z_z_z_z_z_z_z_5_5AF_F_X_F_F_X_8_FAF_j_5_5_5_5_5_5_7_7_7_7_7 _7_7_7_j_j_TAE_j_z_j_z_z_z_z_z_z_z_8_z_z_z_8_z_z_j_5AF_z_j_o_T_o_$_a_j_j_8_5_5_5_5_5_5_7_7_7_7_7 _7_7_7_z_zAE_a_z_5_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_5AF_z_o_s_z_z_s_z_z_z_5_5_5_5_5_5_5_7_7_7_7_7 _7_7_7_z_T_z_$_a_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_zAF_a_O_j_z_o_s_o_z_j_5_5_5_5_5_5_5_5_7_7_7_7_7 _7_7_7_TAE_j_z_s_z_z_z_z_8_z_z_z_z_z_z_z_z_z_z_z_oAF_s_5_j_s_a_$_a_$_z_z_5_5_5_5_5_5_7_7_7_7_7_7 _7_7_7_z_z_TAE_a_z_j_z_z_z_z_z_z_j_z_z_z_j_z_z_z_s_z_z_5_o_zAE_s_a_z_z_z_5_5_5_5_5_5_7_7_7_7_7_7 _7_7_7_a_$_y_sAE_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_zAF_z_5_5_$_a_s_o_z_$_z_z_5_5_5_5_5_7_7_7_7_7_7_7 _7_7_7AE_w_z_z_a_z_z_z_z_z_z_z_z_z_z_z_z_z_8_z_zAF_z_5_5_j_z_z_s_o_z_a_z_5_5_5_5_5_7_7_7_7_7_7_7 _7_7_7_z_$_aAE_sAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF_z_5AF_5_o_s_o_j_z_s_j_z_5_5_5_5_7_7_7_7_7_7_7_7 _7_7_7_T_z_z_j_z_j_$_o_T_$_j_a_$_j_a_$_j_a_j_$_a_$_5_5_5_j_z_z_z_j_z_j_z_5_5_5_5_7_7_7_7_7_7_7_7 _7_7_7AE_z_j_j_z_z_a_sAE_a_z_$_a_z_$_a_z_$_z_a_z_5_5_5_5_s_j_z_j_z_z_z_z_5_5_5_7_7_7_7_7_7_7_7_7 _7_7_7_a_s_z_z_j_z_z_z_z_z_z_8_z_z_z_z_z_z_z_z_z_5_5_z_5_o_z_z_z_j_z_j_z_5_5_5_7_7_7_7_7_7_7_7_7 _7_7_7_zAE_TAE_z_z_z_z_z_z_z_z_z_z_z_z_z_8_z_z_z_5_5_5_5_T_o_s_o_5_z_z_z_5_5_7_7_7_7_7_7_7_7_7_7 _7_7_7_TAE_z_5_T_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_5_5_5_5_$_z_s_z_j_j_z_z_5_5_7_7_7_7_7_7_7_7_7_7 _7_7_7AE_z_TAE_z_z_z_z_j_z_z_z_z_z_z_z_z_z_z_z_z_5_8_5_5_o_j_z_o_z_z_z_z_5_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_T_zAE_T_z_z_z_z_z_z_z_z_z_j_z_z_z_z_z_z_z_5_5_5_5_T_z_z_s_o_s_o_z_5_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AF_F_X_F_F_z_z_z_z_z_z_z_8_z_z_z_z_8_z_z_z_5_z_5_5_F_F_8_F_X_F_X_F_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_8_z_z_z_z_z_z_z_z_z_z_z_z_z_5_5_5AF_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_5_5_5_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_j_z_z_z_z_z_z_5_5_F_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_5_z_z_z_z_z_z_5_5_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_j_z_z_8_z_z_z_z_z_z_z_z_8_z_5_X_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_5_z_z_z_z_z_z_z_z_z_z_z_j_z_5_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_5_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_F_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 } # tile 0 (wall) { _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAL_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_jAL_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_TAL_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAT_jAEAL_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_zAL_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5AL_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5AL_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_5AL_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_FAL_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_5_5AL_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_z_5AL_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_5_5_5AL_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_5_5_FAL_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_5_X_5_5AL_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_5_5_5_5AL_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_z_5_5_5_5_5_z_7_7_7_7_7_7_7_7 _7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_z_5_5_z_5AF_a_7_7_7_7_7_7_7_7 _7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAT_jAF_z_5_5_F_5_5AF_$_7_7_7_7_7_7_7_7 _7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_jAL_a_O_5_5_5AF_z_5_7_7_7_7_7_7_7_7 _7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_zAF_s_5_5_5_5AF_a_5_7_7_7_7_7_7_7_7 _7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_zAF_o_5_5_5AF_z_z_5_7_7_7_7_7_7_7_7 _7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5AF_z_5_5_5AF_z_5_5_7_7_7_7_7_7_7_7 _7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_zAF_s_5_5AFAE_z_5_5_7_7_7_7_7_7_7_7 _7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_5AF_o_5_5AF_z_T_5_F_7_7_7_7_7_7_7_7 _7_7_7_F_T_jAE_j_T_jAE_T_jAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_5AF_z_5AF_z_F_z_5_5_7_7_7_7_7_7_7_7 _7_7_7AF_o_z_T_zAE_z_z_zAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_5_5AF_s_5AF_TAF_z_z_5_7_7_7_7_7_7_7_7 _7_7_7_8_$_zAE_5_T_z_j_zAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_F_5AF_yAFAE_5AF_o_5_5_7_7_7_7_7_7_7_7 _7_7_7AF_j_z_T_z_z_j_zAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_5_5_5AF_TAF_s_5AF_z_X_5_7_7_7_7_7_7_7_7 _7_7_7_8_TAE_z_j_z_z_jAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_5_X_5AFAFAE_3_5AF_s_4_5_7_7_7_7_7_7_7_7 _7_7_7AF_o_j_z_z_j_zAPAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_5_5_5_5AFAF_z_5_5AF_a_5_5_7_7_7_7_7_7_7_7 _7_7_7_F_T_zAE_T_zAE_DAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_5_5_5_5AF_z_z_5_5AFAE_5_5_7_7_7_7_7_7_7_7 _7_7_7_F_o_s_5AE_zAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_z_5_5_5_5_5_5AF_z_5_5_5AF_s_5_5_7_7_7_7_7_7_7_7 _7_7_7_X_j_z_a_s_j_j_j_o_$_T_j_o_$_T_j_o_s_j_j_o_s_5_5_z_z_5AFAE_z_5_5_5AF_z_8AF_7_7_7_7_7_7_7_7 _7_7_7AF_$_a_$_z_z_z_5_z_z_z_z_z_z_z_z_z_z_5_z_z_z_5_5_8_5_5AF_w_5_5_F_5AF_a_5_7_7_7_7_7_7_7_7_7 _7_7_7_8_o_s_y_T_z_z_z_z_z_z_z_z_z_z_z_z_z_j_z_z_z_z_5_5_5AF_z_z_5_5_5_5AFAE_X_7_7_7_7_7_7_7_7_7 _7_7_7AF_$_T_zAE_z_z_z_z_5_j_z_z_z_z_z_z_z_z_z_wAE_5_5_5_5AFAE_5_5_5_5_5AF_s_7_7_7_7_7_7_7_7_7_7 _7_7_7_8_aAE_s_a_z_z_8_z_z_z_z_z_z_8_z_z_z_8_z_z_z_z_5_5AF_a_2_8_z_5_5_5AF_n_7_7_7_7_7_7_7_7_7_7 _7_7_7AF_j_s_o_z_z_z_z_z_z_z_z_z_z_z_5_j_z_z_z_z_z_5_z_5AF_z_5_5_5_5_5_5AF_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_F_aAE_s_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_j_5_5AF_z_j_5_5_5_5_5_5AF_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AF_8AF_8_8_z_z_z_z_z_8_z_z_z_z_z_z_z_z_z_z_z_5_5AF_z_z_5_z_5AF_5_5_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_j_j_TAE_j_z_j_z_z_z_z_z_z_z_8_z_z_z_8_z_z_z_zAF_z_F_a_O_5_5_5_5_F_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_z_zAE_a_z_5_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_5AF_TAF_z_5_5_5_5_5_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_z_T_z_$_a_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_jAF_z_4AF_s_5_5_5_5_X_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_TAE_j_z_s_z_z_z_z_8_z_z_z_z_z_z_z_z_z_z_z_zAF_z_5AF_o_5_5_F_5_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_z_z_TAE_a_z_j_z_z_z_z_z_z_j_z_z_z_j_z_z_z_z_j_5_5AF_z_5_5_5AF_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_a_$_y_sAE_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_zAF_z_5_5AF_s_5_5_5_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AE_w_z_z_a_z_z_z_z_z_z_z_z_z_z_z_z_z_8_z_zAF_5_5_5AF_o_5_5_8_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_z_$_aAE_sAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF_z_5_8_5AF_z_5_5_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_T_z_z_j_z_j_$_o_T_$_j_a_$_j_a_$_j_a_j_$_a_$_5_5_5AF_z_zAF_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AE_z_j_j_z_z_a_sAE_a_z_$_a_z_$_a_z_$_z_a_z_5_5_5_5AF_s_5_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_a_s_z_z_j_z_z_z_z_z_z_8_z_z_z_z_z_z_z_z_z_5_5_z_5AF_oAF_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_zAE_TAE_z_z_z_z_z_z_z_z_z_z_z_z_z_8_z_z_z_5_5_5_5AF_s_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_TAE_z_5_T_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_5_5_5_5AF_y_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AE_z_TAE_z_z_z_z_j_z_z_z_z_z_z_z_z_z_z_z_z_5_8_5_5AF_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_T_zAE_T_z_z_z_z_z_z_z_z_z_j_z_z_z_z_z_z_z_5_5_5_5_8_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AF_F_X_F_F_z_z_z_z_z_z_z_8_z_z_z_z_8_z_z_z_5_z_5_5_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_8_z_z_z_z_z_z_z_z_z_z_z_z_z_5_5_5AF_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_5_5_5_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_j_z_z_z_z_z_z_5_5_F_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_5_z_z_z_z_z_z_5_5_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_j_z_z_8_z_z_z_z_z_z_z_z_8_z_5_X_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_5_z_z_z_z_z_z_z_z_z_z_z_j_z_5_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_5_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_F_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 } # tile 0 (wall) { _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAP_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_jAP_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_T_9_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_zAP_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_zAP_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5AP_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5AP_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_5AP_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_5_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_5_5_5_5_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_j_z_j_j_TAE_j_z_5_5_5_5_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_z_j_z_zAE_T_z_z_5_5_5_5_5_5_F_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_z_z_TAE_wAE_z_z_5_5_5_5_5_5_X_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_TAE_z_5_j_z_T_z_5_5_5_5_5AF_j_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5AE_T_zAE_wAE_z_z_5_5_5_5_5_F_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_z_zAE_T_z_j_z_j_z_5_5_5_5_F_T_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_j_z_5_5_z_TAE_z_T_z_z_z_5_5_5_5AF_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAP_z_5_5_5AE_5_s_aAE_s_o_z_5_5_5AF_j_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_j_j_z_j_j_TAE_j_j_TAE_j_T_jAE_TAE_5_5_T_z_aAE_s_o_z_s_z_5_5_5_8_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_5_z_z_z_z_z_z_z_5_z_z_z_z_z_z_z_T_5_5_n_TAE_s_y_s_aAE_z_5_5AF_o_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_j_5_z_z_5_5_5_z_a_$_aAE_s_a_z_5_5_8_5_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_5_j_z_z_z_z_z_z_z_z_z_zAE_5_5_5_$_z_5AE_TAE_z_z_5_F_T_5_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_8_z_z_z_z_z_z_8_z_z_z_8_z_z_T_5_5_5_a_s_a_s_o_s_a_z_5AF_5_5_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_j_z_z_z_z_z_5_z_5_z_o_zAE_z_z_$_z_F_j_5_5_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_5_z_z_z_zAE_5_5AF_sAE_T_z_TAE_a_zAF_5_5_5_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_8_z_z_z_z_z_z_z_z_z_z_T_5_5AFAF_8AF_F_F_X_FAF_j_5_5_5_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_j_z_z_z_z_z_z_z_8_z_z_z_8_z_z_z_5AF_z_j_j_j_a_j_j_z_j_5_5_5_5_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_zAE_5AF_z_j_z_z_$_z_z_z_z_5_5_5_5_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_TAFAE_z_TAE_a_z_j_z_j_z_5_5_5_5_5_5_5_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_8_z_z_z_z_z_z_z_z_z_z_z_zAF_z_5_j_z_T_$_a_z_z_z_5_5_5_5_5_5_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_j_5_z_z_z_z_z_j_z_z_z_j_z_z_zAE_T_5_5_j_zAE_z_j_z_z_z_5_5_5_5_5_5_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_zAF_z_5_5_s_o_s_a_z_$_z_z_5_5_5_5_5_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_8_z_zAF_5_5_5_j_z_z_$_a_z_T_z_5_5_5_5_5_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF_z_5_F_5_o_$_a_j_z_$_o_z_5_5_5_5_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_j_j_z_j_j_TAE_j_TAE_j_TAE_j_TAE_T_5_5_5_T_z_zAE_T_z_j_z_5_5_5_5_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_j_z_zAE_T_zAE_T_zAE_T_zAE_z_5_5_5_5AE_j_z_TAE_z_z_z_5_5_5_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_8_z_z_z_z_z_z_z_z_z_5_5_z_5_T_zAE_z_TAE_T_z_5_5_5_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_8_z_z_z_5_5_5_5_jAE_T_z_z_z_z_z_5_5_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_5_5_5_5_j_z_z_j_z_jAE_z_5_5_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_j_z_z_z_z_z_z_z_z_z_z_z_z_5_8_5_5AE_TAE_z_TAE_w_z_5_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_j_z_z_z_z_z_z_z_5_5_5_5_T_z_z_j_z_z_j_z_5_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_8_z_z_z_z_8_z_z_z_5_z_5_5_F_F_8AF_F_X_FAF_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_8_z_z_z_z_z_z_z_z_z_z_z_z_z_5_5_5AF_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_5_5_5_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_j_z_z_z_z_z_z_5_5_8_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_5_z_z_z_z_z_z_5_5_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_j_z_z_8_z_z_z_z_z_z_z_z_8_z_5AF_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_z_j_z_5_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_5_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_F_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 } # tile 0 (open door) { _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJAJAJ_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJAJAJAJAJAJ_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_R_R_R_RAJAJAJAJAJAJAJ_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_R_R_R_R_R_R_RAJAJAJAJAJAJAJ_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_R_R_R_R_R_R_R_R_R_R_RAJAJAJAJAJ_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_R_R_R_R_R_R_R_R_R_R_R_R_R_RAJAJ_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_R_R_R_R_R_R_R_R_R_R_R_R_R_RAI_R_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_R_R_R_R_R_R_R_R_R_R_R_R_RAIAI_R_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_R_R_R_R_R_R_R_R_R_R_R_R_RAIAI_R_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_R_R_R_R_R_R_R_R_R_R_R_R_R_RAI_R_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_7_7_7_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJAJAJAJ_7_7_7_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJAJAJAJ_R_R_R_7_7_7_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJAJAJAJAJ_R_R_R_R_R_7_7_7_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_7_7 _7_7_7_7_7_7_7_7_7_7_7_7AJAJAJAJAJAJAJ_R_R_R_R_R_R_R_R_7_7_7_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_7_7 _7_7_7_7_7_7_7_7_7_7_7_7AJAJAJAJ_R_R_R_R_R_R_R_R_R_R_R_7_7_7_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_7_7_7_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_7_7_7_______R_R_R_R_R_R_R_R_R_R_R_R_R_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_7_7_7_7___________R_R_R_R_R_R_R_R_R_R_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_7_7_7_7_7_7_7___________R_R_R_R_R_R_R_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_________R_R_R_R_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_____________7_7 _7_7_7_7_7_7_7_7_7_7_7_7_R_R_R_R_R_R_R_R_R_R_RAI_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_______7_7 _7_7_7_7_7_7_7_7_7_7_7_7_R_R_R_R_R_R_R_R_R_RAIAIAI_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_R_R_R_R_R_R_R_R_R_RAIAIAI_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_R_R_R_R_R_R_R_R_R_R_RAI_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_R_R_R_R_R_R_R_R_R_R_R_R_______7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_R_R_R_R_R_R_R_R_R___________7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_R_R_R_R_R_R___________7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_R_R_R___________7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7___________7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 } # tile 0 (open door) { _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AJAJ___7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJ___7_7_7_7_7_7 _7_7_7_7_7_7_7_7AJAJ___7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJ___7_7_7_7_7_7 _7_7_7_7_7_7_7AJAJ_C___7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJ___7_7_7_7_7_7 _7_7_7_7_7_7_7AJAJ_C___7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJ_C___7_7_7_7_7_7 _7_7_7_7_7_7AJAJAJ_C___7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJ_C___7_7_7_7_7_7 _7_7_7_7_7_7AJAJ_C_C___7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJ_C_C___7_7_7_7_7_7 _7_7_7_7_7AJAJAJ_C_C___7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJ_C_C___7_7_7_7_7_7 _7_7_7_7_7AJAJ_C_C_C___7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJ_C_C_C___7_7_7_7_7_7 _7_7_7_7AJAJAJ_C_C_C___7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJ_C_C_C___7_7_7_7_7_7 _7_7_7_7AJAJ_C_C_C_C___7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJ_C_C_C_C___7_7_7_7_7_7 _7_7_7AJAJAJ_C_C_C_C___7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJ_C_C_C_C___7_7_7_7_7_7 _7_7_7AJAJ_C_C_C_C_C___7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJ_C_C_C_C_C___7_7_7_7_7_7 _7_7AJAJAJ_C_C_C_C_C___7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJ_C_C_C_C_C___7_7_7_7_7_7 _7_7AJAJ_C_C_C_C_C_C___7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJ_C_C_C_C_C_C___7_7_7_7_7_7 _7AJAJAJ_C_C_C_C_C_C___7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJ_C_C_C_C_C_C___7_7_7_7_7_7 _7AJAJ_C_C_C_C_C_C_C___7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJ_C_C_C_C_C_C_C___7_7_7_7_7_7 AJAJAJ_C_C_C_C_C_C_C___7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJ_C_C_C_C_C_C_C___7_7_7_7_7_7 AJAJ_C_C_C_C_C_C_C_C___7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJ_C_C_C_C_C_C_C_C___7_7_7_7_7_7 AJAJ_C_C_C_C_C_C_C_C___7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJ_C_C_C_C_C_C_C_C___7_7_7_7_7_7 AJAJ_C_C_C_C_C_C_C_C___7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJ_C_C_C_C_C_C_C_C_C___7_7_7_7_7_7 AJAJ_C_C_C_C_C_C_C_C___7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJ_C_C_C_C_C_C_C_C_C___7_7_7_7_7_7 AJAJ_C_C_C_C_C_C_C_C___7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJ_C_C_C_C_C_C_C_C_C___7_7_7_7_7_7 AJAJ_C_C_C_C_C_C_C_C___7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJ_C_C_C_C_C_C_C_C_C___7_7_7_7_7_7 AJAJ_C_C_C_C_C_C_C_C___7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJ_C_C_C_C_C_C_C_C_C___7_7_7_7_7_7 AJAJ_C_C_C_C_C_C_C_C___7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJ_C_C_C_C_C_C_C_C_C___7_7_7_7_7_7 AJAJ_C_C_C_C_C_C_C_C___7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJ_C_C_C_C_C_C_C_C_C___7_7_7_7_7_7 AJAJ_C_C_C_C_C_C_C_C___7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJ_C_C_C_C_C_C_C_C_C___7_7_7_7_7_7 AJAJ_C_C_C_C_C_C_C_C___7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJ_C_C_C_C_C_C_C_C_C___7_7_7_7_7_7 AJAJ_C_C_C_C_C_C_C_C___7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJ_C_C_C_C_C_C_C_C_C___7_7_7_7_7_7 AJAJ_C_C_C_C_C_C_C_C___7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJ_C_C_C_C_C_C_C_C_C___7_7_7_7_7_7 AJAJ_CAIAI_C_C_C_C_C___7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJ_CAIAI_C_C_C_C_C_C___7_7_7_7_7_7 AJAJAIAI_C_C_C_C_C_C___7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJ_CAIAI_C_C_C_C_C_C___7_7_7_7_7_7 AJAJ_CAIAI_C_C_C_C_C___7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJ_CAIAI_C_C_C_C_C_C___7_7_7_7_7_7 AJAJ_C_C_C_C_C_C_C_C___7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJ_C_C_C_C_C_C_C_C_C___7_7_7_7_7_7 AJAJ_C_C_C_C_C_C_C_C___7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJ_C_C_C_C_C_C_C_C_C___7_7_7_7_7_7 AJAJ_C_C_C_C_C_C_C_C___7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJ_C_C_C_C_C_C_C_C_C___7_7_7_7_7_7 AJAJ_C_C_C_C_C_C_C_C___7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJ_C_C_C_C_C_C_C_C_____7_7_7_7_7_7 AJAJ_C_C_C_C_C_C_C_____7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJ_C_C_C_C_C_C_C_C___7_7_7_7_7_7_7 AJAJ_C_C_C_C_C_C_C_____7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJ_C_C_C_C_C_C_C_____7_7_7_7_7_7_7 AJAJ_C_C_C_C_C_C_______7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJ_C_C_C_C_C_C_C_____7_7_7_7_7_7_7 AJAJ_C_C_C_C_C_C_____7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJ_C_C_C_C_C_C_____7_7_7_7_7_7_7_7 AJAJ_C_C_C_C_C_______7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJ_C_C_C_C_C_C_____7_7_7_7_7_7_7_7 AJAJ_C_C_C_C_C_____7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJ_C_C_C_C_C_____7_7_7_7_7_7_7_7_7 AJAJ_C_C_C_C_______7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJ_C_C_C_C_______7_7_7_7_7_7_7_7_7 AJAJ_C_C_C_C_____7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJ_C_C_C_C_____7_7_7_7_7_7_7_7_7_7 AJAJ_C_C_C_______7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJ_C_C_C_____7_7_7_7_7_7_7_7_7_7_7 AJAJ_C_C_C_____7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJ_C_C_C_____7_7_7_7_7_7_7_7_7_7_7 AJAJ_C_C_____7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJ_C_C_____7_7_7_7_7_7_7_7_7_7_7_7 AJAJ_C_C_____7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJ_C_C_____7_7_7_7_7_7_7_7_7_7_7_7 AJAJ_C_____7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJ_C_____7_7_7_7_7_7_7_7_7_7_7_7_7 AJAJ_C_____7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJ_C_____7_7_7_7_7_7_7_7_7_7_7_7_7 AJAJ_____7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJ_____7_7_7_7_7_7_7_7_7_7_7_7_7_7 _________7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_______7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 } # tile 0 (closed door) { _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_R_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_R_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_R_R_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_R_R_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_R_R_R_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_R_R_R_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_q_R_R_R_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_q_R_R_R_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_q_q_R_R_R_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_R_q_R_R_R_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_R_R_q_R_R_R_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_R_R_q_R_R_R_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_R_R_R_q_R_R_R_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_R_R_R_q_R_R_R_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_R_R_R_R_q_R_R_R_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_R_R_R_R_q_R_R_R_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_R_R_R_R_R_q_R_R_R_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_R_R_R_R_R_q_RAIAI_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_R_R_R_R_R_R_qAIAIAIAI_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_R_R_R_R_R_R_qAIAIAIAI_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_R_R_R_R_R_R_R_q_RAIAI_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_R_R_R_R_R_R_R_q_R_R_R_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_R_R_R_R_R_R_R_R_q_R_R_R_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_R_R_R_R_R_R_R_R_q_R_R_R_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_q_q_q_R_R_R_R_R_R_R_R_q_R_R_R_R_R_R___7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_q_q_q_R_R_R_RAIAI_R_R_q_R_R_R_R_R_____7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_q_q_q_R_R_RAIAIAIAI_R_q_R_R_R_R_R___7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_q_q_q_R_R_RAIAIAIAI_R_q_R_R_R_R_____7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_q_q_q_R_R_R_RAIAI_R_R_q_R_R_R_R_____7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_q_q_q_R_R_R_R_R_R_R_R_q_R_R_R_______7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_q_q_q_R_R_R_R_R_R_R_R_q_R_R_R_____7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_q_q_q_R_R_R_R_R_R_R_R_q_R_R_______7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_q_q_q_R_R_R_R_R_R_R_R_q_R_R_____7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_q_q_q_R_R_R_R_R_R_R_R_q_R_______7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_q_q_q_R_R_R_R_R_R_R_R_q_R_____7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_q_q_q_R_R_R_R_R_R_R_R_q_______7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_q_q_q_R_R_R_R_R_R_R_R_q_____7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_q_q_q_R_R_R_R_R_R_R_R_____7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_q_q_q_R_R_R_R_R_R_R_R_____7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_q_q_q_R_R_R_R_R_R_R_____7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_q_q_q_R_R_R_R_R_R_______7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_q_q_q_R_R_R_R_R_R_____7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_q_q_q_R_R_R_R_R_______7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_q_q_q_R_R_R_R_R_____7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_q_q_q_R_R_R_R_______7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_q_q_q_R_R_R_R_____7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_q_q_q_R_R_R_____7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_q_q_q_R_R_______7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_q_q_q_R_R_____7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_q_q_q_R_______7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_q_q_q_R_____7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_q_q_q_R_____7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_q_q_q_____7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_q_q_q_____7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_8_7_q_q_q_____7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 } # tile 0 (closed door) { _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_R_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_R_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_R_R_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_R_R_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_R_R_R_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_R_R_R_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_q_R_R_R_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_q_R_R_R_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_q_q_R_R_R_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_R_q_R_R_R_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_R_R_q_R_R_R_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_R_R_q_R_R_R_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_R_R_R_q_R_R_R_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_R_R_R_q_R_R_R_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_R_R_R_R_q_R_R_R_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_R_R_R_R_q_R_R_R_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_R_R_R_R_R_q_R_R_R_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_R_R_R_R_R_q_RAIAI_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_R_R_R_R_R_R_qAIAIAIAI_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_R_R_R_R_R_R_qAIAIAIAI_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_R_R_R_R_R_R_R_q_RAIAI_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_R_R_R_R_R_R_R_q_R_R_R_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_R_R_R_R_R_R_R_R_q_R_R_R_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AJAJAJ_R_R_R_R_R_R_R_R_q_R_R_R_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_q_q_q_R_R_R_R_R_R_R_R_q_R_R_R_R_R_R___7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_q_q_q_R_R_R_RAIAI_R_R_q_R_R_R_R_R_____7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_q_q_q_R_R_RAIAIAIAI_R_q_R_R_R_R_R___7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_q_q_q_R_R_RAIAIAIAI_R_q_R_R_R_R_____7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_q_q_q_R_R_R_RAIAI_R_R_q_R_R_R_R_____7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_q_q_q_R_R_R_R_R_R_R_R_q_R_R_R_______7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_q_q_q_R_R_R_R_R_R_R_R_q_R_R_R_____7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_q_q_q_R_R_R_R_R_R_R_R_q_R_R_______7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_q_q_q_R_R_R_R_R_R_R_R_q_R_R_____7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_q_q_q_R_R_R_R_R_R_R_R_q_R_______7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_q_q_q_R_R_R_R_R_R_R_R_q_R_____7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_q_q_q_R_R_R_R_R_R_R_R_q_______7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_q_q_q_R_R_R_R_R_R_R_R_q_____7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_q_q_q_R_R_R_R_R_R_R_R_____7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_q_q_q_R_R_R_R_R_R_R_R_____7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_q_q_q_R_R_R_R_R_R_R_____7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_q_q_q_R_R_R_R_R_R_______7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_q_q_q_R_R_R_R_R_R_____7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_q_q_q_R_R_R_R_R_______7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_q_q_q_R_R_R_R_R_____7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_q_q_q_R_R_R_R_______7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_q_q_q_R_R_R_R_____7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_q_q_q_R_R_R_____7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_q_q_q_R_R_______7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_q_q_q_R_R_____7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_q_q_q_R_______7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_q_q_q_R_____7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_q_q_q_R_____7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_q_q_q_____7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_q_q_q_____7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_8_7_q_q_q_____7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 } # tile 0 (staircase up) { _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_jAF_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_jAF_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_jAFAF_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_jAFAF_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_zAFAFAF_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_zAFAFAF_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_zAFAFAF_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_zAFAFAF_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_zAFAFAF_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_zAFAFAF_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_jAFAFAFAF_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_jAFAFAFAF_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_jAFAFAFAFAF_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_jAFAFAFAFAF_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_zAFAFAFAFAFAF_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_zAFAFAFAFAFAF_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_zAFAFAFAFAFAF_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_zAFAFAFAFAFAF_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_zAFAFAFAFAFAF_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_zAFAFAFAFAFAF_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_jAFAFAFAFAFAFAF_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_jAFAFAFAFAFAFAF_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_jAFAFAFAFAFAFAFAF_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_jAFAFAFAFAFAFAFAF_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_zAFAFAFAFAFAFAFAF_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_zAFAFAFAFAFAFAFAF_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_zAFAFAFAFAFAFAF_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_zAFAFAFAFAFAFAF_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_zAFAFAFAFAFAF_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_zAFAFAFAFAFAF_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_jAFAFAFAFAFAF_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_jAFAFAFAFAFAF_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_jAFAFAFAFAFAF_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_jAFAFAFAFAFAF_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_zAFAFAFAFAFAF_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_zAFAFAFAFAFAF_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_zAFAFAFAFAF_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_zAFAFAFAFAF_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_zAFAFAFAF_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_zAFAFAFAF_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_jAFAFAFAF_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_jAFAFAFAF_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_jAFAFAFAF_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_jAFAFAF_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_zAFAFAFAF_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_zAFAFAF_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_zAFAFAF_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_zAFAF_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_zAFAF_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_zAF_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_zAF_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 } # tile 0 (staircase down) { _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_j_j_z_j_j_TAE_j_j_TAE_j_T_jAE_j_T_jAE_T_j_jAE_T_j_j_z_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_TAE_T_jAE_TAE_j_TAE_j_TAE_j_z_j_TAE_j_TAE_j_z_j_j_z_j_j_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_j_jAF_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_j_z_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_s_oAF_F_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_5_j_j_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_j_jAF_X_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_j_z_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_j_a_FAF_F_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_$_jAF_8_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_z_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_o_TAF_8AF_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_j_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_$_jAF_8AL_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_j_j_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_a_jAP_8AFAL_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_j_z_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_j_$ALAFAL_8_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_z_j_z_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_s_jAFAL_8ALAF_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_o_jAF_8AP_8_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_z_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_T_jAF_F_XALAF_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_z_j_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7AE_jAF_8AL_F_X_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_j_j_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_j_TAL_8AFALAF_F_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5AE_T_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7AE_jAPAFAL_8ALAF_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_j_T_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_T_jAFAL_8ALAFAL_j_o_j_T_jAE_j_T_jAE_T_j_jAE_T_j_j_z_jAE_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_jAE_X_FALAF_8_j_z_j_s_o_$_T_o_$_a_j_$_a_$_T_o_$_a_j_j_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_TAE_X_8AFAL_8AF_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_k_z_j_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_j_jAF_FAL_X_F_X_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_j_j_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_s_oAP_8AFAL_8AF_F_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_z_j_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_j_jAP_FALAFAL_8AF_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_j_j_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_o_jAFAL_XAL_8ALAF_F_a_$_a_z_z_$_a_z_z_$_a_z_z_$_a_z_z_j_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_s_jAF_FALAF_8AL_8_z_z_z_$_a_$_a_z_$_a_z_$_a_$_a_z_$_j_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_o_jAF_8AFAL_8AFALAF_8_5_8_8_8_8_8_8_8_8_8_8_8_8_8_8_j_a_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_s_j_o_T_j_o_T_j_j_j_j_a_j_j_z_j_j_j_j_j_j_z_j_jAE_T_$_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_j_o_s_jAE_T_$_o_s_o_z_j_$_a_$_j_a_$_a_$_a_$_j_a_$_T_o_j_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 } # tile 0 (water) { _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ADADASAD_7_7_7_7_7_7ADAS_7_7_7_7_7_7_7_7_7ASADAD_0_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ADADASADAD_0_0_7_7_0ADASADAD_0_0_0_7_7_0ADASADADAD_0AD_0_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_0ASASASAD_0_0_0_0ADASASAD_0AD_0AD_0_0ADADASADADAD_0_0_0_0ADADAD_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7ADADASADAD_0_0_0ADADASADADADAD_0_0_0_0ADASASADADAD_0ADAD_0_0ADAD_0_7 _7_7_7_7_7_7_7_7_7_7_7_7_7ASASASADASASAD_0ADASASADADAD_0_0AD_0_0ADASADADASASASAD_0_0ADADADAD_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7ADADADADASADADADASASADADASASADADAD_0ADASADADADAD_0_0_0ADADASASAS_0_7_7 _7_7_7_7_7_7_7_7_7_7_7_7ADAD_0_0ADASADADASASADASASADADADASADASASASADAD_0_0_0ADADASASADADAD_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_0_0_0ADASADASASASADAD_0ADADADADADASADADAD_0_0AD_0ADASASADASADADAD_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_0_0ADADADADASAD_0AD_0_0_0_0ADASASADAD_0_0_0AD_0ASASASADADADAD_0_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_0ADADADASADADAD_0_0_0ADADADASASAD_0_0_0_0_0ASASADADADAD_0_0_0_0_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7ADADADASASADADAD_0_0ADADADASASASAD_0_0_0ADADASAS_0_0ADAD_0_0_0_0_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7ADADASASASADADAD_0_0ADADADASADADADADASASASASASADADADAD_0_0_0_0_0_0_7_7_7_7_7 _7_7_7_7_7_7_7_7_7ASADASASADADADAD_0_0ADADASASASADASASASADADASAD_0AD_0_0_0ADADADAD_0_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7ASASADADASAD_0_0_0ADASASASADADADADADADADASASADADAD_0AD_0ASASASADAD_7_7_7_7_7_7 _7_7_7_7_7_7_7_7ADADADADADAD_0_0_0ADASADADADADAD_0_0ADADASADADADAD_0_0_0ADASADASAS_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AD_0AD_0_0_0ADADASASASADADAD_0_0_0ADASASASADADAD_0_0_0_0ASADADADAD_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_0_0_0_0_0ADADASADASAD_0AD_0_0ADASASADADAD_0_0ASASADASADADAD_0AD_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_0_0_0ADASASASADADASADAD_0_0ADASASADAD_0_0ADADADASASADAD_0_0_0_0_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_0_0ADASASADADADADASASAD_0_0ADASADADAD_0_0AD_0_0ASASADADADAD_0_0_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7ADADADASASADAD_0ADADASAD_0_0ADADADADADAD_0ADADASASASADAD_0_0AD_0_0_7_7_7_7_7_7_7_7_7 _7_7_7_7_7ADASASASASASAD_0ADADASADAD_0ADADASADADASASASASADASADADAD_0_0_0_0_0_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7ADASADADADAD_0_0ASASADAD_0ADADASASASASASADADADASADAD_0AD_0_0_0_0_0_7_7_7_7_7_7_7_7_7_7 _7_7_7_7ADASADADADAD_0ADASADADAD_0ADASASASADADAD_0ASASASASADASAS_0_0_0_0AD_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7ASADADADAD_0_0ASADAD_0_0_0ASASADADAD_0ADASASADADADADAD_0_0ASASADAD_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7ADADAD_0_0_0_0_0_0_0ADADASADADADAD_0_0ASASASADADAD_0_0AD_0ADASAS_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7ADAD_0_0_0_0_0AD_0ADADASASADAD_0_0_0_0ASADASADAD_0_0_0ADADADASAD_0_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_0_0_0_0_0AD_0_0ADASASADAD_0_0_0_0ASASASASADADAD_0_0ADADASASADAD_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_0_0_0_0ADADADADADASADAD_0_0_0_0ADASASADADADAD_0_0_0_0ASASADAD_0_0_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_0_0_0ASASASASASASADAD_0_0AD_0ASASASADAD_0_0_0_0ADADASASADADAD_0_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_0_0_0_0ADASADADAD_0_0ADASASASASADADAD_0_0_0ADASASASASADAD_0_0_0_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_0_0ADADASASADAD_0_0_0ASASASADADAD_0_0_0_0_0ADASASASADADADADAD_0_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_0_0AD_0ASADADAD_0_0_0ASASADADADAD_0_0_0_0ADASASADADADADADADAD_0_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _0_0ADADASASADAD_0_0_0ADADASADADAD_0_0_0_0ADADASADADAD_0_0_0ADAS_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _0AD_0ASADADADAD_0_0_0ADASADAD_0_0_0_0ADADADASADADAD_0_0_0_0_0AD_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 } # tile 0 (ice) { _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7AH_5AHAH_5AH_5_5_5_5_5_z_z_j_z_z_TAE_z_z_TAE_z_T_zAE_wAE_wAE_wAE_wAE _7_7_7_7_7_7_7_7_7_7_7_7_7_7AH_5AHAH_5AH_5_5_5_5_z_z_j_z_z_j_z_z_j_zAE_T_zAE_TAE_T_z_j_z_j_z_j_z _7_7_7_7_7_7_7_7_7_7_7_7_7_z_5AH_5AH_5AH_5_5_5_5_z_j_z_z_j_zAE_T_z_T_zAE_T_z_z_zAE_T_z_z_z_T_zAE _7_7_7_7_7_7_7_7_7_7_7_7_7_z_5AH_5AHAH_5AH_5_5_z_z_z_z_j_z_z_T_zAE_z_j_wAE_z_j_z_TAE_z_j_zAE_T_z _7_7_7_7_7_7_7_7_7_7_7_7_z_z_5AH_5AHAH_5AH_5_5_z_j_z_j_z_z_j_zAE_T_zAE_z_TAE_z_j_z_z_j_z_TAE_z_7 _7_7_7_7_7_7_7_7_7_7_7_7_z_z_5_5AH_5AH_5AH_5_5_TAE_z_z_TAE_z_j_z_z_j_z_TAE_z_T_z_z_j_z_zAE_z_T_7 _7_7_7_7_7_7_7_7_7_7_7_z_z_z_5_5AH_5AHAH_5AH_zAE_w_j_zAE_wAE_wAE_T_zAE_z_TAE_z_j_z_z_j_z_TAE_7_7 _7_7_7_7_7_7_7_7_7_7_7_z_z_z_5_5AH_5AHAH_5AH_T_z_j_z_z_j_z_TAE_T_zAE_T_zAE_T_z_z_j_z_z_j_z_z_7_7 _7_7_7_7_7_7_7_7_7_7_z_z_z_z_5_5_5AH_5AH_5AH_zAE_z_TAE_z_TAE_z_z_j_z_z_j_zAE_TAE_z_TAE_z_T_7_7_7 _7_7_7_7_7_7_7_7_7_7_z_z_z_z_5_5_5AH_5AHAH_zAH_z_TAE_z_TAE_z_TAE_z_TAE_z_T_z_z_T_zAE_T_zAE_7_7_7 _7_7_7_7_7_7_7_7_7_z_z_z_z_z_5_5_5AH_5AHAH_zAH_zAE_T_zAE_w_j_z_z_j_z_z_j_zAE_TAE_z_TAE_z_7_7_7_7 _7_7_7_7_7_7_7_7_7_z_z_z_z_z_5_5_5_5AH_5AH_zAHAE_T_z_z_j_z_z_j_z_z_j_zAE_T_zAE_T_zAE_T_z_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_5_5_5_5AH_zAHAH_zAH_z_j_z_z_j_z_z_j_z_z_T_zAE_T_zAE_T_zAE_7_7_7_7_7 _7_7_7_7_7_7_7_7_z_z_z_z_z_z_5_5_5_5AH_zAHAH_zAHAE_z_TAE_z_TAE_z_TAE_z_j_z_z_j_z_z_j_z_7_7_7_7_7 _7_7_7_7_7_7_7_z_z_z_z_z_z_z_5_5_5_5_zAH_zAH_zAH_z_j_z_z_j_z_z_j_z_z_j_z_z_j_z_z_j_z_7_7_7_7_7_7 _7_7_7_7_7_7_7_z_z_z_z_z_z_z_5_5_5_z_zAH_zAHAH_zAH_z_z_j_z_z_j_z_z_j_z_z_j_z_z_j_z_z_7_7_7_7_7_7 _7_7_7_7_7_7_z_z_z_z_z_z_z_z_5_5_5_z_jAH_zAHAH_zAH_z_j_z_z_j_z_z_j_z_z_j_z_z_j_z_z_7_7_7_7_7_7_7 _7_7_7_7_7_7_z_z_z_z_z_z_z_z_5_5_z_z_zAH_zAHAH_zAHAE_z_TAE_z_TAE_z_TAE_z_TAE_z_TAE_7_7_7_7_7_7_7 _7_7_7_7_7_z_z_z_z_z_z_z_z_z_5_5_z_j_z_jAH_zAHAH_zAH_zAE_T_zAE_T_zAE_T_zAE_T_zAE_7_7_7_7_7_7_7_7 _7_7_7_7_7_z_z_z_z_z_z_z_z_z_5_5_j_z_z_zAH_zAHAH_zAH_j_z_z_j_z_z_j_z_z_j_z_z_j_z_7_7_7_7_7_7_7_7 _7_7_7_7_z_z_z_z_z_z_z_z_z_z_5_z_z_j_z_jAH_zAHAH_zAH_z_TAE_z_TAE_z_TAE_z_TAE_z_7_7_7_7_7_7_7_7_7 _7_7_7_7_z_T_zAE_T_z_zAE_T_z_z_j_j_j_j_z_jAH_jAHAH_jAHAE_T_jAE_T_jAE_T_j_j_z_T_7_7_7_7_7_7_7_7_7 _7_7_7_z_j_zAE_T_zAE_T_zAE_T_jAE_TAE_T_j_j_Y_j_YAH_j_Y_j_jAE_T_jAE_T_jAE_z_z_7_7_7_7_7_7_7_7_7_7 _7_7_7_z_zAE_T_zAE_TAE_T_zAE_T_j_z_j_j_z_j_Y_jAH_Y_jAH_z_j_TAE_j_TAE_j_j_z_j_7_7_7_7_7_7_7_7_7_7 _7_7_z_j_z_TAE_z_T_z_zAE_TAE_jAE_j_TAE_j_z_j_Y_j_YAH_jAH_jAE_T_jAE_T_j_z_z_7_7_7_7_7_7_7_7_7_7_7 _7_7AE_T_zAE_z_TAE_z_j_z_z_j_T_j_z_jAE_T_j_j_Y_jAH_Y_j_Y_T_jAE_T_j_j_z_j_z_7_7_7_7_7_7_7_7_7_7_7 _7_z_TAE_z_TAE_z_TAE_z_T_jAE_TAE_j_T_jAE_TAEAH_T_YAH_j_Y_jAE_T_jAE_TAE_z_7_7_7_7_7_7_7_7_7_7_7_7 _7_TAE_z_TAE_z_TAE_z_TAE_z_j_j_T_jAE_T_jAE_T_j_Y_jAH_Y_jAH_jAE_T_jAE_T_z_7_7_7_7_7_7_7_7_7_7_7_7 _zAE_w_j_z_z_j_z_z_j_z_j_j_z_jAE_T_jAE_T_jAE_j_Y_j_YAH_j_Y_T_jAE_T_zAE_7_7_7_7_7_7_7_7_7_7_7_7_7 _z_TAE_z_z_j_z_z_j_z_zAE_T_jAE_T_jAE_T_jAE_T_j_Y_jAH_Y_j_Y_jAE_T_j_j_z_7_7_7_7_7_7_7_7_7_7_7_7_7 _z_j_z_TAE_z_TAE_z_T_j_jAE_T_jAE_T_jAE_T_jAE_TAEAH_j_YAH_j_Y_jAE_z_z_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _j_z_zAE_z_TAE_z_TAE_z_j_T_jAE_T_jAE_T_jAE_T_j_j_Y_jAH_Y_j_Y_j_TAE_T_7_7_7_7_7_7_7_7_7_7_7_7_7_7 } # tile 0 (molten lava) { _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_d_d_d_d_d_d_d_d_7_7_7_7_7_7_7_d_d_d_d_d_d_d_d_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_d_d_d_d_d_d_Q_d_d_d_d_h_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_d_d_d_d_d_d_l_d_d_d_d_d_d_d_d_Q_d_d_d_d_d_d_d_d_h_d_d_d_d_d_d_d_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_d_d_d_d_1_d_d_d_d_d_d_d_d_d_d_d_l_d_d_d_Q_d_d_d_d_d_d_d_d_d_d_d_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_d_Q_d_d_d_d_d_d_d_d_d_h_d_d_d_l_l_d_d_d_d_d_d_d_d_d_d_d_d_d_h_d_d_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_d_d_l_d_d_d_d_d_d_d_d_d_d_d_d_l_dANAN_d_d_d_d_d_d_d_d_1_d_d_d_d_d_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_d_d_d_d_d_d_d_d_l_d_d_d_d_d_l_lANAN_1_d_d_d_d_h_d_d_d_d_d_d_d_d_d_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_d_d_d_d_d_dANANAN_l_d_d_d_l_l_l_1_1_1_d_d_d_d_d_d_d_d_d_d_d_d_d_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_d_d_Q_d_dAN_1_1_lAN_d_h_d_d_l_d_1_d_d_h_d_d_d_d_d_d_d_d_d_Q_d_d_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_d_d_d_d_dAN_l_l_lAN_d_d_d_d_d_d_d_d_d_d_h_d_d_d_d_d_d_h_d_d_l_d_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_d_h_d_d_d_dANANAN_d_d_d_d_d_d_d_d_d_d_d_1_d_d_Q_d_d_d_d_d_d_d_d_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_d_d_d_d_d_d_d_d_1_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_l_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_d_d_d_d_d_d_d_h_d_1_d_d_Q_d_d_l_d_d_lAN_d_h_d_d_d_d_d_d_d_h_d_d_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_d_d_d_d_h_d_d_d_d_d_d_d_l_d_dAN_lANAN_d_d_d_d_d_l_l_l_d_d_d_d_d_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_d_d_d_d_d_d_W_d_d_d_d_l_l_l_d_d_dAN_d_d_d_d_d_d_lANANAN_l_d_d_d_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_d_d_d_d_d_d_d_d_d_l_lANANAN_l_d_d_d_d_d_d_d_d_lAN_1_1_1_l_l_d_d_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_d_d_h_d_d_d_1_d_d_lANAN_d_1_1_1_l_d_d_d_d_d_d_d_lAN_1_l_l_1_d_d_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_d_d_d_d_d_d_d_d_d_lAN_d_h_1_1_1_d_lAN_d_h_d_d_d_h_d_l_l_1_1_d_d_d_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_d_d_d_d_d_d_d_d_d_d_d_l_1_1_1_l_l_lAN_d_d_d_d_d_d_d_d_d_d_d_d_d_d_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_d_d_d_d_d_d_d_d_d_d_dAN_l_l_l_m_QAN_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_d_d_d_d_d_Q_d_d_1_d_d_dANANAN_d_d_d_d_d_h_d_d_d_d_d_d_d_d_d_d_d_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_d_d_d_d_d_l_d_d_d_d_d_d_d_d_d_d_d_d_1_d_d_d_d_d_d_d_d_d_d_d_d_d_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_d_d_d_d_d_d_d_d_1_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_1_d_d_d_d_Q_d_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_d_d_d_h_d_d_d_d_d_d_d_d_Q_d_d_d_h_d_d_d_d_d_d_d_d_d_d_d_d_d_l_d_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_d_d_d_d_d_d_d_1_l_lAN_d_d_d_d_d_d_d_d_d_d_l_l_d_d_h_d_d_d_d_d_d_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_d_d_d_d_d_d_d_d_dANAN_d_d_d_d_d_d_d_d_d_d_lANAN_l_d_d_d_d_Q_d_d_d_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_d_d_d_d_d_d_d_1_d_d_d_d_d_d_d_d_d_d_d_d_d_dAN_l_lAN_d_d_d_d_l_d_d_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_dANAN_d_d_d_d_d_d_d_d_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_d_d_d_h_d_d_d_d_h_d_d_d_1_d_d_d_h_d_d_d_d_d_d_d_d_d_d_d_h_d_d_d_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_Q_d_d_d_d_d_d_d_d_d_d_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_l_d_d_d_1_d_d_d_d_d_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_d_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 } # tile 0 (raised drawbridge) { _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_4_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_gA__4_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_C_C_P_R_4_E_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_C_R_R_R_R_7_U_4_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_C_C_R_R_R_R_R_7_7_E_O_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_C_R_R_R_R_R_R_q_7_7_7_E_4_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_C_C_R_R_R_R_R_R_q_R_7_7_7_7_O_E_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_C_R_R_R_R_R_R_q_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_C_C_R_R_R_R_R_R_q_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_C_R_R_R_R_R_R_q_R_R_R_R_R_q_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_C_C_R_R_R_R_R_R_q_R_R_R_R_R_q_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_C_R_R_R_R_R_R_q_R_R_R_R_R_q_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_C_C_R_R_R_R_R_R_q_R_R_R_R_R_q_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_C_R_R_R_R_R_R_q_R_R_R_R_R_q_R_R_R_R_R_q_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_C_C_R_R_R_R_R_R_q_R_R_R_R_R_q_R_R_R_R_q_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_C_R_R_R_R_R_R_q_R_R_R_R_R_q_R_R_R_R_R_q_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_C_C_R_R_R_R_R_R_q_R_R_R_R_R_q_R_R_R_R_q_R_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_C_R_R_R_R_R_R_q_R_R_R_R_R_q_R_R_R_R_R_q_R_R_R_R_R_q_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_C_C_R_R_R_R_R_R_q_R_R_R_R_R_q_R_R_R_R_q_R_R_R_R_R_R_q_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_C_R_R_R_R_R_R_q_R_R_R_R_R_q_R_R_R_R_R_q_R_R_R_R_R_q_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_C_C_R_R_R_R_R_R_q_R_R_R_R_R_q_R_R_R_R_q_R_R_R_R_R_R_q_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_C_R_R_R_R_R_R_q_R_R_R_R_R_q_R_R_R_R_R_q_R_R_R_R_R_q_R_R_R_R_R_q_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_C_C_R_R_R_R_R_R_q_R_R_R_R_R_q_R_R_R_R_q_R_R_R_R_R_R_q_R_R_R_R_q_R_R_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_C_R_R_R_R_R_R_q_R_R_R_R_R_q_R_R_R_R_R_q_R_R_R_R_R_q_R_R_R_R_R_q_R_R_R_7_7_7_7_7_7_7_7_7_7_7_7 _4_E_R_R_R_R_R_R_q_R_R_R_R_R_q_R_R_R_R_q_R_R_R_R_R_R_q_R_R_R_R_q_R_R_R_R_R_7_7_7_7_7_7_7_7_7_7_7 _P_R_O_4_R_R_R_q_R_R_R_R_R_q_R_R_R_R_R_q_R_R_R_R_R_q_R_R_R_R_R_q_R_R_R_R_R_q_7_7_7_7_7_7_7_7_7_7 _P_P_R_R_4_E_R_q_R_R_R_R_R_q_R_R_R_R_q_R_R_R_R_R_R_q_R_R_R_R_q_R_R_R_R_R_R_q_R_7_7_7_7_7_7_7_7_7 _7_P_P_R_R_R_O_4_R_R_R_R_q_R_R_R_R_R_q_R_R_R_R_R_q_R_R_R_R_R_q_R_R_R_R_R_q_R_R_R_7_7_7_7_7_7_7_7 _7_7_P_P_R_R_q_R_4_E_O_R_q_R_R_R_R_q_R_R_R_R_R_R_q_R_R_R_R_q_R_R_R_R_R_R_q_R_R_R_R_7_7_7_7_7_7_7 _7_7_7_P_P_q_R_R_R_R_R_E_4_R_R_R_R_q_R_R_R_R_R_q_R_R_R_R_R_q_R_R_R_R_R_q_R_R_R_R_R_q_7_7_7_7_7_7 _7_7_7_7_P_P_R_R_R_R_R_I_R_4_E_R_q_R_R_R_R_R_R_q_R_R_R_R_q_R_R_R_R_R_R_q_R_R_R_R_R_q_R_7_7_7_7_7 _7_7_7_7_7_P_P_R_R_R_q_R_R_R_R_O_4_R_R_R_R_R_q_R_R_R_R_R_q_R_R_R_R_R_q_R_R_R_R_R_q_R_R_R_7_7_7_7 _7_7_7_7_7_7_P_P_R_R_q_R_R_R_R_q_R_R_R_R_R_R_q_R_R_R_R_q_R_R_R_R_R_R_q_R_R_R_R_R_q_R_R_R_R_7_7_7 _7_7_7_7_7_7_7_P_P_q_R_R_R_R_R_q_R_R_R_R_R_q_R_R_R_R_R_q_R_R_R_R_R_q_R_R_R_R_R_q_R_R_R_R_R_R_7_7 _7_7_7_7_7_7_7_7_P_P_R_R_R_R_q_R_R_R_R_R_R_q_R_R_R_R_q_R_R_R_R_R_R_q_R_R_R_R_R_q_R_R_R_R_R_R_r_7 _7_7_7_7_7_7_7_7_7_P_P_R_R_R_q_R_R_R_R_R_q_R_R_R_R_R_q_R_R_R_R_R_q_R_R_R_R_R_q_R_R_R_R_R_R_R_r_7 _7_7_7_7_7_7_7_7_7_7_P_P_R_q_R_R_R_R_R_R_q_R_R_R_R_q_R_R_R_R_R_R_q_R_R_R_R_R_q_R_R_R_R_R_R_r_7_7 _7_7_7_7_7_7_7_7_7_7_7_P_P_q_R_R_R_R_R_q_R_R_R_R_R_q_R_R_R_R_R_q_R_R_R_R_R_q_R_R_R_R_R_R_R_r_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_P_P_R_R_R_R_R_q_R_R_R_R_q_R_R_R_R_R_R_q_R_R_R_R_R_q_R_R_R_R_R_R_r_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_P_P_R_R_R_q_R_R_R_R_R_q_R_R_R_R_R_q_R_R_R_R_R_q_R_R_R_R_R_R_R_r_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_P_P_R_R_q_R_R_R_R_q_R_R_R_R_R_R_q_R_R_R_R_R_q_R_R_R_R_R_R_r_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_P_P_q_R_R_R_R_R_q_R_R_R_R_R_q_R_R_R_R_R_q_R_R_R_R_R_R_R_r_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_P_P_R_R_R_R_q_R_R_R_R_R_R_q_R_R_R_R_R_q_R_R_R_R_R_R_r_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_P_P_R_R_R_q_R_R_R_R_R_q_R_R_R_R_R_q_R_R_R_R_R_R_R_r_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_P_P_R_q_R_R_R_R_R_R_q_R_R_R_R_R_q_R_R_R_R_R_R_r_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_P_P_q_R_R_R_R_R_q_R_R_R_R_R_q_R_R_R_R_R_R_R_r_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_P_P_R_R_R_R_R_q_R_R_R_R_R_q_R_R_R_R_R_R_r_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_P_P_R_R_R_q_R_R_R_R_R_q_R_R_R_R_R_R_R_r_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_P_P_R_R_q_R_R_R_R_R_q_R_R_R_R_R_R_r_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_P_P_q_R_R_R_R_R_q_R_R_R_R_R_R_R_r_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_P_P_R_R_R_R_R_q_R_R_R_R_R_R_r_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_P_P_R_R_R_q_R_R_R_R_R_R_R_r_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_P_P_R_R_q_R_R_R_R_R_R_r_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_P_P_q_R_R_R_R_R_R_R_r_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_P_P_R_R_R_R_R_R_r_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_P_P_R_R_R_R_R_r_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_P_P_R_R_R_r_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_P_P_R_R_r_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_P_P_r_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_r_P_r_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_q_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 } # tile 0 (cloud) { _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAH_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAH_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_Y_Y_Y_Y_Y_Y_YAHAHAHAHAHAHAHAHAHAHAHAHAHAH_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_Y_Y_Y_Y_Y_Y_Y_Y_Y_YAHAHAHAHAHAH_Y_Y_YAHAHAHAHAHAHAHAH_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AH_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_YAHAH_Y_Y_Y_Y_Y_Y_Y_YAHAHAHAHAHAHAHAH_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7AHAHAH_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_YAH_Y_Y_Y_Y_Y_Y_YAHAHAHAHAH_Y_Y_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7AHAHAHAHAH_Y_YAHAHAHAH_Y_Y_Y_Y_Y_Y_Y_YAH_Y_Y_Y_Y_Y_YAHAHAHAH_Y_Y_Y_Y_7_7 _7_7_7_7_7_7_7_7_7_7_7AHAHAHAHAHAHAHAHAHAHAHAH_YAH_Y_Y_Y_Y_Y_YAHAHAH_Y_Y_Y_YAHAH_Y_Y_Y_Y_Y_Y_YAK _7_7_7_7_7_7_7_7_7_7_7AHAHAH_Y_Y_YAHAHAHAHAH_YAHAHAH_Y_Y_Y_YAHAHAHAH_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y _7_7_7_7_7_7_7_7_7_7AHAHAH_Y_Y_Y_Y_YAHAHAH_YAHAHAHAHAHAHAHAHAHAHAHAHAH_Y_Y_Y_YAH_Y_Y_Y_Y_Y_Y_Y_Y _7_7_7_7_7_7_7_7_7AHAHAH_Y_Y_Y_Y_Y_YAHAH_YAHAHAHAHAHAHAHAHAHAHAHAHAHAH_Y_Y_Y_YAH_Y_Y_Y_Y_Y_Y_Y_Y _7_7_7_7_7_7_7_7_7AH_Y_Y_Y_Y_Y_Y_YAHAH_YAH_Y_Y_Y_Y_Y_Y_YAHAHAHAHAHAHAHAH_Y_YAH_Y_Y_YAHAH_Y_Y_Y_Y _7_7_7_7_7_7_7_7AH_Y_YAH_Y_Y_YAHAHAH_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_YAHAHAH_Y_YAH_Y_YAHAHAHAH_Y_Y_Y _7_7_7_7_7_7_7AHAH_YAH_Y_Y_YAHAHAH_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_YAH_Y_YAHAHAHAHAH_Y_Y_Y _7_7_7_7_7_7_7AH_Y_YAH_Y_YAHAH_Y_Y_Y_Y_Y_Y_YAHAHAHAHAHAHAHAH_Y_Y_Y_Y_Y_Y_YAH_Y_YAHAH_YAH_Y_Y_Y_Y _7_7_7_7_7_7AHAHAHAH_Y_YAHAH_Y_Y_Y_Y_YAHAHAH_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_YAH_Y_YAHAH_YAH_Y_Y_Y_YAH _7_7_7_7_7AHAHAH_Y_Y_Y_YAH_YAHAHAHAHAH_Y_Y_YAHAHAHAHAHAHAHAH_Y_Y_Y_Y_Y_YAH_YAHAHAH_YAH_Y_Y_Y_YAH _7_7_7_7_7AH_YAH_Y_Y_YAH_YAH_Y_Y_Y_Y_YAHAHAHAHAHAHAHAH_Y_YAHAHAHAHAH_YAH_Y_YAHAH_YAH_Y_Y_Y_YAHAH _7_7_7_7AHAHAH_Y_Y_YAHAHAH_Y_Y_Y_YAHAHAH_Y_Y_Y_Y_Y_Y_YAH_Y_Y_Y_Y_YAHAHAHAHAHAHAH_YAHAH_Y_Y_YAH_Y _7_7_7_7AHAH_Y_Y_Y_YAH_Y_Y_Y_Y_YAH_Y_Y_YAHAHAHAHAHAHAHAHAHAHAHAHAH_YAHAHAHAHAH_YAHAHAH_Y_YAH_Y_Y _7_7_7AHAHAH_Y_Y_YAHAH_Y_Y_Y_Y_Y_YAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAH_Y_YAHAH_YAHAH_Y_Y_YAH_Y_Y _7_7_7AHAHAH_Y_Y_Y_YAH_Y_Y_Y_YAHAHAHAHAHAHAHAH_Y_Y_Y_Y_Y_Y_Y_Y_YAHAHAHAHAHAH_YAHAH_Y_Y_YAHAH_Y_Y _7_7AHAHAHAH_Y_Y_YAHAHAH_Y_YAHAHAHAHAHAHAHAH_Y_Y_Y_Y_Y_Y_Y_YAHAH_Y_Y_Y_YAHAH_YAH_Y_Y_Y_YAH_Y_Y_Y _7_7AHAHAHAH_Y_Y_YAHAHAHAHAHAH_Y_Y_YAHAH_Y_Y_Y_Y_Y_Y_Y_Y_YAH_Y_Y_Y_Y_Y_YAH_YAHAH_Y_Y_Y_YAH_Y_Y_Y _7_7AHAHAHAH_Y_Y_YAHAHAHAH_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_YAHAHAHAHAHAHAH_Y_Y_YAH_YAH_Y_Y_Y_Y_YAHAH_Y_Y_Y AKAHAHAHAHAHAH_YAHAHAH_Y_Y_YAHAH_Y_Y_Y_Y_Y_Y_Y_YAHAHAHAHAHAHAHAH_Y_Y_YAH_Y_YAH_Y_Y_YAHAHAH_Y_Y_Y AKAHAHAHAHAHAHAHAHAH_Y_Y_Y_Y_YAHAHAH_Y_Y_Y_Y_YAHAHAHAHAHAHAHAH_Y_Y_Y_Y_YAHAHAH_YAHAHAHAHAH_Y_Y_Y AHAHAHAHAHAHAHAHAHAH_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_YAH_YAHAHAHAHAHAH_Y_Y_Y_Y_YAH_YAHAHAHAH_YAHAH_YAH_Y_Y_Y AHAHAHAH_YAH_YAHAHAHAHAHAH_Y_YAHAHAHAHAHAHAHAHAHAHAHAH_Y_Y_Y_Y_Y_Y_Y_YAHAHAH_Y_YAH_Y_Y_YAHAH_Y_Y AHAHAHAHAH_Y_Y_YAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAH_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_YAHAHAH_Y_YAH_Y_YAHAHAH_Y_Y AHAHAHAHAHAH_Y_YAHAHAHAHAHAHAHAH_Y_Y_Y_Y_YAHAHAHAHAHAHAH_Y_Y_Y_YAH_YAHAHAHAH_YAH_Y_YAH_YAH_Y_Y_Y AK_Y_YAHAH_Y_Y_YAH_Y_YAHAH_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_YAHAH_Y_Y_Y_YAHAH_YAHAHAH_YAH_Y_Y_Y_YAH_Y_Y_Y_Y _Y_Y_Y_Y_YAHAHAH_YAHAH_Y_Y_Y_Y_Y_Y_Y_YAHAHAHAH_Y_Y_Y_Y_Y_Y_YAHAH_YAHAHAH_YAH_Y_Y_Y_Y_YAH_Y_Y_Y_Y _Y_Y_Y_Y_YAHAHAHAH_YAH_Y_Y_Y_Y_Y_Y_YAHAHAHAHAHAH_Y_Y_Y_Y_Y_Y_YAH_YAHAHAH_YAH_Y_Y_Y_YAHAH_Y_Y_Y_Y _Y_Y_YAH_YAHAHAHAH_Y_Y_Y_Y_Y_Y_Y_YAHAHAHAHAHAHAH_Y_Y_Y_YAHAH_Y_YAHAHAHAHAH_Y_Y_Y_YAHAH_Y_Y_Y_Y_Y _Y_Y_YAHAH_YAHAH_Y_Y_Y_YAH_Y_Y_Y_Y_Y_Y_Y_Y_YAH_Y_Y_YAH_Y_Y_Y_YAHAHAHAH_Y_Y_Y_Y_YAHAH_Y_Y_Y_Y_YAK _Y_YAHAHAHAHAH_Y_Y_Y_Y_Y_YAH_Y_Y_YAHAHAH_Y_Y_Y_Y_Y_Y_Y_Y_YAHAHAHAHAH_Y_Y_Y_Y_YAH_Y_Y_Y_Y_Y_Y_YAK _Y_YAHAHAHAHAH_Y_YAHAH_Y_Y_YAHAHAH_Y_Y_Y_Y_Y_Y_Y_YAHAHAHAHAHAHAH_Y_Y_Y_Y_Y_YAH_Y_Y_Y_Y_Y_Y_Y_7_7 _Y_Y_YAHAH_Y_YAH_YAHAHAHAHAHAHAHAHAHAH_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_YAHAH_Y_Y_Y_Y_Y_Y_Y_7_7 _Y_Y_Y_Y_Y_Y_YAHAH_YAHAHAHAH_Y_Y_Y_Y_Y_YAHAHAHAHAHAHAHAHAH_Y_Y_Y_Y_Y_Y_YAHAHAH_Y_Y_Y_Y_Y_Y_7_7_7 _Y_Y_Y_Y_Y_Y_YAHAHAH_YAHAH_Y_Y_Y_Y_Y_Y_YAHAHAH_YAHAHAHAHAHAH_Y_Y_Y_Y_YAHAHAHAH_Y_Y_Y_Y_Y_Y_7_7_7 _Y_Y_Y_Y_Y_Y_YAHAHAHAH_Y_Y_Y_Y_YAHAHAHAH_Y_Y_Y_Y_Y_YAHAHAHAH_Y_Y_Y_YAHAHAHAH_Y_Y_Y_YAH_Y_7_7_7_7 _Y_Y_Y_Y_Y_YAHAH_Y_YAHAH_YAHAHAH_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_YAHAHAHAH_Y_YAHAHAHAH_Y_Y_Y_YAHAH_7_7_7_7_7 _Y_Y_Y_Y_Y_Y_Y_YAHAH_Y_Y_Y_Y_Y_YAHAH_Y_Y_Y_Y_Y_Y_Y_Y_YAHAHAHAHAHAHAHAH_Y_Y_Y_Y_YAH_Y_Y_7_7_7_7_7 _Y_Y_Y_Y_Y_Y_Y_YAH_Y_Y_Y_Y_Y_YAHAHAHAHAHAHAHAH_Y_Y_YAHAHAHAHAHAHAHAH_Y_Y_Y_Y_Y_YAH_Y_Y_7_7_7_7_7 _Y_Y_YAH_Y_Y_Y_YAH_Y_Y_Y_Y_YAH_YAHAHAHAHAHAHAHAHAHAH_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_YAH_Y_Y_7_7_7_7_7_7 _Y_Y_Y_YAH_Y_Y_YAHAHAHAHAHAHAHAH_Y_YAHAHAHAHAHAHAH_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_YAH_Y_Y_Y_7_7_7_7_7_7 AK_Y_Y_YAH_YAH_YAH_YAHAHAHAHAHAHAHAH_Y_Y_YAHAHAH_Y_Y_Y_Y_Y_YAHAHAH_Y_Y_Y_YAH_Y_Y_Y_7_7_7_7_7_7_7 AK_Y_Y_Y_YAH_Y_YAH_Y_YAHAHAHAHAH_Y_Y_Y_Y_Y_Y_YAHAHAHAHAHAHAHAHAHAHAHAHAHAH_Y_Y_Y_7_7_7_7_7_7_7_7 AK_Y_YAH_Y_YAH_YAH_Y_Y_YAHAHAHAHAH_Y_Y_Y_YAHAH_Y_Y_Y_Y_YAHAHAHAHAHAH_Y_Y_Y_Y_Y_Y_7_7_7_7_7_7_7_7 AK_Y_YAH_Y_Y_YAHAH_Y_Y_Y_YAHAHAHAHAH_Y_Y_YAHAHAHAHAHAHAH_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_7_7_7_7_7_7_7_7_7 _7_7_Y_YAH_Y_Y_YAH_Y_Y_Y_Y_YAHAHAHAH_Y_Y_Y_YAHAHAHAHAHAHAHAHAHAHAH_Y_Y_Y_Y_Y_c_7_7_7_7_7_7_7_7_7 _7_7_Y_Y_YAH_Y_YAHAH_Y_Y_Y_YAHAHAHAH_Y_Y_Y_Y_Y_Y_YAH_Y_Y_Y_Y_YAH_Y_Y_Y_Y_Y_Y_7_7_7_7_7_7_7_7_7_7 _7_7_Y_Y_Y_YAH_YAHAHAH_Y_Y_Y_YAHAH_Y_Y_Y_YAHAHAHAH_Y_Y_Y_Y_YAH_YAH_Y_Y_Y_Y_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_Y_Y_Y_YAH_YAHAHAHAH_YAH_YAHAHAHAHAH_YAHAH_Y_YAHAHAH_Y_YAHAHAH_Y_Y_c_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_Y_Y_YAHAH_YAHAHAHAHAHAH_YAHAHAHAHAHAHAHAHAHAH_Y_YAHAHAHAHAH_Y_c_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_Y_Y_YAHAHAH_YAHAHAHAHAHAH_Y_Y_Y_Y_Y_Y_Y_Y_Y_YAHAHAHAHAHAH_Y_Y_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_Y_Y_Y_YAHAHAH_YAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAH_Y_Y_Y_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_Y_Y_Y_Y_YAHAHAH_Y_YAHAHAHAHAHAH_Y_Y_Y_Y_Y_Y_YAHAHAHAH_Y_Y_Y_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_Y_Y_Y_YAHAHAHAHAH_YAHAH_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_YAHAH_Y_Y_Y_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_Y_Y_Y_YAH_YAHAHAHAHAHAHAHAH_Y_Y_Y_Y_Y_Y_Y_YAH_Y_Y_Y_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_Y_YAH_Y_Y_YAHAHAHAH_Y_YAHAHAHAH_Y_Y_Y_Y_Y_Y_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7AH_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7AH_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 } # tile 0 (pit) { _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_j_j_z_5_j_j_j_j_z_j_j_T_n_j_z_j_j_TAE_j_j_T_n_j_j_j_j_z_j_j_TAE_j _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_z_j_8_j_f_z_j_z_j_j_z_F_j_j_j_a_$_o_T_$_a_F_z_j_j_z_j_j_z_jAE_T_j _7_7_7_7_7_7_7_7_7_7_7_7_7_7_j_j_8AL_j_8_j_j_8_8_8_F_X_o_$_8_8_8_8_8_8_FAF_8_j_8_8_8_8_8_j_TAE_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_j_z_jAP_z_a_F_8_8_8_8AF_F_T_8_8_8_8_8_8_8_8_F_a_8_8_8_8_8_8_z_j_j_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_jAE_TAPALAL_$_8_8_8_8_8_8AF_8_8_8_j_8_8_8_8_8_X_$_8_8_8_8_8_j_jAE_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_z_j_jAPALAL_j_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8_8AF_8_8_8_8_8AE_T_j_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_j_j_sAPAPALALAP_8_8_8_j_8_8AF_8_8_8_8_8_j_8_8_8AF_8_8_8_j_8_T_jAE_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_8_8_oAPAPALALAL_8_8_8_8_8_8_X_F_8_8_j_8_8_8_8_8_F_8_8_8_8_8_8_8AL_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_j_j_j_vAPAPALAL_zAF_8_8_8_8_8AFAF_8_8_8_8_8_8_8_8AF_8_8_8_8_o_j_j_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_j_z_j_vAPAP_FAL_8AF_8_8_8_8_8AF_8_8_8_8_8_8_8_8AF_8_8_8_8_F_T_$_T_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_jAE_jAL_eAPAPALALALALALAF_8AFAFAFAF_FAF_XAFAFAF_8_8AFAF_8AF_8_o_j_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_T_j_TAL_vAPAPAL_8ALALAL_8AF_8_j_j_8_8_8_8AF_8_8_8_8_8_8_8_8AE_T_$_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_jAE_T_BAL_vAPAPAL_8ALALALAL_j_8_8_8_8_8_8_8AF_8_j_8_8_8_8_8_j_T_o_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_j_z_jALALABAPAPALALALALALAL_8_8_8_8_8_8_8_8AF_$_a_8_8_8_8_8_z_j_$_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_j_8_8ALALAL_x_vAPALALALALALAL_8_8_j_8_o_8_8_8AFAF_8_8_8_8_8_8_8_8_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_j_j_jALALAL_v_p_vALALALALAL_5AL_8_F_8_8_8_8_8AF_j_8_8_8_8_8_j_j_j_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_j_z_jALALALAL_eAL_vALALALALALALAL_8_8_8_8_8_8_8AF_8_8_8_j_8_j_T_o_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_z_j_jALALALAL_bAL_pALALALALALAL_5AF_8_8_8_8AFAFAFAF_8_8_8_8_z_j_$_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_j_j_zALALALAL_v_5AL_vAPAPAPAPAPAPAPAPAPAFAFAFAFAFAFAFAFAFAF_j_j_z_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_8_8_jALALALAL_pALAL_eALALAFAPAPAPAPAPAFAPAF_zAF_8AF_F_X_FAF_s_o_j_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_j_j_j__ALALAL_vALALALATALAFAPAPAPAP_FAPAFAPAF_z_8AF_8AF_8AF_j_o_T_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_j_z_j_vALALAL_eALALAL_vAF_8APAPAPAPAPAPAPAP_z_8AF_8AF_8AF_F_T_j_$_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_j_z_jAF_eALAL_vALAL_5_F_vAPAPAPAPAPAP_zAPAPAF_zAF_8AF_8AF_8AF_5_5_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7AE_j_j_vATALAL_eATALALAL_vAPAP_FAPAPAPAPAPAFAPAFAF_8AF_z_8AF_j_j_j_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_j_T_jAPAL_vALATAL_vALAL_vAUAPAPAPAPAPAPAPAPAPAPAF_8AF_8AFAF_j_j_o_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_8_z_jALALAGAL_vAL_vALABAL_vAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAO_s_o_s_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_j_8_8ALALALAL_vALALAGAL_vALATATATATATATAFATATATATATATATATAT_j_j_T_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_j_j_jAL_5ALAL_pALAL_bALAUALATATATATATATATATATATATATATAT_FAT_z_jAE_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_j_z_jALALALAL_v_vALALALAB_vATATAT_FATATATATATAT_FATATATATAT_j_j_a_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_z_j_jALALALALAGALALALAL_F_vATATATATATATATATATATATATATATATATAE_T_$_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _j_j_z_j_z_j_j_T_j_j_8_j_j_a_j_jAE_8_8_j_j_j_j_T_o_T_j_j_T_o_T_j_o_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _j_z_j_j_j_$_a_$_o_F_j_a_$_jAE_T_8_j_j_j_a_$_a_$_8_F_j_a_$_jAE_j_s_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 } # tile 0 (spiked pit) { _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_j_j_z_5_j_j_j_j_z_j_j_T_n_j_z_j_j_TAE_j_j_T_n_j_j_j_j_z_j_j_TAE_j _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_z_j_8_j_jAE_TAE_j_TAE_8_j_j_jAE_TAE_j_TAE_8_z_j_j_z_j_j_z_jAE_T_j _7_7_7_7_7_7_7_7_7_7_7_7_7_7_j_j_8AF_j_8_T_j_z_z_z_8_8_j_T_z_z_z_z_z_z_8_8_8_j_5_z_z_z_z_j_TAE_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_TAE_TAF_5_j_z_z_z_z_z_8_8AE_z_z_z_z_z_z_z_z_8_j_z_z_z_z_z_z_z_j_j_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_jAE_jALAFAFAE_z_z_z_z_z_z_8_z_z_z_j_z_z_z_z_z_8_T_z_z_z_z_z_j_jAE_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_z_j_TALAFAF_T_z_z_z_z_z_z_8_z_z_z_z_z_z_z_z_z_8_n_z_z_z_z_zAE_T_j_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_j_jAEALALAFAFAF_z_z_z_j_z_z_8_z_z_z_z_z_j_5_z_Y_8_8_z_z_j_z_j_TAE_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_8_8_TALALAFAFAF_z_z_H_5_z_z_8_8_z_5_j_z_z_z_z_Y_8_z_z_z_z_5_5_8AL_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_j_j_j_eALALAFAFAHAF_H_H_z_z_8AF_8_HAQ_z_5_z_z_z_Y_8_z_z_z_z_j_j_j_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_j_z_j_vALAL_FAFAHAF_z_H_z_8_8AF_zAQ_H_z_z_z_z_zAQ_f_z_z_z_5_j_z_j_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_jAE_jAL_eAL_XALALAHALAF_8_8_8AFAFAF_H_8_8AFAFAF_8_Y_f_8_8_8_j_j_j_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7AE_T_jAL_vALALAF_8AQAFAF_8_j_8_j_j_5_Z_5_5AF_8_8AH_c_f_5_5_8_j_z_j_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_j_T_jAPAL_eALALAF_8_fAFAFAF_j_8_5_8_5_Z_5_5_8_8_jAHAQ_j_5_5_j_z_j_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_z_jAEALALATALALAFAH_fAFAFAF_5_5_5AH_5_5_5_5_8AE_TAHAQ_j_5_5_z_j_j_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_j_8_8ALALAL_v_eALAFAH_fAFAFAF_5_5_jAH_j_5_5_5AFAF_5AH_H_j_5_5_z_8_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_j_j_jALALAL_vAT_vAFAQ_fAFAF_5AF_5_5AH_8_5_5_5AF_j_5AH_H_j_5_j_j_j_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_j_z_jALALAL_Z_eAL_vAFAQ_HAFAFAFAF_5_5AH_5_5_5_8AF_5_5AH_c_H_j_j_z_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_z_j_jALAL_ZAL_bAL_pAFAH_HAFAFAF_5AF_5AQ_f_5AFAFAFAF_5AH_c_HAE_T_j_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_j_j_zALAL_Y_Z_v_5AL_vAPAH_HAPAPAPAPAPAPAH_fAFAFAFAFAFAFAH_c_j_TAE_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_8_8_jALALAQAL_pALAL_eALAH_fALALALALALAFAH_f_z_8_Z_8_8AH_Z_c_z_j_j_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_j_j_j__ALAL_H_vALALALATALAH_fALALAL_FALAFAH_f_z_8_Z_Z_FAH_Z_j_j_z_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_j_z_j_vALAH_Z_v_Z_ZAL_vAF_Z_c_fALALALALALAQ_f_8_8AF_Z_8AH_c_z_j_j_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_j_z_jAF_vALAH_fALAL_5_F_vALAH_c_fALAL_zALAL_H_f_8_8_8_Z_8AH_c_5_5_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_T_j_j_v_pALAQ_f_vALALAL_vAH_c_f_fALALALALAH_c_f_f_8_8_z_8AH_j_j_j_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_jAE_jAPAL_vALAH_c_fALAL_v_pAHAQ_f_jALALALALAHAQ_f_j_8_8_8AF_j_j_z_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_8_z_jALAL_eAL_c_c_fALAGAL_vAHAQ_H_jALALALALAH_c_f_jALALALALAE_T_j_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_j_8_8ALALALALATAQ_c_jAL_bALAP_c_c_H_jAPAFAPAP_c_c_H_jAPAPAP_j_TAE_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_j_j_jAL_5ALALAHAQ_H_jALABALAP_c_c_Z_zAPAPAP_c_Z_c_Z_zAP_FAP_z_j_j_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_j_z_jALALALAL_vAH_j_H_zAT_xAPAP_Z_j_j_zALAPAP_c_f_j_Z_zALAP_j_j_z_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_z_j_jALALALAL_e_f_j_V_a_F_vAPAP_f_j_j_zAPAPAP_c_f_j_j_zAPAP_z_j_j_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _j_j_z_j_z_j_j_j_TAE_8_j_j_$_o_j_j_8_8_j_j_j_j_z_j_j_j_T_j_j_j_TAE_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _j_z_j_j_j_z_j_z_j_8_j_$_a_j_s_o_X_$_j_j_a_$_a_j_8_F_j_o_s_o_s_o_j_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 } # tile 0 (zap 1 0) { _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_u_u_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_u_7_7_7_u_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_u_u_u_u_h_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_u_u_h_Q_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_l_l_l_7_u_u_h_h_N_N_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_l_l_7_u_h_h_Q_NAH_N_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_l_l_u_u_h_N_NAHAH_N_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_l_u_h_Q_N_NAH_N_N_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_l_l_u_h_N_NAH_N_Q_h_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_l_u_h_Q_N_N_N_h_u_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_u_u_h_N_NAH_N_Q_h_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_u_7_7_7_7_u_h_h_QAH_N_N_h_h_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_u_u_7_7_u_h_h_N_NAH_N_h_u_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_l_7_u_h_Q_NAHAH_N_h_u_u_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_l_u_u_h_N_NAH_N_h_h_u_u_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_l_l_h_h_QAHAH_N_u_u_u_u_u_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_l_l_h_N_NAH_N_h_l_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_u_7_7_7_l_h_h_QAH_N_h_h_l_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_u_u_7_u_h_h_h_NAH_N_h_l_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_l_7_u_h_h_Q_NAH_N_u_A_l_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_l_l_u_u_h_N_NAH_N_u_7_7_l_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_l_l_u_u_h_QAH_N_u_u_7_l_l_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_l_l_h_h_h_NAH_N_u_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_l_7_7_l_h_h_h_NAHAH_u_u_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_l_7_7_u_h_h_N_NAH_N_u_u_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_l_7_7_u_h_Q_Q_NAH_N_u_7_u_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_l_7_u_h_h_N_NAH_N_A_7_7_u_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_l_l_u_h_Q_NAHAH_N_l_l_7_7_u_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_l_h_h_N_NAH_N_u_l_l_7_7_u_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_u_u_7_u_h_Q_NAHAH_N_u_A_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_u_7_7_7_u_u_h_h_N_NAH_N_u_u_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_u_u_u_u_u_h_h_NAH_N_u_u_u_u_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_u_u_h_h_N_NAH_u_u_u_7_u_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_l_l_l_7_u_u_h_h_Q_NAH_N_u_u_u_7_u_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_l_l_7_u_h_h_h_N_NAH_N_A_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_l_l_u_u_h_Q_N_NAH_N_u_u_l_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_l_u_h_Q_N_NAHAH_N_u_l_l_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_l_l_u_h_N_N_NAH_N_u_u_l_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_l_u_i_N_NAH_N_N_u_7_l_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_u_u_h_Q_NAH_N_N_u_u_7_l_l_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_u_h_h_NAH_N_N_u_u_7_7_7_l_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_h_h_Q_NAH_N_N_u_u_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_h_Q_NAHAH_N_u_u_7_u_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_h_N_NAH_Q_h_u_u_7_u_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_h_QAHAH_N_u_u_7_u_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_N_NAH_N_h_A_u_7_u_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_N_h_h_l_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_N_h_l_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_l_l_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 } # tile 0 (zap 1 1) { _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_l_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_l_l_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_l_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_l_l_7_7_7_7_l_7_7_7_7_7_l_l_7_7_l_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_l_7_7_7_7_l_7_7_7_7_7_7_7_7_7_7_l_l_7_7_7_7_7_7_l_7_7_l_7_7_7_7_l_7_7_7_7_7_7 _7_7_7_7_l_7_7_7_7_l_7_7_7_l_l_l_7_7_7_l_7_7_7_7_7_7_l_7_7_7_7_7_l_l_7_l_l_7_7_7_7_l_7_7_7_7_7_7 _7_7_7_7_l_7_7_l_7_7_l_7_7_l_l_l_7_7_l_l_7_7_7_7_7_7_l_l_7_7_7_7_l_l_7_l_l_7_7_l_l_l_7_7_7_7_7_7 _7_7_7_7_l_7_7_l_7_7_l_7_l_l_l_l_7_7_l_l_l_7_7_7_7_7_l_l_7_7_7_7_l_7_7_l_l_7_7_l_7_l_l_7_7_7_7_7 _7_7_7_7_l_l_7_l_l_l_l_l_l_h_l_l_7_l_h_h_l_7_7_7_7_l_l_l_7_7_7_l_l_l_l_l_l_l_7_l_l_l_l_l_7_7_7_7 _7_7_7_7_l_7_l_l_h_h_h_l_h_h_l_l_l_h_Q_h_l_l_7_7_7_l_h_l_l_l_l_l_l_l_l_l_l_7_l_l_h_h_h_l_h_7_7_7 _7_7_7_7_h_h_l_h_h_Q_N_h_h_h_l_l_h_h_h_N_h_l_l_l_7_l_h_h_l_l_h_h_h_l_l_l_h_h_l_h_h_Q_N_h_h_7_7_7 _7_7_7_7_h_h_h_h_h_N_N_N_Q_h_h_h_h_N_N_Q_h_h_l_l_l_h_h_h_h_h_h_h_h_h_h_h_h_h_h_h_h_N_N_N_Q_7_7_7 _7_7_7_Q_N_Q_N_Q_N_Q_N_N_N_Q_N_Q_Q_N_N_N_N_h_h_h_h_h_Q_N_N_h_Q_N_Q_h_h_Q_N_Q_N_Q_N_Q_N_N_N_7_7_7 _7_7_7_N_N_N_N_N_N_N_N_N_N_N_N_N_Q_N_N_N_N_Q_Q_N_Q_N_N_N_N_N_N_N_N_N_Q_N_N_N_N_N_N_N_N_N_N_7_7_7 _7_7_7_NAHAH_N_N_N_N_N_N_N_N_N_N_N_N_N_N_N_N_N_Q_N_N_N_N_N_N_NAHAH_N_NAHAHAH_N_N_N_N_N_N_N_7_7_7 _7_7_7_N_NAHAHAH_NAHAH_NAH_N_NAH_N_NAH_N_N_N_N_NAHAH_N_NAHAHAH_NAHAHAH_N_NAHAHAH_NAHAH_NAH_7_7_7 _7_7_7_NAHAHAH_NAHAHAHAHAHAHAHAHAHAHAH_NAH_NAHAHAHAHAHAHAHAHAH_N_N_N_N_NAHAHAH_NAHAHAHAH_N_7_7_7 _7_7_7_N_N_N_Q_N_N_N_N_N_N_N_N_N_N_N_N_N_NAHAHAH_N_NAH_N_N_N_N_N_N_N_N_N_N_N_Q_N_N_N_N_N_N_7_7_7 _7_7_7_h_N_N_N_Q_N_N_N_N_N_N_N_N_i_N_N_N_N_N_N_N_N_N_Q_N_Q_N_N_N_Q_N_h_h_N_N_N_Q_N_N_N_N_h_7_7_7 _7_7_7_h_h_i_h_h_h_h_7_h_h_h_i_h_h_h_Q_N_h_h_N_N_h_h_h_h_h_Q_Q_i_N_Q_h_h_h_i_h_h_h_h_7_h_h_7_7_7 _7_7_7_7_7_h_7_h_h_h_7_7_h_h_h_7_7_7_h_h_h_h_h_i_h_7_h_7_h_h_h_h_h_h_7_h_7_h_h_h_h_h_7_7_7_7_7_7 _7_7_7_7_7_7_7_h_h_7_7_7_h_h_7_7_7_7_7_7_7_h_h_h_7_7_h_7_7_h_h_7_7_h_h_7_7_7_h_h_h_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_h_7_7_7_7_h_7_7_7_7_7_7_7_h_h_7_7_7_7_h_7_7_7_h_7_7_h_h_7_7_7_7_h_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_h_7_7_7_7_7_7_7_h_h_7_7_7_7_h_h_7_7_h_7_7_h_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_h_7_7_7_7_7_h_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_h_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 } # tile 0 (zap 1 2) { _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_u_u_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_u_7_7_7_u_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_h_u_u_u_u_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_Q_h_u_u_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_N_N_h_h_u_u_7_l_l_l_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_NAH_N_N_h_h_u_7_l_l_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_NAHAH_N_Q_h_u_u_l_l_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_Q_NAH_N_N_Q_h_u_l_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_h_N_NAH_N_N_h_u_l_l_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_u_h_N_N_N_N_h_u_l_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_h_Q_NAH_N_Q_h_u_u_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_h_h_Q_NAH_N_h_h_u_7_7_7_7_u_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_u_h_NAH_N_Q_h_h_u_7_7_u_u_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_u_u_h_NAHAH_N_Q_h_u_7_l_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_u_u_h_h_QAH_N_N_h_u_u_l_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_u_u_u_u_u_NAHAH_Q_h_h_l_l_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_A_h_NAH_N_N_h_l_l_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_l_h_h_NAH_Q_h_h_l_7_7_7_u_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_l_h_NAH_N_h_h_h_u_7_u_u_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_l_l_u_NAH_N_N_i_h_u_7_l_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_l_7_7_u_NAH_N_Q_h_u_u_l_l_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_l_l_7_u_u_NAH_N_h_u_u_l_l_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_u_NAH_N_h_h_h_l_l_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_u_uAHAH_N_i_h_h_l_7_7_l_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_u_u_NAH_N_Q_h_h_u_7_7_l_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_u_7_u_NAH_N_N_Q_h_u_7_7_l_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_u_7_7_A_NAH_N_N_h_h_u_7_l_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_u_7_7_l_l_NAHAH_N_N_h_u_l_l_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_u_7_7_l_l_u_NAH_N_Q_h_h_l_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_l_u_NAHAH_N_N_h_u_7_u_u_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_u_u_NAH_N_Q_h_h_u_u_7_7_7_u_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_u_u_u_u_NAH_N_h_h_u_u_u_u_u_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_u_7_u_u_uAH_N_N_h_h_u_u_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_u_7_u_u_u_NAH_N_N_h_h_u_u_7_l_l_l_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_A_NAH_N_Q_h_h_h_u_7_l_l_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_l_u_u_NAH_N_N_Q_h_u_u_l_l_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_l_l_u_NAHAH_N_N_Q_h_u_l_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_l_u_u_NAH_N_N_N_h_u_l_l_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_l_7_u_N_NAH_N_Q_h_u_l_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_l_l_7_u_u_N_NAH_N_N_h_u_u_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_l_7_7_7_u_u_N_NAH_Q_h_h_u_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_u_u_N_NAH_N_N_h_h_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_u_7_u_u_NAHAH_N_Q_h_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_u_7_u_u_h_NAH_N_N_h_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_u_7_u_u_NAHAH_Q_h_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_u_7_u_l_h_NAH_N_N_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_A_h_h_N_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_l_h_N_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_l_l_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 } # tile 0 (zap 1 3) { _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_u_u_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_u_7_7_7_u_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_h_u_u_u_u_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_Q_h_u_u_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_N_N_h_h_u_u_7_l_l_l_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_NAH_N_N_h_h_u_7_l_l_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_NAHAH_N_Q_h_u_u_l_l_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_Q_NAH_N_N_Q_h_u_l_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_h_N_NAH_N_N_h_u_l_l_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_u_h_N_N_N_N_h_u_l_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_h_Q_NAH_N_Q_h_u_u_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_h_h_Q_NAH_N_h_h_u_7_7_7_7_u_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_u_h_NAH_N_Q_h_h_u_7_7_u_u_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_u_u_h_NAHAH_N_Q_h_u_7_l_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_u_u_h_h_QAH_N_N_h_u_u_l_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_u_u_u_u_u_NAHAH_Q_h_h_l_l_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_A_h_NAH_N_N_h_l_l_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_l_h_h_NAH_Q_h_h_l_7_7_7_u_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_l_h_NAH_N_h_h_h_u_7_u_u_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_l_l_u_NAH_N_N_i_h_u_7_l_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_l_7_7_u_NAH_N_Q_h_u_u_l_l_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_l_l_7_u_u_NAH_N_h_u_u_l_l_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_u_NAH_N_h_h_h_l_l_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_u_uAHAH_N_i_h_h_l_7_7_l_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_u_u_NAH_N_Q_h_h_u_7_7_l_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_u_7_u_NAH_N_N_Q_h_u_7_7_l_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_u_7_7_A_NAH_N_N_h_h_u_7_l_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_u_7_7_l_l_NAHAH_N_N_h_u_l_l_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_u_7_7_l_l_u_NAH_N_Q_h_h_l_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_l_u_NAHAH_N_N_h_u_7_u_u_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_u_u_NAH_N_Q_h_h_u_u_7_7_7_u_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_u_u_u_u_NAH_N_h_h_u_u_u_u_u_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_u_7_u_u_uAH_N_N_h_h_u_u_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_u_7_u_u_u_NAH_N_N_h_h_u_u_7_l_l_l_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_A_NAH_N_Q_h_h_h_u_7_l_l_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_l_u_u_NAH_N_N_Q_h_u_u_l_l_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_l_l_u_NAHAH_N_N_Q_h_u_l_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_l_u_u_NAH_N_N_N_h_u_l_l_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_l_7_u_N_NAH_N_Q_h_u_l_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_l_l_7_u_u_N_NAH_N_N_h_u_u_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_l_7_7_7_u_u_N_NAH_Q_h_h_u_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_u_u_N_NAH_N_N_h_h_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_u_7_u_u_NAHAH_N_Q_h_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_u_7_u_u_h_NAH_N_N_h_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_u_7_u_u_NAHAH_Q_h_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_u_7_u_l_h_NAH_N_N_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_A_h_h_N_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_l_h_N_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_l_l_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 } # tile 0 (sub mine walls 0) { _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_5ACACACACACACACACACACACACAC_5_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACAC_G_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACAC_G_G_G_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACAC_G_G_G_G_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACAC_G_G_G_G_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACAC_G_G_G_G_G_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACAC_G_G_G_G_G_G_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACAC_GANAN_G_G_G_G_G_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACAC_GANANANAN_G_G_G_G_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACAC_GANANANAN_G_G_G_G_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACAC_GANANANANAN_G_G_G_G_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACAC_G_G_GANANANAN_G_G_G_G_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACAC_G_1_1ANANANANAN_G_G_G_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACAC_G_1_1_1_1ANANANAN_G_G_G_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACAC_G_G_1_1_1_1ANANANANAN_G_G_G_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACAC_G_GAN_1_1_1_1_1_1ANANANAN_G_G_G_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACAC_G_G_G_GAN_1_1_1_1_1ANANANANAN_G_G_G_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACAC_G_G_G_GANANAN_1_1_1_1ANANANAN_G_G_G_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACAC_G_G_G_GANANANAN_1_1_1ANANANANAN_G_G_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACAC_G_G_G_G_GANANANAN_1_1_1_1ANANANAN_G_G_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACAC_G_G_G_GANANANAN_1_1_1_1_1ANANANAN_G_G_G_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACAC_G_G_G_G_G_GANANANAN_1_1_1_1ANANANAN_G_G_G_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACAC_G_G_G_G_G_GANANANAN_1_1_1_1ANANANANAN_G_G_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACAC_G_G_G_G_G_G_GANANAN_1_1_1_1_GANANANAN_G_G_G_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACAC_G_1_1_G_G_G_G_GANANANAN_1_1_1_GANANANAN_G_G_G_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACAC_1_1_1AN_G_G_G_G_GANANAN_1_1_1_GANANANAN_G_G_G_7 _7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACAC_1_1_1ANAN_G_G_G_GANANANAN_1_1_1ANANANAN_G_G_G_7 _7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACAC_1_1_1ANAN_G_G_G_G_GANANAN_1_1_1ANANANAN_G_G_G_7 _7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACAN_1_1_1ANAN_G_G_G_GANANANAN_1_1ANANANANAN_G_G_7 _7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACAN_1_1_1ANAN_G_G_G_G_GANANANAN_1_1ANANANAN_G_G_G _7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACAN_1_1_1ANANAN_G_G_G_G_GANANAN_1_1ANANANAN_G_G_7 _7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACAC_GANAN_1_1ANANANAN_G_G_G_G_GANAN_1_1ANANANAN_G_7_7 _7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPANAN_1_1_1ANANANAN_G_G_G_GANAN_1_1ANANANAN_7_7_7 _7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPANAN_1_1_1ANANANAN_G_G_G_G_GAN_1_1ANANAN_7_7_7_7 _7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAP_GANAN_1_1_1ANANANANAN_G_G_G_GANAN_1ANANAN_7_7_7_7 _7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_GAN_1_1_1ANANANAN_G_G_G_G_GANAN_1_1ANAN_7_7_7_7 _7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_GANAN_1_1ANANANANAN_G_G_G_GANAN_1_1AN_7_7_7_7_7 _7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_GAN_1_1_1ANANANAN_G_G_G_GANAN_1_1AN_7_7_7_7_7 _7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_GAN_1_1ANANANAN_G_G_G_GANANAN_1AN_7_7_7_7_7 _7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_GAN_1_1ANANANAN_G_G_G_G_GANAN_1_7_7_7_7_7_7 _7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_GAN_1_1ANANANANAN_G_G_G_GANAN_7_7_7_7_7_7_7 _7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_GAN_1_1ANANANAN_G_G_G_GAN_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_GAN_1_1ANANANAN_G_G_G_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_G_1_1ANANANAN_G_G_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_G_1_1ANANANAN_G_G_7_7_7_7_7_7_7_7_7_7_7 _7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_GAN_1ANANANAN_G_G_7_7_7_7_7_7_7_7_7_7_7 _7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_GAN_1_1ANANAN_G_G_7_7_7_7_7_7_7_7_7_7_7 _7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_GANAN_1ANANANAN_G_7_7_7_7_7_7_7_7_7_7_7 _7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_GANANANANANANANAN_7_7_7_7_7_7_7_7_7_7_7 _7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_GANANANANANAN_1_7_7_7_7_7_7_7_7_7_7_7 _7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_GANANAN_1_1_1_1_7_7_7_7_7_7_7_7_7_7_7 _7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_GANANAN_1_1_1_7_7_7_7_7_7_7_7_7_7_7 _7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_GANANAN_1_1_1_7_7_7_7_7_7_7_7_7_7_7 _7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_GANANAN_1_7_7_7_7_7_7_7_7_7_7_7_7 _7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_GANANANAN_7_7_7_7_7_7_7_7_7_7_7_7 APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_G_GANAN_7_7_7_7_7_7_7_7_7_7_7_7_7 APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_GANAN_7_7_7_7_7_7_7_7_7_7_7_7_7 APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_GANAN_7_7_7_7_7_7_7_7_7_7_7_7_7 APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_GAN_7_7_7_7_7_7_7_7_7_7_7_7_7_7 APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_GAN_7_7_7_7_7_7_7_7_7_7_7_7_7_7 APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_G_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 } # tile 0 (sub mine walls 1) { _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7ACACACACACAC_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACAC_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACAC_7_7_7_7_7ACACACACACACACACACACAC_7_7_7_7 _7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACAC_v_v_7_7_7 _7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACAT_e_p_v_7_7 _7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACAC_v_v_vAG_7_7 _7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACAT_eAT_b_7_7 _7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACAC_v_e_bAG_v_7_7 _7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACAG_vAT_eAT_v_7_7 _7_7_7_7_7_7_7ACACACACACACACACACACACACACACACAC_G_G_G_GACANANACACACACACACACACAC_vAT_v_e_b_eAT_7_7 _7_7_7_7_7_7ACACACAC_G_G_G_G_G_G_G_GACACAC_G_G_G_G_G_GANANANANACACACACACACACAC_e_v_p_bAUAB_v_7_7 _7_7_7_7_7_7ACAC_G_G_G_G_G_G_G_G_G_GANAN_G_G_G_G_G_G_GANANANANACACACACACACAC_vAT_v_e_vAB_M_e_7_7 _7_7_7_7_7_7AC_G_G_G_G_G_G_G_G_G_GANANANAN_G_G_G_G_G_GANANANANANANANACACACAT_v_eAT_eAT_v_vAT_7_7 _7_7_7_7_7_7_G_G_G_G_G_G_G_G_G_G_GANANANANAN_G_G_G_G_GANANANANANANANAN_GAC_e_vAT_v_vAG_v_p_v_7_7 _7_7_7_7_7_7_G_G_G_G_G_G_G_G_G_GANANANANANANAN_G_G_G_GANANANANANANANAN_G_G_G_p_vAG_vAT_e_v_7_7_7 _7_7_7_7_7_7_G_G_G_G_G_G_G_G_G_GANANANANANAN_G_G_G_G_GANANANANANANAN_G_G_G_G_v_eAT_v_vAT_e_7_7_7 _7_7_7_7_7_7_7_G_G_G_G_G_G_G_G_GANANANANAN_G_G_G_G_G_GANANANANANAN_G_G_G_G_GAT_b_eATAG_v_v_7_7_7 _7_7_7_7_7_7_7_G_G_G_G_G_G_G_G_GANANANAN_G_G_G_G_G_G_GANANANANANANAN_G_G_G_G_e_vAT_v_v_p_v_7_7_7 _7_7_7_7_7_7_7_G_G_G_G_G_G_G_G_GANANAN_G_G_G_G_G_G_G_G_GANANANANANAN_G_G_G_GAT_bAG_vAG_b_e_7_7_7 _7_7_7_7_7_7_7_G_G_G_G_G_G_G_G_GANANAN_G_G_G_G_G_G_G_G_G_GANANANANAN_G_G_G_G_e_vAT_vAT_eAT_7_7_7 _7_7_7_7_7_7_G_G_G_G_G_G_G_G_G_GANANAN_G_G_G_G_G_G_G_G_G_GANANANANAN_G_G_G_GAT_bAG_vAG_v_v_7_7_7 _7_7_7_7_7_7_G_G_G_G_G_G_G_G_GANANANAN_G_G_G_G_G_G_G_G_G_GANANANANAN_G_G_G_G_e_vAT_vAT_v_p_7_7_7 _7_7_7_7_7_7_G_G_G_G_G_G_G_G_GANANANAN_G_G_G_G_G_G_G_G_G_GANANANANAN_G_G_G_GAT_bAG_vAG_v_e_v_7_7 _7_7_7_7_7_7_G_G_G_G_G_G_G_G_GANANANAN_G_G_G_G_G_G_G_G_GANANANANANAN_G_G_G_G_e_vAT_vAT_vAT_e_7_7 _7_7_7_7_7_7_G_G_G_G_G_G_G_G_GANANANAN_G_G_G_G_G_G_G_GANANANANANAN_G_G_G_G_GAT_vAG_v_eAT_e_b_7_7 _7_7_7_7_7_7_G_G_G_G_G_G_G_GANANANANANAN_G_G_G_G_G_G_GANANANANANAN_G_G_G_G_G_e_bAT_vAB_xAT_vAG_7 _7_7_7_7_7_7_G_G_G_G_G_G_G_GANANANANANAN_G_G_G_G_G_G_GANANANANANAN_G_G_G_G_GAT_vAG_vAU_v_xAB_b_7 _7_7_7_7_7_7_G_G_G_G_G_G_GANANANANANANAN_G_G_G_G_G_G_GANANANANANAN_G_G_G_G_G_e_vAT_eAT_eAT_vAU_v _7_7_7_7_7_G_G_G_G_G_G_G_GANANANANANANAN_G_G_G_G_G_G_GANANANANANAN_G_G_G_G_G_bAU_vAB_v_v_xAB_v_7 _7_7_7_7_7_G_G_G_G_G_G_G_GANANANANANANAN_G_G_G_G_G_G_GANANANANANAN_G_G_G_G_vAB_vAG_bAUAB_vAU_v_7 _7_7_7_7_G_G_G_G_G_G_G_G_GANANANANANANAN_G_G_G_G_G_G_GANANANANANAN_G_G_G_GAU_vAU_bAB_vAU_vAB_7_7 _7_7_7_7_G_G_G_G_G_G_G_G_GANANANANANANAN_G_G_G_G_G_G_GANANANANANAN_G_G_G_G_vAB_vAG_bAUAVAT_x_7_7 _7_7_7_7_G_G_G_G_G_G_G_G_GANANANANANAN_G_G_G_G_G_G_G_GANANANANANAN_G_G_G_G_vAU_vAT_vAB_b_e_7_7_7 _7_7_7_7_G_G_G_G_G_G_G_G_GANANANANANAN_G_G_G_G_G_G_G_GANANANANANAN_G_G_G_vAB_vAB_xAU_vAGAT_7_7_7 _7_7_7_7_G_G_G_G_G_G_G_G_GANANANANAN_G_G_G_G_G_G_G_G_GANANANANANAN_G_G_G_p_vAU_eATAWAT_v_7_7_7_7 _7_7_7_7_G_G_G_G_G_G_G_GANANANANANAN_G_G_G_G_G_G_G_G_GANANANANANAN_G_G_G_v_vAB_b_e_vAG_b_7_7_7_7 _7_7_7_7_G_G_G_G_G_G_G_GANANANANAN_G_G_G_G_G_G_G_G_GANANANANANANAN_G_G_GABAU_vAU_vAT_v_7_7_7_7_7 _7_7_7_7_G_G_G_G_G_G_G_GANANANANAN_G_G_G_G_G_G_G_G_GANANANANANANAN_G_G_G_v_vAB_vAB_x_p_7_7_7_7_7 _7_7_7_7_G_G_G_G_G_G_G_GANANANANAN_G_G_G_G_G_G_G_G_GANANANANANANAN_G_G_v_p_vAU_vAU_v_7_7_7_7_7_7 _7_7_7_7_G_G_G_G_G_G_GANANANANANAN_G_G_G_G_G_G_G_GANANANANANANANAN_G_G_v_e_vAB_vAB_v_7_7_7_7_7_7 _7_7_7_G_G_G_G_G_G_G_GANANANANAN_G_G_G_G_G_G_G_G_GANANANANANANANAN_G_G_eAT_vAU_vAU_7_7_7_7_7_7_7 _7_7_7_G_G_G_G_G_G_G_GANANANANAN_G_G_G_G_G_G_G_GANANANANANANANAN_G_G_GAT_vAB_vAB_v_7_7_7_7_7_7_7 _7_7_7_G_G_G_G_G_G_G_GANANANANAN_G_G_G_G_G_G_G_GANANANANANANANAN_G_G_G_vAG_vAU_v_7_7_7_7_7_7_7_7 _7_7_7_G_G_G_G_G_G_G_GANANANAN_G_G_G_G_G_G_G_GANANANANANANANAN_G_G_G_G_vAT_vAB_v_7_7_7_7_7_7_7_7 _7_7_G_G_G_G_G_G_G_GANANANANAN_G_G_G_G_G_G_G_GANANANANANANANAN_G_G_G_GAT_e_vAU_7_7_7_7_7_7_7_7_7 _7_7_G_G_G_G_G_G_G_GANANANAN_G_G_G_G_G_G_G_G_GANANANANANANANAN_G_G_G_v_eAT_v_e_7_7_7_7_7_7_7_7_7 _7_7_G_G_G_G_G_G_G_GANANANAN_G_G_G_G_G_G_G_GANANANANANANANANAN_G_G_G_G_b_eAT_7_7_7_7_7_7_7_7_7_7 _7_7_G_G_G_G_G_G_GANANANAN_G_G_G_G_G_G_G_GANANANANANANANANAN_G_G_G_G_GAB_v_v_7_7_7_7_7_7_7_7_7_7 _7_G_G_G_G_G_G_GANANANANAN_G_G_G_G_G_G_G_GANANANANANANANANAN_G_G_G_GAU_vAU_7_7_7_7_7_7_7_7_7_7_7 _G_G_G_G_G_G_GANANANANAN_G_G_G_G_G_G_G_GANANANANANANANANAN_G_G_G_G_G_vAB_v_7_7_7_7_7_7_7_7_7_7_7 _G_G_G_G_G_G_GANANANAN_G_G_G_G_G_G_G_GANANANANANANANANAN_G_G_G_G_G_GAU_v_7_7_7_7_7_7_7_7_7_7_7_7 _G_G_G_G_G_GANANANANAN_G_G_G_G_G_G_G_GANANANANANANANANAN_G_G_G_G_G_vAB_v_7_7_7_7_7_7_7_7_7_7_7_7 _G_G_G_G_GANANANANAN_G_G_G_G_G_G_G_G_GANANANANANANANANAN_G_G_G_G_GAU_v_7_7_7_7_7_7_7_7_7_7_7_7_7 _G_G_G_GANANANANANAN_G_G_G_G_G_G_G_GANANANANANANANANANAN_G_G_G_G_G_vAB_7_7_7_7_7_7_7_7_7_7_7_7_7 _G_G_G_GANANANANANAN_G_G_G_G_G_G_G_GANANANANANANANANANAN_G_G_G_GAT_v_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _G_G_G_GANANANANANAN_G_G_G_G_G_G_G_GANAN_7_7_7_7_7_7_7AN_G_G_G_G_e_v_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _G_G_G_G_G_7_7ANANAN_G_G_G_G_G_G_G_GAN_7_7_7_7_7_7_7_7_7_7_G_G_GAT_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _G_G_7_7_7_7_7_7_7_7_7_G_G_G_G_G_G_7_7_7_7_7_7_7_7_7_7_7_7_7_G_G_v_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _G_7_7_7_7_7_7_7_7_7_7_7_G_G_G_G_G_7_7_7_7_7_7_7_7_7_7_7_7_7_G_G_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 } # tile 0 (sub mine walls 2) { _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACAC_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACAC_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACAC_v_vAC_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACAT_e_p_v_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACACAC_v_v_vAG_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACACACACAG_v_p_b_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACACACAC_vAT_v_e_b_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACACACAC_vAT_e_vAUAB_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACACACAC_vAG_vAT_vAB_M_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACACACACAT_vAT_e_vAU_v_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACACACAC_v_e_vAG_bAB_vAB_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACACACAC_eAT_eAT_vAT_vAU_v_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACAN_GAC_b_vAT_e_vAG_vAB_v_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACANANAN_G_G_GAG_v_eAT_vAT_vAU_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACANANANAN_G_G_G_G_GAT_v_e_vAG_vAB_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACANANANANANAN_G_G_G_G_G_G_e_vAUAB_bAU_v_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACAC_GANANANANANANAN_G_G_G_G_bAT_vAB_MAB_v_e_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACAC_G_GANANANANANAN_G_G_G_G_v_eAU_b_e_vAT_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACAC_G_G_GANANANANAN_G_G_G_GAB_vAB_vAT_e_v_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACAC_G_G_G_GANANANANAN_G_G_G_GAU_vAU_v_eAT_v_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACAC_G_G_G_GANANANANAN_G_G_G_G_vAB_vAT_v_eAT_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACAC_G_G_G_GANANANANAN_G_G_G_G_vAU_vAG_vAT_e_v_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACAC_G_G_G_GANANANANANAN_G_G_G_GAB_vAT_vAG_vAT_e_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACAC_G_G_GANANANANANAN_G_G_G_G_GAU_vAG_vAT_b_e_b_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACAC_G_G_GANANANANANAN_G_G_G_G_G_vAB_bAU_e_vAT_eAT_7 _7_7_7_7_7_7_7_7_7_7_7_7AC_v_vAB_v_vAU_vAB_v_vAC_G_G_GANANANANANAN_G_G_G_G_G_vAT_e_vAB_bAG_v_v_7 _7_7_7_7_7_7_7_7_7_7_7_7_v_p_eAU_vAB_vAT_eAUAB_v_G_G_GANANANANANAN_G_G_G_G_G_e_vAT_vAU_vAT_eAT_e _7_7_7_7_7_7_7_7_7_7_7_7AG_v_v_vAT_xAT_e_v_v_vAU_G_G_GANANANANANAN_G_G_G_G_G_vAT_e_vAB_vAB_v_v_v _7_7_7_7_7_7_7_7_7_7_7_7_bAT_eAT_e_v_eAT_v_p_vAB_G_G_GANANANANANAN_G_G_G_G_v_p_v_eAT_xAU_vAUAB_7 _7_7_7_7_7_7_7_7_7_7_7AT_vAG_v_v_eAT_bAG_vAWAU_v_G_G_GANANANANANAN_G_G_G_GAT_e_vAU_vAB_vAB_v_7_7 _7_7_7_7_7_7_7_7_7_7_7_e_vAT_v_p_v_vAG_bAT_e_bAB_G_G_GANANANANANAN_G_G_G_G_v_v_p_v_vAU_vAU_v_7_7 _7_7_7_7_7_7_7_7_7_7_vAT_bAG_v_eAT_eAT_vAB_vAU_v_G_G_GANANANANANAN_G_G_G_GAT_e_v_p_vAB_vAB_7_7_7 _7_7_7_7_7_7_7_7_7_7_e_vAG_bAT_v_vAT_e_vAU_vAB_v_G_G_GANANANANANAN_G_G_G_v_eAT_v_e_vAU_vAU_7_7_7 _7_7_7_7_7_7_7_7_7_7_vAT_v_p_v_eAT_e_vAT_vAB_vAU_G_G_GANANANANANAN_G_G_G_eAT_v_eAT_vAB_v_7_7_7_7 _7_7_7_7_7_7_7_7_7_v_p_e_v_vAG_b_eAT_vAG_vAU_vAB_G_G_GANANANANANAN_G_G_G_b_eAT_v_eAT_vAG_7_7_7_7 _7_7_7_7_7_7_7_7_7AG_v_vAT_eAT_vAT_vAG_vATAVAU_v_G_GANANANANANANAN_G_G_G_vAT_e_vAT_e_v_7_7_7_7_7 _7_7_7_7_7_7_7_7_vAT_vAG_b_vAG_v_eAT_vAT_e_vAB_v_G_GANANANANANANAN_G_G_G_e_vAT_e_vAT_v_7_7_7_7_7 _7_7_7_7_7_7_7_7_v_eAT_v_p_vAT_vAT_e_v_e_vAU_vAU_v_GANANANANANANAN_G_GAT_vAT_e_vAT_e_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AT_v_e_v_e_vAG_v_vAT_vAT_eAB_vAB_vANANANANANANANAN_G_G_e_vAG_bAT_e_b_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_xAB_v_p_vAT_v_p_v_eAUAB_v_vAT_vAUANANANANANANANAN_G_G_vAT_vAT_e_v_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_vAU_v_vAG_vAB_vAG_b_v_vAUAB_xAB_v_vANANANANANANAN_G_G_eAT_e_vAT_e_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_vAB_v_p_vAT_xAT_v_p_v_p_v_v_vAU_v_pANANANANANANAN_G_G_b_e_bAG_v_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_v_p_vAUAW_vAG_v_e_v_vAG_v_p_eAT_e_v_v_eANANANANANAN_G_GAT_vAT_vAT_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7AB_v_e_b_eAT_v_p_bABAU_bAB_v_v_v_v_p_vATANANANANANAN_G_G_vAG_v_e_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_vAUAB_bAU_v_e_vAU_v_vAB_MAUABAUAB_v_e_vANANANANANAN_G_v_p_vAT_e_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_eAT_v_xATAW_p_bAB_vAB_vAU_vAB_v_v_xAT_vATANANANANANANAN_G_v_e_v_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_v_eAT_e_v_e_bAG_bAU_vAG_bAB_MABAUAB_vAG_vANANANANANANAN_GAT_v_p_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7AT_b_eAT_vAT_eAT_b_eAT_bAB_vAU_v_vAU_v_v_p_vANANANANANANANAG_v_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_v_eAT_v_eAT_e_b_eAT_e_vAG_bAUAVAB_vAB_vAUAW_vAN_GANANANANAN_bAB_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7AT_e_v_p_v_v_eAT_b_eAT_vAT_vAB_vAU_vAU_vAB_v_p_GANANANANANAN_v_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_v_e_bAB_xABAU_b_e_vAT_e_vAG_vAU_vAB_vAB_vAU_v_e_GANANANANAN_vAU_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_bABAU_vAU_v_b_eAT_v_eAT_vAT_vAB_vAU_vAU_vAB_vAT_vANANANAN_vAB_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_e_b_vAB_vABAU_vAB_vAUAW_e_vAU_vAB_vAB_vAU_vAG_vAB_GANAN_GAU_v_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_vAU_bABAU_vAU_vAB_vAU_vAB_vAT_vAB_vAU_vAU_vAB_vAT_vAU_v_G_GAB_v_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_vAB_vAB_MAB_vAB_vAU_vAB_vAU_vAG_vAU_vAB_vAB_vAU_v_eAT_v_eAT_G_vAU_7_7_7_7_7_7_7_7_7_7_7_7_7_7 AB_vAU_vAU_vAU_vAU_vAB_vAU_vAB_vAT_vAB_vAU_vAU_vAB_vAB_v_eAT_v_e_v_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _vAUAVAB_vAB_vAB_vAU_v_eAT_vAU_vAG_vAU_vAB_vAB_vAU_vAU_vAT_e_vAT_e_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7AB_vAU_vAU_vAU_vAB_vAT_v_e_vAB_vAT_vAB_vAU_vAU_vAB_bAG_v_v_p_v_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 } # tile 0 (sub mine walls 3) { _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7ACACACACACAC_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7ACACACACACACACACACAC_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7ACACACACACACACACACACACAC_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACAC_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACAC_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACAC_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACAC_1_1_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACANAN_1AN_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACANANAN_1AN_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACANAN_1AN_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7ACACACACACACANANACACACACACACACACACACANAN_1_1AN_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7ACAC_G_G_GANANAN_GACACACACACACACACACACAN_1_1ANAN_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_G_G_G_GANAN_1AN_G_GACACACACACACACACACANAN_1_1AN_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_G_G_G_GANAN_1AN_G_GACACACACACACACACACAC_G_G_1_1AN_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_G_G_G_GANAN_1AN_G_G_GACACACACACACACACAC_G_G_G_1AN_1_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_G_G_G_GAN_1ANAN_G_G_GACACACACACACACACAC_G_G_G_1AN_1ANAN_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_G_G_G_GAN_1AN_G_G_G_GACACACACACACACACAC_G_G_G_G_1AN_1ANAN_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_G_G_G_GAN_1AN_G_G_G_GACACACACACACACACAC_G_G_G_G_1_1_1ANAN_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_G_G_GAN_1_G_G_G_G_GACACACACACACACACACANAN_G_G_G_G_1ANANANAN_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_G_G_G_G_1_1_G_G_G_GACACACACACACACACACAC_1AN_G_G_G_G_G_1_GANAN_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_G_G_GAN_1_G_G_G_GACACACACACACACACACACAC_1AN_1_G_G_G_G_1_GANANAN_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_G_G_G_GAN_1_G_GACACACACACACACACACACACACAC_1_1ANANAN_G_G_1_1_GANANAN_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_G_G_G_GAN_1_GACACACACACACACACACACACACACACAN_1ANANANAN_G_1AN_1ANANAN_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_G_G_G_GAN_1_GACACACACACACACACACACACACACACAN_1_1ANANAN_G_1_1AN_1ANAN_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_G_G_GAN_1_GACACACACACACACACACACACACACACACAN_1_1ANANANAN_G_1_1_1_GANAN_7_7_7_7_7_7_7_7_7_7 _7_7_7_G_G_GAN_1_GACACACACACACACACACACACACACAC_GANAN_1_1ANANAN_G_G_G_1_G_GAN_7_7_7_7_7_7_7_7_7_7 _7_7_7_G_G_GAN_1APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPANAN_1_1ANANAN_G_G_G_1_1_GAN_7_7_7_7_7_7_7_7_7_7 _7_7_7_G_GAN_1_GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPANAN_1_1_1ANAN_GAN_GAN_1_G_GAN_7_7_7_7_7_7_7_7_7 _7_7_7_G_GAN_1_GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_GANAN_1_1_1ANAN_GAN_GAN_1_G_GAN_7_7_7_7_7_7_7_7_7 _7_7_7_GANAN_1_GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_GAN_1_1_1_1AN_GAN_GAN_G_1_GAN_7_7_7_7_7_7_7_7_7 _7_7_7_GAN_1_G_GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_GANAN_1_1_1ANAN_GANAN_G_1_GANAN_7_7_7_7_7_7_7_7 _7_7_G_GAN_1_GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_GAN_1_1_1_1AN_GAN_GAN_1_GANAN_7_7_7_7_7_7_7_7 _7_7_G_G_1AN_GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_GAN_1_1_1AN_GAN_GAN_1_1_GAN_7_7_7_7_7_7_7_7 _7_7_G_G_1ANAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_GAN_1_1_1AN_GAN_GAN_1_1_GANAN_7_7_7_7_7_7_7 _7_7_G_1_1ANAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_GAN_1_1_1ANAN_GAN_G_1_G_1ANAN_7_7_7_7_7_7_7 _7_7_G_1ANANAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_GAN_1_1_1AN_GAN_G_1_1_1AN_7_7_7_7_7_7_7_7 _7_7_G_1AN_G_GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_GAN_1_1_1_1AN_G_G_1_1_1_7_7_7_7_7_7_7_7_7 _7_G_G_1_G_G_GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_G_1_1AN_1AN_G_G_1_1_7_7_7_7_7_7_7_7_7_7 _7_G_G_1_G_GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_G_1_1ANAN_1AN_G_1_1_7_7_7_7_7_7_7_7_7_7 _7_GAN_1APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_GAN_1_1AN_1AN_G_1_7_7_7_7_7_7_7_7_7_7_7 _7_GANANAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_GAN_1_1AN_1AN_G_G_7_7_7_7_7_7_7_7_7_7_7 _7ANANAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_GANAN_1ANAN_1AN_G_7_7_7_7_7_7_7_7_7_7_7 _GAN_GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_GANANAN_1AN_1ANAN_7_7_7_7_7_7_7_7_7_7_7 ANAN_GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_GANAN_1AN_1AN_1_7_7_7_7_7_7_7_7_7_7_7 _G_G_GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_GANANAN_1_1_1_1_7_7_7_7_7_7_7_7_7_7_7 _G_G_GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_GANAN_1AN_1_1_7_7_7_7_7_7_7_7_7_7_7 _G_GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_GANANAN_1_1_1_7_7_7_7_7_7_7_7_7_7_7 _GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_GANAN_1AN_7_7_7_7_7_7_7_7_7_7_7_7 _GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_GANAN_1AN_7_7_7_7_7_7_7_7_7_7_7_7 _GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_G_GANAN_7_7_7_7_7_7_7_7_7_7_7_7_7 APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_GANAN_7_7_7_7_7_7_7_7_7_7_7_7_7 APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_GANAN_7_7_7_7_7_7_7_7_7_7_7_7_7 APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_GAN_7_7_7_7_7_7_7_7_7_7_7_7_7_7 APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_GAN_7_7_7_7_7_7_7_7_7_7_7_7_7_7 APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_G_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 } # tile 0 (sub mine walls 4) { _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACAC_5_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACAC_G_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACAC_G_G_G_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACAC_G_G_G_G_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACAC_G_G_G_G_G_G_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ANACACACACACACACACACAC_G_G_G_G_G_G_G_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ANANACACACACACACACACAC_G_G_G_G_G_GACACAC_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ANANANACACACACACACACACACAC_G_G_GACACACACACAC_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ANANANACACACACACACACACACACACACACACACACACAC_v_vAC_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ANANACACACACACACACACACACACACACACACACACACACAC_p_v_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ANANANACACACACACACACACACACACACACACACACACACACAC_vAG_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ANANANACACACACACACACACACACACACACACACACACACAC_eAT_b_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ANANAN_G_GACACACACACACACACACACACACACACACACAC_v_eAT_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ANANAN_G_G_G_GACACACACACACACACACACACACACACAC_v_p_v_v_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ANANAN_G_G_G_G_1_G_GACACACACACACACACACACACAC_v_eAT_e_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACANANAN_G_G_G_G_1_1_G_GACACACACACACACACACACAT_eAT_v_v_8_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACANAN_G_G_G_G_G_1_1_G_G_GACACACACACACACACAC_v_vAG_b_p_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ANANAN_G_G_G_G_1_1_G_G_G_GANANACACACACACAC_v_p_vAT_e_v_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ANANAN_G_G_G_G_1_1_G_G_G_GANANAN_GACACAC_vAG_v_vAG_bAT_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ANANAN_G_G_G_G_1_1_G_G_G_GANANAN_G_G_G_eAT_v_p_vAT_v_e_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACANANAN_G_G_G_G_1_G_G_G_GANANAN_1_1_1_1_b_e_v_vAG_vAB_v_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ANANAN_G_G_G_G_G_1_G_G_G_GANANANAN_1_1_1AB_bAUAB_bAU_vAU_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ANANAN_G_G_G_G_1_1_G_G_G_G_GANANAN_1_1_1_vAUAVAU_vAB_vAB_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ANANAN_G_G_G_G_1_1_G_G_G_G_G_GANAN_1_1_1_1_vAB_vAB_vAU_v_G_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACANANAN_G_G_G_G_1_1_G_G_G_G_G_GANANANAN_1_1AU_vAU_vAUAVAT_G_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACANANAN_G_G_G_G_1_1AN_G_G_G_G_GANANANANAN_1AB_vAB_vAB_v_e_G_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACANANAN_G_G_G_G_1_1AN_1_1_G_G_GANANANANAN_1_vAU_vAU_vAT_v_v_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACANANAN_G_G_G_G_1_1_1_1_1_1_G_G_GANANANAN_1_vAB_vAB_v_eAUAB_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACANANAN_G_G_G_G_1_1_1_1_1_1_G_G_GANANANAN_1AU_vAU_vAT_v_v_v_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACANAN_G_G_G_G_G_1_1_1_1_1_G_G_G_GANANANANANAB_vAB_vAG_vABAU_G _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ANAN_G_G_G_G_1_1_1_1_1_1_G_G_G_GANANANANAN_vAU_vAT_vAU_v_v_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ANANAN_G_G_G_G_1_1_1_1_1_1_G_G_G_G_GANANANAN_vAB_vAG_vAB_vAB_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ANANAN_G_G_G_G_1_1_1_1_1_1_G_G_G_G_GANANANANAU_vAU_bAB_MAU_v_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ANANAN_G_G_G_G_1_1_1_1_1_1AN_G_G_G_G_GANANAN_vAB_vAB_MAB_vAB_v _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ANAN_G_G_G_G_G_1_1_1_1_1ANAN_G_G_G_G_GANANAN_vAU_vAU_vAG_bAU_v _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ANAN_G_G_G_G_1_1_1_1_1_1ANANAN_G_G_G_GANANAN_vAB_vAB_vAT_vAB_v _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AN_G_G_G_G_1_1_1_1_1_1ANANAN_G_G_G_G_GANANAU_vAU_vAG_vAU_vAU _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AN_G_G_G_G_1_1_1_1_1_1_1ANAN_G_G_G_G_GANAB_vABAVAU_bAB_vAB_v _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_G_G_G_G_1AN_1_1_1_1_1ANANAN_G_G_G_G_G_vAU_vAT_e_vAU_vAU_v _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_G_G_G_G_1_1_1_1_1_1_1ANANAN_G_G_G_G_G_vAB_v_eAT_vAB_vAB_v _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_G_G_1_1_1_1_1_1_1_1ANANAN_G_G_G_G_GAU_vAU_v_vAG_bAU_v_p _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_1_1_1_1_1_1_1_1_1_1_1ANAN_G_G_G_G_G_vABAWAT_eAT_vAB_v_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_1_1_1_1_1_1_1_1_1_1_1_1AN_G_G_G_G_G_vAU_v_e_b_eAT_xAU_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_1_1_1AN_1_1_1_1_1_1_1_1_G_G_G_G_GAB_vATAB_bAU_vAB_v_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ANANAN_1_1_1_1_1_1_1_1_G_G_G_G_G_vAU_v_eATAWAU_v_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ANAN_1_1_1_1AN_1_1_1_1_G_G_G_GAG_vAB_b_e_vAB_v_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AN_1_1_1_1_1AN_1_1_1_1AN_G_G_G_bAU_vAU_b_p_vAU_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_1_1_1_1ANANAN_1_1_1_1_G_G_GAB_vAB_vAB_xAB_v_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_1_1_1_1ANANAN_1_1_1_1_G_G_G_vAU_vAU_vAU_v_e_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AN_1_1ANANANAN_1_1_1_1_1_G_GAU_vAB_vABAWAT_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ANANANANANANAN_1_1_1_1_1_1_vAB_MAU_vAU_v_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ANANANANANANAN_1_1_1_1_1_1_vAU_vAB_vAB_v_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ANANANANANANAN_1_1_1_1_1_vAB_vAB_MAB_M_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ANANANANANANAN_1_1_1_1AU_vAU_vAU_v_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ANANANANANANAN_1_1_1_1_vAB_vAB_vAB_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ANANANANAN_G_G_1_1_1_1AB_vAU_vAU_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ANANANAN_G_GAN_1_1_vAU_vAB_v_v_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ANANANAN_G_G_G_G_vAB_vAB_MAB_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ANAN_G_G_G_G_G_GAU_vAU_vAU_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_G_G_G_G_G_G_v_vAB_v_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_G_G_G_G_G_v_p_e_bAG_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_G_G_G_bAG_v_vAT_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_G_G_GAB_bAUAB_x_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7AP_G_G_G_7AG_v_v_7_7_7_7_7_7_7_7_7_7 } # tile 0 (sub mine walls 5) { _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACAC_5_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACAC_G_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACAC_G_G_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACAC_G_G_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACAC_G_G_G_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACAC_G_G_G_G_G_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7ACACACACACAC_7_7ACACACACACACACACACACACACACAC_G_G_G_G_G_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACACACACACACACANAN_G_G_G_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACACACACACACACAN_1ANAN_G_G_G_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACACACACACACAN_1_1ANAN_G_G_G_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACACACACACACAN_1_1ANAN_G_G_G_G_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACACACACACANAN_1_1ANAN_1_G_G_G_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACACACACACACANANANAN_1AN_1_G_G_G_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACACACACANAN_GANANAN_1AN_1_G_G_G_G_7_7_7_7_7_7 _7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACACACACACAN_1_GANAN_1ANAN_1_G_G_G_G_7_7_7_7_7_7 _7_7_7_7_7_7ACACACACACACACACACACAC_GACACACACAC_G_GACACAC_1AN_1_GANAN_1ANAN_1_G_G_G_G_7_7_7_7_7_7 _7_7_7_7_7_7ACACACACACACANANAN_G_G_G_G_G_G_G_1_1_G_GANAN_1ANAN_GANAN_1_1ANAN_G_G_G_G_7_7_7_7_7_7 _7_7_7_7_7_7ACAC_G_G_GANANAN_1_1_G_G_G_G_G_1_1_1_1_GANAN_1ANANAN_GAN_1_1ANAN_1_G_G_G_7_7_7_7_7_7 _7_7_7_7_7_7_G_G_G_GANANAN_1_1_1_G_G_G_G_GANAN_1_1_G_GAN_1_1AN_1_GANAN_1AN_1AN_G_G_G_G_7_7_7_7_7 _7_7_7_7_7_7_G_G_G_GANAN_1_1_1_1_1_G_G_GANANANAN_1_G_GANAN_1_1AN_GANAN_1AN_1AN_1_G_G_G_7_7_7_7_7 _7_7_7_7_7_G_G_G_GANANAN_1_1_1_1ANANAN_GANANANAN_1_G_G_G_GAN_1_1ANANANAN_1AN_1AN_G_G_G_7_7_7_7_7 _7_7_7_7_7_G_G_G_GANANAN_1_1_1_1ANANAN_GANANAN_1_1_1_G_G_G_1AN_1AN_GANAN_1AN_1AN_1_G_G_G_7_7_7_7 _7_7_7_7_7_G_G_G_GANAN_1_1_1_1_1ANANAN_GANANAN_1_1_1_G_G_G_1AN_1AN_GANAN_1AN_1_1AN_G_G_G_7_7_7_7 _7_7_7_7_7_G_GANANAN_1_1_1_1_1_1ANAN_1_GANANAN_1_1_1_G_G_GAN_1AN_1_1_GANAN_1AN_1AN_G_G_G_7_7_7_7 _7_7_7_7_7_GANANANAN_1_1_1_1_1_1AN_1_1AN_GANAN_1_1_1_G_G_G_GANAN_1_1_G_GAN_1ANAN_1AN_G_G_7_7_7_7 _7_7_7_7_G_GANANANAN_1_1_1_1_1ANAN_1_1AN_GANANAN_1_1_1AN_G_GANAN_1_1_G_GANAN_1AN_1AN_G_G_7_7_7_7 _7_7_7_7_G_GANANANAN_1_1_1_1_1ANAN_1_1_1_GANANAN_1_1_1_GAN_GANAN_1_1_GAN_GAN_1_1ANAN_G_G_7_7_7_7 _7_7_7_G_G_GANANANAN_1_1_1_1_1ANAN_1_1_1_GANANAN_1_1_1_GAN_GANAN_1_1_GAN_GAN_1_1_1AN_1_G_G_7_7_7 _7_7_7_G_G_GANANANAN_1_1_1_1_1ANAN_1_1_1_GANANAN_1_1_1_GAN_GANAN_1_1_GAN_GANAN_1_1ANAN_G_G_7_7_7 _7_7_7_G_G_GANANANAN_1_1_1_1ANAN_G_1_1_1_GANANAN_1_1_1_1ANANAN_1AN_1_GANAN_GAN_1_1AN_1_G_G_7_7_7 _7_7_7_G_G_GANANAN_1_1_1_1_1ANANAN_1_1_1AN_GANAN_1_1_1_1_GANAN_1AN_1_G_GAN_GAN_1_1ANAN_G_G_G_7_7 _7_7_7_G_G_GANANAN_1_1_1_1ANAN_G_GAN_1_1AN_GANANAN_1_1_1_G_GAN_1ANAN_1_GAN_GAN_1_1ANAN_G_G_G_G_7 _7_7_7_G_G_G_GANAN_1_1_1_1AN_G_G_G_1AN_1_1_GAN_GAN_1_1_1_G_GAN_GANAN_1_GAN_GAN_1_1ANANAN_G_G_G_G _7_7_7_G_G_G_GAN_1_1_1_1_1AN_G_G_G_1AN_1_1AN_G_GAN_1_1_1_1_GAN_GANAN_1_1_G_G_G_1_1ANANAN_G_G_G_G _7_7_G_G_GAN_GAN_1_1_1_1ANAN_G_G_G_1AN_1_1AN_G_GAN_1_1_1_1_GANANAN_1AN_1_1_G_G_1_1_1ANAN_G_G_G_G _7_G_G_G_GAN_GAN_1_1_1_1ANAN_G_G_G_1AN_1_1ANANAN_GAN_1_1_1ANANANAN_1AN_1_1AN_G_G_1_1_1_1_G_G_7_7 _7_G_G_G_GANANAN_1_1_1_1ANAN_G_G_G_1AN_1_G_GANAN_GAN_1_1_1_1ANANANANAN_1_1_1_G_G_1_1_1_1_G_7_7_7 _7_G_G_G_GANANAN_1_1_1_1ANAN_G_G_G_1AN_1_G_GANAN_GAN_1_1_1_1ANAN_GANAN_1_1_1AN_GAN_1_1_G_7_7_7_7 _7_G_G_G_G_GANAN_1_1_1_1AN_G_G_G_G_1AN_1_1_GAN_G_GAN_1_1_1_1_1ANANANAN_1_1_1AN_G_GANAN_G_7_7_7_7 _7_G_G_G_G_GAN_1_1_1_1_1AN_G_G_G_G_GAN_1_1_G_G_G_GANAN_1_1_1_1ANANANAN_1_1_1AN_G_GAN_G_7_7_7_7_7 _7_G_G_G_GAN_G_1_1_1_1_1AN_G_G_G_G_GAN_1_1_G_G_G_GANAN_1_1_1_1ANANANAN_1_1_1AN_G_GAN_7_7_7_7_7_7 _7_G_G_G_GAN_G_1_1_1_1ANAN_G_G_G_G_GAN_1_1_G_G_G_GANANAN_1_1_1_1ANANAN_1_1_1AN_G_G_7_7_7_7_7_7_7 _7_G_G_G_GAN_G_1_1ANANANANAN_G_G_G_GAN_1_1_G_G_G_G_GANAN_1_1_1_1_G_G_1AN_1_1_1AN_7_7_7_7_7_7_7_7 _7_G_G_GAN_G_G_1_1_1ANANANAN_G_G_G_GAN_1_1_G_G_GAN_GANAN_1_1_1_1_G_G_1AN_1_1_1_G_7_7_7_7_7_7_7_7 _7_G_GAN_G_G_G_1_1_1ANANANAN_G_G_G_GAN_1_1_1_G_GAN_GANAN_G_1_1_G_G_G_G_1_1_1_1_7_7_7_7_7_7_7_7_7 _7_G_GAN_G_G_G_1_1_1ANANANAN_G_G_G_GAN_1_1_1_G_GAN_GANAN_G_1_1_G_G_G_G_G_1_1_7_7_7_7_7_7_7_7_7_7 _7_G_GAN_G_G_G_1_1ANANANANAN_G_G_G_GAN_1_1_G_G_GAN_GANANAN_1_1_1_G_G_G_G_G_7_7_7_7_7_7_7_7_7_7_7 _7ANANAN_G_G_1_1_1ANANANANAN_G_G_GANAN_1_1_G_1_G_G_GANANAN_1_1_1_G_G_G_7_7_7_7_7_7_7_7_7_7_7_7_7 _GANAN_G_G_G_1_1_1ANANANAN_G_G_G_GANAN_1_1_G_G_G_GANANANANAN_1_G_G_G_7_7_7_7_7_7_7_7_7_7_7_7_7_7 AN_GAN_G_G_G_1_1_1ANANANAN_G_G_G_GANAN_1_1_1_G_G_G_GANANANAN_G_G_G_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _GAN_G_G_G_G_1_1_1ANANANAN_G_G_G_G_GAN_1_1_1_1_G_G_G_GANAN_G_G_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _GAN_G_G_G_G_1_1_1ANANANAN_G_G_G_GANAN_1_1_1_1_G_G_G_G_GAN_G_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _GAN_G_G_G_G_1_1_1ANANANAN_G_G_G_GANAN_1_1_1_1_G_G_G_G_G_G_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _G_G_G_G_G_G_1_1ANANANANAN_G_G_G_G_GAN_1_1_1_1_1_G_G_G_G_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _G_G_G_G_G_G_1_1ANANANANAN_G_G_G_G_GAN_1_1_1_G_1_G_G_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 AP_G_G_G_G_G_1_1ANANANAN_G_G_G_G_G_GAN_G_1_G_G_G_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 AP_G_G_G_1_1_1ANANANANAN_G_G_G_G_GANAN_G_G_G_G_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 AP_G_G_1_1_1_1ANANANAN_G_G_G_G_G_GAN_G_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 AP_G_G_1_1_1_1ANANANAN_G_G_G_G_G_G_G_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _G_G_G_G_1_1_1_GANAN_G_G_G_G_G_G_G_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _G_G_G_G_G_G_G_G_G_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _G_G_G_G_G_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _G_G_G_G_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 } # tile 0 (sub mine walls 6) { _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACAC_5_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACAC_G_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACAC_G_G_G_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACAC_G_G_G_G_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACAC_G_G_G_G_G_G_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACAC_G_G_G_G_G_G_G_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7ACACACACACAC_7_7ACACACACACACACACACACACACACAC_G_G_G_G_G_GACACAC_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACACACACACACACAC_G_G_GACACACACACACAC_7_7_7 _7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACAC_7_7 _7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACAC_v_v_7_7 _7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACAC_v_p_e_7_7 _7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACAC_bAG_v_b_7_7 _7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACAC_v_p_vAT_e_7_7 _7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACAC_bAG_v_vAG_v_7_7 _7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACAC_v_p_vAT_eAT_v_7_7 _7_7_7_7_7_7ACACACACACACACACACACAC_GACACACACACACACACACACANANANACACACACACACACACAG_v_v_e_vAB_v_7_7 _7_7_7_7_7_7ACACACACACACANANAN_G_G_GACACACACACACACACACANAN_1ANACACACACACACAC_vAT_v_p_vAT_xAU_7_7 _7_7_7_7_7_7ACAC_G_G_GANANAN_G_G_GACACACACACACACACACACANAN_1ANANANANACACAC_eAT_vAG_vAG_vAB_v_7_7 _7_7_7_7_7_7_G_G_G_GANANANAN_G_GACACACACACACACACACACACANANAN_1ANANANAN_GAC_v_vAG_JAT_vAU_vAB_7_7 _7_7_7_7_7_7_G_G_G_GANANANAN_G_GACACACACACACACACACAC_GANANANAN_1ANANAN_G_G_GAT_bAG_xABAVAU_v_7_7 _7_7_7_7_7_G_G_G_GANANANAN_G_G_GACACACACACACACACACAC_G_GAN_GANAN_1AN_1_1_1_1_eAT_vAT_xAT_e_b_7_7 _7_7_7_7_7_G_G_G_GANANANAN_G_G_GACACACACACACACACAC_G_G_G_GAN_GANAN_1AN_1_1_1_b_e_v_eAT_e_bAG_7_7 _7_7_7_7_7_G_G_G_GANANAN_G_G_G_GACACACACACACACACAC_G_G_G_GAN_G_GANAN_1_1_1_1AT_eAT_v_vAT_vAT_7_7 _7_7_7_7_7_G_G_G_GANANAN_G_G_G_GACACACACACACACACAC_G_G_G_GAN_G_G_GAN_1_1_1_1_1_v_v_p_vAG_v_e_7_7 _7_7_7_7_7_G_G_GANAN_G_G_G_G_GACACACACACACACACAC_G_1_1_G_GAN_G_G_GANAN_1AN_1_1AG_b_e_bAT_vAT_7_7 _7_7_7_7_G_G_G_GANAN_G_G_G_GACACACACACACACACACAC_1_1_1AN_G_GAN_G_GANAN_1_1AN_1AT_v_p_vAG_v_e_7_7 _7_7_7_7_G_G_GANAN_G_G_G_GACACACACACACACACACACAC_1_1_1ANAN_GAN_G_GANANAN_1AN_1_v_e_vAT_vAT_v_7_7 _7_7_7_G_G_G_GANAN_G_GACACACACACACACACACACACACAC_1_G_1ANAN_GAN_G_G_GANAN_1AN_1_vATAG_vAG_v_e_7_7 _7_7_7_G_G_G_GAN_G_GACACACACACACACACACACACACACACAN_1_G_1AN_GAN_G_G_GANAN_1AN_1_e_b_vAT_vAT_v_7_7 _7_7_7_G_G_G_GAN_G_GACACACACACACACACACACACACACACAN_1_G_1ANANAN_G_G_GANAN_1ANANAT_v_p_vAG_xAB_7_7 _7_7_7_G_G_GAN_G_GACACACACACACACACACACACACACACACAN_1_G_1ANANAN_G_G_GANAN_1_1AN_e_v_eAT_vAT_x_7_7 _7_7_7_G_G_GAN_G_GACACACACACACACACACACACACACAC_GANAN_G_1ANANAN_G_G_G_GANAN_1ANAT_eAT_v_vAG_v_7_7 _7_7_7_G_G_GAN_GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPANAN_1_G_1ANAN_G_GAN_GANANANAN_v_vAG_v_p_vAT_7_7 _7_7_7_G_GANAN_GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPANAN_1_1_GANAN_G_GAN_G_GANANAN_eAT_vAT_e_v_e_v_7 _7_7_7_G_GAN_G_GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_GANAN_1_1_GANAN_G_GAN_G_GANANAN_b_eAT_e_bAT_eAT_7 _7_7_7_GANAN_G_GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_GAN_1_1_1_GANAN_G_GAN_GANANANAUAB_v_vAT_e_b_e_v _7_7_7_GANAN_G_GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_GANAN_1_1ANANAN_G_GAN_G_GANAN_v_vAUAB_v_v_p_vAT _7_7_G_GANAN_GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_GAN_1_1_1ANAN_G_GAN_G_GAN_vAUAB_v_xATAG_bAG_v _7_7_G_GANAN_GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_GAN_1_1ANANAN_GAN_G_G_G_vAB_vAUAB_v_vAT_vAB _7_7_G_GANANAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_GAN_1_1ANANAN_GAN_G_G_GAB_MAB_v_vAU_v_eAU_v _7_7_G_GANANAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_GAN_1_1ANANAN_GAN_G_G_G_vAU_vAUAB_vAB_b_vAB _7_7_G_GANANAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_GAN_1_1ANAN_GAN_G_G_G_vAB_vAB_v_vAU_vAU_7 _7_7_G_GAN_G_GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_GAN_1_1_1AN_GAN_G_G_GAU_vAU_vAUAB_vAB_v_7 _7_G_GAN_G_G_GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_G_1_1_1AN_GAN_G_G_GAB_vAB_vAB_v_vAU_v_7 _7_G_GAN_G_GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_G_1_1_1AN_GAN_G_G_G_vAU_vAU_vAUAB_v_7_7 _7_GANANAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_1_1_1_1ANAN_G_G_GAU_vAB_vABAVAU_v_7_7 _7_GANANAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_GAN_1_1_1ANANAN_G_G_vAB_MAU_vAT_eAB_7_7 _7ANANAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_GAN_1_1_1_1ANAN_G_G_vAU_vAB_v_e_b_v_7_7 _GAN_GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_GANAN_1_1_1AN_GAN_GAB_vAB_MAT_v_p_v_7_7 ANAN_GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_GAN_1_1_1AN_1AN_G_vAU_bAG_vAG_v_7_7_7 _G_G_GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_GANAN_1_1ANAN_1_1_vAB_vAT_vAT_e_7_7_7 _G_GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_GAN_1_1_1AN_1_1_vAU_vAG_v_e_b_7_7_7 _G_GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_GANAN_1_1AN_1_v_p_vAB_bAT_e_7_7_7_7 _7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_GAN_1_1AN_1_p_v_e_vAU_v_7_7_7_7_7 APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_GAN_1_1_1AN_v_vAT_eAT_v_7_7_7_7_7 APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_GAN_1_1_1AN_p_vAG_b_e_7_7_7_7_7_7 APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_GAN_1_1AN_v_vAT_vAT_7_7_7_7_7_7 APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_GAN_G_e_vATAG_v_e_7_7_7_7_7_7_7 APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_GAN_G_G_v_eAT_vAT_7_7_7_7_7_7_7 APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_G_GAN_G_vAT_v_e_7_7_7_7_7_7_7_7 APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_G_GAN_v_p_e_vAT_7_7_7_7_7_7_7_7 APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_G_GAN_e_vAT_e_7_7_7_7_7_7_7_7_7 _7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_G_G_GAT_v_e_b_7_7_7_7_7_7_7_7_7 _7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_G_G_v_eAT_7_7_7_7_7_7_7_7_7_7 } # tile 0 (sub mine walls 7) { _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACAC_5_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACAC_G_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACAC_G_G_G_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACAC_G_G_G_G_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACAC_G_G_G_G_G_G_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACAC_G_G_G_G_G_G_G_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7ACACACACACAC_7_7ACACACACACACACACACACACACACAC_G_G_G_G_G_GACACAC_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACACACACACACACAC_G_G_GACACACACACAC_7_7_7_7 _7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACAC_v_vAC_7_7 _7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACAT_e_p_v_7_7 _7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACAC_v_v_vAG_7_7 _7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACAG_v_p_b_7_7 _7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACAC_vAT_v_e_b_7_7 _7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACAC_vAT_e_vAUAB_7_7 _7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACAC_vAG_vAT_vAB_M_7_7 _7_7_7_7_7_7ACACACACACACACACACACAC_GANANACACAC_G_GACACACANANANACACACACACACACACAT_vAT_e_vAU_v_7_7 _7_7_7_7_7_7ACACACACACACANANAN_G_GANAC_GANAN_1_1_G_GACANANANANACACACACACACAC_v_e_vAG_bAB_vAB_7_7 _7_7_7_7_7_7ACAC_G_G_GANANAN_G_G_GANANAN_G_1_1_1_1_G_GANANANANANANANACACAC_eAT_eAT_vAT_vAU_v_7_7 _7_7_7_7_7_7_G_G_G_GANANANAN_1_1ANAN_G_G_GANAN_1_1_G_GANANANANANANANAN_GAC_b_vAT_e_vAG_vAB_v_7_7 _7_7_7_7_7_7_G_G_G_GANANAN_1_1ANANANAN_G_1ANANAN_1_G_GANANANANANANANAN_G_G_GAG_v_eAT_vAT_vAU_7_7 _7_7_7_7_7_G_G_G_GANANANAN_1_1ANANANANAN_1ANANAN_1_G_G_GAN_GANANANAN_1_1_1_1_bAT_v_e_vAG_vAB_7_7 _7_7_7_7_7_G_G_G_GANANAN_1_1_1ANANANANANAN_1AN_1_1_1_G_G_GAN_GANANANAN_1_1_1_vAG_vAUAB_bAU_v_7_7 _7_7_7_7_7_G_G_G_GANAN_1_1_1ANANANANANANAN_1AN_1_1_1_G_G_GAN_G_GANANAN_1_1_1AT_vAB_v_vAUAVAT_7_7 _7_7_7_7_7_G_GANANAN_1_1_1ANANANANAN_1ANAN_1ANAN_1_1_G_G_GAN_G_G_GANAN_1_1_1_1AU_vAU_vAB_v_e_7_7 _7_7_7_7_7_GANANANAN_1_1_1ANANANAN_1_1ANAN_1ANAN_1_1_G_G_GAN_G_G_GANANANAN_1_1_vAB_vAT_eAT_v_7_7 _7_7_7_7_G_GANANANAN_1_1_1ANANANAN_1_1ANAN_1ANAN_1_1_1AN_GAN_G_G_GANANANANAN_1AT_xAT_e_b_e_v_7_7 _7_7_7_7_G_GANANANAN_1_1_1ANANANAN_1_1_1AN_1ANANAN_1_1_GAN_GAN_G_GANANANANAN_1_e_v_eAT_vAT_e_7_7 _7_7_7_G_G_GANANANAN_1_1_1ANANANAN_1_1_1AN_1ANANAN_1_1_GAN_GAN_G_G_GANANANAN_1_vAT_bAG_v_eAT_v_7 _7_7_7_G_G_GANANANAN_1_1ANANANANAN_1_1_1_1ANANANAN_1_1_GAN_G_GAN_G_GANANANAN_1_eAT_e_bAT_v_eAT_7 _7_7_7_G_G_GANANANAN_1_1ANANANAN_G_1_1_1_1ANANANAN_1_1_1ANAN_GAN_G_GANANANANAN_b_eAT_v_e_p_v_v_7 _7_7_7_G_G_GANANANAN_1ANANANANANAN_1_1_1_1ANANAN_1AN_1_1_GAN_GAN_GANANANANANAN_eAT_v_eAT_v_eAT_7 _7_7_7_G_G_GANANANANANANANANAN_GAN_1_1_1_1ANANANANAN_1_1_G_G_GAN_GANANANANANANAT_v_eAT_xAB_b_e_7 _7_7_7_G_G_GANANANANANANANAN_G_GAN_1_1_1_1ANANANANAN_1_1_G_G_GAN_GANANANANANAN_vAG_b_vAG_bAU_v_7 _7_7_7_G_G_GANANANANANANANAN_G_GAN_1ANAN_1_1ANANANANAN_1_1_GANAN_GANANANANANAN_vAT_eAT_vAT_vAB_v _7_7_G_G_GANANANANANANANANAN_G_GAN_1ANANANAN_1ANAN_1_1AN_1_GANAN_GANANANANANAN_vAG_b_eAT_e_vAU_v _7_G_G_G_GANANANAN_1ANANANAN_G_GAN_1AN_1AN_1_1ANANAN_1AN_1ANANAN_GANANANANANANAT_vAT_b_eAT_vAB_v _7_G_G_G_GANANANAN_1ANANANAN_G_GAN_1AN_1_1_1ANANANAN_1_1AN_1ANAN_GANANANANANAN_e_vAG_vAT_e_vAU_v _7_G_G_G_GANANANANANANANANAN_G_GAN_1AN_1_1_1ANANANAN_1_1AN_1ANANANANANANANAN_vAT_vAT_v_eAT_vAB_v _7_G_G_G_GANANAN_1ANANANAN_G_G_GANANANAN_1_1_1ANANAN_1_1_1AN_1ANANANANANAN_G_e_vAG_vAG_b_eAT_eAT _7_G_G_G_GAN_1_1_1ANANANAN_G_G_GANANAN_1AN_1_1ANANANAN_1_1AN_1ANANANANANAN_G_vAT_vAT_vAT_b_e_v_v _7_G_G_G_GAN_1_1_1ANANANAN_G_G_GANANAN_1AN_1_1ANANANAN_1_1AN_1ANANANANANAN_GAG_vAG_vAG_vAGAT_v_p _7_G_G_GANAN_1_1_1ANANANAN_G_G_GANANAN_1AN_1_1ANANANANAN_1AN_1_1ANANANANAN_G_vAT_vAT_vAT_b_e_v_7 _7_G_G_GANAN_1_1_1ANANANANAN_G_GANANAN_1AN_1AN_1ANANANAN_1AN_1_1_G_GANAN_G_G_e_vAG_vAG_vAGAT_v_7 _7_G_G_GANAN_1_1_1ANANANANAN_G_GANANAN_1AN_1AN_GAN_1ANANAN_1AN_1_1_G_G_G_G_G_vAT_vAT_vAT_b_e_v_7 _7_G_G_GANANAN_1AN_1ANANANAN_G_G_GANAN_1AN_1AN_GANANANANAN_1AN_1_1_G_G_G_G_GAB_xAG_vAG_vABAU_7_7 _7_G_G_GANANAN_1AN_1ANANANAN_G_G_GANAN_1AN_1AN_GANAN_1_1AN_1_1AN_1_1_G_G_G_G_xAT_bAB_bAU_v_v_7_7 _7_G_G_GANANAN_1ANANANANANAN_G_G_GANAN_1AN_1AN_GANANANAN_1_1_1_1AN_1AN_G_G_G_e_vAU_vAB_vABAU_7_7 _7AN_G_GANANANAN_1ANANANANAN_G_GANANAN_1AN_1AN_G_GANANANAN_1_1_1AN_1_1_G_G_G_vATAVAU_vAU_v_v_7_7 _GANAN_GANAN_1AN_1ANANANAN_G_G_GANANAN_1AN_1AN_G_GANANANANAN_1_1AN_1_1_G_G_GAB_xAB_vAB_vABAU_7_7 AN_GANANANANAN_1_1ANANANAN_G_G_GANANAN_1_1ANAN_G_GANANANANAN_1_1_1ANAN_1_G_G_vAU_vAU_vAU_v_7_7_7 _G_G_GANANAN_1_1_1ANANANAN_G_G_G_GANAN_1_1ANAN_G_GANANANANANANAN_1_1AN_1_1_1AB_vAB_vAB_vAB_7_7_7 _G_G_GANANAN_1_1_1ANANANAN_G_G_G_GANAN_1_1_1AN_G_GAN_GANANANANANAN_1_1_1_1_1_vAU_vAU_vAU_v_7_7_7 _G_G_GANANAN_1_1_1ANANANAN_G_G_G_GANAN_1_1_1AN_G_G_G_GAN_GANANANAN_1_1_1_1_v_p_vAB_vAB_v_7_7_7_7 _G_G_GANANAN_1_1ANANANANAN_G_G_G_GANAN_1_1_1AN_G_G_G_GAN_GANANANANAN_1_1_1_b_e_vAU_vAU_7_7_7_7_7 _G_GANANANANAN_1ANANANANAN_G_G_G_GAN_1_1_1_1AN_G_G_G_GAN_G_GANANANANAN_1_1AB_vATAWAB_v_7_7_7_7_7 _G_GANANANANAN_1ANANANAN_G_G_G_G_GAN_1_1_1ANAN_G_G_G_GAN_G_G_GANANANAN_1_1_bAG_vAU_v_7_7_7_7_7_7 _G_GANANANAN_1ANANANANAN_G_G_G_GANANAN_1_1ANANAN_G_G_G_GAN_G_G_GANAN_1_1_vAU_vAB_vAB_7_7_7_7_7_7 _G_GANANANAN_1ANANANAN_G_G_G_GANANAN_1_1ANANANAN_G_G_G_G_GANAN_G_G_G_G_vAB_eAT_vAU_7_7_7_7_7_7_7 _G_G_GANANAN_1ANANANAN_G_G_G_GANANAN_1_1AN_GANAN_G_G_G_G_G_GAN_G_G_G_G_G_vAT_e_v_v_7_7_7_7_7_7_7 _G_G_GANANAN_1_GANAN_G_G_G_G_GANANAN_1AN_GANANAN_G_G_G_G_G_G_GAN_G_G_G_GAU_v_vAB_7_7_7_7_7_7_7_7 _G_G_GANANAN_G_G_G_G_G_G_G_GANAN_G_G_GANANANANAN_G_7_7_7_7_G_GAN_G_G_G_G_vABAU_v_7_7_7_7_7_7_7_7 _G_G_GANAN_G_G_G_G_7_7_7_7ANAN_G_G_G_G_G_G_G_7_7_7_7_7_7_7_7_G_G_G_G_G_GAU_v_v_7_7_7_7_7_7_7_7_7 _G_G_GAN_G_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_GABAU_7_7_7_7_7_7_7_7_7 _G_G_G_G_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_v_7_7_7_7_7_7_7_7_7_7 } # tile 0 (sub mine walls 8) { _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7ACACACACACAC_7_7_7_7_7_7_7ACACACACACACAC_7_7_7_7_7_7_7_7ACACAC_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACACACACACACAC_7_7_7_7_7ACACACACAC_7_7_7_7 _7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACAC_vAC_7_7 _7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACAC_p_v_7_7 _7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACAC_v_vAG_7_7 _7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACAC_v_eAT_b_7_7 _7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACAC_v_p_v_e_v_7_7 _7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACAT_e_v_p_vAT_7_7 _7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACAC_v_e_bAB_x_vAG_7_7 _7_7_7_7_7_7ACACACACACACACACACACAC_GACACACACACACACACACACANANANACACACACACACACAC_vAT_vAU_v_p_b_7_7 _7_7_7_7_7_7ACACACACACACANANAN_G_G_GACACACACACACACACACANANANANACACACACACACAC_v_p_e_vAB_v_e_v_7_7 _7_7_7_7_7_7ACAC_G_G_GANANAN_G_G_GACACACACACACACACACACANANANANANANANACACACAB_v_eAT_b_eAT_vAT_7_7 _7_7_7_7_7_7_G_G_G_GANANANAN_G_GACACACACACACACACACACACANANANANAN_GANAN_GAC_MAB_v_vAG_b_eAT_e_7_7 _7_7_7_7_7_7_G_G_G_GANANANAN_G_GACACACACACACACACACAC_GANANANANANANANAN_G_G_G_xAT_eAT_vAU_v_v_7_7 _7_7_7_7_7_G_G_G_GANANANAN_G_G_GACACACACACACACACACAC_G_G_G_GANANANAN_1_1_1_1AT_e_b_eATAWABAU_7_7 _7_7_7_7_7_G_G_G_GANANANAN_G_G_GACACACACACACACACACAN_G_G_G_G_GANANANAN_1_1_1_vAU_vAB_vAU_v_v_7_7 _7_7_7_7_7_G_GAN_GANANAN_G_G_G_GACACACACACACACACACAN_G_G_G_G_G_GANANAN_1_1_1_vAB_vAU_vAB_v_p_7_7 _7_7_7_7_7_G_G_G_GANANAN_G_G_G_GACACACACACACACACACANAN_G_G_G_G_G_GANAN_1_1_1_1_vAT_e_vAT_e_v_7_7 _7_7_7_7_7_G_G_GANAN_G_G_G_G_GACACACACACACACACACANANAN_G_G_G_G_G_GANANANAN_1_1AG_vAT_e_vAT_e_7_7 _7_7_7_7_G_G_G_GANAN_G_G_G_GACACACACACACACACACACAN_1ANAN_G_G_G_G_GANANANANAN_1_bAG_v_bAG_v_v_7_7 _7_7_7_7_G_G_GANAN_G_G_G_GACACACACACACACACACACAC_1_1ANANAN_G_G_G_GANANANANAN_1AT_vAT_eAT_v_p_v_7 _7_7_7_G_G_G_GANAN_G_GACACACACACACACACACACACACAC_1_1_1ANAN_G_G_G_G_GAN_GANAN_1AG_v_e_vAT_v_e_v_7 _7_7_7_G_G_G_GAN_G_GACACACACACACACACACACACACACACAN_1_1_1AN_G_GAN_G_GANANANAN_1_bAT_eAT_e_vAT_e_7 _7_7_7_G_G_G_GAN_G_GACACACACACACACACACACACACACACAN_1AN_1ANAN_G_G_G_G_GANANANAN_vAG_v_vAB_bAG_b_7 _7_7_7_G_G_GAN_G_GACACACACACACACACACACACACACACACAN_1_1_1ANAN_G_G_G_GANANANANANAT_vAT_eAU_vAT_v_7 _7_7_7_G_G_GAN_G_GACACACACACACACACACACACACACAC_GANAN_1_1ANAN_G_G_G_G_GANANANAN_eAWAU_v_vAB_v_e_7 _7_7_7_G_G_GAN_GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_GAN_1_1_1AN_G_G_G_G_GANANANANAT_vAB_vAU_vAUAB_7 _7_7_7_G_GANAN_GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_GAN_1_1_1ANAN_G_G_G_G_GANANAN_e_v_eAT_vAB_v_v_v _7_7_7_G_GAN_G_GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_GANAN_1_1_1ANAN_G_G_G_G_GANANAN_b_p_v_eAT_xATAGAT _7_7_7_GANAN_G_GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_GAN_1_1_1ANANAN_G_GAN_GANANAN_e_vAU_b_eAT_e_v_v _7_7_7_GANAN_G_GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_GANAN_1_1ANANAN_G_GAN_G_GANANAT_vAB_v_v_vAT_eAT _7_7_G_GANAN_GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_GAN_1_1_1ANAN_G_GAN_G_GAN_v_vAG_b_e_p_vAG_v_v _7_7_G_GANAN_GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_GAN_1_1ANANAN_G_G_G_G_GABAU_bAT_e_bAB_bAUAB _7_7_G_GANANAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_GAN_1_1ANANAN_G_G_G_G_G_MAB_v_e_vAT_x_p_v_v _7_7_G_GANANAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_GAN_1_1ANANAN_G_G_G_G_G_vAU_vAT_e_v_e_bAGAT _7_7_G_GANANAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_GAN_1_1ANAN_G_GAN_G_GABAWAT_e_v_p_vAT_v_7 _7_7_G_GAN_G_GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_GAN_1_1_1AN_G_G_G_G_G_vAU_vAB_v_vAG_vAG_7 _7_G_GAN_G_G_GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_G_1AN_1_1_G_G_G_G_GAT_e_vAT_eAT_vAT_b_7 _7_G_GAN_G_GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_G_1AN_1_1_G_G_G_G_G_v_v_p_x_vAG_v_e_7_7 _7_GANANAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_1_1_1_1_1_G_G_G_GATAG_vAB_vAT_vAT_7_7 _7_GANANAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_GAN_1_1_1_1AN_G_G_G_v_vAU_vAUAWAG_v_7_7 _7ANANAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_GAN_1AN_1_1_1_G_G_GAU_vAB_vAB_vAT_v_7_7 _GAN_GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_GANAN_1_1_1_1_G_G_G_vAB_MAU_vAUAWAT_7_7 ANAN_GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_GAN_1_1_1_1_1_G_GAB_MAB_vAB_b_e_7_7_7 _G_G_GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_GANAN_1_1_1_1_1_1_vAU_vAU_v_p_v_7_7_7 _G_GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_GAN_1_1AN_1_1_1_vAB_vAB_b_e_v_7_7_7 _G_GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_GAN_1_1_1_1_1_vAU_vAU_vAGAT_7_7_7_7 APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_GAN_1_1_1_1AB_vAB_eAT_v_7_7_7_7_7 APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_GAN_1_1_1_1_vAU_v_v_vAB_7_7_7_7_7 APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_G_G_1_1_1_1_vAB_vABAU_7_7_7_7_7_7 APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_GAN_1_1_vAU_vAU_v_v_7_7_7_7_7_7 APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_G_G_G_v_p_vAB_vAB_7_7_7_7_7_7_7 APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_G_G_G_G_v_eAT_xAU_7_7_7_7_7_7_7 APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_G_G_G_G_vAT_e_v_7_7_7_7_7_7_7_7 APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_G_G_G_v_p_v_v_p_7_7_7_7_7_7_7_7 APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_G_GAUAB_vAG_v_7_7_7_7_7_7_7_7_7 _7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_G_G_v_vAU_bAB_7_7_7_7_7_7_7_7_7 _7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_GAU_vAB_v_7_7_7_7_7_7_7_7_7_7 } # tile 0 (sub mine walls 9) { _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACAC_5_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACAC_G_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACAC_G_G_G_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACAC_G_G_G_G_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACAC_G_G_G_G_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACAC_G_G_GAN_G_G_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7ACACACACACAC_7_7ACACACACACACACACACACACACACAC_G_G_G_G_G_G_G_G_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACACACACACANAN_G_G_G_G_G_G_G_G_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACACACACACACANANAN_G_G_G_G_G_G_G_G_7_7_7_7_7 _7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACACACACACAC_1ANAN_GANAN_G_G_G_G_G_7_7_7_7_7 _7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACACACACAC_1ANANANANANANAN_G_G_G_G_7_7_7_7_7 _7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACACAC_1_1_1_1_1ANAN_1ANAN_G_G_G_G_G_7_7_7_7 _7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACACACACAN_1_1_1_1_1ANANANAN_GAN_G_G_G_7_7_7_7 _7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACACACACANAN_1_1_1_1ANANANANAN_G_G_G_G_G_7_7_7 _7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACACACACAC_GANAN_1_1_1_1ANANANAN_G_G_G_G_G_7_7_7 _7_7_7_7_7_7ACACACACACACACACACACAC_GACACACACACACACACACACAN_GANAN_1_1_1_1_1_1ANAN_G_G_G_G_G_7_7_7 _7_7_7_7_7_7ACACACACACACANANAN_G_G_GACACACACACACACACACANANANANAN_1_1_1_1_1_1_1ANAN_G_G_G_G_G_7_7 _7_7_7_7_7_7ACAC_G_G_GANANAN_G_G_GACACACACACACACACACACANANANANANAN_1_1_1AN_1_1ANANAN_G_GAN_G_7_7 _7_7_7_7_7_7_G_G_G_GANANANAN_G_GACACACACACACACACACACACANANANANANAN_1_1_1_1_1_1ANANAN_G_G_G_G_7_7 _7_7_7_7_7_7_G_G_G_GANANANAN_G_GACACACACACACACACACAC_GANANANANANAN_1_1_1_1_1_1ANANANAN_G_G_G_7_7 _7_7_7_7_7_G_G_G_GANANANAN_G_G_GACACACACACACACACACAC_G_G_G_GANANANAN_1_1_1_1_1ANANANAN_G_G_G_7_7 _7_7_7_7_7_G_G_G_GANANANAN_G_G_GACACACACACACACACAC_G_G_G_G_G_GAN_1ANAN_1_1_1_1ANANANANAN_G_G_7_7 _7_7_7_7_7_G_G_1_GANANAN_G_G_G_GACACACACACACACACAC_G_G_G_G_G_GANANANAN_1_1_1_1_1ANANANAN_G_G_7_7 _7_7_7_7_7_G_G_G_GANANAN_G_G_G_GACACACACACACACACAC_G_G_G_G_G_G_GANANAN_1_1_1_1_1_1ANANAN_G_G_G_7 _7_7_7_7_7_G_G_GANAN_G_G_G_G_GACACACACACACACACAC_G_1_1_G_G_G_G_GANANANAN_1AN_1_1_1ANANAN_G_G_G_7 _7_7_7_7_G_G_G_GANAN_G_G_G_GACACACACACACACACACAC_1_1_1AN_G_G_G_G_GANANAN_1_1_1_1_1_1ANAN_G_G_G_7 _7_7_7_7_G_G_GANAN_G_G_G_GACACACACACACACACACACAC_1_1_1ANAN_G_G_G_GANANANAN_1_1_1_1_1ANAN_G_G_G_7 _7_7_7_G_G_G_GANAN_G_GACACACACACACACACACACACACAC_1_1_1ANAN_G_G_G_G_GANANAN_1_1_1_1_1ANAN_G_G_G_7 _7_7_7_G_G_G_GANAN_GACACACACACACACACACACACACACACAN_1_1_1ANAN_G_G_G_GANANANAN_1_1_1ANANANAN_G_G_7 _7_7_7_G_G_G_GAN_G_GACACACACACACACACACACACACACACAN_1_1_1ANAN_G_G_G_G_GANANANAN_1_1ANANANAN_G_G_G _7_7_7_G_G_GAN_G_GACACACACACACACACACACACACACAC_G_G_1_1_1ANANAN_G_G_G_G_GANANAN_1_1ANAN_1AN_G_G_7 _7_7_7_G_G_GAN_G_GACACACACACACACACACACACACACAC_GANAN_1_1ANANANAN_G_G_G_G_GANAN_1_1ANANANAN_G_7_7 _7_7_7_G_G_GAN_GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_GANAN_1_1_1ANANANAN_GAN_G_GANAN_1_1ANANANAN_7_7_7 _7_7_7_G_GANAN_GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_GANAN_1_1_1ANANANAN_G_G_G_G_GAN_1_1ANANAN_7_7_7_7 _7_7_7_G_GANAN_GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_GANAN_1_1_1ANANANANAN_G_G_G_GANAN_1ANANAN_7_7_7_7 _7_7_7_GANAN_G_GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_GAN_1_1_1AN_1ANAN_G_G_G_G_GANAN_1_1ANAN_7_7_7_7 _7_7_7_GANAN_G_GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_GANAN_1_1ANANANANAN_G_G_G_GANAN_1_1AN_7_7_7_7_7 _7_7_G_GANAN_GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_GAN_1_1_1ANANANAN_G_G_G_GANAN_1_1AN_7_7_7_7_7 _7_7_G_GANAN_GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_GAN_1_1AN_1ANAN_G_G_G_GANANAN_1AN_7_7_7_7_7 _7_7_G_GANANANAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_GAN_1_1ANANANAN_G_G_G_G_GANAN_1_7_7_7_7_7_7 _7_7_G_GANANANAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_GAN_1_1ANANANANAN_G_G_G_GANAN_7_7_7_7_7_7_7 _7_7_G_GANANANAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_GAN_1_1ANANANAN_G_G_G_GAN_7_7_7_7_7_7_7_7 _7_7_G_GANANANAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_GAN_1_1AN_1ANAN_G_G_G_7_7_7_7_7_7_7_7_7_7 _7_G_GAN_GAN_GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_G_1_1ANANANAN_G_G_7_7_7_7_7_7_7_7_7_7_7 _7_G_GAN_GANAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_G_1_1ANANANAN_G_G_7_7_7_7_7_7_7_7_7_7_7 _7_GANANANAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_GAN_1ANANANAN_G_G_7_7_7_7_7_7_7_7_7_7_7 _7_GANANAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_GAN_1_1AN_1AN_G_G_7_7_7_7_7_7_7_7_7_7_7 _7ANANAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_GANAN_1ANANANAN_G_7_7_7_7_7_7_7_7_7_7_7 _GAN_GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_GANANANANANANANAN_7_7_7_7_7_7_7_7_7_7_7 ANAN_GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_GANAN_1ANANAN_1_7_7_7_7_7_7_7_7_7_7_7 _G_G_GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_GANANAN_1_1_1_1_7_7_7_7_7_7_7_7_7_7_7 _G_GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_GANANAN_1_1_1_7_7_7_7_7_7_7_7_7_7_7 _G_GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_GANANAN_1_1_1_7_7_7_7_7_7_7_7_7_7_7 _GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_GANANAN_1_7_7_7_7_7_7_7_7_7_7_7_7 _GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_GANANANAN_7_7_7_7_7_7_7_7_7_7_7_7 APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_G_GANAN_7_7_7_7_7_7_7_7_7_7_7_7_7 APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_GANAN_7_7_7_7_7_7_7_7_7_7_7_7_7 APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_GANAN_7_7_7_7_7_7_7_7_7_7_7_7_7 APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_GAN_7_7_7_7_7_7_7_7_7_7_7_7_7_7 APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_GAN_7_7_7_7_7_7_7_7_7_7_7_7_7_7 APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_G_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 } # tile 0 (sub mine walls 10) { _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACAC_5_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACAC_G_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACAC_G_G_G_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACAC_G_G_G_G_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACAC_G_G_G_G_G_G_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACAC_G_G_G_G_G_G_G_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACAC_G_G_G_G_G_GACACAC_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACAC_G_G_GACACACACACAC_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACACACACACACAC_v_v_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACACACACACACAT_e_p_v_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACACACACACACAC_v_v_vAG_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACACACACACACACAT_eAT_b_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACACACACACAC_v_e_bAG_v_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACACACACACAG_vAT_eAT_v_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACACACACACACACAC_vAT_v_e_b_eAT_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACANANANACACACACACACACAC_e_v_p_bAUAB_v_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACANANANANACACACACACACAC_vAT_v_e_vAB_M_e_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACANANANANANANANACACACAT_v_eAT_eAT_v_vAT_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACANANANANANANANAN_GAC_e_vAT_v_vAG_v_p_v_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACAC_GANANANANANANANAN_G_G_GAG_v_eAT_vAT_e_v_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACAC_G_G_G_GANANANAN_1_1_1_1_bAT_e_vAG_v_v_p_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACAC_G_G_G_G_G_GANANANAN_1_1_1AT_e_vAT_vATAG_v_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACAC_G_G_G_G_G_G_GANANAN_1_1_1_vAT_e_vAG_b_vAT_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_GACACACACACACACACAC_G_G_G_G_G_G_G_GANAN_1_1_1_1_e_vAT_v_p_v_e_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_GACACACACACACACACAC_G_1_1_G_G_G_G_G_GANANANAN_1_1_v_p_v_e_vAB_v_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_GACACACACACACACACACAC_1_1_1AN_G_G_G_G_GANANANANAN_1AT_xAB_bAU_vAU_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_GACACACACACACACACACACAC_1_1_1ANAN_G_G_G_GANANANANAN_1_v_eAT_e_bAB_v_v_7 _7_7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACAC_1_1_1ANAN_G_G_G_G_GANANANAN_1_eAT_v_bAG_vAUAB_7 _7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACAN_1_1_1AN_G_G_G_G_GANANANAN_1_v_eAT_eAT_v_v_v_7 _7_7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACAN_1_1_1ANAN_G_G_G_GANANANANAN_vAT_v_b_e_vABAU_7 _7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACACACAN_1_1_1ANAN_G_G_G_GANANANANANAG_vAGAT_vAT_e_b_7 _7_7_7_7_7_7_7_7_7ACACACACACACACACACACACACACAC_GANAN_1_1ANAN_G_G_G_G_GANANANAN_vAT_bAG_v_eAT_v_7 _7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPANAN_1_1_1AN_G_G_G_G_GANANANAN_vAG_bAT_vAU_vAG_7 _7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPANAN_1_1_1ANAN_G_G_G_G_GANANAN_eAT_v_e_vAB_vAT_v _7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAP_GANAN_1_1_1ANAN_G_G_G_G_GANANANAT_vAGAT_vAU_v_eAT _7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_GAN_1_1_1ANANAN_G_G_G_GANANAN_vAG_b_e_vAB_vAB_v _7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_GANAN_1_1ANANAN_G_G_G_G_GANAN_vAT_vAT_eAU_vAU_v _7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_GAN_1_1_1ANAN_G_G_G_G_GAN_p_vAG_v_eAT_v_vAB_v _7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_GAN_1_1ANANAN_G_G_G_G_G_v_vAT_vAT_e_v_p_vAU _7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_GAN_1_1ANANAN_G_G_G_G_G_p_vAG_v_e_vAT_xAB_v _7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_GAN_1_1ANANAN_G_G_G_G_G_v_vAT_vAT_e_v_eAT_v _7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_GAN_1_1ANAN_G_G_G_G_GATAG_vAG_vAT_eAT_v_7 _7_7_7_7_7_7_GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_GANAN_1_1_1AN_G_G_G_G_G_v_vAT_vAB_x_v_eAT_7 _7_7_7_7_7_G_GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_GAN_1_1_1_1_G_G_G_G_G_p_v_eAU_b_eAT_b_e_7 _7_7_7_7_7_GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_GAN_1_1_1_1_G_G_G_G_G_v_eAT_vABAU_vAG_7_7 _7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_GAN_1_1_1_1_G_G_G_G_vATAVAU_v_vAB_b_7_7 _7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_GAN_1_1_1_1AN_G_G_G_e_vAG_bABAU_vAU_7_7 _7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_GAN_1_1_1_1_1_G_G_GAUAB_bAU_v_vAB_v_7_7 _7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_GANAN_1_1_1_1_G_G_G_v_vAB_v_p_vAU_v_7_7 _7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_GANANAN_1_1_1_G_G_p_vAU_v_xAB_v_7_7_7 _7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_GANANAN_1_1_1_1_1_v_eAT_eAT_vAG_7_7_7 _7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_GANAN_1_1_1_1_1_vAB_v_b_eAT_b_7_7_7 _G_GAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_GANAN_1_1_1_1_vAU_vAUAB_v_e_7_7_7_7 _7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_GAN_1_1_1_1AB_vABAVAU_v_7_7_7_7_7 _8APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_GAN_1_1_1_1_vAU_vAUAVAT_7_7_7_7_7 APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_GANAN_1_1_1_vAB_vAB_v_7_7_7_7_7_7 APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_GAN_1AN_vAU_vAU_vAU_7_7_7_7_7_7 APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_GANANAN_p_vAB_vAB_7_7_7_7_7_7_7 APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_G_GAN_G_v_eAT_x_v_7_7_7_7_7_7_7 APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_G_GANANAT_b_eAT_7_7_7_7_7_7_7_7 APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_G_GANAN_e_vAT_e_7_7_7_7_7_7_7_7 APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_G_GAN_v_bAG_v_7_7_7_7_7_7_7_7_7 _7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_G_G_GAT_eAT_v_7_7_7_7_7_7_7_7_7 _7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_G_G_G_GAG_v_v_7_7_7_7_7_7_7_7_7_7 } # tile 0 (sub gehennom walls 0) { _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_t_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6_t_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6_t_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_t_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_t_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_t_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_t_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_H_t_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_Z_t_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_H_H_t_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_HAQ_H_t_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_H_H_H_t_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_H_H_Z_t_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_H_Z_H_H_t_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_H_H_H_H_t_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQAQ_H_H_H_H_HAQ_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_H_HAQ_H_ZAQ_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6_ZAQ_H_H_Z_H_H_ZAQ_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6_ZAQ_H_H_H_H_ZAQ_H_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_ZAQ_H_H_H_H_ZAQ_H_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_ZAQ_H_H_H_ZAQ_H_H_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_ZAQ_H_H_H_ZAQ_H_H_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_ZAQ_H_H_ZAQAQ_H_H_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_H_ZAQ_H_H_ZAQAQ_H_Z_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_H_ZAQ_H_ZAQ_ZAQ_H_H_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_H_H_ZAQ_H_ZAQ_ZAQAQ_H_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_Z_H_ZAQ_ZAQ_H_ZAQ_H_H_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_H_H_H_ZAQ_ZAQ_H_ZAQ_Z_H_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_H_Z_H_Z_ZAQ_H_H_ZAQ_H_H_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_H_H_H_H_Z_ZAQ_H_H_ZAQ_H_H_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_H_H_H_H_ZAQ_H_H_H_ZAQ_H_H_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_LAQ_H_H_H_H_H_H_ZAQ_H_H_H_ZAQ_H_H_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6AQ_H_HAQ_H_H_ZAQ_H_H_H_H_ZAQ_Z_Z_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_H_H_H_ZAQ_H_H_Z_H_ZAQ_H_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQ_6AQAQAQ_H_H_H_H_ZAQ_H_H_H_H_H_ZAQ_Z_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQ_6AQAQAQAQAQAQAQAQAQAQAQ_H_H_H_H_ZAQ_H_H_H_H_H_ZAQ_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQ_HAQAQAQAQAQAQ_HAQAQAQ_HAQAQAQ_H_H_H_ZAQ_H_ZAQ_H_H_H_Z_Z_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQ_6AQAQAQAQAQ_HAQ_H_ZAQ_H_H_H_H_H_H_Z_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_ZAQAQ_H_H_H_H_H_H_Z_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQ_HAQAQAQAQAQAQAQAQAQAQAQ_H_H_ZAQAQ_HAQ_H_Z_H_H_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQ_6AQAQAQAQAQAQAQ_HAQAQAQ_HAQAQAQ_H_ZAQ_ZAQ_H_H_H_H_H_Z_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_ZAQ_ZAQ_H_H_H_H_H_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_ZAQ_H_ZAQ_H_H_H_H_Z_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQ_HAQAQAQAQAQAQAQAQAQAQAQAQ_ZAQ_H_ZAQ_H_H_Z_H_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQ_6AQAQAQAQAQAQ_6AQAQAQ_6AQAQAQAQAQ_H_H_ZAQ_H_H_H_Z_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_ZAQ_H_H_ZAQ_H_H_H_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQ_HAQAQ_Z_H_H_H_ZAQ_H_H_Z_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_ZAQ_H_Z_H_ZAQ_H_H_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6AQAQ_H_H_H_ZAQ_H_Z_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_H_H_ZAQ_H_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQ_HAQAQAQAQAQAQAQAQAQ_H_HAQ_H_ZAQ_Z_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQ_HAQAQAQ_H_H_H_H_ZAQ_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_H_H_ZAQ_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQ_6AQAQAQAQAQAQAQAQAQAQAQAQ_H_H_H_H_Z_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQ_6AQAQAQAQAQAQAQ_H_H_H_H_Z_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQ_HAQAQAQAQ_HAQAQAQ_HAQ_H_H_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQ_HAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_H_Z_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_H_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQ_6AQAQAQAQAQAQ_H_H_Z_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQ_6AQAQ_HAQAQAQAQAQAQAQAQ_HAQ_H_Z_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQ_6AQ_H_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_H_H_H_H_H_H_H_H_H_H_H_H_H_H_H_H_Z_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 } # tile 0 (sub gehennom walls 1) { _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_H_H_7_7_7_7_7 _7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_H_H_H_7_7_7_7_7 _7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_H_H_H_7_7_7_7_7 _7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_H_H_H_H_7_7_7_7_7 _7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_H_H_H_H_7_7_7_7_7 _7_7_7_Z_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6AQ_H_H_H_H_H_H_H_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_H_H_H_H_Z_7_7_7_7_7 _7_7_7_Z_6AQAQ_HAQAQAQAQAQAQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_H_H_H_H_Z_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQAQAQAQAQ_HAQAQAQAQ_Z_6AQAQAQAQAQAQAQAQAQAQ_HAQAQAQAQ_H_H_H_H_H_Z_6_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQ_6AQAQAQAQAQAQAQAQ_Z_6AQ_HAQAQAQAQ_6AQAQAQAQAQAQAQAQ_H_H_H_H_H_Z_H_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQAQAQAQAQAQ_6AQAQAQ_Z_6AQAQAQAQAQAQAQAQAQAQAQ_6AQAQAQ_H_H_H_H_Z_6_H_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_H_H_Z_H_H_7_7_7_7_7 _7_7_7_Z_6AQ_HAQAQAQAQAQ_6AQAQAQAQAQAQ_Z_6AQAQAQAQ_6AQAQAQ_HAQAQAQAQAQAQ_H_H_H_Z_6_H_H_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_H_Z_H_H_H_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQ_H_HAQAQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_Z_6_H_H_H_7_7_7_7_7 _7_7_7_Z_6AQAQAQ_6AQAQAQAQAQAQAQAQAQAQ_Z_6AQAQAQ_HAQAQAQAQAQAQAQAQAQAQAQ_H_H_Z_H_H_H_H_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQAQAQ_HAQ_6AQAQAQ_H_Z_6_H_H_H_H_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQAQAQAQAQ_6AQAQAQAQ_Z_6AQAQAQAQAQAQ_6AQAQAQAQAQAQAQAQ_H_Z_H_H_H_H_H_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_Z_6_H_H_H_H_H_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_Z_H_H_H_H_H_H_7_7_7_7_7 _7_7_7_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_6_H_H_H_H_H_H_7_7_7_7_7 _7_7_7_6_6_6_6_6_6_6_6_Z_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_Z_6_6_6_6_6_6_6_6_H_H_H_H_H_H_H_7_7_7_7_7 _7_7_7AQAQAQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQ_H_H_H_H_H_H_H_7_7_7_7_7 _7_7_7AQAQAQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQ_H_H_H_H_H_H_H_7_7_7_7_7 _7_7_7AQAQ_6AQAQ_HAQAQ_Z_6AQAQAQAQAQ_HAQAQAQAQAQAQAQAQ_Z_6AQAQ_6AQAQAQAQ_H_H_H_H_H_H_7_7_7_7_7_7 _7_7_7AQAQAQAQAQAQAQAQ_Z_6AQAQ_6AQAQAQAQAQAQAQ_6AQAQAQ_Z_6AQAQAQAQAQ_HAQ_H_H_H_H_H_H_7_7_7_7_7_7 _7_7_7AQAQAQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQ_H_H_H_H_H_7_7_7_7_7_7_7 _7_7_7AQAQ_HAQAQ_6AQAQ_Z_6AQAQAQAQAQ_6AQAQAQAQ_HAQAQAQ_Z_6AQAQAQAQAQAQAQ_H_H_H_H_H_7_7_7_7_7_7_7 _7_7_7AQAQAQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQ_Z_6AQAQ_6AQAQ_6AQ_H_H_H_H_7_7_7_7_7_7_7_7 _7_7_7AQAQAQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQAQ_H_HAQAQAQAQ_Z_6AQAQAQAQAQ_6AQ_H_H_H_H_7_7_7_7_7_7_7_7 _7_7_7AQAQ_6_6AQAQAQAQ_Z_6AQAQAQ_HAQAQAQ_6AQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQ_H_H_H_7_7_7_7_7_7_7_7_7 _7_7_7AQAQAQAQAQAQAQAQ_Z_6AQAQAQ_HAQAQAQAQAQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQ_H_H_H_7_7_7_7_7_7_7_7_7 _7_7_7AQAQAQAQAQ_6AQAQ_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQ_Z_6AQAQAQ_HAQAQAQ_H_H_7_7_7_7_7_7_7_7_7_7 _7_7_7AQAQAQ_HAQAQAQAQ_Z_6AQAQAQ_6AQAQAQAQ_HAQAQAQAQAQ_Z_6AQAQAQAQ_6AQAQ_H_H_7_7_7_7_7_7_7_7_7_7 _7_7_7AQAQAQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQAQAQAQAQ_6_6AQ_Z_6AQAQAQAQAQAQAQ_H_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AQAQAQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQ_H_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 } # tile 0 (sub gehennom walls 2) { _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6_6_6_6_6_6_6_6AQ_H_H_H_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQAQAQAQAQAQAQAQAQ_H_H_H_H_H_H_Z_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQAQAQAQAQAQAQAQAQ_H_H_H_H_H_H_Z_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_HAQAQAQ_HAQAQAQAQ_H_H_H_H_H_Z_6_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_HAQAQAQAQAQAQAQAQ_H_H_H_H_H_Z_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_HAQAQAQAQ_6AQAQAQ_H_H_H_H_Z_6_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_HAQAQAQAQAQAQAQAQ_H_H_H_H_Z_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_LAQ_H_H_HAQ_HAQAQAQAQAQAQ_H_H_H_Z_6_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6AQ_H_HAQAQAQAQAQAQAQAQAQ_H_H_H_Z_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_HAQAQAQAQAQAQAQAQ_H_H_Z_6_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQ_6AQAQAQ_H_H_HAQAQAQAQAQAQAQAQ_H_H_Z_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQ_6AQAQAQAQAQAQAQAQAQAQAQ_H_H_HAQAQ_HAQ_6AQAQAQ_H_Z_6_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQ_HAQAQAQAQAQAQ_HAQAQAQ_HAQAQAQ_H_H_HAQAQAQAQAQAQAQAQ_H_Z_H_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQ_6AQAQAQAQAQ_HAQ_HAQAQAQAQAQAQAQAQ_Z_6_H_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_ZAQAQAQAQAQAQAQAQ_Z_H_H_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQ_HAQAQAQAQAQAQAQAQAQAQAQ_H_H_Z_Z_Z_Z_Z_Z_Z_Z_Z_6_H_H_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7AQ_6AQAQAQAQAQAQAQ_HAQAQAQ_HAQAQAQ_H_ZAQ_6_6_6_6_6_6_6_6_H_H_H_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_ZAQ_6AQAQAQAQAQAQAQ_H_H_H_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_ZAQ_H_6AQAQAQAQAQAQAQ_H_H_H_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQ_HAQAQAQAQAQAQAQAQAQAQAQAQ_ZAQ_H_6AQAQ_6AQAQAQAQ_H_H_H_H_H_H_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQ_6AQAQAQAQAQAQ_6AQAQAQ_6AQAQAQAQAQ_H_H_6AQAQAQAQAQ_HAQ_H_H_H_H_H_H_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_ZAQ_H_H_6AQAQAQAQAQAQAQ_H_H_H_H_H_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQ_HAQAQ_Z_H_H_H_6AQAQAQAQAQAQAQ_H_H_H_H_H_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_ZAQ_H_Z_H_6AQAQ_6AQAQ_6AQ_H_H_H_H_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6AQAQ_H_H_H_6AQAQAQAQAQ_6AQ_H_H_H_H_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_H_H_6AQAQAQAQAQAQAQ_H_H_H_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQ_HAQAQAQAQAQAQAQAQAQ_H_HAQ_H_6AQAQAQAQAQAQAQ_H_H_H_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQ_HAQAQAQ_H_H_H_H_6AQAQAQ_HAQAQAQ_H_H_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_H_H_6AQAQAQAQ_6AQAQ_H_H_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQ_6AQAQAQAQAQAQAQAQAQAQAQAQ_H_H_H_H_6AQAQAQAQAQAQAQ_H_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQ_6AQAQAQAQAQAQAQ_H_H_H_H_6AQAQAQAQAQAQAQ_H_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQ_HAQAQAQAQ_HAQAQAQ_HAQ_H_H_Z_Z_Z_Z_Z_Z_Z_Z_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQ_HAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_H_Z_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_H_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQ_6AQAQAQAQAQAQ_H_H_Z_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQ_6AQAQ_HAQAQAQAQAQAQAQAQ_HAQ_H_Z_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQ_6AQ_H_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_H_H_H_H_H_H_H_H_H_H_H_H_H_H_H_H_Z_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 } # tile 0 (sub gehennom walls 3) { _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQAQ_H_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_H_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6_ZAQ_H_H_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6_ZAQ_H_H_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_ZAQ_H_H_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_ZAQ_H_H_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_ZAQ_H_H_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_ZAQ_H_H_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_H_ZAQ_H_H_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_Z_6_6_6_6_6_6_6_6_6_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_H_ZAQ_H_Z_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQAQAQ_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_H_H_ZAQ_H_Z_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_Z_6AQAQ_HAQAQAQAQ_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_Z_H_ZAQ_ZAQ_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQAQ_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_H_H_H_ZAQ_ZAQ_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQ_6_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_H_Z_H_Z_ZAQ_H_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQ_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_H_H_H_H_Z_ZAQ_H_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQ_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_H_H_H_H_ZAQ_H_H_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_Z_6AQ_HAQAQ_L_L_L_L_L_L_L_L_L_L_L_L_L_L_LAQ_H_H_H_H_H_H_ZAQ_H_H_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_Z_6AQAQAQ_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6AQ_H_HAQ_H_H_ZAQ_H_H_H_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_H_H_H_ZAQ_H_H_Z_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_6AQAQAQ_H_H_H_H_ZAQ_H_H_H_H_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQAQAQAQ_6AQAQAQAQAQAQAQAQAQAQAQ_H_H_H_H_ZAQ_H_H_H_H_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQ_HAQAQAQAQAQAQ_HAQAQAQ_HAQAQAQ_H_H_H_ZAQ_H_ZAQ_H_H_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQ_6AQAQAQAQAQ_HAQ_H_ZAQ_H_H_H_H_H_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_ZAQAQ_H_H_H_H_H_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_Z_Z_Z_Z_ZAQAQAQAQAQ_HAQAQAQAQAQAQAQAQAQAQAQ_H_H_ZAQAQ_HAQ_H_Z_H_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_6_6_6_6_6AQ_6AQAQAQAQAQAQAQ_HAQAQAQ_HAQAQAQ_H_ZAQ_ZAQ_H_H_H_H_H_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_ZAQ_ZAQ_H_H_H_H_H_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_ZAQ_H_ZAQ_H_H_H_H_Z_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AQAQ_6AQAQAQAQAQAQ_HAQAQAQAQAQAQAQAQAQAQAQAQ_ZAQ_H_ZAQ_H_H_Z_H_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AQAQAQAQAQAQ_6AQAQAQAQAQAQ_6AQAQAQ_6AQAQAQAQAQ_H_H_ZAQ_H_H_H_Z_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_ZAQ_H_H_ZAQ_H_H_H_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AQAQ_HAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_HAQAQ_Z_H_H_H_ZAQ_H_H_Z_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AQAQAQAQAQ_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_ZAQ_H_Z_H_ZAQ_H_H_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AQAQAQAQAQ_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6AQAQ_H_H_H_ZAQ_H_Z_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AQAQ_6_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_H_H_ZAQ_H_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AQAQAQAQAQAQAQAQAQAQAQ_HAQAQAQAQAQAQAQAQAQ_H_HAQ_H_ZAQ_Z_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_HAQAQAQ_H_H_H_H_ZAQ_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AQAQAQ_HAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_H_H_ZAQ_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AQAQAQAQAQAQAQAQ_6AQAQAQAQAQAQAQAQAQAQAQAQ_H_H_H_H_Z_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQ_6AQAQAQAQAQAQAQ_H_H_H_H_Z_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_Z_Z_Z_Z_ZAQAQAQAQAQAQAQ_HAQAQAQAQ_HAQAQAQ_HAQ_H_H_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQ_HAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_H_Z_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_H_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQ_6AQAQAQAQAQAQ_H_H_Z_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQ_6AQAQ_HAQAQAQAQAQAQAQAQ_HAQ_H_Z_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQ_6AQ_H_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_H_H_H_H_H_H_H_H_H_H_H_H_H_H_H_H_Z_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 } # tile 0 (sub gehennom walls 4) { _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6_L_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6_L_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_L_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_L_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_L_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_L_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_H_L_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6AQ_H_H_H_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7AQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_H_H_H_H_Z_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7AQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_H_H_H_H_Z_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7AQ_HAQAQAQAQ_Z_6AQAQAQAQAQAQAQAQAQAQ_HAQAQAQAQ_H_H_H_H_H_Z_6_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7AQAQAQAQAQAQ_Z_6AQ_HAQAQAQAQ_6AQAQAQAQAQAQAQAQ_H_H_H_H_H_Z_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7AQAQ_6AQAQAQ_Z_6AQAQAQAQAQAQAQAQAQAQAQ_6AQAQAQ_H_H_H_H_Z_6_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7AQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_H_H_Z_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7AQAQAQAQAQAQ_Z_6AQAQAQAQ_6AQAQAQ_HAQAQAQAQAQAQ_H_H_H_Z_6_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7AQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_H_Z_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7AQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_Z_6_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7AQAQAQAQAQAQ_Z_6AQAQAQ_HAQAQAQAQAQAQAQAQAQAQAQ_H_H_Z_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7AQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQAQAQ_HAQ_6AQAQAQ_H_Z_6_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7AQ_6AQAQAQAQ_Z_6AQAQAQAQAQAQ_6AQAQAQAQAQAQAQAQ_H_Z_H_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7AQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_Z_6_H_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7AQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_Z_H_H_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_6_H_H_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_6_6_6_6_6_6_6_6_6_6_6_6_6_6_Z_6_6_6_6_6_6_6_6_H_H_H_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQ_H_H_H_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQ_H_H_H_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7AQAQAQAQAQ_HAQAQAQAQAQAQAQAQ_Z_6AQAQ_6AQAQAQAQ_H_H_H_H_H_H_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7AQAQ_6AQAQAQAQAQAQAQ_6AQAQAQ_Z_6AQAQAQAQAQ_HAQ_H_H_H_H_H_H_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQ_H_H_H_H_H_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7AQAQAQAQAQ_6AQAQAQAQ_HAQAQAQ_Z_6AQAQAQAQAQAQAQ_H_H_H_H_H_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQ_Z_6AQAQ_6AQAQ_6AQ_H_H_H_H_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQ_H_HAQAQAQAQ_Z_6AQAQAQAQAQ_6AQ_H_H_H_H_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7AQAQAQ_HAQAQAQ_6AQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQ_H_H_H_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7AQAQAQ_HAQAQAQAQAQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQ_H_H_H_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQ_Z_6AQAQAQ_HAQAQAQ_H_H_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7AQAQAQ_6AQAQAQAQ_HAQAQAQAQAQ_Z_6AQAQAQAQ_6AQAQ_H_H_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQ_6_6AQ_Z_6AQAQAQAQAQAQAQ_H_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQ_H_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 } # tile 0 (sub gehennom walls 5) { _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_t_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6_t_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6_t_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_t_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_t_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_t_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_t_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_H_t_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_Z_t_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_H_H_t_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_HAQ_H_t_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_H_H_H_t_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_H_H_Z_t_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_H_Z_H_H_t_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_H_H_H_H_t_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQAQ_H_H_H_H_HAQ_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_H_HAQ_H_ZAQ_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6_ZAQ_H_H_Z_H_H_ZAQ_7_7_7_7_7_7_7_7 _7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6_ZAQ_H_H_H_H_ZAQ_H_7_7_7_7_7_7_7_7 _7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_ZAQ_H_H_H_H_ZAQ_H_7_7_7_7_7_7_7_7 _7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_ZAQ_H_H_H_ZAQ_H_H_7_7_7_7_7_7_7_7 _7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_ZAQ_H_H_H_ZAQ_H_H_7_7_7_7_7_7_7_7 _7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_ZAQ_H_H_ZAQAQ_H_H_7_7_7_7_7_7_7_7 _7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_H_ZAQ_H_H_ZAQAQ_H_Z_7_7_7_7_7_7_7_7 _7_7_7_Z_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6AQ_H_H_ZAQ_H_ZAQ_ZAQ_H_H_7_7_7_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQ_H_H_H_ZAQ_H_ZAQ_ZAQAQ_H_7_7_7_7_7_7_7_7 _7_7_7_Z_6AQAQ_HAQAQAQAQAQAQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQ_H_Z_H_ZAQ_ZAQ_H_ZAQ_H_H_7_7_7_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQAQAQAQAQ_HAQAQAQAQ_Z_6AQAQAQAQAQAQ_H_H_H_H_ZAQ_ZAQ_H_ZAQ_Z_H_7_7_7_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQ_6AQAQAQAQAQAQAQAQ_Z_6AQ_HAQAQAQAQ_H_H_Z_H_Z_ZAQ_H_H_ZAQ_H_H_7_7_7_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQAQAQAQAQAQ_6AQAQAQ_Z_6AQAQAQAQAQAQ_H_H_H_H_Z_ZAQ_H_H_ZAQ_H_H_7_7_7_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQ_Z_6AQAQAQAQAQAQ_H_H_H_H_ZAQ_H_H_H_ZAQ_H_H_7_7_7_7_7_7_7_7 _7_7_7_Z_6AQ_HAQAQAQAQAQ_6AQAQAQAQAQAQ_Z_6AQAQAQAQ_6AQ_H_H_H_H_ZAQ_H_H_H_ZAQ_H_H_7_7_7_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQ_H_H_ZAQ_H_H_H_H_ZAQ_Z_Z_7_7_7_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQ_H_HAQAQAQAQAQAQAQ_Z_6AQAQAQAQAQAQ_H_H_H_ZAQ_H_H_Z_H_ZAQ_H_7_7_7_7_7_7_7_7_7 _7_7_7_Z_6AQAQAQ_6AQAQAQAQAQAQAQAQAQAQ_Z_6AQAQAQ_HAQAQ_H_H_ZAQ_H_H_H_H_H_ZAQ_Z_7_7_7_7_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQ_Z_6AQAQAQAQAQAQ_H_H_ZAQ_H_H_H_H_H_ZAQ_7_7_7_7_7_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQAQAQAQAQ_6AQAQAQAQ_Z_6AQAQAQAQAQAQ_H_ZAQ_H_ZAQ_H_H_H_Z_Z_7_7_7_7_7_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQ_Z_6AQAQAQAQAQAQ_H_ZAQ_H_H_H_H_H_H_Z_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQ_Z_6AQAQAQAQAQAQ_ZAQ_H_H_H_H_H_H_H_Z_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_ZAQ_H_HAQ_H_Z_H_H_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_6_6_6_6_6_6_6_6_Z_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6AQ_H_H_H_H_H_H_H_Z_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AQAQAQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_H_H_H_H_H_H_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AQAQAQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_H_H_H_H_H_Z_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AQAQ_6AQAQ_HAQAQ_Z_6AQAQAQAQAQ_HAQAQAQAQAQAQAQAQ_H_H_H_H_H_Z_H_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AQAQAQAQAQAQAQAQ_Z_6AQAQ_6AQAQAQAQAQAQAQ_6AQAQAQ_H_H_H_H_H_H_Z_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AQAQAQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_H_H_H_H_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AQAQ_HAQAQ_6AQAQ_Z_6AQAQAQAQAQ_6AQAQAQAQ_HAQAQAQ_H_H_H_H_H_Z_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AQAQAQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_H_H_H_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AQAQAQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQAQ_H_HAQAQAQAQ_H_H_H_H_Z_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AQAQ_6_6AQAQAQAQ_Z_6AQAQAQ_HAQAQAQ_6AQAQAQAQAQAQ_H_H_H_H_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AQAQAQAQAQAQAQAQ_Z_6AQAQAQ_HAQAQAQAQAQAQAQAQAQAQ_H_H_H_Z_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AQAQAQAQAQ_6AQAQ_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_H_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AQAQAQ_HAQAQAQAQ_Z_6AQAQAQ_6AQAQAQAQ_HAQAQAQAQAQ_H_H_Z_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AQAQAQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQAQAQAQAQ_6_6AQ_H_H_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AQAQAQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_Z_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_H_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 } # tile 0 (sub gehennom walls 6) { _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6_L_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6_L_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_L_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_L_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_L_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_L_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_H_L_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_H_H_7_7_7_7_7 _7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_H_H_H_7_7_7_7_7 _7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_H_H_H_7_7_7_7_7 _7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_H_H_H_H_7_7_7_7_7 _7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_H_H_H_H_7_7_7_7_7 _7_7_7_Z_6_6_6_6_6_6_6_6_6_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6_6_6_6_6_6_6_6AQ_H_H_H_H_H_H_H_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQAQAQ_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQAQAQAQAQAQAQAQAQ_H_H_H_H_H_H_Z_7_7_7_7_7 _7_7_7_Z_6AQAQ_HAQAQAQAQ_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQAQAQAQAQAQAQAQAQ_H_H_H_H_H_H_Z_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQAQ_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_HAQAQAQ_HAQAQAQAQ_H_H_H_H_H_Z_6_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQ_6_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_HAQAQAQAQAQAQAQAQ_H_H_H_H_H_Z_H_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQ_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_HAQAQAQAQ_6AQAQAQ_H_H_H_H_Z_6_H_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQ_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_HAQAQAQAQAQAQAQAQ_H_H_H_H_Z_H_H_7_7_7_7_7 _7_7_7_Z_6AQ_HAQAQ_L_L_L_L_L_L_L_L_L_L_L_L_L_L_LAQ_H_H_HAQ_HAQAQAQAQAQAQ_H_H_H_Z_6_H_H_7_7_7_7_7 _7_7_7_Z_6AQAQAQ_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6AQ_H_HAQAQAQAQAQAQAQAQAQ_H_H_H_Z_H_H_H_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_HAQAQAQAQAQAQAQAQ_H_H_Z_6_H_H_H_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_6AQAQAQ_H_H_HAQAQAQAQAQAQAQAQ_H_H_Z_H_H_H_H_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQAQAQAQ_6AQAQAQAQAQAQAQAQAQAQAQ_H_H_HAQAQ_HAQ_6AQAQAQ_H_Z_6_H_H_H_H_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQ_HAQAQAQAQAQAQ_HAQAQAQ_HAQAQAQ_H_H_HAQAQAQAQAQAQAQAQ_H_Z_H_H_H_H_H_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQ_6AQAQAQAQAQ_HAQ_HAQAQAQAQAQAQAQAQ_Z_6_H_H_H_H_H_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_ZAQAQAQAQAQAQAQAQ_Z_H_H_H_H_H_H_7_7_7_7_7 _7_7_7_Z_Z_Z_Z_ZAQAQAQAQAQ_HAQAQAQAQAQAQAQAQAQAQAQ_H_H_Z_Z_Z_Z_Z_Z_Z_Z_Z_6_H_H_H_H_H_H_7_7_7_7_7 _7_7_7_6_6_6_6_6AQ_6AQAQAQAQAQAQAQ_HAQAQAQ_HAQAQAQ_H_ZAQ_6_6_6_6_6_6_6_6_H_H_H_H_H_H_H_7_7_7_7_7 _7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_ZAQ_6AQAQAQAQAQAQAQ_H_H_H_H_H_H_H_7_7_7_7_7 _7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_ZAQ_H_6AQAQAQAQAQAQAQ_H_H_H_H_H_H_H_7_7_7_7_7 _7_7_7AQAQ_6AQAQAQAQAQAQ_HAQAQAQAQAQAQAQAQAQAQAQAQ_ZAQ_H_6AQAQ_6AQAQAQAQ_H_H_H_H_H_H_7_7_7_7_7_7 _7_7_7AQAQAQAQAQAQ_6AQAQAQAQAQAQ_6AQAQAQ_6AQAQAQAQAQ_H_H_6AQAQAQAQAQ_HAQ_H_H_H_H_H_H_7_7_7_7_7_7 _7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_ZAQ_H_H_6AQAQAQAQAQAQAQ_H_H_H_H_H_7_7_7_7_7_7_7 _7_7_7AQAQ_HAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_HAQAQ_Z_H_H_H_6AQAQAQAQAQAQAQ_H_H_H_H_H_7_7_7_7_7_7_7 _7_7_7AQAQAQAQAQ_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_ZAQ_H_Z_H_6AQAQ_6AQAQ_6AQ_H_H_H_H_7_7_7_7_7_7_7_7 _7_7_7AQAQAQAQAQ_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6AQAQ_H_H_H_6AQAQAQAQAQ_6AQ_H_H_H_H_7_7_7_7_7_7_7_7 _7_7_7AQAQ_6_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_H_H_6AQAQAQAQAQAQAQ_H_H_H_7_7_7_7_7_7_7_7_7 _7_7_7AQAQAQAQAQAQAQAQAQAQAQ_HAQAQAQAQAQAQAQAQAQ_H_HAQ_H_6AQAQAQAQAQAQAQ_H_H_H_7_7_7_7_7_7_7_7_7 _7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_HAQAQAQ_H_H_H_H_6AQAQAQ_HAQAQAQ_H_H_7_7_7_7_7_7_7_7_7_7 _7_7_7AQAQAQ_HAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_H_H_6AQAQAQAQ_6AQAQ_H_H_7_7_7_7_7_7_7_7_7_7 _7_7_7AQAQAQAQAQAQAQAQ_6AQAQAQAQAQAQAQAQAQAQAQAQ_H_H_H_H_6AQAQAQAQAQAQAQ_H_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQ_6AQAQAQAQAQAQAQ_H_H_H_H_6AQAQAQAQAQAQAQ_H_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_Z_Z_Z_Z_ZAQAQAQAQAQAQAQ_HAQAQAQAQ_HAQAQAQ_HAQ_H_H_Z_Z_Z_Z_Z_Z_Z_Z_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQ_HAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_H_Z_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_H_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQ_6AQAQAQAQAQAQ_H_H_Z_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQ_6AQAQ_HAQAQAQAQAQAQAQAQ_HAQ_H_Z_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQ_6AQ_H_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_H_H_H_H_H_H_H_H_H_H_H_H_H_H_H_H_Z_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 } # tile 0 (sub gehennom walls 7) { _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6_L_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6_L_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_L_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_L_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_L_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_L_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_H_L_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_H_H_7_7_7_7_7 _7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_H_H_H_7_7_7_7_7 _7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_H_H_H_7_7_7_7_7 _7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_H_H_H_H_7_7_7_7_7 _7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_H_H_H_H_7_7_7_7_7 _7_7_7_Z_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6AQ_H_H_H_H_H_H_H_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_H_H_H_H_Z_7_7_7_7_7 _7_7_7_Z_6AQAQ_HAQAQAQAQAQAQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_H_H_H_H_Z_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQAQAQAQAQ_HAQAQAQAQ_Z_6AQAQAQAQAQAQAQAQAQAQ_HAQAQAQAQ_H_H_H_H_H_Z_6_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQ_6AQAQAQAQAQAQAQAQ_Z_6AQ_HAQAQAQAQ_6AQAQAQAQAQAQAQAQ_H_H_H_H_H_Z_H_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQAQAQAQAQAQ_6AQAQAQ_Z_6AQAQAQAQAQAQAQAQAQAQAQ_6AQAQAQ_H_H_H_H_Z_6_H_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_H_H_Z_H_H_7_7_7_7_7 _7_7_7_Z_6AQ_HAQAQAQAQAQ_6AQAQAQAQAQAQ_Z_6AQAQAQAQ_6AQAQAQ_HAQAQAQAQAQAQ_H_H_H_Z_6_H_H_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_H_Z_H_H_H_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQ_H_HAQAQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_Z_6_H_H_H_7_7_7_7_7 _7_7_7_Z_6AQAQAQ_6AQAQAQAQAQAQAQAQAQAQ_Z_6AQAQAQ_HAQAQAQAQAQAQAQAQAQAQAQ_H_H_Z_H_H_H_H_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQAQAQ_HAQ_6AQAQAQ_H_Z_6_H_H_H_H_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQAQAQAQAQ_6AQAQAQAQ_Z_6AQAQAQAQAQAQ_6AQAQAQAQAQAQAQAQ_H_Z_H_H_H_H_H_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_Z_6_H_H_H_H_H_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_Z_H_H_H_H_H_H_7_7_7_7_7 _7_7_7_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_6_H_H_H_H_H_H_7_7_7_7_7 _7_7_7_6_6_6_6_6_6_6_6_Z_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_Z_6_6_6_6_6_6_6_6_H_H_H_H_H_H_H_7_7_7_7_7 _7_7_7AQAQAQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQ_H_H_H_H_H_H_H_7_7_7_7_7 _7_7_7AQAQAQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQ_H_H_H_H_H_H_H_7_7_7_7_7 _7_7_7AQAQ_6AQAQ_HAQAQ_Z_6AQAQAQAQAQ_HAQAQAQAQAQAQAQAQ_Z_6AQAQ_6AQAQAQAQ_H_H_H_H_H_H_7_7_7_7_7_7 _7_7_7AQAQAQAQAQAQAQAQ_Z_6AQAQ_6AQAQAQAQAQAQAQ_6AQAQAQ_Z_6AQAQAQAQAQ_HAQ_H_H_H_H_H_H_7_7_7_7_7_7 _7_7_7AQAQAQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQ_H_H_H_H_H_7_7_7_7_7_7_7 _7_7_7AQAQ_HAQAQ_6AQAQ_Z_6AQAQAQAQAQ_6AQAQAQAQ_HAQAQAQ_Z_6AQAQAQAQAQAQAQ_H_H_H_H_H_7_7_7_7_7_7_7 _7_7_7AQAQAQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQ_Z_6AQAQ_6AQAQ_6AQ_H_H_H_H_7_7_7_7_7_7_7_7 _7_7_7AQAQAQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQAQ_H_HAQAQAQAQ_Z_6AQAQAQAQAQ_6AQ_H_H_H_H_7_7_7_7_7_7_7_7 _7_7_7AQAQ_6_6AQAQAQAQ_Z_6AQAQAQ_HAQAQAQ_6AQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQ_H_H_H_7_7_7_7_7_7_7_7_7 _7_7_7AQAQAQAQAQAQAQAQ_Z_6AQAQAQ_HAQAQAQAQAQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQ_H_H_H_7_7_7_7_7_7_7_7_7 _7_7_7AQAQAQAQAQ_6AQAQ_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQ_Z_6AQAQAQ_HAQAQAQ_H_H_7_7_7_7_7_7_7_7_7_7 _7_7_7AQAQAQ_HAQAQAQAQ_Z_6AQAQAQ_6AQAQAQAQ_HAQAQAQAQAQ_Z_6AQAQAQAQ_6AQAQ_H_H_7_7_7_7_7_7_7_7_7_7 _7_7_7AQAQAQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQAQAQAQAQ_6_6AQ_Z_6AQAQAQAQAQAQAQ_H_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AQAQAQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQ_Z_6AQAQAQAQAQAQAQ_H_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 } # tile 0 (sub gehennom walls 8) { _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_H_H_7_7_7_7_7 _7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_H_H_H_7_7_7_7_7 _7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_H_H_H_7_7_7_7_7 _7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_H_H_H_H_7_7_7_7_7 _7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_H_H_H_H_7_7_7_7_7 _7_7_7_Z_6_6_6_6_6_6_6_6_6_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6_6_6_6_6_6_6_6AQ_H_H_H_H_H_H_H_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQAQAQ_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQAQAQAQAQAQAQAQAQ_H_H_H_H_H_H_Z_7_7_7_7_7 _7_7_7_Z_6AQAQ_HAQAQAQAQ_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQAQAQAQAQAQAQAQAQ_H_H_H_H_H_H_Z_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQAQ_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_HAQAQAQ_HAQAQAQAQ_H_H_H_H_H_Z_6_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQ_6_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_HAQAQAQAQAQAQAQAQ_H_H_H_H_H_Z_H_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQ_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_HAQAQAQAQ_6AQAQAQ_H_H_H_H_Z_6_H_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQ_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_HAQAQAQAQAQAQAQAQ_H_H_H_H_Z_H_H_7_7_7_7_7 _7_7_7_Z_6AQ_HAQAQ_L_L_L_L_L_L_L_L_L_L_L_L_L_L_LAQ_H_H_HAQ_HAQAQAQAQAQAQ_H_H_H_Z_6_H_H_7_7_7_7_7 _7_7_7_Z_6AQAQAQ_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6AQ_H_HAQAQAQAQAQAQAQAQAQ_H_H_H_Z_H_H_H_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_HAQAQAQAQAQAQAQAQ_H_H_Z_6_H_H_H_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_6AQAQAQ_H_H_HAQAQAQAQAQAQAQAQ_H_H_Z_H_H_H_H_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQAQAQAQ_6AQAQAQAQAQAQAQAQAQAQAQ_H_H_HAQAQ_HAQ_6AQAQAQ_H_Z_6_H_H_H_H_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQ_HAQAQAQAQAQAQ_HAQAQAQ_HAQAQAQ_H_H_HAQAQAQAQAQAQAQAQ_H_Z_H_H_H_H_H_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQ_6AQAQAQAQAQ_HAQ_HAQAQAQAQAQAQAQAQ_Z_6_H_H_H_H_H_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_ZAQAQAQAQAQAQAQAQ_Z_H_H_H_H_H_H_7_7_7_7_7 _7_7_7_Z_Z_Z_Z_ZAQAQAQAQAQ_HAQAQAQAQAQAQAQAQAQAQAQ_H_H_Z_Z_Z_Z_Z_Z_Z_Z_Z_6_H_H_H_H_H_H_7_7_7_7_7 _7_7_7_6_6_6_6_6AQ_6AQAQAQAQAQAQAQ_HAQAQAQ_HAQAQAQ_H_ZAQ_6_6_6_6_6_6_6_6_H_H_H_H_H_H_H_7_7_7_7_7 _7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_ZAQ_6AQAQAQAQAQAQAQ_H_H_H_H_H_H_H_7_7_7_7_7 _7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_ZAQ_H_6AQAQAQAQAQAQAQ_H_H_H_H_H_H_H_7_7_7_7_7 _7_7_7AQAQ_6AQAQAQAQAQAQ_HAQAQAQAQAQAQAQAQAQAQAQAQ_ZAQ_H_6AQAQ_6AQAQAQAQ_H_H_H_H_H_H_7_7_7_7_7_7 _7_7_7AQAQAQAQAQAQ_6AQAQAQAQAQAQ_6AQAQAQ_6AQAQAQAQAQ_H_H_6AQAQAQAQAQ_HAQ_H_H_H_H_H_H_7_7_7_7_7_7 _7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_ZAQ_H_H_6AQAQAQAQAQAQAQ_H_H_H_H_H_7_7_7_7_7_7_7 _7_7_7AQAQ_HAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_HAQAQ_Z_H_H_H_6AQAQAQAQAQAQAQ_H_H_H_H_H_7_7_7_7_7_7_7 _7_7_7AQAQAQAQAQ_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_ZAQ_H_Z_H_6AQAQ_6AQAQ_6AQ_H_H_H_H_7_7_7_7_7_7_7_7 _7_7_7AQAQAQAQAQ_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6AQAQ_H_H_H_6AQAQAQAQAQ_6AQ_H_H_H_H_7_7_7_7_7_7_7_7 _7_7_7AQAQ_6_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_H_H_6AQAQAQAQAQAQAQ_H_H_H_7_7_7_7_7_7_7_7_7 _7_7_7AQAQAQAQAQAQAQAQAQAQAQ_HAQAQAQAQAQAQAQAQAQ_H_HAQ_H_6AQAQAQAQAQAQAQ_H_H_H_7_7_7_7_7_7_7_7_7 _7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_HAQAQAQ_H_H_H_H_6AQAQAQ_HAQAQAQ_H_H_7_7_7_7_7_7_7_7_7_7 _7_7_7AQAQAQ_HAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_H_H_6AQAQAQAQ_6AQAQ_H_H_7_7_7_7_7_7_7_7_7_7 _7_7_7AQAQAQAQAQAQAQAQ_6AQAQAQAQAQAQAQAQAQAQAQAQ_H_H_H_H_6AQAQAQAQAQAQAQ_H_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQ_6AQAQAQAQAQAQAQ_H_H_H_H_6AQAQAQAQAQAQAQ_H_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_Z_Z_Z_Z_ZAQAQAQAQAQAQAQ_HAQAQAQAQ_HAQAQAQ_HAQ_H_H_Z_Z_Z_Z_Z_Z_Z_Z_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQ_HAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_H_Z_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_H_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQ_6AQAQAQAQAQAQ_H_H_Z_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQ_6AQAQ_HAQAQAQAQAQAQAQAQ_HAQ_H_Z_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQ_6AQ_H_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_H_H_H_H_H_H_H_H_H_H_H_H_H_H_H_H_Z_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 } # tile 0 (sub gehennom walls 9) { _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_t_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6_t_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6_t_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_t_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_t_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_t_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_t_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_H_t_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_Z_t_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_H_H_t_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_HAQ_H_t_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_H_H_H_t_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_H_H_Z_t_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_H_Z_H_H_t_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_H_H_H_H_t_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQAQ_H_H_H_H_HAQ_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_H_HAQ_H_ZAQ_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6_ZAQ_H_H_Z_H_H_ZAQ_7_7_7_7_7_7_7_7 _7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6_ZAQ_H_H_H_H_ZAQ_H_7_7_7_7_7_7_7_7 _7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_ZAQ_H_H_H_H_ZAQ_H_7_7_7_7_7_7_7_7 _7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_ZAQ_H_H_H_ZAQ_H_H_7_7_7_7_7_7_7_7 _7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_ZAQ_H_H_H_ZAQ_H_H_7_7_7_7_7_7_7_7 _7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_ZAQ_H_H_ZAQAQ_H_H_7_7_7_7_7_7_7_7 _7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_H_ZAQ_H_H_ZAQAQ_H_Z_7_7_7_7_7_7_7_7 _7_7_7_Z_6_6_6_6_6_6_6_6_6_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_H_ZAQ_H_ZAQ_ZAQ_H_H_7_7_7_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQAQAQ_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_H_H_ZAQ_H_ZAQ_ZAQAQ_H_7_7_7_7_7_7_7_7 _7_7_7_Z_6AQAQ_HAQAQAQAQ_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_Z_H_ZAQ_ZAQ_H_ZAQ_H_H_7_7_7_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQAQ_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_H_H_H_ZAQ_ZAQ_H_ZAQ_Z_H_7_7_7_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQ_6_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_H_Z_H_Z_ZAQ_H_H_ZAQ_H_H_7_7_7_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQ_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_H_H_H_H_Z_ZAQ_H_H_ZAQ_H_H_7_7_7_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQ_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_H_H_H_H_ZAQ_H_H_H_ZAQ_H_H_7_7_7_7_7_7_7_7 _7_7_7_Z_6AQ_HAQAQ_L_L_L_L_L_L_L_L_L_L_L_L_L_L_LAQ_H_H_H_H_H_H_ZAQ_H_H_H_ZAQ_H_H_7_7_7_7_7_7_7_7 _7_7_7_Z_6AQAQAQ_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6AQ_H_HAQ_H_H_ZAQ_H_H_H_H_ZAQ_Z_Z_7_7_7_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_H_H_H_ZAQ_H_H_Z_H_ZAQ_H_7_7_7_7_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_6AQAQAQ_H_H_H_H_ZAQ_H_H_H_H_H_ZAQ_Z_7_7_7_7_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQAQAQAQ_6AQAQAQAQAQAQAQAQAQAQAQ_H_H_H_H_ZAQ_H_H_H_H_H_ZAQ_7_7_7_7_7_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQ_HAQAQAQAQAQAQ_HAQAQAQ_HAQAQAQ_H_H_H_ZAQ_H_ZAQ_H_H_H_Z_Z_7_7_7_7_7_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQ_6AQAQAQAQAQ_HAQ_H_ZAQ_H_H_H_H_H_H_Z_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_Z_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_ZAQAQ_H_H_H_H_H_H_Z_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_Z_Z_Z_Z_ZAQAQAQAQAQ_HAQAQAQAQAQAQAQAQAQAQAQ_H_H_ZAQAQ_HAQ_H_Z_H_H_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_6_6_6_6_6AQ_6AQAQAQAQAQAQAQ_HAQAQAQ_HAQAQAQ_H_ZAQ_ZAQ_H_H_H_H_H_Z_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_ZAQ_ZAQ_H_H_H_H_H_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_ZAQ_H_ZAQ_H_H_H_H_Z_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AQAQ_6AQAQAQAQAQAQ_HAQAQAQAQAQAQAQAQAQAQAQAQ_ZAQ_H_ZAQ_H_H_Z_H_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AQAQAQAQAQAQ_6AQAQAQAQAQAQ_6AQAQAQ_6AQAQAQAQAQ_H_H_ZAQ_H_H_H_Z_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_ZAQ_H_H_ZAQ_H_H_H_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AQAQ_HAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_HAQAQ_Z_H_H_H_ZAQ_H_H_Z_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AQAQAQAQAQ_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_ZAQ_H_Z_H_ZAQ_H_H_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AQAQAQAQAQ_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6AQAQ_H_H_H_ZAQ_H_Z_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AQAQ_6_6AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_H_H_ZAQ_H_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AQAQAQAQAQAQAQAQAQAQAQ_HAQAQAQAQAQAQAQAQAQ_H_HAQ_H_ZAQ_Z_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_HAQAQAQ_H_H_H_H_ZAQ_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AQAQAQ_HAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_H_H_ZAQ_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AQAQAQAQAQAQAQAQ_6AQAQAQAQAQAQAQAQAQAQAQAQ_H_H_H_H_Z_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQ_6AQAQAQAQAQAQAQ_H_H_H_H_Z_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_Z_Z_Z_Z_ZAQAQAQAQAQAQAQ_HAQAQAQAQ_HAQAQAQ_HAQ_H_H_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQ_HAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_H_Z_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_H_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQ_6AQAQAQAQAQAQ_H_H_Z_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQ_6AQAQ_HAQAQAQAQAQAQAQAQ_HAQ_H_Z_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQ_6AQ_H_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_H_H_H_H_H_H_H_H_H_H_H_H_H_H_H_H_Z_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 } # tile 0 (sub gehennom walls 10) { _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6_L_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6_L_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_L_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_L_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_L_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_L_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_H_L_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_H_H_H_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6_6_6_6_6_6_6_6AQ_H_H_H_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQAQAQAQAQAQAQAQAQ_H_H_H_H_H_H_Z_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQAQAQAQAQAQAQAQAQ_H_H_H_H_H_H_Z_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_HAQAQAQ_HAQAQAQAQ_H_H_H_H_H_Z_6_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_HAQAQAQAQAQAQAQAQ_H_H_H_H_H_Z_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_HAQAQAQAQ_6AQAQAQ_H_H_H_H_Z_6_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_6AQ_H_HAQAQAQAQAQAQAQAQ_H_H_H_H_Z_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_L_L_L_L_L_L_L_L_L_L_L_L_L_L_LAQ_H_H_HAQ_HAQAQAQAQAQAQ_H_H_H_Z_6_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6AQ_H_HAQAQAQAQAQAQAQAQAQ_H_H_H_Z_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_HAQAQAQAQAQAQAQAQ_H_H_Z_6_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQ_6AQAQAQ_H_H_HAQAQAQAQAQAQAQAQ_H_H_Z_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQ_6AQAQAQAQAQAQAQAQAQAQAQ_H_H_HAQAQ_HAQ_6AQAQAQ_H_Z_6_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQ_HAQAQAQAQAQAQ_HAQAQAQ_HAQAQAQ_H_H_HAQAQAQAQAQAQAQAQ_H_Z_H_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQ_6AQAQAQAQAQ_HAQ_HAQAQAQAQAQAQAQAQ_Z_6_H_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_ZAQAQAQAQAQAQAQAQ_Z_H_H_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQ_HAQAQAQAQAQAQAQAQAQAQAQ_H_H_Z_Z_Z_Z_Z_Z_Z_Z_Z_6_H_H_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7AQ_6AQAQAQAQAQAQAQ_HAQAQAQ_HAQAQAQ_H_ZAQ_6_6_6_6_6_6_6_6_H_H_H_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_ZAQ_6AQAQAQAQAQAQAQ_H_H_H_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_ZAQ_H_6AQAQAQAQAQAQAQ_H_H_H_H_H_H_H_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQ_HAQAQAQAQAQAQAQAQAQAQAQAQ_ZAQ_H_6AQAQ_6AQAQAQAQ_H_H_H_H_H_H_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQ_6AQAQAQAQAQAQ_6AQAQAQ_6AQAQAQAQAQ_H_H_6AQAQAQAQAQ_HAQ_H_H_H_H_H_H_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_ZAQ_H_H_6AQAQAQAQAQAQAQ_H_H_H_H_H_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQ_HAQAQ_Z_H_H_H_6AQAQAQAQAQAQAQ_H_H_H_H_H_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_Z_ZAQ_H_Z_H_6AQAQ_6AQAQ_6AQ_H_H_H_H_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_6_6_6_6_6_6_6_6_6_6_6_6_6_6_6AQAQ_H_H_H_6AQAQAQAQAQ_6AQ_H_H_H_H_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_H_H_6AQAQAQAQAQAQAQ_H_H_H_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQ_HAQAQAQAQAQAQAQAQAQ_H_HAQ_H_6AQAQAQAQAQAQAQ_H_H_H_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQ_HAQAQAQ_H_H_H_H_6AQAQAQ_HAQAQAQ_H_H_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_H_H_6AQAQAQAQ_6AQAQ_H_H_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQ_6AQAQAQAQAQAQAQAQAQAQAQAQ_H_H_H_H_6AQAQAQAQAQAQAQ_H_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQ_6AQAQAQAQAQAQAQ_H_H_H_H_6AQAQAQAQAQAQAQ_H_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQ_HAQAQAQAQ_HAQAQAQ_HAQ_H_H_Z_Z_Z_Z_Z_Z_Z_Z_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQ_HAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_H_Z_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_H_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQ_6AQAQAQAQAQAQ_H_H_Z_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_H_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQ_6AQAQ_HAQAQAQAQAQAQAQAQ_HAQ_H_Z_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQ_6AQ_H_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AQAQAQAQAQAQAQAQAQAQAQAQAQAQAQAQ_H_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_H_H_H_H_H_H_H_H_H_H_H_H_H_H_H_H_Z_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 } # tile 0 (sub knox walls 0) { _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_K_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_K_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_K_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_S_K_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_S_K_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAM_K_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAM_K_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAM_K_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAM_K_K_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAMAM_K_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAIAM_K_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAMAMAM_K_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAMAM_K_K_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAM_KAMAM_K_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAMAMAMAM_K_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_S_SAMAMAMAMAM_S_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAMAMAIAM_K_S_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_K_SAMAM_KAMAM_K_S_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_K_SAMAMAMAM_K_SAM_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_S_K_SAMAMAMAM_K_SAM_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_S_K_SAMAMAM_K_SAMAM_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAM_K_SAMAMAM_K_SAMAM_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAM_K_SAMAM_K_SAIAMAM_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAM_K_SAMAM_K_S_SAM_K_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAM_K_SAM_K_S_K_SAMAM_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAMAM_K_SAM_K_S_K_SAIAM_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAM_KAM_K_S_K_SAM_K_SAMAM_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAMAMAM_K_S_K_SAM_K_S_KAM_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAM_KAM_K_K_SAMAM_K_SAMAM_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAMAMAMAM_K_K_SAMAM_K_SAMAM_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAMAMAMAM_K_SAMAMAM_K_SAMAM_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAP_SAMAMAMAMAMAM_K_SAMAMAM_K_SAMAM_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA_SAMAM_SAMAM_K_SAMAMAMAM_K_S_K_K_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAI_SAMAMAMAMAM_K_SAMAM_KAM_K_SAM_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAIAIAIAIAAAIAI_SAMAMAMAM_K_SAMAMAMAMAM_K_S_K_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAAAIAIAIAIAIAIAIAIAIAI_SAMAMAMAM_K_SAMAMAMAMAM_K_S_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAMAIAIAIAIAIAIAMAIAIAIAMAIAI_SAMAMAM_K_SAM_KAIAMAMAM_K_K_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAIAIAAAIAIAIAI_SAMAIAM_K_SAMAMAMAMAMAM_K_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAI_SAMAM_K_S_SAMAMAMAMAMAM_K_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAMAIAIAIAIAIAIAIAIAIAI_SAMAM_K_S_SAMAIAM_KAMAM_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAAAIAIAIAIAIAIAI_UAIAIAI_UAIAI_SAM_K_S_K_SAMAMAMAMAM_K_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAI_SAM_K_S_K_SAMAMAMAMAM_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAI_S_K_SAM_K_SAMAMAMAM_K_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAI_UAIAIAIAIAIAIAIAIAIAIAI_S_K_SAM_K_SAMAM_KAM_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAAAIAIAIAIAIAIAAAIAIAIAAAIAIAI_S_SAMAM_K_SAMAMAM_K_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAI_K_SAMAM_K_SAMAMAM_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAIAIAIAIAMAIAI_KAMAMAM_K_SAMAM_K_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_SAM_KAM_K_SAMAM_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA_S_SAMAMAM_K_SAM_K_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S_SAMAMAMAM_K_SAM_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAMAIAIAIAIAIAIAIAIAIAMAMAIAM_K_S_K_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAIAIAIAMAIAIAIAMAMAMAM_K_S_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAMAMAMAM_K_S_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAAAIAIAIAIAIAIAIAIAIAIAIAIAMAMAMAM_K_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAAAIAIAIAIAIAIAIAMAMAMAM_K_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAMAIAIAIAI_UAIAIAIAMAIAMAM_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAMAIAIAIAIAIAIAIAIAIAIAIAIAIAMAMAM_K_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAMAMAM_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAAAIAIAIAIAIAIAMAM_K_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAMAM_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAAAIAI_UAIAIAIAIAIAIAIAIAMAIAM_K_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAIAIAIAIAIAAAIAM_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAM_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_KAM_UAM_KAMAM_KAMAM_KAM_UAM_KAM_K_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 } # tile 0 (sub knox walls 1) { _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_7_7_7_7_7 _7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAM_7_7_7_7_7 _7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAM_7_7_7_7_7 _7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAM_7_7_7_7_7 _7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAMAM_7_7_7_7_7 _7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAMAM_7_7_7_7_7 _7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAMAMAM_7_7_7_7_7 _7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAMAMAM_7_7_7_7_7 _7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAMAMAMAM_7_7_7_7_7 _7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAMAMAMAM_7_7_7_7_7 _7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAMAMAMAMAM_7_7_7_7_7 _7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAMAMAMAMAM_7_7_7_7_7 _7_7_7_KAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAMAMAMAMAMAMAM_7_7_7_7_7 _7_7_7_KAA_S_S_S_S_S_S_S_S_S_S_S_S_S_S_KAA_S_S_S_S_S_S_S_S_S_S_S_S_S_SAIAMAMAMAMAMAM_K_7_7_7_7_7 _7_7_7_KAA_S_SAM_S_S_S_S_S_S_S_S_S_S_S_KAA_S_S_S_S_S_S_S_S_S_S_S_S_S_SAIAMAMAMAMAMAM_K_7_7_7_7_7 _7_7_7_KAA_S_S_S_S_S_S_S_S_SAM_S_S_S_S_KAA_S_S_S_S_S_S_S_S_S_SAM_S_S_SAIAMAMAMAMAM_KAA_7_7_7_7_7 _7_7_7_KAA_S_S_S_S_SAA_S_S_S_S_S_S_S_S_KAA_SAM_S_S_S_SAA_S_S_S_S_S_S_SAIAMAMAMAMAM_KAM_7_7_7_7_7 _7_7_7_KAA_S_S_S_S_S_S_S_S_S_SAA_S_S_S_KAA_S_S_S_S_S_S_S_S_S_S_SAA_S_SAIAMAMAMAM_KAAAM_7_7_7_7_7 _7_7_7_KAA_S_S_S_S_S_S_S_S_S_S_S_S_S_S_KAA_S_S_S_S_S_S_S_S_S_S_S_S_S_SAIAMAMAMAM_KAMAM_7_7_7_7_7 _7_7_7_KAA_SAM_S_S_S_S_SAA_S_S_S_S_S_S_KAA_S_S_S_SAA_S_S_SAM_S_S_S_S_SAIAMAMAM_KAAAMAM_7_7_7_7_7 _7_7_7_KAA_S_S_S_S_S_S_S_S_S_S_S_S_S_S_KAA_S_S_S_S_S_S_S_S_S_S_S_S_S_SAIAMAMAM_KAMAMAM_7_7_7_7_7 _7_7_7_KAA_S_S_S_S_SAMAM_S_S_S_S_S_S_S_KAA_S_S_S_S_S_S_S_S_S_S_S_S_S_SAIAMAM_KAAAMAMAM_7_7_7_7_7 _7_7_7_KAA_S_S_SAA_S_S_S_S_S_S_S_S_S_S_KAA_S_S_SAM_S_S_S_S_S_S_S_S_S_SAIAMAM_KAMAMAMAM_7_7_7_7_7 _7_7_7_KAA_S_S_S_S_S_S_S_S_S_S_S_S_S_S_KAA_S_S_S_S_S_S_S_S_SAM_SAA_S_SAIAM_KAAAMAMAMAM_7_7_7_7_7 _7_7_7_KAA_S_S_S_S_S_S_S_S_SAA_S_S_S_S_KAA_S_S_S_S_S_SAA_S_S_S_S_S_S_SAIAM_KAMAMAMAMAM_7_7_7_7_7 _7_7_7_KAA_S_S_S_S_S_S_S_S_S_S_S_S_S_S_KAA_S_S_S_S_S_S_S_S_S_S_S_S_S_SAI_KAAAMAMAMAMAM_7_7_7_7_7 _7_7_7_KAA_S_S_S_S_S_S_S_S_S_S_S_S_S_S_KAA_S_S_S_S_S_S_S_S_S_S_S_S_S_SAI_KAMAMAMAMAMAM_7_7_7_7_7 _7_7_7_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAAAMAMAMAMAMAM_7_7_7_7_7 _7_7_7AAAAAAAAAAAAAAAA_KAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA_KAAAAAAAAAAAAAAAAAMAMAMAMAMAMAM_7_7_7_7_7 _7_7_7_S_S_S_S_S_S_S_S_KAA_S_S_S_S_S_S_S_S_S_S_S_S_S_S_KAA_S_S_S_S_S_SAIAMAMAMAMAMAMAM_7_7_7_7_7 _7_7_7_S_S_S_S_S_S_S_S_KAA_S_S_S_S_S_S_S_S_S_S_S_S_S_S_KAA_S_S_S_S_S_SAIAMAMAMAMAMAMAM_7_7_7_7_7 _7_7_7_S_SAA_S_SAM_S_S_KAA_S_S_S_S_SAM_S_S_S_S_S_S_S_S_KAA_S_SAA_S_S_SAIAMAMAMAMAMAM_7_7_7_7_7_7 _7_7_7_S_S_S_S_S_S_S_S_KAA_S_SAA_S_S_S_S_S_S_SAA_S_S_S_KAA_S_S_S_S_SAMAIAMAMAMAMAMAM_7_7_7_7_7_7 _7_7_7_S_S_S_S_S_S_S_S_KAA_S_S_S_S_S_S_S_S_S_S_S_S_S_S_KAA_S_S_S_S_S_SAIAMAMAMAMAM_7_7_7_7_7_7_7 _7_7_7_S_SAM_S_SAA_S_S_KAA_S_S_S_S_SAA_S_S_S_SAM_S_S_S_KAA_S_S_S_S_S_SAIAMAMAMAMAM_7_7_7_7_7_7_7 _7_7_7_S_S_S_S_S_S_S_S_KAA_S_S_S_S_S_S_S_S_S_S_S_S_S_S_KAA_S_SAA_S_SAAAIAMAMAMAM_7_7_7_7_7_7_7_7 _7_7_7_S_S_S_S_S_S_S_S_KAA_S_S_S_S_S_S_S_SAMAM_S_S_S_S_KAA_S_S_S_S_SAAAIAMAMAMAM_7_7_7_7_7_7_7_7 _7_7_7_S_SAAAA_S_S_S_S_KAA_S_S_SAM_S_S_SAA_S_S_S_S_S_S_KAA_S_S_S_S_S_SAIAMAMAM_7_7_7_7_7_7_7_7_7 _7_7_7_S_S_S_S_S_S_S_S_KAA_S_S_SAM_S_S_S_S_S_S_S_S_S_S_KAA_S_S_S_S_S_SAIAMAMAM_7_7_7_7_7_7_7_7_7 _7_7_7_S_S_S_S_SAA_S_S_KAA_S_S_S_S_S_S_S_S_S_S_S_S_S_S_KAA_S_S_SAM_S_SAIAMAM_7_7_7_7_7_7_7_7_7_7 _7_7_7_S_S_SAM_S_S_S_S_KAA_S_S_SAA_S_S_S_SAM_S_S_S_S_S_KAA_S_S_S_SAA_SAIAMAM_7_7_7_7_7_7_7_7_7_7 _7_7_7_S_S_S_S_S_S_S_S_KAA_S_S_S_S_S_S_S_S_S_S_SAAAA_S_KAA_S_S_S_S_S_SAIAM_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_S_S_S_S_S_S_S_S_KAA_S_S_S_S_S_S_S_S_S_S_S_S_S_S_KAA_S_S_S_S_S_SAIAM_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 } # tile 0 (sub knox walls 2) { _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAMAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAMAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAMAMAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAMAMAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAAAAAAAAAAAAAAAAAIAMAMAMAMAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_S_S_S_S_S_S_S_SAIAMAMAMAMAMAM_K_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_S_S_S_S_S_S_S_SAIAMAMAMAMAMAM_K_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAM_S_S_SAM_S_S_SAIAMAMAMAMAM_KAA_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAM_S_S_S_S_S_S_SAIAMAMAMAMAM_KAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAM_S_S_S_SAA_S_SAIAMAMAMAM_KAAAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAM_S_S_S_S_S_S_SAIAMAMAMAM_KAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAP_SAMAMAM_SAM_S_S_S_S_SAIAMAMAM_KAAAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA_SAMAM_S_S_S_S_S_S_S_SAIAMAMAM_KAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAI_SAMAMAM_S_S_S_S_S_S_SAIAMAM_KAAAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAIAIAIAIAAAIAI_SAMAMAM_S_S_S_S_S_S_SAIAMAM_KAMAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAAAIAIAIAIAIAIAIAIAIAI_SAMAMAM_S_SAM_SAA_S_SAIAM_KAAAMAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAMAIAIAIAIAIAIAMAIAIAIAMAIAI_SAMAMAM_S_S_S_S_S_S_SAIAM_KAMAMAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAIAIAAAIAIAIAI_SAMAIAM_S_S_S_S_S_S_SAI_KAAAMAMAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAI_SAMAM_K_S_S_S_S_S_S_SAI_KAMAMAMAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAMAIAIAIAIAIAIAIAIAIAI_SAMAM_K_K_K_K_K_K_K_K_KAAAMAMAMAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAAAIAIAIAIAIAIAI_UAIAIAI_UAIAI_SAM_K_SAAAAAAAAAAAAAAAAAMAMAMAMAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAI_SAM_K_SAA_S_S_S_S_S_SAIAMAMAMAMAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAI_S_K_SAMAA_S_S_S_S_S_SAIAMAMAMAMAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAI_UAIAIAIAIAIAIAIAIAIAIAI_S_K_SAMAA_S_SAA_S_S_SAIAMAMAMAMAMAM_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAAAIAIAIAIAIAIAAAIAIAIAAAIAIAI_S_SAMAMAA_S_S_S_S_SAMAIAMAMAMAMAMAM_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAI_K_SAMAMAA_S_S_S_S_S_SAIAMAMAMAMAM_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAIAIAIAIAMAIAI_KAMAMAMAA_S_S_S_S_S_SAIAMAMAMAMAM_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_SAM_KAMAA_S_SAA_S_SAAAIAMAMAMAM_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA_S_SAMAMAMAA_S_S_S_S_SAAAIAMAMAMAM_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S_SAMAMAMAMAA_S_S_S_S_S_SAIAMAMAM_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAMAIAIAIAIAIAIAIAIAIAMAMAIAMAA_S_S_S_S_S_SAIAMAMAM_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAIAIAIAMAIAIAIAMAMAMAMAA_S_S_SAM_S_SAIAMAM_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAMAMAMAMAA_S_S_S_SAA_SAIAMAM_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAAAIAIAIAIAIAIAIAIAIAIAIAIAMAMAMAMAA_S_S_S_S_S_SAIAM_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAAAIAIAIAIAIAIAIAMAMAMAMAA_S_S_S_S_S_SAIAM_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAMAIAIAIAI_UAIAIAIAMAIAMAM_K_K_K_K_K_K_K_K_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAMAIAIAIAIAIAIAIAIAIAIAIAIAIAMAMAM_K_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAMAMAM_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAAAIAIAIAIAIAIAMAM_K_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAMAM_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAAAIAI_UAIAIAIAIAIAIAIAIAMAIAM_K_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAIAIAIAIAIAAAIAM_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAM_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_KAM_UAM_KAMAM_KAMAM_KAM_UAM_KAM_K_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 } # tile 0 (sub knox walls 3) { _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_S_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_S_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAM_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAM_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_S_SAM_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAM_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_K_SAMAM_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_K_SAMAM_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_S_K_SAMAM_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_S_K_SAMAM_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAM_K_SAMAM_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAM_K_SAMAM_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAM_K_SAMAM_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_KAAAAAAAAAAAAAAAAAAAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAM_K_SAM_K_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_KAA_S_S_S_S_S_S_SAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAMAM_K_SAM_K_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_KAA_S_SAM_S_S_S_SAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAM_KAM_K_S_K_S_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_KAA_S_S_S_S_S_SAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAMAMAM_K_S_K_S_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_KAA_S_S_S_S_SAAAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAM_KAM_K_K_SAM_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_KAA_S_S_S_S_SAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAMAMAMAM_K_K_SAM_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_KAA_S_S_S_S_SAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAMAMAMAM_K_SAMAM_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_KAA_SAM_S_SAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_SAMAMAMAMAMAM_K_SAMAM_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_KAA_S_S_SAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA_SAMAM_SAMAM_K_SAMAMAM_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_KAA_S_S_SAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAI_SAMAMAMAMAM_K_SAMAM_K_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_KAA_S_S_SAIAIAIAIAIAIAIAIAIAIAIAIAIAAAIAI_SAMAMAMAM_K_SAMAMAMAM_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_KAA_S_S_SAIAIAIAIAIAAAIAIAIAIAIAIAIAIAIAI_SAMAMAMAM_K_SAMAMAMAM_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_KAA_S_S_SAIAIAMAIAIAIAIAIAIAMAIAIAIAMAIAI_SAMAMAM_K_SAM_KAIAMAM_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_KAA_S_S_SAIAIAIAIAIAIAIAIAIAIAIAAAIAIAIAI_SAMAIAM_K_SAMAMAMAMAM_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_KAA_S_S_SAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAI_SAMAM_K_S_SAMAMAMAMAM_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_K_K_K_K_KAIAIAIAIAIAMAIAIAIAIAIAIAIAIAIAI_SAMAM_K_S_SAMAIAM_KAM_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AAAAAAAAAAAIAAAIAIAIAIAIAIAI_UAIAIAI_UAIAI_SAM_K_S_K_SAMAMAMAMAM_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_S_S_S_S_SAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAI_SAM_K_S_K_SAMAMAMAMAM_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_S_S_S_S_SAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAI_S_K_SAM_K_SAMAMAMAM_K_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_S_SAA_S_SAIAIAIAI_UAIAIAIAIAIAIAIAIAIAIAI_S_K_SAM_K_SAMAM_KAM_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_S_S_S_S_SAIAAAIAIAIAIAIAIAAAIAIAIAAAIAIAI_S_SAMAM_K_SAMAMAM_K_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_S_S_S_S_SAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAI_K_SAMAM_K_SAMAMAM_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_S_SAM_S_SAIAIAIAIAIAIAIAIAIAIAIAIAIAMAIAI_KAMAMAM_K_SAMAM_K_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_S_S_S_S_S_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_SAM_KAM_K_SAMAM_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_S_S_S_S_SAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA_S_SAMAMAM_K_SAM_K_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_S_SAAAA_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S_SAMAMAMAM_K_SAM_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_S_S_S_S_SAIAIAIAIAIAIAMAIAIAIAIAIAIAIAIAIAMAMAIAM_K_S_K_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_S_S_S_S_SAIAIAIAIAIAIAIAIAIAIAIAIAMAIAIAIAMAMAMAM_K_S_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_S_S_SAM_SAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAMAMAMAM_K_S_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_S_S_S_S_SAIAIAIAAAIAIAIAIAIAIAIAIAIAIAIAIAMAMAMAM_K_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_S_S_S_S_SAIAIAIAIAIAIAIAIAAAIAIAIAIAIAIAIAMAMAMAM_K_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_K_K_K_K_KAIAIAIAIAIAIAIAMAIAIAIAI_UAIAIAIAMAIAMAM_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAMAIAIAIAIAIAIAIAIAIAIAIAIAIAMAMAM_K_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAMAMAM_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAAAIAIAIAIAIAIAMAM_K_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAMAM_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAAAIAI_UAIAIAIAIAIAIAIAIAMAIAM_K_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAIAIAIAIAIAAAIAM_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAM_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_KAM_UAM_KAMAM_KAMAM_KAM_UAM_KAM_K_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 } # tile 0 (sub knox walls 4) { _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAP_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAAAP_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAAAP_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAP_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAP_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAP_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAP_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAMAP_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAMAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAMAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAMAMAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAMAMAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAMAMAMAMAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_S_S_S_S_S_S_KAA_S_S_S_S_S_S_S_S_S_S_S_S_S_SAIAMAMAMAMAMAM_K_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_S_S_S_S_S_S_KAA_S_S_S_S_S_S_S_S_S_S_S_S_S_SAIAMAMAMAMAMAM_K_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_SAM_S_S_S_S_KAA_S_S_S_S_S_S_S_S_S_SAM_S_S_SAIAMAMAMAMAM_KAA_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_S_S_S_S_S_S_KAA_SAM_S_S_S_SAA_S_S_S_S_S_S_SAIAMAMAMAMAM_KAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_S_SAA_S_S_S_KAA_S_S_S_S_S_S_S_S_S_S_SAA_S_SAIAMAMAMAM_KAAAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_S_S_S_S_S_S_KAA_S_S_S_S_S_S_S_S_S_S_S_S_S_SAIAMAMAMAM_KAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_S_S_S_S_S_S_KAA_S_S_S_SAA_S_S_SAM_S_S_S_S_SAIAMAMAM_KAAAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_S_S_S_S_S_S_KAA_S_S_S_S_S_S_S_S_S_S_S_S_S_SAIAMAMAM_KAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_S_S_S_S_S_S_KAA_S_S_S_S_S_S_S_S_S_S_S_S_S_SAIAMAM_KAAAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_S_S_S_S_S_S_KAA_S_S_SAM_S_S_S_S_S_S_S_S_S_SAIAMAM_KAMAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_S_S_S_S_S_S_KAA_S_S_S_S_S_S_S_S_SAM_SAA_S_SAIAM_KAAAMAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_SAA_S_S_S_S_KAA_S_S_S_S_S_SAA_S_S_S_S_S_S_SAIAM_KAMAMAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_S_S_S_S_S_S_KAA_S_S_S_S_S_S_S_S_S_S_S_S_S_SAI_KAAAMAMAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_S_S_S_S_S_S_KAA_S_S_S_S_S_S_S_S_S_S_S_S_S_SAI_KAMAMAMAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAAAMAMAMAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7AAAAAAAAAAAAAAAAAAAAAAAAAAAA_KAAAAAAAAAAAAAAAAAMAMAMAMAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_S_S_S_S_S_S_S_S_S_S_S_S_S_S_KAA_S_S_S_S_S_SAIAMAMAMAMAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_S_S_S_S_S_S_S_S_S_S_S_S_S_S_KAA_S_S_S_S_S_SAIAMAMAMAMAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_S_S_S_S_SAM_S_S_S_S_S_S_S_S_KAA_S_SAA_S_S_SAIAMAMAMAMAMAM_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_S_SAA_S_S_S_S_S_S_SAA_S_S_S_KAA_S_S_S_S_SAMAIAMAMAMAMAMAM_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_S_S_S_S_S_S_S_S_S_S_S_S_S_S_KAA_S_S_S_S_S_SAIAMAMAMAMAM_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_S_S_S_S_SAA_S_S_S_SAM_S_S_S_KAA_S_S_S_S_S_SAIAMAMAMAMAM_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_S_S_S_S_S_S_S_S_S_S_S_S_S_S_KAA_S_SAA_S_SAAAIAMAMAMAM_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_S_S_S_S_S_S_S_SAMAM_S_S_S_S_KAA_S_S_S_S_SAAAIAMAMAMAM_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_S_S_SAM_S_S_SAA_S_S_S_S_S_S_KAA_S_S_S_S_S_SAIAMAMAM_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_S_S_SAM_S_S_S_S_S_S_S_S_S_S_KAA_S_S_S_S_S_SAIAMAMAM_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_S_S_S_S_S_S_S_S_S_S_S_S_S_S_KAA_S_S_SAM_S_SAIAMAM_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_S_S_SAA_S_S_S_SAM_S_S_S_S_S_KAA_S_S_S_SAA_SAIAMAM_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_S_S_S_S_S_S_S_S_S_S_SAAAA_S_KAA_S_S_S_S_S_SAIAM_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_S_S_S_S_S_S_S_S_S_S_S_S_S_S_KAA_S_S_S_S_S_SAIAM_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 } # tile 0 (sub knox walls 5) { _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_K_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_K_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_K_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_S_K_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_S_K_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAM_K_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAM_K_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAM_K_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAM_K_K_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAMAM_K_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAIAM_K_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAMAMAM_K_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAMAM_K_K_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAM_KAMAM_K_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAMAMAMAM_K_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_S_SAMAMAMAMAM_S_7_7_7_7_7_7_7_7 _7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAMAMAIAM_K_S_7_7_7_7_7_7_7_7 _7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_K_SAMAM_KAMAM_K_S_7_7_7_7_7_7_7_7 _7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_K_SAMAMAMAM_K_SAM_7_7_7_7_7_7_7_7 _7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_S_K_SAMAMAMAM_K_SAM_7_7_7_7_7_7_7_7 _7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_S_K_SAMAMAM_K_SAMAM_7_7_7_7_7_7_7_7 _7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAM_K_SAMAMAM_K_SAMAM_7_7_7_7_7_7_7_7 _7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAM_K_SAMAM_K_SAIAMAM_7_7_7_7_7_7_7_7 _7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAM_K_SAMAM_K_S_SAM_K_7_7_7_7_7_7_7_7 _7_7_7_KAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA_SAMAM_K_SAM_K_S_K_SAMAM_7_7_7_7_7_7_7_7 _7_7_7_KAA_S_S_S_S_S_S_S_S_S_S_S_S_S_S_KAA_S_S_S_S_S_S_SAMAMAM_K_SAM_K_S_K_SAIAM_7_7_7_7_7_7_7_7 _7_7_7_KAA_S_SAM_S_S_S_S_S_S_S_S_S_S_S_KAA_S_S_S_S_S_S_SAM_KAM_K_S_K_SAM_K_SAMAM_7_7_7_7_7_7_7_7 _7_7_7_KAA_S_S_S_S_S_S_S_S_SAM_S_S_S_S_KAA_S_S_S_S_S_SAMAMAMAM_K_S_K_SAM_K_S_KAM_7_7_7_7_7_7_7_7 _7_7_7_KAA_S_S_S_S_SAA_S_S_S_S_S_S_S_S_KAA_SAM_S_S_S_SAMAM_KAM_K_K_SAMAM_K_SAMAM_7_7_7_7_7_7_7_7 _7_7_7_KAA_S_S_S_S_S_S_S_S_S_SAA_S_S_S_KAA_S_S_S_S_S_SAMAMAMAM_K_K_SAMAM_K_SAMAM_7_7_7_7_7_7_7_7 _7_7_7_KAA_S_S_S_S_S_S_S_S_S_S_S_S_S_S_KAA_S_S_S_S_S_SAMAMAMAM_K_SAMAMAM_K_SAMAM_7_7_7_7_7_7_7_7 _7_7_7_KAA_SAM_S_S_S_S_SAA_S_S_S_S_S_S_KAA_S_S_S_SAA_SAMAMAMAM_K_SAMAMAM_K_SAMAM_7_7_7_7_7_7_7_7 _7_7_7_KAA_S_S_S_S_S_S_S_S_S_S_S_S_S_S_KAA_S_S_S_S_S_S_SAMAM_K_SAMAMAMAM_K_S_K_K_7_7_7_7_7_7_7_7 _7_7_7_KAA_S_S_S_S_SAMAM_S_S_S_S_S_S_S_KAA_S_S_S_S_S_SAMAMAM_K_SAMAM_KAM_K_SAM_7_7_7_7_7_7_7_7_7 _7_7_7_KAA_S_S_SAA_S_S_S_S_S_S_S_S_S_S_KAA_S_S_SAM_S_SAMAM_K_SAMAMAMAMAM_K_S_K_7_7_7_7_7_7_7_7_7 _7_7_7_KAA_S_S_S_S_S_S_S_S_S_S_S_S_S_S_KAA_S_S_S_S_S_SAMAM_K_SAMAMAMAMAM_K_S_7_7_7_7_7_7_7_7_7_7 _7_7_7_KAA_S_S_S_S_S_S_S_S_SAA_S_S_S_S_KAA_S_S_S_S_S_SAM_K_SAM_KAIAMAMAM_K_K_7_7_7_7_7_7_7_7_7_7 _7_7_7_KAA_S_S_S_S_S_S_S_S_S_S_S_S_S_S_KAA_S_S_S_S_S_SAM_K_SAMAMAMAMAMAM_K_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_KAA_S_S_S_S_S_S_S_S_S_S_S_S_S_S_KAA_S_S_S_S_S_S_K_SAMAMAMAMAMAMAM_K_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_SAMAMAIAM_KAMAM_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AAAAAAAAAAAAAAAA_KAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA_SAMAMAMAMAMAMAM_K_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_S_S_S_S_S_S_S_S_KAA_S_S_S_S_S_S_S_S_S_S_S_S_S_SAMAMAMAMAMAMAMAM_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_S_S_S_S_S_S_S_S_KAA_S_S_S_S_S_S_S_S_S_S_S_S_S_SAMAMAMAMAMAMAM_K_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_S_SAA_S_SAM_S_S_KAA_S_S_S_S_SAM_S_S_S_S_S_S_S_SAMAMAMAMAM_KAM_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_S_S_S_S_S_S_S_S_KAA_S_SAA_S_S_S_S_S_S_SAA_S_S_SAMAMAMAMAMAM_K_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_S_S_S_S_S_S_S_S_KAA_S_S_S_S_S_S_S_S_S_S_S_S_S_SAMAMAMAMAMAM_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_S_SAM_S_SAA_S_S_KAA_S_S_S_S_SAA_S_S_S_SAM_S_S_SAMAMAMAMAM_K_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_S_S_S_S_S_S_S_S_KAA_S_S_S_S_S_S_S_S_S_S_S_S_S_SAMAMAMAMAM_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_S_S_S_S_S_S_S_S_KAA_S_S_S_S_S_S_S_SAMAM_S_S_S_SAMAMAMAM_K_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_S_SAAAA_S_S_S_S_KAA_S_S_SAM_S_S_SAA_S_S_S_S_S_SAMAMAMAM_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_S_S_S_S_S_S_S_S_KAA_S_S_SAM_S_S_S_S_S_S_S_S_S_SAMAMAM_K_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_S_S_S_S_SAA_S_S_KAA_S_S_S_S_S_S_S_S_S_S_S_S_S_SAMAMAM_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_S_S_SAM_S_S_S_S_KAA_S_S_SAA_S_S_S_SAM_S_S_S_S_SAMAM_K_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_S_S_S_S_S_S_S_S_KAA_S_S_S_S_S_S_S_S_S_S_SAAAA_SAMAM_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_S_S_S_S_S_S_S_S_KAA_S_S_S_S_S_S_S_S_S_S_S_S_S_SAM_K_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAM_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 } # tile 0 (sub knox walls 6) { _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAP_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAAAP_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAAAP_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAP_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAP_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAP_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAP_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAMAP_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_7_7_7_7_7 _7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAM_7_7_7_7_7 _7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAM_7_7_7_7_7 _7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAM_7_7_7_7_7 _7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAMAM_7_7_7_7_7 _7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAMAM_7_7_7_7_7 _7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAMAMAM_7_7_7_7_7 _7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAMAMAM_7_7_7_7_7 _7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAMAMAMAM_7_7_7_7_7 _7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAMAMAMAM_7_7_7_7_7 _7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAMAMAMAMAM_7_7_7_7_7 _7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAMAMAMAMAM_7_7_7_7_7 _7_7_7_KAAAAAAAAAAAAAAAAAAAPAPAPAPAPAPAPAPAPAPAPAPAPAPAAAAAAAAAAAAAAAAAIAMAMAMAMAMAMAM_7_7_7_7_7 _7_7_7_KAA_S_S_S_S_S_S_SAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_S_S_S_S_S_S_S_SAIAMAMAMAMAMAM_K_7_7_7_7_7 _7_7_7_KAA_S_SAM_S_S_S_SAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_S_S_S_S_S_S_S_SAIAMAMAMAMAMAM_K_7_7_7_7_7 _7_7_7_KAA_S_S_S_S_S_SAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAM_S_S_SAM_S_S_SAIAMAMAMAMAM_KAA_7_7_7_7_7 _7_7_7_KAA_S_S_S_S_SAAAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAM_S_S_S_S_S_S_SAIAMAMAMAMAM_KAM_7_7_7_7_7 _7_7_7_KAA_S_S_S_S_SAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAM_S_S_S_SAA_S_SAIAMAMAMAM_KAAAM_7_7_7_7_7 _7_7_7_KAA_S_S_S_S_SAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAM_S_S_S_S_S_S_SAIAMAMAMAM_KAMAM_7_7_7_7_7 _7_7_7_KAA_SAM_S_SAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_SAMAMAM_SAM_S_S_S_S_SAIAMAMAM_KAAAMAM_7_7_7_7_7 _7_7_7_KAA_S_S_SAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA_SAMAM_S_S_S_S_S_S_S_SAIAMAMAM_KAMAMAM_7_7_7_7_7 _7_7_7_KAA_S_S_SAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAI_SAMAMAM_S_S_S_S_S_S_SAIAMAM_KAAAMAMAM_7_7_7_7_7 _7_7_7_KAA_S_S_SAIAIAIAIAIAIAIAIAIAIAIAIAIAAAIAI_SAMAMAM_S_S_S_S_S_S_SAIAMAM_KAMAMAMAM_7_7_7_7_7 _7_7_7_KAA_S_S_SAIAIAIAIAIAAAIAIAIAIAIAIAIAIAIAI_SAMAMAM_S_SAM_SAA_S_SAIAM_KAAAMAMAMAM_7_7_7_7_7 _7_7_7_KAA_S_S_SAIAIAMAIAIAIAIAIAIAMAIAIAIAMAIAI_SAMAMAM_S_S_S_S_S_S_SAIAM_KAMAMAMAMAM_7_7_7_7_7 _7_7_7_KAA_S_S_SAIAIAIAIAIAIAIAIAIAIAIAAAIAIAIAI_SAMAIAM_S_S_S_S_S_S_SAI_KAAAMAMAMAMAM_7_7_7_7_7 _7_7_7_KAA_S_S_SAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAI_SAMAM_K_S_S_S_S_S_S_SAI_KAMAMAMAMAMAM_7_7_7_7_7 _7_7_7_K_K_K_K_KAIAIAIAIAIAMAIAIAIAIAIAIAIAIAIAI_SAMAM_K_K_K_K_K_K_K_K_KAAAMAMAMAMAMAM_7_7_7_7_7 _7_7_7AAAAAAAAAAAIAAAIAIAIAIAIAIAI_UAIAIAI_UAIAI_SAM_K_SAAAAAAAAAAAAAAAAAMAMAMAMAMAMAM_7_7_7_7_7 _7_7_7_S_S_S_S_SAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAI_SAM_K_SAA_S_S_S_S_S_SAIAMAMAMAMAMAMAM_7_7_7_7_7 _7_7_7_S_S_S_S_SAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAI_S_K_SAMAA_S_S_S_S_S_SAIAMAMAMAMAMAMAM_7_7_7_7_7 _7_7_7_S_SAA_S_SAIAIAIAI_UAIAIAIAIAIAIAIAIAIAIAI_S_K_SAMAA_S_SAA_S_S_SAIAMAMAMAMAMAM_7_7_7_7_7_7 _7_7_7_S_S_S_S_SAIAAAIAIAIAIAIAIAAAIAIAIAAAIAIAI_S_SAMAMAA_S_S_S_S_SAMAIAMAMAMAMAMAM_7_7_7_7_7_7 _7_7_7_S_S_S_S_SAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAI_K_SAMAMAA_S_S_S_S_S_SAIAMAMAMAMAM_7_7_7_7_7_7_7 _7_7_7_S_SAM_S_SAIAIAIAIAIAIAIAIAIAIAIAIAIAMAIAI_KAMAMAMAA_S_S_S_S_S_SAIAMAMAMAMAM_7_7_7_7_7_7_7 _7_7_7_S_S_S_S_S_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_SAM_KAMAA_S_SAA_S_SAAAIAMAMAMAM_7_7_7_7_7_7_7_7 _7_7_7_S_S_S_S_SAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA_S_SAMAMAMAA_S_S_S_S_SAAAIAMAMAMAM_7_7_7_7_7_7_7_7 _7_7_7_S_SAAAA_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S_SAMAMAMAMAA_S_S_S_S_S_SAIAMAMAM_7_7_7_7_7_7_7_7_7 _7_7_7_S_S_S_S_SAIAIAIAIAIAIAMAIAIAIAIAIAIAIAIAIAMAMAIAMAA_S_S_S_S_S_SAIAMAMAM_7_7_7_7_7_7_7_7_7 _7_7_7_S_S_S_S_SAIAIAIAIAIAIAIAIAIAIAIAIAMAIAIAIAMAMAMAMAA_S_S_SAM_S_SAIAMAM_7_7_7_7_7_7_7_7_7_7 _7_7_7_S_S_SAM_SAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAMAMAMAMAA_S_S_S_SAA_SAIAMAM_7_7_7_7_7_7_7_7_7_7 _7_7_7_S_S_S_S_SAIAIAIAAAIAIAIAIAIAIAIAIAIAIAIAIAMAMAMAMAA_S_S_S_S_S_SAIAM_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_S_S_S_S_SAIAIAIAIAIAIAIAIAAAIAIAIAIAIAIAIAMAMAMAMAA_S_S_S_S_S_SAIAM_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_K_K_K_K_KAIAIAIAIAIAIAIAMAIAIAIAI_UAIAIAIAMAIAMAM_K_K_K_K_K_K_K_K_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAMAIAIAIAIAIAIAIAIAIAIAIAIAIAMAMAM_K_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAMAMAM_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAAAIAIAIAIAIAIAMAM_K_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAMAM_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAAAIAI_UAIAIAIAIAIAIAIAIAMAIAM_K_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAIAIAIAIAIAAAIAM_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAM_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_KAM_UAM_KAMAM_KAMAM_KAM_UAM_KAM_K_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 } # tile 0 (sub knox walls 7) { _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAP_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAAAP_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAAAP_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAP_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAP_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAP_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAP_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAMAP_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_7_7_7_7_7 _7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAM_7_7_7_7_7 _7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAM_7_7_7_7_7 _7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAM_7_7_7_7_7 _7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAMAM_7_7_7_7_7 _7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAMAM_7_7_7_7_7 _7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAMAMAM_7_7_7_7_7 _7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAMAMAM_7_7_7_7_7 _7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAMAMAMAM_7_7_7_7_7 _7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAMAMAMAM_7_7_7_7_7 _7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAMAMAMAMAM_7_7_7_7_7 _7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAMAMAMAMAM_7_7_7_7_7 _7_7_7_KAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAMAMAMAMAMAMAM_7_7_7_7_7 _7_7_7_KAA_S_S_S_S_S_S_S_S_S_S_S_S_S_S_KAA_S_S_S_S_S_S_S_S_S_S_S_S_S_SAIAMAMAMAMAMAM_K_7_7_7_7_7 _7_7_7_KAA_S_SAM_S_S_S_S_S_S_S_S_S_S_S_KAA_S_S_S_S_S_S_S_S_S_S_S_S_S_SAIAMAMAMAMAMAM_K_7_7_7_7_7 _7_7_7_KAA_S_S_S_S_S_S_S_S_SAM_S_S_S_S_KAA_S_S_S_S_S_S_S_S_S_SAM_S_S_SAIAMAMAMAMAM_KAA_7_7_7_7_7 _7_7_7_KAA_S_S_S_S_SAA_S_S_S_S_S_S_S_S_KAA_SAM_S_S_S_SAA_S_S_S_S_S_S_SAIAMAMAMAMAM_KAM_7_7_7_7_7 _7_7_7_KAA_S_S_S_S_S_S_S_S_S_SAA_S_S_S_KAA_S_S_S_S_S_S_S_S_S_S_SAA_S_SAIAMAMAMAM_KAAAM_7_7_7_7_7 _7_7_7_KAA_S_S_S_S_S_S_S_S_S_S_S_S_S_S_KAA_S_S_S_S_S_S_S_S_S_S_S_S_S_SAIAMAMAMAM_KAMAM_7_7_7_7_7 _7_7_7_KAA_SAM_S_S_S_S_SAA_S_S_S_S_S_S_KAA_S_S_S_SAA_S_S_SAM_S_S_S_S_SAIAMAMAM_KAAAMAM_7_7_7_7_7 _7_7_7_KAA_S_S_S_S_S_S_S_S_S_S_S_S_S_S_KAA_S_S_S_S_S_S_S_S_S_S_S_S_S_SAIAMAMAM_KAMAMAM_7_7_7_7_7 _7_7_7_KAA_S_S_S_S_SAMAM_S_S_S_S_S_S_S_KAA_S_S_S_S_S_S_S_S_S_S_S_S_S_SAIAMAM_KAAAMAMAM_7_7_7_7_7 _7_7_7_KAA_S_S_SAA_S_S_S_S_S_S_S_S_S_S_KAA_S_S_SAM_S_S_S_S_S_S_S_S_S_SAIAMAM_KAMAMAMAM_7_7_7_7_7 _7_7_7_KAA_S_S_S_S_S_S_S_S_S_S_S_S_S_S_KAA_S_S_S_S_S_S_S_S_SAM_SAA_S_SAIAM_KAAAMAMAMAM_7_7_7_7_7 _7_7_7_KAA_S_S_S_S_S_S_S_S_SAA_S_S_S_S_KAA_S_S_S_S_S_SAA_S_S_S_S_S_S_SAIAM_KAMAMAMAMAM_7_7_7_7_7 _7_7_7_KAA_S_S_S_S_S_S_S_S_S_S_S_S_S_S_KAA_S_S_S_S_S_S_S_S_S_S_S_S_S_SAI_KAAAMAMAMAMAM_7_7_7_7_7 _7_7_7_KAA_S_S_S_S_S_S_S_S_S_S_S_S_S_S_KAA_S_S_S_S_S_S_S_S_S_S_S_S_S_SAI_KAMAMAMAMAMAM_7_7_7_7_7 _7_7_7_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAAAMAMAMAMAMAM_7_7_7_7_7 _7_7_7AAAAAAAAAAAAAAAA_KAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA_KAAAAAAAAAAAAAAAAAMAMAMAMAMAMAM_7_7_7_7_7 _7_7_7_S_S_S_S_S_S_S_S_KAA_S_S_S_S_S_S_S_S_S_S_S_S_S_S_KAA_S_S_S_S_S_SAIAMAMAMAMAMAMAM_7_7_7_7_7 _7_7_7_S_S_S_S_S_S_S_S_KAA_S_S_S_S_S_S_S_S_S_S_S_S_S_S_KAA_S_S_S_S_S_SAIAMAMAMAMAMAMAM_7_7_7_7_7 _7_7_7_S_SAA_S_SAM_S_S_KAA_S_S_S_S_SAM_S_S_S_S_S_S_S_S_KAA_S_SAA_S_S_SAIAMAMAMAMAMAM_7_7_7_7_7_7 _7_7_7_S_S_S_S_S_S_S_S_KAA_S_SAA_S_S_S_S_S_S_SAA_S_S_S_KAA_S_S_S_S_SAMAIAMAMAMAMAMAM_7_7_7_7_7_7 _7_7_7_S_S_S_S_S_S_S_S_KAA_S_S_S_S_S_S_S_S_S_S_S_S_S_S_KAA_S_S_S_S_S_SAIAMAMAMAMAM_7_7_7_7_7_7_7 _7_7_7_S_SAM_S_SAA_S_S_KAA_S_S_S_S_SAA_S_S_S_SAM_S_S_S_KAA_S_S_S_S_S_SAIAMAMAMAMAM_7_7_7_7_7_7_7 _7_7_7_S_S_S_S_S_S_S_S_KAA_S_S_S_S_S_S_S_S_S_S_S_S_S_S_KAA_S_SAA_S_SAAAIAMAMAMAM_7_7_7_7_7_7_7_7 _7_7_7_S_S_S_S_S_S_S_S_KAA_S_S_S_S_S_S_S_SAMAM_S_S_S_S_KAA_S_S_S_S_SAAAIAMAMAMAM_7_7_7_7_7_7_7_7 _7_7_7_S_SAAAA_S_S_S_S_KAA_S_S_SAM_S_S_SAA_S_S_S_S_S_S_KAA_S_S_S_S_S_SAIAMAMAM_7_7_7_7_7_7_7_7_7 _7_7_7_S_S_S_S_S_S_S_S_KAA_S_S_SAM_S_S_S_S_S_S_S_S_S_S_KAA_S_S_S_S_S_SAIAMAMAM_7_7_7_7_7_7_7_7_7 _7_7_7_S_S_S_S_SAA_S_S_KAA_S_S_S_S_S_S_S_S_S_S_S_S_S_S_KAA_S_S_SAM_S_SAIAMAM_7_7_7_7_7_7_7_7_7_7 _7_7_7_S_S_SAM_S_S_S_S_KAA_S_S_SAA_S_S_S_SAM_S_S_S_S_S_KAA_S_S_S_SAA_SAIAMAM_7_7_7_7_7_7_7_7_7_7 _7_7_7_S_S_S_S_S_S_S_S_KAA_S_S_S_S_S_S_S_S_S_S_SAAAA_S_KAA_S_S_S_S_S_SAIAM_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_S_S_S_S_S_S_S_S_KAA_S_S_S_S_S_S_S_S_S_S_S_S_S_S_KAA_S_S_S_S_S_SAIAM_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 } # tile 0 (sub knox walls 8) { _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_7_7_7_7_7 _7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAM_7_7_7_7_7 _7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAM_7_7_7_7_7 _7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAM_7_7_7_7_7 _7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAMAM_7_7_7_7_7 _7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAMAM_7_7_7_7_7 _7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAMAMAM_7_7_7_7_7 _7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAMAMAM_7_7_7_7_7 _7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAMAMAMAM_7_7_7_7_7 _7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAMAMAMAM_7_7_7_7_7 _7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAMAMAMAMAM_7_7_7_7_7 _7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAMAMAMAMAM_7_7_7_7_7 _7_7_7_KAAAAAAAAAAAAAAAAAAAPAPAPAPAPAPAPAPAPAPAPAPAPAPAAAAAAAAAAAAAAAAAIAMAMAMAMAMAMAM_7_7_7_7_7 _7_7_7_KAA_S_S_S_S_S_S_SAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_S_S_S_S_S_S_S_SAIAMAMAMAMAMAM_K_7_7_7_7_7 _7_7_7_KAA_S_SAM_S_S_S_SAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_S_S_S_S_S_S_S_SAIAMAMAMAMAMAM_K_7_7_7_7_7 _7_7_7_KAA_S_S_S_S_S_SAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAM_S_S_SAM_S_S_SAIAMAMAMAMAM_KAA_7_7_7_7_7 _7_7_7_KAA_S_S_S_S_SAAAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAM_S_S_S_S_S_S_SAIAMAMAMAMAM_KAM_7_7_7_7_7 _7_7_7_KAA_S_S_S_S_SAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAM_S_S_S_SAA_S_SAIAMAMAMAM_KAAAM_7_7_7_7_7 _7_7_7_KAA_S_S_S_S_SAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAM_S_S_S_S_S_S_SAIAMAMAMAM_KAMAM_7_7_7_7_7 _7_7_7_KAA_SAM_S_SAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_SAMAMAM_SAM_S_S_S_S_SAIAMAMAM_KAAAMAM_7_7_7_7_7 _7_7_7_KAA_S_S_SAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA_SAMAM_S_S_S_S_S_S_S_SAIAMAMAM_KAMAMAM_7_7_7_7_7 _7_7_7_KAA_S_S_SAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAI_SAMAMAM_S_S_S_S_S_S_SAIAMAM_KAAAMAMAM_7_7_7_7_7 _7_7_7_KAA_S_S_SAIAIAIAIAIAIAIAIAIAIAIAIAIAAAIAI_SAMAMAM_S_S_S_S_S_S_SAIAMAM_KAMAMAMAM_7_7_7_7_7 _7_7_7_KAA_S_S_SAIAIAIAIAIAAAIAIAIAIAIAIAIAIAIAI_SAMAMAM_S_SAM_SAA_S_SAIAM_KAAAMAMAMAM_7_7_7_7_7 _7_7_7_KAA_S_S_SAIAIAMAIAIAIAIAIAIAMAIAIAIAMAIAI_SAMAMAM_S_S_S_S_S_S_SAIAM_KAMAMAMAMAM_7_7_7_7_7 _7_7_7_KAA_S_S_SAIAIAIAIAIAIAIAIAIAIAIAAAIAIAIAI_SAMAIAM_S_S_S_S_S_S_SAI_KAAAMAMAMAMAM_7_7_7_7_7 _7_7_7_KAA_S_S_SAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAI_SAMAM_K_S_S_S_S_S_S_SAI_KAMAMAMAMAMAM_7_7_7_7_7 _7_7_7_K_K_K_K_KAIAIAIAIAIAMAIAIAIAIAIAIAIAIAIAI_SAMAM_K_K_K_K_K_K_K_K_KAAAMAMAMAMAMAM_7_7_7_7_7 _7_7_7AAAAAAAAAAAIAAAIAIAIAIAIAIAI_UAIAIAI_UAIAI_SAM_K_SAAAAAAAAAAAAAAAAAMAMAMAMAMAMAM_7_7_7_7_7 _7_7_7_S_S_S_S_SAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAI_SAM_K_SAA_S_S_S_S_S_SAIAMAMAMAMAMAMAM_7_7_7_7_7 _7_7_7_S_S_S_S_SAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAI_S_K_SAMAA_S_S_S_S_S_SAIAMAMAMAMAMAMAM_7_7_7_7_7 _7_7_7_S_SAA_S_SAIAIAIAI_UAIAIAIAIAIAIAIAIAIAIAI_S_K_SAMAA_S_SAA_S_S_SAIAMAMAMAMAMAM_7_7_7_7_7_7 _7_7_7_S_S_S_S_SAIAAAIAIAIAIAIAIAAAIAIAIAAAIAIAI_S_SAMAMAA_S_S_S_S_SAMAIAMAMAMAMAMAM_7_7_7_7_7_7 _7_7_7_S_S_S_S_SAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAI_K_SAMAMAA_S_S_S_S_S_SAIAMAMAMAMAM_7_7_7_7_7_7_7 _7_7_7_S_SAM_S_SAIAIAIAIAIAIAIAIAIAIAIAIAIAMAIAI_KAMAMAMAA_S_S_S_S_S_SAIAMAMAMAMAM_7_7_7_7_7_7_7 _7_7_7_S_S_S_S_S_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_SAM_KAMAA_S_SAA_S_SAAAIAMAMAMAM_7_7_7_7_7_7_7_7 _7_7_7_S_S_S_S_SAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA_S_SAMAMAMAA_S_S_S_S_SAAAIAMAMAMAM_7_7_7_7_7_7_7_7 _7_7_7_S_SAAAA_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S_SAMAMAMAMAA_S_S_S_S_S_SAIAMAMAM_7_7_7_7_7_7_7_7_7 _7_7_7_S_S_S_S_SAIAIAIAIAIAIAMAIAIAIAIAIAIAIAIAIAMAMAIAMAA_S_S_S_S_S_SAIAMAMAM_7_7_7_7_7_7_7_7_7 _7_7_7_S_S_S_S_SAIAIAIAIAIAIAIAIAIAIAIAIAMAIAIAIAMAMAMAMAA_S_S_SAM_S_SAIAMAM_7_7_7_7_7_7_7_7_7_7 _7_7_7_S_S_SAM_SAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAMAMAMAMAA_S_S_S_SAA_SAIAMAM_7_7_7_7_7_7_7_7_7_7 _7_7_7_S_S_S_S_SAIAIAIAAAIAIAIAIAIAIAIAIAIAIAIAIAMAMAMAMAA_S_S_S_S_S_SAIAM_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_S_S_S_S_SAIAIAIAIAIAIAIAIAAAIAIAIAIAIAIAIAMAMAMAMAA_S_S_S_S_S_SAIAM_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_K_K_K_K_KAIAIAIAIAIAIAIAMAIAIAIAI_UAIAIAIAMAIAMAM_K_K_K_K_K_K_K_K_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAMAIAIAIAIAIAIAIAIAIAIAIAIAIAMAMAM_K_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAMAMAM_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAAAIAIAIAIAIAIAMAM_K_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAMAM_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAAAIAI_UAIAIAIAIAIAIAIAIAMAIAM_K_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAIAIAIAIAIAAAIAM_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAM_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_KAM_UAM_KAMAM_KAMAM_KAM_UAM_KAM_K_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 } # tile 0 (sub knox walls 9) { _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAP_K_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_K_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_K_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_S_K_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_S_K_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAM_K_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAM_K_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAM_K_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAM_K_K_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAMAM_K_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAIAM_K_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAMAMAM_K_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAMAM_K_K_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAM_KAMAM_K_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAMAMAMAM_K_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_S_SAMAMAMAMAM_S_7_7_7_7_7_7_7_7 _7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAMAMAIAM_K_S_7_7_7_7_7_7_7_7 _7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_K_SAMAM_KAMAM_K_S_7_7_7_7_7_7_7_7 _7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_K_SAMAMAMAM_K_SAM_7_7_7_7_7_7_7_7 _7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_S_K_SAMAMAMAM_K_SAM_7_7_7_7_7_7_7_7 _7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_S_K_SAMAMAM_K_SAMAM_7_7_7_7_7_7_7_7 _7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAM_K_SAMAMAM_K_SAMAM_7_7_7_7_7_7_7_7 _7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAM_K_SAMAM_K_SAIAMAM_7_7_7_7_7_7_7_7 _7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAM_K_SAMAM_K_S_SAM_K_7_7_7_7_7_7_7_7 _7_7_7_KAAAAAAAAAAAAAAAAAAAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAM_K_SAM_K_S_K_SAMAM_7_7_7_7_7_7_7_7 _7_7_7_KAA_S_S_S_S_S_S_SAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAMAM_K_SAM_K_S_K_SAIAM_7_7_7_7_7_7_7_7 _7_7_7_KAA_S_SAM_S_S_S_SAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAM_KAM_K_S_K_SAM_K_SAMAM_7_7_7_7_7_7_7_7 _7_7_7_KAA_S_S_S_S_S_SAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAMAMAM_K_S_K_SAM_K_S_KAM_7_7_7_7_7_7_7_7 _7_7_7_KAA_S_S_S_S_SAAAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAM_KAM_K_K_SAMAM_K_SAMAM_7_7_7_7_7_7_7_7 _7_7_7_KAA_S_S_S_S_SAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAMAMAMAM_K_K_SAMAM_K_SAMAM_7_7_7_7_7_7_7_7 _7_7_7_KAA_S_S_S_S_SAPAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAMAMAMAM_K_SAMAMAM_K_SAMAM_7_7_7_7_7_7_7_7 _7_7_7_KAA_SAM_S_SAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_SAMAMAMAMAMAM_K_SAMAMAM_K_SAMAM_7_7_7_7_7_7_7_7 _7_7_7_KAA_S_S_SAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA_SAMAM_SAMAM_K_SAMAMAMAM_K_S_K_K_7_7_7_7_7_7_7_7 _7_7_7_KAA_S_S_SAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAI_SAMAMAMAMAM_K_SAMAM_KAM_K_SAM_7_7_7_7_7_7_7_7_7 _7_7_7_KAA_S_S_SAIAIAIAIAIAIAIAIAIAIAIAIAIAAAIAI_SAMAMAMAM_K_SAMAMAMAMAM_K_S_K_7_7_7_7_7_7_7_7_7 _7_7_7_KAA_S_S_SAIAIAIAIAIAAAIAIAIAIAIAIAIAIAIAI_SAMAMAMAM_K_SAMAMAMAMAM_K_S_7_7_7_7_7_7_7_7_7_7 _7_7_7_KAA_S_S_SAIAIAMAIAIAIAIAIAIAMAIAIAIAMAIAI_SAMAMAM_K_SAM_KAIAMAMAM_K_K_7_7_7_7_7_7_7_7_7_7 _7_7_7_KAA_S_S_SAIAIAIAIAIAIAIAIAIAIAIAAAIAIAIAI_SAMAIAM_K_SAMAMAMAMAMAM_K_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_KAA_S_S_SAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAI_SAMAM_K_S_SAMAMAMAMAMAM_K_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_K_K_K_K_KAIAIAIAIAIAMAIAIAIAIAIAIAIAIAIAI_SAMAM_K_S_SAMAIAM_KAMAM_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7AAAAAAAAAAAIAAAIAIAIAIAIAIAI_UAIAIAI_UAIAI_SAM_K_S_K_SAMAMAMAMAM_K_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_S_S_S_S_SAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAI_SAM_K_S_K_SAMAMAMAMAM_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_S_S_S_S_SAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAI_S_K_SAM_K_SAMAMAMAM_K_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_S_SAA_S_SAIAIAIAI_UAIAIAIAIAIAIAIAIAIAIAI_S_K_SAM_K_SAMAM_KAM_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_S_S_S_S_SAIAAAIAIAIAIAIAIAAAIAIAIAAAIAIAI_S_SAMAM_K_SAMAMAM_K_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_S_S_S_S_SAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAI_K_SAMAM_K_SAMAMAM_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_S_SAM_S_SAIAIAIAIAIAIAIAIAIAIAIAIAIAMAIAI_KAMAMAM_K_SAMAM_K_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_S_S_S_S_S_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_SAM_KAM_K_SAMAM_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_S_S_S_S_SAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA_S_SAMAMAM_K_SAM_K_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_S_SAAAA_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S_SAMAMAMAM_K_SAM_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_S_S_S_S_SAIAIAIAIAIAIAMAIAIAIAIAIAIAIAIAIAMAMAIAM_K_S_K_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_S_S_S_S_SAIAIAIAIAIAIAIAIAIAIAIAIAMAIAIAIAMAMAMAM_K_S_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_S_S_SAM_SAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAMAMAMAM_K_S_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_S_S_S_S_SAIAIAIAAAIAIAIAIAIAIAIAIAIAIAIAIAMAMAMAM_K_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_S_S_S_S_SAIAIAIAIAIAIAIAIAAAIAIAIAIAIAIAIAMAMAMAM_K_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_K_K_K_K_KAIAIAIAIAIAIAIAMAIAIAIAI_UAIAIAIAMAIAMAM_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAMAIAIAIAIAIAIAIAIAIAIAIAIAIAMAMAM_K_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAMAMAM_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAAAIAIAIAIAIAIAMAM_K_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAMAM_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAAAIAI_UAIAIAIAIAIAIAIAIAMAIAM_K_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAIAIAIAIAIAAAIAM_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAM_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_KAM_UAM_KAMAM_KAMAM_KAM_UAM_KAM_K_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 } # tile 0 (sub knox walls 10) { _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAP_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAAAP_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAAAP_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAP_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAP_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAP_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAP_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAMAP_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAP_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAMAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAMAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAMAMAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAMAMAMAMAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAAAAAAAAAAAAAAAAAIAMAMAMAMAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_S_S_S_S_S_S_S_SAIAMAMAMAMAMAM_K_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_S_S_S_S_S_S_S_SAIAMAMAMAMAMAM_K_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAM_S_S_SAM_S_S_SAIAMAMAMAMAM_KAA_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAM_S_S_S_S_S_S_SAIAMAMAMAMAM_KAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAM_S_S_S_SAA_S_SAIAMAMAMAM_KAAAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAA_SAMAM_S_S_S_S_S_S_SAIAMAMAMAM_KAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7_7APAPAPAPAPAPAPAPAPAPAPAPAPAPAP_SAMAMAM_SAM_S_S_S_S_SAIAMAMAM_KAAAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA_SAMAM_S_S_S_S_S_S_S_SAIAMAMAM_KAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAI_SAMAMAM_S_S_S_S_S_S_SAIAMAM_KAAAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAIAIAIAIAAAIAI_SAMAMAM_S_S_S_S_S_S_SAIAMAM_KAMAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAAAIAIAIAIAIAIAIAIAIAI_SAMAMAM_S_SAM_SAA_S_SAIAM_KAAAMAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAMAIAIAIAIAIAIAMAIAIAIAMAIAI_SAMAMAM_S_S_S_S_S_S_SAIAM_KAMAMAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAIAIAAAIAIAIAI_SAMAIAM_S_S_S_S_S_S_SAI_KAAAMAMAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAI_SAMAM_K_S_S_S_S_S_S_SAI_KAMAMAMAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAMAIAIAIAIAIAIAIAIAIAI_SAMAM_K_K_K_K_K_K_K_K_KAAAMAMAMAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAAAIAIAIAIAIAIAI_UAIAIAI_UAIAI_SAM_K_SAAAAAAAAAAAAAAAAAMAMAMAMAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAI_SAM_K_SAA_S_S_S_S_S_SAIAMAMAMAMAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAI_S_K_SAMAA_S_S_S_S_S_SAIAMAMAMAMAMAMAM_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAI_UAIAIAIAIAIAIAIAIAIAIAI_S_K_SAMAA_S_SAA_S_S_SAIAMAMAMAMAMAM_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAAAIAIAIAIAIAIAAAIAIAIAAAIAIAI_S_SAMAMAA_S_S_S_S_SAMAIAMAMAMAMAMAM_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAI_K_SAMAMAA_S_S_S_S_S_SAIAMAMAMAMAM_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAIAIAIAIAMAIAI_KAMAMAMAA_S_S_S_S_S_SAIAMAMAMAMAM_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_SAM_KAMAA_S_SAA_S_SAAAIAMAMAMAM_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA_S_SAMAMAMAA_S_S_S_S_SAAAIAMAMAMAM_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S_SAMAMAMAMAA_S_S_S_S_S_SAIAMAMAM_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAMAIAIAIAIAIAIAIAIAIAMAMAIAMAA_S_S_S_S_S_SAIAMAMAM_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAIAIAIAMAIAIAIAMAMAMAMAA_S_S_SAM_S_SAIAMAM_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAMAMAMAMAA_S_S_S_SAA_SAIAMAM_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAAAIAIAIAIAIAIAIAIAIAIAIAIAMAMAMAMAA_S_S_S_S_S_SAIAM_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAAAIAIAIAIAIAIAIAMAMAMAMAA_S_S_S_S_S_SAIAM_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAMAIAIAIAI_UAIAIAIAMAIAMAM_K_K_K_K_K_K_K_K_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAMAIAIAIAIAIAIAIAIAIAIAIAIAIAMAMAM_K_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAMAMAM_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAAAIAIAIAIAIAIAMAM_K_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAMAM_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAAAIAI_UAIAIAIAIAIAIAIAIAMAIAM_K_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAIAIAIAIAIAAAIAM_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7AIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAM_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 _7_7_7_7_7_7_7_7_KAM_UAM_KAMAM_KAMAM_KAM_UAM_KAM_K_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7_7 } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/share/tile_t.h����������������������������������������������������������������0000664�0000764�0000764�00000003376�10545462317�015215� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* $Id: tile_t.h,v 1.3 2003/05/21 04:15:53 wacko Exp $ */ /* NetHack may be freely redistributed. See license for details. */ typedef unsigned char pixval; typedef struct { pixval r, g, b; } pixel; #define MAXCOLORMAPSIZE 256 #define CM_RED 0 #define CM_GREEN 1 #define CM_BLUE 2 #define DEFAULT_BACKGROUND { 71, 108, 108 } /* For transparancy */ /* shared between reader and writer */ extern pixval ColorMap[3][MAXCOLORMAPSIZE]; extern int colorsinmap; /* writer's accumulated colormap */ extern pixval MainColorMap[3][MAXCOLORMAPSIZE]; extern int colorsinmainmap; #include "dlb.h" /* for MODEs */ extern int tile_x, tile_y; /* #define MAX_TILE_X 32 #define MAX_TILE_Y 32 #define MAX_TILE_X 48 #define MAX_TILE_Y 64 */ #define MAX_TILE_X 128 #define MAX_TILE_Y 128 #define Fprintf (void) fprintf #define pixel_equal(x,y) ((x.r == y.r) && (x.g == y.g) && (x.b == y.b)) extern boolean FDECL(fopen_text_file, (const char *, const char *)); extern boolean FDECL(fopen_virtual_text_file, (const char *base_name, const char *overlay_name, const char *type)); extern boolean FDECL(peek_text_tile_info, (char ttype[BUFSZ], int *number, char name[BUFSZ])); extern boolean FDECL(read_text_tile_info, (pixel (*)[MAX_TILE_X], char *ttype, int *number, char *name)); extern boolean FDECL(read_text_tile, (pixel (*)[MAX_TILE_X])); extern boolean FDECL(write_text_tile_info, (pixel (*)[MAX_TILE_X], const char *ttype, int number, const char *name)); extern boolean FDECL(write_text_tile, (pixel (*)[MAX_TILE_X])); extern boolean NDECL(fclose_text_file); extern void NDECL(init_colormap); extern void NDECL(merge_colormap); #if defined(MICRO) || defined(WIN32) #undef exit # if !defined(MSDOS) && !defined(WIN32) extern void FDECL(exit, (int)); # endif #endif /*tile_t.h*/ ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/share/mapmerge.c��������������������������������������������������������������0000664�0000764�0000764�00000001671�10545462317�015521� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* $Id: mapmerge.c,v 1.1 2002/09/01 21:58:19 j_ali Exp $ */ /* Copyright (c) Slash'EM Development Team 2002 */ /* NetHack may be freely redistributed. See license for details. */ #include "hack.h" int main(argc, argv) int argc; char **argv; { FILE *fpi, *fpo; int i, j, tile_number = 0; char buf[BUFSZ], buf2[BUFSZ]; if (argc < 2) { (void) fprintf(stderr, "usage: mapmerge outfile [infile] ...\n"); exit(EXIT_FAILURE); } fpo = fopen(argv[1], "w"); if (!fpo) { perror(argv[1]); exit(EXIT_FAILURE); } i = -1; for(j = 2; j < argc; j++) { fpi = fopen(argv[j], "r"); if (!fpi) { perror(argv[j]); fclose(fpo); remove(argv[1]); exit(EXIT_FAILURE); } while (fgets(buf, sizeof(buf), fpi)) { if (sscanf(buf, "tile %*d %[^\n]", buf2) == 1) fprintf(fpo, "tile %d %s\n", tile_number++, buf2); else fputs(buf, fpo); } fclose(fpi); } fclose(fpo); exit(EXIT_SUCCESS); } �����������������������������������������������������������������������slashem-0.0.7E7F3/win/share/magtile.c���������������������������������������������������������������0000664�0000764�0000764�00000006632�10545462317�015350� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) NetHack Development Team 1995 */ /* NetHack may be freely redistributed. See license for details. */ /* Create a set of magnified tiles by duplicating pixels in original */ #include "config.h" #include "tile.h" #ifdef __GO32__ #include <unistd.h> #endif #define SCALE2X static char *tilefiles[] = { "../win/share/monsters.txt", "../win/share/objects.txt", "../win/share/other.txt"}; static char *magfiles[] = { "../win/share/monmag.txt", "../win/share/objmag.txt", "../win/share/othmag.txt"}; static int tilecount; static int tilecount_per_file; static int filenum; static int write_magtile(pixels, ttype, number, name) pixel (*pixels)[MAX_TILE_X]; const char *ttype; int number; const char *name; { int i, j; int retval; pixel bigpixels[MAX_TILE_Y][MAX_TILE_X]; for(j = 0; j < tile_y; j++) for(i = 0; i < tile_x; i++) { #ifdef SCALE2X /* Scale2X algorithm from AdvanceMAME * http://advancemame.sourceforge.net/scale2x.html * * Pixel E from a source image * * B * D E F * H * * is magnified to a set of 4 destination pixels * * E0 E1 * E2 E3 * * by the following rules * * E0 = D == B && B != F && D != H ? D : E; * E1 = B == F && B != D && F != H ? F : E; * E2 = D == H && D != B && H != F ? D : E; * E3 = H == F && D != H && B != F ? F : E; * */ pixel pixB; pixel pixD, pixE, pixF; pixel pixH; pixE = pixels[j][i]; pixB = ( (j == 0) ? pixE : pixels[j-1][i]); pixD = ( (i == 0) ? pixE : pixels[j][i-1]); pixF = ( (i == (tile_x - 1)) ? pixE : pixels[j][i+1]); pixH = ( (j == (tile_y - 1)) ? pixE : pixels[j+1][i]); bigpixels[2 * j][2 * i] = ((pixel_equal(pixD,pixB) && !pixel_equal(pixB,pixF) && !pixel_equal(pixD,pixH)) ? pixD : pixE); bigpixels[2 * j][2 * i + 1] = ((pixel_equal(pixB,pixF) && !pixel_equal(pixB,pixD) && !pixel_equal(pixF,pixH)) ? pixF : pixE); bigpixels[2 * j + 1][2 * i] = ((pixel_equal(pixD,pixH) && !pixel_equal(pixD,pixB) && !pixel_equal(pixH,pixF)) ? pixD : pixE); bigpixels[2 * j + 1][2 * i + 1] = ((pixel_equal(pixH,pixF) && !pixel_equal(pixD,pixH) && !pixel_equal(pixB,pixF)) ? pixF : pixE); #else bigpixels[2 * j][2 * i] = pixels[j][i]; bigpixels[2 * j + 1][2 * i] = pixels[j][i]; bigpixels[2 * j][2 * i + 1] = pixels[j][i]; bigpixels[2 * j + 1][2 * i + 1] = pixels[j][i]; #endif } tile_x *= 2; tile_y *= 2; retval = write_text_tile_info(bigpixels, ttype, number, name); tile_x /= 2; tile_y /= 2; return retval; } int main(argc, argv) int argc; char *argv[]; { int tile_no; char buf[BUFSZ], ttype[BUFSZ]; pixel pixels[MAX_TILE_Y][MAX_TILE_X]; boolean x; while (filenum < 3) { tilecount_per_file = 0; if (!fopen_text_file(tilefiles[filenum], RDTMODE)) exit(EXIT_FAILURE); if (tile_x * 2 > MAX_TILE_X || tile_y * 2 > MAX_TILE_Y) { Fprintf(stderr, "tile size too large\n"); exit(EXIT_FAILURE); } if (!fopen_text_file(magfiles[filenum], WRTMODE)) exit(EXIT_FAILURE); while (read_text_tile_info(pixels, ttype, &tile_no, buf)) { write_magtile(pixels, ttype, tile_no, buf); tilecount_per_file++; tilecount++; } fclose_text_file(); printf("%d tiles processed from %s\n", tilecount_per_file, tilefiles[filenum]); ++filenum; } printf("Grand total of %d tiles processed.\n", tilecount); exit(EXIT_SUCCESS); /*NOTREACHED*/ return 0; } /*magtile.c*/ ������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/share/tilemap.c���������������������������������������������������������������0000664�0000764�0000764�00000051610�10545462317�015355� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* SCCS Id: @(#)tilemap.c 3.4 2000/06/04 */ /* NetHack may be freely redistributed. See license for details. */ /* * This source file is compiled twice: * once without TILETEXT defined to make tilemap.{o,obj}, * then again with it defined to produce tiletxt.{o,obj}. */ #include "hack.h" const char * FDECL(tilename, (int, int)); void NDECL(init_tilemap); void FDECL(process_substitutions, (FILE *)); #if defined(MICRO) || defined(WIN32) #undef exit #if !defined(MSDOS) && !defined(WIN32) extern void FDECL(exit, (int)); #endif #endif #define MON_GLYPH 1 #define OBJ_GLYPH 2 #define OTH_GLYPH 3 /* fortunately unnecessary */ #define COM_GLYPH 4 /* combined glyphs (for importing tile sets) */ /* note that the ifdefs here should be the opposite sense from monst.c/ * objects.c/rm.h */ struct conditionals { int sequence, predecessor; const char *name; } conditionals[] = { #if 0 /* Added as part of Lethe (was ifndef CHARON) */ { MON_GLYPH, PM_HELL_HOUND, "Cerberus" }, #endif /* commented out in monst.c at present */ { MON_GLYPH, PM_BLACK_LIGHT, "zruty" }, #ifndef KOPS { MON_GLYPH, PM_VORPAL_JABBERWOCK, "Keystone Kop" }, { MON_GLYPH, PM_VORPAL_JABBERWOCK, "Kop Sergeant" }, { MON_GLYPH, PM_VORPAL_JABBERWOCK, "Kop Lieutenant" }, { MON_GLYPH, PM_VORPAL_JABBERWOCK, "Kop Kaptain" }, #endif #ifndef BLACKMARKET { MON_GLYPH, PM_SHOPKEEPER, "black marketeer" }, #endif #ifndef CHARON /* not supported yet */ { MON_GLYPH, PM_CROESUS, "Charon" }, #endif #ifndef MAIL { MON_GLYPH, PM_FAMINE, "mail daemon" }, #endif /* Messing up Djinni probs */ { MON_GLYPH, PM_DJINNI, "efreeti" }, { MON_GLYPH, PM_DJINNI, "dao" }, { MON_GLYPH, PM_DJINNI, "marid" }, #ifndef TOURIST { MON_GLYPH, PM_SAMURAI, "tourist" }, #endif #ifndef YEOMAN { MON_GLYPH, PM_VALKYRIE, "yeoman" }, #endif /* commented out in monst.c at present */ { MON_GLYPH, PM_SHAMAN_KARNOV, "Master Shifter" }, { MON_GLYPH, PM_SHAMAN_KARNOV, "Thorin" }, { MON_GLYPH, PM_SHAMAN_KARNOV, "Earendil" }, { MON_GLYPH, PM_SHAMAN_KARNOV, "Elwing" }, { MON_GLYPH, PM_HIPPOCRATES, "Bilbo Baggins" }, { MON_GLYPH, PM_KING_ARTHUR, "High Lycanthrope" }, #ifndef TOURIST { MON_GLYPH, PM_LORD_SATO, "Twoflower" }, #endif /* commented out in monst.c at present */ { MON_GLYPH, PM_NEFERET_THE_GREEN, "Lolth" }, #ifndef YEOMAN { MON_GLYPH, PM_NEFERET_THE_GREEN, "Chief Yeoman Warder" }, #endif /* commented out in monst.c at present */ { MON_GLYPH, PM_CHROMATIC_DRAGON, "Transmuter" }, { MON_GLYPH, PM_CHROMATIC_DRAGON, "Smaug" }, { MON_GLYPH, PM_CHROMATIC_DRAGON, "Goblin King" }, { MON_GLYPH, PM_WATER_MAGE, "Lareth" }, { MON_GLYPH, PM_CYCLOPS, "Gollum" }, { MON_GLYPH, PM_IXOTH, "Sir Lorimar" }, #ifndef YEOMAN { MON_GLYPH, PM_DARK_ONE, "Colonel Blood" }, #endif /* commented out in monst.c at present */ { MON_GLYPH, PM_NEANDERTHAL, "shifter" }, { MON_GLYPH, PM_NEANDERTHAL, "dwarf warrior" }, { MON_GLYPH, PM_FROSTER, "fiend" }, { MON_GLYPH, PM_ATTENDANT, "proudfoot" }, { MON_GLYPH, PM_ATTENDANT, "intern" }, { MON_GLYPH, PM_NINJA, "ronin" }, #ifndef TOURIST { MON_GLYPH, PM_ROSHI, "guide" }, #endif #ifndef YEOMAN { MON_GLYPH, PM_APPRENTICE, "Yeoman Warder" }, /* commented out in monst.c at present */ { MON_GLYPH, PM_APPRENTICE, "Farmer Maggot" }, #else /* commented out in monst.c at present */ { MON_GLYPH, PM_YEOMAN_WARDER, "Farmer Maggot" }, #endif #ifndef FIREARMS { OBJ_GLYPH, SLING, "pistol" }, { OBJ_GLYPH, SLING, "submachine gun" }, { OBJ_GLYPH, SLING, "heavy machine gun" }, { OBJ_GLYPH, SLING, "rifle" }, { OBJ_GLYPH, SLING, "assault rifle" }, { OBJ_GLYPH, SLING, "sniper rifle" }, { OBJ_GLYPH, SLING, "shotgun" }, { OBJ_GLYPH, SLING, "auto shotgun" }, { OBJ_GLYPH, SLING, "rocket launcher" }, { OBJ_GLYPH, SLING, "grenade launcher" }, { OBJ_GLYPH, SLING, "bullet" }, { OBJ_GLYPH, SLING, "silver bullet" }, { OBJ_GLYPH, SLING, "shotgun shell" }, { OBJ_GLYPH, SLING, "rocket" }, { OBJ_GLYPH, SLING, "frag grenade" }, { OBJ_GLYPH, SLING, "gas grenade" }, { OBJ_GLYPH, SLING, "stick of dynamite" }, #endif #ifndef KOPS { OBJ_GLYPH, BULLWHIP, "rubber hose" }, #endif #ifndef TOURIST #ifdef KOPS { OBJ_GLYPH, RUBBER_HOSE, "Hawaiian shirt" }, { OBJ_GLYPH, RUBBER_HOSE, "T-shirt" }, #else { OBJ_GLYPH, BULLWHIP, "Hawaiian shirt" }, { OBJ_GLYPH, BULLWHIP, "T-shirt" }, #endif { OBJ_GLYPH, LOCK_PICK, "credit card" }, #endif #ifndef P_SPOON { OBJ_GLYPH, BEARTRAP, "spoon" }, #endif #ifndef LIGHTSABERS { OBJ_GLYPH, TORCH, "green lightsaber" }, { OBJ_GLYPH, TORCH, "blue lightsaber" }, { OBJ_GLYPH, TORCH, "red lightsaber" }, { OBJ_GLYPH, TORCH, "red double lightsaber" }, #else #ifndef D_SABER { OBJ_GLYPH, GREEN_LIGHTSABER, "blue lightsaber" }, #endif #endif #ifndef TOURIST #ifdef LIGHTSABERS { OBJ_GLYPH, RED_DOUBLE_LIGHTSABER, "expensive camera" }, #else { OBJ_GLYPH, TORCH, "expensive camera" }, #endif #endif #ifndef STEED { OBJ_GLYPH, TOWEL, "saddle" }, #endif /* allow slime mold to look like slice of pizza, since we * don't know what a slime mold should look like when renamed anyway */ #ifndef MAIL { OBJ_GLYPH, SCR_STINKING_CLOUD+4, "stamped / mail" }, #endif { 0, 0, 0} }; /* * Some entries in glyph2tile[] should be substituted for on various levels. * The tiles used for the substitute entries will follow the usual ones in * other.til in the order given here, which should have every substitution * for the same set of tiles grouped together. You will have to change * more code in process_substitutions()/substitute_tiles() if the sets * overlap in the future. */ struct substitute { int first_glyph, last_glyph; const char *sub_name; /* for explanations */ const char *level_test; } substitutes[] = { { GLYPH_CMAP_OFF + S_vwall, GLYPH_CMAP_OFF + S_trwall, "mine walls", "In_mines(plev)" }, { GLYPH_CMAP_OFF + S_vwall, GLYPH_CMAP_OFF + S_trwall, "gehennom walls", "In_hell(plev)" }, { GLYPH_CMAP_OFF + S_vwall, GLYPH_CMAP_OFF + S_trwall, "knox walls", "Is_knox(plev)" }, { GLYPH_CMAP_OFF + S_vwall, GLYPH_CMAP_OFF + S_trwall, "sokoban walls", "In_sokoban(plev)" } }; #ifdef TILETEXT /* * ALI * * The missing cmap names. These allow us to intelligently interpret * tilesets from other variants of NetHack (eg., Mitsuhiro Itakura's 32x32 * tileset which is based on JNetHack). */ struct { int cmap; const char *name; } cmaps[] = { S_digbeam, "dig beam", S_flashbeam, "camera flash", S_boomleft, "thrown boomerang, open left", S_boomright, "thrown boomerang, open right", S_ss1, "magic shield 1", S_ss2, "magic shield 2", S_ss3, "magic shield 3", S_ss4, "magic shield 4", S_sw_tl, "swallow top left", S_sw_tc, "swallow top center", S_sw_tr, "swallow top right", S_sw_ml, "swallow middle left", S_sw_mr, "swallow middle right", S_sw_bl, "swallow bottom left", S_sw_bc, "swallow bottom center", S_sw_br, "swallow bottom right", }; /* * entry is the position of the tile within the monsters/objects/other set */ const char * tilename(set, entry) int set, entry; { int i, j, condnum, tilenum; int in_set, oth_origin; static char buf[BUFSZ]; /* Note: these initializers don't do anything except guarantee that we're linked properly. */ monst_init(); objects_init(); (void) def_char_to_objclass(']'); condnum = tilenum = 0; in_set = set == MON_GLYPH || set == COM_GLYPH; for (i = 0; i < NUMMONS; i++) { if (in_set && tilenum == entry) return mons[i].mname; tilenum++; while (conditionals[condnum].sequence == MON_GLYPH && conditionals[condnum].predecessor == i) { if (in_set && tilenum == entry) return conditionals[condnum].name; condnum++; tilenum++; } } if (in_set && tilenum == entry) return "invisible monster"; tilenum++; if (set != COM_GLYPH) tilenum = 0; /* set-relative number */ in_set = set == OBJ_GLYPH || set == COM_GLYPH; for (i = 0; i < NUM_OBJECTS; i++) { /* prefer to give the description - that's all the tile's * appearance should reveal */ if (in_set && tilenum == entry) { if ( !obj_descr[i].oc_descr ) return obj_descr[i].oc_name; if ( !obj_descr[i].oc_name ) return obj_descr[i].oc_descr; Sprintf(buf, "%s / %s", obj_descr[i].oc_descr, obj_descr[i].oc_name); return buf; } tilenum++; while (conditionals[condnum].sequence == OBJ_GLYPH && conditionals[condnum].predecessor == i) { if (in_set && tilenum == entry) return conditionals[condnum].name; condnum++; tilenum++; } } if (set != COM_GLYPH) tilenum = 0; /* set-relative number */ in_set = set == OTH_GLYPH || set == COM_GLYPH; oth_origin = tilenum; for (i = 0; i < (MAXPCHARS - MAXEXPCHARS); i++) { if (in_set && tilenum == entry) { if (*defsyms[i].explanation) return defsyms[i].explanation; else { /* if SINKS are turned off, this * string won't be there (and can't be there * to prevent symbol-identification and * special-level mimic appearances from * thinking the items exist) */ switch (i) { case S_sink: Sprintf(buf, "sink"); break; default: for(j = 0; j < SIZE(cmaps); j++) if (cmaps[j].cmap == tilenum - oth_origin) { Sprintf(buf, "cmap / %s", cmaps[j].name); break; } if (j == SIZE(cmaps)) Sprintf(buf, "cmap %d", tilenum - oth_origin); break; } return buf; } } tilenum++; while (conditionals[condnum].sequence == OTH_GLYPH && conditionals[condnum].predecessor == i) { if (in_set && tilenum == entry) return conditionals[condnum].name; condnum++; 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 (in_set) { Sprintf(buf, "zap %d %d", i/4, i%4); return buf; } } tilenum += (NUM_ZAP << 2); i = entry - tilenum; if (i < WARNCOUNT) { if (set == OTH_GLYPH) { Sprintf(buf, "warning %d", i); return buf; } } tilenum += WARNCOUNT; for (i = 0; i < SIZE(substitutes); i++) { j = entry - tilenum; if (j <= substitutes[i].last_glyph - substitutes[i].first_glyph) { if (in_set) { Sprintf(buf, "sub %s %d", substitutes[i].sub_name, j); return buf; } } tilenum += substitutes[i].last_glyph - substitutes[i].first_glyph + 1; } Sprintf(buf, "unknown %d %d", set, entry); return buf; } #else /* TILETEXT */ #define TILE_FILE_H "tile.h" #define TILE_FILE_IN_H "tile_t.h" #define TILE_FILE_C "tile.c" #ifdef AMIGA # define INCLUDE_TEMPLATE "NH:include/t.%s" # define SOURCE_TEMPLATE "NH:src/%s" # define SHARE_IN_TEMPLATE "NH:share/%s" #else # ifdef MAC # define INCLUDE_TEMPLATE ":include:%s" # define SOURCE_TEMPLATE ":src:%s" # define SHARE_IN_TEMPLATE ":share:%s" # else # ifdef OS2 # define INCLUDE_TEMPLATE "..\\include\\%s" # define SOURCE_TEMPLATE "..\\src\\%s" # define SHARE_IN_TEMPLATE "..\\win\\share\\%s" # else # define INCLUDE_TEMPLATE "../include/%s" # define SOURCE_TEMPLATE "../src/%s" # define SHARE_IN_TEMPLATE "../win/share/%s" # endif # endif #endif short tilemap[MAX_GLYPH]; int lastmontile, lastobjtile, lastothtile; static char in_line[256]; /* Number of tiles for invisible monsters */ #define NUM_INVIS_TILES 1 /* * ALI * * Compute the value of ceil(sqrt(c)) using only integer arithmetic. * * Newton-Raphson gives us the following algorithm for solving sqrt(c): * * a[n]^2+c * a[n+1] = -------- * 2*a[n] * * It would be tempting to use a[n+1] = (a[n]^2+c+2*a[n]-1) div 2*a[n] * to solve for ceil(sqrt(c)) but this does not converge correctly. * Instead we solve floor(sqrt(c)) first and then adjust as necessary. * * The proposed algorithm to solve floor(sqrt(c)): * * a[n+1] = a[n]^2+c div 2*a[n] * * If we define the deviation of approximation n as follows: * * e[n] = a[n] - sqrt(c) * * Then it follows that: * * e[n]^2 * e[n+1] = --------------- * 2(e[n]+sqrt(c)) * * The sequence will converge to the solution if: * * | e[n+1] | < | e[n] | * * which becomes: * * | e[n]^2 | * | --------------- | < | e[n] | * | 2(e[n]+sqrt(c)) | * * This splits into three cases: * * If e[n] > 0 * If 0 > e[n] >= -sqrt(c) * If e[n] < -sqrt(c) * * * * Converges iff: * Converges iff: * Converges iff: * * 2 * * e[n] > -2*sqrt(c) * e[n] > - - sqrt(c) * e[n] > -2*sqrt(c) * * 3 * * * sqrt(c) * * True for all cases. * True iff a[n] > ------- * True iff 0 > a[n] > -sqrt(c) * * 3 * * * Case 3 represents failure, but this can be avoided by choosing a positive * initial value. In both case 1 and case 2, e[n+1] is positive regardless * of the sign of e[n]. It therefore follows that even if an initial value * between 0 and sqrt(c)/3 is chosen, we will only diverge for one iteration. * * Therefore the algorithm will converge correctly as long as we start * with a positve inital value (it will converge to the negative root if * we start with a negative initial value and fail if we start with zero). * * We choose an initial value designed to be close to the solution we expect * for typical values of c. This also makes it unlikely that we will cause * a divergence. If we do, it will only take a few more iterations. */ int ceil_sqrt(c) int c; { int a=c/36,la; /* Approximation and last approximation */ /* Compute floor(sqrt(c)) */ do { la=a; a=(a*a+c)/(2*a); } while (a!=la); /* Adjust for ceil(sqrt(c)) */ return a*a==c?a:a+1; } /* * set up array to map glyph numbers to tile numbers * * assumes tiles are numbered sequentially through monsters/objects/other, * with entries for all supported compilation options * * "other" contains cmap and zaps (the swallow sets are a repeated portion * of cmap), as well as the "flash" glyphs for the new warning system * introduced in 3.3.1. */ void init_tilemap() { int i, j, condnum, tilenum; int corpsetile, swallowbase; for (i = 0; i < MAX_GLYPH; i++) { tilemap[i] = -1; } corpsetile = NUMMONS + NUM_INVIS_TILES + CORPSE; swallowbase= NUMMONS + NUM_INVIS_TILES + NUM_OBJECTS + S_sw_tl; /* add number compiled out */ for (i = 0; conditionals[i].sequence; i++) { switch (conditionals[i].sequence) { case MON_GLYPH: corpsetile++; swallowbase++; break; case OBJ_GLYPH: if (conditionals[i].predecessor < CORPSE) corpsetile++; swallowbase++; break; case OTH_GLYPH: if (conditionals[i].predecessor < S_sw_tl) swallowbase++; break; } } condnum = tilenum = 0; for (i = 0; i < NUMMONS; i++) { tilemap[GLYPH_MON_OFF+i] = tilenum; tilemap[GLYPH_PET_OFF+i] = tilenum; tilemap[GLYPH_DETECT_OFF+i] = tilenum; tilemap[GLYPH_RIDDEN_OFF+i] = tilenum; tilemap[GLYPH_BODY_OFF+i] = corpsetile; j = GLYPH_SWALLOW_OFF + 8*i; tilemap[j] = swallowbase; tilemap[j+1] = swallowbase+1; tilemap[j+2] = swallowbase+2; tilemap[j+3] = swallowbase+3; tilemap[j+4] = swallowbase+4; tilemap[j+5] = swallowbase+5; tilemap[j+6] = swallowbase+6; tilemap[j+7] = swallowbase+7; tilenum++; while (conditionals[condnum].sequence == MON_GLYPH && conditionals[condnum].predecessor == i) { condnum++; tilenum++; } } tilemap[GLYPH_INVISIBLE] = tilenum++; lastmontile = tilenum - 1; for (i = 0; i < NUM_OBJECTS; i++) { tilemap[GLYPH_OBJ_OFF+i] = tilenum; tilenum++; while (conditionals[condnum].sequence == OBJ_GLYPH && conditionals[condnum].predecessor == i) { condnum++; tilenum++; } } lastobjtile = tilenum - 1; for (i = 0; i < (MAXPCHARS - MAXEXPCHARS); i++) { tilemap[GLYPH_CMAP_OFF+i] = tilenum; tilenum++; while (conditionals[condnum].sequence == OTH_GLYPH && conditionals[condnum].predecessor == i) { condnum++; tilenum++; } } 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++; } } for (i = 0; i < WARNCOUNT; i++) { tilemap[GLYPH_WARNING_OFF+i] = tilenum; tilenum++; } lastothtile = tilenum - 1; } const char *prolog[] = { "", "", "void", "substitute_tiles(plev)", "d_level *plev;", "{", "\tint i;", "" }; const char *epilog[] = { "}" }; /* write out the substitutions in an easily-used form. */ void process_substitutions(ofp) FILE *ofp; { int i, j, k, span, start; fprintf(ofp, "\n\n"); j = 0; /* unnecessary */ span = -1; for (i = 0; i < SIZE(substitutes); i++) { if (i == 0 || substitutes[i].first_glyph != substitutes[j].first_glyph || substitutes[i].last_glyph != substitutes[j].last_glyph) { j = i; span++; fprintf(ofp, "short std_tiles%d[] = { ", span); for (k = substitutes[i].first_glyph; k < substitutes[i].last_glyph; k++) fprintf(ofp, "%d, ", tilemap[k]); fprintf(ofp, "%d };\n", tilemap[substitutes[i].last_glyph]); } } for (i = 0; i < SIZE(prolog); i++) { fprintf(ofp, "%s\n", prolog[i]); } j = -1; span = -1; start = lastothtile + 1; for (i = 0; i < SIZE(substitutes); i++) { if (i == 0 || substitutes[i].first_glyph != substitutes[j].first_glyph || substitutes[i].last_glyph != substitutes[j].last_glyph) { if (i != 0) { /* finish previous span */ fprintf(ofp, "\t} else {\n"); fprintf(ofp, "\t\tfor (i = %d; i <= %d; i++)\n", substitutes[j].first_glyph, substitutes[j].last_glyph); fprintf(ofp, "\t\t\tglyph2tile[i] = std_tiles%d[i - %d];\n", span, substitutes[j].first_glyph); fprintf(ofp, "\t}\n\n"); } j = i; span++; } if (i != j) fprintf(ofp, "\t} else "); fprintf(ofp, "\tif (%s) {\n", substitutes[i].level_test); fprintf(ofp, "\t\tfor (i = %d; i <= %d; i++)\n", substitutes[i].first_glyph, substitutes[i].last_glyph); fprintf(ofp, "\t\t\tglyph2tile[i] = %d + i - %d;\n", start, substitutes[i].first_glyph); start += substitutes[i].last_glyph - substitutes[i].first_glyph + 1; } /* finish last span */ fprintf(ofp, "\t} else {\n"); fprintf(ofp, "\t\tfor (i = %d; i <= %d; i++)\n", substitutes[j].first_glyph, substitutes[j].last_glyph); fprintf(ofp, "\t\t\tglyph2tile[i] = std_tiles%d[i - %d];\n", span, substitutes[j].first_glyph); fprintf(ofp, "\t}\n\n"); for (i = 0; i < SIZE(epilog); i++) { fprintf(ofp, "%s\n", epilog[i]); } fprintf(ofp, "\nint total_tiles_used = %d;\n", start); i = ceil_sqrt(start); fprintf(ofp, "int tiles_per_row = %d;\n", i); fprintf(ofp, "int tiles_per_col = %d;\n", (start + i - 1) / i); lastothtile = start - 1; } int main() { register int i; char filename[30]; FILE *ifp,*ofp; init_tilemap(); /* * create the source file, "tile.c" */ Sprintf(filename, SOURCE_TEMPLATE, TILE_FILE_C); if (!(ofp = fopen(filename, "w"))) { perror(filename); exit(EXIT_FAILURE); } fprintf(ofp,"/* This file is automatically generated. Do not edit. */\n"); fprintf(ofp,"\n#include \"hack.h\"\n\n"); fprintf(ofp,"short glyph2tile[MAX_GLYPH] = {\n"); for (i = 0; i < MAX_GLYPH; i++) { fprintf(ofp,"%2d,%c", tilemap[i], (i % 12) ? ' ' : '\n'); } fprintf(ofp,"%s};\n", (i % 12) ? "\n" : ""); process_substitutions(ofp); fprintf(ofp,"\n#define MAXMONTILE %d\n", lastmontile); fprintf(ofp,"#define MAXOBJTILE %d\n", lastobjtile); fprintf(ofp,"#define MAXOTHTILE %d\n", lastothtile); fprintf(ofp,"\n/*tile.c*/\n"); fclose(ofp); /* * create the include file, "tile.h" */ Sprintf(filename, SHARE_IN_TEMPLATE, TILE_FILE_IN_H); if (!(ifp = fopen(filename, "r"))) { perror(filename); exit(EXIT_FAILURE); } Sprintf(filename, INCLUDE_TEMPLATE, TILE_FILE_H); if (!(ofp = fopen(filename, "w"))) { perror(filename); exit(EXIT_FAILURE); } fprintf(ofp,"/* This file is automatically generated. Do not edit. */\n"); fprintf(ofp,"\n#define TOTAL_TILES_USED %d\n", lastothtile + 1); i = ceil_sqrt(lastothtile + 1); fprintf(ofp,"#define TILES_PER_ROW %d\n", i); fprintf(ofp,"#define TILES_PER_COL %d\n\n", (lastothtile + i) / i); while (fgets(in_line, sizeof in_line, ifp) != 0) (void) fputs(in_line, ofp); fprintf(ofp,"\n/*tile.h*/\n"); fclose(ofp); exit(EXIT_SUCCESS); /*NOTREACHED*/ return 0; } #endif /* TILETEXT */ ������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/share/monsters.txt������������������������������������������������������������0000664�0000764�0000764�00000635614�10545462317�016205� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������A = (0, 0, 0) B = (0, 182, 255) C = (255, 108, 0) D = (255, 0, 0) E = (0, 0, 255) F = (0, 145, 0) G = (108, 255, 0) H = (255, 255, 0) I = (255, 0, 255) J = (145, 71, 0) K = (182, 71, 0) L = (255, 182, 145) M = (71, 108, 108) N = (255, 255, 255) O = (218, 218, 182) P = (108, 145, 182) # tile 0 (giant ant) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMJAJKKAMMM MMMMMJAAAKKJJAMM MMMMMAKJJAJJAAMM MMMKKAJJJAAAMMMM MMBKJAAAAAJJAMMM MMJBJAJAJAAMMMMM MMMMMAJAMJAMMMMM MMMMMMJAMJAMMMMM MMMMMMMMMMMMMMMM } # tile 1 (giant tick) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMFNLAMMMMMMMM MMMNLNLAMMMMMMMM MMMLALFNNLAMMMMM MMMMMMALNLLLAMMM MMMMMMLALALALAAM MMMMMMMALALALAAM MMMMMMALAALALAMM MMMMMMAAAAAAAAMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 2 (killer bee) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MPPPMMMMMPPMMMMM PPPPPMMMPBPPMMMM PBPPPMMPBPPPMMMM MPPBPMPPLPLLMMMM MMMPPMPLLALHAHMM MMMAKKKLAHAAHHMM BBJJJKJJJAHHAAMM ABJBBJJJJAHAHHMM MJJABJAJMJMHHMMM MMMMMMMJMJMMMMMM MMMMMMMMMMMMMMMM MMMAAAAAAAAAAAMM MMMMMAAAAAAMMMMM MMMMMMMMMMMMMMMM } # tile 3 (giant flea) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMGLCAMMMMMMMM MMMMLLCAMMMMMMMM MMMLCLGLLCAMMMMM MMMCACCLLLLCAMMM MMMMMMACLCLCCAAM MMMMMMCACACACAAM MMMMMMMACACACAAM MMMMMMACAACACAMM MMMMMMAAAAAAAAMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 4 (soldier ant) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMJAJKKAMMM MMMMMJAAAKKJJAMM MMMMMAKJJAJJAAMM MJJKKAJJJAAAMMMM JBJKJAAAAAJJAMMM JJJBJAJAJAAMMMMM JAAJJAJAMJAMMMMM MMJJAAJAMJAMMMMM MMMMMMMMMMMMMMMM } # tile 5 (fire ant) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMDACCCAMMM MMMMMDAAACDDDAMM MMMMMACDDADDAAMM MMMCCADDDAAAMMMM MMGDDAAAAADDAMMM MMDGDADADAAMMMMM MMMMMADAMDAMMMMM MMMMMMDAMDAMMMMM MMMMMMMMMMMMMMMM } # tile 6 (snow ant) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMEABBBAMMM MMMMMEAAABEEEAMM MMMMMABEEAEEAAMM MMMBBAEEEAAAMMMM MMHEEAAAAAEEAMMM MMEHEAEAEAAMMMMM MMMMMAEAMEAMMMMM MMMMMMEAMEAMMMMM MMMMMMMMMMMMMMMM } # tile 7 (giant beetle) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMKKDKKMMMMM MMMMKACLCJJDMMMM MMMKCLCJJDDDKMMM MMMDCCJDADDADMMM MMMADJDDDDDDDMMM MMMBAKDDAADKAAMM MMMABAKDDKMMMMMM MMMMMMAAMAAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 8 (giant louse) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMIKJAMMMMMMMM MMMMCKKKJAMMMMMM MMMKJKICKKJAMMMM MMMJAJJKCKKJAAAM MMMMMMAJKJKKJAAM MMMMMMJAJAJAJAAM MMMMMMMAJAJAJAAM MMMMMMAJAAJAJAMM MMMMMMAAAAAAAAMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 9 (tsetse fly) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMCMMMMMMM MMMMPPMKKKMPPMMM MMMMPPPJKJPPPMMM MMMMMPPKKKPPMMMM MMMAABPPKPPBAAMM MMMMAABPJPBAAMMM MMMMMAMJJJMAMMMM MMMMAMMGJGMMAMMM MMMMMMMAJAMMMMMM MMMMMMMMAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 10 (migo drone) { MMMMMMMMMMMMMMMM MMMMMMMMMMPMMMMM MMMMMMMMMPPMMPMM MMMMMMMMPPPMPPMM MMMMMMMPPPMPPPMM MMMMMMMKKKLPPMMM MMIIIMKKKLLKKMMM MIIIDKKKLKKKKKMM MMIIJJJJJJJJJJMM MMMJJMJKJKJKJMMM MMMMMMMKMKMKMMMM MMMMMMMKMKMKMMMM MMMMMMMMMMMMMMMM MMMMAAAAAAAAAAMM MMMMMAAAAAAMMMMM MMMMMMMMMMMMMMMM } # tile 11 (queen bee) { MMMMMMMMMMMMMMMM MPPPMMMMMPPMMMMM PPPPPMMMPPPPMMMM PPPPPMMPPBPPMMMM PBPPPMMPBPPPMMMM MPPBPMPPLPLLMMMM MMMPPMPLLALHAHMM MMMAKKKLAHAAHHMM BBJJJKJJJAHHAAHM ABJBBJJJJAHAHHHM MJJABJAJMJHHHAAM MMMJMMMJMJAAAHHM MMJJMMJJMJMHHAHM MMJAAAJAAJMMHHMM MMMMMAAAAAAMMMMM MMMMMMMMMMMMMMMM } # tile 12 (yellow jacket) { MMMMMMMMMMMMMMMM MMMMJJMJJMMMMMMM MMMMMJJJMMMMPPPM MMMMMDJDJMMPPPPM MMMMMOKOJPPPPPMM MMMMMKKJJJHHMMMM MMMMMKEJJHJHAHMM MMMMJEMEJHJAHHMM MMMMEMMJEEJHAAMM MMMMMMJEMJHAHHMM MMMMMMEMMEMHHMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMAAAAAAAAAAAMM MMMMMAAAAAAMMMMM MMMMMMMMMMMMMMMM } # tile 13 (black wasp) { MMMMMMMMMMMMMMMM MMMMAAMAAMMMMMMM MMMMMAAAMMMMPPPM MMMMMDADAMMPPPPM MMMMMOAOAPPPPPMM MMMMMAAAJJAAAMMM MMMMMJEJJAJAAAMM MMMMJEMEJAJAAAMM MMMMEMMJEEJAAAMM MMMMMMJEMJAAAAMM MMMMMMEMMEMAAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMAAAAAAAAAAAMM MMMMMAAAAAAMMMMM MMMMMMMMMMMMMMMM } # tile 14 (migo warrior) { MMMMMMMMMMMMMMMM MMMMMMMMMMPMMMMM MMMMMMMMMPPMMPMM MMMMMMMMPPPMPPMM MMMMMMMPPPMPPPMM MMIIIMMKKKLPPMMM MIIDIIKKKLLKKMMM MIIDDKKKLKKKKKMM MMIIJJJJJJJJJJMM MMMJJMJKJKJKJMMM MMMPPKKMMKMKMMMM MMMMMMMMMKMKMMMM MMMMMMMMMMMMMMMM MMMMAAAAAAAAAAMM MMMMMAAAAAAMMMMM MMMMMMMMMMMMMMMM } # tile 15 (giant wasp) { MMMMMMMMMMMMMMMM MMMMMMMMPPPPMMMM KMMMKMMPPPPMMMMM MJMJMMPPPPMMMMMM MMJJJJPMMMMMMMMM MDJDJJJJMHHHMMMM MDJDJJAAHHAAHMMM MAJAJAJAHAHHAMMM MJJMMJAJAHAHHMMM MJAMMJAJAAAAHMMM MMAMMJAJAHHAAMMM MMMMJAAJAAHHMMMM MMMMAMJAHHMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 16 (spitting beetle) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMFFFFFMMMMM MMMMFDFGAFGGMMMM MMMFHGHAGGGGGMMM MMMGHHAGDGGDGMMM MMMAGAGGGGGGFMMM MMMNAFGGDDGFAAMM MMMANAFFFFMMMMMM MMMMMMAAMAAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 17 (migo queen) { MMMMMMMMMMMMMMMM MMIIMMMMMMPMMMMM MIMMIMMMMPPMMPMM MMMMMIMMPPPMPPMM MMIIIIMPPKKLPPMM MIIDIIMKKKLLLKMM MIIDIIKKKLLKKKKM MIIDDKKKLKKKKKKM MMIIJJJJJJJJJJMM MMMJJMJKJKJKJMMM MMMMMMMKMKMKMMMM MMMMMMMKMKMKMMMM MMMMMMMMMMMMMMMM MMMMAAAAAAAAAAMM MMMMMAAAAAAMMMMM MMMMMMMMMMMMMMMM } # tile 18 (assassin bug) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMIIMMMM MMMMMMMMMILIIMMM MMMMMMMMMIIIIMMM MMMMMIIMMIIIMMMM MMMIIMMIIMMMAAAM MMMMMILIIIMAAAAM MMMMILIIMMIAAAAM FONILIIMIAAAAAMM FANIIIIMAIAAMMMM FFNIINNOAAAMAMMM MMIIINAFAAMAMAMM MIIIAFFFAAMMAMMM MMIMMAAAAAAMMMMM MMMMMMAAMAMMMMMM } # tile 19 (killer beetle) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMPPFPPMMMMM MMMMPAPBGPPFMMMM MMMPGBGPPFFFFMMM MMMFGGPFAFFAFMMM MMMAFPFFFFFFFMMM MMMHAPFFAAFFAAMM MMMAHAPPPPMMMMMM MMMMMMAAMAAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 20 (acid blob) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMKDDAMMMMMMM MMMDDKDDKAMMMMMM MDDDIIIDJDAMMMMM DMIIOOIIDAIAMMMM MDKNNNODIDAMMIAM IDJNANOJDDJAMMMM ADIDNOIDIDDDAMMM MMMJDIKIADKIAMMM MIAMIDIDMJDAMMMM MMMIMDDAMMMMDAMM MMMMMMMMMIAMMMMM MMIAMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 21 (quivering blob) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMPPPPMMMMMMM MMMMMMMMMPMMMMMM MPMOOOPPEMMAAAMM PMOPBBBPOEAEAAMM PMPBNNNPMOEAAEAM PMPNNNNNPOEEAEAM POPNAANNEOMOAEAM MOPNAANNEMMOAAAM MOPBNNNEPPMOEAAM BPOPEEEBBPOMEEAM BBBPBBBBBBPPPPAM MMBBBBBBBBBBPAMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 22 (gelatinous cube) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMLLLMMMMMM MMMMMLLLLLLLLMMM MMMLLLLLLLLLDMMM MMMCLLLLLLLDDAMM MMMCGGCLLLDDDAAM MMMCAGCGGDDDDAAA MMMCCCCAGDDDAAAA MMMMMCCCCDDAAAAM MMMMMMMCCDAAAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 23 (jiggling blob) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMPPPMMMMMM MMMMMMPPBBPMMMMM MMMMMPPBPPBPMMMM MMMMPPBPPNNPMMMM MMMEPPBBONNOMMMM MAAPPBPBOOAOPMMM MAAPPBBPBOOBPAMM MAAPPBBBPPPBPAMM MAAAPPBBBPPPAMMM MMAAAPPPPPPAMMMM MMMMMAAAAAAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 24 (lava blob) { MMMMMMMMMMMMMMMM MMMMMDCMMMMMMMMM MMMMMDPOPMMMMMMM MMMMMDOAOMMCCMMM MMMMMDPOPDDDDCMM MMDMDDDDPOOPDCMM MDDDDDDDOOOODMMM MCDDPOPDOAOODMMM MMCDOAODPOOPDCMM MMMCDDDDDDDDDDCM MMMCDDCPOPCCCCCM MMCDDCCOAOCMCCCM MMCCCMMCPDCMMMMM MMMMMMMMCCMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 25 (static blob) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMAOMMMMMMMM MMMMMOAOOMMMMMMM MMMMMAOOMMMMMMMM MMMMMMAOMMAOMMMM MMMOMMAOMPAOOMMM MMMMOOMAOAOMMMMM MMMOMOOOOOOOAOMM MMAAOFFFOFFFOOOM MAAOOPAFOFAPOOMM MAAOOPAFOFAPOOMM MAAAOOPOOOPOOAMM MMAAAAOOOOOAMMMM MMMMAAAAAAMMMMMM MMMMMMMMMMMMMMMM } # tile 26 (burbling blob) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMPPPPMMMM MMMMMMMPBBBBPMMM MMMMMMPBEEBBEPMM MMMMMPEBEEBBBEPM MMAAAPBBBBBEBBPM MAAAPEBBBBBEEBPM MAAAPEBEEBBBBBPM MMAAAPBBEBEEBPAM MMMAAAPPPPPPPPAM MMMMMMAAAAAAAAMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 27 (chicken) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMKKMMMMMMMMMM MMMHJAKMMMMMMKMM MMMMMJKMMMMMKJKM MMMMMJJJKKKKJKMM MMMMKJJKJJJJJMMM MMMMKJJKJJKKMMMM MMMMKJJJKKJMMMMM MMMMMJJJJJMMMMMM MMMMMMMMKMMMMMMM MMMMMMMMKMMMMMMM MMMMMMMHHMMMMMMM MMMMMMMMMMMMMMMM } # tile 28 (cockatoo) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMDDMMMMMMMMM MMMMNNMMMMMMMMMM MMHHOANMMMMMMMMM MMHMOOOMMMMMMMMM MMMMMONNNMMMMMMM MMMMMNOOONNMMMMM MMMMMNNOOOONMMMM MMMMMMNNONMONNMM MMMMMMMNOONMMMMM MMMMMMMMOMONMMMM MMMMMMMMOMMONMMM MMMMMMMHHMMMONMM MMMMMMMMMMMMMMMM } # tile 29 (chickatrice) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMOOMMMMMMM MMMMMMHAOOMMMMMM MMMMMHHOOHMHHAMM MMMMMMMMOOHOAMMM MMMMMMMMOOFAMMMM MMMMMMMMFGGFAMMM MMMMMMMMAGFGAAMM MMMMMMMMMMMGAMMM MMMMMMMFMMFFAMMM MMMMMMMAFFAAMMMM MMMMMMMMAAMMMMMM MMMMMMMMMMMMMMMM } # tile 30 (cockatrice) { MMMMMMMMMMMMMMMM MMMDMDDMMMMMMMMM MMMMDDMMMMMMMMMM MMMMNLMMAAMMMMMM MMHHANMAAAMMMMMM MHHMNOMMAAAAMMMM MMMAOOLFFFAAMMMM MMMOOLKGGFFAAMMM MMMAOAGGFGFFAAMM MMMMMMMGFFGFAAMM MMMMMMMMMFGGAAMM MMMMMFAMMMFFAMMM MMMMFAMMMMFFAMMM MMMMFAMMFFFAMMMM MMMMMFFFFAMMMMMM MMMMMMMMMMMMMMMM } # tile 31 (pyrolisk) { MMMMMMMMMMMMMMMM MMMDMDDMMMMMMMMM MMMMDDMMMMMMMMMM MMMMNBMMAAMMMMMM MMHHANMAAAMMMMMM MHHMNBMMAAAAMMMM MMMAPBBJJJAAMMMM MMMPPPKDDKJAAMMM MMMAPADDKDKJAAMM MMMMMMMDJCDJAAMM MMMMMMMMMJDDAAMM MMMMMJAMMMJJAMMM MMMMJAMMMMJJAMMM MMMMKAMMKKKAMMMM MMMMMJKCKAMMMMMM MMMMMMMMMMMMMMMM } # tile 32 (parrot) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMGGMMMMMMMMMM MMHHFAGMMMMMMMMM MMHMFFFMMMMMMMMM MMMMMFGGGMMMMMMM MMMMMGFFFGGMMMMM MMMMMGGFFFFGMMMM MMMMMMGGFGMFGGMM MMMMMMMGFFGMMMMM MMMMMMMMFMFGMMMM MMMMMMMMFMMFGMMM MMMMMMMHHMMMFGMM MMMMMMMMMMMMMMMM } # tile 33 (jackal) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMOMMOMMMMMMMMM MMMOMOOMMMOMMMMM MMOOOOMMMMMOMMMM MMIOIOOMMMMOMAMM MOLLOOOLMMMOMAMM DOOOAOOOOOOOAAMM MMAAOOOOOOOOAAMM MMMMOJOOOOOLAAMM MMMMOJOLKALKAAMM MMMOOAOAAAOAAMMM MMMMMOOMMOOAMMMM MMMMMMMMMMMMMMMM } # tile 34 (fox) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMCMMMMMMMMMMM MMMMCMMMMMMMMMMM MMCCACMMMCCCMMMM MMACCCCCCACCCMMM MMMAACCCCMACCMMM MMMMACAACMMAAMMM MMMACMACAMMMMMMM MMMMMMMMMMMMMMMM } # tile 35 (coyote) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMKMMKMMMMMMMMM MMMCMKCMMMMMMKKK MMKKKKMMMMMMCKCA MMNCNKMKKKKKAAAM MKCCKKCKCKCKKMMM KCCKAKKKKKKCKMMM DKKKACAKCKKAKMMM MMAAKAAKAAAAKMMM MMMMAKAKAAAAKMMM MMMAKCAKAMAKCMMM MMMMMACKMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 36 (werejackal) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMOMMOMMMMMMMMM MMMOMOOMMMOMMMMM MMOOOOMMMMMOMMMM MMIOIOOMMMMOMAMM MOLLOOOLMMMOMAMM DOOOALLOOOOOAAMM MMAALLLLOOOOAAMM MMMMLJLLLOOLAAMM MMMMLJLLKALKAAMM MMLLLALAAAOAAMMM MMMLMLLMMOOAMMMM MMMMMMLMMMMMMMMM } # tile 37 (little dog) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMJMMJMMMMMMMMM MMMJMJJMMMKMMMMM MMJJJJMMMMMKMMMM MMNJNKKMMMMKMAMM MJJJCKCMMMMKMAMM MPJJAKCKKCCKAAMM MDDAACKCCKKKAAMM MMMMKJKJCJCJAAMM MMMMKKKJJAJJAAMM MMMCKAKAAAKAAMMM MMMMMCKMMMKAMMMM MMMMMMMMMMMMMMMM } # tile 38 (dog) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMJMMJMMMMMKMMM MMMJMJJMMMMMMKMM MMJJJJMMMMMMMKMM MMNJNKKMMMMMMCMA MJJJCCKCKMMMMKMA MPJCAKCKKCKCKKAA MDDAACCKKKCKCKAA MMAAKJKKKJCJKJAA MMMMKJCKJJJAJJAA MMMMKAKJAAAAKKAM MMMCKAKAAAAAKAAM MMMMMKCAAMMMCAMM MMMMMMMMMMMMMMMM } # tile 39 (large dog) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMJMMJMMMMMKMMM MMMJMJJMMMMMMKMM MMJJJJMMMMMMMKMM MMNJNKKKMMMMMKMA MJJJCKCKKCMMJCMA MPJCAKCKKKKCKKAA MDDAACKCKCCKKCAA MMAAKJKKJJCJKJAA MMMJCJKKKJJAJJAA MMMMKAKJAAAAKJAM MMMMKACJAAAAKKAM MMMCKAKAAAAAKAAM MMMMMKKAAMMMCAMM MMMMMMMMMMMMMMMM } # tile 40 (pit bull) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMOOMNOMM MMMMNMMMMPOANPMM MMMOMMMONJINIAMM MMMOMMNNJPOONPMM MMMMOONNJOAAANMM MMAAOOONJPALAPMM MAAAOAAANJLLLMMM MMAAOOAMNNAAMMMM MMMMMMMMMMMMMMMM } # tile 41 (dingo puppy) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMCMMCMMMMMMMMM MMMCMCCMMMCMMMMM MMCCCCMMMMMCMMMM MMNCNCCMMMMCMAMM MCCCCCCMMMMCMAMM MPCCALCCCCCCAAMM MDDAACCCCCCCAAMM MMMMCCCCLLCCAAMM MMMMCCCLLACCAAMM MMMCCACAAACAAMMM MMMMMCCMMCCAMMMM MMMMMMMMMMMMMMMM } # tile 42 (dingo) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMCMM MMMCMMCMMMMMMMCM MMMCMCCMMMMMMMCA MMCCCCKMMMMMMMCA MMACACCKCCCCCCAA MMLLCCCKCCCLCCCA MKCCACKCLLLLACCA MMAACAACLLAAACCA MMMMACACAAAAAACA MMMMCCACAAAMMCCA MMMMMACCAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 43 (large dingo) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMCMMCMMMMMCMMM MMMCMCCMMMMMMCMM MMCCCCMMMMMMMCMM MMNCNCCCMMMMMCMA MCCCCCCCCCMMCCMA MPCCALLCCCCCCCAA MDDAALLCCCLLCCAA MMAALLCCCLLLCCAA MMMCCCCCLLLACCAA MMMMCACCAAAACCAM MMMMCACCAAAACCAM MMMCCACAAAAACAAM MMMMMCCAAMMMCAMM MMMMMMMMMMMMMMMM } # tile 44 (wolf) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMPMMPMMMMMPMMM MMMPMPPMMMMMMPMM MMPPPPMMMMMMMPMM MMNMNPPMMMMMMPMA MPMMPPPPPMMMMPMA PPMPAPPPPPPPPPAA DPPPAPPPPPPPPPAA MMAAPMPPMMPMPMAA MMMMPMPPMMMAMPAA MMMMPAPMAAAAPMAM MMMPPAPAAAAAPAAM MMMMMPPAAMMPPAMM MMMMMMMMMMMMMMMM } # tile 45 (death dog) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMDMMCMMMMMDMMM MMMDMCDMMMMMMDMM MMCDCDMMMMMMMDMM MMHDHDDDMMMMMDMA MCDDCDDDDDMMDDMA MFDCDDDDDDDDDDMA MCCDAADCDDDDDDAA MNANADCDDDDDDDAA MMDDDCDDDDDADDAA MMMMDADDAAAAADAM MMMMDADDAAAAADAM MMMDDADAAAADDAMM MMMMMDDAAMMMMMMM MMMMMMMMMMMMMMMM } # tile 46 (rabid wolf) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMPMMPMMMMMPMMM MMMPMPPMMMMMMPMM MMPPPPMMMMMMMPMM MMGMGPPMMMMMMPMA MPMOPPPPPMMMMPMA PPOLLLPPPPPPPPAA DPLLALPPPPPPPPAA MMAALMPPMMPMPMAA MMMLPMPPMMMAMPAA MMMMPAPMAAAAPMAM MMMPPAPAAAAAPAAM MMMMMPPAAMMPPAMM MMMMMMMMMMMMMMMM } # tile 47 (werewolf) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMPMMPMMMMMPMMM MMMPMPPMMMMMMPMM MMPPPPMMMMMMMPMM MMNMNPPMMMMMMPMA MPMMPPPPPMMMMPMA PPMPAPPPPPPPPPAA DPPPALPPPPPPPPAA MMAALLPLMMPMPMAA MMMMLMLLMMMAMPAA MMMMLALMAAAAPMAM MMLLLALAAAAAPPAM MMMLMLLAAMMPPMMM MMMMMLLMMMMMMMMM } # tile 48 (warg) { MMMMMMMMMMMMMMMM MMMPMMPMMMMPPMMM MMMPMPPMMMMMMPMM MMPPPPMMMMMMMPMA MMNMNPPMMMMMMPMA MPMMPPPPPMMMMPMA PPPPDPPPPPPPPPAA DPPNDPPPPPPPPPAA MMDDDPPPPPPPPPAA PNDNPMPPPPPPPPAA MPPPPAPPPPAPPMAM MMMPAAPPAAAAPPAA MMMPAAPMAAAAPMAM MPPPAAPAAAAAPAAM MMMMPPPAAMPPPAMM MMMMMMMMMMMMMMMM } # tile 49 (winter wolf cub) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMNMMNMMMMMMMMM MMMNMNBMMMNMMMMM MMNNNNMMMMMNMMMM MMDNDNBMMMMNMAMM MMNNNNBMMMMNMAMM MNNNNNNNNNNNAAMM MDNBBNNNNNNBAAMM MMMMNNNNNNNBAAMM MMMMNNNBBANBAAMM MMMNBANAAANAAMMM MMMMMNBMMNBAMMMM MMMMMMMMMMMMMMMM } # tile 50 (winter wolf) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMNMMNMMMMMNMMM MMMNMNNMMMMMMNMM MMNNNNMMMMMMMNMM MMDODNNMMMMMMNMA MNOONNNNNMMMMNMA NNONANNNNNNNNNAA DNNBANNNNNNNNNAA MMAANNNNNNNBNNAA MMMMNBNNNBBANNAA MMMMNANBAAAANBAM MMMNNANAAAAANAAM MMMMMNNAAMMNNAMM MMMMMMMMMMMMMMMM } # tile 51 (hell hound pup) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMCMMCMMMMMMMMM MMMCMCCMMMCMMMMM MMCCCCMMMMMCMMMM MMDCDCCMMMMCMAMM MCCCCCCMMMMCMAMM MPCCACCCCCCCAAMM MCHAACCCCCCCAAMM CHCMCCCCCCCCAAMM MDMMCCCCCACCAAMM MMMCCACAAACAAMMM MMMMMCCMMMCAMMMM MMMMMMMMMMMMMMMM } # tile 52 (wolverine) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMJMMMMM MMMMMMMCKJJMMMMM MMMMMKKJJJHJHMMM MMAKCJCCCJJJJJMM MAAAJJJJJJJJAAMM MAAAJAAAJAAJMMMM MMMAJJAAJJAJJMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 53 (shadow wolf) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMAMMAMMMMMAMMM MMMAMAAMMMMMMAMM MMAAAAMMMMMMMAMM MMHAHAAMMMMMMAMM MAAAAAAAAMMMMAMM AAAAAAAAAAAAAAMM DNANAAAAAAAAAAMM MPMPAAAAAAAAAMMM MMMMAAAAAAAAAMMM MMMMAMAAMMAMAMMM MMMAAMAMMAAMAMMM MMMMMAAMMMMAAMMM MMMMMMMMMMMMMMMM } # tile 54 (mist wolf) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMFMMFMMMMMFMMM MPMFMFFMMMMMMFMP PPFFFFMMPPMMMFMM MMHMHFFMMMMMMFPA PFMMFFFFFMMMFFPP FFMFAFFPPPFFFFAA DFFFAFFFFFFFPFPA MPAAFMFFMMFMFMAA MMMMFMFPPPMAMFAA MPPMPAFPAPPPFMAM MMPFFAFAAAAAFPPP MPPPMFFPAMPFFAPM MMMMMMMMMMMPPMMM } # tile 55 (hell hound) { MMMMMMMMMMMMMMMM MMMCMMCMMMMCCMMM MMMCMCCMMMMMMCMM MMCCCCMMMMMMMCMA MMDJDCCMMMMMMCMA MCCCCCCCCMMMMCMA CCCCDCCCCCCCCCAA MCHCMCCCCCCCCCAA CHCMMCCCCCCCCCAA MDMMCCCCCCCCCCAA MMMCCACCCCACCMAM MMMCAACCAAAACCAA MMMCAACMAAAACMAM MCCCAACAAAAACAAM MMMMCCCAAMCCCAMM MMMMMMMMMMMMMMMM } # tile 56 (Cerberus) { MMMMMMMMMMMMMMMM MMJMMJMMMMMMMMMM MMJJJJMJMMJMMMMM MNJNJMMJMJJMMMMM JJJJKAJJJJMMMMJM PJJJJANJNKKMMMJM DJKJAJJJKKJKMMJM MMAAJPJKAJCJKJJM MMJJJDDAJKJJJJJA MMJJJAAJJJJJJJJA MJKCKJJJKJJKJJAA MJJAAKJKKJJKKJAA JJAAAAJJAAAAJJAM JAAAAAJAAAAAJAAM MMMMMJJAAMMMJAMM MMMMMMMMMMMMMMMM } # tile 57 (gas spore) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMPFGGFPMMMMM MMMMPGFFFFFPMMMM MMMPFFFFFGGFPMMM MMMFFGGFFGGFFMMM MMMGFGGFFFFFGMMM MMMGFFFFFFFFGMMM MMMFFFFGGFFFFMMM MMMPGGFGGFGGPMMM MMMMPGFFFFGPMMMM MMMMMPFGGFPMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 58 (floating eye) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMONNNOMMMMM MMMMPNNNNNNNPMMM MMMMNNNNNNNNNMMM MMMONNBBBBNNNOMM MMMNNBBEEBBNNNMM MMMNNBEAAEBNNNMM MMMONBEAAEBNNOMM MMMMNBBEEBBNNMMM MMMMPNBBBBNNPAAM MMMMMMONNNOAAAAM MMMMMMAAAAAAAAAM MMMMMMMAAAAAAAMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 59 (glowing eye) { MMMMHMMHMMMMHMMM MHHAAHHHHHHHHAMH MAHHHAAAAAAAHHHM MAHHAAPOOOPPAHHM MAHAAONNNNNOAAHH MHHAPNNKKKKOPAOM MHAAONKKJKKKOAOM HHAAONKJAAKKOAOM MHAAONKJANJKOAOH MHAAONCKJJKKOAOM MHHAPNNKCKKNPAOM MHHAAONNNNNPAAHM HMAHAAAOOOPAAHAH MMAHHHAAAAAAHHAM MMMHAAHHHHHHAAHM MMMMMMMMMHMMMMMM } # tile 60 (freezing sphere) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMPBBBPMMMMM MMMMPBBBBBBBPMMM MMMMBBBBBBBBBMMM MMMPBPPPBBBBBPMM MMMBBNNBBPPPBBMM MMMBBANPBNNBBBMM MMMPBBPPBANPBPMM MMMMBBBBBBPPBMMM MMMMPBBBBBBBPAAM MMMMMMPBBBPAAAAM MMMMMMAAAAAAAAAM MMMMMMMAAAAAAAMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 61 (flaming sphere) { MMMMMMMMMMMMMMMM MMMMCMMMHMMMMMMM MMMMCMMMMOMMMCMM MMMCMMHMCCMMMCMM MMMCMMCMCCMMCCMM MMMDCAMDDCMACCMM MAHCDCADDCAADCMM MAACDCDDDDDADDMM MMACDDDJJJDDDDMM MMADDCAKDDACDDMM MMMADAKDDCDADMMM MMMADADHCHCADMMM MMMMDADDDCDADMMM MMMMMDADDDADMMMM MMMMMMJJJJJMMMMM MMMMMMMMMMMMMMMM } # tile 62 (shocking sphere) { MMMMMMMMMMMMMMMM MMMMMPPPPPPMMMMM MMMPPIAAADAPPMMM MMPAAAIAAADDAPMM MMPHAAAPBOAAAPMM MPAHHAPBBBOAAAPM MPHAAAPBBBBAHHPM MPAAAAPPBBBAAAPM MPAAAIAPPPAAAIPM MPIIIAAAAAAIIAPM MMPIAANAAPAAAIPM MMPIAANAAAPAAPMM MMMPANANAPAPAPMM MMMMPPAIAPAPPMMM MMMMMMPPPPPMMMMM MMMMMMMMMMMMMMMM } # tile 63 (bloodshot eye) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMODNNOMMMMM MMMMPNNCNNNNPMMM MMMMNNCNCNNCNMMM MMMONNBBBBNNDOMM MMMNNBBEEBBCNNMM MMMCNBEPAEBNNNMM MMMOCBEAAEBNNOMM MMMMDBBEEBBNNMMM MMMMPNBBBBNDPAAM MMMMMMONNNOAAAAM MMMMMMAAAAAAAAAM MMMMMMMAAAAAAAMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 64 (blinking eye) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMPPPPPMMMMM MMMMPPBBBBBPPMMM MMMPBLLLLLLLBPMM MMMBLAAAAAAALBMM MMLLAOEEAAEOALMM MLLAOOEEANENOALM MMMAOOOEEEENOAMM MMMLAOONEENOALMM MMMMLAAOOOOALMMM MMMMMLLAAAALMMMM MMMMMMMLLLLMMMMM MMMMMMMMMMMMMMMM } # tile 65 (kitten) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMKMMMM MMMMMMMMMMMMCMMM MMMMCMCMMMMMLMAM MMMCCCCJMMMMCMAM MMMNCNCJCCLCLMAM MMMCCCCJCCLCCAAM MMMMIACCLLCCCAAM MMMMMCACCJCCJAMM MMMMMMCCAMMCAMMM MMMMMMMMMMMMMMMM } # tile 66 (housecat) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMKMMMM MMMMMMMMMMMMCMMM MMMCMCMMMMMMLMAM MMCCCCJMMMMMCMAM MCNCNCJCLCLCLMAM MCCCCCJCLCLCCAAM MMCICJCCLCLCLAAM MMMAACCLCLCCCAAM MMMCCACCJJCCJAMM MMMMMCCAMMMCAMMM MMMMMMMMMMMMMMMM } # tile 67 (jaguar) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMCMMCMMMMMMCMMM MMCCMCJMMMMMMCMA MCCCCCJMMMMMMCMA MGCGCCJCAACCJCMA MCCCCCJCCCCCCCAA MCDDDJCAACCAJCAA MMCCACCAJCCAACAA MMMMCACCJJJCCJAM MMMMCACAAAAACJAM MMMCKACAAAAACAAM MMMMMCCAAMMMCAMM MMMMMMMMMMMMMMMM } # tile 68 (lynx) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM OMMMMOMMMMMMMMMM ACMCCAMMMMMMMMMM MCCCAMMMMMMMMCAM MGCGCOAKKKKKMLAM MCKCCAJCCCCCKAMM LLDDLLACLLLCCAAM MMCCMAACLLLCCAAM MMMMMMMCAAAACAAM MMMMCACAAAACCAMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 69 (panther) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMAAMM MMMMMMMMMMMMMMAM MMMMMMMMMMMMMMAM MAMMMAMMMMMMMMAM MEAMAEMMMMMMMMAM MAAAAAEAAAAAAAMM MAAAAAEAAAAAAAMM MHAHAAMAAAAAAAAM MAAAAMAAAAAEAAAM MAAAMMAAAAAEAAAM MMMMMAAMMMMAAAMM MMAAAAMMAAAAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 70 (werepanther) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMAAMM MMMMMMMMMMMMMMAM MMMMMMMMMMMMMMAM MAMMMAMMMMMMMMAM MEAMAEMMMMMMMMAM MAAAAAEAAAAAAAMM MAAAAAEAAAAAAAMM MDADAAMAAAAAAAAM MAAAAMAAAAAEAAAM MAAAMMAAAAAEAAAM MMMMMAAMMMMAAAMM MMLLAAMMLLAAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 71 (large cat) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMKMMM MMMMMMMMMMMMMCMM MMMCMCMMMMMMMLMA MMCCCCJMMMMMMCMA MCNCNCJCLCCLCLMA MCCCCCJCLCCLCCAA MMCDCJCCLCCLCLAA MMMAACCLCCLCCCAA MMMMCACCJJJCCJAM MMMCKALAAAAACAAM MMMMMCCAAMMMCAMM MMMMMMMMMMMMMMMM } # tile 72 (kamadan) { MMMMMMMMMMMMMMMM MMMMMMMMFGAMMMMM MGFAMMMFAMGAMMMM GAMFAMMFAMFAMMMM MMMMFAFAMMMFMMKM MCMMFCGAMMMMMMKM MCCMCCACMMMMMMCM MAAKCCAKKCAMMCMM MCKCACAKCAKCCAMM MHKHKACKCKCKACAM MCCCKAKACAKACAAM MACCMCAKKKCKACAM MMMMMCAMCAAAACAM MMMMAKMCCAAAACAM MMMCKMCKAAAACKMM MMMMMMMMMMMMMMMM } # tile 73 (displacer beast) { MMMMMMMMMMMMMMMM MMMMMMMMEMMMMMMM MMMMMMMEMEMMAAMM DEEEAMMAMEMMMMAM MMMMEAMEMDMMMMAM MAMMMAMEMMMMMMAM MEAMAEAAAMMMMMAM MAAAAAAAAAAMMAMM MAAAAEAAAAAAAAMM MHAHAEAAAAAAAAAM MAAAAEAAAAAAAAAM MAAAMAAAAAAAAAAM MMMMMAEMAEEAMEAM MMMMAEMAEMEAMEAM MMMAEMAEMEAMEAMM MMMMMMMMMMMMMMMM } # tile 74 (caterwaul) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMEEMM MMMMMMMMMMMMMMEM MMMMMMMMMMMMMMEM MEMMMEMMMMMMMMEM MEEMEEMMMMMMMEAM MEEEEEEEEEEEEAMM MEEEEEEEEEEEEEAM MHEHEEEEEEEEEEAM MEEEEAEEEEEEEEAM MEEEAAEEEEEEEEAM MAAAAEEAAAEEEAAM MMEEEEAAEEEEAAMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 75 (tiger) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMCMMCMMMMMMCMMM MCCJCCMMMMMMMCMA MCAACCJMMMMMMAMA MGAGCCJACACAJCMA MCCCCCACACACACAA MODOCACCACACACAA MOCOACCJACACACAA MMMMCACJAJAJCAAM MMMMAACAAAAAAJAM MMMCKACAAAAACAAM MMMMMCCAAMMCCAMM MMMMMMMMMMMMMMMM } # tile 76 (weretiger) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMCMMCMMMMMMCMMM MCCJCCMMMMMMMCMA MCAACCJMMMMMMAMA MGAGCCJACACAJCMA MCCCCCACACACALAA MOCOKALCACALALAA MOKOALLLALALALAA MMMMLALLALALLAAM MMMMAALAAAAAALAM MMMLLALAAAAALAAM MMMMMLLAAMMLLAMM MMMMMMMMMMMMMMMM } # tile 77 (sabre-toothed cat) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMCMMCMMMMMMCMMM MCKJCCMMMMMMMCMA MCCKCCJMMMMMMCMA MGKGCCJAKCKKKCMA MCLCCCACCCCCCCAA MNCNCACCCCCCCCAA MNMNACCCCCCKCCAA MOMOCACKKKKACKAM MMMMKACAAAAAKJAM MMMKCAKAAAAAKAAM MMMMMKCAAMMCKAMM MMMMMMMMMMMMMMMM } # tile 78 (hellcat) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMDMMM MMMMMMMMMMMMMDMM MMMDMDMMMMMMMDMA MMDDDDKDDDMMMDMA MCHDHDKDDDDMMDMA MCDDDDKDDDDDDDAA MMODOKDDDDDDDDAA MMOAODCDDDDCDDAA MMMMDADCCCCKDDAM MMMDDADAAAAADAAM MMMMMDDAAMMKDAMM MMMMMMMMMMMMMMMM } # tile 79 (gremlin) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM GGGAMMMMAGGGMMMM MGGGFAAAGGGMMMMM MMFFFFFFFFMMMMMM MMMNDFFDNAMMMMMM MMMGNFFNGAMMMMMM MMMGFFFFGAMMAAMM MMMAGFFFAFAAAAAM MMGFAGFAFFFAAAAM MGFGFAAFFAFAAAAM MGFMGFAGAAFAAAAM MMMMFFAGFAAMAAMM MMMGFAMFGAMMMMMM MMMMMMMMMMMMMMMM } # tile 80 (gargoyle) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMPAPPPPAPMMMMM MMPAMMMMMMAPMMMM MMPMDDMMDDAPMMMM MMMMPDMMDPAMMMMM MMMMPMMMMPAMMAAM MMMMAPMMMAMAAAAA MMMPMAPMAMMMAAAA MMPMPMAAMMAMAAAA MMPAMPMAPAAMAAAA MMPAMPMMMMAMAAMM MMMMMPMMMMAAAAMM MMMMMPMAPMAAMMMM MMMMPFAMFPAMMMMM MMMMMMMMMMMMMMMM } # tile 81 (winged gargoyle) { MMMKMMMMMMKMMMMM MMMKJMMMMKJMMMMM MMKKAPPPPAJJMMMM MMKJMMMMMMAJMMMM MMCJDDMMDDAJMMMM MKJAPDMMDPAJJMMM MKJAPMMMMPAAJAAM KJAMAPMMMAMAJJAA JMMPMAPMAMMMAJAA MMPMPMAAMMAMAAAA MMPAMPMAPAAMAAAA MMPAMPMMMMAMAAMM MMMMMPMMMMAAAAMM MMMMMPMAPMAAMMMM MMMMPFAMFPAMMMMM MMMMMMMMMMMMMMMM } # tile 82 (statue gargoyle) { MMMMMMMMMMMMMMMM MMMAMMNMOMMAMMMM MMAPAMNAOMAPAMMM MMAPAMNNOMAPPAMM MAPPOANOOANAPAMM MAPAOADODANAPAMM MAMOAAONOAANMAMM MAMPNAANAAPNMAMM MAMAPNNANPNAPAMM MAMAAPNAPNAAPAMM MMAAAEEPAAMMAMMM MMMMAPPPONMMMMMM MAAAAPPOONMMMMMM MMAAAAPONMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 83 (hobbit) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMJJAMMMMMMM MMMMMJJJJAMMMMMM MMMMJLFLFJMMMMMM MMMMJLLLLJMMMMMM MMMMJKLLKJJMAAMM MMMCLLLLLLCAAAMM MMCLALLLLALCAMMM MMLLAJJKJALLAMMM MMMLMLKJLALAAMMM MMMMMLLALLAMAMMM MMMMLLLMLLLMMMMM MMMMMMMMMMMMMMMM } # tile 84 (dwarf) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMBMMMMMMMMM MMMMMBEEMMMMMMMM MMMMBBEEEMMMMMMM MMMMBLLLEMMMMMMM MMMMMOLOMMMAAAMM MMMBBOOOEEAAAAMM MMMBABOEAEAAAAMM MMMMLBBELAAAAMMM MMMMEBAEEAAMMMMM MMMMBEAEBMAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 85 (dwarf thief) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMKMMMMMMMMM MMMMMKJJMMMMMMMM MMMMKCJJJMMMMMMM MMMMKALAJMMMMMMM MMMMMOPOMMMAAAMM MMMKKOOOJJAAAAMM MMMCAKOJAJAAAAMM MMMMLKKJLAAAAMMM MMMMJCAJJAAMMMMM MMMMKKAJKMAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 86 (bugbear) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMKMMMMMMMMM MKMMKCKMMMMMMMMM MKKCKKKMMMMMMMMM CADKADCKKMMMMMMM KKKCKKKJCKMMMMMM KAPAPAKJJKJMMMMM KAAAAAKKKKJJMMMM MKCKKCKKACKJMMMM MMKAJJCAKKKJMAAM MMKKMKCKKCJJAAMM MMMCMMKJAKJAAMMM MMMMMCCAAKJAMMMM MMMMMMMMCCAMMMMM MMMMMMMMMMMMMMMM } # tile 87 (dwarf lord) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMBMMMMMMMMM MMMMMBEEMMMMMMMM MMMMHHHHHMMMMMMM MMMMBLLLEMMMMMMM MMMMBOLOEMMAAAMM MMMBBOOOEEAAAAMM MMMBABOEAEAAAAMM MMMMLBBELAAAAMMM MMMMEBAEEAAMMMMM MMMMBEAEBMAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 88 (dwarf king) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMHMCMHMMMMMMM MMMMHCHCHMMMMMMM MMMMHHHHHMMMMMMM MMMMBLLLEMMMAMMM MMMMMOLOMMMAAAAM MMMEBOOOEEAAAAMM MMMBABOEAEAAAAMM MMMMLBBELAAAAMMM MMMMEBAEEAAMMMMM MMMMBEAEBMAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 89 (duergar) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMAMMMMMMMMM MMMMMAAAMMMMMMMM MMMMAAAEEMMPOMMM MMMMADLDAMMMJOMM MMMMMOPOMMMJAOMM MMMAAOOOAEJAMPMM MMMAMAOAMEAMMMMM MMMMLAAALMMMMMMM MMMMEAMEEMMMMMMM MMMMAAMAAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 90 (deep one) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMGAMMMMMMMMM MMMMAGAAMMMMMMMM MMMMGGFAMMMMMMMM MMMMMGFAMMMMMMMM MMFGGGFFFAMAAMMM MMGFFFFGGFAAAMMM MMGAGFFAAGNOMMMM MMGAGFFFFAAAMMMM MMMMGFGFAAAAAAMM MMMGGAGFAAAAMMMM MGGFFAGFFAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 91 (mind flayer) { MMMMMMMMMMMMMMMM MMMMMMMIIIICMMMM MMMMMIIIIIICMMMM MMMMIIIIIIICMMMM MMMIGIIIIGCMMMMM MMMIIGINGICMMMMM MMMMIIIIICMMMMMM MMMMIAIAIFMMMMMM MMMMIAIAIFMMMMMM MMMMIAIAIFIMMMMM MMMMMFIFIFICMAAM MMMMCBIBBFMCAAAM MMMIIIBBFFACAAAM MMMMMMBBFCAAAAMM MMMMMMCFFCAAMMMM MMMMIICMIIAMMMMM } # tile 92 (master mind flayer) { MMMMMMMMMMMMMMMM MMMMMMMIIIICMMMM MMMMMIIIIIICMMMM MMMMIIIIIIICMMMM MMMIGIIIIGCMMMMM MMMIIGINGICMMMMM MEEEIIIIICEEEEMM MMEEIAIAIEEEEMMM MMMEIAIAIEEEMMMM MMMMIAIAIEEEMMMM MMMMEFIFIEEEMAAM MMMMCBIBBEEEAAAM MMMIIIBBEEEEAAAM MMMMEEBEEEEAAAMM MMMEEECEEEAAMMMM MMMMIICMIIAMMMMM } # tile 93 (deeper one) { MMMMMMMMMMMMMMMM MMMMMMMMJMJMJMMM MMMMMGAMJMJMJMMM MMMMAGAAMJJJMMMM MMMMGGFAMMJMMMMM MMMMMGFAMMJMMMMM MMFGGGFFFAJAAMMM MMGFFFFGGFGAAMMM MMGAGFFAAAJAAMMM MMGAGFFFAAJAMMMM MMMMGFGFAAJAMMMM MMMMGFGFAAJAMMMM MMMGGAGFAAJAMMMM MFGGFAGFFAJAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 94 (deepest one) { MMMMMGMMMMMMMMMM MMMMGGFMBMBMBMMM MMMAAGAABMBMBMMM MMMGGGFFMBBBMMMM MMMMMGFAMMJMMMMM MMFGGGFFFMJMMMMM MMGFFGFGFAJAAMMM MMGFFFFAGFGAAMMM MMGAGFFAAAJAAMMM MMGAGFFFAAJAMMMM MMMMGFGFAAJAMMMM MMMMGFGFAAJAMMMM MMMGGAGFAAJAMMMM MFGGFAGFFAJAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 95 (manes) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMPPMMMMMMMMMM MMMPPPPMMMMMMMMM MMPAPAPMMMMMMMMM MMPPPPPMPPPMPMMM MMPMMPPPPMMMMMMM MMPMMPPPPPMMMPMM MMPPPPPMPPPMMMMM MMPMPMPMPPMPMMMM MPMMMPMPPPPMMMMM MPMMMMPPPMPPMMMM MMPMMMMPMPMPMPMM MMMMMMMMPMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 96 (homunculus) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMJJJMMMMMMM MMMMMMLLCMMMMMMM MMMMMMLLCMMMMMMM MMMMMBBPPPAAMMMM MMMMLMBPPACAAMMM MMMMMMBAPAAAAMMM MMMMMLLALCAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 97 (dretch) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMOMMMMMMMM MMMMMMOOOMMMMMMM MMMMMOENEOMMMMMM MMMMMLLNOLMMMMMM MMMEMAAOAMMEMMMM MMMMENALANEMMMMM MMEENLOLOONEEMMM MMANLLOMOOANMMMM MMMAALLOOOMAMMMM MAAAAALLOLMMMMMM MAAAAAPAOMMMMMMM MMAAANPAPNMMMMMM MMMMMMMMMMMMMMMM } # tile 98 (imp) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMOMDMOMMMMMM MMMMMOCDDOMMMMMM MMMMMMCDDMMMMMMM MMMMMGGFFFAAMMMM MMMMCMGFFADAAMMM MMMMMMGAFAAAAMMM MMMMMCDADDAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 99 (lemure) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMPPMMMMMMMMMM MMMPPPPMMMMMMMMM MMPAPAPMMMMPMMMM MMPPPPPMMPPMPMMM MMPMMPPPPPPPPMMM MMPMMPPPPPPPMMMM MMPPPPPPPPPMMMMM MMMMPPPPPPPPMMMM MMPPPPPPPPPPMMMM MMMPPPPPPPPPPMMM MMPMPMMPPPPMPPMM MMMMMMMMPMPPMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 100 (quasit) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMOMDMOMMMMMM MMMMMOCDDODMMMMM MMMMMMCDDMDMMMMM MMMMMGGFFFAAMMMM MMMMCMGFFAAADAMM MMMMCMGFFJJDAMMM MMMMMMGAFAAAAMMM MMMMMCDADDAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 101 (rutterkin) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMOMMMMMMMOMMMM MMAOMMMMMMAOMMMM MAOOMAFMFMAOOMMM MMAOAAFMFMAOMMMM MAOOAFDODFAPOMMM MMAPPAOOOAPPMMMM MMAAAOOOOOMMMMMM MMMAOAPOOMOMMMMM MAAAAAMOOMMMMMMM MMMAABOAOBMMMMMM MMMMMMMMMMMMMMMM } # tile 102 (tengu) { MMMMMMMMMMMMMMMM MMMMMMMPPMMMMMMM MMMMMMPPPPMMMMMM MMMMMDPPNPMMMMMM MMMMDDDPPPMMMMMM MMMMDDPPPPMMMMMM MMMMDMMPPAMMMMMM MMMMMPIAAIPMAAAM MMMMPPPIIPPPAAAM MMMMPAPPPPAPAAAM MMMMPAHHHHAPAAAM MMMMLAPPPPALAAAM MMMMMMPPPPAAAAMM MMMMMMPPPPAAMAMM MMMMMLLAMLLAMMMM MMMMMMMMMMMMMMMM } # tile 103 (nupperibo) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMAFMFMMMMMM MMMMMMAHFHMMMMMM MMMFFGAAFAAGFFMM MMFFGAFFFFFAGFFM MMFGAFAFFFAFAGFM MMGAAAAAFAAAAAGM MMFAAMAFFFMMAAFM MMAMMMAFAFMMMAMM MMMMMMMMMMMMMMMM } # tile 104 (blood imp) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMOMKMOMMMMMM MMMMMOCKKOMMMMMM MMMMMMCCKMMMMMMM MMMMMDDDDDAAMMMM MMMMKMDDDAKAAMMM MMMMMMDADAAAAMMM MMMMMKKACKAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 105 (blue jelly) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMEMMMMMMMM MMMMMMOBEMMMMMMM MMMBEMOBEBOEMMMM MMOBEOBBEOBBEMMM MMOBEOBBEOBBEMMM MMBBBGGBGGBEEEMM MMBBBAGBAGEEEEAM MMBBBBBBEBEEEEAA MMMBBBBBBBEEEAAA MMMMBBBBBEEEAAAM MMMMMMBBBEEAAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 106 (spotted jelly) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMEMMMMMMMM MMMMMMOBEMMMMMMM MMMBEMOCEBOEMMMM MMOCEOCCEOBCEMMM MMOCEOBCEOCBDMMM MMBBBHHBHHBEDDMM MMCCBAHBAHEEEEAM MMBBCBBBEBEEDEAA MMMBBBCBBBEEDAAA MMMMBCCCBEEDAAAM MMMMMMCCBEEAAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 107 (clear jelly) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMPPPPMMMM MMMMMMMPMMMMPMMM MMMMMMPMMMBBMPMM MMMMMPBMMMMMBMPM MMAAAPBMMMMMMMPM MAAAPMMMEEMEMMPM MAAAPBMEEEEEEMPM MMAAAPBEMEMMEPAM MMMAAAPPPPPPPPAM MMMMMMAAAAAAAAMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 108 (ochre jelly) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMDMMMMMMMM MMMMMMLCDMMMMMMM MMMCDMLCDCLDMMMM MMLCDLCCDLCCDMMM MMLCDLCCDLCCDMMM MMCCCGGCGGCDDDMM MMCCCAGCAGDDDDAM MMCCCCCCDCDDDDAA MMMCCCCCCCDDDAAA MMMMCCCCCDDDAAAM MMMMMMCCCDDAAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 109 (yellow jelly) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMPPPPMMMM MMMMMMMPHHHHPMMM MMMMMMPHHHOOHPMM MMMMMPHHHHHHOHPM MMAAAPHHHHHHHHPM MAAAPHOHHHHHHHHM MAAAKHOHHHOHOHKM MMAAAKHOHHHHHKAM MMMAAAKKHHHKKAAM MMMMMMAAAAAAAAMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 110 (orange jelly) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMPPPPMMMM MMMMMMMPCCCCPMMM MMMMMMPCCCOOCPMM MMMMMPCCCCCCOCPM MMAAAPCCCCCCCCPM MAAAPCOCCCCCCCCM MAAAKCOCCCCCOCKM MMAAAKCOCCCCCKAM MMMAAAKKCCCKKAAM MMMMMMAAAAAAAAMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 111 (rancid jelly) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMPPPPMMMM MMMMMMMPAAAAPMMM MMMMMMPAAAOOAPMM MMMMMPAAAAAAOAPM MMEEEPAAAAAAAAPM MEEEPAOAAAAAAAPM MEEEPAOAAAAAAAPM MMEEEPAOAAAAAPEM MMMEEEPPPPPPPEEM MMMMMMEEEEEEEEMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 112 (kobold) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMNMMMNMMMMMMMM MMMNBPBNMMMMMMMM MMMBABABMMMMMMMM MMMMBBPAMMAMMMMM MMMBBABPAMAAMAMM MMBPBBBBPAAAAAMM MMBAPBPAPAAAAAMM MMMMPBPAAAAAAMMM MMMMBABAAAAMMMMM MMMBBABBAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 113 (large kobold) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMNMMMNMMMMMMMM MMMNBPBNMMMMMMMM MMMBABABMMMMMMMM MMMMBBPAMMAMMMMM MMMBBABPAMAAMMMM MMBPBBBBPAAAMAMM MMBAPBPAPAAAAAMM MMBAPBPAPAAAAAMM MMMMPBPAAAAAAMMM MMMMBABAAAAMMMMM MMMBBABBAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 114 (kobold lord) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMNMMMNMMMMMMMM MMMNCCCNMMMMMMMM MMMCABACMMMMMMMM MMMCBBPCMMAMMMMM MMCCBABCCMAAMMMM MMCCBBBCCAAAMAMM MMBCCBCCPAAAAAMM MMBACBCAPAAAAAMM MMMMBBBAAAAAAMMM MMMMBABAAAAMMMMM MMMBBABBAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 115 (kobold shaman) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMNMMMNMMMMMMMM MMMNHHHNMMMMMMMM MMMHABAHMMMMMMMM MMMHBBPHMMAMMMMM MMHHBABHHMAAMMMM MHHHBBBHHHAAMAMM MHBHHBHHPHAAAAMM MMBAHBHAPAAAAAMM MMMMBBBAAAAAAMMM MMMMBABAAAAMMMMM MMMBBABBAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 116 (swamp kobold) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMCMMMCMMMMMMMM MMMCGFGCMMMMMMMM MMMGAGAGMMMMMMMM MMMMGGFAMMAMMMMM MMMGGAGFAMAAMMMM MMGFGGGGFAAAMAMM MMGAFGFAFAAAAAMM MMGAFGFAFAAAAAMM MMMMFGFAAAAAAMMM MMMMGAGAAAAMMMMM MMMGGAGGAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 117 (rock kobold) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMDMMMDMMMMMMMM MMMDOPODMMMMMMMM MMMOAOAOMMMMMMMM MMMMOOPAMMAMMMMM MMMOOAOPAMAAMMMM MMOPOOOOPAAAMAMM MMOAPOPAPAAAAAMM MMOAPOPAPAAAAAMM MMMMPOPAAAAAAMMM MMMMOAOAAAAMMMMM MMMOOAOOAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 118 (kobold warrior) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMNMJMNMMMMMMMM MMMNCJJNMMMMMMMM MMMBABABMMMMMMMM MJMMBBPAMMMMMMMM JJMKBABJAMMMMMMM JJBPKBJBPAAONMMM JJBAKJJAPONAAAMM JJBAPJPAPAAAAAMM JJMMPBPAAAAAAMMM MJMMBABAAAAMMMMM MMMBBABBAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 119 (Kroo the Kobold King) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMHMHMHMMMMMMMM MMMHHHHHMMMMMMMM MMMNBPBNMMMMMMMM MMMBABABMMMMMMMM MMMMBBPAMMMMMMMM MMDDBABDDMMMMMMM MDBPDBDBPDMMMMMM MDBAPBPAPDCAAAMM MDBAPBPAPDDAAAMM MMDAPBPAAADCAMMM MMDABABAAADDAMMM MDABBABBADDDCMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 120 (leprechaun) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMGMMMMMMMMM MMMMMMFMMMMKMMMM MMMMMGFFMMKLKMMM MMMMGFFFFMMKMMMM MMMMMKLKAMGLAAMM MMMFGFJFFFAKAMAM MMMGAGFFAAACMAAM MMMMLKHCKJAKAAMM MMMMGFAGKJAKAMMM MMMGFAAMGFAKMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 121 (leprechaun wizard) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMBMMMMMMMMM MMMMMMBMMMMMMMMM MMMMMBEEMMMKMMMM MMMMBBEEEMKLKMMM MMMMODNDOMMCMMMM MMMOOLLLOMBLAAMM MMMEBELEEEAKAMAM MMMBABEEAAAKMAAM MMMMLKHKKJAKAAMM MMMMBEABCJACAMMM MMMBEAAMBEAKMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 122 (small mimic) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMPOPMMMMMMM MMMMMMNNOMMMMMMM MMMMMMNNOMMMMMMM MMMMMMMOAMMMMMMM MMMMMNNNNNMMAAMM MMMMOONNNOOMAAMM MMMMNANOOANAAAMM MMMMMMNAOAAAAMMM MMMMMMNAOAAMAMMM MMMMMNNMOOAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 123 (large mimic) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMLLOAMMMMMM MMMMMMNNOAMMMMMM MMMMMMNNOAMMMMMM MMMMMMONOAMMMMMM MMMMMNNNNOMMAAAM MMMMOONNNOOMAAAM MMMNOANNNAOOAAAM MMMNAONONOANAAAM MMMMMNOMNOAAAAMM MMMMMNOMNOAAMAMM MMMMNNOMNOOAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 124 (giant mimic) { MMMMMMMMMMMMMMMM MMMMMMNNOMMMMMMM MMMMMNNNNOAMMMMM MMMMMNNNNOAMMMMM MMMMMNNNNOAMMMMM MMMMMONNNOAMMMMM MMPONNOOONOOPAAA MPONONNNNOONOPAA MONOANNNNOAONOAA MNNOANNNNOAOOOAA MMMAANNONNAAAAAA MMMMPNOMNNPAAAAA MMMMONOMNNOAAMMA MMMMNNOMNNOAAMMA MMMNNNOMNNOOAMMM MMMMMMMMMMMMMMMM } # tile 125 (wood nymph) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMOHMMMMMMMMMMM MMOHHLMMMMMMMMMM MMOHLLMMMMMMMMMM MMHHLAMMMMMMMMMM MOHLLFKKKKLAMMMM MHKFLFCKCKAMMMMM OHKJFKKJJKMAMMMM HCKLJJGKAAAAAAAM MJJAJGDKKAAAAAMM MMJAMCKJJAAAAMMM MMMJMKKCKJAAMMMM MMMMKKKKKKJAMMMM MMMMKJCJCJKJMMMM MMMMMMMMMMMMMMMM } # tile 126 (water nymph) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMOHMMMMMMMMMMM MMOHHLMMMMMMMMMM MMOHLLMMMMMMMMMM MMHHLAMMMMMMMMMM MOHLLJBBBBLAMMMM MHBJLJBBBBAMMMMM OHBPJBBPPBMAMMMM HBBLPPNBAAAAAAAM MPPAPNDBMAAAAAMM MMPAMBBPPAAAAMMM MMMPMBBBBPAAMMMM MMMMPBBBBBPAMMMM MMMMBPBPBPBPMMMM MMMMMMMMMMMMMMMM } # tile 127 (mountain nymph) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMOHMMMMMMMMMMM MMOHHLMMMMMMMMMM MMOHLLMMMMMMMMMM MMHHLAMMMMMMMMMM MOHLLCOOOOLAMMMM MHOCLCOOOOAMMMMM OHOLCOOLLOMAMMMM HOOKLLIOAAAAAAAM MLLALIBOKAAAAAMM MMLAMOOLLAAAAMMM MMMLMOOOOLAAMMMM MMMMLOOOOOLAMMMM MMMMOLOLOLOLMMMM MMMMMMMMMMMMMMMM } # tile 128 (pixie) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMPMM MMMMMMHHMMMMPPMM MMPMMMLLHMPPMPMM MMMPPMMLMPPMPMMM MMMMPPBFFLLMMMMM MMMMMMMFFMMLPMMM MMMMMPLMFFMMPPMM MMMPPLMMBFLMMMMM MMMMMMMMMBLMMMMM MMMMMMMMMMLLMMMM MMMMMMMMMMMBMMMM MMMMMMAAAAMMMMMM MMMMMMMAAAAAAMMM MMMMMMMMMMMMMMMM } # tile 129 (brownie) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMCMMMMMMMMM MMMMMMKMMMMMMMMM MMMMMCCKMMMMMMMM MMMMCKKCKMMMMMMM MMMMMBLBAMMMMMMM MMMKCKBKCKAMMMMM MMMCACKKACAAAAMM MMMMCCKCKAAAAAMM MMMMCKACCAAAAMMM MMMCKAAMCKAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 130 (quickling) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMPPPPPPMDDMMM MMMMMMMMMDDLLMMM MMPPPPPMMMFLLMMM MMMMMMLLLLLFFLLM MMMPPPMAAFFFAAAM MMMMMMMMFFFAMMMM MPPPPPMMLLAAMMMM MMMMMMMLAMLAMMMM MMPPMMLAAMLAMMMM MMKLLLAAMLAMMMMM MMMKAAAJLAMMMMMM MMMMMMMMJAMMMMMM MMMMMMMMAMMMMMMM MMMMMMMMMMMMMMMM } # tile 131 (Aphrodite) { MMMMMMMMMMMMMMMM MMMMMMMMMPCPMMMM MMMIHMMMMKHCMMMM MMIHHLMMMKHCMMMM MMIHLLMMMPCPMMAM MMHHLAMMMMCMMAAM MOHLLIDDDDLMAAMM MHDILIDDDDCMAMMM OHDKIDDKKDMAMMMM HDDLCKFOAAAAAAAM MKKAKFGOMAAAAAMM MMKAMONLLAAAAMMM MMMKMONNOLAAMMMM MMMMLOONNOLAMMMM MMMMOLOLOLOLMMMM MMMMMMMMMMMMMMMM } # tile 132 (goblin) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMLKMMMMMMMMMM MMMCJAMMMMMMMMMM MMKJAMMMMMMMMMMM MJJAMIIKMMMAAMMM MIKMIGIGIJAAMMMM JMICKIIIJKMMMMMM MMMIIJJJKMAMMMMM MMMMKICJAAAAAMMM MMMMICKCJAMMMMMM MMMMIKAIJAMMMMMM MMMIKAAMIKMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 133 (hobgoblin) { MMMMMMMMMMMMMMMM MMMMMLKMMMMMMMMM MMMMCKAMMMMMMMMM MMMCJAMMMMMMMMMM MMKJAMMMMMMMMMMM MJJAMIIKMMMAAMMM MIKMIHIHIJAAMMMM JMICKIIIJKMMMMMM MMMIIJJJKMAMMMMM MMMMKICCAAAAAMMM MMMMIIIIJAMMMMMM MMMMICKKJAMMMMMM MMMMIKAIJAMMMMMM MMMICAAMIKMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 134 (orc) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMOAMMMMMMMMM MMMMNOPAMMMMMMMM MMMMLPLAMMMMMMMM MMMMMPMAMMMMMMMM MMKCCAKKKAMAAMMM MMBPCKKMPMAAAMMM MMBAGGFAAPNOMMMM MMBAJJPNOAAAMMMM MMMMBNOJAAAAAAMM MMMBJACPAAAAMMMM MMBPPABPPAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 135 (hill orc) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMOAMMMMMMMMM MMMMNOPAMMMMMMMM MMMMLKLAMMMMMMMM MMMMMKMAMMMMMMMM MMKGGAFFKAMAAMMM MMJKGFFMCMAAAMMM MMKAHHFAAKNOMMMM MMJAGFFNOAAAMMMM MMMMGNNFAAAAAAMM MMMGGAGFAAAAMMMM MMKJJAKJJAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 136 (Mordor orc) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMOAMMMMMMMMM MMMMNOPAMMMMMMMM MMMMLPLAMMMMMMMM MMMMMPMAMMMMMMMM MMKIIAIIKAMAAMMM MMBPIDDMPMAAAMMM MMBAGGFAAPMOMMMM MMBAIDDNOAAAMMMM MMMMBNOJAAAAAAMM MMMBIAIPAAAAMMMM MMBPPABPPAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 137 (Uruk-hai) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMOAMMMMMMMMM MMMMNOPAMMMMMMMM MMMMLPLAMMMMMMMM MMMMMPMAMMMMMMMM MMIIIAIIIAMMMMMM MMBPIKIMBAAAAMMM MMBIGMPPPPAAAMMM MNBADMPDDPAAMMMM MMBNNJPDDPAAMMMM MMMMINPPPPAAAAMM MMMBIAKMAAAAMMMM MMBPPABPPAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 138 (orc shaman) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMOAMMMMMMMMM MMMMNOPAMMMMMMMM MMMMLPLAMMMMMMMM MMMMMPMAMMMMMMMM MMCCCACCCAMMMMMM MMBPCKCMBAAAAMMM MMBCGGFJBAAAAMMM MMBAJJCJBAAAMMMM MMBAJJCJBAAAMMMM MMMMCACJAAAAAAMM MMMBCACPAAAAMMMM MMBPPABPPAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 139 (orc-captain) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMOAMMMMMMMMM MMMNNOOPAMMMMMMM MMMMLPLAMMMMMMMM MMMIPPPAMMMMMMMM MMDIIPADDAMAAMMM MMBPIADMPMAAAMMM MMBAGGFAAPMOMMMM MMBAGGFAAPMOMMMM MMBAJJPNOAAAMMMM MMMMBNOJAAAAAAMM MMMBDAIPAAAAMMMM MMBPPABPPAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 140 (war orc) { MMMMMMMMMMMMMMMM MMMMMMMMMMPMMMMM MMMMMOMMMMNMMMMM MMMMNOOAMMOMMMMM MMMMLPLAMMKMMMMM MMMMMPAMMMKMMMMM MMMPIAJPAACMMMMM MMBAICJAPAKMMMAM MMBAGGFAPAKAMAMM MMBAGGFAAPKAAMMM MMPAICJAAAKAMMMM MMMMBCPAAAKAAMMM MMMBPABPAACAAAMM MMBPPABPPAKAAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 141 (great orc) { MMMMMOMMMMMMMMMM MMMMNOPMMMMMMMMM MMMMLPLAMMMMMMMM MMMMMPMAMMMMMMMM MMBPCAKKKAMHMMMM MMBACKKAAJNPMMMM MMBACKJAJNPMMMMM MMBAGGFAJOAMMMMM MMBAGGFAKJMMMMMM MMMMJJJAMMMMMMMM MMMMBJPAAAAAAMMM MMMMBAPAAAAAAAMM MMMBJACPAAAAMMMM MMBPPABPPAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 142 (Grund the Orc King) { MMMMMMMMMMMMMMMM MMMHAHAHAMMMMMMM MMMMHHHAMMMMMMMM MMMMDLDAMMMMMMMM MMMMPLPAMMMMMMMM MMCDDADDCMMMMMMM MCAPNOMPDMMMMMMM MDBANOMPDCMMMMMM MDBANOMADCMMMMMM MMDAKKKAADCMMMMM MMDABCPAADCMMMMM MMCABAPAADCMMMMM MMABJACPADCAAMMM MMBPPABPPDDCCMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 143 (snow orc) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMPAMMMMMMMMM MMMMBPOAMMMMMMMM MMMMLOLAMMMMMMMM MMMMMOMAMMMMMMMM MMPBBAPPPAMAAMMM MMNOBPPMOMAAAMMM MMNAGGFAAODCMMMM MMNAPPODCAAAMMMM MMMMNDCPAAAAAAMM MMMNPAMOAAAAMMMM MMNOOANOOAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 144 (demon orc) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMPMCMPMMMMMMMM MMMBDCCBMMMMMMMM MMMMHAHMMMMMMMMM MMMMAAAMMMMMMMMM MMCDDACCCMMMMMMM MMAADDCMAMMMMMMM MMAMGGFMMANOMMMM MMAMADANOMMMMMMM MMMMANAEMMMMMMMM MMMAAMEAMMMMMMMM MMAAAMAAAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 145 (rock piercer) { MJKKKKKKKCJAAAMM MMJKGCGKJJAAAAMM MMMJKKKKJAAAAMMM MMMJKKKJJAAAAMMM MMMMJCKJAAAAMMMM MMMMJJKJMAAAMMMM MMMMJJKKMAAAMMMM MMMMJJJJMMAMMMMM MMMMMJJMMMAMMMMM MMMMMJJMMMAMMMMM MMMMMJJMMMMMMMMM MMMMMJJMMMMMMMMM MMMMMJMMMMMMMMMM MMMMMJMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 146 (iron piercer) { MBPPPPPPPPMAAAMM MMBBDPDPMMAAAAMM MMMBPPPMMAAAAMMM MMMPBPPMMAAAAMMM MMMMBPPMAAAAMMMM MMMMBBPMAAAAMMMM MMMMPBPMAAAAMMMM MMMMPBPMMMAMMMMM MMMMMBPMMMAMMMMM MMMMMBPMMMAMMMMM MMMMMBPMMMMMMMMM MMMMMBPMMMMMMMMM MMMMMBMMMMMMMMMM MMMMMPMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 147 (glass piercer) { MNBBBBBBBBPAAAMM MMNNDBDBPPAAAAMM MMMNBBBPPAAAAMMM MMMPNBBPPAAAAMMM MMMMNBBPAAAAMMMM MMMMNNBPAAAAMMMM MMMMPNBPAAAAMMMM MMMMPNBPMMAMMMMM MMMMMNBMMMAMMMMM MMMMMNBMMMAMMMMM MMMMMNBMMMMMMMMM MMMMMNBMMMMMMMMM MMMMMNMMMMMMMMMM MMMMMPMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 148 (lamb) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMONNMOMMM MMNNNMMNNNNNOMMM MNNANNNNNNOOOAMM MNNNNNNNOOOOOAMM MMNOOOOOOOAAOAMM MMMMOOOOOAAAOMMM MMMMOMAOAAAMMMMM MMMMOAMOAMMMMMMM MMMMOMMOMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 149 (rothe) { MMMMMMMMMMMMMMMM MMMMMMMMMMMKMMMM MMMMMMMMMMMMKMMM MMMMMMMMMMMMKMMM MMMMMMMJJJCKKMMM MMMMMJKCKKKCKMMM MMAAAKKKKCKKKMMM MAAAAAKCKKKKCAMM AAKCAAKKKCKAKAMM MKEKKACKKJAAKAMM MKCKKAKKAKAACMMM MMKJAAAKAAAMMMMM MMAAKAMCAMMMMMMM MMAMMAMKMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 150 (giant badger) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM AJJMMMMMMMMMMMMM AJPMMMMMMMMMMMMM MAJPPJJMMMMMMMMM MMJJJPPOOKMMMMMM AAAJJJJJJOCMMMMM MAJJJJJKKKKGMMMM MMJAAJJJCGPKMMMM MMMMAAJJAACOKMMM MMMMMMAJJAAKMMMM MMMMMMMMMMMMMMMM } # tile 151 (scramper) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMGMMMMMMMM MMMGMGMGMMGMMMMM MGMGFGFFFGMMMMMM MMGFGFFGFFGGMMMM MMFFFGGFGFFFMMMM MGGFFFFFFFDFDMMM MMFFAFGGFFFFFMMM MMFFAAAFFAAFFMMM MMMMMMAFFAAAMMMM MMMMMMMMMMAAAMMM MMMMMMMMMMMMMMMM } # tile 152 (sheep) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMOOOMOMMM MMNNNMMOONNNOMMM MNNANOONNNNNOMMM MNNNNNNNNNOOOMMM MNNNNNNNOOOOOAMM MMNOOOOOOOOAOAMM MMMOOOOOOOAAOAMM MMMMOOOOAOAAOMMM MMMMOMAOAAAMMMMM MMMMOMMOAMMMMMMM MMMMOMMOMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 153 (goat) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMOMMM MMMMMMMMMMMMOMMM MJNNJJJMONNNOMMM MNNAJOJNNNNNOMMM MNNNNOJNNNOOOMMM MNNNNJNNOOOOOAMM MMMOOOOOOOOAOAMM MMMMOOOOOOAAOAMM MMMMOOOOAOAAOMMM MMMMOMAOAAAMMMMM MMMMOMMOAMMMMMMM MMMMOMMOMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 154 (squealer) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMBPPMMMMMMM MMMPBBPPDPMMMMMM MMMBMMBPPPMMMMMM MMMPBBPMPPMMMMMM MMMMMMMMPPMMMMMM MMMMMMBBPPMMMMMM MMMMMBBBPPPMAAAM MMMMMBBPPPPAAAAM MMJJBBBPPPPPAAAM MMJJBJJPPPABAAMM MMJJAJJPPPAPBAMM MMMMAJJPPAAAAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 155 (mumak) { MMMMMMMMMMMMMMMM MMMMMMMMMMMPMMMM MPPMMMMMMMMMPMMM PPPMMMPPPPPMPMMM PPPPPPPPPMPPMMMM PPPPBPPBBPMPPMMM PPPBPPPPPPMPPMMM MPDPPDDPPMPPPMMM MMBPPDDPMPPPPAMM MMPPPPPPPPPPPAMM MMPPPPOMMPAPPAMM MOOPPOOAPPAPPAMM OOPPOOAAPPAMMMMM MPPPAPAMPPMMMMMM PPPAMMMMMMMMMMMM MAAMMMMMMMMMMMMM } # tile 156 (leocrotta) { MMMMMMMMMMMMMMMM MMAMMAMMMMMMMMMM MMAOOAMMMMJMMMMM MMAOOAAMMMMJMMMM MAPOAFAMMMMJMMMM MAPOAAAMJJJJMMMM MAOPAAJKKCKKJMMM MAOAAKKJKKKKJAMM MMMJKCKKCJAKCAMM MMMJKJKKJAAKKAMM MMJCJACKAAPAPAMM MMKKAAKKAAPAPAMM MPAPAAPAPAMMMMMM MPAPAMPAPAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 157 (cow) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMNNNOMMMM MMONNNOANNNNOMMM MMMNNJANNNNNOMMM MMMNNANNNNNNOMMM MMNNNANNNNONOAMM MMNAANNNNOONOAMM MMNNNONOOOONOAMM MMNOOANOAOANOAMM MMNOAANOAAAOOAMM MMNOAANOAAMMMMMM MMOOAAOOAAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 158 (mangler) { MMMMMMMMMMMMMMMM MMMMMMAOMAOMMMMM MMMMMMAOMAOMMMMM MMMPPPANMANMMMMM MMMPPPANMANMMMMM MPPPPPANPPNMMMMM APPAPPABPPBMMMMM APPPAADPBPPDMMMM APPPPAADBPDPMMMM AAAPPPAPBPPPPMMM ABBAPBAOPPOAPBBM ABPABBBANNAAABNP AAPFANPPOOPAAAPN MAPFAPNPAAFPAAAN APPPFANAAFFPAAOP MMMMANPMMMMMMMMM } # tile 159 (wumpus) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMBMMM MMMMMMMMMMMMMBMM MMMMMMMBBBBBMBMM MMMMBBBPPBBBBMMM MMMBOOBBBPBBBBMM MMMOOBBBBBPBBBMM MMDABBAABBPBBBAM MBOOBBDABEBBEBAA MBOBBBBBBEBEBBAA MBBBBBBBEBBABBAA MEBBBBBEABBABBAA MMEEEEEAABBAMMMM MMMMMBBAMBBMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 160 (bull) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MOMMMMOMMNNNOMMM MOMMMMOANNNNNOMM MOONNOOANNNNNOMM MMMNNDAANNNNNOMM MMMNNANNNNNONOAM MMNNNANNNNOANOAM MMNAANNNNOAANOAM MMNNNONOOAAANOAM MMNOOANOAAAAOOAM MMNOAANOAAAMMMMM MMNOAANOAAMMMMMM MMOOAAOOAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 161 (titanothere) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMPPPMPM MMMMMMMPPPPPPPAP MMMMMPPPPPPPPPMA MMPMPMPPPPPPPPMA MMPPPMPPPPPPPPPA MMPPPPMPPPPPPPPA MPPPPPMPPPPPPPMM MPPEPPMPPPPMPPAM PBPPPMPPPMAAPPAM PPPPMAAPPAAMMMMM MPPMPPAPPAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 162 (baluchitherium) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMPPPMPM MMMMMMMPPPPPPPAP MMMMMPPPPPPPPPMA MMPMPMPPPPPPPPMA MMPPPMPPPPPPPPPA MMPPPPMPPPPPPPPA BPPPPPMPPPPPPPMM BMPEPPMPPPPMPPAM PBMPPMPPPMAAPPAM PPPPMAAPPAAMMMMM MPPMPPAPPAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 163 (mastodon) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMOMMMOMMMMMMMMM MNMMPOPMPMMMMMMM NMMPNPPPPPMMMMMM OMPNPPPPPPMPPMMM OMPOPEPPPMPPPPPM MOPOPOPMMPPPPPAP MMPPOPPMPPPPPPAA MMPPAAAPPPPAPPAM MMPMMMAPPAAAPPAM MMMMMMMPPAMMMMMM MMMMMMMMMMMMMMMM } # tile 164 (Jumbo the Elephant) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMPMMMMMMMMMPMM MMPMMMMMMPPPPAPM MMPPPMPPPPPPPPMP MMPPPPMMMPPPPPMP MPPPMMPPPMPPPPMM MPPPPPPPPMPPPPMM MPPEPPPPPMPMPPAM OPPPPMPPMPAAPPAM MPPOAAMPPAAAPPMM MOOMMAAPPAAMPPMM MBPMMMAPPAMMMMMM MMPPMMMPPMMMMMMM } # tile 165 (juggernaut) { MMMMMMMMMMMMMMMM MMMMMMPMMMMMMMMM MMMMMMPPMMMMMMMM MMMMMPPPPPAMMMMM MMMPPEPPPPOAMMMM MBPPPPPBPPAOAMMM MBBPPBBMPPOAPAMM MMMMMBMPPPAOAMMM MMMMMBPPPPOAPAMM MMMMBBPPPPAOAMMM MMMBBPPPPPPAPAMM MJJJJJJJJJJJJJJA MJJKJAJJJJAJKJJA MACPKAAAAAACPKAA MMJKKAMMMMAJKKAA MMMMMMMMMMMMMMMM } # tile 166 (catoblepas) { MMMMMMMMMMMMMMMM MMMAMBBBMMMMMMMM MMAMBMMPBMMMMMMM MMABAAAABPMMMMMM MAABMAAAMMBBBMMM ABABMBAAPPBMPPMM ABBMBBAPPBPPMPBM ADKBKDAPPBPPMPBM AJDBDJAMPPPPMPBM MAPPPAAMAPPPMBMM MMAPAAAMAABMABMM MMMAMMAMAABMABMM MMMMMMAAAABMABMM MMMMMMMMMABMABMM MMMMMMMMMAAMAAMM MMMMMMMMMMMMMMMM } # tile 167 (sewer rat) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMKMMKMJKKKKMMMM MMKKCKJKCJKCKMMM MMJAKAKJJKKKKJMM MMGKGCJKAKCAKKAM MCKJJJJKAKAACKAM MPJJAAKCAJAJKAMM MMAAMKKAMMKKAMMM MMMMMMMMMJJAMMMM MMMMMMMMMMMMMMMM } # tile 168 (rabbit) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMNMMNMMMMMMMMM MMMNANAMMMMMMMMM MMMONAMMMMMMMMMM MMMANANNNMOMMMMM MMMNNNNNNNAMMMMM MMNDNONNNOMMMMMM MMAOOAOOAOAAAMMM MMMMAOAAOAAAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 169 (black rat) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMAMMAMMAAAAMMMM MMAAAAAAAAAAAAMM MMAAAAAAAAAAAAMM MMGAGAAAAAAAAAAM MMAAAAAAAAAAAAAM MAAAAAAAAAAAAAAM MPAAAAMMAMMAMMAM MMAAMAMAAMAAMMAM MMMMMMMMMMMMMAMM MMMMMMMMMMMMMMMM } # tile 170 (giant rat) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMKMMKMJKKKCKMMM MMKKCKJKCKJKKKMM MMJAKAKKKJJKCKJM MMGAGAKJKJKKKCKM MMAKAKKCKAKKAKKA MKCJJJJKAJCAACKA MPJJAAKCAJJAJKAM MMAAMKKAAMMJKAMM MMMMMMMMMMJJAMMM MMMMMMMMMMMMMMMM } # tile 171 (rabid rat) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMKMMKMJKKKKKMMM MMKKCKJKCKJCKKMM MMJAKAKKKJJKKCJM MMGAGAKJKJKKKKKM MMAKAKKCKAKCAKCA MKCJOOOKAJKAAKKA MPJOOAKCAJJAJKAM MMAOOOKAAMMKKAMM MOOOOOOOOMJJAMMM MMMMMMMMMMMMMMMM } # tile 172 (rabid rabbit) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMOMMOMMMMMMMMM MMMOAOAMMMMMMMMM MMMOOAMMMMMMMMMM MMMAOAOOOMLMMMMM MMMLLOOOOOAMMMMM MMLDLOOOOOMMMMMM MMALLAOOAOAAAMMM MMMMALAALAAAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 173 (pack rat) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMCCDDMMMMM MMMMMMCCCCDDMMMM MMKMMKCJKCCDKMMM MMKCKKJCKKCDCKMM MMJJJJKJKKCDKKKM MMFJFJJJKCDKCKKM MMJJJJJCKAKKAKCA MKKJJJJKAJCAAKKA MPKJAAKCAJJAJKAM MMAAMKKAAMMJCAMM MMMMMMMMMMJJAMMM MMMMMMMMMMMMMMMM } # tile 174 (wererat) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMKMMKMJKKKCKMMM MMKKCKKKCKJKKKMM MMLLLLKJKJJCKCJM MMFLFLLKKJJKKKKM MMLLLLJKCAKCAKCA MKKJJJJKAJKAAKKA MPJJAAKCAJJAJKAM MMAAMKKAAMMKKAMM MMMMMMMMMMJJAMMM MMMMMMMMMMMMMMMM } # tile 175 (rock mole) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMAAAAAMMMM MMMAAAAAAAAAAMMM MMAAAAAAAAAAAAMM MMJAJAAAAAAAAAAM MAAAAAAAAAAAAAAM ANMNAAAAAAAAAAAM AMMMAAAAMMMAAAMM ANMNAAMAAMMMAAMM MAAAAMMMMMMMMMMM } # tile 176 (woodchuck) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMKJAMMMMMM MMMMMMNCKNAMMMMM MMMMMMKNOJAMMMMM MMMMMMKNOJAMMMMM MMMMMKCKKKJAMMMM MMMMJJKLLJJJAAMM MMMMMMKLLJAAAAAM MMMMMMCJJJAAAAMM MMMMMJJAAJJAAMMM MMMMMMMMMMMMMMMM } # tile 177 (hellrat) { MMMMMMMMMMMMMMMM MMMMAMMMMMMAMMMM MMMMMAMMMMAMMMMM MMMAAAAMMAAAAMMM MMMMAAAMMAAAMMMM MMJAAAJMMAAAAMMM MMKAMKAMAAMMMMMM MMCKCKJJJKJKKMMM MMJAKACJKKJCKKKM MMGAGAKJKJJKCKKM MMAKAKKKCAKKAKCA MKKJJJJKAJCAAKKA MNKJNAKCAJJAMKAM MOAAOKKAAMMMMJAM MMMMMMMMMMMMJAMM MMMMMMMMMMMMMMMM } # tile 178 (the Rat King) { MMMMMMMMMMMMMMMM MMMHMHMHMMMMMMMM MMMMHHHMMMMMMMMM MMMKHHHMKMMMMMMM MMMMKKKCKMMMMMMM MMMMKAKAKMMMMMMM MMMMGKGKKFMMMMMM MMPKKJJJJFFMMMJA MMMJJJAAFFFMMJAM MMMMGAAGGFFFMKAM MMKJAIIJKGFFMKAM MCKAAAAAJKGFCJAM MAAMMAAAAJGFFJAM MMMMMJAAJAGGFAMM MMMMKJAKJAGGFAMM MMKCJACKAAAGGFFA } # tile 179 (cave spider) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMPAMMMMMM MMMMMMMPAMMMMMMM MMMMMMPAPBBAMMMM MMMPAMAPBPPPAMMM MMMABBPPAPPAAMPA MMMGPPPPAAAPPPAA MMMPPGPAAPPAAAAM MMDMPAPAPAAPPAMM MMMMDMPAAPAMAPAM MMMMMPAAMAPAMMMM MMMMMMMMMMMMMMMM } # tile 180 (centipede) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMPBPPMMMMMM MMMMBBPAAAMMMMMM MMPPBAAAMMMMMMMM MPAPBBBPPPPMMMMM MMPAAPPBBBAMMMMM MMMMPAAPAPBPPMMM MMMMMMAABBPPMMMM MMMMMMBBMPPAPMMM MMMMPBBPPAPMAMMM MMMGPPPAPMAPMMMM MMMPPGPAAPMMMMMM MMBMPAAMMMMMMMMM MMMBMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 181 (recluse spider) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMKAMMMMMM MMMMMMMKAMMMMMMM MMMMMMCACLLAMMMM MMMKAMAKLCCKAMMM MMMALLCKACKAAMKA MMMGCCCKAAAKCKAA MMMCCGCAAKKAAAAM MMDMCAKAKAAKKAMM MMMMDMKAACAMAKAM MMMMMKAAMAKAMMMM MMMMMMMMMMMMMMMM } # tile 182 (giant spider) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMKJJAMMMMMM MMMMMKKJAAKKKAMM MMKCAKJACKKJJAAA MMKJAAAKJJJJAKKA MGJJCKAJAJJACJJA MKJJGJAJAAAKJJAA MKJJJJAAACKJAAAA DJJAJAKKKAAAKKKA MAAADACJAKCAAKJA MMKJAAKJAAJKAAAM MMMKJAKJAAJJAAMM } # tile 183 (barking spider) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMPAMMMMMM MMMMMMMFAMMMMMMM MMMMMMFAFGGAMMMM MMMFAMAPGFFPAMMM MMMAGGFPAPPAAMPA MMMCFFFPAAAFFFAA MMMFFCPAAFFAAAAM MMOMFAPAFAAFPAMM MMMMOMPAAFAMAPAM MMMMMPAAMAPAMMMM MMMMMMMMMMMMMMMM } # tile 184 (scorpion) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMJKJKJAAMM MMMMMMJAMKKJKKAM MMMMMMMKAMMMKJJA MMMMMMJAMMMMCKJA MMMMMMMMMMMJJJKA MMMMMMMAJKKAJJAM MMMMMAAJCJJJAAMM MMMACKJJAJJAAMMM MMMGJJJJAAAJJJAM MMMJJGJAAJJAAAJM MMDMJAJAJAAJJAMM MMMMDMJAAJAMJAAM MMMMMMMJAAJAMMMM MMMMMMMMMMMMMMMM } # tile 185 (carrion crawler) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMPBPPMMMMMM MMMMBBPAAAMMMMMM MMPPOAAAMMMMMMMM MPAPBBBPPPPPMMMM PAPAAOPBBBAAMMMM MPAAPAPPAPPPPPMM MMMPMAMMBBOPAAMM MMAAPBBPMPPAPAMM MMMDBBBPMPPAAPMM MMPDPPDBAPAPAMMM MMMPPDBBPAAAPMMM MMHMPPPAAMMAMMMM MMMHAHAMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 186 (nickelpede) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMCMMMMMMMM MMMMMKCAMMMMMMMM MMMMKCAMMMMMMMMM MMMMACCCMMMMMMMM MMMMMKKCCLAKMMMM MMMMJAAJACLMMMMM MMMMMMMMCCKAMMMM MMMJAACCCKAKMMMM MMMMDDAKACMAMMMM MMMGDDDAKAMMMMMM MMMDDGJJAMMMMMMM MMBMJAAMMMMMMMMM MMMBAMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 187 (giant scorpion) { MMMMMMMJJJJMMMMM MMMMMJJJAKKJAMMM MMMMJJAMMMAJJJMM MMMMDJAMMMMMKKAM MMMMMDJAMMMMAKJA MMMMCAMMMMMJKKJA MMMMMMMMMAJJJJKA MMMMMMKJJKCAJJAM MMMMJJACKJJJAAMM MMJJCKJKAJJAAMMM MMHHJJJJAAAJJJAM MMLLLHJAAJJAAAJM MMDJLHJAJAAJJAJM MDAAJJJAAJAMJAAJ MAMDAAAJAAJAMJMM MMMAMMMMJMMJAMMM } # tile 188 (Girtab) { MMAAMMMMMMMAAMMM MAMMMAAAAAMMMAMM AMMAAAAAAEAAMMAM AMAAAAAAAAAEAMAM AMAAAAAAAAAEAMAM AMAAAAAAAAAEAMAM MAMAAAAAAAEAMAMM MMAAAAAAAAAAAMMM MMAMAAAAAAAMAMMM MAMMAADADAAMMAMM AMMAMAAAAAMAMMAM AMAMAADADAAMAMAM AMAMAMNANMAMAMAM AMAMAMOMOMAMAMAM MMAMAMMMMMAMAMMM MMAMMAMMMAMMAMMM } # tile 189 (Shelob) { MMEEAMMMMMAEEAMM MEAAMPOPOPMMAEAM EAMMOOOOOOOMMAEA EAMOONNONNOOMMEA EAMONNNONNNOMMEA EAMONNNONNNOMMEA MEAMONNONNOMMEAM MMEAAOOOOOAAEAMM MMEAANNNNOAAEAMM MEAMONDNDNOAMEAM EAMEANNNNNAEAMEA EAEAENDNDNEAEAEA EAEAEALNLAEAEAEA EAEAEALALAEAEAEA MMEAEAIMIAEAEAMM MMEAMEAMAEAAEAMM } # tile 190 (phase spider) { MMMMMMMMMMMMMMMM MMMMMMMMPMMMMMMM MMPMMMPPMPMMMMMM MMEPPPMMMMMMMMMM MMGMMMMPMPMMMMMM MMPMMMPMMMPMMMMM MKMPPPMMMMMMMMPM MMGMMMMAPBBAMPMM MMMMEMAPBPPPAMMM MKPEBBPPAPPAAMPA MMMGPPPPAAAPPPAA MMMPPGPAAPPAAAAM MMDMPAPAPAAPPAMM MMMMDMPAAPAMAPAM MMMMMPAAMAPAMMMM MMMMMMMMMMMMMMMM } # tile 191 (werespider) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMLAMMMMMM MMMMMMMLAMMMMMMM MMMMMMLAJKKAMMMM MMMLAMAJKKJJAMMM MMMACKJJAJJAAMLA MMMHJJJJAAALLLAA MMMCCHJAALLAAAAM MMNCCCLALAALLAMM MMMNMMLAALAMALAM MMMMMLAAMALAMMMM MMMMMMMMMMMMMMMM } # tile 192 (lurker above) { MAAAAAAAAAAAAAAA MMMAAGFAAGFAAAMM MMMAAAAAAAAAAAMM MMMMAODODODOAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 193 (trapper) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMAODODODOAMMM MMMAAAAAAAAAAAMM MMMAAGFAAGFAAAMM MAAAAAAAAAAAAAAA } # tile 194 (white unicorn) { MMMMMMMMMMMMMMMM MMHPMMMMMMMMMMMM MMPHOMNNMMMMMMMM MMMPHNNBMMMMMMMM MMMONENBMMMMMMMM MMONNNNBMMMMMMMM MMNOANNBAAMMMMMM MMMAONNBAMMMMMMM MMMONNNONNNMMMMM MMNONNNNONNOAAAM MMNMONONNONAOAMM MMOAANAAAAOAAMMM MMMLAOAAOAOAMMMM MMMMMOAALAOMMMMM MMMMMLAMMMLMMMMM MMMMMMMMMMMMMMMM } # tile 195 (gray unicorn) { MMMMMMMMMMMMMMMM MMHPMMMMMMMMMMMM MMPHOMPPMMMMMMMM MMMPHPPNMMMMMMMM MMMMPGPNMMMMMMMM MMMPPPPNMMMMMMMM MMPPAPPNAAMMMMMM MMMAPPPNAMMMMMMM MMMMPPPMPPPMMMMM MMPMPPPPMPPMAAAM MMPMMPMPPMPAMAMM MMPAAPAAAAMAAMMM MMMLAMAAMAMAMMMM MMMMMMAALAMMMMMM MMMMMLAMMMLMMMMM MMMMMMMMMMMMMMMM } # tile 196 (black unicorn) { MMMMMMMMMMMMMMMM MMHPMMMMMMMMMMMM MMPHOMAAMMMMMMMM MMMPHAAJMMMMMMMM MMMAADAJMMMMMMMM MMAAAAAJMMMMMMMM MMAAPAAJPPMMMMMM MMMPAAAJPMMMMMMM MMMAAAAAAAAMMMMM MMAAAAAAAAAAPPPM MMAMAAAAAAAPAPMM MMAPPAPPAPAPPMMM MMMLPAPPAPAPMMMM MMMMMAPPLPAMMMMM MMMMMLPMMMLMMMMM MMMMMMMMMMMMMMMM } # tile 197 (pony) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMJJMMMMMMMMM MMMMCKKJMMMMMMMM MMMKKECJMMMMMMMM MMCKJKKJMMMMMMMM MMJJAKCJAAMMMMMM MMMAKKKJAMMMMMMM MMMKCKKKKKJMMMMM MMMKKKCKCKJJAAAM MMMKKKJJJJJAJAMM MMMJAJAAAAJAAMMM MMMJAJAAJAJAMMMM MMMLMJAALAJMMMMM MMMMMLAMMMLMMMMM MMMMMMMMMMMMMMMM } # tile 198 (horse) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMJJMMMMMMMMM MMMMKKKJMMMMMMMM MMKKCEKKMMMMMMMM MCKKJCKJAAMMMMMM MJJJAKKJAAMMMMMM MMMAKCKJAMMMMMMM MMMKKKKCKKKJAMMM MMCKCKKKCKCKJAMM MMKJJKKJJJJKAJAM MMJAAJAAAAAJAJAM MMJAAJAAAJAJAAMM MMLAMJAAMLMJAMMM MMMMMLAMMMMLMMMM MMMMMMMMMMMMMMMM } # tile 199 (warhorse) { MMMMMMMMMMMMMMMM MMMMMJJJMMMMMMMM MMMKKKKJJMMMMMMM MKCKCEKJJMMMMMMM KKKKKKCJJAAMMMMM JCKCKKKJJAAMMMMM MJJJAKKKJAAMMMMM MMMAKCKJJAMMMMMM MMMKKKKCKKKKJAMM MMCKCKKKCKCKKJAM MMKKJKCJKKJKCJJA MMKJAKJAKJAKJAJA MMCJAKKAKKAKJAMM MMLCMKJALCMKJMMM MMMMMLCMMMMLCMMM MMMMMMMMMMMMMMMM } # tile 200 (Pegasus) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMLLMMMMOOLMM MMMMOOOLMMOOOOLM MMOOOEOLMOOOOLMM MOOOLOOLAOOLLMMM MLLLAOOLAOOLMMMM MMMAOOOLOOLAMMMM MMMOOOOOOOOLAMMM MMOOOOOOOOOOLAMM MMOLLOLLLLLOALLM MMLAALAAAAALAMMM MLAALAMMMLAALAMM CAMLAMMMMMCAMLAM MMCAMMMMMMMMMMCA MMMMMMMMMMMMMMMM } # tile 201 (fog cloud) { MMMMMMMPMMMMMMMM MMMMPMMPMMMMMMMM MMMMMPMPMMMPMMMM MMMPMMMMMMMPMMMM MMPMMPMPMPMMMMMM MMMMPPMPPMPMPMMM MPMMAPAPPPMMPMMM MMMPMPPPPMPPMMMM MMMMMMPPPPPMPMPM MMMPMPPPPPMMPMMM MMMMPMMPMPPMPMMM MPMMMPMPMMMPPPMM MMPMPMMMMPPMMMMM MMMMMMMPMMMMPMMM MMPMMPMPMMPMMMMM MMMMMMMMMMMMMMMM } # tile 202 (dust vortex) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMKMMKKCKMMMMM MMMCMMCKJJJKMMMM MMKMMKJJJJMMKMMM MKJMKJJMJKCMMKMM MKKJKKMJJJJKMMMM MKJJJJMMMMJJCMMM MCKJMJMMMJMJKKMM MMKJJMMMMJJJKKMM MMMKJJJJMJKJJKMM MCMMCKJMJJKMKKMM MMKMMJJJJKMMCMMM MMMKJJJKCMMKMMMM MMMMKKCKMMKMMMMM MMMMMMMMMMMMMMMM } # tile 203 (ice vortex) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMNMMNNNNMMMMM MMMNMMNNOOONMMMM MMNMMNOOOOMMNMMM MNOMNOOMONNMMNMM MNOONOMOOOONMMMM MNOOOOMMMMOONMMM MNNOMOMMMOMONNMM MMNOOMMMMOOOONMM MMMNOOOOMONOONMM MNMMNNOMOONMONMM MMNMMOOOONMMNMMM MMMNOOONNMMNMMMM MMMMNNNNMMNMMMMM MMMMMMMMMMMMMMMM } # tile 204 (energy vortex) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMEMMEEEEMMMMM MMMEMMEEAAAEMMMM MMEMMEAAAAMMEMMM MEAMEAAAAIEMMEMM MEAAIAAAAAAEMMMM MEAAAAAAAAAAEMMM MEEAAAAAAAAAEEMM MMEAAAAAAAAAAEMM MMMEAAAAAAIAAEMM MEMMEIAAAAEMAEMM MMEMMAAAAEMMEMMM MMMEAAAEEMMEMMMM MMMMEEEEMMEMMMMM MMMMMMMMMMMMMMMM } # tile 205 (steam vortex) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMPMMPPPPMMMMM MMMPMMPPBBBPMMMM MMPMMPBBBBMMPMMM MPBMPBBPBPPMMPMM MPBBPBPBBBBPMMMM MPBBBBPMPPBBPMMM MPPBPBMMMBPBPPMM MMPBBPPMPBBBBPMM MMMPBBBBPBPBBPMM MPMMPPBPBBPMBPMM MMPMMBBBBPMMPMMM MMMPBBBPPMMPMMMM MMMMPPPPMMPMMMMM MMMMMMMMMMMMMMMM } # tile 206 (fire vortex) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMDMMDDDDMMMMM MMMDMMDDCCCDMMMM MMDMMDCCCCMMDMMM MDCMDCCHCDDMMDMM MDCCDCHCCCCDMMMM MDCCCCHHHHCCDMMM MDDCHCHHHCHCDDMM MMDCCHHHHCCCCDMM MMMDCCCCHCDCCDMM MDMMDDCHCCDMCDMM MMDMMCCCCDMMDMMM MMMDCCCDDMMDMMMM MMMMDDDDMMDMMMMM MMMMMMMMMMMMMMMM } # tile 207 (larva) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMOMMMMMMMMM MMMMPOOMMMMMMMMM MMMMPOMMMMMMMMMM MMAPONMMOONNMMMM MAAPONNOOOOONMMM MAAPPOOOPPPPONMM MAAAPPPPAAAPPOMM MMAAAAAAAMMAPOMM MMMAAAAMMMMPOMMM MMMMMMMMMMAAAMMM MMMMMMMMMMMMMMMM } # tile 208 (maggot) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMNNAMMNNAMMM MMMMNAMMMNAMNAMM MMNANAMMNAMMMMMM MMMNNANNNNAMMMMM MMMNANAMNANNAMMM MMNAMNANNAMMMNAM MMMMNANAMNAMNAMM MMNAMNANAMNNAMMM MMMNNAMMNAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 209 (dung worm) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMJJAMMJJAMMM MMMMJAMMMJAMJAMM MMJAJAMMJAMMMMMM MMMJJAJJJJAMMMMM MMMJAJAMJAJJAMMM MMJAMJAJJAMMMJAM MMMMJAJAMJAMJAMM MMJAMJAJAMJJAMMM MMMJJAMMJAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 210 (acid worm) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMGGAMMGGAMMM MMMMGAMMMGAMGAMM MMGAGAMMGAMMMMMM MMMGGAGGGGAMMMMM MMMGAGAMGAGGAMMM MMGAMGAGGAMMMGAM MMMMGAGAMGAMGAMM MMGAMGAGAMGGAMMM MMMGGAMMGAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 211 (bloodworm) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMDDAMMDDAMMM MMMMDAMMMDAMDAMM MMDADAMMDAMMMMMM MMMDDADDDDAMMMMM MMMDADAMDADDAMMM MMDAMDADDAMMMDAM MMMMDADAMDAMDAMM MMDAMDADAMDDAMMM MMMDDAMMDAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 212 (tunnel worm) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMPPAMMPPAMMM MMMMPAMMMPAMPAMM MMPAPAMMPAMMMMMM MMMPPAPPPPAMMMMM MMMPAPAMPAPPAMMM MMPAMPAPPAMMMPAM MMMMPAPAMPAMPAMM MMPAMPAPAMPPAMMM MMMPPAMMPAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 213 (baby long worm) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMCLCMMMMMMM MMMMMMLLLMMMMMMM MMMMMGGAGGMAMMMM MMMMMGGAGGAAAMMM MMMMMMLLLAAAMCMM MMMMMMLLLAAMCCMM MMMMMMCLLCCCCAMM MMMMMMMLLLCCAMMM MMMMMMMMCLLMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 214 (baby purple worm) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMIMMMMMMMM MMMMMMIIIMMMMMMM MMMMMMIIIMMMMMMM MMMMMGGAGGMAMMMM MMMMMGGAGGAAAMMM MMMMMMIIIAAAMDMM MMMMMMIIIAAMDDMM MMMMMMIIIDDDDAMM MMMMMMMIIIDDAMMM MMMMMMMMIIIMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 215 (long worm) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMCLCMMMMMMMM MMMMCLLLCMMMMMMM MMMMLLLLLMMMMMMM MMMGGGLGGGAAMMMM MMMGAGLGAGAAAMMM MMMGGGLGGGAAAMMM MMMMLLLLLAAACCMM MMMMLLLLLAACCCMM MMMMCLLLLCCCCAMM MMMMMLLLLLCCAMMM MMMMMMCLLLLMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 216 (purple worm) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMDIDMMMMMMMM MMMMDIIIDMMMMMMM MMMMIIIIIMMMMMMM MMMGGGIGGGAAMMMM MMMGAGIGAGAAAMMM MMMGGGIGGGAAAMMM MMMMIIIIIAAADDMM MMMMIIIIIAADDDMM MMMMDIIIIDDDDAMM MMMMMIIIIIDDAMMM MMMMMMDIIIIMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 217 (rot worm) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMOOAMMOOAMMM MMMMOAMMMOAMOAMM MMOAOAMMOAMMMMMM MMMOOAOOOOAMMMMM MMMOAOAMOAOOAMMM MMOAMOAOOAMMMOAM MMMMOAOAMOAMOAMM MMOAMOAOAMOOAMMM MMMOOAMMOAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 218 (grid bug) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMDMMMMNHCNMMDMM MDMDMMNHDNCNDEDM DMDMDMNNHCNDMDED MDMMMDMNNHDNDMMM MDDDMMENNGMDMDEM MMDDDDEEEEGDMMDE DMMMMMDEHEEMDMMM MDMMMMMMMHMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 219 (spark bug) { MMMMMMMMMMMMMMMM MMMMMMMMEMMMMMMM MMMMMMMEPEIIMMMM MMMMMEBBNBBBEMMM MMMEPPBNNNBBPPEM MMMMMEBBNBBBEMMM MMMIIMMBBBMMAAAM MMMMMIOEPEMAAAAM MMMMIOIIPMIAAAAM NNNIOIIMEAAAAAMM NANIIIIMAIAAMMMM NNNIINNNAAAMAMMM MMIIINANAAMAMAMM MIIIANNNAAMMAMMM MMIMMAAAAAAMMMMM MMMMMMAAMAMMMMMM } # tile 220 (arc bug) { MMMMMEPEMMMMMMMM MMMPBNNNBEMMMMMM MMBNNBBBNNDDMMMM MENBBPEPBBNDDMMM MPNBPEMEPDDDDMMM MBNBEDDMMDDDMMMM ENBEDMMDDMMMAAAM PNBPMDODDDMAAAAM ENBMDODDMMDAAAAM NNNDODDMDAAAAAMM NANDDDDMADAAMMMM NNNDDNNNAAAMAMMM MMDDDNANAAMAMAMM MDDDANNNAAMMAMMM MMDMMAAAAAAMMMMM MMMMMMAAMAMMMMMM } # tile 221 (lightning bug) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMFHMMMM MMMMMMMMMFHFFMMM MMMMMMMMMHHFFMMM MMMMMFFMMHFFMMMM MMMFFMMFHMMMAAAM MMMMMFHHHFMAAAAM MMMMFHHFMMFAAAAM OOOFHFFMFAAAAAMM OAOFFFFMAFAAMMMM OOOFFOOOAAAMAMMM MMFFFOAOAAMAMAMM MFFFAOOOAAMMAMMM MMFMMAAAAAAMMMMM MMMMMMAAMAMMMMMM } # tile 222 (xan) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMGGMMMM MMMHHHMMMGOGGMMM MMMMMHHMMGGGGMMM MMMHHHHHMGGGMMMM MMMMMMMGGMMMAAAM MMMMMGOGGHHAAAAM MMMMGOGGMMHHAAAM NNNGOGGMAAHHHAMM NANGGGGMAAHAHMMM NNNGGNNNAAAAAAMM MMGGGNANAAMAAAMM MGGGANNNAAMAMAMM MMGMMAAAAAAMMMMM MMMMMMAAMAAMMMMM } # tile 223 (yellow light) { MMMMMMMMMMMMMMMM MMMMMMNAMMMMMMMM MMMMMMHAMMMMMMMM MMNAMNHNAMNAMMMM MMMLALHLALAMMMMM MMMMNHHHNAMMMMMM MMNLHHHHHLNAMMMM NHHHHHHHHHHHNAMM MMNLHHHHHLNAMMMM MMMMNHHHNAMMMMMM MMMLALHLALAMMMMM MMNAMNNNAMNAMMMM MMMMMMHAMMMMMMMM MMMMMMNAMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 224 (black light) { MMMMMMMMMMMMMMMM MMMMMMAAMMMMMMMM MMMMMMAAMMMMMMMM MMAAMAAAAMAAMMMM MMMAAAAAAAAMMMMM MMMMAAAAAAMMMMMM MMAAAAAAAAAAMMMM AAAAAAAAAAAAAAMM MMAAAAAAAAAAMMMM MMMMAAAAAAMMMMMM MMMAAAAAAAAMMMMM MMAAMAAAAMAAMMMM MMMMMMAAMMMMMMMM MMMMMMAAMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 225 (zruty) { MMMMMMMMMMMMMMMM MMMMMMFFGFMMMMMM MMMMOOFGFFFFMMMM MMMAOFGFOOKFFMMM MMMFFGFAOAJKKFMM MMFFFFFFJAAJKKMM MMODOFFJAJJKKJAM MMDDDDJAJJKJJAAM MMJODOAJJJAJJAAA MKKJAJJJKJAJJAAA MKKAAJKKKKJAAAAA MMMAJJKKKKJJAAAA MMMKJJAAAAKJAAAM MMJKJJJAAJJJJMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 226 (echidna) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMKAKAKAMMMMM MMMMKACAKAKAMMMM MMMCAKACKCKAMMMM MMKAKAKKKKAMMMMM MMKAKAKKJKKAMMMM MMMCACJJJJJKAMMM MMMKKJJJJJDJDMMM MMMKJJJKJJJJKAAM MMMKJJJJJJJJJAAM MMKKJJJJJJACJAMM MMMMKJAAKJAAKKAM MMMMCJKACJKAMMMM MMMMMMMMMMMMMMMM } # tile 227 (platypus) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMOPAMMMFFAMMMMM MMOPAMMMFLFCCAMM MMPOPAMMFFFCAAMM MMMPOKKKCFAAAAMM MMMMKCKKKKJAAAMM MMMMJJJKKKJAAMMM MMMMJAAAJAJAMMMM MMMMCCAACCACMMMM MMMMMMMMMMMMMMMM } # tile 228 (koala) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMKKJAMKKJAMMM MMMJKCKKKCKKJAMM MMMMJJIKKIJJAMMM MMMMMMKAAJAMMMMM MMMMMMJAAJAMMMMM MMMMMMMCJAAAAAMM MMMMJKKLLKKJAAMM MMMMMJJLLJKAAAMM MMMMMMMJJAAAAMMM MMMMMJJAMJJAMMMM MMMMMMMMMMMMMMMM } # tile 229 (wombat) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMKKKAMMMM MMMMMKKKKJKKAMMM MMMMKKJCJKJJCAMM MMMMKJJKJJJOJAMM MMMCJJJJKJJJJAAM MMKAKJJJJJAAJDAM MMMMKCAAMKKAAMMM MMMMMMMMMMMMMMMM } # tile 230 (Tasmanian devil) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMNKKNAMMMMM MMMMMKJJKJKAMMMM MMMMMKAOAOJAMMMM MMMMCJAAAAJKAMMM MMMKJJADDAJKKAMM MMMKJKAAAAJJJAMM MMMLAKAOAOJALAAM MMMMMCLLLLJAAAAM MMMMMKJLLJJAAAMM MMMMMKJJJJJAAMMM MMMMMMKAAKAAMMMM MMMMMCJAMCKAMMMM MMMMMMMMMMMMMMMM } # tile 231 (wallaby) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMCACAMMMMMM MMMMMMCACAMMMMMM MMMMMMCHCHAMMMMM MMMMMMCCCCDAMMMM MMMMMMCCKKKAMMMM MMMMMMCCCCAMMMMM MMMMMCCCCCAMMMMM MMMMCCCJCJCAMMMM MMMMCCCCJCJAAAAA MMMCCCCCCKAAAAAA MMMCCKCCCKKCAAAM MMMCKAKCCAAAAAMM MMKCAAAKKKKAAMMM MMMMMMMMMMMMMMMM } # tile 232 (wallaroo) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMKAKAMMMMMM MMMMMMKAKAMMMMMM MMMMMMCLKLAMMMMM MMMMMMKCKKDAMMMM MMMMMMKJJJJAMMMM MMMMMMKKKJAMMMMM MMMMMKCJKKAMMMMM MMMMKKKCJKJAMMMM MMMMCKJKJKJAAAAA MMMKKCKJCJAAAAAA MMMKKJKKJJJJAAAM MMMKJAKKJAAAAAMM MMJKAAAJJJJAAMMM MMMMMMMMMMMMMMMM } # tile 233 (kangaroo) { MMMMMMMMMMMMMMMM MMMMMMKAKAMMMMMM MMMMMMKCJAMMMMMM MMMMMMKLJLAMMMMM MMMMMMKJJJDAMMMM MMMMMMKJJJJAMMMM MMMMMMKKJAMMMMMM MMMMMKJCACAMMMMM MMMMMCJCHCHAMMMM MMMMKJJCCCDAMMMM MMMMKJKCCAAAAAAA MMMKKKJAAJKAAAAA MMMCJJJJJJJKKAAM MMMKJAKJKAAAAAMM MMKJAAACJKCAAMMM MMMMMMMMMMMMMMMM } # tile 234 (couatl) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMIMMMMIMM MMMMKKAIIIMMIIIM MMMNAOJAKIMIIIII MMMKKJAJJKKKMMII MMMCKAAIJKJJJMMI MMMFAAMIMMMKJMMI MMFAFAMMAAACJAAM MMMMMMMAAAJJAAAM MMMMMMAKCJJAAAMM MMMMMMKJAAAAAJAM MMMMMJJAAMMMJAMM MMMMMMJJJJJJAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 235 (Aleax) { MMMMMBOOOOPMMMMM MMMMBONNNNOPMMMM MMMBONNAANNOPMMM MMMBONAAAANOBMMM MMMBONAAAANOBMMM MMMBONAAAANOBMMM MMMBONAAAANOBMMM MMBONNAAAANNOBMM MBONNAAAAAANNOBM MBONAAAAAAAANOBM MBONANAAAANANOBM MBONNNAAAANNNOBM MMBONAAAAANNOBMM MMBONAAAAAANNOBM MBONAAAAAAAANOBM MBONNNNNNNNNNOBM } # tile 236 (movanic deva) { MMMMMMMMMMMMMMMM MMMMMMBBBBMMIMMM MMIMMBFMMMBMMMMM MMMMBFMHHAMBMMMM MMMBFMHHHHAMBMIM MMMBFMLFLFAMFBMM MIMBFMLLLLAMFBMM MMMBFMALLAMFBMMM MMBFMLLAALLMABAM MBFMLLLLLLLLAFBM MBFMLALLLLALAFBM MBFMLAJJKJALAFBM MMBFMMLJJLAAABAM MMMBFMLLALAABAMM MMBFMLLAALLAFBMM MMMMMMMMMMMMMMMM } # tile 237 (monadic deva) { MMMMMMMMMMMMMMMM MMMMMMBBBBMMIMMM MMIMMBFMMMBMMMMM MMMMBFMNNAMBMMMM MMMBFMNNNNAMBMIM MMMBFMJFJFAMFBMM MIMBFMJJJJAMFBMM MMMBFMAJJAMFBMMM MMBFMJJAAJJMABAM MBFMJJJJJJJJAFBM MBFMJAJJJJAJAFBM MBFMJAPPBPAJAFBM MMBFMMJPPJAAABAM MMMBFMJJAJAABAMM MMBFMJJAAJJAFBMM MMMMMMMMMMMMMMMM } # tile 238 (astral deva) { MMMMMMMMMMMMMMMM MMMMMMBBBBMMIMMM MMIMMBFMMMBMMMMM MMMMBFMAAPMBMMMM MMMBFMAAAAPMBMIM MMMBFMHCHCPMFBMM MIMBFMHHHHPMFBMM MMMBFMAHHAMFBMMM MMBFMHHAAHHMPBAM MBFMHHHHHHHHPFBM MBFMHPHHHHPHPFBM MBFMHPJJKJPHPFBM MMBFMMHJJHPPPBAM MMMBFMHHPHPPBAMM MMBFMHHPPHHPFBMM MMMMMMMMMMMMMMMM } # tile 239 (Angel) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMHHHHMMMMMM MMMMMMMMMMMMMMMM MMMMMMMCCMMMMMMM MMMMMMCLLCMMAAMM MMMMMMPLLPMMMMAM MMMMMMNPPPAMAMMM MMMMMBBLLPPAAAMM MMMMMNNLLPPAAAMM MMMMMMBNNPAAAAMM MMMMMMBNNPAAAAMM MMMMMBNNNPAAMAMM MMMMMBNNNNPAMMMM MMMMBNNNNNNPMMMM MMMMMMMMMMMMMMMM } # tile 240 (ki-rin) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMLPMMMMMMMMMMMM MMPLOMCMCMMMMMMM MMMPLCCDMMMMMMMM MMMKCIKDMMMMMMMM MMKCCCCDMMMMMMMM MMCKACCDAMMMMMMM MMMACCCCCCMMMAMM MMMKCCCKCCKAAMMM MMCAKCKCKCAKAMMM MMCAACAKACAMMMMM MMMLMKALAKMMMMMM MMMMMLAMMLMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 241 (Archon) { MMMMMMMMMMMMMMMM MMMMMMOOOOMMMMMM MMMMMOOOOOOMMMMM MMMMMOJLLJOMMMMM MMMMMOLLLLOMMMMM MMMMOOJLLJOOMMMM MMMMMMAJJAMMMMMM MMMMMAAAAAAAMMMM MMMMAAAAAAAAAMMM MMMOAAOAAAJLJMMM MMOOAOAAAACJCMMM MMMMLAAAACCJCCMM MMMMMAAAAAJJJMMM MMMMAAAAAAAAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 242 (Planetar) { MMMMMMMMMMMMMMMM MMMMMMBBBBMMIMMM MMIMMBFMMMBMMMMM MMMMBFMMMMMBMMMM MMMBFMFFFFMMBMIM MMMBFMFBFBAMFBMM MIMBFMFFFFAMFBMM MMMBFNAFFANFBMMM MMBFNFFAAFFNABAM MBFMFFFFFFFFAFBM MBFMFNFFFFNFAFBM MBFMFNJJKJNFAFBM MMBFNMFJJFANABAM MMMBFMFFAFAABAMM MMBFMFFAAFFAFBMM MMMMMMMMMMMMMMMM } # tile 243 (Solar) { MMMMMMMMMMMMMMMM MMMMMMBBBBMMIMMM MMIMMBFMMMBMMMMM MMMMBFMPPMMBMMMM MMMBFMPPPPMMBMIM MMMBFMBGBGAMFBMM MIMBFMBBBBAMFBMM MMMBFNABBANFBMMM MMBFNBBAABBNABAM MBFMBBBBBBBBAFBM MBFMBNBBBBNBAFBM MBFMBNJJKJNBAFBM MMBFNMBJJBANABAM MMMBFMBBABAABAMM MMBFMBBAABBAFBMM MMMMMMMMMMMMMMMM } # tile 244 (bat) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMJJJCACJJJMMMM MMJJAAHJHAAJJMMM MMJAMMMJAMMAJMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMAAAAMMMMMM MMMMAAAAAAAAMMMM MMMAAAMAAMAAAMMM MMMMMMMAAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 245 (giant bat) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMJKMJMJMJKMMMM MMKJJJCACJJKKMMM MJJJAAHJHAAJJKMM MKKAMMMJAMMAJJMM MMJAMMMMMMMAJMMM MMMMMMMMMMMMMMMM MMMMMAAAAAAMMMMM MMMAAAAAAAAAAMMM MMAAAAMAAMAAAAMM MMMMMMMAAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 246 (rhumbat) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMFGMFMFMFGMMMM MMGFFFHAHFFGFMMM MFFFAANFNAAFFGMM MGFAMMMFAMMAFFMM MMFAMMMMMMMAFMMM MMMMMMMMMMMMMMMM MMMMMAAAAAAMMMMM MMMAAAAAAAAAAMMM MMAAAAMAAMAAAAMM MMMMMMMAAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 247 (athol) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMPBMPMPMPBMMMM MMBPPPBABPPBPMMM MPPPAADPDAAPPBMM MBPAMMMPAMMAPPMM MMBAMMMMMMMAPMMM MMMMMMMMMMMMMMMM MMMMMAAAAAAMMMMM MMMAAAAAAAAAAMMM MMAAAAMAAMAAAAMM MMMMMMMAAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 248 (raven) { MMAAAAMMMAAAMMMM MAAAAAAMAAAMMMMM AAAAAAAAAAAMAAMM AMMMAAAAAAAAAAAM MMMMMMAAAAAAAAAM MMMMMAAAAMMMMMAA MMMMMADAMMMMMMMA MMMMMPAMMMMMMMMM MMMMMPMMMMMMMMMM MMMMMMMMMPMPMPMM MMMMMMMMPMPMPMPM MMMMMMMPMPMPMMMM MMMMMMMMPMPMPMMM MMMMMMMMMMMPMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 249 (vampire bat) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMAAMAMAMAAMMMM MMAAAAAAAAAAAMMM MAAAAMDADMAAAAMM MAAAMMMAMMMAAAMM MMAMMMMMMMMMAMMM MMMMMMMMMMMMMMMM MMMMMAAAAAAMMMMM MMMAAAAAAAAAAMMM MMAAAAMAAMAAAAMM MMMMMMMAAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 250 (hellbat) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMDCMDMDMDCMMMM MMCDDDHDHDDCDMMM MDDDJJLDLJJDDCMM MCDJMMMDAMMJDDMM MMDJMMMMMMMJDMMM MMMMMMMMMMMMMMMM MMMMMAAAAAAMMMMM MMMAAAAAAAAAAMMM MMAAAAMAAMAAAAMM MMMMMMMAAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 251 (mongbat) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMPBMPMPMPBMMMM MMBPPPEAEPPBPMMM MPPPAAHPHAAPPBMM MBPAMMMPAMMAPPMM MMPAMMMMMMMAPMMM MMMMMMMMMMMMMMMM MMMMMAAAAAAMMMMM MMMAAAAAAAAAAMMM MMAAAAMAAMAAAAMM MMMMMMMAAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 252 (mobat) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MJJJMMJMJMMJJJMM JJJJJMHJHMJJJJJM JJJJJJJJJJJJJJJM JJMMMJJJJJMMMJJM MJMMMMJJJMMMMJMM MMMMMMMJMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMAAMMMMMMM MMMMMAAAAAAMMMMM MAAAAAAAAAAAAAAM MMAAAMMAAMMAAAMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 253 (harpy) { MMMMMMMMMMMMMMMM MMMMMMAAAMMMMMMM MMMCMAPLPAMCMMMM MMCJJAALAAJJCMMM MCJJJJLLLJJJJCMM MCJJAKLOLKAJJCMM MCJAKAKKCAKAJCMM MMJAMAKMKAMAJMMM MMMMMCKMKCMMMMMM MMMMMDDMDDMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMAAAAAMMMM MMMMMAAAAAAAAMMM MMMMMMAAAAAMMMMM MMMMMMMMMMMMMMMM } # tile 254 (byakhee) { MMMMMMMMMMMMMMMM MMMMMMMMMMMKKKKM MMMAKMMMMKKJJMMM MMKKKJMMKJJKKMMM MMKMJKMKJKKJMMMM MMMMJKJJKJKKKMMM MMMMKJKJJKMMMMMM MMMKJJKKJMMMKMMM MKKJMMJKMMKKMMMM MMMMMMJKKKMMMMMM MMMMMMKJMMMMMMMM MMMMMKJMMMMMMMMM MMMMKJMMMMMMMMMM MMMMMKJMMMMAAAAM MMMMMMKMAAAAMMMM MMMMMAAAAAAAAMMM } # tile 255 (nightgaunt) { MMMMMMMMMMMMMMMM MMMMMMMMMMMEEEEM MMMEEMMMMEEAAMMM MMMEEAMMEAAEEMMM MMMMAEMEAEEAMMMM MMMMAEAAEAEEEMMM MMMMEAEAAEMMMMMM MMMEAAEEAMMMEMMM MEEAMMAEMMEEMMMM MMMMMMAEEEMMMMMM MMMMMMEAMMMMMMMM MMMMMEAMMMMMMMMM MMMMEAMMMMMMMMMM MMMMMEAMMMMAAAAM MMMMMMEMAAAAMMMM MMMMMAAAAAAAAMMM } # tile 256 (plains centaur) { MMMMMMMMMMMMMMMM MMMKKAMMMMMMMMMM MMMLLAAMMMMMMMMM MAAKKAAMMMMMMMMM MLLAALLAMMMMMMMM LALLLLALAMMMMMMM LALLLKALAMAMMMMM MMLKLKAAAAAMMMMM MMKLCJKJJKAAMMMM MCJKJKJKJAKAAAAM MKAKJKJJCJAAAMAM MCAAKAAAAKAAMMMM MMCACAAJAKAMMMMM MMMMKAAKAKMMMMMM MMMMCAMMMCMMMMMM MMMMMMMMMMMMMMMM } # tile 257 (forest centaur) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMKKAMMMMMMMMMM LAMLLAALAMMMMMMM LAALLAALAMMMMMMM MLLAALLAMMMMMMMM MMLLLLAMAMMMMMMM MMLKLKAAAAAMMMMM MMKLKJKJJKAAMMMM MKKKKCJKJAKAMAMM MKAKJJJJCJAAAAMM MCAAKAAJAKAMMMMM MMCMKAAKAKMMMMMM MMMMCAMMMCMMMMMM MMMMMMMMMMMMMMMM } # tile 258 (mountain centaur) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMKKAMMMMMMMMMM MMMLLAAMMMMMMMMM MMAKCAAMMMMMMMMM MLJJJJLAMMMMMMMM LAJKKJALAMAMMMMM LAKCKKALAAAMMMMM MMJJJJKJJKAAMMMM MKJJKKKKJAKAAAAM MKAKJJJJCJAAAMAM MCAAKAAAAKAAMMMM MMCACAAJAKAMMMMM MMMMKAAKAKMMMMMM MMMMCAMMMCMMMMMM MMMMMMMMMMMMMMMM } # tile 259 (baby gray dragon) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMBBBAMMMMMMM MMMMNPNPPAMMMMMM MMMBPPPPPAMMMMMM MMCHHPABPAMAAAMM MCHCDAMBPAAAAAAM MMDMMBPPAAAAAAAM MMMMBBPPPPPAAAAM MMMBOOPPPPPPAAAM MMBPOBPPPPPPPAAM MMBPPBPPOBPAPPAM MMBPABPMABPAPPAM MMMMMBPAAMMPPAAM MMMMMMMMMMMPAAMM } # tile 260 (baby silver dragon) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMPPPAMMMMMMM MMMMOBOBBAMMMMMM MMMPBBBBBAMMMMMM MMCHHBAPBAMAAAMM MCHCDAMPBAAAAAAM MMDMMPBBAAAAAAAM MMMMPPBBBBBAAAAM MMMPNNBBBBBBAAAM MMPBNPBBBBBBBAAM MMPBBPBBNPBABBAM MMPBAPBMAPBABBAM MMMMMPBAAMMBBAAM MMMMMMMMMMMBAAMM } # tile 261 (baby shimmering dragon) { MIMMMMMMMMMMMMMM MMMBBBBBBBMIMMMM MMBFMFFFMFBMMMIM MBFMMBBBAMFBMMMM BFMMNPNPPAFBMIMM BFMBPPPPPAMBMMMM BMCHHPABPAFBAAIM BCHCDAMBPAAFBAAM BMDMMBPPAAAAFBAM BMMMBBPPPPPAAFBM BFMBOOPPPPPPAAAB BFBPOBPPPPPPPAFB BFBPPBPPOBPAPPFB BMBPABPMABPAPPFB BMMMMBPAAMMPPAAB MBMMMMMMMMMPAABM } # tile 262 (baby deep dragon) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMOOOAMMMMMMM MMMMDNDNNAMMMMMM MMMONNNNNAMMMMMM MMCHHNAONAMAAAMM MCHCDAMONAAAAAAM MMDMMONNAAAAAAAM MMMMOONNNNNAAAAM MMMONNNNNNNNAAAM MMONNONNNNNNNAAM MMONNONNNONANNAM MMONAONMAONANNAM MMMMMONAAMMNNAAM MMMMMMMMMMMNAAMM } # tile 263 (baby red dragon) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMIIIAMMMMMMM MMMMNDNDDAMMMMMM MMMIDDDDDAMMMMMM MMCHHDAIDAMAAAMM MCHCDAMIDAAAAAAM MMDMMIDDAAAAAAAM MMMMIIDDDDDAAAAM MMMIHHDDDDDDAAAM MMIDHIDDDDDDDAAM MMIDDIDDHIDADDAM MMIDAIDMAIDADDAM MMMMMIDAAMMDDAAM MMMMMMMMMMMDAAMM } # tile 264 (baby white dragon) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMNNNAMMMMMMM MMMMIOIOOAMMMMMM MMMNOOOOOAMMMMMM MMCHHOANOAMAAAMM MCHCDAMNOAAAAAAM MMDMMNOOAAAAAAAM MMMMNNOOOOOAAAAM MMMNOOOOOOOOAAAM MMNOONOOOOOOOAAM MMNOONOOONOAOOAM MMNOANOMANOAOOAM MMMMMNOAAMMOOAAM MMMMMMMMMMMOAAMM } # tile 265 (baby orange dragon) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMLLLAMMMMMMM MMMMNCNCCAMMMMMM MMMLCCCCCAMMMMMM MMCHHCALCAMAAAMM MCHCDAMLCAAAAAAM MMDMMLCCAAAAAAAM MMMMLLCCCCCAAAAM MMMLOOCCCCCCAAAM MMLCOLCCCCCCCAAM MMLCCLCCOLCACCAM MMLCALCMALCACCAM MMMMMLCAAMMCCAAM MMMMMMMMMMMCAAMM } # tile 266 (baby black dragon) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMAAAMMMMMMMM MMMMNANAAMMMMMMM MMMAAAAAAMMMMMMM MMCHHAMAAMMPPPMM MCHCDMMAAMPPPPPM MMDMMAAAPPPMPPPM MMMMAAAAAAAPPPPM MMMAAAAAAAAAPPPM MMAAAAAAAAAAAPPM MMAAAAAAAAAPAAPM MMAAPAAMPAAPAAPM MMMMMAAPMMMAAPPM MMMMMMMMMMMAPPMM } # tile 267 (baby blue dragon) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMBBBAMMMMMMM MMMMNENEEAMMMMMM MMMBEEEEEAMMMMMM MMCHHEABEAMAAAMM CCHCDAMBEAAAAAAM MMDMMBEEAAAAAAAM MMMMBBEEEEEAAAAM MMMBOOEEEEEEAAAM MMBEOBEEEEEEEAAM MMBEEBEEOBEAEEAM MMBEABEMABEAEEAM MMMMMBEAAMMEEAAM MMMMMMMMMMMEAAMM } # tile 268 (baby green dragon) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMGGGAMMMMMMM MMMMNFNFFAMMMMMM MMMGFFFFFAMMMMMM MMCHHFAGFAMAAAMM MCHCDAMGFAAAAAAM MMDMMGFFAAAAAAAM MMMMGGFFFFFAAAAM MMMGOOFFFFFFAAAM MMGFOGFFFFFFFAAM MMGFFGFFOGFAFFAM MMGFAGFMAGFAFFAM MMMMMGFAAMMFFAAM MMMMMMMMMMMFAAMM } # tile 269 (baby yellow dragon) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMNNNAMMMMMMM MMMMDHDHHAMMMMMM MMMNHHHHHAMMMMMM MMCHHHANHAMAAAMM MCHCDAMNHAAAAAAM MMDMMNHHAAAAAAAM MMMMNNHHHHHAAAAM MMMNOOHHHHHHAAAM MMNHONHHHHHHHAAM MMNHHNHHONHAHHAM MMNHANHMANHAHHAM MMMMMNHAAMMHHAAM MMMMMMMMMMMHAAMM } # tile 270 (gray dragon) { MMMMMMBBBPAMMMMM MMMMMNPNPPPAMMMM MMMMBPPPPPPAMMMM MMDCHHPMMPPAMMMM CHCHCDMMBPPAMMMM HDMDMMMBPPAMMMMM MMMMMMOBPAAAAAAM MMMMBOBPAAAAAAAA MMBOOBPAMPPMAAAM MBOOOBPPPPPPMAAM MBOOOBPPPPPPPAAM PPOOBBPPPPPPPPAM BPMOBPPOOPPMPMAM BPAABPMAAPPAPPAM MMMMBPAAMMMPPMAM MMMMMMMMPPPPMAMM } # tile 271 (silver dragon) { MMMMMMPPPBAMMMMM MMMMMOBOBBBAMMMM MMMMPBBBBBBAMMMM MMDCHHBMMBBAMMMM CHCHCDMMPBBAMMMM HDMDMMMPBBAMMMMM MMMMMMNPBAAAAAAM MMMMPNPBAAAAAAAA MMPNNPBAMBBMAAAM MPNNNPBBBBBBMAAM MPNNNPBBBBBBBAAM BBNNPPBBBBBBBBAM PBMNPBBNNBBMBMAM PBAAPBMAABBABBAM MMMMPBAAMMMBBMAM MMMMMMMMBBBBMAMM } # tile 272 (shimmering dragon) { MIMBFMBBBPAFBMMM MMBFMNPNPPPAFBMI MBFMBPPPPPPAFBMM MBDCHHPMMPPAFBIM CBCHCDMMBPPAFBMM HDBBMMMBPPAMBMMI MMBFMMOBPAAAABAM MBFMBOBPAAAAAFBA BFBOOBPAMPPMAAFB MBOOOBPPPPPPMAFB MBOOOBPPPPPPPAFB PPOOBBPPPPPPPPFB BPMOBPPOOPPMPMFB BPAABPMAAPPAPPFB MMMMBPAAMMMPPMAB MMMMMMMMPPPPMABM } # tile 273 (deep dragon) { MMMMMMOOONAMMMMM MMMMMDNDNNNAMMMM MMMMONNNNNNAMMMM MMDCHHNMMNNAMMMM CHCHCDMMONNAMMMM HDMDMMMONNAMMMMM MMMMMMNONAAAAAAM MMMMONONAAAAAAAA MMONNONAMNNMAAAM MONNNONNNNNNJAAM MONNNONNNNNNNAAM NNNNOONNNNNNNNAM ONMNONNNNNNMNJAM ONAAONMAANNANNAM MMMMONAAMMMNNJAM MMMMMMMMNNNNJAMM } # tile 274 (red dragon) { MMMMMMIIIDAMMMMM MMMMMNDNDDDAMMMM MMMMIDDDDDDAMMMM MMDCHHDMMDDAMMMM CHCHCDMMIDDAMMMM HDMDMMMIDDAMMMMM MMMMMMHIDAAAAAAM MMMMIHIDAAAAAAAA MMIHHIDAJDDJAAAM MIHHHIDDDDDDJAAM MIHHHIDDDDDDDAAM DDHHIIDDDDDDDDAM IDMHIDDHHDDJDJAM IDAAIDMAADDADDAM MMMMIDAAJJJDDJAM MMMMMMMMDDDDJAMM } # tile 275 (white dragon) { MMMMMMNNNOAMMMMM MMMMMIOIOOOAMMMM MMMMNOOOOOOAMMMM MMDCHHOMMOOAMMMM CHCHCDMMNOOAMMMM HDMDMMMNOOAMMMMM MMMMMMONOAAAAAAM MMMMNONOAAAAAAAA MMNOONOAMOOMAAAM MNOOONOOOOOOJAAM MNOOONOOOOOOOAAM OOOONNOOOOOOOOAM NOMONOOOOOOMOJAM NOAANOMAAOOAOOAM MMMMNOAAMMMOOJAM MMMMMMMMOOOOJAMM } # tile 276 (orange dragon) { MMMMMMLLLCAMMMMM MMMMMNCNCCCAMMMM MMMMLCCCCCCAMMMM MMDCHHCMMCCAMMMM CHCHCDMMLCCAMMMM HDMDMMMLCCAMMMMM MMMMMMOLCAAAAAAM MMMMLOLCAAAAAAAA MMLOOLCAMCCKAAAM MLOOOLCCCCCCJAAM MLOOOLCCCCCCCAAM CCOOLLCCCCCCCCAM LCMOLCCOOCCKCJAM LCAALCMAACCACCAM MMMMLCAAMKKCCJAM MMMMMMMMCCCCJAMM } # tile 277 (black dragon) { MMMMMMAAAAMMMMMM MMMMMNANAAAMMMMM MMMMAAAAAAAMMMMM MMDCHHAMMAAMMMMM CHCHCDMMAAAMMMMM HDMDMMMAAAMMMMMM MMMMMMAAAMMPPPPM MMMMAAAAPPPPPPPP MMAAAAAAAAAMPPPM MAAAAAAAAAAAAPPM MAAAAAAAAAAAAPPM AAAAAAAAAAAAAAPM AAMAAAAAAAAMAAPM AAPPAAMPPAAPAAPM MMMMAAPPMMMAAAPM MMMMMMMMAAAAAMMM } # tile 278 (blue dragon) { MMMMMMBBBEAMMMMM MMMMMNENEEEAMMMM MMMMBEEEEEEAMMMM MMDCHHEMMEEAMMMM CHCHCDMMBEEAMMMM HDMDMMMBEEAMMMMM MMMMMMOBEAAAAAAM MMMMBOBEAAAAAAAA MMBOOBEAMEEMAAAM MBOOOBEEEEEEJAAM MBOOOBEEEEEEEAAM EEOOBBEEEEEEEEAM BEMOBEEOOEEMEJAM BEAABEMAAEEAEEAM MMMMBEAAMMMEEJAM MMMPMMMMEEEEJAMM } # tile 279 (green dragon) { MMMMMMGGGFAMMMMM MMMMMNFNFFFAMMMM MMMMGFFFFFFAMMMM MMDCHHFMMFFAMMMM CHCHCDMMGFFAMMMM HDMDMMMGFFAMMMMM MMMMMMOGFAAAAAAM MMMMGOGFAAAAAAAA MMGOOGFAMFFMAAAM MGOOOGFFFFFFJAAM MGOOOGFFFFFFFAAM FFOOGGFFFFFFFFAM GFMOGFFOOFFMFJAM GFAAGFMAAFFAFFAM MMMMGFAAMMMFFJAM MMMMMMMMFFFFJAMM } # tile 280 (yellow dragon) { MMMMMMNNNHAMMMMM MMMMMDHDHHHAMMMM MMMMNHHHHHHAMMMM MMDCHHHMMHHAMMMM CHCHCDMMNHHAMMMM HDMDMMMNHHAMMMMM MMMMMMONHAAAAAAM MMMMNONHAAAAAAAA MMNOONHAJHHJAAAM MNOOONHHHHHHJAAM MNOOONHHHHHHHAAM HHOONNHHHHHHHHAM NHMONHHOOHHJHJAM NHAANHMAAHHAHHAM MMMMNHAAJJJHHJAM MMMMMMMMHHHHJAMM } # tile 281 (wyvern) { MMMMMMMMMMMMMMMM MFGGFAMMMMMMMMMM MMFGGFAMGGGGFAMM MMMGGFAGGGDGGDAM MFGGGGGGGGGGGGFA MMFGGGGGFFGGGGFA MMMGGFGFAAFODOAM MFGGGFGGFAAFFDAM MMFGGFGGGGFAAADA MMMFFAAGGGGFAAAA MMMMMMMMMGGFAAAA MMMMMMMMMGGFAAAM MMGGGFMGGGGFAAMM MGFFGGGGGFFAAMMM MFAAFFFFFAAAMMMM MMMMMMMMMMMMMMMM } # tile 282 (hydra) { MMMMMMMGFAMMMMMM MMDKAMHGGHAMBEAM MHDDHAGGGFAHBBHA MDDDKAMGFAMBBBEA MMDKAMMFFAMMBEAM MMCKDKAGFAMBEEAM MMMMMDKGFABEAMMM EEBBAADGFBEADDKK MBBBBBGKEGDDDDKA MEBBBEGGGGDDDDKA MMEBBEGGGFDDDKAA MMMEEDGGGFBKCAAA MMMMMDDFFBEAAAAA MMMMMDKAABEAAMMM MMMMMAOAMOAAMMMM MMMMMAAMMAAMMMMM } # tile 283 (stalker) { MMMMMMMMMMMMMMMM MMMMMMMPPPMMMMMM MMMMMMPMPMPMMMMM MMMMMPPPPPPMMMMM MMMMMPPMMPPPMMMM MMMMPPPPPPMPMMMM MMMMPMPPPPMPMMMM MMMMPMPPPMMPMMMM MMMMPMMPPMMPMMMM MMMMPMPPPPMPMMMM MMMMPMPMMPMPMMMM MMMMPMPMMPMPMMMM MMMMMMPMMPMMMMMM MMMMMMPMMPMMMMMM MMMMMPPMMPPMMMMM MMMMMMMMMMMMMMMM } # tile 284 (air elemental) { MMMMMMMMMMMMMMMM MMMPMPPPMMPMMMMM MMPMPAPAMPMMMMMM PMMPPPPPPMMPMMMM MPMPPAAPPPMMMPMM MMPPPAAPMPMPMMMM MMPAPAAPAPMMMMMM PMPAPPPMAPMPMAAM MMPAMPPMAPMAAAAM MMPAPPPPAPAAAAMM MMPAPMAPAPAAAAMM MMPAPMAPAPAAAAAM MMMMPMAPAAAAAAAM MMPMPMAPPAAAAAAM MMMPPMAPPPAMMMMM MMMMMMMMMMMMMMMM } # tile 285 (fire elemental) { MMMMMMMMMMMMMMMM MHMMLDDDMMMMMMMM MMMLDADACMHMMMMM HMMDDDDDDMMHMHMM MMLDDAADDDMMMMMM MMDDDAADCDMHMMMM MMDADAACADMMMMMM HMDADDDCADMMMAAM MMDACDDCADMAAAAM MMDADDDDADAAAAMM MMDADCADADAAAAMM HMDADCADADAAAAAM MMMMDCADAAAAAAAM MHMLDCADDAAAAAAM MMLDDCADDDAMMMMM MMMMMMMMMMMMMMMM } # tile 286 (earth elemental) { MMFMMMMMMMMMMMMM MMMMCCKKMMFMMMMM MMMCKAKAJMMMMFMM MMMKCKKCKMMMMMMM MMCKKAAKKCMFMMFM MFKCKAAKJKMMMMMM MMKAKAAJAKMMFMMM MMKACJJJAKMMMAAM FMCAJKKKACMAAAAM MMKAKCKKAKAAAAMM MMKAKJAKAKAAAAMM MMKAKJACAKAAAAAM MMMMCJAKAAAAAAAM MFMCKJACKAAAAAAM MMCKKJAKKCAMMMMM MMMMMMMMMMMMMMMM } # tile 287 (water elemental) { MMMMMMMMMMMMMMMM MMMMPBBBMMEMMMMM MEMPBABAEMMMEMMM MMMBBBBBBMMMMMMM MMPBBAABBBMEMMEM EMBBBAABEBMMMMMM MMBABAABEBMEMMMM MMBABBBBEBMMMAAM MMBAPBBEABMAAAAM EMBABBBBABAAAAMM MMBABEABABAAAAMM MMBABEABABAAAAAM MMMMBEABAAAAAAAM MEMPBEABBAAAAAAM MMPBBEABBBAMMMMM MMMMMMMMMMMMMMMM } # tile 288 (lichen) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMFFFMMMFFFMMMM MMFCFFFFFCCFAMMM MFCOOFFFCOFFFAMM MFCOOFFFCFFFFAMM MMFFFFFFFFFFAMMM MMMAFFFCCFFFAMMM MMMFFFFCOFFAAMMM MMFCCFFCOFCFAMMM MMFCOFFCFFOCFAMM MMFFCFFFCFFFFAMM MMMFFFAAFFFFFAMM MMMMMAAMAAAAAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 289 (brown mold) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMJJJMMMJJJMMMM MMJKJJJJJKKJAMMM MJKCCJJJKCJJJAMM MJKCCJJKKJJJJAMM MMJJJJJJJJJJAMMM MMMAJJJCKJJJAMMM MMMJJJJKCJJAAMMM MMJKKJJKCJKJAMMM MMJCCJJKJJCKJAMM MMJJKJJJCJJJJAMM MMMJJJAAJJJJJAMM MMMMMAAMAAAAAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 290 (yellow mold) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMHHHMMMHHHMMMM MMHHHHHHHNHHAMMM MHHNNOHHNNOHHAMM MHHNNOOHHOOHHAMM MMHHOOHHHHHHAMMM MMMAHHHHHHHHAMMM MMMHHHHNNOHAAMMM MMHHHHHNNOHHAMMM MMHNNOHHHONOHAMM MMHHOHHHHHOOHAMM MMMHHHAAHHHHHAMM MMMMMAAMAAAAAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 291 (green mold) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMFFFMMMFFFMMMM MMFGFFFFFGGFAMMM MFGOOFFFGOFFFAMM MFGOOFFFGFFFFAMM MMFFFFFFFFFFAMMM MMMAFFFGGFFFAMMM MMMFFFFGOFFAAMMM MMFGGFFGOFGFAMMM MMFGOFFGFFOGFAMM MMFFGFFFGFFFFAMM MMMFFFAAFFFFFAMM MMMMMAAMAAAAAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 292 (red mold) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMDDDMMMDDDMMMM MMDCDDDDDCCDAMMM MDLLCDDDCLDDDAMM MDCCCDDDCDDDDAMM MMDDDDDDDDDDAMMM MMMADDDCCDDDAMMM MMMDDDDCLDDAAMMM MMDCCDDCLDCDAMMM MMDCLDDCDDLCDAMM MMDDCDDDCDDDDAMM MMMDDDAADDDDDAMM MMMMMAAMAAAAAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 293 (shrieker) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMGGGGFFMMMMM MMMGGGGIGIDFFMMM MGGGIIGGGIIFFFFM GIIGIIGGGGGGGDDF GIIGGGGIIGIIGIDF GGGGIGGIIGIIGGFF MMGGGGGGGGGGGMMM MMMMMMFFFMMAAAAA MMMMAGGGFFAAAAAA MMMAGGGGGGFAAAAM MMMAAAAAAAAAAMMM MMMMMMMMMMMMMMMM } # tile 294 (violet fungus) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMIIIMMMIIIMMMM MMILIIIIILLIAMMM MIOOLIIILOIIIAMM MILLLIIILIIIIAMM MMIIIIIIIIIIAMMM MMMAIIILLIIIAMMM MMMIIIILOIIAAMMM MMILLIILOILIAMMM MMILOIILIIOLIAMM MMIILIIILIIIIAMM MMMIIIAAIIIIIAMM MMMMMAAMAAAAAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 295 (disgusting mold) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMLLLMMMLLLMMMM MMLOLLLLLOOLAMMM MLONNLLLONLLLAMM MLONNLLLOLLLLAMM MMLLLLLLLLLLAMMM MMMALLLOOLLLAMMM MMMLLLLOLLLAAMMM MMLOOLLOLLOLAMMM MMLONLLOLLNOLAMM MMLLOLLLOLLLLAMM MMMLLLAALLLLLAMM MMMMMAAMAAAAAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 296 (black mold) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMAAAMMMAAAMMMM MMAPAAAAAPPAPMMM MAPOOAAAPOAAAPMM MAPOOAAAPAAAAPMM MMAAAAAAAAAAPMMM MMMPAAAPPAAAPMMM MMMAAAAPOAAPPMMM MMAPPAAPOAPAPMMM MMAPOAAPAAOPAPMM MMAAPAAAPAAAAPMM MMMAAAPPAAAAAPMM MMMMMPPMPPPPPMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 297 (gnome) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMDFMMMMMMMMM MMMMMMGMMMMMMMMM MMMMMGFFMMMMMMMM MMMMGGFFFMMMMMMM MMMMGLLLFMMMMMMM MMMMMOLOMMMAAAMM MMMFGOOOFFAAAAMM MMMGAGOFAFAAAAMM MMMMLKNKFAAAAMMM MMMMFGAFFAAMMMMM MMMMGFAFGMAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 298 (gnome thief) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMCJMMMMMMMMM MMMMMMKMMMMMMMMM MMMMMKJJMMMMMMMM MMMMKCJJJMMMMMMM MMMMKLLLJMMMMMMM MMMMMOLOMMMAAAMM MMMJKOOOJJAAAAMM MMMKAKOJAJAAAAMM MMMMLGHGJAAAAMMM MMMMJKAJJAAMMMMM MMMMKJAJKMAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 299 (gnome lord) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMDMMMMMMMMM MMMMMMGMMMMMMMMM MMMMMMGMMMMMMMMM MMMMMGFFMMMMMMMM MMMMHHHHHMMMMMMM MMMMGLLLFMMMMMAM MMMMMOLOMMMAAAMM MMMFGOOOFFAAAAMM MMMGAGOFAFAAAAMM MMMMLKNKFAAAAMMM MMMMFGAFFAAMMMMM MMMMGFAFGMAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 300 (gnomish wizard) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMGMMMMMMMMM MMMMMGFFMMMMMMMM MMMMGGFFFMMMMMMM MMMMGLLLFMMMMMMM MMMFFOLOFFMAAAMM MMMGFOOOFFAAAAMM MMMFAGOFAFAAAAMM MMMGLKNKFFAAAMMM MMMFFGFFFFAMMMMM MMMGFFFFGFAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 301 (deep gnome) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMIAMMMMMMMMM MMMMMMPMMMMMMMMM MMMMMPAAMMMMMMMM MMMMPPAAAMMMMMMM MMMMPOOOAMMMMMMM MMMMMNONMMMPPPMM MMMAPNNNAAPPPPMM MMMPPPNAPAPPPPMM MMMMOJHJAPPPPMMM MMMMAPPAAPPMMMMM MMMMPAPAPMPMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 302 (gnome warrior) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMDFMMMMMMMMM MMMMMMGMMMMMMMMM MMMMMGFFMMMMMMMM MMMMGGFFFMMMMMMM MMMMGLLLFMMMMMMM MMMMMOLOMMMAAAMM MMMJKOOOFFAAAAMM MMJJJKOFAFAAAAMM MMJJKKNNPAAAAMMM MMMJKGAFFAAMMMMM MMMMGFAFGMAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 303 (Ruggo the Gnome King) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMHMCMHMMMMMMM MMMMHCHCHMMMMMMM MMMMHHHHHMMMMMMM MMMMDLLLFMMMAMMM MMMMPOLOMMMAAAAM MMMFPOOOFFAAAAMM MMMGPGOFAFAAAAMM MMMMLKNKFAAAAMMM MMMMPGAFFAAMMMMM MMMMPFAFGMAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 304 (gnome king) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMHMCMHMMMMMMM MMMMHCHCHMMMMMMM MMMMHHHHHMMMMMMM MMMMGLLLFMMMAMMM MMMMMOLOMMMAAAAM MMMFGOOOFFAAAAMM MMMGAGOFAFAAAAMM MMMMLKNKFAAAAMMM MMMMFGAFFAAMMMMM MMMMGFAFGMAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 305 (gnoll) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMCMMMOMMMM MMMMMMCCAMMOAMMM MMMCCCACCAMJAMMM MMMMCCCCCCAJAMMM MMMMMMMCCAAJAMMM MMMMMMPBPPPJAMMM MMMMMMPBPAPPAMMM MMMMMPKKKAAJAMMM MMMMPPKCKKAJAMMM MMMMAACKCAAJAMMM MMMMMMCACCAJAAAM MMMMMMCAACAJAAAM MMMMMCCACCAAAAMM MMMMMMMMMMMMMMMM } # tile 306 (gnoll warrior) { MMMMMMMMMPMMMMMM MMMKMPAJMPMMMMMM MMMMPKPMMPMMMMMM MMMMAKAMMJMMMMMM MMMMKKJAMJMMMMMM MMMMJAJAMJMMMMMM MMMKPJPKMJMMMMMM MMKPJPJPKJMAAMMM MMKAPKPAKKAAAMMM MMKAPPPAAKAAMMMM MMKAPKPAAJAAMMMM MMMMPAPAAJAAMMMM MMMMJAJAAJAMMMMM MMMJJAKJAJMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 307 (gnoll chieftain) { MMMMMMMMMPMMMMMM MMMKMBAJMPMMMMMM MMMMBPPMMPMMMMMM MMMMAKAMMJMMMMMM MMMMKKJAMJMMMMMM MMMMJAJAMJMMMMMM MMMBPJPBMJMMMMMM MMBPBBPPBJMAAMMM MMBABBPAPKAAAMMM MMKABPPAAKAAMMMM MMKABPPAAJAAMMMM MMMMBABAAJAAMMMM MMMMJAJAAJAMMMMM MMMJJAKJAJMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 308 (gnoll shaman) { MMMMMMMMMPMMMMMM MMMKMNAKMPMMMMMM MMMMNNOMMPMMMMMM MMMMANAMMDMMMMMM MMMMNNOAMJDMMMMM MMMMNAOAMJDMMMMM MMMKKOKKMJMMMMMM MMKJJDJJKJMAAMMM MMKAKDJAKOAAAMMM MMKAKDJAAKAAMMMM MMOAKDJAAJAAMMMM MMMMJAKAAJAAMMMM MMMMJAKAAJAMMMMM MMMOOAOOAJMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 309 (giant) { MMMMMMJJJJAAMMMM MMMMJJJJJJJJAMMM MMMMJJLLLLJJAMMM MMMMJFFLLFFJAMMM MMMMJLLLLLLJAMMM MMMMALLAALLAAAMM MMMMMALLLLJAAAAM MMCCLLJJJJLLCCAA MCLLLCCKCKCLLLCA MLLLKLKCKCLKLLLA MLLAALLCCLLAALLA MLLAAJJJCKJAALLA MCLCMJJJJJKCCLAA MMLLMCLJACLJLLAA MMMMMCLJACLJAAAA MMMLLLLJMCLLLKAA } # tile 310 (stone giant) { MMMMMMJJJJAAMMMM MMMMJJJJJJJJAMMM MMMMJJLLLLJJAMMM MMMMJFFLLFFJAMMM MMMMJLLLLLLJAMMM MMMMALLAALLAAAMM MMMMMALLLLJAAAAM MMCCLLJJJJLLCCAA MCLLLCCKCKCLLLCA MLLLAAKCKCLKLLLA MLLPPPACCLLAALLA MLLPPPPACKJAALLA MCLCPPPAJJKCCLAA MMLLPPALACLJLLAA MMMMMALJACLJAAAA MMMLLLLJMCLLLKAA } # tile 311 (hill giant) { MMMMMMJJJJAAMMMM MMMMJJJJJJJJAMMM MMMMJJLLLLJJAMMM MMMMJFFLLFFJAMMM MMMMJLLLLLLJAMMM MMMMALLAALLAAAMM MMMMMALLLLJAAAAM MMMJJKJJJJJJJAAM MMLJJCCKCKCJJLAM MMJLKCKCKCKKLJAM MMLAAKKCCCJAALAA MMLAAJJJKKJAALAA MMLCMJJJJJKKCLAA MMLLMCLJACLJLLAA MMMMMCLJACLJAAAA MMMLLLLJMLLLLKAA } # tile 312 (fire giant) { MMMMPPDDDDAAMMMM MMMMPDDDDDDDAMMM MMMPPDLLLLDDAMMM MMMPDPFLLFFDAMMM MMMPPPLLLLLDAMMM MMMMPLLAALLAAAMM MMMPPALLLLJAAAAM MMMJPDJJJJJJJAAM MMLDDHDKCKCJJLAM MMJLHDDCKCKKLJAM MMLAHDHCCCJAALAA JLAADDHJKKJAALAA JJLJDHHJJJKCCLAA MMLLJJJJACLJLLAA MMMMMCLJACLJAAAA MMMLLLLJMLLLLKAA } # tile 313 (frost giant) { MMMMMKJJJJAAMMMM MMMMKJJJJJJJAMMM MMMMKJLLLLJJAMMM MMMMJEELLEEJAMMM MMMMJLLLLLLJAMMM MMMMAKJJJJJAAAMM MMMMMKJAAJJAAAAM MMMMCKJJJJAJAAAA MMMKJKJJJJAJJAAA MMKJCKJJJJJKJJAA MMKAAJKJJAJAAJAA MMJAAJCKAKJAAJAA MMLCMJJJJJKCCLAA MMLLMCJJAJLJLLAA MMMMMCLJACLJAAAA MMMLLLLJMCLLLKAA } # tile 314 (ettin) { MMMMNNMMONOPMMMM MMNNOOPNNOOPPMMM MMNPPMMNPPMMPMMM MMALPPLALPPLAMMM MMAPPPPAPPPPAMMM MMAPAAPAPAAPAAMM MMAPPPPAPPPPAAAM MMBIIIIJJJIIIBAA MBPPPIIIIIIPPPBA MPPPFPIIIIPFPPPA MPPAAPIIIIPAAPPA MPPAAIIIIIIAAPPA MBPBMIIFFIIABPAA MMPPMBPAABPAPPAA MMMMMBPAABPAAAAA MMMPPPPAMBPPPFAA } # tile 315 (titan) { MMMMMAAAAAAAMMMM MMMMAALLLLAAAMMM MMMMAMMLLMMAAMMM MMMMALLLLLLAAMMM MMMMALLAALLAAAMM MMMMMALLLLJAAAAM MMCCJJJJJJJJCCAM MCLLLCCKCKCLLLCA MLLLKJKCKCJKLLLA MLLAAJJCCJJAALLA MLLAAJJCCJJAALLA MLLAAJJJCKJAALLA MCLCMJJJJJKCCLAA MMLLMCLJACLJLLAA MMMMMCLJACLJAAAA MMMLLLLJMCLLLKAA } # tile 316 (storm giant) { MMMMMMJJJJAAMMMM MMMMJJJJJJJJAMMM MMMMJJLLLLJJAMMM MMMMJFFLLFFJAMMM MMMMJLLLLLLJAMMM MMMMALLAALLAAHMM MMMMMALLLLJAHAAM MMMJJKJJJJJHHAAM MMLJJCCKCKHHLAAM MMJLKKKCKHHHHHHM MMLAAKKCCKJAHHAA MMLAAJJJKKJHHALA MMLCMJJJJJKHAAAA MMLLMCLJACHAAAAA MMMMMCLJACCJAAAA MMMLLLLJMLLLLKAA } # tile 317 (minotaur) { MMMMMMMMMMMMMMMM MOMMMMMMMMMMOMMM MOOOJJJJJJOOOMMM MMOOJJKJJJOOMMMM MMMJGAKJGAJAMMMM MMMJJKKJJJJAMMMM MMMMJJKJJJAAAMMM MMMMJCKKJAAAAMMM MMCLJAJAKALCAAMA MCLLJJJJJALLCAAA MLLCLAAAALCLLAAM MLAACLLLLCAALAAM MLLMJJJJJJJLLAAA MLLMJJJJJJJLLAAA MMMMCLCACLCAAAAA MMLLLLLMLLLLLAAM } # tile 318 (the Largest Giant) { MMMMJJJJJJJJAMMM MMMJJLLLLLLJJAMM MMMJLAALLAALJAMM MMMJLGFLLFGLJAMM MMMJLLLLLLLLJAMM MMOOALLAALLAOOAA MOLLOALDDLJOLLCA OLLLLCLLLCLLLLLC OLLLLCCKCKCLLLLC OLLLKLKCKCLKLLLC OLLALLLCCLLLALLC OLLAJJJJKKJJALLC MOLCJJJJJJCKOLCA MMOCOLLJAOLLOCAA MMMOLLLJAOLLCAAA MMLLLLLJAOLLLCAA } # tile 319 (Father Dagon) { MMMMMGMMMMMMMMMM MMMMIIIMBMBMBMMM MMMAAGAABMBMBMMM MMMGGGFFMBBBMMMM MMMMMGFAMMBMMMMM MMFGGGFFFMBMMMMM MMGFFGFGFABAAMMM MMGFFFFAGFGAAMMM MMGAGFFAAABAAMMM MMGAGFFFAABAMMMM MMMMGFGFAABAMMMM MMMMGFGFAABAMMMM MMMMGAGFAABAMMMM MMMFGAGFAABAMMMM MMMGFAGFAABAMMMM MMGGFAGFFABAMMMM } # tile 320 (Mother Hydra) { MMMMMGMMMMMMMMMM MMMMDDDMBMBMBMMM MMMAAGAABMBMBMMM MMMGGGFFMBBBMMMM MMMMMGFAMMBMMMMM MMFGGGFFFMBMMMMM MMGFFFFGFABAAMMM MMGFGFGAGFGAAMMM MMGAGFGAAABAAMMM MMGAFFFFAABAMMMM MMMMGFGFAABAMMMM MMMMGFGFAABAMMMM MMMMGAGFAABAMMMM MMMFGAGFAABAMMMM MMMGFAGFAABAMMMM MMGGFAGFFABAMMMM } # tile 321 (jabberwock) { MMMMMMMMMMMMMMMM MMMDPMMMMMMMMMMM MMMMDPMADOOMMMMM MMDAIDADIPADMMMM MMMDIAPIPAMMMMMM MMMDBDDDAMMMMMMM MMIBBDADDAMMAAMM MDDDDAODDIAAAAMM MMOAOAMDDAIAAAMM MMIOAODDAAADDAAM MMDDDADDDDAIDAMM MMMAAADDIDIDDDMM MMMMIDDAIDDDDAMM MMMMIDAAIDAAMMMM MMMIDAAMMIDMMMMM MMMMMMMMMMMMMMMM } # tile 322 (vorpal jabberwock) { MMMMMMMMMMMMMMMM MMMGPMMMMMMMMMMM MMMMGPMAGOOMMMMM MMGAFGAGFPAGMMMM MMMGFAPFPAMMMMMM MMMGHGGGAMMMMMMM MMFHHGAGGAMMAAMM MGGGGAOGGFAAAAMM MMOAOAMGGAFAAAMM MMFOAOGGAAAGGAAM MMGGGAGGGGAFGAMM MMMAAAGGFGFGGGMM MMMMFGGAFGGGGAMM MMMMFGAAFGAAMMMM MMMFGAAMMFGMMMMM MMMMMMMMMMMMMMMM } # tile 323 (Keystone Kop) { MMMMMMMMMMMMMMMM MMMMAAMMMMMMMMMM MMMAAAAMMMMMMMMM MMMAOAAMMMCMMMMM MMAAAAAAMMCMMMMM MMMLLLLMMMCMMMMM MMMMLLMMMMCMMMMM MMMAAAAMAAAMMMMM MMAAAAAAAACMPMMM MAAMAAAAAMPPPPMM MMAAAAAAMPPPPPPM MMMMAAAAPPPAPPMM MAMAAAAAAPAAAMMM AAAAAMPAAAAAMMMM MMAAMMMMAAMMMMMM MMMMMMMMMMMMMMMM } # tile 324 (Kop Sergeant) { MMMMMMMMMMMMMMMM MMMMAAMMMMMMMMMM MMMAOOAMMMMMMMMM MMMAOOAMMMCMMMMM MMAAAAAAMMCMMMMM MMMLLLLMMMCMMMMM MMMMLLMMMMCMMMMM MMMAAAAMAAAMMMMM MMAAAAAAAACMPMMM MAAMAAAAAMCPPPMM MMAAAAAAMPPPPPPM MMMMAAAAPPPAPPMM MAMAAAAAAPAAAMMM AAAAAMPAAAAAMMMM MMAAMMMMAAMMMMMM MMMMMMMMMMMMMMMM } # tile 325 (Kop Lieutenant) { MMMMMMMMMMMMMMMM MMMMAAMMMMMMMMMM MMMAOOAMMMCMMMMM MMMAOOAMMMCMMMMM MMAAAAAAMMCMMMMM MMMLLLLMMMCMMMMM MMMMLLMMMMCMMMMM MMOAAAOMAAAMMMMM MOAAAAAMAACMPMMM MAAMAAAAAMCPPPMM MMAAAAAAMPPPPPPM MMMMAAAAPPPAPPMM MAMAAAAAAPAAAMMM AAAAAMPAAAAAMMMM MMAAMMMMAAMMMMMM MMMMMMMMMMMMMMMM } # tile 326 (Kop Kaptain) { MMMMMMMMMMMMMMMM MMMMAAMMMMCMMMMM MMMAHHAMMMCMMMMM MMMAHHAMMMCMMMMM MMAAAAAAMMCMMMMM MMMLLLLMMMCMMMMM MMMMLLMMMMCMMMMM MHHAAAAHHAAMMMMM MAAAAHAAAACCCMMM MAAMAHAAAMCPPPMM MMAAAHAAMPCPPPPM MMMMAAAAPPPAPPMM MAMAAAAAAPAAAMMM AAAAAMPAAAAAMMMM MMAAMMMMAAMMMMMM MMMMMMMMMMMMMMMM } # tile 327 (lich) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMOOOMMMMMMMMMM MMAOAOOMMMMMMMMM MMOOOOOMMMMMMMMM MMOOMOMMMMMMMMMM MMMMMPPPMMMMMMMM MMMOOPPPMMMMAAAM MMOMPPPPPAMMAAAM MOMMMPPPPMAAAAAM MMMMOMPPPAAAAMAM MMMMMMPPPAAAMAMM MMMMMOPAPMAMMMMM MMMOOOAMOAMMMMMM MMMMMMOOOMMMMMMM MMMMMMMMMMMMMMMM } # tile 328 (demilich) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMOOOMMMMMMMMMM MMAOAOOMMMMMMMMM MMOOOOOMMMMMMMMM MMOOMOMMMMMMMMMM MMMMMPPPMMMMMMMM MMMOOPPPMMMMAAAM MMOMPPPPPAMMAAAM MOMMMPPPPMAAAAAM MMMMLMPPPAAAAMAM MMMMMMLPPAAAMAMM MMMMMLLALMAMMMMM MMMLLLAMLAMMMMMM MMMMMMLLLMMMMMMM MMMMMMMMMMMMMMMM } # tile 329 (master lich) { MMMHMMMMMMMMMMMM MMMHCHMHMMMMMMMM MMMHHHCHMMMMMMMM MMAOAOHHMMMMMMMM MMOOOOOMMMMMMMMM MMOOMOMMMMMMMMMM MMMMMPPPMMMMMMMM MMMPPPPPMMMMAAAM MMPPPPPPPAMMAAAM MOMMPPPPPMAAAAAM MMMMOPPPPAAAAMAM MMMMMMPPPAAAMAMM MMMMMOPAPMAMMMMM MMMOOOAMOAMMMMMM MMMMMMOOOMMMMMMM MMMMMMMMMMMMMMMM } # tile 330 (arch-lich) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMOOOMMMMMMMMMM MMDODOOMMMMMMMMM MMOOOOOMMMMMMMMM HMOOMOMMMMMMMMMM AMMMMPPPMMMMMMMM AMMOOPPPMMMMAAAM MAOMPPPPPAMMAAAM MOMMMPPPPMAAAAAM MAMMOMPPPAAAAMAM MMAMMMPPPAAAMAMM MMAMMOPAPMAMMMMM MMAOOOAMOAMMMMMM MMMMMMOOOMMMMMMM MMMMMMMMMMMMMMMM } # tile 331 (kobold mummy) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMNMMMNMMMMMMMM MMMNONONOMMMMMMM MMMOAOAOMOPMMMMM MMMMONNMMMAMMMMM MMMONODNAMAAMMMM MMOLONNONAAAMAMM MMNALONANAAAAAMM MMNAOLOAOAAAAAMM MMMMNOLAAAAAAMMM MMMMNANAAAAMMMMM MMMOOANOAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 332 (gnome mummy) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMGMMMMMMMMM MMMMMGGFOMMMMMMM MMMMGGFFOOPMMMMM MMMMGDODFMMMMMMM MMMMMONOMMMAAAMM MMMNONOONOAAAAMM MMMOANLOAOAAAAMM MMMMNNOLOAAAAMMM MMMMNOANDAAMMMMM MMMMNOAOOMAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 333 (orc mummy) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMOAMMMMMMMMM MMMMNOOPMMMMMMMM MMMMDODPOPMMMMMM MMMMOOOAMMMMMMMM MMOOOOOOOAMAAMMM MMOOOOOOOMAAAMMM MMOAOOOAACCCMMMM MMOAOOOCCAAAMMMM MMMMOCCOAAAAAAMM MMMCCAOOAAAAMMMM MMOOOAOOOAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 334 (dwarf mummy) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMBMMMMMMMMM MMMMMBBEOMMMMMMM MMMMBBEEEOPMMMMM MMMMBDODEMMMMMMM MMMMMONOMMMAAAMM MMMNONOONOAAAAMM MMMOANLOAOAAAAMM MMMMNNOLOAAAAMMM MMMMNOANDAAMMMMM MMMMNOAOOMAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 335 (elf mummy) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMOMMMMMM MMMMMMMOOOPMMMMM MMMMMMOOOOPMMMMM MMMMMMOEOEAPMMMM MMMMMMOOOOAMMMMM MMMMMMAOOAMMMMAM MMMMMMOAAOMMAAAM MMMMMOOOOOOAAAAM MMMMOALOOLAOAAAM MMMMOADOOOAOAAMM MMMMMMOOAOAAMAMM MMMMMOOAMOOAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 336 (human mummy) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMONNOMMMMMMMMM MMMNNNNOPMMMMMMM MMPANANMOPPMMMMM MMPNNNNMMMMMMMMM MMONOONNPMMMMMMM MONLNNOOOMMMMMMM MNJNOOOOOMMAAAMM MOJOOOODNMAAAAMM MNJOLNOAOAAAAAAM MOCNOMNKNAAAAAMM MNMOOMOLAAAAAAAM MMMOOAOOAAAMMMMM MMNNNMNNNAMMMMMM MMMMMMMMMMMMMMMM } # tile 337 (ettin mummy) { MMMMMNNMMONOOMMM MMMNNOOONNOOOOMM MMMNOOOONOOOOOOM MMMOFOFOLOFOFOMO MMMOOOOOLOOOOOMP MMMNOOOOLNNOOOAM MMMONOOOLOOOOAAA MMOOOONNNNNNNOAA MONNNNNNOONOOOOA MONODNNOOOOOOOOA MNNAAONNONOAAOOA MNOAAONOONLAAOOA MOOOMONOONOOOOAA MMOOMNNOANOLOOAA MMMMMNOOANOOAAAA MMMOOOOOMOOOOKAA } # tile 338 (giant mummy) { MMMMMMONOOAAMMMM MMMMONNNOOOOAMMM MMMMNNOOOOOOOMMM MMMMNFFOOFFOOPMM MMMMNONOOOOOAOPM MMMMAONOOOOAAAPM MMMMMANOOODAAAAM MMOOOONOOONNNOAA MONNNNNOOOOOOOOA MONODNNLOOOOOOOA MNNAAONOLNOAAOOA MNOAAONOONLAAOOA MOOOMONOONOOOOAA MMOOMNNOANOLOOAA MMMMMNOOANOOAAAA MMMOOOOOMOOOOKAA } # tile 339 (troll mummy) { MMMMMMMMMMMMMMMM MMMMOOOMMMMMMMMM MMMODODOMMMMMMMM MMMOOOOOPMMMMMMM MMMOPNPOMPMMMMMM MOMONPNOPPMMMMMM OOOPOOOPOOPMMMMM OOPOPNPOOPPMMMMM OOPOOOOOPOAMMMMM MOOOPOOOOOAAAAMM MMOOPMPPOAAAAMMM MMMPOAOOAAAAAAMM MMMOOAOPMAAMAAMM MMOOOAOOAAMAAMMM MMOOAMMOAMMMMMMM MMMMMMMMMMMMMMMM } # tile 340 (red naga hatchling) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMKMMMMMMMMMMM MMMKLKMMMMMMMMMM MMMLLLAMMMMMMMMM MMMALAAMMMMMMMMM MMMLALAMMMMMMMMM MMMLLLAMMMMMMMMM MMMLLLAAMMMMMMMM MMMLDLAAMMMMMMMM MMMIDDAAAAADAMMM MMMIDDDAAADDAMMM MMMMIIDDDDDAMMMM MMMMMMMMMMMMMMMM } # tile 341 (black naga hatchling) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMKMMMMMMMMMMM MMMKLKMMMMMMMMMM MMMLLLAMMMMMMMMM MMMALAAMMMMMMMMM MMMLALAMMMMMMMMM MMMLLLAMMMMMMMMM MMMLLLAMMMMMMMMM MMMLALAAMMMMMMMM MMMAAAPAMMPAAMMM MMMAAAAPPPAAAMMM MMMMAAAAAAAAMMMM MMMMMMMMMMMMMMMM } # tile 342 (golden naga hatchling) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMKMMMMMMMMMMM MMMKLKMMMMMMMMMM MMMLLLAMMMMMMMMM MMMALAAMMMMMMMMM MMMLALAMMMMMMMMM MMMLLLAMMMMMMMMM MMMLLLAAMMMMMMMM MMMLHLAAMMMMMMMM MMMNHHAAAAAHAMMM MMMNHHHAAAHHAMMM MMMMNNHHHHHAMMMM MMMMMMMMMMMMMMMM } # tile 343 (guardian naga hatchling) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMKMMMMMMMMMMM MMMKLKMMMMMMMMMM MMMLLLAMMMMMMMMM MMMALAAMMMMMMMMM MMMLALAMMMMMMMMM MMMLLLAMMMMMMMMM MMMLLLAAMMMMMMMM MMMLFLAAMMMMMMMM MMMGFFAAAAAFAMMM MMMGFFFAAAFFAMMM MMMMGGFFFFFAMMMM MMMMMMMMMMMMMMMM } # tile 344 (red naga) { MMMMMMMMMMMMMMMM MMMMKKMMMMMMMMMM MMMKLLKMMMMMMMMM MMMLLLLAMMMMMMMM MMMALLAAMMMMMMMM MMMLAALAMMMMMMMM MMMLLLLAMMMMMMMM MMMLLLDAMMAAMMMM MMMLDLDAMAAAAMMM MMMIDDDAAAIIAMMM MMMIDDDAIDDDIDAM MMMIDDDIDDDDDDDA MMMIDDDDDDAAMDDA MMMMDDDDDAMMDDAM MMMMMDDAAMMDDAMM MMMMMMMMMMDAMMMM } # tile 345 (black naga) { MMMMMMMMMMMMMMMM MMMMKKMMMMMMMMMM MMMKLLKMMMMMMMMM MMMLLLLAMMMMMMMM MMMALLAAMMMMMMMM MMMLAALAMMMMMMMM MMMLLLLAMMMMMMMM MMMLLLAAMMMMMMMM MMMLALAAMMPPPMMM MMMAAAAPPPAAPMMM MMMAAAAPAAAAAAPM MMMAAAAAAAAAAAAP MMMAAAAAAAPPMAAP MMMMAAAAAPMMAAPM MMMMMAAPPMMAAPMM MMMMMMMMMMAPMMMM } # tile 346 (golden naga) { MMMMMMMMMMMMMMMM MMMMKKMMMMMMMMMM MMMKLLKMMMMMMMMM MMMLLLLAMMMMMMMM MMMALLAAMMMMMMMM MMMLAALAMMMMMMMM MMMLLLLAMMMMMMMM MMMLLLHAMMAAMMMM MMMLHLHAMAAAAMMM MMMNHHHAAANNAMMM MMMNHHHANHHHNHAM MMMNHHHNHHHHHHHA MMMNHHHHHHAAMHHA MMMMHHHHHAMMHHAM MMMMMHHAAMMHHAMM MMMMMMMMMMHAMMMM } # tile 347 (guardian naga) { MMMMMMMMMMMMMMMM MMMMKKMMMMMMMMMM MMMKLLKMMMMMMMMM MMMLLLLAMMMMMMMM MMMALLAAMMMMMMMM MMCLAALCMMMMMMMM MMLLLLLLMMMMMMMM MMCLLCLCMMAAMMMM MMMCLLCAMAAAAMMM MMMGLFCAAAGGAMMM MMMGFFFAAFFFGFAM MMMGFFFGFFFFFFFA MMMGFFFFFFAAMFFA MMMMFFFFFAMMFFAM MMMMMFFAAMMFFAMM MMMMMMMMMMFAMMMM } # tile 348 (ogre) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMCLLLCMMMMMMM MMLCKKLKKCLMMMMM MMMLAALAALJAMMMM MMMCLLLLLCJAMMMM MMMMCAAACJAAAMMM MMMMLDDDLAAAAMMM MMCLJLLLKALCAAMA MCLLAJJJJALLCAAA MLLCLAAAALCLLAAM MLAACLLLLCAALAAM MLCMHHHBHHACLAAA MLLMJJJJJJALLAAA MMMMCJJJCLAAAAAA MMLLLLLMLLLLLAAM } # tile 349 (ogre lord) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMCLLLCMMMMMMM MMLCKKLKKCLMMMMM MMMLAALAALJAMMMM MMMCLLLLLCJAMMMM MMMMCLLLCJAAAMMM MMMMLAAALAAAAMMM MMJKJLLLKAKJAAMA MCLKAJJJJAKLCAAA MLLJCAAAACJLLAAM MLAAJKCKKJAALAAM MLCMHHHBHHACLAAA MLLMJJJJJJALLAAA MMMMCJJJCLAAAAAA MMLLLLLMLLLLLAAM } # tile 350 (ogre mage) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMKOOOKMMMMMMM MMOKJJOJJKOMMMMM MMMOAAOAAOJAMMMM MMMCOOOOOKJAMMMM MMMMKAAACJAAAMMM MMMMOEEEOAAAAMMM MMKOJOHHJAOKAAMA MKOOAHDDHAOOKAAA MOOKOHDDHOKOOAAM MOAAKOHHOCAAOAAM MOKMPPPIPPAKOAAA MOOMJJJJJJAOOAAA MMMMKJJJKOAAAAAA MMOOOOOMOOOOOAAM } # tile 351 (ogre king) { MMMHMMCMMHMMMMMM MMMHDCHCDHMMMMMM MMMHHHHHHHMMMMMM MMLCKKLKKCLMMMMM MMMLAALAALJAMMMM MMMCLLLLLCJAMMMM MMMMCLLLCJAAAMMM MMMMLAAALAAAAMMM MMJKJLLLKAKJAAMA MCJKAJJJJAKJCAAA MLJJCAAAACJJLAAM MLAAJKCKKJAALAAM MLCMHHHBHHACLAAA MLLMJJJJJJALLAAA MMMMCJJJCLAAAAAA MMLLLLLMLLLLLAAM } # tile 352 (shadow ogre) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMNOOOOMMMMMMM MMONLLOLLNOMMMMM MMMOPPOPPOLPMMMM MMMNOOOOONLPMMMM MMMMNPPPNLPPPMMM MMMMOIIIOPPPPMMM MMNOLOOONPONPPMP MNOOPLLLLPOONPPP MOONOPPPPONOOPPM MOPPNOOOONPPOPPM MONMBBBIBBPNOPPP MOOMFFFFFFPOOPPP MMMMNFFFNOPPPPPP MMOOOOOMOOOOOPPM } # tile 353 (gray ooze) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMPBPAMMMMMMM MMMPBBBPBAMMMMMM MMBBNNBPPBAAMMMM MBBNNPPPBBPAAAMM PBBBPPPBPBBAAAMM BBBPBPPPPPBPAAAM BBPBPPPPPPPBAAAM PBPPBPPPBBPPAAAM MPBBPPPBAAPPPAAM MMMPBBBAAAKPPJMM MMMMMMMMACPPAKMM MMMMMMMMMKCCCJMM MMMMMMMMMMMMMMMM } # tile 354 (brown pudding) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMJMMM MMMMJKKJJJMMJJMM MMMKCKCJJJJJMMMM MMKKNNJNNJJJMMMM MMCJANJANJJJAMMM MMKKJJJJJCJJAAMM MMJKJJCJJJJJAAMM MMMJJJJJJJJAAAMM MMMMJJJJJJAAAMMM MMMMMAAAAAAAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 355 (moldy pudding) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMLMMM MMMMLPPLLLMMLLMM MMMPPPILLLLLMMMM MMPPOOLOOLLLMMMM MMPLAOLAOLLLAMMM MMPPLLLLLILLAAMM MMLPLLILLLLLAAMM MMMLLLLLLLLAAAMM MMMMLLLLLLAAAMMM MMMMMAAAAAAAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 356 (black pudding) { MMMMMMMMAMMMMMMM MMMMMMMMAAMMMMMM MMMMMAAAMMMMMMMM MMMMAAAAAMMMMMMM MMMMCACAAMMMMMMM MMMMDADAAMMMMMMM MMMMAAAAAMMMMMMM MMMMAAAAAMMMMMMM MMMMAAAAAMMMMMMM MMMMMAAAAAMMMMMM MMMMMAAAAAMMMMMM MMMMMMAAAAAMMMMM MMMMMMAAAAAAMMMM MMMMMMMAAAAAAMAM MMMMMMMMAAAAAAAA MMMMMMMMMMAAAAMM } # tile 357 (green slime) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMGMMM MMMMMGMMMMMMGMMG MGMMMMGMMGMNGNMG MMNGMNGGNGGGGGGG MMGGNGGNGGGFGGFM GGNGGGGGGGGGFFMG MNGGGGGFGFGMMMMM NGGGGFGGFGMGMMGF NGGFGGFMMGFMMMMM MMGGFMMGGFMMGMMM } # tile 358 (shoggoth) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMAAAAAMMMMMMM MMAAEAEAEAAMMMMM MMAAAAAAAEAAMMMM MMMAAAAAAAEAAMMM MMMMAAAAAAAEAMMM MMMMAAAAAAAEAMMM MMMAAAAAAAAAAMMM MMAAAAAAEAAAMMMM MMAAAAEEAAEAMMMM MMMAEEAAAAAEAMMM MMMEAAAAAAAEAMMM MMAAAAAAAAAAEAMM MAAAAAAAAAAAAAAM MMMMMMMMMMMMMMMM } # tile 359 (giant shoggoth) { MMMMAAAAAMMMMMMM MMAAAEEEAAAMMMMM MAAEEAAAEEAAMMMM MAAAAAAAAAEAAMMM MMAAAAAAAAAEAMMM MMMAAAAAAAAAEAMM MMMMAAAAAAAAEAMM MMMMAAAAAAAEAAMM MMMAAAAAAAAAAMMM MAAAAAAAEAAAMMMM MAAAAAEEAAEAMMMM MMAAEEAAAAAEAMMM MMEEAAAAAAAEAMMM MMAAAAAAAAAAEAMM MAAAAAAAAAAAAEAM AAAAAAAAAAAAAAAA } # tile 360 (quantum mechanic) { MMMMMMMMMMMMMMMM MMMMMMLLLLMMMMMM MMMFGGCLCGGFMMMM MMMGNNGLGNNGLMMM BMBGANGGGANGLMMM BMBFGGCLCGGFLMMM BIBMMCLLLCCLMMMM BILNMLLAALLAAAAM BILNNMLLLLJAAAAM BIBMNNJJJJNAAAMM BIBMBNNNONNNAAMM MBMMMNNNONNLAAMM MMMMMNBEBENAMAMM MMMMMNBEBENNMMMM MMMMNAAEBAANNMMM MMMMMMMMMMMMMMMM } # tile 361 (genetic engineer) { MMMMMMMMMMMMMMMM MMMMMMLLLLMMMMMM MMMKIIKLKIIKMMMM MMMINNILINNILMMM DGDIANIIIANILMMM GGGKIIKLKIIKLMMM MGAMMCLLLCCLMMMM MGLNMLLAALLAAAAM MGLNNMLLLLJAAAAM MGAMNNJJJJNAAAMM MGAMBNNNONNNAAMM MMGAMNNNONNLAAMM MMMMMNPEPENAMAMM MMMMMNPEPENNMMMM MMMMNAAEPAANNMMM MMMMMMMMMMMMMMMM } # tile 362 (Doctor Frankenstein) { MMMMMMMMMMMMMMMM MMMNNNNNNNNNNAMM MMNKDDKOKDDKONAM MNODNNDLDNNDLONA MMNDANDDDANDLOAM MNOKDDKLKDDKLONA MMMMMCLLLCCLAMMM MMMMMLAAALLAMMMM MMMMMMLLLLJAAAAA MMMMNNJJJJNOAAAA MMMNONNOCNONOAAA MMMLANNOONOALAAM MMMMMNNOCNOAAAMM MMMMMJJJJJKAAMMM MMMMPEEAMPEEAMMM MMMMMMMMMMMMMMMM } # tile 363 (rust monster) { MMMMMMMMMMMMMMMM MMMMEEEEMMMMMMMM MMMEEHEHEMMMMMMM MMMEEEAEEMMMMMMM MMMEEPAPEMMMMMMM MMMEPEAEPMMMEMMM MMMMEEEEMAAEEMMM MMMMEEEEEAAEEEMM MMMEEEEEEEAEAEEM MMEEEEEEAAAAEMMM MMEEAEEEEAEEEAMM MMAAEEEEEEEEEAAM MMMMAEEEEEEEAAAM MMMMMEEEEEAAMMAM MMMMMMAAAAMMMMMM MMMMMMMMMMMMMMMM } # tile 364 (disenchanter) { MMMMMMMMMMMMMMMM MMMMPPPPMMMMMMMM MMMPPDPDPMMMMMMM MMMPPPAPPMMMMMMM MMMPPOAOPMMMMMMM MMMPOPAPOMMMPMMM MMMMPPPPMAAPPMMM MMMMPPPPPAAPPPMM MMMPPPPPPPAPAPPM MMPPPPPPAAAAPMMM MMPPAPPPPAPPPAMM MMAAPPPPPPPPPAAM MMMMAPPPPPPPAAAM MMMMMPPPPPAAMMAM MMMMMMAAAAMMMMMM MMMMMMMMMMMMMMMM } # tile 365 (garter snake) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMKKAMMMMMMMMM MMMNAOKAMMMMMMMM MMMKCAKAMMMMMMMM MMMKKACAMMMMKAMM MMMMAPKAPMMKAPPM MMMMMPKAPPMCAPMM MMMMMKAAPMMKAPMM MMMMKAAPMMKAAPMM MMMMCAAPPKAAPMMM MMMMKAAKCAAPMMMM MMMMMKAAAAPMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 366 (snake) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMKKAMMMMMMMMM MMMNAOJAMMMMMMMM MMMCKJAJMMMMMMMM MMMKKAAJMMMMKKMM MMMFAAKJMMMCJAAM MMFAFACJAAMKJAMM MMMMMKJAAMMKJAMM MMMMKJAAMMKKJAMM MMMMKJAAAKJJAMMM MMMMCJJJJJJAMMMM MMMMMKJJJJAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 367 (water moccasin) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMAAAMMMMMMMMM MMMAAAAAMMMAAMMM MMMOAOAAAMAAMMMM MMMAAAMAAMAAMMMM MMMDAMMAAMAAMMMM MMDMDMAAAMMAAMMM MMMMMAAAMMMAAMMM MMMMMAAAMMMAAMMM MMMMAAAMMMAAAMMM MMMMAAAAAAAAMMMM MMMMAAAAAAAMMMMM MMMMMAAAAAMMMMMM MMMMMMMMMMMMMMMM } # tile 368 (pit viper) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMAAAMMMMMMMMM MMMAAAAAMMMAAAMM MMMOAAAAAMAAMAAM MMMAAMMAAMAAMAAM MMMDMMMAAMAAMMAM MMMMMMAAAMMAAMAM MMMMMMAAMMMAAMMM MMMMMAAAMMMAAMMM MMMMMAAMMMAAAMMM MMMMMAAMMAAAMMMM MMMMMAAAAAAMMMMM MMMMMMAAAAMMMMMM MMMMMMMMMMMMMMMM } # tile 369 (python) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMKKKAMMMMMJJMM MMMGAGJAMMMJJJMM MMJCKJAJMMKJJMMM MMKKKAJJMMKJJMAA MMKCAAKJAMCKJAAM MMMMMAKKAAMKJAAM MMMMKKJAAMMKJJAM MMMJJJAAMMKKJJAM MMMJJJAAAKJJJAMM MMMJJJJJJJJJAAMM MMMMJJJJJJJAAMMM MMMMMJJJJJAAMMMM MMMMMMMMMMMMMMMM } # tile 370 (cobra) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMAAAMMMMMMMMM MMMAAAAAAMMMMMMM MMPAMMAAAAMMMMMM MMAMMAAAAAMMAAMM MMDMMAAAAAMMMMAM MMMMMMAAAMMMMMAM MMMMMMAAMMAAAAMM MMMMMAAMMAAMMMMM MMMMAAMMMAAMMMMM MMMMAAMMMMAAAAMM MMMMAAAMMMMMMAAM MMMMMAAAAAAAAAMM MMMMMMMMMMMMMMMM } # tile 371 (king cobra) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMAAAMMMMMMMMM MMMAAAAAAMMMMMMM MMPAMMOAOAMMMMMM MMAMMAAOAAMMAAMM MMDMMAAAAAMMMMAM MMMMMMAAAMMMMMAM MMMMMMAAMMAAAAMM MMMMMAAMMAAMMMMM MMMMAAMMMAAMMMMM MMMMAAMMMMAAAAMM MMMMAAAMMMMMMAAM MMMMMAAAAAAAAAMM MMMMMMMMMMMMMMMM } # tile 372 (weresnake) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMLLAMMMMMMMMM MMMDADLAMMMMMMMM MMMLLAKAMMMMMMMM MMMLLAKAMMMMKAMM MMMMAPKAPMMKAPPM MMMMMPCAPPMKAPMM MMMMMKAAPMMKAPMM MMMMKAAPMMCAAPMM MMMMKAAPPKAAPMMM MMMMCAAKKAAPMMMM MMMMMKAAAAPMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 373 (asphynx) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMBBAMMMMMMMMM MMMNAOBAMMMMMMMM MMMBBABAMMMMMMMM MMMBBABAMMMMBAMM MMMMAPBAPMMBAPPM MMMMMPBAPPMBAPMM MMMMMBAAPMMBAPMM MMMMBAAPMMBAAPMM MMMMBAAPPBAAPMMM MMMMBAABBAAPMMMM MMMMMBAAAAPMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 374 (troll) { MMMMMMMMMMMMMMMM MMAAAAAAMMMMMMMM AAAANANAMMMMMMMM MAAKKKJJAMMMMMMM AAACAAAKAMMMMMMM AKAKAAACAAMMMMMM KKJAKKKAJKAMMMMM KJAKAAAJJJAMMMMM CJAJKCJJKKAMMMMM MKJJAFGFJJAAAAMM MMKJAMPFJAAAAMMM MMMAFAGFAAAAAAMM MMMGFAGPMAAMAAMM MMKJJAKJAAMAAMMM MMKKAMMKAMMMMMMM MMMMMMMMMMMMMMMM } # tile 375 (ice troll) { MMMMMMMMMMMMMMMM MMOONOOOMMMMMMMM NONOAOAOOMMMMMMM MNOKKKJJOMMMMMMM NOJKAAAKOOMMMMMM OKJCAAAKAOMMMMMM KKJAKCKAJKAMMMMM KJAJAAAJJJAMMMMM CJAJKKKJKKAMMMMM MKJJAEBEJJAAAAMM MMKKAMPEJAAAAMMM MMMAEABEAAAAAAMM MMMBEABPMAAMAAMM MMKJJAKJAAMAAMMM MMCJAMMCAMMMMMMM MMMMMMMMMMMMMMMM } # tile 376 (rock troll) { MMMMMMMMMMMMMMMM MMMAAAAAMMMMMMMM MAAANANAAAAMMMMM MAAKKKJJAAMMMMMM AAAKAAAKAAAAMMMM AKACAAAKAAAMMMMM KKJAKKCAJKAAMMMM KJAJAAAJJJAMMMMM CJAPAKJJKJAMMMMM PKJPPAGFJJAAAAMM PPPPPAFFJAAAAMMM MPPPAAGFAAAAAAMM MMMAFAGFMAAMAAMM MMKJJAKJAAMAAMMM MMKKAMMKAMMMMMMM MMMMMMMMMMMMMMMM } # tile 377 (two-headed troll) { MMMMMMMMMMMMMMMM MAAAAAAAAAAMMMMM MANANAANANAAMMMM MKKKJKKKKJKAAMMM ACAAACKAAAKAAMMM AKAAAKCAAAKAMMMM KAKKKAAKCKAAAMMM KKAAAAAAAAAAMMMM CJAPAKJJKKAAAMMM PKJPPAGFJJAAAAMM PPPPPAFFJAAAAMMM MPPPAAGFAAAAAAMM MMMAFAGFMAAMAAMM MMKJJAKJAAMAAMMM MMCJAMMKAMMMMMMM MMMMMMMMMMMMMMMM } # tile 378 (water troll) { MMMMMMMMMMMMMMMM MMMAAAAAMMMMMMMM MMAANANAAMMMMMMM MAAKKKJJAAMMMMMM MAAKAAAKAAMMMMMM MKACAAAKAAMMMMMM KKJAKKCAJKAMMMMM KJAJAAAJJJAMMMMM CJAJKKJJKJAMMMMM MKJKAEBEJJAAAAMM MMKJAMPEJAAAAMMM MMMAEABEAAAAAAMM MMMBEABPMAAMAAMM MMCJJAKJAAMAAMMM MMKJAMMKAMMMMMMM MMMMMMMMMMMMMMMM } # tile 379 (Olog-hai) { MMMPPPPPMMMMMMMM MMPPAAAPPMMMMMMM MMPANANAPMMMMMMM MMPAAAAAPMMMMMMM MPPAAAAAPPMMMMMM PPPAAAAAPPPMMMMM AAPPAAAPPAAMMMMM AAAPPPPPAAAMMMMM AAAPPPPPAAAMMMMM MAAAAPPPAAAPPPMM PONNNNNNAACPPMMM MMMAPAPPAPPPPPMM MMMPPAPPMPPMPPMM MMAAAAAAAPMPPMMM MMAAAMAAAMMMMMMM MMMMMMMMMMMMMMMM } # tile 380 (black troll) { MMMMMMMMMMMMMMMM MMNNNNNNMMMMMMMM NNNNDNDNMMMMMMMM MNNAAAAANMMMMMMM NNNABBBENMMMMMMM NENABBBENNMMMMMM EAAPEEEPAEPMMMMM EAPAPPPAAAPMMMMM EAPAEEAAEAPMMMMM MEAAPDCDAAPPPPMM MMEAPMKDAPPPPMMM MMMPDPCDPPPPPPMM MMMCDPCKMPPMPPMM MMEAAPEAPPMPPMMM MMEAPMMEPMMMMMMM MMMMMMMMMMMMMMMM } # tile 381 (umber hulk) { MMMMMMMMMMMMMMMM MMMAAAAAMMMMMMMM MMAAAAAAAMMMMMMM MADADADADAMMMMMM MAAAAAAAAAMAMMMM MAAAOAOAAAMAAMMM MAMAOAOAMAAAMMMM MAMAAAAAPAAMMMMM MAAAAAAAPMMMMMMM MAMAAAAAMPPPPPPM MMMAAMAAMPPPPPMM MMMAAMAAPPPPPPPM MMMAAPAAPPPPMMMM MMAAAPAAAPPMMMMM MAAAPMMAAPMMMMMM MMMMMMMMMMMMMMMM } # tile 382 (water hulk) { MMMMMMMMMMMMMMMM MMMEEEEEMMMMMMMM MMEEEEEEEMMMMMMM MEIEIEIEIEMMMMMM MEEEEEEEEEMEMMMM MEEEBEBEEEMEEMMM MEMEBEBEMEEEMMMM MEMEEEEEAEEMMMMM MEEEEEEEAMMMMMMM MEMEEEEEMAAAAAAM MMMEEMEEMAAAAAMM MMMEEMEEAAAAAAAM MMMEEAEEAAAAMMMM MMEEEAEEEAAMMMMM MEEEAMMEEAMMMMMM MMMMMMMMMMMMMMMM } # tile 383 (vampire) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMAAAMMMMMMMM MMMMAAOAAMMMMMMM MADDAGAGADAMMMMM MMADALLOADMMMMMM MAAAAAAAAAMMMMMM MMAAAAAAAAMMMMMM MMMAAAAAAAMMMMMM MMADAAAAAAPPPPPM MMADDAAAAAPPPPMM MMAAAAAAAAPPPMMM MMMMMAAPAAPPMMMM MMMMAAPMMAPMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 384 (vampire lord) { MMMMMMMMMMMMMMMM MMMMMAAAAMMMMMMM MNMMAAOOAAMMMMMM MNDDAGAAGADAMMMM MNADALLLOADMMMMM AAAAAAAAAAAMMMMM AAAAAAAAAAAMMMMM MAAAAAAAAAAMMMMM MNAAAAAAAAAMMMMM MNMAAAAAAAAPPPPP MNADAAAAAAAPPPPP MNADDAAAAAAPPPPM MNAAAAAAAAAPPPMM MNMMMAAAPAAPPMMM MNMMAAPPMMAPMMMM MMMMMMMMMMMMMMMM } # tile 385 (fire vampire) { MMMMMMMMMMMMMMMM MMMMPHPMMPPMMMMM MMPPHPPPHPHPMMMM MMPHCPPHCHPHPPMM MPHCHPHCDCHCHPPM MPHDHPPHDHPHCHPM MHCDCHPHCHPHDHMM MMHCHPPPCPHCDCHM MMMHPPPMHMPHCHMM MMMMMPMMHMMMHMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM AAAAAAAAAAAAAAAA } # tile 386 (star vampire) { MMMMMMMMMMMMMMMM MMMMMMKPMMMMPMMM MMMPMKPOPMPPMPMM MMPOPMOPMPPOPMPM MPOPPMPKMPOPPMPM MPOPPMKPMPOPPMPM MMPPMKPKPMPPMPMM MPMMMKKPKMMMPMPM MPMMKMKKMMPPMMPM MMPMKMMMDMMPMPMM MMPMDMMMDMMPMPMM MMMMDMMDMMPMMMMM MMMMMMMDMMPMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 387 (vampire mage) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMAAAMMMMMMMM MMMMAAOAAMMMMMMM MADDAGAGADAMMMMM MMADALLOADMMMMMM MAAAAMAMAAMMMMMM MMAAAACAAAMMMMMM MMMAAADAAAMMMMMM MMADAAAAAAPPPPPM MMADDAAAAAPPPPMM MMAAAAAAAAPPPMMM MMMMMAAPAAPPMMMM MMMMAAPMMAPMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 388 (Vlad the Impaler) { MMMMMMMMMMMMMMMM MMNMMAAAAMMMMMMM ADNDAAOOAADDDAMM MANDAGAAGADDAMMM MMNDALLLOADAMMMM MMNAAAAAAAAAAAAA MHHHDAAAAADDDDDA HEHEHJAAAADDDAAM LLLLLJAAAADDAAPP MLLLJAAAAADDAPPP MMNJDAAAAADAPPPP MANDDAAAAAAAPPPP MANAAAAAAAAPPPPM MMNMMAAAPAAPPPMM MMNMAAPPMMAPMMMM MMMMMMMMMMMMMMMM } # tile 389 (barrow wight) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMLLOMMMMMMMMMM MMDLDLOMMMMMMMMM MMLLLLOMMMMMMMMM MMLJLMMPMMMMMMMM MMOOOMPPMMMAAAAM MMPOOMPPMAAAAAAM MLPOOMPPMPAAAAMM MJJOOMPPMPAAAAMM MJMOMMPLMPPAAAMM MJMOMPPPPPPAAAMM MJMMMPPPPPPPAAMM MJMMLLPPPPPPAMMM MJMMMMMLLAAMMMMM MMMMMMMMMMMMMMMM } # tile 390 (wight) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMOONMMMMMMMMMM MMDODONMMMMMMMMM MMOOOONMMMMMMMMM MMOJOMMBMMMMMMMM MMNNNMBBMMMAAAAM MJBNNMBBMAAAAAAM MOBNNMBBMBAAAAMM MJMNNMBBMBAAAAMM MJMNMMBOMBBAAAMM MMJNMBBBBBBAAAMM MMJMMBBBBBBBAAMM MMJMOOBBBBBBAMMM MMMMMMMOOAAMMMMM MMMMMMMMMMMMMMMM } # tile 391 (wraith) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMPPPPPMMMMMMMM MMMPAAPPPMMMMMMM MMMMPAAPPMMMMMMM MMMMPAAPPMMMMMMM MMPPMPPPMPMMMMMM MOLAPPPMPPMMMMMM MMAAPPPPAPMMAAAM MMPPPPPOLPAAAAAM MMMAMPPAAAAPPAMM MMMMMPPAPPPPAMMM MMMMMMPPPPAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 392 (Nazgul) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMPPPPPMMMMMMMM MMMPAAPPPMMMMMMM MMMMPAAPPMMMMMMM MMMMPAAPPMMMMMMM MMPPMPPPMPMMMMMM MOLAPPPMPPMMMMMM MOPAPPPPAPMMAAAM MMPAPPPPAPMMAAAM MMPAMPPPLPMMAAAM MMPPMPPOLPAAAAAM MMMAAPPOAAAPPAMM MMMMMPPAPPPPAMMM MMMMMMPPPPAMMMMM MMMMMMMMMMMMMMMM } # tile 393 (xorn) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMOBMOPMBPMMMMM MMMBBBBPPPPMMMMM MMMBMMMMMMMMMMMM MMMDDBBMBDDAMAMM MMMDDBBMPDDAAAAM MMMBMMMMMMMAAAAM MMMBOBMBPPMAAAAM MMMBBBMPPPMAAAAM MMMBMMMMMMMAAAMM MMMBOBBPPBPAAMMM MMMBOMBPMPPAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 394 (monkey) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMKKAMMMMMM MMMMMMKLLJAMMMMM MMMMMMCLLJAMMMMM MMMMMMMKJAMMMMMM MMMMMKKKCKJAAMMM MMMMKKKLLJJJAAMM MMMMLAKLLJALAAMM MMMMMMCJJJAAAAMM MMMMMMJAAJAAAMMM MMMMMJJAMJJAMMMM MMMMMMMMMMMMMMMM } # tile 395 (ape) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMKKCJMMMMMM MMMMMJJJJJJMMMMM MMMMKCELECJJMAAM MMMMKLLLLCAJAAAA MMMKCCLACCAJJAAA MMKKKKCCCAJKJJAA MMCKAKJAAJJAJJAA MMKAAKJJJJJAAJAA MMLCMCJJJJJCCLAA MMLLMCJJAKLJLLAA MMMMMCLJACLJAAAA MMMLLLLJACLLLKAM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 396 (owlbear) { MMMMMMMMMMMMMMMM MMMMKMMMMMKMMMMM MMMMCCMMMKCMMMMM MMMMCKKCKKKMMMMM MMMKOOOKOOOKMMMM MMMKOOOKOOOKAMMA MMMCOOAKAOOCAAAA MMCKCJJHJJKAKAAA MCKKKCKLKCAJJKAA MKKJJJCKKJJJJJAA MCJJJPACJPJJJJAA MMKJJJAKJJJJJAAA MMMJJPAKJPJJAAAM MMMJAAJAJAAJAAMM MMMPJPJAJPJPAMMM MMMMMMMMMMMMMMMM } # tile 397 (yeti) { MMMMMMMMMMMMMMMM MMMMBNNNMMMMMMMM MMMBNANAPMMMMMMM MMBNNNNNNPMMMMMM MMNNNADANNMMMMMM MMNNNNNNPNMMMMMM MMNMNNBPPNPMMMMM MMNMNNNNANPMMAAM MMNNBNNNPNMAAAAM MMMMNNNNPMKAAAMM MMMMNNMNPAKCAAMM MMMMNBMNPAACKAAM MMMMNNANPAAKCJAM MMMBNNANNPAACKAM MMBNNAMMNNAMMMMM MMMMMMMMMMMMMMMM } # tile 398 (carnivorous ape) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMKCKJMMMMMM MMMMMJJJJJJMMMMM MMMMKCELECJJMAAM MMMMKLLLLCAJAAAA MMMCKCAAACAJJAAA MMKKKCDDDCAKJJAA MMKCAKCCCAJAJJAA MMKAAKJAAJJAAJAA MMLCMAJJJJJKCLAA MMLLDDAJAKLJLLAA MMMDDALJACLJAAAA MMDDALLJACLLLKAM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 399 (sasquatch) { MMMMMMMMMMMMMMMM MMMMCCCCCMMMMMMM MMMCGAJGAJMMMMMM MMCCKKKJJJMMMMMM MMCKKAAAKJJMMMMM MCKKCAAACKJMMMMM MCKKKKKKKKCJMMMM MCKAJKJKJAKJMMMM MCKAJKCKJAKJMAAM MCCJAJKJACKJAAAA MCKJAJJJACCJAAAM MMJMAJAKKAJAAAAA MMMCKJACKJAAAAAM MKCCJJACKJKJAAMM MCJJJKACKKJKAMMM MMMMMMMMMMMMMMMM } # tile 400 (zruty) { MMMMMMMMMMMMMMMM MMMMMMFFGFMMMMMM MMMMOOFGFFFFMMMM MMMAOFGFOOKFFMMM MMMFFGFAOAJKKFMM MMFFFFFFJAAKKKMM MMODOFFJAJJKCJAM MMDDDDJAJJKJJAAM MMJODOAJJJAJJAAA MKKJAJJKKJAJJAAA MCKAAJKKCKJAAAAA MMMAJJCKKKJJAAAA MMMKJJAAAAKJAAAM MMKKJJJAAKJJJMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 401 (kobold zombie) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMNMMMNMMMMMMMM MMMNGFBNMMMMMMMM MMMGABABMMMMMMMM MMMMGBFAMMAMMMMM MMMGBABFAMAAMMMM MMGFBBBIKAAAMAMM MMBAFBFFEAAAAAMM MMBAFBFFAAAAAAMM MMMMFBFAAAAAAMMM MMMMBABAAAAMMMMM MMMBBABBAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 402 (gnome zombie) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMGMMMMMMMMM MMMMMGFFMMMMMMMM MMMMGGFFFMMMMMMM MMMMGDFDFMMMMMMM MMMMMPFPMMMAAAMM MMMFGFPFEGAAAAMM MMGAAGFFFAGAAAMM MMMMAKNKFAAAAMMM MMMMFGAFFAAMMMMM MMMMGFAFGMAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 403 (orc zombie) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMOAMMMMMMMMM MMMMNOPAMMMMMMMM MMMMGPGAMMMMMMMM MMMMMPFAMMMMMMMM MMKCCAKKKAMAAMMM MBBPCKKMBBAAAMMM BBMAGGFAABBAMMMM BMMAJJPAAABAMMMM MMMMBAPPPAAAAAMM MMMBJAAEPAAAMMMM MMBPPAAAPPMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 404 (dwarf zombie) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMBMMMMMMMMM MMMMMBEEMMMMMMMM MMMMBBEEEMMMMMMM MMMMBFFFEMMMMMMM MMMMMPFPMMMAAAMM MMMBBPPPEEAAAAMM MMFBABPEAEAAAAMM MMFMEBBEFAAAAMMM MMMMEBAEEAAMMMMM MMMMBEAEBMAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 405 (elf zombie) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMGMMMMMM MMMMMMMGGFMMMMMM MMMMMMGGGGAMMMMM MMMMMMFEFEAMMMMM MMMMMMFFFFAMMMMM MMMMMMAFDAMMMMAM MMMMMMGAAGMMAAAM MMMMFFGGGFFFAAAM MMMFAAAGFAAAFAAM MMMMMAGGGFAAAAMM MMMMMMGFAFAAMAMM MMMMMKDAMFKAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 406 (human zombie) { MMMMMMAAAMMMMMMM MMMMMFFGAAMMMMMM MMMMMAGAFAMMMMMM MMMMMFFGFAMMMMMM MMMMFKFMMJJMMMMM MMMMJJJFJKJMMMMM MMMFJMKJJAKJMMMM MMFKMMKFJFFJMMMM MMGMMMCKJGMMMMMM MMMMMBPMBPAAAAAM MMMMMFPAPFAAAAMM MMMMMBFABFAAAAMM MMMMMPFABPAAMMMM MMMMMBFABFAMMMMM MMMMGGAGGAMMMMMM MMMMMMMMMMMMMMMM } # tile 407 (ghoul) { MMMMMMAAAMMMMMMM MMMMMOOOAAMMMMMM MMMMMDODOAMMMMMM MMMMMOOOOAMMMMMM MMMMPPOOOPPMMMMM MMMMPPPPPPPMMMMM MMMPPMPPPAPPMMMM MMPPMMPPPOOPMMMM MMOMMMPPPOMMMMMM MMMMMPPMPPAAAAAM MMMMMPPAPPAAAAMM MMMMMPPAPPAAAAMM MMMMMPPAPPAAMMMM MMMMMPPAPPAMMMMM MMMMOOAOOAMMMMMM MMMMMMMMMMMMMMMM } # tile 408 (ghoul mage) { MMMMMMNOMMMMMMMM MMMMMNOOOMMMMMMM MMMMMDODOMMMMMMM MMMMMNOOOMMMMMMM MMMMNONOPONMMMMM MMMMNOPPOOOMMMCM MMMHOMNOOAOHMCMM MMNOMMNOOAMONMMM MMOMMMHHHOMCMMMM MMMMMNOANOCAAAAM MMMMMNOANOAAAAMM MMMMMNOANOAAAAAM MMMMMNOANOAAMMAM MMMMMNOANOAMMMMM MMMMOOAOOAMMMMMM MMMMMMMMMMMMMMMM } # tile 409 (ettin zombie) { MMMMNNMMONOPMMMM MMNNOOPNNOOPPMMM MMNFFMMNFFMMPMMM MMADFFDADFFDAMMM MMAFFFFAFFFFAMMM MMAFAAFAFAAFAAMM MMAFFFFAFFFFAAAM MMGIIIIJJJIIIGAA MGFFFIIIIIIFFFGA MGFFFFIIIIFFFFFA MFFAAFIIIIFAAFFA MFFAAIIIIIIAAFFA MFFFMIIFFIIAGFAA MMFFMGFAAGFAFFAA MMMMMGFAAGFAAAAA MMMFFFFAMGFFFFAA } # tile 410 (ghast) { MMMMMMAAAMMMMMMM MMMMMOOOAAMMMMMM MMMMMDODOAMMMMMM MMMMMOOOOAMMMMMM MMMMJJOOOJJMMMMM MMMMJJJJJJJMMMMM MMMJJMJJJAJJMMMM MMJJMMJJJOOJMMMM MMOMMMJJJOMMMMMM MMMMMJJMJJAAAAAM MMMMMJJAJJAAAAMM MMMMMJJAJJAAAAMM MMMMMJJAJJAAMMMM MMMMMJJAJJAMMMMM MMMMOOAOOAMMMMMM MMMMMMMMMMMMMMMM } # tile 411 (giant zombie) { MMMMMMJJJJAAMMMM MMMMJJJJJJJJAMMM MMMMJJFFFFJJAMMM MMMMJDDFFDDJAMMM MMMMJFFFFFFJAMMM MMMMAFFAAFFAAAMM MMMMMAFFFFJAAAAM MMGGFFJJJJFFGGAA MGFFFGGFFFFFFFCA MFFFKFFFFFFKFFFA FFFAAFFFFFFAAFFA FFAAMJJJCKJAAFFA FFAMMJJJJJKAGFAA MMMMMGFAGFFAFFAA MMMMGFFAGFFAAAAA MMMGFFAAGFFFAAAA } # tile 412 (skeleton) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMOOOMMMMMMMMMM MMAOAOOMMMMMMMMM MMOOOOOMMMMMMMMM MMOOMOMMMMMMMMMM MMMMMMOMMMMMMMMM MMMMOOOOOMMMAAAM MMMOAMOOOAMMAAAM MMOAMOAAOMAAAAAM MMMMOAMOOOAAAMAM MMMMMMOOOAAAMAMM MMMMMOMAOMAMMMMM MMMOOOAMOAMMMMMM MMMMMMOOOMMMMMMM MMMMMMMMMMMMMMMM } # tile 413 (ghoul queen) { MMMMMMNOMMMMMMMM MMMMMHHHHMMMMMMM MMMMMDODOMMMMMMM MMMMMNOOOMMMMMMM MMMNNNOOPONMMMMM MMMNOOPPOOONMMMM MMNONLOOLOPONMMM MNONOLOOLOOMONMM MOMNNLOOLOPMAOAM MMMNONNNOPOAAAAA MMMNNOOONOPAAAAA MMMMNNNNNPOAAAAA MMMMNOOANOOAAAAM MMMMNOAANOAAMMAM MMMOOOAMOOAMMMMM MMMMMMMMMMMMMMMM } # tile 414 (gug) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMOOLMMMMMMMMMM MMAOAOLMMMMMMMMM MOOOLOLMMMMMMMMM MOLLMOLMMMMMMMMM MLLMOOOLMMMMAAAM MMMOLOOOLMAAAAAA MMOLAOLOLAAAAAAA MOLAOLAOLAAAAAAA MOAOLAOOLAAAAMAA MMOLAOLOLAAAMAAM MMMMOLAOLAAMMAMM MMMOOLAOLAAMAAMM MMMMMMOOLAMMMMMM MMMMMMMMMMMMMMMM } # tile 415 (straw golem) { MMMMMMLJMMMMMMMM MMMMMMLJHJMMMMMM MMMMHJLJHMMMAMMM MMMMAAAAALMMMMMA MMMMDAADALMAMAAM MMMMLJHJLMMAAAAM MMMMLLHJLHHCHHLM MMMHHLJLMAJLJLMA MHHJJLLLLAAAMAAM MMJLMMLALHAAAAAA MLLMMCJLHJHAAAAA MMMMMHJLAHJHAAAM MMMMMHJAACALHAAA MMMMCJLAAJHALHAM MMMMHALAMAHAALMM MMMMMMMMMMLMMMMM } # tile 416 (paper golem) { MMMMMMMMMMMMMMMM MMMMMMMOAMMMMMMM MMMMMNNNOAMMMMMM MMMMMONNNOAMMMMM MMMMMMONNOAMMMMM MMMMMMMNOAMMMMMM MMNNOAMNOAMMMMMM MMNONOAOAONNOAMM MMOAOANNOAOOOAMM MMMMMMNNNOAAAAAM MMMMMMONOAAAAAAM MMMMMMMOOAAAAAAM MMMMMNOAAOAAAAAM MMMMMNOAMMNOAAMM MMMMOOAMMMOOAMMM MMMMMMMMMMMMMMMM } # tile 417 (wax golem) { MMMMMMMMMMMMMMMM MMMMMMMMMPAMMMMM MMMMMMMMPAMMMMMM MMMMMMMMPAMMMMMM MMNPAMMNOAMMMMMM MNOAPAMNOAMNOAMM NOANOAMNNANOPAMM OAMNOANPANOANOAM PAMNONONOOAANOAM PAMMMOANOAAAPAAA MPAMMMMNOAAAPAAA MMMMMMNAOAAAAPAA MMMMMNOANOAAAAAA MMMMMOAAANPAAAAM MPAMNOAAMMNNAPAM MMPPNOAMMMOPPAMM } # tile 418 (plastic golem) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMCCAMMMMMM MMMMMMCIICAMMMMM MMMMMMCIICAMMMMM MMMMMMCIICAMMMMM MMMCCAMCCAMCCAMM MMCIICCPPCCIICAM MMMCCAPDDPACCAMM MMMMMMDPPDAAAAAM MMMMMMCDDCAAAAAM MMMMMCACCACAAAAM MMMMCICAACICAAMM MMMMCICAMCICAMMM MMMMMCAMMMCAMMMM MMMMMMMMMMMMMMMM } # tile 419 (rope golem) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMOOOMMMMMMM MMMMMOMMMOMMMMMM MMMMMOMMMOMMMAAM MOOMMMOMMOMMAMMA OMMOMMMLLMMOOMMA MMMOMMMLOOOMAOAM MMMMOOOOOAAAAOMM MMMMMMMOOMMAAMAM MMMMMMMLOMAAMMMA MMMMMMOMMOOAAMMA MMMMOOMMAMMOMAMM MMMOMMAAMMMOMAMM MMMOMAMMMMOAAMMM MMMMOAMMMMMMMMMM } # tile 420 (gold golem) { MMMMMMMMMMMMMMMM MMMMMMHNHMMMMMMM MMMMMMDNDMMMNMMM MMMMMMHNHMMMJCMM MMMMMMHNHMMMNCMM MMMHHHAAAAHANCMM MMHNJNHNHNJNACMA MMHHHHHHHHHHHAMA MNCACCCCCCCCAMMA MHHMAAAAAAAAAMAA MNHMANCMAHNCMAAA MNJMAHCMAHHCMAAA MMHMANCMAHNCMAAA MMMMHJCMAHJCMAAM HMMMHNCMAHNCMAMH MMHMMMMMMMMMMMMM } # tile 421 (leather golem) { MMMMMMKCKKMMMMMM MMMMMKHKHJMMMMMM MMMMKACKJJAMMMMM MMMCKAJJJJAJMMMM MMKKJJAJAAKJJMMM MKCKJJAACKCJJJMM MMKKKJJAKKJJJJMM MMMKKJJJAMAAAMAM MMMMAAAAMKJAAAAM MMMMKJAAACKAAAAA MMMCJJAAMKJJAAAM MMMKKJAMMCKJAAAM MMKCJJJAKKJJJAAM MMKKKJJAKCKJJAMM MMMCJJAMMKJJAMMM MMMMKAMMMMKAMMMM } # tile 422 (wood golem) { MMMMMMMMMMMMMMMM MMMMMMKCKJMMMMMM MMMMMMHCHJMMCMMM MMMMMMKCKJMMCKMM MMMMMMCCKJMMCKKM MMMKKKAAAAKACKJM MMKCCCCCCCCCACJA MMKKCKKCKKCKKAJA MCJAJJJJJJJJAMMA MCKJAAAAAAAAAMAA MCCJACKJAKCKJAAA MCKJACKJAKCKJAAA MMKJACCJACCKJAAA MMMMKCKJAKCKJAAM MMMMKCKJAKCCJAMM MMMMMMMMMMMMMMMM } # tile 423 (flesh golem) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMDMMDDCMMMMMMM MMMMMDLDDLMMMMMM MMDDMMLLLLCMDMMM MMMCDLMLLLLADLMM MMCLDLAMCLLAMLLM MMLLLAAMLLCAMMLM MCLLAAMCLLAAMMCA MLLAMMCLLALLAAAA MMLAMCLCAALCAAAA MMMAMMLLCACLCAAA MMMMLLALLAALLAAA MMCLLLAAAADLLAMM MMLLDDDMMDDDDDMM MMMMMMMMMMMMMMMM } # tile 424 (clay golem) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMLCCCCKMMMMMM MMMLKKKCKKCMMMMM MMMCCAKKAKKMMMMM MMMCKAKCAKKMMMMM MLCKKCKKKCKLCMMM CKKKKKKCKKCKKJMM KCKJCKJJCKJCKJAA MJJAKKJAKKAJJAAA MMAKCKJACKKAAAAA MMCKKKKKKCKKAAAA MMCCKCAACKCKAAMM MMCKKKAMCKKKAAMM MMMMMMMMMMMMMMMM } # tile 425 (stone golem) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMBBBPPMMMMMMM MMMBBPPPPPMMMMMM MMMBHAPHAPMMMMMM MMMPPPPPPPMMMMMM MBBPPPPPPMBPAMMM BPPPPMMMMPPPPAAM BPPMBPPPPMPPPAAA MPPMBPMPPMPPPAAA MMMBPPMPPPAAAAAA MMBPPPAPPPAAAAAM MMPPPPAPPPPAAAMM MMMPPAAMPPPAMMMM MMMMMMMMMMMMMMMM } # tile 426 (glass golem) { MMMMMMMMMMMMMMMM MMMMMBBBBBBAMMMM MMMMMBPNPPPAMMMM MMMMMBNPPPNAMMMM MMMMMNPPPNPAMMMM MMMMMBPPNPPAMMMM MMMMMMMBAMMMBAMM MBNBBABPBAMBPNAM MNPPNABPNBBANPBA MMMMMBPNPPPAABAA MMMMMBNPPPAAAAAA MMMMMMBPPNAAAAAA MMMMBNABNABPAAAM MMMBNPAMMMBNAAAM MMBNPAMMMMNPAAMM MMMBAMMMMMBPAMMM } # tile 427 (iron golem) { MMMMMMMMMMMMMMMM MMMMMMPBPMMMMMMM MMMMMMHBHMMMBMMM MMMMMMPBPMMMJPMM MMMMMMPBPMMMBPMM MMMPPPAAAAPABPMM MMPBJBBBBBJBAPMA MMPPPPPPPPPPPAMA MBMAMMMMMMMMAMMA MBPMAAAAAAAAAMAA MBPMABPMAPBPMAAA MBJMABPMAPBPMAAA MMPMABPMAPBPMAAA MMMMPJPMAPJPMAAM MMMMPBPMAPBPMAMM MMMMMMMMMMMMMMMM } # tile 428 (Frankenstein's Monster) { MMMMMPPPPPPAMMMM MMMMMPGFPFPAMMMM MMMMMPGFFFPAMMMM MMMMMPAGFAPAMMMM MMMMMPGFFFPAMMMM MMMMMMGAAFAMMMMM MMMMMKKGGKKAMMMM MMMMKKJJKJKKAMMM MMMKFJKJJJKFCAAA MMMGFAKFJFAGFAAA MMMGFAGFFFAGFAAA MMMGAMKJJJAAGAAA MMMMMGKKJJFAAAAA MMMMMGFJJGFAAAAM MMMMMGFAMGFAAAMM MMMMGFAMMMGGAMMM } # tile 429 (ruby golem) { MMMMMMMMMMMMMMMM MMMMMMCDCMMMMMMM MMMMMMKDKMMMDMMM MMMMMMCDCMMMJCMM MMMMMMCDCMMMDCMM MMMCCCAAAACADCMM MMCDJDDDDDJDACMA MMCCCCCCCCCCCAMA MDCAKKKKKKKKAMMA MDCKAAAAAAAAAMAA MDCKADKMACDKMAAA MDJKADKMACDKMAAA MMCMADKMACDKMAAA MMMMCJKMACJKMAAM MMMMCDKMACDKMAMM MMMMMMMMMMMMMMMM } # tile 430 (diamond golem) { MMMMMMMMMMMMMMMM MMMMMMONOMMMMMMM MMMMMMENEMMMNMMM MMMMMMONOMMMNOMM MMMMMMMNMMMMNOMM MMMOOOAAAAOANOMM MMONNNNNNNNNAOMA MMOOOOOOOOOOOAMA MNMAMMMMMMMMAMMA MNOMAAAAAAAAAMAA MNOMANOMAONOMAAA MNOMANOMAONOMAAA MMOMANOMAONOMAAA MMMMONOMAONOMAAM MMMMONOMAONOMAMM MMMMMMMMMMMMMMMM } # tile 431 (sapphire golem) { MMMMMMMMMMMMMMMM MMMMMMBEBMMMMMMM MMMMMMNENMMMEMMM MMMMMMBEBMMMEBMM MMMMMMPEPMMMEBMM MMMBBBAAAABAEBMM MMBEEEEEEEEEABMA MMBBBBBBBBBBBAMA MEMAMMMMMMMMAMMA MEBMAAAAAAAAAMAA MEBMAEBMABEBMAAA MEBMAEBMABEBMAAA MMBMAEBMABEBMAAA MMMMBEBMABEBMAAM MMMMBEBMABEBMAMM MMMMMMMMMMMMMMMM } # tile 432 (steel golem) { MMMMMMMMMMMMMMMM MMMMMMPBPMMMMMMM MMMMMMEBEMMMBMMM MMMMMMPBPMMMBPMM MMMMMMPBPMMMBPMM MMMPPPAAAAPABPMM MMPBBBBBBBBBAPMA MMPPPPPPPPPPPAMA MBMAMMMMMMMMAMMA MBPMAAAAAAAAAMAA MBPMABPMAPBPMAAA MBPMABPMAPBPMAAA MMPMABPMAPBPMAAA MMMMPBPMAPBPMAAM MMMMPBPMAPBPMAMM MMMMMMMMMMMMMMMM } # tile 433 (crystal golem) { MMMMMMMMMMMMMMMM MMMMMMOLOMMMMMMM MMMMMMCLCMMMLMMM MMMMMMOLOMMMLOMM MMMMMMKLKMMMLOMM MMMOOOAAAAOALOMM MMOLLLLLLLLLAOMA MMOOOOOLOOOOOAMA MLMALLLLLLLLAMMA MLOMAAAAAAAAAMAA MLOMALOMAOOOMAAA MLOMALOMAOLOMAAA MMOMALOMAOLOMAAA MMMMOLOMAOLOMAAM MMMMOLOMAOLOMAMM MMMMMMMMMMMMMMMM } # tile 434 (human) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMJJAMMMMMM MMMMMMJJJJAMMMMM MMMMMMELELAMMMMM MMMMMMLLLLAMMMMM MMMMMMALLAMMMMMM MMMMMCLAALCMAAAM MMMMCLLLLLLCAAAM MMMMLACLLCALAAAM MMMMLAJJKJALAAAM MMMMMMJJJKAAAAMM MMMMMMJJAJAAMAMM MMMMMKLAMLKAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 435 (wererat) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMJJAMMMMMM MMMMMMJJJJAMMMMM MMMMMMGJGJAMMMMM MMMMMMLLLLAMMMMM MMMMMMALLAMMMMMM MMMMMCLAALCMAAAM MMMMCLLLLLLCAAAM MMMMLACLLCALAAAM MMMMLAJJKJALAAAM MMMMMMJJJKAAAAMM MMMMMMJJAJAAMAMM MMMMMKLAMLKAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 436 (werejackal) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMJJAMMMMMM MMMMMMJJJJAMMMMM MMMMMMIPIPAMMMMM MMMMMMLLLLAMMMMM MMMMMMALLAMMMMMM MMMMMCLAALCMAAAM MMMMCLLLLLLCAAAM MMMMLACLLCALAAAM MMMMLAJJKJALAAAM MMMMMMJJJKAAAAMM MMMMMMJJAJAAMAMM MMMMMKLAMLKAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 437 (werewolf) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMJJAMMMMMMM MMMMMJJJJAMMMMMM MMMMMNJNJAMMMMMM MMMMMLLLLAMMMMMM MMMMMALLAMMMMMMM MMMMCLAALCMAAAMM MMMCLLLLLLCAAAMM MMMLACLLCALAAAMM MMMLAJJKJALAAAMM MMMMMJJJKAAAAMMM MMMMMJJAJAAMAMMM MMMMKLAMLKAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 438 (werepanther) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMJJAMMMMMM MMMMMMJJJJAMMMMM MMMMMMGJGJAMMMMM MMMMMMLLLLAMMMMM MMMMMMALLAMMMMMM MMMMMCLAALCMAAAM MMMMCLLLLLLCAAAM MMMMLACLLCALAAAM MMMMLAJJKJALAAAM MMMMMMJJJKAAAAMM MMMMMMJJAJAAMAMM MMMMMKLAMLKAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 439 (weretiger) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMJJAMMMMMM MMMMMMJJJJAMMMMM MMMMMMGJGJAMMMMM MMMMMMLLLLAMMMMM MMMMMMALLAMMMMMM MMMMMCLAALCMAAAM MMMMCLLLLLLCAAAM MMMMLACLLCALAAAM MMMMLAJJKJALAAAM MMMMMMJJJKAAAAMM MMMMMMJJAJAAMAMM MMMMMKLAMLKAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 440 (weresnake) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMJJAMMMMMM MMMMMMJJJJAMMMMM MMMMMMGJGJAMMMMM MMMMMMLLLLAMMMMM MMMMMMALLAMMMMMM MMMMMCLAALCMAAAM MMMMCLLLLLLCAAAM MMMMLACLLCALAAAM MMMMLAJJKJALAAAM MMMMMMJJJKAAAAMM MMMMMMJJAJAAMAMM MMMMMKLAMLKAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 441 (werespider) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMJJAMMMMMM MMMMMMJJJJAMMMMM MMMMMMGJGJAMMMMM MMMMMMLLLLAMMMMM MMMMMMALLAMMMMMM MMMMMCLAALCMAAAM MMMMCLLLLLLCAAAM MMMMLACLLCALAAAM MMMMLAJJKJALAAAM MMMMMMJJJKAAAAMM MMMMMMJJAJAAMAMM MMMMMKLAMLKAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 442 (gibberling) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMHHHMMMMMMM MMMMMMOOPMMMMMMM MMMMMMOOPMMMMMMM MMMMMGGFFFAAMMMM MMMMOMGFFAPAAMMM MMMMMMGAFAAAAMMM MMMMMOOAOPAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 443 (grimlock) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMEAMMMMMMMMM MMMMEEEAMMMMMMMM MMMMLELAMMMMMMMM MMMMMEMAMMMMMMMM MMMEEAEEEAMAAMMM MMEEEEEEEEAAAMMM MMEAEEEAAEAAMMMM MMEAEEEAEAAAMMMM MMMMEAEAAAAAAAMM MMMMEAEAAAAAMMMM MMMEEAEEAAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 444 (elf) { MMMMMMMMMMMMMMMM MMMMMMMMMGMMMMMM MMMMMMMGGFMMMMMM MMMMMMGGGGAMMMMM MMMMMMLELEAMMMMM MMMMMMLLLLAMMMMM MMMMMMALLAMMMMAM MMMMMMGAAGMMAAAM MMMMMLGGGFLAAAAM MMMMLAAGFAALAAAM MMMMLAGGGFALAAMM MMMMMMGFAFAAMAMM MMMMMMGFAFAAMAMM MMMMMKLAMLKAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 445 (Woodland-elf) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMKMMMMMM MMMMMMMKCJMMMMMM MMMMMMKKKKAMMMMM MMMMMMLELEAMMMMM MMMMMMLLLLAMMMMM MMMMMMALLAMMMMAM MMMMMMKAAKMMAAAM MMMMMLCKCJLAAAAM MMMMLAPPJAALAAAM MMCKLKKKKJALAAMM MMMMMMPPAJAAMAMM MMMMMKLAMLKAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 446 (Green-elf) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMGMMMMMM MMMMMMMGGFMMMMMM MMMMMMGGGGAMMMMM MMMMMMLELEAMMMMM MMMMMMLLLLAMMMMM MMMMMMALLAMMMMAM MMMMMMGAAGMMAAAM MMMMMLGGGFLAAAAM MMMMLAAGFAALAAAM MMMMLAGGGFALAAMM MMMMMMGFAFAAMAMM MMMMMKLAMLKAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 447 (Grey-elf) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMPMMMMMM MMMMMMMPPMMMMMMM MMMMMMPPPPAMMMMM MMMMMMLELEAMMMMM MMMMMMLLLLAMMMMM MMMMMMALLAMMMMAM MMMMMMPAAPMMAAAM MMMMMLPPPMLAAAAM MMMMLAAPMAALAAAM MMMMLAPPPMALAAMM MMMMMMPMAMAAMAMM MMMMMKLAMLKAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 448 (High-elf) { MMMMMMMMMGMMMMMM MMMMMMMGGFMMMMMM MMMMMMGGGGAMMMMM MMMMMMLILIAMMMMM MMMMMMLLLLAMMMMM MMMMMMALLAMMMMMM MMMMMMGAAGMMAAMM MMMMMLGGGFLAAAAM MMMMLAAGFAALAAAM MMMMLAMGFAALAAMM MMMMLAMGFAALAAMM MMMMLAGGGFALMAMM MMMMMMGFAFAAMAMM MMMMMMGFAFAAMMMM MMMMMMGFAFAAMMMM MMMMMKLAMLKAMMMM } # tile 449 (elf-lord) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMIIMMMMMM MMMMMMMHGFMMMMMM MMMMMMHGGGAMMMMM MMMMMMLELEAMMMMM MMMMMMLLLLAMMMMM MMMMMMALLAMMMMAM MMMMMMHAAHMMAAAM MMMMMLHHHFLAAAAM MMMMLAAIIAALAAAM MMMMLAHGGFALAAMM MMMMMMHFAFAAMAMM MMMMMKLAMLKAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 450 (drow) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMAMMMMMM MMMMMMMAAAMMMMMM MMMMMMAAAAAMMMMM MMMMMMODODAMMMMM MMMMMMOOOOAMMMMM MMMMMMAOOAMKMMAM MMMMMMAAAAKMAAAM MMMMMOAAAAOAAAAM MKMMOAAKAAAOAAAM MMKKOKCAAAAOAAMM MMMMMMAAAAAAMAMM MMMMMAOAMOAAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 451 (Elvenking) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMHMMHMMMMMM MMMMMMHCHHMMMMMM MMMMMMHHHHAMMMMM MMMMMMLELEAMMMMM MMMMMMLLLLAMMMMM MMMMMIALLAIMMMAM MMMMIIIAAIDIAAAM MMMMMLIIGDLAAAAA MMMMLADIFDALAAAA MMMMLAIIGDALAAAM MMMMMIIFAFDAAAMM MMMIIKLAILKDIMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 452 (doppelganger) { MMMMMMMMMMMMMMMM MMMMMMCCCCMMIMMM MMIMMCDMMMCMMMMM MMMMCDMHHAMCMMMM MMMCDMHHHHAMCMIM MMMCDMLFLFAMDCMM MIMCDMLLLLAMDCMM MMMCDMALLAMDCMMM MMCDMLLAALLMACAM MCDMLLLLLLLLADCM MCDMLALLLLALADCM MCDMLAJJKJALADCM MMCDMMLJJLAAACAM MMMCDMLLALAACAMM MMCDMLLAALLADCMM MMMMMMMMMMMMMMMM } # tile 453 (mugger) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMIIMMMMMMM MMMMMMLIILMMMMMM MMMMMMJLJLMMMMMM MMMMMMLLLLMMMMMM MMMMMMALLAMMMMMM MMMMMBPAAPLAMAAM MMMMLPPPPPPBAAAM MMMMPABPPBAPAAAM MMMMLABPPPALAAAM MMMMMMLPAPAAAAMM MMMMMMBPAPAAMAMM MMMMMJJAMJJAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 454 (nurse) { MMMMMMMMMMMMMMMM MMMMMMMNOMMMMMMM MMMMMMNDDOMMMMMM MMMMMMNNOOAMMMMM MMMMMDBLBLDMMMMM MMMMMCLLLLDCMMMM MMMMMDALLACDMMMM MMMMMCNAAODCAAAM MMMMMNNNOOLAAAAM MMMMLANNDOALAAAM MMMMLANNOOALAAAM MMMMMMNNOOAAAAMM MMMMMMNNAOAAMAMM MMMMMLLAMLLAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 455 (gypsy) { MMMMMMMMMMMMMMMM MMMMMMMNOMMMMMMM MMMMMMNDDOMMMMMM MMMMMMNNOOAMMMMM MMMMMDBLBLDMMMMM MMMMMCLLLLDCMMMM MMMMMDALLACDMMMM MMMMMCNAAODCAAAM MMMMMNNNOOLAAAAM MMMMLANNDOALAAAM MMMMLANNOOALAAAM MMMMMMNNOOAAAAMM MMMMMMNNAOAAMAMM MMMMMLLAMLLAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 456 (shopkeeper) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMAAAAMMMMMM MMMMMAAAAAAMMMMM MMMMMMJLJLMMMMMM MMMMMMLLLLMMMMMM MMMMMMALLAMMMMMM MMMMMEBAABEAMAAM MMMMEBBBBBBEAAAM MMMMBAEBBEABAAAM MMMMLAGFFFALAAAM MMMMMMGFAFAAAAMM MMMMMMGFAFAAMAMM MMMMMJJAMJJAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 457 (black marketeer) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMKKMMMMM MMMMMMMKCKCMMMMM MMMMMMCKKKAMMMMM MMMMMMAAAKAMMMMM MMMMMMHAHKAMMMMM MMMMMKKKKCKAAMMM MMMMKCKCKKKKAAMM MMMMKAKKKCACAAMM MMMMMMCKKKAAAAMM MMMMMMKKCKAAAMMM MMMMMKCKKKKAMMMM MMMMKKKKCKCKMMMM MMMMMMMMMMMMMMMM } # tile 458 (guard) { MMMMMMMMMMMMMMMM MMMMMBBPPPAAMMMM MMMMBNPPPPPPAMMM MMMMBPPBPPPPAMMM MMMMBAABPAAPAMMM MMMMBCLBPCLPAMMM MMMMAKCPPCJAAAMM MMMMBKJJJJAPAAAA MMMBPCJAAJAPPAAA MMBPPKJJJJAPPPAA MMPPABKJJAPPAPPA MMPPABPKAPPPAPPA MMLCMBPPPPPPCLAA MMLLMBPPABPPLLAA MMMMMBPPABPPAAAA MMMMBPPPMBPPPAAA } # tile 459 (prisoner) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMNOAMMMMMM MMMMMMMLLAMMMMMM MMMMMMMLLAMMMMMM MMMMMMMNOAMMMMMM MMMMMMNOONAMMMMM MMMMMNOOOONAMMMM MMMMNANOOOANAAMM MMMMPANOOOAPAAAM MMMMLANOOOALAAAM MMMMMMNOOOAAAAMM MMMMMMNAANAAAMMM MMMMMMPAAPAAMMMM MMMMMLLAMLLAMMMM MMMMMMMMMMMMMMMM } # tile 460 (Oracle) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMNNMMMMMMM LLLMMMGLLGMMMLLL MMLMMNLLLLNMMLMM MMMLMNLAALNMLMMM MMMMLNLLLLNLMMMM MMMMMLNLLNLMMAAM MMMMMNBBEENMAAAA MMMMMMBBEEAAAAAA MLLAMMBBBEAAALLM MLLLLBBBEBELLLLA MMLLCLBLLELLCLAA MMMCLLLLLLLCLAAM MMMMLELLLLELAAMM MMMMMMMMMMMMMMMM } # tile 461 (aligned priest) { MMMMMMMMMMMMMMMM INIMMMMMMMMMMMMM IIIMMKCCKMMMMMMM MJMMKCCCCKMMMMMM MJMMCAAKCCMMMMMM MLCMCAAACCMMMMMM CLLCMCAACJKCMMMM CJLACCCCJKCCCMMM MJAACCJJCCCCCKMM MJKCCCJCCJCCKMAA MJMMCCJCCLJCAAAA MJMMCCJCLLCAAAAM MJMMKCJCCCJAAAAM MJMACCJCCCJAAAMM MJACCCJJCCCAAMMM MMMMMMMMMMMMMMMM } # tile 462 (high priest) { MINIMMMMMMMMMMMM IIIIIMKCCKMMMMMM MIHIMKCAACKMMMMM MMHMMCGAGACMMMMM MMLCMCAAAACMMMMM MCLLCMCAACJCKMMM MCHLACCCCJCCCKMM MMHAACCJJCCCCCKM MMHCCCCJCCJCCCMA MMHMMCCJCCLJCAAA MMHMMCCJCLLCAAAA MMHMMKCJCCCJAAAA MMHMMKCJCCCJAAAA MMHMACCJCCCJAAAM MMHACCCJJCCCAAMM MMMMMMMMMMMMMMMM } # tile 463 (soldier) { MMMMMJMMMMMMMMMM MMMMMJAAAMMMMMMM MMMMMALLLAMMMMMM MMMMMLLLLCMMMMMM MMMMMJLLCMMMMMMM MMMMMJFMMFMMMMMM MMMMFJFFFFFMMAMM MMMMFJFFFAFMAMMM MMMMFLFFFFFAAAMM MMMMFJFFAAAAAAAM MMMMMLFAFFAAAAMM MMMMMFFAFMAAAAMM MMMMMMFAFMAAMMMM MMMMMFFAFFAMMMMM MMMMMJJMJJMMMMMM MMMMMMMMMMMMMMMM } # tile 464 (sergeant) { MMMMMJMMMMMMMMMM MMMMMJFFFMMMMMMM MMMMFFFFFFMMMMMM MMMMMLLLLCMMMMMM MMMMMJLLCMMMMMMM MMMMMJFMMGMMMMMM MMMMFJFFFFFMMAMM MMMMFJFFFAFMAMMM MMMMFLFFFFFAAAMM MMMMFJFFAAAAAAAM MMMMMLFAFFAAAAMM MMMMMFFAFMAAAAMM MMMMMMFAFMAAMMMM MMMMMFFAFFAMMMMM MMMMMAAMAAMMMMMM MMMMMMMMMMMMMMMM } # tile 465 (lieutenant) { MMMMMMMMMMMMMMMM MMMMMMMFFFMMMMMM MMMMMFFFFFFMMMMM MMMMMMLLLLMMMMMM MMMMMMMLLCAMMMMM MMMMMGFMFGAMMMMM MMMMFFFFFFFFMMMM MMMMFAFFFFAFAAAM MMMMFAFFFFAFAAAA MMMMFAFFFFAFAAAM MMMMLFFAFFJLJAMM MMMMMFFAFFJJJAMM MMMMMMFAFMAAMMMM MMMMMFFAFFAMMMMM MMMMMAAMAAMMMMMM MMMMMMMMMMMMMMMM } # tile 466 (captain) { MMMMMMMMMMMMMMMM MMMMMMFHHFMMMMMM MMMMMFFFFFFMMMMM MMMMMMLLLLMMMMMM MMMMMMMLLCAMMMMM MMMMMHFMFHFMMMMM MMMMFFFFFFFFAAMM MMMMFAFFIFAFAAAA MMMMFAFFFFAFAAAM MMMMFAFFFFAFAAAM MMMMLFFAFFJLJAMM MMMMMFFAFFJJJAMM MMMMMMFAFMJJJAMM MMMMMFFAFFJJJAMM MMMMMAAMAAAAAMMM MMMMMMMMMMMMMMMM } # tile 467 (watchman) { MMMMMMMMMMMMMMMM MMMMMMPPPMMMMMMM MMMMPPPPPPMMMMMM MMMMMLLLLCMMMMMM MMMMMMLLCMMMMMMM MMMMMPPMMPMMMMMM MMMMPPPPPPPMMMMM MMMMPAPPHAPPAMMM MMMMPAPPPANNAAAM MMMMPJPPAPNNAAAM MMMMJLPAPPAAAAMM MMMMMJPAPMAAAAMM MMMMMMPAPMAAMMMM MMMMMPPAPPAMMMMM MMMMJJJMJJJMMMMM MMMMMMMMMMMMMMMM } # tile 468 (watch captain) { MMMMMMPPPMMMMMMM MMMMMPHHHPMMMMMM MMMMPPPPPPPMMMMM MMMMMLLLLCMMMMMM MMMMMMLLCMMMMMMM MMMMMHPMMHMMMMMM MMMMPPPPPPPMMMMM MMMMPAPPHAPPAMMM MMMMPAPPPANNAAAM MMMMPJPPAPNNAAAM MMMMJLPAPPAAAAMM MMMMMJPAPMAAAAMM MMMMMJPAPMAAMMMM MMMMMPPAPPAMMMMM MMMMJJJMJJJMMMMM MMMMMMMMMMMMMMMM } # tile 469 (Medusa) { MMMMMMMMMMMMMMMM MMGAMMMGAMMMMMMM MMMFAMFAMMGAMMMM MMMMFJFFFFMMMMMM MMFAFLLFAMMMMAMM MGAFLLLLAMMAMMAM MMMMJLLKAMAMAMAM MMMKBLLBKAAAAAMM MMKIIBBIIIAAAMAM MMIIIKKILLIAAAMM MMKIILLIALIAAMMM MMMKIALKAAIAAMMM MMMICAACIIAAAMMM MMMIIKKIIIAAMMMM MMIIKIKIKIAMMMMM MMMMMMMMMMMMMMMM } # tile 470 (Wizard of Yendor) { MEEEMMMMMMMEEEMM EFFAEMMEMMEAFFEM EAAAEMEEEMEAAAEM EAAAEEEAEEEAAAEM EEAAEEDADEEAAEEM MEEEEAAAAAEEEEMM MMEEEEAAAEEEEMMM MMEEEEEEEEEEMMMM MMMEEEEEEEEMMMMM MMMEEEEEEEEMMMMA MMMMEEEEEEMMMAAA MMMMEEEEEEAAAAAA MMMEEEEEEEEAAAAA MMEEEEEEEEEAAAAA MEEEEEEEEEEEAAAM EEEEEEEEEEEEEEAM } # tile 471 (Croesus) { MMMMHMMHMMHMMMMM MMMMHCHEHCHMMMMM MMMMHHHHHHHMMMMM MMMMALLLLLAMMMMM MMMMLLALALLMMMMM MMMMMLLLLLMMMMMM MMMMHLLDLLHMMMMM MMMHIALLLAIHMAMA MMMHIHAAAHIHAAAA MMIIIEHHHIIIIAAA MMIIIIEHIIIIIAAM MMILLIHHHILLIAAA MMMLIIKHIIILAAAA MMGIIIKJIIIIGAAM MGIIIKJJKKIIIGGM MMMMMMMMMMMMMMMM } # tile 472 (Charon) { MMMMMMMMMMMMMMMM MMMMMMMJMMMMMMMM MMMMMMJJJMMMMMMM MMMMJJJAJJJMMMMM MMMMJJDADJJMMMMM MMMJJAAAAAJJMMMM MMMJJJAAAJJJMMMM MMJJJJJJJJJJMMMM MJJJJJJJJJJJJMMM JJJJJJJJJJJJJJMA MOOMJJJJJJMOOAAA MMMMJJJJJJAAAAAA MMMJJJJJJJJAAAAA MMJJJJJJJJJAAAAA MJJJJJJJJJJJAAAM JJJJJJJJJJJJJJAM } # tile 473 (shadow) { MMMMMMMMMMMMMMMM MMMMMMMMMMMAMMMM MMMMMMMMMMAAAMMM MMMMMMAAAAHAHMMM MMMMMMAAAAAAAMMM MMMMMAAMAAAAAAMM MMMMAAMMAAAAAAAM MMMAAMMAAAAAAAAM MMAAMMAAAAAAMAAM MAMMMAAAAAMMMAMM MMMMAAAAMMMAAMMM MMMAAAMMMAAMMMMM MMAAMMMAAMMMMMMM MAMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 474 (ghost) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMNNNMMMMMMMMMM MMNANANNMMMMMMMM MNNNNNNNNNMMMMMM MNNPAAPNNNNNMMMM MNNAAAANNNOONOMM MNNAAAANONNNPNNO MNNPAAPNONNOOOPM MNNNNNNONOPNPPOM MNNONNOPNNOPOOPM MNOPNNOOOPPOOPMM MOOOPOPPOPPPMPPM MPPMPPOPPPMMMPMM MOMMMPMMMMPMMMMM MMMMMMMMPMMMMMMM } # tile 475 (shade) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMAAAAAAAM MMMMAAAAAAAAMMMM MMAAAAAAAAAAAAMM AAAAAAAAAAAAAAAM MMAAAAAAAAAAAAAA MAAAAAAAAAAAAAMM AAAAMAAAAJAMMMMM MMMMMMMMMMMMMMMM } # tile 476 (water demon) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMEEMMMMMEEMMMMM MEMEEMMMEEMEMMMM MMMMEEEEEMMMMMMM MMMMEBEBEMMAMMMM MMMEEEEEEEAAAAMM MMEEEMMMEEEAAMAM MMEEEEEEEEEAAAMM MMEEAEEEAEEAAAMM MMMAAEEEAAAAAMMM MMMMEEAEEAAMMMMM MMMMEEAEEAMMMMMM MMMMMMMMMMMMMMMM } # tile 477 (horned devil) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMOMMMMMMMOMMMMM MMOOMMMMMOOMMMMM MMMLOCDCOLMMMMMM MMMCDDDDDCMMMMMM MMMDAADAADAMMDMM MMMDDDDDDDAMDMMM MMCCDDFDDCCADMAM MMCDKDDDKCDADAMM MMCDAKKCACDAAAAM MMDDADDDADDAAAAM MMMMCDDDKAAAAAMM MMMCDDADDKAAMMMM MMCDDAAMDDKMMMMM MMMMMMMMMMMMMMMM } # tile 478 (spined devil) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMOMMMMMOMMMMMM MMMLOCDCOLMMMMMM MMOCDDDDDCOMMMMM MMLOAADAAOLMMDMM MOMDDDDDDDAODMMM MLOCLOFOLCOLDMAM MMCDODDDOCDADAMM MLODLOKOLCOLAAAM MODDODDDODDOAAAM MMMMCDDDKAAAAAMM MMMLODADOLAAMMMM MMCODAAMDOKMMMMM MMMMMMMMMMMMMMMM } # tile 479 (bearded devil) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMCCDCCMMMMMMM MMMCDDDDDCMMMMMM MMMDAADAADAMMDMM MMMDDDDDDDAMDMMM MMCCNDFDNCCADMAM MMCDNDDDNCDADAMM MMCDANNNACDAAAAM MMDDANNNADDAAAAM MMMMCDNDKAAAAAMM MMMCDDADDKAAMMMM MMCDDAAMDDKMMMMM MMMMMMMMMMMMMMMM } # tile 480 (succubus) { DDMOHHDMMMMMMMMM DDOHHDGDMMMMMMMM DDOHDDDDDMMMMMMM DDHHDDDAMMMMMMMM DHHHDJADDDDMMMMM MHHJJDDDJDDDMMMM OHDDCDCDDJDDMMMM HHHCDDCDLJMDDMMM HHHCDLJJJAADDAMM HHHDJJDDDAADAAMM HHHHDDAADAAAAMMM HHHHMDKJDDAAMMMM HMHMMDDAADDAAMMM MMHMMDDAAMDAAMMM MMMMDDAAMMDDAAMM MMMDDJAMMMDDDAMM } # tile 481 (incubus) { DDMOHHDMMMMMMMMM DDOHHDGDMMMMMMMM DDOHDDDDDMMMMMMM DDHHDDDAMMMMMMMM DDDHDJADDDDMMMMM DDDJDDDDDDDDMMMM MDDDDDCDDMDDDMMM MDDCDDDKKMMDDMMM MMDDKKDDDAADDAMM MMMDDDDDDAAAAAMM MMMMDDDDDDDDDAMM MMMMDDJDJJAAAAAA MMMMJDJJADKAAMMM MMMMDDKAADDKAMMM MMMDDKAAMMDDAAMM MMDDCAAMMMDDDAMM } # tile 482 (erinys) { MMGAMMMGAMMMMMMM MMMFAMFAMMGAMMMM MMMMFJFFFFMMMMMM MMFAFLLFAMMMMMMM MGAFDLDLAMMAMAMM MMMMLLLEAMAMAMAM MMMEBLLBEAAAAMAM MMEBBBBBBBAAAAMM MMBBBEBBLLBAAMAM MMEBBLLBALBAAAMM MMMEBALBAABAAMMM MMMBEAABBBAAAMMM MMMBBBBBBBAAAMMM MMMBBBBBBBAAMMMM MMBBEBEBEBAMMMMM MMMMMMMMMMMMMMMM } # tile 483 (barbed devil) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMOMMMMMMMOMMMMM MMOOMMMMMOOMMMMM MOMLOCDCOLMOMMMM MMMCDDDDDCMMMMDD MMMDAADAADAMMDMD MMMDDDDDDDAMDMMM MMCCDDFDDCCADMAM MMCDKDDDKCDADAMM MCMDAKCKACDKAAAM MMDDADDDADDAAAAM MMMMCDDDKAAAAAMM MKMCDDADDKAAKMMM MCCDDAAMDDCKMMMM MMMMMMMMMMMMMMMM } # tile 484 (marilith) { MDMMHHHMMMMMDMMM DDMHHHHHAMMMDDMM MDCHDDDHHAADMMAM MMHDBDBDHDDAAAAM MCHKDDDKHAAADDMM CDDDKKKDHDDDDFFM DMMCDDCDKAAFFFAA DMKDDKDDDDDDFAAM DMDCDDKDKAFDFAAM MMDMGDDFAAFDFFAA MDMGGFFFAAAFFFFA MMMGFFFFFAAAFFFA MMFGFFFFFFAFFFFA MMFGFFFFFFFFFFAM MMFGFFFFFFFFFAMM MMMMGFFFFFFAAMMM } # tile 485 (bar-lgura) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMKKKJMMMMMM MMMMMJJKJJJMMMMM MMMMKCDODCJJMAAM MMMMKOOOOCAJAAAA MMMCKCOACCAJJAAA MMKKCKCCCAJKJJAA MMKKAKJAAJJAJJAA MMCAAKJJJJJAAJAA MMOCMCJJJJJKCOAA MMOOMCJJAKOJOOAA MMMMMCOJACOJAAAA MMMOOOOJACOOOKAM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 486 (chasme) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMCMMMMMMM MMMMPPMKKKMPPMMM MMMMPPPJKJPPPMMM MMMMMPPKCKPPMMMM MMMAABPPJPPBAAMM MMMMAABPJPBAAMMM MMMMMLMJJJMLMMMM MMMMLMMGLGMMLMMM MMMMMMMALAMMMMMM MMMMMMMMAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 487 (vrock) { MMMMMMMMMMMMMMMM MMMMMMOPPMOMMMMM MMMMMMPPPPMMMMMM MMMMMCPPDPMMMMMM MMMMCCCPPPMMMMMM MMMMCCPPPPMMMMMM MMMMCMMPPAMMMMMM MMMMMDDAADDMAAAM MMMMDDDDDDDDAAAM MMMMDADDDDADAAAM MMMMDADDDDADAAAM MMMMDADDDDADAAAM MMMMMMDAADAAAAMM MMMMMMDAADAAMAMM MMMMMDDAMDDAMMMM MMMMMMMMMMMMMMMM } # tile 488 (babau) { MMMPMMMMMMMMMMMM MMMMPMMMMMMMMMMM MMMOOOMMMMMMMMMM MMDODOOMMMMMMMMM MMOOOOOMMMMMMMMM MMOOMOMMMMMMAMMM MMMMMMJMMMMMMAMM MMMMOOOJJMMMAAAM MMMOAMOJJAMMAAAM MMOAMOAJJMAAAAAM MMMMOAMJJJAAAMAM MMMMMMOJJJAAMAMM MMMMMOMJJJAMMMMM MMMOOOJJJJMMMMMM MMMMMMOOOMMMMMMM MMMMMMMMMMMMMMMM } # tile 489 (hezrou) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMGGGFFMMMMMMM MMNGFFNNFFFMMMMM MDFFFDDNFFMFMMMM MGFFFDNFFMFFFAAM MAFAFFFFFFFFFFAA MGFFFFMFFFMFGFAA MGAAAFFMMLFGFFAA MMFFFFMFFLFGFFFA MMLLAMFLLLJJGMFA MLLAFFLLFJJGFFFA MMLAFLLLAAGFMFAA MMMMMLMLAGFFFFAA MMMMMMMMMMMFFFAM MMMMMMMMMMMMMMMM } # tile 490 (bone devil) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMOMMMMMMMOMMMMM MMOOMMMMMOOMMOMM MMMLNLOLOLMMMMOM MMMLOOOOOLMMMMOM MMMNAAOAAOAMMOMM MMMNOOOOOOAMOMMM MMNOOOFOOOOAOMAM MMOOKNOOKOOALAMM MMOOANOOAOOAKAAM MMLLANOOALLAAAAM MMMMNOOOLAAAAAMM MMMNOOAOOLAAMMMM MMNOOAAMOOLMMMMM MMMMMMMMMMMMMMMM } # tile 491 (ice devil) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMNMMMMMMMNMMMMM MMNNMMMMMNNMMMMM MMMPBPNPNPMMBNBM MMMPNNNNNPMMNMNM MMMBAANAANAMMMNM MMMBNNNNNNAMBNBM MMBNNNFNNNNANMAM MMNNKBNNKNNABAMM MMNNABNNANNAMAAM MMPPABNNAPPAAAAM MMMMBNNNPAAAAAMM MMMBNNANNPAAMMMM MMBNNAAMNNPMMMMM MMMMMMMMMMMMMMMM } # tile 492 (nalfeshnee) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMBBMMMBBMMM MMKKKKKBBMBBMMMM MKADCADKKKBMMMMM MCKKKKKCDKKMMMMM MOKDCOKKDDCDMMMM MOKDKOCKKDKDDMMM MKAAAKKDKAKKDMMM MMKCKDDLAKCKDMAM MMMKKMKCKKKDDAMM MMMMLMMKDAKDAAMM MMMMMMLLAACDAMMM MMMMMMMMMLLAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 493 (nabassu) { MMMKMMMMMMKMMMMM MMMKJMMMMKJMMMMM MMKKABBBBAJJMMMM MMKJMMMMMMAJMMMM MMCJOOMMOOAJMMMM MKJABDMMDBAJJMMM MKJABMMMMBAAJAAM KJAMABAAMAMAJJAA JMMBMABMAMMMAJAA MMBMBMAAMMAMAAAA MMBAMBMABAAMAAAA MMBAMBMMMMAMAAMM MMMMMBMMMMAAAAMM MMMMMBMABMAAMMMM MMMMBFAMFBAMMMMM MMMMMMMMMMMMMMMM } # tile 494 (pit fiend) { MMMMMMMMMMMMMMMM MKMOMMMMMMMOMKMM MKMOOMMMMMOOMKKM KJJMLOCDCOLMKJJM KKJJKDDDDDKCJJJM KJJCKDNDNDKCJJJA JJCCKDDDDDJCCJJA JJCCCKDIDJDCCJJA JACCDDKJJDDCDAJA JACCKDDDDDKCDAJA MMMCDCDDDKCDDAAA MMMMDKDDDKCDAAAA MMMMMCDDDCAAAAMM MMMMCDDADDKAMMMM MMMCDDAAMDDKMMMM MMMMMMMMMMMMMMMM } # tile 495 (balrog) { MMMMMMMMMMMMMMMM MKMMOMMMMMOMMKMM MKJMOMMMMMOMKKMM CJJLOOCDCOOLJJJM JJJDDDDDDDDDDKJM JCCDDDNDNDDDCCJA CCDKDDDDDDDJCCCA CDDCKKDIDJJDCCDA CDDKDDKJJDDDCDDA CCDKDDDDDDDKCDDA JCCDKCDDDKCCDDDA JJCDKKDDDKKCDDJA JJMMCCDDDKCAAJJA JMMCDDDADDDKAAJA MMCDDDAAMDDDKMAA MMMMMMMMMMMMMMMM } # tile 496 (Juiblex) { MMMMMMMMMMMMMMMM DDMMMMMMMMMDDMMM NDCMKKKCJMCNDMMM MCCCCCCKKCCAAMMM MMKCCCCKCCJAAMMM MMKCCCCCKMJJAAMM MMKCCFCCKMMJAAMM MMFKCFCCCKMJAAAM MFKCFCCKFKMMJAAM MFKCFCCFKFKMJAAM MFCFCCKFCFCMJAAM FKCFCFCFCKKMJAAM CKFCCFCCKCFKJJAM CCKKCFCKFFKCKKAM MCCCCCCCCCCCKAMM MMMMMMMMMMMMMMMM } # tile 497 (Yeenoghu) { MMMMBMHHPMMMMMMM MMMMBPPPPMMMMMMM MMMBPLCPPHMMMMMM MKBPPCCPPHMMMMMM MPPPPPPPMHMMMMMM MPPMMMPMPHMMMMMM MMMMBPPPPPAAAMMM MMBPPPPPPPPAAAAM MBPMPPPPPAPPAAAA MBMMMBPPMAAPAAAA MBMMMBPPMAAPAAAM MMMMMBPPAAAAAMAM MMMMBPMPPAAMMMAM MMMBPMAAPPAMMAMM MMMBPAAMPPAMMMMM MMMMMMMMMMMMMMMM } # tile 498 (Orcus) { MMMMMMMMMMMMMMMM MKMMOMMMMMOMMKMM KJJOMMBBBMMOMKKM CJJLOBPPPPOLCJJM JKJJMPGPGPMJJKJA JJKJKPPPPPJJKJJJ JBPPBMBPPABBPPJJ PJJPPMBPPAPPJJPA PJBPPPMAAPPPPJPA MJBPMPPPPMPMPJAA MJBPPPPMPPPPPJAA MMPPPMPPPMPPPAAA MMMPMPPPPPPPMPMA MMMBPPPAPPPPAAPA MMMOOPPAOOPPAGAM MMMMMMMMMMMMMMMM } # tile 499 (Geryon) { MKMMMMMMMMMMMKMM MKMMMMJJJMMMMKJM KKJMMJJJJJMMKKJM KJJJKLLLLLCKJJJM CJJJCLBLBLKJJJJA JJJJKLLLLLJJJJJA JJALLKLLLJLLAJJA JAMLLLKJJLLLAAJA MMMLJLLLLLKLAAAA MMMLCKLLLKCLAFGF MMMLLGLLFALLFFFA MMMMMGFFFAAAFFAA MMMMGGGGFFAAFFAA MMMMGFFFFFAAFGFA MMMMFGGGFFFFFFFA MMMMMFFFFFFFFFAM } # tile 500 (Dispater) { MMMMMMMMMMMMMMMM MMMMMMOJJOMMMMMM MMMMMMJJJJAMMMMM MMMMMMBLBLAMMMMM MMMMMMLLLLAMMMMM MMMMMMALLAMMMMMM MMMMMCKAAKKMAAAM MMMMCCKKCKCKAAAM MMMMKACKKJAKAAAM MMMMKACCKJAKAAJA MMMMKACKKKACAAJA MMMMLACCKJJLAJAM MMMMMMCKAJAJJAMM MMMMMMCKAPAAAAMM MMMMMPPAMPPAMMMM MMMMMMMMMMMMMMMM } # tile 501 (Baalzebub) { MMMMMMFMMMFMMMMM MMMMMMMFMFMMMMMM MMMMMMBFFFBMMMMM MMMMMBPPFBPPMMMM MMMMMPPPFPPPMMMM MMMMMMPPFPPMMMMM MMMMMCAFFFAKMMMM MMMMCKKAFAKCKAAM MMMMCACJFAKAKAAM MMMMFACJDAJAFAAM MMMMFACKJJJAFAAM MMMMFACKCKJAFAAM MMMMMMCKKKKAAAMM MMMMMMCCAKJAMAMM MMMMMFFAMMFFMMMM MMMMMMMMMMMMMMMM } # tile 502 (Asmodeus) { MMMMMMMMMMMMMMMM MMMMMMOJJOMMMMMM MMMMMMJJJJAMMMMM MMMMMMBLBLAMMMMM MMMMMMLLLLAMMMMM MMMMMMALLAMMMMMM MMMMMCKAAKKMAAAM MMMMCCKKCKCKAAAM MMMKKCKKKKJKKAAM MMMCKAKCKJACKAJA MMMKAMCKKKAAKAJA MMMLAMCCKJJALJAM MMMMMMCKAJAJJAMM MMMMMMCKAPAAAAMM MMMMMPPAMPPAMMMM MMMMMMMMMMMMMMMM } # tile 503 (Demogorgon) { MMMKKCMMKKKMMMMM MMCBKBKMBCBKMMMM MMKDKKCMKKDCMMMM MMDCKFAMGKKDMMMM MMMMGFAAGFAAAMMM MMMGFFFJFFFAMAAA MMGFAGFFFAFFAAAA MGJFAGJFJAFFFAAM MGFAAGFFFAAFJAMM MGJAMGFJFAAFFAAM MGFAMGFFFAMFJAAM MGJAMGJFJAMFFAAM MGFAGFAAFFAFFAMM MMGAGJAAJFAFAAMM MMGAGFAFFFAFAMMM MMMMMMMMMMMMMMMM } # tile 504 (Cthulhu) { MMMMMMMMMMMMMMMM MMMMMFFFFCMMMMMM MMMFFFFFFCMMMMMM MMFFFFFFFCMMMMMM MFGFFFFGCMMMMMMM MFFGFNGFCMMMFMMM MMFFFFFCMMFFFFMM MMFAFAFFMFFFFFFM MMFAFAFFFFFFMMFM MMFAFAFFFMMMMMMM MMMFFFFFFCMAAMMM MMCBFBBFMCAAAAMM MFFFBBFFACAAAMMM MMMMBBFCAAAAMMMM MMMMCFFCAAMMMMMM MMFFCMFFAMMMMMMM } # tile 505 (Death) { MBBBBMMMMJJJMMMM MBPPPPMJJJJMMMMM MCMMMMJJJJJMMMMM MCMMMMJAAAJMMMMM MCMMMJADADAJMAAA OOJMMJAAAAAJAAAM OOOJJJAAAAAJJJAM OOJJJJAAAAJOOJJA MCJJJJAAAJOOOOJA MCMJJAAAAJAOAAJA MCMMJAAAAJAOAAJA MCMMJAAAAAJOAJAA MCMMJAAAAAJJJAAA MCMJAAAAAAAJJAAM MCJJAAAAAAAAJJAM ACJAAAAAAAAAAAJM } # tile 506 (Pestilence) { FMMMMMMMMJJJMMMM MMFMMMMJJJJMMMMM BMMMFMJJJJJMMMMM MMMBMMJAAAJMMMMM MFMMMJADADAJMMMM MMMFMJAAAAAJMAAM MBMMJFAAAAFJAAMM MMMFJJAFABJJAAMM MMFMJFFBAJJJAAAM MMMMFAFFJJJJAAAM MMMMJABAJJJJAAAM MMMFJFFJJJJJJAAM MMMJJBFJJJJJJAAM MMMJAABFBJJJJAAM MMJJFBFAFFAJJJAM MJJAAFAFAAAAAAJM } # tile 507 (Famine) { MMMMMMMMMJJJMMMM MMMMMMMJJJMMMMMM KMMMMMJJJJJMMMMM KMMMMMJAAAJMMMMM CMMMMJADADAJMMMM KMMMMJAAAAAJMMMA KMMMMMJAAAJJMMAA OOJJJJJJAAJAJMAA KMMMJJJAAJJAJAAA KMMMMMJAJJJOJAAM CMMMMMJAOOOAAAMM KMMMMMJAJJAAAMMM KMMMMMJAJJAAMMMM KMMMMMJAAJAAMMMM CMMMJJAAAJJAAMMM KMMJJAAAAAJJJAMM } # tile 508 (mail daemon) { MMMOPMBEEEMPOMMM MMMOOEBEEEEOODMM MMDLOBEEEEOOLDDM MDDDLDDDDDDLDDDM MCCDDDNDDNDDDCCM CCDKDDDDDDDDJCCC CDDKCDDIIDDJJCCD CDDKMKDAADJJECDD CCDKEEKKKJEEKCDD MCCDCMEEEEMMCDDD MCCDAEMEENNNCDDM MDDDAEEEENDNDDDM MMMMBBEEENNNNNMM MMMBEEEAANNNNNAM MMCDDDAAAMDDDKMM MMMMMMMMMMMMMMMM } # tile 509 (djinni) { MLLMMNNNMMLLMMMM MMLMMNGNAMLMMMMM MMLAALLLAALAMMMM MMLAAKKKAALAMMMM MMMLCKCKCLAMMMMM MMMMLCKCLAMMMMMM MMMMLICLIAMMAMMM MMMMIIIIEAMAAMMA MMMMEIEEIAMAAAAA MMMMIEFEAAAAAAAA MMMMMDEAIAAAAAMM MMMMMIGIFAAAAMMM MMMMMMMFEDAAAMMM MMMMMMMIMGEAMAMM MMMMMMMMMIFEDMMM MMMMMMMMMMMMMMMM } # tile 510 (efreeti) { MOOMMMMMMMOOMMMM MMOMMMNNAMOMMMMM MMNAANANAANAMMMM MMNNANANANNAMMMM MMNNNNANNNNMMMMM MMNNNNNNNNNMMMMM MMNNNNNNNNNMAMMM MMNMINNNEANAAMMA MMNMEINEIANAAAAA MMMMIEFEAAAAAAAA MMMMMDEAIAAAAAMM MMMMMIGIFAAAAMMM MMMMMMMFEDAAAMMM MMMMMMMIMGEAMAMM MMMMMMMMMIFEDMMM MMMMMMMMMMMMMMMM } # tile 511 (dao) { MGGAMKKCAMGGAMMM MMGAMKCJAMGAMMMM MMGAMGFFAMGAMMMM MMGAMKJJAMGAMMMM MMMGCKJJCGAMMMMM MMMMGCKCFAMMMMMM MMMMGJCFJAMMAMMM MMMMKFFFJAMAAMMA MMMMKKJJJAMAAAAA MMMMKJJJAAAAAAAA MMMMMKJJKAAAAAMM MMMMMKJJJAAAAMMM MMMMMMMCJKAAAMMM MMMMMMMKJJKAAAMM MMMMMMMMMKKJJMMM MMMMMMMMMMMMMMMM } # tile 512 (marid) { MAAMMMMMMMAAMMMM MMAMMAAAPMAMMMMM MMAPPDADPPAPMMMM MMAPPAAAPPAPMMMM MMMAEAAAEAPMMMMM MMMMAEAEAPMMMMMM MMMMAIEAIPMMPMMM MMMMIIIIEPMPPMMP MMMMEIEEIPMPPPPP MMMMIEFEPPPPPPPP MMMMMDEPIPPPPPMM MMMMMIGIFPPPPMMM MMMMMMMFEDPPPMMM MMMMMMMIMGEPMPMM MMMMMMMMMIFEDMMM MMMMMMMMMMMMMMMM } # tile 513 (sandestin) { MMMMMCCCCCMMIMMM MIMMCDMMMMCMMMMM MMMCDMDDDMMCMMIM MMCDMDDDDDMMCMMM MMCDMDNDNDAMDCMM IMCDMDDDDDAMDCMM MMCDMADDDAMDCMMA MCDMDDAAADDMDCAA CDMDDDDDDDDDADCA CDMDADDDDDADADCA CDMDADDDDDADADCA CDMDADDDDDADADCM MCDMMDDJDDAADCAM MMCDMDDADDADCAMM MCDMDDAADDDADCMM MMMMMMMMMMMMMMMM } # tile 514 (jellyfish) { MMMMMMMMMMMMMMMM MMMMMPBPAMMMMMMM MMMPBBBPBAMMMMMM MMBBNNBPPBAAMMMM MBBNNPPPBBPAAMMM PBBBPPPBPBBAAAMM BBBPBPPPPPBPAAAM BBPBPPPPPPPBAAAM PBPPBPPPPEPEEEMM MPBBPPPEPEPPEEMM MPEPBBEEPEEPEEMM MPEEEPEEPEEPEMMM MMPEEPEMMPEMPMMM MMPMEPMEEPMMPMMM MMPEEMPMEMMEMMMM MPMMEMPMMEMMMMMM } # tile 515 (piranha) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMOPPMMMMMMMMM MMMMMOPPMMMMMMMM MMOMMPPAPMMMMMEM MMPOPPPPPAMMMEEE MMPPPPPMPPAMEMMM MMMPPMMPPPAAAEEM MMEMPPPPPPPPPEMM MMEMMMPPPPPAAMEM MMMMMEMMPPAEMMMM MMMMMEMMPMMMMMMM MMMMEMMEMMMEMMMM } # tile 516 (giant eel) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMAAAMMMMMMMMM MMMAAOAAMMMAAAMM MMAAAAAAAMAAMAAM MMAAAAMAAMAAMAAM MMMAAMMAAMAAMMAM MMMMMMAAAMMAAMAM MMMMMMAAMMMAAMMM MMMMMAAAMEMAAMEM MMMEMAAEEMAAAEMM MMMEMAAEEAAAEEMM MMEMMAAAAAAEMEMM MMMEEMAAAAEMEMMM MMEMMMEEMEMMMEMM } # tile 517 (shark) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMP MMMMMMMMPMMMMMPP MMMMEMMPPMMMMPPM MMMEMMMPPAMMPPPM MMEEEEPPPAMPPPPP MEMEEPPPMPPPPPPE MMMEPMPMPPPPPEEE MMPPPPPPPPPPEEEM MAPPPPPPPPEEEEME PPPPPPPMMEEMMMMM NDPPAPEPPPMEMMEE PDNPPEEMMEEMMMMM MPPPEMMEEEMMEMMM } # tile 518 (giant crab) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMCKAMMKCKAMMM MMMCCAMMMMKCAMMM MMCKKAKACAMCKCAM MCKKKCKAMKKKKCKA MCCAMMMMMMMMMCKA MKCKAMMMMMMMCKCA MMKKCCCCCCCCCKAA MMCJJJJJJJJJJKAA MMKAAGGAAGGAAKAA MMCCCCAAAACCCKAA MCKKCCCCCCCKCKKA MCKAAKKKKKKAACKA MMKKAACAACAAKKAM MMMMMMMMMMMMMMMM } # tile 519 (electric eel) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMAAAMMMMMMMMM MMMAAOAAMMMMMMMM MMAAAAAAAMMMMMMM MMAAAAMAAMMMMMMM MMMAAMMAAMMMDDMM MMMMMMAAAMMDDMMM MMMMMMAAMMMDDMMM MMMMMAAAMEMDDMEM MMMEMAAEEMDDMEMM MMMEMAAEEDDMEEMM MMEMMAAADDDEMEMM MMMEEMAAADEMEMMM MMEMMMEEMEMMMEMM } # tile 520 (kraken) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMFFMMFFMMMMMMMM MMDDFDDFMMMMMMMM MMFFFFFMMMMMGGMM MMNCNFFMMMMMMGFA MMCCMFFMMMMMEGFA MMMMGFAAMGFAEGFE MMMGFFAGFFFFAGFE MMMGFAAFFAGFAEEE MMGFFAGFFAGFEEEM EEGFFAGFFAEEEEME MEGFFAGFFEEMMMMM EEGFFEEEEEMEMMEE EEEEEEEMMEEMMMMM MMEEEMMEEEMMEMMM } # tile 521 (newt) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMJKKJMMMMMM MMMMMCLCCLLCMMMM MMMMLAAAACCLCAMM MMMMMMMLCCLLLCAM MMMMLCCCLLLAALAM MMMMCALLLLAAAAMM MMMLLLLCLAAAMMMM MMMLLAAALLAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 522 (gecko) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMLLPMM MMMMMMMMMMLLOOAM MMMMMMPOMLLOOOAM MMMMMMOOALOOOAMM MMMMMMMLLOOOAMMM MMMPOALOOOAAMMMM MMMOOLOOOOOOAMMM MMMMALOOOAOPAMMM MMMDOOOOAMAAMMMM MMMOOOAOOAMMMMMM MMMOODAOPAMMMMMM MMFMAAMAAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 523 (iguana) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMGPGPGGPFMMMM MMGPAAAAFFGPFMMM MGPAAMPFFGPPPAAM MMMMMMFGGPPFPPAA MPFGGGGPPPFAAPPA MFGPAPPPPFAAAAAM MGPPPPFPFAAAMAMM MPPFFAFPPAAMMMMM DMAAAAAAPPAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 524 (baby crocodile) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMFFOFOFAMMMM MMMMFOGFGGOFFMMM MMMMGAAAAFOGFAMM MMMFAAMGFOGGGFAM MMMGFOOOGGGFAGAM MMMFGAGGGGFAAAMM MMFGGGGFGFAAMMMM MMGGDFAFGGAMMMMM MMMDMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 525 (lizard) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMFFFFGFJMMMMM MMFFAAAJJGFJMMMM MMMMMMJGFFJFAAMM MMMJGGGFFJAAFAMM MMJFAFFFJAAAAMMM MMFFFFJJAAAMMMMM MJFAAAAFAAMMMMMM MDMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 526 (gila monster) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMKDDKDDJMMMMM MMKCAAAJJKDJMMMM MMMMMMJDDKDKAAMM MMMJKDDKDDAAKAMM MMJDAKDDJAAAAMMM MMKDDKJJAAAMMMMM MJCAAAACAAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 527 (chameleon) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMGGGGMMMMMMM MMMGGGGGGGGMMMMM MMMGGFFFFGGFAMMM MMGPAAAGFFGGFAMM MGPAAMPFFGGGGAAM MMMGGGGGGGGFGGAA MPGGBBGGGGFAAGGA MFGGABGGGFAAAAAM MGGGGGFGFAAAMAMM MDGFFAFGGAAMMMMM DMAAAAAAGGAMMMMM MDDMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 528 (crocodile) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMFFOFOOFAMMMM MMMFOGFGFGOFFAMM MMFGAAAAFFOGFFAM MFFAAMGFFOGGGGFA MMMMMMFOOGGGGGGA MGMOOOOGGGGFAGGA MFOGAGGGGGFAAAAM FGGGGGFGGFAAMMMM GGDDFAFGGGAMMMMM GDDFAAAAGGAMMMMM MDFMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 529 (salamander) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMCCCMMMMMMM MMMMCCCCCCCMMMMM MMMCCDDDDCCDAMMM MMMMAAAADDCCDAMM MMMMMMKDDCCCCAAM MMLLLCCCCCCDCCAA MKLCCCLLLCDAACCA MDCEECLKKDAAAAAM DCCAECDKDAAAMAMM CCCCCCDCCAAMMMMM MDAADAAACCAMMMMM MMACCAMMMMMMMMMM MMMAAAMMMMMMMMMM } # tile 530 (rhaumbusun) { FAMMMMMFAMMMMMMM MGFAMMFAMFAMMMMM MFGFAFAMFAMFAMMM MMFGGFAFAMFAMFAM MMMGGFAFAFAMFAMM MMFFFGGFAFAFAMMM MFAMMGGGGFAFAMMM FAMFFFGGGFAFCCAM MMFAMMGGGGFCDDKA MFAMFFFFGGFCDDKA MMMFAMMMFFGFKCAM MMFAMFFFCCFGGFAM MMMMFAMCDDKGGFAM MMMFAMMCDDKFFDDA MMMMMMMMKCAMMDAM MMMMMMMMMMMMMMMM } # tile 531 (basilisk) { MMMMMMMMMMMMMMMM MMMDMDDMMMMMMMMM MMMMDDMMMMMMMMMM MMMMLOMMAAMMMMMM MMPPGLMAAAMMMMMM MPPMLOMMAAAAMMMM MMMAOOOJJJAAMMMM MMMOOOKHHJJAAMMM MMMAOAHHHHJJAAMM MMMMMMMHJJHJAAMM MMMMMMMMMJHJAAMM MMMMMJAMMMJJAMMM MMMMJAMMMMJJAMMM MMMMJAMMJJJAMMMM MMMMMJJJJAMMMMMM MMMMMMMMMMMMMMMM } # tile 532 (komodo dragon) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMPPPPBPJMMMMM MMPPAAAJJBPJMMMM MMMMMMJBPPJPAAMM MMMJBBBPPJAAPAMM MMJPAPPPJAAAAMMM MMPPPPJJAAAMMMMM MJPAAAAPAAMMMMMM MDMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 533 (bad egg) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMPONOPMMMMMMM MMMMONNNOMMMMMMM MMMPNNNNNPMMMMMM MMMONNNNNOMAAAMM MMMNNNNNNOAAAAMM MMMONNNNOOAAAAMM MMMPONNOOPAAAMMM MMMMPOOOPAAAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 534 (killer tripe ration) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMOOOOMMMMMMM MMMMDODDDOOMMMMM MMMODODOOODAMMMM MMMOOOOODDDAMMMM MMMMDODOOOOAMMMM MMMMMODOODAAMMMM MMMMMMAAAAAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 535 (killer food ration) { MMMJJAMMMMMMMMMM MMMBPAMMMMMMMMMM MMMBPAMMMMMMMMMM MMBBBPAMMMMMMMMM MMBBBPAKCKKCKKAM MBBBBPKKKKKKKCKA MBOOPKCKCKCKKKAM MBOOCKKKKKKKCJJA MBOOPKLLLLOKJJJA MBPPKLOLLLOLKJJA MMPAKOLOOOLLCJJA MPPPKLOLLLOLKJJA MMMACOLOOOLLKJAA MMMMKLOLLLLOKAAM MMMMKKCKKKCKKAMM MMMMMAAAAAAAAMMM } # tile 536 (pile of killer coins) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MJKCKJMJJMMMMMMM JKCKCKJKCKJMMMMM CCKKKJCAAAKAMMMM KKKCKJAHALCAAMMM KCKKJKHLLHAHAMMM MCKJJKLHCALAMMMM MAAAJKLALHCAHAMM MMMAAKAHAHMMMMMM MMMMAAAALAHAMHAM MMMMMMHAMMMMMMMM MMMMMMMMMHAMMMMM MMMMMMMMMMMHAMMM } # tile 537 (large pile of killer coins) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MJJJJMMMMMMMMMMM JKCKKJMJJMMMMMMM KKCKCKJKCKJMMMMM CCKKKJKAAAKAMMMM KKCKCJAHALKAAMMM KKKKJKHLLHAHAMHA JCKJJKLHCALAMMMM MAAAJKLALHCAHAMM MMMAAKAHAHMMMMMM MMMMAAAALAHAMHAM MMMMMMHAMMMMMMMM MMMMMMMMMHAMMMHA MMMMMMHAMMMHAMMM } # tile 538 (huge pile of killer coins) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMJJJJMMMMMMMMMM MJKCKKJJJMMMMMMM KKCKCKJCKKJMMMMM KCKKKJKAAACAMMMM KCKCKJAHCLKAAMMM KKKKKKHLLHCHCAMM CKCKJKLHCALAMMMM AKKJKKLALHCAHCAM MAAAJKAHAHMMMMMM MMMAAAAALAHCAHCA MMMMAMHCAMMMMMMM MMMMMMMMMHCAMHCA MMMMMMMHCAMHCAMM } # tile 539 (long worm tail) { MMMMMMMMILLLLMMM MMMMMMIILLAAMMMM MMMMMILLAAMMMMMM MMMMMILAMMMMMMMM MMMMMILAMMMMMMMM MMMMMMLLAMMMIIMM MMMMMMMLLIIILLLL MMMMMMMMILLAAAML MMMIIIILLALLMMMM MILLLLLAAMMLLMMM ILLAAAAMMMMMLAMM ILAMMMMMMMMMLAMM LLAMMMMMMMMLLAMM LILAMMMMMMLLAMMM MLLLIIIILLLAMMMM MMMLLLLLAAAMMMMM } # tile 540 (Nightmare) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMKKMMMMMMMMM MMMMAAAKMMMMMMMM MMAAADACMMMMMMMM MAAAAAAKPPMMMMMM MAAAPAAKPPMMMMMM MMMPAAAKPMMMMMMM MMMAAAAAAAAAPMMM MMAAAAAAAAAAAPMM MMAAAAAAAAAAPAPM MMAPPAPPPAPAPAPM MMAPPAPPPAPAPPMM MMKPMAPPMKMAPMMM MMMMMKPMMMMKMMMM MMMMMMMMMMMMMMMM } # tile 541 (Beholder) { MMMMOAMMOAMMMMMM MMOAMDADAMOAMOAM MMMDAMDADADADDMM MMOADDOOOODDADOM MMMDDHOAAOHDDAMM MMMJDHOAAOHDDJMM MMMDDDOOOODDDDMM MMMDDDDDDDDDDDMM MMMJDAOAAAOADJMM MMMMDDAAOAADDMMM MMMMPDDDDDDDPAAM MMMMMMJDDDJAAAAM MMMMMMAAAAAAAAAM MMMMMMMAAAAAAAMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 542 (Vecna) { MMMHMMMMMMMMMMMM MMMHCHMHMMMMMMMM MMMHHHCHMMMMMMMM MMDODOHHMMMMMMMM MMOOOOOMMMMMMMMM HMOOMOMMMMMMMMMM HMMMMDDMMMMMMMMM HMMPPPDDMMMMAAAM MHPPPPDDDAMMAAAM MOMMPPDDDMAAAAAM MHMMOPPDDAAAAMAM MMHMMMPDDDAAMAMM MMHMMOPADDAMMMMM MMHOOOAMDDMMMMMM MMMMMMOODDMMMMMM MMMMMMMMMMMMMMMM } # tile 543 (archeologist) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMKJMJMMMMMM MMMMMMKJJJMMMMMM MMMMKCCKKJJJMMMM MMMMMMLELEAMMMMM MMMMMMLLLLAMMMMM MMMMMMALLAMMMMMM MMMMMCKAAKJMAAAM MMMMCKCKJJJJAAAM MMMMKACKKJAJAAAM MMMMLACJKJALAAAM MMMMMMCJJKAAAAMM MMMMMKCJAJJAMAMM MMMMMCJJMJKJMMMM MMMMMMMMMMMMMMMM } # tile 544 (barbarian) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMHHAMMMMMM MMMMMMHHHHAMMMMM MMMMMMLFLFAMMMMM MMMMMMLLLLAMMMMM MMMMMMALLAMMMMMM MMMMMLLAALLMAAAM MMMMLLLLLLLLAAAM MMMMLALLLLALAAAM MMMMLAALLAALAAAM MMMMLAJJKJALAAAM MMMMMMLJJLAAAAMM MMMMMMLLALAAMAMM MMMMMLLAMLLAMMMM MMMMMMMMMMMMMMMM } # tile 545 (caveman) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMJJAMMMMMM MMMMMMJJJJAMMMMM MMMMMJFLFLJMMMMM MMMMMJLLLLJMMMMM MMMMMJJDDJAMMMMM MMMMLLAJJALLAAAM MMMLLLLAALLLLAAM MMMLLALLLLALLAAM MMMMLACKKJALAAAM MMMMMMCCKJAAAAMM MMMMMMLAMLAAMAMM MMMMMLLAMLLAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 546 (cavewoman) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMJJAMMMMMM MMMMMMJJJJAMMMMM MMMMMJFLFLJMMMMM MMMMMJLLLLJMMMMM MMMMMJLDDLAJMMMM MMMMLJALLAJLAAAM MMMLLJCAAJJLLAAM MMMLLACKKJALLAAM MMMMLACCKJALAAAM MMMMMMCKKJAAAAMM MMMMMMLAMLAAMAMM MMMMMLLAMLLAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 547 (flame mage) { MMMMMMMMMMMMMMMM MMMMMMMMMHDMMMMM MMMMMMMHHDCMMMMM MMMMMMHDDCAMMMMM MMMMMMHAACAMMMMM MMMMMMHAACAMMMMM MMMMMMDLLCMMMMMM MMMMMMDAACAMAAAM MMMMMHHDHCCAAAAM MMMMDDDHCCCCAAMM MMMMLAHDDCALAAMM MMMMMMHDDCAAAAMM MMMMMHDDDCAAMAMM MMMMMHDDDDCAMMMM MMMMHDDDDDDCMMMM MMMMMMMMMMMMMMMM } # tile 548 (healer) { MMMMMMMMMMMMMMMM MMMMMMMNNMMMMMMM MMMMMMNDDOMMMMMM MMMMMMNNNNMMMMMM MMMMMMELEPMMMMMM MMMMMMLLLPMMMMMM MMMMMMMLLPMMMMMM MMMMMMOMMPAMAAAM MMMMMNNOOPPAAAAM MMMMOOONOPPPAAMM MMMMLANOOPALAAMM MMMMMMNOOPAAAAMM MMMMMNOOOPAAMAMM MMMMNOOOOOPAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 549 (ice mage) { MMMMMMMMMMMMMMMM MMMMMMMMMPNMMMMM MMMMMMMPPNBMMMMM MMMMMMPNNBAMMMMM MMMMMMPAABAMMMMM MMMMMMPAABAMMMMM MMMMMMNLLBMMMMMM MMMMMMNAABAMAAAM MMMMMPPNPBBAAAAM MMMMNNNPBBBBAAMM MMMMLAPNNBALAAMM MMMMMMPNNBAAAAMM MMMMMPNNNBAAMAMM MMMMMPNNNNBAMMMM MMMMPNNNNNNBMMMM MMMMMMMMMMMMMMMM } # tile 550 (knight) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMBPAMMMMMM MMMMMMBPPPAMMMMM MMMMMMPEEPAMMMMM MMMMMMPLLPAMMMMM MMMMMMALLAAMMMMM MMMMMBBAABBMAAAM MMMMBPPPPPPPAAAM MMMMPABPPPAPAAAM MMMMLAMPPMALAAAM MMMMMMBPMPAAAAMM MMMMMMBPAPAAMAMM MMMMMPPAMPPAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 551 (monk) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMCCCMMMMMM MMMMMMJCJJJAMMMM MMMMMMCAAAJAMMMM MMMMMMCAAAJAMMMM MMMMMMCKLKCAAAAM MMMMMCDDDDDDAAAA MMMMCDDLALDDDAAA MMMMDALLALLADAAM MMMMDDDDCDDDDAAM MMMMMAACCCDAAAAM MMMMMCDCCCDDAMAM MMMMCCCCCCCDDMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 552 (necromancer) { MMMMMMMMMMMMMMMM MMMMMMMMMAAPMMMM MMMMMMMAAAAPMMMM MMMMMMAAAAPMMMMM MMMMMMAAAAPMMMMM MMMMMMAPPAPMMMMM MMMMMMAOOAPMMMMM MMMMMMAAAAPMPPPM MMMMMAAAAAAPPPPM MMMMAAAAAAAAPPMM MMMMOPAAAAPOPPMM MMMMMMAAAAPPPPMM MMMMMAAAAAPPMPMM MMMMMAAAAAAPMMMM MMMMAAAAAAAAMMMM MMMMMMMMMMMMMMMM } # tile 553 (priest) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMJLLJMMMMMM MMMMMMJLLJAMMMMM MMMMMMLLLLAMMMMM MMMMMMALLJAMMMMM MMMMMMCJJCAAAAMM MMMMMLDDDDDAAAAM MMMMCDNJDDDDAAAM MMMNLNNNJDALAAMM MMMMMMNJDDAAAAMM MMMMMMLCCDAAAAMM MMMMMLDCCDDAMAMM MMMMLCCCCCDDMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 554 (priestess) { MMMMMMMMMMMMMMMM MMMMMMMJJMMMMMMM MMMMMMJJJJMMMMMM MMMMMMJLLJAMMMMM MMMMMMJLLJJMMMMM MMMMMJJLLJJMMMMM MMMMMJEJJEJAAAMM MMMMMLDEEDDAAAAM MMMMCDCJNDDDAAAM MMMMLMCNNNALAAMM MMMMMMCJNDAAAAMM MMMMMMCCNDAAAAMM MMMMMLDCCDDAMAMM MMMMLCCCCCDDMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 555 (ranger) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMCJAMMMMM MMMMMMMCJJJAMMMM MMMMMMMJEEJAMMMM MMMMMMMJLLJAMMMM MMMMMMMALLAAMMMM MMMMMMGGAAGGMAAA MMMMMBPFFFFPPAAA MMMMMPAGFFFAPAAA MMMMMLAMFFMALAAA MMMMMMMBPMPAAAAM MMMMMMMBPAPAAMAM MMMMMMPPAMPPAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 556 (rogue) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMOAMMMOAMMMM MMMMMOOIDPPAMMMM MMMMMMIDDDAMMMMM MMMMMMLKLKAMMMMM MMMMMMLLLLAMMMMM MMMMMMALLAMMMMMM MMMMMMBAABAAMMAM MMMMMKEBBEJAAAAM MMMMCAAEEAAKAAMM MMMMLAJJHJALAAMM MMMMMMKKJKAAAAMM MMMMMKCAMKCAMMMM MMMMMMMMMMMMMMMM } # tile 557 (samurai) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMAAMMMMM MMMMMMMAAAMMMMMM MMMMMMAAAAAMMMMM MMMMMALFLFAMMMMM MMMMMALLLLAMMMMM MMMMMMALLAMMMMMM MMMMIIIAAIIIAAAM MMMMLDIIIIDLAAAM MMMMLABBBBALAAAM MMMMLABBBBALAAAM MMMMMMIDDDAAAAMM MMMMMMIDADAAMAMM MMMMMIIAMIIAMMMM MMMMMMMMMMMMMMMM } # tile 558 (tourist) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMJKJJAMMMMM MMMMMMKJJJAMMMMM MMMJJJJJJJJJJMMM MMMMMMLFLFAAMMMM MMMMMMLLLLAMMMMM MMMMMMALLAMMMMMM MMMMMHGAAGHMAAAM MMMMLLGHHGLLAAAM MMMMLAHGHGALAAAM MMMMLAHHGHALAAAM MMMMMMJJJKAAAAMM MMMMMMLLALAAMAMM MMMMMLLAMLLAMMMM MMMMMMMMMMMMMMMM } # tile 559 (undead slayer) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMBPAMMMMMM MMMMMMBPPPAMMMMM MMMMMMPEEPAMMMMM MMMMMCPLLPAMMMMM MMMMMCALLAAMMMMM MMMMMCKAAKKMAAAM MMMMMCJJCJNNBAAM MMMMMCKJJJNNBAAM MMMMLLLJCJNNBAAM MMMMMCNOMOABAAMM MMMMMMOOAOAAMAMM MMMMMKJAMJKAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 560 (valkyrie) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMLHHLMMMMMM MMMMMHHHHHLMMMMM MMMMLHELELHMMMMM MMMMHHLLLLHMMMMM MMMHHHALLAMMMMMM MMMHJKJAAKJJAAAM MMHHLJJKKKJLAAAM MMHMLACKJCALAAAM MMMMLAACKAALAAAM MMMMMMKKJKAAAAMM MMMMMMKKAJAAMAMM MMMMMCLAMLKAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 561 (yeoman) { MMMMMMMMMMMMMMMM MMMMMMMOHAMMMMMM MMMMMMHHHHAMMMMM MMMMMMMLLAMMMMMM MMMMMMMLLAMMMMMM MMMMMCCCOCDAMMMM MMMMCDCCCDCDAMMM MMMMCDCCODCDAMMM MMMMLLCCCDLLAAAM MMMMMLCCODLAAAAM MMMMMMKKKJAAAAAM MMMMMMCKKJAAAAAM MMMMMMKAAJAAAAMM MMMMMMDAADAAAMMM MMMMMDDAMDDAMMMM MMMMMMMMMMMMMMMM } # tile 562 (wizard) { MMMMMMMMMMMMMMMM MMMMMMMMMBPMMMMM MMMMMMMBBPEMMMMM MMMMMMBPPEAMMMMM MMMMMMBAAEAMMMMM MMMMMMBAAEAMMMMM MMMMMMPLLEMMMMMM MMMMMMPAAEAMAAAM MMMMMBBPBEEAAAAM MMMMPPPBEEEEAAMM MMMMLABPPEALAAMM MMMMMMBPPEAAAAMM MMMMMBPPPEAAMAMM MMMMMBPPPPEAMMMM MMMMBPPPPPPEMMMM MMMMMMMMMMMMMMMM } # tile 563 (Lord Carnarvon) { MMMMMMMJJMMMMMMM MMMMMMCJJJMMMMMM MMMMKCKKCJJJMMMM MMMMMMLELEAMMMMM MMMMMMLLLLAMMMMM MMMMMMALLAMMMMMM MMMMMCIAAIKMAAAM MMMMCKKIICKKAAAM MMMKCCKKHKJCKAAM MMMKKAKHKJAKKAAM MMMKAIHKCJIAKAMM MMMLAICKKJIALAMM MMMMMICKAJIAAAMM MMMMMMCKAPAAAAMM MMMMMPPAMPPAMMMM MMMMMMMMMMMMMMMM } # tile 564 (Pelias) { MMMMMMMMMMMMMMMM MMMMMMMJJMMMMMMM MMMMMMKKKJMMMMMM MMMMMMLELEAMMMMM MMMMMMLLLLAMMMMM MMMMMMALLAMMMMMM MMMMMCKAAKCMAAAM MMMMCCKCKKKKAAAM MMMKKCKKKCJKKAAM MMMCKACKKKACKAAM MMMKAMCKCJAAKAMM MMMLAMCKAJAALAMM MMMMMMCKAJAAAAMM MMMMMMCKAPAAAAMM MMMMMPPAMPPAMMMM MMMMMMMMMMMMMMMM } # tile 565 (Shaman Karnov) { MMMMMMMMMMMMMMMM MMMMMMMJJAMMMMMM MMMMMMJJJJAMMMMM MMMMMJFLFLJMMMMM MMMMMJLLLLJMMMMM MMMMMJJDDJAMMMMM MMMMLHAJJAHLAAMM MMMLLLHAAHLLLAAM MMMLLLLHHLLLLAAM MMMLLALHHLALLAAM MMMLLALLLLALLAAM MMMMLACKKJALAAAM MMMMMMCKCJAAAAMM MMMMMMLAMLAAMAMM MMMMMLLAMLLAMMMM MMMMMMMMMMMMMMMM } # tile 566 (Master Shifter) { MMMMMMMNLAMMMMMM MMMMMMNDNDAMMMMM MMMMMMNNNLAMMMMM MMMMMMNNNLAMMMMM MMMMMMMNLAMMMMMM MMMMBBBBBBEAMMMM MMMBBBBBBBBEAMMM MMMBBEBBBEBBEAAA MMMBBEBBBEBBEAAA MMMLNLBBBENNLAAA MMMMLLBBBELLAAAA MMMMMBBEEBEAAAAA MMMMMBEAABEAAAAM MMMMNNLAANNLAAMM MMMLLLLAMLLLLAMM MMMMMMMMMMMMMMMM } # tile 567 (Thorin) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMHMCMHMMMMMMM MMMMHCHCHMMMMMMM MMMMHHHHHMMMMMMM MMMMBLLLEMMMAMMM MMMMMOLOMMMAAAAM MMMEBOOOEEAAAAMM MMMBABOEAEAAAAMM MMMMLBBELAAAAMMM MMMMEBAEEAAMMMMM MMMMBEAEBMAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 568 (Earendil) { MMMMMMMMMGMMMMMM MMMMBMMGGFMMBMMM MMMBBMGGGGABBMMM MMBPBPLELEABPBMM MMBBBPLLLLABBBMM MMPBPPALLAPPPMMM MMMPPBGAAGBBBMMM MMMBBLGGGFLBBBMM MMBBLAAGFAALBBMM MMMBLAGGGFALBMMM MMMMMMGFAFMMMMMM MMMMMMLMMLMAAAMM MMMMMMAAAAAAAAMM MMMMAAAAAAAAMMMM MMMMMAAAAAAMMMMM MMMMMMMMMMMMMMMM } # tile 569 (Elwing) { MMMMMMMMMGMMMMMM MMMMBMMGGFMMBMMM MMMBBMGGGGABBMMM MMBPBHLELEHBPBMM MMBBBHLLLLHBBBMM MMPBHHALLAHHPMMM MMMPHHGAAGHHBMMM MMMBBLGGGFLBBBMM MMBBLAAGFAALBBMM MMMBLAGGGFALBMMM MMMMMMGFAFMMMMMM MMMMMMLMMLMAAAMM MMMMMMAAAAAAAAMM MMMMAAAAAAAAMMMM MMMMMAAAAAAMMMMM MMMMMMMMMMMMMMMM } # tile 570 (High Flame Mage) { MMMMMMMMMHDMMMMM MMMMMMHHHDCMMMMM MMMMMHDDDCAMMMMM MMMAMHAAACAMMMMM MMADADAAACAMMMMM MMMAMDLLLCAMMMMM MMMAMHDLLCMMMMMM MMHADDHAACAMAAAM MMHADDDHHCCAAAAM MMHADMDCDCCCAAMM MMHAMMCDDCALAAMM MMMAMCDDDCAAAAMM MMMAMHDDDCAAMAMM MMMAHDDDDDCAMMMM MMMADDDDDDDCMMMM MMMMMMMMMMMMMMMM } # tile 571 (Hippocrates) { MMMMMMMMMMMMMMMM MMMMNNNNNOMMMMMM MMMNNNNNOAMMMMMM MMMOAAAAOAMMMMMM MMMOBABAOAMMMMMM MMMOAAAAOAMMMMMM MMMNNNNNPMBMMMMM MMMMPNNPOFBFAAAM MMNNNPPNNOBFAAAM MNONNNPNOFBAAAMM MLANNNPNOFBLAAMM MMMNNPNNOABFAAMM MMMNNNNNOABAAAMM MMNNNNNNOAAMAAMM MOOOOOOOOOAMMMMM MMMMMMMMMMMMMMMM } # tile 572 (Bilbo Baggins) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMOOAMMMMMMM MMMMMOLLOAMMMMMM MMMMOLELEOMMMMMM MMMMOLLLLOMMMMMM MMMMMKLLKAMMAAMM MMMCLKJJJLCAAAMM MMCLAKKJJALCAMMM MMLLAKJJJALLAMMM MMMLMCJJJALAAMMM MMMMMLLALLAMAMMM MMMMLLLMLLLMMMMM MMMMMMMMMMMMMMMM } # tile 573 (High Ice Mage) { MMMMMMMMMPNMMMMM MMMMMMPPPNBMMMMM MMMMMPNNNBAMMMMM MMMAMPAAABAMMMMM MMANANAAABAMMMMM MMMAMNLLLBAMMMMM MMMAMPNLLBMMMMMM MMPANNPAABAMAAAM MMPANNNPPBBAAAAM MMPANMNBNBBBAAMM MMPAMMBNNBALAAMM MMMAMBNNNBAAAAMM MMMAMPNNNBAAMAMM MMMAPNNNNNBAMMMM MMMANNNNNNNBMMMM MMMMMMMMMMMMMMMM } # tile 574 (King Arthur) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMOHHAMMMMMM MMMMMOHHHHAMMMMM MMMMMHBLBHAMMMMM MMMMMHLLLHAMMMMM MMMMMALLLAAMMMMM MMMMBBAAABBMAAAM MMMBPPPPPPPPAAAM MMMPABPPPPACPAAM MMNNNNNNNNNCLCAM MMMMMBPPMPACAAMM MMMMMBPAPPAAMAMM MMMMMBPAPPAAMAMM MMMMPPAAMPPAMMMM MMMMMMMMMMMMMMMM } # tile 575 (High Lycanthrope) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMKJJAMMMMMM MMMMMKJJJJAMMMMM MMMMMKGLGJAMMMMM MMMMMJLLLJAMMMMM MMMMMALLLAAMMMMM MMMMCLAAALCMAAMM MMMCLLLLLLLCAAAM MMMLACLLLCALAAAM MMMLAJJJKJALAAAM MMMMMJJKMJAAAAMM MMMMMJJAJJAAAMMM MMMMMJJAJJAAMMMM MMMMKLAAMLKAMMMM MMMMMMMMMMMMMMMM } # tile 576 (Grand Master) { MMMMMMMMMMMMMMMM MMMMMMMLLMMMMMMM MMMMMMLLLLMMMMMM MMMMMMLLLLMMMMMM MMLCMCALLACMMMMM MCLLCMCAACCCCMMM MCJLACCCCCCCCCMM MMJAACCCCCCCCCCM MMJCCCCCCCCCCCMA MMJMMPPPPPLCCAAA MMJMMCCCCLLCAAAA MMJMMCCCCCCCAAAA MMJMMCCCCCCCAAAA MMJMACCCCCCCAAAM MMJACCCCCCCCAAMM MMMMMMMMMMMMMMMM } # tile 577 (Dark Lord) { MMMMMMMMMAAMMMMM MMMMMMAAAAAMMMMM MMMMMAAAAAPMMMMM MMMAMAAAAAPMMMMM MMAIAADODAPMMMMM MMMAMAAAAAPMMMMM MMMAMAAAAAMMMMMM MMAAAAAAAAPMPPPM MMAAAAAAAAAPPPPM MMAAAMAAAAAAPPMM MMAAMMAAAAPOPPMM MMMAMAAAAAPPPPMM MMMAMAAAAAPPMPMM MMMAAAAAAAAPMMMM MMMAAAAAAAAAMMMM MMMMMMMMMMMMMMMM } # tile 578 (Arch Priest) { MMNMMMMMMMMMMMMM MNNNMMJLLJMMMMMM MMNMMMJLLJMMMMMM MMNMMMLLLLMMMMMM MMLCMCALLACMMMMM MCLLCMCAACJDKMMM MCHLACCCCJCCDKMM MMHAACCJJCCCCDKM MMHCCCCJCCJCCCMA MMHMMDCJCCLJCAAA MMHMMDCJCLLCAAAA MMHMMKCJCCDJAAAA MMHMMKCJCCDJAAAA MMHMACCJCCDJAAAM MMHACCCJJCCCAAMM MMMMMMMMMMMMMMMM } # tile 579 (Orion) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMCJAMMMMMM MMMMMMCJJJAMMMMM MMMMMMJEEJAMMMMM MMMMMMJLLJAMMMMM MMMMMMALLAAMMMMM MMMMMGGAAGGMMMMM MMMMBGFFFFFPMMMM MMMMBPFFFFPPAAAM MMMMPAGFFFAPAAAM MMMMLANNNNALAAAM MMMMMMBPMPAAAAAM MMMMMMBPMPAAAAMM MMMMMMBPAPAAMAMM MMMMMPPAMPPAMMMM } # tile 580 (Master of Thieves) { MMMMMMMMMMMMMMMM MMMHMMMMMHMMMMMM MMMHHIDKHHMMMMMM MMMMIDDDDMMMMMMM MMMMLLLLLAMMMMMM MMMMLBLBLAMMMMMM MMMMLLLLLAMMMMMM MMMMMLLLAMMMMMMM MMMMBMAABAAMMMMM MMMKEBBBEJAAAMMM MMKAEEEEEAJAAAMM MMLAJJHHJALAAAMM MMMMJKKKJAAAAAMM MMMMKKAJKAAAAMMM MMMJJAMMJJAMMMMM MMMMMMMMMMMMMMMM } # tile 581 (Lord Sato) { MMMMMAAAMMMMMMMM MMMMMAAAMMMMMMMM MMMAAAAAAAMMMMMM MMAALLLLLAAMMMMM MMALFFLFFLAMMMMM MMALLLLLLLAMMMMM MMMAALLLAMMMMMMM IIIIIAAAIIIIAAAM LLDIIIIIIDLLAAAM LLABBBBBBALLAAAM LLABBBBBBALLAAAM LLABBBBBBALLAAAM MMMIIDDDDAAAAAAM MMMIIAAIDAAAMMAM MMIIIAMIIIAAMMMM MMMMMMMMMMMMMMMM } # tile 582 (Twoflower) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMJKJJAMMMMM MMMMMMCJJJAMMMMM MMMMJJJJJJJJMMMM MMMMMNNLNNAMMMMM MMMMNALNALNAMMMM MMMMMNNANNAAMMMM MMMMMAAAAAAMAAAM MMMMLLHGHGLLAAAM MMMMLAGGGGALAAAM MMMMLAHGHGALAAAM MMMMMMJJJKAAAAMM MMMMMMJJAKAAMAMM MMMMMLLAMLLAMMMM MMMMMMMMMMMMMMMM } # tile 583 (Van Helsing) { MMMMMMMMMMMMMMMM MMMMMMMCDAMMMMMM MMMMMMCDDDAMMMMM MMMMDCDLLCDAMMMM MMMMMCDLLDDAMMMM MMMMMDAKJADAMMMM MMMMNKCKCKJNAMMM MMMNOKKKCKJNOAAM MMMNOKCKCKJNOAAA MMMLLJJJJJJLLAAA MMMMLNOOOOOLAAAM MMMMMNOOOOOAAAMM MMMMMNOAANOAAMMM MMMMMKJAAKJAAAMM MMMMKKJAMKJKAMMM MMMMMMMMMMMMMMMM } # tile 584 (Norn) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMNNNMMMMMMM MMMMMNNNNNMMMMMM MMMMMNELELNMMMMM MMMMNNLLLLNMMMMM MMMNNNALLAMMMMMM MMMNJKJAAKJJAAAM MMNNLJJKKKJLAAAM MMNMLACKJCALAAAM MMMMLAKCKKALAAAM MMMMMMKKKKAAAAMM MMMMMMCJAJAAMAMM MMMMMKLAMLKAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 585 (Neferet the Green) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMGGGMMMMMMM MMMMMGFFFGMMMMMM MMMMGFEFEGMMMMMM MMMMGFFFFEGMMMMM MNMGPEFFFEEMMMMM MIMMBBEAAEAMAAMM MIMBBPPBBEEAAAAM MIGBPPPPPEEEAAMM MIMPPMEPEAAGAAMM MIMMMBPPPAAAAAMM MNMMMBPPPEAAMAMM MMMMBPPPPPEAMMMM MMMBPPPPPPPEMMMM MMMMMMMMMMMMMMMM } # tile 586 (Lolth) { MMMMMMMMMMMMMMMM MMMMHMMMMMMMMMMM MMHMMMMAAMMMMMMM MMMMLHALLAMMMMMM MMMHLMALLAMMMMMM MMMMLDLLLLDMMMMM MMMMMMDLLDLMMMMM MMMMAMDDDDLAPMMM MMMAMAMDDMAPAPMM MMMAMAAAAAAPAPMM MMAMAMAAAAPAPAMM MMAMAMMAAPPAPAMM MMMAMMMMMPPPAMMM MMMAMMMMMMMMAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 587 (Chief Yeoman Warder) { MMMMMMMAAAMMMMMM MMMMMMMAAAMMMMMM MMMMMMMAAAMMMMMM MMMMMMMLLAMMMMMM MMMMMMMLLAMMMMMM MMMMMDDAADKAMMMM MMMMDKDDDKDKAMMM MMMMDKDDOKDKAAAM MMMMOODDDCOOAAAM MMMMMODDOKOAAAAM MMMMMMAAHAAAAAAM MMMMMMKJKJAAAAAM MMMMMMCAAJAAAAMM MMMMMMHAAHAAAMMM MMMMMHHAMHHAMMMM MMMMMMMMMMMMMMMM } # tile 588 (Minion of Huhetotl) { MMMOPMMMMMMPOMMM MMMOODDDDDDOODMM MMDLOOCDDCOOLDDM MDDDLDDDDDDLDDDM MCCDDDNDDNDDDCCM CCDKDDDDDDDDJCCC CDDKCDDIIDDJJCCD CDDKKKDAADJJDCDD CCDKDDKKKJDDKCDD MCCDKCDDDDKKCDDD MCCDADKDDKDACDDM MDDDADDDDDDADDDM MMMMCCDDDDKKAAMM MMMCDDDAADDDKAAM MMCDDDAAAMDDDKMM MMMMMMMMMMMMMMMM } # tile 589 (Thoth Amon) { MMMMMMMMMMMMMMMM MMMMMMOJJOMMMMMM MMMMMMJJJJAMMMMM MMMMMMBLBLAMMMMM MMMMMMLLLLAMMMMM MMMMMMALLAMMMMMM MMMMMBPAAPPMAAAM MMMMBPPPPPPPAAAM MMMPPBPPPPJPPAAM MMMPPAPPPMAPPAMA MMMPAMBPPMAAPAMA MMMLAMBPPMMALMAM MMMMMMBPAMAMMAMM MMMMMMBPAPAAAAMM MMMMMPPAMPPAMMMM MMMMMMMMMMMMMMMM } # tile 590 (Chromatic Dragon) { MMMMMMGGGFAMMMMM MMMMMNFNFEEAMMMM MMMMGFFFEECAMMMM MMDCHHFMMCCAMMMM CHCHCDMMBCCAMMMM HDMDMMMBFFAMMMMM MMMMMMOBFAAAAAAM MMMMHOGFAAAAAAAA MMHOOIEAMEFMAAAM MHOOOIEEEEFFJAAM MHOOOIEEFFFDDAAM HBOOIIEFFFDDCCAM HBMOIEFOODDMCJAM HBAAGEMAADDACCAM MMMMGFAAMMMCCJAM MMMMMMMMFFFFJAMM } # tile 591 (Transmuter) { MMMMMMMCCPMMMMMM MMMMMMGDGDPMMMMM MMMMMMCDDDPMMMMM MMMMMMCDDDPMMMMM MMMMMMMDDPMMMMMM MMMMAAAAAAAPMMMM MMMAAAAAAAAAPMMM MMMAAAAAAAAAAPPP MMMAAAAAAAAAAPPP MMMCDDAAAACDDPPP MMMMCDAAAACDPPPP MMMMMAAAAAAPPPPP MMMMMAAPPAAPPPPM MMMMCDDPPCDCPPMM MMMCDDDPMCDDCPMM MMMMMMMMMMMMMMMM } # tile 592 (Smaug) { MMMMMMIIIDAMMMMM MMMMMNDNDDDAMMMM MMMMIDDDDDDAMMMM MMDCHHDMMDDAMMMM CHCHCDMMIDDAMMMM HDMDMMMIDDAMMMMM MMMMMMHIDAAAAAAM MMMMIHIDAAAAAAAA MMIHHIDAJDDJAAAM MIHHHIDDDDDDJAAM MIHHHIDDDDDDDAAM DDHHIIDDDDDDDDAM IDMHIDDHHDDJDJAM IDAAIDMAADDADDAM MMMMIDAAJJJDDJAM MMMMMMMMDDDDJAMM } # tile 593 (Goblin King) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MHMMHMMMHMMMMMMM CLCMHCHCHMMMMMMM CLCMHHHHHMMMMMMM MHMMIIIIIMMMMMMM MHKMIHIHIMIMMMMM MHICKIIIJKKMMMMM MHMIIJJJKMAAMMMM MHMMJICJJAAAAAMM MHMMIIIIJAAAAAMM MMMMJIIJJAAMMMMM MMMMIJKJJAMMMMMM MMMIKAAMIKMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 594 (Water Mage) { MMMMMMMMMBEMMMMM MMMMMMBBBEPMMMMM MMMMMBEEEPAMMMMM MMMAMBAAAPAMMMMM MMAEAEAAAPAMMMMM MMMAMELLLPAMMMMM MMMAMBELLPMMMMMM MMPAEEBAAPAMAAAM MMPAEEEBBPPAAAAM MMPAEMEBEPPPAAMM MMPAMMBEEPALAAMM MMMAMPEEEPAAAAMM MMMAMBEEEPAAMAMM MMMABEEEEEPAMMMM MMMAEEEEEEEPMMMM MMMMMMMMMMMMMMMM } # tile 595 (Lareth) { MMMMMMMMMMMMMMMM MMBBBPMKJPMMMMMM MBPPPPMLLPMMMMMM MMMKPMMLLPMMMMMM MMMKPMAAAAPMMMMM MMLKAAAAAAAPMMMM MMLKAAAAAAAAPMMM MMMKPMAAAAPAAPMM MMMCPMAAAAPLLPMM MMMKPMKJJJPPLPPP MMMKPMAAAAPPPPPP MMMKPMAAAAPPPPPM MMMCPMAPPAPPPPMM MMMMMKJPPKJPPMMM MMMMKKJPMKJJPMMM MMMMMMMMMMMMMMMM } # tile 596 (Cyclops) { MMMMMMMMMMMMMMMM MMMMLLLLLMMMMMMM MMMCLLLLLCMMMMMM MMMLBABNNLMMMMMM MMMLBBBNNLJAMMMM MMMCLNNNLCJAMMMM MMMMLLLLLJAAAMMM MMMMLAALLAAAAMMM MMJKJLLLKAKJAAMA MCLKAJJJJAKLCAAA MLLJKAAAACJLLAAM MLAAJCKKKJAALAAM MLCMGGGHGGACLAAA MLLMJJJJJJALLAAA MMMMCJJJCLAAAAAA MMLLLLLMLLLLLAAM } # tile 597 (Gollum) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMAAPMMMMMMM MMMMMAAAAPMMMMMM MMMMAKFJFAPMMMMM MMMMAKJJJAPMMMMM MMMMAAJJAAPMPPMM MMMAAAAAAAAPPPMM MMAAPAAAAPAAPPMM MMKAPAAAAPAJPPMM MMMCMAAAAPKPPMMM MMMMMAAPAAPPPMMM MMMMKJAPAJKPMMMM MMMMMMMMMMMMMMMM } # tile 598 (Earth Mage) { MMMMMMMMMGKMMMMM MMMMMMGGGKFMMMMM MMMMMGKKCFAMMMMM MMMAMGAAAFAMMMMM MMAKAKAAAFAMMMMM MMMAMKLLLFAMMMMM MMMAMGKLLFMMMMMM MMPACKGAAFAMAAAM MMPAKKKGGFFAAAAM MMPACMKFKFFFAAMM MMPAMMFKCFALAAMM MMMAMFKKKFAAAAMM MMMAMGCKKFAAMAMM MMMAGKKKCKFAMMMM MMMAKCKKKKCFMMMM MMMMMMMMMMMMMMMM } # tile 599 (Ixoth) { MMMMOMMMMMMOMMMM MMMMOMMMMMMOMMMM MMMLOOCDDCOOLMMM MMMDDDDDDDDDDDMM MCCDDDGDDGDDDCCM CCDKDDDDDDDDJCCC CDDKCKDIIDJJDCCD CDDKDDKJJJDDDCDD CCDKDDDDDDDDKCDD MCCDKKDDDDCKCDDD MCCDADKDDKDACDDM MDDDADDDDDDADDDM MMMMCCDDDDKKAAMM MMMCDDDAADDDKAAM MMCDDDAAAMDDDKMM MMMMMMMMMMMMMMMM } # tile 600 (Sir Lorimar) { MJAMMMMMMMMMMMMM MJAMMMMNNAMMMMMM MJAMMMNOONAMMMMM MJAMMMNAAOAMMMMM MMJAMMNLLOAMMMMM MMJAMMNOOOAMMMMM MMJKKCCCDCDKCAMM MMJJJCCCCCDJJKAM MMKKACCCDCNNNNOA MMLLACCCCCNOOOHA MMLJAJJJJJNOOOHA MMMJAKJJJJJNOHAA MMMMJKJAAKJAOAAM MMMMJCDAACDAAAMM MMMMJDDAMCDCAMMM MMMMJAMMMMMMMMMM } # tile 601 (Master Kaen) { MMMMMMMMMMMMMMMM MMMMMMMCKAMMMMMM MMMMMMKJJKAMMMMM MMCKAMKAAKAMKKAM MKAAKACDDCAKAAKA MKOOJKKOOKKCOOJA MCJJJJJJJJJKJJJA MMKJJJJJJJJJJJAM MMMMKKJJJJJJAMMM MMMMMMKJJJAAAAAA MMMMMKKJJJKAAAAA MMMMMKJJJJJAAAAA MMMMCJJJJJJKAAAM MMMKJJJJJJJKKAAM MMMKJJJJJJJJJAMM MMMMMMMMMMMMMMMM } # tile 602 (Maugneshaagar) { MMMMMMMMMMMMMMMM MAPMAPMMMMAPMAPM MAAPAPMMMMAPAAPM AAAAAAAAAAAAAAAP APPAAAAAAAAAAPAP PAAAAADADAAAAAPP AAAAAAAAAAAAAAAP AAAPAAAJAAAPAAAP AAAPAAAAAAAPAAAP AAAPAAAAAAAPAAAP MAAAPAAAAAPAAAAP MMAAPAAAAAPAAAPP MMMMAAAAAAAPPPPP MMMAAAAPAAAAPPPM MMAAAAPPMAAAAPMM MMMMMMMMMMMMMMMM } # tile 603 (Nalzok) { MMMMOAMMMMMOAMMM MMMMOAMMMMMOAMMM MMMBOOHGGHOOBAMM MMMGGGGGGGGGGGAM MHHGGGDGGDGGGHHA HHGPGGGGGGGGFHHH HGGPPPGEEGFFGHHG HGGPGGPFFFGGGHGG HHGPGGGGGGGGPHGG MHHGPPGGGGPPHGGG MHHGAGPGGPGAHGGA MGGGAGGGGGGAGGGA MMMMHHGGGGHHAAAA MMMHGGGAAGGGHAAM MMHGGGAAAMGGGHAM MMMMMMMMMMMMMMMM } # tile 604 (Scorpius) { MMMMMJLJLJAAMMMM MMMMJAMJCJCKAAMM MMMMAJMMMMMJJJAM MMMMLAMMMMMMLCKA MJAKJAMMMMMMJJJA MMJJAMMMMMMALCJA MMMMMMMALLAJCJKA MMMMJJALCCAAJJAM MJJALLAJCJJJAAMM JAMLCCAJAJJAAAAM MMJACJJJAAACCJAA GGJJJJJAACCAAAJA MJJGGAJACAAJJAAA DMJJAAJAACAMJAAM MMMDMMMJAAJAMJJM MMMMMMMMJAMJAMMM } # tile 605 (Master Assassin) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMAAMMMMMMM MMMMMMAAAAMMMMMM MMMMMABLBLAMMMMM MMMMMAAAAAAMMMMM MMMMMMAAAAMMMMMM MMMMMAAAAAAMMPPM MMMMAAAAAAAAPPPM MMMMAAAAAAAAPPPM MMMMLAAAAAALPPPM MMMMMMAAAAAPPPMM MMMMMMAAAAAPMPMM MMMMMAAAMAAAMMMM MMMMMMMMMMMMMMMM } # tile 606 (Ashikaga Takauji) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMAAMMMMMMMM MMMMMMMAAAMMMMMM MMMMMMAAAAAMMMMM MMMMMALFLFAMMMMM MMMMMALLLLAMMMMM MMMMMMALLAMMMMMM MMMMIIIAAIIIAAAM MMMMLDIIIIDLAAAM MMMMLAIIIIALAAAM MMMMLALHHLALAAAM MMMMMMIIIIAAAAMM MMMMMMIIAIAAMAMM MMMMMIIAMIIAMMMM MMMMMMMMMMMMMMMM } # tile 607 (Count Dracula) { MMMMMMMMMMMMMMMM MMNMMAAAAMMMMMMM ADNDAAOOAADDDAMM MANDAGAAGADDAMMM MMNDALLLOADAMMMM MMNAAAAAAAAAAAAA MHHHDAAAAADDDDDA HEHEHJAAAADDDAAM LLLLLJAAAADDAAPP MLLLJAAAAADDAPPP MMNJDAAAAADAPPPP MANDDAAAAAAAPPPP MANAAAAAAAAPPPPM MMNMMAAAPAAPPPMM MMNMAAPPMMAPMMMM MMMMMMMMMMMMMMMM } # tile 608 (Lord Surtur) { MMMMPPDDDDAAMMMM MMMMPDDDDDDDAMMM MMMPPDLLLLDDAMMM MMMPDPFLLFFDAMMM MMMPPPLLLLLDAMMM MMMMPLLAALLAAAMM MMMPPALLLLBAAAAM MMMPPDBBBBBBBAAM MMBDDHDPBPPPPPAM MMPPHDDPBPPPPPAM MMLAHDHPBPPAALAA JLAADDHBBBBAALAA JJLJDHHPBPPPCLAA MMLLJBPPABPPLLAA MMMMMBPPABPPAAAA MMMLLLLJMBLLLKAA } # tile 609 (Dark One) { MMMMMMMMMMMMMMMM MMMMMMAAAMMMMMMM MMMMMAAAAAMMMMMM MMMMMADADAMMMMMM MMMMMAAAAAMMMMMM MMMMAAAAAAAMMMMM MMMMAAAAAAAMMMMM MMMAAAAAAAAAMMMM MMMAAAAAAAAAMMMM MMAAAAAAAAAAAMMM MMAAAAAAAAAAAMMM MMMAAAAAAAAAMMMM MMMAAAAAAAAAAMMM MMAAAAAAAAAAAAMM AAAAAAAAAAAAAAAA MMMMMMMMMMMMMMMM } # tile 610 (Colonel Blood) { MMMMMMMAAPMMMMMM MMMMMMMAAPMMMMMM MMMMMAAAAAAPMMMM MMMMMMKLLJMMMMMM MMMMMMKLLJMMMMMM MMMMAAJKKJAAMMMM MMMAAAAKJAAAAMMM MMMAAAAAOAAAAPPM MMMAAAAAAAAAAPPM MMMKLAAAOAALKPPM MMMMLKCKDKKLPPPM MMMMMAAAAAAPPPPM MMMMMAAPPAAPPPMM MMMMMKJPPKJPPMMM MMMMKKJPMCJJMMMM MMMMMMMMMMMMMMMM } # tile 611 (student) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMGGFGGMMMMMM MMMMMMMGMMMMMMMM MMMMMMNDNDMMMMMM MMMDDDDDDDDMMMMM MMMMMMLELEAMMMMM MMMMMMLLLLAMMMMM MMMMMMALLAMMMMMM MMMMMCKAAKJMAAAM MMMMCKKCJJJJAAAM MMMMKACKJJAJAAAM MMMMLACJKJALAAAM MMMMMKCJAJJAMAMM MMMMMCJJMJKJMMMM MMMMMMMMMMMMMMMM } # tile 612 (chieftain) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMHHAMMMMMM MMMMMMHHHHAMMMMM MMMMMMLFLFAMMMMM MMMMMMLLLLAMMMMM MMMMMHALLAHMMMMM MMMMLLHAAHLLAAAM MMMMLLLIILLLAAAM MMMMLALIILALAAAM MMMMLAALLAALAAAM MMMMLAJJKJALAAAM MMMMMMLJJLAAAAMM MMMMMMLLALAAMAMM MMMMMLLAMLLAMMMM MMMMMMMMMMMMMMMM } # tile 613 (neanderthal) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMJJJJMMMMMM MMMMMJJJJJJMMMMM MMMMMJFLFLJMMMMM MMMMMJLLLLJMMMMM MMMMMJJDDJAMMMMM MMMMJJAJJAJJMAAM MMMJLLJAAJLLJAAM MMMLLALJJLALLAAM MMMMLALCCLALAAAM MMMMMMLAMLAAMAMM MMMMMLLAMLLAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 614 (shifter) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMNLMMMMMMM MMMMMMNDNDMMMMMM MMMMMMMLLAMMMMMM MMMMMMBBBEAMMMMM MMMMMBBBBBEAMMMM MMMMMBBBBEEAMMMM MMMMMBBBBEEAAAAM MMMMMLBBBELAAAAM MMMMMMBEEEAAAAAM MMMMMMBAAEAAAAMM MMMMMMEAAEAAAMMM MMMMMLLAMLLAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 615 (dwarf warrior) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMBMMMMMMMMM MMMMMBEEMMMMMMMM MMMMBBEEEMMMMMMM MMMMBLLLEMMMMMMM MMMMMOLOMMMAAAMM MMMBBOOOEEAAAAMM MMMBABOEAEAAAAMM MMMMLBBELAAAAMMM MMMMEBAEEAAMMMMM MMMMBEAEBMAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 616 (igniter) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMJJJJMMMMMM MMMMMMJLLJAMMMMM MMMMMMLLLLAMMMMM MMMMMMALLJAMMMMM MMMMMMDJJDAAAAMM MMMMMCHHHHHAAAAM MMMMDHDDHHHHAAAM MMMMLMCDDHALAAMM MMMMMMCDDHAAAAMM MMMMMMCDDHAAAAMM MMMMMCHDDHHAMAMM MMMMCDDDDDHHMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 617 (froster) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMJJJJMMMMMM MMMMMMJLLJAMMMMM MMMMMMLLLLAMMMMM MMMMMMALLJAMMMMM MMMMMMNJJNAAAAMM MMMMMBPPPPPAAAAM MMMMNPNNPPPPAAAM MMMMLMBNNPALAAMM MMMMMMBNNPAAAAMM MMMMMMBNNPAAAAMM MMMMMBPNNPPAMAMM MMMMBNNNNNPPMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 618 (fiend) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMJJAMMMMMM MMMMMMJJJJAMMMMM MMMMMMDODOAMMMMM MMMMMMOOOOAMMMMM MMMMMMAOOAMMMMMM MMMMMHOAAOHMAAAM MMMMHOOOOOOHAAAM MMMMOAHOOHAOAAAM MMMMOAFFGFAOAAAM MMMMMMFFFGAAAAMM MMMMMMFFAFAAMAMM MMMMMFOAMOGAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 619 (attendant) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMJJJAMMMMMM MMMMMJLLLJAMMMMM MMMMMMBLBAMMMMMM MMMMMMLLLAMMMMMM MMMMMNPNPOAMAAAM MMMMMNNPNNOAAAAM MMMMNONPNONOAAMM MMMMLANNNOALAAMM MMMMMMNNNOAAAAMM MMMMMNNNNOAAMAMM MMMMOOOOOOOAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 620 (proudfoot) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMJJAMMMMMMM MMMMMJJJJAMMMMMM MMMMJLDLDJMMMMMM MMMMJLLLLJMMMMMM MMMMJKLLKJJMAAMM MMMCLCDDDLCAAAMM MMCLACDDDALCAMMM MMLLAJJKJALLAMMM MMMLMLKJLALAAMMM MMMMCLLALLKAAMMM MMMLLLLALLLLAMMM MMMMMMMMMMMMMMMM } # tile 621 (intern) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMKCKAMMMMMM MMMMMMLLLAMMMMMM MMMMMMLLLAMMMMMM MMMMMNPNPOAMMMMM MMMMMNNPNNOAAAMM MMMMNONPNOOAAAMM MMMMLANNNALAAAMM MMMMMMKJJAAAAMMM MMMMMMKAKAAAMMMM MMMMMPPAPPAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 622 (page) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMKKAMMMMMM MMMMMMMLLAMMMMMM MMMMMMMLLAMMMMMM MMMMMBBPPBBAMMMM MMMMBPPPPPPBAAAM MMMMBABPPPAPAAAM MMMMLABPPPALAAAM MMMMMMBPPPAAAAMM MMMMMMBAABAAMAMM MMMMMBPAMBBAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 623 (abbot) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMKLKMMMMMMM MMMMMMLLLMMMMMMM MMMMCCLLLJJMMMMM MMMMKCKLKKJAAAMM MMMMCDDDDDDAAAAM MMMCDDLALDDDAAAM MMMDALLALLADAAMM MMMDDDDCDDDDAAMM MMMMAACCCDAAAAMM MMMMCDCCCDDAMAMM MMMCCCCCCCDDMMMM } # tile 624 (embalmer) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMAAAAMMMMMM MMMMMMAOOAAMMMMM MMMMMMOOOOAMMMMM MMMMMMAOOAAMMMMM MMMMMMNAANAAAAMM MMMMMOPPPPPAAAAM MMMMNPNNPPPPAAAM MMMMOMONNPAOAAMM MMMMMMONNPAAAAMM MMMMMMONNPAAAAMM MMMMMOPNNPPAMAMM MMMMONNNNNPPMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 625 (acolyte) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMJJJJMMMMMM MMMMMMJLLJAMMMMM MMMMMMLLLLAMMMMM MMMMMMALLJAMMMMM MMMMMMCJJCAAAAMM MMMMMLDDDDDAAAAM MMMMCDCCDDDDAAAM MMMMLMLCCDALAAMM MMMMMMLCCDAAAAMM MMMMMMLCCDAAAAMM MMMMMLDCCDDAMAMM MMMMLCCCCCDDMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 626 (hunter) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMJMMCJAMMMMMM MMMJMMCJJJAMMMMM MMMJMMJEEJAMMMMM MMJMMMJLLJAMMMMM MMJMMMALLAAMMMMM MMJMMGGAAGGMAAAM MMLPBPFFFFPPAAAM MMJMMAGFFFAPAAAM MMJMMMMFFMALAAAM MMMJMMBPMPAAAAMM MMMJMMBPAPAAMAMM MMMMJPPAMPPAMMMM MMMMMMMMMMMMMMMM } # tile 627 (thug) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMIDMMMMMMM MMMMMMIDDDAMMMMM MMMMMMLKLKAMMMMM MMMMMMLLLLAMMMMM MMMMMMALLAMMMMMM MMMMMKKAAKKAMMAM MMMMKCJKCKJKAAAM MMMMKAAJJAACAAMM MMMMLAJJJJALAAMM MMMMMMKKJKAAAAMM MMMMMMCAAKAAAAMM MMMMMKKAMKCAMMMM MMMMMMMMMMMMMMMM } # tile 628 (ninja) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMAAMMMMM MMMMMMMAAAMMMMMM MMMMMMAAAAAMMMMM MMMMMAFLFLAMMMMM MMMMMAAAAAAMMMMM MMMMMMAAAAMMMMMM MMMMAAAAAAAAMPPM MMMMAAAAAAAAPPPM MMMMAAAAAAAAPPPM MMMMLAAAAAALPPPM MMMMMMAAAAAPPPMM MMMMMMAAAAAPMPMM MMMMMAAAMAAAMMMM MMMMMMMMMMMMMMMM } # tile 629 (ronin) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMAAAMMMMMM MMMMMMAAAAAMMMMM MMMMMMFLFLAMMMMM MMMMMMLLLLAMMMMM MMMMMMMLLAMMMMMM MMMMIIIIIIIIAAAM MMMMLAIIIIALAAAM MMMMLABBBBALAAAM MMMMLABBBBALAAAM MMMMMMIAAIAAAAMM MMMMMMIAAIAAMAMM MMMMMLLAMLLAMMMM MMMMMMMMMMMMMMMM } # tile 630 (roshi) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMAAAAAMMMM MMMMMMAAAAAMMMMM MMMMMALFLFAMMMMM MMMMMALLLLAMMMMM MMMMMMALLAMMMMMM MMMMPPPAAPPPAAAM MMMMLMPPPPMLAAAM MMMMLAOOOOALAAAM MMMMLAOOOOALAAAM MMMMMMPMMMAAAAMM MMMMMMPMAMAAMAMM MMMMMPPAMPPAMMMM MMMMMMMMMMMMMMMM } # tile 631 (guide) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMJKJJAMMMMM MMMMMMCJJJAMMMMM MMMMJJJJJJJJMMMM MMMMMMLFLFAAMMMM MMMMMMLLLLAMMMMM MMMMMMALLAMMMMMM MMMMMHHAAHHMAAAM MMMMLLHHHHLLAAAM MMMMLAHHHHALAAAM MMMMLAHHHHALAAAM MMMMMMJJJKAAAAMM MMMMMMJJAKAAMAMM MMMMMLLAMLLAMMMM MMMMMMMMMMMMMMMM } # tile 632 (exterminator) { MMMMMMMMMMMMMMMM MMMMMMMKJAMMMMMM MMMMMMMLPAMMMMMM MMMMMMMADAMMMMMM MMMMMMMLPAMMMMMM MMMMMMMLLAMMMMMM MMMMKKKJJKKAMMMM MMMCJKJACJKKAMMM MMMKAKJJJJAJAMMM MMMCAKJACJAJAAAA MMMLLACJJAAPAAAA MMMMLAKJJAAPAAAA MMMMMMKJKJAAAAAM MMMMMMKJCJAAAAMM MMMMJJJAJJJAAAMM MMMAAAAAAAAAAMMM } # tile 633 (warrior) { MMMMMOMMMMOMMMMM MMMMMNOMMONMMMMM MMMMMMNPPNMMMMMM MMMMMPPPPPPMMMMM MMMMMPELELPMMMMM MMMMHHLLLLHMMMMM MMMHHHALLAMMMMMM MMMHJKJAAKJJAAAM MMHHLJJKKKJLAAAM MMHMLACKJCALAAAM MMMMLAACKAALAAAM MMMMMMKKJKAAAAMM MMMMMMKKAJAAMAMM MMMMMMKJAJAAMAMM MMMMMCLAMLKAMMMM MMMMMMMMMMMMMMMM } # tile 634 (apprentice) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMJJJMMMMMMM MMMMMJLLLJMMMMMM MMMMMMGLGMMMMMMM MMMMMBLLLEMMMMMM MMMMMBBEEEAMAAAM MMMMMBBPBEEAAAAM MMMMPPPBEEEEAAMM MMMMLABPPEALAAMM MMMMMMBPPEAAAAMM MMMMMBPPPEAAMAMM MMMMMBPPPPEAMMMM MMMMBPPPPPPEMMMM MMMMMMMMMMMMMMMM } # tile 635 (Yeoman Warder) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMLLAMMMMMM MMMMMMMLLAMMMMMM MMMMMMCCCDAMMMMM MMMMMDCCODDAMMMM MMMMMDCCCDDAMMMM MMMMMLCCODLAAAAM MMMMMMCCCDAAAAAM MMMMMMKKKJAAAAAM MMMMMMCAAJAAAAAM MMMMMMKAAJAAAAMM MMMMMDDAADDAAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 636 (Farmer Maggot) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMLLAMMMMMM MMMMMMMLLAMMMMMM MMMMMMCCCDAMMMMM MMMMMDCCODDAMMMM MMMMMDCCCDDAMMMM MMMMMLCCODLAAAAM MMMMMMCCCDAAAAAM MMMMMMKKKJAAAAAM MMMMMMCAAJAAAAAM MMMMMMKAAJAAAAMM MMMMMDDAADDAAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 637 (invisible monster) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMNNNNMMMMMMM MMMMNNNNNNMMMMMM MMMNNAAAANNMMMMM MMMNNAMMMNNAMMMM MMMMAAMMMNNAMMMM MMMMMMMMNNAAMMMM MMMMMMMNNAAMMMMM MMMMMMNNAAMMMMMM MMMMMMNNAMMMMMMM MMMMMMMAAMMMMMMM MMMMMMNNMMMMMMMM MMMMMMNNAMMMMMMM MMMMMMMAAMMMMMMM MMMMMMMMMMMMMMMM } ��������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/share/oth-2kmi.txt������������������������������������������������������������0000664�0000764�0000764�00000042057�10545462317�015756� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������__ = (255, 0, 0) _A = (224, 0, 0) _B = (192, 0, 0) _C = (160, 0, 0) _D = (128, 0, 0) _E = (96, 0, 0) _F = (64, 0, 0) _G = (48, 0, 0) _H = (32, 0, 0) _I = (24, 0, 0) _J = (16, 0, 0) _K = (128, 64, 64) _L = (160, 80, 80) _M = (192, 96, 96) _N = (224, 112, 112) _O = (255, 128, 128) _P = (255, 64, 0) _Q = (224, 56, 0) _R = (192, 48, 0) _S = (160, 40, 0) _T = (128, 32, 0) _U = (96, 24, 0) _V = (64, 16, 0) _W = (48, 12, 0) _X = (32, 32, 0) _Y = (24, 24, 0) _Z = (16, 16, 0) _a = (128, 128, 64) _b = (160, 160, 80) _c = (192, 192, 96) _d = (224, 224, 112) _e = (255, 255, 128) _f = (255, 128, 0) _g = (224, 112, 0) _h = (192, 96, 0) _i = (160, 80, 0) _j = (128, 64, 0) _k = (96, 48, 0) _l = (64, 32, 0) _m = (48, 24, 0) _n = (0, 32, 0) _o = (0, 24, 0) _p = (0, 16, 0) _q = (64, 128, 64) _r = (80, 160, 80) _s = (96, 192, 96) _t = (112, 224, 112) _u = (128, 255, 128) _v = (255, 192, 0) _w = (224, 168, 0) _x = (192, 144, 0) _y = (160, 120, 0) _z = (128, 96, 0) _0 = (96, 72, 0) _1 = (64, 48, 0) _2 = (48, 36, 0) _3 = (0, 32, 32) _4 = (0, 24, 24) _5 = (0, 16, 16) _6 = (64, 128, 128) _7 = (80, 160, 160) _8 = (96, 192, 192) _9 = (112, 224, 224) _$ = (128, 255, 255) A_ = (255, 255, 0) AA = (224, 224, 0) AB = (192, 192, 0) AC = (160, 160, 0) AD = (128, 128, 0) AE = (96, 96, 0) AF = (64, 64, 0) AG = (48, 48, 0) AH = (0, 0, 32) AI = (0, 0, 24) AJ = (0, 0, 16) AK = (64, 64, 128) AL = (80, 80, 160) AM = (96, 96, 192) AN = (112, 112, 224) AO = (128, 128, 255) AP = (128, 255, 0) AQ = (112, 224, 0) AR = (96, 192, 0) AS = (80, 160, 0) AT = (64, 128, 0) AU = (48, 96, 0) AV = (32, 64, 0) AW = (24, 48, 0) AX = (32, 0, 32) AY = (24, 0, 24) AZ = (16, 0, 16) Aa = (128, 64, 128) Ab = (160, 80, 160) Ac = (192, 96, 192) Ad = (224, 112, 224) Ae = (255, 128, 255) Af = (0, 255, 0) Ag = (0, 224, 0) Ah = (0, 192, 0) Ai = (0, 160, 0) Aj = (0, 128, 0) Ak = (0, 96, 0) Al = (0, 64, 0) Am = (0, 48, 0) An = (96, 48, 48) Ao = (64, 32, 32) Ap = (48, 24, 24) Aq = (128, 96, 96) Ar = (160, 120, 120) As = (192, 144, 144) At = (224, 168, 168) Au = (255, 192, 192) Av = (0, 255, 128) Aw = (0, 224, 112) Ax = (0, 192, 96) Ay = (0, 160, 80) Az = (0, 128, 64) A0 = (0, 96, 48) A1 = (0, 64, 32) A2 = (0, 48, 24) A3 = (96, 96, 48) A4 = (64, 64, 32) A5 = (48, 48, 24) A6 = (128, 128, 96) A7 = (160, 160, 120) A8 = (192, 192, 144) A9 = (224, 224, 168) A$ = (255, 255, 192) B_ = (0, 255, 255) BA = (0, 224, 224) BB = (0, 192, 192) BC = (0, 160, 160) BD = (0, 128, 128) BE = (0, 96, 96) BF = (0, 64, 64) BG = (0, 48, 48) BH = (48, 96, 48) BI = (32, 64, 32) BJ = (24, 48, 24) BK = (96, 128, 96) BL = (120, 160, 120) BM = (144, 192, 144) BN = (168, 224, 168) BO = (192, 255, 192) BP = (0, 128, 255) BQ = (0, 112, 224) BR = (0, 96, 192) BS = (0, 80, 160) BT = (0, 64, 128) BU = (0, 48, 96) BV = (0, 32, 64) BW = (0, 24, 48) BX = (48, 96, 96) BY = (32, 64, 64) BZ = (24, 48, 48) Ba = (96, 128, 128) Bb = (120, 160, 160) Bc = (144, 192, 192) Bd = (168, 224, 224) Be = (192, 255, 255) Bf = (0, 0, 255) Bg = (0, 0, 224) Bh = (0, 0, 192) Bi = (0, 0, 160) Bj = (0, 0, 128) Bk = (0, 0, 96) Bl = (0, 0, 64) Bm = (0, 0, 48) Bn = (48, 48, 96) Bo = (32, 32, 64) Bp = (24, 24, 48) Bq = (96, 96, 128) Br = (120, 120, 160) Bs = (144, 144, 192) Bt = (168, 168, 224) Bu = (192, 192, 255) Bv = (128, 0, 255) Bw = (112, 0, 224) Bx = (96, 0, 192) By = (80, 0, 160) Bz = (64, 0, 128) B0 = (48, 0, 96) B1 = (32, 0, 64) B2 = (24, 0, 48) B3 = (96, 48, 96) B4 = (64, 32, 64) B5 = (48, 24, 48) B6 = (128, 96, 128) B7 = (160, 120, 160) B8 = (192, 144, 192) B9 = (224, 168, 224) B$ = (255, 192, 255) C_ = (255, 0, 255) CA = (224, 0, 224) CB = (192, 0, 192) CC = (160, 0, 160) CD = (128, 0, 128) CE = (96, 0, 96) CF = (64, 0, 64) CG = (48, 0, 48) CH = (255, 255, 255) CI = (224, 224, 224) CJ = (192, 192, 192) CK = (160, 160, 160) CL = (128, 128, 128) CM = (96, 96, 96) CN = (64, 64, 64) CO = (32, 32, 32) CP = (255, 0, 128) CQ = (224, 0, 112) CR = (192, 0, 96) CS = (160, 0, 80) CT = (128, 0, 64) CU = (96, 0, 48) CV = (64, 0, 32) CW = (48, 0, 24) CX = (240, 240, 240) CY = (208, 208, 208) CZ = (176, 176, 176) Ca = (144, 144, 144) Cb = (112, 112, 112) Cc = (80, 80, 80) Cd = (48, 48, 48) Ce = (16, 16, 16) Cf = (127, 90, 72) Cg = (165, 118, 94) Ch = (202, 143, 114) Ci = (229, 162, 130) Cj = (255, 182, 145) Ck = (255, 211, 175) Cl = (104, 84, 31) Cm = (128, 112, 32) Cn = (170, 136, 52) Co = (192, 160, 64) Cp = (242, 196, 77) Cq = (248, 224, 96) Cr = (252, 252, 153) Cs = (117, 105, 88) Ct = (145, 135, 110) Cu = (171, 154, 129) Cv = (224, 192, 160) Cw = (208, 168, 80) Cx = (0, 0, 0) Cy = (0, 0, 0) Cz = (0, 0, 0) C0 = (0, 0, 0) C1 = (0, 0, 0) C2 = (0, 0, 0) C3 = (0, 0, 0) C4 = (0, 0, 0) C5 = (0, 0, 0) C6 = (0, 0, 0) C7 = (0, 0, 0) C8 = (0, 0, 0) C9 = (0, 0, 0) C$ = (71, 108, 108) # tile 749 (closed door) { C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_i_i_iC$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_i_i_i_kC$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_i_i_i_kC$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_i_i_i_k_kC$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_i_i_i_k_kC$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_i_i_i_k_k_kC$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_i_i_i_k_k_kC$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_i_i_i_k_k_k_kC$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_i_i_i_k_k_k_kC$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_i_i_i_k_k_k_k_kC$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_i_i_i_k_k_k_k_kC$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_i_i_i_k_k_k_k_k_kC$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_i_i_i_k_k_k_k_k_kC$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_i_i_i_k_k_k_k_k_k_kC$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_i_i_i_k_k_k_k_k_k_kC$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_i_i_i_l_k_k_k_k_k_k_kC$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_i_i_i_l_k_k_k_k_k_k_kC$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_i_i_i_l_l_k_k_k_k_k_k_kC$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_i_i_i_k_l_k_k_k_k_k_k_kC$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_i_i_i_k_k_l_k_k_k_k_k_k_kC$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_i_i_i_k_k_l_k_k_k_k_k_k_kC$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_i_i_i_k_k_k_l_k_k_k_k_k_k_kC$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_i_i_i_k_k_k_l_k_k_k_k_k_k_kC$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_i_i_i_k_k_k_k_l_k_k_k_k_k_k_kC$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_i_i_i_k_k_k_k_l_k_k_k_k_k_k_kC$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_i_i_i_k_k_k_k_k_l_k_k_k_k_k_k_kC$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_i_i_i_k_k_k_k_k_l_kCpCp_k_k_k_kC$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_i_i_i_k_k_k_k_k_k_lCpCpCpCp_k_k_kC$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_i_i_i_k_k_k_k_k_k_lCpCpCpCp_k_k_kC$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_i_i_i_k_k_k_k_k_k_k_l_kCpCp_k_k_k_kC$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_i_i_i_k_k_k_k_k_k_k_l_k_k_k_k_k_k_kC$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_i_i_i_k_k_k_k_k_k_k_k_l_k_k_k_k_k_k_kC$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_i_i_i_k_k_k_k_k_k_k_k_l_k_k_k_k_k_k_kC$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_l_l_l_k_k_k_k_k_k_k_k_l_k_k_k_k_k_kCxC$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_l_l_l_k_k_k_kCpCp_k_k_l_k_k_k_k_kCxCxC$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_l_l_l_k_k_kCpCpCpCp_k_l_k_k_k_k_kCxC$C$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_l_l_l_k_k_kCpCpCpCp_k_l_k_k_k_kCxCxC$C$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_l_l_l_k_k_k_kCpCp_k_k_l_k_k_k_kCxCxC$C$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_l_l_l_k_k_k_k_k_k_k_k_l_k_k_kCxCxCxC$C$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_l_l_l_k_k_k_k_k_k_k_k_l_k_k_kCxCxC$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_l_l_l_k_k_k_k_k_k_k_k_l_k_kCxCxCxC$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_l_l_l_k_k_k_k_k_k_k_k_l_k_kCxCxC$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_l_l_l_k_k_k_k_k_k_k_k_l_kCxCxCxC$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_l_l_l_k_k_k_k_k_k_k_k_l_kCxCxC$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_l_l_l_k_k_k_k_k_k_k_k_lCxCxCxC$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_l_l_l_k_k_k_k_k_k_k_k_lCxCxC$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_l_l_l_k_k_k_k_k_k_k_kCxCxC$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_l_l_l_k_k_k_k_k_k_k_kCxCxC$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_l_l_l_k_k_k_k_k_k_kCxCxC$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_l_l_l_k_k_k_k_k_kCxCxCxC$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_l_l_l_k_k_k_k_k_kCxCxC$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_l_l_l_k_k_k_k_kCxCxCxC$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_l_l_l_k_k_k_k_kCxCxC$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_l_l_l_k_k_k_kCxCxCxC$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_l_l_l_k_k_k_kCxCxC$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_l_l_l_k_k_kCxCxC$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_l_l_l_k_kCxCxCxC$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_l_l_l_k_kCxCxC$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_l_l_l_kCxCxCxC$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_l_l_l_kCxCxC$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_l_l_l_kCxCxC$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_l_l_lCxCxC$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$_l_l_lCxCxC$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$CbC$_l_l_lCxCxC$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$ } # tile 750 (closed door) { C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$_i_i_i_i_i_i_i_i_i_i_i_i_i_i_i_i_i_i_i_i_i_i_i_i_i_i_i_i_i_i_i_iC$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$_i_i_i_i_i_i_i_i_i_i_i_i_i_i_i_i_i_i_i_i_i_i_i_i_i_i_i_i_i_i_i_i_iC$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$_i_i_i_i_i_i_i_i_i_i_i_i_i_i_i_i_i_i_i_i_i_i_i_i_i_i_i_i_i_i_i_iCxCxC$C$C$C$C$C$ C$C$C$C$C$C$C$C$_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_i_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_jCxCxC$C$C$C$C$C$ C$C$C$C$C$C$C$_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_i_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_jCxCxC$C$C$C$C$C$ C$C$C$C$C$C$C$_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_i_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_jCxCxC$C$C$C$C$C$ C$C$C$C$C$C$C$_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_i_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_jCxCxC$C$C$C$C$C$ C$C$C$C$C$C$C$_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_i_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_jCxCxC$C$C$C$C$C$ C$C$C$C$C$C$C$_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_i_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_jCxCxC$C$C$C$C$C$ C$C$C$C$C$C$C$_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_i_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_jCxCxC$C$C$C$C$C$ C$C$C$C$C$C$C$_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_i_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_jCxCxC$C$C$C$C$C$ C$C$C$C$C$C$C$_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_i_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_jCxCxC$C$C$C$C$C$ C$C$C$C$C$C$C$_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_i_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_jCxCxC$C$C$C$C$C$ C$C$C$C$C$C$C$_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_i_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_jCxCxC$C$C$C$C$C$ C$C$C$C$C$C$C$_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_i_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_jCxCxC$C$C$C$C$C$ C$C$C$C$C$C$C$_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_i_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_jCxCxC$C$C$C$C$C$ C$C$C$C$C$C$C$_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_i_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_jCxCxC$C$C$C$C$C$ C$C$C$C$C$C$C$_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_i_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_jCxCxC$C$C$C$C$C$ C$C$C$C$C$C$C$_j_j_j_j_j_j_j_jCpCp_j_j_j_j_j_j_i_j_j_j_jCpCp_j_j_j_j_j_j_j_j_j_jCxCxC$C$C$C$C$C$ C$C$C$C$C$C$C$_j_j_j_j_j_j_jCpCpCpCp_j_j_j_j_j_i_j_j_jCpCpCpCp_j_j_j_j_j_j_j_j_jCxCxC$C$C$C$C$C$ C$C$C$C$C$C$C$_j_j_j_j_j_j_jCpCpCpCp_j_j_j_j_j_i_j_j_jCpCpCpCp_j_j_j_j_j_j_j_j_jCxCxC$C$C$C$C$C$ C$C$C$C$C$C$C$_j_j_j_j_j_j_j_jCpCp_j_j_j_j_j_j_i_j_j_j_jCpCp_j_j_j_j_j_j_j_j_j_jCxCxC$C$C$C$C$C$ C$C$C$C$C$C$C$_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_i_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_jCxCxC$C$C$C$C$C$ C$C$C$C$C$C$C$_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_i_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_jCxCxC$C$C$C$C$C$ C$C$C$C$C$C$C$_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_i_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_jCxCxC$C$C$C$C$C$ C$C$C$C$C$C$C$_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_i_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_jCxCxC$C$C$C$C$C$ C$C$C$C$C$C$C$_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_i_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_jCxCxC$C$C$C$C$C$ C$C$C$C$C$C$C$_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_i_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_jCxCxC$C$C$C$C$C$ C$C$C$C$C$C$C$_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_i_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_jCxCxC$C$C$C$C$C$ C$C$C$C$C$C$C$_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_i_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_jCxCxC$C$C$C$C$C$ C$C$C$C$C$C$C$_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_i_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_jCxCxC$C$C$C$C$C$ C$C$C$C$C$C$C$_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_i_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_jCxCxC$C$C$C$C$C$ C$C$C$C$C$C$C$_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_i_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_jCxCxC$C$C$C$C$C$ C$C$C$C$C$C$C$_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_i_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_jCxCxC$C$C$C$C$C$ C$C$C$C$C$C$C$_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_i_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_jCxCxC$C$C$C$C$C$ C$C$C$C$C$C$C$_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_i_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_jCxCxC$C$C$C$C$C$ C$C$C$C$C$C$C$_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_i_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_jCxCxC$C$C$C$C$C$ C$C$C$C$C$C$C$_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_i_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_jCxCxC$C$C$C$C$C$ C$C$C$C$C$C$C$_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_i_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_jCxCxC$C$C$C$C$C$ C$C$C$C$C$C$C$_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_i_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_jCxCxC$C$C$C$C$C$ C$C$C$C$C$C$C$_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_i_j_j_j_j_j_j_j_j_j_j_j_j_j_j_j_jCxCxC$C$C$C$C$C$ C$C$C$C$C$C$C$CxCxCxCxCxCxCxCxCxCxCxCxCxCxCxCxCxCxCxCxCxCxCxCxCxCxCxCxCxCxCxCxCxCxCxC$C$C$C$C$C$ C$C$C$C$C$C$C$CxCxCxCxCxCxCxCxCxCxCxCxCxCxCxCxCxCxCxCxCxCxCxCxCxCxCxCxCxCxCxCxCxCxC$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$ C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$C$ } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/share/extras.txt��������������������������������������������������������������0000664�0000764�0000764�00000057344�10545462317�015637� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# These tiles are no longer used in Slash'EM, but are kept here # in case we ever need them. A = (0, 0, 0) B = (0, 182, 255) C = (255, 108, 0) D = (255, 0, 0) E = (0, 0, 255) F = (0, 145, 0) G = (108, 255, 0) H = (255, 255, 0) I = (255, 0, 255) J = (145, 71, 0) K = (182, 71, 0) L = (255, 182, 145) M = (71, 108, 108) N = (255, 255, 255) O = (218, 218, 182) P = (108, 145, 182) # tile 0 (silver wallet) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMOOOOMMMMMM MMMMMNNNNPOMMMMM MMMMNPPPPNOMMMMM MMMMNPPPPNOMMMMM MMMMNPPPPNOMMMMM MMMMNPPPPNOMMMMM MMMMNPPPPNMMMMMM MMMMMNNNNMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 1 (grid bug) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMGGMMMM MMMMMMMMMGOGGMMM MMMMMMMMMGGGGMMM MMMMMGGMMGGGMMMM MMMGGMMGGMMMAAAM MMMMMGOGGGMAAAAM MMMMGOGGMMGAAAAM NNNGOGGMGAAAAAMM NANGGGGMAGAAMMMM NNNGGNNNAAAMAMMM MMGGGNANAAMAMAMM MGGGANNNAAMMAMMM MMGMMAAAAAAMMMMM MMMMMMAAMAMMMMMM } # tile 2 (Wizard of Balance) { MMMMMMMMMBPMMMMM MMMMMMBBBPEMMMMM MMMMMBPPPEAMMMMM MMMMMBAAAEAMMMMM MMMHMPAAAEAMMMMM MMMHBPLLLEAMMMMM MHHHHHPLLEMMMMMM MCMLMCBAAEAMAAAM PCPHPCPBBEEAAAAM CHCHCHCPPEEEAAMM MMMHMEEPPEALAAMM MMHHHEPPPEAAAAMM MMMMMBPPPEAAMAMM MMMMBPPPPPEAMMMM MMMBPPPPPPPEMMMM MMMMMMMMMMMMMMMM } # tile 3 (cmap / magical explosion top left) { MMMMMMMMMMMMMMMM MMMMMMMMMMKMMMMM MMMMMMMMMMKKKMMM MMMMMMMMMMCIIKMM MMMMMMMMMMKIIIKC MMMMMMMMMMMKIIII MMMMMKKKKMMCIFII MMMMMCIIIKKIIFFF MMMMMMKIIIIIIFGG MMMMMMKIIFFIIIFG MMMMMMKIIFGFFIFG MMKKCMMKIIFGGFGG MMKIIKCIIIFGGGGG MMMKIIIIIIIFGDGG MMMKIIFFFFFGGGDD MMMKIIIFGGGGGGGD } # tile 4 (cmap / magical explosion top center) { MMKMMMMMMMKMMMMM MMKKKMMMMKIKKMMM MKIIIKKMKIIIIKMK MKIIIIICIIIIIICI KIIIIIIIIIFIIIII IIIIFIIIIIFIIIII IIIIFFFIIFGFIIIF IIIFGGGFIFGFIIIF FFIFGGGGFGGGFIFG GGFGGGGGGGDGGFGG GGGGGDGGGGDGGGGG DGGGGDGGGDDGGGGG DDGGGDDGGDDGGGDG GDDGGDDGDCDGGDDG GDCDGDDGDCDGDDGG DCCCDCCDCCCDCDGG } # tile 5 (cmap / magical explosion top right) { MMKMMMMMMMMMMMMM KKKMMMMMMMMMMMMM IICMMMMMMKMMMMMM IIKMMMMKKKMMMMMM IIIKMMKICMMMMMMM FIIICKIIKMMMMMMM FIIIIIIIKMMMMKCM FIIIIIIIKMMCKIKM GFIIIIIIIKKIIKMM GFIFFFIIIIIIIKMM GGFGGFIIIIIIKMMM GGGGGFIIIIIICMMM GGGGFIIIIIIKMMMM GGGGFIFFFIIKMKCK GDGGGFGGFIIIKIIK DGGGGGGFIIIIIIKM } # tile 6 (cmap / magical explosion middle left) { MMMMKIIIFGGDDGGG MMKKIIIIFGGGDDDD KKIIIIFFGGGGGGDC MKIIFFGGGGGGGGGD MMCIIFGGGGDDDDDC MMMKIIFGGGGGDDCC MKKIIIIFGGGGGGDC KIIIIIIFGGGGGDCC MCIIIFFGGDDDDCCC MKIIIIFGGGGGGDCC MMKIIIIFGGGGGDCC MMMKIIIIFGGDDDCC MMKIIIFFGGDDGGDC MMKIIFFFGGGGGDDD MCIIIIIIFGGGDDGG MKIKIIIIIFGDGGGD } # tile 7 (cmap / magical explosion middle center) { DCCCCCCCCCCCCCDD CCCCCCCCCCCCCCCC CCCCCCCCCCCCCCCC CCCCCCCLLCLCCCCC CCCCCCLHLCLCCCCC CCCCCLHHHLHLCCCC CCCCLHHHHHHLLCCC CCCCCLHHHHLCCCCC CCCLLHHHHHHLLCCC CCCCLHHHHHLCCCCC CCCCCLHHLHHLCCCC CCCCLLHLCLLLCCCC CCCCCCLLCLCCCCCC CCCCCCCCCCCCCCCC DCCCCCCCCCCCCCCC CCCCCCCCCCCCCCCD } # tile 8 (cmap / magical explosion middle right) { DGGDDGGFIIIIIIKM CDDDGGFIIIIIIKMM CDDGGGGFFIIIICMM DGGGGGGGGFFFIKMM CDDDDDGGGFFIIIKC CDDDGGGGFIIIIIKM DGGGGGGFIIIIIIKM CDDGGGGGFIIIIKMM CCCDDGGGGFIIKMMM CDDDDDGGGGFIICMM DGGGGGGGGFFFIIKM CDDGGGGGFIIIIIIK CCCDGGGFIIIIIKCM CDDDDGGGFIIIKMMM DGGGDDGGFIIKMMMM DDGGGGGGGFIIKKMM } # tile 9 (cmap / magical explosion bottom left) { KKKMKIIIFGGGGGDD MMMMKIIIFGGGGGDG MMMCIIIFGFFGGDGG MMMKIIIFFIIFGGGG MMKIIKIIIIFGGGGG MMKCKMKIIIFFFFGG MKKMMMCIIIIIIIFG MMMMMKIIIIIIIIFG MMMMMKIIIIIIIIFF MMMMMKIIIKKIIIII MMMMMCIIKMMKIIII MMMMKIICMMMKIIII MMMMKKKMMMKIIKKI MMMMKMMMMMKKCMMK MMMMMMMMMMCMMMKC MMMMMMMMMMMMMMKM } # tile 10 (cmap / magical explosion bottom center) { DCCCCCCCCCCCCCDG DDCCCCCCCCCDCCDD DGDCDDCCDCDGDDGD GGDDGGDDGDGGDDGG GGDGGGDGGDGGGDGG GGGGGGDGGDGGGGGG GGGGGGGGGDGGGGGG FGGFGGGGGGGGFGGG IFFIFGGFGGGFIFFF IFIIIFFIFGFIIIIF IIIIIIFIIFIIIIII IIIIIIIIIIIIIIII IIIIIIIIIIIIIIII IKKIIIKKIIIKKKII KMMKIKMMKIIKMMKK MMMMCMMMMKCMMMMM } # tile 11 (cmap / magical explosion bottom right) { GDDGGGGFFFIIIIKM GGGDGGFIIIIIICKK GGGGGGFIIIIIKMMM DGGFFFGFIIIKMMMM GGFIIIFFFIIKMMMM GGGFIIIIIIIIKMMM GFFFIIIIIIIIIKMM FIIFFIIKKCKIICMM IIIIFIKMMMMKKKKM IIIIIIIKMMMMMMMM IIIIIIIKMMMMMMMM IIIKKIIICMMMMMMM IIKMMCKIKMMMMMMM ICMMMMMKCKMMMMMM IKMMMMMMMKMMMMMM CKMMMMMMMMMMMMMM } # tile 12 (cmap / cold explosion top left) { MMMMMMMMMMMMMMMM MMMMPPMMMMMMMMMM MMMPPMMMPPMMMMMP MPPMMMMPPMMMMNNP MMMMMMMPMMMMPNNP MMMMPPPMMMNNPPPP MMMPPMMMMPNNPPPP MMPPMMPPPPPPPNNP MMPMNNPPNNPPPNNP MPPMNNPPNNNNPPPN MMMMPPNNPPNNPPPN MMMMPPNNPNNPPPPP MMMNNPPPPNNPPNNP MMMNNPPPPPPPPNNP MMPNNPNNPPNNPPPP MMPNNPNNPPNNNNPP } # tile 13 (cmap / cold explosion top center) { MMMMMMMMMMMMNNMM MNNPNNPNNPPPNNPN PNNPNNPNNNNPPPPN NNPPPPPPPNNPPPNN NNPPPNNPNNPNNPNN PPPPPNNPNNPNNPPP PNNPPPPNNPPNNPPN PNNPNNPNNPPPPNNN PNNPNNPPPNNPPNNP NNNPPPPPPNNPPPPP NPNNPNNPNNPPPNNP PPNNPNNPNNPPPNNP PPPNNPPPPPPNNPPP PPPNNPPPPPPNNPPP NNPPPNNPNNPPPPPP NNPPPNNPNNNNNNPP } # tile 14 (cmap / cold explosion top right) { MMMMMMMMMMMMPPMM NMMMMMPMMMMMMPMM NPPMMMPPPPMMMMPM PNNPPMMMMPPMMMPM PNNPNNPMMMPPMMMM PPPPNNPNNMMPMMMM NPNNPPPNNMMMPPMM NPNNPPPPPPMMMPMM PPPPPPNNPNNMMPPM NNPNNPNNPNNNMMPM NNPNNPNNPPNNMMPM PPPPPNNPPPPPMMMM NNPPPNNPNNPPNNMM NNPPPPPPNNPPNNMM PPPNNPPPPPNNPMMM NNPNNPPPPPNNPMMM } # tile 15 (cmap / cold explosion middle left) { MMPPPPPPPPPPNNPN MMPNNPNNNPPNNPPN MMPNNPNNNPPNNPPP MPNNPNNPPNNPPPPP MPNNPNNPPNNPPPNN MPPPPNNPPPPNNPNN MNNPPNNPNNPNNPPN MNNPNNPPNNPPPPPP MPPPNNPPPPPPPPPP MPPNNPNNPPPPNNPP MPPNNPNNPNNPNNPP NNPPNNPPPNNPPPPP NNPPNNPPPPPNNPNN MPPPPPPNNNPNNPNN MPPNNNNNNNPPPPPP MPPNNNNPPPPNNPPP } # tile 16 (cmap / cold explosion middle center) { NPNNPPPPPPNNNNPP NPNNPNNPPPPPPPPP PNNPPNNNNPNNPNNN PNNPNNPNNPNNPNNN PPPPNNPPPPPPPPPP NPPPPPPPNNPPNNPN NNNNNPNNNNPPNNPN NNNNNPNNPPPPPPPP PPPNNPPPPNNNPPPN PPPNNPPNNNNNNPPN NNPPPPPNNPPNNPPN NNPPPPPPPPPPNNPN PPPNNPPPPPPPNNPN PPPNNPNNPNNPPPPN PNNNNPNNPNNPPNNN PNNNNPPPPPPPPNNP } # tile 17 (cmap / cold explosion middle right) { NNPPPPNNPNNPNNMM PPPNNPNNPNNPNNMM NPPNNPPNNPPPPPPM NPNNPPPNNPPPNNPM PPNNNNPPPPPPNNPM NPPPNNPPPPNNPPPM NPPPPPPPNNNNPNNM PPPPNNPPNNPPPNNM NNNPNNPNNNPPPPPM NNNPPNNNNNNNNNPM NPPPPNNPPPNNNNPM NPPPPPPPNNPPPPPM NNNNNPNNNNPPNNPM NNNNNPNNPPNNNNPM NPPPPPPPPPNNPNNM PPPPPPPPPPPPPNNM } # tile 18 (cmap / cold explosion bottom left) { MNNPNNNNPPPNNPPP MNNPNNNNPPPPPNNP MMPPPPPPNNPPPNNP MMNNPPPPNNNNPNNP MMNNNNPNNPNNNNNP MMMMNNPNNPPNNPPN MMMMPPPNNPPPPPPN MMMMMNNNNPPNNPPP MMMMMNNPPPPNNPPP PMMMMMPPPNNPPPPN PPMMMMMNNNNPPNNN MPPMMMMNNPNNPNNP MMMPMMMMMPNNPPPP PMMMPPMMMMMMPNNP PPMMMPPPPPMMMNNP MMPPMMMMMMMMMMMM } # tile 19 (cmap / cold explosion bottom center) { PPPPPNNPNNPNNNPN PNNPPNNPNNPNNNPN PNNPPNNPPPPPPPPP PPPPPNNNNPPPPPNN PPPNNPPNNPPPPPNN NNPNNPPNNPNNPPPP NNPPPPPNNPNNPPPP PPPNNPPPPPPPPPNN PPPNNPPPPPPNNPNN NPPPPNNPPNNNNPPP NPPPPNNNNNNPPNNN PPNNNPPNNPPPPNNN NNNNNPNNPPPNNPPP NNPPNNNNNNPNNPPP PNNPNNPPNNPPPNNM MNNMMMMMMMMMMNNM } # tile 20 (cmap / cold explosion bottom right) { NPNNPPNNPNNPPPPM NPNNPPNNPNNPNNMM PPPPPPPPPPPPNNMM PPPPPNNPPPNNPPMM PPNNPNNNNPNNPMMM NNNNPPPNNPPPNNMM NNPPNNPPPNNPNNMM PPPPNNPNNNNPMMMM PNNPPPPNNPPMMMMM PNNPNNPPPMMMMMMP NPPPNNPNNMMMMMPM NPPNNPPNNMMMMPMM NNPNNMMMMMMMPMMM NNMMMMMMMMMPPMMP MMMMMMMMPPPMMMMP MMMMMMPPPMMMMMPM } # tile 21 (cmap / death explosion top left) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMAKA MMMMMMMMMMMMAKAJ MMMMMMMMMMDAKAJA MMMMMMMMMDAKAKAK MMMMMMMMDACAJACA MMMMMMMDAKAJAKAD MMMMMMDAKAJAKADA MMMMMDAKAJAKADAK MMMMMACAJACADACA MMMMAKAJAKADAKAJ MMMAKAJAKADAKAJA MMMKAJAKADAKAJAK MMMAJACADACAJACA } # tile 22 (cmap / death explosion top center) { MMMMMMMMMMMMMMMM MMMAKAAAAAAKAMMM AJAKADDDDDDAKAJA JACADAAAAAADAKAJ AKADAKKCKKCADACA KADAKAAAAAAKADAK ADAKAJJJJJJAKADA DACAJAAAAAAJAKAD AKAJAKCKKKCAJAKA KAJAKAAAAAAKAJAK AJAKADDDDDDACAJA JACADAAAAAADAKAJ AKADAKKCKKKADACA KADACAAAAAAKADAK ADAKAJJJJJJAKADA DAKAJAAAAAAKAKAD } # tile 23 (cmap / death explosion top right) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM AKAMMMMMMMMMMMMM JAKAMMMMMMMMMMMM AJAKADMMMMMMMMMM CAJAKADMMMMMMMMM AKAJAKADMMMMMMMM DACAJAKADMMMMMMM ADAKAJAKADMMMMMM KADACAJAKADMMMMM AKADAKAJAKAMMMMM JAKADACAJAKAMMMM AJAKADAKAKAKAMMM CAJAKADAKAJACMMM AKAJAKADAKAJAMMM } # tile 24 (cmap / death explosion middle left) { MMAJAKADAKAJAKAD MMJAKADAKAJAKADA MMJAKADAKAJAKADA MAKAKADACAKAKADA MAJACADAKAJACADA MAJAKADAKAJAKADA MAJAKADACAJAKADA MKAJAKADAKAJAKAD MACAJAKADAKAJACA MKAJAKADACAJAKAD MAJAKADAKAJAKADA MJACADAKAJAKADAC MAJAKADAKAJACADA MMAJAKADAKAJAKAD MMJACADAKAJAKADA MMAKADACAJAKADAC } # tile 25 (cmap / death explosion middle center) { AKAJANNNNNNAJAKA KAJANNNNNNNNAJAK KAJANNNNNNNNAJAK KAJANNNNNNNNAKAK CAJANAAAAAANAJAC KAJANADAADANAJAK KAJANNANNANNAJAK AKAJANNNNNNAJAKA DAKAJANAANAJAKAD AKAJAANAANAAKAKA KAJANAANNAANAJAK AJANNNAAAANNNAKA KAJAANNNNNNAAJAC AKAJAANNNNAAJAKA KAJANNNAANNNAJAK AJANNNAJJANNNAJA } # tile 26 (cmap / death explosion middle right) { DAKAJAKADAKAJAMM ADAKAJAKADAKAJMM ADAKAJACADAKAJMM ADAKAJAKADAKAJAM ADACAJAKADACAJAM ADAKAJAKADAKAJAM ADAKAJACADAKAJAM DACAJAKADAKAJAKM AKAJAKADAKAKAKAM DAKAKAKADAKAKAKM ADAKAJACADAKAJAM KADAKAJAKADACAJM ADACAJAKADAKAJAM DAKAJACADAKAJAMM ADAKAJAKADACAJMM KADAKAJAKADAKAMM } # tile 27 (cmap / death explosion bottom left) { MMMAKADAKAJAKADA MMMJAKADAKAJAKAD MMMAJAKADAKAJAKA MMMMAKAKADACAKAK MMMMMAJACADAKAJA MMMMMKAJAKADAKAJ MMMMMMKAJAKADAKA MMMMMMMCAJAKADAK MMMMMMMMKAJACADA MMMMMMMMMKAJAKAD MMMMMMMMMMKAJAKA MMMMMMMMMMMMAJAK MMMMMMMMMMMMMAJA MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 28 (cmap / death explosion bottom center) { KAJAAAJAAJAAAJAK AKAJJJAKKAJJJAKA DAKAAAKAAKAAAKAD ADAKKCADDAKKCADA CADAAADAADAAADAK AKADDDACKADDDAKA JAKAAAKAAKAAAKAJ AJACKKAJJAKKCAJA CAJAAAJAAJAAAJAK AKAJJJACKAJJJAKA DAKAAAKAAKAAAKAD ADAKCKADDAKKCADA CADAAADAADAAADAK AKADDDACKADDDAKA MMMAAAKAAKAAAMMM MMMMMMMMMMMMMMMM } # tile 29 (cmap / death explosion bottom right) { ADAKAJAKADAKAMMM DAKAJAKADAKAJMMM AKAJAKADAKAJAMMM CAJACADACAJAMMMM AJAKADAKAJAMMMMM JAKADAKAJAKMMMMM AKADAKAJAKMMMMMM CADACAJACMMMMMMM ADAKAJAKMMMMMMMM DAKAJAKMMMMMMMMM AKAJAKMMMMMMMMMM CAJAMMMMMMMMMMMM AJAMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 30 (cmap / lightning explosion top left) { MMMMMMEPEMMMMMMM MMMMMEPBPEMEEMMM MMMMEPBNBPEPPEMM MMMEPBNBNBPBBPEM MMEPBNBPBNBNNBPE MEPBNBPEPBNBBNBP EPBNBBPPBPBPPBNB MEPBNNBBNBNBPPBN MMEPBBNBBNNBPPPB MMMEPPBNBBBNBBPP MMMEPBNBPPBBNNBP MMEPBNBPBBNNBBNB MMEPBNBBNNBBNBBN MMMEPBNBBBNBBNBB MMMMEPBNBPBNBBPP MMMMEPBNBPBNBPEE } # tile 31 (cmap / lightning explosion top center) { MMMMMMMEEPPEMMMM MMMMMMEPPBBPEMMM MMEEMEPBBNNBPEMM MEPPEPBNNBBNBPEM EPBBPBNBBPPBNBPE PBNNBBNBNBBNBPMP BNBBNNBBNNBNBPPB NBNBBBBBNBBBNBBN BBNBBNNNBBNBBNNB PBBNBBBBNNBBPBBP BNBBNBPBNBBNBPPB BNBNBPPBNBBNBBBN NBNBPBBNBPPBNBNB BNBNBNNNBBBBNNBP PBPNNBBBNNNNBNBP EPEBBPPBNBBBPBPE } # tile 32 (cmap / lightning explosion top right) { MMMMMEMMMMMMMMMM MMMMEPEMMMMMMMMM MMMEPBPEMMMMMMMM MEEPBNBPEEMMMMMM EPPBNBNBPPEMMMMM PBBNBPBNBBPEMMMM BNNBNBBBNNBPEMMM NBBPBNNBBBNBPEMM BBBBNBBNBPBNBPEM BNNNNBPBPEPBNBPE NBBBBNBPEEPBNBPE BPNBBNNBPEPBNBPE PPBNNBBNBPBNBPEM PBBNBBNBPBNBPEMM BNNBBNBPBNBPEMMM PBBBNBPBNBPEMMMM } # tile 33 (cmap / lightning explosion middle left) { MMMMEPBNBPBNBBPE MMMEPBNBBBNBBNBP MMEPBNBBNNBPBNBP MMEPBNBPBBNBNBNB MMMEPBNBPPBNBPBP MMMMEPBNBBNBNBNB MMMMMEPBNBBPBNBN MMMMMMEPBNBPBNBB MMMMMMMEPBNBNBBP MMMMMMMEPBNBNBNB MMMMMMEPBNBPBNBP MMMMMEPBNBNBPBNB MMMMEPBNBNBNBNBP MMMEPBNBPBPBNBNB MMMMEPBNBPBNBBNB MMMMMEPBNBPBNBBP } # tile 34 (cmap / lightning explosion middle center) { EPEEPBPBNBPBPBPE PBPPBNBNBPBNBNBP BNBEPBNNBBNBBNBP BNBPBNBBNNBNBBNB PBNBNBPPBBPBNBNB PPBNBNBPPPBBNBNB BPBNPBNBBBNNNNBP NBNBPPBNNNBBBBPE BNNBPBNNNBPBPBPE PBBNBNBBBNBNBNBP PBNNNBPPPBNBNNBP BNBBNBPPBNBPBBNB BNBPBNBPBNBPPBNB PBNBPBNBPBNBPBNB PBNBBNBNBNBNBPBP EPBPPBPBNBPBPEPE } # tile 35 (cmap / lightning explosion middle right) { PBPPBBBBNBPEMMMM BNBBNNNBBNBPEMMM BNBNBBBBBBNBPEMM PBNBBBNNNBBNBPEM EPBNNNBBBNBBNBPE PBNBNBNBPBBNBPEM BNBBNBBNBBNBPEMM NBPBNBPBBNBPEMMM BNBBBNBBNBPEMMMM PBNNBBPBNBPEMMMM PBNBPPBNBNBPEMMM PBNBPBNBPBNBPEMM BNBNBNBNBPBNBPEM BNBBNBBBPBNBPEMM PBPNBNNBBNBPEMMM EPBNBBBBNBPEMMMM } # tile 36 (cmap / lightning explosion bottom left) { MMMMEPBNBBPBBNBP MMMMMEPBNNBNNBNB MMMMMMEPBBNBBBNB MMMMMMMEPBNBBNBN MMMMMMEPBNBBNNBB MMMMMEPBNBBNBBNB MMMMEPBNBBNBBNBB MMMEPBNBNNBBNBBN MMMEPBNBBNBBBBNB MMMMEPBNBNBNNNBP MMMEPBNBPBNBBBPE MMMMEPBNBNBPPPEM MMMMMEPBNBPEEEMM MMMMMMEPBPEMMMMM MMMMMMMEPEMMMMMM MMMMMMMMEMMMMMMM } # tile 37 (cmap / lightning explosion bottom center) { PBPEEPBBNBBPPBPE BNBPPBNNBBNBBNBP PBNBBNBNNNBBNBNB EPBNNBBNBBNNBBNB PBNBBBNBNBBBNBBN PBNBBNBPBNNBBNBB BNBPBNBPPBBNBBNB NBPPBNNBPBNBNBBN BNBBNBBNBBNBBNNB PBNNBPPBNNBPBNBP EPBBPEEPBNBPBNBP MEPPEMEPBNBBNBPE MMEEMMMEPBNNBPEM MMMMMMMMEPBBPEMM MMMMMMMMMEPPEMMM MMMMMMMMMMEEMMMM } # tile 38 (cmap / lightning explosion bottom right) { PBBNBBBNBEMMMMMM BNNBNNBBNBEMMMMM PBNBBBBPBNBEMMMM BNBNBNNBBNBEMMMM NBBNNBBBNBEMMMMM BBNBBNBNBEMMMMMM BNBNBBBNBEMMMMMM NBEBNBBNBEMMMMMM BEMEBNNBEMMMMMMM EMMMEBBEMMMMMMMM MMMMMEEMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 39 (cmap / poison explosion top left) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMJJKKJ MMMMMMMMMMJKKKJK MMMMMMMMMMJCJJJK MMMMMMMMMMJKJJJJ MMMMMMMJJJJFFFGG MMMMJJJKKKFGGGFF MMMJKKKJKFGFFFFF MMMJCJKJJFGFFFFF MMMJKJJJJGFFFFFP MMMJKJJJJGGFFFPB MMMKKJJJJFGFFPBB MMMJKJJJFFGGFPBP MMMJCJJFGGFFFBPP } # tile 40 (cmap / poison explosion top center) { MMMMMMMMMMMMMMMM MMMJKKKKKKJMMJKK MMMJCJKJKJKJJKKJ JMMJKJJJJKKKKJJJ KJJKJJJJJJCKJJJJ JKCKJJJJJJJKJJJK JJJKJFFGGGGGFJFF GGFFFGGFFFFFGFGG FFPPPBBPFFFFFGFF FPBBBPBBPPBBBBBP PBPPPPPBPBPPPPBP PBBPPPPPBPPPPPBP BBBBPPPPBPPPPPPB PPPPPPPPPPPPPPPB PJKKKKKCKJPPPPPB JKKJKJJJKKJPPPPB } # tile 41 (cmap / poison explosion top right) { MMMMMMMMMMMMMMMM JMMMMMMMMMMMMMMM CJMMMMMMMMMMMMMM KJMMMMMMMMMMMMMM KJMMMMMMMMMMMMMM KJJKKKKKKJMMMMMM GGGGFKJKKJMMMMMM FFFGFJJJKJMMMMMM FFFGFJJJCJMMMMMM FFFGFJJJKJMMMMMM FFFGFJJJKJMMMMMM FFFGFJJKKJJJMMMM FFFGFFFKJCKKJMMM FFFGGGGFKJKKKMMM FFFFFFGFJJJJCMMM FFFFFFGFJJJJKMMM } # tile 42 (cmap / poison explosion middle left) { MMMJKKJFGFFFFBPP MMJKCJJFGFFFFBPP MJKKJJJFGFFFFBPP MJKJJJJFGFFFFBBP MKJJJJFGFFFFFPBJ MKJJJJFGFFFPPBJK MCKJJJFGFFPBBJKJ MMKKKKFGFFBPPKKJ MMJCKKFGGFBPPKCJ MMJKJFGGFFBPPKJJ MMKJFGFFFFBPPJKJ MMKJFGFFFFBBBBJK MMCJGGFFFFPPPPPJ MMKJGGFFFFFFFFBP MMKJFGGFFFFFFFBP MMKJJFFGFFFFFFBP } # tile 43 (cmap / poison explosion middle center) { JKKJJJJJJJKKJPPB KKJJJJJJJJKKJJJJ PJCJJJJJJJJKCKKK PJKJJJJJFGJJJJKK JJKCGGFJFGFJJJJK CKKKFGPBPGFJJJKC JJJJFGBBBPFJJJJJ JJJJJFPBBBFJJJJJ JJJJJFPBPPGFJJJJ JJJJFGGGGFGGKKKC JJJJGGFFFJJJKKPP JJJJJJJJJJJJJKJP KKKJJJJJJJJJJJKP JJKJJKKKJJJJJJKP PJCJJJKCJJJJJJCP PJKJJJKJKJJJJKKP } # tile 44 (cmap / poison explosion middle right) { FFFFFFGFJJJKKMMM FFFFFFGFJJJJKMMM JBBBBPGFFFJCJMMM JPPPBPGGGGFJMMMM KPPPPBFFFFGKJMMM KKJJPBFFFFGJKMMM JJKCBBFFFFGJKMMM JJJKBPFFFFGJCMMM KKKKBPFFFFGJKMMM KJJPBPFFFFGJKMMM PPPBBPFFFFGJKMMM PPBPPFFFFGFKKMMM PPBBFFFFFGFJKMMM PPPBFFFFGGFCJMMM PPPBFFFFFGGKKJMM PPPBFFFFFFGJJKMM } # tile 45 (cmap / poison explosion bottom left) { MMKKJJJFGGFFFFBP MMKJKJJFGFFFFFBP MMJJKJJFGFFFFFBP MJCKJJJGFFFFFFBP MKJJJJJGFFFFFFBB MKJJJJJGFFFFGFPP MKKJJJJGGGGGGFFF MKJJJJJFFFFFGFFF MCJJJJJJJJJFGFFF MJKCKKKKKJJFGFFF MMJJJKJCJJJFGFGG MMMMMJKJJJJFGGFF MMMMMJKJJJJJJJJK MMMMMMKKJJJJJKKJ MMMMMMMJKKKKKCJM MMMMMMMMMMMMMMMM } # tile 46 (cmap / poison explosion bottom center) { PJKJJJKKJKKCKKKP PKKCKCKJPPPBBBPP PJKKJJJPPPPBPPBB PPPBPPBPPPPBFFFF PBBPFPBBBBBPFFFF BPPFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFGFFFFFFF FGGFFFFFGGFFFFFF FGFGFFFFGFGFFFFF GFFGGGGGGFFGGGGG FJJJJJJJJKKJJJJJ JKJJJJJJJKKKJJJJ KKJJJJJJKKMKKJJJ MJKKKCKKCJMMJKKK MMMMMMMMMMMMMMMM } # tile 47 (cmap / poison explosion bottom right) { PPPBFFFFFGGMJKMM PPPBFFFFFGFMKKMM BBBBFFFGGGFMJKMM FFFFFFFGGFJJCJMM FFFFFFFFGFKKKJMM FFFFFFFFGFKJMMMM FFFFFFFFGFCJMMMM FFGGGGGGGFJKMMMM FFGFFFFFFJJKMMMM FFGFJJJJJJKKMMMM GGGFKKKJJJJKMMMM JJJKKJKKJJCJMMMM JJJJCMJJKKJMMMMM JJJJKMMMMMMMMMMM KKKKKMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 48 (cmap / acid explosion top left) { MMMMMMMMMMMMMMMM MMMMMMMGGGMMMMMG MMMMMMGHFGFMMMMG MMMMMMGFHGGMMMMG MMMMMMGHFHGMMMMG MMMMMMGFHGGMMMMG MMMMMMGHGHGFMMMM MMMMMMFGHGHGMMMM MMMMMMMFGGGGFMMM MGGGFMMMMMFGGFMM MGFHGFMMMMMMFGMM MGHFHGFMMMMMMMMG MFGGGHGGFMMMMMMG MMFGGGGGGMMMMMMG MMMMMMMFGMMMMMMG MMMMMMMMMMGFMMFG } # tile 49 (cmap / acid explosion top center) { MMMMMMMMMMFGFMMM GGFMMMMMMMGGGGMM GGGFMMMMMMGHFGMM HFHGMMMMMMGFHGMM GHFGFMMMMMGHGFMM GGHGGMMMMMGGGMMM FGGHGMMMMMGHGMMM MFGGGMMMMMGGFMMM MMMFGFMMMMGFMMMM MMMMGGGMMMGMMMMM MMMMFGGMMMMMMMMM GMMMMGGMMMMMFGGG GFMMMGGFMMMFGGGG HGFMFGHGFMFGGGHG FHGFGGFGGFGGGHFH HFGGGGHFGGGGHFHG } # tile 50 (cmap / acid explosion top right) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMGGGGMMMMMM MMMMMFGFHGMMMMMM MMMMFGGHGFMMMMMM MMMMGGFGGMMMMMMM MMMFGGGFMMMMMMMM MMFGGFMMMMMMMMMM MMGGFMMMMMMMMMMM MMGFMMMMMMMMMMMM MMMMMMMMMMMMMMMM FMMMMMMMFGGGGGGM GMMMMMMGGHFHFHGM GMMMMMMFGGHFGGFM GMMMMFGGGGGGGFMM GMMMMGGGGFMMMMMM } # tile 51 (cmap / acid explosion middle left) { MMMMMMMMMMGGGFGG MFGGGGFMMMFGGGGG FGFHGHGGFMMFGGFH GFHFHGHGGGMMGHHF GGFHFGGGFMMMFGGH GGGGGGFMMMMMMFGF MMMMMMMMMMMMMMGH MMMMMMMMMMMMMMGG MMMMMMMMMMMMMMFG MMMMMMMGGGGGGGGF MMMMMMMGGHGHGHFH MMMMMMMGHGHGGGGF MMMMMMMFGGGGGFFG MMMMMMMMMMMMMMFG MMMMFGGFMMMMMFGG MFGGGGGGMMMMFGGF } # tile 52 (cmap / acid explosion middle center) { FHFHGHGHFHGHFHGG HFHFHFHFHFHFHFHG GHFHFHFHFHFHFHGG HGHFHFHFHHHFHGHG FHFHFHFHHFHFFHGH HFHHHFHFFHFHHFHG FHFHFHFHHFHFHHFH HFHFHFHFFHFHHFHF GHFHHFHFFHFHFHFH HFHHFHFHHFHFHFHG FHFFHFHFFHFHFHFH HFHHFHFHHFHFHFHF GHFHFHFHFHFHGHGH HFHFHFHFHFHFHGHG FHFHGHFHGHFHFHGG HFHGHFHGHGHFHGGF } # tile 53 (cmap / acid explosion middle right) { GMMMMMMMMMMMMMMM FMMMMMMMMMMMMMMM FMMMMMMMMMMMMMMM GGGFMMMMMMMMMMMM GHGGGGGMMMMMMMMM HFHFGGFMMMMMMMMM FHFGGFMMMMMMMMMM HGGGFMMMMMMFGGGM GHGFMMGGGGGGFHGM HGGMMMMMMMFGGFGM GHGMMMMMMMMMFGGM HGGFMMMMMMMMMMMM FHFGFMMMMMMMMMMM HFHFGGMMMMMMMMMM GHGHGGMMMMMMMMMM FGGGGFMMMMMMMMMM } # tile 54 (cmap / acid explosion bottom left) { MGFHFHGFMMMFGGGH MGHFHGGMMMMGGGHG MGFHFGFMMMMGGGGG MGGGGGMMMMMMMMMM MMMMMMMMMFGMMMMM MMMMMMMMFGGMMMMM MMMMMMMFGGGMMMMM MMMMMFGGHGFMMMMM MMMFGGGHGGMMMMMF MMGGHFHFHGMMMMGG MMGGGGFHGFMMMFGH MMMMMFGGGMMMMGGF MMMMMMMMMMMMMGFH MMMMMMMMMMMMMGHF MMMMMMMMMMMMMFGG MMMMMMMMMMMMMMMM } # tile 55 (cmap / acid explosion bottom center) { GHGHGHFGGGGHFHGM GGGGGGGFMMFGHGGM GFMMFGGMMMMFGHGM MMMMMGGMMMMMFGGM MMMMMGGMMMMMMGGM MMMMMGGMMMMMMGGM MFGMFGFMMMMMMMMM GGGMGGMMMMMMMMMM GGFMGFMMMMMMMMMM HGMMMMMMMGGFMMMM GGMMMMMMMGGGFMMM GFMMMMMMMGHGGGFM GMMMMMMMMGGHFHGM GMMMMMMMMFGGHFGM FMMMMMMMMMFGFGGM MMMMMMMMMMMFGGFM } # tile 56 (cmap / acid explosion bottom right) { MMMMMMGGGGFMMMMM MMMMMMMMFGGGGFMM MMMMMMMMMMFGGGGF MMMMMMMMMMMFGGFG MMMMMMMMMMMMFGGG MMMGGGMMMMMMMMMM MMMFGGFMMMMMMMMM MMMMGGGMMMMMMMMM MMMMGHGFMMMMMMMM MMMMGFHGMMMMMMMM MMMMFGFGMMMMMMMM MMMMMGHGMMMMMMMM MMMMMFGGMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 57 (sub mine walls 0) { ANNLAJKKKKKJNNLA ALLLAKKJCKJJLLLA ALLLAJCKKKCJLLLA ALLLAJKCKKKJLLLA ALLLAJJKKCKJLLLA AJAAAJJCKKKJJAJA AJJJAJJKKCKJJJJA ALKKAJKKKJKJLKJA ANNLAJKKCKKKNNLA ALLLAKKKKCKJLLLA ALLLAJKCKKKJLLLA ALLLAKKKKCKJLLLA ALLLAJJKKKJJLLLA AJAAAJJCKKKJJAJA AJJJAJJKKCKJJJJA ALKKAJJCKKKJLKJA } # tile 58 (sub mine walls 1) { AAANLLAAAAANLLAA LLLNLLAJLLLNLLAJ KLLJJJAJKLLJJJAJ JJJJJJJJJJJJJJJJ KKJJJKKKKKJJJKKK CKNLLKCKCKNLLKCK LLNLLAJLLLNLLAJL LLJJJAJKLLJJJAJK JJJJJJJJJJJJJJJJ KKJLCKKKJLKKKJLC KCJKKKCKJKCKCJKK JJJJJJJJJJJJJJJJ JLKKCKJLKKKKJLKK JKCKKKJKCKCKJKCK JJJJKJJJJJJJJJJJ AAAAAAAAAAAAAAAA } # tile 59 (sub mine walls 2) { AAANNNNLLLLLLAAA NNNNAAJJKKKKLJJJ LLLNAJJKCKCCLJJJ LLLLLLLLLLLLLJJJ LLLKKKKKKCKKKJJJ LLLKCKCKKKKCKJJJ LLKCKKKCKCKKKCJJ LKKKCKKKKKCKKKKJ JJKJJJKJKJJJJJJJ AKKJJJJJJJJJCKKJ ALLLAAAAAAAALLLA ALLLAJKKKKKJLLLA ALLLAJCKCKCJLLLA AJAAAJJKKKKJJAJA AJJJAJJKCKKJJJJA ALKKAJKKKCKJLKJA } # tile 60 (sub mine walls 3) { AAANNNNLLLLLLAAA NNNNAAJJKKKKLJJJ LLLNAJJKCKCCLJJJ LLLLLLLLLLLLLJJJ LLLKKKKKKCKKKJJJ LLLKCKCKKKKCKJJJ LLKKKKKCKCKKKCJJ LCKCKCKKKKCKKKKJ JJJJJJJKJJJJJJJJ AKKJJJJJJJJJCKKJ ALLLAAAAAAAALLLA ALLLAJKKKKKJLLLA ALLLAJKCKCKJLLLA AJAAAJJKKKKJJAJA AJJJAJJCKCKJJJJA ALKKAJJKKKKJLKJA } # tile 61 (sub mine walls 4) { AAANNNNLLLLLLAAA NNNNAAJJKKKKLJJJ LLLNAJJKCKCCLJJJ LLLLLLLLLLLLLJJJ LLLKKKKKKCKKKJJJ LLLKCKCKKKKCKJJJ LLKKKKKCKCKKKCJJ LCKCKCKKKKCKKKKJ JJJJJJJKJJJJJJJJ KKJLKKKKJLKCKJLK KCJKCKCKJKKKKKKC JJJJJJJJKJKJJJJJ JLKKKKJLKKCKJLKK JKKKCKJCKKKKJKCK JKJKJJJJJKJKJJJJ AAAAAAAAAAAAAAAA } # tile 62 (sub mine walls 5) { AAANNNNLLLLLLAAA NNNNAAJJKKKKLJJJ LLLNAJJKCKCCLJJJ LLLLLLLLLLLLLJJJ LLLKKKKKKCKKKJJJ LLLKCKCKKKKCKJJJ LLKKKKKCKCKKKCJJ LCKCKCKKKKCKKKKJ JJJJJJJKJJJJJJJJ KKJLKKKKJLKCKJLK KKJKCKCKJKKKKKKK KJJJJJJJKJKJJJKJ JLKKKKKLKKKCJLKK JCKCKKJCKCKKJKCK JJJJJJJJJJJJJJJJ AAAAAAAAAAAAAAAA } # tile 63 (sub mine walls 6) { AAANNNNLLLLLLAAA NNNNAAJJKKKKLJJJ LLLNAJJKCKCCLJJJ LLLLLLLLLLLLLJJJ LLLKKKKKKCKKKJJJ LLLKCKCKKKKCKJJJ LLKKKKKCKCKKKCJJ LCKCKCKKKKCKKKKJ JJJJJJJKJJJJJJJJ AKKJJJJJJJJJCKKK ALLLAAAAAAAALLLA ALLLAJKKKKKJLLLA ALLLAJKCKCKJLLLA AJAAAJJKKKKJJAJA AJJJAJJCKCKJJJJA ALKKAJJKKKKJLKJA } # tile 64 (sub mine walls 7) { AAANNNNLLLLLLAAA NNNNAAJJCKKKLJJJ LLLNAJJKKKCCLJJJ LLLLLLLLLLLLLJJJ LLLKKKKCKKCKKJJJ LLLCKCKKKKKCKJJJ LLKKKKKCKCKKKKJJ LKKCKCKKKKCKCKKJ JJJJJJJKJJJJJJJJ KKJLKKKKJLKKKJLK CKJKCKCKJKCKCJKC JJJJJJJJJJJJJJJJ JLKKKKKLKKKKJLKK KKKCKKJKCKCKJKCK JJJJJKJJJJJJJJJJ AAAAAAAAAAAAAAAA } # tile 65 (sub mine walls 8) { AAANNNNLLLLLLAAA NNNNAAJJKKKKLJJJ LLLNAJJKCKCCLJJJ LLLLLLLLLLLLLJJJ LLLKKKKKCKKKKJJJ LLLCKCKKKCKCKJJJ LLKKKKCKKKKKKCJJ LKKCKKKKCKCKKKKJ JJJJJKJJJJJJKJJJ AKKJJJJJJJJJKKKJ ALLLAAAAAAAALLLA ALLLAJKKKCKJLLLA ALLLAJKCKKKJLLLA AJAAAJJKKCKJJAJA AJJJAJJKKKCJJJJA ALCKAJJCKKKJLKJA } # tile 66 (sub mine walls 9) { AAANNNNLLLLLLAAA NNNNAAJJKKKKLJJJ LLLNAJJKCKCCLJJJ LLLLLLLLLLLLLJJJ LLLKKKKKKCKKKJJJ LLLKCKCKKKKCKJJJ LLKKKKKCKCKKKCJJ LCKCKCKKKKCKKKKJ JJJJJJJKJJJJJJJJ AKKJJJJJJJJJCKKJ ALLLAAAAAAAALLLA ALLLAJKKKKKJLLLA ALLLAJKCKCKJLLLA AJAAAJJKKKKJJAJA AJJJAJJCKCKJJJJA ALKKAJJKKKKJLKJA } # tile 67 (sub mine walls 10) { AAANNNNLLLLLLAAA NNNNAAJJKKKKLJJJ LLLNAJJKCKCCLJJJ LLLLLLLLLLLLLJJJ LLLKKKKKKCKKKJJJ LLLKCKCKKKKCKJJJ LLKKKKKCKCKKKCJJ LCKCKCKKKKCKKKKJ JJJJJJJKJJJJJJJJ AKKJJJJJJJJJCKKJ ALLLAAAAAAAALLLA ALLLAJKKKKKJLLLA ALLLAJKCKCKJLLLA AJAAAJJKKKKJJAJA AJJJAJJCKCKJJJJA ALKKAJJKKKKJLKJA } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/share/gifread.c���������������������������������������������������������������0000664�0000764�0000764�00000041612�10545462317�015324� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* GIF reading routines based on those in pbmplus:ppm/giftoppm.c, bearing * following copyright notice: */ /* +-------------------------------------------------------------------+ */ /* | Copyright 1990, David Koblas. | */ /* | Permission to use, copy, modify, and distribute this software | */ /* | and its documentation for any purpose and without fee is hereby | */ /* | granted, provided that the above copyright notice appear in all | */ /* | copies and that both that copyright notice and this permission | */ /* | notice appear in supporting documentation. This software is | */ /* | provided "as is" without express or implied warranty. | */ /* +-------------------------------------------------------------------+ */ #include "config.h" #include "tile.h" #ifndef MONITOR_HEAP extern long *FDECL(alloc, (unsigned int)); #endif #define PPM_ASSIGN(p,red,grn,blu) do { (p).r = (red); (p).g = (grn); (p).b = (blu); } while ( 0 ) #define MAX_LWZ_BITS 12 #define INTERLACE 0x40 #define LOCALCOLORMAP 0x80 #define BitSet(byte, bit) (((byte) & (bit)) == (bit)) #define ReadOK(file,buffer,len) (fread((genericptr_t)buffer, (int)len, 1, file) != 0) #define LM_to_uint(a,b) (((b)<<8)|(a)) struct gifscreen { int Width; int Height; int Colors; int ColorResolution; int Background; int AspectRatio; int Interlace; } GifScreen; struct { int transparent; int delayTime; int inputFlag; int disposal; } Gif89 = { -1, -1, -1, 0 }; int ZeroDataBlock = FALSE; static FILE *gif_file; static int tiles_across, tiles_down, curr_tiles_across, curr_tiles_down; static pixel **image; static unsigned char input_code_size; static int FDECL(GetDataBlock, (FILE *fd, unsigned char *buf)); static void FDECL(DoExtension, (FILE *fd, int label)); static boolean FDECL(ReadColorMap, (FILE *fd, int number)); static void FDECL(read_header, (FILE *fd)); static int FDECL(GetCode, (FILE *fd, int code_size, int flag)); static int FDECL(LWZReadByte, (FILE *fd, int flag, int input_code_size)); static void FDECL(ReadInterleavedImage, (FILE *fd, int len, int height)); static void FDECL(ReadTileStrip, (FILE *fd, int len)); /* These should be in gif.h, but there isn't one. */ boolean FDECL(fopen_gif_file, (const char *, const char *)); boolean FDECL(read_gif_tile, (pixel(*)[])); int NDECL(fclose_gif_file); #ifdef INDEX static const char *index_file = "index"; #endif static int GetDataBlock(fd, buf) FILE *fd; unsigned char *buf; { unsigned char count; if (!ReadOK(fd,&count,1)) { Fprintf(stderr, "error in getting DataBlock size\n"); return -1; } ZeroDataBlock = (count == 0); if ((count != 0) && (!ReadOK(fd, buf, count))) { Fprintf(stderr, "error in reading DataBlock\n"); return -1; } return count; } static void DoExtension(fd, label) FILE *fd; int label; { static char buf[256]; char *str; switch (label) { case 0x01: /* Plain Text Extension */ str = "Plain Text Extension"; #ifdef notdef if (GetDataBlock(fd, (unsigned char*) buf) == 0) ; lpos = LM_to_uint(buf[0], buf[1]); tpos = LM_to_uint(buf[2], buf[3]); width = LM_to_uint(buf[4], buf[5]); height = LM_to_uint(buf[6], buf[7]); cellw = buf[8]; cellh = buf[9]; foreground = buf[10]; background = buf[11]; while (GetDataBlock(fd, (unsigned char*) buf) != 0) { PPM_ASSIGN(image[ypos][xpos], cmap[CM_RED][v], cmap[CM_GREEN][v], cmap[CM_BLUE][v]); ++index; } return; #else break; #endif case 0xff: /* Application Extension */ str = "Application Extension"; break; case 0xfe: /* Comment Extension */ str = "Comment Extension"; while (GetDataBlock(fd, (unsigned char*) buf) != 0) { Fprintf(stderr, "gif comment: %s\n", buf ); } return; case 0xf9: /* Graphic Control Extension */ str = "Graphic Control Extension"; (void) GetDataBlock(fd, (unsigned char*) buf); Gif89.disposal = (buf[0] >> 2) & 0x7; Gif89.inputFlag = (buf[0] >> 1) & 0x1; Gif89.delayTime = LM_to_uint(buf[1],buf[2]); if ((buf[0] & 0x1) != 0) Gif89.transparent = buf[3]; while (GetDataBlock(fd, (unsigned char*) buf) != 0) ; return; default: str = buf; Sprintf(buf, "UNKNOWN (0x%02x)", label); break; } Fprintf(stderr, "got a '%s' extension\n", str); while (GetDataBlock(fd, (unsigned char*) buf) != 0) ; } static boolean ReadColorMap(fd,number) FILE *fd; int number; { int i; unsigned char rgb[3]; for (i = 0; i < number; ++i) { if (!ReadOK(fd, rgb, sizeof(rgb))) { return(FALSE); } ColorMap[CM_RED][i] = rgb[0] ; ColorMap[CM_GREEN][i] = rgb[1] ; ColorMap[CM_BLUE][i] = rgb[2] ; } colorsinmap = number; return TRUE; } /* * Read gif header, including colormaps. We expect only one image per * file, so if that image has a local colormap, overwrite the global one. */ static void read_header(fd) FILE *fd; { unsigned char buf[16]; unsigned char c; char version[4]; if (!ReadOK(fd,buf,6)) { Fprintf(stderr, "error reading magic number\n"); exit(EXIT_FAILURE); } if (strncmp((genericptr_t)buf,"GIF",3) != 0) { Fprintf(stderr, "not a GIF file\n"); exit(EXIT_FAILURE); } (void) strncpy(version, (char *)buf + 3, 3); version[3] = '\0'; if ((strcmp(version, "87a") != 0) && (strcmp(version, "89a") != 0)) { Fprintf(stderr, "bad version number, not '87a' or '89a'\n"); exit(EXIT_FAILURE); } if (!ReadOK(fd,buf,7)) { Fprintf(stderr, "failed to read screen descriptor\n"); exit(EXIT_FAILURE); } GifScreen.Width = LM_to_uint(buf[0],buf[1]); GifScreen.Height = LM_to_uint(buf[2],buf[3]); GifScreen.Colors = 2<<(buf[4]&0x07); GifScreen.ColorResolution = (((buf[4]&0x70)>>3)+1); GifScreen.Background = buf[5]; GifScreen.AspectRatio = buf[6]; if (BitSet(buf[4], LOCALCOLORMAP)) { /* Global Colormap */ if (!ReadColorMap(fd, GifScreen.Colors)) { Fprintf(stderr, "error reading global colormap\n"); exit(EXIT_FAILURE); } } if (GifScreen.AspectRatio != 0 && GifScreen.AspectRatio != 49) { Fprintf(stderr, "warning - non-square pixels\n"); } for (;;) { if (!ReadOK(fd,&c,1)) { Fprintf(stderr, "EOF / read error on image data\n"); exit(EXIT_FAILURE); } if (c == ';') { /* GIF terminator */ return; } if (c == '!') { /* Extension */ if (!ReadOK(fd,&c,1)) { Fprintf(stderr, "EOF / read error on extension function code\n"); exit(EXIT_FAILURE); } DoExtension(fd, (int)c); continue; } if (c != ',') { /* Not a valid start character */ Fprintf(stderr, "bogus character 0x%02x, ignoring\n", (int) c); continue; } if (!ReadOK(fd,buf,9)) { Fprintf(stderr, "couldn't read left/top/width/height\n"); exit(EXIT_FAILURE); } if (BitSet(buf[8], LOCALCOLORMAP)) { /* replace global color map with local */ GifScreen.Colors = 1<<((buf[8]&0x07)+1); if (!ReadColorMap(fd, GifScreen.Colors)) { Fprintf(stderr, "error reading local colormap\n"); exit(EXIT_FAILURE); } } if (GifScreen.Width != LM_to_uint(buf[4],buf[5])) { Fprintf(stderr, "warning: widths don't match\n"); GifScreen.Width = LM_to_uint(buf[4],buf[5]); } if (GifScreen.Height != LM_to_uint(buf[6],buf[7])) { Fprintf(stderr, "warning: heights don't match\n"); GifScreen.Height = LM_to_uint(buf[6],buf[7]); } GifScreen.Interlace = BitSet(buf[8], INTERLACE); return; } } static int GetCode(fd, code_size, flag) FILE *fd; int code_size; int flag; { static unsigned char buf[280]; static int curbit, lastbit, done, last_byte; int i, j, ret; unsigned char count; if (flag) { curbit = 0; lastbit = 0; done = FALSE; return 0; } if ((curbit+code_size) >= lastbit) { if (done) { if (curbit >= lastbit) Fprintf(stderr, "ran off the end of my bits\n"); return -1; } buf[0] = buf[last_byte-2]; buf[1] = buf[last_byte-1]; if ((count = GetDataBlock(fd, &buf[2])) == 0) done = TRUE; last_byte = 2 + count; curbit = (curbit - lastbit) + 16; lastbit = (2+count)*8 ; } ret = 0; for (i = curbit, j = 0; j < code_size; ++i, ++j) ret |= ((buf[ i / 8 ] & (1 << (i % 8))) != 0) << j; curbit += code_size; return ret; } static int LWZReadByte(fd, flag, input_code_size) FILE *fd; int flag; int input_code_size; { static int fresh = FALSE; int code, incode; static int code_size, set_code_size; static int max_code, max_code_size; static int firstcode, oldcode; static int clear_code, end_code; static int table[2][(1<< MAX_LWZ_BITS)]; static int stack[(1<<(MAX_LWZ_BITS))*2], *sp; register int i; if (flag) { set_code_size = input_code_size; code_size = set_code_size+1; clear_code = 1 << set_code_size ; end_code = clear_code + 1; max_code_size = 2*clear_code; max_code = clear_code+2; (void) GetCode(fd, 0, TRUE); fresh = TRUE; for (i = 0; i < clear_code; ++i) { table[0][i] = 0; table[1][i] = i; } for (; i < (1<<MAX_LWZ_BITS); ++i) table[0][i] = table[1][0] = 0; sp = stack; return 0; } else if (fresh) { fresh = FALSE; do { firstcode = oldcode = GetCode(fd, code_size, FALSE); } while (firstcode == clear_code); return firstcode; } if (sp > stack) return *--sp; while ((code = GetCode(fd, code_size, FALSE)) >= 0) { if (code == clear_code) { for (i = 0; i < clear_code; ++i) { table[0][i] = 0; table[1][i] = i; } for (; i < (1<<MAX_LWZ_BITS); ++i) table[0][i] = table[1][i] = 0; code_size = set_code_size+1; max_code_size = 2*clear_code; max_code = clear_code+2; sp = stack; firstcode = oldcode = GetCode(fd, code_size, FALSE); return firstcode; } else if (code == end_code) { int count; unsigned char buf[260]; if (ZeroDataBlock) return -2; while ((count = GetDataBlock(fd, buf)) > 0) ; if (count != 0) Fprintf(stderr, "missing EOD in data stream (common occurrence)\n"); return -2; } incode = code; if (code >= max_code) { *sp++ = firstcode; code = oldcode; } while (code >= clear_code) { *sp++ = table[1][code]; if (code == table[0][code]) { Fprintf(stderr, "circular table entry BIG ERROR\n"); exit(EXIT_FAILURE); } code = table[0][code]; } *sp++ = firstcode = table[1][code]; if ((code = max_code) <(1<<MAX_LWZ_BITS)) { table[0][code] = oldcode; table[1][code] = firstcode; ++max_code; if ((max_code >= max_code_size) && (max_code_size < (1<<MAX_LWZ_BITS))) { max_code_size *= 2; ++code_size; } } oldcode = incode; if (sp > stack) return *--sp; } return code; } static void ReadInterleavedImage(fd, len, height) FILE *fd; int len, height; { int v; int xpos = 0, ypos = 0, pass = 0; while ((v = LWZReadByte(fd,FALSE,(int)input_code_size)) >= 0 ) { PPM_ASSIGN(image[ypos][xpos], ColorMap[CM_RED][v], ColorMap[CM_GREEN][v], ColorMap[CM_BLUE][v]); ++xpos; if (xpos == len) { xpos = 0; switch (pass) { case 0: case 1: ypos += 8; break; case 2: ypos += 4; break; case 3: ypos += 2; break; } if (ypos >= height) { ++pass; switch (pass) { case 1: ypos = 4; break; case 2: ypos = 2; break; case 3: ypos = 1; break; default: goto fini; } } } if (ypos >= height) break; } fini: if (LWZReadByte(fd,FALSE,(int)input_code_size)>=0) Fprintf(stderr, "too much input data, ignoring extra...\n"); } static void ReadTileStrip(fd,len) FILE *fd; int len; { int v; int xpos = 0, ypos = 0; while ((v = LWZReadByte(fd,FALSE,(int)input_code_size)) >= 0 ) { PPM_ASSIGN(image[ypos][xpos], ColorMap[CM_RED][v], ColorMap[CM_GREEN][v], ColorMap[CM_BLUE][v]); ++xpos; if (xpos == len) { xpos = 0; ++ypos; } if (ypos >= tile_y) break; } } boolean fopen_gif_file(filename, type) const char *filename; const char *type; { int i; if (strcmp(type, RDBMODE)) { Fprintf(stderr, "using reading routine for non-reading?\n"); return FALSE; } gif_file = fopen(filename, type); if (gif_file == (FILE *)0) { Fprintf(stderr, "cannot open gif file %s\n", filename); return FALSE; } read_header(gif_file); if (GifScreen.Width % tile_x) { Fprintf(stderr, "error: width %d not divisible by %d\n", GifScreen.Width, tile_x); exit(EXIT_FAILURE); } tiles_across = GifScreen.Width / tile_x; curr_tiles_across = 0; if (GifScreen.Height % tile_y) { Fprintf(stderr, "error: height %d not divisible by %d\n", GifScreen.Height, tile_y); /* exit(EXIT_FAILURE) */; } tiles_down = GifScreen.Height / tile_y; curr_tiles_down = 0; if (GifScreen.Interlace) { /* sigh -- hope this doesn't happen on micros */ image = (pixel **)alloc(GifScreen.Height * sizeof(pixel *)); for (i = 0; i < GifScreen.Height; i++) { image[i] = (pixel *) alloc(GifScreen.Width * sizeof(pixel)); } } else { image = (pixel **)alloc(tile_y * sizeof(pixel *)); for (i = 0; i < tile_y; i++) { image[i] = (pixel *) alloc(GifScreen.Width * sizeof(pixel)); } } /* ** Initialize the Compression routines */ if (!ReadOK(gif_file,&input_code_size,1)) { Fprintf(stderr, "EOF / read error on image data\n"); exit(EXIT_FAILURE); } if (LWZReadByte(gif_file, TRUE, (int)input_code_size) < 0) { Fprintf(stderr, "error reading image\n"); exit(EXIT_FAILURE); } /* read first section */ if (GifScreen.Interlace) { ReadInterleavedImage(gif_file, GifScreen.Width,GifScreen.Height); } else { ReadTileStrip(gif_file,GifScreen.Width); } return TRUE; } /* Read a tile. Returns FALSE when there are no more tiles */ boolean read_gif_tile(pixels) pixel (*pixels)[MAX_TILE_X]; { int i, j; if (curr_tiles_down >= tiles_down) return FALSE; if (curr_tiles_across == tiles_across) { curr_tiles_across = 0; curr_tiles_down++; if (curr_tiles_down >= tiles_down) return FALSE; if (!GifScreen.Interlace) ReadTileStrip(gif_file,GifScreen.Width); } if (GifScreen.Interlace) { for (j = 0; j < tile_y; j++) { for (i = 0; i < tile_x; i++) { pixels[j][i] = image[curr_tiles_down*tile_y + j] [curr_tiles_across*tile_x + i]; } } } else { for (j = 0; j < tile_y; j++) { for (i = 0; i < tile_x; i++) { pixels[j][i] = image[j][curr_tiles_across*tile_x + i]; } } } curr_tiles_across++; /* check for "filler" tile */ for (j = 0; j < tile_y; j++) { for (i = 0; i < tile_x && i < 4; i += 2) { if (pixels[j][i].r != ColorMap[CM_RED][0] || pixels[j][i].g != ColorMap[CM_GREEN][0] || pixels[j][i].b != ColorMap[CM_BLUE][0] || pixels[j][i+1].r != ColorMap[CM_RED][1] || pixels[j][i+1].g != ColorMap[CM_GREEN][1] || pixels[j][i+1].b != ColorMap[CM_BLUE][1]) return TRUE; } } return FALSE; } int fclose_gif_file() { int i; if (GifScreen.Interlace) { for (i = 0; i < GifScreen.Height; i++) { free((genericptr_t)image[i]); } free((genericptr_t)image); } else { for (i = 0; i < tile_y; i++) { free((genericptr_t)image[i]); } free((genericptr_t)image); } return(fclose(gif_file)); } #ifndef AMIGA static char *std_args[] = { "tilemap", /* dummy argv[0] */ "monsters.gif", "monsters.txt", "objects.gif", "objects.txt", "other.gif", "other.txt" }; int main(argc, argv) int argc; char *argv[]; { pixel pixels[MAX_TILE_Y][MAX_TILE_X]; /* tile_x = 16; tile_y = 16; */ /* tile_x = 32; tile_y = 32; */ /* tile_x = 48; tile_y = 64; */ tile_x = 128; tile_y = 128; #ifndef INDEX if (argc == 1) { argc = SIZE(std_args); argv = std_args; } else if (argc != 3) { Fprintf(stderr, "usage: gif2txt giffile txtfile\n"); exit(EXIT_FAILURE); } #else if (argc != 4) { Fprintf(stderr, "usage: igif2txt indexfile giffile txtfile\n"); exit(EXIT_FAILURE); } #endif while (argc > 1) { #ifdef INDEX int i = 0, col, row; FILE *fp; char buf[BUFSZ]; char tilename[BUFSZ]; char *bufp, *bufs; if ((fp = fopen(argv[1], "r")) == (FILE *)0) { Fprintf(stderr, "Could not open index file '%s'!\n", index_file); exit(EXIT_FAILURE); } argc--; argv++; #endif if (!fopen_gif_file(argv[1], RDBMODE)) exit(EXIT_FAILURE); init_colormap(); if (!fopen_text_file(argv[2], WRTMODE)) { (void) fclose_gif_file(); exit(EXIT_FAILURE); } #ifdef INDEX while(fgets(buf,120,fp)) { /* find the ')'*/ bufs = index(buf, '('); if (!bufs) continue; /* find the ')'*/ bufp = index(buf, ')'); if (!bufp) continue; *(bufp + 1) = '\0'; /* we only want everything up to the ) */ /* (tile name) */ sscanf (bufs, "(%[^)])", tilename); Fprintf(stdout, "# tile %d (%s)\n", i, tilename); if (read_gif_tile(pixels)) (void) write_text_tile_info(pixels, "tile", i, tilename); else break; i++; } #else while (read_gif_tile(pixels)) (void) write_text_tile(pixels); #endif (void) fclose_gif_file(); (void) fclose_text_file(); argc -= 2; argv += 2; } exit(EXIT_SUCCESS); /*NOTREACHED*/ return 0; } #endif ����������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/share/mon32alg.txt������������������������������������������������������������0000664�0000764�0000764�00000225236�10545462317�015750� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������__ = (71, 108, 108) _A = (0, 0, 0) _B = (0, 0, 16) _C = (0, 0, 32) _D = (0, 0, 48) _E = (0, 0, 64) _F = (0, 0, 96) _G = (0, 0, 128) _H = (0, 0, 160) _I = (0, 0, 192) _J = (0, 0, 224) _K = (0, 0, 255) _L = (0, 16, 0) _M = (0, 16, 16) _N = (0, 24, 0) _O = (0, 24, 24) _P = (0, 24, 48) _Q = (0, 32, 0) _R = (0, 32, 32) _S = (0, 32, 64) _T = (0, 48, 0) _U = (0, 48, 24) _V = (0, 48, 48) _W = (0, 48, 96) _X = (0, 64, 0) _Y = (0, 64, 32) _Z = (0, 64, 64) _a = (0, 64, 128) _b = (0, 80, 160) _c = (0, 96, 0) _d = (0, 96, 48) _e = (0, 96, 96) _f = (0, 96, 192) _g = (0, 112, 224) _h = (0, 128, 0) _i = (0, 128, 64) _j = (0, 128, 128) _k = (0, 128, 255) _l = (0, 144, 0) _m = (0, 160, 0) _n = (0, 160, 80) _o = (0, 160, 160) _p = (0, 182, 255) _q = (0, 192, 0) _r = (0, 192, 96) _s = (0, 192, 192) _t = (0, 224, 0) _u = (0, 224, 112) _v = (0, 224, 224) _w = (0, 255, 0) _x = (0, 255, 128) _y = (0, 255, 255) _z = (16, 0, 0) _0 = (16, 0, 16) _1 = (16, 16, 0) _2 = (16, 16, 16) _3 = (16, 48, 48) _4 = (24, 0, 0) _5 = (24, 24, 0) _6 = (24, 24, 48) _7 = (24, 48, 0) _8 = (24, 48, 24) _9 = (24, 48, 48) _$ = (32, 0, 0) A_ = (32, 0, 32) AA = (32, 32, 0) AB = (32, 32, 32) AC = (32, 64, 0) AD = (32, 64, 32) AE = (32, 64, 64) AF = (32, 242, 186) AG = (48, 0, 0) AH = (48, 0, 48) AI = (48, 12, 0) AJ = (48, 24, 0) AK = (48, 24, 24) AL = (48, 36, 0) AM = (48, 48, 0) AN = (48, 48, 24) AO = (48, 48, 48) AP = (48, 48, 96) AQ = (48, 96, 0) AR = (48, 96, 48) AS = (48, 96, 96) AT = (64, 0, 0) AU = (64, 0, 32) AV = (64, 0, 64) AW = (64, 0, 128) AX = (64, 16, 0) AY = (64, 32, 0) AZ = (64, 32, 32) Aa = (64, 32, 64) Ab = (64, 48, 0) Ac = (64, 64, 0) Ad = (64, 64, 32) Ae = (64, 64, 64) Af = (64, 64, 128) Ag = (64, 128, 0) Ah = (64, 128, 64) Ai = (64, 128, 128) Aj = (72, 108, 108) Ak = (80, 0, 160) Al = (80, 80, 80) Am = (80, 80, 160) An = (80, 160, 0) Ao = (80, 160, 80) Ap = (80, 160, 160) Aq = (96, 0, 0) Ar = (96, 0, 48) As = (96, 0, 96) At = (96, 0, 192) Au = (96, 16, 0) Av = (96, 24, 0) Aw = (96, 48, 0) Ax = (96, 48, 48) Ay = (96, 48, 96) Az = (96, 72, 0) A0 = (96, 96, 0) A1 = (96, 96, 48) A2 = (96, 96, 96) A3 = (96, 96, 128) A4 = (96, 96, 192) A5 = (96, 128, 96) A6 = (96, 128, 128) A7 = (96, 192, 0) A8 = (96, 192, 96) A9 = (96, 192, 192) A$ = (96, 144, 178) B_ = (104, 84, 31) BA = (108, 144, 182) BB = (108, 255, 0) BC = (112, 0, 224) BD = (112, 112, 112) BE = (112, 112, 224) BF = (112, 160, 160) BG = (112, 224, 0) BH = (112, 224, 112) BI = (112, 224, 224) BJ = (117, 105, 88) BK = (120, 120, 160) BL = (120, 160, 120) BM = (120, 160, 160) BN = (128, 0, 0) BO = (128, 0, 64) BP = (128, 0, 128) BQ = (128, 0, 255) BR = (128, 32, 0) BS = (128, 64, 0) BT = (128, 64, 64) BU = (128, 64, 128) BV = (128, 90, 72) BW = (128, 96, 0) BX = (128, 96, 96) BY = (128, 96, 128) BZ = (128, 112, 32) Ba = (128, 128, 0) Bb = (128, 128, 64) Bc = (128, 128, 96) Bd = (128, 128, 128) Be = (128, 128, 255) Bf = (128, 255, 0) Bg = (128, 255, 128) Bh = (128, 255, 255) Bi = (144, 72, 0) Bj = (144, 135, 110) Bk = (144, 144, 144) Bl = (144, 144, 192) Bm = (144, 192, 144) Bn = (144, 192, 192) Bo = (160, 0, 0) Bp = (160, 0, 80) Bq = (160, 0, 160) Br = (160, 40, 0) Bs = (160, 80, 0) Bt = (160, 80, 80) Bu = (160, 80, 160) Bv = (160, 120, 0) Bw = (160, 120, 120) Bx = (160, 120, 160) By = (160, 160, 0) Bz = (160, 160, 80) B0 = (160, 160, 120) B1 = (160, 160, 160) B2 = (160, 160, 224) B3 = (165, 118, 96) B4 = (168, 168, 224) B5 = (168, 224, 168) B6 = (168, 224, 224) B7 = (170, 136, 52) B8 = (170, 154, 128) B9 = (176, 176, 176) B$ = (178, 64, 0) C_ = (178, 224, 16) CA = (182, 72, 0) CB = (192, 0, 0) CC = (192, 0, 96) CD = (192, 0, 192) CE = (192, 48, 0) CF = (192, 96, 0) CG = (192, 96, 96) CH = (192, 96, 192) CI = (192, 144, 0) CJ = (192, 144, 144) CK = (192, 144, 192) CL = (192, 160, 64) CM = (192, 192, 0) CN = (192, 192, 96) CO = (192, 192, 144) CP = (192, 192, 192) CQ = (192, 192, 255) CR = (192, 255, 192) CS = (192, 255, 255) CT = (202, 144, 114) CU = (208, 168, 80) CV = (208, 208, 208) CW = (210, 210, 178) CX = (218, 218, 182) CY = (224, 0, 0) CZ = (224, 0, 112) Ca = (224, 0, 224) Cb = (224, 56, 0) Cc = (224, 112, 0) Cd = (224, 112, 112) Ce = (224, 112, 224) Cf = (224, 168, 0) Cg = (224, 168, 168) Ch = (224, 168, 224) Ci = (224, 192, 160) Cj = (224, 224, 0) Ck = (224, 224, 112) Cl = (224, 224, 168) Cm = (224, 224, 224) Cn = (229, 162, 130) Co = (240, 240, 240) Cp = (242, 0, 0) Cq = (242, 96, 0) Cr = (242, 196, 77) Cs = (248, 224, 96) Ct = (252, 252, 153) Cu = (255, 0, 0) Cv = (255, 0, 128) Cw = (255, 0, 255) Cx = (255, 64, 0) Cy = (255, 108, 0) Cz = (255, 128, 0) C0 = (255, 128, 128) C1 = (255, 128, 255) C2 = (255, 182, 144) C3 = (255, 192, 0) C4 = (255, 192, 192) C5 = (255, 192, 255) C6 = (255, 211, 176) C7 = (255, 255, 0) C8 = (255, 255, 128) C9 = (255, 255, 192) C$ = (255, 255, 255) # tile 24 (winter wolf cub) { CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCPCPCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCPCoCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCoCPCPCwCwCwCwCwCwCwCwCw CwCwCwCwBDBDBDCoCVCoCoCwCwCwCwCwCwCwCwCwCVCVCoCwCwCwCwCwCwCwCwCw CwCwCwBDBDBDCoCoCPCVC$CVCwCwCwCwCwCwCwCwCwCoCPCwCwCwCwCwCwCwCwCw CwCwCwBDBDCPCoCVBDBDBDCVC$CVC$C$C$C$CwCwCwCVCVCwCwCwCwCwCwCwCwCw CwCwCwCwCwCPCuCuBDBdBdBdCVC$C$CVC$CVC$C$C$CVCoCwCwCwCwCwCwCwCwCw CwCwCwCwCPCVCuCuCVBDBDBdCVCVCmCVCVCVCVCVCVCoCwCwCwCwCwCwCwCwCwCw CwCwCw_zCPCPCVCVCVCVBdBdCVCmCVCVCmCVB9CVCVCVCVCwCwCwCwCwCwCwCwCw CwCwCw_ACVCPB1B1B1CVCVCVCVB9CVB9CVCmCVCVCVCVCVCwCwCwCwCwCwCwCwCw CwCwCwCwCPB1B1_A_1B1B1B1CmB1B9CVB9B1B9CVB1CVCV_A_ACwCwCwCwCwCwCw CwCwCwCwCwCwCw_A_BB1B9_zCVCmB1B9B1B1B9CVB1CV_A_2_A_2CwCwCwCwCwCw CwCwCwCwCwCw_1_B_1B1Bd_MCVB1_z_ABdA2_zCVB1CV_A_1_A_ACwCwCwCwCwCw CwCwCwCwCwCw_A_1B1BkBd_1CVBk_LA2A2Al_1CVBkBd_2_A_M_zCwCwCwCwCwCw CwCwCwCwCwCw_A_B_A_A_0CVBdBk_0_A_A_ACVBkBd_A_A_0_ACwCwCwCwCwCwCw CwCwCwCwCwCwCw_1_B_1_A_2_A_A_L_0_L_0_A_A_2_A_2CwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCw_A_M_A_1_B_1_A_B_1_A_2_A_ACwCwCwCwCwCwCwCwCwCw } # tile 28 (Cerberus) { CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCw_ACwCw_A_ACwCwCwCwABABCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCw_ABS_ACw_A_A_ACwABABABABCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCw_A_A_A_ABSBS_A_A_A_ACwABABBsABABCwCwABABCw CwCwCwCwCwCwCwCwCw_A_A_A_A_A_A_ABS_A_A_A_ACwABABBsABABCwABABABCw CwCw_A_A_A_ACwCwCw_A_AA1AJ_A_A_A_A_ABs_A_ACwABABBsABABCwABABABAB Cw_A_A_A_A_A_A_A_A_A_AA1A1_ACcCc_A_ABs_A_A_A__ABBsABABABABBsABAB Cw_A_AA1_ABs_A_A_A_A_A_A_A_ACcCcCcCcCcBs_A_A_A_A_AABABABABBsABAB _A_A_A_A_ABsBSBSBS_A_ACcCcCcCcCcCc_A_ABs_A_A_A_A_A_AABABBsBsABAB _A_ABsBsBsBsBsBSAB_A_ACcCcCcCcCcCc_A_ABs_A_ABsBs_A_A_AABBsABABCw _A_A_A_A_ABsBsBsAB_A_A_A_A_A_ACcCcCcCcCcCc_ABsBsBsAB_ABsBsABABCw Cw_A_A_A_A_A_ABsBS_A_A_A_A_A_A_A_ACcCcCcCcBsBsBsBsABABBsABABCwCw CwCwCwCw_A_A_ABsBSBSBSBS_ACBCB_A_ACcCcCcCcCcCcBsBsABAB_AABABCwCw CwCwCwCw_ACB_A_ABsBSBSBS_ACBCB_A_ACcCcCcCcCcCcCcBsABAB_AABCwCwCw CwCwCwCw_ACB_A_ABsBSBSBS_ACBCB_A_ACcCcCcCcCcCcCcBsBsABABCwCwCwCw CwCwCwCw_ACB_A_ABsBsBSBS_ACBCB_A_ACcCcCcCcCcCcBsBsBsABABCwCwCwCw CwCwCw_A_A_A_ABsBsBSBS_A_A_A_A_A_ACcCcCcCcCcCcCcBsBsABABCwCwCwCw CwCwCw_A_A_A_A_A_A_ABS_A_A_A_A_A_A_ACcCcCcCcCcCcBsBsAB_ACwCwCwCw CwCwCwCw_A_A_A_A_A_ABS_A_ACcCcCc_A_ACcCcCcCcCcCcBsBsBs_AABCwCwCw CwCwCwCwCwCwCw_A_ABsBS_A_A_A_A_A_ACcBs_A_ACcBsBsBsBsBsABABCwCwCw CwCwCwCwCwCwCw_A_ABs_A_AABABAB_A_A_ABsBs_ABsBsBsBsBsBsABABCwCwCw CwCwCwCwCwCw_A_ABs_A_AABABABAYAB_A_ACcBs_A_A_A_A_ABsBsABABABABCw CwCwCwCwCwCw_A_ABs_A_AABABABAYAB_A_A_ABs_A_A_A_AABABBsABABABABAB CwCwCwCwCwCw_A_A_AABABABCwABABAB_A_A_A_A_AABABCwABABABABABABCwCw CwCwCwCwCwCw_AABABABCwCwCwABABCwCwCw_A_AABABCwCwCwABABABABCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw } # tile 29 (gas spore) { CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwC7CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCw_tAo_qCNCjCsC7CsAnCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCw_qAh_qCMCNBGCNCjCsCjCsCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwAn_nAn_i_mCMBzCMCMCNCjCNCMCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwA8_q_n_qAh_qAh_lCMBzCMCNCMCNCMCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCjA8A8_mAoAnAh_mAh_hByBbByByCLCNCjCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwA8AoCjAh_q_nAn_nAgBzByBaBbByBzByCNCwCwCwCwCwCwCwCwCw CwCwCwCwCwCw_uCjCr_qAoAn_nAhByByBZBaBZBaBaBzCMCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCsCjCNCjAhCjCNCMByBbBaBaBZBZBZByCLCwCwCwCwCwCwCwCwCw CwCwCwCwCwC7CrCjCMCNCMBzCMBzByBaBaA0BZAgBbBaAhCjCwCwCwCwCwCwCwCw CwCwCwCwCwCwCjCNCMCMAhCMByBaBbBaBZBaBaBZBZBZ_lCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCNByAg_iAg_lBbByBaBaAnBZBZBZAnBZCLCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCMCLBy_hAgBZBaBZBaBZBaBZBaBZBbBZByCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCMBbByBZBaBZBaBaBaBZBZBaBZBbBaBzCMCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwByBZBZBaBZA0AR_cAQARARBZBaBzByCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwBbA0A0BaA0AQAQAR_hARBaBzBaCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwA0A1A0A1A0ARBaBZBaBbByCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwAdA0A1A0A0BZBaBbByCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCw_L_L_L_M_A_LBZ_L_A_L_L_B_L_ACwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCw_L_A_A_B_A_A_A_A_M_A_1_B_A_A_A_A_A_ACwCwCwCwCwCwCwCw CwCwCwCwCw_A_A_B_1_A_z_M_z_A_A_A_B_A_1_B_1_B_1_A_ACwCwCwCwCwCwCw CwCwCwCwCwCwCw_A_A_M_A_A_A_A_2_A_1_A_A_A_A_A_B_ACwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCw_A_z_M_A_z_A_A_B_A_2_A_1CwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw } # tile 33 (shocking sphere) { CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCw_A_GBd_A_G_G_GCPBdCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCw_A_A_G_G_GCPCP_G_G_GCP_GBdCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCw_A_A_G_G_G_G_G_GCPBd_G_GCP_G_GBdBdCwCwCwCwCwCwCwCw CwCwCwCwCwCw_A_G_G_G_G_G_G_G_G_GC$_G_GCP_G_G_G_GBdCwCwCwCwCwCwCw CwCwCwCwCw_A_A_G_G_G_K_G_K_G_K_GCP_GBdC$_G_K_G_K_GBdCwCwCwCwCwCw CwCwCwCw_A_G_G_G_G_K_G_K_G_K_G_GC$C$_GC$_K_G_G_G_G_GCPCwCwCwCwCw CwCwCwCw_A_G_G_G_G_K_K_K_K_K_K_K_G_GC$C$_G_K_G_G_GBdBdCPCwCwCwCw CwCwCw_A_G_G_G_G_K_G_K_K_K_K_K_K_K_G_GC$_G_G_GBdBd_G_GBdCwCwCwCw CwCwCw_A_G_G_G_K_G_K_K_j_y_j_K_K_G_G_jCP_G_K_GCP_G_G_G_GBdCwCwCw CwCw_A_G_G_G_K_G_K_G_K_yCPBd_K_K_G_jC$_G_G_G_GCP_G_K_G_GBdCwCwCw CwCw_A_G_G_G_G_K_G_K_K_jBd_j_K_G_G_jC$_G_K_G_GCP_G_G_G_G_GBdCwCw CwCw_A_G_G_G_K_G_K_G_K_K_K_K_K_K_G_GC$CPC$C$CP_K_G_G_A_A_GBdCwCw CwCw_A_G_G_G_G_K_G_K_G_K_G_K_G_G_K_G_G_G_GCP_G_G_G_A_G_G_GBdCwCw CwCw_A_G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_K_GBdCP_j_K_G_G_A_A_GBdCwCw CwCw_A_G_G_G_G_K_G_K_G_K_G_G_G_G_G_G_GCPC$Bd_G_G_G_A_G_A_ABdCwCw CwCw_A_G_G_G_G_G_G_G_G_G_G_G_GC$C$CPC$C$_G_G_G_G_A_G_A_A_GBdCwCw CwCw_A_G_A_A_G_G_K_G_G_G_K_GC$_G_G_G_GC$_G_G_G_A_G_A_G_G_GBdCwCw CwCw_A_G_G_G_G_G_G_G_G_G_G_GC$_G_G_G_GC$_G_K_G_G_GBd_j_G_GBdCwCw CwCw_A_G_G_G_G_A_G_G_G_A_G_GC$_G_G_G_GCPCPCPBdBd_j_G_G_GBdCwCwCw CwCwCw_A_G_G_G_G_A_G_G_G_G_GC$_G_G_G_GC$Bd_j_A_G_A_j_A_GBdCwCwCw CwCwCw_A_G_G_G_A_G_A_G_G_G_GC$CPCP_G_GCP_K_G_G_A_G_G_GBdCwCwCwCw CwCwCwCw_A_G_G_G_G_G_G_G_ACP_A_ABd_GCP_G_G_G_A_A_A_G_GBdCwCwCwCw CwCwCwCw_A_G_G_G_G_A_G_jCP_A_G_ACPBd_j_A_G_A_G_A_G_GBdCwCwCwCwCw CwCwCwCwCw_A_A_G_A_j_j_G_A_G_A_GC$_j_A_A_A_G_A_G_GBdCwCwCwCwCwCw CwCwCwCwCwCw_A_A_G_A_G_A_G_A_jBd_j_A_A_A_G_G_G_GBdCwCwCwCwCwCwCw CwCwCwCwCwCwCw_A_A_A_G_G_G_A_j_A_A_A_A_A_G_GBdBdCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCw_A_G_G_G_G_G_A_A_G_A_GBdBdCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCw_A_A_A_ABdBdBdBdCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw } # tile 40 (large cat) { CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCmCwCwCwCwCwCwCmCmCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCPCmCwCwCwCwCmCPCPCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCPCmCmCmCmCmCmCPCPCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCmCmCmCmCmCmCmCmCmCPCmCmCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCmCmABCoCmCmABCoCmCmCmCmCmCmCmCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCmCmCmCmCPCmCmCmCPCmCmCmCmCmCmCmCmCmCwCwCwCwCwCwCwCw CwCwCwCwCwCwCPCPCmCmC4CmCmCPCPCoCmCmCoCmCmCmCmCmCmCwCwCwCwCwCwCw CwCwCwCwCwCwCwCPCPC0CuC0CPCPCmCmCmCmCmCPCPCVCPCmCmCmCwCwCwCwCwCw CwCwCwCwCwCwCwCPCPCPCuCPCPCVCmCmCmCPCPCmCmCmCmCPCmCmCwCwCwCwCwCw CwCwCwCwCwCwCwCPCmCVCPCPCPCmCmCmCmCPCVCmCmCmCmCoCPCmCmCwCwCwCwCw CwCwCwCwCwCwCwCwCmB1B1B1CPCmCmCmCmCPCmCmCPCPCPCmCPCmCmCmCwCwCwCw CwCwCwCwCwCwCwCwCmCP_A_A_ACoCmCmCVCmCmCPB1B1CPCPCmCmCmCmCwCwCwCw CwCwCwCwCwCw_A_ACmCP_A_A_ACmCmCP_ACmCmCVB1B1B1CVCPCPCVCmCmCmCwCw CwCwCwCwCw_A_A_ACmCP_A_A_ACmCP_A_ACmCmCPB1_AB1B1B1B1_ACPCPCmCmCw CwCwCwCw_A_ACmCmCmCP_A_ACmCmCP_A_ACmCmCP_A_A_A_A_A_A_A_A_ACmCPCw CwCwCwCw_A_ACPCPCVCP_ACmCmCoCP_ACmCmCPCP_A_A_A_A_A_A_A_A_ACmCPCw CwCwCwCw_A_A_A_A_A_A_ACPCPCP_A_ACmCVCP_A_ACwCwCwCwCwCw_ACmCmCPCw CwCwCwCwCwCw_A_A_A_A_A_A_A_A_A_A_A_A_A_A_ACwCwCwCwCwCwCmCmCP_ACw CwCwCwCwCwCwCwCwCw_ACw_A_A_A_ACw_A_ACwCwCwCwCwCwCwCmCmCPCP_ACwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCPCP_A_ACwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw_A_ACwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw } # tile 82 (glass piercer) { CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwB6BICwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCQCwCQBlCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwBnB6CQB6CQBnCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwB1CwB6CwCQA9CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwBMA9CwBhCwB4A9BeCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwBnBnCwBhCwBIBIA9CwCwCwCwCwCwCwCwCwCVB9CwCwCwCwCwCwCPB1CwCw CwCwCwApBMA9CwBICwB4BICwA9CwCwCwCwCwCwCVBnCmCwCwCwCwCwCVBnCmCwCw CwCwCwCwBMCwA9CwBICwB4BICwCwA9CwCwCwCwCVCmAfCwCwCwCwCwCmCmAfCwCw CwCwCwCwCwBMCwApCwBICwCQBI_sCwBIB4CwCwBnCwCwCwCwCwCwCPBnCwCwCwCw CwCwCwCwCwCwCwBAApCwBICwCQCQB4CwCwBAB9B9CwCwCwCwCwCwCVCwCwCwCwCw CwCwCwCwCwCwAiCwBnBECwBICwCwCQBlCQCwBnAfCwCwCwCwCwCwCPCwCwCwCwCw CwCwCwCwCwCwCwBMCwBAAmCw_sB6CwCQB4B4CVB4CwB4CwCwCwCwBnCwCwCwCwCw CwCwCwCwCwCwCwCwBMCwBKBACwA9B4CwCQBACPB6B4CwB4B4CwCwB1CwCwCwCwCw CwCwCwCwCwCwCwCwBMCwApA4ApCw_oBICwBlBnCQA4BAA4CwAfCwB1CwCwCwCwCw CwCwCwCwCwCwCwCwCwBMCwBlBEApCwApA4CwB1B1BAAfAfAPAfBMB1CwCwCwCwCw CwCwCwCwCwCwCwCwCwBMA9CwBlBeAiCwBEBKAfBMB1APCPCPB1BkAfAfCwCwCwCw CwCwCwCwCwCwCwCwCwCwB1A9CwBABKAmBAAfAfAfCPCVB6CVB6B9AfAPCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwB1CwBAAmBKAfAfAPB1BnCVCVCwCVCmBAAfAfCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwA9Cw_jAiAfAfB9CPB1B6CPCVBnCmCVAfAfCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwASCw_bAfAfCPBMCwCPB6CmCwBnCVAfCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwAmCwAfCPCmBMBdCPB9CmBMB1B9CPCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwAfCwAfCmB6B1CwCPBMCPCVCwBnBnCPCPCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwAfAmCwCVB9A6A6B1CwBnCmB1B1CwB1BnCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwAmCPBnB1CwB1B6CVB1B6CPBnB1CwCPCPCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwA3B1B1A6BdB1CVCVCwB9CVCVBnB9BMBdCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwA6B1BnCVA6BkB6CVCVCPCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwBdA6CPCVBMCwB9CVB6BkCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwA6BdBnCPB1BdB1BnCPCwB1CwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwB1BMCwCwA6BdCwBMCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw } # tile 89 (mastodon) { CwCwCwCwCwCwCwB1BkCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwBkCwCwCwCwCw CwCwCwCwCwCwCwB1B1BdCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwBkB1BkCwCwCwCw CwCwCwCwCwCwCwB1BkBkCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwBkBkB1CwCwCw CwCwCwCwCwCwB1B1B1BdCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwBkBkCwCwCw CwCwCwCwCwCwB1B1BkBkCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwBkCwCwCw CwCwCwCwCwCwB1BkBdCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwBkCwCwCw CwCwCwCwCwB1B1B1CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwBkCwCwCw CwCwCwCwB1B9BkBdCwCwCwCwCwCwCwCwCwCwBkB1BkBkBdBdCwCwCwB1BkCwCwCw CwCwCwCwB1BkB1CwCwCwBkBkB1CwCwCwCwBkBkBkBdBkBkBdBdCwBdBkCwCwCwCw CwCwCwCwB9BkBdCwCwB1BkB1BkBkBkBdBkB1B1BdB1BkBdB1BdBdBdCwCwCwCwCw CwCwCwCwB1BkB1CwBkBkBkBkB1BdB1BdBkBdBdBkBdBkBdBkBdBkBdCwCwCwCwCw CwCwCwCwB1BkCwBkB1BkB1BkBkBdBdBkBkBkBkB1BdB1BkBkBdBdBdCwCwCwCwCw CwCwCwCwB1B1CwBkBkBkBkB1_ABdB1BkB1BkB1BkBkBdBdBkBdBdBdBdCwCwCwCw CwCwCwCwB1BkBdB1BkB1Bk_A_ABdBkBkBkBkBkB1BkB1BdBkBkBkBkBdBdCwCwCw CwCwCwCwB1B9BkBkBkBkB1_ABkB1BkB1BkB1BkBdBkBkBdB1BkBkBkBdBdCwCwCw CwCwCwCwCwB1B1BkB1BkBkB1BkBkB1BkBkBdBkB1BkB1BdBdBkB1BdBkBdBdCwCw CwCwCwCwCwB1BkBkBkBdB1BkBdBkBkB1BkB1BkBkBkBkBdBdBdBkBdBdBdBdCwCw CwCwCwCwCwCoBdBkBdBkBkCoCmBkBdBdBdBkB1BkB1BdBkBdB1BkB1BdBkBdCwCw CwCwCwCwCoCoCmCmBdBdBkCoCmBkBdBdBdBdBdBdBdBdBdBdBkBdBdBdBdBdCwCw CwCwCwCoCoCmCmBkB1BdCoCoCmBdBdB1BdB1BdBkBdBdCwCwBdBdB1BdBdBdCwCw CwCwCoCoCmCmCwBdBdBdCoCmCmBkBdBdBkBkBkBdBdBkCwCwBkBdBkBdBkBdCwCw CoCoCoCmCmCwCwB1BkCoCoCmBdBdBdB1BdBdB1BdBdBdCwCwBkBkBkBkBdBdCwCw CmCmCmCoCwCwCwCoCoCmCmBdBdCwBdBdBkBdBkBdBkBdCwCwBkBkBdBdBdBdCwCw CwCwCwCwCwCwCwCmCmCmBdBdCwCwCwBkBkBdBkBdBdBdCwCwBdB1BdBkBkBdCwCw CwCwCwCwCwCwBkB1BkBkBdBdAOABABB1BdBdBdBdBdBdBdABB1BdBkB1BdBdABCw CwCwCwCwCwABBdBdBdBdBdBdABAOABBdBdBkBdBkBdBdBkABBdBdBkBdBdBdAOAB CwCwCwCwABAOBkB1BkBdBkBdABABAOBkB1BkBdBdBdBdABAOBkB1BdBdBdBdABAB CwCwCwAOABABBkBdB1BdBdAOABAOABBdBkBdBkB1BdBdAOABABBkBkBkABAOABAO CwCwCwABABAOABABABABABABABABABB1BdBdBkBdBdAOABABAOABAOABABABABCw CwCwCwCwABABAOABAOABAOABAOABAOABBkB1BkABABABABAOABABABABAOCwCwCw CwCwCwCwCwABABABABAOABABABABABABAOABABAOABAOABABAOABAOABCwCwCwCw CwCwCwCwCwCwCwCwCwCwABAOABAOABAOABABAOABABABAOABABABCwCwCwCwCwCw } # tile 101 (trapper) { CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwA6A6CwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwA6ASASA6CwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwA6ASCwCwASA6CwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwA6CwCwCwCwA6CwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwA6ASCwCwCwCwCwA6Cw CwCwCwCwA6A6CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwA6ASCwCwCwCwCwCwCwCw CwCwA6ASASASA6CwCwCwCwCwCwCwCwCwCwCwCwCwCwA6ASCwCwCwCwCwCwCwCwCw CwA6CwCwCwCwASA6CwCwCwCwCwCwCwCwCwCwCwCwCwA6ASCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwASA6CwCwCwCwCwCwCwCwCwCwBoBoA6ASCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwASA6CwCwCwCwCwCwCwCwCPBoBoBoCPCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwASA6CwCwCwCwCwCwBoBoBNBNBNBoBNBNCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwASA6CwCwCwCwCPBoBoBNBNBNBNBoBoCPCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwA6CwCwCwBoBoBoBNBNBNAqAqBNBNBNBNCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwBoBoBNBNBNAqAqAqAqAqBNCPCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCPBNAqAqAqAqAqAqAqAqCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwAqAqATAqATATAqAqCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwATATATATATATCPCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwATATATATATCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCPATATCPCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwATATCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwASA6CwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwASA6CwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwASA6CwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwASASA6CwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwASASA6CwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwASA6ASCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwASASASA6CwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwASA6CwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw } # tile 105 (pony) { CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwB7B7B7BWBWCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwB7BWBWABBWCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwB7B7B7BWBWBWBWBWCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwB7B7B7CwCwCwCwCwB7BWBWAzAzAzBWBWCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwB7B7B7B7CwCwCwB7B7BWAzAzCwAzBWBWCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwB7B7B7CwCwB7B7BWAzAzCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwB7B7B7B7CwCwCwB7BWBWAzCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwB7B7B7CwCwCwCwCwBWBWBWBWCwCwCwBWBWBWCwCwCwCwCwCwCwCw CwCwCwCwCwCwB7B7B7CwCwCwCwBWBWBWBWBWBWAzAzAzCwBWBWCwCwCwCwCwCwCw CwCwCwCwCwCwCwB7B7CwCwCwBWAzBWBWBWBWBWBWCwCwCwCwCwABCwCwCwCwCwCw CwCwCwCwCwCwCwB7B7CwCwBWBWAzBWBWBWAzAzAzAzBWCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwB7B7CwAzBWBWBWBWBWAzAzCwCwAzBWBWAzCwCwCwCwCwCwCwCw CwCwCw_A_A_A_A_AAzAzAzBWAzBWBWAzAzCwCwCwCwCwCwAzCwCwCwCwCwCwCwCw CwCwCw_A_A_A_A_A_AAzAzBWBWAzAzAzAzCwCwCwCwCwCwBWBWCwCwCwCwCwCwCw CwCwCw_A_A_A_A_A_A_A_ABWBWAzAzAz_ACwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCw_A_A_A_A_A_A_A_AAzBW_A_AAzAzAzCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCw_A_A_A_A_A_A_AAzAz_A_A_AAzAz_ACwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCw_A_A_A_A_A_A_ABWAz_A_A_AAzAz_ACwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCw_A_A_A_A_A_ABWAz_A_A_A_AAz_A_ACwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCw_A_A_A_A_A_AAzBW_A_A_ABW_A_ACwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCw_A_A_A_A_AAzBW_A_A_ABW_A_ACwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCw_A_A_A_AAzBW_A_A_ABW_A_ACwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCw_A_A_AAz_A_A_A_A_A_ACwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCw_A_A_AAz_A_ACwCw_ACwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCw_A_ABW_ACwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCw_A_ACwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw } # tile 106 (horse) { CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwB7B7CwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwB7B7BWCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwB7B7BWBWBWCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwB7B7BWBW_ABWBWCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwB7B7BWBWBWBWBWBWCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwB7B7BWBWBWBWBWBWBWBWCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwB7AzBWBWBWCwCwBWAzBWCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwB7B7AzBWAzAzCwCwCwAzCwCwCwCwCw CwCwCwCwCwCwCwBWBWBWBWAzAzCwCwCwCwB7AzAzBWAzAzCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwB7BWBWBWBWAzAzAzAzAzBWAzAzAzAzBWAzCwCwCwCwCwCwCwCwCw CwCwCwCwCwB7B7BWBWBWAzAzAzAzAzAzAzAzBWBWAzAzAzCwCwCwCwCwCwCwCwCw CwCwCwCwCwB7B7BWBWBWBWAzBWBWAzAzAzAzBWAzAzAzAzCwCwCwCwCwCwCwCwCw CwCwCwCwB7B7BWBWBWBWBWBWBWAzBWAzBWBWAzBWAzAzAzCwCwCwCwCwCwCwCwCw CwCwCwB7B7B7BWBWBWBWAzBWBWBWBWBWAzBWBWBWBWBWCwCwCwCwCwCwCwCwCwCw CwCwCwB7B7CwBWBWBWBWAzBWBWBWBWBWBWBWBWBWBWBWCwCwCwCwCwCwCwCwCwCw CwCwCwB7B7CwBWBWAzAzAzBWBWBWBWAzAzBWBWBWBWBWCwCwCwCwCwCwCwCwCwCw CwCwCwB7B7CwBWBWAzCwCwBWBWBWBWBWBWB7BWBWAzBWCwCwCwCwCwCwCwCwCwCw CwCwCwB7CwCwBWAzAzCwCwAzAzCwCwCwAzB7B7BWAzBWBWCwCwCwCwCwCwCwCwCw CwCwCwCwCwBWAzAzCwCwCwBWBWCwCwCwCwBWB7B7CwAzBWCwCwCwCwCwCwCwCwCw CwCw_A_A_ABWAzCwCwCwCwAzAzCwCwCwCwCwBWBWB7AzBWCwCwCwCwCwCwCwCwCw CwCw_A_A_AAzAz_A_ACwCwAzAzCwCwCwCwCwCwBWBWAzBWCwCwCwCwCwCwCwCwCw CwCwCw_A_AAzAz_A_A_A_AAzCwCwCwCwCwAzAzAzCwAzAzCwCwCwCwCwCwCwCwCw CwCwCw_A_AAz_A_A_A_A_ABW_ACwCwCw_A_AAzCwCwCwAzCwCwCwCwCwCwCwCwCw CwCwCwCw_ABW_A_A_A_A_AAI_ACwCwCwCw_AAzCwCwCwBWCwCwCwCwCwCwCwCwCw CwCwCwCw_AAI_ACwCw_A_A_A_ACwCwCwCwCwCwCwCwCwB7B7CwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwAIB7CwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwAIAICwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw } # tile 107 (warhorse) { CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwB7B7B7CwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwB7B7B7B7B7BWCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwB7B7BWBWBWCwCwCwCwCw CwCwCwCwCwCwB7B7B7CwCwCwCwCwCwCwCwCwCwB7B7B7B7B7BWBWBWCwCwCwCwCw CwCwCwB7B7B7B7B7B7B7CwCwCwCwCwCwCwCwCwCwB7B7B7BWBWBW_ABWCwCwCwCw CwCwCwB7B7B7B7B7BWB7B7CwCwCwCwCwCwCwCwB7B7B7B7BWBWBWBWB7CwCwCwCw CwCwCwCwCwCwCwB7AzB7BWBWCwCwCwCwCwCwCwCwB7B7BWBWAzBWBWB7B7CwCwCw CwCwCwCwCwCwB7CwAzAzAzBWBWCwCwCwCwCwCwB7B7B7AzBWAzAzAzBWB7CwCwCw CwCwCwCwCwCwCwBWAzAzBWBWBWAzAzAzCwCwB7B7B7AzAzBWAzAzAzAzBWB7CwCw CwCwCwCwCwCwCwAzAzBWBWBWBWBWAzAzAzAzB7AzAzAzAzBWBWCwCwAzAzCwCwCw CwCwCwCwCwCwCwAzBWBWBWBWBWBWBWAzAzAzAzAzAzAzBWBWCwCwCwCwCwCwCwCw CwCwCwCwCwCwBWBWBWBWBWBWBWBWBWAzAzAzAzAzBWBWBWBWCwCwCwCwCwCwCwCw CwCwCwCwCwCwBWBWAzAzBWBWBWBWBWBWBWBWBWBWBWBWBWBWCwCwCwCwCwCwCwCw CwCwCwCwCwCwBWBWAzAzBWBWBWBWBWBWBWBWBWBWBWBWBWCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwAzAzAzAzBWBWBWBWBWBWBWBWBWBWBWBWBWCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwAzAzAzBWBWBWBWAzBWBWBWBWBWBWBWBWBWCwCwCwCwCwCwCwCwCw Cw_A_A_A_ACwAzBWCwBWBWBWBWAzAzAzBWBWBWBWBWBWBWBWCwCwCwCwCwCwCwCw CwCw_A_A_A_ABWBWCwCwCwBWBWBWAzAzBWBWBWAzAzBWBWBWCwCwCwCwCwCwCwCw CwCwCw_A_A_ABWBW_A_ACwCwBWBWAzAzBWCwAzAzAzAzBWBWBWCwCwCwCwCwCwCw CwCwCwCw_A_AB7B7_A_A_ACwB7CwCwAzBWCwCwCwCwCwBWBWBWBWCwCwCwCwCwCw CwCwCwCwCw_AB7_A_A_A_AB7B7CwCwAzAzCwCwCwCwCwCwAzAzBWBWCwCwCwCwCw CwCwCwCwCwCwAzCwCw_A_AB7B7CwCwAzAzCwCwCwCwCwCwCwAzAzBWBWCwCwCwCw CwCwCwCwCwCw_ACwCwCwCwCw_ACwCwB7B7CwCwCwCwCwCwCwCwAzBWCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwB7B7CwCwCwCwCwCwCwAzBWCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwB7B7CwCwCwCwCwCwAzAzB7CwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCw_A_A_A_AAzBWCwCwCwCwCw_A_AB7CwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCw_A_AAz_ACwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCw_AAz_ACwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw } # tile 136 (baby silver dragon) { CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwC$C$CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwC$C$CwCwC$C$CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwC$C$C$C$C$CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwC$C$C$CoCmCoCwCwC$C$C$C$C$C$C$CwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwC$C$_A_BC$C$C$C$C$C$C$C$C$C$C$C$C$CwCwCwCwCwCwCwCwCwCw CwCwCwCwC$C$CoCmCoCQCoC$C$CoCmCoCmCoCmC$C$C$C$CwCwCwCwCwCwCwCwCw CwCwCwCwC$C$CmCmCQCoCoCQCoC$CQCoCQCoCQCoCmCoC$C$C$CwCwCwCwCwCwCw CwCwCwCwC$CoCQCwCwCQCQCoC$C$CoCoCoCmC$CoCQCoCmCoC$C$CwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCQCQC$CQCQCoCQC$C$CmCoCoCQCmCmC$C$CwCwCwCwCw CwCwCwCwCwCwCwCwCw_A_AC$C$CoCQCoCoC$CmCmCQCQCQCQCoCmC$CwCwCwCwCw CwCwCwCwCwCwCwCwCw_A_A_AC$CoCQCQCmC$CQCoCQCQCQCQCQCoCQCoCwCwCwCw CwCwCwCwCwCwCwCwCw_A_ACoCQCoCQ_A_BC$CoCmCQ_A_A_ACQC$CoCQCwCwCwCw CwCwCwCwCwCwCwCwCwCw_A_A_A_A_A_ACoCoCQCo_A_A_A_A_AC$CmCoCwCwCwCw CwCwCwCwCwCwCwCwCwCwCw_A_A_A_A_A_A_B_A_A_A_A_AC$C$CoCQ_BCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw_ACoCoCQCo_ACwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw_A_B_A_ACwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw } # tile 146 (silver dragon) { BdBdCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwBdBdBKBdBKBKBKBKCw CwBKBkBKBKCwCwCwCwCwCwCwCwCwC$CwCwCwC$C$BkBKBKBKBKBKBKBKBKBKCwCw CwCwBKBKBKBkBKBKBKBlBKBKBlC$CwCwCwCwCwBKBKBKBKBKBlB4B4B4B4CwCwCw CwCwCwBKBKBKBKBlBlBlBKBlBKBKCwCwCwCwBKBKBkBKBKB4B4B4BlBlCwCwCwCw CwCwCwBKBKB4B4BlBKBlBKA4BlBlCwCwCwCwBKB4BKBKBlBKBKBlBlBlCwCwCwCw CwCwCwB4B4BlBlBKBlBlCoCoCQBlBKCwCwCwBKBKB4BKBKBKBlBKBlBlCwCwCwCw CwCwBlBlBlBlBKBlCmCmB4B4CQCoBACwCwCwBKBlB4BlBlBKBKBKBKBlCwCwCwCw CwCwBlBKBKA4BlCmB4CQCQBlCQBlCQCQCwCwBKBKBKB4BlBlBlBKBKBdCwCwCwCw CwCwBKBlBKBKBlCoCQBlB4B9BlB4CVBlCQCwBlBKBAB4BlBlBlBlBKBKBdCwCwCw CwCwCwBKBlBlCoCQCmB4CmBlBlB4BlB4CQBlCwBlBKBKB4BlBlBlCwCwCwCwCwCw CwCwCwCwCoBlCQCmCmB4CmBKB4BnB4B9BlCQCQBKBKBKCQB4BlCwCwCwCwCwCwCw CwCwCwCwBlCmCQCmCQCmCQBABKBKBlBlBKB9CQBKBlA4BKB4CwCwCwCwCwCwCwCw CwCwCwCwCwCQCmCoCQCQC$CwBKBlB4B4B4BKB4CmCQCQCQBlCwCwCwCwCwCwCwCw CwCwCwCwCwBlC$CQCoCQC$B4CmB4BABlBlBKBlB4BlCoCmCQCQCwCwCwCwCwCwCw CwCwCwCwCwCwCQC$B4CoC$C$BKBKB4CoB4B4BlBKB4BlB4BlCoCQCVCwCwCwCwCw CwCwCwCwCwCwCVC$C$CmC$C$BKB4BAB4BlBABlB4BKB4BKB4BlCQCmCQCwCwCwCw CwCwCwCwCwCwBKC$C$C$CoC$CoBKBKCoB4B4BKBlCQBKB4BKB4BlB4B4CwCwCwCw CwCwCwCwCwB4BKCQCoCmC$CoCoBKB4B4BlBlBKBKB4BlBlBKCwCwBlCVCQCwCwCw CwCwCwCwB4BlBKA3CQCQCoC$CQBKB4CoB4B4B4BABKB4BKCwCwC$B4CQCPCQCwCw CwCwBlB4BlBlA3A3C$BlCQCmC$B4BAB4BlBlBKBKBlB4CQ_A_A_A_AC$CQC$CwCw CwBKB4BKBlA3A3CwCwCwBlCQCmB4BlCoB4B6B4BKB4BKB4Bl_A_A_AC$_A_AC$Cw CwC$CwBKA3C$CwCwCwCwCwB4CwB4BKBABlBlBKBKBKCQB4BKCQB4_A_ABlB4CwCw C$CwCwC$CwC$CwCwCwCwCwCwBlB4BlBlCoB4B4BAB4CVBlCQBKBKB4BlB4_A_ACw CwCwCwC$CwCwCwCwCwCwB4BlCQB4BKBKA4BABKBKBKBKCQB4B4BKBKB4_A_A_ACw CwCwCwCwCwCwCwCwCwCwBlCQCVBKBlA3A3B4BlBlBlA3BKCQBlCQ_A_A_A_ACwCw CwCwCwCwCwCwCwCwCwBlCVB4B4BKAmA3_A_ABKBKBlBKB4CQCVB4_A_A_ACwCwCw CwCwCwCwCwCwCwCwCwB9CQBlB4BKA3_A_A_A_A_A_AA3BlBlB4CQBK_A_ACwCwCw CwCwCwCwCwCwCwCwCwCQB4B4BKAmA3_A_A_A_A_A_A_BBKBKCQCQBK_A_A_ACwCw CwCwCwCwCwCwCwCwBKB9B4BKBlA3_B_A_A_A_A_A_A_AAmB4BKBKBlBK_A_A_ACw CwCwCwCwCwCwBKBlBKBlB4BKA3_A_A_A_A_ACwCw_A_A_1BKB4BKCQBlBK_A_ACw CwCwCwCwCwB4Bl_AB4BK_ABKAmB4_A_ACwCwCw_A_A_AB4BK_AA3B4_AA3B4_ACw CwCwCwCwCw_A_A_A_A_A_A_1_A_1_ACwCwCwCwCwCw_A_A_A_A_B_A_A_A_ACwCw } # tile 160 (lichen) { CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCw_q_q_qCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCw_qCFCF_qCFCF_hCF_qCwCwCFCF_qCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCFCFBS_hCFA0BZ_h_hCM_qCFBSBSCF_qCwCwCwCwCwCwCwCwCw CwCwCwCwCw_qCFBSA0_h_hCF_h_h_h_hCMCFBSA0_h_hCM_qCwCwCwCwCwCwCwCw CwCwCwCwCFCMCFBZ_h_c_cCF_c_c_c_qCFCF_q_c_c_h_h_qCwCwCwCwCwCwCwCw CwCwCwCFBSA0_hCMCFCFCFCMCF_c_cCFBSBiCFCF_q_c_h_q_q_qCwCwCwCwCwCw CwCwCwCFBZ_h_c_cCFBSBSBaA0CMCFBSA0BSBSBZ_qCFCF_q_h_q_qCwCwCwCwCw CwCwCwCMA0_hCFCMCFBSA0BZ_c_cCFBZA0BZA0_cCF_c_cCF_h_h_qCwCwCwCwCw CwCwCw_q_lCF_c_cCFBa_c_c_c_cCM_c_h_c_c_cCF_c_c_lCM_h_qCwCwCwCwCw CwCwCw_qCFBS_c_cCM_c_c_c_cCFCM_q_c_c_c_q_q_c_c_h_h_q_qCwCwCwCwCw CwCwCw_qCF_h_h_cCF_q_q_qCFBSBaCFCM_c_qCFCF_c_h_h_h_qCwCwCwCwCwCw CwCwCwCw_qCM_hCF_cCF_cCF_cA0BZA0_cCMCFBSBaCM_h_h_qCwCwCwCwCwCwCw CwCwCw_A_q_qCFBS_l_c_cCM_c_c_c_c_c_cCF_c_c_h_q_q_q_ACwCwCwCwCwCw CwCw_A_A_A_A_qCF_h_h_h_h_q_l_h_h_lCF_h_h_h_h_q_q_A_A_ACwCwCwCwCw CwCw_A_A_A_A_A_ACM_h_h_h_q_q_q_q_qCF_h_h_h_q_q_q_A_A_ACwCwCwCwCw CwCw_A_A_A_A_A_A_q_q_q_q_q_A_A_A_ACMCM_q_q_q_A_A_A_A_ACwCwCwCwCw CwCwCw_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_L_A_A_A_ACwCwCwCwCwCw CwCwCwCwCw_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_ACwCwCwCwCwCwCw CwCwCwCwCwCwCwCw_A_A_A_A_A_A_A_A_A_A_A_A_ACwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw } # tile 189 (arch-lich) { CwCwCwCwCwCwCwCwCwCwCwCwCwCMCwCwBaCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCMCwCMCMBaCwBaCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCMCMCMCMCMCMBaBaBaCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCMBoBoBoBNAvAqAvBaCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwBoBoCVCoCmCoCPAqAqCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwBoCVCuCuCmCuCuCVAqCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwBoCPCuCuCmCuCuCPAqCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwBoCVCmCmAOCmCmCVAqCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwBoAeA2CmCmCmBDAeAqCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwBoBoBoCwCwCwCwCwBoAeBDA2BDA2A2AeAqCwCwAqAqAqCwCwCwCwCwCwCwCwCw CwCMBoBoBoBoCwCwCwBoBoAeCPCPCPAlAqAqAqAqAqAqBaCwCwCwCwCwCwCwCwCw CwCwCMBoBoBoBoBoBoBoBoBoBoBoAqAqAvBoAqAqAvBaCwCwCwCwCwCwCwCwCwCw CwCwCwCMBoCBBoBoBoCBBaBoBoCBAvCMCMCBAvAqBaBNBoBoCwCwCwCwCwCwCwCw CwCwCwAvCMBaBaByBaBaArBrBoBoAqArAqCMBaBZAqAvBoBaCwCwCwCwCwCwCwCw CwCwCMAqAvArAvAqAqAvBaCBBoBoAvBNCMAvAqAvBNBoBaCwCwCwCwCBCBCwCwCw CwCwCwCMCMBoBoBoBoBaBoBoBoBoAqAqCMCBBoBoBaBaAqCwCwCwCBCuCuCBCwCw CwCwCwCwBoBaBaBaBaCBBoBoBoBoArAvAqCMCMBZBrBoAqAqCwCwCBCuCuCBCwCw CwCwCwBoBoBNAvCwCwBoBoBoBrBoBNAqAqCwCwCwCBBoAvAqCwCwAlCBCBCwCwCw CwCwCwBoBoAvAqCwCwCMCMCBBoBoAvBoBaCwCwCwBoBoBoAqAqCwAlAlCwCwCwCw CwCwCwBoBoAqAqCwCwBoBrBoCMCMBZBaAvCwCwCwCwBoCBAqAqAlAlCwCwCwCwCw CwCwBoBoAvAqCwCwCwBoBoBoBoCBBrAqAqAqCwCwCwBoBoAvAqAlAlCwCwCwCwCw CwCwCoBoAqCwCwCwCwBoBoBoArBoBoBNAqAqCwCwCwBoBoAqCmAlCwCwCwCwCwCw CwCwCmCoCmCwCwCwCwBoAvCBAvBoBoArAvAqCwCwCwBoCoCoAlAlCwCwCwCwCwCw CwCwCmCwCmCwCwCwBoBoArBoAqBoBoAqAqAqCwCwCwCwCmAlCmCwCwCwCwCwCwCw CwCwCwCwCmCwCwCwBoAvAqBoAvCBBoAvAqAqAqCwCwCwCmAlCmCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwBoAqCBBoArBoBoAqBNAqAvCwCwCwAlAlCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwBoAvBoBoAqBoAvBoAqAqAqCwCwCwAlAlCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwAqBoBoAqAvBoBNBoArAvAq_A_AAlAl_A_ACwCwCwCwCwCwCw CwCwCw_A_A_L_AAqAqCBBoAqCBBoAqBoAqBNAq_2_AAlAl_A_ACwCwCwCwCwCwCw CwCwCw_L_0_A_0AvBoBoBoArBoBoAqBoAvAqAq_AAlAl_A_ACwCwCwCwCwCwCwCw CwCwCwCw_A_A_A_0_MBoAvBoBoBoAr_1_0_B_M_AAlAlCwCwCwCwCwCwCwCwCwCw CwCwCwCw_A_z_M_A_A_1_B_z_M_1_1_A_A_z_ACwCwCwCwCwCwCwCwCwCwCwCwCw } # tile 212 (green slime) { CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw Cw_q_q_t_q_qCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw Cw_q_q_q_q_q_q_t_q_qCwCwCw_t_t_t_q_tCwCwCwCwCwCw_q_q_q_q_q_XCwCw Cw_X_q_q_q_q_q_q_q_t_q_t_t_t_t_q_t_t_q_q_q_q_q_q_q_q_q_q_q_X_XCw Cw_X_X_X_T_q_q_q_q_q_t_t_t_q_t_t_q_t_q_q_q_q_t_q_q_q_q_X_T_XCwCw CwCwCw_X_X_X_T_q_q_q_t_t_t_t_q_t_t_q_t_q_t_q_q_q_q_q_T_X_XCwCwCw CwCwCwCwCw_T_X_X_q_q_t_t_t_t_q_q_q_t_q_t_q_q_q_q_X_T_X_XCwCwCwCw CwCwCwCwCwCwCw_X_q_t_t_t_t_q_t_q_t_q_q_t_q_t_q_X_X_X_XCwCwCwCwCw CwCwCwCwCwCw_X_X_t_t_t_t_t_t_q_q_q_q_q_q_t_q_q_T_X_T_XCwCwCwCwCw CwCwCwCwCwCw_X_q_t_t_t_t_q_q_q_q_q_q_q_q_t_q_q_X_X_X_XCwCwCwCwCw CwCwCwCwCwCw_q_t_t_t_q_q_q_q_q_q_q_q_q_q_q_t_q_q_X_T_XCwCwCwCwCw CwCwCwCwCw_q_t_t_q_q_q_q_q_q_q_q_q_q_q_q_q_q_t_q_q_X_X_XCwCwCwCw CwCwCwCw_q_q_q_q_q_q_q_q_q_m_q_m_q_q_q_q_q_q_q_t_q_q_T_XCwCwCwCw CwCwCw_q_q_q_q_q_q_q_T_X_T_X_X_X_X_T_q_m_q_q_m_q_t_q_q_X_XCwCwCw Cw_q_q_q_q_q_q_q_X_X_X_X_X_X_X_X_T_X_X_X_T_q_q_q_q_q_t_X_XCwCwCw _q_q_q_q_q_q_T_X_T_X_T_X_X_T_X_X_X_X_T_X_X_T_X_q_q_q_q_q_q_XCwCw _q_q_X_T_X_T_X_X_XCwCwCwCwCwCwCwCwCwCwCw_X_X_X_T_X_m_q_q_q_q_XCw _X_T_XCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw_X_X_X_T_q_q_q_X CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw_X_X_X_XCw } # tile 215 (disenchanter) { CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCmCmCVCmCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCVCmCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwBDBDBDBDBDBDCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCmCmCwCwA2A2BDBDCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCmCVCmCVCwCwCwA2A2BDBDCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwBDBDAlAlCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwBDA2BDAlCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwBdA2BDAlCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCPCVCPCVCwCwCwCwCwCwCwCwCwBDA2A2Cw CwCwCwCwCwCwCwCwCwCwCwCwCVCPCVCwCwCwCwCwCwCwCwCwCwCwCwCwBDBDBDAl CwCwCwCwCwCwCwCwCwCwCPCVCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwBDA2Al CwCwCwCwCwCwCwCwCVCPCwCwCwCwBdBdBdBdAlBdBdBdCwCwCwCwCwCwCwBDBDAl CwCwCwCwCwCwCwCPCwCwCwCwAlBdBDBDBDAlBdBdBDBDAlAlCwCwCwCwCwBDA2Al CwCwCwCwCwCwCVCwCwCwBdBdAlBDBDBDBDAlBDBDBDBDAlBDBdCwCwCwCwBDBDAl CwCwCwCwCwCPCwCwBdBdBdA2AlBDBDBDBDAeBDBDBDA2AlABA2BdCwCwCwBDA2Al CwCwCwCwCVCwCwBdBdAlAlAeAlAeBDBDA2AeAlA2A2AOABBDAOABBDCwBDA2BDAl CwCwCwCwCPCwAeBdBDBDAeBDBDBDAeAOABBDBDAOABCVCPCVCPAOAeBDA2A2AlA2 CwCwCwCwBdBdBDAeBDA2AeBDA2A2BDAOBDCPCVCPCPAOAlAlAOA2AeBDA2A2AlCw CwCwCwBdBDA2A2A2ABBDAlBDA2A2ABCPCVAlAlA2ABAlAOABBDAeBDBDBdBdAlCw CwCwBdB9ABCPA2BDAlAOABAOA2CPCVABAOAlAOABA2AOBDA2BDBDBDBDBdBDA2Cw CwCPCPA2AlAlAlAlAeAOA2BDCPBDA2BdA2AOBDA2A2BDBDBDBDBDA2BdBdA2AOCw CVB9CPAlAeAlAeAlAeAOAlCPAOBDBdBDBDABAlBDBDBDBDBDA2A2BdBDBDAOABAB B9AOB1AlAlAeCPAeAeCPCVBDBDBdBDBDBDAeBDBDBDA2A2BDBdBdBDAOABABAOAB AOB1ABAOABABAOCPCVABAOABBdBDBDABAOABAOA2A2AOABBdBDBDABAOABAOABCw ABAOABAOABAOABAOABAOABBdBDABAOABAOABAOABAOBdBdBDABAOABABAOABCwCw AOABAOABAOABAOABAOABBdBDABAOABAOABABAOABBdBDBDABABAOABAOCwCwCwCw CwCwABAOABABBDBdBdBdBDABAOABABAOABBdBdBdBDABAOABAOABCwCwCwCwCwCw CwCwCwCwABAOBDABBDBDAOABCwCwCwCwBDBDABABABAOABCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw } # tile 219 (pit viper) { CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwAlA2A2A2AlA2CwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwA2A2A2A2A2AlA2A2A2A2AlCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwBDA2AlA2A2BdCoCPCoCPCoA2AlAlCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwBDB9_AAlAlA2CVCwCwCwCwCPA2A2AlCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwBdA2_A_AAlCPCoCwCwCwCwCwCoBDA2AlCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwAlB9CPCVCwCwCwCwCwCwCPBdA2AlAlCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwAlCwCPCwCwCwCwCwCwCwCoBDBdAlAlCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwAlCwAlCwCwCwCwCwCwCwB9A2AlA2AlCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCoA2A2A2AlCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwB9A2A2AeAeCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCoA2A2AeCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwB9A2A2AeA2A2AlA2A2A2CwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCoA2A2AlA2A2A2A2A2A2AlA2A2Cw CwCwCwCwCwA2A2A2BDA2CwCwCwCwCwCwA2B9BDBDAlAeAeAeAeAeAeAeA2A2BDA2 CwA2CwCwBDA2BDA2A2A2BDCwCwCwCwBDA2CoBdA2AlAe_A_A_A_A_A_AAeA2A2A2 CwAlA2A2A2Al_2_A_1AlA2A2CwCwA2A2A2B9BDA2Al_ACwCwCwCwCwCwA2BDA2A2 Cw_A_A_2_A_ACwCwCw_AAlAlA2BDA2A2B9CmBdA2BDA2A2A2BDA2A2A2A2A2BD_A CwCwCwCwCwCwCwCwCwCw_AAlAlAlA2B9_A_AB9A2BdBkBDA2A2A2BdA2A2Bd_A_A CwCwCwCwCwCwCwCwCwCwCw_A_A_2_A_ACwCw_ACmB9A2A2BDA2A2A2_A_A_0_LCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw_A_A_A_A_A_A_2_A_LCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw } # tile 236 (monkey) { CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwC2CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwC2C2CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCGC2CwCwCwCwCwCw CwCwCwCwCwCwCwCnC2C0CwCwCwCwCwCwCwCwCwCwCwCwCwCFC0C2C2CwCwCwCwCw CwCwCwCwCwCwCwBsBsBsCwCwCwCwCwCwCwCwCwCwCwCwCwCFBsC2CwCwCwCwCwCw CwCwCwCwCwCwCwBsBsBrCwCwCwCwCwCwCwCwCwCwCwCwCwCFBsBsCwCwCwCwCwCw CwCwCwCwCwCwCwBsBsBsBSCwCwCwCwCwCwCwCwCwCwCwCwCFBsBRCwCwCwCwCwCw CwCwCwCwCwCwCwBsBsBsBSCwCwCwCwCwCwBsBsBsCwCwCFBsBsBSCwCwCwCwCwCw CwCwCwCwCwCwCwCzBsBsBsBSCwCwCwCwCFBsBsCUCUCwCFBsBsBSCwCwCwCwCwCw CwCwCwCwCwCwCwCwCzBsBsBsBSCwBSCFBsBsCU_zCU_ACUBsBsBSCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCzBsBsBsBSCFCFBsBsBZCUCUCU_ABsBsBSCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwBsBsBsBsCFCFBsBsBZCUCU_AC2BsBsBSCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCFBSBSBsBsBsBsBsBZBZC2C2BZBsBSCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCFCFBSBsBsBsBsBsBSBZBZBZBZBSBSCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwBsCFBsBsBsBsBsBsBZBZBZBSCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwBXCFBsBsBsBsBSBSBSBSBSCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwBsAwBsBsBsBsBiBSBSBSBSAxBsBsCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwBsBsBsAqBsBsBSBSBSBSBSBSBrBsBsCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCFBrBsBsAwBsBSBSBSBSBSAwBsBsBsCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCFBrBsAwBsBSBSBSBSBSAwBsBsBsCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCFBsBsAwBsBSBSBSAwBSBsBsCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwBsBsBsCrCwCwCwCLCrC6C6CwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwC2C2C2CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw } # tile 240 (carnivorous ape) { CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwBhCwBhCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwBhB6BhCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwA9B6BhCwCwCw CwCwCwBhB6BhB6BhBICwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw_sBIB6BIBhCwCw CwCwCw_oBhB6BhA9CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw_sB5BhBhBhCwCw CwCwCwBL_o_o_o_jCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw_s_oBhB6CwCwCw CwCwCwCw_j_o_o_jCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw_s_o_o_oCwCwCw CwCwCwCw_o_o_f_jCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw_s_f_o_jCwCwCw CwCwCwCw_f_o_o_o_jCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw_s_o_o_jCwCwCw CwCwCwCw_o_o_j_o_bCwCwCwCwCwCwCwCw_o_o_o_oCwCwCw_s_o_f_o_jCwCwCw CwCwCwCw_v_o_f_o_o_jCwCwCwCwCwCw_s_o_oBEA9A9CwCw_s_j_o_o_jCwCwCw CwCwCwCwCw_v_o_o_o_b_jCwCwCwCw_s_o_fA9_BA9_BA9Cw_s_f_o_o_aCwCwCw CwCwCwCwCw_p_o_f_o_o_j_jCw_j_s_f_o_oA9BEA9A9_MBEA9A9_o_o_jCwCwCw CwCwCwCwCwCw_y_o_j_o_f_j_j_s_o_o_o_f_jA9_pBEA9A9_B_B_o_f_jCwCwCw CwCwCwCwCwCwCw_y_f_o_o_o_f_s_s_f_o_o_bAfA9A9_B_BBhB6_o_o_jCwCwCw CwCwCwCwCwCwCw_v_s_o_o_o_o_o_s_o_o_jAm_aA9BhBhBhCS_o_o_b_jCwCwCw CwCwCwCwCwCwCwCw_s_j_bAi_o_f_o_f_o_o_bAiAfBhB6BhAf_o_j_jCwCwCwCw CwCwCwCwCwCwCwCw_s_o_j_o_f_o_oAi_o_o_jAf_bASAi_aAS_b_jCwCwCwCwCw CwCwCwCwCwCwCwCwCw_f_s_j_o_o_o_o_o_f_o_jAiAf_bAf_jCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCw_s_b_o_j_f_o_o_o_j_b_j_j_j_jCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwBD_s_o_o_o_o_o_o_b_j_j_j_j_j_jCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCw_o_aAS_f_o_f_o_j_j_j_b_j_b_j_jAS_o_oCwCwCwCwCw CwCwCwCwCwCwCwCw_o_o_o_eAR_o_o_o_j_bAS_j_j_j_j_j_o_f_o_oCwCwCwCw CwCwCwCwCwCwCwCw_o_b_o_o_a_o_o_fAi_j_j_j_b_jAS_e_o_o_o_jCwCwCwCw CwCwCwCwCwCwCwCw_s_o_j_o_o_W_o_o_j_j_b_j_j_j_e_f_o_j_oCwCwCwCwCw CwCwCwCwCwCwCwCwCw_s_o_o_oAS_o_f_j_j_j_j_j_b_e_o_o_f_oCwCwCwCwCw CwCwCwCwCwCwCwCwCwCw_s_j_o_f_e_o_o_j_j_b_jAS_j_o_o_oCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwAf_s_o_o_o_W_oAE_j_j_e_j_f_sCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCw_o_j_oBhBICwCwCwCwBEA9BIB6CSCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwBhB6BhCSA9CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwBICwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw } # tile 255 (gold golem) { CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwC7CtCtC7C3CwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCtC3C7C3C7C3C7CtCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwC7C3C3C7C7C3C3C3CwCwCwCwC3C7C3CwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwC3C7C$C3C3C7C$C3CwCwCwCwC7C3C3CwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwC3C7C7C3C3C7C7C3CwCwCwCwC7C7CtC7CtCwCwCw_A CwCwCwCwCwCwCwCwCwCwCwC3C3C3C7C7C3C3C3CwCwCwCwC3C3C7C3C3CwCwCw_A CwCwCwCwCwCwCwCwCwCwCwC3C7C3C3C3C7C3CtCwCw_A_AC7C7CtC7C7CwCw_A_A CwCwCwCwCwCwC7C7CtCwCwC3C7C7C7CtC3C7C3Cw_A_A_AC3C3C3C3C3CwCw_A_A CwCwCwCwCwC3C3C3C3C7C3C7CtC3CjC3CjC7CtC3C7C3C7C3C7C3C7C3CwCw_A_A CwCwCwCwCwCtC3C3C7C7CtC7C3C3C7C7C7CtC7CtC7CtC3C3C7C7C7CtCw_A_A_A CwCwCwCtC7C7CtC9C3C7C3CtC7C7C7CtC3C3C7C3C7C3C7C7C3C3C7C3_A_A_A_A CwCwCwC3C3C7C7CtC3C3C3C7C7CtC3C3C9C3C3C3CjC3C3C3C7C7C9C3_A_A_A_A CwCwCwC7C7C3C7C3C3C7C3C3C3C3C7C7CtC3C3C7C3C7C7CtC3C3C3C7_A_A_A_A CwCwCwC3C3C3C7CtC7CtC9C3C7C3C3C7C3C9C7C7CtC3C3C7C3C7C3C3_A_A_A_A CwCwC3C7C3C7C7C9C3C7C7CtC7C3C7C7CtC7C3C7C3C7CtC7CjC3C7C3_A_A_ACw CwCwC3C3C3C3C7C3C3C3C7C3C9C7C3C3C7C3C3C9C7C7C9C3C7C9_A_A_A_ACwCw CwCwC7C7CtC3C7C7CtC7C7CtC3C3C7CtC7C7CtCtC3C7C3C3C7C3_A_A_A_ACw_A CwCwCtC3CjC7CwC3CjC3C3C7C7C3C7C3CtC3C7C3C7C3C7CtC9C7_A_A_ACwCw_A CwCwC3C7C3C3CwC7CtC7C3C3C3C7C3C3C7C3C3C9C7C3C7C3C3C3_A_AC7C7CtCw CwCwC7C9C7C7CwC3C7C3C7C3C7C7CtCwC7CtC7C7CtC3C7C7_L_A_A_AC3C3C3Cw CwCwC7CtC3C3CwC7CtC3C7C7C3C3C3CwC7C3C3C3C3CtC3C3_A_A_A_A_LCwCwCw CwCwC3C7C7C7CwC7CtC9C3C3C3C7Cw_AC3C7C3C7C3C7C3C7_A_A_A_A_ACwCwCw CwCwC7C3C3C3CwC3C7C3C7C7C7C3_A_ACtC9C3C7C7CtC7Ct_A_A_A_A_ACwCwCw CwCwCwC7C7CtCwC7C7CtC7C7CtC9_A_AC3C7CtC3C3C7C3C3_L_A_AC7C7CtCwCw CwCwCwC7CtC3CwC3C3C3C3C3C3C7_A_LC3C3C7C7C9C3C7C7Ct_A_AC3C7C3CwCw CwCwCwCwCwCwCwC7CtC3C7C7C3C3_A_ACjC7C7CtC3C7C3C3CjCw_A_A_ACwCwCw CwCwCwCwCwC7C7CtC7C9C3C3C7C7Ct_LC3C7C9C7C7C9C3C7C7Ct_A_A_ACw_A_A CwCwC7C7CtC3C3CjC3C7C7CtC3C3C7_AC3CjC3C3C3C7C3C3C3C7C7Ct_A_ACw_A CwCwC3C3C3C9C7C7CtC3C3C7C7C9CjC7CtC7C3C7C7CtC3C7C7C3C7C3Ct_ACwCw CwC7C7CtC7C3C3C3C7C7C9C3C3C7C3C3C3C7C7CtC3C7C7C9C3C3C7C7C9C7CtCw CwC3C3C3_A_ACwCwC3C3C3_LCwC3C3C7CwC3CjC3CwC3C7C3CwCwC3C3C3C7C3_A } # tile 261 (glass golem) { CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwBI_yCSB6BICwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwBI_yBI_yC$CoBhCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCw_yCQCQBIBI_yBhC$BICwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCQCQCQBhBICQCQBhBhCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwBeCQ_yCSB4CQCQ_yC$CwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwBIBIBICSB4CQ_yBIBICwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwBIBI_yBhBIBI_yCwCwCwCwCwCwCw_A_A_A_ACwCw CwCwCwCwCwCwCwCwCwCwCwCwCwBIBICSBIBICwCwCwCwCwCwCw_A_A_A_A_A_ACw CwCwCwCwCwCwCwCwBhCSBhCwCwBI_yCoBICwCwBIBhC$CwCwCw_A_A_A_A_A_ACw CwCwCwCwCwCwBIBhBhCoBI_yBI_yBIB6CS_yBI_yC$C$BhCwCw_A_A_A_A_A_ACw CwCwCwCwCwBI_yBI_yBIC$BhCSCoBIBIBhB6CSBhBI_yC$BI_B_A_A_A_A_A_ACw CwCwCwCwCwBh_yBIBIBIBIBhCSC$BhBIBICSC$CSCwBI_yBI_A_A_A_A_A_A_ACw CwCwCwCwBIBIBIBICwCwBIBIBICSC$_yBIBhCSC$_A_BBI_yBh_A_A_A_A_ACwCw CwCwCwCw_yBICwCwCwCwCwBIBIBhBIBhBIBIBh_A_A_A_MBIBh_A_A_ACwCwCwCw CwCwCwCwBIBICwCwCwCwCwCwCwBI_yBI_yCwCw_A_A_A_A_BCS_A_A_ACwCwCwCw CwCwCw_yBICwCwCwCwCwCwCwCwBIBIBhB6BhCw_A_A_A_A_BBICS_A_A_A_ACwCw CwCwCwBIBICwCwCwCwCwCwCwBh_y_yBIBhC$BhCw_A_A_A_A_AC$_A_A_A_ACwCw CwCwCwBhCwCwCwCwCwCwCwCw_yBIBhBIBIBhCoBh_A_A_A_A_A_A_A_A_A_ACwCw CwCwCwC$CwCwCwCwCwCwCwBIBIBhBIBI_yBhC$BI_B_A_A_A_A_A_ACwCw_ACwCw CwCwCwCwCwCwCwCwCwCwCwBI_yCoBhBIBIBICoBI_A_A_A_ACwCwCwCwCw_A_ACw CwCwCwCwCwCwCwCwCwCwBI_yC$BhBh_BBI_yBh_y_z_A_A_ACwCwCwCwCwCw_ACw CwCwCwCwCwCwCwCwCwCwBIBhBhBh_A_BBIBIBIBI_A_A_A_A_ACwCwCwCwCw_ACw CwCwCwCwCwCwCwCwCwCw_yBIBI_B_A_A_BBI_yBICw_A_A_A_ACwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwBIBIBh_B_A_A_ACwBIBh_yCwCw_A_A_ACwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwBIBhBI_B_A_ACwCwCwBIBI_yCw_A_A_ACwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCw_yBhBh_A_A_ACwCwCwBIBIBhBI_A_A_ACwCwCwCwCwCwCw CwCwCwCwCwCwCwCwBIBIBh_A_A_A_ACwCwCwCwBI_yCSC$_A_ACwCwCwCwCwCwCw CwCwCwCwCwCwCwCwBI_yC$_A_A_ACwCwCwCwCw_yBIBhBh_A_ACwCwCwCwCwCwCw CwCwCwCwCwCwCwBhBhBI_y_4_ACwCwCwCwCwBIBhBI_y_z_ACwCwCwCwCwCwCwCw CwCwCwCwCwCwBhBI_yBI_z_A_ACwCwCwCw_yBIBh_y_z_ACwCwCwCwCwCwCwCwCw } # tile 279 (aligned priest) { CwCwCwCwCwCwCwCwCwCwCwCwCwCBCbCBCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCBCbCbCrCbCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwBNCBCbCBCrCBBNCwCwCwCwCwCwCwCw_n_iCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCBCbCrCrCLB7BNCwCwCwCwCwCwCw_i_r_i_iCwCwCw CwCwCwCwCwCwCwCwCwCwCwBNCBCBCBCLCBBNCwCwCwCwCwCwCw_r_i_n_iCwCwCw CwCwCwCwCwCwCwCwCwCwCwBNCBCbCBCLBNCwCwCwCwCwCwCwCw_n_n_i_nCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwBNCbCBBNBNCwCwCwCwCwCwCwCwCw_n_rCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwBNC2_AC2_ACwCwCwCwCwCwCwCwCrCLCLB7CwCwCw CwCwCwCwCBCBCwCwCwCwCwCwCTCnC2C2C2CwCwCwCwCwCuCuCwCwCLB7CwCwCwCw CwCwCnCnCnCuCuCuCwCwCwCwCTCnC2C2CnCwCwCwCuCuCuCuCuCwCLCnCTCwCwCw CwCwCnCnCnCTB3CuCuCuCr_Y_dCTCnCn_iCtCuCuCuCuCuCuCYCnCLCTB3CwCwCw CwCwCwAqCTCTB3CYCYCuCuCt_Y_d_d_d_d_YCtCuCuCYCYCYCYCTCLB7Cw_A_A_A CwCwCwAqAqAqAqCBCBCYCYCs_d_Y_YCL_d_YCtCYCYCYCYCBCB_ACLB7Cw_A_A_A CwCwCwAqAqAqAqBoCBCBCBCBCs_d_dCr_d_d_dCrCBCBCBCBBo_ACLB7_A_A_A_A CwCwCwAqAqAqBoBoBoBoCBCBCr_Y_YCr_Y_Y_dCrBoBoBoBoBo_ACLB7_A_A_A_A CwCwCwAqAqAqBoBoBoBoBoBoCr_d_YCL_d_d_YCrBNBNBoBoBN_ACLB7_A_A_A_A CwCwCwCwAqAqBoBoBNBNBoBoCr_d_YCr_Y_d_YCr_ABNBNBNBN_ACLB7_A_A_A_A CwCwCwCwAqAqBoBNBNCwBNBoCr_d_YCr_d_Y_YCr_A_ABNBNBN_ACLB7_A_A_A_A CwCwCwCwAqAqBNBNCwCw_IBNCr_Y_YCL_Y_Y_YCr_A_A_ABN_A_ACLB7_A_A_A_A CwCwCwCwCwBNBNCwCwCw_I_GCr_Y_YCL_Y_Y_dCr_A_A_ABN_A_ACLB7_A_A_ACw CwCwCwCwCwBNCwCwCwCwCu_GCr_Y_Y_dCL_Y_dCr_A_A_A_A_A_ACLB7Cw_A_ACw CwCwCwCwCwCwCwCwCwCwCBCuCr_d_Y_dCL_Y_YCr_A_A_A_A_A_ACLB7_A_A_ACw CwCwCwCwCwCwCwCwCwCwCBCBCr_d_Y_YCL_d_YCr_A_A_A_A_ACwCLB7_A_ACwCw CwCwCwCwCwCwCwCwCwCuCuCBCr_Y_YCL_d_Y_YCr_A_A_A_ACwCwCLB7_A_ACwCw CwCwCwCwCwCwCwCwCwCuCuCBCr_d_dCL_Y_Y_YCL_A_A_A_ACwCwCLB7_A_ACwCw CwCwCwCwCwCwCwCwCBCuCBCBCL_Y_YCL_Y_YCLBo_A_A_ACwCwCwCLB7_ACwCwCw CwCwCwCwCwCwCwCBCuCuCBCBCL_Y_Y_d_Y_dCLBoBN_A_ACwCwCwCLB7_ACwCwCw CwCwCwCwCwCwCuCBCuCBCBBoBoCL_d_Y_d_YCLBoBN_A_A_ACwCwCLB7_ACwCwCw CwCwCwCwCwCw_ACuCBBoCBBoBoB7_Y_d_YCLBNBoBN_A_A_ACwCw_A_ACwCwCwCw CwCwCwCwCwCw_A_ACBBoCBBoCBBoB7B7B7BoBNBo_A_A_ACwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCw_A_A_A_ABoCB_A_A_A_ABoBN_A_A_ACwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCw_A_A_A_A_A_A_A_A_A_A_A_ACwCwCwCwCwCwCwCwCwCwCw } # tile 280 (high priest) { CwCwCwCwCwCwCwCwCwCwCwCwCwAtCDBCCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwAtBQCDCeCDCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwAWAtCaBCCeAtAWCwCwCwCwCwCwCwCwC$CmCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwBCCDCeCeBuBuAWCwCwCwCwCwCwCwCVC$CmCVCwCwCw CwCwCwCwCwCwCwCwCwCwCwAWAtAtAtCvAtAWCwCwCwCwCwCwCwC$CmC$CVCwCwCw CwCwCwCwCwCwCwCwCwCwCwAWAtCaAtCHAWCwCwCwCwCwCwCwCwC$C$CVC$CwCwCw CwCwCwCwCwCwCwCwCwCwCwCwAWCDBCAWAWCwCwCwCwCwCwCwCwCwC$C$CwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwAWC2_LC2_ACwCwCwCwCwCwCwCwCeCHBuBuCwCwCw CwCwCwCwAtAtCwCwCwCwCwCwCTCnC2C2C2CwCwCwCwCwBQBQCwCwCZBuCwCwCwCw CwCwCnCnCnBQBQBQCwCwCwCwCTCnC2C2CnCwCwCwBQBQBQBQBQCwCHCnCTCwCwCw CwCwCnCnCnCTBuBQBQBQCeAbA0CTCnCnBaC4BQBQBQBQBQBQBCCnBuCdB3CwCwCw CwCwCwAWCTCTBxBCBCBQBQC4AcA0A0A0A0AbC4BQBQBCBCBCBCCdBuBuCw_A_A_A CwCwCwAVAWAVAWAtAtBCBCCeBWAcAcCHA0AcChBCBCBCBQAtAt_5CHCCCw_L_z_B CwCwCw_FAWAVAWAkAtBCAtAtCeA0AzCeA0A0BWCeBCAtAtAtAk_$BuBu_A_B_L_A CwCwCwAWAVAWAkAkAkBPAtAtCeAwAcCeAwAcA0CeBPAkAkAtBP_MCHCC_2_A_z_A CwCwCwAVAWAPAkAkAkAkAtBPCeA0AwBuA0A0AwCeAWAkAkAkAW_$BuBu_A_A_M_A CwCwCwCwAVAWAkAkAkAWAkAkCeAzAcCeAwA0AcCe_4AWAWAWAW_2CHCC_2_A_A_z CwCwCwCwAWAPAkAWAWCwAWAkCeA0AwCeA0AcAwCe_A_0AyAkAW_$BuBu_A_z_M_A CwCwCwCwAVAWAWAWCwCw_uAWCeAwAcBuAwAcAcCe_4_A_BAW_1_ACHCC_M_A_A_A CwCwCwCwCwAWAWCwCwCw_rARCeAcAbCHAcAcBSCe_A_A_1AW_A_$BuBu_A_2_ACw CwCwCwCwCwAWCwCwCwCwBQ_iCeAwAcA0BuAzA0Ce_4_A_B_A_1_ACHCCCw_A_ACw CwCwCwCwCwCwCwCwCwCwAtBQCeA0AcAzCHAcAYCe_A_A_1_B_A_$BuBu_M_z_LCw CwCwCwCwCwCwCwCwCwCwAtAtCeBSAcAcCHAzAcCe_4_A_A_A_1CwCHCC_B_ACwCw CwCwCwCwCwCwCwCwCwBQBQAtCeAcAcCHA0AcAwCe_z_A_2_ACwCwBuBu_1_ACwCw CwCwCwCwCwCwCwCwCwBQBQAtCeBSA0BuAwAcAcBu_4_A_A_ACwCwCHCC_B_ACwCw CwCwCwCwCwCwCwCwAtBQAtBqBuAcAwCHAcAcCHAk_z_M_ACwCwCwBuBu_LCwCwCw CwCwCwCwCwCwCwAtBQBQAtBCCHAbAcA0AcA0CHAkAW_z_ACwCwCwCHCC_0CwCwCw CwCwCwCwCwCwBQAtBQAtAtAkAkCHA0AcA0AwBuAkAW_B_L_ACwCwBuBu_LCwCwCw CwCwCwCwCwCw_1BQAtAtAtAkAkBuAwA0AcCHAsAtAW_1_z_ACwCw_z_zCwCwCwCw CwCwCwCwCwCw_L_2AtBPAtAkAtBPBqBuBuAkAWAk_z_A_ACwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCw_A_M_M_1AkBC_L_1_z_zAkAW_1_A_MCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCw_A_A_1_1_A_A_A_A_1_z_0_ACwCwCwCwCwCwCwCwCwCwCw } # tile 315 (Death) { CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwA4CwCwB4CwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCw_F_F_F_FCwCwCwCwBl_fB4CmCQAmCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCw_F_A_A_A_A_ACwCwCwB4A4B4CPB4_fB4CwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCw_A_ACVB6CV_A_ACwBEA4_IAmBl_fA4BlCwCwCw CwCwCwCwCwCwCwCwCwCwCwCw_F_AB6CVCSCoB6_zCwA4_fAm_JCo_I_KA4BECwCw CwCwCwCwCwCwCwCwCwCwCwCw_A_zCSCuCoCuCo_F_ABeBCCS_KC$_J_f_fA4CwCw CwCwCwCwCwCwCwCwCwCwCw_F_F_ACoCuCSCuCS_F_AB6BECoCSCoCo_KBCBeCwCw CwCwCwCwCwCSCoCSBhCwCwCw_F_ACSC$CSC$_F_A_1BQ_KBCCeBe_KC1BEB6CwCw CwCwCwCmB6BIBhBhBhCwCw_F_A_ACoB6CVB6_F_F_ACwBl_KCmC5BECoBCBQCwCw CwCwCSA9BICwCwCwAzCwCw_F_A_A_A_F_A_F_E_A_A_ACw_F_gBCBE_KBACwCwCw CwCoBhCwCaCwCwCSBSCw_A_A_A_A_A_A_A_F_z_A_A_A_F_ACmCwCwCwCwCwCwCw CwBhCwCwCwCwCSCwBSCo_A_A_A_A_A_A_F_E_A_A_A_A_A_A_B_FCwCwCwCwCwCw CwCwCwCwCwCwCwCmBSCw_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_ACwCwCwCwCwCw CwCwCwCwCwCwCSCwAw_F_A_A_F_A_A_A_F_A_A_A_A_A_A_A_A_F_ACwCwCwCwCw CwCwCwCwCwCwCwCwBS_A_F_F_A_A_A_A_A_A_A_A_A_A_A_A_A_ACwCwCwCwCwCw CwCwCwCwCwCwCwCwBSCw_A_A_A_A_A_A_A_A_B_F_A_A_A_A_A_ACwCwCwCwCwCw CwCwCwCwCwCwCwCwBSCwCw_A_A_A_A_F_A_A_A_A_A_A_A_A_ACwCwCwCwCwCwCw CwCwCwCwCwCwCwCwBSCwCw_A_A_A_A_A_z_A_A_A_A_A_ACw_ACwCwCwCwCwCwCw CwCwCwCwCwCwCwCwAwCwCw_A_A_A_A_A_A_A_A_A_A_A_ACwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwAwCwCwCwCw_F_A_A_A_A_F_A_A_A_ACwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwAwCwCwCw_F_A_A_A_A_A_A_A_A_ACwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwBSCwCwCw_F_A_F_A_A_F_A_A_A_FCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwBSCwCw_F_A_A_A_A_A_A_z_A_A_ACwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwAwCwCw_F_A_A_A_A_A_F_A_A_A_ACwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwAwCwCwCw_F_A_A_A_A_A_A_A_A_A_FCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwAwCwCw_F_A_A_A_A_A_A_A_A_E_A_ACwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwBSCwCw_E_A_A_A_A_A_A_A_A_B_A_ACwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwAwCwCw_F_A_A_A_A_A_A_A_F_A_A_ACwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwAwCw_F_A_A_A_A_z_A_A_A_A_A_A_ACwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwAwCw_F_A_A_A_A_A_A_B_A_A_A_A_ACwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwAw_F_A_A_A_A_ACw_A_A_A_A_A_A_A_A_ACwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCw_ACwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw } # tile 316 (Pestilence) { CwCwCwCwCwCwCwCwCwCwCwCwCwCmCmCwCwCwCwCwCwCwCwAoCwCwB5CwCwCwCwCw CwCwCwCwCwCwCwCwCwCwC$BDCmA2A2CoBDC$CwCwCwCwB5_tB5CmCRAoCwCwCwCw CwCwCwCwCw_qCwCwCwCwCoCmCmCoC$C$CmCVCwCwCwCwBmA8B5CPB5_tBmCwCwCw CwCwCwCwCwCwCwCwCw_F_2_AAeARADACAD_A_ABDCwCVA8_qAoBm_qA8BmCwCwCw CwCwCwCwCwCwCwCw_F_F_A_AAhAgAhAhAQADAeBdCwAo_t_q_qB5_q_tA8CVCwCw CwCwCwCwCwCwCwCw_F_A_LADARCuAoA8CuAh_A_D_9BgBH_q_wBg_tAo_wAoCwCw CwCwCwCwCw_tCwAf_G_E_A_8AQCuA8A8CuAo_A_DANB5A9_xBH_w_u_wBHBgCwCw CwCw_qCwCwCwCw_F_F_F_AACARAoAoAgAR_F_B_AABB5_u_u_yA9_wBh_xB5CwCw CwCwCwCwCwCwCw_F_E_A_A_AARAgADAD_L_F_F_DAOCwBH_tBgCSBgCQ_xCOCwCw CwCwCwCwCwCw_F_F_E_A_A_L_D_F_L_D_F_E_B_A_A_ACVBL_t_xBH_wBmCwCwCw CwCwCwCwCw_F_A_A_A_A_A_A_A_A_A_D_E_B_A_A_A_A_E_EABCVB6CwCwCwCwCw CwCwCwCwCw_A_A_A_A_A_A_A_A_B_E_F_E_A_A_A_A_A_A_A_A_A_EAfCwCw_qCw CwCwCwCwCw_F_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_AAeCwCwCwCw Cw_tCwCwCw_E_A_A_D_E_B_A_A_A_F_D_A_A_A_A_A_A_A_A_A_A_E_E_ACwCwCw CwCwCwCwCw_B_G_F_E_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_AAeCwCwCwCw CwCwCwCwCw_F_A_A_A_A_A_A_A_A_A_A_A_A_F_E_A_A_A_A_A_A_AAeCwCwCwCw CwCwCwCwCwCwCwAe_A_A_z_A_D_F_B_A_A_A_z_A_A_A_A_A_A_A_ACwCwCwCwCw CwCwCwCwCwCwCwAe_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_AABCwCwCw_tCwCw CwCwCwCwCwCwCwAe_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_ACwCwCwCwCwCwCwCw CwCw_qCwCwCwCwCwCw_A_A_D_A_A_A_B_B_F_D_A_A_A_AA2CwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwBl_E_B_A_A_A_z_A_A_A_A_A_A_A_ACwCw_tCwCwCwCwCwCw CwCwCwCwCwCwCwCwBl_E_A_E_E_A_A_E_F_A_A_A_B_F_ACwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwAf_D_A_A_A_B_A_A_A_A_A_A_A_A_A_ACwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwAf_D_A_A_A_A_A_A_E_E_A_A_A_A_A_ACwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwBl_E_B_A_A_A_A_A_A_A_z_A_A_A_EAmCwCwCwCwCw_qCwCw CwCwCwCwCwCwCwAf_D_A_A_A_A_A_A_A_A_A_A_D_E_A_AA2CwCwCwCwCwCwCwCw CwCwCwCwCwCwCwAf_D_A_A_A_A_A_A_A_A_A_A_A_A_A_AA2CwCwCwCwCwCwCwCw CwCwCwCwCwCwCwAm_D_A_A_A_A_A_z_A_A_A_F_E_A_A_AA2CwCwCw_tCwCwCwCw CwCwCwCwCwCw_F_B_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_ACwCwCwCwCwCwCwCw CwCwCwCwCwCw_F_B_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_ACwCwCwCwCwCwCwCw CwCwCwCwCw_E_B_A_A_A_A_ABDCwAO_A_A_A_A_A_A_A_A_A_ACwCwCwCwCwCwCw CwCwCwCwCwCwCwCw_A_A_ACwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw } # tile 317 (Famine) { CwCwCwCwCwCwCwCwCwCwCwCwCwCwCw_F_F_F_ECwCwCwCwCwCwCuCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCw_F_A_A_A_A_ACwCwCwCwCxCwCwCwCwCwCwCu CwCwCwCwCwCwCwCwCwCwCwCwCwCw_A_AAlAlAl_z_ACwCwCwCwCwCwCuCuCwCwCu CwCwCwCwCwCwCwCwCwCwCwCwCw_F_zAlAlAxAZAl_ACwCwCwCxCxCuCwCxCuCwCw CwCwCwCwCwCwCwCwCwCwCwCwCw_A_AAxCuAOCuAZ_FCuCwCxCxCuCuCwCwCxCuCu CwCwCwCwCwCwCwCwCwCwCwCw_F_F_AAOCuAxCuAe_FCzCxCzCwCwCwCzCzCyCwCw CwCwCwCwCwCwCwCwCwCwCwCwCw_F_AAxAOAOAx_F_A_ACwCzCrCwCyCxCwCzCwCw CwCwCwCwCwCwCwCwCwCwCwCw_F_A_BAZAlAlAl_F_F_ACxC3CrCyCyCzCsCzCwCw CwCwCwCwCwCwCwCwCwCwCwCwCw_F_A_A_D_F_0_ACwCwCxC3CsC3CzC8C3C3CzCu CwCwCwCwCwCwCwCwCwCwCw_A_A_A_A_A_0_E_A_A_ECwCwCxCzC3CsCsCzCyCxCw CwCwCwCwCwCwCwCw_A_A_A_A_A_A_A_A_D_E_B_A_A_A_E_ACuCxCxCyCxCuCwCw CwCwCwCwCwCwCw_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_L_M_A_BCwCwCwCw CwCwCwCwCwCw_A_A_A_A_A_A_E_A_E_A_D_A_A_A_A_A_D_B_A_ACwCwCwCwCwCw CwCwCwCwCwCwCwB1CwCw_A_A_D_F_A_A_A_A_A_A_A_A_A_A_ACwCwCwCwCwCwCw CwCwCwCwCwCwCwB1CwCwCwCw_A_A_A_A_A_A_E_A_A_A_ACwCwCwCwCwCwCwCwCw CwCwCwB1BkB1B1BkB1B1BkB1Cw_A_A_A_E_A_A_A_A_ACwCwCwCwCwCwCwCwCwCw CwCwCwB1CwCwCwCwCwCwCwB1Cw_A_A_A_A_A_A_A_A_ACwCwCwCwCwCwCwCwCwCw CwCwCwBkCwCwCwCwCwCwCwABCw_A_A_A_A_z_A_A_ACwCwCwCwCwCwCwCwCwCwCw CwCwABCwABCwCwCwCwCwABCwABCwCw_B_A_A_D_A_ACwCwCwCwCwCwCwCwCwCwCw CwABCwCwCwABCwCwCwABCwCwCwAB_E_A_A_A_A_ACwCwCwCwCwCwCwCwCwCwCwCw CwCPCPCmB9B9CwCwCwCmCmCmB9B1_D_F_A_F_A_B_FCwCwCwCwCwCwCwCwCwCwCw CwCwB1B9B1CwCwCwCwCwB9B9B1_F_A_A_A_A_A_ACwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCw_E_A_A_A_F_A_A_ACwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCw_E_A_A_A_A_A_ECwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCw_F_A_A_A_A_A_E_ACwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCw_F_A_A_A_A_A_A_ACwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCw_A_A_A_A_E_A_ACwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCw_B_A_A_A_A_A_A_ACwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCw_F_B_A_A_A_A_A_A_ACwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCw_D_A_A_A_A_A_A_A_A_A_ACwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCw_ACwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw } # tile 342 (monk) { CwCwCwCwCwCwCwCwCwCwCwAlAlAlCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwAlAlAlAlAlCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwAlAlCnAlCTCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwAlCn_KCn_KCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwAlAlAlCnCnCnCTCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwAlAlCwCwCbCnCnCTB3CbCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCACACcCbCTB3CcCbCACbCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwBiCbCACECcCbBSCbCACACFCACACwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCACbCACACACECcBLBLCABrBrCbCFCECwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCACbCcCECACACEBRCACABsBrCcCEBsCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCACACACECcCbCcBHCnBHCcCbCcCECABrBRCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCACACbCACECACABHCNBHCECACECACABrBSCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwBRBiBrCFCACbCABHAwBHBsCACACbBsBrBSCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwBSBrCABrBiCAAoBiBSBsBHCbCABiBrBSBRCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwBRBiBrCACAA8BSBLBLBiAoBsBRBSBRCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwBRBi_nAoBiCABRCACAAwAoBSBRCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwBRBsCECABSCECABiBRCwCw_A_A_A_A_A_A_ACwCwCwCwCw CwCwCwCwCwCwCwCwCwBSBrCACABMBLBiBrBSBR_A_A_A_A_A_A_A_ACwCwCwCwCw CwCwCwCwCwCwCwCwBRBsCECACbBsCECACABrBS_A_A_A_A_A_A_A_A_ACwCwCwCw CwCwCwCwCwCwCwCwAoCACACACABRCACEBsAoAo_A_A_A_A_A_A_A_A_ACwCwCwCw CwCwCwCwCwCwCwCwCwBHBHAoA8AwA8BHBH_r_N_A_A_A_A_A_A_A_A_ACwCwCwCw CwCwCwCwCwCwCwCwCwBiBsBiAw_ABiBsCACA_A_A_A_A_A_A_A_A_ACwCwCwCwCw CwCwCwCwCwCwCwCwCwCACABrAw_ABrCABsBr_A_A_A_A_A_A_A_A_ACwCwCwCwCw CwCwCwCwCwCwCwCwCwCABrBsAv_ABSCACEBi_A_A_A_A_A_A_ACwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCACABRAw_ABRCACABR_A_A_A_A_A_ACwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwBrBrBSAv_ABSBrBiBR_A_A_A_A_ACwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwBsBrBSAv_ABRBSBrBS_A_A_A_ACwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCw_ABSAv_A_A_ABSBR_A_A_A_ACwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCw_A_AAQAQ_A_A_AAQAg_A_A_A_ACwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCw_A_AAQAQAQAQ_A_A_AAQAQAQAg_ACwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCw_A_A_A_A_A_A_A_A_A_A_A_A_A_A_ACwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCw_A_A_A_A_A_A_A_A_ACwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw } # tile 345 (ranger) { CwCwCwCwCwCwCwCwCwCwCwCwCwCsCsCsCsCsCwCwCwCwCwCwCwCwCwCwCwCICwCw CwCwCwCwCwCwCwCwCwCwCwCwCsCsC6C6C2CrCsCwCwCwCwCwCwCwCwCwAzCICwCw CwCwCwCwCwCwCwCwCwCwCwCwCsC6C2C2C2CnCsCsCwCwCwCwCwCwAzAzCwCICwCw CwCwCwCwCwCwCwCwCwCwCwCwCrC6AvC2AvCnCrCsCsCwCwCwAzAzCwCwCICwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCrCnC2CnCnCnCsCrCsCsAzAzCwCwCwCwCICwCwCw CwCwCwCwCwCwCwCwCwCwCwCw_qCTCnCnCnCT_qCsCrCrCsCrCwCwCwCICwCwCwCw CwCwCwCwCwCwCwCwCwCwBNBNBNBoBNCTBNBNBoBR_tCsCrCsCsCwCwCICwCwCwCw CwCwCwCwCwCwCwCwCwBNBrBoBrBNBR_cAvAqBRBoBNBNCsCwCLCsCICwCwCwCwCw CwCwCwCwCwCwCwCwCwBNBoBoBNBNBN_cBoAvAGAqAICTCrCsCwCwCICwCwCwCwCw CwCwCwCwCwCwCwCwCwC6BoAvAvBNAv_cAqAGAqAXCTC6CwCrCwCICwCwCwCwCwCw CwCwCwCwCwCwCwCwC6C6CnBNAqAvBoBNAvAIAT_4CTCnC6CwCrCrCwCwCwCwCwCw CwCwCwCwCwCwCwAzC6CnCnCwBNAqBNAvAGAq_4CwCnCTCnCI_A_A_ACwCwCwCwCw CwCwCwCwCwAzAzC6CnCnCwCwAwAvATAqAIAwAYCwCTCnCn_A_A_A_ACwCwCwCwCw CwCwCwAzAzCwCwC6CnCwCwCwAwBSAwCrAwAYAYAw_ACTC6Cn_A_A_A_ACwCwCwCw CwCICICwCwCwCwC6CnCwCwCIBNBSAwCrAwAY_c_AAwAwCnCrCrCr_A_A_ACwCwCw CwCwCwCICICIC6CnCTCICIAqBRBoBNAvBNAqAT_A_AAwCLCrCm_A_A_ACwCwCwCw CwCwCwCwCwCwC6CnCTCwAqAvBNBoBrBNBoAvAqAI_ACLCLB1CVCm_A_ACwCwCwCw CwCwCwCwCwCwC6CTCwCwAqBNBoAvBoBNAXBNAqAT_ACLB9B9B1CV_A_ACwCwCwCw CwCwCwCwCwCwCwCwCwCwCsBRBoBNBoBRAqBoCLCL_ACL_AAlBDCPCmCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCsBoBrBoCrCrCLCnCn_A_A_ACw_ABDCPCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwC2CsCsCr_A_LCTCnCn_A_A_A_A_A_ABDCPCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwC6C6CT_A_A_ACTCnCn_A_A_A_A_A_A_ABDCVCwCwCw CwCwCwCwCwCwCwCwCwCwCnC6C2CT_A_A_ACTCTCn_A_A_A_A_A_A_A_ABdCoCwCw CwCwCwCwCwCwCwCwCwCwC6C6C2CT_A_A_ACTCTCn_A_A_ACwCwCw_A_A_ABDCwCw CwCwCwCwCwCwCwCwCwCwC6C2CT_A_A_A_A_ACTCT_A_A_ACwCwCwCwCw_ACwCwCw CwCwCwCwCwCwCwCwCwCwC6C2CT_A_A_A_A_ABSBS_A_A_ACwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwBSBSBS_A_A_A_A_ACTCn_A_A_ACwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwC2C2BS_A_A_A_A_ABSBSBS_A_ACwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwBSBSBSBS_A_A_A_A_A_ABSBS_ACwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCw_ABSBSBS_A_ACwCwCwCw_A_A_A_ACwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCw_A_A_A_A_ACwCwCwCwCwCw_A_ACwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw } # tile 371 (Ixoth) { BNBNCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwBNBNBNBNBNBNBNBNCw CwBNBNBNBNCwCwCwCwCwCwCwCwCwCyCwCwCwCyCyBNBNBNBNBNBNBNBNBNBNCwCw CwCwBNBNBNBNBNBNBNBNBNBNBNCyCwCwCwCwCwBNBNBNBNBNBNBrBrBrBrCwCwCw CwCwCwBNBNBNBNBNBoBNBNBNBNBNCwCwCwCwBNBNBNBNBNBrBrBrBoBoCwCwCwCw CwCwCwBNAqBrBrBNBNBNBNBNBNBNCwCwCwCwBNBrBNAqBNBNBNBoBNBoCwCwCwCw CwCwCwBrBrBoBNBNBoBRCbCcCABoBNCwCwCwBNBNBrBNBNBNBNBNBoBNCwCwCwCw CwCwBoBoBoBNBNBNCcCxBrCECECcBNCwCwCwBNBNBrBoBNBNBNBNBNBRCwCwCwCw CwCwBNBNBNBNBoCcBoCACEBoCEBoCECECwCwBNBNBNBrBoBoBNBNBNBNCwCwCwCw CwCwBNBNBNAqBoCcCEBoBrBoBrBoCABoCACwBNBNBNBrBoBRBoBNBNBNBNCwCwCw CwCwCwBNBNBrCbCECcBoCcBNBNBrBoBrCEBoCwBNBNBNBrBoBRBoCwCwCwCwCwCw CwCwCwCwCcBoCECcCbBrCbBNBrBrBrBoBrCECABNBNBNBrBrBoCwCwCwCwCwCwCw CwCwCwCwBoCcCACxCACxCABNBNBNBoBNBNBoCEBNBNBNBNBrCwCwCwCwCwCwCwCw CwCwCwCwCwCECbCcCcCECyCwBNBNBrBrCEBNBrCbCACECEBoCwCwCwCwCwCwCwCw CwCwCwCwCwBrCyCECcCECzBoCcBoBNBRBNBNBoBrBoCcCcCECECwCwCwCwCwCwCw CwCwCwCwCwCwCECyCECcCyCyBNBNBoCcBrBrBNBNBoBoBoBrCcCECECwCwCwCwCw CwCwCwCwCwCwCECyCyCbCyCyBNBrBNBrBoAqBrBoBNBrBNBoBoCECcCECwCwCwCw CwCwCwCwCwCwBNCzCyCzCcCyCcBNBNCcBrCEBNBNCABNBoBNBrBoBoCECwCwCwCw CwCwCwCwCwBoBNCACbCcCyCyCbBNBoBrBoBNAqBNBoBrBNBNCwCwBrCACECwCwCw CwCwCwCwBrBoBNAqCECECcCyCABNBrCcBrBrCEBNBNBNBNCwCwCyBoCECECECwCw CwCwBrBoBoBNAqAqCzBoCECcCyBoBNBrBoBNAqBNBoBrCE_A_A_A_ACzCECzCwCw CwBNBoBNBNAXAqCwCwCwBoCECcBoBrCcBrCEBrBNBrBNBoBr_A_A_zCy_A_ACyCw CwCzCwBNAqCyCwCwCwCwCwBoCwBoBNBNBoBNAqBNBNCABoBNCEBo_A_ABrBoCwCw CyCwCwCyCwCyCwCwCwCwCwCwBrBoBrBNCcBrCEBNBoCABoCABNBNBrBoBo_L_ACw CwCwCwCyCwCwCwCwCwCwBrBoCABoBNBNAqBNAqAqBNBNCEBrBoBNBNBr_A_A_ACw CwCwCwCwCwCwCwCwCwCwBoCACEBNBNAqAqBrBNBoBrAqBNCEBrCE_A_A_A_zCwCw CwCwCwCwCwCwCwCwCwBoCEBrBoBNAqAq_A_zAqAqBNBNBrCECEBo_A_A_ACwCwCw CwCwCwCwCwCwCwCwCwBrCEBoBrBNAT_A_A_A_z_A_AAqBNBoBrCEBN_A_zCwCwCw CwCwCwCwCwCwCwCwCwCECABoBNAqAq_A_z_A_A_A_A_ABNBNCECEBN_A_A_ACwCw CwCwCwCwCwCwCwCwBNBoBrBNBNAq_A_A_A_A_z_A_A_AAqBrBNBNBNBN_A_A_ACw CwCwCwCwCwCwBNBNBNBrBoBNAq_A_A_A_z_ACwCw_z_A_ABNBoBNCEBNBN_z_ACw CwCwCwCwCwCEBN_ABrBN_ABNAqBr_z_ACwCwCw_A_A_ACEBN_AAqCE_AAqBr_zCw CwCwCwCwCw_A_A_A_z_A_A_A_A_A_ACwCwCwCwCwCw_A_A_A_A_A_A_A_A_ACwCw } # tile 374 (Scorpius) { CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw_A_AAB_2CwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw_A_A_AAOABAO_2_2CwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw_A_AABAOABAOAlAeAlA2CwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw_A_AABAOABAOAeAlAlAlAOAeCw CwCwCwCwCwAeAeAOAeAlAlAeAlCwCw_ACwCw_A_AAOABAOABAlAlAlAeAlAeAOCw CwCwCwCwCw_A_A_A_AAOAeABAOAlCwCw_A_A_A_AABAOABAlAlAeAlCwAlABABAl CwCwCwCwCwCwCwCw_A_A_A_A_AAeAlCwCwCwCwAlAlAlAlAlAlCwCwCwA2AeAOAO CwCwCwCwCwCwCwCwCwCwCw_A_AAOAlCwCwCwCwCwCwCwCwCwCwCwCwABAeAeAOAe CwCwCwCwCwCwAlAlAlAlAlCw_AAOAOCwCwCwCwCwCwCwABAeABABAOAOAOAOABA2 CwCwAOAeAeAOAeABAeAOAlAl_AAeAlCwCwCwAOAlAlAeAe_2ABAlAeAO_2AB_ACw CwCwCw_A_A_A_A_A_A_AAeAe_AAeAeCwAeAlABAOAOAOAOABAeAOAeABAB_2_ACw CwCwCwCwAlAlAlAeAl_AABAe_AAeAlAeAeAlAeAeABAeAOAOAOAOAB_2_AAOCwCw CwAeAeAOAeAOABABAeAl_AAl_AAeABABAlAeAOAeAB_2ABAO_2AOAB_AABCwCwCw CwCw_A_A_A_A_A_AABAe_AAlAOAlAlAlABAeAOAeABABAB_A_A_A_ACwCwCwCwCw CwCwCwCwCwCwCw_AAeAl_AAlAlAlAOAeAeABAOABAO_A_A_ACwCwCwCwCwCwCwCw CwCwAeAlCwCwCw_AAeAeAeABABAOAeAOAeAB_2ABAlAlAlAlAeAlAlAlCwCwCwCw CwAeAOAeAlAlCw_AAeAeAlAlAeABAeAeABAO_2_A_A_A_A_A_A_A_AAlAlCwCwCw CwAOAe_AAeAOAl_AAeAeAlAOAeAe_2ABABAlAlAlAlAlAeAl_A_A_A_AAlCwCwCw ABAeAe_A_A_AAeBiAlAlAeAOAeAOAO_2AeAOAeAOAeAOABAeAlCwCw_AABCwCwCw ABAeAOAl_A_ABiCuBiAeAOAeAeAOAB_2_A_A_A_A_A_A_A_AAOAlCw_AAeCwCwCw ABAeAeAl_ACw_ABiAeAOBiAeABAeAlAlAlAlAeAlCwCw_A_AAeAeCw_AAeCwCwCw ABAeAOAl_ACwCw_AAeBiCuBiABAeAOAeAOAeABAOAlCwCw_AABAlCw_AAOCwCwCw ABAeAeAl_ACwCwCw_AABBiAeAl_A_A_A_A_A_AAeAeAlCw_A_AAeCwCw_ACwCwCw ABAe_AAl_ACwCwCwCw_A_AAeAOAlCwCwCw_A_A_A_AABCwCw_AAOCwCwCwCwCwCw _AAB_AAl_ACwCwCwCwCwCw_A_AAeAlAlCwCwCwCw_AAlCwCw_AAeCwCwCwCwCwCw _AAO_AAl_ACwCwCwCwCwCwCwCw_A_AAOAlCwCwCw_AAlCwCw_AAeCwCwCwCwCwCw _AAB_A_ACwCwCwCwCwCwCwCwCwCwCw_AAeAlCwCw_AAeCwCwCw_ACwCwCwCwCwCw _AAO_ACwCwCwCwCwCwAlAlAlAlAlAlAlAeAOCwCw_AAOCwCwCwCwCwCwCwCwCwCw Cw_A_ACwCwCwCwAeAOAeAOAeAOAeAOAeAOAeCwCw_AAeCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCw_A_A_A_A_A_AABABAOAB_A_A_ACw_AAeCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCw_AABAOABAOABAO_A_A_A_ACwCwCwCw_ACwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCw_A_A_A_A_A_A_A_ACwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw } # tile 375 (Master Assassin) { CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwAB_2_2_2_2CwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCw_2_2_2AB_2_2_2_2_2CwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCw_2AB_2AB_2_2AB_2_2_2_2CwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCPCPCPCPB9B1B1B1BkBdBdCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCVCPCVCPB1B1B9B1BdBdBdAB_2CwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCw_2C2_A_AC$C2_A_AC$_2_2_2Cw_2ABCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCw_2C2C$C$C$C2C$C$C$_2_2Cw_2CwCw_2_2CwCwCwCwCw CwCwCwCwCwCwCwCwCwCw_2ABC2C2C2C2C2C2_2_2_2CwCw_2CwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwAB_2_2_2AB_2_2_2_2_2CwCwCwCw_2CwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCw_2AB_2_2AB_2_2_2CwCwCwCwCwAB_2CwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCw_2AB_2_2_2CwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCw_2AB_2CP_ACP_2CP_2AB_2_2CwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwAB_2_2AB_2CV_ACP_2AB_2_2AB_2CwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCw_2_2_2_2_2AB_2CPAB_2_2_2_2_2AB_2CwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCw_2AB_2_2_2_2AB_2AB_2_2_2_2_2_2_2CwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCw_2AB_2CwCw_2_2AB_2_2_2CwCw_2_2_2CwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwAB_2CwCwCwAB_2_2AB_2_2CwCwCwAB_2CwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwC2C2CwCwCw_2AB_2_2_2_2CwCwCwC2C2CwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwC2C2CwCw_2AB_2_2_2AB_2_2CwCwC2C2CwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCw_2_2_2CwCw_2_2_2CwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwAB_2_2CwCwAB_2_2_A_A_A_A_A_A_ACwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCw_2_2_2_A_A_2_2_2_A_2_A_2_A_A_2CwCwCwCwCw CwCwCwCwCwCwCwCwCwCw_A_2AB_2_2_A_2_2AB_2_2_A_A_A_A_ACwCwCwCwCwCw CwCwCwCwCwCwCw_A_A_AAB_2AB_2_2_A_AAB_2_2AB_2_A_2CwCwCwCwCwCwCwCw CwCwCwCwCwCw_A_A_2_A_2AB_2_2_A_A_A_AAB_2_2AB_ACwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCw_A_A_A_A_A_2_A_2_A_A_A_A_ACwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw } # tile 377 (Lord Surtur) { CwCwCwCwCwCwCwCwCwB1CwCwCwBdBdA2CwCwCwA2CwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwB1CwB1B1BdBdA2A2A2CwA2CwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwB1B1B1BdBdBdA2A2A2A2A2CwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwB1B1B1BdBdBdA2A2A2A2A2CwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwB1_ACxCyBKBdCxCy_BA2A2CwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwB1B1BlCxBdBMCxA3A2A2A2CwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwB1B1Bd_BBdBd_BA2A2A2A2CwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwB1B1Bd_ABdBd_BA2A2A2A2CwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwBoBoBoBoB1Bd_ABdBd_AA2A2A2CBBoBoBoCBCBBoCwCwCwCwCwCw CwCwCwCwBoBoBoCBCBBoBoBN_ABdBd_AA2BNCBCBBoBoBoBoBoCBBoBoCwCwCwCw CwCwCwCBCBBoCBCBCBBoBoBoBNBNBNBNBNCBCBBoBoBoBoBoBNBoBoBoBoCwCwCw CwCwCBCBBoBoCBCBCBBoBoBoBoBoBNCBCBCBBoBoBoBoBoBoBNCBCBBoBoCwCwCw CwCBCBCBBoBoBoCBCBBoBoBoBoBoBNCBCBCBBoBoBoBoBoBoBNBoCBCBBoBoCwCw CBCBCBBoBoBoBoBoCBCBBoBoBoBoBNCBCBBoBoBoBoBoBoBNBoBoBoCBBoBoCwCw CBCBBoBoBoBNBoBoBoCBBoBoBoBoBNCBCBBoBoBoBoBoBNBNBoBoBoBoCBBoCwCw CBCBBoBoBoBNCwBoBoBoBoBoBoBNBNBNCBBoBoBoBoBNBNBNBNBoBoBoCBBoCwCw CBCBBoBoBoBNBNCwBNBNBNBNBNBNBNBNBNBNBNBNBNBNCwBNBNBNBoBoCBBoCwCw CBCBBoBoBNBNBNCwCBCBCBBoBoBoBNBoBoBoBNBNBNBNCwCwBNBNBoBoBoCwCwCw CwCBCBBoBNBNCwCwCwCBCBCBBoBoBNBoCBBoBNBNBNCwCwCwCwBNBNBoBoCwCwCw CwCwCBBoBNBNBNCwCwAwCBCBBoBoBNBoBoBoBNBSBSCwCwCwCwBNBNBoBoCwCwCw CwBoBoBoBoBoBNBNAwAwAwAwAwAwAwAwAwBSBSBSBSCwCwCwBNBNBoBoCBBoCwCw CwBoBoBoBoBoBNBNAwAwAwAwAwAwAwAwAwAwBSBSBSBSCw_ABNBoBoBoCBBo_A_A CwCBCBBoBoBoBoBNAwAwAwAwBiBSBSBSAwAwAwBSBSBSBSBNBNBoBoCBBoBo_A_A CwCBCBCBBoBoBoBNBNAwAwAwBSBSBSBiAwAwAwAwBSBSBSBNBoBoBoCBBo_A_A_A CwCwCBCBCBBoBoBNBNBNBNBSBSBSBSBSAwAwAwAwBSBoBoBNBoBoCBBoBo_A_A_A CwCwCwCBCBBoBoBoBNBNBNBSBSBS_A_AAwAwAwAwBSBoBoBoBoCBCBBo_A_A_A_A CwCwCwCwCBBoBoBoBNBNBNBiBS_A_A_AAwAwAwAwBSBoBoBoBoCBBoBo_A_A_A_A CwCwCwCwBoBoBoBoBoBNBNBSBS_A_A_AAwAwAwAwBiBoBoBoBoBoBo_A_A_A_A_A CwCw_A_A_ABoBoBoBoBoBSBSBS_A_A_AAwAwAwAwBSBSBoBoBoBo_z_A_A_A_ACw Cw_A_A_AAwAwAwAwAwBSBSBSBS_A_A_AAwAwAwAwBSBSBSBS_A_A_A_A_A_A_ACw Cw_A_A_AAwAwAwAwAwBiBSBSBS_A_A_AAwAwAwAwBSBSBSBSBS_A_A_A_A_A_ACw CwCw_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_ACwCw } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/share/tiletext.c��������������������������������������������������������������0000664�0000764�0000764�00000042012�10545462317�015560� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* SCCS Id: @(#)tiletext.c 3.4 1999/10/24 */ /* NetHack may be freely redistributed. See license for details. */ #include "config.h" #include "tile.h" /* * TEXTCOLORMAPSPACE * * This is the maximum number of possible unique colours in a .TXT file * file. MAXCOLORMAPSIZE may be set (in tile.h) to be smaller than this * in which case only that many unique colours may be present in a .TXT * file (and in all merged .TXT files). MAXCOLORMAPSIZE may be larger * than this without penalty. A value of n*TEXTCOLORMAPSPACE where n is * the number of .TXT files that are going to be merged (currently three; * monsters, objects & others) produces maximum generality. Increasing * MAXCOLORMAPSIZE has performance issues for the game (TEXTCOLORMAPSPACE * does not). Windowing systems are required to cope with MAXCOLORMAPSIZE * colours and map them onto their possible palette (see tile.doc) so this * also introduces an additional burden. */ #define TEXTCOLORMAPSPACE 4096 pixval ColorMap[3][MAXCOLORMAPSIZE]; int colorsinmap; pixval MainColorMap[3][MAXCOLORMAPSIZE]; int colorsinmainmap; int tile_x = -1, tile_y = -1; static short color_index[TEXTCOLORMAPSPACE]; static int num_colors; static char charcolors[MAXCOLORMAPSIZE][3]; static int placeholder_init = 0; static pixel placeholder[MAX_TILE_Y][MAX_TILE_X]; static FILE *in_file, *out_file; static int tile_set, tile_set_indx; static const char *thin_text_sets[] = { "monthin.txt", "objthin.txt", "oththin.txt", "comthin.txt" }; static const char *big_text_sets[] = { "mon32.txt", "obj32.txt", "oth32.txt", "com32.txt" }; static const char *std_text_sets[] = { "monsters.txt", "objects.txt", "other.txt", "combined.txt" }; #define TEXT_SETS(i) ( tile_x == 8 ? thin_text_sets[i] : \ tile_x == 32 && tile_y == 32 ? big_text_sets[i] : \ std_text_sets[i] ) extern const char *FDECL(tilename, (int, int)); static void FDECL(read_text_colormap, (FILE *)); static boolean FDECL(write_text_colormap, (FILE *)); static boolean FDECL(peek_txttile_info, (FILE *, char *, int *, char *)); static boolean FDECL(read_txttile_info, (FILE *, pixel(*)[MAX_TILE_X], char *, int *, char *)); static boolean FDECL(read_txttile, (FILE *, pixel(*)[MAX_TILE_X])); static void FDECL(write_txttile_info, (FILE *, pixel(*)[MAX_TILE_X], const char *, int, const char *)); static void FDECL(write_txttile, (FILE *, pixel(*)[MAX_TILE_X])); #define FUZZ #define ABS(x) ((x) > 0 ? (x) : (-(x))) #define MAX3(x, y, z) ((x) > (y) ? ((x) > (z) ? (x) : (z)) : \ ((y) > (z) ? (y) : (z))) /* * ALI * * Support for 4096 colours. * * Issues: * - NetHack 3.2/3.3 .TXT readers have a bug which causes them * to overflow the "c" array in read_text_colormap if more than * one character is encountered in the set A-Za-z0-9 where it * is expecting a colour key. This is because no maximum field * width has been specified for the %[...] scan format. * * Design goals: * - Capable of reading and writing 62/4096 colour files * - Writes 62 files which NetHack 3.2/3.3 can read. * - Writes 4096 files which NetHack 3.2/3.3 fails gracefully on. * * We achieve this by introducing two new legal characters "_" and "$". * This brings the number of legal characters to 64 which is a nice round * number and also means that as long as we arrange for the first colour * key in a 4096 file to start with "_", 3.2/3.3 readers will fail without * crashing. Instead they will see no valid colour map. The error message * thus generated (no colormap set yet) is admittedly not very informative. */ /* Ugh. DICE doesn't like %[A-Z], so we have to spell it out... */ #define FORMAT_STRING \ "%2[_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789$] = (%d, %d, %d) " static char bysx2char(i) int i; { char c; if (!i) c = '_'; else if (i < 27) c = 'A' + i - 1; else if (i < 53) c = 'a' + i - 27; else if (i < 63) c = '0' + i - 53; else c = '$'; return c; } static int char2bysx(c) char c; { int i; if ( c == '_' ) i = 0; else if (c >= 'A' && c <= 'Z') i = c - 'A' + 1; else if (c >= 'a' && c <= 'z') i = c - 'a' + 27; else if (c >= '0' && c <= '9') i = c - '0' + 53; else if ( c == '$' ) i = 63; else i = -1; return i; } static void read_text_colormap(txtfile) FILE *txtfile; { int i, n, r, g, b; char c[3]; for (i = 0; i < TEXTCOLORMAPSPACE; i++) color_index[i] = -1; num_colors = 0; while (fscanf(txtfile, FORMAT_STRING, c, &r, &g, &b) == 4) { if (c[1]) n=char2bysx(c[0]) * 64 + char2bysx(c[1]); else n=char2bysx(c[0]); if (n >= 0 && n < TEXTCOLORMAPSPACE) color_index[n] = num_colors; else { Fprintf(stderr, "error: Illegal color in colormap %s\n", c); continue; } ColorMap[CM_RED][num_colors] = r; ColorMap[CM_GREEN][num_colors] = g; ColorMap[CM_BLUE][num_colors] = b; num_colors++; } colorsinmap = num_colors; } #undef FORMAT_STRING static boolean write_text_colormap(txtfile) FILE *txtfile; { int i; char c[3]="?"; num_colors = colorsinmainmap; if (num_colors > MAXCOLORMAPSIZE) { Fprintf(stderr, "too many colors (%d)\n", num_colors); return FALSE; } for (i = 0; i < num_colors; i++) { if (num_colors > 62) { c[0] = bysx2char(i / 64); c[1] = bysx2char(i % 64); } else c[0] = bysx2char(i + 1); strcpy(charcolors[i], c); Fprintf(txtfile, "%s = (%d, %d, %d)\n", c, (int)MainColorMap[CM_RED][i], (int)MainColorMap[CM_GREEN][i], (int)MainColorMap[CM_BLUE][i]); } return TRUE; } static boolean peek_txttile_info(txtfile, ttype, number, name) FILE *txtfile; char ttype[BUFSZ]; int *number; char name[BUFSZ]; { long offset; int retval; offset = ftell(txtfile); retval = fscanf(txtfile, "# %s %d (%[^)])", ttype, number, name) == 3; (void) fseek(txtfile, offset, SEEK_SET); return retval; } static boolean read_txttile_info(txtfile, pixels, ttype, number, name) FILE *txtfile; pixel (*pixels)[MAX_TILE_X]; char ttype[BUFSZ]; int *number; char name[BUFSZ]; { int i, j, k, n; const char *fmt_string; char c[3]; if (fscanf(txtfile, "# %s %d (%[^)])", ttype, number, name) <= 0) { return FALSE; } /* look for non-whitespace at each stage */ if (fscanf(txtfile, "%1s", c) < 0) { Fprintf(stderr, "unexpected EOF\n"); return FALSE; } if (c[0] != '{') { Fprintf(stderr, "didn't find expected '{'\n"); return FALSE; } fmt_string = colorsinmap > 64 ? "%2s" : "%1s"; for (j = 0; j < tile_y; j++) { for (i = 0; i < tile_x; i++) { if (fscanf(txtfile, fmt_string, c) < 0) { Fprintf(stderr, "unexpected EOF\n"); return FALSE; } if (c[1]) n=char2bysx(c[0]) * 64 + char2bysx(c[1]); else n=char2bysx(c[0]); if (n >= 0 && n < TEXTCOLORMAPSPACE) k = color_index[n]; else k = -1; if (k == -1) Fprintf(stderr, "%s %d (%s): color %s not in colormap!\n", ttype, *number, name, c); else { pixels[j][i].r = ColorMap[CM_RED][k]; pixels[j][i].g = ColorMap[CM_GREEN][k]; pixels[j][i].b = ColorMap[CM_BLUE][k]; } } } if (fscanf(txtfile, "%1s ", c) < 0) { Fprintf(stderr, "unexpected EOF\n"); return FALSE; } if (c[0] != '}') { Fprintf(stderr, "didn't find expected '}'\n"); return FALSE; } #ifdef _DCC /* DICE again... it doesn't seem to eat whitespace after the } like * it should, so we have to do so manually. */ while ((*c = fgetc(txtfile)) != EOF && isspace(*c)) ; ungetc(*c, txtfile); #endif return TRUE; } static boolean read_txttile(txtfile, pixels) FILE *txtfile; pixel (*pixels)[MAX_TILE_X]; { int ph, i; int tile_no; const char *p; char buf[BUFSZ], ttype[BUFSZ]; if (!read_txttile_info(txtfile, pixels, ttype, &i, buf)) return FALSE; ph = strcmp(ttype, "placeholder") == 0; if (!ph && strcmp(ttype,"tile") != 0) Fprintf(stderr, "Keyword \"%s\" unexpected for entry %d\n", ttype, i); if (tile_set != 0) { /* check tile name, but not relative number, which will * change when tiles are added */ p = tilename(tile_set, tile_set_indx); if (p && strcmp(p, buf)) { Fprintf(stderr, "warning: for tile %d (numbered %d) of %s,\n", tile_set_indx, i, TEXT_SETS(tile_set-1)); Fprintf(stderr, "\tfound '%s' while expecting '%s'\n", buf, p); } } tile_no=i; tile_set_indx++; if ( ph ) { /* remember it for later */ memcpy( placeholder, pixels, sizeof(placeholder) ); } return TRUE; } static void write_txttile_info(txtfile, pixels, type, number, name) FILE *txtfile; pixel (*pixels)[MAX_TILE_X]; const char *type; int number; const char *name; { int i, j, k; if (name) Fprintf(txtfile, "# %s %d (%s)\n", type, number, name); else Fprintf(txtfile, "# %s %d (null)\n", type, number); Fprintf(txtfile, "{\n"); for (j = 0; j < tile_y; j++) { Fprintf(txtfile, " "); for (i = 0; i < tile_x; i++) { for (k = 0; k < colorsinmainmap; k++) { if (MainColorMap[CM_RED][k] == pixels[j][i].r && MainColorMap[CM_GREEN][k] == pixels[j][i].g && MainColorMap[CM_BLUE][k] == pixels[j][i].b) break; } if (k >= colorsinmainmap) Fprintf(stderr, "color not in colormap!\n"); (void) fputs(charcolors[k], txtfile); } Fprintf(txtfile, "\n"); } Fprintf(txtfile, "}\n"); } static void write_txttile(txtfile, pixels) FILE *txtfile; pixel (*pixels)[MAX_TILE_X]; { const char *p; const char *type; if ( memcmp(placeholder, pixels, sizeof(placeholder)) == 0 ) type = "placeholder"; else type = "tile"; if (tile_set == 0) p = "unknown"; else p = tilename(tile_set, tile_set_indx); write_txttile_info(txtfile, pixels, type, tile_set_indx, p); tile_set_indx++; } /* initialize main colormap from globally accessed ColorMap */ void init_colormap() { int i; colorsinmainmap = colorsinmap; for (i = 0; i < colorsinmap; i++) { MainColorMap[CM_RED][i] = ColorMap[CM_RED][i]; MainColorMap[CM_GREEN][i] = ColorMap[CM_GREEN][i]; MainColorMap[CM_BLUE][i] = ColorMap[CM_BLUE][i]; } } /* merge new colors from ColorMap into MainColorMap */ void merge_colormap() { int i, j; pixel trans_pix = DEFAULT_BACKGROUND; for (i = 0; i < colorsinmap; i++) { #ifdef FUZZ int fuzz = -1, totalfuzz; pixval best_r, best_g, best_b; #endif for (j = 0; j < colorsinmainmap; j++) { if (MainColorMap[CM_RED][j] == ColorMap[CM_RED][i] && MainColorMap[CM_GREEN][j] == ColorMap[CM_GREEN][i] && MainColorMap[CM_BLUE][j] == ColorMap[CM_BLUE][i]) break; /* [AJA] make sure that we DO NOT convert any * colors into the transparency color. */ if (MainColorMap[CM_RED][j] == trans_pix.r && MainColorMap[CM_GREEN][j] == trans_pix.g && MainColorMap[CM_BLUE][j] == trans_pix.b) { continue; } #ifdef FUZZ if ((fuzz == -1) || ((fuzz >= MAX3( ABS(MainColorMap[CM_RED][j] - ColorMap[CM_RED][i]), ABS(MainColorMap[CM_GREEN][j] - ColorMap[CM_GREEN][i]), ABS(MainColorMap[CM_BLUE][j] - ColorMap[CM_BLUE][i]))) && (totalfuzz > (ABS(MainColorMap[CM_RED][j] - ColorMap[CM_RED][i]) + ABS(MainColorMap[CM_GREEN][j] - ColorMap[CM_GREEN][i]) + ABS(MainColorMap[CM_BLUE][j] - ColorMap[CM_BLUE][i]))))) { fuzz = MAX3( ABS(MainColorMap[CM_RED][j] - ColorMap[CM_RED][i]), ABS(MainColorMap[CM_GREEN][j] - ColorMap[CM_GREEN][i]), ABS(MainColorMap[CM_BLUE][j] - ColorMap[CM_BLUE][i])); totalfuzz = ABS(MainColorMap[CM_RED][j] - ColorMap[CM_RED][i]) + ABS(MainColorMap[CM_GREEN][j] - ColorMap[CM_GREEN][i]) + ABS(MainColorMap[CM_BLUE][j] - ColorMap[CM_BLUE][i]); best_r = MainColorMap[CM_RED][j]; best_g = MainColorMap[CM_GREEN][j]; best_b = MainColorMap[CM_BLUE][j]; } #endif } if (j >= colorsinmainmap) { /* new color */ #ifdef FUZZ if (colorsinmainmap >= MAXCOLORMAPSIZE) { Fprintf(stderr, "Changing %i,%i,%i => %i,%i,%i (fuzz max(%i), total(%i)).\n", ColorMap[CM_RED][i],ColorMap[CM_GREEN][i],ColorMap[CM_BLUE][i], best_r, best_g, best_b, fuzz, totalfuzz); ColorMap[CM_RED][i] = best_r; ColorMap[CM_GREEN][i] = best_g; ColorMap[CM_BLUE][i] = best_b; } else { j = colorsinmainmap; MainColorMap[CM_RED][j] = ColorMap[CM_RED][i]; MainColorMap[CM_GREEN][j] = ColorMap[CM_GREEN][i]; MainColorMap[CM_BLUE][j] = ColorMap[CM_BLUE][i]; colorsinmainmap++; } #else if (colorsinmainmap >= MAXCOLORMAPSIZE) { Fprintf(stderr, "Too many colors to merge -- excess ignored.\n"); } j = colorsinmainmap; MainColorMap[CM_RED][j] = ColorMap[CM_RED][i]; MainColorMap[CM_GREEN][j] = ColorMap[CM_GREEN][i]; MainColorMap[CM_BLUE][j] = ColorMap[CM_BLUE][i]; colorsinmainmap++; #endif } } } /* * [ALI] * * This function accepts a slightly different syntax than read_txttile(). * We insist that each line of pixels is encoded as one line in the file. * This restriction is necessary so that we can detect the tile width. * We also allow white space inside a two-character colour key, which is * not actually legal, but there seems little point complicating the code * just to detect it. */ static boolean set_tile_size(txtfile) FILE *txtfile; { int i, j, ch; long pos; char c[2]; pos = ftell(txtfile); if (fscanf(txtfile, "# %*s %*d (%*[^)]%c",c) <= 0 || c[0] != ')') { Fprintf(stderr, "no tiles in file\n"); return FALSE; } if (fscanf(txtfile, "%1s", c) < 0) { Fprintf(stderr, "unexpected EOF\n"); return FALSE; } if (c[0] != '{') { Fprintf(stderr, "didn't find expected '{'\n"); return FALSE; } do ch = getc(txtfile); while (ch == '\n' || ch =='\r'); for (j = 0; ; j++) { for(i = 0; ; i++) { while (ch == ' ' || ch == '\t') ch = getc(txtfile); if (ch == '_' || ch >= 'A' && ch <= 'Z' || ch >= 'a' && ch <= 'z' || ch >= '0' && ch <= '9' || ch == '$') ch = getc(txtfile); else break; } if (!i && ch == '}') break; if (ch != '\n' && ch != '\r') { Fprintf(stderr, "unexpected character %c\n",ch); return FALSE; } else ch = getc(txtfile); if (colorsinmap > 64) { if (i & 1) { Fprintf(stderr, "half a pixel?\n"); return FALSE; } i /= 2; } if (tile_x < 0) tile_x = i; else if (tile_x != i) { Fprintf(stderr, "tile width mismatch %d != %d\n", tile_x, i); return FALSE; } } if (tile_y < 0) tile_y = j; else if (tile_y != j) { Fprintf(stderr, "tile height mismatch %d != %d\n", tile_y, j); return FALSE; } fseek(txtfile, pos, SEEK_SET); return TRUE; } boolean read_text_file_colormap(filename) const char *filename; { FILE *fp; fp = fopen(filename, RDTMODE); if (fp == (FILE *)0) { Fprintf(stderr, "cannot open text file %s\n", filename); return FALSE; } read_text_colormap(fp); fclose(fp); return TRUE; } boolean fopen_text_file(filename, type) const char *filename; const char *type; { const char *p; int i; int write_mode; FILE *fp; if (!strcmp(type, RDTMODE)) write_mode = FALSE; else if (!strcmp(type, WRTMODE)) { /* Seems like Mingw32's fscanf is confused by the CR/LF issue */ /* Force text output in this case only */ #ifdef WIN32 type = "w+"; #endif write_mode = TRUE; } else { Fprintf(stderr, "bad mode (%s) for fopen_text_file\n", type); return FALSE; } if ((write_mode ? out_file : in_file) != (FILE *)0) { Fprintf(stderr, "can only open one text file at at time\n"); return FALSE; } fp = fopen(filename, type); if (fp == (FILE *)0) { Fprintf(stderr, "cannot open text file %s\n", filename); return FALSE; } p = rindex(filename, '/'); if (p) p++; else p = filename; if (!write_mode) { in_file = fp; /* Fill placeholder with noise */ if ( !placeholder_init ) { placeholder_init++; for ( i=0; i<sizeof(placeholder); i++ ) ((char*)placeholder)[i]=i%256; } read_text_colormap(in_file); if (!set_tile_size(in_file)) return FALSE; if (!colorsinmainmap) init_colormap(); else merge_colormap(); } else { out_file = fp; if (!colorsinmainmap) { Fprintf(stderr, "no colormap set yet\n"); return FALSE; } if (tile_x < 0 || tile_y < 0) { Fprintf(stderr, "no tile size set yet\n"); return FALSE; } if (!write_text_colormap(out_file)) return FALSE; } tile_set = 0; for (i = 0; i < SIZE(std_text_sets); i++) { if (!strcmp(p, TEXT_SETS(i))) tile_set = i+1; } tile_set_indx = 0; return TRUE; } boolean peek_text_tile_info(ttype, number, name) char ttype[BUFSZ]; int *number; char name[BUFSZ]; { return(peek_txttile_info(in_file, ttype, number, name)); } boolean read_text_tile_info(pixels, ttype, number, name) pixel (*pixels)[MAX_TILE_X]; char *ttype; int *number; char *name; { return read_txttile_info(in_file, pixels, ttype, number, name); } boolean read_text_tile(pixels) pixel (*pixels)[MAX_TILE_X]; { return(read_txttile(in_file, pixels)); } boolean write_text_tile_info(pixels, ttype, number, name) pixel (*pixels)[MAX_TILE_X]; const char *ttype; int number; const char *name; { write_txttile_info(out_file, pixels, ttype, number, name); return TRUE; } boolean write_text_tile(pixels) pixel (*pixels)[MAX_TILE_X]; { write_txttile(out_file, pixels); return TRUE; } boolean fclose_text_file() { boolean ret = FALSE; if (in_file) { ret |= !!fclose(in_file); in_file = (FILE *)0; } if (out_file) { ret |= !!fclose(out_file); out_file = (FILE *)0; } return ret; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/share/oth3dse.txt�������������������������������������������������������������0000664�0000764�0000764�00000267445�10545462317�015707� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������__ = (71, 108, 108) _A = (0, 0, 0) _B = (0, 0, 16) _C = (0, 0, 32) _D = (0, 0, 48) _E = (0, 0, 64) _F = (0, 0, 96) _G = (0, 0, 128) _H = (0, 0, 160) _I = (0, 0, 192) _J = (0, 0, 224) _K = (0, 0, 255) _L = (0, 16, 0) _M = (0, 16, 16) _N = (0, 24, 0) _O = (0, 24, 24) _P = (0, 24, 48) _Q = (0, 32, 0) _R = (0, 32, 32) _S = (0, 32, 64) _T = (0, 48, 0) _U = (0, 48, 24) _V = (0, 48, 48) _W = (0, 48, 96) _X = (0, 64, 0) _Y = (0, 64, 32) _Z = (0, 64, 64) _a = (0, 64, 128) _b = (0, 80, 160) _c = (0, 96, 0) _d = (0, 96, 48) _e = (0, 96, 96) _f = (0, 96, 192) _g = (0, 112, 224) _h = (0, 128, 0) _i = (0, 128, 64) _j = (0, 128, 128) _k = (0, 128, 255) _l = (0, 144, 0) _m = (0, 160, 0) _n = (0, 160, 80) _o = (0, 160, 160) _p = (0, 182, 255) _q = (0, 192, 0) _r = (0, 192, 96) _s = (0, 192, 192) _t = (0, 224, 0) _u = (0, 224, 112) _v = (0, 224, 224) _w = (0, 255, 0) _x = (0, 255, 128) _y = (0, 255, 255) _z = (16, 0, 0) _0 = (16, 0, 16) _1 = (16, 16, 0) _2 = (16, 16, 16) _3 = (16, 48, 48) _4 = (24, 0, 0) _5 = (24, 24, 0) _6 = (24, 24, 48) _7 = (24, 48, 0) _8 = (24, 48, 24) _9 = (24, 48, 48) _$ = (32, 0, 0) A_ = (32, 0, 32) AA = (32, 32, 0) AB = (32, 32, 32) AC = (32, 64, 0) AD = (32, 64, 32) AE = (32, 64, 64) AF = (32, 242, 186) AG = (48, 0, 0) AH = (48, 0, 48) AI = (48, 12, 0) AJ = (48, 24, 0) AK = (48, 24, 24) AL = (48, 36, 0) AM = (48, 48, 0) AN = (48, 48, 24) AO = (48, 48, 48) AP = (48, 48, 96) AQ = (48, 96, 0) AR = (48, 96, 48) AS = (48, 96, 96) AT = (64, 0, 0) AU = (64, 0, 32) AV = (64, 0, 64) AW = (64, 0, 128) AX = (64, 16, 0) AY = (64, 32, 0) AZ = (64, 32, 32) Aa = (64, 32, 64) Ab = (64, 48, 0) Ac = (64, 64, 0) Ad = (64, 64, 32) Ae = (64, 64, 64) Af = (64, 64, 128) Ag = (64, 128, 0) Ah = (64, 128, 64) Ai = (64, 128, 128) Aj = (72, 108, 108) Ak = (80, 0, 160) Al = (80, 80, 80) Am = (80, 80, 160) An = (80, 160, 0) Ao = (80, 160, 80) Ap = (80, 160, 160) Aq = (96, 0, 0) Ar = (96, 0, 48) As = (96, 0, 96) At = (96, 0, 192) Au = (96, 16, 0) Av = (96, 24, 0) Aw = (96, 48, 0) Ax = (96, 48, 48) Ay = (96, 48, 96) Az = (96, 72, 0) A0 = (96, 96, 0) A1 = (96, 96, 48) A2 = (96, 96, 96) A3 = (96, 96, 128) A4 = (96, 96, 192) A5 = (96, 128, 96) A6 = (96, 128, 128) A7 = (96, 192, 0) A8 = (96, 192, 96) A9 = (96, 192, 192) A$ = (96, 144, 178) B_ = (104, 84, 31) BA = (108, 144, 182) BB = (108, 255, 0) BC = (112, 0, 224) BD = (112, 112, 112) BE = (112, 112, 224) BF = (112, 160, 160) BG = (112, 224, 0) BH = (112, 224, 112) BI = (112, 224, 224) BJ = (117, 105, 88) BK = (120, 120, 160) BL = (120, 160, 120) BM = (120, 160, 160) BN = (128, 0, 0) BO = (128, 0, 64) BP = (128, 0, 128) BQ = (128, 0, 255) BR = (128, 32, 0) BS = (128, 64, 0) BT = (128, 64, 64) BU = (128, 64, 128) BV = (128, 90, 72) BW = (128, 96, 0) BX = (128, 96, 96) BY = (128, 96, 128) BZ = (128, 112, 32) Ba = (128, 128, 0) Bb = (128, 128, 64) Bc = (128, 128, 96) Bd = (128, 128, 128) Be = (128, 128, 255) Bf = (128, 255, 0) Bg = (128, 255, 128) Bh = (128, 255, 255) Bi = (144, 72, 0) Bj = (144, 135, 110) Bk = (144, 144, 144) Bl = (144, 144, 192) Bm = (144, 192, 144) Bn = (144, 192, 192) Bo = (160, 0, 0) Bp = (160, 0, 80) Bq = (160, 0, 160) Br = (160, 40, 0) Bs = (160, 80, 0) Bt = (160, 80, 80) Bu = (160, 80, 160) Bv = (160, 120, 0) Bw = (160, 120, 120) Bx = (160, 120, 160) By = (160, 160, 0) Bz = (160, 160, 80) B0 = (160, 160, 120) B1 = (160, 160, 160) B2 = (160, 160, 224) B3 = (165, 118, 96) B4 = (168, 168, 224) B5 = (168, 224, 168) B6 = (168, 224, 224) B7 = (170, 136, 52) B8 = (170, 154, 128) B9 = (176, 176, 176) B$ = (178, 64, 0) C_ = (178, 224, 16) CA = (182, 72, 0) CB = (192, 0, 0) CC = (192, 0, 96) CD = (192, 0, 192) CE = (192, 48, 0) CF = (192, 96, 0) CG = (192, 96, 96) CH = (192, 96, 192) CI = (192, 144, 0) CJ = (192, 144, 144) CK = (192, 144, 192) CL = (192, 160, 64) CM = (192, 192, 0) CN = (192, 192, 96) CO = (192, 192, 144) CP = (192, 192, 192) CQ = (192, 192, 255) CR = (192, 255, 192) CS = (192, 255, 255) CT = (202, 144, 114) CU = (208, 168, 80) CV = (208, 208, 208) CW = (210, 210, 178) CX = (218, 218, 182) CY = (224, 0, 0) CZ = (224, 0, 112) Ca = (224, 0, 224) Cb = (224, 56, 0) Cc = (224, 112, 0) Cd = (224, 112, 112) Ce = (224, 112, 224) Cf = (224, 168, 0) Cg = (224, 168, 168) Ch = (224, 168, 224) Ci = (224, 192, 160) Cj = (224, 224, 0) Ck = (224, 224, 112) Cl = (224, 224, 168) Cm = (224, 224, 224) Cn = (229, 162, 130) Co = (240, 240, 240) Cp = (242, 0, 0) Cq = (242, 96, 0) Cr = (242, 196, 77) Cs = (248, 224, 96) Ct = (252, 252, 153) Cu = (255, 0, 0) Cv = (255, 0, 128) Cw = (255, 0, 255) Cx = (255, 64, 0) Cy = (255, 108, 0) Cz = (255, 128, 0) C0 = (255, 128, 128) C1 = (255, 128, 255) C2 = (255, 182, 144) C3 = (255, 192, 0) C4 = (255, 192, 192) C5 = (255, 192, 255) C6 = (255, 211, 176) C7 = (255, 255, 0) C8 = (255, 255, 128) C9 = (255, 255, 192) C$ = (255, 255, 255) # tile 19 (floor of a room) { ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE ________________________________AE_VAO_VAO_VABAE_R_R_RAO_VAO_VAO_VAO_VAO_VAO_VAO_R_R_VAO_VAO_V_O ______________________________AEAO_VAEAEAEAE_VAO_R_R_VAEAEAEAEAEAEAEAEAE_VAEAE_O_RAOAEAEAEAB_R__ ______________________________AE_VAEAOAEAOAEAE_V_R_RAOAEAEAEAEABAEAEAEAEAEAEAB_RAO_VAEABAEAE_R__ ____________________________AEAOAEAEAEAEAEAEAO_V_R_VAB_VAEAEAEAEAEABAEAEAE_V_R_VAEAEAEAE_V_R____ ____________________________AE_VAEAEAE_VAEAEAEAO_RABAEAO_VAO_VAEABAE_VAEAB_RABAEAOAEAEAEAO_R____ __________________________AEAO_VAEAEAOAE_VAE_V_RAE_V_O_R_R_R_R_R_VAO_O_R_R_R_R_VAO_VAO_V_R______ __________________________AEAEAEAEAEAEAEAEAEAO_R_O_RAO_VAO_VAO_R_R_R_RAO_VAO_R_R_R_R_VAO_R______ ________________________AEAB_VAEAOAEAEAEAB_R_RAO_VAO_VAEAO_VAO_R_R_VAOAE_VAO_VAO_R_R_R_R________ ________________________AEAEAEAE_VAO_VAO_V_RAO_VAEAEAEAEAE_VAO_V_RAOAEAEAEAEAE_VAE_R_R_R________ ______________________AE_O_RAO_V_R_R_R_R_R_VAEAEAEAOAE_VAEAEAO_R_VAEAEAEAEAEAEAEAB_R_R__________ ______________________AE_R_R_R_R_VAO_VAO_RAOAOAEAE_VAEAEAEAE_V_R_RABAEAEABAEAB_R_R_R_R__________ ____________________AEAEABAEABAEAEAB_VAE_O_VAOAEAEAEAEAEAEAO_R_R_RAE_VAB_R_R_R_R_R_R____________ ____________________AEAB_VAEAEAEAEAEAEAB_R_VAO_VAEAEAOAEAO_V_R_R_R_R_R_R_R_R_RABAE_R____________ __________________AEAEAEAEAEAE_VAEAE_V_R_RAOAEAEAEAEAE_V_R_RAO_VAO_V_R_R_R_RAE_V_O______________ __________________AEABAE_VAEAOAEAEAEAOAO_R_RAO_VAO_VAO_R_RAO_VAEAEABAE_R_RAO_VAO_R______________ ________________AEAEAEAOAEAEAEAEAE_V_V_R_R_R_R_R_V_R_R_R_VAEAEAE_VAO_V_R_VAEAB_R________________ ________________AE_VAEAEAEAEAEAO_VAO_R_RAO_VAO_R_R_R_R_VAOAEAEAOAE_VAO_RAOAEAE_R________________ ______________AEAO_VAB_VAE_VAB_R_RAEAB_VAEAEABAE_O_RAOAEAEAEAEAEAO_V_R_VAO_V_R__________________ ______________AE_R_R_R_R_R_R_R_RAO_VAEAEAEAEAE_VAO_R_VAEAE_VAEAEAE_R_R_VAEAO_R__________________ ____________AEAEABAEABAE_O_R_R_VAEAEAEAOAEAEAE_V_RAOAEAEAOAEAEAB_RAOAOAE_V_R____________________ ____________AE_VAB_VAE_VABAE_OAEAOAEAEAEAEAE_VAO_RAB_VAEAE_VAE_V_R_VAE_V_R_R____________________ __________AEAOAEAEAEAEAE_V_R_O_VAO_VAO_VAOAE_O_R_RAEABAEAEAEAO_R_R_O_R_R_R______________________ __________AE_VAEABAEAEAE_VAO_R_RABAE_R_R_R_R_R_R_R_OAEABAEAE_R_RAO_VAO_R_R______________________ ________AEAOAEAEAEAOAEAEAO_V_R_R_R_RABAEAB_VAO_VAO_R_R_VAB_R_VAOAE_VAO_R________________________ ________AE_VAEAEAEAEAEAEAEAO_R_R_R_VAO_VAEAE_VAEAO_VAO_R_R_RAOAEAEAE_V_R________________________ ______AEAOAE_VAEAEAEAEAE_VAO_RAO_VAEAEAEAEAEAOAEAE_VAO_R_R_VAEAOAEAO_R__________________________ ______AE_VAEAE_VAEAEAEAEAO_V_R_VAEAEABAEAEAEAEAEAEAEAO_V_RAOAEAEAE_V_R__________________________ ____AEAOAEAEAEAEAE_VAE_VAO_RAO_VAEAEAEAEAEAE_VAEAE_VAO_R_VAOAEAEAO_R____________________________ ____AE_VAOAEAEAEAEAEAOAO_V_OAEABAEAEAEAEAEAEAEAE_VAO_R_R_VAEAEAO_V_R____________________________ __AEAO_VAO_VAO_VAO_V_V_R_R_R_VAO_VAO_VABAEABAEAB_R_R_R_RAO_V_V_R_R______________________________ ___V_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R______________________________ } # tile 20 (corridor) { ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________AEAB_VAO_VAO_VAO_VAO_VAO_VAO_VAO_VAO_VAO_VAO_VAO_VAO_VAO_V_OAO_R _________________________________V_M_M_V_OAE_R_R_M_M_R_RABAE_R_R_R_V_R_R_R_R_R_M_M_MABAE_R_R_A_A ______________________________AO_MAO_RAO_R_R_R_R_M_M_M_V_R_RAO_O_R_R_R_R_R_R_R_MAE_O_O_R_O_R_A__ _______________________________V_R_V_R_V_RAB_R_R_M_M_M_R_R_V_R_R_RAO_OAE_R_R_R_MAB_MAE_R_R_R_A__ ____________________________AO_R_OAO_R_R_R_R_R_R_MAO_V_R_O_RAO_R_R_R_RAB_R_R_MAE_R_OAB_R_R_A____ _____________________________V_OAE_R_R_R_O_R_R_R_M_R_R_R_R_R_R_R_R_R_R_R_R_M_R_O_R_R_R_R_R_A____ __________________________AO_V_R_RAB_R_R_RAE_O_M_M_R_M_M_M_M_M_M_R_R_M_M_M_M_M_R_R_R_R_R_A______ __________________________AE_R_R_R_R_O_O_R_R_R_M_M_MAO_O_R_O_O_M_M_M_OABAE_R_M_M_M_M_R_R_A______ ________________________AB_R_RAE_RAE_O_O_R_M_MAEAB_R_R_R_R_R_R_M_MAE_O_R_R_R_R_R_M_M_M_M________ ________________________AE_R_R_R_O_R_R_R_R_OAB_R_O_R_R_OAE_R_R_R_M_OAE_RAB_R_O_R_R_M_M_M________ ______________________AB_M_M_R_R_M_M_M_M_MAE_RAE_O_RAE_OAB_R_R_MAB_V_R_RAE_R_R_R_R_M_M__________ ______________________AE_M_M_M_MAE_R_R_R_MAB_O_RAB_R_R_R_R_R_R_MAE_RAO_R_R_R_R_M_M_M_M__________ _____________________V_RAO_VAB_RAB_R_R_R_MAE_O_R_R_O_R_RAE_O_M_M_R_R_R_R_M_M_M_MAE_A____________ ____________________AEAB_R_R_RAE_RAE_R_R_M_V_R_RAE_R_R_R_R_R_M_M_M_M_M_M_M_M_M_V_O_A____________ __________________ABAE_O_R_R_O_R_OAB_R_M_M_O_R_O_R_R_R_R_M_MAEAB_R_R_M_M_MAO_R_R_A______________ ___________________V_R_OAE_R_R_R_O_R_R_R_M_M_R_R_R_R_O_M_OAB_R_R_R_R_R_M_M_V_R_R_A______________ ________________AO_RAE_O_O_RAE_O_O_R_R_M_M_M_M_M_O_M_M_MAE_R_RAE_O_R_R_M_RAO_R_A________________ _________________V_R_O_R_R_O_R_R_R_R_M_M_RAO_R_M_M_M_OAB_O_O_O_R_R_O_R_MAE_R_R_A________________ ______________AO_M_R_R_R_R_R_R_M_MAEAB_R_V_R_R_R_M_M_RAE_OAE_O_R_R_R_M_O_R_R_A__________________ _______________V_M_M_M_M_M_M_M_OAB_R_R_R_O_R_R_R_R_OAB_R_O_R_R_R_R_M_M_RAB_R_A__________________ ____________AO_M_MAEAB_V_M_M_MAE_RAB_R_O_R_R_R_R_MAE_R_R_R_O_R_R_M_R_R_R_R_A____________________ _____________VAEAB_R_R_RAO_R_M_R_R_RAE_R_OAE_R_O_M_O_R_OAE_R_R_R_M_R_R_R_M_M____________________ __________AO_R_RAE_OAE_O_R_M_M_R_R_R_R_R_O_O_M_M_M_R_R_R_R_R_O_M_M_M_M_M_M______________________ ___________V_RAB_RAB_R_R_O_R_M_M_R_R_R_M_M_M_M_M_M_M_R_R_R_O_M_MAE_R_R_M_M______________________ ________AO_V_R_R_R_R_R_R_R_R_M_M_M_MAEAB_VAO_R_R_R_M_M_O_O_MAB_RAB_R_R_A________________________ ________AE_R_R_O_O_OAE_R_R_R_M_M_OAB_OAE_R_R_OAE_R_R_R_M_M_M_VAE_R_R_R_A________________________ ______AB_R_R_R_R_R_R_R_R_R_R_MAE_R_R_R_O_R_R_R_R_R_R_R_M_MAO_R_R_O_R_A__________________________ ______AE_R_R_O_RAEAB_OAE_R_R_MABAE_RAB_R_RAB_R_R_R_R_R_R_M_V_OAE_R_R_A__________________________ _____V_R_R_R_R_R_R_R_R_R_R_M_V_R_R_R_R_RAE_R_RAB_R_R_R_M_R_R_O_R_R_A____________________________ ____AO_R_R_R_R_O_R_R_R_R_R_M_R_R_RABAE_R_R_OAE_R_R_O_M_M_R_R_O_R_R_A____________________________ ___V_M_R_R_R_R_R_R_R_R_M_M_M_R_R_R_R_R_R_R_R_R_O_M_M_M_M_R_R_R_M_M______________________________ ___R_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M______________________________ } # tile 21 (lit corridor) { ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE ________________________________AE_M_MAE_OAE_R_R_M_M_R_OAEAE_OAE_RABAEAE_R_R_R_M_M_MAEAEAE_R_A_A ______________________________AE_MABAE_V_OABAE_R_M_M_MAEAEAEABAE_R_R_O_VAEAO_R_MAEAEABAE_O_R_A__ ______________________________AEAEAE_RAEAEAE_RAE_M_M_MAEAE_VAE_R_RAE_RAO_R_V_R_MAEAEAE_VAE_R_A__ ____________________________AEAEAEAEAEAB_V_R_R_R_MAEAEABAEAEAEAE_O_V_RAE_R_R_MABAE_VAOAE_R_A____ ____________________________AEABAEAE_VAEAEAO_R_R_M_O_VAEABAE_R_RAOAE_R_RAO_M_RAEAEAE_RABAE_A____ __________________________AEAE_RABAE_O_R_VAE_R_M_M_R_M_M_M_M_M_M_R_R_M_M_M_M_MAB_RAE_R_R_A______ __________________________AEAE_VAE_RAE_O_R_R_R_M_M_MAE_MAE_O_O_M_M_M_MAEAEAE_M_M_O_M_R_R_A______ ________________________AEABAEAB_RAO_R_O_R_M_MAEAEAOAE_RABAE_R_M_MAEAEABAE_RAE_R_M_M_M_M________ ________________________AE_R_R_R_R_R_RAE_R_MAEAEAEAE_V_R_V_RAE_R_MAE_VAE_V_R_OAE_R_M_M_M________ ______________________AE_M_M_R_R_M_M_M_M_MAEABAEAE_OAEAEAO_O_R_MAEAEAE_RAE_R_R_R_R_M_M__________ ______________________AE_M_M_M_MAEAE_R_R_MAEAEAEAEAOAE_R_R_V_R_MAEAEAO_R_VAO_R_M_M_M_M__________ ____________________AE_RAEAEAE_RAE_O_R_R_M_VAE_V_R_VAOAEAO_R_M_MAE_RAO_R_M_M_M_MAE_A____________ ____________________AEAE_RAE_RAB_OAEAE_R_MAEAO_R_VAO_R_RAE_R_M_M_M_M_M_M_M_M_MAE_R_A____________ __________________AEAEAE_VAE_RAEAEAB_R_M_MAEAOAE_V_RAO_R_M_MAEAE_O_R_M_M_MABAE_V_A______________ __________________AEAE_OAEAE_RAB_O_R_R_R_M_MAEAO_RAE_O_M_MAEAEAE_OAE_R_M_MAEAOAE_A______________ ________________AE_RABAE_OAE_VAE_OAE_R_M_M_M_M_M_O_M_M_MAEAE_OAE_O_RAB_OAE_VAO_A________________ ________________AE_RAEAO_VAEAO_R_R_R_M_MAEABAE_M_M_M_MAEAEABAE_VAB_O_R_MAOAE_R_A________________ ______________AE_M_RAEAE_R_R_R_M_MAEAE_R_V_RABAE_M_MAE_V_RAEAO_RAE_R_M_R_VAO_A__________________ ______________AE_M_M_M_M_M_M_M_OABAEAEAE_OAEAE_VAE_MAOAE_R_RAO_V_R_M_M_VAO_R_A__________________ ____________AE_M_MAEAEAE_M_M_MAEAEAE_RAOAEABAE_O_M_V_RAO_VAO_RAO_MAOAE_V_R_A____________________ ____________AEAEAEAEAB_RAB_R_MAEAEAO_V_R_VAE_R_O_MAEAE_RAE_R_R_R_M_RAO_R_M_M____________________ __________AEAE_RAEAE_V_R_R_M_MAE_V_RAE_R_O_O_M_M_M_OAEAEAEAE_M_M_M_M_M_M_M______________________ __________AEAEAE_RAB_R_OAE_R_M_M_RAO_R_M_M_M_M_M_M_MAE_R_R_M_M_MAEAEAE_M_M______________________ ________AEAE_RAEAEAE_OAB_R_R_M_M_M_MAEAEAEAE_RAB_R_M_M_O_O_MABAE_VAO_R_A________________________ ________AE_RABAE_VAO_V_RAE_R_M_M_MAEAEAB_OAE_RAE_RAE_R_M_M_OAEAOAE_VAE_A________________________ ______AEAE_R_RAB_R_R_RAB_R_R_MAEAEAE_RAEAB_VAO_V_R_R_R_M_MAEAE_VAe_R_A__________________________ ______AE_OAEAEAE_VAO_RAE_R_R_MAEAO_VAE_R_RAE_R_R_RAE_R_R_M_VAEAO_V_R_A__________________________ ____AEAEAEAB_V_RAE_O_R_R_R_MAE_VAE_RAO_OAE_O_RAO_R_RAE_MAEAOAEAE_R_A____________________________ ____AE_O_VAEAEAEAB_R_R_RAB_M_RAe_VAO_VAE_R_RAE_RAE_O_M_M_RAE_O_RAO_A____________________________ __AE_M_RAO_V_O_R_R_R_R_O_M_MAEAO_RAE_RAEAE_R_R_O_M_M_M_M_R_V_R_M_M______________________________ __AE_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M_M______________________________ } # tile 218 (sub sokoban walls 0) { __________________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAO_K________________ ________________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_K________________ ________________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_K________________ ______________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_k_K________________ ______________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_k_K________________ ____________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAi_K________________ ____________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAi_K________________ __________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAi_K________________ __________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAi_K_K________________ ________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAiAi_K________________ ________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAi_gAi_K________________ ______________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAiAiAi_K________________ ______________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAiAi_K_K________________ ____________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAi_KAiAi_K________________ ____________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAiAiAiAi_K________________ __________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_k_kAiAiAiAiAi_k________________ __________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAiAi_gAi_K_k________________ ________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_K_kAiAi_KAiAi_K_k________________ ________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_K_kAiAiAiAi_K_kAi________________ ______________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_k_K_kAiAiAiAi_K_kAi________________ ______________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_k_K_kAiAiAi_K_kAiAi________________ ____________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAi_K_kAiAiAi_K_kAiAi________________ ____________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAi_K_kAiAi_K_k_gAiAi________________ __________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAi_K_kAiAi_K_k_kAi_K________________ __________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAi_K_kAi_K_k_K_kAiAi________________ ________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAiAi_K_kAi_K_k_K_k_gAi________________ ________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAi_KAi_K_k_K_kAi_K_kAiAi________________ ______________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAiAiAi_K_k_K_kAi_K_k_KAi________________ ______________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAi_KAi_K_K_kAiAi_K_kAiAi________________ ____________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAiAiAiAi_K_K_kAiAi_K_kAiAi________________ ____________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAiAiAiAi_K_kAiAiAi_K_kAiAi________________ __________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAO_kAiAiAiAiAiAi_K_kAiAiAi_K_kAiAi________________ ________________B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6_kAiAi_kAiAi_K_kAiAiAiAi_K_k_K_K________________ _________________g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_kAiAi_bAiAi_K_kAiAi_KAi_K_kAi__________________ _________________g_g_g_g_g_g_g_g_g_g_g_g_gB6_g_g_kAiAiAiAi_K_kAiAiAiAiAi_K_k_K__________________ _________________g_g_g_g_gB6_g_g_g_g_g_g_g_g_g_g_kAiAiAiAi_K_kAiAiAiAiAi_K_k____________________ _________________g_g_b_g_g_g_g_g_g_b_g_g_g_b_g_g_kAiAiAi_K_kAi_K_gAiAiAi_K_K____________________ _________________g_g_g_g_g_g_g_g_g_g_gB6_g_g_g_g_kAi_gAi_K_kAiAiAiAiAiAi_K______________________ _________________g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_kAiAi_K_k_kAiAiAiAiAiAi_K______________________ _________________g_g_g_g_g_b_g_g_g_g_g_g_g_g_g_g_kAiAi_K_k_kAi_gAi_KAiAi________________________ _________________gB6_g_g_g_g_g_g_g_b_g_g_g_b_g_g_kAi_K_k_K_kAiAiAiAiAi_K________________________ _________________g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_kAi_K_k_K_kAiAiAiAiAi__________________________ _________________g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_k_K_kAi_K_kAiAiAiAi_K__________________________ _________________g_g_g_g_b_g_g_g_g_g_g_g_g_g_g_g_k_K_kAi_K_kAiAi_KAi____________________________ _________________gB6_g_g_g_g_g_gB6_g_g_gB6_g_g_g_k_kAiAi_K_kAiAiAi_K____________________________ _________________g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_K_kAiAi_K_kAiAiAi______________________________ _________________g_g_g_g_g_g_g_g_g_g_g_g_g_b_g_g_KAiAiAi_K_kAiAi_K______________________________ _________________K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_kAi_KAi_K_kAiAi________________________________ ________________B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6_k_kAiAiAi_K_kAi_K________________________________ _________________k_k_k_k_k_k_k_k_k_k_k_k_k_k_k_kAiAiAiAi_K_kAi__________________________________ _________________g_g_g_g_g_g_b_g_g_g_g_g_g_g_g_gAiAi_gAi_K_k_K__________________________________ _________________g_g_g_g_g_g_g_g_g_g_g_g_b_g_g_gAiAiAiAi_K_k____________________________________ _________________g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_gAiAiAiAi_K_k____________________________________ _________________g_g_gB6_g_g_g_g_g_g_g_g_g_g_g_gAi_bAiAi_K______________________________________ _________________g_g_g_g_g_g_g_gB6_g_g_g_g_g_g_gAiAiAiAi_K______________________________________ _________________g_g_g_g_g_g_g_b_g_g_g_g_b_g_g_gAi_gAiAi________________________________________ _________________g_g_b_g_g_g_g_g_g_g_g_g_g_g_g_gAiAiAi_K________________________________________ _________________g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_gAiAiAi__________________________________________ _________________g_g_g_g_g_g_g_g_gB6_g_g_g_g_g_gAiAi_K__________________________________________ _________________g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_gAiAi____________________________________________ _________________g_gB6_g_g_b_g_g_g_g_g_g_g_g_b_gAi_K____________________________________________ _________________g_g_g_g_g_g_g_g_g_g_g_g_g_gB6_gAi______________________________________________ _________________g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_gAi______________________________________________ _________________b_b_b_b_b_b_b_b_b_b_b_b_b_b_b_b_K______________________________________________ } # tile 219 (sub sokoban walls 1) { ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ____________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAO__________ ____________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAO__________ __________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAi__________ __________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAi__________ ________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAi__________ ________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAi__________ ______________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAi__________ ______________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAi__________ ____________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAiAi__________ ____________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAiAi__________ __________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAiAiAi__________ __________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAiAiAi__________ ________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAiAiAiAi__________ ________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAiAiAiAi__________ ______AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAiAiAiAiAi__________ ______AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAiAiAiAiAi__________ _______KB6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6_gAiAiAiAiAiAiAi__________ _______KB6_k_k_k_k_k_k_k_k_k_k_k_k_k_k_KB6_k_k_k_k_k_k_k_k_k_k_k_k_k_k_gAiAiAiAiAiAi_K__________ _______KB6_k_kAi_k_k_k_k_k_k_k_k_k_k_k_KB6_k_k_k_k_k_k_k_k_k_k_k_k_k_k_gAiAiAiAiAiAi_K__________ _______KB6_k_k_k_k_k_k_k_k_kAi_k_k_k_k_KB6_k_k_k_k_k_k_k_k_k_kAi_k_k_k_gAiAiAiAiAi_KB6__________ _______KB6_k_k_k_k_kB6_k_k_k_k_k_k_k_k_KB6_kAi_k_k_k_kB6_k_k_k_k_k_k_k_gAiAiAiAiAi_KAi__________ _______KB6_k_k_k_k_k_k_k_k_k_kB6_k_k_k_KB6_k_k_k_k_k_k_k_k_k_k_kB6_k_k_gAiAiAiAi_KB6Ai__________ _______KB6_k_k_k_k_k_k_k_k_k_k_k_k_k_k_KB6_k_k_k_k_k_k_k_k_k_k_k_k_k_k_gAiAiAiAi_KAiAi__________ _______KB6_kAi_k_k_k_k_kB6_k_k_k_k_k_k_KB6_k_k_k_kB6_k_k_kAi_k_k_k_k_k_gAiAiAi_KB6AiAi__________ _______KB6_k_k_k_k_k_k_k_k_k_k_k_k_k_k_KB6_k_k_k_k_k_k_k_k_k_k_k_k_k_k_gAiAiAi_KAiAiAi__________ _______KB6_k_k_k_k_kAiAi_k_k_k_k_k_k_k_KB6_k_k_k_k_k_k_k_k_k_k_k_k_k_k_gAiAi_KB6AiAiAi__________ _______KB6_k_k_kB6_k_k_k_k_k_k_k_k_k_k_KB6_k_k_kAi_k_k_k_k_k_k_k_k_k_k_gAiAi_KAiAiAiAi__________ _______KB6_k_k_k_k_k_k_k_k_k_k_k_k_k_k_KB6_k_k_k_k_k_k_k_k_kAi_kB6_k_k_gAi_KB6AiAiAiAi__________ _______KB6_k_k_k_k_k_k_k_k_kB6_k_k_k_k_KB6_k_k_k_k_k_kB6_k_k_k_k_k_k_k_gAi_KAiAiAiAiAi__________ _______KB6_k_k_k_k_k_k_k_k_k_k_k_k_k_k_KB6_k_k_k_k_k_k_k_k_k_k_k_k_k_k_g_KB6AiAiAiAiAi__________ _______KB6_k_k_k_k_k_k_k_k_k_k_k_k_k_k_KB6_k_k_k_k_k_k_k_k_k_k_k_k_k_k_g_KAiAiAiAiAiAi__________ _______K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KB6AiAiAiAiAiAi__________ ______B6B6B6B6B6B6B6B6_KB6B6B6B6B6B6B6B6B6B6B6B6B6B6B6_KB6B6B6B6B6B6B6B6AiAiAiAiAiAiAi__________ _______k_k_k_k_k_k_k_k_KB6_k_k_k_k_k_k_k_k_k_k_k_k_k_k_KB6_k_k_k_k_k_k_gAiAiAiAiAiAiAi__________ _______k_k_k_k_k_k_k_k_KB6_k_k_k_k_k_k_k_k_k_k_k_k_k_k_KB6_k_k_k_k_k_k_gAiAiAiAiAiAiAi__________ _______k_kB6_k_kAi_k_k_KB6_k_k_k_k_kAi_k_k_k_k_k_k_k_k_KB6_k_kB6_k_k_k_gAiAiAiAiAiAi____________ _______k_k_k_k_k_k_k_k_KB6_k_kB6_k_k_k_k_k_k_kB6_k_k_k_KB6_k_k_k_k_kAi_gAiAiAiAiAiAi____________ _______k_k_k_k_k_k_k_k_KB6_k_k_k_k_k_k_k_k_k_k_k_k_k_k_KB6_k_k_k_k_k_k_gAiAiAiAiAi______________ _______k_kAi_k_kB6_k_k_KB6_k_k_k_k_kB6_k_k_k_kAi_k_k_k_KB6_k_k_k_k_k_k_gAiAiAiAiAi______________ _______k_k_k_k_k_k_k_k_KB6_k_k_k_k_k_k_k_k_k_k_k_k_k_k_KB6_k_kB6_k_kB6_gAiAiAiAi________________ _______k_k_k_k_k_k_k_k_KB6_k_k_k_k_k_k_k_kAiAi_k_k_k_k_KB6_k_k_k_k_kB6_gAiAiAiAi________________ _______k_kB6B6_k_k_k_k_KB6_k_k_kAi_k_k_kB6_k_k_k_k_k_k_KB6_k_k_k_k_k_k_gAiAiAi__________________ _______k_k_k_k_k_k_k_k_KB6_k_k_kAi_k_k_k_k_k_k_k_k_k_k_KB6_k_k_k_k_k_k_gAiAiAi__________________ _______k_k_k_k_kB6_k_k_KB6_k_k_k_k_k_k_k_k_k_k_k_k_k_k_KB6_k_k_kAi_k_k_gAiAi____________________ _______k_k_kAi_k_k_k_k_KB6_k_k_kB6_k_k_k_kAi_k_k_k_k_k_KB6_k_k_k_kB6_k_gAiAi____________________ _______k_k_k_k_k_k_k_k_KB6_k_k_k_k_k_k_k_k_k_k_kB6B6_k_KB6_k_k_k_k_k_k_gAi______________________ _______k_k_k_k_k_k_k_k_KB6_k_k_k_k_k_k_k_k_k_k_k_k_k_k_KB6_k_k_k_k_k_k_gAi______________________ _______K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ } # tile 220 (sub sokoban walls 2) { ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ __________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAO__________ ________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAO__________ ________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAi__________ ______________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAi__________ ______________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAi__________ ____________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAi__________ ____________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAi__________ __________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAi__________ __________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAiAi__________ ________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAiAi__________ ________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAiAiAi__________ ______________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAiAiAi__________ ______________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAiAiAiAi__________ ____________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAiAiAiAi__________ ____________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAiAiAiAiAi__________ __________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAiAiAiAiAi__________ __________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6B6B6B6B6B6B6B6_gAiAiAiAiAiAiAi__________ ________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_k_k_k_k_k_k_k_k_gAiAiAiAiAiAi_K__________ ________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_k_k_k_k_k_k_k_k_gAiAiAiAiAiAi_K__________ ______________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAi_k_k_kAi_k_k_k_gAiAiAiAiAi_KB6__________ ______________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAi_k_k_k_k_k_k_k_gAiAiAiAiAi_KAi__________ ____________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAi_k_k_k_kB6_k_k_gAiAiAiAi_KB6Ai__________ ____________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAi_k_k_k_k_k_k_k_gAiAiAiAi_KAiAi__________ __________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAO_kAiAiAi_kAi_k_k_k_k_k_gAiAiAi_KB6AiAi__________ ________________B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6_kAiAi_k_k_k_k_k_k_k_k_gAiAiAi_KAiAiAi__________ _________________g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_kAiAi_b_k_k_k_k_k_k_k_gAiAi_KB6AiAiAi__________ _________________g_g_g_g_g_g_g_g_g_g_g_g_gB6_g_g_kAiAiAi_k_k_k_k_k_k_k_gAiAi_KAiAiAiAi__________ _________________g_g_g_g_gB6_g_g_g_g_g_g_g_g_g_g_kAiAiAi_k_kAi_kB6_k_k_gAi_KB6AiAiAiAi__________ _________________g_g_b_g_g_g_g_g_g_b_g_g_g_b_g_g_kAiAiAi_k_k_k_k_k_k_k_gAi_KAiAiAiAiAi__________ _________________g_g_g_g_g_g_g_g_g_g_gB6_g_g_g_g_kAi_gAi_k_k_k_k_k_k_k_g_KB6AiAiAiAiAi__________ _________________g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_kAiAi_K_k_k_k_k_k_k_k_g_KAiAiAiAiAiAi__________ _________________g_g_g_g_g_b_g_g_g_g_g_g_g_g_g_g_kAiAi_K_K_K_K_K_K_K_K_KB6AiAiAiAiAiAi__________ _________________gB6_g_g_g_g_g_g_g_b_g_g_g_b_g_g_kAi_K_kB6B6B6B6B6B6B6B6AiAiAiAiAiAiAi__________ _________________g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_kAi_K_kB6_k_k_k_k_k_k_gAiAiAiAiAiAiAi__________ _________________g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_k_K_kAiB6_k_k_k_k_k_k_gAiAiAiAiAiAiAi__________ _________________g_g_g_g_b_g_g_g_g_g_g_g_g_g_g_g_k_K_kAiB6_k_kB6_k_k_k_gAiAiAiAiAiAi____________ _________________gB6_g_g_g_g_g_gB6_g_g_gB6_g_g_g_k_kAiAiB6_k_k_k_k_kAi_gAiAiAiAiAiAi____________ _________________g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_K_kAiAiB6_k_k_k_k_k_k_gAiAiAiAiAi______________ _________________g_g_g_g_g_g_g_g_g_g_g_g_g_b_g_g_KAiAiAiB6_k_k_k_k_k_k_gAiAiAiAiAi______________ _________________K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_kAi_KAiB6_k_kB6_k_kB6_gAiAiAiAi________________ ________________B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6_k_kAiAiAiB6_k_k_k_k_kB6_gAiAiAiAi________________ _________________k_k_k_k_k_k_k_k_k_k_k_k_k_k_k_kAiAiAiAiB6_k_k_k_k_k_k_gAiAiAi__________________ _________________g_g_g_g_g_g_b_g_g_g_g_g_g_g_g_gAiAi_gAiB6_k_k_k_k_k_k_gAiAiAi__________________ _________________g_g_g_g_g_g_g_g_g_g_g_g_b_g_g_gAiAiAiAiB6_k_k_kAi_k_k_gAiAi____________________ _________________g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_gAiAiAiAiB6_k_k_k_kB6_k_gAiAi____________________ _________________g_g_gB6_g_g_g_g_g_g_g_g_g_g_g_gAi_bAiAiB6_k_k_k_k_k_k_gAi______________________ _________________g_g_g_g_g_g_g_gB6_g_g_g_g_g_g_gAiAiAiAiB6_k_k_k_k_k_k_gAi______________________ _________________g_g_g_g_g_g_g_b_g_g_g_g_b_g_g_gAi_gAiAi_K_K_K_K_K_K_K_K________________________ _________________g_g_b_g_g_g_g_g_g_g_g_g_g_g_g_gAiAiAi_K________________________________________ _________________g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_gAiAiAi__________________________________________ _________________g_g_g_g_g_g_g_g_gB6_g_g_g_g_g_gAiAi_K__________________________________________ _________________g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_gAiAi____________________________________________ _________________g_gB6_g_g_b_g_g_g_g_g_g_g_g_b_gAi_K____________________________________________ _________________g_g_g_g_g_g_g_g_g_g_g_g_g_gB6_gAi______________________________________________ _________________g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_gAi______________________________________________ _________________b_b_b_b_b_b_b_b_b_b_b_b_b_b_b_b_K______________________________________________ } # tile 221 (sub sokoban walls 3) { ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ____________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAO__________________________ ____________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6__________________________ __________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6__________________________ __________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_k__________________________ ________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_k__________________________ ________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAi__________________________ ______________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAi__________________________ ______________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_k_kAi__________________________ ____________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAi__________________________ ____________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_K_kAiAi__________________________ __________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_K_kAiAi__________________________ __________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_k_K_kAiAi__________________________ ________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_k_K_kAiAi__________________________ ________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAi_K_kAiAi__________________________ ______AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAi_K_kAiAi__________________________ ______AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAi_K_kAiAi__________________________ _______KB6B6B6B6B6B6B6B6B6AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAi_K_kAi_K__________________________ _______KB6_k_k_k_k_k_k_kAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAiAi_K_kAi_K__________________________ _______KB6_k_kAi_k_k_k_kAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAi_KAi_K_k_K_k__________________________ _______KB6_k_k_k_k_k_kAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAiAiAi_K_k_K_k__________________________ _______KB6_k_k_k_k_kB6AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAi_KAi_K_K_kAi__________________________ _______KB6_k_k_k_k_kAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAiAiAiAi_K_K_kAi__________________________ _______KB6_k_k_k_k_kAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAiAiAiAi_K_kAiAi__________________________ _______KB6_kAi_k_kAOAOAOAOAOAOAOAOAOAOAOAOAOAOAO_kAiAiAiAiAiAi_K_kAiAi__________________________ _______KB6_k_k_kB6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6_kAiAi_kAiAi_K_kAiAiAi__________________________ _______KB6_k_k_k_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_kAiAi_bAiAi_K_kAiAi_K__________________________ _______KB6_k_k_k_g_g_g_g_g_g_g_g_g_g_g_g_gB6_g_g_kAiAiAiAi_K_kAiAiAiAi__________________________ _______KB6_k_k_k_g_g_g_g_gB6_g_g_g_g_g_g_g_g_g_g_kAiAiAiAi_K_kAiAiAiAi__________________________ _______KB6_k_k_k_g_g_b_g_g_g_g_g_g_b_g_g_g_b_g_g_kAiAiAi_K_kAi_K_gAiAi__________________________ _______KB6_k_k_k_g_g_g_g_g_g_g_g_g_g_gB6_g_g_g_g_kAi_gAi_K_kAiAiAiAiAi__________________________ _______KB6_k_k_k_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_kAiAi_K_k_kAiAiAiAiAi__________________________ _______K_K_K_K_K_g_g_g_g_g_b_g_g_g_g_g_g_g_g_g_g_kAiAi_K_k_kAi_gAi_KAi__________________________ ______B6B6B6B6B6_gB6_g_g_g_g_g_g_g_b_g_g_g_b_g_g_kAi_K_k_K_kAiAiAiAiAi__________________________ _______k_k_k_k_k_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_kAi_K_k_K_kAiAiAiAiAi__________________________ _______k_k_k_k_k_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_k_K_kAi_K_kAiAiAiAi_K__________________________ _______k_kB6_k_k_g_g_g_g_b_g_g_g_g_g_g_g_g_g_g_g_k_K_kAi_K_kAiAi_KAi____________________________ _______k_k_k_k_k_gB6_g_g_g_g_g_gB6_g_g_gB6_g_g_g_k_kAiAi_K_kAiAiAi_K____________________________ _______k_k_k_k_k_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_K_kAiAi_K_kAiAiAi______________________________ _______k_kAi_k_k_g_g_g_g_g_g_g_g_g_g_g_g_g_b_g_g_KAiAiAi_K_kAiAi_K______________________________ _______k_k_k_k_k_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_kAi_KAi_K_kAiAi________________________________ _______k_k_k_k_kB6B6B6B6B6B6B6B6B6B6B6B6B6B6B6_k_kAiAiAi_K_kAi_K________________________________ _______k_kB6B6_k_k_k_k_k_k_k_k_k_k_k_k_k_k_k_k_kAiAiAiAi_K_kAi__________________________________ _______k_k_k_k_k_g_g_g_g_g_g_b_g_g_g_g_g_g_g_g_gAiAi_gAi_K_k_K__________________________________ _______k_k_k_k_k_g_g_g_g_g_g_g_g_g_g_g_g_b_g_g_gAiAiAiAi_K_k____________________________________ _______k_k_kAi_k_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_gAiAiAiAi_K_k____________________________________ _______k_k_k_k_k_g_g_gB6_g_g_g_g_g_g_g_g_g_g_g_gAi_bAiAi_K______________________________________ _______k_k_k_k_k_g_g_g_g_g_g_g_gB6_g_g_g_g_g_g_gAiAiAiAi_K______________________________________ _______K_K_K_K_K_g_g_g_g_g_g_g_b_g_g_g_g_b_g_g_gAi_gAiAi________________________________________ _________________g_g_b_g_g_g_g_g_g_g_g_g_g_g_g_gAiAiAi_K________________________________________ _________________g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_gAiAiAi__________________________________________ _________________g_g_g_g_g_g_g_g_gB6_g_g_g_g_g_gAiAi_K__________________________________________ _________________g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_gAiAi____________________________________________ _________________g_gB6_g_g_b_g_g_g_g_g_g_g_g_b_gAi_K____________________________________________ _________________g_g_g_g_g_g_g_g_g_g_g_g_g_gB6_gAi______________________________________________ _________________g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_gAi______________________________________________ _________________b_b_b_b_b_b_b_b_b_b_b_b_b_b_b_b_K______________________________________________ } # tile 222 (sub sokoban walls 4) { __________________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAO________________ ________________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6AO________________ ________________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6AO________________ ______________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAO________________ ______________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAO________________ ____________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAO________________ ____________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAO________________ __________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAiAO________________ __________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAO__________ ________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAO__________ ________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAi__________ ______________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAi__________ ______________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAi__________ ____________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAi__________ ____________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAi__________ __________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAi__________ __________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAiAi__________ ________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAiAi__________ ________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAiAiAi__________ ______________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAiAiAi__________ ______________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAiAiAiAi__________ ____________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAiAiAiAi__________ ____________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAiAiAiAiAi__________ __________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAiAiAiAiAi__________ __________________________B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6_gAiAiAiAiAiAiAi__________ ___________________________k_k_k_k_k_k_KB6_k_k_k_k_k_k_k_k_k_k_k_k_k_k_gAiAiAiAiAiAi_K__________ ___________________________k_k_k_k_k_k_KB6_k_k_k_k_k_k_k_k_k_k_k_k_k_k_gAiAiAiAiAiAi_K__________ ___________________________kAi_k_k_k_k_KB6_k_k_k_k_k_k_k_k_k_kAi_k_k_k_gAiAiAiAiAi_KB6__________ ___________________________k_k_k_k_k_k_KB6_kAi_k_k_k_kB6_k_k_k_k_k_k_k_gAiAiAiAiAi_KAi__________ ___________________________k_kB6_k_k_k_KB6_k_k_k_k_k_k_k_k_k_k_kB6_k_k_gAiAiAiAi_KB6Ai__________ ___________________________k_k_k_k_k_k_KB6_k_k_k_k_k_k_k_k_k_k_k_k_k_k_gAiAiAiAi_KAiAi__________ ___________________________k_k_k_k_k_k_KB6_k_k_k_kB6_k_k_kAi_k_k_k_k_k_gAiAiAi_KB6AiAi__________ ___________________________k_k_k_k_k_k_KB6_k_k_k_k_k_k_k_k_k_k_k_k_k_k_gAiAiAi_KAiAiAi__________ ___________________________k_k_k_k_k_k_KB6_k_k_k_k_k_k_k_k_k_k_k_k_k_k_gAiAi_KB6AiAiAi__________ ___________________________k_k_k_k_k_k_KB6_k_k_kAi_k_k_k_k_k_k_k_k_k_k_gAiAi_KAiAiAiAi__________ ___________________________k_k_k_k_k_k_KB6_k_k_k_k_k_k_k_k_kAi_kB6_k_k_gAi_KB6AiAiAiAi__________ ___________________________kB6_k_k_k_k_KB6_k_k_k_k_k_kB6_k_k_k_k_k_k_k_gAi_KAiAiAiAiAi__________ ___________________________k_k_k_k_k_k_KB6_k_k_k_k_k_k_k_k_k_k_k_k_k_k_g_KB6AiAiAiAiAi__________ ___________________________k_k_k_k_k_k_KB6_k_k_k_k_k_k_k_k_k_k_k_k_k_k_g_KAiAiAiAiAiAi__________ ___________________________K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KB6AiAiAiAiAiAi__________ __________________________B6B6B6B6B6B6B6B6B6B6B6B6B6B6_KB6B6B6B6B6B6B6B6AiAiAiAiAiAiAi__________ ___________________________k_k_k_k_k_k_k_k_k_k_k_k_k_k_KB6_k_k_k_k_k_k_gAiAiAiAiAiAiAi__________ ___________________________k_k_k_k_k_k_k_k_k_k_k_k_k_k_KB6_k_k_k_k_k_k_gAiAiAiAiAiAiAi__________ ___________________________k_k_k_k_kAi_k_k_k_k_k_k_k_k_KB6_k_kB6_k_k_k_gAiAiAiAiAiAi____________ ___________________________k_kB6_k_k_k_k_k_k_kB6_k_k_k_KB6_k_k_k_k_kAi_gAiAiAiAiAiAi____________ ___________________________k_k_k_k_k_k_k_k_k_k_k_k_k_k_KB6_k_k_k_k_k_k_gAiAiAiAiAi______________ ___________________________k_k_k_k_kB6_k_k_k_kAi_k_k_k_KB6_k_k_k_k_k_k_gAiAiAiAiAi______________ ___________________________k_k_k_k_k_k_k_k_k_k_k_k_k_k_KB6_k_kB6_k_kB6_gAiAiAiAi________________ ___________________________k_k_k_k_k_k_k_kAiAi_k_k_k_k_KB6_k_k_k_k_kB6_gAiAiAiAi________________ ___________________________k_k_kAi_k_k_kB6_k_k_k_k_k_k_KB6_k_k_k_k_k_k_gAiAiAi__________________ ___________________________k_k_kAi_k_k_k_k_k_k_k_k_k_k_KB6_k_k_k_k_k_k_gAiAiAi__________________ ___________________________k_k_k_k_k_k_k_k_k_k_k_k_k_k_KB6_k_k_kAi_k_k_gAiAi____________________ ___________________________k_k_kB6_k_k_k_kAi_k_k_k_k_k_KB6_k_k_k_kB6_k_gAiAi____________________ ___________________________k_k_k_k_k_k_k_k_k_k_kB6B6_k_KB6_k_k_k_k_k_k_gAi______________________ ___________________________k_k_k_k_k_k_k_k_k_k_k_k_k_k_KB6_k_k_k_k_k_k_gAi______________________ ___________________________K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ } # tile 223 (sub sokoban walls 5) { __________________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAO_K________________ ________________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_K________________ ________________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_K________________ ______________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_k_K________________ ______________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_k_K________________ ____________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAi_K________________ ____________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAi_K________________ __________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAi_K________________ ____________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAi_K_K________________ ____________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAiAi_K________________ __________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAi_gAi_K________________ __________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAiAiAi_K________________ ________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAiAi_K_K________________ ________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAi_KAiAi_K________________ ______________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAiAiAiAi_K________________ ______________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_k_kAiAiAiAiAi_k________________ ____________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAiAi_gAi_K_k________________ ____________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_K_kAiAi_KAiAi_K_k________________ __________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_K_kAiAiAiAi_K_kAi________________ __________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_k_K_kAiAiAiAi_K_kAi________________ ________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_k_K_kAiAiAi_K_kAiAi________________ ________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAi_K_kAiAiAi_K_kAiAi________________ ______AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAi_K_kAiAi_K_k_gAiAi________________ ______AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAi_K_kAiAi_K_k_kAi_K________________ _______KB6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6_kAiAi_K_kAi_K_k_K_kAiAi________________ _______KB6_k_k_k_k_k_k_k_k_k_k_k_k_k_k_KB6_k_k_k_k_k_k_kAiAiAi_K_kAi_K_k_K_k_gAi________________ _______KB6_k_kAi_k_k_k_k_k_k_k_k_k_k_k_KB6_k_k_k_k_k_k_kAi_KAi_K_k_K_kAi_K_kAiAi________________ _______KB6_k_k_k_k_k_k_k_k_kAi_k_k_k_k_KB6_k_k_k_k_k_kAiAiAiAi_K_k_K_kAi_K_k_KAi________________ _______KB6_k_k_k_k_kB6_k_k_k_k_k_k_k_k_KB6_kAi_k_k_k_kAiAi_KAi_K_K_kAiAi_K_kAiAi________________ _______KB6_k_k_k_k_k_k_k_k_k_kB6_k_k_k_KB6_k_k_k_k_k_kAiAiAiAi_K_K_kAiAi_K_kAiAi________________ _______KB6_k_k_k_k_k_k_k_k_k_k_k_k_k_k_KB6_k_k_k_k_k_kAiAiAiAi_K_kAiAiAi_K_kAiAi________________ _______KB6_kAi_k_k_k_k_kB6_k_k_k_k_k_k_KB6_k_k_k_kB6_kAiAiAiAi_K_kAiAiAi_K_kAiAi________________ _______KB6_k_k_k_k_k_k_k_k_k_k_k_k_k_k_KB6_k_k_k_k_k_k_kAiAi_K_kAiAiAiAi_K_k_K_K________________ _______KB6_k_k_k_k_kAiAi_k_k_k_k_k_k_k_KB6_k_k_k_k_k_k_bAiAi_K_kAiAi_KAi_K_kAi__________________ _______KB6_k_k_kB6_k_k_k_k_k_k_k_k_k_k_KB6_k_k_kAi_k_kAiAi_K_kAiAiAiAiAi_K_k_K__________________ _______KB6_k_k_k_k_k_k_k_k_k_k_k_k_k_k_KB6_k_k_k_k_k_kAiAi_K_kAiAiAiAiAi_K_k____________________ _______KB6_k_k_k_k_k_k_k_k_kB6_k_k_k_k_KB6_k_k_k_k_k_kAi_K_kAi_K_gAiAiAi_K_K____________________ _______KB6_k_k_k_k_k_k_k_k_k_k_k_k_k_k_KB6_k_k_k_k_k_kAi_K_kAiAiAiAiAiAi_K______________________ _______KB6_k_k_k_k_k_k_k_k_k_k_k_k_k_k_KB6_k_k_k_k_k_k_K_kAiAiAiAiAiAiAi_K______________________ _______K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_kAiAi_gAi_KAiAi________________________ ______B6B6B6B6B6B6B6B6_KB6B6B6B6B6B6B6B6B6B6B6B6B6B6B6_kAiAiAiAiAiAiAi_K________________________ _______k_k_k_k_k_k_k_k_KB6_k_k_k_k_k_k_k_k_k_k_k_k_k_kAiAiAiAiAiAiAiAi__________________________ _______k_k_k_k_k_k_k_k_KB6_k_k_k_k_k_k_k_k_k_k_k_k_k_kAiAiAiAiAiAiAi_K__________________________ _______k_kB6_k_kAi_k_k_KB6_k_k_k_k_kAi_k_k_k_k_k_k_k_kAiAiAiAiAi_KAi____________________________ _______k_k_k_k_k_k_k_k_KB6_k_kB6_k_k_k_k_k_k_kB6_k_k_kAiAiAiAiAiAi_K____________________________ _______k_k_k_k_k_k_k_k_KB6_k_k_k_k_k_k_k_k_k_k_k_k_k_kAiAiAiAiAiAi______________________________ _______k_kAi_k_kB6_k_k_KB6_k_k_k_k_kB6_k_k_k_kAi_k_k_kAiAiAiAiAi_K______________________________ _______k_k_k_k_k_k_k_k_KB6_k_k_k_k_k_k_k_k_k_k_k_k_k_kAiAiAiAiAi________________________________ _______k_k_k_k_k_k_k_k_KB6_k_k_k_k_k_k_k_kAiAi_k_k_k_kAiAiAiAi_K________________________________ _______k_kB6B6_k_k_k_k_KB6_k_k_kAi_k_k_kB6_k_k_k_k_k_kAiAiAiAi__________________________________ _______k_k_k_k_k_k_k_k_KB6_k_k_kAi_k_k_k_k_k_k_k_k_k_kAiAiAi_K__________________________________ _______k_k_k_k_kB6_k_k_KB6_k_k_k_k_k_k_k_k_k_k_k_k_k_kAiAiAi____________________________________ _______k_k_kAi_k_k_k_k_KB6_k_k_kB6_k_k_k_kAi_k_k_k_k_kAiAi_K____________________________________ _______k_k_k_k_k_k_k_k_KB6_k_k_k_k_k_k_k_k_k_k_kB6B6_kAiAi______________________________________ _______k_k_k_k_k_k_k_k_KB6_k_k_k_k_k_k_k_k_k_k_k_k_k_kAi_K______________________________________ _______K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAi________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ } # tile 224 (sub sokoban walls 6) { __________________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAO________________ ________________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6AO________________ ________________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6AO________________ ______________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAO________________ ______________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAO________________ ____________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAO________________ ____________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAO________________ __________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAiAO________________ ____________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAO__________ ____________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAO__________ __________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAi__________ __________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAi__________ ________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAi__________ ________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAi__________ ______________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAi__________ ______________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAi__________ ____________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAiAi__________ ____________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAiAi__________ __________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAiAiAi__________ __________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAiAiAi__________ ________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAiAiAiAi__________ ________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAiAiAiAi__________ ______AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAiAiAiAiAi__________ ______AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAiAiAiAiAi__________ _______KB6B6B6B6B6B6B6B6B6AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6B6B6B6B6B6B6B6_gAiAiAiAiAiAiAi__________ _______KB6_k_k_k_k_k_k_kAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_k_k_k_k_k_k_k_k_gAiAiAiAiAiAi_K__________ _______KB6_k_kAi_k_k_k_kAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_k_k_k_k_k_k_k_k_gAiAiAiAiAiAi_K__________ _______KB6_k_k_k_k_k_kAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAi_k_k_kAi_k_k_k_gAiAiAiAiAi_KB6__________ _______KB6_k_k_k_k_kB6AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAi_k_k_k_k_k_k_k_gAiAiAiAiAi_KAi__________ _______KB6_k_k_k_k_kAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAi_k_k_k_kB6_k_k_gAiAiAiAi_KB6Ai__________ _______KB6_k_k_k_k_kAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAi_k_k_k_k_k_k_k_gAiAiAiAi_KAiAi__________ _______KB6_kAi_k_kAOAOAOAOAOAOAOAOAOAOAOAOAOAOAO_kAiAiAi_kAi_k_k_k_k_k_gAiAiAi_KB6AiAi__________ _______KB6_k_k_kB6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6_kAiAi_k_k_k_k_k_k_k_k_gAiAiAi_KAiAiAi__________ _______KB6_k_k_k_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_kAiAi_b_k_k_k_k_k_k_k_gAiAi_KB6AiAiAi__________ _______KB6_k_k_k_g_g_g_g_g_g_g_g_g_g_g_g_gB6_g_g_kAiAiAi_k_k_k_k_k_k_k_gAiAi_KAiAiAiAi__________ _______KB6_k_k_k_g_g_g_g_gB6_g_g_g_g_g_g_g_g_g_g_kAiAiAi_k_kAi_kB6_k_k_gAi_KB6AiAiAiAi__________ _______KB6_k_k_k_g_g_b_g_g_g_g_g_g_b_g_g_g_b_g_g_kAiAiAi_k_k_k_k_k_k_k_gAi_KAiAiAiAiAi__________ _______KB6_k_k_k_g_g_g_g_g_g_g_g_g_g_gB6_g_g_g_g_kAi_gAi_k_k_k_k_k_k_k_g_KB6AiAiAiAiAi__________ _______KB6_k_k_k_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_kAiAi_K_k_k_k_k_k_k_k_g_KAiAiAiAiAiAi__________ _______K_K_K_K_K_g_g_g_g_g_b_g_g_g_g_g_g_g_g_g_g_kAiAi_K_K_K_K_K_K_K_K_KB6AiAiAiAiAiAi__________ ______B6B6B6B6B6_gB6_g_g_g_g_g_g_g_b_g_g_g_b_g_g_kAi_K_kB6B6B6B6B6B6B6B6AiAiAiAiAiAiAi__________ _______k_k_k_k_k_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_kAi_K_kB6_k_k_k_k_k_k_gAiAiAiAiAiAiAi__________ _______k_k_k_k_k_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_k_K_kAiB6_k_k_k_k_k_k_gAiAiAiAiAiAiAi__________ _______k_kB6_k_k_g_g_g_g_b_g_g_g_g_g_g_g_g_g_g_g_k_K_kAiB6_k_kB6_k_k_k_gAiAiAiAiAiAi____________ _______k_k_k_k_k_gB6_g_g_g_g_g_gB6_g_g_gB6_g_g_g_k_kAiAiB6_k_k_k_k_kAi_gAiAiAiAiAiAi____________ _______k_k_k_k_k_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_K_kAiAiB6_k_k_k_k_k_k_gAiAiAiAiAi______________ _______k_kAi_k_k_g_g_g_g_g_g_g_g_g_g_g_g_g_b_g_g_KAiAiAiB6_k_k_k_k_k_k_gAiAiAiAiAi______________ _______k_k_k_k_k_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_kAi_KAiB6_k_kB6_k_kB6_gAiAiAiAi________________ _______k_k_k_k_kB6B6B6B6B6B6B6B6B6B6B6B6B6B6B6_k_kAiAiAiB6_k_k_k_k_kB6_gAiAiAiAi________________ _______k_kB6B6_k_k_k_k_k_k_k_k_k_k_k_k_k_k_k_k_kAiAiAiAiB6_k_k_k_k_k_k_gAiAiAi__________________ _______k_k_k_k_k_g_g_g_g_g_g_b_g_g_g_g_g_g_g_g_gAiAi_gAiB6_k_k_k_k_k_k_gAiAiAi__________________ _______k_k_k_k_k_g_g_g_g_g_g_g_g_g_g_g_g_b_g_g_gAiAiAiAiB6_k_k_kAi_k_k_gAiAi____________________ _______k_k_kAi_k_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_gAiAiAiAiB6_k_k_k_kB6_k_gAiAi____________________ _______k_k_k_k_k_g_g_gB6_g_g_g_g_g_g_g_g_g_g_g_gAi_bAiAiB6_k_k_k_k_k_k_gAi______________________ _______k_k_k_k_k_g_g_g_g_g_g_g_gB6_g_g_g_g_g_g_gAiAiAiAiB6_k_k_k_k_k_k_gAi______________________ _______K_K_K_K_K_g_g_g_g_g_g_g_b_g_g_g_g_b_g_g_gAi_gAiAi_K_K_K_K_K_K_K_K________________________ _________________g_g_b_g_g_g_g_g_g_g_g_g_g_g_g_gAiAiAi_K________________________________________ _________________g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_gAiAiAi__________________________________________ _________________g_g_g_g_g_g_g_g_gB6_g_g_g_g_g_gAiAi_K__________________________________________ _________________g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_gAiAi____________________________________________ _________________g_gB6_g_g_b_g_g_g_g_g_g_g_g_b_gAi_K____________________________________________ _________________g_g_g_g_g_g_g_g_g_g_g_g_g_gB6_gAi______________________________________________ _________________g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_gAi______________________________________________ _________________b_b_b_b_b_b_b_b_b_b_b_b_b_b_b_b_K______________________________________________ } # tile 225 (sub sokoban walls 7) { __________________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAO________________ ________________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6AO________________ ________________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6AO________________ ______________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAO________________ ______________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAO________________ ____________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAO________________ ____________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAO________________ __________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAiAO________________ ____________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAO__________ ____________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAO__________ __________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAi__________ __________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAi__________ ________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAi__________ ________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAi__________ ______________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAi__________ ______________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAi__________ ____________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAiAi__________ ____________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAiAi__________ __________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAiAiAi__________ __________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAiAiAi__________ ________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAiAiAiAi__________ ________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAiAiAiAi__________ ______AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAiAiAiAiAi__________ ______AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAiAiAiAiAi__________ _______KB6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6_gAiAiAiAiAiAiAi__________ _______KB6_k_k_k_k_k_k_k_k_k_k_k_k_k_k_KB6_k_k_k_k_k_k_k_k_k_k_k_k_k_k_gAiAiAiAiAiAi_K__________ _______KB6_k_kAi_k_k_k_k_k_k_k_k_k_k_k_KB6_k_k_k_k_k_k_k_k_k_k_k_k_k_k_gAiAiAiAiAiAi_K__________ _______KB6_k_k_k_k_k_k_k_k_kAi_k_k_k_k_KB6_k_k_k_k_k_k_k_k_k_kAi_k_k_k_gAiAiAiAiAi_KB6__________ _______KB6_k_k_k_k_kB6_k_k_k_k_k_k_k_k_KB6_kAi_k_k_k_kB6_k_k_k_k_k_k_k_gAiAiAiAiAi_KAi__________ _______KB6_k_k_k_k_k_k_k_k_k_kB6_k_k_k_KB6_k_k_k_k_k_k_k_k_k_k_kB6_k_k_gAiAiAiAi_KB6Ai__________ _______KB6_k_k_k_k_k_k_k_k_k_k_k_k_k_k_KB6_k_k_k_k_k_k_k_k_k_k_k_k_k_k_gAiAiAiAi_KAiAi__________ _______KB6_kAi_k_k_k_k_kB6_k_k_k_k_k_k_KB6_k_k_k_kB6_k_k_kAi_k_k_k_k_k_gAiAiAi_KB6AiAi__________ _______KB6_k_k_k_k_k_k_k_k_k_k_k_k_k_k_KB6_k_k_k_k_k_k_k_k_k_k_k_k_k_k_gAiAiAi_KAiAiAi__________ _______KB6_k_k_k_k_kAiAi_k_k_k_k_k_k_k_KB6_k_k_k_k_k_k_k_k_k_k_k_k_k_k_gAiAi_KB6AiAiAi__________ _______KB6_k_k_kB6_k_k_k_k_k_k_k_k_k_k_KB6_k_k_kAi_k_k_k_k_k_k_k_k_k_k_gAiAi_KAiAiAiAi__________ _______KB6_k_k_k_k_k_k_k_k_k_k_k_k_k_k_KB6_k_k_k_k_k_k_k_k_kAi_kB6_k_k_gAi_KB6AiAiAiAi__________ _______KB6_k_k_k_k_k_k_k_k_kB6_k_k_k_k_KB6_k_k_k_k_k_kB6_k_k_k_k_k_k_k_gAi_KAiAiAiAiAi__________ _______KB6_k_k_k_k_k_k_k_k_k_k_k_k_k_k_KB6_k_k_k_k_k_k_k_k_k_k_k_k_k_k_g_KB6AiAiAiAiAi__________ _______KB6_k_k_k_k_k_k_k_k_k_k_k_k_k_k_KB6_k_k_k_k_k_k_k_k_k_k_k_k_k_k_g_KAiAiAiAiAiAi__________ _______K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KB6AiAiAiAiAiAi__________ ______B6B6B6B6B6B6B6B6_KB6B6B6B6B6B6B6B6B6B6B6B6B6B6B6_KB6B6B6B6B6B6B6B6AiAiAiAiAiAiAi__________ _______k_k_k_k_k_k_k_k_KB6_k_k_k_k_k_k_k_k_k_k_k_k_k_k_KB6_k_k_k_k_k_k_gAiAiAiAiAiAiAi__________ _______k_k_k_k_k_k_k_k_KB6_k_k_k_k_k_k_k_k_k_k_k_k_k_k_KB6_k_k_k_k_k_k_gAiAiAiAiAiAiAi__________ _______k_kB6_k_kAi_k_k_KB6_k_k_k_k_kAi_k_k_k_k_k_k_k_k_KB6_k_kB6_k_k_k_gAiAiAiAiAiAi____________ _______k_k_k_k_k_k_k_k_KB6_k_kB6_k_k_k_k_k_k_kB6_k_k_k_KB6_k_k_k_k_kAi_gAiAiAiAiAiAi____________ _______k_k_k_k_k_k_k_k_KB6_k_k_k_k_k_k_k_k_k_k_k_k_k_k_KB6_k_k_k_k_k_k_gAiAiAiAiAi______________ _______k_kAi_k_kB6_k_k_KB6_k_k_k_k_kB6_k_k_k_kAi_k_k_k_KB6_k_k_k_k_k_k_gAiAiAiAiAi______________ _______k_k_k_k_k_k_k_k_KB6_k_k_k_k_k_k_k_k_k_k_k_k_k_k_KB6_k_kB6_k_kB6_gAiAiAiAi________________ _______k_k_k_k_k_k_k_k_KB6_k_k_k_k_k_k_k_kAiAi_k_k_k_k_KB6_k_k_k_k_kB6_gAiAiAiAi________________ _______k_kB6B6_k_k_k_k_KB6_k_k_kAi_k_k_kB6_k_k_k_k_k_k_KB6_k_k_k_k_k_k_gAiAiAi__________________ _______k_k_k_k_k_k_k_k_KB6_k_k_kAi_k_k_k_k_k_k_k_k_k_k_KB6_k_k_k_k_k_k_gAiAiAi__________________ _______k_k_k_k_kB6_k_k_KB6_k_k_k_k_k_k_k_k_k_k_k_k_k_k_KB6_k_k_kAi_k_k_gAiAi____________________ _______k_k_kAi_k_k_k_k_KB6_k_k_kB6_k_k_k_kAi_k_k_k_k_k_KB6_k_k_k_kB6_k_gAiAi____________________ _______k_k_k_k_k_k_k_k_KB6_k_k_k_k_k_k_k_k_k_k_kB6B6_k_KB6_k_k_k_k_k_k_gAi______________________ _______k_k_k_k_k_k_k_k_KB6_k_k_k_k_k_k_k_k_k_k_k_k_k_k_KB6_k_k_k_k_k_k_gAi______________________ _______K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ } # tile 226 (sub sokoban walls 8) { ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ________________________________________________________________________________________________ ____________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAO__________ ____________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAO__________ __________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAi__________ __________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAi__________ ________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAi__________ ________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAi__________ ______________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAi__________ ______________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAi__________ ____________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAiAi__________ ____________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAiAi__________ __________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAiAiAi__________ __________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAiAiAi__________ ________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAiAiAiAi__________ ________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAiAiAiAi__________ ______AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAiAiAiAiAi__________ ______AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAiAiAiAiAi__________ _______KB6B6B6B6B6B6B6B6B6AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6B6B6B6B6B6B6B6_gAiAiAiAiAiAiAi__________ _______KB6_k_k_k_k_k_k_kAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_k_k_k_k_k_k_k_k_gAiAiAiAiAiAi_K__________ _______KB6_k_kAi_k_k_k_kAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_k_k_k_k_k_k_k_k_gAiAiAiAiAiAi_K__________ _______KB6_k_k_k_k_k_kAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAi_k_k_kAi_k_k_k_gAiAiAiAiAi_KB6__________ _______KB6_k_k_k_k_kB6AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAi_k_k_k_k_k_k_k_gAiAiAiAiAi_KAi__________ _______KB6_k_k_k_k_kAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAi_k_k_k_kB6_k_k_gAiAiAiAi_KB6Ai__________ _______KB6_k_k_k_k_kAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAi_k_k_k_k_k_k_k_gAiAiAiAi_KAiAi__________ _______KB6_kAi_k_kAOAOAOAOAOAOAOAOAOAOAOAOAOAOAO_kAiAiAi_kAi_k_k_k_k_k_gAiAiAi_KB6AiAi__________ _______KB6_k_k_kB6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6_kAiAi_k_k_k_k_k_k_k_k_gAiAiAi_KAiAiAi__________ _______KB6_k_k_k_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_kAiAi_b_k_k_k_k_k_k_k_gAiAi_KB6AiAiAi__________ _______KB6_k_k_k_g_g_g_g_g_g_g_g_g_g_g_g_gB6_g_g_kAiAiAi_k_k_k_k_k_k_k_gAiAi_KAiAiAiAi__________ _______KB6_k_k_k_g_g_g_g_gB6_g_g_g_g_g_g_g_g_g_g_kAiAiAi_k_kAi_kB6_k_k_gAi_KB6AiAiAiAi__________ _______KB6_k_k_k_g_g_b_g_g_g_g_g_g_b_g_g_g_b_g_g_kAiAiAi_k_k_k_k_k_k_k_gAi_KAiAiAiAiAi__________ _______KB6_k_k_k_g_g_g_g_g_g_g_g_g_g_gB6_g_g_g_g_kAi_gAi_k_k_k_k_k_k_k_g_KB6AiAiAiAiAi__________ _______KB6_k_k_k_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_kAiAi_K_k_k_k_k_k_k_k_g_KAiAiAiAiAiAi__________ _______K_K_K_K_K_g_g_g_g_g_b_g_g_g_g_g_g_g_g_g_g_kAiAi_K_K_K_K_K_K_K_K_KB6AiAiAiAiAiAi__________ ______B6B6B6B6B6_gB6_g_g_g_g_g_g_g_b_g_g_g_b_g_g_kAi_K_kB6B6B6B6B6B6B6B6AiAiAiAiAiAiAi__________ _______k_k_k_k_k_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_kAi_K_kB6_k_k_k_k_k_k_gAiAiAiAiAiAiAi__________ _______k_k_k_k_k_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_k_K_kAiB6_k_k_k_k_k_k_gAiAiAiAiAiAiAi__________ _______k_kB6_k_k_g_g_g_g_b_g_g_g_g_g_g_g_g_g_g_g_k_K_kAiB6_k_kB6_k_k_k_gAiAiAiAiAiAi____________ _______k_k_k_k_k_gB6_g_g_g_g_g_gB6_g_g_gB6_g_g_g_k_kAiAiB6_k_k_k_k_kAi_gAiAiAiAiAiAi____________ _______k_k_k_k_k_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_K_kAiAiB6_k_k_k_k_k_k_gAiAiAiAiAi______________ _______k_kAi_k_k_g_g_g_g_g_g_g_g_g_g_g_g_g_b_g_g_KAiAiAiB6_k_k_k_k_k_k_gAiAiAiAiAi______________ _______k_k_k_k_k_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_kAi_KAiB6_k_kB6_k_kB6_gAiAiAiAi________________ _______k_k_k_k_kB6B6B6B6B6B6B6B6B6B6B6B6B6B6B6_k_kAiAiAiB6_k_k_k_k_kB6_gAiAiAiAi________________ _______k_kB6B6_k_k_k_k_k_k_k_k_k_k_k_k_k_k_k_k_kAiAiAiAiB6_k_k_k_k_k_k_gAiAiAi__________________ _______k_k_k_k_k_g_g_g_g_g_g_b_g_g_g_g_g_g_g_g_gAiAi_gAiB6_k_k_k_k_k_k_gAiAiAi__________________ _______k_k_k_k_k_g_g_g_g_g_g_g_g_g_g_g_g_b_g_g_gAiAiAiAiB6_k_k_kAi_k_k_gAiAi____________________ _______k_k_kAi_k_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_gAiAiAiAiB6_k_k_k_kB6_k_gAiAi____________________ _______k_k_k_k_k_g_g_gB6_g_g_g_g_g_g_g_g_g_g_g_gAi_bAiAiB6_k_k_k_k_k_k_gAi______________________ _______k_k_k_k_k_g_g_g_g_g_g_g_gB6_g_g_g_g_g_g_gAiAiAiAiB6_k_k_k_k_k_k_gAi______________________ _______K_K_K_K_K_g_g_g_g_g_g_g_b_g_g_g_g_b_g_g_gAi_gAiAi_K_K_K_K_K_K_K_K________________________ _________________g_g_b_g_g_g_g_g_g_g_g_g_g_g_g_gAiAiAi_K________________________________________ _________________g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_gAiAiAi__________________________________________ _________________g_g_g_g_g_g_g_g_gB6_g_g_g_g_g_gAiAi_K__________________________________________ _________________g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_gAiAi____________________________________________ _________________g_gB6_g_g_b_g_g_g_g_g_g_g_g_b_gAi_K____________________________________________ _________________g_g_g_g_g_g_g_g_g_g_g_g_g_gB6_gAi______________________________________________ _________________g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_gAi______________________________________________ _________________b_b_b_b_b_b_b_b_b_b_b_b_b_b_b_b_K______________________________________________ } # tile 227 (sub sokoban walls 9) { __________________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAO_K________________ ________________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_K________________ ________________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_K________________ ______________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_k_K________________ ______________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_k_K________________ ____________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAi_K________________ ____________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAi_K________________ __________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAi_K________________ ____________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAi_K_K________________ ____________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAiAi_K________________ __________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAi_gAi_K________________ __________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAiAiAi_K________________ ________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAiAi_K_K________________ ________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAi_KAiAi_K________________ ______________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAiAiAiAi_K________________ ______________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_k_kAiAiAiAiAi_k________________ ____________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAiAi_gAi_K_k________________ ____________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_K_kAiAi_KAiAi_K_k________________ __________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_K_kAiAiAiAi_K_kAi________________ __________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_k_K_kAiAiAiAi_K_kAi________________ ________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_k_K_kAiAiAi_K_kAiAi________________ ________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAi_K_kAiAiAi_K_kAiAi________________ ______AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAi_K_kAiAi_K_k_gAiAi________________ ______AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAi_K_kAiAi_K_k_kAi_K________________ _______KB6B6B6B6B6B6B6B6B6AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAi_K_kAi_K_k_K_kAiAi________________ _______KB6_k_k_k_k_k_k_kAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAiAi_K_kAi_K_k_K_k_gAi________________ _______KB6_k_kAi_k_k_k_kAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAi_KAi_K_k_K_kAi_K_kAiAi________________ _______KB6_k_k_k_k_k_kAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAiAiAi_K_k_K_kAi_K_k_KAi________________ _______KB6_k_k_k_k_kB6AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAi_KAi_K_K_kAiAi_K_kAiAi________________ _______KB6_k_k_k_k_kAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAiAiAiAi_K_K_kAiAi_K_kAiAi________________ _______KB6_k_k_k_k_kAOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAiAiAiAi_K_kAiAiAi_K_kAiAi________________ _______KB6_kAi_k_kAOAOAOAOAOAOAOAOAOAOAOAOAOAOAO_kAiAiAiAiAiAi_K_kAiAiAi_K_kAiAi________________ _______KB6_k_k_kB6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6_kAiAi_kAiAi_K_kAiAiAiAi_K_k_K_K________________ _______KB6_k_k_k_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_kAiAi_bAiAi_K_kAiAi_KAi_K_kAi__________________ _______KB6_k_k_k_g_g_g_g_g_g_g_g_g_g_g_g_gB6_g_g_kAiAiAiAi_K_kAiAiAiAiAi_K_k_K__________________ _______KB6_k_k_k_g_g_g_g_gB6_g_g_g_g_g_g_g_g_g_g_kAiAiAiAi_K_kAiAiAiAiAi_K_k____________________ _______KB6_k_k_k_g_g_b_g_g_g_g_g_g_b_g_g_g_b_g_g_kAiAiAi_K_kAi_K_gAiAiAi_K_K____________________ _______KB6_k_k_k_g_g_g_g_g_g_g_g_g_g_gB6_g_g_g_g_kAi_gAi_K_kAiAiAiAiAiAi_K______________________ _______KB6_k_k_k_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_kAiAi_K_k_kAiAiAiAiAiAi_K______________________ _______K_K_K_K_K_g_g_g_g_g_b_g_g_g_g_g_g_g_g_g_g_kAiAi_K_k_kAi_gAi_KAiAi________________________ ______B6B6B6B6B6_gB6_g_g_g_g_g_g_g_b_g_g_g_b_g_g_kAi_K_k_K_kAiAiAiAiAi_K________________________ _______k_k_k_k_k_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_kAi_K_k_K_kAiAiAiAiAi__________________________ _______k_k_k_k_k_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_k_K_kAi_K_kAiAiAiAi_K__________________________ _______k_kB6_k_k_g_g_g_g_b_g_g_g_g_g_g_g_g_g_g_g_k_K_kAi_K_kAiAi_KAi____________________________ _______k_k_k_k_k_gB6_g_g_g_g_g_gB6_g_g_gB6_g_g_g_k_kAiAi_K_kAiAiAi_K____________________________ _______k_k_k_k_k_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_K_kAiAi_K_kAiAiAi______________________________ _______k_kAi_k_k_g_g_g_g_g_g_g_g_g_g_g_g_g_b_g_g_KAiAiAi_K_kAiAi_K______________________________ _______k_k_k_k_k_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_kAi_KAi_K_kAiAi________________________________ _______k_k_k_k_kB6B6B6B6B6B6B6B6B6B6B6B6B6B6B6_k_kAiAiAi_K_kAi_K________________________________ _______k_kB6B6_k_k_k_k_k_k_k_k_k_k_k_k_k_k_k_k_kAiAiAiAi_K_kAi__________________________________ _______k_k_k_k_k_g_g_g_g_g_g_b_g_g_g_g_g_g_g_g_gAiAi_gAi_K_k_K__________________________________ _______k_k_k_k_k_g_g_g_g_g_g_g_g_g_g_g_g_b_g_g_gAiAiAiAi_K_k____________________________________ _______k_k_kAi_k_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_gAiAiAiAi_K_k____________________________________ _______k_k_k_k_k_g_g_gB6_g_g_g_g_g_g_g_g_g_g_g_gAi_bAiAi_K______________________________________ _______k_k_k_k_k_g_g_g_g_g_g_g_gB6_g_g_g_g_g_g_gAiAiAiAi_K______________________________________ _______K_K_K_K_K_g_g_g_g_g_g_g_b_g_g_g_g_b_g_g_gAi_gAiAi________________________________________ _________________g_g_b_g_g_g_g_g_g_g_g_g_g_g_g_gAiAiAi_K________________________________________ _________________g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_gAiAiAi__________________________________________ _________________g_g_g_g_g_g_g_g_gB6_g_g_g_g_g_gAiAi_K__________________________________________ _________________g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_gAiAi____________________________________________ _________________g_gB6_g_g_b_g_g_g_g_g_g_g_g_b_gAi_K____________________________________________ _________________g_g_g_g_g_g_g_g_g_g_g_g_g_gB6_gAi______________________________________________ _________________g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_gAi______________________________________________ _________________b_b_b_b_b_b_b_b_b_b_b_b_b_b_b_b_K______________________________________________ } # tile 228 (sub sokoban walls 10) { __________________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAO________________ ________________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6AO________________ ________________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6AO________________ ______________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAO________________ ______________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAO________________ ____________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAO________________ ____________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAO________________ __________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAiAO________________ __________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAO__________ ________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAO__________ ________________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAi__________ ______________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAi__________ ______________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAi__________ ____________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAi__________ ____________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAi__________ __________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAi__________ __________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAiAi__________ ________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAiAi__________ ________________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAiAiAi__________ ______________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAiAiAi__________ ______________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAiAiAiAi__________ ____________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAiAiAiAi__________ ____________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAiAiAiAiAi__________ __________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAiAiAiAiAiAiAi__________ __________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6B6B6B6B6B6B6B6_gAiAiAiAiAiAiAi__________ ________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_k_k_k_k_k_k_k_k_gAiAiAiAiAiAi_K__________ ________________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_k_k_k_k_k_k_k_k_gAiAiAiAiAiAi_K__________ ______________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAi_k_k_kAi_k_k_k_gAiAiAiAiAi_KB6__________ ______________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAi_k_k_k_k_k_k_k_gAiAiAiAiAi_KAi__________ ____________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAi_k_k_k_kB6_k_k_gAiAiAiAi_KB6Ai__________ ____________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOB6_kAiAi_k_k_k_k_k_k_k_gAiAiAiAi_KAiAi__________ __________________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAO_kAiAiAi_kAi_k_k_k_k_k_gAiAiAi_KB6AiAi__________ ________________B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6_kAiAi_k_k_k_k_k_k_k_k_gAiAiAi_KAiAiAi__________ _________________g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_kAiAi_b_k_k_k_k_k_k_k_gAiAi_KB6AiAiAi__________ _________________g_g_g_g_g_g_g_g_g_g_g_g_gB6_g_g_kAiAiAi_k_k_k_k_k_k_k_gAiAi_KAiAiAiAi__________ _________________g_g_g_g_gB6_g_g_g_g_g_g_g_g_g_g_kAiAiAi_k_kAi_kB6_k_k_gAi_KB6AiAiAiAi__________ _________________g_g_b_g_g_g_g_g_g_b_g_g_g_b_g_g_kAiAiAi_k_k_k_k_k_k_k_gAi_KAiAiAiAiAi__________ _________________g_g_g_g_g_g_g_g_g_g_gB6_g_g_g_g_kAi_gAi_k_k_k_k_k_k_k_g_KB6AiAiAiAiAi__________ _________________g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_kAiAi_K_k_k_k_k_k_k_k_g_KAiAiAiAiAiAi__________ _________________g_g_g_g_g_b_g_g_g_g_g_g_g_g_g_g_kAiAi_K_K_K_K_K_K_K_K_KB6AiAiAiAiAiAi__________ _________________gB6_g_g_g_g_g_g_g_b_g_g_g_b_g_g_kAi_K_kB6B6B6B6B6B6B6B6AiAiAiAiAiAiAi__________ _________________g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_kAi_K_kB6_k_k_k_k_k_k_gAiAiAiAiAiAiAi__________ _________________g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_k_K_kAiB6_k_k_k_k_k_k_gAiAiAiAiAiAiAi__________ _________________g_g_g_g_b_g_g_g_g_g_g_g_g_g_g_g_k_K_kAiB6_k_kB6_k_k_k_gAiAiAiAiAiAi____________ _________________gB6_g_g_g_g_g_gB6_g_g_gB6_g_g_g_k_kAiAiB6_k_k_k_k_kAi_gAiAiAiAiAiAi____________ _________________g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_K_kAiAiB6_k_k_k_k_k_k_gAiAiAiAiAi______________ _________________g_g_g_g_g_g_g_g_g_g_g_g_g_b_g_g_KAiAiAiB6_k_k_k_k_k_k_gAiAiAiAiAi______________ _________________K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_kAi_KAiB6_k_kB6_k_kB6_gAiAiAiAi________________ ________________B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6_k_kAiAiAiB6_k_k_k_k_kB6_gAiAiAiAi________________ _________________k_k_k_k_k_k_k_k_k_k_k_k_k_k_k_kAiAiAiAiB6_k_k_k_k_k_k_gAiAiAi__________________ _________________g_g_g_g_g_g_b_g_g_g_g_g_g_g_g_gAiAi_gAiB6_k_k_k_k_k_k_gAiAiAi__________________ _________________g_g_g_g_g_g_g_g_g_g_g_g_b_g_g_gAiAiAiAiB6_k_k_kAi_k_k_gAiAi____________________ _________________g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_gAiAiAiAiB6_k_k_k_kB6_k_gAiAi____________________ _________________g_g_gB6_g_g_g_g_g_g_g_g_g_g_g_gAi_bAiAiB6_k_k_k_k_k_k_gAi______________________ _________________g_g_g_g_g_g_g_gB6_g_g_g_g_g_g_gAiAiAiAiB6_k_k_k_k_k_k_gAi______________________ _________________g_g_g_g_g_g_g_b_g_g_g_g_b_g_g_gAi_gAiAi_K_K_K_K_K_K_K_K________________________ _________________g_g_b_g_g_g_g_g_g_g_g_g_g_g_g_gAiAiAi_K________________________________________ _________________g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_gAiAiAi__________________________________________ _________________g_g_g_g_g_g_g_g_gB6_g_g_g_g_g_gAiAi_K__________________________________________ _________________g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_gAiAi____________________________________________ _________________g_gB6_g_g_b_g_g_g_g_g_g_g_g_b_gAi_K____________________________________________ _________________g_g_g_g_g_g_g_g_g_g_g_g_g_gB6_gAi______________________________________________ _________________g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_gAi______________________________________________ _________________b_b_b_b_b_b_b_b_b_b_b_b_b_b_b_b_K______________________________________________ } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/share/mon32mi.txt�������������������������������������������������������������0000664�0000764�0000764�00002547343�10545462320�015614� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������__ = (71, 108, 108) _A = (0, 0, 0) _B = (0, 0, 16) _C = (0, 0, 32) _D = (0, 0, 48) _E = (0, 0, 64) _F = (0, 0, 96) _G = (0, 0, 128) _H = (0, 0, 160) _I = (0, 0, 192) _J = (0, 0, 224) _K = (0, 0, 255) _L = (0, 16, 0) _M = (0, 16, 16) _N = (0, 24, 0) _O = (0, 24, 24) _P = (0, 24, 48) _Q = (0, 32, 0) _R = (0, 32, 32) _S = (0, 32, 64) _T = (0, 48, 0) _U = (0, 48, 24) _V = (0, 48, 48) _W = (0, 48, 96) _X = (0, 64, 0) _Y = (0, 64, 32) _Z = (0, 64, 64) _a = (0, 64, 128) _b = (0, 80, 160) _c = (0, 96, 0) _d = (0, 96, 48) _e = (0, 96, 96) _f = (0, 96, 192) _g = (0, 112, 224) _h = (0, 128, 0) _i = (0, 128, 64) _j = (0, 128, 128) _k = (0, 128, 255) _l = (0, 144, 0) _m = (0, 160, 0) _n = (0, 160, 80) _o = (0, 160, 160) _p = (0, 182, 255) _q = (0, 192, 0) _r = (0, 192, 96) _s = (0, 192, 192) _t = (0, 224, 0) _u = (0, 224, 112) _v = (0, 224, 224) _w = (0, 255, 0) _x = (0, 255, 128) _y = (0, 255, 255) _z = (16, 0, 0) _0 = (16, 0, 16) _1 = (16, 16, 0) _2 = (16, 16, 16) _3 = (16, 48, 48) _4 = (24, 0, 0) _5 = (24, 24, 0) _6 = (24, 24, 48) _7 = (24, 48, 0) _8 = (24, 48, 24) _9 = (24, 48, 48) _$ = (32, 0, 0) A_ = (32, 0, 32) AA = (32, 32, 0) AB = (32, 32, 32) AC = (32, 64, 0) AD = (32, 64, 32) AE = (32, 64, 64) AF = (32, 242, 186) AG = (48, 0, 0) AH = (48, 0, 48) AI = (48, 12, 0) AJ = (48, 24, 0) AK = (48, 24, 24) AL = (48, 36, 0) AM = (48, 48, 0) AN = (48, 48, 24) AO = (48, 48, 48) AP = (48, 48, 96) AQ = (48, 96, 0) AR = (48, 96, 48) AS = (48, 96, 96) AT = (64, 0, 0) AU = (64, 0, 32) AV = (64, 0, 64) AW = (64, 0, 128) AX = (64, 16, 0) AY = (64, 32, 0) AZ = (64, 32, 32) Aa = (64, 32, 64) Ab = (64, 48, 0) Ac = (64, 64, 0) Ad = (64, 64, 32) Ae = (64, 64, 64) Af = (64, 64, 128) Ag = (64, 128, 0) Ah = (64, 128, 64) Ai = (64, 128, 128) Aj = (72, 108, 108) Ak = (80, 0, 160) Al = (80, 80, 80) Am = (80, 80, 160) An = (80, 160, 0) Ao = (80, 160, 80) Ap = (80, 160, 160) Aq = (96, 0, 0) Ar = (96, 0, 48) As = (96, 0, 96) At = (96, 0, 192) Au = (96, 16, 0) Av = (96, 24, 0) Aw = (96, 48, 0) Ax = (96, 48, 48) Ay = (96, 48, 96) Az = (96, 72, 0) A0 = (96, 96, 0) A1 = (96, 96, 48) A2 = (96, 96, 96) A3 = (96, 96, 128) A4 = (96, 96, 192) A5 = (96, 128, 96) A6 = (96, 128, 128) A7 = (96, 192, 0) A8 = (96, 192, 96) A9 = (96, 192, 192) A$ = (96, 144, 178) B_ = (104, 84, 31) BA = (108, 144, 182) BB = (108, 255, 0) BC = (112, 0, 224) BD = (112, 112, 112) BE = (112, 112, 224) BF = (112, 160, 160) BG = (112, 224, 0) BH = (112, 224, 112) BI = (112, 224, 224) BJ = (117, 105, 88) BK = (120, 120, 160) BL = (120, 160, 120) BM = (120, 160, 160) BN = (128, 0, 0) BO = (128, 0, 64) BP = (128, 0, 128) BQ = (128, 0, 255) BR = (128, 32, 0) BS = (128, 64, 0) BT = (128, 64, 64) BU = (128, 64, 128) BV = (128, 90, 72) BW = (128, 96, 0) BX = (128, 96, 96) BY = (128, 96, 128) BZ = (128, 112, 32) Ba = (128, 128, 0) Bb = (128, 128, 64) Bc = (128, 128, 96) Bd = (128, 128, 128) Be = (128, 128, 255) Bf = (128, 255, 0) Bg = (128, 255, 128) Bh = (128, 255, 255) Bi = (144, 72, 0) Bj = (144, 135, 110) Bk = (144, 144, 144) Bl = (144, 144, 192) Bm = (144, 192, 144) Bn = (144, 192, 192) Bo = (160, 0, 0) Bp = (160, 0, 80) Bq = (160, 0, 160) Br = (160, 40, 0) Bs = (160, 80, 0) Bt = (160, 80, 80) Bu = (160, 80, 160) Bv = (160, 120, 0) Bw = (160, 120, 120) Bx = (160, 120, 160) By = (160, 160, 0) Bz = (160, 160, 80) B0 = (160, 160, 120) B1 = (160, 160, 160) B2 = (160, 160, 224) B3 = (165, 118, 96) B4 = (168, 168, 224) B5 = (168, 224, 168) B6 = (168, 224, 224) B7 = (170, 136, 52) B8 = (170, 154, 128) B9 = (176, 176, 176) B$ = (178, 64, 0) C_ = (178, 224, 16) CA = (182, 72, 0) CB = (192, 0, 0) CC = (192, 0, 96) CD = (192, 0, 192) CE = (192, 48, 0) CF = (192, 96, 0) CG = (192, 96, 96) CH = (192, 96, 192) CI = (192, 144, 0) CJ = (192, 144, 144) CK = (192, 144, 192) CL = (192, 160, 64) CM = (192, 192, 0) CN = (192, 192, 96) CO = (192, 192, 144) CP = (192, 192, 192) CQ = (192, 192, 255) CR = (192, 255, 192) CS = (192, 255, 255) CT = (202, 144, 114) CU = (208, 168, 80) CV = (208, 208, 208) CW = (210, 210, 178) CX = (218, 218, 182) CY = (224, 0, 0) CZ = (224, 0, 112) Ca = (224, 0, 224) Cb = (224, 56, 0) Cc = (224, 112, 0) Cd = (224, 112, 112) Ce = (224, 112, 224) Cf = (224, 168, 0) Cg = (224, 168, 168) Ch = (224, 168, 224) Ci = (224, 192, 160) Cj = (224, 224, 0) Ck = (224, 224, 112) Cl = (224, 224, 168) Cm = (224, 224, 224) Cn = (229, 162, 130) Co = (240, 240, 240) Cp = (242, 0, 0) Cq = (242, 96, 0) Cr = (242, 196, 77) Cs = (248, 224, 96) Ct = (252, 252, 153) Cu = (255, 0, 0) Cv = (255, 0, 128) Cw = (255, 0, 255) Cx = (255, 64, 0) Cy = (255, 108, 0) Cz = (255, 128, 0) C0 = (255, 128, 128) C1 = (255, 128, 255) C2 = (255, 182, 144) C3 = (255, 192, 0) C4 = (255, 192, 192) C5 = (255, 192, 255) C6 = (255, 211, 176) C7 = (255, 255, 0) C8 = (255, 255, 128) C9 = (255, 255, 192) C$ = (255, 255, 255) # tile 0 (giant ant) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________________AeAeAe____________________________________ ______AeAe_M________AA_M_MAeAeAe________________________________ __AeAeAe_M__AA_______C_________________________M_M______________ __AeAB_z_____C_____M_____________M________A__M__AA______________ _______________M__AKAeAeAeAeAe_MAK_____M_M______A_______________ ______________AA___MAOAOAOAO_MAe_z_O_z_____________M____________ _______M_zAB_qAeAOAO_qABAB_zAOAB_M__AeAeAe_________M____________ ______AB___h_qAOAOAO_h_q_OAB_zAB_zABAOAeCPAe______AA____________ _______M___q_hAO_MAO_h_hAA_MAB_M_M_zABAOAOCPAe_____M____________ _______z___hAO_MAK_M_qA__MA__M_z__ABABABAOAeCPAe_____M__________ _______O____AO_z___MAO__AA___M_____M_zAB_MAOCPAe____A___________ _______z____AO_O__AAAO___M__AB_____MABABABABAOAe_____M__________ ______AB_____MAO__AO_____M___z____AA_BAAAB_MABAO____AA__________ _____M_______$_________A_____M____A__MA__OAK_MAO_______M________ _____M_______O_________A____AB_z___M__AA_MABABAB_______M________ ____AA_____A___________A_______O_____A__AB_zABAB______AB________ _____C_____A___________A_______z_____A_________________z________ ___M_______A_________A_M_A_A_AAB_A_A_M_A_A_A_A_A_A_______M______ _MAK___A_A_A_____A_A_A_z_A_A_A_M_A_AAA_A_A_A_A_A_A_A_____M______ _____A_______A_A_A_A_A_A_A_A_A_A_A_A_M_A_A_A_A_A_A_A_A___zAB_z_M _______A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_z_A_A_A_A_A________________ _____________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A____________________ } # tile 1 (killer bee) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ CmCmCmCVCVCVCVCV__________________CVCVCVCVCVCV__________________ __CPCPBDBdBdCPBdCmCm__________CVCVCPBdCmCPBdBdCVCV______________ ____BDCPBdCmCmCVCPBdCm______CVBDCPBdCmBdBDCPCmCPBdCVCV__________ __________BdBdBdCPCPCPCVCm__CVCPBDBdCmBdCPBDCPCVCPBnBdCVCV______ ______________CPBdCVBdBDCPCmBdBDCP______BkCPBDCmBdBdCJCPBdCVCV__ _______________z___MCfCjCfCfCj____________________CPBnCJBdBd____ _______________M__AKCfCjCfCjCfCf________________________________ ___________MAACfCjCfAK_$CfCfCfCjCf___MCfCj______________________ ________AA_MA_CjCfCf_M_MAKCfCfCfCf_zAKCjCf_z____________________ _________CAAA_CfCfCfAK_M_zCICICICfAB_zCfCjAKCf__________________ __________ABCfCfCfCf_zABCfCICfCI__ABCfCfCf_$Cj_M________________ ____________CjCI__CICj__Cf__Cj____CICfCfAK_OCfAK________________ ____________CfCI__CICf__Cj____Cf__CICI_MAACfCf_M________________ ______________Cf__Cf____Cf____Cf___MAB_zCfCfAKCj________________ ________________________Cf____Cj____CICICf_MAKCf________________ __________________________Cf__Cf_______MAB_zCfCf________________ __________________________Cf____Cf______CICICICj________________ ________________________________Cj__________CI__________________ _______________________L_A_A_A_A_z_z_A_A_A_ACm__________________ ___________________A_A_A_A_A_A_A_A_A_A_A_A_ACm_A________________ _______________A_A_A_A_A_A_A_A_A_A_A_A_A_A_ACm_A________________ ___________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A________________ _______________________A_A_A_A_A_A_A_A_A_A_A____________________ } # tile 2 (soldier ant) { ________________________________________________________________ _________________MAA_M_M________________________________________ __________________ABA_AA________________________________________ _______M____________AB_M________________________________________ _____MAK_______________M________________________________________ _____z_M______________A_________________________________________ _____OAKAB_____________M________________________________________ ______AB_MAB___________M________________________________________ ___________M_z________AB________________________________________ _______________O____AA_M_h_h____________________________________ ________________AB_MA_ABAe_h____________________________________ _________________hABABABABAe____________________________________ _________________h_hABABABAOAOAeAe____________AB_M______________ ________________________AOABAOAeC$Ae______ABAB___M______________ _____________MABAB______ABABABAOAeAe__ABAB______AA______________ _____________M____ABAB__ABABABABAOAOAB_____________M____________ ____________AA________ABABABABABAOABAeAeAe________A_____________ _____________C____ABABABABABABAOABAOAOAeC$Ae_______M____________ _____________M____AB________AB____ABAOAOAeC$Ae_____M____________ ____________AA____AB________AB____ABABAOABAeC$Ae_____M__________ _____________M____AB________AB_____MABABAOAeC$Ae____AK__________ ____________A_____AB______AB_______zABABAOAOAeAeAe___M__________ ___________M______AB______AB______ABABABABAOABAeAe___M__________ ___________M____AB________AB_______MABABABABAOAOAeAe___M________ __________AA____AB________AB_______M__ABABABABAOABAe__AK________ ___________M____AB________AB_________M__ABABABABAOAe___M________ __________A____M_M_____M_MAA________AK____ABABABAOAe___M________ ___________M___A_z_A_A_z_A_A_A_A_A_A_M________ABAO_______M______ ___________M_z_A_A_A_A_A_A_A_A_A_A_M_$_A_A_A_AABAB_A_A_AAK______ ______AA_M_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_M_M_A_A ___________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_z_A__ _________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A__________ } # tile 3 (fire ant) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________________CuCuCu____________________________________ ______CuCuCu________CBCBCBCBCuCu________________________________ __CuCuCBCB__CB______CB________________________CBCB______________ __CBCBCB____CB____CB____________Bo________CBCB__CB______________ ______________CB__CBCuCuC$C$CuBoBo____CBCB______CB______________ ______________CB__CBCuCuCuCuBoCuBoCBCB____________CB____________ ______CBCuCuCzCuCuCuCzCuCYCYBoCYBo__CuCuCu________CB____________ ______CB__CzCcCuCuCzCcCcCBBoCBCBCBBoCYCYC$Cu______CB____________ ______CB__CcCcCuCuCcCzCFBoBoBoBoBNBoCBCBCYC$Cu____CB____________ ______CB__CcCuCuCuCuCFCBBNBNBNBN__CBBoCBCBBoC$Cu____CB__________ ______CB____CuCu__CuCu__CB__CB____CBBoBoBoCBC$Cu____CB__________ ______CB____CBCu__CuCu__CB__CB____CBBNBNCBCBCBBo____CB__________ ______CB____CBCu__Cu____CB__CB____CBBNBoBoCBBoCB____CB__________ ____CB______CB________BN____CB____CBCBBNBoBNCBCB______CB________ ____CB______CB________BN____CBBN__CB__BNBNBoBoBo______CB________ ____CB____BN__________BN______BN____CB__BNBNBNBo______CB________ ____CB____BN__________BN______BN____CB________________CB________ __BN______BN________BNBN_A_A_ABNBN_ACB_A_A_A_A__________CB______ BNBN__CBCBBN_____A_A_A_A_A_A_A_A_A_ACB_A_A_A_A_A________CB______ _______________A_A_A_A_A_A_A_A_A_A_ACB_A_A_A_A_A_A______CBCBCBCB ___________________A_A_A_A_A_A_A_A_ACBCB_A_A_A_A________________ _______________________A_A_A_A_A_A_A_A_A_A_A____________________ } # tile 4 (giant beetle) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ AX__AXAXAX______________________________________________________ __AvAv__________________________________________________________ AXAXAXAXAX______________________________________________________ ___$AX__________________________________________________________ ___$AX__________________________________________________________ ___$AX______AvAvBR______________________________________________ ___$AXAv________AvBR__BrBrBrBrBrBrBrBrBrBr______________________ ___$_$AX________AvAvBRAXAXAXBrBrBrBrBrBrBrBrBrBr________________ _____$AXAv____BrBrAvBRBRBRBRAXAXBRBRBRBRBRBRBRBrBrBr____________ _____$AXAXAvBrBRBRBRBRBRBRBRAvAvAXBRBRBRBRBRBRBRBRBRBR__________ _____$_$AXAvAvBRBRBRBRAvAvAvBRBRAXAvAvAvAvAvAvAvBRBRBRBR________ _______$AXAXAvAvAvAvAvBRBRBRBRBRBRAXBRBRBRBRBRBRAvAvAvAv________ _______$_$AXAX_XAXAvAvAvAvAvAvAvAvAXAvAvAvAvAvAvBRBRBRBR________ _________$AX_X_X_XAXAvAvAvAvAvAvAvAXAvAvAvAvAvAvAvAvAvAv________ ___________$_$_X_$AXAvAvAvAvAXAXAX_$AXAXAXAXAXAXAXAXAvAv_A______ _____________$_$_$_$AXAXAXAXAXAXAX_$AXAXAXAXAXAXAXAXAX_A_A______ ______________BRBR_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_A_A_A_A______ __________BRBRAvAv_A_A_A_A_A_ABRBR_A_ABRAv_A_ABRAvAv_A_A_A______ ______BRBRAvAv_A_A_A_A_A_A_ABRAv_A_A_ABRAv_A_A_ABRBRAvAv________ ____BRAv_____A_A_A_A_A_A_ABRAvAv_A_A_A_AAv_A_A_A_A_A_AAvAv______ __BRAv_A_A_A_A____________Av_A_A_A_A_A_A_AAvAv_A_A_A_A_A__AvAv__ __Av___A__________________Av___A_A_____A_A__Av_________A_A__Av__ ________________________AvAv___A_________A_AAvAv________________ ________________________Av___A_A___________A__Av________________ ________________________Av___A________________AvAv______________ ______________________AvAv______________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 5 (queen bee) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ CmCmCmCVCVCVCVCV________________________________________________ __CPCPBdBdBdCPBdCmCm______________CVCVCVCVCVCV__________________ ____BDCPBDCmCmCmCPBdCm________CVCVCPBdCmCPBdBdCVCV______________ __________BdBDCPCVCPCPCV____CVBDCPBdCmBdBDCPCmCPBdCVCV__________ ______________BdCsBdCPCPCm__CVCPBDBdCmBdCPBDCPCVCPBnBdCVCV______ ____________Cs__Cr__CL__CPCmBdBDCP______BkCPBDCmBdBdCJCPBdCVCV__ ____________CsCrCrCsCLC$CVCfCj____________________CPBnCJBdBd____ ____________CsCsCrCLCLCmC$CoCfCf________________________________ __________CZBOCsCsCLCZCZCmCmCmCjCf___MCfCj______________________ ________BOCZBOCICIBvCZBOBOC$CPCfCf_zAKCjCf_z____________________ ________CZBOCZCIBvBvBOCZBOCPCPCICfAB_zCfCjAKCf__________________ __________BOCfBvBvCfCZBOCJBkCfCI__ABCfCfCf_$Cj_M________________ ____________CjCI__CICfBmCf__Cf____CICfCfAK_OCfAK________________ ____________CfCI__CfCf__Cj____Cj__CICI_MAACfCf_M________________ ______________Cf__Cf____Cf____Cf__AK_MA_CfCfAACf________________ ________________________Cj____Cj____CICICf_MA_Cj________________ __________________________Cf__Cf_______MAAA_CfCf________________ __________________________Cf____Cf______CICICICj________________ ________________________________Cj__________CI__________________ _______________________A_A_A_A_A_z_z_A_A_A_ACm__________________ ___________________A_A_A_A_A_A_A_A_A_A_A_A_ACm_A________________ _______________A_A_A_A_A_A_A_A_A_A_A_A_A_A_ACm_A________________ ___________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A________________ _______________________A_A_A_A_A_A_A_A_A_A_A____________________ } # tile 6 (acid blob) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________CCCCCCCCCC____________________________ ______________________CCCCCCCCCuCuCCCCCC________________________ ____________________CCCCCCCdCuCYCYCBCCCCCC______________________ __________________CCCCCCCCCnCuCYCBCBCCCCCCCC____________________ __________________CCCCCCCCCdCZCBCBCCCCCCCCCCCC__________________ ________________CCCCCCCCCnCdCCCCCCCCCCCCCCCCCC__________________ ________________CCCCCCCCCdCnCuCBCCCCCCCCCCCCCC__________________ ________________CCCuCuCZCnCdCBCBCCCuCuCCCCCuCYCC________________ ______________CCCuCYCYCdCdCZCCCCCuCYCYCBCCCYCBCC________________ ______________CCCuCYCYCdCnCCCCCCCuCYCBCBCCCCCCCCCC______________ ____________CCCCCCCBCBCnCdCZCCCCCCCBCBCCCCCCCCCCCC_A_A_A_A_A____ ____________CCCCCCCCCnCdCCCCCuCYCCCCCCCCCCCYCYCCCC_A_A_A_A_A_A__ ____________CCCCCCCCCdCnCZCCCYCBCCCCCCCCCYCYCYCBCCCC_A_A_A_A_A__ __________CCCCCCCCCZCnCdCCCCCCCCCCCCCCCCCYCYCBCBCCCC_A_A_A_A_A__ ________CCCCCCCCCCCdCdCZBpCuCuBpBpBpBpBpBpCBCBCCCCCCCC_A_A_A_A__ ______CCCCCuCYBpCCCdCnBpCuCYCYCBBpBpBpBpBpBpBpBpCCCCCCCC_A_A____ ______CCCCCYCBBpCdCnCdCCCuCYCBCBBpBpBpBpBpBpBpBpBpBpBpCC_A_A____ ______BpBpBpBpCCCdCnCdBpBpCBCBBpBpCYCYBpBpBpBpBpBpBpBpBp_A______ _______ABpBpBpCdCnCdCCBpBpBpBpBpBpCYCBBpBpBpBpBpBpBpBp_A_A______ _______A_A_ACCCnCdCnBpBpBpBpBpBpBpBpBpBpBpBpBpBpBp_A_A_A________ _________A_A_A_B_zCdCCBpBpBpBpBpBpBpBpBpBpBp_A_A_A_A_A__________ _____________A_A_B_B_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A____________ _________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A__________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 7 (quivering blob) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ _______________________________g_g_k_k_k________________________ _______________k_k_k_g_g___g_g_g_g_k_k_k_g______________________ _____________k_k_k_k_k_g_g_gCPCP_k_k_k_g_g_g_g__________________ _____________g_g_k_k_k_k_gCPCPCP_k_k_k_g_g_g_g_k_k_k____________ _____________g_g_g_k_k_k_kCPCP_k_k_k_g_g_k_k_k_k_k_k_k__________ _____________g_g_g_g_k_kCPCP_k_k_k_k_g_k_k_k_k_k_k_k_k__________ _____________g_g_g_g_k_kCPCP_k_k_k_k_k_k_k_k_k_k_k_g_g__________ _____________g_g_g_g_g_gCP_k_k_k_k_k_k_k_k_k_k_k_g_g_A_A_A_A____ _______________g_g_g_g_g_g_g_k_k_k_k_k_g_g_g_g_g_g_A_A_A_A_A____ _____________g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_A_A_A_A_A_A__ _____________g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_f_f_f_g_g_A_A_A_A____ ___________g_g_g_g_f_f_f_g_g_g_g_g_g_g_g_f_f_f_f_f_g_g_A_A_A____ ___________g_g_f_f_f_f_f_f_g_g_g_g_g_g_f_f_f_f_f_f_f_f_A_A______ ___________g_f_f_f_f_f_b_b_f_f_f_f_f_f_b_b_b_b_f_f_f_f_A_A______ ___________f_f_f_f_b_b_b_b_b_f_f_f_f_f_b_b_b_b_b_b_b_A_A_A______ _________A_f_f_b_b_b_b_b_b_b_f_f_f_f_b_b_b_b_b_A_A_A_A_A________ _________A_A_b_b_b_b_b_b_b_b_b_f_f_f_b_b_b_b_A_A_A_A_A__________ _________A_A_A_b_b_A_A_b_b_b_b_f_f_f_b_b_b_b_A_A_A_A____________ ___________A_A_A_A_A_A_A_A_A_b_f_f_f_b_b_b_A_A_A________________ _______________A_A_A_A_A_A_A_A_f_f_f_b_b_A_A_A_A________________ ___________________________A_A_A_A_A_A_A_A_A_A__________________ _______________________________A_A_A_A_A_A______________________ ________________________________________________________________ } # tile 8 (gelatinous cube) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________BdBk____________________________ ____________________________BdBdBdBnCJBk________________________ ________________________BdBdBdBdBdBkBnCJBnBk____________________ ____________________BdBdBdBdBdBdBdCJBkBkCJBnCJBk________________ ________________BdBdBdBdBdBdBdBdBdBnBkCPBkBkBnCJBnBk____________ ____________BdBdBdBdBdBdBdBdBdBdBdCJBnBkCPBkCJBMCJCP____________ ____________CPBdBdBdBdBdBdBdBdBdBDAlBJBkBkCPBkBnCPCP_A__________ ____________BnCJCPBdBdBdBdBdBdAlBDAlBDBJBkBkCJCPCPCP_A_A________ ____________CPBnCJBnCPBdBdBdAlBDAlBDAlAjBDBDCPCPCPCP_A_A_A______ ____________CPCJCPCPBkCPBdBJAjBJAlBDAlBDAlBkBnCPCPCP_A_A_A_A____ ____________CPBnCPBkCPBdBdBdBdAlBDAlBDAlCOBlCJBkCPCP_A_A_A_A_A__ ____________CPBkCPCPBDBdBdBdBdBdBdBDAlBlBkCOBlBmCKCP_A_A_A_A_A_A ____________CJCPBDBdBdBdBdBdBdBdBdBdCKBmCJBlBmBxBmBk_A_A_A_A_A_A ____________BnBdBdBdBdBdBdBdBdBdBdBdBkBkBnCJBkCPBk_z_A_A_A_A_A_A ____________BdBdBdBdBdBdBdBdBdBdBdBdBkCPBkCJBnBk_A_A_A_A_A_A_A_A ________________BdBdBdBdBdBdBdBdBdBdBmBxBmBlCJ_A_A_A_A_A_A_A_A__ ____________________BdBdBdBdBdBdBdBdCKBkCPBk_L_A_A_A_A_A_A_A____ ________________________BdBdBdBdBdBdBmBkBk_z_A_A_A_A_A_A________ ____________________________BdBdBdBdBkCK_M_A_A_A_A_A____________ ________________________________BdBdBm_A_A_A_A__________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 9 (chickatrice) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________CdCd____________________________ ____________________________BDCdCdBk____________________________ ____________________________CPClClClCP__________________________ ________________________ByCjBk_AClClClBk________________________ ______________________ByCjCj_AAlClClClCV________________________ ____________________ByCjCjCMClClClClCjCj____CjCjCjCtCoCtCoCt____ ________________ByByAzBaByByClClClCtCjCj____CjCjCjCPCPCP________ ________________________AzBWCdCdClClClCtCjCjCtCVCWBkBk__________ ______________________________CdClClCRClCjCjCPCRBkAl____________ ________________________________CRClCRCR_m_qBkAl________________ ________________________________CRBGCRBf_m_h_h_h________________ _________________________________mAnBf_tBfBf_m_hAQAQ____________ ________________________________AnBGBfAnBG_t_m_m_hAQ_d__________ _________________________________d_d_mBfAn_m_t_m_m_hAQ__________ ___________________________________d_h_mBf_m_m_m_m_hAQ__________ _____________________________________________m_t_m_hAQ__________ ___________________________________________h_m_m_mAQ_U__________ _____________________________m_____________mBG_m_hAQ____________ ____________________________AQ_m_i_____i_m_t_m_mAQAQ____________ ____________________________AQ_m_m_m_m_mBG_m_mAQAQ______________ ______________________________AQ_m_mAnAnAgAgAQAQ________________ ________________________________AQAgAgAgAQAQ_U__________________ __________________________________AQAQAQ_U______________________ ________________________________________________________________ ________________________________________________________________ } # tile 10 (cockatrice) { __________BoBo__BNBo____________________________________________ ________BoBNBoBNBoBoBN__________________________________________ ________BoBNBoBNBoBNBo__________________________________________ __________BNBoBNBoBN____________________________________________ __________BoCPCPBkBd____________________________________________ ____________CPCPCuBdBd__________________________________________ ________CfCfCPCuCuBkBkBd________________CPCP____________________ ______CfCICICICICPCPBkBd________________CPCPCP__________________ ____CfCICIBvBvBvCPCPBkBk__________________CPCPCPCP______________ ____CIBvBv__BoBNBoCP_i_d_d______________CPCPBkCPCPBkCP__________ ______________BNBoCP_i_i_d____________CPCPCPCVBkCVBkCVCP________ ______CP____BoBoBNBo_i_i_d____________CVBkBkCVBkCVBkCPBkCP______ ____CPCP____BNBoBNBo_d_i_d_d______CPBkCPCVCPBkCVBkCVCPBnCJCP____ ____CPCPCP__BoBNBNBo_d_i_i_d_d__BkCPCPCPBkCPBkCPCPCPBkCPCPBnBk__ __CPBkCPBkCVCPBNBoBN_d_i_i_i_dCPCVBkCVBkCVBkCVBkCPBkCVBkCPCJCP__ __CPCPCPCPCPBkCP_Y_Y_d_d_i_i_d_dCVBkCVBkBkCPBk____CP__BkCP____CP CPBkCPBkCPBkCVBk_Y_Y_d_d_iCP_i_d_dBkCP_______A_A_A_A_z____CP____ CPCVBkCVBkCPCPCV_Y_Y_Y_d_d_iCP_i_i_d_d___A_A_A_A_A_A_A_A_A_A____ CPBk__CPCPBk__BkCP_Y_Y_d_d_d_iCPCP_i_d_d_d_A_A_A_A_A_A_A_A_A____ CP____CP__CV_______Y_Y_Y_d_d_d_d_i_i_i_i_d_d_d_A_A_A_A_A_A_A_A__ _____________________Y_Y_Y_d_d_d_d_d_i_i_i_d_d_d_d_A_A_A_A_A_A__ _____________________Y_Y_Y_d_d_d_d_d_d_d_i_i_i_i_d_d_A_A_A_A_A__ _____________________Y_Y_Y_Y_Y_d_Y_Y_Y_d_d_d_d_i_i_d_d_A_A_A_A_A _____________________Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_d_d_d_i_i_d_d_A_A_A_A __________________Bv_Y_Y_A_A_Y_Y_Y_Y_Y_Y_Y_Y_Y_d_d_i_d_d_Y_A_A_A __________________BvAz_A_ACI_Y_Y_A_A_A_A_A_A_Y_Y_d_i_d_d_Y_A_A_A ________________BvAz_A_A_ACIAz_Y_A_A_A_A_A_A_A_A_iCP_d_d_Y_Y_A_A ____________CIBvBWAz_A_ABvBWAz_A_A_A_A_A_A_A_A_ACP_i_d_Y_Y_Y_A__ __________CI_A_AAz_A_ABvBWAz_A_A_A_A_A_A_A_A_iCP_i_d_Y_Y_Y_A_A__ ___________A_A_A_A_ABv_A_AAz_A_A_A_A_A_d_i_d_d_d_Y_Y_Y_A_A_A____ ___________________A_A_A_A_A_A_d_d_d_d_Y_Y_Y_Y_Y_A_A_A_A_A______ _______________________________A_A_A_A_A_A_A_A_A_A_A_A__________ } # tile 11 (pyrolisk) { __________CYCY__BoCY____________________________________________ ________CYBoCYBoCYCYBo__________________________________________ ________CYBoCYBoCYBoCY__________________________________________ __________CYCYBoCYBo____________________________________________ __________CYCPCPBkBd____________________________________________ ____________CPCPCuBdBd__________________________________________ ________CfCfCPCuCuBkBkBd________________CPCP____________________ ______CfCICICICICPCPBkBd________________CPCPCP__________________ ____CfCICIBvBvBvCPCPBkBk__________________CPCPCPCP______________ ____CIBvBv__CYBoCYCPBNAqAq______________CPCPBkCPCPBkCP__________ ______________BoCYCPBNBNAq____________CPCPCPCVBkCVBkCVCP________ ______CP____CYCYBoCYBNBNAq____________CVBkBkCVBkCVBkCPBkCP______ ____CPCP____BoCYBoCYAqBNAqAq______CPBkCPCVCPBkCVBkCVCPBnCJCP____ ____CPCPCP__CYBoBoCYAqBNBNAqAq__BkCPCPCPBkCPBkCPCPCPBkCPCPBnBk__ __CPBkCPBkCVCPBoCYBoAqBNBNBNAqCPCVBkCVBkCVBkCVBkCPBkCVBkCPCJCP__ __CPCPCPCPCPBkCPATATAqAqBNBNAqAqCVBkCVBkBkCPBk____CP__BkCP____CP CPBkCPBkCPBkCVBkATATAqAqBNCdBNAqAqBkCP_______A_A_A_A_z____CP____ CPCVBkCVBkCPCPCVATATATAqAqBoCnBNBNAqAq___A_A_A_A_A_A_A_A_A_A____ CPBk__CPCPBk__BkCPATATAqAqAqBNCdCnBNAqAqAq_A_A_A_A_A_A_A_A_A____ CP____CP__CV______ATATATAqAqAqBNBNBNBNBNAqAqAq_A_A_A_A_A_A_A_A__ ____________________ATATATAqAqAqAqAqBNBNBNAqAqAqAq_A_A_A_A_A_A__ ____________________ATATATAqAqAqAqAqAqAqBNBNBNBNAqAq_A_A_A_A_A__ ____________________ATATATATATAqATATATAqAqAqAqBNBNAqAq_A_A_A_A_A ____________________ATATATATATATATATATATATAqAqAqBNBNAqAq_A_A_A_A __________________BvATAT_A_AATATATATATATATATATAqAqBNAqAqAT_A_A_A __________________BvAz_A_ACIATAT_A_A_A_A_A_AATATAqBNAqAqAT_A_A_A ________________BvAz_A_A_ACIAzAT_A_A_A_A_A_A_A_ABNCdAqAqATAT_A_A ____________CIBvBWAz_A_ABvBWAz_A_A_A_A_A_A_A_A_zCnBNAqATATAT_A__ __________CI_A_AAz_A_ABvBWAz_A_A_A_A_A_A_A_ABNCdBoAqATATAT_A_A__ ___________A_A_A_A_ABv_A_AAz_A_A_A_A_AAqBNAqAqAqATATAT_A_A_A____ ___________________A_A_A_A_A_AAqAqAqAqATATATATAT_A_A_A_A_A______ _______________________________A_A_A_A_A_A_A_A_A_A_A_A__________ } # tile 12 (jackal) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________Bj____________Bj________________________________________ ________BmBc________BjBj________________________________________ ________CTBc______BmBcBc______________BcBcBc____________________ ________BmBjBc__BkBzBc__________________BmBjBc__________________ ________BjCNBkBzCJBmBc__________________BcBcCJB_________________ ________CJBLCTBmBcBjBc____________________BcBcB_________________ ______BjBmBzBkBcBzBjBj______________________BcAh_____A_A________ _______LCT_L_zBkBcBcBzBk____________________BcB______A_A________ _______ABj_LBjCNBcBcBcBcBc________________BcBcB______A_A________ ______BkCNBkBcBcBcBcB_BcCTBLCTBjBmBjBcBjBmBjBcAl_____A_A________ ____BjBmBjBjBcBcBcAlBcBcBcBcBcBmCTBcCOBjBjBcBcBZ_A_A_A_A________ ____BmCTBcBcCuBcB_AhB_BcBcBcBcBcBcBcBcBcBcBcBcB__A_A_A_A________ __BjBzBcBcCuBc__B_B_BjAhBcBcBcBcBcBcBcBcBcBcBcB__M_A_A_A________ __COBkBcCuBc____CJAhB_B_BjBcB_B_BcBcB_CNBjBcBLB__A_A_A_A________ ______CuBc______BLBjB_BJBmBcB_BLB_AlB_BkBcBcB__B_A_A_A_A________ ________________BzBc_MB_BzBcB_AlB_B_BmBcB_Bc_A_A_A_A_A_A________ ________________BkBc_A_ABkBj_L_L_L_ABjBjBc_L_A_A_A_A_A_A________ ______________CTBmB__A_LBcBc_A_A_A_A_zBmBcB__A_A_A_A_A_A________ ____________BLBcB_B__M_ABjBc_A_A_A_A_A_ABjBjBc_A_A_A____________ ____________BjBcAhBc_ACTBmB__A_A_A_A_ABcBcBcB__A_A_A____________ _____________A_A_z_ABkBcBcBc_A_A_____ABcBcB_Ah_A________________ ___________________LBcBcB_B__A_______A_A_M_A_z_A________________ ___________________A_A_L_M_A_A__________________________________ ________________________________________________________________ } # tile 15 (werejackal) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________Bj____________Bj________________________________________ ________BmBc________BkBj________________________________________ ________CTBc______BzBcBc________________________________________ ________BLBjBj__BkCOBc__________________________________________ ________BkCNBkBcBzBjBc__________________________Bj______________ ________BzBkCNBkBmCTBc__________________________BmB_____________ ______BjCOBkBzBkBzBcBL__________________________BkB_____________ ______CjCNCjCjCOBcBcBcCTBL______________________BzBjB___________ ______CjCOCjBzBcBcBcBcBcBcCj______________________BkBLB_________ ______COBjCOBcBcBcBcB_BcBcCMCjCj__________________BzBcAl________ ______BzBjBcBcBcBcB_BcBcCMCMCMCM__________________BkBcB_________ ____BkBmBcBcCuBcB_AhB_ByByCMCMCMBj________________CNBcB_________ ____BzBcBcCu_o__ByCjByByByCMCMCMCjBk____________BkBcBdB_________ __B_BkBjCuBc_o__BkByByByCMCMCMBcCMCMCj__________BzBcBcB_________ ______CuBc___o__CMBcByByCMCMCMBcBcCMCMCj______BkBcBcBcB_________ _____________o__BkBcBcByCMCMCMByBcCMCMCM_H_H_HBcB_Ah____________ ________________CNBcBc__CMCMCMByB_CMCM_H_H_H_HB_________________ _____________o__BkBcBc__BjBjCMByBaCMCM_F_H_H_GBJ________________ ________________BcBcBc____BjBcBcBa_H_H_F_HBc_G__________________ ________________BcBcBc____CNBcBc___H_F_F_HBc_G__________________ ________________BcBc______BkBcBc___H_F_F_HBc_G__________________ ________________BcBcB_Bc__BjBc_____H_G_HBcB__G__________________ ________________BjBcBcBc__BmBcB___Bc_G_HBcB__G__________________ __________________BmBj______BcBc__Bc_G_HB__H_G__________________ ___________________________________G_G_H_H_G_G_A_A_A_A_A_A_A_A__ _________________________A_A_A_AB_AlB__H_H_G_G_A_A_A_A_A_A_A____ _________A_A_A_A_A_A_A_A_A_A_A_A_A_L_LBJB_AhB__A_A_A_A_A_A______ _______________A_A_A_A_A_A_A_A_A_A_A_A_A_A_z_A_A_A_A____________ ________________________________________________________________ } # tile 16 (little dog) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________BSBS____________________ ________________________________________BSBs____________________ ________________________________________BsBSBS__________________ ________AYAYAYBsBSBsBs__________________BSBSBs__________________ ______AYAYAYBsBsBSAYAYBS__________________BsBS__________________ ______AYAYBSBsBSBSAYAYAYBsBSBsBsBsBs______BSBS__________________ __________BS_AC$BSAYAYAYBSBsBsBSBsBSBsBsBsBSBs__________________ ________BSBS_A_ABSBSAYAYBSBSBSBSBSBSBSBSBSBs____________________ _______ABkBSBSBSBSBSAYBSBSBSBSBSBSBSAwBSBSBSBS__________________ _______ABnCJBdBSAwBSBSBSBSAwBSAwBSBSBSBSBSBSBS__________________ _________ABdBd_A_AAwAwAwBSAwAwBSAwAwAwBSAwBSBS_A_A______________ _______________A_AAwAw_ABSBSAwAwAwAwAwBSAwBS_A_A_A_A____________ _____________A_A_MBkBk_ABSAw_A_ABdBd_ABSAwAw_A_A_A_A____________ _____________A_ABkCPBk_MCPBk_ABdBdBd_ACPBkAw_A_A_A_A____________ _____________A_A_A_A_zBkCPBk_A_A_A_ACPCJBn_A_A_A_A______________ _______________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A__________________ ___________________A_A_A_A_A_A_A_A_A_A_A_A_A____________________ } # tile 17 (dog) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________AwBDCiBi________________________________________________ ________AwAwCnBS____________________________________BsCFBsCF____ ________BSBsCABSBS________________________________CzCFCFCFBsCF__ ________Bs_ABsCFBSCF____________________________CzCzCFCFBsBsBsBs ______CPBk_ABsBsCFBsCF__________________________CzCFCFCFCzCFBsBs __ABCPBkCPBkCFBsCFCFBsCF________________________CzCF__BD__CzCFBs __ABCPCPBkBkBsCFBsBsBsBsCcCF____________________CzCF______CzCFBs ______BkBkBDCFBsCFCFBsCcBsBsCFBsCFBsCFBsCFBs______CF______CzCF__ ______________CFBsBsCFBsBsCFBsBsBsCFBsCFBsBsCFBsBs______CzCF____ ______________CFCzBsBsCFBsBsBsBsCFBsCFBsBsBsBsBsBsBsBsBsCFCF____ ________________CFCFBsCFCFBsCFBsBsCFBsCFCFBsCFBsCFBsCFBsCF______ ________________CFCzBsBsCFBsBsCFBsBsBsBsBsBsCFBsCTCFBsBs________ __________________CzCFBsBsCFBsBsBsCFBsBsBsBsBsCFBsBsBs__________ __________________BSCzBsCFBsBsBsBsBsBsBsBsBsBsBsBsBsBS__________ __________________BSBSCFBsBsBsBsBS______CFBSBSBsCzBSBs__________ __________________BSAwCzBsBsBsBS__________CFBS____CFBSBs________ __________________BSAwBSCFBsBS____________B_CFBS____CzBS________ __________________BSAw__B_CzBS______________CFBS____CFBs________ _________________A_AAw_A_ACFBS_A_A_A_A_A_A_ACFBS_A_ACzBS_A______ _____________A_A_ABSBS_A_ACFBS_A_A_A_A_A_A_ABSBk_A_ACFBs_A_A____ ___________A_A_ABkBk_A_A_ACzBs_A_A_A_A_A_A_ABkBk_A_A_ABS_A_A_A__ _____________A_A_A_A_A_A_ACFBj_A_A_A_A_A_ABkBk_A_A_ABkBk_A_A_A__ _______________A_A_A_A_ABkBkBk_L_A_A_A_A_A_A_A_A_ABkBk_A_A_A____ _______________________A_A_A_A_A_________________A_A_A_A________ } # tile 18 (large dog) { ________________________________________________________________ ________________________________________________________________ ______BsBsAwAwAw________________________________________________ ____BsBsBsBsAwAwAw______________________________________________ __BsBsBtAJBsAwAwBsBs____________________________________________ __AJAJBsBsBsAwAwBsBsBs__________________________________________ __AJCPCPBiBsBsBsBsBsBsBs________________________________________ __CKBmCKBkBsBsBsBsBsBsBsBs______________________________________ ____BkBkBk__BsBsBsBsBsBsBsBs________________________Bs__________ ______________BsBsBsBsBsBsBsBtBsBs________________BsBsBs________ ______________BsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBs__________ ______________BsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBs__________ ______________BsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBs________ ______________BsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBs______ ______________BsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBs______ ______________BsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBs______ ______________CFCFBsBsBsBsBsBsBsBsBSBSBSBSBSBSBsBsBsBsBsBSBS____ ________________CFBsBsBsBsBsBSBSBSBSBSBSBSBSBSBSBsBsBsBsBSBS____ ________________CFCFCFBsBsBSBSBSBS________BsBsBSBsBsBtBSBSBS____ ________________BsCFCFBsBsBSBS____________BsBsBSBSBsBsBSBSBS____ ________________BsBSCFCFBsBS________________BsBSBS____BsBZBSBS__ ________________BsBSCFCFBsBS________________BsBsBS______BsBVBS__ ________________BsBSCFCFBsBS__________________BsBsBS______BsBSBS ________________BsBS__CFBs______________________BsBS________BsBS ________________BsBS__CFBs______________________BsBS________BsBS ________________BsBS__CFBs____________________AwBsBS________BsBS ________________BsBS__CFBs__________________AwAwAw__________BsBS _________A_A_A_ABSBS_ACFBs_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_ABsBS _______A_A_A_ABSBSBS_ACFBs_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_AAwAw _________A_A_A_A_A_A_ABSBS_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_AAwAwAw _____________A_A_A_ABSBSBS_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A ___________________A_A_A_A_A____________________________________ } # tile 20 (wolf) { ________________________________________BJAjBJ__________________ __________________________________________BDAlAl________________ ____________________________________________BDBJAj______________ ____________________________________________BDBDAlAl____________ ______________________________________________BDAlAl____________ ______________________________________________BDBJBD____________ ____________________________________________BDAlBDAe____________ __________________________________________BDBDBDAl_____A_A______ ________________________________________BDBDBDBD_____A_A_A_A____ ____________________________________AlBDBJBDAlBDAl_A_A_A_A_A_A__ ________________________________BDBDBDBDAjBDBDBJAjBJ_A_A_A_A_A__ ____________________________BDBJBDAlBDBJBDAlBDBDAlAl_A_A_A_A_A__ __________________________BDAlBDAjBDBDBDAlBDAlBDAlAlAl_A_A_A____ ________________________BDBDBDBDBDAlBDBDAlBDBDBDAlBDAl_A_A_A____ ____________________BDBJBDBDAlBdBJBDAlBDAlBDAlBdBJAlAl_A_A_A____ __________________BDAjBDBDBJBDAjAlBDAlAlAlBDBdAlAjAlAl_A_A______ ________BD______BJBDAlBDAlBDBDBDBJAlAjAlAlBDAlBdBDBJAj_A_A______ ________BDBD__AlBDAlBDAlBDBDAlAlBDAlAlAlAl_ABDBDBDAlBJ_A_A______ ________BDBDAlBDAlBDBDAlBDBDBDAlAlAlAl_A_A_ABJBDBDAlBDAl_A______ ________BDBJAlAlBDBDAlAlBDBDAlAlAl_A_A_A_A_A_BAlBDAlBDAlAl_A____ ______BDBDBDBDBDBDBDAlAlAlBDAlAl_B_A_A_A_A_A_A_A_ABDBDBJAj_A____ ______BDAjBDAlBDBDBDAlBDBDBJAlAl_A_A_A_A_A_A_A_A_A_AAlAlBD_A____ ______CBBDBDCBCBBDBDBDAlAlBDAjAl_A_A_A_A_A_____A_AAlAlBD_A_A____ ______CBBDCBCBBDAlAlAlAlBDAlBJAl_A_A_A___________AAlBDBD_A_A____ ____BDBDBJBDBDBDBDBDAl_AAlBDAlAl_A_A_____________A_A_A_A_A______ __BDBJBDAlBDAlAqAlAl_A_ABDBDBDAl_A_A_______________A_A_A________ BDBDBDAjBJAlAqAl_A_A_A_AAlBJAl_A_A______________________________ AqBDAlBJAqAqAl_A_A_A_A_ABDAjAl_A_A______________________________ __AqAqAqAlAl_B_A_A_A_ABJAlAl_A_A_A______________________________ __AlAlAl_A_A_A_A_____BAlBDAl_A_A________________________________ ___A_A_A_A_A_A______BJAjBJ_A_A__________________________________ _____________________BAl_A_A____________________________________ } # tile 21 (werewolf) { ________________________________________________________________ ________________________________________________________________ ______________________CFBDBDBJBDBD______________________________ __________BD______BJAlCFCFAjBDBDBJCFCF__________BDAjBJ__________ __________BDBD__AlBDBDAlCFCFBDAlBDCFCFCF________BDBJ____________ __________BDBDAlBDAlBDAlCFCFCFCFCFCFCFCFCF______BDAjAl__________ __________BDBJAlAlBDAlAlCFCFCFCFCFCFCYCFCYCF____BDBJBD__________ ________BDBDBDBDBDBDAlCFCFCFCFCFCFCFCFCYCFCF______BDBJAl________ ________BDAlBDAjBDBDAlCFCFCFCFCFCYCFCFBJCFCFCF____BDAlBD________ ________CjBDBDCjCjBDAlBJCFCFCFCFCFCFAjCFCFCFCF______BDBDAl______ ______BDBDBDBDCjBJBDAlAjCFCFCFCFBsBsBsBsCFCFCFCFBD__BDAlBD______ ______BJBDAlBJAlAjAlCFBJCFCFCFCFCFBsBDBDAlCFCFCFBDBDCfBDAl______ ____BDBDAjBJAjAqBX__CFCFAlCFCFBsBsBsBJCFCFCFBDBJBDBDCfAlBD______ ____AqAlBJAqAqAqAq__CFBSCFCFBsBsBsCFCFCFCFCFBDBDCfCfCfCfCI______ ______AqAqAq_sAl____CFBSCFCFBsBsCYCFCFBDBDCFCFCFCfCfCfCfCI______ ______AqAqAl_s______CFBsCFCFBsBSBSBsBsCFBDAlBDCfCfCfCfCICI______ ______AlAl___s______CFBsCFCFBsCFCFBSBsCFBJBDCfCfCfCfCICfCI______ ____________________BDBDBDBDBJ____CFBSCFCfCfCfCfCfCfCICfCI______ _____________s______BDAlBDBDAj______CfCfCfCfCfCfCfCICfCICI______ __________________BDBDAlBDAlBJ______CfCfCfCIBvCfBJCfCICI________ __________________BDAlAlBDBDAj______CfCfCfCIBvCIBDCICf__________ __________________BDAl__BdAlBJ______CfCfCICI__CIAjCIAl__________ __________________BDAl__AlBDAl______CfCfCfCI__CIBDBJAl__________ __________________BDBD__BDBDBD____BDBDBJBDAl__BDAlBDAl__________ __________________________________BDAlBDAl____BDBDBDAl_A_A_A_A_A ___________________________A_A_ABDBDBDAjAl_A_ABDBDAlAl_A_A_A_A_A _____________________A_A_A_A_ABDBDBDAlAlAl_A_ABJAjBDAl_A_A_A____ _______A_A_A_A_A_A_A_A_A_A_AAlAlAlAlAlAl_ABDBDBDBDAlAl_A_A_A____ ___________A_A_A_A_A_A_A_A_A_A_A_A_A_A_AAlAlAlAlAlAl_A_A_A______ ___________________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A________ ___________________________A_A_A_A_A_A_A_A______________________ ________________________________________________________________ } # tile 22 (warg) { ________________________BJ______________________________________ ________________________AjAl____________________________________ __BJ__________________BJAlAl____________________________________ __AeAl________________BDAe______________________________________ ____AeBD____________AlAeAe______________________________________ ______AeAlBdBdBdBDAlBDAe________________________________________ ______BJBdBkBdBdBdBJAlBD________________________________________ ______AlAjBkBdBdAlBDAlBDAl______________________________________ ______BDCYBJAlBDCYCYAjBJAl______________________________________ ______AlBJAjBdAlBDAlBXAjAeBD____________________________________ ______BDAlBdBdBDAlBDAlBJAlBDAlBD________________________________ ________BDBkBdBdBDAlBDAlBDAlBJAjAlBJ____________________________ ________AlBkBdAlBDC$AlAeBDAlBDAlBDAlBDAl________________________ ________AeC$_$AjCYCYBDAeBDAlBDAlBJAjBJAjBJ______________________ ___________z_zBJCYAlAeAeAlBDAlBDAlBDAlBJAlBD____________________ __________AeAlBDAlBDAeAlBDAlBdBDAlBDAlBDAlBDAl__________________ ____________CYCYAeAeBJAjBJAjBdAlBDAlBDAlBDAlBDAl________________ ____________CYCYAlBDAlBDAlBdBdBDAeAlBDAlBDAlBDAlBD______________ ____________CYCYBdAjBJAlAeBdBJAlAeBDAlBDAlBDAlBDAlBJ____________ ____________CY__BdBJAeAeBdBdAlBDAeAeAeAlAeAeBJAjBJAj____________ ________________BdAlAeAeBdBDAlAeAeAeAeAeAeBdBdAlBDAlBJ__________ ________________BdBD__AeBdAlBDAeAeAeAeBDBdBdAlBDAlBXAj__________ ________________BDAlBD__BDAlBDAeAeAeAlBdBdBDAlBDAlBDAl__________ ________________AlBDAl__AlBDAlAeAeAeBDBdBDAlBDAlBDAlBD__________ ________________BDAlBD__BDAlBD__AeAeAlBdAlBDAlBDAlBDAl____BdBd__ ______________AlBDAl______BDAl__AeAeAlAlBDAlBDAlBDAl____BdBJAjBJ ______________BDAlBDAOAOAOAlBDAOAeAeAeAeAeBdBJAjBJAjBJBdAlBDABBD __________AOBdBDAlCPAOAOBDAlBDAlAeAeAOAOAlBdBDAlAOAOBDAlBDAOAOAO ________AOBJAlAjBJAOAOBdAlBDAlCPAOBJAjBdBdBDAlBDAOAOAOAOAOAO__AO ________AOCPAOCPAOAOCPCPBJCPAOC$AOCPBJCPBDAlCPAOAOAOAOAOAO______ ________AOC$AOC$AOAOC$AOAOC$AOAOAOC$AOC$AOAOC$AOAOAOAO__________ __________AOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAO______________ } # tile 24 (winter wolf) { ________________________________________CmCmCm__________________ __________________________________________CmCmCP________________ ____________________________________________C$CmCm______________ ____________________________________________C$CmCmCP____________ ______________________________________________C$CmCP____________ ______________________________________________C$CmCm____________ ____________________________________________C$CmCmCP____________ __________________________________________C$C$CmCP_____A_A______ ________________________________________C$C$C$C$_____A_A_A_A____ ____________________________________CmC$CmC$CmCmCm_A_A_A_A_A_A__ ________________________________C$CmC$C$CmC$C$CmCmCm_A_A_A_A_A__ ____________________________C$CmC$CmC$CmC$CmC$CmCmCP_A_A_A_A_A__ __________________________C$CmC$CmC$CmC$CmCmCmCmCmCPCP_A_A_A____ ________________________C$CmC$C$C$CmC$C$CmCmC$C$CmCmCP_A_A_A____ ____________________C$CmC$C$CmC$CmC$CmCmCPC$CmC$CmCPCP_A_A_A____ __________________C$CmC$C$CmC$CmC$CmCPCmCPC$C$CmCmCmCP_A_A______ ________C$______CmC$CPC$CmC$CmC$CmCPCmCPCPC$CmC$C$CmCm_A_A______ ________C$C$__CmC$CPC$CPC$C$CmCmCmCmCPCPCP_AC$C$CmCmCm_A_A______ ________C$C$CPCmCPC$C$CPC$CmCmCmCPCPCP_A_A_ACmC$C$CmCmCP_A______ ________C$CmCPCPC$C$CPCPC$C$CPCmCP_A_A_A_A_A_ACmCmCmCmCmCP_A____ ______C$C$C$C$C$C$C$CPCPCmCmCmCP_A_A_A_A_A_A_A_A_ACmC$CmCm_A____ ______C$CmC$CmC$C$C$CPCmC$CmCPCP_A_A_A_A_A_A_A_A_A_ABkCmC$_A____ ______CuC$C$CuC$C$C$C$CPCmC$CmCP_A_A_A_A_A_____A_ABkCPC$_A_A____ ______CuC$CuCuC$CmCPCPCPCmCmCmCP_A_A_A___________MBkC$Cm_A_A____ ____C$C$CmC$C$CmC$C$CP_ACmCmCmCP_A_A_____________A_A_A_A_A______ __C$CmC$CmCmCmCmCPCP_A_ACmC$CmCP_A_A_______________A_A_A________ C$C$C$CmCmCmBNCP_A_A_A_ACmCmCP_A_A______________________________ BNCmCmCmBNBNCP_A_A_A_A_AC$CmCP_A_A______________________________ __BNBNBNCPCP_A_A_A_A_ACmCmCP_A_A_A______________________________ __CPCPCP_A_A_A_A_____ACmCmCP_A_A________________________________ ___A_A_A_A_A_A______CmCmCm_A_A__________________________________ _____________________ACm_A_A____________________________________ } # tile 25 (hell hound pup) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________BoBo____________________ ________________________________________BoCB____________________ ________________________________________CBBoBo__________________ ________AqAqAqCBBoCBCB__________________BoBoCB__________________ ______AqAqAqCBCBBoBoCBBo__________________CBBo__________________ ______AqAqBoCBBoAqAqAqBoCBBoCBCBCBCB______BoBo__________________ __________BoCuCuAqAqAqAqBoCBCBBoCBBoCBCBCBBoCB__________________ ________BoBoCuCuBoAqAqAqBoBoBoBoBoBoBoBoBoCB____________________ _______ABoBoBoBoBoBoAqAqBoBoBoBoBoBoBNBoBoBoBo__________________ _______ABoBoBNBNBNBoBoBoBoBNBoBNBoBoBoBoBoBoBo__________________ ________BoBNBN_A_ABNBNBNBoBNBNBoBNBNBNBoBNBoBo_A_A______________ _______________A_ABNBN_ABoBoBNBNBNBNBNBoBNBo_A_A_A_A____________ _____________A_A_ABNAv_ABoBN_A_AAqAX_ABoBNBo_A_A_A_A____________ _____________A_ABNAvAv_ABoAv_AAXAXAX_ABoAvAv_A_A_A_A____________ _____________A_A_A_A_ABoAvAv_A_A_A_ABoAvAv_A_A_A_A______________ _______________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A__________________ ___________________A_A_A_A_A_A_A_A_A_A_A_A_A____________________ } # tile 26 (hell hound) { ________________________________________BoBoBo__________________ __________________________________________BoBoBN________________ ____________________________________________CBBoBo______________ ____________________________________________CBBoBoBN____________ ______________________________________________CBBoBN____________ ______________________________________________CBBoBo____________ ____________________________________________CBBoBoBN____________ __________________________________________CBCBBoBN_____A_A______ ________________________________________CBCBCBCB_____A_A_A_A____ ____________________________________BoCBBoCBBoBoBo_A_A_A_A_A_A__ ________________________________CBBoCBCBBoCBCBBoBoBo_A_A_A_A_A__ ____________________________CBBoCBBoCBBoCBBoCBBoBoBN_A_A_A_A_A__ __________________________CBBoCBBoCBBoCBBoBoBoBoBoBNBN_A_A_A____ ________________________CBBoCBCBCBBoCBCBBoBoCBCBBoBoBN_A_A_A____ ____________________CBBoCBCBBoCBBoCBBoBoBNCBBoCBBoBNBN_A_A_A____ __________________CBBoCBCBBoCBBoCBBoBNBoBNCBCBBoBoBoBN_A_A______ ________CB______BoCBBNCBBoCBBoCBBoBNBoBNBNCBBoCBCBBoBo_A_A______ ________CBCB__BoCBBNCBBNCBCBBoBoBoBoBNBNBN_ACBCBBoBoBo_A_A______ ________CBCBBNBoBNCBCBBNCBBoBoBoBNBNBN_A_A_ABoCBCBBoBoBN_A______ ________CBBoBNBNCBCBBNBNCBCBBNBoBN_A_A_A_A_A_ABoBoBoBoBoBN_A____ ______CBCBCBCBCBCBCBBNBNBoBoBoBN_A_A_A_A_A_A_A_A_ABoCBBoBo_A____ ______CBBoCBBoCBCBCBBNBoCBBoBNBN_A_A_A_A_A_A_A_A_A_ABNBoCB_A____ ______CuCBCBCuCBCBCBCBBNBoCBBoBN_A_A_A_A_A_____A_ABNBNBN_A_A____ ______CuCBCuCuCBBoBNBNBNBoBoBoBN_A_A_A___________ABNBNBo_A_A____ ____CBCBBoCBCBBoCBCBBN_ABoBoBoBN_A_A_____________A_A_A_A_A______ __CBBoCBBoBoBoBoBNBN_A_ABoCBBoBN_A_A_______________A_A_A________ CBCBCBBoBoBo_ABN_A_A_A_ABoBoBN_A_A______________________________ _ABoBoBo_A_ABN_A_A_A_A_ACBBoBN_A_A______________________________ ___A_A_ABNBN_A_A_A_A_ABoBoBN_A_A_A______________________________ __BNBNBN_A_A_A_A_____ABoBoBN_A_A________________________________ ___A_A_A_A_A_A______BoBoBo_A_A__________________________________ _____________________ABo_A_A____________________________________ } # tile 28 (gas spore) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________________Cj__________________________________ _____________________t_q_qCjCjCjCsCsAn__________________________ ___________________q_m_mCMCMCjCMCrCrCrCj________________________ _________________q_m_m_m_mCMCMCMCMCUCrCrCU______________________ ______________BH_q_m_mAhAgAg_hByByCMCLCLCLCL____________________ ____________CsAoAoAhAhAhAhAh_m_hByByByCLCLCLCj__________________ ____________BHAoCjAhAhAhAhAh_hByByBaBaBZBbCLCL__________________ ____________AoCjCjAhAhAhAhAhByByBaBaBZBZBZCLCL__________________ ____________CjCjCMCjAhCUCLCMByByBaBaBaBZBZBZCM__________________ __________CjCrCMCMCMCMCMCLByByBaBaBaBZBZBZBZAhCj________________ ____________CjCMCMCMAgByByByBaBaBaBaBaBZBZBZAg__________________ ____________CjCMAgAgAgAgByBaBaBaBaBZBZBZBZBZCL__________________ ____________CMByByAQAQBaBaBaBaBaBaBZBZBZBZBZBy__________________ ____________CLByBaBaBaBaBaBaBaBZBZBZBZBZBZCLCM__________________ ______________ByBZBaBaAzBWAQAQAQARARBZBbBbBy____________________ ________________BZAgBWAzAgAQAQAQAQARBZCLBy______________________ __________________B_B_AzBWAzAQBZBZBZBZBy________________________ ____________________B_B_B_B_AzBZBZBZBy__________________________ _________________A_A_A_L_A_LBZ_L_A_A_A_A_A_A____________________ _____________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A________________ ___________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A______________ _______________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A________________ ___________________A_A_A_A_A_A_A_A_A_A_A_A______________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 29 (floating eye) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________BkBkBdBd________________________________ ____________________BkCPBkCPCPBkBdBd____________________________ __________________CPCVBkCPBkBkBkBdBdBd__________________________ ________________CPCPCPCPBkCVCPBdBkBkAlBd________________________ ________________CPC$C$CPCPBkBkBkBkBdBdBd________________________ ______________CPCPC$C$_k_gBkBkBkBkBkBkBJAj______________________ ______________CP_g_k_k_g_b_aBkBkBdBDBdAlBd______________________ ______________CP_f_g_A_A_f_aBkBkBkBdBdBdBJ______________________ ______________CP_b_f_A_A_f_aCPBdBdBJBdAjBd______________________ _________________a_b_f_f_a_aBdBdBkBkAlBJ________________________ ________________Bk_a_a_a_aBdBkBdBdBdBDBd________________________ __________________BDBkBdBJBkBkBDBdAlBd__________________________ ____________________AlBDBdBdBdBdAlBD____________________________ ________________________BdAjBdBd________________________________ ________________________________________________________________ _____________________A_A_A_A_A_A_A_A_A__________________________ _________________A_A_A_A_A_A_A_A_A_A_A_A_A______________________ _________________A_A_A_A_A_A_A_A_A_A_A_A_A______________________ _____________________A_A_A_A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 30 (freezing sphere) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ _________________________f_f_f_b_b_b____________________________ ___________________k_k_g_f_f_f_g_g_f_b_b_b______________________ ___________________k_k_g_g_g_f_b_g_f_b_b_b______________________ _________________k_g_g_k_k_f_g_b_b_f_b_f_b_a_a__________________ _____________k_k_gCVCmCV_g_g_g_f_g_f_b_f_b_a_a_b________________ _____________k_kCVC$C$CV_g_g_f_g_g_b_b_f_b_a_a_b________________ _____________k_kCVCVCV_g_k_k_g_g_g_f_f_f_b_b_b_b________________ ___________f_g_g_k_g_g_k_g_g_g_f_f_g_f_b_f_b_b_a_b______________ ___________f_g_g_k_k_k_k_g_g_g_f_f_b_f_b_f_b_a_a_b______________ ___________f_g_g_g_k_k_k_g_g_f_g_g_f_b_b_b_b_b_a_b______________ ___________f_f_f_f_g_g_g_f_f_g_f_f_f_b_b_b_a_b_a_b______________ ___________f_f_f_f_g_g_g_f_f_g_f_f_b_b_b_b_b_a_a_W______________ ___________f_f_f_f_f_f_f_f_f_f_b_b_b_a_b_a_b_b_W_W______________ _____________f_f_f_f_f_f_f_f_f_b_b_a_b_a_b_b_W_W________________ _____________f_f_f_f_f_f_f_b_b_b_b_b_b_b_W_W_W_S________________ _____________f_f_f_f_f_b_a_a_b_a_a_a_W_a_b_W_W_S________________ _________________a_b_b_b_a_b_a_a_b_W_W_W_W_W_S__________________ _________________W_b_b_W_W_W_W_W_a_W_W_W_W_S_S__________________ ___________________W_W_W_W_W_S_W_W_W_S_S_S______________________ _____________________A_A_a_W_W_W_S_S_A__________________________ _________________A_A_A_A_A_A_A_A_A_A_A_A_A_A____________________ _____________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A________________ ___________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A______________ _______________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A________________ ___________________A_A_A_A_A_A_A_A_A_A_A_A______________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 31 (flaming sphere) { _________________________MB__N__________________________________ ___________________A__AEBTBrBrBtAlAE__Ae________________________ ________________ABABBTBTCECzBrCEBTCYAE_A________________________ _______________MASCEBrCxCbCECbCECECxBR_____A__AeAO______________ _______________MAyCECbCEBrCbCzAyCuCzCxBoAxAlBJ__________________ ________________BJAxBoCBCxCxCzAaCzCsCjCBCbCbBR_MAO_M____________ ______ABBc____BD_BCbCfCsCjCtCsCcCtCtCsCsCzCzCBCbCECBBT__________ ______BJAKBJ_$CBCzCrCtCsCsCtCtCrCsCtCtCsCsCfCrCzCrCzAx_O________ _________A_ABJCbCtCsCjCtCtCtCsCrCsCtCtCsCrCsCsCcCzCzCbBs________ _________MAxBrCECfCrCsCsCiCtCtCtCtCtCtCtCtCtCtCYCbCbBrAl_MBJAO__ __________AlBoCzCrCzCsCtCtClCtCsCtCtCtClClCtCtCzCxCrCzCE_R______ ______BJ__AvCbCxCrCrCtCsCtCtCtCtCtCtCoCtCtCsCtCsCrCrCcCEBX______ _________LBrCECbCrCtCsCsCtCsCtCtCtCoCtCoCrCtCtCtCsCrCjCxBrBJ____ ______BT_ACECYCrCsCsCtClCtCtCoCtCoCtCoCtCsCtCtCtCtCzCzCjBRBJ____ __Bc_AAA__CYCsCsCsCtCtCtCtCiCtCXClCtCoClCtCtCoCtCsCzCrCrCxAE_A__ ____Ad_AAyCzCrCsCsCtCtCtCtCtCoCtCoCtCtCtCtCtCoCtCrCxCzCjCz_AAe__ ____BTCECxCzCsCsCtCtCtClCtCtCtCoCtCoCtCoCtCtCsCsCrCbCxCzCEAS____ __ABBrCzCrCxCfCrCsCtCtCXCtCtCoCtCoCtClClCtCtCsCtCsCzBoBRAxAl____ __BJCbCECzCzCzCrCtCtCtCoCtCtCtCtCtCoCtCtCtCoCtCtCtCrCrCzBrAl____ __AOCbCECzCzCjCrCsCtCtCtClCtCoCtCoCtClClCoCtCtCtCrCfCjCjCbAP____ ____BJAyCxCfCUCrCtCtCtCtCtCsCtCtCXCoCtCoCtCiCtCfCjCsCjCzBo______ _______ACBCzCzCzCrCsCtCtCtCsCtCtCXCtClCtCtCtCsCsCrCrCjCE________ ________ABArBrCrCrCrCsCsCtCtCtCtCtCoCtCtCsCsCtCsCzCrCbAxAB______ ______AO_A_AAlCzCzCxCsCsCtCtCtCtCtCtCtCsCrCsCtCsCjCzCECb_z______ ____AlAx_AABAxCbBrBoCUCrCsCsCtCtCsCtCtCtCzCrCsCsCrCBCECEBD______ _____ABJ_MAlAxAlCECECbCzCjCsCsCsCtCrCsCtCxCbCrCrCxBrBJBT________ ____________Al_MBTAxAxCxCxCzCsCrCrCBCjCrCzBoCjCjCxAl_BBD________ ________________BVBVAlCbBRAeCxCxCEBNCxCbCcAxCzCpBT______________ ________________BJCE_ABVBrCbCbCbBrCbCbCbCbBTCzBOAZ_z____________ _______________ABT_z__AlCECECEBRBDBTBTCECEASCE__AN_A____________ ________________BD_A__ANBTBRCbBr____AECbBr_A_M__________________ ___________________________ABRAB______AS________________________ } # tile 32 (shocking sphere) { ________________________________________________________________ ________________________________________________________________ _______________________A_GBd_A_G_G_GCPBd________________________ ___________________A_A_G_G_GCPCP_G_G_GCP_GBd____________________ _______________A_A_G_G_G_G_G_GCPBd_G_GCP_G_GBdBd________________ _____________A_G_G_G_G_G_G_G_G_GC$_G_GCP_G_G_G_GBd______________ ___________A_A_G_G_G_K_G_K_G_K_GCP_GBdC$_G_K_G_K_GBd____________ _________A_G_G_G_G_K_G_K_G_K_G_GC$C$_GC$_K_G_G_G_G_GCP__________ _________A_G_G_G_G_K_K_K_K_K_K_K_G_GC$C$_G_K_G_G_GBdBdCP________ _______A_G_G_G_G_K_G_K_K_K_K_K_K_K_G_GC$_G_G_GBdBd_G_GBd________ _______A_G_G_G_K_G_K_K_j_y_j_K_K_G_G_jCP_G_K_GCP_G_G_G_GBd______ _____A_G_G_G_K_G_K_G_K_yCPBd_K_K_G_jC$_G_G_G_GCP_G_K_G_GBd______ _____A_G_G_G_G_K_G_K_K_jBd_j_K_G_G_jC$_G_K_G_GCP_G_G_G_G_GBd____ _____A_G_G_G_K_G_K_G_K_K_K_K_K_K_G_GC$CPC$C$CP_K_G_G_A_A_GBd____ _____A_G_G_G_G_K_G_K_G_K_G_K_G_G_K_G_G_G_GCP_G_G_G_A_G_G_GBd____ _____A_G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_K_GBdCP_j_K_G_G_A_A_GBd____ _____A_G_G_G_G_K_G_K_G_K_G_G_G_G_G_G_GCPC$Bd_G_G_G_A_G_A_ABd____ _____A_G_G_G_G_G_G_G_G_G_G_G_GC$C$CPC$C$_G_G_G_G_A_G_A_A_GBd____ _____A_G_A_A_G_G_K_G_G_G_K_GC$_G_G_G_GC$_G_G_G_A_G_A_G_G_GBd____ _____A_G_G_G_G_G_G_G_G_G_G_GC$_G_G_G_GC$_G_K_G_G_GBd_j_G_GBd____ _____A_G_G_G_G_A_G_G_G_A_G_GC$_G_G_G_GCPCPCPBdBd_j_G_G_GBd______ _______A_G_G_G_G_A_G_G_G_G_GC$_G_G_G_GC$Bd_j_A_G_A_j_A_GBd______ _______A_G_G_G_A_G_A_G_G_G_GC$CPCP_G_GCP_K_G_G_A_G_G_GBd________ _________A_G_G_G_G_G_G_G_ACP_A_ABd_GCP_G_G_G_A_A_A_G_GBd________ _________A_G_G_G_G_A_G_jCP_A_G_ACPBd_j_A_G_A_G_A_G_GBd__________ ___________A_A_G_A_j_j_G_A_G_A_GC$_j_A_A_A_G_A_G_GBd____________ _____________A_A_G_A_G_A_G_A_jBd_j_A_A_A_G_G_G_GBd______________ _______________A_A_A_G_G_G_A_j_A_A_A_A_A_G_GBdBd________________ ___________________A_G_G_G_G_G_A_A_G_A_GBdBd____________________ _________________________A_A_A_ABdBdBdBd________________________ ________________________________________________________________ ________________________________________________________________ } # tile 34 (kitten) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________Cm__________Cm____________________________________ ______________CPCm______CmCP____________________________________ ______________CPCmCmCmCmCmCPCmCmCm______________________________ ______________CmCmCmCmCmCmCmCmCmCmCmCm__________________________ ______________Cm_ACmCm_ACmCmCmCmCmCPCmCmCm______________________ ______________CmCmCmCmCmCmCmCmCPCPCmCPCmCmCm____________________ ______________CPCPCmCmCmCPCPCmCPCmCmCmCmCmCmCm__________________ ________________CPCPCPCPCPCmCPCPCmCmCmCmCmCmCmCmCmCm____________ __________________CVBkBkCPCmCPCPCmCmCPCPCmCmCPCPCPCPCmCm________ __________________CmCPCPCmCmBkBkCoCmBkCPCPCP_A_A_A_ACPCmCP______ ________________CmCmCP_ACmCPCPCmCmCoBkCPCP_A_A_A_A_A_ACmCP______ _______________A_A_A_ACmCmCP_ACmCmCPBk_M_A_A_A_A___A_ACmCP______ _______________A_A_A_A_A_A_A_A_A_A_A_A_z_A_A_A_____ACmCP_A______ _________________A_A_A_A_A_A_A_A_A_A_A_A_A_______A_ACPCP_A______ _______________________A_A_A_A_A_A_A_A___________A_A_A_A________ _________________________________________________A_A_A__________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 35 (housecat) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________Cm__________CmCm__________________________________ ______________CPCm______CmCPCP__________________________________ ______________CPCmCmCmCmCmCPCP__________________________________ ______________CmCmCmCmCmCmCmCmCmCm______________________________ ______________CmCmABCmCmABCmCmCmCmCmCmCm________________________ ______________CmCmCmCmCmCmCmCmCmCmCmCmCmCmCm____________________ ______________CPCPCmCmCmCmCPCPCmCmCmCmCmCmCmCm__________________ ________________CPCPCPCPCPCPCmCmCmCmCPCPCPCmCmCm________________ ________________CPCPCPCPCPCPCmCmCPCPCmCmCmCPCmCm________________ ________________CPCoBkBkCPCmCmCmCPCPCmCmCmCmCPCmCm______________ __________________CmBkCPCPCmCmCmCPCmCmCPCPCmCPCmCmCm____________ __________________CmCP_A_ACmCmCPCmCmCPBkCPCPCmCmCmCm____________ _______________A_ACmCP_A_ACmCm_ACmCmCPBnCJCPCPCPCPCmCmCm________ _____________A_A_ACmCP_A_ACmCP_ACmCmCPCJBkBnBkBk_ACPCPCmCm______ ___________A_ACmCmCmCP_ACmCmCP_ACmCmCP_A_A_z_z_M_A_A_ACmCP______ ___________A_ACPCPCPCPCmCmCmCPCmCmCPCP_A_A_A_A_A_A_A_ACmCP______ ___________A_A_A_A_A_ACPCPCP_ACmCPCP_A_A___________ACmCmCP______ _______________A_A_A_A_A_A_A_A_A_A_A_A_A__________CmCmCP_A______ _____________________A_A_A_A_A_A_A____________CmCmCPCP_A________ ______________________________________________CPCP_A_A__________ _______________________________________________A_A______________ ________________________________________________________________ } # tile 36 (jaguar) { ________________________________________CfCfCfCf_ACI____________ ____________________________________Cf_ACICI_ACICfCfCf__________ ____________________________________CICI________CI_ACf__________ ____________________________________________________Cf_A________ ____________________________________________________CfCI________ ________CI________Cf______________________________Cf_ACI________ ________BWCI______BWCf____________________________CfCI__________ ________BWCICfCfCfBWCfCI________________CfCfCfCfCI_ACI__________ ______CfCfCICfCf_ACfCfCICI______Cf_ACfCfCf_ACf_ACfCfBv__________ ______Cf_ACf_ACfCfCf_ACICI_ACf_ACfCf_ACfCfCfCfCfCfCIBvCI________ ____CfCuCfCfCfCfCuCfCICfCICICfCfCfCfCfCfCf_ACfCf_ACfBv_ABv______ ____CfCuCuCfCfCuCuCfCfCICICI_ACf_ACfCf_ACICfCI_ACf_ACfBvBv______ ____CICfCf_ACfCfCfCfCf_ACICICfCfCf_ACICfCf_ACfCICICfCIBv_ABv____ ____CPCJBnCPCPBkCPCPCICICICI_A_ACfCICICICICI_ACfCICf_ABvCIBv____ ____BoC$BoC$BoBoBoBkCICICICfCfCfCICICI_ACPCPCICI_ACICfCf_ABv____ ______BoBoBoBoBoCPCICICI_ACICfCICP_ACPCPBdBWBWCICICI_ACfBvBv____ ______CPBnCJCPBnBv_ACI_ACfCfCICPBdBkBdBkBWBWBW_ACICICfCfCI_A____ ______BvBvBvBvBvBvCICfCICI_ACPBkBkBk_ABWBW_ABW_A_ACICfCfBvBv____ ______CI_ABvBvBkBk_ACICfCICICI_A_A_A_ABWBWBWBW_A_ACICfCI_ABv____ ______CIBvBvBkBkCJBkCICf_ACICICI_A_A_ABW_ABWBW_A_ACI_ACICIBv____ ____Cf_ACIBvBk_A_M_ABkCICfCf_ACI_A_ACVBWBWBW_A_A_ACICfCICIBv____ ____CIBvBvBkBk_A_A_A_MCICICfCICICI_A_A_A_A_A_A_A_ACICf_ABvBv____ ____CIBvBvBk_A_A_A_A_A_ACI_ACICICI_A_A_A_A_A_A_ACICfCICIBv______ C$CIBv_ABvBk_A_A_A______CICfCI_ACI_A_A_A_A_A_ACICICf_ABvBv______ _ACIBvBvBvBk_A___________ACfCfCICI_A_A_A_A_AC$_ACICICIBv________ _AC$BvBkBk_A_A__________CICf_ACICI_A_A_A_A_A_A_AC$_AC$_A________ _A_A_A_A_A_A____________CICICICICI_A_A__________________________ _____A_A______________C$CI_ACfCI_A_A____________________________ _______________________ACICICICI_A______________________________ _______________________AC$_AC$_A_A______________________________ _________________________A_A_A_A________________________________ ________________________________________________________________ } # tile 40 (tiger) { ________________________________________Cf_ACf_ACICI____________ ____________________________________Cf_ACI_ACI_ACf_ACf__________ ____________________________________CICI_________ACI_A__________ ____________________________________________________CfCI________ _____________________________________________________A_A________ ____Cf____________Cf______________________________CfCICI________ ____BWCf__________BWCf_____________________________A_A__________ ____BWBWCfCfCf_ACfBWCfCI________________CfCf_ACICICICI__________ ____CfCfCfCf_ACfCfCfCfCICI______CfCf_A_ACfCfCf_ACfCf_A__________ ____CfCf_A_A_L_zCfCfCfCICICICf_A_ACfCfCf_ACfCfCf_ACI_ACI________ ____CBCfCf_ACfCjCfCBCfCfCICICfCfCf_ACfCfCf_ACfCf_ACf_ACI_A______ C$CfCBCB_A_A_z_zCBCBCfCfCIC$Cf_ACfCf_ACfCf_ACfCf_ACfCf_ABv______ __C$CfCfCf_ACfCfCfCfCfC$C$BvCf_ACfCf_ACfCf_ACf_ACICfCf_ABvBv____ C$__C$CVCVCVCmCVCVC$C$CPBvC$CfCf_ACfCf_ACICI_ACICI_A_ABvCI_A____ __C$CPBoC$BoBoC$BoCPBkC$C$CfCfCf_ACICI_ACPCP_ACICICICfCfCI_A____ ____C$BoC$BoBoC$BoC$C$CPCP_ACfCI_ACPCP_ABd_ABWCICI_A_A_A_ABv____ ____CPCmBoBoBoBoCoCPBkCfCfCf_ACP_ABkBdBkBWBWBW_ACICICICICIBv____ ______CICVCVCVCPCfCfCfCfCfCICPBkBkBk_ABWBW_ABW_A_ACICfCIBv_A____ ______CfCICICIBkBkCICI_A_ACfCf_A_A_A_A_A_ABWBW_A_ACI_A_A_ABv____ _______A_ACIBkBkBkBk_ACICfCf_ACI_A_A_ABWBW_ABW_A_ACICICICIBv____ ____CfCfCI_ABk_A_M_zBkCf_A_ACfCI_A_ACVBWBWBW_A_A_ACICfCf_A_A____ _____ACfCIBkBk_A_A_A_MCfCfCfCf_ACI_A_A_A_A_A_A_A_ACI_A_ABvBv____ ____Cf_A_ABk_A_A_A_A_A_ACI_A_ACfCI_A_A_A_A_A_A_ACICfCICIBv______ C$_ACfCICIBk_A_A_A______CICfCfCf_A_A_A_A_A_A_ACICICfCIBvBv______ _ACf_A_A_ABk_A__________CI_A_A_ACI_A_A_A_A_AC$_ACICICIBv________ _AC$CIBkBk_A_A__________CICfCfCICI_A_A_A_A_A_A_AC$_AC$_A________ _A_A_A_A_A_A____________CI_A_A_ACI_A_A__________________________ _____A_A______________C$CICICICI_A_A____________________________ _______________________A_ACICICI_A______________________________ _______________________AC$_AC$_A_A______________________________ _________________________A_A_A_A________________________________ ________________________________________________________________ } # tile 41 (gremlin) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________________BSAwBSBSBSAwAw____________________________ ________________BSBSBSBSBSBSAwAwAwAYAYAYAY______________________ BSBSBSBSBSBS__BSBSByCM_AByAwAwAYByCM_AByAYAY__AwBSBSBSBSBSBS____ __Aw_A_A_A_AAwBSByCMBy_ABaBaAwByCMBy_ABaBaAYAw_A_A_A_AAw________ ____AwAw_AAwAwBSBSByBa_ABaAwAwAYByBa_ABaAYAYAwAw_AAwAw__________ ________AwAw____BSBNAwAwAwAwAwAYAYAYAYBNAY____AwAw______________ __________________BSBNBkBNBkBNBkBNBkBNAY________________________ ____________________AwAwBNBkBNBkBNAYAY__________________________ ________________BSBSAwBSAYAwAYAYAYAwAwAwAw______________________ ____________AwBSBSAwAwAwAwAwAwAwAYAYAYAYAYAwAw__________________ __________BSBSAwAwAwAwAYAwAwAYAwAYAAAYAYAYAYAYAY_A_A_A_A________ ________BSBSAwAwAwBSBSAwAwAwAwAwAYAYAY_AAYAAAYAYAw_A_A_A_A_A____ ______AwBSAwAYAw__BSAwAwAwAYAwAwAYAYAY_A_A_AAYAYAA_A_A_A_A_A_A__ ____CPAwAwAwAw____AwBSAwAwAwAwAYAYAAAY_A_A_A_AAA_ABk_A_A_A_A_A__ __CP__AwAYAw________BSBSAwAYAwAYAYAY_A_A_A_A_ABk_A_A_A_A_A_A____ ____Bl__Bk__________AwBSAwAwAYAYAYAY_A_A_A_A_A_B_A_A_A_A________ ______________________AwAwAYAYAAAY_A_A_A_A_A_A_A_A_A_A__________ ________________BSAwBSBSAwAwAYAYAYAAAwAwAw_A_A_A_A_A____________ ______________AwBSBSBSAwAwAY_AAAAYAwAYAwAwAw_A_A_A______________ _____________ABSAwAwAAAwAY_A_A_AAYAYAYAYAYAA_A_A________________ _____________A_AAYAYAYAY_A_A_A_A_AAAAYAAAY_A_A__________________ _______________A_A_A_A_A_A_______A_A_A_A_A_A____________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 42 (gargoyle) { _________________________________MAOAOAlAl______________________ _________________________M____AB_zAOAOAOAlAl_____M______________ _________________________MAK___M_MCpAOAOAOAlCY___M______________ _________________________M_z_MAK_MCYCYAOAOAlCYA_AA______________ ___________________________MAA_BAAAOCYCYAOCYCY_M________________ ____________________________A__MBoAOAOAOAOAlAl_M________________ _______________________________MABBoAOAOAOAlAl__________________ _________________________MAOAO_$_MBoBoBoAOAlBoAlAl______________ _______________________MAOAOAlAl_MAABoBoBoBoBoAlAlAl____________ _____________________zAOAOAlAlAlAlA__MBoBoBoAOAlAlAl____________ ____________________AOAOAlAOAlAlAlAlAO_MAOAOAlAlAOAlAl__________ ___________________OAOAOAlAOAOAlAlAlAOAlAlAlAl_MAOAlAl__________ _________________MAKAOAOAl_MAOAlAlAlAOAlAlAl___zABAOAOAl________ ______________AA_MAO_MAl_MAK_MAOAOAOAlAlAO_______M_MAOAl________ ___________MA__MA_AOAlAAA__MAO_zABAOAOAO________AAA_AOAl________ _______AAA_MAOAO_MAOAl_M_MAOAOAO_MAlAl_____________MAOAl________ ___A_A_MAOAOAO_AAAAOAl_$AOAA_MABAO_z_O_____________MAOAlAl______ ___z_MAOAO_A_AA__MAOAl_OAOAOAO_z_MAOAOAl__________AAAOAlAl______ _A_A_MAO_z_A_A_MAOAlAlA_AOAOAlAB_MAKAOAOAl________AO__AlAl______ _AAAAOAO_A_zBkAOAOAlAA_MAOAOAl_M_z_M_MAOAOAl______Bl__BkAl______ _A_MAOAO_ABk_MCJ_ABkAB_MAOAlAl__AB_zAB_zAOAO____Bk____COBl______ _AA_AO_A_A_z_MBk_MCJ_MAOAOAlAl_____M_MAB_MAOAl______Bk__Bk______ _A_MAO_A_A_A_A_A_O_OAOAOAlAl_A_A_____$_M_zAOAO__________________ _AAAAO_A_A_A_A_MAKAOAOAOAl_A_A_A_A__ABAOAOAOAO__________________ _A_AAO_A_A_A_M_$AOAOAOAO_A_A_A_A_A_M_MAOAOAO____________________ ___AAO_A_A_MABAOAOAO_A_A_A_A_A_A_AA_AAAOAO______________________ _____A_A_A_zAO_M_A_A_A_A_A_A_A_A_M_M_MA_________________________ _______A_AAOAlAlAl_A_A_A_A_A_A_AA_AAAOAO________________________ _______A_AAlAlAlBk_z_______A_A_A_AAOAOAOBk______________________ _________zBk_MCJ_MBk___________A_ABk_LBl_zBm____________________ _________ABk_MBk_M_______________ABl_z_LBk_B____________________ ________________________________________________________________ } # tile 43 (winged gargoyle) { _A_A_____________________________MAOAOAlAl_____________________A BoBo_A_A_A_______________M____AB_zAOAOAOAlAl_____M_________A_ABo __BoBoBoBo_A_A_A_A_A_____MAK___M_MAOAOAOAOAlAl___M___A_A_ABoBoBo __BoBoBoBoBo_ABo_A_______$_M_M_zABCYCYAOAOAlCYA_AA_____ABo_ABo__ __BoBoBo_A_ABo_A_A_________OAK_M_zAOCYCYAOCYCY_M_____A_ABoBo_A__ __BoBo_ABoBo_ABoBo_A_________MAK_OAOAOAOAOAlAl_M___ABo_ABoBo____ Bo_A_ABoBoBo_ABoBoBo_A_A_______M_zBoAOAOAOAlAl___ABoBo_ABoBo____ _ABoBoBoBo_ABoBoBoBoBoBo_MAOAOAlAB_MBoBoAOAlBoAlAlBoBo_ABo______ BoBoBoBoBo_ABoBoBoBoBo_MAOAOAlAlAl_zABBoBoBoAOAlAlAlBo_ABo______ __BoBoBo_ABoBoBoBo__AAAOAOAlAlAlAlAl_MAOAOAOAlAlAlAlBo_A________ ____BoBo_ABoBo______AOAOAlAOAlAlAlAlAOAlAlAlAlAlAOAlAl_A________ ____Bo_ABoBo_______MAOAOAlAOAOAlAlAlAOAlAlAlAl_MAOAlAl_A________ _______ABo_______MA_AOAOAl_MAOAlAlAlAOAlAlAl___MAKAOAOAl________ _______A_______MAAAO_MAl_MAK_MAOAOAOAlAlAO_______M_MAOAl________ ___________MAAA__MAOAlAA_M_zAOAB_zAOAOAO_________$_OAOAl________ _______AA__MAOAO_MAOAl_BABAOAOAO_MAlAl____________AAAOAl________ ___A_A_MAOAOAO_AAAAOAlA_AO_M_zABAO_M_z_____________MAOAlAl______ ___z_MAOAO_A_z_MA_AOAl_MAOAOAO_z_MAOAOAl__________A_AOAlAl______ _A_A_MAO_z_A_A_MAOAlAlAAAOAOAlAB_MAKAOAOAl________AO__AlAl______ _AAAAOAO_A_ABkAOAOAlA__MAOAOAl_M_$_M_MAOAOAl______Bk__BkAl______ _A_MAOAO_ABk_MCJ_LBkAB_MAOAlAl__AB_M_$_OAOAO____Bk____COBl______ _AA_AO_A_A_z_MBk_MCJ_MAOAOAlAl____AB_MAK_MAOAl______Bl__Bk______ _A_MAO_A_A_A_A_A_O_MAOAOAlAl_A_A_____z_M_$AOAO__________________ _AAAAO_A_A_A_z_MAKAOAOAOAl_A_A_A_A__ABAOAOAOAO__________________ _A_AAO_A_A_A_M_zAOAOAOAO_A_A_A_A_A_M_zAOAOAO____________________ ___AAO_A_A_MABAOAOAO_A_A_A_A_A_A_AAK_OAOAO______________________ _____A_A_A_zAO_M_z_A_A_A_A_A_A_A_M_M_$_O________________________ _______A_AAOAlAlAl_A_A_A_A_A_A_A_zABAOAO________________________ _______A_AAlAlAlBk_A_______A_A_A_AAOAOAOBk______________________ _________ABk_MCJ_MBk___________A_MBk_ACJ_MBk____________________ _________ABk_MBk_M_______________ABk_M_ABk_M____________________ ________________________________________________________________ } # tile 44 (hobbit) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________________Br__BrAvAvBr______________________________ ____________________BrAXBrAvBrAXAvAv____________________________ ____________________AvBrAXAXBrAXBrAI____________________________ __________________BrCTBrAvCTAXBrAXBrAI__________________________ ____________________CnCnCnCnCnCnAXAIBR__________________________ ____________________Ci_f_fCn_f_fCnBrAI__________________________ ____________________Cn_f_fCl_f_fCnAIAI__________________________ ____________________CnCnCnClCnCnCnBRBR__________________________ ____________________CGCnCgClCnCTBwAIAI__________________________ ______________________CTBVBtBVCTAIBRAI__________________________ C$____________________BwCnCnCnBwAI_________A_A_A_A_A____________ CPC$________________BSCFCVBwCWBkCFBsBS___A_A_A_A_A_A_A__________ BdCPC$____________ClBSCFCVCVCVCJCFBsBSCl_A_A_A_A_A_A_A__________ __BkCPCo________ClBjBiBsCFCVBkCFCFBSClCOCO_A_A_A_A_A_A__________ ____BdCPC$____ClCOCOBSBsCFCVBnCFBsBiBjCOCl_A_A_A_A_A_A__________ ______BkCPCoCVBjCOBm__BsCFCVCJCFBs_A_LBkBzCO_A_A_A_A_A__________ ________BkCVCGBmCT__BsBsCFAYALCFBsBS_A_LCJCiCn_A_A_A____________ ________CVAYCiCn____BsCFBWAzBWBvBSBS_A_A_ACnCG_L_A_A____________ ____________CnAYAY__BvBWAz_A_ABWBvAz_A_A_A_A_A_A_A_A____________ ______________AY____BvAzAz_A_ABWBvBW_A_A_A_A_A_A_A_A____________ ____________________CnCnBw_A_ABwCnBw_A_A_A_A_A_A_A_A____________ ________________BsCFBsCnCG_L_ACGCnBsCFBs_A_A_A_A________________ _______________ACnCnCnCTBj_A_ABjCTCTCTCT_A_A_A__________________ _________________A_A_A_A_z_____A_A_A_A_A_A_A_A__________________ ________________________________________________________________ } # tile 45 (dwarf) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________Cm____________________________Cm________________ ________________CmCm________BsBsAqAq________CmCm________________ ________________CmCmCmCmBsBsBsBsAqAqAqAqCmCmCmCm________________ __________________CmCmCmBsBsBsBsBsAqAqAqCmCmCm__________________ ______________________BsBsBsBsBsBsAqAqAqAq______________________ ______CmCmCmCmCmCmCm__CPCPCPBkCPBkBkBdBdBd______________________ __CmCmCPCPCPCPCPCPCPCP__CiCnCiCnCiCiCiCn________________________ CmCP________AqAq________Bs_z_$Ci_z_$CnBi________________________ ____________AqAq________BsCiCnCiCnCiCiBi___________A_A_A_A_A____ ____________AqAq________BsCACiCnCiCnBiBS_______A_A_A_A_A_A_A_A__ ____________AqAq____CiCn_tBsCACFBiBiBS_mCnCi_z_A_A_A_A_A_A_A_A__ ____________AqAq__CiCnCi_tBsBsBiBSBSBS_mCiCnCmCmCPCP_A_A_A_A_A__ ____________CiCnCiCnCi___t_tBsBsBSBS_m_m_zCoCmBSBSCPBk_A_A_A_A__ ____________CnCiCnCi_____t_t_tBsBS_m_m_mCmCmBsBSBSAwCPBk_A_A____ ____________AuBN_________t_t_t_m_m_m_m_mCmBsBsBSBSAwAwBk_M_A____ ____________AqAq________BSBSBSBSBSBSAqAqCPBsBsBSBSAwAwBk_A______ ____________AqAq________BSBSBSBSBSBSAqAqCPCPBsBSBSAwBkCP________ ____________AqAq________BSBSBS_A_ABSAqAq_ACPCPBSBSCPBk__________ ________________________BSBSAq_A_ABSAqAq_A_ACPCPBkBk____________ ____________________BSBSBSBSAq_A_ABSAqAqAqAq_A_A_M______________ ____________________BSBSBSBSAq_A_ABSAqAqAqAq_A_A________________ _______________________A_A_A_A_A_A_A_A_A_A_A_A__________________ ________________________________________________________________ ________________________________________________________________ } # tile 46 (bugbear) { ____________________________CcBsAw__________AwAX_L______________ ________________AABsBsBs_zBsBsBsBsAw________AwAXAX_L____________ _________________zBsBsBsBsBsBsBsBsAwAw______AwAwAXAX_L__________ __________________CcCcBsBsBsBsBsBsBSAxAw______AwAwAX_L__________ ______________________CdCcAvBsBsBSBSBSAx________AwAXAX_LBs______ ______________________CnCmBsBSBSBsBsBSBSAw__________AwAJBsCj____ ____________________CFB$BsBsBsBsBsBsBSBSAwAw________CFAXCjBiCj__ ____________________________CcBtBsBtBsBSBSB_BmBj__CFBsBSAwCjBi__ ____________________________CcBtBsBsBtBSB_BkBzCABsBsBsBSBSAY_N_L __________________________B_CcBtBsBsBsB_BmBsBsBsBsBsBSBSAw__AX__ ________________________BkB_BsBsBsBsB_BkBsBtBsBsBsBSBSAw________ ______________________CcBsBmB_BsBsB_BmBsBsBsBSBSBSBSAw__________ ____________CcBsBs____CcBsBjBbB_AlBzBkCABsBSAwBSBS______________ __________CcBsBsBsCcCcBsBsBZBjAhBjBbBsBsBsBSBSBS________________ __________CcBsBsBsBsBsBsBsAxBkBZBkBzBsBsBsBSBSBT________________ __________CjBsCjBsBsBsBsBsAcBkB_CNAlBsBsBsBSBSAw________________ __________Cj__Cj__BsBsBsAGAIBjBbBLCTBsBsBsBSBSAwBj______________ ____________________BsBSATB_BmB_BjAhBsBsBsBiBjBmB_______________ __________________________B_B_BJB_B_B_AhBjCOBjBZAwAw____________ __________________________BkBmB_BmBjBmCJBzBkB_AwAwAw____________ ____________________________BzBkBzCJBzBkBZB_BWAwAwAw____________ ____________________________BmCTBmB_AhB_BiBsBsBsAwAw____________ __________________________CFBsBjBkBZB_BsBsBsBsBsAwAw____________ ________________________CFBsBsBsCNAlBsBsBsBsBsBsAwAw____________ ________________________BsBsBsBsBSBSBsBsBsBsBsBsAwAw____________ ________________________BsBsBsBsBSBSCFBsBsBsBsBsAw______________ ________________________BsBsBsBsBS____CFBsBsBsBsAw___A_A_A______ __________________________BsBsBs______CFCFBsBsAwAw_A_A_A_A_A____ __________________________BsBsBsBX___A_ACFBsBsAq_A_A_A_A________ ________________________BsBtBsBs_A_A_A_ACFBsAwAw_A_A_A__________ ______________________BsBsBsBs_A_A_A__CcBsBsAw_A_A_A____________ ____________________CjBs____________CjCFBZBsBs_A________________ } # tile 47 (dwarf lord) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________________Cm_M__________________________ ________________________________CmCP_z_____M____________________ ______________________________CPBkBdBDAeABCm_M__________________ ____________________________CmCPBkBDAlAlCmCP_$__________________ ____________________________CfBvAeCfAeCICP_M____________________ __________________________CmCWBkBkCPCmBJ_M______________________ ____________________________CTBVBVCmBlAlAe______________________ __________________________ClClCgCnCmBjBDAe______________________ __________________________AeCqCzCcBkBDAeBkCPBD__________________ ________________________BkCcCzCFBsAeAeBkAlBkBDBD________________ ______________________CmAeCzCzCcAeAZBnCmBDAlBkAeBdAe____________ ______________________CmAeCFCcCFAOBDBkBDAeBsCFCcCzCFAe__________ ____________________BkAeCmAeCFAeBkCPBdAeBsCcCcCYBsCzBsAe________ ______________C$Cm__BnCPBDCmBDCmBdBkAlBkBsCcCYCuCYBsCFBd________ ______________CbCPBkBXBDBkCPCmBDBkBDAlAlCFCzCYCxCFCFCFAe________ __________BkCPCbBDAeBkAlCPBDBkCoBDBmAlBkCcCzCcCYCzCcBsBd________ __________BlBDAOBkAeBDAlAeAlAeBDCPCKAlAlCcCzCcCYCcCcBsAe________ __________CWBDAOBDAe__AOBvCIBWAOAeAlBDBdCFCcCYCxCYCcBsBd________ ____________CbBrAe____AeCICfBvAeCfAeBvAeBdCcCzCYBsCFBdAe________ ____________CbBR______AeBWCIBWAOAOAeAeAOAeCFCcCcCFBSAe_A_A_A____ __________CbBrBR______BkAeAOAOBkBdCPBdAlAOAeBdAeBdAe_A_A_A_A_A__ __________CbBr________BkBkBDAOBkBkBdBkBkBkAOAO_A_A_A_A_A_A_A_A__ __________CbBR______BkCPBdCPAOAOBdCPBkBkBkBkAO_A_A_A_A_A_A_A____ ________CbBrBR______BdAlBDAlAOAOAlBDAlBDAlBDAO_A_A_A_A_A_A______ ____CVCVCbBRAe________CfCIBrBr____BrBrCfCIAO_A_A_A_A_A_A________ ____CVCPCVCVCPAe__CECfCICbCbBr_A_ACECbBrCfCIAO_A_A_A____________ ___A_ABkCPCPBkBDBrCbCbCbBrBrAv_A_AAvCECbCbCbBr_A_A______________ ___A_AC$C$AeBDBDBrBrAvAvAvAv_A_A_A_AAvAvAvAvAv_A________________ _____A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A__________________ } # tile 48 (dwarf king) { ____Cm__________________________________________________________ ____Cm______________Cm__________________________________________ __CmCP____________CPCm__________________________________________ __CmBnBk__Cr____BdBnCm__CV__________________CV__________________ __CmCJBkBkCL__BdBdCm____CV______CPBk________CV__________________ __CmCPBkBkBSBdBdCJCm__CVCP____CPCVBRBD______CVCP________________ __CmBnBkBSBkBdBdCPCm__CV____CPCPBRBRAXBJ______Bn________________ CVCPBkBkBSBkBdBdBnCm__CPCP__CPCVBDAlAlAe____CVCJ________________ CmCPBdBkBSAwBdCPCV______CPBkBRCVBRAvAXAXCVCVCP__________________ CVCP____BSAw__CPCm________BkBRCVBRAvAXAjAl______________________ Cm______CLAw____Cm________CPCPCVBkBkBDBJAl______________________ ______BSAw________________CTAGCnBwAGBVBVAX______________________ ______BSAwCLCL_I_K_K_I____BRCTCnCGBjCGBVAI_____KCrCL_I_ICLCLCL__ ______BSAw____CL_I_ICr_K_KBRCTBRBRBcBVAvAX_K_K_ICL_I_ICLBo______ ______BSAw____CrCL_H_ICr_IBRBRAvAvBRAvAX_K_K_ICr_ICPBdBkBDBD____ ____BSAw______AvCr_H_HCL_HBRAvBRBRAvBR_K_ICL_I_HCPAvCLCLBZAXBD__ ___KBSAw_K__AvAvAvCrCrCLCLCLAvBRAvBRAXCrCrCLCLBZCPAGAvCLAXAXBD__ _H_IBS_I_KAvAvAvAXAXAXAX_G_IAvBRAvBR_H_G_G_H_HBkAvAvAXCLAXAXAIBJ _G_H_I_I_I_KAvAvAXAXAXAX_G_I_KBRAv_I_H_G_G_G_HCJAYAvAvCLAXAXAXAj ___G_H_H_I_IAvAXAXAXCBAICL_ICrBR_I_ICL_G_G_GBoBlCLAvAvCrAXAXBZBJ _____G_G_GAXAXAXCBCB_ICLAGCL_KCr_ICL_H_GCLAICLBmCLCLCrCtCrCLBbBJ ____________CBCBCB_K_KCLAICL_KCL_IBv_HBbAXCL_ICJCLAXAvCrAXATBZAl __________CBCBCB_I_K_K_ICLAXCr_K_I_ICLATCL_I_IBlAvAXAvCLAXAXAXBD __________CBCBCB_K_K_I_I_GCLAXCrCLCLAXCL_I_I_IBmAvAXAvCLAXAXAXAl ________CBCBCB_K_K_I_G_GCLATAXAXAXAGAXCr_I_I_I_ICPAuAvCLAXAXBD__ ________CBCBBoCrCr_ICLCLAuAXAXAXBoBoAXAXCrCLCUBZCPAvCLCLBZAXBD__ ____CBCBCBBoBoBoBoCr_K_IAvAXAXBoBoBoAXAXAv_K_ICBCBCPBkBkBDBDCBCB _______ACBBoBoBoCBCB_K_IAvAXAXBoBoBoBoAXAv_K_I_ICBCBBoBoBoCBCBCB _________A_ABoBoCB_K_K_IAXAXAXBoBoBoBo_K_I_K_I_ICBCBBoBoBoBoCBCB _____________A_A_K_K_I_I_I_I_ABoBoBoBo_K_I_I_K_K_KCBCB_A_A_A_A_A _______________A_I_I_G_G_G_G_A_A_A_A_A_I_I_G_G_G_G_A_A_A_A______ _________________A_A_A_A_A_A_A_________A_A_A_A_A_A_A_A__________ } # tile 49 (mind flayer) { __________________________________________________________Ch____ ________________________________________________________Co____CK ______________ChCKCKCKBYBYBY______________CbCb__________Ch__CK__ ____________ChCoChCoCKCKCKBYBYBY______CBCb_M_M__________ChCK____ ____________CKChCoChChCoCKCKCKBYBYBYCB_MAK_MAK__________CoCK__BY ____________BYCKCeChCoChChChCKCKCKBYBY_z_M_z_M________ChCKCKBY__ ____________BYBYCKCKChCoChCoChCoCKCKBYBY_z_O______AOAOCKCKBY____ ______________BYCKCbCxCbCKChChChChCKCKBY_MAA______AOAOAOCK______ ______________BoCBAB_CA_CKCKCKChChCh_m_wA__M__AOAOAOAOABBY______ _________________M_BAA_M_MBYCK_m_wBY_w_mCKAOAOAOAOAOAOABCK______ __________________AB_zAB_zBYCK_w_mBYBYCKCKCKAOAOAOABABAB________ _____________________M_BAB_MBYBYCKCKCKBYCKCKCKChAB_MABABAB______ ______________________AA_BAB_zBYBYBYCKBYCKBYBYBYCoA__MABAB______ _________________________MAOAOAOABCKCKCKCKChBYBYCKABAK_MAB______ ______________________AOAOAOAOABABCKBYCKBYChChBYA_CKABABAB______ Ch__________________AOAOAOAOABAOChCKBYChBYBYCKAB_MCKAB_MAB______ __CoCh__________AOAOAOAOAOAOABABCKBYBYCoBYBYCK_MAA_MA_ABAB______ ____CeCoCh_____M_MAOAOAOAOAOABCKCKABA_CKBYA_CK_MA_AA_MABAB______ ______CKChCoChCoChAeAOAOAOAOABCK_MAB_MCK_MAACK_M_MA__MAAAB______ __CKCKCKCKCKCeCKCKAOAOABAO_MAB_MABABAACKABAOA_AOAA_NA__MAB______ CKCK____CKBYBYBYA_AOABABABAAABABAB_MA_CKABABCrAO___MAA_MAB_A_A__ ______CKBY____AA_MABAB_MAB_MABAB_z_zAB_MCrCrABAO______A__M_A_A_A ____CKBY_______MA_ABABAAABA_AB_A_MABBZCL_zCLABAOAO_A_A_A_A_A_A_A ____BY___________MABAB_MABABAB_z_MABAB_MABAOCLAOAO_A_A_A_A_A_A_A ________________AAABABA__MAB_A_M_$ABAB_MABAOCLABAOAO_A_A_A_A_A_A _________________MAB_MAB_M_A_zAB_OAB_zABABBZAOABAOAO_A_A_A_A_A_A ________________A_ABAAABAB_A_M_zABAB_OAB_zCLAOABAOBr_A_A_A_A_A__ ___________________M_MABAB_AAK_M_MABAKAB_MABAOABBr_A_A_A_A_A____ ______________________ABAB_AAX_M_$AB_MABABABABBr_A_A_A_A_A______ ___________________________A_AAX_OABABAvAuAuAv_A_A_A_A_A________ _____________________________A_AAXAvAv_A_A_A_A_A_A______________ _______________________________A_A_A_A_A_A______________________ } # tile 50 (master mind flayer) { _________________M_MAA____________________________________Ch____ _______________MA_ABABA__M_M____________________________Ch____CK _____________MAAABAOABABB_AA_MA____________f_f__________Co__CK__ ___________MABAOAOAOAOCLBZB__MAA_M_M___a_f_M_M__________ChCK____ __________AAABAOAOAOBbCrCLBZB_AqBNBN_a_MAK_zAB__________ChCh__BY __________A__MABABAOAZCLCUCLCBBNCKBYBY_$_M_M_M________CoCKCKBY__ _____________MA_ABABAOABCLBoCBChCKCKBYBY_AAK______AOAOCKCKBY____ ______________AA_M_f_f_fBNCBCoChCoCK_mBY_M_M______AOAOAaCK______ _______________a_f_M_z_OBNCKCKCKChCK_m_wAB_z__AOAOAOAOABBY______ _________________MAK_OAAA_BY_m_m_wBY_w_mCKAOAOAeChCKAOABCK______ ___________________M_z_O_MBYCK_w_mBYBYCKCKCKChCoCKABABAB________ _____________________zAB_zABBYBYCKCKCKBYCKChCKCKABA_ABABAB______ _______________________M_M_$_OBYBYBYCKBYCoCeBYBYCK_M_MABAB______ ________________________ABAOAeCKChCoChBUAyBUCoChCKChCh_MAB______ ______________________AOAOChChCoCeCKCKAyBYBYBYCKBYBYCKABAB______ Ch__________________AOAOAOAeAOABABAOChCKBYBYBY_MAK_MAB_zAB______ __CoCh__________AOAOAOAOAOAOABABABChChBYA_BYA__M_zAB_MABAB______ ____CeCoCh_____M_MAOAOAOAOAOABABAHCoCK_MAA_O_zAB_O_$_MABAB______ ______CKChCo_lChCoAaAOAOAOAOABABChCKA__MA__MAA_M_zAB_MAKAB______ __CKCKCKCKCKBfCKCKAOAOABAO_MABA_CoCKAA_MABAO_MAOAB_O_z_MAB______ CKCK____CKBY_mBYA_AOABABAB_zABABCKA__MA_ABABCrAO___zAB_MAB_A_A__ ______CKBY___cAB_MABAB_MABABABAB_A_MAB_MCrCrABAO_______$_M_A_A_A ____CKBY_____c_z_MABABAAAB_MAB_A_MAKBZCL_zCLABAOAO_A_A_A_A_A_A_A ____BY__________ABABAB_MABABAB_A_zABAB_MABAOCLAOAO_A_A_A_A_A_A_A _________________zABABA__MAB_AAB_MABAB_zABAOCLABAOAO_A_A_A_A_A_A _________________MAB_MAB_M_z_M_BAAAB_MABABBZAOABAOAO_A_A_A_A_A_A ________________ABABAAABAB_z_MAK_MABABAB_MCLAOABAO_f_A_A_A_A_A__ __________________A__MABAB_AAB_z_MAB_zAB_zABAOAB_f_A_A_A_A_A____ ______________________ABAB_A_S_MABAB_MAB_OABAB_f_A_A_A_A_A______ ___________________________A_A_S_zABAB_W_W_W_W_A_A_A_A_A________ _____________________________A_A_S_W_W_A_A_A_A_A_A______________ _______________________________A_A_A_A_A_A______________________ } # tile 51 (manes) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________BMBMBD________________________________________ ______________BMBMBMBMBMAi______________________________________ ____________BMBMBMBMBMBMBd______________________________________ ____________BMBMBMBMBMBMBMAi____________________________________ __________BM_ABMBMBMBM_ABMBd____________________________________ __________BMCY_ABMBM_ACpAi______________________________________ ________BDAiBMBM__BMBMBDAi__________BMBMBMBM____BMBM____________ __________BdBM____BMAiBdAiBd____BMBMBMBMBMBMBMBMBMBM____________ ____________AiBdBFBDBd__BM____BMBMBMBMBDAiBdAiBdBF______________ ____________C$BdAi__C$__AiBMBMBMBMBFBdAi________BMBM____________ ____________BF______C$BM__BdBFBMBMBMBF__________BDBFBMBM________ __________BDBM__C$__BFBD____BMBMBMAiBd________BMBFBMBMBMBM______ ____________AiBMBMBMAi____BMBMBMBDAi______BMBMBD__BDBF__BMBM____ ____________BdBDBdAiBd__BMBMBMBFBd________C$________BM____C$____ ________BFBFBFBF______BMBMBDAiBMAi____Bd__C$________C$__________ ______BMBMAi__BFBMBMBMBMAi____BMBM____BF__________C$____________ ____BMBM____________BdAi____BMBMBM__BMBMAi______________________ ____BFBd________________AiBdBMBM____BMAiBdBD____________________ ____BMBF__________________AiBdBFBMBMBMBMBMBF____________________ ______BMBM__________________AiBdAiBd____BM____BM________________ ________BDBF__________________________BMBM__BMBD________________ ____BMBMBFBMBMC$C$________________AiBMBM____BMAi__BM____________ __BMBM__BM______C$__________________________________BD__________ __BM____BMBM____________________________BMBM____BM______________ ____BM______C$________________________________________BF________ ______C$________________________________________________________ ______C$C$______________________________________________________ ________________________________________________________________ } # tile 52 (homunculus) { ________________________________________________________________ ________________________________________________________________ _____________c_c_c_c_______c_c_h_c_______c_c_c_c_________c_c____ _c_c___________c_Q_Q_c_h_c_h_h_c_c_X_X_c_Q_Q_c_______c_cBdBd____ BdBd_c_c_________c_c_Q_hCuCu_c_XCuCu_c_Q_c_c_____c_cBdBdBd______ BdBdBdBd_c_c_c_______c_c_h_h_h_c_X_c_X_c_______c_XBdBdBd________ __BdBdBdBd_XBd_c_______hBNBdBNBNBdBN_X_______c_XBd_XBdBd________ __BdBd_X_XBd_XBd_c_______hBdBNBNBd_X_______cBd_XBdBd_X_X________ _c_c_XBdBd_XBdBdBd_c_c_____c_X_X_X_____c_cBdBd_XBdBdBd__________ __BdBdBdBd_XBdBdBdBd_h_c_Q_h_h_c_c_h_c_hBdBdBdBd_XBd____________ ____BdBd_cBdBdBdBd_h_c_h_h_c_c_X_h_h_Q_h_cBdBdBd_XBd____________ ______Bd_cBdBd_h_Q_h_h_Q_c_h_Q_h_Q_h_c_c_c_h_cBd_X______________ _________cBd_c_h_c_c_X_c_h_c_c_X_c_X_Q_X_Q_c_c_h________________ _____________h_c_X_____h_Q_c_X_h_c_X_X_____c_X_c________________ _______________c_____h_c_c_Q_c_Q_h_X_X_Q_____X__________________ _____________________Q_h_c_X_____c_h_X_X________________________ _____________________h_c_X_X_____h_c_X_Q________________________ ___________________h_h_c_c_X_____Q_c_X_X_X______________________ _____________________X_c_Q_X_____h_c_Q_Q________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ___________________A_A_A_A_A_A_A_A_A____________________________ _____________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A______________________ ___________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A____________________ _____________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A______________________ _____________A_A_A_A_A_A_A_A_A_A_A_A_A_A________________________ _________________A_A_A_A_A_A_A_A_A_A_A__________________________ _________________________A_A_A_A________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 53 (imp) { ________________________________________________________________ ______________Bk____________________________Bd__________________ ______________BnBd________BNBoBoBN________BkBd__________BoBo____ BoBo__________BdBkCJBkBoBoBoBoBNBNAqAqCPBkBdBd______BoBoBdBd____ BdBdBoBo________BdBkBdBoCuCuBNAqCuCuBNBdBdBd____BoBoBdBdBd______ BdBdBdBdBoBoBo________BNBoBoBoBNAqBNAq________BoBNBdBdBd________ __BdBdBdBdBoBdBo______Bo_ACP_A_ACP_AAq______BoBNBdBNBdBd________ __BdBdBNAqBdBoBdBN______BoCP_A_ACPAq______BNBdBNBdBdBNBN________ BNBNAqBdBdBNBdBdBdBNBN____BNAqAqAq____BNBNBdBdBNBdBdBd__________ __BdBdBdBdAqBdBdBdBdBoBoATBoBoBNBNBoBoBoBdBdBdBdBNBd____________ ____BdBdBNBdBdBdBdBoBNBoBoBNBNAqAqAqATBoBoBdBdBdBNBd____________ ______BdBNBdBdBoATBoBoATBNBNATBNATAqBNBNBNBoBoBdBN______________ ________BNBdBoBoBNBNAqBNBoBNBNAqAqATATAqATBNBNBo________________ ____________BoBNAq____BoATBoAqBNATAqAq____BNAqBN________________ ______________BN____BoBNBNATBNATBNATAqAT____Aq__________________ ____________________ATBoBNAq____BNBNATAq________________________ ____________________BoBNAqAq____BoBNAqATAT______________________ __________________BoBoBNBNAq____ATBNAqAqATAT____AT______________ ____________________AqBNATAq____BoBNATAT__ATATATATAT____________ ________________________________________________AT______________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ___________________A_A_A_A_A_A_A_A_A____________________________ _____________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A______________________ ___________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A____________________ _____________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A______________________ _____________A_A_A_A_A_A_A_A_A_A_A_A_A_A________________________ _________________A_A_A_A_A_A_A_A_A_A_A__________________________ _________________________A_A_A_A________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 54 (lemure) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________BjBjBjBJBJ____________________________ ______________________BjBkCJBjBjBjBJBJ__________________________ ____________________BjCJAlAlBjAlAlBJBJ__________________________ __________________BJBJBzAeAeCJAeAeBjCJBJBJ______________________ ________________BJCJBkCJ_cBjCOBc_cBjBjBkBJ______________________ ______________BJBLCTBjBj_cBjAYAYBjBjBjCTBjBJ_____A_A_A_A_A______ ______________BjCJBcBjBJBjAYAYAYAYBjBjBjBkBj___A_A_A_A_A_A______ ____________BjBkBjBjBJBjCJBJ_c_c_cBJBjBjCNCJBJ_A_A_A_A_A_A_A____ ____________CJBzBjBJBJBJBkBj_c_cBjBJBJBjBjBkBj_A_A_A_A_A_A_A____ ____________BkCJBjBJ__BJBjBjBj_cBj__BJBJBjBzCJBJ_A_A_A_A_A_A____ __________BJCTBLBjBJ__BJCJBjBj_cBjBJ_ABJBJBjCJBJ_A_A_A_A_A______ __________CTBkBjBJBJBJBjBzBJBjBJBjBJBJ_ABJBjBjBk_A_A_A_A_A______ __________BkCNBjBJ__BJCJBjBjBJBJBjBjBJ_ABJBJBjBj_A_A_A_A_A______ __________CJBjBjBJ__BjBkBjBjBJBjBJBjBJBJ_ABJBj_A_A_A_A_A_A______ __________BjBjBJ__BJBjCOBjBJBJBjBjBjBjBJBJ_A_A_A_A_A_A_A_A______ ____________BJBJ__BJCJBjBjBJBJBJBjCJBjBjBJ_ABJ_A_ABJ_A_A_A______ ________________BJBJBkCTBjBJBJ_ABJBkCTBjBJ_A_A_A_A_A_A__________ ________________BJBJCOBjBJBJ_A_ABJBzBkBjBJBJ_A_ABJBJ_A__________ ______________BjBJBjBjBjBJBJ_A_ABJBjCJBjBjBJ_A_ABJ_A_A__________ ___________ABjBJBJCJCJBjBJBJ_A_ABJBjBkBjBjBJBJBJ_A_A_A_A________ _________ABJBjBJBJBjCOBcBJBJ_ABJBJBjBjCTBjBJBJBjBJ_A_A_A________ _________ABJBjBjBjBjBkBjBJBJBJ_ABJBJCOBkBjBjBjBjBJ_A_A_A________ _________A_ABJBjBjBjBjBJBjBJBJ_ABJBjBcBjBjBjBjBjBJBJ_A_A________ ___________A_ABJBJBjBjBjBjBJBJ_A_ABJBjBjBjBJBJBJBJ_A_A__________ _____________A_ABJBJBJBJ_A_A_A_____A_ABJBJ_A_A_A_A_A_A__________ _________________A_A_A_A_A_____________A_A_A____________________ } # tile 55 (quasit) { ________________________________________________________________ ______________Bk____________________________Bd__________________ ______________BnBd_________I_K_K_I________BkBd___________K_K____ _K_K__________BdBkCJBk_K_K_K_K_I_I_G_GCPBkBdBd_______K_KBdBd____ BdBd_K_K________BdBkBd_KCuCu_I_GCuCu_IBdBdBd_____K_KBdBdBd______ BdBdBdBd_K_K_K_________I_K_K_K_I_G_I_G_________K_IBdBdBd________ __BdBdBdBd_KBd_K_______KBNCPBNBNCPBN_G_______K_IBd_IBdBd________ __BdBd_I_GBd_KBd_I_______KCPBNBNCP_G_______IBd_IBdBd_I_I________ _I_I_GBdBd_IBdBdBd_I_I_____I_G_G_G_____I_IBdBd_IBdBdBd__________ __BdBdBdBd_GBdBdBdBd_K_K_F_K_K_I_I_K_K_KBdBdBdBd_IBd____________ ____BdBd_IBdBdBdBd_K_I_K_K_I_I_G_G_G_F_K_KBdBdBd_IBd____________ ______Bd_IBdBd_K_F_K_K_F_I_I_F_I_F_G_I_I_I_K_KBd_I______________ _________IBd_K_K_I_I_G_I_K_I_I_G_G_F_F_G_F_I_I_K________________ _____________K_I_G_____K_F_K_G_I_F_G_G_____I_G_I________________ _______________I_____K_I_I_F_I_F_I_F_G_F_____G__________________ _____________________F_K_I_G_____I_I_F_G________________________ _____________________K_I_G_G_____K_I_G_F_F______________________ ___________________K_K_I_I_G_____F_I_G_G_F_F_____F______________ _____________________G_I_F_G_____K_I_F_F___F_F_F_F_F____________ _________________________________________________F______________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ___________________A_A_A_A_A_A_A_A_A____________________________ _____________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A______________________ ___________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A____________________ _____________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A______________________ _____________A_A_A_A_A_A_A_A_A_A_A_A_A_A________________________ _________________A_A_A_A_A_A_A_A_A_A_A__________________________ _________________________A_A_A_A________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 56 (tengu) { ________________________________AeAeAeAeAeAeAeAeAeAeAeAeAe______ ____________________________AeAeAeAeAeABABABAeAeAeAeAe__________ __________________________AeAeAeAeABABABABAB____________________ ________________________AeAeAeABABABABABABABABAB________________ ________________________AeAeAeABCYCYCYABABABABABABABAB__________ ________________________CzCzABABCYCYABABAB______________________ ______________________CzCzCcCcABABABABABABABAB__________________ ____________________CzCzCcCcCcCcABABABABABABABABABAB____________ __________________CzCzCcCcCFCFCcABABABBJCpCuCBCBCB______________ __________________CzCcCFCFCcCcAeAeAeAeCuC$CmCBCBAeAeAe__________ ________________CzCcCFCcCcCBCBAeAeAeAeCuCmCmCBCBAeAeAeAe________ ____________AeAeCzABCcCuCuCBCBAeAeAeCuCuCuCBCBABABAeAeAeAe______ __________AeAeABABABCuC$CmCBAeAeAeAeCuC$CmCBCBABABABAeAeAe______ ____Bs__AeAeABABABABCuCmCmCBAeAeAeAeCuCmCmCBABABABABABAeAeAe____ ____BsAeAeAeABAB____CuCuCBCBAeAeAeAeCuCuCBCBABAB__ABABABAeAe____ ____AeAeAeABAB______CuCuCBCBCBAeAeCuCuCuCBCBAB______ABABABAeAe__ ____AeAeABAB________CuC$CmCBCBAeAeCuCuC$CmCB________ABABABABAe__ ____AeAeAe__________CuCmCmCBCBAeAeCuCuCmCmCB__________ABABABAe__ ____BsAwBsBs__________CuCBCBCBAeAeCuCuCBCBCB__________ABABABAe__ __BsAwAwAwBsBs________CuCuCBCBCBCBCBCBCBCBCB____________ABAe____ __BsAwBsAwAwBs________CuCuCBCBCBCBCBCBCBCBCB____________________ BsAwAwBsAwBsAwBs__CuCuCuCBCBCBCBCBCuCuCBCBBoBoBo________________ BsAwAwBs__Bs__BsBsCuCBCBCBCBBoBoBoCuCuCuCBCBBoBoBo______________ BsAw__Bs__Bs____BsCuCBCBCBBoBoBo_ACuCuCuCBCBCBBoBo______________ Bs____Bs__BsBs__CuCuCBCBCBBoBo_A_ACuCuCuCBCBCBBo_A_A_A_A_A_A____ Bs____Bs____Bs____CuCuCBCBBoBo_A_ACuCuCuCBCBBoBo_A_A_A_A_A_A____ Bs____Bs_________ACuCuCBCBBo_A_A_A_ACuCuCBCBBo_A_A_A_A_A_A_A____ _____________A_A_A_A_ACuCBBo_A_A_A_ACuCuCBCBBo_A_A_A_A_A_A______ _________A_A_A_ABsBsBsBsBsBsBs_A_ABsBsBsBsBsBsBsBs_A_A_A________ _________A_A_A_ABsBsBsBsBsBsBs_A_ABsBsBsBsBsBsBsBs_A_A_A________ _________A_A_A_A_A_A_ABsBs_A_A_A_A_A_A_ABsBs_A_A_A_A_A__________ _____________A_A_A_A_ABsBs_A_A_A_A_A_A_ABsBs_A_A________________ } # tile 57 (blue jelly) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ___________________________k_k_k_k_k____________________________ _______________________k_k_k_k_k_k_k_k_k________________________ _____________________k_kCPCPCP_k_k_k_k_k_k_k____________________ ___________________k_kCPCPCPCP_k_k_k_k_k_k_k_k_A_A_A_A_A________ ___________________kCPCPCPCP_k_k_k_k_k_k_k_k_k_A_A_A_A_A_A_A____ _________________k_kCPCP_k_k_g_g_g_g_g_k_k_k_k_k_A_A_A_A_A_A____ _______________k_kCPCP_k_g_g_g_g_g_g_g_g_g_k_k_k_A_A_A_A_A_A_A__ _______________kCP_k_k_g_g_g_g_g_g_g_g_g_g_g_g_k_k_A_A_A_A_A_A__ _____________k_kCP_k_g_g_g_g_g_g_g_g_g_g_g_g_g_g_k_A_A_A_A_A_A__ _____________k_k_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_g_A_A_A_A_A__ ___________k_k_g_g_f_f_f_g_g_g_g_g_g_g_g_f_f_f_g_g_g_g_A_A_A_A__ ___________k_g_g_f_f_f_f_f_g_g_g_g_g_g_f_f_f_f_f_f_g_g_g_A_A_A_A ___________g_g_g_f_f_f_f_f_g_g_g_g_g_g_f_f_f_f_f_f_g_g_g_g_A_A_A ___________g_g_f_f_f_b_b_b_b_f_f_f_f_f_b_b_b_b_b_b_b_f_f_g_g_A_A _________g_g_f_b_b_b_b_b_b_b_f_f_f_f_b_b_b_b_b_b_b_b_b_f_f_g_A_A _________g_g_b_b_b_b_b_b_b_b_b_f_f_f_b_b_b_b_b_A_A_A_A_A_f_f_g_A _______g_g_g_b_b_b_b_b_b_b_b_b_f_f_f_b_b_b_b_A_A_A_A_A_A_A_f_g_A _______g_g_b_b_b_A_A_A_A_A_b_b_f_f_f_b_b_b_A_A_A_________A_f_g_A _______g_b_b_b_A_A_A_A_A_A_A_b_f_f_f_b_b_A_A_A___________A_f_g_A _____g_g_b_b_A_A_A_________A_A_f_f_f_g_g_A_A_____________A_f_g_A _____g_b_b_A_A_______________A_A_f_f_g_g_A_______________A_g_A_A ___g_g_b_A_A_________________A_A_f_f_f_g_A_A_A___________f_g_A__ _g_g_b_b_A_____________________A_A_f_f_f_g_g_A_A_________A_A____ _g_b_b_A_A_______________________A_A_f_f_f_g_g_A________________ _b_A_A_A___________________________A_A_A_f_f_g_g_A_A____________ _______________________________________A_A_A_A_f_g_A____________ _____________________________________________A_A_A_A____________ ________________________________________________________________ } # tile 58 (spotted jelly) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ___________________________kCBCBCB_k____________________________ _______________________k_kCBCBCBCBCB_k_k________________________ _____________________k_kCPCPCP_k_k_k_kCB_k_k____________________ ___________________k_kCPCPCPCP_k_k_kCBCBCB_k_k_A_A_A_A_A________ ___________________kCPCPCPCP_k_k_k_kCBCBCBCB_k_A_A_A_A_A_A_A____ _________________k_kCPCPCB_k_g_g_g_g_gCBCB_k_k_k_A_A_A_A_A_A____ _______________k_kCPCPCBCB_g_g_g_g_g_g_g_g_k_k_k_A_A_A_A_A_A_A__ _______________kCP_kCBCB_g_g_gCBCB_g_g_g_g_g_gCBCB_A_A_A_A_A_A__ _____________k_kCP_k_g_g_g_gCBCBCBCB_g_g_g_g_gCBCB_A_A_A_A_A_A__ _____________k_kCBCB_g_g_g_gCBCBCBCB_g_g_g_g_g_g_g_g_A_A_A_A_A__ ___________k_k_gCBCB_f_f_g_g_gCBCBCB_g_g_f_f_f_g_g_gCB_A_A_A_A__ ___________k_g_g_f_f_f_f_f_g_g_g_g_g_g_f_f_f_f_f_f_gCBCB_A_A_A_A ___________g_g_g_f_f_f_f_f_g_g_g_g_g_g_f_f_f_f_f_f_g_g_g_g_A_A_A __________CBCB_f_f_f_b_b_b_b_fCBCB_f_f_b_b_b_b_b_b_b_f_f_gCB_A_A _________gCBCB_b_b_b_b_b_b_b_fCBCB_f_b_b_b_b_b_b_b_b_b_f_fCB_A_A _________g_g_b_b_b_b_b_b_b_b_b_f_f_f_b_b_b_b_b_A_A_A_A_A_f_f_g_A _______g_g_g_b_b_b_b_b_b_b_b_b_f_f_f_b_b_b_b_A_A_A_A_A_A_A_f_g_A ______CBCB_b_b_b_A_A_A_A_A_b_b_f_f_f_b_b_b_A_A_A_________A_f_g_A ______CBCB_b_b_A_A_A_A_A_A_A_b_fCBCB_b_b_A_A_A___________A_f_g_A _____g_g_b_b_A_A_A_________A_A_fCBCB_g_g_A_A_____________A_f_g_A _____g_b_b_A_A_______________A_A_f_f_g_g_A_______________A_g_A_A ___g_g_b_A_A_________________A_A_f_fCBCB_A_A_A___________f_g_A__ _g_g_b_b_A_____________________A_A_fCBCB_g_g_A_A_________A_A____ _g_b_b_A_A_______________________A_A_f_f_f_g_g_A________________ _b_A_A_A___________________________A_A_A_f_f_g_g_A_A____________ _______________________________________A_A_A_A_f_g_A____________ _____________________________________________A_A_A_A____________ ________________________________________________________________ } # tile 59 (ochre jelly) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________CICICICICI____________________________ ______________________CICICICICICICICICI________________________ ____________________CICICPCPCPCICICICICICICI____________________ __________________CICICPCPCPCPCICICICICICICICI_A_A_A_A_A________ __________________CICPCPCPCPCICICICICICICICICI_A_A_A_A_A_A_A____ ________________CICICPCPCICIBvBvBvBvBvCICICICICI_A_A_A_A_A_A____ ______________CICICPCPCIBvBvBvBvBvBvBvBvBvCICICI_A_A_A_A_A_A_A__ ______________CICPCICIBvBvBvBvBvBvBvBvBvBvBvBvCICI_A_A_A_A_A_A__ ____________CICICPCIBvBvBvBvBvBvBvBvBvBvBvBvBvBvCI_A_A_A_A_A_A__ ____________CICIBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBvBv_A_A_A_A_A__ __________CICIBvBvBWBWBWBvBvBvBvBvBvBvBvBWBWBWBvBvBvBv_A_A_A_A__ __________CIBvBvBWBWBWBWBWBvBvBvBvBvBvBWBWBWBWBWBWBvBvBv_A_A_A_A __________BvBvBvBWBWBWBWBWBvBvBvBvBvBvBWBWBWBWBWBWBvBvBvBv_A_A_A __________BvBvBWBWBWAzAzAzAzBWBWBWBWBWAzAzAzAzAzAzAzBWBWBvBv_A_A ________BvBvBWAzAzAzAzAzAzAzBWBWBWBWAzAzAzAzAzAzAzAzAzBWBWBv_A_A ________BvBvAzAzAzAzAzAzAzAzAzBWBWBWAzAzAzAzAz_A_A_A_A_ABWBWBv_A ______BvBvBvAzAzAzAzAzAzAzAzAzBWBWBWAzAzAzAz_A_A_A_A_A_A_ABWBv_A ______BvBvAzAzAz_A_A_A_A_AAzAzBWBWBWAzAzAz_A_A_A_________ABWBv_A ______BvAzAzAz_A_A_A_A_A_A_AAzBWBWBWAzAz_A_A_A___________ABWBv_A ____BvBvAzAz_A_A_A_________A_ABWBWBWBvBv_A_A_____________ABWBv_A ____BvAzAz_A_A_______________A_ABWBWBvBv_A_______________ABv_A_A __BvBvAz_A_A_________________A_ABWBWBWBv_A_A_A__________BWBv_A__ BvBvAzAz_A_____________________A_ABWBWBWBvBv_A_A_________A_A____ BvAzAz_A_A_______________________A_ABWBWBWBvBv_A________________ Az_A_A_A___________________________A_A_ABWBWBvBv_A_A____________ _______________________________________A_A_A_ABWBv_A____________ _____________________________________________A_A_A_A____________ ________________________________________________________________ } # tile 60 (kobold) { ____________________________AY__________________________________ __________________AAAw______AYAY________________________________ ____________________AAAwAY__AYAYAA______________________________ ____________________AwAAAwAYAAAA_zAA____________________________ ______________________AwAwAYAY_NAAAA____________________________ ______________________AwAwAYCuCuAACu____________________________ ________________________AwAwAYAYAA_LAA__________________________ ________________________AwAwAwAYAXAAAA__________________________ __________________________AYAwAYAYAA_z__________________________ ________________________AYAYAAAA_NAA____________________________ ____________________AwAwAwAYAYAYAYAYAYAY________________________ __________________AwAwAwAwAwAYAYAYAYAYAYAY______________________ __________________AwAYAwAwAYAYAYAYAYAAAAAYAY____________________ ________________AwAYAYAwAwAYAYAYAYAA_zAAAYAY____________________ ________________AwAAAAAwAwAYAYAYAYAA_N__AAAYAY__________________ ______________AwAY_z__AwAYAYAYAYAY_zAA__AAAYAY__________________ ______________AwAYAA__AwAwAYAAAAAYAAAA_____zAY_A_A_A____________ ______________AYAA____AwAYAY_LAAAYAY_z___A_A_A_A_A_A____________ ______________________AwAYAAAA_zAYAYAA_A_A_A_A_A_A_A____________ ______________________AwAYAA____AYAYAA_A_A_A_A_A_A_A_A__________ ______________________AwAY_z____AwAYAA_A_A_A_A_A_A_A_A__________ ______________________AwAYAA___AAwAJAA_A_A_A_A___A_A_A__________ ______________________AwAYAA_A_AAwAYAA_A_A_A_______A_A__________ ______________________AwAJAA_A_AAwAYAA_A_A______________________ ______________________AwAYAA_A_AAwAYAA_A________________________ _______________________A_A_A_____A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 61 (large kobold) { ____________________________AY__________________________________ __________________AAAw______AYAY________________________________ ____________________AAAwAY__AYAYAA______________________________ ____________________AwAAAwAYAAAA_zAA____________________________ ______________________AwAwAYAY_NAAAA____________________________ ______________________AwAwAYCuCuAACu____________________________ ________________________AwAwAYAYAA_LAA__________________________ ________________________AwAwAwAYAXAAAA__________________________ __________________________AAAwAYAYAA_z__________________________ ________________________AwAwAAAA_NAA____________________________ ____________________AwAwAwAwAJAA_z_X_XAY________________________ __________________AwAYAwAwAYAYAA_X_X_XAYAY______________________ __________________AYAYAwAwAYAY_c_X_X_XAAAY______________________ ________________AwAYAAAwAwAYAY_c_c_X_zAAAYAY____________________ ________________AYAA_zAwAw_h_c_c_c_XAAAA_LAY____________________ ______________AwAYAA__Aw_h_h_c_c_X_X_X__AAAY____________________ ______________AwAA_L___h_h_c_h_c_X_X_X__AAAYAY__________________ ______________AYAA_____h_h_c_h_c_X_X_X___zAAAY_____A_A_A________ ______________AYAA_____h_h_c_c_c_c_X_X____AAAY_A_A_A_A_A________ ______________AY_z_____h_h_c_c_c_c_X_X____AAAY_A_A_A_A__________ ______________AYAA_____h_h_c_c_c_c_X_X_____NAY_A_A_A_A__________ _______________________h_hAA_c__AY_X_X___AAAAY_A_A_A_A__________ _______________________hAYAA_c__AYAY_X_A_A_A_A_A_A______________ ______________________AYAJAA____AYAYAA_A_A_A_A_A________________ ______________________AwAYAA___AAwAYAA_A_A_A_A__________________ ______________________AwAYAA_A_AAwAJAA_A_A_A_A__________________ ______________________AwAY_z_A_AAwAYAA_A_A_A____________________ ______________________AwAYAA_A_AAwAYAA_A_A______________________ ______________________AwAYAA_A_AAwAYAA_A________________________ _____________________AAwAYAA_A_AAwAJAA_A________________________ _______________________A_A_A_A___A_A_A__________________________ ________________________________________________________________ } # tile 62 (kobold lord) { ____________________________AY__________________________________ __________________AAAw______AYAY________________________________ ____________________AAAwAY__AYAYAA______________________________ ____________________AwAAAwAYAAAA_zAA____________________________ ______________________AwAwAYAY_NAAAA____________________________ ______________________AwAwAYCuCuAACu____________________________ ________________________AwAwAYAYAA_LAA__________________________ ________________________AwAwAwAYAXAAAA__________________________ __________________________AAAwAYAYAA_z__________________________ ________________________AwAwAAAA_NAA____________________________ ____________________AwAwAwAwAJAA_zAcAcAY________________________ __________________AwAYAwAwAYAYAAAcAcAcAYAY______________________ __________________AYAYAwAwAYAYAzAcAcAcAAAY______________________ ________________AwAYAAAwAwAYAYAgAzAc_LAAAYAY____________________ ________________AYAA_zAwAwBaAzBWAzAcAAAA_zAY____________________ ______________AwAYAA__AwBaBaBWAgAcAcAc__AAAY____________________ ______________AwAA_L__BaBaAzBaAzAcAcAc__AAAYAY__________________ ______________AYAA____BaBaAgBaBWAcAcAc___LAAAY_____A_A_A________ ______________AYAA____BaBaBWAzAgAzAcAc____AAAY_A_A_A_A_A________ ______________AY_z____BaBaAzAgAzBWAcAc____AAAY_A_A_A_A__________ ______________AYAA____BaBaBWAzAgAzAQAc____AAAJ_A_A_A_A__________ ______________________BaBa_QBW__AYAcAc___AAAAY_A_A_A_A__________ ______________________BaAYAAAz__AbAYAc_A_A_A_A_A_A______________ ______________________AYAYAA____AYAYAA_A_A_A_A_A________________ ______________________AwAYAA___AAwAYAA_A_A_A_A__________________ ______________________AwAJAA_A_AAwAYAA_A_A_A_A__________________ ______________________AwAYAA_A_AAwAY_z_A_A_A____________________ ______________________AwAYAA_A_AAwAYAA_A_A______________________ ______________________AwAYAA_A_AAwAYAA_A________________________ _____________________AAwAJAA_A_AAwAYAA_A________________________ _______________________A_A_A_A___A_A_A__________________________ ________________________________________________________________ } # tile 63 (kobold shaman) { ____________________________AY__________________________________ __________________AAAw______AYAY________________________________ ____________________AAAwAY__AYAYAA______________________________ ____________________AwAAAwAYAAAA_zAA____________________________ ______________________AwAwAYAY_NAAAA____________________________ ______________________AwAwAYCuCuAACu____________________________ ________________________AwAwAYAYAA_LAA__________________________ ________________________AwAwAwAYAXAAAA__________________________ __________________________AAAwAYAYAA_z____________AYAYAYAY______ ____AYAYAYAY__________BoBoAJAAAA_NAABoBoBoBoAYAYAYAYAYAAAA______ ____AAAAAYAYAYAYAYBoBoBoBoBoAY_zAAAYBNBNBNBNAYAYAAAA_z__________ _______zAAAAAYAYAYBoCMBoBoBoAYAYAYBNBNBNAzAqAA_LAA______________ ___________NAAAAAABoBoBNBoBNBNBNBNBNBNAqAuAq____________________ ______________AGAABoBoBNBoBNBNBNBNAqBNAuAzAq____________________ ______________ATATBNCMBNBoBNBNBoBNAqAqAqAqAq____________________ ______________ATATBNBNBoBNBoBNBoBNBNBNAqAqAq____________________ ______________ATATATBNBoBNBoBNBNBNBNBNAqAzAu___A_A_A_A_A________ ________________ATATBNCMBNBNBNBNBNAqBNAqAqAq_A_A_A_A_A_A________ ________________ATATBNBoBNBNBNBNBNAqBNAqAq_A_A_A_A_A_A_A________ ________________ATATBNBoBNBNBoBNBNAqBNAzAq_A_A_A_A_A_A_A________ __________________ATAYBoByBNBNBNAqBNAqAu_A_A_A_A_A_A_A_A_A_A_A_A ____________________AYBoBNBNBaBNAqBaAqAA_A_A_A_A_A_A_A_A_A_A_A__ ____________________AYAYBNBNBNBNBNBNAA_L_A_A_A_A_A_A____________ ____________________AYAYAABN_A_ABN_zAAAA_A_A_A_A_A______________ ____________________AYAYAA_A_A_A_AAAAA_z_A_A_A_A________________ ____________________AYAJAA_A_A_A_AAJAAAA_A_A_A__________________ ____________________AYAYAA_A_A_A_AAYAA_L_A_A_A__________________ _____________________A_zAA_A_A_A_AAYAYAA_A_A____________________ _______________________A_A_A_A_____A_A_A_A______________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 64 (leprechaun) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ _____________I_I_G______________________________________________ _____________G_G_I_G____________________________________________ _________________G_I_G_________q________________________________ _____________________I_G_______q________________________________ _____________________G_I_____m_q_h______________________________ _______________________G_I___m_q_m______________________________ _________________________G_m_q_m_m_h____________________________ ___________________________I_q_m_m_h____________________________ _____________m_h_m_m______AqBNBNCrBN_____h_h_m_m________________ _________________m_h_m_m_m_m_q_m_h_m_h_h_m_m____________________ ___________________________m_m_m_m_m_m__________________________ ________________CnCnCnCnBNCTCTCTCnCnBNCnCnCn____________________ ____________________Cn__CTCT_ACnCn_ACnCT________________________ ________________________BNCTCTCnClClBN__________________________ _____________________m_q_mAqBNCTCTBoAq_m_m_q____________________ ___________________m_m_h_hAqAqAqBNAqBN_m_hCMCj__________________ __________________Cj_m___h_mBNAqBNAq_m_h__ByCMCj________________ ________________CjCMBy___h_h_mAqAqBN_h______ByCj_____A_A________ ________________CjBy_______h_m_mAq_m__CI____CnCT_A_A_A_A________ ________________CnCT_______h_h_m_m_hCIBSCfCfCTCT_A_A_A__________ ________________CTCT______BNBNBkBNBN__CICICfCf_A_A_A_A__________ _______________________h_h_h_m_l_m_m_hBvCICICf_A_A_A_A__________ _________________________h_m_m___h_m_m_hBvCI_A_A_A_A_A_A________ ________________________CPBkBk__BkBkCP_A_A_A_A_A_____A_A________ ______________________BoBoBN___A_ABNBNBo_A_A_A_________A_A______ ________________Bo______BNBo_A_A_ABNBo_A_A_A__Bo_________A______ ________________BNBo__AqBNBo_A_A_AAqBNBo_A__BNAq_A______________ _______________A_AAqAqBNBoBo_A___AAqAqAqBNBNAq_A_A______________ _________________A_A_A_A_A_A_A_____A_A_A_A_A_A_A________________ } # tile 65 (small mimic) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________BWBWBWBWBW______________________ ________________________AqAqAqBNBvBvBvBvBvBWBW_A________________ ______________________AqBNBNAqBNAqBWBWBWBWBvBvBv_A______________ ____________________AqBNBNBoBoAqAqAqAzAzAzAzBWBWAz_A____________ __________________AqBNBNBoBoBoBoCuAqAbAbAbAzAzBWBW_A_A__________ ________________AqBNBNBoBoBoBoCuCuCu_A_A_A_AAbAzBWAz_A__________ ______________AqBNBNBoBoBoBoCuCuCuAb_A_A_A_A_AAzBWAz_A__________ ______________BNAqBoBoBoBoCuCuCuAb_A_A_A_A_A_A_AAbAz_A__________ ______________AqAqBoBoBoCuCuCuAb_A_A_A_A_A_A_A_A_AAz_A__________ ______________AqAqAqBoCuCuCuAb_A_A_A_A___________AAb_A__________ _______________AAqAqBNBNCuAb_A_A_A_A_______________A____________ _______________ABWBvBvBWAz_A_A_A_A______________________________ _______________ABWBvBvBWAz_A_A_A________________________________ _______________AAzBvBvBWAz_A_A_A________________________________ _______________AAzBWBvBWAz_A_A_A________________________________ _________________ABWBvBvBWAz_A_A_A______________________________ _________________AAzBWBvBvBWAz_A_A______________________________ ___________________ABWBvC$AvC$Az_A______________________________ ___________________AAzBWAvAvAvAz_A______________________________ _____________________AAzC$AvC$Az_A______________________________ _______________________AAzAzAz_A_A______________________________ _________________________A_A_A_A________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 68 (wood nymph) { ________________________________________________________________ ________________________________________________________________ ____________________________CICICICI____________________________ __________________________CICICICICICI__________________________ __________________________ClClCnBWBWCICI________________________ __________________________BoClBoCiCIBWCICICI____________________ __________________________ClCXCiCiBsCIBWBWBWCICICI______________ __________________________CiClCnCiCIBWCICICICI____CICI__________ ______________________ClCXCuCiCiCuCBCIBWBW____CICI______________ ____________________CiClCuCuCnCuCuClClCICICICI____CICI__________ ____________________CXCuCuCuCuCuCuCnCXCl____CICICI______________ __________________ClCiCuCuCuCuCuCuCYCiCi__________CICI__________ ________________ClCn____CuCuCuCuCBCB__CiCl______________________ ________________CiCi____CBCBCuCuCBCB____CnCl____________________ ______________ClCi________CuCuCuCBCB____CiCi____________________ ____________ClCn__________CuCuCBCBCB______CiCl__________________ ____________Ci____________CuCuCBCBCI________Cn__________________ ________________________CBCIBWCIBWCuCuCBCB______________________ ________________________CBCuCBCuCuCBCBCuCBCBCBBWCB______________ ______________________CuCBCuCBCBCuCuCBCBCuCIBWCBCBCBBWBWCB______ ______________________CuCBCuCuCBCBCuCuBWBWCuCuCuCuCIAqAqAqAq____ ______________________CIBWCuCuCIBWBWCICuCBCuCuCuCIAqAqAqAqAq____ ____________________CuCuCBBWCICuCBCBCuCuCBCBCuCIAqAqAqAq________ ____________________CuCBCBCuCuCuCBCBCBCuCuCBBWAqAqAqAq__________ ____________________CuCBCBCBCuCuCBCBCBCBBWCIAqAqAq_____A_A_A_A__ ____________________CICICBCBCBCuCuCIBWBWAqAqAq_A_A_A_A_A_A_A_A__ ___________________A_A_ACIBWBWCICIBw_A_A_A_A_A_A_A_A_A_A_A_A_A__ _________________A_A_A_ACnCT_A_ABwCn_A_A_A_A_A_A_A_A_A_A_A_A____ _________________A_A_ACnCn_A_ACnCn_A_A_A_A_A_A_A_A_A_A_A________ _________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A____________ _________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A________________ ___________________A_A_A_A_A_A_A_A_A_A_A________________________ } # tile 69 (water nymph) { ________________________________________________________________ ________________________________________________________________ ____________________________CfCjCfCj____________________________ __________________________CfCjCfCjCfCf__________________________ __________________________ClClCnCfCICjCf________________________ __________________________BoClBoCiCfCfCfCjCf____________________ __________________________ClCXCiCiCcCjCcCICfCfCjCf______________ __________________________CiClCnCiCfCICjCfCjCf____CjCf__________ ______________________ClCX_KCiCi_K_ICfCfCI____CfCj______________ ____________________CiCl_K_KCn_K_KClClCfCfCfCj____CfCf__________ ____________________Cl_K_K_K_K_K_KCiClCl____CfCfCj______________ __________________CiCi_K_K_K_K_K_K_ICgCl__________CfCj__________ ________________ClCi_____K_K_K_K_I_I__CnCl______________________ ________________ClCn_____I_I_K_K_I_I____CiCl____________________ ______________ClCg_________K_K_K_I_I____CnCl____________________ ____________ClCn___________K_K_I_I_I______CgCl__________________ ____________Ci_____________K_K_I_ICf________Cn__________________ _________________________ICfCfCfCI_K_K_I_I______________________ _________________________I_K_I_K_K_I_I_K_I_I_ICI_I______________ _______________________K_I_K_I_I_K_K_I_I_KCfCI_I_I_ICICI_I______ _______________________K_I_K_K_I_I_K_KCICI_K_K_K_KCf_F_F_F_F____ ______________________CfCI_K_KCfCICICj_K_I_K_K_KCj_F_F_F_F_F____ _____________________K_K_ICICj_K_I_I_K_K_I_I_KCf_F_F_F_F________ _____________________K_I_I_K_K_K_I_I_I_K_K_ICf_F_F_F_F__________ _____________________K_I_I_I_K_K_I_I_I_ICICf_F_F_F_____A_A_A_A__ ____________________CfCj_I_I_I_K_KCfCICI_F_F_F_z_A_z_A_A_A_A_A__ ___________________A_z_zCfCfCICfCjCG_L_z_A_z_A_A_A_A_A_A_A_A_A__ _________________A_A_A_ACnCT_z_LCGCn_A_A_A_A_A_A_A_A_A_A_A_A____ _________________A_A_ACnCn_A_ACnCn_L_A_A_A_A_A_A_A_A_A_A________ _________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A____________ _________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A________________ ___________________A_A_A_A_A_A_A_A_A_A_A________________________ } # tile 70 (mountain nymph) { ________________________________________________________________ ________________________________________________________________ ____________________________CfCjCfCj____________________________ __________________________CfCjCfCjCfCf__________________________ __________________________ClClCnCfCICjCf________________________ __________________________BoClBoCiCfCfCfCjCf____________________ __________________________ClCXCiCiCcCjCcCICfCfCjCf______________ __________________________CiClCnCiCfCICjCfCjCf____CjCf__________ ______________________ClCX_nCiCi_n_iCfCfCI____CfCj______________ ____________________ClCi_n_nCn_n_nClClCfCfCfCj____CfCf__________ ____________________CX_n_n_n_n_n_nCiClCl____CfCfCj______________ __________________CiCi_n_n_n_n_n_n_iCgCl__________CfCj__________ ________________ClCi_____n_n_n_n_i_i__CnCl______________________ ________________ClCn_____i_i_n_n_i_i____CiCl____________________ ______________ClCg_________n_n_n_i_i____CnCl____________________ ____________ClCn___________n_n_i_i_i______CgCl__________________ ____________Ci_____________n_n_i_iCf________Cn__________________ _________________________iCfCfCfCI_n_n_i_i______________________ _________________________i_n_i_n_n_i_i_n_i_i_iCI_i______________ _______________________n_i_n_i_i_n_n_i_i_nCfCI_i_i_iCICI_i______ _______________________n_i_n_n_i_i_n_nCICI_n_n_n_nCf_Y_Y_Y_Y____ ______________________CfCI_n_nCfCICICj_n_i_n_n_nCj_Y_Y_Y_Y_Y____ _____________________n_n_iCICj_n_i_i_n_n_i_i_nCfAD_Y_Y_Y________ _____________________n_i_i_n_n_n_i_i_i_n_n_iCI_Y_Y_Y_Y__________ _____________________n_i_i_i_n_n_i_i_i_iCICfAD_Y_Y_____A_A_A_A__ ____________________CjCf_i_i_i_n_nCfCICI_Y_Y_Y_A_A_A_A_A_A_A_A__ ___________________A_z_zCjCcCICjCfCT_A_z_A_L_A_A_A_A_A_A_A_A_A__ _________________A_A_A_ACnCT_z_ACGCn_A_A_A_A_A_A_A_A_A_A_A_A____ _________________A_A_ACnCn_A_ACnCn_A_A_A_A_A_A_A_A_A_A_A________ _________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A____________ _________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A________________ ___________________A_A_A_A_A_A_A_A_A_A_A________________________ } # tile 71 (goblin) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________Bk______________________________ __________________________BDBDBkBDAeAe__________________________ ________________________BDBkBkBJAlAlAeAe________________________ ____________________BJBDBkBDAjAlAlAlAlAeAe______________________ ____________________AjBDBDBDBJAlBJAlAeAlAeAe____________________ ____________________BDBDBDAlAlAlAjAlAeAlAeAe____________________ __________________BDBdBdBdBDAlAlBJAlAeAlCb______________________ ________________BDBdBdBDBdBDBDAuCbCbAvAvBRBR____________________ __________________BdBDAXBDBDAvAvBRBRAvAXAX______________________ ______________________AXAXAXAXAvAvAvCECECE______________________ ____________________CbCE_zAXAXAXAvCECEAvAvAv________________CoCV ______________AXAXCbCECECE_L_zAXAXAXAXAXAvAv______________CoCVCP ____________CPBkBkBdCECECbCEAA_N_zCECbCECbCb___A_A_A_A_ACoCPCP__ __________CPBWBSBWBvBDBrCECbCECbCbCEBrBrAXAXAv_A_A_A_ACoCVCP____ ________BkBiBWBsBWBvBSBDCECbCECbCEBrCEBRAIAXAXAvBv_ACoCVCP_A_A__ ________BkCFBWBvBSBvBSBDCECbCECbCEBrBR___AAIAXAXAXBvCVCP_A_A_A__ ________BlBSBWBvBSBWBsBDBvBvCEAjBJBrBv___A_AAIAXBvBWBv_A_A_A____ ________BmBSBvBWBsBWBsBDBRBvBvBJAlBvBr_A_A_A_ABvBWAXAvBv_A_A____ ________CJBvBsBWBsBWBvBDBRCEBrCbCECEBrBR_A_A_ABWBWAIAX_A_A_A____ ________BlBvBSBvBWBsBvBDBRCEBrCbCECEBrBRBR_A_A_A_A_A_A_A_A_A____ __________BkBSBvBWBSBDBrBRBrCbCbCbCbCEBr_A_A_A_A_A_A_A_A_A_A____ ____________BmBkBkBd__AvAvAX_ACbCECEAv_A_A_A_A_A_A_A___A_A_A____ ______________________AvAvAX_A_AAXAvAv_A_A_A_A_A_A_A_____A_A____ ______________________AvAvAX_A_AAXAvAv_A_A_A_A_A_A______________ _____________________AAvAXAX_A_AAXAvAvAX_A_A_A_A________________ ___________________AAXAvAX_A_A_A_AAXAvAv_A_A_A_A________________ _________________AAvAvAvAX_A_A___AAXAXAvAv_A_A__________________ _________________AAXAXAX_A_A______AXAXAXAX_A____________________ _________________A_A_A_A_A_________A_A_A_A_A____________________ } # tile 72 (hobgoblin) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________________Aw__________________AY____________________ ______________________AwAw__BSBSBSAwAw__AYAY____________________ ______________________AwAAAwBSBSAwAwAwAwAAAY____________________ ________________________AwAABSCuCuAwCuCuAY______________________ ________________________AwAwBSAwAwAwAYAY________________________ __________________________AwBSAwAwAwAYAY________________________ ____________________________AwAw_A_A_A_A________________________ ________________________AwAYAAAYAYAYAYAYAYAY____________________ ____________________AwAwAwAwAw_zAAAAAAAAAYAYAY__________________ __________________AwAwAwAYAYAwAwAwAwAJAA_zAAAYAY________________ __________________AwAwAYAYAYAwAwAwAYAYAAAA__AAAYAY______________ ________________AwAwAY__AYAwAwAwAwAYAYAJAA_L__AAAY______________ ________________AwAYAY__AYAwAwAwAwAYAYAYAAAA___zAAAY___A_A_A____ ________________AwAY____AYAwAwAwAwAA_zAYAA_z____AAAY_A_A_A_A_A_A ________________AwAY____AYAwAwAwAwAAAAAYAAAA_____LAA_A_A_A_A_A_A ________________AwAY____BaAzBaAwAwAJAYAYAzAz____AAAA_A_A_A_A_A_A ________________AwAY____BaBaBaAzBaAzAgAzBWAg___A_A_A_A_A_A_A_A__ ______________________BaBaBaBWBaAgBWAzBWAgAzBW_A_A_A_A_A_A_A____ ______________________BaBaBaAgBaBWAzAgBaAzAgAz_A_A_A_A_A_A_A____ ______________________BaBaBaAzBaAzBaBWBaAzBWAz_N_A_A_A_A_A______ ______________________BaBaALBWBa__BaAzBaAgAz_L_A_A_A_A_A________ ________________________AwAwALBa__BaAbBaAYBW_A_A_A_A_A__________ ________________________AwAwAYAY____AYAYAYAY_A_A_A_A____________ ________________________AwAwAYAY___AAwAwAYAY_A_A_A_A____________ ________________________AwAwAYAY_A_AAwAwAYAY_A_A_A______________ ________________________AwAwAYAY_A_AAwAwAYAY_A_A________________ _______________________AAYAYAYAY_A_AAwAYAYAY_A__________________ _______________________A_A_A_A_A___A_A_A_A_A____________________ ________________________________________________________________ } # tile 73 (orc) { ________________________________________________________________ ________________________________________________________________ ____________________________________CnCn________________________ __________________CnCiCnCi________CnCn__________________________ ____________________CGCTCGCnCiCnCnCTCT__________________________ ______________________CnBzCnCiCnCnCnCTCT________________________ ______________________CiCnCiCnCiCiCnCnCT________________________ ______________________CnCi_$CjCiCnCnCj_A________________________ ______________________CiCnCi_z_zCiCo_zCT__Cm____________________ ______________________CiCnCiCiCnCmCmCnCTCmCm____________________ ______________________CnCiCuCuCoCmCuCuCmCm______________________ ________________________CnCiCnCnCnCnCTCTCT______________________ ________________________CiCnCnCnCnCnCTCTBw__________________CPCP __________________________CnCnCnCTCTCGBw__________________CPCPBd __________________BsAqBsAqAqCGBjCGBcAcATAqAq____________CPCPBd__ ______________AqAqAqAqAqAqBsAqAIBWAcAcATAqBsAqAq____BJCPCPBd____ ____________BsAqAqBsAqAqAqAqAqATAzAcAcATATATAqBsAqAqAjAlBd______ __________CTAqAqATATATAqBsAqCAAgAcAcAcAcATBSATATAqCTCTAeAe______ __________CTCTBSAq____ATAqATAzBWAcAcAcAc____ATATATCTCTCT_A______ __________CTCTAT______AgBWAzAQAzAcAcAcAc___A_A_AATCTCT_A_A_A____ ______________________AwAwAzAcAgAcAzAzAw_A_A_A_A_A_A_A_A_A_A____ ____________________BWAzAzAzAwAwAwAwAcAcAc_A_A_A_A_A_A_A_A_A____ ____________________AgAzAgBWAcAzAcBWAcAcAc_A_A_A_A_A_A_A_A_A____ __________________AzBWAzBWAzAcBWAQAzATAcAcAc_A_A_A_A_A_A_A______ ______________________AgAqAgAc_AAzAXATAT_A_A_A_A_A_A_A_A________ ______________________AwAqAc_A_A_AAqAwAT_A_A_A_A_A_A_A__________ _____________________AAqAqAT_A_A_AAwAqAT_A_A_A_A_A_A____________ _____________________LCGBjCGBw_A_LCGBjCGBw_A_A_A________________ _____________________ABjCGBbCG_L_ABjCGBbBw_A____________________ _______________________A_A_L_A_A___A_A_z_A______________________ ________________________________________________________________ ________________________________________________________________ } # tile 74 (hill orc) { ________________________________________________________________ ________________________________________________________________ ____________________________________CnCn________________________ __________________CnCiCnCi________CnCn__________________________ ____________________CGCTCGCnCiCnCnCTCT__________________________ ______________________CnBzCnCiCnCnCnCTCT________________________ ______________________CiCnCiCnCiCiCnCnCT________________________ ______________________CnCi_$CjCiCnCnCj_A________________________ ______________________CiCnCi_z_zCiCo_zCT__Cm____________________ ______________________CiCnCiCiCnCmCmCnCTCmCm____________________ ______________________CnCiCuCuCoCmCuCuCmCm______________________ ________________________CnCiCnCnCnCnCTCTCT______________________ ________________________CiCnCnCnCnCnCTCTBw__________________CPCP __________________________CnCnCnCTCTCGBw__________________CPCPBd __________________BsAqBsAqAqCGBjCGBcAcATAqAq____________CPCPBd__ ______________AqAqAqAqAqAqBsAqAIBWAcAcATAqBsAqAq____BJCPCPBd____ ____________BsAqAqBsAqAqAqAqAqATAzAcAcATATATAqBsAqAqAjAlBd______ __________CTAqAqATATATAqBsAqCAAgAcAcAcAcATBSATATAqCTCTAeAe______ __________CTCTBSAq____ATAqATAzBWAcAcAcAc____ATATATCTCTCT_A______ __________CTCTAT______AgBWAzAQAzAcAcAcAc___A_A_AATCTCT_A_A_A____ ______________________AwAwAzAcAgAcAzAzAw_A_A_A_A_A_A_A_A_A_A____ ____________________BWAzAzAzAwAwAwAwAcAcAc_A_A_A_A_A_A_A_A_A____ ____________________AgAzAgBWAcAzAcBWAcAcAc_A_A_A_A_A_A_A_A_A____ __________________AzBWAzBWAzAcBWAQAzATAcAcAc_A_A_A_A_A_A_A______ ______________________AgAqAgAc_AAzAXATAT_A_A_A_A_A_A_A_A________ ______________________AwAqAc_A_A_AAqAwAT_A_A_A_A_A_A_A__________ _____________________AAqAqAT_A_A_AAwAqAT_A_A_A_A_A_A____________ _____________________LCGBjCGBw_A_LCGBjCGBw_A_A_A________________ _____________________ABjCGBbCG_L_ABjCGBbBw_A____________________ _______________________A_A_L_A_A___A_A_z_A______________________ ________________________________________________________________ ________________________________________________________________ } # tile 75 (Mordor orc) { ________________________________________________________________ ________________________________________________________________ ____________________________________CTCT________________________ __________________CnCnCnCn________CTCT__________________________ ____________________BwCGBjCnCnCTCTBwCG__________________________ ______________________CnCGCnCnCnCTCTBjBj__________________Cm____ ______________________CTCnCnCnCnCnCGCTCG__________________Cm____ ______________________CTCn_LCfCnCnCTCj_A__________________Cm____ ______________________CTCTCn_z_ACnCl_zBw__Cl______________CmCP__ ______________________CTCnCTCnCnCOClCTCGCOCl______________CmCP__ ______________________CTCnCTCBCOClCBCBCOCl______________CmCmCP__ ________________________CTCnCTCnCTCTBcCGBj______________CmCmCP__ ________________________CTCTCTCTCTCTCGBzBV______________CmCPCP__ ____________AOAOABAB______CTCTCTCGBjBVBV________________CmCPCP__ __________AO_MAOAB_AABBNBdBdBVBVBVBVAlAeBNBN__________CmCmCP____ ________AOAOAOABABAB_M_MCmBdBdBVBVBJAeAeBNCFBNBN______CmCPCP____ _________MAOAOABAB_MAK_zBdBdBdAjAlBDAeAeAeBNBNBNBN____CmCPCP____ ______AOAOAOABCuAB_$_M_A_MBdBdBJBDAlAeAeAeCFBNBNBN__CmCPCP______ ______AOAOAOCuABCu_MAB_zABBdAlBDAlBDAeAeAeBNBNCFBNBJCmCP________ ______AO_MAOCuABCuAB_z_M_MBdBDAlBDAlAeAe____BNBNCnAjAl_A________ ______AOAOAOABCu_M_MAB_zABAlAeAeAeAeAOAOAe_A_ABNCTCnCT_A_A______ ________AOAOABABAB_$_M_ABNBNBDAlBJBNAeAeAeAe_A_ACnCT_A_A_A______ _________MAOABABAB_MAB_zBNCFAlBDAjBNBN_AAeAe_A_A_A_A_A_A_A_A____ ________AOAOAOABABAB_z_OBNBNBNAlBNBNCF_A_A_A_A_A_A_A_A_A_A______ __________AO_MABAB_AABBNCFBN_A_z_ABNBNBN_A_A_A_A_A_A_A_A________ ____________AOAOABABBNBNBN_A_A_A_ACFBNCF_A_A_A_A_A_A_A__________ ____________________BNCFBN_A_A_A_ABNCFBN_A_A_A_A_A_A____________ ____________________BNBNBN_A_A_A_ABNBNBN_A_A_A_A________________ ___________________ABwCGBjCG_L_A_ABwCGBjCG_A_A__________________ ___________________ABwBbCGBj_A_A_ABwBbCGBj_A____________________ _____________________A_z_A_A_A_A_A_A_z_A_A______________________ ________________________________________________________________ } # tile 76 (Uruk-hai) { ________________________________________________________________ ____________________________________CnCn________________________ __________________CnCnCnCn________CnCn__________________________ ____________________BVBVBVCnCnCTCTCGBw__________________________ ______________________CnBVCnCnCnCTCTBcCG________________AG______ ______________________CnCnCnCnCnCnCTCTBj______________BdAG______ ________________CB____CnCn_ACfCnCnCTCf_z______________BdAG______ ________________CB_A__CnCnCn_z_ACnCT_zBw____________Bd__AG______ ____________CB__CB_A__CnCnCnCnCnClCTCTBwCl__________Bd__AG______ ____________CB_A___A__CnCnCnCuClClCuCuClCl________Bd____AG______ ____________CB_A___A____CnCnCTCTCTCTBwCGBb________Bd____AG______ _______________A___A____CTCTCTCTCTCTBbBwBV______Bd______AG______ __________AlAeAeAeAO____AlAlBwCTCGBwAlBJ________Bd______AG______ ________AlAlAeAeAeAOAOAlAeAlAeBJAeAlAeAeAO____Bd______AGAG______ ______AlAlAeAeAeAOAOAOAlBdBJBdAjAlAlBJAOAlCTCTBd______AGAG______ ______AlAlAeAeAeAOAOAOAOAlAeBJAeAlAeAlAeAeCTBdCT______AG________ ____AlAlAlCmCPAOAOAOAOAOAlBdAjBdAlBJAlAjAOBwBdCTCTCTAGAG________ ____AlAlAlCmCPCPAOAOAOAOAeAlAeAlAeAlAeAO__BjBjCGBwCTAGCT________ ____AlAlAlCmCPCPAOAOAOAOBdBDBdAeAlAeBJAO__Bd____BbATAGCT________ ____AlAlAlCmCPAOAOAOAOAOATATAlBDAlAlATAGBd______ATAGBw_A_A_A_A__ ____AlAlAlAeAeAOAOAOAOATATATATAwAwATATAGBd____AGAGAG_A_A_A_A_A__ ____AlAlAlAeAeAeAOAOAOAOBJBdATAwAwATAOAeBJ__AGAGAG_A_A_A_A_A_A__ ______AlAlAlAeAeAOAOAOAlAlAjAeAlAeAlAlAOAeAGAG_A_A_A_A_A_A_A____ ______AlAlAlAeAeAeAOAOAeBdBJBdAOAlAlAeAlAlAG_A_A_A_A_A_A_A______ ________AlAlAeAeAeAO__BVAlAlAe__AlAeBJAe_A_A_A_A_A_A_A_A_A______ __________AeAeAeAe____BwBVBXBV____BwBVBV_A_A_A_A_A_A_A_A________ ______________________CGBjBVBV___ABwBtBV_A_A_A_A_A_A____________ ______________________AlBJAlAe_A_ABJAlAe_A_A_A_A_A______________ ______________________BJAlAlAe_A_AAjAlAeAl_A_A_A_A______________ ___________________ABDBDAlAeAe_A_AAeAlAjBJ_A_A_A_A______________ ___________________AAlAlAlAe_A_A_A_AAeAeAe_A_A_A________________ ___________________A_A_A_A_A_A_A_A_A_A_A_A_A_A__________________ } # tile 77 (orc shaman) { ________________________________________________________________ ________________________________________________________________ ____________________________________CnCn________________________ __________________CnCiCnCi________CnCn__________________________ ____________________CGCTCGCnCiCnCnCTCT__________________________ ______________________CnBzCnCiCnCnCnCTCT________________________ ______________________CiCnCiCnCiCiCnCnCT________________________ ______________________CnCi_$CjCiCnCnCj_A________________________ ______________________CiCnCi_z_zCiCn_zCT________________________ ______________________CnCiCiCnCiCmCmCnCTCmCm____________________ ______________________CiCnCuCuCmCmCuCuCmCm______________________ ________________________CiCnCnCnCnCnCTCTCT______________________ ________________________CnCnCnCnCnCnCTCTBw______________________ __________________________CnCnCnCTCTBjCG________________________ ____________________CBCBCYAwCYBwCGBzCBAwCBBoCB__________________ ________________CBCBCYCYCBAwCBCBCBCBBoAwBoCBBoCBCB______________ ____________CBCBCYCYCBCYCYCBAwBoCBBoAwBoBoBoBoBoAqBNCT__________ __________CTCTBNCYCYCYCBCYCBAwCPCPCPAwBNBoBoBoBoCFCTCTCT________ __________CTCTCFBNCBCYCBCYBoCPCPCPBkBkAqBNBoBoBo_ACTCTCT_A______ __________CTCTBNBNCYCBCYCBCPCP_ACP_LBlBJAqBNBoBo_A_A_A_A_A_A____ ____________BoBNBNCBCBCBCBCP_A_ABk_A_ABJAqBNBN_A_A_A_A_A_A_A____ ______________BNBNBNCBCBBoBkCPCPBkBdBJAjAqBNBN_A_A_A_A_A_A_A____ ______________BNBNBNCBCBBoBNBdBdBdBDAlAqBNBNBN_A_A_A_A_A_A_A____ ______________BNBNBNBNCBBoBoAqBdAqBdAqBNBNBN_A_A_A_A_A_A_A______ ________________BNBNBNCBCBBoBoAqAqAqBNBNBNBN_A_A_A_A_A_A________ ________________BNBNBNAqCBCBBoBoBoBoBNBoBN_A_A_A_A_A_A__________ __________________BN_AAqCFCBBoCBBoBoBoBo_A_A_A_A_A_A____________ ___________________A_AAqAqAqBoCB_ABoBoAq_A_A_A_A_A______________ ___________________A_ABwCGBjCGCB_ABwCGBjCG_A_A__________________ _____________________ABwBbCGBj_A_ABwBbCGBj_A____________________ _____________________A_A_z_A_A_A_A_A_z_A_A______________________ ________________________________________________________________ } # tile 78 (orc-captain) { ________________________________CnCn____________________________ ______________CnCiCnCi________CnCn______________________________ ________________CGCTCGCnCiCnCnCTCT______________________________ __________________CnBzCnCiCnCnCnCTCT____________________________ __________________CiCnCiCnCiCiCnCnCT____________________________ __________________CnCi_$CjCiCnCnCj_A______________________Cm____ __________________CiCnCi_z_zCoCn_zCT__Cm__________________Cm____ __________________CnCiCiCnCiCmCnCnCTCmCm__________________Cm____ __________________CiCnCuCuCmCmCuCuCmCm____________________CmCP__ ____________________CiCiCnCnCnCnCTCTCT____________________CmCP__ ____________________CTCnCnCnCnCnCTCTBw__________________CmCmCP__ AO_______________M____CnCnCnCTCTCGBw____AlBJAeAeAe______CmCmCP__ AOAOAO_______MAA_MBNBJBdBwCGBzBwBbBJAeBJAjBJAjAeAeAeAe__CmCPCP__ AOAOAOABABAB_MA__MBJBdBdCPBdBdAlBJAeAeBdBdAlBJAlBJ_A_A__CmCPCP__ AOAOAOABABABAA_MA_AjBdCPBdBJAlBDAeAeAeAeBdBdBD_A_B____CmCmCP____ AOAOAOABABABAB_z_MBJBdCPBdAlBDAlAeAeAeAeBdCFBNBN______CmCPCP____ AOAOAOABABAB_M_MAKAlBdCPBdBDAlBDAeAeAeAeBNBNBNBNBN____CmCPCP____ AOAOAOABABABAB_z_MBDBdBdBdAlCjCMAeAeAeAe_ABNBNCFBN__CmCPCP______ AOAOAOABABAB_M_zAB_zATBdBdCjCMCMCMAe_$_$____BNBNBNBJCmCP________ AOAOAOABABAB_zAB_MAwAwATATATCMCMATATAwAwAw_A_ACFCTAjAl_A________ AOAOAOABABAB_M_M_$AwAwBSBSBSBSBSBSBSAwAwAw_A_ABNCTCTCT_A_A______ AOAOAOABABAB_MAK_OAwAwBSBSAwBSBSBSBSAwAwAw_A_A_ACTCT_A_A_A______ AOAOAOABABAB_z_M_zAwBNBSBSAwBSBSBNATAwBNAw_A_A_A_A_A_A_A________ AOAOAOABABABAB_MABBNCFBN_AAwBS_ACFBNAwBN_A_A_A_A_A_A_A__________ AOAOAOABABAB_M_$_MBNBNBN_ABS_A_ABNBNBNBN_A_A_A_A_A_A____________ AOAOAOABABAB_zAB_MBNBNBN_A_A_A_ABNBNBNCF_A_A_A_A_A______________ __AOAOABABAB_O_zBNCFBNBN_A_A_A_ABNCFBNBN_A_A_A_A_A______________ ______ABABAB_z_ABNBNBNCF_A_A_A_ABNBNBNBN_A_A_A_A________________ _____________A_ABwCGBjCGBj_A_A_ABwCGBjCGBj_A_A__________________ _____________A_LBtBzCGBcCG_A_A_ABwBbCGBcCG_A____________________ _______________A_A_A_A_A_L_____A_A_z_L_A_A______________________ ________________________________________________________________ } # tile 79 (rock piercer) { ________________________________________________________________ ________________________________________________________________ __BsBs__________________________________________________________ ___AAwBsBsBs____________________________________________________ ___AAwAwBSBsBs__________________________________________________ ___A_AAwBSBSBsBs________________________________________________ _____AAYAwBSBSBsBsBs____________________________________________ _____A_AAYAwBSBSBSBsBs__________________COBj____________COBj____ _______A_AAYAwBSBSBSBsBsBs____________COBkCo__________COCOCo____ _________A_AAwAwBSBSBSBsBSBsBs________COCmCu__________COCmCu____ ___________A_AAYAwBSBSBSBsBSBsBsBs____Bj____________BjBm________ _____________AAYAYAwAwBSBsBsBSBSBsBSCTBm____________CT__________ _____________A_AAYAYBSBSBSBSBsBSBsBsBLAY____________BL__________ _______________AAYAYAwAwBSBSBsBsBSBSCTBsBsBs________CT__________ _______________A_AAYAwBSAwBSBSBsBsBSBLBsBsBsBs______BL__________ _______________A_AAYAYAwBSAwBSBSBsBSCTBsBSBSBSAYAY__CO__________ _________________A_AAYAwBSBSAwBSBSBsBmBjBiAYAYAYAYBjBj__________ _________________A_AAYAYAwBSAwAwBSBSAYCOBjAYCOCOCTBmAbAY________ ___________________A_AAYAwAwBSAwBSAYAYAJCOCOCOCOCOBjAYAY________ _____________________A_AAYAwAwBSAYAYAbBkCOCOCOBkCOCOAYAYAY______ _______________________A_AAYAwAwAYAYCOCOBzCOBmCOCOCOCOAYAY_A____ _________________________AAYAwAwAYAYCOBkBjCOBjCOCNBjCOAY_A_A____ _________________________A_AAwAwAYBjCOCNBcCOBcCOBcBkCOCO_A______ ___________________________AAYAwAbCOCOBkBcCOBcBkCOBjBzCOCOCO____ ___________________________AAYAwAYCOBjBjBcBzBjBzCOBcBcBkBzCO____ ___________________________A_AAwCOCOCNBcBkCOCOBcCOCOBmBcBjCOCO__ _____________________________AAwBjBmBcBcBzCOCOBcBkCOCOBcBcBkBc_A _______________________________A_z_A_ABcCOBkCOBcBcCTCOCOBz_A_A_A _________________________________A_A_ABcBcBjCOBmBcBcBjCOBm_z_A_A ___________________________________A_ABcBcCOCOBzBcBcCOCOCOBj_A_A _____________________________________A_A_ABjBj_M_ABcBcBcBj_M_z__ _________________________________________A_L_z_A_A_A_A_A_z_A____ } # tile 80 (iron piercer) { ________________________________________________________________ ________________________________________________________________ __BkBk__________________________________________________________ ___ABDCJBnBk____________________________________________________ ___AAjBJBdBkCP__________________________________________________ ___A_AAlBdBkBkBk________________________________________________ _____AAeBDBdBdCPBkBk____________________________________________ _____A_AAeAlBdBdBdCPBk__________________COBj____________COBj____ _______A_AAeBJBdBdBdBkCPBk____________COBkCo__________COCOCo____ _________A_ABDAlBdBdBdBkBdBnBk________COCmCu__________COCmCu____ ___________A_AAeBDBdBdBdCJBdCJBnBk____Bj____________BjBm________ _____________AAeAeAlBJBdBnBkBdBdCJBdBjCO____________CT__________ _____________A_AAeAeBdBdBdBdBkBkBMCOBkAe____________BL__________ _______________AAeAeBDAlBdBdCPBkBdBdBLCJBmBk________CT__________ _______________A_AAeAlBkBJBdBdBkCPBdCTBMCKBmCK______BL__________ _______________A_AAeAeAjBdAlBdBdBkBdBmBkBdBdBdAeAe__CO__________ _________________A_AAeBJBdBdBDBdBdBkCTBmBdAeAeAeAeBjBj__________ _________________A_AAeAeAjBdAlBJBdBdAECTBjAeCOCOBzBmAeAe________ ___________________A_AAeBJAlBkAjBdAeAeAeCOCOCOCOCOCJAeAe________ _____________________A_AAeBDAlBdAeAeAeBmCOCOCOBjCOCOAeAeAe______ _______________________A_AAeBJBDAeAeCOCOBjCOBmCOCOCOCOAeAe_A____ _________________________AAeAjAlAeAeCOBzBjCOBzCOCOBjCOAe_A_A____ _________________________A_ABJAlAeBkCOBkBcCOBjCOBcBjCOCO_A______ ___________________________AAeBDAeCOCOCNBcCOBcBjCOBcBmCOCOCO____ ___________________________AAeAlAeCOBjBcBcBkBcCNCOBcBcBjCOCO____ ___________________________A_ABDCOCOCOBdBzCOCOBcCOCOBzBcBJCOCO__ _____________________________AAlBkBzBcBcBkCOCOBcBkCOCOBjBcBjBc_A _______________________________L_z_B_ABcCNBjCOBcBzBkCOCOBj_L_A_A _________________________________A_A_ABcBcBkCOBjBcBcBzCWBj_L_A_A ___________________________________A_ABcBjBzCOCOBcBcBkCOCOBk_A_A _____________________________________A_A_ABkBz_A_ABcBcBcCN_A_A__ _________________________________________A_L_B_A_A_A_A_A_A_A____ } # tile 81 (glass piercer) { ________________________________________________________________ ________________________________________________________________ __CVBI__________________________________________________________ ____CQ__BnBl____________________________________________________ __BnBICQCQCQBl__________________________________________________ ____CJ__CR__CQBn________________________________________________ ____BFBn__Bh__BnA$BI____________________________________________ ______BnBn__Bh__CQBIAp__________________CVCP____________CPBk____ ______ApBnAp__BI__BnBI__BI____________CVCPCV__________CVCPCo____ ________BM__Ap__BI__CQBI____Bn________CVCmAf__________CVCmAf____ __________BM__Ap__BI__CQBI_s__BIBl____CP____________CPCP________ ______________BIAp__BI__CQCQBl____BlBnCP____________CV__________ ____________BD__BnBl__BI____CQCQCQ__CJAf____________CP__________ ______________BF__BMAm__BICV__CQCQBlCPCQ__Bl________CP__________ ________________BM__BKAp__ApCQ__CQBKCVCQBl__CQBl____CP__________ ________________BM__BDBKAp__ApBI__BKCPCQBKBKBK__Af__Bk__________ __________________BF__BlBlAp__ApBK__BkCOBKAfAfAfAfBkCP__________ __________________ApBI__BlBlAi__BKBKAfBlBkAfCPCPCPBkAfAf________ ____________________BkAp__BKBKAmBKAfAfAfCPCVCVCVCVCPAfAf________ ______________________Bn__BKAmBKAfAfAfBkCPCVCV__CVCVBlAfAf______ ________________________BF___jAiAfAfCPCVBkCVCPCVCPCVCVAfAf______ __________________________AS__AiAfAfCVBk__CPCVCm__CPCPAf________ ____________________________Am__AfCPCVBkBkCPCPCVBkBkCPCP________ ____________________________Af__AfCmCoBk__CPBkCPCV__CPCPCPCP____ ____________________________AfAm__CPCPBdBdBk__CPCVBkBk__BkCP____ ______________________________AmCPCPBk__BkCVCmBkCVCVCPBn__CPCP__ ______________________________AmBkCPBdBdCPCVCV__CPCVCVCPBkCJBd__ ______________________________________BdBkCPCVBdBkCPCVCVCP______ ______________________________________BdBdCPCVBk__CPCPCPBk______ ______________________________________BdBDCPCPBkBdBkCPCV__Bk____ __________________________________________BkBk____BdBd__Bk______ ________________________________________________________________ } # tile 82 (rothe) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________________________________CFCcCFCc____________ ________________________________________CcCFCcCFBsBsBsBsBs______ ____________________________________CFCcCFCFCFCFBsCcBsCcCFBs____ __________________________________CcCcCFCcCFBsBsCcBsBsBsBSCFBs__ ________________CFAwCFAw________CcCFCFCFCFCcCFCcBsBsCFBs__CFBs__ ____________BsAwBsAwAwBsCFAwBsCcCFCFCFCcCFBsBsCFCcCFBsBsBsBZCF__ __________AwAZCFAwAwCFAwAwBsAYBsCcCFCcCFBsCFCcBsBsBsCcCFCc__CFAB ______C$CmBsAwBsAwCFAwAYCFAXBsAZCcCcCFCcCFBsCFCcBsCcBsCFCc__CFAB ____C$CmCmAwCmAwBsAwCFBsAXCFAXCFCFCcCFBsCcCFBsCFBsCFBsCFABABCFAB ____C$CFCcC$CmCmBWAZBsAXAvAZCFCcCFBsCcCFBsCcBsCcBsBsBsBsABABABAB ____CcCcCFCFC$CmCPAwCFBsCFCcBsCFBsCFBsCcBsBsCFBsBsCcBsCcABABABAB ____CcCFCjCjCFC$CPCFBsBsCFBsCcBsBsCcBsBsCFBsCFBsCFBsCFBkABABABAB __CcCcCFCFBsCFC$CIBsCFBsCcCFBsBsCFBsCcBsCFBsCFBsCFCcBkCPABABAB__ __CcCcCFBsBsBVC$CmCcBsBsBsBsCcBsCcBsCcBsCcBsCcBsCcABCPBkAB______ __CFABBsBsBsCcABCcCcCFBsBsCFCFBsBsCcBsCcBsCFBsCFABABCPBkCJ______ ____BsBs__CPCPBsCFCFCcBsCcBsCFCFBsCcBsCcBsCcBsABABABABCVBm______ ______CL__C$C$BsCzBsBsCFBsBsCFBsBsCFBsBsCFCcBsABABAB__CPBk______ ____________BsCFBsCcBsBsCFBsCFCcBsBsBsBsABABABABAB____CjCj______ ____________CzCFCzCFBsBsBsCcBsBsBkCcABABABABAB__________________ ______________BsCFCFBsCFBsCcBsBkCVBkABABABAB____________________ ______________ABCzBkCFCFBsABAB__CPCPABAB________________________ ______________ABCPBnABABAB____CPCPBk____________________________ ______________CPCPCJ__________CjCO______________________________ ______________CPBk______________________________________________ ____________CjCP________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 83 (mumak) { ______________BsBS__________________________________BS__________ ______________BsBSAw______________________________BSBSBS________ ______________BsBSBS________________________________BSBSBS______ ____________BsBsBSAw__________________________________BSBS______ ____________BsBSBSBS____________________________________BS______ ____________BsBSAw______________________________________BS______ __________BsBsBS________________________________________BS______ ________BsBsBSAw____________________BSBSBSBSAwAw______BSBS______ ________BsBSBS______BSBSBS________BSBSBSAwAwBSAwAw__AwBS________ ________BsBSAw____BSBSBSBSBSBSAwBSBsBSAwBSBSAwBSAwAwAw__________ ________BsBSBS__BSBSBSBSBSAwBSAwAwAwAwBSAwBSAwBSAwAwAw__________ ________BsBS__BSBSBSBSBSBSAwAwBSBSBSBSBSAwBSBSAwAwAwAw__________ ________BsBS__BSBSBSBSBSCYAwBSBSBSBSBSBSBSAwAwBSAwAwAwAw________ ________BsBSAwBSBSBSBSCYCYAwBSBSBSBSBSBSBSBSAwBSAwBSAwAwAw______ ________BsBsBSBSBSBSBSCYBSBSBSBSBSBSBSAwBSBSAwBSBSBSBSAwAw______ __________BsBSBSBSBSBSBSBSBSBSBSBSAwBSBSBSBSAwAwBSBSAwAwAwAw____ __________BsBSBSBSAwBSBSAwBSBSBSBSBSBSBSBSBSAwAwAwBSAwAwAwAw____ __________CmAwAwAwCYCYCmCPAwAwAwAwBSBSBSBSAwAwAwBSBSBSAwAwAw____ ________CmCmCPCPAwAwCYCmCPBSAwAwAwAwAwAwAwAwAwAwBSAwAwAwAwAw____ ______CmCmCPCPBSBSAwCmCmCPAwAwBSAwBSAwAwAwAw____AwAwBSAwAwAw____ ____CmCmCPCP__AwAwAwCmCPCPAwAwAwBSBSBSAwAwAw____BSAwBSAwAwAw____ CmCmCmCPCP____BSBSCmCPCPAwAwAwBSAwAwBSAwAwAw____AwBSAwBSAwAw____ CPCPCPCP______CmCmCPCPAwAw__AwAwBSAwBSAwAwAw____BSBSAwAwAwAw____ ______________CPCPCPAwAw______BSAwAwAwAwAwAw____AwBSAwBSAwAw____ ____________BSBSBSAwAwAw_A_A_ABSAwAwAwAwAwAwAw_ABSAwBSBSAwAw_A__ ___________AAwAwAwAwAwAw_A_A_AAwAwBSAwAwAwAwAw_AAwAwBSAwAwAw_A_A _________A_ABSBSBSAwAwAw_A_A_ABSBSBSAwAwAwAw_A_ABSBSAwAwAwAw_A_A _______A_A_ABSAwBSAwAw_A_A_A_AAwBSAwBSBSAwAw_A_A_ABSBSAw_A_A_A_A _______A_A_A_A_A_A_A_A_A_A_A_ABSAwAwAwAwAw_A_A_A_A_A_A_A_A_A_A__ _________A_A_A_A_A_A_A_A_A_A_A_ABSBSBS_A_A_A_A_A_A_A_A_A_A______ ___________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A________ _____________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A____________ } # tile 84 (leocrotta) { ________________________________________________________________ ________________________________________________________________ ______CmCmCmAOAOAO______AOAO____________________________________ ______CmCmCmAOAOAOAOAOAOAO________________CMByBy________________ ______CPCmCmCmCmAO_sAOAO________________CM______________________ ________CPCmCmCmCmAOAOAOAO________________CM____________________ __________CPCPCmCmCmCmB_AO__________________CMCM________________ ______________CPCPCPCmB_AOAO____________________CM______________ ________________ByByB_AzB_Az______________________CM____________ ______________ByByCMB_AzB_Az________________________CM__________ ____________ByCMCMCMCMAzB_Az__________________________CM________ ____________CMByCMByCMAzAzB_B_Az____________________CM__________ ____________ByCMByCMByAzB_AzB_B_Az__________________CM__________ ____________CMByCMByCMAzAzB_AzB_B___________B_AzB_Az____________ ________BZBZByCMByCMByAzAzB_B_AzB_AzAzAzAzAzB_B_AzAz____________ ______BZB_B_ByCMCMByAzAzAzB_B_AzAzB_AzAzAzB_B_AzB_Az____________ ______B_AzAzByByByByAzAzAzB_AzB_AzB_B_B_AzB_AzB_AzB_Az__________ ______CLBZ____ByByByAzAzAzAzB_B_B_B_AzB_B_AzAzAzB_AzB_Az________ ______BbBZ______ByByB_B_AzB_B_AzB_AzB_AzB_AzAzAzB_AzB_Az________ ______CLBZ________ByB_B_B_B_AzAzAzAzAbB_AzAzAzAzAzB_Az__________ ______BvBZ__________AzB_B_Az____AzAzAzAbAzAzAzAzB_B_Az__________ ________CLBZ________B_AzAz________AzAzAzAbAbAzAzB_Az____________ __________BbBkAO____B_B_Az__________AbAzAbAbAbAzAzAz____________ ____________BkBk____CLBJ______________AbAbAb__BZAz______________ __________________BbBZ___A_A__________CLBZ____CL________________ ________________CLBZ_A_A_A__________BbBZ______Bb________________ ___________A_ACLB__A_A_A__________CLBvBZ____CLBW________________ _______A_A_ABkBk_A_A_A_A_A_A_A_A_ABZBZ_A_zBbBZ_A_A_A_A_A_A______ _____A_A_A_AAOBk_A_A_A_A_A_A_A_ABkBk_A_ABkBZ_z_A_A_A_A_A________ _______A_A_A_A_A_A_A_A_A_A_A_A_AAOBk_ABkAOBk_A_A_A_A_A__________ ___________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A______________ ________________________________________________________________ } # tile 85 (wumpus) { ________________________________________________________________ ________________________________________________________________ ______________________BvBvBvBvBvBvBvBvBvBv______________________ ____________________Bv_cBWBWBWBWBWBWBWBWBWBv____________________ __________________Bv_c_T__________________BWBv__________________ __________________BWBW______________________BWBv________________ ________________Bv__________BvBvBv_c_cAzBWBv_X_T________________ ______AzAzBvBvBvBW______BvBvBvBv_cAzBWBvBv_c_c_X_T______________ ____AzAzAzBWBWBW____BvBvBvBR_X_cBvBvBvBWBvBvBv_c_X_T____________ ____Az____________BvAzBWBRBRBR_XBWBvBvBvBvBvBvBv_c_X____________ ________________Bv_c_c_c_c_T_c_cBvBvBvBv_cBvBvBvBvBWBW__________ ______________Bv_XBvBvBvBvBv_X_cBv_cBvBvBv_c_XBWBvBvBWBW________ ____________BvBvBv_XBvBvAzBWBv_c_cBvAzBWBv_c_cBWBWBvBvBW________ __________Bv_c_cBvBvBvBvBvBvBWBv_X_cBvBvBW_c_cBWBWBvBvBWBW______ ____BWBWBy_c_cBa_cBvAz_TBv_cBv_c_cBvCs_c_cCsBvBWBWBvBvBvBW______ BWBWBWBW_cBa_T_c_cBy_cBv_TBv_c_c_c_cCs_cCs_c_XBWBWBvBvBvBW______ AzAzBW_T_c_c_X_c_XByBv_cBvBvBv_c_c_c_c_c_X_c_cBWBW_ABvBvBW_A____ __BWBvBvBvBvBvBvBvAzBWBvBvBvBvBvBvBWBvBW_X_XBWAzAz_A_ABvBv_A_A__ __BWBWBvBvAzBWBvBvBvBvBWBvAzBWBvBWBWBWBWBWBWBWAz_A_ABWAzBvBW_A_A __BvBvBWBvBvBvBWBvBvBvBvBvBvBvBvBvBWBWBWBW_A_A_ABWBWAzAzBvAzBW_A __BkBoBvBWBWBWBvBvBvBvBvBvBWBWBWBvBvBvBWBW_A_A_A_AAzAzAzBvAzAzBW __BoBoBkBvBvBvBWBWBWBWBWBWBvBvBvBvBvBvBWBWBW_A_A_A_AAzBvAzAz_A_A __BkBoBoBoBkBnBvBvBvBvBvBvBkBoBkBvBvBWBvBWBWBW_A_A_A_ABv_A_A_A__ __BvBvCPBoBoBoCJBoBkBoBkBoBoBoBoBvBv_ABvBvBWBW_A_A_A_A_A_A_A____ ___A_ABvBoBkBoBoBoBoBoBoBoCPBoBkBvBvBWBvBvBWBW_A_A_A_A_A_A_A____ ___A_A_ABvBvBvBkBoCPBoBkBoBvBvBv_ABWAzBWBvBWAzBW_A_A_A_A_A______ _____A_A_A_A_MBvBvBvBvBvBvBv_ABWBWAzAzAzBvAzAzAzBW_A_A__________ _______A_A_A_A_A_A_A_A_A_A_A_A_AAzAzAzAzBvAzAzAzAzBW_A__________ _________A_A_A_A_A_A_A_A_A_A_A_A_A_AAzAzBvAz_A_A_A_A_A__________ _________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A__________________ ________________________________________________________________ ________________________________________________________________ } # tile 86 (titanothere) { ________________________________________________________________ ________________BkBkBkBDBD______________________________________ ____________BkCPBkBkBDBkBkBkBkBk________________________CP______ __________CPBkBkBkBDBkBkBkCPBkBkBkBkBkBkBkBkBkBkBk________CP____ ________BkBkCPBkBkBDBkBkCPBkBkCPBkBkCPBdBkBkBkBkBkBkBk____CP____ ______BkCPBkBkBkBkBkBkCPBkBkBDBkBkCPBkBkCPBkBkCPBkCPBkBdCP______ ____BkCPBdBkBkBkBkBDBkBkBkCPAlBDBkBkBkCPBkBkCPBkBkBkCPBkBk______ __BkBkBDAlBkBkBkBDBkBkBkCPBDAlAlBdBkCPBkBkCPBkBkCPBkBkCPBkBk____ BDBkBkBDBDAlBkBkBkBkBkCPBDBDAlAlBDBkBkCPBkBkCPBkBkCPBkBkBkCPBd__ BDBkAlAlBDBdAlBkBkBkBkBDBDBDAlBDBkCPBkBkCPBkBkCPBkBkCPBkCPBkBkAl BDBDBkAlBDBDAlAlBkBkBkBkBkAlAlBDBkBkCPBkBkBkBkBkCPBkBkBkBkCPBkAl BDBDBDBkBDBkBkBkBkBkBkBkBkBkAlBDBkBkBkCPBkBkBkBkBkBnCJBnCJBkBkAl BDBDBDBkBkBkBkBkBkBkBkBkBkBkBkAlBkBkBkBkCPBkBkBkBDBkBkCPBkBnBkAl BDBDBDBDBkBkBkBkBkBkBkBkBkBkBkAlBkBkBkBkBkBkBkBkBDBkBkBkCJBkBkAl BDBDBDBkBkBkBkBkBkBkBkBkBkBkBkBkAlBkBkBkCPBkBkBDBDBkBkBkBnCJBDAl BDBDBDBkBkBkBkBkBkBkBkBkBkBkBDBkAlBkBkBkBkBDBDBDBDBkBkBkBkBkBDAl BDBDBDBkBkBkBkBkBkBkBkBkBkBDCPBDAlBkCPBkBDBDBDBDAlBkBkBkBkBkBDAl BDBDBDBkBkBkBkBkBkBkBkBDBdBkCPBDAlBkCPBDBDBDBDAlAlBkBkBkBkBkBDAl BDBDAlBDBkBk_FBkBkBkBDCPBkCPAlAlCPCPAlBDBDAlAlAlAlBkBkBkBkBDBDAl BDBDAlBDBkBkBkBkBkBdBkCPBkBkAlBkCPBdAlAlAlAlAlAlAOBkBkBDBDBDBDAl BDBDAlBDBkBkBkBkBkCPBkBkBkBkAlCPBkBkAlAlAlAOAOAOAOBDBDBDBDBDBDAl BDBDAlBDBDBkBkBkBkBkBkBkBkAlAlBkBkBkAlAOAOAlAOAOAOBDBDBDBDBDBDAl BDBDBDAlBDBkBkBkBkBkBkBkBkAlBkBkBkAlAOAlAlAlAlAOAOBDBDBDBDBDBDAl __AlBDBDAlBDBDBkBkBkBkAlAlBkBkAlAl_A_AAlAlAlAlAOAOBDBDBDBDBDAl_A __AlBDBDAlAlAlBDBDBkBkBkBkBkBkBkBk_A_AAlAlAlAOAOAOBDBDBDBDAlAl_A __AlBDBDAlAl_AAlAlBkBkBkBkBkBkBkBk_AAlAlAlAOAOAOAOBDBDBDAlAlAO_A __AlAlBDBDAl_A_AAlAlBkBkBkBkBkBkAl_AAOBJAjAOBJAlAlBDBDAlAlAOAO_A __AlAlBDBDAl_A_AAlAlAlAlAlAlAlAl_A_A_A_A_A_A_B_AAlAjBJAlAjBJAl_A AlAlBDBDAlAl_AAlAlBDBDAlAlAlAO_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A AlAlBDAlAl_A_AAlAlBDBDBDAlAO_A_A_A_A_A_A_______A_A_A_A_A_A______ AlBJAlAlBD_A_ABdAlBdBdAlBdBd_A_A_A_A___________A_A_A_A__________ ___A_A_A_A_A_____A_A_A_A_A_A_A_A________________________________ } # tile 87 (baluchitherium) { ________________________________________________________________ ______________________________BkBkBDBkBkBk______________________ ____________________________BkBDBDBkBkBkBkBkBkBkBk______________ __________BD____________BkBkBDCPBkBkBkBkBkBdCPBkBkBk____________ __________BD__________BkBkBDBkBkCPBkCPBdBkCPBkBkCPBkBk__________ __________BDBD____BkBkBkBDCPBkAlAlAlBkCPBkBkCPBkBkCPBkBk________ __________BDBDBkBkBkBkBDBkBdAlCPAlBkBkBkCPBkBkCPBkBkCPBkBk______ __________BDBkBkBkBkBkBkBkAlCPAlCPBkCPBkBkCPBkBkCPBkBkCPBkBk____ ________BDBkBkBkBkBkBkBkBkBkCPAlBkBkCPBkCPBkBkCPBkBkCPBkBkBk____ ________BkBkBkBkBkBkBkBkBkBkBdBkBkCPBkBkBkCPBkBkBkCPBkBkCPBkBk__ ______BDBkBkBkBkBkBkBkBkBkBkBkCPBkBkBnCJBkBkBnBkBkBkCPBkBkCPBk__ ____BDBkBkBkBkBkBkBkBkBkBDBkBkBkBkBkCJBkBnCJBkBkBkBkBkCPBkBkBD__ ____BDBkBkBkBkBkBkBkBkBkBkBDAlBkBkBkBkBnCJBkBkBkBkCPBkBkCPBkBD__ ____BkBkBkBkBkBkBkBkBkBkBkBDAlBkBkBkBkBkBkBnBkBkBkBkBkCPBkBkBDAl __BDBkBkBkBkBkBk_ABDBkBkBDBDAlBkBkBkBkBkCJBkBkBdBkBkCPBkBkCPBDAl __BkBkBkBkBkBkBDBDBDBkBkBDBDAlBkBkBkBkBkBkCPBkBDBkBkBkBkCPBkBDAl __BkBkBkBkBkBDBDBDBkBkBkBDAlBDBkBkBkBkBkBnBkBDBDBkBkBkBkBkBkBDAl BDBkBkBkBkBDBDBDBkBkBkBkBDAlBDBkBkBkBkBkCJBkBDBDBkBkBkBkBkBkBDAl BkBkBkBkBDBDBDBkBkBkBkBDAlBDBDBkBkBkBkBkBDBDBDBDBDBkBkBkBkBkBDAl BkBkBkBDBDBDBkBkBkBDBDAlAlBDBDBkBkBkBkBkBDBDBDBDBDBkBkBkBkBkBDAl BkBkBkBkAlAlBDBDBDAlAlAlAlAlBDBkBkBkBkBDBDBDBDAlAlBkBkBkBDBDBDAl BkBkBkBkBD__AlAlAlAlAlAlAlAlAlBDBkBkBkAlBDBDAlAlAlAlBDBDBDBDBDAl BkBkBkBkBD__AlAlAlAlAlAlAlAlAlBDBDBkBkAlAlAlAlAlAlAlBDBDBDBDAl__ BkBkBkBkBD____AOAlAlAlAlAlAlAlAlBDBkBDAlAlAlAlAlAlAOBDBDBDBDAl__ __BDBDBD______AOAOAOAO__AlAlAlBDBDBkAlAlAlAlAlAOAOAOBDBDBDAlAO__ ______________AlAlAOAO______AlBDBDBDAlAl__AOAOAlAOAOBDBDBDAlAO__ _______A_A_A_AAlAlAlAO_A_A_AAlBDBDAl_A_A_AAlAlAlAOAOBDBDBDAlAO_A ___A_A_A_A_A_A_AAlAOAO_A_A_AAlBDBDAl_A_A_AAlAlAlAO_ABDBDAlAlAO_A ___A_A_A_A_A_A_AAlAOAO_A_A_AAlBDBDAl_A_A_AAlAlAOAO_ABDBDAlAOAO_A ___A_A_A_A_A_A_AAlAOAO_A_A_AAlAlBDAl_A_AAlAlAOAO_A_ABDAlAlAOAO_A ___A_A_A_A_A_AAlAlAOAO_A_A_AAlAlBD_A_A_AAlAOAO_A_A_AAlAlAOAO_A_A _____A_A_A_A_AAlAOAOAO_A_AAlAlAlBD_A_A_A_A_A_A_A_AAlAlAOAO_A_A__ } # tile 89 (sewer rat) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________AlBJAjBJ________________________ ______________________________BDBDAlBDBDAlBDCTCTCT______________ ____________________________BDAlBdBDBDBdBdBkBDAlBwCT____________ ________________________BJBDBDBdBdBkBdBkBDBJAlAe_ABVCT__________ ________________________AlBDBkBDBdAjBJBdAjBDAlAe_A_ACT_A________ ________________________BDBDBkBkBDBdAlBDBDAlAlAe_A_ABw_A________ __________________BkBkBDBkBkBJBDAlBDAlBDBDBJAlAe_A_ACT_A________ __________________BwBkAlCTBkAlBDBDAlBJAlAlAlAe_A_ACTBw_A________ __________________BVBkAlBwBkAlAlBJAjAlAlBDAe_A_A__CTCG__________ ________________AlBdBDBDAlAlAlAeAlAeAlAeBV_A_A____BjBV__________ ________________AlCVBJCVAlAeAeAeAeAl_ACTBw_A____CTBV_A__________ _______________ABDAlAlAlAlAeAe_A_A_A_A_A_A______CTCG_A__________ _______________A_ACmAeAl_ACTCT_A_A________CTCGBw_A_L____________ _________________A_A_A_A___A_A_____________A_L_A_A______________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 90 (giant rat) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________________________BJAjBDBJAl________________________ __________________________BDBDAlBJBdBDBDAjBDBJCTCTCTCT__________ ________________________BJAlAjBdBDBDBDBdBdBdBkBDAlBVBwCT________ ______________________AlAlBdBJBkBdBdBdBDBDBDBDBDAlAe_ABVCT_A____ ____________________BJBDBDBDBdBdBkBkBdBkBDAlBDAeAeAe_ABVCT_A____ ____________________AjBDBkBdBDBdAlBDBJBdAjBJBDAlAeAe_A_ACTBw_A__ __________________BJAlBDBkBdBkBDBdBDAlBDBDAlAlAlAeAl_A_ABwBt_L__ __________BkBk__AjBDAlBDBDBDAlBDBDBDBdBDBDBDBDAeAe_A_A_ABzBV_A__ __________CTBkBkBDBdBkBkBDBkBDAlBDBDAlBDBDAlAlAlAe_A_A_ACTBV_A__ __________CGBwBkAlBkCTBkAlAlBDBDAlAlBDAlAlBJAlAe_A_A_ACTBw_A_A__ ____________BVBkBJCTBwBkAlBDAlBDAlAlAlAlBDAlAe_A_A_A__CTCG_A____ __________BJBdBdBDBJBVBdAlBJAlAlAlAlBDAeAlAe_A_A_A____CTBV_A____ ________AlCVBdBDBDAjAlAlAlAlAeAlAeAeAlAeBVBV_A_A______BwBV_A____ ________AjBDBDBJCVAlAlAeAeAlAeAeAl_A_ACTBw_A_A______CTBV_A_A____ _______ABJAlAjAlAlAeAlAeAeAe_A_A_A_A_A_A_A_A________CTBw_A______ _______ABDCmAlAlAeAeAOBVBw_A_A_A_A_A____________CTBwBV_A_A______ _______A_ACmCmAeAl_A_ACTCT_A_A_A____________CTBwCGBV_A_A________ _________A_A_A_A_A_A___A_A_A_________________A_A_L_A_A__________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 91 (rabid rat) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________________________BJAjBDBJAl________________________ __________________________BDBDAlBJBdBDBDAjBDBJCTCTCTCT__________ ________________________BJAlAjBdBDBDBDBdBdBdBkBDAlBVBwCT________ ______________________AlAlBdBJBkBdBdBdBDBDBDBDBDAlAe_ABVCT_A____ ____________________BJBDBDBDBdBdBkBkBdBkBDAlBDAeAeAe_ABVCT_A____ ____________________AjBDBkBdBDBdAlBDBJBdAjBJBDAlAeAe_A_ACTBw_A__ __________________BJAlBDBkBdBkBDBdBDAlBDBDAlAlAlAeAl_A_ABwBt_L__ __________BkBk__AjBDAlBDBDBDAlBDBDBDBdBDBDBDBDAeAe_A_A_ABzBV_A__ __________CTBkBkBDBdBkBkBDBkBDAlBDBDAlBDBDAlAlAlAe_A_A_ACTBV_A__ __________CGBwBkAlBkCTBkAlAlBDBDAlAlBDAlAlBJAlAe_A_A_ACTBw_A_A__ ____________BVBkBJCTBwBkAlBDAlBDAlAlAlAlBDAlAe_A_A_A__CTCG_A____ __________CuBdBdBDBJBVBdAlBJAlAlAlAlBDAeAlAe_A_A_A____CTBV_A____ ________AlCuBdBDBDAjAlAlAlAlAeAlAeAeAlAeBVBV_A_A______BwBV_A____ ________BJBDBDBJCuCuAlAeAeAlAeAeAl_A_ACTBw_A_A______CTBV_A_A____ _______AAjBNAlAlAlAeAlAeAeAe_A_A_A_A_A_A_A_A________CTBw_A______ _______ABoCPBNBNBoAeAOBVBw_A_A_A_A_A____________CTBwBV_A_A______ _______ABNCPCPBNAl_A_ACTCT_A_A_A____________CTBwCGBV_A_A________ _________A_ACP_A_A_A_A_A_A_A_________________A_A_L_A_A__________ _________A_A_A_A_A______________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 92 (wererat) { ________________________________________________________________ ________________________________________________________________ ______________________________________________________AeAeAe____ __________________________________________________AeAeAe__AeAe__ ________________________________________________AeAe________Ae__ ________________________________________________AeAe________Ae__ ________________________________________________AeAe________Ae__ ________________________________________________AeAe______Ae____ __________________________BM____________________AeAe____________ ________________________BnBM______________________AeAeAe________ ________________BnBnBnBnBnBM________________________AeAeAe______ ____________BnBnBnBnBMBnBMBM__________________________AeAeAe____ __________BnBnBnBnBnBMBMBMBMBnBMBMBMBMBMBMBMBMBMBMBM____AeAeAe__ ________BnBnBMBMBMBMBMBnBnBnBnBnBnBnBnBnBnBnBnBnBnBMBM____AeAe__ ________BMBMBMBdBdBdBMBMBnBnBnBnBnBnBnBnBnBnBnBnBnBMBMBMBMAeAeAe ________BMBMAjBJBdBd__BMBnBnBnBnBnBnBnBnBnBnBnBnBnBnBMBMBMBMAeAe ______BdBJAlBdBdBdBJBdBMBnBnBnBMBnBnBnBnBnBnBnBnBnBnBMBMBMBMAeAe ____BdAlBdBDCjAlBDAlBdBMBnBnBnBnBMBnBnBnBnBnBnBnBnBnBMBnBnBMBMAe ____BDBdBDCjCjBkBdAjBJBFBnBnBnBnBnBMBnBnBnBnBnBnBnBMBnBnBnBnBMAe __BdBdBdBJCjBJBJAlBDAlBMBnBnBnBnBnBMBnBnBMBnBnBnBMBnBnBnBnBnBMAe __AlBdAjBJBdBdBdBDAeBMBMBMBMBnBnBMBMBnBnBMBMBnBnBnBnBnBnBnBnBM_A __BdBdAlBdBDBdBNAeBMBMBdAjBJBMBnBnBMBnBnBnBMBMBnBnBnBnBnBnBnBM_A __BdBdBDAlBdBNAeBFBdBJBdAlBDAlBMBnBMBnBMBMBnBMBMBnBnBnBnBnBnBMBM _AAlBDAlBDBNBNAeBMAjBdAlBDAlBDBMBnBMBnBnBMBMBnBMBMBnBnBnBJBdBMBM _ABdBdBJAlBDAeAeBMC$BdBDAlBDAeBFBMBMBMBnBMBMBMBMBMBMBnAlBdAjBMBM _ABdCPCmAiBFAiBDBMBMC$AeAeAeBFBDBMBMBMBMBMBMBFBDBMBFBDBdBJBMBMBM _A_ACPCmBDBDAiBdBFBnBMABAE_VBMAiBdAiBMBMBMBDAiBdBFBdBdBdBFBMBM_A _A_ABMBMAiBFBMBFBnBnBFAO_VAOBMBdAiBDBdAiBdAi_A_AC$_AC$_A_A_A_A_A _A_A_ABMBMBMBMBMBMBM_A_A_A_A_AAiBdAiBdAiBd_A_A_A_A_A_A_A_A_A_A_A ___A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A________ _______A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A______________________ ________________________________________________________________ } # tile 93 (rock mole) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________________________BjBjBjBjBjBjBjBjBj____ ______________________CJBjBjBJ________BjBjCJBkCTBkBjCJBkCTBjBj_A ____________________CPBjBjCJBjBkCJBjBjBjCJBcCOBjBjBjBJBJBJBJBJ_A _____________________ABJBjBjBjBjBjCJBkCOBjBjBjBjBjBJBJ_L_A_A_A_A _____________________A_LBJBJBJBjBjBmCTBjCJCOBjCJBjBJ_A__________ _______________________A_A_ABjBJBjCTBkBjCTBcBjCJBzBj_A__________ _________________________ABjBjBkCTBkCTBmBJBjBjBjBkCJBj_A________ ______________CJBkCTBkCJBjBjCTCOBcCOBcBjBjBJBJBjBjCOBj_A________ __________CPBkCTBjBjBcCOBjCJBmBjCJBwBjBjBJBJBJBJBJBcCJ_A________ _________ABjBJBJBJBJBJBjBjBjCTBkCNBjCJBjBJBJ_A_ABJBJBjBj_A______ ___________ACPBJ_A_L_ABjBjBjCOBkCJBkBcCJBj_A_A_A_ABJBJCP_A______ ___________A_A_A_A_ABjBjCJCOBjBjBjBbBjBkCNBk_z_A_ACPBJ_A_A______ ______BjCTBkCJBj_A_ABjCJBcCTBjCJBJBJBjBjBjBkCJBj_A_A_A_A________ ____BjBjBjBjBjBjBjBjCJBmBjBjBkBzBjBJBJBjBjBjCTBLCJBJ_A_A________ __BjBjBJBJBJBJBjCTBmCTBwCOCJBjBjBJ_A_ABJBJBjCJBjBjBjCP_A________ __CPBJBJ_A_L_ABkBjBjCJBmCTBcCJBjBjBj_A_ABJBJBJCOBjBJ_A__________ ___A_A_A_A_ACJBjBjCOCJBjBjBbBkBjCJBj_A_A_A_A_ABJBJCP_A__________ _________ABjCJBzCJBkBjCJBJBjBjBjBjCOBj_A_A_A_A_A_A_A____________ ______BjBjBjCJBLCJBzCJADBJBJBJBjBjBjCJBj_A_A_A_A_A______________ ____BJAqCmAqAuCmAqCJBjBjBJBJBJBJBjBjBjBk_z_A_A_A________________ ____BJCmAqAqCmAqATAIBjBJBJ_ABJBJBJBjBjCJ_A_A_A__________________ ______CmAqAqCmATATATATBJBJ_A_A_ABJBJBjBzBj_A_A__________________ ________BJAqATATATATATBj_A_A_A_ABJBJBjBjBj_A____________________ ________BjAqAqATATATBjBJ_A_A___ABJBjBJBjBJ_A____________________ ____CmBjAqAqCmATATATBJ_A_A_____ABJBjBJBJ_A_A____________________ ______CmCmAqAqCmCmBjBJ_A_A_____A_ABJBJCP_A______________________ _______ACTBkCJBjBjCJ_A_A_________ACP_A_A________________________ _________A_L_A_A_A_A____________________________________________ ________________________________________________________________ } # tile 94 (woodchuck) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________________________________________BvBvBv______ __________________CICICIBvCICICI________________BvBvBWBWBvBv____ ________________CmAOCIBvCIAOCmCIBv____________BvBWBWBvBvBvBvBv__ ______________CICmAOCICIBvAOCmCICIBv__________BvBWBvBvBWBvBWBW__ ______________CICIBvCIBvBvCIBvCIBvBWBW______BvBWBvBvBvBvBWBWAz__ ____________CICICICIBvCICIBvCIBvCIBvBW______BvBWBvBWBvBWBWAzAz__ ____________CIBvCmCmCICmCmCIBvBvBvBvBW______BvBWBvBvBWBWAzAz____ ____________BvBvCmCmBWCmCmBWBvBWBvBWBWBW____BvBWBvBvBWBWAz______ ______________BvCmCmAzCmCmAzAzAzBWBWBWBW____BvBWBvBWBWAzAz______ ________________AzCmAzCmAzAzAzBWBWBWBvBW____BvBWBvBWBWAz________ ________________BvBjBmBjCTBLCOBWBWBWBWBW____BvBWBvBvBWAz___A_A__ ______________BvBvCOCOCOCOCOCOBjCIBWBWBW____BvBWBvBvBWAz_A_A_A_A ____________BvCIBvCOClCOClCOClClBvCIBWBv__BvBWBvBvBvBWAzAz_A_A_A ____________CIBvBvCOClCOClClClClBvCIBWBW__BvBWBvBWBvBWAzAz_A_A__ ____________CIBvBWClClClClClClClBvCIBWBW__BvBWBvBvBWBWAzAz_A_A__ ____________CIBvBvClCOClClCOClBvCICIBvBW__BWBvBvBvBWBWAz_A_A_A__ ____________CICIBvBvCOClClCOBvCICIBvBWBWBWBvBvBvBWBWAzAz_A_A____ ____________BWCICIBvClClCOClCICIBvBWBWBWBvBvBvBWBWAzAz_A_A_A____ ____________BWBWCICIClClCOClBvBvBWBvBWBWBvBWBWAzAzAz_A_A_A______ ______________BWBWCOCOClClCOClCOBWBWBWBvAzAzAzAz_A_A_A_A________ ______________BWBvBvClClCOClClBWBWBWBvBv_A_A_A_A_A_A_A__________ ______CICI____BWBWBvBjClClClCOBWBWBvCI_A_A_A_A_A_A______________ ____CICICICICICICIBWBWCOClCOBWBWBWCICICICICI_A_A________________ _A_ABvBvBvBvBvBvBvCIBW_A_ACICICICICICIBvBvBvCI_A________________ _A_A_ABvBvBvBvBv_A_A_A_A_A_A_A_ABvBvBvBv_A_A_A_A________________ _____A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A__________________ _______________A_A_A_A_A_A_A_A__________________________________ ________________________________________________________________ } # tile 95 (cave spider) { ________________________________________________________________ ____________________BmBlBkBJ____________________________________ ___________________ABdBjAeAjBJBk________________________________ ___________________A_A_AAeBdBlBJAjBJ____________________________ ________BkBDAlBkBDBJAl_B_A_ABdAeAeBkBl__________________________ ______CJAjBJBdCPAlAjBDBk_A_A_A_ABdBdBm__________________________ ______BMAeAeBd_AAeAeBkCPAl_z_A_A_AAeBX_A_A______________________ _____zBdBd_A_A_A_ABdBdAeAjBJ_A_A_AAeBDBk_A_A____________________ _____A_A_A_A_A_A_A_A_AAeAeBkBlCJ_L_ABdBk_MBdBdBdBdBdBdBd________ ______BlBkBJAjCJBk_A_A_zAeBdBdAjBJ_ABdBDBdCJBmBlBkCJBmBlBkBJ____ ____BJBmBXAeAeBdBDBJAj_A_A_ABJAlBdBdAlBdBkBlBdBjBdBdBdBdBdBkBd__ __BlAlAeBdAe_A_AAeAeBkCJAlBDBdBdBdBdBdCJBnBjBdBlCOBlBkCPBkBkAe_A __COAeAe_A_A_A_A_A_ABdBkAjBdBdBDAlBDAjBJAlBdBkCOAlBDBJAlBDAe_A_A __BdBd_A_A_A_______A_A_ABdBdBJAlBDAlBJAjAeCOBlAlBDAlBdBdAl_A_A__ ___A_A_A____BkBDAlBlCOAlBdBNAjBJAlBDAlAeAeAeBJAjBdBdBdBD_A_A_A__ ___A_A_A__BDBkAeAeAeBdAeBNBJBNBDAlBDAeAeAeAeBlBk_A_A_A_A_A_A____ ________BJAjBdBd_A_ABkBlBmBNAjBNBDAOAeAeAeBkBJBDBJBkBlBJAl______ ______BlBkAeAe_A_A_zBm_z_zBkBNAeAeAeBdBdAeBnBkBJBlCJBmAeBDBk____ ______BJBdBd_A_A_A_A_B_A_ABlBjBdBd_ABkCK_ABdBkBD_A_AAeAeAeBkBD__ ____AjBJAe_A_A_______A_BCOBkAeBDBk_BBmAeBJ_zAeAeBk_A_A_ACOBlBJ__ ____BJAeAe_A___________A_A_BAeBJAj_zAeAeAj_A_AAeBkBk_B_AAeAeAeBk ____BkBd_A_A___________A_ABjBlAl_A_AAeAeBk_A_A_ABdBDBd_A_AAeBkBD ____BlBd_A_____________A_ABdBm_z_A_A_ABkBD_A_A_AAeAeAl_A_A_AAeBJ _____A_A_A_____________AAeAlBJ_A_A_A_AAeAeBJ_A_AAeAlBk_A_A_AAeAj _______________________AAeBDAl_B_A_A_AAeAeBk_B_A_ABdBk_M_A_AAeBk _______________________ABdBkBl_A_A_A_A_ACPBk_A_A_ABdAeBJ_A_ACJ_A _______________________AAeBJBJ_A_A_A_A_ABkBDBJ_A_AAeAeBD___A_B_A _______________________AAeBJAj_A_A_A_A_AAeAeAj_A_AAeAeBk_____A__ _______________________ABdAlBk_z_A_A_A_AAeAeBk_z_A_ABdBk________ _______________________ABdCP_B_A_____A_ABkCPBk_A___ABdBn________ _________________________A_A_A_________ABkBk_z_____A_A_z________ _______________________________________A_z_M_A__________________ } # tile 97 (giant spider) { ________________________________________________________________ ________________________________________________________________ _______________________ABSATATBs________________________________ _____________________A_ABSBSBsATATAT____________________________ ________BsATATBsATATAT_A_A_ABS_$_$BsBs__________________________ ______BsATATBSBsATATATBs_A_A_A_ABSBSBs__________________________ ______Bs_$_$BS_A_$_$BsBsAT_A_A_A_A_$AT_A_A______________________ _____ABSBS_A_A_A_ABSBS_$ATAT_A_A_A_$ATBs_A_A____________________ _____A_A_A_A_A_A_A_A_A_$_$BsBsBs_ABSBSBs_ABSBSBSBSBSBSBS________ ______BsBsATATBsBs_A_A_A_$BSBSATATBSBSATBSATATATATATATATATAT____ ____ATBsAT_$_$BSATATAT_A_A_AATATBSBSATBSATATBSBSBSBSBSBSBSATBS__ __BsAT_$BS_$_A_A_$_$BsBsATATBSBSBSBSBSATATBSBSATATATATATATBS_$_A __Bs_$_$_A_A_A_A_A_ABSBSATBSBSAwAwAwAwAwAwBSATATAwAwAwAwAT_$_A_A __BSBS_A_A_A_______A_A_ABSBSAwAwAwAwAwAwAYATATAwAwAwATATAw_A_A__ ___A_A_A____BsATATBsBsATBSBNAwAwAwAwAwAYAYAYAwAwATATATAw_A_A_A__ ___A_A_A__ATBs_$_$_$BS_$BNAwBNAwAwAwAYAYAYAYBsBs_A_A_A_A_A_A____ ________ATATBSBS_A_ABkBkAwBNAwBNAwAYAYAYAYBsATATATBsBsATAT______ ______BsBs_$_$_A_A_MCJ_M_AAwBNAYAYAYBSBSAYBsBsATBsBsBs_$ATBs____ ______ATBSBS_A_A_A_A_A_A_ABkAbAYAY_ABsBs_ABSBsAT_A_A_$_$_$BsAT__ ____ATAT_$_A_A_______A_ABmCK_$ATBs_ABs_$AT_A_$_$Bs_A_A_ABsBsAT__ ____AT_$_$_A___________A_A_A_$ATAT_A_$_$AT_A_A_$BSBs_A_A_$_$_$Bs ____BsBS_A_A___________A_ABSBsAT_A_A_$_$Bs_A_A_ABSATBS_A_A_$BsAT ____BsBS_A_____________A_ABSBs_A_A_A_ABsAT_A_A_A_$_$AT_A_A_A_$AT _____A_A_A_____________A_$ATAT_A_A_A_A_$_$AT_A_A_$_$Bs_A_A_A_$AT _______________________A_$ATAT_A_A_A_A_$_$Bs_A_A_ABSBs_A_A_A_$Bs _______________________ABSBsBs_A_A_A_A_ABsBs_A_A_ABS_$AT_A_ABs_A _______________________A_$ATAT_A_A_A_A_ABsATAT_A_A_$_$AT___A_A_A _______________________A_$ATAT_A_A_A_A_A_$_$AT_A_A_$_$Bs_____A__ _______________________ABSATBs_A_A_A_A_A_$_$Bs_A_A_ABSBs________ _______________________ABSBs_A_A_____A_ABsBsBs_A___ABSBs________ _________________________A_A_A_________ABsBs_A_____A_A_A________ _______________________________________A_A_A_A__________________ } # tile 98 (scorpion) { ____________________________________CuCuCuCu____________________ __________________________CB______CBCBCBCBCBCuCB________________ ____________________________CBCBBNBNBNBNBNBNCBBNAT______________ ____________________________________________BNCuCBBN____________ __________CBCBCBCBCuCuCBCu____________________CuCBBN____________ ___________A_A_A_ACBCBBNCBCu__________________BNBNBN____________ _________________A_A_A_A_ACBCu________________CuCBAT____________ _______________________A_ACBCu______________CuCBCBBN____________ ____________CuCuCuCuCu___ABNCB__________CuBNBNCBBNBN____________ ____CBCBCBCBCBBNCBCBCuCu_ACBCu______CBCuCuCBCBATBN_A_A__________ _______A_A_A_A_A_A_ACBCu_ACBCu__CBCuBNBNCBCBCBATBN_A_A__________ ________CuCuCuCBCu_ABNCB_ACBCuCBCuCuCBCBBNCBBNBN_A_A____________ __CBCBCBCBCBBNBNCBCu_ACu_ACBBNBNCuCBCBCBBNATBNBN_A_A____________ _____A_A_A_A_A_ABNCB_ACuCBCuCuCuBNCBCBCBBNATBN_A_A______________ _______________ACBCu_ACuCuCuCBCBCBBNBNBNBN_A_A_A________________ ____CBCu_______ACBCuCBBNBNCBCBCBCBBNATBNCuCuCuCuCBCuCuCu________ __CBCBCBCuCu___ACBCBCuCuCBBNCBCBBNBNAT_A_A_A_A_A_A_A_ACuCu______ __CBCB_ACBCBCu_ACBCuCuCBCBCBATBNBNCuCuCuCuCuCBCu_A_A_A_ACu______ BNCBCB_A_A_ACBCuCuCuCBCBCBCBBNATCBCBCBCBCBCBBNCBCu_____ABN______ BNCBCBCu_A_A_ACBCuCBCBCBCBBNBNAT_A_A_A_A_A_A_A_ACBCu___ACB______ BNCBCBCu_A___A_ACBCBCBCBBNCBCuCuCuCuCBCu_____A_ACBCB___ACB______ BNCBCBCu_A_____ACBBNBNBNBNCBCBCBCBCBBNCBCu_____ABNCu___ACB______ BNCBCBCu_A_______ABNBNCBCu_A_A_A_A_A_ACBCBCu___A_ACB_____A______ BNCB_ACu_A_________A_ACBCBCu_______A_A_A_ABN_____ACB____________ _ABN_ACu_A_____________A_ACBCuCu_________ACu_____ACB____________ _ABN_ACu_A_________________A_ACBCu_______ACu_____ACB____________ _ABN_A_A_______________________ACBCu_____ACB_______A____________ _ABN_A____________CuCuCuCuCuCuCuCBCB_____ACB____________________ ___A_A________CBCBCBCBCBCBCBCBCBCBCB_____ACB____________________ _____________A_A_A_A_A_ABNBNBNBN_A_A_A___ACB____________________ _____________ABNBNBNBNBNBN_A_A_A_A_________A____________________ _____________A_A_A_A_A_A_A_A____________________________________ } # tile 99 (lurker above) { BkBk____________________________________________________________ __BkBnBkBkCPBkBk________________________CPBkBk__________________ __BdBkCJBnBkBDBkCPBkBkBn__________BkCJBnBJBDCPBkBkBnCJBk________ ____BdBDBDBJCPBkBkCPBkCJBDBXBnBkBkCPBMCJBlBkBDBDCJBDBDBDBDBk____ ______BdBDBkBJAjCJBkBDBDBkBnBXBDBDBDBkBmCJBDBkBkAjBkBnCJBMCJBk__ ________BdCOBlBkBDBDCPBkBnCJBkCPBkBDBDBDBdBkBkBnCJBDCJBkBnBk____ ________BdBDBDBDBkBnBkCJBkBkBdBDBDBkCPBkBlCOBlCJBMBnBJBkBkBd____ ________BDBkCJBnBDBJCKBmBlBJBnBkBkBDBxBmCJBkBmBDBDBJBlBkBd______ ______BkBkBnBkCJBkBnBJBDBDBkCJBnCJBmBDBlBmBYBkBkCPBDBkBd________ ______BkCPBkCJBnBkBcBlBkCOBlBmCJBlBkBdBkBDBkCPBkBkBkBJ__________ ____BkBkBJAjBkCKBJBkBDBkCKBkCJBnBkBdBkBdBkBkBlCOBlBkBd__________ __BlCOBkBlBkBJAjBkCPBkBDBDCPBMCJBDBkCPBkBYCOBkBDBDBk____________ __BkBkBkCOBlCOBkBlBkCOBkBmBDBkBdBkCPBkBkBnBDBDBkBkBr____________ ______BdBkBkBkBkBjBdBdBkBkBkBJBnCJBMCJBDBDBkCKBkBr______________ ________BdBdBd________BdBdBkBkBkBlCOAjBkCOBlBkBkBd______________ ____________________________BdBdBkBkBkBrBrBkBdBd________________ ________________________________BdBdBdBdBdBdBd__________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ _________A_A_A__________________________________________________ _________A_A_A_A_A______________________________________________ _________A_A_A_A_A_A_A_____________A_A_A_A_A_A_A_A_A_A_A_A_A_A__ _________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A__ ___________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A____ ___________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A______ _________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A________ _________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A__________ _________A_A_A_A_A_______A_A_A_A_A_A_A_A_A_A_A_A_A_A____________ _______________________________A_A_A_A_A_A_A_A_A_A______________ } # tile 100 (trapper) { AEAEAEAEAEAEAEAEAEAEAE_RAEAEAEAEAEAEAEAEAEABAEAEAEAEAEAEAEAEAEAE AEAO_VAO_VAO_VABAE_R_R_RAEABAEAEABAEAEAEAE_VAE_R_R_RAiBD_VAO_V_O AE_VAOAEAEAEAEAE_V_R_RAO_VAEAEAEAEAEAEABAEAEAEAB_RBdASASBd_VAO_R AEAOAE_VAEAOAEAE_VAO_R_VAO_VAB_VAEABAE_VAEAEABAEAiASAEAEASBd_V_R AE_VAEAEAEAEAEAEAEAO_RAO_V_R_R_R_R_R_RABAE_VAE_OBDAE_VAEAEAiAO_R AEAOAEAEAE_VAEAOAE_V_R_V_RAEABAEABAE_R_R_R_O_RAiAS_RAOAEAEAEAi_R AE_VAOAEBDAiAEAEAEAB_R_RAO_VAEAE_VAB_V_R_R_RBdASAE_O_R_VAOAOAO_R AEAOAiASASASBdAE_V_R_RABAEAEAEAEAEAE_R_R_RAiASAEAB_VAO_R_R_V_V_R AEAiAeAEAEAEASAiAO_RAE_V_RAEABAEABAE_O_R_RBdASAEAEAEAE_V_R_R_R_R AEAOAEAE_VABAEASBD_RABAEAEAEAEAE_V_R_RBoBoAiASAE_VAEAEAOAO_R_R_R AE_R_RAO_V_R_R_RASAiAEABAEAEAE_R_R_RCPBoBoBoCPAEAEAO_VAEAE_V_R_R AE_R_R_R_R_R_R_VAEASBDAE_VAB_R_R_RBoBoBNBNBNBoBNBNAO_VAO_R_R_R_R AEAEAB_VAO_VAEAEAEASAiAO_R_R_RCPBoBoBNBNBNBNBoBoCP_RAE_O_R_R_R_R AEABAEAEAEAEAOAEAEBd_R_R_RBoBoBoBNBNBNAqAqBNBNBNBN_R_R_R_R_VAO_R AE_VAEAEAEAEAEAE_V_R_R_RBoBoBNBNBNAqAqAqAqAqBNCP_RAB_R_R_RAO_V_R AEAOAE_VAEAOAE_VAO_RABAE_RCPBNAqAqAqAqAqAqAqAq_VAO_VAE_RAO_VAO_R AE_VAEAOAEAEAEAO_R_R_VAEABAEAqAqATAqATATAqAqAO_VAEAO_V_R_VAEAE_O AEAOAEAEAEAEAO_V_RAOAEAEAEAO_VATATATATATATCPAOAEAE_VAO_RAOAEAB_R AE_VAO_VAE_V_R_R_R_VAE_RAE_VAO_VATATATATAT_VAEAEAEAO_R_R_VAO_V_R AE_R_R_R_O_R_R_R_RAOAEAEAEAEAEAOCPATATCPAOAEABAEAE_V_R_RABAEAE_R AEAO_VAO_VAO_VAO_R_VAO_VAO_VAO_VAOAGAT_R_VAEAE_VAEAO_RAE_VAEAB_R AEAO_VABAEABAEAE_R_R_VAO_V_R_R_R_RASBD_R_RAOAEAEABAE_R_VABAE_R_R AE_VAOAEAEAEAEAB_V_R_RAO_R_R_R_R_RASAi_R_R_VAO_VAE_O_R_R_R_R_R_R AEAEAE_VAEAEAEAEAOAO_R_R_R_R_RAO_VASBdAO_R_R_VAEAB_RABAEABAE_R_R AEABAEAEAE_VAEAEAE_V_R_R_RAEAB_VAOASASAiAO_R_RABAE_R_VAOAE_VAB_R AEAEAEAEAEAEAEAEAEABAE_RAO_VAEAEAEAEASASAjAE_R_R_R_OAEAEAEAEAE_R AE_VAEAOAEAEAEAEAE_VAO_R_VAEAEAEAEAEAEASBdAS_VAO_R_RABAE_VAEAB_R AEABAEAEAEAEAE_VAEAO_V_RABAOAEAEAE_VAEAEASASASBD_V_RAEAEAEAEAE_R AEAEAEAEAEAEAEAEAO_VAO_RAE_VABAEAEAEAEAEAEAEAEASBd_RAB_VAEAEAB_R AEAB_VAEAEAEAO_VABAE_R_R_RAO_VAO_VAO_VAO_VAEAE_V_R_R_RAEAE_VAE_R AEAEABAEAB_V_R_R_R_R_R_R_R_R_R_R_R_R_R_R_RAO_V_R_R_R_RAOAEAB_R_R _V_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R } # tile 101 (white unicorn) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________CrCrCr______C$C$C$C$C$__________________________ ____________________CrCrCrC$C$C$C$C$____________________________ ________________________C$_A_ACmCmC$C$C$________________________ ______________________C$C$CmCm__CmCmC$__________CmC$C$__________ ______________________CmCmCm____CmCmC$C$______CmCmC$____________ ______________________________CmCmC$________CmCmC$______________ ______________________________CmCmC$C$______CmCmC$C$____________ ________________CmCmCm______CmCmC$C$__________CmC$______________ ______________CmCm__CmCmCmC$C$C$C$C$C$________CmC$C$____________ ____________Cm__________C$CmCmC$C$C$C$C$______CmC$______________ ____________________C$C$C$CPCPCmCmCmCmC$C$____CmC$______________ ________________C$C$C$______CPCPCmCmCmCmC$C$__CmC$______________ ________________C$____________CPCPCmCmC$C$C$C$C$_A_A_A_A_A______ ______________C$C$______________CPCPCmCmC$C$C$_A_A_A_A_A_A______ ______________________________CPCPCPCmC$C$_A_A_A_A_A_A_A_A______ ___________________________ACPCPCPCPCmC$_A_A_A_A_A_A_A_A________ _________________________ACmCPCP_A_ACmC$_A_A_A_A_A_A_A__________ _________________________ACm_A_A_A_ACmC$_A_A_A_A_A_A_A__________ _______________________A_ACm_A_A_A_ACmC$_A_A_A_A_A_A____________ _______________________A_ACm_A_A_ACmC$_A_A_A_A_A_A______________ _______________________A_ACm_A_A_ACmC$_A_A_A_A_A________________ _______________________A_ACm_A_A_ACmC$_A_A_A_A__________________ _________________________A_A_A_A_A_AC$_A_A_A____________________ ___________________________A_____A_AC$_A_A_A____________________ ___________________________________AC$_A_A______________________ _____________________________________A_A________________________ } # tile 102 (gray unicorn) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________CrCrCr______BkBkCPBkBk__________________________ ____________________CrCrCrCJBnCJBkBn____________________________ ________________________Bk_M_ABkBkCJBkBn________________________ ______________________CPBkBkBk__BkBMCJ__________BkBkBk__________ ______________________BdBkBk____BkBkBkBn______BkBkCP____________ ______________________________BkBkCJ________BkBkBk______________ ______________________________BkBkBMCJ______BkBkBkCP____________ ________________BkBkBk______BkBkCJBn__________BkBk______________ ______________BkBk__BkBkBkBkBnBkBkCJBM________BkCPBk____________ ____________Bk__________BkBkBkCJBnBkCPBk______BkBk______________ ____________________BkCPBkBkBdBkBkBkBkBkCP____BkBk______________ ________________BkCPBk______BdBdBkBkBkBkBkBk__BkCP______________ ________________Bk____________BdBdBkBkCJBnCJBkBk_A_A_A_A_A______ ______________CPBk______________BdBdBkBkBkBkBn_M_A_A_A_A_A______ ______________________________BdBdBdBkBnCJ_M_z_A_A_A_A_A_A______ ___________________________ABdBdBdBdBkBk_A_A_A_A_A_A_A_A________ _________________________ABkBdBd_A_ABkCJ_M_A_A_A_A_A_A__________ _________________________ABk_A_A_A_ABkBk_A_A_A_A_A_A_A__________ _______________________A_ABk_A_A_A_ABkBn_z_A_A_A_A_A____________ _______________________A_ABk_A_A_ABkBk_A_A_A_A_A_A______________ _______________________A_ABk_A_A_ABkCP_A_A_A_A_A________________ _______________________A_ABk_A_A_ABkBk_A_A_A_A__________________ _________________________A_A_A_A_A_ABk_M_A_A____________________ ___________________________A_____A_MCJ_A_A_A____________________ ___________________________________ABk_M_A______________________ _____________________________________A_A________________________ } # tile 103 (black unicorn) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________CLBbCL______ABABABABAB__________________________ ____________________CLBZCLABABABABAB____________________________ ________________________ABCuCuABABABABAB________________________ ______________________ABABABAB__ABABAB__________ABABAB__________ ______________________ABABAB____ABABABAB______ABABAB____________ ______________________________ABABAB________ABABAB______________ ______________________________ABABABAB______ABABABAB____________ ________________ABABAB______ABABABAB__________ABAB______________ ______________ABAB__ABABABABABABABABAB________ABABAB____________ ____________AB__________ABABABABABABABAB______ABAB______________ ____________________ABABAB_A_AABABABABABAB____ABAB______________ ________________ABABAB_______A_AABABABABABAB__ABAB______________ ________________AB_____________A_AABABABABABABAB_A_A_A_A_A______ ______________ABAB_______________A_AABABABABAB_A_A_A_A_A_A______ _______________________________A_A_AABABAB_A_A_A_A_A_A_A_A______ ___________________________A_A_A_A_AABAB_A_A_A_A_A_A_A_A________ _________________________AAB_A_A_A_AABAB_A_A_A_A_A_A_A__________ _________________________AAB_A_A_A_AABAB_A_A_A_A_A_A_A__________ _______________________A_AAB_A_A_A_AABAB_A_A_A_A_A_A____________ _______________________A_AAB_A_A_AABAB_A_A_A_A_A_A______________ _______________________A_AAB_A_A_AABAB_A_A_A_A_A________________ _______________________A_AAB_A_A_AABAB_A_A_A_A__________________ _________________________A_A_A_A_A_AAB_A_A_A____________________ ___________________________A_____A_AAB_A_A_A____________________ ___________________________________AAB_A_A______________________ _____________________________________A_A________________________ } # tile 104 (pony) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________CLBbCLBWBW____________________________ ____________________________CLBWBWABBW__________________________ ________________________CLBZCLBSBWBWBWBW________________________ __________CLBbCL__________CLBWBWAzAzAzBWBW______________________ __________BvCLBZCL______CLBZBWAzAz__AzBWBW______________________ ______________CLBZCL____BZCLBWAzAz______________________________ ____________BbCLBtCL______CLBSBWAz______________________________ ____________BvCLBv__________BWBWBWBW______BWBWBW________________ ____________CLBbCL________BWBWBWBWBWBWAzAzAz__BWBW______________ ______________CLBb______BWAzBWBWBWBWBWBW__________AB____________ ______________CLBv____BWBWAzBWBWBWAzAzAzAzBW____________________ ______________BtCL__AzBWBWBWBWBWAzAz____AzBWBWAz________________ _______A_A_A_A_AAzAzAzBWAzBWBWAzAz____________Az________________ _______A_A_A_A_A_AAzAzBWBWAzAzAzAz____________BWBW______________ _______A_A_A_A_A_A_A_ABWBWAzAzAz_A______________________________ _________A_A_A_A_A_A_A_AAzBW_A_AAzAzAz__________________________ ___________A_A_A_A_A_A_AAzAz_A_A_AAzAz_A________________________ ___________A_A_A_A_A_A_ABWAz_A_A_AAzAz_A________________________ _____________A_A_A_A_A_ABWAz_A_A_A_AAz_A_A______________________ _______________A_A_A_A_A_AAzBW_A_A_ABW_A_A______________________ _________________A_A_A_A_AAzBW_A_A_ABW_A_A______________________ ___________________A_A_A_AAzBW_A_A_ABW_A_A______________________ _____________________A_A_AAz_A_A_A_A_A_A________________________ _____________________A_A_AAz_A_A_____A__________________________ _______________________A_ABW_A__________________________________ _________________________A_A____________________________________ } # tile 105 (horse) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________________________CLBb__________________ __________________________________________BvCLBW________________ ________________________________________BzCLBSBWBW______________ ______________________________________CLBZBWBW_ABWBW____________ ______________________________________CLBZBsBWBWBWBWBW__________ ____________________________________BZCLBWBWBWBWBWBWBWBW________ ____________________________________CLAwBWBWBW____BWAzBW________ __________________________________CLBbAzBWAzAz______Az__________ ______________BWBWBWBWAzAz________BvAzAzBWAzAz__________________ ____________CLBWBWBWBWAzAzAzAzAzBWB_AzAzAzBWAz__________________ __________BbCLBSBWBWAzAzAzAzAzAzAzAzBWBWAzAzAz__________________ __________CIBbBWBWBWBWAzBWBWAzAzAzAzBWAzAzAzAz__________________ ________CLBbBsBWBWBWBWBWBWAzBWAzBWBWAzBWAzAzAz__________________ ______CLBZCLBWBWBWBWAzBWBWBWBWBWAzBWBWBWBWBW____________________ ______BbCL__BWBWBWBWAzBWBWBWBWBWBWBWBWBWBWBW____________________ ______CLBv__BWBWAzAzAzBWBWBWBWAzAzBWBWBWBWBW____________________ ______BbCL__BWBWAz____BWBWBWBWBWBWCLBWBWAzBW____________________ ______CL____BWAzAz____AzAz______AwCLBbBWAzBWBW__________________ __________BWAzAz______BWBW________BWCLBv__AzBW__________________ _____A_A_ABWAz________AzAz__________BWBWBzAzBW__________________ _____A_A_AAzAz_A_A____AzAz____________BWBWAzBW__________________ _______A_AAzAz_A_A_A_AAz__________AzAzAz__AzAz__________________ _______A_AAz_A_A_A_A_ABW_A_______A_AAz______Az__________________ _________ABW_A_A_A_A_AAI_A_________AAz______BW__________________ _________AAI_A_____A_A_A_A__________________CLBb________________ ____________________________________________AGCL________________ ____________________________________________AIAG________________ ________________________________________________________________ } # tile 106 (warhorse) { ________________________________________________________________ ________________________________________________________________ ____________________________________________CLBbCL______________ ________________________________________CLBzBvCLBZBW____________ ____________________________________________CLBtBWBWBW__________ ____________CLBbCL____________________CLBZCLBZCLBWBWBW__________ ______CLBZCLBZCLBvBz____________________CLBZCLBWBWBW_ABW________ ______BZCLCLBZCLBsBZCL________________BZCLBtCLBWBWBWBWCL________ ______________CLAwCLBSBW________________CLBvBWBWAzBWBWBbCL______ ____________CL__AzAzAzBWBW____________CLBZCLAzBWAzAzAzBsBZ______ ______________BWAzAzBWBWBWAzAzAz____CLBZCLAwAzBWAzAzAzAzBWCL____ ______________AzAzBWBWBWBWBWAzAzAzAwCLAzAzAzAzBWBW____AzAz______ ______________AzBWBWBWBWBWBWBWAzAzAzAwAzAzAzBWBW________________ ____________BWBWBWBWBWBWBWBWBWAzAzAzAzAzBWBWBWBW________________ ____________BWBWAzAzBWBWBWBWBWBWBWBWBWBWBWBWBWBW________________ ____________BWBWAzAzBWBWBWBWBWBWBWBWBWBWBWBWBW__________________ ____________AzAzAzAzBWBWBWBWBWBWBWBWBWBWBWBWBW__________________ ____________AzAzAzBWBWBWBWAzBWBWBWBWBWBWBWBWBW__________________ ___A_A_A_A__AzBW__BWBWBWBWAzAzAzBWBWBWBWBWBWBWBW________________ _____A_A_A_ABWBW______BWBWBWAzAzBWBWBWAzAzBWBWBW________________ _______A_A_ABWBW_A_A____BWBWAzAzBW__AzAzAzAzBWBWBW______________ _________A_zBbCL_A_A_A__CL____AzBW__________BWBWBWBW____________ ___________ACL_A_A_A_ABbCL____AzAz____________AzAzBWBW__________ ____________Az_____A_ACLBv____AzAz______________AzAzBWBW________ _____________A___________B____CLBb________________AzBW__________ ______________________________BvCL______________AzBW____________ ______________________________BzBZ____________AzAzCL____________ _______________________A_A_A_AAzBs___________A_ACL______________ ___________________________A_AAz_A______________________________ _____________________________AAz_A______________________________ ________________________________________________________________ ________________________________________________________________ } # tile 107 (fog cloud) { ______________________Bk______________BkBk______________________ ______________________________Bk____CJ__________________________ ______________Bk________Bk____Bn____Bk________Bk________________ ________________Bk____CJ__Bk____CJBk__CPBkBnCJ__Bk__Bk__________ __________BkCJBn__CJ______CPBk__Bn____BkCJBk__Bm____CP__________ ______________Bk____BnBk____CJ__Bk__CP____Bn____CK____Bk________ ______Bk__CJ__BkCPBk____CPCPCPCPCP____CPCPCPCP__BkBmBx__Bm______ ______CJBn____CPBk__CP__CPCPCP__CPCPCP__CPCPCP__CKBkCP____Bk____ ________Bk__BkBkCPCP__CPCPCPCPCPCPCmCPCmCP__CP____Bm__Bk________ Bk__Bk____Bn______CPCP__CPCPCmCPCmCmCm__CPCmCPCPCP__Bk__CK______ __Bn__CJ__CJ__CPCPCP__CmCmCmCmCmCmCmCmCmCPCPCPCPCPCP______BkBn__ CJ____Bk__BkCPCPCPCPCmCmC$CmCmC$C$CmC$CmCmCmCm__CPCPCP__Bm__CJ__ __BkCP__Bk__CPCPCPCmCmCmCmC$C$C$CmC$CmCmCmCPCmCm__CPCP____Bl____ Bk______CJ__CP__CPCmCmC$CmC$C$C$C$C$C$CmCmCmCmCPCmCPCPBl__COBk__ __BkBk__Bk__CPCPCPCmCPC$C$C$C$C$C$C$CmC$CmCmCm__CmCPBkCW________ ____Bn__CPBkCPCPCPCPCmCmCmC$C$C$C$C$C$C$CmCmCPCmCmCPCPCVBkBl__Bk ____CJ______CPCP__CmCmCmC$CmC$C$C$CmC$CmCmCmCm__CPCP____CP______ __Bk__BkBk____CPCPCmCPCmCmC$C$CmC$C$CmC$CmCPCmCm__CPCP____CO__Bk __CJ__BnCJBnCPCPCPCPCmC$CmCmC$C$CmCmCmCmCmCm__CmCmCPCPCP__BlBk__ __BnCJBk__BkCPCP__CPCmCmCmCmCmCmCmCPCmCmCmCPCm____CPCPCP__CO____ ____Bk__CJBn____CPCP__CPCmCmCPCmCmCmCmCPCm__CmCPCPCPCP__Bk______ __Bk__Bk__CJ__Bk______CP__CmCmCP__Cm__CmCPCPCP__CP____BlCOBlBk__ Bk__CP____BkBn__CPCPBkCPCPCPCPCmCPCPCP__CP__CPCPCPCPBk____BkCP__ ____BkBk____BkCJBkCP____CP__CP__CPCPCPCPCP__CP____CO__Bk________ Bk__CPBkCPBkCP__BnCPCPCPCP__CPCP__CPCP__CPCPBkBl__________Bk____ ________BkBnBkBkCJ__BkCPCP__CPCPCP__CPCP__Bm____Bk__CJBn________ ____Bk______CJ________CJBnBkCPCPCP__Bk____CK__Bm________Bk______ ________CPBk__BkCPBk__Bk__BkCPBk____CJBnBk__CJ__Bl____Bk________ ____________Bk______CJ______BkBk__Bk__Bk____Bm__CJ______________ ______________Bk______CJBk______CJ__CP____Bl______Bm____________ ________________BkBn__Bk____CJBm________Bk__CJ__________________ ________________________CJBmBl__Bk______________________________ } # tile 108 (dust vortex) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________BSBSBSBSBSBSBSBSBSBSBS__________ ________________________BSBSBSBSAYAYAYAYAYAYAYAYAYAYBSBSBS______ ______________________BSBSBSAYAYBSBSBSBSBSBSBSBSAYAYAYAYBSBS____ ____________________BSBSAYAYBSBSAYAYAYAYAYAYAYAYBSBSBSAYBSBS____ ____________________BSAYAYBSAYAYAYAYAYBSAYAYBSAYBSAYAYCFCFCF____ ____________________BSBSAYAYAYBSBSBSBSBSBSBSAYAYAYAYCFCFCF______ ______________________AYBSBSBSBSAYAYAYAYAYAYBSBSBSCFBSCFCF______ ______________________AYAYBSBSBSBSBSBSBSBSBSBSBSBSCFCFCF________ ______________________AYAYAYAYAYBSBSBSBSBSBSBSCFBSBSCFCF________ ______________________AYBSAYBSBSBSAYAYAYBSBSBSBSCFCFCFCF________ ______________________AYAYAYBSAYAYBSBSBSBSBSBSBSBSCFCF__________ ______________________BSAYAYAYBSBSBSBSCFCFBSCFCFBSCF____________ ______________________AYAYBSBSAYAYBSBSBSBSCFBSBSCFCF____________ ____________________AYAYAYAYAYBSBSBSBSBSBSBSBSCFCF______________ ____________________AYAYAYBSAYAYAYBSCFBSCFCFCFCF________________ ____________________AYBSAYAYBSBSBSBSBSBSBSCFCF_A_A_A_A_A_A______ ____________________AYAYAYAYAYAYBSBSCFCFCFCF_A_A_A_A_A_A_A______ __________________AYBSAYBSBSBSBSBSBSBSCFCF_A_A_A_A_A_A_A_A______ __________________AYBSAYAYAYBSBSBSCFCFCF_A_A_A_A_A_A_A_A_A______ ________________AYAYAYBSBSBSBSCFCFCF_A_A_A_A_A_A_A_A_A__________ ________________AYBSBSBSBSBSCFCFCF_A_A_A_A_A_A_A_A_A____________ ______________BSAYAYAYBSBSCFCF_A_A_A_A_A_A_A_A_A_A______________ ____________AYAYBSBSBSBSCF_A_A_A_A_A_A_A_A_A_A__________________ ____________BSAYBSCFCF_A_A_A_A_A_A_A_A_A_A_A____________________ ________AYAYAYBSCF_A_A_A_A_A_A_A_A_A_A__________________________ ______AYAYBSBS_A_A_A_A_A_A_A_A_A________________________________ ______AYBS_____A_A_A_A_A_A______________________________________ _________A_A_A_A________________________________________________ } # tile 109 (ice vortex) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ _________________________________f_f_f_f_f_f_f_f_f_f_f__________ _________________________f_f_f_f_a_a_a_a_a_a_a_a_a_a_f_f_f______ _______________________f_f_f_a_a_f_f_f_f_f_f_f_f_a_a_a_a_f_f____ _____________________f_f_a_a_f_f_a_a_a_a_a_a_a_a_f_f_f_a_f_f____ _____________________f_a_a_f_a_a_a_a_a_f_a_a_f_a_f_a_a_k_k_k____ _____________________f_f_a_a_a_f_f_f_f_f_f_f_a_a_a_a_k_k_k______ _______________________a_f_f_f_f_a_a_a_a_a_a_f_f_f_k_f_k_k______ _______________________a_a_f_f_f_f_f_f_f_f_f_f_f_f_k_k_k________ _______________________a_a_a_a_a_f_f_f_f_f_f_f_k_f_f_k_k________ _______________________a_f_a_f_f_f_a_a_a_f_f_f_f_k_k_k_k________ _______________________a_a_a_f_a_a_f_f_f_f_f_f_f_f_k_k__________ _______________________f_a_a_a_f_f_f_f_k_k_f_k_k_f_k____________ _______________________a_a_f_f_a_a_f_f_f_f_k_f_f_k_k____________ _____________________a_a_a_a_a_f_f_f_f_f_f_f_f_k_k______________ _____________________a_a_a_f_a_a_a_f_k_f_k_k_k_k________________ _____________________a_f_a_a_f_f_f_f_f_f_f_k_k_A_A_A_A_A_A______ _____________________a_a_a_a_a_a_f_f_k_k_k_k_A_A_A_A_A_A_A______ ___________________a_f_a_f_f_f_f_f_f_f_k_k_A_A_A_A_A_A_A_A______ ___________________a_f_a_a_a_f_f_f_k_k_k_A_A_A_A_A_A_A_A_A______ _________________a_a_a_f_f_f_f_k_k_k_A_A_A_A_A_A_A_A_A__________ _________________a_f_f_f_f_f_k_k_k_A_A_A_A_A_A_A_A_A____________ _______________f_a_a_a_f_f_k_k_A_A_A_A_A_A_A_A_A_A______________ _____________a_a_f_f_f_f_k_A_A_A_A_A_A_A_A_A_A__________________ _____________f_a_f_k_k_A_A_A_A_A_A_A_A_A_A_A____________________ _________a_a_a_f_k_A_A_A_A_A_A_A_A_A_A__________________________ _______a_a_f_f_A_A_A_A_A_A_A_A_A________________________________ _______a_f_____A_A_A_A_A_A______________________________________ _________A_A_A_A________________________________________________ } # tile 110 (energy vortex) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________CICICICICICICICICICICI__________ ________________________CICICICIBWBWBWBWBWBWBWBWBWBWCICICI______ ______________________CICICIBWBWCICICICICICICICIBWBWBWBWCICI____ ____________________CICIBWBWCICIBWBWBWBWBWBWBWBWCICICIBWCICI____ ____________________CIBWBWCIBWBWBWBWBWCIBWBWCIBWCIBWBWCfCjCf____ ____________________CICIBWBWBWCICICICICICICIBWBWBWBWCfCjCf______ ______________________BWCICICICIBWBWBWBWBWBWCICICICjCICfCj______ ______________________BWBWCICICICICICICICICICICICICfCjCf________ ______________________BWBWBWBWBWCICICICICICICICfCfCICfCj________ ______________________BWCIBWCICICIBWBWBWCICICICfCfCfCjCf________ ______________________BWBWBWCIBWBWCICICICICICICICICjCf__________ ______________________CIBWBWBWCICICICICjCfCICjCfCfCf____________ ______________________BWBWCICIBWBWCICICICICfCfCICfCj____________ ____________________BWBWBWBWBWCICICICICICICICcCjCf______________ ____________________BWBWBWCIBWBWBWCICfCfCfCjCfCj________________ ____________________BWCIBWBWCICICICICICICcCjCf_z_A_A_A_A_A______ ____________________BWBWBWBWBWBWCICICjCfCjCf_$_A_A_A_A_A_A______ __________________BWCIBWCICICICICICICcCjCf_z_A_A_A_A_A_A_A______ __________________BWCIBWBWBWCICICICfCjCf_$_L_A_A_A_A_A_A_A______ ________________BWBWBWCICICICICjCfCj_z_z_A_A_A_A_A_A_A__________ ________________BWCICICICICICfCfCj_$_A_A_A_A_A_A_A_A____________ ______________CIBWBWBWCICICfCj_z_z_A_A_A_A_A_A_A_A______________ ____________BWBWCICICICICj_$_z_A_A_A_A_A_A_A_A__________________ ____________CIBWCICjCf_z_A_A_A_A_A_A_A_A_A_A____________________ ________BWBWBWCICf_$_z_A_A_A_A_A_A_A_A__________________________ ______BWBWCICI_z_A_A_A_A_A_A_A_A________________________________ ______BWCI_____A_A_A_A_A_A______________________________________ _________A_A_A_A________________________________________________ } # tile 111 (steam vortex) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________CPCPBkCPCPBnCJCPCPBnCJ__________ ________________________CPBkCPCPBDBdBdBdBdBdBdBdBDBdCPBnCP______ ______________________CPBnCPBDBdCPCJBnCPCJBnCPCJBdBdBdBdCJBn____ ____________________BnCJBdBdCJBnBdBdBdBdBdBdBdBdBnCPCPBDCPCP____ ____________________CPBdBdCPBdBdBdBdBdCPBDBdCPBDCPBDBDCmCmCV____ ____________________BkCPBdBdBdCPBkCPCPBkCPCPBdBdBdBdCmCmCm______ ______________________BdCPBkCPCPBdBdBDBdBdBDCPCJCPCmCPCmCm______ ______________________BdBDCPCPBkCPBkCPCPCPCPBkCPBnCmCVCm________ ______________________BdBdBdBDBdCPCPBkCPBkCPCPCVCPCJCmCm________ ______________________BdCPBdCPBkCPBdBdBDCPCPBkCPCmCmCmCm________ ______________________BdBdBdCPBdBdCPCJBnCJBnCPCJBnCmCm__________ ______________________CPBdBDBdBnCJBnCPCmCmCJCmCmCPCm____________ ______________________BDBdCPCJBdBdCPBkCPCPCmBnCPCVCm____________ ____________________BdBdBdBdBdCPBkCPCPBkCPBnCJCmCm______________ ____________________BdBdBdCPBDBdBdCPCVCPCmCmCmCm________________ ____________________BdCPBdBDCPCPBkCPCPBkCPCmCm_A_A_A_A_A_A______ ____________________BdBdBdBdBdBdCPBkCmCmCmCm_A_A_A_A_A_A_A______ __________________BDCPBdCJBnCPBkCPCPCPCmCm_A_A_A_A_A_A_A_A______ __________________BdCPBDBdBdCPCPBkCmCmCm_A_A_A_A_A_A_A_A_A______ ________________BdBdBdBnCPCPBkCmCmCm_A_A_A_A_A_A_A_A_A__________ ________________BdCPCJCPBkCPCmCmCm_A_A_A_A_A_A_A_A_A____________ ______________CPBdBdBdBnCPCmCm_A_A_A_A_A_A_A_A_A_A______________ ____________BdBDCPBkCPCJCm_A_A_A_A_A_A_A_A_A_A__________________ ____________CPBdCPCmCm_A_A_A_A_A_A_A_A_A_A_A____________________ ________BdBdBdCJCm_A_A_A_A_A_A_A_A_A_A__________________________ ______BdBDCPCP_A_A_A_A_A_A_A_A_A________________________________ ______BdCP_____A_A_A_A_A_A______________________________________ _________A_A_A_A________________________________________________ } # tile 112 (fire vortex) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________CBCBCBCBCBCBCBCBCBCBCB__________ ________________________CBCBCBCBBNBNBNBNBNBNBNBNBNBNCBCBCB______ ______________________CBCBCBBNBNCBCBCBCBCBCBCBCBBNBNBNBNCBCB____ ____________________CBCBBNBNCBCBBNBNBNBNBNBNBNBNCBCBCBBNCBCB____ ____________________CBBNBNCBBNBNBNBNBNCBBNBNCBBNCBBNBNCuCuCu____ ____________________CBCBBNBNBNCBCBCBCBCBCBCBBNBNBNBNCuCuCu______ ______________________BNCBCBCBCBBNBNBNBNBNBNCBCBCBCuCBCuCu______ ______________________BNBNCBCBCBCBCBCBCBCBCBCBCBCBCuCuCu________ ______________________BNBNBNBNBNCBCBCBCBCBCBCBCuCBCBCuCu________ ______________________BNCBBNCBCBCBBNBNBNCBCBCBCBCuCuCuCu________ ______________________BNBNBNCBBNBNCBCBCBCBCBCBCBCBCuCu__________ ______________________CBBNBNBNCBCBCBCBCuCuCBCuCuCBCu____________ ______________________BNBNCBCBBNBNCBCBCBCBCuCBCBCuCu____________ ____________________BNBNBNBNBNCBCBCBCBCBCBCBCBCuCu______________ ____________________BNBNBNCBBNBNBNCBCuCBCuCuCuCu________________ ____________________BNCBBNBNCBCBCBCBCBCBCBCuCu_A_A_A_A_A_A______ ____________________BNBNBNBNBNBNCBCBCuCuCuCu_A_A_A_A_A_A_A______ __________________BNCBBNCBCBCBCBCBCBCBCuCu_A_A_A_A_A_A_A_A______ __________________BNCBBNBNBNCBCBCBCuCuCu_A_A_A_A_A_A_A_A_A______ ________________BNBNBNCBCBCBCBCuCuCu_A_A_A_A_A_A_A_A_A__________ ________________BNCBCBCBCBCBCuCuCu_A_A_A_A_A_A_A_A_A____________ ______________CBBNBNBNCBCBCuCu_A_A_A_A_A_A_A_A_A_A______________ ____________BNBNCBCBCBCBCu_A_A_A_A_A_A_A_A_A_A__________________ ____________CBBNCBCuCu_A_A_A_A_A_A_A_A_A_A_A____________________ ________BNBNBNCBCu_A_A_A_A_A_A_A_A_A_A__________________________ ______BNBNCBCB_A_A_A_A_A_A_A_A_A________________________________ ______BNCB_____A_A_A_A_A_A______________________________________ _________A_A_A_A________________________________________________ } # tile 113 (baby long worm) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________CICICICI________________ ______________________________________CICIBvBvBvBv______________ ____________________________________CICIBvBvCBCBCBBv____________ __________BvBvBv____________________CIBvBvBWCBCBCBBv____________ ________BvBvBvCICI________________CIBvBvBWBWCBCBCBBv____________ ________BWAbBvCIBvBv______________CIAbBvBWBWBWBWBW______________ _________ABWBvBvCICICI____________CIBvByBWBWBy__________________ _______A_ABWBWAbBvCIBvBv________CIBvBvBWBW_______A_A_A_A________ _______ABy_ABWBWBvBvCICICICI____CIAbBvBWBW___A_A_A_A_A_A_A______ _______A_A_A_ABWBWAbBvBvBvBvCICIBvBvByBWBWBy_A_A_A_A_A_A_A______ ___________ABy_ABWBWBvAbBvCICIBvBvBvBWBW_A_A_A_A_A_A____________ ___________A_A_A_ABWBWBWBvAbBvAbBvByBW_ABy_A_A_A________________ _______________ABy_A_ABWBWBWBvBvBWBWBW_A_A_A____________________ _________________A_A_ABy_ABWBWByBWBWBy_A_A______________________ _____________________A_A_ABy_A_A_A_A_A_A________________________ _________________________A_A_A_A_A_A____________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 114 (baby purple worm) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________CCCCCCCC________________ ______________________________________CCCCBpBpBpBp______________ ____________________________________CCCCBpBpCuCuCuBp____________ __________BpBpBp____________________CCBpBpBOCuCuCuBp____________ ________BpBpBpCCCC________________CCBpBpBOBOCuCuCuBp____________ ________BO_ABpCCBpBp______________CCBpBpBOBOBOBOBO______________ _________ABOBpBpCCCCCC____________CCBpCzBOBOCz__________________ _______A_ABOBO_ABpCCBpBp________CCBpBpBOBO_______A_A_A_A________ _______ACF_ABOBOBpBpCCCCCCCC____CCBpBpBOBO___A_A_A_A_A_A_A______ _______A_A_A_ABOBO_ABpBpBpBpCCCCBpBpCzBOBOCz_A_A_A_A_A_A_A______ ___________ACF_ABOBOBp_ABpCCCCBpBpBpBOBO_A_A_A_A_A_A____________ ___________A_A_A_ABOBOBOBp_ABpBpBpCcBO_ACc_A_A_A________________ _______________ACF_A_ABOBOBOBpBpBOBOBO_A_A_A____________________ _________________A_A_ACF_ABOBOCFBOBOCF_A_A______________________ _____________________A_A_ACF_A_A_A_A_A_A________________________ _________________________A_A_A_A_A_A____________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 115 (long worm) { ____________________CICICIBvCICIBvBWBWBWBWBWATCI________________ ________________CICICICIBvCIATATATBWCmCmCmATATBWBWCICI__________ ____________CIBvCICICICICIBWBWATATATCmCmCmATCmCmBWBWBWCI________ __________BWBWBvBvBvBvBvBWBWBWCmATATATCmATATCmATCmBWBWBWCI______ ________BWBWBvBvCICICIATBWBWCmCmCmATATATATATATATCmCmATATBv______ ______BWBvCIBvCICICIATATATATATATATATATATATATATATCmATATATBWCI____ ____BWBWBvBvBvCIBvCIBWBWBWCmATATATATATATATATATATATATCmBWBWCI____ __BWBWBWCfCfCfCIBvCIBvBWBWCmCmCmATATATATATATATATATCmCmCmBWCICI__ __BWBWCf_A_ACfCICIBvCIBWBWCmCmATATATATATATATATATATATATATATBWBv__ AzBWBvCf_A_ACfCIBvCIBvBWBWBWCmATATATATATATATATATATATATCmBWBWCICI AzBWBvBvCfCfBvCICICICICIBWATATATATATATATATATATATATATCmCmBWBWBvBv AzBWBWBWBWCIBvCIBvBvBvBvATATBWCmCmCmATATATATATATCmATATATBWBWBvCI AzBWBvBvBWBvBvBvCICIBvCICIBWBWBWCmCmATATCmATATATCmCmATATATBWCIBv AzBWBvBvBvBvCIBvCIBvBvCICIBvBWBWBWBWATATCmCmATATCmBWBWATATBvCIBW AzBWBvBvBWBvBvBvBWBvCICIBvCICIBWBWBWATATBWBWBWATBWBWBWBWBvCICIBW AzBWBWBvBWBvBWBWBWCIBvCICIBvCICIBWBWATATBWBWBWATBWBWCIBvCIBvBvBW AzAzBWBWBWBvBWBvCIBvCICIBvCICIBvBvBWATBWBWCIBWCIBvCICICIBvBvCIBW AbAzBWBvBvBWBWBvBvBvBvCICICIBvBvBvBvCIBvCICIBvBvBWBvCIBvCIBvBvBW AbAzBWBvBvBWBvBvBvBvBvBvCIBvCICIBvCIBvCIBvCICIBvBWBvBvCICfCfBvBW AbAzBWBWBvBWBvCfCfCfCfCICIBvCICIBWCICICICIBvBvCIBWBvCICf_A_ACfBW AbAzBWBWBvBWBvCf_A_ACfCfBvCIBvBvBWBvBvCIBvBvCIBvBWBWBvCf_A_ACfBW AbAbAzBWBvBWBv_A_A_ACICfBvBvCIBvAbBvCIBvBvBvBvBvBvBWBvCf_A_ACfBW __AbAzBWBWBWBvCf_A_ACfCfBWCIBvCIBWBvCIBvBvCIBvCIBvBWBvBvCfCfBWBW __AbAbAzBWBWBvBvBvBvBvBvBWBvBvBvBWBvBvBWBWCIBvBvBvBWBWBvBWBvBWAz ____AbAzAzBWBWBvBvBvBWBvBWBvBvBvBWBvBvBWBvBvBvBvBWBvBWBvBWBvBWAz ____AbAbAzAzBWBWBvBvBWBvBvBWBvBvBWBvBvBWCfCfCfBvBWBvBWBvBWBWAz__ ______AbAbAbAzBWBWBWBvBvBvBWBvBvBWBvBWBvCf_A_ABvBvBWBWBvBWAzAz__ ________AbAbAbAzBWBWBWBvBvBWBvBvBWBvBWBvCf_A_ACfBvBWBWBWBWAz____ ____________AbAbAzAzBWBWBWBWBWBvBWBvBWBvBvCfCfCfBWBWBWBWAzAb____ ______________AbAbAzBWBWBWBWBWBWBWBWBWBWBWBWBWBWBWBWAzAzAb______ ________________AbAbAzAzAzAzAzBWBWBWBWBWBWBWBWBWAzAzAbAb________ ____________________AbAbAbAbAbAzAzAzAzAzAzAzAzAzAbAb____________ } # tile 116 (purple worm) { ____________________CCCCCCBpCCCCBpBOBOBOBOBOATCC________________ ________________CCCCCCCCBpCCATATATBOCmCmCmATATBOBOCCCC__________ ____________CCBpCCCCCCCCCCBOBOATATATCmCmCmATCmCmBOBOBOCC________ __________BOBOBpBpBpBpBpBOBOBOCmATATATCmATATCmATCmBOBOBOCC______ ________BOBOBpBpCCCCCCATBOBOCmCmCmATATATATATATATCmCmATATBp______ ______BOBpCCBpCCCCCCATATATATATATATATATATATATATATCmATATATBOCC____ ____BOBOBpBpBpCCBpCCBOBOBOCmATATATATATATATATATATATATCmBOBOCC____ __BOBOBOCZCZCZCCBpCCBpBOBOCmCmCmATATATATATATATATATCmCmCmBOCCCC__ __BOBOCZ_A_ACZCCCCBpCCBOBOCmCmATATATATATATATATATATATATATATBOBp__ ArBOBpCZ_A_ACZCCBpCCBpBOBOBOCmATATATATATATATATATATATATCmBOBOCCCC ArBOBpBpCZCZBpCCCCCCCCCCBOATATATATATATATATATATATATATCmCmBOBOBpBp ArBOBOBOBOCCBpCCBpBpBpBpATATBOCmCmCmATATATATATATCmATATATBOBOBpCC ArBOBpBpBOBpBpBpCCCCBpCCCCBOBOBOCmCmATATCmATATATCmCmATATATBOCCBp ArBOBpBpBpBpCCBpCCBpBpCCCCBpBOBOBOBOATATCmCmATATCmBOBOATATBpCCBO ArBOBpBpBOBpBpBpBOBpCCCCBpCCCCBOBOBOATATBOBOBOATBOBOBOBOBpCCCCBO ArBOBOBpBOBpBOBOBOCCBpCCCCBpCCCCBOBOATATBOBOBOATBOBOCCBpCCBpBpBO ArArBOBOBOBpBOBpCCBpCCCCBpCCCCBpBpBOATBOBOCCBOCCBpCCCCCCBpBpCCBO AUArBOBpBpBOBOBpBpBpBpCCCCCCBpBpBpBpCCBpCCCCBpBpBOBpCCBpCCBpBpBO AUArBOBpBpBOBpBpBpBpBpBpCCBpCCCCBpCCBpCCBpCCCCBpBOBpBpCCCZCZBpBO AUArBOBOBpBOBpCZCZCZCZCCCCBpCCCCBOCCCCCCCCBpBpCCBOBpCCCZ_A_ACZBO AUArBOBOBpBOBpCZ_A_ACZCZBpCCBpBpBOBpBpCCBpBpCCBpBOBOBpCZ_A_ACZBO AUAUArBOBpBOBp_A_A_ACCCZBpBpCCBpAUBpCCBpBpBpBpBpBpBOBpCZ_A_ACZBO __AUArBOBOBOBpCZ_A_ACZCZBOCCBpCCBOBpCCBpBpCCBpCCBpBOBpBpCZCZBOBO __AUAUArBOBOBpBpBpBpBpBpBOBpBpBpBOBpBpBOBOCCBpBpBpBOBOBpBOBpBOAr ____AUArArBOBOBpBpBpBOBpBOBpBpBpBOBpBpBOBpBpBpBpBOBpBOBpBOBpBOAr ____AUAUArArBOBOBpBpBOBpBpBOBpBpBOBpBpBOCZCZCZBpBOBpBOBpBOBOAr__ ______AUAUAUArBOBOBOBpBpBpBOBpBpBOBpBOBpCZ_A_ABpBpBOBOBpBOArAr__ ________AUAUAUArBOBOBOBpBpBOBpBpBOBpBOBpCZ_A_ACZBpBOBOBOBOAr____ ____________AUAUArArBOBOBOBOBOBpBOBpBOBpBpCZCZCZBOBOBOBOArAU____ ______________AUAUArBOBOBOBOBOBOBOBOBOBOBOBOBOBOBOBOArArAU______ ________________AUAUArArArArArBOBOBOBOBOBOBOBOBOArArAUAU________ ____________________AUAUAUAUAUArArArArArArArArArAUAU____________ } # tile 117 (grid bug) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ _______________________q_q_q_q_q________________________________ ___________________q_q_t_t_t_t_t_t_t____________________________ _________________q_q_t_t_t_q_q_c_c_c_c__________________________ _______________q_q_t_t_t_q_q_c_q_q_q_q_q________________________ _______________m_m_m_m_h_q_c_q_q_q_q_t_m_m_A____________________ _____________q_t_t_t_q_q_c_q_q_q_q_t_t_m_m_A_A_A________________ _____________qCY_t_q_q_q_q_h_q_q_t_t_q_m_m_A_A_A________________ ____________CYCuCu_q_q_q_q_q_h_q_t_q_q_m_m_A_A_A________________ __________BoCYCuCu_q_q_q_q_q_q_h_q_q_m_m_m_A_A_A________________ __________BoCYCu_m_q_qCuCu_q_q_q_h_m_m_m_m_A_A_A________________ __________BoCYCY_m_mCuCuCuCu_q_q_h_m_m_m_A_A_A_A________________ __________BoBoCB_mCuCuCuCuCYCY_q_m_h_m_m_A_A_A__________________ ___________ABoCB_mCYCYCYCYCYBo_m_m_h_m_A_A_A_A__________________ ___________A_A_A_mBoBoBoBoBoBo_m_m_A_A_A_A_A_A__________________ ___________A_A_A_ABoBoBoBoBoBoBo_A_A_A_A_A_A____________________ _____________A_A_A_A_A_A_A_A_A_A_A_A_A_A________________________ _______________A_A_A_A_A_A_A_A_A_A_A_A__________________________ _____________________A_A_A_A_A_A________________________________ ________________________________________________________________ } # tile 118 (xan) { ________________________________________________________________ ________________________________________________________________ _______________r_i_i_i__________________________________________ _____________r_n_n_n_i_i_______________________n_n_n_n__________ _________________n_r_n_i_i_________________n_r_n_i_i_i_i________ ___________________n_r_n_i_i_____________n_r_i_i_i______________ _____________________n_r_n_i___________n_r_n_i__________________ _______________________n_r_i_i_______r_n_i_i____________________ _________________________n_n_i_______r_i_i______________________ __CmCmCmCVCVCVCVCV_______i_n_i_______n_i________________________ ____CPCPBDBdBdCPBdCmCm_____i_i_____n_i_i________________________ ______BDCPBdCmCmCVCPBdCm_____n_i___n______CVCVCVCVCVCV__________ ____________BdBdBdCPCPCPCVCm_n_i___i__CVCVCPBdCmCPBdBdCVCV______ ________________CPBdCVBdBDCPCm_n___iCVBDCPBdCmBdBDCPCmCPBdCVCV__ ____________________________Bp_i_n_nBpCPBDBdCmBdCPBDCPCVCPBnBdCV _______________________d_dCvCCBp_iCvCCBp________CPBkBdCmBDBd____ _____________________d_d__CCBpCv_iCCBpCv_d______________________ _________________d_d_d______Cv_i_i_iCv___d_d____________________ _________________d________CIBv_d_dBvCI_d___d_d__________________ _______________d_d_____dCIBv________BvCI_d___d__________________ _____________________d_dCIBvCI____CIBvCI_d___d__________________ _____________________d__CIBW________BWCI_d_A_A_A_A_A____________ _____________________d____BvCI____CIBv_A_d_d_A_A_A_A_A__________ ___________________d_______A_A_A_A_A_A_A_A_d_A_A_A_A_A__________ ___________________d___A_A_A_A_A_A_A_A_A_A_d_A_A_A_A_A__________ _______________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A__________ _____________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A____________ _______________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A____________ _________________________A_A_A_A_A_A_A_A_A_A_A_A________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 119 (yellow light) { ______________________________Cj________________________________ ____________________CM______CMCjCM__CM__________________________ ______________CM________CM____Cj____CM________CM________________ ________________CM____CM__CM__CjCMCM__CMCMCMCM__CM__CM__________ __________CMCMCM__CM______CMCjCjCj____CMCMCM__CM____CM__________ ______________CM____CMCM____CjCjCj__Cj____CM____CM____CM________ ______CM__CM__CMCMCM____CjCjCjCjCj____CjCjCjCj__CMCMCM__CM______ ______CMCM____CMCM__Cj__CjCjCjCjCjCjCj__CjCjCj__CMCMCM____CM____ ________CM__CMCMCjCj__CjCjCjCjC$CjCjCjCjCj__Cj____CM__CM________ ____CM____CM____CMCjCj__CjCjCjC$CjCjCj__CjCjCjCjCj__CM__CM______ __CM__CM__CM__CjCMCj__CjCjCjCjC$CjCjCjCjCjCjCjCjCjCj______CM____ ______CM__CMCjCjCjCjCjCjC$CjCjC$C$CjC$CjCjCjCj__CjCjCj__CM__CM__ __CMCM__CM__CjCjCjCjCjCjCjC$C$C$CjC$CjCjCjCjCjCj__CjCj____CM____ CM______CM__CjCjCjCjCjC$CjC$C$C$C$C$C$CjCjCjCjCjCjCjCjCM__CMCM__ __CMCM__CMCjCjCjCjCjCjC$C$C$C$C$C$C$CjC$CjCjCj__CjCjCMCj________ CM__CjCjCjCjCjCjCjC$C$C$C$C$C$C$C$C$C$C$C$C$C$C$CjCjCjCjCjCjCjCj ____CM__Cj__CjCj__CjCjCjC$CjC$C$C$CjC$CjCjCjCj__CjCj____CjCj____ __CM__CMCM____CjCjCjCjCjCjC$C$C$C$C$CjC$CjCjCjCj__CjCj____CM__CM __CM__CMCMCMCjCjCjCjCjC$CjCjC$C$C$CjCjCjCjCj__CjCjCjCjCj__CMCM__ __CMCMCM__CMCjCj__CjCjCjCjCjCjC$CjCjCjCjCjCjCj____CjCjCj__CM____ ____CM__CMCM____CjCj__CjCjCjCjC$CjCjCjCjCj__CjCjCjCjCj__CM______ __CM__CM__CM__CM______Cj__CjCjC$__Cj__CjCjCjCj__Cj____CMCMCM____ ____CM____CMCM__CjCjCMCjCjCjCjCjCjCjCj__Cj__CjCjCjCjCM____CM____ ____CMCM____CMCMCMCj____Cj__CjCjCjCjCjCjCj__Cj____CM__CM________ ______CMCMCMCM__CMCjCjCjCj__CjCj__CjCj__CjCjCMCM________________ ________CMCMCMCMCM__CMCjCj__CjCjCj__CjCj__CM____CM__CMCM________ ____CM______CM________CMCMCMCjCjCj__CM____CM__CM________CM______ ________CMCM__CMCMCM__CM__CMCjCjCj__CMCMCM__CM__CM______________ ____________CM______CM______CMCj__CM__CM____CM__CM______________ ______________CM__CM__CMCM____CjCM__CM____CM______CM____________ ______________________CM____CMCj________CM______________________ ______________________________Cj________________________________ } # tile 120 (black light) { ________________AT____Aq______AT______AqAq______________________ __________________ATAT____ATATAqATATAq__________________________ ____________ATAc____AT__AOAT__AqAT__Aq____AV__AV________________ ________________Ac____ATATAT__ATAO__AVABAV__AV______AV__________ ________AMAMAMAMAOAc____AT__ATATAOAVAVABABAVABAV____AV__________ ______________AMAOAOATATAT__AT__AOAVAOAVAVABABAVAV____AV________ ______AM__Ac__AMAMAMAOAOATATATATATATAOAVAVABAVABAVAVAV__________ ______AMAM____AMAMAOAOAcATATATATAOAqAqAsABAVAVABAVAVAVAV__AV____ ________AM__AMAM_XAcAcABATAqAqAqAOAqAsAsAsABAVABABAVABABAV______ ____Ac____AMAOAOAOAcAcAqAqAqAqATAqAqAqAOAsAsAsAVAVABAB_E__AV____ __Ac__Ac__AMAOAMAcAcAcAcAqAqBNAqAqBPAqAqAOAsAsAVAVAV_E_E_EAVAB__ Ac____Ac__AMAMAMAMAcAcAqAqAYBNBNAqBPBPBPAO_FAsAsAVAVAV_EABABAB__ __AcAcAO_XAOAMAMAcAcAqAqAzBWALBNBPBP_G_G_GAs_FAsABAVAV_E_EAB____ AcAOAOAO_XAOAM__AcAcAqBWAgAzAcATBPBP_GAsAs_F_FAsAVAVAVAB_E__AB__ ___X_X_X_XAOAMAcAcACAqAz_AAQ_L_A_G_A_A_G_FAs_FAsABAVAB_E_E_E___E _____XAO_X_XAMAcAcACAOAQAQAQ_A_j_G_A_G_AAsAs_F_FAB_E_E_EAB___E_E _____XAOAOAOACAcACACAO_cAcAQAQ_j_A_G_G_FAsAs_F_F_E_EABAB_____E__ __ACAOAAACAOACACAcACAO_cAQAQ_j_j_A_j_j_EAs_F_F_F_F_E_EABAB____AB __AAAO_TAAACAAAC_XACAc_eAOAQ_A_X_j_j_e_F_F_F_e_F_F_E_E_EAB_E_E__ ___XAAACAO_T_c_XACACAC_e_eAQ_e_e_F_F_F_F_F_e_e_F_F_E_E_EAB______ ____ACAOAAACAOAO_XAC_XAcAOAOAQ_ZAO_Z_e_eAO_e_F_F_E_E_EAB_____E__ ___XAO_XAOAAAOAOAOAOACAC_X_c_eAQAQ_e_eAO_e_e_EAO_EAOAO_E_E_E____ _X__AAAOAOAC_TAOACAAAO_X_X_XAO_e_e_e_eAO_ZAO_Z_Z_E_ZABABAB_E_E__ _____TACAOAOAAACAAACAOAOAQAO_eAO_Z_Z_Z_Z_ZAO_ZABAB_EAB_E________ ____ACAA_TACAAAO_TAA_TACAAAO_Z_ZAO_Z_ZAO_Z_Z_Z_ZABABAB_____E____ ________AAAC_TAAACAOACAAACAO_Z_Z_ZAO_Z_ZAO_ZAOAO_ZAB_E_E________ _____X______AAAOAOAOAO_TAOAO_Z_Z_ZAO_ZAOAO_ZAO_ZAB_______E______ _________X_XAO_X_X_XAOAO_ZAOAO_ZAOAO_Z_Z_Z___ZAB_Z_____E________ _____X___X___X_______X_Z_Z_ZAOAO_Z_Z___Z_____Z___Z______________ _______________X______AOAO_Z_Z_Z_____Z_____Z_______Z____________ _________X_________X__AO_Z_Z___Z_________Z___Z__________________ _________________________________Z______________________________ } # tile 122 (couatl) { ________________________________________________________________ __CgCQ__________________________________________________________ ClCQCQCQBlCQCQCQ__________________________________________CQBlCQ __CWClChCoCiCQChCQ__________________________________CQCQCQChCl__ __________ChChCmChCQCQ________________________CQCQChCiChClCR__Cl ______CWCXCtChChCQCQCgCQCQ________________BlCQCQChChCoCh________ __________CPClChChCQChCQCQCQ____________CQChCoCKChCmCgCWClCg____ __________CiClCWCmChCoCQChBl____________ChCQCQChChCgClBm________ ______________CiClCWCgChChCmCQ________CQBlCgChCoCW______________ ____________CRClCOCXCoCgCgCoCK________CKCoCiBmChCgCl_________A_A __________________CgCPClBmChCOCQ____CQCQCQCgCOCW_________A_A_A_A ________________________ClCgChCgBlCQCRChBm_________A_A_A_A_A_A_A ______Co____Co____________CRCgCOCQCVCoCoCmCoCmCoCoCV_A_A_A_A_A__ Co__CVCo__CVCo______________CVCVCoCoCmCoCoCmCoCmCoCoCmCV_A_A____ CoCVCPCoCPCmCo______________CVCoCmCmCoCmCVCoCmCoCoCmCoCmCu_A____ __CoCVCmCoCPCo____________CVCmCVCmCVCWBlCPCPCoCVCmCoCmCoCm______ __CoCoCmCoCo______________CoCmCmCVBkCPCO_A_ACPCmCuCuCVCoCoCV____ ____CoCVCoCV______________CoCPCmCPCPCP_A_A_ABkCPCVCPCoCVCoCo____ ____CVCPCmCV______________CoCmCoCVCVCP_A_A_A_ABkCPCPCPCmCVCoCV__ ______CVCo______________CmCmCmCPBkCP_A_A_A_A_A_A_ACPCPCPCVCoCo__ ______CPCm______________CoCmCoCmBkBl_A_A_A_A_A_A_A____BkCPCV____ ______CPCP_______A_A_A__CmCoCPCVCPCO_A_A_A_A_A__________________ ______BkCm___A_A_A_A____CPCmCmBkCVBk_B_A_A_A_A__________________ ______CPCVCo_A_A_A_A__CoCmCoCmCVBk_A_A_A_A_A____________________ ________CPCmCo_A_A__CoCmCmCVBkCmCP_A_A_A_A_A____________________ ________BkCPCmCoCoCmCPCVCPCVCVCP_A_A_A_A_A_A____________________ __________CPBkCVCmCoCmBkBkCPCPCV_A_A_A_A_A_A____________________ __________BkCPBkCmBkCVCoCVCVBk_A_A_A_A_A_A______________________ ___________A_MCJBkCPBkCPCPBk_M_A_A_A_A__________________________ ___________A_A_A_MBkBkBk_A_z_A_A_A______________________________ _____________A_A_A_A_M_A_A_A_A_A________________________________ _________________A_A_A_A_A_A_A__________________________________ } # tile 124 (Angel) { ____________________________BdBkBk____________C$C$______________ ____________CVC$CV______BkBnBkBkBkBk________CVC$CVCVC$__________ __________C$CVC$CPCV__BkBkBwBkCTCnCPBk____C$CPCVCVCPC$__________ ________CVCoCPCVBnC$C$__BkBkCTBVCnBVBd____CoCPCVCoCPCPCP________ ______CVCPCVCPCoCVCVC$C$BkBkCTCnCnCnBd__C$CVC$CVC$CVC$CV________ ______CPC$CPCLCrCrCrCLCLCLBdBwCTCnBwBdC$CLCLCrCrCrCLCLC$CV______ ____C$BkC$CPCoCLCLCLCrCrCrCLCLBZBZBZCLCLCrCrCLCLBbCLCPCVC$______ ____C$CPCPCPC$CVCPCLCLCLCLCLCrCLBZCLCrCrCLCLCLCVCOC$CVC$CP______ __CVCVC$CVC$CV_I_ICLBbCLBvCUCLCLBZCLCLCLCLBZCrCLCKCVCPCoCVCV____ __CVCVCPCVC$_K_I_I_H_FCLCUBZCLCLBZCLCLBbBZCLCLCrCLCPCPC$CVC$____ CVCVC$BnCo_I_KCL_I_H_F_FCLCLBZBbCLBvBZCrCLBZCUCLCLBnCoCVCPCo____ CVCVC$CVC$_K_KCr_I_H_H_F_FCLBvCLCLCUCrCL__CLCLBZCLC$C$CPCPCV____ CVC$CPCP_I_K_KCr_I_H_H_F_FBzBbCLCLCLCrCL____BZCUCrCLCoCPCoCV____ CVCoCPC$_ICLCrCrCrCLCL_F_FCFCLCLBZCLCrCL___ACLCLCLCL__CPC$C$____ CVC$CPCP_I_K_KCr_I_H_H_F_FBZBbCLCLCLCLBZ_A_A__BZCLCUCrC$CVCP____ C$CVC$CV_I_K_KCr_I_H_H_F_FBZCLCLCLCLBZCLCL_A____CrCr____CVBk____ C$CVC$CV_I_K_KCL_I_H_H_F_FCLBZBWBbBZCLCLCrCLCLCrCrCm____CVC$CV__ C$C$CVC$C$_I_K_JCL_H_H_FCLCrCLCL_zCLBZCLCLCrCL_ACKCm______CPC$__ C$CPCVCVC$_I_K_JCL_H_F_FCLCLCLB__AB_B_CLBZCLCrCLCPBmCm____CKCV__ CVCoC$CVC$CV_I_JCL_H_F_FCLB_B_BZ_ABZCLB_BZBZCLCL_ACKCm______CV__ CPC$C$CPC$CV_I_J_H_H_FCLB_CLCLBZ_ABZBZCLCU_z_A_A_ACPBmCm________ __C$CVBnC$_____J_H_FCLB_CLBbBZBZ_ACLBZCLCLCL_A_A_A_ACPCm________ __CVCVCoCV_______H__CrCLCLCLBW_A_A_ABZCLBZCr_A_A_A_ACPBkCo______ ____CVC$CV__________CLCrCLBbBZ_A_A_ABZBbCLCr_A_A_A_A_ACPCm______ ____CVC$CV__________CLCLCLCLBZ_A_A_ABZCLCLCL_A_A_A_A_ACPBkCm____ ______CVCV__________CLCLBvBZ_A_A_A_ABZBZCLCrCr_A_A___A_ACPCm____ ______CVCV_________ACLBbCLBZ_A_A_A_A_A_ABZCLCLCL_A_____ACPCm____ ___________________ACLCrBbBZ_A_A_A_____A_A_A_A_A_A_______ACmCm__ _________________ACLCrBvCLCL_A_A_A_______________________ACPCm__ _________________ACrCLCUBbBZ_A_A___________________________ACm__ _________________ACLCLBZBZ_z_A_______________________________A__ ___________________A_A_z_z_A____________________________________ } # tile 125 (ki-rin) { ____________________CBCBCBCB____________________________________ ________________CrCsBkCPCP______CVCV____________________________ ____________CsCrCsCrCsCBCBCBCBCP________________________________ __________CcCrCsCrCsCsCrCVCVCVCPCVBnCP__________________________ __________CrCsCcCcCsCrCsCsCPCPCJ________________________________ ______CsCsCsCrCsCrCrCLCrCsCPBn______CVCV________________________ __CsCsCrCsCrCLCLCLBbBcCsCrCVCVCVCVCV____________________________ __CrCrCsCLCL______BLBLCLCrCPCJCP________________________________ ____CLCL__________BJAoCrCsCVCVCVCV__________________________CPCV ________________BLBLCrCLCrCPBn______BkCPCP________________CPCP__ ________________AjBcCLCsCVCPCVCVCPCP__________________CPCVCP____ ______________BmBmBmCrCrBnCPCJCP______________________CPCPCPCP__ ____________CrBDAoCLCLCsCsCV__________________________CL________ __________CrBmBmBmCsCrCsCrCLCs________________________CL________ ________CrCsBDAoCsCrCsCsCrCsCrCL________________________CL______ ______CrCsCLBLBLCLCsCsCLCLCrCLCsCrCL______________________CL____ ______CsCrCsBDAjCsCrCLCLCsCLCrCLCsCrCsCs__________________CL____ ____CsCLCL____AlCsCsCrBZBZCLCsCrCrCsCLCrCLCr____________CrCL____ ____CrBb________CsCLCLAOAlBZCLCLCsCLCrCsCrCsCr________CrCL______ ____CLCL________CsCLCLAlAOAlAOBZCLCLCsCrCLCsCLCrCsCrCLCL________ ______CL________CrCLBZ____AOAlAlAOBZBZCLCsCLCsCsCr______________ ______CLCL______CrCL________BZAOAOAOAlB_CrCrCLCrCL______________ ________Bv________BZ________CLBZB_BZB_BZCLCLCrCsCr______________ ________CLCL______CrCL______BZB_BZB___B_B_CLCLCrCs______________ __________Bb________CLCL______BZB_B_______BZCrCLCr______________ __________CLB_______CLBb_A_A_A_ABZB__A_A____BZBZBZCrCr__________ __________BZB____A_A_ACL_z_A_A_AB_B_B__A_A_A_A_ABZBZCLCr________ _________________A_A_ACLB__A_A_A_ABZB_B_B__A_A_A_A_ABZCLCr______ _________________A_A_ABZB__A_A_A_A_A_A_AB_BZ_A_A_A_A_A_ABZCr_A_A _____________A_A_A_A_A_A_A_A_A_A_A_A_A_AB_B__A_A_A_A_A_A_ABZCL_A ___________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_AB_BZ_A ___________________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A } # tile 126 (Archon) { ____________________________CjCjCsCj____________________________ __________________________CjAlAlBJCj______CnCi__________________ __________________________BkBcBDBD_LCj____BrClCn________________ __________________________CkCiCnCiCjCj____Br__CiCi______________ __________________________CjCMCnCkBrBrBrBrBrBrBrCEBr____________ ________________________CjCMCnCiCnBrCT________CiCnBr____________ ________________________CiCiCnCiCiCECgCgClCnCiCn___L____________ ______________________CiCnCnCXCi_$CV_zCgCiCnCi___N___z__________ ______________________ClCnCmCP_$CPCVCP_z______AA_______N________ ____________________CnCnBjCKCVCYCYCpCBCB______CuCuCuCBCB________ ____________________ClCi__CVCOBnCBCBCBBk________CBCBCB__________ ____________________ClCn____CKCVCPCVCP__________________________ __________________CiCn_______nCVCJ_n_n__________________________ __________________ClCn_______n_n_n_n_i__________________________ ________________Cn_nCn______CVCVCVCPCV__________________________ ________________CnAnCn____CVCPCmCVCPCVCP________________________ _______________r_r_n______CVCPCmCVBkCVBk________________________ ________________Cm_r_r____CPCPCPCmBkCmBk________________________ ________________CmBk______CPBmCVCPCPCTCP________________________ ______________CVBk________CVCPCVCmCmCTCPCV______________________ ______________CmBk______CVCmCKCPCoCmCTBkCV______________________ ______________CmCP______CmCPCVCPCmCnCTCTCP______________________ ____________CmBk________CmCVCPCVCmCTCTCn___A____________________ ____________CoBk________CoCVCVCVCV__CnCTCT_A_A__________________ __________CmBk________CVCoCVCVCVCm_ACTCnCn_A_A_A_A_A____________ __________CmBn________CPCmCVCPCV_A_A_ACnCi_A_A_A_A______________ ________CmBk_________ACPCPCPCPCV_A_A__AwAw_z_A__________________ ________CmBk_____A_A_A_ACTCT_A_A_A__CTCnBS_A____________________ ______CVBk_____A_A_A_A_AAwAw_A____AwBSBSBS_A____________________ ___________________A_zCiCnBS_A_____A_A_A_A______________________ ____________________BSBiBiBS_A__________________________________ ___________________A_A_A_A_A_A__________________________________ } # tile 127 (bat) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______AwAwAw____________________________________________________ ______BsBsBsAwAwAw______________________________________________ ________BsBsBsBsBsAwAw__________________________________________ __________BsBsBsBsBsBsAwAwAw____________________________________ __________BsBsBsBsBsBsAwBsAw____________________________________ ____________BsBsBsAwAwBsBsAw______AY____________________________ ______________BsAwBsBsBsBsAw__AwAwAY____________________________ ______________AwBsBsBsBsBsAwAwAwCuAYAYAY________________________ ________________BsBsBsBsAwAwAwAwAYCuAY__________________________ ________________BsBsBsAwAwAwAYAYAYAYAA__________________________ ________________BsBsBsAwAwAYAYAYAAAA____________________________ __________________BsAwAwAYAYAYAA_zAwAwAwAwAwAw__________________ __________________BsAwAAAAAYAA_NAABsBsBsBsAwAw__________________ __________________AwBsBs_zAA_zAABsBsBsBsAwBsAwAw________________ ______________________BsAAAABsBsBsBsBsAwBsBsBsBsAw______________ ______________________AABiBsBsBsBsBsAwBsBsBsBsBsAw______________ _________A_A_A_A_A_A__________BsBsAwBsBsBsBsBsBsAw______________ _________A_A_A_A_A_A_A_A_A__________________BsBsBsAw____________ _____________A_A_A_A_A_A_A_A____________________BsAw____________ _______________A_A_A_A_A_A_A_A_A__________________Aw____________ _________________A_A_A_A_A_A_A_A_A______________________________ _________________A_A_A_A_A_A_A_A_A_A____________________________ _______________A_A_A_A_A_A_A_A_A_A_A_A__________________________ _______________A_A_A_A_A_A_A_A_A_A_A_A_A________________________ _________________A_A___________A_A_A_A_A________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 128 (giant bat) { ________________________________________________________________ AA____________________________________________________________AA BVAA________________________________________________________AABV __BVAA____________________________________________________AABV__ __BVBVAA________________________________________________AABVBV__ __BVBVBVAA____________________________________________AABVBVBV__ __BVBVBVBVAA________________________________________AABVBVBVBV__ __BVBVBVBVBVAA____________________________________AABVBVBVBVBV__ __BVBVBVBVBVBV_N____________Aw____Aw____________AABVBVBVBVBVBV__ BVBVBVBVBVBVBVBVAA________BVAw____AwBV_________NBVBVBVBVBVBVBVBV AA_NAA_LAA_zAAAA_zAAAA__BVBVAw____AwBVBV__AAAAAA_zAA_LAA_LAA_NAA BVBVBVBVBVBVBVBVAA_N____BVBVAw____AwBVBV_____zAABVBVBVBVBVBVBVBV __BVBVBVBVBVBVAABVAA______BVAw____AwBV______AABVAABVBVBVBVBVBV__ __BVBVBVBVBVBV_NBV_zAA____AwAwAwAwAwAY_____LAABV_LBVBVBVBVBVBV__ ____BVBVBVBVAABVBVBVAA____Aw_AAwAw_AAY____AABVBVBVAABVBVBVBV____ ____BVBVBVBVAABVBVBV_LAAAwAwAwBVBVAYAYAY_zAABVBVBVAABVBVBVBV____ ____BVBVBV_NBVBVBVBVBVAAAwAwAwBVBVAYAYAYAABVBVBVBVBV_LBVBVBV____ ____BVBVBVAABVBVBVBVBVBVAYAw_LAAAAAAAYAABVBVBVBVBVBVAABVBVBV____ ____BVBVAABVBVBVBVBVBVBVAwAYAYAYAY_LAA_LBVBVBVBVBVBVBVAABVBV____ ____BVBV_LBVBVBVBVBVBVBVAwAwAYAYAY_zAAAABVBVBVBVBVBVBV_LBVBV____ ____BVAABVBVBVBVBVBVBVBVBVAwAYAYAYAAAABVBVBVBVBVBVBVBVBVAABV____ ______AABV__________BVAwAwAYAYAYAAAA_zAA_NBV__________BVAA______ ________________________AwAYBVAA_LBVAAAA________________________ ____________________________BVAABVBV____________________________ ________________________________________________________________ ___________________________A_A_A_A_A_A__________________________ ___________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A__________ ___A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A _______A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A__ _____________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A______________ _________________________A_A_A_A_A_A_A_A_A_A_A__________________ _____________________________A_A_A_A_A_A_A______________________ } # tile 129 (raven) { ________________________________________________________________ __________________________________________BJAlAeAlAe____________ ________________________________AlAlAeAOAlAlAlAlAe______________ ______________________________AlAeAeAOBJAlAeAlAeAlAO____________ ____________________________AlAeAlAOAjAlAeAlAeAlABAOAOAO________ __________________________AlAlAlAeAOAlAeAlAeAlAeAeABABAOAO______ ________________________AlAeAeAeAeAOBJAeAlAlAlBJAeAe____________ ________________________BJAlAeAlAOAlAlAeAeAlAeAlAlAeAO__________ ________________________AlAeAlAeAOBDAeAlAlAlAlAeAeAOAOAO________ ________________________AlAlAeAOAOAlAeAeAeAlBJAlAjABAB__AO______ ________________________AlAeAOAlAlAeAeAlAeAlAeAlAlAO____________ ________________________AlAlAOAlAlAeAlAeAeAOAlAlAOAOAOAO________ ______________________AlAeAOAOAlAeAeAeAOAOAeAlAeAeAe____________ ______________________AlAeABBJAeAeAlAeAlAlBJAlAlAeAe____________ ______________________AlAeABAlAOAlAlAeAOAeAlAeAeAOAOAO__________ ________________AOAO__AOABAOAjAlAeAeAOAlAlAOAO______AOAO________ ______________AOAeAeAeAlAOAlAeAeAlAeBJAeAlAlAeAO________________ ____________AOAeCuAeAOAeAlAlAlAeAeAlAeAlAjAlAeAe________________ ____________CjCjAeAlAeAOAOAeAlAlAOAOAe__AlAeAOAOAO______________ ____________Cf__AeAOAlAOAlBJAlAeAOAeAO__________AO______________ ____________________AOAeAlAlAjAlAeAO____________________________ ____________________BDBDAeBJAlAlAlAeAl__________________________ ______________________BDAlAlBDAlAlB_AlAl________________________ ________________________AlBDAlBdAlAlB_AlAlAeABAB________________ __________________________AlAlBDBDBcB_AjAeAlAlAlABAB____________ ______________________CjCf__AeBdCfBDAlAeAeAeAeAlAeAeAB__________ ____________________Cf________CfAlAeAeAeAlAeAlAeABAeAeAB________ __________________Cj__Cf______Cj__AeAlAeAeAeAeAeAe____ABAB______ __________________Cf__C$__CfCj______AeAlAeAeABAeABAB____________ __________________C$______Cf__Cf________ABABAe____ABAB__________ __________________________C$__C$____________ABAB________________ ________________________________________________________________ } # tile 130 (vampire bat) { ________________________________________________________________ AT____________________________________________________________AT BoAT________________________________________________________ATBo __BoAT____________________________________________________ATBo__ __BoBoAT________________________________________________ATBoBo__ __BoBoBoAT____________________________________________ATBoBoBo__ __CBCBBoBoAT________________________________________ATBoBoBoCB__ __CBCBCBBoBoAT____________________________________ATBoBoCBCBCB__ __CBCBCBCBBoBoAT__________Bo__________Bo________ATBoBoCBCBCBCB__ CBCBCBCBCBCBCBBoAT________Bo________BoAT______ATBoBoCBCBCBCBCBCB ATATATATATATATATATATAT____AqBo____BoATAT__ATATATATATATATATATATAT BoBoBoBoBoBoBoBoATAT______AqBo____BoATAT____ATATBoBoBoBoBoBoBoBo __BoBoBoCBCBCBATBoAT______CBCBCBBoBoBo______ATBoATCBCBCBBoBoBo__ __CBCBCBCBCBCBATBoATAT__CBCMCBBoBoCMBNBN__ATATBoATCBCBCBCBCBCB__ ____CBCBCBCBATBoCBBoAT__CBCMCMBoCMCMBNBN__ATBoBoBoATCBCBCBCB____ ____CBCBCBCBATBoCBBoATATCBCBCBBoBoBNBNATATATCBCBBoATCBCBCBCB____ ____CBCBCBATBoBoCBCBCBATATCPBNBNCPBNATATATBoCBCBBoBoATCBCBCB____ ____CBCBCBATBoBoCBCBCBCBBoCPATATCPATATATBoCBCBCBCBBoATCBCBCB____ ____CBCBATBoBoCBCBCBCBCBBoBNBNBNAqAqATATBoCBCBCBCBBoBoATCBCB____ ____CBCBATBoBoCBCBCBCBCBBoBNBNBNAqAqATATBoCBCBCBCBCBBoATCBCB____ ____CBATBoBoBoCBCBCBCBCBBoBNBNBNBNAqATATBoCBCBCBCBCBBoBoATCB____ ______ATBo____________CBCBBNAqAqAqAqATATBoBo__________BoAT______ __________________________BNAqATAqAqAqATAT______________________ __________________________BNBNAT____AqAT________________________ ________________________________________________________________ ___________________________A_A_A_A_A_A__________________________ ___________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A__________ ___A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A _______A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A__ _____________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A______________ _________________________A_A_A_A_A_A_A_A_A_A_A__________________ _____________________________A_A_A_A_A_A_A______________________ } # tile 131 (plains centaur) { _______________________A_A_A_A___________A_____A________________ _____________________zCnCi_A_A_A_A_____A_____A__________________ ______CI_____________ACiCnCn_A_A____BGBG___A____________________ ______CIBj_________A__CnCnCT_A_A_A__AnBGAn______________________ ______CI__Bm____CnCiCnCnCTCnCnCi__BGBGBGAn______________________ ______CI____CTCnCnCiCnCnCiCnCiCnCTAnBGAn________________________ ______Cf____CnBjCnCnCiCnCiCnCnCiCnCTBGAn________________________ ______Cf____CnCTBzCnCnCnCiCnCnCnCnCTAn__________________________ ________Cf__CTCT__COCnCnCnCTCTCnCTBGAn__________________________ ________CICnCT____CgBzCnCTCTCnCnCTAn____________________________ ________CICnBk____CnCTCJCTCiCnCTBGAg____________________________ __________CICP__BsCTCTCnCnCnCTAnAn______________________________ __________CfBkBsBsBsCnCnCTCT______________________________BsBs__ __________BkCfCfCnCnCTCTBs__Bj____________________________Bs____ ________CFCPAwCfCTCTBsBSBsBi__Bk__________________________BS____ ______CFBSBkBSBSAwCfCfBSBSBsBiBsBzBs______________________BS____ ____CFBSBkAwAwBSCFAwCICfCIBsBsBSBsBkCFBS__________________BS____ __CFBSAwCP____BSCFCFAwBSCICICICIBSBiBjCFBsBs____________BsBS____ __BSAw__Bk____BSCFBSBSAwBSBSAwAwCICIBvBvBsCFBs________BsBS______ __BSAw________BsCFBSAwAwAwAwAYAwAbBSBSBsCFCFBsBsBsBsBSBS________ ____BS________CFBsAw______AwAYAYAYBSBSBSBsBSCFCFBs______________ ____BSAw______BSBSAw________BSAwAYAYAwBSBSBsCFBsBs______________ ______Aw______BSAw__________BSAwAYAwAYAwBSBSBsCFBs______________ ______BSAw______Aw__________AwAYAwAY__AYAYBSBSAwBs______________ ________Aw______BSAw__________AwAYAY______AwBSBSBs______________ ________BS________BSAw___A_A_A_AAwAY_A_A____AwAwBSBsBs__________ ________BS________BSAw_A_A_A_A_AAYAYAY_A_A_A_A_AAwAwBSBs________ _______________A_A_ABS_A_A_A_A_A_AAwAYAYAY_A_A_A_A_AAwBSBs______ _______________A_A_ABS_A_A_A_A_A_A_A_A_AAYAY_A_A_A_A_A_AAwBs_A_A _____________A_A_A_A_A_A_A_A_A_A_A_A_A_AAYAw_A_A_A_A_A_A_AAwBs_A _________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_AAwBS_A ___________________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A } # tile 132 (forest centaur) { _______________________A_A_A_A___________A_____A________________ _____________________zCnCi_A_A_A_A_____A_____A__________________ ______CI_____________ACiCnCn_A_A_____c_h___A____________________ ______CIBj_________A__CnCnCT_A_A_A___c_h_c______________________ ______CI__Bm____CnCiCnCnCTCnCnCi___c_h_c_X______________________ ______CI____CTCnCnCiCnCnCiCnCiCnCT_c_h_c________________________ ______Cf____CnBjCnCnCiCnCiCnCnCiCnCT_c_X________________________ ______Cf____CnCTBzCnCnCnCiCnCnCnCnCT_X__________________________ ________Cf__CTCT__COCnCnCnCTCTCnCT_c_X__________________________ ________CICnCT____CgBzCnCTCTCnCnCT_X____________________________ ________CICnBk____CnCTCJCTCiCnCT_c_X____________________________ __________CICP__BsCTCTCnCnCnCT_X_X______________________________ __________CfBkBsBsBsCnCnCTCT______________________________BsBs__ __________BkCfCfCnCnCTCTBs__CT____________________________Bs____ ________CFCPAwCfCTCTBsBSBsBS__BL__________________________BS____ ______CFBSBkBSBSAwCfCfBSBSBsBSBsCJBs______________________BS____ ____CFBSBkAwAwBSCFAwCICfCIBsBsBSBsBjCFBS__________________BS____ __CFBSAwCP____BSCFCFAwBSCICICICIBSBiBmCFBsBs____________BsBS____ __BSAw__Bk____BSCFBSBSAwBSBSAwAwCICIBvBvBsCFBs________BsBS______ __BSAw________BsCFBSAwAwAwAwAYAwAYBSBSBsCFCFBsBsBsBsBSBS________ ____BS________CFBsAw______AwAYAYAYBSBSBSBsBSCFCFBs______________ ____BSAw______BSBSAw________BSAwAYAYAwBSBSBsCFBsBs______________ ______Aw______BSAw__________BSAwAYAwAYAwBSBSBsCFBs______________ ______BSAw______Aw__________AwAYAwAY__AYAYBSBSAwBs______________ ________Aw______BSAw__________AwAYAY______AwBSBSBs______________ ________BS________BSAw___A_A_A_AAwAY_A_A____AwAwBSBsBs__________ ________BS________BSAw_A_A_A_A_AAYAYAY_A_A_A_A_AAwAwBSBs________ _______________A_A_ABS_A_A_A_A_A_AAwAYAYAY_A_A_A_A_AAwBSBs______ _______________A_A_ABS_A_A_A_A_A_A_A_A_AAYAY_A_A_A_A_A_AAwBs_A_A _____________A_A_A_A_A_A_A_A_A_A_A_A_A_AAYAw_A_A_A_A_A_A_AAwBs_A _________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_AAwBS_A ___________________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A } # tile 133 (mountain centaur) { _______________________A_A_A_A___________A_____A________________ _____________________zCnCi_A_A_A_A_____A_____A__________________ ______CI_____________ACiCnCn_A_A____BvCI___A____________________ ______CIBD_________A__CnCnCT_A_A_A__BvCIBv______________________ ______Cf__BD____CiCnCiCTCTCnCnCi__BvCIBvBW______________________ ______Cf____BDCnCnCiCnCnCiCnCiCnCTBvCIBv________________________ ______Cf____CnBDCTCnCiCnCiCnCnCiCnCTBvBW________________________ ______Cf____CnCTBcCnCnCnCiCnCnCnCnCTBW__________________________ ________Cf__CTCT__BDCnCnCnCTCTCnCTBvBW__________________________ ________CfCnCT____CiBcCnCTCnCnCnCTBW____________________________ ________CjCnCJ____CnCTBDCTCnCnCTBvBW____________________________ __________CjBk__BsCTCTCnCnCnCTBWBW______________________________ __________CfCKBsBsBsCnCnCTCT______________________________BsBs__ __________COCfCjCnCnCTCTBs__BD____________________________Bs____ ________CFBkAwCfCTCTBsBSBsBS__BD__________________________BS____ ______CFBiBlBiBSBRCjCfBSBSBsBSBsBDBs______________________BS____ ____CFBSBkAwAwBSCFAwCfCjCfBsBsBSBsBDCFBS__________________BS____ __CFBSAwCO____BSCFCFAwBiCfCfCfCIBSBSBDCFBsBs____________BsBS____ __BSAw__Bl____BSCFBSBiAwBSBSAwAwCICIBvBvBsCFBs________BsBS______ __BSAw________BsCFBSAwAwAwAwAYAwAYBSBSBsCFCFBsBsBsBsBSBS________ ____BS________CFBsAw______AwAYAYAYBSBSBSBsBSCFCFBs______________ ____BSAw______BSBSAw________BSAwAYAYAwBSBSBsCFBsBs______________ ______Aw______BSAw__________BSAwAYAwAYAwBSBSBsCFBs______________ ______BSAw______Aw__________AwAYAwAY__AYAYBSBSAwBs______________ ________Aw______BSAw__________AwAYAY______AwBSBSBs______________ ________BS________BSAw___A_A_A_AAwAY_A_A____AwAwBSBsBs__________ ________BS________BSAw_A_A_A_A_AAYAYAY_A_A_A_A_AAwAwBSBs________ _______________A_A_ABS_A_A_A_A_A_AAwAYAYAY_A_A_A_A_AAwBSBs______ _______________A_A_ABS_A_A_A_A_A_A_A_A_AAYAY_A_A_A_A_A_AAwBs_A_A _____________A_A_A_A_A_A_A_A_A_A_A_A_A_AAYAw_A_A_A_A_A_A_AAwBs_A _________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_AAwBS_A ___________________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A } # tile 134 (baby gray dragon) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________BkBk______________________________________________ ____________BkCP____BkBk________________________________________ ____________CPBkBkBkCP__________________________________________ __________BkBkCPBdBdBd____BkBnCJBkBkBnCJ________________________ __________CPBk_A_ACJBnBkCJBnCJBMCJBnCJBkBnBk____________________ ________BkBkBkBdBdBdBdBkBnBdBdBdBdBdBdBkCJBnCJ__________________ ________CPBkBdBdBJBdBdBdBwBkBdBdBdBdBdBdBdBdBkBnBk______________ ________BkBdBd____AjBJBdBkCPBdBdBdBdBkBkBdBdBdBdCJBn____________ ____________________AlBDBkAlBdBdBdCPBkBdBdBdBdBdBdCJBk__________ ___________________A_BBkCPBdBJBdBdBkBdBdBJAjBJAlBdBdBn__________ ___________________A_A_ABkBdAjBdBdBkBdBdBDAlBJAjBDBdBdBd________ ___________________A_ABdBdBdBJ_A_ABnBdBdAl_B_A_AAlBkBdBd________ _____________________A_A_A_A_A_ABdBdBdBd_A_A_A_A_MCJBdBd________ _______________________A_A_A_A_A_A_A_A_A_A_A_ABkBnBdBd_A________ ___________________________________________ABdBdBdBd_A__________ _____________________________________________A_z_A_A____________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 135 (baby silver dragon) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________C$______________________________________________ ______________C$C$______________________________________________ ____________CPCP____BkBk________________________________________ ____________CVCVBkBkCP__________________________________________ __________BkCVBkBkBdBd____BkBnCJBkBkBnCJ________________________ __________CmBk_A_MBkCJBnBkC$CPCVCVCVC$BkBnBk____________________ ________CVABBdBkBdBdBdBkCPAlBJAjAlBJAjCVCPCVBk__________________ ________CVBkBdBdBJBdBdBdBdBkAlBkAlBkAlAlBJBJCVCmBk______________ ________CVBdBd____AjBJBdBkCmCVAlAlAlCJAlBkAlBDAlCmBk____________ ____________________AlBJBlBJBdCPCVBmBlBdAlAlBkAlBJCmBk__________ ___________________A_BBkBmCVAlBdBdBxCmBdAjBJAlAlAlCVBl__________ ___________________A_A_MBxCVBDBdBdBmCVBdCVCKBDAjAlBdBjBd________ ___________________A_ABdCVBdAl_A_ACJCVBdAl_L_A_ABJBkBdBd________ _____________________A_A_A_A_A_BBdCVBdBd_A_A_A_A_LBlBdBd________ _______________________A_A_A_A_A_A_A_A_A_A_A_ABkCJBdBd_A________ ___________________________________________ABdBkBdBd_A__________ _____________________________________________A_A_A_L____________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 136 (baby shimmering dragon) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________CnCd______________________________________________ ____________CdCd____CkCt________________________________________ ____________CdCnCnCkCk__________________________________________ __________CnCdCnCiCOCO____CkBmCRBmBmBIBI________________________ __________CdCnAeAeCkCsCtCkCkCRBmBmBnBIBIBhBh____________________ ________CdCnCgCJCJCOCOCtCkBmBmBnBnBnBlBhBhBIBI__________________ ________CnCdCKCJBkCJCOCOCOBmBmBmBnBnBlBlBlCKBnBlBE______________ ________CdChCV____BlCOCOCRBmBmBmBnBnBhBlBlBlCKCKBEBl____________ ____________________BkBkCPBmBmBmBmBIBhBnBlBlBlCKCKBlCe__________ ___________________L_ACkCRCOBkBmBmBhBnBnBkBkCPBkCKCKCe__________ ___________________A_A_ABmCOBkBmBmBhBnBnBkCPBkBkBkCKCPCP________ ___________________A_ACJCnCOCP_A_ABhBnBnBn_z_A_MCJCeCKCP________ _____________________A_A_A_A_A_ACOBmBmBn_A_A_A_A_MCeCKCK________ _______________________A_A_A_A_A_A_A_A_A_A_A_ACKCeCKCK_A________ ___________________________________________ABnBlBlBl_A__________ _____________________________________________A_A_A_A____________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 137 (baby red dragon) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________CuCu______________________________________________ ____________CuCu____CuCu________________________________________ ____________CuCuCuCuCu__________________________________________ __________CuCuCuCBCBCB____CuCuCuCuCuCuCu________________________ __________CuCuCjCjCBCuCuCuCuCuCuCuCuCuCuCuCu____________________ ________CuCuCBCjCbCBCBCuCuCBCBCBCBCBCBCuCuCuCu__________________ ________CuCuCBCBCFCBCBCBCBCuCBCBCBCBCBCBCBCBCuCuCu______________ ________CuCBCB____CFCFCBCuCuCBCBCBCBCuCBCBCBCBCBCuCu____________ ____________________CFCFCuBNCBCBCBCuCuCBCBCBCBCBCBCuCu__________ ___________________A_ACuCuCBBNCFCFCuCBCBBNCBCBCBCBCBCu__________ ___________________A_A_ACuCBBNCFCFCuCBCBBNCFCFCFCFCBCBCB________ ___________________A_ACBCBCBBN_A_ACuCBCBBN_A_A_ACFCuCBCB________ _____________________A_A_A_A_A_ACBCBCBCB_A_A_A_A_ACuCBCB________ _______________________A_A_A_A_A_A_A_A_A_A_A_ACuCuCBCB_A________ ___________________________________________ACBCBCBCB_A__________ _____________________________________________A_A_A_A____________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 138 (baby white dragon) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________C$C$______________________________________________ ____________C$C$____C$C$________________________________________ ____________C$C$C$C$C$__________________________________________ __________C$C$C$CmCmCm____C$C$C$C$C$C$C$________________________ __________C$C$_A_AC$C$C$C$C$C$C$C$C$C$C$C$C$____________________ ________C$C$CmCmCmCmCmC$C$CmCmCmCmCmCmC$C$C$C$__________________ ________C$C$CmCmCPCmCmCmCmC$CmCmCmCmCmCmCmCmC$C$C$______________ ________C$CmCm____CPCPCmC$C$CmCmCmCmC$CmCmCmCmCmC$C$____________ ____________________CPCPC$CPCmCmCmC$C$CmCmCmCmCmCmC$C$__________ ___________________A_AC$C$CmCPCmCmC$CmCmCPCPCPCPCmCmC$__________ ___________________A_A_AC$CmCPCmCmC$CmCmCPCPCPCPCPCmCmCm________ ___________________A_ACmCmCmCP_A_AC$CmCmCP_A_A_ACPC$CmCm________ _____________________A_A_A_A_A_ACmCmCmCm_A_A_A_A_AC$CmCm________ _______________________A_A_A_A_A_A_A_A_A_A_A_AC$C$CmCm_A________ ___________________________________________ACmCmCmCm_A__________ _____________________________________________A_A_A_A____________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 139 (baby orange dragon) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________CzCz______________________________________________ ____________CzCz____CzCz________________________________________ ____________CzCzCzCzCz__________________________________________ __________CzCzCzCFCFCF____CzCzCzCzCzCzCz________________________ __________CzCzCjCjCFCzCzCzCzCzCzCzCzCzCzCzCz____________________ ________CzCzCFCjCcCFCFCzCzCFCFCFCFCFCFCzCzCzCz__________________ ________CzCzCFCFCMCFCFCFCFCzCFCFCFCFCFCFCFCFCzCzCz______________ ________CzCFCF____CMCMCFCzCzCFCFCFCFCzCFCFCFCFCFCzCz____________ ____________________CMCMCzBsCFCFCFCzCzCFCFCFCFCFCFCzCz__________ ___________________A_ACzCzCFBsCMCMCzCFCFBsCFCFCFCFCFCz__________ ___________________A_A_ACzCFBsCMCMCzCFCFBsCMCMCMCMCFCFCF________ ___________________A_ACFCFCFBs_A_ACzCFCFBs_A_A_ACMCzCFCF________ _____________________A_A_A_A_A_ACFCFCFCF_A_A_A_A_ACzCFCF________ _______________________A_A_A_A_A_A_A_A_A_A_A_ACzCzCFCF_A________ ___________________________________________ACFCFCFCF_A__________ _____________________________________________A_A_A_A____________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 140 (baby black dragon) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________AOAO______________________________________________ ____________AOAO____AOAO________________________________________ ____________AOAOAOAOAO__________________________________________ __________AOAOAOABABAB____AOAOAOAOAOAOAO________________________ __________AOAOCuCuAOAOAOAOAOAOAOAOAOAOAOAOAO____________________ ________AOAOABCuABABABAOAOABABABABABABAOAOAOAO__________________ ________AOAOABABABABABABABAOABABABABABABABABAOAOAO______________ ________AOABAB____ABABABAOAOABABABABAOABABABABABAOAO____________ ____________________ABABAOABABABABAOAOABABABABABABAOAO__________ ___________________A_AAOAOAB_AABABAOABAB_AABABABABABAO__________ ___________________A_A_AAOAB_AABABAOABAB_AABABABABABABAB________ ___________________A_AABABABAB_A_AAOABABAB_A_A_AABAOABAB________ _____________________A_A_A_A_A_AABABABAB_A_A_A_A_AAOABAB________ _______________________A_A_A_A_A_A_A_A_A_A_A_AAOAOABAB_A________ ___________________________________________AABABABAB_A__________ _____________________________________________A_A_A_A____________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 141 (baby blue dragon) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ _______________K_K______________________________________________ _____________K_K_____K_K________________________________________ _____________K_K_K_K_K__________________________________________ ___________K_K_K_I_I_I_____K_K_K_K_K_K_K________________________ ___________K_KC$C$_I_K_K_K_K_K_K_K_K_K_K_K_K____________________ _________K_K_IC$_I_I_I_K_K_I_I_I_I_I_I_K_K_K_K__________________ _________K_K_I_I_j_I_I_I_I_K_I_I_I_I_I_I_I_I_K_K_K______________ _________K_I_I_____j_j_I_K_K_I_I_I_I_K_I_I_I_I_I_K_K____________ _____________________j_j_K_G_I_I_I_K_K_I_I_I_I_I_I_K_K__________ ___________________A_A_K_K_I_G_j_j_K_I_I_G_I_I_I_I_I_K__________ ___________________A_A_A_K_I_G_j_j_K_I_I_G_j_j_j_j_I_I_I________ ___________________A_A_I_I_I_G_A_A_K_I_I_G_A_A_A_j_K_I_I________ _____________________A_A_A_A_A_A_I_I_I_I_A_A_A_A_A_K_I_I________ _______________________A_A_A_A_A_A_A_A_A_A_A_A_K_K_I_I_A________ ___________________________________________A_I_I_I_I_A__________ _____________________________________________A_A_A_A____________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 142 (baby green dragon) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ _______________t_t______________________________________________ _____________t_t_____t_t________________________________________ _____________t_t_t_t_t__________________________________________ ___________t_t_t_q_q_q_____t_t_t_t_t_t_t________________________ ___________t_t_A_A_q_t_t_t_t_t_t_t_t_t_t_t_t____________________ _________t_t_q_A_q_q_q_t_t_q_q_q_q_q_q_t_t_t_t__________________ _________t_t_q_qCM_q_q_q_q_t_q_q_q_q_q_q_q_q_t_t_t______________ _________t_q_q____CMCM_q_t_t_q_q_q_q_t_q_q_q_q_q_t_t____________ ____________________CMCM_t_m_q_q_q_t_t_q_q_q_q_q_q_t_t__________ ___________________A_A_t_t_q_mCMCM_t_q_q_m_q_q_q_q_q_t__________ ___________________A_A_A_t_q_mCMCM_t_q_q_mCMCMCMCM_q_q_q________ ___________________A_A_q_q_q_m_A_A_t_q_q_m_A_A_ACM_t_q_q________ _____________________A_A_A_A_A_A_q_q_q_q_A_A_A_A_A_t_q_q________ _______________________A_A_A_A_A_A_A_A_A_A_A_A_t_t_q_q_A________ ___________________________________________A_q_q_q_q_A__________ _____________________________________________A_A_A_A____________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 143 (baby yellow dragon) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________CjCj______________________________________________ ____________CjCj____CjCj________________________________________ ____________CjCjCjCjCj__________________________________________ __________CjCjCjCjCjCj____CjCjCjCjCjCjCj________________________ __________CjCj_zAACjCjCjCjCjCjCjCjCjCjCjCjCj____________________ ________CjCjCjAACjCjCjCjCjCjCjCjCjCjCjCjCjCjCj__________________ ________CjCjCjCj_qCjCjCjCjCjCjCjCjCjCjCjCjCjCjCjCj______________ ________CjCjCj_____q_tCjCjCjCjCjCjCjCjCjCjCjCjCjCjCj____________ _____________________q_tCjCjCjCjCjCjCjCjCjCjCjCjCjCjCj__________ ___________________z_ACjCjCjCj_q_tCjCjCjCjCjCjCjCjCjCj__________ ___________________A_AAACjCjCM_q_tCjCjCjCM_q_t_q_tCjCjCj________ ___________________A_ACjCjCjCM_z_zCjCjCjCM_z_z_z_qCjCjCj________ _____________________A_A_z_A_A_ACjCjCjCj_A_A_A_AAACjCjCj________ _______________________A_A_A_A_A_L_z_L_z_A_A_ACjCjCjCj_L________ ___________________________________________LCjCjCjCj_z__________ _____________________________________________z_L_z_L____________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 144 (gray dragon) { AOAO__________________________________________AOAOAOAOAOAOAOAO__ __AOAOAOAO__________________C$______C$C$AOAOAOAOBcBcBcBcBcBc____ ____BcBcAOAOAOAOAOAOAOAOAOC$__________AOAOBcBcBcBcCOCOCOCO______ ______BcBcBcBcBjBmBjAOAOBcAO________AOAOAOAOAOCOCOCOBmBj________ ______BcBcCOCOAOAdAOBcBcBjAO________AOCOBcBcBcAOAOBjCTBm________ ______COCOBjAOBcCTBkBdBdBJBkAO______AOBcCOBcBcBcBcAeBzBj________ ____BjBmCTAEBcBkBLBdAeBJAjBjAO______AOBcCOBjBmBcBcBcAOBm________ ____CTAOAOBcBzBdAeBJAlAeBJAeAjBJ____AOBcBcCOBjCTBjBcBcAZ________ ____AEBcBcBcBkBdBJAeAeAeAeAeBJAeAl__AOBcBcCOBmBzBmCJBcBcAO______ ______BcBzBkBjAjBdAeCoBjBkAeAeAeBDAe__AOBcBcCOBkBzBj____________ ________CmCOAlBdBdAeCmBcCOCOCOAeAeAlBDAOBcBcCOCOCO______________ ________BkCmBJBdBJCmCPBcBcAdBkBjAOAeAlAOBcBcBcCO________________ __________CPCmBdBdCPBk__BcAOCOCOCOAOAlBdBJAlBDBj________________ __________BkBlAlBdBJBnAeBdAeAOCNBkAOAeAeAeBdBdAjBJ______________ ____________BJBmBDBYBkCBAOAOAeCtCOCOAOAOAeAeAeAeBdAlBD__________ ____________BDCBBkBdCJCBAOAeAOCOBkBcAeAeAOAeAOAeAeBDBdAl________ ____________AOBdCBBnBdBkBkAOAOCtCOCOAOAOBJAOAeAOAeAeAeBD________ __________AeAOBJBdBDCPBkBdAOAeCOCOBkBcAOAeAeAOAO____AeAlBJ______ ________AeAeAOABAlBDBDBkBDAOAeCtCOCOCOAOAOAeAO____C$AeBDAlBD____ ____AeAeAeAOABABC$AeBDBkBkAeAOCOBmBjBcAOAeAeBJ_A_A_A_AC$AlC$____ __AOAeAOAOABAB______AeAlBkAeAeCoCOCOCOAOAeAOAeAe_A_A_AC$_A_AC$__ __C$__AOABC$__________Ae__AeAOAOCNBjBcAOAOAlAeAOBJAe_A_AAeAe____ C$____C$__C$____________AeAeAeAOCtCWCOAOAeBDAeAlAOAOAeAeAe_A_A__ ______C$____________AeAeBJAeAOAOBcBcBcBcAOAOAjAeAeAOAOAe_A_A_A__ ____________________AeAlAjAOAOABABCOBjBmAeABAOBJAeAj_A_A_A_A____ __________________AeBJAeAeAOABAB_A_ABcBcAOAOAeAlBJAe_A_A_A______ __________________AeAjAeAeAOAB_A_A_A_A_z_AABAOAeAeBDAO_A_A______ __________________AlBJAeAOABAB_A_A_A_A_A_A_AAOAOBDAlAO_A_A_A____ ________________AOAeAeAOAOAB_A_A_A_A_A_A_A_AABAeAOAOAOAO_A_A_A__ ____________AOAOAOAeAeAOAB_A_A_A_A_A_____A_A_AAOAeAOBJAOAO_A_A__ __________CPAO_ACPAO_AAOABCP_A_A_______A_A_ACPAO_AABBn_AABCP_A__ ___________A_A_A_A_A_A_A_A_A_A_____________A_A_A_A_A_A_A_A_A____ } # tile 145 (silver dragon) { BDBD__________________________________________BDBDBDBDBDBDBDBD__ __BDBDBDBD__________________C$______C$C$BDBDBDBDBcBcBcBcBcBc____ ____BcBcBDBDBDBDBDBDBDBDBDC$__________BDBDBcBcBcBcClClClCl______ ______BcBcBcBcCTBkCJBDBDBcBD________BDBDBDBDBDClClClBkCJ________ ______BcBcClClBDBDBDBcBcCJBD________BDClBcBcBcBDBDCJBzCJ________ ______ClClCJBDBcBjCJBmBkCXBkBD______BDBcClBcBcBcBcBDCJBk________ ____CJBkCTAjBcCOBkBmCoBkBkBkBd______BDBcClCJBjBcBcBcBDCN________ ____BjBDBDBcCJBkBkCKBkBDBDBkBkCV____BDBcBcClCOCTBkBcBcBD________ ____BdBcBcBcBmCJC$BkBkBDBkAlBDBkBk__BDBcBcClBkCJBzCJBcBcBD______ ______BcBmCJBkBkBkBkCoBkCJBDBkAlBDBk__BDBcBcCVBjCOBk____________ ________CoCTBkCVBnAlCoBcC$CoCPBDBkAlCVBDBcBcCoClCJ______________ ________CPCoBkBkBkCoCVBDBcBDClClAeBkBDBDBcBcCoCl________________ __________CVCoCOBkCVCP__BcBDC$CoCPBDBkBkCVCoCoCoCV______________ __________CPCPBkBlBkCPBkBkBkBDClClBDBkBkBkBkCoBkBk______________ ____________BkCPBkCJCPCBBDBDBkC$CoCPBDBDBkBkCmBkBkBkBk__________ ____________BkCBCPBmCPCBBDBkBDCVClBcBkBkBDBkCVBkCmBkBkBk________ ____________BDBkCBCPBlCWAeBDBDC$CoCPBDBkBkBDCPBDBkCVBkBk________ __________BkBDBkCPBkCPCPAeBDBkCVClClBcBdBkBkBDBD____BkCVBk______ ________BkCVBDAeBDBkCoCPBkBDBkC$CoCPClBDBkBkBD____C$BkBkBkBk____ ____BkBkCVBDAeAeC$BDBkCoCPBkBDCVClClBcBDBdBkBD_A_A_A_AC$BkC$____ __BDBkBDBDAeAe______BDBkAeBkBkC$CoCPClAeBDAeBDBk_A_A_AC$_A_AC$__ __C$__BDAeC$__________BD__BkBDBDClClBcBDBDBkBkBDBkBk_A_ABkBk____ C$____C$__C$______CV____BkBkBkBDCoCPClBDBkBkBkBkBDBDBkBkBk_A_A__ ______C$__________CoBkBkCoBkBDBDBcBcBcBcBDBdBkBkBkBDBDBk_A_A_A__ ______________CVCoCoCoCVBkBDBDAeAeClCJBkBkAeBDBkBkBk_A_A_A_A____ __________________CoBkCoBkBDAeAe_A_ABcBcBDBDCoBdBkBk_A_A_A______ __________________CVCoBkBkBDAe_A_A_A_A_A_AAeBDCoBDBkBd_A_A______ __________________CVBkBkBDAeAe_A_A_A_A_A_A_ABDBDC$BkBD_A_A_A____ ________________BDCPBkBDBDAe_A_A_A_A_A_A_A_AAeBkBDBDBDBD_A_A_A__ ____________BDBDBDBkBkBDAe_A_A_A_A_A_____A_A_ABDBkBDBkBDBD_A_A__ __________CVBD_ACVBD_ABDAeCV_A_A_______A_A_ACVBD_AAeCV_AAeCV_A__ ___________A_A_A_A_A_A_A_A_A_A_____________A_A_A_A_A_A_A_A_A____ } # tile 146 (shimmering dragon) { CHBU__________________________________________CLBHAoApBFAmAfBu__ __BUAfAmBn__________________C$______C$C$BtCGCLCLBKBKBKBABKBK____ ____BKBKApApAoAoBzCUCLCbBtC$__________BtBtBKBKBKBKBlCQBlCQ______ ______BKBABKBKBlBlBlCLCbBKBt________BtBtBtCGCLBlCQCKCoCh________ ______BKBKChCoAoCNCLBKBKBlBt________BtCQBKBKBKCECEChChCo________ ______ChCoBlBtBKBlBlBhBnBmBlBw______CGBKBlBKBKBKBKCUCoCh________ ____BlBlBlCGBKBlCKBlBFBnBmClCG______CLBKCQChCoBKBKBKCTCo________ ____BlCLCUBKBlChCHBKBlBIBmBLCkCO____BzBKBKCQChChChBKBKAo________ ____CNBKBKBKBlChCeBKBKApBIBLCkBLBn__AoBKBKBlCoChCoChBKBKA$______ ______BKBlBlChCKChBxCKBFBFBLBLBLBIBK__ApBKBKCQChCoCh____________ ________ChBlCeChCKBKBlBKBnBnCPBFBKBKCKApBKBKCKCQCh______________ ________CHChCKCKBKBlBlBKBKBwCPCPBwBwCKAfBKBKBKCQ________________ __________BxBlBlBlBlCV__BKBtCVCVCWBzCdCgCdCTCOBl________________ __________BKCQBlBnBnCSBkCmCGBwC$C$BzCUCGBwCnCtCkBm______________ ____________BxBnBIBIBI_zBtBwCTCSCVCVBzBDBzCNCNBHBnBmBn__________ ____________Cd_ACSBICV_LCGCTBzCVCVBmBLBLBDCNApBHApBnBIBn________ ____________BwBI_ACSBmBnBgBzBzC$C$C$BcAiCkApApBDApApBEBl________ __________CNBzCTBnBLCRClClBzCNCVBnCVBnBLBmBHApAj____BCBlBK______ ________BLBjBzBJBmBmClCtCkBzBjCSBICVBIApApBHBD____C$AkBKBxCK____ ____ApBIApAoBDAlClCNCkCtCtCGBLC$C$C$CVApBLAiBm_A_A_A_AC$CKC$____ __BDBKApApAlBJ______CNCnCiCGCGCSCVBICSBdBLBdBFCH_A_A_AC$_A_AC$__ __C$__AfBJC$__________CT__CdBdBdCVCVBlBdBdBnCHCDCPBw_A_LCGBw____ C$____C$__C$____________CdCTCdBYCSCmCmBdBFBnBEBlBdBuCKCKBj_A_A__ ______C$____________BLBjCkCGBuBuCKCKCKCKCaCaBlBKBKBuBuCH_A_A_A__ ____________________BLBmBm_HBqCDBUCQCPCPCaAk_HBKBKCK_A_A_A_A____ __________________BIBm_r_s_g_bAk_A_ACHCaAk_H_bBKCKCH_A_A_A______ __________________BFBn_r_r_s_v_A_A_A_A_A_A_b_vApBDCKBf_A_A______ __________________BlBIBHBG_n_r_A_A_A_A_A_A_A_s_rCKCdCj_A_A_A____ ________________BtBYBtCzCfCj_A_A_A_A_A_A_A_A_r_qBfCjCzCx_A_A_A__ ____________BdBdBwBUBYCGCx_A_A_A_A_A_____A_A_ABGCjCfCPCbBt_A_A__ __________CPBd_ACPBj_ABtBVCP_A_A_______A_A_ACPCj_ACxCP_ABVCP_A__ ___________A_A_A_A_A_A_A_A_A_A_____________A_A_A_A_A_A_A_A_A____ } # tile 147 (red dragon) { BNBN__________________________________________BNBNBNBNBNBNBNBN__ __BNBNBNBN__________________C$______C$C$BNBNBNBNBsBsBsBsBsBs____ ____BsBsBNBNBNBNBNBNBNBNBNC$__________BNBNBsBsBsBsCcCcCcCc______ ______BsBsBsBsCFCFCFBNBNBsBN________BNBNBNBNBNCcCcCcCFCF________ ______BsBsCcCcBNBNBNBsBsCFBN________BNCcBsBsBsBNBNCFCFCF________ ______CcCcCFBNBsCFCFCYCYCBCFBN______BNBsCcBsBsBsBsBNCFCF________ ____CFCFCFBNBsCFCYCYBoCBCBCYBN______BNBsCcCFCFBsBsBsBNCF________ ____CFBNBNBsCFCYBoCBCBBoCBBoCBCB____BNBsBsCcCFCFCFBsBsBN________ ____BNBsBsBsCFCYCBBoBoBoBoBoCBBoCB__BNBsBsCcCFCFCFCFBsBsBN______ ______BsCFCFCYCBCYBoCmBvBvBoBoBoCBBo__BNBsBsCcCFCFCF____________ ________CmCFCBCYCYBoCmBsCICICIBoBoCBCBBNBsBsCcCcCF______________ ________BkCmCBCYCBCmCPBsBsBNBvBvBNBoCBBNBsBsBsCc________________ __________CPCmCYCYCPCu__BsBNCICICIBNBoCYCBCBCBCF________________ __________BkCuCBCYCBCuBoCYBoBNBvBvBNBoBoBoCYCYCBCB______________ ____________CBCuCBCYCuCMBNBNBoCfCICIBNBNBoBoBoBoCYCBCB__________ ____________CBCMCuCYCuCMBNBoBNCIBvBWBoBoBNBoBNBoBoCBCYCB________ ____________BNCYCMCuCYCuCYBNBNCjCICIBNBNCBBNBoBNBoBoBoCB________ __________BoBNCBCYCYCuCuCYBNBoCIBvBvBWBNBoBoBNBN____BoCBCB______ ________BoBoBNAqCBCBCYCuCBBNBoCfCICICIBNBNBoBN____C$BoCBCBCB____ ____BoBoBoBNAqAqC$BoCBCYCuBoBNCfBvBvBWBNBoBoCB_A_A_A_AC$CBC$____ __BNBoBNBNAqAq______BoCBCYBoBoCfCICICIBNBoBNBoBo_A_A_AC$_A_AC$__ __C$__BNAqC$__________Bo__BoBNBNBvBvBWBNBNCBBoBNCBBo_A_ABoBo____ C$____C$__C$____________BoBoBoBNCjCICIBNBoCBBoCBBNBNBoBoBo_A_A__ ______C$____________BoBoCBBoBNBNBiBWBWBWBNBNCBBoBoBNBNBo_A_A_A__ ____________________BoCBCBBNBNAqAqCIBvBvBoAqBNCBBoCB_A_A_A_A____ __________________BoCBBoBoBNAqAq_A_ABWBWBNBNBoCBCBBo_A_A_A______ __________________BoCBBoBoBNAq_A_A_A_A_A_AAqBNBoBoCBBN_A_A______ __________________CBCBBoBNAqAq_A_A_A_A_A_A_ABNBNCBCBBN_A_A_A____ ________________BNBoBoBNBNAq_A_A_A_A_A_A_A_AAqBoBNBNBNBN_A_A_A__ ____________BNBNBNBoBoBNAq_A_A_A_A_A_____A_A_ABNBoBNCBBNBN_A_A__ __________CPBN_ACPBN_ABNAqCP_A_A_______A_A_ACPBN_AAqCP_AAqCP_A__ ___________A_A_A_A_A_A_A_A_A_A_____________A_A_A_A_A_A_A_A_A____ } # tile 148 (white dragon) { BdBd__________________________________________BdBdBdBdBdBdBdBd__ __BdBdBdBd__________________C$______C$C$BdBdBdBdBKBKBKBKBKBK____ ____BKBKBdBdBdBdBdBdBdBdBdC$__________BdBdBKBKBKBKCQBlCQBl______ ______BKBKBKBKBlBlBlBdBdBKBd________BdBdBdBdBdBlCQBlBlBl________ ______BKBKCQBlBdBdBdBKBKBlBd________BdCQBKBKBKBdBdBlBlBl________ ______CQBlBlBdBKBlBlCmCmCPBlBd______BdBKBlBKBKBKBKBdBlBl________ ____BlBlBlBdBKBlCmCmBkCPCPCmBd______BdBKCQBlBlBKBKBKBdBl________ ____BlBdBdBKBlCmBkCPCVBkCVBkCPCP____BdBKBKBlBlBlBlBKBKBd________ ____BdBKBKBKBlCmCVBkBkCPBkBkCVBkCP__BdBKBKCQBlBlBlBlBKBKBd______ ______BKBlBlCmCPCmCPCmBMBMBkCPBkCVBk__BdBKBKBlBlBlBl____________ ________CmBlCPCmCmBkCmBKBnBnBnBkCPCPCPBdBKBKCQBlBl______________ ________BkCmCPCmCPCmCPBKBKBdBMBMBdBkCPBdBKBKBKCQ________________ __________CPCmCmCmCPC$__BKBdBnBnBnBdBkCoCPCPCPBl________________ __________BkC$CPCmCPC$BkCoBkBdBMBMBdCPBkBkCmCmCPCP______________ ____________CPC$CPCmC$_IBdBdBkCSBnBnBdBdBkCPBkBkCmCPCP__________ ____________CP_IC$CmC$_IBkBkBkBnBMBDBnBkBdBkBdCPBkCPCmCP________ ____________BdCm_IC$CmC$CmBdBdCSBnBnBdBdCVBdBkBdBkCPBkCP________ __________BkBdCPCmCmC$C$CmBkBkBnBMBFBDBdCJBkBdBd____BkCPCP______ ________BkCPBdBJCPCPCmC$CPBdBkCSBnBnBnBdBdBnBd____C$BkCVCPCP____ ____BkCPBkBdAjAlC$BkCPCmC$BkBdBnBMBMAiBkBkCJCP_A_A_A_AC$CPC$____ __BdBkBdBdBJBJ______BkCVCmBkCPCSBnBnBnBdBnBdBkCP_A_A_AC$_A_AC$__ __C$__BkAlC$__________Bk__BkBdBdBMBMBDBdBdCVBkBdCPBk_A_MBkBk____ C$____C$__C$____________CPBkCJBdCSBnBnBdBkCPBkCVBdBdCJBnCJ_M_A__ ______C$____________CJBkCPBnBdBdAiBdAiBdBdBdCPBnBkBdBdBk_A_A_A__ ____________________BnCPCPBdBdBJAjBnBMBMBkBDBdCPCJCP_M_A_A_A____ __________________BkCPCJBkBdBDAl_A_zAiBdBdBdBkCPCVBk_A_A_A______ __________________BlCWBlBmBdAl_z_A_A_A_A_ABDBdBkBkCVBd_A_A______ __________________CPCPCJBdAlBD_A_A_A_A_A_A_ABdBkCPCPBd_A_A_A____ ________________BdBkBmBdBdBD_A_A_A_A_A_A_A_ABJBkBdBdBdBd_A_A_A__ ____________BdBdBdCOBlBdBJ_A_A_A_A_A_____A_A_ABkBkBdCPBdBd_A_A__ __________CPBd_ACPBD_ABdAjCK_L_A_______A_A_ACPBd_ABDCP_ABJBn_z__ ___________A_A_A_A_A_A_A_A_A_A_____________A_A_A_A_A_A_A_A_A____ } # tile 149 (orange dragon) { BSBS__________________________________________BSBSBSBSBSBSBSBS__ __BSBSBSBS__________________C$______C$C$BSBSBSBSCTBLCTBjBmBj____ ____BjBmBSBSBSBSBSBSBSBSBSC$__________BSBSBjBmBjBmClClClCl______ ______CTBjCOBjCOCOCOBSBiBjBS________BSBSBSBSBiClClClCOCO________ ______BLCNCWClBSBSBSBjBmCOBS________BSClBjCOBjBiBSCOCOCO________ ______ClCXCOBiBjCOCOCcCcCFCOBS______BiBkClBzBjBmBjBSCOCO________ ____COCOCOBSBkCOCcCcBsCFCFCcBS______BSBzCXCOCiBzCJBmBSCO________ ____COBSBSBzCOCcBsCFCFBsCFBsCFCF____BSCJBmClCOCOCOCTBjBS________ ____BSBkBzBkCOCcCFBsBsBsBsBsCFBsCF__BSBjBzCXCOCOCOCOBmBjBi______ ______BzCWCOCcCFCcBsCmByByBsBsBsCFBs__BSCOBkClCOCOCO____________ ________CmCOCFCcCcBsCmBjCMCMCMBsBsCFCFBSBjBzClClCO______________ ________BkCmCFCcCFCmCPCNBkBSByByBSBsCFBSBmCJBmCl________________ __________CVCmCcCcCPCz__BjBiCMCMCMBSBsCcCFCFCFCO________________ __________BkCzCFCcCFCzBsCcBsBSByByBSBsBsBsCcCcCFCF______________ ____________CFCzCFCcCzCBBSBSBsCjCMCMBSBSBsBsBsBsCcCFCF__________ ____________CFCBCzCcCzCBBSBsBiCMByBaBsBsBSBsBSBsBsCFCcCF________ ____________BSCcCBCzCcCzCcBSBSCjCjCMBSBSCFBSBsBSBsBsBsCF________ __________BsBSCFCcCcCzCzCcBSBsCMByByBaBSBsBsBSBS____BsCFCF______ ________BsBsBSAwCFCFCcCzCFBSBsCjCMCMCMBSBSBsBS____C$BsCFCFCF____ ____BsBsBsBSAwAwC$BsCFCcCzBsBiCMByByBaBSBsBsCF_A_A_A_AC$CFC$____ __BSBsBSBSAwAw______BsCFCcBsBsCjCjCMCMBSBsBSBsBs_A_A_AC$_A_AC$__ __C$__BSAwC$__________Bs__BsBiBSByByBaBSBSCFBsBSCFBs_A_ABsBs____ C$____C$__C$____________BsBsBsBSCjCMCMBSBsCFBsCFBSBSBsBsBs_A_A__ ______C$____________BsBsCFBsBSBiBaBaBaBaBSBSCFBsBsBSBSBs_A_A_A__ ____________________BsCFCFBSBSAwAwCMByByBsAwBSCFBsCF_A_A_A_A____ __________________BsCFBsBsBSAwAw_A_ABaBaBSBSBsCFCFBs_A_A_A______ __________________BsCFBsBsBSAw_A_A_A_A_A_AAwBSBsBsCFBS_A_A______ __________________CFCFBsBSAwAw_A_A_A_A_A_A_ABSBSCFCFBS_A_A_A____ ________________BSBsBsBSBSAw_A_A_A_A_A_A_A_AAwBsBSBSBSBS_A_A_A__ ____________BSBSBSBsBsBSAw_A_A_A_A_A_____A_A_ABSBsBSCFBSBS_A_A__ __________CPBS_ACPBS_ABSAwCP_A_A_______A_A_ACPBS_AAwCP_AAwCP_A__ ___________A_A_A_A_A_A_A_A_A_A_____________A_A_A_A_A_A_A_A_A____ } # tile 150 (black dragon) { _M_M___________________________________________M_MAA_MA__M_M_z__ ___MAK_M_M__________________C$______C$C$_MAA_MA_AeAeAeAeAeAe____ ____AeAeAA_MA__M_MAA_M_MA_C$___________MA_AeAeAeAeBdBdBdBd______ ______AeAeAeAeBJBDAlA_AAAe_M_________$_MAA_M_MBdBdBdAjBJ________ ______AeAeBdBd_M_MA_AeAeBJ_M_________OBdAeAeAeAA_MBJAlBD________ ______BdBdBD_zAeAjBJAOAOABBJ_M______A_AeBdAeAeAeAe_BBDAl________ ____BJAlBD_BAeBJAOAOABABABAO_M_______MAeBdBJAlAeAeAe_zBD________ ____BD_M_MAeAlAOABABABABABABABAB____AAAeAeBdBDAlBDAeAe_M________ _____BAeAeAeBDAOABABABABABABABABAB___MAeAeBdAlBDAlBDAeAe_M______ ______AeAlBJAOABAOABCmAGAGABABABABAB___MAeAeBkAlBDAl____________ ________CmBDABAOAOABCmAeATATATABABABABA_AeAeBdBdBJ______________ ________BkCmABAOABCmCPAeAe_MAGAT_MABAB_MAeAeAeBd________________ __________CPCmAOAOCPAe__Ae_MATATATAAABAOABABABAl________________ __________BkAeABAOABAeABAOAO_zAGAG_MABABABAOAOABAB______________ ____________ABAeABAOAeCB_M_zABBNATATA__MABABABABAOABAB__________ ____________ABCBAeAOAeCB_MABABATAG_$ABABAAAB_MABABABAOAB________ _____________MAOCBAeAOAeAO_z_OBNATAT_M_MABA_AB_MABABABAB________ __________ABABABAOAOAeAeAOABABATAGAG_$ABABAB_zAB____ABABAB______ ________ABAB_z_AABABAOAeAB_zABBNATATAT_z_MAB_O____C$ABABABAB____ ____ABABAB_M_A_AC$ABABAOAeAB_MATAGAG_$ABABABAB_A_A_A_AC$ABC$____ ___MAB_MAK_A_A______ABABAOABABBNATATAT_MAB_zABAB_A_A_AC$_A_AC$__ __C$___M_AC$__________AB__ABAK_MAGAG_$_zABABAB_MABAB_A_AABAB____ C$____C$__C$____________ABABAB_MBNATAT_MABABABAB_zABABABAB_A_A__ ______C$____________ABABABAB_$_MAG_$_$_$AK_MABABAB_M_MAB_A_A_A__ ____________________ABABAB_MAB_A_AATAGAGAB_AAAABABAB_z_A_A_A____ __________________ABABABAB_M_A_A_A_A_$AG_M_MABABABAB_A_A_A______ __________________ABABABABAA_A_A_A_A_A_A_A_z_MABABAB_M_A_A______ __________________ABABAB_M_A_A_A_A_A_A_A_A_AA__MABAB_z_A_A_A____ _________________MABAB_MAK_A_A_A_A_A_A_A_A_A_AABAB_MAB_M_A_A_A__ _____________MAK_MABAK_M_A_A_A_A_A_A_____A_A_z_MAB_zAB_$_M_A_A__ __________CP_z_ACP_z_AAB_ACP_A_A_______A_A_ACP_z_A_ACP_A_ACP_A__ ___________A_A_A_A_A_A_A_A_A_A_____________A_A_A_A_A_A_A_A_A____ } # tile 151 (blue dragon) { _G_G___________________________________________G_G_G_G_G_G_G_G__ ___G_G_G_G__________________C$______C$C$_G_G_G_GBzBzBzBzBzBz____ ____BzBz_G_G_G_G_G_G_G_G_GC$___________G_GBzBzBzBzCkCkCkCk______ ______BzBzBzBzCNCNCN_G_GBz_G_________G_G_G_G_GCkCkCkCNCN________ ______BzBzCkCk_G_G_GBzBzCN_G_________GCkBzBzBz_G_GCNCNCN________ ______CkCkCN_GBzCNCN_J_J_ICN_G_______GBzCkBzBzBzBz_GCNCN________ ____CNCNCN_GBzCN_J_J_H_I_I_J_G_______GBzCkCNCNBzBzBz_GCN________ ____CN_G_GBzCN_J_H_I_I_H_I_H_I_I_____GBzBzCkCNCNCNBzBz_G________ _____GBzBzBzCN_J_I_H_H_H_H_H_I_H_I___GBzBzCkCNCNCNCNBzBz_G______ ______BzCNCN_J_I_J_HCmBvBv_H_H_H_I_H___GBzBzCkCNCNCN____________ ________CmCN_I_J_J_HCmBzCICICI_H_H_I_I_GBzBzCkCkCN______________ ________BkCm_I_J_ICmCPBzBz_GBvBv_G_H_I_GBzBzBzCk________________ __________CPCm_J_JCP_K__Bz_GCICICI_G_H_J_I_I_ICN________________ __________Bk_K_I_J_I_K_H_J_H_GBvBv_G_H_H_H_J_J_I_I______________ _____________I_K_I_J_KCM_G_G_HCfCICI_G_G_H_H_H_H_J_I_I__________ _____________ICM_K_J_KCM_G_H_GCIBvBW_H_H_G_H_G_H_H_I_J_I________ _____________G_JCM_K_J_K_J_G_GCjCICI_G_G_I_G_H_G_H_H_H_I________ ___________H_G_I_J_J_K_K_J_G_HCIBvBvBW_G_H_H_G_G_____H_I_I______ _________H_H_G_F_I_I_J_K_I_G_HCfCICICI_G_G_H_G____C$_H_I_I_I____ _____H_H_H_G_F_FC$_H_I_J_K_H_GCfBvBvBW_G_H_H_I_A_A_A_AC$_IC$____ ___G_H_G_G_F_F_______H_I_J_H_HCfCICICI_G_H_G_H_H_A_A_AC$_A_AC$__ __C$___G_FC$___________H___H_G_GBvBvBW_G_G_I_H_G_I_H_A_A_H_H____ C$____C$__C$_____________H_H_H_GCjCICI_G_H_I_H_I_G_G_H_H_H_A_A__ ______C$_____________H_H_I_H_G_GBiBWBWBW_G_G_I_H_H_G_G_H_A_A_A__ _____________________H_I_I_G_G_F_FCIBvBv_H_F_G_I_H_I_A_A_A_A____ ___________________H_I_H_H_G_F_F_A_ABWBW_G_G_H_I_I_H_A_A_A______ ___________________H_I_H_H_G_F_A_A_A_A_A_A_F_G_H_H_I_G_A_A______ ___________________I_I_H_G_F_F_A_A_A_A_A_A_A_G_G_I_I_G_A_A_A____ _________________G_H_H_G_G_F_A_A_A_A_A_A_A_A_F_H_G_G_G_G_A_A_A__ _____________G_G_G_H_H_G_F_A_A_A_A_A_____A_A_A_G_H_G_I_G_G_A_A__ __________CP_G_ACP_G_A_G_FCP_A_A_______A_A_ACP_G_A_FCP_A_FCP_A__ ___________A_A_A_A_A_A_A_A_A_A_____________A_A_A_A_A_A_A_A_A____ } # tile 152 (green dragon) { _Y_Y___________________________________________Y_Y_Y_Y_Y_Y_Y_Y__ ___Y_Y_Y_Y__________________C$______C$C$_Y_Y_Y_YAqAqAqAqAqAq____ ____AqAq_Y_Y_Y_Y_Y_Y_Y_Y_YC$___________Y_YAqAqAqAqBoBoBoBo______ ______AqAqAqAqBNBNBN_Y_YAq_Y_________Y_Y_Y_Y_YBoBoBoBNBN________ ______AqAqBoBo_Y_Y_YAqAqBN_Y_________YBoAqAqAq_Y_YBNBNBN________ ______BoBoBN_YAqBNBN_n_n_iBN_Y_______YAqBoAqAqAqAq_YBNBN________ ____BNBNBN_YAqBN_n_n_d_i_i_n_Y_______YAqBoBNBNAqAqAq_YBN________ ____BN_Y_YAqBN_n_d_i_i_d_i_d_i_i_____YAqAqBoBNBNBNAqAq_Y________ _____YAqAqAqBN_n_i_d_d_d_d_d_i_d_i___YAqAqBoBNBNBNBNAqAq_Y______ ______AqBNBN_n_i_n_dCmAQAQ_d_d_d_i_d___YAqAqBoBNBNBN____________ ________CmBN_i_n_n_dCmAqAgAgAg_d_d_i_i_YAqAqBoBoBN______________ ________BkCm_i_n_iCmCPAqAq_YAQAQ_Y_d_i_YAqAqAqBo________________ __________CPCm_n_nCP_r__Aq_YAgAgAg_Y_d_n_i_i_iBN________________ __________Bk_r_i_n_i_r_d_n_d_YAQAQ_Y_d_d_d_n_n_i_i______________ _____________i_r_i_n_rCB_Y_Y_dBGAgAg_Y_Y_d_d_d_d_n_i_i__________ _____________iCB_r_n_rCB_Y_d_YAQAQAC_d_d_Y_d_Y_d_d_i_n_i________ _____________Y_nCB_r_n_r_n_Y_YBGAgAg_Y_Y_i_Y_d_Y_d_d_d_i________ ___________d_Y_i_n_n_r_r_n_Y_dAgAQAQAC_Y_d_d_Y_Y_____d_i_i______ _________d_d_Y_U_i_i_n_r_i_Y_dAnAgAgAg_Y_Y_d_Y____C$_d_i_i_i____ _____d_d_d_Y_U_UC$_d_i_n_r_d_YAgAQAQAC_Y_d_d_i_A_A_A_AC$_iC$____ ___Y_d_Y_Y_U_U_______d_i_n_d_dBGAgAgAg_Y_d_Y_d_d_A_A_AC$_A_AC$__ __C$___Y_UC$___________d___d_Y_UAQAQAC_Y_Y_i_d_Y_i_d_A_A_d_d____ C$____C$__C$_____________d_d_d_YBGAgAg_Y_d_i_d_i_Y_Y_d_d_d_A_A__ ______C$_____________d_d_i_d_Y_UACACACAC_Y_Y_i_d_d_Y_Y_d_A_A_A__ _____________________d_i_i_Y_Y_U_UAgAQAQ_d_U_Y_i_d_i_A_A_A_A____ ___________________d_i_d_d_Y_U_U_A_AACAC_Y_Y_d_i_i_d_A_A_A______ ___________________d_i_d_d_Y_U_A_A_A_A_A_A_U_Y_d_d_i_Y_A_A______ ___________________i_i_d_Y_U_U_A_A_A_A_A_A_A_Y_Y_i_i_Y_A_A_A____ _________________Y_d_d_Y_Y_U_A_A_A_A_A_A_A_A_U_d_Y_Y_Y_Y_A_A_A__ _____________Y_Y_Y_d_d_Y_U_A_A_A_A_A_____A_A_A_Y_d_Y_i_Y_Y_A_A__ __________CP_U_ACP_Y_A_Y_UCP_A_A_______A_A_ACP_U_A_UCP_A_UCP_A__ ___________A_A_A_A_A_A_A_A_A_A_____________A_A_A_A_A_A_A_A_A____ } # tile 153 (yellow dragon) { AzBW__________________________________________AzBWAzAgAzBWAzAg__ __AzAgAzAz__________________C$______C$C$AzBWAzAgBsBsBsBsBsBs____ ____BsBsBaAzAzAgBWAzAzBWAgC$__________AzAgBsBsBsBsCcCcCcCc______ ______BsBsBsBsCFCFCFAgAzBsAz________AzBaAzBWAzCcCcCcCFCF________ ______BsBsCcCcAzBWAgCABsCFBW________AgCcBsBsBsAgBWCFCFCF________ ______CcCcCFAgBsCFCFCMCMByBvAz______AzBsCcBsBsBsBsAzCFCF________ ____CFCFCFAzBsCFCMCMBaByByCMBW______AzBsCcCFCFBsBsBsAzCF________ ____CFAzBWBsCFCMBaByByBaByBaByBy____AgBsBsCcCFCFCFBsBvAz________ ____AzBvBiBsCFCMByBaBaBaBaBaByBaBy__BWBsBsCcCFCFCFCFBsBsBW______ ______BsCFCFCMByCMBaCmBzBzBaBaBaByBa__AzBsBsCcCFCFCF____________ ________CmCFByCMCMBaCmBsCNCNCNBaBaByByAzBvBsCcCcCF______________ ________BkCmByCMByCmCPBsBsAzBzBzAzBaByAzBsBsBsCc________________ __________CPCmCMCMCPCj__BsBWCNCNCNAgBaCMByByByCF________________ __________BkCjByCMByCjBaCMBaAgBzBzBWBaBaBaCMCMByBy______________ ____________ByCjByCMCjCBAzAzBaCtCNCNAzBWBaBaBaBaCMByBy__________ ____________ByCBCjCMCjCBAgBaBWCNBzBbBaBaAzBaAzBaBaByCMBy________ ____________AzCMCBCjCMCjCMAzAgCtCNCNAgAzByAgBaBWBaBaBaBy________ __________BaBWByCMCMCjCjCMBWBaCNBzBzBbBWBaBvAgAz____BaByBy______ ________BaBaAgAcByByCMCjByAzBaCtCNCNCNAgAzBaAz____C$BaByByBy____ ____BaBaBaAzAbAcC$BaByCMCjBaAzCNBzBzBbBWBaBaBy_L_A_A_AC$ByC$____ __AzBaAzAgAcAc______BaByCMBaBaCtCNCNCNAzBaAzBaBa_A_A_AC$_A_AC$__ __C$__BWAcC$__________Ba__BaAgAzBzBzBbBWAgByBaAzByBa_A_ABaBa____ C$____C$__C$____________BaBaBaBWCtCNCNAzBaByBaByBWAgBaBaBa_A_A__ ______C$____________BaBaByBvAgAzBbBbBbBbAgBWByBaBaAzAzBa_A_A_A__ ____________________BaByByAzBWAcAcCNBzBzBaAcAzByBaBy_L_A_A_A____ __________________BaByBaBaAgAcAc_A_ABbBbAzAgBaByByBa_A_A_A______ __________________BaByBaBaAzAc_A_A_A_A_A_AAcBWBaBaByAz_L_A______ __________________ByByBaBWAcAc_A_A_A_A_A_A_LAzAgByByAz_A_A_A____ ________________AzBaBaAzAgAc_A_A_A_A_A_A_A_AAcBaBWAgBWAg_z_A_A__ ____________AzAgBWBaBaAzAc_A_A_A_A_A_____A_A_LAzBaAzByAzAz_A_A__ __________CPAz_ACPAz_NBWAcCP_A_A_______A_A_ACPAz_LAcCP_LAcCP_A__ ___________A_L_A_A_A_A_A_A_A_A_____________A_A_L_A_A_A_A_A_A____ } # tile 155 (air elemental) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________AiAiAiAiAiAiAiAiAiAiAi__________ ________________________AiAiAiAiAEAEAEAEAEAEAEAEAEAEAiAiAi______ ______________________AiAiAiAEAEAiAiAiAiAiAiAiAiAEAEAEAEAiAi____ ____________________AiAiAEAEAiAiAEAEAEAEAEAEAEAEAiAiAiAEAiAi____ ____________________AiAEAEAiAEAEAEAEAEAiAEAEAiAEAiAEAEBnApBI____ ____________________AiAiAEAEAEAiAiAiAiAiAiAiAEAEAEAEBIApBI______ ______________________AEAiAiAiAiAEAEAEAEAEAEAiAiAiApAiBIAp______ ______________________AEAEAiAiAiAiAiAiAiAiAiAiAiApApBIAp________ ______________________AEAEAEAEAEAiAiAiAiAiAiAiApAiAiBIAp________ ______________________AEAiAEAiAiAiAEAEAEAiAiAiApApBIApBI________ ______________________AEAEAEAiAEAEAiAiAiAiAiAiAiAiApBI__________ ______________________AiAEAEAEAiAiAiAiBIApAiBIApAiBI____________ ______________________AEAEAiAiAEAEAiAiAiAiBIAjAiBIAp____________ ____________________AEAEAEAEAEAiAiAiAiAiAiAjAiBIAp______________ ____________________AEAEAEAiAEAEAEAiApAiBIApBIApAEAEAEAE________ ____________________AEAiAEAEAiAiAiAiAiAiAiBIApAEAEAEAEAEAE______ ____________________AEAEAEAEAEAEAiAiBIApBIApAEAEAEAEAEAEAE______ __________________AEAiAEAiAiAiAiAiAiAjBIApAEAEAEAEAEAEAEAE______ __________________AEAiAEAEAEAiAiAiApBIApAEAEAEAEAEAEAEAEAE______ ________________AEAEAEAiAiAiAiBIApBIAEAEAEAEAEAEAEAEAE__________ ________________AEAiAiAiAiAiApBIApAEAEAEAEAEAEAEAEAE____________ ______________AiAEAEAEAiAiApBIAEAEAEAEAEAEAEAEAEAE______________ ____________AEAEAiAiAiAiBIAEAEAEAEAEAEAEAEAEAE__________________ ____________AiAEAiBIApAEAEAEAEAEAEAEAEAEAEAE____________________ ________AEAEAEAiApAEAEAEAEAEAEAEAEAEAE__________________________ ______AEAEAiAiAEAEAEAEAEAEAEAEAE________________________________ ______AEAi____AEAEAEAEAEAE______________________________________ ________AEAEAEAE________________________________________________ } # tile 156 (fire elemental) { ________________________Cu______Cu______________________________ ____________Cu__________Cu____CuCu______________________________ ____________Cu__________CuCu__CuCu__Cu__________________________ ____________Cu__Cu__________CfCuCuCfCu____________Cu____________ ________________Cu________CuCjCuCuCjCu__________CuCu____________ ____________CuCuCu________CuCjCfCuCfCf__________Cu______________ ____________CuCf________CuCuC$CfCuC$Cj__________________________ ____________CuCj____Cu__CuCuCuCuCuCuCuCu______Cu________Cu______ ____________CuCfCj__Cu____CuCuCuCjCuCuCu____CuCu______Cu________ ______________CuCf__Cu____CuCuCjCjCuCu______CuCf______Cu________ ______________CuCj__CfCuCuCuCfCjCjCjCuCuCu____Cj______Cu________ ________________CfCuCjCfCjCfCjCjCjCfCfCjCfCjCuCfCu______________ ____________CuCuCuCjCfCjCuCuCfCjCjCjCjCuCuCfCjCfCu____Cu________ ____________CuCjCfCf______CuCjCjCjCfCu____CuCfCjCu__CuCu________ __________CuCfCjCuCu______CuCuCfCjCjCu______CuCfCjCuCfCu________ __________CuCuCu____________CuCuCjCuCu________CuCfCfCjCu________ ____________________Cu____CzCzCuCjCuCu__________CuCuCu__________ ____________________Cu__CuCzCjCjCjCuCu__________________________ ______________Cu____Cu__CuCzCjCjCfCuCu__________________________ ______________Cu____CfCuCuCzCjCfCuCu____________________________ ______________Cu____CuCuCjCfCjCjCuCu____________________________ ______________CuCu__CuCjCjCjCjCuCu______________________________ ____________CuCuCu__CuCfCuCuCuCu___________A_A_A_A_A_A__________ __________CuCfCu____CuCfCj___________A_A_A_A_A_A_A_A_A_A________ __________CuCjCu__CuCjCfCu_________A_A_A_A_A_A_A_A_A_A_A________ __________CuCjCu__CjCfCu_____A_A_A_A_A_A_A_A_A_A_A_A_A_A________ ________CuCjCjCuCuCfCu_L_A_A_A_A_A_A_A_A_A_A____________________ ______CuCuCjCjCjCfCj_A_A_A_A_A_A_A_A_A_A________________________ ______CfCjCuCuCu_z_z_A_A_A_A_A__________________________________ __CuCuCu_z_A_A_A_A_A_A__________________________________________ ___A_A_A_A_A____________________________________________________ ________________________________________________________________ } # tile 157 (earth elemental) { ________________________CmCmCmCmCm______________________________ ______________________CcCmCmCmCmCFCF____________________________ __________________CcCcCcCmCmCmBsCFCF____________________________ __________________CcCcCcCmBsBsBsCFCFCF__________________________ __________________CcCcCcBsBsBsBsCFCFCFCF________________________ __________________CcCcBsBsBsBsBsCFCFCFCF________________________ ____________BsBsBsBsBsBsBsBsBsBsCFCFCFCF________________________ ______CcCcCcBsBsBsBsBsBsBsBsBsBsCFCFCFCF________________________ ____CcCcCcCcBsBsBsBsBsBsBsBsBsBsCFCFCcCcCcCcCcCcCcCcCc__________ __CcCcCcCcCFCFCFBsBsBsBsBSBSBSBSCcCcCcCcCcCcCcCcCcCcCcCc________ CcCcCcCcCFCFCFCFBsBSBSBSBSBSBSBSBsBsCcCcCcCcCcCcCcCcCcCcCc______ CcCcCcCFCFCFCFCFBSBSBSBSBSBSBSBsBsBsBsBsBsBsCcCcCcCcCcCcCc______ __CFCFCFCFCFCFCFCFBSBSBSBSBSCFCFBsBsBsBsBsBsBsBsCFCFCFCFCFCF____ __CFCFCFCFCF____CcCcBSBSBSBSCFCFCFBsBsBsBsBsBsBsCFCFCFCFCFCF____ ____CFCF________CcCcCcBSBSCFCFCFCFCFCF__BsBsBsBsBsCFCFCFCFCF____ ________________CcCcCcCcBSCFCFCFCFCFCF______BsBsBsCFCFCFCF______ ________________CcCcCcCcBsBSCFCFCFCFCF__________________________ ______________CFCFCcCcCcBsBsBSCFCFCFCF__________________________ ____________CFCFCFCFCcBsBsBSBSBSCFCFCF__________________________ __________CFCFCFCFCFCFBsBsBSBSBSBSCFCF__________________________ ________CcCcCFCFCFCFBsBsBSBSBSBSBSBSCF__________________________ ________CcCcCcBsBsBsBsBSBS__CcBSBSBSBSBS_________A_A_A_A_A_A____ ________CcCcCcBsBsBsBs______CcCcBSBSBSBSBS___A_A_A_A_A_A_A_A_A__ ________CcCcCcBsBsBsBs______CcCcCcBsBsBsBSBS_A_A_A_A_A_A_A_A_A__ ________CcCcCcBsBsBsBs______CcCcCcBsBsBsBsBs_A_A_A_A_A_A_A_A____ ________CcCcCcBsBsBsBs_A_A_ACcCcCcBsBsBsBsBs_A_A_A_A_A_A_A______ ________CcCcCcBsBsBsBs_A_A_ACcCcCcBsBsBsBsBs_A_A_A_A_A_A________ _____A_ACcCcCcBsBsBsBs_A_A_ACcCcCcBsBsBsBsBs_A_A_A_A_A__________ _____A_ACcCcCcBsBsBsBs_A_A_A_ACcCcBsBsBsBsBs_A_A_A______________ _____A_A_ACcCcBsBsBs_A_A_A_A_ACcCcBsBsBsBsBs_A__________________ _________A_A_ABs_A_A_A_A_A_A_A_ACcBsBs_A_A_A_A__________________ _____________A_A_A_A_A_A_A_A_A_A_A_A_A_A________________________ } # tile 158 (water elemental) { ________________________________________________________________ ___________________________k_k_k_k_k____________________________ _________________________k_kCP_k_k_k_k__________________________ _________________________k_kCP_k_k_k_k__________________________ _______________________k_kCPCP_k_k_k_k_k________________________ _____________________k_g_f_fCP_f_f_k_k_k_k______________________ ___________________k_k_g_f_fCP_f_f_k_k_kCP_k____________________ _________________k_kCP_g_gCPCP_k_k_k_k_k_kCP_k__________________ _______________k_kCP_g_g_gCPCP_k_k_k_k_k_k_kCP_k________________ _______________kCP_g_g_g_kCPCP_k_k_k_k_g_k_k_kCP_k______________ _____________k_kCP_g_g_g_kCPCP_k_k_k_k_g_g_g_k_kCP_k____________ ___________k_kCP_g_g___k_kCPCP_k_k_k_k_k___g_g_k_kCP____________ ___________kCP_g_g_____k_kCPCP_k_k_k_k_k_____g_g_k_k_g__________ _________gCP_k_g_g_____k_kCPCP_k_k_k_k_k_______g_g_g_g__________ _________gCP_g_g_______k_kCPCP_k_k_k_k_k_________g_g____________ _________g_g_g_g_______k_kCPCP_g_g_g_k_k________________________ ___________g_g_________k_gCPCP_g_g_g_g_k_k_____________A_A_A____ _____________________g_g_gCPCP_g_g_g_g_g_g_______A_A_A_A_A_A_A__ _____________________g_g_gCPCP_g_g_g_g_g_g_g_A_A_A_A_A_A_A_A_A__ ___________________g_g_g_gCPCP_g_g_g_g_g_g_g_A_A_A_A_A_A_A_A_A__ ___________________g_g_g_gCPCP_f_f_f_f_g_g_g_g_A_A_A_A_A_A_A____ _________________g_g_g_f_fCPCP_f_f_f_f_f_f_g_g_g_A_A_A_A_A______ _________________g_f_f_fCPCPCP_f_f_f_f_f_f_f_f_g_A_A_A_A________ _________________f_f_f_fCPCP_f_f_f_f_f_f_f_f_f_f_A_A_A__________ _________________f_f_fCPCPCP_f_f_f_f_f_f_f_f_f_f_A_A____________ _________________A_f_fCPCP_f_f_f_f_f_f_f_f_f_f_A_A_A____________ _________________A_A_ACPCP_f_f_f_f_f_f_f_f_A_A_A_A______________ ___________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A________________ _______________________A_A_A_A_A_A_A_A_A_A_A____________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 160 (brown mold) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________CFCFCF________________________________ ________________CFCFCFCFCFCFBSCFCF____CFCFCF____________________ ______________CFCFBSBSCFBSBSBSBSCFCFCFBSBSCFCF__________________ __________CFCFBSBSBSBSCFBSBSBSBSCFCFBSBSBSBSCFCF________________ ________CFCFCFBSBSBSBSCFBSBSBSCFCFCFCFBSBSBSBSCF________________ ______CFBSBSBSCFCFCFCFCFCFBSBSCFBSBSCFCFCFBSBSCFCFCF____________ ______CFBSBSBSBSCFBSBSBSBSCFCFBSBSBSBSBSCFCFCFCFBSCFCF__________ ______CFBSBSCFCFCFBSBSBSBSBSCFBSBSBSBSBSCFBSBSCFBSBSCF__________ ______CFBSCFBSBSCFBSBSBSBSBSCFBSBSBSBSBSCFBSBSBSCFBSCF__________ ______CFCFBSBSBSCFBSBSBSBSCFCFCFBSBSBSCFCFBSBSBSBSCFCF__________ ______CFCFBSBSBSCFCFCFCFCFBSBSCFCFBSCFCFCFBSBSBSBSCF____________ ________CFCFBSCFBSBSBSCFBSBSBSBSBSCFCFBSBSCFBSBSCF______________ _______ACFCFCFCFBSBSBSCFBSBSBSBSBSBSCFBSBSBSCFCFCF_A____________ _____A_A_A_ACFCFCFBSBSCFCFBSBSBSBSCFBSBSBSBSCFCF_A_A_A__________ _____A_A_A_A_A_ACFBSBSBSCFCFCFCFCFCFBSBSBSCFCFCF_A_A_A__________ _____A_A_A_A_A_ACFCFCFCFCF_A_A_A_ACFCFCFCFCF_A_A_A_A_A__________ _______A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A____________ ___________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A______________ _________________A_A_A_A_A_A_A_A_A_A_A_A_A______________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 161 (yellow mold) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________CMCMCM________________________________ ________________CMCMCMCMCMCMByCMCM____CMCMCM____________________ ______________CMCMByByCMByByByByCMCMCMByByCMCM__________________ __________CMCMByByByByCMByByByByCMCMByByByByCMCM________________ ________CMCMCMByByAcAcCMAcAcAcCMCMCMCMAcAcByByCM________________ ______CMByByByCMCMCMCMCMCMAcAcCMAcAcCMCMCMAcByCMCMCM____________ ______CMByByAcAcCMAcAcAcAcCMCMAcAcAcAcAcCMCMCMCMByCMCM__________ ______CMByByCMCMCMAcAcAcAcAcCMAcAcAcAcAcCMAcAcCMByByCM__________ ______CMByCMAcAcCMAcAcAcAcAcCMAcAcAcAcAcCMAcAcByCMByCM__________ ______CMCMByAcAcCMAcAcAcAcCMCMCMAcAcAcCMCMAcAcByByCMCM__________ ______CMCMByByAcCMCMCMCMCMAcAcCMCMAcCMCMCMAcByByByCM____________ ________CMCMByCMAcAcAcCMAcAcAcAcAcCMCMAcAcCMByByCM______________ _______ACMCMCMByByAcAcCMAcAcAcAcAcAcCMAcAcByCMCMCM_A____________ _____A_A_A_ACMCMByByByByCMByByByByCMByByByByCMCM_A_A_A__________ _____A_A_A_A_A_ACMByByByCMCMCMCMCMCMByByByCMCMCM_A_A_A__________ _____A_A_A_A_A_ACMCMCMCMCM_A_A_A_ACMCMCMCMCM_A_A_A_A_A__________ _______A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A____________ ___________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A______________ _________________A_A_A_A_A_A_A_A_A_A_A_A_A______________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 162 (green mold) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ___________________________q_q_q________________________________ _________________q_q_q_q_q_q_h_q_q_____q_q_q____________________ _______________q_q_h_h_q_h_h_h_h_q_q_q_h_h_q_q__________________ ___________q_q_h_h_h_h_q_h_h_h_h_q_q_h_h_h_h_q_q________________ _________q_q_q_h_h_c_c_q_c_c_c_q_q_q_q_c_c_h_h_q________________ _______q_h_h_h_q_q_q_q_q_q_c_c_q_c_c_q_q_q_c_h_q_q_q____________ _______q_h_h_c_c_q_c_c_c_c_q_q_c_c_c_c_c_q_q_q_q_h_q_q__________ _______q_h_h_q_q_q_c_c_c_c_c_q_c_c_c_c_c_q_c_c_q_h_h_q__________ _______q_h_q_c_c_q_c_c_c_c_c_q_c_c_c_c_c_q_c_c_h_q_h_q__________ _______q_q_h_c_c_q_c_c_c_c_q_q_q_c_c_c_q_q_c_c_h_h_q_q__________ _______q_q_h_h_c_q_q_q_q_q_c_c_q_q_c_q_q_q_c_h_h_h_q____________ _________q_q_h_q_c_c_c_q_c_c_c_c_c_q_q_c_c_q_h_h_q______________ _______A_q_q_q_h_h_c_c_q_c_c_c_c_c_c_q_c_c_h_q_q_q_A____________ _____A_A_A_A_q_q_h_h_h_h_q_h_h_h_h_q_h_h_h_h_q_q_A_A_A__________ _____A_A_A_A_A_A_q_h_h_h_q_q_q_q_q_q_h_h_h_q_q_q_A_A_A__________ _____A_A_A_A_A_A_q_q_q_q_q_A_A_A_A_q_q_q_q_q_A_A_A_A_A__________ _______A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A____________ ___________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A______________ _________________A_A_A_A_A_A_A_A_A_A_A_A_A______________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 163 (red mold) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________CBCBCB________________________________ ________________CBCBCBCBCBCBBNCBCB____CBCBCB____________________ ______________CBCBBNBNCBBNBNBNBNCBCBCBBNBNCBCB__________________ __________CBCBBNBNBNBNCBBNBNBNBNCBCBBNBNBNBNCBCB________________ ________CBCBCBBNBNATATCBATATATCBCBCBCBATATBNBNCB________________ ______CBBNBNBNCBCBCBCBCBCBATATCBATATCBCBCBATBNCBCBCB____________ ______CBBNBNATATCBATATATATCBCBATATATATATCBCBCBCBBNCBCB__________ ______CBBNBNCBCBCBATATATATATCBATATATATATCBATATCBBNBNCB__________ ______CBBNCBATATCBATATATATATCBATATATATATCBATATBNCBBNCB__________ ______CBCBBNATATCBATATATATCBCBCBATATATCBCBATATBNBNCBCB__________ ______CBCBBNBNATCBCBCBCBCBATATCBCBATCBCBCBATBNBNBNCB____________ ________CBCBBNCBATATATCBATATATATATCBCBATATCBBNBNCB______________ _______ACBCBCBBNBNATATCBATATATATATATCBATATBNCBCBCB_A____________ _____A_A_A_ACBCBBNBNBNBNCBBNBNBNBNCBBNBNBNBNCBCB_A_A_A__________ _____A_A_A_A_A_ACBBNBNBNCBCBCBCBCBCBBNBNBNCBCBCB_A_A_A__________ _____A_A_A_A_A_ACBCBCBCBCB_A_A_A_ACBCBCBCBCB_A_A_A_A_A__________ _______A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A____________ ___________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A______________ _________________A_A_A_A_A_A_A_A_A_A_A_A_A______________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 164 (shrieker) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________________CtBg_t______________________________ ____________________CtCtBgBgBfBf_t_q_q_h_h_h____________________ __________________CtCsBgBfBgBfBf_t_t_t_q_q_h____________________ ____________CtCsCtBgBgBfBgBfChCwBf_t_tCwCu_q_h_h_h______________ __________CsCtBgBgCtBfBgBfBfCwCwCDBfCwChCwCD_q_h_h_h_h__________ ____CtCtCtBgBgBfBfCwCwBfBfBf_qCD_qBfCwChChCD_q_q_q_h_q__________ __CtCsBfBfBgBfCtCwChChCwBfBfBf_q_qBf_tCwCDCD_t_q_q_q_h_h_h_h____ __BgBfCwChBfBfBfCwChCwCD_qBfBfBfBfBf_t_q_q_t_q_t_q_q_hCwCu_h____ BgBfCwChChCwBfBfBfCwCD_qBfBfBfBfBf_t_t_t_t_t_t_t_t_qCwChCwCD_h__ CtBfCwChCwCDBfBfBf_q_qBfBf_tBfCwCh_t_tBf_tChCw_t_t_qCwChCDCD_h_T Bf_tBfCwCD_q_qBfBfBfBfBf_t_tCwChChCwBf_tCwChCwCD_t_q_qCwCD_h_h_T Ct_t_tBf_q_qBfBfCwCwBfBfBf_tCwCwChCDBf_tCwCwCDCD_q_t_q_q_h_h_T__ ___q_t_t_tBf_tBfCwCD_qBf_t_t_qCwCDCD_t_t_tCwCD_t_q_q_q_h_q_T____ _______q_t_t_t_t_t_q_t_t_t_t_t_q_q_t_t_t_t_q_q_q_q_q_T_T_T______ ___________q_q_q_q_q_q_q_t_t_t_t_t_q_q_q_q_q_q_T_T_T____________ _____________________h_h_q_q_q_q_q_q_h_T_T_T_T_A_A_A_A_A_A_A_A__ _________________________h_h_h_h_h_h_T_A_A_A_A_A_A_A_A_A_A_A_A_A ___________________A_q_t_t_q_q_h_h_h_h_T_A_A_A_A_A_A_A_A_A_A_A_A _________________A_q_t_tBfBf_t_q_h_h_h_h_T_T_A_A_A_A_A_A_A_A_A_A _______________A_q_q_tBfBfBfBf_t_q_q_h_h_h_T_T_A_A_A_A_A_A_A_A__ _______________A_A_q_q_q_tBf_t_t_q_q_q_h_h_T_A_A_A_A_A_A_A_A____ _________________A_A_A_q_q_q_q_q_q_q_q_A_A_A_A_A_A_A_A__________ ___________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A______________ _______________________A_A_A_A_A_A_A_A_A________________________ ________________________________________________________________ } # tile 165 (violet fungus) { ________________________________________________________________ ________________________________BpCCCY__________________________ ______________________________CCCCBpBpCYBO______________________ ________________________BpCCCYCCCYCYBpBpBOCBBOCB________________ ____________________BpBpCYCCCCCCCYBpCYBpBpBOBpBOBOCB____________ __________________BpBpCYCCCYCCBpBpCYCYBpBpCYBpCBBOBOBO__________ ______________BpCYCYCCCYCYCCCCCCCYBpBpBpCYBpCYBpCBCBBOBOCB______ ____________BpCYBpCYCCCCCCCYCCCYBpCYBpBpCYCYBpBpCBBOCBBOBO______ __________BpBpBpCYBpBpBpBpArArBpArArBpArArBpBpBOBOCBBOBOBOCB____ __________BpCYArArArBpArArBpArBpArArBpArBpArArBpArArBpBpBOBO____ ____Bp______BpArArArArBpArBpArBpArBpArBpArArBpArArBpArArBpBp____ ____BpCC__________BpArArBpArArBpArBpArBpArBpArArBpArBpBp________ ____BpBpCC__________BpArArBpArArBpArBpArBpArBpBpAr______________ ____BOBpCC____________BpBpBpArBpBpBpBpBpBpBp____________________ ____BOBpBpCC______________BpCCBpBOBOBOBO_______A_A_A_A_A_A______ ______BOBpBp____________BOBpCCBpBOBpBOBpCC___A_A_A_A_A_A_A_A____ ________BOBpBpBp______BpCCCCCCBpCCBOBpBpCC___A_A_A_A_A_A_A_A_A__ ________BOBpBpCCCC__BpCCCCBpCCBpCCBOBOBpBpBpBp_A_A_A_A_A_A_A_A__ __________BOBpBpBpCCCCBpBpBpCCBpCCBpBOBOBOBOBpBpBp_A_A_A_A_A_A_A ____________BOBpBpBpBpBpBOCCBpBpCCBpBOBOBpBOBOBpBpBpCCCCCC_A_A_A __________________BOBOBOBOBpBpCCCCBOBpBO_A_A_ABOBOBOBOBpBpCC_A_A ____________________BpBpBOBpCCCCBpBOBpBOBp_A_A_A_A_A_ABOBpBpBp__ ______________________BpCCCCCCBOBOBOBpBOBO_A_A_A_A_A_A_ABOBOCC__ ______________CCCCCCCCCCBpBpBpBOBOBOBpBOBOBp_A_A_A_A_A_A__BpBp__ ____________CCCCBpBpBOBOBOBOBOBpBOBOBpBOBpBpBp_A_A_A_A__BpBpCC__ ________CCCCBpBOBpBO__BOBpCCBOBOBpBOBOBOBpCCBp_A_A_A_A__BpBp____ ______CCCCBpBOBO____BpCCCCBpBOBpBpBOBOBOBpBpCC_A_A_A____________ ______BpBpBO____BpBpCCBpBpBpBOBpBOBpBpBOBOBpCCBp_A_A____________ ________________BpCCBpBpBpBOBOBpCCBpBOBOBOBOCCCCBp_A____________ ______________CCCCBpBpBOBpBOBpBOCCBpBO_ABOBOBpBp_A______________ _____________ABpBpBOBOBOBO_ABOBOCCBpBp_A_A_A_A_A________________ _____________A_A_ABpBp_A_A_A_A_ABpBp_A_A_A______________________ } # tile 166 (gnome) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________CuCu_t______________________________________ ____________________CuCu_t_m____________________________________ _________________________q_m____________________________________ _______________________t_q_m_m__________________________________ _______________________t_q_q_m__________________________________ _____________________t_t_q_q_m_m________________________________ _____________________t_t_q_q_m_m________________________________ ___________________t_tCTCTCTCT_m_m______________________________ _________________t_t_A_ACiCn_A_A_m_m_________________A_A________ __________________CnCnCnClCTCnCnCT_______________A_A_A_A________ __________________CmCnClCnCiCTCnCV___________A_A_A_A_A__________ __________________C$CmClCiCnCTCVCP_____A_A_A_A_A_A_A_A__________ _______________t_t_qCmCVCnCnCVCP_m_m_m_A_A_A_A_A_A_A____________ _____________t_q_q_t_qC$CVCPCV_m_q_q_q_m_A_A_A_A_A_A____________ ___________t_q_q___t_qCmCPCmCP_q_m_A_q_q_m_A_A_A_A_A_A__________ ___________t_q_____t_t_qCmCP_m_m_m_A_A_q_m_A_A_A_A_A_A__________ __________CiCn____CFCFBsC$CPAwBSBS_A_ACiCn_z_A_A___A_A__________ __________CnCi____CFCFBsCVCPAwBSBS_A_zCnCi_A_A_____A_A__________ ___________________t_q_q_m_m_q_q_m_A_A_z_z_A_____A_A____________ ___________________t_q_q_A_A_t_q_m_A_A_A_A_____A_A______________ ___________________t_q_q_A_A_t_q_m_A_A_A________________________ ________________BsBsBsBs_A_ABsBsBsBs_A_A________________________ ______________BsBsBsBSBS_A_ABsBSBSBSBS_A________________________ _________________A_A_A_A_A_A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ } # tile 167 (gnome lord) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________CuCuCj______________________________________ ____________________CuCuCjBy____________________________________ ________________________CMBy____________________________________ ______________________CjCMByBy__________________________________ ______________________CjCMCMBy__________________________________ ____________________CjCjCMCMByBy________________________________ ____________________CjCjCMCMByBy________________________________ __________________CjCjCTCTCTCTByBy______________________________ ________________CjCj_A_ACiCn_A_AByBy_________________A_A________ __________________CnCnCnClCTCnCnCT_______________A_A_A_A________ __________________CmCnClCnCiCTCnCV___________A_A_A_A_A__________ __________________C$CmClCiCnCTCVCP_____A_A_A_A_A_A_A_A__________ ______________CjCjCMCmCVCnCnCVCPByByBy_A_A_A_A_A_A_A____________ ____________CjCMCMCjCMC$CVCPCVByCMCMCMBy_A_A_A_A_A_A____________ __________CjCMCM__CjCMCmCPCmCPCMBy_ACMCMBy_A_A_A_A_A_A__________ __________CjCM____CjCjCMCmCPByByBy_A_ACMBy_A_A_A_A_A_A__________ __________CiCn____CFCFBsC$CPAwBSBS_A_ACiCn_z_A_A___A_A__________ __________CnCi____CFCFBsCVCPAwBSBS_A_zCnCi_A_A_____A_A__________ __________________CjCMCMByByCMCMBy_A_A_z_z_A_____A_A____________ __________________CjCMCM_A_ACjCMBy_A_A_A_A_____A_A______________ __________________CjCMCM_A_ACjCMBy_A_A_A________________________ ________________BsBsBsBs_A_ABsBsBsBs_A_A________________________ ______________BsBsBsBSBS_A_ABsBSBSBSBS_A________________________ _________________A_A_A_A_A_A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ } # tile 168 (gnomish wizard) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________________________Cu______________________BsBs______ ______________________________CYBo__________________BsAwBSBS____ ______________________________CYBN________________BsBS____Aw____ ____________________________CuCYBN________________BSAw__BSAw____ ____________________________CuCYBoBN______________BSAw__Aw______ ____________________________CYCBBoBN________________Aw__________ __________________________CuCYCBBoBoBN______________BSBS________ __________________CBBoBoBoCuCYCBBoBoBNCBBoCBCBCB____BSAw________ ________CBCBBoCBCBCBCBCBCBCBCYCBCBBoCBCBCBBoBoBoBoBo_AAw________ ________________BoBoBoCBCBCBCBCBCBCBBoBoBo_A_A_A_A_A_ABS_A_A____ ________________________CPCP_ACiCn_ABdBD_____A_A_A_A_ABS_A_A____ ______________________CYBoCPCnCnCnCTBkCBCuCu_A_A_A_A_zCnCi______ __________________CBCBCYCYCVCnCnCTCTCJBoCBCBCuCuCuCBCiCiCn______ ________________CBCuCuCBCYBoCPCnCTBdBoCBBoCBBoCBBoCYCnAw_z_A____ ______________CBCuCuCBBoBoCBCVCPCVBkBoCBBoCBBoCBBoBo_LAw_A_A_A__ ____________CBCuCuCBBoBoBoCBBoCPCmBoCBCBBNBoBoCBBoCB_ABS_A_A_A__ ____________CBCiCGATBNBNBoCBBoCVBkBoCBBNBoBNBoBoBo_A_AAw_A_A_A__ ____________CYCnCTATBN__BSCBCBBoBoCBCBBS_ABNBoBNBo_A_AAwBS___A__ ____________CBCiAqAGBN__BSBsBsCLCsBsBSBS_ABNBoBNBo_A_A_ABS___A__ ____________CBATATBoBN__BoBsBiCLBbBsBSBN_A_ABoBNBo_A_A__BS___A__ ____________CBBoATBo____BoCBCYCBBoBoBNBNBN_ABNBNBo_A_A__Aw___A__ ____________CBBoATBo__BoCBCYCYCBBoBoBNBNBN_ABoBNBoBo____Aw_A____ ______________CBBo____BoCBCYCBCBBoBoBoBNBN_A_A_ABoBo____BS_A____ ______________CBBo__BoCBCYCYCBCBBoCBBoBNBNBN_A_ABoBo____Aw_A____ ______________Bo___ABoCBCYCBCBCBBoCBBoBNBo_A_A__________BS_A____ ___________________A_A_ACYCB_A_ABoCBBo_A_A_A_____________A______ _______________________A_A_A_A_A_A_A_A_A________________________ ________________________________________________________________ } # tile 169 (gnome king) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ _______________________KCjCM_G__________________________________ __________________Cj_K_KCjCj_G_GCM______________________________ __________________CjCjCjCjCjCjCMCM______________________________ __________________CjCjCjCjCjCjCMCM______________________________ __________________CnCnCnCnCnCTCTCT______________________________ __________________CiAA_zCiCn_z_ACT______________________________ __________________CiCnCiCnCnCnCTCT______________________________ __________________CmCiCnCiCnCnCTCP___________A_A_A_A_A_A________ __________________CmCoCnCiCnCnCPCP_________A_A_A_A_A_A_A________ _______________K_KCmCmCmCmCmCPCPCP_G_G___A_A_A_A_A_A_A_A________ _____________K_G_G_GCmCmCmCmCPCP_G_K_G_G_A_A_A_A_A_A_A_A________ ___________K_G_G___KCmCmCmCmCPCP_G_A_K_G_G_A_A_A_A_A_A_A________ ___________K_G_____K_KCmCmCmCP_G_G_A_A_K_G_A_A_A_A_A_A_A________ __________CiCn____CFCFCFCmCmCFCFCF_A_ACiCn_z_A_A_A_A_A__________ __________CnCi____CFCFCFCmCmCFCFCF_A_zCnCi_A_A_A_A_A____________ ___________________K_K_G_G_G_G_G_G_A_A_z_z_A_A_A________________ ___________________K_K_G_A_A_K_G_G_A_A_A_A_A_A__________________ ___________________K_K_G_A_A_K_G_G_A_A_A_A_A____________________ ________________CFCFCFCF_A_ACFCFCFCF_A_A_A_A____________________ ______________CFCFCFCFCF_A_ACFCFCFCFCF_A________________________ _________________A_A_A_A_A_A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ } # tile 170 (giant) { _____________________A_A_A_A_A_A_A_A_A_A________________________ _________________A_A_A_ACTBjCGBwBV_A_A_A_A_A_A__________________ _____________A_A_A_A_ACTCTCGBbBwBVBV_A_A_A_A_A_A________________ _______A_A_A___A_A_ACT_A_LCGBjCG_A_ABV_A_A_A_____A_A_A_A________ _______________A_A_ACTCT_A_ABj_A_ABVBV_A_A_A_A__________________ _______A_A_A_A___A_ACTCTCTBzCGBwBVBVBV_A_A_A_A_A_A_A_A__________ _______________A_A_ACTCTCTBtBjCGBVBVBV_A_A_A_A_________A________ ___________A_A_A_A_ACTCTAqAqAqAuAqBVBV_A_A___A_A_A______________ _______A_A__BwCGBjCGBVCTCTBwCGBjBVBVBVCTBwCGBjCTCTBw_A_A_A______ ________BwBtBzCTCTBtBjBVCTBwBbCGBVBVCTCTBcCGBbCGBjCTCGBw________ ______CTCTBwCTCTCTBzCGBjBVBVBVBVBVCTCTCGBzBwCGBjBVBtBzBtBj______ ____CTCTBzCGCTCTCTCGBjCGBbCGBVCTCTCTCGBbBwBtBzCGBVCTCTBzCG______ __CTCTCTBtBjCGCTCTBcCGBzCGBjBVCTCTCTBjCGBzCGBjBtBbBwCTCTBwBb____ CTCTCTCGBjCGBbBjCTCTBcCGBcCGBVCTCTCGBjCGBcCGBjBVCGBbCGCTBwCG____ CTCTBwBbCGBVBwCGBzCdBwBzCGBcBVCTCTBcCGBzCGBcBVBVBjCGBjCGCUBw____ CTCTBjCGBzBV__CGBcCGBzBtBwBVBVBVCTCGBzBtBwBVBVBVBVBzCGBcCTCG____ CTCTCGBjCGBVBV__BVBVBVBVBVBVBVBVBVBVBVBVBVBV__BVBVBVBwBtCTBj____ CTCTCGBbBVBVBV__CTCTCTBtBzCGBVBcCGBjBVBVBVBV____BVBTBzBwBz______ __CTCTBwBVBV______CTCTCTBwBbBVCGBzBtBVBVBV________BVBTCGBt______ ____CTBjBVBVBV_____hCTCTCGBwBtBbBwBwBV_c_c________BVBVBzBj______ __BwCGBbCGBjBVBV_h_h_h_h_l_h_h_h_h_c_c_c_c______BVBVBwCGCTCG____ __BtBjCGBzCGBVBV_h_h_h_h_h_h_h_h_h_h_c_c_c_c___ABVBjCGBbCTBj_A_A __CTCTBjBtBjCGBV_h_h_h_h_c_c_c_c_h_h_h_c_c_c_cBVBVCGBcCTCGBz_A_A __CTCTCTBzCGBjBVBV_h_h_h_c_c_c_c_h_h_h_h_c_c_cBVBwBzCGCTBw_A_A_A ____CTCTCTBtBzBVBVBVBV_c_c_c_c_c_h_h_h_h_cBwCGBVBtBjCTBzBt_L_A_A ______CTCTBjCGBwBVBVBV_c_c_c_A_A_h_h_h_h_cCGBbBwBzCTCTCG_A_A_A_A ________CTCGBbCGBVBVBV_c_c_A_A_A_h_h_h_h_cBjCGBjCGCTBwBb_z_A_A_A ________BcCGBzBwBjBVBV_c_c_A_A_A_h_h_h_h_cBzBtBzCGBbCG_A_A_A_A_A _____A_A_zBwBtCGBbCG_c_c_c_A_A_A_h_h_h_h_c_cBwCGBjCG_L_A_A_A_A__ ___A_A_A_h_h_l_h_l_c_c_c_c_A_A_A_h_h_h_h_c_c_c_c_A_A_A_A_A_A_A__ ___A_A_A_h_h_h_h_h_c_c_c_c_A_A_A_h_h_h_h_c_c_c_c_c_A_A_A_A_A_A__ _____A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A____ } # tile 171 (stone giant) { ________________________BkBdBd__________________________________ ______________________BdBdBdBdBD________________________________ ______________________BkBdBkBDBJ________________________________ ______________________AeBkAeAeAj________________________________ ______________________BDBkBDBDBJ________________________________ ________________BdBdBDBJBDBDAlAlAeBJBdBdBdBd____________________ ____________BdBdBDBDBDAlAeAeAlAeAjBDBDBDBDBDBdBd________________ __________BdBDBDBDBdBdAlBDBDBDAeBJBdBdBdBDBDBDBDBd______________ ________BDBDBDAlBDBDBDBDAlAlAOAlBdBDBDBJAlBDAeAlBJBd____________ ________BDBDAlAeAlBDBDBDBDBDAlAlBDBDBDBJAjAeAeAlAlBD____________ ______BDBDAlAeAeAeBDBDAlBDAeAlBDAlBDAlAjAeAeAeAlAlBD____________ ______BDBJAeAe______AlAlAlAlAeAlAlAlAlAlAe__AeAeAlAlBD__________ ______AlAjAeAe______AeAeAeAeAlAeAeAeAeAeBJ____AeAlBDAl__________ ______BDBJAlAe________AeAlAlAeAlAlAlAlAlAl______AeAlBDBD________ ______BDAlAe__________AeAeAeAeAeAeAeAeAlBD______AeAlBJBD________ ______BDAlAe____________AlAlAlAeAlAlAlAlAl________AlAlAj________ ______BDAl______________AeAeAeAeAeAeAeAlAlAT_A_A_AAlBDBDBD______ ______BDAlAe____________ATAlAlAlAeAlAlAlAqAT_A_A_A_ABJAlBD______ ______AeAeAO__________ATATATATATATATATAqAqAT_A_A_AAlAjBD_A_A____ ________AOAO________ATATAqATAqATATATATATAqAqAT_A_AAlBJBD_A_A____ __________________ATATAqATATATAGATAGATAqAqAqAT_A_A_AAOAO_A______ __________________ATAlATATATAGAGATAGATAqAqATAT_A_A_A_A_A_A______ __________________BDBdBJAGAGAGAq_AAGAqAqAqAe_A_A_A_A_A_A_A______ __________________AlBdAjAlAe_A_A_A_AATAjBJAe_A_A_A_A_A_A________ __________________AlBDAlAl_A_A_A_A_AAeBdBdAlAe_A_A_A_A_A________ __________________AlAlAlAO_A_A_A_A_AAeBdBdAlAe_A_A_A_A__________ ____________________AeAeAeAO_A_A_A_A__BDAlAlAeAO_A_A_A__________ ____________________AlAeAOAO_A_A_A______AeAeAeAO_A_A____________ __________________AlBdAlAOAO_A_A________AlBdAeAO_A_A____________ ________________AlBdAlAOAO_A_A________AlBdAlAeAO_A______________ _______________AAeAOAO_A_A_A__________AOAlAOAO_A_A______________ _______________A_A_A_A_A_______________A_A_A_A_A________________ } # tile 172 (hill giant) { ________________________AXAXAXAX________________________________ ______________________AXAXAXAXAXAX______________________________ ______________________CTCTCTBwAXAX______________________________ _______________________MCT_M_zBVAX______________________________ ______________________CGCTBwBzBVAX______________________________ ________________CnCnCGBjCTBwCGBVAXCTCTCnCnCn____________________ ______________CnCTCTCTAqAqAqBjBVBwCGBjCTCTCTCnCn________________ ____________CnCTCTCTCTCGBjCGBVBVBbCTCTCTCTCTCTCTCn______________ __________CTCTBwCTCTCTBVBVBVBVBVCTCTCTCGBjCGBjCGCTCn____________ ________CTCTCTAlBwCTCTCTCTCGBVBjCGCTCTBtBjBVAlBtBjCT____________ ________CTCTBwBVBVCTBjBtBzBVBVCGBcCGBzBwBVBVBVBVBzCT____________ ________CTCGBV______CGBjBwBVB_BbCGBjBtBVBJ__BVBVBVCGCT__________ ________CTBjBV______BVBVBVBVBcBVBVBVBVBVCT____BVBVBjCG__________ ________BzBtBV________BVBbCGBVBwBtBzCGBjCT____BVCGBjCT__________ ______CTCGBjBV________BVBVBVBVBVBVBVBVCGCT____BVBVBbCT__________ ______CTBjBV____________CGBzCGBVBjCGBwBbBj____BVBVCGCT__________ ______CTCGBV____________BVBVBVBVBVBVBVCGBsAw_A__BVBjCG__________ ______CTBb______________AwBSBSBSBVBSBSBsBsAw_A_ABVBjCTCT________ ______CTCG____________AwAwBSBSAwBSBSBSBsBSAw_A_A_ACGBcCT________ ______CTBjBV________AwBSBsBSAwBSBSBSBsBSBsBsAw_ABVBwCT_A_A______ ______BVBVB_______AwBSBsBSBSBSAwBSAwBsCFBsBsAw_ABVCGCT_A_A______ ________B_B_______AwBwBSAwBSAwAwBSAwBSBsBSCFAw_A_LB_B__A________ __________________CTCTCTBSAwAwBS_AAwBsBsBsBV_A_A_A_A_A_A________ __________________CTCTCTBwBV_A_A_A_ABSCTCTBV_A_A_A_A_A_A________ __________________BwCTCTBt_L_A_A_A_ABVCTCTBwBV_A_A_A_A_A________ __________________BtBzCGBj_A_A_A_A_ABVCTCTCGBV_A_A_A_A__________ ____________________BVBVCGBV_A_A_A_A__CTBjBbBwBV_A_A_A__________ ____________________BwBVBjBV_A_A_A______BVCGBVBV_A_A____________ __________________BwCUBtBVBV_A_A________BVBVBjBV_A_A____________ ________________BtCnBwBVBV_A_A________BVBjCGBVBV_A______________ _______________LBVBVBV_A_A_A__________AlCGBVBV_A_A______________ _______________A_A_A_A_A_______________A_L_A_A_A________________ } # tile 173 (fire giant) { ______________________BoBNBoBoBNBN______________________________ ____________________BNBNBNBNBNBoBo______________________________ ____________________BoBNBNBNAqAqBoBN____________________________ ____________________BN_MBN_MAqAqBoBN____________________________ ____________________BoAqBNAqAqAqBNBo____________________________ ________________BNBNBN_$AG_$AqBoBNBoBNBNBNBN____________________ ____________BNBNBNBNBNBoAqAqAqBNBoBNBNBNBNBNBNBN________________ __________BNBNBNBNAqAqBoBNBoBNBoBNBNBNBNBNBNBNBNBN______________ ________BNBNBNAqAqAqBNBNBoBoBNBoBNBNAqAqAqAqAGAqBNBN____________ ______BNBNBNAqAGAqBNAqAqBNBoBNAqAqAqAqAqAq_$AGATAqBN____________ ____BNBNAqATAT_$_$AqAqAqAqBoAqAqAqAqAqAqAT_$AGATAqBN____________ ____BNAqATAG_$______AqATATATAGATATATATATAG___$AGATAqBN__________ ____AqAqAT__________ATATATATAqATATATATATBN_____$ATAqAq__________ __BNAqAqAT____________ATAqAqATAqAqAqAqAqBN_______$AqAqBN________ __BNAqAT______________ATATATATATATATATAqBN_______$ATAqBN________ __BNAqAT________________AqAqAqATAqAqAqAqAq________ATAqAq________ __BNAq__________________ATATATATATATATAqAqAw_A_A_AATAqBNBN______ __BNAqAT________________AwAqAqAqATAqAqAqBsAw_A_A_A_AAqAqBN______ __ATATAG______________AwAwBSBSBSBSBSBSBsBsAw_A_A_AATAqBN_A_A____ ____AGAG____________AwBSBsBSAwBSBSBSBsBSBsBsAw_A_AATAqBN_A_A____ __________________AwBSBsBSBSBSAwBSAwBsCFBsBsAw_A_A_AAGAG_A______ __________________AwAqBSAwBSAwAwBSAwBSBsBsCFAw_A_A_A_A_A_A______ __________________BNBNBNBSAwAwBS_AAwBsBsBsAT_A_A_A_A_A_A_A______ __________________AqBNBNAqAT_A_A_A_ABSBNBNAT_A_A_A_A_A_A________ __________________AqBNAqAq_A_A_A_A_AATBNBNAqAT_A_A_A_A_A________ __________________AqAqAqAG_A_A_A_A_AATBNBNAqAT_A_A_A_A__________ ____________________ATATATAG_A_A_A_A__BNAqAqATAG_A_A_A__________ ____________________AqATAGAG_A_A_A______ATATATAG_A_A____________ __________________AqBNAqAGAG_A_A________AqBNATAG_A_A____________ ________________AqBNAqAGAG_A_A________AqBNAqATAG_A______________ _______________AATAGAG_A_A_A__________AGAqAGAG_A_A______________ _______________A_A_A_A_A_______________A_A_A_A_A________________ } # tile 174 (frost giant) { ______________________Cm______AqBoBNAq__________________________ ______________________CmCm__AqBoBoBNBNAq______Cm________________ ______________________CFCmCmAqBoBNBNBNAq______Cm________________ ____________BMBICVCSBsBSCFBSCLCrCFBNBNBZCmCPCPCP________________ ________BMCVBnCSBnCSCABsBSCPAOAOCrCrCLCPBsCmCm__________________ ____BMBnCSBnCSBnCSBnBnCFBSCPC$CVCSAOAOC$BSBsBSBSCF______________ __BMBnCSBnCSBnCSCSCSBnCVBWCPC$BICSCVC$CPBsCFBsBSBsCF____________ __BMBnCSBnBFCSCSBnCSCSBnBnBSCPBDBdAiC$CPBSBSCFCSCSBsBs__________ BDBnCSCSBnBnBMBnBnBnBnBFBnBsCPC$CPC$CPBSCFBsCVBICVBhCVBi________ AiBFBnBICVCSCSCSCSCSCSCSCSBnCSC$CPC$BSBsBSBnBnCSCSBnCSBs________ __BdBnBnCSBnBnCSCSCSCSCSCSCSCSCSCSBnCSBnCSBnBnCSCSCSBnBnBS______ __AiBMBnBnBnCSBnCSBnCSBnCSBnCSCSCSCSCSCSCSBnBnCSCSBnCSBnBS______ ____BDBFBFBMBnBnBnCSBnCSBnCSBnCSBnCSCSCSCVBnBICSCSCSBnBnBs______ __________BDBMBMBnBnBnBnCSBnCSBnBnBnBnCSAiBnCVCSCSBnCSBnBSBs____ __________BSAwAiBMBMBnBnBnBnBnBnBDAiBDAiBnBnCSCSCVBhBnBMBSBs____ __________BsBSBSAiBdAiBDAiBdAjBFBnCSCSCSBnCSCSCSCVBnBnBMAwBS____ ________BsBSAwBSAvAvAvAvBdBnBnBnBnCVBICVCSBnCSBnBnBnBMBSBSBS____ ________BSBsAwBSAvAvAvAvAvAYBdAiBnBnBnBnBICVBIBnBnBMBMBsBSBs____ ________BSBsBSAwCmAvAvAvAvCsCsCrBDAiBdBnBnBnBnBnBnBMAwBSAwBSBs__ ________BsBSBSCPCmCVAvAvAvCrCrCrCLAvAvBdAiBdBMBMBMBMAwBSBsBSBs__ ______BsBSBSAwCPCmCPCmCPAvAvCLCLAvAvAvAvAvAvAvCPCPAwBSBSBsBsBS__ ______BsBSAwBSCPCmCPCmCPCoCPCmAvAvAvAvAvAvAvCVCOBlBSAwBsBSBSBs__ ______BSBSBsBSAwCmCPCmCVCoCPCoCPCmCPCmCVCmCPCVBnCOCPAwBSAwBSBs__ ______BSBsAwBsAwBMBnCmCVCoCPCoCPCmCPCmCVCmBnCVCKCVBlAwBSBsBSBS__ ________________BMBnBnBMCmCPCoCPCmCPCmCVCmCJCVCPCVCOBSBSBSBsBS__ ______________BnAqAqBnBM_ACVCoCP_ABMCmCVCmCPCVBmBSAwBSAwBSBsBS__ ______________AqAqBnATAT_A_A_A_A_AATATAqCmCPAvBSAwAwAwBSBsBSBs__ ____________BICVAqBnBnAT_A_A_A_A_ABMAqBMBnBFAwBSAwBSAwBSBsBSBs__ ___________zAqAuATAT_A_A_A_A_A_A_AATATAqAqAq_A_A_AAwBSAwBsBSBS__ ___________A_A_A_A_A_A_A_A_A_A_A_A_AATBnAqBICV_A__________BsBS__ ___________________________________A_AATATAqAu_A________________ _____________________________________A_A_A_A_A_A________________ } # tile 175 (storm giant) { __________________________________CoCPCoCPCoCP__________________ __________________________________CmCPCmCPCoBZ__________________ ______________________BLBLBLBLCW__CLCrCsCrCLCL__________________ __________________BLBmCWCRCRBmCkCrCLCrCsCrCLBm__________________ ______________BLCRBmCRCRBmCRCRCrCrAjBcCRAjBJBL__CsCs____________ __________BLBmCRBmCRBmCRBmBmCPCoCWCRBmCRCRBmBLBmCrCrCr__________ ________BLBmCRBmCRBmCRCRCRCRCPCoCVBmCRBmBmBmBLCoCLCrCLCo________ ________BLBmCRBmBLCRCRBnCRCRCVCoCVBmAjAhBLBLCVCVCoCLCRCR________ ______BDBmCRCRBmBmBLBmBmBmBmBmBmCVCVBmBmBLBLCVCoCVCRBmCRBmCR____ ______AoBLBLCRBmCRCRCRCRCRCRCRCRCRBmCRBmCRCoCVCoCVBmCWCRBmCRBm__ ________BDBmBmCRBmBmCRCRCRCRCRCRCRCRCRCRBmCRBmCRBmBmCRCRCRBnBm__ ________AoBLBmBmBmCRBmCOBmCRBmCRBmCRCRCRCRCRCRCRBmBmCRCRBmCRBm__ __________BDBLBLBLBmBmCRBmCRBmCRBmCRBmCRBmCRCRCRBmCRCRCRCRBmBm__ ________________AjBLBLBmBmBmBmCRBmCRBmBmBmBmCRAjBmBmCRCRBmCRBm__ ____________________AoBLBLBmBmBmBmBmBmBDAoBDBJBmBmCRCRCWBmBmBL_A ______________________BDAoBDAhBDAoBDAhCRBmCRCRCRBmCRCRCRBmBmBL_A ______________________AvAuAvAvBDBmBmBmBmCRBmCRBmCRBmCRBLBmBL_A_A ______________________AvAvAvAvAvAuAoBDBmBmBmBmCRBmCRBmBmBLBL_A_A ______________________CmAvAvAvAvCsCsCrAjBcAhBmBmBmBmBmBmBL_A_A_A ____________________CPCmCVAvAvAvCrCrCrCLAvAvBDAoAjBLBLBLBL_A_A__ ____________________CPCmCPCmCPAvAvCLCLAvAvAvAvAuAvAvCPBm_B_A_A__ ____________________CPCmCPCmCPCoCPCmAvAvAvAvAvAvAvCVCKCP_A_A____ ______________________CmCPCmCVCoCPCoCPCmCPCmCVCmCPCPCPBmCK_A____ ______________________BLBLCmCVCoCPCoCPCmCPCmCVCmBmCVCKCVCP_A____ ______________________BLBLBLBLCmCPCoCPCmCPCmCVCmCPCVBmCVCP______ ____________________BmAqAqBLBL_ACVCoCP_ABLCmCVCmCKCVCP__________ ____________________AqAqBmAqAq_A_A_A_A_AAqAqAqCmBm_A_A_A________ __________________BmCWAqBmBmAq_A_A_A_A_ABLAqBLBLBL_A_A_A________ _________________AAuAuAqAq_A_A_A_A_A_A_AAqAqAqAqAq_A_A_A________ _________________A_A_A_A_A_A_A_A_A_A_A_A_AAqBmAuBmCW_A__________ _________________________________________A_AAqAqAuAu_A__________ ___________________________________________A_A_A_A_A_A__________ } # tile 176 (ettin) { ___________A_A_A_A_A_A_A_A_A___A_A_A_A_A_A_A_A_A________________ _________A_A_ACTBjCGBwBV_A_A_A_A_ACTBjCGBwBV_A_A_A______________ _______A_A_ACTCTCGBbBwBVBV_A_A_ACTCTCGBbBwBVBV_A_A_A____________ _____A_A_ACT_A_LCGBjCG_A_ABV_ACT_A_LCGBjCG_A_ABV_A_A_A_A________ ___A_____ACTCT_A_ABj_A_ABVBV_ACTCT_A_ABj_A_ABVBV_A______________ _A___A_A_ACTCTCTBzCGBwBVBVBV_ACTCTCTBzCGBwBVBVBV_A_A_A__________ ___A_____ACTCTCTBtBjCGBVBVBV_ACTCTCTBtBjCGBVBVBV_A_____A________ _A_______ACTCTAqAqAqAuAqBVBV_ACTCTAqAqAqAuAqBVBV_A_A_A__________ _____A_ABwBVCTCTBwCGBjBVBVBVBVBVCTCTAqAqAqBVBVBVBwCG_L_A_A______ _A_A__BzBtBwBVCTBtBzBtBVBVBwBVBwBVCTBjCGBwBVBVBtBzBcCGBw________ ____CTCTBwBzCGBjBwBVBVBVBjCGBVBbCGBVBVBVBVBVBjCGBwCGBbBwCG______ ____CTCTCGBtCTCTCTBjCGBzCGBbBVCGCTCTBjBtBzBwBtBzBVCTCTCGBj______ __CTCTBwBzBwBzCdCTCGBbBwCGBjBVCTCTCTCGBzCGBjCGBjBVCGCTCUBjCG____ CTCTCTBtBwBtCGBbCTCTBwBtBzCGBVCTCTCGBjBtBjCGBbBVCGBbBjCTBtBj____ CTCTBwBzCGBbBwCGBjCTBzCGBjBtBbCTCTBjCGBzCGBjBVBVBjBiAwBSBiBw____ CTCTBbCGBcBV__BtBzCGBwBtBwBVBVBVCTBbCGBcCGBVBVBSBSBSBSBSAwAwAY__ CTCTCGBjCGBVBV__BVBVBVBVBVBVBVBVBVBVBVBSBSBSBSBSBSAwAwAwAwAwAYAY CTCTCGBzBVBVBV__CTCTCTBzCGBjBVBwBSBSBSBSBSAwBSAwAwAwAwAwAwAwAYAY __CTBjBtBVBV______CTCTCTBSBSBSBSBSAwAwAwAwAwAwAwAwAwAwAwAYAYAYAY CGBjCGBjBVBVBV____BSBSBSBSBSAwAwBSBSAwAwAwAwAwAwAwAYAYAYAYAYAYAY CTCTBjCGBzCGBVBVBSBSBSAwAwAwAwAwAwAwAwAwAwAYBwCGBjBVAYAYAYAYAY__ CTCTCTBjBtBjBVBSAwAwAwAwAwAwAwAwAYAYAYAYAMCGBwBbCGBVBV_A_A_A_A_A __CTCTCTCGBzBtBVAwAwAYAYAYAYAYAYAYAYAYAYAqAqBzCGBVBV_A_A_A_A_A_A __CTCTCTBbBwBwBVBVAYAYAYAYAYAqAqBNBNBNBNAqAqAq_A_A_A_A_A_A_A_A_A BSBSAwCTCTCGBzBVBVBVBVAqAqAqAqAqBNBNBNBNAqAqAq_A_A_A_A_A_A_A_A_A BSAwAwAwAwBjBtBwBVBVBVAqAqAq_A_ABNBNBNBNAqAqAq_A_A_A_A_A_A_A_A_A AwAwAYAYAYCGBzCGBVBVAqAqAq_A_A_ABNBNBNBNAqAqAq_A_A_A_A_A_A_A_A_A __AYAY____BNBNBNBNAqAqBVAq_A_A_ABNBVBNBNBVAqAq_A_A_A_A_A_A_A_A_A _____A_A_ABVBNBVBVAqAqBVBV_A_A_ABVBVBNBNBVBVAqBV_A_A_A_A_A_A_A__ ___A_A_ABjCGBjBwBVBVBVBVBV_A_A_ABjCGBwBVBVBVBVBVBV_A_A_A_A_A_A__ ___A_A_ACGBcCGBbBVBVBVBVBV_A_A_ACGBcBzBTBVBVBVBVBV_A_A_A_A_A_A__ _____A_A_L_A_A_z_A_A_A_A_A_A_A_A_A_z_A_A_A_A_A_A_A_A_A_A_A_A____ } # tile 177 (titan) { __________________________________BkCPBkBkBDBD__________________ ________________________________BkCPCPCPBkBDBD__________________ ______________________BwCGBjCGCiBkCJCVBnBkBDBDBk________________ __________________CTCiCnClClCoCsBkAlAlAlAlAlBDBk________________ ______________CTCnCnClCnCiCnCoCrBkCPAlAlCPBdBDBkCsCs____________ __________CTCiClCnClCnClCiCoCVCoBdCPAlAeCPBkBDBkCrCrCr__________ ________CTCnCiCnClCnCXCiClCnCmCoCVCPAeAlCPBdBDCoCLCrCLCo________ ________CTCnClCnCdCXCnCiCXClCVCoCVCnBVBVBVBkCVCVCoCLClCl________ ______BwCnCnCXCiCnCnCnCnCnCnCnCnCVCVCnCnBwBtCVCoCVCnCiCnCiCn____ ______CGCTCnCiCnCiCiClCiClCiClCiCiCnCiCnCiCoCVCoCVCiCiClCnCiCi__ ________BjCnCnCiCnCiCiClCXCXCXClClClClClCnCiCiCnCiCnCiClCXCnCn__ ________CGCTCnCnCnCiCnCgCnCiCnCgCnCXCiClClCiClClCnCnClCXCnCiCn__ __________CGCTCTCTCnCnCiCnCiCiCnCiCiCnCiCiClCiCiCnCnClCXCiCnCn__ ________________CGCTCTCnCnCnCnCiCnCiCnCnCnCnClCGCnCiCXClCnCiCn__ ____________________CGCTCTCnCnCnCnCnCnCGCGBwCGCnCnClCiCiCiCnCT_z ______________________CGBzCGBwCGBzCGCTCnCiClClCiCnCXClCnCnCnCT_A ______________________AwAuAvAvBwCnCnCnCnCnCiCnCiCiCnCiCnCnCT_z_A ______________________AvAvAvAvAvAwBtBwCnCnCnCnCiCnCiCnCnCTCT_A_A ______________________CmAvAvAvAvCrCrCLBzCGBwCnCnCnCnCnCnCT_z_A_A ____________________CPCmCVAvAvAvCLCLCLCLAvAvCGBzCGCTCTCTCT_A_A__ ____________________CPCmCPCmCPAvAvCLCLATAvAvAvAuAvAvCPCP_A_A_A__ ____________________CPCmCPCmCPCoCPCmAuAvAvAvAvAvAvCVBkCP_A_A____ ______________________CmCPCmCVCoCPCoCPCmCPCmCVCmCPCVCPCJBn_A____ ______________________CTCTCmCVCoCPCoCPCmCPCmCVCmCJCVBnCVCP_A____ ______________________AqCTCTCTCmCPCoCPCmCPCmCVCmCPCVCJCVCP______ ____________________CnAqAqAqAq_ACVCoCP_ACTCmCVCmBnCVCP__________ ____________________AqAqCTAqCT_A_A_A_A_AAqAqAqCmCO_A_A_A________ __________________ClCnAqCnAqAq_A_A_A_A_ACTAqCTCTCT_A_A_A________ _________________AAqAqAqAq_A_A_A_A_A_A_AAqAqAqAqAq_A_A_A________ _________________A_z_A_A_A_A_A_A_A_A_A_A_AAqCnAqClCl_A__________ _________________________________________A_AAqAqBNAq_z__________ ___________________________________________A_A_A_A_A_A__________ } # tile 178 (minotaur) { ________________BkCPCmCmCm______AvBRBRBrBrBRBR__________________ ________________CmCmCPCPCPCmCmAvBRBRBrCEBrBrCE__________________ ______________CmCPCPBkBnCJCPCPAvCfBRBrBRBrBrBrBRCPCPCP__________ ____________CTCmCJCnCiCnCnBnBkAvCfCfCEBrBRCfBrCPCmCmCmCmCPCP____ __________CTCTCnCPBmCnCiCnCnAvBRBrBrBrCECfCfBRCPCPCPCPCPCmCmCP__ ________CTCTCnCnCnCVCnCnCnAvBRCEBRCEBrBRBRAvAvAvBkCPBkBkCPCmCP__ ________CTCnCnCiCiCnCnCnCGAvBR_MBrBrCEBRAvAvAXAXCiCnCnCiCJCmBk__ ________CTCnCnCnCnCnCTCTCTAvBRBRBR_MBRAvAvAXCTCiCnCnCiCiCnCPBn__ ________CTCnCnCnCTCTCnCiCnCiBRAvBRBRAvAXAXCTCnCiCnCnCnCnCPCJ____ ________CTCnCnCiCnCiCnCiCiCnCiCnAvAvAvCTCnCnCnCnCnCnCnCnCnCnCT__ __________CnCnCnCnCnCnCiCnCiCnCiCiCnCiCnCnCnCnCnCnCnCnCiCiCnCT__ __________CTCnCnCnCnCnCnCnCnCnCnCnCnCiCiCnCiCiCnCTCTCiCnCnCnCT__ ____________CGCTCTCnCnCnCnCnCnCnCnCnCnCnCnCiCnCnCnCnCnCiCnCnCT__ ________________CGCTCTCTCTCTCnCnCnCnCTCnCTCTCiCGCTCnCnCiCnCnCT__ ____________________CGCTCTCTCTCTCTCTCTCGBzCGBzCTCTCiCiCnCnCTCG_L ______________________CGBzCGBwCGBzCGBwCnCnCnCnCnCnCiCnCnCTCTBj_A ________________________AvAvBRBRBwBtCUCTCnCnCnCnCnCnCnCnCTCG_A_A ________________________AvBRBrCEBRAwCGBwCTCTCTCnCnCnCTCTCGBj_A_A ______________________AvBRCEBrBrAvAvBRAvBwBtCTCTCTCTCTCTBb_z_A_A ______________________AvBRBrBRAvBRAvAvAvBRBrBjCGBjCGBzCGBw_A_A__ ____________________AvBRBrBRBRBRAvAvAvAvBRCEBrBrCGBcCGBc_z_A_A__ ____________________AvAvBRAvAvAXAvAvAvBRBRBrBrBRAvAv_A_A_A_A____ ____________________AvAvBRAvAvAX_A_A_AAvBRBrCEBrAvBR_A_A_A_A____ ____________________AvAvAvAXAX_A_A_A_AAvAvBRBrBRAvAI_A_A_A_A____ ______________________AvAXAXAv_A_A_A_AAvAvAvBRAvAXAX_A_A_A______ ______________________AvAXAX_A_A_A_A_A_AAvBRAvAvAX_A_A_A________ ________________________BkAX_A_A_A_A_A_AAvAvAvAX_A_A_A_A________ ______________________CPCVBk_A_A_A_A_A_A_AAvAXAX_A_A_A_A________ ______________________BnCVCP_A_A_A_A_A_A_AAXAX_A_A_A_A_A________ _______________________z_A_A_A_A_A_A_A_A_ABkCP_A_A_A_A__________ _________________________________________ACPCVCP_A_A_A__________ ___________________________________________A_A_A_A_A_A__________ } # tile 181 (Keystone Kop) { ____________________________AwAwAw_J_I_I________________________ __________________CnCiAeAwAwAwAw_J_K_I_I_H______________________ ______________AeCiCiCnAwAwAwAw___J_K_I_I_H______________________ ______________AwBSCnCi___________JCj_I_I_H______________________ _________________I_I_I__________CoCjC$CoCo______________________ ________________CjCjCj_________J_K_K_I_I_H_H____________________ _________________K_I_J__________AxCTCiAXCiCn____________________ _________________K_I_J__________CnCTCTCiCnCi____________________ _________________K_I_J_______I_KBSAwAwCsCi______________________ _________________K_I_I___J_I_KAwAwCiAwAw_I_H_H__________________ _________________J_K_K_H_K_K_K_K_K_K_K_G_I_I_H_H_H_H_H__________ ___________________J_J_J_H_H_H_J_I_H_G_G_I_H_I_I_I_I_H_H________ _______________________________J_ICj_G_G_H_F_H_____I_I_H________ _______________________________J_H_G_H_G_F_________I_I_H________ _____________________________J_ICj_H_G_F_F_________I_I_H________ _____________________________J_H_b_G_H_F__________CjCjCj________ _____________________________HCj_H_G_G_H___________I_I_H________ ___________________________H_J_H_H_H_G_F__________CnCiCn________ _______________________H_H_I_J_H_H_G_H_H__________CiCdCn________ _________________I_I_I_I_I_J_H_H_H_G_H_F________________________ _______________I_H_H_H_H_I_I_a_a_a_H_G_H________________________ _______________I_H_H_H_H_H_H_G_G_a_a_a_F________________________ _______________I_H_H_______H_H_H_G_G_a_a________________________ _________________I_H_H_________H_H_G_G_____A_A__________________ _________________I_I_H_____A___H_W_G_G___A_A_A_A________________ _________________I_I_H_H___A_A_H_H_G_G_A_A_A_A_A_A_A_A_A________ ________________BD_I_H_H_____A_A_H_G_W_A_A_A___HAlAlAl_A_A______ _________________I_I_H_H_________H_W_G_G_A___H_HAOAlAl__________ ____________BDBDBDAlAlAl_______A_A_H_W_G_H_H_G_G_HBDAl__________ ____________BDAlAlAOAOAO_____A_A_A_H_H_H_I_I_I_H_HBDAeAl________ _______________________A_A_A_A_A_A_A_A_I_I__________BDAl________ _________________A_A_A_A_A_A_______A_A_A_A_A_A_A_A_ABDAl________ } # tile 182 (Kop Sergeant) { _____________________________g_g_g_g____________________________ ___________________________f_g_f_f_g_f__________________________ ___________________________f_fCjCj_f_f__________________________ __________________________CPCPCPCPCPCP__________________________ _________________________f_f_f_f_f_f_f_f________________________ ___________________________L_NCnCi_L_L__________________________ __________________________CnCiCnCnCnCn_____g_g__________________ ___________________g_g_g_bCn_z_NAA_NCn_b_g_g_g_gBD______________ _________________g_g_g_f_f_L_QCiCn_Q_L_f_b_f_f_f_f_f____________ _________________f_f_f_g_f_f_gCnCcCF_f_b_f_b_b_G_b_f_f__________ _______________f_f_f_b_f_f_f_fCcCF_f_f_f_f_b_G_b_b_b_K__________ _____________f_f_b_b_W_f_f_bCcCF_J_f_f_f_j_bCf_K_b_b____________ _____________f_f_b_b_G_b_bCcCF_L_L_f_f_fASCnCfCf_K_K____________ _______________f_f_KCf_bCiCF_b_f_f_f_N_DCiCnCiCfAc______________ _________________KCfCfCnCnCn_NCjCj_N_N_eCnCnCn__________________ __________________CfCiCiCn_G_b_I_e_I_b_bASCn____________________ ____________________CqCn_G_b_f_b_b_I_b_b_b______________________ ____________________Aw_G_b_f_b_b_b_I_E_b_b______________________ _______________________e_f_b_b_b_I_I_E_b_b______________________ _______________________f_f_b_I_b_b_I_A_E_bAS____________________ _____________________b_f_b_I_b_I_I_b_E_B_bAS____________________ _______________________E_E_E_W_____A_E_E_EBD____________________ _______________________b_a_W_W_____W_W_b_bAS____________________ _____________________b_b_a_W_________W_b_b_a____________________ _____________________b_a_W_W_________W_W_b_b____________________ _____________________b_a_W_W_________b_W_b_b_b__________________ ___________________b_a_a_W_W_A_A_A_A_b_W_W_b_b__________________ _________________A_b_a_W_W_W_A_A_A_A_A_W_W_b_bAm________________ _______________ABSBSAwAwAw_A_A_A_A_A_AAe_V_V_VBS_A______________ ______________BSAwAwAwAw_A_A_A_A_A_A_A_AAlAwAwAwBS______________ ____________BSAwAwAwAw_A_A_____________A_AAwAwAwAwBS____________ _____________A_A_A_A_A_____________________A_A_A_A_A____________ } # tile 183 (Kop Lieutenant) { _______________________________K_K_K_JBD________________________ _____________________________K_K_ICP_K_J________________________ _____________________________I_E_L_M_EBE________________________ ____________________________CjCM_zCi_ACM________________________ ____________________________CjCMCiCnCiCM________________________ ____________________________CjCMCnCYCnByCnCi____________________ ____________________________CnByCnCnByCOCiCnCi__________________ __________________________CiCn_FCnCi_FCTCTCnCiCnCg______________ __________________________CnCT_KCiCl_GCn__BkBkCJCiCn____________ ________________________BdCn_I_KCT_I_H_G______ClCiBw____________ ________________________CnCT_I_H_J_J_IBj____CnCiBw______________ ________BSCF____________CiCTAP_GCn_G_HCn__CnCiBD________________ __________BSCF________BkCn______CnCnClCTCnCn____________________ ____________BSCF____BdCnCn______CnCGClCTCnCT____________________ ______________BSCF__CiCTBk______AOCjAHABABCFBS__________________ ________________CnCiCnBL______BY_H_I_I_H_GCFBS__________________ __________________CnCF_________e_H_I_G_G_GCF____________________ _______________________________H_I_G_G_I_G_F____________________ ______________________________CJCiCnCiClCgCT____________________ ______________________________CiCnCnCiCnCnBM____________________ ____________________________CnClCiCTCnCTCi______________________ ____________________________CnClCn__ClCTCn______________________ _____________________________I_H_F__CnCT_F______________________ _______________________________H_F___F_F_G______________________ _______________________________H_H_F___F_G_G____________________ _________________________________H_F_____F_G____________________ _________________________________H_F_____FAN_G__________________ _______________________________I_G_F_____I_H_G__________________ _______________________________I_G_A_A_A_I_G_A__________________ ___________________________A_I_G_D_A_A_I_H_D_A_A________________ _________________________A_A_A_A_A_A_A_A_A_A_A__________________ _____________________________A_A_A_A_A_A_A_A____________________ } # tile 184 (Kop Kaptain) { ____________________________Az__AzAz______________CPCP__________ __________________________AzAzAzAzAzAz__________CP____CP________ __________________________AzAzAzAzAzAz__________CP____CP________ ______________________AzAzAGAGAGAGAGAGAzAz________CJCP__CPCP____ ________________________AzAzAzAzAzAzAzAz______________CP____CP__ __________________________CiCnCiCnCnCT__________________CTCGCP__ __________________BWBWBWAzBVBtCnBVBVCTAzAzAzBWBW______BvCTCT____ __________________BWBWBWAzCnCiCnCnCTCTAzAzBWBWBW____BvBWBWAz____ ____________________BWBWBWCiCnCnCnCTCVAzBWBWBW__BvBvBvBWAzAz____ __________________BvAzBWBWCnCpCpCTCTCVBWBWBWAzBvBvBWBWAzAz______ ________________BvBWBWAzBWCnCTCnCTCVCVBWAzAzBvBWBWBWAzAz________ ______________BvBvBWAzBWBWBWCVAqAqCVAzBWAzBvBWBWBWAzAz__________ ____________BvBvBWBWAzAzBWBWCVAqCVCVAzBWBWAzBWAzAzAz____________ ____________BvBWBWAzAzAzAzBWCVAqCVAzBWBWAzAzAzAz________________ __________BvBWBWAzAz__BWAzBWCVAqCVAzBWAzAz______________________ ________BvBWBWAzAz____BWAzBWCVAqCVAzBWAzBv______________________ ________BvBWAzAz________BWAzCVCVCVBWAzBvBvBW___A_A______________ ________BWBWAz__________BWAzAwAYAYBWBWBWBvBv_____A_A_A_A_A______ ______CTCTBWAz________BvBWBWAYAwAwBWBWBWBvBvBW___A_A_A_A_A_A_A__ ______CTCTCTBW________BWBWBWAYAwAwAwBWBWBWBvBv_A_A_A_A_A_A_A_A__ ____________________BvBWBWAYAwAwAYAwBWBWBWBvBv_A_A_A_A_A_A_A_A__ ____________________BvBWBWAwAwAYAYAYAwBWBWBvBvBW_A_A_A_A_A_A_A__ __________________BWBvBWBWAwAwAY__AYAwBWBWBWBvBv_A_A_A_A_A_A_A__ __________________BvBvBSBSAwAYAY__AYAwAwBWBWBvBvBW_A_A_A_A_A_A__ ____________________BWBSAwAwAYAY__AYAYAwBWBWBvBv_A_A_A_A___A_A__ ______________________BSAwAwAYAY_A_AAYAwAwBS_A_A_A_A_A_____A_A__ ______________________BSAwAYAYAY_A_AAYAwAwBS_A_A_A_A_______A_A__ ______________________BSAwAYAY_A_A_AAYAwAwBSBS_A_A______________ ___________________A_AAwAwAYAY_A_A__AYAYAwAwBS_A_A______________ _________________A_AAGAGAwAYAY_A______AGAwAwAw_A_A______________ _________________AAGAGAGAGAGAG_A______AGAGAGAGAG_A______________ __________________AGAGAGAGAGAG__________AGAGAGAG________________ } # tile 185 (lich) { __________________________AOAB_M________________________________ ________________________AOAOABABAA_M____________________________ ______________________AOAOAOAOAB_CAA_M__________________________ ______________________AOAOAOABABAA_MA__M________________________ ______________________AOAOCPCmCmCmCP_MAA________________________ ____________________AOAOCPABABCmABABCP_M________________________ ____________________AOAOCPABABCmABABCPA__M______________________ ____________________AOAOCPCmCmABCmCmCPAA_M______________________ ____________________AOAO_ABJCmCmCmBJ_A_MAK______________________ ____________________AOAO_AAlBDAlBJAj_AABAB______________________ ____________________AOAOAO_ACPCPCP_A_MABABAB____________________ __________________AOAOAOAOAOAOABABABABABABAOAO__________________ ______________AOAOAOAOAOAOAOAOABABABABABABABAO__________________ ______________AOAOAOABAOAOAOAOABABAB_MABABABAOAO________________ ____________AOAOAOABABAOAOAOAOABAB_z_MAKABABABAO________________ ____________AOABABAB_MAOAOAOAOABAB_O_$_M_MABABAOAO______________ __________AOAOAB_MAA_ABNAOAOAOABABAB_MATAA_MABABAOAO____________ __________AOAOABA__M_ABNBNAOAOABAB_zATAT__A__MABAOAO____________ ________AOAOAOAB_MAA_BAOBNBNCLCLAqAqAT_M___MAAABABAOAO__________ ________AOABABAA_M_AAOAOABBNCLBbAqAq_MAA____A__MABABAO__________ ________AOAB_MA__M__AOAOABAOAOAOAK_MA__M_____MAA_MABAO__________ _______MCmAB_MAA_M__AOAOABAOABAOABAB_zAB_____O_zABAB_z_M________ _______MCmCmA__M__AOAOAOABAOABAOABAB_O_z_M__A__MCmCmAB_M_z_A____ ______AKCm_MCmAA__AOAOAOABAOABAOABAB_MA_AA___AABCm_zCm_M_A_A____ _______M_zABCm_M__AOAOABABAOABAOABABAA_M_M_A_A_MCmABCm_A_A_A____ _______MAB_z_MA___AOAOAB_MAOABAOABAB_O_zAB_A_A_z_M_z_M_A_A_A____ _________MAA_M__AOAOABABAOAOABAOABABA__M_M_z_A_A_MAB_A_A_A______ ________A__MA___AOAOAK_MAOAK_MAOABAB_MAK_M_A_A_AAB_z_A_A________ __________AA___AAOAB_MABAOAB_MAOABABAA_M_$_A_A_A_A_A_A__________ _______________AAOAB_zAOAOAAAOAOABAB_MA__O_A_A_A_A_A____________ _______________A_AAB_AAOAB_MAOAOAB_A_A_A_A_A_A_A________________ _________________A_A_A_A_A_A_z_A_A_A_A_A_A_A____________________ } # tile 186 (demilich) { __________________________AwAYAA________________________________ ________________________AwAwAYAJAAAA____________________________ ______________________AwAwAwAwAYAA_zAA__________________________ ______________________AwAwAwAYAJAAAA_NAA________________________ ______________________AwAwBJBjBJBjBJAA_z________________________ ____________________AwAwBjAqAqBJAqAqBJAA________________________ ____________________AwAwBJAqAqBjAqAqBjAAAA______________________ ____________________AwAwBJBJBj_ABjAYBJAA_L______________________ ____________________AwAwBJAYBJBJAYBj_AAAAY______________________ ____________________AwAw_ABJAqAqAqBJ_AAYAY______________________ ____________________AwAwBZ_ABJBJBJ_ACLAJAYAY____________________ __________________AwAwAwCLAY_A_A_AAJBZAYAYAwAw__________________ ______________AwAwAwAwAwAwBZAYAYAYCLAXAYAYAYAw__________________ ______________AwAwAwAYAwAwBZAYAYAJBZAAAYAYAYAwAw________________ ____________AwAwAwAYAYAwAwAwCLAJBZAA_zAAAYAYAYAw________________ ____________AwAYAYAYAAAwAwAwBZAvBbAAAA_NAAAYAYAwAw______________ __________AwAwAYAA_z_AAwAwAwCVCVCP_zAAAA_zAAAYAYAwAw____________ __________AwAwAYAAAA_AAwAwAwCVBkCPAA_LAA__AAAAAYAwAw____________ ________AwAwAwAY_NAA_AAwAwAwAwCPAJAAAA_z___NAAAYAYAwAw__________ ________AwAYAYAAAA_AAwAwAYAwAwAYAY_zAAAA_____zAAAYAYAw__________ ________AwAYAA_zAA__AwAwAYAwAwAYAYAYAA_L____AAAA_zAYAw__________ ______AABJAYAA_NAA__AwAwAYAwAwAYAYAYAAAA_____LAAAAAYAAAA________ ______AABJBJAA_z__AwAwAwAYAwAYAwAYAY_zAAAA__AA_zBJBJAA_L_A_A____ _______zBJAABJAA__AwAwAwAYAwAYAwAYAYAA_LAA___AAABJAABJAA_A_A____ ______AA_NAABJAA__AwAwAYAYAwAYAwAYAYAAAA_z_A_AAABJ_LBJ_A_A_A____ ______AAAA_zAA_z__AwAwAYAAAwAYAwAYAY_zAAAA_A_A_AAAAAAA_A_A_A____ ________AAAA_N__AwAwAYAYAwAwAYAwAYAYAA_NAA_A_A_AAA_z_A_A_A______ ________AA_zAA__AwAwAYAAAwAYAAAwAYAY_zAAAA_A_A_A_NAA_A_A________ __________AA___AAwAYAA_zAwAYAAAwAYAYAAAA_z_A_A_A_A_A_A__________ _______________AAwAYAAAwAwAAAwAwAYAYAA_NAA_A_A_A_A_A____________ _______________A_AAY_AAwAY_LAwAwAY_A_A_A_A_A_A_A________________ _________________A_A_A_A_A_A_A_A_A_A_A_A_A_A____________________ } # tile 187 (master lich) { ______________________________CM____Ba__________________________ ________________________CM__CMCMBa__Ba__________________________ ______________________CMCMCMCMCMCMBaBaBa________________________ ______________________CM_H_H_H_F_F_F_FBa________________________ _______________________H_HCPCmCmCmCP_F_F________________________ _______________________HCPABABCmABABCP_F________________________ _______________________HCPABABCmABABCP_F________________________ _______________________HCPCmCmABCmCmCP_F________________________ _______________________HAeBJCmCmCmBJAe_F________________________ _______H_H_H___________HAeAjAlBDAlAjAe_F_____F_F_F______________ ______CM_H_H_H_H_______H_HAeCPCPCPAe_F_F_F_F_F_FBa______________ ________CM_H_H_H_H_H_H_H_H_H_H_H_F_F_F_H_F_F_FBa________________ __________CM_H_H_H_H_H_HBa_H_H_H_FCMCM_H_F_FBa_F_H_H____________ ___________FCMBaBaBaBaBa_F_H_H_H_F_F_FCMBaBa_F_F_HBa____________ ________CM_F_F_F_F_F_F_FBa_H_H_H_F_FCM_F_F_F_F_HBa______________ __________CMCM_H_H_H_HBa_H_H_H_H_F_FCM_H_H_HBaBa_F______________ _____________HBaBaBaBa_H_H_H_H_H_F_F_FCMCMBa_H_H_F_F____________ ___________H_H_F_F_____H_H_H_H_H_F_F_F_______H_H_F_F____________ ___________H_H_F_F____CMCM_H_H_H_F_HBa_______H_H_H_F_F__________ ___________H_H_F_F_____H_H_HCMCMBaBa_F_________H_H_F_F__________ _________H_H_F_F_______H_H_H_H_H_H_F_F_F_______H_H_F_F__________ ________Cm_H_F_________H_H_H_F_H_H_F_F_F_______H_H_FCm__________ ________CmCmCm_________H_F_H_F_H_H_F_F_F_______HCmCm____________ ________Cm__Cm_______H_H_F_H_F_H_H_F_F_F________Cm__Cm__________ ____________Cm_______H_F_F_H_F_H_H_F_F_F_F______Cm__Cm__________ _____________________H_F_H_H_F_H_H_F_F_F_F______________________ _____________________H_F_H_H_F_H_F_H_F_F_F______________________ _____________________F_H_H_F_F_H_F_H_F_F_F_A_A_A_A_A_A__________ ___________A_A_A_A_F_F_H_H_F_H_H_F_H_F_F_F_A_A_A_A_A_A__________ ___________A_A_A_A_F_H_H_H_F_H_H_F_H_F_F_F_A_A_A_A_A____________ _____________A_A_A_A_A_H_F_H_H_H_F_A_A_A_A_A_A__________________ _____________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A______________________ } # tile 190 (gnome mummy) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________B9B9____________________________________ ______________________CmCmCmB9__________________________________ ____________________CmB9B9B9B9B9________________________________ ____________________B9CmB9B9B9B9________________________________ ____________________CmAOAOAOAOB9________________________________ __________________CmAOC$AOAOC$AOB9B9B9__________________________ __________________B9AOAOAOAOAOAOCm____B9B9B9____________________ __________________CmCmB9AOAOB9B9B9B9B9_______A_A_A_A____________ ____________________CmB9AOAOB9B9______B9___A_A_A_A_A_A__________ ______________CmCmB9B9B9B9B9B9CmCmB9B9___A_A_A_A_A_A_A__________ ____________CmB9B9B9CmCmB9B9B9B9B9B9B9B9_A_A_A_A_A_A_A__________ ____________CmB9__B9CmCmCmB9B9B9B9_ACmB9_A_A_A_A_A_A____________ __________CmB9B9__B9B9B9B9CmCmCmB9_AB9CmB9_A_A_A_A_A____________ __________CmB9____CmCmCmCmB9B9B9B9_A_ACmB9_A_A_A_A______________ __________CmB9____CmCmCmB9B9B9B9B9_A_AB9B9_A_A_A_A______________ __________________B9B9B9B9B9CmB9B9_A_A_A_A_A_A_A________________ __________________CmCmB9_A_ACmCmB9_A_A_A_A_A_A__________________ __________________B9B9B9_A_AB9B9B9_A_A_A_A_A____________________ ________________CmCmCmB9_A_ACmCmB9B9_A_A_A_A____________________ ________________CmCmCmB9_A_ACmCmB9B9_A_A________________________ _________________A_A_A_A_A_A_A_A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ } # tile 197 (red naga hatchling) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________________BoCB_A_A____________CTCTBwBV______________ ________________________BoCuCB_A________CTCTBzBtBwBV____________ __________________________CBCBBo_A______CT_A_ABw_A_A____________ __________________________BoCuBo_A______BjCGBjCGBVBV____________ __________________________CBCBCB_A______CGBbBoBoBoBV____________ ________________________BoCBCuBo_A______BoBVBNBNBNBV____________ ______________________BoCBCBCB_A_A______CBBVBVBVBV______________ ______________________CBCBCBBo_A________BoBjCGBw_______A_A_A____ ____________________BoCBCuBo_A_A______CuCBBVBVBV_____A_A_A_A_A__ ____________________BoCBCBCB_A________CBCBBjCGBj___A_A_A_A_A_A__ ____________________BoBoCuBo_A______CBCBBVBVBVBV_A_A_A_A_A_A____ ____________________BoCBCBCBCuCB__CuCBBoCGBzBtBw_A_A_A_A_A______ _____________________ABoCBBoCBCuCBCBCBBoBVBVBV_L_A_A_A_A________ _____________________ABoBoCBCBCBBoCBBoBwBcCGBw_A_A_A_A__________ _______________________ABoBoBoCBBoBoBVBVBVBV_A_A_A______________ _________________________A_ABoBoBoBVBVBVBV_A_A_A________________ ___________________________A_A_A_A_A_A_A_A_A_A__________________ _______________________________A_A_A_A_A_A______________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 198 (black naga hatchling) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ _______________________MAO_A_A____________CTCTBwBV______________ _________________________MAlAO_A________CTCTBzBtBwBV____________ __________________________AOAO_M_A______CT_A_ABw_A_A____________ __________________________ABAl_z_A______BjCGBjCGBVBV____________ __________________________AOAOAO_A______CGBbAA_M_MBV____________ _________________________MAOAl_M_A_______OBVBNBNBNBV____________ _______________________MAOAOAO_z_A______AOBVBVBVBV______________ ______________________AOAOAO_M_A_________$BjCGBw_______A_A_A____ _____________________MAOAlAK_A_A______AlAOBVBVBV_____A_A_A_A_A__ ____________________AKAOAOAO_A________AOAOBcCGBj___A_A_A_A_A_A__ _____________________M_MAl_M_A______AOAOBVBVBVBV_A_A_A_A_A_A____ _____________________$AOAOAOAlAO__AlAO_MCGBzCGBw_A_A_A_A_A______ _____________________A_OAOAAAOAlAOAOAO_MBVBVBV_A_A_A_A_A________ _____________________z_MA_AOAOAO_MAO_MCGBjBtBw_A_A_A_A__________ _______________________A_M_MA_AOAA_MBVBVBVBV_L_A_A______________ _________________________z_AAA_MA_BVBVBVBV_A_A_A________________ ___________________________A_A_A_A_A_A_A_A_A_A__________________ _______________________________A_A_A_A_A_A______________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 199 (golden naga hatchling) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________________B_CL_A_A____________CTCTBwBV______________ ________________________B_CrCL_A________CTCTBzBtBwBV____________ __________________________BbBvB__A______CT_A_ABw_A_A____________ __________________________B_CrB__A______BjCGBjCGBVBV____________ __________________________CLBbCL_A______CGBbBoBoBoBV____________ ________________________AzCLCrB__A______B_BVBNBNBNBV____________ ______________________B_BzBZCL_A_A______CLBVBVBVBV______________ ______________________CLBvCLB__A________B_BcCGBw_______A_A_A____ ____________________B_BbCrAx_A_A______CrCLBTBVBV_____A_A_A_A_A__ ____________________BTBvCLCL_A________BZCLBcCGBj___A_A_A_A_A_A__ ____________________B_B_CrB__A______CLCLBTBVBVBV_A_A_A_A_A_A____ ____________________B_BZCLBbCrCL__CrBbAzBjCGBbBw_A_A_A_A_A______ _____________________AB_CLAzCLCUCLBvCLB_BVBVBV_z_A_A_A_A________ _____________________zB_B_BbCLBvB_BzB_CGBjCGBw_A_A_A_A__________ _______________________AB_B_B_CLAxB_BVBVBVBV_A_A_A______________ _________________________A_AB_B_B_BVBVBVBV_A_A_A________________ ___________________________A_A_A_A_A_A_A_A_A_A__________________ _______________________________A_A_A_A_A_A______________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 200 (guardian naga hatchling) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ _______________________O_Y_A_A____________CTCTBwBV______________ _________________________O_d_Y_A________CTCTBzBtBwBV____________ ___________________________Y_Y_O_A______CT_A_ABw_A_A____________ ___________________________O_d_O_A______BjCGBjCGBVBV____________ ___________________________Y_Y_Y_A______CGBb_O_O_OBV____________ _________________________O_Y_d_O_A_______OBVBNBNBNBV____________ _______________________O_Y_Y_Y_A_A_______YBVBVBVBV______________ _______________________Y_Y_Y_O_A_________MBjCGBw_______A_A_A____ _____________________O_Y_d_O_A_A_______d_YBVBVBV_____A_A_A_A_A__ _____________________O_Y_Y_Y_A_________Y_UBzCGBj___A_A_A_A_A_A__ _____________________O_O_d_O_A_______Y_YBVBVBVBV_A_A_A_A_A_A____ _____________________O_Y_Y_Y_d_Y___d_Y_OCGBjBtBw_A_A_A_A_A______ _____________________A_O_Y_O_Y_d_Y_Y_Y_OBVBVBV_L_A_A_A_A________ _____________________A_O_O_Y_Y_Y_O_Y_MBjCGBzBw_A_A_A_A__________ _______________________A_O_O_O_Y_O_OBVBVBVBV_A_A_A______________ _________________________A_A_O_O_OBVBVBVBV_A_A_A________________ ___________________________A_A_A_A_A_A_A_A_A_A__________________ _______________________________A_A_A_A_A_A______________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 201 (red naga) { __________________________________________AA______AA__AA________ ____________________________________AA__AA__AYAYAAAY_z__AA______ ______________________________________AAAJAYAYAAAJAYAAAA_L__AA__ _____________________________________z__AAAYAAAYAYAACTBwAAAA____ __________CuCuCuCuCBCuCB__________AA__AAAJAYAY_zCTCTCTBtBj_$__AA ______CuCuCBCBBNCBCBCBCuCuCB____AA___LAAAYAAAYBwBoCuCTCTBwCuAA__ ____CuBNCBBNBNBNBNBNCBCBCuCBCB____AAAA___zAAAAAACTBoCuCTCuBoAA__ __CuCBBNBN_A_A_A_A_ABNCBCBCuCuCB______AAAAAA_zBwCTCTCTCTCGBw____ __CB_A_A_A_A_A_A_A_A_ABNCBCuCBCBBNAA_z___NAABNAACTCTCmBNBNCmAA__ ___A_A_A_____________A_ACBCuCuCBCB____AABNAABNAABwBNCmBNBNCm____ ___A___________________ACuCBCBCBBN____AABN_NAABwBtBVBVBVBV___N__ ______________________CuCBCuCBCBBN___NCBBNAABNBVBbCGBjBw________ ____________________CuCuCuCBCBBN_A______CBBNBNBwBtBVBVBV________ __________________CuCBCuCBCBBN_A_A______CBCBBNCGBzBwBbCG________ ________________CBCuCuCBCBBNBV_A________CuCBCBBVBVCGBjCG________ ____________CBCuCuCuCBCBBNBV_A_A________CuCBCBCBBjBVBVBVBj______ ____________CBCBCuCBCBBNBw_A_A__________CBCuCBBNCGBbCGBjCG______ __________BNCBCuCuBNBNBV_A_A_A__________CuCBBNCBBVBwBtBzBV______ __________BNCBCuCBCBCB_A_A_A____________CuCBCBCBBjBVBVBVBw______ ________BNBNCBCBCuCuCB_A_A______________CBCuBNCBCGBjCGBzBt___A_A ________BNBNCBCBCuCBCBCB_A____________CBCuCBBNCBBVBzBtBwBV_L_A_A ________BNCBBNCBCBCuCuCuCB____________CuCBCBCBCBCGBVBVBVBw_A_A_A ________BNBNBNCBCBCBCuCuCBCB________CuCuCBBNCBBjBjCGBjCGBb_z_A_A _________ABNBNCBCBCuCBCuCBCuCuCuCBCuCBCBCBCBCBCGBzBtBzBV_z_A_A_A _________ABNBNBNCBBNCBCBCuCuCBCuCuCBCBCBBNCBBwBVBVBVBVCG_A_A_A_A _________A_ABNBNBNCBCBCBCBCBCBCBCBCBBNCBCBBNBbCGBcCGBjBV_A_A_A__ ___________A_ABNBNBNBNBNCBBNCBCBBNCBCBBNBNBwBVBVBVBVBV_A_A_A____ ___________A_A_A_ABNBNBNBNBNCBBNBNBNBNBNBjCGBzCGBwBV_A_A_A______ _______________A_A_A_ABNBNBNBNBNBNBNBVBVBVBVBVBV_A_A_A_A________ ___________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A____________ _______________________A_A_A_A_A_A_A_A_A_A_A_A_A________________ ________________________________________________________________ } # tile 202 (black naga) { __________________________________________AA______AA__AA________ ____________________________________AA__AA__AYAYAAAY_z__AA______ ______________________________________AAAJAYAYAAAJAYAAAA_L__AA__ _____________________________________z__AAAYAAAYAYAACTBwAAAA____ __________AlAlAlAlAOAlAO__________AA__AAAJAYAY_zCTCTCTBtBj_$__AA ______AlAlAOAO_MAOAOAOAlAlAO____AA___LAAAYAAAYBwBoCuCTCTBwCuAA__ ____Al_MAO_MAK_M_$_OAOAOAlAOAO____AAAA___zAAAAAACTBoCuCTCuBoAA__ __AlAOAK_M_A_A_A_A_z_MAOAOAlAlAO______AAAAAA_zBwCTCTCTCTCGBw____ __AO_A_A_A_A_A_A_A_A_A_MAOAlAOAO_MAA_z___NAA_MAACTCTCmBNBNCmAA__ ___A_A_A_____________A_zAOAlAlAOAO____AA_zAA_MAABwBNCmBNBNCm____ ___A___________________AAlAOAOAO_M____AAAOAA_zBwBtBVBVBVBV___N__ ______________________AlAOAlAOAO_M__AAAO_MAAAOBVBbCGBjBw________ ____________________AlAlAlAOAO_M_z______AOAO_MCGBjBVBVBV________ __________________AlAOAlAOAO_z_A_A______AOAO_QCGBjCGBbCG________ ________________AOAlAlAOAO_OBV_A________Al_MAOBVBVBzCGBj________ ____________AOAlAlAlAOAO_MBV_A_A________AlAOAOAOBtBVBVBVBw______ ____________AOAOAlAOAO_MCG_L_A__________AOAlAO_OBwBzBtBjCG______ ___________MAOAlAlAA_MBV_A_A_A__________AlAOABANBVBwCGBzBV______ ___________MAOAlAOAOAO_A_A_A____________AlAOAOAOCGBVBVBVBt______ _________MAKAOAOAlAlAO_A_A______________AOAl_zAOBcCGBcCGBj___A_A _________M_zAOAOAlAOAOAO_A____________AOAlAO_OAOBVBzCGBzBV_A_A_A ________ABAO_MAOAOAlAlAlAO____________AlAOAOAOANBwBVBVBTBw_A_A_A _________z_OAKAOAOAOAlAlAOAO________AlAlAO_MAOCGBjCGBcCGBz_A_A_A _________A_z_MAOAOAlAOAlAOAlAlAlAOAlAOAOAOAOAdBwBbCGBjBV_A_A_A_A _________AAB_M_zAO_MAOAOAlAlAOAlAlAOAOAO_MAOBwBVBVBVBVCG_L_A_A_A _________A_AAB_MABAOAOAOAOAOAOAOAOAO_MAOAOA_BbCGBzCGBjBV_A_A_A__ ___________A_A_z_M_$_O_zAO_MAOAO_MAOAOAA_MCGBVBVBVBVBV_A_A_A____ ___________A_A_A_AAB_MAB_OAAAOA__MAAA__MCGBjBjCGBwBV_A_A_A______ _______________A_A_A_A_zA__M_MAA_MA_BVBVBVBVBVBV_A_A_A_A________ ___________________A_A_A_A_z_A_A_A_A_A_A_A_A_A_A_A_A____________ _______________________A_A_A_A_A_A_A_A_A_A_A_A_A________________ ________________________________________________________________ } # tile 203 (golden naga) { __________________________________________AA______AA__AA________ ____________________________________AA__AA__AYAYAAAY_z__AA______ ______________________________________AAAJAYAYAAAJAYAAAA_L__AA__ _____________________________________z__AAAYAAAYAYAACTBwAAAA____ __________CrCrCrCrCLCrCL__________AA__AAAJAYAY_zCTCTCTBtBj_$__AA ______CrCrBbCLB_BZCLBZCrCrCL____AA___LAAAYAAAYBwBoCuCTCTBwCuAA__ ____CrB_CLB_B_B_B_B_CLBbCrBZCL____AAAA___zAAAAAACTBoCuCTCuBoAA__ __CrCLB_B__A_A_A_A_AB_BvCLCrCrBb______AAAAAA_zBwCTCTCTCTCGBw____ __Bb_A_A_A_A_A_A_A_A_zB_CLCrCLBvB__zAA___LAAB_AACTCTCmBNBNCmAA__ ___z_A_A_____________B_zBZCrCrBbCL____AAB_AAB_AABwBNCmBNBNCm____ ___A___________________ACrCLBtCLB______zCL_AAABwBtBVBVBVBV___N__ ______________________CrCLCrCLBvB___AABbB_AABZBVBbCGBjBw________ ____________________CrCrCrBZCLB__A______CLCLB_CGBcBVBVBV________ __________________CrCLCrBZCLB__A_A______CLBZB_CGBjCGBbCG________ ________________CLCrCrBbCLB_BT_A________CrB_CLBVBVBjCGBj________ ____________CLCrCrCrBvCLB_BV_A_A________CrCLBZCLBtBVBVBVBw______ ____________BbCLCUCLBbB_CG_A_A__________BbCrCLAzBjCGBzBtBz______ __________B_BvCrCrB_B_BV_A_A_A__________CrCLAzCLBVBcCGBwBV______ __________B_CLCrCLBZCL_A_A_A____________CrBZCLBZCGBVBVBVBt______ ________B_B_CLBZCrCrCL_A_A______________CLCrAxCLBzBwBzCGBj___A_A ________B_B_BbCLCrBtBvBz_A____________BbCrCLAzBbBTCGBcCGBV_A_A_A ________B_CLBTBvCLCrCrCrCL____________CrCLBZCLCIBwBVBVBVBj_A_A_A ________B_B_B_CLBZCLCrCrBZCL________CrCrBvBTCLBXCGBzBtBzCG_A_A_A _________AB_B_BZCLCrBbCrCLCrCrCrCLCrBvCLBbCLBbCGBjCGBwBV_A_A_A_A _________AB_B_B_CLAwCLBvCrCrBbCrCrBbCLBtBWCLBtBbBVBVBVBw_A_A_A_A _________A_AB_B_B_BbCLCGCLBZCLCLBvCLB_CLBbB_CGBwBtBzBtBV_A_A_A__ ___________A_AB_B_B_B_AzCLB_BtBvBVBZCLAzB_BwBZBVBVBVBV_L_A_A____ ___________A_A_A_AB_B_B_B_B_CLB_B_B_B_B_CGBzBtBwBwBV_A_A_A______ _______________A_A_A_AB_B_B_B_B_B_B_BVBVBVBVBVBV_A_A_A_A________ ___________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A____________ _______________________A_A_A_A_A_A_A_A_A_A_A_A_A________________ ________________________________________________________________ } # tile 204 (guardian naga) { __________________________________________AA______AA__AA________ ____________________________________AA__AA__AYAYAAAY_z__AA______ ______________________________________AAAJAYAYAAAJAYAAAA_L__AA__ _____________________________________z__AAAYAAAYAYAACTBwAAAA____ ___________d_d_d_d_Y_d_Y__________AA__AAAJAYAY_zCTCTCTBtBj_$__AA _______d_d_Y_Y_O_Y_Y_Y_d_d_Y____AA___LAAAYAAAYBwBoCuCTCTBwCuAA__ _____d_O_Y_O_O_O_O_O_Y_Y_d_Y_Y____AAAA___zAAAAAACTBoCuCTCuBoAA__ ___d_Y_O_O_A_A_A_A_A_O_Y_Y_d_d_Y______AAAAAA_zBwCTCTCTCTCGBw____ ___Y_A_A_A_A_A_A_A_A_A_O_Y_d_Y_Y_OAA_z___NAA_OAACTCTCmBNBNCmAA__ ___A_A_A_____________A_A_Y_d_d_Y_Y____AA_MAA_OAABwBNCmBNBNCm____ ___A___________________A_d_Y_Y_Y_O____AA_Y_zAABwBtBVBVBVBV___N__ _______________________d_Y_d_Y_Y_O__AA_Y_OAA_UBVBbCGBjBw________ _____________________d_d_d_Y_Y_O_A_______Y_Y_OBwBtBVBVBV________ ___________________d_Y_d_Y_Y_O_A_A_______Y_Y_OCGBzBwBbCG________ _________________Y_d_d_Y_Y_OBV_A_________d_O_YBVBVCGBjCG________ _____________Y_d_d_d_Y_Y_OBV_A_A_________d_Y_Y_UBjBVBVBVBj______ _____________Y_Y_d_Y_Y_OBw_A_A___________Y_d_Y_OCGBzBtBzCG______ ___________O_Y_d_d_O_OBV_A_A_A___________d_Y_O_YBVBjCGBwBV______ ___________O_Y_d_Y_Y_Y_A_A_A_____________d_Y_Y_YBwBVBVBVBb______ _________O_O_Y_Y_d_d_Y_A_A_______________Y_d_O_YBtBzBtBjCG___A_A _________O_O_Y_Y_d_Y_Y_Y_A_____________Y_d_Y_O_YBVBwCGBzBV_A_A_A _________O_Y_O_Y_Y_d_d_d_Y_____________d_Y_Y_Y_UBzBVBVBVBw_A_A_A _________O_O_O_Y_Y_Y_d_d_Y_Y_________d_d_Y_O_YBwCGBcCGBbCG_A_A_A _________A_O_O_Y_Y_d_Y_d_Y_d_d_d_Y_d_Y_Y_Y_Y_YCGBbCGBwBV_A_A_A_A _________A_O_O_O_Y_O_Y_Y_d_d_Y_d_d_Y_Y_Y_O_YBwBVBVBVBVBj_z_A_A_A _________A_A_O_O_O_Y_Y_Y_Y_Y_Y_Y_Y_Y_O_Y_Y_OCGBbBwBzCGBV_A_A_A__ ___________A_A_O_O_O_O_O_Y_O_Y_Y_O_Y_Y_O_OBwBVBVBVBVBV_A_A_A____ ___________A_A_A_A_O_O_O_O_O_Y_O_O_O_O_RBtBzCGBjCGBV_A_A_A______ _______________A_A_A_A_O_O_O_O_O_O_OBVBVBVBVBVBV_A_A_A_A________ ___________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A____________ _______________________A_A_A_A_A_A_A_A_A_A_A_A_A________________ ________________________________________________________________ } # tile 205 (ogre) { ____________________________CiClCnCn____________________________ ______________BsAw________CnCnCgClCnCn__________________________ ____________BsBSAwAY______CnCnCiCnCiCn__________________________ ____________BsBsBSAw____CTCnBVBtCiBVBVCn________________________ __________BsBSBSAwAY____BwCnCnCTCnCnCTCn________________________ __________BsBsBSBSAw____CGCTCnBoBoBoBoCTCnCT____________________ __________BsBSBsBSAwCTBVBjCTBNBNBNBNBNBNCnBwCnCTBw______________ __________BsBSBSAwAwCnBjBVCGBNCVBNBNCVBNCTBbCTCGCnCTBw__________ ________CTBsBsBSAwCnCTCTCTBVCTCTCTCTCTCTBVCGBjCTBbCnCTCG________ ______CTCnCTBsBSBSCTCGBVCTCTBVBVBVBVBVBVCTCTBVCGCTCGBjCTBj______ ____CTCnBwCTBsBSAwBV__BjCTCnCnCTCTCTCTCnCnCT__BVBVCTCTCTCTCG____ ____CnCTCTBVBSBSAw__BVCGCnCTCTCTBwCTCnCTCTBw______BVBVCGCTCT____ __CTCnCTBVBsBSAwAw__BjBVCTCTCTCTCGCTCTCTCTBVBj______BjCTCnBj____ __BwCTCTBwBsBSBS____BtCTCGBbCGBjCTCTBcCGBjCTCG______BtCTCnCG____ __BVCTCnCTBsBSAw__BVBzCTCnCnCnCnCnCTCTCTCTBtBz_A____BzCnCTBc____ ____BVCnCTCTBSAw__BVBwCTCnCnCnCnCnCnCnCTCTBzBw_A_A__CTCnCTBV____ ______BwCnCTCnCn__AXCGCTCTCnCnCnCnCnCTCTCTCTBt_A_ABwCGBjCTBV____ ________BVCTCTCT__AXAvBbBwCTCTCTCTCTCTCTCGBwAX_zBjCnCTCTCG_A____ __________BVBwCG__BvAvAvBVCGBjCGADCGBcCGBVAJAX_ABVCTCTCTBV_A____ __________BSAw____BvCIAvAvBRBRBVBVBVBVAvAvAXBv_A_ABVBVBV_A_A____ __________Aw____AzBvBWCIAvBRBRBRBRBRBRAvAvCIAzBv_A_A_A_A_A_A____ ________________BvCICIBWCfBvCfBRBRBRBRBvCICIBvBv_A_A_A_A_A_A____ ______________AzBvBWBVCIBvCfBvCfBvCfBvCfCIBWCIAz_A_A_A_A_A_A____ ____________BvBvBvCIBVCICfBVCfCfCfCfCfBVCICIBVBv_A_A_A_A_A______ ______________BvBVCIBvCfBvBVBvCfBVBvCfBVBWCIBw_A_A_A_A_A_A______ ________________BVCTBwBvBwBVBVBv_ACfBVBwCTCICnCT_A_A_A_A________ ________________BVCnCnCfBwBV_A_A_ACfBVCGCTCTCnBw_A_A_A_A________ ______________BVBwCTCTCGBV_A_A_A____BVBjCTBtBw_A_A_A_A__________ ______________BVBtBzBwBbBV_A_A________BVBzCTCT_A_A_A_A__________ ______________BwCTCTCTCG_A_A__________BVBtBwCnCnCT_A____________ ______________CGBzBtBVBV_A___________ABVBVBzCGBjCG_A____________ _____________A_A_A_A_L_A_A___________A_A_A_A_A_A_A______________ } # tile 208 (gray ooze) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __BdBdBdBdBd____________________________________________________ __BDBDBDBDBDBdBdBdBd______CPBkBkBkBk____________BDBDBDBDBD_A____ ___ABJAjBJBDBDBDBdBdBdBkCJBMCJBkBkBkBdBDBDBDBdBdBDBDBDBDBJ_A_A__ ___A_A_A_BAlBJAjBJBDBkCPBkBnBkBkBkBkBdBDBDBDBdBDBDAjBJ_A_A_A____ _______A_A_A_AAlBDBDBkBlCOBkBkBkBkBkBdBdBdBdBdBDBJAl_A_A_A______ ___________A_A_BBDBDCPCWBlBkBdBdBdBdBkBkBdBdBDAj_A_A_A_A________ _______________ABDBkCVCPBkBkBdBdBdBdBdBkBdBdBD_z_A_A_A__________ _____________A_zBkCPCPBkBkBkBDBDBDBDBDBdBkBdBD_A_A_A_A__________ _____________ABDCVCPBkBkBdBDBDBDBDBDBDBDBkBdBD_A_A_A_A__________ ____________BDCPCPBkBdBDBDBDBDBDBDBDBDBDBDBkBdBD_A_A_A__________ __________BDCPBkBdBDBDBDBJAlBDAlBDBDBDBDBDBDBkBDBD_A_A_A________ ________BDBDBDBDBDBDAlBDAlBDAlBDAlBDAlBJAjBJBDBkBDBD_A_A________ ______BDBDBDBDBDBJAj_z_A_A_A_A_A_A_ABJAjAlBJAjBDBkBDBD_A_A______ __BDBDBDBDAlBJAj_A_A_A_A_A_A_A_A_A_A_A_A_ABDAlBJBDBkBk_A_A______ BDBDBDBJAjBJ_B_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_AAjBJAlBDBDBD_A____ AjBJ_A_A_A_A_A_A_A_______________________A_A_A_A_BAlBDBDBDBD_A__ _A_A_A___________________________________________A_A_A_ABJBDBD_A _______________________________________________________A_A_A_A__ } # tile 209 (brown pudding) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________BSBSBSBSBS____________________________ ______________________BSBSBSBSCBCBBSBSBS________________________ ____________________BSBSBSCPCBBoBoBNBSBSBS______________________ __________________BSBSBSBSCPCBBoBNBNBSBSBSBS____________________ __________________BSBSBSBSCPBSBNBNBSBSBSBSBSBS__________________ ________________BSBSBSBSCPCPBSBSBSBSBSBSBSBSBS__________________ ________________BSBSBSBSCPCPCBBNBSBSBSBSBSBSBS__________________ ________________BSCBCBBSCPCPBNBNBSCBCBBSBSCBBoBS________________ ______________BSCBBoBoCPCPBSBSBSCBBoBoBNBSBoBNBS________________ ______________BSCBBoBNCPCPBSBSBSCBBoBNBNBSBSBSBSBS______________ ____________BSBSBSBNBNCPCPBSBSBSBSBNBNBSBSBSBSBSBS_A_A_A_A_A____ ____________BSBSBSBSCPCPBSBSCBBoBSBSBSBSBSBoBoBSBS_A_A_A_A_A_A__ ____________BSBSBSBSCPCPBSBSBoBNBSBSBSBSBoBoBoBNBSBS_A_A_A_A_A__ __________BSBSBSBSBSCPCPBSBSBSBSBSBSBSBSBoBoBNBNBSBS_A_A_A_A_A__ ________BSBSBSBSBSCPCPBSAwCBCBAwAwAwAwAwAwBNBNBSBSBSBS_A_A_A_A__ ______BSBSCBBoAwAwCPCPAwCBBoBoBNAwAwAwAwAwAwAwAwBSBSBSBS_A_A____ ______BSBSBoBNAwCPCPCPAwCBBoBNBNAwAwAwAwAwAwAwAwAwAwAwBS_A_A____ ______AwAwAwAwAwCPCPCPAwAwBNBNAwAwBoBoAwAwAwAwAwAwAwAwAw_A______ _______AAwAwAwCPCPCPAwAwAwAwAwAwAwBoBNAwAwAwAwAwAwAwAw_A_A______ _______A_A_AAwCPCPCPAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw_A_A_A________ _________A_A_A_A_ACPAwAwAwAwAwAwAwAwAwAwAwAw_A_A_A_A_A__________ _____________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A____________ _________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A__________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 210 (black pudding) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________ABABABABAB____________________________ ______________________ABABABABBSBSABABAB________________________ ____________________ABABABCPBSAwAwAYABABAB______________________ __________________ABABABABCPBSAwAYAYABABABAB____________________ __________________ABABABABCPABAYAYABABABABABAB__________________ ________________ABABABABCPCPABABABABABABABABAB__________________ ________________ABABABABCPCPBSAYABABABABABABAB__________________ ________________ABBSBSABCPCPAYAYABBSBSABABBSAwAB________________ ______________ABBSAwAwCPCPABABABBSAwAwAYABAwAYAB________________ ______________ABBSAwAYCPCPABABABBSAwAYAYABABABABAB______________ ____________ABABABAYAYCPCPABABABABAYAYABABABABABAB_A_A_A_A_A____ ____________ABABABABCPCPABABBSAwABABABABABAwAwABAB_A_A_A_A_A_A__ ____________ABABABABCPCPABABAwAYABABABABAwAwAwAYABAB_A_A_A_A_A__ __________ABABABABABCPCPABABABABABABABABAwAwAYAYABAB_A_A_A_A_A__ ________ABABABABABCPCPAB_ABSBS_A_A_A_A_A_AAYAYABABABAB_A_A_A_A__ ______ABABBSAw_A_ACPCP_ABSAwAwAY_A_A_A_A_A_A_A_AABABABAB_A_A____ ______ABABAwAY_ACPCPCP_ABSAwAYAY_A_A_A_A_A_A_A_A_A_A_AAB_A_A____ _______A_A_A_A_ACPCPCP_A_AAYAY_A_AAwAw_A_A_A_A_A_A_A_A_A_A______ _______A_A_A_ACPCPCP_A_A_A_A_A_A_AAwAY_A_A_A_A_A_A_A_A_A_A______ _______A_A_A_ACPCPCP_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A________ _________A_A_A_A_ACP_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A__________ _____________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A____________ _________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A__________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 211 (green slime) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __AnAnAnAnAn____________________________________________________ __AgAgAgAgAgAnAnAnAn______BGAnBGAnAn____________AQAQAQAQAQ_A____ ___AAQAQAQAgAgAgAnAnAnAnBGAnBGAgAnAnAgAQAQAQAgAgAQAQAQAQAC_A_A__ ___A_A_A_AAQAQAQAQAgBGAnBGAnAnAnAnAnAgAQAQAQAgAQAQACAC_A_A_A____ _______A_A_A_AAQAgAgAnBGAnBGAnAnAnAnAgAgAgAgAgAQACAC_A_A_A______ ___________A_A_AAgAgBGBGBGAnAgAgAgAgAnAnAgAgAQAC_A_A_A_A________ _______________AAgBGBGBGAnAnAgAgAgAgAgAnAgAgAQ_A_A_A_A__________ _____________A_AAnBGBGAnAnAnAQAQAQAQAQAgAnAgAQ_A_A_A_A__________ _____________AACBGBGAnAnAQAQAQAQAQAQAQAQAnAgAQ_A_A_A_A__________ ____________ACBGBGBGAQAQAQAQAQAQAQAQAQAQAQAnAgAQ_A_A_A__________ __________AQBGBGAQAQAQAQACACACACACAQAQAQAQAQAnAQAQ_A_A_A________ ________AQAQAQACAQAQACACACACACACACACACACACACAQAnAQAQ_A_A________ ______AQAQAQAQAQACAC_A_A_A_A_A_A_A_AACACACACACAQAnAQAQ_A_A______ __AQAQAQAQACACAC_A_A_A_A_A_A_A_A_A_A_A_A_AACACACAQAnAn_A_A______ AQAQAQACACAC_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_AACACACAQAQAQ_A____ ACAC_A_A_A_A_A_A_A_______________________A_A_A_A_AACACAQAQAQ_A__ _A_A_A___________________________________________A_A_A_AACAQAQ_A _______________________________________________________A_A_A_A__ } # tile 212 (quantum mechanic) { ____________________________________Cu__________________________ ______________Cu__Cx____Cu__Cu__Cu______________________________ ____________________Cu________________Cu__Cu____________________ __________Cx____Cx______CuCuCuCuCu__Cu__________________________ ______________Cx__Cx__CxCxCuCuCuCxCx____Cu__Cx__________________ ______Cz__Cz____CzCx____CxCxCxCxCxCxCu______Cu__________________ ____________________CzCzCxCxCxCxCxCz__Cx__Cx____Cx______________ ______Cf__Cz__Cz__Cz__CzCzCzCzCzCzCzCxCx________________________ __________Cf______Cx__CfCzCzCzCzCzCf______CxCx__Cf__Cj__________ ________Cj____Cj__CfCj__CfCjCfCjCf__Cj__________________________ __Cj________Cj____Cf__CfCjCfCjCfCjCf____Cf__________Cj__________ ________Cj____CjCj__CjCjCjCfCfCjCfCjCj______Cj__Bf______Bf______ ______________Bf__CjCjCjCjCjCjCjCjCjCjCj____________Bf__________ __Bf____Bf__Bf__BfBfBfCjCjCjCjCjCjCjBfBfBfBf__Bf____Bf__Bf______ __________Bf__BfBfBfBfBfBfBfBfBfBfBfBfBfBfBf___w________________ _w_______w_w___wBfBf__BfBfBfBfBfBfBf__BfBf_w_w_____w_w_______w__ _______w_____w_w_w__Bf_wBfBfBfBfBf_w___w_w_w_____w______________ _s_________w___w_w_w___w_w_w_w_w_w_w_w___w_w_w_________w___k____ _______________s_s_k_k_w_w_w_w_w_w_w_____s_s___k_______s___s____ ___s___s___s___k_s_____s_s_w_w_w_s_s___w_k_s_____s_k_____k___k__ _______________s_k___w_s_s_s_s_s_s_s_____s_s_k_A_k_A___s________ _____k___s___k___s_k___k_s_s_s_s_s_k_A_k_A_A_k_A_A_s_A___k______ _s_____________k___k___k_k_k_z_k_k_k_A_A_s_s_A_k_A_A_A_____k____ ___________k___k___k_k_K_k_k_A_k_K_k_A_k_A_k_A_A_A_A_k__________ _____K_________K_A_k_K_k_k_A_K_k_k_K_A_A_K_A_A_A_k_A____________ _______k_________K_A_K_K_K_K_A_K_K_K_K_k_A_K_A_A_A_A_K___K______ _k___________K_K_A_A_K_K_A_K_A_K_K_K_A_A_K_A_A_K_A______________ _________K_____A_K_A_K_A_K_K_A_K_K_A_K_K_A_A_A_A_K___K__________ _____K_______K_A_A_K_A_K_K_A_A_K_A_A_K_K_A_K_A_________K________ _____________K___K_A_K_A_A_K_A_A_K_A_A_K_A______________________ _________K_____K___K_A_K_A_A_A_A_A_K_K___K_K_____K______________ _______________K_______________K_____K_____K____________________ } # tile 213 (rust monster) { ________________________________________________________________ ________________________________________________________________ ________________________________CPCPBkCP________________________ __________________________________BkCP__________________________ __________________________________BNBNBNBNBNBN__________________ __________________________________CPCP____AqAqBNBN______________ ________________________________CPBkCPBk______AqAqBNBN__________ __________________________________________________BNAqATAT______ ____________________________________________________BNAqAqAT____ ______________________________________________________BoAqAqAT__ ______________________________BkBkBkBk__________________BNAqAq__ ________________________BkBkBk__________________________BNBNAqAT ____________________BkBk__________________________________BNAqAT ________________BkBk________BoBoBoBoATBoBoBo______________BNAqAT ______________Bk________ATBoBoBNBNATBoBoBoBNATAT__________BNAqAT ____________Bk______BoBoATBNBNBNBNATBNBNBNBNATBNBo________BNAqAT __________Bk____BoBoBoAqATBNBNBNBN_$BNBNBNAq_$_AAqBo______BNAqAT ________Bk____BoBoATAT_$_$_$BNBNAq_$_$AqAq_A_ABN_A_ABN__BNAqAqAT ________Bk___$BoBNBN_$BNBNBN_$_A_ABNBN_A_ABkBkBkBk_A_$BNAqAqATAT ________BoBoBN_$BNAT_$BNAqAqBN_ABNBkBkBkBk_AATAT_AAq_$AqAqATAT__ ______BoBNAqAqAq_ABNATAqAqAT_ABkBkATATAT_AAT_A_ABN_$BNBNBoBoAT__ ____BoBv_ABvAqAqAT_A_A_AAqBkBk_A_AAT_A_AAq_ABNAqBNBNBNBNBoBNAq__ __CICIATATATATAT_$_AAqBNBkBNAqBoAq_ABNAqATBNBNBNBNBNAqBoBoAq_A__ CIBvBvAT_$_$_$_$_$_AATBk_ABNBoBNBN_AATBNBNBNBNBNAqAqBoBoBN_A_A_A Bv_ABWAT_$_$Bk_$_$BkBkBNBNBoBNBNBN_$BNBNBNAqAqAqBoBoBN_A_A_A_A_A _ABW_A_A_A_A_ABkBk_A_A_ABoBNBN_A_A_A_AAqAq_A_ABoBNBN_A_A_A_A_A__ _A_A_A_A_A_A_A_A_A_A_ABoBN_A_A_A_A_A_A_A_ABoBoBN_A_A_A_A_A_A____ _A_A_A_A_A_A_A_A_A_ABoBN_A_A_A_A_A_A_A_ABoBNBN_A_A_A_A_A________ _____A_A_A_ABNBoBoBoBN_A_A_A_A_A_ABoBoBoBN_A_A_A_A_A____________ _________A_ABN_ABNBN_A_A________BNBN_A_A_A_A_A__________________ ________________________________________________________________ ________________________________________________________________ } # tile 215 (garter snake) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ _______________________n_n_n_r_n________________________________ _________________n_n_n_n_n_n_n_n_n_i___________________d_d_Y____ _______________i_n_i_iBmBm_d_d_i_i_i_i_n_n_i_______nBm_Y_A_A_A__ _____________Y_i_n_iBm_d_YBmBLBLBL_i_d_iBmBm_n_iBDBm_Y_A_A______ _____________d_n_iBLARAR_AARARARARBmBLBLARARBLAoAR_A_A_A________ _____________Y_i_nBL_A_A_A_A_A_AARARARAR_UARAR_A_A_A____________ _____________YBL_i_i_n_________A_A_A_A_A_A_A_A_A________________ _____________ABm_d_i_i_r_n_______________n_n_n_n_n______________ _____________A_UBL_d_i_i_i_n_n_r_n_n_i_n_n_i_i_i_i_n_n__________ _______________A_YBLBLBm_d_d_d_dBLBmBm_i_dBLBmBm_i_i_r_n________ _______________A_AARAR_dBmBLBLBL_i_d_dBLBL_dARARBmBL_i_i________ _________________A_A_AARARARARAR_U_Y_Y_Y_Y_Y_A_A_Y_dBL_r_Y______ _____________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_YBL_n_Y_A____ _________________________r_n_n_n_________________YBD_n_iBL_A____ _____________________i_r_n_n_i_i_n_n_n_i_r_n_i_r_n_i_i_iBL_A____ ______________CY_n_r_n_i_iBLBmBL_i_iBmBmBm_n_iBmBL_YBmBm_A_A____ _______________n_rCY_i_dBL_i_iARBLBm_d_d_dBLBLARARBLAR_A_A______ _____________i_n_n_i_d_YARARARADADADADARARARARARAR_A_A_A________ ___________A_i_i_d_d_Y_Y_A_A_A_A_A_A_A_A_A_A_A_A_A_A____________ ___________A_A_Y_Y_Y_A_A_A______________________________________ _____________A_A_A_A_A_A________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 216 (snake) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________________________Br_m_m_mBr_m__________ _____________________________________m_m_m_m_mBr_m_m_m_m_h______ _________________________________q_m_h_m_mAoCtCrCtCrCt_mBr_h____ _______________________________qBG_A_h_h_mCr________Cr_m_m_h____ _____________________________q_m_A_A_hCrCt__________Ct_q_m_h____ ______________________________CuCdCrCr____________Cr_q_m_h_h____ ____________________________Cu__Cr______________Ct_qAoBr_h______ __________________________Cu__Cu______________CM_mBr_m_h________ ____________________________________________Ct_m_m_m_h__________ __________________________________________CM_m_m_d_d____________ ________________________________________Ct_m_m_d________________ ______________________________________CM_m_m_d_m_mBr_m_m_m______ ____________________________________Ct_m_m_h_m_m_m_m_m_mBr_m_m__ ___________m_m_mCx_m_____________mCM_qCx_h_c_c_c_c_c_c_c_m_mCx_m ___m____Cx_mCx_m_m_mCx________Cx_mCt_q_m_h_c_A_A_A_A_A_A_c_m_m_m ___h_m_m_m_h_A_A_A_h_m_m_____m_m_mCM_q_m_h_A_____________mCx_m_m ___A_A_A_A_A_______A_h_h_mCx_m_mCMCs_q_mCx_m_m_mCx_m_m_m_m_m_m_A _____________________A_h_h_h_mCM_A_ACM_mAoAoCx_m_m_mCx_m_mAo_A_A _______________________A_A_A_A_A_____ACsCM_m_m_m_m_m_m_A_A_A_A__ _______________________________________A_A_A_A_A_A_A_A_A________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 217 (water moccasin) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ___________________D_D_D_J______________________________________ _______________D_J_k_f_D_f_D____________________________________ _____________D_D_D_D_D_f_J_D_J_D________________________________ ___________D_J_f_k_f_D_D_J_f_D_D_D_________J_D_J_D______________ __________Cl_D_D_D_D_f_J_D_J_D_D_J_______D_D_J_____J____________ ___________D_D_D_D_D_DCl___D_J_f_D_D_____J_J____________________ ___________J_f_k_f_f_D_D_____D_D_D_D_____D_D_J__________________ ___________D_D_D_D_D_J_______J_f_f_J_______J_D__________________ _____________D_D_D_D_________D_D_D_D_______D_D_J________________ _______________D_____________f_D_D_D_________J_D________________ ______________CY___________D_D_k_f_J_________D_D_D______________ ______________CY_________f_D_D_D_D___________J_J_J______________ ____________CY__CY_____D_D_k_f_J_D_____________D_D_D____________ _____________________f_D_D_D_D_D_______________J_D_D____________ ___________________D_D_k_f_J_D_______________D_D_f_J____________ ___________________D_D_D_D_D_________________J_D_D_D____________ _________________J_D_D_D_D_J_______________D_D_f_D_D____________ _________________D_f_k_f_J_D_____________D_J_D_D_J______________ _________________D_D_D_D_D_D_D_______D_J_D_f_J_D_D______________ _________________D_D_D_D_D_D_J_D_D_J_D_J_D_D_J_D________________ _________________J_D_D_D_f_J_D_D_J_D_D_f_D_D_D__________________ _________________D_f_k_f_D_D_D_D_f_D_D_k_D_D____________________ ___________________D_D_D_D_D_D_k_D_D_J_D________________________ _____________________D_D_J_J_f_D_D_D____________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 219 (python) { ________________________________________________________________ ______________________________ByACAQAQAQACBy____________________ __________________________ByAQAAByAAAQAAByAAACAA________________ ________________________ACAQAQ_TByBbACBzBy_TAQAQBy______________ ______________________ByAA_TAMACCrCrCrCrCrByAQAQACAA____________ ____________________ByACByBzByCr__________CrAA_TBzAC____________ ____________________AAAQAABzCr______________AQACAABy____________ ____________________AQAQAQAMCL______________AQACAzBy____________ ____________________ACAcAcCLBZ____________ACAC_TBy______________ ____________________CLCMCM_n_n_n_n____AQAQAABzByCr______________ ____________________CjCMBoBoAQAQCoAO_n_iACAzBLCr________________ ______________________BoCnCdBoBoAQAQAQ_iCjCjCr__________________ ________________________CBCoCdCoBoBoAQAQCjCs____________________ ________________________CoBoCoCdCnCdBoCMCr______________________ ________________________Co__CoCdCxCdCBCjCLAM____________________ ______________________________BoCnCBCjCLAMAQAQAMBy______________ ____________________________BoBoBoCjCLAMAMAMACAAAMAQAQ__________ _________________UByByByBy_YCjCjCjCLCLCrByByByAMACACACAc________ ____________ByBzAQAQ_UCN_UAQAQAg_UBZAMCrCrByAzAMAMAMACAMBy______ _________U_UCN_UAQAQAQ_UBz_UAQAQ_UByByAcCUCrBaByByBzAMBzBy______ _______UAQAQ_UBy_U_UAQ_UBzBy_U_UByByCTAzAcCLCrBaAMAM_AAMCLBy____ ____ByAQ_U_U_UByB_B__UBzCLBzCL_UBzBZBbAcAcAcCrCrAMAQAQAQ_ABy____ _____UBjByBkBy_YBk_YBz_A_A_A_A_A_A_A_A_A_A_A_UByAMAMAQAQAMCr____ ____ByByCN_UAQAQ_UBz_UAQ_UByBy_UAQ_UByBy_UAQAQ_UByAMAQAQAMCr____ ____ByBz_RAQAQ_UBz_UAQAQ_UBz_UAQAQAQ_UBz_UAQAQAQ_UByAMAMCrACBa__ ____CrBy_UAQ_UByBy_UAQ_U_UBy_UAQAQAQ_UBy_UAQAQ_U_UByCrCrCrACAC__ ____CtCsBy_UBzBzBzB__UByByByBz_UAQ_UByByBy_UAQ_UCrCrCrCrACACBz__ _____ACtCkCtByByBy_UByByByByByBy_UByByCOCMADADCrCrCr_A_LAzADAz__ _______ACtCsCtCtCtCtCsCtCkCtCkCNCtCtCkCrCMAzADADAD_A__ACADAzCs__ _________A_L_ACtCsCsCtCtCsCtCsCtCsCsCtCrCrCNBWAzADADADADACCr_A__ _______________A_L_L_A_A_L_A_L_A_L_L_A_A_A_L_A_LAzARAzBzCr_A____ _____________________________________________A_A_X_A_L_A________ } # tile 220 (cobra) { ________________________________________________________________ ____________________________CzBsBsBsBs__________________________ __________________________CLBSCoAxBSBSCt________________________ __________________________CtBSBSBSBSBSBSCt______________________ ________________________Cu____BsAw_AAGBsBSCt____________________ ______________________Cu________BsBs_A_ABsBSCF__________________ ____________________Cu__Cu______BsBRCtCtBsBSCF__________________ ________________________________BsBZCLCLBsBSCF__________________ ________________________________BsCrCtCsBsBSCF__________________ ________________________________BsCrCLCrBsBSCF__________________ ______________________________BsBsCtCsCsBsBSCF__________________ ______________________________BiCLCLCLBsBsCF____________________ ______________________________CFCtCsCLBSCF______________________ ____________________________CFCLCLCtBSBS________________________ ____________________________CtCsCLBzBS__________________________ ____________________________CrCrCtBS____________________________ __________________________CtCsCrBS______________________________ __________________________CrCrCtBS______________________________ ________________________CtCsCsBS________________________________ ________________________CrCrCtBS________CFCsCFBsCsCF____________ ________________________CtCsBZBS____CFCsCFCFCrBsBsCsCFCF________ ________________________CrCrCrBSCsCrBsBsCsBsBsCrBsCsBsBsCF______ ________________________CtCsBZBSBSBsCsBsCsBsBsCrBsCrBsCsCrBs____ __________BsBsBsCsBs____BsBgAzAwBSBSCsBsCsAJ_A_A_A_ACrBSBsCr____ ________CsCsBsBsBsCsBsBsCsCFAwAwAwAwCr_A_A________CsBsBSBsBs____ ______CsBsBsCsBSBSCsBsBsBsCsBsBsCsBsBsBsCsBsBsCsBSBsCsBsBS_A____ ______BsBsBsBs_A_A_ABSBSBSCsBsBsBsCsBsBsBSCsBsBsCrBsBsCrBS______ ______BsBsBsCsCs_____A_A_ACsBSBSBSCsBsBsBSCsBsBsCrBSBs_A_A______ ________BSCsBsBsBsCsBsBsCs_AAG_A_AB__T_A_A_A_A_A_A_A_A__________ _________A_A_ABSBSCsBSBSCsBSBSCsBSBsBs__________________________ _______________A_A_A_A_A_A_A_A_A________________________________ ________________________________________________________________ } # tile 221 (troll) { _________________m_q_____q_q_hBR________________________________ _________________m_h_q_m_m_hAvAXBRAXBR__________________________ ____________BR_mCYCY_m_qCYCY_mAvAXBR_m_m________________________ __________BR___hCY_q_q_hCYCY_h_cBRAXBR_h_m_m_m__________________ ____________Av_m_q_m_c_c_h_h_cAvAXBRAXAv_h_c_h_m_m_c____________ __________BRAX_q_mBNBNBNBN_h_h_cAvAXBRAv_h_c_h_m_h_m_m__________ _____________q_m_c_h_h_h_c_c_XAX_XAX_cBR_h_h_c_h_c_h_h_h________ _____________q_hAv_X_X_X_X_X_cAv_cAv_c_X_X_c_h_h_c_c_m_h_c______ ____________AX_hAv_c_X_c_c_X_c_c_X_c_X_c_c_X_c_X_h_h_h_m_h______ _______________m_m_h_X_c_h_X_h_X_X_c_c_h_X_c_X_c_c_h_c_m_h_c____ _______________h_c_X_____c_c_X_c_c_X_X_c_c_X_X_X_X_c_h_m_h_h____ _______________m_h_X_______X_h_X_h_c_h_X_c_c_X_c_X_c_h_h_m_m____ _______________h_h_c_______m_c_c_m_c_h_c_h_X_c_X___X_c_c_h_m____ _______________m_c_h_________c_h_c_h_m_h_c_h_c_X_______c_h_h_h__ _______________m_h_X_________h_c_m_h_m_c_h_c_X_X_______X_h_m_c_h _______________h_m_h_c_______c_h_h_m_c_h_m_h_c_X_______X_c_m_m_A _________________m_h_c_______c_m_h_h_X_h_m_c_X_X_______A_c_h_m_A _______________m_h_h_c_______m_m_h_c_X_c_h_c_h_X_____A_A_c_m_m_A _______________m_h_m_c_______m_h_h_X_c___h_m_c_X___A_A_A_c_h_h_A _____________m_c_h_c_X_h_____h_m_h_h_X___h_h_X_h_A_A_A_h_c_h_h_A ___________m_h_c_c_X_h_____h_m_c_h_X_c___c_m_h_c_X_A_A_h_X_h_c_A _________h_m_h_X___________h_m_h_X_c_X_A_h_m_h_X_X_A_ABy_X_c_c_h _______h_m_h_h___________h_m_c_X_c_X_A_A_A_h_m_c_X_A_ABy_ABy_ABy _____h_m_m_c_h_________h_h_m_c_h_X_c_A_A_A_c_m_h_c_c_ABy_ABy_ABy ___h_m_m_h_m_h_________h_m_h_h_c_X_A_A_A_A_A_m_m_c_X_ABy_ABy_ABy ___m___m_c_m___________c_m_h_X_X_A_A_A_A_A_A_h_h_h_X_ABy_ABy__By __By__By__By___________c_m_h_c_A_A_A_A_A_A_A_m_h_h_c_A_A_ABy__By __By__By__By_______A_A_h_c_h_X_A_A_A_A_A_A_A_h_m_c_c_c_A__By__By __By__By__By_______A_A_h_c_m_X_A_A_A_A_A_A_A_c_h_c_c_X_A__By__By ______By__By_____A_A_h_m_m_h_c_A_A_A_A_A_A_h_c_h_c_c_X_A__By____ ______By_________A_A_h_m_h_h_X_A_______A_A_h_h_h_c_h_A_A________ _________________A_A_A_A_A_A_A_A_________A_A_A_A_A_A_A__________ } # tile 222 (ice troll) { ________________ApBn____BIApAiBR________________________________ ________________ApAiBIApApAiAvAXBRAXBR__________________________ ____________BRApCYCYApApCYCYApAvAXBRApAp________________________ __________BR__AiCYApBIAiCYCYAiASBRAXBRAiApApAp__________________ ____________AvApBIApASASAiAiASAvAXBRAXAvAiASAiApApAS____________ __________BRAYApApBNBNBNBNAiAiASAvAXBRAvAiASAiApAiApAp__________ ____________BIApASAiAiAiASASAEAXAEAXASBRAiAiASAiASAiAiAi________ ____________ApAiAvAEAEAEAEAEASAvASAvASAEAEASAiAiASASApAiAS______ ____________AXAiAvASAEASASAEASASAEASAEASASAEASAEAiAiAiApAi______ ______________ApApAiAEASAiAEAiAEAEASASAiAEASAEASASAiASApAiAS____ ______________AiASAE____ASASAEASASAEAEASASAEAEAEAEASAiApAiAi____ ______________ApAiAE______AEAiAEAiASAiAEASASAEASAEASAiAiApAp____ ______________AiAiAS______ApASASApASAiASAiAEASAE__AEASASAiAp____ ______________ApASAi________ASAiASAiApAiASAiASAE______ASAiAiAi__ ______________ApAiAE________AiASApAiApASAiASAEAE______AEAiApASAi ______________AiApAiAS______ASAiAiApASAiApAiASAE______AEASApAp_A ________________ApAiAS______ASApAiAiAEAiApASAEAE_______AASAiAp_A ______________ApAiAiAS______ApApAiASAEASAiASAiAE_____A_AASApAp_A ______________ApAiApAS______ApAiAiAEAS__AiApASAE___A_A_AASAiAi_A ____________ApASAiASAEAi____AiApAiAiAE__AiAiAEAi_A_A_AAiASAiAi_A __________ApAiASASAEAi____AiApASAiAEAS__ASApAiASAE_A_AAiAEAiAS_A ________AiApAiAE__________AiApAiAEASAE_AAiApAiAEAE_A_AByAEASASAi ______AiApAiAi__________AiApASAEASAE_A_A_AAiApASAE_A_ABy_ABy_ABy ____AiApApASAi________AiAiApASAiAEAS_A_A_AASApAiASAS_ABy_ABy_ABy __AiApApAiApAi________AiApAiAiASAE_A_A_A_A_AApApASAE_ABy_ABy_ABy __Ap__ApASAp__________ASApAiAEAE_A_A_A_A_A_AAiAiAiAE_ABy_ABy__By __By__By__By__________ASApAiAS_A_A_A_A_A_A_AApAiAiAS_A_A_ABy__By __By__By__By_______A_AAiASAiAE_A_A_A_A_A_A_AAiApASASAS_A__By__By __By__By__By_______A_AAiASApAE_A_A_A_A_A_A_AASAiASASAE_A__By__By ______By__By_____A_AAiApApAiAS_A_A_A_A_A_AAiASAiASASAE_A__By____ ______By_________A_AAiApAiAiAE_A_______A_AAiAiAiASAi_A_A________ _________________A_A_A_A_A_A_A_A_________A_A_A_A_A_A_A__________ } # tile 223 (rock troll) { ________________BrCE____CECEBRBW________________________________ ________________BrBRCEBrBrBRAzAbBWAbBW__________________________ ____________BWBrByByBrCEByByBrAzAbBWBrBr________________________ __________BW__BRByCECEBRByByBRAvBWAbBWBRBrBrBr__________________ ____________AzBrCEBrAvAvBRBRAvAzAbBWAbAzBRAvBRBrBrAv____________ __________BWAbCEBrAcAcAcAcBRBRAvAzAbBWAzBRAvBRBrBRBrBr__________ ____________CEBrAvBRBRBRAvAvAXAbAXAbAvBWBRBRAvBRAvBRBRBR________ ____________CEBRAzAXAXAXAXAXAvAzAvAzAvAXAXAvBRBRAvAvBrBRAv______ ____________AbBRAzAvAXAvAvAXAvAvAXAvAXAvAvAXAvAXBRBRBRBrBR______ ______________BrBrBRAXAvBRAXBRAXAXAvAvBRAXAvAXAvAvBRAvBrBRAv____ ______________BRAvAX____AvAvAXAvAvAXAXAvAvAXAXAXAXAvBRBrBRBR____ ______________BrBRAX______AXBRAXBRAvBRAXAvAvAXAvAXAvBRBRBrBr____ ______________BRBRAv______BrAvAvBrAvBRAvBRAXAvAX__AXAvAvBRBr____ ______________BrAvBR________AvBRAvBRBrBRAvBRAvAX______AvBRBRBR__ ______________BrBRAX________BRAvBrBRBrAvBRAvAXAX______AXBRBrAvBR ______________BRBrBRAv______AvBRBRBrAvBRBrBRAvAX______AXAvBrBr_A ________________BrBRAv______AvBrBRBRAXBRBrAvAXAX_______AAvBRBr_A ______________BrBRBRAv______BrBrBRAvAXAvBRAvBRAX_____A_AAvBrBr_A ______________BrBRBrAv______BrBRBRAXAv__BRBrAvAX___A_A_AAvBRBR_A ____________BrAvBRAvAXBR____BRBrBRBRAX__BRBRAXBR_A_A_ABRAvBRBR_A __________BrBRAvAvAXBR____BRBrAvBRAXAv__AvBrBRAvAX_A_ABRAXBRAv_A ________BRBrBRAX__________BRBrBRAXAvAX_ABRBrBRAXAX_A_AByAXAvAvBR ______BRBrBRBR__________BRBrAvAXAvAX_A_A_ABRBrAvAX_A_ABy_ABy_ABy ____BRBrBrAvBR________BRBRBrAvBRAXAv_A_A_AAvBrBRAvAv_ABy_ABy_ABy __BRBrBrBRBrBR________BRBrBRBRAvAX_A_A_A_A_ABrBrAvAX_ABy_ABy_ABy __Br__BrAvBr__________AvBrBRAXAX_A_A_A_A_A_ABRBRBRAX_ABy_ABy__By __By__By__By__________AvBrBRAv_A_A_A_A_A_A_ABrBRBRAv_A_A_ABy__By __By__By__By_______A_ABRAvBRAX_A_A_A_A_A_A_ABRBrAvAvAv_A__By__By __By__By__By_______A_ABRAvBrAX_A_A_A_A_A_A_AAvBRAvAvAX_A__By__By ______By__By_____A_ABRBrBrBRAv_A_A_A_A_A_ABRAvBRAvAvAX_A__By____ ______By_________A_ABRBrBRBRAX_A_______A_ABRBRBRAvBR_A_A________ _________________A_A_A_A_A_A_A_A_________A_A_A_A_A_A_A__________ } # tile 224 (water troll) { _________________I_J_____i_J_HBR________________________________ _________________d_H_J_d_I_HAvAXBRAXBR___G______________________ ____________BR_ICfCf_I_JCfCf_IAvAXBR_I_i_I_G_i_I_G______________ __________BR___HCf_k_f_HCfCf_H_GBRAXBR_G_d_E_G_i_i_i____________ ____________Av_I_k_f_G_d_H_H_YAvAXBRAX_I_d_E_G_I_G_I_I__________ __________BRAX_k_fBNBNBNBN_d_H_GAvAXBR_d_G_G_E_G_E_G_i_G________ _____________k_f_G_Y_H_d_G_d_FAX_F_E_G_Y_G_F_d_d_Y_E_i_G_d______ _____________i_HAv_F_F_F_F_F_GAv_G_G_d_F_d_E_E_F_G_E_G_I_d______ ____________AX_HAv_G_F_G_G_F_G_G_F_Y_Y_G_U_G_U_Y_E_d_d_i_G_G____ _______________i_I_d_E_E_i_i_G_E_G_G_E_d_E_E_U_G_F_F_d_I_I_G____ _______________G_G_G_____G_E_I_E_G_Y_G_U_E_G_G_Y_E_Y_d_G_i_i____ _______________i_G_E_______G_i_G_E_Y_d_G_Y_Y_U_U_F_U_Y_F_G_I____ _______________i_d_E_______I_G_G_d_E_G_E_G_F_E_D___F_E_E_d_i_G__ _______________I_d_E_________Y_i_E_E_d_G_d_G_Y_E_______Y_d_I_G__ _______________I_G_E_________G_Y_d_G_d_E_G_U_U_F_______Y_G_i_G_G _______________G_i_G_E_______Y_i_G_d_F_d_Y_Y_E_U_______F_F_i_i_A _________________i_d_E_______E_I_G_Y_E_U_I_G_F_U_______A_Y_G_I_A _______________i_G_d_Y_______I_i_d_d_Y_G_d_G_E_Y_____A_A_Y_I_i_A _______________I_G_d_Y_______i_G_d_F_U___d_I_G_F___A_A_A_Y_i_G_A _____________I_E_G_Y_Y_G_____i_d_G_G_E___d_G_E_E_A_A_A_G_E_i_G_A ___________i_G_Y_E_Y_G_____G_I_d_G_Y_D___G_I_G_E_D_A_A_G_E_G_d_A _________G_i_G_G___________I_d_G_d_F_G_A_G_d_G_Y_E_A_A_f_F_F_G_G _______G_I_I_G___________G_i_F_F_F_U_A_A_A_i_I_G_U_A_A_f_A_f_A_f _____i_I_i_E_G_________G_i_I_d_G_Y_E_A_A_A_G_i_d_Y_G_A_f_A_f_A_f ___i_I_i_G_I_G_________G_I_d_Y_E_G_A_A_A_A_A_I_d_E_G_A_f_A_f_A_f ___I___i_G_I___________E_i_d_E_Y_A_A_A_A_A_A_G_i_F_E_A_f_A_f___f ___f___I___f___________E_i_G_E_A_A_A_A_A_A_A_i_G_F_E_A_A_A_f___f ___f___f___f_______A_A_d_d_G_U_A_A_A_A_A_A_A_i_G_F_E_G_A___f___f ___f___f___f_______A_A_G_d_G_Y_A_A_A_A_A_A_d_G_F_d_E_Y_A___f___f _______f___f_____A_A_i_i_I_G_E_A_A_A_A_A_G_G_A_d_F_d_d_A___f____ _______f_________A_G_G_A_G_A_G_A_______A_A_A_G_E_A_G_A_A________ _________________A_A_A_A_A_A_A_A_________A_A_A_A_A_A_A__________ } # tile 225 (Olog-hai) { ________________________________________BdBJBdAlAeBDAlBD________ ____________________________BdBdBdBdBJBdAlAj_A_MAlAeBJAeAe______ ______________________BdBdBdBJBdBdAjAlBDBJBd_A_A_ABDAlAe_AAe____ __________________BdBdBdBJAjAeAlBDAlBXAjAlBJBd_A_AClAe_A_AAeCl__ ____BSBsBsBs____BdBdBJAlBDAlBDAlBDAlAeBDBNBNAjBJClClBJAeAeClCl__ __BSBSBSBSBsBsBsBdAjAeAlBDAlBDAeAlBJBDAlBNBNBNBNClBNBNBNClCl____ __AwBSBSBSBSBSBsBsBJAlBDAeAeAeAeAeABAeAeBDBNBNClClBNBNClClAe____ __AwAwBSBSBSBSBSBsBiBDAeAeAeABAeAeAeAeABAeAlBNClBNBNBNClBN______ __AwAwAwBSBSBSBSBSBsBsAlAeBJAlAeAeAeAeAeAeBDAlABAeAeAeABAe______ ____AwAwAwBSBSBSBSBSBsBsBsAjBDAeABAeAeABAeABBDAeAeABAeBJAe______ ______AwAwAwAwBSClClBSBSBsBsAlAeAeAeAeAeAe____AeAlBDAlAjAe______ ________BdBdBdClClAwBSClBSBsBsABAeAeAeAB________BdBdBdBJAe______ ________BJBdBdBJAwAwClBSBSBSBSBsBsAeAeAB________BdBJBdAeAe______ ________BdBdAjAeAlClClAwClBSBSBSBsBsAeAe________BdBdBdAlAeAe____ ________BdBdBJAlBDAeAeAwClBSBSBSBSBsBsAeAe________BdBdBDAeAe____ __________BdAeAeAeAeClClAwAwBSBSBSBSBsBsBs________AjBdAlAeAe____ ______________AeAeAeABAeAeAwAwBSBSBSBSBsBsBs_____ABdBdBDAlAe_A__ __________BdBdBJAjBJAeAeAeAeAwAwAwBSBSBSBSBsBs_A_ABdBdAlBDAe_A_A __________BdAlBDAlBDAeAeAeBdBdAwAwAwAwBSBSBSBsBs_ABdBdBdAeAeAe_A ________BdBdBDAlAeAeABAe_A_ABdBdBdAwAwAwBSBSBSBSBsBdBJBdAjBJAe_A ________BdAlBDAlAeAeAeAe_A_A_ABJBdAlAwAwAwBSBSBSBsAlBdBdBdAlAe_A ______BdBdAlBDAeAeAeAe_A_A_A_ABdBdBdAjBJAwAwAwAwBSBdBdBdAlBDAeAe ______BdBdAeBJAeABAe_A_A_A_A_ABdBdBdBJAlAeAeAwAwAwClClBsBDAlBsCl ____BdBdBdBJAjAeAeAe_A_A_A_A_A_ABJBdAeBDAeABAeAwAwClClBSClClBsCl ____BdBJBdAlBDAeAeAe_A_A_A_A_A_ABdBdBdAlAeAeAeABClClAwAwAwClBSCl __BdBdBDBDAeAlAeAe_A_A_A_A_A_A_ABdBdBdBDAeAeAeAe_A_A_AAwClClAw__ __BdBdBdAjBJAjAeAe_A_A_A_A_A_A_ABdBdBdAlBDAeABAe_A_A_A_A_A_A_A__ _ABdBDBdAeAlBJAeAe_A_A_A_A_A_A_ABdAjBdAeAlAeABAe_A_A_A_A_A_A____ _ABdBdAlBDAlBDAeAeBd_A_A_A_A_A_ABdBdBdBDAlAeAeBd_A_A_A_A_A_A____ _A_ABdBDAlBDAlAeAeBdBd_A_A_A_A_A_ABdBJAlBDAeAeBdBd_A_A_A_A______ ___A_ABdBd_ABdBd_A_A_A_A_A_A_A_A_ABdBd_ABdBd_A_A_A_A_A__________ _____A_ABd_A_ABdBd_A_A_A_A_A_A_A_A_ABd_A_ABdBd_A_A______________ } # tile 226 (umber hulk) { ________________________CuCuCBBvBvBvBvBvBvBvBNCu________________ ______________________CuCuCBBNCBBvCuBNBvCuBNBvBNCu______________ __________________BvBvCuCBBNBNCBBvBNCBBvBNCBBvCBBN______________ ______________BWBWBWBvCBBNBNBNCBBvBvBvBvBvBvBvBNBN______________ ______________BWBWBWBvBvBNCBCBCVC$C$AqAqAqC$C$BNBvBv____________ ____________AzBWBWBWAzBvBvBvBWCVCmAqAqAqAqAqCmCVBvBvBW__________ ________CIBvBWBWBWBWAzAzBvBWBWCVC$C$BWBWBWC$C$CVBvBvBW__________ ____________AzBWBWBvAzAzBWBW_ACVCmBWBW_ABWBWCmCVAzBWBWBv________ ____________AzBWBWBvAzAzBWBWBWBWCVC$BWBWBWC$CVBWAzBWBWBvCf______ ________CIBvBWBWBWBvAbAzBWBWBWBWBWBWBWBWBWAzAzAzAzBWBWBv________ ____________AzBWBWBvAzAbAzAz_ABWBWBW_ABWAzAzAz__AzBWBWBv________ ____________AzBWBWBvAzAzBWBWAzAzAzAzAzAzAzAz____AzBWBWBvCf______ ________CIBvBWBWBWBvAbAbAzBWBWBWBWBWBWAzAz______AzBWBWBv_A_A_A__ ____________AzBWBWBWAzAzBWAz_ABWBW_ABWAz________AzBWBWBv_A_A_A_A ____________AzBWBWAzAzAzAzBWAzAzAzAzAzAz_______AAzBWAzBvCf_A_A_A ____________AzAzAzBvAzAzAbBWBWBWBWBWAz_______A_AAzAzBWAz_A_A_A_A ______________AzBWBWBvAzAzAz_ABW_AAzAz_____A_A_AAzAzBWBvBv_A_A_A ______________AzCIBWBWBvAzAzAzAzAzAz_A_A_A_A_A_AAzAzBWBWCfBv_A_A ____________BWBWAzBWBWBWBvAzAzAzAzBWBv_A_A_A_A_AAzAzBWBWBWBvBv_A ____________BWBvBWCIBWBWBvBvAzAzBWBWAzAz_A_A_A_AAzAzBWBWBWCfBv_A __________AzAzBvBWAzBWBWBWBvBvAzBWAzBWBvBv_A_A_A_AAzAzBWBWBWBvCf ________BWBWBvAzBvAzAzCfBWBWBvAzAzBWBWBWAzAz_A_A_AAzAzBWBWBWBWBv ________BWBWBWBvAzBWAzBvBWBWAzCPAzAzBWAzBvBv_A_A_AAzAzCPBWCPBWCP ______AzBWAzAzBWAzAzAzAzAzCPAzBdCPAzAzBWBWBWBW_A_A_ABdCPAzCPBdCP ____BvBWAzBWAzAzAz_AAzCPAzBdCPAzBdCPAzAzBWAzAz_A_A_ABdCPBdCPBdCP ____AzBWBWAzAzAz_A_A_ABdCP_ABdCPAzBdCPBWAzAzAz_A_A_ABdCPBdCPBdCP __BvBWAzAzAzAzAz_A_A_A_ABdCP_ABdCPBdCPBWAzAz_A_A_A_ABdCPBdCPBdCP __AzBWBWAzAzAz_A_A_A_A_A_ABdCPBdCPBdCPAzAzAz_A_A_ABdCP__BdCPBdCP __BvAzAzAzAz_A_A_A_A_A_A_ABdCPBdCPAzCPBWBW_A_A_A_ABdCPBdCPBdCP__ BWBWBWBWBWAz_A_A_A_A_A____BdCP__CPBWAzAzAzBWBW_A_ACP__BdCPBdCP__ BWBWBWBWAz_A_A_A_A__________CP____BWBWBWBWBWBW_A_A____CP__CP____ __AzAzAz_A_A_A_A__________________AzAzAzAzAz_A_A________________ } # tile 227 (vampire) { ________________________________________________________________ _____________________________M_________M________________________ ___________________________MAeAAAe_MA___________________________ ________________________AeA_BM_MA__MAe__________________________ ________________________AeBnBMBM_MAA_M__________________________ _________________________MASBMASBDAe____________________________ ______________________AO__BnBMBMAiABAO__________________________ ________________________BD__BMAiBdAOBk__________________________ ______________________ABBJBkCVCVAOBDBJAOAB______________________ ____________________ABAlAeBkCPCPAeBDAOAOAB______________________ __________________ABBDAOAOAOCPAeBDAeAOABABABAB__________________ ________________ABABBDBMBMBDAOBDAOAOABABAvABABAB________________ ______________ABAvAvBDBMBDAOAOAOAOABABAXAXAvABAB________________ __________ABABAvAvAXABABAEAOAOAOABBMBMAXAXAvAvAB________________ ________ABABAvAvAXAXAXABABABABABBMBDAvAvAXAXAvABAB______________ ______ABABABAvAXAXAXAXAvAXAOAOAOAOABAXAvAXAXAvABABAB____________ ____ABABABAvAvAXAXAXAvAOAeAOABAOAOABABAvAvAXAXAvABAB____________ __ABABABABAvAXAXAXAvAOAeAOABABAeAOAOABAvAvAXAXAvABAB____________ __ABABABABAXAXAXAvAvAeAOAOABABAeAOAOABAXAvAvAXAXABABAB__________ __ABABABABAXAXAXAvAOAeAOABABAvAeAOAOABAXAvAvAXAXABABAB__________ ____ABABAXAXAXAXAvAOAOAOABAXAvAeAOAOABAXAvAvAXAXABABABAB________ ____ABAB____AvAvAvAXAOAOABAvAvAeAOAOABAXAXAvAvAXABABABAB________ ______AB________AXAXAOAOABABAvAOAOABABAXAXAv____ABABABAB________ ______AB__________AXAXAOAOABAvAOABAB______________ABAB__________ ______________________AOAOABAvAOABABAB____________ABAB__________ ________________________AOAB__AOAOABAB____________ABAB__________ ________________________AOAO__AOAOABAB____________AB____________ __________________________AO__AOAOAB______________AB____________ ___________________________A_A_AAOAB_A_A_A_A_A__________________ _______________________A_A_A_A_AAB_A_A_A_A_A_A__________________ _____________________A_A_A_A_A_A_A_A_A_A_A______________________ _____________________A_A_A_A_A_A_A_A_A__________________________ } # tile 228 (vampire lord) { ________________________________________________________________ ________________________________________________________________ __________________________CLCLCLCL______________________________ ________________________CLBbBMBZCLCL____________________________ ________________________CLBnBMBMCLCLBZ__________________________ ______Bn____CP________CLCLASBMASAjCLCLCL________CPBnBn__________ ____BMBnBnCPCP________CPBZBnBMBMBdBbCPCLBZ____CPCPBnBM__________ ______BFCPBkBkCP________CPCLBMAiBDCPBk__CL__CPBkBkCP____________ ________CPBkBkBkCPCPCPBkCPBkBkBkCVBkCPCJBnBkBkBk__CP____________ ________CP__BkBkCPBkBkCPCPCPCJCVCPCPBkBlCJBkBk__________________ __________________BkBkBkCPCPCPCVCPBkBkBkBkBkAvAvAv______________ ________________AvAvAvAXBkBnCVCPCPBkBkAYAvAvAXAvAvAvAvAvAvAvAvAv ______________AvAvAvAXAXAXBkCVCPBkBkAvAXAXAvAXAXAXAvAvAvAvAvAvAv ____________AvAvAvAXAXAXBRBkCPCPBkBkAvAXAXAvAvAXAXAXAXAvAvAvAv__ ________AvAvAvAXAXAXAXAvAvBSCLCLBSBSAvAvAXAXAvAvAXAXAXAXAXAv____ ______AvAvAvAvAXAXAXAvAvAXAOAOAOAOABAXAvAvAXAXAvAvAvAXAXAXAX____ ____AvAvAvAvAXAXAXAXAvAOAeAOABAOAOABABAXAvAXAXAvAvAvAvAXAXAX____ __AvAvAvAXAXAXAXAvAvAOAeAOABABAeAOAOABAXAvAvAXAXAvAvAvAvAv______ __AvAvAvAXAXAXAvAvAvAeAOAOABABAeAOAOABAXAvAvAXAXAXAvAvAv________ ______AXAXAXAXAvAvAOAeAOABABAvAeAOAOABAXAvAvAvAXAXAXAv__________ ________AXAXAvAvAvAOAOAOABAXAvAeAOAOABAXAXAvAvAXAXAXAX__________ ____________AvAvAvAXAOAOABAvAvAeAOAOABAXAXAvAv__________________ ________________AXAXAOAOABABAvAOAOABABAXAXAv____________________ __________________AXAXAOAOABAvAOABAB____________________________ ______________________AOAOABAvAOABABAB__________________________ ________________________AOAB__AOAOABAB__________________________ ________________________AOAO__AOAOABAB__________________________ __________________________AO__AOAOAB____________________________ ___________________________A_A_AAOAB_A_A_A_A_A__________________ _______________________A_A_A_A_AAB_A_A_A_A_A_A__________________ _____________________A_A_A_A_A_A_A_A_A_A_A______________________ _____________________A_A_A_A_A_A_A_A_A__________________________ } # tile 229 (vampire mage) { ________________________________________________________________ ____________________________BD__________________________________ __________________________CPBDBDCPBD____________________________ ________________________CPBDBFBDBDBkCP__________________________ ______________________BDCPBMBMBMBDBDBD__________________________ ____________________BDCPBDASBMASBDBDBDCP________________________ ______________________ABASBnBMBMAiABBDBD________________________ ________________________BDASBMAiBDAOAu__________________________ ______________________AvBaBkCVCVAOBaAzAv________________________ ____________________AvBaAwBkCPCPAvAvBaAX________________________ ____________________AvBRAvAvCVAvAvAXAX_$Av______________________ __________________AvAvBNBaBaAvBaBaAXATAGAv______________________ __________________AvBRBNAvAvAvAvAXAXAXAGAX______________________ __________________AvAvAvAvAzAvAvAbAXAXAGAX______________________ __________________AvBRAvAzArArArAHAbAXAGAX______________________ __________________AvAvAvAzArArAXAHAbAGAGAX______________________ __________________AvBNAvAzArArAXAHAbAX_$AX______________________ __________________AvAvAvAzArArAXAHAbAXATAXAX____________________ __________________AvBRAzAzArArAXAHAbAbAXAGAv____________________ __________________AvAvAzAvArArBSAHAXAbAXAGAv____________________ __________________AvBNAzAvArArBSAHAXAbAXAGAv____________________ __________________AvBRAvAvArArBSAHAXAXATAGAv____________________ __________________AvAvAvAvAqAHAHAHAXAXATAG_$___A_A_A____________ __________________AvBNAvAvAqAvAGAXAXAXATAGAG_A_A_A_A____________ __________________AvBRAvAvAqAvAGAXAXAXATAGAG_A_A_A_A____________ ________________AvAvAvAvAqAvAOAGAXAXAXATAGAv_A_A_A_A____________ ________________AvBRAvAvAqAvAOAGAXAXAXATAGAv_A_A_A_A____________ ________________AvAvAvAvAqAv_MAGAXAXAXATAGAv_A_A_A______________ ______________AvAvBRAvAqAqAv_zAIAXAXAXATAG_$Av_A_A______________ ________________AvAvAvAqAvAvABAGAXAXAXAXAXAGAv_A________________ ____________________AvAvAvAvAOAGAvAXAv_A_A_A_A__________________ _____________________A_A_A_A_A_A_A_A_A_A_A______________________ } # tile 231 (barrow wight) { ____________________________CL____Cr____________________________ ____________________________Bb__CLCrCL__________________________ __________________________CLBvCUCLCpBb__________________________ ________________________BkAlBVBwCTCTCG__________________________ ________________________BkBDBVCjCjCTCj__________________________ ______________________BkAlBdBVCGBzCTCT__________________________ ___________________H_HBkBDBdAzBVBwCGBV_G_H______________________ _________________H_G_GBkAl_GAzBVAeAeAz_HBs_H____________________ _______________G_GBSBsBkBS_GAwBVBjCGAzBSBsBSBJ__________________ _______________H_HBsBSBSBsBsBSAwAwAwBSBsBSBdCm_______A_A_A______ _____________H_HBkCmBSBsBSBSCLBSAwBsCLBSBsCPBkAe___A_A_A_A_A____ _____________HBdBdBDCPBSBSBsBSBSAwBsBsBSBiBDCPBd_A_A_A_A_A_A_A__ ___________H_HBDCmBkBDBSAwBSCLBSAwBsCLBsBdBdAlBd_A_A_A_A_A_A_A_A ___________HBkCPBdAeBdAwAwBSAwBSAwBSBsAw_G_GCPCPBJ_A_A_A_A_A_A_A _________H_GBDBdCPAl_GAwBSAwBSBSBsBSBsAw_G_HAlBdBl_A_A_A_A_A_A_A _________H_GBkCPBJAB_GCrCLAvAvAwBSAwAwAv_G_HBdCOBk_A_A_A_A_A_A_A _________H_GBDBdBd_G_GCLCrAvAvBRCLCrBRAv_G_HAeAlCm_A_A_A_A_A_A__ _______H_G_HBkCPAe_GBZCLB_BSBZBRCLCLBRBd_G_HBdBVBV_A_A_A_A_A_A__ _______H_G_HBwBdBw_GCLB_BdBSBZBsBSBZBSAe_G_G_HCLBVBVCr_A_A_A____ _______H_G_HBVBtBVBZCLB_AeBsCLBsBSCLBSCV_G_G_HBVCLCr_A_A_A_A____ _______H_G_H_HBV_HCLBWABBkBsBZBSBsBZBsBJ_G_G_H_HCrCVCP_A_A______ _____H_G_H_G_H_HBZCLB_AjBJBSBZBsBSBZBSCVBJ_G_HCr_ABkCV_A_A______ _____H_G_H_G_H_HCLB_AeAOBkBsBZBSBSBZBsAlBk_G_G_H_H_ACVCP________ _____H_G_H_G_HBZCLB_BJBDBDBSCLBsBSCLBsBkBD_G_G_H_H_ABkCV________ ___H_H_G_H_G_HCLB__GAeAOBkBSBZBSBsBZBSAlBk_G_G_G_H_A_ACV________ ___H_H_H_H_GBZCLB__GAlBDBDAlBZBSBsBZCVBkBD_G_H_G_H_A__BdCP______ ___H_H___H__CLB__H_G_GABBkBkBdBDCmCPBkBD_A_G_H_A_H_A____CV______ ___H_H___G_______H_G__BsBSAw_A_A_AAwBSBs_A_G_A_A_H______BdCP____ ___G_____G_______G______BsBS_A_A_ABSBs_A_A_G_A_A_A________CV____ _________________G____BsBSAw_A_AAwAwBSBsBs_A_A_A__________BdCP__ ____________________BSAwAwAw_A_A__AwAwAwBS_A_A_A____________CV__ _____________________A_A_A_A_A_____A_A_A_A_A____________________ } # tile 232 (wraith) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________________BJAjBJAlAl____________________ ______________________________AlBDAlBDAlBDAlBD__________________ __________________________AlBDBDAjBJAlAlAlAlAlAl________________ ________________________AlBDBDBJAlBDAlAlAlAeAlAlAl______________ ________________________AlBDBkBkBlAlAlAlAeAe____________________ ________________________BJAeAeC$AeAlBJAlAeAe____AlBJAj__________ ______________________AlAjCVAeCoAeBkAlAlAlAeAlAlBDBDBDBJAlAl____ __________BJAjBJAlBDAl__BJAOCoCVCVCVBkAlAlAlAlAlBDBDBDAlAO__Al__ ________BDAlBDBDBDBDBJBDAlAlCVBlBkCoAeCVCVAlAlAlAlAlBDCVCVAl____ ______AlAlBDBDAlBDAlAjAlAlAeAlCoC$AlAlAlAlCVAlAlAlBDCVCVAlCVAlAl ______CVCVCVAlBJAlAlAlAlAlCVAeAeAeBJCVCoCoAeAeAeAeCVAOCVAOAOCV__ ____CVAlAlCVAOAjAlAlAlAeAeCVCVCVCoBDAlAeAeBdCVAlAeAOAOCVAOBJAl__ ______CV__CVAOAOAlAlAeAeCVAeAeAeAeBDCoCoCoCoAeAeAeAeAOAOAOAj____ ____CV____CVAOAOAOAlAlAeAeCoCoCoCoBdAlBDAeAeCVAe__AeAOAOAlBJ____ __________AOAOAOAOAOAlAeAeAeAeAeAeAeCoCoCoCoAe__AeAeAeAOBDAl____ ____________AOAOAOAO__AeAeAeAeCoCVBdBJBdAeAeCVAeAe__Ae__AlAl____ ______________AOAOAOAO__AlAeCVAeAeAeAeCoCoCoAeAeAe______AlAl____ ______________AOAOAOAOAl____AeCVCoCoCVAeBkAeAeAeAeAe______Al____ ________________AOAOAO________AeAe__AeAeCVBkAeAe__________Al____ __________________AOAO__________Ae__AeAe__CVAe__AeAe____________ ____________________AO__________Ae__AeAeAeBkAeAe__Ae____________ ____________________AO____________Ae__AeAeAeCV__Ae______________ ____________________AO________________Ae____Bk__________________ ____________________________________________AeCV_A_A_A_A_A_A____ _______________________________________A_A_AAe_ACV_A_A_A_A_A_A_A ___________________________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A _________________________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A _________________________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A__ ___________________________________A_A_A_A_A_A_A_A_A_A_A_A______ } # tile 233 (Nazgul) { ______________________________CV________________________________ ________________CVCV________CVCPBd________CVCP__________________ ____________________CP______CVBnBd______CV______________________ ______________________BkCPBkCPCJBkBdCJCP________________________ __________________________CVBnBkBkBd____________________________ __________________________CVCJBkBkBd____________________________ __________________________BDCZAiCZAS____________________________ __________________________BMBMAiBdAS____________________________ __________________________BMBdAiAS_MAO__________________________ ________________________AOAOAiAjASABAOCL________________________ ________________________AO_MAOAOAOAOCLCL_B______________________ ______________________ABAOA_AOAAAO_MAO_zAB_M____________________ ____________________AOAO_MAO_MA_AOAOAOABAB_M____________________ ____________________AO_MA_AA_MAOABAOAOAeABAK_M__________________ __________________AB_MAKAO_MABAOABAOAOAlABABAB__________________ ________________ABAAAO_MAOABAOAOABAOAOAlAeAB_z__________________ _________________MAOAOABAO_z_MAOABAOAeAeAlAB_O_M________________ _______________MABAO_zAO_MAOABAK_MAO_MAeAlAeABAA________________ _____________MAKABABABAO_MAO_MABABAOABAeAlAeABAB_________A_A_A__ ____________ABAB_MAOABA_ABAAAOAK_MAO_$_MAeAlBFCLAB___A_A_A_A_A__ ___________MAOAO_zAB_MAOAB_MABAB_MABAO_MAeBMCLBkAB_A_A_A_A_A_A__ _________zAOAO_MAOABAAAO_MA_AB_zAOAOAOAB_zCLBkCPAB_A_A_A_A_A_A__ _______MAeAO_zAeAOAB_MABAAAOAB_OAOAeAO_z_M_BABCPBk_B_A_A_A_A____ _____MAOAO_MAOAOABA_AOAB_MAOABAAAOAeAO_MAB_zABBkCP_A_A_A_A_A____ ___MAOAOAAAOAOAO_M_MAOABA_AOAB_MAOAeAO_zAB_MABABCPBk_z_A_A_A____ __AOAOAOAOAOAOABA_AAAO_MAOAB_MA_AOAeAe_M_M_$_MABBkCV_A_A_A_A____ __AOAOA_AOABAO_M_M_MAOAKAOABAAABAOAeAeAB_zAB_MABAOCPBk_A_A______ _____MAOAOABAO_MAKAOAB_MAOAB_MAOAOAeAe_z_O_zABABABBkCP_A_A______ ________AOAO_MAK_MAO_zABAOAB_MAOAOAeAeAB_M_z_MAB_z_MCPBk_z______ _____________z_M_zAOABABAOABABAOAeAeAe_z_M_z_A_A_A__BkCV_A______ _______________A_A_A_MABAOAB_zAOAeAeAB_A_z_A__________CP_A______ _____________________A_A_A_A_A_A_A_A_A_A_______________A_A______ } # tile 234 (xorn) { CP______________________________________________________________ CPCP____________________________CMCMBy__________AeAeAeAO________ BkCPCP______AeAeAeAeAe________CMCMByByBa____AeAeAOAOAOAOAO______ __BkCPCPAeAOAOAOAOAeAeAeAeAeAeAeAeByAeAeAeAeAeAeAOABABABAOAO____ ____BkAOAOABABABABAOAeAeAeAeAeAeAeAeAeAeAlAeAeAOAB_____M_MAOAO__ ______ABABAB______ABAeAlBoCVBoBoBoCVBoBoCVAlAeAO________AK_MAO__ __________________CMAlCVBoBNBNBNBNBNBNBoBoBoAlCM___________MAO__ ________________CMCMBaAlBNBNAqAqAqAqAqCVBNAlCMByBy________ABBk__ ________________CMByBaBaAlCVAqAqCVAqAqAlAOAlCMBaBa________BdBk__ ________________ByBaBaByAeAlAlAlAeAlAeAlAOAlBaBaBy________BdCP__ ________________BDByByAlAlAeAeAeAOABAeAeAlAeAOByAO________BdBk__ ________________BJBDAlAlAOAOAOAOABABAeAOAeABAeAlAB_____A_ABdBk_A ________________AlAlAlAOAOAOABABAOAOAeAOAlAeABAOAB_A_A_A_ABd_A_A __________________AOAOAOABABAeAeAOAOAOAOAeAOABAOAB_A_A_ABd_A_A_A ________________AOAOAOABABAeAOAeAlAeAOAlABAOABABAB_A_A_A_A_A_A_A ______________AOAOAOABAOBJAlAeAOAeAeAOAOAOABAOAB_A_A_A_A_A_A_A_A ________CPAOAOAOAOABAlAlAeAlAeAOAOAOAOAlABAeAOAO_A_A_A_A_A_A_A_A ____CPCPCPBkBkABAB__BJAjAeAeAeAOAlAeAOAlAOAOABAB_A_A_A_A_A_A_A_A CPCPBkBkBk__________AlAlAlAOAOAOAeAeAeAOAeABAeAB_A_A_A_A_A_A_A_A ____________________AlAlAlAeAlAeAOAOAOAeAOABAOAO_A_A_A_A_A_A_A_A __________________BDAlAlAlAOAeAeAOAlAeAOAlAOABAOAB_A_A_A_A_A_A_A __________________AlAeAlAeBJAOAOAeAeAeAOAeAeAOABAB_A_A_A_A_A_A_A ________________BJAeAjAeAeAOAeAeAeAOAOAeAOAOABAOAB_A_A_A_A_A_A_A ________________AlAlAlAOAeAeAeAOAOABABAOAeAeAeAOABAB_A_A_A_A_A_A ________________AlAlAeAeAOAOAOABABAeAO_MAOAOAeAlAOABAB_A_A_A_A_A ______________BDBDAOAeABAOABABAOAO_MAAAO_MAOAOAeAOABAOAB_A_A_A_A ____________BDAlAOAeAeAOABAOABABABABABABABABAOABAeAOABAO_A_A_A__ ____________AlAeAeAOABAO_A_A_A_MABABABA__AABABAOABAeAOABAB_A_A__ __________BJAjABABAOAO_A_A_A_A_A_MAA_M_A_A_A_A_AABAOABAOAeAO_A__ ________AlAeABAOAO_A_A_A_A_A_A_A_AA__A_A_A_A_A_A_A_AAOAOAeAe_A__ ________AeAOABAO_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_AAOAO_A____ _________A_A_A_A_A_A_A_A_A_A___________________A_A_A_A_A_A______ } # tile 236 (ape) { ________________________________________________________________ ________________________________________________________________ ______Ci__Cn____________________________________________________ ______CiCnCi________________________________________CGCnCi______ ______CnCiCnCiCnCr________________________________CFCnCnCrCn____ ______CFCnCnCnCr__________________________________CFCdCiCiCi____ ______BtBsCFBsBS__________________________________CFCACiCn______ ________BsBsBrBS__________________________________CFBsCABs______ ________BsBsBsBS__________________________________CFBsBsBS______ ________BsBsBsBsBS________________________________CFBsBsBR______ ________BsBsBsBsBS________________BsBsBsBs______CFBsBsBsBS______ ________CzBsBsBsBsBS____________CFBsBsCUCUCU____CFBsBsBsBS______ __________CzBsBsBsBSBS________CFBsBsCU_ACU_ACU__CFBsBsBsBS______ __________CzBsBsBsBsBSBS__BSCFBsBsBsCUCUCUCU_ACUCUCUBsBsBS______ ____________CzBsBsBsBsBSBSCFCFBsBsBsBZCUCUCUCUCU_A_ABsBsBS______ ______________CzBsBsBsBsBsCFCFBsBsBsBZBZCUCU_A_zCnCiBsBsBS______ ______________CzCFBsBsBsBsBsCFBsBsBsBZBZCUCiCnCiCiCABsBSBS______ ________________CFBSBSBsBsBsBsBsBsBsBZBZBZCnCiCnBZBsBSBS________ ________________CFCFBSBsBsBsBsBsBsBsBSBZBZBZBZBZBZBiBS__________ __________________BsCFBSBsBsBsBsBsBsBsBiBZBZBZBZBS______________ ____________________CFBSBsBsBsBsBsBsBSBSBSBiBSBi________________ __________________BXCFBsBsBsBsBsBsBSBSBSBSBSBSBS________________ __________________BsAwAwBsBsBsBsBsBSBSBSBSBSBSBSAxBsBs__________ ________________BsBsBsAwAqBsBsBsBSBSBSBSBSBSBSBSBrBsBsBs________ ________________BsBSBsBsAwBsBsBsBSBSBSBSBSBSBSAwBsBsBsBs________ ________________CFBrBsBsBsAwBsBsBSBSBSBSBSBSAwBsBsBsBs__________ __________________CFBrBsBsAwBsBsBSBSBSBSBSBSAwBsBsBsBs__________ ____________________CFBrBsBsAwBsBsBSBSBSBSAwBSBsBsBs____________ ____________________BZCFBrBsBsAwBsAqBSBSAwBSBsCF________________ ________________________BsBsCACiCr________CLCrCrClCl____________ ______________________CiCnCiCnCr________________________________ ______________________Cr________________________________________ } # tile 237 (owlbear) { ______________________________________CF____________CfCjCjCj____ ____________________CF______________CFBy______________Cf__CjCjCj ____________________CFBsBsBsBsBsBsCFCFBy______________CjBrCj__Cj ____________________CFBsBsBsBsBsBsBSAxBy____________CfBSCABi__Cj ____________________BSBSBsBsBsBSBSBSBSAx______________CFBsBrBsCj ____________________BSBSBSBSBSBSC$C$BSBSAw__________CFBsBsBsBsBi ____________________BSC$C$BsBsC$C$C$BSBSAw__________CFBsBsBsBSBS ____________________BSC$_zCjCj_A_AC$BsBSBSAw______CFBsBsBsBsBS__ ______________CFCFBsBSC$_ACjCjAABsBsBsBsBsBsBsCFCFBsBsBsBsBSCL__ ____________CFBsBsBsBsBsCcCjCFBtBsBsBsBsBsBsBsBsBsBsBsBsBSCLBb__ __________CFBsBsBsBsBsBsCFCFCFBsBsBsBsCjBsBtBsBsBsBsBSBSBZBZCL__ ________CFBsBsBsBSBSBiCjBsCFCFBsCFCjCjCjBsBsBsBsBsBSB_BZBZCLCL__ ______CFBsBsBsBSBSBSBSBiCjCcCLCjCjCjCFCFBsBsBsBsBSB_BZBZBZBZCL__ ____CFBsBsBsBSBZB_AwAwBiCjCLCUCjCUCFBsBsBsBsBSBSB_B_BZBZBZCL____ __CFCFBsBsBsBSBZBZB_BSBSCLCLCLCLCLCFBsCjCFBsBSB_B_BZBZBZCLBZ____ __CFBsBsBsBiBbCLBZBZB_CjCLCLCLCLCUCjCjBsBsBSBSB_BZBZBZBZCL______ __CFBsBsBSCLBvCLBbBZBZBiCjCLCLCLCjCjCFBsBsBSBSBZBZBZCLCL________ CjCFCfBsCf______BvCLBZBSCLCjCUCjCLCcBsBsBsBSBSBZBZCLBZ__________ Cf__Cj____Cf______CLBbBiCLCLCLCLCcCjBsBsBsBsBSAwCLBZ____________ __Cf__Cf____________CLBSBsCjCUCjCjCFBsBsBsBsBSAwAvCL____________ ______________________BbCABsCjCcCcBSBsBsBSBsBSAwAwAw____________ ______________________BzBSBiBsCF_NBsAwAwBsBsBsBsAwAw____________ ______________________BsBSBsBsBsAwAwAwBsBsBsBsBsAwAw___A_A______ ______________________CFBsBsBsBsAwAwBsBsBsBsBsBsAwAw_A_A_A______ ______________________CFBsBsBsBsBSAwBsBsBsBsBsBsAw_A_A_A_A______ ______________________CFBsBsBsBSBSAwCFBsBsBsBsBS_A_A_A_A________ ________________________BsBsBsBS_A____CFBsBsBS_A_A_A_A_A________ ___________________A_A_A_ABsBsBS_A_A_A_ACFBsBS_A_A_A_A_A_A_A_A_A _______________________A_A_ABsBS_A_A_A_A_ACFBsCzCzCj_z_A_A_A_A__ ____________________________CzCz_A_A_A_A_A_A_ACzCz_L_A__________ ______________________CzCzCzCzCzCj_z_A_A_A_ACzCzCj_z____________ ____________________Cj____Cj_A_L_z_L_A_A__CjCz_z_L______________ } # tile 241 (kobold zombie) { ____________________________Bj__________________________________ __________________CJBj______BjBj________________________________ ____________________BJBkBj__BjCJAq______________________________ ____________________AqBJBJBjBjAABjBJ____________________________ ______________________CJAq_A_ABk_A_A____________________________ ______________________BJBj_A_ABj_A_A____________________________ ________________________BjBjBjBjCJBjCJ__________________________ ________________________BJBj_ABjBjBJBc__________________________ __________________________BJBj_A_A_A____________________________ ________________________CJBjAqBJBjBjBj__________________________ ____________________CJBjAuAqBjBJAYAYBjBj________________________ __________________BkAuCJAqBjAABjAYAYBjAAAq______________________ __________________AqBjBkBjAqAABjAYAYBJAqBj______________________ ________________CJBjBJAuAqAABJAYAYBJAYBJBjAA____________________ ________________AABJBJAqBjBjBJAwBJAYAYBJAqBj____________________ ______________BkBjAq__CJBJBJAwAYBJAYAY__BJAq____________________ ______________AqBJAq__BjAwAwAYAwAYAYAY__BJAqBj__________________ ______________AqBJ____AzAYAwAwBJAYAYAYAYBJBJBj_____A_A_A________ ______________BjBJ____AwAYAwAwBJAYAYAYAY__BjBj_A_A_A_A_A________ ______________BjAq__AwAYAwBjAwBJAYAYAYAY__AqAA_A_A_A_A__________ ______________BjBJ__AwAYBjAwAwAYAYBJAYAY__BJAq_A_A_A_A__________ ____________________AwAwBjAYAYAYBJAYAA___A_A_A_A_A_A_A__________ ______________________AwAwBJAYAYBJAYBJ_A_A_A_A_A_A______________ ______________________CJBjBJ____AABJAq_A_A_A_A_A________________ ______________________BjAuBJ___ABjBjBJ_A_A_A_A__________________ ______________________AqBJAA_A_ABjAABJ_A_A_A_A__________________ ______________________AqBjBJ_A_AAqBjAq_A_A_A____________________ ______________________BkAABJ_A_AAABjBJ_A_A______________________ ______________________CTAABJ_A_ABjBjAq_A________________________ _____________________LBkBjBJ_A_ABjAABJ_A________________________ _______________________A_A_A_A___A_A_A__________________________ ________________________________________________________________ } # tile 242 (gnome zombie) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ___________________________c_c_c________________________________ _______________________c_c_c_c_c_X______________________________ _____________________c_c_X_X_X_X_X_X____________________________ ___________________c_XBJBjBJ_X_X_X_X_X__________________________ ___________________XBJBjBJAqBJBJ_X_X_X__________________________ __________________BJ_A_AAqBj_A_ABJ___X_X________________________ __________________CP_A_ACJBJ_A_ACP___X_XAqAq____________________ __________________CPBjCJAuBjBJBjCV_____XAqAq_A_A_A_A_A__________ ________________BkBJCTBkBjBjBJCPBJCJ_____A_A_A_A_A_A_A_A________ ______________AqBjBJCPCPBJCPCVBjBk_c_X_A_A_A_A_A_A_A_A_A________ ______________BjBjAuCP_cCV_cCPCJ_c_XBj_A_A_A_A_A_A___A_A_A______ ____________CJAABj_cBJ_cCP_cBj_c_XBJAqBJ_A_A_A_A_A_______A______ ____________BkAqBJ_c_c_cCP_c_c_X_X_ABJBj_A_A_A_A_A_A____________ __________CJAuBJ___c_c_X_c_c_X_X_A_ABJAqBj_A_A_A_A_A____________ ________AqBjBJ_____c_c_X_c_X_X_X_A_A_ABJBjAq_A___A_A____________ ________BjBJ_______c_c_X_c_X_X_X_X_A_A_AAq_A_____A_A____________ ___________________c_cAq_c_A_X_X_X_A_A_A_A_______A______________ __________________CJBJAq_X_A_XBJAq_A_A_A_A______________________ __________________AqBJAq_A_A_XAqBJBJ_A_A_A______________________ ________________AqAqBJ_A_A_A_AAqAYBJAq_A_A______________________ ____________AqBJBJBJ_A_A_A_A_A_ABJAqBJBJ_A______________________ ____________AqBJAq_A_A_A_______A_AAYAYAq_A______________________ _____________A_A_A_A_____________A_A_A_A________________________ } # tile 243 (orc zombie) { ________________________________________________________________ ________________________________________________________________ ______________________________________BjBj______________________ ____________________BkCTBkCJ________BjBj________________________ ______________________BJBJBJBjCJBjBjBJBJ________________________ ________________________CJBJBjBmCJBRBjBJBJ______________________ ________________________BzCJBkCTBjBjCJBjBJ______________________ ________________________BRCOBjAOBjBjAOAOBj______________________ ________________________BjBcAOAOCJBjADAOBJ__Cm__________________ ________________________CJBkCTBkBjCmCmBjBJCmCm__________________ ________________________BjBjBSBRCmCmBRBRCmCm____________________ __________________________BkCJBjCJBJBjBJBJBJ____________________ ________________________BaCTBWBjBjBjBsBJBjBV____________________ ______________________AcAgAzBjBjBjBJBJBVBV______________________ ____________________AzAzCJBkBWAgBVBVAcAcCJ______________________ __________________BWAgCJBSBjBJAcAzAcAcBRBjBcCJ__________________ __________________AzAzAcBjBsBjBWAcAcAcBJBsBjBsBk________________ __________________AzAQBJCJBsBJBJAcAz_AAcBJBjBJCT________________ __________________AzAcAzAuBjBjBJAcAc_L_A__BJBjBjBk______________ ________________BWAzAwAwAgCJBiBcAzAw_A_A___LBRBjBR______________ ________________AgAcAzAcAwCJBJBJAzAw_A_A_A_ABJBJBR_A_A_A________ ________________AzAcAgAcBWBjBjBJAcAzAc_A_A_A_ABJ_A_A_A_A_A______ ________________BWAzAcAzAQAzBSBjAcAzAc_A_A_A_A_A_A_A_A_A_A______ ______________AzAgBjBJAcAcAzAcAcBJAgAc_A_A_A_A_A_A_A_A_A________ ________________BjCJBJAc_L_LAcBJCJBJ_A_A_A_A_A_A_A_A_A__________ ________________BJBjBjAc_A_A_ABjAwCJ_A_A_A_A_A_A_A______________ ________________CJAwBj_A_A_A_ABJAqBj_A_A_A_A_A_A________________ ________________AuBjBj_A_A_A_A_ABJBjBj_A_A_A____________________ _______________ABkBjAwBj_A_A_A_ABjBJBJBJ_A______________________ _______________ABJCJBJBj_A_A___A_ABjBJ_A_A______________________ _________________ABJAqBJ_A_______A_A_A_A________________________ ___________________A_A_A_A______________________________________ } # tile 245 (elf zombie) { __________________________________BfBf__________________________ ______________________________BfBfBfBfBfBG______________________ ____________________________BfBfBfBGBGBGBGBG____________________ __________________________BfBfBfBGBGBGBGAnBGBG__________________ ________________________BfCtCtCsCtBGAn______An__________________ ________________________CkCsBWBWCtCkBG____BL____________________ ______________________CfCfBvCICIBvBWCkBLBL______________________ __C$________________CjCIBvCIBDCICIBvBLAoBD______________________ __C$__________________Bv__AoBDBvAoCIBDAj________________________ __C$Bk____________________AjBLBDBLBb____________________________ __CmC$Bk____________________BLBLBbBbBfBG________________________ ____C$Bn________________BfBf_mBb_mBfBfBGBG______________________ ____CmC$______________BfBGBfBf_mBfBfBG_l_h____CmCP______________ ______C$Bk_______________lBfCIBfCIBfAn_m_m_h__Cm_bCP____________ ______CmC$_____________m_mAnBfCIBfBGBG_l_m_mC$_b_b_b_a__________ ________C$Bk___k_____m_m_lBGCIBGCIBGBG___h_mC$_f_bCP_a__________ ________CmBk_k_b__Cf_m_h__BGBGBGBGAnAn____CIC$_f_bCP_a__________ ___________k_bCjCICIBv_____AAnBGAn_A_A____C$_f_fCmCP_a__________ _________k_bCfCICIBv______Bf_A_A_ABGBG____C$_f_fCm_b_a__________ ____________CICIBv_b____BfBfBfBGBGBGAnBG__C$_f_f_f_b_a__________ _________________k_b____BfBGBGBGAnBGAn______C$_f_f_b_a__________ __________________________CVBGAnBGAnCm______C$_f_f_b_a__________ ________________________C$CmCm__CPC$CmCP______Cm_f_b_a__________ ________________________C$CmCP__CPC$CmCP________Cm_bCP__________ ________________________CmCmCP____CmCmCP__________CP____________ ______________________CjCfCIBv____CjCfCI________________________ ______________________CfCfBvCI____CfCfBvCI_______A_A_A_A_A_A_A__ ________________________BvCICI______BvCICI_A_A_A_A_A_A_A_A_A_A__ ________________________CICIBv___A_ACICICI_A_A_A_A_A_A_A_A______ ________________________CfCfCI_A_zCfCfCfCI_A_A_A_A_A___A________ ______________________CfCICIBv_A_ACfCICI_A_A_A_A_____A_A________ _________________________z_A_A_A___A_z_A_A_A____________________ } # tile 246 (human zombie) { _________________________A_A_A_ACBCi____________________________ _______________________A_A_A_ACBCBCYCn__________________________ _____________________A___ACB_hCBCB_A_A__________________________ ________________________CBBGBfCB_h_A_A_A________________________ _________________________ABf_A_ABG_h_A_A________________________ ________________________BGAnBfCBAn_A_A__________________________ ________________________An_L_ACBBG_A_A__________________________ ___________________________h_A_A_h_ABsBs________________________ ______________________CBCzCz_hCB_hCFCFCFBs______________________ ____________________CBCzCFCFCF_hCFCuCuCFCFBs____________________ __________________CzCFCFCFCFCFCuCuCBCBCFCFCF____________________ ______________CzCzCFCFBsCBCFCuCBCBCFCFBsCFCFCFBs________________ ____________CzCzCFCFBsCBCzCuCBCFCBCFCFBsBsCzCFBsBs______________ ________CzCzCFCFCFBs__BsCFCFCFCFCBCFBsBsCzCzCFCFBs______________ ____BfBfBfBGCABsBs____BsBsCFCFCFCBBsBsCzCzCFCFBs________________ __BfBf__BfAnBGBs______BsC$CiCBCBBsBsBfAnBGBsBs__________________ ________Bf__Bf________CiCBCYCnCFBsBfBfBfAnBG____________________ ____________________CnCdCYCiCiCBBsBfBsBf__Bf_______A_A_A_A______ __________________CiCdCBCnCYC$CnBM_kBMBs_________A_A_A_A_A_A____ __________________Cn___kCi_kCi___k_kBMBM_A_A___A_A_A_A_A_A_A____ __________________Ci_kBM_k_kCn__BM_kBM_k_A_A_A_A_A_A_A_A_A______ __________________CdBM_k_kBkCi_ABMBM_kBM_A_A_A_A_A_A_A_A________ ________________CnCd_k_kBMBMCi_z_kBM_k_k_A_A_A_A_A_A_A_A_A______ ________________Cd___kBM_k_zCd_A_kBM_k_A_A_A_A_A_A_A_A_A_A_A____ ____________________BMBMBM_A_A_ABM_k_kBM_A_A_A_A_A_A___A_A_A____ ____________________BMBM_k_A_A_A_ABMBMBM_A_A_A_A_A_A_A_A_A______ _____________________kBM_kBM_A_A_ABMBM_kBM_A_A_A___A_A_A________ _____________________k_kBMBM_A_A_A_kBMBMBM_A_A_A________________ ____________________CcCcBSBM_A_A_A_ACcCcBSBS_A_A________________ __________________CcCcBSBSBS_A_A_ACcCcBSBS_A_A__________________ _____________________A_A_A_A_A_A_A_A_A_A_A______________________ ________________________________________________________________ } # tile 247 (ettin zombie) { ___________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A__________________ _________A_A_AAYBjCJBjBJ_A_A_A_AAYBjCJBjBJ_A_A_A_A______________ _______A_A_ABjBjBjBjAqBJCJ_A_ABjBjBjBjAqBJCJ_A_A_A_A____________ _______A_ABj_A_A_AAq_A_ABJ_ABJ_A_A_AAq_A_ABJBJ_A_A___A_A________ _____A_A_AAY_A_A_ABj_A_A_ABJBJ_A_A_ABj_A_A_ABJ_A_A_A_____A_A____ ___A_A_A_ABkCJAYBjBjAqBJBjBJBJCJAYBjBjAqBJBjBJ_A_A___A_A________ ___A___A_AAqBjBj_A_A_ABjBJAqBJBjBj_A_A_ABjBJ_A_A_A_A_____A______ _______A_A_AAq_A_A_A_A_ABJBJBJAq_A_A_A_A_ABj_A_A_A_A_A__________ _______A_A__CJAqBJBJBJBJBJBjBjBJBJAqBJBJBjBjAqBjBj_____A________ _____A_A__BkAuBkAABJBJBjAYAqAqBJAqBJBJAqBjBjBjAqAqBj____________ ________CJCTBkCTAABjAqBjBjBJBJBjBJAqCJBjBjAqBjBjCJAqBj__________ ______BkAuBJBjAqBjBjAqAYBjBJBjCJBjCJALBjAqAqAqBjCTBkBjAA________ ____CJBJBJBJBkCTBkBjAqAYAAAqBjBkAvAqAYBjAABJBjBjBkAABjBjAq______ ____AqBjBJBcBjCOAABkAAAAAAAqBjBJAqAqBjBjBjBJAqBJCJAABkCJAq______ __AABjBJBJAAAqCJ_NBjAY_zBjBjBJCJAuBjBjAqBJBJBJBJAuBjCTBjAq______ __BkBJAqBjAABJCJAqAqBjBjAqBJBjBJBjBjBjBjAYBJBJBJAqAqBj_QBjBJ____ __CJBjAqBjBJBJ__BjBjBjBjBJAqBjBJBjAqAABjAYBJ__BJBJAqBjAABjBJ____ __BjAqAABJBJ_N__COCJAYAABjBjBjAABjAqBJBJBJBJ____BJBJBjBjAqBJ____ __BjBkAABJAA______BjAbAYBjAwBjAqBJBJAYAwAw________BJAqBjBJBJ____ __BjCJBjBJBJBJ__AwAYAwAwAAAwAYBJAYBJAAAYAw________CJBJBjBJBJ____ __BjBjAqBjBJBJBJAwAYAwAwAwAwAYAYAYAYAwAYAw______BkAuBkBjAqBJ____ __BjAqAqBjBjAqAqAwAYAwAwAwAwAYAwAwAYAwAYAYAA___ACTBjBjCJAqBJ_A_A __CJBjBJAqBjBjBJAwAYAwAYAYAYAYAYAwAwAwAYAYAA_NBJBkAAAqBjBJBJ_A_A __BmCJAABjBjBjBJAwAwAwAYAAAAAAAYAYAwAYAwAY_NAACTCJBjBjCJBJ_A_A_A ____BjAACJBJBjAqBJAwAYAY_z_A_A_AAwAwAYAwAYCJBkBkAuBjBkBbBJ_A_A_A ______CTBkBjBjBJAqAYAYAAAA_A_A_AAYAYAwAwAYBjBzCJAACJAqBJ_A_A_A_A ________CJAuBJBJBJAYAYAA_A_A_A_A_AAYAYAYAYBjAuBjBjAqBJBJ_A_A_A_A ________BjBjBJBJBJAYAJAA_A_A_A_A_AAAAYAwAYBjBJBjBjBJBJ_A_A_A_A_A _____A_A_ABJBJAwAwAYBJAA_A_A_A_A_AAAAYBjAYAYBJBJBJBJ_A_A_A_A_A__ ___A_A_A_A_AAYAwBjAYBJAY_A_A_A_A_AAABjBjAwAYAY_A_A_A_A_A_A_A_A__ ___A_A_A_A_ABjBjBjBJBJ_A_A_A_A_A_A_ABjBjBjBJBJ_A_A_A_A_A_A_A_A__ _____A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A____ } # tile 248 (giant zombie) { _____________________A_A_A_A_A_A_A_A_A_A________________________ _________________A_A_A_AAYBjCJBjBJ_A_A_A_A_A_A__________________ _____________A_A_A_A_ABjBjBjBjAqBJCJ_A_A_A_A_A_A________________ ___________A___A_A_ABj_A_A_AAq_A_ABJBJ_A_A_A_____A_A____________ _______________A_A_AAY_A_A_ABj_A_A_ABJ_A_A_A_A__________________ ___________A_A___A_ABkCJAYBjBjAqBJBjBJ_A_A_A_A_A_A_A____________ _______________A_A_AAqBjBj_A_A_ABjBJAq_A_A_A_A__________________ ___________A_A_A_A_ACJAq_A_A_A_A_ABjBJ_A_A___A_A_A______________ _________A__CJAqBkCTBJBkBjBjBJBJBJAqBJCJBjBjAqBjBj______________ __________CJAXCJAABjCOBjAYAqAqBjAqBJBkAqBjBjBjAqAqBj____________ ________BkCTBkCT_TBjAqBjBjBjBJBjBJAqCTBjBjAqBjBjCJAqBj__________ ______CJAuBJBjAqBjBjAqAYBjBJBjCTBkCJALBjAqAqAqBjCTBkBjAA________ ____BkBJBJBJBkCTBkBjAqAYAAAqBjBkAuAuAYBjAABJBjBjBkAABjBjAq______ ____AuBjBJBJCTBmAACJAAAAAAAqBjBJAqAqBjBjBjBJAqBJCJAABkCJAq______ __AABjBJBJAAAqCJ_NBjAY_LBjBjBJCJAqBjBjAqBJBJBJBJAuBjCTBjAq______ __CJBJAqBjAABJBkAqAqBjBjAqBJBjBJBjBjBjBjAYBJBJBJAqAqBj_QBjBJ____ __BkBjAqBjBJBJ__CTBjBjBjBJAqBjBJBjAqAABjAYBJ__BJBJAqBjAABjBJ____ __BjAqAABJBJAA__CJBkAYAABjBjBjAABjAqBJBJBJBJ____BJBJBjBjAqBJ____ __BjCJ_NBJAA______BzAYAYBjAwBjAqBJBJAYAwAw________BJAqBjBJBJ____ __BjBkBjBJBJBJ__AwAYAwAwAAAwAYBJAYBJAAAYAw________CJBJBjBJBJ____ __BjBjAqBjBJBJBJAwAYAwAwAwAwAYAYAYAYAwAYAw______BkAuBkBjAqBJ____ __BjAqAqBjBjAqAqAwAYAwAwAwAwAYAwAwAYAwAYAYAA___ACTBjBjCJAqBJ_A_A __CJBjBcAqBjBjBJAwAYAwAYAYAYAYAYAwAwAwAYAYAA_NBJBkAAAqBjBJBJ_A_A __BkCJAABjBjBjBJAwAwAwAYAAAAAAAYAYAwAYAwAY_NAACTCJBjBjCJBJ_A_A_A ____BzAABkBJBjAqBJAwAYAY_z_A_A_AAwAwAYAwAYCJBkBkAuBjBkBbBJ_A_A_A ______CJCJBjBjBJAqAYAYAAAA_A_A_AAYAYAwAwAYBjBzCJAACJAqBJ_A_A_A_A ________BjAuBJBJBJAYAYAA_A_A_A_A_AAYAYAYAYBjAuBjBjAqBJBJ_A_A_A_A ________BjBjBJBJBJAYAJAA_A_A_A_A_AAAAYAwAYBjBJBjBjBJBJ_A_A_A_A_A _____A_A_ABJBJAwAwAYBJAA_A_A_A_A_AAAAYBjAYAYBJBJBJBJ_A_A_A_A_A__ ___A_A_A_A_AAYAwBjAYBJAY_A_A_A_A_AAABjBjAwAYAY_A_A_A_A_A_A_A_A__ ___A_A_A_A_ABjBjBjBJBJ_A_A_A_A_A_A_ABjBjBjBJBJ_A_A_A_A_A_A_A_A__ _____A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A____ } # tile 250 (skeleton) { ________________________________________________________________ ____________________________C$C$BkBk________________________CP__ __________________________C$C$C$C$CPBk____________________CP____ ________________________CPC$BkCPCPCPBk____________________CP__CP ____CP__________________CPC$ABABC$ABAB__________________CP__CP__ CP__CP____________________C$CPABC$ABBd__________________CPCP____ CP____CP__________________CPC$CPCPCPBd________________CP__C$CP__ __CP__CPCP__________________CVBkBdBk________________CP__C$______ ____CPCPCPCm__________________CPC$C$__CP__________Cm__C$________ __CmCmCPCm__Cm____________CPCP__Bd______CP__CPCmCm__C$__________ __________Cm__Cm________CP____BdBdBdCPCPCPC$CPCPC$CP____________ ____________Cm__Cm__CPCPC$__CPCPCPBd____________________________ ______________Cm__CPCPCP__Cm____BdBdCmCmCm______________________ ______________CPCPCm______CmCmCPCmBd____________________________ ________________CP________Bd____Bd__CmCPCm______________________ __________________________CmCmCPCm______________________________ ________________________________CPC$C$__________________________ ______________________________CPCP______________________________ __________________________CPCP____CPBd__________________________ __________________________CP__Bd____Bd__CP______________________ ______________________CP____CPCPC$CP__CPCP______________________ ____________________CPCPCP______________CPCP____________________ __________________CPCP____________________CPCP__________________ ________________CPCP________________________CP__________________ ______________CPCP__________________________CPCP________________ ____________CPCP__CP___A_A_A_A____________CP__CPCP______________ ________________CP__CP___A_A_A__________CP__CPCP________________ _____A_A_A_A_A_A__CP__CP_A_A_A_A______CP__CP____________________ _______A_A_A_A_A_A_ACPCP_A_A_A_A_A__CP__CP___A_A_A_A_A_A_A______ _______________A_ACPCP_A_A_A_A_A_A_ACPCP___A_A_A________________ ________________CPCP_A_________A_A_ACPCP___A____________________ _____________________________________ACPCPCP____________________ } # tile 251 (straw golem) { ____________________________________________CtBSBS__C$BdCu______ __________________________CtCtCrCr________BVCrCtBSBSBVC$Bd______ _________________________zCu_zCrCLCt____BVCtCt____C$C$BV________ ________________________CtCrBJ_zCLCLCr______Cr____CuCPC$________ _______________________zBJCLCLCp_zCt__Cr__CrCt______CuCPBd______ ______________________Cr_z_ACLBZCLBJ__Cr__Ct__Cr______CuCu______ ________________________CL_zCLBZ__Cr______Cr____Cr______________ ________________________CLBZCL____Cr____CrCt____________________ __________________________Ct____________Ct__Cr__________________ ________________________CtCLCrCtCr____CrCr__Cr__________________ ______________Cr______CtCLCLBZCLCtCrCLCr______Cr________________ ______Cr________CrCtCtCrCrCL______CL____Cr______________________ ________Cr____CtCrCrCLCtCLBZ______Cr______CL____________________ ________CtCrCtCr__Cr__CrCrCt________CL______CL__________________ ______CrCrCr__Cr______CtCLCLCL______CL______CL__________________ ____CtCr______Cr________CLCLCr______________CL__________________ __CtCrCrCr______________CrCLCLCL________________________________ __Ct____Cr________Cr__Ct__CrCr__CL______________________________ ____Cr__CL________CtCr__CrCLCr__CL______________________________ ____________________CLCrCL__Cr__________________________________ ________________CtCLCr__Cr__Cr__________________________________ ______________CrCL____CrCL__Cr__________________________________ ______________CL______CLCr__Cr__________________________________ ____________________CLCr____Ct___________________z_z____________ ____________________CLCL____CrCL___z_z_________z_z_z_z__________ ______________________CL____CrCL_____z_z_______z_z_z____________ ____________________CLCL______Cr_________z___z_z_z______________ ____________________CLCr______Ct_________z_z_z_z_z_z____________ __________________CLCL________CrCLCL_____z_z_z_z_z_z_z__________ __________________CL____________Cr___z_z_z_z_z_____z_z__________ __________________CLCL_z_z_z_zCrCL_z_z_z_z_z_z_________z________ _____________________z_z_z_zCt_zCtCL_z_z___z___________z_z______ } # tile 253 (rope golem) { ________________________________________________________________ __________________________CzBSCFCFBSCFBs________________________ ______________________BSCFBSCFCFBSCFCFBSCFBs____________________ ____________________CzBSCF______________CFBSAq__________________ ____________________CFAqBPBSCF______BSCFBPCFCF__________________ __________________CzCF__CF_A_ABS__CF_A_ABS__CFBs________________ ________CzCF______BSCF__BS_A_ACF__BS_A_ACF__BSBs________________ ________CFCF______CFBS____CFBS______CFBS____CFAq________________ ________BSAq________CFCF__________________BSCF__________________ ________CFCF________BSBSCF________CFCF__CFBSBs__________________ ________BsCF__________BsCFBSCzCFBSBSBSAqCFAq______CFBs__________ __________BSCF____________BsCFBSCFCFBSBs__________CFBs__________ __________BsCFBS________________BSBSBs____________BSAq__________ ____________BSCFCz____________CFCFBs______________CFBs__________ ______________BsBSCF__________BSBS______________CFBSBs__________ ________________BsCFBSCFCFBSCzCFBs____________BSCFBs____________ ____________________AqBsBsCFBSBSBSBS________CFCFAq______________ __________________________CzCFCFCFCFBsAqBSCFBSBs________________ __________________________BSCzCFCFBsBSBsAqBsBs__________________ __________________________CFBSBSBSBSCFBs________________________ __________________________BsCFCFCFCFBs__________________________ ____________________________AqBSBSBSAq__________________________ ______________________________CFCFBs__BSCFBSBs__________________ __________________________CzCFBSBSAqCFBSCFBSCFBS________________ ________________________CFCFBSCFCFBSCFBs____BSBs_z_z_z__________ ______________________CzAqBsAqCFCFAqBs_____zCFBs_______z________ ____________________CzCFBs____BsAqBs___z____CFBSCFBs_z_z_z______ ______________________BSBSAq___________z_z_z_zBsBsAq____________ ________________________CFBs_________z_z_z_z_z_z________________ ______________________CFBSBs_____z_z_z_________z_z_z____________ ____________________BSCFCFAq_z_z_z______________________________ ______________________BSBs_z_z__________________________________ } # tile 254 (gold golem) { ________________________CLBbCrCLBbCLBZCU________________________ ______________________CLCLCrCLCLCLCLCsCsCL______________________ ____________________CsCsCsCsCsCsCsCsCsCLBZ______________________ ____________________CLCrCLCLCrCrCrCrCrCLCL______________________ ____________________CLB_B_CLCLCrB_B_CrCLCL______________________ ____________________CrB_B_CrCLCrB_B_CrCLBb______________________ ____________________CrCrCLCrCLCLCrCrCrCLCL______________________ ________CrCsCsCr____CrCrCLBZCrCLCLCrCrCLCL______CrCs____________ ________CLCsCrCrCL__CrCrCrCLCrCrCLCrCrCLBZCLCLBZCrCLCs__________ ______CrCLCsCLBbCLCsCtCLCLCLCLCLCLCLCLCLCsCsCsBZCrCLCr__________ ______CLCrCsBvCLCrCsCsCsCsCsCsCsCsCsCsCrCsCsCsCtBZCLCrCs________ ____CrCLCsCsBzCLCLCrCLCsCsCLCrCLCLCLBZCrCLCLCLCLBZCLCrCrCL______ ____CLCrCsCLCLCLCLCrCrCLCsCsCrCrCLCLBZBZCrCLCLCLCLBZCrCrCs______ __CLCsCsCLCLBZBZCLCLCrCLCsCsCLCrCrCLCLBZBZCrCLCLCLBZCrCLCr______ __CrCsCLCLCLCLBZBZCLCLCrCLCsCsCLCrCLCLCLBZCrCLCLCLBZCrCLCsCs____ __CrCsCLCrCLBZBZBZCLCLCrCrCLCsCsCrCrCLCLBZBZCrCLCLBZCrCLCLCs____ __CsCLCLCrBZCLCLBZCLCLCLCrCLCLCsCsCrCrCLCLBZBZCrCLBZBZCrCLCsCs__ __CLCLCrCLBZBZCLBZBZCLCLCLCrCLCLCsCsCrCrCLCLBZCrCLBZBZCrCLCrCs__ __CLCrCrCLBZCLCLCLBZBZCLCLCrCrCLCLCsCsCLCrCLBZBZCr__BZBZCLCrCsCs __CrCrCLCLBZBbCLCLCLBZCLCLCLCrCLCLCsCsCLCrCLCLBZCr__BZBZCrCrCrCs __CLCrCLCL________BZCLB_CLBb______CLBbBZCLBZ__________BZBZCrCr__ __CLCLCLBZ________CLBbBZBvCL______BvCLBZBZCL__________BZBZCrCL__ __BZBZBZBZ______CLBvBZBZCL__________CLBZCLCL____________________ ________________CLBZBZCL____________BZCLBZCLCL__________________ ____________CLCLBZBZCLBZCLCL________CLBZBZCLCL__________________ ____________CLCLCLCLBtCLB_CL______CLCLCLBZCLCLBZCL______________ ____________CLCLCLCLCsCsCLCL______CLCLB_CLCrCsCLCL______________ ____________CLCLB_CLCsCsCLCL______CLCLBZCLCsCsCLCL______________ ____________CLCLBZCLCsCsCLCL______CLCLBZCLCsCsCLCL______________ ____________CLCLBZCLCsCsCLCL______CLCLBZCLCsCsCLCL______________ ______________CLBZCLCsCsCL__________CLBZCLCsCsCL________________ ________________________________________________________________ } # tile 255 (leather golem) { ______________________BsBsCFCFCFCFCFCFCFCF______________________ ____________________BsCFCzCzCFCFCFCFCFCFCFCF____________________ ____________________CFCFCzCFCFCFCFCFCFCFCFCF____________________ ____________________BsCFCFCFCFCFCFCFCFCFCFAq____________________ ____________________BsBsBsBsBsBsBsBsBsCrBSAq____________________ ____________________BsCFBsBsBsBsBsBsBsBSBSAq____________________ ____________________BsBsCzCzCFBsBsCzCzCLBSAq____________________ ______________________CzCFAqAqCFCFAqAqBsBS______________________ ________________CFCFCFBsCFAqAqBsBsAqAqCLBSAq__CFCF______________ ______________CFCzCFCFBsBsBsBsBsBsBsBsBSBSAqAqCzCF______________ ____________CFCzCFAqAqBsBsBsBsBsBsBsBSCLBSAqBSCzCF__CF__________ __________CFCzCFAqAqAqAqBsBsBSAqAqBSBSBSAqBSCFCzBsCFCF__________ __________CFCzCFAqAqBSAqAqBsBsBSBSBSCLAqBSCFCzCzCFCF____________ __________CFCzCzCLAqBSBSBSAqAqAqAqAqAqBSCFCzCzCFCFCF____________ __________CFCzCzCzCFAqBSBSBSBSAqAqBSCFCFCzCzCFCFBsBsCFCF________ __________CFCFCrCzCzCFCFCFCFCFCFCFCFCzCzCzCFCFCFCFCFCF__________ __________BsCFCFCzCzCzCzCzCzCzCzCzCzCzCFCFCFCFCFCFCF____________ ____________CLCFCFCzCzCzCzCzCzCzCzCzCFCFCFCFCFBSBSBS____________ ______________BsBsCFCFCFCFCFCFCFCFCFCFCFCFCFBSBsBSBS____________ ________________BsBsBsBsBsBsBsBsBsBsBsBsBSBSBsBsBsBS____________ ____________________AqAqAqAqAqAqAqAqAqAqBsBsBsBsBsBS____________ ______________________CLAqAqAqAqAqAqAqBSBsCFBsBsBsBs_A_A________ ________________BSBSBSBSAqCLAqAqAqAqBSBSBsCFCFBsBsBsAq_A_A______ ______________BSBsBsBsBsBSAqAqAqAqAqBSBSBsCFCFBsBsBsAqAq_A_A____ ____________BSBsCFCFBsBSBSAqCL______AqBSCLCFCrBsCLBsAqAq_A_A____ ____________BSBsCFBsBsBSAqAqAq______AqBSBsCFCFBsBsBsAqAq_A_A_A__ ____________BSBsBsBsBSBSAqAq_____A_A_AAqBsCFCFBsBsBsAqAq_A_A_A__ ______________BSBsBSBSBSAqAq___A_A_A_A_ABsCFBsBsBsBsAq_A_A_A____ ________________BSBSBSAqAq___A_A_A_A_A_ACFBsBsBsAqBs_A_A_A_A____ ____________BSBSBSBSBSAq_A_A_A_A_A_A_ACFBsAqBsBsBSBsAq_A_A_A____ __________BSBSAqAqAqAqAq_A_A_A_A_A____Bs_ABSBsAqBSBSAqAq_A_A____ _______________A_A_A_A_A_A_________________A_A_A_A_A_A_A_A______ } # tile 256 (wood golem) { __________________________BSBSBSBSBSBS__________________________ ______________________BSBSAYAYAYAYAYAYBSBS______________________ ____________________BSBSAYBSBSBSBSBSBSAYBSBS____________________ ____________________BSAYBSBSAYAYAYAYBSBSAYBS____________________ ____________________BSBSAYBSBSBSBSBSBSAYBSAA____________________ ____________________AwBSBSAYAYAYAYAYAYBSBSAA____________________ ____________________AwAwAwBSBSBSBSBSBSAA_zAA____________________ ____________________AwAwAwAwAwAYAYAYAA_NAAAA____________________ ________________AwAwAYAwAwAwAwAYAYAYAA_A_A_NAY__________________ ______________AwAwAYAwAYAwAw_A_AAYAYAA_A_AAYAYAY________________ ____________AwAYAwAwAYAYAYAw_A_AAYAYAYAAAAAYAYAYAYAY_____A_A_A_A ________AwAwAYAwAYAYAYAYAYAwAwAYAYAYAAAY_zAYAYAYAYAYAYAY_A_A_A_A ______AwAwAYAwAYAAAYAAAAAwAwAYAwAYAY_zAYAAAAAAAAAYAYAYAYAY_A_A_A ____AwAYAwAwAYAAAYAA_zAwAwAwAYAwAYAYAAAY_NAA_zAJAAAYAYAYAYAY_A_A __AwAYAwAYAYAAAJAA_L__AwAwAwAYAwAYAYAAAYAAAA__AAAYAAAAAYAYAY_A_A AwAwAwAYAAAAAYAA______AwAwAwAYAwAYAJAAAY_zAA___A_A_LAY_zAAAYAY_A AYAYAYAYAYAJAA________AwAwAwAYAwAYAYAAAYAA_N_A_A_A_AAAAAAYAAAY_A BSBSAYAYAYAA__________AwAwAYAwAYAYAYAJAA_zAA_A_A_A_A_A_A_LAA_A_A BSAYBSAYAA____________AwAwAYAwAYAYAYAYAAAAAA_A_A_A_A_A_A_A_A_A_A BSAYBSAY______________AwAwAYAwAYAYAYAAAY_LAA_A_A_A_A_A_A_A_A_A_A __BS__________________AwAwAYAYAYAYAYAYAAAA_z_A_A_A_A_A_A_A_A_A__ ____________________AwAwAYAwAYAAAYAAAYAJAYAA_A_A_A_A_A_A_A_A____ ____________________AwAYAwAYAA_z_AAAAYAYAYAAAA_A_A_A_A_A_A______ __________________AwAwAYAwAYAAAA_AAYAYAYAYAJAA_A_A_A_A_A_A______ __________________AwAYAwAYAA_L_A_A_AAYAwAYAA_zAA_A_A_A_A________ ________________AwAYAYAwAYAA_A_A_A_AAAAYAYAYAYAA_A_A_A_A________ _______________AAwAYAwAYAA_z_A_A_A_A_AAAAwAYAYAA_L_A_A__________ _____________AAwAYAwAYAYAA_A_A_A_A_A_AAAAYAYAYAYAA_A_A__________ _____________AAwAYAwAYAA_L_A_A_A_A_A_A_AAAAwAYAYAA_A____________ _____________A_AAwAY_zAA_A_A_A_A_______A_zAwAYAA_A_A____________ _______________A_AAYAA_A_A_A___________A_A_A_A_A_A_A____________ _________________A_A_A_A_________________A_A_A_A________________ } # tile 257 (flesh golem) { ________________________________________________________________ __________________________CvCvCYBrCn____________________________ ________________________CvCvCYCYCnCnCn__________________________ ______________________BrCYCYCvBrCnCnCnCnCTBw____________________ ________________CnCnCTBrCYBrBrCnCnCnCnCnBwCTCGBj________________ ______________ChCiCnCTBrBrBrCnCnCnCnCnCnBtCTCUBtBw______________ ____________CiCXCnCTCTCn_A_ACnCT_A_ACnCnBzCnCTCTBz__CT__________ ____________ChCnCnCTCTCTCnCnCnBwCTCnCnCTBwCnCnCTCGCmCnCT________ __________CnCnCnCTCTCnBwCnCnCnCGCTCnCnBwBtCnCTBw____CnCnCT______ __________CTCTCTCTCTCnCGCTCnCnCTCnCnCTBzCnCTBw______CnCTCGBw____ __________CTCTCGBwCGCTCnBjCTBrBrCnCTCGCnCmCm________CTCTBcCG____ __________CYBrBj__BzBjCTCTBjCGBcCGBjCTCTCY____________BzCGBj____ ____________CmBr____BtCTCTCTBzCGCTCTCTCmCY____________BtBjCG____ ________CTBw__________CGBzBtCTCTCTCTBrCYCm____________CGBjBr____ ______CiCnCTCG__________BwCTCTCTCTBrCmCv______________BrBrBr____ ______CnCnCTBj____________BwCTCTCTCYCv________________BrBr______ ______CnCTCGBj____________BtBzCTCYCv____CT____________CmBr______ ______CTCTBbCG________CTBr__CGBwCv____CTCnCT__________BrCTBw____ ______CTBwCG__________CnBrCm__BcCv____CTCnCnBw________CTBwBt____ ______BjCGBj________CTCnCTCYCv________BwCTCnCG________CGBz______ ______BrBjBr________CTCnCnCTBw________CGBbCTBj__________________ ______BrBr__________BwCTCTBbCG_________ABwCTCG_A________________ ________Br__________CGBjCGBw_____A_A_A_ABwBz_A_A_A_A____________ ______CnCT____________BtBz___A_A_A_A_A_A_A_ACTBw_A_A_A__________ ______BwCnCT_______________A_A_____A_A_A_ACTCTCG_____A__________ ______BbCGCTBw______CTBw_________A_A_A_A_ACTCTBj_____A__________ ________BwBbCG______CTBzBt_____A_A_A_A_A_ACTBwBt________________ _____________________ACGBw_A_A_A_A_A_A_A_zBcCG_L_L_A____________ __________________Cn_A_A_A_A_A_A_A_______A_A_ACTBwCG_L_A_A______ ________________CnCTCTBjBw_A_A_____________ACTBjCGBbBw_A_A______ ______________CTCTBwCGBz_A_A_________________A_A_A_A_z_A________ ________________________________________________________________ } # tile 258 (clay golem) { ________________________COCOCOCOCOCOCJ__________________________ ______________________COCOCOCOCOCOCOCOBk________________________ ______________________CJCOCOCOCOCOCOCJBj________________________ ______________________BjBjCJBkCTBkCJBzBj________________________ ______________________BjCO_A_LBk_L_ACJBj________________________ ____COCOCO____________BjCTBkCJCTBkCTBkBj________________________ __COCOCOCJBj__________BjBkCNBkCOBjCOBjBj____________BjCJ________ COCOCOBkBjBj____________BjCJCOCOCOCJBj____________CJBjBjCO______ COCOCJBjBjBjCJ______BjBJBjCOBjCJBjCOBjBJBJ______BkBjBjBjCJCO____ BJBjBjBjBJBjBjBkCJBjCJBjBJBjCOCOCOBjBJBJBjBJ__BkCTBjBjBcBjBjCJ__ __BJBJBJBjCTBjBzBkCOBcBjBjBJBJBcBJBJBJBjBjCJBzCJBjBjBjBjBJBjCO__ ____BJBJBjBjBJBjBjBjBjBjCJBjBJBJBJBJBmCTBkBjBjBjBjBJBjBjBJBJBJ__ ______B_BJBJBjBjBjBJBjBjCOBjCJBjCJBjBjBjBjBjBjBjBjBjBJBJB_B_____ __________B_BJBjBJBjBjBjBjBjBjBjBjBjBjBjBJBJBjBjBJBJB_B_B_______ ______________BJBJBjBjBjCJBjBjBcBJBJBJBJBJBJBJBJB_B_____________ __________________BJBjBjBVBmCJBjBjBjBjBJBJBJ____________________ ____________________BJBjBjBJBJBJBJBJBJBjBjBJ____________________ ______________________BJBjBjBjBjBjBjBjBjBJBJBJ__________________ ______________________BjBJBJBjBjBjBjBJBJBJBJBJ__________________ ____________________BjBjBjBjBJBJBJBJBJBJBjBJBJBJ________________ __________________BjCJBkBjBjBjBJBjBjBjBjBjBjBjBJ_A_A____________ ________________BjBkCTBjBJBjBJB___BJBjCJBJBjBjBJ_A_A_A_A_A______ ________________BjCTBLBjBjBJB_______BJBjBkBJBJBJ_A_A_A_A_A______ ________________BjBJBjBjBJBJ_A_A_____LBjBjBjBjBjBJ_A_A_A________ ________________BjBjBJBJBJB__A_A_A_A_ABJBjCJCJBJBJ_A_A_A_A_A____ ______________BjBjCJBjBjBJB__A_A_A_A_ABjBJBJBJBJB_B__A_A_A_A____ ______________BjBJBjBjBjBJB_B__A_A_A_ABjBjBjBjBjBJB__A_A________ ____________BjBjBjBJBJBJBJBJB__A_A_A_ABJBjBjBjBJBJBJB___________ ____________BJBjBjBjBjBjBjBJB__A_A_A_AB_BJBcBJBJBJB_B__A________ ___________ABJBJBjBjBjBjBJBJB__A_A_A_A_AB_B_B_B_B_B__A_A________ _____________ABJBJBJBJBJBJ_A_A_A_A_______A_A_A_A_A_A_A__________ _______________A_A_A_A_A_A_A____________________________________ } # tile 259 (stone golem) { ________________________BKBKBKBKBKBKBKBK________________________ ______________________BKBKBlBlBlBlBlBlBKBK______________________ ______________________BKBlCQCQBlBlCQBlBlBK______________________ ______________________BlBlCQBlBKBKBlBlBKBl______________________ ______________________BKBlBlBlBKBKBlBlBlBD______________________ ______________________BKBKBlBlBlBlBlBlBKAm______________________ ____________________BKBKBKBKBKBKBKBKBKBKBDAj____________________ ________________BKBKBKBlBlBKBKBlBlBlBKBKBYAmBKBD________________ ______________BKBKBDBKBlBlBKBKBKBlBKBKBKAjBYAjBKAm______________ ____________BKBlBDAmBKBlCQCQBlBKBKBlCQBlBlBDAmBYBKBD____________ __________BKBlBKAmBdBK_VAO_VAOBKBK_VAO_VAOAmBDAjAmBKBD__________ ______BDBKBlCQBKBDBKBKBK_VAOAjBKBKBDAEABBKAjBKBKBDBlBKAmBD______ ____BKAmBKBlCQBKAmBKCQBlBKBKBKBKBKAmAjBKBKBYBKAmBDBlBKBDBKAm____ ____BKBDBKBlBlBDBDBKBlBlBKBKBKBKBKBDBYBKAmAjAmBDAfBKBKAmAjBD____ ____BDAmBDBKBlCQAfBDBKBKBlBKBKBKBKAmAjBKBYBDBYAjBlBKBKBDAmBY____ ____AmBDAfBKBKBlCQAmBDBKBKBKAmBYAjBYBKBDAmAjAmBlBKBKBDAfBYAj____ ______BDAmBDBKBKBlBlBKBDBKBKBKAjAmBKBKAmBDBlBKBKBKBYAmBDAm______ ____BKBKBDAmBKBDBKBKBlBKBDBKBKBKBKBKBDBDBlBKBKBKAmAjBKBKBDBD____ ____BKBlBKBDAfBKBDAmBKBlBlAmBDBYAjAmBDBKBKBKBKBDBDAmBKBKBKAm____ ____BKBlBlBKBYBKBKAjBDBKBKBKBDAfBYBKBKBKBKAfBYBKAmBDBKBKAjBD____ ____BDBKBKAjAmBDAmBKBKAmBDBKBKAmBDBKBKAmBDBKBKAjBYAjBYAmBYAf____ ______BDAmBYAjBYAjBYBKBKBKAmAjBDAmBDAfBDBKBKBDAfBYAmAjBYAjAE____ ____AmBKBKBKBKAmBDAmBDAfBDBYAmBDAjBYAmBDAmBDAmBDAjBKBYAfBDABAE__ ____BDBKCQBlBKBKBYAjBYAjBYAjBKBKBKBKBYAjBDAfBDAmBKBKBKAmBDAmAB_V __BDAmBKBlBlBKBKAfBYAmBDAmBDAmBKBKAjAmBYAmBDBDBDBKBKBKBDAmBDBDAE __AmAjBDBKBKAmBDBKBKBKAmBDAfBDBDAmBYBDAfBDBKBKAmBDBKAmBDBKAfBY_V __BDBKAmBKBDBlBlBKBKBlBlBKBDAmBDAfBDAmBKBKBKBKBKAfBDBDBKBKBDAmAD __BYBKBKBYAjBKBlBlBKAjBYAjAEAB_VAO_VADAmBDBKBKBKBDAmBKBKBDAmBD_V ___VBDBKAfBYBKBKBKBlBlBKBKAmADAO_VAOBDBKBKBKBKBKBDAmBDAfBDAjAO_V _____SAjBYAjAmBDBKBKBKBKBKBDAB_VAEABAmBKBKBKBKBDAfBDAmBDAmAO_VAO ______AO_VAO_VBYAmBDAmBDAmABAEAB_V____BDAmBDAmBDAEAB_VAO_VAO_V__ ____________AO_VAD_VAB_VABAE_V__________AB_VAB_VAB_VAD__________ } # tile 261 (iron golem) { ______________________BDAiAO_VAO_VAO_VBDAi______________________ ____________________AiBDAEBMBMBICVBMBMAEBDBd____________________ __________________BdBFAEBFBMCVCSBICVBFBF_VBFAi__________________ ________AiBdAiBdAiBMAiBDBMBMBFBnCSBFBMBMAiBdBMBdAiBdAiBD________ ______BDBdBFCVBFBDBMBd_ZBDAiBMBMBMBMBDBFABAiBMBDBMCSBFBDAi______ ______AiBMBICVBhBMApBD_VBLCjAOAiBDAECjAjAEBdAiBFCSBnCSBFBd______ ________BdAiBMBMCVBFAiBd_VCpCYAEAECYCYAEBDAiBMCVBFBFAjAi________ __________BMAiBdAiBMBMAiBDAEAOAiBD_VAOAiBdBMBMAiAiBdBM__________ ________CSBnBMBMBdAiBMBdAiBMBMCVBhBMBMBDAiBMBdBdBFBMCSBn________ ______BFCVBMBMBdAiBDBdBMAiBdBMBICVBMAiBdBMBdAiAiBDBFBFCSBM______ ______AiBMBFAi____BFBFCVBFAiBdBdAiBdAiBMCSBFBD____AiBMBMBD______ ____BdBMAiBd______AiBFBFBMBMAiBdAiBdBMBMBFBMAi______AiBDBMAi____ __AiBMBMCSBFBD____BdBFBMCSBnBMBMBMBFCVBIBMBMBd____AiBMCSBFBMBd__ __BDBMCSBnBMBMAi____BDBFBFCSCSBnCSBnCSBMBMAi____BdBMBkBICVBMAi__ __AiBMBnBMBMBMBd__AiBdAiBDBFBFBMBMBMBMBDBdBDAi__AiBMBMBMCSBFBD__ __BdBMCSBMBMAi____BdBMAiBdAiBDAiBdAiBdAiAiBFBd____BdBMBMBnBMAi__ __AiBMBMCVBFBdBF__AiCVBFBMBDApBDAiBdAiBMBMCSAi__BMAiBMCSBMBMBd__ ____BDBFBMAiBFCSBM__AiCSBIBdBMBnCSBFBdBnCSBD__BFCVBMBDBMBMAi____ ______AiBdCSBFBFBnBM__BMBMBDBFCSBnBMAiBMBM__BFCSBFBFCSAjBd______ ______BDCSBn____BMBM__BMBMAiBdBnCSAiBdBMBM__BFBF____BICVAi______ ______BICVBF____BMBM__BdAiBdAiBMBMBdAiBdAi__BMBM____BMCSBn______ ______CSBFBM________BDBMBMAiBdAiBdAiBDBMBMBD________BMBFCS______ ______BFBMBM______AiBMCSBnBnBD____BdBFCSBnBMAi______BMBMBF______ ____BFBDBMBM______BdBMBMBMBMAi____AiBFBFBMBMBd______BMBFBDBM____ ____BM____BMBM____AiBDAiBdBD________BdAiBdAiBd____BMBM____BF____ ____BMBM__BMBF__BdAiCVCSAiBFBM_z_zBMBFBFBnCSBDAi__BMBM__BMBM____ ______BM________AiBMAiBDBMBMBd_A_zBDBFBMBDAiBMBd________BM______ _____________z_ABdBdBnCSBMBM_A_z_z_zBMBMBnCSBdAi_z_z____________ ___________z_z_z_AAiBMBMAiBdAi_$_zAiBdAiBMBFAi_$_z_z_z__________ ___________z_z_zBdBMAiBdBMAiBd_z_$AiBdBMAiBdBMBD_z_z_z__________ ___________z_z_zAiBdBMBMBDBd_A_z_z_zBdAiBMBMAiBd_A_z_z__________ _____________z_z_z_z_z_z_M_A_z_z_z_z_z_z_$_z_z_z_z_z____________ } # tile 263 (wererat) { ____________________________BDBnBnBn____________________________ __________________________AiBnBnBnBD____________________________ ________________________BDBnBnCSBnBnAi__________________________ ______________________AiBnBnBn_A_zBnBn__________________________ ______________________BdBnBn_zCTCT_zBnBD________________________ ______________________AiBnBnCTCiCiCTBnBnAi______________________ ______________________BdBnCTCYCiCiCYCTBnBnBd____________________ ____________________AiBnBnCT_zCiCi_zCTBnBnAi____________________ ____________________BdBn_z_zCiBwCGCi_z_zBnBd____________________ ____________________AiBnBn_z_zC$C$_z_zBnBnAi____________________ ____________________BdAi_$CiCiC$C$CiCi_zBDBd____________________ __________________BDBnBnAiBD_zC$C$_ABdAiBnAi____________________ ________________AiBnBnBnBnBnAi_$_zBDAiBnBnBnBd__________________ ________________BdBnBnCSBnBnBDBdAiBnBnBnCSBnAi__________________ ______________BDAiBnCSBnBnBnBnAiBnBnBnBnBnBnBnBD________________ ______________BFBnBnBnBnCSBnBnBnBnBnBdAiBnCVBnAi________________ ______________AjBnBdBnBnBnBnBn_zBnBdAiBnCVBIBnBd________________ ______________AiBnBdAiBnBn_z_zCT_z_zBnBnBnBnBDAi________________ ______________BdBnBnAiBd_zCiCiCiCiCT_zAiBnBDBnAi________________ ________________AiBnBnAiBDCWBDCiCTCTCTBdAiBnBn__________________ ________________BdBnBnBnBnAiBdCTCiBDBnBnBnBnBd__________________ __________________BnBnCSBnBnBnCiCiBnBnBnBnBnAi__________________ __________________BDBnBnBnBnCSBnBnBICVBnBnBd____________________ ____________________AiBnBDBnBMCSBnCSBnBnBnAi____________________ ____________________BdAiAiBnBnBnCVBnBnBnBn______________________ ____________________AiBdBnBnBnBnBnBnBnBnBD______________________ ____________________BdBnBnBnBnBnBnBnBnAiBF______________________ ____________________AiBnBnBnBnBnBnBnBnBnBD______________________ __________________BDAiBdAiBnBnBnBnBnAiBdBnAi____________________ _______________ABdAiBdAiBDBdAiBnBdAiBdAiBdAiBD_z________________ _____________z_zAiBdAiCVCPCPBDAiBdCPCPCPAiBdAi_$_z______________ _______________z_z_zC$C$CPC$_z_z_AC$CPC$C$_z_z_z________________ } # tile 264 (werejackal) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________________BsBsBsBs_A_A________________________ ____________________________BsBsBsBs_A_A________________________ ________________________BsBsBsBsBsBsBsBs_A_A____________________ ________________________BsBsBsBsBsBsBsBs_A_A____________________ ________________________CwCwBMBMCwCwBMBM_A_A____________________ ________________________CwCwBMBMCwCwBMBM_A_A____________________ ________________________CiCnCiCnCiCnCiCn_z_A____________________ ________________________CiCnCiCnCiCiCnCi_A_A____________________ _________________________z_zCiCnCiCnAA_z________________________ _________________________A_zCnCiCnCi_A_A________________________ ____________________CzCzCiCnAA_z_z_zCiCnCzCz_____A_A_A_A_A_A____ ____________________CzCzCnCi_A_A_L_zCnCiCzCz_____A_A_A_A_A_A____ ________________CzCzCiCnCiCnCiCnCiCnCiCnCiCnCzCz_A_A_A_A_A_A____ ________________CzCzCnCiCiCnCiCiCnCiCiCiCnCiCzCz_A_A_A_A_A_A____ ________________CiCn_z_zCzCzCiCnCiCnCzCz_z_zCiCn_z_A_A_A_A_A____ ________________CnCi_A_LCzCzCnCiCnCiCzCz_L_zCnCi_A_A_A_A_A_A____ ________________CiCn_z_ABsBsBsCFCFCcBsBs_A_ACiCn_z_A_A_A_A_A____ ________________CnCi_L_ABsBsBsBsCFCFBsBs_A_zCnCi_A_A_A_A_A_A____ ________________________BsBsBsBsBsBsCFCF_A_A_L_z_A_A_A_A________ ________________________BsBsBsBsBsBsCFCF_A_A_A_A_A_A_A_A________ ________________________BsBsBsBs_A_ABsBs_A_A_A_A_____A_A________ ________________________BsBsBsBs_A_ABsBs_A_A_A_A_____A_A________ ____________________CFCFCiCn_z_A____CiCnCFCF_A_A________________ ____________________CFCcCnCi_A_A____CnCiCFCF_A_A________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 265 (werewolf) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________BsBsBsBs_A_A____________________________ ________________________BsBsBsBs_A_A____________________________ ____________________BsBsBsBsBsBsBsBs_A_A________________________ ____________________BsBsBsBsBsBsBsBs_A_A________________________ ____________________C$C$BsBsC$C$BsBs_A_A________________________ ____________________C$C$BsBsC$C$BsBs_A_A________________________ ____________________CiCnCiCnCiCnCiCn_z_A________________________ ____________________CiCnCiCnCiCiCnCi_A_A________________________ _____________________z_zCiCnCiCnAA_z____________________________ _____________________A_zCnCiCnCi_A_A____________________________ ________________CzCzCiCnAA_z_z_zCiCnCzCz_____A_A_A_A_A_A________ ________________CzCzCnCi_A_A_L_zCnCiCzCz_____A_A_A_A_A_A________ ____________CzCzCiCnCiCnCiCnCiCnCiCnCiCnCzCz_A_A_A_A_A_A________ ____________CzCzCnCiCiCnCiCiCnCiCiCiCnCiCzCz_A_A_A_A_A_A________ ____________CiCn_z_zCzCzCiCnCiCnCzCz_z_zCiCn_z_A_A_A_A_A________ ____________CnCi_A_LCzCzCnCiCnCiCzCz_L_zCnCi_A_A_A_A_A_A________ ____________CiCn_z_ABsBsBsCFCFCcBsBs_A_ACiCn_z_A_A_A_A_A________ ____________CnCi_L_ABsBsBsBsCFCFBsBs_A_zCnCi_A_A_A_A_A_A________ ____________________BsBsBsBsBsBsCFCF_A_A_L_z_A_A_A_A____________ ____________________BsBsBsBsBsBsCFCF_A_A_A_A_A_A_A_A____________ ____________________BsBsBsBs_A_ABsBs_A_A_A_A_____A_A____________ ____________________BsBsBsBs_A_ABsBs_A_A_A_A_____A_A____________ ________________CFCFCiCn_z_A____CiCnCFCF_A_A____________________ ________________CFCcCnCi_A_A____CnCiCFCF_A_A____________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 266 (elf) { __________________________CsCsCsCsCs______________________CI____ ________________________CsCsCiClCiCrCs__________________AzCI____ ________________________CsClCiCnCiCnCsCs____________AzAz__CI____ ________________________CrClBRCnBRCnCrCsCs______AzAz____CI______ ________________________CrCnCgCnCnCnCsCrCsCsAzAz________CI______ _________________________qCTCnCnCnCT_qCsCrCrCsCr______CI________ _____________________q_q_q_t_qCT_q_q_t_q_tCsCrCsCs____CI________ ___________________q_t_t_t_q_q_c_m_m_q_t_q_qCs__CLCsCI__________ ___________________q_t_t_q_t_q_c_t_m_h_m_hCTCrCs____CI__________ __________________Cl_t_q_m_q_m_c_m_h_m_hCTCl__Cr__CI____________ ________________ClCiCn_q_m_m_t_q_m_h_h_cCTCnCl__CrCr____________ ______________BSCXCnCn___q_m_q_m_h_m_c__CnCTCnCI_A_A_A__________ __________AzAzClCnCn____Aw_q_h_m_hAwAY__CTCnCn_z_A_A_A__________ ______AzAz____CiCn______AwBSAwCrAwAYAYAw_ACdClCn_A_A_A_A________ __CICI________ClCn____CI_qBSAwCrAwAY_c_AAwAwCnCrCrCr_A_A_A______ ______CICICICXCnCTCICI_m_q_t_q_m_q_m_h_A_AAwCLCrCm_A_A_A________ ____________ClCnCT___m_m_q_t_t_q_t_m_m_h_ACLCLBkCoCm_A_A________ ____________CiCT_____m_q_t_q_t_q_m_q_m_h_ACLBkCPBkCm_A_A________ ____________________Cs_q_t_q_t_q_m_tCLCL_ACL_ABkBkCoCm__________ ______________________Cs_t_t_tCrCrCLCnCn_A_A_A_ACPBkCmCm________ ______________________CiCsCsCr_A_ACTCnCn_A_A_A_A_ABkCPCV________ ______________________CiClCT_A_A_ACTCnCn_A_A_A_A_A_ABkBkCm______ ____________________CnClCgCT_z_A_ACTCTCn_A_A_A_A_A_A_ABkCPCV____ ____________________CXClCnCT_A_A_ACTCTCn_A_A_A_A_A_A_M_ABkCm____ ____________________ClCgCn_A_A_A_A_ACTCT_A_A_A_A_A_A_A_A_ABkCo__ ____________________ClCnCT_A_A_A_A_ABSBS_A_A_A_______A_A_z_MBk__ ____________________BSBiBS_A_A_A_A_ACTCn_A_A_A___________A_A_A__ ____________________CiCnBS_A_A_A_A_ABSBSBS_A_A__________________ __________________BSBiBiBS_A_A_A_A_A_ABSBS_A____________________ _________________ABSBSBS_A_A_________A_A_A_A____________________ _________________A_A_A_A_A_____________A_A______________________ ________________________________________________________________ } # tile 267 (Woodland-elf) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________________________CfCfCIBv__________________________ ____________________________Cf__CfCIBvCj________________________ __________________________Cf__CfCICIBvCI________________________ ______________________________CbCbCbCbCb______CPBkBvBWBD________ __________________________CiClCl_ICi_ICn______BnBkBkBkBk________ ____________________________CXCi_ICn_ICl______CJBkBkBkBk________ ______________________________ClCtCiCl________CPBkBvBWBD________ ______________________________CfClCiCXCF__________BvBW__________ ____________________________CfCfCICfCIBvBv________BvBW__________ __________________________CfCfCfCICICIBvBvBv______BvBW__________ __________CP____________CfCfCfCfCICfCIBvBvBvBv____BvBW__________ __________CPBk________CfCfCfCfCfCICICIBvBvCiCn____CFCF__________ ____________CPCPBk____ClCiCiCfCfCfCfCIBvBvCiCnCiCiCnCi__________ ______________CPBkCj__ClCi__CfCfCICICIBvBD__CiCnCiCcCn__________ ______________CjCjCjCXClCn__BDCxCxCxCbCbAR________CFCF__________ __________________CtCjCi____CfCfCICICIBvBvBv____________________ ____________________ClCj__CfCfCfCICICIBvBs______________________ ____________________________CcCFCFCICIBsBsBs____________________ ____________________________CFCFCFCFCFBsBsBs____________________ ____________________________CcCFCF____BsBsBs____ABABABAB________ ____________________________CcCFCF____BsBsBs__ABABABAB__________ ____________________________CcCFCF____BsBsBsABABABABABAB________ ____________________________CtCGCt____CtBtCLABABABABABAB________ ____________________________CsCtCs__ABCtCsCLABABABABAB__________ ______________________Cx__CfCfCICIABABCICICIBWABCxABAB__________ ______________________CfCfCfCfCICIABABABCICIBWBWBWAB____________ ________________________ABABABABABAB____ABABABABAB______________ ________________________________________________________________ ________________________________________________________________ } # tile 268 (Green-elf) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________BGBG_q_m______________________________ ________________________BG__BG_q_mCY____________________________ ______________________BG__BG_q_q_m_m______BvAz__________________ __________________________CjCjCjCjCj______BvAz__________________ ______________________ClClCt_ICi_ICi________BwAz________________ ________________________CiCX_ICi_ICl________BvAz________________ __________________________ClCtCnCl____________BvAz______________ ___________________________qClClClBY__________BvAz______________ _________________________w_q_q_q_m_m_m________BvAz______________ ____________________Bm_w_w_q_q_q_m_m_m_m______BvAx______________ _____________________w_w_w_q_qCf_m_m_m_m_m____BvAY______________ ________CP_________t_w_w_w_q_q_q_m_m_mCiCn____CdCn______________ __________CPBk____ClCiCi_w_q_qCf_m_m_mCnCiCnCiCiCn______________ __________CPCc____ClCi___w_q_q_q_m_mBd__CiCiCnCnCn______________ ______________CyCXClCn__BDCfCjCfCfCfAR________CdCn______________ ______________ClCqCi_____w_q_q_q_m_m_m_m______Az________________ ________________ClCc___w_w_q_q_q_m_mBsBc____BvAz________________ ____________________CcBkCcCFCF_q_mBsBsBs__BvAz__________________ ____________________CJBnCJCFCFCFCFBsBsBsBvAz____________________ ______________________BkCcCFCF____BsBsBsAz__ABABABAB____________ ________________________CcCFCF____BsBsBs__ABABABAB______________ ________________________CcCFCF____BsBsBsABABABABABAB____________ ________________________CtBwCt____CtBtCLABABABABABAB____________ ________________________CsCtCs__ABCtCsCLABABABABAB______________ __________________Cj___q_q_m_qABAB_m_m_m_mANCjABAB______________ ___________________t_t_q_q_m_mABABAB_m_m_m_m_mAN________________ ____________________ABABABABABAB____ABABABABAB__________________ ________________________________________________________________ ________________________________________________________________ } # tile 269 (Grey-elf) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __________________________CVCVCPBk______________CP______________ ________________________CV__CVBnBwCj__________CPCP______________ ______________________CV__CVCJCPBkBk__________CPBk______________ __________________________CwCwCaBqBq__________CPBn______________ ______________________ClClCl_ICn_ICi__________CPCJ______________ ________________________CiCX_ICi_ICl__________CPBk______________ __________________________ClCtCnCl____________CPBn______________ __________________________CPCiClCXBY__________CPBk______________ ________________________CPCPCPCKCPBkBk________CPCJ______________ ____________________CVCVCVCPBkCPCOBkBkBk______CPBM______________ ____________________CVCVCVCJCPCwCKBkBkBkBk__CMCPCJCM____________ __________________CVCVCVCVBnCPBmCPBkBkCnCi____BsBS______________ __________________CiClCiCVCVCKCwCPBkBkCiCnCiCnCiCi______________ __________CiCn__ClCXCn__CVCVBmCPBkBkBk__CiCnCiCACn______________ ________CfCjCfClCiCi______CwCwCaCaBq__________BsCF______________ ________Cj_g_gCfCi______CVCVCPCPCPBkBkBk________________________ ________Cf_g_g_gCf_b__CVCVCPBkCPBkBkBs__________________________ __________Cj_g_gCj______CcCFCFCPCPBsBsBs________________________ ____________CfCjCf______CcCFCFCACFBsBsBs________________________ ________________________CcCFCF____BsBsBs____ABABABAB____________ ________________________CcCFCF____BsBsBs__ABABABAB______________ ________________________CcCFCF____BsBsBsABABABABABAB____________ ________________________CeBwCe____CeBtCHABABABABABAB____________ ________________________CeChCe__ABCeCeCHABABABABAB______________ __________________Cj__CVCPCKCPABABBkBdCPCPANCjABAB______________ __________________CmCVCPCPBnCPABABABBkBkBkCPCPAB________________ ____________________ABAB_MAKABAB____ABABABABAB__________________ ________________________________________________________________ ________________________________________________________________ } # tile 270 (elf-lord) { __________________________Cu____________________________________ ____________________________CuCu________________________________ ______________________________CuCu______________________________ __________________________CVCVCuBk______________CP______________ ________________________CVCVCVCPBkBd__________CPCP______________ ______________________CVCVCVCJBnBkBkBd________CPBk______________ ______________________CVCVCwCwCaBqBqBd________CPBn______________ ______________________ClCVCl_ICi_ICnBd________CPCJ______________ ______________________CVCVCi_ICn_IClBk________CPBk______________ ________________________CmClCtCiClBd__________CPBn______________ __________________________CjClClCiBd__________CPBk______________ ________________________BHAoCjCjCMAhAo________CPCJ______________ ____________________AoAoAoAoAoAoAoAhAhAh______CPBl______________ ____________________BgAoBgAoBgAoBgBkBHAhCj__CMCPBmCM____________ __________________CjAoAoAoAoAoAoAoAhAhCjCn____BsBS______________ __________________ClCjCjBgAoBgAoBgBkCjCnCiCiCnCiCn______________ __________CiCn__ClCiCi__AoAoAoAoAoAhAh__CiCnCiCFCi______________ ________CfCjCfClCiCi______CMCjCjByBy__________BsCA______________ ________AoBHAoCjCg______BHAoBgAoBgAhBHAh________________________ ________BHAoBHAoCf_b__AoAoAoAoAoAoAhBD__________________________ __________BHAoBHCj______CPBkBHAoBgBdBdBd________________________ ____________BHAoCf______CPCKBmCKBkBdBdBd________________________ ________________________CPBkBk____BdBdBd____ABABABAB____________ ________________________CYCYCp____CYCYCY__ABABABAB_A____________ ________________________CcCFCF____CFBsBsABABABABABAB____________ ________________________CFCFCF____CFBtBsABABABABABAB____________ ________________________CFCFCF__ABCFBsBsABABABABAB______________ ______________________CzCFCFCFABABCFBsBsBsAB_AABAB______________ ____________________CzCFCFCFBsABABABBsBsBSBS_A_A________________ ____________________ABABABABABAB____ABABABABAB__________________ ________________________________________________________________ ________________________________________________________________ } # tile 271 (Elvenking) { ____________________________________Cr__________________________ ______________________________CL____Cr____CL____________________ ________________________________CLCPCrCPBZ______________________ ________________________________CLCrCuCrCrCL____________________ ______________________________CPCPCTCTCVCPCP____________________ ______________________________CPCTCnCnCTCKCVCP__________________ ______________________________CVCTCnCnCTCVBmCK__________________ ______________________________CVCTCnCTBjCVCPCPCP________________ ______________________________CVBwCTCTBtCPBmCVCP________________ ___________________________qCrCrBJBVBVBLBkBkCVCrCr______________ _____________________q_t_t_tCrCLBLBLAoBmBLBmBLCL_t_t_t_t________ _________________q_t_t_q_q_q_qBLBDBmBLBLBDBm_I_I_I_q_q_q_t_t____ ____________Cr_____q_qBvBvBLBDBmBLBLBDBm_K_K_I_q_I_G_G_d_q_q_t__ ____________CL________BvBvBWBLBLAoBmBL_K_K_K_q_q_I_G_G_G_d______ ____________CnCn____BvBvBWBWAoBmBLBLBJ_K_K_q_q_q_I_G_G_G_d______ ____________CnCTCTBvBvBWBW_d_UBLBDBmBL_K_K_K_I_q_I_h_h_G_d______ ________CrCLCLCLBWBWBWBW_d_d_YCLCLCrCr_K_K_q_q_q_q_h_G_G_d______ ____________CV____BWBW_d_d_d_YBLBmCrCr_K_K_q_I_q_h_G_G_G_d______ ____________CV_________d_d_Y_YBmBLBmBD_K_K_K_q_h_h_h_G_G_d______ ____________CV_________d_d_YBLBLAoBmBLBL_K_K_q_q_h_G_G_d_d_d____ ____________CV_________d_dBmBDBmBLBLBDBm_K_K_I_q_h_G_G_d_d_d____ ____________CV_________d_d_YBmBLBDBm_Y_Y_K_K_I_q_h_G_G_Y_d_d____ ____________CV_______d_d_Y_Y_dBLBmBW_Y_YBv_K_K_I_h_G_Y_Y_d_d____ ____________CV_______d_d_Y_Y_dBvBWBW_Y_YBv_K_K_I_I_G_Y_Y_d_d_d__ ____________CV_______d_d_Y_Y_dBvBWBW_Y_YBvBv_I_I_I_Y_Y_Y_d_d_d__ ____________CV_______d_d_Y_Y_dBvBWBW_Y_YBvBWBW_I_d_Y_Y_Y_d_d_d_d ____________CV_____d_d_Y_Y_Y_dBRBRAv_Y_YAvBRAv_d_d_Y_Y_Y_Y_d_d_d ____________CV_____d_d_Y_Y_d_dBRBRAv_Y_YAvBRAv_d_d_Y_Y_Y_Y_d_d_d ____________CV___A_d_Y_Y_Y_d_dAvBRAv_Y_YBRBRAv_d_d_Y_Y_Y_Y_d_d_d ____________CV_A_A_A_Y_Y_YAvBRBRAvAv_Y_YBRAvBRBRAv_d_Y_Y_Y_d_d_A ____________CV_A_A_A_A_A_AAvAvAvAvAv_Y_YBRAvAvAvAv_d_Y_Y_A_A_A_A _____________A_A_____A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A } # tile 273 (nurse) { __________________________C$C$C$C$______________________________ __________________________C$C$C$C$______________________________ ______________________AOAOC$C$C$AOAOAO__________________________ ____________________AOAOAOAOAOAOAOAOAOAO________________________ ____________________AOAOAOCiAOAOCiAOAOAOAO______________________ __________________AOAOAOCiAZAOCnCiCnAOAOAO______________________ __________________AOAOCnCGBwCiCnCTCGCnAOAOAO____________________ __________________AOAdCiCiCnCiCnCiCnCiCnAOAO____________________ __________________AOAOCnCiCnCiCiCnCiCnCnAOAO____________________ ____________________AdCiCnCLCiCGCkCGCiCnAO______________________ ____________________AOAOCiCnCGCiCGCiCnAdAO______________________ ____________________C$C$__CiCiCnCiCnAeAO________________________ __________________C$C$C$C$CTCTCnCTC$C$C$C$______________________ __________________C$CoCoC$BVBVBVC$C$C$C$C$C$____________________ ________________C$CoCoCmC$C$BVC$C$C$CoCoCoC$________AOAOAO______ ________________C$CoCoCmC$C$C$C$C$CoCmCmCmCi____AOAOAOAOAO______ ______________CiCnC$CmCmCoC$C$C$CoCm____CTCnCiAOAOAOAOAOAO______ ______________CnCn____CmCoC$CoCoCoCm____CTCnCnAOAOAOAOAOAO______ ____________CiCiCn____CmC$CoCoCoCmCmCm____CnCiCnAeAOAOAOAO______ ____________CnCn____CmCmC$C$CoCoCmCmCm__AOCnCnCiAOAOAOAOAO______ ______CiCnCiCn______CmC$CoC$CoCoCmCmCm__AOAOCnCnCnCiAOAO________ __________CnCn______C$C$CoC$CoCoCoCmCmAOAOAOAdCnCnAOAO__________ ________________________CoC$CoCoCoCmAOAOAOAOAOAOAOAOAO__________ ________________________CnCT____CnCnAOAOAOAOAOAOAOAOAO__________ ________________________CiCT____CnCiAdAOAOAOAOAOAO______________ ________________________CnCT____CTCiCnAOAOAOAOAO________________ ________________________CiCn__AOAOCnCi__AOAOAO__________________ ________________________CnCnAOAOAOCTCnCnC$AOAOAO________________ ________________________CiCnAOAOAOAOCTCnC$__AOAO________________ ________________________CnCnAOAOAOAO__C$C$______________________ ______________________C$C$C$AOAOAOAO____________________________ ____________________AOAOAOAOAOAOAO______________________________ } # tile 274 (shopkeeper) { ________________________________________________________________ ________________________________________________________________ ____________________________CiCnCiCn____________________________ __________________________CnC$CnCiCnCn__________________________ ________________________CiCiCnCiCiCnCnCn________________________ _________________________z_$CiCiCnCi_z_A________________________ _____________________A_ACiCnCiCnCiCnCiCn_A_A____________________ _____________________zCnCi_$CnCiCnCi_$CiCn_A____________________ ____________________CiCnCiCnCiCiCnCiCnCiCnCn____________________ ____________________CiCnCiCi_z_z_zAACnCnCnCT____________________ ______________________CiCnCi_z_A_A_ACiCnCT______________________ ________________________CnCnCnCiCnCnCnCn________________________ _______________________k_A_zCnCnCTCT_z_z_g______________________ ___________________K_k_K_k_A_z_A_z_A_A_g_K_g_I__________________ _________________K_K_K_K_k_g_A_A_A_A_k_g_K_K_I_I________________ _________________K_K_k_K_k_g_A_A_A_A_k_g_K_g_K_I________________ _______________K_K_I_k_k_k_g_g_g_g_g_k_k_g_g_K_I_I______________ _______________K_K_I_k_k_k_k_g_g_g_k_k_k_g_g_K_K_I______________ _____________K_K_I_k_k_f_f_k_k_k_k_k_k_f_f_g_g_K_K_I____________ ____________Ci_K_I_b_f_k_k_k_k_k_k_k_k_k_k_f_f_K_KCi____________ __________CnCn_K___b_k_k_k_k_k_k_k_k_k_k_k_k_b___KCnCn__________ __________CiCn_____g_k_k_k_k_k_k_k_k_k_k_k_k_g____CiCn__________ __________CnBiBS__AJ_g_g_k_k_k_k_k_k_k_k_g_gAJ__CnCnCn__________ __________BSCLAw__AYAJAJ_g_g_g_g_g_g_g_gAJAJAJ__CiCn____________ ________BSCLAvCn____AYAYAJAJAJAJAJAJAJAJAJAJ____________________ ______BiBbAw__________AYAYAJAJAJAJAJAYAJAJ______________________ ________Aw____________AYAYAJ________AYAJAJ______________________ ______________________CcAYBs________AJAJCcAY____________________ __________________CcCcBsBsBS_A_A_A_ACcBsBsBsBS_A_A_A_A_A________ ________________CcCcBsBsBSBS_A_A_A_ABsCcBsBSBSBS_A_A_A_A_A_A_A_A ________________BsBsBSBSBS_A_A_A_A_A_ABSBSBSBSBS_A_A_A_A_A_A_A__ ___________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A__________ } # tile 275 (guard) { ________C$__________________CVBIBdAi____________________________ ______C$__________________BIC$BMBMBMBD__________________________ ____C$Cm________________CVC$BMBMBMBMBMAi________________________ ____C$Cm________________BIBMBMBMBMBMBMBd________________________ ____CmCm______________CVCSCVBFBMBMBMAiBdAi______________________ ____Cm__Av________BnCS_ABI_A_ACSBD_A_zAi_zAiBD__________________ ______CmBd____CVBh_zBnClCVBMCiCPAiCiBMBdCnBd_AAiBd______________ ______CBCB__CVBIBFCVCS_BCFClCnCSBdCiCnAw_AAiBdBFBdAi____________ __CuCu__Av__BhBkBMBICVBI_$CFCF_A_AAwAw_ABDAiBdBFBFBD____________ Cu__Cu__BR__CVBMBM_zBhCV_ACFCFBsBsAwAw_AAiBd_ABMBMAi____BdAe____ ____CB__BR___A_ABM_ACVBhCV_ACFBsBsAw_ABdAiBd_ABM_A_z__CP_HAe____ ________BR__CSBM_MBnCSBnBFCS_A_A_A_zAiBFBdAiBd_ABMAi__CP_HAe____ ________BR__BnBMBd_ACVBFBMBFBnCSAjBdBMBMBFAi_ACSBMBdC$_a_HAe____ ________BRCS_zAi_A__BICSBMBMBMBIBdBFBMBMAiBd___ABFC$_f_a_HAe____ ______ClCiCVBF_A______CVBFBMBMBMBMBMBMBMBd_______AC$_f_a_HAe____ ______ClCiCnAi________BICVBMBMBMBMBMBFBdAi________C$_f_a_HAe____ ______CnCnBM___________ACSBnBMBMBMBMBDAi_z________C$_f_a_HAe____ ________Br____________CSBn_ACSBMBFBD_AApBD________C$_f_a_HAe____ ________BR__________CVBICSBnBM_A_ABMAiBdAiBd______C$_f_a_HAe____ ________BR__________CS_ACVBMBMBMBMBMBMBD_zAi______C$_f_a_HAe____ ________BR__________Bn_ABhBMBMBMBMBMBMAi_ABd______C$_f_a_HAe____ ________BR__________CS_A_z_ACVBMBFBd_A_A_zAi______C$_f_a_HAe____ ________Av_____________A_A_A_ACSAj_A_A_A_A________C$_f_a_HAe____ ________Av_____________A_A_A_A_____A_A_A_A________C$_f_a_HAe____ ________Av____________CVBFAi_z_____ACSBFBD________C$_f_a_HAe____ ________Av____________BhBFBd_A_____ABnBMAi________C$_f_a_HAe____ ________Av_____________A_A_AAi____CS_A_A_z________C$_f_a_HAe____ ________AX____________CVBMBMBd____BnBMBFBD________C$_f_a_HAe____ ________AX_____________A_A_AAi____CS_A_A_M________C$_f_aBd______ ________AX_________A_MBnCSBD_z_A_A_ACVAiBD_A_A____C$_f_aBd_A_A_A ________AX_A_A_A_A_ACVBhBDAi_A_A_A_ACSBnBFAi_z_A_AC$_fCP_A_A_A__ ___________________A_A_A_A_A_A_A_A_A_A_A_A_A_A____C$C$_A_A_A____ } # tile 277 (Oracle) { ________________________________CcCc____________________________ __________________________________Cc____________________________ ________________________________CcCvCx__________________________ ________________________________AYAwAY__________________________ ______________________________AYAwAwAwAY________________________ ____________________________AYAbCnCECiAwAO______________________ __________________________AwAYBk_HCi_HCT_AAYAY__________________ ________________________AwAw_ACNCiCnCiBLAY_A____________________ ______________________AwAwAY_AAOCiCiClAyAvAYAYAY________________ __________________CnCiAwAYAYApBICJCJCT_JBkAYAY__________________ ____________________CiCnAYCiBICn_J_I_JCgCiCiAYAY________________ ____________________CTCiCnCnBIBICnCVClClChCiCnCi________________ __________________ClClCiCn__CiCXCiClClChCiBnCnCiCn______________ ________________ClClCK__ClClCgCXCXBFCiCi__BI__BnCi______________ ____________ClCiCX____ClCnCi__CnCiBFCn____ApBIApBICO____________ __________CiCl______CiCiBdBd__CiCnApChAp____ApBnCnCnCP__________ __________Ci________________ClCgCmBnApBIAp________CiCn__________ ________________________ChCiChClCgCmChApApBI________CiCnCi______ ______________________ClCiCiCiCiChClChCXBF____________CiCn______ ____________________CiChCP__BICiCXCgCtChApAp____________________ __________________ClChCi__BIBIBFCnCnBFApBIBIAp__________________ ________________CPCiCi__BDBFCiBICn__BIBF________________________ ______________CPCnCP______CXChCiCn______________________________ ____________CiCXCg________CXCnCi________________________________ ________________________BkCXCl__________________________________ __________________________CXCiCM__CM____________________________ __________________________CMCMCjCM______________________________ _________________________A_ACtCl_A_A_A_A________________________ _____________________A_A_A_ACPCVCP_A_A_A_A_A____________________ _________________A_A_A_A_A_A_zClCiCJ_A_A_A_A_A_A________________ _____________________A_A_A_A_AClCJ_A_A_A_A______________________ _________________________A_zCiCl_A_A____________________________ } # tile 278 (aligned priest) { ________________________________________________________________ __CYCuCBBo________________________CQBKCQCQBKCQ__________________ __CuCiCBBo________________CnCnCnCTCTBKBlBKCQCQBlCQ______________ __CBCBBoCY______________CnClClCnCnCTBlCQBlBlBKBKBKBl____________ ____CBCpBz______________ClCnCnCnCnCTCnBKBKBKCQCQCQCQBl__________ ____CrCL________________BtCnCnBVCnBwCnBlBKCQCQBKBKBKBK__________ ____CrBZ______________BlCnCnCTCnCnCGCnCQCQBlBKCQCQCQCQ__________ ____CrCL____________CQBKCnCnCTCnCnCnCTBlBKBKCQCQBKBKBl__________ ____CrBb____________CQCQCnBVBVBVCnCTBnBKCQCQBKBKBKBl____________ ____CnCn__________AtBKBKCKCnCnCnCJCKBlBlBKBKCQBlCQAkAk__________ __CnCnCnCn________AtCQBnBKAWBjBVBnCQBKCQBKBlCQAkAkAkAk__________ __CnCnAtBC______BCBCAtBlBlBVBVAWCKBKBlAtCQBnAkAkBCAtAtAk________ __CnCnAtBCBCAtBCBCAtAtBlBlBlAWBnBKCQBlCQAkAkAkAtBCBCAtAk________ ____AtBCBCAtBCBCAtAkAtCQCQBKCrCQBKBlAtAkAkAkAkAtAtAtAkAtAW______ ____CrAtBCAtAtAWAtAkAkAtBCCsCtCrBQAtAWBpCZAtAkAWAWBCAtAtAW______ ____CrAtAtAtAkAkAkAWAWAkAtAkCrAtAkAWBpCZCZCZAtAWBCBCAtAkAW______ ____CrAkAkAtAkAWAtAV_FBCBCAk_AAtAkBpCZCZCZCZCZBCAtAtAkAkAV______ ____CrAkAtAkAtAVAWAW__AWBCAkCLAtBpCZCZCZCZCZCZBCBCAkAWAtAW______ ____CrCLAtAkAW_F______AtAtAkBbAtBpCZCnCnCnAtBCAtBCAkAtAWAW_B_A__ ____CrBb__AVAWAV______CLCLAkCLAtCLCLCnCnCVCVBCBCAtAkAkAW_A_A_A_A ____CrCL______________BZCLCtCrCLCLBZCnCVCmAtBCAtAtAkAtAV_B_A_A_A ____CrBZ______________AWCLCrCrCLCLCLCLCVCVBCAtAtAkAkAWAW_A_A_A_A ____CrCL____________AVAWAWAtCLAtAtAkAWCVCPCPAtAWAWAWAW_A_A_A_A_A ____CrBb_____________FAWAtAkBZAkAtAkAWAVCPBkBdAWAV_A_A_A_A_A_A_A ____CrCL____________AWAkAtAkCLAkAtAkAWAW_FBkBDBD_A_A_A_A_A_A_A_A ____CrBv_________A_AAVAkAtCLAkAtAkAkAWAkAWAV_A_A_A_A_A_A_A_A_A__ ____CrBz_______A_A_AAWAkAtBZAkAtAkAtAWAkAW_F_z_A_A_A_A_A_A_A____ ____CrCL_____A_A_z_FAVAkAtCLAkAtAkAtAWAkAWAVAW_A_A_A_A_A_A______ ____CrBZ___A_A_A_AAWAWAtAkBbAkAtAkAtAWAWAWAW_E_z_A_A_A_A________ ____CrCL_A_A_A_A_AAVAWAtAkCLAtAtAkAtAkAWAWAVAW_A_A_A_A_A________ ___A_ACL_A_A_A_A_A_AAkAtAkBvAtAtAkAtAkAWAW_A_A_A_A_A_A__________ _____A_A_A_A_A_A_A_A_A_A_A_B_A_A_A_A_A_A_A_A_A_A_A______________ } # tile 279 (high priest) { __________________________CBCbCB________________________________ ________________________CBCbCbCrCb______________________________ ______________________BNCBCbCBCrCBBN_________________n_i________ ______________________CBCbCrCrCLCLBN_______________i_r_i_i______ ______________________BNCBCBCBCLCBBN_______________r_i_n_i______ ______________________BNCBCbCBCLBN_________________n_n_i_n______ ________________________BNCbCBBNBN___________________n_r________ ________________________BNCi_zCi_A________________CrCLCLCL______ ________CBCB____________CTCnCnCiCn__________CuCu____CLBb________ ____CnCnCnCuCuCu________CTCnCnCiCn______CuCuCuCuCu__CLCnCT______ ____CnCnCnCTBwCuCuCuCr_Y_dCTCnCn_iCtCuCuCuCuCuCuCYCnCLCTCG______ ______AqCTCTBwCYCYCuCuCt_Y_d_d_d_d_YCtCuCuCYCYCYCYCTCLCL___A_A_A ______AqAqAqAqCBCBCYCYCs_d_Y_YCL_d_YCtCYCYCYCYCBCB_ACLBZ___A_A_A ______AqAqAqAqBoCBCBCBCBCs_d_dCr_d_d_dCrCBCBCBCBBo_ACLCL_A_A_A_A ______AqAqAqBoBoBoBoCBCBCr_Y_YCr_Y_Y_dCrBoBoBoBoBo_ACLCL_A_A_A_A ______AqAqAqBoBoBoBoBoBoCr_d_YCL_d_d_YCrBNBNBoBoBN_ACLBb_A_A_A_A ________AqAqBoBoBNBNBoBoCr_d_YCr_Y_d_YCr_ABNBNBNBN_ACLCL_A_A_A_A ________AqAqBoBNBN__BNBoCr_d_YCr_d_Y_YCr_A_ABNBNBN_ACLCL_A_A_A_A ________AqAqBNBN_____IBNCr_Y_YCL_Y_Y_YCr_A_A_ABN_A_ACLBZ_z_A_A_A __________BNBN_______I_GCr_Y_YCL_Y_Y_dCr_A_A_ABN_A_ACLCL_A_A_A__ __________BN________Cu_GCr_Y_Y_dCL_Y_dCr_A_A_A_A_A_ACLBb___A_A__ ____________________CBCuCr_d_Y_dCL_Y_YCr_A_A_A_A_A_ACLCL_A_A_A__ ____________________CBCBCr_d_Y_YCL_d_YCr_A_A_A_A_A__CLBv_B_A____ __________________CuCuCBCr_Y_YCL_d_Y_YCr_A_A_A_A____CLCL_A_A____ __________________CuCuCBCr_d_dCL_Y_Y_YCL_A_A_A_A____CLBb_z_A____ ________________CBCuCBCBCL_Y_YCL_Y_YCLBo_A_A_A______CLCL_A______ ______________CBCuCuCBCBCL_Y_Y_d_Y_dCLBoBN_A_A______CLBZ_z______ ____________CuCBCuCBCBBoBoCL_d_Y_d_YCLBoBN_A_A_A____CLCL_A______ _____________ACuCBBoCBBoBoCL_U_d_YCLBNBoBN_A_A_A_____A_A________ _____________A_ACBBoCBBoCBBoCLBbCLBoBNBo_A_A_A__________________ _______________A_A_A_ABoCB_A_A_A_ABoBN_A_A_A____________________ ___________________A_A_A_A_A_A_A_A_A_A_A_A______________________ } # tile 280 (soldier) { ___________________________u_u_r________________________________ _________________________x_u_u_r_n______________________________ _______________________x_u_u_r_r_n_i____________________________ _____________________x_x_u_u_r_r_n_i_i__________________________ _____________________x_u_u_u_r_r_n_n_i__________________________ ___________________x_x_u_A_A_A_A_A_A_i_________h_c_c_c_c________ ___h_h_h_h_h_h_____x_x_u_A_A_A_A_A_A_i_____c_h_c_c_c____________ ____AOAOAO_c_h_h_c_x_x_u_u_u_r_A_A_n_i_c_c_h_c_c________________ ______AOAOAO_c_h_h_h_c_u_u_u_r_A_A_n_i_c_h_c_c_r_r__________BJ__ ________AOAO_n_c_c_h_h_c_c_u_r_A_A_n_c_h_h_c_n_n_r_r_r__BdBdAj__ ___________u_u_n_c_c_h_c_c_c_r_A_A_n_c_h_c_c_i_iBkBkCPBkBdBdBJ__ _________x_u_r_n_n_c_c_c_c_c_c_c_c_c_c_c_XCPCPCmCPCVBkBkBdBdAl__ _______x_u_r_r_n_i_X_c_h_c_c_c_c_c_c_c_X_XCPCPCmCPCPBkCPBdBdBD__ _____x_u_u_r_n_i_i_X_c_h_c_c_c_c_c_c_c_X_XCPCPCmCPCPCPBkBdBdAl__ _____x_u_r_n_n_i_i_X_c_h_c_c_c_c_c_c_X_X_XCPCPCmCPCVCVCVBdBdBD__ ___x_u_r_r_n_i_i___X_c_h_c_c_c_c_c_X_X_X_XCPCPCVCVCVCPCPBdBdAl_A __AeAe_r_n_n_i_______Q_Q_c_c_c_c_c_X_Q_Q__CVCVCVCPCPBkBkBkBdBD_A __AeAeAe_n_i_i_______h_h_Q_Q_Q_Q_Q_Q_XCVCVCVCPCPCPCPCPBkBdBdAl_A __Ae_x_u_r_n_i_______h_h_h_c_c_c_cCVCVCVCPCPCPCmCPCPBkCPBdBdBD_A _____u_x_u_r_n_i___h_h_h_h_c_cCVCVCVCPCP_XCPCPCmCPCVBkBkBdBdAl_A _______u_x_u_r_n_i_h_h_h_hCVCVCVCPCP_X_X_XCPCPCmCPCPBkCPBdBdBD_A _________u_x_u_r_n_h_hCVCVCVCPCP_c_c_c_X_XCPCPCmCPCVBkBkBdBdAl_A ___________u_x_uBDBDCVCVCPCP_c_c_c_cAB_X_XCPCPCmCPCPBkCPBdBdBD_A _____________uAl_xBDBDCPAOAB_c_c_c_cAB_M_ACPCPCmCPCPCPBkBdBdAl_A _______________x_x_xBDBDAOAB_A_c_cAOAB_z_ACPCPCmCPCPBkBkBkBd_A_A _________________x_xAOAOAOAB_A_c_cAOABAB_ACPCPCmCPCPCPBkBd_A_A__ _____________________r_u_r_n_A_A_r_u_r_n_A_A_ACmCPCPBkBk_M_A_A__ _____________________r_u_r_n_A_A_r_u_r_n_A_A_A_A_A_A_M_z_A______ ___________________A_r_u_r_n_A_A_r_u_r_n_A_A_A_A_A_A_A_A________ _________________A_n_r_u_r_n_A_A_r_u_r_n_n_A_A_A_A_A_A__________ _______________A_A_r_u_u_n_n_n_A_r_r_r_r_n_n_A_A_A_A____________ _______________A_A_r_r_r_r_n_n_A_A_r_r_r_r_n_A_A_A______________ } # tile 281 (sergeant) { __________________________CMCMBy________________________________ ________________________CjCMCMByBa______________________________ ______________________CjCMCMByByBaBa____________________________ ____________________CjCjCMCMByByBaBaBa__________________________ ____________________CjCMCMCMByByBaBaBa__________________________ __________________CjCjCM_A_A_A_A_A_ABa________CjCMByByBy________ __CjCjCjCjCjCj____CjCjCM_A_A_A_A_A_ABa____CMCjCMByBy____________ ____AOAOAOCMCjCjCMCjCjCMCMCMBy_A_ABaBaCMCMCjCMBy________________ ______AOAOAOCMCjCjCjCMCMCMCMBy_A_ABaBaCMCjCMByByBy__________BJ__ ________AOAOBaCMCMCjCjCMCMCMBy_A_ABaCMCjCjByBaBaByByBy__BdBdAj__ __________CMCMBaCMCMCjCMCMCMBy_A_ABaCMCjCMByBaBaBkBkCPBkBdBdBJ__ ________CjCMByBaBaByByCMCMCMByByByByByCMBaCPCPCmCPCVBkBkBdBdAl__ ______CjCMByByBaBaBaByCjCMByByByByByCMBaAzCPCPCmCPCPBkCPBdBdBD__ ____CjCMCMByBaBaBaBaByCjCMByByByByByByBaBWCPCPCmCPCPCPBkBdBdAl__ ____CjCMByBaBaBaBaBaByCjCMCMByByByByBaBaAgCPCPCmCPCVCVCVBdBdBD__ __CjCMByByBaBaBa__BaByCjCMCMByByByBaBaAzAzCPCPCVCVCVCPCPBdBdAl_A __AeAeByBaBaBa______AcAcCMCMByByByBaAcAc__CVCVCVCPCPBkBkBkBdBD_A __AeAeAeBaBaBa______CjCjAcAcAcAcAcAcBaCVCVCVCPCPCPCPCPBkBdBdAl_A __AeCjCMByBaBa______CjCjCjByCMCMCMCVCVCVCPCPCPCmCPCPBkCPBdBdBD_A ____CMCjCMByBaBa__CjCjCjCjCMCMCVCVCVCPCPBaCPCPCmCPCVBkBkBdBdAl_A ______CMCjCMByBaBaCjCjCjCjCVCVCVCPCPBaBaBaCPCPCmCPCPBkCPBdBdBD_A ________CMCjCMByBaCjCjCVCVCVCPCPCMCMCMBaBaCPCPCmCPCVBkBkBdBdAl_A __________CMCjCMBDBDCVCVCPCPCMCMCMCMABBaBaCPCPCmCPCPBkCPBdBdBD_A ____________CMAlCjBDBDCPAOABCMCMCMCMAB_M_ACPCPCmCPCPCPBkBdBdAl_A ______________CjCjCjBDBDAOAB_ACMCMAOAB_z_ACPCPCmCPCPBkBkBkBd_A_A ________________CjCjAOAOAOAB_ACMCMAOABAB_ACPCPCmCPCPCPBkBd_A_A__ ____________________ByCMByBa_A_AByCMByBa_A_A_ACmCPCPBkBk_M_A_A__ ____________________ByCMByBa_A_AByCMByBa_A_A_A_A_A_A_M_z_A______ ___________________AByCMByBa_A_AByCMByBa_A_A_A_A_A_A_A_A________ _________________ABaByCMByBa_A_AByCMByBaBa_A_A_A_A_A_A__________ _______________A_AByCMCMBaBaBa_AByByByByBaBa_A_A_A_A____________ _______________A_AByByByByBaBa_A_AByByByByBa_A_A_A______________ } # tile 282 (lieutenant) { ___________________________g_g_f________________________________ _________________________k_g_g_f_b______________________________ _______________________k_g_g_f_f_b_a____________________________ _____________________k_k_g_g_f_f_b_a_a__________________________ _____________________k_g_g_g_f_f_b_b_a__________________________ ___________________k_k_g_A_A_A_A_A_A_a_________K_J_I_I_I________ ___K_K_K_K_K_K_____k_k_g_A_A_A_A_A_A_a_____J_K_J_I_I____________ ____AOAOAO_J_K_K_J_k_k_g_g_g_f_A_A_b_a_J_J_K_J_I________________ ______AOAOAO_J_K_K_K_J_g_g_g_f_A_A_b_a_J_K_J_I_f_f__________BJ__ ________AOAO_b_J_J_K_K_J_J_g_f_A_A_b_J_K_K_I_b_b_f_f_f__BdBdAj__ ___________g_g_b_J_J_K_J_J_J_f_A_A_b_J_K_J_I_a_aBkBkCPBkBdBdBJ__ _________k_g_f_b_b_I_I_J_J_J_I_I_I_I_I_J_HCPCPCmCPCVBkBkBdBdAl__ _______k_g_f_f_b_a_H_I_K_J_I_I_I_I_I_J_H_GCPCPCmCPCPBkCPBdBdBD__ _____k_g_g_f_b_a_a_H_I_K_J_I_I_I_I_I_I_H_GCPCPCmCPCPCPBkBdBdAl__ _____k_g_f_b_b_a_a_H_I_K_J_J_I_I_I_I_H_H_GCPCPCmCPCVCVCVBdBdBD__ ___k_g_f_f_b_a_a___H_I_K_J_J_I_I_I_H_H_G_GCPCPCVCVCVCPCPBdBdAl_A __AeAe_f_b_b_a_______E_E_J_J_I_I_I_H_E_E__CVCVCVCPCPBkBkBkBdBD_A __AeAeAe_b_a_a_______K_K_E_E_E_E_E_E_HCVCVCVCPCPCPCPCPBkBdBdAl_A __Ae_k_g_f_b_a_______K_K_K_I_J_J_JCVCVCVCPCPCPCmCPCPBkCPBdBdBD_A _____g_k_g_f_b_a___K_K_K_K_J_JCVCVCVCPCP_HCPCPCmCPCVBkBkBdBdAl_A _______g_k_g_f_b_a_K_K_K_KCVCVCVCPCP_H_H_HCPCPCmCPCPBkCPBdBdBD_A _________g_k_g_f_b_K_KCVCVCVCPCP_J_J_J_H_HCPCPCmCPCVBkBkBdBdAl_A ___________g_k_gBDBDCVCVCPCP_J_J_J_JAB_H_HCPCPCmCPCPBkCPBdBdBD_A _____________gAl_kBDBDCPAOAB_J_J_J_JAB_M_ACPCPCmCPCPCPBkBdBdAl_A _______________k_k_kBDBDAOAB_A_J_JAOAB_z_ACPCPCmCPCPBkBkBkBd_A_A _________________k_kAOAOAOAB_A_J_JAOABAB_ACPCPCmCPCPCPBkBd_A_A__ _____________________f_g_f_b_A_A_f_g_f_b_A_A_ACmCPCPBkBk_M_A_A__ _____________________f_g_f_b_A_A_f_g_f_b_A_A_A_A_A_A_M_z_A______ ___________________A_f_g_f_b_A_A_f_g_f_b_A_A_A_A_A_A_A_A________ _________________A_b_f_g_f_b_A_A_f_g_f_b_b_A_A_A_A_A_A__________ _______________A_A_f_g_g_b_b_b_A_f_f_f_f_b_b_A_A_A_A____________ _______________A_A_f_f_f_f_b_b_A_A_f_f_f_f_b_A_A_A______________ } # tile 283 (captain) { __________________________CaCaCD________________________________ ________________________CwCaCaCDBq______________________________ ______________________CwCaCaCDCDBqBP____________________________ ____________________CwCwCaCaCDCDBqBPBP__________________________ ____________________CwCaCaCaCDCDBqBqBP__________________________ __________________CwCwCa_A_A_A_A_A_ABP________CuCYCBCBCB________ __CuCuCuCuCuCu____CwCwCa_A_A_A_A_A_ABP____CYCuCYCBCB____________ ____AOAOAOCYCuCuCYCwCwCaCaCaCD_A_ABqBPCYCYCuCYCB________________ ______AOAOAOCYCuCuCuCYCaCaCaCD_A_ABqBPCYCuCYCBCDCD__________BJ__ ________AOAOBqCYCYCuCuCYCYCaCD_A_ABqCYCuCuCBBqBqCDCDCD__BdBdAj__ __________CaCaBqCYCYCuCYCYCYCD_A_ABqCYCuCYCBBPBPBkBkCPBkBdBdBJ__ ________CwCaCDBqBqCBCBCYCYCYCBCBCBCBCBCYBoCPCPCmCPCVBkBkBdBdAl__ ______CwCaCDCDBqBPBoCBCuCYCBCBCBCBCBCYBoBNCPCPCmCPCPBkCPBdBdBD__ ____CwCaCaCDBqBPBPBoCBCuCYCBCBCBCBCBCBBoBNCPCPCmCPCPCPBkBdBdAl__ ____CwCaCDBqBqBPBPBoCBCuCYCYCBCBCBCBBoBoBNCPCPCmCPCVCVCVBdBdBD__ __CwCaCDCDBqBPBP__BoCBCuCYCYCBCBCBBoBoBNBNCPCPCVCVCVCPCPBdBdAl_A __AeAeCDBqBqBP______ATATCYCYCBCBCBBoATAT__CVCVCVCPCPBkBkBkBdBD_A __AeAeAeBqBPBP______CuCuATATATATATATBoCVCVCVCPCPCPCPCPBkBdBdAl_A __AeCwCaCDBqBP______CuCuCuCBCYCYCYCVCVCVCPCPCPCmCPCPBkCPBdBdBD_A ____CaCwCaCDBqBP__CuCuCuCuCYCYCVCVCVCPCPBoCPCPCmCPCVBkBkBdBdAl_A ______CaCwCaCDBqBPCuCuCuCuCVCVCVCPCPBoBoBoCPCPCmCPCPBkCPBdBdBD_A ________CaCwCaCDBqCuCuCVCVCVCPCPCYCYCYBoBoCPCPCmCPCVBkBkBdBdAl_A __________CaCwCaBDBDCVCVCPCPCYCYCYCYABBoBoCPCPCmCPCPBkCPBdBdBD_A ____________CaAlCwBDBDCPAOABCYCYCYCYAB_M_ACPCPCmCPCPCPBkBdBdAl_A ______________CwCwCwBDBDAOAB_ACYCYAOAB_z_ACPCPCmCPCPBkBkBkBd_A_A ________________CwCwAOAOAOAB_ACYCYAOABAB_ACPCPCmCPCPCPBkBd_A_A__ ____________________CDCaCDBq_A_ACDCaCDBq_A_A_ACmCPCPBkBk_M_A_A__ ____________________CDCaCDBq_A_ACDCaCDBq_A_A_A_A_A_A_M_z_A______ ___________________ACDCaCDBq_A_ACDCaCDBq_A_A_A_A_A_A_A_A________ _________________ABqCDCaCDBq_A_ACDCaCDBqBq_A_A_A_A_A_A__________ _______________A_ACDCaCaBqBqBq_ACDCDCDCDBqBq_A_A_A_A____________ _______________A_ACDCDCDCDBqBq_A_ACDCDCDCDBq_A_A_A______________ } # tile 284 (watchman) { __________________C$C$__________________________________________ ____________C$______CmC$____________BwCJBw______________________ ____________C$BDBk__CPC$__________BwCJBXBX______________________ ____________BDCPBXBnCPC$__________CnCnBwBX______________________ ______________CPBDCJCmC$__________ClClCnBX______________________ ______________BnAeAjC$___________qCiCiCn________________________ ______________CJAeCPC$_________qClCiCTBc_m_q_h__________________ ______________CPAlC$________Bk_tCTClBk_m_t_m_hBk________________ ________________CP________BkCV_q_mBmBb_t_q_hCPCVBk______________ ________________Bn__________Ax_h_q_q_m_mBJAlAxBXBw______________ ________________CJ__________AxBd_m_h_hBJBlBJAxBwCJBX____________ ________________CP__________BXBkBdAlBDBkBdAlAxCgCJBX____________ __________________Bk______BwBXAxCoBdCPBdAlAlAxCJBXBw____________ __________________Bk______BwCJBXBdCPBdBkBD_qBXCJCgBw____________ __________________BnCJBwBXCgBwAZ_hBdBkBD_t_hBXBwCJCgBX__________ __________________CiClCTBXCJBXAZ_h_t_t_q_hBJAZBwCJCJBX__________ __________________ClCgCTBXBw__AxBJAj_q_h_cAlAZ__CgCJBw__________ ____________________CJBXCJ____AxBdCmBJ_t_mAlAZ__BwBwBX__________ ____________________Bk______AxAZBkBdCP_t_mAlAZ__ClCT____________ ____________________CP______AxAZBdCmBd_t_qBDAx__ClCn____________ ______________________Bk____BXAZCPBdBkBd_tAlAx__Ci______________ ______________________Bn____BXAZBDCPBdBlBJAZBXAZ________________ ______________________CJ____AxBXAZBdBkBJAZAZAxBX________________ ______________________Bk____AxAxAZBkBdAl__BXAZBX________________ ______________________CP__AxBXAZAZBDAl____AxAZAx________________ ________________________CPAxAZAZAZ________AZAZAx________________ ________________________CPBjBkBc____________BjBmBc______________ ________________________CPCOBzBc____________BcCTBc______________ __________________________COBc______________BcCOBjBc____________ ________________________COBkBc________________BmCOCOBc__________ ______________________BjCNBc__________________BjBcBcBc__________ ________________________________________________________________ } # tile 285 (watch captain) { __________________C$C$__________________________________________ ____________C$______CmC$____________BwCJBw______________________ ____________C$BDBk__CPC$__________BwCJBXBX______________________ ____________BDCPBXBnCPC$__________CnCnBwBX______________________ ______________CPBDCJCmC$__________ClClCnBX______________________ ______________BnAeAjC$__________CxCiCiCn________________________ ______________CJAeCPC$________CbClCiCTBcCECbBr__________________ ______________CPAlC$________BkCxCTClBkCECxCEBrBk________________ ________________CP________BkCVCbB$BjBjCxCbBrCPCVBk______________ ________________Bn__________AxBrCbCbCECEBJAlAxBXBw______________ ________________CJ__________AxBdCEBrBrAjBkBDAxBwCJBX____________ ________________CP__________BXBkBdBJAjCJBdAlAxCgCJBX____________ __________________Bk______BwBXAxCmBdCPBdAlAjAxCJBXBw____________ __________________Bk______BwCJBXBdCPBdBkBJCbBXCJCgBw____________ __________________BnCJBwBXCgBwAZBrBdBkBDCxBrBXBwCJCgBX__________ __________________CiClCTBXCJBXAZBrCxCxCbBrBJAZBwCJCJBX__________ __________________ClCgCTBXBw__AxBDAlCbBrBRAlAZ__CgCJBw__________ ____________________CJBXCJ____AxBdCmBDCxCEAjAZ__BwBwBX__________ ____________________Bk______AxAZBkBdCPCxCEAlAZ__ClCT____________ ____________________CP______AxAZBdCmBdCxCbBJAx__ClCn____________ ______________________Bk____BXAZCPBdBkBdCxAlAx__Cg______________ ______________________Bn____BXAZBDCPBdBlBJAZBXAZ________________ ______________________CJ____AxBXAZBdBkBJAZAZAxBX________________ ______________________Bk____AxAxAZBkBdAl__BXAZBX________________ ______________________CP__AxBXAZAZBDAl____AxAZAx________________ ________________________CPAxAZAZAZ________AZAZAx________________ ________________________CPBjBkBc____________BjBmBc______________ ________________________CPCOBzBc____________BcCTBc______________ __________________________COBc______________BcCOBjBc____________ ________________________COBkBc________________BmCOCOBc__________ ______________________BjCNBc__________________BjBcBcBc__________ ________________________________________________________________ } # tile 286 (Medusa) { ________________________________________________________________ _______d_d_______d_d_d_d_d___________A_A_d_d_d_d________________ _____d_dBN_d_d_d_O_O_O_O_O_d_______A_d_d_O_O_O_O_d_d____________ _____d_d_O_O_O_O_O_______O_O_O___A_d_O_O_________O_d_d__________ ___________________________d_O_A_d_O_A_____________O_d_d_d______ _______________d_d_d_d_____d_O_d_O_A___O_d_d_d_d_____O_dBN_d____ _____d_d_d_d_d_d_O_O_O_d_d_O_O_d_O_O_O_O_O_O_O_O_d_d___O_O_O____ ___d_dBN_O_O_O_O_______O_O_O_f_k_f_a_A_O_________O_d_d__________ ___d_O_O___________d_d_d_f_k_k_f_f_a_a_O_d_________O_d_d________ _____________d_d_O_O_O_fBNCu_k_f_fCuBN_A_O_d_d_______O_dBN______ ___________d_d_O_O___d_f_kCuBN_fBNCu_a___A_O_O_d______BN_d_O____ _________d_d_O_____d_O_k_k_k_k_f_f_a_a_O_____O_O_d_______O______ _____dBN_d_O_______d_O_k_k_k_kBN_f_a_a_O_d_____O_O_d____________ _____d_d_O_______d_O___A_k_kBNBNBN_a___O_O_d_____O_O_d__________ _______________d_d_O_A___f_k_f_f_f_a_A___O_O_d_____OBN_d________ _____________d_d_O______As_f_f_a_aAV_______O_d_______O_O________ ___________dBN_O____AsAsAsAV_f_a_aAVAV_____OBN_d________________ ___________O_O____AsAsAsAsAVAVAVAVAVAVAV_____O_O________________ ________________AsAsAsAsAsAVAVAVAVA_AVAVAV______________________ ______________AsAsAsAsAsAVAsAVAVAVA_AVAVAVAV____________________ _____________kA_AsAsAsAsAsAsAVAVA_AVAVAVAVAVAV___A_A_A_A_A______ ___________k_f_fA_AsAs__AVAsAVAVA_AVA_AVAVAVAVAV_A_A_A_A_A_A_A__ _________k_k_fA_A_As____AVAsAVAVA_AVAVA_AVA_AVAV_A_A_A_A_A_A_A__ ___________fA_A_As____AsAsAVAsAVA_AVA_AVA__a_fAV_A_A_A_A_A_A____ ____________A_A_As____AsAsAVAsAVA_AVA__AAVA__fAV_A_A_A_A_A_A____ ______________A_______AsAsAVAsAVAVA_A__A_AAVA__A_A_A_A_A_A_A____ ______________A_______AsAsAVAsAVAVA_A__A_AAVA__A_A_A_A_A________ ____________________AsAsAVAsAVAVA_AVA_A__AAV_A_A_A_A_A__________ ____________________AsAVAsAVAVAVA_AVA_A__A_A_A_A_A______________ ___________________AAsAVAsAVAVAVA_AVA__A_A_A_A_A________________ ___________________A_AAVAsAVAVAVA_A__A_A_A_A_A__________________ _____________________A_A_A_A_A_A_A_A_A_A_A______________________ } # tile 287 (Wizard of Yendor) { ______BP________As__________BqAsBPBPAsAs__________Bq______AsBq__ ______BPBPBq____As______Bq__AsAsBP_G_GAsBqBq____BPBq____BP__CDBP ____BP__BPBq____AsBq____Bq__BPAs_H_G_FBPBqAs__AsBPBq__As__BqCD__ __BPBPBq__Bq__AsBPBq____AsAsBP_H_G_G_F_FAsBP____BqBPBqAsBPBqCDBP __BPBqCDBPBq__AsBP__As__AsBP_H_H_G_F_F_F_FBq__AsBqAs__AsBPBqCDBq BPBPBqCDBqCD__BPBPBqAsAsAsBP_H_GABABAB_F_FBqAsAsAsBPAsBPBqCDCDCD BPBqCDCDBqCDAsBPBPBPBPBPAsBP_HABByABByAB_FBPBqAsBqBPAsBPBqCDCiCT BPBqCnCiCDBqBPAsAsBPCrCL_G_G_HABABABABAB_F_G_HCrCLBPBPBP_HCnCTCT BPCiCnCTCnBqBPAsAsCL_G_GCL_G_GABBkCPBkAO_F_HCL_G_G_G_H_HCiCTCDCT CTCTCDCTCTCT_H_G_H_G_H_G_FCL_GCPBkCVBkBk_FCL_G_G_G_G_G_HCTCTBqBq BPCDCTCDCTCT_H_H_G_G_H_F_GBZ_GBkCPBmBxBmCLBZ_G_H_F_H_G_HCTAKBqAs BPBqCDBqAK_M_H_G_F_G_H_F_G_FCVBkCVBkBkCKBk_H_F_G_F_H_G_H_z_MBPAs __BPBqBq_M_z_H_G_F_G_G_F_G_HCPCPCJCPBkBkBk_G_F_G_F_G_G_HAB_MBPAs ____AsBP_MAB_H_G_G_F_G_G_F_GCPCPBnCPBkBkCP_F_F_G_G_F_G_F_z_GBPAs ____AsBP_H_z_H_G_F_G_F_F_G_FCLCPCPBkBkBmCL_F_G_F_G_F_G_G_O_GAsAs ____AsBP_G_O_H_G_F_F_G_F_F_GCLBkCPCOBlCJBb_F_G_G_F_G_F_G_GBPAsAs ______AsBP_H_F_G_F_F_FAsBpCCCr_GCPBkBkCPBv_F_F_F_F_F_F_F_FAsAs__ __________BP_G_FAsBPAsBPBpCCCCBpBkCVBlBpBOArBPAsAsBP_F_FAsAs____ ________AsAsBPBPAsAsAsBP_GCCCCBpBkCVBOBOArBPAsAsAsBPAsBPBPAs____ ____________AsAsAsAsAsAs_H_H_FBpBpBOBOBO_FBPAs__AsAsAsBPAs______ ____________AsBP__AsBPBP_H_F_F_G_GBZ_G_F_F_GBPAs________________ ______________BPAsAsAs_G_H_F_G_H_FBZ_G_F_F_GBPAs__BP____________ ____________Bq__AsBPBP_G_H_F_G_H_FBZ_H_F_G_FBPBPAsBP___A_A_A____ __________BPBq____BP_H_H_F_G_G_H_FBZ_G_F_G_F_FBPAV_A_A_A_A_A_A__ __________BP____AsBP_G_H_F_G_G_H_FBZ_H_F_G_F_FBPBP_A_A_A_A_A_A__ __________BPBP__BPBP_G_H_F_G_H_H_FBZ_H_F_G_F_FAsAs_A_A_A_A_A_A__ __________BPBqAsBP_G_H_H_F_G_H_FBZ_G_G_G_F_F_FAsAsAs_A_A_A_A____ ____________BqBP_G_H_H_FB__G_H_FBZ_G_G_G_F_G_FAsBPAs_A_A_A______ ______________BP_H_H_FB_B__G_H_FBZ_F_G_G_F_G_FBPAs_A_A_A________ ______________AsBZCL_FB__G_G_FBZB_B_BZCLCL_G_FBZAsAs_A_A________ ______________AVAsCLBZB_B_BZCLCL_A_A_A_A_ABZBZAs_A_A_A__________ ________________AV_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A______________ } # tile 288 (Croesus) { __Cf____Cf____Cf______________CjCj______________________________ __Cj____Cj____Cj________CjCYCjCBCBCjCpCj________________________ __Cf____Cf____CfCj______CjCjCjCjCjCjCjCj________________________ __CjCf__CjCf__BcCf______C$CnCnCnCnCnCnC$________________________ ____Cf____CuBcCjCf______CnCn_$CnCnAACnCn________________________ ____CfCjCuCuCuCf________CVCnCnCiCiCnCnCo________________________ __________Cu______________CoCoCnCiCoCoCo________________________ __________Cu__________CwCDCoCoCoCoCoCoCDCDCwCw__________________ ________CiCf________CwCwCwCDCDCoCoCoCDCwCwCwCwCwCwBJ____________ ______CnBsCjCi____CwCwCnCPCPCwCDCoCDCwCPCPCnCnCnCwCw____________ ______CiCiCnCn__CwCnCnCiCnCPCPCHCjCHCPCPCnCiCnCnCnCw____________ ______CiCnCnBWCwCnCiCnCiCnCiCnCjCjCjCnCnCiCiCnCnCiCnBD__________ ________CiCnCnCiCnCiCnCiCnCiCnCiCjCiCiCiCnCnCnCnCiCnCn__________ ________CnCfCnCiCnCTCnCiCiCnCiCiCjCiCnCnCnCnCTCnCnCnCiCn________ ________CnCjCnCnCiCTCGCUCnCiCnCnCnCnCnCnCnCTCGCTCTCTCiCn________ ________CnCfCnCnCnCUBwCTCnCnCnCnCTCnCnCnCTCGBzCGCnCiCnCn________ ________CnCjCnCnCT____CGCTCTCTCTCTCTCTCTCTBj__CnCnCiCnCn________ ________CnCfCnCn_b_b__BzCTCnCiCnCTCiCnCnCTCGCnCiCnCiCnCL________ ______CwCnCjCn_b_b_b____CGCTCTCTCTCTCnCTCnCnCnCnCiCnCUCw________ ______CwAmCf_b_bAm_b____BzCiCiCnCnCnCnCnBzCnCnCiCnAkCwCw________ ______CwAmCj_KAmAm_K_b_bCGCTCTCTCTCTCnCTCnCnCiCnAkAmBKCwCw______ ____CeCwAmCfAmAmAm_K_b_bCCCCCCCCCCCCCCCCCnCnCn_cAmAmAmCwCw______ ____CwCwAmCjAm_KAm_JBCCCCCCCCCCZCCCCCZCCCZCCCGAkAmAmAmAtCw______ ____CwCwAmCfAm_KAm_JAtCCCCCCCZCCCCCZCCCCCCCZCC_HAkAmAmBQCwCw____ ____CwCwAmCjAm_KAmBCCCCZCZCZCCCZCCCCCZCCCZCCCvCv_HAmAmAmBCCw____ ____CwCw__CfAm_KAm_bCCCZCCCZCZCC_b_JCCCZCCCCCwCvAtAmAmAmBCCw____ ____CeCw__CfAm_KAmBQCCCZCCCZCCCZ_b_bCCCZCZCCCwCvAWBQAmAmAtCw____ ______CwCwCjAm_KAmCCCZCvCZCCCC_b_H_b_bCZCCCCCZCwCZBQAmAmBCCw____ ______CwCwCf_b_b_KCCCZCvCCCZCC_b_bAk_bBOCZCCCCCZCv_JAmAmAtCw____ ________CwCjCe_bAkAK_MCvCCCCCvAkAt_JAtCZCZCCCZCZ_M_MBC_JBQCw____ __________CfCeCeAA_B_z_zCCCZ_bAt_b_b_bAkBpCCCZ_M_$AA_MAtCw______ _________$Cj_$A__M_z_z_z_z_MAyBDBDBdBdBDAx_z_z_z_z_$_MBDBJBD____ } # tile 290 (ghost) { ________________________________________________________________ ________________________________________________________________ ________________________________CP__CP__CP______________________ ______________________________CP__CP__CP__CP____________________ ____________________________CP__CJ__Bk__CP__CP__________________ __________________________CP__CP__Bk__Bk__CJ__Bk________________ ____________________________CJ__Bk__Al__Al__Al__________________ __________________________CP__Bn__AlCBCB__CBCB__________________ ________________________CP__Bk__Bk__CBCBAlCBCB__________________ __________________________CJ__Bk__Al__Al__Al____________________ ________________________CP__Bn__Bk__Al__Al__Al__________________ ______________________CP__Bk__Bk__Bk__Al__Al____________________ ________________________CP__Bk__Bk__Bk__Bk__CP__CP______________ ______________________CP__CP__CP__Bk__Bk__Bk__CP__CP__CP________ ____________________CP__CP__CP__CP__Bk__Bk__Bk__Bk__CP__CP______ ______________________CP__CP__CJ__CP__CP__Bk__Bk__Bk__CP__CP____ ____________________CP__CP__Bk__CP__CP__CP__Bk__CP__Bk__Bk______ __________________CP__CP__Bk__Bk__Bk__CP__CP__Bk__CJ__Bk__Bk____ ________________CP__CP__Bk__Bk__Bk__CP__CP__Bk__Bk__Bk__________ __________________CP__CJ__CJ__CJ__Bk__Bk__Bk__Bk__Bk__Bk________ ________________CP__Bk__Bk__Bk__Bn__CJ__Bk______Bk______________ ______________CP__CP__Bk__Bk__CJ__Bk__CJ__Bk__Bk__Bk____________ ____________CP__CP__Bk__Bk______Bk__Bk__________Bk______________ __________CP__Bk__CJ__Bk__Bk______Bk__Bk________________________ ________CP__Bk__Bk__Bk__________Bk______________________________ ______CP__Bk__Bk______Bk__________CP____________________________ ________Bk______Bk__Bk__________________________________________ ______Bk__Bk____________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 291 (shade) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ___________________________A_A_A________________________________ _________________________A_A_A_A_A______________________________ _______________________A_A_A_A_A_A_A____________________________ _______________________A_A_A_A_A_A_A____________________________ _______________________A_A_A_A_A_A_A____________________________ _______________________A_A_A_A_A_A_A____________________________ _________________________A_A_A_A_A______________________________ _______________________A_A_A_A_A_A_A____________________________ __________________AA_M_M_A_A_A_A_AAA_M_M________________________ _________________MA__MAK_M_MAA_MA__MA_AA_M______________________ ______________ABABABAB_M_$_MA__MAA_MABABABAB____________________ ______________ABABABABABABABABABABABABABABAB____________________ ____________AOAOABAB__ABABABABABABAB__ABABAOAO__________________ ____________AOAOAOAe__AOABABABABABAO____AOAOAO__________________ ____________AOAOAO____AOAOAOAOAOAOAO____AOAOAOAO________________ ____________AOAOAO____AOAOAOAOAOAOAO______AOAOAO________________ ____________AOAeAO____AOAOAOAOAOAOAO______AOAOAO________________ ____________AOAOAe____AOAOAOAOAOAOAO______AOAOAO________________ ____________Ae__AO____AeAOAO__AOAOAeAe______AO__________________ ______________Ae______AeAeAe__AeAeAe______AO__AO__Ae____________ ______________Ae______AeAeAe__AeAeAeAe____AeAe__________________ ________Ae__Ae__Ae__Ae__Ae__AeAeAeAe__Ae__Ae__Ae________________ ________________Ae__AeAeAeAe__AeAe____Ae__________Ae____________ ____________Ae______AeAe__Ae__Ae__Ae______Ae____________________ ____________________Ae__AeAe__AeAe__Ae__________________________ __________________Ae__AeAe____Ae____AeAe________________________ ____________________Ae____Ae____Ae____Ae________________________ __________________Ae__Ae________________________________________ ______________________________Ae________________________________ } # tile 292 (water demon) { ______________________________CDCDCDCDCDCD______________________ _________________________K_I_I_H______CDCDCDCD__________________ _______________________K_K_I_I_I_H_H______CDCDCDCD______________ _____________________k_k_I_I_k_k_I_H_H________CDCDCDCD__________ _____________________K_k_I_I_k_I_I_I_H____________CDCD__________ _____________________I_I_I_I_I_I_I_I_H__________________________ ___________________K_K_K_K_K_K_K_I_H_G__________________________ ___________________K_K_K_K_K_K_I_H_G_G__________________________ _____________________I_I_I_I_I_H_G_G_______I_K_I_I______________ _______I_I_K_I_I_I_______H_H_G_G_G_G_K_K_I_I_K_K_I_I____________ _______I_K_K_I_I_I_I_H_H_H_H_H_H_H_K_I_I_I_K_K_K_I_I_I__________ _____I_I_K_K_K_I_I_H_I_I_I_I_I_I_I_I_I_I_K_K_K_I_I_I_H__________ _____I_I_I_K_K_I_I_H_I_I_I_I_K_K_K_K_K_K_K_K_I_I_I_H_G__________ _____H_I_I_I_K_K_I_I_H_H_K_K_K_K_I_I_I_I_I_I_I_I_H_G_G__________ _____H_H_I_I_I_I_K_K_I_I_G_G_G_I_I_I_I_I_I_I_I_H_G_G____________ _______H_H_I_I_I_I_I_I_I_I_I_H_G_G_G_H_H_H_H_G_G_G_A_A_A_A_A_A__ _________H_H_H_H_I_I_I_I_I_I_I_I_H_G_G_G_G_G_G_G_A_A_A_A_A_A_A_A _____________H_H_H_H_H_H_H_H_H_G_G_G_G_I_I_H_G_A_A_A_A_A_A_A_A_A _________________G_G_G_G_G_G_I_I_I_I_I_I_I_H_G_A_A_A_A_A_A_A_A_A ___________________K_K_K_K_I_I_I_I_I_I_I_I_H_A_A_A_A_A_A_A_A_A__ _____________________I_I_I_K_I_H_H_H_H_G_G_G_A_A_A_A_A_A_A_A_A__ _______________________K_I_I_K_I_I_I_I_I_H_H_A_A_A_A_A_A_A_A____ _______________________K_K_K_I_I_I_H_H_G_G_A_A_A_A_A_A_A_A______ _________________________I_I_K_I_I_I_I_I_H_A_A_A_A_A_A_A________ ___________________________I_K_K_I_I_I_I_H_G_A_A_A_A_A_A________ _____________________________K_K_K_K_I_I_I_H_A_A_A_A_A_A________ _______________________________I_I_K_H_H_G_G_G_A_A_A_A_A________ ___________________________________K_K_K_I_I_H_G_A_A_A_A________ ___________________________________A_I_K_K_H_I_I_G_G_A_A_A______ ___________________________________A_A_A_K_K_K_I_H_H_H_H_H_A____ _____________________________________A_A_A_A_A_K_K_I_I_H_H_H_H_A _________________________________________A_A_A_A_A_A_A_A_A_A_A__ } # tile 293 (horned devil) { ____CQ______________________________________________________Al__ ____CQ______________________________________________________Al__ ____CQ______________________________________________________Al__ ____CQCQ__________________________________________________BDAl__ ____BlBlCQ____BRBR______________________________BRAr____AmBDAl__ ______CQCQ__BRArBoBR__________________________BRArBRAr__BDAl____ ______BlBlCQArArArBo____CQ______________CQ____BRArArBRBDAmAl____ ________BlCQCQArArBoCE__CQCQ__________BlBl__BoBRArArAmAjAl______ ________BKBlBlCQBlBKBoCEBRBlBR______BRBlBRBoBRBlBlBKBDBYAl______ ______BRArBKBlBlBlBlBKBDBoBRBRBRBRBRBRBRBoCQCKBlBKBDAmAlArAr____ ______BRArArBKBKBlBKBKBKAmBRBRBRBRBRBRBoCQCQBABKBKAjAlArArBR____ ______BR____ArBDBKBKBKBDBDAlBRBoBoBoBRBKBlBlBKBKBYAlAr____BR____ ______________ArAmBDAmAjAlAlBoCECECEBoBDBKBKBDAmAlAr____________ ______________BoBoBRAlAlAlAlBoCxCxCxBoAlBDAmAlBoBRBR____________ __CECECQBo________BoBRCEAlBoCECxCxCxCEBoAlCEBoBR________BKBoBR__ CEBnBoCQBoBo__CEBoBRBRCECxCxCPCVCVCVCPCxCxBoBRBRBRBR__BoBKArBKAr BoBKArArBoBnCEBo__BRBRCEBRCP_ACmCmCm_ACPBRBoBR____BRBKBRArArBKAr CQArBRBRBlBK____BRCEBoArBRCV_A_ACm_A_ABnArBRBoBR____BlBKArArArBK CQBRBRBRBoBRBRBRCEBoArArArBRCVCmCmCVCPBRArArArBoBRBRBRArArArArBD ______BRBRBoBoBRBoAr____ArArBRCV_ACPBRArAr__ArArBRArArArAr______ __________BRBRArAr________BRArArBoArArAr_A____ArArArAr_______A_A ____________________BRBR____BRBRArBRAr_A_A_A_____________A_A_A__ __________________BR____ArBoArArArArArAr_A_AArBRBR_A_A_A_A_A____ ________________BR______CEBoBRArArArArBRArArAr_A_ABR_A_A_A______ ________________Ar____CEBoBRArArArArBRBoBRAr_A_A_A_ABR_A_A______ __________________ArBoBoBRAr_A_AAr_A_ABRBoBRAr_A_A_AAr_A________ __________________ArBRBRBR_A_A_A_AArAr_ABRBRAr_A_AAr_A_A________ ________________Ar____BRBRAr_A_A_A_A_ABRBRAr_A_A_AAr_A_A________ ________________________BoBRAr_A_A_ABoBRAr_A_A_A_A_AAr_A_A______ __________________CQCQBoBRBRAr_A_A_ABRBRBRBRCQBK_A_A_A_A________ ________________CQBlBRBRBRAr_A_A_____ABRBRBRBRBlBK_A_A__________ _____________________A_A_A_A_A_________A_A_A_A_B_A_A____________ } # tile 294 (succubus) { ________________________________________CrCrCrCr________________ __________________________________CxCbCrCrCsCsCrCr______________ ________________BrBR____________CxCECECsCsCrCrCnCr______________ ________________Br________Br__CxCxCx__CsCsCrCnCn________________ ______________BrBRBR______Br__CxCn__CsCsCrCsCnCn________________ ____________BrBRBRCQBR____BrBrBRCTCTCrCrCrCsCnCT________________ ____________BrBjBRCQBRBR____BrBRBRCTCrCsCrCsBwCr________________ __________BrCQCQBRCQCQBRBR__BrBlBRBRCsCsCrCrCTCfCr______________ __________BrCQBlBRCQCQCQCQBRBrBlBRBRCsCrCsCrCnCTCr______________ __________BrCQCQBRCQCQCQCQCQBrBlBRBlBRCfCsCsCnCiCTCr____________ ________BrCQCQBlBRBRCQBlCQBrBrBlBRBlBRBRCfCrCnCnCnCf____________ ________BrCQCQBlCQBRCQCQBlBrBlBlBRBlBlBlCfCnCnCTCnCn____________ ________BrCQCQCQBlBRCQBlCQBrBlBlBRBlCQBlCfCnCTCGCTCn____________ ________BrCQCQBlCQBRCQCQBlBrBlBlBRBlBlCfCsCnCT__CTCxCb_____A_A__ ________BrCQCQCQBlBRCQCQCQBrBlBlBRCQBlCsCsCnCT__CECbCE_A_A_A_A_A ______BrCQCQCQBlCQBRBRCQBlBrBlCQBRCQCrCrCnCiCn__CxCE_A_A_A_A_A_A ______BrCQCQCQCQBlCQBRCQCQBrBlBlBRBlCrCTCiCnCnCxCE_A_A_A_A_A_A_A ______BrCQCQCQBlCQBlBRCQBlBrBlCQBRCnCiCTCnCnCxCE_____A_A_A_A_A_A ______BrCQCQCQBlCQBlBRCQCQBrBlBl__CnCnCTCGCnCxCx_____A_A_A_A_A_A ______BrCQCQBlCQBlCQBR____BrBl____CnCTCTBzBwCnCT___A_A_A_A_A_A__ ______BrCQCQCQBlCQ__BR____BrBl____CnCTCT__CTCnCT_A_A_A_A_A_A_A__ ______BrCQCQCQBl__________BrBl____CnCT____CnCnCT_A_A_A_A_A_A_A__ ______BrCQCQBlCQ__________BrBl____CxCT____CTCnCnCx_A_A_A_A_A____ ________BrCQCQ____________BrBl____CxCE____CTCnCbCx___A_A_A______ ________BrCQ______________BrBl____CbCE___A_ACECbCx___A_A_A______ ________BrCQ______________Br____CxCbCE_A_A_ACECbCx___A_A________ ________Br________________Br____CxCE_A_A_A_ACECbCx_A_A_A________ __________________________Br____CbCE_A_A_A____CECb_A_A__________ ________________________________CbCE_A_A______CECb_A_A__________ _________________________________A_A_A_A_____ACECbCx_A_A________ _____________________________________________A_ACECbCx_A________ _______________________________________________A_A_A_A__________ } # tile 295 (incubus) { BoBo____________________________________________________________ ATBoBo__________________CjCjCjCj____________________________BoBo ATATBoBo______________CjCjCjCjCMCj________________________BoBoAT ATATATBoBoBo________CjCMCjCnCjCjCjCj__________________BoBoBoATAT __ATATATATATBoBo____CjCMCnCiCjCjCjCjCj__________BNBoBoBoATATATAT __ATATATATATBoBo____CMCMC$_$CiCjCjCjCMCj__________BoBoATATATATAT __ATATATATBoATBo____CMCMCiCnCiCiCjCjCjCjCj________BoBoBoATATAT__ __ATATATBoATATBo____CMCMCnCiCiCnCiCuCuCMCjCj____BoBoATBoATATAT__ ____ATATBoATATBo____CMCMCiACAC_cACCuCuCuCMCMCM__BoATATBoBoATAT__ ____ATBoATATATBoBo__CMCMCMCTCTCTCnCiCuCuCMCj__BoBoATATATBoATAT__ ____ATBoATATATATBoBo__CMCaCaBwCaCiCnAsCM____BoBoATATATATBoATAT__ ____ATBoATATATATATBoCaCaBqBqCaBqBqAsBqAsBoBoBoATATATATATBoBo____ ____ATBoATATATATATCaCaBqBqCaBqBqAsBqCaBqAsATATATATATATATATBo____ ______BoATAT______CaBqCaCaBqBqAsBqAsCaBqAs________ATATATATBo____ ______BoAT________CaCaCaBqBqCTCaCaCaCaBqAs____________ATATBo____ ______Bo__________CaCaBqBqCTCTBqBqBqBqAsAs________________Bo____ ____________________BqAsAsBwCGAsAsAsAsAs________________________ ______________________CaCaBqBqAsBqBqAsAs________________________ ______________________CaCaBqBqAsBqBqBqAs_A_A_A_A_A_______A_A_A__ ____________________CaCaBqBqBqAsBqBqBqAsAs_A_A_A_A_A_A_A_A_A_A__ ____________________CaCaBqBqAsAsBqBqBqAsAs_A_A_A_A_A_A_A_A_A_A__ ________________________BqAsAs__AsAsAs_A_A_A_A_A_A_A_A_A_A_A_A__ ________________________CaBqAs__CaBqAs_A_A_A_A_A_A_A_A_A_A_A_A_A ________________________CaBqAs__CaBqAs_A_A_A_A_A_A_A_A_A_A_A_A_A ________________________CaBqAs__CaBqAs_A_A_A_A_A_A_A_A_A_A_A_A_A ________________________CaBqAs_ACaBqAs_A_A_A_A_A_A_A_A_A_A_A_A_A ________________________CaBqAs_ACaBqAs_A_A_A_A_A_A_A___A_A_A_A_A ________________________CaBqAs_ACaBqAs_A_A_A_A_A_________A_A_A_A ________________________CaBqAs_ACaBqAs_A_A_A_A_______________A_A ______________________BqBqAs_ABqBqAsAs_A_A_A____________________ ______________________AsAsAs_AAsAsAs_A_A_A______________________ _______________________A_A_A_A_A_A_A_A_A________________________ } # tile 296 (erinys) { ______________________________BJAjAl__________C$C$______________ ____________C$C$C$__________AlAlAlAlBJAl__C$CVC$CVC$C$__________ __________C$CVC$CPC$______BDAlCiCnCnAlAlBJCVCPCVC$CPC$__________ ________C$CoCPCPCPCPC$____AlCnBoCiBNCnAlAlAlAlBnCJBnCVC$________ ______C$CPCVBkC$CVC$CVC$__AeCnCnCiCnCnAlBDAlAlAlBJCPCJC$________ ______C$C$CVCPCVC$CPCPC$C$AlCTCiCnCnBwAlAlAlBJCKAlAjAlCVC$______ ____C$CPCoCPCoCPC$CPCPClCnCiCnCnCnCTCnCiBJAjAlAlBJCPBlCVC$______ ____CoCPCPCPCPCPCPCPCiCiCnCnCnCnCTCiCnCnCiCnBJAlBlCPCXC$CP______ __C$CVC$CVC$AeAeAOABAKCnCTCuCuCTCnCTCuCuCnCiCnAlBJAlBnCoCVCV____ __C$CPCPCVAlAeAeAOABABABCBCuCiCuCTCBCuCiCuCnCnCnBnCVCJCPCVC$____ C$CVC$CPAeAlAeC$C$CmABABABCYCuCuCBCYCuCuCYCTCnCiCVCPC$CVCPCo____ C$CVC$CVAlAlC$_FCm_FCPABABCBCYCYCBCYCYCBBNCGCnCnCnC$CVBkCPCV____ CVC$CPCPAOAlC$C$CmCmCPABABBNCBCYCuCBCBBN____CTCnCiCVCVCPC$CV____ CVCoCPC$AOAlAlC$CmCPABABABAqCBCuCuCuCgCB___ABwCTCnCn_ACPC$C$____ CVC$CPCPAOAlAlAeAeABABABABAqCBCuCuCuCgCB_A_A_ACGCnCrCrC$CVCP____ C$CVC$CVAOAlAlAeAeABABABABAqBNCuCuCuCBBN_A_A_A_LCrCr_A_ACPCP____ C$CVC$CVAOC$C$AeAeCmCVABABCBCuBNCuCBBNCuCu_A_ACrCrCm_A_ACVC$CV__ CoCPCVC$AOAOAeC$CmABABABABCuCBBNCBBNCBCBCgCu_A_ACPCm_A_A_ACPC$__ C$CPCPCVCPAOCmAeAOCVABABCuCBCBCT_ABwBNBNCBCuCg_ACPBkCo_A_ACPCP__ CVCoCPCVCoAOAOAeAOABABCuCBCBCnCT_ABwCTBNBNCBCBCu_ACPCm_A____CV__ CPC$C$CPC$CVAOAeABABABCBCiCnCnCT_ACGCTCTCu_A_A_A_ACPBkCo________ __C$CVBkC$____AeABAB____CuCnCT_A_A_ABjCBCu_A_A_A_A_ACPCm________ __CVCVC$CV______AB____CuCuCnCT_A_A_ABNCBCBCu_A_A_A_ACPBkCm______ ____CVC$CV____________CgCuCBCT_A_A_ABNCBBNCg_A_A_A_A_ACPCm______ ____CVC$CV____________CuCuCBBN_A_A_A_ABNCBCB_A_A_A_A_ACPBnCm____ ______CVCV___________ACuCBCBBN_A_A_A_ABNCBCuCu_A_A___A_ACJCm____ ______CVCV_________A_ACBCBCBBN_A_A_A_A_ABNBNCBCB_A_____ACPCm____ ___________________ABNCuBNCBBN_A_A_____A_A_A_A_A_A_______ACmCm__ _________________ACBCgCuBoBN_A_A_A_______________________ACPCm__ _________________ACgCuCBBo_A_A_A___________________________ACm__ _________________ACuCBBo_A_A_A_______________________________A__ ___________________A_A_A_A_A____________________________________ } # tile 297 (barbed devil) { CVBk__________________CxCx______________________________CVBk____ __CVCP______CxCxCx______CECx________________________CVCPBk______ ____CVCP________CECx______CE______________________CVCPBd________ ______CPCP________CECx____CECb__________________CPCPBk__________ ______CVCVCP________CECx__CECb______________CVCVCPBd____________ ________CPCPCP______CECxCxCxCbCb__________CVCVCPBk______________ __________CPCPCP____CECE_ACxCxCb________CuCPBkBk________________ ____________CPCpCPCB__CECb_ACxCb____CuCpCPCYBk__________________ ______________BkCYCbCBCECECbCxCxCbCuCuCYCYBk________Cx__________ __Cx__________CBCYCuCuCuCECECbCxCbCYCbCYCB__________Cx__________ __Cx________CxCuCuCxCuCxCBCECbCxCxCuCuCuCxCuCB____CbCx__________ __CxCb____CuCuCxCuCuCxCuCuCBCECbCxCBCxCYCYCuCuCBCbCxCx__________ __CxCb__CxCuCYCBCBCYCYCuCxCBCECbCxCBCBCBCECBCYCuCuCx____________ ____CxCbCuCuCECBBNCYCbCuCuCYCBCbCxCECBCECBCBCBCuCuCB____________ ____CxCuCxCYCBBN____CbCYCbCYCBCBCxCB______CBCECYCuCB____________ ______CuCuCBBN______CYCbCYCYCbCBCxCB________CBCBCYCu____________ ______CuCBCB________CuCuCbCYCYCBCBCE__________CECBCxCB__________ ____CuCYCEBN________CxCuCYCBCBCYCBCB____________CBCYCu__________ ____CxCBCB__Cx____CuCuCYCYCBCBCBCYCB_A_A_A_A_A_ACBCBCYCu________ ____CuCBBN__Cx____CuCYCbCBCBCBCBCYCBCE_ACb_A_A_A_ACEBkCuCx______ __CuCuCE____CbCxCuCxCYCBCB_A_ABNCBCBCB_ACb_A_A_A_A_ACBCPCV______ __CpCPCB____CbCbCxCYCYCBCB_A_ABrCBCECBCbCE_A_A_A_A_ACPCVCV______ __CVCuBk______CbCBCBCBCB_A_A_ABNBNCBCbCECE_A_A_A_A_A_ACPCP______ __CVCPBk______CBCuCYCBCB_A_A_A_ABNCBCBCE_A_A_A_A_A_A_ABkCVCV____ __CVBn_______ACxCYCbCB_A_A_A_A_ABrBoCBCB_A_A_A_A_A_A_A_ACPCV____ __CVBk_____A_ACYCYCYCB_A_A_A_A_ABNBoCBCB_A_A_A_A_A_A_A_ABkCV____ __CVBk___A_A_ACYCbCYCB_A_A_A_A_ABNBrCBCE_A_A_A_A_______A_ACP____ __CV___A_A____CYCYCBCB_A_A_A_A_ABrBoCBCB_A_A_A___________ABn____ __CV_A_A_____ACYCYCBCB_A_A_A_A_A_ABoCECBCY_A_A_____________z_A__ __CV_A_____ACuCuCYCB_A_A_A_A_____ABoCBCYCYCY_A_______________A__ ___A_A___ACuCuCuCu_A_A_A___________A_ACBCY_A_A__________________ ___A_____A_A_A_A_A_A___________________A_A_A____________________ } # tile 298 (marilith) { __BHBgApBnBk________________CBCB_________s______________________ __BgBnApBnBl________________CBCB_________s_s__________________CP __BnAiAEAj________________Cj_______________s_s________________Co __Bn__Bd________________Cj______Cj___________s_s______________C$ __CP__Bk____________BdCj______CjCjCjCk_________s_s__________CPC$ ______Bk__________CUCj__BtCFCjCjCjCjCjCL_______s_s__________C$C$ ______Bk________CLCLBz__BHCjBHCjBHCjCMBv________COCn________C$__ ______Bk________CjB_CG__BHAoBHAoBH_m_m________CnCiCM_s____CPC$__ ______Bk______Cj__CUBj____CvCnCvCcCjCzCj______CiCn___s_s__Co____ ______CTCT__Cj____CUCG__CJCnCnCnCnCjCz______CnCi_______sC$C$____ ______CTCTCj______CUBj____CnCnCnCnCjCj__BDCiCiCn____Cf__C$_s____ ______BYCjCnCT____CLCLCG____CLCLCdBY__CnCnCiCn______CjCRC$_s_s__ ______Cf__BbCTCT____CLBcCnCnCTCnCnCnCnCnCiCn____CnCiCnCfCj___s_s ____CfAj______CTCTCTCTCTCnCnCnCnCnCnCLCrCn__CnCnCnCnCi_________s __Cj_________s_s__CTCnCnCsCsBTCsCsBbCnCnCnCnCnCnCfCj____________ ________Am_s_s____BDCnCjCsCsCLCsCsCsBtCiCnCnCn__________________ ______CnCnCn______CnCn__ByByCMByByByBZCnCiCn____________________ _______sCnCnCnCnCnCn_______hBaAzCL_cAn__CiCiCtCoCtCoCt__________ _____s_sBDAmCnCnCn_______q_n_n_n_c_c______CnCoCWCPCPCt__________ ___s_s_________________q_y_r_r_n_c_c________CtCPCPCPCo__________ ___s_________________q_y_y_r_nCL_d_M________CoCWCPCPCt__________ _____________________rCjCjCj_nCj_d_M__________CtCPCt____________ ___________________q_y_y_n_rCj_r_dAd____________Co______________ _________________qCjCjCjCj_n_n_n_YAe____________________________ _________________q_rCj_x_nCjCj_n_Y_MByByByBy____________________ _______________q_y_y_xBv_n_r_n_Y_MB_Bb_i_i_dBy______ByByBy______ _______________qCjCjCjCj_n_n_nADAzAo_i_i_d_i_dBy__By_i_i_dByBy__ _______________q_uCj_x_rCjCj_u_YBZ_i_i_d_d_iB_Ac_i_i_d_d_Y_Y_Y_Y _________________q_r_rBv_n_r_n_n_i_d_dByAc_d_i_d_d_d_YABCPAB____ ______________AO_q_r_r_n_n_n_n_n_dBDCPByAd_d_i_i_d_Y____________ _____________MAK_A_z_r_r_n_n_d_d_MAA_MBdByAb_dAN_B_z____________ _________________M_A_AAKAZAMAZABAOABAB_A_A_A_A_A_A______________ } # tile 299 (vrock) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ _________________I_I_I_I____________AD_A_A_MAD__________________ ______________Cf_ICuCu_I_I________AE_AABAO_z_AAD________________ __________CjCfCj_I_I_I_I_I_I____AOAK_MABAOAB_A_A________________ ____________AzCfBv_MAB___K_KCY_A_M_$ABAO_M_$AB_M_A______________ __________ABABABAAAOABAOAlCYCYAKAA_OAOAO_AAO_AAO_M_O____________ _________M_MCj_zABAO_MAOCgCYCECYAZ_A_MAO_AAO_MAOAO_z_M__________ ________CjCUBVCLABAOAZCYCYCYCYCECYAx_zABABAOAKAOAe_z_M__________ ________AAALCLCLAx_MCpCYCECECECYCECYAOAO_MAO_MAO_AAO_MAK________ ________B_CLAYCLAxCECYCECECbCYCYCYCECYABABAO_zAO_AAOAl_M________ ________CjABAACLCYCYCY_M__CECYCYCECECYAZ_MAOABAOAOAOAl_z_O______ _________AAOAACLCp_M______CYCYCEBtCYCECYAKAOABAOAeAOAlAl_z______ _________AABABAJB_________CYCECEBtCYCECYAlAD_LABABAOAlAB_MAB____ _________AAD_M____________CYCEBtCYCYCYCECE____ADAD_A_z_M___z____ ___________M______CLCLCECECEBt__CYCECYCEBNBN___M___M__AB________ ________________CLCLCLCECEBt____CBCYCECYBoCBBN__________________ ____________CLCLCLBVCM__________CBCYCECYBrBoCBBN________________ __________CLCLCL__CjCMCf________CBCECY____CYBoCBBN______________ __________CL__CL____CjCjCf______CYCYCY______CYBoCBCE____________ __________Cj__Cj________CjCf____CYCE__________CYBo______________ ________________________CjCjCI__CYCG____________CYBo____________ ________________CzCjCjCjCfCf____CjCjCfCU________________________ __________________CUCj______________CjCjCN______________________ ________________CjCj__________________CjCjCU____________________ __________________________________CMCfCfCfCfBzBz________________ ________________________________CLCfCfCU________________________ ________________________________________________________________ ________________________________________________________________ _________________OAA_MAA_M_MAA_M_M_MAA_O_MAA_M__________________ ____________________A__MAB_MA__MA_AA_CAAA__O_zAB_M______________ } # tile 300 (hezrou) { __________________________________Bo____________________________ _________________________t_t___w_w_wBo__________________________ _________________________m_m_q_hCjCj_w_tCYCj____________________ _______________________m_h_m_hCuCuCuCu_m_tCECj__________________ ___________________m_m_i_m_h_h_lCjCj_l_m_h_T_cCj________________ _________________A_q_A_m_i_q_h_l_q_l_h_h_m_h_c__Cj______________ _____________q_m_t_m_m_h_h_h_c_h_h_h_c_t_m_t_m_c_qBo____________ ____________________CYCYCY__CjCjCj_h_h_h_t_m_h_c_TBo____________ ____CuCu________CYCYCYCjBfCjBfCMCjCj_m_h_m_h_m_m_m_cCj__________ ________Cu______CY_____mCjCjBfCjCMCMCj_m_h_h_t_h_c_hAoCj________ __________CuCYCY_______q_mCMCMCMCMCjBfCj_m_h_h_q_m_X_cCjCp______ ___________________q_m_m_cCjCjCjCjCjCjCjAo_h_q_h_m_c_h_q________ _______________q_h_m_c_m_cCMCjBfBfCjCjCj_lAo_h_h_h_X_c_mCj______ _____________m_h_c_m______CMCjCjCMCMCjAo_h_hAo_t_h_c_m_c_h______ __________Cd_qCd_m_______c_qAoAo_l_t_m_t_h_h_qAo_X_c_cAR_c______ __________Cd_qCd_h_____cCd_T_Q_q_qAo_h_h_hAo_m_t_h_c_c_m_c______ ___________l_____h___cCnAACnAAAhAoAh_q_h_m_qAo_c_h_c_mAR_c______ _____________________cCd_TCw_XCjCj_m_tAo_tAo_c_h_X_c_c_m_h______ ______________________CjCjCdCjBfCjCj_l_h_h_h_h_h_h_c_c_h________ ____________________CjBfCjCjBfCjBfCj_h_c_c_c_c_h_X_c_m_h________ __________________AoCjCMCMCMCMCjCMCjCj_h_m_m_m_c_c_c_m_h________ _________________m_cCjCjBfCjBfCjCj_m_m_m_c_c_q_T_m_c_m__________ _______________w_c_cCjCMCjCjCjCj_m_q_h_h_h_q_c_m_h_q____________ ____________Ao_c_h_hBfCjCMCMCj_m_m_q_m_q_h_h_m_h_m_h____________ _____________q_c_q_h_TCjCjCMCj_q_q_h_qBH_m_q_m_q_c______________ ______________Ao_c_q_hAC__CjCj_q_m_q_c_mBH_c_c_c_M___A_M________ ________________AoAo_X_c_T_z_X_T_m_c_c_q_t_m_T_zAB_z_AAB_z______ ____________________Ao_w_c_A_A_z_A_z_m_c_c_mBH_A_A_z_M_M________ _________________________c_T_A_A_A_MAA___q_c_h_m_M_MAK__________ ______________Cj_w_m_w_m_w_A_A_M___________q_c_h_m_$_M_M________ ____________Cj____Cj___MAA_M_____m_q_m_m_q_c_m_T__AB____________ _______________OAAAK_MAB_zAB__Cj___c__Cj__Cj__AB_M______________ } # tile 301 (bone devil) { ________________________________________________________________ ______________________________________BkCP______________________ ____________________________CP__________CPCP____________________ ____________________________CPCm________BkCPCP________________Cm ______________________________CPCmCm______BnCm________________Cm ________CmCmCmCmCm____________BkCPCmCm____CmCmCm____________C$Cm ________________CmCmCmCm________BkCVCmCmCmCmCmCm____________C$Cm __________CmCmCmCP______________BkCPCP_A_ACmCmCmCm__________C$Cm ____CmCmCmCmCPCP__________________CJCP_ACBCBCmCmCmCm________C$Cm _____A_ACPCP______________________BnBkCPCBCBCPCmCmCmCP______C$Cm _____ABk_ACP______________________Bk_zBnBk_zCPCPCmCmCm______C$Cm ____CPCV_ACP________________________Bk_ACJBnBkCPCPCPCmCP__CPC$Cm __CmCPBk____________CmCm____________Bk_A_A_ACJBnCP_ACPCP__CPC$Cm CmCP_ACPBk____________CmCmCmCm______BdBd_A_A_ABkCJBkCPBk__CPC$Cm Cm_A_A_ABk______________CmCmCmCmCPCP_A_ABdBd_A_M_ABnCJ__CPCPC$Cm ___ABk_A__________________CmCmCmCPCPBk_A_A_ABnCJBk_A_A_ACP__C$Cm ___ABn_z__________CBCBCYCYCu_ACmCmCPCVCPBkBk_z_A_MBkCJCP____C$Cm __CmCPBk________CBCBCBCYCYCYCu_A_ACPCP_ACPCPBkCPBk_A________ABAB CmCP_zBkCP____CBCBCBCBCYCYCYCmCu_A_A_A_A_A_A_ABk_ACm______ABABCP Cm_A_A_ABk____CBCBCBCBCYCYCYCmCuCPCPCPCPCP_A_ACP__CPCm____CPABBk ___ABk_M______CBCBCBCBCYCYCYCmCu_A_A_A_A_ACPCP____BkCVBkCPBkAOAB __CmCVBk____CPCBCBCBCBCYCYCuCmCuCPCPCPCPCP_A_ACP____BkBdBn__ABAB CmCP_ABkCPCPCPCBCBCBCBCYCYCuCuCu_A_A_A_A_ACPCP__________________ Cm_A_A_ACP_A_ACPCBCBCBCYCYCuCu__CPCPCPCPCP_A_ACP________________ _____ACP_A_ACP_ACBCBCBCYCYCmCu__Bk_A_A_ACPCPCP__________________ ______CP_A_ACP_ACPCBCBCYCYCu____Bn______Bk______________________ ______CP____CP____CBCBCYCYCu____CJ______BnCJ____________________ ____________CP______CBCYCu____CPBk______BkCP____________________ ______________________CY______CP_A_A_A_A_ACPCP__________________ ___________A_A_A_A_A_A_A_A_ACPCP_A_A_A_A_ACPCP_A_A_A_A_A_A______ _____________A_A_A_A_A_A_ACPCP_A_A_A_A_A_ACP_A_A_A_A_A_A_A_A____ _______________A_A_A_A_A_ACPCPCP_A_A_A_A_ACPCPCP_A_A_A_A_A______ } # tile 302 (ice devil) { ________________CfCf____CfCf____________________________________ __________________Cf____Cf______________________________CL______ ________________CBBoCSBnCuCuBM________________________BrBRCL____ ________________CXCpCVCuCYCXCuBM____________________BrBR________ ________________CBCuBICuCuCYBoBMCV______________BnBMBR__________ __________________BoBnCSBoBoBdBFBn____________BnBnBD____________ ____________________C$BnC$AiBDBFBnBI________BrBRBFBFCS__________ ____________________C$AiC$BdAiBFBnCV______BrBR__BMAi__CV________ ________________BnBnCVCVCPBkBkCVCVBn__BrBrBR____BMBd____________ ______CV______BnBMBnCVCVBkCVCVCPBMBMBrBR____BnBMBD__Bn__________ ________BIBdBnBMBMBDCPCPBkCVCPCPBrBrBRBMBnBnBMAiCS____CS________ ________BnBnBFBdAi__BkBdCPBkBkBRBrBdAiBDBMBFBdBD__Bn____________ ____CVBFBDBnBFAi____CVCVBkCVBrBRCVBF__AiBdAiAi__________________ ______BhBFBnBd______BkCVBkBrBRCVBkBM____Bd______________________ ________BnBMAi______CVBrBrBRBkBkCPAi____________________________ ______CVBnBFBd______BrBRCVBkCVCVBDBMBM_______A_A_____A_A_A_A____ ________BFBMAi____BrBRCVCVBkCVCVAiBMBnBM_____A_A_A_A_A_A_A_A_A__ __________BnBMBMBrBRBkBkBkCPBkBkBMBnBnBMBM_____A_A_A_A_A_A_A_A__ ____________BMBrBRBMBMCVCVBdCVCVBMBnBMBMBM___A_A_A_A_A_A_A_A_A__ ____________BrBR__BMBnBDCVCPBkCVBMBnBMBnBM_A_A_A_A_A_A_A_A_A_A__ __________CrCL______BnBFAiBkBkBkBMBnBMBnBDAp_A_A_A_A_A_A_A_A____ ____Co__BrBR________BnBFBd____BkBMBnBMAiAiApAp_A_A_A_A_A___A____ ____CoBrBR__________BnBMBFAi____BMBnBMBd__AiApBI_A_A_A_A________ ____CoCPCPCP________BMBnBFBdBD____BMBnBMAi_AAiApAp_A_A__________ __CoCVCP______________BDAiBMBFBn__BDAiBdBd_A_AAiAp_M____________ __CPCP__________________BMBnAi______BMBFBnBM_AAiApBF____________ CV______________________BMBd_______A_ABMAi_z_A_AAiAp____________ ______________________BMBnAiBn___A_A_ABFBdBn_A_A_A_AAp__________ ______________________BnBM_____A_A_A_ABMAi_A_A___A_AAiApBn______ ____________________BMBnBdBM_A_A_A_ABMBnBdBM_______A_AAiAiApAp__ _______________ABMBM_ABFBF_ABM_ABMBM_ABMBF_ABM_A_______A_A_A_A__ _________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A__________________ } # tile 303 (nalfeshnee) { ________________________________________BsBsBsBsBs______________ ________________________________________CFCzCzCzCz______________ ____________________________________________CcCjCjCjCFBs________ _____________m______________________________CzCjCzCzBsCFBs______ ___________h_m_m________BW____BSBsBsBS____BW__BvCFCcCzCcBs______ _________h_t_t_m_m______CfBWBsCFCFCFCFCFBWCf___lBsCcCzCcCFCI____ _________h_t_t_t_m______BiBs_y_vCcCc_y_yCFCj_h_tBvCcCzCzCcCFBS__ _______h_t_t_t_t_m_m____BSBsCzCzCzCzCzCzCFBR_tCICICzCzCcCcCFBS__ _____h_t_t_t_t_t_tAzCIBvBSBsBs_z_z_z_zCFCFBWCfCICcCzCzCcCFCFBS__ _____h_h_h_t_tCFALAwCICjCjCFCcCcCFCFBsCcCjCjCjCcCcCzCzCcCFCFBS__ _________hAwBsBsCFCFCFCFCjCjCjCjCjCjCjCjCjCcCcCFCFCFCFCFCFCF____ ________BSBsCFCFCcCcCFCFCzCzCzCzCzCzCzCzCzCcCcCcCcCcCFCFBs______ ______BsBsCFCFCcCzCzCFCFCcCcCzCzCzCzCzCzCzCzCzCFBsCFCFCF________ ____BSBsBsCFCcCcCcCFBsCFCFCcCzCzCzCzCzCzCzCzCcBSBSBsCF__________ ___ABSBsBsCFCcCcCFBsBsBsCFCcCzCzCzCzCzCzCcCFCFAwBS______________ ___ABSBsBsCFCFBsBSBRBsBsCFCcCzCzCzCcCzCzCcCcCFBSBS______________ __BSBSBsCFCcCcCcCcCjCjCFCFBsBWCcCzCzCzCzCcCFCFBsBs______________ __AYAwBSBsBsCFCzCjCjCFCcCzCcBsCFCcCcCcCcCcCFCFBsBS______________ ________BSBSBsCcCjCjCcCFCcCcBsCFCFCFCFCFCFCFCFBsAw______________ ________________CjCjBsBsBsBsCFCFCFCFCFCFCFCcCFBsAb______________ ________________BiCFBsBsBsBsBsCFCFCFCFCFBsBsCFCFBs______________ ________________BWBvCIBsBSBSBSBSBsBsBsBsBsCFCcCzCcCc____________ ____________BsBWBsBsCFCFCFAz_MAbBSBSBsBsBsCFCFCICcCcBs__________ __________CFBsBsCFCcCFCFCFCcBsAwAYAvBSBSBsCcCFCICcCzBs__________ __________BsBvBvCFCICcCcCFCF____________BsCFCFCcCcCcBs__________ __________BsBsCFCFCICICc____________BsBsCFCFCFCICICcBs__________ ________________BvCFCFCcCcBsBS____BSBvBsBvCICcCc________________ ________________BSBsCICcCzCzBs______BvBsCFCFBS__________________ ________________BSBsCFCc________________CcCcBS__________________ ________________BSBsCFCc________________CFCIBSAw________________ ______________AwBSCFCFCc_______A_A_A_A_MBSBSBSAw_A______________ _______A_MAwAwAwBSCFBsBSAw_A_A_A_A_A_A_z_____MAwAw_A_A_A________ } # tile 304 (pit fiend) { ________CbCbBSBS______________CB______CBCB______________________ ________CbBSCbCbCbCb____CfCjCfCBCB__CBCBCjCfCjCf________________ ________CbBSBSCbBSAqBNCfCfCICfBoCBCBCBBoCICICICfCjCf________Cb__ ________CbBSBSAqCBCBCuCjCICuCBBoCBCBCBBoCB____CfCfCf______BSCb__ ________CbAqCBCICfCBCBCfCfCBCBATATCuATATBN__CbCbCICf____BSCbCbCb ________AqCBBoCuBoCICBCBCfCBBNCBCBCuCBCBBNBNBoCICf____CbCbCbBSCb ______AqCBBoCICfCuCuCuCBCjCYBNATCBBoCBATAqBNBNCfCBBoCbCbAwCbBSCb ____AqBoCBBoAqCuCICBCuCuCBCBBNBoCPATCPBNAqBNCBCBCuCuBNCbAwCbBSCb ____AqCBCuCBBoAqBoBoBoBoBoBoAqAqBNBNBNAqAqBNCBCBCBCBCBBNAwCbBSCb ____AqBoCBCBCBCuCuCuCuCuCuCuCBCBCBCBCBAqBNCBCBCBCBCuCBCBBNCbBSCb ______AqBoCBCBCBCBCuCuCuCuCuCuCuCuCuCBCBCBCBCBCBCuCuCuCBBoCbBSCb ______ATAqBoBoCBCBCBCBCBCBCBCBCuCuCuCuCuCuCuBNBNCuCuCBCBBoCbBSCb ______BrAwATAqBoBoCBCBCBCBCBCBCBCBCBCBCuCuCBBNCBCuCuCBCBBoCbBSCb ________BrAwATAqAqBoBoBoBoCBCBCBBoBoBoBoCuATBoCBCuCuCBCBATCEBSCb ________BrAwAwBrATAqAqBoBoBoBoBoBoATATATATBoBoCuCuCBCBBoATBrBSCb ________CEAwAwBrAwATATATATATATATATCBCBCuCuCBCBCuCuCBBoBoATAwBSCb __________CEAwBrAwAwAvBNAvATBoBoBoBoCBCBCBCBCBCBCBBoBoATBrAwBSCb __________CEAwBSCEAwAwBNAvAvAvATATBoBoBoBoCBCBCBBoBoAqATBrAwBSCb __________CEAwBSCEAwAwCEBNCBCBBoBoBNATATBoBoBoBoATATATAwBrBSBSCb __________CbBSBSCbAwBSAwBNCBCBBoBNBNBNAvAvAvAvAvAvBrAwBrAwBSCb__ __________CbBSBSBSCbBSAwBNCBBoBoBN_A_ABNAvCBCBAv_ABrAwBrAwBSCb__ __________CbBSBSBSCbBSAwBNBoBoBoBo_A_ABNBoBoCBAq_AAwAwBrAwBSCb__ ____________CbBS__CbBS__BNBoBoAqBN_A_ABNBoBoCBAq_AAwAwCEAwBSCb__ ____________CbBS__Cb__BNBoBoBoAq_A_A_ABNBNBoCBAq_AAwAwCEAwBSCb__ ____________Cb________BNBoBoAqAq_A_A_A_ABNBoCBBoAq_ACEAwAwBSCb__ __________________CICBCBBoBoBoAq_A_A_A_AAqBNBoBoBo_ACEAwAwBSCb__ ________________Cf_zAqCfCIAq_A_A_A_A_A_AAqBNBoBoBo_A_A_A_ABSCb__ _________________z_LCf_A_A_A_A_A_A_A_A_AAqBNBoBoAq_A_A_A_ABSCb__ ___________________A_z_L_____________A_A_AAqCICfCpCf_A_A____Cb__ _________________________________________A_AAqBRCfAuCf_A____Cb__ _____________________________________________A_A_A_z_z__________ ________________________________________________________________ } # tile 305 (balrog) { ______BSBS________________Cu__CuCB__Cu____BSBSBS________________ ____BiBkBS____________Cu__CuCBCuCBCBCuCB____BiBkBSBS____________ ____BSBlBi____________CuCBCuCBBNBNBNCuCBBN__BSBlBiBSBS__________ __BSCOBkBS______CjCfCfCuCBBNBNBNBNBNBNCBCuBNBiBkBiBkBSCjCfCf____ __BSBlBkBiBS________CfCjCfCjCfCjAqAqBNBNCuBNBNBmCKCjCfCfCf______ __BSBmBiBkBS______CuCYCfCfCfCfCfCfAqAqBNCuBNBNCjCfCfCfCf________ BSBkBiBlCOBlBS____CBCuBNBoAqBNCfCjAqAqAqAqAqATCfCfCOCJBSBi______ BiBlBiBkBkCOBkBSCYBNBNBNAqAqAqATBNBNATAqAqATBNBRCJBlBSBkBS______ BSBkBiBlCOBlBNBNBNBNAqAqAqAqBNATATCjBNATATAqCjAXBNBNBSBnBi______ BSBmBiBkBNBNAqBNBNAqAqAqATATATBNATAXBNATATBNAuATATAqBNBNBSBS____ BSCKBNBNBNBNBNAqAqAqAqAqATATATBNBN_zC$_A_AC$_ABNATBNBNAqBNBS____ BSBkBNAqBNAqAqAqAqATAqATATATATATBN_A_A_A_A_A_AATATAqAqBNAqBN____ BSBNBNBNAqAqATATATATATATATATATATBNBNBNBNBNBNBNATBNAqAqAqBNBNAq__ BSBNAqAqAqATATATATATATAqAqAqAqATATATATATATATAqAqBNATAqAqAqBNBN__ BSBNBNAqATATAT__ATATATATATAqAqAqATAqAqAqAqAqAqAqBNATATAqAqAqBNBN BNBNAqATATAXBk__ATATATATATATATATATATATATATATAqAqBNBkATATAqAqAqBN AqAqAqATATBk__ATATATATAqAqATATATATATATATATATAqAqBkCPBSATATAqAqBN AqAqATATATCP__AqATATATATATAqAqAqATAqAqATAqAqAq__BlBkBS__ATAqAqBN AqAqATATBkBk__AqAqAqAqATATATATATATATATAqAq______COBkBi__ATAqAqAq AqAqATAXCJBnAqAqAqAqAqAqAqATATATATATAqAqAqAq____BkBlBS_AATAqAqBN AqAqATATBkAqAqAqBNBNBNAqAqATATATATAqAqAqAqBNBN_ACOBS_A_AATAqAqBN AqAqATAT__AqBNBNBNBNBNAqAqATATATATATAqAqBNBNBNBNBlBS_A_AATAqAqBN CLAqATCL__AqBNBNBNBNBNAqATATATATATATATATAqBNBNBNBNBS_A_A_AATAqBN __BSCLCmATAqBNBNBNBNAqATATAT_AATATATATATATAqAqBNBNBN_A_A_AATAqBN __CLCPCPCmCmAqBNBNBNAqATAT_A_A_A_A_AATATATATAqBNBNBNBN_A_AATATBN ______ATBkCPCmCmAqAqATAT_A_A_A_A_A_A_A_AATATAqAqAqBNBNBN_A_A_ABN _____AATATAqCPCPCVCmATAT_A_A_A_A_A_A_A_A_AATATATAqAqAqBN_A_ABNBN _____AATATAGAqAqCPCPCmCm_A_A_A_A_A_A_A_A_AATATATATATAqAq_A_A_A__ ___A_AATATATATAGATAGCPCPCVCm_A_A_A_A_A_AATATATATATATAq_A_A_A____ ___A_ABNATATATATATAT_A_ACPCPCmCm_A_A_A_AATATATATATAT_A_A_A______ ___AAqAqAqAqAqAqBN_A_A_A_A_ACPCPCV___A_AATATATATATAqBN_A________ ____AqAqAqAqAqAqAq_A_A_A_______________A_AATATAqAqAqAq__________ } # tile 306 (Juiblex) { ________________________________________________________________ ________________________________________________________________ __________________________Cf_c__CI______________________________ _____________________hCI_cCf_cCI_h_h_c__________________________ __________________CI_h_cCfCICI_h_cCI_cAz________________________ ________________CICbCbCf_cBv_c_hCECbCb_hAz______________________ ________________CbCxCE_h_c_cCI_cCECECx_c_c_c____________________ ______________CICbCECf_c_cCICIBv_cCxCbCb_cAzAz__________________ ______________CfCE_c_hCfCI_hBv_c_cBvCECEBWBvAz__________________ ______________Cf_c_hCfBvCICI_h_cBkBv_c_cAz_c_h_h________________ _______________h_cCf_c_hBkBv_h_cBvCIBv_h_cAz_cAz________________ _______________cCf_cBk_c_lBv_h_cBvBW_c_c_hAzBW_cAz______________ ______________CI_cCfBvBv_c_h_c_cBkBWBWBW_c_cAz_cAz______________ ______________CI_h_hBvCI_c_c_h_l_c_hBvBW_c_h_hAzAz______________ ______________Bv_h_cCICICb_c_c_c_hBv_cBWBv_c_c_h_c_______A_A____ ____________CIBv_c_hCICxCECE_h_c_c_cBvBv_c_h_cAzBvAz_A_A_A_A_A__ ____________CI_hBv_cCbCxCxCE_h_cCIBW_cBW_h_h_cAz_cAz_A_A_A_A_A_A ____________CI_h_c_hCECECICI_h_c_cCIBvBWBv_cBWAz_c_c_c_A_A_A_A_A ___________h_c_c_c_hBvBvBv_h_c_c_h_hBvBWBk_cBW_cBk_hAz_A_A_A_A_A ___________h_cBv_h_c_h_hBv_cBv_h_c_c_lBk_cCI_h_cBnBWAz_A_A_A_A__ ___________cCI_c_hBkCI_c_h_cBv_h_cBv_c_h_lCI_hBvBiAzAz_A_A_A_A__ ________CIBkCI_lBkCICICI_cBkCI_h_c_cBv_c_c_hBvCbCbAzAz_A_A_A_A__ _________hBl_c_h_cCI_c_cBvBv_c_h_h_cBvBv_c_hCbCxCbAz_cBv_A_A_A__ _______h_c_c_l_h_cCI_cBvBvBv_h_cCI_h_c_c_c_cCbCECEAz_h_c_A_A_A__ _____c_h_c_c_h_cCJCICbCECE_c_hCICI_h_c_cBvCIBWCECIAz_h_cAz_A_A__ _____h_c_h_hCI_cBvCICbCx_c_c_cBvCI_c_h_cBWCI_h_hCI_h_c_cAzAz_A__ _____hCI_h_cCI_cBlCbCxCE_c_cBv_cCIBk_h_cBWBk_c_cCI_h_cAz_cAz_A__ ___ACICI_h_cCI_c_cCECEBv_cBvBv_c_cCPBv_h_hCIBkCIBW_c_hAzAz_A_A__ ___A_ACI_hCICI_cCICI_cBv_h_c_cBWBkCIAz_h_c_cBWCI_cAz_h_A_A_A_A__ _____A_ACICICI_cCICI_cBW_h_c_c_cCICI_c_h_cBWBWCI_A_A_A_A_A_A_A__ _______A_A_A_A_A_A_A_cBW_ABWBW_A_A_cCI_h_c_cBW_A_A_A_A_A_A_A____ ___________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A________________ } # tile 307 (Yeenoghu) { __________AwBk________CICICI__C$C$CICICI________________________ ______BkAwAYAA______C$C$CICICIC$C$C$C$C$__C$____________________ ______AwAYAA____C$C$C$C$C$CICICICICIC$C$C$C$____________________ __BkAwAYAABk__________C$C$C$BvBvCICICICIC$C$C$__________________ __AwAbAA__________________C$C$BvCVCVCICICIC$C$C$________________ __AAAABl____________C$C$C$C$C$BvBvCVCVBvBvCIC$C$CICI____________ ___A__________________C$C$C$C$BvBvBvBvBvBvBvBvCICICICICI________ _A________________________C$BvBvBWBvBvBoBoBvBvBvBvCICICI________ AwAA____________________C$C$BvBvBWBWBvBvBoBoBoBvBvBvBvBv________ AwAA__________________C$C$BWBvBvBWBWBWBvBvBvBoBoBoBoBvCPCPCVBkBk AwAACPCPCPCmCmCmCmCmCPCPCPCPBWBvBWBWBWAzAzBvBvBoBoBoBoBkBkBn____ Aw_zABABBkCPCPCPCPCPCPCPCPCPBkBWBWBWBWAzAzBkBvBvBvBvBkCP________ AwAA____ABABABBkBkCPBkBkCPBkCPBkBWBWBWAzAzBnCJBkBkBkBW__________ AwAA________BWBvBWAzBkBkBkBkBkATATATAzAzATATBkBkBWBWBvBv________ BvAA______BvBvBWBWAzAzBkBkBkBkATATATCPBdATATBkAzAzBWBWBvBv______ BW_NBWBWBvBvBWBWAzAz____AzAzAzAzAGCPBkBkBdAT____AzAzBWBWBv______ AzAABWBWBWBWBWAzAz________BWBWAzAzCPBdBkBdBW______AzAzBWBvBv____ AwAAAzAzBWBWAzAz__________BWBWAzATBkBkBkBdAT________AzAzBWBv____ AwAA__AzAzAzAz__________BkBkAXATATATBdBdATATAT________AzBWBv____ Aw_z________________BmBkCVCPCKBkATATBoCBATATCPBk______AzBWBv____ AwAA____________BkCKCPCPCPBmBkCPCBCBBoCBCBBkCPCPBk____BWBvBvBv__ AwAA________BkCKBmCPCPCPBkCKBkBWBoCBBoCBBoBWBkBkCVBk____Bv__Bv__ AwAA______ABABABABABABBkBkBaBWBvBvCBCBCBCBBvBWBWBnCPCJ__Bv__Bv__ Aw_L____ABABABAB______AzBWBWBvBvBvCBCBCBAzBWBvBvBW______________ AwAA__________________AzBWBWBvBv__CBCBCBAzBWBWBvBvBv____________ AwAA________________AzAzBWBWBvBv__CBCBBo__AzBWBWBvBv____________ ____________________AzAzBWBWBv____CBCB______AzBWBvBv___A_A______ _______________A_AAzAzBWBWBW______BoBo______AzBWBvBv_A_A_A_A____ ___________A_A_AAzAzAzBWBW_A_A_A_A_A_A_A_A_AAzBWBvBvBv_A_A_A____ _________A_A_A_AAzAzBWBW_A_A_A_A_A_A_A_A_A_AAzAzBWBvBvBv_A_A____ _____________A_AAzAzBWBW_A_A_A_A_A_A_A_A_A_A_AAzBWBWBWBW_A______ _______________A_ABWBWBW_A_A_A_A_A_A_A_A_A_A_A_A_AAzBW_A_A______ } # tile 308 (Orcus) { ________________________________________________________________ ________________________C$______C$C$______BJ____________________ ______________Ae______C$C$BdBJAeAeAe______BdAl__________________ ______________Ae____C$C$C$AeABBoCdAeAe_VAeAeBkAO________________ ____________BkBdAe____C$C$_MAlBYCuBkBkBkBkAeAeAe________________ ____________BkBDAe____Ae_VAOAlBDBDBkAOBkBDBJAOBdAO______________ ________AO_MABBJAe_________VAOAjAl_MBDBkAeAeAjBk_V______________ _______ABdBDAKAjAl_____M_V_AABAKBDAlAeAeAOAeAOBkBd______________ ____AeABBJBdBdAeAe___MBDABBJBDBdAeAeAeAlBDBkBJAeAeBd____________ ____AO_AAeBkBJAeAO_zBkAeAeAjBDBkBdAeAeBJBDBkBkAeAeAe____________ _______VAOBk_OABAOBkBdAOAlBDBDBDAlBkBdAlAlBDBkABAlAO____________ ________AaBmA__MCPCPBDABAlBDAeAlCPCPBkBdBdAeAOABAeBDAO__________ ________AeBkAOCPCKBDAB_AAeAOBkCJCPBnCPCPCPBdAlAB_MAeBkBd________ ________AOCPAlBdBdAl_AAeAlBDBdBkBlBkCJBkBkBkBkAO_z_MBdCP_V______ ________BJBnAlBJAB_AAeAOAlAlBDBdBkBkAjBkBkBkBDAB_A_A_A_MAO_V____ ________AlCJAeAlAB_MAOAOAlAeBJBDBdAlBJBdBkBdBDAOAB_M_AAeBkBd_V__ ________ABBDBdABABBdAOAeAlAlAeAlAeBDAlBDBDBDAeAwABBJAB_MBdAO_Z__ ________AjAlAlABBdAeAvAwAxAOAlAeAeAlAeAlBJAlABAbAGAlAlABCBCB_Z__ ________BkAOAlBdAeBdAvAwAxAwBTBTAcAxAOAxAGAwAxAwAwAvAeBkCoCsAx__ ________CPBkBkBkBdAlAvAwBsAwBZCFBsAXAGAwBsBSAxBsBsAvBJCtCsCt____ ________CPBkBkBkBdBDAeAvAwBSAwBSBrAvAGAwAwAwAwBtAxAvAvBkCt______ ______AeCPCPBkBkBDAe____AwAwBRAzBZBRAIBRBRAwAwAwAxAwBsBdBk______ ______BdCPBkBkBkBJ__________AGBRCFAxAI______AvBRBtBsBSBkBk______ ______BDCPCPBkAlAO_________AAGBRCLBRAX____AIBRAwAxBSBSBDBk______ ______BDCPBlCOAO________AqAMBsAwBR_A____AOATAwBRAMAXAeBkBk______ ______BDCPCPAO________AXAXBsAwAw_A____AMAGAGAwAwAX__BkAlBk______ ______BDBkAE___________AAMAMBR_V_____VAMAG_A_V________BlBj______ ______BdAE______________AGAw_V_______MAMAM_Z____________________ _______Z_________________AAw_Z______AOAcAMAO____________________ _________________________LAw_V______AOAMAz_A____________________ ________________AOAeAOAOAMCLBZ_VAeAOAO_VCLALAOAOAe______________ _____________V_V_A_A_A_A_AAAAM_A_A_A_A_AAL_A_A_A_A_A_V__________ } # tile 309 (Geryon) { CYCYCY__________________CrCLCrCLCrCLCr____________________CYCYCY _h_h_hCYCYCY____________CrCLCrCLCrCLCr______________CYCYCY_h_h_h ___h_h_h_h_hCYCYCY______CrCnCnCTCTCTCr______CYCYCYCY_h_h_h_h_h_h ___h_h_h_h_m_mCBCY______CnCiCnCnCnCnCn______CY_hCY_h_h_h_h_m_m__ _____m_m_m_mCB_hCY______CiCuCuCnCuCuCn______CY_h_hCY_m_m_m_m_m__ _____m_m_mCB_h_h_hCY____CiCnCiCnCTCnCn______CY_h_h_hCY_m_m_m_m__ _____m_mCB_h_h_h_hCY____CnCiCnCnCTCnCn____CY_h_h_h_h_hCY_m_m_m__ ___m_mCB_h_h_h_h_h_hCY____CiBoBNBNCT____CY_h_h_h_h_h_h_hCY_m_m__ ___mCB_h_h_h_h_h_h_h_hCY__CnCnCnCTCTCYCYCY_h_h_h_h_h_h_h_hCY_m_m _mCB_h_h_hCnCnCnCiCnCnCnCTCTCnCnCTCTCTCiCnCiCn_h_h_h_h_h_h_hCY_m CB_h_hCnCnCnCnCiCnCiCnCiCnCnCnCnCnCiCnCiCnCnCnCnCn_h_h________CY _h_hCnCnCnCiCnCiCnCnCiCnCiCiCiCnCiCnCiCnCnCnCnCnCiCn____________ __CnCnCiCiCnCnCnCTCnCnCiCnCnCnCTCnCiCnCnCnCTCnCnCnCiCn__________ __CnCiCnCnCnCTCGBbCGCnCnCiCnCnCnCnCnCnCnCTCGCTCnCnCiCnCn________ CnCnCnCnCnCGBz____BwCTCnCnCnCnCTCnCnCnCTCGBzBwCTCnCnCiCn________ BwCTCnCiCnCn________CGCTCTCTCTCTCTCTCTCTBw__BzCGCnCnCnCiCn_A_A_A __CGCnCnCnCiCn______BjCTCnCiCnCTCnCiCnCTCG____BtBjCTCnCiCn_z_A_A ____BzCnCnCnCTCn______CGCTCTCTCnCTCTCdBz_________LCGCnCnCn_A_A_A ______CGCTCTCTCnCn____BzCnCiCnCTCnCiCnCG___A_A_A_ABjCnCnCn_A_A_A __________CnCn_m_mCn_mCGCTCTCTCnCTCTCTBj_c_c_c_A_ACGCnCiCn_A_A_A _______m_mCn_mCn_hCn_m_mCTCTCTCTCTCTBv_c_c_c_c_c_mBjCnCnCn_z_A__ _____q_m_mCn_hCn_h_h_h_mCfCfCICICIBvBv_c_X_X_X_m_mCGCTCnCn_A_A_A ___q_m_m_h_h_h_h_A_A_m_mBWCICICICIBvAz_c_A_A_A_h_hBjCTCnCn_m_A_A _m_q_m_h_A_A_A_A_A___m_mBvBWBWBWAzAz_c_c_A_A_A_A_ACTCnCnCn_m_m_A _m_m_m_A_A_A_______q_m_hCfCICICIBvBv_c_A_A_A_A_ACTCTCnCnCn_h_m_A _m_m_m_m_A_______q_m_hBWCICICICIBvAz_c_A_A_A_ACT_ACGCnBwCn_A_h_A _h_m_q_q_m_q_q_m_m_hBvBWBWBWBWAzAz_c_X_A_A_A_A_ABwCnBzCn___A_h__ _h_m_m_m_m_m_m_m_h_hBWBvBvBvBvBvBW_X_A_A_A_A_A_ACn__Cn__________ _X_h_m_m_m_h_h_h_hAzAzAzAzAzAzAb_X_X_A_A_A_A_A__________________ _A_X_h_h_h_h_h_XBWBWBWBWAzAzAz_X_X_A_A_A_A______________________ _A_A_X_X_X_X_XAzAzAzAbAbAb_X_X_A_A_A_A__________________________ ___A_A_A_A_A_A_A_A_A_A_A_A_A_A_A________________________________ } # tile 310 (Dispater) { _______o_o______________________Cb____Cb________________________ _______o_o____________________CbCbCnCbCb________________________ _____o_s_o__________________CiCbCnCnCb____________CY________Cs__ _____o_s_o____CY__________CiCiClCiCnCnCT________BNCY________Cs__ _____o_s_o____CuBoBN_____ACnCl_$_zCn_A_A____BNBoCY________CsCsCs ___o_o_v_o______CuBoBoBN_zCiCiCnCiCnCnCT_ABNBoBoCY__________Cs__ ___o_v_v_o_o____CuCuBoBN_A_zCnCiCnCnCnCT_ABNBoCY____________CL__ ___o_v_v_o_o______CuCuBoBN_zCiCnCBBoBoCTBNBNCY______________CL__ _o_o_v_v_o_o________CuCuBN_A_zCnCnCnCT_ABNBoCY______________CL__ _o_s_y_y_o_o_______I_ICuBoBN_A_ACn_ACT_ABNCB_I_K_KCL________CL__ _o_s_y_y_v_o____CLCL_I_ICuCu_A_A_A_A_A_ACB_I_KCrCLCu________CL__ _o_s_y_y_s_oCuCuCuCuCr_I_I_ICu_A_A_A_ACB_I_KCrCYCuCuCuCu____CL__ _o_s_y_y_sCuCuCuCuCuCuCr_I_I_I_A_A_A_I_I_KCrCYCYCYCuCuCuCu__CL__ _o_v_yCi_v_sCuCuCYCYCYCYCrCr_I_I_A_A_ICrCrCBCYCYCYCYCuCuAqAqCL__ _o_vClCnCi_sCYCYCYCYCYCYCYCYCrCr_A_ICrCYCBCBCBCBCYCYCYAqCnCnCn__ _o_vClCiCn_sCYCYCBCBCBCBCYCYCuCuCrCrCYCYCBCBCBCBCYCYCYAqCTCnCnCn _o_y_yCi_yBNCYCBCBCBCBCBCYCYCuCuCsCsCYCBCBAqAqCBCBCBCYAqAqCTCnCn ___o_y_y_sAqCBCBCBCBBNBNCYCuCuCuCYCYCYCBCBAqAqAqCBCBCBAqAqAqCn__ _____s_sAqAqCBCBCBBNBNBNCrCuCuCuCYCYCYCBCLAqAqAqCLCBCBAqAqAqCL__ ______AqAqAqCBCBAqBNBNBNCrCsCrCuCsCYCLCLBbAqAqAqBbCBCBAqAqAqCL__ ______AqAqCBCBAqAqBNBNBNCYCsCrCsCrCLCLCLCBCBBNAqAqCLCBCBAqAq____ ________AqCBCLAqBNBNBNBNCYCuCuCsCrCLCYCBCBCBBNBNAqCLCBCBAqAq____ _________ICLAqAqBNBNBNCYCYCuCuCYCrCYCYCBCBCBBNBNBNAqCLCBAq_A____ _________ICLAqAqBNBNBNCYCYCuCuCYCYCYCYCBCBCBBNBNBNAqCL_AAq_A____ _______I_JCrAqBNBNBNBNCYCYCuCYCuCYCYCYCBCBCBBNBNBNBNAqCL_A_A____ _______I_JCrAqBNBNBNCYCYCYCuCYCuCYCYCBCYCBCBCBBNBNBNAqAqCL______ _____I_ICsAqAqBNBN_ACYCYCYCuCYCuCYCYCBCYCBCBCB_A_ABNBNAqCL______ ___I_I_JCr_A_A_A_A_ACYCYCYCuCYCuCYCYCBCYCBCBCB_A_A_A_ABNAqCL____ ___I_I_JCr_A_A_A_A_ACYCYCYCuCYCuCYCYCBCYCBCBCB_A_A_A_A_A_AAqCL__ ___A_I_JCr_A_A_A_A_ACYCYCYCuCYCuCYCYCBCYCB_A_A_A_A_A_A_A_A_A_A__ ___A_A_JCr_A_A_A_A_A_A_A_ACuCYCuCYCYCB_A_A_A_A__________________ _____A_A_A_A___________A_A_A_A_A_A_A_A_A________________________ } # tile 311 (Baalzebub) { __________________________CL__Cs____Cs__________________________ __________________________CL__CsCr__Cs__________________________ __________________________CLCsCrCrCLCs__________________________ __________________________BwCTCnCnCnCi__________________________ __________________________CGCnCnCiCnCi__________________________ __________________BpCiCZ_dBjA_CnClAHCnBpBpCZ____________________ ________________BpChCCCZ_dCTCnCTClCnCiBpCiCv____________________ ______________BpCiBpCZBpCZBwCTCnCiCnCTCZCCChBp__________________ ______________BpCmCvCvCZBp_dCTCnCfCnCGCvCZClCZ__________________ ________________BpCZBpCZBpCZCGCfCfCjCZBpCZBpBp__________________ ________________BpCZCZCvBpBpBWCfCjCcBpCvBpCvCZ____________CaCD__ __________________BpBpBpCZBp_YCICIBWCIBpCZBpBp____________CaChCD ________________CnCnCvBpBp_d_YBWCfCjBWCZBpBpCn____________CDCaCD ______________CnCnCTBV_Y_d_Y_YCjBWBvCf_d_iBVCTCn__________CrCD__ ____________CiCnCTBV_d_d_Y_YCICfAD_YCICI_d_iBVCTCn________CLCL__ __________CnCnCTBw___Y_d_Y_YBvCf_Y_YBvCf_d_Y__BwCTCn____CrCLBZ__ __________CnCnCn_____Y_d_Y_Y_YBvCI_YBv_d_d_Y____CGCTCn__CrCL____ __________CnCnCnCT_____d_d_Y_Y_Y_Y_Y_d_d_Y_A_A_A_ABjCTCnCLBb____ ____________CTCnCiCT_____d_Y_Y_Y_Y_Y_d_Y_A_A_A_A_A_ACGBjCLCn____ ________BvBW__CTCnCnCT_n_i_Y_Y_Y_Y_Y_i_n_A_ABvBvBvBWBWCrBtCT____ ________BvBWBv_YCTCn_i_Y_n_n_i_d_i_i_n_i_dBWBWAzAzBWCrCLBZ_A____ ________BvBWBv_Y_Y_n_n_d_d_Y_n_n_n_n_d_dBWAz_A_A_A_ACrBZ_A_A____ __BvBvBWBvBW_ABv_i_i_n_d_d_d_d_d_d_d_d_n_dAzBWBvBvBvCLBZ_A_A____ ____AzAzBvBWAzBW_d_Y_Y_n_n_d_d_d_d_d_n_Y_A_A_AAzAzAzAzBWBW_A____ __BvAz_ABvBW_AAz_d_n_d_Y_Y_n_n_n_n_n_Y_d_A_A_A_A_A_ABWAzAzBW_A__ __BvAz_ABvAzBW_A_Y_Y_n_d_d_Y_Y_Y_Y_Y_d_A_A_A_A_A_ABWBv_AAzBvBW_A __BWAz_ABvAz_A_A_A_d_Y_d_d_d_d_d_d_n_A_A_A_A_A_A_AAzBW_AAzBv_A_A AzAz_A_ABWAzBW_A_A_A_Y_n_n_n_n_n_n_Y_A_A_A_A_A_ABWBv_A_AAzBWBW_A _A_A_A_A_AAz_A_A_A_A_d_Y_Y_Y_Y_Y_Y_A_A_A_A_A_A_A_ABWBW_AAzBv_A_A _____A_AAzAzBW_A_____A_d_d_d_d_A_A_A_A_A_____A_ABWAz_A_A_AAzAzAz ____AzAzAz_A_A_A_____A_A_A_A_A_A_A_____________A_AAzAzAzAz_A_A_A _____A_A_A_A_A_____________________________________A_A_A_A_A____ } # tile 312 (Asmodeus) { _______o_o______________________CV____CV________________________ _______o_o_________________A_ACVCV_ACVCV________________________ _____o_s_o_______________A_A_ACVCQCQCP_A___________I____________ _____o_s_o_____I_________A_ACQCQCQBlCQBl________BN_I____________ _____o_s_o_____KBoBN_____ACQCQCuCuCQCpCu____BNBo_I______________ ___o_o_v_o_______KBoBoBN_ACQCQCQCQCQBlBl_ABNBoBo_I______________ ___o_v_v_o_o_____K_KBoBN_A_ACQCQCQBlBlBl_ABNBo_I________________ ___o_v_v_o_o_______K_KBoBN_ACQCQBoBoBl_ABNBN_I______________Cu__ _o_o_v_v_o_o_________K_KBN_A_ACQBlCQBl_ABNBo_I____________CuCBCB _o_s_y_y_o_o_______I_I_KBoBN_A_ABlBl_A_ABN_G_I_I_ICL______CBCBBo _o_s_y_y_v_o____CLCL_I_I_K_K_A_A_A_A_ABN_G_I_ICLCL_K________Bo__ _o_s_y_y_s_o_K_K_K_KCL_I_I_I_K_A_A_A_A_G_I_ICL_I_K_K_K_K____CL__ _o_s_y_y_s_K_K_K_K_K_KCL_I_I_I_A_A_A_I_I_ICL_I_I_I_K_K_K_K__CL__ _o_v_yCi_v_s_K_K_I_I_I_ICLCL_I_I_A_A_ICLCL_G_I_I_I_I_K_KAqAqCL__ _o_vClCnCi_s_I_I_I_I_I_I_I_ICLCL_A_ICL_I_G_G_G_G_I_I_IAqCQCQCL__ _o_vClCiCn_s_I_I_G_G_G_G_I_I_K_KCLCL_I_I_G_G_G_G_I_I_IAuBlCQCQCQ _o_y_yCi_yBN_I_G_G_G_G_G_I_I_K_KCLCL_I_G_GAqAq_G_G_G_IAqAqCQCLBl ___o_y_y_sAq_G_G_G_GBNBN_I_K_K_K_I_I_I_G_GAqAqAq_G_G_GAqAqAqCL__ _____s_sAqAq_G_G_GBNBNBNCr_K_K_K_I_I_I_GCLAqAqAqCL_G_GAqAqAqCL__ ______AqAqAq_G_GAqBNBNBNCrCsCr_KCs_ICLCLBbAqAqAqBb_G_GAqAqAqCL__ ______AqAq_G_GAqAqBNBNBN_ICsCrCsCrCLCLCL_G_GBNAqBNCL_G_GAqAqCL__ ________Aq_GCLAqBNBNBNBN_I_K_KCsCrCL_I_G_G_GBNBNAqCL_G_GAqAqCL__ _________ICLAqAqBNBNBN_I_I_K_K_ICr_I_I_G_G_GBNBNBNAqCL_GAq_ACL__ _________ICLAqAqBNBNBN_I_I_K_K_I_I_I_I_G_G_GBNBNBNAqCL_AAq_A____ _______I_ICrAqBNBNBNBN_I_I_K_I_K_I_I_I_G_G_GBNBNBNBNAqCL_A_A____ _______I_ICrAqBNBNBN_I_I_I_K_I_K_I_I_G_I_G_G_GBNBNBNAqAqCL______ _____I_ICsAqAqBNBN_A_I_I_I_K_I_K_I_I_G_I_G_G_G_A_ABNBNAqCL______ ___I_I_ICr_A_A_A_A_A_I_I_I_K_I_K_I_I_G_I_G_G_G_A_A_A_ABNAqCL____ ___I_I_ICr_A_A_A_A_A_I_I_I_K_I_K_I_I_G_I_G_G_G_A_A_A_A_A_AAqCL__ ___A_I_ICr_A_A_A_A_A_I_I_I_K_I_K_I_I_G_I_G_A_A_A_A_A_A_A_A_A_A__ ___A_A_ICr_A_A_A_A_A_A_A_A_K_I_K_I_I_G_A_A_A_A__________________ _____A_A_A_A___________A_A_A_A_A_A_A_A_A________________________ } # tile 313 (Demogorgon) { ________________________________________________________________ ________________________ApBnBM__________________________________ _______________________k_q_g_g_m_____g_fBnAp____________________ _______________________kBoCBBo_f_b___g_q_q_fAp__________________ _______________________kCMCBCj_q_f_g_aCuCuBo_f__________________ ________________________CBCBCu_f_f_aCuCjBoCj_f__________________ __________________________Cu_f_m_f_g_fCuBoBo____________________ _____________________________g_fBR_fBR_fBN______________________ Cd_______________________m_fBDBRAxBRAxBR________________________ Cn__Cx_________________g_m_q_fBRAeAxBRBR___m_f_a_q_b____________ Cd__Cx_______________f_q_g_fBRBRBRBR_m_H_q_J_a_q_a_b_f_b________ Cx__CxCb___________m_t_f_gBRBRBR_k_f_t_k_H_JCxCxCxCx_f_q_f_q____ Cx____Cb_________g_g___mBRBR_k_q_fBRBRAeBRBL_______________fBn_q CxCx__Cb_______k_q____BX_b_f_bAlBRBRBR__BRAx____________________ __Cb__CECE_____m_J_H_f_m_qAlBRBRBRAO______BrBn__________________ __Cb____CEBr_____k_b_q_bAeBRBRBRAN________BrBr_t________________ __CbCE____BrBr_____m_k_mBRBRBRAx____________CECEAp______________ ____CECE____BRBRBR_q_k_m_mBRAxBRAx____________CECbCbAp__________ ______BrBr____AVBR_m_q_gBXAeBRAxAeBRAl____________CbCxCxAp______ ________BrBrBRBRBR_k_b_g_q_kAeBRBRAxBRAO______________CxCdCnCd__ ____________AVBRBR_b_q_H_b_m__AeAxBRAxAxBRAO____________________ _____________________bBD_g_g______AOBRBRAxBRAxBR________________ _____________________g_H_q_f_m________AlAxBRAxBR________________ ___________________q_m_q_g_g________BaBaAbAe____________________ __________________CLAi_f_a_m____BaBaAbAb________________________ ________________BbB_Ba_m_g____BaB_Ab____________________________ ________________CLBa____________BaBa____AO_M_MAAAO______________ ________________CLB_______________B_BaAz_A_z_A_A_O_M_MAOAOBD____ __________AO_M_$BbBa_A_AAD_______ABaB_BaAzBaAzCj________________ ______AlAO_A_A_ABvB__A_A_A_A_A_A_zCf__________CfCj______________ ______________BaB_BaBaCjAl_z_A_AAD______________________________ ______________CjB__________z_A_A_A_A_A_A_A_z_MAA_MAlAlBDBDBD____ } # tile 317 (mail daemon) { ________________________________________________________________ ___________________k_k_k_k_k_k_k_k_k_k__________________________ _______________k_k_k_k_k_k_k_k_k_k_k_k_k_k______________________ _____________k_k_k_k_k_k_k_k_k_k_k_k_k_k_k_k_k__________________ _____________k_k_k_k_k_A_A_k_k_k_A_A_k_k_k_k_k__________________ ___________k_k_k_kC$_AC$C$_AC$_AC$C$_AC$_k_k_k_k______CmCmCmCmCm _________k_k_k_kC$C$_AC$_A_AC$_AC$_A_AC$C$_k_k_k______CmCmCmCmCm _________k_k_kC$C$C$_AC$_A_AC$_AC$_A_AC$C$C$_k_k______Cm_ACmCmCm _________k_k_kC$C$C$_AC$C$_AC$_AC$C$_AC$C$C$_k_k______CmCmCm_ACm _________k_k_kC$C$C$C$_A_AC$CuC$_A_AC$C$C$C$_k_k______CmCmCmCmCm _________k_k_kC$C$C$C$C$C$CuCuCuC$C$C$C$C$C$_k_k______Cm_ACm_ACm _________k_k_kC$C$CuC$C$C$C$C$C$C$C$C$CuC$C$_k_k______CmCmCmCmCm _________k_k_kC$C$CuCuCuCuCuCuCuCuCuCuCuC$C$_k_k______CmCmCm_ACm ___________k_k_kC$C$CuCuCuCuCzCzCuCuCuC$C$_k_k________Cm_ACm_ACm _____________k_kC$C$C$CuCuCzCzCzCzCuC$C$_k_k________C$C$CmCmCmCm _______________kC$C$C$C$C$C$C$C$C$C$C$_k__________C$C$C$C$Cm_ACm ________________CuCuCuCuCuCuCjCjCjCuCuCu_________kC$C$C$C$Cm_ACm ________________CuCuCuCuCuCuCjCjCjCuCuCu___k_k_k_k_kC$C$CmCmCmCm ___________k_k_k_k_k_k_k_k_kCjCjCj_k_k_k_k_k_k_k_k_k____________ _______k_k_k_k_k_k_kC$C$C$C$C$C$C$C$_k_k_k_k_k__________________ ___k_k_k_k_k_k_k_kC$C$C$C$C$C$C$C$C$C$_k_k_k____________________ C$C$_k_k_k_k_k_k_kC$C$_A_A_A_A_A_A_AC$_k_k______________________ C$C$C$___________k_kC$_AC$C$C$C$C$_AC$_k_k______________________ C$C$C$___________k_kC$C$_AC$C$C$_AC$_k_k_k______________________ _________________k_k_kC$C$_A_A_AC$C$_k_k________________________ ___________________k_k_kC$C$C$C$C$_k_k_k________________________ ___________________k_k_k_k_A_k_k_k_k_A_A_A_A_A_A________________ _____________A_A_A_k_k_k_k_A_k_k_k_k_A_A_A_A_A_A_A_A_A__________ _________A_A_A_A_A_k_k_k_k_A_k_k_k_k_A_A_A_A_A_A_A_A_A__________ _______A_A_A_AC$C$C$C$C$_k_AC$C$C$C$C$C$_A_A_A_A_A_A____________ _____A_A_AC$C$C$C$C$C$C$_A_AC$C$C$C$C$C$C$_A_A_A_A_A____________ _______A_A_AC$C$C$C$C$C$_A_A_AC$C$C$C$C$_A_A_A_A________________ } # tile 318 (djinni) { ______________________________________BoBoAOAOAO________________ ____________________________________BoBN__AOAOAOAO______________ __________________________________AlAlAO____AOAOAOAOAOAO________ _________________________________v_v_o_j______AOAOAOAO__AOAO____ _______________________________v_y_y_v_s_j________________AO____ ___________________j_j_j_j_____Z_y_Z_Z_s_j______________________ _______________j_v_v_y_y_y_o_o_v_y_s_v_s_j______________________ ___________j_v_o_y_o_v_v_v_v_o_v_y_s_v_sAO______________________ _______j_v_y_o_y_o_y_o_o_v_o_j_o_Z_Z_Z_oAO_o_o_o_o______________ _____j_o_y_o_y_o_y_y_y_o_v_o_jAO_o_o_oAOAO_v_v_v_v_o____________ _____j_o_y_o_j_y_v_v_y_y_o_j_oAOAOAOAOAO_s_s_v_v_y_y____________ ___e_o_v_y_v_o_j_o_o_o_o_j_v_o_jAOAOAO_s_s_s_s_v_v_v_v_v________ ___e_j_o_v_v_v_y_y_y_y_y_y_y_v_vAOAO_o_o_o_o_o_o_v_y_v_v_v______ _____e_o_o_v_v_v_v_y_y_y_y_y_y_y_y_y_v_v_v_v_v_o_y_y_y_v_o______ _____e_j_o_o_o_v_v_v_v_v_v_v_v_y_y_y_y_y_y_y_o_o_y_y_v_v_o______ _______e_j_j_j_o_o_v_v_v_v_v_v_v_v_v_v_y_y_v_o_v_y_y_v_v_o______ _____________e_j_j_o_o_o_o_v_v_v_o_o_o_o_y_e_o_v_y_y_v_v_o______ _________________e_j_j_o_o_o_o_o_o_e_e_e_e_o_o_y_y_v_v_o_j______ ___________________e_e_e_e_e_e_e_e_v_v_y_y_v_v_y_y_v_o_o_j______ _______________________j_o_e_e_o_o_o_v_v_v_v_v_v_v_o_o_j________ _______________________j_o_s_v_e_e_o_o_o_o_v_v_v_o_o_j_j________ _______________________e_j_s_v_v_s_e_e_e_o_o_o_o_o_o_j__________ _________________________j_o_s_s_o_o_s_o_e_e_e_j_j_j_j__________ ___________________________e_j_o_v_v_s_j_j_j_j__________________ _________________________j_o_s_s_s_j_j_s_o_o_S__________________ _____________________________e_j_j_s_s_s_e_e_j__________________ _______________________________e_e_Z_Z_e_s_s_o_o_________o______ ___________________________________e_j_j_o_o_e_e_o_____o_e______ _________________________________________Z_Z_j_j_o_Z_o_j_e______ _____________________________________________e_e_Z_Z_Z_Z________ ________________________________________________________________ ________________________________________________________________ } # tile 323 (giant eel) { ________________________________________________________________ ________________________________________________________________ ____________________AOAOAOAO____________________________________ ________________AOAOAOBJAjBJAOAO________________________________ ____________AOAOAOBdBdAOAOAOAlBDAlBDAl__________________________ ____________AOAOBdAOAOAOAOAOAOAOAOAOCJBnBk______________________ __________AOAOBdAOAOAOABABABBdBdAOAOAjBJBJBkBl__________________ ________AOAOBdAOAOABABABABBdAjBJBdBdAOAOBkBDBJBJ________________ ________AOAOBdABCuCuABAB_MBdBdBdAlBDBdAOBkBlBkBmBk______________ ________AOBJAOABCuABAB_zAB_zBdBJBdABAOBDAOBJBDCJBl______________ ________AOAjABABAB_MAB_M_MA_BdAjABABAOAlAOBkBkBDBm______________ ________AOABABABAB_z_________M_zABABAOAOBDAOCOBlAlBJ____________ ___________z_M_M_z__________AB_MABABABAOAlAOAjCJBlBk____________ _______________________________$_MABABAOBdAOCJAjBJBm____________ _______________________________OABABABABBdAOBlBkCKBJBl__________ ___________F_F_F_F_F_F_________z_z_MABABAOBdAOBJBmBkBJ__________ _________F_F_F_F_F_F_F_F________AB_M_$ABABBdAOBkBDBkBl__________ _______F_F_F_F_F_F_F_F_F_F_F_____zAB_OABABAOBdAeBkBDCOBk________ _____F_F_F_F_F_F_F_F_F_F_F_F_F_F___M_$_OABABBdAOBkBlBJBk________ _____F_F_F_F_F_F_F_F_F_F_F_F_F_F_F_MAB_MABABAOBdAOBJBkBD________ _____F_F_F_F_____F_F_F_F_F_F_F_F_F_F_zABABABAOBdAOBkBDBkBk______ _____________________F_F_F_F_F_F_F_F_O_z_MABABAOBdAeBkBJBn_H____ ___________________________F_F_F_F_FAK_MAB_zABAOBdAOAOAO_H_H_H__ _______________________________F_F_F_F_M_z_MABABAOBdAO_H_H_H_H__ _________________________________F_F_F_FAB_MABABAO_H_H_H________ _____________________________________F_F_H_H_H_H_H_H_H__________ _____________________________________________H_H_H______________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 324 (electric eel) { ________________________________________________________________ __________________________________CjCjCjCjCj________Cj__________ ____________________AOAOAOAO____________Cj____________Cj________ ________________AOAOAOBJAjBJAOAO______Cj____Cj________Cj________ ____________AOAOAOBdBdAOAOAOAlBDAlBDAlCj______CjCj______Cj______ ____________AOAOBdAOAOAOAOAOAOAOAOAeBkCjBk________Cj____Cj______ __________AOAOBdAOAOAOABABABBdBdAOAOBDBJCjBkBnCj____Cj____Cj____ ________AOAOBdAOAOABABABABBdAjBJBdBdAOAOCjCKBkBJ______CjCjCj____ ________AOAOBdABCuCuABAB_MBdBdBdAlBDBdAOCjBmBkBlBk________CjCj__ ________AOBJAOABCuABAB_zAB_zBdBJBdABAOBdCMBJBDBkCO________Cj____ ________AOAjABABAB_MAB_M_MA_BdAjABABAOBdCMBkBlBJBl________Cj____ ________AOABABABAB_z__By_____M_zABABAOBdCMBnCJBmAlBJ____Cj______ ___________z_M_M_z__CMBy____AB_MABABABBdAOCMAlCKBkBn__CMCMCj____ __Cj______________CMCM_________$_MABABAOBdAOCJAjBJBk__CM____CjCj ____Cj____Cj____CjCMCM_________OABABABABBdAOBMCJBlBJCj__________ ____Cj_____FCjCj_F_F_FByByCj___$_M_zABABABBdAOBDBmBkCj____Cj____ ______Cj_F_F_F_FCj_F_F_F____ByBy_OABCMABABBdAOBkBDBkCP____Cj____ ______Cj_F_F_F_F_F_F_FCj_F_F_____zBy_MABABAOBdAeBkBDBkBk__CjCj__ _____F_FCj_F_F_F_F_FCj_FCj_F_F_FCjByA__MABABBdAOBkCKAjCJ______Cj _____F_FCj_F_F_F_F_FCj_F_FCMCj_FCj_M_MAAABABAOBdAOBJCjAj____Cj__ _____F_F_FCj_____FCj_F_F_F_F_FCj_F_FAB_zABABAOBdAOBkBDCjBkCj____ ____CjCjCjCjCMCM__Cj_F_F_F_F_FCjCj_F_zAB_MABABAOBdAeBkCjBnCj____ ____________CMCMCM_________F_FCj_FCj_M_M_$_OABAOBdAOAOAOCj______ ______________________CjCj_____FCj_F_FABCM_MABABAOBdAO__________ ________________CMCjCjCjCj_______FCj_F_FCMABABCMCMCMCMCMCMCjCj__ ________________CMCj______Cj_________F_F_HCjCMCM_H_H_H_ICjCj____ ____________Cj__CM__________Cj________CjCjCj_H_H_H__CjCj________ ______________CjCM________Cj__Cj____CjCj____________Cj__________ ________________CM________Cj____Cj__Cj________________Cj________ ________________________Cj________Cj__________________CjCjCj____ ________________________________________________________________ ________________________________________________________________ } # tile 325 (kraken) { ___________d_____________________________________________i______ __________BJ_d_________________________________________i_d______ __________Aj_d_d___________________________________i_i_d________ ____________BJ_d_________d_d_d_d_d_d_____________i_i_d__________ ____________Al_d_____d_d_Y_Y_Y_Y_Y_d_d_________i_i_d____________ __________AlBD_d___H_d_d_Y_H_H_H_Y_Y_d_H_H___H_H_d_d_H_____d_d__ _____d____BD_d___H_H_H_H_H_H_H_H_H_H_H_H_H_H_H_H_H_H_H___dBJ____ _____d____Al_d_H_H_H_H_H_H___H_H_H_H_H_H_d_d_d_d_d_d_H_i_i______ ____BJ__Aj_d_d_H_H___________H_H_H___d_d_d_d_d_Y_d_d_iBJ_H______ _____i_dBJ_d_d_______i_i_i_i_____d_d_d_d_d_d_d_d_d_d_dAj_d_d_d__ _____i_d_d_d_d_____i_i_d_i_d_d_d_d_d_d_Y_Y_Y_Y_Y_Y_iBJ_i_Y_Y_d_d ___HBDAl_d_d_____i_d_i_i_d_d_i_d_d_Y_Y_Y_Y_Y_Y_Y_Y_iAl_d_Y_O_Y_Y ___H_H_i_d_____H_H_i_d_d_i_d_d_d_Y_Y_Y_O_O_O_O_O_i_d_i_O_O_O_O_O ___H_H_i_d_d___H_H_H_i_d_d_i_dCMCM_Y_O_O_O_O_O_O_iBD_d_O_O_O_O_H _____H_HBJ_d_______H_H_H_d_dCMCM_ACM_Y_H_H_H_H_O_dAl_d_O_O_O_H_H ________Aj_d_d_______H_H_O_OCMCM_ACM_O_H_H_H_H_i_dBD_d_H_H_H_d_H _________i_i_d_d_____H_H_H_O_OCMCM_O_H_H_____H_i_d_i_H_H_H___d__ ___________i_d_d_________H_H_H_H_H_H_H_H_____i_dAlBJ_______iBJ__ ____________BJ_d_d_________H_H_H_H_H_H_______i_dBD_________dAl__ _____________i_d_d_______________________i_i_dBDAl_______i_d_i__ _____________i_i_d_d___________________i_dBJAl_i_______i_dBDAl__ ____________AlBJ_d_d_______________H_i_dAj_i___________i_d_i____ _______________i_i_d_____________H_H_HBJAl___________i_dBJAj____ _______________i_i_d_d___________H_H_H_H_H_________i_d_i_i______ ______________BD_d_d_d_____________H_H_H_H_______i_dBJAl________ _______________i_i_d_d_________________________i_d_dAj__________ _______________i_i_d_d_H___________________i_i_i_d_i_i__________ ______________BJ_d_d_H_H_____________i_i_i_d_d_dAlBJ____________ _______________H_H_H_H_H___________H_d_d_d_dBD_i_i______________ _________________H_H_H_H_________H_H_H_d_dAjAlBJ________________ _________________________________H_H_H_H_H_H_H__________________ _____________________________________H_H_H_H____________________ } # tile 326 (newt) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____________________________BJAjBJAeAeBJAe______________________ ________________________AeAlAOAOAOBNAOAeAlAO____________________ ____________________AeAeAeAOAOABABAqAqAeBDAOAO_A________________ __________________AeBNAOABBNAq_A_A_A_AAeAlAOAO_A_A______________ ________________AeABAqAB_A_A_AAOAO_AAOAeBDAOAOAB_A_A_A__________ ________________Ae_A_A_A_A_AAOAjBJAOAeAlAOAOBJAOAq_A_A_A________ _________________A_A_A_A_A_AABABAeAeBDAOBNAOAOAjAOAB_A_A_A______ ___________________________AAeAeAeAlAOAOBNABAeAeBJAOAq_A_A_A____ ____________Ae________AeAeAeAeBJAOAOAOAOBNAq_A_AAeAOAB_A_A_A____ __________AeBdAOAOAeAeAeAlBJAjAOAOAOBNABABAB_A_A_AAeAO_A_A_A____ ________AOAOAOAOAeAeBJAjAOAOAOAOAOAOBNAB_A_A_A_AAqAeAeABAB_A____ ________AO_A_AAeAeAlAOAOAOAOAOAOABAqAq_A_A_A_A_AAq_AAB_A_A_A____ _________A_AAeAOBdCBCBAOBNBNBJAlBNAB_A_A_A_A_A_A_A_AAB_A_A_A____ ___________AAeBdAOCBCBBNBNBNAeAeBDAOAB_A_A_A_A_____A_A_A________ ___________AAOAOAOABABAB_A_A_A_AAeAlBNAq_A_A____________________ ___________ABNABAqAq_A_A_A_A_A_A_AAeBDAO_A_A_A__________________ ___________A_A_A_A_A_A_A_A_A___A_A_AAlAeAOAO_A__________________ _____________A_A_A_A_A___________AAOAeAe_A_A____________________ _________________________________AAO_AAO_A_A____________________ ___________________________________A_A_A_A______________________ ________________________________________________________________ ________________________________________________________________ } # tile 327 (gecko) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________CN_A__CN__________________________Bz_g__ __________________________CNBz_A_A________________BzCNCN_bCkBzBz ________________________Bz_gBbCNBz_A___________bBz_b_kCN_kBz_b_A ______________________BzCkCNBz_A_A________BzCk_gCkCNCNBzBzBzBb_A ____________________BzCNBzBz_A_A______BzCN_kCNBz_g_kBz_bBbBb_A_A __________________BzCk_kBz_A_A_ABzCNCN_kCkBz_bB_B_BbBb_A_A_A____ __________CN_H_A__BbBz_fCNCkCk_g_gCkCN_fB_B__A_A_M_A_A_A________ ______BzCNCNCkCN_A_ABbB_BzBzCNCkCNCNBzBb_M_B_A_A_A_ACN_ACN_A____ CNBz_bCNBz_fBz_gCN_A_A_ABz_fCNBz_bCN_gCkBbCN_A______CNBz_A_A____ _A_ABz_gBzBbB__bCk_ABzBzCk_kCNCN_kBz_fBzBzCk_bBz_gCNCNBzCNCN_A__ __CN_A_bBb_A_ABzCNBzClCkCNCN_kCNBzB_B_BbBbBb_gCkCN_bBz_A_A_A_A__ __CN_ACN_A_A_ABz_gCl_k_gCkCNCNCNBb_M_A_A_A_ABzBzBz_A_A_A________ ___A_ABz_A____BzCNCN_gCNCN_gCNBzB__A_A_______A_A_A_A____________ _______A_A____BzCkCNCNBzCN_fCkBb_B_A____________________________ ____________Bz_g_fBzBbBbCNCNCk_A_A_A____________________________ ________BzBzCkBzCNBbB_B_BzCNCNCkBz_A____________________________ ______Bz_gClCNCN_bBb_A_MBz_fCkCN_A_A____________________________ ______CCClCNCNBzBbB__B_A_A_fCk_g_b_A____________________________ ____BzClCNCCCCBzBbB__A___ACkCNBzBz_A____________________________ ____BzCl_gCCBzBbB__M_A___A_ACNBz_A_A____________________________ ____CNBzBzBbBbB__B_A_____ABz_g_b_A_A____________________________ ____BzBbB_B__M_A_A______Bz_ABbCN_A_A____________________________ _____A_A_L_B_A______CNCN_ACN_ABbCN_A____________________________ _____________________A_A_ACN_A_A_A______________________________ ___________________________A_A__________________________________ } # tile 328 (iguana) { ______________________________BMBM______________________________ ______________________________BMBnBM_________A__________________ ________________________________BMBMBM_______A_A________________ __________________________________BnBnBMBM_____A_A______________ ____________________________________BMBnBMBM_____A_A____________ ______________________________________BnBMBFBD_____A_A__________ ________________________________________BnBMBF_____A_A_A________ ________________________________________BnBMBFBD_____A_A_A______ ________________________________________BnBMBMBF_____A_A_A_A____ ______________________________________BDBnBMBMBMAi___A_A_A_A____ ______________________________________AiBMBMBMBMBM___A_A_A_A____ ______________________________________BMBnBMBMBMBd___A_A_A_A____ ____________________________________BMBnBMBMBMBMAi___A_A_A_A____ ______________________________BnBnBMBnBMBMBMBMBMBMBD_A_A_A_A_A__ ____________________________BMBDAiBMBMBMBMBMBMBMBMBM_A_A_A_A_A__ ________________________CmCmAiBdBnBMBMBMBMBMBMBMBMBM_A_A_A_A_A__ ____________________________CmBnBMBMBMBMBMBMBMBMBMBMBD_M_A_A_A__ __________________________BDBnBMBMBMBMBFBDBMBMBMBMBFBFBD_A_A____ ______________________BDAiBFBnBMBMBMBMBMBMAiBdBFBMBdBFBFAi_z____ ______________BnBnBnBMBFBDBFBMBMBMBMBMBMAiBdAi_A_A_AAiBFBdBD____ ____________BnBMBMBMBMBMBMBMBMBMBMBMBMBMBdAi_z_A_ABMBMCmAiAi____ ________BnBnBMBM_ACmBMBMBMBMBMBMBMBMBFBdAi_z_A_ACmCm_ACm_zCo____ ______BnBMBMBM_ACmBMBMBMBMBMBMBMBMBMBDAi_z_A_A_A_A_A_ACm_A_A____ ____BnBMBMBMBMBMBMBMBMBFBDBMBMBMBMAi_M_A_A_A_A_A_A_____A________ ____BnBMBMBMBMBMBMBMBMAiBdBFBMBMBDBd_A_A_A_A_A_A________________ _____ABM_ABMBMBMCmCEBM_ABdAiBMBMBFBF_A_A_A_A_A__________________ ______BMBMBMCmCECEBM_A_A_ABdBFBMBMBM_A_A_A_A____________________ ________CuCECECEBM_______A_A_A_ABMBFBD_A_A_A____________________ ______CuCuCmCECmBM_________A_A_ABMBMBFAi_z______________________ ____CuCu__BMBMBM_____________ABMBMBM_ABd________________________ ____Cu______________________Cm___ABM__Cm________________________ __________________________________Cm____________________________ } # tile 330 (lizard) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ _____________________________n_n_n_n_n_n_n______________________ _________________________n_n_i_i_i_i_i_n_n_i____________________ _____________________n_n_i_i_i_d_d_d_d_n_n_i_i_A________________ ___________________n_i_i_d_d_d_A_A_A_A_n_n_i_i_A_A______________ _________________n_d_d_d_A_A_A_i_i_A_i_n_i_i_i_d_A_A_A__________ _________________n_A_A_A_A_A_i_i_i_i_n_n_i_i_i_i_d_A_A_A________ _________________A_A_A_A_A_A_d_d_n_n_n_i_i_i_i_i_i_d_A_A_A______ ___________________________A_n_n_n_n_i_i_i_d_n_n_i_i_d_A_A_A____ _____________n_________n_n_n_n_n_i_i_i_i_d_d_A_A_n_i_d_A_A_A____ ___________n_n_i_i_n_n_n_n_n_i_i_i_i_i_d_d_d_A_A_A_n_i_A_A_A____ _________i_i_i_i_n_n_i_i_i_i_i_i_i_i_d_d_A_A_A_A_d_n_n_d_d_A____ _________i_A_A_n_n_i_i_i_i_i_i_i_d_d_d_d_A_A_A_A_d_A_d_A_A_A____ _________A_A_n_n_iCuCu_i_d_d_n_i_i_d_A_A_A_A_A_A_A_A_d_A_A_A____ ___________A_n_i_iCuCu_d_d_d_n_n_i_i_d_A_A_A_A_____A_A_A________ ___________A_i_i_i_d_d_d_A_A_A_A_n_i_i_d_A_A____________________ __________Cz_d_d_d_d_A_A_A_A_A_A_A_n_i_i_A_A_A__________________ ____CzCzCzCzCz_A_A_A_A_A_A_A___A_A_A_n_n_i_i_A__________________ ________Cz___A_A_A_A_A___________A_i_n_n_A_A____________________ ________Cz_______________________A_i_A_i_A_A____________________ ___________________________________A_A_A_A______________________ ________________________________________________________________ ________________________________________________________________ } # tile 331 (chameleon) { ________________________________________________________________ ____________________________________________AnAnAnAnAnAn________ ______________________________________AnAgAnAgAnAnAgAgAnAn______ __________________________________AnAnAnAnAnAnAQAgAQAQAQAQAg____ ______________________________AnAnAnAnAgAnAgAQAgAQ_A_A_AAQAgAg__ ____________________________AnAnAnAnAgAnAgAnAgAQAQ_A_A_A_AAQAgAg __________________________AnAnAnAgAnAnAgAgAQAgAQ_A_A_AAg_A_AAQAg ________________________AnAnAnAnAnAgAgAnAgAgAQAQ_A_AAQAg_A_AAQAg ______________________AnAnAnAgAnAgAnAgAgAnAQAgAQ_A_AAQAg_A_AAQAg ____________________AnAnAgAnAnAgAgAgAQAnAgAgAQ_A_A_AAQAg_AAgAgAg ____________________AnAnAnAnAgAnAgAgAgAgAgAgAQ_A_A_AAQAgAgAgAg_A ____________An______AnAgAnAgAgAgAgAQAgAQAnAgAQAQ_A_A_AAQAQAg_A_A __________AnAn____AnAnAnAgAnAgAgAgAgAgAQAQAnAgAgAQ_A_A_A_A_A_A__ ________AnAnAgAnAgAQAgAnAgAgAQAnAQAgAQAgAQ_AAnAQAQAQ_A_A_A______ ________AgAnAnAnAgAQAgAgAgAnAgAQAQAQAQAQ_A_A_AAg_A_A_A_A_A______ ______AnAnAgAnAgAnAQAgAgAgAgAnAgAgAgAQAQ_A_A_AAgAg_A_A_A_A______ ______AnAgAnAgAgAgAgAQAQAgAQAgAgAgAQAQ_A_A___A_A_A_A_A__________ ______AgAnAgAgAgCPBdAgAQAQAgAQAnAgAQAQ_A_______A_A_A_A__________ ______AnAnAgAnCPBd_ABJAgAQAQAQAQAgAQAQ_A________________________ ______AnAgAgAgBdBd_AAjAQAQAQ_A_AAnAgAQ_A________________________ ____AnAgAnAgAnAgBJAlAQAQAQ_A_A_AAgAgAQ_A________________________ ____AgAnAgAgAgAgAQAgAQAQ_A_A_AAQAnAgAQ_A________________________ ____AgAnAgAgAQAgAQATAQAQ_AAnAgAnAgAQ_A_A________________________ ____AnAgAgAQAgAQATATAQ_A_AAg_AAgAgAQ_A_A________________________ ______AnAgAgAgATATATAQ_A_A_A_AAgAQ_A_A__________________________ ______AgAgAgATATATAQ_A_A_A_AAQAQ_A_A____________________________ ______AgAg_AAQATATAQ_A_A_A_A_A_A_A______________________________ ___________AAQAQAQ_A_A__________________________________________ _____________A_A_A_A____________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 332 (crocodile) { __________________________AeAeAeAeAe_A_A________________________ ____________________AeAlBJAeAjBJAeAeBJAe_A______________________ ________________BJAjAeAeAeAeABAlAeAjAeAeAe_A____________________ ______________AeAeAeABABABABABBDAeAeAeBJAeAe_A__________________ ____________BJAeABAB_A_A_A_A_AAeAeAlAeAjAlAeBJAeAlAe____________ __________AeAeABAB_A_A_A_ABJAeAlAeBDAeAeBDAeAeAeAeBDAeAeAe______ ________BJAeAB_A_A_____AAeAeAeAeAeAeAlAeAeAlAeAeABABAeBJAeAe____ ________AjAe_A_A______AeAjAeAeABAeAeAeBJAeBDAeAeAeABABABAeBJ____ ________AeAB_A_______AAeAeABAe_AAeBJAeAjAeAlAeAeABABABAeABAeAe__ ______AeAB_A________ABBJAeAeAB_AAeAlAeAeBDAeAeBJABAB_AABABAlAe__ ______Ae_A___________AAe_AAe_ABDAeAeAeAlAeAlAeAeABAe_AABAeAB_A__ _______________________A_A_AAeAeAeBDAeAeBDAeAeAjABAB_A_AAB_AAB__ _________________________AAeAlAeAeAeAlAeBJAeAeAeAeAB_A_A_A_A____ ____________________AeBJAeAeBDAeAeAeBDAeAeAeAeABABAB_A_A________ ________________BJAeAjAeAeAeAeAeAlAeAeAlAeBDABABAB_A_A__________ ________________AeAeAeAeAeBJAOBDAeAeBDAeAeAeABAeAB_A_A__________ ______________ABAeABAeABAlAeAeAeAeAeAeAeAeABABAB_A_A____________ ____________ABAeAeABABBDAeAeBDAeAlAeAeAeAlAeAB_A_A_A____________ ___________AAB_A_AABABAeAlAeAlAeAeAeAeAeAeAeAe_A_A______________ ___________A_A_AAeAlBJAeAlBDAeAeAeABAeABAeAeBJAe_A______________ _______________ABDAeAjAeCBCBAeAeABAeABAeAeAeAeAe_A______________ ________________AeAlAeBJCBAeAeABABAB_AABABAjAeAe_A______________ ________________AeAeAeAjAeAeAeAeABAB_AAeABAeAe_A_A______________ ________________AeBDAeBJAeAeABABAB_AABAeABBJAB_A_A______________ ______________BJAeAeAeAeAeABBNAB_A_AAB_AAeABAe_A________________ ____________AeAeAlAeAeBJAeBkAB_A_A_A_A_AAe_AAe_A________________ __________BJAeAjAeAeAlAeBNAB_A_A_A_A_A_A_A_A_A__________________ ______AeAlAeAeAeAeAeABBlAB_A_A_______A_A_A______________________ ______AeAeAeAeAeAeAeBNAN_A_A____________________________________ ______AeAeBDAeAeBNBkAB_A_A______________________________________ ________BNBkBNBkAOAB_A_A________________________________________ ________ABABABAB_A_A_A__________________________________________ } # tile 333 (salamander) { ________________________________________CECE____________________ ____________CECE____________________CECECE______________________ ____________CfCECECECECE__________CECECf________________________ ______________CjCfCfCfCECE________CECfCfCE______________________ ________________CfCjCfCfCECx______CECICE________________________ ________________CbCECbCECECECx__CbCECECf__________CECxCECE______ __________________CfCfCfCfCECbCxCbCbBvCECE______CECxCE__________ __________________CjCfCECbCECbCxCxCbCECE____CECECxCE____________ ______CECECxCE______CbCECjCfCECjCxCjBv____CECYCxCE____CxCxBrBr__ ____________CECxCxCx______CfCECbCxB$CI__CECxCYCEBRCxCxCEBr______ ______________CECYCECxCxCE__CfCECxBrBRCECxCECEBRCxCEBrBr________ ____CxCECECECEBRBRCECYCYCxCxBRCECbCEBRCxCEBRBRCxCEBr________CrCr CEBrCxCxCxCxCxCxBrBRCECECECxCEByCECECMCEBRBRBrCEBRBR____CrCxCECL ______BrBrCECECECxCEBRBRCECECjCjBaCjCjCjBRBrCEBRBRCECxCrBrBrCx__ ______________BRBrCECECEBRCjCjCMByCjCjCMBRBrBRBRCrCrCrCLBbBrBR__ ____________BRBRBRBRBRCECECjCMCMByCjCMCMBrCECrCrCLBZCLBrBR______ ____________CECbCxCEBRBRBRCECMByBaByByCrCrCrCLBZ_zBRBRBR________ __________CECxCxCEBrBR__BRCEByByBaCrCrCLBbCL_A_A________________ __________CECxCbCEBr_____ACECMCrCrCLBZBr_z_A_A_A__________CECxBR __________CECECxCbCx___ACrCrCrBZCLCMBaBr_A_A_A______CECbCxCEAv_A ____________CECECECxCxCrCLBbCLBaBaBaCEBr_A_A_ACECECxCbCxBRAv_A__ ________________CECxCECx_ABrCECMCMCMCEBr_ACECbCxCxCEBRBrBR_A_A__ ______Co____CrCrCLCEBrBrCbCxCECMCMBaCEBrCECbCxCEBRAvAv_A_A______ ______CoCrCrCLBbBrBrCxCbCxCbCEBaBaCMCEBrCxBrCEBrBR_A_A__________ ____CoCVBkCLCbCxCxCxCbCECECbCECMCMCMCEBrBrCEAvBR_A______________ __CoCPBk__CbCECxCbCECECECbCEBaCMCMBaBrBrBRAv_A_A________________ CVBk____BRCECxCbCxCbCECbCECbByBaBaCEBrBrAv_A_A__________________ _______AAvBRBrCxCbCxCxCbCEAzByByByCEBr_A_A_A____________________ _______A_AAvBrBRCxCbBrCECEBaAzBWAzB$Br_A________________________ _________A_AAvBrBrBRCEAwAzBaBaBaBrBr_A_A________________________ ___________A_A_AAvBRAvBRAzAgBWAgAv_A_A__________________________ _______________A_A_A_A_A_L_A_A_A_A_A____________________________ } # tile 334 (long worm tail) { ____________________CICICIBvCICIBvCICICICICIBvCI________________ ________________CICICICIBvCIBvCICIBvBvCICIBvBvCICICICI__________ ____________CIBvCICICICICIBvCICICICfCICICfCICfCfCICICICI________ __________BWBWBvBvBvBvBvBvBvCICfCICfCICfCfCICfCICICICICICI______ ________BWBWBvBvCICICICIBvCICfCICICICICICfCICICICfCfCICIBv______ ______BWBvCIBvCICICICIBvCICfCICfCICICICICfCICICfCfCICIBvCICI____ ____BWBWBvBvBvCIBvCICIBvCICICfCICfCfCfCICICICICICICICICICICI____ __BWBWBWCfCfCfCIBvCIBvCICICfCICICfCICICfCICICICICICfCfCfCICICI__ __BWBWCf_A_ACfCICIBvCICICICICfCICfCICICICfCICfCICICICICICICIBv__ AzBWBvCf_A_ACfCIBvCIBvCICICICfCICICICfCICICICICfCICICfCICICICICI AzBWBvBvCfCfBvCICICICICICICICICICfCICfCICICICICICfCICICICICIBvBv AzBWBWBWBWCIBvCIBvBvBvBvBvBvCICICICICICICfCICfCfCICfCICIBvBvBvCI AzBWBvBvBWBvBvBvCICIBvCICICICIBvCICICfCICfCICICfCfCICICIBvCICIBv AzBWBvBvBvBvCIBvCIBvBvCICIBvCICICIBvCICICICfCICfCICICICICIBvCIBW AzBWBvBvBWBvBvBvBWBvCICIBvCICICIBvBvCICICICICIBvCICICICIBvCICIBW AzBWBWBvBWBvBWBWBWCIBvCICIBvCICIBvBvCICIBvCICIBvBvCICIBvCIBvBvBW AzAzBWBWBWBvBWBvCIBvCICIBvCICIBvBvBvCICIBvCICICIBvCICICIBvBvCIBW AbAzBWBvBvBWBWBvBvBvBvCICICIBvBvBvBvCIBvCICIBvBvBWBvCIBvCIBvBvBW AbAzBWBvBvBWBvBvBvBvBvBvCIBvCICIBvCIBvCIBvCICIBvBWBvBvCICfCfBvBW AbAzBWBWBvBWBvCfCfCfCfCICIBvCICIBWCICICICIBvBvCIBWBvCICf_A_ACfBW AbAzBWBWBvBWBvCf_A_ACfCfBvCIBvBvBWBvBvCIBvBvCIBvBWBWBvCf_A_ACfBW AbAbAzBWBvBWBv_A_A_ACICfBvBvCIBvAbBvCIBvBvBvBvBvBvBWBvCf_A_ACfBW __AbAzBWBWBWBvCf_A_ACfCfBWCIBvCIBWBvCIBvBvCIBvCIBvBWBvBvCfCfBWBW __AbAbAzBWBWBvBvBvBvBvBvBWBvBvBvBWBvBvBWBWCIBvBvBvBWBWBvBWBvBWAz ____AbAzAzBWBWBvBvBvBWBvBWBvBvBvBWBvBvBWBvBvBvBvBWBvBWBvBWBvBWAz ____AbAbAzAzBWBWBvBvBWBvBvBWBvBvBWBvBvBWCfCfCfBvBWBvBWBvBWBWAz__ ______AbAbAbAzBWBWBWBvBvBvBWBvBvBWBvBWBvCf_A_ABvBvBWBWBvBWAzAz__ ________AbAbAbAzBWBWBWBvBvBWBvBvBWBvBWBvCf_A_ACfBvBWBWBWBWAz____ ____________AbAbAzAzBWBWBWBWBWBvBWBvBWBvBvCfCfCfBWBWBWBWAzAb____ ______________AbAbAzBWBWBWBWBWBWBWBWBWBWBWBWBWBWBWBWAzAzAb______ ________________AbAbAzAzAzAzAzBWBWBWBWBWBWBWBWBWAzAzAbAb________ ____________________AbAbAbAbAbAzAzAzAzAzAzAzAzAzAbAb____________ } # tile 335 (archeologist) { ________________________________________________________________ __________________________AwAw__AAAA____________________________ __________________________AwAwAYAY_z____________________________ ________________________AwAwAYAYAYAAAA__________________________ ________________________AwAwAYAYAYAA_L__________________________ __________________AYAYAYAYAYAYAYAYAYAYAYAYBS____________________ ________________________CTCnCnCTBwCGBV__________________________ ________________________CT_A_ACT_A_LBV__________________________ ________________________CTCnCnCTBwCGBV__________________________ __________________________CnBjCGBbBV____________________________ ________________________AABwBVBVBVBVAA__________________________ ____________________AwAY_zAABdBVBJAA_NAYAY______________________ __________________AwAwAYAAAABdBdAlAAAAAYAYAY____________________ __AA______________AwAwAYAA_LAYBdBD_zAAAYAYAYAY__________________ __AA____________AwAwAwAYAAAAAYAYAlAA_NAYAAAYAY__________________ ___zAA__________AwAYAwAwAY_zBdAYAYAAAYAYAAAYAYAY________________ __AA_NAA______AwAwAYAwAwAYAABdBdAYAAAYAY_zAAAYAY___A_A_A_A______ __AA__AA____AwAwAYAYAwAwAYAABdBdBJ_zAYAYAAAAAYAY_A_A_A_A_A_A____ ___z__AA_zAwAwAwAYAwAwAYAA_L_A_A_A_AAAAYAJAAAYAY_A_A_A_A_A_A____ __AA____AAAwAwAwAYAwAwAYAAAwAwAwAwAwAAAYAYAAAYAY_A_A_A_A_A______ __AA____AACTAwAY__AwAwAYAAAwAYAYAwAY_LAYAY_zBwBV_A_A_A_A_A______ ___N______CTCT____AwAwAY_zAwAY_AAwAYAAAYAYAABjBV_A_A_A_A_A______ __AA__________________AwAwAwAY_AAwAYAYAA_A_A_A_A_A_A_A_A________ __AA__________________AwAwAYAA_AAwAYAYAA_A_A_A_A_A_A_A__________ ___z__________________AwAwAYAA_AAwAYAY_z_A_A_A_A_A_A____________ ____AA________________AwAwAJAA_AAwAYAYAA_A_A_A_A_A______________ ____AA________________AwAwAYAA_AAwAYAYAA_A_A_A_A_A______________ ____AA_______________AAwAwAYAA_AAwAYAYAA_A_A_A_A________________ _____L_______________AAwAwAYAA_AAwAYAYAA_A_A_A__________________ ____AA_____________AAYAYAYAJAA_AAYAYAYAYAY_A____________________ ____AA_____________A_A_A_A_A_A_A_A_A_A_A_A_A____________________ ___________________A_A_A_A_A_A_A_A_A_A_A________________________ } # tile 336 (barbarian) { ____________________________________________________________BsBS _______________________________A_A_A_A_A________________BsBsBSAw _______________________A_A___A_ACnCiCnABAB______CiCnBsBsBSAwAw__ ______________CmCm_________A_A_zCnCiCnAB_A_A__CnCABiBSAwAw______ __________CmCmCPCP_____A_A_A_ACn_SCiABCn_A_ABsCiBiAwAwCiCnCl____ ______CmCoBkBkBd_____A___A_A_ACnCiCnCiCn_ABSBiAwAw__CTCnCiCgCl__ __CmCmCPBnBkBkBD_______A_A___ACnCnCiCiCTCnBSAwClClCiCnCnCnCnCiCl __CJCPBkBkBDBD________CiCnCnCiCTCnCnCnCTCTCnCiCnCgClClCnCnCnCiCn ____BkBDBDBDBD____CiCnCiCiCnCnCnCTCTCTCnCnCnCiCnCiCnCiCnCiCnCiCn ______BDBDBDBSBiCnClClCiCnCiClClCiCnCnCiClCnCiCnCnCnCnCiCiCnCnCT ______BDBsBSBSCiClCnCiCnCnCiCnCiCiCnCiCnCiClCiCTCnCnCnCnCTCT____ ____CsBsBSBDBdCiCiCnCnCnCnCnCiCnCiCnCiCnCiCnCn____CTCTCT________ ____CLBDBDBDCnCnCiCnCnCnCTCnCiCnCiCnCnCiCnCnCn__________________ ______BDBkBkCnCnCiCnCT__CTCnCnCnCnCiCnCnCnCT____________________ ____BkBkBkCJCTCnCiCnCn__CTCTCnCTCTCnCTCnCnCn____________________ ____BkBkCoCmCTCnCnCl______CTCnCnCnCnCnCnCn______________________ __CmCoCm______CTCnCiCiCi__AqATATAuCrCUAXAT_________A_A_A_A______ ________________CTCnCnCiCnATATATATCLCLATAT_____A_A_A_A_A_A_A_A__ __________________CTCnCnCnCICfCfCfANCfCICICI_A_A_A_A_A_A_A_A_A_A ____________________CTCTAKCIANCfCjCfCfABCICfCI_A_A_A_A_A_A_A_A_A ______________________CICfCfCjAZCfCfCfCICfABCICI_A_A_A_A_A_A_A_A ______________________CfCjCnCfCfCf__CfCnCTCfCICI_A_A_A_A_A_A_A__ __________________________CnCnCnCT_zCTCnCiCT_A_A_A_A_A_A_A_A____ ________________________CnCiCnCnCT_ACTCnCnCnCi_A_A_A_A_A_A______ ________________________CiCnCnCT_A_A_ACTCnCiCn_z_A_A_A_A_A______ ________________________CnCnCnCT_A_A_zCTCnCnCT_A_A_A_A_A________ _______________________ACTCTCT_z_A_A_ACTCTCTCn_A_A_A_A__________ _____________________A_ACTCnCT_A_A_A_A_ACTCnCTCT_A_A_A__________ ___________________A_ACTCTCnCT_A_A_A_A_ACTCnCnCT_A_A_A__________ _________________A_zCnCiCnCnCT_A_A_A_A_ACTCTCnCnCi_A_A__________ _________________A_ACTCnCTCT_A_A_A_A_A_A_ACTCTCT_z_A____________ ___________________A_A_A_A_A_A_A_________A_A_A_A_A______________ } # tile 337 (caveman) { ____________________________BdBdBd______________________________ __________________________C$CmCmCmCmBd__________________________ ________________________C$CmBsC$CmCmCmBd________________________ ________________________C$BsBsC$BsC$CmCm________________________ ________________________BsBsBsBsBsBsBSC$________________________ ________________________BsCnBsBsCnBsBsBS________________________ ______________________BsAIAICiCnAXAIBsBS________________________ ______________________BsCn_fClCi_fC$BSBS________________________ ____________________BsBsBsClCnCnCnBsBSBSBS______________________ ____________________BSBsBsCAAXAXBsBSBSBSBSBS____________________ ____________________ClCiCABSBsBsBSBSBSCiCnBi____________________ __________________CiClCiBiCiBsBSBiCnBiClClCnCi__________________ ________________ClCXCXClCiCiBiBSCiClCiCXCXClCnCi________________ ________________CXCiClCgCXCiBiCnCXCiClCiCiCXClCn________________ ________________ClCXCgCnCnClCXClCXCXCgCnCiCiCnCiCn______________ ______________CnCiCnCnCnCiCXCiCiClCnCnCdCnCiCiCiClCi____________ ____________ClClCgCi__CTCnCnCnCiCgCnCnCiCTCnCnClCXCn____________ ____________CXClCnCn____CnCnCnCnCnCnCTCnCT____CiCnCiCn__________ ________BsCnCiCnCn______CFCnCnCnCiCnCTCTCA______ClClCi__________ ________ClClCiCn__________CzCnCiCnCTCFCFBs______CnClCn__________ ________CiCiCn__________CcCcCcCyCcCFCFCABs____ClCiCg____________ ________CiCcCn__________CcCFCFCFCFCFCFCFBs____CnCiCn____________ __________CFCA________CcCFCFCFBsBsCFCFCFCFBs____________________ __________CFCFCPCP____CcCFBsBs____BsCFCFCFBs____________________ ______C$CmCmCFCmCP____ClClCA________CiClCn______________________ ______C$CmCmBs__CP____CXCiCi________CnClCi_______________A_A_A__ ______C$C$____________CnClCi________CnCiCnCi_____A_A_A_A_A_A_A__ ________________________CiClCn________CnCiCn_A_A_A_A_A_A_A_A____ ________________________CiClCi_____A_ACnCiCn_z_A_A_A_A_A_A_A____ ________________________CnCnCnCn_A_A_zClClCn_A_A_A_A_A_____A____ ______________________CnCiCnCi_$_A_ACnCiCnCn_z_A_A_A_____A______ ________________________________________________________________ } # tile 338 (cavewoman) { ______________________________________________CiCn______________ ______________________________BsBsBS__________CiCnCi____________ ____________________________BsBSBsBSBS__________CjCc____________ ____________________________BS_KCi_KBSBS________CfCI____________ ____________________________BSCnCiCnBiBSBS______CiCn____________ ____________________________BSCTCnCnCnCiCnCiCnCiCnCn____________ ____________________________CFBSCnCiCiCnCnCnCnCnCnCn____________ ____________________________BiCiCnCiCnCcCnBi____________________ ____________________________CnCnCFCnCcBsBS______________________ ____________________________CiCFBsBsCFBsCT______________________ __________________________CnCiCTCACiCnCiCn______________________ ________Bk__________CnCjCnCiCn__CiCnCiCnCn______________________ ________CVBkCPBkCjCiCnCnCjCn____CnCiCiCnCn______________________ __________CVCVCVCjCnCi__________CcCnCrCnBiAx____________________ ______________________________CFCFBsBiBSBTBS____________________ ____________________________CFCiBsBsBsBSBSBSB___________________ __________________________BsCiCnCEBsBsBSAxBSBS__________________ ________________________CFCiCnCiBRBsAMBSBTBTBS__________________ ________________________BsCnCiCnCnAwBSAbCTBSAe__________________ ______________________CFCiCnCiCnBwBSAwCnCdAxAx__________________ ______________________BsCiCnCiCnBcAbAwCnCnAxAM__________________ ______________________CiCnCiCn____AwCTCnCTAxAx__________________ ______________________CnCiCn________CnCnCTB_____________________ ____________________CiCnCi__________CnCnCT_O_M__________________ ____________________CjCi____________CiCTCT_$AB___M_M____________ ____________________CiCj__AA_M____AKCnCTCn_O_z_MAK______________ __________________CiCn_______MAA_M_MCnCTCG_L_MAB________________ ________________CnCiCn________A__MAKCnCT_M_O_z__________________ ______________CiCnCn_________M_MAA_BCjCjAK_MAB__________________ ______________CnCi______AB_MAA_MA_AACiCTAA_z____________________ ____________________AA_M_z_M________CiCT_A_O____________________ _________________M_M_M____________CiCnCT_z______________________ } # tile 339 (healer) { ________________________________________________________________ ____________________Cm_A_A______________________________________ __________________CmCmCm_A_A____________________________________ ________________CmCmBk_A_A_A_A__________________________________ ______________CmCmBk_M_zBn_A_A_A________________________________ ______________CoBk_zCn_ABnBn_A_A________________________________ ________________Cm_ACl_zBnBnCl_z_A______________________________ ____________________CnClClBn_z__________________________________ _________________$AGAGCnCn_z_A__________________________________ ___________________$_ACGBw_A_A_A_A______________________________ _________________A_ACYCYBoCY_A_A_A_A____________________________ _______________A_ACYC$CYCYC$CY_A_A_A____________________________ _______________A_A_ACYC$CYC$_A_A_A_A____________________________ _________________ACY_AC$C$CY_A_A_A_A____________________________ _______________A_A_A_ABkBk_A_A_A_A_A____________________________ _______________A_A_A_A_A_A_A_A_A_A_A____________________________ _____________A_A_A_A_A_A_A_A_A_A_A_A____________________________ _____________A_A_A_A_A_A_A_A_A_A_A_A_A__________________________ _____________A_A_A_A_A_A_A_A_A_A_A_A_A__________________________ ___________A_A_A_A_A_A_A_A_A_A_A_A_A_A________BNBNBN____________ ___________A_A_A_A_A_A_A_A_A_A_A_A_A_A______BNAqBNAqAq__________ ___________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A__ChAqCnAqAqAqChCK______ ___________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A__CKCKCnClClATCKCK______ ___________A_A_A_A_A_A___A_A_A_A_A_A_A_A____CdCdCnCdCG__________ ___________A_A_A_A_A_A_A___A_A_A_A_A_A_A____ClCdCdCGCl__________ ___________A_A_A___A_A_A___A_A_A___A_A_A__Ci__C$CdCm__Cl________ ___________A_A_____A_A_A___A_A_A___A_A_A____C$C$CmCmCP__________ _____________A_______A_A___A_A_A___A_A________Cl__Ci____________ ____________________BN_A_____A_A___A________CdCG_zCdCG_A_A______ __________________BNAqAq_ABNBNBN_A_____________z_A_A_A_A________ ________________AqAqAq_A_AAqBNAq_A_A_A_A_A______________________ ___________________A_A_A_A_A_A_A_A_A_A__________________________ } # tile 340 (knight) { ________________________________Cs______________________________ __________________________Cr__BdCsBk__Cr________________________ ____________________________CrBkCsCPCr__________________________ ____________________________BdCrCsCrBk__________________________ __________________________BDBVBVCrBVBVBk______CPCPCr____________ ____________CsCPCPCPCPCP__BDBdBVBVBVCPBk__CPCPCPCr______________ ________________CsCPCPCPBkCsBdBkBVBkBkCrCPCPCPCr________________ __________________CrCrBkCPCPCrBkAOBkCrCPCPBkCrBd________________ _______________I_IBdBJCrCrBkBkCrBJCrBkBnBkCrBkBd________________ _____________K_I_I_H_FBdBkCrBkBkCrBkBkCrCrBdBdCPBd______________ ___________I_KCL_I_H_F_FBDBkCrCrBDCrCrBdBJBDBdBdAl______________ ___________K_KCr_I_H_H_F_FAeBkAlBdBDCPBd__AlAlBJBd______________ _________I_K_KCr_I_H_H_F_FAeBDBJBdBdCPBD____BDBdCPAl____________ _________ICLCrCrCrCLCL_F_FAeAlAjBdBdBlBJ___BAlAjBDBD____________ _________I_K_KCr_I_H_H_F_FAeBJAlBdCPBJBd_A_A__BJAlCrCr__________ _________I_K_KCr_I_H_H_F_FBdBdBDBdAlBDCPBd_A____CrCr____________ _________I_K_KCL_I_H_H_F_FBdBdBdCLBdBdBdCPBd_ACrCrBk____________ ___________I_K_JCL_H_H_FBDBkBdCL_ACLCLAlBDCPBd_ACPBn____________ ___________I_K_JCL_H_F_FBdCrCLBD_ABDBDCrCrAlCPBdCJCPBk__________ _____________I_JCL_H_F_FCrAeBJAe_AAeBDBDAeCrCrCr_ACPBk__________ _____________I_J_H_H_FBdBJBdAj_A_A_AAlBdBd_A_A_A_ACPCPBk________ _______________J_H_F__BdAjAlAe_A_A_AAeBJBdBd_A_A_A_ACPBk________ _________________H____BdBdBJAe_A_A_AAeBdAjBd_A_A_A_ACPCPBk______ ____________________BdCKBJAjAe_A_A_A_BAlBdCP_A_A_A_A_ACPBk______ ____________________BJBdAjAe_A_A_A_A_ABJBdAl_A_A_A_A_ACPCPBk____ ____________________BdAlBJAe_A_A_A_A_AAeAlBkBk_A_A___A_ACPBk____ ___________________ABdBDAlAe_A_A_A_A_A_AAeBDBdBd_A_____ACPBk____ ___________________AAlCPAeAe_A_A_A_____A_A_A_A_A_A_______ACPBk__ _________________ABdCPAlBJAj_A_A_A_______________________ACPBk__ _________________ABkBdBdAl_A_A_A___________________________ABk__ _________________ABdBDAlAl_A_A_______________________________A__ ___________________A_A_A_A_A____________________________________ } # tile 341 (monk) { ______________________________ClCnCn____________________________ ____________________________CiCiCnCnCn__________________________ ____________________________CiCnBtCnBV__________________________ ____________________________CTCnCnCiCT__________________________ __________________________BsCGCnCnCnCT____________Ci____________ ______________________CFCFBsBWCGCTBjCG__________CnCn____________ __________________CcCcCFCcCcBsBsBWBsCFCFCF____CFCnCi____________ ________________CFCcCFCcCcCcCcCFBSCFCFCcCcCFCcCFCGCn____________ ______________CFCcCcCcCFCFCcCFCFBSCFCcCcCcCFCcCFCF______________ ____________CFCcCcCFCFCFCFCFCcCFBSCFCFCcCFCFCFBsBS______________ ____________CFCcCFCFBSBsBsCFCcCFBSCFCcBsCFCFBsBsBS______________ ____________BsCcCFCFBSBsBsCFCFBSCFCFBsBSBSBsBsBS________________ ____________BsCFCFCn__BSBSBsCFBSCFBsBsBSBsBSBSBS________________ ____________BsBsCnCnCi__ByBSBsBSCFCFBsBy__BSBS__________________ ______________BsCnCTCn__ByCMCMCjCjCMByBy________________________ ________________BjCGCT__BSCMCjCjBaCMCMBs________________________ ______________________BsBsCcCFByCFByCFBsBS______________________ ____________________BSBsCFCcCjByCFByCMCFBsBS____________________ __________________BSBsBsCFCjByCFCFCFByCjCFBsBs__________________ ______________________BSBSBsBSCFCFCFCFCcBsCF____________________ ______________________BsCFBSCFBs__BSCFCFBSBS____________________ ____________________BsBsCFCFCFBS__BSBsBsCFCcCF_____A_A_A________ ____________________BsCFCFCcCFBs____BsCFCFCcCc_A_A_A_A_A_A_A____ ____________________BsCFCcCcCFBs____BSBsCFCFCcCF_A_A_A_A_A_A____ ____________________BsCFCcCFCF_____ABSBsBsCFCcCF_A_A_A_A_A_A____ ____________________BsBsCFCFBS_A_A_A_ABSBsCFCFCF_A_A_A_A_A_A____ __________________CFBsBsBsBs_A_A_A_A_A_ABSBsBsBs_A_A_A_A_A_A____ ________________BDBsBsBSBS_A_A_A_A_A_A_ABSBsBs_A_A_A_A_A_A______ ______________BDBkBkBkBS_A_A_A_A_A_A_A_A_ABSBs_A_A_A_A_A_A______ _______________A_ABDCPCP_A_A_A_A_A_A_A_A_AAlBDBDBkBk_A_A________ _________________A_ABDBdBk_A_A_______A_A_AAlBkBD_A_A_A__________ ___________________A_A_A_A_A_____________A_A_A_A_A_A____________ } # tile 342 (priest) { ________________________________________________________________ ____________________________C2C2Cn______________________________ __________________________C2C6C2C2Cn____________________________ ________________________CnC6C2C2C2CnCT__________________________ ______________________CVCnC2B3B3C2B3CTB1________________________ ______________________CVCnC2C2C2C2CnCTB1________________________ ______________________CVCVC2CnC2C2CnCTB9________________________ ______________BvBvBvBvBvCVB9CnB3B3B3B9B9BWBW________AXAX________ ____________BvBWBWBWBWBvB9CVB9CVCVB9B9B9BWBWBW____AXAXAXAX______ __________BWBWBWC2C2BWBWBvCVB9CVB9CVB9BWBWC2C2__AXAXAIAIAXAX____ __________BWBWC2CnCnCTBWCLCVB9CVB9CVB9BWCnCnC2AXAXAIAIAIAXAX____ ________BvBWBWC2CnCTCTB3CLCLCVB9B9CVB9B7B3CTCnC2C2AIAIAIAIAXAX__ ________BWBWC2C2CnCTB3CLCLCrCrB9CVAlCLB7B7B3CTCnCnC2AIAIAIAIAX__ ________BWBWC2CnCTB3AbCLCrCrCLCLBkAlCLAlB7AbB3CTCnCnC2BRAIAIAX__ ________BWBWC2CTB3AbAbCLCrCLAlAlBdBdA2CLB7AbAbAXB3CTBRCnC2AIAX__ ______BvBWBWC2CTB3AbAbCLCrCLCLBkBdA2AlAlB7Ab__AXAIAIBRCTCnAIAX__ ______BvBWBWC2B3AbAbAbCLCLCLBoBRA2AlB7B7AbAb__AXAXAIAIB3AIAXAX__ ______BvBWBWC2CnAbAbAbAbB7BoBRAqCLAlB7AwAbAb____AXAIAIAIAXAX____ ______BvBWBWCnC2CnAbAbAbBoBRAqAwAYAwAwAwAwAb____AXAXAXAXAX______ ______BvBWBWCTCnC2CnAbBoBRAqAwAYAwAwAYAYAwAw_A_A_AAXAXAX_A_A____ ______BvBWBWAbCTCnC2CnBNAqAwAwAYAwAwAwAYAYAwAw_A_A_A_A_A_A_A____ ______BvBWBWAbAbCTCnBRAqAwAwAYAYAbAwAwB3AYAwAw_A_A_A_A_A_A_A_A__ ______BvBWBWAbAbBoBRAqAbAwAYAYB3AbAwAwB3CTCn_A_A_A_A_A_A_A_A_A__ ______BvBvBWAbAbAqAqAbAbCTB3CTCTAbAb_ACTCTCnCn_A_A_A_A_A_A_A____ ______BWBvBWBWAbAbAbAbAbC2CnCnAb_A_A_A_AB3CTCn_A_A_A_A_A_A_A____ ______BvBvBWBWAbAbAbAbC2C2C2CT_A_A_A_A_AB3CTCnAY_A_A_A_A_A______ ______BWBvBvBWAbAb_A_ACnC2CnCT_A_A_A_A_A_AB3AYCnAY_A_A_A________ ________BvBvBWAb_A_A_ACnCnCT_A_A_A_A_A_A_AAYAYCnCnAY_A_A________ _______ABWBvBW_A_A_ACnB3CT_A_A_A_A_A_A_A_A_A_AAYAY_A_A__________ _______A_ABWBW_A_AAYCnCnCT_A_A_A_A_______A_A_A_A_A_A____________ _________A_A_A_A_A_AAYAYAY_A_A__________________________________ _______________A_A_A_A_A_A_A____________________________________ } # tile 343 (priestess) { __________________________________AeAe_M_M______________________ ________________________________AEAOABABAA______________________ _______________________________MABAOAeAeAe_M____________________ ____________________________AdAB_zAlC$C$C$A_____________________ ____________________________Ae_MABCn_MCnAB_L____________________ __________________________AeABABAOAeCnCiCn______________________ __________________________Ae_zAB_zCnCnCn__Cj____________________ ________________________AeAB_z_MAOCPCi__CjCjCj__________________ ________________________AlABABABABCPCV____Cj____________________ ________________________AeABAB_zABCoBkCV__Cj____________________ __________________________AeAeAeBkC$CoCoCiCn____________________ ____________________________AB_O_zABAOCiCnCnCT__________________ ________________________AeABABAAAB_MBDCnCiCnCT__________________ ________________________AeAO_M_BBDCVC$CWCiClAe__________________ ________________________Ae_MAOAOBdC$CoBDC$CoAOAe________________ __________________________AKABAOAOCV_M__AeAOAOAO________________ __________________________ABABBJAlAlCP____AOAO__________________ ____________________________CPCPCKCPCt__________________________ __________________________AOABAOABADABAO________________________ ________________________AeAB_MABAB_zAB_MAO______________________ ________________________AeAB_MAB_MABABABAB______________________ ______________________Ae_MABAB_zABAB_zAB_MAO____________________ ______________________AeABABAB_MAB_MAB_MAKAB____________________ ______________________AeAK_MAB_zABABABAB_MAB____________________ ______________________AeAB_MAK_OAO_zAB_zAB_M____________________ ____________________AB_zAeABAB_zABAB_MABAA______________________ ______________ABAB_MAB_MABAB_MAO_M_$AB_MABA_____________________ ____________AeAeABABABAK_MAOBJ_MABAB_MA_AB_MAB_M________________ _____________AABAeAeAB_MBJAO_M_$AB_MABABAAABABAB_MAB____________ _______________A_AAeAeAe_MA_AB_OABAK_MABABABABAB_z_A_A__________ _________________A_A_AAPAeAOAOAOAOAOAOABAB_R_A_A_A______________ _____________________A_A_A_A_A_A_A_A_A_A_A_A_A__________________ } # tile 344 (ranger) { __________________________ABABABABAB______________________CI____ ________________________ABAKCiCnABABAB__________________AzCI____ ________________________ABAeCnCiCnAeAB______________AzAz__CI____ ______________________ABAeCnBRCnBRBwAeAB________AzAz____CI______ ______________________ABAeCTCiCnCnCTABAe____AzAz________CI______ ______________________ABAeBVCTCnBwBVAeABAzAz__________CI________ ____________________BRBRAeBRCGBzBTBRAeBRBr____________CI________ __________________BRBrBrAeBrBRAXAvAvAeBrBRBR___A____CI__________ __________________CJBRBrBRBrBRAXBrAvAXAvAXBj_A_A_A__CI__________ ________________BkBjBRAvAvBRAvAXAvAvAvAXBJCJ_A_A_ACI____________ ________________CTBjBJAvAvAvBrBRAvAXAXAXBJBkCT_ABWBW____________ ______________BkBjBJBJ__BRAvBRAvAXAvAX_ABjBbBkBW_A_A____________ __________AzAzCJBjBJ____AwBRAvAvAXAvAw_ABJBjCJ_L_A_A_A__________ ______AzAz__BkBjBJBJ____AwBSBsBsBSAwAwAzAzBJBcCJ_A_A_A_A________ __CICI______BRBjBJ____CIBRBrBsCLBSAwAX_A_ABJBRAv_A_A_A_A________ ______CICICIAvBRAvCICIBRBRBrBRAvBRAvBR_A_A_AAvBRAv_A_A_A________ ____________BRAvAX____BRBRBRBrBRBrBrAvAX_A_AAvAvBDBDBD_A________ ____________BRAvAX__AvBRBrBRBr_ABrBRAvBR_A_A_ABDBDCm_A_A_A______ ____________AvAX____BRAvBrBRBr_AAvBrBRAv_A_ABDBDBkCm_A_A_A______ ______________________AvBRBr_A_ABRAvBRAv_A_ABD_ACPBkCm_A_A______ ______________________BjBrBR_A_A_ABRBrBj_A_A_A_A_ABkCo_A________ ______________________BkCJBJ_A_A_ABJBjBj_A_A_A_A_ACPBkCm________ ____________________BjCTBjBJ_A_A_ABJAwBS_A_A_A_A_A_ABkCo________ ____________________BkAwBjBJ_A_A_AAYAwBS_A_A_A_A_A_ACPBkCm______ ____________________AwAwAb_A_A_A_AAYAwBS_A_A_A_A_A_A_ABkCo______ ____________________BSAwAY_A_A_A_AAYAwAw_A_A_A_A_A_A_ACPBkCm____ ____________________AwAwAY_A_A_A_AAwAwBS_A_A_A_A_A___A_ABkCo____ ____________________BSAwAY_A_A_A_A_AAwBSBS_A_A_A_______ACPBkCm__ __________________BSBSAwAY_A_A_A_A_A_AAwAw_A_A____________BkCo__ _________________AAwAwAY_A_A_________A_A_A_A_A____________BkCm__ _________________A_A_A_A_A_____________A_A______________________ ________________________________________________________________ } # tile 345 (rogue) { ________________________________________________________________ ________________________________________________________________ ____________________________BWBWBvBvBv__________________________ __________________________CcCF_$_zBWBWBv________________________ ________________________CcCFCFCFBS_$BWBW________________________ ________________________BW_zCFBiCiCF_zBWBv______________________ ________________________BvCFBS_aCn_aCF_$BW______________________ ________________________BWCFCnCiCnCnBS_zBW______________________ __________________________BW_$CnCTCGBsCoCo______________________ ________Cm__________________BsCGBwBSCoCPBsCo____________________ ________C$______________CFCFBSBSBSCVCPBkBvCVCo__________________ ________C$Cm__________CfCIBsBsBiCiCnBsBsCIBvCoCo________________ ________C$C$__Bn____CfCIBvBsBsBsCiCnCIBsCfBvCVCVCo______________ __________CoBIBiCfCfCIBv__CFBsCoCVCICICICIBvCVCVCVCo____________ __________BFCiCnCICIBv____CFBsBsCVCABvCIBvBvCVCVCVCVCo__________ ________BI__CnCi____________CFBsBsBsBSBvBvCVCVCVCVCVCV__________ ____________________________BSBsBsBSBSBSBSCVCVCVCVCVCVCP________ ____________________________B_BSBSBSCLB_CVCVCVCVCVCVCJBn________ ______________________________CLB_CLBsBSBSCVCVCVCVCVCP__________ __________________________CFBsBsBsBsBsBsBSCVCVCVCmBkCP__________ ________________________CFBsBsBSBSBsBsBsBSCVCVCPBnCP____________ ______________________CFBsBsBSBS__CFBsBsBSCPBnCJ________________ ______________________CFBsBS______CFBsBsBS______________________ ______________________BsBsBv______CFBsBS________________________ ________________________BvBvBv____CFBsBs________________________ __________________________BvBv____BSBsBsBS______________________ __________________________CIBv_z___zBvBsBv_z_z_z_z_z____________ ________________________CIBv_z_z_z_zBvBvCIBv_z_z_z_z_z_z_z______ _________________________________z_z_zBvBvBv_z_z_z_z_z_z_z_z____ ____________________________________CfCIBv_z_z_z_z_z_z_z_z_z_z__ ____________________________________CIBv_z_z_z_z_z_z_z_z_z_z_z__ _______________________________________z_z_________z_z_z_z_z_z__ } # tile 346 (samurai) { ___________________________A_A_A_A______________________________ _________________________A_A_A_A_A______________________________ _______________________A_A_ACMCM________________________________ _______________________A_A_A_A_A_A_A____________________________ _____________________A_A_A_A_A_A_A_A_A__________________________ _____________________A_A_zCiClCiCTCT_A__________________________ _______________________ACl_z_zCn_z_A____________________________ _______________________zCiClCiCiCnCT____________________________ __________________________CXCnCnCTCT____________________________ ___________________K_K_K_A_$CnCnCT_ACM_K_K_K____________________ ______________Ci_K_K_K_KCM_ACTCTCT_A_A_K_KCiCn__________________ ____________CnCiCn_K_K_K_A_ACTCnBk_ACM_K_KCdCiCi________________ ____________CiCnCn_K_K_KCM_ACTCTBk_z_A_K_KCTCTCnCi______________ __________CiCnCTCT_K_KAw_A_ACTCTBn_ACM_K_K_KCTCiCn______________ __________CnCiCT_K_KAwAwCM_ABkCJBk_z_A_K_K_KCTCnCiCn_______ACM__ __________CiCnCT_KAwAwAY_A_BCOBlBm_ACM_K_K_K__CTCnCTCT_A_ACM_A__ __________CTCnCiCnAwAYAYCM_ABkCKBk_z_A_K_K_K____CT_A_ACn_A_A____ ____________CTCnCnCnAY_K_A_A_f_b_b_b_ACM_K_KCM___ACV_A_ACT______ ____________AwCTCTCT_K_KCM_A_f_b_b_bCM_A_KCM_ACVCVBkCJ_M________ __________AwAwAY_K_K_K_K_A_A_b_b_b_b_A_ACVCVCVCJBk_M_A__________ ________AwAwAYAY_K_K_K_KCM_A_b_b_b_bCVCVBkBnBk__________________ ______AwAwAYAY_zCM_ACM_ACM_A_bCVCVCPCPBkCM_z_________A_A_A_A____ ____AwAwAYAY___ACM_ACM_ACMCVCVBkBn_f_f_b_b_b_A_A_A_A_A_A_A_A_A__ ____AYAYAY___________fCVCPCPBk_A_z_f_f_f_b_b_A_A_A_A_A_A_A_A_A__ ____AYAY_____________f_f_f_b_b_A_A_A_f_f_b_A_A_A_A_A_A_A_A_A_A__ _____________________A_f_f_b_A_A_A_ABSAwAw_A_A_A_A_A_A_A_A_A____ _____________________ABSAwAw_A_A_A_ABSAwAw_A_A_A_A_A_A_A_A_A_A__ _____________________ABSAwAw_A_A_A_ACPBSCP_A_A_A_A_A_A_A_A_A____ _________________A_A_ACPBSCP_A_A_A_ACPBSCPCP_A_A_A_A_A_A________ _________________A_A_ACPBSCPCP_A_A_AAwAwAwAw_A_A_A_A_A__________ _______________A_A_A_AAwAwAwAw_A_A_A_A_A_A_A_A_A_A______________ _______________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A________________ } # tile 347 (tourist) { ________________________________________________________________ ____________________________AYAYAYAY____________________________ __________________________BSBSAYAYAYAY__________________________ ________________________AYBSAY_zCiBSAYAY________________________ ________________________AYAYAYCiCiCiAY_A________________________ ________________________AYCi_zCl_zCnAYAY________________________ ________________________AYCnClCiCiCn_zAY________________________ ___________________________$CgClCn_AAY__________________________ ______________________________CTCT_z____________________________ ________________________CjCjCTCnCjCjCj__________________________ ______________________CjCjCjCjCjBgCjCjCj________________________ ____________________ClBHBgBgCjCjCjBHCjCnCi______________________ ____________________ClCnCMCjCjBgBHCjCMCiCl______________________ __________________ClCn__CMBgBHBHCjCMCM__CnCn____________________ __________________ClCi__CjCjCjCjCjCjCM__CnCi____________________ ______________ClCiCnCn__CjBHBgCjCjCM____CnCl____________________ ____________ClCnCn______CjCjBHBHCjCM____CiCn____________________ ____________Ci________BHBgCjCjBHBHCMCM____CnCi__________________ ______________________BsCjBHCjCjBHCjCM____CnCi__________________ ______________________BsBsBsBsBsBsBsBsBS____Cn__________________ ______________________BsBsBsBi__BsBsBSBS________________________ ________________________BsBSCn__CiBSBSBS________________________ ________________________ClCnCn__ClCnBi__________________________ ________________________ClCiCn__ClClCi__________________________ __________________________CnCn__CnCnCi__________________________ __________________________CiCn____CnCn__________________________ __________________________C$C$____C$C$__________________________ __________________________C$CS____CSCS_____________z_z_z_z_z_z__ ________________________CSCSBF____CSCSBn_A_z_z_z_z_z_z_z_z_z____ ________________________CSCSBI_z_zCSCSAp_z_z_z_z_z_z_z_z_z______ ________________________ApBI_A_z_zApBI_A_z_z_z_z________________ ___________________________z_z_____z_z_z________________________ } # tile 348 (valkyrie) { ______________________________Cu________________________________ ____________C$C$C$C$________CuCuCB________C$C$C$C$______________ ________________C$C$C$____CBCuCBCBBN____C$C$C$C$________________ __________________C$C$C$C$CBCuCBBNBNC$C$C$C$____________________ ________________________CrCVCmC$CmCPCrCs________________________ ________________________CrClAvCiAuCnCrCsCsCr____________________ ________________________CLCnCnCiCnCnCLCrCsCrCrCrCr______________ __________________________CTCiCnCnCTCLCLCs__Cs__________________ __________________________ClCdCTCTCl__Cr__Cr__CsCs______________ ______________________ClCiClCiClCiClCnCLCL__Cs__CLCs____________ ____________________ClCXCgCoCmClCoCoCVCn__CLCrCs________________ _______________K_K_KClCnCoCmCPBwCoCPCJCTCn____Cr________________ _____________K_K_K_I_I__BkCVCPBkCPBlBJCTCnCnCL__CrCr____________ ____________CL_K_I_I_I_H__BkCmBlBdBD____CTCnCnCL________________ ___________KCr_KCL_I_H_H__AwCoCJBdAw______CTCn__Cs______________ ___________K_KCL_I_I_H_H__BSAwCrAwAw_A_A_ACTCsCsCL______________ ___________KCL_ICLCLBb_H__CmBSBSAwBk_L_A_A__CsCLCm______________ _________K_KBb_I_I_H_H__CmCoCmCmCWBl_A_A_ACsCLCPCm______________ _________K_ICL_I_H_H_H__CmCoCoCmCPBmBd_A_A_A_ACPBkCo____________ _________KBv_I_H_H_H____CoCoCmCmCPCJBd_A_A_A_A__CPCm____________ _________KCL_H_H_H____CmCoCoCmCmCmCPBd_A_A_A_A_ACPBkCo__________ _________K_H_H________CmCoCoCmCmCmBkBdBd_A_A_A_A_ACPCm__________ ______________________CmCoCoCPCmCPCVBkBd_A_A_A_A_ACPCV__________ ______________________CmCoCmCoCmCPCmBlBd_A_A_A_A_A_ACPCm________ ______________________CoCoCoCPCmCPCmCOCB_A_A_A_A_A_ACPCV________ ____________________CmCuCoCoCBCBCPCBCBBd_A_A_A_____A_ACPCm______ ____________________CmCmCuCBCPCmCBCPBdBS_A_A_A_____A_ACPCV______ ______________________CiCmCm_ACPCP_ACTCnBS_A_A_______A_ACPCm____ ______________________BiBS_A_A_A_A_ABSBSBS_A___________ACPCV____ ____________________CiCnBS_A_A_A___A_A_A_A_A_____________ACPCm__ __________________BSBiBiBS_A_A_A___A_A_A_A__________________CP__ _________________A_A_A_A_A_A____________________________________ } # tile 349 (wizard) { ________________________________________________________________ ________________________CPBkBkBkBD______________________________ ____________________________CVCPBkBdBJ__________________________ ______________________________CPCPBdBDAl________________________ ______________________________CPBkBlBdBDBD________BkBkCPBkBk____ ____________________________CuCPCPCOBdBDBNBkBkBkCPBkCPBk________ ________________BkBkCPBkCPCPBkCuCuCBBoBNCPBkBkBkBkBk____________ ______BkBkCPBkBkCPCPBkCPCPCPCPCPCPBkBnCPBkBkBnCJ________________ ______________CPCPCPCPCPCPBnCPCPCPCJBkCPCPBkCJ__________________ ______________________CPCJCPCPCPBnCPBkCTCP______________________ __________________________CmCmCnCTCTCTCnCPBk____________________ ________________________CPCPCmCoCoCnCnCoCVBkBnBk_A_A_A_A________ __Br________________CPBkCPBkCmCmCoCmCoCPCoBkBd_GCJ_A_A_A_A______ __AvBrCb__________CPBkCPBkCPBkCmCoCmCoCVCPBJ_G_I_HBk_A_A_A______ ______AvBrCb____CPCPCPCPCPBkBkCoCmCoCoCVAl_G_ICr_H_HBn_z_A_A_A__ __________AvBrBkCPBkCPBkBkBkCPBkCoCmCoCPAl_I_H_HCr_H_HBk_A_A_A__ ____________AvCPBkCVBkBnCJBkBkBkCoCmCVCmAl_H_H_H_HBkBkCJ_M_A_A__ ______________BkCPCPCJBkBkBkBkCPBkCmCVBJAl_H_HCnBkBkBkBd_A_A____ ______________BdBkCPBMBrCbBkCPCPBkBlCoAjAl_HCnCTBkBdBnBJ_A_A____ ________________BkBMCJCPCnCnBkCKBmCJCoBDAl_HBJAeBkBdBk_A_A______ ________________BdBkBnCJCTCTBrCbBkBnBkBDAl_AAjAeBkBdBd_z_A______ __________________BdBkBnAeBDAwBrCbCbBkBDAl_ABJAeBkBdBJ_A_A______ __________________BdBkCJAeAlBkAvBrBrCbBJAl_B_ABDBkBD_A_A________ __________________BDBkBkAeBDBkCPAvAvBrCbBDAl_AAlBD_A_A__________ _________________A_ABDBkAeBDCPCPAuAvBrBrAlAl_ABD_A_A____________ _______________A_A_ABDBdAeBkCPBkBkAvAvBkBDAl_AAl_A_A____________ ___________A_A_A_A_ABkBdAlCPBkBlBcBkBkBkBDAlAl_A_A______________ _________A_A_A_MBkBkCPCPBJBkCPBkBdBkBkBdBDBDAl_A_A______________ _________A_A_A_A_z_MBkBdBnCPCOBkBdBkBkBdBdAl_A_A_A______________ ___________A_A_A_A_A_A_A_ABkBD_BBDBkBd_ABd_A_A_A_A______________ _________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A________________ _____________________A_A_A_A_A_A_A_A_A_A_A______________________ } # tile 350 (Lord Carnarvon) { ________________________________________________________________ ______________________________CPBkBd____________________________ __________________________CoCPCmCPBkBd__________________________ ________________________CoCPBkCoBnCPBkBd________________________ ________________________CPBkBkCoCJBkBnBd________________________ ________________________AlCJBnCoBDCJBkBJBd______________________ ____________________CPBkBnBkBdCPBkBnBdBdBkBk____________________ ________________________CPCPBkCJBlBkCJBkBk______________________ ________________________AeCT_ACiCT_LCT_M________________________ ______________________BdAlCnCiCnCnCnCi_ABdBD____________________ ____________________BdBdAlCi_$_z_A_zCT_zBdBdBD__________________ __________________BdCKBkBjAlCnCiCTCT_ABdBkBdBDBD________________ ________________BdBkBLBkCP_AAlAlAl_A_ACmCPBdBdBD________________ ________________CPBkBdBdBdCo_zAl_ABoCoCmBdBDBdBdBD______________ __CVCoCoCV__CoCoCmBkCPBdBkBkC$CuCuBoCmBkBDBdBdBdBD______________ CVCoCoCoCVBkCoCoCoC$BkBdBdBkBkCuBoCmBdBdBDBDBdBdBDBD____________ CoCoCo_I_IBn_I_ICoCoCVBdBkBnBdBdBdBdBdBDBDBDBdBDBDBD____________ Co_I_I__Cn_ICnCT_I_ICVBdCKBkCJBdBdBdBdBdBDBDBDBDBDAl____________ _I________CiCiCnCTBk_IBdBmBkBnBkCJBnBdBDBDBDAlBDBDAl____________ ____________CTCTCTCOBdBdCKBkCJBnCmBkBdBDBDBDAlBDAl______________ ________________BdBd__BdBmBlCOBkCJBdBdBDBDBDCTAlAl______________ ______________________BkBkCJBkBlCoBkBdBDBDBDCTCT________________ ______________________BdBkBnCJBmBkBkBdBdBDBDCTCj________________ ________________________BdCOBlBdBdBdBdBdBDBD____Cj______________ ________________________BdBdBDBDAlBdBdBDBDAl___L_LCj_z_A_A______ ________________________BdBdBdBDAlBdBdBdBDAl_A_A_AAACj_A_A______ ________________________BdBdBdBDAlBdBdBdBDAl_A_A_A_A_A_z_A______ ________________________BdBdBdBDAlBdBdBdBDAl_A_A_A_A_A_A________ ______________________CFBsBsBDBDAlBdBsBsBRAl_A_A_A_A_A__________ ___________________ACFBsBsBsBRAlAlBsBsBsBsBR_A_A_A_A____________ _________________A_ABsBsBsBRBR_A_ABsBsBsBsBR_A_A________________ _____________________A_A_A_A_A_A_A_A_A_A_A_A_A__________________ } # tile 351 (Pelias) { ____CV________________CF______CPBdBd______Bs____________________ __CoCVBk______________BsBsBRCVCPCPBdBdBsBsBR____________________ __CoCVBn________________BRBRCVCoCPBDBdBsBR______________________ __CoCVCJ______________BEBCCjBkCPBdBdBJCM________________________ __CoCVBk__________BEBEBCAkCiCjCoCjCjCMCiAkAk____________________ ____CV____________CnBCAk_zCT_zCnCiCT_zCn_AAkAk__________________ ____Cf__________CnCiBCAk_A_ACTCTCnCiCn_z_AAtAkCT________________ ____Cj________CnCoClBCAk_AAl_AAl_z_z_A_AAkAtAkCiCT______________ __CTCiCn____CnCnClCnCiBCBE_A_ACiCnCT_A_AAtAtAkClCnCT____________ __CiCnCnCTCnCnClCnCnCiCnBCBE_A_z_z_A_AAtAtAkCiCiClCiCT__________ __CTCiCnCTCiCiCnCnCnCnCnCTBC_AAlAl_A_AAtAkCnCnCnClCnCT__________ ____CjCTCGCnCiCnCTCTCTCTCTCTBC_AAl_ABCAtCTCTCTCiClCiCT__________ ____Cj____CGCTCT_z_ACTCnCiCnBEBCBCBCBECTCiCT_zCTCnCnCiCT________ ____Cf_________A_A_A_ACnCnCnCoCoCVCTCnCnCiCG_z__CnCiCiCT________ ____Cj________Al_A_A_ABwCTCo_zCo_ACVCTCTCG_L_A_A__CnClCT________ ____Cj________Al_A_A_A_ABECoCoCVCoCVCTBwAW_A_A_A____CnCnCT______ ____Cj______Al_A_A_A_A_ABEBECoBdCVBwCGAWAW_A_A_A__CnCnCTCT______ ____Cj_______A_A_A_A_ABEBCBEBEBEBEAtAtAkAW_A_A_A_zCTCnCTBw______ ____Cj_____L_A_A_A_A_ABEBEBCBEBEBEBEBCAtAk_A_A_A_A__CTCG________ ____Cj_____AAl_A_A_A_ABEBEBEBEBEBEBEBCAtAk_A_A_A_A_A____________ ____Cj___LAl_A_A_A_ABEBEBEBEBEBEBEBCBCAtAk_A_A_A_A_A____________ ____Cj___AAl_A_A_A_ABEBEBCBEBEBEBCBCAtAtAk_A_A_A_A_A____________ ____Cj_____AAl_A_A_ABEBEBCBCBCBCBCBCAtAtAk_A_A_A_A___A_A________ ____Cj_____A_A_A_ABEBEBEBEBCBCBCBCBCAtAtAk_A_A___A_A_A_A_A______ ____Cj___________ABEBEBEBEBEBEBEBCAtAtAkAk_A_____A_A_A_A_A_A____ ____Cj__________BEBEBEBEBEBEBCBCBCBCAtAWAkAk_A_A_A_A_____A_A____ ____Cj________BEBEBCBCBEBEBCBCBCBCAtAkAWAkAk_A_A_A_A_A__________ ____Cj______BEBEBEBEBCBCBCBCBCBCAtAkAWAkAWAWAW_A_A_A_A_A_A______ ____Cj______BEBEBEBEBEBEBCBCBCBCAtAWAkAkAkAkAWAW_A_A_A_A________ ____Cj________BEBEBEBEBCBCBCBCAt_AAkAkCiCnAkAW_A_A_A_A__________ _______________A_ABCBCAtAtAtAt_A_A_ACnCiCnCn_A_A_A_A____________ ___________________A_A_A_A_A_A_A_A_A_z_z_z_A_A_A_A______________ } # tile 352 (Shaman Karnov) { ____________________CjCjCMCVC$C$C$CVBkCtCtCj____________________ __________________CtCtCMCVC$_AC$C$_ACmBkCjCtCj__________________ __________________CjCj__C$C$C$C$C$C$CVBk__CjCM__________________ ____________________CtCjCVBsCVC$CVBdBsBkCjCM____________________ ______________________ArBsCT_ACTCn_ACnAr________________________ ______________________BRCACiCnCTCiCnCTBRAr______________________ ________________CnCiBRBsBsBsCiCTCnCTBsBRBRBRCnBw________________ ______________CnCiCnCACiCnBsCACABRBsBRCnCnBRCnCnBw______________ ______________CnCnCiCiCnCGCnBsBRBsBRBwCGCnCiCnCnCG______________ ______________CnCiCnCiCnCnCTCnCiCnCnCTBzCnCnCnCTBz______________ ______________CTCnCiCnCnCiCnCiCnCnCnCGCnCnCnCnCGAl______________ ________________CTCnCnCiCnCiCnCnBwCTCnCiCnCnCTAlAl______________ __________________CnCiCiCnCiCnCnBbCTCnCnCnCTBwAlAl______________ ____________________CnCnCiCnCTCGCGBjCGCnCTCGAlAl________________ ______________________CjCLCGCTCnCnCTBzCGCMAlAl__________________ ____________________CjAlAlCjCjCMCMCMCMCM_LAl____________________ ____________________CjBJCjBJCjCjCj_A_ACMCMBa____________________ ____________________CjCj_ABJCjCjCj_A_ACMBwBa____________________ ____________________CjCjCjCjCjCjCjCjCMBwCTCG____________________ __________________CjCjCjCjAlBJCjCjCMBtCTCnCTBa__________________ __________________CjCjCjCj_NCj_LCMBwCTCiCnCTBa__________________ __________________CjBJCjCjCj_A_ABaCnCnCnCnCTBa__________________ ________________CjCjCjCjCjCjBwBaBaCTCnCnCTBa_A__________________ ________________AlBJCjCj_LCGCTBaBaCTCnCiCnBwBa__________________ ______________CjBJCjCMBwBzCT______BaCnCnCnBzBa__________________ ____________CjCjCjCMCTCnCnCT____Ba_zCnCTCTCGBa_A_A______________ __________CjCj__CMCMCnCiCn______Ba_ABaCnCnCT_A_A_A_A_A_A________ __________Cj____CM__CiCnCT____BaBaBaBaCnCTCT_A_A_A_A_A_A________ ________________CM__CnCnCn_A_ABa_A_ABaCnCTCT_A_A_A_A____________ __________________CnCnCnCnCT_A_A_A_ACnCnCnCTBw_A_A______________ _______________L_ACTCnCTCTCT_A_A_A_ACnCTCTBwCT_A________________ _________________A_A_A_z_A_A_A_A_A_A_A_A_A_A_A_A________________ } # tile 353 (Earendil) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ _______________________q_q______________________________________ _____________________q_q_q_m____________________________________ ___________________q_q_q_m_mCuCuCu______________________________ __________________CcCcCcCc_m____________________________________ CiClCl_____________zCl_zClCc__________________CiClCl____________ __CiCXCiClCl______ClCiCXCiCs____________ClClCXClCs______________ ________CXCiClCl____CXClCs________ClClCiCXCi____________________ ____________CXCi_qAnBHCs_qBHAoBGCkClCXClBd______________________ ________________BH_qAo_q_q_q_q_qCO______________________________ ___________________lBGBL_q_q_m__________________________________ ___________________m_qAnBHAn_mBS__CVCVCV________________________ _____________________m_q_qBSBSBSCVCV____________________________ _______________________mBGCjCjBSBS_q_q_q________________________ ________________________CjCj_tBHAnBHBfBfBf______BfBf____________ ___________________________m_mAo_qAoBfBfBfCjBfCjBfCjBfCjBsBsBs__ _____________________________m_mBHBGBfCjBfBfBfBfBfBfBfBfBfBsBs__ ________________________________AoBGBfBfBfBf________________BsBs ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ _________________________________________A_A_A_A________________ _____________________________________A_A_A_A_A_A_A______________ _____________________________A_A_A_A_A_A_A_A_A__________________ _____________________A_A_A_A_A_A_A_A_A_A_A_A____________________ ___________________A_A_A_A_A_A_A_A_A_A_A_A_A____________________ _______________________A_A_A_A_A_A_A_A_A_A_A_A__________________ _________________________A_A_A_A_A_A____________________________ ________________________________________________________________ } # tile 354 (Elwing) { ________________________________________________________________ _____________________o__________________________________________ ____________________BIBH_________________________oAo____________ ____________________BIBIBH____________________BHBnAp____________ ____________________BICjBI__________________ApBIBI_n____________ ____________________BHCjBgBH____CxCxCx____BHBICjBI______________ ________________BGAn_oBICjCj_rCjCxCxCxCxBcBICjBIBH______________ ________________BGCjAnBnBICjBICxClCiClCxCLBHCjBIApBG_n__________ __________________AnCjBHBIBIBHCb_zCX_$CxCjCjBIBGAnCjAo__________ __________________BGAnCjBgBgClCbClCYClCiCjCMCMCjCjAn____________ ____________CjCj____BGAnClClCiCxCXCiClCnCjCjCjBmBG______________ ____________CjCE__BYClClCXCnCiCg_sCm_vCiBHBGBGAn________________ ______________CEClClCiBX_____o_v_o_v_oClBG______________________ ______________CiClBY___________o_o_oBnCi________________________ ________________Cb_____________s_vBIBICi________________________ ________________CECE_________vBI_vA$__Cl________________________ __________________CE_______vBIBIBh_s__ClCi______________________ ________________________ApBnClClClClCl__CX______________________ ________________________BMCiCnCXCiCXCiCX__BD____________________ ____________________________BXCXCXCXCX__BD______________________ __________________________ClCXCiCXCnCi__________________________ ______________________BcCXCiCX__CnCiCn__________________________ ____________________BLClCiBw__BD__CiCi__________________________ ____________________ClCX__________CiCn__________________________ __________________________________CnCi__________________________ ________________________________ClCi____________________________ ______________________________ClCn______________________________ _________________________A_A_zCiCn_A_A_A________________________ _____________________A_A_A_A_ACn_z_A_A_A_A______________________ ___________________A_A_A_A_A_A_z_A_A_A_A_A_A_A__________________ _____________________A_A_A_A_A_A_A_A_A_A_A______________________ _______________________A_A_A_A_A_A_A_A_A________________________ } # tile 355 (Hippocrates) { ________________________________________________________________ ________________________________________________________________ ________________________CVCVCP__CVCVCVCP________________________ ______________________CVC$CVCVCPCVCVCVCVCP______________________ ______________________C$C$C$CVCVC$CmCVCVCPCP____________________ ______________________CmC$CnCiCnCnC$CmCVCVCPCP__________________ ________________________CVCiCmC$CVCnCmCVCVCPCPCP________________ ____________________CiCiClCiCn_ACTCnCmCVCVCP____________________ ______CmCV________ClCiClClCiCnCiCnCTCmCVCPBMBM__________________ ______C$CV__________CXCiCiCnCiCnCnCmCmCVBMBnBnBM________________ ______CmCiCn__________CoC$CnCnCTCmCmCVCPBnCVBIBnBM______________ ____CnCnCnCn________CmC$C$C$CmCmCmCVCPBnCVBICSCVBnBM____________ ____CnCiCnCnCVBI__CVCVCmCmCmCmCVCVCPCVBhCVBhCPBhCVBnBF__________ ______CnCnCVBhCVCSCVBnCVCVCVCVCVBnCSCSCSBICVBICVBIBnBM__________ ____C$CmCVCVCVBIBnBhCSCVBICVBICVCSCSCSCSCSCSCVBhCVCSBnBF________ __C$CwCwCwCwCVCVCSCVCSCSCSCSCSCSCSCSCSCSCSBnBnBnCSBnBnBM________ __CmBoC$BoBoCPBnBnCSCSCSCSCSCSCSCSCSCSCSBnCSBnCSBnCSBnBF________ __CVCYCYCYCYCP____CSCSCSCSCSCSCSCSCSCSCSBnCSBnBnCSBnBnBM________ ____CVCVCVCP____BhCSCSCSCSCSCSCSCSCSBnCSBnCSCVBnBnCSBnBM________ ________________CSCSCSCSCSCSBnCSBnCSCVBICVCSBhBnBnBnBnBM________ ________________CSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCVCiCnCiCn________ ________________CSCSCSCVBhCVBICVCSCSCSCSCSCSCSCVCiCiCnCn________ ________________CSCSCSCSCSCSCSCSCSCSCSCSCSCSBIBnCmCnCn_z_A_A____ ________________CVCSCSCSCSCSCSCSCSCSCSCSBhCVBnC$CPBMBM_A_A_A_A__ __________________BICSCSCSCSCSCVBICVBICVBnBnC$CPBMBM_z_A_A_A_A_A ________________________BsBSBSAw___MBSBSBSAwAw_A_A_A_A_A_A_A_A_A ________________________BsBsBSAw_A_ABsBsBsBSAw_A_A_A_A_A_A_A_A_A ______________________CJBkBdAjBJ_A_zBlBkBdBJAw_A_A_A_A_A_A_A_A__ ___________________ABdBdBkBJAlBD_ABdBdBdBDAlAj_z_A_A_A_A_A______ _______________A_A_AAjBJAjAlBD_A_AAjBJBJAjBJ_A_A_A_A_A_A________ ___________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A____________ _________________________A_A_A_A_A_A_A_A_A_A_A_A________________ } # tile 356 (King Arthur) { ____________________________BSCjCMAw____________________________ ________________________CMBiCjC$CjCMAwCM________________________ ________________________CjAzAwCjCjBSAwCj________________________ ________________________BSCjCjCjCjCjCMAz________________________ ________________________BSCTAACTCn_ACTAw________________________ ______________________BsBiClClClCnCiCTBSAw______________________ __________________CYCYBSBSCiCXBRBSCnCTBSAwCYBo__________________ ________________CYCYBoCYBSBiBRClCiAwAwAwCYBoBoBo________________ ________________C$CYCYBoCjCjAzAwBRAwCjCjCpCYBoCP________________ ________________CVCVCPCoCjCMCpCYCYCBCjCMCVCVCPBk________________ ______________CYBoBkBdCmCmCoCYCYBoBoCWCPCVBdBdBo________________ ______________CYCYCVCVCPCmC$C$CmCVCPCPBdCPCPBkBo________________ ____________CYCYCYCVCVCOCVCmCmCmCVCPBnBdCPCOBKBo________________ ____________CYCYCYCVCVBkCVCVCVCVCPCPBkBdBdCPBdBoBo______________ ____________CYCYCYCPBdCPBkCPBlCPCOBdBdCPCPBdBoBoBo______________ __________CYCYCYCYBoCVCVBnCVCOCPBdBdCPCPCPBoBoBoBoBo____________ ________CYCYCYCYCYBoCPCKCWCVCVCVBkCKBkCPCPBoBoCYBoBo____________ ________CYCYCYCYCYBoBoBDCPCVCVBKCOBnBkBdBdBoCYCYBoBo____________ ______CYCYCYCYCYBoBoCmC$BdCPBlCjCMBdBdCPBkCPCYCYCYBoBo__________ ______CYCYCYCYCYBoBoC$CmCPBkBkCjCMCJCPCPCPCPCYCYCYBoBoBoBo______ ____CYCYCYCYCYBoBoBoCmCPCPCjCjCjCjCMCMBdCPBnBoCYCYCYBoBoBoBo____ __CpCjCjCYCYCYBoBoBoCPCPCPCPBkC$CVCPBnBkBdBdBoBoCYCYCYBoCMCMBo__ __CjCpCpCjCjBoBoBoBoCmBmCKCOBkC$CmCPCPCJBkBkBoBoCYCYCYCjBoBoBo__ CYCp____CpCpCMBoBoCmCmCPCPBkBoC$CmBoCPCPCPBkBdBoCMCjCjCp________ CY__________BoCMCMCPCPCPBkBkBoC$CmBoBnCPBkCPBdCMBoCpCp__________ CY____________BoBoCOBlCPBkBoBoC$CPBoBoBkBkCPBkBo________________ __________________CmCPCPBoCMC$C$BnCJCMCMBkBkBd_A_L_A_L_A_A______ __________________CPCPCP_ABoC$CoCPCPBoBoCPCPBk_A_A_A_A_A_A_A_A_A ________________CmBkBkBd_A_AC$C$CPBk_A_ACPBdBdBk_A_A_A_A_A_A_A_A ___________A_ACmCPBnCP_A_A_A_ACoCP_A_A_A_ABkCPBkBk_A_A_A_A_A_A__ _______A_A_ACPCPCJCPBd_A_A_A_AC$CP_A_A_A_ACPBkBkBkBk_A_A_A_A____ _____________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A________ } # tile 357 (Grand Master) { ______________________CPCPBk____________________________________ ____________________BkCPBkCPCP__________________________________ ____Bk______________CPCPCnCPCT__________________________________ ____Bk______________CJCnBcCnBt__________________________________ ______CP________CPBkCPCnCnCnCT__________________________________ ________CPCJBnCP____CaCnCnCTBwCa________________________________ ________________CDCDCaCaCTCGCaCaCDCa____________________________ ______________BqCDCDCDCaCaBPCaCDBqCDCDCD________________________ ____________CDCaCDBqCDCDCaBjBmCDBqBqCaCDCD______________________ ____________CDCaCaCDCDCDCDBPCDCDBqBqCaCDBq______________________ __________CDCDCDCDCaCaCaCrCnCrCaCaCaCDCDBqBP____________________ __________BqCDCDCDCDCDCDCrCnCrCDCDCDCDCDBqBP____________________ __________BPBqBqCDCDCDCDCrBPCrCDCDCDCDBqBqBP____________________ __________BPBqBqBqBqCDCLBqBPCDCrCDCDBqBqBPBP____________________ ____________BPBqBqBqCDCLBqBjBmBqCLBqBPBPBP______________________ ______________BPBPBbCLBqCDBPCDCDBPCLBPBP________________________ __________________BPBqCDCDBPCDBqBqBP_____A_A_A_A_A_A_A__________ __________________BPBqCDCDCNBjBqBqBPBP_A_A_A_A_A_A_A_A__________ ________________BPBqCDCDCDBqCDCDCDBqBP_A_A_A_A_A_A_A_A_A________ ________________CLBqCDCDCDBPCDCDBqCLCL_A_A_A_A_A_A_A_A_A________ __________________CrCrCLCLAsCLCrCrCL_A_A_A_A_A_A_A_A_A_A________ __________________BqCDBqAs_ABqCDCDBq_A_A_A_A_A_A_A_A_A__________ __________________CDCDBqAs_ABqCDBqBq_A_A_A_A_A_A_A_A_A__________ __________________CDBqBqAs_ABPCDCDBq_A_A_A_A_A_A_A______________ __________________CDBqBPAs_ABPCDBqBP_A_A_A_A_A_A________________ __________________BqBqBPAs_ABPBqBqBP_A_A_A_A_A__________________ __________________BqBqBPAs_ABPBPBqBP_A_A_A_A____________________ ___________________ABPAs_A_A_ABPBP_A_A_A_A______________________ _________________A_AAvAv_A_A_AAvBR_A_A_A_A______________________ _____________A_AAvAvAvAv_A_A_AAvAvAvBR_A________________________ ___________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A________________________ _____________A_A_A_A_A_A_A_A_A__________________________________ } # tile 358 (Arch Priest) { ____________________________C$CjCj__________________Cj__________ __________________________CM_H_H_HCM________________CM__________ ___________________________H_K_K_H_HCM__________C$__Cj__Cj______ ___________________________K_K_K_K_H_H________C$__CjCjCj__Cj____ ___________________________K_K_K_K_H_HCV________Cj__Cj__Cj______ ________________________Cm_KCjCj_K_H_HCVCV__CjC$CjCjCpCjCjCjCM__ ________________________CmCjC$CjCjCjCMCVCV______Cj__Cj__Cj______ ______________________C$CmCi_LCn_zCnCTCVCVCm__Cj__CjCjCj__Cj____ ______________________C$CmClCiCiCnCiCTCVCVCV____Cj__Cj__Cj______ ______________________C$CoCnCiCnCiCTC$CmCVCV________C$__________ ______________________C$CmCVCiCnCiC$CmCVCV_H_H______Cj__________ ________________BS______C$CVCVCVC$CmCVCV_H_H_H_H____Ct__________ ______________BsCmBS__C$_KC$CVC$CmCVCV_H_H_H_HCPCPClCXCi________ ____________BsC$BSBSC$_K_H_HC$C$CVCPCP_H_K_HCPCPCPCgClCn________ __________BsC$BsBsBSC$_H_HC$C$CmCPCP_H_K_K_HCOCPCPCTCnCn________ ____________BsBsBsC$_K_H_HC$CmCPCPCV_K_K_HCPBlCPCPBdCT__________ ______________BsBsC$_H_HC$C$CmCPCVCV_K_K_HCOCPCPCPBdCM__________ ______________ClBsC$_H_HC$CmCPCVCVCV_K_K_HCPCPCPCPBkCj__________ ______________ClCdC$_H_HC$CmCVCVCVCV_K_K_HCPCPCPBdBdCM__________ __________________C$_H_HC$CmCVCVCVCV_K_K_HCPCPCPBdBjCj__________ __________________C$_H_HC$CmCVCVCVCV_K_K_HCPCPCPBdBdCj__________ __________________C$_H_HC$CmCVCVCVCV_K_K_HCPCPBdBd__Cj__________ __________________C$CMCMC$CmCVCVCVCVCjCjCMCPCPBdBd__Cj__________ __________________C$CmCmC$CmCVCVCVCVCVCWCPCPCPBd____Cj__________ __________________C$CmCmC$CmCVCPCVCVCVCPCPCPCP______CM__________ ____________________CmCmCmCmCVCPCVCVCVCVCPCPCP______CM__________ ____________________CmCmCm_HCVCPCVCVCVCVCPCPCP_A_A_L____________ ______________________CmCm_H_HCPCVCVCVCVCPCPCP_A_A_A_A_A________ ________________________Cm_K_H_HCVCVCVCVCPCPCP_A_A_A_A_A_A_A____ _______________________A_A_K_H_H_H_HCVCVCPCP_A_A_A_A_A_A________ _____________________A_A_H_H_H_H_H_H_H_H_H_H_A_A_A_A____________ _________________________A_A_A_A_A_A_A_A_A_A_A_A________________ } # tile 359 (Orion) { __________________________________CrCsCrCsCrCs__________________ __________________________________AnCrBGCrAnAgBG________________ ______________________BwCGBjCGCVBGAgAnAgBGAgCn__________________ __________________CTCiCnClClCoCsCrCnCiCiClCnCn__________________ ______________CTCnCnClCnCiCnCoCrCrBVBVClBtBVCT__CsCs____________ __________CTCiClCnClCnClCnC$CVCoCVCnCiClCnCiCTBwCrCrCr__________ ________CTCnCiCnCXCnClCXClCoCVCoCVCnCiCnCiCnCTCoCLCrCLCo________ ________CTCnClCnCnCXCnCgCiClCVCoCVCnCGCGCGCnCVCVCoCLClCl________ ______BwCnCnCXCnCnCTCnCnCnCnCnCnCVCVCnCnCnCTCVCoCVCnCiCnCiCn____ ______CGCTCnCnCiCiCiCXClClCXClClCnCiCVCVCVCoCVCoCmCnCiClCnCiCi__ ________BjCnCnCiCnCiCnCXCiCXCiCXClClClClCnCiCnCiCnCnClCXClCnCn__ ________CGCTCnCnCnCiCiCnCiCiCnCiCgCXCiCXClClClClCnCnCiCXCnCiCn__ __________BwCTCTCTCnCnCiCnCiCiCnCiCnCiCnCiCiCXCnCnCiClCXCiCnCn__ ________________CGCTCTCnCnCnCnCiCnCiCnCnCnCnClCGCnCiCiClCnCiCn__ ____________________CGCTCTCnCnCnCnCnCnCGBwCGBwCnCnClCXCiCnCnCT_z ______________________BjCGBzCGCGBzCGCTCnCiClClCnCiClCiCiCnCnCT_A ______________________CLCLCLCrBjCnCnCnCnCnCiCnCiCnCiCnCnCnCT_z_A ______________________CLBZCuCBCrCsBtBwCnCnCnCnCnCiCiCnCnCTCT_A_A ______________________BkCLCBCuCrCsCBCuBzCGBwCnCnCnCnCTCTCT_z_A_A ____________________CPCoBkCLCrCrCsCuCBCBCrCsCGBzCGCTCLCL_A_A_A__ ____________________CPCmCPCPBkCrCrCBCBCuCrCsCsCuCBCLCLBd_A_A_A__ ____________________CPCmCPCmCVCVBkCPCuCrCrCsCsCBCuBbBDCP_A_A____ ______________________CmCPCmCVCoCPCoBkCVBkCPBkCVBkCPCOCVCK_L____ ______________________CTCTCmCVCoCPC$CPCmCPCmCVCmCPCPCPCPCP_A____ ______________________AqCTCTCTCmCPCoCPCmCPCmCVCmCPCPCPCPCP______ ____________________CnAqAqAqAq_ACVCoCP_ACTCmCVCVCPCPCP__________ ____________________AqAqCTAqCT_A_A_A_A_AAqAqAqCmCP_A_A_A________ __________________ClCnAqCnAqAq_A_A_A_A_ACTAqCTCTCT_A_A_A________ _________________AAqAqAqAq_A_A_A_A_A_A_AAqAqAqAqAq_A_A_A________ _________________A_z_A_A_A_A_A_A_A_A_A_A_AAqCnAqClCl_A__________ _________________________________________A_AAqAqBNAq_z__________ ___________________________________________A_A_A_A_A_A__________ } # tile 360 (Master of Thieves) { ____________________BJBkBDAO_A__________________________________ ____________________BJBlAlAO_A__________________________________ ____________________AjCJAjAO_A__________________________________ ____________________BDBkBJAO_A__________________________________ ________________BJBkBkBD_A_A_A_A_A______________________________ ________________CYCY_ACY_ACYCY_A________________________________ __________________CYCYCiCpCYCT_A________________________________ ____________________ClCiCnCTBJAlAl______________________________ __________________BJ_ACnCnAlAl_A_A_A____________________________ ______________BJAj_A_AC$C$_B_A_A_A_A_A__________________________ ___________________ABoBoCYBoBo_A_A_A_A__________________________ ________________AOAOAOCYBJCY_A_A_A_A_A_A________________________ ______________AOAOAOAOAjAl_A_A_A_A_A_A_A_A______________________ ______________AOAOAOBJAl_A_A_A_A_A_A_A_A_A______________________ ______________AOAOAlAl_A_A_A_A_A_A_A_A_A_A_A____________________ ____________AOAOBDAl_A_A_A_A_A_A_A_A_A_A_A_A_A__________________ ____________AOAOAlAl_A_A_A_A_A_A_A_A_A_A_A_A_A_A________________ ____________AOAOBDAl_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A____________ ____________AOAOAlAl_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A________ __________AOAOAO_AAlAO_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A____ __________AOAOAO_AAlAl_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A__________ __________AOAOAO_AAlAlAO_A_A_A_A_A_A_A_A_A_A_A_A_A_A____________ __________AOAOAO_A_AAlAl_A_A_A_A_A_A_A_A_A_A_A_A_A______________ ________AOAOAO_A_A_AAlAlAO_A_A_A_A_A_A_A_A_A_A__________________ ________AOAOAO_A_A_AAlAlAl_A_A_A_A_A_A_A_A_A_A_A_A_A_A__________ ________AOAO_____A_A_AAlAlAO_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A__ ________AO_________A_AAlAlAlAO_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A _______________________AAlAlAlAO_A_A_A_A_A_A_A_A_A_A_A_A_A_A____ _____________________A_AAl_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A________ _________________A_A_A_A_A_AAlAl_A_A_A_A_A_A_A_A_A_A____________ _______________A_A_A_A_A_AAl_A_A_A_A_A_A_A_A_A__________________ _________________A_A_A_A_A_A_A_A_A_A_A__________________________ } # tile 361 (Lord Sato) { ________________________________________________________________ ______________________________CjCj______________________________ ____________________________CjCj________________________________ ____________________________CjCj________________________________ ____________________________CjCjCj__CjCj________________________ __________________________CBCECjCjCjCjBR________________________ ________________________CBCBBoBoCBBrCBBNBN______________________ ______________________CBCBBoBoBoBoBoBoBoBN______________________ ____________________CBCBCBBoBoCiCnCTCTBoBNBN____________________ __________________CBCBCBBoBoCn_z_zCT_ABoBoBN____________________ __________________CBCBCBBo_ACiCiCnCTCT_A________________________ ___________________________z_zCTCnCT_A__________________________ __________________AqAqAqAq__CBBoBoBoBN__AqAqAqAq_______A_A______ ______________AqAqAqAqAqAqCBCBBoBoBoBNBNAqAqAqAqAqAq___ACM______ __________AqAqAqAqAqAqAqCPCBCBBoBoBoBNBNCPCPAqAqAqAqAq_ACM______ ____________AqAqAqAqAqCPCPCBCBBoBoBoBNBNCPCPCPCPAqAqAq_A_A______ ____________________CmCPCPCBCBCBBoBoBNBNBNCPCPCPCPCPAqCiCn______ ____________________CmCP__CBCBCBBoBoBNBN________CPCPCPCnCi______ __________________CmCmCP____CBCBBoBNBNBN_____________z_z_z_A____ __________________CmCP_A_ABNBNAqAqAqBNBN_____________ACMCM_A____ __________________CmCP_ACBCBCBBoBoBoBoAqAq____________C$CP______ __________________CnCi_ACBAqCBBoBoBoBoAqAq_A__________C$CP______ __________________CiCnCYCBAqCBBoBoBoBoAqAqAq_A________C$CP______ _____________________ACBCBAqCBBoBoBoBoBk_AAq_A_A______C$CP______ _____________________A_A_ACmCBBoBoBoBoCV_A_A___A_A____C$CP______ _______________________A_ACmCPCP_ACmCPCP_A_A_____A_A__C$CP______ _______________________A_ACmCPCP_ACmCPCP_A_A_______A_AC$CP______ ___________________A_A_A_ACmCPCP_ACmCPCP_A_A_A_______AC$CP______ _________________A_A_A_A_ACmCPCP_ACmCPCP_A_A_A_A______C$CP______ _________________A_A_A_A_AAqBNBN_AAqBNBN_A_A_A_A______C$________ ___________________A_A_A_AAqBNBN_AAqBNBN_A_A_A__________________ _____________________A_A_A_A_A_A_A_A_A_A_A_A_A__________________ } # tile 362 (Twoflower) { ________________________________________________________________ _____________________________A_A_A_A____________________________ ___________________________AAl_A_AAl_A__________________________ _________________________AAlAl_ACT_AAl_A________________________ _________________________A_A_A_A_A_A_A_A________________________ _________________________AC$Ci_AC$Ci_A_A________________________ ___________________________A_zCn_z_ACT_A________________________ __________________________CnCiCiCnCiCT_A________________________ ________________________CjAAC$C$CiCTBfBG_A______________________ ______________________CjCj_AAnBGAnBGBfAn_ABG____________________ ______________________BfCiCnBfCjCjBfBf_zBfAn____________________ ____________________CWCiCnBJBkBkBJ_z_zCjCjBG____________________ ____________________C$CTCTCJC$BkBdBGAnCjBfBG____________________ __________________BdCP____BDBkBkAlBfBGBGBGAn____________________ ________________CYCYCYCYCYCBBfCjCjBfAnCnCTAq____________________ _______________kCYCYCYCYCYCBCBCFCcBNBoCiCTAqBN__________________ _______________kCYCYCYCYCYCBCBCSBnCSBnCnCTCFCFBN________________ _____________k_kCYCYCYCYCYCBCBBnBICVCiCnCiCTCFBs________________ _____________k_gCYC$CYCYCYCBCBCVBnCS_HCiCnCTBsBN________________ ___________k_k_gCYC$CYC$CYCBCBBIBnCVBkCVBnBJ____________________ ___________k_g_gCYCYCYCYCYCBCBCS_K_I_I_I_I_I_IBd________________ _______________gCYCYCYCYCYCBCB_K_I_H_H_H_H_H_H_GBd______________ ___________________g_g_g_______K_I_H_H_H_H_H_H_GBd______________ _______________________________K_I_H_H_H_H_H_H_GBd______________ _______________________________K_I_H_H_H_H_H_H_GBd______________ _______________________________K_I_H_H_H_H_HCP_GBd_A____________ _______________________________K_I_H_H_H_H_H_H_GBd_A_A_A_A______ ____________________________CY_K_I_H_H_H_H_H_H_GBd_A_A_A_A_A____ __________________________CYCB_K_I_H_H_H_H_H_H_GBd_A_A_A_A_A____ _______________________A_ACBCBCB_H_G_G_G_G_G_GBd_A_A_A_A________ _____________________A_A_A_A_A_A_ABJ_A_A_A_ABJ_A_A_A_A__________ _________________________A_A_A_A_A_A_A_A_A_A_A_A________________ } # tile 363 (Norn) { ______________________CV__CjCjCjCjCj__CV________________________ __________________CV____CjCjCjCjCjCjCj____CV____________________ ______________________CSCjC$CjCnCjC$CjCS________________________ ________________________CjCjCTCuCnCjCj__________________________ ________________Bn__CSCjCjCn_LCi_zCTCjCjCS__CV__________________ ______________________CjCjClClCiCnCiCjCj________________________ ____________________CjCjCMCMCiCiCnCjCMCMCj______________________ __________________CSCjCMC$CSCSCTC$C$C$CjCjCS____________________ ____________________CjCiC$C$CSCSC$C$CSCTCj______________________ ____________________CjClCnC$_v_k_KCSCnCiCj______________________ ____________________CRCXCi_vCS_z_g_KClCiCV______________________ ____________________CSClCn_k_A_A_g_IClCnCS______________________ ____________________CSCiCiCnCiCT_I_ICiCTCV______________________ ____________________CSCVCnCiCT_I_ICnCTC$CSBI____________________ __________________C$CSCS____CSCSCV____C$CSCV____________________ __________________C$CS____C$C$CVBhCV____CSBh____________________ ________________C$C$CS____C$C$C$CSBn____C$CS____________________ ______________C$C$CSCV__C$C$C$C$CSCSCV__C$CS____________________ ______________C$C$CSBI__C$C$C$C$C$CSBI__C$CSCS__________________ ______________C$C$CS____C$C$C$C$C$CSCV____CSCS__________________ ____________C$C$CS______C$C$C$C$C$CSCSCS__C$CS__________________ ____________C$C$CS________C$C$C$C$CSCSBn____CSCV________________ __________C$C$CSCV________C$C$C$CSCSCSCS____C$CSBI______________ ________C$C$C$CSBI______C$C$CSC$CSCSCSBn____C$CSCSCV____________ ______C$C$C$CSCS________C$C$CSC$C$CSCVCSCS__C$C$CSBI____________ ____C$C$C$C$CSCS________C$C$CSC$C$CSBICSBn____C$C$CoBhCV________ __C$C$C$CSCSCS________C$C$CVCSC$C$CSCVCSCS_A__C$C$CSCSBnCS______ ______CSBICVCS_____AC$C$BICSC$C$C$CSBICSBn_A_AC$C$C$CS___A_A_A__ __________CSBn_M_A_ACSCVCSCSC$C$CSCVCSCSCS_A_A_AC$C$_A_A________ _________________A_A_ACSCSC$C$CSCVBhBnCS_A_A_A_A________________ _____________________A_A_ACSCSBICV_A_z_A_A_A____________________ _______________________A_A_A_z_A_A_A_A_A________________________ } # tile 364 (Wizard of Balance) { ___________________________H____________________________________ _________________________K_H_G__________________________________ ________________________CjCj_G__________________________________ _______________________K_I_HCj_G________________________________ _______________________K_I_HCj_G________________________________ _____________________K_ICjCM_H_H_G______________________________ _____________________K_I_I_H_H_H_G______________________________ ____________________ClC$C$CmCTC$Cm______________________________ __________________ClCiCnC$C$CmCTC$Cm____________________________ ________________CiCiC$CmCTCTCTCTC$C$Cm__________________________ ________________CiC$C$C$CmCnCTCTC$C$C$Cm________________________ __________________C$C$C$C$CoCTC$C$C$C$C$Cm______________________ __________________C$C$C$C$Cm_GC$C$C$C$C$CmCm____________________ ________________C$C$C$C$C$CmCm_GC$C$C$_GCmCmCm__________________ ________________C$C$C$C$C$CmCm_H_G_G_G_G_GCmCm__________________ ______CnCl_KCS_IC$C$C$C$CmCmCm_I_H_H_G_G_GCmCmCm________________ ______CiCl_ICV_IC$C$_HC$CmCmCmCm_I_I_H_G_GCmCmCm________________ _________z_IBh_IC$C$_HCmCmCmCmCm_I_I_I_H_G_GCmCmCm______________ __CMCjCjCjCjCjCMC$C$_HCmCmCmCmCm_I_I_I_H_G_GCmCmCm______________ ___L_______H_H_ACmC$_HCmCmCmCmCm_I_I_K_H_G_GCmCmCm______________ _A___A_______L_H_ACm_H_HCmCmCmCm_I_ICSCV_H_GCmCmCmCV____________ CjCjCM______CjCjCMCm_H_HCmCmCmCm_ICS_K_ICS_G_GCmCVCV____________ __Cj_________HCMCmCm_I_HCmCmCmCm_I_IClCn_HBn_GCmCVCV____________ _______________HCmCm_I_HCmCmCmCm_H_IClCi_GCS_GCVCVCP____________ _______________H_HCm_I_H_HCmCmCm_H_H_G_G_G_GCV_GCVCP____________ _________________HCmCV_I_HCmCmCmCV_H_H_G_G_GBh_GCPCP____________ _________________HCmCV_I_H_HCmCmCV_H_H_G_G_GCV_G_GCPCP__________ ___________________HCV_I_H_HCmCmCVCV_H_H_G_G_GCV_G_GCPCP________ ____________________CP_I_H_H_HCmCVCVCVCV_H_G_G_GCS_G_GCPCPCPCP__ ___________________A_ACVCP_H_H_HCmCVCVCVCVCPCPCPCP_G_G_G_G_G_A_A _______________A_A_A_A_A_I_H_H_H_H_HCVCVCPCPCP_ACPCPCP_A_A_A_A__ _____________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A________ } # tile 367 (Chromatic Dragon) { BNBNBN____Cm__________________________________BNBNBNBNBNBNBNBNBN __BsBsBNCmBNBN________________________CfBNBNBNBNBsBsBsBsBsBs____ ____BsCmAlAlBsBNBNBNBNBNBNCf__________BNBNBsBsBsBsCcCmCcCc______ ____AlAlAlAlAlCFCFCFBNBNBsBN________BNBNBNBNBNCcCcCFCPCm________ ____AlAlAeAeAlAlBNBNBsBsCFBN________BNCcBsBsBsBNBNCFCSCPCm______ __AlAlCYCYAeAeAlAlCFCYCYCBCFBN______BNBsCcCFBsBsCSCSBICVCSCS____ __AlAeAeAeAOAeAeCYCYBoCBCBCYBN______BNBsCcCFCSCSCVCSCVBnCpCS____ AlAlAeAOAOABAOCYBoCBCBBoCBBoCBCB____BNBsBsCSCVBIBnBnBFBnBnCuCS__ AlAOABABABABABCYCBBoBoBoBoBoCBBoCB__BNBsCSBnCSBnBnBFAiBMBMBnCS__ AeABAB____ABCYCBCYBoCmBvBvBoBoBoCBBoBNCSCSCSBnBnBFBD__BDBMBMBnCS ABAB____Cm__CBCYCYBoCmAlCICICIBoBoCBCGCgBnBnBnBFAi______AiBdBFBM __________CmCBCYCBCmCPAeAlBNBvBvBNBoCGBnBnBnBFBd____________AiBD __________CPCmCYCYCPCuABAeBNCICICICGCgBnBnBM_a_a_W______________ __________BkCuCBCYCBCuABABAeBNBvBvBNCGCgCG_a_b_a_a_W____________ ____________CBCuCBCYCuCMABABBoCfCICIBNCGCGAW_b_b_b_a_W__________ ____________CBCMCuCYCuCM_nBWBWCIBvBWBoBoAsAsAW_H_b_b_a_W________ _____________nCYCMCuCYCuCYAQ_iCjCICIBNBNBOAsAW_G_a_b_a_a_W______ ___________i_nCBCYCYCuCuCY_iAQCIBvBvBWBNBoBoBOAs_W_b_b_a_a_W____ _________n_n_i_iCBCBCYCuCBAQBaCfCICICIBNBNBoBN____Cm_b_b_a_W____ _______i_n_iCm_i_dBoCBCYCuBWBNCfBvBvBWBNBoBoCB_A_ACm_b_a_W_W____ Cm___i_n_i_iCm_d_d__BoCBCYBoBoCfCICICIBNBoBNBoBoCmCP_a_a_a_W____ BkCm_n_i_iCmCP_d______Bo__BoBNBoBvBvBWBNBNCBBoBNCmCP_b_a_WCmCm__ __CPCm_i_dCP_n__________BoBoBoBNCjCICIBNBoCBBoCB_b_a_bCmCPCP_A__ __Bk_n_d_i_d_n________BoCBBoBNBNBiBWBWBWBNBNCB_b_a_b_a_a_W_W_A__ _____d_n_n_i_nCj__BNBoCBCBBNBNAqAqCIBvBvBoAqBN_b_bCuCu_W_W_A_A__ _____dCj_n_n_nCjBNBoCBBoBoBNAqAq_A_ABWBWBNBN_b_b_a_a_W_W_A_A____ _____d_iCj_n_i_r_iBNCBBoBoBNAq_A_A_A_A_A_AAq_b_a_W_WBN_A_A______ _______i_i_i_n_n_nBNCBBoBNAqAq_A_A_A_A_A_A_A_a_WCBCBBN_A_A_A____ _________d_d_i_n_iBNBoBNBNAq_A_A_A_A_A_A_A_AAqBoBNBNBNBN_A_A_A__ ___________d_i_i_nBoBoBNAq_A_A_A_A_A_____A_A_ABNBoBNCBBNBN_A_A__ _____________d_d_i_ACPBNAqCP_A_A_______A_A_ACPBN_AAqCP_AAqCP_A__ _______________A_A_A_A_A_A_A_A_____________A_A_A_A_A_A_A_A_A____ } # tile 369 (Cyclops) { ______________________________________CSCVBF____________________ ____________________________________CSBIBnBF____________________ ______________________BMBMBMBM____CSC$AKC$BnBM__________________ __________________BMBICVCSCSCSBICVCSC$_MC$BnBM__________________ ______________BMCVBnCSBnCSBnCSCVBnCSBnCSCVBnBF__________________ __________BMBnCSBnCSBnCSBnBnBIBnBFCSCBCBBhBnBMBnBnBnBn__________ ________BMBnCSBnCSBnCSCSCSBnCVBnBFCBCBCBCBCVBFCSBnCSBnBn________ ________BMBnCSBnBMCSBICVCSCSBnBnBFBnBMBMBMBFAiCVBICVCSCS________ ______BDBnCSCSBnBnBMBnBnBnBnBFBnBMBMBDAiBdAiBnBnCSBnCSBnCSBn____ ______AiBMBnBICVCSCSCSCSCSCSCSCSCSBnCSBnCSBnBnBnBnBnBnCSCSBnCS__ ________BDBnBnCSBnCVBhCSCSCSCSCSCSCSCSCSCVBICVBhCVBnCSCSCSCVBn__ ________AiBMBnBnBnBICVCVBnCSBnCSBnCSCSCSCSCSCSCSBnBnCSCSCSBIBn__ __________BdBFBMBMBnBnBhCVBICVBhCVBhCVBICVCSCSCVBnBICSCSBnCSBn__ ________________BdBMBMBnBnBnBnCVBICVBnBnBnBnCSAiBnCVCSCSCSBnBn__ ____________________AiBMBMBnBnBnBnBnBnAiBdAiBdBnBnCSCSCVBIBnBM_A ______________________BdAiBdAiBdAiBDBFBnCSCSCSCVBICSCSCSBnBnBM_A ______________________AvAvAvAvAiBnBnBnBnBnCSBnCSBnCSBnBnBnBM_A_A ______________________AvAvAvAvAvBRAiBDBnBnBnBnCVBhCVBnBnBMBM_A_A ______________________CmAvAvAvAvCsCsCrAiBdAiBnBnBnBnBnBnBM_A_A_A ____________________CPCmCVAvAvAvCrCrCrCLAvAvAiBdAiBFBFBMBM_A_A__ ____________________CPCmCPCmCPAvAvCLCLAvAvAvAvAvAvAvCPCP_A_A_A__ ____________________CPCmCPCmCPCoCPCmAvAvAvAvAvAvAvCVBkCP_A_A____ ______________________CmCPCmCVCoCPCoCPCmCPCmCVCmCPCVCPBkCP_A____ ______________________BMBMCmCVCoCPCoCPCmCPCmCVCVCPCPCPCVCP_A____ ______________________BMBMBMBMCmCPCoCPCmCPCmCVCmCPCPCPCPCP______ ____________________BnAqAqBMBM_ACVCoCP_ABMCmCVCVCPCPCP__________ ____________________AqAqBnAqAq_A_A_A_A_AAqAqAqCmCP_A_A_A________ __________________BICVAqBnBnAq_A_A_A_A_ABMAqBMBMBF_A_A_A________ _________________zAqAuAqAq_A_A_A_A_A_A_AAqAqAqAqAq_A_A_A________ _________________A_A_A_A_A_A_A_A_A_A_A_A_AAqBnBNBICV_A__________ _________________________________________A_AAqAqAqAu_A__________ ___________________________________________A_A_A_A_A_A__________ } # tile 371 (Master Kaen) { ___________________________M_MAA_M_M____________________________ ___M_____________________MAK_MA__MA_____________________________ ___MAK_________________M_$_MCTCTCnCi____________________________ _____M_M_______________MABCTCnBVCGCn____________________________ _________MAA_M_______MAK_MCTCnCnCiCt____________________________ _______________CAA_M_____M_zCTCnCiCn____________________Ci______ ____________________________CnCnCGBw____________________CnCi____ ________________________CuCuCuCTCTCu____________________CiCn____ __________________CuCuCuCuCuCuCuCuCuCu__________________CnCi____ ______________CuCuCuCYCYCYCuBsBsBsCuCYCuCuCu______CuCuCzCnCi____ ____________CuCuCuCuCYCYCYBsBsCjBsBsCYCuCYCYCuCjCzCjCjCuCi______ ________CuCuCuCYCYCYCBCBBsCjBsCjBsCjCBCuCYCuCzCzCjCjCuCu________ ______CuCuCYCzCzCBCBCBCzBsBsBsCjBsBsBsCuCuCcCzCjCzCzCjCj________ ______CuCuCYCzCuCBBoBoCYBsBsBsCjBsBsBsCuCBCuCzCuCjCjCzCu________ ____CuCzCYCuCzCzCM____CYBsBsCjBsCjCjBsCuCBCBCcCzCjCzCjCz________ ____CuCzCuCzCzCuCMCz__CYCYCjBsBsBsBsCuCuBoCBCBCBCuCcCc__________ ______CuCuCzCjCuCjCzCuCuCYCYBsBsBsCuCuCM__BoBoCcCcCMCM__________ ______CcCcCjCMCjCuCjCuCjCBCBCYCuCYCYCYCM_________________A_A____ ______CMCMCzCzCjCzCTCuCMCYCBCYCYCBCYCuCM_______A_A_A_A_A_A_A_A__ ________ByCMCzCjCTCn__CMCYCBCBCBCYCYCuCMCuCYCY_A_A_A_A_A_A_A_A__ __________ByByCuCnCiCnCjCYCBCBCYCYCYCMCuCuCuCuCuCYCY_A_A_A_A_A__ ________________CnCiCuCjCBCBCYCBCuCzCMCYCYCuCzCzCzCzCzCu_A_A_A_A __________________CuCuCjCBCBCYCuCYCYByCBCBCBCYCYCzCjCjCu_A_A_A_A ____________CuCuCuCuCuCMCBCBCBCuCYCBByBoBoCzCcCcCcCuCjCu_A_A_A_A ________CuCzCzCzCuCuCuCMCBCYCBCuCYCBByBoBoBoCFCzCjCuCuCj_A_A_A_A ____CzCzCuCjCjCjCjCuCBByCBCYCuCBCBCYBy_A_ABoCFCMCjCuCjCj_A_A_A__ ____CzCjCjCjCzCuCcCBCu_ACjCYCuCYCBCzCM_A_ABoCFCcCMCuCjCu_A_A_A__ AwAwCjCuCzCjCzCMCjCB_A_ACjCYCYCBCBCzCM_A_A_ABoCFCMCuCu_A_A_A____ AwAwAwCuCMCMCMCcCBCB_A_ACjCYCBCBCuBy_A_A_A_A_ABoCcAw_A_A_A_A____ _A_AAwAwAw_A_A_A_A_A_A_A_ACYCBCBCu_A_A_A_A_A_AAwAwAwAw_A_A______ ___A_AAwAw_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_AAwAwAwAwAw_A______ _____A_A_A_A_A_A_A_______________________A_A_A_A_A_A_A_A_A______ } # tile 375 (Ashikaga Takauji) { ________________________CY____________CY________________________ ________________________CY____________CY________________________ ________________________CYCY__CLCL__CYCY________________________ __________________________CYCYCrCLCYCY__________________________ __________________________CrCYCYCYCYCL______________________Bk__ ________________________BZCLCLCLCLBbCLBZ__________________BkCm__ ______________________CLCrBZAqBNBNAqBZCLCr______________BkCo____ __________________CLCLCrCLCLBNCrBoCrAqCLCLCr__________BkCo______ __________________CrCrCLBbATBNBoBoBNAqBbCLCL__CL____BkCo________ ____________________CLBvCLAGBNAqAGAGAqAzCLCL__Cr__BkCmAw________ ______________CLCrCL__BzAXCLAGBoBoBoAGCLB_B_BZCJBnCmAw__________ ____________BbCrCrCLCLAXAYCrCLB_B_B_CLCLCLAYBlCmAwBSCLCLCL______ ________CLBvCrCLCLBZCUAeCLCrCrCrCLCLCLCrBZCJCmAwAwBSBSBbCLCr____ ____CLBbCLCrCLCLCLCLAeCLCLCrAYAYCLCLAYCJBnCmAlBJAwAwBSCUBZCLCL__ __CLCLCrCrCLCLBZCLAlAeCLCrAYAYAYAYBkBlCmAYCLAeAlAYAwBSAw__CL____ ____CLCrCLCLAeAeBJAe__CLCrAYAYAbBkCmAbAYAXCLBbAeAYAYAwAY________ ________AlAlBSAwAw____CLCrAYBkCKCmCLAYAYCrBZ______AYAYAY_A_A____ ________AeBSBSBSAY_____GBnBkCmAbCLCLCLAYCLCL_____A_A_A_A_A_A_A__ __________AYAwAwAwBSAw_I_GCmCrCLCLCLBbCLCL_____A_A_A_A_A_A_A_A__ ______________AYAYAwBS_GCLCLCLCLCLCLCLCLBZCL_A_A_A_A_A_A_A_A_A__ _______________K_IAYAwCLCrAOCLBZBZCLCLBWCLCrCLCL_A_A_A_A_A_A_A__ _____________K_I_GCLCLCrCLCLBDBZCLBZCLBZCLCLCrCLCr_A_A_A_A_A_A__ _____________I_GCLCrCrCLCLCLBkAlCLBZCLAlBDCLBbCLCrCLCL_A_A_A_A__ __________CLCrCLCrCLCLBZBDBkAlAe_A_A_AAeBDBXCLCLCLCLBb_A_A_A____ ______________CLCLCLCLAlBDAlAe_A_A_A_AAeAlBDAY_A_A_A_z_A________ _____________________AAlBDAlAe_A_A_A_AAeBDAwBS_A_A_A_A_A________ ___________________A_AAwBJAe_A_A_A_A_A_AAeAwBSAw_A_A_A_A________ ___________________AAwBSAwAY_A_A_A_A___AAYAwAwBSAw_A_A__________ _________________A_AAwBSAwAY_A_A_A_______AAYAYAw_A_A_A__________ _________________ABSBSAwAYAY_A_A___________A_A_A_A______________ _________________AAwAwAY_A_A_A__________________________________ _________________A_A_A_A_A_A____________________________________ } # tile 377 (Dark One) { ________________________________________________________________ __________________________AeAeAB________________________________ ____As__________________AeAeCLAeAe____________________As__As__As __As__________________AeAeCLABCLAeAB__________________As__As____ __As__As____________ABAeCLABABABCLAeAB______________AsAs____As__ As____AsAs__________AeCLABCBABCBABCLAB______________AsBPAs__As__ AsAsBP__As__________AeCLABABABABABCLAB______________AsBPAs__AsAs AsAsBP__As__________ABABCLABABABCLABAB__________As____BPAsAs__As AsBPBPAsAs________CrCrABCLABABABCLABCrCr____________AsBPAs____As ____AsAsAsAs____CrCBCrABAeCLABCLABAeCLCBCrAB______AsAsBPAs__As__ __BPAs__AsAs__ABCrCLCLABAeCLABCLABAeCrCLCrAeAB________AsAs__As__ AsBPBPAsAs__ABAeABCrCrCrAeAeCLABAeCrCrCrCLAeAeAeAB__AsAsAsBPAs__ __BPAs____ABAeAeABCrCLCLABAeCLABABCrCrCrABAeABAeAeABAs__BPAsBP__ As__As__CLABAeABABCLCLCrCrABCLABCLCrCBCLABABABABAeAB____BP__BP__ AsBP__ABAeCrABABABABCrCBCLCrCLCrCLCLCrABABABABABAeCrABCLAsBPBqAs BqABCLCrAeCrABABABABABCLCrCrCLCrCrCBCLABABABABABCrABCrCrCLBqBqAs BqAeAeCrABCLABABABABABABCrCrCBCLCrCrABAB__ABABABCLABCrCrAeABBqAs BqAeAeCLABCLABABABABABAeABCLCrCLCrABABAB____ABABCLABCLABAeABBqAs AsBqAeCLCLABCLABAB__ABAeABABCLABABABABABAB__ABCLABCLCLABABBqBPAs AsBPABCLCLABCLAB____ABAeAeABCLABABABAeABAB__ABCLABCLABABABBP____ __AsABCLCLABCL____ABAeAeABABCLABABABAeABAB____CLABCLABABAB______ ____ABABCLABAB____ABAeAeABABCLABABABAeABAB____ABABCLABAB___A_A_A ____ABABCLCL______ABAeAeABABCLABABABAeABAB______CLCLABAB_A_A_A_A ______ABCLCL____ABAeAeABABABCLABABABAeABAB_A_A_ACLCLABAB_A_A_A_A ________AB______ABAeAeABABCLABCLABABAeAeAB_A_A_A_AABAB_A_A_A_A__ ________________ABAeAeABABCLABCLABABABAeAB_A_A_A_A_A_A_A_A______ ______________ABAeAeABABABCLABCLABABABAeABAB_A_A_A_A_A_A________ __________CLCrABAeAeABABABCLABABCLABABAeABABCL_A_A_A____________ __________CrCLCrAeAeABABCLABABABCLCLABAeAeCLCL_A_A_A____________ _________A_ACrCLCrCLCLCLCLABABABABCLCLCLCLCLCL_A_A______________ ___________A_A_ACrCLCLCL_A_A_A_A_A_ACLCLCL_A_A_A________________ _______________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A________________ } # tile 383 (page) { ________________________________________________________________ ________________________________________________________________ ________CP______________________BkBd____________________________ ________CSCP__________________CmCPBD____________________________ ________C$CP________________BDCTBwBkAe__________________________ __________CmCP______________AeClCnBdBd__________________________ __________CSCm______________AeCiCJBmBX__________________________ ____________C$CP__________AeBJCPBdAjAeAB__CPCP__________________ ____________CSCm________BJC$BdAeAeCJCPBdC$BNArBk________________ ____________C$Cm______BDAeCPCmC$CmBdC$C$CYBNAqAXBd______________ ______________CSCm____AeCmAeC$CmCPC$CYCYCvBoBNArBd______________ ______________C$Cm____AlCPAeCmCPBdC$CuCvCuCYBNAqAT______________ ________________CSBk____CPABCPCmBkC$CvCuCYCYBNBNAq______________ ________________C$BnCjC$BdABBkBkBdCmCvCuCYCBBNBNCB______________ __________________C$CrBkCPBdAOAeAOCmAqBNBNBNBoCuCu______________ ________________CrBNBJCPABBJCPABCPAeCmAqBNBNBNCuCY______________ ____________________BNAjABCPAjAeABBJCmAqAqBNBNCuBk______________ ______________________CjABAeCPABAOCPAeCmAqAqAqCpBn______________ ______________________ABABBdABAOABABBdABCmCmAqCP________________ ______________________ABBdAOAOABAlBdBDABBkAOCmBk________________ ______________________BJAOCPBdAOABCPAOBdCPAO____________________ ______________________BkC$AOCPBdABBdCPBJAO______________________ ________________________CmBdBkAOABAOAOCmC$______________________ ________________________BJABBD____ABBdAjCm______________________ ________________________AeBkAB____ABBdAOAO______________________ ________________________BlCmBd______ABAlCmBJ____________________ ________________________C$BkBD______ABAeBDBk____________________ ______________________AeBkBdAO________AeCmBkBD__________________ ____________________AeCmBkAO__________ABABCmAe__________________ ______________________AeAO________________ABAB__________________ ________________________________________________________________ ________________________________________________________________ } # tile 384 (abbot) { ____________________________CnCiCl______________________________ __________________________CnCnCnCnCl____________________________ __________________________BVCnBVCnCi____________________________ __________________________CTCnCnCnCT____________________________ ____________Ci____________CTCnCnCnCGAl__________________________ ____________CnCn__________BjCGCTBwAlAlAjBJ______________________ ____________CiCnBJ____BJAlBJAlBWAlAlBDBDAlBDBD__________________ ____________CnBwAlBDAjBDBDBJAjAeBJBDBDBDBDBDBDBJ________________ ______________BJBJBDBJBDBDBDAlAeAjBJBDAlBDBDBDBDAl______________ ______________AeAlBDAlAjBDAlBDAeBJBDAlBDAlAjAlBDBDBD____________ ______________AeAlAlAlBXAlBDBJAeAlBDBDAlAlAeBJAjBDAl____________ ________________AeAlAlAeAeAlAlAjAeBDAlAlAlAeAlBJBDAl____________ ________________AeAeAeAlAeAlAlBXAeAlAlAeAe__CnBDAlAl____________ __________________AeAe__BlAlBJAjAeAlAeBl__CnCiCnAlAl____________ ________________________BkCOCPCmCmCPCPCO__CnCTCnAl______________ ________________________AlCPCPBdCmCmCPAe__CTCGBw________________ ______________________AeAlAjBxBDBkBDBDAlAl______________________ ____________________AeAlBJCPBkBDBkCmBDAlAlAe____________________ __________________AlAlAjCmBkBDAlBDBkCoBJAlAlAe__________________ ____________________BJAlBDBJBDAlBDAeAlAeAe______________________ ____________________AeAeAlBDAe__AlAlAeAjAl______________________ _________A_A_A____AlBDBDAlAlAe__AeBDAlBJAlAl____________________ _____A_A_A_A_A_A_ABDBDAlBDAl____AlAlBdAlBDAl____________________ _____A_A_A_A_A_ABJBDBDAlAlAe____AlBDBDBDAlAl____________________ _____A_A_A_A_A_AAjBDAlAlAlAe_A____AlBDBDBDAl____________________ _____A_A_A_A_A_ABJAlBDAlAe_A_A_A_AAeBJAlAlAl____________________ _____A_A_A_A_A_AAlAlAlAe_A_A_A_A_A_AAlAlAlAlBJ__________________ _______A_A_A_A_A_AAlAlAe_A_A_A_A_A_A_AAeAeAlAlBD________________ _______A_A_A_A_A_AAlAe_A_A_A_A_A_A_A_A_AAeBkBkBkBD______________ _________A_ABkBkBDBDAl_A_A_A_A_A_A_A_A_zBnCPBD_A_A______________ ___________A_A_ABDBkAl_A_A_A_______A_ABkBkBJ_A_A________________ _____________A_A_A_A_A_A_____________A_A_A_A_A__________________ } # tile 386 (hunter) { __________________________ABABABABAB______________________CI____ ________________________ABAKCiCnABABAB__________________AzCI____ ________________________ABAeCnCiCnAeAB______________AzAz__CI____ ______________________ABAeCnBRCnBRBwAeAB________AzAz____CI______ ______________________ABAeCTCiCnCnCTABAe____AzAz________CI______ ______________________ABAeBVCTCnBwBVAeABAzAz__________CI________ ____________________BWBWAeBWCGBzBTBWAeBWBv____________CI________ __________________BWBvBvAeBvBWALAzAzAeBvBWBW________CI__________ __________________CJBWBvBWBvBWALBvAzAbAzAbBj________CI__________ ________________BkBjBWAzAzBWAzALAzAzAzAbBJCJ______CI____________ ________________CTBjBJAzAzAzBvBWAzAbAbAbBJBkCT__BWBW____________ ______________BkBjBJBJ__BWAzBWAzAbAzAb__BjBbBkBW________________ __________AzAzCJBjBJ____AzBWAzAzAbAzAw__BJBjCJ__________________ ______AzAz__BkBjBJBJ____AzBSBsBsBSAwAwAzAzBjBj__________________ __CICI______CTBjBJ____CIBWBvBsCLBSAwAb____BJBjBk_A_A_A_A________ ______CICICICTBjBJCICIBWBWBvBWAbBWAzBW_A_ABJBjCT_A_A_A_A________ ____________CnCTBj____BWBWBWBvBWBvBvAzAb_ABJCTBj_A_A_A_A________ ____________CnCTCG__AzBWBvBWBv_ABvBWAzBW_A_ABVCT_A_A_A_A_A______ ____________CTBj____BWAzBvBWBv_AAzBvBWAz_A_ABVBw_A_A_A_A_A______ ______________________AzBWBv_A_ABWAzBWAz_A_A_A_A_A_A_A_A_A______ ______________________BjBvBW_A_A_ABWBvBj_A_A_A_A_A_A_A_A_A______ ______________________BkCJBJ_A_A_ABJBjBj_A_A_A_A_A_A_A_A________ ____________________BjCTBjBJ_A_A_ABJAwBS_A_A_A_A_A_A____________ ____________________BkAwBjBJ_A_A_AAYAwBS_A_A_A_A_A______________ ____________________AwAwAb_A_A_A_AAYAwBS_A_A_A_A_A______________ ____________________BSAwAY_A_A_A_AAYAwAw_A_A_A_A_A______________ ____________________AwAwAY_A_A_A_AAwAwBS_A_A_A_A_A______________ ____________________BSAwAY_A_A_A_A_AAwBSBS_A_A_A________________ __________________BSBSAwAY_A_A_A_A_A_AAwAw_A_A__________________ _________________AAwAwAY_A_A_________A_A_A_A_A__________________ _________________A_A_A_A_A_____________A_A______________________ ________________________________________________________________ } # tile 388 (ninja) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ___________________________H_H_G_G_F____________________________ _______________________H_H_H_H_H_G_G_F_F________________________ _____________________H_H_H_H_H_H_G_G_G_F_F______________________ ____________________CPCPCPCPBkBkCPBkBdBdBd______________________ ____________________CPCPCPCVBkCPBkBkBdBdBd_H_H__________________ _____________________HCi_z_AC$Cn_z_MC$_F_F_H___H_H______________ _____________________HCnC$C$C$CiC$C$C$_F_F___H_____H_H__________ _____________________H_HCiCnCiCnCiCn_F_F_F_____H________________ _____________________H_H_H_H_H_H_G_G_F_F_________H______________ _______________________H_H_H_H_H_G_G_F___________H_H____________ ___________________________H_H_H_G_F____________________________ _____________________H_H_HCP_zCP_zCP_H_H_H_G____________________ ___________________H_H_H_H_HCP_ACP_H_H_H_H_H_G__________________ _________________H_H_G_G_G_H_HCP_H_H_G_G_G_H_H_F________________ _________________H_H_G_F_F_H_H_H_H_G_F_F_F_F_H_F________________ _________________H_H_F_____H_H_H_H_G_F_____F_H_F________________ _________________H_H_______H_H_H_H_G_F_______H_F________________ ________________CiCn_______H_H_H_H_G_F______CiCn________________ ________________CnCi_____H_H_G_G_H_H_G_F____CnCi________________ _________________________H_G_F_____H_G_F________________________ _________________________H_G_F_____H_G_F_A_A_A_z_A_A_A__________ _________________________H_G_F_A_A_H_G_F_A_A_A_A_A_A_A__________ _____________________A_H_H_G_F_A_A_H_G_G_F_A_A_A_A_A____________ _______________A_A_A_H_H_H_G_F_A_A_H_H_H_G_G_A_A________________ _____________A_A_A_A_H_H_H_G_A_A_A_A_H_H_H_H_A__________________ _________________A_A_A_A_A_A_A_A_A_A_A_A_A______________________ ________________________________________________________________ } # tile 389 (roshi) { ___________________________A_A_A_A______________________________ _________________________A_A_A_A_A____________________C$________ _______________________A_A_ACMCM______________________C$CP______ _______________________A_A_A_A_A_A_A__________________C$CP______ _____________________A_A_A_A_A_A_A_A_A________________C$CP______ _____________________A_A_zCiClCiCTCT_A________________C$CP______ _______________________ACl_z_zCn_z_A__________________C$CP______ _______________________zCiClCiCiCnCT__________________C$CP______ __________________________CXCnCnCTCT__________________C$CP______ __________________CuCuCu_A_$CnCnCT_ACMCu______________C$CP______ ______________CiCuCuCuCuCM_ACTCTCT_A_ACuCuCi__________C$CP______ ____________CiCnCiCuCuCu_A_ACTCTBk_ACMCuCuCiCn________C$CP______ ____________CnCnCnCuCuCuCM_ACTCTCK_L_ACuCuCnCiCi______C$CP______ __________CnCiCTCTCuCuAw_A_ACTCTBk_ACMCuCuCTCnCn____CMCMCMCM____ __________CiCnCTCuCuAwAwCM_ABkCPBk_L_ACuCuCuCTCnCi___ACM_ACM____ __________CnCiCTCuAwAwAY_A_ACPBkBk_ACMCuCuCuCTCTCiCnCiCnCi______ __________CTCnCiCnAwAYAYCM_ABkCOBl_z_ACuCuCu__CTCTCTCnCnCn______ ____________CTCnCnCnAYCu_A_ACFBsBsBs_ACMCuCuCM____CTCTCTCT______ ____________AwCTCTCTCuCuCM_ACFBsBsBsCM_ACuCM_A_________z_z______ __________AwAwAYCuCuCuCu_A_ABsBsBsBs_A_ACM_ACM_z_______A_A______ ________AwAwAYAYCuCuCuCuCM_ABsBsBsBsBsCM_ACM_A__________________ ______AwAwAYAY_ACM_ACM_ACM_ABsBsBsBsBs_ACM_A_________A_A_A_A____ ____AwAwAYAY___ACM_ACM_ACMBsBsBsBsCFBsBsBs_____A_A_A_A_A_A_A_A__ ____AYAYAY__________CFCFCFBsBs_ACFCFBsBsBs_A_A_A_A_A_A_A_A_A_A__ ____AYAY____________CFCFCFBsBs_ACFCFCFBsBs_A_A_A_A_A_A_A_A_A_A__ ______________________CFCFBs_A_A_ACFCFBs_A_A_A_A_A_A_A_A_A_A____ ______________________BSAwAw_A_A_ABSAwAw_A_A_A_A_A_A_A_A_A_A_A__ _____________________ABSAwAw_A_A_ABSAwAw_A_A_A_A_A_A_A_A_A_A____ _________________A_A_ACPBSCP_A_A_ACPBSCP_A_A_A_A_A_A_A_A________ _________________ACPCPCPBSCP_A_A_ACPBSCPCPCP_A_A_A_A_A__________ _______________A_AAwAwAwAwAw_A_A_AAwAwAwAwAw_A_A_A______________ _______________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A________________ } # tile 391 (warrior) { ________________________________________________________________ ____________________________BsCFCFCF____________________________ __________________________BsBSCFBSCFCF__________________________ ________________________BsBiCiCFCnCFCFCF________________________ ________________________BSCiCiCnCnCnBsCF________________________ ________________________Bs_z_$Ci_A_ABsCFCFCF____________________ __________________________ClClCnCnCnBsBsBsCFCF__________________ __________________________CiClCiCnCnBsBsBsBsCFCF________________ ____________________________CXCnCn________BsBsBs________________ ________________________CcCyCTCTCTCcCFCnCn__BbCL________________ ____________________ClCqCzCzCcCcCcCFCFBsCnCrCrCYCY______________ __________________CiCiCcCzCcCcCFCcCFCFBsCnCrCrCYCY______________ ________________ClCiCnCGCcCcCFBsCFCFBs__CrCrCYCYCYCY____________ ______________ClCnCnBw__CrBsBiCLBsBsB___BbCLBoCYCYCY____________ ____________ClCgCnCG____CrCrCrBbCLB_B___CLBvBoBoBoBo____________ ________CLCTCdCnBz________CrCrCLBvB_____BvBzBoBoBoBo____________ ________BbCLCTCG________CcCzCrBbCLCABs____CLB_BoBo______________ ________C$BZCL________CcCzCzCcCqCFCFCFBs__B_B_B_Bo______________ ________C$CPCLBZ____CcCcCzCcCcCcCcCFCFBsBs__B_B_________________ ______C$C$CP________CcC$C$CmCmCcCcCFCFBsBkBs____________________ ______C$CP________CmCmCzCzCcCcCmCmCPCPCPCFBs____________________ ____C$C$CP________CcCqCiCnCTCTCcCcCcCFCFCF_____________A_A_A_A__ ____C$CP____________ClCnCnCTBdBdBdCiCnCnCT_________A_A_A_A_A_A_A __C$C$CP____________ClCiCnCT______CnCnCnCT_____A_A_A_A_A_A_A_A_A __C$CP______________CiCiCnCT______CiCnCnCT_A_A_A_A_A_A_A_A_A_A_A __C$CP______________BsCnCT_________$CnCnBS_A_A_A_A_A_A_A_A_A_A__ ____________________ClBiBS___A_A_A_ABiBSCT_A_A_A_A_A_A_A_A_A____ _______________A_A_zCiBSCT_A_A_A_A_zCiBSCT_A_A_A_A_A_A_A_A_A____ _____________A_A_A_ACXBi_A_A_A_A_A_A_ABSBSBSBS_A_A_A_A_A_A______ ___________A_A_ABSBSBiBS_A_A_A_A_A_A_ABSBSBSBS_A_A_A_A_A________ _____________A_ABSBSBSBS_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A__________ _________________A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A______________ } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/share/obj32alg.txt������������������������������������������������������������0000664�0000764�0000764�00000256740�10545462320�015727� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������__ = (0, 0, 0) _A = (128, 96, 0) _B = (128, 255, 128) _C = (0, 0, 192) _D = (168, 224, 224) _E = (96, 48, 48) _F = (128, 64, 0) _G = (32, 64, 64) _H = (0, 112, 224) _I = (192, 96, 96) _J = (48, 96, 0) _K = (117, 105, 88) _L = (224, 192, 160) _M = (168, 168, 224) _N = (128, 32, 0) _O = (96, 0, 48) _P = (64, 128, 128) _Q = (255, 128, 128) _R = (128, 0, 255) _S = (0, 64, 32) _T = (128, 0, 0) _U = (96, 192, 0) _V = (48, 36, 0) _W = (96, 192, 192) _X = (0, 32, 32) _Y = (48, 24, 0) _Z = (48, 12, 0) _a = (128, 112, 32) _b = (64, 64, 128) _c = (192, 0, 96) _d = (48, 0, 0) _e = (0, 0, 224) _f = (224, 224, 0) _g = (0, 128, 64) _h = (0, 255, 255) _i = (64, 0, 128) _j = (96, 96, 0) _k = (0, 255, 0) _l = (255, 0, 128) _m = (96, 96, 192) _n = (96, 72, 0) _o = (104, 84, 31) _p = (224, 168, 0) _q = (0, 64, 64) _r = (96, 48, 0) _s = (248, 224, 96) _t = (224, 224, 112) _u = (202, 143, 114) _v = (24, 48, 48) _w = (144, 192, 192) _x = (0, 192, 96) _y = (0, 32, 64) _z = (96, 24, 0) _0 = (128, 128, 64) _1 = (24, 24, 48) _2 = (224, 112, 0) _3 = (240, 240, 240) _4 = (128, 255, 255) _5 = (96, 0, 0) _6 = (128, 255, 0) _7 = (0, 0, 64) _8 = (96, 0, 192) _9 = (0, 145, 0) _$ = (108, 255, 0) A_ = (144, 144, 192) AA = (255, 192, 255) AB = (0, 24, 24) AC = (255, 192, 0) AD = (255, 192, 192) AE = (224, 224, 224) AF = (16, 16, 0) AG = (128, 64, 64) AH = (224, 56, 0) AI = (170, 136, 52) AJ = (16, 0, 0) AK = (224, 112, 112) AL = (0, 96, 96) AM = (208, 208, 208) AN = (64, 128, 0) AO = (255, 128, 255) AP = (255, 128, 0) AQ = (224, 168, 224) AR = (224, 0, 0) AS = (128, 0, 64) AT = (255, 108, 0) AU = (192, 192, 255) AV = (192, 192, 0) AW = (0, 48, 96) AX = (255, 255, 128) AY = (192, 192, 192) AZ = (168, 224, 168) Aa = (128, 128, 96) Ab = (112, 224, 0) Ac = (64, 64, 0) Ad = (127, 90, 72) Ae = (224, 112, 224) Af = (48, 48, 24) Ag = (255, 64, 0) Ah = (64, 48, 0) Ai = (192, 144, 0) Aj = (176, 176, 176) Ak = (0, 0, 96) Al = (128, 96, 96) Am = (192, 144, 192) An = (48, 24, 24) Ao = (64, 32, 0) Ap = (224, 0, 112) Aq = (0, 128, 128) Ar = (64, 16, 0) As = (144, 192, 144) At = (160, 160, 160) Au = (64, 0, 0) Av = (192, 96, 0) Aw = (255, 0, 255) Ax = (24, 24, 0) Ay = (255, 0, 0) Az = (192, 96, 192) A0 = (112, 224, 112) A1 = (48, 96, 96) A2 = (145, 71, 0) A3 = (0, 16, 16) A4 = (120, 160, 160) A5 = (24, 0, 0) A6 = (0, 0, 16) A7 = (182, 71, 0) A8 = (160, 160, 120) A9 = (160, 120, 160) A$ = (144, 144, 144) B_ = (0, 64, 128) BA = (192, 48, 0) BB = (80, 160, 160) BC = (224, 0, 224) BD = (48, 48, 96) BE = (120, 160, 120) BF = (120, 120, 160) BG = (96, 192, 96) BH = (160, 160, 80) BI = (160, 120, 120) BJ = (160, 80, 160) BK = (128, 128, 128) BL = (0, 96, 48) BM = (64, 64, 32) BN = (112, 224, 224) BO = (192, 0, 0) BP = (192, 0, 192) BQ = (0, 160, 160) BR = (0, 0, 128) BS = (71, 108, 108) BT = (128, 96, 128) BU = (112, 112, 112) BV = (64, 32, 32) BW = (80, 160, 80) BX = (80, 80, 160) BY = (96, 128, 96) BZ = (0, 48, 48) Ba = (192, 192, 144) Bb = (32, 64, 0) Bc = (128, 64, 128) Bd = (160, 160, 0) Be = (160, 80, 80) Bf = (64, 0, 32) Bg = (160, 0, 160) Bh = (96, 96, 96) Bi = (252, 252, 153) Bj = (32, 32, 0) Bk = (0, 160, 80) Bl = (64, 128, 64) Bm = (160, 120, 0) Bn = (0, 0, 48) Bo = (0, 80, 160) Bp = (192, 144, 144) Bq = (0, 224, 0) Br = (80, 160, 0) Bs = (112, 112, 224) Bt = (80, 80, 80) Bu = (32, 0, 0) Bv = (128, 0, 128) Bw = (80, 0, 160) Bx = (255, 255, 255) By = (96, 48, 96) Bz = (242, 196, 77) B0 = (208, 168, 80) B1 = (255, 255, 0) B2 = (255, 255, 192) B3 = (0, 192, 0) B4 = (160, 80, 0) B5 = (0, 182, 255) B6 = (160, 0, 80) B7 = (0, 192, 192) B8 = (165, 118, 94) B9 = (48, 96, 48) B$ = (64, 64, 64) C_ = (192, 160, 64) CA = (218, 218, 182) CB = (224, 224, 168) CC = (0, 160, 0) CD = (96, 0, 96) CE = (160, 40, 0) CF = (0, 0, 160) CG = (0, 224, 112) CH = (64, 32, 64) CI = (0, 128, 255) CJ = (0, 128, 0) CK = (96, 128, 128) CL = (48, 48, 48) CM = (229, 162, 130) CN = (32, 64, 32) CO = (192, 255, 255) CP = (171, 154, 129) CQ = (160, 0, 0) CR = (224, 168, 168) CS = (145, 135, 110) CT = (64, 0, 64) CU = (192, 255, 192) CV = (112, 0, 224) CW = (0, 96, 0) CX = (96, 96, 128) CY = (0, 255, 128) CZ = (0, 96, 192) Ca = (255, 211, 175) Cb = (32, 32, 32) Cc = (48, 0, 48) Cd = (0, 64, 0) Ce = (0, 224, 224) Cf = (32, 0, 32) Cg = (0, 48, 0) Ch = (192, 192, 96) Ci = (16, 16, 16) Cj = (128, 128, 255) Ck = (0, 32, 0) Cl = (128, 128, 0) Cm = (255, 182, 145) Cn = (16, 0, 16) Co = (0, 24, 0) Cp = (96, 96, 48) Cq = (108, 145, 182) Cr = (0, 16, 0) Cs = (0, 0, 255) # tile 395 (strange object) { AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwBzAI_o_FB4B4_FB4_F_F_FBzAI_o_FB4B4_FB4_FB4BzAIAIAIAwAwAwAw AwAwBzAI_o_FB4_FB4_FB4_F_FBzAI_o_FB4B4_FB4_FB4BzAI_r_r_rAIAwAwAw AwBzAI_o_FB4_FB4_FB4_F_FBzAI_o_FB4_F_F_FB4_FBzAI_r_o_o_oAI_oAwAw AwBzAI_o_FB4_FB4_FB4_F_FBzAI_o_FB4_FB4_FB4_FBzAI_o_r_F_rAI_oAwAw AwBzBzBzBzBzBzBzBzBzBzBzAIBzBzBzBzBzBzBzBzBzAI_r_o_F_r_rAI_oAwAw Bz_r_r_r_r_rCQ_r_r_r_r_r_r_r_r_r_r_rCQ_r_r_r_r_o_r_r_r_FAI_oAwAw Bz_r_____TCQAyCQ_T_______________TCQAyCQ_T___r_o_r_F_r_rAI_oAwAw BzAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAI_o_F_F_FAIAI_oAwAw BzAI_o_F_FB4_F_FB4_F_FBzAI_o_FB4_FB4B4_F_FBzAI_o_r_FAIAIAI_oAwAw BzAI_o_FB4B4_F_FB4_F_FBzAI_o_FB4_FB4B4_F_FBzAI_o_rAIAI_oAI_o____ BzAI_o_F_FB4_F_FB4_F_FBzAI_o_F_FB4_F_FB4_FBzAI_oAIAI_o_rAI_o____ BzAI_o_FB4B4_F_FBzBzBzBzBzBzBzBzBz_FB4_F_FBzAI_oAI_o_r_FAI_o____ BzAIBzBzBzBzBzBzBzAIAIAIAIAIAIAI_oBzBzBzBzAIAI_o_o_r_r_FAI_o____ BzAIAIAIAIAIAIAIBzAIAICr__AIAIAI_oAIAIAIAIAIAI_o_r_F_F_rAI_o____ BzAI_o_FB4_F_FB4BzAIAIAIAIAIAIAI_o_FB4B4_FBzAI_o_r_r_rAI_o_o____ BzAI_o_FB4_FB4_FBz_o_o_o_o_o_o_o_o_FB4_FB4BzAI_o_r_rAI_o_o______ BzAI_o_F_F_FB4_F_FB4_FBzAI_o_F_FB4_FB4_FB4BzAI_o_rAI_o_o________ BzAI_o_FB4_FB4_F_FB4_FBzAI_o_F_FB4_FB4_FB4BzAI_oAI_o_o________Aw BzAIBzBzBzBzBzBzBzBzBzBzAIAIBzBzBzBzBzBzBzBzAIAI_o_o________AwAw BzAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAI_o_o________AwAwAw BzAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAIAI_o________AwAwAwAw ______Cr____Cr____Cr__Cr__Cr__Cr__Cr__Cr__Cr__________AwAwAwAwAw Aw__________________________________________________AwAwAwAwAwAw } # tile 406 (runed spear / elven spear) { AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwB4__Aw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwB4_FAF__Aw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwB4_FBq_rA6AwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwB4B4A2Bq_FAF__AwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw_F_FBq_F_rA6AwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwA2Bq_F_rCi__AwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwB0_L_FA2_rA6AwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwB4A2B0A3A6A3AwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwB4_F_rA3AJAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwB4A2_rA6__AwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwB4_F_rA3AJAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwB4A2_rAF__AwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwB4_F_rA3A6AwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwB4A2_rA6__AwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwB4_F_rA3AJAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwB4A2_rCi__AwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwB4_F_rA3__AwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwB4A2_rA6__AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwB4_F_rA3AJAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwB4A2_rAF__AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwB4_F_rA3A6AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwB4A2_rA6__AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwB4_F_rA3AJAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwB4A2_rCi__AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwB4_F_rA3__AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwB4A2_rA6__AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAw_F_F_rA3AJAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwA3_r_rAF__AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw Aw__AJA3__AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw } # tile 407 (crude spear / orcish spear) { AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAM__Aw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAMAY____Aw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAMAYAtBK__AwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAYAMAYAtA$____AwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAYAYAtA$BK__AwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAYAtA$BK__CrAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAjAMA$A$BKCnAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwBhBtAj______AwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwBhBtB$____AwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwBhBtB$__CrAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwBhBtB$____AwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwBhBtB$____AwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwBhBtB$____AwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwBhBtB$____AwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwBhBtB$____AwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwBhBtB$__CrAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwBhBtB$____AwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwBhBtB$____AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwBhBtB$____AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwBhBtB$____AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwBhBtB$____AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwBhBtB$__CrAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwBhBtB$____AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwBhBtB$____AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwBhBtB$____AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwBhBtB$____AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwBtBtB$____AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw Aw__B$B$__CrAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw Aw________AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw } # tile 408 (stout spear / dwarvish spear) { AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwBx__Aw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwBx_3____Aw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwBx_3AMAjCiAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwBxBx_3AMAM____AwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw_3_3_3AMAYAj__AwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw_3BxAMAMAjCi__AwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwB4B0_LAYAYAj__AwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwB4B4A2B0AMAYCi__AwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwB4B4A2_r_r______AwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwB4B4A2_r_r__Ci__AwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwB4B4A2_r_nA6A3AwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwB4B4_F_r_rCn__AwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwB4B4A2_n_rA3__AwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwB4B4A2_r_rCn__AwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwB4B4A2_r_rA3__AwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwB4B4A2_r_rCi__AwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwB4B4A2_r_o__A6AwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwB4B4_F_r_r____AwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwB4B4A2_n_rCiA6AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwB4B4A2_r_rA6__AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwB4B4A2_r_rCi__AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwB4B4A2_r_rA3__AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwB4B4A2_r_nA6AJAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwB4B4A2_r_rA6__AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwB4B4A2_r_o__CnAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwB4B4_F_r_r____AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw Aw__A2_F_n_rCiA6AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwA3_r_r_rA6__AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw Aw__Ci_rCi__AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAw__A6__AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw } # tile 409 (silver spear) { AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwBxCLAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwBx_3CLCLAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwBxBx_3AECLAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwBxBx_3_3AECbCLAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwBxBx_3AEAECLAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw_3_3AEAECLCLAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwCj_3AEAEAECLAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAjAt_MCLCLCLAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAjAtA$CL_vAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAjAtA$CLCLAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAjAtBKCLCbAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAjAtA$CLCLAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAjAtBKCLCLAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAjAtA$CLCLAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAjAtBKCLCbAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAjAtA$CLCLAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAjAtBKCLCLAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAjAtA$CLCLAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAjAtBKCLCbAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAjAtA$CLCLAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAjAtBKCLCLAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAjAtA$CLCLAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAjAtBKCLCbAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAjAtA$CLCLAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAjAtBKCLCLAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAjAtA$CLCLAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAtAtBKCLCbAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwCLA$A$CLCLAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwCLCbCLCLAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw } # tile 410 (throwing spear / javelin) { AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw_3__AwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw_3AM__AwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw_3AMAM__AwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw_3_3AEAY__AwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwBxAMAY____AwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw_3AMAYAM__AwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwB4_FAM____AwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwB4A2_r____AwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwB4_F_rA6CrAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwB4A2_rA3AJAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwB4_F_r____AwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwB4A2_rA3CnAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwB4_F_rA3__AwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwB4A2_rA3AJAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwB4_F_rA6__AwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwB4A2_rA3AJAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwB4_F_rA3__AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwB4A2_rA3AJAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwB4_F_r____AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwB4A2_rA3CnAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwB4_F_rA3__AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwB4A2_rA3AJAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwB4_F_rA6__AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwB4A2_rA3AJAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwB4_F_rA3__AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAw_FA2_rA3AJAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwA3_r_r____AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw Aw__AJA3__AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw } # tile 415 (silver dagger) { AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw_3__AwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw_3____AwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw_3_3____AwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw_3AMAY__AwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw_3_3AMAY____AwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw_3_3AMAY____AwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAw_3AwAw_3_3AMAYAYAF__AwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAM_3_3AEAMAYAj__A6AwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAY_3AMAYAYA3__AwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwBmBmAEAY____AwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAw_FBm_FAM_3__AwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwBmBm_FA3__AM_3__AwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAw_AB4_A____Aw______AwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwBm_o__A6AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAJ__AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw } # tile 416 (athame) { AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAMAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAMAMAw__AwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAMAMAj__AwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAMAMAj____AwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAMAMAj____AwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAMAMAMAj____AwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAMAMAMAj____AwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAMAMAMAjAj__AwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAMAMAMAYAj____AwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAMAMCbAjAj____AwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwBKAwAwAwAwAMAMCbAjAj____AwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwBKB$B$AwAwAMB$CbAjAj____AwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwB$B$B$AMB$B$CbAj____AwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwB$B$B$B$CbAj____AwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwBKB$B$CbAj____AwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwBKB$B$CbB$B$__AwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwBKB$B$CbCbCbCbB$AwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwBKB$B$CbCb____CbCbCbAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwBKB$B$CbCb____AwAwCb____AwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwB$B$CbCb____AwAwAwAw__AwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwCbCbCb____AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAw______AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw } # tile 420 (worm tooth) { AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwB2_3AwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAw_3_3_3Bx_3B2AwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwB2_3B2BxBx_3_3AwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwB2AE_3_3B2Bx_3B2_3AwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAEB2CaB2_3_3BxB2_3__AwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAE_3B2_3B2Bx_3_3B2AwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwCaAECa_3_3_3_3B2__AwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwB2_3Ca_3B2BxAD_3AwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwCaB2_3_3Bx_3B2__AwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAEB2_3B2_3CaA6AwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwB2_3_3_3AEB2__AwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAEB2_3B2ADA6__AwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw_3_3_3B2__AwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwB2_3CaA6__AwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw_3_3B2__AwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwB2ADA6__AwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwCr__AwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw } # tile 421 (crysknife) { AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAw______AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwCnArAo__AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAw_N_z_zCnAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwCEAoArCr__AwAw______AwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAw_N_zArCn____AFC_A6AwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwBAAo_zArCrA6AIBzBzAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwCE_N_zArAFAIBz_h_hAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwBAAo_z_aBzBxBx_h_hAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwCEAIBz_h_hBx_h_h_hAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAIBz_h_h_h_hBx_h_h__AwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwC_Bz_h_h_h_h_hBx_h_h_hAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwBzAwAw_h_h_h_h_hBx_h_h__AwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAw_h_h_h_h_hBx_h_hAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw_h_h_h_hBx_h_h__AwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw_h_h_h_h_h_h__AwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw_h_h_h_h_h_h__AwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw_h_h_h_h_h____AwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw_h_h_h_h__AwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw_h_h_h__AFAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw_h_h_h__AwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw_h_h____AwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw____AwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw } # tile 424 (short sword) { AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAMAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw_3AMAw__AwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw_3AMAj__AwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw_3_3AMAj____AwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw_3_3AMAY____AwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw_3_3_3AMAjAj____AwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw_3_3AMAMAYAj____AwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAw_3_3_3AMAMAMAj____AwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwBzAwAwAw_3_3_3AMAEAMAjAj____AwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAw__BzAw_3_3_3AMAMC_AMAjAj____AwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAw__Bz_3_3_3AMBzC_AMAjAj____AwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAw__Bz_3_3AMBzC_C_AMAjAj____AwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAw__C_C_C_BzC_C_AMAYAj____AwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAw______BzC_B0AMAjAj____AwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAw__BzAIAIC_AjAjAj____AwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwBzC_AI__AIAjAj____AwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwBzBzAIAI____AIAIAIAIAI__AwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAw__BzC_AI__________________AwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAw__C_AIAI________________AwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAw__________AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAw______AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw } # tile 425 (runed short sword / elven short sword) { AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwB0AwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwCmB0Aw__AwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwCmB0AI__AwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwCmBz_uAICn__AwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwBzCm_uC_AJ__AwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwCmCMCmB0AIAICn__AwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwBzCmB0B0AIAIAJ__AwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwCmCMCmB0B0_uAICn__AwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAPAwAwAwCM_sCmB0B0B0_IAIAJ__AwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAw___pAwCm_tCmB0B0Av_uAIAIAJA6AwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwA3APBzCmCMB0AP_2_uAIAIAJ__AwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAw___pCmCmB0APAvAvB0AI_IAJ__AwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwCiAvAvAvAPAiAvB0_IAIAJCrAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAw__AFCr_pAvAvB0AIAIAJ__AwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwA6APAvB4_2AI_IAICn__AwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAPAiB4A6B4AIAIAJ__AwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAP_pB4A7A6A6AvA7A7AvB4__AwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAw___p_2B4A3____A6A3A6__A6AFAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwCiAvA7B4AJ__AF____Cr____AwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAw__A3A6AFA6AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAJ____AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw } # tile 426 (crude short sword / orcish short sword) { AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAjAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAEAjAw__AwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAEAjBU__AwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAEAEAjBU__AFAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAEAEAjA$A3__AwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAEAE_3AjBUBU__AJAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAEAEAjAjBUBU____AwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAEAE_3AjAjAjBU__CiAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwA$AwAwAwAEAEAEAjAtAjBUBK____AwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAw__A$AwAEAE_3AjAjBhAjBUBU____AwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAw__A$AE_3AEAjBKBhAjBUBU____AwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAw__A$AEAEAjA$BhBhAtBUBK__CiAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAw__BhBhBhA$BhBtAjBKBU____AwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAw______A$BtBhAjBUBU__CiAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAw__A$B$B$BhBUBUBK____AwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwA$BhB$__B$BUBU____AwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwA$A$B$B$____BtB$BtB$Bt__AwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAw__A$BhB$__Ci______________AwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAw__BhB$Bt______Ci____Ci__AwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAw__________AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwA6AF__AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw } # tile 427 (broad short sword / dwarvish short sword) { AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAMAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw_3AMAw__AwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw_3AMAY__AwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw_3_3AEAj____AwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw_3BxAMAY____AwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw_3_3_3AMAjAY__AFAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw_3_3AEAMAYAj____AwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAw_3_3BxAMAMAMAj__CiAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAYAwAwAw_3Bx_3AMAMAEAjAY____AwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAw__AMAw_3_3_3AMAMAjAMAjAj____AwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAw__AY_3_3BxAMAMAtAMAjAjAF__AwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAw__AM_3_3AMAYAtAtAEAjAY__A6AwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAw__AtAtAtAMAtAjAMAjAj____AwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAw__Ci__AMAtAtAMAjAY____AwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAw__AYA$A$AtAYAjAj__CrAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAYAtA$__A$AjAjCi__AwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAYAYA$A$____A$A$A$A$A$__AwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAw__AMAtA$__________________AwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAw__AtA$A$____Ci____Ci____AwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAw__________AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwCrCnCrAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw } # tile 429 (silver saber) { AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAMAEAMAMAMAMAYAYAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAMAEAMAEAMAMAEAMAEAMAEAMAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAMAMAMAYAYAYAYAYAYAMAMAMAEAMAYAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw A$AjA$A$A$A$A$AtAtAYAjAYAYAYAMAEAMAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw ____Ci______CL__Bt__BUBKAtAYAYAYAMAEAMAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwCLBh__B$CLBKAYAYAYAMAEAYAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAw__CL__BKAYAYAMAMAMAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwB$CL__A$AYAMAMAMAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw__B$BUAjAYAMAEA$BKA$BKAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw__BhAjAYAMAtBKBKBKAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwBU__A$AYAMAYBKBKAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw__CbAtAYBKBKAYAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw__BhBKA$BKBKBKAjAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw__BKBKBUCbBUBKBKAjAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwBhBhBtBU__B$BUBKA$AjAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwA$AwAwAwBU__BUBKBKAj AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwBtCLBUBKAt AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwBK__BhAM AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw__CLAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw } # tile 431 (runed broadsword / elven broadsword) { AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAPB4__ AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAvAv_FA6 AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw_pB4_FCr__ AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAvA7A2A6__Aw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAP_pAvAvAv_FA6__AwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAP_pAPAiAvAvAv_FA6__AwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw__CrCmCMAIAvAvB4CrAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwCmBzAIAIB0AvA7A3AwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwBzCMAIA5CMB0AvB4__AwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwCmBzAIAICMAIC_AvCiAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwBzCMAIBuCMC_C_CnAv__AwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwCmBzAIAJB0C__IA5AJAvCiAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwBzCMAI_IBz_IC_AF____Cr__AwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwCmBzAIAJB0C_C_AJ____AwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwCmBzBeC_B0AKC___AJ__AwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwBzCmBmCnB0B0C_AJA6__AwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwCMCm_aCnBz_IC_______AwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAw_sCmBmC_CMC_C_AJAJ__AwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwCmCMBmBuCMAIC_AJ____AwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwBzCmBmCnCMC_C_A5A6__AwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwBzCm_aBuCMAIC_AJAJ__AwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwCmCMAIC_B0C_C_A5__A6AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwBzCmBmBuB0AKC_AJCn__AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwCmBzAIAICMC_C_AJ____AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwBzCMAIA5CMC_C_AJ____AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwCmCm_sAICMC_AIA5__A6AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw Aw_tCm_sAKB0AIC_AJCn__AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwCmAXB0C_AIAKAJ____AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw Aw_s_uC__IC_AJ____AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwB0C__IC_AJ__AFAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw Aw__AJAF__AJ__AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw } # tile 463 (long bow / yumi) { AwAwAwAwAwAwAwAwAwAwAw_u_uAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAw_u_uAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAw_uB0AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAw_uA4A4AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwA4A4_u_uAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwA4AwCh_uCSAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwA4AwAw_uB0BIAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwA4AwAwAw_u_uCSAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwA4AwAwAw_uB0_uCSAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwA4AwAwAwAw_u_uB8AwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwA4AwAwAwAwChCSAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwA4AwAwAw_u_uB8AwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwA4AwAwAw_u_uChBIAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwA4AwAwAwBH_uCmCmAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwA4AwAwAwAw_uCmCmAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwCBAwAwAwAw_uCSAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwCBAwAwAwAw_uBHAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwA4AwAwAwAw_uCmCmAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwA4AwAwAw_u_uCmCmAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwA4AwAwAw_uB0_uCSAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwA4AwAwAw_uA8B8AwAwAwAwAwAw______AwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwA4AwAwAwAw_uA8AwAwAwAwAw____Ci____AwAwAwAwAw AwAwAwAwAwAwAwAwAwAwA4AwAwAwAwB0_uB8AwAwAwAw______AwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwA4AwAwAw_u_u_uCSAwAwAw__A6AFAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwA4AwAwAw_uB0CSAwAwAwAw__AF__AwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwA4AwAwB0_uCSAwAwAwAwA3____AwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwA4Aw_u_uCSAwAwAwAw____AJAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwA4A4Ch_uAwAwAw____AF__AwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAw_uA4A4__Cr____AFA6__AwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAw_u_uA3____AFA6____AwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAw_uB0____A6____AwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAw_u_u__AJCrAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw } # tile 465 (crossbow) { AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwB4B4B4B4AwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwB4AvAvB4__AwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwB4Av_2B4____AwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwB4B4CmCmCmCmB4B4AwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwB4B4AvAvCmCmCmCmAvAvB4B4AwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwB4AvAvAvAvB4AvAvB4AvAvAvAvB4AwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwB4Av_2AvA3A6B4AvAvB4CiA6Av_2AvB4AwAwAwAwAwAwAwAw AwAwAwAwAwAwAwB4AvAvA6____AwB4Av_2B4______A6AvAvB4AwAwAwAwAwAwAw AwAwAwAwAwAwAvAvAvA3__AwAwAwB4AvAvB4A3__AwAw__AvAvAvAwAwAwAwAwAw AwAwAwAwAwAvAvAv____AwAwAwAwAvAvAvB4____AwAwAwCiAvAvAvAwAwAwAwAw AwAwAwAwAwA4A4Ci__AwAwAwAwAwB4AvAvB4A3__AwAwAwAw__A4A4AwAwAwAwAw AwAwAwAwAvAvA4A4AwAwAwAwAwAwB4Av_2B4____AwAwAwAwA4A4AvAvAwAwAwAw AwAwAwAwAv_2A6AwA4AwAwAwAwAwB4AvAvB4A6__AwAwAwA4AwCrAvAv__AwAwAw AwAwAwAwAv__AwAwAwA4AwAwAwAwB4AvAvB4____AwAwA4AwAwAwCiAv__AwAwAw AwAwAwAw__AwAwAwAwAwA4AwAwAwB4_2AvB4A3__AwA4AwAwAwAwAw____AwAwAw AwAwAwAwAwAwAwAwAwAwAwA4AwAwB4AvAvB4____A4AwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwA4AwB4AvAvAvA6A4AwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwA4Bm_T_TB4A4__AwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwCA_T_TCACr__AwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAvCBCBB4____AwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwB4AvAvAvA6__AwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwB4AvAvB4____AwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwB4AvAvB4A6__AwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwB4Av_2B4____AwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwB4B4B4B4A3__AwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwA6A3______AwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw______AwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw } # tile 478 (silver dragon scale mail) { AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AE_3AU_3AEAUAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAU_3AEAUAUAU AwA6___3_3_3AUAU_MAwAwAwAwAwAwAwAwAwAwAwAwAwAw_3AU_3_3AUAU____Aw AwAw____AUBxAEAEAUAUAUAwAwAwAwAwAwAwAwAwAwAE_3AU_3_3_MAU__AwAwAw AwAwAw_____3BxAEAEAEAUAUAwAwAwAwAwAwAwAw_3AUBxBxAEAUAU__AwAwAwAw AwAwAwAwA6_3AUBx_3AU_3_MAUAwAwAwAwAwAwAU_3BxAU_3AU_MAUAwAwAwAwAw AwAwAwAw________AE_3AE_3AU_M________AUAEAU_3_3AUAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAUAU_3AUAE_3________AUAE_3AUAUAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAUAU_3AUBx_3____BxAEAUAUAUAEAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwBxAEAUBxBxAUAUBxBxAUAUBxBxAEAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwBx_3AUBxBx_3AUBxBx_3AUBxBxAEAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwBxAUAUAEBx_3_M_3BxAUAUAEBxAEAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAw_3BxAUAUAEBxAEAU_3BxAUAU__AwAwAw__________Aw AwAwAwAwAwAwAwAwAwAwBxBx_3AUBxBxAUAUBxBx_3AU____________________ AwAwAwAwAwAwAwAwAwAwBxBxAUAUBxBx_3AU_3BxAEAU__________________Aw AwAwAwAwAwAwAwAwAwAwAEBx_3AUAEBxAUAU_3BxAEAU______________AwAwAw AwAwAwAwAwAwAwAwAwAwCICIAU_MAU_3_3AU_MAUB_B_____________AwAwAwAw AwAwAwAwAwAwAwAwAwAwCICICICZCZBN_hCZCZB_B_B_____________AwAwAwAw AwAwAwAwAwAwAwAwBxBx_3AUCICZCZ_h_4CZCZB_Bx_3AUAU________AwAwAwAw AwAwAwAwAwAwBxBxAEAEAUAUCr__Bx_3AEAU____BxBxAUAEAUAU____AwAwAwAw AwAwAwAwAwBxBx_3AUAUAU______BxAEAUAU______BxBx_3AUAUAU__AwAwAwAw AwAwAwAwBxBxAU_3AU________BxBxAE_3AUAU________AU_3_3_MAU__AwAwAw AwAwAwAwBx_3AU____________BxBxAEAEAU_M____________AE_3AU____AwAw AwAwAwBxBx________AwAwAw____BxAEAEAU______________A6___MAU__AwAw AwAwAwBx____AwAwAwAwAwAwAw__BxAEAEAU________AwAwAwAwAw__AU__AwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwA6AEAE______AwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAEAEA6AwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw } # tile 488 (silver dragon scales) { AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwBxBxBxBxAU__AwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwBxBxBxBxAUAU_M__AwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwBxBxAUAU_MAMAU__AwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAU_MAUAMAUA__M__AwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAUAUAMAUA__MA_________AwAwAwAwAw AwAwAwAwAwAwAwAwAwBxBxBxBxAUBxBxBx_MBxBxA__MA_Bx__Bx____AwAwAwAw AwAwAwAwAwAwAwAwBxBxBxAU_MAUBxBxBxBxAUAUAUBxBxBxBxBxAU____AwAwAw AwAwAwAwAwAwAwBxBxAUAUAMAU_MBxBxAU_MAMAU_MBxBxAUAU_MAUAU__AwAwAw AwAwAwAwAwAwAwAU_MAU_MAUA__MAUAYAUAU_M_MA_AUAU_MAMAUA_A___AwAwAw AwAwAwAwAwAw__AUAMAUA__MA_AU_MAUAUA__MAUAMAU_MAU_MA_AF____AwAwAw AwAwAwAwAwAw______A__MA_BxAMAU_MA_AjA_AU_MAU_MA_A__M________AwAw AwAwAwAwAwAw________BxBxBxBxBx_MAUBxBxAUA_AjA__MBxBxBxBxBxAU__Aw AwAwAwAwAwAwAw______BxBxBxAUAUAMAUBxBxBxBxBxAUAUBxBxBxAU_MAU__Aw AwAwAwAwAwAwAwAw____AUAU_MAU_M_MA_BxBxBxAUAU_MAMBxAU_MAUAMAU__Aw AwAwAwAwAwAwAwAw__AU_MAUAM_MA_BxBxBxAUAU_MAMAUA_AUAMAUA__MA___Aw AwAwAwAwAwAwAwAw____AUA_A__MA_BxAU_MAUAMA__MA_AUAU_M_MA__M____Aw AwAwAwAwAwAwAwAwAw_______MBxBxBxBxBxAUA__MA_AU__AUA__MA_______Aw AwAwAwAwAwAwAwAwAwAw______BxBxBxAU_MAUAUA__________M______AwAwAw AwAwAwAwAwAwAwAwAwAwAw__BxBxAU_MAUAMAU________________AwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAw__AU_MAUAMAUA_A_______AwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAw__AMAUA__MA__M______AwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAw_______MA__M______AwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAw____________AwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw } # tile 512 (Hawaiian shirt) { AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwA0_kA0_kA0_kA0_kA0_kA0_kA0_kA0_kA0AwAwAwAwAwAwAwAwAw AwAwAwAwAw_$B1B1B1A0AVAVAVAVAVAVAVAVAVA0B1B1B1_kAwAwAwAwAwAwAwAw AwAwAwAwCG_fB1BNB1_fA0AVAVAVAVAVAVAVA0B1B1B1B1_hA0AwAwAwAwAwAwAw AwAwAw_$B1B1_h_4_hB1B1_kBzAVAVAVCh_$_fB1B1AeBN_4_h_$AwAwAwAwAwAw AwAwCGBNAeB1B3_hB1AeB1_B_$CY_$A0_kA0B1_hB1B1B1_hB1B1CGAwAwAwAwAw Aw_$_h_4B1_UB3B1B1B1A0B1B1B1B1_hB1B1_BBN_hB1B3B1AeB1B1_$AwAwAwAw AwAwA0B1B1B1B3B1B1A0B1BNB1B1BN_4_hB1B1A0B1B1B3B3B1B1A0A6__AwAwAw AwAwBC_$B1B1B3B3A0B1_h_h_4B1B1BNB1B1B3B1A0BqB3B1B1CGCo__AwAwAwAw AwAwAwAwCGA0_kA0B1B1B1_4B3B1AeB1B1B1_UB1B1A0_$CG_$AF__AwAwAwAwAw AwAwAwAwAwAwAw_$_fB1B1B1B3B3B3B1_hB1B1B1B1_kBnAFA6__AwAwAwAwAwAw AwAwAwAwAwAwAwCGB3B3B1B1B1B1B1_h_4_hB1B1AeA0__AwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAw_$B1B3B1B1AeB1B1B1_4B1B1B1B1_kCnAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwCYB1B3B3B1B1B1B1B3B3B1B1B1B3A0__AwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAw_$B1B1B1B3_4B1B3B3B1B1B1B3B3_$A6AwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwCGB1B1B1_h_4_hB3B1B1B1B1B3B1CG__AwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAw_$B1B1B1B1_h_UB1B1B1AeBNB1B1_$A6AwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwCYB1B1AeB1B1B3B3B3B1_h_4_hB1CG__AwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAw_$B1B1B1B1B1B1B1B3B3B1BNB1B1_$A6AwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwCGA0_kA0_kA0_$CG_$CG_$CG_$CGA0__AwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwCoCnCrA6CrA6AFA6AFA6CrA6CrCr__AwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw } # tile 513 (T-shirt) { AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAj_wAjA4A$AsA$A$AsA$A$AsA$A4Aj_wAjAwAwAwAwAwAwAwAwAw AwAwAwAwAwAjBxBxBxAjCACACACACACACACACAAjBxBxBxAjAwAwAwAwAwAwAwAw AwAwAwAwAjBxBxBxBxBxAjAYCACACACACAAYAjBxBxBxBxBxAjAwAwAwAwAwAwAw AwAwAwAjBxBxBxBxBxBxBx_wCACACACACA_wBxBxBxBxBxBxBx_wAwAwAwAwAwAw AwAw_wBxBxBxBxBxBxBxBx_3AjAj_wAjAj_3BxBxBxBxBxBxBxBxAjAwAwAwAwAw AwAjBxBxBxBxBxBxBxBxAEBxBxBxBxBxBxBxAEBxBxBxBxBxBxBxBxAjAwAwAwAw AwAwAjBxBxBxBxBxBx_3BxBxBxBxBxBxBxBxBx_3BxBxBxBxBxBx_w____AwAwAw AwAwAw_wBxBxBxBxAEBxBxBxBxBxBxBxBxBxBxBxAEBxBxBxBxAj____AwAwAwAw AwAwAwAwAjAj_wAjBxBxBxBxBxBxBxBxBxBxBxBxBxAjAj_wAj____AwAwAwAwAw AwAwAwAwAwAwAwAjBxBxBxCEAG_IAECEBe_NBe_uBx_w________AwAwAwAwAwAw AwAwAwAwAwAwAw_wBxBxBxBxBxBxBxBxBxBx_3BxBxAj__AwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAjBxBxBx_NBeBxBxBe_IBeBxBxBxAj__AwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAjBxBxBxBxBxBxBxBxBxBxBxBxBx_w__AwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAw_wBxBxCR_NBpBxBxCR_NAGBeBxBxAj__AwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAjBxBxBxBxBxBxBxBxBxBxBxBxBxAj__AwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAw_wBxBxBxBxBxBxBxBxBxBxBxBxBx_w__AwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAjBxBxBxBxBxBxBxBxBxBxBxBxBxAj__AwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAjBxBxBxBxBxBxBxBxBxBxBxBxBxAj__AwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAw_wAj_wAjAj_wAjAjAj_wAjAj_wAj_w__AwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAw______________________________AwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw } # tile 517 (hooded cloak / dwarvish cloak) { AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwCjBX_bAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwBXCjBsBsBs_m_bAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwBsBsBsBs_mBXBXBXAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwCjBsBsBnA6A6BX_mBX_bAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwBsBsBsA6______A6BX_m_bAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwBsBsA6A6____A6__A6BXBXBwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwBsBsCj__A6______A6BX_m_bAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwBXBsBsA6____A6____BX_bAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwBsBsBsA6______A6_m_bAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwBX_mBXBsA6__A6BXBXBwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAw_mBXAuA6_mBXCjA6BX_m_dCrA6_bAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwBXBXCjBsBsBf__A6_dBXAu_b_bA6_bAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAw_mBsBsBsBsBsCj__A6_dBfBX_m_bBw_bAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwBXBsBsBsBsBsBsCfBs_m___d_dBX_mBX_b_bAwAwAwAwAwAwAwAw AwAwAwAwAwAw_m_8BsBsBsBsBsBsCjBX__A6_mBXBX_m_C_bAwAwAwAwAwAwAwAw AwAwAwAwAwAwBX_mBsBs_RBsBsBsBsBXA6____BX_mBXBXBX_iAwAwAwAwAwAwAw AwAwAwAwAwAw_mBXBsBsBsBsBsBsBs_m____A6A6BXBX_mBX_bAwAwAwAwAwAwAw AwAwAwAwAwAwBXBsBsBsBsBsBsBs_RBXA6______A6BXBw_m_b_bAwAwAwAwAwAw AwAwAwAwAwAw_mBsBsBsBsBsBsBsCjCjBX____A6___mBX_b_C_b__AwAwAwAwAw AwAwAwAwAwBXBsBsBs_RBsBsBsBsBsBsBXA6______BX_mBX_m_bA6AwAwAwAwAw AwAwAwAwAw_mBsBsBsCjBsBs_RBsBsBsBXA6__A6__A6BX_mBX_b__AwAwAwAwAw AwAwAwAwBXBs_mBsBsBsBsBsBsBsBs_mBXA6________BXBX_mBwA6AwAwAwAwAw AwAwAwAwBX_mBs_RBsBsBsBsBsBsBsBsBXA6____A6___mBwBX_b_bAwAwAwAwAw AwAwAwAwBXBsBsBsBsBsBsBs_eBsBs_8_m____A6______BX_bBwBoCnAwAwAwAw AwAwAwAwBsBsBsBsBsBsBsBs_8_CBsCjBXA6________A6A6_m_b_b__AwAwAwAw AwAwAwCjBsBsBsBsBsBsBsBs_CBXBsBsA6____A6________BX_mBwA6AwAwAwAw AwAwAwBXBsBsBsBs_RBsBsAk_CBsBsBX__A6________A6A6BX_b_b__AwAwAwAw AwAwAwA6A6Bs_8_mBsBs_eAkBwCjBXA6A6____A6______BXBXCFA6A6AwAwAwAw AwAwAwAwA6A6CrA6_mBXAx_CCjBXA6A6__A6______A3Bw_b__Cn__AwAwAwAwAw AwAwAwAwAwAwAw____A6__AJ__A6___________bA6__A3A6A6__AwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwA6________A6____A6A6______AwAwAwAwAwAwAwAwAw } # tile 518 (slippery cloak / oilskin cloak) { AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAw_T_TAJAwAwAwAwAwAwAwAwAJ_T_TAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAw_TCQ_TAJ__AwAwAwAwAJ___T_T_5AJAJAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAw_5_T_TAJ__AJAJ__AJ_T_T_5AJAJ__AwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAw_T_TAJAJ__AJAJ_T_5_5AJAJ__AwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAw_5_TAJAJ__AJ_T_TAJ__AJAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAw_5_TAJAJAJ_5AJ__AJAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwBOAyCQ__AJ_TAyAJAJ__AJAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAw_5_TBOAyAJ__AyBOAJ__AJAJ__AwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAw_5_T_T_5BOAJAJBOAJAJAJAJ__AJAJAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAw_5_5_5CQ_5AR__AJBOAJ__AJ__AJ__AJ__AwAwAwAwAwAwAw AwAwAwAwAwAwAw_5_T_5CQ_T_5BOAJAJBO_5AJAJ__AJAJ__AJAJAwAwAwAwAwAw AwAwAwAwAwAw_5_5_T_T_T_TAJBOAJAJBOCQ__AJAJ__AJAJ__AJAwAwAwAwAwAw AwAwAwAwAw_T_5CQ_TCQ_T_5AJAJ__AJAJ_T__AJ__AJAJ__AJ__AJAwAwAwAwAw AwAwAwAwAw_5_5_TCQ_T_T_T__AJAJ__AJ_5_T__AJ__AJAJ__AJ__AwAwAwAwAw AwAwAwAw_5_5_T_T_TCQ_T_5__AJ__AJAJAJ_5AJ__AJAJ__AJAJAJAwAwAwAwAw AwAwAwAw_5_T_T_TCQ_T_5A5AJ__AJ__AJ___T_T__AJ__AJ__AJ__AJAwAwAwAw AwAwAwAw_5_5CQ_T_T_T_T__AJAJ__AJAJAJAJ_5__AJAJ__AJAJ__AJAwAwAwAw AwAwAwAw_5_T_T_TCQ_T_5AJAJ__AJ__AJ__AJ_TAJAJ__AJAJ__AJAJAwAwAwAw AwAwAwAw_5_5CQ_T_TCQ_5AJ__AJAJAJ__AJAJ_5AJ__AJAJ__AJAJ__AwAwAwAw AwAwAwAw_5_T_T_TCQ_T_5AJAJ__AJ__AJAJ__AJ_5AJAJ__AJ__AJAJAwAwAwAw AwAwAwAwAw_5CQ_T_T_5AJAJ__AJ__AJAJ__AJAJ_5AJ__AJ__AJAJ__AwAwAwAw AwAwAwAwAwAw_5_TCQ_5AJ__AJAJAJ__AJAJ__AJAJ_5AJAJAJ__AJAwAwAwAwAw AwAwAwAwAwAwAw_T_T_5AJAJ__AJ__AJ__AJAJ__AJ_5AJ__AJ__AJAwAwAwAwAw AwAwAwAwAwAwAw___5_T__AJAJ__AJAJ__AJ__AJAJ_5AJAJ__AJAwAwAwAwAwAw AwAwAwAwAwAwAwAwAJ_5AJ__AJAwAwAwAwAwAwAJAJ_TAJ__AJAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAJAJ__AwAwAwAwAwAwAwAw__AJ_5AJAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAJAwAwAwAwAwAwAwAwAwAwAJAJAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw } # tile 521 (tattered cape / cloak of protection) { AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwBRAwAwAwAwAwAwBvAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwApAKBRBRAwBvAKCDBRBRAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwBJAKBRBvBcApBwBRBRAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAmAD_lBRBRAKAAByBvBRBRAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAw_IBgAmADBRBRAQAzBv_iBvBRBRAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwBJ_I_l_IAmBRBRAeBy_iBvByCDBRBRAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAw_IApBJAKApAABRBRADBvBcBvBwBv_iBRBRAwAwAwAwAwAwAw AwAwAwAwAwAwAwApBJ_I_lAKBwADBRBRAQ_IBvBv_iByBvBRBRAwAwAwAwAwAwAw AwAwAwAwAwAwAw_IApBJAKApBRAABRBRADAKBv_iBvBv_iBvBRBRAwAwAwAwAwAw AwAwAwAwAwAwAw_IBJApAK_IBRADBRBRAOAKBvBcBwByBvCDBRBRAwAwAwAwAwAw AwAwAwAwAwAw_IApAKAK_lBJBRBRBRBRBR_IApBcBvBv_iBc_iBRAwAwAwAwAwAw AwAwAwAwAwAwBJAwAz_lAK_IBRBRBRBvBvBRBJBcBv_iBcCDBvBRAwAwAwAwAwAw AwAwAwAwAw_IApAwAKBJApBJ_iBRCDBvBcBRAKApBcBvBvBwCDBRBRAwAwAwAwAw AwAwAwAwAwBJAw_I_lAKBR_IBRBRBv_iBc_cBR_IBv_iBvByBvBRBRAwAwAwAwAw AwAwAwAwAwAw_IApAKAKBRApBRBRByBvBvBJBRAKBvBcBv_iBvBRBRAwAwAwAwAw AwAwAwAwAwApBJAKBgBRBJ_IBRBwBvBc_cBc_cBJBvCDBRBwCDBRBRAwAwAwAwAw AwAwAwAwAw_IApAKAKAKApBRBRBvAwBvAwBJ_cBRAKBvBvBRByBRBRAwAwAwAwAw AwAwAwAwAwBJBJ_lAKApBJBRBv_iAwBcAw_cBJBRBJBvBcBRBRAwBRAwAwAwAwAw AwAwAwAwAwAw_IAwAKBJBRBRBvBRBRBRBRBRBR_cBR_IBv_iBvBRAwAwAwAwAwAw AwAwAwAwAwAwAwBRAKApAkBRBRBRBRBRBRBRBRBRBR_cBcBvCDBRAwAwAwAwAwAw AwAwAwAwAwAwAwBRApBJBRBRBRAkAwBRAwBRBRBRBR_IBwBvBRBRAwAwAwAwAwAw AwAwAwAwAwAwAwAwBRAKBRBRBRAwAwAwAwAwAwBRBRAKBvBRBRAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwBRBRBRAwAwAwAwAwAwAwAwBRBRBJAkAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwBRAwAwAwAwAwAwAwAwAwAwBRBRAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw } # tile 523 (ornamental cope / cloak of magic resistance) { AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwBJBPBJBPBJAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwBJBCAeBCAeBCBJAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwBJBCAeASByASByBvBgCDCTAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwBJBCAeASCfCfCfCf_OBJCDCfCTAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwBJBCAeCDCcCcCT_OCTCDBJBv_OCDCTAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwBPAeBCByCfCTCcCcBvBJBgBJBgCHCfAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwBgAeAeCDBfCTBfBcBvBcBgBgBJCDCfCTAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwBgAeASCfCTCTBvBvBgBJ_cCDBfCfCTAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwBJBCAeCDCH_OBvBcBcBgCHCfCfCfCTAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwBPAeBCBy_OCTBJBgApBJCDCfCfCfCTAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwBgAeAeBCAeCDCTBvBgBJBgBJCDCcAnCTAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwBJAeBCAeAeBCASCb_OBJBgBJBgBgCHBfCTAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwBPAeBCAzBCAeAeCDCT_OBgBJBgBJ_OCfCTCTAwAwAwAwAwAwAw AwAwAwAwAwAwAwBJBCAeBCAeBCAeBCByCc_OBgBJBgCDCfCfCfAwAwAwAwAwAwAw AwAwAwAwAwAwBJBCAeBCAeAzAeBCAeAeCDCT_OBJBgBJCTBfCfAwAwAwAwAwAwAw AwAwAwAwAwBJBCAeAe_lAeBCAeBCAeBCASCHCc_OBgBJBgCDCfAwAwAwAwAwAwAw AwAwAwAwAwBPAeAeBCAeBCAe_lAeBCAeAeCDCfByBgBJBgCHCfCTAwAwAwAwAwAw AwAwAwAwAwBJBCAeBCAeAeBCAeAeBCAeBCASCfCTBJBgBJASCfCTAwAwAwAwAwAw AwAwAwAwAwApAeBCAzAeBCAeAeBCAeBCAeAeCDCTASBJBgCTCfCTAwAwAwAwAwAw AwAwAwAwAwBJBCAeBCAeBCAeBCAeAzBCAeBCAeCDCf_OBgByCf_OAwAwAwAwAwAw AwAwAwAwAwAzBCAeAe_lAeAe_lAeBCAeAeBCAeCDCfCDBJ_OCfCTAwAwAwAwAwAw AwAwAwAwAwBgAeBCAeBCAeBCAeBCAe_lAeBCAeASCfCTBgCDCfCTAwAwAwAwAwAw AwAwAwAwAwApAeAeBCAeAeBCAeAeBCAeAeBCAeCDCfCDBJCHCfCTAwAwAwAwAwAw AwAwAwAwAwBJBCAeBCAeBCAeBCAeAeBCAeBCAeASCf_OBgCDCf_OAwAwAwAwAwAw AwAwAwAwAwBPAeAe_lAeAe_lAeBCAe_lAeBCAeCDCfCDBJ_OCfCTAwAwAwAwAwAw AwAwAwAwAwBJBCAeBCAeBCAeAeBCAeAeBCAeBCAGCfCTBgCHCcCTAwAwAwAwAwAw AwAwAwAwAwBvAGBCAeAeBCAeBCAeBCAeBCAeAeCDCfCH_OCTCfAwAwAwAwAwAwAw AwAwAwAwAwCTCfASAeBCAeBCAeAzBCAeAzBCAeASCfCfCfCfCfAwAwAwAwAwAwAw AwAwAwAwAwAwCTCDCDASASByASASASASASASCDCTCfCfCfCcAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwCTAnCfCfCfCcCf_1CcCfCfCfCfCfCfAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwCfCfCfCfCfCfCfCfCfCfCfAwAwAwAwAwAwAwAwAwAwAwAw } # tile 549 (clay / increase accuracy) { AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwADAE_QAKADCmAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAw_QAD_3ADAKAD_QADAK_QAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAKCMAD_QAEAD_Q_Q_IAK_I_IAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAw_QAA_I_ICR_I_I_I_IBe_I_IAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAw_I_I_I_IAwAwAwAwAwAwBeBABeBeAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwCR_NAwAwAwAwAwAwAwAwAwAwASCmAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwCRASCEAwAwAwAwAwAwAwAw_N_QCRAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwA5BeAGAK_____________QASBe____AwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAw____Cm_QASCr_______N_QCm________AwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAw______BeBe________BeBe________AwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAw__________________________AwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAw__________________AwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw } # tile 565 (twisted / free action) { AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwCYCYCYCYCYCYAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwCYCY_x_x_x_x_x_x_x_xAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwCY_x_x_SCN_S_S_S_x_x_x_xAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwCY_x_S_S_S_S_S_S_SCNCY_x_x_SAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwCY_x_SCN_SBLAwAwAwAwAwAwCY_x_S_SAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwCY_x_S_S_SAwAwAwAwAwAwAwCY_x_x_S_SAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwCY_x_SBLAwAwAwAwAwAwAwAwAwCY_x_x_S_SAwAwAwAwAwAw AwAwAwAwAwAwAwAwCY_x_S_SAwAwAwAwAwAwAwAwAwAwCY_x_S_SAwAwAwAwAwAw AwAwAwAwAwAwAwAwCY_xCN_SAwAwAwAwAwAwAwAwAwAwCY_xCN_SAwAwAwAwAwAw AwAwAwAwAwAwAwAwCY_x_S_SAwAwAwAwAwAwAwAwAwCY_x_xBL_SAwAwAwAwAwAw AwAwAwAwAwAwAwAwCY_x_S_S_S_S_SCYCYCYCYCYCY_x_xCN_SAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwCY_x_xBL_S_SCY_x_x_x_x_x_x_x_S_SAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwCY_xCYCYCY_x_xCN_S_SCN_S_S_SAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwCN_x_x_x_x_x_S_S_S_S_S_S_SAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAw_S_SCN_SCN_SCNBL_SAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAw_SBL_S_SAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw } # tile 566 (steel / slow digestion) { AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwBxBxAMAtAtBKAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAtAM_3BxAMAtAjBUBKBtAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwBKAtAEBxBxAMAtAtBKBKBtBtAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwBtBKAtAM_3BxAMAjAtBUBKBtBhCLAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwBtBKAtAMAwAwAwAwAwAwBKBtBtB$AwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwBtBKAwAwAwAwAwAwAwAwAwAwBtCLAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwBtCbCbCbAwAwAwAwAwAwCLCbCbCL__AwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwBtCbCiCbCLB$BtBtBtB$CLCbCbB$____AwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAw__CbCbCbCLCLBhBtBhCLCLCbCi______AwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAw____CbCbCLB$BtBtBtB$CLCb________AwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAw________CLCLBhBtBtCL__________AwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAw__________________________AwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAw__________________AwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw } # tile 580 (concave / amulet of unchanging) { AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwC_C_C_C_C_C_AwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwC_C_AFA6AFA6__AFC_C_AwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwC_C_A3__AwAwAwAwAwAwAwAwC___AwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwC___AJAwAwAwAwAwAwAwAwAwAwC_CiAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwB0__AwAwAwAwAwAwAwAwAwAwAwAwAwC___AwAwAwAwAw AwAwAwAwAwAwAwAwAwAwC___AwAwAwAwAwAwAwAwAwAwAwAwAwC___AwAwAwAwAw AwAwAwAwAwAwAwAwAwC_CrAwAwAwC_C_C_C_AwAwAwAwAwAwAwAwB0__AwAwAwAw AwAwAwAwAwAwAwAwAwC_CnAwAwC_AFA6AF__C_AwAwAwAwAwAwAwC___AwAwAwAw AwAwAwAwAwAwAwAwC___AwAwAwC___AwAwAw__C_AwAwAwAwAwAwB0__AwAwAwAw AwAwAwAwAwAwAwAwC_AFAwAwC_A3AwAwAwAwAw__B0AwAwAwAwAwC___AwAwAwAw AwAwAwAwAwAwAwAwC___AwAwC___AwAwAwAwAw__C_AwAwAwAwAwB0__AwAwAwAw AwAwAwAwAwAwAwAwC_A3AwAwC_AFAwAwAwAwAwAwAwC_AwAwAwAwC_CrAwAwAwAw AwAwAwAwAwAwAwAwC___AwAwB0__AwAwAwAwAwAwAwB0__AwAwAwC___AwAwAwAw AwAwAwAwAwAwAwAwC_AFAwAwC___AwAwAwAwAwAwAwC___AwAwAwC_CiAwAwAwAw AwAwAwAwAwAwAwAwAwC___AwC___AwAwAwAwAwAwAwB0__AwAwAwC___AwAwAwAw AwAwAwAwAwAwAwAwAwC_A3AwC_CiAwAwAwAwAwAwAwC_CrAwAwAwC___AwAwAwAw AwAwAwAwAwAwAwAwAwB0__C_Aw__AwAwAwAwAwAwAwC___AwAwAwB0__AwAwAwAw AwAwAwAwAwAwAwAwAwC___B0Aw__AwAwAwAwAwAwAwC_CiAwAwC___AwAwAwAwAw AwAwAwAwAwAwAwAwAwAwC_C_Aw__AwAwAwAwAwAwAwAwC___AwB0__AwAwAwAwAw AwAwAwAwAwAwAwAwAwAwBKBKBKAwAwAwAwAwAwAwAwAwC___AwC_CrAwAwAwAwAw AwAwAwAwAwAwAwAwBhBhB$B$BKBKAtAwAwAwAwAwAwAwAwB0C___AwAwAwAwAwAw AwAwAwAwAwAwAwBhBUCbCLB$BhBKAtAY__AwAwAwAwAwAw__CrAwAwAwAwAwAwAw AwAwAwAwAwAwAwBhCb__CbBtBhBKAjAY______AwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwBKB$CLCbCbB$BhBKAtAY_3______AwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwBKB$B$B$B$BUBKAtAYAYAE__Ci__AwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwBKBKBUBhBhBKBKAtAYAE_3______AwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwBKBKBKBKAtAtAYAYAE____Ci__AwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAtAtAjAtAYAYAY_3AE______AwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAYAYAYAY_3AEAE__A6AFAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwBxAEAEAE__Ci____AwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAw____Ci____AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw } # tile 592 (key / skeleton key) { AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAYAYAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAYAtAtAt__AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAYAtAtAt__AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAYAYAtBUBUAt__AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAYAtAtBU____AYAYAMAYAYAYAMAYAYAYAMAYAYAYAMAYAYAYA$__AwAwAw AwAwAwBUAtAtBU____AMAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtAtBU__AwAwAw AwAwAw__BUBUAtAYAYAtBUBUBUBUBUBUBUBUBUAYAtBtAMAtBtAMAtBU__AwAwAw AwAwAw______BUAtAtBU__________________AYAt__BUBU__AYAtBU__AwAwAw AwAwAwAwAw__BUAtAtBU__AwAwAwAwAwAwAw__AMAt________AYAtBU__AwAwAw AwAwAwAwAwAw__BUBU____AwAwAwAwAwAwAw______________________AwAwAw AwAwAwAwAwAw________AwAwAwAwAwAwAwAwAwAw____AwAw________AwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw } # tile 593 (lock pick) { AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwCKAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwA4____AwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwA4CK__AwAwAwAwAwAw AwAwAwCeCeCICICICIAwAwAwAwAwAwAwAwAwAwAwAwAwA4A4____AwAwAwAwAwAw AwAwCeCICICICICICIBoA4A4A4A4A4A4A4A4A4A4A4A4A4CK__AwAwAwAwAwAwAw AwAwAwCeCIBoBoBoBoBoA4A4A4A4A4A4A4A4A4A4A4CKCK____AwAwAwAwAwAwAw AwAwAwAw________________________________________AwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw } # tile 612 (figurine) { AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwBkBk_gAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwCGBkAwAwAwCYBG_xBl_gAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwCGBWAwAwCGCGBkBkBk_gAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwBG_xAwAwAwA0CGBW_xBl_gAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwCG_x_xAwAwAwBk_g_xA1Bk_gAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwA0BkAwAwAwAwCGBlBkBkB9_gAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwBkBk_xAwAw_xBkBlAwAwAwAwAwAwCGCGCGAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAw_xBW_xCGBGBkBkAwAwAwAwAwAwA0CGBWAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAw_g_xBGCYCG_WBkAwAwAwCGCGCG_x_P_xAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAw_PCGCGA0CGCGBlCGCGBkBlAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwBkCG_PCGCGBW_gB9A1_gA6AwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwBl_gBkBGBk_g_gAwAwAF__Aw______AwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwCG_xBW_g_gB9AwAwAw______________AwAwAwAwAwAwAw AwAwAwAwAwAwAwAw_xA0CG_xBL_g__AwAwAw____________AwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwCGCGBB_xB9_gAJAw______________AwAwAw__AwAwAwAwAw AwAwAwAwAwAwAwBkBW_xBW_x_xBl_g_gBLBL__________________AwAwAwAwAw AwAwAwAwAwAwAw_g_g_xBkBWBk_gBkB9_gB9BL__________AwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwBkBWBk_gBkBlBkB9_gBL_S________AwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwBLBk_gBlBk_g_g_gCNBLBL______AwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAw_gB9_g_gB9_gB9_SBLCN_S____AwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAw_gB9_g_gB9_g_g_gBLCNBL______AwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAw_SBLCNBL_SBLCN____________AwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAw______AwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw } # tile 638 (meatball) { AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAw_NBOCQBOAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAHARBOCEBOARCQCQAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwARA2CEARCE_N_NARBOBO_dAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAHAH_cA7_cBOCQ_NBOCQ_5__AuAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwBOBeCEBA_N_FCEBOBOBOCQCQ__AuAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwARAHBOCEBOCEA2BOAHBOBO_TBu__AuAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwCE_NBOCE_FBOBOAGCEBOBO_5Bu___ZAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwBOARBOBOCQBeBABABeCECQ_T_____dAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAw_NCQBOCEBOAHCE_cBOBO_T_Z__AuAuAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAw_TBO_NCE_TCEA2BO_T_T__Ck_Z_dAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAuBfCQ_TCQ_5_T_zAJ_ZCkCkAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwBuAuAuAuAuBu___Z_dCkAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAw_ZAuAuAu_Z_dAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw } # tile 640 (huge chunk of meat) { AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAw_F_FAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwBOBOBOBO_F_r_r_r_rAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwARBABOBOBOBA_T_TCQCE_F_rCEAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwARBA_cARBABO_TAHBOBOARBABO_rCQ_TBOCQAwAwAwAwAwAwAwAw AwAwAwAwAwCEAHApAHAHApAg_cARBOBO_NAH_c_TCQBACEAuCQAwAwAwAwAwAwAw AwAwAwAwBA_cAHAgApAgApAHAHBA_cBAARAR_TBABAAHBOBOBOBOAwAwAwAwAwAw AwAwAwAwARAHApAHAgAHAH_cAgARAH_T_IARBAApAR_cAHBOBO_N______AwAwAw AwAwAwAH_IARAgARAKAgApAHAH_FApBOBOAHARBOBAAHARBOBOCEArBO________ AwAwCE_TARApAKAgApBACEBA_cBAAHBAASBOBOBABO_cAHAR_TBOCQBO________ AwAwAH_cAHAHAg_cAHBOApAHBO_TAR_FBABOARBOBOBA_cBOBA_TBOBO________ AwAwAHARAR_cAHAHAH_cAHARBOBACQ_cBABA_cBAARBOAHARBOBOBO_T________ Aw_r_cAHBABOAR_cBAAHARBAApBOBOAHBOBOBA_T_cAHBO_T_OBOAu_TCE______ AwB4BOARBO_TBAAR_rBABAARBAAH_cARAHASBOBAARBACQBOBABO_T_T________ AwAwCEARBA_cAHBOAHB6BOAH_cBAARBABAARBA_FA2_cBOBOCEBO_5_T________ AwAwBOBOBOBOAR_cAHARBAARARBA_c_TBOBOBOBOBOBOBOBOBO_T_T__________ AwAwAwCQBOBOBOAH_cBAARB6ARCEAHBOAH_cBABOBOBABO_T_T_T_T________Aw AwAwAw_T_TBOBOBOARAHBOAH_TBOBOBOBOBOBOBOBO_T_T_T_T_5__________Aw AwAwAw_T_T_TBOBOBOBOBO_cBABOASBOBOBO_TBO_T_T_T_TAuAr_______T_TAw AwAw_TBO_T_T_T_T_T_TBOBOBOBOBOBO_T_T_T_T_TCQ_TAu_Z_______T_T_5Aw Aw_T_TBO_T_TAuArAu_T_T_T_T_T_T_T_T_T_T_TAuAuAuAu_______T_T_T_T_5 Aw_TBOBO_T_T_T_TAuAuAuAuAuAuArAuAuAuAuAuAuAuA6_____T_T_T_T_T_T_5 Aw_TBO_T_T_T_T_T____AuAuAuAuAuAuAuAuAu__A6_______T_T_T_T_5_5_5Aw Aw_TBO_T_T_T_T_T_T_T_________________________T_T_T_T_T_5AwAwAwAw Aw_T_T_T_T_T_T_T_T_T_T_T_T_T_T_T_T_T_T_T_T_T_T_T_T_T_5AwAwAwAwAw AwAw_T_T_T_T_T_T_T_T_T_T_T_5_5_5_5_5_T_T_T_T_T_T_T_T_5AwAwAwAwAw AwAwAw_T_T_T_T_T_T_T_T_5_5AwAwAwAwAw_5_T_T_T_T_T_T_5_5AwAwAwAwAw AwAwAwAw_5_5_5_5_5_5_5AwAwAwAwAwAwAwAw_5_5_5_5_5_5AuAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw } # tile 655 (candy bar) { AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw_FAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw_n_FAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw_F_r_E_FAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwB4_a_r_E_F_nA6AwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwB4AdA2AGAvAvA2_r_FAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwA2_oA2A2A2_2AIA2AI_F_E__AwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw_FA2AGA2AvAGA2AIAv_IAvB4_F_F__Aw AwAwAwAwAwAwAwAwAwAwAwAwAwAwA2_aA2AG_AAvAIAv_2A2_2Av_o_2AG_r_o__ AwAwAwAwAwAwAwAwAwAwAwAwA2_aA2AG_FA2AGAvA2AG_2BeAvAI_F_a_r_r_F__ AwAwAwAwAwAwAwAwAwAwA2A2AGA2B4_2C_B4B4_2AI_FB4AvA2_2AG_F_F_E_FA6 AwAwAwAwAwAwAwAwA2B4AG_aB4A2C_Av_NAIAvAG_2B4_2AG_F_E_r_z_o_F____ AwAwAwAwAwAwA2_aA2AGB4A2AIAvA7C_A2_F_2_aA2AIA2_o_F_r_r_rA6____Aw AwAwAwAwA2A2AGA2_a_2AIB4AGAPAG_2B4A7AI_F_N_F_E_r_r_E_r____AwAwAw Aw_F_F_FAG_AAvAI_2_F_2_2AvC_AvBeAPAICEAG_F_r_r_r_r______AwAwAwAw _o_F_o_FA2AG_2AvAG_FBe_2AGA2APA2B4_F_F_rBM_r_rA6____AwAwAwAwAwAw _FBV_F_FAIB4AvC__2B4_F_2AI_FAG_F_E_r_E_r_rA6____AwAwAwAwAwAwAwAw _F_FBe_FA2AvAG_2B4B4AGB4B4_F_r_r_r_r_r______AwAwAwAwAwAwAwAwAwAw ___F_FB4AIA7_FBeAPC_B4_o_E_r_r_E_rA6____AwAwAwAwAwAwAwAwAwAwAwAw ___o_rAGB4_2_o_FB4_F_r_r_r_r_r______AwAwAwAwAwAwAwAwAwAwAwAwAwAw ___F_r_n_EAvB4AG_F_E_r_r_E______AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw Aw___E_F_r_F_o_r_r_r_r______AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw Aw___F_E_r_o_z_r_E______AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAw___r_o_F_r______AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAw_____F_E____AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAw________AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw } # tile 679 (smoky / object detection) { AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAw_F_F_FAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAt_F_F_FAYAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwBxAM_r_r_rAYAtAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwBxAYAYAYAtAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwA$AMAMAMA$AwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwA$AM_3AYA$AwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAjAM_3AEA$AwAwAwAwAwAwAwAw______AwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAjAE_3AMA$AwAwAwAwAwAwAw__________AwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAj_3AEAMA$AwAwAwAwAwAw____________AwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAj_3AEAMA$AwAwAwAwAw____________AwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAjAYBxAMAYAwAwAw______________AwAwAwAwAw AwAwAwAwAwAwAwAwAwAwBKAMAMAYAE_3AYBUBU______________AwAwAwAwAwAw AwAwAwAwAwAwAwAwAwBKAMBxBxAYAY_3AMAYAYBU__________AwAwAwAwAwAwAw AwAwAwAwAwAwAwAwBKAM_3BxBx_3AYBxAMAMAYAtBU________AwAwAwAwAwAwAw AwAwAwAwAwAwAwBKAMAMAE_3_3AEAYAE_3AMAEAEAEBU______AwAwAwAwAwAwAw AwAwAwAwAwAwAwBKAEAEAMAEAEAMAYAEAMAE_3AEAEBU____AwAwAwAwAwAwAwAw AwAwAwAwAwAwAwBKAEAM_3AEAYAY_3AMAMAMAM_3AEBU____AwAwAwAwAwAwAwAw AwAwAwAwAwAwAwBKAEAMAEAYAYAEAMAM_3AEAEAEAEBU____AwAwAwAwAwAwAwAw AwAwAwAwAwAwAwBKAEAMAMAYAEBxAM_3_3AEAEAMAEBU____AwAwAwAwAwAwAwAw AwAwAwAwAwAwAwBKAE_3AMAYAE_3AM_3AEAMAMAMAEBU__AwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAw__BKAEAMAYAE_3AMAMAEAEAMAEBU____AwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAw__BKAEAEAEAYAY_3AM_3_3AEAEBU____AwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAw____A$AEAEAEAEAYAMAM_3_3BU____AwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAw____A$A$AEAEAYAYAMBUBU____AwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAw______BUBUBUBUBU______AwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAw______________AwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw } # tile 759 (glass / light) { AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw_hCeAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw_4CeAwCeAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw_hCeAwAwCeAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw_4_hAwAwCe__AwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw_hCeAwAwCe__AwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwBN_hAwAwCe__AwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw_h_hAwAwCe__AwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw_4CeAwAwCe__AwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw_hCeAwAwCe__AwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw_4_hAwAwCe__AwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw_hCeAwAwCe__AwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwBN_hAwAwCe__AwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAw_h_hAwAwCe__AwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAw_4CeAwAwCe__AwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAw_hCeAwAwCe__AwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAw_4_hAwAwCe__AwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAw_hCeAwAwCe__AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwBN_hAwAwCe__AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAw_h_hAwAwCe__AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAw_4CeAwAwCe__AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAw_hCeAwAwCe__AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAw_4_hAwAwCe__AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAw_hCeAwCeCe__AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwCe_hAwCe__AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwCeCeAJAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAF__AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw } # tile 761 (crystal / enlightenment) { AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAjA$AwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAYAEAEBKAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAYAEAEAwA$AwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAYA$AEAwA$__AwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAYAYAEAEAwA$__AwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAYAwA$AEA$BKA$AwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAYAwA$AEA$AwA$__AwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAYAwA$AEA$AwAt__AwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAYAwAEAEA$BKA$__AwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAYAwAEAEA$BKA$__AwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAYAwAEAMA$BKAwA$__AwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAYAYAwAYAMAjAtAwA$__AwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAYAYAwAjAEAwA$AwA$____AwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAYAYAwAjAMAwA$BKA$BK__AwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAYAjAwAjAMAwAjA$AwAt____AwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAYAwAYAwAEAwA$A$AwA$____AwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAYAwAYAwAMAwA$AwAwA$____AwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAYAwAjAwAEAwA$AwAjAtBK__AwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAYAEAMAEAMAYAjAwA$A$BK____AwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAYAEA$AwA$AEAwA$AwAtA$____AwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAjAwAwAjAwA$AEAwA$A$____AwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAYAwAjAtAjA$AwA$AYA$BK____AwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwBKAwAjAwA$AjA$AwA$BK____AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwBKAtAjAwA$AwA$AtBK______AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwBKAwA$AjAwAjA$AwBK____AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwBKA$AwBKAwBKBK____AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwBKBKBKBKBK____AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAw__________AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw } ��������������������������������slashem-0.0.7E7F3/win/share/mon3dmi.txt�������������������������������������������������������������0000664�0000764�0000764�00000314435�10545462320�015666� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������__ = (0, 0, 0) _A = (128, 96, 0) _B = (128, 255, 128) _C = (0, 0, 192) _D = (128, 64, 0) _E = (32, 64, 64) _F = (0, 112, 224) _G = (192, 96, 96) _H = (48, 96, 0) _I = (117, 105, 88) _J = (224, 192, 160) _K = (128, 32, 0) _L = (64, 128, 128) _M = (0, 64, 32) _N = (128, 0, 0) _O = (242, 0, 0) _P = (128, 90, 72) _Q = (48, 24, 0) _R = (128, 112, 32) _S = (0, 0, 224) _T = (224, 224, 0) _U = (0, 128, 64) _V = (144, 135, 110) _W = (210, 210, 178) _X = (96, 72, 0) _Y = (104, 84, 31) _Z = (224, 168, 0) _a = (96, 48, 0) _b = (248, 224, 96) _c = (144, 192, 192) _d = (0, 192, 96) _e = (0, 32, 64) _f = (96, 24, 0) _g = (128, 128, 64) _h = (96, 16, 0) _i = (224, 112, 0) _j = (72, 108, 108) _k = (240, 240, 240) _l = (0, 48, 24) _m = (128, 255, 255) _n = (96, 0, 0) _o = (128, 255, 0) _p = (0, 0, 64) _q = (144, 144, 192) _r = (0, 24, 24) _s = (224, 224, 224) _t = (128, 64, 64) _u = (112, 160, 160) _v = (16, 0, 0) _w = (224, 112, 112) _x = (0, 96, 96) _y = (208, 208, 208) _z = (64, 128, 0) _0 = (144, 72, 0) _1 = (255, 128, 0) _2 = (224, 168, 224) _3 = (224, 0, 0) _4 = (192, 192, 0) _5 = (0, 48, 96) _6 = (192, 192, 192) _7 = (128, 128, 96) _8 = (112, 224, 0) _9 = (224, 112, 224) _$ = (48, 48, 24) A_ = (64, 48, 0) AA = (192, 144, 0) AB = (0, 0, 96) AC = (128, 96, 96) AD = (192, 144, 192) AE = (48, 24, 24) AF = (64, 32, 0) AG = (0, 128, 128) AH = (64, 16, 0) AI = (144, 192, 144) AJ = (64, 0, 0) AK = (192, 96, 0) AL = (255, 0, 0) AM = (192, 96, 192) AN = (112, 224, 112) AO = (48, 96, 96) AP = (0, 16, 16) AQ = (120, 160, 160) AR = (0, 0, 16) AS = (160, 120, 160) AT = (144, 144, 144) AU = (0, 64, 128) AV = (192, 48, 0) AW = (80, 160, 160) AX = (224, 0, 224) AY = (120, 160, 120) AZ = (120, 120, 160) Aa = (160, 160, 80) Ab = (160, 120, 120) Ac = (160, 80, 160) Ad = (128, 128, 128) Ae = (0, 96, 48) Af = (64, 64, 32) Ag = (112, 224, 224) Ah = (192, 0, 0) Ai = (192, 0, 192) Aj = (0, 0, 128) Ak = (71, 108, 108) Al = (128, 96, 128) Am = (112, 112, 112) An = (80, 160, 80) Ao = (80, 80, 160) Ap = (192, 192, 144) Aq = (32, 64, 0) Ar = (128, 64, 128) As = (160, 160, 0) At = (160, 80, 80) Au = (160, 0, 160) Av = (0, 24, 48) Aw = (252, 252, 153) Ax = (32, 32, 0) Ay = (0, 160, 80) Az = (64, 128, 64) A0 = (160, 120, 0) A1 = (0, 0, 48) A2 = (0, 80, 160) A3 = (192, 144, 144) A4 = (80, 160, 0) A5 = (80, 80, 80) A6 = (32, 0, 0) A7 = (128, 0, 128) A8 = (202, 144, 114) A9 = (255, 255, 255) A$ = (242, 196, 77) B_ = (208, 168, 80) BA = (160, 80, 0) BB = (64, 64, 64) BC = (192, 160, 64) BD = (218, 218, 182) BE = (224, 224, 168) BF = (96, 0, 96) BG = (160, 40, 0) BH = (0, 0, 160) BI = (0, 224, 112) BJ = (0, 128, 255) BK = (48, 48, 48) BL = (229, 162, 130) BM = (192, 255, 255) BN = (160, 0, 0) BO = (224, 168, 168) BP = (64, 0, 64) BQ = (192, 255, 192) BR = (0, 255, 128) BS = (0, 96, 192) BT = (32, 32, 32) BU = (32, 0, 32) BV = (192, 192, 96) BW = (128, 128, 0) BX = (0, 24, 0) BY = (0, 16, 0) BZ = (0, 0, 255) Ba = (71, 108, 108) # tile 0 (gray dragon) { AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_y_6ATAmAmA5BK AkAkAkAkAkAkAmAmAmATATAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_y_6ATA5BKBKBKAkAk AkAkAkAkAkAmA5A5AmAmAmATATAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_6AdA5BKBKBKBKAkAkAk AkAkAkAkAkA5BF_sA5A5AmAmAmATATBKA5Am_6_yA5AT_6_yA9A9_6ATAkAkAkAkAkAkAkAkAk_yATA5BKBKBKBKBKAkAkAk AkAkAkAkAkA5_6BFBP_sA5A5AmAmAmATAm__A9Am_6BBA5AT_6_yA9A9_s_6AkAkAkAkAkAk_6AdA5BKBKBKBKBKBKAkAkAk AkAkAkAkAkAkA5_6BFBFBP_sA5AmAmAmATAmA5BKAmBBBBBBA5AkAkAkAk_cATAkAkAkAkAkATA5BKBKBKBKBKBKBKBKAkAk AkAkAkAkAkAkAkA5_6A7BFBPBPA5A5AmAmAmAmAmAmATBBAkAkAkAkAkAkAkAkAkAkAkAk_6BBBKBKBKBKA5AT_y_6ATAmA5 AkAkAkAkAkAkAkAkA5ATA7BFBP_sBPA5A5AmAmAmAmAmATATAkAkAkAkAkAkAkAkAkAkAkAmBKA5Ad_6_6ATAmA5BKBKAkAk AkAkAkAkAkAkAkAkAkAkATA7BFBPBP_sBPA5A5A5AmAmAmATATATAkAkAkAkAkAkAkAk_6AdATAmAmA5BTBKBKBKBKAkAkAk AkAkAkAkAkAkAkAkAkAkAkATA7BFBPBPBP_6_VApA5AmAmAmAT_6ATAkAkAkAkAkAkAkAkA5Am_6A5BKBKBKBKBKBKAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkA3A7BFBPBPATApBEApA5AmAmAT_c_yATAkAkAkAkAkAkAkAkA5BKAT_6A5BKBKBKAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkA5AiAu_sApBEAwBEApAZAmAmATA3_6ATAkAkAkAkAkAkAkAkA5BKBBATA5BKBKAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkATAuAXA7ApBEAwA9BEApAZAmAmATAT_c_yATAkAkAkAkAkAkAkAkA5BKA5ATA5BKAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkA7AXAuA9ApBEBDBEAp_V_7AZAmAmATATA3_6ATAkAkAkAkAkAkAkA5BKBKA5ATBKBKAkAkAk AkAkAkAkAkAkAkAkAkAkAk_6AuAiA7ApApApApApAI_YAIApAZAmAmATAT_c_yATAkAkAkAkAkAkAkA5BKBKA5A5BKAkAkAk AkAkAkAkAkAkAkAkAkAkAkA7AiA7A9ApATBVAT_7_Y_YApApApAZAmAmATAd_6_yATAkAkAkAkAkAkATBKBKBKATBKAkAkAk AkAkAkAkAkAkAkAkAkAk_6AuA7_VApAT_7_Y_Y_Y_I_7_VBEApAZAmAmAmATAT_6_6AkAkAkAkAkAmA5BKBKBKA5A5AkAkAk AkAkAkAkAkAkAkAkAk_6A7A7A9ApBV_7_YAkAkAk_Y_7_VApBEApAZAmAmAmAd_6_y_6AkAkAmA5BKBKBKBKBKBKATAkAkAk AkAkAkAkAkAkAkAk_VA7_s_VAI_7_YA5AkAkAkAkAk_Y_7ATBEAwApAZAmAmATATA3_yATA5BKBKBKBKBKBKBKBKA5AkAkAk AkAkAkAkAkAkAkAk_VApApA8_7_YAkAkAkAkAkAkAkAk_YBVApBDApApAZAmAmAT_c_y_6BKBKBKBKBKAkAkAkBKA5AkAkAk AkAkAkAkAkAkAkAkAk_7_YAzAkAkAkAkAkAkAkAkAkAkA5_7ApBEAwApAZAmAmATAT_6ATATBKBKAkAkAkAkAkAkBKAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_Y_7ATAp_kApApAZAmAmAd_6_6ATBKAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_YAIApBEAwApAZAmAmATATATATAmAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_Y_gApBE_kBDApAZAmAmATATATATAmAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkATAkAkAkAkAkAk_Y_V_VApAwBEApAZAmAmAmAmAT_6ATAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_c_IAkAkAkAkAkAk_Y_7AIApBEApApApAZAmA5AmAmAd_6AmAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkA9BKAkAkAkAkAkAk_Y_7_VA8ApApAp_V_7_7AZAmAmAmATAmAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkBKATBKAkAkAkAkAkAz_Y_IAaAIAY_7_7_VATApApAZAmAmAmATAmAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkBKATA5AkAkAk_I_Y_7ATAaAd_7_7A8ApApBEBEApApAZAmAmAmAmAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkBKA5AmATA5ATA9A5ApBEApAp_VApApApBEBEAwA9BEApApAZAmAmA5A5AkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkBKA5ATATAmAmATATBK_YApAwBD_VApBEBEAw_kA9Aw_kBEBEApAZAmAmATAmA5AkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAk_6A9ATAmA5BKA5AmBKAk_RATApAp_7ApApApBEBEBEBEBEApAp_VAZAmAT_yATAmA5AkAkAkAkAk AkAkAkAkAkAkAkAkAkATA5AkA5BKBKBKBKBKAkAkA5_7AIAa_PAIApApApApApApApApAa_VAmA5AmATATA5A5AkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkBKA5BKAkAkAk_Y_Y_7_7_Y_7_VApApApApApApAIAd_YAoBKAmATATAmA5AkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkBKAmA5AkAkA5ATAz_Y_YAz_Y_V_7_VApApAp_V_7_Y_YAmBKA5_6ATATA5AkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkBKATAmA5AkATATAm_RA5_Y_I_Y_Y_V_7_7_7_V_Y_RAoATATBKA9ATATA5AkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkA5ATAmA5AmAmA5_YAz_7_7_7Az_Y_YAz_Y_YAz_7AZATATBKATBKATAmAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkBKATAmAmAmA5_E_Y_VAa_VAp_V_7_V_7_7_7_7AI_VAZATA5AmBKATAmA5AkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkBKATAmBKBKAk_YATApAIAp_VAp_VAIA8ATAaA3BKBKA5ATAmATBKAmA5AkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkBKBKAkAkBKAzApA8Ap_VApAaAp_VAp_V_6A9ATATATAmAmATATA5BKAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkBK_Y_7_VApAIApApApAIApBV_6A5BKBKA5AmA5AmAmATATA9_6AkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkA5A5A5A5BKAm_g_V_WAaApBEApBEApApAT_VAI_VAI_VBKBKA5A5A5BKBKA5_6AkAk AkAkAkAkAkAkAkAkAkAkAkA5A5A5AmATATATATA5AT_YATAaApBEApBEApBEAp_VApA8AaA3ATATATBKBKBKA5A5AkAkAkAk AkAkAkAkAkAkAkAkA5A5AmATATAT_6AT_6_6ATA5_6_YAIApATApBEApBEApAp_J_VAIA5AT_6_y_y_6ATAmA5A5A5AkAkAk AkAkAkAkAkAkA5AmATATAT_6_6AT_6_6AdAmAmA5AT_YATBVApATApApApApApAIApA5AT_6_6_y_y_y_6AdAmA5A5AkAkAk AkAkAkAkA5AmATAT_c_6_6ATATATAmAmA5AmA5BKAm_Y_7Ap_VApBVApATApAaAp_VA5ATAI_y_y_yAIATAmA5A5BKA5AkAk AkAkAkA5ATAT_6A3AT_IAmAmAmA5AmA5AmA5AmBKAmAz_7ATBVATAp_VApApApATBVAm_6AD_6_6AD_6ATAmA5BKA5BKAkAk AkAkA5AT_6ATAmAmA5AmA5AmA5AmA5A5A5A5A5A5BK_Y_Y_7AT_VAp_VAp_V_V_7A5ATATAIATAIATATATAmA5A5BKA5AkAk AkA5AmATAmA5AmA5AmA5A5A5A5A5BKA5BKA5BKA5BKBK_Y_V_7Aa_7_V_7AI_7A8A5ATATAS_6AT_6ATATAmA5BKA5BKAkAk AkA5ATAmA5AmA5A5A5BKA5BKA5BKBKBKBKBKBKBKBKBKAz_Y_7_7AI_VAa_7_V_7A5ATATATAdATATATATATAmBKBKBKAkAk A5AmATATAmA5BKA5BKBKBKBKBK___________________vBK_Y_7_7_7_7_V_7_7A5ATATATATATATATATATAmA5BKBKAkAk A5AmATAmA5A5BKBK____________________Ak__Ak__BKA5Az_Y_7_7_7_7_7_7_YA5ATATATATATATATATAmA5BKBKAkAk A5AmATAmAmBK______________Ak__Ak__Ak__Ak___yBKATAm_YA5_Y_7_Y_7_YAYA5AmATATATATATAmAmAmAmBKBKAkAk A5A5ATATA5BK________Ak__Ak__AkAkAkAkAk___s_I_sBKAmA5ATAz_Y_7Az_7_YBKA5AmAmAmAmAmAmAmAmAmA5BKBKAk BKA5AmATATA5______Ak__AkAkAkAkAkAk____AT_j_s_6ATBK_yBKA5_Y_I_Y_YA5_YBKA5AmAmAmAmAmAmAmAmA5BKBKAk AkBKA5AmATATA5______Ak__AkAkAkAk__Ak___I_sAT_I___I_sATBKBK__AR__BYBY__BKBKA5AmAmAmA5BKA5A5A5BKAk AkBKA5A5AmATATA5______AkAkAkAkAkAk_______________sAT_I____________________BKBKBKBKBKA5AmA5A5BK__ AkAkBKA5A5AmAmATA5A5____AkAkAkAk__Ak______________________Ak__Ak____________BKAmAmAmAmAmA5A5BK__ AkAkAkBKBKA5A5A5A5AmBK____Ak__AkAk__Ak______________Ak__Ak__Ak__Ak__Ak__BKBKA5AmATATATAmAmBK__Ak AkAkAkAkAkBKBKBKBKBK____Ak__AkAkAkAk__Ak__Ak__Ak__Ak__AkAkAkAkAk__Ak___s_yBKATAmA5AT_6ATAmBKAk__ AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_I_yAT_I_sBKA5BK_6AdAmA5BK__Ak AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk____AT_y_yBK_yBKAmA5BK__Ak__ AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkA5_s_y_j___I_sATBKBK__Ak__Ak AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_________sATA5____Ak__AkAk } # tile 0 (red dragon) { AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAL_3AhBNBN_N_n AkAkAkAkAkAkBNBNBNAhAhAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAL_3Ah_N_n_n_nAkAk AkAkAkAkAkBN_N_NBNBNBNAhAhAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_3Ah_N_n_n_n_nAkAkAk AkAkAkAkAk_NBF_s_N_NBNBNBNAhAh_n_NBN_3ALA5AT_6_yA9A9_6ATAkAkAkAkAkAkAkAkAkALAh_N_n_n_n_n_nAkAkAk AkAkAkAkAk_N_6BFBP_s_N_NBNBNBNAhBN__A9BN_3BBA5AT_6_yA9A9_s_6AkAkAkAkAkAk_3Ah_N_n_n_n_n_n_nAkAkAk AkAkAkAkAkAk_N_6BFBFBP_s_NBNBNBNAhBN_N_nBNBBBBBBA5AkAkAkAk_cATAkAkAkAkAkAh_N_n_n_n_n_n_n_n_nAkAk AkAkAkAkAkAkAk_N_6A7BFBPBP_N_NBNBNBNBNBNBNAhBBAkAkAkAkAkAkAkAkAkAkAkAk_3_N_n_n_n_n_NAhAL_3AhBN_N AkAkAkAkAkAkAkAk_NATA7BFBP_sBP_N_NBNBNBNBNBNAhAhAkAkAkAkAkAkAkAkAkAkAkBN_n_NAh_3_3AhBN_N_n_nAkAk AkAkAkAkAkAkAkAkAkAkATA7BFBPBP_sBP_N_N_NBNBNBNAhAhAhAkAkAkAkAkAkAkAk_3AhAhBNBN_N_n_n_n_n_nAkAkAk AkAkAkAkAkAkAkAkAkAkAkATA7BFBPBPBP_6A0AA_NBNBNBNAh_3AhAkAkAkAkAkAkAkAk_NBN_3_N_n_n_n_n_n_nAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkA3A7BFBPBPA0AA_ZAA_NBNBNAh_3ALAhAkAkAkAkAkAkAkAk_N_nAh_3_N_n_n_nAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAk_NAiAu_sAA_Z_Z_ZAAAKBNBNAh_3_3AhAkAkAkAkAkAkAkAk_N_n_NAh_N_n_nAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkATAuAXA7AA_Z_T_b_ZAAAKBNBNAhAh_3ALAhAkAkAkAkAkAkAkAk_N_n_NAh_N_nAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkA7AXAuA9AA_Z_Z_ZAAA0_AAKBNBNAhAh_3_3AhAkAkAkAkAkAkAk_N_n_n_NAh_n_nAkAkAk AkAkAkAkAkAkAkAkAkAkAk_6AuAiA7AAAAAAAAAAA0_XA0AAAKBNBNAhAh_3ALAhAkAkAkAkAkAkAk_N_n_n_N_N_nAkAkAk AkAkAkAkAkAkAkAkAkAkAkA7AiA7A9AAA0A0A0_A_X_XAAAAAAAKBNBNAhAh_3ALAhAkAkAkAkAkAkAh_n_n_nAh_nAkAkAk AkAkAkAkAkAkAkAkAkAk_6AuA7A0AAA0_A_X_X_X_X_AA0_ZAAAKBNBNBNAhAh_3ALAkAkAkAkAkBN_N_n_n_n_N_NAkAkAk AkAkAkAkAkAkAkAkAk_6A7A7A9AAA0_A_XAkAkAk_X_A_AAA_ZAAAKBNBNBNAh_3AL_3AkAkBN_N_n_n_n_n_n_nAhAkAkAk AkAkAkAkAkAkAkAkA0A7_sA0A0_A_X_XAkAkAkAkAk_X_AA0_Z_ZAAAKBNBNAhAh_3ALAh_N_n_n_n_n_n_n_n_n_NAkAkAk AkAkAkAkAkAkAkAk_AAAAAA0_A_XAkAkAkAkAkAkAkAk_XA0AA_ZAAAAAKBNBNAh_3AL_3_n_n_n_n_nAkAkAk_n_NAkAkAk AkAkAkAkAkAkAkAkAk_A_X_XAkAkAkAkAkAkAkAkAkAk_X_AAA_Z_TAAAKBNBNAhAh_3_3Ah_n_nAkAkAkAkAkAk_nAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_X_AA0AA_ZAAAAAKBNBNAh_3_3Ah_nAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_XA0AA_Z_ZAAAKBNBNAhAh_3AhBNAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_X_AAA_Z_T_ZAAAKBNBNAhAhAhAhBNAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkATAkAkAkAkAkAk_X_AA0AA_Z_ZAAAKBNBNBNBNAh_3AhAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_c_IAkAkAkAkAkAk_X_AA0AA_ZAAAAAAAKBN_NBNBNAh_3BNAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkA9_nAkAkAkAkAkAk_X_AA0A0AAAAAAA0_A_AAKBNBNBNAhBNAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAk_nAh_nAkAkAkAkAk_X_X_XA0A0A0_A_A_AA0AAAAAKBNBNBNAhBNAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAk_nAh_NAkAkAk_I_X_AA0A0_A_A_AA0AAAA_Z_ZAAAAAKBNBNBNBNAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAk_n_NBNAh_NAhA9_XAA_ZAAA0A0AAAAAA_Z_Z_Z_b_ZAAAAAKBNBN_N_NAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAk_n_NAhAhBNBNAhAh_n_XAA_Z_ZA0AA_Z_Z_Z_T_b_T_Z_Z_ZAAAKBNBNAhBN_NAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAk_6A9AhBN_N_n_NBN_nAk_XA0AAAA_AAAAAAA_Z_Z_Z_Z_ZAAAAA0AKBNAhALAhBN_NAkAkAkAkAk AkAkAkAkAkAkAkAkAkATA5Ak_N_n_n_n_n_nAkAk_X_AA0A0_XA0AAAAAAAAAAAAAAAAA0_ABA_NBNAhAh_N_NAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAk_n_N_nAkAkAk_X_X_A_A_X_AA0AAAAAAAAAAAAA0_A_XBA_nBNATAhBN_NAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAk_nBN_NAkAk_NAh_X_X_X_X_X_A_AA0AAAAAAA0_A_X_XBA_n_N_6AhAh_NAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAk_nAhBN_NAkAhAhBN_X_X_X_X_X_X_A_A_A_A_A_X_XBAAhAh_nA9AhAh_NAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_NAhBN_NBNBN_N_X_X_A_A_A_X_X_X_X_X_X_X_AAKAhAh_nAh_nAhBNAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_nAhBNBNBN_N_n_X_AA0A0A0A0_A_A_A_A_A_AA0A0AKAh_NBN_nAhBN_NAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_nAhBN_n_nAk_XA0AAA0AAA0A0A0A0A0A0A0A0_n_n_NAhBNAh_nBN_NAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_n_nAkAk_n_XAAA0AAA0AAA0AAA0AAA0_6A9AhAhAhBNBNAhAh_N_nAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_n_X_AA0AAA0AAAAAAA0AAA0_6A5_n_n_NBN_NBNBNAhAhA9_6AkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_N_N_N_N_nBN_XA0AAA0AA_ZAA_ZAAAAATA0A0A0A0A0_n_n_N_N_N_n_nA5_6AkAk AkAkAkAkAkAkAkAkAkAkAk_N_N_NBNAhAhAhAh_NAh_XA0A0AA_ZAA_ZAA_ZAAA0AAA0A0A0AhAhAh_n_n_n_N_NAkAkAkAk AkAkAkAkAkAkAkAk_N_NBNAhAhAh_3_3_3_3Ah_N_3_XA0AAA0AA_ZAA_ZAAAAAAA0A0_NAh_3ALAL_3AhBN_N_N_NAkAkAk AkAkAkAkAkAk_NBNAhAhAh_3_3_3_3_3AhBNBN_NAh_XA0A0AAA0AAAAAAAAAAA0AA_NAh_3ALALALAL_3AhBN_N_NAkAkAk AkAkAkAk_NBNAhAh_3_3_3_3AhAhBNBN_NBN_N_nBN_X_AAAA0AAA0AAA0AAA0AAA0_NAh_3ALALAL_3AhBN_N_N_n_NAkAk AkAkAk_NAhAh_3_3AhBNBNBNBN_NBN_NBN_NBN_nBN_X_AA0A0A0AAA0AAA0AAA0A0BN_3_3_3_3_3_3AhBN_N_n_N_nAkAk AkAk_NAh_3AhBNBN_NBN_NBN_NBN_N_N_N_N_N_N_n_X_X_AA0A0A0A0A0A0A0_A_NAhAh_3Ah_3Ah_3AhBN_N_N_n_NAkAk Ak_NBNAhBN_NBN_NBN_N_N_N_N_N_n_N_n_N_n_N_n_n_X_A_AA0_AA0_AA0_AA0_NAhAhAh_3Ah_3AhAhBN_N_n_N_nAkAk Ak_NAhBN_NBN_N_N_N_n_N_n_N_n_n_n_n_n_n_n_n_n_X_X_A_AA0_AA0_AA0_A_NAhAhAhAhAhAhAhAhAhBN_n_n_nAkAk _NBNAhAhBN_N_n_N_n_n_n_n_n_____________________n_X_A_A_A_A_A_A_A_NAhAhAhAhAhAhAhAhAhBN_N_n_nAkAk _NBNAhBN_N_N_n_n____________________Ak__Ak___n_N_X_X_A_A_A_A_A_A_X_NAhAhAhAhAhAhAhAhBN_N_n_nAkAk _NBNAhBNBN_n______________Ak__Ak__Ak__Ak___y_nAhBN_X_X_X_A_X_A_X_A_NBNAhAhAhAhAhBNBNBNBN_n_nAkAk _N_NAhAh_N_n________Ak__Ak__AkAkAkAkAk___s_I_s_nBN_NAh_X_X_A_X_A_X_n_NBNBNBNBNBNBNBNBNBN_N_n_nAk _n_NBNAhAh_N______Ak__AkAkAkAkAkAk____ATA5_s_6AT_n_y_n_N_X_X_X_X_X_X_n_NBNBNBNBNBNBNBNBN_N_n_nAk Ak_n_NBNAhAh_N______Ak__AkAkAkAk__Ak__Am_sAT_j___I_sAT_n_n_____________n_n_NBNBNBN_N_n_N_N_N_nAk Ak_n_N_NBNAhAh_N______AkAkAkAkAkAk___________v___sAT_I_____________________n_n_n_n_n_NBN_N_N_n__ AkAk_n_N_NBNBNAh_N_N____AkAkAkAk__Ak______________________Ak__Ak_____________nBNBNBNBNBN_N_N_n__ AkAkAk_n_n_N_N_N_NBN_n____Ak__AkAk__Ak______________Ak__Ak__Ak__Ak__Ak___n_n_NBNAhAhAhBNBN_n__Ak AkAkAkAkAk_n_n_n_n_n____Ak__AkAkAkAk__Ak__Ak__Ak__Ak__AkAkAkAkAk__Ak___s_y_nAhBN_NAh_3AhBN_nAk__ AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_I_yAT_I_s_n_N_n_3AhBN_N_n__Ak AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk____AT_y_y_n_y_nBN_N_n__Ak__ AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkA5_s_y_j___I_sAT_n_n__Ak__Ak AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_________sAT_I____Ak__AkAk } # tile 0 (white dragon) { AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkA9BM_y_c_cAQAm AkAkAkAkAkAk_c_c_cAg_yAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkA9BM_y_u_LAd_LAkAk AkAkAkAkAk_cAQAQ_c_c_cBM_cAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkBM_cAQ_L_uAm_LAkAkAk AkAkAkAkAkAQBF_sAQAQ_c_c_c_cBMAmAQ_cBMA9Am_j_6_yA9A9_6AmAkAkAkAkAkAkAkAkAk_kBMAQAd_LAm_LAdAkAkAk AkAkAkAkAkAQ_6BFBP_sAQAQ_c_c_cAg_c__A9_cBMBBA5Ad_c_sA9A9_s_6AkAkAkAkAkAkBM_y_u_LAd_LAd_LAdAkAkAk AkAkAkAkAkAkAQ_6BFBFBP_sAQ_c_c_c_y_c_uAm_cBBBBBBA5AkAkAkAk_cAmAkAkAkAkAkBMAWAd_LAd_LAmAWAm_LAkAk AkAkAkAkAkAkAkAQ_6A7BFBPBPAQAQ_c_c_c_c_c_cBMBKAkAkAkAkAkAkAkAkAkAkAkAkBMAQAm_LAd_LAQBM_kBMBM_cAQ AkAkAkAkAkAkAkAkAQATA7BFBP_sBPAQ_u_c_c_c_c_c_cBMAkAkAkAkAkAkAkAkAkAkAk_c_L_uBMBMBM_y_cAQAm_jAkAk AkAkAkAkAkAkAkAkAkAkATA7BFBPBP_sBPAQAQAQ_c_c_c_yAg_yAkAkAkAkAkAkAkAkBM_yBM_cAQAQ_L_LAd_LAdAkAkAk AkAkAkAkAkAkAkAkAkAkAk_cA7BFBPBPBP_6AT_6AQ_c_c_c_cBMBMAkAkAkAkAkAkAkAk_u_cBMAQ_LAdAd_LAd_LAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkA3A7BFBPBPAT_6_6_6_u_c_cBMBM_k_cAkAkAkAkAkAkAkAk_uAmBMBM_u_LAd_LAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAk_uAiAu_s_c_y_k_6_6AW_c_c_cBMBM_yAkAkAkAkAkAkAkAk_u_j_u_yAQ_LAdAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkATAuAXA7_6_6_kA9_y_6AW_c_cBM_cBMA9AgAkAkAkAkAkAkAkAkAQ_LAQBMAQAmAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkA7AXAu_k_6_y_y_y_6AdAmAW_c_c_m_yBMBM_yAkAkAkAkAkAkAk_uAdAmAQAgAd_LAkAkAk AkAkAkAkAkAkAkAkAkAkAk_6AuAiA7_6A3_c_6A3ATA5AT_6AW_c_c_y_mBMA9BMAkAkAkAkAkAkAk_u_LAdAQAQAmAkAkAk AkAkAkAkAkAkAkAkAkAkAkA7AiA7A9_cATATATAmA5A5_6AT_6AW_c_cAg_yBM_k_yAkAkAkAkAkAkBM_LAd_jBM_LAkAkAk AkAkAkAkAkAkAkAkAkAk_6AuA7AT_6AdAmA5A5A5A5AmAT_y_6AW_c_c_cBM_cBMA9AkAkAkAkAk_cAQAm_LAd_uAQAkAkAk AkAkAkAkAkAkAkAkAk_6A7A7_k_6ATAmA5AkAkAkA5AmAm_6_6_6AW_c_cAQBMBMA9BMAkAk_cAQ_LAm_LAd_L_L_yAkAkAk AkAkAkAkAkAkAkAkATA7_sATATAmA5A5AkAkAkAkAkA5AmAd_y_s_6AW_c_c_cBMBMA9_cAQAd_LAd_LAd_LAdAd_uAkAkAk AkAkAkAkAkAkAkAkAm_6_6ATAmA5AkAkAkAkAkAkAkAkA5AT_6_yAT_6AW_c_c_cBMA9BMAd_LAd_LAdAkAkAk_L_uAkAkAk AkAkAkAkAkAkAkAkAkAmBBA5AkAkAkAkAkAkAkAkAkAkA5Am_c_y_k_6AW_c_cBM_cBMBMAgAd_LAkAkAkAkAkAkAdAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkA5AmAb_6_kAT_6AW_c_cBMBMBM_yAdAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkA5AT_6_y_k_6AW_c_c_cBMBMAg_cAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkA5AmAT_y_k_6_cAW_c_c_c_cBM_y_cAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAmAkAkAkAkAkAkA5AmAT_6_y_yA3AW_c_c_c_cBMBMAgAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_6_jAkAkAkAkAkAkA5AmAT_6_6_6_6_6AW_cAQ_c_c_yBM_cAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkA9AmAkAkAkAkAkAkA5AmATAT_6AT_6AdAmAmAW_c_c_cAg_cAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAk_L_y_LAkAkAkAkAkA5A5A5ATATATAmAmAmAT_c_6AW_c_c_c_y_cAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAdAgAQAkAkAk_IA5AmATATAmAmAmAT_6_c_y_yA3_cAW_c_c_c_cAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAk_LAQ_cBM_u_yA9A5_c_y_6ATAT_cA3_6_6_y_kA9_y_6_6AW_c_cAQAQAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAmAQ_yBM_c_c_cBM_LA5AD_k_6AT_6_y_y_k_kA9_k_k_y_6_6AW_c_cBM_c_uAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAk_6A9Ag_c_u_jAQ_c_LAkA5ATAp_6Am_6AT_6_y_y_y_y_6_6_6AdAW_c_cA9_c_cAQAkAkAkAkAk AkAkAkAkAkAkAkAkAk_L_IAkAQAd_LAd_LAdAkAkA5AmATAdA5AT_6A3_c_6A3_6_6ATATAm_LAQ_cBM_y_uAQAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAk_LAQAmAkAkAkA5A5AmAmA5AmAT_6A3_c_6AT_6ATAmA5_L_L_cAm_m_cAQAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAd_c_uAkAkAQ_yAOA5A5A5A5AmAmAT_6AT_6ATAmA5A5_LAd_u_6_cBM_uAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAk_jBM_cAQAk_yAg_cA5A5A5A5A5A5AmAmAmAmAmA5A5_L_y_mAm_kBM_cAQAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_u_c_cAQ_c_cAQA5A5AmAmAmA5A5A5A5A5A5A5AmAWAg_y_LBM_jBM_cAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAmBM_c_c_cAQAmA5AmATATATATAmAmAmAmAmAmATATAWBMAQ_cAd_c_cAQAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_L_y_c_LAdAkA5AT_6AT_6AdATATATATATATATAm_LAQ_c_cBM_L_cAQAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAd_LAkAkAmBB_6Ad_6Ad_6AT_6AT_6AT_6A9_cBM_y_c_cAg_yAQAmAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_LA5AmAT_6Ad_6AT_6Ad_6Ad_6A5AmAWAQ_c_u_c_cBM_cA9_6AkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAQ_u_u_uAd_cA5AT_6Ad_c_y_6_yAT_6_jATATATATAT_LAmAQAQ_uAd_LA5_6AkAk AkAkAkAkAkAkAkAkAkAkAkAQAQAQ_cBM_cBM_cAQBMBBATAT_6_6_6_6_6_y_6AT_6AdATAT_y_m_y_LAd_LAQAQAkAkAkAk AkAkAkAkAkAkAkAkAQ_u_c_yAg_yBMBMBMBMBM_uBMA5AT_6Ad_6_6_6_6_6AT_6ATATAQAgBMA9A9BM_y_cAQAQAQAkAkAk AkAkAkAkAkAkAQ_c_y_m_yBMBMBMBMBM_c_c_c_u_yA5ATAd_6Ad_6A3_c_6_6Ad_6AQ_yBMA9A9A9A9BMAg_cAQAQAkAkAk AkAkAkAkAQ_c_yAgBMBMBMBM_yAg_c_cAQ_cAQ_L_cA5Am_6Ad_6Ad_6ATA3Ad_6ATAQAgBMA9A9A9BM_y_cAQAQAmAQAkAk AkAkAkAQ_y_mBMBM_y_c_c_c_cAQ_cAQ_cAQ_cAm_cA5AmATATAT_6Ad_6AT_cAbAT_cBMBMBMBMBMBMAg_cAQAd_u_LAkAk AkAkAQAgBM_y_c_c_u_c_u_c_u_cAQAQAQAQAQAQ_LA5A5AmATATATATATATATAmAT_m_yBM_yBM_cBM_y_cAQ_uAdAQAkAk AkAQ_c_y_c_u_c_u_c_u_uAQAQAQAd_u_LAQAd_uAd_LA5AmAmATAmATAmATAmAT_u_yAgBMBMAgBMBM_c_cAQ_LAQ_LAkAk Ak_uBM_c_u_cAQAQAQ_L_uAdAQ_LAm_LAdAd_LAd_LAmA5A5AmAmATAmATAmATAm_u_yAg_yAg_s_cBM_cBM_c_uAmAdAkAk AQ_c_cBM_c_u_LAQAdAm_LAd_L_vAP____________AP__AmA5AmAmAmAmAmAmAm_uBM_cBM_y_m_yAgBM_c_c_u_LAdAkAk AQ_c_c_c_u_uAdAm__AP________________Ak__Ak_v_L_uA5A5AmAmAmAmAmAmA5AQ_m_yAg_y_m_y_cBM_cAQAd_LAkAk AQ_cBM_c_cAmAP____________Ak__Ak__Ak__Ak___yAdBM_cA5A5A5AmA5AmA5AmAQ_c_y_m_y_cBM_c_c_c_c_LAdAkAk AQAQAg_yAQ_L________Ak__Ak__AkAkAkAkAk___s_j_s_j_cAQ_cA5A5AmA5AmA5Am_u_c_c_c_c_c_c_c_c_cAQAm_LAk AmAQ_cBM_cAQ_v____Ak__AkAkAkAkAkAk____Am_j_s_6Am_L_sAd_uA5A5A5A5A5A5_LAQ_c_c_c_c_c_c_c_cAQ_LAdAk AkAdAQ_c_cBMAQ______Ak__AkAkAkAk__Ak__Am_sAm_IAR_I_s_L_LAm___________v_LAmAQ_c_c_c_uAmAQAQAQ_LAk Ak_LAQAQ_cBM_cAQ______AkAkAkAkAkAk_______________sAmAm__AP_____________v___LAd_LAd_LAQ_cAQAQAd__ AkAkAmAQ_u_c_cBMAQAQ____AkAkAkAk__Ak______________________Ak__Ak__________APAm_c_c_c_c_cAQAQ_L__ AkAkAk_LAd_u_u_uAQ_cAm____Ak__AkAk__Ak______________Ak__Ak__Ak__Ak__Ak__Am_LAQ_cBM_cBM_c_cAd__Ak AkAkAkAkAkAd_LAmAm_L____Ak__AkAkAkAk__Ak__Ak__Ak__Ak__AkAkAkAkAk__Ak___s_yAW_y_cAQAgBM_y_c_LAk__ AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_I_y_L_I_s_LAQAdBM_yAgAQAm__Ak AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk__ARAm_y_yAm_y_L_cAQ_L__Ak__ AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_I_s_y_j__Am_sAm_LAd__Ak__Ak AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_________s_LAm____Ak__AkAk } # tile 0 (orange dragon) { AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_1_iAKBABA_D_a AkAkAkAkAkAkBABABAAKAKAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_1_iAK_D_a_a_aAkAk AkAkAkAkAkBA_D_DBABABAAKAKAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_iAK_D_a_a_a_aAkAkAk AkAkAkAkAk_DBF_s_D_DBABABAAKAK_a_DBA_i_1A5AT_6_yA9A9_6ATAkAkAkAkAkAkAkAkAk_1AK_D_a_a_a_a_aAkAkAk AkAkAkAkAk_D_6BFBP_s_D_DBABABAAKBA__A9BA_iBBA5AT_6_yA9A9_s_6AkAkAkAkAkAk_iAK_D_a_a_a_a_a_aAkAkAk AkAkAkAkAkAk_D_6BFBFBP_s_DBABABAAKBA_D_aBABBBBBBA5AkAkAkAk_cATAkAkAkAkAkAK_D_a_a_a_a_a_a_a_aAkAk AkAkAkAkAkAkAk_D_6A7BFBPBP_D_DBABABABABABAAKBBAkAkAkAkAkAkAkAkAkAkAkAk_i_D_a_a_a_a_DAK_1_iAKBA_D AkAkAkAkAkAkAkAk_0ATA7BFBP_sBP_D_DBABABABABAAKAKAkAkAkAkAkAkAkAkAkAkAkBA_a_DAK_i_iAKBA_D_a_aAkAk AkAkAkAkAkAkAkAkAkAkATA7BFBPBP_sBP_D_D_DBABABAAKAKAKAkAkAkAkAkAkAkAk_iAKAKBABA_D_a_a_a_a_aAkAkAk AkAkAkAkAkAkAkAkAkAkAkATA7BFBPBPBP_6As_4_DBABABAAK_iAKAkAkAkAkAkAkAkAk_DBA_i_D_a_a_a_a_a_aAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkA3A7BFBPBPAs_4_T_4_DBABAAK_i_1AKAkAkAkAkAkAkAkAk_D_aAK_i_D_a_a_aAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAk_DAiAu_s_4_T_T_T_4AKBABAAK_i_iAKAkAkAkAkAkAkAkAk_D_a_DAK_D_a_aAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkATAuAXA7_4_T_TA9_T_4AKBABAAKAK_i_1AKAkAkAkAkAkAkAkAk_D_a_DAK_D_aAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkA7AXAuA9_4_T_T_T_4AsBWAKBABAAKAK_i_iAKAkAkAkAkAkAkAk_D_a_a_DAK_a_aAkAkAk AkAkAkAkAkAkAkAkAkAkAk_6AuAiA7_4_4_4_4_4As_XAs_4AKBABAAKAK_i_1AKAkAkAkAkAkAkAk_D_a_a_D_D_aAkAkAk AkAkAkAkAkAkAkAkAkAkAkA7AiA7A9_4AsAsAsBW_z_A_4_4_4AKBABAAKAK_i_1AKAkAkAkAkAkAkAK_a_a_aAK_aAkAkAk AkAkAkAkAkAkAkAkAkAk_6AuA7As_4AsBW_X_A_X_ABWAs_T_4AKBABABAAKAK_i_1AkAkAkAkAkBA_D_a_a_a_D_DAkAkAk AkAkAkAkAkAkAkAkAk_6A7A7A9_4AsBW_AAkAkAk_HBWBW_4_T_4AKBABABAAK_i_1_iAkAkBA_D_a_a_a_a_a_aAKAkAkAk AkAkAkAkAkAkAkAkAsA7_sAsAsBW_X_zAkAkAkAkAk_ABWAs_T_T_4AKBABAAKAK_i_1AK_D_a_a_a_a_a_a_a_a_DAkAkAk AkAkAkAkAkAkAkAkBW_4_4AsBW_XAkAkAkAkAkAkAkAk_XAs_4_T_4_4AKBABAAK_i_1_i_a_a_a_a_aAkAkAk_a_DAkAkAk AkAkAkAkAkAkAkAkAkBW_X_AAkAkAkAkAkAkAkAkAkAk_zBW_4_T_T_4AKBABAAKAK_i_iAK_a_aAkAkAkAkAkAk_aAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_ABWAs_T_T_4_4AKBABAAK_i_iAK_aAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_XAs_4_T_T_TAKBABAAKAK_iAKBAAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_ABW_4_T_T_T_4AKBABAAKAKAKAKBAAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkATAkAkAkAkAkAk_zBWAs_4_T_T_4AKBABABABAAK_iAKAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_c_IAkAkAkAkAkAk_XBWAs_4_T_4_4_4AKBA_DBABAAK_iBAAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkA9_aAkAkAkAkAkAk_XBWAsAs_4_4_4AsBWBWAKBABABAAKBAAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAk_aAK_aAkAkAkAkAk_A_z_AAsAsAsBWBWBWAs_4_4AKBABABAAKBAAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAk_aAK_DAkAkAkA5_YBWAsAsBWBWBWAs_4_4_T_T_4_4AKBABABABAAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAk_a_DBAAK_DAKA9_A_4_T_4AsAs_4_4_4_T_T_TA9_T_4_4AKBABA_D_DAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAk_a_DAKAKBABAAKAK_a_H_4_T_TAs_4_T_T_T_TA9_T_T_T_T_4AKBABAAKBA_DAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAk_6A9AKBA_D_a_DBA_aAk_AAs_4_4BW_4_4_T_T_T_T_T_T_4_4AsAKBAAK_1AKBA_DAkAkAkAkAk AkAkAkAkAkAkAkAkAkATA5Ak_D_a_a_a_a_aAkAk_XBWAsAs_AAs_4_4_4_4_4_T_4_4AsBWBA_DBAAKAK_D_DAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAk_a_D_aAkAkAk_z_ABWBW_zBWAs_4_4_4_4_4_4AsBW_XBA_aBAATAKBA_DAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAk_aBA_DAkAk_DAK_X_z_A_X_XBWBWAs_4_4_4AsBW_A_zBA_a_D_6AKAK_DAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAk_aAKBA_DAkAKAKBA_A_X_z_A_z_XBWBWBWBWBW_z_XBAAKAK_aA9AKAK_DAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_DAKBA_DBABA_D_X_zA0BWBW_A_z_X_A_X_X_ABWAKAKAK_aAK_aAKBAAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_aAKBABABA_D_X_XBWAsAsAsAsBWBWBWBWBWBWAsAsAKAK_DBA_aAKBA_DAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_aAKBA_a_aAk_XAs_4As_4AsAsAsAsAsAsAsAs_a_a_DAKBAAK_aBA_DAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_a_aAkAk_X_A_4As_4As_4As_4As_4As_6A9AKAKAKBABAAKAK_D_aAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_a_XBWAs_4As_4_4_4As_4As_cA5_a_a_DBA_DBABAAKAKA9_6AkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_D_D_D_D_aBA_zAs_4As_4_T_4_T_4_4ATAsAsAsAsAs_a_a_D_D_D_a_aA5_6AkAk AkAkAkAkAkAkAkAkAkAkAk_D_D_DBAAKAKAKAK_DAK_XAsAs_4_T_4_T_4_T_4As_4AsAsAsAKAKAK_a_a_a_D_DAkAkAkAk AkAkAkAkAkAkAkAk_D_DBAAKAKAK_i_i_i_iAK_D_i_AAs_4As_4_T_4_T_4_4_4AsAs_DAK_i_1_1_iAKBA_D_D_DAkAkAk AkAkAkAkAkAk_DBAAKAKAK_i_i_i_i_iAKBABA_DAK_XAsAs_4As_4_4_4_4_4As_4_DAK_i_1_1_1_1_iAKBA_D_DAkAkAk AkAkAkAk_DBAAKAK_i_i_i_iAKAKBABA_DBA_D_aBA_zBW_4As_4As_4As_4As_4As_DAK_i_1_1_1_iAKBA_D_D_a_DAkAk AkAkAk_DAKAK_i_iAKBABABABA_DBA_DBA_DBA_aBA_XBWAsAsAs_4As_4As_4AsAsBA_i_i_i_i_i_iAKBA_D_a_D_aAkAk AkAk_DAK_iAKBABA_DBA_DBA_DBA_D_D_D_D_D_D_aBW_XBWAsAsAsAsAsAsAsBW_DAKAK_iAK_iAK_iAKBA_D_D_a_DAkAk Ak_DBAAKBA_DBA_DBA_D_D_D_D_D_a_D_a_D_a_D_a_a_XBWBWAsBWAsBWAsBWAs_DAKAKAK_iAK_iAKAKBA_D_a_D_aAkAk Ak_DAKBA_DBA_D_D_D_a_D_a_D_a_a_a_a_a_a_a_a_a_z_ABWBWAsBWAsBWAsBW_DAKAKAKAKAKAKAKAKAKBA_a_a_aAkAk _DBAAKAKBA_D_a_D_a_a_a_a_a_____________________a_XBWBWBWBWBWBWBW_DAKAKAKAKAKAKAKAKAKBA_D_a_aAkAk _DBAAKBA_D_D_a_a____________________Ak__Ak___a_D_z_XBWBWBWBWBWBW_X_DAKAKAKAKAKAKAKAKBA_D_a_aAkAk _DBAAKBABA_a______________Ak__Ak__Ak__Ak___y_aAKBA_A_z_XBW_XBW_ABW_DBAAKAKAKAKAKBABABABA_a_aAkAk _D_DAKAK_D_a________Ak__Ak__AkAkAkAkAk___s_I_s_aBA_DAK_XBWBW_XBW_z_a_DBABABABABABABABABA_D_a_aAk _a_DBAAKAK_D______Ak__AkAkAkAkAkAk____ATA5_s_6AT_a_y_a_D_X_z_A_X_X_A_a_DBABABABABABABABA_D_a_aAk Ak_a_DBAAKAK_D______Ak__AkAkAkAk__Ak__Am_sATAm___I_sAT_a_a____BYBY_____a_a_DBABABA_D_a_D_D_D_aAk Ak_a_D_DBAAKAK_D______AkAkAkAkAkAk_______________sAT_j_____________________a_a_a_a_a_DBA_D_D_a__ AkAk_a_D_DBABAAK_D_D____AkAkAkAk__Ak_________________v____Ak__Ak_____________aBABABABABA_D_D_a__ AkAkAk_a_a_D_D_D_DBA_a____Ak__AkAk__Ak______________Ak__Ak__Ak__Ak__Ak___a_a_DBAAKAKAKBABA_a__Ak AkAkAkAkAk_a_a_a_a_a____Ak__AkAkAkAk__Ak__Ak__Ak__Ak__AkAkAkAkAk__Ak___s_y_aAKBA_DAK_iAKBA_aAk__ AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_I_yAT_I_s_a_D_a_iAKBA_D_a__Ak AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk____AT_y_y_a_y_aBA_D_a__Ak__ AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkA5_s_y_j___I_sAT_a_a__Ak__Ak AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_________sAT_I____Ak__AkAk } # tile 0 (black dragon) { AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkATAm_IA5A5BBBT AkAkAkAkAkAkA5A5A5_j_IAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkATAmAmBBBTBTBTAkAk AkAkAkAkAkA5BBBBA5A5A5A5AmAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAmAmBBBTBTBTBTAkAkAk AkAkAkAkAkBBBF_sBBBBA5A5A5A5_IBTBBA5AmATA5AT_6_yA9A9_6ATAkAkAkAkAkAkAkAkAkATA5BBBTBTBTBTBTAkAkAk AkAkAkAkAkBBATBFBP_sBBBBA5A5A5_jA5__A9A5AmBBA5AT_6_yA9A9_s_6AkAkAkAkAkAkAmAmBBBTBTBTBTBTBTAkAkAk AkAkAkAkAkAkA5ATBFBFBP_sBBA5A5A5_IA5BBBTA5BBBBBBA5AkAkAkAk_cATAkAkAkAkAk_IBBBTBTBTBTBTBTBTBTAkAk AkAkAkAkAkAkAkBBATA7BFBPBPBBBBA5A5A5A5A5A5_IBBAkAkAkAkAkAkAkAkAkAkAkAkAmBBBTBTBTBTBB_IATAm_IA5BB AkAkAkAkAkAkAkAkA5AmA7BFBP_sBPBBBBA5A5A5A5A5_jA5AkAkAkAkAkAkAkAkAkAkAkA5BTBB_IAmAm_jA5BBBTBTAkAk AkAkAkAkAkAkAkAkAkAkAmA7BFBPBP_sBPBBBBBBA5A5A5_I_j_IAkAkAkAkAkAkAkAkAm_j_IA5A5BBBTBTBTBTBTAkAkAk AkAkAkAkAkAkAkAkAkAkAkAmA7BFBPBPBPATAcAMBBA5A5A5A5AmA5AkAkAkAkAkAkAkAkBBA5AmBBBTBTBTBTBTBTAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAmA7BFBPBPAcAM_9AMBBA5A5AmAm_q_IAkAkAkAkAkAkAkAkBBBTA5AmBBBTBTBTAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkBBAiAu_sAM_9_9_9AMA7A5A5_IAmAm_IAkAkAkAkAkAkAkAkBBBTBB_IBBBTBTAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAmAuAXA7AM_9_9_k_9AMA7A5A5A5AmAmAT_jAkAkAkAkAkAkAkAkBBBTBB_jBBBTAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkA7AXAuA9AM_9_9_9AMAcArA7A5A5A5_jAmAm_IAkAkAkAkAkAkAkBBBTBTBB_IBTBTAkAkAk AkAkAkAkAkAkAkAkAkAkAkATAuAiA7AMAMAMAMAMAcBFAcAMA7A5A5_IA5AmATAmAkAkAkAkAkAkAkBBBTBTBBBBBTAkAkAk AkAkAkAkAkAkAkAkAkAkAkA7AiA7A9AMAcAcAcArBFBFAMAMAMA7A5A5AmAmAdATA5AkAkAkAkAkAk_IBTBTBTA5BTAkAkAk AkAkAkAkAkAkAkAkAkAkATAuA7AcAMAcArBFBFBFBFArAc_9AMA7A5A5A5A5_IAm_qAkAkAkAkAkA5BBBTBTBTBBBBAkAkAk AkAkAkAkAkAkAkAkAk_cA7A7A9AMAcArBFAkAkAkBFArArAM_9AMA7A5A5A5_jAmApAmAkAkA5BBBTBTBTBTBTBT_IAkAkAk AkAkAkAkAkAkAkAkAcA7_sAcAcArBFBFAkAkAkAkAkBFArAc_9_9AMA7A5A5_IA5AmATAmBBBTBTBTBTBTBTBTBTBBAkAkAk AkAkAkAkAkAkAkAkArAMAMAcArBFAkAkAkAkAkAkAkAkBFAcAM_9AMAMA7A5A5_jAdATAmBTBTBTBTBTAkAkAkBTBBAkAkAk AkAkAkAkAkAkAkAkAkArBFBFAkAkAkAkAkAkAkAkAkAkBFArAM_9_9_9A7A5A5_IA5AdAmA5BTBTAkAkAkAkAkAkBTAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkBFArAc_9_9AMAMA7A5A5AmAmAmAmBTAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkBFAcAM_9_9AMA7A5A5A5AmAmA5A5AkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkBFArAM_9_9_9AMA7A5A5A5_I_j_IA5AkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkATAkAkAkAkAkAkBFArAcAM_9_9AMA7A5A5A5A5A5Am_jAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_6A5AkAkAkAkAkAkBFArAcAM_9AMAMAMA7A5BBA5A5_IAmA5AkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_kBTAkAkAkAkAkAkBFArAcAcAMAMAMAcArArA7A5A5A5AmA5AkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkBT_IBTAkAkAkAkAkBFBFBFAcAcAcArArArAcAMAMA7A5A5A5A5A5AkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkBT_jBBAkAkAkA5BFArAcAcArArArAcAMAM_9_9AMAMA7A5A5A5A5AkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkBTBBA5A5BB_IA9BFAM_9AMAcAcAMAMAM_9_9_9_2_9AMAMA7A5A5BBBBAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkBTBB_IA5A5A5AmA5BTBFAM_9_9AcAM_9_9_9_9_k_9_2_9_9AMA7A5A5_IA5BBAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAk_6A9_jA5BBBTBBA5BTAkBFAc_9AMArAMAM_9_9_9_9_9_9AMAMAcA7A5AmAT_jA5BBAkAkAkAkAk AkAkAkAkAkAkAkAkAkATBBAkBBBTBTBTBTBTAkAkBFArAcAcBFAcAMAMAMAM_9AMAMAMAcArBFBBA5_IA5BBBBAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkBTBBBTAkAkAkBFBFArArBFArAcAMAMAMAMAMAMAcArBFBFBTA5ATAmA5BBAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkBTA5BBAkAkBB_IBFBFBFBFBFArArAcAMAMAMAcArBFBFBFBTBB_6A5_IBBAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkBT_IA5BBAkA5_jA5BFBFBFBFBFBFArArArArArBFBFBFAmA5BTA9A5_jBBAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkBB_jA5BBA5A5BBBFBFArArArBFBFBFBFBFBFBFArA7A5AmBTA5BK_IA5AkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkBT_IA5A5A5BBBTBFArAcAcAcAcArArArArArArAcAcA7A5BBA5BTA5A5BBAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkBTA5A5BTBTAkBFAcAMAcAMAcAcAcAcAcAcAcAcBTBTA5_IA5AmBTA5BBAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkBTBTAkAkBTBFAMAcAMAcAMAcAMAcAMAc_6A9_j_I_jA5BBAmA5BBBTAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkBTBFArAcAMAcAMAMAMAcAMAc_6BBBTBTBBA5BBA5A5AmA5A9_6AkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkBBBBBBBBBTA5BFAcAMAcAM_9AM_9AMAMATAcAcAcAcAcBTBTBBBBBBBTBTBB_6AkAk AkAkAkAkAkAkAkAkAkAkAkBBBBBBA5_I_j_IA5BBAmBFAcAcAM_9AM_9AM_9AMAcAMAcAcAcA5AmA5BTBTBTBBBBAkAkAkAk AkAkAkAkAkAkAkAkBBBBA5A5AmA5AmAmAmAmAmBBAmBFAcAMAcAM_9AM_9AMAMAMAcAcBBAm_7_qATAm_IA5BBBBBBAkAkAk AkAkAkAkAkAkBBA5_I_j_IAmAmAmAmAmA5A5A5BBA5BFAcAcAMAcAMAMAMAMAMAcAMBBA5AmATAp_qATAm_jA5BBBBAkAkAk AkAkAkAkBBA5AmA5AmAmAmAmA5AmA5A5BBA5BBBTA5BFArAMAcAMAcAMAcAMAcAMAcBB_IAdAT_qApAm_IA5BBBBBTBBAkAk AkAkAkBB_IA5AmAmAmA5A5A5A5BBA5BBA5BBA5BTA5BFArAcAcAcAMAcAMAcAMAcAcA5AmAmAmAmAmAm_jA5BBBTBBBTAkAk AkAkBBA5AmAmA5A5BBA5BBA5BBA5BBBBBBBBBBBBBTBFBFArAcAcAcAcAcAcAcArBBAmA5Am_IAmA5Am_IA5BBBBBTBBAkAk AkBBA5AmA5BBA5BBA5BBBBBBBBBBBTBBBTBBBTBBBTBTBFArArAcArAcArAcArAcBBA5AmA5AmAmAmAmA5A5BBBTBBBTAkAk AkBBA5A5BBA5BBBBBBBTBBBTBBBTBTBTBTBTBTBTBTBTBFBFArArAcArAcArAcArBB_j_I_jAmA5AmA5_j_IA5BTBTBTAkAk BBA5AmA5A5BBBTBBBTBTBTBTBT____________________BTBFArArArArArArArBB_IA5AmA5AmA5AmA5AmA5BBBTBTAkAk BBA5_IA5BBBBBTBT____________________Ak__Ak__BTBBBFBFArArArArArArBFBBAmA5_IA5AmA5AmA5A5BBBTBTAkAk BBA5_jA5A5BT______________Ak__Ak__Ak__Ak___yBT_IA5BFBFBFArBFArBFArBBA5A5AmA5AmA5A5A5A5A5BTBTAkAk BBBBA5_IBBBT________Ak__Ak__AkAkAkAkAk___sA5_sBTA5BB_IBFBFArBFArBFBTBBA5A5A5A5A5A5A5A5A5BBBTBTAk BTBBA5_j_IBB______Ak__AkAkAkAkAkAk____ATA5_sATATBT_yBTBBBFBFBFBFBFBFBTBBA5A5A5A5A5A5A5A5BBBTBTAk AkBTBBA5AmA5BB______Ak__AkAkAkAk__Ak__A5_sATA5__A5_sATBTBT____________BTBTBBA5A5A5BBBTBBBBBBBTAk AkBTBBBBA5_I_jBB______AkAkAkAkAkAk_______________sATA5____________________BTBTBTBTBTBBA5BBBBBT__ AkAkBTBBBBA5A5_IBBBB____AkAkAkAk__Ak______________________Ak__Ak____________BTA5A5A5A5A5BBBBBT__ AkAkAkBTBTBBBBBBBBA5BT____Ak__AkAk__Ak______________Ak__Ak__Ak__Ak__Ak__BTBTBBA5_I_j_IA5A5BT__Ak AkAkAkAkAkBTBTBTBTBT____Ak__AkAkAkAk__Ak__Ak__Ak__Ak__AkAkAkAkAk__Ak___s_yBTAmA5BBA5AmA5A5BTAk__ AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkA5_yATA5_sBTBBBTAmAmA5BBBT__Ak AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk____AT_y_yBT_yBTA5BBBT__Ak__ AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkA5_s_yA5__A5_sATBTBT__Ak__Ak AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_________sATA5____Ak__AkAk } # tile 0 (blue dragon) { AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkBZ_S_CBHBHAjAB AkAkAkAkAkAkBHBHBH_C_CAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkBZ_S_CAjABABABAkAk AkAkAkAkAkBHAjAjBHBHBH_C_CAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_S_CAjABABABABAkAkAk AkAkAkAkAkAjBF_sAjAjBHBHBH_C_CABAjBH_SBZA5AT_6_yA9A9_6ATAkAkAkAkAkAkAkAkAkBZ_CAjABABABABABAkAkAk AkAkAkAkAkAj_6BFBP_sAjAjBHBHBH_CBH__A9BH_SBBA5AT_6_yA9A9_s_6AkAkAkAkAkAk_S_CAjABABABABABABAkAkAk AkAkAkAkAkAkAj_6BFBFBP_sAjBHBHBH_CBHAjABBHBBBBBBA5AkAkAkAk_cATAkAkAkAkAk_CAjABABABABABABABABAkAk AkAkAkAkAkAkAkAj_6A7BFBPBPAjAjBHBHBHBHBHBH_CBBAkAkAkAkAkAkAkAkAkAkAkAk_SAjABABABABAj_CBZ_S_CBHAj AkAkAkAkAkAkAkAkAjATA7BFBP_sBPAjAjBHBHBHBHBH_C_CAkAkAkAkAkAkAkAkAkAkAkBHABAj_C_S_S_CBHAjABABAkAk AkAkAkAkAkAkAkAkAkAkATA7BFBPBP_sBPAjAjAjBHBHBH_C_C_CAkAkAkAkAkAkAkAk_S_C_CBHBHAjABABABABABAkAkAk AkAkAkAkAkAkAkAkAkAkAkATA7BFBPBPBP_6ANANAjBHBHBH_C_S_CAkAkAkAkAkAkAkAkAjBH_SAjABABABABABABAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkA3A7BFBPBPAnAN_BANAjBHBH_C_SBZ_CAkAkAkAkAkAkAkAkAjAB_C_SAjABABABAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAjAiAu_sAN_BBQ_BANAGBHBH_C_S_S_CAkAkAkAkAkAkAkAkAjABAj_CAjABABAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkATAuAXA7AN_BBQA9_BANAGBHBH_C_C_SBZ_CAkAkAkAkAkAkAkAkAjABAj_CAjABAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkA7AXAuA9AN_B_B_BANANAnAGBHBH_C_C_S_S_CAkAkAkAkAkAkAkAjABABAj_CABABAkAkAk AkAkAkAkAkAkAkAkAkAkAk_6AuAiA7ANANANANANAnAzAnANAGBHBH_C_C_SBZ_CAkAkAkAkAkAkAkAjABABAjAjABAkAkAk AkAkAkAkAkAkAkAkAkAkAkA7AiA7A9ANANAnANAnAzAzANANANAGBHBH_C_C_SBZ_CAkAkAkAkAkAk_CABABAB_CABAkAkAk AkAkAkAkAkAkAkAkAkAk_6AuA7ANANAnAnAzAzAzAzAnAN_BANAGBHBHBH_C_C_SBZAkAkAkAkAkBHAjABABABAjAjAkAkAk AkAkAkAkAkAkAkAkAk_6A7A7_kANANAnAzAkAkAkAzAnAnAN_BANAGBHBHBH_C_SBZ_SAkAkBHAjABABABABABAB_CAkAkAk AkAkAkAkAkAkAkAkANA7_sANAnAnAzAzAkAkAkAkAkAzAnAn_BBQANAGBHBH_C_C_SBZ_CAjABABABABABABABABAjAkAkAk AkAkAkAkAkAkAkAkAnANANAnAnAzAkAkAkAkAkAkAkAkAzANAN_BANANAGBHBH_C_SBZ_SABABABABABAkAkAkABAjAkAkAk AkAkAkAkAkAkAkAkAkAnAzAzAkAkAkAkAkAkAkAkAkAkAzAnAN_BBQANAGBHBH_C_C_S_S_CABABAkAkAkAkAkAkABAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAzAnAnANBQANANAGBHBH_C_S_S_CABAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAzANAN_BBQANAGBHBH_C_C_S_CBHAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAzAnAN_BBQ_BANAGBHBH_C_C_C_CBHAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkATAkAkAkAkAkAkAzAnAnAN_B_BANAGBHBHBHBH_C_S_CAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_c_IAkAkAkAkAkAkAzAnANAN_BANANANAGBHAjBHBH_C_SBHAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkA9ABAkAkAkAkAkAkAzAnAnANANANANANAnAnAGBHBHBH_CBHAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAB_CABAkAkAkAkAkAzAzAzAnANAnAnAnAnAnANANAGBHBHBH_CBHAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAB_CAjAkAkAk_IAzAnANAnAnAnAnANANAN_B_BANANAGBHBHBHBHAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkABAjBH_CAj_CA9AzAN_BANANANANANAN_B_BBQA9_BANANAGBHBHAjAjAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkABAj_C_CBHBH_C_CABAzANBQ_BAnAN_B_BBQBQA9BQBQ_B_BANAGBHBH_CBHAjAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAk_6A9_CBHAjABAjBHABAkAzAnANANAnANANAN_B_B_B_B_BANANANAGBH_CBZ_CBHAjAkAkAkAkAk AkAkAkAkAkAkAkAkAkATA5AkAjABABABABABAkAkAzAnANAnAzANANANANANANANANANAnAn_xAjBH_C_CAjAjAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkABAjABAkAkAkAzAzAnAnAzAnAnANANANANANANANAnAz_xABBHAT_CBHAjAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkABBHAjAkAkAj_CAzAzAzAzAzAnAnAnANANANAnAnAzAz_xABAj_6_C_CAjAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAB_CBHAjAk_C_CBHAzAzAzAzAzAzAnAnAnAnAnAzAz_x_C_CABA9_C_CAjAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAj_CBHAjBHBHAjAzAzAnAnAnAzAzAzAzAzAzAzAnAG_C_CAB_CAB_CBHAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAB_CBHBHBHAjABAzAnAnANAnANAnAnAnAnAnAnAnANAG_CAjBHAB_CBHAjAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAB_CBHABABAkAzANANAnANANAnANAnANAnANANABABAj_CBH_CABBHAjAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkABABAkAkABAzANANANANANAnANANANAn_6_k_C_C_CBHBH_C_CAjABAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkABAzAnAnANAnANANANANANAn_6A5ABABAjBHAjBHBH_C_CA9_6AkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAjAjAjAjABBHAzANANANAN_BAN_BANANATAnANAnANAnABABAjAjAjABABA5_6AkAk AkAkAkAkAkAkAkAkAkAkAkAjAjAjBH_C_C_C_CAj_CAzAnAnAN_BAN_BAN_BANANANANAnAN_C_C_CABABABAjAjAkAkAkAk AkAkAkAkAkAkAkAkAjAjBH_C_C_C_S_S_S_S_CAj_SAzANANANAN_BAN_BANANANANAnAj_C_SBZBZ_S_CBHAjAjAjAkAkAk AkAkAkAkAkAkAjBH_C_C_C_S_S_S_S_S_CBHBHAj_CAzAnANANAnANANANANANAnANAj_C_SBZBZBZBZ_S_CBHAjAjAkAkAk AkAkAkAkAjBH_C_C_S_S_S_S_C_CBHBHAjBHAjABBHAzAnANAn_BAnANANANAnANANAj_C_SBZBZBZ_S_CBHAjAjABAjAkAk AkAkAkAj_C_C_S_S_CBHBHBHBHAjBHAjBHAjBHABBHAzAnANAnANANANANAn_BAnANBH_S_S_S_S_S_S_CBHAjABAjABAkAk AkAkAj_C_S_CBHBHAjBHAjBHAjBHAjAjAjAjAjAjABAzAzAnAnANAnAnANAnANAnAj_C_C_S_C_S_C_S_CBHAjAjABAjAkAk AkAjBH_CBHAjBHAjBHAjAjAjAjAjABAjABAjABAjABABAzAnAnANAnANAzANAnAnAj_C_C_C_S_C_S_C_CBHAjABAjABAkAk AkAj_CBHAjBHAjAjAjABAjABAjABABABABABABABABABAzAzAnAnAnAzANAzANAnAj_C_C_C_C_C_C_C_C_CBHABABABAkAk AjBH_C_CBHAjABAjABABABABAB____________________ABAzAnAnAnAnAnAnAnAj_C_C_C_C_C_C_C_C_CBHAjABABAkAk AjBH_CBHAjAjABAB____________________Ak__Ak__ABAjAzAzAnAnAnAnAnAnAzAj_C_C_C_C_C_C_C_CBHAjABABAkAk AjBH_CBHBHAB______________Ak__Ak__Ak__Ak___yAB_CBHAzAzAzAnAzAnAzAnAjBH_C_C_C_C_CBHBHBHBHABABAkAk AjAj_C_CAjAB________Ak__Ak__AkAkAkAkAk___s_I_sABBHAj_CAzAzAnAzAnAzABAjBHBHBHBHBHBHBHBHBHAjABABAk ABAjBH_C_CAj______Ak__AkAkAkAkAkAk____ATA5_s_6ATAB_yABAjAzAzAzAzAzAzABAjBHBHBHBHBHBHBHBHAjABABAk AkABAjBH_C_CAj______Ak__AkAkAkAk__Ak__Am_sAT_j___I_sATABAB____________ABABAjBHBHBHAjABAjAjAjABAk AkABAjAjBH_C_CAj______AkAkAkAkAkAk___________v___sAT_I____________________ABABABABABAjBHAjAjAB__ AkAkABAjAjBHBH_CAjAj____AkAkAkAk__Ak______________________Ak__Ak____________ABBHBHBHBHBHAjAjAB__ AkAkAkABABAjAjAjAjBHAB____Ak__AkAk__Ak______________Ak__Ak__Ak__Ak__Ak__ABABAjBH_C_C_CBHBHAB__Ak AkAkAkAkAkABABABABAB____Ak__AkAkAkAk__Ak__Ak__Ak__Ak__AkAkAkAkAk__Ak___s_yAB_CBHAj_C_S_CBHABAk__ AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_I_yAT_I_sABAjAB_S_CBHAjAB__Ak AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk____AT_y_yAB_yABBHAjAB__Ak__ AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkA5_s_y_j___I_sATABAB__Ak__Ak AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_________sAT_I____Ak__AkAk } # tile 0 (green dragon) { AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkBRBI_dAyAy_UAe AkAkAkAkAkAkAyAyAy_d_dAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkBRBI_d_UAeAeAeAkAk AkAkAkAkAkAy_U_UAyAyAy_d_dAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkBI_d_UAeAeAeAeAkAkAk AkAkAkAkAk_UBF_s_U_UAyAyAy_d_dAe_UAyBIBRA5AT_6_yA9A9_6ATAkAkAkAkAkAkAkAkAkBR_d_UAeAeAeAeAeAkAkAk AkAkAkAkAk_U_6BFBP_s_U_UAyAyAy_dAy__A9AyBIBBA5AT_6_yA9A9_s_6AkAkAkAkAkAkBI_d_UAeAeAeAeAeAeAkAkAk AkAkAkAkAkAk_U_6BFBFBP_s_UAyAyAy_dAy_UAeAyBBBBBBA5AkAkAkAk_cATAkAkAkAkAk_d_UAeAeAeAeAeAeAeAeAkAk AkAkAkAkAkAkAk_U_6A7BFBPBP_U_UAyAyAyAyAyAy_dBBAkAkAkAkAkAkAkAkAkAkAkAkBI_UAeAeAeAe_U_dBRBI_dAy_U AkAkAkAkAkAkAkAk_UATA7BFBP_sBP_U_UAyAyAyAyAy_d_dAkAkAkAkAkAkAkAkAkAkAkAyAe_U_dBIBI_dAy_UAeAeAkAk AkAkAkAkAkAkAkAkAkAkATA7BFBPBP_sBP_U_U_UAyAyAy_d_d_dAkAkAkAkAkAkAkAkBI_d_dAyAy_UAeAeAeAeAeAkAkAk AkAkAkAkAkAkAkAkAkAkAkATA7BFBPBPBP_6A4_8_UAyAyAy_dBI_dAkAkAkAkAkAkAkAk_UAyBI_UAeAeAeAeAeAeAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkA3A7BFBPBPA4A4_8A4_UAyAy_dBIBR_dAkAkAkAkAkAkAkAk_UAe_dBI_UAeAeAeAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAk_UAiAu_s_8_8_o_8_8AGAyAy_dBIBI_dAkAkAkAkAkAkAkAk_UAe_U_d_UAeAeAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkATAuAXA7A4_8_oAw_8A4AGAyAy_d_dBIBR_dAkAkAkAkAkAkAkAk_UAe_U_d_UAeAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkA7AXAuA9_8_8_8_8_8A4_zAGAyAy_d_dBIBI_dAkAkAkAkAkAkAk_UAeAe_U_dAeAeAkAkAk AkAkAkAkAkAkAkAkAkAkAk_6AuAiA7A4_8A4_8A4A4_HA4_8AGAyAy_d_dBIBR_dAkAkAkAkAkAkAk_UAeAe_U_UAeAkAkAk AkAkAkAkAkAkAkAkAkAkAkA7AiA7A9_8A4A4A4_z_H_H_8A4A4AGAyAy_d_dBIBR_dAkAkAkAkAkAk_dAeAeAe_dAeAkAkAk AkAkAkAkAkAkAkAkAkAk_6AuA7A4A4A4_z_H_H_H_H_zA4_8_8AGAyAyAy_d_dBIBRAkAkAkAkAkAy_UAeAeAe_U_UAkAkAk AkAkAkAkAkAkAkAkAk_6A7A7A9_8A4_z_HAkAkAk_H_z_H_8_8A4AGAyAyAy_dBIBRBIAkAkAy_UAeAeAeAeAeAe_dAkAkAk AkAkAkAkAkAkAkAkA4A7_sA4A4_z_H_HAkAkAkAkAk_H_zA4_8_o_8AGAyAy_d_dBIBR_d_UAeAeAeAeAeAeAeAe_UAkAkAk AkAkAkAkAkAkAkAk_zA4_8A4_z_HAkAkAkAkAkAkAkAk_HA4A4_8_8A4AGAyAy_dBIBRBIAeAeAeAeAeAkAkAkAe_UAkAkAk AkAkAkAkAkAkAkAkAk_z_H_HAkAkAkAkAkAkAkAkAkAk_H_z_8_8_oA4AGAyAy_d_dBIBI_dAeAeAkAkAkAkAkAkAeAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_H_zA4A4_o_8_8AGAyAy_dBIBI_dAeAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_HA4_8_8_8A4AGAyAy_d_dBI_dAyAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_H_zA4_8_o_8_8AGAyAy_d_d_d_dAyAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkATAkAkAkAkAkAk_H_zA4_8_8_8A4AGAyAyAyAy_dBI_dAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_c_IAkAkAkAkAkAk_H_zA4A4_8_8A4_8AGAy_UAyAy_dBIAyAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkA9AeAkAkAkAkAkAk_H_zA4A4_8A4_8A4_z_zAGAyAyAy_dAyAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAe_dAeAkAkAkAkAk_H_H_HA4A4A4_z_z_zA4A4_8AGAyAyAy_dAyAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAe_d_UAkAkAk_I_H_zA4A4_z_z_zA4A4_8_8_8A4_8AGAyAyAyAyAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAe_UAy_d_U_dA9Aq_8_8A4A4A4_8A4_8_8_8_oAw_8_8A4AGAyAy_U_UAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAe_U_d_dAyAy_d_dAe_HA4_o_8A4A4_8_8_o_oAw_o_o_8_8A4AGAyAy_dAy_UAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAk_6A9_dAy_UAe_UAyAeAk_HA4A4_8_z_8_8A4_8_8_8_8_8A4_8A4AGAy_dBR_dAy_UAkAkAkAkAk AkAkAkAkAkAkAkAkAkATA5Ak_UAeAeAeAeAeAkAk_H_zA4A4_HA4A4_8A4_8A4_8A4_8A4_z_x_UAy_d_d_U_UAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAe_UAeAkAkAk_H_H_z_z_H_zA4A4_8A4_8A4_8A4_z_H_xAeAyAT_dAy_UAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAeAy_UAkAk_U_d_H_H_H_H_H_z_zA4_8A4_8_z_z_H_H_xAe_U_6_d_d_UAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAe_dAy_UAk_d_dAy_H_H_H_H_H_H_z_z_z_z_z_H_H_x_d_dAeA9_d_d_UAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_U_dAy_UAyAy_U_H_H_z_z_z_H_H_H_H_H_H_H_zAG_d_dAe_dAe_dAyAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAe_dAyAyAy_UAe_H_zA4A4A4A4_z_z_z_z_z_zA4A4AG_d_UAyAe_dAy_UAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAe_dAyAeAeAk_HA4_8A4A4A4A4A4A4A4A4A4A4AeAe_U_dAy_dAeAy_UAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAeAeAkAkAe_HA4A4A4A4_8A4_8A4A4A4_6A9_d_d_dAyAy_d_d_UAeAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAe_H_zA4_8A4_8A4A4A4_8A4_6A5AeAe_UAy_UAyAy_d_dA9_6AkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_U_U_U_UAeAy_HA4_8A4A4_8_8_8_8A4ATA4A4A4A4A4AeAe_U_U_UAeAeA5_6AkAk AkAkAkAkAkAkAkAkAkAkAk_U_U_UAy_d_d_d_d_U_d_HA4A4A4_8_8_8A4_8A4A4_8A4A4A4_d_d_dAeAeAe_U_UAkAkAkAk AkAkAkAkAkAkAkAk_U_UAy_d_d_dBIBIBIBI_d_UBI_HA4_8A4A4_8A4_8_8_8A4A4A4_U_dBIBRBRBI_dAy_U_U_UAkAkAk AkAkAkAkAkAk_UAy_d_d_dBIBIBIBIBI_dAyAy_U_d_HA4A4A4A4_8A4_8A4A4A4_8_U_dBIBRBRBRBRBI_dAy_U_UAkAkAk AkAkAkAk_UAy_d_dBIBIBIBI_d_dAyAy_UAy_UAeAy_H_H_8A4_8A4_8A4_8A4A4A4_U_dBIBRBRBRBI_dAy_U_UAe_UAkAk AkAkAk_U_d_dBIBI_dAyAyAyAy_UAy_UAy_UAyAeAy_H_zA4A4A4A4A4A4A4_8A4A4AyBIBIBIBIBIBI_dAy_UAe_UAeAkAk AkAk_U_dBI_dAyAy_UAy_UAy_UAy_U_U_U_U_U_UAe_H_H_zA4A4A4A4A4A4A4_z_U_d_dBI_dBI_dBI_dAy_U_UAe_UAkAk Ak_UAy_dAy_UAy_UAy_U_U_U_U_UAe_UAe_UAe_UAeAe_H_z_zA4_zA4_zA4_zA4_U_d_d_dBI_dBI_d_dAy_UAe_UAeAkAk Ak_U_dAy_UAy_U_U_UAe_UAe_UAeAeAeAeAeAeAeAeAe_H_H_z_zA4_zA4_zA4_z_U_d_d_d_d_d_d_d_d_dAyAeAeAeAkAk _UAy_d_dAy_UAe_UAeAeAeAeAe____________________Ae_H_z_z_z_z_z_z_z_U_d_d_d_d_d_d_d_d_dAy_UAeAeAkAk _UAy_dAy_U_UAeAe____________________Ak__Ak__Ae_U_H_H_z_z_z_z_z_z_H_U_d_d_d_d_d_d_d_dAy_UAeAeAkAk _UAy_dAyAyAe______________Ak__Ak__Ak__Ak___yAe_dAy_H_H_H_z_H_z_H_z_UAy_d_d_d_d_dAyAyAyAyAeAeAkAk _U_U_d_d_UAe________Ak__Ak__AkAkAkAkAk___s_I_sAeAy_U_d_H_H_z_H_z_HAe_UAyAyAyAyAyAyAyAyAy_UAeAeAk Ae_UAy_d_d_U______Ak__AkAkAkAkAkAk____ATA5_s_6ATAe_yAe_U_H_H_H_H_H_HAe_UAyAyAyAyAyAyAyAy_UAeAeAk AkAe_UAy_d_d_U______Ak__AkAkAkAk__Ak__Am_sAT_j___I_sATAeAe____________AeAe_UAyAyAy_UAe_U_U_UAeAk AkAe_U_UAy_d_d_U______AkAkAkAkAkAk___________v___sAT_I____________________AeAeAeAeAe_UAy_U_UAe__ AkAkAe_U_UAyAy_d_U_U____AkAkAkAk__Ak______________________Ak__Ak____________AeAyAyAyAyAy_U_UAe__ AkAkAkAeAe_U_U_U_UAyAe____Ak__AkAk__Ak______________Ak__Ak__Ak__Ak__Ak__AeAe_UAy_d_d_dAyAyAe__Ak AkAkAkAkAkAeAeAeAeAe____Ak__AkAkAkAk__Ak__Ak__Ak__Ak__AkAkAkAkAk__Ak___s_yAe_dAy_U_dBI_dAyAeAk__ AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_I_yAT_I_sAe_UAeBI_dAy_UAe__Ak AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk____AT_y_yAe_yAeAy_UAe__Ak__ AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkA5_s_y_j___I_sATAeAe__Ak__Ak AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_________sAT_I____Ak__AkAk } # tile 0 (yellow dragon) { AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_Z_ZAAA0A0_A_X AkAkAkAkAkAkA0A0A0AAAAAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_Z_ZAA_A_X_X_XAkAk AkAkAkAkAkA0_A_AA0A0A0AAAAAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_ZAAA0_X_X_X_XAkAkAk AkAkAkAkAk_ABF_s_A_AA0A0A0AAAA_X_AA0_Z_TA5AT_6_yA9A9_6ATAkAkAkAkAkAkAkAkAk_ZAA_A_X_X_X_X_XAkAkAk AkAkAkAkAk_A_6BFBP_s_A_AA0A0A0AAA0__A9A0_ZBBA5AT_6_yA9A9_s_6AkAkAkAkAkAk_ZAA_A_X_X_X_X_X_XAkAkAk AkAkAkAkAkAk_A_6BFBFBP_s_AA0A0A0AAA0_A_XA0BBBBBBA5AkAkAkAk_cATAkAkAkAkAkAA_A_X_X_X_X_X_X_X_XAkAk AkAkAkAkAkAkAk_A_6A7BFBPBP_A_AA0A0A0A0A0A0AABBAkAkAkAkAkAkAkAkAkAkAkAk_Z_A_X_X_X_X_AAA_Z_ZAAA0_A AkAkAkAkAkAkAkAk_AATA7BFBP_sBP_A_AA0A0A0A0A0AAAAAkAkAkAkAkAkAkAkAkAkAkA0_X_AAA_Z_ZAAA0_A_X_XAkAk AkAkAkAkAkAkAkAkAkAkATA7BFBPBP_sBP_A_A_AA0A0A0AAAAAAAkAkAkAkAkAkAkAk_ZAAAAA0A0_A_X_X_X_X_XAkAkAk AkAkAkAkAkAkAkAkAkAkAkATA7BFBPBPBP_6As_4_AA0A0A0AA_ZAAAkAkAkAkAkAkAkAk_AA0_Z_A_X_X_X_X_X_XAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkA3A7BFBPBPAs_4_T_4_AA0A0AA_Z_ZAAAkAkAkAkAkAkAkAk_A_XAA_Z_A_X_X_XAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAk_AAiAu_s_4_T_T_T_4AAA0A0AA_Z_ZAAAkAkAkAkAkAkAkAk_A_X_AAA_A_X_XAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkATAuAXA7_4_T_T_b_T_4AAA0A0AAAA_Z_TAAAkAkAkAkAkAkAkAk_A_X_AAA_A_XAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkA7AXAuA9_4_T_T_T_4AsBWAAA0A0AAAA_Z_ZAAAkAkAkAkAkAkAk_A_X_X_AAA_X_XAkAkAk AkAkAkAkAkAkAkAkAkAkAk_6AuAiA7_4_4_4_4_4As_AAs_4AAA0A0AAAA_Z_ZAAAkAkAkAkAkAkAk_A_X_X_A_A_XAkAkAk AkAkAkAkAkAkAkAkAkAkAkA7AiA7A9_4AsAsAsBW_z_X_4_4_4AAA0A0AAAA_Z_TAAAkAkAkAkAkAkAA_X_X_XAA_XAkAkAk AkAkAkAkAkAkAkAkAkAk_6AuA7As_4AsBW_A_X_A_XBWAs_T_4AAA0A0A0AAAA_Z_ZAkAkAkAkAkA0_A_X_X_X_A_AAkAkAk AkAkAkAkAkAkAkAkAk_6A7A7A9_4AsBW_XAkAkAk_zBWBW_4_T_4AAA0A0A0AA_Z_T_ZAkAkA0_A_X_X_X_X_X_XAAAkAkAk AkAkAkAkAkAkAkAkAsA7_sAsAsBW_X_zAkAkAkAkAk_ABWAs_T_T_4AAA0A0AAAA_1_TAA_A_X_X_X_X_X_X_X_X_AAkAkAk AkAkAkAkAkAkAkAkBW_4_4AsBW_AAkAkAkAkAkAkAkAk_XAs_4_T_4_4AAA0A0AA_Z_Z_Z_X_X_X_X_XAkAkAk_X_AAkAkAk AkAkAkAkAkAkAkAkAkBW_X_XAkAkAkAkAkAkAkAkAkAk_zBW_4_T_T_TAAA0A0AAAA_Z_ZAA_X_XAkAkAkAkAkAk_XAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_ABWAs_T_T_4_4AAA0A0AA_Z_ZAA_XAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_XAs_4_T_T_4AAA0A0AAAA_ZAAA0AkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_ABW_4_T_T_T_4AAA0A0AAAAAAAAA0AkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkATAkAkAkAkAkAk_zBWAs_4_T_T_4AAA0A0A0A0AA_ZAAAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_c_IAkAkAkAkAkAk_XBWAs_4_T_4_4_4AAA0_AA0A0AA_ZA0AkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkA9_XAkAkAkAkAkAk_ABWAsAs_4_4_4AsBWBWAAA0A0A0AAA0AkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAk_XAA_XAkAkAkAkAk_X_z_XAsAsAsBWBWBWAs_4_4AAA0A0A0AAA0AkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAk_XAA_AAkAkAk_I_XBWAsAsBWBWBWAs_4_4_T_T_4_4AAA0A0A0A0AkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAk_X_AA0AA_AAAA9_z_4_T_4AsAs_4_4_4_T_T_T_b_T_4_4AAA0A0_A_AAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAk_X_AAAAAA0A0AAAA_X_X_4_T_TAs_4_T_T_T_T_b_T_T_T_T_4AAA0A0AAA0_AAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAk_6A9AAA0_A_X_AA0_XAk_AAs_T_4BW_4_4_T_T_T_T_T_T_4_4AsAAA0AA_ZAAA0_AAkAkAkAkAk AkAkAkAkAkAkAkAkAkATA5Ak_A_X_X_X_X_XAkAk_XBWAsAs_AAs_4_4_4_4_T_4_4_4AsBW_A_AA0_ZAA_A_AAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAk_X_A_XAkAkAk_X_zBWBW_XBWAs_4_4_4_4_4_4AsBW_X_A_XA0ATAAA0_AAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAk_XA0_AAkAk_AAA_A_X_z_X_zBWBWAs_4_4_4AsBW_A_z_A_X_A_6AAAA_AAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAk_XAAA0_AAkAAAAA0_z_X_A_X_A_XBWBWBWBWBW_z_X_AAAAA_XA9AAAA_AAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_AAAA0_AA0A0_A_A_XBWBWBW_z_A_X_A_X_A_XBWAAAAAA_XAA_XAAA0AkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_XAAA0A0A0_A_X_zBWAsAsAsAsBWBWBWBWBWBWAsAsAAAA_AA0_XAAA0_AAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_XAAA0_X_XAk_XAs_4As_4AsAsAsAsAsAsAsAs_X_X_AAAA0AA_XA0_AAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_X_XAkAk_X_A_4As_4As_4As_4As_4As_6A9AAAAAAA0A0AAAA_A_XAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_X_XBWAs_4As_4_4_4As_4As_cA5_X_X_AA0_AA0A0AAAAA9_6AkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_A_A_A_A_XA0_zAs_4As_4_T_4_T_4_4ATAsAsAsAsAs_X_X_A_A_A_X_XA5_6AkAk AkAkAkAkAkAkAkAkAkAkAk_A_A_AA0AAAAAAAA_AAA_AAsAs_4_T_4_T_4_T_4As_4AsAsAsAAAAAA_X_X_X_A_AAkAkAkAk AkAkAkAkAkAkAkAk_A_AA0AAAAAA_Z_Z_Z_ZAA_A_Z_XAs_4As_4_T_4_T_4_4_4AsAs_AAA_Z_T_Z_ZAAA0_A_A_AAkAkAk AkAkAkAkAkAk_AA0AAAAAA_Z_Z_Z_Z_ZAAA0A0_AAA_zAsAs_4As_4_4_4_4_4As_4_AAA_Z_Z_Z_T_Z_ZAAA0_A_AAkAkAk AkAkAkAk_AA0AAAA_Z_Z_Z_ZAAAAA0A0_AA0_A_XA0_XBW_4As_4As_4As_4As_4As_AAA_Z_T_T_Z_ZAAA0_A_A_X_AAkAk AkAkAk_AAAAA_Z_ZAAA0A0A0A0_AA0_AA0_AA0_XA0_ABWAsAsAs_4As_4As_4AsAsA0_Z_Z_Z_1_Z_ZAAA0_A_X_A_XAkAk AkAk_AAA_ZAAA0A0_AA0_AA0_AA0_A_A_A_A_A_A_X_z_XBWAsAsAsAsAsAsAsBW_AAAAA_ZAA_ZAA_ZAAA0_A_A_X_AAkAk Ak_AA0AAA0_AA0_AA0_A_A_A_A_A_X_A_X_A_X_A_X_X_ABWBWAsBWAsBWAsBWAs_AAAAAAA_ZAA_ZAAAAA0_A_X_A_XAkAk Ak_AAAA0_AA0_A_A_A_X_A_X_A_X_X_X_X_X_X_X_X_X_z_XBWBWAsBWAsBWAsBW_AAAAAAAAAAAAAAAAAAAA0_X_X_XAkAk _AA0AAAAA0_A_X_A_X_X_X_X_X_____________________X_XBWBWBWBWBWBWBW_AAAAAAAAAAAAAAAAAAAA0_A_X_XAkAk _AA0AAA0_A_A_X_X____________________Ak__Ak___X_A_z_XBWBWBWBWBWBW_X_AAAAAAAAAAAAAAAAAA0_A_X_XAkAk _AA0AAA0A0_X______________Ak__Ak__Ak__Ak___y_XAAA0_A_z_XBW_XBW_ABW_AA0AAAAAAAAAAA0A0A0A0_X_XAkAk _A_AAAAA_A_X________Ak__Ak__AkAkAkAkAk___s_I_s_XA0_AAA_X_ABW_zBW_X_X_AA0A0A0A0A0A0A0A0A0_A_X_XAk _X_AA0AAAA_A______Ak__AkAkAkAkAkAk____AT_I_s_6AT_X_y_X_A_z_X_A_z_A_z_X_AA0A0A0A0A0A0A0A0_A_X_XAk Ak_X_AA0AAAA_A______Ak__AkAkAkAk__Ak__A5_sAT_j___I_sAT_X_X_____________X_X_AA0A0A0_A_X_A_A_A_XAk Ak_X_A_AA0AAAA_A______AkAkAkAkAkAk____AR_________sAT_I_____________________X_X_X_X_X_AA0_A_A_X__ AkAk_X_A_AA0A0AA_A_A____AkAkAkAk__Ak______________________Ak__Ak_____________XA0A0A0A0A0_A_A_X__ AkAkAk_X_X_A_A_A_AA0_X____Ak__AkAk__Ak______________Ak__Ak__Ak__Ak__Ak___X_X_AA0AAAAAAA0A0_X__Ak AkAkAkAkAk_X_X_X_X_X____Ak__AkAkAkAk__Ak__Ak__Ak__Ak__AkAkAkAkAk__Ak___s_y_XAAA0_AAA_ZAAA0_XAk__ AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_I_yAT_I_s_X_A_X_ZAAA0_A_X__Ak AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk____AT_y_y_X_y_XA0_A_X__Ak__ AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkA5_s_y_j___I_sAT_X_X__Ak__Ak AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_________sAT_I____Ak__AkAk } # tile 0 (hill giant) { AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_K_f_f_fAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_KBG_K_f_f_f_KAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_f_f_f_f_f_f_f_f_KAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_fAb_f_DAb_P_D_f_fAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkBLBEBLA8_G_P_f_f_fAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_GBL_G_V_P_P_fA8_fAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkBEBLAbBLA8_P_fAb_fAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_PBLBL_PB_Ab_P_fAHAHAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_P_P_PA8_G_PA8At_PAHAH_X_XAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAbA8A8Ab_PBLA8_V_PBB_X_X_X_GAb_PAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAbBLBLBEBLBLA8Ab_P_P_A_A_X_VA8BLBLBL_JA8AkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAk_G_JBL_JBLBLBE_JBLA0_A_A_X_GA8BLBL_JBEBLBL_JAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkBLAwBEBL_J_JBL_J_ZA0A0_AA8BLBLBL_JBEA9BL_GBLBLAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAk_P_J_JA9BEBEBLBL_Z_ZAA_AA8BLBLA8BLBLBLBE_JA8BLA8AkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAk_PBL_J_JBEBOBLBL_Z_ZA0_JBLBLA8A8BL_GBL_JBLBLA8AbAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAk_PA8BL_JBLBLA8A0AAAABA_JBLBLA8_PA8BL_GBLBLA8BLBLAbAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAk_GA8BLBLBL_GA0A0A0_JBLBLA8A8BB_VA8_V_P_GAaBLBLBL_GAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAk_V_I_GA8A8Ab_A_AA0_ABLBLA8A8AbBB_P_G_t_V_PBLBEBLA8_g_VAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkA8BL_G_gAb_GAa_X_X_A_AA8A8A8_G_PAfBB_P_P_P_P_GBLBL_GA8_G_PAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkA8BLBLA8_gA8At_X_X_A_X_XAb_GAa_PBBBBBBBBBB_P_P_P_PAbA8BLA8AbAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAbBLBE_JBL_G_VA8_X_A_X_A_X_AA8A8Ab_P_PBBBBAkAk_PA8BLBL_JBLBLAaAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAk_PBL_JBLBLA8_P_PAb_X_X_A_X_A_A_AA8A8_V_PBBAkAkAkA8BLAw_JBLBL_J_tAkAkAkAkAkAkAkAkAk AkAkAkAkAkAbBLBLBLBLBL_G_P_P_P_X_X_A_A_A_A_AA0_XA8_G_PAkAkAkAkBLBEBDBLA8BLBL_PAkAkAkAkAkAkAkAkAk AkAkAkAkBLBL_JBEBLBLA8_V_PAk_X_X_A_A_A_A_AA0_A_A_X_X_PAkAkAk_G_J_J_JBL_PBLA8_PAkAkAkAkAkAkAkAkAk AkAkAkAbBLBLBLBLBLBL_G_PAkAk_X_A_A_AA0_AA0_AA0_A_A_X_XAkAkAkA8_JBL_J_GA8A8_GAkAkAkAkAkAkAkAkAkAk AkAkAkA8BL_J_G_JA8_V_PAkAkAk_X_X_AA0_AA0A0A0_A_A_X_A_X_XAkAkBL_JBLAbA8A8A8_PAkAkAkAkAkAkAkAkAkAk AkAkAkAbBC_GAaA8BL_G_PAkAkAk_X_A_A_AA0A0A0A0A0A0_A_X_X_PAbA8BLBLBLA8A8A8_PAkAkAkAkAkAkAkAkAkAkAk AkAkAkAk_PAbA8_G_V_PAkAkAkAkA__X_AA0A0A0A0A0A0A0_A_X_GBL_JBLBLA8A8A8A8_PAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAk_P_P_V_tAkAkAkAkAkA_A__X_AA0AAA0A0A0_A_X_XA8A8BL_JBLA8A8A8_PAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkA__X_AA0AAA0AAA0_A_X_AA8_PBL_JBLA8A8A8_PAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkA_A__X_AA0_Z_ZAAA0_A_XBL_J_JBLB_A8A8A8AkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkA_A__XA0AA_ZAAA0_A_X_X_P_GBLBLA8A8A8_GAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkA_A__AA0AA_ZAAA0_A_XA__PAaA8BLA8A8_PAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkBB_X_AAAA0AAA0_A_X_XA_A__P_GA8A8_PAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkBBBB_A_AA0A0_A_X_XA_A__PAkAk_P_PAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkBBBB_PA8BL_JBLBLA8Ab_P_PAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkBB_PBLBLBE_JBLA8A8_G_PAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkBB_GBL_JBE_JBL_GA8_V_PAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkBB_VBLA9BL_JA8AaA8_G_PAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_PA8_JBE_JBLA8_w_7_P_PBLAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_PA8BL_JBLBL_GA8Ab_P_VA8BLAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_PBL_JBLBLA8A8Aa_P_P_GA8A8A8AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAbBLBL_JBLA8_GAb_PAf_P_VA8_GAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_GBL_JBLA8A8_7_P_PBBBB_t_VAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAa_JBL_JBLA8A8_G_PBBBB_P_PAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_GBE_JBL_JBLBLA8_V_PBB_P______AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAbA9BEBEBL_JBLBL_G_PBB____________Ak__AkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_PBL_JBL_JBL_JAwBL_V________________Ak__AkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_P_GBLBLBLBLBL_JBL_G__________________Ak__AkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_g_GA8BL_J_GBLA8_P__Ak________________Ak__Ak__AkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_P_P_VA8BLA8_G_V_PAk__Ak________________Ak__AkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_P_PA8BLBLA8_PAk__Ak____________________Ak__AkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_P_G_PA8BLA8_PAkAk__Ak________________Ak__AkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_P_P_VBLA8BL_PAk__Ak________________Ak__Ak__AkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_P_PA8BLA8_PAkAk____________________Ak__AkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_P_g_GA8BLAbAk__Ak________________Ak__AkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_P_PAbA8A8At_P__________________Ak__AkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_GA8A8A8A8A8_P________________Ak__AkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_VBLBL_JBLBLA8_P__________Ak__Ak__AkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_GBLBL_JBLBLA8_V_P________Ak__Ak__AkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkBLA8BL_J_JBLBLA8_G_P____________Ak__AkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAk_PAb_PBLBLA8_GAa_P_P________Ak__AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_PAaA8_G_P_P______Ak__Ak__AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_P_P_P______Ak__Ak__AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk } # tile 0 (Vlad the Impaler) { AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkA9A9AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk Ak_y_yA9AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAk_yA9A9AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAk_yALA9AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAhAL_yA9AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAh_yA9AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAhAh_yA9AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAL_yA9AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkALAhA9A9AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkALAhA9A9AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkA$AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAhAh_yA9A9AkAkAkAkAkAkAkAkAkAkAkAkA$BCA$AkA$AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAhAk_yA9ALAkAkAkAkAkAkAkAkAkAkAkA$A$BCBCA$AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAk_y_yA9A9AkAkAkAkAkAkAkAkAkA$A$BCA$BCA$AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAk_y_yA9AkAkAkAkAkAkAkAkAkA$BCA$BCA$BCAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAh_yA9A9AkAkAkAkAkAkAkA$A$BCA$BCA$AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAhAh_yA9AkAkAkAkAkAkAkA$AQAQAmBCA$AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAh_yA9A9AkAkAkAkAkAkAmAVAQAQ_LBCAk_3_OBL_wBL_wAhAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAh_y_yA9AkAkAkAkAkAk_LAVAQAQAdAaBNBNBN_3_O_O_OBL_wAhAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAk_y_yA9A9AkAkAkAkAkAkAWAmAQ_uBKBKBKBNBNAhAhAh_O_OAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAk_yAhA9AkAkAkAkAkAkAkAm_3_3BKBKBKBKBKBNBNBNAhAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAk_yAhAhA9AkAkAkAkAkAkAhBL_3BNBNBTBKBBBTBTBTAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkALAhA9AkAkAkAkAk_3_w_O_3BNBTBTBKBBBKBTBTAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkALAhA9A9AkAkAkAk_OBL_3AhBNBKBTBKBKBKBTBTAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkALAh_yA9AkAkAkAk_3_w_OAhBNBKBKBTBKBBBKBTBTAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAhAhAhA9A9AkAk_OBL_O_3AhBTBTBKBTBKBBBBBTBTAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAhAkAhA9A9AkAk_3_w_OAhBNBKBTBKBKBTBKBBBKBTAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAhAkAh_yA9A9Ak_OBL_3AhBNBKBTBBBKBTBKBKBKBTAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAh_yALA9Ak_3_3AhBNBNBKBTBBBKBKBTBKBBBKBTAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAk_y_yA9AkAkBZAhBNA1BKBTBTBBBKBTBTBBBKBKAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAh_yA9A9AkBZAjAjA1BKBTBTBBBKBTBTBKBBBKBTAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkALAh_yA9AkAkBZAjA1BKBTBTBBBKBTBTBKBBBKBTBTAkAkAkAk______________AkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkALAh_yA9A9AkBZAjA1BKBKBTBBBBBKBTBKBKBKBKBTAkAk__________________AkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_y_yA$A9AkBZ_CAjA1BKBTBKBBBKBKBTBKBBBBBKBT______________________Ak AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_yBCA$A9A$_CAjA1BBBTBTBBBKBKBTBKBKBBBKBTBTBT__________________Ak AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_y_yBCA$A$AjABA1BBBTBTBTBBBKBKBTBKBBBKBKBTBTBT________________Ak AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkA$A$A$A$BZAjABA1BBBKBTBTBBBBBKBTBKBKBBBKBKBTBTBT______________Ak AkAkAkAkAkAkAkAkAkAkAkAkAkA$A$A$A$A$A$BCBZABA1A1BBBKBTBKBBBBBKBTBTBKBKBBBKBKBTBTBT________AkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkBC_gBC_RBCBCBZAjABA1AjBBBKBTBTBKBBBKBKBTBTBKBBBBBKBTBT__________AkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkBZAjABA1AjBBBBBKBTBKBBBBBKBTBTBKBKBBBBBBBT________AkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAQAQAB_RAjBBBBBKBTBKBBBBBKBKBTBTBKBKBKBB________AkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAQAQAQ_R_RBBBBBKBTBKBKBBBBBKBTBTBTBKBK________AkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAQAQ_R_RAjBBBKBTBTBKBBBBBKBKBTBTBKBK________AkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkA$A$_RAjBBBKBTBTBKBBBBBBBKBTBTBKBK______AkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkA$A$AjBBBKBTBTBKBKBBBBBBBKBTBTBK______AkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkBZAjABBBBKBTBTBKBKBBBBBBBKBTBTBT____AkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkBZAjABBBBKBTBTBKBKBKBBBBBKBKBTBT____AkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAjBZBZABBBBKBTBTBKBKBKBKBBBKBKBTBT__AkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAjBZAjABBBBKBTBTBTBKBKBKBBBBBKBKBK__AkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAjBZAjABBBBKBKBTBTBKBKBKBKBBBBBK__AkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkBZBZAjBBBBBKBKBTBTBTBKBKBKBBBBBB__AkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkBZAjABBBBBBKBKBTBTBTBKBKBK________AkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAjBZAjABBBBBBKBKBTBTBTBKBKBK____AkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAjBZAjABBBBBBBBKBTBTBTBTBK____AkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkBZAjAjABBBBBBBBKBKBTBTBTBK____AkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkBZAjAjABBBBBBBBKBKBTBTBTBT__AkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk__BBBZAjABBBBBBBBBBKBKBTBTBT____AkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk__BBBTBTAjABBBBBBBBBBKBKBTBT____AkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk__BTBTBTBTABBBBBBBBBBKBKBT____AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk__BTBT____BBBBBBBBBK____AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk____________BBBB____AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk__________AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk } # tile 0 (giant eel) { AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkBKBKBKBKAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkBKBKBK_I_j_IBKBKAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkBKBKBKAdAdBKBKBTAmA5_I_j_IAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkBKBKAdBKBKBKBKBKBKBKBKBKAT_qATAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkBKBKAdBKBKBKBTBTBTAdAdBKBK_I_I_I_6ATAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkBKBKAdBKBKBTBTBTBTAd_I_jAdAdBKBKATA5Am_IAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkBKBKAdBTALALBTBTAPAdAdAdAmA5AdBK_qAIAT_qATAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkBK_IBKBTALBTBTAPA6_rAdA5AdBTBK_IBK_IAmATApAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkBK_jBTBTBTAPAxAPBT_vAdAmBTBTBKA5BK_qAT_I_qAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkBKBTBTBTAPBUAkAkAkAkAP_vBTBTBKBKAm_$AI_q_IA5AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAk_vARAxAPAkAkAkAkAkAPBTBTBTBTBKA5BK_IA3_cATAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAPAPBTBTBKATBK_qA5_IATAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAxBUBTBTBTAdBKA3_cATAmA3AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAk_p_p_p_p_p_pAkAkAkAkAPAPAxBTBTBKAdBK_IAT_q_IAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAk_p_p_p_p_p_p_p_pAkAkAkAkAPBUAPBTBTAdBKATAmAIATAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAk_p_p_p_p_p_p_p_p_p_p_pAkAkAxAPBTBTBTBKAdBKATAmAT_cAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAk_p_p_p_p_p_p_p_p_p_p_p_p_p_pAkAP_vAPBTBTAdBKADATAmA3AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAk_p_p_p_p_p_p_p_p_p_p_p_p_p_p_pBTAPBUBTBTBKAdBK_jATAmAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAk_p_p_p_pAkAk_p_p_p_p_p_p_p_p_p_pAEBXBTBTBKAdBKATAmATATAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAk_p_p_p_p_p_p_p_pAP_vBTBTBTBKAdBKATAmAT_pAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_p_p_p_p_p_vBTAPAPBTBKAdBKBKBB_p_pAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_p_p_p_pAPA6BTBTBTBKAdBK_p_p_pAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_p_p_p_pAPAPBTBTBK_p_p_pAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_p_p_p_p_p_p_p_p_pAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_p_p_pAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk } # tile 0 (electric eel) { AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_T_T_T_T_TAkAkAkAk_TAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkBKBKBKBKAkAkAkAkAkAk_TAkAkAkAkAkAk_TAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkBKBKBK_I_j_IBKBKAkAkAk_TAkAk_TAkAkAkAk_TAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkBKBKBKAdAdBKBKBTAmA5_I_j_I_TAkAkAk_T_TAkAkAk_TAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkBKBKAdBKBKBKBKBKBKBKBKBKAT_TATAkAkAkAk_TAkAk_TAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkBKBKAdBKBKBKBTBTBTAdAdBKBKA5Am_T_6AT_TAkAk_TAkAk_TAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkBKBKAdBKBKBTBTBTBTAd_I_jAdAdBKBK_TATATAmAkAkAk_T_T_TAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkBKBKAdBTALALBTBTAPAdAdAdA5AmAdBK_TAT_6ATATAkAkAkAk_T_TAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkBK_IBKBTALBTBTAPBUAPAd_IAdBTBKAd_4AmA5_6ATAkAkAkAk_TAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkBK_jBTBTBTBUAPAx_rA6Ad_jBTBTBKAd_4ATATAmATAkAkAkAk_TAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkBKBTBTBTAPAxAkAsAkAkAPA6BTBTBKAd_4_6ATATAmAmAkAk_TAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAk_v_rA6APAk_4AsAkAkBT_rBTBTBTAdBK_4_I_6ATATAk_4_4_TAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAk_TAkAkAkAkAkAkAk_4_4AkAkAkAk_vBTBTBTBKAdBKAT_j_I_qAk_4AkAk_T_TAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAk_TAkAk_TAkAk_T_4_4AkAkAkAkAPAPBTBTBTAdBK_qA3AT_I_TAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAk_TAkAkAB_T_TABABABAsAs_TAkA6BT_vBTBTBTAdBK_jAI_q_TAkAk_TAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAk_TABABABAB_TABABABAkAkAsAsAPAP_4BTBTAdBKATACApATAkAk_TAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAk_TABABABABABABAB_TABABAkAkBTAsAPBTBTBKAdBK_q_I_qAIAk_T_TAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkABAB_TABABABABAB_TAB_TABABAB_TAsAEAPBTBTAdBKApAT_jA3AkAkAk_TAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkABAB_TABABABABAB_TABAB_4_TAB_TAP_vAPBTBTBKAdBKAm_T_IAkAk_TAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkABABAB_TAkAkAB_TABABABABAB_TABABAPBTBTBTBKAdBKAT_j_TAT_TAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAk_T_T_T_T_4_4Ak_TABABABABAB_T_TABA6APA6BTBTBKAdBKA3_T_q_TAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_4_4_4AkAkAkAkABAB_TAB_TBTAPBT_rBTBKAdBKBKBK_TBHBHAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_T_TAkAkAB_TABAB_v_4_vBTBTBKAdBKBHBHBHBHAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_4_T_T_T_TAkAkAkAB_TABAB_4_rBT_4_4_4_4_4_4_T_TAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_4_TAkAkAk_TAkAkAkAkABABBH_T_4_4BHBHBH_C_T_TAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_TAk_4AkAkAkAkAk_TAkAkAkAk_T_T_TBHBHBH_C_T_TAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_T_4AkAkAkAk_TAk_TAkAk_T_TAkAkAkAkAkAk_TAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_4AkAkAkAk_TAkAk_TAk_TAkAkAkAkAkAkAkAk_TAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_TAkAkAkAk_TAkAkAkAkAkAkAkAkAk_T_T_TAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk } # tile 0 (kraken) { AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAyAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAk_UAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAyAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAk_UAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAyAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAk_UAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAyAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAk_l_UAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAyAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAk_U_UAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_UAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAk_l_UAyAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAy_UAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAk_lAyAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAy_UAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAk_l_U_UAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_UAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAk_l_UAyAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_UAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAk_lAyAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_U_UAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAk_l_l_UAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_U_UAkAkAkAkAkAkAkAkAk Ak_U_U_U_U_UAkAkAkAkAkAkAk_l_U_UAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAyAkAkAkAkAkAkAkAkAkAk AkAkAkAyAy_U_UAkAkAkAkAkAkAk_lAyAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAy_UAkAkAkAkAkAkAkAkAyAk AkAkAkAkAk_l_l_U_UAkAkAkAkAk_l_lAyAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAyAyAeAkAkAkAkAkAkAkAy_UAkAk AkAkAkAkAkAkAkAy_U_UAkAkAkAkAk_l_UAkAkAkAk_U_U_U_U_U_UAkAkAkAkAkAkAyAyAeAkAkAkAkAkAyAy_U_UAkAkAk AkAkAkAkAkAkAkAk_l_l_UAkAkAkAk_lAyAkAk_U_UAeAeAeAeAe_U_UAkAkAkAkAyAy_UAkAkAkAkAk_U_U_l_lAkAkAkAk AkAkAkAkAkAkAkAkAk_l_UAkAkAk_l_lAyAkBH_U_UAeBHBHBHAeAe_UBHBHAkBHBH_U_UBHAkAk_UAy_lAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAy_U_UAkAk_l_UAkBHBHBHBHBHBHBHBHBHBHBHBHBHBHBHBHBHBHBHAk_U_lAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAk_l_UAk_l_U_UBHBHBHBHBHBHAkBHBHBHBHBHBH_U_U_U_U_U_UBHAyAyAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAy_U_U_l_U_UBHBHAkAkAkAkAkBHBHBHAk_U_U_U_U_U_M_U_UAy_lBHAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAy_UBHBH_UAkAkAkAyAyAyAyAkAk_U_U_U_U_U_U_U_U_U_U_U_l_U_U_UAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAy_UAkBHBHAkAkAyAy_UAy_U_U_U_U_U_UAeAeAeAeAeAeAy_lAyAeAe_U_UAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkBH_l_l_UAkAkAkAy_UAyAy_U_UAy_U_UAeAeAeAeAeAeAeAeAy_lAeAe_MAeAeAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkBHBHAy_UAkAkBHBHAy_U_UAy_U_U_UAeAeAe_M_M_M_M_MAy_UAy_M_M_M_M_MAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkBHBHAy_U_UAkBHBHBHAy_U_UAy_U_4_4Ae_M_M_M_M_M_MAy_MAe_M_M_M_MBHAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkBHBH_l_UAkAkAkBHBHBH_U_U_4_4___4_MBHBHBHBH_M_U_MAe_M_M_MBHBHAyAyAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAk_l_U_UAkAkAkBHBH_M_M_4_4___4_MBHBHBHBHAy_U_MAeBHBHBHAyAy_U_U_UAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAyAy_U_UAkAkBHBHBH_M_M_4_4_MBHBHAkAkBHAy_UAyBHBHBHAy_U_M_U_M_UAyAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAy_U_UAkAkAkAkBHBHBHBHBHBHBHBHAkAkAy_U_M_MAkAkAkAy_MAyAkAk_U_UAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_l_U_UAkAkAkAkBHBHBHBHBHBHAkAkAkAy_U_MAkAkAkAk_U_MAkAkAkAk_MAyAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAy_U_UAkAkAkAkAkAkAkAkAkAkAkAyAy_U_M_MAkAkAkAy_UAyAkAkAkAkAk_M_UAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAyAy_U_UAkAkAkAkAkAkAkAkAkAy_U_M_MAyAkAkAkAy_U_M_MAkAkAkAkAkAk_M_U AkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_l_l_U_UAkAkAkAkAkAkAkBHAy_U_MAyAkAkAkAkAkAy_UAyAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAyAy_UAkAkAkAkAkAkBHBHBH_M_MAkAkAkAkAkAy_U_M_MAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAyAy_U_UAkAkAkAkAkBHBHBHBHBHAkAkAkAkAy_UAyAyAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_l_U_U_UAkAkAkAkAkAkBHBHBHBHAkAkAkAy_U_M_MAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAyAy_U_UAkAkAkAkAkAkAkAkAkAkAkAkAy_U_U_MAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAyAy_U_UBHAkAkAkAkAkAkAkAkAkAyAyAy_UAyAyAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_l_U_UBHBHAkAkAkAkAkAkAyAyAy_U_U_U_M_MAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkBHBHBHBHBHAkAkAkAkAkBH_U_U_U_U_MAyAyAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkBHBHBHBHAkAkAkAkBHBHBH_U_U_M_M_MAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkBHBHBHBHBHBHBHAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkBHBHBHBHAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk } # tile 0 (barbarian) { AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkA9A9_s_y_y_yAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkA9A9_s_y_IA5A5_I_6_yAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkA9_s_y_IA5BBBBBBBBA5AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkA9_s_y_jBBBBBBBBBBBBAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkA9_s_y_IBBBBBBBBBBBBAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkA9_yA5BBBBBBBBBBBBBBAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkA9_s_6A5BBBBBBBBBBBBBBAkAwBCAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkA9_yAmBKBKBKBBBBBBBBBBBBBCBC_RAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAk_s_6AkAkAkAkBKBBBBBBA5AmBK_R_YAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAk_yAkAkAkAkAkAkBKBBAmATA5BBBKAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkA5ATA5BBBKAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkBGAmAdA5BBBKAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_f_KA5BBBK_KBGAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_KBGBG_K_K_KAH_fAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_K___K_K___K_K_KAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_KBG_K_K_f_f_K_f_K_fAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAk_KBG_KBGAkAkAkAkAkA5_f_K_K_f_f_P_f_K_f_KAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAk_KBG_KBG_KBGAkAkAkA5BBA9_f_fA9A8Ab_P_f_K_f_KAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAk_f_K_f_KBG_K_fBG_KBLBLBK_PAFA8_PAF_PAH_f_f_fAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAk_f_f_K_f_K_f_K_KBL_JA8BK_PBLA8_PA8_PAHAH_f_f_fAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAH_f_f_K_f_K_fA8BLBL_GA8_PA8Ab_PAb_P_kA9A9_k_fAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAHAH_f_fAH_f_PA8_7A8_P_GAaA8_G_P_kA9A9A9A9_k_yATAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAHAHAHA5BB_P_P_VA8Ab_P_PAI_6_k_k_k_y_6AT_yA9AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAk_IA5BBBK_P_PBLBLBLBLA8AT_6Ad_6_yATAmAm_6_yA9AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkA8BLBE_KBKAk_PBLBLA8BL_JBL_PAd_6ATAT_yA9BKBB_6_yAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkA8_J_J_KBG_KAk_PA8BLBLBLBLBL_PAb_PATAm_6_yA9BBAk_6_yAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkBLBL_KBG_K_yAT_PAbA8_GA8BLBL_P_GA8A8Ab_PAp_yBBAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkA8_G_K_K_yA3BG_K_fAb_PAaA8_G_P_VA8BLA8AC_PAT_yAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAk_I_P_V_f_K_6BG_KBG_KBG_K_hAbBLA8_PA8A8_PA8_G_P_fAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAk_jA5BBBK_f_fAT_K_f_KBG_KBG_KBGA8BLBLA8_P_G_V_PAH_fAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAk_IA5BBBKAkAkAkAd_f_K_f_K_K_KBG_K_KBLBLA8Aa_P_PAH_fAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkA5A5BBBKAkAkAkAkAkAH_f_K_f_K_f_K_f_fA8A8Ab_G_PBKAHAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAwA5BBBKAkAkAkAkAkAkAkAH_f_f_f_K_f_fAHAb_G_g_PBKAH_fAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AwBCA$BKAkAkAkAkAkAkAkAkAkAHAH_f_f_fAH_P_P_P_PBKBK_fAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk _g_R_YAkAkAkAkAkAkAkAkAkAkAkAkAHAHAH_PAbAa_G_V_PBKAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk Ak_YAkAkAkAkAkAkAkAkAkAkAkAkAkAkAH_f_f_KBGBGBG_K_fAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_f_K_f_h_f_h_f_f_f_KAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_KBG_K_K_f_P_V_GAb_fAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_f_K_K_fAbA8A8_g_P_PAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAH_f_f_GA8BLBLA8Ab_PAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAHAH_VA8BLBLA8_P_G_PAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_Q_GA8BLBLA8_P_G_V_PAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAbA8BLA8A8_P_VA8_PAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAtA8A8A8_GA8A8At_PAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_VA8A8A8A8A8Aa_G_gAPBCAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkA8BLA8_VA8A8_P_PAP_ABCBGAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkBLBLA8_P_G_PAPAPBU_Y_R_KBCAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkA8A8_G_PA$BC_RAxAP_Y_h_R_gAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkBCAb_g_PA$BCBCBCARAPAx_h_R_YAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAk_RBCBCBCBCBCBCBCA6AP_h_Y_Y_YAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAk_Y_Y_R_R_R_RBC_K_YBTAP_v_Y__Ak__AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_f_Y_Y_Y_Y_K_Y_R_hBT_Y__________Ak__AkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_f_f_f_KBCBC_g_K________________Ak__AkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_Y_Y_R_R_RBC_KBC____Ak__Ak________AkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_f_Y_Y_Y_K_gBCBCAk__Ak________Ak__AkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_Y_f_h_RBCBCA$_gAkAk__Ak________Ak__AkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_Y_R_RA0BCBCBC_KAkAk__Ak________AkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_Y_Y_R_RBCBC_RAk__Ak________Ak__AkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_f_Y_Y_R_K_RBC__Ak____________AkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_Y_f_f_h_R_R_RAk____________Ak__AkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkBCA$BCBCBC_R_R_Y____________Ak__AkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_gBCBC_RBC_R_Y_Y_Y__________Ak__AkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_RBCBC_R_R_Y_Y_Y__________Ak__AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_R_Y_Y_Y_Y________Ak__AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk } # tile 0 (knight) { AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk _6AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk _yAkAkAkAkAkAkAkAkAkAkAkAkA9AkAkAk_6ATAmAkAkAk_6AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk _y_6AkAkAkAkAkAkAkAkAkAkAkAk_yAk_6_6ATAmA5Ak_6AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk _k_yAkAkAkAkAkAkAkAkAkAkAkAk_6AT_6ATATAmA5A5ATAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk A9_yAkAkAkAkAkAkAkAkAkAkAkAkAk_6A5_6ATAm__ATAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk A9_s_6AkAkAkAkAkAkAkAkAkAkAkAkAk_6A5BB__A5____AdAT_6AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk Ak_k_yAkAkAkAkAkAkAkAkAkAkAk_6AmAT_6ATAmA5__AdATATAT_6AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkA9_s_6AkAkAkAkAkAkAkAkAk_6ATAd_I_cATAm_____IAdATATAT_6BK_y_6AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkA9_k_yAkAkAkAkAkAkAkAkAk_qATA5BBA5_I__BBBBBB___IAdAdBB_yATATAdAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkA9_s_6AkAkAkAkAkAkAkATAT_7Am_yATAT_qAmBB_6AT___jBBA9ATATAdATA5AkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkA9_k_6AkAkAkAkAkAkAkATAmAmBK_6AlAIA3AT_jAT_I___vBB_yATATATAdAmAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkA9_s_6AkAkAkAkAkAk_IBBBB__ATAmATATAT_IA5BTBTBT_yATATAdATAdAmA5AkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkA9_k_yAkAkAkAkAkAkATAmBBBTBTAmAmAm_jBBBTBBBT___6ATATATAdAmAdAmAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkA9_s_6AkAkAkAkATA5BBBTAkAkBTBBBBBBBBBBBT__Am_6AdATAdAdAdAmA5AkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkA9_k_yATBBBT_6ATAmBTAkAkAkAkBTBTBTBTBT__BK_6ATATAdATAdAmAmBBAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkA9ATBTBTATAdAmA5BBAkAkAkAkBBATAm_I_j_IBB_6AdATATAdAdAdAmBBAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkATAmBTAmBBAmA5BBBTAkAkAkAk_6BBAmATAmBBAdATAdATATAdAdAdAmAmBBAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkBBBTAmA5BBBBAkAkAkAkAkAk_y_cAbBBAmA5Ad_6AdAdATAdATAdAmAdAmBBAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAmBB__AkAkAkAkAk_6_6ATAdBBA5AmAd_yAT_IAdATAdAdAdAm_IBKAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkBTBTAkAkAk_6_6AdAd_I_jBBBB_yATAdAdBBAdAdAmAdAm_jBKAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkBKATAdA5BBBBAkAd_6ATAdAmA5BBAmAdAmA5BBAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAk_yATBB_IBBAkAkAkAdAdAdAmAmBBAkBBBB_IAmBKAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAk_6ATAdBBAkAkAk_6_6AmAmA5BBAkAkAkAkBKBKAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkATAdBB_j_6Ak_y_6AdAdA5A5AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkA5BBA5AdATAk_6ATAd_IBB_6AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkBBAmAdAkA5AdAdA5BKAT_6AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkBB_IAm_IAkAmAmBK_jAd_6AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkBBA5BBAkBBBKA5AmATAT_6AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAdBBAmBKAkAkBB_IAmAmATAmAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAmA5BKBK________BBA5Am_IAT____AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAmBBBK____________ARBBBBAmAT________Ak__Ak__AkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk______BK_I_jAmA5________________Ak__AkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk__BBA5_IBB__________Ak__Ak__Ak__AkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkBKAmA5BK________________Ak__AkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkBKBKBBBK__________Ak__Ak__Ak__AkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkATAmAmBK____________Ak__Ak__AkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_6ATAmA5BK__________Ak__Ak__AkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkATATAm_IBBBK________Ak__AkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkA5AmA5BBBK______AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk } # tile 0 (samurai) { AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAk____AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAk__AT____AkAkAkAkAkAkAkAkAkAkAk_6ATAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAk____BKBK____AkAkAkAkAkAkAkAkAk_6ATAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAk__________BK____AkAkAkAkAkAk_6_6AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAk__BK__________AkAkAkAkAk_s_6AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAk_PBLA_A5____A8____AkAkAkAk_s_6AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkBN_N_JA8BLBL____A8___P__AkAk_s_sAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkBN_N_nBNBLA8A8AjA8BLBEA8__A9_sAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAk_N_n_n_NA8_P_PAj_PBLBLA9_sAvAjAjAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAk_nAJ_N_n_n_P__AjAjA9A9AvAjA8_JAj_SAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAJ_nAJ_n_J_vBCA9_yAvAjBLBLBEBLAj_SAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAJBL_JBL__BCAvAjAjBLBL_JBLAj_CAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAk_JA8_P_JA8_v___PA8BL_PBLA8_PAj_C_SA$AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkBLBLBL_NBN_N_NBNA8_JA8A8_P_PAjBHBH_C_CA$_bAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkBL_N_h_n_n_N_nBNBLA8_PAjAjBHAjBHBHBHBCA$AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAJ_n_n_n_NA8_PAjAjBHAjBHBHBHBCBCAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAJ_nAJAkA_ABAjAjBHAjBHBCBCBCAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAk_e_eAjAjAjBCBCBCBC_5AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAU_5_e_Y_RBC_RBC_5_5AUAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkBJ_FAU_5_e_e_R_R_5_5AUAUAUAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAk_F_FBSAU_5_e_e_5_5A2A2A2AU_5AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAk_F_FBSAU_5_e_eAkA2A2A2A2AUAUAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkBSBSA2_5_e_eAkAkA2BSBSA2AU_5AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAUA2A2BS_eAkAkA2BSBSA2AUAUAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAk_5AUA2A2BSA2AkBSBSBSA2AU_5AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAk_5_5AUAUAUAkBSBSBSA2A2AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAk_5_5_5_nAkBSBJBSA2BSAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAJ_n_NA2BSBSA2A2BJAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAJ_nAUA2A2AUA2BSAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkATATAmAkAUAU_5AUA2AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAT_nAm_n___5_5_5AUA2______AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAk_n_n_n_______5_5AU_N__________Ak__Ak__AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAk____________AJ_n_NBN__________________Ak__AkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_________n_n_N____________Ak__Ak__Ak__AkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk____AJ_n_n__________________Ak__AkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk__AJAJBB____________Ak__Ak__Ak__AkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_y_6AT______________Ak__Ak__AkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_y_6_6AT____________Ak__Ak__AkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAT_N_6Ad_n__________Ak__AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk_N_N_N_n________AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk AkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAkAk } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/share/palette.txt�������������������������������������������������������������0000664�0000764�0000764�00000011267�10545462320�015753� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������__ = (71, 108, 108) _A = (0, 0, 0) _B = (0, 0, 16) _C = (0, 0, 32) _D = (0, 0, 48) _E = (0, 0, 64) _F = (0, 0, 96) _G = (0, 0, 128) _H = (0, 0, 160) _I = (0, 0, 192) _J = (0, 0, 224) _K = (0, 0, 255) _L = (0, 16, 0) _M = (0, 16, 16) _N = (0, 24, 0) _O = (0, 24, 24) _P = (0, 24, 48) _Q = (0, 32, 0) _R = (0, 32, 32) _S = (0, 32, 64) _T = (0, 48, 0) _U = (0, 48, 24) _V = (0, 48, 48) _W = (0, 48, 96) _X = (0, 64, 0) _Y = (0, 64, 32) _Z = (0, 64, 64) _a = (0, 64, 128) _b = (0, 80, 160) _c = (0, 96, 0) _d = (0, 96, 48) _e = (0, 96, 96) _f = (0, 96, 192) _g = (0, 112, 224) _h = (0, 128, 0) _i = (0, 128, 64) _j = (0, 128, 128) _k = (0, 128, 255) _l = (0, 144, 0) _m = (0, 160, 0) _n = (0, 160, 80) _o = (0, 160, 160) _p = (0, 182, 255) _q = (0, 192, 0) _r = (0, 192, 96) _s = (0, 192, 192) _t = (0, 224, 0) _u = (0, 224, 112) _v = (0, 224, 224) _w = (0, 255, 0) _x = (0, 255, 128) _y = (0, 255, 255) _z = (16, 0, 0) _0 = (16, 0, 16) _1 = (16, 16, 0) _2 = (16, 16, 16) _3 = (16, 48, 48) _4 = (24, 0, 0) _5 = (24, 24, 0) _6 = (24, 24, 48) _7 = (24, 48, 0) _8 = (24, 48, 24) _9 = (24, 48, 48) _$ = (32, 0, 0) A_ = (32, 0, 32) AA = (32, 32, 0) AB = (32, 32, 32) AC = (32, 64, 0) AD = (32, 64, 32) AE = (32, 64, 64) AF = (32, 242, 186) AG = (48, 0, 0) AH = (48, 0, 48) AI = (48, 12, 0) AJ = (48, 24, 0) AK = (48, 24, 24) AL = (48, 36, 0) AM = (48, 48, 0) AN = (48, 48, 24) AO = (48, 48, 48) AP = (48, 48, 96) AQ = (48, 96, 0) AR = (48, 96, 48) AS = (48, 96, 96) AT = (64, 0, 0) AU = (64, 0, 32) AV = (64, 0, 64) AW = (64, 0, 128) AX = (64, 16, 0) AY = (64, 32, 0) AZ = (64, 32, 32) Aa = (64, 32, 64) Ab = (64, 48, 0) Ac = (64, 64, 0) Ad = (64, 64, 32) Ae = (64, 64, 64) Af = (64, 64, 128) Ag = (64, 128, 0) Ah = (64, 128, 64) Ai = (64, 128, 128) Aj = (72, 108, 108) Ak = (80, 0, 160) Al = (80, 80, 80) Am = (80, 80, 160) An = (80, 160, 0) Ao = (80, 160, 80) Ap = (80, 160, 160) Aq = (96, 0, 0) Ar = (96, 0, 48) As = (96, 0, 96) At = (96, 0, 192) Au = (96, 16, 0) Av = (96, 24, 0) Aw = (96, 48, 0) Ax = (96, 48, 48) Ay = (96, 48, 96) Az = (96, 72, 0) A0 = (96, 96, 0) A1 = (96, 96, 48) A2 = (96, 96, 96) A3 = (96, 96, 128) A4 = (96, 96, 192) A5 = (96, 128, 96) A6 = (96, 128, 128) A7 = (96, 192, 0) A8 = (96, 192, 96) A9 = (96, 192, 192) A$ = (96, 144, 178) B_ = (104, 84, 31) BA = (108, 144, 182) BB = (108, 255, 0) BC = (112, 0, 224) BD = (112, 112, 112) BE = (112, 112, 224) BF = (112, 160, 160) BG = (112, 224, 0) BH = (112, 224, 112) BI = (112, 224, 224) BJ = (117, 105, 88) BK = (120, 120, 160) BL = (120, 160, 120) BM = (120, 160, 160) BN = (128, 0, 0) BO = (128, 0, 64) BP = (128, 0, 128) BQ = (128, 0, 255) BR = (128, 32, 0) BS = (128, 64, 0) BT = (128, 64, 64) BU = (128, 64, 128) BV = (128, 90, 72) BW = (128, 96, 0) BX = (128, 96, 96) BY = (128, 96, 128) BZ = (128, 112, 32) Ba = (128, 128, 0) Bb = (128, 128, 64) Bc = (128, 128, 96) Bd = (128, 128, 128) Be = (128, 128, 255) Bf = (128, 255, 0) Bg = (128, 255, 128) Bh = (128, 255, 255) Bi = (144, 72, 0) Bj = (144, 135, 110) Bk = (144, 144, 144) Bl = (144, 144, 192) Bm = (144, 192, 144) Bn = (144, 192, 192) Bo = (160, 0, 0) Bp = (160, 0, 80) Bq = (160, 0, 160) Br = (160, 40, 0) Bs = (160, 80, 0) Bt = (160, 80, 80) Bu = (160, 80, 160) Bv = (160, 120, 0) Bw = (160, 120, 120) Bx = (160, 120, 160) By = (160, 160, 0) Bz = (160, 160, 80) B0 = (160, 160, 120) B1 = (160, 160, 160) B2 = (160, 160, 224) B3 = (165, 118, 96) B4 = (168, 168, 224) B5 = (168, 224, 168) B6 = (168, 224, 224) B7 = (170, 136, 52) B8 = (170, 154, 128) B9 = (176, 176, 176) B$ = (178, 64, 0) C_ = (178, 224, 16) CA = (182, 72, 0) CB = (192, 0, 0) CC = (192, 0, 96) CD = (192, 0, 192) CE = (192, 48, 0) CF = (192, 96, 0) CG = (192, 96, 96) CH = (192, 96, 192) CI = (192, 144, 0) CJ = (192, 144, 144) CK = (192, 144, 192) CL = (192, 160, 64) CM = (192, 192, 0) CN = (192, 192, 96) CO = (192, 192, 144) CP = (192, 192, 192) CQ = (192, 192, 255) CR = (192, 255, 192) CS = (192, 255, 255) CT = (202, 144, 114) CU = (208, 168, 80) CV = (208, 208, 208) CW = (210, 210, 178) CX = (218, 218, 182) CY = (224, 0, 0) CZ = (224, 0, 112) Ca = (224, 0, 224) Cb = (224, 56, 0) Cc = (224, 112, 0) Cd = (224, 112, 112) Ce = (224, 112, 224) Cf = (224, 168, 0) Cg = (224, 168, 168) Ch = (224, 168, 224) Ci = (224, 192, 160) Cj = (224, 224, 0) Ck = (224, 224, 112) Cl = (224, 224, 168) Cm = (224, 224, 224) Cn = (229, 162, 130) Co = (240, 240, 240) Cp = (242, 0, 0) Cq = (242, 96, 0) Cr = (242, 196, 77) Cs = (248, 224, 96) Ct = (252, 252, 153) Cu = (255, 0, 0) Cv = (255, 0, 128) Cw = (255, 0, 255) Cx = (255, 64, 0) Cy = (255, 108, 0) Cz = (255, 128, 0) C0 = (255, 128, 128) C1 = (255, 128, 255) C2 = (255, 182, 144) C3 = (255, 192, 0) C4 = (255, 192, 192) C5 = (255, 192, 255) C6 = (255, 211, 176) C7 = (255, 255, 0) C8 = (255, 255, 128) C9 = (255, 255, 192) C$ = (255, 255, 255) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/share/objects.txt�������������������������������������������������������������0000664�0000764�0000764�00000546116�10545462320�015754� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������A = (0, 0, 0) B = (0, 182, 255) C = (255, 108, 0) D = (255, 0, 0) E = (0, 0, 255) F = (0, 145, 0) G = (108, 255, 0) H = (255, 255, 0) I = (255, 0, 255) J = (145, 71, 0) K = (182, 71, 0) L = (255, 182, 145) M = (71, 108, 108) N = (255, 255, 255) O = (218, 218, 182) P = (108, 145, 182) # tile 0 (strange object) { MMMMMMMMMMMMMMMM MMMCJKKKCJKKKCMM MCKJKCCKJKCCJJKM MKKKKKKKKKKKJJJM CJKCKCJCKCCJJJJM CJKCKCJKKKCJJAJM CCCCCHHCCCCJAJJM AADDAAAADDAAJJJM CCCCCHHCCCCJJJJM CJJJHJJHJJJJJJJM CJKKKHHKKCCJJJJA CJKCKHHKKKCJJJJA CJKKKCJKCKCJJJAA CJCCCCJCCCCJJAAM CKCKKCKKKKKJAAMM MAAAAAAAAAAAAMMM } # tile 1 (crude dagger / orcish dagger) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMNMMMMMM MMMMMMMMNOAMMMMM MMMMMMMNOAAMMMMM MMMMOMNOAAMMMMMM MMMMMCOAAMMMMMMM MMMMKJAOAMMMMMMM MMMKJAAAAMMMMMMM MMMAAAMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 2 (dagger) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMNMMMMMM MMMMMMMMNOAMMMMM MMMMMMMNOAAMMMMM MMMMOONOAAMMMMMM MMMMMKOOAMMMMMMM MMMMKJAOAMMMMMMM MMMKJAAAAMMMMMMM MMMAAAMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 3 (athame) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMPMM MMMMMMMMMMMMNPAM MMMMMMMMMMMPPAMM MMMMMMMMMMNOAAMM MMMMMMMMMPPAMMMM MMMMMMMMNOAAMMMM MMMMMMPPPAMMMMMM MMMMPONOPAMMMMMM MMMMMKPBAMMMMMMM MMMMKJAOAMMMMMMM MMMKKAMMMMMMMMMM MMMMAMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 4 (silver dagger) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMNMMMMMM MMMMMMMMNNAMMMMM MMMMMMMNNAAMMMMM MMMMOMNNAAMMMMMM MMMMMNNAAMMMMMMM MMMMBPAOAMMMMMMM MMMBPAAAAMMMMMMM MMMAAAMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 5 (runed dagger / elven dagger) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMNMMMMMM MMMMMMMMNOAMMMMM MMMMMMMNOAAMMMMM MMMMOONOAAMMMMMM MMMMMKOOAMMMMMMM MMMMKFAOAMMMMMMM MMMKFAAAAMMMMMMM MMMAAAMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 6 (black runed dagger / dark elven dagger) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMNMMMMMM MMMMMMMMNPAMMMMM MMMMMMMNPAAMMMMM MMMMOONPAAMMMMMM MMMMMEPPAMMMMMMM MMMMEFAPAMMMMMMM MMMEFAAAAMMMMMMM MMMAAAMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 7 (wooden stake) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMKJMMMMMMMMMM MMMKJJJMMMMMMMMM MMMMKJMMMMMAMMMM MMMMKKMMAAAMMMMM MMMMJJMMAAAMMMMM MMMMJMMAAAAAMMMM MMMMJMAAAMMMMMMM MMMMKMAMMMMMMMMM MMMMKAMMMMMMMMMM MMMMCMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 8 (great dagger) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMNNNMMMMM MMMMMMMNNOOMMMMM MMMMOMNNOOAMMMMM MMMMOONOOAMMMMMM MMMMMKOOAMMMMMMM MMMMKJAOOMMMMMMM MMMKJAAAAMMMMMMM MMMAAAMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 9 (worm tooth) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMOMMMMMMMMM MMMMMMNAMMMMMMMM MMMMMMNOAMMMMMMM MMMMMMPOAMMMMMMM MMMMMMMOAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 10 (knife) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMNMMMMMM MMMMMMMMNOAMMMMM MMMMMMMNOAAMMMMM MMMMMMNOAAMMMMMM MMMMMKLAAMMMMMMM MMMMKLAAMMMMMMMM MMMKLAAMMMMMMMMM MMMAAAMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 11 (stiletto) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMOAMMM MMMMMMMMMMOAMMMM MMMMMMMMPOAMMMMM MMMMMMMPOAMMMMMM MMMMMMOOAMMMMMMM MMMOPNOAMMMMMMMM MMMMKJAAMMMMMMMM MMMKJAOPMMMMMMMM MMKJAAMMMMMMMMMM MMAAAMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 12 (scalpel) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMNAMMMMMMMMMM MMMMONAMMMMMMMMM MMMMMPBAMMMMMMMM MMMMMMMPAMMMMMMM MMMMMMMMPAMMMMMM MMMMMMMMMPAMMMMM MMMMMMMMMMPAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 13 (crysknife) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMNOAMMM MMMMMMMMMPPAAMMM MMMMMMMMNOAAMMMM MMMMMMPPPAMMMMMM MMMMPONOPAMMMMMM MMMMMKPBAMMMMMMM MMMMKJAOAMMMMMMM MMMKKAMMMMMMMMMM MMMMAMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 14 (axe) { MMMMMMMMMMMMMMMM MMMMMOPAMMMMMMMM MMMMOPPPAMMMMMMM MMMOPPPPPAMMMMMM MMMKPKPPPAMMMMMM MMMMKPPPAMMMMMMM MMMMMKAAMMMMMMMM MMMMMMKAMMMMMMMM MMMMMMMCAMMMMMMM MMMMMMMMCAMMMMMM MMMMMMMMMCAMMMMM MMMMMMMMMMCAMMMM MMMMMMMMMMMCAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 15 (double-headed axe / battle-axe) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMOPPAMMMMMMMM MMMMOPPPAMMMMMMM MMMKPPPPAMMMMMMM MOPPKPPPAMMMMMMM MOPPPKAAMMMMMMMM MPPPPAKAMMMMMMMM MMPPPAMCAMMMMMMM MMMAAMMMCAMMMMMM MMMMMMMMMCAMMMMM MMMMMMMMMMCAMMMM MMMMMMMMMMMCAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 16 (broad pick / dwarvish mattock) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMONOAMMMMMM MMMMMMMMPNOAMMMM MMMMMMMMMNONAMMM MMMMMMMMKJAANAMM MMMMMMMKJAMMMNAM MMMMMMKJAMMMMMMM MMMMMKKAMMMMMMMM MMMMKJAMMMMMMMMM MMMKKAMMMMMMMMMM MMCJAMMMMMMMMMMM MKJAMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 17 (crude short sword / orcish short sword) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMNMMMMMMMMMMM MMMAONMMMMMMMMMM MMMMAONMMMMMMMMM MMMMMAONMMMMMMMM MMMMMAAONAPOMMMM MMMMMMMAOOKMMMMM MMMMMMAPOBJKMMMM MMMMMMAAAABJKMMM MMMMMMMMMMABJMMM MMMMMMMMMMMAAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 18 (short sword) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMNMMMMMMMMMMM MMMAONMMMMMMMMMM MMMMAONMMMMMMMMM MMMMMAONMMMMMMMM MMMMMMAONAPOMMMM MMMMMMMAOOKMMMMM MMMMMMAPOAJKMMMM MMMMMMAAAAAJKMMM MMMMMMMMMMAAJMMM MMMMMMMMMMMAAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 19 (silver short sword) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMNMMMMMMMMMMM MMMANNMMMMMMMMMM MMMMANNMMMMMMMMM MMMMMANNMMMMMMMM MMMMMMANNAPOMMMM MMMMMMMANNBMMMMM MMMMMMAPOAEBMMMM MMMMMMAAAAAEBMMM MMMMMMMMMMAAEMMM MMMMMMMMMMMAAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 20 (broad short sword / dwarvish short sword) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMNMMMMMMMMMMM MMMAONMMMMMMMMMM MMMMAONMMMMMMMMM MMMMMAONPMMMMMMM MMMMMAAONAPOMMMM MMMMMMMAOOMMMMMM MMMMMMAPOJJMMMMM MMMMMMAAAAJJMMMM MMMMMMMMMMAAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 21 (runed short sword / elven short sword) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMNMMMMMMMMMMM MMMAONMMMMMMMMMM MMMMAONMMMMMMMMM MMMMMAONMMMMMMMM MMMMMMAONAPOMMMM MMMMMMMAOOMMMMMM MMMMMMAPOFGMMMMM MMMMMMAAAAFGMMMM MMMMMMMMMMAFGMMM MMMMMMMMMMMAAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 22 (black runed short sword / dark elven short sword) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMNMMMMMMMMMMM MMMAJNMMMMMMMMMM MMMMAJNMMMMMMMMM MMMMMAJNMMMMMMMM MMMMMMAJNAPOMMMM MMMMMMMAJOMMMMMM MMMMMMAPOEEMMMMM MMMMMMAAAAEEMMMM MMMMMMMMMMAEEMMM MMMMMMMMMMMAAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 23 (broadsword) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMNMMMMMMMMMMMM MMANNMMMMMMMMMMM MMAONNMMMMMMMMMM MMMAONNMMMMMMMMM MMMMAONNMMMMMMMM MMMMMAONNMMMMMMM MMMMMMAONNPOMMMM MMMMMMMAOOKMMMMM MMMMMMAPOAJKMMMM MMMMMMAAAAAJKMMM MMMMMMMMMMAAJMMM MMMMMMMMMMMAAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 24 (runed broadsword / runesword) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMAMM MMMMMMMMMMMMAAPM MMMMMMMMMMMAAPPM MMMMMMMMMMAAPPMM MMMMMMMMMAAPPMMM MMMMMMMMAAPPMMMM MMMMMMMAAPPMMMMM MMMMMMAAPPMMMMMM MMMMMAAPPMMMMMMM MMOPAAPPMMMMMMMM MMMNNPPMMMMMMMMM MMNNPOPMMMMMMMMM MNNPPMMMMMMMMMMM MPPPMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 25 (runed broadsword / elven broadsword) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMNMMMMMMMMMMMM MMANNMMMMMMMMMMM MMAONNMMMMMMMMMM MMMAONNMMMMMMMMM MMMMAONNMMMMMMMM MMMMMAONNMMMMMMM MMMMMMAONNPOMMMM MMMMMMMAOOGMMMMM MMMMMMAPOFFGMMMM MMMMMMAAAAAFGMMM MMMMMMMMMMAAJMMM MMMMMMMMMMMAAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 26 (long sword) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMOMM MMMMMMMMMMMMOPAM MMMMMMMMMMMOPAAM MMMMMMMMMMNPAAMM MMMMMMMMMNPAAMMM MMMMMMMMNPAAMMMM MMMMMMMNPAAMMMMM MMMMMMNOAAMMMMMM MMMMMNOAAMMMMMMM MMOPNOAAMMMMMMMM MMMKJAAMMMMMMMMM MMKKAOPMMMMMMMMM MNDAAMMMMMMMMMMM MAAAMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 27 (silver long sword) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMNMM MMMMMMMMMMMMNNAM MMMMMMMMMMMNNAAM MMMMMMMMMMNNAAMM MMMMMMMMMNNAAMMM MMMMMMMMNNAAMMMM MMMMMMMNNAAMMMMM MMMMMMNNAAMMMMMM MMMMMNNAAMMMMMMM MMOONNAAMMMMMMMM MMMBBAAMMMMMMMMM MMBEAOOMMMMMMMMM MBEAAMMMMMMMMMMM MAAAMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 28 (samurai sword / katana) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMNM MMMMMMMMMMMMMONM MMMMMMMMMMMMPNAM MMMMMMMMMMMMNPAM MMMMMMMMMMMOOAMM MMMMMMMMMMONAAMM MMMMMMMMMONPAMMM MMMMMMMMNNPAMMMM MMMMMOPNOAAMMMMM MMMMMAOPAMMMMMMM MMMMJKJOPAMMMMMM MMMJKKAAMMMMMMMM MMJJAAMMMMMMMMMM MMAAMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 29 (two-handed sword) { MMMMMMMMMMMMMMNM MMMMMMMMMMMMMNOM MMMMMMMMMMMMNOAM MMMMMMMMMMMNOAAM MMMMMMMMMMNOAAMM MMMMMMMMMNOAAMMM MMMMMMMMNOAAMMMM MMMMMMMNNAAMMMMM MMMMOPNNAAMMMMMM MMMMMKIIAMMMMMMM MMMMKJAOPMMMMMMM MMMKJAAAAMMMMMMM MMKKAAMMMMMMMMMM MNDAAMMMMMMMMMMM MAAAMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 30 (long samurai sword / tsurugi) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMNM MMMMMMMMMMMMMNPM MMMMMMMMMMMMNOAM MMMMMMMMMMMOOAMM MMMMMMMMMMONAMMM MMMMMMMMMONAMMMM MMMMMMMMNNAMMMMM MMMMMOPNOAMMMMMM MMMMMAOPAMMMMMMM MMMMJKJOPAMMMMMM MMMJKKAAMMMMMMMM MMJJAAMMMMMMMMMM MMAAMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 31 (curved sword / scimitar) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MANMMMMMMMMMMMMM MAPNMMMMMMMMMMMM MMAOOMMMMMMMMMMM MMAANOMMMMMMMMMM MMMAPNOMMMMMMMMM MMMMAPNNMMMMMMMM MMMMMAAONPOMMMMM MMMMMMMAPOAMMMMM MMMMMMAPOJKJMMMM MMMMMMMMAAJKJMMM MMMMMMMMMMAAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 32 (rapier) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMPMMMMM MMMMMMMMMOAAMMMM MMMMMMMMOAAMMMMM MMMMMMMOAAMMMMMM MMMMMMNAAMMMMMMM MMMMMNAAMMMMMMMM MMOPNAAMMMMMMMMM MMMKJAMMMMMMMMMM MMKJAOPMMMMMMMMM MNDAAMMMMMMMMMMM MAAAMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 33 (silver saber) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMNAMMM MMMMMMMMMMPOPAMM MMMMMMMMMPNOPAMM MMMMMMMMPNNPAMMM MMMMPPANNOPAMMMM MMMMMOOOAAMMMMMM MMMMMJJOPAMMMMMM MMMKJJAAAMMMMMMM MMMMAAMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 34 (club) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMKKMMMM MMMMMMMMJCCKAMMM MMMMMMMKKKKKAMMM MMMMMMJCKCKKAMMM MMMMMMKKKCKAAMMM MMMMMJCKCKAAMMMM MMMMJCKKJAAMMMMM MMMJKKJAAMMMMMMM MMMKJAAMMMMMMMMM MMKKAMMMMMMMMMMM MKJAMMMMMMMMMMMM MJAMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 35 (thonged club / aklys) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMKJJJMMMM MMMMMMMMKJJAAMMM MMMMMMMKJJAAMMMM MMMMMMMCJAAMMMMM MMMMMMKJAAMMMMMM MMMMMKJAAMMMMMMM MMMMMKAAMMMMMMMM MMMMKAAMMMMMMMMM MMMMMAMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 36 (baseball bat) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMCCKMMM MMMMMMMMMCCCKAMM MMMMMMMMCCCKAAMM MMMMMMMCCCKAAMMM MMMMMMCCCCAAMMMM MMMMMMCCKAAMMMMM MMMMMCCKAAMMMMMM MMMMCCAAAMMMMMMM MMMCCAAMMMMMMMMM MMCCAAMMMMMMMMMM MMMCAMMMMMMMMMMM MMMMAMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 37 (fly swatter) { MMMMMMMMMMMMMMMM MMMMMMMMOAMMMMMM MMMMMMMOAOAAMMMM MMMMMMNOANOOAMMM MMMMMMOANOAOOAMM MMMMMOOAOAOAAOAM MMMMOAAOAAOOOAMM MMMMMOOAOOAOAMMM MMMMMMOOAOAOAMMM MMMMMMOAOAOAMMMM MMMMMOAMAOAMMMMM MMMMMOAMMAMMMMMM MMMMOAMMMMMMMMMM MMMMOAMMMMMMMMMM MMMOAMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 38 (silver mace) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMNANMMMM MMMMMMMMNPNEOAMM MMMMMMMMANENEAMM MMMMMMMMNENEOAMM MMMMMMMMAOEOAAMM MMMMMMMBEAAAAMMM MMMMMMBEAMMMMMMM MMMMMBEAMMMMMMMM MMMMBEAMMMMMMMMM MMMBEAMMMMMMMMMM MMBEAMMMMMMMMMMM MMMAMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 39 (mace) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMBABMMMM MMMMMMMMBMOMPAMM MMMMMMMMAOMBMAMM MMMMMMMMBMBMPAMM MMMMMMMMAPMPAAMM MMMMMMMKJAAAAMMM MMMMMMKJAMMMMMMM MMMMMKKAMMMMMMMM MMMMKJAMMMMMMMMM MMMKKAMMMMMMMMMM MMKJAMMMMMMMMMMM MMMAMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 40 (morning star) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMBABMMM MMMMMMMMMBMOMPAM MMMMMMMMMAOMBMAM MMMPPMMMMBMBMPAM MMPAAPMMMAPMPAAM MMPAAPMMPPAAAAMM MMPAMAPPAAMMMMMM MMPAMMAAMMMMMMMM MMMKAMMMMMMMMMMM MMMMKAMMMMMMMMMM MMMMMKAMMMMMMMMM MMMMMMKAMMMMMMMM MMMMMMMMMMMMMMMM } # tile 41 (flail) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMKJMM MMMMMMMMMMMKKAMM MMMMMMMMMMKJAMMM MMMMMMMMMKKAMMMM MMMMMMMMKJAMMMMM MMMMMMMKKAMMMMMM MMMMMMCJAMMMMMMM MMMMMKJAMMMMMMMM MMMMPAMMMMMMMMMM MMMKJAMMMMMMMMMM MMMKAMMMMMMMMMMM MMKKAMMMMMMMMMMM MJKAMMMMMMMMMMMM MMJAMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 42 (war hammer) { MMMMMMMMMMOMMMMM MMMMMMMMMPPOAMMM MMMMMMMMMAPPKKMM MMMMMMMMMMACKOOM MMMMMMMMMMKJAPPO MMMMMMMMMKJAAAPA MMMMMMMMKKAMMAAM MMMMMMMKJAMMMMMM MMMMMMKKAMMMMMMM MMMMMCJAMMMMMMMM MMMMKJAMMMMMMMMM MMMKJAMMMMMMMMMM MMKKAMMMMMMMMMMM MKJAMMMMMMMMMMMM MJAMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 43 (heavy hammer) { MMMMMMMMMMOMMMMM MMMMMMMMMPPOAKMM MMMMMMMMEPPPPKMM MMMMMMMAEEPPPOMM MMMMMMMMAEKPPPOM MMMMMMMMMCJEPPPO MMMMMMMMKJAEEPEA MMMMMMMKJAMAEEAM MMMMMMKKAMMMAAMM MMMMMKJAMMMMMMMM MMMMKKAMMMMMMMMM MMMCJAMMMMMMMMMM MMKJAMMMMMMMMMMM MKJAMMMMMMMMMMMM MJAMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 44 (staff / quarterstaff) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMJKM MMMMMMMMMMMMJCJA MMMMMMMMMMMJKJAM MMMMMMMMMMJCJAAM MMMMMMMMMJCJAAMM MMMMMMMMJKJAAMMM MMMMMMMKKJAAMMMM MMMMMMMKJAAMMMMM MMMMMMCJAAMMMMMM MMMMMJJAAMMMMMMM MMMMKJAAMMMMMMMM MMMJJAAMMMMMMMMM MMKJAAMMMMMMMMMM MJJAAMMMMMMMMMMM MMAMMMMMMMMMMMMM } # tile 45 (vulgar polearm / partisan) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMPOM MMMMMMMMMMMMPNPM MMMMMMMMMMMONPAM MMMMMMMMMMONOAAM MMMMMMMMMMNOAAMM MMMMMMMMMKJAAMMM MMMMMMMMKJAAMMMM MMMMMMMKKAAMMMMM MMMMMMKJAAMMMMMM MMMMMKKAAMMMMMMM MMMMKJAAMMMMMMMM MMMKKAAMMMMMMMMM MMCJAAMMMMMMMMMM MJJAAMMMMMMMMMMM JJAAMMMMMMMMMMMM } # tile 46 (single-edged polearm / glaive) { MMMMMMMMMMMMMKAM MMMMMMMMMMMMKNOA MMMMMMMMMMMKNNPA MMMMMMMMMMKNNPAM MMMMMMMMMKNNPAMM MMMMMMMMKNNPAMMM MMMMMMMKKAAAMMMM MMMMMMCJAAMMMMMM MMMMMKJAAMMMMMMM MMMMKJAAMMMMMMMM MMMKKAAMMMMMMMMM MMKJAAMMMMMMMMMM MKKAAMMMMMMMMMMM CJAAMMMMMMMMMMMM JAAMMMMMMMMMMMMM AAMMMMMMMMMMMMMM } # tile 47 (forked polearm / spetum) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMPNM MMMMMMMMMMMMPNPM MMMMMMMMPOMPNOAM MMMMMMMMOPANOAAM MMMMMMMMAONOAMMM MMMMMMMMAKOOPOAM MMMMMMMMKJAAOPAM MMMMMMMKKAAAAAMM MMMMMMKJAAMMMMMM MMMMMCJAAMMMMMMM MMMMKJAAMMMMMMMM MMMKJAAMMMMMMMMM MMKJAAMMMMMMMMMM MJJAAMMMMMMMMMMM JJAAMMMMMMMMMMMM } # tile 48 (hilted polearm / ranseur) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMPNM MMMMMMMMMMMMPNPM MMMMMMMMMMMPNOAM MMMMMMMPOPPNOAAM MMMMMMMOAONOAMMM MMMMMMMAAKOOPMMM MMMMMMMMKJAAOAMM MMMMMMMKKAAOPAMM MMMMMMKJAAMAAMMM MMMMMKKAAMMMMMMM MMMMCJAAMMMMMMMM MMMKJAAMMMMMMMMM MMKJAAMMMMMMMMMM MJJAAMMMMMMMMMMM JJAAMMMMMMMMMMMM } # tile 49 (long poleaxe / bardiche) { MMMMMMMMMMMMMNAM MMMMMMMMMMMMPOPA MMMMMMMMMMMPNOPA MMMMMMMMMMPNNPAM MMMMMMMMMNNOPAMM MMMMMMMMKOAAMMMM MMMMMMMKKAAMMMMM MMMMMMKJAAMMMMMM MMMMMKKAAMMMMMMM MMMMCJAAMMMMMMMM MMMKJAAMMMMMMMMM MMKJAAMMMMMMMMMM MKKAAMMMMMMMMMMM JJAAMMMMMMMMMMMM JAAMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 50 (pole cleaver / voulge) { MMMMMMMMMMMMMNAM MMMMMMMMMMMMNNOA MMMMMMMMMMMNNNPA MMMMMMMMMMNNNPAM MMMMMMMMMNNOPAMM MMMMMMMMKOAAMMMM MMMMMMMKKAAMMMMM MMMMMMKJAAMMMMMM MMMMMKKAAMMMMMMM MMMMKJAAMMMMMMMM MMMCJAAMMMMMMMMM MMKJAAMMMMMMMMMM MKJAAMMMMMMMMMMM KJAAMMMMMMMMMMMM JAAMMMMMMMMMMMMM AAMMMMMMMMMMMMMM } # tile 51 (angled poleaxe / halberd) { MMMMMMMMMMMMMMMM MMMMMMMMMOOOAMMM MMMMMMMMMPPPKKMM MMMMMMMMMPPCKOOM MMMMMMMMMMKJPPPA MMMMMMMMMKJAPPPA MMMMMMMMKKAMAAAM MMMMMMMKJAMMMMMM MMMMMMKKAMMMMMMM MMMMMKJAMMMMMMMM MMMMCJAAMMMMMMMM MMMKJAAMMMMMMMMM MMKJAAMMMMMMMMMM MKJAAMMMMMMMMMMM JKAAMMMMMMMMMMMM JAAMMMMMMMMMMMMM } # tile 52 (pole sickle / fauchard) { MMMMMMMMMMNNNMMM MMMMMMMMMNPPPNMM MMMMMMMMMNPAAPNM MMMMMMMMMNPAMANA MMMMMMMMMMNAMMAA MMMMMMMMMNPAMMMM MMMMMMMMKJAMMMMM MMMMMMMKJAMMMMMM MMMMMMKKAMMMMMMM MMMMMKJAMMMMMMMM MMMMCJAMMMMMMMMM MMMKJAMMMMMMMMMM MMKJAMMMMMMMMMMM MKJAMMMMMMMMMMMM KKAMMMMMMMMMMMMM MAMMMMMMMMMMMMMM } # tile 53 (pruning hook / guisarme) { MMMMMMMMMMMMMNAM MMMMMMMMMMMMPOPA MMMMMMPNNPMPNOPA MMMMMMNAANPNNPAM MMMMMMMAMNNOPAMM MMMMMMMMKOAAMMMM MMMMMMMKJAAMMMMM MMMMMMKJAAMMMMMM MMMMMKKAAMMMMMMM MMMMKJAAMMMMMMMM MMMCJAAMMMMMMMMM MMKJAAMMMMMMMMMM MKJAAMMMMMMMMMMM KJAAMMMMMMMMMMMM KAAMMMMMMMMMMMMM AAMMMMMMMMMMMMMM } # tile 54 (hooked polearm / bill-guisarme) { MMMMMMMMMMMMMPNM MMMMMMMMMMMMPNAM MMMMMMMMMMMMPOPA MMMMMMPNNPMPNOPA MMMMMMNAANPNNPAM MMMMMMMAMNNOPAMM MMMMMMMMKOAAMMMM MMMMMMMKJAAMMMMM MMMMMMKKAAMMMMMM MMMMMCKJAMMMMMMM MMMMMKJAMMMMMMMM MMMONJAMMMMMMMMM MMONOAAMMMMMMMMM MPNOAAMMMMMMMMMM PNPAAMMMMMMMMMMM OPAAMMMMMMMMMMMM } # tile 55 (pronged polearm / lucern hammer) { MMMMMMMMMNPMMMMM MMMMMMMMMPNPMMMM MMMMMMMMMAPPPKMM MMMMMMMMMMAPKPPO MMMMMMMMMMMKPPPO MMMMMMMMMMCAPPPP MMMMMMMMMKJAPPPA MMMMMMMMKJAMAAAM MMMMMMMKKAAMMMMM MMMMMMKJAAMMMMMM MMMMMKKAAMMMMMMM MMMMCJAAMMMMMMMM MMMKJAAMMMMMMMMM MMKJAAMMMMMMMMMM MJJAAMMMMMMMMMMM JJAAMMMMMMMMMMMM } # tile 56 (beaked polearm / bec de corbin) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMPNMMMMMMMM MMMMMPNPAMMMMMMM MMMKPPPAAMMMMMMM AOPPKPAAMMMMMMMM MOPPPKAMMMMMMMMM MPPPPAKAMMMMMMMM MMPPPAMCAMMMMMMM MMMAAMMMCAMMMMMM MMMMMMMMMCAMMMMM MMMMMMMMMMCAMMMM MMMMMMMMMMMCAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 57 (crude spear / orcish spear) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMNM MMMMMMMMMMMMMNOM MMMMMMMMMMMMNOAM MMMMMMMMMMMKJAAM MMMMMMMMMMKJAAMM MMMMMMMMMLJAAMMM MMMMMMMMKJLAMMMM MMMMMMMKKAAJAMMM MMMMMMKJACKJAMMM MMMMMKKAAMCJAMMM MMMMKJAAMMLAMMMM MMMCJAAMMMMMMMMM MMKJAAMMMMMMMMMM MMJAAMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 58 (spear) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMNM MMMMMMMMMMMMMNOM MMMMMMMMMMMMNOAM MMMMMMMMMMMNOAAM MMMMMMMMMMKJAAMM MMMMMMMMMKKAAMMM MMMMMMMMKJLAMMMM MMMMMMMKKAAJAMMM MMMMMMCJAAKJAMMM MMMMMKJAAMCJAMMM MMMMKJAAMMLAMMMM MMMKKAAMMMMMMMMM MMKJAAMMMMMMMMMM MMJAAMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 59 (silver spear) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMOA MMMMMMMMMMMMMOAM MMMMMMMMMMMMPAMM MMMMMMMMMMMPAMMM MMMMMMMMMMPAMMMM MMMMMMMMMPAMMMMM MMMMMMMMPAMMMMMM MMMMMMMBAMMMMMMM MMMMMMBAMMMMMMMM MMMMMPAMMMMMMMMM MMMMPAMMMMMMMMMM MMMPAMMMMMMMMMMM MMOAMMMMMMMMMMMM MOAMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 60 (runed spear / elven spear) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMNM MMMMMMMMMMMMMNOM MMMMMMMMMMMMNOAM MMMMMMMMMMMNOAAM MMMMMMMMMMKJAAMM MMMMMMMMMKKAAMMM MMMMMMMMKJLAMMMM MMMMMMMCJAAFAMMM MMMMMMKJAAFFAMMM MMMMMKJAAMGFAMMM MMMMKJAAMMHAMMMM MMMCJAAMMMMMMMMM MMKJAAMMMMMMMMMM MMJAAMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 61 (stout spear / dwarvish spear) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMNMM MMMMMMMMMMMMNOMM MMMMMMMMMMMNOAMM MMMMMMMMMMNOAAMM MMMMMMMMMKJAAMMM MMMMMMMMKJAAMMMM MMMMMMMCJLAMMMMM MMMMMMKJAAJAMMMM MMMMMKJAACJAMMMM MMMMKJAAMLAMMMMM MMMKKAAMMMMMMMMM MMJJAAMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 62 (throwing spear / javelin) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMOA MMMMMMMMMMMMMOAM MMMMMMMMMMMMIAMM MMMMMMMMMMMIAMMM MMMMMMMMMMIAMMMM MMMMMMMMMIAMMMMM MMMMMMMMIAMMMMMM MMMMMMMLAMMMMMMM MMMMMMLAMMMMMMMM MMMMMIAMMMMMMMMM MMMMIAMMMMMMMMMM MMMIAMMMMMMMMMMM MMOAMMMMMMMMMMMM MOAMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 63 (trident) { MMMMMMMMMMMMMMMM MMMPAMMMMMMMMMMM MMMMPAMMMMMMMMMM MMPAMPAMMMMMMMMM PAMPAMPAMMMMMMMM MPAMPAPAMMMMMMMM MMPAMPPAMMMMMMMM MMMPPPPAMMMMMMMM MMMMMMMPAMMMMMMM MMMMMMMMPAMMMMMM MMMMMMMMMPAMMMMM MMMMMMMMMMPKAMMM MMMMMMMMMMJPKAMM MMMMMMMMMMMKPKAM MMMMMMMMMMMMJAMM MMMMMMMMMMMMMMMM } # tile 64 (lance) { PAMMMMMMMMMMMMMM MPAMMMMMMMMMMMMM MMBAMMMMMMMMMMMM MMMOAMMMMMMMMMMM MMMMOAMMMMMMMMMM MMMMMNAMMMMMMMMM MMMMMMNAMMMMMMMM MMMMMMPNAMMMMMMM MMMMMMMPNAMMMMMM MMMMMMMMBNAMMMMM MMMMMMMMMONAMMMM MMMMMMMMMMNNOOOA MMMMMMMMMMOONOAM MMMMMMMMMMOOONOA MMMMMMMMMMOAMONO MMMMMMMMMMMMMMON } # tile 65 (crude bow / orcish bow) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMKCPMMMMMMMMM MMMMMPKMMMMMMMMM MMMMMPKJMMMMMMMM MMMMMPMKJMMMMMMM MMMMMPMMKMMMMMMM MMMMMOMMLMMMMMMM MMMMMPMMOMMMAMMM MMMMMPMMJMMAAMMM MMMMMPMKJMMAMMMM MMMMMPCJMMAAMMMM MMMMMPKMAAAMMMMM MMMMKKPAAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 66 (bow) { MMMMMMMMMMMMMMMM MMMMMKMMMMMMMMMM MMMMMKPMMMMMMMMM MMMMMPKMMMMMMMMM MMMMMPCJMMMMMMMM MMMMMPMKJMMMMMMM MMMMMPMMKMMMMMMM MMMMMOMMLMMMMMMM MMMMMPMMOMMMMMMM MMMMMPMMJMMAAMMM MMMMMPMKJMMAMMMM MMMMMPCJMMAAMMMM MMMMMPKMMAAMMMMM MMMMMKPAAAMMMMMM MMMMMKAAMMMMMMMM MMMMMMMMMMMMMMMM } # tile 67 (runed bow / elven bow) { MMMMMKMMMMMMMMMM MMMMMKPMMMMMMMMM MMMMMPCMMMMMMMMM MMMMMPKJMMMMMMMM MMMMMPMKJMMMMMMM MMMMMPMMKMMMMMMM MMMMMPMMKKMMMMMM MMMMMPMMJLMMMMMM MMMMMOMMJJMMMMMM MMMMMPMMJLMMMMMM MMMMMPMMJMMAAMMM MMMMMPMKJMMAMMMM MMMMMPCJMMAAMMMM MMMMMPKMMAAMMMMM MMMMMKPAAAMMMMMM MMMMMKAAMMMMMMMM } # tile 68 (black runed bow / dark elven bow) { MMMMMEMMMMMMMMMM MMMMMEBMMMMMMMMM MMMMMPEMMMMMMMMM MMMMMPEEMMMMMMMM MMMMMPMEEMMMMMMM MMMMMPMMEMMMMMMM MMMMMPMMEEMMMMMM MMMMMPMMEBMMMMMM MMMMMOMMEEMMMMMM MMMMMPMMEBMMMMMM MMMMMPMMEMMAAMMM MMMMMPMEEMMAMMMM MMMMMPEEMMAAMMMM MMMMMPEMMAAMMMMM MMMMMEBAAAMMMMMM MMMMMEAAMMMMMMMM } # tile 69 (long bow / yumi) { MMMMMLMMMMMMMMMM MMMMMLPMMMMMMMMM MMMMMPLMMMMMMMMM MMMMMPLOMMMMMMMM MMMMMPMLOMMMMMMM MMMMMPMMLMMMMMMM MMMMMPMMLOMMMMMM MMMMMPMMOLMMMMMM MMMMMPMMOOMMMMMM MMMMMPMMOLMMMMMM MMMMMPMMOMMAAMMM MMMMMPMLOMMAMMMM MMMMMPLOMMAAMMMM MMMMMPLMMAAMMMMM MMMMMLPAAAMMMMMM MMMMMLAAMMMMMMMM } # tile 70 (crude arrow / orcish arrow) { MMMMMMMMMMMMMMMM MMMMMMMMMMPPMMMM MMMMMMMMMPBPOMMM MMMMMMMMMBPOBLMM MMMMMMMMMPOBLAMM MMMMMMMMJKAAAMMM MMMMMMMJKAMMMMMM MMMMMMJCAMMMMMMM MMMMMJKAMMMMMMMM MMMMJKAMMMMMMMMM MMMJKAMMMMMMMMMM MOJCAMMMMMMMMMMM MONAAMMMMMMMMMMM MNNOAMMMMMMMMMMM MMAAAMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 71 (arrow) { MMMMMMMMMMMMMMMM MMMMMMMMMMPPMMMM MMMMMMMMMPBPOMMM MMMMMMMMMBPOBLMM MMMMMMMMMPOBLAMM MMMMMMMMJPAAAMMM MMMMMMMJKAMMMMMM MMMMMMJCAMMMMMMM MMMMMJKAMMMMMMMM MMMMJKAMMMMMMMMM MMMJKAMMMMMMMMMM MOOCAMMMMMMMMMMM MONNAMMMMMMMMMMM MNNOAMMMMMMMMMMM MMAAAMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 72 (silver arrow) { MMMMMMMMMMMMMMMM MMMMMMMMMMDPMMMM MMMMMMMMMDBDOMMM MMMMMMMMMBDOBDMM MMMMMMMMMDOBDAMM MMMMMMMMPPAAAMMM MMMMMMMPPAMMMMMM MMMMMMPPAMMMMMMM MMMMMPPAMMMMMMMM MMMMPPAMMMMMMMMM MMMPPAMMMMMMMMMM MOPPAMMMMMMMMMMM MOPPAMMMMMMMMMMM MNNOAMMMMMMMMMMM MMAAAMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 73 (runed arrow / elven arrow) { MMMMMMMMMMMMMMMM MMMMMMMMMMFFMMMM MMMMMMMMMFGFOMMM MMMMMMMMMGFOGHMM MMMMMMMMMFOGHAMM MMMMMMMMJFAAAMMM MMMMMMMJKAMMMMMM MMMMMMKKAMMMMMMM MMMMMJKAMMMMMMMM MMMMJCAMMMMMMMMM MMMJKAMMMMMMMMMM MOOCAMMMMMMMMMMM MONNAMMMMMMMMMMM MNNOAMMMMMMMMMMM MMAAAMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 74 (black runed arrow / dark elven arrow) { MMMMMMMMMMMMMMMM MMMMMMMMMMDMMMMM MMMMMMMMMDCMMMMM MMMMMMMMMCKJJKAM MMMMMMMMMKJJCAMM MMMMMMMMEEAAAMMM MMMMMMMEEAMMMMMM MMMMMMEEAMMMMMMM MMMMMEEAMMMMMMMM MMMMEEAMMMMMMMMM MMMEEAMMMMMMMMMM MNEEAMMMMMMMMMMM MNPAMMMMMMMMMMMM MPPPAMMMMMMMMMMM MMAAAMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 75 (bamboo arrow / ya) { MMMMMMMMMMMMMMMM MMMMMMMMMMBPMMMM MMMMMMMMMBBPOMMM MMMMMMMMBBPOBLMM MMMMMMMMMPOBLAMM MMMMMMMMCJBLAMMM MMMMMMMCJAMAMMMM MMMMMMCJAMMMMMMM MMMMMCJAMMMMMMMM MMMMCJAMMMMMMMMM MMMCJAMMMMMMMMMM MMCJAMMMMMMMMMMM OCJAMMMMMMMMMMMM ONAMMMMMMMMMMMMM NNPAMMMMMMMMMMMM MAAMMMMMMMMMMMMM } # tile 76 (sling) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMJJJJMMMMMM MMMMMJAAAAJKMMMM MMMMJAMMMMMKCMMM MMMMMMMMMMJAKAMM MMMMMMJJKCAKKAMM MMMMJJAAAKKKJAMM MMMJAAMMMAAAAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 77 (pistol) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMBABBBBBBBBBBAM MMBBPPPPPPPPPPAM MMMBPPPPPPPPPPAM MMMBKKPAPAPAAMMM MMBKKJPAPAPAAMMM MMBKJJPAAAPAAMMM MMBCJJPPPPAAAMMM MMBKJJPAAAAAMMMM MMMBPPAAAAAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 78 (submachine gun) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MJJPMMMMMMMMMMMM MMAJJJJJJJAAAAPM MAAAAAAAAAAAAAPM MAAAAAAAAAAAPPMM MMMAAAAAAAAPMMMM MMMAAAPMAPPMMMMM MMAAAPAPAPPPPMMM MMAAAPPAAPPPMMMM MAAAAPPMAAPMMMMM MAAAAPMMMMMMMMMM MPPPPMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 79 (heavy machine gun) { MMMMMMMMMMMMMMMM MMMBBBBMMMMMMMMM MMBAAABMMMMMMMBM MPPBBBBBBBBBBBBM MPPPPPPPBBBBBAAM MMDDDPPPPPPPPAAM MMOOHPPPPPPPPPPM MMAADAAAAAAAAAAM MMOOHAMMMMMMMMMM MMAADAMMMMMMMMMM MMOOHAMMMMMMMMMM MMAADAMMMMMMMMMM MOOHAAMMMMMMMMMM MAADAMMMMMMMMMMM MOOHAMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 80 (rifle) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMBMMMMMMMMMMMM MMMABBBBBBBBBBBM MKKCKKKKCKPPPPPM AKJJJKJJJJAAAAMM AKJJJABAAAMMMMMM AKKJJAAAMMMMMMMM AKJJAAMMMMMMMMMM MAAAAMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 81 (assault rifle) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMBAM MMMMMMMMMMMMBBMM MMMMMMMMMMMBBAMM MMMMMMMMMMBBAAMM MMMMMMEEEBBAMMMM MMMMMEMMBBBAMMMM MMMMEMMBBBEEEEEM MMMMEMBBBEEEEEAM MMMMEBBPEEEEEAMM MMMMEEAPAAAAAMMM MMMEEPPAMMMMMMMM MMEEEAAMMMMMMMMM MEEEEAMMMMMMMMMM MEEEEAMMMMMMMMMM MMAAAAMMMMMMMMMM } # tile 82 (sniper rifle) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMABMM MMMMMMMMMMMBBMAM MMMMMEAMMMBMAAMM MMMMMEEMMBMAMMMM MMMMEEMMBPAMMMMM MMMEEPPBPPAMMMMM MEEEPPBPPAMMMMMM MEEMMBPPAMMMMMMM MMMMBEPAMMMMMMMM MMBBEEAMMMMMMMMM MBBEEEAMMMMMMMMM MMMEEEAMMMMMMMMM MMMEEEAMMMMMMMMM MMMMAAAMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 83 (shotgun) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMBMMMMMMMMMMMM MMMMBBBBBBBBBABM MMMKJJPPPPPPPPPM MMCJJJPPKJJJJKPM MKJJJAPAAKKCKAAM AKJJJAAAAAAAAAMM AAKJAMAMMAAAMMMM MAACAMMMMMMMMMMM MMAAAMMMMMMMMMMM MMAAMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 84 (auto shotgun) { MMMMMMMMMMMMBMMM MMMMMMMMMMPBABMM MMMMMMMMMPBBBMMM MMMMMMMMPPBBJKMM MMMMMMMPBBBJJHMM MMMMMMPPBHJKJDHM MMMMMPBBDHJJADHM MMMMPPBBDHHAAHDM MMPPKPPPDDHHHDAM MMMKJPPPADDDDAMM MMKKJPPPAAAAAMMM MKJJAAPPPAMMMMMM MCJJAAPPPAMMMMMM MMKJAAAPAMMMMMMM MMAAAMAAAMMMMMMM MMMMMMMMMMMMMMMM } # tile 85 (rocket launcher) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMGGGGGGGGGGGGM MMGGGGGGGGGGGAGM MMGGGGGGGGGAGAGM MMFFFFFFFFGAGGGM MMFJFFFJFFGGGAGM MMAJFFFJFFGAGAGM MMAJFFFJJFGAGGGM MMAJJFFFJFGGGAAM MMAAJAAAAJAAAAAM MMAAJJKKJJAAAAAM MMMAAACKAAAAAAMM MMMMAAAAAAAAMMMM MMMMMMMMMMMMMMMM } # tile 86 (grenade launcher) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMPMMMMMMMMPMM MBMMMPPPPPPPPPMM ABBMMBBBBBBBAAMM ABBBBBPPBBBBAAMM ABBAAJJAPBBBAAMM ABAAAJAAPAAMMMMM AAAAAJAAAAMMMMMM MAAMAAAMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 87 (bullet) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMBBBAMMMMMM MMMMMMBPPBAMMMMM MMMMMMBPPAMMMMMM MMMMMMAAAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 88 (silver bullet) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMNNNAMMMMMM MMMMMMNBBNAMMMMM MMMMMMNBBAMMMMMM MMMMMMAAAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 89 (shotgun shell) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMAHHMMMMMMMM MMMMMADDMMMMMMMM MMMMMADDMMMMMMMM MMMMMADDMMMMMMMM MMMMMAAAMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 90 (rocket) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMDBBM MMMMMMMMMMMPDDBM MMMMMMMMMMMPBDDM MMMMMMMMMMPBPPMM MMMMMMMMMPBPMMMM MMMMMMMMPBPMMMMM MMMMMEPPBPMMMMMM MMMEEPPEPMMMMMMM MMEEEPEPPMMMMMMM MMMMMEPPEMMMMMMM MMMMEMEEMMMMMMMM MMMMMMEEMMMMMMMM MMMMMMEMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 91 (frag grenade) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMPPMMMMMM MMMMMMMGGMPMMMMM MMMMMMGGGAMPMMMM MMMMMFFFFFMPMMMM MMMMMFFFFFPMMMMM MMMMMFFFFFAMMMMM MMMMMFFFFFAMMMMM MMMMMMFFFAMMMMMM MMMMMMAAAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 92 (gas grenade) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMOOPPMMMMM MMMMMMOCCCPPMMMM MMMMMACOOOPMPMMM MMMMMACCCCPMPMMM MMMMMAONNNOPMMMM MMMMMACOAOCMMMMM MMMMMACNNNCMMMMM MMMMMACCCCCMMMMM MMMMMAACCCMMMMMM MMMMMMAAAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 93 (red stick / stick of dynamite) { MMMMMMMMMMMMMMMM MMMMMMMMMMMNNMMM MMMMMMMMMMNMMMMM MMMMMMMMMNMMMMMM MMMMMMMMCNMMMMMM MMMMMMMCNCMMMMMM MMMMMMMDCDMMMMMM MMMMMMMDDDMMMMMM MMMMMMMDDDMMMMMM MMMMMMMDDDMMMMMM MMMMMMMDDDMMMMMM MMMMMMMDDDMMMMMM MMMMMMMDDDMMMMMM MMMMMMMMDMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 94 (crossbow) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMCJJMMMMMM MMMMMMMDJJMMMMMM MMMMMDKJJJKMMMMM MMMDKJJJJJJJKMMM MMDJMMMDJJMMJKMM MMMMPMMCJJMPMMMM MMMMMPMCJJPMMMMM MMMMMMPCJPAAAAMM MMMMMMMPPAMAAAAM MMMMMMMCJJAAMMAM MMMMMMMOAOAMMMMM MMMMMMMMOAMMMMMM MMMMMMMMMMMMMMMM } # tile 95 (crossbow bolt) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMNMMMMMMMMMMMM MMAONMMMMMMMMMMM MMMAOKMMMMMMMMMM MMMMAJKMMMMMMMMM MMMMMAKKMMMMMMMM MMMMMMAJKMMMMMMM MMMMMMMAKKMMMMMM MMMMMMMMAJKMMMMM MMMMMMMMMAKKMMMM MMMMMMMMMMAJJMMM MMMMMMMMMMMAAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 96 (dart) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMOOOMM MMMMMCLCLMOBBAMM MNNNCJDJDCBAAAMM MAAAAJDJDAOBBMMM MMMMMAAAAMMOOOMM MMMMMMMMMMMAAAMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 97 (throwing star / shuriken) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMPNMMMMMMMMM MMMMMNAPNNPMMMMM MMMMMNNNNANAMMMM MMMMMPNNNPAAMMMM MMMMNMNNNNMMMMMM MMMMPNNPANAMMMMM MMMMMAAANPAMMMMM MMMMMMMMMAAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 98 (boomerang) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMKKMMMMMMMMMM MMMMKHKAMMMMMMMM MMMMMKHKAMMMMMMM MMMMMMCKKAMMMMMM MMMMMMMKCKAMMMMM MMMMMMMMKDKAMMMM MMMMMMMMJDKAMMMM MMMMMMMJKDJAMMMM MMMMMMJKDJAMMMMM MMMMMJHDJAMMMMMM MMMMJHDJAMMMMMMM MMMMMKJAMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 99 (bullwhip) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMKKKKKKMMM MMMMMKCAAAAAAKAM MMMMKAAMMMMMMCAM MMMKAMMMMMMMKAMM MMMKAMMMMMMMJAMM MMMKAMMMMMMMMJAM MMMMCKKCKKMMMMMM MMMMMAAAAAKAMMMM MPMMMMMMMMCAMMMM MAPPMMMMMMKAMMMM MMMAPKMMMKAMMMMM MMMMMAKCKAMMMMMM MMMMMMAAAMMMMMMM MMMMMMMMMMMMMMMM } # tile 100 (rubber hose) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMFGFMMMMMM MMMMMFGAAAGFMMMM MMMMGAAMMMAAAMMM MMMMGAMMMMMMMMMM MMMMMGAMMMMMMMMM MMMMMMFGAMMMMMMM MMMMMMMMGAMMMMMM MMMMMMMMFAMMMMMM MMMMMMMGAMMMMMMM MMMGGGFAMMMMMMMM MMMMAAAMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 101 (Hawaiian shirt) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMCMMMMMCMMMMM MMMGCGGGGGCHMMMM MMGGHCGGGCHHHMMM MHHHJHCCCHJHHHMM MMHHJHHCHHJHHAAM MMMMGHHCGGHAAAMM MMMMHHHCGGHAMMMM MMMMGGHCHHHAMMMM MMMMGGHCHGGAMMMM MMMMHHHCHHHAMMMM MMMMMAAAAAAAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 102 (T-shirt) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMPMMMMMPMMMMM MMMNPOOOOOPNMMMM MMNNNPOOOPNNNMMM MNNNONPPPNONNNMM MMNNONNNNNONNAAM MMMMNDODODNAAAMM MMMMNNNNNNNAMMMM MMMMNDODODNAMMMM MMMMNNNNNNNAMMMM MMMMNNNNNNNAMMMM MMMMMAAAAAAAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 103 (plate mail) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMNMNNNOOOMOMMM MNMNNNNNOOOOOMOM MNMNNNNNOOOOOAOA MNMNNNNONOOOOAOA MMANNNOONNOOOAMA MMMNNNOONNOOOAMM MMMNNNNONOOOOAMM MMMMNNNNOOOOAAMM MMMNMNNNOOOAOAMM MMNNNANNOOAOOOAM MNNNOAMNOAAOOOOA MMNOAAMMMMMMOOAM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 104 (crystal plate mail) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMNMNNNBBBMBMMM MNMNNNNNBBBBBMBM MNMNNNNNBBBBBABA MNMNNNNBNBBBBABA MMANNNBBNNBBBAMA MMMNNNBBNNBBBAMM MMMNNNNBNBBBBAMM MMMMNNNNBBBBAAMM MMMNMNNNBBBABAMM MMNNNANNBBABBBAM MNNNBAMNBAABBBBA MMNBAAMMMMMMBBAM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 105 (bronze plate mail) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMLMLLLCCCMCMMM MLMLLLLLCCCCCMCM MLMLLLLLCCCCCACA MLMLLLLCLCCCCACA MMALLLCCLLCCCAMA MMMLLLCCLLCCCAMM MMMLLLLCLCCCCAMM MMMMLLLLCCCCAAMM MMMLMLLLCCCACAMM MMLLLALLCCACCCAM MLLLCAMLCAACCCCA MMLCAAMMMMMMCCAM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 106 (splint mail) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMNMNNNOOOMOMMM MNMNNNNNOOOOOMOM MJMNPPPPMMMMOAJA MNMNKKKKJJJJOAOA MMANPPPPMMMMOAMA MMMNKCKCJJJJOAMM MMMNPPPPMMMMOAMM MMMMNKKKJJJOAAMM MMMNMNPPMMOAOAMM MMNPNANKJOAOPOAM MNPJOAMNOAAOJPOA MMNOAAMMMMMMOOAM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 107 (banded mail) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMNMNNNOOOMOMMM MNMNNNNNOOOOOMOM MPMNPNPPPPOPOAPA MNMNMMMMMMMMOAOA MMANPNPPPPOPOAMA MMMNMMMMMMMMOAMM MMMNPNPPPPOPOAMM MMMMNMMMMMMOAAMM MMMNMNPNOPOAOAMM MMNPNANMMOAOPOAM MNPMOAMNOAAOMPOA MMNOAAMMMMMMOOAM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 108 (dwarvish mithril-coat) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMNNNNNOOOOOMMM MNMNANANAPAPOMOM MNMNNANAPAPAOAOA MNMNANANAPAPOAOA MMANNANAPAPAOAMA MMMNANANAPAPOAMM MMMNNANAPAPAOAMM MMMMNNANAPAOAAMM MMMNMNNAPAOAOAMM MMNPNANNAOAOMOAM MNPNOAMNOAAOOMOA MMNOAAMMMMMMOOAM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 109 (dark elven mithril-coat) { MMMMMMMMMMMMMMMM MMMBMBMBFMFMFMMM MMMBBBBBFFFFFMMM MNMBANANAPAFFMOM MNMBNANAPAPAFAOA MNMBANANAPAPFAOA MMABNANAPAPAFAMA MMMBANANAPAPFAMM MMMBBANAPAPAFAMM MMMMBBANAPAFAAMM MMMNMBBAPAFAOAMM MMNPNABBAFAOMOAM MNPNOAMBFAAOOMOA MMNOAAMMMMMMOOAM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 110 (elven mithril-coat) { MMMMMMMMMMMMMMMM MMMNMNMNOMOMOMMM MMMNNNNNOOOOOMMM MNMNANANAOAOOMOM MNMONANAPAPAOAOA MNMNANANAPAPOAOA MMAONANAPAPAOAMA MMMNANANAPAPOAMM MMMONANAPAPAOAMM MMMMONANAPAOAAMM MMMNMONAPAOAOAMM MMNPNAONAOAOMOAM MNPNOAMOOAAOOMOA MMNOAAMMMMMMOOAM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 111 (chain mail) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMNMNNNOOOMOMMM MNMNNNNNOOOOOMOM MNMNPAPAMAMAOAOA MNMNAPAPAMAMOAOA MMANPAPAMAMAOAMA MMMNAPAPAMAMOAMM MMMNPAPAMAMAOAMM MMMMNPAPAMAOAAMM MMMNMNPAMAOAOAMM MMNPNANPAOAOMOAM MNPNOAMNOAAOOMOA MMNOAAMMMMMMOOAM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 112 (crude chain mail / orcish chain mail) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMKMKKKJJJMJMMM MKMKCKCKJJJJJMJM MKMKPAPAMAMAJAJA MCMKAPAPAMAMJAJA MMAKPAPAMAMAJAMA MMMKAPAPAMAMJAMM MMMCPAPAMAMAJAMM MMMMKPAPAMAJAAMM MMMKMKPAMAJAJAMM MMKKCAKPAJAJJJAM MKCKJAMKJAAJJJJA MMKJAAMMMMMMJJAM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 113 (scale mail) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMNMNNNOOOMOMMM MNMNNNNNOOOOOMOM MPMNPAPAAMAMOAMA MNMNAPPPMMMAOAOA MMANPAPAAMAMOAMA MMMNPPAPMAMMOAMM MMMNPAPAAMAMOAMM MMMMNPPPMMMOAAMM MMMNMNPAAMOAOAMM MMNPNANPMOAOMOAM MNPPOAMNOAAOMMOA MMNOAAMMMMMMOOAM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 114 (studded leather armor) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMNMNNNOOOMOMMM MNMNNNNNOOOOOMOM MKMNKKKKJJJJOAKA MKMNKNKNOJOJOAKA MMANKCKKKJJJOAMA MMMNKNKNOJOJOAMM MMMNKKCKJJJJOAMM MMMMNKNKJOJOAAMM MMMNMNKCJJOAOAMM MMNKKANKJOAOCKAM MNKCJAMNOAAOKKCA MMKJAAMMMMMMKKAM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 115 (ring mail) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMNMNNNOOOMOMMM MNMNNNNNOOOOOMOM MPMNPAAPMAAMOAMA MNMNABPAAMPAOAOA MMANAPBAAPMAOAMA MMMNPAAPMAAMOAMM MMMNAPBAAPMAOAMM MMMMNBPAAMPOAAMM MMMNMNAPMAOAOAMM MMNPNANAAOAOMOAM MNPBOAMNOAAOPMOA MMNOAAMMMMMMOOAM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 116 (crude ring mail / orcish ring mail) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMKMKCKJJJMJMMM MKMCKKKKJJJJJMJM MBMKPAAPMAAMJAPA MKMKABPAAMPAJAJA MMACAPBAAPMAJAMA MMMKPAAPMAAMJAMM MMMKAPBAAPMAJAMM MMMMKBPAAMPJAAMM MMMCMKAPMAJAJAMM MMKPCAKAAJAJMJAM MKPBJAMKJAAJPMJA MMKJAAMMMMMMJJAM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 117 (leather armor) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMNMNNNOOOMOMMM MKMNNNNNOOOOOMJM MKMNKKKKJJJJOAJA MKMNKCKKKJJJOAJA MMANKKJJCKJJOAMA MMMNCKJJKKJJOAMM MMMNKKCJKKJJOAMM MMMMNKKKJJJOAAMM MMMKMNKCJJOAJAMM MMCKKANKJOAJJJAM MKKKKAMNOAAJJJJA MMCJAAMMMMMMJJAM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 118 (leather jacket) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMKAMJAMMMMM MMMMCKCKJJJJAMMM MMMKKKKKKLJJJAMM MMKKCKCKJJJJJJAM MMMKAKKKJLJAJAAM MMMMMKCKJJJAMAMM MMMMMKKCJLJAMMMM MMMMMKKKJJJAMMMM MMMMMMAAAAAAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 119 (red robe / robe) { MMMMMMMMMMMMMMMM MMMMMMOOOMMMMMMM MMMMMOAOOOAMMMMM MMMMMMOPPPOAMMMM MMMMMOMOOOPOAMMM MMMMOOOOOOOAMMMM MMMOPOOOOOOAMMMM MMMOPOOOOPOOAMMM MMMOPJOOOPOOAMMM MMMOPOJJPOOOAMMM MMMMOOJOPOOOAMMM MMMMMOJOOPAAAAMM MMMMMOJOOOAAAAAM MMMMMOOOOOOAAAMM MMMMOOOOOOOOAMMM MMMMMMMMMMMMMMMM } # tile 120 (blue robe / robe of protection) { MMMMMMMMMMMMMMMM MMMMMMOOOMMMMMMM MMMMMOAOOOAMMMMM MMMMMMOPPPOAMMMM MMMMMOMOOOPOAMMM MMMMOOOOOOOAMMMM MMMOPOOOOOOAMMMM MMMOPOOOOPOOAMMM MMMOPEOOOPOOAMMM MMMOPOEEPOOOAMMM MMMMOOEOPOOOAMMM MMMMMOEOOPAAAAMM MMMMMOEOOOAAAAAM MMMMMOOOOOOAAAMM MMMMOOOOOOOOAMMM MMMMMMMMMMMMMMMM } # tile 121 (orange robe / robe of power) { MMMMMMMMMMMMMMMM MMMMMMOOOMMMMMMM MMMMMOAOOOAMMMMM MMMMMMOPPPOAMMMM MMMMMOMOOOPOAMMM MMMMOOOOOOOAMMMM MMMOPOOOOOOAMMMM MMMOPOOOOPOOAMMM MMMOPDOOOPOOAMMM MMMOPODDPOOOAMMM MMMMOODOPOOOAMMM MMMMMODOOPAAAAMM MMMMMODOOOAAAAAM MMMMMOOOOOOAAAMM MMMMOOOOOOOOAMMM MMMMMMMMMMMMMMMM } # tile 122 (green robe / robe of weakness) { MMMMMMMMMMMMMMMM MMMMMMOOOMMMMMMM MMMMMOAOOOAMMMMM MMMMMMOPPPOAMMMM MMMMMOMOOOPOAMMM MMMMOOOOOOOAMMMM MMMOPOOOOOOAMMMM MMMOPOOOOPOOAMMM MMMOPIOOOPOOAMMM MMMOPOIIPOOOAMMM MMMMOOIOPOOOAMMM MMMMMOIOOPAAAAMM MMMMMOIOOOAAAAAM MMMMMOOOOOOAAAMM MMMMOOOOOOOOAMMM MMMMMMMMMMMMMMMM } # tile 123 (gray dragon scale mail) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMNMNNNOOOMOMMM MNMNNNNNOOOOOMOM MNMNMMPMMMPMOAOA MNMNMPMMMPMMOAOA MMANPMMMPMMMOAMA MMMNMMMPMMMPOAMM MMMNMMPMMMPMOAMM MMMMNPMMMPMOAAMM MMMNMNMMPMOAOAMM MMNNNANPMOAOOOAM MNNNOAMNOAAOOOOA MMNOAAMMMMMMOOAM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 124 (silver dragon scale mail) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMNMNNNOOOMOMMM MNMNNNNNOOBOOMOM MNMNOBNOOBNOBAOA MNMNBNOOBNOBBAOA MMANNOOBNOBBBAMA MMMNOOBNOBBNBAMM MMMNOBNOBBNBBAMM MMMMNNOBBNBBAAMM MMMNMNBBNBBAOAMM MMNNNANNBBAOOOAM MNNNBAMNBAAOOOOA MMNBAAMMMMMMOOAM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 125 (shimmering dragon scale mail) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMBMBBBOOOMOMMM MBMBBBBBOOOOOMOM MBMBEEFFGGHHOAOA MBMBEFFGGHHCOACA MMABFFGGHHCDOAMA MMMBFGGHHCDDOAMM MMMBGGHHCDDKOAMM MMMMBHHCDDKOAAMM MMMBMBCDDKOAOAMM MMBBBABDKOAOOCAM MBBBOAMBBAAOOOCA MMBOAAMMMMMMKCAM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 126 (deep dragon scale mail) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMGMGGGFFFMFMMM MNMGGGGGFFFFFMOM MNMGFFGFMMGPFAOA MNMGFGFMMGPPFAOA MMAGGFMMGPPBFAMA MMMGFMMGPPBGFAMM MMMGMMGPPBGBFAMM MMMMGGPPBGBFAAMM MMMNMGPBGBFAOAMM MMNNNAGGBFAOOOAM MNNNOAMFFAAOOOOA MMNOAAMMMMMMOOAM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 127 (red dragon scale mail) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMNMNNNOOOMOMMM MNMNNNNNOOOOOMOM MNMNDDIDDDIDOAOA MNMNDIDDDIDDOAOA MMANIDDDIDDDOAMA MMMNDDDIDDDIOAMM MMMNDDIDDDIDOAMM MMMMNIDDDIDOAAMM MMMNMNDDIDOAOAMM MMNNNANIDOAOOOAM MNNNOAMNOAAOOOOA MMNOAAMMMMMMOOAM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 128 (white dragon scale mail) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMNMNNNOOOMOMMM MNMNNNNNOOOOOMOM MNMNOONOOONOOAOA MNMNONOOONOOOAOA MMANNOOONOOOOAMA MMMNOOONOOONOAMM MMMNOONOOONOOAMM MMMMNNOOONOOAAMM MMMNMNOONOOAOAMM MMNNNANNOOAOOOAM MNNNOAMNOAAOOOOA MMNOAAMMMMMMOOAM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 129 (orange dragon scale mail) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMNMNNNOOOMOMMM MNMNNNNNOOOOOMOM MNMNCCLCCCLCOAOA MNMNCLCCCLCCOAOA MMANLCCCLCCCOAMA MMMNCCCLCCCLOAMM MMMNCCLCCCLCOAMM MMMMNLCCCLCOAAMM MMMNMNCCLCOAOAMM MMNNNANLCOAOOOAM MNNNOAMNOAAOOOOA MMNOAAMMMMMMOOAM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 130 (black dragon scale mail) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMNMNNNOOOMOMMM MNMNNNNNOOOOOMOM MNMNAAMAAAMAOAOA MNMNAMAAAMAAOAOA MMANMAAAMAAAOAMA MMMNAAAMAAAMOAMM MMMNAAMAAAMAOAMM MMMMNMAAAMAOAAMM MMMNMNAAMAOAOAMM MMNNNANMAOAOOOAM MNNNOAMNOAAOOOOA MMNOAAMMMMMMOOAM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 131 (blue dragon scale mail) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMNMNNNOOOMOMMM MNMNNNNNOOOOOMOM MNMNEEBEEEBEOAOA MNMNEBEEEBEEOAOA MMANBEEEBEEEOAMA MMMNEEEBEEEBOAMM MMMNEEBEEEBEOAMM MMMMNBEEEBEOAAMM MMMNMNEEBEOAOAMM MMNNNANBEOAOOOAM MNNNOAMNOAAOOOOA MMNOAAMMMMMMOOAM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 132 (green dragon scale mail) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMNMNNNOOOMOMMM MNMNNNNNOOOOOMOM MNMNFFGFFFGFOAOA MNMNFGFFFGFFOAOA MMANGFFFGFFFOAMA MMMNFFFGFFFGOAMM MMMNFFGFFFGFOAMM MMMMNGFFFGFOAAMM MMMNMNFFGFOAOAMM MMNNNANGFOAOOOAM MNNNOAMNOAAOOOOA MMNOAAMMMMMMOOAM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 133 (yellow dragon scale mail) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMNMNNNOOOMOMMM MNMNNNNNOOOOOMOM MNMNHHNHHHNHOAOA MNMNHNHHHNHHOAOA MMANNHHHNHHHOAMA MMMNHHHNHHHNOAMM MMMNHHNHHHNHOAMM MMMMNNHHHNHOAAMM MMMNMNHHNHOAOAMM MMNNNANNHOAOOOAM MNNNOAMNOAAOOOOA MMNOAAMMMMMMOOAM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 134 (gray dragon scales) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMPMMMMMMM MMMMMMMPPPMMMMMM MMMMPMPPPPAMMMMM MMMPPPMPPAAPMMMM MMPPPPAPAAPPAMMM MMMPPAAPPAPAAMMM MMMMAAPPAAAAMMMM MMMMMMMAAPAMMMMM MMMMMMMPPAAMMMMM MMMMMMMMAAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 135 (silver dragon scales) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMNMMMMMMM MMMMMMMNNNMMMMMM MMMMNMNNNNAMMMMM MMMNNNMNNAANMMMM MMNNNNANAANNAMMM MMMNNAANNANAAMMM MMMMAANNAAAAMMMM MMMMMMMAANAMMMMM MMMMMMMNNAAMMMMM MMMMMMMMAAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 136 (shimmering dragon scales) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMPMMMMMMM MMMMMMMPPPMMMMMM MMMMEMPPFPAMMMMM MMMEBBMFFAAHMMMM MMEBBPAFAAHDAMMM MMMEBAAGGADAAMMM MMMMAAGGAAAAMMMM MMMMMMMAADAMMMMM MMMMMMMGHAAMMMMM MMMMMMMMAAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 137 (deep dragon scales) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMBMMMMMMM MMMMMMMPPBMMMMMM MMMMBMPFFBAMMMMM MMMBBFMFFAAPMMMM MMBBFFAFAAPPAMMM MMMBFAAMFAPAAMMM MMMMAABBAAAAMMMM MMMMMMMAAPAMMMMM MMMMMMMFPAAMMMMM MMMMMMMMAAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 138 (red dragon scales) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMDMMMMMMM MMMMMMMDDDMMMMMM MMMMDMDDDDAMMMMM MMMDDDMDDAADMMMM MMDDDDADAADDAMMM MMMDDAADDADAAMMM MMMMAADDAAAAMMMM MMMMMMMAADAMMMMM MMMMMMMDDAAMMMMM MMMMMMMMAAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 139 (white dragon scales) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMOMMMMMMM MMMMMMMOOOMMMMMM MMMMOMOOOOAMMMMM MMMOOOMOOAAOMMMM MMOOOOAOAAOOAMMM MMMOOAAOOAOAAMMM MMMMAAOOAAAAMMMM MMMMMMMAAOAMMMMM MMMMMMMOOAAMMMMM MMMMMMMMAAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 140 (orange dragon scales) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMCMMMMMMM MMMMMMMCCCMMMMMM MMMMCMCCCCAMMMMM MMMCCCMCCAACMMMM MMCCCCACAACCAMMM MMMCCAACCACAAMMM MMMMAACCAAAAMMMM MMMMMMMAACAMMMMM MMMMMMMCCAAMMMMM MMMMMMMMAAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 141 (black dragon scales) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMAMMMMMMM MMMMMMMAAAMMMMMM MMMMAMAAAAPMMMMM MMMAAAMAAPAAMMMM MMAAAAPAPAAAPMMM MMMAAPAAAPAPPMMM MMMMPAAAPAPPMMMM MMMMMMMPAAPMMMMM MMMMMMMAAPPMMMMM MMMMMMMMPPMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 142 (blue dragon scales) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMEMMMMMMM MMMMMMMEEEMMMMMM MMMMEMEEEEAMMMMM MMMEEEMEEAAEMMMM MMEEEEAEAAEEAMMM MMMEEAAEEAEAAMMM MMMMAAEEAAAAMMMM MMMMMMMAAEAMMMMM MMMMMMMEEAAMMMMM MMMMMMMMAAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 143 (green dragon scales) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMFMMMMMMM MMMMMMMFFFMMMMMM MMMMFMFFFFAMMMMM MMMFFFMFFAAFMMMM MMFFFFAFAAFFAMMM MMMFFAAFFAFAAMMM MMMMAAFFAAAAMMMM MMMMMMMAAFAMMMMM MMMMMMMFFAAMMMMM MMMMMMMMAAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 144 (yellow dragon scales) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMHMMMMMMM MMMMMMMHHHMMMMMM MMMMHMHHHHAMMMMM MMMHHHMHHAAHMMMM MMHHHHAHAAHHAMMM MMMHHAAHHAHAAMMM MMMMAAHHAAAAMMMM MMMMMMMAAHAMMMMM MMMMMMMHHAAMMMMM MMMMMMMMAAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 145 (mummy wrapping) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMOMM MMMMMMMNMMNMMOMM MMMMOMONOMNNANMM MMMMMNONOMANNOMM OMMMONOOODNNOAAM MOOODNNONNNAOOAM MMAMNNOOAOAAOAAM MMMOODOOAAOOOAMM MMNMAANMNAMOOMMM MMMMMMMMMMMMMMMM } # tile 146 (coarse mantelet / orcish cloak) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMCJKMKKCMMMMM MMMMMCJKCCAAMMMM MMMMMMCKCAAMMMMM MMMMMCCACKAMMMMM MMMMCCCACKKAMMMM MMMCCCAACCKKAMMM MMCCCCAACKCKKAMM MMCCCAAJJCKKCAMM MMCCCAAJJCKKKAMM MMMCCAJJJJCCAMMM MMMMAAAAAAAAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 147 (hooded cloak / dwarvish cloak) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMBBPMMMMMMM MMMMMBBBBPMMMMMM MMMMBPAAAPPMMMMM MMMMMBPAPPAAMMMM MMMMMMBPPAAMMMMM MMMMMBBABPAMMMMM MMMMBBBABPPAMMMM MMMBBBAABPPPAMMM MMBBBBAMMBPPPAMM MMMBBAMMMMBPAMMM MMMMAAAAAAAAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 148 (slippery cloak / oilskin cloak) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMJAAMAAJMMMMM MMMMMJAAAJAAMMMM MMMMMMJAJAAMMMMM MMMMMJJAJAAMMMMM MMMMJJJAJAAAMMMM MMMJJJAAJAAAAMMM MMJJJJAAJAAAAAMM MMJJJAAAAJAAAAMM MMJJJAAAAJAAAAMM MMMJJAAAAAJAAMMM MMMMAAAAAAAAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 149 (faded pall / elven cloak) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMOFFMMFOMMMMM MMMMMOFFFOAAMMMM MMMMMMOFOAAMMMMM MMMMMOGAGFAMMMMM MMMMOGOAOFFAMMMM MMMOGOAAGFFFAMMM MMOGOGAAOFFFFAMM MMOOGAAFFOFFFAMM MMOGOAAFFGFFFAMM MMMOGAFFFFGFAMMM MMMMAAAAAAAAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 150 (white coat / lab coat) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMOOOOOMMMMMM MMMMMOOOOPMMMMMM MMMOOOAOOOOMMMMM MMMOPOAOOOOAMMMM MMMOPOAOPOOAMMMM MMMOPOAOPOOAAAMM MMMOPOAOPOOAAAAM MMMOPOAOPOOAAAMM MMMMOOAOPPAAAMMM MMMMOOAOOOAAMMMM MMMMMOAPOOAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 151 (leather cloak) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMKJJMJJKMMMMM MMMMMKJJJKAAMMMM MMMMMMKJKAAMMMMM MMMMMKKAKJAMMMMM MMMMKKKAKJJAMMMM MMMKKKAAKJJJAMMM MMKKKKAAKJJJJAMM MMKKKAAJJKJJJAMM MMKKKAAJJKJJJAMM MMMKKAJJJJKJAMMM MMMMAAAAAAAAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 152 (tattered cape / cloak of protection) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMPOMMMMM MMMOOOPPPOAAMMMM MMMMMMOPOAAMMMMM MMMMMOOAOPAMMMMM MMMMOOOAOPPAMMMM MMMOOOAAOPPPAMMM MMOOOOAAOPPPPAMM MMOOOAAPPOPPAMMM MMMOOAAPPOPAMMMM MMOOOAMMAPOPAMMM MMMAAMMMMAAAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 153 (dirty rag / poisonous cloak) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMGFFMFFGMMMMM MMMMMGFFFGAAMMMM MMMMMMDFGAAMMMMM MMMMMGGAGFAMMMMM MMMMGDGAGCFAMMMM MMMGDGAAGFFFAMMM MMGGGGAAGCFCFAMM MMGDGAAFFGFFCAMM MMGGGAAFFGCFFAMM MMMGGAFCFFGFAMMM MMMMAAAAAAAAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 154 (opera cloak / cloak of invisibility) { MMMMMMMMMMMMMMMM MMMMMMNNNMMMMMMM MMMMMNAAAOMMMMMM MMMMNNAAAOOAMMMM MMMMMNAAAOAMMMMM MMMMMNNAOOAAMMMM MMMMNNNAOOOAAMMM MMMNNNNNAOOOAAMM MMNNNNNNNAOOOAAM MMNNNNNNNAOOOOAM MNNNNNNNNNAOOOAM MNNNNNNNNNAOOOAM MNNNNNNNNNNAOOAM MNNNNNNNNNNAOOAM MMAANNNNNNAOOAAM MMMMAAAAAAAAAAMM } # tile 155 (ornamental cope / cloak of magic resistance) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMAAAMMAAMMMMM MMMMMAAAAAPPMMMM MMMMMMAAAPPMMMMM MMMMMAAAAAPMMMMM MMMMAAAAAAAPMMMM MMMAAAAAAAAAPMMM MMMAAAAAAAAAPPMM MMAAAAAAAAAAAPMM MMAAAAAAAAAAAPMM MMAAAAAAAAAAAPMM MMAAAAAAAAAAAPMM MMAAAAAAAAAAAPMM MMMPPPPPPPPPPPMM } # tile 156 (piece of cloth / cloak of displacement) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMPMMMMMMM MMMMMMMPPPAMMMMM MMMMMMPPPBPAAMMM MMMMMPBPBPPPAAMM MMMMPPPBPPPPBAAM MMMPPPBPPBPBPPAA MMPBPBPPPPBPPPPA MPPPBPPPPBPBPPPA MPPBPBPPBPPPBPAA MMBPPPPBPPPPPAAM MMMPPPBPBPPPAAMM MMMMPBPPPBPAAMMM MMMMMPPPPPAAMMMM MMMMMMMPPAAMMMMM } # tile 157 (leather hat / elven leather helm) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMJKKJMMMMMMM MMMMJCKCKJMMMMMM MMMJCKKJJJAMMMMM MMMJCKJJJJAMMMMM MMMJAJJAAJAMMMMM MMMJAJJAMJAMMMMM MMMJAMAMJAMMMMMM MMMMJAMJAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 158 (iron skull cap / orcish helm) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMPBBPMMMMMMM MMMMPNBBBPAMMMMM MMMPNBBPPPAMMMMM MMMPBBPPPPAMMMMM MMMJAPPAAJAMMMMM MMMJAPPAMJAMMMMM MMMJAMAMJAMMMMMM MMMMJAMJAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 159 (hard hat / dwarvish iron helm) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMPPPMMMMMMMM MMMMPBBPPAMMMMMM MMMPBNPPPPAMMMMM MMMPNPPPPPAMMMMM MMMPPPPPPPAMMMMM MMMPAPPAAPAMMMMM MMMJAPPAMJAMMMMM MMMJAMAMJAMMMMMM MMMMJAMJAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 160 (fedora) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMAAAAMMMMMM MMMMMAAAAAAMMMMM MMMAAMAAAAAMMMMM MMMAAAMAAAMAMMMM MMMMAAAMMMAAAMMM MMMMKMAAAAAAMMMM MMMKAMMMKAMMMMMM MMMMKAMMKAMMMMMM MMMMMMMKAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 161 (conical hat / cornuthaum) { MMMMMMMMMMMMMMMM MMMMMMMEMMMMMMMM MMMMMMMEMMMMMMMM MMMMMMMBMMMMMMMM MMMMMMEBEMMMMMMM MMMMMMEBEMMMMAMM MMMMMMPBEMMMMAMM MMMMMEBBEEMMAAMM MMMMMEBBPEMAAAMM MMMMMPNBPEAAAMMM MMMMEBNBBEEAAMMM MMMMENNBBPEAAMMM MMMEBBBBPEAEAMMM MMMEEMMAMAEEMMMM MMMMEEEEEEEMMMMM MMMMMMMMMMMMMMMM } # tile 162 (conical hat / dunce cap) { MMMMMMMMMMMMMMMM MMMMMMMEMMMMMMMM MMMMMMMEMMMMMMMM MMMMMMMBMMMMMMMM MMMMMMEBEMMMMMMM MMMMMMEBEMMMMAMM MMMMMMPBEMMMMAMM MMMMMEBBEEMMAAMM MMMMMEBBPEMAAAMM MMMMMPNBPEAAAMMM MMMMEBNBBEEAAMMM MMMMENNBBPEAAMMM MMMEBBBBPEAEAMMM MMMEEMMAMAEEMMMM MMMMEEEEEEEMMMMM MMMMMMMMMMMMMMMM } # tile 163 (dented pot) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMJJMM MMMMMMMMMMMJJMMM MMMMMMMMMMJJMMMM MMMMMMMMMJJMMMAA MMMMMBPPPMJMMAAM MMMMBAAAMMPMAAMM MMMMBPAMMPMAAMMM MMMMBBPPPMMAAMMM MMMMBPPPMMMAAMMM MMMMMBBPPPAAAMMM MMMMMMAAAAAAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 164 (plumed helmet / helmet) { MMMMMMMDIDMMMMMM MMMMMMDIBIMMMMMM MMMMMMIBIBMMMMMM MMMMMMDIBMMMMMMM MMMMMMMIMMMMMMMM MMMMMMPIPMMMMMMM MMMMMPNIPPAMMMMM MMMMPNBPPPPAMMMM MMMMPBPPPPPAMMMM MMMMPPPPPPPAMMMM MMMMPAPPAAPAMMMM MMMMJAPPAMJAMMMM MMMMMMMAAMMAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 165 (etched helmet / helm of brilliance) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMPPPMMMMMMM MMMMMPNBPPAMMMMM MMMMMNBPPPMAMMMM MMMMPMPMPMPAMMMM MMMMPPPPPPPAMMMM MMMMPAPPAAPAMMMM MMMMJAPPAMJAMMMM MMMMMMMAAMMAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 166 (crested helmet / helm of opposite alignment) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMHHHMMMMMMM MMMMMHHHMMMMMMMM MMMMMHHMMPAMMMMM MMMMPPHMMPPAMMMM MMMMPPPMPPPAMMMM MMMMPPPPPPPAMMMM MMMMPAPPAAPAMMMM MMMMJAPPAMJAMMMM MMMMMMMAAMMAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 167 (visored helmet / helm of telepathy) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMPPPMMMMMMM MMMMMPNNPPAMMMMM MMMMPNNPPPPAMMMM MMMMPBBBBBPAMMMM MMMMPPPPPPPAMMMM MMMMPAAAAAPAMMMM MMMMJBPPPPJAMMMM MMMMMMPPAAAAMMMM MMMMMMMAAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 168 (old gloves / leather gloves) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMKJMMMMMMM MMMMKJMKJMKJMMMM MMMMKKAJJAKJMMMM MMKJMJJAJJAJJMMM MMCJAJJAJJAJJAMM MMMJJAKKJJKJJAMM MMMMJKJJJJJJJAMM MMMKAJJJJJJJJAMM MMMCJJJJJJJJJJAM MMMMJJJJJJJJJJAM MMMMMAAAJJJJJAAM MMMMMMMMAJJJAAMM MMMMMMMMMAAAMMMM MMMMMMMMMMMMMMMM } # tile 169 (padded gloves / gauntlets of fumbling) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMKJMMMMMMM MMMMKJMKJMKJMMMM MMMMKKAJJAKJMMMM MMKJMKJAKKAKJMMM MMCJAJCAKJACJAMM MMMKJAJCKJKKJAMM MMMMKKJJKKJKJAMM MMMKAJCKKKCKJAMM MMMCKKKKCKKKKJAM MMMMJKJJJKCKKJAM MMMMMAAAJJKKCAAM MMMMMMMMAKJKAAMM MMMMMMMMMAAAMMMM MMMMMMMMMMMMMMMM } # tile 170 (riding gloves / gauntlets of power) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMKKJJAMMMMMMM MMMKKJJJJAMMMMMM MMKJJJJJJJAMMMMM MMCJJJJJJJAMMMMM MMMJJJJJJJJAMMMM MMMMJKJJJJJJAMMM MMMKAJJJJJJJAMMM MMMKKJJJJJJJJAMM MMMMJJJJJJJJJJAM MMMMMAAAJJJJJAAM MMMMMMMMAJJJAAMM MMMMMMMMMAAAMMMM MMMMMMMMMMMMMMMM } # tile 171 (black gloves / gauntlets of swimming) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMGEEMGMMMM MMMMGEEEGFEGAMMM MMMMEGFFGFFGAMMM MMGEFFGFFGFGAMMM MMMGFFFGFGGGAMMM MMMEGFFGGGGGAMMM MMMEFGGGGGGGGAMM MMMEFFGGGGGGGAMM MMMFFFGGGGGGGGAM MMMGGGGGGGGGGGAM MMMMMAAAGGGGGAAM MMMMMMMMAGGGAAMM MMMMMMMMMAAAMMMM MMMMMMMMMMMMMMMM } # tile 172 (fencing gloves / gauntlets of dexterity) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMNOMMMMMMM MMMMNOMNOMNOMMMM MMMMNOAOOANOMMMM MMNOMOOAOOAOOMMM MMNOAOOAOOAOOAMM MMMOOAONOONOOAMM MMMMONOOOOOOOAMM MMMNAOOOOOOOOAMM MMMNOOOOOOOOOOAM MMMMOOOOOOOOOOAM MMMMMAAAOOOOOAAM MMMMMMMMAOOOAAMM MMMMMMMMMAAAMMMM MMMMMMMMMMMMMMMM } # tile 173 (small shield) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMCMCJJMJMMMMMM MMMCCKKJJJAMMMMM MMMCKCKJJJAMMMMM MMMCKKJJJJAMMMMM MMMCCKJJJJAMMMMM MMMMCKKJJAAMMMMM MMMMMCKJAAMMMMMM MMMMMMCAAMMMMMMM MMMMMMMAMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 174 (blue and green shield / elven shield) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMNMNNNNMNMMMMM MMMNNNGFNNNAMMMM MMMNGGGFFFNAMMMM MMMNGGFFFFNAMMMM MMMNGGFFFFNAMMMM MMMNGGFFFFNAMMMM MMMMNGGFFNAAMMMM MMMMMNGFNAAMMMMM MMMMMMNNAAMMMMMM MMMMMMMAAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 175 (white-handed shield / Uruk-hai shield) { MMMMMMMMMMMMMMMM MMMKMKKKJJJMJMMM MMMKCKCKJJJJJMMM MMMKPPPPMMMMJAMM MMMKPPPNOOMMJAMM MMMKPPPNOOOMJAMM MMMCPNPNOOOMJAMM MMMKPNNNOOOMJAMM MMMKPPNNOOMMJAMM MMMKPPPNOMMMJAMM MMMMKPPNOMMJAAMM MMMMMKPPMMJAAMMM MMMMMMKPMJAAMMMM MMMMMMMKJAAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 176 (red-eyed shield / orcish shield) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMKMKKKKJJMJMMM MMMKCKCKJJJJJMMM MMMKPPPPMMMMJAMM MMMKPPDDDDMMJAMM MMMKPDDAADDMJAMM MMMKPDDAADDMJAMM MMMCPPDDDDMMJAMM MMMMKPPPMMMJAAMM MMMMMKPPMMJAAMMM MMMMMMKPMJAAMMMM MMMMMMMKJAAMMMMM MMMMMMMMAAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 177 (large shield) { MMMMMMMMMMMMMMMM MMMNMNNNOOOMOMMM MMMNNNNNOOOOOMMM MMMNPPPPPMMMOAMM MMMNPPPMMMMMOAMM MMMNPPPMMMMMOAMM MMMNPPPPPMMMOAMM MMMNPPPMMMMMOAMM MMMNPPPMMMMMOAMM MMMNPPPPPMMMOAMM MMMMNPPMMMMOAAMM MMMMMNPMMMOAAMMM MMMMMMNPPOAAMMMM MMMMMMMNOAAMMMMM MMMMMMMMAAMMMMMM MMMMMMMMMMMMMMMM } # tile 178 (large round shield / dwarvish roundshield) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMBBBPMMMMMMM MMMMBCKKKPMMMMMM MMMBKKKCKJPMMMMM MMMBCKKJJJPAMMMM MMMBKKKJJJPAMMMM MMMBCKJJJJPAMMMM MMMMPJJJJPAAMMMM MMMMMPPPPAAMMMMM MMMMMMAAAAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 179 (polished silver shield / shield of reflection) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMNMNNNOOOMOMMM MMMNNNNNOOOOOMMM MMMNPPPPPPPPOAMM MMMNPNNPPPPPOAMM MMMNPNNPPPPPOAMM MMMNPPPPPPPPOAMM MMMNPPPPPPPPOAMM MMMMNPPPPPPOAAMM MMMMMNPPPPOAAMMM MMMMMMNPPOAAMMMM MMMMMMMNOAAMMMMM MMMMMMMMAAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 180 (walking shoes / low boots) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMKJKKJMMM MMMCKLKLKJKKJAMM MMCKCLKLCJKCJAMM MMKKKCKKKKKKJAMM MMJJJJJJKJJJJAMM MMMAAAAAAAAAAAMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 181 (hard shoes / iron shoes) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMPPPKPMMM MMMMMMMMPPPPPAMM MMMMMMMMPPPPJAMM MMMOPNPNMPPPJAMM MMOPPPPNPMMMJAMM MMPPPPPPPPPPJAMM MMMPMMMMMMMMJAMM MMMAAAAAAAAAAAMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 182 (jackboots / high boots) { MMMMMMMCCKKKKMMM MMMMMMCKAAAAJJMM MMMMMMKCKKCKKJAM MMMMMMMKKKKCKJAM MMMMMMMKJCKKKKAM MMMMMMMMJKKCKAMM MMMMMMMMJKKKKAMM MMMMMMMMJCKCKAMM MMMMMMMMKJKKKAMM MMMCKLKLKKJKJAMM MMCKCLKLKJKCJAMM MMKKKKCKCKKKJAMM MMJKJJJJJJJJJAMM MMMAAAAAAAAAAAMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 183 (combat boots / speed boots) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMGGFFFFMMM MMMMMMGFAAAAMMMM MMMMMMFFFFFFFMAM MMMMMMMMFFFFFMAM MMMMMMMKMFFFFMAM MMMMMMMMMFFFFAMM MMMMMMMMFMFFMAMM MMMGFLFLFMMFMAMM MMGFFLFLFMFFMAMM MMFFFFFFFFFFMAMM MMJMMMMMMMMMMAMM MMMAAAAAAAAAAAMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 184 (jungle boots / water walking boots) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMGGGGGGMMM MMMMMMGFAAAAJJMM MMMMMMFFFFFFFJAM MMMMMMMGFFFFFJAM MMMMMMMKGFFFFJAM MMMMMMMMGFFFFAMM MMMMMMMMFGFFJAMM MMMGFLFLFGGFJAMM MMGFFLFLFGFFJAMM MMFFFFFFFFFFJAMM MMJJJJJJJJJJJAMM MMMAAAAAAAAAAAMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 185 (hiking boots / jumping boots) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMCCKKKJAM MMMMMMMCAAAAKJAM MMMMMMMKJKCKCJAM MMMMMMMMJKKKKAMM MMMMMMMMKKCKJAMM MMMCKLCLKJJKJAMM MMCKKLKLKJKCJAMM MMCKKCKKCKKKJAMM MMJJJJJJJJKJJAMM MMMAAAAAAAAAAAMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 186 (mud boots / elven boots) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMCCKKKKMMM MMMMMMCKAAAAJJMM MMMMMMKCKCKCKJAM MMMMMMMJKKKKKJAM MMMMMMMKKKCKCJAM MMMMMMMMJKKKKAMM MMMMMMMMKKKCJAMM MMMCKLCLKJJKJAMM MMCKKLKLKKKKJAMM MMCKCKKCKKCKJAMM MMJJJJJJJJJJJAMM MMMAAAAAAAAAAAMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 187 (steel boots / kicking boots) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMJJJJJJMM MMMMMMMMJJJJJJMM MMMMMMMMMJJJJMMM MMMMMMMMMMJJJMMM MMMMOMMMMMJJJMMM MOMMOOMMKJKKJMMM MONCKLKLKJKKJAMM MMCKCLKLCJKCJAMM OMKKKCKKKKKKJAMM MOJJJJJJJKJJJAMM MMMAAAAAAAAAAAMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 188 (riding boots / fumble boots) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMLLLLLLMMM MMMMMMLAAAAAALMM MMMMMMLAAAAAALPM MMMMMMMLLLLLLAPM MMMMMMMAAAAAAAPM MMMMMMMMAAAAAPMM MMMMMMMMAAAAAPMM MMMAALALAAAAAPMM MMAAALALAAAAAPMM MMAAAAAAAAAAAPMM MMMAAAAAAAAAAPMM MMMPPPPPPPPPPPMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 189 (snow boots / levitation boots) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMNNLLLLMMM MMMMMMNOAAAALLMM MMMMMMOOOOOOOLAM MMMMMMMLOOOOOLAM MMMMMMMLLOOOOLAM MMMMMMMMLOOOOAMM MMMMMMMMOLOOLAMM MMMNOAOAOLLOLAMM MMNOOAOAOLOOOLAM MOOOOOOOOOOOOOAM MOOOOOOOOOOOOOAM MMLALALALALALAAM MMMAMAMAMAMAMAMM MMMMMMMMMMMMMMMM } # tile 190 (wooden / adornment) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMKCCKJMMMMMM MMMMKJAAAKJMMMMM MMMMCAMMMAKAMMMM MMMMCAMMMMKAMMMM MMMMJKAMMKKAMMMM MMMMMKKKCJAAMMMM MMMMMMAAAAAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 191 (topaz / hunger) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMPNBBPAMMMMM MMMMMBOOOBAMMMMM MMMMMABBBAMMMMMM MMMMMOLLLNAMMMMM MMMMOOAAAONAMMMM MMMMOAAMMMOAMMMM MMMMNOAMMONAMMMM MMMMMONONOAAMMMM MMMMMMAAAAAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 192 (ridged / mood) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMDFFDAMMMMM MMMMMDFDDFDAMMMM MMMMDFFAMFFDAMMM MMMMFDAMMMDFAMMM MMMMFDAMMMDFAMMM MMMMDFFAMFFDAMMM MMMMMDFDDFDAMMMM MMMMMMDFFDAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 193 (black onyx / protection) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMANAAAMMMMMM MMMMMAAAAAMMMMMM MMMMMMAAAMMMMMMM MMMMMOLLLNAMMMMM MMMMOOAAAONAMMMM MMMMOAAMMMOAMMMM MMMMNOAMMONAMMMM MMMMMONONOAAMMMM MMMMMMAAAAAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 194 (shiny / protection from shape changers) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMNNNNNMMMMMM MMMMNNAAANNMMMMM MMMMNAMMMMNAMMMM MMMMNAMMMMNAMMMM MMMMNNAMMNNAMMMM MMMMMNNNNNAAMMMM MMMMMMAAAAAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 195 (wedding / sleeping) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMNNOMMMMMMM MMMMMNNNNOAMMMMM MMMMMANNOAAMMMMM MMMMMAAOAAMMMMMM MMMMMHHHHHAMMMMM MMMMHHAAAHHAMMMM MMMMHAAMMMHAMMMM MMMMHHAMMHHAMMMM MMMMMHHHHHAAMMMM MMMMMMAAAAAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 196 (jade / stealth) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMNFFMMMMMMM MMMMMFFFFFAMMMMM MMMMMFFFFFAMMMMM MMMMMOLLLNAMMMMM MMMMOOAAAONAMMMM MMMMOAAMMMOAMMMM MMMMNOAMMONAMMMM MMMMMONONOAAMMMM MMMMMMAAAAAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 197 (bronze / sustain ability) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMCHCCCMMMMMM MMMMCHAAACCMMMMM MMMMCAAMMACAMMMM MMMMCAMMMMCAMMMM MMMMCCAMMCCAMMMM MMMMMCCCCCAAMMMM MMMMMMAAAAAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 198 (diamond / warning) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMPNNNPAMMMMM MMMMMNNNNBAMMMMM MMMMMANNBAMMMMMM MMMMMPPPPPAMMMMM MMMMPPAAAPPAMMMM MMMMPAAMMMPAMMMM MMMMPPAMMPPAMMMM MMMMMPPPPPAAMMMM MMMMMMAAAAAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 199 (sapphire / aggravate monster) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMNEEMMMMMMM MMMMMEEEEFAMMMMM MMMMMAEEFAMMMMMM MMMMMOFEFNAMMMMM MMMMOOAAAONAMMMM MMMMOAAMMMOAMMMM MMMMNOAMMONAMMMM MMMMMONONOAAMMMM MMMMMMAAAAAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 200 (brass / cold resistance) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMHHHCCMMMMMM MMMMHCAAACCMMMMM MMMMHAAMMMCAMMMM MMMMCAMMMMHAMMMM MMMMCCAMMHCAMMMM MMMMMCCCHCAAMMMM MMMMMMAAAAAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 201 (opal / gain constitution) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMOIOMMMMMMM MMMMMOIOBOAMMMMM MMMMMOOOBOAMMMMM MMMMMCOGOCAMMMMM MMMMHHAAAHNAMMMM MMMMHAAMMMHAMMMM MMMMNHAMMHNAMMMM MMMMMHNHNHAAMMMM MMMMMMAAAAAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 202 (obsidian / gain dexterity) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMNNAAAMMMMMM MMMMNAAAAAAMMMMM MMMNAAMMMPAAMMMM MMMPAMMMMMPAMMMM MMMAAMMMMMNAMMMM MMMAAPMMMNAAMMMM MMMMAAPNNAAMMMMM MMMMMAAAAAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 203 (plain / gain intelligence) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMCCKKKAMMMMM MMMMCKAAAKKAMMMM MMMMCAAMMMKAMMMM MMMMKKAMMCCAMMMM MMMMMKCKCKAAMMMM MMMMMMAAAAAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 204 (granite / gain strength) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMPPPPPMMMMMM MMMMPBPBPPPMMMMM MMMPPPAAAPBPMMMM MMMPBAAAAAPPAMMM MMMPPAAMMMPPAMMM MMMBPPAMMPPBAMMM MMMMPPPPPBPAAMMM MMMMMPBPPPAAMMMM MMMMMMAAAAAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 205 (glass / gain wisdom) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMNNNPPMMMMMM MMMMNMMMMMPMMMMM MMMNMMAAAPPPMMMM MMMPMAAAAANPAMMM MMMPMAAMMMNMAMMM MMMPMPAMMNMMAMMM MMMMPMNNNMMAAMMM MMMMMPPMMMAAMMMM MMMMMMAAAAAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 206 (clay / increase accuracy) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMLLLLLMMMMMM MMMMLCCCCLLMMMMM MMMLCCAAALLCMMMM MMMLCAAAAALCAMMM MMMLCAAMMMLCAMMM MMMLCCAMMLLCAMMM MMMMLLLLLCCAAMMM MMMMMCCCCCAAMMMM MMMMMMAAAAAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 207 (coral / increase damage) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMOOOOOMMMMMM MMMMOOAAAOOMMMMM MMMMOAAMMMNAMMMM MMMMOAMMMMOAMMMM MMMMNOAMMONAMMMM MMMMMONONOAAMMMM MMMMMMAAAAAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 208 (steel / slow digestion) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMPBBPPMMMMMM MMMMPBAAAPPMMMMM MMMMPAAMMAPAMMMM MMMMPAMMMMPAMMMM MMMMPPAMMPPAMMMM MMMMMPPPPPAAMMMM MMMMMMAAAAAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 209 (wire / invisibility) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMPPPPPMMMMMM MMMMPPAAAPPMMMMM MMMMPAAMMMPAMMMM MMMMPAMMMMMPAMMM MMMMPAMMMMMPAMMM MMMMPAAPPPPAMMMM MMMMMPPPAAAMMMMM MMMMMMAAMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 210 (pearl / poison resistance) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMNNNMMMMMMM MMMMMNONNNAMMMMM MMMMMNNNNNAMMMMM MMMMMANNNAMMMMMM MMMMMLHHHLAMMMMM MMMMLHAAAHLAMMMM MMMMHAAMMMHAMMMM MMMMLHAMMHLAMMMM MMMMMLHHHLAAMMMM MMMMMMAAAAAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 211 (engagement / see invisible) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMPNNNPAMMMMM MMMMMNNNNNAMMMMM MMMMMANNNAMMMMMM MMMMMLHHHLAMMMMM MMMMLHAAAHLAMMMM MMMMHAAMMMHAMMMM MMMMLHAMMHLAMMMM MMMMMLHHHLAAMMMM MMMMMMAAAAAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 212 (copper / shock resistance) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMCCCCCMMMMMM MMMMCCAAACCMMMMM MMMMCAAMMACAMMMM MMMMCAMMMMCAMMMM MMMMCCAMMCCAMMMM MMMMMCCCCCAAMMMM MMMMMMAAAAAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 213 (iron / fire resistance) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMPPPPPMMMMMM MMMMPPAAAPPMMMMM MMMMPAMMMMPAMMMM MMMMPAMMMMPAMMMM MMMMPPAMMPPAMMMM MMMMMPPPPPAAMMMM MMMMMMAAAAAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 214 (twisted / free action) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMAPPBPMMMMMM MMMMPPAAAAPMMMMM MMMMPAAMMAPAMMMM MMMMPAMMMMBAMMMM MMMMBPAMMAPAMMMM MMMMMAPBPPAAMMMM MMMMMMAAAAAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 215 (agate / levitation) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMPNOOPAMMMMM MMMMMOIOIOAMMMMM MMMMMAOIOAMMMMMM MMMMMLHHHLAMMMMM MMMMLHAAAHLAMMMM MMMMHAAMMMHAMMMM MMMMLHAMMHLAMMMM MMMMMLHHHLAAMMMM MMMMMMAAAAAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 216 (moonstone / regeneration) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMOBOMMMMMMM MMMMMOBOOOAMMMMM MMMMMOOOOOAMMMMM MMMMMCCCCCAMMMMM MMMMHHAAAHNAMMMM MMMMHAAMMMHAMMMM MMMMNHAMMHNAMMMM MMMMMHNHNHAAMMMM MMMMMMAAAAAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 217 (tiger eye / searching) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMKCACKAMMMMM MMMMMCCACCAMMMMM MMMMMACCCAMMMMMM MMMMMOCOCNAMMMMM MMMMOOAAAONAMMMM MMMMOAAMMMOAMMMM MMMMNOAMMONAMMMM MMMMMONONOAAMMMM MMMMMMAAAAAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 218 (silver / teleportation) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMPNBPPMMMMMM MMMMPBAAAPPMMMMM MMMMBAAMMAPAMMMM MMMMBAMMMMPAMMMM MMMMPPAMMPPAMMMM MMMMMPPPBPAAMMMM MMMMMMAAAAAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 219 (ruby / conflict) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMJLDDJAMMMMM MMMMMDDDDDAMMMMM MMMMMADDDAMMMMMM MMMMMOLLLNAMMMMM MMMMOOAAAONAMMMM MMMMOAAMMMOAMMMM MMMMNOAMMONAMMMM MMMMMONONOAAMMMM MMMMMMAAAAAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 220 (ivory / polymorph) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMOOONOMMMMMM MMMMOOAAAOOMMMMM MMMMNAAMMANAMMMM MMMMOAMMMMOAMMMM MMMMNOAMMONAMMMM MMMMMONONOAAMMMM MMMMMMAAAAAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 221 (emerald / polymorph control) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMPGFFPAMMMMM MMMMMFGFFFAMMMMM MMMMMAFFFAMMMMMM MMMMMOCECNAMMMMM MMMMOOAAAONAMMMM MMMMOAAMMMOAMMMM MMMMNOAMMONAMMMM MMMMMONONOAAMMMM MMMMMMAAAAAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 222 (gold / teleport control) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMLHHHLMMMMMM MMMMLHAAAHLMMMMM MMMMHAAMMAHAMMMM MMMMHAMMMMHAMMMM MMMMLHAMMHLAMMMM MMMMMLHHHLAAMMMM MMMMMMAAAAAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 223 (square / amulet of change) { MMMMMMMMMMMMMMMM MMMMMMLLLLLAAMMM MMMMMLAAMMMLAAMM MMMMLAAMMMMMLAAM MMMMLAAMMMMMLAAM MMMMLAAMMMMMLAAM MMMMLAAMMMMMLAAM MMMMMLAAMMMLAAMM MMMMMMLAAMLAAMMM MMMMMMALALAAMMMM MMMMMMCCCCCAMMMM MMMMMMCKKKKAMMMM MMMMMMCCKCKAMMMM MMMMMMCKKKKAMMMM MMMMMMMAAAAAMMMM MMMMMMMMMMMMMMMM } # tile 224 (warped / amulet of drain resistance) { MMMMMMMLLAAMMMMM MMMMMLLAALAAAMMM MMMMMLAAMMLLAAMM MMMMLAMMMMMMLAAM MMMMLAMMMMMMMLAM MMMMLAAMMMMMMLAM MMMMMLAMMMMLLAAM MMMMMMLAMMLAAAMM MMMMMMLAALAAMMMM MMMMMMACCCAAMMMM MMMMMMCHDDCAAMMM MMMMMMCDDDCAAMMM MMMMMMACCCAAMMMM MMMMMMMAAAAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 225 (circular / amulet of ESP) { MMMMMMMMMMMMMMMM MMMMMMLLLLLAAMMM MMMMMLAAMMMLAAMM MMMMLAAMMMMMLAAM MMMMLAAMMMMMLAAM MMMMLAAMMMMMLAAM MMMMLAAMMMMMLAAM MMMMMLAAMMMLAAMM MMMMMMLAAMLAAMMM MMMMMMACCCAMMMMM MMMMMMCKKKKAMMMM MMMMMMCCKCKAMMMM MMMMMMMKKKAAMMMM MMMMMMMAAAAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 226 (convex / amulet of flying) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMNAAMMMNAAMM MMMMNANAAMNANAAM MMMMNANAAMNANAAM MMMMNAANNNAANAAM MMMMNAAMMMMMNAAM MMMMMNAAMMMNAAMM MMMMMMNAAMNAAMMM MMMMMMANANAAMMMM MMMMMMMMDAAMMMMM MMMMMMMGGFAAMMMM MMMMMMDGGFDAAMMM MMMMMMMFFFAAMMMM MMMMMMMMDAAMMMMM MMMMMMMMMMMMMMMM } # tile 227 (spherical / amulet of life saving) { MMMMMMMMMMMMMMMM MMMMMMLLLLLAAMMM MMMMMLAAMMMLAAMM MMMMLAAMMMMMLAAM MMMMLAAMMMMMLAAM MMMMLAAMMMMMLAAM MMMMLAAMMMMMLAAM MMMMMLAAMMMLAAMM MMMMMMLAAMLAAMMM MMMMMMAKKKAAMMMM MMMMMMKHCCKAAMMM MMMMMMKCCCKAAMMM MMMMMMAKCKAAMMMM MMMMMMMAAAAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 228 (octagonal / amulet of magical breathing) { MMMMMMMMMMMMMMMM MMMMMMLLLLLAAMMM MMMMMLAAMMMLAAMM MMMMLAAMMMMMLAAM MMMMLAAMMMMMLAAM MMMMLAAMMMMMLAAM MMMMLAAMMMMMLAAM MMMMMLAAMMMLAAMM MMMMMMLAAMLAAMMM MMMMMMACCCAAMMMM MMMMMMCKKKCAAMMM MMMMMCKCKKKKAMMM MMMMMCKKCKCKAMMM MMMMMMKKKKKAAMMM MMMMMMMCKKAAMMMM MMMMMMMMAAAMMMMM } # tile 229 (hexagonal / amulet of reflection) { MMMMMMMMMMMMMMMM MMMMMMLLLLLAAMMM MMMMMLAAMMMLAAMM MMMMLAAMMMMMLAAM MMMMLAAMMMMMLAAM MMMMLAAMMMMMLAAM MMMMLAAMMMMMLAAM MMMMMLAAMMMLAAMM MMMMMMLAMMLAAMMM MMMMMMACCCAAMMMM MMMMMMCKKKCAAMMM MMMMMCKCKKKKAMMM MMMMMMKKCKCAAMMM MMMMMMMKKKAAMMMM MMMMMMMMAAAMMMMM MMMMMMMMMMMMMMMM } # tile 230 (triangular / amulet of restful sleep) { MMMMMMMMMMMMMMMM MMMMMMLLLLLAAMMM MMMMMLAAMMMLAAMM MMMMLAAMMMMMLAAM MMMMLAAMMMMMLAAM MMMMLAAMMMMMLAAM MMMMLAAMMMMMLAAM MMMMMLAAMMMLAAMM MMMMMMLAAMLAAMMM MMMMMMALCLAAMMMM MMMMMMMCKKAMMMMM MMMMMMCKCKKAMMMM MMMMMCKKKCKKAMMM MMMMMMMAAAAAAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 231 (oval / amulet of strangulation) { MMMMMMMMMMMMMMMM MMMMMMLLLLLLAAMM MMMMMLAAMMMMLAAM MMMMLAAMMMMMMLAA MMMMLAAMMMMMMLAA MMMMLAAMMMMMMLAA MMMMLAAMMMMMMLAA MMMMMLAAMMMMLAAM MMMMMMLAAAMLAAMM MMMMMMACCCCAMMMM MMMMMMCKKKKKAMMM MMMMMMCKCKCKAMMM MMMMMMAKKKKAMMMM MMMMMMMAAAAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 232 (concave / amulet of unchanging) { MMMMMMMMMMMMMMMM MMMMMMLLLLLAAMMM MMMMMLAAMMMLAAMM MMMMLAAMMMMMLAAM MMMMLAAMMMMMLAAM MMMMLAAMMMMMLAAM MMMMLAAMMMMMLAAM MMMMMLAAMMMLAAMM MMMMMMLAAMLAAMMM MMMMMMAJJKAAMMMM MMMMMMJJJCKAAMMM MMMMMJJJKKCCAMMM MMMMMJJKKCLCAMMM MMMMMMJJCLCAAMMM MMMMMMMKCCAAMMMM MMMMMMMMAAAMMMMM } # tile 233 (pyramidal / amulet versus poison) { MMMMMMMMMMMMMMMM MMMMMMLLLLLAAMMM MMMMMLAAMMMLAAMM MMMMLAAMMMMMLAAM MMMMLAAMMMMMLAAM MMMMLAAMMMMMLAAM MMMMLAAMMMMMLAAM MMMMMLAAMMMLAAMM MMMMMMLAAMLAAMMM MMMMMMALCLAAMMMM MMMMMMMCCKAAMMMM MMMMMMCCCKKAMMMM MMMMMCCCKCKKAMMM MMMMCCKJJJKKKAMM MMMMKJJJJJJJJAMM MMMMMMMAAAAAAAMM } # tile 234 (lunate / amulet versus stone) { MMMMMMMMMMMMMMMM MMMMMMEEEEEAAMMM MMMMMEAAMMMEAAMM MMMMEAAMMMMMEAAM MMMMEAAMMMMMEAAM MMMMEAAMMMMMEAAM MMMMEAAMMMMMEAAM MMMMMEAAMMMEAAMM MMMMMMEAAMEAAMMM MMMMMMAEAEAAMMMM MMMMMMMMBAAAMMMM MMMMMMBABABAAMMM MMMMMMBNBBBAAMMM MMMMMMMNBBAAMMMM MMMMMMMMBAAMMMMM MMMMMMMMMMMMMMMM } # tile 235 (Amulet of Yendor / cheap plastic imitation of the Amulet of Yendor) { MMMMMMMMMMMMMMMM MMMMMMHHHHHAAMMM MMMMMHAAMMMHAAMM MMMMHAAMMMMMHAAM MMMMHAAMMMMMHAAM MMMMHAAMMMMMHAAM MMMMHAAMMMMMHAAM MMMMMHAAMMMHAAMM MMMMMMHAAMHAAMMM MMMMMMAHCCAAMMMM MMMMMMBCDDPAAMMM MMMMMMBCDDPAAMMM MMMMMMABPPAAMMMM MMMMMMMAAAAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 236 (Amulet of Yendor / Amulet of Yendor) { MMMMMMMMMMMMMMMM MMMMMMHHHHHAAMMM MMMMMHAAMMMHAAMM MMMMHAAMMMMMHAAM MMMMHAAMMMMMHAAM MMMMHAAMMMMMHAAM MMMMHAAMMMMMHAAM MMMMMHAAMMMHAAMM MMMMMMHAAMHAAMMM MMMMMMAHCCAAMMMM MMMMMMBCDDPAAMMM MMMMMMBCDDPAAMMM MMMMMMABPPAAMMMM MMMMMMMAAAAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 237 (large box) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMCCCCCCCCCCJM MMMCKKKKCKKKCJJM MMCKKJCCJJKCJJJM MCJJJKCJJJCJJJJM CCCCCCCCCCCJJJJM CJJJJJJJJJJJJJJA CJKKCCJKKKCJJJJA CKKKKHHKCKCJJJJA CJKCKCJKKCCJJJAA CJCCCCJCCCCJJAAM CKKKCKKKKKKJAAMM MAAAAAAAAAAAAMMM } # tile 238 (chest) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMCJKKKCJKKKCMM MCKJKCCKJKCCJJKM MKKKKKCJCKKKJJJM CJCKKCJKKKCJJJJM CJKCKCJKCKCJJJJM CCCCCHHCCCCJJJJM CJJJHJJHJJJJJJJM CJKKKHHKKCCJJJJA CKKCKHHKKKCJJJJA CJKKKCJKCKCJJJAA CJCCCCJCCCCJJAAM CKKCKKKKKKCJAAMM MAAAAAAAAAAAAMMM } # tile 239 (ice box) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMNNNNNNNNNNNM MMMNPBBBBBBBBNPM MMNPPBBBBBBBNPPM MNPPPBBBBBBNPPPM NNNNNNNNNNNPPPPM NBBBBBBBBBBPPPPA NNNNBBBBBBBPPPPA NBBBBBBBBBBPPPPA NNBBBBBBBBBPPPAA NBBBBBBBBBBPPAAM NBBBBBBBBBBPAAMM MAAAAAAAAAAAAMMM } # tile 240 (bag / sack) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMCJKKKKJMMMMM MMMMMCJCKKAAMMMM MMMMOOOOOAAMMMMM MMMOMOKKKJAMMMMM MMMMCOCKCKJAMMMM MMMCCCKKKKKJAMMM MMCCCKKCKCKJJAMM MMCCCKKKKKKKJAMM MMCCKCKCKCJJJAMM MMMCKKKKJJJJAMMM MMMMAAAAAAAAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 241 (bag / oilskin sack) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMCJKKKKJMMMMM MMMMMCJCKKAAMMMM MMMMOOOOOAAMMMMM MMMOMOKKCJAMMMMM MMMMCOKKKKJAMMMM MMMCCCCKKCKJAMMM MMCCCKKCKKKJJAMM MMCCCKKKKCKJJAMM MMCCCKCKKKJJJAMM MMMCKKKKKJJJAMMM MMMMAAAAAAAAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 242 (bag / bag of holding) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMCJKKKKJMMMMM MMMMMCJCKKAAMMMM MMMMOOOOOAAMMMMM MMMOMOKKCJAMMMMM MMMMCOKKKKJAMMMM MMMCCCCKKCKJAMMM MMCCCKKCKKKJJAMM MMCCCKKKKCKJJAMM MMCCKCKCKKJJJAMM MMMCKKKKKJJJAMMM MMMMAAAAAAAAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 243 (bag / bag of tricks) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMCJKCKKJMMMMM MMMMMCJKKKAAMMMM MMMMOOOOOAAMMMMM MMMOMOKCKJAMMMMM MMMMCOKKCKJAMMMM MMMCCCKKKKCJAMMM MMCCCCKCKKKJJAMM MMCCCKKKCKKJJAMM MMCCKCKKKKJJJAMM MMMCKKKCJKJJAMMM MMMMAAAAAAAAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 244 (key / skeleton key) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMOOMMMMMMMMMMMM MOMAOOOOOOOOOOMM MOAMOAAAAOAOAOAM MOAMOAMMMOAMAOAM MMOOMAMMMMAMMMAM MMMAAMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 245 (lock pick) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MBBBPPPPPMMMMMMM MBPPPPPPPPPPPAMM MBPPAAAAAAAAAAAM MBPPAMMMMMMMMMMM MMAAAMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 246 (credit card) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMPPPPPPPPPPPPMM MPPPDDDDPCCCPPPM MPPDDDDPCCCCCPPA MPPDDDDPCCCCCPPA MPPDDDDPCCCCCPPA MPPPDDDDPCCCPPPA MMPPPPPPPPPPPPAA MMMAAAAAAAAAAAAM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 247 (candle / tallow candle) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMNNAAAMMMMMMMM MMMMMNPOAMMMMMMM MMMMMPNNOAMMMMMM MMMMMOOONOAMMMMM MMMMMMOOONOAMMMM MMMMMMMOOONOAMMM MMMMMMMMOOONOAMM MMMMMMMMMOOONOAM MMMMMMMMMMOOOPAM MMMMMMMMMMMOPAMM MMMMMMMMMMMMAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 248 (candle / wax candle) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMNNAAAMMMMMMMM MMMMMNPOAMMMMMMM MMMMMPNNOAMMMMMM MMMMMOOONOAMMMMM MMMMMMOOONOAMMMM MMMMMMMOOONOAMMM MMMMMMMMOOONOAMM MMMMMMMMMOOONOAM MMMMMMMMMMOOOPAM MMMMMMMMMMMOPAMM MMMMMMMMMMMMAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 249 (candle / magic candle) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMNNAAAMMMMMMMM MMMMMNPOAMMMMMMM MMMMMPNNOAMMMMMM MMMMMOOONOAMMMMM MMMMMMOOONOAMMMM MMMMMMMOOONOAMMM MMMMMMMMOOONOAMM MMMMMMMMMOOONOAM MMMMMMMMMMOOOPAM MMMMMMMMMMMOPAMM MMMMMMMMMMMMAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 250 (lamp / oil lamp) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMHAMMMMMM MLHCMMLNLLLAMMMM MMMHHHNHHHHHHHMM MMMMCLHHHHHLCHAM MMMMMACLHLCCAAAM MMMMMMLHHHLAAMMM MMMMMMAAAAAAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 251 (brass lantern) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMCCCMMMMMMM MMMMMCMAACMMMMMM MMMMMCAMMCAMMMMM MMMMMLHHHLAMMMMM MMMMLNNHNNLAMMMM MMMMHNNHNNHAMMMM MMMMHNNHNNHAMMMM MMMMHNNHNNHAMMMM MMMMLHHHHHLAMMMM MMMMMLHHHLAMMMMM MMMMMLHHHLAMMMMM MMMMLHHHHHLMMMMM MMMMMAAAAAAAMMMM MMMMMMMMMMMMMMMM } # tile 252 (lamp / magic lamp) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMHAMMMMMM MLHCMMLNLLLAMMMM MMMHHHNHHHHHHHMM MMMMCLHHHHHLCHAM MMMMMACLHLCCAAAM MMMMMMLHHHLAAMMM MMMMMMAAAAAAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 253 (whistle / tin whistle) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMBBABBBBBBBMMMM MBPPPPPPPPPPAMMM MPPPPPPAAAAAAMMM MPPPPPPAMMMMMMMM MMPPPPAAMMMMMMMM MMMAAAAMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 254 (whistle / magic whistle) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMBBABBBBBBBMMMM MBPPPPPPPPPPAMMM MPPPPPPAAAAAAMMM MPPPPPPAMMMMMMMM MMPPPPAAMMMMMMMM MMMAAAAMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 255 (flute / wooden flute) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMJMMM MMMMMMMMMMMAJMMM MMMMMMMMMMKJAMMM MMMMMMMMMKJAMMMM MMMMMMMMKKAMMMMM MMMMMMMJJAMMMMMM MMMMMMKJAMMMMMMM MMMMMJJAMMMMMMMM MMMMKKAMMMMMMMMM MMMJJAMMMMMMMMMM MMKJAMMMMMMMMMMM MJJAMMMMMMMMMMMM MMAMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 256 (flute / magic flute) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMJMMM MMMMMMMMMMMAJMMM MMMMMMMMMMKJAMMM MMMMMMMMMCJAMMMM MMMMMMMMJJAMMMMM MMMMMMMJJAMMMMMM MMMMMMKJAMMMMMMM MMMMMJJAMMMMMMMM MMMMKJAMMMMMMMMM MMMJJAMMMMMMMMMM MMKJAMMMMMMMMMMM MJJAMMMMMMMMMMMM MMAMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 257 (horn / tooled horn) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMNMMMM MMMMMMMMMMNOOMMM MMMMMMMMMNOOMMMM MMMMMMMNNOOPMMMM MMMMNNPOOOOMMMMM MMMNKKNPOOPMAMMM MMNKKAANPOMAAAMM MMNKAAANPPAAAMMM MMNKJAJNPAAAMMMM MMMNKKNPAAAMMMMM MMMMNNPAAAMMMMMM MMMMAAAMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 258 (horn / frost horn) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMNMMMM MMMMMMMMMMNOOMMM MMMMMMMMMNOOMMMM MMMMMMMNNOOPMMMM MMMMNNPOOOOMMMMM MMMNKKNPOOPMAMMM MMNKKAANPOMAAAMM MMNKAAANPPAAAMMM MMNKJAJNPAAAMMMM MMMNKKNPAAAMMMMM MMMMNNPAAAMMMMMM MMMMAAAMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 259 (horn / fire horn) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMNMMMM MMMMMMMMMMNOOMMM MMMMMMMMMNOOMMMM MMMMMMMNNOOPMMMM MMMMNNPOOOOMMMMM MMMNKKNPOOPMAMMM MMNKKAANPOMAAAMM MMNKAAANPPAAAMMM MMNKJAJNPAAAMMMM MMMNKKNPAAAMMMMM MMMMNNPAAAMMMMMM MMMMAAAMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 260 (horn / horn of plenty) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMNMMMM MMMMMMMMMMNOOMMM MMMMMMMMMNOOMMMM MMMMMMMNNOOPMMMM MMMMNNPOOOOMMMMM MMMNKKNPOOPMAMMM MMNKKAANPOMAAAMM MMNKAAANPPAAAMMM MMNKJAJNPAAAMMMM MMMNKKNPAAAMMMMM MMMMNNPAAAMMMMMM MMMMAAAMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 261 (harp / wooden harp) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMKKCMMMMMMKKKMM MMKAKPPPPPPCAKAM MMMAKAMMMMMKAMAM MMMKPPPPPPPPCMMM MMMCAMMMMMMMKAMM MMMKPPPPPPPPKAMM MMMKAMMMMMMMKAMM MMMMKPPPPPPCMAMM MMMMMKKCKKKMAMMM MMMMMMAAAAAAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 262 (harp / magic harp) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMKKCMMMMMMKKKMM MMKAKPPPPPPCAKAM MMMAKAMMMMMKAMAM MMMKPPPPPPPPCMMM MMMCAMMMMMMMKAMM MMMKPPPPPPPPKAMM MMMKAMMMMMMMKAMM MMMMKPPPPPPCMAMM MMMMMKKKKKKMAMMM MMMMMMAAAAAAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 263 (bell) { MMMMMMMMMMMMMMMM MMMMMMMKAMMMMMMM MMMMMMKAKAMMMMMM MMMMMMMCAMMMMMMM MMMMMMLCKAMMMMMM MMMMMLCCCKAMMMMM MMMMMLCCCKAMMMMM MMMMMLCCCKAAMMMM MMMMCLCCCCCAMMMM MMMCLLCCCKLKAMMM MMMCCLLLLLCKAMMM MMMMCCCCCCCAAMMM MMMMMAAKKAAAMMMM MMMMMMMAAAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 264 (bugle) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMLMMMMMMMMMMMMM MKCLMMMMMMMMMMMM MKCCLMMMMMMMMLLM MKCCCLCCCCCCCLAM MKCCKAAKKKCKAACA MKCKAAJCAAACJAAM MMCAAMMJCCCJAAMM MMMAMMMMAAAAAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 265 (drum / leather drum) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMPOOOOPMMMMM MMMMOOOOOOOOMMMM MMMOOOOOOOOOOMMM MMMLOOOOOOOOLAAM MMMLKOOOOOOJLAAA MMMKKLKKKKLJJAAA MMMKKLCKCKLJJAAM MMMMJKKKKKKJAAMM MMMMMJKJKJJAAMMM MMMMMMAAAAAAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 266 (drum / drum of earthquake) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMPOOOOPMMMMM MMMMOOOOOOOOMMMM MMMOOOOOOOOOOMMM MMMLOOOOOOOOLAAM MMMLKOOOOOOJLAAM MMMCKLCKKKLJJAAM MMMJKLKKCKLJJAAM MMMMJKCKKKKJAAMM MMMMMJJJKJJAAMMM MMMMMMAAAAAAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 267 (land mine) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMAMMMMMMMM MMMMMFFAFFMMMMMM MMMMFMAAAMFAMMMM MMMMFGFFFFFAAMMM MMMMMGFFFFAAMMMM MMMMMMAAAAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 268 (beartrap) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMPOMOPMMMMMM MMMMPAMMMAPMMMMM MMMMPPOMOPPAMMMM MMMMPAMMMAPAMMMM MMMMPPOAOPPAAMMM MMMMPAAAAAPAAMMM MMMMPAAMMMPAAMMM MMMMPPAMMPPAMMMM MMMMMPPPPPAAMMMM MMMMMMPPPAAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 269 (spoon) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMPMMMM MMMMMMMMMMPPPMMM MMMMMMMMMPPAAMMM MMMMMMMMPPAMMMMM MMMMMPPPPAMMMMMM MMMMBPABAMMMMMMM MMMMABBAMMMMMMMM MMMMMAAMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 270 (pick-axe) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMBBAMMMMMMM MMMMMBPPBAMMMMMM MMMMMMPPPBAMMMMM MMMMMMMKPPPAMMMM MMMMMMKJAMPPAMMM MMMMMKKAMMMPAMMM MMMMKJAMMMMMMMMM MMMKKAMMMMMMMMMM MMCJAMMMMMMMMMMM MKJAMMMMMMMMMMMM MMAMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 271 (fishing pole) { MMMMMMMMMMMMMMMM MMMMMMMMMMMJJJAM MMMMMMMMMJJAPPAM MMMMMMMJJAMPAPAM MMMMMMJAMPPAMPAM MMMMMKJPPAMMMPAM MMMMMJPAMMMMMPAM MMMMJAPAMMMMMPAM MMMMJAPAMMMMMPAM MMMJAPAMMMMMMPAM MMMJAPAMMMMMMPAM MMMDPAMMMMMMMOAM MMDNDAMMMMMMMOAM MKJDAAMMMMOAMOAM MJJAMMMMMMMOOAMM MMMMMMMMMMMMMMMM } # tile 272 (iron hook / grappling hook) { MMMMMMMMMMMMMNMM MMMMMMMMMMMMMMPM MMMMMMMMMMMNPAPA MMMMMMMMMMMMMPAA MMMMMMMOOEPPPPAM MMMMMOOAAAAAAAPA MMMMOAAMMMMMMMPA MMMMOAMMMMMMMNAM MMMMOAMMMMMMMMMM MMMMMOOAAMMMMMMM MMMMMMMOOOAMMMMM MMMMMMMMMMOAMMMM MMMMMMMMMMOAMMMM MOAMMMMMMMOAMMMM MMOOAMMOOOAMMMMM MMMMOOOAAMMMMMMM } # tile 273 (unicorn horn) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMHMMMMMMMMMMMMM MMMLAMMMMMMMMMMM MMMLHLAMMMMMMMMM MMMMHLHAAMMMMMMM MMMMMLHLHAMMMMMM MMMMMMHLHLAAMMMM MMMMMMLLHLHHAMMM MMMMMMMHHLHDAMMM MMMMMMMMLHDDAMMM MMMMMMMMHDDAMMMM MMMMMMMMMAAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 274 (torch) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMAAMMMMM MMMMMMMMJKDAMMMM MMMMMMMMJKHDAMMM MMMMMMMJKCKDAMMM MMMMMMJKKKKJAMMM MMMMMMJKKJAAAMMM MMMMMJKJKAAMMMMM MMMMJCKAAMMMMMMM MMMJKAAMMMMMMMMM MMMJAMMMMMMMMMMM MMJAMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 275 (lightsaber / green lightsaber) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMNMMMMMMMMMM MMMMMOOAMMMMMMMM MMMMOPAAMMMMMMMM MMMOPAAMMMMMMMMM MMNPAAMMMMMMMMMM MMPAAMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 276 (lightsaber / blue lightsaber) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMNMMMMMMMMMM MMMMMOOAMMMMMMMM MMMMOPAAMMMMMMMM MMMOPAAMMMMMMMMM MMNPAAMMMMMMMMMM MMPAAMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 277 (lightsaber / red lightsaber) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMNMMMMMMMMMM MMMMMOOAMMMMMMMM MMMMOPAAMMMMMMMM MMMOPAAMMMMMMMMM MMNPAAMMMMMMMMMM MMPAAMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 278 (double lightsaber / red double lightsaber) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMNMMM MMMMMMMMMMMMOOAM MMMMMMMMMMMOPAAM MMMMMMMMMMOPAAMM MMMMMMMMMOPAAMMM MMMMMMMMOPAAMMMM MMMMMMMOPAAMMMMM MMMMMMOPAAMMMMMM MMMMOOPAAMMMMMMM MMMMMNAAMMMMMMMM MMMMMMAMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 279 (expensive camera) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMAAAMMMMMMM MMMAMAAAAAAAAAMM MMAAAAAAAAABBAMM MMAAAAPPPAABBAMM MMAAAPPBPPAAAAPM MMAAAPBBBPAAAAPM MMAAAPPBPPAAAAPM MMAAAAPPPAAAAAPM MMAAAAAAAAAAAAPM MMMPPPPPPPPPPPPM MMMMMMMMMMMMMMMM } # tile 280 (looking glass / mirror) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMBBBBAMMMMMMM MMMBPPPPBAMMMMMM MMBPPPPPPBAMMMMM MMBPPPPPPPBAMMMM MMBPPPPPPPBAMMMM MMBPPPPPPPBAMMMM MMMBPPPPPPBAMMMM MMMMBPPPPBBAMMMM MMMMMBBBBBBBAMMM MMMMMMMMMMBBBAMM MMMMMMMMMMMBBBAM MMMMMMMMMMMMBBAM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 281 (glass orb / crystal ball) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMBBBBMMMMMMM MMMMBNBBBBMMMMMM MMMMBBBBBBMMMMMM MMMMBBBBBBMAAMMM MMMMBBBBBBAAAAMM MMMMCBBBBJAAAMMM MMMCKKKKKJJAMMMM MMMMKCKCJJAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 282 (lenses) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMPPMMMMMPMMM MMMMPMMPAMMPMPAM MMMPMMAAMMPMAAMM MMPNBAAMNBPAAMMM MMNAABPNAABAAMMM MMBAMPABAMPAAMMM MMMBPAAMBPAAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 283 (blindfold) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMOOOOOOOOMMMM MMMOOOOOOOOOOMMM MMMOOOOOOOOOOAMM MMOAOOOAAOOOAOAM MMOAAAAAAAAAAOAM MMMOOAMMMMMMMOAM MMMMMOAMMMMMOAMM MMMMMOAMMMMMOAMM MMMMMMOOAMMOAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 284 (towel) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMPPPPPPPM MMMMMMMMOOOOOOOM MMMMMMMMOOOOOOOM MMMOOOOOOBOOOOOM MMOOOOOOOPPOOOAM MMOOOOOOOPPOOOAM MMOOOOOOOPPPOAMM MOOOOOOOPPPPPAMM MOOOOOOOAAAAAMMM MPPPPPPPAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 285 (saddle) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMJJAMMMJJAMMM MMMMJKJJJJKJAMMM MMMMMJCCKKJAMMMM MMMMMJKKKKJAMMMM MMMMMMJKKJAMMMMM MMMMMMMJJAAMMMMM MMMMMMMJAAMAMMMM MMMMMMMPAMMAMMMM MMMMMMPAPAAMMMMM MMMMMMPPPAMMMMMM MMMMMMMAAAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 286 (leash) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMKCJMMMMMM MMMMMMJJJJAMMMMM MMMMMJAAAAAMMMMM MMMMKAAMMMMMMMMM MMMMJAMMMMMMMMMM MMMMJAMMMMMMMMMM MMMMMJJJJMMMMMMM MMMMMMAAAJMMMMMM MMMMMMMMMAJMMMMM MMMPPPPPMMKAMMMM MMPPAAAPPKAAMMMM MMMPPPPPAAAMMMMM MMMMMAAAAMMMMMMM MMMMMMMMMMMMMMMM } # tile 287 (stethoscope) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMPNMMMNPMMMMMM MMPAAMMMMAPAMMMM MMPAMMMMMMPAMMMM MMMPAMMMMPAMMMMM MMMPAMMMMPAMMMMM MMMMPAMMPAMMMMMM MMMMPAMMPAPPPMMM MMMMMPPPAMJJPAMM MMMMMPJPAMJPPAMM MMMMMMJAMMJAAAMM MMMMMMJAMJJAMMMM MMMMMMMJJJAMMMMM MMMMMMMMAAAMMMMM MMMMMMMMMMMMMMMM } # tile 288 (tinning kit) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMPOOOOOOOOPM MMMMPPOOOOOOOPPM MMMPPPAAAAAAPPPM MMOOOOOOOOOOPPPA MMOOOOBBBOOOPPPA MMOOOBPPPMOOPPAA MMOOOBPBPMOOPAAM MMOOOOBPMMOOAAMM MMMAAOOOPMAAAMMM MMMMMBOOPMAMMMMM MMMMMBPPPMAMMMMM MMMMMABPMAMMMMMM MMMMMMAAAMMMMMMM MMMMMMMMMMMMMMMM } # tile 289 (leather bag / medical kit) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMAAMMM MMMMMMMNMMAMMAMM MMMMMMNNNAMMMAMM MMMMMNNNNNMMAMMM MMMMNNNDNDNAMMMM MMMMNNNNDNNNMMMM MAAAANNDNDNPOMMM MMAAAANNNNNPOMMM MMMMAAANNNPOOOMM MMMMMMAANNPOOOMM MMMMMMMMAPPMMMMM MMMMMMMMMMMMMMMM } # tile 290 (tin opener) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMBAMMMMMM MMMMMMMMBPAMMMMM MMMMMMPMBPPAMMMM MMMMMMPABPPAMMMM MMMMMMBPPPAAMMMM MMMMMMMBPAAMMMMM MMMMMMMKJAMMMMMM MMMMMMMKJAMMMMMM MMMMMMMKKAMMMMMM MMMMMMMKJAMMMMMM MMMMMMMCJAMMMMMM MMMMMMMKJAMMMMMM MMMMMMMMAAMMMMMM MMMMMMMMMMMMMMMM } # tile 291 (can of grease) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMBPPPPMMMMMM MMMMBAAAAAPMMMMM MMMMBPAAAPMAMMMM MMMMBBPPPMMAAMMM MMMMBBPPPMMAAAMM MMMMBBPPPMMAAMMM MMMMMBPPPMAAMMMM MMMMMMMAAAAMMMMM MMMMMMMMMMMMMMMM } # tile 292 (figurine) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMJJMMMMMM MMMMMMMKCJJMMMMM MMMMMMMKKJJMMMMM MMMMCKMCJMMMMMMM MMMMJJCKJMCJMMMM MMMMMJCKKJJJAAMM MMMMMMCKAAMAAAAM MMMMKCCKAAAAAAMM MMMJCCKKAJJAAMMM MMMJKCKCJJJJAMMM MMMMJJKKJJJAAMMM MMMMMJJJJJAAMMMM MMMMMMMMMMMMMMMM } # tile 293 (magic marker) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMBMMMMM MMMMMMMMMBIEMMMM MMMMMMMMBIEAAMMM MMMMMMMBIEAAMMMM MMMMMMBIEAAMMMMM MMMMMBIEAAMMMMMM MMMMNNEAAMMMMMMM MMMMNNAAMMMMMMMM MMMMMAAMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 294 (bandage) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMPPPPPPMM MMMMMMMMOOOOOOMM MMMMMMMMOOOOOOMM MMMMOOOOOBOOOOMM MMMOOOOOOPPOOAMM MMMOOOOOOPPOOAMM MMMOOOOOOPPOAMMM MMOOOOOOPPPPAMMM MMOOOOOOAAAAMMMM MMPPPPPAMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 295 (phial) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMLJAMMMMMMMM MMMMMKJAMMMMMMMM MMMMPMPMAMMMMMMM MMMMMPMAMMMMMMMM MMMMPMPMAMMMMMMM MMMPNPMMMAMAAMMM MMMMPMPMMAAAAMMM MMMPMPMMMAAMMMMM MMMMPPMMAAMMMMMM MMMMMAAAAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 296 (candelabrum / Candelabrum of Invocation) { MMMMMMMNMMMMMMMM MMMMMMMDMMMMMMMM MMMMMMMDMMMNMMMM MMMNMMMDMMMDMMMM MMMDMMMDMMMDMMMM MMMDMMHDHMMDMMMM MMHDHMMHMMHDHMMM MMMHMMMHMMAHMMMM MMMOHHHHHHHOMAMM MMMMMMOHOAAMAMMM MMMMMMMHMMAAAMMA MMMMMMOHOAAAAAAM MMMMMOHHHHAMMAMM MMMMMMHHHAAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 297 (silver bell / Bell of Opening) { MMMMMMMMMMMMMMMM MMMMMMMOAMMMMMMM MMMMMMOAOAMMMMMM MMMMMMMOAMMMMMMM MMMMMMNOPAMMMMMM MMMMMNOOOPAMMMMM MMMMMNOOOPAMMMMM MMMMMNOOOPAAMMMM MMMMONOOOPOAMMMM MMMONNOOOPNPAMMM MMMOONNNNNOPAMMM MMMMOOOOOOPAAMMM MMMMMAAPPAAAMMMM MMMMMMMAAAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 298 (tripe ration) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMOOOOMMMMMMM MMMMDODDDOOMMMMM MMMODODOOODAMMMM MMMOOOOODDDAMMMM MMMMDODOOOOAMMMM MMMMMODOODAAMMMM MMMMMMAAAAAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 299 (corpse) { MMMMMMMMMMMMMMMM MMMMMDMDPLNMMMMM MMMNOMDDLNOAMMMM MMPOOADMMOONNMMM MONONNMDLNNNNMMM MNPANDCCCNAAAAMM MMAADCCCCAADMMMM MMDDDCCCDADDDDMM MMDMNCDCCNMDMMMM MPNNNOAADNNPNNMM MONPONMDDMNONOAM MMMPNNAMDMPNAAAM MMMLNAAMDMNPAMMM MMMMAAMMMMMAAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 300 (egg) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMPONOPMMMMMMM MMMMONNNOMMMMMMM MMMPNNNNNPMMMMMM MMMONNNNNOMAAAMM MMMNNNNNNOAAAAMM MMMONNNNOOAAAAMM MMMPONNOOPAAAMMM MMMMPOOOPAAAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 301 (meatball) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMKKCKMMMMMMM MMMMKCDJDJMMMMMM MMMMCDJDJJAAAMMM MMMMDCDJAJAAAMMM MMMMKDDJJJAAAMMM MMMMMJJAJAAAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 302 (meat stick) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMCDMMM MMMMMMMMMMCDAAMM MMMMMMMMMLDAAMMM MMMMMMMDLKAAMMMM MMMMMMLCKAAMMMMM MMMMMLCKAAMMMMMM MMMMLLCAAMMMMMMM MMMDCKAAMMMMMMMM MMMCKAAMMMMMMMMM MMMMAAMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 303 (huge chunk of meat) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMKDKKMMMMMMM MMMKKJJJJKDMMMMM MMKCCKCCJJJKMMMM MMKCKKCJJJKKAMMM MCKCKJJJDDJJKAAM MKKKJJJJJJJKKAAA MKCCDJJJDJJJJAAA MKKJDJJDJJAJAAAA MCKKKJJDKKDJJAAA MDCDJJJCKCKAJAAM DKKKCAJJAJDAJJAM KCKKKKKKKJJJAJAM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 304 (meat ring) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMOOOAMMMMMMM MMMMOAAMOOAMMMMM MMMMOAAMMMOAMMMM MMMMMOAAMMMOAMMM MMMMMOAAMMMOAMMM MMMMMOAMMMMOAMMM MMMMOAAAMMOAAMMM MMMMMOOOOOAAMMMM MMMMMMAAAAAMMMMM MMMMMMMMMMMMMMMM } # tile 305 (eyeball) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMOOOPAMMMM MMMMMMOFFOOPMMMM MMMMMMFGAFOPAMMM MMMMMMFAAFOPAAAM MMMMMMOFFOOPAAAM MMMMMMMOOOPAAAMM MMMMMMMMMMMMMMMM } # tile 306 (severed hand) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMPMMPMPMMMM MMMMMMMOMOMOMMMM MMMMMMMOMOMOAMMM MMMMMMMOAOAOAMMM MMMMOMMLAOOOAMAM MMMMLMPLLOOPAMAM MMMMPLLPLOOAMAMM MMMMMOOOPOPAAMMM MMMMMMMOOOAAMMMM MMMMMMMODOAAMMMM MMMMMMMPOPAMMMMM MMMMMMMMAAAMMMMM MMMMMMMMMMMMMMMM } # tile 307 (kelp frond) { MMMMFAMMMMMMMMMM MMMMFFAMMMMMMMMM MMMMMFFAMMMMMMMM MMMMMMMFFAMMMMMM MMMMMMMMFAMMMMMM MMMMMMMMFFAMMMMM MMMMMMMMFFAMMMMM MMMMMMMMFFAMMMMM MMMMMMMFFAMMMMMM MMMMMMMFFAMMMMMM MMMMMMFFAMMMMMMM MMMMMFFFAMMMMMMM MMMMMFFAMMMMMMMM MMMMMFFFAMMMMMMM MMMMMFFFFAMMMMMM MMMMMMFFFFAMMMMM } # tile 308 (eucalyptus leaf) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMLMMMMMMMM MMMMMMMLAMMMMMMM MMMMMMMLHMMMMMMM MMMMMMGOHAMMMMMM MMMMMMGOOAMMMMMM MMMMMGOOAMMMMMMM MMMMMGOHAMMMMMMM MMMMMOOAMMMMMMMM MMMMOHAMMMMMMMMM MMMMOAMMMMMMMMMM MMMOAMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 309 (clove of garlic) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMOMMMMMMMMMM MMMMOOOAAMMMMMMM MMMMOOOOAAMMMMMM MMMMHOOOOAAMMMMM MMMMHHOOOOAAMMMM MMMMMHHHOOOAAMMM MMMMMMMHOOOAAMMM MMMMMMMMAAAAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 310 (sprig of wolfsbane) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMHHMMM MMMMMMMMMMHMMHMM MMMHHHFMMMFAAMMM MMHMAAAFMFAMMAMM MMHAAMMMFAMMMMMM MMMAMMMFFAMMMMMM MMMMMMFFAAMMMMMM MMMMMFFAAMMMMMMM MMMFFFAAMMMMMMMM MMMMAAAMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 311 (apple) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMFFMMMMMMMMMM MMMMMMFMMMMMMMMM MMMMCCFFCCMMMMMM MMMCLLKCDDKMMMMM MMMCLDDDCDKAMMMM MMMCDDDDDDKAAMMM MMMDDDDDDDKAAMMM MMMDDDDDDKCAAMMM MMMMDDKDKKAAMMMM MMMMMKAACAAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 312 (carrot) { MMMMMMMMMMMMMMMM MMMMMMMMMMFMMFMM MMMMMMMMMMGFGAAM MMMMMMMMMMFFAMMM MMMMMMMMMMGFFFMM MMMMMMMCCGFAAMMM MMMMMMCCCCAMMMMM MMMMMMDCCCMMMMMM MMMMMCCDCAMMMMMM MMMMCCCCAAMMMMMM MMMMDCAAAMMMMMMM MMMCCAAMMMMMMMMM MMCDAAMMMMMMMMMM MMCAAMMMMMMMMMMM MMMAMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 313 (pear) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMFFCCMMM MMMMMMMMFGCFMMMM MMMMMMMFGGGFAAMM MMMMMFFGHGFAAMMM MMMFGHHHGFFAAMMM MMFGHHGGGFFAMMMM MMFHHGGGGFFAMMMM MMFHHGGGGFMAMMMM MMMFGGGGFMAAMMMM MMMMFFFMMAAMMMMM MMMMMAAAAAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 314 (asian pear) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMKAMMMMM MMMMMMMMKAMMMMMM MMMMMMFFFFAMMMMM MMMMMFGGGGFAMMMM MMMMFGGGGGGFAMMM MMMMFGGGGGGFAAAM MMMMFGGGGGGFAAAA MMMMMFGGGGFAAAAM MMMMMMAAAAAAAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 315 (banana) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMJMMM MMMMMMMMMMMMHAMM MMMMMMMMMMMMHHMM MMMMMMMMMMMHOHAM MMMMMMMMMMMHOHAM MMMMMMMMMMHOHHAM MMMMMMMMMMHOHJAM MMMMMMMMMHOHHAAM MMMMMMMMHOHHJAMM MMMMMMHHOHHJAAMM MMJHOOOOHHJAAMMM MMMMHHHHJAAAMMMM MMMMMAAAAAMMMMMM MMMMMMMMMMMMMMMM } # tile 316 (orange) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMFFFMMMMMMMMM MMMMMMMFGGMMMMMM MMMMMCCFCCDMMMMM MMMMCGGCCCCDMMMM MMMDCCCCCCCDAMMM MMMCCCCCCCCDKAMM MMMCCCCCCCDDKAMM MMMDCCCCCDDKJAMM MMMMDCCCDDKCAAMM MMMMMDDDDKKAAMMM MMMMMMAKKKAAMMMM MMMMMMMAAAAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 317 (mushroom) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMBBDBMMMMM MMMMMMBDBBBBMMMM MMMMMMPPPBDBMMMM MMMMMMMPPPBBAMMM MMMMMMMNOPPBAAMM MMMMMMNOAMPAAMMM MMMMMMNOAAAAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 318 (melon) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMFFFFMMMMMM MMMMFGGGGGFMMMMM MMMFGGGGGGGFAMMM MMMGGGGGGGGFAAMM MMFGGGGGGGGFAAMM MMFGGGGGGGGFAAMM MMFGGGGGGGGAAMMM MMFGGKAGGGFAAMMM MMMFKAGGGFAAMMMM MMMMMFFFAAAMMMMM MMMMMMAAAMMMMMMM MMMMMMMMMMMMMMMM } # tile 319 (slime mold) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMJMMMM MMMMMMMMFGJFMMMM MMMMMMFFGGGFMMMM MMMMFGGGGGGFAMMM MMMFGGGGGCGCAMMM MMMGGGGGGGCCAMMM MMFGGGGCGCCKAMMM MMFGGCGGCCKJAMMM MMMCGGCCCKJAMMMM MMMMCCCKJAAAMMMM MMMMMAAAAAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 320 (lump of royal jelly) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMOHMMMMMMMMM MMMMONHHAAAMMMMM MMMONOHHHAAAMMMM MMHOOOOHHHHAMMMM MMMMHOOHHAAAMMMM MMMMMMAAAAAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 321 (cream pie) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMOOOOOOOOMMMM MMMOONNNNOONOAMM MMKNONOOONNNNJAM MMMKKKKKKKKJJAAM MMMMJKJKJKJJAAMM MMMMMMAAAAAAAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 322 (sandwich) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMKKKCKJMMM MMMMFFCOOOOOKMMM MMMFFKOOOOOOKFFM MMMMFKOOOOOOKGFA MMFGCOOOOOOOCGAA MMFGCOOOOOOKKFAM MMMMGCCCCCKLFGAM MMMMGLLLLLLFGAAM MMMMCGGGGGGGFAAM MMMMMCCCCKKAAAAM MMMMMMMAAAAAAMMM MMMMMMMMMMMMMMMM } # tile 323 (candy bar) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMIAMMMMMM MMMMMMMBIIAMMMMM MMMMMMIBBIIAMMMM MMMMMNIIBBAAMMMM MMMMNNNIIAAMMMMM MMMNNCNNAAMMMMMM MMIINNNAAMMMMMMM MIIIINAAMMMMMMMM MMIIIAAMMMMMMMMM MMMIAAMMMMMMMMMM MMMMAMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 324 (fortune cookie) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMLLMMMMMMMMM MMMMLLLLLLMMMMMM MMMLLLLLLLLMMMMM MMMLLLKJJKAAMMMM MMMLLLLLJAAMMMMM MMMMLLLLAAMMMMMM MMMMMAAAAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 325 (pancake) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMOOOOOOMMMMM MMMMOOOOOOOOMMMM MMMMOOOOKOOOOMMM MMMOOKOOOOOOOAMM MMOOOOOOOKOOOAMM MMOOOOOOOOOOOAMM MMOOKOOOOOOOOAMM MMOOOOOOOKOOAAMM MMMOOOCOOOOOAAMM MMMMOOOOOOOAAMMM MMMMMAAAAAAAMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 326 (tortilla) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMPPPPPPMMMMMM MMPPOOOOOOPPMMMM MAOOOOOOOOOOAMMM MAPPOOOOOOPPAMMM MMAAPPPPPPAAMMMM MMMAAAAAAAMMMMMM MMMMMMMMMMMMMMMM } # tile 327 (cheese) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMGGMMMMMMM MMMMMGGFGGMMMMMM MMMFGFGGGGGMMMMM MMMHHHGFGGGGMMMM MMMHHFFHGFGGMMMM MMAHHHHHHHGFGMMM AAAAAHHHFHHHGMMM AAAAAAAHHHFHMMMM MAAAAAAAAHFHMMMM MMMMAAAAAAAMMMMM MMMMMMMMMMMMMMMM } # tile 328 (pill) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMBBMMMMMM MMMMMMMBBPAMMMMM MMMMMMNLPAAMMMMM MMMMMNOOAAMMMMMM MMMMMNOAAMMMMMMM MMMMMMAAMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 329 (holy wafer) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMHHMMMMMMM MMMMMMHHOHHMMMMM MMMMMHHOHHOHHMMM MMMMHHOHHOHHOHHM MMMHHOHHOHHOHHAM MMHHOHHOHHOHHAMM MMMAHHOHHOHHAMMM MMMMMAHHOHHAMMMM MMMMMMMAHHAMMMMM MMMMMMMMMAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 330 (lembas wafer) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMOOMMMMMMM MMMMMMOOLOOMMMMM MMMMMOOLOOLOOMMM MMMMOOLOOLOOLOOM MMMOOLOOLOOLOOAM MMOOLOOLOOLOOAMM MMMAOOLOOLOOAMMM MMMMMAOOLOOAMMMM MMMMMMMAOOAMMMMM MMMMMMMMMAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 331 (cram ration) { MMMMMMMMMMMMMMMM MMMJKAMMMMMMMMMM MMMPBAMMMMMMMMMM MMMPBAMMMMMMMMMM MMMPBPAMMMMMMMMM MMMBBPAKCKKKAMMM MMMBBPKKKKCKKAMM MMMOPKCKCKKCAMMM MMMOKKKKKKKJJAMM MMMBPKLLOKJJJAMM MMMPCLOLOLKJJAMM MMMAKOLOLLKJAAMM MMMMKLOLLOCAAMMM MMMMCKKCKKKAMMMM MMMMMAAAAAAMMMMM MMMMMMMMMMMMMMMM } # tile 332 (food ration) { MMMJJAMMMMMMMMMM MMMBPAMMMMMMMMMM MMMBPAMMMMMMMMMM MMBBBPAMMMMMMMMM MMBBBPAKKKCKKKAM MBBBBPKCKKKKCKKA MBOOPKKKCKCKKCAM MBOOCKCKKKKKKJJA MBOOPKLLLLOCJJJA MBPPKLOLLLOLKJJA MMPAKOLOOOLLKJJA MPPPKLOLLLOLKJJA MMMAKOLOOOLLKKAA MMMMKLOLLLLOKAAM MMMMCKKKKCKKCAMM MMMMMAAAAAAAAMMM } # tile 333 (K-ration) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMJJAMMMMMMMMMM MMMBPAMMMMMMMMMM MMBBBPAMMMMMMMMM MMBBBPKKKCKKKAMM MMOOPKCKKKCKCKAM MMOOKKKCKKKKKJAM MMOOPCLLLLOCJJAM MMPPKLLELEOLKJAM MMPAKOLEELLLKKAM MMPPKLLEELOLKJAM MMMAKOLELELLKJAM MMMMKLLLLLLOKAAM MMMMCKKKKCKCKAMM MMMMMAAAAAAAAMMM } # tile 334 (C-ration) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMJJAMMMMMMMMMM MMMBPAMMMMMMMMMM MMBBBPAMMMMMMMMM MMBBBPAMMMMMMMMM MMOOPKKKKKKKKAMM MMOOKCKCKCKCKJAM MMOOPKLLLLOKJJAM MMPPKLOEEEOLKJAM MMPAKOLEOOLLKKAM MMPPKLOELLOLKJAM MMMACOLEEELLKJAM MMMMKLOLLLLOKAAM MMMMKKKKCKKCKAMM MMMMMAAAAAAAAMMM } # tile 335 (tin) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMBBBBMMMMMMM MMMMBPPPPPMAMMMM MMMMBPBBPMAAAMMM MMMMOBPPMMAAAAMM MMMMOOOPMMAAAAMM MMMMOOOPMMAAAMMM MMMMBOOPMMAAMMMM MMMMBBPPMMAMMMMM MMMMMBPPMAMMMMMM MMMMMMAAAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 336 (brown / booze) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMGFAMMMMMMMM MMMMMFFAMMMMMMMM MMMMCJJJAMMMMMMM MMMMMKJAMMMMMMMM MMMMKJJJAMMMMMMM MMMKCKJJJAMAAMMM MMMCJJJJJAAAAMMM MMMKJJJJJAAMMMMM MMMMKJJJAAMMMMMM MMMMMAAAAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 337 (dark / fruit juice) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMLJMMMMMMMMM MMMMMKJMMMMMMMMM MMMMAAAAMMMMMMMM MMMMMAAMMMMMMMMM MMMMAAAAMMMMMMMM MMMANAAAAMPPPMMM MMMAAAAAAPPPPMMM MMMAAAAAAPPMMMMM MMMAAAAAAPMMMMMM MMMMAAAAPMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 338 (magenta / see invisible) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMLJAMMMMMMMM MMMMMKJAMMMMMMMM MMMMDIIDAMMMMMMM MMMMMDIAMMMMMMMM MMMMDIIDAMMMMMMM MMMDLDIIDAMAAMMM MMMDIIIIDAAAAMMM MMMDDIIDDAAMMMMM MMMMDDDDAAMMMMMM MMMMMAAAAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 339 (fizzy / sickness) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMLJAMMMMMMMM MMMMMKJAMMMMMMMM MMMMOEEOAMMMMMMM MMMMMOOAMMMMMMMM MMMMOEOOAMMMMMMM MMMBEOOEOAMAAMMM MMMOEOEEOAAAAMMM MMMBEEEOEAAMMMMM MMMMBOEEAAMMMMMM MMMMMAAAAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 340 (effervescent / sleeping) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMLJAMMMMMMMM MMMMMKJAMMMMMMMM MMMMOEEOAMMMMMMM MMMMMNNAMMMMMMMM MMMMOFNNAMMMMMMM MMMBFNNFOAMAAMMM MMMOFNFFOAAAAMMM MMMBFFFNEAAMMMMM MMMMBNFFAAMMMMMM MMMMMAAAAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 341 (luminescent / clairvoyance) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMLJAMMMMMMMM MMMMMKJAMMMMMMMM MMMMNHHHAMMMMMMM MMMMMNHAMMMMMMMM MMMMNGGHAMMMMMMM MMMNMGGMHAMAAMMM MMMNGGGGHAAAAMMM MMMNMGGMHAAMMMMM MMMMNHHHAAMMMMMM MMMMMAAAAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 342 (orange / confusion) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMLJAMMMMMMMM MMMMMKJAMMMMMMMM MMMMOCCCAMMMMMMM MMMMMKCAMMMMMMMM MMMMKCCCAMMMMMMM MMMKNKCCCAMAAMMM MMMKCCCCCAAAAMMM MMMCCCCCCAAMMMMM MMMMKCCCAAMMMMMM MMMMMAAAAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 343 (sky blue / hallucination) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMLJAMMMMMMMM MMMMMKJAMMMMMMMM MMMMNBBBAMMMMMMM MMMMMNBAMMMMMMMM MMMMNBBBAMMMMMMM MMMNBBBBBAMAAMMM MMMNBBBBBAAAAMMM MMMNBBBBBAAMMMMM MMMMNBBBAAMMMMMM MMMMMAAAAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 344 (purple-red / healing) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMLJAMMMMMMMM MMMMMKJAMMMMMMMM MMMMOEDEAMMMMMMM MMMMMDEAMMMMMMMM MMMMDEDEAMMMMMMM MMMDNDEDEAMAAMMM MMMDDEDEEAAAAMMM MMMDEDEDEAAMMMMM MMMMDEDEAAMMMMMM MMMMMAAAAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 345 (puce / extra healing) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMLJAMMMMMMMM MMMMMKJAMMMMMMMM MMMMOCKJAMMMMMMM MMMMMIKAMMMMMMMM MMMMIKDJAMMMMMMM MMMINDKJJAMAAMMM MMMICKDJJAAAAMMM MMMDKDKJJAAMMMMM MMMMDCKJAAMMMMMM MMMMMAAAAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 346 (pink / restore ability) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMLJAMMMMMMMM MMMMMKJAMMMMMMMM MMMMOIIIAMMMMMMM MMMMMLIAMMMMMMMM MMMMLIIIAMMMMMMM MMMLNLIIIAMAAMMM MMMLIIIIIAAAAMMM MMMLIIIIIAAMMMMM MMMMLIIIAAMMMMMM MMMMMAAAAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 347 (yellow / blindness) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMLJAMMMMMMMM MMMMMKJAMMMMMMMM MMMMOHHHAMMMMMMM MMMMMOHAMMMMMMMM MMMMOHHHAMMMMMMM MMMONOHHHAMAAMMM MMMOHHHHHAAAAMMM MMMOHHHHHAAMMMMM MMMMOHHHAAMMMMMM MMMMMAAAAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 348 (muddy / ESP) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMLJAMMMMMMMM MMMMMKJAMMMMMMMM MMMMPMPFAMMMMMMM MMMMMPFAMMMMMMMM MMMMPFFFAMMMMMMM MMMPNPMFFAMAAMMM MMMFPFPMFAAAAMMM MMMPFPFMFAAMMMMM MMMMPPFFAAMMMMMM MMMMMAAAAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 349 (cloudy / gain energy) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMLJAMMMMMMMM MMMMMKJAMMMMMMMM MMMMOEEEAMMMMMMM MMMMMBPAMMMMMMMM MMMMBEEPAMMMMMMM MMMBEPPPEAMAAMMM MMMBEEPEEAAAAMMM MMMBEPPPPAAMMMMM MMMMBPEEAAMMMMMM MMMMMAAAAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 350 (brilliant blue / invisibility) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMLJAMMMMMMMM MMMMMKJAMMMMMMMM MMMMOEEEAMMMMMMM MMMMMBEAMMMMMMMM MMMMBEEEAMMMMMMM MMMBNBEEEAMAAMMM MMMBEEEEEAAAAMMM MMMBEEEEEAAMMMMM MMMMBEEEAAMMMMMM MMMMMAAAAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 351 (bubbly / monster detection) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMLJAMMMMMMMM MMMMMKJAMMMMMMMM MMMMOFFFAMMMMMMM MMMMMNFAMMMMMMMM MMMMFFFNAMMMMMMM MMMNFNFFFAMAAMMM MMMFFFFFNAAAAMMM MMMFNFFFFAAMMMMM MMMMFFNFAAMMMMMM MMMMMAAAAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 352 (smoky / object detection) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMLJAMMMMMMMM MMMMMKJAMMMMMMMM MMMMOPPPAMMMMMMM MMMMMOPAMMMMMMMM MMMMOPPPAMMMMMMM MMMONPPPPAMAAMMM MMMOPPPPPAAAAMMM MMMOPPPPPAAMMMMM MMMMOPPPAAMMMMMM MMMMMAAAAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 353 (swirly / enlightenment) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMLJAMMMMMMMM MMMMMKJAMMMMMMMM MMMMNOOOAMMMMMMM MMMMMNOAMMMMMMMM MMMMNOIIAMMMMMMM MMMNOIIOOAMAAMMM MMMIIOOOIAAAAMMM MMMNOOIIOAAMMMMM MMMMIIOOAAMMMMMM MMMMMAAAAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 354 (black / full healing) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMLJMMMMMMMMM MMMMMKJMMMMMMMMM MMMMAAAAMMMMMMMM MMMMMAAMMMMMMMMM MMMMAAAAMMMMMMMM MMMANAAAAPPPPMMM MMMAAAAAAPPPPMMM MMMAAAAAAPPMMMMM MMMMAAAAPMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 355 (cyan / levitation) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMLJAMMMMMMMM MMMMMKJAMMMMMMMM MMMMBBBEAMMMMMMM MMMMMBEAMMMMMMMM MMMMBBBEAMMMMMMM MMMBNBBEEAMAAMMM MMMBBBBEEAAAAMMM MMMBBBBEEAAMMMMM MMMMBBEEAAMMMMMM MMMMMAAAAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 356 (golden / polymorph) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMLJAMMMMMMMM MMMMMKJAMMMMMMMM MMMMLHHHAMMMMMMM MMMMMLHAMMMMMMMM MMMMLHHCAMMMMMMM MMMLNLHHCAMAAMMM MMMLHHHHCAAAAMMM MMMLHHHCCAAMMMMM MMMMLCCCAAMMMMMM MMMMMAAAAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 357 (dark green / speed) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMLJAMMMMMMMM MMMMMKJAMMMMMMMM MMMMOFFMAMMMMMMM MMMMMFMAMMMMMMMM MMMMFMFMAMMMMMMM MMMFNFMFMAMAAMMM MMMFFMFMMAAAAMMM MMMFMFMMMAAMMMMM MMMMFMFMAAMMMMMM MMMMMAAAAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 358 (white / acid) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMLJAMMMMMMMM MMMMMKJAMMMMMMMM MMMMNNNNAMMMMMMM MMMMMNNAMMMMMMMM MMMMNNNNAMMMMMMM MMMNPNNNNAMAAMMM MMMNNNNNNAAAAMMM MMMNNNNNNAAMMMMM MMMMNNNNAAMMMMMM MMMMMAAAAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 359 (murky / oil) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMLJAMMMMMMMM MMMMMKJAMMMMMMMM MMMMAAAAAMMMMMMM MMMMMAAAMMMMMMMM MMMMAAJAJMMMMMMM MMMALAAAAJMAAMMM MMMAAJAAAFAAAMMM MMMFAAAAAFAMMMMM MMMMAJJAJAMMMMMM MMMMMAAAAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 360 (ruby / gain ability) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMLJAMMMMMMMM MMMMMKJAMMMMMMMM MMMMODDDAMMMMMMM MMMMMCDAMMMMMMMM MMMMCDDDAMMMMMMM MMMCNCDDDAMAAMMM MMMCDDDDDAAAAMMM MMMCDDDDDAAMMMMM MMMMCDDDAAMMMMMM MMMMMAAAAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 361 (milky / gain level) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMLJAMMMMMMMM MMMMMKJAMMMMMMMM MMMMOOOOAMMMMMMM MMMMMNOAMMMMMMMM MMMMNOOOAMMMMMMM MMMNOOOOOAMAAMMM MMMNOOOOOAAAAMMM MMMNOOOOOAAMMMMM MMMMNOOOAAMMMMMM MMMMMAAAAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 362 (icy / invulnerability) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMLJAMMMMMMMM MMMMMKJAMMMMMMMM MMMMOEEEAMMMMMMM MMMMMOBAMMMMMMMM MMMMOPPBAMMMMMMM MMMOPBBBPAMAAMMM MMMOPPBPPAAAAMMM MMMOPBBBBAAMMMMM MMMMOBPPAAMMMMMM MMMMMAAAAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 363 (emerald / paralysis) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMLJAMMMMMMMM MMMMMKJAMMMMMMMM MMMMOFFFAMMMMMMM MMMMMGFAMMMMMMMM MMMMGFFFAMMMMMMM MMMGNGFFFAMAAMMM MMMGFFFFFAAAAMMM MMMGFFFFFAAMMMMM MMMMGFFFAAMMMMMM MMMMMAAAAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 364 (clear / water) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMLJAMMMMMMMM MMMMMKJAMMMMMMMM MMMMBPPPAMMMMMMM MMMMMBPAMMMMMMMM MMMMBPPPAMMMMMMM MMMBPPPPPAMAAMMM MMMBEEEEEAAAAMMM MMMBEEEEEAAMMMMM MMMMBEEEAAMMMMMM MMMMMAAAAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 365 (blood-red / blood) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMLJAMMMMMMMM MMMMMKJAMMMMMMMM MMMMODDDAMMMMMMM MMMMMCDAMMMMMMMM MMMMCDDDAMMMMMMM MMMCNCDDDAMAAMMM MMMCDDDDDAAAAMMM MMMCDDDDDAAMMMMM MMMMCDDDAAMMMMMM MMMMMAAAAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 366 (blood-red / vampire blood) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMLJAMMMMMMMM MMMMMKJAMMMMMMMM MMMMODDDAMMMMMMM MMMMMCDAMMMMMMMM MMMMCDDDAMMMMMMM MMMCNCDDDAMAAMMM MMMCDDDDDAAAAMMM MMMCDDDDDAAMMMMM MMMMCDDDAAMMMMMM MMMMMAAAAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 367 (sparkling / amnesia) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMLJAMMMMMMMM MMMMMKJAMMMMMMMM MMMMBPPPAMMMMMMM MMMMMBPAMMMMMMMM MMMMBPPBAMMMMMMM MMMBPPBPPAMAAMMM MMMBEEEBEAAAAMMM MMMBEBEEBAAMMMMM MMMMBEBEAAMMMMMM MMMMMAAAAMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 368 (LEP GEX VEN ZEA / create monster) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMPOOOOOPKAMMM MMMDOOOOOOKDJMMM MMMMPOOOOOPJAAMM MMMMMAAAAAAPAMMM MMMMMLLLLLLPAMMM MMMMMNJNJAOMAMMM MMMMMLLLLLLPAMMM MMMMMLLJLJLPAMMM MMMMPOOOOOPKAMMM MMMDOOOOOOKDJMMM MMMMPOOOOOPJAAMM MMMMMAAAAAAAAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 369 (PRIRUTSENIE / taming) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMPOOOOOPKAMMM MMMDOOOOOOKDJMMM MMMMPOOOOOPJAAMM MMMMMAAAAAAPAMMM MMMMMLLLLLLPAMMM MMMMMNJNJAOMAMMM MMMMMLLLLLLPAMMM MMMMMLLJLJLPAMMM MMMMPOOOOOPKAMMM MMMDOOOOOOKDJMMM MMMMPOOOOOPJAAMM MMMMMAAAAAAAAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 370 (VERR YED HORRE / light) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMPOOOOOPKAMMM MMMDOOOOOOKDJMMM MMMMPOOOOOPJAAMM MMMMMAAAAAAPAMMM MMMMMLLLLLLPAMMM MMMMMNJNJAOMAMMM MMMMMLLLLLLPAMMM MMMMMLLJLJLPAMMM MMMMPOOOOOPKAMMM MMMDOOOOOOKDJMMM MMMMPOOOOOPJAAMM MMMMMAAAAAAAAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 371 (YUM YUM / food detection) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMPOOOOOPKAMMM MMMDOOOOOOKDJMMM MMMMPOOOOOPJAAMM MMMMMAAAAAAPAMMM MMMMMLLLLLLPAMMM MMMMMNJNJAOMAMMM MMMMMLLLLLLPAMMM MMMMMLLJLJLPAMMM MMMMPOOOOOPKAMMM MMMDOOOOOOKDJMMM MMMMPOOOOOPJAAMM MMMMMAAAAAAAAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 372 (THARR / gold detection) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMPOOOOOPKAMMM MMMDOOOOOOKDJMMM MMMMPOOOOOPJAAMM MMMMMAAAAAAPAMMM MMMMMLLLLLLPAMMM MMMMMNJNJAOMAMMM MMMMMLLLLLLPAMMM MMMMMLLJLJLPAMMM MMMMPOOOOOPKAMMM MMMDOOOOOOKDJMMM MMMMPOOOOOPJAAMM MMMMMAAAAAAAAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 373 (KERNOD WEL / identify) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMPOOOOOPKAMMM MMMDOOOOOOKDJMMM MMMMPOOOOOPJAAMM MMMMMAAAAAAPAMMM MMMMMLLLLLLPAMMM MMMMMNJNJAOMAMMM MMMMMLLLLLLPAMMM MMMMMLLJLJLPAMMM MMMMPOOOOOPKAMMM MMMDOOOOOOKDJMMM MMMMPOOOOOPJAAMM MMMMMAAAAAAAAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 374 (ELAM EBOW / magic mapping) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMPOOOOOPKAMMM MMMDOOOOOOKDJMMM MMMMPOOOOOPJAAMM MMMMMAAAAAAPAMMM MMMMMLLLLLLPAMMM MMMMMNJNJAOMAMMM MMMMMLLLLLLPAMMM MMMMMLLJLJLPAMMM MMMMPOOOOOPKAMMM MMMDOOOOOOKDJMMM MMMMPOOOOOPJAAMM MMMMMAAAAAAAAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 375 (NR 9 / confuse monster) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMPOOOOOPKAMMM MMMDOOOOOOKDJMMM MMMMPOOOOOPJAAMM MMMMMAAAAAAPAMMM MMMMMLLLLLLPAMMM MMMMMNJNJAOMAMMM MMMMMLLLLLLPAMMM MMMMMLLJLJLPAMMM MMMMPOOOOOPKAMMM MMMDOOOOOOKDJMMM MMMMPOOOOOPJAAMM MMMMMAAAAAAAAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 376 (XIXAXA XOXAXA XUXAXA / scare monster) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMPOOOOOPKAMMM MMMDOOOOOOKDJMMM MMMMPOOOOOPJAAMM MMMMMAAAAAAPAMMM MMMMMLLLLLLPAMMM MMMMMNJNJAOMAMMM MMMMMLLLLLLPAMMM MMMMMLLJLJLPAMMM MMMMPOOOOOPKAMMM MMMDOOOOOOKDJMMM MMMMPOOOOOPJAAMM MMMMMAAAAAAAAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 377 (DAIYEN FOOELS / enchant weapon) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMPOOOOOPKAMMM MMMDOOOOOOKDJMMM MMMMPOOOOOPJAAMM MMMMMAAAAAAPAMMM MMMMMLLLLLLPAMMM MMMMMNJNJAOMAMMM MMMMMLLLLLLPAMMM MMMMMLLJLJLPAMMM MMMMPOOOOOPKAMMM MMMDOOOOOOKDJMMM MMMMPOOOOOPJAAMM MMMMMAAAAAAAAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 378 (ZELGO MER / enchant armor) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMPOOOOOPKAMMM MMMDOOOOOOKDJMMM MMMMPOOOOOPJAAMM MMMMMAAAAAAPAMMM MMMMMLLLLLLPAMMM MMMMMNJNJAOMAMMM MMMMMLLLLLLPAMMM MMMMMLLJLJLPAMMM MMMMPOOOOOPKAMMM MMMDOOOOOOKDJMMM MMMMPOOOOOPJAAMM MMMMMAAAAAAAAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 379 (PRATYAVAYAH / remove curse) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMPOOOOOPKAMMM MMMDOOOOOOKDJMMM MMMMPOOOOOPJAAMM MMMMMAAAAAAPAMMM MMMMMLLLLLLPAMMM MMMMMNJNJAOMAMMM MMMMMLLLLLLPAMMM MMMMMLLJLJLPAMMM MMMMPOOOOOPKAMMM MMMDOOOOOOKDJMMM MMMMPOOOOOPJAAMM MMMMMAAAAAAAAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 380 (VENZAR BORGAVVE / teleportation) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMPOOOOOPKAMMM MMMDOOOOOOKDJMMM MMMMPOOOOOPJAAMM MMMMMAAAAAAPAMMM MMMMMLLLLLLPAMMM MMMMMNJNJAOMAMMM MMMMMLLLLLLPAMMM MMMMMLLJLJLPAMMM MMMMPOOOOOPKAMMM MMMDOOOOOOKDJMMM MMMMPOOOOOPJAAMM MMMMMAAAAAAAAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 381 (ANDOVA BEGARIN / fire) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMPOOOOOPKAMMM MMMDOOOOOOKDJMMM MMMMPOOOOOPJAAMM MMMMMAAAAAAPAMMM MMMMMLLLLLLPAMMM MMMMMNJNJAOMAMMM MMMMMLLLLLLPAMMM MMMMMLLJLJLPAMMM MMMMPOOOOOPKAMMM MMMDOOOOOOKDJMMM MMMMPOOOOOPJAAMM MMMMMAAAAAAAAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 382 (KIRJE / earth) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMPOOOOOPKAMMM MMMDOOOOOOKDJMMM MMMMPOOOOOPJAAMM MMMMMAAAAAAPAMMM MMMMMLLLLLLPAMMM MMMMMNJNJAOMAMMM MMMMMLLLLLLPAMMM MMMMMLLJLJLPAMMM MMMMPOOOOOPKAMMM MMMDOOOOOOKDJMMM MMMMPOOOOOPJAAMM MMMMMAAAAAAAAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 383 (JUYED AWK YACC / destroy armor) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMPOOOOOPKAMMM MMMDOOOOOOKDJMMM MMMMPOOOOOPJAAMM MMMMMAAAAAAPAMMM MMMMMLLLLLLPAMMM MMMMMNJNJAOMAMMM MMMMMLLLLLLPAMMM MMMMMLLJLJLPAMMM MMMMPOOOOOPKAMMM MMMDOOOOOOKDJMMM MMMMPOOOOOPJAAMM MMMMMAAAAAAAAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 384 (DUAM XNAHT / amnesia) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMPOOOOOPKAMMM MMMDOOOOOOKDJMMM MMMMPOOOOOPJAAMM MMMMMAAAAAAPAMMM MMMMMLLLLLLPAMMM MMMMMNJNJAOMAMMM MMMMMLLLLLLPAMMM MMMMMLLJLJLPAMMM MMMMPOOOOOPKAMMM MMMDOOOOOOKDJMMM MMMMPOOOOOPJAAMM MMMMMAAAAAAAAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 385 (HACKEM MUCHE / charging) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMPOOOOOPKAMMM MMMDOOOOOOKDJMMM MMMMPOOOOOPJAAMM MMMMMAAAAAAPAMMM MMMMMLLLLLLPAMMM MMMMMNJNJAOMAMMM MMMMMLLLLLLPAMMM MMMMMLLJLJLPAMMM MMMMPOOOOOPKAMMM MMMDOOOOOOKDJMMM MMMMPOOOOOPJAAMM MMMMMAAAAAAAAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 386 (ELBIB YLOH / genocide) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMPOOOOOPKAMMM MMMDOOOOOOKDJMMM MMMMPOOOOOPJAAMM MMMMMAAAAAAPAMMM MMMMMLLLLLLPAMMM MMMMMNJNJAOMAMMM MMMMMLLLLLLPAMMM MMMMMLLJLJLPAMMM MMMMPOOOOOPKAMMM MMMDOOOOOOKDJMMM MMMMPOOOOOPJAAMM MMMMMAAAAAAAAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 387 (VE FORBRYDERNE / punishment) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMPOOOOOPKAMMM MMMDOOOOOOKDJMMM MMMMPOOOOOPJAAMM MMMMMAAAAAAPAMMM MMMMMLLLLLLPAMMM MMMMMNJNJAOMAMMM MMMMMLLLLLLPAMMM MMMMMLLJLJLPAMMM MMMMPOOOOOPKAMMM MMMDOOOOOOKDJMMM MMMMPOOOOOPJAAMM MMMMMAAAAAAAAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 388 (VELOX NEB / stinking cloud) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMPOOOOOPKAMMM MMMDOOOOOOKDJMMM MMMMPOOOOOPJAAMM MMMMMAAAAAAPAMMM MMMMMLLLLLLPAMMM MMMMMNJNJAOMAMMM MMMMMLLLLLLPAMMM MMMMMLLJLJLPAMMM MMMMPOOOOOPKAMMM MMMDOOOOOOKDJMMM MMMMPOOOOOPJAAMM MMMMMAAAAAAAAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 389 (FOOBIE BLETCH) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMPOOOOOPKAMMM MMMDOOOOOOKDJMMM MMMMPOOOOOPJAAMM MMMMMAAAAAAPAMMM MMMMMLLLLLLPAMMM MMMMMNJNJAOMAMMM MMMMMLLLLLLPAMMM MMMMMLLJLJLPAMMM MMMMPOOOOOPKAMMM MMMDOOOOOOKDJMMM MMMMPOOOOOPJAAMM MMMMMAAAAAAAAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 390 (TEMOV) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMPOOOOOPKAMMM MMMDOOOOOOKDJMMM MMMMPOOOOOPJAAMM MMMMMAAAAAAPAMMM MMMMMLLLLLLPAMMM MMMMMNJNJAOMAMMM MMMMMLLLLLLPAMMM MMMMMLLJLJLPAMMM MMMMPOOOOOPKAMMM MMMDOOOOOOKDJMMM MMMMPOOOOOPJAAMM MMMMMAAAAAAAAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 391 (GARVEN DEH) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMPOOOOOPKAMMM MMMDOOOOOOKDJMMM MMMMPOOOOOPJAAMM MMMMMAAAAAAPAMMM MMMMMLLLLLLPAMMM MMMMMNJNJAOMAMMM MMMMMLLLLLLPAMMM MMMMMLLJLJLPAMMM MMMMPOOOOOPKAMMM MMMDOOOOOOKDJMMM MMMMPOOOOOPJAAMM MMMMMAAAAAAAAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 392 (READ ME) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMPOOOOOPKAMMM MMMDOOOOOOKDJMMM MMMMPOOOOOPJAAMM MMMMMAAAAAAPAMMM MMMMMLLLLLLPAMMM MMMMMNJNJAOMAMMM MMMMMLLLLLLPAMMM MMMMMLLJLJLPAMMM MMMMPOOOOOPKAMMM MMMDOOOOOOKDJMMM MMMMPOOOOOPJAAMM MMMMMAAAAAAAAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 393 (stamped / mail) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MOOOOOOOOOEEOMMM MOOOOOOOOOEEOMMM MOOOOOOOOOOOOAMM MOOOJLJJLJOOOAMM MOOOOOOOOOOOOAMM MOOOJJLJOOOOOAMM MOOOOOOOOOOOOAMM MMMAAAAAAAAAAAMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 394 (unlabeled / blank paper) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMPOOOOOPKAMMM MMMDOOOOOOCDJMMM MMMMPOOOOOPJAAMM MMMMMAAAAAAPAMMM MMMMMLLLLLLPAMMM MMMMMLLLLLLPAMMM MMMMMLLLLLLPAMMM MMMMMLLLLLLPAMMM MMMMPOOOOOPKAMMM MMMDOOOOOOKDJMMM MMMMPOOOOOPJAAMM MMMMMAAAAAAAAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 395 (red / force bolt) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMKDDKMMMMMMMM MMMMDDDDDKMMMMMM MMMKDDHHHDDDKMMM MMMDDHHDDHDDCMMM MMKDDDHHDDDDOAMM MMDDHDDHHDDCOAAM MKDDDHHHDDDODAMM MDDDDDDDDDCOAAMM MDOODDDDDDODAMMM MMDDOOODDCOAAMMM MMMMDDDOOODAMMMM MMMMMMMDDDAAMMMM MMMMMMMMMMMMMMMM } # tile 396 (turquoise / create monster) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMFBBFMMMMMMMM MMMMBBBBBFMMMMMM MMMFBBGGGBBBFMMM MMMBBGGBBGBBBMMM MMFBBBGGBBBBOAMM MMBBGBBGGBBBOAAM MFBBBGGGBBBOBAMM MBBBBBBBBBBOAAMM MFOOBBBBBBOBAMMM MMBBOOOBBBOAAMMM MMMMFBBOOOBAMMMM MMMMMMMFBBAAMMMM MMMMMMMMMMMMMMMM } # tile 397 (velvet / drain life) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMJIJIMMMMMMMM MMMMJJIJIIAMMMMM MMMJIIHHHIJIIMMM MMMJIHHIJHIIJMMM MMJIJIHHIIJIOAMM MMJIHJIHHJIJOAAM MJIJIHHHIIIOJAMM MIJIJIJIJIJOAAMM MIOOIJIJIIOIAMMM MMJIOOOIIJOAAMMM MMMMIJIOOOJAMMMM MMMMMMMJIJAAMMMM MMMMMMMMMMMMMMMM } # tile 398 (dark / command undead) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMPPPPMMMMMMMM MMMMPPPPPPMMMMMM MMMPPPDDDPPPMMMM MMMPPDDPPDPPBBAM MMPPPPDDPPPBOAMM MMPPDPPDDPPBOAMM MPPPPDDDPPBOBAMM MPBBPPPPPPBOAMMM MPOOBBBPPBOBAMMM MAPPOOOBBBOAMMMM MMAAPPPOOOBAMMMM MMMMAAABBBAMMMMM MMMMMMMAAAMMMMMM } # tile 399 (black / summon undead) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMAAAAMMMMMMMM MMMMAAAAAAMMMMMM MMMAAABBBAAAAMMM MMMAABBAABAAAMMM MMAAAABBAAAAOMMM MMAABAABBAAAOMMM MAAAABBBAAAOAMMM MAAAAAAAAAAOMMMM MAOOAAAAAAOAMMMM MMAAOOOAAAOMMMMM MMMMAAAOOOAMMMMM MMMMMMMAAAMMMMMM MMMMMMMMMMMMMMMM } # tile 400 (thick / stone to flesh) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMJKCJMMMMMMMM MMMMKKKKKJMMMMMM MMMJCKHHHKKCJMMM MMMKKHHKKHKKCMMM MMJKCKHHKCKKOAMM MMKKHKKHHKKCOAAM MJCKKHHHKCKOLAMM MKKCKKKKKKCOJAMM MJOOKCKCKCOLAMMM MJLLOOOKKCOJAMMM MMJJLLLOOOLAAMMM MMMMJJJLLLJAMMMM MMMMMMMJJJAAMMMM MMMMMMMMMMMMMMMM } # tile 401 (white / healing) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMPNNPMMMMMMMM MMMMNNNNNPMMMMMM MMMPNNAAANNNPMMM MMMNNAANNANNNMMM MMPNNNAANNNNOAMM MMNNANNAANNNOAAM MPNNNAAANNNONAMM MNNNNNNNNNNOAAMM MNOONNNNNNONAMMM MMPNOOONNNOAAMMM MMMMPNNOOONAMMMM MMMMMMMPNNAAMMMM MMMMMMMMMMMMMMMM } # tile 402 (yellow / cure blindness) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMOHHOMMMMMMMM MMMMHHHHHOMMMMMM MMMOHHAAAHHHOMMM MMMHHAAHHAHHLMMM MMOHHHAAHHHHOAMM MMHHAHHAAHHLOAAM MOHHHAAAHHHOHAMM MHHHHHHHHHLOAAMM MHOOHHHHHHOHAMMM MMHHOOOHHLOAAMMM MMMMHHHOOOHAMMMM MMMMMMMHHHAAMMMM MMMMMMMMMMMMMMMM } # tile 403 (indigo / cure sickness) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMEEEEMMMMMMMM MMMMEEEEEEMMMMMM MMMEEEIIIEEEEMMM MMMEEIIEEIEEBMMM MMEEEEIIEEEEOAMM MMEEIEEIIEEBOAAM MEEEEIIIEEEOEAMM MEEEEEEEEEBOAAMM MEOOEEEEEEOEAMMM MMEEOOOEEBOAAMMM MMMMEEEOOOEAMMMM MMMMMMMEEEAAMMMM MMMMMMMMMMMMMMMM } # tile 404 (plaid / extra healing) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMJEEJMMMMMMMM MMMMDEEDDJMMMMMM MMMJDFHHHFFDJMMM MMMDDHHDDHFDCMMM MMJDDEHHDEEDOAMM MMEDHEEHHEECOAAM MJFDDHHHDFFOEAMM MFFDDFFDDFCOAAMM MJOODEEDDEODAMMM MMEDOOODDCOAAMMM MMMMEFDOOOFAMMMM MMMMMMMEFDAAMMMM MMMMMMMMMMMMMMMM } # tile 405 (light brown / restore ability) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMAFDAMMMMMMMM MMMMFDAAFDMMMMMM MMMFFDHHHDAAFMMM MMMFDHHFDHAFDMMM MMAFDDHHFAAFOPMM MMFDHAFHHFFDOPPM MAFFFHHHADDOAPMM MFDDDFFAAFDOPPMM MAOOPDDFFFOAPMMM MMAAOOODDFOPPMMM MMMMAAAOOOAPMMMM MMMMMMMAAAPPMMMM MMMMMMMMMMMMMMMM } # tile 406 (glittering / create familiar) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMNMMMMMMMMM MMMNPPPPMMNMMMMM MMMMPPPPPPMMMNMM MMMPPPHHHPPPPMMM MMNPPHHPPHPPBMMM MMPPPPHHPPPPONMM MNPPHPPHHPPBOAAM MPPPPHHHPPPOPAMM NPPPPPPPPPBONAMM MPOONPPPPPOPAMMM MMPPOONPPBOAAMMM MMMNMPPOOOPAMMMM MMMMMMMPPPANMMMM MMMMMMMNMMMMMMMM } # tile 407 (cloth / light) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMEPPPMMMMMMMM MMMMPPPEPPMMMMMM MMMEPPHHHPEPPMMM MMMPPHHPPHPPEMMM MMEPPPHHPPPPOAMM MMPPHPPHHEPEOAAM MEPPPHHHPPPOPAMM MPPPEPPPPPEOAAMM MPOOPPPEPPOPAMMM MMPPOOOPPEOAAMMM MMMMPPPOOOPAMMMM MMMMMMMPPPAAMMMM MMMMMMMMMMMMMMMM } # tile 408 (leather / detect monsters) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMJCKJMMMMMMMM MMMMKKKCKJMMMMMM MMMJCKHHHCKKJMMM MMMKKHHKKHKCCMMM MMKKKKHHKKKKOAMM MMKCHKKHHKCCOAAM MJKKKHHHKKKOJAMM MKCKCKKKCKCOAAMM MJOOKKCKKKOJAMMM MMJJOOOKCCOAAMMM MMMMJJJOOOJAMMMM MMMMMMMJJJAAMMMM MMMMMMMMMMMMMMMM } # tile 409 (cyan / detect food) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMBBBBMMMMMMMM MMMMBBBBBBMMMMMM MMMBBBGGGBBBBMMM MMMBBGGBBGBBBMMM MMBBBBGGBBBBOAMM MMBBGBBGGBBBOAAM MBBBBGGGBBBOBAMM MBBBBBBBBBBOAAMM MBOOBBBBBBOBAMMM MMBBOOOBBBOAAMMM MMMMBBBOOOBAMMMM MMMMMMMBBBAAMMMM MMMMMMMMMMMMMMMM } # tile 410 (dark blue / clairvoyance) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMEEEEMMMMMMMM MMMMEEEEEEMMMMMM MMMEEEHHHEEEEMMM MMMEEHHEEHEEBMMM MMEEEEHHEEEEOAMM MMEEHEEHHEEBOAAM MEEEEHHHEEEOEAMM MEEEEEEEEEBOAAMM MEOOEEEEEEOEAMMM MMEEOOOEEBOAAMMM MMMMEEEOOOEAMMMM MMMMMMMEEEAAMMMM MMMMMMMMMMMMMMMM } # tile 411 (violet / detect unseen) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMJBIJMMMMMMMM MMMMBIBIBJMMMMMM MMMJIBAAABIBJMMM MMMIBAAIBABICMMM MMJBIBAAIBIBOAMM MMBIAIBAAIBCOAAM MJIBIAAAIBIOIAMM MIBIBIBIBICOAAMM MIOOIBIBIBOIAMMM MMIIOOOIBCOAAMMM MMMMIIIOOOIAMMMM MMMMMMMIIIAAMMMM MMMMMMMMMMMMMMMM } # tile 412 (bronze / identify) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMKCCKMMMMMMMM MMMMCCCCCKMMMMMM MMMKCCHHHCCCKMMM MMMCCHHCCHCCCMMM MMKCCCHHCCCCOAMM MMCCHCCHHCCCOAAM MKCCCHHHCCCOCAMM MCCCCCCCCCCOAAMM MKOOCCCCCCOCAMMM MMCCOOOCCCOAAMMM MMMMCCCOOOCAMMMM MMMMMMMCCCAAMMMM MMMMMMMMMMMMMMMM } # tile 413 (gray / detect treasure) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMPPPPMMMMMMMM MMMMPPPPPPMMMMMM MMMPPPAAAPPPPMMM MMMPPAAPPAPPBMMM MMPPPPAAPPPPOAMM MMPPAPPAAPPBOAAM MPPPPAAAPPPOPAMM MPPPPPPPPPBOAAMM MPOOPPPPPPOPAMMM MMPPOOOPPBOAAMMM MMMMPPPOOOPAMMMM MMMMMMMPPPAAMMMM MMMMMMMMMMMMMMMM } # tile 414 (dusty / magic mapping) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMKMMMMMMMKAMMMM MMKAJCKJMMMMMMMM MMMMKKKCKJMMKMMM MKAJCKHHHCKCJMKA MMMKKHHKKHKKCMMM MMKKAKHHKKAKOAMM MMKCHKKHHCKCOAAM MJKKKHHHKKKOJAMM MCKCKKKKCKCOAAMM AJOOKCKKACOJAMMM MMJJOOOKKCOAAMMM MMMMJJKOOOJAMMMM MKAKAMMJJJAAMMMM MMMMMMMMMMMMMMMM } # tile 415 (orange / confuse monster) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMKCCKMMMMMMMM MMMMCCCCCKMMMMMM MMMKCCAAACCCKMMM MMMCCAACCACCLMMM MMKCCCAACCCCOAMM MMCCACCAACCLOAAM MKCCCAAACCCOCAMM MCCCCCCCCCLOAAMM MCOOCCCCCCOCAMMM MMCCOOOCCLOAAMMM MMMMCCCOOOCAMMMM MMMMMMMCCCAAMMMM MMMMMMMMMMMMMMMM } # tile 416 (light green / slow monster) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMFGGFMMMMMMMM MMMMGGGGGFMMMMMM MMMFGGMMMGGGFMMM MMMGGMMGGMGGHMMM MMFGGGMMGGGGOAMM MMGGMGGMMGGHOAAM MFGGGMMMGGGOGAMM MGGGGGGGGGHOAAMM MGOOGGGGGGOGAMMM MMGGOOOGGHOAAMMM MMMMGGGOOOGAMMMM MMMMMMMGGGAAMMMM MMMMMMMMMMMMMMMM } # tile 417 (light blue / cause fear) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMEBBEMMMMMMMM MMMMBBBBBEMMMMMM MMMEBBAAABBBEMMM MMMBBAABBABBBMMM MMEBBBAABBBBOAMM MMBBABBAABBBOAAM MEBBBAAABBBOBAMM MBBBBBBBBBBOAAMM MBOOBBBBBBOBAMMM MMBBOOOBBBOAAMMM MMMMBBBOOOBAMMMM MMMMMMMBBBAAMMMM MMMMMMMMMMMMMMMM } # tile 418 (magenta / charm monster) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMKIIKMMMMMMMM MMMMIIIIIKMMMMMM MMMKIIEEEIIIKMMM MMMIIEEIIEIICMMM MMKIIIEEIIIIOAMM MMIIEIIEEIICOAAM MKIIIEEEIIIOIAMM MIIIIIIIIICOAAMM MIOOIIIIIIOIAMMM MMIIOOOIICOAAMMM MMMMIIIOOOIAMMMM MMMMMMMIIIAAMMMM MMMMMMMMMMMMMMMM } # tile 419 (dull / enchant weapon) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMJKKJMMMMMMMM MMMMKCKKKKMMMMMM MMMKKKCCCKKKJMMM MMMKCCCKCCCKJMMM MMJKKKCCKKKKPAMM MMKCCCKCCKCJPAAM MJKKKCCCKKKPJAMM MKCKKKCKCKKPAAMM MJPPKKKKKKPJAMMM MMJJPPPCKKPAAMMM MMMMJJJPPPJAMMMM MMMMMMMJJJAAMMMM MMMMMMMMMMMMMMMM } # tile 420 (thin / enchant armor) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMJKJMMMMMMMM MMMMJKKCKKJMMMMM MMMMKCHHHKCKKMMM MMMJKHHKKHKKOAMM MMMKKKHHKKCKOAAM MMKKHKKHHKKCJAMM MMKCKHHHKCKOAAMM MJOCKKKKKKCJAMMM MMJJOOCCKCOAAMMM MMMMJJJOCOJAMMMM MMMMMMMJJJAAMMMM MMMMMMMMMMMMMMMM } # tile 421 (wide / protection) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMGGGGMMMMMMMM MMMMKGGKKJMMMMMM MMMDDKAAAKKDDMMM MMMDDAADCHGDDMMM MMGGCKAAGGGGOAMM MMGGAKKAAGGGOAAM MGGDDAAAKGGOJAMM MKKDDGGKDDCOAAMM MJOOGGGGDDOJAMMM MMJJOOOGKCOAAMMM MMMMJJJOOOJAMMMM MMMMMMMJJJAAMMMM MMMMMMMMMMMMMMMM } # tile 422 (big / resist poison) { MMMMMMMMMMMMMMMM MMMMMKDMMMMMMMMM MMMMMDDDKDMMMMMM MMMMKDDGGDKDMMMM MMMMDDGDDDDDDDMM MMMKDDGDGDGDDOMM MMMDDDGGDDGDCODM MMKDDDDGGGDDODAA MMDDDDGDDDDCOAAM MKDDDGDDDDDODAMM MDDDDDDDDDCOAAMM MDOODDDDDDODAMMM MMDDOOODDCOAAMMM MMMMDDDOOODAMMMM MMMMMMMDDDAAMMMM MMMMMMMMMMMMMMMM } # tile 423 (fuzzy / resist sleep) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMFMFMMFMMMMMM MMMMFFFFFMMMMMMM MMMFFFGGFFFFMMMM MMFFFGDDDGFFFMMM MMFFFDDGGDGFFFAM MMFFGGDDGGFFOAMM MFFGDGGDDGFFOAMM MFFGGDDDGFFOFAMM FFFFFGGGFFFOAMMM MFOOFFFFFFOFAMMM MAFFOOOFFFOAMMMM MMAAFFFOOOFAMMMM MMAMAAAFFFAMMMMM MMMMAMMAAAMMMMMM } # tile 424 (deep / endure cold) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMDIIDMMMMMMMM MMMMIIIIIDMMMMMM MMMDIIMMMIIIDMMM MMMIIMMIIMIIOMMM MMDIIIMMIIIOOAMM MMIIMIIMMIIOOAAM MDIIIMMMIIOOIAMM MIOOIIIIIIOOAAMM MDOOOOOIIOOIAMMM MMIIOOOOOOOAAMMM MMMMIIIOOOIAMMMM MMMMMMMIIIAAMMMM MMMMMMMMMMMMMMMM } # tile 425 (spotted / endure heat) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMEEMMMMMMMMMM MMMEEEEEMMMMMMMM MMMEEEEEEEMMMMMM MMEEEDDDEEEEEMMM MEEEEDEEDEEEBMMM MEEEEEDEEDDEOAMM EEEDDEEDEEEBOAAM EEEEEDEEDEEOEAMM EEEEEEDDDEBOAAMM MEOOEEEEEEOEAMMM MMEEOOOEEBOAAMMM MMMMEEEOOOEAMMMM MMMMMMMEEEAAMMMM MMMMMMMMMMMMMMMM } # tile 426 (long / insulate) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMEEEEMMMMMM MMMMMMEEELEEEMMM MMMMMEEELELEEEMM MMMMMEEELELEBOMM MMMMEEEELEEEOAAM MMMMEELELEEBOAAM MMMEEELELEEOEAMM MMMEEEELEEBOAAMM MMEEEEEEEEOEAMMM MMEEOOOEEBOAAMMM MMMMEEEOOOEAMMMM MMMMMMMEEEAAMMMM MMMMMMMMMMMMMMMM } # tile 427 (wrinkled / remove curse) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMJKKJMMMMMMMM MMMMKCKKKMMMMMMM MMMMKKAAACKKJMMM MMMKCAAKKAKCKMMM MMKKKKAACKKKOAMM MMKCACKAAKCKOAAM MJKKKAAAKKKOKAMM MKCKKCKKCKLOAAMM MKOOLKKKKCOKAMMK MMJKOOCKKKOAAMMM MMMMJKLOOOCAMMMM MMMMMMJJKKAAMMMM MMMMMMMMMMMMMMMM } # tile 428 (copper / turn undead) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMJKKJMMMMMMMM MMMMKCKCKJMMMMMM MMMJCKHHHKCKJMMM MMMCKHHCKHKCCMMM MMJKCKHHCKCKOAMM MMKCHCKHHCKCOAAM MJCKCHHHCCCOJAMM MCKCKCKCKCCOAAMM MJOOCKCKCKOJAMMM MMCJOOOCKCOAAMMM MMMMJCJOOOJAMMMM MMMMMMMJCJAAMMMM MMMMMMMMMMMMMMMM } # tile 429 (torn / jumping) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMBCDEMMMMMMMM MMMMFGAAALMMMMMM MMMNOAHHHACDEMMM MMMFAHHAAHALNMMM MMOPAAHHAAFGOAMM MMIAHAAHHAOPOAAM MBCDAHHHAGIOJAMM MJKLNAAACDEOAAMM MJOOFGIJKLOJAMMM MMJJOOONOPOAAMMM MMMMJJJOOOJAMMMM MMMMMMMJJJAAMMMM MMMMMMMMMMMMMMMM } # tile 430 (purple / haste self) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMEDEDMMMMMMMM MMMMDEDEDEMMMMMM MMMDEDHHHDEDMMMM MMMEDHHEDHDECMMM MMEDEDHHEDEDOAMM MMDEHEDHHEDCOAAM MDEDEHHHEDEOIAMM MEDEDEDEDECOAAMM MDOOEDEDEDOIAMMM MMIIOOOEDCOAAMMM MMMMIIIOOOIAMMMM MMMMMMMIIIAAMMMM MMMMMMMMMMMMMMMM } # tile 431 (faded / enlighten) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMKCKKMMMMMMMM MMMMKKCKCKMMMMMM MMMCKKJJJKKCKMMM MMMKKKJKJJKKKMMM MMKCKKJKKKKCOAMM MMKKJCKJJCKKOAAM MKCKKJJJJKKOJAMM MKKKCKJJKCKOAAMM MCOOKKCKKKOJAMMM MMJJOOOKCKOAAMMM MMMMJJJOOOJAMMMM MMMMMMMJJJAAMMMM MMMMMMMMMMMMMMMM } # tile 432 (dark brown / invisibility) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMJJJJMMMMMMMM MMMMJJJJJJMMMMMM MMMJJJHHHJJJJMMM MMMJJHHJJHJJKMMM MMJJJJHHJJJJOAMM MMJJHJJHHJJKOAAM MJJJJHHHJJJOJAMM MJJJJJJJJJKOAAMM MJOOJJJJJKOJAMMM MMJJOOOJJKOAAMMM MMMMJJJOOOJAMMMM MMMMMMMJJJAAMMMM MMMMMMMMMMMMMMMM } # tile 433 (tan / levitation) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMJCKJMMMMMMMM MMMMCKCKCJMMMMMM MMMJKCHHHCKCJMMM MMMCCHHKCHCKCMMM MMJCKCHHKCKCOAMM MMCKHKCHHKCCOAAM MJKCKHHHCCKOKAMM MKCKCKCKCKCOAAMM MJOOKCKCKCOCAMMM MMCKOOOCCCOAAMMM MMMMCKKOOOKAMMMM MMMMMMMKKCAAMMMM MMMMMMMMMMMMMMMM } # tile 434 (gold / teleport away) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMLHHLMMMMMMMM MMMMHHHHHLMMMMMM MMMLHHCCCHHHLMMM MMMHHCCHHCHHNMMM MMLHHHCCHHHHOAMM MMHHCHHCCHHNOAAM MLHHHCCCHHHOHAMM MHHHHHHHHHNOAAMM MLOOHHHHHHOHAMMM MMHHOOOHHNOAAMMM MMMMHHHOOOHAMMMM MMMMMMMHHHAAMMMM MMMMMMMMMMMMMMMM } # tile 435 (ochre / passwall) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMKDDKMMMMMMMM MMMMDDDDDKMMMMMM MMMKDDHHHDDDKMMM MMMDDHHDDHDDCMMM MMKDDDHHDDDDOAMM MMDDHDDHHDDCOAAM MKDDDHHHDDDODAMM MDDDDDDDDDCOAAMM MDOODDDDDDODAMMM MMDDOOODDCOAAMMM MMMMDDDOOODAMMMM MMMMMMMDDDAAMMMM MMMMMMMMMMMMMMMM } # tile 436 (silver / polymorph) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMPPPPMMMMMMMM MMMMPPPPPPMMMMMM MMMPPPNNNPPPPMMM MMMPPNNPPNPPBMMM MMPPPPNNPPPPOAMM MMPPNPPNNPPBOAAM MPPPPNNNPPPOPAMM MPPPPPPPPPBOAAMM MPOOPPPPPPOPAMMM MMPPOOOPPBOAAMMM MMMMPPPOOOPAMMMM MMMMMMMPPPAAMMMM MMMMMMMMMMMMMMMM } # tile 437 (pink / knock) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMDIIDMMMMMMMM MMMMIIIIIDMMMMMM MMMDIIHHHIIIDMMM MMMIIHHIIHIICMMM MMDIIIHHIIIIOAMM MMIIHIIHHIICOAAM MDIIIHHHIIIOIAMM MIIIIIIIIICOAAMM MIOOIIIIIIOIAMMM MMIIOOOIICOAAMMM MMMMIIIOOOIAMMMM MMMMMMMIIIAAMMMM MMMMMMMMMMMMMMMM } # tile 438 (canvas / flame sphere) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMAMMMMMMMMMMMM MMMMANNNMMMMMMMM MMAMNNNNNNMMMMMM MMMANNEEENNNNMMM MAMNNEENNENNNMMM MMANNNEENNNNOAMM AMNNENNEENNNOAAM MANNNEEENNNOPAMM MNNNNNNNNNNOAAMM MPOONNNNNNOPAMMM MMPPOOONNNOAAMMM MMMMPPPOOOPAMMMM MMMMMMMPPPAAMMMM MMMMMMMMMMMMMMMM } # tile 439 (hardcover / freeze sphere) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMOKKJMMMMMMMM MMMMOCKKCJMMMMMM MMMOKKHHHKKKJMMM MMMOKHHKKHKCKMMM MMOCKKHHCKKKKAMM MMOKHKKHHKCKCAAM MOKCKHHHKKKKJAMM MOKKKCKKCKCKAAMM MOOOKKKKKKKJAMMM MMJJOOOCKKKAAMMM MMMMJJJOOCJAMMMM MMMMMMMJJJAAMMMM MMMMMMMMMMMMMMMM } # tile 440 (dark green / wizard lock) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMFFFFMMMMMMMM MMMMFFFFFFMMMMMM MMMFFFHHHFFFFMMM MMMFFHHFFHFFGMMM MMFFFFHHFFFFOAMM MMFFHFFHHFFGOAAM MFFFFHHHFFFOFAMM MFFFFFFFFFGOAAMM MFOOFFFFFFOFAMMM MMFFOOOFFGOAAMMM MMMMFFFOOOFAMMMM MMMMMMMFFFAAMMMM MMMMMMMMMMMMMMMM } # tile 441 (parchment / dig) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMNNNNMMMMMMMM MMMMNPANNNMMMMMM MMMNPAEEENNNNMMM MMMNNEENNENNNMMM MMMNNNEENNNNOAMM MMNPENNEENNNOAAM MNPANEEENNNOPAMM MNNNNNNNNNNOAAMM MPOONNNNNNOPAMMM MMPPOOONNNOAAMMM MMMMPPPOOOPAMMMM MMMMMMMPPPAAMMMM MMMMMMMMMMMMMMMM } # tile 442 (shining / cancellation) { MMMMNMMMMMMMMMMM MMMMMMMNMMMMMMMM MMNMMMMMMMMMMMMM MMMMPNPPMMMMMMMM MMMMPNNNPPMMMMMM MMMPNNAAAPPPPMMM MMMPNAAPPAPPBMMM MMPNNPAAPPPPOAMM MMPNAPPAAPPBOAAM MPNPPAAAPPPOPAMM MPPPPPPPPPBOAAMM MPOOPPPPPPOPAMMM MMPPOOOPPBOAAMMM MMMMPPPOOOPAMMMM MMMMMMMPPPAAMMMM MMMMMMMMMMMMMMMM } # tile 443 (vellum / magic missile) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMJKKJMMMMMMMM MMMMKCKKKJMMMMMM MMMJKKHHHCKKJMMM MMMKCHHKKHKCCMMM MMKKKKHHCKKKOAMM MMKCHKKHHKCCOAAM MJKKKHHHKKKOJAMM MKCKCKKKCKCOAAMM MJOOKKCKKKOJAMMM MMJJOOOKCCOAAMMM MMMMJJJOOOJAMMMM MMMMMMMJJJAAMMMM MMMMMMMMMMMMMMMM } # tile 444 (ragged / fireball) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMJKKJMMMMMMMM MMMMKCKKKJMMMMMM MMMJKKHHHKKKJMMM MMMKCHHKKHCKCMMM MMJKKKHHKKKKOAMM MMKCHKKHHKCCOAAM MKKKKHHHKKKJJAMM MKCKCKKKCKCJAAMM MJOOKKCKKKOJAMMM MMJJOOOKCCOAAMMM MMMMJOOOOOJAMMMM MMMMMMOOJJAAMMMM MMMMMMMMMMMMMMMM } # tile 445 (dog eared / cone of cold) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMJKKJMMMMMMMM MMMMKCKKKJMMMMMM MMMJKKHHHKOMMMMM MMMKCHHKKCJOCMMM MMJKKKHHKKJOOAMM MMKCHKKHHKKCOAAM MKKKKHHHKCKOJAMM MKCKCKKKKKCOAAMM MJOOKKCKCKOJAMMM MMJJOOOKKCOAAMMM MMMMJJKOOOJAMMMM MMMMMMMJJJAAMMMM MMMMMMMMMMMMMMMM } # tile 446 (mottled / sleep) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMJKKJMMMMMMMM MMMMKCKKKJMMMMMM MMMJKKHHHKKKJMMM MMMKCHHKKHKCCMMM MMJKKKHHCKKKOAMM MMKCHKKHHKCCOAAM MKKKKHHHKKKOJAMM MKCKCKKKCKCLAAMM MJOOKKCKKKOJAMMM MMJJLLOKCCOAAMMM MMMMJJJOLLJAMMMM MMMMMMMJJJAAMMMM MMMMMMMMMMMMMMMM } # tile 447 (stained / finger of death) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMKKKJMMMMMMMM MMMMKCKKCJMMMMMM MMMJKKHHCJJJJMMM MMMKCHHKKCJJCMMM MMJJJJCHKJJJLAMM MMKJCJJHHKCCLAAM MKKJJCCCKKKOJAMM MKCKJJJJKCCOAAMM MJOOKJKKKKOJAMMM MMJJOLOKCCOAAMMM MMMMJJJOOOJAMMMM MMMMMMMJJJAAMMMM MMMMMMMMMMMMMMMM } # tile 448 (rainbow / lightning) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMDDHGMMMMMMMM MMMMDPPGGBMMMMMM MMMDPPAAPBEEIMMM MMMDPAPPAPPEIMMM MMDPPPAPPPEIOAMM MMDPAPPAPPEIOAAM MDDHPAAPPEIOJAMM MJDHGGBPPEIOAAMM MJOOGGBEEIOJAMMM MMJJOOOEEIOAAMMM MMMMJJJOOOJAMMMM MMMMMMMJJJAAMMMM MMMMMMMMMMMMMMMM } # tile 449 (tattered / poison blast) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMJKKJMMMMMMMM MMMMKCKKKJMMMMMM MMMKKKHHHKOMMMMM MMMKCHHKKCJOCMMM MMJKKKHHKKJOOAMM MMKCHKKHHKKCOAAM MJKKKHHHKCKOJAMM MKCKCKKKKKCOAAMM MJOOKKCKCKOJAMMM MMJJOOOKKCOAAMMM MMMMJJKOOOJAMMMM MMMMMMMJJJAAMMMM MMMMMMMMMMMMMMMM } # tile 450 (colorful / acid stream) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMJKKJMMMMMMMM MMMMKCKKKJMMMMMM MMMJKKHHHKOMMMMM MMMKCHHKKCJOCMMM MMKKKKHHKKJOOAMM MMKCHKKHHKKCOAAM MJKKKHHHKCKOJAMM MKCKCKKKKKCOAAMM MJOOKKCKCKOJAMMM MMJJOOOKKCOAAMMM MMMMJJKOOOJAMMMM MMMMMMMJJJAAMMMM MMMMMMMMMMMMMMMM } # tile 451 (tartan) { MMMMMMMMMMMMMMMM MMMMMPPPPAMMMMMM MMMMPPPPPPPPAMMM MMMMPPPHHHHPPPPA MMMPPPHHHPHHPPOA MMMPPPHPPPHHPPOA MMPPPPHHHPPPPOPA MMPHHPPPHHPPOPAM MPPHHHPPHHPPOPAM MPPPHHHHHPPOPAMM MPPPPPHHHPPOAAMM MPOOPPPPPPOPAMMM MMPPOOOPPPLAAMMM MMMMPPPOOOPAMMMM MMMMMMMPPPAAMMMM MMMMMMMMMMMMMMMM } # tile 452 (stylish) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMDCDCAMMMMMMM MMMMCDCDCDMMMMMM MMMCDCHHHCDCDAMM MMMDCHHDCHCDCAMM MMDCDCHHDCDCOAMM MMCDHDCHHDCDOAAM MCDCDHHHDCDOCAMM MDCDCDCDCDCOAAMM MCOODCDCDCOCAMMM MMCDOOODCDOAAMMM MMMMDCDOOODAMMMM MMMMMMMDCDAAMMMM MMMMMMMMMMMMMMMM } # tile 453 (psychedelic) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMPPPPAMMMMMMM MMMMPPPPPPMMMMMM MMMPPPHHHPPPPAMM MMMPPHHPPHOOPAMM MMPPPPHHPPOAAMMM MMPPHPPHHPOAMMMM MPPPPHOOOPPOPAMM MPPPPPOAAAAAMMMM MPOOPPPAMMMMMMMM MMPPOOOPPPAMMMMM MMMMPPPOOOPAMMMM MMMMMMMPPPAAMMMM MMMMMMMMMMMMMMMM } # tile 454 (spiral-bound) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMJKKJMMMMMMMM MMMMKKCKKJMMMMMM MMMJCKHHHKCKJMMM MMMKKHHKKHKKCMMM MMJKCKHHKKCKOAMM MMKKHKKHHKKCOAAM MJKCKHHHKCKOLAMM MCKKKKKKKKCOJAMM MJOOCKCKCKOLAMMM MJLLOOOKKCOJAMMM MMJJLLLOOOLAAMMM MMMMJJJLLLJAMMMM MMMMMMMJJJAAMMMM MMMMMMMMMMMMMMMM } # tile 455 (left-handed) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMJKKJMMMMMMMM MMMMCKCKKJMMMMMM MMMJKKHHHKKKJMMM MMMKKHHKKHCKCMMM MMJKCKHHKKKKOAMM MMKKHKKHHKCCOAAM MJKCKHHHKKKOLAMM MCKKKKKKCKCOJAMM MJOOCKCKKKOLAMMM MJLLOOOKCCOJAMMM MMJJLLLOOOLAAMMM MMMMJJJLLLJAMMMM MMMMMMMJJJAAMMMM MMMMMMMMMMMMMMMM } # tile 456 (stapled) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMJKKJMMMMMMMM MMMMCKCKKJMMMMMM MMMJKKHHHKKKJMMM MMMKKHHKKHCKCMMM MMJKCKHHKKKKOAMM MMKKHKKHHKCCOAAM MJCKKHHHKKKOLAMM MKKCKKKKCKCOJAMM MJOOKCKKKCOLAMMM MJLLOOOKKCOJAMMM MMJJLLLOOOLAAMMM MMMMJJJLLLJAMMMM MMMMMMMJJJAAMMMM MMMMMMMMMMMMMMMM } # tile 457 (plain / blank paper) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMJKKJMMMMMMMM MMMMKCKCKJMMMMMM MMMJKKKKCKKKJMMM MMMKCKKKKKCKCMMM MMKKKKCKCKKKOAMM MMKCKKKKKCKCOAAM MJKKCKCKKKKOJAMM MKCKKKKKCKCOAAMM MJOOKCKKCKOJAMMM MMJJOOOKKCOAAMMM MMMMJJKOOOJAMMMM MMMMMMMJJJAAMMMM MMMMMMMMMMMMMMMM } # tile 458 (papyrus / Book of the Dead) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMAAAAMMMMMMMM MMMMAAAAAAMMMMMM MMMAAAOOOAAAAMMM MMMAAOAOOOAAAMMM MMAAAAOOAOAAOMMM MMAAAOAOOAAAOMMM MAAAAOOOAAAOAMMM MAAAAAAAAAAOMMMM MAOOAAAAAAOAMMMM MMAAOOOAAAOMMMMM MMMMAAAOOOAMMMMM MMMMMMMAAAMMMMMM MMMMMMMMMMMMMMMM } # tile 459 (glass / light) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMNMMM MMMMMMMMMMMNBMMM MMMMMMMMMMNBAAMM MMMMMMMMMNBAAMMM MMMMMMMMNBAAMMMM MMMMMMMNBAAMMMMM MMMMMMNBAAMMMMMM MMMMMNBAAMMMMMMM MMMMNBAAMMMMMMMM MMMNBAAMMMMMMMMM MMMBAFMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 460 (oak / nothing) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMNMMMM MMMMMMMMMMNNOMMM MMMMMMMMMJKOAAMM MMMMMMMMJJJAAMMM MMMMMMMJJKAAMMMM MMMMMMJKJAAMMMMM MMMMMJJJAAMMMMMM MMMMJKKAAMMMMMMM MMMOKJAAMMMMMMMM MMNNOAAMMMMMMMMM MMMNAAMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 461 (crystal / enlightenment) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMNMMMM MMMMMMMMMMNBMMMM MMMMMMMMMNBAMMMM MMMMMMMMNBAMMMMM MMMMMMMNBAMMMMMM MMMMMMNBAMMMMMMM MMMMMNBAMMMMMMMM MMMMNBAMMMMMMMMM MMMMBAMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 462 (bamboo / healing) { MMMMMMMMMMMMMMMM MMMMMMMMMFMMMMMM MMMMMMMMMFFMGMMM MMMMMMMMMFMGFMMM MMMMMMMMMFGFAAMM MMMMMMMMMGFAAMMM MMMMMMMMGFAAMMMM MMMMMMMGFAAMMMMM MMMMMMGFAFMMMMMM MMMMMGFFFFFMMMMM MMMMGFAAMMMMMMMM MMMGFAAMMMMMMMMM MMMFAAMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 463 (aluminum / locking) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMNOMMM MMMMMMMMMMPPAAMM MMMMMMMMMBPAAMMM MMMMMMMMPPAAMMMM MMMMMMMBPAAMMMMM MMMMMMPPAAMMMMMM MMMMMBPAAMMMMMMM MMMMPPAAMMMMMMMM MMMNOAAMMMMMMMMM MMMMAAMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 464 (marble / make invisible) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMNOMMM MMMMMMMMMMIOAAMM MMMMMMMMMNIAAMMM MMMMMMMMNNAAMMMM MMMMMMMIIAAMMMMM MMMMMMNNAAMMMMMM MMMMMINAAMMMMMMM MMMMNIAAMMMMMMMM MMMNOAAMMMMMMMMM MMMMAAMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 465 (zinc / opening) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMNOMMM MMMMMMMMMMLPAAMM MMMMMMMMMLPAAMMM MMMMMMMMLPAAMMMM MMMMMMMLPAAMMMMM MMMMMMLPAAMMMMMM MMMMMLPAAMMMMMMM MMMMLPAAMMMMMMMM MMMNOAAMMMMMMMMM MMMMAAMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 466 (uranium / probing) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMPNOMMM MMMMMMMMMPPPAAMM MMMMMMMMHHPAAMMM MMMMMMMHAHAAMMMM MMMMMMPAHAAMMMMM MMMMMPPPAAMMMMMM MMMMPPPAAMMMMMMM MMMPPPAAMMMMMMMM MMMNOAAMMMMMMMMM MMMMAAMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 467 (balsa / secret door detection) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMOKMMM MMMMMMMMMMOKAAMM MMMMMMMMMLCAAMMM MMMMMMMMLKAAMMMM MMMMMMMLKAAMMMMM MMMMMMLKAAMMMMMM MMMMMLCAAMMMMMMM MMMMOKAAMMMMMMMM MMMOKAAMMMMMMMMM MMMMAAMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 468 (tin / slow monster) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMNOMMM MMMMMMMMMMPPAAMM MMMMMMMMMPPAAMMM MMMMMMMMPPAAMMMM MMMMMMMPPAAMMMMM MMMMMMPPAAMMMMMM MMMMMPPAAMMMMMMM MMMMPPAAMMMMMMMM MMMNOAAMMMMMMMMM MMMMAAMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 469 (brass / speed monster) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMNOMMM MMMMMMMMMMHCAAMM MMMMMMMMMHCAAMMM MMMMMMMMHCAAMMMM MMMMMMMHCAAMMMMM MMMMMMHCAAMMMMMM MMMMMHCAAMMMMMMM MMMMHCAAMMMMMMMM MMMNOAAMMMMMMMMM MMMMAAMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 470 (ebony / striking) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMNOMMM MMMMMMMMMMAJAAMM MMMMMMMMMAJAAMMM MMMMMMMMAJAAMMMM MMMMMMMAJAAMMMMM MMMMMMAJAAMMMMMM MMMMMAJAAMMMMMMM MMMMAJAAMMMMMMMM MMMNOAAMMMMMMMMM MMMMAAMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 471 (copper / undead turning) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMNOMMM MMMMMMMMMMCCAAMM MMMMMMMMMCCAAMMM MMMMMMMMCCAAMMMM MMMMMMMCCAAMMMMM MMMMMMCCAAMMMMMM MMMMMCCAAMMMMMMM MMMMCCAAMMMMMMMM MMMNOAAMMMMMMMMM MMMMAAMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 472 (ceramic / draining) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMNMMM MMMMMMMMMMMNBMMM MMMMMMMMMMNBAAMM MMMMMMMMMNBAAMMM MMMMMMMMNBAAMMMM MMMMMMMNBAAMMMMM MMMMMMNBAAMMMMMM MMMMMNBAAMMMMMMM MMMMNBAAMMMMMMMM MMMNBAAMMMMMMMMM MMMBAFMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 473 (platinum / cancellation) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMNOMMM MMMMMMMMMMNOAAMM MMMMMMMMMNBAAMMM MMMMMMMMNBAAMMMM MMMMMMMNBAAMMMMM MMMMMMNBAAMMMMMM MMMMMNBAAMMMMMMM MMMMNOAAMMMMMMMM MMMNOAAMMMMMMMMM MMMMAAMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 474 (maple / create monster) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMNOMMM MMMMMMMMMMKJAAMM MMMMMMMMMKJAAMMM MMMMMMMMKKAAMMMM MMMMMMMKJAAMMMMM MMMMMMCJAAMMMMMM MMMMMKJAAMMMMMMM MMMMKJAAMMMMMMMM MMMNOAAMMMMMMMMM MMMMAAMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 475 (rusty / fear) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMKMMM MMMMMMMMMMMLCMMM MMMMMMMMMMLCAAMM MMMMMMMMMKCAAMMM MMMMMMMMKCAAMMMM MMMMMMMLCAAMMMMM MMMMMMKCAAMMMMMM MMMMMKCAAMMMMMMM MMMMLCAAMMMMMMMM MMMLCAAMMMMMMMMM MMMCAAMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 476 (silver / polymorph) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMNOMMM MMMMMMMMMMNPAAMM MMMMMMMMMNPAAMMM MMMMMMMMNPAAMMMM MMMMMMMNPAAMMMMM MMMMMMNPAAMMMMMM MMMMMNPAAMMMMMMM MMMMNPAAMMMMMMMM MMMNOAAMMMMMMMMM MMMMAAMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 477 (iridium / teleportation) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMNOMMM MMMMMMMMMMNOAAMM MMMMMMMMMPIAAMMM MMMMMMMMPIAAMMMM MMMMMMMPIAAMMMMM MMMMMMPIAAMMMMMM MMMMMPIAAMMMMMMM MMMMNIAAMMMMMMMM MMMNOAAMMMMMMMMM MMMMAAMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 478 (black / create horde) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMBEMMM MMMMMMMMMMAEAAMM MMMMMMMMMAEAAMMM MMMMMMMMAEAAMMMM MMMMMMMAEAAMMMMM MMMMMMAEAAMMMMMM MMMMMAEAAMMMMMMM MMMMAEAAMMMMMMMM MMMBEAAMMMMMMMMM MMMMAAMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 479 (bronze / extra healing) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMLMMM MMMMMMMMMMMCKMMM MMMMMMMMMMCKAAMM MMMMMMMMMCCAAMMM MMMMMMMMCKAAMMMM MMMMMMMCKAAMMMMM MMMMMMCKAAMMMMMM MMMMMCKAAMMMMMMM MMMMCKAAMMMMMMMM MMMLLAAMMMMMMMMM MMMKAAMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 480 (pine / wishing) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMNOMMM MMMMMMMMMMLLAAMM MMMMMMMMMLLAAMMM MMMMMMMMLLAAMMMM MMMMMMMLLAAMMMMM MMMMMMLLAAMMMMMM MMMMMLLAAMMMMMMM MMMMLLAAMMMMMMMM MMMNOAAMMMMMMMMM MMMMAAMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 481 (iron / digging) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMKJMMM MMMMMMMMMMKPAAMM MMMMMMMMMPPAAMMM MMMMMMMMPPAAMMMM MMMMMMMPPAAMMMMM MMMMMMPPAAMMMMMM MMMMMPPAAMMMMMMM MMMMKPAAMMMMMMMM MMMKJAAMMMMMMMMM MMMMAAMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 482 (steel / magic missile) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMKPMMM MMMMMMMMMMOPAAMM MMMMMMMMMOPAAMMM MMMMMMMMOPAAMMMM MMMMMMMOPAAMMMMM MMMMMMPPAAMMMMMM MMMMMPPAAMMMMMMM MMMMKPAAMMMMMMMM MMMKKAAMMMMMMMMM MMMMAAMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 483 (hexagonal / fire) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMPNMMMM MMMMMMMMMPNMAAMM MMMMMMMMPNMAAMMM MMMMMMMPNMAAMMMM MMMMMMPNMAAMMMMM MMMMMPNMAAMMMMMM MMMMPNMAAMMMMMMM MMMPNMAAMMMMMMMM MMMNMAAMMMMMMMMM MMMMAAMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 484 (short / cold) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMNOMMMMM MMMMMMMMNOMMMMMM MMMMMMMDIAAMMMMM MMMMMMDIAAMMMMMM MMMMMDIAAMMMMMMM MMMMNIAAMMMMMMMM MMMNOAAMMMMMMMMM MMMMAAMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 485 (runed / sleep) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMNOMMM MMMMMMMMMMNOAAMM MMMMMMMMMDIAAMMM MMMMMMMMAIAAMMMM MMMMMMMDIAAMMMMM MMMMMMAIAAMMMMMM MMMMMDIAAMMMMMMM MMMMNIAAMMMMMMMM MMMNOAAMMMMMMMMM MMMMAAMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 486 (long / death) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMNOM MMMMMMMMMMMMNNMM MMMMMMMMMMMDIMMM MMMMMMMMMMDIAAMM MMMMMMMMMDIAAMMM MMMMMMMMDIAAMMMM MMMMMMMDIAAMMMMM MMMMMMDIAAMMMMMM MMMMMDIAAMMMMMMM MMMMDIAAMMMMMMMM MMMNIAAMMMMMMMMM MMNOAAMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 487 (curved / lightning) { MMMMMMMMMMMMMMMM MMMMMMMNOMMMMMMM MMMMMMMNOAMMMMMM MMMMMMMCIAMMMMMM MMMMMMMDIAMMMMMM MMMMMMMDIAMMMMMM MMMMMMJIKAMMMMMM MMMMMMKIJAMMMMMM MMMMMMDIAAMMMMMM MMMMMDIAAMMMMMMM MMMMNIAAMMMMMMMM MMMNOAAMMMMMMMMM MMMMAAMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 488 (octagonal / fireball) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMLMMM MMMMMMMMMMMLPMMM MMMMMMMMMMHPAAMM MMMMMMMMMLPAAMMM MMMMMMMMHPAAMMMM MMMMMMMLPAAMMMMM MMMMMMHPAAMMMMMM MMMMMLPAAMMMMMMM MMMMHPAAMMMMMMMM MMMLPAAMMMMMMMMM MMMPAAMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 489 (forked) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMNMMMMMM MMMMMMMMNMMNOMMM MMMMMMMDMMNOAAMM MMMMMMMDMDIAAMOM MMMMMMMDDIAAMOAM MMMMMMMDIIIIIAMM MMMMMMDIAAAAAMMM MMMMMDIAAMMMMMMM MMMMNIAAMMMMMMMM MMMNOAAMMMMMMMMM MMMMAAMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 490 (spiked) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMNNOMMM MMMMMMMMMMDIOMMM MMMMMMMMMDIAPMMM MMMMMMMMDIAAMMMM MMMMMMMDIAAMMMMM MMMMMMDIAAMMMMMM MMMMMDIAAMMMMMMM MMMMNIAAMMMMMMMM MMMNOAAMMMMMMMMM MMMMAAMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 491 (jeweled) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMNNBMMM MMMMMMMMMMNBBMMM MMMMMMMMMMBBBAMM MMMMMMMMMDIAAMMM MMMMMMMMDIAAMMMM MMMMMMMDIAAMMMMM MMMMMMDIAAMMMMMM MMMMMDIAAMMMMMMM MMMMNIAAMMMMMMMM MMMNOAAMMMMMMMMM MMMMAAMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 492 (gold piece) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MJKKKJMJJMMMMMMM JKCKCKJKKKJMMMMM KCKKKKKAAAKAMMMM KCKCKJAHALKAAMMM KKKKKKHLLHAHAMMM MKCJJKLHCALAMMMM MAAAJCLALHCAHAMM MMMAAKAHAHMMMMMM MMMMAAAALAHAMHAM MMMMMMHAMMMMMMMM MMMMMMMMMHAMMMMM MMMMMMMMMMMHAMMM } # tile 493 (white / dilithium crystal) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMPMMMMMMMM MMPMMMMPMMMMPMMM MMMPMMMMMMMPMMMM MMMMMONOOOMMMMMM MMMMONOOOBOMMMMM MMMNNNONONBBMMMM MMMMONOOOBOAAMMM MMMMMONOBOAAAAMM MMMMMMOOOAAAMMMM MMMMMMMOAAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 494 (white / diamond) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMPMMMMMMMM MMPMMMMPMMMMPMMM MMMPMMMMMMMPMMMM MMMMMONOOOMMMMMM MMMMONOOOBOMMMMM MMMNNNONONBBMMMM MMMMONOOOBOAAMMM MMMMMONOBOAAAAMM MMMMMMOOOAAAMMMM MMMMMMMOAAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 495 (red / ruby) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMPMMMMMMMM MMPMMMMPMMMMPMMM MMMPMMMMMMMPMMMM MMMMMDNDDDMMMMMM MMMMDNDDDKDMMMMM MMMDNDDKDCKKMMMM MMMMDCDDDKDAAMMM MMMMMDCDKDAAAAMM MMMMMMDDDAAAMMMM MMMMMMMDAAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 496 (orange / jacinth) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMPMMMMMMMM MMPMMMMPMMMMPMMM MMMPMMMMMMMPMMMM MMMMMCNCCCMMMMMM MMMMCNCCCKCMMMMM MMMCNCCKCKKKMMMM MMMMCLCCCKCAAMMM MMMMMCLCKCAAAAMM MMMMMMCCCAAAMMMM MMMMMMMCAAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 497 (blue / sapphire) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMPMMMMMMMM MMPMMMMPMMMMPMMM MMMPMMMMMMMPMMMM MMMMMBNBBBMMMMMM MMMMBNBBBEBMMMMM MMMNNNBEBEEEMMMM MMMMBNBBBEBAAMMM MMMMMBNBEBAAAAMM MMMMMMBBBAAAMMMM MMMMMMMBAAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 498 (black / black opal) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMAAAAAMMMMMM MMMMANAAAAAMMMMM MMMANAAAAAAAMMMM MMMAAAAAAAAAPMMM MMMMAAAAAAAPPPMM MMMMMMAAAPPPMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 499 (green / emerald) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMPMMMMMMMM MMPMMMMPMMMMPMMM MMMPMMMMMMMPMMMM MMMMMFGFFFMMMMMM MMMMFGFFFFFMMMMM MMMGGFGFGFFFMMMM MMMMFGFFFFFAAMMM MMMMMFGFFFAAAAMM MMMMMMFGFAAAMMMM MMMMMMMFAAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 500 (green / turquoise) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMPMMMMMMMM MMPMMMMPMMMMPMMM MMMPMMMMMMMPMMMM MMMMMFGFFFMMMMMM MMMMFGFFFFFMMMMM MMMGGFGFGFFFMMMM MMMMFGFFFFFAAMMM MMMMMFGFFFAAAAMM MMMMMMFGFAAAMMMM MMMMMMMFAAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 501 (yellow / citrine) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMPMMMMMMMM MMPMMMMPMMMMPMMM MMMPMMMMMMMPMMMM MMMMMHNHHHMMMMMM MMMMHNHHHCHMMMMM MMMHNHHCHCCCMMMM MMMMHLHHHCHAAMMM MMMMMHLHCHAAAAMM MMMMMMHHHAAAMMMM MMMMMMMHAAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 502 (green / aquamarine) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMPMMMMMMMM MMPMMMMPMMMMPMMM MMMPMMMMMMMPMMMM MMMMMFGFFFMMMMMM MMMMFGFFFFFMMMMM MMMGGFGFGFFFMMMM MMMMFGFFFFFAAMMM MMMMMFGFFFAAAAMM MMMMMMFGFAAAMMMM MMMMMMMFAAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 503 (yellowish brown / amber) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMPMMMMMMMM MMPMMMMPMMMMPMMM MMMPMMMMMMMPMMMM MMMMMKCKKKMMMMMM MMMMKCKCKKKMMMMM MMMCCCKJKJJJMMMM MMMMKCKCKJKAAMMM MMMMMKCKKKAAAAMM MMMMMMCKKAAAMMMM MMMMMMMCAAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 504 (yellowish brown / topaz) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMPMMMMMMMM MMPMMMMPMMMMPMMM MMMPMMMMMMMPMMMM MMMMMKCKKKMMMMMM MMMMKCKCKKKMMMMM MMMCCCKJKJJJMMMM MMMMKCCKCJKAAMMM MMMMMKCKJKAAAAMM MMMMMMKKCAAAMMMM MMMMMMMKAAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 505 (black / jet) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMAAAAAMMMMMM MMMMANAAAAAMMMMM MMMANAAAAAAAMMMM MMMAAAAAAAAAPMMM MMMMAAAAAAAPPPMM MMMMMMAAAPPPMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 506 (white / opal) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMPMMMMMMMM MMPMMMMPMMMMPMMM MMMPMMMMMMMPMMMM MMMMMONOOOMMMMMM MMMMONOOOBOMMMMM MMMNNNONONBBMMMM MMMMONOOOBOAAMMM MMMMMONOBOAAAAMM MMMMMMOOOAAAMMMM MMMMMMMOAAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 507 (yellow / chrysoberyl) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMPMMMMMMMM MMPMMMMPMMMMPMMM MMMPMMMMMMMPMMMM MMMMMHNHHHMMMMMM MMMMHNHHHCHMMMMM MMMHNHHCHCCCMMMM MMMMHLHHHCHAAMMM MMMMMHLHCHAAAAMM MMMMMMHHHAAAMMMM MMMMMMMHAAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 508 (red / garnet) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMPMMMMMMMM MMPMMMMPMMMMPMMM MMMPMMMMMMMPMMMM MMMMMDNDDDMMMMMM MMMMDNDDDKDMMMMM MMMDNDDKDCKKMMMM MMMMDCDDDKDAAMMM MMMMMDCDKDAAAAMM MMMMMMDDDAAAMMMM MMMMMMMDAAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 509 (violet / amethyst) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMPMMMMMMMM MMPMMMMPMMMMPMMM MMMPMMMMMMMPMMMM MMMMMINIIIMMMMMM MMMMINIIIEIMMMMM MMMNNNININEIMMMM MMMMINIIIEIAAMMM MMMMMINIEIAAAAMM MMMMMMIIIAAAMMMM MMMMMMMIAAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 510 (red / jasper) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMPMMMMMMMM MMPMMMMPMMMMPMMM MMMPMMMMMMMPMMMM MMMMMDNDDDMMMMMM MMMMDNDDDKDMMMMM MMMDNDDKDCKKMMMM MMMMDCDDDKDAAMMM MMMMMDCDKDAAAAMM MMMMMMDDDAAAMMMM MMMMMMMDAAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 511 (violet / fluorite) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMPMMMMMMMM MMPMMMMPMMMMPMMM MMMPMMMMMMMPMMMM MMMMMINIIIMMMMMM MMMMINIIIEIMMMMM MMMNNNININEIMMMM MMMMINIIIEIAAMMM MMMMMINIEIAAAAMM MMMMMMIIIAAAMMMM MMMMMMMIAAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 512 (black / obsidian) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMAAAAAMMMMMM MMMMANAAAAAMMMMM MMMANAAAAAAAMMMM MMMAAAAAAAAAPMMM MMMMAAAAAAAPPPMM MMMMMMAAAPPPMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 513 (orange / agate) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMPMMMMMMMM MMPMMMMPMMMMPMMM MMMPMMMMMMMPMMMM MMMMMCNCCCMMMMMM MMMMCNCCCKCMMMMM MMMCNCCKCKKKMMMM MMMMCLCCCKCAAMMM MMMMMCLCKCAAAAMM MMMMMMCCCAAAMMMM MMMMMMMCAAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 514 (green / jade) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMPMMMMMMMM MMPMMMMPMMMMPMMM MMMPMMMMMMMPMMMM MMMMMFGFFFMMMMMM MMMMFGFFFFFMMMMM MMMGGFGFGFFFMMMM MMMMFGFFFFFAAMMM MMMMMFGFFFAAAAMM MMMMMMFGFAAAMMMM MMMMMMMFAAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 515 (white / worthless piece of white glass) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMPMMMMMMMM MMPMMMMPMMMMPMMM MMMPMMMMMMMPMMMM MMMMMONOOOMMMMMM MMMMONOOOBOMMMMM MMMNNNONONBBMMMM MMMMONOOOBOAAMMM MMMMMONOBOAAAAMM MMMMMMOOOAAAMMMM MMMMMMMOAAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 516 (blue / worthless piece of blue glass) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMPMMMMMMMM MMPMMMMPMMMMPMMM MMMPMMMMMMMPMMMM MMMMMBNBBBMMMMMM MMMMBNBBBEBMMMMM MMMNNNBEBEEEMMMM MMMMBNBBBEBAAMMM MMMMMBNBEBAAAAMM MMMMMMBBBAAAMMMM MMMMMMMBAAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 517 (red / worthless piece of red glass) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMPMMMMMMMM MMPMMMMPMMMMPMMM MMMPMMMMMMMPMMMM MMMMMDNDDDMMMMMM MMMMDNDDDKDMMMMM MMMDNDDKDKKKMMMM MMMMDCDDDCDAAMMM MMMMMDCDKDAAAAMM MMMMMMDDDAAAMMMM MMMMMMMDAAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 518 (yellowish brown / worthless piece of yellowish brown glass) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMPMMMMMMMM MMPMMMMPMMMMPMMM MMMPMMMMMMMPMMMM MMMMMKCKKKMMMMMM MMMMKCKCKKKMMMMM MMMCCCKJKJJJMMMM MMMMKCCKCJKAAMMM MMMMMKCKJKAAAAMM MMMMMMKCKAAAMMMM MMMMMMMKAAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 519 (orange / worthless piece of orange glass) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMPMMMMMMMM MMPMMMMPMMMMPMMM MMMPMMMMMMMPMMMM MMMMMCNCCCMMMMMM MMMMCNCCCKCMMMMM MMMCNCCKCKKKMMMM MMMMCLCCCKCAAMMM MMMMMCLCKCAAAAMM MMMMMMCCCAAAMMMM MMMMMMMCAAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 520 (yellow / worthless piece of yellow glass) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMPMMMMMMMM MMPMMMMPMMMMPMMM MMMPMMMMMMMPMMMM MMMMMHNHHHMMMMMM MMMMHNHHHCHMMMMM MMMHNHHCHCCCMMMM MMMMHLHHHCHAAMMM MMMMMHLHCHAAAAMM MMMMMMHHHAAAMMMM MMMMMMMHAAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 521 (black / worthless piece of black glass) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMAAAAAMMMMMM MMMMANAAAAAMMMMM MMMANAAAAAAAMMMM MMMAAAAAAAAAPMMM MMMMAAAAAAAPPPMM MMMMMMAAAPPPMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 522 (green / worthless piece of green glass) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMPMMMMMMMM MMPMMMMPMMMMPMMM MMMPMMMMMMMPMMMM MMMMMFGFFFMMMMMM MMMMFGFFFFFMMMMM MMMGGFGFGFFFMMMM MMMMFGFFFFFAAMMM MMMMMFGFFFAAAAMM MMMMMMFGFAAAMMMM MMMMMMMFAAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 523 (violet / worthless piece of violet glass) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMPMMMMMMMM MMPMMMMPMMMMPMMM MMMPMMMMMMMPMMMM MMMMMINIIIMMMMMM MMMMINIIIEIMMMMM MMMNNNININEIMMMM MMMMINIIIEIAAMMM MMMMMINIEIAAAAMM MMMMMMIIIAAAMMMM MMMMMMMIAAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 524 (gray / luckstone) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMPPPPPMMMMMM MMMMPNPPPPPMMMMM MMMPNPPPPPPPAMMM MMPPPPPPPPPPPAAM MMPPPPPPPPPPPAAA MMMPPPPPPPPPAAAM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 525 (gray / healthstone) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMPPPPPMMMMMM MMMMPNPPPPPMMMMM MMMPNPPPPPPPAMMM MMPPPPPPPPPPPAAM MMPPPPPPPPPPPAAA MMMPPPPPPPPPAAAM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 526 (gray / loadstone) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMPPPPPMMMMMM MMMMPNPPPPPMMMMM MMMPNPPPPPPPAMMM MMPPPPPPPPPPPAAM MMPPPPPPPPPPPAAA MMMPPPPPPPPPAAAM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 527 (gray / touchstone) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMPPPPPMMMMMM MMMMPNPPPPPMMMMM MMMPNPPPPPPPAMMM MMPPPPPPPPPPPAAM MMPPPPPPPPPPPAAA MMMPPPPPPPPPAAAM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 528 (gray / whetstone) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMPPPPPMMMMMM MMMMPNPPPPPMMMMM MMMPNPPPPPPPAMMM MMPPPPPPPPPPPAAM MMPPPPPPPPPPPAAA MMMPPPPPPPPPAAAM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 529 (gray / flint) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMPPPPPMMMMMM MMMMPNPPPPPMMMMM MMMPNPPPPPPPAMMM MMPPPPPPPPPPPAAM MMPPPPPPPPPPPAAA MMMPPPPPPPPPAAAM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 530 (rock) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMKKKMMMMMMM MMMMMKLCCKMMMMMM MMMMMKCCKJAMMMMM MMMMMCKKKKAMMMMM MMMMMMCJJAAMMMMM MMMMMMMAAAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 531 (boulder) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMKKKJMMMMMM MMMMKKKCKKJJMMMM MMMKCCKKCKKJJMMM MMMKCCKKCKCKJAMM MMKCKKKCKJKKJJAM MMKKKCKKKKCKJJAA MMCJKKKCCKKKKJAA MMKKKCKKJKCKJJAA MMMCKKKCKKKKJAAA MMMJJCKKKCJJJAAM MMMMJJJKJJJJAAMM MMMMMMJJJJAAAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 532 (statue) { MMMMMMMMMMMMMMMM MMMMMMMMJJMMMMMM MMMMMMMKCJJMMMMM MMMMMMMCKJJMMMMM MMMMCKMCKJMMMMMM MMMMJJCKKJMCJMMM MMMMMJCCJJJJJMMM MMMMMJCKJJJMAAMM MMMMMMCKJMMMAAAM MMMMMMCKJAAAAAAA MMMMKCKCJAAAAAAM MMMJCCKKJAJJAAMM MMMJKCKKJJJJJAMM MMMMJJCKKJJJAAMM MMMMMJJJJJJAAMMM MMMMMMMMMMMMMMMM } # tile 533 (heavy iron ball) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMPPPMMMMMMM MMMMMPOBPPMMMMMM MMMMMPBBPMAMMMMM MMMMMPPPPMAMMMMM MMMMMMPMMAAMMMMM MMMMMMMAAAMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 534 (iron chain) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MPPMPPMPPMMMMMMM PMAPMAPMAPPMMMMM MPPAPPAPPPAPMMMM MMAAMAAMAPAPAMMM MMMMMMMMMMPAMMMM MMMMMMMMMPAPMMMM MMMMMMMMMPAPPMPM MMMMMMMMMMPMAPAP MMMMMMMMMMMPPMPA MMMMMMMMMMMMAAMM } # tile 535 (splash of venom / blinding venom) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMHHHHMMMMM MMMMMHHAAAAHHMMM MMMMHAAAAAAAHMMM MMMMHAAAAAAAHMMM MMMMHAAAAHHHMMMM MMMMMHHHHMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 536 (splash of venom / acid venom) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMHHHHMMMMM MMMMMHHGGGGHHMMM MMMMHGGGGGGGHMMM MMMMHGGGGGGGHMMM MMMMHGGGGHHHMMMM MMMMMHHHHMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/share/obj32al2.txt������������������������������������������������������������0000664�0000764�0000764�00000021153�10545462320�015626� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������__ = (0, 0, 0) _A = (128, 96, 0) _B = (128, 255, 128) _C = (0, 0, 192) _D = (168, 224, 224) _E = (96, 48, 48) _F = (128, 64, 0) _G = (32, 64, 64) _H = (0, 112, 224) _I = (192, 96, 96) _J = (48, 96, 0) _K = (117, 105, 88) _L = (224, 192, 160) _M = (168, 168, 224) _N = (128, 32, 0) _O = (96, 0, 48) _P = (64, 128, 128) _Q = (255, 128, 128) _R = (128, 0, 255) _S = (0, 64, 32) _T = (128, 0, 0) _U = (96, 192, 0) _V = (48, 36, 0) _W = (96, 192, 192) _X = (0, 32, 32) _Y = (48, 24, 0) _Z = (48, 12, 0) _a = (128, 112, 32) _b = (64, 64, 128) _c = (192, 0, 96) _d = (48, 0, 0) _e = (0, 0, 224) _f = (224, 224, 0) _g = (0, 128, 64) _h = (0, 255, 255) _i = (64, 0, 128) _j = (96, 96, 0) _k = (0, 255, 0) _l = (255, 0, 128) _m = (96, 96, 192) _n = (96, 72, 0) _o = (104, 84, 31) _p = (224, 168, 0) _q = (0, 64, 64) _r = (96, 48, 0) _s = (248, 224, 96) _t = (224, 224, 112) _u = (202, 143, 114) _v = (24, 48, 48) _w = (144, 192, 192) _x = (0, 192, 96) _y = (0, 32, 64) _z = (96, 24, 0) _0 = (128, 128, 64) _1 = (24, 24, 48) _2 = (224, 112, 0) _3 = (240, 240, 240) _4 = (128, 255, 255) _5 = (96, 0, 0) _6 = (128, 255, 0) _7 = (0, 0, 64) _8 = (96, 0, 192) _9 = (0, 145, 0) _$ = (108, 255, 0) A_ = (144, 144, 192) AA = (255, 192, 255) AB = (0, 24, 24) AC = (255, 192, 0) AD = (255, 192, 192) AE = (224, 224, 224) AF = (16, 16, 0) AG = (128, 64, 64) AH = (224, 56, 0) AI = (170, 136, 52) AJ = (16, 0, 0) AK = (224, 112, 112) AL = (0, 96, 96) AM = (208, 208, 208) AN = (64, 128, 0) AO = (255, 128, 255) AP = (255, 128, 0) AQ = (224, 168, 224) AR = (224, 0, 0) AS = (128, 0, 64) AT = (255, 108, 0) AU = (192, 192, 255) AV = (192, 192, 0) AW = (0, 48, 96) AX = (255, 255, 128) AY = (192, 192, 192) AZ = (168, 224, 168) Aa = (128, 128, 96) Ab = (112, 224, 0) Ac = (64, 64, 0) Ad = (127, 90, 72) Ae = (224, 112, 224) Af = (48, 48, 24) Ag = (255, 64, 0) Ah = (64, 48, 0) Ai = (192, 144, 0) Aj = (176, 176, 176) Ak = (0, 0, 96) Al = (128, 96, 96) Am = (192, 144, 192) An = (48, 24, 24) Ao = (64, 32, 0) Ap = (224, 0, 112) Aq = (0, 128, 128) Ar = (64, 16, 0) As = (144, 192, 144) At = (160, 160, 160) Au = (64, 0, 0) Av = (192, 96, 0) Aw = (255, 0, 255) Ax = (24, 24, 0) Ay = (255, 0, 0) Az = (192, 96, 192) A0 = (112, 224, 112) A1 = (48, 96, 96) A2 = (145, 71, 0) A3 = (0, 16, 16) A4 = (120, 160, 160) A5 = (24, 0, 0) A6 = (0, 0, 16) A7 = (182, 71, 0) A8 = (160, 160, 120) A9 = (160, 120, 160) A$ = (144, 144, 144) B_ = (0, 64, 128) BA = (192, 48, 0) BB = (80, 160, 160) BC = (224, 0, 224) BD = (48, 48, 96) BE = (120, 160, 120) BF = (120, 120, 160) BG = (96, 192, 96) BH = (160, 160, 80) BI = (160, 120, 120) BJ = (160, 80, 160) BK = (128, 128, 128) BL = (0, 96, 48) BM = (64, 64, 32) BN = (112, 224, 224) BO = (192, 0, 0) BP = (192, 0, 192) BQ = (0, 160, 160) BR = (0, 0, 128) BS = (71, 108, 108) BT = (128, 96, 128) BU = (112, 112, 112) BV = (64, 32, 32) BW = (80, 160, 80) BX = (80, 80, 160) BY = (96, 128, 96) BZ = (0, 48, 48) Ba = (192, 192, 144) Bb = (32, 64, 0) Bc = (128, 64, 128) Bd = (160, 160, 0) Be = (160, 80, 80) Bf = (64, 0, 32) Bg = (160, 0, 160) Bh = (96, 96, 96) Bi = (252, 252, 153) Bj = (32, 32, 0) Bk = (0, 160, 80) Bl = (64, 128, 64) Bm = (160, 120, 0) Bn = (0, 0, 48) Bo = (0, 80, 160) Bp = (192, 144, 144) Bq = (0, 224, 0) Br = (80, 160, 0) Bs = (112, 112, 224) Bt = (80, 80, 80) Bu = (32, 0, 0) Bv = (128, 0, 128) Bw = (80, 0, 160) Bx = (255, 255, 255) By = (96, 48, 96) Bz = (242, 196, 77) B0 = (208, 168, 80) B1 = (255, 255, 0) B2 = (255, 255, 192) B3 = (0, 192, 0) B4 = (160, 80, 0) B5 = (0, 182, 255) B6 = (160, 0, 80) B7 = (0, 192, 192) B8 = (165, 118, 94) B9 = (48, 96, 48) B$ = (64, 64, 64) C_ = (192, 160, 64) CA = (218, 218, 182) CB = (224, 224, 168) CC = (0, 160, 0) CD = (96, 0, 96) CE = (160, 40, 0) CF = (0, 0, 160) CG = (0, 224, 112) CH = (64, 32, 64) CI = (0, 128, 255) CJ = (0, 128, 0) CK = (96, 128, 128) CL = (48, 48, 48) CM = (229, 162, 130) CN = (32, 64, 32) CO = (192, 255, 255) CP = (171, 154, 129) CQ = (160, 0, 0) CR = (224, 168, 168) CS = (145, 135, 110) CT = (64, 0, 64) CU = (192, 255, 192) CV = (112, 0, 224) CW = (0, 96, 0) CX = (96, 96, 128) CY = (0, 255, 128) CZ = (0, 96, 192) Ca = (255, 211, 175) Cb = (32, 32, 32) Cc = (48, 0, 48) Cd = (0, 64, 0) Ce = (0, 224, 224) Cf = (32, 0, 32) Cg = (0, 48, 0) Ch = (192, 192, 96) Ci = (16, 16, 16) Cj = (128, 128, 255) Ck = (0, 32, 0) Cl = (128, 128, 0) Cm = (255, 182, 145) Cn = (16, 0, 16) Co = (0, 24, 0) Cp = (96, 96, 48) Cq = (108, 145, 182) Cr = (0, 16, 0) Cs = (0, 0, 255) # tile 730 (velvet / drain life) { AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAw_cBgB6AwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwB6BJ_cB6Bg_cAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAw_cBgB6_cBJ_cBeBg_cAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAw_cBJB6_cBg_cBg_c_cBc_cBvAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAw_cBv_c_cBcB6BJ_cBeBg_cBc_cBg_cAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAw_cBJ_cBc_cBg_c_cBg_c_cBcAp_cBc_cBvAwAwAwAwAw AwAwAwAwAwAwAwAwAw_cBgB6Bg_cBcB6BgBeBg_cBc_cBg_cBvApBeBg_cAwAwAw AwAwAwAwAwAwAwAwB6BJ_c_cBc_c_c_cBcApB6Bc_cBg_I_cBc_cBg_cBc_cAwAw AwAwAwAwAwAwAwB6Bg_c_cBc_c_cBJ_cBg_cBvApBv_c_cBv_c_cBJB6ApBvASAw AwAwAwAwAwAw_cBJB6Bc_cBg_cBv_cBgBe_cBc_cBJ_cBcApBgB6_cBgBe_cBcAw AwAwAwAwAwBc_cBg_c_cBv_cBJ_cBc_c_cBg_cBg_c_cBvB6BJ_cBc_cB6BvAS__ AwAwAwAwB6_cBg_IBg_cBJ_cB6Bg_cBc_cBJ_cB6BJ_c_cBc_c_cBv_cByB6ByAJ AwAwAwBg_cBc_cApBc_cB6_cBgBeB6Bg_c_cBgB6_cBcBg_c_cBvBmBcB6CDAS__ AwAw_c_cBJ_cBgB6_cBgBc_c_cBg_cBc_cBc_cBc_c_c_cBJB6_cBy_FASBy____ Aw_cBJBgB6_cBc_cBJ_c_c_cBJ_cBcB6ApBv_c_cBc_cBv_cBcBvB6_AAS____Aw B6BgB6_cBc_c_cBgB6BvBJ_c_cBv_cBgBe_cBg_cBg_cBc_cB6ASBy_rA6__AwAw Bg_cBeBg_cB6Bg_cBJ_c_c_cBc_cBc_c_cBJ_cBc_cBcB6B6ByBvAS____AwAwAw Aw_cBg_cBJ_cBc_c_cBg_cBc_cBg_cBvApBg_c_cBv_cBvAGB6_OA3__AwAwAwAw AwA$As_c_cBv_c_cBJ_cBc_cBg_c_cBc_cBc_cBc_cAGBvASCD____AwAwAwAwAw AwAtAtA$A$_cBc_c_cBv_c_cBc_cBJ_c_cBg_cBvB6BvASBy____AwAwAwAwAwAw AwAjAjAtAtA$A$_cBc_cBc_cBg_cB6Bg_cBc_cAGB6ByAS____AwAwAwAwAwAwAw B6AjAtAjAjAtAtA$A$_cBg_cBc_cBJ_c_cBgASBvASASCr__AwAwAwAwAwAwAwAw A3_cBvAjAjAtAjA$AtA$A$Bc_c_c_cBc_cByB6AGCDCr__AwAwAwAwAwAwAwAwAw AwCrCrB6BvAjAjAjAjA$AtA$A$Bv_cBvB6B6ByAS____AwAwAwAwAwAwAwAwAwAw AwAwAw__AxBvB6AtAjAjAjA$AtA$BcB6BcASCD____AwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAFA3_cBvAjAjAjAjAt_cASASCDAF__AwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwCrA3B6B6AjAtAtBvASBy____AwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwA3__B6_cA4ASByAJ__AwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwA3A3ASAS____AwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwCrA6__AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw } # tile 786 (gold piece) { AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwB1B1BiAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwB1B1BiAwACACACAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwACACACB1B1BiB1B1BiAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwB1B1Bi_p_pACACACACACB1____AwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwACACACB1B1B2_pB1B1B2B1Bi____AwAwAwAwAwAwAwAw AwAwAwAwAwAwAwB1B1Bi__B1B1B2ACAC_pACAC_fACAC_pA6__B1B1BiAwAwAwAw AwAwAwAwAwAwAwACACACA6AC_fACB1B1B2B1B1BiB1B1B2____ACACAC__AwAwAw AwAwAwAwAwAwAwAwCrCrB1B1Bi_pACACACACACB1ACACACCr____AwCr__AwAwAw AwAwAwAwAwAwAwAwAwAwACACACA6B1B1B2B1B1B2____Cr__AwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwCrCr__ACACACACACACCr____B1B1BiAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwCrCrCrCrCr__AwAwAC_fAC__AwAwAwAwAw AwAwAwAwAwAwAwB1B1Bi__AwAwAwAwAwAwAwAwAwAwAwAwAwAJ____AwAwAwAwAw AwAwAwAwAwAwAwACACAC__AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwCrCr__AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw AwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAwAw } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/share/monsters.map������������������������������������������������������������0000664�0000764�0000764�00000065750�10545462320�016133� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������tile 0 "monster, ant or other insect, giant ant" tile 1 "monster, ant or other insect, giant tick" tile 2 "monster, ant or other insect, killer bee" tile 3 "monster, ant or other insect, giant flea" tile 4 "monster, ant or other insect, soldier ant" tile 5 "monster, ant or other insect, fire ant" tile 6 "monster, ant or other insect, snow ant" tile 7 "monster, ant or other insect, giant beetle" tile 8 "monster, ant or other insect, giant louse" tile 9 "monster, ant or other insect, tsetse fly" tile 10 "monster, ant or other insect, migo drone" tile 11 "monster, ant or other insect, queen bee" tile 12 "monster, ant or other insect, yellow jacket" tile 13 "monster, ant or other insect, black wasp" tile 14 "monster, ant or other insect, migo warrior" tile 15 "monster, ant or other insect, giant wasp" tile 16 "monster, ant or other insect, spitting beetle" tile 17 "monster, ant or other insect, migo queen" tile 18 "monster, ant or other insect, assassin bug" tile 19 "monster, ant or other insect, killer beetle" tile 20 "monster, blob, acid blob" tile 21 "monster, blob, quivering blob" tile 22 "monster, blob, gelatinous cube" tile 23 "monster, blob, jiggling blob" tile 24 "monster, blob, lava blob" tile 25 "monster, blob, static blob" tile 26 "monster, blob, burbling blob" tile 27 "monster, cockatrice, chicken" tile 28 "monster, cockatrice, cockatoo" tile 29 "monster, cockatrice, chickatrice" tile 30 "monster, cockatrice, cockatrice" tile 31 "monster, cockatrice, pyrolisk" tile 32 "monster, cockatrice, parrot" tile 33 "monster, dog or other canine, jackal" tile 34 "monster, dog or other canine, fox" tile 35 "monster, dog or other canine, coyote" tile 36 "monster, dog or other canine, werejackal" tile 37 "monster, dog or other canine, little dog" tile 38 "monster, dog or other canine, dog" tile 39 "monster, dog or other canine, large dog" tile 40 "monster, dog or other canine, pit bull" tile 41 "monster, dog or other canine, dingo puppy" tile 42 "monster, dog or other canine, dingo" tile 43 "monster, dog or other canine, large dingo" tile 44 "monster, dog or other canine, wolf" tile 45 "monster, dog or other canine, death dog" tile 46 "monster, dog or other canine, rabid wolf" tile 47 "monster, dog or other canine, werewolf" tile 48 "monster, dog or other canine, warg" tile 49 "monster, dog or other canine, winter wolf cub" tile 50 "monster, dog or other canine, winter wolf" tile 51 "monster, dog or other canine, hell hound pup" tile 52 "monster, dog or other canine, wolverine" tile 53 "monster, dog or other canine, shadow wolf" tile 54 "monster, dog or other canine, mist wolf" tile 55 "monster, dog or other canine, hell hound" tile 56 "monster, dog or other canine, Cerberus" tile 57 "monster, eye or sphere, gas spore" tile 58 "monster, eye or sphere, floating eye" tile 59 "monster, eye or sphere, glowing eye" tile 60 "monster, eye or sphere, freezing sphere" tile 61 "monster, eye or sphere, flaming sphere" tile 62 "monster, eye or sphere, shocking sphere" tile 63 "monster, eye or sphere, bloodshot eye" tile 64 "monster, eye or sphere, blinking eye" tile 65 "monster, cat or other feline, kitten" tile 66 "monster, cat or other feline, housecat" tile 67 "monster, cat or other feline, jaguar" tile 68 "monster, cat or other feline, lynx" tile 69 "monster, cat or other feline, panther" tile 70 "monster, cat or other feline, werepanther" tile 71 "monster, cat or other feline, large cat" tile 72 "monster, cat or other feline, kamadan" tile 73 "monster, cat or other feline, displacer beast" tile 74 "monster, cat or other feline, caterwaul" tile 75 "monster, cat or other feline, tiger" tile 76 "monster, cat or other feline, weretiger" tile 77 "monster, cat or other feline, sabre-toothed cat" tile 78 "monster, cat or other feline, hellcat" tile 79 "monster, gremlin, gremlin" tile 80 "monster, gremlin, gargoyle" tile 81 "monster, gremlin, winged gargoyle" tile 82 "monster, gremlin, statue gargoyle" tile 83 "monster, humanoid, hobbit" tile 84 "monster, humanoid, dwarf" tile 85 "monster, humanoid, dwarf thief" tile 86 "monster, humanoid, bugbear" tile 87 "monster, humanoid, dwarf lord" tile 88 "monster, humanoid, dwarf king" tile 89 "monster, humanoid, duergar" tile 90 "monster, humanoid, deep one" tile 91 "monster, humanoid, mind flayer" tile 92 "monster, humanoid, master mind flayer" tile 93 "monster, humanoid, deeper one" tile 94 "monster, humanoid, deepest one" tile 95 "monster, imp or minor demon, manes" tile 96 "monster, imp or minor demon, homunculus" tile 97 "monster, imp or minor demon, dretch" tile 98 "monster, imp or minor demon, imp" tile 99 "monster, imp or minor demon, lemure" tile 100 "monster, imp or minor demon, quasit" tile 101 "monster, imp or minor demon, rutterkin" tile 102 "monster, imp or minor demon, tengu" tile 103 "monster, imp or minor demon, nupperibo" tile 104 "monster, imp or minor demon, blood imp" tile 105 "monster, jelly, blue jelly" tile 106 "monster, jelly, spotted jelly" tile 107 "monster, jelly, clear jelly" tile 108 "monster, jelly, ochre jelly" tile 109 "monster, jelly, yellow jelly" tile 110 "monster, jelly, orange jelly" tile 111 "monster, jelly, rancid jelly" tile 112 "monster, kobold, kobold" tile 113 "monster, kobold, large kobold" tile 114 "monster, kobold, kobold lord" tile 115 "monster, kobold, kobold shaman" tile 116 "monster, kobold, swamp kobold" tile 117 "monster, kobold, rock kobold" tile 118 "monster, kobold, kobold warrior" tile 119 "monster, kobold, Kroo the Kobold King" tile 120 "monster, leprechaun, leprechaun" tile 121 "monster, leprechaun, leprechaun wizard" tile 122 "monster, mimic, small mimic" tile 123 "monster, mimic, large mimic" tile 124 "monster, mimic, giant mimic" tile 125 "monster, nymph, wood nymph" tile 126 "monster, nymph, water nymph" tile 127 "monster, nymph, mountain nymph" tile 128 "monster, nymph, pixie" tile 129 "monster, nymph, brownie" tile 130 "monster, nymph, quickling" tile 131 "monster, nymph, Aphrodite" tile 132 "monster, orc, goblin" tile 133 "monster, orc, hobgoblin" tile 134 "monster, orc, orc" tile 135 "monster, orc, hill orc" tile 136 "monster, orc, Mordor orc" tile 137 "monster, orc, Uruk-hai" tile 138 "monster, orc, orc shaman" tile 139 "monster, orc, orc-captain" tile 140 "monster, orc, war orc" tile 141 "monster, orc, great orc" tile 142 "monster, orc, Grund the Orc King" tile 143 "monster, orc, snow orc" tile 144 "monster, orc, demon orc" tile 145 "monster, piercer, rock piercer" tile 146 "monster, piercer, iron piercer" tile 147 "monster, piercer, glass piercer" tile 148 "monster, quadruped, lamb" tile 149 "monster, quadruped, rothe" tile 150 "monster, quadruped, giant badger" tile 151 "monster, quadruped, scramper" tile 152 "monster, quadruped, sheep" tile 153 "monster, quadruped, goat" tile 154 "monster, quadruped, squealer" tile 155 "monster, quadruped, mumak" tile 156 "monster, quadruped, leocrotta" tile 157 "monster, quadruped, cow" tile 158 "monster, quadruped, mangler" tile 159 "monster, quadruped, wumpus" tile 160 "monster, quadruped, bull" tile 161 "monster, quadruped, titanothere" tile 162 "monster, quadruped, baluchitherium" tile 163 "monster, quadruped, mastodon" tile 164 "monster, quadruped, Jumbo the Elephant" tile 165 "monster, quadruped, juggernaut" tile 166 "monster, quadruped, catoblepas" tile 167 "monster, rodent, sewer rat" tile 168 "monster, rodent, rabbit" tile 169 "monster, rodent, black rat" tile 170 "monster, rodent, giant rat" tile 171 "monster, rodent, rabid rat" tile 172 "monster, rodent, rabid rabbit" tile 173 "monster, rodent, pack rat" tile 174 "monster, rodent, wererat" tile 175 "monster, rodent, rock mole" tile 176 "monster, rodent, woodchuck" tile 177 "monster, rodent, hellrat" tile 178 "monster, rodent, the Rat King" tile 179 "monster, spider, cave spider" tile 180 "monster, spider, centipede" tile 181 "monster, spider, recluse spider" tile 182 "monster, spider, giant spider" tile 183 "monster, spider, barking spider" tile 184 "monster, spider, scorpion" tile 185 "monster, spider, carrion crawler" tile 186 "monster, spider, nickelpede" tile 187 "monster, spider, giant scorpion" tile 188 "monster, spider, Girtab" tile 189 "monster, spider, Shelob" tile 190 "monster, spider, phase spider" tile 191 "monster, spider, werespider" tile 192 "monster, trapper or lurker above, lurker above" tile 193 "monster, trapper or lurker above, trapper" tile 194 "monster, unicorn or horse, white unicorn" tile 195 "monster, unicorn or horse, gray unicorn" tile 196 "monster, unicorn or horse, black unicorn" tile 197 "monster, unicorn or horse, pony" tile 198 "monster, unicorn or horse, horse" tile 199 "monster, unicorn or horse, warhorse" tile 200 "monster, unicorn or horse, Pegasus" tile 201 "monster, vortex, fog cloud" tile 202 "monster, vortex, dust vortex" tile 203 "monster, vortex, ice vortex" tile 204 "monster, vortex, energy vortex" tile 205 "monster, vortex, steam vortex" tile 206 "monster, vortex, fire vortex" tile 207 "monster, worm, larva" tile 208 "monster, worm, maggot" tile 209 "monster, worm, dung worm" tile 210 "monster, worm, acid worm" tile 211 "monster, worm, bloodworm" tile 212 "monster, worm, tunnel worm" tile 213 "monster, worm, baby long worm" tile 214 "monster, worm, baby purple worm" tile 215 "monster, worm, long worm" tile 216 "monster, worm, purple worm" tile 217 "monster, worm, rot worm" tile 218 "monster, xan or other mythical\/fantastic insect, grid bug" tile 219 "monster, xan or other mythical\/fantastic insect, spark bug" tile 220 "monster, xan or other mythical\/fantastic insect, arc bug" tile 221 "monster, xan or other mythical\/fantastic insect, lightning bug" tile 222 "monster, xan or other mythical\/fantastic insect, xan" tile 223 "monster, light, yellow light" tile 224 "monster, light, black light" tile 225 "monster, yeti\, ape or other large beast, zruty" tile 226 "monster, Zouthern animal, echidna" tile 227 "monster, Zouthern animal, platypus" tile 228 "monster, Zouthern animal, koala" tile 229 "monster, Zouthern animal, wombat" tile 230 "monster, Zouthern animal, Tasmanian devil" tile 231 "monster, Zouthern animal, wallaby" tile 232 "monster, Zouthern animal, wallaroo" tile 233 "monster, Zouthern animal, kangaroo" tile 234 "monster, angelic being, couatl" tile 235 "monster, angelic being, Aleax" tile 236 "monster, angelic being, movanic deva" tile 237 "monster, angelic being, monadic deva" tile 238 "monster, angelic being, astral deva" tile 239 "monster, angelic being, Angel" tile 240 "monster, angelic being, ki-rin" tile 241 "monster, angelic being, Archon" tile 242 "monster, angelic being, Planetar" tile 243 "monster, angelic being, Solar" tile 244 "monster, bat or bird, bat" tile 245 "monster, bat or bird, giant bat" tile 246 "monster, bat or bird, rhumbat" tile 247 "monster, bat or bird, athol" tile 248 "monster, bat or bird, raven" tile 249 "monster, bat or bird, vampire bat" tile 250 "monster, bat or bird, hellbat" tile 251 "monster, bat or bird, mongbat" tile 252 "monster, bat or bird, mobat" tile 253 "monster, bat or bird, harpy" tile 254 "monster, bat or bird, byakhee" tile 255 "monster, bat or bird, nightgaunt" tile 256 "monster, centaur, plains centaur" tile 257 "monster, centaur, forest centaur" tile 258 "monster, centaur, mountain centaur" tile 259 "monster, dragon, baby gray dragon" tile 260 "monster, dragon, baby silver dragon" tile 261 "monster, dragon, baby shimmering dragon" tile 262 "monster, dragon, baby deep dragon" tile 263 "monster, dragon, baby red dragon" tile 264 "monster, dragon, baby white dragon" tile 265 "monster, dragon, baby orange dragon" tile 266 "monster, dragon, baby black dragon" tile 267 "monster, dragon, baby blue dragon" tile 268 "monster, dragon, baby green dragon" tile 269 "monster, dragon, baby yellow dragon" tile 270 "monster, dragon, gray dragon" tile 271 "monster, dragon, silver dragon" tile 272 "monster, dragon, shimmering dragon" tile 273 "monster, dragon, deep dragon" tile 274 "monster, dragon, red dragon" tile 275 "monster, dragon, white dragon" tile 276 "monster, dragon, orange dragon" tile 277 "monster, dragon, black dragon" tile 278 "monster, dragon, blue dragon" tile 279 "monster, dragon, green dragon" tile 280 "monster, dragon, yellow dragon" tile 281 "monster, dragon, wyvern" tile 282 "monster, dragon, hydra" tile 283 "monster, elemental, stalker" tile 284 "monster, elemental, air elemental" tile 285 "monster, elemental, fire elemental" tile 286 "monster, elemental, earth elemental" tile 287 "monster, elemental, water elemental" tile 288 "monster, fungus or mold, lichen" tile 289 "monster, fungus or mold, brown mold" tile 290 "monster, fungus or mold, yellow mold" tile 291 "monster, fungus or mold, green mold" tile 292 "monster, fungus or mold, red mold" tile 293 "monster, fungus or mold, shrieker" tile 294 "monster, fungus or mold, violet fungus" tile 295 "monster, fungus or mold, disgusting mold" tile 296 "monster, fungus or mold, black mold" tile 297 "monster, gnome, gnome" tile 298 "monster, gnome, gnome thief" tile 299 "monster, gnome, gnome lord" tile 300 "monster, gnome, gnomish wizard" tile 301 "monster, gnome, deep gnome" tile 302 "monster, gnome, gnome warrior" tile 303 "monster, gnome, Ruggo the Gnome King" tile 304 "monster, gnome, gnome king" tile 305 "monster, gnome, gnoll" tile 306 "monster, gnome, gnoll warrior" tile 307 "monster, gnome, gnoll chieftain" tile 308 "monster, gnome, gnoll shaman" tile 309 "monster, giant humanoid, giant" tile 310 "monster, giant humanoid, stone giant" tile 311 "monster, giant humanoid, hill giant" tile 312 "monster, giant humanoid, fire giant" tile 313 "monster, giant humanoid, frost giant" tile 314 "monster, giant humanoid, ettin" tile 315 "monster, giant humanoid, titan" tile 316 "monster, giant humanoid, storm giant" tile 317 "monster, giant humanoid, minotaur" tile 318 "monster, giant humanoid, the Largest Giant" tile 319 "monster, giant humanoid, Father Dagon" tile 320 "monster, giant humanoid, Mother Hydra" tile 321 "monster, jabberwock, jabberwock" tile 322 "monster, jabberwock, vorpal jabberwock" tile 323 "monster, Keystone Kop, Keystone Kop" tile 324 "monster, Keystone Kop, Kop Sergeant" tile 325 "monster, Keystone Kop, Kop Lieutenant" tile 326 "monster, Keystone Kop, Kop Kaptain" tile 327 "monster, lich, lich" tile 328 "monster, lich, demilich" tile 329 "monster, lich, master lich" tile 330 "monster, lich, arch-lich" tile 331 "monster, mummy, kobold mummy" tile 332 "monster, mummy, gnome mummy" tile 333 "monster, mummy, orc mummy" tile 334 "monster, mummy, dwarf mummy" tile 335 "monster, mummy, elf mummy" tile 336 "monster, mummy, human mummy" tile 337 "monster, mummy, ettin mummy" tile 338 "monster, mummy, giant mummy" tile 339 "monster, mummy, troll mummy" tile 340 "monster, naga, red naga hatchling" tile 341 "monster, naga, black naga hatchling" tile 342 "monster, naga, golden naga hatchling" tile 343 "monster, naga, guardian naga hatchling" tile 344 "monster, naga, red naga" tile 345 "monster, naga, black naga" tile 346 "monster, naga, golden naga" tile 347 "monster, naga, guardian naga" tile 348 "monster, ogre, ogre" tile 349 "monster, ogre, ogre lord" tile 350 "monster, ogre, ogre mage" tile 351 "monster, ogre, ogre king" tile 352 "monster, ogre, shadow ogre" tile 353 "monster, pudding or ooze, gray ooze" tile 354 "monster, pudding or ooze, brown pudding" tile 355 "monster, pudding or ooze, moldy pudding" tile 356 "monster, pudding or ooze, black pudding" tile 357 "monster, pudding or ooze, green slime" tile 358 "monster, pudding or ooze, shoggoth" tile 359 "monster, pudding or ooze, giant shoggoth" tile 360 "monster, quantum mechanic or other scientist, quantum mechanic" tile 361 "monster, quantum mechanic or other scientist, genetic engineer" tile 362 "monster, quantum mechanic or other scientist, Doctor Frankenstein" tile 363 "monster, rust monster or disenchanter, rust monster" tile 364 "monster, rust monster or disenchanter, disenchanter" tile 365 "monster, snake, garter snake" tile 366 "monster, snake, snake" tile 367 "monster, snake, water moccasin" tile 368 "monster, snake, pit viper" tile 369 "monster, snake, python" tile 370 "monster, snake, cobra" tile 371 "monster, snake, king cobra" tile 372 "monster, snake, weresnake" tile 373 "monster, snake, asphynx" tile 374 "monster, troll, troll" tile 375 "monster, troll, ice troll" tile 376 "monster, troll, rock troll" tile 377 "monster, troll, two-headed troll" tile 378 "monster, troll, water troll" tile 379 "monster, troll, Olog-hai" tile 380 "monster, troll, black troll" tile 381 "monster, umber hulk, umber hulk" tile 382 "monster, umber hulk, water hulk" tile 383 "monster, vampire, vampire" tile 384 "monster, vampire, vampire lord" tile 385 "monster, vampire, fire vampire" tile 386 "monster, vampire, star vampire" tile 387 "monster, vampire, vampire mage" tile 388 "monster, vampire, Vlad the Impaler" tile 389 "monster, wraith, barrow wight" tile 390 "monster, wraith, wight" tile 391 "monster, wraith, wraith" tile 392 "monster, wraith, Nazgul" tile 393 "monster, xorn, xorn" tile 394 "monster, yeti\, ape or other large beast, monkey" tile 395 "monster, yeti\, ape or other large beast, ape" tile 396 "monster, yeti\, ape or other large beast, owlbear" tile 397 "monster, yeti\, ape or other large beast, yeti" tile 398 "monster, yeti\, ape or other large beast, carnivorous ape" tile 399 "monster, yeti\, ape or other large beast, sasquatch" tile 400 "monster, yeti\, ape or other large beast, zruty" tile 401 "monster, zombie, kobold zombie" tile 402 "monster, zombie, gnome zombie" tile 403 "monster, zombie, orc zombie" tile 404 "monster, zombie, dwarf zombie" tile 405 "monster, zombie, elf zombie" tile 406 "monster, zombie, human zombie" tile 407 "monster, zombie, ghoul" tile 408 "monster, zombie, ghoul mage" tile 409 "monster, zombie, ettin zombie" tile 410 "monster, zombie, ghast" tile 411 "monster, zombie, giant zombie" tile 412 "monster, zombie, skeleton" tile 413 "monster, zombie, ghoul queen" tile 414 "monster, zombie, gug" tile 415 "monster, golem, straw golem" tile 416 "monster, golem, paper golem" tile 417 "monster, golem, wax golem" tile 418 "monster, golem, plastic golem" tile 419 "monster, golem, rope golem" tile 420 "monster, golem, gold golem" tile 421 "monster, golem, leather golem" tile 422 "monster, golem, wood golem" tile 423 "monster, golem, flesh golem" tile 424 "monster, golem, clay golem" tile 425 "monster, golem, stone golem" tile 426 "monster, golem, glass golem" tile 427 "monster, golem, iron golem" tile 428 "monster, golem, Frankenstein's Monster" tile 429 "monster, golem, ruby golem" tile 430 "monster, golem, diamond golem" tile 431 "monster, golem, sapphire golem" tile 432 "monster, golem, steel golem" tile 433 "monster, golem, crystal golem" tile 434 "monster, human or elf, human" tile 435 "monster, human or elf, wererat" tile 436 "monster, human or elf, werejackal" tile 437 "monster, human or elf, werewolf" tile 438 "monster, human or elf, werepanther" tile 439 "monster, human or elf, weretiger" tile 440 "monster, human or elf, weresnake" tile 441 "monster, human or elf, werespider" tile 442 "monster, human or elf, gibberling" tile 443 "monster, human or elf, grimlock" tile 444 "monster, human or elf, elf" tile 445 "monster, human or elf, Woodland-elf" tile 446 "monster, human or elf, Green-elf" tile 447 "monster, human or elf, Grey-elf" tile 448 "monster, human or elf, High-elf" tile 449 "monster, human or elf, elf-lord" tile 450 "monster, human or elf, drow" tile 451 "monster, human or elf, Elvenking" tile 452 "monster, human or elf, doppelganger" tile 453 "monster, human or elf, mugger" tile 454 "monster, human or elf, nurse" tile 455 "monster, human or elf, gypsy" tile 456 "monster, human or elf, shopkeeper" tile 457 "monster, human or elf, black marketeer" tile 458 "monster, human or elf, guard" tile 459 "monster, human or elf, prisoner" tile 460 "monster, human or elf, Oracle" tile 461 "monster, human or elf, aligned priest" tile 462 "monster, human or elf, high priest" tile 463 "monster, human or elf, soldier" tile 464 "monster, human or elf, sergeant" tile 465 "monster, human or elf, lieutenant" tile 466 "monster, human or elf, captain" tile 467 "monster, human or elf, watchman" tile 468 "monster, human or elf, watch captain" tile 469 "monster, human or elf, Medusa" tile 470 "monster, human or elf, Wizard of Yendor" tile 471 "monster, human or elf, Croesus" tile 472 "monster, human or elf, Charon" tile 473 "monster, ghost, shadow" tile 474 "monster, ghost, ghost" tile 475 "monster, ghost, shade" tile 476 "monster, major demon, water demon" tile 477 "monster, major demon, horned devil" tile 478 "monster, major demon, spined devil" tile 479 "monster, major demon, bearded devil" tile 480 "monster, major demon, succubus" tile 481 "monster, major demon, incubus" tile 482 "monster, major demon, erinys" tile 483 "monster, major demon, barbed devil" tile 484 "monster, major demon, marilith" tile 485 "monster, major demon, bar-lgura" tile 486 "monster, major demon, chasme" tile 487 "monster, major demon, vrock" tile 488 "monster, major demon, babau" tile 489 "monster, major demon, hezrou" tile 490 "monster, major demon, bone devil" tile 491 "monster, major demon, ice devil" tile 492 "monster, major demon, nalfeshnee" tile 493 "monster, major demon, nabassu" tile 494 "monster, major demon, pit fiend" tile 495 "monster, major demon, balrog" tile 496 "monster, major demon, Juiblex" tile 497 "monster, major demon, Yeenoghu" tile 498 "monster, major demon, Orcus" tile 499 "monster, major demon, Geryon" tile 500 "monster, major demon, Dispater" tile 501 "monster, major demon, Baalzebub" tile 502 "monster, major demon, Asmodeus" tile 503 "monster, major demon, Demogorgon" tile 504 "monster, major demon, Cthulhu" tile 505 "monster, major demon, Death" tile 506 "monster, major demon, Pestilence" tile 507 "monster, major demon, Famine" tile 508 "monster, major demon, mail daemon" tile 509 "monster, major demon, djinni" tile 510 "monster, major demon, efreeti" tile 511 "monster, major demon, dao" tile 512 "monster, major demon, marid" tile 513 "monster, major demon, sandestin" tile 514 "monster, sea monster, jellyfish" tile 515 "monster, sea monster, piranha" tile 516 "monster, sea monster, giant eel" tile 517 "monster, sea monster, shark" tile 518 "monster, sea monster, giant crab" tile 519 "monster, sea monster, electric eel" tile 520 "monster, sea monster, kraken" tile 521 "monster, lizard, newt" tile 522 "monster, lizard, gecko" tile 523 "monster, lizard, iguana" tile 524 "monster, lizard, baby crocodile" tile 525 "monster, lizard, lizard" tile 526 "monster, lizard, gila monster" tile 527 "monster, lizard, chameleon" tile 528 "monster, lizard, crocodile" tile 529 "monster, lizard, salamander" tile 530 "monster, lizard, rhaumbusun" tile 531 "monster, lizard, basilisk" tile 532 "monster, lizard, komodo dragon" tile 533 "monster, piece of food, bad egg" tile 534 "monster, piece of food, killer tripe ration" tile 535 "monster, piece of food, killer food ration" tile 536 "monster, pile of coins, pile of killer coins" tile 537 "monster, pile of coins, large pile of killer coins" tile 538 "monster, pile of coins, huge pile of killer coins" tile 539 "monster, long worm tail, long worm tail" tile 540 "monster, unicorn or horse, Nightmare" tile 541 "monster, eye or sphere, Beholder" tile 542 "monster, lich, Vecna" tile 543 "monster, human or elf, archeologist" tile 544 "monster, human or elf, barbarian" tile 545 "monster, human or elf, caveman" tile 546 "monster, human or elf, cavewoman" tile 547 "monster, human or elf, flame mage" tile 548 "monster, human or elf, healer" tile 549 "monster, human or elf, ice mage" tile 550 "monster, human or elf, knight" tile 551 "monster, human or elf, monk" tile 552 "monster, human or elf, necromancer" tile 553 "monster, human or elf, priest" tile 554 "monster, human or elf, priestess" tile 555 "monster, human or elf, ranger" tile 556 "monster, human or elf, rogue" tile 557 "monster, human or elf, samurai" tile 558 "monster, human or elf, tourist" tile 559 "monster, human or elf, undead slayer" tile 560 "monster, human or elf, valkyrie" tile 561 "monster, human or elf, yeoman" tile 562 "monster, human or elf, wizard" tile 563 "monster, human or elf, Lord Carnarvon" tile 564 "monster, human or elf, Pelias" tile 565 "monster, human or elf, Shaman Karnov" tile 566 "monster, human or elf, Master Shifter" tile 567 "monster, humanoid, Thorin" tile 568 "monster, human or elf, Earendil" tile 569 "monster, human or elf, Elwing" tile 570 "monster, human or elf, High Flame Mage" tile 571 "monster, human or elf, Hippocrates" tile 572 "monster, humanoid, Bilbo Baggins" tile 573 "monster, human or elf, High Ice Mage" tile 574 "monster, human or elf, King Arthur" tile 575 "monster, human or elf, High Lycanthrope" tile 576 "monster, human or elf, Grand Master" tile 577 "monster, human or elf, Dark Lord" tile 578 "monster, human or elf, Arch Priest" tile 579 "monster, human or elf, Orion" tile 580 "monster, human or elf, Master of Thieves" tile 581 "monster, human or elf, Lord Sato" tile 582 "monster, human or elf, Twoflower" tile 583 "monster, human or elf, Van Helsing" tile 584 "monster, human or elf, Norn" tile 585 "monster, human or elf, Neferet the Green" tile 586 "monster, spider, Lolth" tile 587 "monster, human or elf, Chief Yeoman Warder" tile 588 "monster, major demon, Minion of Huhetotl" tile 589 "monster, human or elf, Thoth Amon" tile 590 "monster, dragon, Chromatic Dragon" tile 591 "monster, human or elf, Transmuter" tile 592 "monster, dragon, Smaug" tile 593 "monster, orc, Goblin King" tile 594 "monster, human or elf, Water Mage" tile 595 "monster, human or elf, Lareth" tile 596 "monster, giant humanoid, Cyclops" tile 597 "monster, humanoid, Gollum" tile 598 "monster, human or elf, Earth Mage" tile 599 "monster, dragon, Ixoth" tile 600 "monster, human or elf, Sir Lorimar" tile 601 "monster, human or elf, Master Kaen" tile 602 "monster, major demon, Maugneshaagar" tile 603 "monster, major demon, Nalzok" tile 604 "monster, spider, Scorpius" tile 605 "monster, human or elf, Master Assassin" tile 606 "monster, human or elf, Ashikaga Takauji" tile 607 "monster, human or elf, Count Dracula" tile 608 "monster, giant humanoid, Lord Surtur" tile 609 "monster, human or elf, Dark One" tile 610 "monster, human or elf, Colonel Blood" tile 611 "monster, human or elf, student" tile 612 "monster, human or elf, chieftain" tile 613 "monster, human or elf, neanderthal" tile 614 "monster, human or elf, shifter" tile 615 "monster, humanoid, dwarf warrior" tile 616 "monster, human or elf, igniter" tile 617 "monster, human or elf, froster" tile 618 "monster, humanoid, fiend" tile 619 "monster, human or elf, attendant" tile 620 "monster, humanoid, proudfoot" tile 621 "monster, human or elf, intern" tile 622 "monster, human or elf, page" tile 623 "monster, human or elf, abbot" tile 624 "monster, human or elf, embalmer" tile 625 "monster, human or elf, acolyte" tile 626 "monster, human or elf, hunter" tile 627 "monster, human or elf, thug" tile 628 "monster, human or elf, ninja" tile 629 "monster, human or elf, ronin" tile 630 "monster, human or elf, roshi" tile 631 "monster, human or elf, guide" tile 632 "monster, human or elf, exterminator" tile 633 "monster, human or elf, warrior" tile 634 "monster, human or elf, apprentice" tile 635 "monster, human or elf, Yeoman Warder" tile 636 "monster, humanoid, Farmer Maggot" tile 637 "monster, invisible monster, invisible monster" ������������������������slashem-0.0.7E7F3/win/share/txtfilt.c���������������������������������������������������������������0000664�0000764�0000764�00000013210�10545462320�015404� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) J. Ali Harlow 2000 */ /* NetHack may be freely redistributed. See license for details. */ /* * Filter a text file file by removing any tiles which have, or appear * to have been magnified from a lower resolution. */ #include <errno.h> #include "config.h" #include "tile.h" #define pixel_eq(pixa, pixb) ((pixa.r == pixb.r) && (pixa.g == pixb.g) \ && (pixa.b == pixb.b)) /* [WAC] do this without memcmp() */ static boolean low_res_tile(bitmap) pixel (*bitmap)[MAX_TILE_X]; { int x, y; pixel def_background = DEFAULT_BACKGROUND; boolean retval = TRUE; int blanks; int topblanks, bottomblanks; for(y = 0; y < tile_y - 1; y += 2) for(x = 0; x < tile_x - 1; x += 2) { if (!pixel_eq(bitmap[y][x], bitmap[y][x+1])) retval = FALSE; if (!pixel_eq(bitmap[y][x], bitmap[y+1][x])) retval = FALSE; if (!pixel_eq(bitmap[y][x], bitmap[y+1][x+1])) retval = FALSE; } if (tile_x != 48 || tile_y != 64 || retval) return retval; /* 3D tiles - detected via tile_x = 48 and tile_y = 64 * Remove recentered tiles */ /* For x axis, tiles may be "shifted", so count whitespace per line */ for(y = 0; y < tile_y; y++) { blanks = 0; for(x = 0; x < tile_x; x++) { if (pixel_eq(bitmap[y][x], def_background)) blanks++; } if (blanks < 16) return FALSE; } #if 0 for(x = 0; x < tile_x; x++) { blanks = 0; for(y = 0; y < tile_y; y++) { if (pixel_eq(bitmap[y][x], def_background)) blanks++; } minyblanks = min(minyblanks, blanks); } #endif topblanks = 0; bottomblanks = 0; for(y = 0; y < tile_y; y++) { for(x = 0; x < tile_x; x++) { if (!pixel_eq(bitmap[y][x], def_background)) break; } if (x == tile_x) topblanks++; else break; } for(y = tile_y -1 ; y > topblanks; y--) { for(x = 0; x < tile_x; x++) { if (!pixel_eq(bitmap[y][x], def_background)) break; } if (x == tile_x) bottomblanks++; else break; } if ((topblanks + bottomblanks) < 32) return FALSE; #if 0 for(y = 0; y < 16; y++) for(x = 0; x < tile_x; x++) { if (!pixel_eq(bitmap[y][x], def_background)) return FALSE; } for(y = 16; y < 48; y++) { for(x = 0; x < 8; x++) { if (!pixel_eq(bitmap[y][x], def_background)) return FALSE; } for(x = 40; x < 48; x++) { if (!pixel_eq(bitmap[y][x], def_background)) return FALSE; } } for(y = 48; y < 16; y++) for(x = 0; x < tile_x; x++) { if (!pixel_eq(bitmap[y][x], def_background)) return FALSE; } #endif return TRUE; } #if 0 static boolean low_res_tile(bitmap) pixel (*bitmap)[MAX_TILE_X]; { int x, y; for(y = 0; y < tile_y - 1; y += 2) if (memcmp(bitmap[y], bitmap[y + 1], sizeof(*bitmap))) return FALSE; for(x = 0; x < tile_x - 1; x += 2) for(y = 0; y < tile_y; y++) if (memcmp(&bitmap[y][x],&bitmap[y][x + 1],sizeof(bitmap[y][x]))) return FALSE; return TRUE; } #endif static int match_np = 0; static char **match_p = NULL; int match_load(char *file) { FILE *fp; int i, no_alloc = 32; char buf[1024]; match_np = 0; fp = fopen(file, "r"); if (!fp) return -1; free(match_p); match_p = malloc(no_alloc * sizeof (*match_p)); if (!match_p) { errno = ENOMEM; /* Not all mallocs set errno */ return -1; } while (fgets(buf, sizeof(buf), fp)) { i = strlen(buf); if (buf[i - 1] != '\n') { Fprintf(stderr, "Line %d: Too long (max %d)\n", match_np + 1, sizeof(buf) - 1); errno = EINVAL; return -1; } buf[i - 1] = '\0'; if (match_np >= no_alloc) { no_alloc *= 2; match_p = realloc(match_p, no_alloc * sizeof (*match_p)); if (!match_p) { errno = ENOMEM; return -1; } } match_p[match_np] = strdup(buf); if (!match_p[match_np++]) { errno = ENOMEM; return -1; } } fclose(fp); match_p = realloc(match_p, match_np * sizeof (*match_p)); return 0; } boolean match_found(char *name) { int i; for(i = 0; i < match_np; i++) { if (!strcmp(match_p[i], name)) return TRUE; } return FALSE; } int main(argc, argv) int argc; char **argv; { int argn = 1; boolean match_mode = FALSE; FILE *match_fp; char ttype[BUFSZ]; int number; char name[BUFSZ]; pixel pixels[MAX_TILE_Y][MAX_TILE_X]; while (argn < argc) { if (!strcmp(argv[argn], "-f")) { match_mode = TRUE; argn ++; if (argn >= argc) { Fprintf(stderr, "txtfilt: -f option requires a match file\n"); exit(EXIT_FAILURE); } if (match_load(argv[argn])) { perror(argv[argn]); exit(EXIT_FAILURE); } argn ++; } else if (!strcmp(argv[argn], "-p")) { argn ++; if (argn >= argc) { Fprintf(stderr, "txtfilt: -p option requires a palette file\n"); exit(EXIT_FAILURE); } if (!read_text_file_colormap(argv[argn])) { perror(argv[argn]); exit(EXIT_FAILURE); } init_colormap(); argn ++; } else break; } if (argc - argn != 2) { Fprintf(stderr, "usage: txtfilt [-f match-file] [-p palette-file] infile outfile\n"); exit(EXIT_FAILURE); } if (!fopen_text_file(argv[argn], RDTMODE)) exit(EXIT_FAILURE); if (!fopen_text_file(argv[argn + 1], WRTMODE)) exit(EXIT_FAILURE); while (read_text_tile_info(pixels, ttype, &number, name)) { if (match_mode) { if (match_found(name)) write_text_tile_info(pixels, ttype, number, name); } else if (!low_res_tile(pixels)) write_text_tile_info(pixels, ttype, number, name); } fclose_text_file(); exit(EXIT_SUCCESS); /*NOTREACHED*/ return 0; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/share/bigtile.c���������������������������������������������������������������0000664�0000764�0000764�00000010142�10545462320�015326� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) NetHack Development Team 1995 */ /* NetHack may be freely redistributed. See license for details. */ /* * Create a set of pseudo 3D tiles by centering monsters/objects/furniture * and slanting floors. See Mitsuhiro Itakura's instructions at: * http://www.geocities.co.jp/SiliconValley-SanJose/9606/nh/3d/index.html */ #include "config.h" #include "tile.h" #ifdef __GO32__ #include <unistd.h> #endif static char *tilefiles[] = { "../win/share/mon32-t.txt", "../win/share/obj32-t.txt", "../win/share/oth32-t.txt"}; static char *bigfiles[] = { "../win/share/monbig.txt", "../win/share/objbig.txt", "../win/share/othbig.txt"}; static char *no_slant[] = { "iron bars", "tree", "staircase up", "staircase down", "ladder up", "ladder down", "altar", "opulent throne", "sink", "toilet", "fountain", "squeaky board", "bear trap", "land mine", "rust trap", "fire trap", "magic portal", "grave", "cmap / thrown boomerang, open left", "cmap / thrown boomerang, open right", "cmap / magic shield 1", "cmap / magic shield 2", "cmap / magic shield 3", "cmap / magic shield 4", "warning 0", "warning 1", "warning 2", "warning 3", "warning 4", "warning 5", }; static char *raised_up[] = { /* these matches are partial */ "explosion", "zap", "cmap / dig beam", "cmap / camera flash", "cmap / swallow", }; static int tilecount; static int tilecount_per_file; static int filenum; static int write_padtile(pixels, ttype, number, name) pixel (*pixels)[MAX_TILE_X]; const char *ttype; int number; const char *name; { int i, j; int retval; pixel bigpixels[MAX_TILE_Y][MAX_TILE_X]; pixel default_background = DEFAULT_BACKGROUND; for(j = 0; j < 2 * tile_y; j++) for(i = 0; i < 3 * tile_x / 2; i++) bigpixels[j][i] = default_background; for(j = 0; j < tile_y; j++) for(i = 0; i < tile_x; i++) bigpixels[j + tile_y / 2][i + tile_x / 4] = pixels[j][i]; i = tile_x; j = tile_y; tile_x = tile_x * 3 / 2; tile_y *= 2; retval = write_text_tile_info(bigpixels, ttype, number, name); tile_x = i; tile_y = j; return retval; } static int write_slanttile(pixels, ttype, number, name, yoffset) pixel (*pixels)[MAX_TILE_X]; const char *ttype; int number; const char *name; int yoffset; { int i, j; int retval; pixel bigpixels[MAX_TILE_Y][MAX_TILE_X]; pixel default_background = DEFAULT_BACKGROUND; for(j = 0; j < 2 * tile_y; j++) for(i = 0; i < 3 * tile_x / 2; i++) bigpixels[j][i] = default_background; for(j = 0; j < tile_y; j++) for(i = 0; i < tile_x; i++) bigpixels[j + tile_y - yoffset][i + tile_x / 2 - j / 2] = pixels[j][i]; i = tile_x; j = tile_y; tile_x = tile_x * 3 / 2; tile_y *= 2; retval = write_text_tile_info(bigpixels, ttype, number, name); tile_x = i; tile_y = j; return retval; } int main(argc, argv) int argc; char *argv[]; { int i, tile_no; char buf[BUFSZ], ttype[BUFSZ]; pixel pixels[MAX_TILE_Y][MAX_TILE_X]; boolean x; while (filenum < 3) { tilecount_per_file = 0; if (!fopen_text_file(tilefiles[filenum], RDTMODE)) exit(EXIT_FAILURE); if (tile_x * 3 / 2 > MAX_TILE_X || tile_y * 2 > MAX_TILE_Y) { Fprintf(stderr, "tile size too large\n"); exit(EXIT_FAILURE); } if (!fopen_text_file(bigfiles[filenum], WRTMODE)) exit(EXIT_FAILURE); while (read_text_tile_info(pixels, ttype, &tile_no, buf)) { if (filenum < 2) write_padtile(pixels, ttype, tile_no, buf); else { for(i = 0; i < SIZE(no_slant); i++) if (!strcmp(buf, no_slant[i])) break; if (i < SIZE(no_slant)) write_padtile(pixels, ttype, tile_no, buf); else { int yoffset = 0; for (i = 0; i < SIZE(raised_up); i++) if (!strncmp(buf, raised_up[i], strlen(raised_up[i]))) break; if (i < SIZE(raised_up)) yoffset = 14; write_slanttile(pixels, ttype, tile_no, buf, yoffset); } } tilecount_per_file++; tilecount++; } fclose_text_file(); printf("%d tiles processed from %s\n", tilecount_per_file, tilefiles[filenum]); ++filenum; } printf("Grand total of %d tiles processed.\n", tilecount); exit(EXIT_SUCCESS); /*NOTREACHED*/ return 0; } /*bigtile.c*/ ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/share/mon32aw.txt�������������������������������������������������������������0000664�0000764�0000764�00000026056�10545462320�015605� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������__ = (255, 0, 255) _A = (0, 0, 0) _B = (242, 242, 242) _C = (242, 0, 0) _D = (96, 145, 178) _E = (48, 48, 48) _F = (145, 64, 0) _G = (0, 178, 242) _H = (242, 242, 0) _I = (210, 210, 178) _J = (242, 96, 0) _K = (0, 0, 242) _L = (178, 64, 0) _M = (160, 160, 160) _N = (242, 178, 145) _O = (128, 64, 0) _P = (160, 0, 0) _Q = (96, 48, 0) _R = (128, 128, 128) _S = (0, 145, 0) _T = (96, 96, 96) _U = (96, 242, 0) _V = (16, 16, 16) _W = (192, 192, 192) _X = (160, 80, 0) _Y = (145, 145, 145) _Z = (32, 32, 32) _a = (224, 224, 224) _b = (160, 112, 0) _c = (128, 0, 0) _d = (64, 64, 64) _e = (48, 0, 0) _f = (16, 48, 48) _g = (128, 32, 0) _h = (0, 242, 242) _i = (192, 160, 64) _j = (210, 210, 210) _k = (242, 224, 96) _l = (242, 192, 64) _m = (192, 0, 0) _n = (178, 178, 178) _o = (192, 96, 0) _p = (0, 32, 32) _q = (64, 32, 0) _r = (160, 32, 0) _s = (96, 0, 0) _t = (112, 112, 112) _u = (80, 80, 80) _v = (192, 145, 0) _w = (160, 112, 80) _x = (242, 128, 0) _y = (192, 48, 0) _z = (128, 96, 0) _0 = (0, 0, 128) _1 = (112, 160, 160) _2 = (96, 64, 0) _3 = (192, 128, 112) _4 = (0, 0, 160) _5 = (192, 192, 0) _6 = (16, 16, 0) _7 = (224, 224, 160) _8 = (0, 0, 192) _9 = (0, 128, 242) _$ = (160, 128, 48) A_ = (64, 0, 0) AA = (128, 112, 32) AB = (242, 242, 145) AC = (0, 160, 0) AD = (224, 160, 128) AE = (224, 0, 0) AF = (0, 96, 192) AG = (96, 128, 128) AH = (0, 128, 0) AI = (224, 112, 0) AJ = (0, 192, 0) AK = (224, 160, 0) AL = (224, 48, 0) AM = (224, 224, 0) AN = (242, 192, 0) AO = (0, 0, 96) AP = (96, 16, 0) AQ = (160, 160, 0) AR = (0, 16, 16) AS = (0, 96, 0) AT = (112, 80, 64) AU = (0, 80, 160) AV = (0, 96, 48) AW = (0, 128, 64) AX = (0, 112, 224) AY = (32, 64, 64) AZ = (96, 192, 0) Aa = (96, 96, 0) Ab = (96, 0, 96) Ac = (145, 128, 96) Ad = (145, 192, 192) Ae = (48, 96, 96) Af = (128, 128, 0) Ag = (160, 224, 224) Ah = (160, 0, 80) Ai = (128, 0, 128) Aj = (112, 96, 80) Ak = (112, 112, 160) Al = (242, 0, 128) Am = (0, 160, 80) An = (0, 64, 128) Ao = (0, 64, 32) Ap = (0, 224, 0) Aq = (0, 0, 224) Ar = (0, 64, 0) As = (64, 16, 0) At = (128, 0, 64) Au = (0, 192, 96) Av = (192, 0, 96) Aw = (192, 192, 145) Ax = (160, 160, 112) Ay = (0, 160, 160) Az = (192, 192, 242) A0 = (242, 210, 160) A1 = (16, 0, 0) A2 = (0, 242, 0) A3 = (96, 96, 128) A4 = (128, 0, 242) A5 = (145, 145, 192) A6 = (160, 145, 128) A7 = (96, 80, 16) A8 = (242, 64, 0) A9 = (128, 128, 96) A$ = (64, 0, 64) B_ = (0, 128, 128) BA = (192, 96, 96) BB = (112, 224, 112) BC = (160, 160, 224) BD = (32, 0, 0) BE = (96, 0, 48) BF = (112, 0, 224) BG = (0, 192, 192) BH = (96, 128, 96) BI = (224, 0, 224) BJ = (192, 0, 192) BK = (192, 145, 192) BL = (242, 242, 192) BM = (192, 242, 242) BN = (128, 242, 0) BO = (160, 80, 160) BP = (0, 224, 224) BQ = (224, 160, 160) BR = (0, 96, 96) BS = (128, 242, 128) BT = (48, 96, 0) BU = (224, 112, 224) BV = (96, 96, 48) BW = (0, 0, 48) BX = (64, 64, 0) BY = (112, 160, 112) BZ = (242, 192, 192) Ba = (112, 224, 224) Bb = (112, 112, 224) Bc = (0, 64, 64) Bd = (80, 160, 0) Be = (64, 128, 0) Bf = (160, 0, 160) Bg = (0, 224, 112) Bh = (96, 48, 48) Bi = (145, 192, 145) Bj = (0, 48, 0) Bk = (64, 128, 128) Bl = (128, 242, 242) Bm = (224, 112, 112) Bn = (80, 160, 80) Bo = (64, 48, 0) Bp = (128, 96, 128) Bq = (96, 192, 96) Br = (0, 0, 64) Bs = (80, 0, 160) Bt = (242, 242, 128) Bu = (96, 192, 192) Bv = (80, 80, 160) Bw = (192, 145, 145) Bx = (16, 48, 0) By = (64, 128, 64) Bz = (0, 0, 16) B0 = (16, 16, 32) B1 = (192, 96, 192) B2 = (48, 16, 0) B3 = (112, 224, 0) B4 = (224, 192, 160) B5 = (0, 16, 0) B6 = (242, 128, 128) B7 = (224, 0, 112) B8 = (0, 48, 16) B9 = (0, 48, 96) B$ = (160, 80, 80) C_ = (16, 32, 32) CA = (32, 32, 0) CB = (0, 32, 0) CC = (32, 16, 16) CD = (64, 64, 128) CE = (0, 0, 32) CF = (128, 64, 128) CG = (224, 160, 224) CH = (242, 192, 242) CI = (32, 32, 64) CJ = (16, 32, 16) CK = (0, 242, 128) CL = (32, 64, 32) CM = (160, 224, 160) CN = (160, 160, 80) CO = (128, 64, 64) CP = (80, 160, 160) CQ = (64, 32, 32) CR = (48, 32, 32) CS = (32, 32, 48) CT = (48, 48, 32) CU = (160, 112, 112) CV = (192, 242, 192) CW = (0, 48, 48) CX = (128, 96, 96) CY = (210, 160, 80) CZ = (48, 48, 0) Ca = (224, 224, 112) Cb = (96, 96, 192) Cc = (32, 64, 0) Cd = (160, 112, 160) Ce = (64, 64, 32) Cf = (96, 0, 192) Cg = (48, 48, 96) Ch = (0, 32, 16) Ci = (32, 48, 48) Cj = (128, 128, 64) Ck = (64, 32, 64) Cl = (0, 0, 178) Cm = (32, 242, 178) Cn = (32, 242, 178) Co = (80, 80, 242) Cp = (242, 64, 80) Cq = (16, 210, 48) Cr = (16, 192, 48) Cs = (192, 16, 48) Ct = (160, 112, 242) Cu = (178, 16, 48) Cv = (178, 16, 128) Cw = (178, 16, 224) Cx = (80, 242, 48) Cy = (178, 224, 16) Cz = (242, 16, 192) C0 = (16, 80, 242) C1 = (48, 96, 48) C2 = (242, 128, 242) C3 = (96, 48, 96) C4 = (128, 128, 242) C5 = (210, 210, 16) C6 = (210, 16, 128) C7 = (32, 224, 16) C8 = (178, 16, 210) C9 = (16, 210, 210) C$ = (16, 16, 145) # tile 193 (larva) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ _________________________________n_n_n_n_n______________________ _______________________________n_I_I_I_I_I_n_n_A________________ _____________________________n_I_I_I_I_I_I_I_I_I_A______________ _________________________n_n_I_I_I_I_M_M_M_M_n_n_M_A____________ _______________________n_n_I_I_I_I_M_R_R_R_M_M_n_n_A_A__________ _____________________n_I_I_I_I_I_I_M_A_A_A_A_R_M_n_M_A__________ ___________________n_I_I_I_I_I_I_I_R_A_A_A_A_A_M_n_M_A__________ _________________n_I_I_I_I_I_I_I_R_A_A_A_A_A_A_A_R_M_A__________ _________________n_I_I_I_I_I_I_R_A_A_A_A_A_A_A_A_A_M_A__________ _______________n_I_I_I_I_I_I_R_A_A_A_A___________A_R_A__________ _______________A_I_I_I_I_I_R_A_A_A_A_______________A____________ _______________A_n_I_I_n_M_A_A_A_A______________________________ _______________A_n_I_I_n_M_A_A_A________________________________ _______________A_M_I_I_n_M_A_A_A________________________________ _______________A_M_n_I_n_M_A_A_A________________________________ _________________A_n_I_I_n_M_A_A_A______________________________ _________________A_M_n_I_I_n_M_A_A______________________________ ___________________A_n_I_A_I_A_M_A______________________________ ___________________A_M_n_I_I_I_M_A______________________________ _____________________A_M_A_I_A_M_A______________________________ _______________________A_M_M_M_A_A______________________________ _________________________A_A_A_A________________________________ } # tile 382 (ghoul) { _______________________________A_A_A_A__________________________ _____________________________A_A_A_A_A_A________________________ ___________________________A_B_n_n_A_A_A________________________ ___________________________B_j_j_j_n_A_A_A______________________ ___________________________C_j_C_C_j_n_A_A______________________ ___________________________j_j_B_j_j_A_A________________________ ___________________________j_j_j_j_j_A_A________________________ _____________________________Y_Y_Y_n_AAeAe______________________ ________________________BCBCBC_n_n_n_D_D_DAe____________________ ______________________BCBC_D_D_D_n_D_D_D_D_DAe__________________ ____________________BC_D_D_D_D_D_D_D_D_D_D_D_D__________________ ________________BCBC_D_DAe_D_D_D_D_D_D_DAe_D_D_DAe______________ ______________BCBC_D_DAeAe_D_D_D_D_D_D_DAeAeBC_DAeAe____________ __________BCBC_D_D_DAe__Ae_D_D_D_D_D_DAeAeBCBC_D_DAe____________ _______j_j_j_n_DAeAe____AeAe_D_D_D_DAeAeBCBC_D_DAe______________ _____j_j___j_n_nAe______Ae_D_D_D_DAeAe_j_n_nAeAe________________ ___________j___j________Ae_D_D_D_DAe_j_j_j_n_n__________________ ________________________Ae_D_D_D_DAe_j_f_j___j_______A_A_A_A____ ________________________Ae_D_D_D_D_1Ae_D_f_________A_A_A_A_A_A__ ________________________Ae_DAe____AeAe_D_D_A_A___A_A_A_A_A_A_A__ ______________________Ae_DAeAe_____DAe_DAe_A_A_A_A_A_A_A_A_A____ _______________________DAeAe_D___A_D_DAe_D_A_A_A_A_A_A_A_A______ ______________________AeAe_D_D_A_AAe_DAeAe_A_A_A_A_A_A_A_A_A____ ______________________Ae_DAe_A_A_AAe_DAe_A_A_A_A_A_A_A_A_A_A_A__ _______________________D_D_D_A_A_A_DAeAe_D_A_A_A_A_A_A___A_A_A__ _______________________D_DAe_A_A_A_A_D_D_D_A_A_A_A_A_A_A_A_A____ ______________________Ae_DAe_D_A_A_A_D_DAe_D_A_A_A___A_A_A______ ______________________AeAe_D_D_A____Ae_D_D_D_A_A_A______________ _______________________B_B_n_D_______B_B_n_n_A_A_A______________ _____________________B_B_n_n_A_____B_B_n_n_A_A_A________________ _______________________A_A_A_A_A_A_A_A_A_A_A____________________ ________________________________________________________________ } # tile 384 (ghast) { _____________________________A_A_A_A____________________________ ___________________________A_A_A_A_A_A__________________________ _________________________A_B_n_n_A_A_A__________________________ _________________________B_j_j_j_n_A_A_A________________________ _________________________c_j_c_c_j_n_A_A________________________ _________________________j_j_B_j_j_A_A__________________________ _________________________j_j_j_j_j_A_A__________________________ ___________________________Y_Y_Y_n_A_g_g________________________ _______________________J_J_J_n_n_n_L_L_L_g______________________ _____________________J_J_L_L_L_n_L_L_L_L_L_g____________________ ___________________J_L_L_L_L_L_L_L_L_L_L_L_L____________________ _______________J_J_L_L_g_L_L_L_L_L_L_L_g_L_L_L_g________________ _____________J_J_L_L_g_g_L_L_L_L_L_L_L_g_g_J_L_g_g______________ _________J_J_L_L_L_g___g_L_L_L_L_L_L_g_g_J_J_L_L_g______________ _____j_j_j_n_L_g_g_____g_g_L_L_L_L_g_g_J_J_L_L_g________________ ___j_j___j_n_n_g_______g_L_L_L_L_g_g_j_n_n_g_g__________________ _________j___j_________g_L_L_L_L_g_j_j_j_n_n____________________ _______________________g_L_L_L_L_g_jAP_j___j_______A_A_A_A______ _______________________g_L_L_L_L_L_g_LAP_________A_A_A_A_A_A____ _______________________g_L_g_____g_g_L_L_A_A___A_A_A_A_A_A_A____ _____________________g_L_g_g_____L_g_L_g_A_A_A_A_A_A_A_A_A______ _____________________L_g_g_L___A_L_L_g_L_A_A_A_A_A_A_A_A________ _____________________g_g_L_L_A_A_g_L_g_g_A_A_A_A_A_A_A_A_A______ _____________________g_L_g_A_A_A_g_L_g_A_A_A_A_A_A_A_A_A_A_A____ _____________________L_L_L_A_A_A_L_g_g_L_A_A_A_A_A_A___A_A_A____ _____________________L_L_g_A_A_A_A_L_L_L_A_A_A_A_A_A_A_A_A______ _____________________g_L_g_L_A_A_A_L_L_g_L_A_A_A___A_A_A________ _____________________g_g_L_L_A_____g_L_L_L_A_A_A________________ _____________________B_B_n_L_______B_B_n_n_A_A_A________________ ___________________B_B_n_n_A_____B_B_n_n_A_A_A__________________ _____________________A_A_A_A_A_A_A_A_A_A_A______________________ ________________________________________________________________ } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/share/oth32fl.txt�������������������������������������������������������������0000664�0000764�0000764�00000031406�10545462320�015573� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������__ = (0, 0, 0) _A = (128, 96, 0) _B = (128, 255, 128) _C = (0, 0, 192) _D = (168, 224, 224) _E = (96, 48, 48) _F = (128, 64, 0) _G = (33, 64, 64) _H = (0, 112, 224) _I = (192, 96, 96) _J = (48, 96, 0) _K = (117, 105, 88) _L = (224, 192, 160) _M = (168, 168, 224) _N = (128, 32, 0) _O = (96, 0, 48) _P = (64, 128, 128) _Q = (255, 128, 128) _R = (128, 0, 255) _S = (0, 64, 32) _T = (128, 0, 0) _U = (48, 48, 0) _V = (96, 192, 0) _W = (48, 36, 0) _X = (96, 192, 192) _Y = (0, 32, 32) _Z = (48, 24, 0) _a = (48, 12, 0) _b = (128, 112, 32) _c = (64, 64, 128) _d = (192, 0, 96) _e = (48, 0, 0) _f = (0, 0, 224) _g = (224, 224, 0) _h = (0, 128, 64) _i = (0, 255, 255) _j = (64, 0, 128) _k = (96, 96, 0) _l = (0, 255, 0) _m = (255, 0, 128) _n = (96, 96, 192) _o = (96, 72, 0) _p = (104, 84, 31) _q = (224, 168, 0) _r = (0, 64, 64) _s = (96, 48, 0) _t = (248, 224, 96) _u = (224, 224, 112) _v = (202, 143, 114) _w = (24, 48, 48) _x = (144, 192, 192) _y = (0, 192, 96) _z = (0, 32, 64) _0 = (96, 24, 0) _1 = (128, 128, 64) _2 = (24, 24, 48) _3 = (224, 112, 0) _4 = (240, 240, 240) _5 = (0, 48, 24) _6 = (128, 255, 255) _7 = (96, 0, 0) _8 = (128, 255, 0) _9 = (0, 0, 64) _$ = (96, 0, 192) A_ = (144, 144, 192) AA = (255, 192, 255) AB = (0, 24, 24) AC = (255, 192, 0) AD = (255, 192, 192) AE = (224, 224, 224) AF = (16, 16, 0) AG = (128, 64, 64) AH = (224, 56, 0) AI = (170, 136, 52) AJ = (16, 0, 0) AK = (224, 112, 112) AL = (0, 96, 96) AM = (208, 208, 208) AN = (64, 128, 0) AO = (255, 128, 255) AP = (255, 128, 0) AQ = (224, 168, 224) AR = (224, 0, 0) AS = (128, 0, 64) AT = (192, 192, 255) AU = (192, 192, 0) AV = (0, 48, 96) AW = (255, 255, 128) AX = (192, 192, 192) AY = (168, 224, 168) AZ = (128, 128, 96) Aa = (112, 224, 0) Ab = (64, 64, 0) Ac = (127, 90, 72) Ad = (224, 112, 224) Ae = (48, 48, 24) Af = (255, 64, 0) Ag = (64, 48, 0) Ah = (192, 144, 0) Ai = (176, 176, 176) Aj = (0, 0, 96) Ak = (128, 96, 96) Al = (192, 144, 192) Am = (48, 24, 24) An = (64, 32, 0) Ao = (224, 0, 112) Ap = (24, 48, 0) Aq = (0, 128, 128) Ar = (64, 16, 0) As = (144, 192, 144) At = (160, 160, 160) Au = (64, 0, 0) Av = (192, 96, 0) Aw = (255, 0, 255) Ax = (24, 24, 0) Ay = (255, 0, 0) Az = (192, 96, 192) A0 = (112, 224, 112) A1 = (48, 96, 96) A2 = (0, 16, 16) A3 = (120, 160, 160) A4 = (24, 0, 0) A5 = (0, 0, 16) A6 = (160, 160, 120) A7 = (160, 120, 160) A8 = (144, 144, 144) A9 = (0, 64, 128) A$ = (192, 48, 0) B_ = (80, 160, 160) BA = (224, 0, 224) BB = (48, 48, 96) BC = (120, 160, 120) BD = (120, 120, 160) BE = (96, 192, 96) BF = (160, 160, 80) BG = (160, 120, 120) BH = (160, 80, 160) BI = (128, 128, 128) BJ = (0, 96, 48) BK = (64, 64, 32) BL = (112, 224, 224) BM = (192, 0, 0) BN = (192, 0, 192) BO = (0, 160, 160) BP = (0, 0, 128) BQ = (72, 108, 108) BR = (128, 96, 128) BS = (112, 112, 112) BT = (64, 32, 32) BU = (80, 160, 80) BV = (80, 80, 160) BW = (96, 128, 96) BX = (0, 48, 48) BY = (192, 192, 144) BZ = (32, 64, 0) Ba = (128, 64, 128) Bb = (160, 160, 0) Bc = (160, 80, 80) Bd = (64, 0, 32) Be = (160, 0, 160) Bf = (96, 96, 96) Bg = (252, 252, 153) Bh = (32, 32, 0) Bi = (0, 160, 80) Bj = (64, 128, 64) Bk = (160, 120, 0) Bl = (0, 0, 48) Bm = (0, 80, 160) Bn = (192, 144, 144) Bo = (0, 224, 0) Bp = (80, 160, 0) Bq = (112, 112, 224) Br = (80, 80, 80) Bs = (32, 0, 0) Bt = (128, 0, 128) Bu = (80, 0, 160) Bv = (255, 255, 255) Bw = (96, 48, 96) Bx = (242, 196, 77) By = (208, 168, 80) Bz = (255, 255, 0) B0 = (255, 255, 192) B1 = (0, 192, 0) B2 = (160, 80, 0) B3 = (160, 0, 80) B4 = (0, 192, 192) B5 = (165, 118, 94) B6 = (48, 96, 48) B7 = (64, 64, 64) B8 = (192, 160, 64) B9 = (224, 224, 168) B$ = (0, 160, 0) C_ = (96, 0, 96) CA = (160, 40, 0) CB = (0, 0, 160) CC = (0, 224, 112) CD = (64, 32, 64) CE = (0, 128, 255) CF = (0, 128, 0) CG = (96, 128, 128) CH = (48, 48, 48) CI = (229, 162, 130) CJ = (32, 64, 32) CK = (192, 255, 255) CL = (171, 154, 129) CM = (160, 0, 0) CN = (224, 168, 168) CO = (145, 135, 110) CP = (64, 0, 64) CQ = (192, 255, 192) CR = (112, 0, 224) CS = (0, 96, 0) CT = (96, 96, 128) CU = (0, 255, 128) CV = (0, 96, 192) CW = (24, 48, 24) CX = (255, 211, 175) CY = (32, 32, 32) CZ = (48, 0, 48) Ca = (0, 64, 0) Cb = (0, 224, 224) Cc = (32, 0, 32) Cd = (0, 48, 0) Ce = (192, 192, 96) Cf = (16, 16, 16) Cg = (128, 128, 255) Ch = (0, 32, 0) Ci = (128, 128, 0) Cj = (255, 182, 145) Ck = (16, 0, 16) Cl = (0, 24, 0) Cm = (96, 96, 48) Cn = (0, 16, 0) Co = (0, 0, 255) # tile 12 (doorway) { _G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_G _GA2A2_w_Y_w_Y_YA2A2_Y_Y_w_G_Y_w_Y_w_G_w_Y_Y_YA2A2A2_G_G_w_Y____ _GA2_w_G_w_Y_w_w_YA2A2A2_G_G_G_w_G_Y_Y_Y_w_G_w_YA2_G_G_w_GAB_Y__ _G_w_G_Y_G_w_G_Y_GA2A2A2_G_G_w_w_Y_Y_w_Y_w_Y_w_YA2_G_w_G_w_G_Y__ _G_G_G_G_G_w_w_Y_Y_YA2_w_G_w_w_G_G_G_Y_w_Y_G_Y_YA2_w_G_w_w_G_Y__ _G_w_G_G_w_w_G_w_Y_YA2_Y_w_G_w_G_Y_Y_w_G_Y_Y_wA2_Y_w_G_G_Y_w_w__ _G_w_Y_w_w_Y_Y_w_G_YA2A2_YA2A2A2A2A2A2_Y_YA2A2A2A2A2_w_Y_G_Y_Y__ _G_G_w_G_Y_GAB_Y_Y_YA2A2A2_GAB_wABABA2A2A2A2_G_G_wA2A2A2A2_Y_Y__ _G_w_w_w_Y_w_YAB_YA2A2_G_G_w_G_Y_w_G_YA2A2_w_G_w_G_Y_G_YA2A2A2A2 _G_Y_Y_Y_Y_Y_Y_G_YA2_w_G_G_G_w_Y_w_Y_w_YA2_G_w_G_w_YAB_G_YA2A2A2 _GA2A2_Y_YA2A2A2A2A2_G_w_G_w_Y_G_G_w_Y_YA2_G_G_G_Y_G_Y_Y_Y_YA2A2 _GA2A2A2A2_G_G_Y_YA2_G_G_G_G_w_G_Y_Y_w_YA2_G_G_w_Y_w_w_YA2A2A2A2 _G_Y_G_G_G_Y_w_Y_Y_YA2_w_G_w_Y_w_w_G_w_YA2A2_G_Y_w_YA2A2A2A2_G__ _G_G_Y_G_Y_w_Y_w_G_YA2_G_w_Y_w_w_Y_Y_G_YA2A2A2A2A2A2A2A2A2_w_Y__ _G_w_G_w_G_Y_w_G_w_YA2A2_G_w_G_w_Y_w_YA2A2_G_w_Y_YA2A2A2_w_G_w__ _G_G_Y_G_w_Y_wAB_Y_Y_YA2A2_G_w_Y_GABA2A2_G_G_G_Y_w_YA2A2_G_w_G__ _G_Y_w_GAB_G_w_GAB_G_YA2A2A2A2A2ABA2A2A2_w_G_Y_w_Y_Y_wA2_G_w_w__ _G_Y_G_w_w_G_w_Y_Y_YA2A2_G_w_wA2A2A2A2_G_G_w_G_w_wAB_YA2_w_G_Y__ _GA2_Y_G_G_Y_Y_YA2A2_w_G_Y_w_Y_w_GA2A2_G_w_Y_G_w_Y_w_YA2_Y_w_w__ _GA2A2A2A2A2A2A2A2_w_G_G_GAB_G_w_w_wA2_w_G_Y_Y_w_w_YA2A2_w_w_Y__ _GA2A2_G_G_wA2A2A2_G_G_G_Y_w_G_w_G_YA2_w_Y_w_w_w_Y_wA2_w_G_w_Y__ _G_G_G_G_w_Y_w_YA2_G_G_w_w_Y_w_w_YABA2_G_w_Y_G_Y_Y_YA2_Y_w_YA2A2 _G_G_Y_G_w_w_Y_YA2A2_G_w_Y_G_Y_YABA2A2A2_Y_G_G_G_wABA2A2A2A2A2A2 _G_G_G_Y_w_Y_Y_w_YA2A2_Y_w_YA2A2A2A2A2A2A2_G_Y_YABA2A2_w_G_GA2A2 _G_G_Y_w_G_w_Y_w_Y_YA2A2A2A2_G_G_w_G_Y_w_YA2A2ABABA2_w_G_w_w_Y__ _G_Y_w_G_w_w_w_Y_w_YA2A2A2_G_G_w_Y_G_Y_w_Y_G_YA2A2A2_G_w_G_w_G__ _G_G_Y_Y_w_Y_Y_Y_w_Y_YA2_w_G_G_Y_w_w_w_w_w_Y_Y_YA2A2_G_G_w_G_Y__ _G_Y_w_G_w_w_w_Y_w_Y_YA2_G_w_w_G_Y_Y_G_Y_Y_Y_G_Y_YA2_w_G_w_w_Y__ _G_w_G_w_w_Y_w_Y_Y_Y_YA2_G_w_G_Y_wAB_w_Y_Y_w_Y_Y_GA2_G_w_G_G_Y__ _G_Y_w_G_G_w_w_Y_Y_Y_wA2_Y_G_w_w_w_G_Y_Y_G_Y_GABA2A2_Y_GAB_Y_w__ _GA2_Y_w_w_Y_Y_Y_Y_YA2A2A2_G_w_Y_G_Y_G_G_Y_YABA2A2A2A2_Y_w_YA2A2 _GA2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2 } # tile 17 (floor of a room) { _G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_w _G_w_w_w_w_w_w_w_Y_Y_Y_w_w_w_w_w_w_w_w_w_w_w_w_w_Y_Y_w_w_w_w_w_Y _G_w_w_G_G_G_G_w_w_Y_Y_w_G_G_G_G_G_w_G_G_G_w_G_w_Y_Y_w_G_G_w_w_Y _G_w_G_w_G_w_G_G_w_Y_Y_w_G_w_G_G_w_G_G_G_G_G_G_w_Y_w_w_G_w_G_w_Y _G_w_G_G_G_G_G_G_w_w_Y_w_w_w_G_G_G_G_G_w_G_G_w_w_Y_w_G_G_G_G_w_Y _G_w_G_G_G_w_G_G_G_w_Y_w_w_w_w_w_w_w_w_w_w_w_w_Y_w_w_w_G_G_G_w_Y _G_w_w_G_G_w_G_w_G_w_Y_w_w_Y_Y_Y_Y_Y_Y_w_w_Y_Y_Y_Y_Y_w_w_w_w_w_Y _G_w_G_G_G_G_G_G_w_w_Y_Y_Y_w_w_w_w_w_Y_Y_Y_Y_w_w_w_Y_Y_Y_Y_w_w_Y _G_w_w_G_w_G_G_G_w_Y_Y_w_w_w_w_G_w_w_w_Y_Y_w_w_G_w_w_w_w_Y_Y_Y_Y _G_w_G_G_w_w_w_w_w_Y_w_w_G_G_G_G_G_w_w_w_Y_w_G_G_G_G_G_w_w_Y_Y_Y _G_Y_Y_w_w_Y_Y_Y_Y_Y_w_G_G_G_w_G_w_G_G_w_Y_w_G_G_w_G_G_G_G_w_Y_Y _G_Y_Y_Y_Y_w_w_w_w_Y_w_w_G_G_w_G_G_G_G_w_Y_Y_w_G_G_w_w_w_Y_Y_Y_Y _G_w_w_w_w_w_G_w_w_w_Y_w_w_G_G_G_G_G_G_w_Y_Y_Y_w_w_w_Y_Y_Y_Y_Y_Y _G_w_w_G_G_G_G_G_w_w_Y_w_w_w_G_G_w_G_w_w_Y_Y_Y_Y_Y_Y_Y_Y_Y_w_w_Y _G_w_G_G_G_G_w_G_G_w_Y_Y_w_G_G_G_G_G_w_Y_Y_w_w_w_w_Y_Y_Y_Y_w_w_Y _G_w_G_w_G_w_G_G_G_w_w_Y_Y_w_w_w_w_w_Y_Y_w_w_G_w_w_w_Y_Y_w_w_w_Y _G_w_G_w_G_G_G_G_G_w_w_Y_Y_Y_Y_Y_w_Y_Y_Y_w_G_G_G_w_w_w_Y_w_G_w_Y _G_w_G_G_G_G_G_w_w_w_Y_Y_w_w_w_Y_Y_Y_Y_w_w_G_G_w_G_w_w_Y_w_G_w_Y _G_w_w_w_w_w_w_w_Y_Y_w_w_w_G_w_w_w_Y_Y_w_G_G_G_G_G_w_w_Y_w_w_w_Y _G_Y_Y_Y_Y_Y_Y_Y_Y_w_w_G_G_G_G_G_w_w_Y_w_w_G_w_G_G_w_Y_Y_w_G_w_Y _G_w_w_w_w_w_Y_Y_Y_w_G_G_G_w_G_G_G_w_Y_w_G_G_w_G_G_w_Y_w_w_G_w_Y _G_w_w_w_w_w_w_w_Y_w_w_G_G_G_G_G_w_w_Y_w_w_G_G_w_G_w_Y_w_w_w_Y_Y _G_w_w_G_G_G_G_w_Y_Y_w_w_w_w_w_w_w_Y_Y_Y_w_w_G_G_G_w_Y_Y_Y_Y_Y_Y _G_w_G_w_G_G_G_w_w_Y_Y_w_w_Y_Y_Y_Y_Y_Y_Y_Y_w_w_G_w_Y_Y_w_w_w_Y_Y _G_w_G_G_G_w_G_G_w_w_Y_Y_Y_Y_w_w_w_w_w_w_w_Y_Y_w_w_Y_w_w_G_w_w_Y _G_w_G_G_G_G_G_G_G_w_Y_Y_Y_w_w_w_w_G_w_G_w_w_w_Y_Y_Y_w_G_G_G_w_Y _G_w_G_w_G_G_G_G_G_w_w_Y_w_w_G_G_G_G_G_w_G_G_w_w_Y_Y_w_G_w_G_w_Y _G_w_G_G_w_G_G_G_G_w_w_Y_w_G_G_w_G_G_G_G_G_G_G_w_w_Y_w_G_G_G_w_Y _G_w_G_G_G_G_G_w_G_w_w_Y_w_w_G_G_G_w_G_G_w_G_G_w_w_Y_w_w_G_G_w_Y _G_w_w_G_G_G_G_G_w_w_w_Y_w_w_w_G_G_G_G_G_G_G_w_w_Y_Y_w_G_G_w_w_Y _G_w_w_w_w_w_w_w_w_w_Y_Y_Y_w_w_w_w_w_w_w_w_w_w_Y_Y_Y_Y_w_w_w_Y_Y _w_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y } # tile 18 (corridor) { _w_w_w_w_w_w_w_w_w_w_w_w_w_w_w_w_w_w_w_w_w_w_w_w_w_w_w_w_wAB_w_Y _wA2A2_w_Y_w_Y_YA2A2_Y_Y_w_w_Y_Y_Y_w_Y_Y_Y_Y_YA2A2A2_w_w_Y_Y____ _wA2_w_Y_w_Y_Y_Y_YA2A2A2_w_Y_Y_wAB_Y_Y_Y_Y_Y_Y_YA2_wAB_Y_YAB_Y__ _w_Y_w_Y_w_Y_w_Y_YA2A2A2_Y_Y_w_Y_Y_Y_w_Y_w_Y_Y_YA2_wAB_w_Y_Y_Y__ _w_YAB_w_Y_Y_Y_Y_Y_YA2_w_w_YAB_Y_w_Y_Y_Y_Y_w_Y_YA2_w_Y_Y_w_Y_Y__ _w_Y_w_Y_Y_YAB_Y_Y_YA2_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_Y_YA2_Y_Y_YAB_Y_Y_Y__ _w_w_Y_Y_w_Y_Y_Y_w_YA2A2_YA2A2A2A2A2A2_Y_YA2A2A2A2A2_Y_Y_Y_Y_Y__ _w_Y_Y_Y_YABAB_Y_Y_YA2A2A2_wAB_YABABA2A2A2A2_w_w_YA2A2A2A2_Y_Y__ _w_Y_Y_w_Y_w_YAB_YA2A2_w_w_Y_Y_Y_Y_Y_YA2A2_w_Y_Y_Y_Y_Y_YA2A2A2A2 _w_Y_Y_Y_Y_Y_Y_Y_YA2_w_YAB_Y_Y_Y_w_Y_Y_YA2_Y_w_Y_w_YAB_Y_YA2A2A2 _wA2A2_Y_YA2A2A2A2A2_w_Y_w_Y_Y_w_Y_w_Y_YA2_w_w_Y_Y_w_Y_Y_Y_YA2A2 _wA2A2A2A2_w_Y_Y_YA2_wAB_Y_w_Y_Y_Y_Y_Y_YA2_w_Y_w_Y_Y_Y_YA2A2A2A2 _w_Y_w_w_w_Y_w_Y_Y_YA2_w_Y_Y_YAB_Y_Y_w_YA2A2_Y_Y_Y_YA2A2A2A2_w__ _w_w_Y_Y_Y_w_Y_w_Y_YA2_w_Y_Y_w_Y_Y_Y_Y_YA2A2A2A2A2A2A2A2A2_w_Y__ _w_wAB_Y_Y_Y_YAB_w_YA2A2AB_Y_Y_Y_Y_Y_YA2A2_w_w_Y_YA2A2A2_w_Y_Y__ _w_Y_Y_w_Y_Y_YAB_Y_Y_YA2A2_Y_Y_Y_YABA2A2_w_Y_Y_Y_Y_YA2A2_w_Y_Y__ _w_Y_w_YAB_Y_w_YAB_Y_YA2A2A2A2A2ABA2A2A2_w_Y_Y_w_Y_Y_YA2_Y_w_Y__ _w_Y_Y_Y_Y_Y_Y_Y_Y_YA2A2_Y_w_YA2A2A2A2_wABAB_Y_Y_YAB_YA2_w_Y_Y__ _wA2_Y_Y_Y_Y_Y_YA2A2_w_w_Y_w_Y_Y_YA2A2_Y_w_Y_w_Y_Y_Y_YA2_Y_Y_Y__ _wA2A2A2A2A2A2A2A2_w_Y_Y_YAB_Y_Y_Y_YA2_w_Y_Y_Y_Y_Y_YA2A2_Y_w_Y__ _wA2A2_w_w_wA2A2A2_w_Y_w_YAB_Y_Y_Y_YA2_w_Y_Y_YAB_Y_YA2_Y_Y_Y_Y__ _w_w_w_Y_Y_Y_w_YA2_Y_Y_Y_w_Y_Y_w_YABA2_Y_Y_Y_w_Y_Y_YA2_Y_Y_YA2A2 _w_Y_Y_w_Y_w_Y_YA2A2_Y_Y_Y_Y_Y_YABA2A2A2_Y_Y_Y_Y_YABA2A2A2A2A2A2 _w_Y_w_Y_w_Y_YAB_YA2A2_Y_Y_YA2A2A2A2A2A2A2_Y_Y_YABA2A2_w_Y_YA2A2 _w_w_Y_YAB_Y_Y_Y_Y_YA2A2A2A2_w_w_w_w_Y_Y_YA2A2ABABA2_w_Y_w_Y_Y__ _w_Y_YABAB_Y_w_Y_Y_YA2A2A2_w_Y_w_Y_Y_Y_w_Y_Y_YA2A2A2_w_w_Y_Y_Y__ _w_Y_Y_Y_Y_Y_Y_Y_Y_Y_YA2_w_Y_Y_YAB_Y_Y_Y_Y_Y_Y_YA2A2_w_Y_YAB_Y__ _w_Y_YAB_Y_w_w_Y_w_Y_YA2_w_w_Y_w_Y_Y_w_Y_Y_Y_Y_Y_YA2_w_Y_w_Y_Y__ _w_Y_Y_Y_Y_Y_Y_Y_Y_Y_YA2_w_Y_Y_Y_YAB_w_Y_Y_w_Y_Y_YA2_Y_Y_Y_Y_Y__ _w_Y_Y_Y_YAB_Y_Y_Y_Y_YA2_Y_Y_Y_w_w_Y_Y_Y_w_Y_YABA2A2_Y_YAB_Y_Y__ _wA2_Y_Y_Y_Y_Y_Y_Y_YA2A2A2_Y_Y_Y_Y_Y_Y_Y_Y_YABA2A2A2A2_Y_Y_YA2A2 _YA2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2 } # tile 19 (lit corridor) { _G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_G_G _GA2A2_w_Y_w_Y_YA2A2_Y_Y_w_G_Y_w_Y_w_G_w_Y_Y_YA2A2A2_G_G_w_Y____ _GA2_w_G_w_Y_w_w_YA2A2A2_G_G_G_w_G_Y_Y_Y_w_G_w_YA2_G_G_w_GAB_Y__ _G_w_G_Y_G_w_G_Y_GA2A2A2_G_G_w_w_Y_Y_w_Y_w_Y_w_YA2_G_w_G_w_G_Y__ _G_G_G_G_G_w_w_Y_Y_YA2_w_G_w_w_G_G_G_Y_w_Y_G_Y_YA2_w_G_w_w_G_Y__ _G_w_G_G_w_w_G_w_Y_YA2_Y_w_G_w_G_Y_Y_w_G_Y_Y_wA2_Y_w_G_G_Y_w_w__ _G_w_Y_w_w_Y_Y_w_G_YA2A2_YA2A2A2A2A2A2_Y_YA2A2A2A2A2_w_Y_G_Y_Y__ _G_G_w_G_Y_GAB_Y_Y_YA2A2A2_GAB_wABABA2A2A2A2_G_G_wA2A2A2A2_Y_Y__ _G_w_w_w_Y_w_YAB_YA2A2_G_G_w_G_Y_w_G_YA2A2_w_G_w_G_Y_G_YA2A2A2A2 _G_Y_Y_Y_Y_Y_Y_G_YA2_w_G_G_G_w_Y_w_Y_w_YA2_G_w_G_w_YAB_G_YA2A2A2 _GA2A2_Y_YA2A2A2A2A2_G_w_G_w_Y_G_G_w_Y_YA2_G_G_G_Y_G_Y_Y_Y_YA2A2 _GA2A2A2A2_G_G_Y_YA2_G_G_G_G_w_G_Y_Y_w_YA2_G_G_w_Y_w_w_YA2A2A2A2 _G_Y_G_G_G_Y_w_Y_Y_YA2_w_G_w_Y_w_w_G_w_YA2A2_G_Y_w_YA2A2A2A2_G__ _G_G_Y_G_Y_w_Y_w_G_YA2_G_w_Y_w_w_Y_Y_G_YA2A2A2A2A2A2A2A2A2_w_Y__ _G_w_G_w_G_Y_w_G_w_YA2A2_G_w_G_w_Y_w_YA2A2_G_w_Y_YA2A2A2_w_G_w__ _G_G_Y_G_w_Y_wAB_Y_Y_YA2A2_G_w_Y_GABA2A2_G_G_G_Y_w_YA2A2_G_w_G__ _G_Y_w_GAB_G_w_GAB_G_YA2A2A2A2A2ABA2A2A2_w_G_Y_w_Y_Y_wA2_G_w_w__ _G_Y_G_w_w_G_w_Y_Y_YA2A2_G_w_wA2A2A2A2_G_G_w_G_w_wAB_YA2_w_G_Y__ _GA2_Y_G_G_Y_Y_YA2A2_w_G_Y_w_Y_w_GA2A2_G_w_Y_G_w_Y_w_YA2_Y_w_w__ _GA2A2A2A2A2A2A2A2_w_G_G_GAB_G_w_w_wA2_w_G_Y_Y_w_w_YA2A2_w_w_Y__ _GA2A2_G_G_wA2A2A2_G_G_G_Y_w_G_w_G_YA2_w_Y_w_w_w_Y_wA2_w_G_w_Y__ _G_G_G_G_w_Y_w_YA2_G_G_w_w_Y_w_w_YABA2_G_w_Y_G_Y_Y_YA2_Y_w_YA2A2 _G_G_Y_G_w_w_Y_YA2A2_G_w_Y_G_Y_YABA2A2A2_Y_G_G_G_wABA2A2A2A2A2A2 _G_G_G_Y_w_Y_Y_w_YA2A2_Y_w_YA2A2A2A2A2A2A2_G_Y_YABA2A2_w_G_GA2A2 _G_G_Y_w_G_w_Y_w_Y_YA2A2A2A2_G_G_w_G_Y_w_YA2A2ABABA2_w_G_w_w_Y__ _G_Y_w_G_w_w_w_Y_w_YA2A2A2_G_G_w_Y_G_Y_w_Y_G_YA2A2A2_G_w_G_w_G__ _G_G_Y_Y_w_Y_Y_Y_w_Y_YA2_w_G_G_Y_w_w_w_w_w_Y_Y_YA2A2_G_G_w_G_Y__ _G_Y_w_G_w_w_w_Y_w_Y_YA2_G_w_w_G_Y_Y_G_Y_Y_Y_G_Y_YA2_w_G_w_w_Y__ _G_w_G_w_w_Y_w_Y_Y_Y_YA2_G_w_G_Y_wAB_w_Y_Y_w_Y_Y_GA2_G_w_G_G_Y__ _G_Y_w_G_G_w_w_Y_Y_Y_wA2_Y_G_w_w_w_G_Y_Y_G_Y_GABA2A2_Y_GAB_Y_w__ _GA2_Y_w_w_Y_Y_Y_Y_YA2A2A2_G_w_Y_G_Y_G_G_Y_YABA2A2A2A2_Y_w_YA2A2 _GA2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2 } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/share/thintile.c��������������������������������������������������������������0000664�0000764�0000764�00000003477�10545462320�015544� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* SCCS Id: @(#)thintile.c 3.4 1995/11/26 */ /* Copyright (c) NetHack Development Team 1995 */ /* NetHack may be freely redistributed. See license for details. */ /* Create a set of overview tiles by eliminating even pixels in original */ #include "config.h" #include "tile.h" #ifdef __GO32__ #include <unistd.h> #endif static char *tilefiles[] = { "../win/share/monsters.txt", "../win/share/objects.txt", "../win/share/other.txt"}; static char *thinfiles[] = { "../win/share/monthin.txt", "../win/share/objthin.txt", "../win/share/oththin.txt"}; static int tilecount; static int tilecount_per_file; static int filenum; static int write_thintile(pixels, ttype, number, name) pixel (*pixels)[MAX_TILE_X]; const char *ttype; int number; const char *name; { int i, j; int retval; pixel thinpixels[MAX_TILE_Y][MAX_TILE_X]; for (j = 0; j < tile_y; j++) for (i = 0; i < tile_x; i+=2) { thinpixels[j][i/2] = pixels[j][i]; } tile_x /= 2; retval = write_text_tile_info(thinpixels, ttype, number, name); tile_x *= 2; return retval; } int main(argc, argv) int argc; char *argv[]; { int tile_no; char buf[BUFSZ], ttype[BUFSZ]; pixel pixels[MAX_TILE_Y][MAX_TILE_X]; while (filenum < 3) { tilecount_per_file = 0; if (!fopen_text_file(tilefiles[filenum], RDTMODE)) exit(EXIT_FAILURE); if (!fopen_text_file(thinfiles[filenum], WRTMODE)) exit(EXIT_FAILURE); while (read_text_tile_info(pixels, ttype, &tile_no, buf)) { write_thintile(pixels, ttype, tile_no, buf); tilecount_per_file++; tilecount++; } fclose_text_file(); printf("%d tiles processed from %s\n", tilecount_per_file, tilefiles[filenum]); ++filenum; } printf("Grand total of %d tiles processed.\n", tilecount); exit(EXIT_SUCCESS); /*NOTREACHED*/ return 0; } /*thintile.c*/ �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/share/scripts/����������������������������������������������������������������0000775�0000764�0000764�00000000000�10545462320�015234� 5����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/share/scripts/obj32mix.txt����������������������������������������������������0000664�0000764�0000764�00000021061�10545462320�017432� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������__ = (0, 0, 0) _A = (128, 96, 0) _B = (128, 255, 128) _C = (0, 0, 192) _D = (168, 224, 224) _E = (96, 48, 48) _F = (128, 64, 0) _G = (32, 64, 64) _H = (0, 112, 224) _I = (192, 96, 96) _J = (48, 96, 0) _K = (117, 105, 88) _L = (224, 192, 160) _M = (168, 168, 224) _N = (128, 32, 0) _O = (96, 0, 48) _P = (64, 128, 128) _Q = (255, 128, 128) _R = (128, 0, 255) _S = (0, 64, 32) _T = (128, 0, 0) _U = (48, 48, 0) _V = (96, 192, 0) _W = (48, 36, 0) _X = (96, 192, 192) _Y = (0, 32, 32) _Z = (48, 24, 0) _a = (48, 12, 0) _b = (128, 112, 32) _c = (64, 64, 128) _d = (192, 0, 96) _e = (48, 0, 0) _f = (0, 0, 224) _g = (224, 224, 0) _h = (0, 128, 64) _i = (0, 255, 255) _j = (64, 0, 128) _k = (96, 96, 0) _l = (0, 255, 0) _m = (255, 0, 128) _n = (96, 96, 192) _o = (96, 72, 0) _p = (104, 84, 31) _q = (224, 168, 0) _r = (0, 64, 64) _s = (96, 48, 0) _t = (248, 224, 96) _u = (224, 224, 112) _v = (202, 143, 114) _w = (24, 48, 48) _x = (144, 192, 192) _y = (0, 192, 96) _z = (0, 32, 64) _0 = (96, 24, 0) _1 = (128, 128, 64) _2 = (24, 24, 48) _3 = (224, 112, 0) _4 = (240, 240, 240) _5 = (0, 48, 24) _6 = (128, 255, 255) _7 = (96, 0, 0) _8 = (128, 255, 0) _9 = (0, 0, 64) _$ = (96, 0, 192) A_ = (144, 144, 192) AA = (255, 192, 255) AB = (0, 24, 24) AC = (255, 192, 0) AD = (255, 192, 192) AE = (224, 224, 224) AF = (16, 16, 0) AG = (128, 64, 64) AH = (224, 56, 0) AI = (170, 136, 52) AJ = (16, 0, 0) AK = (224, 112, 112) AL = (0, 96, 96) AM = (208, 208, 208) AN = (64, 128, 0) AO = (255, 128, 255) AP = (255, 128, 0) AQ = (224, 168, 224) AR = (224, 0, 0) AS = (128, 0, 64) AT = (192, 192, 255) AU = (192, 192, 0) AV = (0, 48, 96) AW = (255, 255, 128) AX = (192, 192, 192) AY = (168, 224, 168) AZ = (128, 128, 96) Aa = (112, 224, 0) Ab = (64, 64, 0) Ac = (127, 90, 72) Ad = (224, 112, 224) Ae = (48, 48, 24) Af = (255, 64, 0) Ag = (64, 48, 0) Ah = (192, 144, 0) Ai = (176, 176, 176) Aj = (0, 0, 96) Ak = (128, 96, 96) Al = (192, 144, 192) Am = (48, 24, 24) An = (64, 32, 0) Ao = (224, 0, 112) Ap = (24, 48, 0) Aq = (0, 128, 128) Ar = (64, 16, 0) As = (144, 192, 144) At = (160, 160, 160) Au = (64, 0, 0) Av = (192, 96, 0) Aw = (255, 0, 255) Ax = (24, 24, 0) Ay = (255, 0, 0) Az = (192, 96, 192) A0 = (112, 224, 112) A1 = (48, 96, 96) A2 = (0, 16, 16) A3 = (120, 160, 160) A4 = (24, 0, 0) A5 = (0, 0, 16) A6 = (160, 160, 120) A7 = (160, 120, 160) A8 = (144, 144, 144) A9 = (0, 64, 128) A$ = (192, 48, 0) B_ = (80, 160, 160) BA = (224, 0, 224) BB = (48, 48, 96) BC = (120, 160, 120) BD = (120, 120, 160) BE = (96, 192, 96) BF = (160, 160, 80) BG = (160, 120, 120) BH = (160, 80, 160) BI = (128, 128, 128) BJ = (0, 96, 48) BK = (64, 64, 32) BL = (112, 224, 224) BM = (192, 0, 0) BN = (192, 0, 192) BO = (0, 160, 160) BP = (0, 0, 128) BQ = (71, 108, 108) BR = (128, 96, 128) BS = (112, 112, 112) BT = (64, 32, 32) BU = (80, 160, 80) BV = (80, 80, 160) BW = (96, 128, 96) BX = (0, 48, 48) BY = (192, 192, 144) BZ = (32, 64, 0) Ba = (128, 64, 128) Bb = (160, 160, 0) Bc = (160, 80, 80) Bd = (64, 0, 32) Be = (160, 0, 160) Bf = (96, 96, 96) Bg = (252, 252, 153) Bh = (32, 32, 0) Bi = (0, 160, 80) Bj = (64, 128, 64) Bk = (160, 120, 0) Bl = (0, 0, 48) Bm = (0, 80, 160) Bn = (192, 144, 144) Bo = (0, 224, 0) Bp = (80, 160, 0) Bq = (112, 112, 224) Br = (80, 80, 80) Bs = (32, 0, 0) Bt = (128, 0, 128) Bu = (80, 0, 160) Bv = (255, 255, 255) Bw = (96, 48, 96) Bx = (242, 196, 77) By = (208, 168, 80) Bz = (255, 255, 0) B0 = (255, 255, 192) B1 = (0, 192, 0) B2 = (160, 80, 0) B3 = (160, 0, 80) B4 = (0, 192, 192) B5 = (165, 118, 94) B6 = (48, 96, 48) B7 = (64, 64, 64) B8 = (192, 160, 64) B9 = (224, 224, 168) B$ = (0, 160, 0) C_ = (96, 0, 96) CA = (160, 40, 0) CB = (0, 0, 160) CC = (0, 224, 112) CD = (64, 32, 64) CE = (0, 128, 255) CF = (0, 128, 0) CG = (96, 128, 128) CH = (48, 48, 48) CI = (229, 162, 130) CJ = (32, 64, 32) CK = (192, 255, 255) CL = (171, 154, 129) CM = (160, 0, 0) CN = (224, 168, 168) CO = (145, 135, 110) CP = (64, 0, 64) CQ = (192, 255, 192) CR = (112, 0, 224) CS = (0, 96, 0) CT = (96, 96, 128) CU = (0, 255, 128) CV = (0, 96, 192) CW = (24, 48, 24) CX = (255, 211, 175) CY = (32, 32, 32) CZ = (48, 0, 48) Ca = (0, 64, 0) Cb = (0, 224, 224) Cc = (32, 0, 32) Cd = (0, 48, 0) Ce = (192, 192, 96) Cf = (16, 16, 16) Cg = (128, 128, 255) Ch = (0, 32, 0) Ci = (128, 128, 0) Cj = (255, 182, 145) Ck = (16, 0, 16) Cl = (0, 24, 0) Cm = (96, 96, 48) Cn = (0, 16, 0) Co = (0, 0, 255) # tile 302 (leather / detect monsters) { BQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQ BQBQBQBQBQBQBQBQBQBQBQBQBQBQBQ_T_T_TBQBQBQBQBQBQBQBQBQBQBQBQBQBQ BQBQBQBQBQBQBQBQBQBQBQBQBQBQ_7_T_T_7_7_7BQBQBQBQBQBQBQBQBQBQBQBQ BQBQBQBQBQBQBQBQBQBQBQBQBQ_T_T_7_7_T_T_T_7_TBQBQBQBQBQBQBQBQBQBQ BQBQBQBQBQBQBQBQBQBQBQBQ_T_T_T_7_T_T_T_7_T_T_T_7BQBQBQBQBQBQBQBQ BQBQBQBQBQBQBQBQBQBQBQ_T_7_T_7_7_7_T_7_T_T_T_7_T_T_TBQBQBQBQBQBQ BQBQBQBQBQBQBQBQBQBQ_T_T_7_7_T_T_7_7_T_T_7_7_T_T_7_T_TBQBQBQBQBQ BQBQBQBQBQBQBQBQBQ_T_7_T_7_T_T_T_7_T_T_T_7_T_T_T_7_T_T_T_7BQBQBQ BQBQBQBQBQBQBQBQ_T_T_T_T_T_7_7_7_T_7_T_T_7_T_T_T_7_T_T_7_T_7BQBQ BQBQBQBQBQBQBQ_T_7_7_7_T_T_T_T_7_7_T_7_T_7_T_7_7_T_T_7_T_T_7AuBQ BQBQBQBQBQBQ_7_T_T_T_T_7_T_T_7_T_T_T_T_7_7_7_7_T_7_7_7_T_7_7AuBQ BQBQBQBQBQ_T_7_T_T_7_7_T_T_7_7_7_7_7_7_T_7_T_7_T_T_T_T_7_7AuAu__ BQBQBQBQ_7_T_T_7_T_7_T_7_7_T_7_T_T_7_T_T_T_7_7_T_T_T_7_7AuAu_e__ BQBQBQ_T_7_T_T_7_T_7_T_T_7_T_T_7_7_T_7_7_T_T_7_T_T_7AhAuAu_eCn__ BQBQ_T_T_T_7_7_T_T_7_T_T_T_7_T_7_T_7_T_7_T_T_7_T_7_7AuBk_eCn____ BQ_T_T_T_T_7_T_T_T_7_T_T_T_7_T_7_T_T_7_T_7_7_T_7_7AuAuBkCn____BQ _T_7_T_7_7_7_T_T_T_7_T_7_7_T_7_T_7_T_7_T_T_T_7_7AuAu_e_A____BQBQ _T_T_7_T_T_T_T_7_7_7_7_T_T_7_7_7_T_T_T_7_T_7_7AuAu_eCn____BQBQBQ BQ_T_T_T_T_7_7_7_T_T_7_7_7_T_T_7_T_7_T_T_7_7AuAu_eCn____BQBQBQBQ BQAiAi_T_T_T_T_T_7_T_T_T_T_T_T_7_T_7_T_7_7AuAu_eCn____BQBQBQBQBQ BQAXAXAiAi_T_T_T_7_T_T_T_T_T_7_7_T_T_7_7AuAu_eCn____BQBQBQBQBQBQ BQAMAMAXAXAiAi_T_7_T_7_7_7_7_T_7_T_7_7AuAu_eCn____BQBQBQBQBQBQBQ _TAMAMAMAMAXAXAiAi_T_T_T_7_T_T_T_7_7AuAu_eCn____BQBQBQBQBQBQBQBQ ___T_TAMAMAMAMAXAXAiAi_T_7_T_T_7_7AuAu_eCn____BQBQBQBQBQBQBQBQBQ BQ_____T_TAMAMAMAMAXAXAiAi_T_7_7AuAu_eCn____BQBQBQBQBQBQBQBQBQBQ BQBQBQ_____T_TAMAMAMAMAXAXAi_7AuAu_eCn____BQBQBQBQBQBQBQBQBQBQBQ BQBQBQBQBQ_____T_TAMAMAMAMAX_7Au_eCn____BQBQBQBQBQBQBQBQBQBQBQBQ BQBQBQBQBQBQBQ_____T_TAMAMAXAu_eCn____BQBQBQBQBQBQBQBQBQBQBQBQBQ BQBQBQBQBQBQBQBQBQ_____T_TAiAuCn____BQBQBQBQBQBQBQBQBQBQBQBQBQBQ BQBQBQBQBQBQBQBQBQBQBQ_____eCn____BQBQBQBQBQBQBQBQBQBQBQBQBQBQBQ BQBQBQBQBQBQBQBQBQBQBQBQBQ______BQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQ BQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQ } # tile 320 (light brown / restore ability) { BQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQ BQBQBQBQBQBQBQBQBQBQBQBQBQBQBQAKAK_IBQBQBQBQBQBQBQBQBQBQBQBQBQBQ BQBQBQBQBQBQBQBQBQBQBQBQBQBQ_IAK_I_IAKAKBQBQBQBQBQBQBQBQBQBQBQBQ BQBQBQBQBQBQBQBQBQBQBQBQBQAK_I_I_IAKAK_IAKAKBQBQBQBQBQBQBQBQBQBQ BQBQBQBQBQBQBQBQBQBQBQBQAKAK_I_IAKAKAK_IAK_IAK_IBQBQBQBQBQBQBQBQ BQBQBQBQBQBQBQBQBQBQBQ_I_IAK_I_I_IAKAK_IAK_I_I_IAKAKBQBQBQBQBQBQ BQBQBQBQBQBQBQBQBQBQAKAK_I_IAK_IAKAKAKAK_I_IAKAK_IAK_IBQBQBQBQBQ BQBQBQBQBQBQBQBQBQAKAK_IAK_I_I_I_I_IAK_I_IAKAKAK_IAK_IAKAKBQBQBQ BQBQBQBQBQBQBQBQ_IAKAKAK_I_IAKAK_IAK_I_I_IAKAK_I_IAK_IAK_I_IBQBQ BQBQBQBQBQBQBQ_I_IAK_I_I_IAKAKAKAK_I_IAK_I_IAK_IAK_IAK_IAK_IBcBQ BQBQBQBQBQBQAKAK_I_I_IAKAK_IAK_I_IAK_IAKAK_I_IAKAK_I_IAK_I_IBcBQ BQBQBQBQBQ_IAKAKAK_I_IAKAK_I_IAKAKAK_IAKAK_I_I_IAK_I_I_I_IBcBc__ BQBQBQBQ_I_IAKAKAK_IAK_I_IAK_I_IAKAK_I_IAKAK_I_I_IAK_I_IBcBcAG__ BQBQBQAKAK_IAKAK_IAK_IAKAK_I_I_IAKAKAK_I_I_IAK_IAK_IBkBcBcAG_E__ BQBQAKAKAK_IAK_IAK_I_IAKAK_IAK_I_I_I_I_IAK_IAKAK_I_IBcBkAG_E____ BQ_IAKAK_I_I_I_IAK_IAKAKAK_I_I_IAK_IAK_I_IAK_I_I_IBcBcBk_E____BQ _IAK_I_I_I_IAKAK_I_IAKAK_I_I_IAK_I_IAK_IAK_I_I_IBcBcAG_A____BQBQ AKAK_IAKAK_IAKAKAK_IAK_I_I_I_IAKAKAKAK_I_I_I_IBcBcAG_E____BQBQBQ BQAK_IAKAK_I_IAK_IAKAK_IAKAK_I_IAKAKAKAK_I_IBcBcAG_E____BQBQBQBQ BQAiAiAKAK_IAK_IAKAK_I_IAKAKAK_I_IAK_I_I_IBcBcAG_E____BQBQBQBQBQ BQAXAXAiAi_I_IAKAK_I_I_I_I_IAKAKAK_I_I_IBcBcAG_E____BQBQBQBQBQBQ BQAMAMAXAXAiAi_I_I_I_IAKAK_I_I_I_IAK_IBcBcAG_E____BQBQBQBQBQBQBQ _IAMAMAMAMAXAXAiAi_IAK_IAK_IAKAKAK_IBcBcAG_E____BQBQBQBQBQBQBQBQ ___I_IAMAMAMAMAXAXAiAi_I_IAKAK_I_IBcBcAG_E____BQBQBQBQBQBQBQBQBQ BQ_____I_IAMAMAMAMAXAXAiAi_I_I_IBcBcAG_E____BQBQBQBQBQBQBQBQBQBQ BQBQBQ_____I_IAMAMAMAMAXAXAi_IBcBcAG_E____BQBQBQBQBQBQBQBQBQBQBQ BQBQBQBQBQ_____I_IAMAMAMAMAX_IBcAG_E____BQBQBQBQBQBQBQBQBQBQBQBQ BQBQBQBQBQBQBQ_____I_IAMAMAXBcAG_E____BQBQBQBQBQBQBQBQBQBQBQBQBQ BQBQBQBQBQBQBQBQBQ_____I_IAiBc_E____BQBQBQBQBQBQBQBQBQBQBQBQBQBQ BQBQBQBQBQBQBQBQBQBQBQ____AG_E____BQBQBQBQBQBQBQBQBQBQBQBQBQBQBQ BQBQBQBQBQBQBQBQBQBQBQBQBQ______BQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQ BQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQ } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/share/scripts/import-mi.sh����������������������������������������������������0000664�0000764�0000764�00000021264�10545462320�017512� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/sh # # Copyright (c) J. Ali Harlow 2003 # NetHack may be freely redistributed. See license for details. # # This shell script imports Mitshurio Itakura's tilesets from # his diy package. You must have a copy of this package first! # diy.tgz is available from # http://www.geocities.co.jp/SiliconValley-SanJose/9606/nh/eng.html # It should be unpacked into a suitable direcory and the variable # below set to point at it. # # There appear to be a few tiles that didn't make it into diy. These # are included as mon32mix.txt and obj32mix.txt (which were imported # from t32-1024.xpm). Hopefully the need for these files should go # away in future. # # Finally, you need xpm2txt, txtfilt and txtmerge. These can be created # by running "make tileutils" in the util directory. # # Output is in the current directory. You must copy it by hand into # win/share if so desired. # # Configuration variables # input=diy tilemap=mi palette=../palette.txt extra_mon=mon32mix.txt extra_obj=obj32mix.txt xpm2txt=../../../util/xpm2txt txtfilt=../../../util/txtfilt txtmerge=../../../util/txtmerge # # Functions # set -e generate_palette() # Usage: generate_palette <input-txt> <output-ppm> { awk '/^[A-Za-z$_]+[ ]*=[ ]*\([0-9][0-9]*,[ ]*[0-9][0-9]*,[ ]*[0-9][0-9]*\)$/ {print}' $1 > /tmp/pal$$.txt echo P3 1 `wc -l /tmp/pal$$.txt | awk '{print $1}'` 255 > $2 sed -e 's/.*(\(.*\))/\1/' -e 's/,[ ]*/ /g' < /tmp/pal$$.txt >> $2 rm -f /tmp/pal$$.txt } generate_tilemap() # Usage: generate_tilemap <tilemap> <input> { tr -d '\015' < $2 | grep -v '^#' | awk "BEGIN {subset=\"monsters\"; \ cmap[67]=\"dig beam\"; \ cmap[68]=\"camera flash\"; \ cmap[69]=\"thrown boomerang, open left\"; \ cmap[70]=\"thrown boomerang, open right\"; \ cmap[71]=\"magic shield 1\"; \ cmap[72]=\"magic shield 2\"; \ cmap[73]=\"magic shield 3\"; \ cmap[74]=\"magic shield 4\"; \ cmap[75]=\"swallow top left\"; \ cmap[76]=\"swallow top center\"; \ cmap[77]=\"swallow top right\"; \ cmap[78]=\"swallow middle left\"; \ cmap[79]=\"swallow middle right\"; \ cmap[80]=\"swallow bottom left\"; \ cmap[81]=\"swallow bottom center\"; \ cmap[82]=\"swallow bottom right\"; \ } \ { \ id=\$1; \ \$1=\"\"; \ if (\$0 == \" strange object\") \ subset=\"objects\"; \ else if (\$0 == \" wall\") \ subset=\"other\"; \ else if (\$0 == \" blank\") \ subset=\"special\"; \ if (\$2 == \"explode\" || \$2 == \"cmap\" && \ \$3 + 0 >= 83 && \$3 + 0 <= 91) { \ \$2 = \"explosion\"; \ if (\$3 == \"black\") \ \$3 = \"dark\"; \ else if (\$3 == \"green\") \ \$3 = \"noxious\"; \ else if (\$3 == \"brown\") \ \$3 = \"muddy\"; \ else if (\$3 == \"blue\") \ \$3 = \"wet\"; \ else if (\$3 == \"purple\") \ \$3 = \"magical\"; \ else if (\$3 == \"darkblue\") \ \$3 = \"frosty\"; \ else { \ \$4 = \$3; \ \$3 = \"fiery\"; \ } \ \$4 = \$4 - 83; \ } else if (\$2 == \"cmap\" && cmap[\$3]\"\" != \"\") \ { \ \$4 = cmap[\$3]; \ \$3 = \"/\"; \ } else if (\$0 == \" anti-magic trap field\") \ { \ \$3 = \$4; \ NF--; \ } else if (\$0 == \" beholder\") \ \$2 = \"Beholder\"; \ printf(\"%s@%s@\",\"$1\",subset); \ for(i=2;i<NF;i++) \ printf(\"%s \",\$i); \ printf(\"%s@%s\\n\",\$NF,id); \ }" > ${tilemap}.tile fgrep "@monsters@" ${tilemap}.tile > ${tilemap}-monsters.tile fgrep "@objects@" ${tilemap}.tile > ${tilemap}-objects.tile fgrep "@other@" ${tilemap}.tile > ${tilemap}-other.tile rm -f ${tilemap}.tile } addtile() # Usage: addtile <output> <id> <name> <input> { ad_output=$1 ad_id=$2 ad_name=$3 ad_input=$4 ad_sed=`echo ${ad_output} | sed 's/\.[^.]*$/.sed/'` if test -r $ad_output; then pnmcat -lr $ad_output $ad_input > /tmp/ad$$.pnm || exit 1 mv /tmp/ad$$.pnm $ad_output ad_count=`echo ${ad_count} + 1 | bc` else rm -f ${ad_sed} anytopnm $ad_input > $ad_output || exit 1 ad_count=0 fi # Some special cases for spellbooks that Slash'em has a different # mapping between description and name from NetHack 3.3.0. # By removing the name, we allow txtmerge to match them. oc_descr=`echo $ad_name | sed 's: /.*::'` case "$oc_descr" in "dull"|"thin") ad_name=$oc_descr;; esac echo "s£^# tile ${ad_count} (unknown)£# tile ${ad_id} ($ad_name)£" >> ${ad_sed} } import() # Usage: import <tileset> <sub> # tileset can be either 32 or 3d { tileset=$1 long=$2 short=`echo $long | sed 's/^\(...\).*/\1/'` ex_output=${short}${tileset}mi if test "$tileset" = "32"; then key="p" elif test "$tileset" = "3d"; then key="b" else echo "Error: import: tileset unknown \"${tileset}\"" fi if test "$tileset" = "32"; then ppmmake rgb:47/6c/6c 32 32 > background.ppm else ppmmake rgb:47/6c/6c 48 64 > background.ppm fi rm -f ${ex_output}.ppm ${ex_output}-fs.ppm # We maintain both an undithered and a dithered collection. # The undithered collection is used to filter out tiles which # are simply a magnification of the 16x16 tiles. The dithered # collection are used for the final tile bitmaps. cat ${tilemap}-${long}.tile | while read line; do tag=`echo $line | sed 's:.*@\([^@]*\)$:\1:'` name=`echo $line | sed 's:.*@\([^@]*\)@[^@]*$:\1:'` bmp=$input/${key}xxx/$tag.bmp if test -r $bmp; then bmptoppm $bmp > /tmp/et$$.ppm 2> /dev/null ppmcolormask rgb:47/6c/6c /tmp/et$$.ppm > /tmp/et$$.pbm ppmquant -map palette.ppm /tmp/et$$.ppm 2> /dev/null | \ ppmchange rgb:47/6c/6c rgb:48/6c/6c | \ pnmcomp -alpha=/tmp/et$$.pbm background.ppm > /tmp/et-2$$.ppm addtile ${ex_output}.ppm 0 "$name" /tmp/et-2$$.ppm rm -f /tmp/et$$.ppm /tmp/et$$-2.ppm /tmp/et$$.pbm fi done || exit 1 cat ${tilemap}-${long}.tile | while read line; do tag=`echo $line | sed 's:.*@\([^@]*\)$:\1:'` name=`echo $line | sed 's:.*@\([^@]*\)@[^@]*$:\1:'` bmp=$input/${key}xxx/$tag.bmp if test -r $bmp; then bmptoppm $bmp > /tmp/et$$.ppm 2> /dev/null ppmcolormask rgb:47/6c/6c /tmp/et$$.ppm > /tmp/et$$.pbm ppmquant -fs -map palette.ppm /tmp/et$$.ppm 2> /dev/null | \ ppmchange rgb:47/6c/6c rgb:48/6c/6c | \ pnmcomp -alpha=/tmp/et$$.pbm background.ppm > /tmp/et-2$$.ppm addtile ${ex_output}-fs.ppm 0 "$name" /tmp/et-2$$.ppm rm -f /tmp/et$$.ppm /tmp/et$$-2.ppm /tmp/et$$.pbm fi done || exit 1 rm -f background.ppm if test -r ${ex_output}.ppm; then ppmcolormask rgb:47/6c/6c ${ex_output}.ppm > /tmp/et$$.pbm ppmtoxpm -alphamask=/tmp/et$$.pbm ${ex_output}.ppm > ${ex_output}.xpm ppmcolormask rgb:47/6c/6c ${ex_output}-fs.ppm > /tmp/et$$.pbm ppmtoxpm -alphamask=/tmp/et$$.pbm ${ex_output}-fs.ppm \ > ${ex_output}-fs.xpm rm -f /tmp/et$$.pbm if test "$tileset" = "32"; then $xpm2txt -w32 -h32 ${ex_output}.xpm /tmp/et$$.txt sed -f ${ex_output}.sed < /tmp/et$$.txt > /tmp/et$$-2.txt $xpm2txt -w32 -h32 ${ex_output}-fs.xpm /tmp/et$$.txt sed -f ${ex_output}-fs.sed < /tmp/et$$.txt > /tmp/et$$-3.txt if test "$short" = "mon" -a -n "${extra_mon}"; then extra=${extra_mon} elif test "$short" = "obj" -a -n "${extra_obj}"; then extra=${extra_obj} else extra= fi ${txtmerge} /tmp/et$$.txt /tmp/et$$-2.txt ${extra} ${txtfilt} -p ../palette.txt /tmp/et$$.txt /tmp/et$$-4.txt egrep '^# tile [0-9]+ (.*)$' /tmp/et$$-4.txt | \ sed 's/^# tile [0-9][0-9]* (\(.*\))$/\1/' > /tmp/et$$.pat ${txtmerge} /tmp/et$$.txt /tmp/et$$-3.txt ${extra} ${txtfilt} -p ../palette.txt -f /tmp/et$$.pat /tmp/et$$.txt \ ${ex_output}.txt else $xpm2txt -w48 -h64 ${ex_output}-fs.xpm /tmp/et$$.txt sed -f ${ex_output}.sed < /tmp/et$$.txt > ${ex_output}.txt fi else echo "Warning: No ${tileset} tiles imported from subset $long" fi rm -f ${ex_output}.sed /tmp/et$$.txt /tmp/et$$-2.txt /tmp/et$$.ppm rm -f ${ex_output}-fs.sed /tmp/et$$-3.txt /tmp/et$$-4.txt /tmp/et$$.pat rm -f ${ex_output}.ppm ${ex_output}.xpm rm -f ${ex_output}-fs.ppm ${ex_output}-fs.xpm } set -e if test ! -d ${input}/pxxx; then echo "Error: Can't find bitmaps: ${input}/pxxx: No such directory" exit 1 fi if test ! -r ${palette}; then echo "Error: Can't find palette file: $palette" exit 1 fi if test ! -r palette.ppm; then generate_palette ${palette} palette.ppm fi if test ! \( -r ${tilemap}-monsters.tile -a -r ${tilemap}-objects.tile -a \ -r ${tilemap}-other.tile \) ; then generate_tilemap $tilemap ${input}/name.txt fi if test ! \( -x "${xpm2txt}" -a -x "${txtfilt}" \) ; then echo "Error: Can't find tile utils" exit 1 fi rm -f mon32mi.ppm obj32mi.ppm oth32mi.ppm import 32 monsters import 32 objects import 32 other rm -f mon3dmi.ppm obj3dmi.ppm oth3dmi.ppm import 3d monsters import 3d objects import 3d other ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/share/scripts/mon32mix.txt����������������������������������������������������0000664�0000764�0000764�00000021014�10545462320�017447� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������__ = (0, 0, 0) _A = (128, 96, 0) _B = (128, 255, 128) _C = (0, 0, 192) _D = (168, 224, 224) _E = (96, 48, 48) _F = (128, 64, 0) _G = (32, 64, 64) _H = (0, 112, 224) _I = (192, 96, 96) _J = (48, 96, 0) _K = (117, 105, 88) _L = (224, 192, 160) _M = (168, 168, 224) _N = (128, 32, 0) _O = (96, 0, 48) _P = (64, 128, 128) _Q = (255, 128, 128) _R = (128, 0, 255) _S = (0, 64, 32) _T = (128, 0, 0) _U = (48, 48, 0) _V = (96, 192, 0) _W = (48, 36, 0) _X = (96, 192, 192) _Y = (0, 32, 32) _Z = (48, 24, 0) _a = (48, 12, 0) _b = (128, 112, 32) _c = (64, 64, 128) _d = (192, 0, 96) _e = (48, 0, 0) _f = (0, 0, 224) _g = (224, 224, 0) _h = (0, 128, 64) _i = (0, 255, 255) _j = (64, 0, 128) _k = (96, 96, 0) _l = (0, 255, 0) _m = (255, 0, 128) _n = (96, 96, 192) _o = (96, 72, 0) _p = (104, 84, 31) _q = (224, 168, 0) _r = (0, 64, 64) _s = (96, 48, 0) _t = (248, 224, 96) _u = (224, 224, 112) _v = (202, 143, 114) _w = (24, 48, 48) _x = (144, 192, 192) _y = (0, 192, 96) _z = (0, 32, 64) _0 = (96, 24, 0) _1 = (128, 128, 64) _2 = (24, 24, 48) _3 = (224, 112, 0) _4 = (240, 240, 240) _5 = (0, 48, 24) _6 = (128, 255, 255) _7 = (96, 0, 0) _8 = (128, 255, 0) _9 = (0, 0, 64) _$ = (96, 0, 192) A_ = (144, 144, 192) AA = (255, 192, 255) AB = (0, 24, 24) AC = (255, 192, 0) AD = (255, 192, 192) AE = (224, 224, 224) AF = (16, 16, 0) AG = (128, 64, 64) AH = (224, 56, 0) AI = (170, 136, 52) AJ = (16, 0, 0) AK = (224, 112, 112) AL = (0, 96, 96) AM = (208, 208, 208) AN = (64, 128, 0) AO = (255, 128, 255) AP = (255, 128, 0) AQ = (224, 168, 224) AR = (224, 0, 0) AS = (128, 0, 64) AT = (192, 192, 255) AU = (192, 192, 0) AV = (0, 48, 96) AW = (255, 255, 128) AX = (192, 192, 192) AY = (168, 224, 168) AZ = (128, 128, 96) Aa = (112, 224, 0) Ab = (64, 64, 0) Ac = (127, 90, 72) Ad = (224, 112, 224) Ae = (48, 48, 24) Af = (255, 64, 0) Ag = (64, 48, 0) Ah = (192, 144, 0) Ai = (176, 176, 176) Aj = (0, 0, 96) Ak = (128, 96, 96) Al = (192, 144, 192) Am = (48, 24, 24) An = (64, 32, 0) Ao = (224, 0, 112) Ap = (24, 48, 0) Aq = (0, 128, 128) Ar = (64, 16, 0) As = (144, 192, 144) At = (160, 160, 160) Au = (64, 0, 0) Av = (192, 96, 0) Aw = (255, 0, 255) Ax = (24, 24, 0) Ay = (255, 0, 0) Az = (192, 96, 192) A0 = (112, 224, 112) A1 = (48, 96, 96) A2 = (0, 16, 16) A3 = (120, 160, 160) A4 = (24, 0, 0) A5 = (0, 0, 16) A6 = (160, 160, 120) A7 = (160, 120, 160) A8 = (144, 144, 144) A9 = (0, 64, 128) A$ = (192, 48, 0) B_ = (80, 160, 160) BA = (224, 0, 224) BB = (48, 48, 96) BC = (120, 160, 120) BD = (120, 120, 160) BE = (96, 192, 96) BF = (160, 160, 80) BG = (160, 120, 120) BH = (160, 80, 160) BI = (128, 128, 128) BJ = (0, 96, 48) BK = (64, 64, 32) BL = (112, 224, 224) BM = (192, 0, 0) BN = (192, 0, 192) BO = (0, 160, 160) BP = (0, 0, 128) BQ = (71, 108, 108) BR = (128, 96, 128) BS = (112, 112, 112) BT = (64, 32, 32) BU = (80, 160, 80) BV = (80, 80, 160) BW = (96, 128, 96) BX = (0, 48, 48) BY = (192, 192, 144) BZ = (32, 64, 0) Ba = (128, 64, 128) Bb = (160, 160, 0) Bc = (160, 80, 80) Bd = (64, 0, 32) Be = (160, 0, 160) Bf = (96, 96, 96) Bg = (252, 252, 153) Bh = (32, 32, 0) Bi = (0, 160, 80) Bj = (64, 128, 64) Bk = (160, 120, 0) Bl = (0, 0, 48) Bm = (0, 80, 160) Bn = (192, 144, 144) Bo = (0, 224, 0) Bp = (80, 160, 0) Bq = (112, 112, 224) Br = (80, 80, 80) Bs = (32, 0, 0) Bt = (128, 0, 128) Bu = (80, 0, 160) Bv = (255, 255, 255) Bw = (96, 48, 96) Bx = (242, 196, 77) By = (208, 168, 80) Bz = (255, 255, 0) B0 = (255, 255, 192) B1 = (0, 192, 0) B2 = (160, 80, 0) B3 = (160, 0, 80) B4 = (0, 192, 192) B5 = (165, 118, 94) B6 = (48, 96, 48) B7 = (64, 64, 64) B8 = (192, 160, 64) B9 = (224, 224, 168) B$ = (0, 160, 0) C_ = (96, 0, 96) CA = (160, 40, 0) CB = (0, 0, 160) CC = (0, 224, 112) CD = (64, 32, 64) CE = (0, 128, 255) CF = (0, 128, 0) CG = (96, 128, 128) CH = (48, 48, 48) CI = (229, 162, 130) CJ = (32, 64, 32) CK = (192, 255, 255) CL = (171, 154, 129) CM = (160, 0, 0) CN = (224, 168, 168) CO = (145, 135, 110) CP = (64, 0, 64) CQ = (192, 255, 192) CR = (112, 0, 224) CS = (0, 96, 0) CT = (96, 96, 128) CU = (0, 255, 128) CV = (0, 96, 192) CW = (24, 48, 24) CX = (255, 211, 175) CY = (32, 32, 32) CZ = (48, 0, 48) Ca = (0, 64, 0) Cb = (0, 224, 224) Cc = (32, 0, 32) Cd = (0, 48, 0) Ce = (192, 192, 96) Cf = (16, 16, 16) Cg = (128, 128, 255) Ch = (0, 32, 0) Ci = (128, 128, 0) Cj = (255, 182, 145) Ck = (16, 0, 16) Cl = (0, 24, 0) Cm = (96, 96, 48) Cn = (0, 16, 0) Co = (0, 0, 255) # tile 162 (gnome mummy) { BQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQ BQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQ BQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQ BQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQ BQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQ BQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQ BQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQ BQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQ BQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQ BQBQBQBQBQBQBQBQBQBQBQBQAiAiBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQ BQBQBQBQBQBQBQBQBQBQBQAEAEAEAiBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQ BQBQBQBQBQBQBQBQBQBQAEAiAiAiAiAiBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQ BQBQBQBQBQBQBQBQBQBQAiAEAiAiAiAiBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQ BQBQBQBQBQBQBQBQBQBQAECHCHCHCHAiBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQ BQBQBQBQBQBQBQBQBQAECHBvCHCHBvCHAiAiAiBQBQBQBQBQBQBQBQBQBQBQBQBQ BQBQBQBQBQBQBQBQBQAiCHCHCHCHCHCHAEBQBQAiAiAiBQBQBQBQBQBQBQBQBQBQ BQBQBQBQBQBQBQBQBQAEAEAiCHCHAiAiAiAiAiBQBQBQ________BQBQBQBQBQBQ BQBQBQBQBQBQBQBQBQBQAEAiCHCHAiAiBQBQBQAiBQ____________BQBQBQBQBQ BQBQBQBQBQBQBQAEAEAiAiAiAiAiAiAEAEAiAiBQ______________BQBQBQBQBQ BQBQBQBQBQBQAEAiAiAiAEAEAiAiAiAiAiAiAiAi______________BQBQBQBQBQ BQBQBQBQBQBQAEAiBQAiAEAEAEAiAiAiAi__AEAi____________BQBQBQBQBQBQ BQBQBQBQBQAEAiAiBQAiAiAiAiAEAEAEAi__AiAEAi__________BQBQBQBQBQBQ BQBQBQBQBQAEAiBQBQAEAEAEAEAiAiAiAi____AEAi________BQBQBQBQBQBQBQ BQBQBQBQBQAEAiBQBQAEAEAEAiAiAiAiAi____AiAi________BQBQBQBQBQBQBQ BQBQBQBQBQBQBQBQBQAiAiAiAiAiAEAiAi______________BQBQBQBQBQBQBQBQ BQBQBQBQBQBQBQBQBQAEAEAi____AEAEAi____________BQBQBQBQBQBQBQBQBQ BQBQBQBQBQBQBQBQBQAiAiAi____AiAiAi__________BQBQBQBQBQBQBQBQBQBQ BQBQBQBQBQBQBQBQAEAEAEAi____AEAEAiAi________BQBQBQBQBQBQBQBQBQBQ BQBQBQBQBQBQBQBQAEAEAEAi____AEAEAiAi____BQBQBQBQBQBQBQBQBQBQBQBQ BQBQBQBQBQBQBQBQ______________________BQBQBQBQBQBQBQBQBQBQBQBQBQ BQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQ BQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQ } # tile 298 (priest) { BQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQ BQBQBQBQBQBQBQBQBQBQBQBQBQBQCjCjCIBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQ BQBQBQBQBQBQBQBQBQBQBQBQBQCjCXCjCjCIBQBQBQBQBQBQBQBQBQBQBQBQBQBQ BQBQBQBQBQBQBQBQBQBQBQBQCICXCjCjCjCI_vBQBQBQBQBQBQBQBQBQBQBQBQBQ BQBQBQBQBQBQBQBQBQBQBQAMCICjB5B5CjB5_vAtBQBQBQBQBQBQBQBQBQBQBQBQ BQBQBQBQBQBQBQBQBQBQBQAMCICjCjCjCjCI_vAtBQBQBQBQBQBQBQBQBQBQBQBQ BQBQBQBQBQBQBQBQBQBQBQAMAMCjCICjCjCI_vAiBQBQBQBQBQBQBQBQBQBQBQBQ BQBQBQBQBQBQBQBkBkBkBkBkAMAiCIB5B5B5AiAi_A_ABQBQBQBQArArBQBQBQBQ BQBQBQBQBQBQBk_A_A_A_ABkAiAMAiAMAMAiAiAi_A_A_ABQBQArArArArBQBQBQ BQBQBQBQBQ_A_A_ACjCj_A_ABkAMAiAMAiAMAi_A_ACjCjBQArAr_a_aArArBQBQ BQBQBQBQBQ_A_ACjCICI_v_AB8AMAiAMAiAMAi_ACICICjArAr_a_a_aArArBQBQ BQBQBQBQBk_A_ACjCI_v_vB5B8B8AMAiAiAMAiAIB5_vCICjCj_a_a_a_aArArBQ BQBQBQBQ_A_ACjCjCI_vB5B8B8BxBxAiAMBrB8AIAIB5_vCICICj_a_a_a_aArBQ BQBQBQBQ_A_ACjCI_vB5AgB8BxBxB8B8A8BrB8BrAIAgB5_vCICICj_N_a_aArBQ BQBQBQBQ_A_ACj_vB5AgAgB8BxB8BrBrBIBIBfB8AIAgAgArB5_v_NCICj_aArBQ BQBQBQBk_A_ACj_vB5AgAgB8BxB8B8A8BIBfBrBrAIAgBQAr_a_a_N_vCI_aArBQ BQBQBQBk_A_ACjB5AgAgAgB8B8B8CM_NBfBrAIAIAgAgBQArAr_a_aB5_aArArBQ BQBQBQBk_A_ACjCIAgAgAgAgAICM_N_7B8BrAI_sAgAgBQBQAr_a_a_aArArBQBQ BQBQBQBk_A_ACICjCIAgAgAgCM_N_7_sAn_s_s_s_sAgBQBQArArArArArBQBQBQ BQBQBQBk_A_A_vCICjCIAgCM_N_7_sAn_s_sAnAn_s_s______ArArAr____BQBQ BQBQBQBk_A_AAg_vCICjCI_T_7_s_sAn_s_s_sAnAn_s_s______________BQBQ BQBQBQBk_A_AAgAg_vCI_N_7_s_sAnAnAg_s_sB5An_s_s________________BQ BQBQBQBk_A_AAgAgCM_N_7Ag_sAnAnB5Ag_s_sB5_vCI__________________BQ BQBQBQBkBk_AAgAg_7_7AgAg_vB5_v_vAgAg___v_vCICI______________BQBQ BQBQBQ_ABk_A_AAgAgAgAgAgCjCICIAg________B5_vCI______________BQBQ BQBQBQBkBk_A_AAgAgAgAgCjCjCj_v__________B5_vCIAn__________BQBQBQ BQBQBQ_ABkBk_AAgAg____CICjCI_v____________B5AnCIAn______BQBQBQBQ BQBQBQBQBkBk_AAg______CICI_v______________AnAnCICIAn____BQBQBQBQ BQBQBQ___ABk_A______CIB5_v____________________AnAn____BQBQBQBQBQ BQBQBQ_____A_A____AnCICI_v________BQBQBQ____________BQBQBQBQBQBQ BQBQBQBQ____________AnAnAn____BQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQ BQBQBQBQBQBQBQ______________BQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQ } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/share/scripts/import-alg.sh���������������������������������������������������0000664�0000764�0000764�00000021004�10545462320�017640� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/sh # # Copyright (c) J. Ali Harlow 2000 # NetHack may be freely redistributed. See license for details. # # This shell script imports Kelly Youngblood's tilesets from his # AllegroHack package. You must have a copy of the binary zip # file. anh_161b.zip is available from # http://www.pinn.net/~jry/allegrohack/ # Set the variable below set to point at it (there's no need to # unpack the archive first). # # Configuration variables # input=anh_161b.zip # Backup input for missing bitmaps (eg., lords.bmp, missing from version 1.61) input2=anh_15b.zip xpm2txt=../../../util/xpm2txt txtfilt=../../../util/txtfilt # # Functions # addtile() # Usage: addtile <output> <id> <name> <input> { ad_output=$1 ad_id=$2 ad_name=$3 ad_input=$4 ad_sed=`echo ${ad_output} | sed 's/\.[^.]*$/.sed/'` if test -r $ad_output; then pnmcat -lr $ad_output $ad_input > /tmp/ad$$.pnm mv /tmp/ad$$.pnm $ad_output ad_count=`echo ${ad_count} + 1 | bc` else rm -f ${ad_sed} anytopnm $ad_input > $ad_output ad_count=0 fi echo "s£^# tile ${ad_count} (unknown)£# tile ${id} ($ad_name)£" >> ${ad_sed} } # initialize() { cat <<-EOF > cmap.names 67 dig beam 68 camera flash 69 thrown boomerang, open left 70 thrown boomerang, open right 71 magic shield 1 72 magic shield 2 73 magic shield 3 74 magic shield 4 75 swallow top left 76 swallow top center 77 swallow top right 78 swallow middle left 79 swallow middle right 80 swallow bottom left 81 swallow bottom center 82 swallow bottom right 83 explosion top left 84 explosion top center 85 explosion top right 86 explosion middle left 87 explosion middle center 88 explosion middle right 89 explosion bottom left 90 explosion bottom center 91 explosion bottom right EOF cat <<-EOF > mon32alg-main.names winter wolf cub Cerberus gas spore flaming sphere shocking sphere master mind flayer glass piercer mastodon trapper pony horse warhorse baby silver dragon silver dragon stalker lichen arch-lich green slime disenchanter pit viper vampire vampire lord vampire mage barrow wight monkey carnivorous ape gold golem aligned priest high priest monk ranger Ixoth pyrolisk large cat storm giant glass golem watchman watch captain Scorpius Master Assassin Lord Surtur Death Pestilence Famine EOF cat <<-EOF > obj32alg-main.names athame silver dagger worm tooth crysknife crude short sword / orcish short sword short sword broad short sword / dwarvish short sword runed short sword / elven short sword runed broadsword / elven broadsword silver saber crude spear / orcish spear silver spear runed spear / elven spear stout spear / dwarvish spear throwing spear / javelin trident long bow / yumi crossbow Hawaiian shirt T-shirt silver dragon scale mail silver dragon scales hooded cloak / dwarvish cloak slippery cloak / oilskin cloak tattered cape / cloak of protection ornamental cope / cloak of magic resistance clay / increase accuracy steel / slow digestion twisted / free action concave / amulet of unchanging key / skeleton key lock pick figurine meatball huge chunk of meat crystal / enlightenment strange object candy bar smoky / object detection glass / light EOF cat <<-EOF > oth32alg-main.names cmap / explosion top left cmap / explosion top center cmap / explosion top right cmap / explosion middle left cmap / explosion middle center cmap / explosion middle right cmap / explosion bottom left cmap / explosion bottom center cmap / explosion bottom right magic trap anti-magic trap field polymorph trap zap 5 0 zap 5 1 zap 5 2 zap 5 3 zap 7 0 zap 7 1 zap 7 2 zap 7 3 EOF cat <<-EOF > mon32alg-sub.names priest priestess EOF cat <<-EOF > obj32alg-sub.names velvet / drain life gold piece EOF cat <<-EOF > oth32alg-sub.names teleportation trap level teleporter grave EOF toplevel=ahack-dist toplevel_backup=ahack-dist-backup output=ahack /bin/rm -rf $toplevel $toplevel_backup unzip -L -q -d $toplevel ${input} unzip -L -q -d $toplevel_backup ${input2} rm -f ${output}-monsters.tile ${output}-objects.tile ${output}-other.tile rm -rf $output mkdir $output id=1 } # # Usage: get_tile <input-dir> <tile> [<set>] get_tile() { tile_dir=$1 tile_pat=$2 if [ $# -gt 2 ]; then set_filter=": $3[/\\]" else set_filter='.*' fi if test "$tile_pat" = '*'; then egrep_flags="-v" egrep_args="^#|^[ ]*$" else egrep_flags="--" egrep_args="^[^ ]+[ ]+\(${tile_pat}\)" fi tr -d '[\015]' < $tile_dir/tiles/index | sed -e 's:\\:/:g' | \ egrep "${egrep_flags}" "${egrep_args}" | egrep -- "${set_filter}" | \ while read "gt_line"; do gt_name=`echo $gt_line | sed -n 's/.*(\([^)]*\)).*/\1/p'` gt_bmp=`echo $gt_line | sed -n 's/.*:[ ]*\([^ ]*\).*/\1/p'` gt_offset=`echo $gt_line | sed -n 's/.*\@[ ]*\([^ ]*\).*/\1/p'` echo "$gt_bmp" "${gt_offset:-0}" "$gt_name" done } # # Usage: proc_tile <bmpfile> <offset> <name> proc_tile() { pt_bmp=$1 pt_offset=$2 pt_name=$3 if echo $pt_name | egrep -s '^cmap [0-9]+$' >/dev/null; then no=`echo $pt_name | sed 's/cmap *//'` nline=`egrep "^${no} " cmap.names` if test -n "$nline"; then pt_name=`echo $nline | sed 's:^[^ ]*[ ]:cmap / :'` fi fi case $pt_bmp in */mon/*) ex_output=mon32alg echo ${output}@monsters@${pt_name}@${id} >> ${output}-monsters.tile ;; */obj/*) ex_output=obj32alg echo ${output}@objects@${pt_name}@${id} >> ${output}-objects.tile ;; */etc/*) ex_output=oth32alg echo ${output}@other@${pt_name}@${id} >> ${output}-other.tile ;; *) echo "Warning: tile not in a known tileset ($pt_bmp): ignored" 1>&2 return ;; esac bmptoppm $pt_bmp > $output/x${id}.ppm 2> /dev/null pnmcut 0 "$pt_offset" 32 32 $output/x${id}.ppm > $output/x${id}.pnm addtile ${ex_output}.ppm "$id" "$pt_name" $output/x${id}.pnm } # ppm_package() { rm -f mon32alg.ppm obj32alg.ppm oth32alg.ppm for pp_set in mon obj etc; do get_tile "$toplevel" '*' $pp_set | while read bmp offset "name"; do bmpfile=$toplevel/tiles/$bmp if test \! -r $bmpfile; then set +e get_tile "$toplevel_backup" "$name" | { read sbmp soffset "sname" if test $? -ne 0; then echo "Warning: tile bitmap ($bmpfile) not readable: ignored" 1>&2 exit 1; elif test \! -r $toplevel_backup/tiles/$sbmp; then echo "Warning: tile bitmap ($bmpfile) not readable: ignored" 1>&2 exit 1; else echo "Warning: tile bitmap ($bmp) not readable: using backup" 1>&2 echo "$toplevel_backup/tiles/$sbmp" "$soffset" "$sname" exit 0; fi } set -e else echo "$bmpfile" "$offset" "$name" fi done done | while read bmpfile offset "name"; do proc_tile "$bmpfile" "$offset" "$name" id=`echo ${id} + 1 | bc` done } # import() # Usage: import <tileset> <sub> # tileset is assumed to be 32; sub can be one of mon, obj or oth { tileset=$1 sub=$2 if test -r ${sub}${tileset}alg.ppm; then ppmquant -fs -map palette.ppm ${sub}${tileset}alg.ppm 2> /dev/null | \ ppmtoxpm > ${sub}${tileset}alg.xpm ${xpm2txt} -w32 -h32 ${sub}${tileset}alg.xpm /tmp/et$$.txt sed -f ${sub}${tileset}alg.sed < /tmp/et$$.txt > \ ${sub}${tileset}alg-full.txt rm -f /tmp/et$$.txt else echo "Warning: No ${tileset} tiles imported from subset $sub" fi } filter() # Usage: filter <tileset> <sub> # tileset is assumed to be 32; sub can be one of mon, obj or oth { tileset=$1 sub=$2 if test -r ${sub}${tileset}alg-full.txt; then echo ${txtfilt} -f ${sub}${tileset}alg-main.names \ ${sub}${tileset}alg-full.txt ${sub}${tileset}alg.txt ${txtfilt} -f ${sub}${tileset}alg-main.names \ ${sub}${tileset}alg-full.txt ${sub}${tileset}alg.txt echo ${txtfilt} -f ${sub}${tileset}alg-sub.names \ ${sub}${tileset}alg-full.txt ${sub}${tileset}al2.txt ${txtfilt} -f ${sub}${tileset}alg-sub.names \ ${sub}${tileset}alg-full.txt ${sub}${tileset}al2.txt fi } clean() { rm -f -- cmap.names mon32alg-main.names obj32alg-main.names rm -f -- oth32alg-main.names mon32alg-sub.names obj32alg-sub.names rm -f -- oth32alg-sub.names rm -rf -- ${toplevel} ${toplevel_backup} ${output} rm -f -- mon32alg.ppm obj32alg.ppm oth32alg.ppm rm -f -- ${output}-monsters.tile ${output}-objects.tile ${output}-other.tile rm -f -- mon32alg.xpm obj32alg.xpm oth32alg.xpm rm -f -- mon32alg.sed obj32alg.sed oth32alg.sed rm -f -- mon32alg-full.txt obj32alg-full.txt oth32alg-full.txt } set -e initialize ppm_package import 32 mon import 32 obj import 32 oth filter 32 mon filter 32 obj filter 32 oth clean exit 0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/share/other.txt���������������������������������������������������������������0000664�0000764�0000764�00000226416�10545462320�015442� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������A = (0, 0, 0) B = (0, 182, 255) C = (255, 108, 0) D = (255, 0, 0) E = (0, 0, 255) F = (0, 145, 0) G = (108, 255, 0) H = (255, 255, 0) I = (255, 0, 255) J = (145, 71, 0) K = (182, 71, 0) L = (255, 182, 145) M = (71, 108, 108) N = (255, 255, 255) O = (218, 218, 182) P = (108, 145, 182) # tile 0 (dark part of a room) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 1 (wall) { ANNOAMPPPPPMNNOA AOOOAMPMPPMMOOOA AOOOAMPPPPPMOOOA AOOOAMPPPPPMOOOA AOOOAMMPPPPMOOOA AMAAAMMPPPPMMAMA AMMMAMMPPPPMMMMA AOPPAMMPPMPMOPMA ANNOAMPPPPPMNNOA AOOOAMPPPPPMOOOA AOOOAMPPPPPMOOOA AOOOAMPPPPPMOOOA AOOOAMMPMPMMOOOA AMAAAMMPPPPMMAMA AMMMAMMPPPPMMMMA AOPPAMMPPPPMOPMA } # tile 2 (wall) { AAANOOAAAAANOOAA OOONOOAMOOONOOAM POOMMMAMPOOMMMAM MMMMMMMMMMMMMMMM PPMMMPPPPPMMMPPP PPNOOPPPPPNOOPPP OONOOAMOOONOOAMO OOMMMAMPOOMMMAMP MMMMMMMMMMMMMMMM PPMOPPPPMOPPPMOP PPMPPPPPMPPPPMPP MMMMMMMMMMMMMMMM MOPPPPMOPPPPMOPP MPPPPPMPPPPPMPPP MMMMMMMMMMMMMMMM AAAAAAAAAAAAAAAA } # tile 3 (wall) { AAANNNNOOOOOOAAA NNNNAAMMPPPPOMMM OOONAMMPPPBBOMMM OOOOOOOOOOOOOMMM OOOPPPPPPPPPPMMM OOOPPPPPPPPPPMMM OOPPPPPPPPPPPPMM OPPPPPPPPPPPPPPM MMMMMMMMMMMMMMMM APPMMMMMMMMMPPPM AOOOAAAAAAAAOOOA AOOOAMPPPPPMOOOA AOOOAMPPPPPMOOOA AMAAAMMPPPPMMAMA AMMMAMMPPPPMMMMA AOPPAMMPPPPMOPMA } # tile 4 (wall) { AAANNNNOOOOOOAAA NNNNAAMMPPPPOMMM OOONAMMPPPBBOMMM OOOOOOOOOOOOOMMM OOOPPPPPPPPPPMMM OOOPPPPPPPPPPMMM OOPPPPPPPPPPPPMM OPPPPPPPPPPPPPPM MMMMMMMMMMMMMMMM APPMMMMMMMMMPPPM AOOOAAAAAAAAOOOA AOOOAMPPPPPMOOOA AOOOAMPPPPPMOOOA AMAAAMMPPPPMMAMA AMMMAMMPPPPMMMMA AOPPAMMPPPPMOPMA } # tile 5 (wall) { AAANNNNOOOOOOAAA NNNNAAMMPPPPOMMM OOONAMMPPPBBOMMM OOOOOOOOOOOOOMMM OOOPPPPPPPPPPMMM OOOPPPPPPPPPPMMM OOPPPPPPPPPPPPMM OPPPPPPPPPPPPPPM MMMMMMMMMMMMMMMM PPMOPPPPMOPPPMOP PPMPPPPPMPPPPMPP MMMMMMMMMMMMMMMM MOPPPPMOPPPPMOPP MPPPPPMPPPPPMPPP MMMMMMMMMMMMMMMM AAAAAAAAAAAAAAAA } # tile 6 (wall) { AAANNNNOOOOOOAAA NNNNAAMMPPPPOMMM OOONAMMPPPBBOMMM OOOOOOOOOOOOOMMM OOOPPPPPPPPPPMMM OOOPPPPPPPPPPMMM OOPPPPPPPPPPPPMM OPPPPPPPPPPPPPPM MMMMMMMMMMMMMMMM PPMOPPPPMOPPPMOP PPMPPPPPMPPPPMPP MMMMMMMMMMMMMMMM MOPPPPMOPPPPMOPP MPPPPPMPPPPPMPPP MMMMMMMMMMMMMMMM AAAAAAAAAAAAAAAA } # tile 7 (wall) { AAANNNNOOOOOOAAA NNNNAAMMPPPPOMMM OOONAMMPPPBBOMMM OOOOOOOOOOOOOMMM OOOPPPPPPPPPPMMM OOOPPPPPPPPPPMMM OOPPPPPPPPPPPPMM OPPPPPPPPPPPPPPM MMMMMMMMMMMMMMMM APPMMMMMMMMMPPPM AOOOAAAAAAAAOOOA AOOOAMPPPPPMOOOA AOOOAMPPPPPMOOOA AMAAAMMPPPPMMAMA AMMMAMMPPPPMMMMA AOPPAMMPPPPMOPMA } # tile 8 (wall) { AAANNNNOOOOOOAAA NNNNAAMMPPPPOMMM OOONAMMPPPBBOMMM OOOOOOOOOOOOOMMM OOOPPPPPPPPPPMMM OOOPPPPPPPPPPMMM OOPPPPPPPPPPPPMM OPPPPPPPPPPPPPPM MMMMMMMMMMMMMMMM PPMOPPPPMOPPPMOP PPMPPPPPMPPPPMPP MMMMMMMMMMMMMMMM MOPPPPMOPPPPMOPP MPPPPPMPPPPPMPPP MMMMMMMMMMMMMMMM AAAAAAAAAAAAAAAA } # tile 9 (wall) { AAANNNNOOOOOOAAA NNNNAAMMPPPPOMMM OOONAMMPPPBBOMMM OOOOOOOOOOOOOMMM OOOPPPPPPPPPPMMM OOOPPPPPPPPPPMMM OOPPPPPPPPPPPPMM OPPPPPPPPPPPPPPM MMMMMMMMMMMMMMMM APPMMMMMMMMMPPPM AOOOAAAAAAAAOOOA AOOOAMPPPPPMOOOA AOOOAMPPPPPMOOOA AMAAAMMPPPPMMAMA AMMMAMMPPPPMMMMA AOPPAMMPPPPMOPMA } # tile 10 (wall) { AAANNNNOOOOOOAAA NNNNAAMMPPPPOMMM OOONAMMPPPBBOMMM OOOOOOOOOOOOOMMM OOOPPPPPPPPPPMMM OOOPPPPPPPPPPMMM OOPPPPPPPPPPPPMM OPPPPPPPPPPPPPPM MMMMMMMMMMMMMMMM APPMMMMMMMMMPPPM AOOOAAAAAAAAOOOA AOOOAMPPPPPMOOOA AOOOAMPPPPPMOOOA AMAAAMMPPPPMMAMA AMMMAMMPPPPMMMMA AOPPAMMPPPPMOPMA } # tile 11 (wall) { AAANNNNOOOOOOAAA NNNNAAMMPPPPOMMM OOONAMMPPPBBOMMM OOOOOOOOOOOOOMMM OOOPPPPPPPPPPMMM OOOPPPPPPPPPPMMM OOPPPPPPPPPPPPMM OPPPPPPPPPPPPPPM MMMMMMMMMMMMMMMM APPMMMMMMMMMPPPM AOOOAAAAAAAAOOOA AOOOAMPPPPPMOOOA AOOOAMPPPPPMOOOA AMAAAMMPPPPMMAMA AMMMAMMPPPPMMMMA AOPPAMMPPPPMOPMA } # tile 12 (doorway) { AAAAAAAAAAAAAAAA AAMMMMMMMMMMMMAA AMMMMMMMMMMMMMMA AMMMMMMMMMMMMMMA AMMMMMMMMMMMMMMA AMMMMMMMMMMMMMMA AMMMMMMMMMMMMMMA AMMMMMMMMMMMMMMA AMMMMMMMMMMMMMMA AMMMMMMMMMMMMMMA AMMMMMMMMMMMMMMA AMMMMMMMMMMMMMMA AMMMMMMMMMMMMMMA AMMMMMMMMMMMMMMA AAMMMMMMMMMMMMAA AAAAAAAAAAAAAAAA } # tile 13 (open door) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAJJMJJJJJJJJJAA AJKJJKJJKJJJJJJA AAAAAAAAAAAAAAAA AMMMMMMMMMMMMMMA AMMMMMMMMMMMMMMA AMMMMMMMMMMMMMMA AMMMMMMMMMMMMMMA AMMMMMMMMMMMMMMA AMMMMMMMMMMMMMMA AMMMMMMMMMMMMMMA AMMMMMMMMMMMMMMA AMMMMMMMMMMMMMMA AMMMMMMMMMMMMMMA AAAAAAAAAAAAAAAA } # tile 14 (open door) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AKMMMMMMMMMMMMAA ACKMMMMMMMMMMMMA APJMMMMMMMMMMMMA AMJMMMMMMMMMMMMA AMJMMMMMMMMMMMMA AMJMMMMMMMMMMMMA AJJMMMMMMMMMMMMA APJMMMMMMMMMMMMA AMJMMMMMMMMMMMMA AMJMMMMMMMMMMMMA AMJMMMMMMMMMMMMA AKMMMMMMMMMMMMMA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 15 (closed door) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AACCKKKKKKKKJJAA ACKJKJKJKJKJJKJA APJJPKJJKJJJJJJA AMPPMPPPPPMBPPJA AMMMMMMMMMBPPMJA AMJJMJJJJJPAPAJA AJJJJCJJJJMPMAJA APKJPKJJJJJAAAJA AMPPMPPPPPPMMPJA AMMMMMMMMMMMMMJA AMJJMJJJJJJJJJJA AJKJJKJJKJJJJJJA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 16 (closed door) { AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AACCKKKKKKKKJJAA ACKJKJKJKJKJJKJA APJJPKJJKJJJJJJA AMPPMPPPPPMBPPJA AMMMMMMMMMBPPMJA AMJJMJJJJJPAPAJA AJJJJCJJJJMPMAJA APKJPKJJJJJAAAJA AMPPMPPPPPPMMPJA AMMMMMMMMMMMMMJA AMJJMJJJJJJJJJJA AJKJJKJJKJJJJJJA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 17 (iron bars) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMBBMMMMMMM MMMMBBMBPMBPMMMM MBBMBPMBPMPPMBPM MBPMBPMBPMPPMPPM MBPMBPMBPMPPMPPM MBPMBPMBPMPPAPPM MBPMBPMBPAPPAPPM MBPMBPABPAPPAPPM MBPABPABPAPPAPPA MBPABPABPAPPAPPA MBPABPABPAPPAPPA MBPABPABPAPPAPPA MBPMBPMBPMPPMPPM MMMMMMMMMMMMMMMM } # tile 18 (tree) { MMMMMMMMMMMMMMMM MMMMMFFFFFFMMMMM MMMFFFFFFFFFFMMM MMFFFFFFFFFFFFMM MMFFFFFFFFFFFFMM MMFFFFJFFFJFFFMM MMMFFFFJFJFFFMMM MMMMFFJJJJFFMMMM MMMMMMMKJJMAAAAM MMMMMMMKJMAAAAAA MMMMMMMJJMAAAAAA MMMMMMMKJMAAAAAM MMMMMMMKJAAAMMMM MMMMMMKJJJAAMMMM MMMJJJJMJMJJJAMM MMMMMMMMMMMMMMMM } # tile 19 (floor of a room) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMPPMMMMMMM MMMMMMMPPMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 20 (corridor) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMPPMMMMMMM MMMMMMPMMPMMMMMM MMMMMMPMMPMMMMMM MMMMMMMPPMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 21 (lit corridor) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMPPMMMMMMM MMMMMMPPPPMMMMMM MMMMMMPPPPMMMMMM MMMMMMMPPMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 22 (staircase up) { AAAAAAAAAAAAAAMA AADJJJJJJJJJDAMA AACDDJKNKKDDCAMA AAAAAANNNAAAAMMA AAADJNNNNNJDAMMA AAACNOONONNCAMMA AAAAAAOONAAAMMMA AAAAKDOOOKJAMMMA AAAACKPONKCAMMMA AAAAAAOPOAAMMMMA AAAAAKPPPJAMMMMA AAAAACKJJKAMMMMA AAAAAAAAAAAAMMMA AAAAAAAAAAAAAMMA AAAAAAAAAAAAAAMA AAAAAAAAAAAAAAAA } # tile 23 (staircase down) { AAAAAAAAAAAAAAMA AADJJJJJJJJJDAMA AACDDJNNNKDDCAMA AAAAAANNNAAAAMMA AAADJJNONJJDAMMA AAACDDONNKDCAMMA AAAAAAONOAAAMMMA AAAAPOOONONAMMMA AAAACPOOOPCAMMMA AAAAAANPNAAMMMMA AAAAAKKOJJAMMMMA AAAAACKJJKAMMMMA AAAAAAAAAAAAMMMA AAAAAAAAAAAAAMMA AAAAAAAAAAAAAAMA AAAAAAAAAAAAAAAA } # tile 24 (ladder up) { ADAAAAAAAAAAADMA AADAAAANAAAADAMA AACCCCNNNCCCCAMA AADAANANANAADMMA AAADAAANAAADAMMA AAACDDDNDDDCAMMA AAADAAAOAAADMMMA AAAAKAAOAAJAMMMA AAAACKKOKKCAMMMA AAAADAAPAADMMMMA AAAAAKKPJJAMMMMA AAAAADAAAKAMMMMA AAAAAAAAAAAAMMMA AAAAAAAAAAAAAMMA AAAAAAAAAAAAAAMA AAAAAAAAAAAAAAAA } # tile 25 (ladder down) { ADAAAAAAAAAAADMA AADAAAANAAAADAMA AACCCCCNCCCCCAMA AADAAAANAAAADMMA AAADAAANAAADAMMA AAACDDDNDDDCAMMA AAADAAAOAAADMMMA AAAAKAAOAAJAMMMA AAAACOKOKOCAMMMA AAAADAOOOADMMMMA AAAAAKKOJJAMMMMA AAAAADAAAKAMMMMA AAAAAAAAAAAAMMMA AAAAAAAAAAAAAMMA AAAAAAAAAAAAAAMA AAAAAAAAAAAAAAAA } # tile 26 (altar) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMPDPDPDPDPMMMM MMPPPDPDDDPPPMMM MMMBBPPPDPPMAAMM MMMBPPPPPPMMAMMM MMPPMMMMMMMPPMMM MMMAAAAAAAAAAAMM MMMMMMMMMMMMMMMM } # tile 27 (grave) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMOOOPAMMMMM MMMMMOMMMOPAMMMM MMMMOMPOPMOPAMMM MMMMOMOOOMOPAMMM MMMOMPPOPPMOPAMM MMMOMPPPPPMOPAMM MMMOMPPPPPMOPAMM MMMOMPPPPPMOPAAA MFMOMPFPPFMOPFAA MMFOFFPFFFFOFFAM MMJJFFJJFMJJFJMM MMMJJJMJJJJJJMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 28 (opulent throne) { MMMMMMMMMMMMMMMM MMMMMHHHHHMMMMMM MMMMHCCCDDHMMMMM MMMMHCCEDDHMMMMM MMMMHCEEEDHMMMMM MMMMHCCEDDHMMMMM MMMMHCCEDDHMMAAM MMMMMHCDDHAAAAAM MMCCOHCDDHOCCAAA MHHHDHHHHHCHHHAA MHMHODDDCCOHAHAA MMMHHHHHHHHHAAAM MMMHALAAALAHAAMM MMHAMAAAAAAAHMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 29 (sink) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMPMMMMPMMMMMM MMNPPPPPPPPNMMMM MNOMPMPPMPMONMMM MNOBMMPPMMBONMMM MNOBBBPPBBBONAAM MNOBBBBBBBBONAAA MNOOOOOOOOOONAAA MMNNNNNNNNNNAAAA MMMMMOOOOAAAAAAA MMMMMOOOOAAAAAMM MMMMOOOOOOAMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 30 (toilet) { MMMMMMMMMMMMMMMM MMMONNNNNNMMMMMM MMAMMJJOONMMMMMM MMAMMOOONMMMMMMM MMMAMMMMOMMMMMMM MMMMAMNNNNNNMMMM MMMMAONAMMMMNNMM MMMMAOONAAAAAANM MAAAAOOONNNNNNNM MMAAAMOONOOOONMM MMMAAAMOONNNOMMM MMMMMAAAMONNMMMM MMMMMMAAAMNNMMMM MMMMMMMMMANNMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 31 (fountain) { MMMMEMMMMEMMMMMM MMEEEEMMEEEMMMMM MMEMMMEEEMEEMMMM MMMEMEEEEMEMMMMM MMEMMEEOEMEEMAMM MEEMEENOEMEMEAAM MEMMEMNOMEMEAAAM MMMPPPNOPPPAAAMM MMPEEENOEEEPAAMM MOEENNNOOOEEPAMM MNOEEEEEEEEONAAM MPNOOOOOOOONPAAM MMPNNNNNNNNPAAAM MMMPPPPPPPPAAAMM MMMMAAAAAAAAAMMM MMMMMMMMMMMMMMMM } # tile 32 (water) { MMMMMMMMMMNNNMMM MEEEEMMMMNEMENMM MMMMEEMEEEMMMMMM MMMMMEEEMMMMMMMM MNNMMMMMMEEMMMMM EMENMMMMEMEEMMEE MMMENMEMMMMEMMEM MMMMEEMMMMMMEEMM MMMMMMMMMMMMMMMM NMMEEMMMEEEEMMMM NNEMMEMEMMMEEMMN MEMMMMEMNNMMEENM MMMMMMMNEEEEMMMM MMEEEMMEMMMEEEMM MEMMEEMMMEMMEEEM EEMMMMEEEMMMMMEE } # tile 33 (ice) { NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNN NNNNNNNMMNNNNNNN NNNNNNMNNMNNNNNN NNNNNNMNNMNNNNNN NNNNNNNMMNNNNNNN NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNN } # tile 34 (molten lava) { DDDDDDCDDDDDDDDD DDDDDCDKDDDDDDDD DDCCDDKDDDDCCCDD DCJJKDDDDDCKJJKD DCJDKDDDDDCJCDKD DDKCDDDDDDCJDCKD DDDDDDDCDDDKKKDD DDDCDDDDDDDDDDDD DDDDJDCDDDDCDDDD DDDDDDDDDDCJKDDD DDDDDDDDDDDKDDDC DDDDCCDDDDDDDDDD DDDCJJKDDDDDDDDD CDDCJDKDDDDDDJDD DDDDKCDDDDCDDDDD DDDDDDDDDDDKDDDD } # tile 35 (lowered drawbridge) { ECKACKCKKCKAKCAE EJKKKKKKKKCKKJAA EEJKJKJKJJJJJAAA EJKKCKKCKKKCKJAA EKCAKKKKCKKAKCAE EJKKKCKKKKCKKJAA EEJKJJJKJJJJKAAA EJKCKKCKKKKCKJAA EKKAKKKCKCKAKCAE EKKKCKKKKKKKKJAA EEJJJJKJKJKJJAAA EJCKKKCKKKCKKJAA EKKACKKKCKKACKAE EKKKKCKKKCKKKJAA EEJJJJJKJJJKJAAA EJCKKKKKKKKCKJAA } # tile 36 (lowered drawbridge) { EEEEEEEEEEEEEEEE JEJCJEJKJEJKJEJK KJKKKKKCKJKCKJKK KJCAKJKAKJKAKJCA KJKKCJKCKKKCKJKK KKKKKJKKKJKKKJCK CJKCKKKCKKKCKJKK KJKKKJKKCJKKKJCK KKCKCJKKKJCKKKKK KJKKKJCKKJCKKJCK CJKCKJKKKJKKCJKK KJKAKJCAKKKAKKKA KKKCKJKKCKKKKJCK JAJKJAJKJAJCJAJK AAAAAAAAAAAAAAAA AAAEAAAEAAAEAAAE } # tile 37 (raised drawbridge) { MMMMMMMMMMMMMMMM MMJKJMJKJMJKJMMM MJKKKJKKKJKKKJMM MJCAKJCAKJCAKJAM MJKKCJKKCJKKCJAM MKKKKKKKKKKKKJAM MJCKKJCKKJCKKKAM MJKCKJKCKJKCKJAM MJKKKKKKKKKKKJAM MKKCKJKCKJKCKJAM MJKKKKKKKKKKKKAM MJCAKJCAKJCAKJAM MJKKCJKKCKKKCJAM MMJKJAJKJAJKJAAM MMMAAAMAAAMAAAMM MMMMMMMMMMMMMMMM } # tile 38 (raised drawbridge) { MMMMMMMMMMMMMMMM MMJJJJJJJJJJJMMM MJKKCKKCKKKKKJMM MCKAKKKKCKCAKKAM MJKCKCKKKKKCKKAM MMJJJJKJKJJJJAAM MJKKKKCKKKKKCJMM MKCAKKKCKCKAKKAM MJKKCKKKKKKCKJAM MMJJJJKJKJJJKAAM MJKKCKKKCKKKCJMM MCKAKCKKKCKAKKAM MJKKKKCKKKKCKJAM MMJKJJJJKJJJJAAM MMMAAAAAAAAAAAMM MMMMMMMMMMMMMMMM } # tile 39 (air) { BBBBBBBBBBBBBBBB BBBBBBBBBBBBBBBB BBBBBBBBBBBBBBBB BBBBBBBBBBBBBBBB BBBBBBBBBBBBBBBB BBBBBBBBBBBBBBBB BBBBBBBBBBBBBBBB BBBBBBBBBBBBBBBB BBBBBBBBBBBBBBBB BBBBBBBBBBBBBBBB BBBBBBBBBBBBBBBB BBBBBBBBBBBBBBBB BBBBBBBBBBBBBBBB BBBBBBBBBBBBBBBB BBBBBBBBBBBBBBBB BBBBBBBBBBBBBBBB } # tile 40 (cloud) { BBBBBBBBBBBBBBBB BBBBBNNNNNNNBBBB BBBNNNNNNNNNNBBB BBNNNNNNNNNONNBB BBNNNNNNNNNNNNNB BNNNNNNNNNNNNONB NNNONNNNNNNNONNN NNNNNNNNNNOONNNN NNNNNNNNNNNNNONN NNOONNNNNNNOONNO NNNNNOOOOONNNNOO BONNNNNNNNNNOOOB BBOOONNNNOOOOOOB BBBOOOOOOOOOOBBB BBBBBBOOOOBBBBBB BBBBBBBBBBBBBBBB } # tile 41 (water) { EEEEEEEEEEEEEEEE EEEEEEEEEEEEEEEE EEEEEEEEEEEEEEEE EEEEEEEEEEEEEEEE EEEEEEEEEEEEEEEE EEEEEEEEEEEEEEEE EEEEEEEEEEEEEEEE EEEEEEEEEEEEEEEE EEEEEEEEEEEEEEEE EEEEEEEEEEEEEEEE EEEEEEEEEEEEEEEE EEEEEEEEEEEEEEEE EEEEEEEEEEEEEEEE EEEEEEEEEEEEEEEE EEEEEEEEEEEEEEEE EEEEEEEEEEEEEEEE } # tile 42 (arrow trap) { MMMMMMMMMMMMMMMM MMMMMDDDDDMMMMMM MMMMDDCACDDMMMMM MMMDCCAAACCDMMMM MMMCCAAAAACDAMMM MMDCCHHAHHCDDAMM MMDCHHNANHHCDAMM MMDCHNNANNHCDAMM MMDCHNNANNHCDAMM MMDCCHAAAHCCDAMM MMMCCAAAAACCAAMM MMMDCAAAAACDAMMM MMMMDAACAADAAMMM MMMMMDDDDDAAMMMM MMMMMMAAAAAMMMMM MMMMMMMMMMMMMMMM } # tile 43 (dart trap) { MMMMMMMMMMMMMMMM MMMMMDDDDDMMMMMM MMMMDDCACDDMMMMM MMMDCCCACCCDMMMM MMMCCCHAHCCDAMMM MMDCCHAAAHCDDMMM MMDCHHAAAHHCDAMM MMDCHNAAANHCDAMM MMDCHNNANNHCDAMM MMDCCAAAAACDDAMM MMMCCAACAACDAAMM MMMDCACACACDAMMM MMMMDDCCCCDAAMMM MMMMMDDDDDAAMMMM MMMMMMAAAAAMMMMM MMMMMMMMMMMMMMMM } # tile 44 (falling rock trap) { MMMMMMMMMMMMMMMM MMMMMDDDDDMMMMMM MMMMDDAACDDMMMMM MMMDCCCCCCCDMMMM MMMCCCAAHCCDAMMM MMDCCHHHHHCDDAMM MMDCHHAAHHHCDAMM MMDCHHHHHHHCDAMM MMDCHHAAHHHCDAMM MMDCHAHAAHHCDAMM MMMCCAAAAHCCAAMM MMMDCCAAHCCDAMMM MMMMDCCCCCDAAMMM MMMMMDDDDDAAMMMM MMMMMMAAAAAMMMMM MMMMMMMMMMMMMMMM } # tile 45 (squeaky board) { MMMMMMMMMMMMMMMM MMMMMDDDDDMMMMMM MMMMDDCCCDDMMMMM MMMDCCCCCCCDMMMM MMMCCCHHHCCDAMMM MMDCCHHNHHCDDAMM MMDAAAAAAAAADAMM MMDAAAAAAAAADAMM MMDAAAAAAAAADAMM MMDAAAAAAAAADAMM MMMCCHHNHHCCAAMM MMMDCCHHHCCDAMMM MMMMDCCCCCDAAMMM MMMMMDDDDDAAMMMM MMMMMMAAAAAMMMMM MMMMMMMMMMMMMMMM } # tile 46 (bear trap) { MMMMMMMMMMMMMMMM MMMMMDDDDDMMMMMM MMMMDDCCCDDMMMMM MMMDAAPCPAADMMMM MMMDAHHHHHADAMMM MMDDAAPNPAACDMMM MMDCANNNNNACDAMM MMDCAAPNPAACDAMM MMDCANNNNNACDAMM MMDDAHHHHHACDAMM MMMDAACHCAADAAMM MMMDCAAAAACDAMMM MMMMDDAAADDAAMMM MMMMMDDDDDAAMMMM MMMMMMAAAAAMMMMM MMMMMMMMMMMMMMMM } # tile 47 (land mine) { MMMMMMMMMMMMMMMM MMMMMDDDDDMMMMMM MMMMDDCCCDDMMMMM MMMDCCCCCCCDMMMM MMMCCCHHHCCDAMMM MMDCCHHAHHCDDAMM MMDCHHAAAHHCDAMM MMDCAAAAAAACDAMM MMDCAAAAAAACDAMM MMDCHHNNNHHCDAMM MMMCCHHNHHCCAAMM MMMDCCHHHCCDAMMM MMMMDCCCCCDAAMMM MMMMMDDDDDAAMMMM MMMMMMAAAAAMMMMM MMMMMMMMMMMMMMMM } # tile 48 (rolling boulder trap) { MMMMMMMMMMMMMMMM MMMMMDDDDDMMMMMM MMMMDDCCCDDMMMMM MMMDCCCCCCCDMMMM MMMCCCHHHCCDAMMM MMDCCAAAAHCDDAMM MMDCAAHAAAHCDAMM MMDCAHAAAAHCDAMM MMDCAAAAAAHCDAMM MMDCAAAAAAHCDAMM MMMCCAAAAHCCAAMM MMMDCCHHHCCDAMMM MMMMDCCCCCDAAMMM MMMMMDDDDDAAMMMM MMMMMMAAAAAMMMMM MMMMMMMMMMMMMMMM } # tile 49 (sleeping gas trap) { MMMMMMMMMMMMMMMM MMMMMDDDDDMMMMMM MMMMDDCCCDDMMMMM MMMDCCHHHCCDMMMM MMMCAAAAAAACAMMM MMDCAANNAAACDAMM MMDCHNNAAAHCDAMM MMDCHNAAANHCDAMM MMDCHAAANHHCDAMM MMDCAAAHHHACDAMM MMMCAAAAAAACAAMM MMMDCCHHHCCDAMMM MMMMDDCCCCDAAMMM MMMMMDDDDDAAMMMM MMMMMMAAAAAMMMMM MMMMMMMMMMMMMMMM } # tile 50 (rust trap) { MMMMMMMMMMMMMMMM MMMMMDDDDDMMMMMM MMMMDDCCCDDMMMMM MMMDCCCCCCCDMMMM MMMCCCHHHCCDAMMM MMDCCAAAAACDDAMM MMDCAAEEEAACDAMM MMDCAEEEEEACDAMM MMDCAEEEEEACDAMM MMDCAAEEEAACDAMM MMMCCAAAAACCAAMM MMMDCCHHHCCDAMMM MMMMDCCCCCDAAMMM MMMMMDDDDDAAMMMM MMMMMMAAAAAMMMMM MMMMMMMMMMMMMMMM } # tile 51 (fire trap) { MMMMMMMMMMMMMMMM MMMMMDDDDDMMMMMM MMMMDDCCCDDMMMMM MMMDCCAAACCDMMMM MMMCCAADAACDAMMM MMDCAADDAAADDAMM MMDCAADDDAACDAMM MMDCADCHCDACDAMM MMDCADHNHDACDAMM MMDCAAHNHAACDAMM MMMCCAANAACCAAMM MMMDCCAAACCDAMMM MMMMDCCCCCDAAMMM MMMMMDDDDDAAMMMM MMMMMMAAAAAMMMMM MMMMMMMMMMMMMMMM } # tile 52 (pit) { AAAAAAAAAAAAAAAA AMAAAAAAAAAAAABA AMMAAAAAAAAAABBA AMMMAAAAAAAABBBA AMMMAMMMMMMABBBA AMMMAMMMMMMABBBA AMMMAMMMMMMABBBA AMMMAMMMMMMABBBA AMMMAMMMMMMABBBA AMMMAMMMMMMABBBA AMMMAMMMMMMABBBA AMMMAAAAAAAABBBA AMMMPPPPPPPPPBBA AMMPPPPPPPPPPPBA AMPPPPPPPPPPPPPA AAAAAAAAAAAAAAAA } # tile 53 (spiked pit) { AAAAAAAAAAAAAAAA AMAAAAAAAAAAAABA AMMAAAAAAAAAABBA AMMMAAAAAAAABBBA AMMMAMMMMMMABBBA AMMMAMNMNMMABBBA AMMMAMMMMMMABBBA AMMMAMMNMNMABBBA AMMMAMMMMMMABBBA AMMMAMNMNMMABBBA AMMMAMMMMMMABBBA AMMMAAAAAAAABBBA AMMMPPPPPPPPPBBA AMMPPPPPPPPPPPBA AMPPPPPPPPPPPPPA AAAAAAAAAAAAAAAA } # tile 54 (hole) { MMMMMMMMMMMMMMMM MMMMMMAAAAMMMMMM MMMMMAAAAAABMMMM MMMMAAAAAAABBMMM MMMAAAAAAAAABBBM MMMAAAAAAAAAABBM MMMAAAAAAAAAABBM MMMAAAAAAAAAABBM MMMAAAAAAAAAABBM MMMMAAAAAAAAABBM MMMMMAAAAAAAABBM MMMMMAAAAAAABBMM MMMMMMAAAAABMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 55 (trap door) { AAAAAAAAAAAAAAAA AMAAAAAAAAAAAABA AMMAAAAAAAAAABBA AMMMAAAAAAAABBBA AMMMAAAAAAAABBBA AMMMAAAAAAAABBBA AMMMAAAAAAAABBBA AMMMAAAAAAAABBBA AMMMAAAAAAAABBBA AMMMAAAAAAAABBBA AMMMAAAAAAAABBBA AMMMAAAAAAAABBBA AMMMPPPPPPPPPBBA AMMPPPPPPPPPPPBA AMPPPPPPPPPPPPPA AAAAAAAAAAAAAAAA } # tile 56 (teleportation trap) { MMMMMMMMMMMMMMMM MMMMMDDDDDMMMMMM MMMMDDCACDDMMMMM MMMDCCAAACCDMMMM MMMDCAAAAACCAMMM MMDDCHHAHHCCDMMM MMDCOHAAAHOCDAMM MMDCHOAAAOHCDAMM MMDCHOAAAOHCDAMM MMDDCHHAHHCCDAMM MMMDCAAAAACCAAMM MMMDCCAAACCDAMMM MMMMDDCACDDAAMMM MMMMMDDDDDAAMMMM MMMMMMAAAAAMMMMM MMMMMMMMMMMMMMMM } # tile 57 (level teleporter) { MMMMMMMMMMMMMMMM MMMMMDDADDMMMMMM MMMMDDAAADDMMMMM MMMDCAAAAADDMMMM MMMDCCCACCCCAMMM MMDDCHAAAHCCDMMM MMDCOAAOAAOCDAMM MMDCHAOOOAHCDAMM MMDCHAAOAAHCDAMM MMDDCHAAAHCCDAMM MMMDCCCACCCCAAMM MMMDCAAAAACDAMMM MMMMDDAAADDAAMMM MMMMMDDADDAAMMMM MMMMMMAAAAAMMMMM MMMMMMMMMMMMMMMM } # tile 58 (magic portal) { MMMMMMMMMMMMMMMM MMMMMDDDDDMMMMMM MMMMDDCACDDMMMMM MMMDCCAAACCDMMMM MMMDCAAAAACCAMMM MMDDCHHAHHHADMMM MMDDCHOAOAACDAMM MMDDOAAAAAOCDAMM MMDDAAOAOOCCDAMM MMDAHHHAHHCCDAMM MMMDCAAAAACCAAMM MMMDCCAAACCDAMMM MMMMDDCACDDAAMMM MMMMMDDDDDAAMMMM MMMMMMAAAAAMMMMM MMMMMMMMMMMMMMMM } # tile 59 (web) { OAOAMOAMMMOMMMMO MOMNNNNMNOAMMOOA OONMNOMNAMMOOAMM MNMMOOMNMNOAMMMM MNMOMMMNOAMMMMMM ONOMOMNAMMMMMMMM MONNNNAMMMMMMMMM MMOMNAMMMMMMMMMM MOAMOAMMMMMMMMMM MOONAMMMMMMMMMMM OAMOAMMMMMMMMMMM MMOAMMMMMMMMMMMM MMOAMMMMMMMMMMMM MOAMMMMMMMMMMMMM MOAMMMMMMMMMMMMM OAMMMMMMMMMMMMMM } # tile 60 (statue trap) { MMMMMMMMMMMMMMMM MMMMMDDDDDMMMMMM MMMMDDCAADDMMMMM MMMDCCAJJACDMMMM MMMCCAKCJJADAMMM MMDAAAKKJJADDAMM MMACKACCJAAADAMM MMAJJCKKJACJAAMM MMDAJCKJJJJJAAMM MMDAJCKJJJAADAMM MMMCACCJAACCAAMM MMMDACKJACCDAMMM MMMMDCCCCCDAAMMM MMMMMDDDDDAAMMMM MMMMMMAAAAAMMMMM MMMMMMMMMMMMMMMM } # tile 61 (magic trap) { MMMMMMMMMMMMMMMM MMMMMDDDDDMMMMMM MMMMDDCCCDAMMMMM MMMDCCCCCCADMMMM MMMCCCHHHAADAMMM MMDCAHHNHAADDAMM MMDCAANNAAACDAMM MMDCAAAAAAACDAMM MMDCAAANNAACDAMM MMDCAANNNHACDAMM MMMCAAHNHHCCAAMM MMMDACHHHCCDAMMM MMMMACCCCCDAAMMM MMMMMDDDDDAAMMMM MMMMMMAAAAAMMMMM MMMMMMMMMMMMMMMM } # tile 62 (anti-magic field) { MMMMMMMMMMMMMMMM MMMMMMDDDDDMMMMM MMMMMADCCCDDMMMM MMMMDACCCCCCDMMM MMMADAAHHHCCCMMM MMADDAAHNHHACDMM MMADCAAANNAACDMM MMADCAAAAAAACDMM MMADCAANNAAACDMM MMADCAHNNNAACDMM MMAACCHHNHAACMMM MMMADCCHHHCADMMM MMMAADCCCCCAMMMM MMMMAADDDDDMMMMM MMMMMAAAAAMMMMMM MMMMMMMMMMMMMMMM } # tile 63 (polymorph trap) { MMMMMMMMMMMMMMMM MMMMMDDDDDMMMMMM MMMMDDCCCDDMMMMM MMMDCAAAPCCDMMMM MMMCCAAPHCCDAMMM MMDCCAPAAHCDDAMM MMDCHPNAAHHCDAMM MMDCHNPAPNHCDAMM MMDCHNAANPHCDAMM MMDCHHAAPAHCDAMM MMMCCHHPAACCAAMM MMMDCCPAAACDAMMM MMMMDCCCCCDAAMMM MMMMMDDDDDAAMMMM MMMMMMAAAAAMMMMM MMMMMMMMMMMMMMMM } # tile 64 (wall) { MMMMMMMNNMMMMMMM MMMMMMNNMMMMMMMM MMMMMNNMMMMMMMMM MMMMMMNNMMMMMMMM MMMMMMMNNMMMMMMM MMMMMMMMNNMMMMMM MMMMMMMMMNNMMMMM MMMMMMMMNNMMMMMM MMMMMMMNNMMMMMMM MMMMMMNNMMMMMMMM MMMMMNNMMMMMMMMM MMMMMMNNMMMMMMMM MMMMMMMNNMMMMMMM MMMMMMMMNNMMMMMM MMMMMMMMMNNMMMMM MMMMMMMMNNMMMMMM } # tile 65 (wall) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMNMMMMMMMNMMMMM MNNNMMMMMNNNMMMM NNMNNMMMNNMNNMMM NMMMNNMNNMMMNNMN MMMMMNNNMMMMMNNN MMMMMMNMMMMMMMNM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 66 (wall) { NNNNNMMMMMMMMMMM MMMMNMMMMMMMMMMM MMMMNMMMMMMMMMMM MMMMNMMMMMMMMMMM MMMMNMMMMMMMMMMM MMMMNMMMMMMMMMMM MMMMNMMMMMMMMMMM MMMMNMMMMMMMMMMM MMMMNNNNNNNNNMMM MMMMMMMMMMMMNMMM MMMMMMMMMMMMNMMM MMMMMMMMMMMMNMMM MMMMMMMMMMMMNMMM MMMMMMMMMMMMNMMM MMMMMMMMMMMMNMMM MMMMMMMMMMMMNNNN } # tile 67 (wall) { MMMMMMMMMMMMNNNN MMMMMMMMMMMMNMMM MMMMMMMMMMMMNMMM MMMMMMMMMMMMNMMM MMMMMMMMMMMMNMMM MMMMMMMMMMMMNMMM MMMMMMMMMMMMNMMM MMMMNNNNNNNNNMMM MMMMNMMMMMMMMMMM MMMMNMMMMMMMMMMM MMMMNMMMMMMMMMMM MMMMNMMMMMMMMMMM MMMMNMMMMMMMMMMM MMMMNMMMMMMMMMMM MMMMNMMMMMMMMMMM NNNNNMMMMMMMMMMM } # tile 68 (cmap / dig beam) { MMMMAAAAMMMMMMMM MMAMMMMAAMMAAMMM MAAMAAAMMMMMMAAM MAAMAMMMMAMMAAMM MMAMMMMAMAMAMAAM MAMMAAAMAMMMMAAM MAMAAMMMMMAMAAMM MMMAAMMMMAAMMMMM MAMAMMMAMMMAMAMM MMMAMMMMMMAAMAAM MAMAAAMAAAAMAMAM MAAMMAAMMMMMMMAM MMAMMMAAMMAMMAAM MMAAAAAMMAAAAAMM MMMMAAMMMMAAAMMM MMMMMMMMMMMMMMMM } # tile 69 (cmap / camera flash) { MMMMMMMMMMMMMMMM MMMMMNNNNNNMMMMM MMMNNNNNNNNNNMMM MMNNNNNNNNNNNNMM MMNNNNNNNNNNNNMM MNNNNNNNNNNNNNNM MNNNNNNNNNNNNNNM MNNNNNNNNNNNNNNM MNNNNNNNNNNNNNNM MNNNNNNNNNNNNNNM MNNNNNNNNNNNNNNM MMNNNNNNNNNNNNMM MMNNNNNNNNNNNNMM MMMNNNNNNNNNNMMM MMMMMNNNNNNMMMMM MMMMMMMMMMMMMMMM } # tile 70 (cmap / thrown boomerang, open left) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMKKMMMMMMMMMM MMMMKHKAMMMMMMMM MMMMMKHKAMMMMMMM MMMMMMCKKAMMMMMM MMMMMMMKCKAMMMMM MMMMMMMMKDKAMMMM MMMMMMMMJDKAMMMM MMMMMMMJKDJAMMMM MMMMMMJKDJAMMMMM MMMMMJHDJAMMMMMM MMMMJHDJAMMMMMMM MMMMMKJAMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 71 (cmap / thrown boomerang, open right) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMJKMMMMM MMMMMMMMJDHJMMMM MMMMMMMJDHJAMMMM MMMMMMJDKJAMMMMM MMMMMJDKJAMMMMMM MMMMMKDJAMMMMMMM MMMMMCDKAMMMMMMM MMMMMMCKKAMMMMMM MMMMMMMKCKAMMMMM MMMMMMMMKHKAMMMM MMMMMMMMMKHKAMMM MMMMMMMMMMKKAMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 72 (cmap / magic shield 1) { MMMMMMMMMMMMMMMM MMMMMIMMMMIMMMMM MMMMIMMMMMMIMMMM MMMIMMMMMMMMIMMM MMIMMMIIIIMMMIMM MIMMMMMMMMMMMMIM MMMMIMMIIMMIMMMM MMMMIMIIIIMIMMMM MMMMIMIIIIMIMMMM MMMMIMMIIMMIMMMM MIMMMMMMMMMMMMIM MMIMMMIIIIMMMIMM MMMIMMMMMMMMIMMM MMMMIMMMMMMIMMMM MMMMMIMMMMIMMMMM MMMMMMMMMMMMMMMM } # tile 73 (cmap / magic shield 2) { MMMMMMMMMMMMMMMM MCCCCCCCCCCCCCCC MCMMMMMMMMMMMMMM MCMCCCCCCCCCCCCM MCMCMMMMMMMMMMCM MCMCMCCCCCCCCMCM MCMCMCMMMMMMCMCM MCMCMCMCCCCMCMCM MCMCMCMCCMCMCMCM MCMCMCMMMMCMCMCM MCMCMCCCCCCMCMCM MCMCMMMMMMMMCMCM MCMCCCCCCCCCCMCM MCMMMMMMMMMMMMCM MCCCCCCCCCCCCCCM MMMMMMMMMMMMMMMM } # tile 74 (cmap / magic shield 3) { MMMMMMMHHMMMMMMM MMMMMMMHHMMMMMMM MMMMHHMHHMHHMMMM MMMHMMMHHMMMHMMM MMHMHMMMMMMHMHMM MMHMMHMMMMHMMHMM MMMMMMHMMHMMMMMM HHHHMMMHHMMMHHHH HHHHMMMHHMMMHHHH MMMMMMHMMHMMMMMM MMHMMHMMMMHMMHMM MMHMHMMMMMMHMHMM MMMHMMMHHMMMHMMM MMMMHHMHHMHHMMMM MMMMMMMHHMMMMMMM MMMMMMMHHMMMMMMM } # tile 75 (cmap / magic shield 4) { MMMMMMMMMMMMMMMM MMMMMMNNNNNMMMMM MMMMMMMMNMMMMMMM MMMNNNNMNMNNNMMM MMMNMMNMNMNMNMMM MNMNNNNMNMNMNMMM MNMMMMMMNMNNNMNM MNNNNNNNNMMMMMNM MNMMMMMNNNNNNNNM MNMNNNMNMMMMMMNM MMMNMNMNMNNNNMNM MMMNMNMNMNMMNMMM MMMNNNMNMNNNNMMM MMMMMMMNMMMMMMMM MMMMMNNNNNMMMMMM MMMMMMMMMMMMMMMM } # tile 76 (cmap / swallow top left) { AAAAAAADDDDDDAAA AAAAADDDDDDDDDDD AAAADDDDDDDDDDDD AAADDDDDDCCDDDDD AAADDDCCCCCCDDDD AADDDDCCCCCDDDDD AADDDCCCCCDDDDDD AADDDCCCCDDDDDMM AADDDCCCDDDDMMMM AADDDCCCDDDDMMMM AADDDDDDDDDMMMMM AAADDDDDDDMMMMMM AAADDDDDDDMMMMMM AAAADDDDDDMMMMMM AAAADDDDDDMMMMMM AAAADDDDDDMMMMMM } # tile 77 (cmap / swallow top center) { AAAAAAAAAAAAAAAA DDAAAAAAAAAAAAAA DDDDAAAAAAAAAADD DDDDDDDDDDDDDDDD DDDDDDDDDDDDDDDD DDDDDDDDDDDDDDDD DDDDDDDCCCCCCDDD MDDDDDDDDCCCCCDD MMMDDDDDDDDDDDDD MMMMDDDDDDDDDDDD MMMMMMDDDDDDDDMM MMMMMMMDDDDMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 78 (cmap / swallow top right) { AAAAAAAAAAAAAAAA AAADDDDDAAAAAAAA DDDDDDDDDDDAAAAA DDDDDDDDDDDDAAAA DDDDDCCCDDDDDAAA DDDDDCCCCDDDDDAA DDDDDCCCCDDDDDDA DDDDDCCCCCDDDDDD DDDDDDCCCCCDDDDD DDDDDDDCCCCDDDDD MMMDDDDDCCCDDDDD MMMDDDDDDCCDDDDD MMMMDDDDDDDDDDDD MMMMDDDDDDDDDDDD MMMMDDDDDDDDDDDD MMMMDDDDDDDDDDDA } # tile 79 (cmap / swallow middle left) { AAAADDDDDDMMMMMM AAAADDDDDDDMMMMM AAAADDDDDDDMMMMM AAAADDDDDDDDMMMM AAAADDCCCDDDMMMM AAADDDDCCDDDMMMM AADDDDCCCDDDMMMM AADDDDCCCDDDMMMM AADDDDCDDDDDMMMM ADDDDDDDDDDMMMMM ADDDDDDDDDMMMMMM DDDDDDDDDMMMMMMM DDDDDDDDMMMMMMMM DDDDDDDMMMMMMMMM DDDDDDDMMMMMMMMM DDCCDDDMMMMMMMMM } # tile 80 (cmap / swallow middle right) { MMMMDDDDDDDDDDDA MMMMDDDDDDDDDDDA MMMMDDDDDDDDDDAA MMMMDDDDDDDDDDAA MMMDDDDDDDDDDDAA MMDDDCCDDDDDDAAA MMDDDCCDDDDDDAAA MMDDDCCDDDDDAAAA MMDDDCCDDDDDAAAA MMDDDDDDDDDDAAAA MMMDDDDDDDDDAAAA MMMDDDDDDDDDAAAA MMMMDDDDDDDDDAAA MMMMMDDDDDDDDAAA MMMMMMDDDDDDDDAA MMMMMMMDDDDDDDAA } # tile 81 (cmap / swallow bottom left) { DDDCDDDMMMMMMMMM DDDCDDDMMMMMMMMM ADDCDDDMMMMMMMMM ADDDDDDDMMMMMMMM ADDDDDDDDDDDDMMM AADDDDDDDDDDDDDD AADDDDDDDDDDDDDD AAADDDDDDDDCDDDD AAAAADDDDDDCCCCD AAAAAAADDDDDCCCD AAAAAAAAADDDDCCC AAAAAAAAAADDDDCC AAAAAAAAAAADDDDD AAAAAAAAAAADDDDD AAAAAAAAAAAADDDD AAAAAAAAAAAAAADD } # tile 82 (cmap / swallow bottom center) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMDDD MMMMMMMMMMMMDDDD DMMMMMMMMMMMDDDD DDMMMMMMMMMMDDDC DDDMMMMMMMMMDDDC DDDDMMMMMMMMDDDC DDDDDDMMMMDDDDDC DDDDDDDDDDDDDDDC DDDDDDDDDDDDDDDC DDDDDDDDDDDDDDDD DDDDDDDDDDDDDDDD DDDDDDDDDDDDDDAA } # tile 83 (cmap / swallow bottom right) { MMMMMMDDDDDDDDAA MMMMMMDDDDDDDDDA MMMMMDDDDDDDDDDA MMMMDDDDDDDDDDDA DDDDDDDDDDDDDDDA DDDDDDDDDDDDDDDA CCCDDDDDDDDDDDAA CCCCDDDDDDDDDDAA CCCDDDDDDDDDDDAA CCDDDDDDDDDDDAAA CCDDDDDDAAAAAAAA CDDDDDAAAAAAAAAA CDDDDAAAAAAAAAAA DDDDAAAAAAAAAAAA DDAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA } # tile 84 (explosion dark 0) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMAAA MMMMMMAMMMAAAAAA MMMMMMMMMAAAAAAA MMMMMMMMMAAAAAAM MMMMMMMMAAAAMMMA MMMAAAMAAAAMMMAA MAMMMAAAAAAMAAAA MMMMMAAAAAAMAAAA MMMMAAAAAAAMAAAA MMMMMMMMAAMMAAMM MMMMAAAAAAAAAAMM MMMAAAAMMAAAMMMM MMAAAAMMAAAAMMMM MMAAAMMAAAAAMMMM } # tile 85 (explosion dark 1) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM AMMMMMMMMAAAAAAM AAAAAAMAAAAAAAAM AAAAAAMMMMMAAAAA MMMAAAMAAAAAAAAA AAAAAAMAAAAAAAAA AAAAAAMAAAAAAAAM AAMMMMMMMMMMMAMM MMAAAMAMMMMMAAAA MAMAMAMMMAMMMAAA MPPAMMMAAMMMMMAA MAMMMMMAMMMMAAAA MMMMMAMMAMMMPAAA MMMMMMMMAMAMAPAA MPAMMMAPAAAAAAAA } # tile 86 (explosion dark 2) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMAMMMAMMM AAAAAMMMMMMMMMMM AAAAAAMMMAMMAMMM AAAAAAAMMMMMMMMM MMMMMMAAAAMMMMMM AAAAAMMAAAAMMMMM MMAAAAAAAAAAMMMM AAMAAMMMMAAAMMMM AAMAAAAAMAAAMMMM AAPAAMAAAAAAMAMM AAAMMMMMAAAAMMMM AAMAMMAMAAAAMMMM AMAAMMAMAAAAAMMM } # tile 87 (explosion dark 3) { MMAAAMAMAAAMMMMM MMAAAMAAAAAMAPMM MMMAAMAAMMMMMMMA MMMAAAAAAMMMMPPM MMAAAMAAMMAMMPAP MAAAMMMAMMMMPMAP MAAAMAAAMAMMPMMP MAAAMAAAMMMAAAAP MAAAMAAAMMMMPAAA MAAAMMAAMMMMPPAA MMAAAMMAAMMMPAAP MMMAAAMMMAPMPPPP MMMMAAAMMMPMMPMA MMMMMAAMMMMMAAAM MMAMAMMMAAPMMMPA MMMMAMMMMMMMMMPA } # tile 88 (explosion dark 4) { APAAAMMPPAPAAAAA MAPAMMAMAAAPAAAM AAPMPAAMMAAAAAAM PAPPPAAAMMAAPAMM AAAPPAAAAPAAPMMA AAPPMPPPAAAAAMMA AAPAAAAAAAAAAAMM APPAAAAAAAAAAAMM AAAAAAAAAAAAPAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAMAA AAAAAAAAAAAMHHMM } # tile 89 (explosion dark 5) { MMAAAMAMAMAAAAMM MMAAAAAMAMAAAAMM MMAAAAAMAMAAAAMM PMAAAAAMMMAAAAMM PMAAPAPAAMAAAAMM PMMMPMMAMMAAAMMM MMMAPMMAAAAAAMMM MPAAPAAAAAAAAMMM AAPMMMPAAAAAMMMM MMAAMPPAAMAMMMAM AMMMPPMMMMMMMMMM MAAAAPPAAMMMAMMM MMAAMPPMAAAMMMMM AMMMMMMAAAAAMMMM AAAMMMAAAAAAAMMM MMMMPPAAAAAAAAMM } # tile 90 (explosion dark 6) { MMMMAMMMMMMMAMMP MMMMAMMMMMMMAAMM MAMMAAMMMPMMAMAM MMMAAAMAMMPMMAAP MMMAAAAMMAAPMMAM MMMAAAAMMMMPMMMA MMMAAAAMMAMMAMMA MMMAAAAAMAAAMMMM MMMAAAAAMMAAMMMM MMMMAAAAAAAAAMMM MMMMMAAAAAAAAAAA MMMAMMAAAAAAAAAA MMMMMMMMAAMAAAAA MMMAMMMMMMMMAAAA MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 91 (explosion dark 7) { PPPAAAAAPAAAMAMM AAPPAAPPPPAMAMMM PPPPPPPPPPAMMAPP MPPAAMAAMAPAAMMM MMAAAAMAMMAAAPAA APPAPAPMAMAMPAAM AMMPPAAAMMMMMMMP AAMMMMMMMAMMMMMM PAPAMAAAAAAAAAAP AAMAPAAAAMMMMMMA AAAMAMPPMMMAAAAA AAAAAAMAMMAAAAAA AAAAAAAAAAAAAAAA AAAAMMMMMMMMMMAA MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 92 (explosion dark 8) { MMMMPMMAAAAAAAMM MMAMMAMAAMAMAAMM PPMMAMMAAMAMAAMM MMMAAAMAAMAMAAMM MAAAAAMAAAMMAAMM MMPAAMMAAAMAAAMM MAAAMMAAAMMAAAMM MAMAAMAAAAAAAAMM AAMAAAAAAMAAAAMM MMMAAAAAAAAAAAMM MAAAAAAAAMAAAMMM AAAAAAAAMMMMMMMM AAAAAAMMMMAMMMMM AAAMMMAMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 93 (explosion noxious 0) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMFFF MMMMMMFMMMFFFFFF MMMMMMMMMFFFFFFF MMMMMMMMMFFFFFFM MMMMMMMMFFFFMMMF MMMFFFMFFFFMMMFF MFMMMFFFFFFMFFFF MMMMMFFFFFFMFFFF MMMMFFFFFFFMFFFF MMMMMMMMFFMMFFMM MMMMFFFFFFFFFFMM MMMFFFFMMFFFMMMM MMFFFFMMFFFFMMMM MMFFFMMFFFFFMMMM } # tile 94 (explosion noxious 1) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM FMMMMMMMMFFFFFFM FFFFFFMFFFFFFFFM FFFFFFMMMMMFFFFF MMMFFFMFFFFFFFFF FFFFFFMFFFFFFFFF FFFFFFMFFFFFFFFM FFMMMMMMMMMMMFMM MMFFFMFMMMMMFFFF MHMFMFMMMFMMMFFF MGGFMMMFFMMMMMFF MHMMMMMFMMMMFFFF MMMMMFMMFMMMGFFF MMMMMMMMFMFMFGFF MGHMMMHGHHFFFFFF } # tile 95 (explosion noxious 2) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMFMMMFMMM FFFFFMMMMMMMMMMM FFFFFFMMMFMMFMMM FFFFFFFMMMMMMMMM MMMMMMFFFFMMMMMM FFFFFMMFFFFMMMMM MMFFFFFFFFFFMMMM FFMFFMMMMFFFMMMM FFMFFFFFMFFFMMMM FFGFFMFFFFFFMFMM FFFMMMMMFFFFMMMM FFMFMMFMFFFFMMMM FMFFMMFMFFFFFMMM } # tile 96 (explosion noxious 3) { MMFFFMFMFFFMMMMM MMFFFMFFFFFMFGMM MMMFFMFFMMMMMMMF MMMFFFFFFMMMMGGM MMFFFMFFMMFMMGFG MFFFMMMFMMMMGMFG MFFFMFFFMHMMGMMG MFFFMFFFMMMFFFFG MFFFMFFFMMMMGFHH MFFFMMFFMMMMGGHH MMFFFMMFFMMMGHHG MMMFFFMMMFGMGGGG MMMMFFFMMMGMMGMH MMMMMFFMMMMMHHFM MMFMFMMMFHGMMMGH MMMMFMMMMMMMMMGH } # tile 97 (explosion noxious 4) { FGHFFMMGGFGHFFFF MHGHMMFMFFHGFHFM HFGMGHFMMHHHFFHM GFGGGHHHMMHHGFMM HHHGGHHHHGHHGMMF HHGGMGGGHHHHFMMF HHGHHHHHHHHHHFMM HGGHHHHHHHHHHHMM HHHHHHNNNNHHGHNH GHHHHHHHNHHHHHNH GHHGHGNNNNHHHHGF GGNHNHNNNNHHHGGF HHHHNHNNNHHHGGGG HGGNGHNNNHHHGGGF HHHHNHNHNMGGGMGF GGGGNHHHGGGMHHMM } # tile 98 (explosion noxious 5) { MMFFFMFMFMFFFFMM MMFFFFFMFMFFFFMM MMFFFFFMFMFFFFMM GMFFFFFMMMFFFFMM GMFFGFGFFMFFFFMM GMMMGMGFMMFFFMMM MMMFGMMFFFFFFMMM MGFFFFFFFFFFFMMM FFGMMMGFFFFFMMMM MMFFMGGFFMFMMMFM FMMMGGMMMMMMMMMM MFFFFGGFFMMMFMMM MMHFMGGMFFFMMMMM HMMMMMMFFFFFMMMM HFHMMMFFFFFFFMMM MMMMGGFFFFFFFFMM } # tile 99 (explosion noxious 6) { MMMMFMMMMMMMHMMG MMMMFMMMMMMMFHMM MFMMFFMMMGMMFMHM MMMFFFMFMMGMMFFG MMMFFFFMMFFGMMFM MMMFFFFMMMMGMMMF MMMFFFFMMFMMHMMF MMMFFFFFMFFFMMMM MMMFFFFFMMFFMMMM MMMMFFFFFFFFFMMM MMMMMFFFHFFFFFFF MMMFMMFFFFFFFFFF MMMMMMMMFFMFFFFF MMMFMMMMMMMMFFFF MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 100 (explosion noxious 7) { GGGHHHHHGHHHMHMM HHGGHHGGGGHMFMMM GGGGGGGGGGFMMFGG MGGHFMFFMHGFFMMM MMHHHHMFMMFFHGHF HGGFGFGMHMHMGFFM FMMGGFFHMMMMMMMG HFMMMMMMMFMMMMMM GHGFMFFFFFFFFFFG HFMHGHFFFMMMMMMF FFFMFMGGMMMFFFFF FFFFFFMFMMFFFFFF FFFFFFFFFFFFFFFF FFFFMMMMMMMMMMFF MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 101 (explosion noxious 8) { MMMMGMMFFFFFFFMM MMFMMFMFFMFMFFMM GGMMFMMFFMFMFFMM MMMFFFMFFMFMFFMM MFFFFFMFFFMMFFMM MMGFFMMFFFMFFFMM MFFFMMFFFMMFFFMM MFMFFMFFFFFFFFMM FFMFFFFFFMFFFFMM MMMFFFFFFFFFFFMM MFFFFFFFFMFFFMMM FFFFFFFFMMMMMMMM FFFFFFMMMMFMMMMM FFFMMMFMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 102 (explosion muddy 0) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMJJJ MMMMMMJMMMJJJJJJ MMMMMMMMMJJJJJJJ MMMMMMMMMJJJJJJK MMMMMMMMJJJJKKKJ MMMJJJMJJJJKKKJJ MJMMMJJJJJJKJJJJ MMMMMJJJJJJKJJJJ MMMMJJJJJJJKJJJJ MMMMMMMKJJKKJJKK MMMMJJJJJJJJJJKK MMMJJJJKKJJJKKKK MMJJJJKKJJJJKKKK MMJJJKKJJJJJKKKK } # tile 103 (explosion muddy 1) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM JMMMMMMMMJJJJJJM JJJJJJKJJJJJJJJM JJJJJJKKKKKJJJJJ KKKJJJKJJJJJJJJJ JJJJJJKJJJJJJJJJ JJJJJJKJJJJJJJJK JJKKKKKKKKKKKJKK KKJJJKJKKKKKJJJJ KLKJKJKKKJKKKJJJ KCCJKKKJJKKKKKJJ KLKKKKKJKKKKJJJJ KKKKKJKKJKKKCJJJ KKKKKKKKJKJKJCJJ KCLKKKLCLLJJJJJJ } # tile 104 (explosion muddy 2) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMJMMMJMMM JJJJJMMMMMMMMMMM JJJJJJMMMJMMJMMM JJJJJJJMMMMMMMMM KKKKKKJJJJMMMMMM JJJJJKKJJJJMMMMM KKJJJJJJJJJJMMMM JJKJJKKKKJJJMMMM JJKJJJJJKJJJMMMM JJCJJKJJJJJJMJMM JJJKKKKKJJJJMMMM JJKJKKJKJJJJMMMM JKJJKKJKJJJJJMMM } # tile 105 (explosion muddy 3) { MMJJJKJKJJJKKKKK MMJJJKJJJJJKJCKK MMMJJKJJKKKKKKKJ MMMJJJJJJKKKKCCK MMJJJKJJKKJKKCJC MJJJKKKJKKKKCKJC MJJJKJJJKLKKCKKC MJJJKJJJKKKJJJJC MJJJKJJJKKKKCJLL MJJJKKJJKKKKCCLL MMJJJKKJJKKKCLLC MMMJJJKKKJCKCCCC MMMMJJJKKKCKKCKL MMMMMJJKKKKKLLJK MMJMJKKKJLCKKKCL MMMMJKKKKKKKKKCL } # tile 106 (explosion muddy 4) { JCLJJKKCCJCLJJJJ KLCLKKJKJJLCJLJK LJCKCLJKKLLLJJLK CJCCCLLLKKLLCJKK LLLCCLLLLCLLCKKJ LLCCKCCCLLLLJKKJ LLCLLLLLLLLLLJKK LCCLLLLLLLLLLLKK LLLLLLCCCCLLCLCL CLLLLLLLCLLLLLCL CLLCLCCCCCLLLLCJ CCCLCLCCCCLLLCCJ LLLLCLCCCLLLCCCC LCCCCLCCCLLLCCCJ LLLLCLCLCKCCCKCJ CCCCCLLLCCCKLLKK } # tile 107 (explosion muddy 5) { KKJJJKJKJKJJJJMM KKJJJJJKJKJJJJMM KKJJJJJKJKJJJJMM CKJJJJJKKKJJJJMM CKJJCJCJJKJJJJMM CKKKCKKJKKJJJMMM KKKJCKKJJJJJJMMM KCJJCJJJJJJJJMMM JJCKKKCJJJJJMMMM KKJJKCCJJKJMMMJM JKKKCCKKKKMMMMMM KJJJJCCJJKMMJMMM KKLJKCCKJJJMMMMM LKKKKKKJJJJJMMMM LJLKKKJJJJJJJMMM KKKKCCJJJJJJJJMM } # tile 108 (explosion muddy 6) { MMMMJKKKKKKKLKKC MMMMJKKKKKKKJLKK MJMMJJKKKCKKJKLK MMMJJJKJKKCKKJJC MMMJJJJKKJJCKKJK MMMJJJJKKKKCKKKJ MMMJJJJKKJKKLKKJ MMMJJJJJKJJJKKKK MMMJJJJJKKJJKKKK MMMMJJJJJJJJJKKK MMMMMJJJLJJJJJJJ MMMJMMJJJJJJJJJJ MMMMMMMMJJMJJJJJ MMMJMMMMMMMMJJJJ MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 109 (explosion muddy 7) { CCCLLLLLCLLLKLKK LLCCLLCCCCLKJKKK CCCCCCCCCCJKKJCC KCCLJKJJKLCJJKKK KKLLLLKJKKJJLCLJ LCCJCJCKLKLKCJJK JKKCCJJLKKKKKKKC LJKKKKKKKJKKKKKK CLCJKJJJJJJJJJJC LJKLCLJJJKKKKKKJ JJJKJKCCKKKJJJJJ JJJJJJKJKKJJJJJJ JJJJJJJJJJJJJJJJ JJJJMMMMMMMMMMJJ MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 110 (explosion muddy 8) { KKKKCKKJJJJJJJMM KKJKKJKJJKJKJJMM CCKKJKKJJKJKJJMM KKKJJJKJJKJKJJMM KJJJJJKJJJKKJJMM KKCJJKKJJJKJJJMM KJJJKKJJJKKJJJMM KJKJJKJJJJJJJJMM JJKJJJJJJKJJJJMM KKKJJJJJJJJJJJMM KJJJJJJJJMJJJMMM JJJJJJJJMMMMMMMM JJJJJJMMMMJMMMMM JJJMMMJMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 111 (explosion wet 0) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMEEE MMMMMMEMMMEEEEEE MMMMMMMMMEEEEEEE MMMMMMMMMEEEEEEP MMMMMMMMEEEEPPPE MMMEEEMEEEEPPPEE MEMMMEEEEEEPEEEE MMMMMEEEEEEPEEEE MMMMEEEEEEEPEEEE MMMMMMMPEEPPEEPP MMMMEEEEEEEEEEPP MMMEEEEPPEEEPPPP MMEEEEPPEEEEPPPP MMEEEPPEEEEEPPPP } # tile 112 (explosion wet 1) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM EMMMMMMMMEEEEEEM EEEEEEPEEEEEEEEM EEEEEEPPPPPEEEEE PPPEEEPEEEEEEEEE EEEEEEPEEEEEEEEE EEEEEEPEEEEEEEEP EEPPPPPPPPPPPEPP PPEEEPEPPPPPEEEE PNPEPEPPPEPPPEEE PBBEPPPEEPPPPPEE PNPPPPPEPPPPEEEE PPPPPEPPEPPPBEEE PPPPPPPPEPEPEBEE PBNPPPNBEEEEEEEE } # tile 113 (explosion wet 2) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMEMMMEMMM EEEEEMMMMMMMMMMM EEEEEEMMMEMMEMMM EEEEEEEMMMMMMMMM PPPPPPEEEEMMMMMM EEEEEPPEEEEMMMMM PPEEEEEEEEEEMMMM EEPEEPPPPEEEMMMM EEPEEEEEPEEEMMMM EEBEEPEEEEEEMEMM EEEPPPPPEEEEMMMM EEPEPPEPEEEEMMMM EPEEPPEPEEEEEMMM } # tile 114 (explosion wet 3) { MMEEEPEPEEEPPPPP MMEEEPEEEEEPEBPP MMMEEPEEPPPPPPPE MMMEEEEEEPPPPBBP MMEEEPEEPPEPPBEB MEEEPPPEPPPPBPEB MEEEPEEEPNPPBPPB MEEEPEEEPPPEEEEB MEEEPEEEPPPPBEEE MEEEPPEEPPPPBBEE MMEEEPPEEPPPBEEB MMMEEEPPPEBPBBBB MMMMEEEPPPBPPBPN MMMMMEEPPPPPNNEP MMEMEPPPENBPPPBE MMMMEPPPPPPPPPBE } # tile 115 (explosion wet 4) { EBNEEPPBBEBNEEEE PNBNPPEPEEEBENEP NEBPBEEPPEEEEENP BEBBBEEEPPEEBEPP EEEBBEEEEBEEBPPE EEBBPBBBEEEEEPPE EEBEEEEEEEEEEEPP EBBEEEEEEEEEEEPP EEEEEEEEEEEEBEEE BEEEEEEEEEEEEEEE BEEBEBEEEEEEEEBE BBEEEEEEEEEEEBBE EEEEEEEEEEEEBBBB EBBEBEEEEEEEBBBE EEEEEEEEEPBBBPBE BBBBEEEEBBBPNNPP } # tile 116 (explosion wet 5) { PPEEEPEPEPEEEEMM PPEEEEEPEPEEEEMM PPEEEEEPEPEEEEMM BPEEEEEPPPEEEEMM BPEEBEBEEPEEEEMM BPPPBPPEPPEEEMMM PPPEBPPEEEEEEMMM PBEEBEEEEEEEEMMM EEBPPPBEEEEEMMMM PPEEPBBEEPEMMMEM EPPPBBPPPPMMMMMM PEEEEBBEEPMMEMMM PPNEPBBPEEEMMMMM NPPPPPPEEEEEMMMM NENPPPEEEEEEEMMM PPPPBBEEEEEEEEMM } # tile 117 (explosion wet 6) { MMMMEPPPPPPPNPPB MMMMEPPPPPPPENPP MEMMEEPPPBPPEPNP MMMEEEPEPPBPPEEB MMMEEEEPPEEBPPEP MMMEEEEPPPPBPPPE MMMEEEEPPEPPNPPE MMMEEEEEPEEEPPPP MMMEEEEEPPEEPPPP MMMMEEEEEEEEEPPP MMMMMEEENEEEEEEE MMMEMMEEEEEEEEEE MMMMMMMMEEMEEEEE MMMEMMMMMMMMEEEE MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 118 (explosion wet 7) { BBBEEEEEBEEEPEPP EEBBEEBBBBEPEPPP BBBBBBBBBBEPPEBB PBBEEPEEPNBEEPPP PPEEEEPEPPEENBNE NBBEBEBPNPNPBEEP EPPBBEENPPPPPPPB NEPPPPPPPEPPPPPP BNBEPEEEEEEEEEEB NEPNBNEEEPPPPPPE EEEPEPBBPPPEEEEE EEEEEEPEPPEEEEEE EEEEEEEEEEEEEEEE EEEEMMMMMMMMMMEE MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 119 (explosion wet 8) { PPPPBPPEEEEEEEMM PPEPPEPEEPEPEEMM BBPPEPPEEPEPEEMM PPPEEEPEEPEPEEMM PEEEEEPEEEPPEEMM PPBEEPPEEEPEEEMM PEEEPPEEEPPEEEMM PEPEEPEEEEEEEEMM EEPEEEEEEPEEEEMM PPPEEEEEEEEEEEMM PEEEEEEEEMEEEMMM EEEEEEEEMMMMMMMM EEEEEEMMMMEMMMMM EEEMMMEMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 120 (explosion magical 0) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMEEE MMMMMMEMMMEEEEEE MMMMMMMMMEEEEEEE MMMMMMMMMEEEEEEC MMMMMMMMEEEEIIIE MMMEEEMEEEEIIIEE MEMMMEEEEEEIEEEE MMMMMEEEEEEIEEEE MMMMEEEEEEEIEEEE MMMMMMMIEEIIEEII MMMMEEEEEEEEEEII MMMEEEEIIEEEIIII MMEEEEIIEEEEIIII MMEEEIIEEEEEIIII } # tile 121 (explosion magical 1) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM EMMMMMMMMEEEEEEM EEEEEEIEEEEEEEEM EEEEEEIIIIIEEEEE IIIEEEIEEEEEEEEE EEEEEEIEEEEEEEEE EEEEEEIEEEEEEEEI EEIIIIIIIIIIIEII IIEEEIEIIIIIEEEE IHIEIEIIIEIIIEEE ILLEIIIEEIIIIIEE IHIIIIIEIIIIEEEE IIIIIEIIEIIILEEE IIIIIIIIEIEIELEE ILHIIIHLHHEEEEEE } # tile 122 (explosion magical 2) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMEMMMEMMM EEEEEMMMMMMMMMMM EEEEEEMMMEMMEMMM EEEEEEEMMMMMMMMM IIIIIIEEEEMMMMMM EEEEEIIEEEEMMMMM IIEEEEEEEEEEMMMM EEIEEIIIIEEEMMMM EEIEEEEEIEEEMMMM EELEEIEEEEEEMEMM EEEIIIIIEEEEMMMM EEIEIIEIEEEEMMMM EIEEIIEIEEEEEMMM } # tile 123 (explosion magical 3) { MMEEEIEIEEEIIIII MMEEEIEEEEEIEIII MMMEEIEEIIIIIIIE MMMEEEEEEIIIIIII MMEEEIEEIIEIIIEI MEEEIIIEIIIIIIEI MEEEIEEEINIIIIII MEEEIEEEIIIEEEEI MEEEIEEEIIIIIENN MEEEIIEEIIIIIINN MMEEEIIEEIIIINNI MMMEEEIIIEIIIIII MMMMEEEIIIIIIIIN MMMMMEEIIIIINNEI MMEMEIIIENIIIIIN MMMMEIIIIIIIIIIN } # tile 124 (explosion magical 4) { EINEEIIIIEINEEEE ININIIEIEENIENEI NEIIINEIINNNEENI IEIIINNNIINNIEII NNNIINNNNINNIIIE NNIIIIIINNNNEIIE NNINNNNNNNNNNEII NIINNNNNNNNNNNII NNNNNNNNNNNNINNN INNNNNNNNNNNNNNN INNININNNNNNNNIE IINNNNNNNNNNNIIE NNNNNNNNNNNNIIII NIININNNNNNNIIIE NNNNNNNNNIIIIIIE IIIINNNNIIIINNII } # tile 125 (explosion magical 5) { IIEEEIEIEIEEEEMM IIEEEEEIEIEEEEMM IIEEEEEIEIEEEEMM IIEEEEEIIIEEEEMM IIEEIEIEEIEEEEMM IIIIIIIEIIEEEMMM IIIEIIIEEEEEEMMM IIEEIEEEEEEEEMMM EEIIIIIEEEEEMMMM IIEEIIIEEIEMMMEM EIIIIIIIIIMMMMMM IEEEEIIEEIMMEMMM IINEIIIIEEEMMMMM NIIIIIIEEEEEMMMM NENIIIEEEEEEEMMM IIIIIIEEEEEEEEMM } # tile 126 (explosion magical 6) { MMMMEIIIIIIIHIII MMMMEIIIIIIIEHII MEMMEEIIIIIIEIHI MMMEEEIEIIIIIEEI MMMEEEEIIEEIIIEI MMMEEEEIIIIIIIIE MMMEEEEIIEIIHIIE MMMEEEEEIEEEIIII MMMEEEEEIIEEIIII MMMMEEEEEEEEEIII MMMMMEEEHEEEEEEE MMMEMMEEEEEEEEEE MMMMMMMMEEMEEEEE MMMEMMMMMMMMEEEE MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 127 (explosion magical 7) { IIINNNNNINNNINII NNIINNIIIINIEIII IIIIIIIIIIEIIEII IIINEIEEINIEEIII IINNNNIEIIEENINE NIIEIEIININIIEEI EIIIIEENIIIIIIII NEIIIIIIIEIIIIII INIEIEEEEEEEEEEI NEININEEEIIIIIIE EEEIEIIIIIIEEEEE EEEEEEIEIIEEEEEE EEEEEEEEEEEEEEEE EEEEMMMMMMMMMMEE MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 128 (explosion magical 8) { IIIIIIIEEEEEEEMM IIEIIEIEEIEIEEMM IIIIEIIEEIEIEEMM IIIEEEIEEIEIEEMM IEEEEEIEEEIIEEMM IIIEEIIEEEIEEEMM IEEEIIEEEIIEEEMM IEIEEIEEEEEEEEMM EEIEEEEEEIEEEEMM IIIEEEEEEEEEEEMM IEEEEEEEEMEEEMMM EEEEEEEEMMMMMMMM EEEEEEMMMMEMMMMM EEEMMMEMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 129 (explosion fiery 0) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMDDD MMMMMMDMMMDDDDDD MMMMMMMMMDDDDDDD MMMMMMMMMDDDDDDC MMMMMMMMDDDDCCCD MMMDDDMDDDDCCCDD MDMMMDDDDDDCDDDD MMMMMDDDDDDCDDDD MMMMDDDDDDDCDDDD MMMMMMMCDDCCDDCC MMMMDDDDDDDDDDCC MMMDDDDCCDDDCCCC MMDDDDCCDDDDCCCC MMDDDCCDDDDDCCCC } # tile 130 (explosion fiery 1) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM DMMMMMMMMDDDDDDM DDDDDDCDDDDDDDDM DDDDDDCCCCCDDDDD CCCDDDCDDDDDDDDD DDDDDDCDDDDDDDDD DDDDDDCDDDDDDDDC DDCCCCCCCCCCCDCC CCDDDCDCCCCCDDDD CHCDCDCCCDCCCDDD CLLDCCCDDCCCCCDD CHCCCCCDCCCCDDDD CCCCCDCCDCCCLDDD CCCCCCCCDCDCDLDD CLHCCCHLHHDDDDDD } # tile 131 (explosion fiery 2) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMDMMMDMMM DDDDDMMMMMMMMMMM DDDDDDMMMDMMDMMM DDDDDDDMMMMMMMMM CCCCCCDDDDMMMMMM DDDDDCCDDDDMMMMM CCDDDDDDDDDDMMMM DDCDDCCCCDDDMMMM DDCDDDDDCDDDMMMM DDLDDCDDDDDDMDMM DDDCCCCCDDDDMMMM DDCDCCDCDDDDMMMM DCDDCCDCDDDDDMMM } # tile 132 (explosion fiery 3) { MMDDDCDCDDDCCCCC MMDDDCDDDDDCDLCC MMMDDCDDCCCCCCCD MMMDDDDDDCCCCLLC MMDDDCDDCCDCCLDL MDDDCCCDCCCCLCDL MDDDCDDDCHCCLCCL MDDDCDDDCCCDDDDL MDDDCDDDCCCCLDHH MDDDCCDDCCCCLLHH MMDDDCCDDCCCLHHL MMMDDDCCCDLCLLLL MMMMDDDCCCLCCLCH MMMMMDDCCCCCHHDC MMDMDCCCDHLCCCLH MMMMDCCCCCCCCCLH } # tile 133 (explosion fiery 4) { DLHDDCCLLDLHDDDD CHLHCCDCDDHLDHDC HDLCLHDCCHHHDDHC LDLLLHHHCCHHLDCC HHHLLHHHHLHHLCCD HHLLCLLLHHHHDCCD HHLHHHHHHHHHHDCC HLLHHHHHHHHHHHCC HHHHHHNNNNHHLHNH LHHHHHHHNHHHHHNH LHHLHLNNNNHHHHLD LLNHNHNNNNHHHLLD HHHHNHNNNHHHLLLL HLLNLHNNNHHHLLLD HHHHNHNHNCLLLCLD LLLLNHHHLLLCHHCC } # tile 134 (explosion fiery 5) { CCDDDCDCDCDDDDMM CCDDDDDCDCDDDDMM CCDDDDDCDCDDDDMM LCDDDDDCCCDDDDMM LCDDLDLDDCDDDDMM LCCCLCCDCCDDDMMM CCCDLCCDDDDDDMMM CLDDLDDDDDDDDMMM DDLCCCLDDDDDMMMM CCDDCLLDDCDMMMDM DCCCLLCCCCMMMMMM CDDDDLLDDCMMDMMM CCHDCLLCDDDMMMMM HCCCCCCDDDDDMMMM HDHCCCDDDDDDDMMM CCCCLLDDDDDDDDMM } # tile 135 (explosion fiery 6) { MMMMDCCCCCCCHCCL MMMMDCCCCCCCDHCC MDMMDDCCCLCCDCHC MMMDDDCDCCLCCDDL MMMDDDDCCDDLCCDC MMMDDDDCCCCLCCCD MMMDDDDCCDCCHCCD MMMDDDDDCDDDCCCC MMMDDDDDCCDDCCCC MMMMDDDDDDDDDCCC MMMMMDDDHDDDDDDD MMMDMMDDDDDDDDDD MMMMMMMMDDMDDDDD MMMDMMMMMMMMDDDD MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 136 (explosion fiery 7) { LLLHHHHHLHHHCHCC HHLLHHLLLLHCDCCC LLLLLLLLLLDCCDLL CLLHDCDDCHLDDCCC CCHHHHCDCCDDHLHD HLLDLDLCHCHCLDDC DCCLLDDHCCCCCCCL HDCCCCCCCDCCCCCC LHLDCDDDDDDDDDDL HDCHLHDDDCCCCCCD DDDCDCLLCCCDDDDD DDDDDDCDCCDDDDDD DDDDDDDDDDDDDDDD DDDDMMMMMMMMMMDD MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 137 (explosion fiery 8) { CCCCLCCDDDDDDDMM CCDCCDCDDCDCDDMM LLCCDCCDDCDCDDMM CCCDDDCDDCDCDDMM CDDDDDCDDDCCDDMM CCLDDCCDDDCDDDMM CDDDCCDDDCCDDDMM CDCDDCDDDDDDDDMM DDCDDDDDDCDDDDMM CCCDDDDDDDDDDDMM CDDDDDDDDMDDDMMM DDDDDDDDMMMMMMMM DDDDDDMMMMDMMMMM DDDMMMDMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 138 (explosion frosty 0) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMEEE MMMMMNEMMMEEEEEE MMNMMMNMMENBEEEE MNMNMNMMMEEEEEEP MMMMNMMMEEEEPPPE MMMNENMNEEEPPPEE MENMMENEEEEPNBEE MMMNMEEEEEEPEEEE MMMMEENBEEEPEEEE MMMMMMMPEEPPEEPP MMMMEEEEEEEEEEPP MMMEEEEPPEEEPPPP MMEEEEPPNBEEPPPP MMEEEPPEEEEEPPPP } # tile 139 (explosion frosty 1) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM EMMMMMMMMEEEEEEM ENBEENPEEEENBEEM EEEEEENPNPNEEEEE PPBEEEPENEEEEEEE EEEEEENNNNNEEEEE EEEEEEPENEEENBEP EEPPPPNPNPNPPPPP PPEEENEPPPPNEEEE PNPEPEPPPEPPPEEE PBBEPPPEEPPNBPEE PNPPPPPEPPPPEEEE PPPPPEPPEPPPBEEE PPPPPPPPEPEPEBEE PBNPPPNBNNEEEEEE } # tile 140 (explosion frosty 2) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMEMMMEMMM EEEEEMMMMMMMMMMM EEEEEEMMMEMMNMMM EEEEEEENMMNNMMMM PPPPPPENENMMMMMM EEEEEPPENENMNMMM PPEEEEEEEEENMNMM EEPEEPPPPNNEMNMM EEPEEEEENEEEMMMM EEBEEPEEEEEEMEMM EEEPPPPPEEEEMMMM EEPEPPEPEEEEMMMM EPEEPPEPEEEEEMMM } # tile 141 (explosion frosty 3) { MMEEEPEPEEEPPPPP MMEEEPEEEEEPEBPP MMMEEPEEPPPPPPPE MMMENENEEPPPPBBP MMEEENEEPPEPPBEB MEEENENEPPPPBPEB MEEEPEEEPNPPBPPB MEEEPEEEPPPEEEEB MEEEPEEEPPPPBENN MEEEPPEEPPPPBBNN MMEEEPNEEPPPBNNB MMMEENNNPEBPBBBB MMMMEENPPPBPPBPN MMMMMEEPPPPPNNEP MMEMEPPPENBPPPBN MMMMEPPPPPPPPPBN } # tile 142 (explosion frosty 4) { EBNEEPPBBEBNEEEE PNBNPPEPEENBENEP NEBPBNEPPNNNEENP BEBBBNNNPPNNBEPP NNNBBNNNNBNNBPPE NNBBPBBBNNNNEPPE NNBNNNNNNNNNNEPP NBBNNNNNNNNNNNPP NNNNNNNNNNNNBNNN BNNNNNNNNNNNNNNN BNNBNBNNNNNNNNBE BBNNNNNNNNNNNBBE NNNNNNNNNNNNBBBB NBBNBNNNNNNNBBBE NNNNNNNNNPBBBPBE BBBBNNNNBBBPNNPP } # tile 143 (explosion frosty 5) { PPEEEPEPEPEEEEMM PPEEEEEPEPEEEEMM PPEEEEEPEPEEEEMM BPEEEEEPPPEEEEMM BPEEBEBEEPEEEEMM BPPPBPPEPPEEEMMM PPPEBPPENEEENMMM PBEEBEEEENENEMMM EEBPPPBNNNNNNNMM PPEEPBBEENENMMEM EPPPBBPPNPMMNMMM PEEEEBBEEPMMEMMM PPNEPBBPEEEMMMMM NPPPPPPEEEEEMMMM NENPPPEEEEEEEMMM PPPPBBEEEEEEEEMM } # tile 144 (explosion frosty 6) { MMMMEPPPPPPPNPPB MMMMEPPPPPPPENPP MEMMEEPPPBPPEPNP MMMEEEPEPPBPPEEB MMMEENEPPEEBPPEP MMMNEEENPPPBPPPE MMNENPNPNEPPNPPE MMMNNENNPEEEPPPP MNMPEEEPPNEEPPPP MMMNNENNEEEEEPPP MMNMNPNENEEEEEEE MMMNMMENEEEEEEEE MMMMMNMMEEMEEEEE MMMEMMMMMMMMEEEE MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 145 (explosion frosty 7) { BBBNNNNNBNNNPNPP NNBBNNBBBBNPEPPP BBBBBBBBBBEPPEBB PBBNEPEEPNBEEPPP PPNNNNPEPPEENBNE NBBEBEBPNPNPBEEP EPPBBEENPPPPPPPB NEPPPPPPPEPPPPPP BNBEPEEEEEEEEEEB NEPNBNEEEPNENPPE EEEPEPBBPPPNEEEE EEEEEEPEPNNNNNEE EEEEEEEEEEENEEEE EEEEMMMMMMNMNMEE MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 146 (explosion frosty 8) { PPPPBPPEEEEEEEMM PPEPPEPEEPEPEEMM BBPPEPPEEPEPNENM PPPEEEPEEPEPENMM PEEEEEPEEEPPNENM PPBEEPNENEPEEEMM PEEEPPENEPPEEEMM PEPEENNNNNEEEEMM EEPEEEENEPEEEEMM PPPEEENENEEEEEMM PEEEEEEEEMEEEMMM EEEEEEEEMMMMMMMM EEEEEEMMMMENMMMM EEEMMMEMMMNMNMMM MMMMMMMMMMMNMMMM MMMMMMMMMMMMMMMM } # tile 147 (zap 0 0) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMIIKMMMMMMM MMMMMMIIKMMMMMMM MMMMMMIIKMMMMMMM MMMMMMIIKMMMMMMM MMMMMMIICMMMMMMM MMMMMMIIKMMMMMMM MMMMMMIIKMMMMMMM MMMMMMIIKMMMMMMM MMMMMMIIKMMMMMMM MMMMMMIIKMMMMMMM MMMMMMIICMMMMMMM MMMMMMIIKMMMMMMM MMMMMMAAAMMMMMMM MMMMMMMMMMMMMMMM } # tile 148 (zap 0 1) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMIIIIIIIIIIIIMM MMIIIIIIIIIIIIMM MMKKKKKKKCKKKKMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMAAAAAAAAAAAAMM MMMMMMMMMMMMMMMM } # tile 149 (zap 0 2) { MMMMIMMMMMMMMMMM MMMMIIMMMMMMMMMM MMMMKIIMMMMMMMMM MMMMMKIIMMMMMMMM MMMMMMKIIMMMMMMM MMMMMMMKIIMMMMMM MMMMMMMMKIIMMMMM MMMMMMMMMKIIMMMM MMMMAMMMMMKIMMMM MMMMMAMMMMMKMMMM MMMMMMAMMMMMMMMM MMMMMMMAMMMMMMMM MMMMMMMMAMMMMMMM MMMMMMMMMAMMMMMM MMMMMMMMMMAMMMMM MMMMMMMMMMMAMMMM } # tile 150 (zap 0 3) { MMMMMMMMMMMIMMMM MMMMMMMMMMIIMMMM MMMMMMMMMIIKMMMM MMMMMMMMIIKMMMMM MMMMMMMIIKMMMMMM MMMMMMIICMMMMMMM MMMMMIIKMMMMMMMM MMMMIIKMMMMMMMMM MMMMIKMMMMMAMMMM MMMMCMMMMMAMMMMM MMMMMMMMMAMMMMMM MMMMMMMMAMMMMMMM MMMMMMMAMMMMMMMM MMMMMMAMMMMMMMMM MMMMMAMMMMMMMMMM MMMMAMMMMMMMMMMM } # tile 151 (zap 1 0) { MMMMMMDCCDMMMMMM MMMMMMDCCDDMMMMM MMMMMDDCCCDMMMMM MMMMMDDCCCDMMMMM MMMMMMDCCDMMMMMM MMMMMDCCCDDMMMMM MMMMMDCCCCDMMMMM MMMMMMDCCDMMMMMM MMMMMDDCCDDMMMMM MMMMMMDCCDMMMMMM MMMMMMDCCDMMMMMM MMMMMMDCCDMMMMMM MMMMMMDCCDDMMMMM MMMMMMDCCDDDMMMM MMMMMDDCCDMMMMMM MMMMMDDCCDDMMMMM } # tile 152 (zap 1 1) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMDMM MDDDMDDMDMMMDDMD DDCCDDCDDDDDDDDD CCCCCCCCCCCCCCCC CCCCCCCCCCCCCCCC DDDDDCCDDDDDDDDD MMDDMDDMDMMMMMDD MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 153 (zap 1 2) { CCDMMMMMMMMMMMMM CCCDMMMMMMMMMMMM DCCDDDMMMMMMMMMM MDCCCDDMMMMMMMMM MMDDCCDDMMMMMMMM MMMDCCCDMMMMMMMM MMMDDCCCDDMMMMMM MMMMDCCCCDDMMMMM MMMMMDDDCCDDMMMM MMMMMMMDDCCDDMMM MMMMMMMMDCCCDMMM MMMMMMMMMDDCCDMM MMMMMMMMMMDDCCDM MMMMMMMMMMMDDCDD MMMMMMMMMMMMDCCC MMMMMMMMMMMMMDCC } # tile 154 (zap 1 3) { MMMMMMMMMMMMMDCC MMMMMMMMMMMMDDCC MMMMMMMMMMMDCCCD MMMMMMMMMDDCCDDM MMMMMMMMDDCCDDMM MMMMMMMDDCCDDMMM MMMMMMDDCCCDMMMM MMMMMMDCCDDMMMMM MMMMDDCCDDMMMMMM MMMDDCCCDMMMMMMM MMDDCCCCDMMMMMMM MMDCCCDDMMMMMMMM MDDCDDDMMMMMMMMM DCCCDMMMMMMMMMMM CCCDMMMMMMMMMMMM CCDMMMMMMMMMMMMM } # tile 155 (zap 2 0) { MMMMMMONNOOMMMMM MMMMMOONNOMMMMMM MMMMMMONNOOMMMMM MMMMMOONNOMMMMMM MMMMMMONNOOMMMMM MMMMMOONNOMMMMMM MMMMMMONNOOMMMMM MMMMMOONNOMMMMMM MMMMMMONNOOMMMMM MMMMMOONNOMMMMMM MMMMMMONNOOMMMMM MMMMMOONNOMMMMMM MMMMMMONNOOMMMMM MMMMMOONNOMMMMMM MMMMMMONNOOMMMMM MMMMMOONNOMMMMMM } # tile 156 (zap 2 1) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM OMOMOMOMOMOMOMOM OOOOOOOOOOOOOOOO NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNN OOOOOOOOOOOOOOOO MOMOMOMOMOMOMOMO MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 157 (zap 2 2) { NNOOMMMMMMMMMMMM NNNOMMMMMMMMMMMM ONNNOOMMMMMMMMMM MONNNOMMMMMMMMMM MOONNNOOMMMMMMMM MMMONNNOMMMMMMMM MMMOONNNOOMMMMMM MMMMMONNNOMMMMMM MMMMMOONNNOOMMMM MMMMMMMONNNOMMMM MMMMMMMOONNNOOMM MMMMMMMMMONNNOMM MMMMMMMMMOONNNOO MMMMMMMMMMMONNNO MMMMMMMMMMMOONNN MMMMMMMMMMMMMONN } # tile 158 (zap 2 3) { MMMMMMMMMMMMOONN MMMMMMMMMMMMONNN MMMMMMMMMMOONNNO MMMMMMMMMMONNNOM MMMMMMMMOONNNOOM MMMMMMMMONNNOMMM MMMMMMOONNNOOMMM MMMMMMONNNOMMMMM MMMMOONNNOOMMMMM MMMMONNNOMMMMMMM MMOONNNOOMMMMMMM MMONNNOMMMMMMMMM OONNNOOMMMMMMMMM ONNNOMMMMMMMMMMM NNNOOMMMMMMMMMMM NNOMMMMMMMMMMMMM } # tile 159 (zap 3 0) { MMMMMMBEBMMMMMMM MMMMMMEEEMMMMMMM MMMMMMBEBMMMMMMM MMMMMMMBBMMMMMMM MMMMMMMBEBMMMMMM MMMMMMMEEEMMMMMM MMMMMMMBEBMMMMMM MMMMMMMBBMMMMMMM MMMMMMBEBMMMMMMM MMMMMMEEEMMMMMMM MMMMMMBEBMMMMMMM MMMMMMMBBMMMMMMM MMMMMMMBEBMMMMMM MMMMMMMEEEMMMMMM MMMMMMMBEBMMMMMM MMMMMMMBBMMMMMMM } # tile 160 (zap 3 1) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMBEBMMMMMBEBM BEBBEEEBBEBBEEEB EEEBBEBBEEEBBEBB BEBMMMMMBEBMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 161 (zap 3 2) { BEBMMMMMMMMMMMMM BEEBMMMMMMMMMMMM MBBBMMMMMMMMMMMM MMBBBMMMMMMMMMMM MMBEEBMMMMMMMMMM MMMBEBBMMMMMMMMM MMMMBBBBMMMMMMMM MMMMMMBBBBMMMMMM MMMMMMMBBEBMMMMM MMMMMMMMBEEBMMMM MMMMMMMMMBBBMMMM MMMMMMMMMMBBBMMM MMMMMMMMMMBEEBMM MMMMMMMMMMMBEBBM MMMMMMMMMMMMBBBB MMMMMMMMMMMMMMBB } # tile 162 (zap 3 3) { MMMMMMMMMMMMMMBB MMMMMMMMMMMMMBBB MMMMMMMMMMMMBBBM MMMMMMMMMMMBEEBM MMMMMMMMMBBBEBMM MMMMMMMMBEBBBMMM MMMMMMMBEEBMMMMM MMMMMMMBBBMMMMMM MMMMMMBBBMMMMMMM MMMMMBBBMMMMMMMM MMMMBBBMMMMMMMMM MMMBEEBMMMMMMMMM MBBBEBMMMMMMMMMM BEBBBMMMMMMMMMMM EEBMMMMMMMMMMMMM BBMMMMMMMMMMMMMM } # tile 163 (zap 4 0) { MMMMMMAAADMMMMMM MMMMMMDAAAMMMMMM MMMMMMAAADMMMMMM MMMMMMDAAAMMMMMM MMMMMMAAADMMMMMM MMMMMMDAAAMMMMMM MMMMMMAAADMMMMMM MMMMMMDAAAMMMMMM MMMMMMAAADMMMMMM MMMMMMDAAAMMMMMM MMMMMMAAADMMMMMM MMMMMMDAAAMMMMMM MMMMMMAAADMMMMMM MMMMMMDAAAMMMMMM MMMMMMAAADMMMMMM MMMMMMDAAAMMMMMM } # tile 164 (zap 4 1) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM DADADADADADADADA AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA ADADADADADADADAD MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 165 (zap 4 2) { AADMMMMMMMMMMMMM AAAAMMMMMMMMMMMM AAAADMMMMMMMMMMM MDAAAAMMMMMMMMMM MMAAAADMMMMMMMMM MMMDAAAAMMMMMMMM MMMMAAAADMMMMMMM MMMMMDAAAAMMMMMM MMMMMMAAAADMMMMM MMMMMMMDAAAAMMMM MMMMMMMMAAAADMMM MMMMMMMMMDAAAAMM MMMMMMMMMMAAAADM MMMMMMMMMMMDAAAA MMMMMMMMMMMMAAAA MMMMMMMMMMMMMDAA } # tile 166 (zap 4 3) { MMMMMMMMMMMMMAAA MMMMMMMMMMMMDAAA MMMMMMMMMMMAAAAD MMMMMMMMMMDAAAAM MMMMMMMMMAAAADMM MMMMMMMMDAAAAMMM MMMMMMMAAAADMMMM MMMMMMDAAAAMMMMM MMMMMAAAADMMMMMM MMMMDAAAAMMMMMMM MMMAAAADMMMMMMMM MMDAAAAMMMMMMMMM MAAAADMMMMMMMMMM DAAAAMMMMMMMMMMM AAADMMMMMMMMMMMM AAAMMMMMMMMMMMMM } # tile 167 (zap 5 0) { MMMMMMEPNBEMMMMM MMMMMMMEBNBEMMMM MMMMMMMMPNNBEMMM MMMMMMMMEPBNNMMM MMMMMEPBNNNNNMMM MMMMEBNNBPPPPMMM MMMMBNNBEMMMMMMM MMMMNNBEMMMMMMMM MMMMEBNBEMMMMMMM MMMMMEBNNNBPPEMM MMMMMMMEBNNNNBMM MMMMMMPPPBNNNNMM MMMMMMNNNNBPPEMM MMMMMMNBMMMMMMMM MMMMMMNNMMMMMMMM MMMMMMBNEMMMMMMM } # tile 168 (zap 5 1) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMEBNEMMM MMENNPMMMPNNPMMM MEBNNPMMMPNNPMMM EBNBNPMMMBNNBMMM BNNPNPMMMNNBNMMM NBPENBEMENBPNMME PEMMBNBEBNEPNBNN EMMMPNNBNBMPNNNB MMMMEBNNBEMMMMMM MMMMMEBNEMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 169 (zap 5 2) { NNBEMMMMMMMMMMMM BNNBBNNNNNMMMMMM MEBNNNBPBNMMMMMM MMMMMMEPNBMMMMMM MMMMMMMPNPMMMMMM MMMMMMEBNPMMMMMM MMMMMMPNBEMMMMMM MMMMMEBNPMMMMMMM MMMMMPNBPMMEBNBE MMMMMPNPEMEBNBNP MMMMMBNPEEBNBPNP MMMMMNNPPBNBEPNP MMMMMNBBNNBEMPNB MMMMMNNNBPEMMPNN MMMMMMMMMMMMMEBN MMMMMMMMMMMMMMEN } # tile 170 (zap 5 3) { MMMMMMMMEPPPBNNN MMMMMMMMBNNNNNBE MMMMMMMMNBPPPPEM MMMMMMMMBNBEMMMM MMMMMMMMEBNBEMMM MMMMMMMMMEBNBEMM MNNBPPEMMMEBNPMM MNBNNNBPPEEPNBMM MNPPPBNNBPPPBNMM MNBEMEPBNNNNBNMM MNNMMMMEPPBNNNMM MBNMMMMMMMMMMMMM EBNMMMMMMMMMMMMM BNBMMMMMMMMMMMMM NNEMMMMMMMMMMMMM NBMMMMMMMMMMMMMM } # tile 171 (zap 6 0) { MMMMMPFFFPMMMMMM MMMMPFFFFFPMMMMM MMMMPFFFFFPMMMMM MMMMMPFFFPMMMMMM MMMMMMPFFFPMMMMM MMMMMPFFFFFPMMMM MMMMMPFFFFFPMMMM MMMMMMPFFFPMMMMM MMMMMPFFFPMMMMMM MMMMPFFFFFPMMMMM MMMMPFFFFFPMMMMM MMMMMPFFFPMMMMMM MMMMMMPFFFPMMMMM MMMMMPFFFFFPMMMM MMMMMPFFFFFPMMMM MMMMMMPFFFPMMMMM } # tile 172 (zap 6 1) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMPPMMMMMMPPM MPPMPFFPMPPMPFFP PFFPFFFFPFFPFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFPFFPFFFFPFFP PFFPMPPMPFFPMPPM MPPMMMMMMPPMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 173 (zap 6 2) { FPMMMMMMMMMMMMMM FFPPPMMMMMMMMMMM PFFFFPMMMMMMMMMM PPPFFPMMMMMMMMMM MMMPFPMMMMMMMMMM MMMPFFPMMMMMMMMM MMMMPFFPPMMMMMMM MMMMPFFFFPMMMMMM MMMMPFFFFFPMMMMM MMMMMPPPFFFPPMMM MMMMMMMMPFFFFPMM MMMMMMMMMPFFFFPM MMMMMMMMMPPFFFFP MMMMMMMMMMMPPFFP MMMMMMMMMMMMPFFF MMMMMMMMMMMMMPFF } # tile 174 (zap 6 3) { MMMMMMMMMMMMPPFF MMMMMMMMMMMPFFFF MMMMMMMMMMPFFFFP MMMMMMMMMPFFFPPM MMMMMMMMMPFFFPMM MMMMMMMMPFFFPMMM MMMMMMMPFFFPPMMM MMMMMMPFFFPMMMMM MMMMMMPFFPMMMMMM MMMMMPFFFPMMMMMM MMPPPFFFFPMMMMMM MPFFFFPPPMMMMMMM MPFFPPMMMMMMMMMM MPFPMMMMMMMMMMMM PFFPMMMMMMMMMMMM FFPPMMMMMMMMMMMM } # tile 175 (zap 7 0) { MMMMMMMGGMMMMMMM MMMMMMGHGGMMMMMM MMMMGGHHHHGMMMMM MMMMMMGHHHGMMMMM MMMMMMMGGGMMMMMM MMMMMMMGGMMMMMMM MMMMMMGGGMMMMMMM MMMMMGHHHGMMMMMM MMMMMGHHHHGGMMMM MMMMMMGGHGMMMMMM MMMMMMMGGMMMMMMM MMMMMMMGGMMMMMMM MMMMMMGHGGMMMMMM MMMMGGHHHHGMMMMM MMMMMMGHHHGMMMMM MMMMMMMGGGMMMMMM } # tile 176 (zap 7 1) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMGMMMMMMM MMGGMMMMGMMMMGGM MGHHGMMGHGMMGHHG GGHHGGGHHHGGGHHG GHHHGGGHHGGGHHHG MGHGMMGHHGMMGHGM MMGMMMMGGMMMMGMM MMGMMMMMMMMMMGMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 177 (zap 7 2) { GGMMMGGMMMMMMMMM GGGGGHGMMMMMMMMM MGHHHGMMMMMMMMMM MGHHHGMMMMMMMMMM GHGGGGMMMMMMMMMM MGMMGGGMMGMMMMMM MMMMMGGGGHGMMMMM MMMMMGHHHGMMMMMM MMMMMGHHHGMMMMMM MMMMGHGGGGGMMMGG MMMMGGMMMGGGGGHG MMMMMMMMMMGHHHGM MMMMMMMMMMGHHHGM MMMMMMMMMGHGGGGM MMMMMMMMMMGMMGGG MMMMMMMMMMMMMMGG } # tile 178 (zap 7 3) { MMMMMMMMMGGMMMGG MMMMMMMMMGHGGGGG MMMMMMMMMMGHHGGM MMMMMMMMMMGHHGMM MMMMMMMMMMGHHGMM MMMMMMGMMGGGGHGM MMMMMGHGGGGMMGMM MMMMMMGHHGMMMMMM MMMMMMGHHGMMMMMM GGMMMGGHHGMMMMMM GHGGGGGGGHGMMMMM MGHHGGMMMGGMMMMM MGHHGMMMMMMMMMMM MGHHGMMMMMMMMMMM GGGGHGMMMMMMMMMM GGMMGMMMMMMMMMMM } # tile 179 (warning 0) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMOOOOMMMMMMM MMMMOOOOOOMMMMMM MMMOOAAAAOOMMMMM MMMOOAMMMOOAMMMM MMMMAAMMMOOAMMMM MMMMMMMMOOAAMMMM MMMMMMMOOAAMMMMM MMMMMMOOAAMMMMMM MMMMMMOOAMMMMMMM MMMMMMMAAMMMMMMM MMMMMMOOMMMMMMMM MMMMMMOOAMMMMMMM MMMMMMMAAMMMMMMM MMMMMMMMMMMMMMMM } # tile 180 (warning 1) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMOCOCMMMMMMM MMMMOCOCOCMMMMMM MMMOCAAAAOCMMMMM MMMCOAMMMCOAMMMM MMMMAAMMMOCAMMMM MMMMMMMMOCAAMMMM MMMMMMMOCAAMMMMM MMMMMMOCAAMMMMMM MMMMMMCOAMMMMMMM MMMMMMMAAMMMMMMM MMMMMMCOMMMMMMMM MMMMMMOCAMMMMMMM MMMMMMMAAMMMMMMM MMMMMMMMMMMMMMMM } # tile 181 (warning 2) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMCCCCMMMMMMM MMMMCCCCCCMMMMMM MMMCCAAAACCMMMMM MMMCCAMMMCCAMMMM MMMMAAMMMCCAMMMM MMMMMMMMCCAAMMMM MMMMMMMCCAAMMMMM MMMMMMCCAAMMMMMM MMMMMMCCAMMMMMMM MMMMMMMAAMMMMMMM MMMMMMCCMMMMMMMM MMMMMMCCAMMMMMMM MMMMMMMAAMMMMMMM MMMMMMMMMMMMMMMM } # tile 182 (warning 3) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMDDDDMMMMMMM MMMMDDDDDDMMMMMM MMMDDAAAADDMMMMM MMMDDAMMMDDAMMMM MMMMAAMMMDDAMMMM MMMMMMMMDDAAMMMM MMMMMMMDDAAMMMMM MMMMMMDDAAMMMMMM MMMMMMDDAMMMMMMM MMMMMMMAAMMMMMMM MMMMMMDDMMMMMMMM MMMMMMDDAMMMMMMM MMMMMMMAAMMMMMMM MMMMMMMMMMMMMMMM } # tile 183 (warning 4) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMIIIIMMMMMMM MMMMIIIIIIMMMMMM MMMIIAAAAIIMMMMM MMMIIAMMMIIAMMMM MMMMAAMMMIIAMMMM MMMMMMMMIIAAMMMM MMMMMMMIIAAMMMMM MMMMMMIIAAMMMMMM MMMMMMIIAMMMMMMM MMMMMMMAAMMMMMMM MMMMMMIIMMMMMMMM MMMMMMIIAMMMMMMM MMMMMMMAAMMMMMMM MMMMMMMMMMMMMMMM } # tile 184 (warning 5) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMIEIEMMMMMMM MMMMIEIEIEMMMMMM MMMIEAAAAIEMMMMM MMMEIAMMMEIAMMMM MMMMAAMMMIEAMMMM MMMMMMMMIEAAMMMM MMMMMMMIEAAMMMMM MMMMMMIEAAMMMMMM MMMMMMEIAMMMMMMM MMMMMMMAAMMMMMMM MMMMMMEIMMMMMMMM MMMMMMIEAMMMMMMM MMMMMMMAAMMMMMMM MMMMMMMMMMMMMMMM } # tile 185 (sub mine walls 0) { AJJKKKACJAAJJJAA AJKKKACLJJAJJJJA AJKKACLCKJJAJJJA AAKACLCKJJJJAAAA AAACLLKKJJJJJJAA AACLLKKKAAJJJJJA ACKKKKKACJAJJJJA AKKKKKACLJJAJJJA AAKKKACLKJJJAJAA AAKKACLKKJJJJJAA AACCCKKAAJJJJJJA ACCKKKACJAJJJJJA ACKKKACLJJAJJJJA AAKKACLCKJJAJJAA AAJACKCKKJJJAJAA AAJCKKJAAAJJJJJA } # tile 186 (sub mine walls 1) { AJAAAAAAJJAAAJAA JJJAAAJJJJJAAAAJ JJJACJAJJJACCJAJ AAACLJJAJACCLJJA AACLCKJJACCLCKJJ ACKCKKJJJCKCKKJA CJKKKKJJCKCKJJAC KJJKCJJCKKKJJJCK KJKKKJJKJKJJJJKK JJJKCJKKJKJJJCKJ JJJJJJKJKKJJJKKJ JJJJJKJJJJJJJJJJ JJJJJJJJJJJJJJJJ JJJJJJJJJJJJJJJJ JJJJJJJJJJJJJJJJ AAAAAAAAAAAAAAAA } # tile 187 (sub mine walls 2) { AAAAAAKCCKKJAAAA AAAAKKCLCJKJJAAA AAKKKCLCKJJJKKAA AKKKCLCKJJJJJJKA AKKCLLKKJJJJJJJA AKCLLKKKAAJJJJJJ ACKKKKKACJAJJJJJ AKKKKKACLJJAAJJJ AAKKKCLLKJJJAJAJ AAKKCCCKKJJJAJAA AACCKKKAAJJJJJJA ACCKKKACJAJJJJJA ACKKKACLJJAJJJJA AAKKACLCKJJAJJAA AAJACKCKKJJJAJAA AAJCKKJAAAJJJJJA } # tile 188 (sub mine walls 3) { AAAAAAKCCKKJAAAA AAAAKKCLCJKJJAAA AAKKKCLCKJJJKKAA AKKCCLCKJJJJJJKA KKCCLLKKJJJJJJJA KKCLKKKKAAJJJJJA KCLKKKKACJAJJJJA CKKKKKACLJJAAJJA KAKKKCLLKJJJAJAA AKKKCCCKKJJJAJAA AACCKKKAAJJJJJJA ACCKKKACJAJJJJJA ACKKKACLJJAJJJJA AKKKACLCKJJAJJAA AAJACKCKKJJJAJAA AAJCKKJAAAJJJJJA } # tile 189 (sub mine walls 4) { AKKKAAKKKKAAJJJA AKKAAKCCCJJJAAJA AKKAALLJJJACCJAA AKAACLJJJACCLJJA AAACCKJJACLLCKJJ AAACLKJJJCKCKKJA AACLKKJJCKCKJJAC AAKKCJJCKKKJJJCK ACKKKJJKJKJJJJKK ACKKCJKKJKJJJCKJ AKKKJJKJKKJJJKKJ ACKJJKJJJJJJJJJJ AKJJJJJJJJJJJJJJ AKJJJJJJJJJJJJJJ AJJJJJJJJJJJJJJJ AAAAAAAAAAAAAAAA } # tile 190 (sub mine walls 5) { AKKAAAKKAAAAJJJA AKAAKKLCKAAAAAJA AAKKCLCJJACCAJJA AKKCLJJJACCCLAJA AKCKKKJACCCLCAAA ACKKKKJACCKCKKAA CJKKKKACCKCKJJAA KJJKCJJCKKKJJJAA KJKKKJJKJKJJJJJA JJJKCJKKJKJJJJJA JJJJJJKJKKJJJJJA JJJJJKJJJJJJJJJA JJJJJJJJJJJJJJJA JJJJJJJJJJJJJJJA JJJJJJJJJJJJJJJA AAAAAAAAAAAAAAAA } # tile 191 (sub mine walls 6) { AAAAAAKCCKKJAAAA AAAAKCCLCJKJJAAA AAKKCCLCKJJJKKAA AKKKCLCKJJJJJJKA KKKCLKKKJJJJJJJA KKCLKKKKAAJJJJJJ KCKLKKKACJAJJJJJ CKKKKKACLJJAAJJJ KAKKKCLLKJJJAJAJ AKKKCCCKKJJJAJAA AACCKKKAAJJJJJJA ACCKKKACJAJJJJJA ACKKKACLJJAJJJJA AKKKACLCKJJAJJAA AAJACKCKKJJJAJAA AAJCKKJAAAJJJJJA } # tile 192 (sub mine walls 7) { AKKAAAKKKKAAJJJA AKAAKKLCCJJJAAJA AAKKCLCJJJACCJAA AKKCLJJJJACCLJJA AKCLCKJJACCLCKJJ ACKCKKJJJCKCKKJA CJKKKKJJCKCKJJAC KJJKCJJCKKKJJJCK KJKKKJJKJKJJJJKK JJJKCJKKJKJJJCKJ JJJJJJKJKKJJJKKJ JJJJJKJJJJJJJJJJ JJJJJJJJJJJJJJJJ JJJJJJJJJJJJJJJJ JJJJJJJJJJJJJJJJ AAAAAAAAAAAAAAAA } # tile 193 (sub mine walls 8) { AAAAAAKCCKKJAAAA AAAAKCCLCJKJJAAA AAKKKCLCKJJJKKAA AKKKCLCKJJJJJJKA KKCCLLKKJJJJJJJA KKCLLKKKAAJJJJJJ KCLLKKKACJAJJJJJ CKLKKKACLJJAAJJJ KAKKKCLLKJJJAJAJ AKKKCCCKKJJJAJAA AACCKKKAAJJJJJJA ACCKKKACJAJJJJJA ACKKKACLJJAJJJJA AKKKACLCKJJAJJAA AAJACKCKKJJJAJAA AAJCKKJAAAJJJJJA } # tile 194 (sub mine walls 9) { AKKAACKCCKKJAJJA AKACKKKLLJKJJAJA AAKKKCCCKJJJKKAA AKKKCCLKJJJJJJKA AKKCLLKKJJJJJJJA AKCLLKKKAAJJJJJJ ACLKKKKACJAJJJJJ AKKKKKACLJJAAJJJ AAKKKCLLKJJJAJAJ AAKKCCCKKJJJAJAA AACCKKKAAJJJJJJA ACCKKKACJAJJJJJA ACKKKACLJJAJJJJA AAKKACLCKJJAJJAA AAJACKCKKJJJAJAA AAJCKKJAAAJJJJJA } # tile 195 (sub mine walls 10) { AKKAACKCCKKJAJJA AKACKKCLCJKJJAJA AAKKCCLCKJJJKKAA AKKCLLCKJJJJJJKA KKCCLLKKJJJJJJJA KCKLLKKKAAJJJJJA CCKKKKKACJAJJJJA CKKKKKACLJJAAJJA KAKKKCLLKJJJAJAA AKKKCCCKKJJJAJAA AACCKKKAAJJJJJJA ACCKKKACJAJJJJJA ACKKKACLJJAJJJJA AKKKACLCKJJAJJAA AAJACKCKKJJJAJAA AAJCKKJAAAJJJJJA } # tile 196 (sub gehennom walls 0) { ALLDAJMMMMMJLLDA ADDDAJMJMMJJDDDA ADDDAJMMMMMJDDDA ADDDAJMMMMMJDDDA ADDDAJJMMMMJDDDA AJAAAJJMMMMJJAJA AJJJAJJMMMMJJJJA ADMMAJJMMJMJDMJA ALLDAJMMMMMJLLDA ADDDAJMMMMMJDDDA ADDDAJMMMMMJDDDA ADDDAJMMMMMJDDDA ADDDAJJMJMJJDDDA AJAAAJJMMMMJJAJA AJJJAJJMMMMJJJJA ADMMAJJMMMMJDMJA } # tile 197 (sub gehennom walls 1) { AAALDDAAAAALDDAA DDDLDDAJDDDLDDAJ MDDJJJAJMDDJJJAJ JJJJJJJJJJJJJJJJ MMJJJMMMMMJJJMMM MMLDDMMMMMLDDMMM DDLDDAJDDDLDDAJD DDJJJAJMDDJJJAJM JJJJJJJJJJJJJJJJ MMJDMMMMJDMMMJDM MMJMMMMMJMMMMJMM JJJJJJJJJJJJJJJJ JDMMMMJDMMMMJDMM JMMMMMJMMMMMJMMM JJJJJJJJJJJJJJJJ AAAAAAAAAAAAAAAA } # tile 198 (sub gehennom walls 2) { AAALLLLDDDDDDAAA LLLLAAJJMMMMDJJJ DDDLAJJMMMCCDJJJ DDDDDDDDDDDDDJJJ DDDMMMMMMMMMMJJJ DDDMMMMMMMMMMJJJ DDMMMMMMMMMMMMJJ DMMMMMMMMMMMMMMJ JJJJJJJJJJJJJJJJ AMMJJJJJJJJJMMMJ ADDDAAAAAAAADDDA ADDDAJMMMMMJDDDA ADDDAJMMMMMJDDDA AJAAAJJMMMMJJAJA AJJJAJJMMMMJJJJA ADMMAJJMMMMJDMJA } # tile 199 (sub gehennom walls 3) { AAALLLLDDDDDDAAA LLLLAAJJMMMMDJJJ DDDLAJJMMMCCDJJJ DDDDDDDDDDDDDJJJ DDDMMMMMMMMMMJJJ DDDMMMMMMMMMMJJJ DDMMMMMMMMMMMMJJ DMMMMMMMMMMMMMMJ JJJJJJJJJJJJJJJJ AMMJJJJJJJJJMMMJ ADDDAAAAAAAADDDA ADDDAJMMMMMJDDDA ADDDAJMMMMMJDDDA AJAAAJJMMMMJJAJA AJJJAJJMMMMJJJJA ADMMAJJMMMMJDMJA } # tile 200 (sub gehennom walls 4) { AAALLLLDDDDDDAAA LLLLAAJJMMMMDJJJ DDDLAJJMMMCCDJJJ DDDDDDDDDDDDDJJJ DDDMMMMMMMMMMJJJ DDDMMMMMMMMMMJJJ DDMMMMMMMMMMMMJJ DMMMMMMMMMMMMMMJ JJJJJJJJJJJJJJJJ MMJDMMMMJDMMMJDM MMJMMMMMJMMMMJMM JJJJJJJJJJJJJJJJ JDMMMMJDMMMMJDMM JMMMMMJMMMMMJMMM JJJJJJJJJJJJJJJJ AAAAAAAAAAAAAAAA } # tile 201 (sub gehennom walls 5) { AAALLLLDDDDDDAAA LLLLAAJJMMMMDJJJ DDDLAJJMMMCCDJJJ DDDDDDDDDDDDDJJJ DDDMMMMMMMMMMJJJ DDDMMMMMMMMMMJJJ DDMMMMMMMMMMMMJJ DMMMMMMMMMMMMMMJ JJJJJJJJJJJJJJJJ MMJDMMMMJDMMMJDM MMJMMMMMJMMMMJMM JJJJJJJJJJJJJJJJ JDMMMMJDMMMMJDMM JMMMMMJMMMMMJMMM JJJJJJJJJJJJJJJJ AAAAAAAAAAAAAAAA } # tile 202 (sub gehennom walls 6) { AAALLLLDDDDDDAAA LLLLAAJJMMMMDJJJ DDDLAJJMMMCCDJJJ DDDDDDDDDDDDDJJJ DDDMMMMMMMMMMJJJ DDDMMMMMMMMMMJJJ DDMMMMMMMMMMMMJJ DMMMMMMMMMMMMMMJ JJJJJJJJJJJJJJJJ AMMJJJJJJJJJMMMJ ADDDAAAAAAAADDDA ADDDAJMMMMMJDDDA ADDDAJMMMMMJDDDA AJAAAJJMMMMJJAJA AJJJAJJMMMMJJJJA ADMMAJJMMMMJDMJA } # tile 203 (sub gehennom walls 7) { AAALLLLDDDDDDAAA LLLLAAJJMMMMDJJJ DDDLAJJMMMCCDJJJ DDDDDDDDDDDDDJJJ DDDMMMMMMMMMMJJJ DDDMMMMMMMMMMJJJ DDMMMMMMMMMMMMJJ DMMMMMMMMMMMMMMJ JJJJJJJJJJJJJJJJ MMJDMMMMJDMMMJDM MMJMMMMMJMMMMJMM JJJJJJJJJJJJJJJJ JDMMMMJDMMMMJDMM JMMMMMJMMMMMJMMM JJJJJJJJJJJJJJJJ AAAAAAAAAAAAAAAA } # tile 204 (sub gehennom walls 8) { AAALLLLDDDDDDAAA LLLLAAJJMMMMDJJJ DDDLAJJMMMCCDJJJ DDDDDDDDDDDDDJJJ DDDMMMMMMMMMMJJJ DDDMMMMMMMMMMJJJ DDMMMMMMMMMMMMJJ DMMMMMMMMMMMMMMJ JJJJJJJJJJJJJJJJ AMMJJJJJJJJJMMMJ ADDDAAAAAAAADDDA ADDDAJMMMMMJDDDA ADDDAJMMMMMJDDDA AJAAAJJMMMMJJAJA AJJJAJJMMMMJJJJA ADMMAJJMMMMJDMJA } # tile 205 (sub gehennom walls 9) { AAALLLLDDDDDDAAA LLLLAAJJMMMMDJJJ DDDLAJJMMMCCDJJJ DDDDDDDDDDDDDJJJ DDDMMMMMMMMMMJJJ DDDMMMMMMMMMMJJJ DDMMMMMMMMMMMMJJ DMMMMMMMMMMMMMMJ JJJJJJJJJJJJJJJJ AMMJJJJJJJJJMMMJ ADDDAAAAAAAADDDA ADDDAJMMMMMJDDDA ADDDAJMMMMMJDDDA AJAAAJJMMMMJJAJA AJJJAJJMMMMJJJJA ADMMAJJMMMMJDMJA } # tile 206 (sub gehennom walls 10) { AAALLLLDDDDDDAAA LLLLAAJJMMMMDJJJ DDDLAJJMMMCCDJJJ DDDDDDDDDDDDDJJJ DDDMMMMMMMMMMJJJ DDDMMMMMMMMMMJJJ DDMMMMMMMMMMMMJJ DMMMMMMMMMMMMMMJ JJJJJJJJJJJJJJJJ AMMJJJJJJJJJMMMJ ADDDAAAAAAAADDDA ADDDAJMMMMMJDDDA ADDDAJMMMMMJDDDA AJAAAJJMMMMJJAJA AJJJAJJMMMMJJJJA ADMMAJJMMMMJDMJA } # tile 207 (sub knox walls 0) { AJJJAAACJAAAJJJA AJJJAACLJJAAJJJA AJJJACLCKJJAJJJA AAAAALCKJJJAAAAA AAJAAAKCJJAAAJAA ACJJAAAAAAAACJJA AJJJAAACJAAAJJJA AJJJAACLJJAAJJJA AAAAACLCKJJAAAAA AAJAAACCKJAAAJAA ACJJAAAAAAAACJJA AJJJAAACJAAAJJJA AJJJAACLJJAAJJJA AAAAACLCKJJAAAAA AAJAAACKCJAAAJAA ACJJAAAAAAAACJJA } # tile 208 (sub knox walls 1) { AJAAAJAAAKAAAJAA JJJAAAJAJJJAAAJA JJJACJAAJJJACJAA AAACLJJAJJACLJJA AACLCKJJAACLCKJJ AAACCKJAAAACCKJA AJAAAJAAAJAAAJAA KJJACJJAKJJACJJA KJJAKJJAKJJACJJA KJJACJAAKJJAKJAA CJJACJAACJJAKJJA KJAACJJACJJACJJA CJAACJJACJAAKJJA KJJAKJJAKJJACJAA KJJACJJACJJACJJA AAAAAAAAAAAAAAAA } # tile 209 (sub knox walls 2) { AAAAAAKCJKAAAAAA AAAAKKCLKJCKAAAA AAKKCCLCKJJKKKAA ACKKCLCCKJJJCKKA AKKCCCKKJJJJJKCA ACCCCCKAAJJJJJKA AJJCKKACJAJJJJJA AJJJAACLJJAAJJJA AAAAACLCKJJAAAAA AAJAAACCKJAAAJAA ACJJAAAAAAAACJJA AJJJAAACJAAAJJJA AJJJAACLJJAAJJJA AAAAACLCKJJAAAAA AAJAAACKCJAAAJAA ACJJAAAAAAAACJJA } # tile 210 (sub knox walls 3) { AAAAAAKCJKAAAAAA AAAAKKCLKKKKAAAA AAKKCCLCKJJCKKAA ACKKCLCCKJJJKCKA AKKCCCKKJJJJJKKA AKCCCKCAAJJJJJCA AJJCKKACJAJJJJJA AJJJAACLJJAAJJJA AAAAACLCKJJAAAAA AAJAAACCKJAAAJAA ACJJAAAAAAAACJJA AJJJAAACJAAAJJJA AJJJAACLJJAAJJJA AAAAACLCKJJAAAAA AAJAAACKCJAAAJAA ACJJAAAAAAAACJJA } # tile 211 (sub knox walls 4) { AAAAAAKCKCAAAAAA AAAACKCLKJKKAAAA AAKKKCLCKKJCKKAA AKCKCLCCKJJJKCKA AKKCCCKKJJJJJKKA AACCCAKJJAJJJACA AJACAJAJAJAJAJAA KJJACJJAKJJACJJA CJJAKJJACJJACJJA KJJACJAAKJJAKJAA CJJACJAACJJAKJJA KJAACJJACJJACJJA CJAACJJACJAAKJJA KJJAKJJAKJJACJAA KJJACJJAKKJACJJA AAAAAAAAAAAAAAAA } # tile 212 (sub knox walls 5) { AAAAAAKCJKAAAAAA AAAACKCLKKKKAAAA AAKKKCLCKJJCKKAA AKCKCLCCKJJJCKKA AKKCCCKKJJJJJKCA AACCCAKJJAJJJAKA AJACAJAJAJAJAJAA KJJACJJAKJJACJJA CJJAKJJAKKJACJJA KJJACJAAKJJAKJAA CJJACJAACJJAKKJA KJAACJJACJJACJJA CJAACJJACJAAKJJA KJJAKJJAKJJACJAA KJJACJJACJJACJJA AAAAAAAAAAAAAAAA } # tile 213 (sub knox walls 6) { AAAAAAKCJKAAAAAA AAAACKCLKJCKAAAA AAKKKCLCKJJKCKAA AKCKCLCCKJJJKKKA AKKCCCKKJJJJKCKA AKCCCCKAAJJJJJCA AJJCKKACJAJJJJJA AJJJAACLJJAAJJJA AAAAACLCKJJAAAAA AAJAAACCKJAAAJAA ACJJAAAAAAAACJJA AJJJAAACJAAAJJJA AJJJAACLJJAAJJJA AAAAACLCKJJAAAAA AAJAAACKCJAAAJAA ACJJAAAAAAAACJJA } # tile 214 (sub knox walls 7) { AAAAAAKCKCAAAAAA AAAACKCLKJKKAAAA AAKKKCLCKKJCKKAA AKCKCLCCKJJJKCKA AKKCCCKKJJJJJKKA AACCCAKJJAJJKAKA AJACAJAJAJAJAJAA KJJACJJAKJJACJJA KKJAKJJACJJACJJA KJJACJAAKJJAKJAA CJJACJAACJJACJJA KJAACJJACJJACJJA CJAACJJACJAAKJJA KJJAKJJAKJJACJAA KJJACJJAKJJACJJA AAAAAAAAAAAAAAAA } # tile 215 (sub knox walls 8) { AAAAAAKCKCAAAAAA AAAACKCLKJKKAAAA AAKKKCLCKKJCKKAA AKCKCLCCKJJJKCKA AKKCCCKKJJJJJKKA ACCCCKKAAJJJJKKA AJJCKCACJAJJJJJA AJJJAACLJJAAJJJA AAAAACLCKJJAAAAA AAJAAACCKJAAAJAA ACJJAAAAAAAACJJA AJJJAAACJAAAJJJA AJJJAACLJJAAJJJA AAAAACLCKJJAAAAA AAJAAACKCJAAAJAA ACJJAAAAAAAACJJA } # tile 216 (sub knox walls 9) { AAAAAAKCJKAAAAAA AAAACKCLCJKKAAAA AAKKKCLCKJJCKKAA AKCKCLCKKJJJCKKA AKKCCCKCJJJJJKCA ACCCCKKAAJJJJJKA AJJCKCACJAJJJJJA AJJJAACLJJAAJJJA AAAAACLCKJJAAAAA AAJAAACKKJAAAJAA ACJJAAAAAAAACJJA AJJJAAACJAAAJJJA AJJJAACLJJAAJJJA AAAAACLCKJJAAAAA AAJAAACKCJAAAJAA ACJJAAAAAAAACJJA } # tile 217 (sub knox walls 10) { AAAAAAKCJKAAAAAA AAAACKCLCJKKAAAA AAKKKCLCKJJCKKAA AKCKCLCKKJJJCKKA AKKCCCKCJJJJJKCA AKCCCKKAAJJJJJKA AJJCKCACJAJJJJJA AJJJAACLJJAAJJJA AAAAACLCKJJAAAAA AAJAAACKKJAAAJAA ACJJAAAAAAAACJJA AJJJAAACJAAAJJJA AJJJAACLJJAAJJJA AAAAACLCKJJAAAAA AAJAAACKCJAAAJAA ACJJAAAAAAAACJJA } # tile 218 (sub sokoban walls 0) { ANNBAMEEEEEMNNBA ABBBAMEMEEMMBBBA ABBBAMEEEEEMBBBA ABBBAMEEEEEMBBBA ABBBAMMEEEEMBBBA AMAAAMMEEEEMMAMA AMMMAMMEEEEMMMMA ABEEAMMEEMEMBEMA ANNBAMEEEEEMNNBA ABBBAMEEEEEMBBBA ABBBAMEEEEEMBBBA ABBBAMEEEEEMBBBA ABBBAMMEMEMMBBBA AMAAAMMEEEEMMAMA AMMMAMMEEEEMMMMA ABEEAMMEEEEMBEMA } # tile 219 (sub sokoban walls 1) { AAANBBAAAAANBBAA BBBNBBAMBBBNBBAM EBBMMMAMEBBMMMAM MMMMMMMMMMMMMMMM EEMMMEEEEEMMMEEE EENBBEEEEENBBEEE BBNBBAMBBBNBBAMB BBMMMAMEBBMMMAME MMMMMMMMMMMMMMMM EEMBEEEEMBEEEMBE EEMEEEEEMEEEEMEE MMMMMMMMMMMMMMMM MBEEEEMBEEEEMBEE MEEEEEMEEEEEMEEE MMMMMMMMMMMMMMMM AAAAAAAAAAAAAAAA } # tile 220 (sub sokoban walls 2) { AAANNNNBBBBBBAAA NNNNAAMMEEEEBMMM BBBNAMMEEENNBMMM BBBBBBBBBBBBBMMM BBBEEEEEEEEEEMMM BBBEEEEEEEEEEMMM BBEEEEEEEEEEEEMM BEEEEEEEEEEEEEEM MMMMMMMMMMMMMMMM AEEMMMMMMMMMEEEM ABBBAAAAAAAABBBA ABBBAMEEEEEMBBBA ABBBAMEEEEEMBBBA AMAAAMMEEEEMMAMA AMMMAMMEEEEMMMMA ABEEAMMEEEEMBEMA } # tile 221 (sub sokoban walls 3) { AAANNNNBBBBBBAAA NNNNAAMMEEEEBMMM BBBNAMMEEENNBMMM BBBBBBBBBBBBBMMM BBBEEEEEEEEEEMMM BBBEEEEEEEEEEMMM BBEEEEEEEEEEEEMM BEEEEEEEEEEEEEEM MMMMMMMMMMMMMMMM AEEMMMMMMMMMEEEM ABBBAAAAAAAABBBA ABBBAMEEEEEMBBBA ABBBAMEEEEEMBBBA AMAAAMMEEEEMMAMA AMMMAMMEEEEMMMMA ABEEAMMEEEEMBEMA } # tile 222 (sub sokoban walls 4) { AAANNNNBBBBBBAAA NNNNAAMMEEEEBMMM BBBNAMMEEENNBMMM BBBBBBBBBBBBBMMM BBBEEEEEEEEEEMMM BBBEEEEEEEEEEMMM BBEEEEEEEEEEEEMM BEEEEEEEEEEEEEEM MMMMMMMMMMMMMMMM EEMBEEEEMBEEEMBE EEMEEEEEMEEEEMEE MMMMMMMMMMMMMMMM MBEEEEMBEEEEMBEE MEEEEEMEEEEEMEEE MMMMMMMMMMMMMMMM AAAAAAAAAAAAAAAA } # tile 223 (sub sokoban walls 5) { AAANNNNBBBBBBAAA NNNNAAMMEEEEBMMM BBBNAMMEEENNBMMM BBBBBBBBBBBBBMMM BBBEEEEEEEEEEMMM BBBEEEEEEEEEEMMM BBEEEEEEEEEEEEMM BEEEEEEEEEEEEEEM MMMMMMMMMMMMMMMM EEMBEEEEMBEEEMBE EEMEEEEEMEEEEMEE MMMMMMMMMMMMMMMM MBEEEEMBEEEEMBEE MEEEEEMEEEEEMEEE MMMMMMMMMMMMMMMM AAAAAAAAAAAAAAAA } # tile 224 (sub sokoban walls 6) { AAANNNNBBBBBBAAA NNNNAAMMEEEEBMMM BBBNAMMEEENNBMMM BBBBBBBBBBBBBMMM BBBEEEEEEEEEEMMM BBBEEEEEEEEEEMMM BBEEEEEEEEEEEEMM BEEEEEEEEEEEEEEM MMMMMMMMMMMMMMMM AEEMMMMMMMMMEEEM ABBBAAAAAAAABBBA ABBBAMEEEEEMBBBA ABBBAMEEEEEMBBBA AMAAAMMEEEEMMAMA AMMMAMMEEEEMMMMA ABEEAMMEEEEMBEMA } # tile 225 (sub sokoban walls 7) { AAANNNNBBBBBBAAA NNNNAAMMEEEEBMMM BBBNAMMEEENNBMMM BBBBBBBBBBBBBMMM BBBEEEEEEEEEEMMM BBBEEEEEEEEEEMMM BBEEEEEEEEEEEEMM BEEEEEEEEEEEEEEM MMMMMMMMMMMMMMMM EEMBEEEEMBEEEMBE EEMEEEEEMEEEEMEE MMMMMMMMMMMMMMMM MBEEEEMBEEEEMBEE MEEEEEMEEEEEMEEE MMMMMMMMMMMMMMMM AAAAAAAAAAAAAAAA } # tile 226 (sub sokoban walls 8) { AAANNNNBBBBBBAAA NNNNAAMMEEEEBMMM BBBNAMMEEENNBMMM BBBBBBBBBBBBBMMM BBBEEEEEEEEEEMMM BBBEEEEEEEEEEMMM BBEEEEEEEEEEEEMM BEEEEEEEEEEEEEEM MMMMMMMMMMMMMMMM AEEMMMMMMMMMEEEM ABBBAAAAAAAABBBA ABBBAMEEEEEMBBBA ABBBAMEEEEEMBBBA AMAAAMMEEEEMMAMA AMMMAMMEEEEMMMMA ABEEAMMEEEEMBEMA } # tile 227 (sub sokoban walls 9) { AAANNNNBBBBBBAAA NNNNAAMMEEEEBMMM BBBNAMMEEENNBMMM BBBBBBBBBBBBBMMM BBBEEEEEEEEEEMMM BBBEEEEEEEEEEMMM BBEEEEEEEEEEEEMM BEEEEEEEEEEEEEEM MMMMMMMMMMMMMMMM AEEMMMMMMMMMEEEM ABBBAAAAAAAABBBA ABBBAMEEEEEMBBBA ABBBAMEEEEEMBBBA AMAAAMMEEEEMMAMA AMMMAMMEEEEMMMMA ABEEAMMEEEEMBEMA } # tile 228 (sub sokoban walls 10) { AAANNNNBBBBBBAAA NNNNAAMMEEEEBMMM BBBNAMMEEENNBMMM BBBBBBBBBBBBBMMM BBBEEEEEEEEEEMMM BBBEEEEEEEEEEMMM BBEEEEEEEEEEEEMM BEEEEEEEEEEEEEEM MMMMMMMMMMMMMMMM AEEMMMMMMMMMEEEM ABBBAAAAAAAABBBA ABBBAMEEEEEMBBBA ABBBAMEEEEEMBBBA AMAAAMMEEEEMMAMA AMMMAMMEEEEMMMMA ABEEAMMEEEEMBEMA } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/share/oth32al2.txt������������������������������������������������������������0000664�0000764�0000764�00000024025�10545462320�015647� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������__ = (0, 0, 0) _A = (128, 96, 0) _B = (0, 0, 192) _C = (168, 224, 224) _D = (96, 48, 48) _E = (128, 64, 0) _F = (32, 64, 64) _G = (0, 112, 224) _H = (192, 96, 96) _I = (48, 96, 0) _J = (117, 105, 88) _K = (168, 168, 224) _L = (128, 32, 0) _M = (96, 0, 48) _N = (64, 128, 128) _O = (255, 128, 128) _P = (128, 0, 255) _Q = (0, 64, 32) _R = (128, 0, 0) _S = (48, 48, 0) _T = (96, 192, 0) _U = (48, 36, 0) _V = (96, 192, 192) _W = (0, 32, 32) _X = (48, 24, 0) _Y = (48, 12, 0) _Z = (128, 112, 32) _a = (64, 64, 128) _b = (192, 0, 96) _c = (48, 0, 0) _d = (0, 0, 224) _e = (224, 224, 0) _f = (0, 128, 64) _g = (0, 255, 255) _h = (96, 96, 0) _i = (0, 255, 0) _j = (96, 96, 192) _k = (96, 72, 0) _l = (104, 84, 31) _m = (224, 168, 0) _n = (0, 64, 64) _o = (96, 48, 0) _p = (248, 224, 96) _q = (224, 224, 112) _r = (202, 143, 114) _s = (24, 48, 48) _t = (144, 192, 192) _u = (0, 32, 64) _v = (96, 24, 0) _w = (128, 128, 64) _x = (24, 24, 48) _y = (224, 112, 0) _z = (240, 240, 240) _0 = (0, 48, 24) _1 = (128, 255, 255) _2 = (96, 0, 0) _3 = (128, 255, 0) _4 = (0, 145, 0) _5 = (0, 24, 24) _6 = (255, 192, 0) _7 = (255, 192, 192) _8 = (224, 224, 224) _9 = (16, 16, 0) _$ = (128, 64, 64) A_ = (224, 56, 0) AA = (170, 136, 52) AB = (16, 0, 0) AC = (224, 112, 112) AD = (0, 96, 96) AE = (208, 208, 208) AF = (64, 128, 0) AG = (255, 128, 0) AH = (224, 168, 224) AI = (224, 0, 0) AJ = (128, 0, 64) AK = (255, 108, 0) AL = (192, 192, 255) AM = (192, 192, 0) AN = (255, 255, 128) AO = (192, 192, 192) AP = (128, 128, 96) AQ = (112, 224, 0) AR = (64, 64, 0) AS = (127, 90, 72) AT = (224, 112, 224) AU = (48, 48, 24) AV = (255, 64, 0) AW = (64, 48, 0) AX = (192, 144, 0) AY = (176, 176, 176) AZ = (128, 96, 96) Aa = (48, 24, 24) Ab = (64, 32, 0) Ac = (224, 0, 112) Ad = (24, 48, 0) Ae = (0, 128, 128) Af = (64, 16, 0) Ag = (144, 192, 144) Ah = (160, 160, 160) Ai = (64, 0, 0) Aj = (192, 96, 0) Ak = (255, 0, 255) Al = (24, 24, 0) Am = (255, 0, 0) An = (192, 96, 192) Ao = (48, 96, 96) Ap = (145, 71, 0) Aq = (0, 16, 16) Ar = (120, 160, 160) As = (24, 0, 0) At = (0, 0, 16) Au = (182, 71, 0) Av = (144, 144, 144) Aw = (0, 64, 128) Ax = (192, 48, 0) Ay = (80, 160, 160) Az = (224, 0, 224) A0 = (48, 48, 96) A1 = (120, 120, 160) A2 = (160, 160, 80) A3 = (160, 80, 160) A4 = (128, 128, 128) A5 = (0, 96, 48) A6 = (64, 64, 32) A7 = (112, 224, 224) A8 = (192, 0, 0) A9 = (0, 160, 160) A$ = (0, 0, 128) B_ = (72, 108, 108) BA = (112, 112, 112) BB = (64, 32, 32) BC = (80, 80, 160) BD = (0, 48, 48) BE = (160, 160, 0) BF = (160, 80, 80) BG = (64, 0, 32) BH = (160, 0, 160) BI = (96, 96, 96) BJ = (252, 252, 153) BK = (32, 32, 0) BL = (64, 128, 64) BM = (160, 120, 0) BN = (0, 80, 160) BO = (0, 224, 0) BP = (112, 112, 224) BQ = (80, 80, 80) BR = (32, 0, 0) BS = (128, 0, 128) BT = (255, 255, 255) BU = (96, 48, 96) BV = (242, 196, 77) BW = (208, 168, 80) BX = (255, 255, 0) BY = (255, 255, 192) BZ = (160, 80, 0) Ba = (0, 182, 255) Bb = (160, 0, 80) Bc = (0, 192, 192) Bd = (165, 118, 94) Be = (48, 96, 48) Bf = (64, 64, 64) Bg = (192, 160, 64) Bh = (218, 218, 182) Bi = (224, 224, 168) Bj = (0, 160, 0) Bk = (160, 40, 0) Bl = (0, 0, 160) Bm = (0, 224, 112) Bn = (64, 32, 64) Bo = (0, 128, 255) Bp = (0, 128, 0) Bq = (96, 128, 128) Br = (48, 48, 48) Bs = (229, 162, 130) Bt = (32, 64, 32) Bu = (192, 255, 255) Bv = (171, 154, 129) Bw = (160, 0, 0) Bx = (224, 168, 168) By = (145, 135, 110) Bz = (112, 0, 224) B0 = (96, 96, 128) B1 = (0, 255, 128) B2 = (0, 96, 192) B3 = (24, 48, 24) B4 = (255, 211, 175) B5 = (32, 32, 32) B6 = (0, 224, 224) B7 = (32, 0, 32) B8 = (192, 192, 96) B9 = (16, 16, 16) B$ = (128, 128, 255) C_ = (128, 128, 0) CA = (255, 182, 145) CB = (16, 0, 16) CC = (0, 24, 0) CD = (96, 96, 48) CE = (108, 145, 182) CF = (0, 16, 0) CG = (0, 0, 255) # tile 855 (grave) { BQBeAoBQBLBQBeAoBQBLBQBeBQBLBQBeBQBLBQBeAoBQBLBQBeAoBQBLBQBeAoBe AoBeBeBe_FBeBfBe_Q_QBDBeBe_FAOAEAEAOAOBfBeBe_FBe_Q_QBe_FBeBeBf_Q BQBeBfBeBQBLAoBeBf_Q_Q_FAOAOAOAOAOAO_8AEAE_FBQBeBD_QBfBLBQ_FBe_Q BeBeBQBeAoBfBeBQBe_n_QAOAOAOAOAOAOAOAOAOAEAOAoBe_Q_FBeAoBeBQBeBD BQ_FBLBQBeBLAoBeBe_F_QAOAvA4AYAYBIAOA4AhAOAEBeBf_QBeBQBeBQBL_F_Q AoBeBeAoBQBeBQAoBQBe_QAOA4AOAhAOA4AOAvAOA4AEBe_QBfBe_FBLAoBQBe_n BQBeBfBLBeBfBLBeBQBeBDAYBAAhAOAOAvAOA4A4AOAOBD_Q_Q_QBfBeBeBe_F_Q BQBeBeAoBQAoBeBQBe_F_QAYA4AOA4AOBAAOA4AYAOAEBe_FBe_n_Q_QBDBfBe_Q BeBfBeBQBeBeBQAoBe_Q_QAYAvAOAYAOAvAYAvAOAOAOBfBLBfBe_FBe_Q_QBD_Q AoBeBeAoBeBfBeBeBeBDBeAYAOAOAOAOAOAOAOAOAOAOBeAoBeBQAoBfBe_Q_n_Q BQ_Q_nBeBf_Q_QBDBD_Q_FAYAOAYAOAOAOAOAOAOAOAOBQBLBfBLBeBQAoBe_Q_Q Ao_Q_Q_Q_QBfBe_FBe_QBeAYAYAYAYAOAOAOAOAOAOAOBeBeBQ_FBeBe_QBD_QBD BQBe_FBeBfBeAoBeBfBeBDAYAYAYAOAOAYAOAOAYAOAOBDBeBeBeBD_Q_Q_Q_Q_Q AoBeBfBLAoBQBLBQ_FBe_QBfCDBfA6CDBfCDBfA6CDBf_QBD_nBD_Q_Q_nBfBe_n BeBfBLBfBLBe_FBLBQBeBDCDBeCDBtBfCDBeCDBtBfA6BeBeBeBD_Q_n_QBe_F_Q BQBeAoBeBQBeBQBQBL_FBeA6BQBQA6A6CDBfBfA6CDA6AoBf_FBe_Q_QBeBfBe_n BL_FBQBeAoBeAoBeBQBeBfBQCDBeA6BtBtBtBtBtBtA6BLBQBe_FBeBDBeAoBe_Q BQBeAoBeBQBLBQBe_FBe_QA6CDBfBtA6BQA6A6BQA6B3AoBeBQBeBf_QBfBeBf_Q BL_FBeBfBe_FBeBeBD_QBe_FBtA6A6BQCDBeA6CDBeBtBeBQBL_FBe_QBeBfBe_n BQ_Q_Q_Q_Q_Q_Q_n_QBfBeA6CDBfA6BeCDBfB3BrB3BtBfBeAoBe_QBDBeAoBe_Q BeBfBe_FBeBf_Q_Q_QBeAoCDBfCDBtA6BfBtA6A6BtA6BeAoBQBeBDBe_FBQBeBD AoBeBfBeBfBe_FBe_nBfBeBfCDBQA6A6BtBtCDBfA6BeBQBeBQBe_QBfBeBe_Q_Q BQBe_FBLAoBQBLBf_Q_QBeA6BtBtA6BeBfA6BeCDBtA6AoBeAoBeBD_QBD_Q_n_Q AoBeBQBeBQBeBQ_FBe_QBDCDBfBtA6BQCDA6CDBfBrA6BeBQBeBD_QBe_FBe_Q_n BQBeAoBeAoBeAoBLBf_F_QBfCDBfA6A6BtB3BfBeAUBt_QBe_F_QBeBfBLBfBe_Q BeBeBQBLBQBLBQBeBQBe_QBeCDCDBtBtA6BeA6BtCDBtBf_Q_QBDBeBQAoBeBf_n BQBeAoBeBQBeAoBLBQBeBfBQBfCDBfA6CDBQCDBtBfA6Be_F_Q_QBeAoBeBQBe_Q BLBfBeAoBeBQBeBQBL_FBeBeCDBQA6BeBQCDBfBtCDBeBQBeBeBDBeBQBeAoBe_Q AoBeBQBeBQBLAoBeBQBeBfA6BtBtBtAUBtBtA6B3BtB3AoBeBf_QBe_FBLBQBeBD BQBe_FBLAoBQBeBQBe_FBe_QBfBeBeBQBLBQBeAoBQBLBfBe_QBDBfBLBQBeBf_Q BeBfBeBfBeBe_FBe_FBeBD_Q_Q_FBe_FBe_FBeBeBe_FBeBD_Q_Q_Q_FBe_F_Q_n Be_Q_Q_QBD_Q_Q_Q_Q_Q_Q_Q_n_QBD_Q_Q_QBD_QBD_QBD_Q_Q_n_Q_n_Q_Q_Q_Q } # tile 883 (teleportation trap) { AUBrAUB5AUA6A6BBA6AUA6AUAUAUAUAUAUAUBBAUAUAUAUAUAUAUAUA6AaAUB5AU AUB5BBB5Aa_DAWAa_XA6_oAaAaBBBBAaAaA6AWAaAaAUBBAa_UBBAWAaAaAUB5B5 B5AU_R_R_R_R_R_R_R_R_R_R_2_2_2_2_2_2_2_R_R_R_R_R_RBwBwBw_R_RAUAU AUAa_R_R_R_R_R_R_R_R_2_2_2_2_R_R_R_R_2_2_2_2Bw_RBwBwBwBwBw_RBBB5 AUAU_RBw_R_R_R_R_RAi_2_R_RBwBwBwBwBwBw_R_R_2Ai_R_RBwBwBwBw_RAaB5 AUAU_R_R_R_R_R_2_2_R_R_R_R_RBwBwBwBwBwBw_R_R_2Ai_2Bw_RBwBwBwAUA6 A6BB_R_R_R_RAi_2_RBw_R_R_R_R_RBw_RBwBw_R_R_2_2_2AiAiBw_RBw_R_DAR AU_U_RBw_RAi_2_R_R_R_R_R_R_R_R_R_R_R_R_R_R_2_2_2AiAi_2BwBwBwBBA6 AUAa_RBw_RAi_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_R_2_R_2Ai_2_RBwBKBB AUAU_R_RAi_2_R_R_R_R_R_R_R_R_2_R_R_R_RBw_R_2_2_R_R_2_2Ai_R_RBBA6 BrAU_R_RAi_2_2_R_R_R_R_R_R_2_R_2_R_R_R_R_2_2_R_R_2_R_R_2_2_RA6AW AUAa_2_2_2_2Ai_2_2_R_R_R_2_2_2_2_R_2_2_2_2_R_R_2_2_R_2_2_2BwA6BB AUAa_R_2_2_R_2_2_2Ai_2_2_2_R_2AiAi_2_2Ai_R_R_2_2_R_2_R_2_2_2_XAU A6AU_2_2_R_2_2_2_2_R_2_2_2Ai_2_2_2_2Ai_2_2_R_R_R_R_R_R_R_2_2AUBB AUBB_v_2_R_2_2_2_2_2_R_R_2_R_2AiAiAi_2_R_2_R_R_R_R_R_RBw_2_2BBAU AUAa_2_2_R_2_2_2_2_2_R_R_R_2_R_2Ai_2_2_2_2_R_RBw_RBw_RBw_2_2BBAU AUAa_2_R_R_R_2_R_2_2_R_2_R_R_2_2_2_2_2_2Ai_2Ai_2_2_R_R_R_2_2B5AU AUAU_2_2_R_2_R_2_R_R_2_R_R_2_2_R_R_R_2_2_R_R_R_2_2_2_R_2_Y_2BBAU BrAU_2_2_R_R_R_2_R_R_R_R_2_2_R_R_R_2_2_2_R_R_R_R_R_2_c_cBR_vBBAU AUAa_2_2_2_R_2_R_R_2_2_2_2_RBw_R_2_2_2_2_R_R_R_2Ai_2_R_2Ai_RAWAU AUAa_2_2_2_R_R_R_2_R_2Ai_R_2_R_R_R_R_2AiAiAi_2_2_R_RBw_R_2_RB5BB A6A6_2_2Ai_R_2_R_R_2Ai_2_2_2_R_2_2Ai_2_2_2_R_R_RBw_R_R_2_2_RAUAU A6BB_R_2Ai_2_R_2_2Ai_2_2_2_2Ai_2_2_2_2_R_2_R_R_2_2_2_RAi_RBwAUAU A6_U_2_R_2Ai_2_2AiAi_2_2Ai_2_2_R_R_2_2_2_R_2_R_2_2_2_2_2_2_2BBAU BBAa_2_R_R_2Ai_2Ai_2Ai_2_2_2_R_R_2_2_2_2_R_R_R_R_R_2_2_R_R_2Aa_U A6A6_2_2_R_2AiAi_2_2Ai_2_2_2_R_2_2_2_2_R_2_R_R_2_2_2_2_R_R_RAUA6 A6BB_2_2_R_2_2AiAi_2_2_2_2_R_R_2_R_2_2_2_R_R_2_2_2_2_R_R_2_2AWBB AUAU_2_2_2_R_2_R_2AiAiAi_2_2_R_2_R_R_2_2_2_2Ai_2_R_R_R_2_R_RBBA6 BrB5_2_R_2_2_2_2_R_2_2AiAi_2_2_2Ai_2AiAiAi_2_2_R_2_R_R_R_R_2Aa_S AaAU_2_2_2_2_2_2_R_2_2_2_2_2AiAiAiAi_2_2_2_R_2_R_R_2_2_2_2_2AUB5 _sB5AUAaAUBBAUBKAUBrAUAaAUAUBBAaAUBBB5BKA6A6BBBKAUA6BBB5AUAUB5Aa AaB5AU_UA6AUAUAUBBAUAUAUBBAUAUAUAUAUBrBBAWBBAUA6BBA6A6B5AUB5B5AU } # tile 884 (level teleporter) { AUB5AUB5AUA6A6BBA6AUA6BBAUAUAUAUAaA6AUBBAUAUAUAU_UAUBBAUAUB5AaAU AaAUBrB5AUBBA6Aa_UBBA6AUAaBrBBB5AUBBAUAUAaBrAUAaAUBBA6AUAaAUB5Br BrAUBfBfBQBfBfBfBQBfBQBfBfBfBfBfBfBfBfBfBfBQBfBQBfBQBfBQBfBfAUB5 AUAaBfBQBQBQBQBQBQBQBQBfBfBrBrBrBrBfBrBrBfBfBQBQBQBQBQBQBQBQBrAU AUAUBQBQBQBQBQBQBQBfAUBrBrB5BQBQBQBQBQBfBfBrBrBfBQBQBQBQBQBQB5Aa BBAUBQBIBQBIBQBQBrBrBQBQBQBrBrBQBIBQBIBQBIBQBfBrBfBIBIBQBIBQAUA6 BBA6BQBIBIBIBQBrBfBIBIBIBIBrBrBfBIBIBIBQBIBIBIBfB5BfBIBIBIBQ_DA6 _SAaBIBIBIBQBrBQBIBIBIBIBIBrBIBrBQBIBIBIBQBQBrBrBrBrBfBIBIBIAUA6 AUAaBIBIBIBfBQBIBIBIBABIBIBrBIBQBfBIBQBfBrBfBQBrBIBIBfBQBABI_XBB AUA6BIBABfBfBIBABABABABABIBrBABIBrBrBfBfBIBABIBfBIBABIBfBIBAAUA6 BBAUBABIBfBABABABABABABABABrBfBfBfBfBIBABABABfBIBABABABfBQBAA6A6 AUB5BABQBIBABABABABABABQBfBfBQBABABIBfBAA4BIBQA4BABAA4BIBfAZA6BB AUBB_JBQBAA4BABABABQBQBQBABfA4A4A4A4BQBIA4BQBAA4BAA4A4BABfBIAUAU AUA6BIBQA4A4BIBQBQBAA4A4A4BQA4A4A4A4BABQBIBIA4A4A4A4A4A4BQBIBrAU AUA6BIBQBIBIBAA4A4A4A4A4A4BQA4A4A4A4AvBIBQA4A4A4A4A4AvA4BQBIA6Aa AaBrBIBQBIBAA4A4AvAvAvAvA4BIA4AvA4AvAvBABfA4AvAvA4AvAvA4BIBABrA6 AUAaBIBAAvBABIBAA4A4AvAvAvBAAvAvAvAvA4BIBABIAvAvAvAvAvAvBIBAAUAa AUA6BAA4AvAhAvA4A4A4A4A4AvBAAvAvAvAvA4A4AvA4A4AvAvAvAvAvBAA4BrAU BBBrBABAAvAvAvAvAvAvA4A4BABIAvAvAhAvBAA4AvAvBAAvAvAhAvAhBABAA6BB AUB5A4BIAvAvA4AvAvAvAvAvA4BIBABAA4BABAAvAvAvBABAAvAvAvAvBIBAA6A6 AWAUA4BIBAAvA4A4AvA4AvA4AvBAA4A4BIBfBIBAA4AvAvBIBAAvAvA4BQBABBAU BBA6BABABIA4A4A4A4A4A4A4A4BIA4A4BABIBABIBIBIBABABQA4AvBIBQA4AUAU A6A6A4A4BQBIA4A4A4A4A4A4A4BIA4A4BQA4A4A4BABABQBQBfBIBABQBIA4BrBB BBAaBAA4BIBQBAA4BAA4A4A4BABQA4BIBIA4A4BAA4A4A4BABQBfBrBfBABAAUAU AUAU_JBABABQBfBABABABABABABQBABfBABABABABABABAA4BABfB5BIA4BAAaAU BBA6BABABABABQBfBABABABABABQBQBIBABABABABABABABABQBrBIBABABAA6AU A6A6BIBABABABIBfBfBIBABABIBfBfBIBABABABIBABABABfBfBQBABABABIBBAU AUAaBIBIBIBABIBIBQBrBfBIBIBrBQBABIBABIBIBIBfBrBfBIBABABIBIBIA6A6 AaB5BIBIBIBIBIBIBIBIBfBrBrB5BfBQBQBfBfBrBrBrBQBIBIBIBIBIBIBIAa_U AUBrBQBQBIBIBQBQBIBQBIBQBQBfBfBfBrBfBfBfBQBIBIBIBQBIBIBIBIBQAUAU B5AUAUAaAUAUA6AaAUBrAUAaAUA6BBB5AUBrAUAaA6A6AUBKBBA6AUB5B5BrB5B5 B5B5AaAUA6AUBB_UAUAUB5AUA6BBAUAUAUAUAUAUAWBBA6BBAWA6A6AaAUAUB5AU } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/share/zap.txt�����������������������������������������������������������������0000664�0000764�0000764�00000022377�10545462320�015113� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������A = (0, 0, 0) B = (0, 182, 255) C = (255, 108, 0) D = (255, 0, 0) E = (0, 0, 255) F = (0, 145, 0) G = (108, 255, 0) H = (255, 255, 0) I = (255, 0, 255) J = (145, 71, 0) K = (182, 71, 0) L = (255, 182, 145) M = (71, 108, 108) N = (255, 255, 255) O = (218, 218, 182) P = (108, 145, 182) # tile 59 (zap 1 -) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMKMM MMMMMKMMKMKKKIKK KMKKKIKKIKIIINII IKIIINIININNNINN NINNNINNINIIIKII INIIIKIIKIKKKMKK KIKKKMKKMKMMMMMM MKMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 60 (zap 1 |) { MMMMMMKINIKMMMMM MMMMMMMKINIKMMMM MMMMMMKINIKMMMMM MMMMMMKINIKMMMMM MMMMMMKINIKMMMMM MMMMMKINIKMMMMMM MMMMMMKINIKMMMMM MMMMMMKINIKMMMMM MMMMMKINIKMMMMMM MMMMMMKINIKMMMMM MMMMMKINIKMMMMMM MMMMMKINIKMMMMMM MMMMMKINIKMMMMMM MMMMKINIKMMMMMMM MMMMMKINIKMMMMMM MMMMMKINIKMMMMMM } # tile 61 (zap 1 /) { MMMMMMMMMMMMMKIN MMMMMMMMMMMMKINI MMMMMMMMMMMKINNI MMMMMMMMMKKINIIK MMMMMMMMIIINIKKM MMMMMMMKINNIKMMM MMMMMMMKINIKMMMM MMMMMMKINIKMMMMM MMMMMKINIKMMMMMM MMMMKINIKMMMMMMM MMMKINNIKMMMMMMM MKKINIIKMMMMMMMM KIINIKKMMMMMMMMM INNIKMMMMMMMMMMM INIKMMMMMMMMMMMM NIKMMMMMMMMMMMMM } # tile 62 (zap 1 \) { NIKMMMMMMMMMMMMM INIKMMMMMMMMMMMM INNIKMMMMMMMMMMM KIINIKKMMMMMMMMM MKKINIIKMMMMMMMM MMMKINNIKMMMMMMM MMMMKINIKMMMMMMM MMMMMKINIKMMMMMM MMMMMMKINIKMMMMM MMMMMMMKINIKMMMM MMMMMMMKINNIKMMM MMMMMMMMKIINIKKM MMMMMMMMMKKINIIK MMMMMMMMMMMKINNI MMMMMMMMMMMMKINI MMMMMMMMMMMMMKIN } # tile 63 (zap 2 -) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMCMM MMMMMCMMCMCCCDCC CMCCCDCCDCDDDNDD DCDDDNDDNDNNNDNN NDNNNDNNDNDDDCDD DNDDDCDDCDCCCMCC CDCCCMCCMCMMMMMM MCMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 64 (zap 2 |) { MMMMMMCDNDCMMMMM MMMMMMMCDNDCMMMM MMMMMMCDNDCMMMMM MMMMMMCDNDCMMMMM MMMMMMCDNDCMMMMM MMMMMCDNDCMMMMMM MMMMMMCDNDCMMMMM MMMMMMCDNDCMMMMM MMMMMCDNDCMMMMMM MMMMMMCDNDCMMMMM MMMMMCDNDCMMMMMM MMMMMCDNDCMMMMMM MMMMMCDNDCMMMMMM MMMMCDNDCMMMMMMM MMMMMCDNDCMMMMMM MMMMMCDNDCMMMMMM } # tile 65 (zap 2 /) { MMMMMMMMMMMMMCDN MMMMMMMMMMMMCDND MMMMMMMMMMMCDNND MMMMMMMMMCCDNDDC MMMMMMMMCDDNDCCM MMMMMMMCDNNDCMMM MMMMMMMCDNDCMMMM MMMMMMCDNDCMMMMM MMMMMCDNDCMMMMMM MMMMCDNDCMMMMMMM MMMCDNNDCMMMMMMM MCCDNDDCMMMMMMMM CDDNDCCMMMMMMMMM DNNDCMMMMMMMMMMM DNDCMMMMMMMMMMMM NDCMMMMMMMMMMMMM } # tile 66 (zap 2 \) { NDCMMMMMMMMMMMMM DNDCMMMMMMMMMMMM DNNDCMMMMMMMMMMM CDDNDCCMMMMMMMMM MCCDNDDCMMMMMMMM MMMCDNNDCMMMMMMM MMMMCDNDCMMMMMMM MMMMMCDNDCMMMMMM MMMMMMCDNDCMMMMM MMMMMMMCDNDCMMMM MMMMMMMCDNNDCMMM MMMMMMMMCDDNDCCM MMMMMMMMMCCDNDDC MMMMMMMMMMMCDNND MMMMMMMMMMMMCDND MMMMMMMMMMMMMCDN } # tile 67 (zap 3 -) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMPMM MMMMMPMMPMPPPOPP PMPPPOPPOPOOONOO OPOOONOONONNNONN NONNNONNONOOOPOO ONOOOPOOPOPPPMPP POPPPMPPMPMMMMMM MPMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 68 (zap 3 |) { MMMMMMPONOPMMMMM MMMMMMMPONOPMMMM MMMMMMPONOPMMMMM MMMMMMPONOPMMMMM MMMMMMPONOPMMMMM MMMMMPONOPMMMMMM MMMMMMPONOPMMMMM MMMMMMPONOPMMMMM MMMMMPONOPMMMMMM MMMMMMPONOPMMMMM MMMMMPONOPMMMMMM MMMMMPONOPMMMMMM MMMMMPONOPMMMMMM MMMMPONOPMMMMMMM MMMMMPONOPMMMMMM MMMMMPONOPMMMMMM } # tile 69 (zap 3 /) { MMMMMMMMMMMMMPON MMMMMMMMMMMMPONO MMMMMMMMMMMPONNO MMMMMMMMMPPONOOP MMMMMMMMPOONOPPM MMMMMMMPONNOPMMM MMMMMMMPONOPMMMM MMMMMMPONOPMMMMM MMMMMPONOPMMMMMM MMMMPONOPMMMMMMM MMMPONNOPMMMMMMM MPPONOOPMMMMMMMM POONOPPMMMMMMMMM ONNOPMMMMMMMMMMM ONOPMMMMMMMMMMMM NOPMMMMMMMMMMMMM } # tile 70 (zap 3 \) { NOPMMMMMMMMMMMMM ONOPMMMMMMMMMMMM ONNOPMMMMMMMMMMM POONOPPMMMMMMMMM MPPONOOPMMMMMMMM MMMPONNOPMMMMMMM MMMMPONOPMMMMMMM MMMMMPONOPMMMMMM MMMMMMPONOPMMMMM MMMMMMMPONOPMMMM MMMMMMMPONNOPMMM MMMMMMMMPOONOPPM MMMMMMMMMPPONOOP MMMMMMMMMMMPONNO MMMMMMMMMMMMPONO MMMMMMMMMMMMMPON } # tile 71 (zap 4 -) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMPMM MMMMMPMMPMPPPBPP PMPPPBPPBPBBBNBB BPBBBNBBNBNNNBNN NBNNNBNNBNBBBPBB BNBBBPBBPBPPPMPP PBPPPMPPMPMMMMMM MPMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 72 (zap 4 |) { MMMMMMPBNBPMMMMM MMMMMMMPBNBPMMMM MMMMMMPBNBPMMMMM MMMMMMPBNBPMMMMM MMMMMMPBNBPMMMMM MMMMMPBNBPMMMMMM MMMMMMPBNBPMMMMM MMMMMMPBNBPMMMMM MMMMMPBNBPMMMMMM MMMMMMPBNBPMMMMM MMMMMPBNBPMMMMMM MMMMMPBNBPMMMMMM MMMMMPBNBPMMMMMM MMMMPBNBPMMMMMMM MMMMMPBNBPMMMMMM MMMMMPBNBPMMMMMM } # tile 73 (zap 4 /) { MMMMMMMMMMMMMPBN MMMMMMMMMMMMPBNB MMMMMMMMMMMPBNNB MMMMMMMMMPPBNBBP MMMMMMMMPBBNBPPM MMMMMMMPBNNBPMMM MMMMMMMPBNBPMMMM MMMMMMPBNBPMMMMM MMMMMPBNBPMMMMMM MMMMPBNBPMMMMMMM MMMPBNNBPMMMMMMM MPPBNBBPMMMMMMMM PBBNBPPMMMMMMMMM BNNBPMMMMMMMMMMM BNBPMMMMMMMMMMMM NBPMMMMMMMMMMMMM } # tile 74 (zap 4 \) { NBPMMMMMMMMMMMMM BNBPMMMMMMMMMMMM BNNBPMMMMMMMMMMM PPBNBPPMMMMMMMMM MMPBNBBPMMMMMMMM MMMPBNNBPMMMMMMM MMMMPBNBPMMMMMMM MMMMMPBNBPMMMMMM MMMMMMPBNBPMMMMM MMMMMMMPBNBPMMMM MMMMMMMPBNNBPMMM MMMMMMMMPBBNBPPM MMMMMMMMMPPBNBBP MMMMMMMMMMMPBNNB MMMMMMMMMMMMPBNB MMMMMMMMMMMMMPBN } # tile 75 (zap 5 -) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMBMM MMMMMBMMBMBBBPBB BMBBBPBBPBPPPAPP PBPPPAPPAPAAAPAA APAAAPAAPAPPPBPP PAPPPBPPBPBBBMBB BPBBBMBBMBMMMMMM MBMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 76 (zap 5 |) { MMMMMMBPAPBMMMMM MMMMMMMBPAPBMMMM MMMMMMBPAPBMMMMM MMMMMMBPAPBMMMMM MMMMMMBPAPBMMMMM MMMMMBPAPBMMMMMM MMMMMMBPAPBMMMMM MMMMMMBPAPBMMMMM MMMMMBPAPBMMMMMM MMMMMMBPAPBMMMMM MMMMMBPAPBMMMMMM MMMMMBPAPBMMMMMM MMMMMBPAPBMMMMMM MMMMBPAPBMMMMMMM MMMMMBPAPBMMMMMM MMMMMBPAPBMMMMMM } # tile 77 (zap 5 /) { MMMMMMMMMMMMMBPA MMMMMMMMMMMMBPAP MMMMMMMMMMMBPAAP MMMMMMMMMBBPAPPB MMMMMMMMBPPAPBBM MMMMMMMBPAAPBMMM MMMMMMMBPAPBMMMM MMMMMMBPAPBMMMMM MMMMMBPAPBMMMMMM MMMMBPAPBMMMMMMM MMMBPAAPBMMMMMMM MBBPAPPBMMMMMMMM BPPAPBBMMMMMMMMM PAAPBMMMMMMMMMMM PAPBMMMMMMMMMMMM APBMMMMMMMMMMMMM } # tile 78 (zap 5 \) { APBMMMMMMMMMMMMM PAPBMMMMMMMMMMMM PAAPBMMMMMMMMMMM BPPAPBBMMMMMMMMM MBBPAPPBMMMMMMMM MMMBPAAPBMMMMMMM MMMMBPAPBMMMMMMM MMMMMBPAPBMMMMMM MMMMMMBPAPBMMMMM MMMMMMMBPAPBMMMM MMMMMMMBPAAPBMMM MMMMMMMMBPPAPBBM MMMMMMMMMBBPAPPB MMMMMMMMMMMBPAAP MMMMMMMMMMMMBPAP MMMMMMMMMMMMMBPA } # tile 79 (zap 6 -) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMJMM MMMMMJMMJMJJJFJJ JMJJJFJJFJFFFNFF FJFFFNFFNFNNNFNN NFNNNFNNFNFFFJFF FNFFFJFFJFJJJMJJ JFJJJMJJMJMMMMMM MJMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 80 (zap 6 |) { MMMMMMJFNFJMMMMM MMMMMMMJFNFJMMMM MMMMMMJFNFJMMMMM MMMMMMJFNFJMMMMM MMMMMMJFNFJMMMMM MMMMMJFNFJMMMMMM MMMMMMJFNFJMMMMM MMMMMMJFNFJMMMMM MMMMMJFNFJMMMMMM MMMMMMJFNFJMMMMM MMMMMJFNFJMMMMMM MMMMMJFNFJMMMMMM MMMMMJFNFJMMMMMM MMMMJFNFJMMMMMMM MMMMMJFNFJMMMMMM MMMMMJFNFJMMMMMM } # tile 81 (zap 6 /) { MMMMMMMMMMMMMJFN MMMMMMMMMMMMJFNF MMMMMMMMMMMJFNNF MMMMMMMMMJJFNFFJ MMMMMMMMJFFNFJJM MMMMMMMJFNNFJMMM MMMMMMMJFNFJMMMM MMMMMMJFNFJMMMMM MMMMMJFNFJMMMMMM MMMMJFNFJMMMMMMM MMMJFNNFJMMMMMMM MJJFNFFJMMMMMMMM JFFNFJJMMMMMMMMM FNNFJMMMMMMMMMMM FNFJMMMMMMMMMMMM NFJMMMMMMMMMMMMM } # tile 82 (zap 6 \) { NFJMMMMMMMMMMMMM FNFJMMMMMMMMMMMM FNNFJMMMMMMMMMMM JFFNFJJMMMMMMMMM MJJFNFFJMMMMMMMM MMMJFNNFJMMMMMMM MMMMJFNFJMMMMMMM MMMMMJFNFJMMMMMM MMMMMMJFNFJMMMMM MMMMMMMJFNFJMMMM MMMMMMMJFNNFJMMM MMMMMMMMJFFNFJJM MMMMMMMMMJJFNFFJ MMMMMMMMMMMJFNNF MMMMMMMMMMMMJFNF MMMMMMMMMMMMMJFN } # tile 83 (zap 7 -) { MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMGMM MMMMMGMMGMGGGHGG GMGGGHGGHGHHHNHH HGHHHNHHNHNNNHNN NHNNNHNNHNHHHGHH HNHHHGHHGHGGGMGG GHGGGMGGMGMMMMMM MGMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM } # tile 84 (zap 7 |) { MMMMMMGHNHGMMMMM MMMMMMMGHNHGMMMM MMMMMMGHNHGMMMMM MMMMMMGHNHGMMMMM MMMMMMGHNHGMMMMM MMMMMGHNHGMMMMMM MMMMMMGHNHGMMMMM MMMMMMGHNHGMMMMM MMMMMGHNHGMMMMMM MMMMMMGHNHGMMMMM MMMMMGHNHGMMMMMM MMMMMGHNHGMMMMMM MMMMMGHNHGMMMMMM MMMMGHNHGMMMMMMM MMMMMGHNHGMMMMMM MMMMMGHNHGMMMMMM } # tile 85 (zap 7 /) { MMMMMMMMMMMMMGHN MMMMMMMMMMMMGHNH MMMMMMMMMMMGHNNH MMMMMMMMMGGHNHHG MMMMMMMMGHHNHGGM MMMMMMMGHNNHGMMM MMMMMMMGHNHGMMMM MMMMMMGHNHGMMMMM MMMMMGHNHGMMMMMM MMMMGHNHGMMMMMMM MMMGHNNHGMMMMMMM MGGHNHHGMMMMMMMM GHHNHGGMMMMMMMMM HNNHGMMMMMMMMMMM HNHGMMMMMMMMMMMM NHGMMMMMMMMMMMMM } # tile 86 (zap 7 \) { NHGMMMMMMMMMMMMM HNHGMMMMMMMMMMMM HNNHGMMMMMMMMMMM GHHNHGGMMMMMMMMM MGGHNHHGMMMMMMMM MMMGHNNHGMMMMMMM MMMMGHNHGMMMMMMM MMMMMGHNHGMMMMMM MMMMMMGHNHGMMMMM MMMMMMMGHNHGMMMM MMMMMMMGHNNHGMMM MMMMMMMMGHHNHGGM MMMMMMMMMGGHNHHG MMMMMMMMMMMGHNNH MMMMMMMMMMMMGHNH MMMMMMMMMMMMMGHN } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/share/other.map���������������������������������������������������������������0000664�0000764�0000764�00000021263�10545462320�015371� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������tile 0 "cmap, dark part of a room" tile 1 "cmap, wall, vertical" tile 2 "cmap, wall, horizontal" tile 3 "cmap, wall, top left corner" tile 4 "cmap, wall, top right corner" tile 5 "cmap, wall, bottom left corner" tile 6 "cmap, wall, bottom right corner" tile 7 "cmap, wall, crosswall" tile 8 "cmap, wall, tee up" tile 9 "cmap, wall, tee down" tile 10 "cmap, wall, tee left" tile 11 "cmap, wall, tee right" tile 12 "cmap, door, doorway" tile 13 "cmap, door, vertical open door" tile 14 "cmap, door, horizontal open door" tile 15 "cmap, door, vertical closed door" tile 16 "cmap, door, horizontal closed door" tile 17 "cmap, iron bars" tile 18 "cmap, tree" tile 19 "cmap, floor of a room" tile 20 "cmap, corridor" tile 21 "cmap, lit corridor" tile 22 "cmap, staircase up" tile 23 "cmap, staircase down" tile 24 "cmap, ladder up" tile 25 "cmap, ladder down" tile 26 "cmap, altar" tile 27 "cmap, grave" tile 28 "cmap, opulent throne" tile 29 "cmap, sink" tile 30 "cmap, toilet" tile 31 "cmap, fountain" tile 32 "cmap, pool" tile 33 "cmap, ice" tile 34 "cmap, molten lava" tile 35 "cmap, lowered drawbridge, vertical" tile 36 "cmap, lowered drawbridge, horizontal" tile 37 "cmap, raised drawbridge, vertical" tile 38 "cmap, raised drawbridge, horizontal" tile 39 "cmap, air" tile 40 "cmap, cloud" tile 41 "cmap, water" tile 42 "cmap, trap, arrow trap" tile 43 "cmap, trap, dart trap" tile 44 "cmap, trap, falling rock trap" tile 45 "cmap, trap, squeaky board" tile 46 "cmap, trap, bear trap" tile 47 "cmap, trap, land mine" tile 48 "cmap, trap, rolling boulder trap" tile 49 "cmap, trap, sleeping gas trap" tile 50 "cmap, trap, rust trap" tile 51 "cmap, trap, fire trap" tile 52 "cmap, trap, pit" tile 53 "cmap, trap, spiked pit" tile 54 "cmap, trap, hole" tile 55 "cmap, trap, trap door" tile 56 "cmap, trap, teleportation trap" tile 57 "cmap, trap, level teleporter" tile 58 "cmap, trap, magic portal" tile 59 "cmap, trap, web" tile 60 "cmap, trap, statue trap" tile 61 "cmap, trap, magic trap" tile 62 "cmap, trap, anti-magic field" tile 63 "cmap, trap, polymorph trap" tile 64 "cmap, effect, vertical beam" tile 65 "cmap, effect, horizontal beam" tile 66 "cmap, effect, left slant beam" tile 67 "cmap, effect, right slant beam" tile 68 "cmap, effect, dig beam" tile 69 "cmap, effect, camera flash" tile 70 "cmap, effect, thrown boomerang, open left" tile 71 "cmap, effect, thrown boomerang, open right" tile 72 "cmap, effect, magic shield 1" tile 73 "cmap, effect, magic shield 2" tile 74 "cmap, effect, magic shield 3" tile 75 "cmap, effect, magic shield 4" tile 76 "cmap, swallow, top left / monster, *, swallow, top left" tile 77 "cmap, swallow, top center / monster, *, swallow, top center" tile 78 "cmap, swallow, top right / monster, *, swallow, top right" tile 79 "cmap, swallow, middle left / monster, *, swallow, middle left" tile 80 "cmap, swallow, middle right / monster, *, swallow, middle right" tile 81 "cmap, swallow, bottom left / monster, *, swallow, bottom left" tile 82 "cmap, swallow, bottom center / monster, *, swallow, bottom center" tile 83 "cmap, swallow, bottom right / monster, *, swallow, bottom right" tile 84 "explosion, dark, top left" tile 85 "explosion, dark, top center" tile 86 "explosion, dark, top right" tile 87 "explosion, dark, middle left" tile 88 "explosion, dark, middle center" tile 89 "explosion, dark, middle right" tile 90 "explosion, dark, bottom left" tile 91 "explosion, dark, bottom center" tile 92 "explosion, dark, bottom right" tile 93 "explosion, noxious, top left" tile 94 "explosion, noxious, top center" tile 95 "explosion, noxious, top right" tile 96 "explosion, noxious, middle left" tile 97 "explosion, noxious, middle center" tile 98 "explosion, noxious, middle right" tile 99 "explosion, noxious, bottom left" tile 100 "explosion, noxious, bottom center" tile 101 "explosion, noxious, bottom right" tile 102 "explosion, muddy, top left" tile 103 "explosion, muddy, top center" tile 104 "explosion, muddy, top right" tile 105 "explosion, muddy, middle left" tile 106 "explosion, muddy, middle center" tile 107 "explosion, muddy, middle right" tile 108 "explosion, muddy, bottom left" tile 109 "explosion, muddy, bottom center" tile 110 "explosion, muddy, bottom right" tile 111 "explosion, wet, top left" tile 112 "explosion, wet, top center" tile 113 "explosion, wet, top right" tile 114 "explosion, wet, middle left" tile 115 "explosion, wet, middle center" tile 116 "explosion, wet, middle right" tile 117 "explosion, wet, bottom left" tile 118 "explosion, wet, bottom center" tile 119 "explosion, wet, bottom right" tile 120 "explosion, magical, top left" tile 121 "explosion, magical, top center" tile 122 "explosion, magical, top right" tile 123 "explosion, magical, middle left" tile 124 "explosion, magical, middle center" tile 125 "explosion, magical, middle right" tile 126 "explosion, magical, bottom left" tile 127 "explosion, magical, bottom center" tile 128 "explosion, magical, bottom right" tile 129 "explosion, fiery, top left" tile 130 "explosion, fiery, top center" tile 131 "explosion, fiery, top right" tile 132 "explosion, fiery, middle left" tile 133 "explosion, fiery, middle center" tile 134 "explosion, fiery, middle right" tile 135 "explosion, fiery, bottom left" tile 136 "explosion, fiery, bottom center" tile 137 "explosion, fiery, bottom right" tile 138 "explosion, frosty, top left" tile 139 "explosion, frosty, top center" tile 140 "explosion, frosty, top right" tile 141 "explosion, frosty, middle left" tile 142 "explosion, frosty, middle center" tile 143 "explosion, frosty, middle right" tile 144 "explosion, frosty, bottom left" tile 145 "explosion, frosty, bottom center" tile 146 "explosion, frosty, bottom right" tile 147 "zap, magic missile, vertical" tile 148 "zap, magic missile, horizontal" tile 149 "zap, magic missile, left slant" tile 150 "zap, magic missile, right slant" tile 151 "zap, fire, vertical" tile 152 "zap, fire, horizontal" tile 153 "zap, fire, left slant" tile 154 "zap, fire, right slant" tile 155 "zap, cold, vertical" tile 156 "zap, cold, horizontal" tile 157 "zap, cold, left slant" tile 158 "zap, cold, right slant" tile 159 "zap, sleep, vertical" tile 160 "zap, sleep, horizontal" tile 161 "zap, sleep, left slant" tile 162 "zap, sleep, right slant" tile 163 "zap, death, vertical" tile 164 "zap, death, horizontal" tile 165 "zap, death, left slant" tile 166 "zap, death, right slant" tile 167 "zap, lightning, vertical" tile 168 "zap, lightning, horizontal" tile 169 "zap, lightning, left slant" tile 170 "zap, lightning, right slant" tile 171 "zap, poison gas, vertical" tile 172 "zap, poison gas, horizontal" tile 173 "zap, poison gas, left slant" tile 174 "zap, poison gas, right slant" tile 175 "zap, acid, vertical" tile 176 "zap, acid, horizontal" tile 177 "zap, acid, left slant" tile 178 "zap, acid, right slant" tile 179 "warning, 0" tile 180 "warning, 1" tile 181 "warning, 2" tile 182 "warning, 3" tile 183 "warning, 4" tile 184 "warning, 5" tile 185 "cmap, wall, vertical, mine" tile 186 "cmap, wall, horizontal, mine" tile 187 "cmap, wall, top left corner, mine" tile 188 "cmap, wall, top right corner, mine" tile 189 "cmap, wall, bottom left corner, mine" tile 190 "cmap, wall, bottom right corner, mine" tile 191 "cmap, wall, crosswall, mine" tile 192 "cmap, wall, tee up, mine" tile 193 "cmap, wall, tee down, mine" tile 194 "cmap, wall, tee left, mine" tile 195 "cmap, wall, tee right, mine" tile 196 "cmap, wall, vertical, gehennom" tile 197 "cmap, wall, horizontal, gehennom" tile 198 "cmap, wall, top left corner, gehennom" tile 199 "cmap, wall, top right corner, gehennom" tile 200 "cmap, wall, bottom left corner, gehennom" tile 201 "cmap, wall, bottom right corner, gehennom" tile 202 "cmap, wall, crosswall, gehennom" tile 203 "cmap, wall, tee up, gehennom" tile 204 "cmap, wall, tee down, gehennom" tile 205 "cmap, wall, tee left, gehennom" tile 206 "cmap, wall, tee right, gehennom" tile 207 "cmap, wall, vertical, knox" tile 208 "cmap, wall, horizontal, knox" tile 209 "cmap, wall, top left corner, knox" tile 210 "cmap, wall, top right corner, knox" tile 211 "cmap, wall, bottom left corner, knox" tile 212 "cmap, wall, bottom right corner, knox" tile 213 "cmap, wall, crosswall, knox" tile 214 "cmap, wall, tee up, knox" tile 215 "cmap, wall, tee down, knox" tile 216 "cmap, wall, tee left, knox" tile 217 "cmap, wall, tee right, knox" tile 218 "cmap, wall, vertical, sokoban" tile 219 "cmap, wall, horizontal, sokoban" tile 220 "cmap, wall, top left corner, sokoban" tile 221 "cmap, wall, top right corner, sokoban" tile 222 "cmap, wall, bottom left corner, sokoban" tile 223 "cmap, wall, bottom right corner, sokoban" tile 224 "cmap, wall, crosswall, sokoban" tile 225 "cmap, wall, tee up, sokoban" tile 226 "cmap, wall, tee down, sokoban" tile 227 "cmap, wall, tee left, sokoban" tile 228 "cmap, wall, tee right, sokoban" ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/share/tile.doc����������������������������������������������������������������0000664�0000764�0000764�00000021720�10545462320�015173� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Window ports can optionally make use of the tiles (pictures for NetHack symbols) found in this directory. They are distributed in a text format with routines to help in converting them to a system's preferred format and using them there. The original tiles were provided by Warwick Allison. The 32x32 tileset stored in mon32mi.txt, obj32mi.txt and oth32mi.txt and the Psuedo-3D tileset stored in mon3dmi.txt, obj3dmi.txt and oth3dmi.txt were created by a number of different people under the direction of Mitsuhiro Itakura (ita@gold.koma.jaeri.go.jp) who also holds the copyright on these tiles. The artists were: Mitsuhiro Itakura Haruko Numata Edger ZMYDaino Wan'ichi Tatsuya The 32x32 tileset stored in mon32alg.txt, obj32alg.txt and oth32alg.txt and the additional tiles stored in xxx32al2.txt (not used by all ports) were imported from AllegroHack, written by Kelly Youngblood (jry@pinn.net). The artists were: Kelly Youngblood Paul Pliska John Harris The 32x32 tileset stored in mon32aw.txt was contributed by Andrew Walker. Slash'EM specific high resolution tiles are stored in mon32se.txt, obj32se.txt and oth32se.txt. These override those found in other tilesets. Tiles which are not present in any other set are created from the 16x16 tiles. The tile distribution format for monsters.txt, objects.txt, and other.txt starts with a palette header like: A = (0, 0, 0) ... P = (254, 254, 254) and then each tile has an entry like: # tile 292 (comment identifying tile) { AAAAGHPAAAAACDAA AAAFGDEMLOCNAAAA ... } Tile sets which require more than 62 colors can use two character color keys, giving up to 4096 colors. All keys in any one file must be the same size. Each port can convert these .txt files to whatever format it wants the game executable to use, probably providing only one merged output file. See the tilemap.c discussion at the bottom for more hints on adding tiles. The palette.txt file contains the standard Slash'EM palette of 256 colors. It is duplicated in scripts/palette.ppm. Currently all the tilesets (16, 32 and 3d), after final merging, only use colors in this palette, even though the total number of unique colors mentioned in .txt files exceeds 350 (most are unused, and some are merely off-by-one versions of an existing color). Transparency is handled using (71, 108, 108) to represent the see-through parts of tiles. It is defined in include/tile.h as DEFAULT_BACKGROUND. This color has been chosen so that window interfaces that do not handle transparency will still look OK, especially new interfaces that may appear in vanilla NetHack. The color (72, 108, 108) should be used instead of (71, 108, 108) when an opaque color is required, for example: in the standard 32x32 floor tiles. Tools that handle tilesets should know the difference and not merge these two colors together, or indeed, should not remap any other color to (71, 108, 108). Note that the 16x16 tileset is supposed to be completely opaque. Tools that handle 16x16 tiles should treat (71, 108, 108) as transparent (i.e. as they normally would), but windowing interfaces should treat it as opaque. Shared code provided for conversion utilities: tile.h contains shared declarations. tiletext.c defines the external variables from tile.h and supplies the external routines for reading and writing the defined text format. Each conversion utility is expected to use tiletext.c and provide code of its own for reading and/or writing another format. The important global variables implement a colormap shared between tiletext.c and the other half of utilities. As an example of conversion utilities, we provide txt2ppm (tiletext.c + ppmwrite.c), xpm2txt (tiletext.c + xpmread.c) and gif2txt (tiletext.c + gifread.c). (Sorry, we're not paying Unisys patent royalties for the right to provide you with a gifwrite.c, which would necessarily use the LZW compression algorithm they claim.) The text I/O routines are: boolean fopen_text_file(const char *filename, const char *type); select file for subsequent tile I/O "type" a la fopen returns FALSE if file not opened, otherwise reads/writes header (including colormap) and sets up to decode/encode tiles int fclose_text_file(); close file boolean peek_text_tile_info(ttype, number, name); returns FALSE if no next tile in current file otherwise fills in the type, number and name of the next tile boolean read_text_tile_info(pixel[TILE_Y][TILE_X], ttype, number, name); returns FALSE if no next tile in current file otherwise TRUE and insert the tile in the provided array. The tile type, number and name are also filled in. The application program is responsible for checking these boolean read_text_tile(pixel[TILE_Y][TILE_X]); returns FALSE if no next tile in current file otherwise TRUE and insert the tile in the provided array. boolean write_text_tile_info(pixel[TILE_Y][TILE_X], ttype, number, name); writes tile with supplied type, number and name boolean write_text_tile(pixel[TILE_Y][TILE_X]); writes tile There are two additional shared routines provided for writers: void init_colormap(); initialize the output colormap from the input one must be called before opening output file as colormap is part of header void merge_colormap(); merge the current input colormap into the output one Due to the amount of state being kept, only one text or gif file can be open at a time. If you are combining multiple files into one other-format file with a single common colormap, you may need to open each source file and merge their colormaps into a common colormap before processing any tiles. Although there are expected to be only 256 colors in the distribution tiles, conversion programs should be prepared to accept up to MAXCOLORMAPSIZE colors and map them to a smaller number if their port requires it. The preferred set of 256 colors can be found in include/tilepal.h. Expected sequence for editing tiles: edit foo.txt -or- run txt2ppm foo.ppm foo.txt convert ppm to gif, either via ppmtogif from pbmplus/netpbm or stripping the first 15 bytes of foo.ppm (containing the size of the image) and feeding the rest to any raw-24bit- image-reading program edit tiles with gif-editing program run gif2txt foo.gif foo.txt When converted to ppm, monsters.ppm, objects.ppm, and other.ppm are: each a single ppm format (rgb triples with header) 20 tiles across, however many down (need "blank" tile to fill in extras on last row -- currently alternating pixels in first and second colors) allows looking at tiles en masse for comparison or whatever The gif reading routines accept further variations so long as the gif is n*TILE_X pixels across. The gif I/O routines are: boolean fopen_gif_file(const char *filename, const char *type); select file for subsequent tile I/O "type" a la fopen returns FALSE if file not opened, otherwise reads gif header (including colormap) and sets up to decode tiles int fclose_gif_file(); tear down decode mechanism close file boolean read_gif_tile(pixel[TILE_Y][TILE_X]); returns FALSE if no next tile in current file (including when any remaining tiles are "blank"), otherwise TRUE and insert the tile in the provided array The xpm I/O routines are: boolean fopen_xpm_file(const char *filename, const char *type); select file for subsequent tile I/O "type" a la fopen returns FALSE if file not opened, otherwise reads xpm file (including colormap) and sets up to decode tiles int fclose_xpm_file(); tear down decode mechanism release resources boolean read_xpm_tile(pixel[TILE_Y][TILE_X]); returns FALSE if no next tile in current file (including when any remaining tiles are "blank"), otherwise TRUE and insert the tile in the provided array Array provided by shared code for NetHack use, by compiling and running tilemap.c to form tile.c: short glyph2tile[MAXGLYPH]; maps glyph number to tile number for display purposes, assuming (non-blank) tiles are numbered sequentially through monsters/objects/other tilemap.c (shudder) accounts for things disappearing due to compilation options -- there should be a tile for everything appearing under any supported option, but under some options some tiles won't be referenced. Therefore, tilemap.c has the knowledge to provide the comments for xxx2txt and is compiled with TILETEXT to link in there, along with the various strings for things that are compiled in (monst.o etc.). If you add monsters/objects/other things to NetHack and need to add tiles to go with them, just add an entry in the right place in the appropriate .txt file, and one to tilemap.c if the new item is conditionally compiled. While the "comment identifying tile" in the .txt file must be correct, the number of the tile need not be, and can just be a duplicate of the tile on either side (or any other integer, for that matter). In an official release, the tiles in a .txt file will be numbered consecutively so that you may cross-reference with a graphics format, but the conversion code does not care about the numbering. (In fact, running txt2ppm, ppmtogif, and gif2txt gives you a consecutively numbered version of the .txt file.) ������������������������������������������������slashem-0.0.7E7F3/win/share/mon32al2.txt������������������������������������������������������������0000664�0000764�0000764�00000021221�10545462320�015641� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������__ = (0, 0, 0) _A = (128, 96, 0) _B = (128, 255, 128) _C = (0, 0, 192) _D = (168, 224, 224) _E = (96, 48, 48) _F = (128, 64, 0) _G = (32, 64, 64) _H = (0, 112, 224) _I = (192, 96, 96) _J = (48, 96, 0) _K = (117, 105, 88) _L = (224, 192, 160) _M = (168, 168, 224) _N = (128, 32, 0) _O = (96, 0, 48) _P = (64, 128, 128) _Q = (255, 128, 128) _R = (128, 0, 255) _S = (0, 64, 32) _T = (128, 0, 0) _U = (48, 48, 0) _V = (96, 192, 0) _W = (48, 36, 0) _X = (96, 192, 192) _Y = (0, 32, 32) _Z = (48, 24, 0) _a = (48, 12, 0) _b = (128, 112, 32) _c = (64, 64, 128) _d = (192, 0, 96) _e = (48, 0, 0) _f = (0, 0, 224) _g = (224, 224, 0) _h = (0, 128, 64) _i = (0, 255, 255) _j = (64, 0, 128) _k = (96, 96, 0) _l = (0, 255, 0) _m = (255, 0, 128) _n = (96, 96, 192) _o = (96, 72, 0) _p = (104, 84, 31) _q = (224, 168, 0) _r = (0, 64, 64) _s = (96, 48, 0) _t = (248, 224, 96) _u = (224, 224, 112) _v = (202, 143, 114) _w = (24, 48, 48) _x = (144, 192, 192) _y = (0, 192, 96) _z = (0, 32, 64) _0 = (96, 24, 0) _1 = (128, 128, 64) _2 = (24, 24, 48) _3 = (224, 112, 0) _4 = (240, 240, 240) _5 = (0, 48, 24) _6 = (128, 255, 255) _7 = (96, 0, 0) _8 = (128, 255, 0) _9 = (0, 0, 64) _$ = (96, 0, 192) A_ = (0, 145, 0) AA = (108, 255, 0) AB = (144, 144, 192) AC = (255, 192, 255) AD = (0, 24, 24) AE = (255, 192, 0) AF = (255, 192, 192) AG = (224, 224, 224) AH = (16, 16, 0) AI = (128, 64, 64) AJ = (224, 56, 0) AK = (170, 136, 52) AL = (16, 0, 0) AM = (224, 112, 112) AN = (0, 96, 96) AO = (208, 208, 208) AP = (64, 128, 0) AQ = (255, 128, 255) AR = (255, 128, 0) AS = (224, 168, 224) AT = (224, 0, 0) AU = (128, 0, 64) AV = (255, 108, 0) AW = (192, 192, 255) AX = (192, 192, 0) AY = (0, 48, 96) AZ = (255, 255, 128) Aa = (192, 192, 192) Ab = (168, 224, 168) Ac = (128, 128, 96) Ad = (112, 224, 0) Ae = (64, 64, 0) Af = (127, 90, 72) Ag = (224, 112, 224) Ah = (48, 48, 24) Ai = (255, 64, 0) Aj = (64, 48, 0) Ak = (192, 144, 0) Al = (176, 176, 176) Am = (0, 0, 96) An = (128, 96, 96) Ao = (192, 144, 192) Ap = (48, 24, 24) Aq = (64, 32, 0) Ar = (224, 0, 112) As = (24, 48, 0) At = (0, 128, 128) Au = (64, 16, 0) Av = (144, 192, 144) Aw = (160, 160, 160) Ax = (64, 0, 0) Ay = (192, 96, 0) Az = (255, 0, 255) A0 = (24, 24, 0) A1 = (255, 0, 0) A2 = (192, 96, 192) A3 = (112, 224, 112) A4 = (48, 96, 96) A5 = (145, 71, 0) A6 = (0, 16, 16) A7 = (120, 160, 160) A8 = (24, 0, 0) A9 = (0, 0, 16) A$ = (182, 71, 0) B_ = (160, 160, 120) BA = (160, 120, 160) BB = (144, 144, 144) BC = (0, 64, 128) BD = (192, 48, 0) BE = (80, 160, 160) BF = (224, 0, 224) BG = (48, 48, 96) BH = (120, 160, 120) BI = (120, 120, 160) BJ = (96, 192, 96) BK = (160, 160, 80) BL = (160, 120, 120) BM = (160, 80, 160) BN = (128, 128, 128) BO = (0, 96, 48) BP = (64, 64, 32) BQ = (112, 224, 224) BR = (192, 0, 0) BS = (192, 0, 192) BT = (0, 160, 160) BU = (0, 0, 128) BV = (71, 108, 108) BW = (128, 96, 128) BX = (112, 112, 112) BY = (64, 32, 32) BZ = (80, 160, 80) Ba = (80, 80, 160) Bb = (96, 128, 96) Bc = (0, 48, 48) Bd = (192, 192, 144) Be = (32, 64, 0) Bf = (128, 64, 128) Bg = (160, 160, 0) Bh = (160, 80, 80) Bi = (64, 0, 32) Bj = (160, 0, 160) Bk = (96, 96, 96) Bl = (252, 252, 153) Bm = (32, 32, 0) Bn = (0, 160, 80) Bo = (64, 128, 64) Bp = (160, 120, 0) Bq = (0, 0, 48) Br = (0, 80, 160) Bs = (192, 144, 144) Bt = (0, 224, 0) Bu = (80, 160, 0) Bv = (112, 112, 224) Bw = (80, 80, 80) Bx = (32, 0, 0) By = (128, 0, 128) Bz = (80, 0, 160) B0 = (255, 255, 255) B1 = (96, 48, 96) B2 = (242, 196, 77) B3 = (208, 168, 80) B4 = (255, 255, 0) B5 = (255, 255, 192) B6 = (0, 192, 0) B7 = (160, 80, 0) B8 = (0, 182, 255) B9 = (160, 0, 80) B$ = (0, 192, 192) C_ = (165, 118, 94) CA = (48, 96, 48) CB = (64, 64, 64) CC = (192, 160, 64) CD = (218, 218, 182) CE = (224, 224, 168) CF = (0, 160, 0) CG = (96, 0, 96) CH = (160, 40, 0) CI = (0, 0, 160) CJ = (0, 224, 112) CK = (64, 32, 64) CL = (0, 128, 255) CM = (0, 128, 0) CN = (96, 128, 128) CO = (48, 48, 48) CP = (229, 162, 130) CQ = (32, 64, 32) CR = (192, 255, 255) CS = (171, 154, 129) CT = (160, 0, 0) CU = (224, 168, 168) CV = (145, 135, 110) CW = (64, 0, 64) CX = (192, 255, 192) CY = (112, 0, 224) CZ = (0, 96, 0) Ca = (96, 96, 128) Cb = (0, 255, 128) Cc = (0, 96, 192) Cd = (24, 48, 24) Ce = (255, 211, 175) Cf = (32, 32, 32) Cg = (0, 64, 0) Ch = (0, 224, 224) Ci = (32, 0, 32) Cj = (0, 48, 0) Ck = (192, 192, 96) Cl = (16, 16, 16) Cm = (128, 128, 255) Cn = (0, 32, 0) Co = (128, 128, 0) Cp = (255, 182, 145) Cq = (16, 0, 16) Cr = (0, 24, 0) Cs = (96, 96, 48) Ct = (108, 145, 182) Cu = (0, 16, 0) Cv = (0, 0, 255) # tile 343 (priest) { AzAzAzAzAzAzAzAzAzAzAzAzAzAzB0B4B4AzAzAzAzAzAzAzAzAzAzAzAzAzAzAz AzAzAzAzAzAzAzAzAzAzAzAzAzAXCHA5CHAXAzAzAzAzAzAzAzB0CCAzAzAzAzAz AzAzAzAzAzAzAzAzAzAzAzAzAzCHAVAiB7CHAXAzAzAzAzAzAzB4CCAzAzAzAzAz AzAzAzAzAzAzAzAzAzAzAzAzAzAVAiAVAiB7CHAzAzAzAzAzAzAXCCAzAzAzAzAz AzAzAzAzAzAzAzAzAzAzAzAzAzAiAVAiAVCHCHBwAzAzAzAzB0B4B4CCAzAzAzAz AzAzAzAzAzAzAzAzAzAzAzAzCBAVB4B4AVCHA5BwBwAzB4AXB0AXB4AXAXCCAzAz AzAzAzAzAzAzAzAzAzAzAzAzCBB4B0B4B4AXAXBwCBAzCCCCB4B4AXCCCCCCAzAz AzAzAzAzAzAzAzAzAzAzAzCOCBCp___v__Cp_vBwBwBwAzAzAzAXCCCCAzAzAzAz AzAzAzAzAzAzAzAzAzAzAzCOCBCeCeCpCpCp_vCBBwCBAzAzAzAXCCAzAzAzAzAz AzAzAzAzAzAzAzAzAzAzAzCOCBCpCpCpCp_vCOCBBwBwAzAzAzB4CCAzAzAzAzAz AzAzAzAzAzAzAzAzAzAzAzCOCBBwCpCpCpCOCBBwCBCHCHAzAzAXCCAzAzAzAzAz AzAzAzAzAzAzAzAz_FAzAzAzCOBwCBBwCOCBCBBwB7CHB7CHAzB4CCAzAzAzAzAz AzAzAzAzAzAzAzB7AG_FAzCOAiCOBwCOCBBwBwCHCHB7CHBkBwCeCeCpAzAzAzAz AzAzAzAzAzAzB7B0_F_FCOAiB7CHCOCOBwBwBwCHAVCHBkBkBwCpCeCpAzAzAzAz AzAzAzAzAzB7B0B7B7_FCOA5CHCOCOCBBwBwB7AiAVCHBkBwBw_vCp_vAzAzAzAz AzAzAzAzAzAzB7B7B7COAiA$CHCOCBBwBwBwAiAVCHBkBkBkBwAX_vAzAzAzAzAz AzAzAzAzAzAzAzB7B7COA5CHCOCOCBBwBwBwAVAiCHBkBwBwBkAXCCAzAzAzAzAz AzAzAzAzAzAzAzCeB7COA$CHCOCBBwBwBwBwAiAVA5BkBkBwBwB4CCAzAzAzAzAz AzAzAzAzAzAzAzCe_vCOCHA5COCBBwBwCBBwAiAVCHBkBwBwBNB4CCAzAzAzAzAz AzAzAzAzAzAzAzAzAzCOCHCHCOCBBwCBBwBwAiAVCHBwBwBkBNB4CCAzAzAzAzAz AzAzAzAzAzAzAzAzAzCOA5CHCOCBBwBwBwCBAVAiB7BwBkBwBNB4CCAzAzAzAzAz AzAzAzAzAzAzAzAzAzCOA$CHCOCBBwCBBwBwAiAVCHBwBwBNBNAXCCAzAzAzAzAz AzAzAzAzAzAzAzAzAzCOAXAXCOCBBwBwCBBwB4B4AXBkBwBNBNAXCCAzAzAzAzAz AzAzAzAzAzAzAzAzAzCOCBCBCOCBCBBwBwBwBwBkBwBwBwBNAzAXCCAzAzAzAzAz AzAzAzAzAzAzAzAzAzCOCBCBCOCBBwBwBwCBBwBwBwBkBwAzAzAXCCAzAzAzAzAz AzAzAzAzAzAzAzAzAzAzCBCBCBCBBwBwCBBwBwBwBkBwBwAzAzAXCCAzAzAzAzAz AzAzAzAzAzAzAzAzAzAzCBCBCBCHBwBwBwBwCBBwBwBwBk____AXCCAzAzAzAzAz AzAzAzAzAzAzAzAzAzAzAzCBCBB7CHBwBwBwBwCBBkBwBw____CCCC__AzAzAzAz AzAzAzAzAzAzAzAzAzAzAzAzCBAiB7CHBwCBBwBwBwBwBk____AXCC______AzAz AzAzAzAzAzAzAzAzAzAzAz____AVCHCHA5CHBwCBBkBw______B4CC__AzAzAzAz AzAzAzAzAzAzAzAzAzAz____CHCHB7CHA$CHA5CHCHB7________AzAzAzAzAzAz AzAzAzAzAzAzAzAzAzAzAzAz________________________AzAzAzAzAzAzAzAz } # tile 344 (priestess) { AzAzAzAzAzAzAzAzAzAzAzAzAzBwCOCOCBBwA$CH_FAzAzAzAzAzAzAzAzAzAzAz AzAzAzAzAzAzB0CCAzAzAzAzBwCOCOCOCOCBBkA$CH_NAzAzAzAzAzAzAzAzAzAz AzAzAzAzAzAzB4CCAzAzAzAzCBCOCOCOCOCBBwA$A$_NAzAzAzAzAzAzAzAzAzAz AzAzAzAzAzAzAXCCAzAzAzAzCBCOCOCOCOCBBkA$CH_FAzAzAzAzAzAzAzAzAzAz AzAzAzAzAzB0B4B4CCAzAzAzAzCBC_C__ABwBDCH_F_NAzAzAzAzAzAzAzAzAzAz AzAzAzB4AXB0AXB4AXAXCCAzAz_oCeCpCPC__o_A_o_NAzAzAzAzAzAzAzAzAzAz AzAzAzCCCCB4B4AXCCCCCCAzAzCeCOCpCOCPC__A_AAzAzAzAzAzAzAzAzAzAzAz AzAzAzAzAzAzAXCCCCAzAzAzAzCeCpCpCpCP_v_AAK_oAzAzAzAzAzAzAzAzAzAz AzAzAzAzAzAzAXCCAzAzAzAzAz_ACp_FCPCPC__oAK_AAzAzAzAzAzAzAzAzAzAz AzAzAzAzAzAzB4CCAzAzAzAzAz_o_ACPCPC__o_o_AAK_oAzAzAzAzAzAzAzAzAz AzAzAzAzAzAzAXCCAzAzAzAzAzAzBwCBCBBwBk_A_AAK_A_oAzAzAzAzAzAzAzAz AzAzAzAzAzAzB4CCAzAzAzAzAzBwCBCOCBCBBwBkAiA$_A_o_oAzAzAzAzAzAzAz AzAzAzAzAzCpCpCPAzAzAzCOAiBwCOCOCOCBBwAVA$COBw_A_oAzAzAzAzAzAzAz AzAzAzAzAzCpCpCPAiA$COCOA$AVBwCOCBCBA$BDCOCOCBBw_A_oAzAzAzAzAzAz AzAzAzAzAzCpCP_vAVBDCOCBCBBDAiAVAiA$BDA$COCOCBBw_A_oAzAzAzAzAzAz AzAzAzAzAzAzAXA$A$CHCBBwBwA$A$A$A$BDA5CHBwCBBwBk_A_oAzAzAzAzAzAz AzAzAzAzAzAzAXCCCHB7CHBwBwAuBDA$AJA5CH_ABkA$CH_N_A_oAzAzAzAzAzAz AzAzAzAzAzAzB4CCAzAzAzAz_o_oCBCOCOCBB7CH_AAVA$CH_o_aAzAzAzAzAzAz AzAzAzAzAzAzB4CCAzAzAzAz_oA$BDAVAiA$CHCHCHAVCH_F_a_aAzAzAzAzAzAz AzAzAzAzAzAzB4CCAzAzAzAzBDA$CBCOCOCBA$A$A5AiA$CH_aAzAzAzAzAzAzAz AzAzAzAzAzAzB4CCAzAzAzAzAVBDCOCOCOCOCHA$CHAVBD_FAzAzAzAzAzAzAzAz AzAzAzAzAzAzAXCCAzAzAzA$AiA$COCOCOCBCHA$CHCpCP_vAzAzAzAzAzAzAzAz AzAzAzAzAzAzAXCCAzAzAzAVAiAVCOCOCOCBA$CHB7CpCpCPAzAzAzAzAzAzAzAz AzAzAzAzAzAzAXCCAzAzAzAiAVAiCOCOCOCBCHA5CH_NCP_N____AzAzAzAzAzAz AzAzAzAzAzAzAXCCAzAzAVAiAVAiCOCBCOBwCHCHB7_N_F_N_F______AzAzAzAz AzAzAzAzAzAzAXCCAzAzAiAVAiA$COCBCOBwCHB7BDA5_N_N_N__________AzAz AzAzAzAzAzAzAXCCAzA$A$AiAVA$COCBCOBwCHCHA$BDA$_N_F_N________AzAz AzAzAzAzAzAzCCCCAzB4BDA$A$BDCOBwCOBwA5A$A$A$CH_F_NAX________AzAz AzAzAzAzAzAzAXCCAzCHB4B4BDA$COBwCOCBCHCHA$AJA5_gAX_N______AzAzAz AzAzAzAzAzAzB4CC____A5CHB4B4COCBCOBwAXB4B4B4_gCH_N________AzAzAz AzAzAzAzAzAzAz__________CHA5COBwCOBwCHA5CHCHA5CHCu____AzAzAzAzAz AzAzAzAzAzAzAzAzAz________________________________AzAzAzAzAzAzAz } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/share/tile2png.c��������������������������������������������������������������0000664�0000764�0000764�00000026333�10545462320�015444� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Copyright (C) Andrew Apted <ajapted@users.sourceforge.net> 2002 * Slash'EM Development Team 2003 * NetHack may be freely redistributed. See license for details. */ /* * Convert the given input tile files into the PNG file for use by * various windowing ports. * * Based on win/X11/tile2x11.c * * TODO HERE: * + Would be nice if it didn't use so much memory... */ #include "hack.h" #include "tile.h" /* N.H uses compress/uncompress, conflicting with ZLIB headers */ #undef compress #undef uncompress /* certain N.H #defines conflict with the SDL header files */ #undef red #undef green #undef blue #include <png.h> #include <assert.h> /* [AJA] Use this value instead of MAX_GLYPH, as MAX_GLYPH is much * greater than what we need (mainly due to the swallows), and * for the 48x64 tileset it would need to allocate almost 200 MB * of memory ! */ #define MAX_TILE_NUM 2048 #define OUTNAME "gltiles.png" /* Default output file name */ int ntiles = 0; int max_rows = -1; int saved_tile_x = -1; int saved_tile_y = -1; unsigned char *tile_bytes_rgba = NULL; unsigned char *tile_bytes_i = NULL; png_colorp tile_palette = NULL; int tile_palette_n = 0; int has_trans = 0; int num_across = TILES_PER_ROW; pixel trans_p = DEFAULT_BACKGROUND; /* -------------------------------------------------------------------- */ void save_png(const char *filename, int width, int height) { /* [AJA] all the volatiles here may seem strange. They are needed * because the ANSI C standard (which GCC adheres to) says * that when setjmp/longjmp is being used, only volatile local * variables are guaranteed to keep their state if longjmp() * gets called. */ FILE * volatile fp = NULL; png_bytep * volatile row_pointers = NULL; /* we take the address of these two, so we shouldn't need the * volatile. (GCC complains about discarding qualifiers if the * volatile is there). */ png_structp /* volatile */ png_ptr = NULL; png_infop /* volatile */ info_ptr = NULL; int row; /* open the file */ fp = fopen(filename, "wb"); if (fp == NULL) { fprintf(stderr, "tile2png: Can't open output file: %s\n", filename); goto failed; } png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if (png_ptr == NULL) { fprintf(stderr, "tile2png: PNG error (out of memory ?)\n"); goto failed; } info_ptr = png_create_info_struct(png_ptr); if (info_ptr == NULL) { fprintf(stderr, "tile2png: PNG error (out of memory ?)\n"); goto failed; } /* set error handling since we are using the setjmp/longjmp method * (this is the normal method of doing things with libpng). */ if (setjmp(png_ptr->jmpbuf)) { fprintf(stderr, "tile2png: Unknown problem while writing PNG.\n"); goto failed; } png_init_io(png_ptr, fp); png_set_compression_level(png_ptr, Z_BEST_COMPRESSION); png_set_IHDR(png_ptr, info_ptr, width, height, 8, tile_palette ? PNG_COLOR_TYPE_PALETTE : has_trans ? PNG_COLOR_TYPE_RGB_ALPHA : PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); if (tile_palette) { png_set_PLTE(png_ptr, info_ptr, tile_palette, tile_palette_n); if (has_trans) { png_byte trans = (png_byte)0; /* Colour zero is transparent */ png_set_tRNS(png_ptr, info_ptr, &trans, 1, NULL); } } png_write_info(png_ptr, info_ptr); row_pointers = (png_bytep *) malloc(height * sizeof(png_bytep)); if (!row_pointers) { fprintf(stderr, "tile2png: Out of memory.\n"); goto failed; } if (tile_palette) for (row = 0; row < height; row++) row_pointers[row] = tile_bytes_i + row * width; else for (row = 0; row < height; row++) row_pointers[row] = tile_bytes_rgba + row * width * (has_trans ? 4 : 3); png_write_image(png_ptr, row_pointers); png_write_end(png_ptr, info_ptr); free(row_pointers); /* clean up after the write, and free any memory allocated */ png_destroy_write_struct(&png_ptr, &info_ptr); fclose(fp); return; /* [AJA] Normally I don't like gotos. In this situation where there * are lots of points of possible failure and a growing set of * things to be undone, it makes for nicer code. */ failed: if (png_ptr) { /* assume NULLs not allowed (png docs don't say) */ if (info_ptr) png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL); else png_destroy_read_struct(&png_ptr, (png_infopp)NULL, (png_infopp)NULL); } if (row_pointers) free(row_pointers); if (fp) fclose(fp); } /* -------------------------------------------------------------------- */ /* Convert the tiles in the file to our RGBA format. */ static int convert_tiles(void) { unsigned char *tb; pixel tile[MAX_TILE_Y][MAX_TILE_X]; int x, y, i; int bx, by; int count = 0; int pix_w = (has_trans ? 4 : 3); int stride = tile_x * num_across * pix_w; while (read_text_tile(tile)) { count++; bx = ntiles % num_across; by = ntiles / num_across; tb = tile_bytes_rgba + (by * tile_y * stride + bx * tile_x * pix_w); for (y = 0; y < tile_y; y++, tb += stride) for (x = 0; x < tile_x; x++) { tb[x*pix_w + 0] = tile[y][x].r; tb[x*pix_w + 1] = tile[y][x].g; tb[x*pix_w + 2] = tile[y][x].b; if (has_trans) tb[x*pix_w + 3] = pixel_equal(tile[y][x], trans_p) ? 0 : 255; if (tile_palette) { for (i = tile_palette_n - 1; i >= 0; i--) { if (tile_palette[i].red == tile[y][x].r && tile_palette[i].green == tile[y][x].g && tile_palette[i].blue == tile[y][x].b) break; } if (i < 0) { if (tile_palette_n < 256) { i = tile_palette_n++; tile_palette[i].red = tile[y][x].r; tile_palette[i].green = tile[y][x].g; tile_palette[i].blue = tile[y][x].b; } else { free(tile_palette); tile_palette = NULL; free(tile_bytes_i); tile_bytes_i = NULL; } } } if (tile_bytes_i) tile_bytes_i[((by * tile_y + y) * num_across + bx) * tile_x + x] = i; } ntiles++; if (ntiles >= MAX_TILE_NUM) { fprintf(stderr, "tile2png: Too many tiles !!\n"); exit(1); } } return count; } /* Open the given file, read & merge the colormap, convert the tiles. */ static void process_file(const char *fname) { int count; if (!fopen_text_file(fname, RDTMODE)) { Fprintf(stderr, "tile2png: Can't open file \"%s\"\n", fname); exit(1); } if (!tile_bytes_rgba) { int size; /* * Delayed until we open the first input file so that * we know the size of the tiles we are processing. */ max_rows = (MAX_TILE_NUM + num_across - 1) / num_across; size = max_rows * num_across * tile_x * tile_y * (has_trans ? 4 : 3); tile_bytes_rgba = calloc(size, 1); if (!tile_bytes_rgba) { Fprintf(stderr, "tile2png: Not enough memory (%d KB).\n", size/1024); exit(1); } saved_tile_x = tile_x; saved_tile_y = tile_y; } if (!tile_bytes_i) { int size; max_rows = (MAX_TILE_NUM + num_across - 1) / num_across; size = max_rows * num_across * tile_x * tile_y; tile_bytes_i = calloc(size, 1); if (!tile_bytes_i) { Fprintf(stderr, "tile2png: Not enough memory (%d KB).\n", size/1024); exit(1); } saved_tile_x = tile_x; saved_tile_y = tile_y; } if (!tile_palette) { tile_palette = malloc(256 * sizeof(*tile_palette)); if (!tile_palette) { Fprintf(stderr, "tile2png: Not enough memory (%d bytes).\n", sizeof(*tile_palette)); exit(1); } /* [ALI} PNG encoding is more efficient if the transparent * colour is first in the palette, so add it here. This will * cause a slight inefficiency if the image data proves not * to contain any transparent pixels, but still seems the * best option. */ if (has_trans) { tile_palette_n = 1; tile_palette[0].red = trans_p.r; tile_palette[0].green = trans_p.g; tile_palette[0].blue = trans_p.b; } } count = convert_tiles(); Fprintf(stderr, "%s: %d tiles (%dx%d)\n", fname, count, tile_x, tile_y); fclose_text_file(); } static void usage(void) { Fprintf(stderr, "Usage: tile2png [-o out_file] [-t] [-f] [-a##] [-b######] " "txt_file1 [txt_file2 ...]\n"); fprintf(stderr, "Where: -t enables transparency\n"); fprintf(stderr, " -f is used for fonts\n"); fprintf(stderr, " -a gives the number of tiles across\n"); fprintf(stderr, " -b gives the background (transparent) color\n"); } int main(int argc, const char **argv) { int i, argn = 1; int num_down; const char *outname = OUTNAME; while (argn < argc) { if ((argv[argn][0] == '-' && argv[argn][1] == 'h') || (argv[argn][0] == '-' && argv[argn][1] == '-' && argv[argn][2] == 'h')) { usage(); exit(1); } if (argv[argn][0] == '-' && argv[argn][1] == 'o') { if (argv[argn][2]) outname = argv[argn] + 2; else if (argn + 1 < argc) outname = argv[++argn]; else { Fprintf(stderr, "tile2png: -o option needs an argument\n"); exit(EXIT_FAILURE); } argn++; continue; } if (argv[argn][0] == '-' && argv[argn][1] == 'a') { if (argv[argn][2]) num_across = atoi(argv[argn] + 2); else if (argn + 1 < argc) num_across = atoi(argv[++argn]); else { Fprintf(stderr, "tile2png: -a option needs an argument\n"); exit(EXIT_FAILURE); } if (num_across < 1) { Fprintf(stderr, "tile2png: bad value for -a option\n"); exit(EXIT_FAILURE); } argn++; continue; } if (argv[argn][0] == '-' && argv[argn][1] == 't') { has_trans = 1; argn++; continue; } if (argv[argn][0] == '-' && argv[argn][1] == 'f') { has_trans = 1; trans_p.r = trans_p.g = trans_p.b = 0; num_across = 16; argn++; continue; } if (argv[argn][0] == '-' && argv[argn][1] == 'b') { const char *val; int r, g, b; if (argv[argn][2]) val = argv[argn] + 2; else if (argn + 1 < argc) val = argv[++argn]; else { Fprintf(stderr, "tile2png: -b option needs an argument\n"); exit(EXIT_FAILURE); } if (sscanf(val, "%02X%02X%02X", &r, &g, &b) != 3) { Fprintf(stderr, "tile2png: Background not understood: %s\n", val); exit(EXIT_FAILURE); } trans_p.r = (unsigned char) r; trans_p.g = (unsigned char) g; trans_p.b = (unsigned char) b; argn++; continue; } break; } if (argn == argc) { usage(); exit(1); } for (i = argn; i < argc; i++) { process_file(argv[i]); } Fprintf(stderr, "Total tiles: %d\n", ntiles); num_down = (ntiles + num_across - 1) / num_across; save_png(outname, num_across * saved_tile_x, num_down * saved_tile_y); if (tile_bytes_rgba) { free(tile_bytes_rgba); tile_bytes_rgba = NULL; } if (tile_bytes_i) { free(tile_bytes_i); tile_bytes_i = NULL; } if (tile_palette) { free(tile_palette); tile_palette = NULL; } return 0; } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/share/oth32alg.txt������������������������������������������������������������0000664�0000764�0000764�00000121432�10545462320�015734� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������__ = (71, 108, 108) _A = (0, 0, 0) _B = (0, 0, 16) _C = (0, 0, 32) _D = (0, 0, 48) _E = (0, 0, 64) _F = (0, 0, 96) _G = (0, 0, 128) _H = (0, 0, 160) _I = (0, 0, 192) _J = (0, 0, 224) _K = (0, 0, 255) _L = (0, 16, 0) _M = (0, 16, 16) _N = (0, 24, 0) _O = (0, 24, 24) _P = (0, 24, 48) _Q = (0, 32, 0) _R = (0, 32, 32) _S = (0, 32, 64) _T = (0, 48, 0) _U = (0, 48, 24) _V = (0, 48, 48) _W = (0, 48, 96) _X = (0, 64, 0) _Y = (0, 64, 32) _Z = (0, 64, 64) _a = (0, 64, 128) _b = (0, 80, 160) _c = (0, 96, 0) _d = (0, 96, 48) _e = (0, 96, 96) _f = (0, 96, 192) _g = (0, 112, 224) _h = (0, 128, 0) _i = (0, 128, 64) _j = (0, 128, 128) _k = (0, 128, 255) _l = (0, 144, 0) _m = (0, 160, 0) _n = (0, 160, 80) _o = (0, 160, 160) _p = (0, 182, 255) _q = (0, 192, 0) _r = (0, 192, 96) _s = (0, 192, 192) _t = (0, 224, 0) _u = (0, 224, 112) _v = (0, 224, 224) _w = (0, 255, 0) _x = (0, 255, 128) _y = (0, 255, 255) _z = (16, 0, 0) _0 = (16, 0, 16) _1 = (16, 16, 0) _2 = (16, 16, 16) _3 = (16, 48, 48) _4 = (24, 0, 0) _5 = (24, 24, 0) _6 = (24, 24, 48) _7 = (24, 48, 0) _8 = (24, 48, 24) _9 = (24, 48, 48) _$ = (32, 0, 0) A_ = (32, 0, 32) AA = (32, 32, 0) AB = (32, 32, 32) AC = (32, 64, 0) AD = (32, 64, 32) AE = (32, 64, 64) AF = (32, 242, 186) AG = (48, 0, 0) AH = (48, 0, 48) AI = (48, 12, 0) AJ = (48, 24, 0) AK = (48, 24, 24) AL = (48, 36, 0) AM = (48, 48, 0) AN = (48, 48, 24) AO = (48, 48, 48) AP = (48, 48, 96) AQ = (48, 96, 0) AR = (48, 96, 48) AS = (48, 96, 96) AT = (64, 0, 0) AU = (64, 0, 32) AV = (64, 0, 64) AW = (64, 0, 128) AX = (64, 16, 0) AY = (64, 32, 0) AZ = (64, 32, 32) Aa = (64, 32, 64) Ab = (64, 48, 0) Ac = (64, 64, 0) Ad = (64, 64, 32) Ae = (64, 64, 64) Af = (64, 64, 128) Ag = (64, 128, 0) Ah = (64, 128, 64) Ai = (64, 128, 128) Aj = (72, 108, 108) Ak = (80, 0, 160) Al = (80, 80, 80) Am = (80, 80, 160) An = (80, 160, 0) Ao = (80, 160, 80) Ap = (80, 160, 160) Aq = (96, 0, 0) Ar = (96, 0, 48) As = (96, 0, 96) At = (96, 0, 192) Au = (96, 16, 0) Av = (96, 24, 0) Aw = (96, 48, 0) Ax = (96, 48, 48) Ay = (96, 48, 96) Az = (96, 72, 0) A0 = (96, 96, 0) A1 = (96, 96, 48) A2 = (96, 96, 96) A3 = (96, 96, 128) A4 = (96, 96, 192) A5 = (96, 128, 96) A6 = (96, 128, 128) A7 = (96, 192, 0) A8 = (96, 192, 96) A9 = (96, 192, 192) A$ = (96, 144, 178) B_ = (104, 84, 31) BA = (108, 144, 182) BB = (108, 255, 0) BC = (112, 0, 224) BD = (112, 112, 112) BE = (112, 112, 224) BF = (112, 160, 160) BG = (112, 224, 0) BH = (112, 224, 112) BI = (112, 224, 224) BJ = (117, 105, 88) BK = (120, 120, 160) BL = (120, 160, 120) BM = (120, 160, 160) BN = (128, 0, 0) BO = (128, 0, 64) BP = (128, 0, 128) BQ = (128, 0, 255) BR = (128, 32, 0) BS = (128, 64, 0) BT = (128, 64, 64) BU = (128, 64, 128) BV = (128, 90, 72) BW = (128, 96, 0) BX = (128, 96, 96) BY = (128, 96, 128) BZ = (128, 112, 32) Ba = (128, 128, 0) Bb = (128, 128, 64) Bc = (128, 128, 96) Bd = (128, 128, 128) Be = (128, 128, 255) Bf = (128, 255, 0) Bg = (128, 255, 128) Bh = (128, 255, 255) Bi = (144, 72, 0) Bj = (144, 135, 110) Bk = (144, 144, 144) Bl = (144, 144, 192) Bm = (144, 192, 144) Bn = (144, 192, 192) Bo = (160, 0, 0) Bp = (160, 0, 80) Bq = (160, 0, 160) Br = (160, 40, 0) Bs = (160, 80, 0) Bt = (160, 80, 80) Bu = (160, 80, 160) Bv = (160, 120, 0) Bw = (160, 120, 120) Bx = (160, 120, 160) By = (160, 160, 0) Bz = (160, 160, 80) B0 = (160, 160, 120) B1 = (160, 160, 160) B2 = (160, 160, 224) B3 = (165, 118, 96) B4 = (168, 168, 224) B5 = (168, 224, 168) B6 = (168, 224, 224) B7 = (170, 136, 52) B8 = (170, 154, 128) B9 = (176, 176, 176) B$ = (178, 64, 0) C_ = (178, 224, 16) CA = (182, 72, 0) CB = (192, 0, 0) CC = (192, 0, 96) CD = (192, 0, 192) CE = (192, 48, 0) CF = (192, 96, 0) CG = (192, 96, 96) CH = (192, 96, 192) CI = (192, 144, 0) CJ = (192, 144, 144) CK = (192, 144, 192) CL = (192, 160, 64) CM = (192, 192, 0) CN = (192, 192, 96) CO = (192, 192, 144) CP = (192, 192, 192) CQ = (192, 192, 255) CR = (192, 255, 192) CS = (192, 255, 255) CT = (202, 144, 114) CU = (208, 168, 80) CV = (208, 208, 208) CW = (210, 210, 178) CX = (218, 218, 182) CY = (224, 0, 0) CZ = (224, 0, 112) Ca = (224, 0, 224) Cb = (224, 56, 0) Cc = (224, 112, 0) Cd = (224, 112, 112) Ce = (224, 112, 224) Cf = (224, 168, 0) Cg = (224, 168, 168) Ch = (224, 168, 224) Ci = (224, 192, 160) Cj = (224, 224, 0) Ck = (224, 224, 112) Cl = (224, 224, 168) Cm = (224, 224, 224) Cn = (229, 162, 130) Co = (240, 240, 240) Cp = (242, 0, 0) Cq = (242, 96, 0) Cr = (242, 196, 77) Cs = (248, 224, 96) Ct = (252, 252, 153) Cu = (255, 0, 0) Cv = (255, 0, 128) Cw = (255, 0, 255) Cx = (255, 64, 0) Cy = (255, 108, 0) Cz = (255, 128, 0) C0 = (255, 128, 128) C1 = (255, 128, 255) C2 = (255, 182, 144) C3 = (255, 192, 0) C4 = (255, 192, 192) C5 = (255, 192, 255) C6 = (255, 211, 176) C7 = (255, 255, 0) C8 = (255, 255, 128) C9 = (255, 255, 192) C$ = (255, 255, 255) # tile 911 (explosion fiery 0) { CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw_ACwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw_A_2_A_2 CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw_ACwCwCwCwAOAlAEAe CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwAB_9CwABB_BVBTCA CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwAEAjAABTCECECECb CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw_ACw_9A3BTBiCECBCECE CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw_2AdAlASAlBTCECEBrCECE CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw_2A2BXA2A2ArBrBTBrCECE CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw_2AjAxBTA2BTAxBrCECbCE CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw_2BVBVAeAyBVCECECECbCx CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw_1BTBVAxAxBTCBCBCbCxCx CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw_zAKBTBVAxBRBOBrCbCECB CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwAdBVBVCAAxBrCYBpBo CwCwCwCwCwCwCwCwCwCw_ACwCwCwCw_ACwCwCw_ACwCwCwCwAEA6AlBOCBCECyCy CwCwCwCwCwCwCw_ACwCwCw_2AeAO_2CwCwCwCwCw_2AeAECwCwAEAlBrCbCxCUC3 CwCwCwCwCwCwCwCw_AAB_2AeBcBJ_2CwCwCwCwCwANBdA2_6_BA_BrCbCzC3C3C7 CwCwCwCwCwCwCwCw_2AlA2BVA2AE_2Cw_ACwCwCwABBVAxAyAPBOCECzC3C7C7C7 CwCwCwCwCwCwCwCw_2AjBVBVAx_RAeAlANCwCw_9AlBRCECbCYCYCbCdC7C7C8Cs CwCwCwCwCwCwCwCw_2A2AaAYAK_AAKBcAeCw_$BTBtCBCxCyCyCxCyCrCsCsCsCs CwCwCwCwCwCwCwCw_2Ae_2_A_A_A_AANAeABAxBrCECxCxCrCrCzCzCsC8CsC8C7 CwCwCwCwCwCwCwCwCw_z_A_A_A_A_A_A_6AjBJAxBoCxCzCzCsCsC2CsCrCrC8Cs CwCwCwCwCwCwCwCwCwCwCw_A_A_A_A_A_AAOAlBTBrCbCyCrCtCsC7CsC2CsC7C8 CwCwCwCwCwCwCwCwCwCwCwCw_1AB_9AO_1_AAeBTCBCECzCrC8CsC7CsC8C7C7Cs CwCwCwCwCwCwCwCwCwCwCwCw_2BVAjBXAx_2AeBRCBCbCzCrCrCrC6C8C7C3C2Cs CwCwCwCwCwCwCwCwCwCwCwCw_2A1BTAxAxAxBrCbCbCECdCyCzCsCsCrCrC3CrCr CwCwCwCwCwCwCwCwCwCwCwCwAKBVBTBTBTAxCECYCbCbCxCzCzC0CrCyCzCrCrCs CwCwCwCwCwCwCwCwCwCwCwCw_2AxAjA2BTBRBrBrCbCyCdCrCzCdCyCdCUCrC8C8 } # tile 912 (explosion fiery 1) { CwCwCwCwCwCw_2AlBJABCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCw_2AlBJABCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCw_M_2ANBVBVAO_A_2CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw _ACwCwCwAEA2B_BrAxAxA1Al_ACwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw Cw_RAeAeA2AlBTCEBrBTCABTAZAE_RCwAE_BCwCwCwCw_ACw_2AeABCwCwCwCwCw Cw_9BcBVBTBTBrBrBrCEBrCECABtAe_9A2Ae_R_9ABCwCwCw_zAl_2CwCwCwCwCw _AAZBTCEBRBrCYCECEBTCECBCbCEBTAjBVBVA2A2BV_2Cw_A_ACwCw_ACwCwCwCw AlAeBRBrBrCECECxCECBCECECYCEBTAlASAlBOBrBrAl_O_5Al_ACwCwCwCwCwCw BtBrBrBrCBCbCzCyCbBrBrCECECEBrBTBTBrBoCYCbBXAEAlAl_zCwCwCwCwCwCw BrCECbCYCbCcCzCyCbBTBOCEBrCECBCECECECECbCbBoAlBDAd_ACwCwCwCwCwCw BrCECbCbCxCbCECbCECECYCEBrBTCECECBCECYCxCbBoBOBVAl_zCwCwCwCwCwCw CECxCdCxCbCECECEBrCECbCbCECEBTBrCECbCyCcCBCEBRAlAlCwCwCwCwCwCw_A CbCxCxCbCbCbBpBrCECbCuCxCYBrAyAxCYCxCxCxCbCYCBBrAxAZAB_9AEAB_zCw CbCbCbCECbCxCbBoCbCxCbCxCxAyAPBrCbCxCGCxCxCxCxCuBoBTBTA2A3BJAB_M CbBpCACECECECbCbCYCyCyCbCEAyAxCBCuCyCdCzCdCUCxCxCYBoCEBrAxA2AjAl CbBrAxAyBOCBCxCyCdCzCzCyCxBTArCECuCzCsCrCrCrCrCdCyCYCYCEBTAxAxAx BpBRArArBoCbCxCdCzCzCrCyCYAxArCBCyCrCsC8CrCtCsC3CzCYCBCbCEBRCBCB CEBrCBCBCxCrCzCxCzCzCyCbBoAxBOCYCdCsC8C2CsCtC7C7CyCECBCbCbCBCbCb CyCbCxCyCrC2CsCzCrCUCxCbBNCBCuCyCzCsC8CsC8CsC2CrCzCyCbCYCbCYCxCx C3C3CzCsC7CsC8CsCsCrC0CxBoCbCxCrCsCsCsC8CsCsC8CsCrCrCzCxCyCyCyCz C7CsCsCtCsC7CtCsC8C8CsCyBoCcCrCsC8CtCsCtC2C8C8CtC8CrCrCzCzCrCzCy CsC2C8CsCsCtC6C8CsC8CsCUCBCcCsC8CtCtCtCtCtCtCtCtCtCsCrCrC0C3CrCx CrC7C7C8CsCtC8CtCsCsCsCrCxCdCsCsCsCtCtCtCtCtCsCsC8CsC6CsCrCrCzCz CrCrCsCsC2C8CtCtCtCtCsCrCdC3CsCtC8CtCtC8CsCtCtC2CsCtC7CsC8CzCUC3 CsC8CsC8CtCtC6CtCtC6CtCsCrCyCrCsC6CtCsC2C8CtCtC8CsC2C7CsCsCrCrCr CsC8CsCtC8C9C9C6CtCtC6CsCrCyCdCsCsCtCtC6C8CtC8CsC8CsC8CsCrCzCrCU CsC8CtCtC8CtC6CtCtCtC8CsCtCnCrCrCsCtCtC6CtCtCtCsCsC8CsCrCrCsCrCs C2C8CtC6CtC9C6CtC6CtCtC8CtCtCrCrCsC8CtC6C6C6CtCtC2CsCtCsCrCtCtCs CsC8C6CtC9C9C9C8C6CtC8C6CtCtCsCrCtCtC6CtCtC6CtC8C8CtC8C2C8CtCtCt CsC8C6C9C6C9C9C8CtC6C6CtC6CtCrCrCtCtC8CtC6CtCtC8CtC8C6CtC8CtCtC6 CsCtC6C9C9C9C6CtC6CtC6CtCtC8CrCrCsCtCtCtCtCtCtC6CtC6CtC6CtC6C6Ct C2C8C8CtC9C6CtC6C6C6CtCtCsC2CrCrC8C6CtCtCtCsC8CtC6CtC6CtCtCtC6Ct } # tile 913 (explosion fiery 2) { CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCw_A_A_A_ACwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCw_2A1AxBVAOCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwAOBVAdAeABCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw _2_2_2CwANA2CwCwCw_ACwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw AlASA2_1_6A2_ACwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw AlAlBtAx_V_OCwCwCw_ACwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw BrBrBrBV_9_AABAN_2CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CbCBAxBTAd_2AlBJAO_A_2_M_2_ACwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CbCbCBAlAiASAxAxAlASASASAlANCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CxCbBoBNBTBTBRBRBOBTAxBTBTB__9CwCw_ACwCwCwCwCwCwCwCwCwCwCwCwCwCw CxCbCBCBCYCbCYCECbCYCBCYCBCABTAB_MCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CbCbCbCbCxCyCxCxCxCxCxCxCxCEBoAj_9CwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CUCyCxCbCxCdCzCfCzCzCzCzCxCBArA3_RCw_ACwCwCwCwCwCwCwCwCwCwCwCwCw CrCrCrCdCyCyCrCrCrCrCzCzCxCEAxAlAP_OCwCwCwCwCwCwCwCwCwCwCwCwCwCw CrCrCzCrCzCUCdCzCyCzCzCzCyCbCEBrA2Ae_ACwCwCwCwCwCwCwCwCwCwCwCwCw CrCrCrCsCrCzCdCyCrCzCzCrCzCyCbCEAxBTAe_ACwCwCwCwCwCwCwCwCwCwCwCw CrCrCsCsCrCxCbCzCyCxCzCzCzCzCbCECBBsAlCwCwCwCwCwCwCwCwCwCwCwCwCw CtCsCtCrCUCxCBCcCxCbCzCcCcCxCEBrCEBTAx_9_AABABCwCwCwCw_ACwCwCwCw CsC8CsCrCzCbCECYCbCbCzCECECECECEBVAxBTAj_2ANAl_1_2_2_1CwCwCwCwCw CtCtCtCsCzCYCBBpCECxCzCbBoCBBTCEBRAlAjA2AB_AAKA2AlBJAOCwCwCwCwCw C8CtCsCrCzCxCbCbCbCzCzCcCbCBCBCECBA2AeAB_A_A_AAOAZAOABCwCwCwCwCw CtCtC2CrCzCzCyCbCyCzCrCrC0CyCbCbCEBiAx_O_A_ACwCwCwCwCw_ACwCwCwCw } # tile 914 (explosion fiery 3) { CwCwCwCwCwCwCwCwCwCw_A_ACwCwASAlBrCEBoCYCyCzCrC3CrCyCdCzCrCsCsC8 CwCwCwCwCwCwCw_ACwCwAeAOCwCw_BAZBTCYCbCbCbCyCzCzC2CsCrCdCrC8C2Cs CwCwCwCwCwCwCwCw_AABBJAeCwCwCwAXCbCxCxCECYCbCdCrCrCsCrCrCrCsC8C6 CwCwCwCwCwCwCwCw_1BJBJABCwCw_AAxCECxCbCbCECxCxCrCrCrCrCrCnCsC8C6 CwCwCwCwCwCwCwCw_2AlABCwCw_AAZAxBrCxCbCbCbCxCdCrCrC2CUCrCrCrCsCt CwCwCwCwCwCwCwCw_AAK_ACwCwCwAlBtBrCECbCxCxCbCyC0CrCrCrCrCsCsC2Cs CwCwCwCwCwCwCw_ACwCwCwCw_AABAeBrCYBtCYCGCxCxCzCrCrCrC2C8CsCsCsCs CwCwCwCwCwCwCwCwCw_2_2Cw_OAjBTBoCBCxCECbCxCxCrCrCrC2C8CsCsC2CtCs CwCwCwCwCwCw_ACw_AAlAS_2_OA3BTBrCbCxCYCyCzCdCzCsCsCsCtC2CrCsCsCt CwCwCwCwCwCwCw_OAxBtBVAB_AABAxCECbCxCbCxCzCrCnCsC2CsCtCtCsCsCtCt AB_A_2_2CwAB_AAOB3CABVAx_A_AAUCECuCxCxCdCrCsCsCsCsC8CtCtCtCsCtC6 A2_0AdAl_MAe_O_5BVB_AlA2Ax_1AUCYCxCUCrCsCtCsC8C2C8CsCtCtCsC8CtC6 Al_MAOBcAlAB_A_9Al_5AeA2AjASBRCYCxCrCrCsC8CsCsC8CsCtCtCtCtC6CtCt _9_A_2AOAO_A_A_A_O_zAlAl_9BXBOCbCzCrC8C8CsC6C8CsCsCsC8CsCtCtCsC8 CwCwCwCwCwCw_2AB_B_AAOAB_0AxCBCxCrCrCrCsCtC8CsC8C2C8C2CsCtC8C8C6 CwCwCwCwCwCwAdBDAS_z_A_6AyBNCbCzCzCrCrCrC8CsCsC8CsCsCtCtCtCtCtC6 CwCwCwCw_AAOBJBVAxAeAZAxBrBrCbCyCrCrCrCrC2CsCrCsCsCtCtCtCtC8CtC6 CwCwCwCw_1A2BXAxBSBtBrCECECYCxCrCrCrC2CsC8CsCrCsC8CsCtCtC8CtC6Ct CwCwCwCw_AAlBTAxCACECYCbCxCbCyCzCrCrCsC8CsCrCrCrCsCtCtCtCtC6C9C6 CwCwCwCw_AAxBTCECBCbCyCyCxCyCzCyC0CrCrCrCrCrCzCrCsCtC6C8CtC6C9C9 CwCwCw_OAeAxBrCbCxCyCyCyCyCzCxCxCUCrCrCrCrC3CrCrCrCtC8CtC6CtC8Ct CwCwCwABA3AyBrCbCbCzCxCxCrC3CGCxCxCyCzCzCyCrC2CrC2C8CtC8CtC6CtCt CwCwCwABBJAxBrCECbCzCbCcCrCrCzCyCbCxCzCzCyCdCsCsC8CtCtCtC6CtC6Ct CwCw_9AeAxBrCECbCyCbCbCyCzCrCrCbCbCzCyCdCyC3CrCsC8CtC6C8CtCtC8C6 CwCwAOBJBTCbCbCzCzCbCBCxCrC3CrCyCyCdCzCzCrCrCrCrC8C8CtC8CtCtCtC6 CwCwAEBVBtCECcCzCzCbBrCbCzCzCrCzCyCyCzCzCsC2CrCsCsCsC8C6CtCtC8C6 CwCwAEA2AxCbCYCFCzCbBpCECzCrCzCdCyCUCyCrCrCrC8C2C8C8C6CtCtC8CtC6 CwCw_BAOBVCECbCbCbCbCECxCrCzCrCzCzCrCzCrCrCrCrCsCsCsC8CtC6CtCtCt Cw_A_A_AAOAxCECbCBCECYCxCzCrCrCzCzCrCrCzCrCrCrCsC8CtCtCsC8CtCtC8 CwCw_ACwCwASBtCECEBrBoCECzCyCrCzCrC3CrCzCzCrCsC8C2CsC8C2C8C8C6Ct CwCwCwCw_AASA2BVBTAyAyBrCxCzCzCrCrCzCrCyCzCrC8CsC8CtC8CtCsC8CtC8 CwCwCwCw_AAB_2AOAS_DAaBrCbCzCrCzCrCrC0CyCyCrCsC8C8CtCsCsC8CtCtC6 } # tile 915 (explosion fiery 4) { CtC8CsCtCtC6CtC6CtC6CtCtCsCsCrC2C9C9CtCtCtCsCtC6CtC6CtC6CtC6C6Ct CsC8CsCtCtCtC6CtC6CtCtCtCsC2CrCsC6C9C9CtC6C8C8C9C9CtC6CtCtCtC6Ct CsCsCtCtC8C6CtCtCtC6CtCtC2CsCsC2CtC6C9CoCtC9C6CtC6C6CtCtCtC6CtCt CtCsCsC6CtCtCtC8C6CtC6C8C6C8C8C8CtCtC9C9CoC9CtC6C9C6CtC8CtCtCtCs C8CsC8C6CtCtCtCtCtC6CtC8CtCtCtCtC6C9C9C9C9C9C9C6C9C9CtCtCtCtCtC8 C2CsCtC6C8CsC6CsCsC8CtC6C9CtCsCtC9C9C9C9CoC9C9C9C6C9C6C8CsCsC6Ct CsCsC9C6C8C2C8CsC8C8CtC6C9C8C2CtC9CoC9C9C9C9C9C9C6CtCtCtCrCUCrC8 C8C8CtC6CtCtCtCsCtC6CtC8CtCtC6C9C9C9C9CoC9C9CoC9C9C9C9C2CrCUCrCt CtC6CtC6CtCtCtC6C6CtCtCtC6C6CtC6C9C9C9C9C9C9C9C9CoC9C9C2CrCrC2Ct C6CtC6C9C6CtC6CtCtC9C6C8CtCtC9C6C9CoC9C9CoC9CoC9C9C9C6C8CsCsC8Ct CtC6CtC9CtCtC6CtC6CtC9CtCtC9C6CtC9C9C9C9C9C9C9C9CoC9C9CsC6CtCtCt CtCtC6C6CtC8CtCtC6CtC6C2C8C6CtC6C6C9C9CoC9CoC9C9C9C9C9CtC2CkCtC9 C8CtC6CtCsC8C6C6C8C9C9C8C6CtC6CtC6CtC9C9C9C9C9CoC9C6C9C9C8CsC6C9 CtCtCtC6CtC8CtC6CtC6C9CtC9C9C9C6CtC6C9CoC9CoC9C9C9C9C9C6CtC8C8C9 CtC8CtC8CtC6C6CtCtC6C9C9C9C9C9C9C6C8CtC9C9C9C9C9C9C9C6CtC6C8C6Ct CtCtCtC8C6C9C9CtC9C9C9C9C6C9CoC9C9CtC8C9C9C6C9C9CoC9C9C9C8CrC8Ct CtC6C8CtC8C6CtC6C9C6C9C6C9C9C9C9CoC9C9C9C9C6C9C9C9C9C9C6C8C6C8Ct C6C6CtCtCtCtCtCtCtCtC6C9C9C9C9C9C9C9C9C9C9CtC9C9CoC9C6CtC8CtCtC6 CtC6CtC6CtC6C8C6C8C6CtC9C9CoC9C9C6C9CoC9C6C6C9C9C9C9CtCtCtCtC6Ct C6CtC9C6C8C6CtC6CtC6C9CoC9C9C9C9C6C9C9C6C8C6C9C9C6C6CtCtC6CtC6C9 C6CtC6C9CtCtCtCtC6C9C9C9C9C9C9C9C9C6C9C9C9C6CtC6CtCtC9C6CtC6CtC9 CtC6C9C9C6C6C8CtC9C9C9C9C9C9CoC9C9C9C9C9C9CtC6CtC8C6C9C9CtC6C9C9 C9C9C9C9C9CtC8CtC9C6C9C9CoC9C9C9C9C9C9C9C6C6CtC6C6CtC9C9CoC9C6Ct C9C9CoC9C6C6CtCsC6C9C9C9C9CtC6C9CoC9CoC9C9C9CtCtC9C9C6C9C9C9C9C9 C9C9C9C9CtCtC8C8C6C9CoC9C9C9C9C6CtC9C9C9C9C9CtC6C9C9C9C6C9C6C9C9 C9C9C6C9CtCtCtCtC9C9C9C9CoC9C9C9C6C9C9CoC9CtC6CtC6C9C9C9C6C9C9C9 CtC6CtC6C6C6CtCtCtCtC6C9C9C9CoC9C9C9C9C9C9C6CtC9C9C6C9C9C9C9C9C9 CtCtCtCtCtC6C6CtC8C9C9C9C9C9C9C9CoC9C9CoC9C9C2C9C9C6CtC6C9CoC9C9 CsCtCtC8CtC6CtCtC8C6C6C6C9CoC9C9C9C9C9C9C9C6CtC9C9C6CtC9C9C9C9C6 CtCsC6C6C8C9C9C8CtCtCtCtC9C9C9C6C9C9C9C6C9CtC9CoC9C6C9C9C9C9C9C9 CtC6CtC6CsC8CtCsCtCtCtC6CtC9C9C9C6C9C9C9C9C6C9C9C9C9C9C6C6C6CtC6 CtCtCtCtCtC8C8C2CsC8CtCtC6C6C6C9C9CoC9C9C9C9C9C6C9C9C9C9C9CtC6Ct } # tile 916 (explosion fiery 5) { CtC6C8CrCdCyCzCxCbCUCrCrCrCrCzCxCECBBTA2_OCwCwCwCwCwCwCwCwCwCwCw CtCtCsCrCrCrCzCdCyCUCrCrCrCrCrCxCxCYBrAx_zCw_ACwCwCwCwCwCwCwCwCw C8C8CsCsCsCrCrCzCUCrCUCrCrCrCzCxCbCBArBrAe_RCwCwCwCwCwCwCwCwCwCw CsCsCtCsCtCsCrCrCrCrC3C3CrCzCyCbCxCEBRBrBXAECwCwCwCwCwCwCwCwCwCw CsC2CtCtCtCsC2CsCtCsC7CrCrCxCbCzCzCyCYBoBVANCwCwCwCwCwCwCwCwCwCw CsC8C8CtCtC8CtC8CsCsCsCrCzCyCdCzCrCyCbCEBRAlAEAeAlABCwCwCwCwCwCw CtCtC9C6CtCtCtCsC8CsCsCrCzC3C7CrCzCxCYCEBrAyBDBJAl_5CwCwCwCwCwCw CtCtC9CtC6C6CtCtC8CrCrCzCzCrC7CrCzCyCbBTCEBRBTAl_ACw_ACwCwCwCwCw C6C8C6C9C9C6C8CtCtCrCrCzCzC3CzCzCzCrCyCBCEBTAxA2_1CwCwCwCwCwCwCw C6C9CtC6C6CtC8C2C8CrCrCrCzCdCrCzCrCzCyCbBRAxA2BJ_2CwCwCwCwCwCwCw C9C9C6CtC9C6CtC8CsCsCrCyCyCrCrCrCrC3CyCbCBAxAeAZ_LCwCwCwCwCwCwCw C9C9C6C9C9CtC6CsC8C2C3CdCyCzCrCrCrCrCzCxCuCYAZCwCwCwCwCwCwCwCwCw C9C6C9C9C6C6CtCtC8CsCrCyCdCyC0CsCtCrCzCrCxCbBTAe_BCw_ACwCwCwCwCw C9C6C9C9C6CtC6C6CtCrCrCyCdCyCrCrCsCtCsCrCzCuBrAiAe_A_A_ACwCwCwCw C9CtC9C9C9C6CtCtC8CrCyCxCyCdC3CrCrCsCsCrCzCbArASBJAe_zCwCwCwCwCw CtCoC9C6C9C9C6C8C2CzCdCxCxCzCzC2C7C3C3CrCyCEAK_AAlBJAeCwCwCwCwCw C9C6C9CtCtC6C8CrCzCdCyCxCbCGCrCsCrCrCrCyCbBTAZ_A_2AB_2CwCwCwCwCw C9CtC2CtC8CtCsCrCrCzCdCxCYCbCrC3CzCrCrCxCYCEAx_RCwCwCw_ACwCwCwCw CtC6CsCsCsCsC2CrCrCzCyCbCbCxCxCxCyCzCzCxCECBBTAl_MCwCwCwCwCwCwCw C9CtCsCrC2CsCsCsCrCrCdCxCECECxCxCxCxCxCECEBRBTAS_2CwCwCwCwCwCwCw C6C8CsC2CsCsC8C8CsCzCyCdCxCBBpCbBtCECECEBOBTAlAj_MCwCwCwCwCwCwCw C9C6C8CtCtC8C6CsCsCrCnCyCxCbBoCEBrBRBrBTAxBVA2Al_2CwCwCwCwCwCwCw C9C9CtCtCtCtC8C8CtCsCrCyCxCbCECYCBCBBOAxBVBVBJAl_2CwCwCwCwCwCwCw C6CtCtCtC6CtCtC6CtCsCrCzCrCUCxCxCbCYCEBoBRAlAjAl_2CwCwCwCwCwCwCw C6CtC6CtCtC8CtC8CsCsC2CrCzCrCzCdCyCyCxCEBrAxA2Al_2CwCwCwCwCwCwCw CtC6CtC6C8CtCtCsC8CsCrCdCyC3CrCzCrCzCyCxCEBoBTAS_2CwCwCwCwCwCwCw C9C6CtCtCtC2CsC8C2CrCyCzCrCrCrCzCzCrCzCxCBBrBTAl_2CwCwCwCwCwCwCw C6C9C6C8CtCtC8CsCsCzCrCzCrCzCrCzCrC3C3CbCYCbBrAy_0CwCwCwCwCwCwCw C9C9CtCtCtC8CsCrCnCrCrCrC3CrCrCrCrC3CjCyCbCbBTAy_LCwCwCwCwCwCwCw C6C9CtCtCsCsCzCzCrCsCrCsCsC7CsC7C3CrCyCyCbBrBTA2_2CwCwCwCwCwCwCw CtC9CtCsCrCzCbCdC7C7CrCrCrCsC7CrC3CxCxCxBoAxBDAj_2CwCwCwCwCwCwCw C6C9CtC2CzCxCxCrCrCrC7CsCsC7C3CrCrCxCbCbBTAOAB_2_ACwCwCwCwCwCwCw } # tile 917 (explosion fiery 6) { CwCwCwCwCwCwCw_9A2_AAOBTCYCyC3CzCzCrCzCyCdCzCsCsCsCsCsCsC8CtCtC6 CwCwCwCwCwCwCwANAe_AAeBTCBCbCyCzCzCyCyCyCzCzCrCrCrC2CrCsCsCsCtC6 CwCwCwCwCwCwCw_A_2CwCwAEBXCBCYCcCzCzCxCbCdCrCrCzCzCrCrC2C8CsC8Ct CwCwCwCwCwCw_ACwCwCwCw_B_9AxBTCECbCcCYCbCyC0CzCrCzCdCrCrCsCtCsCs CwCwCwCwCwCwCwCwCwCwCw_AAOAlAOArBoCEBTCYCxCrCdCrCrCzCrCrCrCsC8C8 CwCwCwCwCwCwCwCwCwCwCwAOBXA1_AAKBTBrASBoCxCzCrCrCdCUCrCzC7C7CsC6 CwCwCwCwCwCw_ACwCwCwCwCwAOA2_2_AAZAy_aBTCxCzCrCrC3CzCyCzCrCrCtC8 CwCwCwCwCwCwCw_2ANAOAO_1_AAE_2_A_OAyAjCBCuCyCrC3CdCbCYCxCyCrCsCs CwCwCwCwCwCwCwABBJBJBcAO_A_A_A_AABBJB_CECuCxCyCyCbBoBoCbCxCUCrC2 CwCwCwCwCwCwCwABBJBVBVAZ_A_A_A_AABBJAxBTCECbCbCbCYBNBOCECxCxCrCs CwCwCwCw_AAOAlAlBVAxBTAd_A_A_AABAlAlAxCBCbCxCECbBpAxBrBoCBCbCdCr CwCwCwCw_1A2AlAlA2BTBVAd_A_A_2AlBJA2AlBTCECbCBCbBrBTCACBCECbCxCr CwCwCwCw_AAE_1_1AlA2A2AB_A_2AlA2AlA2AlAiAyCECBCbCEBrBrCbCxCxCbCx CwCwCwCwCw_2_ACwABBJANCw_0A1AxAxA2BVAxAlAjAlBTBrCECECECECECYCxCb CwCwCwCwCwCwCwCwCwAB_ACwABBJBVBXAlANAxBXAiA3AxBTCYCECBCbCEBrCBCb CwCwCwCwCwCwCw_ACwCwCwCw_2AeAxAlAB_ABVAlAOAeBVBTBrCEBsBpBrBrBOCB CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw_1AlABCw_MAlAxBTBtBrAxBrBTAxBo CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw_A_2_ACwCw_1AxBTBVAxBTBXBVBTAx CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw_ACwCwAZBTBiBTBVAEAEBDBT CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwA1BVBRCEBV_5_BASBr CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwAeBXBTBrCEAZCw_zAx CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwAPBVCECECBATCw_zBT CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw_ACwCwAeA2BsCECEAZCw_AAN CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw_A_2AeBDAfBrBXABCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw_2AlBJAlAxAxA_CwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw_AANAlBrCEBT_1Cw_ACwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw_ACwCwAdCECEBJ_2CwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwAaBrBTAS_2CwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwAeBdBT_M_ACwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw_6AEABCwCw_ACwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw } # tile 918 (explosion fiery 7) { CtCtCtCtCtCtCtCsCsCtC8C8C6CtCtC6C9C9CtC6C9C9C6CtCtC9C9C9C9CtCtC6 CtC8CtC8CtCtC6CsCtCtCtCsCtC8C6CtC6CtC9C9CtC6CtC6CtC8CtC6C6CtCtC8 CtC8CsCtCtC6CtCtCtC9C9C8CtCtCtC6C9C9C9C9C6CtC6C8CtCtCtCtC8CtCsCs C8C2CsCtCtCtC6CtCtCtC6CtCsC8C8C9C9C6C9C9C9C9CtC8C8C2CtCsC8C8C8Cs CsCsC8CtCtC6CtC8CtC6CtCtC2C8CtCtC9C9C9C9C9C9C6C8CsC6CsCsCsC2CsCs CtCsCsCtC8CtC6CtC8C9C9C6CtCtCtCtCtC9C9C9C6C6CtCtCtCsC8CrCrCsCsC8 CsC8C2C8CtCtCtCtCtCtCtCtCtC8CtCtC8C6C9C9C6C8CtCtCtCsC8C2CrCrC2C8 CsC8CsCsCsC8CtC8C2C8CtCtCtCtC8C2CtCtC6C6CtC6CtCtCtCtCsCrCrCrCsC8 C8CsC8CsC2C8CtCtCsC8CtCtCtCtCsCsCtC6CtCtC6CtCtC8CtCtCtCrCzCyC2Cs CsC2CsC8CsC8CtCsCtCtCsC8C6C8CsC8CsC8CtC6CtC6CtC8C6CtC8CrCrCxCyCr CrCrCrC8CsC2C8CsCsCsCtCtCtCtCsCsC8CsCtCtCsC8CsCtCtCtC8CrCyCbCxCn CyCyCrCrCsC8CsC8C2CsCsCtCsCtCtCsC2CsC8CtCsC8CsCsC2C8C8CsCdCbCuCr CdCyCzCrCsCsCsC8CsC8C2CsCsCsCsC8CsCsC2CsCsCsCsC8CsCsC8CrCxCbCYCy CyCdCyCrC7CsCtCsC2C8CsC8C6CsCtCsCtCsCrCrCzCrCsCtCsC8CrCrCxCbCBCY CyCzCzCrC3CsCsC8C7C8CsC7C7C8CsCrCrCsCrCyCyC3CrCsC8CrCrCzCyCEBOCE CbCdCzCyCzCrCrCrC7CsCsC7C7CsCrCzCrCrC0CYCbC3C7CrCsCzCrCrCyCEBNBo CECxCxCdCxCxCzCzCrCrCrCtC2CrC3CrC3CzCyCBCBCyC3C7CrCrC3CzCyCbCBBo CBCbCxCxCYCBCxCxCxCyC3CrCrCrCrCzCzCrCyCYCECbCzCrCzCrCyCxCxCbBrBO BrCbCxCEBoAxBTCACECYCyCrCzCzCyCxCxCyCbBoBrCBCxCzC3CxCbCxCyBpAlBT CBCbCxCEBRAfASAeBOCBCxCxCyCxCYCbCECECBBoArBrCbCxCxCbCYCyCcBoA2Ax BTCECBCEBTAxAxAyBNCbCbCbCxCxCbCEBrBTBrCEBrBTBTCbCbCECbCxCbBrA2BT BTBoCECEBrBrCECECBCbCbCCCbCbBrBOCEBpBrCECEBoCECECbCbCbCxCbCEBTAx AlBTBTBTBrCECbCbCxCbCbCcCbCYBTAxCEBrCECbCbCbCbCECECbCxCxCbCBBTBT _9BJBTBRBTCECBCECbCECbCyCbCbBrAxAxAxBpCxCzCbCuCEBrBpCcCyCEBrASAx CwAKBrCECEBTCECEBpCECECbCEBOBTAlA2AlBrCYCxCbCECEBtCECbCECEBrA__9 _9AlBTBTCECECECECECECECECEBRAxBVA2BDA2BTBrBtBTBrBrCECECECEBTAOAS _9A2BTAxCECuCbCBCECbCbCEBTBTBVAlAeAEAPAEAaAOAlBTCECECbCbCEBsBDAl CwANBVBRBTCECbCECBCbCbCEBRBTA2AECwCwCwCwCwCw_WBYCYCbCyCcCEBrBVAB CwAOBVAxBTCABOBTCECxCbCBCEBTAZ_MCwCwCwCwCwCwAOBVCECxCECEBTBTAK_A CwANBXBVBJA3AlAyCACYCECEBoBtAZCwCwCwCwCwCwCwAeBtCECbBrCEBTAKCwCw Cw_2AeAeAeAPASASBTBrCEBTBTAlABCwCwCwCwCwCwCwABA1BTBTBTBTAbCwCw_A CwCwCwCwCwCwCw_AASAfBrBrA2ABCwCwCwCwCwCwCwCwCw_6AjAeBJAZCwCwCwCw } # tile 919 (explosion fiery 8) { CtC8CtCsCrCxC0CrCrCrC7CsCrC7CrCzCzCbBNAvAa_OCwCwCw_ACwCwCwCwCwCw CtCtC8CrC2CsCrCzCrCzCrC3CrCzCrCzCxCEAKCwCwCw_ACwCwCwCwCwCwCwCwCw CtCtCrCrCrCrCrCrC3CrCzCrCzCzCzCxCABVAeCwCwCwCwCwCwCwCwCwCwCwCwCw CsCtCsC2CrCrCrCrCzCyCyCrCrCzCbCbAxAlA2AO_2CwCwCwCwCwCwCwCwCwCwCw CsCsC8CsCsC8C8CzCdCzCrCzCzCxCbCEBOAaA1BJABCwCwCwCwCwCwCwCwCwCwCw C6CsCtC7C7CtCsCrCzCrCzCrCyCYCbCBCbCEAxAl_2CwCwCwCwCwCwCwCwCwCwCw C8CsCsCsC8CsCrCrCzCrCyCxCEBrCBCbCbCBBNBT_4CwCwCwCwCwCwCwCwCwCwCw CtCsCtCrCsC2C3C3CrCzCyCzCbBOCECbCxCbBrBT_1Cw_ACwCwCwCwCwCwCwCwCw CsCsC8CrCrCsCrC7CsCzCzCyCbCECECxCxCxCEBTAB_ACwCwCwCwCwCwCwCwCwCw C8C8C2CsCsC8CsC8CsCUCbCbCbCEBrCxCzCyBrAxBJAOCwCwCwCwCwCwCwCwCwCw C8C8CsC8C6CsC7CrCrCyCuCBBOBTCECbCbCEBTA2A3A2AOCwCwCwCwCwCwCwCwCw CsCsCsCsCsCsC7CrCzCxCbCEBRAxBRCEBrBRAaAEAEAeAOCwCwCwCwCwCwABAOAO C3CrCsCrC3C7C8CrCyCbCBCEBOBTBTBTBTBTAxCwCwCwCwCwCwCwCwCwCwAeBJAl CyCdCrCrC3CrC7C3CxCbCEBTBRAxBJBTAxBTAxCwCwCwCwCwCwCwCwCwCw_z_2_1 CxCrCzCrCrC3C3CrCzCyCEBRAyBJBDBTAxBVA1AeAlABCwCwCwCwCwCwCwCwCwCw CbCzCrCrC7C7C3CrCzCxBoBTAeAeAeAeBVBVBVAlAlABCwCwCwCwCwCwCwCwCwCw CECzC3CUC3C7C7C3CxCEArA2_9Cw_AASBVA2AECwCwCwCwCwCwCwCwCwCwCwCwCw CbCyCzCzCrCrC3CzCYBoAxAB_ACw_1A2B3Ae_BCwCwCwCwCwCwCwCwCwCwCwCwCw CYCxCyCzCyCyCbCYCEAxAKCwCwCw_AABAd_2CwCwCwCwCwCwCwCwCwCwCwCwCwCw CBCxCUCzCyCYCBBoBTASCwCw_A_ACwCwCwCw_ACwCwCwCwCwCwCwCwCwCwCwCwCw CECbCyCzCyCxCECEBXASCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CECbCyCzCbCBCECEAv_BCwCw_ACwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CECECzCyCBBTBTBtAZ_OAB_1CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw BrCbCyCbBNAaASAjA2A2BJ_2CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw BTCbCECbAv_0_AAeBJA2A2_2CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw BXBrCEBtAOCwCw_2AOANAB_zCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw AOAZBTAe_RCwCwCwCwCwCwCw_ACwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw _A_0AS_9CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw _A_A_2_ACwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw _ACwCwCw_ACwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw } # tile 940 (zap 5 0) { CwCwCwCwCwCwCwCwCwCwCw_o_pBIC$BI_p_oCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCw_gA9BIB6BIA9ApCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCw_o_pB6C$BI_p_gCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCw_gA9B6BIBIA9ApCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCw_o_pBhCoBI_p_gCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCw_gA9B6BIB6A9_oCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCw_o_pBIC$BI_pApCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCw_oBeBIB6BIA9_oCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCw_o_pBICoBI_pApCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwAp_pBIBIB6BIA9_oCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCw_o_k_p_pBICoBI_pApCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCw_gA9BhBIB4BIBhBe_oCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCw_o_pB6CoC$C$BI_p_oCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCw_gA9B6BIBIBIBIA9ApCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCw_o_pBhCoBI_p_p_p_gCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCw_gA9B6BIB6BIB6A9_oCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCw_o_pBICoC$C$BI_pApCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCw_oBeB6BIBIB6BIA9_oCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCw_o_p_p_pBICoBI_pApCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCw_gAp_oBeBIB6BIA9_oCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCw_o_pBICoBI_pApCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCw_gA9B6BIBhBe_oCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCw_o_pBhCoBI_p_oCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCw_oA9CQBIBhBEApCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCw_o_pBIC$BI_p_oCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCw_oBeBIB6BIA9ApCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCw_o_pBhC$BI_p_gCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCw_gA9BIB6BIA9_oCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwAp_pBICoB6_p_oCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCw_oBeBIBIBhBe_oCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCw_o_pB6CoBh_pApCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwAp_pBIC$BI_p_oCwCwCwCwCwCwCwCwCwCwCwCw } # tile 941 (zap 5 1) { CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw_oCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw_o_pApCwCwCwCwCwCwCwCwCwCw _oCwCwCwCwCwCwCwCwCwCwCw_oCwCwCwCwCw_oBeBIA9_oCwCwCwCwCw_oCwCwCw _pApCwCwCwCwCwCwCwCwCw_o_pApCwCwCw_o_pBhC$BI_pApCwCwCw_o_pApCwCw BIA9_oCwCwCwCwCwCwCw_oBeBIA9_oAp_gA9B6BIB6BIBIA9_oAp_gA9CQ_pAp_o C$BI_pApCwCwCwCwCw_o_pBhC$BI_p_p_pBIC$BI_pBICoBI_p_p_pBhCoBh_p_p B6BIBIA9_oCwCwCw_oBeBIB6BIBIB6BIBIBICQ_p_pB6CoBI_pBIBIBIBIB4BIBI _pBICoBI_pApCw_o_pBhC$BI_pBICoC$C$BI_p_p_pBIC$BI_pBICoB6_pBIC$C$ _oBeBIB6BIA9_gA9B6BIBIBe_oBeB6BIBhBe_oAp_gA9BIB4BIB6BIA9_gA9BIBI Cw_o_pBIC$BI_pBIC$BI_p_oCw_o_p_p_p_oCwCwCwAp_pBIC$BI_p_gCwAp_p_p CwCw_oBeBIB6BIB6BIA9ApCwCwCwAp_fApCwCwCwCwCw_gA9BIA9ApCwCwCwAp_o CwCwCw_o_pBIC$BI_p_gCwCwCwCwCwCwCwCwCwCwCwCwCwAp_p_gCwCwCwCwCwCw CwCwCwCw_oBeBIA9ApCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw_oCwCwCwCwCwCwCw CwCwCwCwCw_o_p_gCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwApCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw } # tile 942 (zap 5 2) { C$BI_p_oCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw BIBIB6A9_oCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw _pBIC$BI_pApCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw _pBIC$B6_p_k_oCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw _pBIC$BI_p_p_pApCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw _oBeBIBIB6BIBIA9_oCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw Cw_o_pBIC$C$C$BI_pApCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCw_oBeBIBIB6BIBIA9_oCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCw_o_p_p_pBICoBI_pApCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwAp_g_pB6CoB6_p_s_gAp_oCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCw_o_pBIC$BI_p_p_p_p_pApCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCw_gA9B6BIBIB6BIBIBIA9_oCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCw_o_pBICoC$C$C$C$BI_pApCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCw_oBeB6BIBIBIB4BIBIA9_oCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCw_o_p_p_p_p_pBIC$BI_pApCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwAp_oA4_s_pBICoBI_p_oCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCw_o_pB6C$BI_pA4CwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwAp_pBICoB6_p_oCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCw_o_pBIC$BI_p_oCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCw_oBeB6BIBhBe_oCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCw_o_pBIC$BI_pApCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw_gA9B6BIBIA9_oAp_gAp_oCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw_o_pBIC$BI_p_p_p_p_pApCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw_oBeBIB6BIBIBIBIBIA9_oCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw_o_pBICoC$C$C$C$BI_pApCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw_gA9B6BIBIBIB6BIBIA9_oAp CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw_g_p_p_p_p_pBICoBI_p_p CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwAp_oAp_g_pBIC$BI_p_p CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw_o_pB6CoB6_p_p CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw_oBeBIBIBIBI CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw_o_pB6C$C$ CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwAp_pBIC$C$ } # tile 943 (zap 5 3) { CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw_o_p_p_pBIC$C$ CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw_oAp_gA9BIBIB6BIBhBI CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw_o_p_p_pB6C$C$C$BI_p_p CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw_oBeBIB6BIBIBIBIBIA9_fAp CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw_o_pBhC$C$C$B6_p_p_pApCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw_oBeBIB6BIBIBIA9_oA4_oCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw_o_pBhC$BI_p_p_p_gCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwAp_k_pBICoB6_p_gApCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCw_o_p_p_pB6C$BI_p_oCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCw_gA9BIB6BICSC$BI_pApCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCw_o_pB6C$C$C$C$C$BI_p_fCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCw_gA9B6BIBIBIBIBIBIA9ApCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCw_o_pBhCoBI_p_p_p_p_p_gCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwAp_oAp_p_pBIC$B6_p_kAp_fApCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCw_o_p_p_p_p_pCQC$BI_pApCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCw_oBeBIBIBIB6BIBIBIA9_oCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCw_o_pBhC$C$CoC$C$BI_p_gCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwAp_pBIC$CQB6BIBIA9ApCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCw_o_pB6C$BI_p_p_p_gCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwAp_pBIC$BI_p_sCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCw_f_pBIC$BI_pA4CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwAp_s_pBIC$B6_p_oCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCw_o_p_p_pB6CoBI_pApCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCw_gA9B6BIBIBIBhBe_oCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw Cw_o_pBIC$C$C$BI_p_oCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw _gA9BIB6BIBIBIA9ApCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw _pB6C$BI_p_p_k_gCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw _pBICoB6_p_pApCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw _pBIC$BI_pAiCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw BIBIBhBe_oCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw C$BI_p_oCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CoBI_pApCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw } # tile 948 (zap 7 0) { CwCwCwCwCwCwCwB7CwByCwCwB7CNCNCLCNCwCNCLCNCwCwCwCNCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCNByCNByCNCaByCNCMCNCwByCwByCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCNCaBzByBzCwByBzBGB7ByCwBzCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwByBzByCwByBzByBzByBzByBzByByCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwByBzByCNCwByBzCNCNA7CNCwCNCwCwCNCwCwCwCwCwCwCw CwCwCwCwByCwCwCwCwCNByBzBGByBzByA7CMCNCwBzByCwByCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwByCwCwCNCNByBzCLBzByByCNCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCNCwBzCwCNCwByBzByCwCaBzCwByCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCNByCaCwCwCwByCNByBzCaCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwByCNCaCNCNCNCNByCwCwCwByCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwByCwBzCNByCwA7ByCNCwByBzCwCwCwByCwCwCwCwCwCwCwCwCw CwCwCwCwCwByCwCwCwByByCwBzByCNBGBzCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwByCNByBzCLByCwByCwCNCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwByCwCwByBzByBzCwByCNCMCNCwCNCwCwCwCwCwByCwCwCwCwCwCwCwCw CwCwCwCwCwCwByCNA7CwByCwBzBGBzByBzBGCwByCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwByCwCNBzByBzByCwCNCwCwByBzCNByCwCwCwCwCwCwCwCwCwCa CwCwCwCwCwCwCwCwByByCwByCwByCNByByCwBzCMCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwBzCNA7CNCNBzCwCwCwCNByCwCwBzByCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwByBzCwByBzByByByCNCwByCwBzCaCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwBzByCwCwCMBzByCLA7CwCNBzByCwByCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwBzCwCwCwByCwBzByA7CwCNCNA7CwCwCwByBzCwCwCwCwCwCwCwCw CwCwCwCwByCwCwCwCwByCNCwByCwCNCwByCwCLCwByCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCNCwCwByCwBzByCwBzByCwByCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwByCwCwByCNCwCwCwByByCNCNCwByCwBzByCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCaCwCNCwCwBzA7CNByBzCNCaCNCwByCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwBGBzByByCNCNByA7CNCwCwCNCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwByCwCwB7CNCNCaCNByCwCLCMCwCwCwCwCwCNCwCwCwCwCwCwCw CwCwCwCwCwBzByBzCwBzByCwByByBzByCwByBzCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwByCNCaBzCNCNCMBzByCwCwCwByCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwBzByCwCwByBGCNCwBzByCwByCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwByCNByCNBzCNA7CNByCNCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCaBzByCwCNCNByCNCMCNByCwA7CNCwByCNCwCwCwCwCwCwCwCwCwCw } # tile 949 (zap 7 1) { CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwB7CwCwCwCwCwCwCwB7CwCwCwCwCwB7CwByCwB7CwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwByCwCwCwCwCwCwCwByCwCwCwCwCwCwCwB7CwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwByCwCwCwCwCwBzCwCwCwCwCwCwByCwCwCwBy ByCwCNByCwCwCwCNCwCwByCwCwBzCNByCwCwByCwCwCwCwByCwCwByBzCwCwCwBz CwCNCwByCwCwCwCwCNCwCwCwCwByByCwBzByBzCNCaCwCNCNCwCwCwCwByBzCwCw BzByByBzByCLBzByByByBzByCwBzCwCNByCNCwByCwByCaCwCwCwCwByCNByByCN CwCNByCwBzBGCwCwCwCNCNByCwByByBzCaByBzByBzCNCwCwCNByBzByCwCwCNCM CwByBzByByB7CwCNCwCwByCaBzCwCwBzByCNBzByCwCwByCwCwByCNCwByCwBGBz ByCNCwBzCNByCNCaCwCNCwBzCMBzA7ByCwCNA7CLByBzCwByCwBzBfBzCNByCNCN CNCwByByCwA7CNCLCaCNByBzByCNByBzByByCLCaBzCaBzByBzByCwByCNBzByCN CNA7BzByBzByByByBzCNA7CNByCNByCwCNCwByCNByCNByCNByCNCNByCNCMCNCN CNCNByBzByBzBzByCNCMCNByCNCNBzCNByCwCNByCwCwCaCNCNCNByBzA7CwByBy CNCMBzByCNByByCwBGBzCwByBGCwByCwBGCwCwBzCNBGCLCaByA7CwCwB7ByCNCw CaCNBzA7CNCNBzCwB7CwByCwCwCNByCwCwCNByCaCNCwBzByBzByBzByCwBGBzBy CNCwCwByByCNA7ByCwCwBzCwByCwCwBzByBzCwByByByCwCwCNCNCNByCwCwCNCN CNByBzByCNCwCLCwCwCwCwCwCwCwByByCNCwByCwCwCwBzByCwCaCwCwCwByCaCw CMCwCwByCwByCNByCwByCwCwCNCwCwCNCaCwCwCwCwByCwByCNCwCwCwByCwCwBy CwByCwCwCNA7CwCwCwCwCwCwCwCwCwByCwByCwCwCwCwCwCwCwCNCwCwCwCwCwCN CwCwCwCwCwCwCwCwCwCwByCwCwCwCwCwCwBzCwCwByCwCwCwByCwCwCwCwCwCwCw CwCwCwCwCwByCwCwCwCwCwCwCwByCwCwCwCwCwCwBzCwCwCwCwCwCwCwCwCwCwCw CNCwCwCwCNCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCNCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw } # tile 950 (zap 7 2) { CwCNCwCwCNCwCwCwCNCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CNCwB7ByCaCNCwByCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CLCNCMCwCNByCNCwCwCwByCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCaBzCwByCwCwCwCwCwB7CwCNCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CNByCNCwCwCNCwCwCNByCNCaCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwByCaCNCNCaCNCwByCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCNCwCwCMBzCaByCwCwCwCwCNCwCwCwByCwCwB7CwCwCwCwCwCwCwCwCwCwCwCw CwCaCNCwBzCMBzCwCNByCNCwByCwCwByBzCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwByCwCwCNCwCwCNByCwByCNByCwCwB7CwCwCwCwCNCwCwCwCwCwCwCwCwCwCwCw CwCwCNCwCaCNByCwCaCNBzByCwByCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCNCaCMCwCwByBzByCwCwCwCNByBzCwByCwCNCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCNCwBGBzByBzByCNA7CNByByCNCwCaCwCwCwCwCwCwCwCwCwCwCwCwCw CaCwCwCwCNCwCNByCwCNCNCNCNByCwBzCaCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCaCwCwBzByCwA7CwByByCNBzByCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CaCwCwCwCwCwCNCMBzByCNCNByCNA7ByCwCNCwCNCwCNCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwCNCwCwCwByCwCwCwCNCNCNByCwCaCNCwByCwByCNCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwBzByBzByCwCNCMCwCwCNByCNByCwCwByCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwByCwByCNCNByCwByCwByCwCNCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwByCwCNCaCwBzCNCaByCwCwCwCNByCNCwCwByCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwBGByCNBzByCNA7CNByCwByCwB7CwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwByCwCNCwCwCwCNCNCNByCwBzCwCwCNCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCNCaCwByByBzByByCNByCaCNCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwByCwCNByCNCNCaCwByCwCwCwByCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCNByBzByBzCNByCwCNCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwByBzCaCNCaCwCNCaCwCwCwCN CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCaBzByCwCaCNCwBzByCNCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCNCwCwCwCwCwCNCaCNCwByCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCNCNCMByCwByCNCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwByByCwCwCwBzByCwCwBy CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwByCwCwCwCNCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwByCwCNBGCwCN CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwByCwCwBzCM } # tile 951 (zap 7 3) { CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCNCwCwCwCNCwCwCNCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwByCwCNCwB7ByCaCN CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwB7CwCwCwCNByCNCaCNCNCM CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCNCwByCwCwCwCwCwByCwByCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCNByCNCwCwCNCwCwCNByCN CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwByCaCNCaCNCNCwByCw CwCwCwCwCwCwCwCwCwCwCwCwB7CwCwByCwCwCwCNCaCwCwCwBzCwByCNCaCwCNCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwBzB7CwCwByCwCNByCNCwByCNByCwCNCwCw CwCwCwCwCwCwCwCwCwCwCwCNCwCwCwCwByCwCwBzCNByCwByCNCwCwCNCaCwByCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwByCwByByCNCwCwByCNCwCwCNCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCNCaByCwByBzCNCwCwCwA7BzByCwCwByCwCNCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCNBzByCNA7CNByBzByBzByCwCNCwCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwByCwByCNCNCNCMCwByCNCwCNCaCwCwCw CwCwCwCwCwCwCwCwCwCwCwCwCwCwCwBzByCNBzByCwA7CwByBzCwCwCwCwCwCwCw CwCwCwCwCwCwCwCwCwCwCNCwCLCwCNCaByBzCMBzCNCNByBzCNBfCwCwCwCwCwCw CwCwCwCwCwCwCwCNByCwByCaCNCwCwByCNCNCNCaCwCwByCwCwCwCNCwCwCwCwCw CwCwCwCwCwCwCwByCwCwBzCNByCNCwCwCNBfCwByBzByBzCwCwCwCwCwCwCwCwCw CwCwCwCwCwCwCwCNCwByCwByCwBGCMCNByCwBzCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCwB7CwCwCNByCNCwCwCwBzCwCNByCwCwCNCwByCwCwCwCwCwCwCwCwCw CwCwCwCwByCwByCwByCNByCNByBzCMBzByCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCwCwCNCwCwBzCwA7CNCNCNCaCwCwCNCwByCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCNCwByCNBzByByBzByCwCaCNCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwByCwCwCwByCwCwCNCNByCNCwByCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCNCwByCNByBzByA7CNCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CLCwCwCwCwCNCaCwCNCwByBzCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CaCNByBzCaCNCwCwByByCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwByCwCNCwCNCaCwCwCwCwCNCaCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCNByCwByByCNCNCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw BzCaCwBzBGCwCwCwByBzCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CwCwCNCwCwCwByCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CNCaByCNCwByCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw CNByCwCwByCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCwCw } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/share/ppmwrite.c��������������������������������������������������������������0000664�0000764�0000764�00000007540�10545462320�015566� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* this produces a raw ppm file, with a 15-character header of * "P6 4-digit-width 4-digit-height 255\n" */ #include "config.h" #include "tile.h" #ifndef MONITOR_HEAP extern long *FDECL(alloc, (unsigned int)); #endif FILE *ppm_file; struct ppmscreen { int Width; int Height; } PpmScreen; static int tiles_across, tiles_down, curr_tiles_across; static pixel **image; static int NDECL(write_header); static void NDECL(WriteTileStrip); static int write_header() { if (PpmScreen.Width > 9999 || PpmScreen.Height > 9999) { /* Just increase the number of digits written to solve */ Fprintf(stderr, "PPM dimensions too large\n"); return FALSE; } (void) fprintf(ppm_file, "P6 %04d %04d 255\n", PpmScreen.Width, PpmScreen.Height); return TRUE; } static void WriteTileStrip() { int i, j; for (j = 0; j < tile_y; j++) { for (i = 0; i < PpmScreen.Width; i++) { (void) fputc((char)image[j][i].r, ppm_file); (void) fputc((char)image[j][i].g, ppm_file); (void) fputc((char)image[j][i].b, ppm_file); } } } boolean fopen_ppm_file(filename, type) const char *filename; const char *type; { int i; if (strcmp(type, WRBMODE)) { Fprintf(stderr, "using writing routine for non-writing?\n"); return FALSE; } if (ppm_file != (FILE*)0) return TRUE; ppm_file = fopen(filename, type); if (ppm_file == (FILE *)0) { Fprintf(stderr, "cannot open ppm file %s\n", filename); return FALSE; } if (!colorsinmainmap) { Fprintf(stderr, "no colormap set yet\n"); return FALSE; } curr_tiles_across = 0; PpmScreen.Width = tiles_across * tile_x; tiles_down = 0; PpmScreen.Height = 0; /* will be rewritten later */ if (!write_header()) return FALSE; image = (pixel **)alloc(tile_y * sizeof(pixel *)); for (i = 0; i < tile_y; i++) { image[i] = (pixel *) alloc(PpmScreen.Width * sizeof(pixel)); } return TRUE; } boolean write_ppm_tile(pixels) pixel (*pixels)[MAX_TILE_X]; { int i, j; for (j = 0; j < tile_y; j++) { for (i = 0; i < tile_x; i++) { image[j][curr_tiles_across*tile_x + i] = pixels[j][i]; } } curr_tiles_across++; if (curr_tiles_across == tiles_across) { WriteTileStrip(); curr_tiles_across = 0; tiles_down++; } return TRUE; } int fclose_ppm_file() { int i, j; if (curr_tiles_across) { /* partial row */ /* fill with checkerboard, for lack of a better idea */ for (j = 0; j < tile_y; j++) { for (i = curr_tiles_across * tile_x; i < PpmScreen.Width; i += 2 ) { image[j][i].r = MainColorMap[CM_RED][0]; image[j][i].g = MainColorMap[CM_GREEN][0]; image[j][i].b = MainColorMap[CM_BLUE][0]; image[j][i+1].r = MainColorMap[CM_RED][1]; image[j][i+1].g = MainColorMap[CM_GREEN][1]; image[j][i+1].b = MainColorMap[CM_BLUE][1]; } } WriteTileStrip(); curr_tiles_across = 0; tiles_down++; } for (i = 0; i < tile_y; i++) { free((genericptr_t)image[i]); } free((genericptr_t)image); PpmScreen.Height = tiles_down * tile_y; rewind(ppm_file); if (!write_header()) /* update size */ return -1; return(fclose(ppm_file)); } int main(argc, argv) int argc; char *argv[]; { int fileargs=1; char *ppmfile; pixel pixels[MAX_TILE_Y][MAX_TILE_X]; tiles_across = 20; if (argc > 1 && !strcmp(argv[1],"-w")) { tiles_across=atoi(argv[2]); fileargs+=2; } if (argc-fileargs < 2) { Fprintf(stderr, "usage: txt2ppm [-w tiles-across] ppmfile txtfile ... \n"); exit(EXIT_FAILURE); } ppmfile=argv[fileargs++]; while (fileargs < argc) { if (!fopen_text_file(argv[fileargs++], RDTMODE)) exit(EXIT_FAILURE); init_colormap(); if (!fopen_ppm_file(ppmfile, WRBMODE)) { (void) fclose_text_file(); exit(EXIT_FAILURE); } while (read_text_tile(pixels)) (void) write_ppm_tile(pixels); (void) fclose_text_file(); } if (fclose_ppm_file()) exit(EXIT_FAILURE); else exit(EXIT_SUCCESS); /*NOTREACHED*/ return 0; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/share/oth32se.txt�������������������������������������������������������������0000664�0000764�0000764�00000431343�10545462320�015605� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������__ = (71, 108, 108) _A = (0, 0, 0) _B = (0, 0, 16) _C = (0, 0, 32) _D = (0, 0, 48) _E = (0, 0, 64) _F = (0, 0, 96) _G = (0, 0, 128) _H = (0, 0, 160) _I = (0, 0, 192) _J = (0, 0, 224) _K = (0, 0, 255) _L = (0, 16, 0) _M = (0, 16, 16) _N = (0, 24, 0) _O = (0, 24, 24) _P = (0, 24, 48) _Q = (0, 32, 0) _R = (0, 32, 32) _S = (0, 32, 64) _T = (0, 48, 0) _U = (0, 48, 24) _V = (0, 48, 48) _W = (0, 48, 96) _X = (0, 64, 0) _Y = (0, 64, 32) _Z = (0, 64, 64) _a = (0, 64, 128) _b = (0, 80, 160) _c = (0, 96, 0) _d = (0, 96, 48) _e = (0, 96, 96) _f = (0, 96, 192) _g = (0, 112, 224) _h = (0, 128, 0) _i = (0, 128, 64) _j = (0, 128, 128) _k = (0, 128, 255) _l = (0, 144, 0) _m = (0, 160, 0) _n = (0, 160, 80) _o = (0, 160, 160) _p = (0, 182, 255) _q = (0, 192, 0) _r = (0, 192, 96) _s = (0, 192, 192) _t = (0, 224, 0) _u = (0, 224, 112) _v = (0, 224, 224) _w = (0, 255, 0) _x = (0, 255, 128) _y = (0, 255, 255) _z = (16, 0, 0) _0 = (16, 0, 16) _1 = (16, 16, 0) _2 = (16, 16, 16) _3 = (16, 48, 48) _4 = (24, 0, 0) _5 = (24, 24, 0) _6 = (24, 24, 48) _7 = (24, 48, 0) _8 = (24, 48, 24) _9 = (24, 48, 48) _$ = (32, 0, 0) A_ = (32, 0, 32) AA = (32, 32, 0) AB = (32, 32, 32) AC = (32, 64, 0) AD = (32, 64, 32) AE = (32, 64, 64) AF = (32, 242, 186) AG = (48, 0, 0) AH = (48, 0, 48) AI = (48, 12, 0) AJ = (48, 24, 0) AK = (48, 24, 24) AL = (48, 36, 0) AM = (48, 48, 0) AN = (48, 48, 24) AO = (48, 48, 48) AP = (48, 48, 96) AQ = (48, 96, 0) AR = (48, 96, 48) AS = (48, 96, 96) AT = (64, 0, 0) AU = (64, 0, 32) AV = (64, 0, 64) AW = (64, 0, 128) AX = (64, 16, 0) AY = (64, 32, 0) AZ = (64, 32, 32) Aa = (64, 32, 64) Ab = (64, 48, 0) Ac = (64, 64, 0) Ad = (64, 64, 32) Ae = (64, 64, 64) Af = (64, 64, 128) Ag = (64, 128, 0) Ah = (64, 128, 64) Ai = (64, 128, 128) Aj = (72, 108, 108) Ak = (80, 0, 160) Al = (80, 80, 80) Am = (80, 80, 160) An = (80, 160, 0) Ao = (80, 160, 80) Ap = (80, 160, 160) Aq = (96, 0, 0) Ar = (96, 0, 48) As = (96, 0, 96) At = (96, 0, 192) Au = (96, 16, 0) Av = (96, 24, 0) Aw = (96, 48, 0) Ax = (96, 48, 48) Ay = (96, 48, 96) Az = (96, 72, 0) A0 = (96, 96, 0) A1 = (96, 96, 48) A2 = (96, 96, 96) A3 = (96, 96, 128) A4 = (96, 96, 192) A5 = (96, 128, 96) A6 = (96, 128, 128) A7 = (96, 192, 0) A8 = (96, 192, 96) A9 = (96, 192, 192) A$ = (96, 144, 178) B_ = (104, 84, 31) BA = (108, 144, 182) BB = (108, 255, 0) BC = (112, 0, 224) BD = (112, 112, 112) BE = (112, 112, 224) BF = (112, 160, 160) BG = (112, 224, 0) BH = (112, 224, 112) BI = (112, 224, 224) BJ = (117, 105, 88) BK = (120, 120, 160) BL = (120, 160, 120) BM = (120, 160, 160) BN = (128, 0, 0) BO = (128, 0, 64) BP = (128, 0, 128) BQ = (128, 0, 255) BR = (128, 32, 0) BS = (128, 64, 0) BT = (128, 64, 64) BU = (128, 64, 128) BV = (128, 90, 72) BW = (128, 96, 0) BX = (128, 96, 96) BY = (128, 96, 128) BZ = (128, 112, 32) Ba = (128, 128, 0) Bb = (128, 128, 64) Bc = (128, 128, 96) Bd = (128, 128, 128) Be = (128, 128, 255) Bf = (128, 255, 0) Bg = (128, 255, 128) Bh = (128, 255, 255) Bi = (144, 72, 0) Bj = (144, 135, 110) Bk = (144, 144, 144) Bl = (144, 144, 192) Bm = (144, 192, 144) Bn = (144, 192, 192) Bo = (160, 0, 0) Bp = (160, 0, 80) Bq = (160, 0, 160) Br = (160, 40, 0) Bs = (160, 80, 0) Bt = (160, 80, 80) Bu = (160, 80, 160) Bv = (160, 120, 0) Bw = (160, 120, 120) Bx = (160, 120, 160) By = (160, 160, 0) Bz = (160, 160, 80) B0 = (160, 160, 120) B1 = (160, 160, 160) B2 = (160, 160, 224) B3 = (165, 118, 96) B4 = (168, 168, 224) B5 = (168, 224, 168) B6 = (168, 224, 224) B7 = (170, 136, 52) B8 = (170, 154, 128) B9 = (176, 176, 176) B$ = (178, 64, 0) C_ = (178, 224, 16) CA = (182, 72, 0) CB = (192, 0, 0) CC = (192, 0, 96) CD = (192, 0, 192) CE = (192, 48, 0) CF = (192, 96, 0) CG = (192, 96, 96) CH = (192, 96, 192) CI = (192, 144, 0) CJ = (192, 144, 144) CK = (192, 144, 192) CL = (192, 160, 64) CM = (192, 192, 0) CN = (192, 192, 96) CO = (192, 192, 144) CP = (192, 192, 192) CQ = (192, 192, 255) CR = (192, 255, 192) CS = (192, 255, 255) CT = (202, 144, 114) CU = (208, 168, 80) CV = (208, 208, 208) CW = (210, 210, 178) CX = (218, 218, 182) CY = (224, 0, 0) CZ = (224, 0, 112) Ca = (224, 0, 224) Cb = (224, 56, 0) Cc = (224, 112, 0) Cd = (224, 112, 112) Ce = (224, 112, 224) Cf = (224, 168, 0) Cg = (224, 168, 168) Ch = (224, 168, 224) Ci = (224, 192, 160) Cj = (224, 224, 0) Ck = (224, 224, 112) Cl = (224, 224, 168) Cm = (224, 224, 224) Cn = (229, 162, 130) Co = (240, 240, 240) Cp = (242, 0, 0) Cq = (242, 96, 0) Cr = (242, 196, 77) Cs = (248, 224, 96) Ct = (252, 252, 153) Cu = (255, 0, 0) Cv = (255, 0, 128) Cw = (255, 0, 255) Cx = (255, 64, 0) Cy = (255, 108, 0) Cz = (255, 128, 0) C0 = (255, 128, 128) C1 = (255, 128, 255) C2 = (255, 182, 144) C3 = (255, 192, 0) C4 = (255, 192, 192) C5 = (255, 192, 255) C6 = (255, 211, 176) C7 = (255, 255, 0) C8 = (255, 255, 128) C9 = (255, 255, 192) C$ = (255, 255, 255) # tile 17 (iron bars) { ______CPBkBd__________CPBkBd__________CPBkBd__________CPBkBd____ ______CPBkBd__________CPBkBd__________CPBkBd__________CPBkBd____ CPCPCJBnBkBdCPCPBkCPCPBkBkBkCPBnCJCPCPBkBkBkCPBnCJCPCPBkBkBkCPBn BkBkBMCJBkBkBkBkBkBkBkBkBkBkBkBkBkBkBkBkBkBkBkBkBkBkBkBkBkBkBkBk BdBdBdBdBkBkBdBdBkBdBkBkBkBkBdBdBkBdBkBdBkBkBdBdBkBdBkBdBkBkBdBd ______CPBkBd__________CPBkBd__________CPBkBd__________CPBkBd____ ______CPBkBd__________CPBkBd__________CPBkBd__________CPBkBd____ ______CPBkBd__________CPBkBd__________CPBkBd__________CPBkBd____ ______CPBkBd__________CPBkBd__________CPBkBd__________CPBkBd____ ______CPBkBd__________CPBkBd__________CPBkBd__________CPBkBd____ CPCPCJBnBkBdCPCPBkCPCPBkBkBdCPCPBkCPCPBkBkBkCPBnCJCPCPBkBkBkCPBn BkBkBMCJBkBkBkBkBkBkBkCJBkBkBkBkBkBkBkBkBkBkBkBkBkBkBkBkBkBkBkBk BdBdBdBdBkBkBdBdBkBdBdBdBMBkBdBdBkBdBkBkBkBkBdBdBkBdBdBkBkBkBdBd ______CPBkBd__________CPBkBd__________CPBkBd__________CPBkBd____ ______CPBkBd__________CPBkBd__________CPBkBd__________CPBkBd____ ______CPBkBd__________CPBkBd__________CPBkBd__________CPBkBd____ ______CPBkBd__________CPBkBd__________CPBkBd__________CPBkBd____ ______CPBkBd__________CPBkBd__________CPBkBd__________CPBkBd____ CPCPCJBnBkBdCPCPBkCPCPCJBkBdCPCPBkCPCPBkBkBdCPCPBkCPCPCJBkBdCPCP BkBkBMCJBkBkBkBkBkBkBkBMBkBkBkBkBkBkBkCJBkBkBkBkBkBkBkBMBkBkBkBk BdBdBdBdBkBkBdBdBkBdBdBkBkBkBdBdBkBdBdBdBMBkBdBdBkBdBdBkBkBkBdBd ______CPBkBd__________CPBkBd__________CPBkBd__________CPBkBd____ ______CPBkBd__________CPBkBd__________CPBkBd__________CPBkBd____ ______CPBkBd__________CPBkBd__________CPBkBd__________CPBkBd____ ______CPBkBd__________CPBkBd__________CPBkBd__________CPBkBd____ ______CPBkBd__________CPBkBd__________CPBkBd__________CPBkBd____ CPCPCJBnBkBdCPCPBkCPCPCJBkBdCPCPBkCPCPCJBkBdCPCPBkCPCPCJBkBdCPCP BkBkBMCJBkBkBkBkBkBkBkBMBkBkBkBkBkBkBkBMBkBkBkBkBkBkBkBMBkBkBkBk BdBdBdBdBkBkBdBdBkBdBdBkBkBkBdBdBkBdBdBkBkBkBdBdBkBdBdBkBkBkBdBd ______CPBkBd__________CPBkBd__________CPBkBd__________CPBkBd____ ______CPBkBd__________CPBkBd__________CPBkBd__________CPBkBd____ ______CPBkBd__________CPBkBd__________CPBkBd__________CPBkBd____ } # tile 18 (tree) { ________________________________________________________________ ________________________________________________________________ _____________________l_l_m_m_m_m_l_l_l_l_l_l____________________ _____________________l_l_l_mAh_l_h_l_l_m_m_l____________________ _____________m_l_l_m_l_l_m_l_l_l_h_l_lAh_m_l_l_l_l_l____________ _____________m_mAh_m_l_mAh_l_l_l_h_l_l_m_l_l_l_h_l_l____________ _________l_l_m_l_m_l_l_l_m_l_l_h_l_lCA_l_l_l_h_l_l_l_l_l________ _________l_l_mAh_m_l_lBi_l_l_h_h_l_lBs_l_h_h_h_l_l_l_l_l________ _________l_l_m_l_m_l_lCA_l_l_lAh_mCA_l_l_l_l_l_h_h_l_l_l________ _________mAh_mAh_l_l_lCABs_l_m_m_lCA_l_l_l_l_l_h_l_l_l_l________ _________l_m_m_m_l_h_l_lCABi_m_l_l_l_l_lCABi_l_h_l_l_l_l________ _________l_l_l_l_h_h_l_lB$Bs_l_lBi_l_lCABi_l_l_l_h_l_l_l________ _____________l_l_l_l_l_l_lCABiCABs_lCABi_l_l_h_l_l_l____________ _____________l_l_m_lCABi_l_lBiBi_l_lBiBi_l_lBs_l_l_l____________ ________________Ah_m_lBiBiBiBiBiBiBiBi_l_lBi_l_l________________ _________________m_l_l_lBiBiBiBi_lBiBiBiBi_l_l_l________________ ____________________________BiCABiBSBiBS________________________ ____________________________CABiBiBiBiBi________________________ ____________________________CABiBiBS____________________________ ____________________________CABiBiBi____________________________ ____________________________BiBiBiBS____________________________ ____________________________BiBiBiBS____________________________ ____________________________CABiBiBS____________________________ ____________________________CABiBSBS____________________________ ____________________________CABiBiBiBi__________________________ ____________________________CABiBiBSBi__________________________ ________________________CACABiBiBiBiBiBi________________________ ____________________BiBiCABSBiBiBiBiCABiBiCACA__________________ ______________CACABiBiBiBiBiBS__BiBi__CABiBiBiBiBi______________ ____________CABiBiBiBiBiBSBS____BiBi____CABiBiBiBiBS____________ ________________Bi________________Bi______________Bi____________ ________________________________________________________________ } # tile 19 (floor of a room) { AjAjAiAjAjAjAiAjAjAjAjAjAiAjAjAjAjAjAiAjAjAjAjAjAiAjAjAjAjAjAjAj AjAjAjAjAjAjAjAjAEASAEAjAjAjAjAjAjAjAjAjAjAjAjAjAeAEAjAjAjAjAjAE AjAjASAjAjAjAjAjASAEAEAjAjAjAjAjAjASAjAjAjAjAjASAEASASAjAjAjASAE AjAjAjAjAjAjAjAjASASAEAjAjAjAiAjAjAjBDAiAjAjAjAjAEASAjAjAjAjAjAE AjAjAjAjAjAiBDAiAjAlAEAjASAjAjBDAiAjAiAjAjAiAjAjAEAjAjAjAjAjAjAE AjAjAiBDAjAjAjAjAjAjAEASAjASAjASAjAjAlASAjAjAjAEAjASAjBDAiAjAjAE AjAjASAjAiAjAjAjAjAjAEAjASAEAEAEAEAEASASAlAEAEAEAEAEAjASAjAjASAE AjAjAjAiBDAjAjAjAjAjAEAEAEAjAjAjAjAjAEAEASAEAjAjASASAEAEAEASAjAE AjAjAjAjAjAjAiBDASAEASAjASAjASAjASASAjAEAEAjASAjAjASAjAjAEAEAEAS AjAjAjAjASAjAjASAjAEASAjAjAjBDAjAjAjASAjAEAjAjAjAjAjAjASAjASAEAE AjAEAEAjAjAEAEAEAEASASAjAjAiAjAjAjAjAjAjAEAjAjAiAjBDAiAjAjAjAEAS AiAEASAEAEASAjAjAjAEASAjBDAjAjAjAjAiAjAjAEAEAjBDAjASAjAjAEAEAEAE AjAjASAjAjAjAjASAjASAeASAjAjAjAiBDAjBDASAEASAEASAjAjAEAEASAEASAE BDASAjAjAjAjAjAjASAjAEAjASAjBDAjAjAiASAjAEAEASAEAEAEAEAEAEASAjAE AjAjAjAjAiBDAjAjBDASAEAEAjAjAiAjAjAjAjAEAEAjASAjAjAEASAEASASAjAE AjAjAjAjAjAjAiAjAiAjAjAEAEAjASAjAjAjAEAEAjAjAjASASAjAEAEAjASAjAE AjAjAjAjAjAjAjBDAjAjASAEASAEAEAEAjAEASAEAjAjAjBDAjASAjAEAjAjAjAE AjAjAjAjAiBDAiASAjASASAEASAjAjAEAEAEAEASAjAjAiAjAjASAjAEAjAjAjAE AjAjAjAjASAjASAjAEAEAjASAjAjAjAjAjAEASASAjAjAjAjAiAjASAEAjASAjAE AiAEAEAEAEAEAEAEAEASAjAjAjAjAjAjASAjAEAjAjAiAjBDAjAjAEAEAjAjAjAE AjAjAjAjAjAjAEASAEAjAjAjBDAjAiAjAjAjAEASAjAjAjAjAjAjAEAjASAjAjAE AjAjASASASAjASAjAEAjAjAjAiAjAjAjAjAjAEAjAjAjAjAjAjAjAEASAjAjAEAE AjAjASBDAjAjAjAjAEAEAjAjAjAjAjAjASAEAEAEAjAjAjAiAjAjAEAEAEAEASAE AjAjAjASAiBDAjASAjAEAEASASAEAEAEAEAEASAEAEASAjAjAjAEAEAjAjAjAEAE AjAjAjAjBDASAiBDASAjAEASAEAEAjAjAjAjASAjAjAEAEAjAjAEAjASAjAjASAE AjASBDAiAjAiAjAiAjAjAEAEAEAjASAjASAjAjAjASAjAjAEAEAEAjAiAjAjAjAE AjAjAjAjAjBDAjBDAiAjASASAjASAjAjAjAjAjAjAjAjAjASASAEAjAjAjAjAjAE AjAjAiAjAjAjAiAjAjASAjAEASBDAjAjAiBDAiBDAiAjAjAjASAEAjAjAjAjAjAE AjAjAjAjAiBDAiAjAjAjASAEAjASAjAjBDASAjAjAjAjBDASAjAEAjAjAjAiAjAE AjASAjBDAjAjAjAjAjASAjAEASAjAjAjAiAjAiAjAjAiASAjAEAEAjAjAjAjAjAE AjAjASAjAjAjAjAjASAjAEAEASASAjAjAjAjAjAjAjAjASAEAEASAEAjAjASAEAE AjAEAEAEAEAEAEAEAEAEASAEAEAEAEAEAEAEAEAEAEAEAEASAEAEAEAEAEAEASAE } # tile 20 (corridor) { AjASASASAEAEASASASASASASAEASASASASAjASAjAjASAjAjAjASAjAjAjASAjAj ASAjAlASASAEAjASAeAjAlASAEASAeASAEAeAjAjASASAEAjASASAEASAjAjASAS AjAjASAjASAEASASASASASASAeASASASAEASASASAjAeAEASAjAjAEASASAjAjAe AjASAjAjASAEAEASAeAEAEASASAEAEASAEAjAjAjAjASAEAjAjASASAeAjAjASAS AjAjAeASAeASASAjASASAEASAjASASAEAEASASAlASAEAEASASAlASASASASAlAE ASAEAEASASASAlASAjASAEASAlASAEAEAEAeASAEAEAEASAEASAEASAEAEAEAEAE AjASASAjAEAEASASAlASAEAEAEAEAEASAEASASAEASAjAjAEAEASASAjAEASASAS ASAjASAjAjASAEASASAEASASASAEASAEAEASASASAEASAjASASAlASAjAeASAjAS AjAjAjASASAEASAeAEAEASAjASASASASAEASAjAeAEASAeAEASASASAjASASAeAS ASAEAEAEAEAeAjASASAEAeASAlAEASAeAEAjAjASAEAEAEAEAEAeAjASAEASASAS AjASAeASAEASASAjASAEASASAjAEASAEAEASAjAEAEASASASASAEAEAEAEAEAjAS AjASAjASASAEASAEAEAEAEASASAEASAEAEASAjASASASASASASAEASASASASAjAS AjAjAjAjASAEAEASAEASASAeAEASASASAEAEAEAEASAjAlAjASAEASAjAeASAEAE AjASASASAjASAEAjAjASAjASASAEAjAeAEASASASAEAEAEASAEAEASAjAEASAeAS AjAeAjAjAeASASASAjAjASASAEASAjASAEASAjAlASASASAeASAEAEASAEASASAS ASAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAeASASAEAEASASASAEAEAEASASAeAS ASASASASAEAEASAEASASAEAEASASAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAS ASAeASAEASAEAEASAeASAeASASAjAjAEASASASAEAEAjASASASASASASAjASASAj ASASASAEASASAEAEASAEAEAEASAeASAEASAjASASAjAjAjAlAjAEASASAlASASAj AEAEASAeAjASAEASASAjASASAEASAEAEASAjAEAEASAEASASASAEAEAjAjASAjAj ASASASASASAlAEASAjASAjASAEAjASAEAEASAEASAeAEAEAEAEASAEASASAjAjAS ASAlASAEAEAEAEAeASASAeAEASAjASAEAEASAEASAjASAEASAjASASAOASASAeAj ASAjASAEASASASAEAEAEAEAEASASAjAEAEASAEAjASAEAEASASAjAeAEAEAEAEAS AEASAeASASAjASASAEASAS_ZAlASAjAEASAeASASAjASAEAEAeASAEASAjASAjAj ASAjASASAlASASASAeASAjAEASAjASAEASASAEASAlASAEASASAEASASAjASAjAS ASASASAEAjAlASAEASAjASASAEASAEAEASAEAEAEAEAEAeASASASAEASASAjASAj AEAEAEAEASASAEASAEASAeAEAEASASAEAEAEASASASAEASAjASAlASAeASAEAEAS AEASASASAEASAeASASAEAEASASAjAeAEAEASASAjAjAEASASAjASASASASAEAjAj ASAlAjAjASASAjAjASAEASASAjAjASAEASAEAEASAEAEAEASASAEAEASAlAjAjAS ASAjASAjAeAEAjASAjAEAeAjASASAjAEASASASAeASASASASAeASAEASAjASAjAj ASASAjAjASAEASAjASAEASAjAjASASAEAeASASAEAjASAlASAjASAEASAjAjASAj AjAjASAjAjASAjASAjAjASAjASAjAlASASASAeAEASASASAeASASAEAEASAeASAj } # tile 21 (lit corridor) { AjAjASAjAEAEAjASAjASAjASAEAjASAjASAjAjAjAjAjAiAjAjAjAjAiAjAjAjAj AjAjAjAjAjAEAjAjAjAjAjAjAEAjASAjAEAjAiBDAiAjAEBDAjAjASAjBDAiAjAj AjAiBDAiAjASAjASAjAjAjAjAjASAjAjAEAjAjAjAjAjAEAiAjAjAEAjAjAjBDAS BDAjAjAjAjAEAEAjASAEAEASAjAEAEAjAEBDAjAiAjAjAEBDAiAjAjAjAiAjAiAj AiAjAjAjASAjAjAjAjAjAEAjAjAjAjAEAEAjAiBDAjAEAEAjAjAjASAjAlAiAjAE AjAEAEAjASAjAjAjBDAiAEAjAjAjAEASAEASAjAEAEAjAjAEAjAEAjAlAEAEAEAE AjAjAjAjAjAEAjAjASAjAEASAEAEASASAEAjASAEAjAjAjAjAEAjAjAjARAjAiAj AiBDAiAjAjAjAEASAjAEAjAjAjAEASAjAEAjAjAjAEAiAjASAjAjAjAjASAjAjAS AjAjAiBDAjAEAjAjAEAEAjAjAjAjAjASAEAjAiAjAEAjAjAEAjASAjAiAjASAjAj AjASAEAEAEAjAjAjAjAEASAjAiAEASAjAEBDAjAjAEAEAEAEAEAjAjAjAEAjAjAS AjAjAjAjAEAjAjAiAjAEAjAjBDAEAjAEASAjAiAjAEAjAjAjAjAEAEAEAEAjAjAj AjAjAjAjAjAEAjAEAEAEAEASAjAEAjAEAEAjAjASAjAjAjAjAjAEAjAjAjAjAjAS AjAiBDAiAjAEAEAjAjAjAjASAEAjAjAjAEAEAjAEAjAjAjAiAjAEAiAjAjASAEAe BDAjAjAjAjAjAjAiAjAjAjAjASAjAjAjAEAjASAjAEAEAEAjAEAEAjBDAEASAjAj AiAjAjAiAjASAjASBDAiBDAjAEAjAjAjAEAjAjAiAjAjAjASAjAEAEAjAEAiAjAS AjAEAEAEAEAEAEAEAEAEAEAEASAEAEAEAEAjAjAjAEAEAjASAjASASAEAjAlAjAS ASAjAjAjAEASAjAjAjAjAEASASAjAjAEASAEAEAEAEAEAEAEAEAEAEAEAEAEAEAj ASAjAjAEAjAEAEASASASAjASAjAjAiAEAjAjAjAEAjBDAiAjAjAjAjAjAiAiAjAj AjASAjAEAjAjAEAEAjAEAEAEAjAjASAEAjAjAjASAiAjAiBDAjASASAjBDASAjAj AEAEASAjAjAiAEAjAiAjAiAjAEAjAEAEAjAjAjAEAjAjAjASAjAEASAjAiBDAiAj AjAjAjAjAjAjAEAjBDAjAjAjASAjAjAEAEAjAEAjASAEAEAEAEAjAEAjAjAjAjBD AjAjAjAEAEAEASASAjASAjAEAjAjAjASAEAjAEAjAjAjAEAjAiAjAjAEAjAjAjAi ASAjAjAEAjAjAjAEAEAEAEAEAjAjAiAEAjASAEAiAjAjAEAjAjAjAjAEAEAEAEAj AjAjASAjAiAjASAjAEAjAjAEAjAiBDAEASAjAjAjAjAjAEAEAjAjAEAjAiAjAiAj ASAjAjASBDAjAjAjASAjAiAEAjAjAjAEAjASAEAjAjAjAEAjASAEAjAjAjBDAiBD AjAjAjAEAjAjAjAEAjBDAjAjAEASAjAEAjAEASAEAEAEASAjAjAjAEAjAiAjAjAj AEAEAEASASAjAEAjAEASAjAEAEAjASAEAEAEAjAjAjAEAiAjAjAjAjASAjAEAEAi AEAjAjASAjASAjAjAjAEAEAjAjAjAjASAEAjAjAjAiAEAjBDAjAjASAjASAjBDAj AjAjAiBDASAjAjAjAiAEAjAjAiBDAjAEAjAEASAjAjAEAEAjAjAEAEAjAjAjAiAj AjAjAjAjAjAEAiBDAjAEAjAjAjAjAiAEAjAiAlASASAjAjASASAjAEAjAiBDAjAj ASBDAiAjAjAEAjAjAiAeAjAjAiAjAjAEAjASAjAEAjAjAjAjAjAjASAjAjAjAiBD AjAiBDAiBDAjAiBDAjAiAjAiAjBDAjASAjASAjAEAjAjAjASAjAjAEAEAjAjAjAj } # tile 27 (grave) { ________________________________________________________________ ____________________________CPCVCVCPCP__________________________ ________________________CPCPCPCPCPCPCmCVCV______________________ ______________________CPCPCPCPCPCPCPCPCPCVCP____________________ ______________________CPBkBdCPCPAlCPBdBkCPCV____________________ ______________________CPBdCPBkCPBdCPBkCVBdCV____________________ ______________________CPBDBkCPCPBkCPBdBdCPCP____________________ ______________________CPBdCPBdCPBDCPBdCPCPCV____________________ ______________________CPBdCPCPCPBkCPBdCPCPCP____________________ ______________________CPCPCPCPCPCPCPCPCPCPCP____________________ ______________________CPCPCPCPCPCPCPCPCPCPCP____________________ ______________________CPBkCPBkCPCPCPCPCPCPCP____________________ ______________________CPCJBnCPCPCPCPCPCPCPCP____________________ ______________________AEB_AeAdB_AeB_AOANB_Ae____________________ __________________Ae__B_ARB_ADAEB_ARAlADAeAN____________________ ______________________AOAlAeAdAOB_AeAOAdB_Ad__Ae________________ ____________________AeAlB_ARAOADADADADADADAN____________________ ______________________AdAlAOADAdAeAdANAeAdAB____________________ ______________________ABADAdANAeB_ARAOB_ARAD____Ae______________ __________________Ae__ADB_AeAdARB_Ae_UAOABAD__Ae________________ ______________________B_AeB_ADAOAeADAdANADAN____________________ ____________________AlAeAlAeAdANADADB_AeANAR____________________ ______________________AdADADAdARAOAOARB_ADAdAe__________________ ________________Ae____B_AOADAOAeB_AdB_AEAOAd____Ae______________ ______________________AeB_AeANAdADABAEARAKAD____________________ __________________Ae__ARAhB_ADADANARAdADB_ADAe__________________ ______________________AeAaB_AeAOB_AeB_ADAeAO____________________ __________________Ae__ARB_AlANARAeBVAEADB_AR____________________ __________________________Ae______Ae____Ae______________________ ____________________________________Al__________________________ ________________________________________________________________ ________________________________________________________________ } # tile 29 (sink) { ________________________________________________________________ ________________________________________________________________ ________________BkBkBMBMBM____BkBkBMBMBM________________________ ____________________BM____________BM____________________________ __________________CJBFBMBMBMBMBMCJBFBM__________________________ ____________C$BMBMBFBMBMBMBkBMBMBFBMBMBMBMBk____________________ ________C$CmCmCmCmC$C$C$C$BkBMC$C$C$C$C$C$CmCmBk________________ ______C$C$Cm_a_f_f_f_f_f_fCPBM_f_f_f_f_f_f_aCmCoBk______________ ____C$C$Cm_a_f_f_f_f_f_f_fBkBM_f_f_f_f_f_f_f_aCmCmBk____________ ____C$C$_a_f_f_f_k_k_k_k_kBkBM_k_k_k_k_k_f_f_f_aCmCP____________ ____C$C$_a_f_f_k_k_k_k_k_kBh_s_k_k_k_k_k_k_f_f_aCmBk____________ ____C$C$_a_f_f_k_k_k_k_k_k_y_s_k_k_k_k_k_k_f_f_aCoBk____________ ____C$Cm_a_f_f_k_k_k_k_p_k_k_s_k_p_k_k_k_k_f_f_aCmBk_M_A_A_A____ ____C$Cm_a_f_f_k_k_k_k_k_k_k_k_kBE_k_k_k_k_f_f_aCmCJ_A_A_A_A_A__ ____C$C$_a_f_f_f_k_k_k_kBE_pBE_k_k_k_k_k_f_f_f_aCmBn_A_A_A_A_A_A ____C$C$_a_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_f_aCmBk_A_A_A_A_A_A ____C$C$Cm_a_a_f_f_f_f_f_f_f_f_f_f_f_f_f_f_a_aCmCmBk_z_A_A_A_A_A ____C$C$C$CmCm_a_a_a_a_a_a_a_a_a_a_a_a_a_aCmCmCmCJBn_A_A_A_A_A_A ______C$C$C$C$C$C$C$CmCmCmCmCmCmCmCmCmCmCmCmCmBkBn_z_A_A_A_A_A_A __________C$C$C$C$C$C$C$C$C$C$C$CmCmCmCmCVCPBk_A_A_A_A_A_A_A_A_A ________________C$C$C$C$C$CmCmCmCmCmCmCm_A_A_A_A_A_A_A_A_A_A_A__ ______________CPAlCPBkBkBdBdBdBdBdBdBdBDBk_A_A_A_A_A_A_A_A_A____ ______________CPCPAlCVBkCPBdBdBdBdBdBJBkBn_z_A_A_A_A_A_A_A______ ________________CPCPCPCVBkBkBkBdBdBkBlBk_A_A_A_A_A_A_A_A________ __________________CPCPCPCPCVBkCPBkCOBk_M_z_A_A_A_A______________ ______________________CPCPCPCPBkBk_B_z_A_A_A____________________ ___________________________A_A_A_M_A_A_A________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 30 (toilet) { __________________C$C$C$C$C$C$__________________________________ ________C$C$C$C$C$C$CXCXCXCXCXC$________________________________ ____C$C$CXCXCXCXCXCXCXCXCXCXCXCXC$______________________________ ____C$C$CXCXCXCXCXCXCXCXCXC$C$C$C$______________________________ ____C$CXC$CXCXCXC$C$C$C$C$CXCXCXCX______________________________ ____C$CXC$C$C$C$CXCXCXCXCXCXCXCXCX______________________________ ____C$CXC$CXCXBMAECWCXCXCXCXCXCXCX______________________________ ____C$CXC$BMBMCXCXCXCXCXCXCXCXCXCX______________________________ ____C$CXC$CXCXCXCXCXCXCXCXCXCXCXCX______________________________ ____C$CXC$CXCXCXCXCXCXCXCXCXCXCXCX______________________________ ______C$C$CXCXCXCXCXCXCXCXCXCXCX________________________________ ________C$CXCXCXCXCXCXCXCXCXCXC$C$C$C$__________________________ __________CXCXCXCXCXC$C$C$C$C$C$C$C$C$C$_______A_A_A_A_A________ ______________CXCXC$C$C$C$C$C$COCOCOCOC$C$_A_A_A_A_A_A_A_A______ ______________CXCXC$C$COCOCOCOCOCOCOCOCOC$C$_A_A_A_A_A_A_A_A____ ______________CXCXC$C$COCOCOCO_k_kCOCOCOCOC$_A_A_A_A_A_A_A_A____ ______________CXCXCXC$C$_k_k_k_k_k_k_kCOCOC$C$_A_A_A_A_A_A______ ______________CXCXCXCXC$C$C$_k_k_k_k_k_kCOC$C$_A_A_A____________ ________________CXCXCXCXC$C$C$_k_kC$C$C$C$C$C$_A_A_A____________ ________________CXCXCXCXCXC$C$C$C$C$C$C$C$C$CX_A_A_A____________ __________________CXCXCXCXC$C$C$C$CWCXCXCXCXCX_A_A_A_A__________ __________________CXCXCXCXC$CXCXCXCXCXCXCXCXCX_A_A_A_A__________ ______________________CXCXC$CXCXCXCXCXCXCXCXCX_A_A_A_A__________ ________________________CXCXCXCXCXCXCXCXCXCXCX_A_A_A_A__________ ____________________________CXCXCXCXCXCXCXCX_A_A_A_A____________ ______________________________CXCXCXCXCXCX_A_A_A_A_A____________ ______________________________CXCXCXCXCXCX_A_A_A_A______________ ________________________________CXCXCXCX_A_A_A_A________________ ___________________________________A_A_A_A_A____________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 31 (fountain) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________BsAw______________BsBiAwAw________BsCF__Aw______________ ________BsCFAw_______KBECFBsBiBiAzBh__BsCFBsBSBiAzAw____________ ______BsCFBSAzBSAw_s_s_s_yBhBSBS_yAwAzBsBsBiBiBiAwBSAw__________ ____BsCFBsBiAwAw_s_sBsCF_sBh_yBiBiBS_sBh_yBh_yBiAwAwAzAw________ ____BsCFBsBiBiAzBSAzCFBsBs_s_sBiBi_s_yBh_g_s_sBsBiAwBSBsCFAw____ ____BsBvBsBiBiBiAwAwBs_HBiBi_s_s_s_yBE_IBrBi_s_sBiBiBsCFBsAzAw__ __BsBSAwCFBSBiBS_HBE_KAF_K_H_H_sBhBI_I_H_IBiBi_s_HBsCFBsBsBiBS__ CFBsBiAwAzBSBiBi_s_s_H_sBhBE_IBh_y_G_G_H_y_H_H_sCFBsBsCFBsBiAwAw BsCFBSAzAwBi_H_s_s_G_G_G_H_s_s_s_s_H_I_H_I_G_H_I_HBsBvBsBiBiAzAw BsBsBiBiBS_I_H_s_I_G_H_I_J_KBI_s_J_s_s_H_H_HBh_G_I_HBsBiBiBSBSAw BsCFBSBiAwAz_H_I_G_J_J_s_s_J_s_yBh_J_J_s_J_J_I_H_G_H_IBiBiBSAz__ CFBsBiBSBiAw_H_H_J_J_s_J_J_J_JBh_y_J_J_s_s_J_J_H_G_H_HBsAzAw____ BsBvBiBiBi_H_G_J_J_s_J_J_J_J_J_sBh_J_J_J_J_J_s_J_G_ICFBsBiBSAw__ __BsBSBiBsBs_I_J_J_s_J_J_J_J_J_y_s_J_J_J_J_J_s_J_G_HBsBiBiAzAw__ ______BsCFBiAz_J_J_J_s_J_J_J_J_JBh_J_J_J_J_J_s_J_IBsCFBSBiBiAwBS ____CABvBsBiAwAw_J_J_J_J_s_J_J_J_J_J_J_J_J_sAwAz_HBsBsBiBSBiBiAw ____BsCFBSBiAzBSAw_J_JBsCFBiAw_J_s_s_s_JBsCFAwBSAwCFBsBWBiBSBi__ __BsCFBsBiBiAwAwAw_JCFBsBsBSBSAw_J_J_J_JBsBiAzAwAwAz____BiBi____ ____BsCFBSBiAzBSAw_JBsCFBsBiAzAwBS_JBsCFBsBiBiAwBSAw____________ ______BWBiBiAwAw__CABvBsBiBiAwAzAwAwCFBsBsBiBiBiAzAw____________ ________BSBiAzBS__BsCFBsBiBiAwBSAwAzBsCFBsBiBSBiAw______________ ____________________BsBsBSBiAzAwAwBSBsCFBsBWBi__________________ ______________________CFBWBiAw________BsBsBi____________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 40 (cloud) { _p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p _p_p_p_p_p_p_p_p_p_p_p_p_p_p_pBI_p_p_pBIBI_p_p_p_p_p_p_p_p_p_p_p _p_p_p_p_p_p_p_p_p_p_p_p_p_pBhBI_pCQCSCSBI_pBh_p_pBI_p_p_p_p_p_p _p_p_p_p_p_p_p_p_p_p_pBI_pBhCQCQCSCoCoCSCQCmCQCSCQBhCQBI_p_p_p_p _p_p_p_p_p_p_p_p_pBICmBhCQCSCoCoCoCoCmCoCSCSCmCSCQCSCSCQCSBI_p_p _p_p_p_p_p_p_p_pBICSCoCoCoCoCoCoCoCoCoCoCmCoCoCoCoCSCoCmCSCQ_p_p _p_p_p_pBIBIBIBIBICoCoC$C$CoCoCoCoCoCoCoCoCoCoCoCoCoCoCoCmBhBI_p _p_p_p_pCQCSCQCQCoCoC$CoCoCoCoCoCoCoCoCoCoCoCoCoCoCoCoCoCmCQBI_p _p_p_pCSCmCoCoCoCmCmCoC$CoCoCoCoCoCoCoCoCoCoCoCoC$CoCoCoCSCQBI_p _pBICQCSCoCoCoCmCmCmCoCoCoCoCoCoCoCoCoCoC$CoC$CoC$CoCoCoCSCSCQBI _pCmCSCoCoCoCoCmCoCmCoCoCoCmCmCoCoC$CoC$CoCoCoCoCoCoCoCoCmCSCQBI BICmCmCmCmCmCmCmCoCmCmCmCmCmCoCoCoC$CoC$CoC$CoCoC$CoCoCoCmCSCQBI BICQCVCmCVCQCmCmCmCVCmCmCoCoCoCoCoCoCoCoCoCoCoCoCoCoC$CoCSCQBn_p BICRCQCVCPCSCmCmCPCVCmCmCmCoCoCmCmCmCoCoCoCoCmCoCoCoCoCoCoCRCQ_p CmCQCmCVCSCmCmCmCVCmCmCmCoCoCoCmCmCmCmCmCmCmCmCmCmCmCoCoCmCmCmBI CQCVCmCmCmCmCmCmCVCVCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCmCQBI BICPBnCVCPCVCmCmCmCVCVCmCmCmCmCmCmCVCVCVCVCVCVCVCmCmCmCmCmCmCmBI _pBICVCPCVCVCmCmCmCVCVCVCVCVCVCmCVCVCVCVCVCVCVCmCmCoCoCoCoCmCmBI _pBI_pCVCVCmCVCoCoCmCVCVCVCVCVCmCmCmCmCVCVCVCmCmCoCoC$CoCoCmCmBI _p_p_pBICQCVCVCmCmCoCoCoCoCmCmCoCoC$CoCoCmCoCoCoCoC$CoCoCoCoCmCQ _p_p_pCQCSCVCmCoCoCmCoCoCoCoC$CoC$CoC$CoCoCoC$C$CoC$CoC$CoCoCmCS _p_p_pBIBICmCmCmCoCmCmCoCoCoC$CoC$CoCoCoCmCmCoCoC$CoCoC$CoCoCmCQ _p_p_p_pCQCmCVCmCmCmCmCmCmCmCoCmCoCoCoCmCmCmCmCoCoCoCoCoCoCmCoBI _p_p_pBICVCVCmCPCPCPCVCVCPCPCPCVCVCVCmCmCVCmCmCmCmCmCmCmCmCmCmBI _p_p_pCQCmCmCmCmCmCmCVCmCVCVCPCPCPCVCVCVCVCVCVCVCVCVCVCVCmCVCmBn _p_p_pBIBICmCoCoCmCmCmCmCmCVCVCVCVCmCmCmCmCmCmCVCVCVCVCVCVCVCQBI _p_p_pCQBICmCoCoCoCmCmCmCmCmCmCmCmCVCmCmCVCmCVCmCmCmCmCmCQBIBIBI _p_pBICVCQCSCoC$CoCmCoCoCmCmCmCmCmCmCmCmCmCVCVCVCmBnCQCVBIBI_p_p _p_pBIBICmCoCoCoCoCmCmCmCmCVCVCVCVCPBnCVCVCVCVCVCVBhBIBI_p_p_p_p _p_p_p_pBICmCmCmCmCSBnCQCVCQBnBnBI_pBIBIBnCPCQBIBIBe_p_p_p_p_p_p _p_p_p_pBIBeBIBIBIBIBIBIBI_p_p_pA$_p_p_pBIBI_p_p_p_p_p_p_p_p_p_p _p_p_p_p_p_p_p_p_k_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p } # tile 42 (arrow trap) { CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CB____________________________________________________________CB CB____________________________________________________________CB CB____________________________________________________________CB CB____________________________________________________________CB CB____________________________________________________________CB CB____________________________________________________________CB CB____________________________________________________________CB CB____________________________________________________________CB CB____________________________________________________________CB CB________________________BDAiBDAiBDAi________________________CB CB__________________AiBDAiBFBdBFBdBFBdBdAiBD__________________CB CB______________BDAiBdBDBFBdBFBkBFBdBFAiBDBFAiBD______________CB CB__________CuAiCuBFCpBDAiBdAiBdBFBdAiBDBFBdBkBFCpBD__________CB CB________BDBFCuBkCuBdCpBDAiBMBdAiBDBFBdBFAiBdBFCuCuAi________CB CB________AjBFBdCpCuCpCuCuCuCuCuCuCuCuCpCuCuCpCuCuCuCu________CB CB________BDBFCpBDCpBFCuBFBMBdBFBdAiBDBMBkBMBkBFCuCuBD________CB CB________AjCuAiCpBdCuBFBdBdBFBFBdBMAiBdBFBdApBdCuBDAiAE______CB CB________AjAjBDAiBdApBdApBdAiBkBFBDBDBFBdAiBDAiAjAjBDAEAS____CB CB__________AjBDAjAjAiBDAjBFBdBMBdBFAiBDAiBdAjBDAjAjASAEAE____CB CB______________AjAjBDAjAjBDAiBDAiBDAiAjAjAjAjAjAEAEAEAE______CB CB______________AEAEAjAjAjBDAjAjAjAjBDAjAjAjAEASAEAS__________CB CB__________________AEAEAEAiAjAjAjAjAjAEAEASAEAE______________CB CB________________________AeAEAEAEAEAEASAE____________________CB CB____________________________________________________________CB CB____________________________________________________________CB CB____________________________________________________________CB CB____________________________________________________________CB CB____________________________________________________________CB CB____________________________________________________________CB CB____________________________________________________________CB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB } # tile 43 (dart trap) { CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CB____________________________________________________________CB CB____________________________________________________________CB CB____________________________________________________________CB CB____________________________________________________________CB CB____________________________________________________________CB CB____________________________________________________________CB CB____________________________________________________________CB CB____________________________________________________________CB CB____________________________________________________________CB CB________________________BDAiBDAiBDAi________________________CB CB__________________AiBDAiBFBdBFBdBFBdBdAiBD__________________CB CB______________BDCuBdCuBdBdBFBMBMBdBFAjBdBFAjBd______________CB CB__________AiBDBFCpCuCpCuApBdBDBFBdAiBdAiBdBMBFAiBD__________CB CB________BDBFBMBdBFCuCuCuCuBMBdCpCpCuCuCuBFBDBdBFBdAi________CB CB________AiBDBFBdCuCuCuCuCuCuCpCuCuCuCuCuCuCpCuCpCpBD________CB CB________BDBFBDAiBDCpCuCuCuBdBFCuCuCuCuCuBMBkBFBdBFAi________CB CB________BDAiBDBFCuCuCuCuBFBdBFBdBFBDBFBdBFBDBFBDAiBDAE______CB CB________AjAjAjBDCpBFCuBdApBdBMBdAiBDBFBDBFAjBDAjAjAjASAE____CB CB__________AjAiAjAjAiBDAiBdBFBdBMBMAiBDAiBDAjAiAjAjAEAEAE____CB CB______________AjAjBDAjAjBDAiBDAiBDBDAjAjAiAjBDAEAEASAE______CB CB______________AeAEAjAjAjAjAjAjAjAjAiAjAjAjAEAEASAE__________CB CB__________________ASAEAEBDAjAjAjAjBDAEAEAEASAE______________CB CB________________________ASAEAEAEAEAEASAE____________________CB CB____________________________________________________________CB CB____________________________________________________________CB CB____________________________________________________________CB CB____________________________________________________________CB CB____________________________________________________________CB CB____________________________________________________________CB CB____________________________________________________________CB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB } # tile 44 (falling rock trap) { CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CB____________________________________________________________CB CB____________________________Cu______________________________CB CB____________________________Cu______________________________CB CB____________________________Cu____Cu________________________CB CB____________________________Cu____Cu________________________CB CB________________________Cu__Cu____Cu________________________CB CB________________________Cu__Cu____Cu________________________CB CB________________________Cu__Cu____Cu________________________CB CB________________________Cu__Cu____Cu________________________CB CB________________________Cu__Cu____Cu________________________CB CB________________________Cu__Cu____Cu________________________CB CB________________________Cu________Cu________________________CB CB________________________Cu__________________________________CB CB______________________________CuCu__________________________CB CB__________________________CuCuCuCuCu________________________CB CB______________________CuCuCuCuCuCuCuCu______________________CB CB______________________CuCuCuCuCuCuCuCu______________________CB CB________________________CuCuCuCuCuCu________________________CB CB________________________CuCuCuCu____________________________CB CB____________________________________________________________CB CB____________________________________________________________CB CB____________________________________________________________CB CB____________________________________________________________CB CB____________________________________________________________CB CB____________________________________________________________CB CB____________________________________________________________CB CB____________________________________________________________CB CB____________________________________________________________CB CB____________________________________________________________CB CB____________________________________________________________CB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB } # tile 45 (squeaky board) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ __CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFBsBs__ __CFBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsCFCFBsBsBsCFCF__ __CFBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsCFCFCFCFBsBsBsBsBsCFCF__ __CFBsBsCFCFCFCFCFCFBsBsBsBsCFCFCFCFCFCFBsBsBsBsBsBsBsBsBsCFCF__ __CFCFCFBsBsBsBsBsBsCFCFCFCFBsBsBsBsBsBsCFCFCFCFCFCFCFCFCFCFCF__ __CFBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsCFCF__ __CFBsBsCFCFCFCFCFCFBsBsBsBsBsBsBsBsBsBsCFCFCFCFCFBsBsBsBsCFCF__ __CFCFCFBsBsBsBsBsBsCFCFCFCFCFCFCFCFCFCFBsBsBsBsBsCFCFBsBsCFCF__ __CFBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsCFCFCFCFCFCFBsBsCFCFCFCF__ __BsBsBsCFCFCFCFCFCFCFBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsCFCF__ __BsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsCFCFCFCFCFCFBsBsCFCFCFCF__ __BsBsBsCFCFCFCFCFCFCFBsBsBsCFBsBsBsBsBsBsBsBsBsBsBsBsBsBsCFCF__ __CFCFCFBsBsBsBsBsBsBsCFCFCFCFCFCFCFCFCFCFCFBsBsBsBsBsBsBsCFCF__ __BsBsBsCFCFBsBsCFCFBsBsBsBsBsBsBsBsBsBsBsBsCFCFCFCFCFCFCFCFCF__ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 47 (land mine) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ _____________________l_l_l_l_l_l_l_l_l_l_l______________________ _________________l_l_h_m_l_h_h_h_h_h_l_l_h_l_l_l________________ _____________l_l_h_h_l_h_l_hCuCuCu_h_m_h_h_h_h_h_h______________ ___________l_h_h_h_h_l_h_lCuCuCuCuCu_l_h_h_h_h_h_h_h____________ ___________l_h_h_h_h_l_l_hCBCuCuCuCB_h_h_c_h_h_h_h_h____________ ___________l_h_h_h_h_l_h_l_hCBCBCB_h_hAR_h_h_h_h_h_h____________ ___________l_l_l_h_h_h_h_h_h_h_h_h_h_h_h_h_h_h_h_h_h_A__________ ___________l_h_h_l_l_h_h_h_h_h_h_h_h_h_h_h_h_h_h_h_h_A_A________ ___________l_h_h_h_h_h_h_d_h_h_h_h_c_h_h_c_h_h_c_h_h_B_A________ _____________h_h_h_h_h_h_h_h_h_h_h_h_h_h_h_h_h_h_h_z_A_A________ _______________A_h_h_h_h_h_h_h_h_h_h_hAR_h_h_h_h_B_A_A_A________ _________________A_z_h_h_h_h_h_h_h_h_h_h_h_z_B_z_A_A_A__________ _____________________A_z_A_z_A_z_B_z_A_A_A_A_A_A_A______________ ___________________________A_A_A_A_A_A_A_A_A_A__________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 48 (rolling boulder trap) { CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CB____________________________________________________________CB CB____________________________________________________________CB CB____________________________________________________________CB CB____________________________________________________________CB CB____________________________________________________________CB CB____________________________________________________________CB CB____________________________________________________________CB CB____________________________________________________________CB CB____________________________________________________________CB CB____________________________________________________________CB CB__CuCuCuCuCuCuCuCuCuCuCuCuCuCu______CuCuCuCuCuCu____________CB CB________________________________CuCuCuCuCuCuCuCuCuCu________CB CB__________CuCuCuCuCu__________CuCuCuCuCuCuCuCuCuCuCuCu______CB CB____________________________CuCuCuCuCuCuCuCuCuCu__CuCuCu____CB CB____CuCuCuCuCuCuCuCuCuCu__CuCuCuCuCuCuCuCuCuCuCuCuCu__CuCu__CB CB__________________________CuCuCuCuCuCuCuCuCuCu__Cu__CuCuCu__CB CB__________________________CuCuCuCuCuCu__CuCuCuCuCuCuCu__Cu__CB CB__________________________CuCuCuCuCuCuCuCuCuCuCuCu__CuCuCu__CB CB__CuCuCuCuCuCuCuCuCuCu____CuCuCuCuCuCuCuCuCuCuCu__CuCuCuCu__CB CB__________________________CuCuCuCuCuCuCuCu__CuCuCuCuCu__Cu__CB CB__________________________CuCuCuCuCuCuCuCuCuCuCu__CuCuCuCu__CB CB__________________________CuCuCuCuCuCuCuCuCu__CuCu__Cu__Cu__CB CB________CuCuCuCuCuCuCuCu____CuCu__CuCu__CuCuCuCuCuCuCuCuCu__CB CB____________________________CuCuCuCuCuCuCuCu__Cu__CuCuCu____CB CB__________________CuCuCu______CuCuCuCu__CuCuCuCuCuCuCu______CB CB__________________________________CuCuCuCuCuCuCuCuCu________CB CB____________________________________________________________CB CB____________________________________________________________CB CB____________________________________________________________CB CB____________________________________________________________CB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB } # tile 49 (sleeping gas trap) { CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB CB____________________________________________________________CB CB____________________________________________________________CB CB____________________________________________________________CB CB____________________________________________________________CB CB______________________CuCuCuCuCuCuCu________________________CB CB______________________CuCuCuCuCuCuCu________________________CB CB______________________________CuCu__________________________CB CB____________________________CuCu____________________________CB CB__________________________CuCu______________________________CB CB________________________CuCu________________________________CB CB______________________CuCu__________________________________CB CB______________________CuCuCuCuCuCuCu________________________CB CB______________________CuCuCuCuCuCuCu________________________CB CB____________________________________________________________CB CB____________________________________________________________CB CB____________________________________________________________CB CB__________________________________CuCuCuCuCu________________CB CB________________________________________Cu__________________CB CB______________________________________Cu____________________CB CB____________________________________Cu______________________CB CB__________________________________CuCuCuCuCu________________CB CB____________________________________________________________CB CB____________________________________________________________CB CB____________________CuCuCuCu________________________________CB CB________________________Cu__________________________________CB CB______________________Cu____________________________________CB CB____________________CuCuCuCu________________________________CB CB____________________________________________________________CB CB____________________________________________________________CB CB____________________________________________________________CB CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB } # tile 50 (rust trap) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ____CL__________________________________________________________ __BzCTBzCLBbCL________________CP________________________________ ____CLBbCL__CLBbCL________COCUBbCLBz____________________________ ______CL____Bz__BbCLBz____CL__BJ__CL______________CnCNCO________ ________BtCU________BzCLBbCL__Aj__Bb_z_A__CLBzCTCNBzCLBb________ ______________COCn______CLBbCLBtCLCLCLBbCLBbCLBzCLBtCL__________ ____________CTCNBzCLCT__Bt____CL____BtCL_A______________________ ________________BtCLBzBzCL____CLBzCUCNBV_A_A_A__________________ ____________________CLBtCLBzCTBb__BXBtBb___A_A_____A_A_A________ ________________________BzBbBtCLCLCLCLCL___A_A_A_A___A_A_A______ ____________________CLCTCLCLCLBbCL____Bb_z___A_A_A_A_A_A_A______ ____________________________BtCLBb_____z_A___A_A_A_A___A________ __________________________COBnBVAe_______A_A_A_A_A_A_A_A________ ____________________________AlBJBlBJ_____A_A_A_A_A_A_A__________ ____________________________CUBzBZ_______A_A_A_A_A_A_A_A________ ____________________________BzCLBV_____A_A_A_A_A___A_A_A_A_A_A__ __________AjAS____________BzCTBzCLBz_A_A_A_A_A_A_A_A___A_A_A_A__ ______AiAjAiBDAj____AjAiBKBDBJAlAe_A_A_A_A_A_______________A_A__ ____AjBKBdBKAiAi__AjAjBDAiAiAjBJAe_A_A_A________________________ ____BKAjAiAiBKBD__ASAfAiAjASBJAlAe_A_AASAS______________________ ______AiBKAjBK____AjAjASCKASBJAjAeAjBDAiBD______________________ __________BdAi______AlASAjAjAiBJAjBKAjBdAiAj____________________ ______________________ASCKAjBdBKAiBKAiBDBKAi____________________ ______________________ASAiBKAiAjCPAiBKAiBK______________________ ________________________AjAjBdBKAi______________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 59 (web) { ________________________________________________________________ ________________________________________________________________ ____CV__________________________________________________CVCV____ ______CVCV__CVCVCV______________CV____________________CV________ __________CV______CVCVCVCV______CV__________________CV__________ ____________CV____________CVCVCVCVCVCVCVCVCVCVCVCVCVCV__________ ____________CV________________CV__________________CV____________ ______________CVCVCVCV________CV________________CV__CV__________ ______________CVCV____CVCVCVCVCVCVCVCVCVCVCVCVCV____CV__________ ______________CV__CVCV________CV__________CVCV______CV__________ ____________CV________CV________CV______CV__CV________CV________ ____________CV__________CVCVCVCVCV______CV____CV______CV________ ____________CV________CVCV______CVCVCVCV______CV______CV________ ____________CV____CVCV____CVCV__CV____CVCV______CV____CV________ __________CV____CV______CVCV__CVCV__CV__CV______CV______CV______ ________CVCVCVCVCVCV__CV____CVCV__CV______CV______CVCV__CV______ __________CV__CV____CVCVCVCVCV__CV__CVCV__CV__CVCVCV__CVCVCV____ __________CV__CV____CV______CVCV__CV____CVCVCV____CV____CV______ __________CV____CV____CV____CV__CVCV________CV__CV______CV______ __________CV____CV____CV__CV____CV__CVCV__CV____CV______CV______ __________CV____CV______CVCV__CV________CVCV____CV______CV______ __________CV____CV__CVCV__CVCVCV______CVCVCV____CV______CV______ __________CV______CVCV________CVCVCVCV____CV____CV____CV________ __________CV______CV__________CV____________CVCV______CV________ __________CV____CVCVCVCVCV____CV______________CV______CV________ __________CV____CV________CVCVCVCVCVCVCVCVCVCVCVCV____CV________ __________CVCVCV____________CV____________________CV__CV________ __________CVCVCVCVCV________CV____________CVCVCVCVCVCVCV________ ________CV__________CVCVCVCVCVCVCVCVCVCVCV____________CV________ ______CV______________________CV________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 60 (statue trap) { ________________________________________________________________ ____________________________CBCb________________________________ ____________________________CECb________________________________ ____________________________CxBr________________________________ ____________________________CbCY________________________________ ________CYCYCYCYCxCxCYCECYCECBCYCbCuCbCYCECbCbCECbCu____________ ________BrCYCBCYCbCuCYCYCbCYCbBrCbCYCuCbCYCECbCuCYCb____________ ____________________CbCE____CYCb____CbCu________________________ ____________________CECY____CYCu____CBCB________________________ ____________________CYCYCE__CYCb__CbCuCb________________________ ______________________CECY__CECB__CxCb__________________________ ______________________CbCuCECuCBCbCbCb__________________________ ________________________CBCxCbCYCECB____________________________ ________________________CBCbCuCuCbCY____________________________ __________________________CBCbCYCY______________________________ __________________________CYCBBrCb______________________________ ____________________________CbCB________________________________ __________________________CbCYCbCb______________________________ __________________________CuCbCBCY______________________________ ________________________CbCbCbCYBrCB____________________________ ________________________CbCb____CYCE____________________________ ______________________CYCBCb____CYCYCb__________________________ ______________________CBCY________CECB__________________________ ____________________CbCYCu________CYCYCB________________________ ____________________CYCY____________CbCb________________________ __________________CYBrCB____________CbCBCE______________________ __________________CECY________________CbCE______________________ ________________CYCECb________________CBCECE____________________ ________________CbCY____________________CYCE____________________ ______________CbCbCb____________________CBCbCx__________________ ________________________________________________________________ ________________________________________________________________ } # tile 61 (magic trap) { ________________________________________________________________ ________________________________________________________________ __________________________CECxCbCbCYCx__________________________ ____________________CuCECECbCYCxCECuCbCECxCE____________________ __________________CBCbCYCb__CYCbCx____CbCBCxCE__________________ ______________CbCBCYCY______CuCbCY________CbCbCECY______________ ____________CBCbCu__________CECYCE____________CBCBCY____________ __________CECECb__________CYCECYCE______________CYCbCB__________ __________CBCx____________CYCYCbCYCb______________CbCE__________ ________CBCE______________CbCb__CbCu________________CbCb________ ______CbCYCu____________CbCYCY__CbCB________________CECYCb______ ______CuCbCbCuCbCuCBCbCYCbCxCbCuCbCuCYCECYBoCbCbCYCECYCYCY______ ______CbCuCuCECYCbCuCbCYCbCuCbCYCuCbCYCYCECYCBCbCYCYCbCBCB______ ____CuCbCxCxCxCb______CYCuCb______CuCE________CBCYCY____CBCb____ ____CxCb__CYCYCbCb____CYCb________CECu____CbCuCECb______CBCE____ ____CbCu______CxCuCb__CbCY________CYCBCYCYCbCYCY________CYCY____ ____CxCb________CYCuCYCBCu__________CbCBCYCE____________CECb____ ____CYCx__________CbCYCb__________CYCYCYCb______________CYCY____ ____CbCu____________CbCuCuCb____CBCYBoCY________________CECu____ ____CbCY__________CuCYCbCYCYCYCYCbCYCbCYCE______________CbCB____ ______CYCb________CYCb____CYCbCYCB____CYCY____________CECB______ ______CbCB________CYCE__CYCbCYCbCY____CBCE____________CECE______ ______CbCuCb____CYCYCYCYCbCY__CYCBCB__CBCbCE________CYCECY______ ________CbCu____CBCECYCbCY______CBCEBoBrCYCB________CBCb________ __________CbCb__CYCBCYCY__________CYCBCYCBCb______CECb__________ __________CbCECbCBCb__________________CbCECY____CECYCE__________ ____________CBCYCbCB____________________CBCbCYCECECb____________ ________________CYCYCBBr________________CECbCbCE________________ __________________CuCbCBCYCBCbCYCYCYCECBCYCbCY__________________ ________________________CECBCYCbCYCYCbCE________________________ ________________________________________________________________ ________________________________________________________________ } # tile 62 (anti-magic field) { ________________________________________________________________ ________________________________________________________________ ________________________________Cx______________________________ ______________________________CxCB______________________________ ______________________________CbCx______________________________ ______________________________CbCY______________________________ ______________________________CbCB____________CBCB______________ ______________________________CYCE________CECYCbCE______________ ______________________________CbCY____CECBCYCx__________________ ______________________________CbCbCuCECuCB______________________ ______________________________CuCbCBCx__________________________ __________________________CuCbCxCb______________________________ ______________________CbCbCbCuCYCY______________________________ __________________CuCbCYCu____CuCY______________________________ ______________CbCbCuCb________CYCb______________________________ ______________CxCY____________CYCb______________________________ ______________________________CECY______________________________ ______________________________CYCY______________________________ ______________________________CYCB______________________________ ______________________________CbCY______________________________ ______________________________CYCB______________________________ ______________________________CbCY______________________________ ______________________________CYCY______________________________ ______________________________BrCB______CYCBCYCbCBCb____________ ______________________________CYCE__CECBCYCbCBCbCYCECb__________ ______________________________CYCYCbCYCbBr________CYCECb________ ______________________________CbCECBCY______________CbCb________ ______________________________CECYCY__________________CbCE______ ______________________________CYCY______________________Cb______ ______________________________Cb________________________Cb______ ________________________________________________________________ ________________________________________________________________ } # tile 63 (polymorph trap) { ________________________________________________________________ ________________________________________________________________ __________________________CECxCbCbCYCBCE________________________ ____________________CuCECECbCYCxCYCbCBCYCBCbCu__________________ ____CY____________CBCbCYCb______________BrCBCYCY________________ ____CbCY______CbCBCYCY______________________CBCbCYCB____________ ____CYCB____CBCbCu____________________________CBCbCECb__________ ____CbCY__CECECb__________________________________CbCb__________ ____CYCY__CBCx______________________________________CuCb________ ____BrCBCBCE__CYCBCYCbCBCb__________________________CbCuCb______ ____CYCECYCECBCYCbCBCbCYCECb__________________________CBCb______ ____CYCYCbCYCbBr________CYCECb________________________CbCY______ ____CbCECBCY______________CbCb__________________________CYCb____ ____CECYCY__________________CbCE________________________CuCb____ ____CYCY______________________Cb________________________Cx______ ____Cb__________________________________________________________ __________________________________________________________Cb____ ______Cx________________________Cb______________________CYCY____ ____CbCu________________________CECb__________________CYCYCE____ ____CbCY__________________________CbCb______________CYCBCECb____ ______CYCb________________________CbCECY________BrCbCYCbCYCY____ ______CbCB__________________________CbCECYCbCBCbCYCBCECYCECY____ ______CbCuCb__________________________CbCBCbCYCBCY__CECBCBBr____ ________CbCu______________________________________CxCB__CYCY____ __________CbCb__________________________________CbCECE__CYCb____ __________CbCECbCB____________________________CuCbCB____CBCY____ ____________CBCYCbCB______________________CYCYCBCb______CYCb____ ________________CYCYCBBr______________CbCYCbCB____________CY____ __________________CuCbCBCYCBCbCYCxCYCbCECECu____________________ ________________________CECBCYCbCbCxCE__________________________ ________________________________________________________________ ________________________________________________________________ } # tile 70 (cmap / thrown boomerang, open left) { ________________________________________________________________ ________________________________________________________________ ________________________CyCyCc__________________________________ ______________________CyCcB$B$B$_A______________________________ ______________________CyB$CuCAB$Bs_A____________________________ ______________________CcB$CACuCfB$Bs_A__________________________ _______________________ABsB$CfCzCACABs_A________________________ _________________________BCACACACuCAB$Bs_A______________________ ___________________________ABsCACACuCfCAB$_A____________________ _____________________________BB$CACfCzCAB$Bs_A__________________ _______________________________ABsCACACuCACABs_A________________ _________________________________BBsCACACuCzB$Bs_A______________ ___________________________________BB$BsCfCfCACAB$_A____________ _____________________________________BCACACACuCACABi_A__________ _______________________________________BCyCACACuB$Bi_A_A________ ______________________________________CyCqCACuCABsBi_A_A________ ____________________________________CyCFCzCfCAB$Bi_B_A_A________ __________________________________CyCqCACuCfB$Bi_A_A_A__________ ________________________________CyCcB$CuCACABi_B_A_A____________ ______________________________CyCqCfCzCABsBi_A_A_A______________ ____________________________CyCcB$CuCfCABi_B_A_A________________ __________________________CqCqB$CuCACABi_A_A_A__________________ ________________________CyCcCzCfCAB$Bi_B_A_A____________________ ______________________CyCACACuCfB$Bi_A_A_A______________________ ______________________CcB$CuCACABi_A_A_A________________________ ______________________CFB$CABsBi_A_A_A__________________________ ________________________B$BiBi_A_A_A____________________________ ___________________________A_A_A_A______________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 71 (cmap / thrown boomerang, open right) { ________________________________________________________________ ________________________________________________________________ __________________________________CcCyCy________________________ _______________________________AB$B$B$CcCy______________________ _____________________________ABsB$CACuB$Cy______________________ ___________________________AB$CACfCuCAB$Cc______________________ _________________________ABsB$CACzCfCAB$_A______________________ _______________________ABsCACACuCACABs_A________________________ _____________________ABsB$CzCuCACABs_B__________________________ ___________________AB$CACACfCfCABs_A____________________________ _________________ABsB$CACuCACACA_B______________________________ _______________AB$CACfCuCACAB$_B________________________________ _____________ABsB$CACfCzCABs_B__________________________________ ___________ABiCACACuCACABs_A____________________________________ _________A_ABiB$CuCACACy_B______________________________________ _________A_ABiBsCACuB$CcCy______________________________________ _________A_A_ABiB$CACfCzCcCy____________________________________ ___________A_A_BBiCACfCuB$CqCy__________________________________ _____________A_A_ABiCACACuB$CFCy________________________________ _______________A_A_BBiB$CACfCzCqCy______________________________ _________________A_A_ABiCACfCuCACFCy____________________________ ___________________A_A_BBiCACACuB$CqCy__________________________ _____________________A_A_ABiBsCACfCzCcCy________________________ _______________________A_A_ABiCACfCuB$CFCy______________________ _________________________A_A_ABiCACACuCACq______________________ ___________________________A_A_ABiBsCAB$CF______________________ _____________________________A_A_ABiBiB$________________________ _______________________________A_A_A_A__________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 179 (warning 0) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________________________CP________________________________ ______________________________CP________________________________ __________________________CPCP_uCPCP____________________________ __________________CPCPCPCPAF_s_uAF_sCPCPCPCP____________________ __________CPCPCPCP_s_s_s_s_x_rBG_r_xAF_s_s_sCPCPCPCP____________ __________________CPCPCPCWAF_u_rAFAFCPCPCPCP____________________ __________________________CPCV_uCPCP____________________________ ______________________________CP________________________________ ______________________________CP________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 180 (warning 1) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________________________CP________________________________ ____________________________CPBGCP______________________________ ________________________CPCPBGCjBGCPCP__________________________ ______________CPCPCPCPCPC_BGCjCjCjC_BGCPCPCPCPCP________________ ____CPCPCPCPCP_qBGAnBGC_BfCjCjCjCjCjC_BGBGBGBG_qCPCPCPCPCP______ ______________CPCPCPCPCPBGC_CjCjCjBfC_CPCPBnCPCP________________ ________________________CPCPBfCjC_CPCP__________________________ ____________________________CPBGCP______________________________ ______________________________CP________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 181 (warning 2) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________________________CP________________________________ ______________________________CP________________________________ ____________________________CPCjCW______________________________ ____________________________CVCjCP______________________________ __________________________CPCfCzCfCV____________________________ ______________________CPCPCfCfCzCfCfCPCP________________________ ____________CPCPCPCPCPCjCfCfCfCzCzCfCfCjCPCPCPCPCP______________ ____CPCPCPCWCjCjCjCjCjCfCfCzCyCyCzCzCfCfCjCjCjCjCjCPCPCPCP______ ____________CVCWCPCVCPCjCfCfCzCzCzCfCfCjCWCVCPCWCV______________ ______________________CPCXCfCfCzCfCfCVCP________________________ __________________________CPCfCfCfCX____________________________ ____________________________CVCjCP______________________________ ____________________________CPCjCV______________________________ ______________________________CW________________________________ ______________________________CP________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 182 (warning 3) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________________________CP________________________________ ______________________________CP________________________________ ____________________________CPCzCP______________________________ ____________________________CPCfCP______________________________ ____________________________CPCzCP______________________________ __________________________CPCzCpCzCP____________________________ __________________________CPCzCpCzCP____________________________ ______________________CPCPCzCqCyCqCuCPCP________________________ ____________CPCPCPCPCPCzCzCqCyCZCyCyCzCzCPCPCPCPCP______________ ____CPCPCPCPCfCzCzCzCzCzCqCyCZCZCvCqCpCzCzCzCzCfCzCPCPCPCP______ ____________CPCPCPCPCPCzCzCqCyCZCyCyCzCzCPCPCPCPCP______________ ______________________CPCPCzCuCyCqCzCPCP________________________ __________________________CPCzCqCuCP____________________________ __________________________CPCzCqCzCP____________________________ ____________________________CPCzCP______________________________ ____________________________CPCfCP______________________________ ____________________________CPCzCP______________________________ ______________________________CP________________________________ ______________________________CP________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 183 (warning 4) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________________________CP________________________________ ______________________________CP________________________________ ______________________________CP________________________________ ____________________________CPCuCP______________________________ ____________________________CPCvCP______________________________ ____________________________CWCaCP______________________________ ____________________CPCP____CPCvCP____CPCP______________________ ____________________CPCvCPCWCaCaCaCPCPCvCP______________________ ______________________CPCaCvCaCaCvCaCvCV________________________ ______________________CVCvCaCvCwCvCaCaCP________________________ ____________CPCPCPCPCPCaCaCvCwCwCwCvCaCvCVCPCPCPCP______________ ____CPCPCPCPCuCvCaCvCaCvCaCwCwCwCwCwCaCaCaCvCaCvCuCPCPCPCP______ ____________CPCPCPCVCPCaCvCaCaCwCaCvCaCvCVCPCPCPCP______________ ______________________CWCaCaCvCwCvCaCaCP________________________ ______________________CPCvCaCaCaCaCvCaCW________________________ ____________________CPCvCPClCaCvCaCVCWCvCP______________________ ____________________CPCP____CWCaCW____CPCP______________________ ____________________________CVCvCP______________________________ ____________________________CPCvCP______________________________ ____________________________CPCuCP______________________________ ______________________________CP________________________________ ______________________________CP________________________________ ______________________________CP________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 184 (warning 5) { ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ______________________________CP________________________________ ______________________________CP________________________________ ______________________________CP________________________________ ______________________________CP________________________________ ____________________________CPCaCP______________________________ ________________CP__________CPCaCP__________CP__________________ __________________CPCP______CVBQCP______CPCP____________________ __________________CPCaCPCP__CPBQCV__CPCPCaCP____________________ ____________________CVBQBQCPBQBQBQCPBQBQCP______________________ ____________________CPBQBQBQBQ_pBQBQBQBQCV______________________ ______________________CPBQ_pBQ_pBQ_pBQCP________________________ ____________CPCPCPCPCPBQBQBQ_pBI_pBQBQBQCPCPCPCPCP______________ ____CPCPCPCPCaCaBQBQBQBQ_p_pBI_yBI_p_pBQBQCeBQCaCaCPCPCPCP______ ____________CPCPCPCPCPBQBQBQ_pBI_pBQBQBQCPCPCPCVCP______________ ______________________CPBQ_pBQ_pBQ_pBQCP________________________ ____________________CPBQBQBQBQ_pBQBQBQBQCP______________________ ____________________CPCaBQCPBQBQBQCPBQCaCP______________________ __________________CPBQCVCP__CPBQCP__CPCPBQCV____________________ __________________CPCW______CPCaCP______CWCP____________________ ________________CP__________CPBQCV__________CP__________________ ____________________________CVCaCP______________________________ ______________________________CP________________________________ ______________________________CP________________________________ ______________________________CP________________________________ ______________________________CP________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ ________________________________________________________________ } # tile 196 (sub gehennom walls 0) { CYCu_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_zCYCB CYAe_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_AAeCB AeCu_z_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_z_zCYAe CYCuCu_z_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_z_zCBCB CYCp_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_A_zCYCB CYCu_ABNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_z_zCBCB CBCu_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_A_zCYCYCB CYCu_z_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_z_z_zCBCB CYCp_z_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_zCYCB CYAe_z_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_zAeCB AeCu_z_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_zCYAe CYCuCu_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_zCBCB CYCp_z_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_zCYCB CYCu_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_z_zCBCB CBCu_z_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_$CYCYCB CYCu_z_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_z_zCBCB CYCp_z_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_z_zCYCB CYAe_z_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_zAeCB AeCu_z_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_zCBAe CYCuCu_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_zCYCB CYCpCu_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_z_zCYCB CYCu_z_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_z_zCBCB CBCu_z_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_zCYCYCB CYCu_z_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_zCYCBCB CYCp_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_A_zCYCB CYAe_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_zAeCB AeCu_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_zCBAe CYCu_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_zCYCB CYCpCu_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_zCYCB CYCu_z_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_zCYCBCB CBCu_zBNBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_A_z_zCYCB CYCu_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_zCBCB } # tile 197 (sub gehennom walls 1) { CBCBCBCBAeCBCBCBCBCBCBCBAeCBCBCBCBCBCBCBAeCBCBCBCBCBCBAeCBCBCBCB CBCYCBCYAeCBCYCBCYCBCYCBAeCYCBCYCBCYCBCYAeCBCYCBCYCBCYAeCBCYCBCY CY_z_z_z_z_zCYCB_z_z_z_z_z_z_z_z_z_zCY_A_z_z_z_z_zCY_A_z_z_z_z_z _z_zAq_z_z_z_z_z_zAqBN_z_z_zAqBNAq_z_z_z_z_zBNAq_z_z_z_z_z_zAqBN BNAqBNBNAq_zBNAqBNBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_zBNAqBNAqBN AqBNAqBNAqBNAqBNAqAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq BNAqBNAqBNAqBNAqBNBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN AqBNAqBNAqBNAqBNAqAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq BNAqBNAqBNAqBNAqBNBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN AqBNAqBNAqBNAqBNAqAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq BNAqBNAqBNAqBNAqBNBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN AqBNAqBNAqBNAqBNAqAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq BNAqBNAqBNAqBNAqBNBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN AqBNAqBNAqBNAqBNAqAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq BNAqBNAqBNAqBNAqBNBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN AqBNAqBNAqBNAqBNAqAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq BNAqBNAqBNAq_z_zBNAqBN_zAqBNAq_z_z_zBNAqBNAqBNAq_z_zBNAqBNAq_z_z _z_z_ABN_z_z_zCu_z_z_z_z_zBN_z_z_z_z_zAq_z_zBN_z_z_z_z_zBN_z_z_z CuCu_z_z_z_zCuCuCu_z_z_z_z_zCuCuCu_z_z_z_z_z_z_zCuCu_z_z_z_z_zCu CuCuCuCuAeCuCuCuCuCuCuCuAeCuCuCuCuCuCuCuAeCuCuCuCuCuCuCuAeCuCuCu CuCYCuCuAeCuCuCYCuCuCuCuAeCuCuCYCuCuCuCuAeCuCuCYCuCuCuCuAeCuCuCu CBCYCBCYAeCYCBCYCBCYCBCYAeCYCBCYCBCYCBCYAeCYCBCYCBCYCBCYAeCYCBCY CYCYCBCYAeAeCYCBCYCYCYCBAeCYCYCBCYCBCBCYAeCBCYCYCYCBCYCBAeCYCYCB BoCBCBCBAeCBCBCBCBCBCBAeAeBoCBCBCBCBBoCBAeAeCBCBCBBoCBCBAeBoCBCB AeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAe AeCBCBCBCBBoCBCBAeBoCBCBCBCBCBCBAeCBCBCBCBCBCBAqAeCBCBCBCBCBCBCB AeCBBoCBCBCBCBBoAeCBCBCBBoCBCBBoAeCBBoCBCBBoCBCBAeCBBoCBCBCBCBCB AeCBCBCBCBAqCBAeAeCBBoBNAqCBCBCBAeAqCBCBCBCBCBCBAeCBBNCBBoCBAqCB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB BoBoBNBoABBNBoBoBNBoBoBoABAqBoBNBoBoBoBNABBoBNBoBNBoBNBoABBoBNBo BoBNBoBoABBoBoBNBNAqBoBNABBoBoBoBNBNBNBoABBoBoAqBoBoAqBoABAqBNAq AqBNAqAeABAeAqBNAqBNAqBNABBNAqBNAqBNAqBNABAqBNAqBNAqBNAqABBNAqBN } # tile 198 (sub gehennom walls 2) { CBCBCBCBAeCBCBCBCBCBCBCBAeCBCBCBCBCBCBCBAeCBCBCBCBCBCBCBAeCBCBCB CYCBCBCBAeCYCBCYCBCBCYCBAeCYCBCYCBCYCBCYAeCBCYCBCYCBCBCBAeCYCBCY CYCYCBCY_z_zCY_z_z_z_A_z_z_z_z_zCYCB_z_z_z_z_z_z_z_zCY_z_z_z_z_z CBCu_zCY_z_z_z_ABNAqBNAqBNAq_z_z_z_z_z_zBNAqBN_z_z_z_z_zBNAq_z_z CYCu_z_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqAqBNAqBNAq CYCu_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNBNAqBNAqBN CYCpCu_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq CYCu_z_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN CBCu_z_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq CYAe_z_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN AeCu_z_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq CYCuCu_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN CYCp_z_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq CuCu_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN CYCp_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq CYCu_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN CYCp_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_ABNAq CYAe_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_z_z_z AeCu_z_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_z_z_z_z CYCuCu_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_z_zCYCB CYCpCu_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_z_zCBCB CYCu_z_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_zCuCBCB CBCu_z_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_zCuCBCB CYCu_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_z_zCBCB CYCp_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_z_zCYCB CYAe_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_z_zAeCB AeCu_z_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_ACYAe CYCu_z_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_zCBCB CYCpCu_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_zCBCB CYCu_z_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_zCuCBCB CBCu_z_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_z_zCYCB CYCu_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_zCBCB } # tile 199 (sub gehennom walls 3) { CBCBCBCBAeCBCBCBCBCBCYCBAeCBCBCBCYCBCBCBAeCBCBCBCBCBCBCBAeCBCBCB CBCYBoCYAeCBCYCBCYCBCYCBAeCYCBCYCBCBCBCYAeCBCYCBCBCBCYCYAeCBCBCB _zCYCY_A_z_z_z_zCY_z_z_z_z_z_z_zCYCB_z_z_z_z_z_z_z_z_z_z_zCYCBCB _z_A_z_zBN_z_z_z_z_z_zAqBNAq_z_z_z_z_z_zBN_zAqBN_z_zBN_z_ACYCBCB BNAqBNAqAqBNAqBNAq_zBNAqBNAqBNAq_z_zBNAqAqBNAqBNAqBNAqBN_z_zCYCB AqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqAqBN_ACYCB BNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_zCYCB AqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_z_zCBCB BNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqAq_zCYCB AqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNBN_zAeCB BNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_z_zCBAe AqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_z_zCYCB BNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_z_zCBCB AqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_zCYCBCB BNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqAq_zCYCB AqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNBN_zCBCB _zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_A_zCBCB _z_z_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_zAeCB _z_z_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_zCYAe CYCu_ABNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_z_zCYCBCB CYCp_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_zCYCBCYCB CBCYCu_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_z_zCBCY CYCu_z_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_zCYCB CuCu_z_ABNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_z_zCBCB CYCp_z_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_zCYCYCB CYAe_z_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_z_AAeCB AeCu_z_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_z_z_zCYAe CYCuCu_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_z_z_zCBCB CYCB_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_zCYCBCB CYCu_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_z_zCBCB CYCp_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_zCYCY CBCu_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_z_zCBCB } # tile 200 (sub gehennom walls 4) { CYCu_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq CBAe_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN AeCu_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq CYCu_z_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN CYCpCu_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq CYCuCu_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN CYCp_z_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq CYCu_z_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN CBCu_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN CYAe_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq AeCuCu_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq CYCu_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN CYCp_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq CYCu_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN CBCu_z_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN CYCuCu_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq CYCp_z_zAqBNAqBNAqBNAqBNAqBNAqBNAq_zBNAqBNAqBNAqBNAqBNAqBNAqBNAq CYAe_z_zAqBN_z_zBN_z_z_z_zBNAqBN_z_z_zAq_zBN_z_z_z_z_zBN_z_zAqBN AeCuCu_z_z_zCuCu_A_z_zCu_z_z_z_zCuCu_z_z_z_z_zCuCuCu_z_A_zCu_z_z CYCuCuAeAeCuCuCuCuCuCuCuAeCuCuCuCuCuCuCuAeCuCuCuCuCuCuCuAeCuCuCu CuCuCuCYAeCuCuCuCuCYCuCuAeCuCuCuCuCuCYCuAeCuCuCuCuCYCuCuAeCYCuCu CBCYCBCYAeCBCYCYCBCYCBCYAeCYCYCBCYCYCBCYAeCBCYCYCBCYCBCYAeCYCBCY CYCYCBCBAeCYCBCYCBCBCYCBAeCBCYCYCBCBCYCBAeCYCBCYCBCYCBCYAeCBCYCY CBCBCBCBAeCBCBCBCBBoCBCBAeCBBoCBCBCBCBCBAeCBCBCBBoCBCBCBAeCBCBCB AeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAe AeBNCBCBCBBoCBCBAeCBCBCBCBCBCBAeAeBoCBCBCBCBCBCBAeBNCBCBCBBoCBCB AeCBCBCBCBCBCBBoAeCBCBBoCBCBCBCBAeCBCBBoBoBoCBCBAeCBCBCBCBCBCBCB AeAeCBCBBNCBCBBoAeBNCBCBCBCBBoBNAeCBCBCBBoBoBNCBAeCBBoBoBNCBBoCB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB BNBNBoAqABBoBoBNBoBoBNBoABAqBoBNBoBoBNABABBNBNBoBoBoAqBoABBoBoBo AqBoBoBoABBNBoBoBNBNAqBoABBoBoBoBNBoBoBoABBNBoAqBoBNBoBoABBNBoAq ABAqBNAqABAqBNAqBNAqBNAqABAqAqBNAqBNAqAqABABBNAqBNAqBNAqABBNAqBN } # tile 201 (sub gehennom walls 5) { BNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_zCYCB AqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_z_AAeCB BNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_A_zCYCBAe AqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_z_zCYCB BNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqAq_zCYCB AqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNBN_zCBCB BNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_zCYCYCB BNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_z_zCBCB AqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_z_zCYCB BNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_z_zAeCB AqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_zCBCYAe AqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_z_zCYCBCB BNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_z_z_zCYCB BNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_z_zCBCB AqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_zCYCB BNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_zCBCB AqBN_zAqBNAqBNAq_z_zBNAqBNAqBN_zAqBNAqBNAqBNAq_zBNAqBNAq_zCYCYCB _zAq_z_z_z_zBN_z_zCu_z_zAqBN_z_z_z_zAqBN_z_z_z_zAqBN_z_z_z_AAeCB _z_zCu_z_z_z_zCu_zCuCu_z_z_z_zCuCu_z_z_z_z_zCuCu_z_zCu_z_zCYCBAe CuCuCuCuAeCuCuCuCuCuCuCuAeCuCuCuCuCuCuCuAeCuCuCuCuCuCuCuAeCuCuCY CYCuCuCuAeCuCYCpCuCYCuCuAeCYCuCuCuCuCuAeAeCuCuCYCuCuCYCuAeCuCYCB CBCYCBCYAeCYCBCYCBCYCBCYAeCBCYCBCYCYCBCYAeCYCBCYCBCYCBCYAeCYCBCY CYCYCBCBAeCYCYCYCBCYCBCYAeCYCYCBCYCBCBCYAeCBCBCYCBCBCYCBAeCYCYCB BoCBCBAeAeCBBoCBBoCBCBAeAeBoCBCBCBCBBoCBAeCBCBCBCBCBCBAeAeBoCBBN AeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAe AeCBCBCBCBCBCBBNAeCBCBCBCBCBCBCBAeAeCBBoCBCBBoCBAeCBCBCBBNCBCBAq AeCBBoCBCBBoCBCBAeCBBoCBCBCBBoAeAeCBBoCBCBCBCBCBAeBoCBCBBoCBCBBN AeBoCBCBCBCBBoAqAeAqCBCBBNCBBoBoAeCBCBBNCBCBBNCBAeAeCBBNCBCBBoAq ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB BoAqBNBNABAqBoBoBNBoBoBoABBNBoBNBoBNBoBoABBoBNBoBoBNBoBoABBoBNBN BoBNBoBoABBoBNBNAqBNBNBoABBoBoBoAqBoBoBNABBNBoBNBoBoBNBNABBNBoAq AqBNAqAeABAqBNAqBNAqBNAqABAeAqBNAqBNAqBNABAeBNAqBNAqBNAqABBNAqBN } # tile 202 (sub gehennom walls 6) { CYCu_z_z_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_zCYCBCB CBAe_z_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_z_zCB CY_z_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_z_z _zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_z_z BNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq AqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN BNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq AqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN BNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq AqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN BNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq AqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN BNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq AqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN BNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq AqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN BNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq _zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_z _z_z_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_z_z_z CYCu_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_zCYCB CYCp_z_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_ACYBoCB CYCuCu_$AqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_zCBCYCB CuCu_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_z_zCYCB CYCu_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_zCYCB CYCp_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_zCBCB CYAe_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_z_zAeCB AeCu_z_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_z_zCYAe CYCuCu_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_z_zCBCB CYCBCu_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_zCYCYCB CYCu_z_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_zBoCY CYCp_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_$CBCB CYCu_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_zCBCB } # tile 203 (sub gehennom walls 7) { CYCY_z_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_z_zCYCB CYCB_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_zCBCY _z_z_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_z_z_z _z_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_z BNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq AqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN BNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq AqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN BNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq AqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN BNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq AqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN BNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq AqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN BNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq AqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN BNAqBNAq_z_z_zBNAqBNAqBNAqBNAqBN_zAqBNAqBNAqBNAq_z_z_z_z_zAqBNAq Aq_z_z_z_zCu_z_ABN_z_zAqBN_z_z_z_z_z_zBN_z_z_z_z_z_z_z_z_z_z_zBN _z_zCu_z_zCuCu_z_z_zCu_z_z_z_zCuCu_z_z_z_z_zCu_z_zCuCu_z_zCu_z_z CuCuCuCuAeCuCuCuCuCuCuCuAeCuCuCuCuCuCuCuAeCuCuCuCuCuCuCuAeCuCuCu CuCuCYCuAeCYCuCuCuCuCYCuAeCuCuCuCYCuCuCuAeCuCuCYCBCuCuCuAeCuCYCu CYCBCYCBAeCYCBCYCYCBCYCBAeCYCYCBCYCBCYCBAeCYCYCBCYCYCBCYAeCYCBCY CYCYCBCYAeCBCYCBCBCYCBAeAeCBCBCBCYCYCBCYAeCBCBCYCBCYCYCBAeCBCBCY CBCBBoAeAeCBCBCBCBCBCBCBAeCBCBCBBoCBCBCBAeAeCBCBCBCBBoCBAeCBCBCB AeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAeAe AeAeCBCBCBCBCBCBAeCBCBCBAeCBCBCBAeAeCBCBCBCBCBBoAeBNCBCBCBBNCBCB AeCBCBBoCBBoCBBNAeCBBoCBCBBoCBCBAeCBBoCBCBBoCBCBAeCBCBCBCBCBCBCB AeBNCBCBCBCBBoBoAeCBBoCBCBCBCBBNAeCBCBBNBoCBCBBNAeAeCBBNCBCBBNBo ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB BoBoBoABABBNBoBNBoAqBoBNABBoBNBoBoBoBNBNABBoBNBoBoBNBoABABBoBNBo BoAqBoBNABBoBoBoBNBoBoABABBoBoAqBoAqBoBoABBoBoAqBoBoBoBNABBNBoBN AqBNAqBNABBNAqAqBNAqBNAqABAqBNAqBNAqBNAqABAqBNAqBNAqAqBNABAqAqBN } # tile 204 (sub gehennom walls 8) { CBCBCBCBAeCYCBCBCBCBCBCBAeCBCBCBCBCBCYCBAeCBCBCYCBCBCBCBAeCBCBCB CBCBCYCBAeCYCBCYCBCBCBCYAeCBCYBoCYCBCYCBAeCBCYCBCBBoCYCBAeCYCBCY CY_z_A_z_z_z_zCYCB_z_z_z_z_z_z_zCYCB_z_z_z_z_z_z_z_zCY_z_z_z_zCY _z_zAqBNAq_z_z_z_z_z_zAqBN_z_z_z_z_z_z_z_z_z_zAqBN_z_z_z_z_zAq_z BNAqBNAqBNAqBNAqBNAq_$_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN AqBNAqBNBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq BNAqBNAqAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN AqBNAqBNBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq BNAqBNAqAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN AqBNAqBNBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq BNAqBNAqAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN AqBNAqBNBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq BNAqBNAqAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN AqBNAqBNBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq BNAqBNAqAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN AqBNAqBNBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq BNAqBNAqAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN _z_zBNAqBNBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_z_z _z_z_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_z_z_z_z CuCu_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_z_zCYCB CYCp_z_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_zCBCB CYCuCu_z_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_zCYCYCB CYCp_z_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_zCYBoCB CBCY_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_z_z_zCYCB CYCu_z_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_A_z_zCBCY CYAe_z_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_z_zAeCB AeCu_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_A_zCYAe CYCu_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_zCBCB CYCp_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_zCYCB CBCBCu_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_z_zCBCY CuCuCu_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_zCYCBCY CYCu_z_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_z_zCBCB } # tile 205 (sub gehennom walls 9) { CYCu_z_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_zCYCB CBAe_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_AAeCB _z_z_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_z_zCYAe _zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_z_zCBCB BNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_z_zCYCYCB BNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_zCBCYCB AqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_zCYCBCB BNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_z_zCBCB AqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_z_zCYCB BNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_AAeCB AqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_zCYAe BNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_z_zBoCB AqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_z_zCYCB BNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_zCYCBCB AqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_z_zCYCBCB BNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_z_z_zCBCB AqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_z_zCYCB _z_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_z_zAeCB _z_z_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_z_zCYAe CYCu_z_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_z_zCBCB CYCBCu_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_zCYCB CYCu_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_z_zCBCY CYCp_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_zCYCYCB CuCuCu_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_zCYBoCB CYCuCu_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_z_zCYCB CBAe_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_AAeCB AeCu_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_zCYAe CYCu_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_zCBCB CYCB_z_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_zCBCB CYCuCu_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_ACYCBCB CuCuCu_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_zCYCYCB CYCu_z_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_z_ACYCB } # tile 206 (sub gehennom walls 10) { CYCu_z_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_z_zCBCB CYAe_ABNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_z_zAeCB Ae_z_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_z_z_z CYCu_z_z_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_z_z CYCBCu_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq CYCu_z_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN CuCu_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN CuCu_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq CYCu_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN CBAe_z_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq AeCu_z_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN CuCu_z_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq CYCuCu_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN CBCYCu_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq CYCp_z_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN CuCu_z_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq CYCu_z_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN CYAe_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_z AeCu_z_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_z_z_z CYCu_z_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_z_zCBCB CuCu_z_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_zCYCYCB CuCuCu_z_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_ACYCBCY CYCBCu_z_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_ACBCB CYCu_z_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_zCBCB CYCp_z_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_zBN_zCYCB CYAe_z_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_z_z_AAeCB AeCu_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_z_z_zCYAe CYCu_z_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_zCYCBCB CYCBCu_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqAq_zCYCB CYCu_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_zCYCY CuCu_zBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBN_z_ACYBo CYCu_zAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAqBNAq_z_zCYCB } # tile 207 (sub knox walls 0) { _A_ABiBiBiBiBiBi_A_A_A_A_A_ACyCyBiBi_A_A_A_A_A_ABiBiBiBiBiBi_A_A _A_ABiBiBiBiBiBi_A_A_A_A_ACyCyCyBiBiBi_A_A_A_A_ABiBiBiBiBiBi_A_A _A_ABiBiBiBiBiBi_A_A_A_A_ACyC2C2BiBiBi_A_A_A_A_ABiBiBiBiBiBi_A_A _A_ABiBiBiBiBiBi_A_A_ACyCyC2C2C2BiBiBiBiBi_A_A_ABiBiBiBiBiBi_A_A _A_ABiBiBiBiBiBi_A_A_ACyC2C2C2CyCACABiBiBi_A_A_ABiBiBiBiBiBi_A_A _A_A_ABiBiBiBi_A_A_ACyC2C2C2CyCACACABiBiBiBi_A_A_ABiBiBiBi_A_A_A _A_A_A_A_A_A_A_A_A_AC2CyC2CyCACACABiBiBiBiBi_A_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_A_A_A_AC2CyCACACABiBiBiBiBi_A_A_A_A_A_A_A_A_A_A_A _A_A_A_ABiBi_A_A_A_A_A_ACACyCACyBiBiBiBiBi_A_A_A_A_ABiBi_A_A_A_A _A_A_A_ABiBiBi_A_A_A_A_A_ACACyCyBiBiBi_A_A_A_A_A_A_ABiBiBi_A_A_A _A_A_ACyBiBiBi_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_ACyBiBiBi_A_A_A _A_ACyBiBiBiBiBi_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_ACyBiBiBiBiBi_A_A _A_ABiBiBiBiBiBi_A_A_A_A_A_A_ACyBi_A_A_A_A_A_A_ABiBiBiBiBiBi_A_A _A_ABiBiBiBiBiBi_A_A_A_A_ACyCyCyBiBiBi_A_A_A_A_ABiBiBiBiBiBi_A_A _A_ABiBiBiBiBiBi_A_A_A_A_ACyC2C2BiBiBi_A_A_A_A_ABiBiBiBiBiBi_A_A _A_A_ABiBiBiBi_A_A_A_ACyCyC2C2C2BiBiBiBiBi_A_A_A_ABiBiBiBi_A_A_A _A_A_A_A_A_A_A_A_A_ACyCyC2C2C2CyCABiBiBiBiBi_A_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_A_A_ACyCyC2C2CyCyCACABiBiBiBi_A_A_A_A_A_A_A_A_A_A _A_A_A_ABiBi_A_A_A_A_ACyCyCyCyCyCACABiBiBi_A_A_A_A_ABiBi_A_A_A_A _A_A_A_ABiBiBi_A_A_A_A_A_ACyCyCyCACABi_A_A_A_A_A_A_ABiBiBi_A_A_A _A_A_ACyBiBiBi_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_ACyBiBiBi_A_A_A _A_ACyBiBiBiBiBi_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_ACyBiBiBiBiBi_A_A _A_ABiBiBiBiBiBi_A_A_A_A_A_A_ACyBi_A_A_A_A_A_A_ABiBiBiBiBiBi_A_A _A_ABiBiBiBiBiBi_A_A_A_A_ACyCyCyBiBiBi_A_A_A_A_ABiBiBiBiBiBi_A_A _A_ABiBiBiBiBiBi_A_A_A_A_ACyC2C2BiBiBi_A_A_A_A_ABiBiBiBiBiBi_A_A _A_A_ABiBiBiBi_A_A_A_ACyCyC2C2C2BiBiBiBiBi_A_A_A_ABiBiBiBi_A_A_A _A_A_A_A_A_A_A_A_A_ACyCyC2C2C2CyCABiBiBiBiBi_A_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_A_A_ACyCyC2C2CyCACyCABiBiBiBi_A_A_A_A_A_A_A_A_A_A _A_A_A_ABiBi_A_A_A_A_ACyCyCyCACACACyBiBiBi_A_A_A_A_ABiBi_A_A_A_A _A_A_A_ABiBiBi_A_A_A_A_A_ACyCACACyCyBi_A_A_A_A_A_A_ABiBiBi_A_A_A _A_A_ACyBiBiBi_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_ACyBiBiBi_A_A_A _A_ACyCyBiBiBiBi_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_ACyCyBiBiBiBi_A_A } # tile 208 (sub knox walls 1) { _A_ABiBi_A_A_A_A_A_ABiBi_A_A_A_A_A_ACACA_A_A_A_A_A_ABiBi_A_A_A_A _ABiBiBiBi_A_A_A_A_ABiBiBi_A_A_A_A_ACACA_A_A_A_A_A_ABiBiBi_A_A_A BiBiBiBiBi_A_A_A_A_A_A_ABiBi_A_A_ABiBiBiBi_A_A_A_A_A_A_ABiBi_A_A BiBiBiBiBiBi_A_A_A_A_A_ABiBi_A_ABiBiBiBiBiBi_A_A_A_A_A_ABiBi_A_A BiBiBiBiBiBi_A_A_ACyBi_A_A_A_A_ABiBiBiBiBiBi_A_A_ACyBi_A_A_A_A_A BiBiBiBiBi_A_ACyCyCyBiBi_A_A_A_ABiBiBiBiBi_A_ACyCyCyBiBi_A_A_A_A _A_A_A_A_A_A_ACyC2C2BiBiBi_A_A_ABiBiBiBiBi_A_ACyC2C2BiBiBi_A_A_A _A_A_A_A_ACyCyC2C2C2BiBiBiBi_A_A_ABiBi_A_ACyCyC2C2C2BiBiBiBiBi_A _A_A_A_ACyCyC2C2C2CyCABiBiBiBiBiBi_A_A_ACyCyC2C2C2CyCABiBiBiBiBi _A_A_A_ACyCyC2C2CyCyCACABiBiBiBi_A_A_A_ACyCyC2C2CyCyCACABiBiBiBi _A_A_A_A_ACyCyCyCyCyCACABiBiBi_A_A_A_A_A_ACyCyCyCyCyCACABiBiBi_A _A_A_A_A_A_A_ACyCyCyCABiBi_A_A_A_A_A_A_A_A_A_ACyCyCyCABiBi_A_A_A _A_ABiBi_A_A_A_A_A_ABiBi_A_A_A_A_A_ABiBi_A_A_A_A_A_ABiBi_A_A_A_A _A_ABiBiBi_A_A_A_A_ABiBi_A_A_A_A_A_ABiBiBi_A_A_A_A_ABiBi_A_A_A_A CACABiBiBi_A_A_A_ACyBiBiBi_A_A_A_ACABiBiBi_A_A_A_ACyBiBiBi_A_A_A CACABiBiBiBi_A_ACyCyBiBiBiBi_A_ACACABiBiBiBi_A_ACyCyBiBiBiBi_A_A CACABiBiBiBi_A_ACACABiBiBiBi_A_ACACABiBiBiBi_A_ACyCyBiBiBiBi_A_A CACABiBiBiBi_A_ACACABiBiBi_A_A_ACACABiBiBiBi_A_ACyCyBiBiBi_A_A_A CACABiBiBiBi_A_ACyCyBiBiBi_A_A_ACACABiBiBiBi_A_ACACABiBi_A_A_A_A CACABiBiBiBi_A_ACyCyBiBi_A_A_A_ACACABiBiBiBi_A_ACACABiBi_A_A_A_A CyCyBiBiBiBi_A_ACyCyBiBi_A_A_A_ACyCyBiBiBiBi_A_ACACABiBiBi_A_A_A CyCyBiBiBi_A_A_ACyCyBiBiBi_A_A_ACyCyBiBiBiBi_A_ACACABiBiBiBi_A_A CACABiBiBi_A_A_ACyCyBiBiBi_A_A_ACyCyBiBiBiBi_A_ACyCyBiBiBiBi_A_A CACABiBi_A_A_A_ACyCyBiBiBiBi_A_ACyCyBiBiBi_A_A_ACyCyBiBiBiBi_A_A CyCyBiBi_A_A_A_ACyCyBiBiBiBi_A_ACyCyBiBi_A_A_A_ACACABiBiBiBi_A_A CyCyBiBiBi_A_A_ACyCyBiBiBiBi_A_ACyCyBiBi_A_A_A_ACACABiBiBi_A_A_A CACABiBiBi_A_A_ACACABiBiBiBi_A_ACACABiBiBi_A_A_ACyCyBiBi_A_A_A_A CACABiBiBiBi_A_ACACABiBiBiBi_A_ACACABiBiBiBi_A_ACyCyBiBi_A_A_A_A CACABiBiBiBi_A_ACyCyBiBiBiBi_A_ACyCyBiBiBiBi_A_ACyCyBiBiBiBi_A_A CACABiBiBi_A_A_A_ACyBiBiBi_A_A_A_ACyBiBiBi_A_A_A_ACyBiBiBiBi_A_A _A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A } # tile 209 (sub knox walls 2) { _A_A_A_A_A_A_A_A_A_A_A_ACACACyCyBiBiCACA_A_A_A_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_A_A_A_ACACACyCyCyBiCABiCA_A_A_A_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_A_ACACACACACyC2C2CABiCABiCyCyCA_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_ACACACACACyCyC2C2C2CACABiBiBiCyCACACA_A_A_A_A_A_A_A _A_A_A_A_ACACACACACyCyCyC2C2C2CyCACABiBiBiBiCACACACACA_A_A_A_A_A _A_A_A_ACACACACACyCyCyC2C2C2CyCyCACABiBiBiBiBiCACACACACACA_A_A_A _A_A_ACyCACACACACyCyC2C2C2CyCyCyCACABiBiBiBiBiBiCyCACACACA_A_A_A _A_ACyCACACACACyCyCyC2C2CyCyCyCACABiBiBiBiBiBiBiBiCyCACACACA_A_A _A_ACACACACACACyCyCyCyCyCyCACACACABiBiBiBiBiBiBiBiBiCACACyCy_A_A _A_ACACACACyCyCyCyCyCyCyCACACACABiBiBiBiBiBiBiBiBiBiBiCACyCy_A_A _A_ACyCyCyCyCyCyCyCyCyCyCACACA_A_A_ABiBiBiBiBiBiBiBiBiCACACA_A_A _A_ACyCyCyCyCyCyCyCyCyCACA_A_A_A_A_A_ABiBiBiBiBiBiBiBiBiBiCA_A_A _A_ABiBiBiCyCyCyCyCACACACA_A_ACyBi_A_A_ABiBiBiBiBiBiBiBiBiBi_A_A _A_ABiBiBiBiBiCyCACACA_A_ACyCyCyBiBi_A_A_ABiBiBiBiBiBiBiBiBi_A_A _A_ABiBiBiBiBiBi_A_A_A_A_ACyC2C2BiBiBi_A_A_A_ABiBiBiBiBiBiBi_A_A _A_A_ABiBiBiBi_A_A_A_ACyCyC2C2C2BiBiBiBi_A_A_A_A_ABiBiBiBi_A_A_A _A_A_A_A_A_A_A_A_A_ACyCyC2C2C2CyCABiBiBiBiBi_A_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_A_A_ACyCyC2C2CyCyCACABiBiBiBi_A_A_A_A_A_A_A_A_A_A _A_A_A_ABiBi_A_A_A_A_ACyCyCyCyCyCACABiBiBi_A_A_A_A_ABiBi_A_A_A_A _A_A_A_ABiBiBi_A_A_A_A_A_ACyCyCyCACABi_A_A_A_A_A_A_ABiBiBi_A_A_A _A_A_ACyBiBiBi_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_ACyBiBiBi_A_A_A _A_ACyBiBiBiBiBi_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_ACyBiBiBiBiBi_A_A _A_ABiBiBiBiBiBi_A_A_A_A_A_A_ACyBi_A_A_A_A_A_A_ABiBiBiBiBiBi_A_A _A_ABiBiBiBiBiBi_A_A_A_A_ACyCyCyBiBiBi_A_A_A_A_ABiBiBiBiBiBi_A_A _A_ABiBiBiBiBiBi_A_A_A_A_ACyC2C2BiBiBi_A_A_A_A_ABiBiBiBiBiBi_A_A _A_A_ABiBiBiBi_A_A_A_ACyCyC2C2C2BiBiBiBiBi_A_A_A_ABiBiBiBi_A_A_A _A_A_A_A_A_A_A_A_A_ACyCyC2C2C2CyCABiBiBiBiBi_A_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_A_A_ACyCyC2C2CyCACyCABiBiBiBi_A_A_A_A_A_A_A_A_A_A _A_A_A_ABiBi_A_A_A_A_ACyCyCyCACACACyBiBiBi_A_A_A_A_ABiBi_A_A_A_A _A_A_A_ABiBiBi_A_A_A_A_A_ACyCACACyCyBi_A_A_A_A_A_A_ABiBiBi_A_A_A _A_A_ACyBiBiBi_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_ACyBiBiBi_A_A_A _A_ACyCyBiBiBiBi_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_ACyCyBiBiBiBi_A_A } # tile 210 (sub knox walls 3) { _A_A_A_A_A_A_A_A_A_A_A_ACACACyCyBiBiCACA_A_A_A_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_A_A_A_ACACACyCyCyBiCACACACA_A_A_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_A_ACACACACACyC2C2CACACACACACACA_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_ACACACACACyCyC2C2C2CACACACACACACACACA_A_A_A_A_A_A_A _A_A_A_A_ACACACACACyCyCyC2C2C2CyCACACABiBiBiCyCACACACA_A_A_A_A_A _A_A_A_ACACACACACyCyCyC2C2C2CyCyCACABiBiBiBiBiCyCACACACACA_A_A_A _A_A_ACyCACACACACyCyC2C2C2CyCyCyCACABiBiBiBiBiBiCACACyCyCA_A_A_A _A_ACyCACACACACyCyCyC2C2CyCyCyCACABiBiBiBiBiBiBiBiCACyCyCACA_A_A _A_ACACACACACACyCyCyCyCyCACACACACABiBiBiBiBiBiBiBiCACACACACA_A_A _A_ACACACACyCyCyCyCyCyCACACACACABiBiBiBiBiBiBiBiBiBiBiCACACA_A_A _A_ACACACACyCyCyCyCyCACACACy_A_A_A_ABiBiBiBiBiBiBiBiBiBiCyCy_A_A _A_ACACACyCyCyCyCyCACACACy_ACy_A_A_A_ABiBiBiBiBiBiBiBiBiBiCy_A_A _A_ABiBiBiCyCyCyCyCACACA_A_A_ACyBi_A_A_ABiBiBiBiBiBiBiBiBiBi_A_A _A_ABiBiBiBiBiCyCACACA_A_A_ACyCyBiBi_A_A_ABiBiBiBiBiBiBiBiBi_A_A _A_ABiBiBiBiBiBi_A_A_A_A_ACyC2C2BiBiBi_A_A_A_ABiBiBiBiBiBiBi_A_A _A_A_ABiBiBiBi_A_A_A_ACyCyC2C2C2BiBiBiBi_A_A_A_A_ABiBiBiBi_A_A_A _A_A_A_A_A_A_A_A_A_ACyCyC2C2C2CyCABiBiBiBiBi_A_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_A_A_ACyCyC2C2CyCyCACABiBiBiBi_A_A_A_A_A_A_A_A_A_A _A_A_A_ABiBi_A_A_A_A_ACyCyCyCyCyCACABiBiBi_A_A_A_A_ABiBi_A_A_A_A _A_A_A_ABiBiBi_A_A_A_A_A_ACyCyCyCACABi_A_A_A_A_A_A_ABiBiBi_A_A_A _A_A_ACyBiBiBi_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_ACyBiBiBi_A_A_A _A_ACyBiBiBiBiBi_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_ACyBiBiBiBiBi_A_A _A_ABiBiBiBiBiBi_A_A_A_A_A_A_ACyBi_A_A_A_A_A_A_ABiBiBiBiBiBi_A_A _A_ABiBiBiBiBiBi_A_A_A_A_ACyCyCyBiBiBi_A_A_A_A_ABiBiBiBiBiBi_A_A _A_ABiBiBiBiBiBi_A_A_A_A_ACyC2C2BiBiBi_A_A_A_A_ABiBiBiBiBiBi_A_A _A_A_ABiBiBiBi_A_A_A_ACyCyC2C2C2BiBiBiBiBi_A_A_A_ABiBiBiBi_A_A_A _A_A_A_A_A_A_A_A_A_ACyCyC2C2C2CyCABiBiBiBiBi_A_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_A_A_ACyCyC2C2CyCACyCABiBiBiBi_A_A_A_A_A_A_A_A_A_A _A_A_A_ABiBi_A_A_A_A_ACyCyCyCACACACyBiBiBi_A_A_A_A_ABiBi_A_A_A_A _A_A_A_ABiBiBi_A_A_A_A_A_ACyCACACyCyBi_A_A_A_A_A_A_ABiBiBi_A_A_A _A_A_ACyBiBiBi_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_ACyBiBiBi_A_A_A _A_ACyCyBiBiBiBi_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_ACyCyBiBiBiBi_A_A } # tile 211 (sub knox walls 4) { _A_A_A_A_A_A_A_A_A_A_A_ACACACyCyCACACyCy_A_A_A_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_A_A_A_ACACACyCyCyCACACyCy_A_A_A_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_A_ACyCACACACyC2C2CACABiBiCACACA_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_ACyCACACACyC2C2C2CACABiBiBiCACACACA_A_A_A_A_A_A_A _A_A_A_A_ACACACACACACACyC2C2C2CyCACACACACABiCyCACACACA_A_A_A_A_A _A_A_ACACACACACACACACyC2C2C2CyCyCACACACABiBiBiCyCACACACACA_A_A_A _A_A_ACACyCyCACACACyC2C2C2CyCyCyCACACABiBiBiBiBiCACACyCyCA_A_A_A _A_ACACACyCyCACACyCyC2C2CyCyCyCACABiBiBiBiBiBiBiBiCACyCyCACA_A_A _A_ACACACACACACyCyCyCyCyCyCACACACABiBiBiBiBiBiBiBiCACACACACA_A_A _A_A_ACACACACyCyCyCyCyCyCACACABiBiBiBiBiBiBiBiBiBiBiCACACACA_A_A _A_A_A_ACyCyCyCyCyCyCy_ACACACABiBiBi_A_ABiBiBiBiBiBi_A_ACyCy_A_A _A_A_A_A_ACyCyCyCy_A_A_A_ACABiBiBi_A_A_A_ABiBiBiBi_ABi_ACyCy_A_A _A_ABiBi_ACyCyCy_A_ABiBi_A_ABiBi_A_ABiBi_A_ABiBi_A_ABiBi_A_A_A_A _A_ABiBiBi_ACyCy_A_ABiBi_A_ABiBi_A_ABiBi_A_ABiBi_A_ABiBiBi_A_A_A CACABiBiBi_A_ACy_ACyBiBiBi_ABi_A_ACABiBiBi_ABi_A_ACyBiBiBi_A_A_A CACABiBiBiBi_A_ACyCyBiBiBiBi_A_ACACABiBiBiBi_A_ACyCyBiBiBiBi_A_A CyCyBiBiBiBi_A_ACACABiBiBiBi_A_ACyCyBiBiBiBi_A_ACyCyBiBiBiBi_A_A CyCyBiBiBiBi_A_ACACABiBiBi_A_A_ACyCyBiBiBiBi_A_ACyCyBiBiBi_A_A_A CACABiBiBiBi_A_ACyCyBiBiBi_A_A_ACACABiBiBiBi_A_ACACABiBi_A_A_A_A CACABiBiBiBi_A_ACyCyBiBi_A_A_A_ACACABiBiBiBi_A_ACACABiBi_A_A_A_A CyCyBiBiBiBi_A_ACyCyBiBi_A_A_A_ACyCyBiBiBiBi_A_ACACABiBiBi_A_A_A CyCyBiBiBi_A_A_ACyCyBiBiBi_A_A_ACyCyBiBiBiBi_A_ACACABiBiBiBi_A_A CACABiBiBi_A_A_ACyCyBiBiBi_A_A_ACyCyBiBiBiBi_A_ACyCyBiBiBiBi_A_A CACABiBi_A_A_A_ACyCyBiBiBiBi_A_ACyCyBiBiBi_A_A_ACyCyBiBiBiBi_A_A CyCyBiBi_A_A_A_ACyCyBiBiBiBi_A_ACyCyBiBi_A_A_A_ACACABiBiBiBi_A_A CyCyBiBiBi_A_A_ACyCyBiBiBiBi_A_ACyCyBiBi_A_A_A_ACACABiBiBi_A_A_A CACABiBiBi_A_A_ACACABiBiBiBi_A_ACACABiBiBi_A_A_ACyCyBiBi_A_A_A_A CACABiBiBiBi_A_ACACABiBiBiBi_A_ACACACABiBiBi_A_ACyCyBiBi_A_A_A_A CACABiBiBiBi_A_ACyCyBiBiBiBi_A_ACACACABiBiBi_A_ACyCyBiBiBiBi_A_A CACABiBiBi_A_A_A_ACyBiBiBi_A_A_A_ACACACABi_A_A_A_ACyBiBiBiBi_A_A _A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A } # tile 212 (sub knox walls 5) { _A_A_A_A_A_A_A_A_A_A_A_ACACACyCyBiBiCACA_A_A_A_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_A_A_A_ACACACyCyCyBiCACACACA_A_A_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_A_ACyCACACACyC2C2CACACACACACACA_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_ACyCACACACyC2C2C2CACACACACACACACACA_A_A_A_A_A_A_A _A_A_A_A_ACACACACACACACyC2C2C2CyCACACABiBiBiCyCACACACA_A_A_A_A_A _A_A_ACACACACACACACACyC2C2C2CyCyCACABiBiBiBiBiCyCyCACACACA_A_A_A _A_A_ACACyCyCACACACyC2C2C2CyCyCyCACABiBiBiBiBiCyCyCACACACA_A_A_A _A_ACACACyCyCACACyCyC2C2CyCyCyCACABiBiBiBiBiBiBiBiCyCACACACA_A_A _A_ACACACACACACyCyCyCyCyCyCACACACABiBiBiBiBiBiBiBiBiCACACyCy_A_A _A_A_ACACACACyCyCyCyCyCyCACACABiBiBiBiBiBiBiBiBiBiBiCACACyCy_A_A _A_A_A_ACyCyCyCyCyCyCy_ACACACABiBiBi_A_ABiBiBiBiBiBi_ACACACA_A_A _A_A_A_A_ACyCyCyCy_A_A_A_ACABiBiBi_A_A_A_ABiBiBiBi_ABi_ACACA_A_A _A_ABiBi_ACyCyCy_A_ABiBi_A_ABiBi_A_ABiBi_A_ABiBi_A_ABiBi_A_A_A_A _A_ABiBiBi_ACyCy_A_ABiBi_A_ABiBi_A_ABiBi_A_ABiBi_A_ABiBiBi_A_A_A CACABiBiBi_A_ACy_ACyBiBiBi_ABi_A_ACABiBiBi_ABi_A_ACyBiBiBi_A_A_A CACABiBiBiBi_A_ACyCyBiBiBiBi_A_ACACACABiBiBi_A_ACyCyBiBiBiBi_A_A CyCyBiBiBiBi_A_ACACABiBiBiBi_A_ACACACACABiBi_A_ACyCyBiBiBiBi_A_A CyCyBiBiBiBi_A_ACACABiBiBi_A_A_ACACACACABiBi_A_ACyCyBiBiBi_A_A_A CACABiBiBiBi_A_ACyCyBiBiBi_A_A_ACACACABiBiBi_A_ACACABiBi_A_A_A_A CACABiBiBiBi_A_ACyCyBiBi_A_A_A_ACACABiBiBiBi_A_ACACACABi_A_A_A_A CyCyBiBiBiBi_A_ACyCyBiBi_A_A_A_ACyCyBiBiBiBi_A_ACACACACABi_A_A_A CyCyBiBiBi_A_A_ACyCyBiBiBi_A_A_ACyCyBiBiBiBi_A_ACACACACABiBi_A_A CACABiBiBi_A_A_ACyCyBiBiBi_A_A_ACyCyBiBiBiBi_A_ACyCyBiBiBiBi_A_A CACABiBi_A_A_A_ACyCyBiBiBiBi_A_ACyCyBiBiBi_A_A_ACyCyBiBiBiBi_A_A CyCyBiBi_A_A_A_ACyCyBiBiBiBi_A_ACyCyBiBi_A_A_A_ACACABiBiBiBi_A_A CyCyBiBiBi_A_A_ACyCyBiBiBiBi_A_ACyCyBiBi_A_A_A_ACACABiBiBi_A_A_A CACABiBiBi_A_A_ACACABiBiBiBi_A_ACACABiBiBi_A_A_ACyCyBiBi_A_A_A_A CACABiBiBiBi_A_ACACABiBiBiBi_A_ACACABiBiBiBi_A_ACyCyBiBi_A_A_A_A CACABiBiBiBi_A_ACyCyBiBiBiBi_A_ACyCyBiBiBiBi_A_ACyCyBiBiBiBi_A_A CACABiBiBi_A_A_A_ACyBiBiBi_A_A_A_ACyBiBiBi_A_A_A_ACyBiBiBiBi_A_A _A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A } # tile 213 (sub knox walls 6) { _A_A_A_A_A_A_A_A_A_A_A_ACACACyCyBiBiCACA_A_A_A_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_A_A_A_ACACACyCyCyBiCABiCA_A_A_A_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_A_ACyCACACACyC2C2CABiCABiCyCyCA_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_ACyCACACACyC2C2C2CACABiBiBiCyCACA_A_A_A_A_A_A_A_A _A_A_A_A_ACACACACACACACyC2C2C2CyCACABiBiBiBiCACACyCyCA_A_A_A_A_A _A_A_ACACACACACACACACyC2C2C2CyCyCACABiBiBiBiBiCACyCyCACACA_A_A_A _A_A_ACACyCyCACACACyC2C2C2CyCyCyCACABiBiBiBiBiCACACACACACA_A_A_A _A_ACACACyCyCACACyCyC2C2CyCyCyCACABiBiBiBiBiBiBiCACACACACACA_A_A _A_ACACACACACACyCyCyCyCyCyCACACACABiBiBiBiBiBiBiCACACyCyCACA_A_A _A_ACACACACACyCyCyCyCyCyCACACACABiBiBiBiBiBiBiBiBiCACyCyCyCA_A_A _A_ACACACACyCyCyCyCyCyCyCACACA_A_A_ABiBiBiBiBiBiBiBiBiCyCyCy_A_A _A_ACACACyCyCyCyCyCyCyCACA_A_A_A_A_A_ABiBiBiBiBiBiBiBiBiBiCy_A_A _A_ABiBiBiCyCyCyCyCACACACA_A_ACyBi_A_A_ABiBiBiBiBiBiBiBiBiBi_A_A _A_ABiBiBiBiBiCyCACACA_A_ACyCyCyBiBi_A_A_ABiBiBiBiBiBiBiBiBi_A_A _A_ABiBiBiBiBiBi_A_A_A_A_ACyC2C2BiBiBi_A_A_A_ABiBiBiBiBiBiBi_A_A _A_A_ABiBiBiBi_A_A_A_ACyCyC2C2C2BiBiBiBi_A_A_A_A_ABiBiBiBi_A_A_A _A_A_A_A_A_A_A_A_A_ACyCyC2C2C2CyCABiBiBiBiBi_A_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_A_A_ACyCyC2C2CyCyCACABiBiBiBi_A_A_A_A_A_A_A_A_A_A _A_A_A_ABiBi_A_A_A_A_ACyCyCyCyCyCACABiBiBi_A_A_A_A_ABiBi_A_A_A_A _A_A_A_ABiBiBi_A_A_A_A_A_ACyCyCyCACABi_A_A_A_A_A_A_ABiBiBi_A_A_A _A_A_ACyBiBiBi_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_ACyBiBiBi_A_A_A _A_ACyBiBiBiBiBi_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_ACyBiBiBiBiBi_A_A _A_ABiBiBiBiBiBi_A_A_A_A_A_A_ACyBi_A_A_A_A_A_A_ABiBiBiBiBiBi_A_A _A_ABiBiBiBiBiBi_A_A_A_A_ACyCyCyBiBiBi_A_A_A_A_ABiBiBiBiBiBi_A_A _A_ABiBiBiBiBiBi_A_A_A_A_ACyC2C2BiBiBi_A_A_A_A_ABiBiBiBiBiBi_A_A _A_A_ABiBiBiBi_A_A_A_ACyCyC2C2C2BiBiBiBiBi_A_A_A_ABiBiBiBi_A_A_A _A_A_A_A_A_A_A_A_A_ACyCyC2C2C2CyCABiBiBiBiBi_A_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_A_A_ACyCyC2C2CyCACyCABiBiBiBi_A_A_A_A_A_A_A_A_A_A _A_A_A_ABiBi_A_A_A_A_ACyCyCyCACACACyBiBiBi_A_A_A_A_ABiBi_A_A_A_A _A_A_A_ABiBiBi_A_A_A_A_A_ACyCACACyCyBi_A_A_A_A_A_A_ABiBiBi_A_A_A _A_A_ACyBiBiBi_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_ACyBiBiBi_A_A_A _A_ACyCyBiBiBiBi_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_ACyCyBiBiBiBi_A_A } # tile 214 (sub knox walls 7) { _A_A_A_A_A_A_A_A_A_A_A_ACACACyCyCACACyCy_A_A_A_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_A_A_A_ACACACyCyCyCACACyCy_A_A_A_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_A_ACyCACACACyC2C2CACABiBiCACACA_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_ACyCACACACyC2C2C2CACABiBiBiCACACACA_A_A_A_A_A_A_A _A_A_A_A_ACACACACACACACyC2C2C2CyCACACACACABiCyCACACACA_A_A_A_A_A _A_A_ACACACACACACACACyC2C2C2CyCyCACACACABiBiBiCyCACACACACA_A_A_A _A_A_ACACyCyCACACACyC2C2C2CyCyCyCACACABiBiBiBiBiCACACyCyCA_A_A_A _A_ACACACyCyCACACyCyC2C2CyCyCyCACABiBiBiBiBiBiBiBiCACyCyCACA_A_A _A_ACACACACACACyCyCyCyCyCyCACACACABiBiBiBiBiBiBiBiBiCACACACA_A_A _A_A_ACACACACyCyCyCyCyCyCACACABiBiBiBiBiBiBiBiBiBiBiCACACACA_A_A _A_A_A_ACyCyCyCyCyCyCy_ACACACABiBiBi_A_ABiBiBiBiBiCA_A_ACACA_A_A _A_A_A_A_ACyCyCyCy_A_A_A_ACABiBiBi_A_A_A_ABiBiBiCA_A_A_ACACA_A_A _A_ABiBi_ACyCyCy_A_ABiBi_A_ABiBi_A_ABiBi_A_ABiBi_A_ABiBi_A_A_A_A _A_ABiBiBi_ACyCy_A_ABiBi_A_ABiBi_A_ABiBi_A_ABiBi_A_ABiBiBi_A_A_A CACABiBiBi_A_ACy_ACyBiBiBi_ABi_A_ACABiBiBi_ABi_A_ACyBiBiBi_A_A_A CACACABiBiBi_A_ACyCyBiBiBiBi_A_ACACABiBiBiBi_A_ACyCyBiBiBiBi_A_A CACACACABiBi_A_ACACABiBiBiBi_A_ACyCyBiBiBiBi_A_ACyCyBiBiBiBi_A_A CACACACABiBi_A_ACACABiBiBi_A_A_ACyCyBiBiBiBi_A_ACyCyBiBiBi_A_A_A CACACABiBiBi_A_ACyCyBiBiBi_A_A_ACACABiBiBiBi_A_ACACABiBi_A_A_A_A CACABiBiBiBi_A_ACyCyBiBi_A_A_A_ACACABiBiBiBi_A_ACACABiBi_A_A_A_A CyCyBiBiBiBi_A_ACyCyBiBi_A_A_A_ACyCyBiBiBiBi_A_ACyCyBiBiBi_A_A_A CyCyBiBiBi_A_A_ACyCyBiBiBi_A_A_ACyCyBiBiBiBi_A_ACyCyBiBiBiBi_A_A CACABiBiBi_A_A_ACyCyBiBiBi_A_A_ACyCyBiBiBiBi_A_ACyCyBiBiBiBi_A_A CACABiBi_A_A_A_ACyCyBiBiBiBi_A_ACyCyBiBiBi_A_A_ACyCyBiBiBiBi_A_A CyCyBiBi_A_A_A_ACyCyBiBiBiBi_A_ACyCyBiBi_A_A_A_ACACABiBiBiBi_A_A CyCyBiBiBi_A_A_ACyCyBiBiBiBi_A_ACyCyBiBi_A_A_A_ACACABiBiBi_A_A_A CACABiBiBi_A_A_ACACABiBiBiBi_A_ACACABiBiBi_A_A_ACyCyBiBi_A_A_A_A CACABiBiBiBi_A_ACACABiBiBiBi_A_ACACABiBiBiBi_A_ACyCyBiBi_A_A_A_A CACABiBiBiBi_A_ACyCyBiBiBiBi_A_ACACABiBiBiBi_A_ACyCyBiBiBiBi_A_A CACABiBiBi_A_A_A_ACyBiBiBi_A_A_A_ACABiBiBi_A_A_A_ACyBiBiBiBi_A_A _A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A } # tile 215 (sub knox walls 8) { _A_A_A_A_A_A_A_A_A_A_A_ACACACyCyCACACyCy_A_A_A_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_A_A_A_ACACACyCyCyCACACyCy_A_A_A_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_A_ACyCACACACyC2C2CACABiBiCACACA_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_ACyCACACACyC2C2C2CACABiBiBiCACACACA_A_A_A_A_A_A_A _A_A_A_A_ACACACACACACACyC2C2C2CyCACACACACABiCyCACACACA_A_A_A_A_A _A_A_ACACACACACACACACyC2C2C2CyCyCACACACABiBiBiCyCACACACACA_A_A_A _A_A_ACACyCyCACACACyC2C2C2CyCyCyCACACABiBiBiBiBiCACACyCyCA_A_A_A _A_ACACACyCyCACACyCyC2C2CyCyCyCACABiBiBiBiBiBiBiBiCACyCyCACA_A_A _A_ACACACACACACyCyCyCyCyCyCACACACABiBiBiBiBiBiBiBiCACACACACA_A_A _A_ACACACACACyCyCyCyCyCACACACACABiBiBiBiBiBiBiBiBiBiCACACACA_A_A _A_ACyCyCyCyCyCyCyCyCACACACACA_A_A_ABiBiBiBiBiBiBiBiCACACACA_A_A _A_ACyCyCyCyCyCyCyCACACACA_A_A_A_A_A_ABiBiBiBiBiBiBiBiCACACA_A_A _A_ABiBiBiCyCyCyCACACACy_A_A_ACyBi_A_A_ABiBiBiBiBiBiBiBiBiBi_A_A _A_ABiBiBiBiBiCyCACACy_A_A_ACyCyBiBi_A_A_ABiBiBiBiBiBiBiBiBi_A_A _A_ABiBiBiBiBiBi_A_A_A_A_ACyC2C2BiBiBi_A_A_A_ABiBiBiBiBiBiBi_A_A _A_A_ABiBiBiBi_A_A_A_A_ACyC2C2C2BiBiBiBi_A_A_A_A_ABiBiBiBi_A_A_A _A_A_A_A_A_A_A_A_A_ACyCyC2C2C2CyCABiBiBiBiBi_A_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_A_A_ACyCyC2C2CyCyCACABiBiBiBi_A_A_A_A_A_A_A_A_A_A _A_A_A_ABiBi_A_A_A_A_ACyCyCyCyCyCACABiBiBi_A_A_A_A_ABiBi_A_A_A_A _A_A_A_ABiBiBi_A_A_A_A_A_ACyCyCyCACABi_A_A_A_A_A_A_ABiBiBi_A_A_A _A_A_ACyBiBiBi_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_ACyBiBiBi_A_A_A _A_ACyBiBiBiBiBi_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_ACyBiBiBiBiBi_A_A _A_ABiBiBiBiBiBi_A_A_A_A_A_A_ACyBi_A_A_A_A_A_A_ABiBiBiBiBiBi_A_A _A_ABiBiBiBiBiBi_A_A_A_A_ACyCyCyBiBiBi_A_A_A_A_ABiBiBiBiBiBi_A_A _A_ABiBiBiBiBiBi_A_A_A_A_ACyC2C2BiBiBi_A_A_A_A_ABiBiBiBiBiBi_A_A _A_A_ABiBiBiBi_A_A_A_ACyCyC2C2C2BiBiBiBiBi_A_A_A_ABiBiBiBi_A_A_A _A_A_A_A_A_A_A_A_A_ACyCyC2C2C2CyCABiBiBiBiBi_A_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_A_A_ACyCyC2C2CyCACyCABiBiBiBi_A_A_A_A_A_A_A_A_A_A _A_A_A_ABiBi_A_A_A_A_ACyCyCyCACACACyBiBiBi_A_A_A_A_ABiBi_A_A_A_A _A_A_A_ABiBiBi_A_A_A_A_A_ACyCACACyCyBi_A_A_A_A_A_A_ABiBiBi_A_A_A _A_A_ACyBiBiBi_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_ACyBiBiBi_A_A_A _A_ACyCyBiBiBiBi_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_ACyCyBiBiBiBi_A_A } # tile 216 (sub knox walls 9) { _A_A_A_A_A_A_A_A_A_A_A_ACACACyCyBiBiCACA_A_A_A_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_A_A_A_ACACACyCyCyCyBiBiCACA_A_A_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_A_ACyCACACACyC2C2CyBiBiCACACACA_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_ACyCACACACyC2C2C2CyCyBiBiBiCACACACA_A_A_A_A_A_A_A _A_A_A_A_ACACACACACACACyC2C2C2CyCyCABiBiBiBiCyCACACACA_A_A_A_A_A _A_A_ACACACACACACACACyC2C2C2CyCACACABiBiBiBiBiCyCyCACACACA_A_A_A _A_A_ACACyCyCACACACyC2C2C2CyCACACACABiBiBiBiBiCyCyCACACACA_A_A_A _A_ACACACyCyCACACyCyC2C2CyCACACACABiBiBiBiBiBiBiBiCyCACACACA_A_A _A_ACACACACACACyCyCyCyCyCACACACyBiBiBiBiBiBiBiBiBiBiCACACyCy_A_A _A_ACACACACACyCyCyCyCyCACACACyCyBiBiBiBiBiBiBiBiBiBiBiCACyCy_A_A _A_ACyCyCyCyCyCyCyCyCACACACA_A_A_A_ABiBiBiBiBiBiBiBiBiCACACA_A_A _A_ACyCyCyCyCyCyCyCACACACA_A_A_A_A_A_ABiBiBiBiBiBiBiBiBiBiCA_A_A _A_ABiBiBiCyCyCyCACACACy_A_A_ACyBi_A_A_ABiBiBiBiBiBiBiBiBiBi_A_A _A_ABiBiBiBiBiCyCACACy_A_A_ACyCyBiBi_A_A_ABiBiBiBiBiBiBiBiBi_A_A _A_ABiBiBiBiBiBi_A_A_A_A_ACyC2C2BiBiBi_A_A_A_ABiBiBiBiBiBiBi_A_A _A_A_ABiBiBiBi_A_A_A_A_ACyC2C2C2BiBiBiBi_A_A_A_A_ABiBiBiBi_A_A_A _A_A_A_A_A_A_A_A_A_ACyCyC2C2C2CyCABiBiBiBiBi_A_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_A_A_ACyCyC2C2CyCACACABiBiBiBi_A_A_A_A_A_A_A_A_A_A _A_A_A_ABiBi_A_A_A_A_ACyCyCyCyCACACABiBiBi_A_A_A_A_ABiBi_A_A_A_A _A_A_A_ABiBiBi_A_A_A_A_A_ACyCACACACABi_A_A_A_A_A_A_ABiBiBi_A_A_A _A_A_ACyBiBiBi_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_ACyBiBiBi_A_A_A _A_ACyBiBiBiBiBi_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_ACyBiBiBiBiBi_A_A _A_ABiBiBiBiBiBi_A_A_A_A_A_A_ACyBi_A_A_A_A_A_A_ABiBiBiBiBiBi_A_A _A_ABiBiBiBiBiBi_A_A_A_A_ACyCyCyBiBiBi_A_A_A_A_ABiBiBiBiBiBi_A_A _A_ABiBiBiBiBiBi_A_A_A_A_ACyC2C2BiBiBi_A_A_A_A_ABiBiBiBiBiBi_A_A _A_A_ABiBiBiBi_A_A_A_ACyCyC2C2C2BiBiBiBiBi_A_A_A_ABiBiBiBi_A_A_A _A_A_A_A_A_A_A_A_A_ACyCyC2C2C2CyCABiBiBiBiBi_A_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_A_A_ACyCyC2C2CyCACyCABiBiBiBi_A_A_A_A_A_A_A_A_A_A _A_A_A_ABiBi_A_A_A_A_ACyCyCyCACACACyBiBiBi_A_A_A_A_ABiBi_A_A_A_A _A_A_A_ABiBiBi_A_A_A_A_A_ACyCACACyCyBi_A_A_A_A_A_A_ABiBiBi_A_A_A _A_A_ACyBiBiBi_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_ACyBiBiBi_A_A_A _A_ACyCyBiBiBiBi_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_ACyCyBiBiBiBi_A_A } # tile 217 (sub knox walls 10) { _A_A_A_A_A_A_A_A_A_A_A_ACACACyCyBiBiCACA_A_A_A_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_A_A_A_ACACACyCyCyCyBiBiCACA_A_A_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_A_ACyCACACACyC2C2CyBiBiCACACACA_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_ACyCACACACyC2C2C2CyCyBiBiBiCACACACA_A_A_A_A_A_A_A _A_A_A_A_ACACACACACACACyC2C2C2CyCyCABiBiBiBiCyCACACACA_A_A_A_A_A _A_A_ACACACACACACACACyC2C2C2CyCACACABiBiBiBiBiCyCyCACACACA_A_A_A _A_A_ACACyCyCACACACyC2C2C2CyCACACACABiBiBiBiBiCyCyCACACACA_A_A_A _A_ACACACyCyCACACyCyC2C2CyCACACACABiBiBiBiBiBiBiBiCyCACACACA_A_A _A_ACACACACACACyCyCyCyCyCACACACyBiBiBiBiBiBiBiBiBiBiCACACyCy_A_A _A_ACACACACACyCyCyCyCyCACACACyCyBiBiBiBiBiBiBiBiBiBiBiCACyCy_A_A _A_ACACACACyCyCyCyCyCACACACA_A_A_A_ABiBiBiBiBiBiBiBiBiCACACA_A_A _A_ACACACyCyCyCyCyCACACACA_A_A_A_A_A_ABiBiBiBiBiBiBiBiBiBiCA_A_A _A_ABiBiBiCyCyCyCACACACy_A_A_ACyBi_A_A_ABiBiBiBiBiBiBiBiBiBi_A_A _A_ABiBiBiBiBiCyCACACy_A_A_ACyCyBiBi_A_A_ABiBiBiBiBiBiBiBiBi_A_A _A_ABiBiBiBiBiBi_A_A_A_A_ACyC2C2BiBiBi_A_A_A_ABiBiBiBiBiBiBi_A_A _A_A_ABiBiBiBi_A_A_A_A_ACyC2C2C2BiBiBiBi_A_A_A_A_ABiBiBiBi_A_A_A _A_A_A_A_A_A_A_A_A_ACyCyC2C2C2CyCABiBiBiBiBi_A_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_A_A_ACyCyC2C2CyCACACABiBiBiBi_A_A_A_A_A_A_A_A_A_A _A_A_A_ABiBi_A_A_A_A_ACyCyCyCyCACACABiBiBi_A_A_A_A_ABiBi_A_A_A_A _A_A_A_ABiBiBi_A_A_A_A_A_ACyCACACACABi_A_A_A_A_A_A_ABiBiBi_A_A_A _A_A_ACyBiBiBi_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_ACyBiBiBi_A_A_A _A_ACyBiBiBiBiBi_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_ACyBiBiBiBiBi_A_A _A_ABiBiBiBiBiBi_A_A_A_A_A_A_ACyBi_A_A_A_A_A_A_ABiBiBiBiBiBi_A_A _A_ABiBiBiBiBiBi_A_A_A_A_ACyCyCyBiBiBi_A_A_A_A_ABiBiBiBiBiBi_A_A _A_ABiBiBiBiBiBi_A_A_A_A_ACyC2C2BiBiBi_A_A_A_A_ABiBiBiBiBiBi_A_A _A_A_ABiBiBiBi_A_A_A_ACyCyC2C2C2BiBiBiBiBi_A_A_A_ABiBiBiBi_A_A_A _A_A_A_A_A_A_A_A_A_ACyCyC2C2C2CyCABiBiBiBiBi_A_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_A_A_ACyCyC2C2CyCACyCABiBiBiBi_A_A_A_A_A_A_A_A_A_A _A_A_A_ABiBi_A_A_A_A_ACyCyCyCACACACyBiBiBi_A_A_A_A_ABiBi_A_A_A_A _A_A_A_ABiBiBi_A_A_A_A_A_ACyCACACyCyBi_A_A_A_A_A_A_ABiBiBi_A_A_A _A_A_ACyBiBiBi_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_ACyBiBiBi_A_A_A _A_ACyCyBiBiBiBi_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_ACyCyBiBiBiBi_A_A } # tile 218 (sub sokoban walls 0) { _A_AC$C$C$C$_p_p_A_AAjAj_K_K_K_K_K_K_K_K_K_KAjAjC$C$C$C$_p_p_A_A _A_AC$C$C$_p_p_p_A_AAjAj_K_K_K_K_K_K_K_K_KAjAjAjC$C$C$_p_p_p_A_A _A_A_p_p_p_p_p_p_A_AAjAj_K_KAjAj_K_K_K_KAjAjAjAj_p_p_p_p_p_p_A_A _A_A_p_p_p_p_p_p_A_AAjAj_K_KAjAj_K_K_K_KAjAjAjAj_p_p_p_p_p_p_A_A _A_A_p_p_p_p_p_p_A_AAjAj_K_K_K_K_K_K_K_K_KAjAjAj_p_p_p_p_p_p_A_A _A_A_p_p_p_p_p_p_A_AAjAj_K_K_K_K_K_K_K_K_K_KAjAj_p_p_p_p_p_p_A_A _A_A_p_p_p_p_p_p_A_AAjAj_K_K_K_K_K_K_K_K_K_KAjAj_p_p_p_p_p_p_A_A _A_A_p_p_p_p_p_p_A_AAjAjAj_K_K_K_K_K_K_K_K_KAjAj_p_p_p_p_p_p_A_A _A_A_p_p_p_p_p_p_A_AAjAjAj_K_K_K_K_K_K_K_K_KAjAj_p_p_p_p_p_p_A_A _A_A_p_p_p_p_p_A_A_AAjAjAjAj_K_K_K_K_K_K_K_KAjAjAj_p_p_p_p_p_A_A _A_AAjAj_A_A_A_A_A_AAjAjAjAj_K_K_K_K_K_K_K_KAjAjAjAj_A_AAjAj_A_A _A_AAjAjAj_A_A_A_A_AAjAjAjAj_K_K_K_K_K_K_K_KAjAjAjAj_A_AAjAj_A_A _A_AAjAjAjAjAj_A_A_AAjAjAjAj_K_K_K_K_K_K_K_KAjAjAjAjAjAjAjAj_A_A _A_AAjAjAjAjAjAj_A_AAjAjAjAj_K_K_K_K_K_K_K_KAjAjAjAjAjAjAjAj_A_A _A_A_p_p_K_K_K_K_A_AAjAjAjAj_K_K_K_KAjAj_K_KAjAjAj_p_KAjAjAj_A_A _A_A_p_p_K_K_K_K_A_AAjAjAj_K_K_K_K_KAjAj_K_KAjAj_p_p_K_KAjAj_A_A _A_AC$C$C$C$_p_p_A_AAjAjAj_K_K_K_K_K_K_K_K_KAjAjC$C$C$C$_p_p_A_A _A_AC$C$C$_p_p_p_A_AAjAj_K_K_K_K_K_K_K_K_K_KAjAjC$C$C$_p_p_p_A_A _A_A_p_p_p_p_p_p_A_AAjAj_K_K_K_K_K_K_K_K_K_KAjAj_p_p_p_p_p_p_A_A _A_A_p_p_p_p_p_p_A_AAjAj_K_K_K_K_K_K_K_K_K_KAjAj_p_p_p_p_p_p_A_A _A_A_p_p_p_p_p_p_A_AAjAj_K_K_K_K_K_K_K_K_K_KAjAj_p_p_p_p_p_p_A_A _A_A_p_p_p_p_p_p_A_AAjAj_K_K_K_K_K_K_K_K_K_KAjAj_p_p_p_p_p_p_A_A _A_A_p_p_p_p_p_p_A_AAjAj_K_K_K_K_K_K_K_K_K_KAjAj_p_p_p_p_p_p_A_A _A_A_p_p_p_p_p_p_A_AAjAjAj_K_K_K_K_K_K_K_KAjAjAj_p_p_p_p_p_p_A_A _A_A_p_p_p_p_p_p_A_AAjAjAj_K_K_KAjAj_K_KAjAjAjAj_p_p_p_p_p_p_A_A _A_A_p_p_p_p_p_A_A_AAjAjAjAj_K_KAjAj_K_KAjAjAjAjAj_p_p_p_p_p_A_A _A_AAjAj_A_A_A_A_A_AAjAjAjAj_K_K_K_K_K_K_KAjAjAjAjAj_A_AAjAj_A_A _A_AAjAjAj_A_A_A_A_AAjAjAjAj_K_K_K_K_K_K_K_KAjAjAjAj_A_AAjAj_A_A _A_AAjAjAjAjAj_A_A_AAjAjAjAj_K_K_K_K_K_K_K_KAjAjAjAjAjAjAjAj_A_A _A_AAjAjAjAjAjAj_A_AAjAjAjAj_K_K_K_K_K_K_K_KAjAjAjAjAjAjAjAj_A_A _A_A_p_p_K_K_K_K_A_AAjAjAjAj_K_K_K_K_K_K_K_KAjAjAj_p_KAjAjAj_A_A _A_A_p_p_K_K_K_K_A_AAjAjAjAj_K_K_K_K_K_K_K_KAjAj_p_p_K_KAjAj_A_A } # tile 219 (sub sokoban walls 1) { _A_A_A_A_A_AC$C$_p_p_p_p_A_A_A_A_A_A_A_A_A_AC$C$_p_p_p_p_A_A_A_A _A_A_A_A_A_AC$C$_p_p_p_p_A_A_A_A_A_A_A_A_A_AC$C$_p_p_p_p_A_A_A_A _p_p_p_p_p_pC$C$_p_p_p_p_A_A_AAj_p_p_p_p_p_pC$C$_p_p_p_p_A_A_AAj _p_p_p_p_p_pC$C$_p_p_p_p_A_AAjAj_p_p_p_p_p_pC$C$_p_p_p_p_A_AAjAj _K_p_p_p_p_pAjAjAjAjAjAj_A_AAjAj_K_p_p_p_p_pAjAjAjAjAjAj_A_AAjAj _K_K_p_p_pAjAjAjAjAjAjAj_A_AAjAjAj_K_p_p_pAjAjAjAjAjAjAj_A_AAjAj AjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAj AjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAj _K_K_KAjAjAjAjAjAjAjAj_K_K_K_K_K_K_K_KAjAjAjAjAjAjAjAj_K_K_K_K_K _K_K_K_KAjAjAjAjAjAj_K_K_K_K_K_K_K_K_K_KAjAjAjAjAjAj_K_K_K_K_K_K _K_K_K_KC$C$_p_p_p_p_K_K_K_K_K_K_K_K_K_KC$C$_p_p_p_p_K_K_K_K_K_K _K_K_K_KC$C$_p_p_p_p_K_K_K_K_K_K_K_K_K_KC$C$_p_p_p_p_K_K_K_K_K_K _p_p_p_pC$C$_p_p_p_p_A_AAjAj_p_p_p_p_p_pC$C$_p_p_p_p_A_AAjAj_p_p _p_p_p_pC$C$_p_p_p_p_A_AAjAj_p_p_p_p_p_pC$C$_p_p_p_p_A_AAjAj_p_p _p_p_p_pAjAjAjAjAjAj_A_AAjAj_K_p_p_p_p_pAjAjAjAjAjAj_A_AAjAj_K_K _p_p_pAjAjAjAjAjAjAj_A_AAjAjAj_K_p_p_pAjAjAjAjAjAjAj_A_AAjAjAj_K AjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAj AjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAj _K_K_KAjAjAjAj_p_K_K_K_K_K_K_KAjAjAjAj_p_K_K_K_K_KAjAjAjAj_p_K_K _K_K_K_KAjAj_p_K_K_K_K_K_K_K_K_KAjAj_p_K_K_K_K_K_K_KAjAj_p_K_K_K _K_K_K_KAjAj_K_K_K_K_K_K_K_K_K_KAjAj_K_K_K_K_K_K_K_KAjAj_K_K_K_K _K_K_KAjAjAjAj_K_K_K_K_K_K_K_KAjAjAjAj_K_K_K_K_K_KAjAjAjAj_K_K_K AjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAj AjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAj AjAjAj_p_K_K_K_K_K_K_KAjAjAjAj_p_K_K_K_K_K_K_KAjAjAjAj_p_K_K_K_K AjAj_p_K_K_K_K_K_K_K_K_KAjAj_p_K_K_K_K_K_K_K_K_KAjAj_p_K_K_K_K_K AjAj_K_K_K_K_K_K_K_K_K_KAjAj_K_K_K_K_K_K_K_K_K_KAjAj_K_K_K_K_K_K AjAjAj_K_K_K_K_K_K_K_KAjAjAjAj_K_K_K_K_K_K_K_KAjAjAjAj_K_K_K_K_K AjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAj AjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAj _A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A } # tile 220 (sub sokoban walls 2) { _A_A_A_A_A_AC$C$C$C$C$C$C$C$_p_p_p_p_p_p_p_p_p_p_p_p_A_A_A_A_A_A _A_A_A_A_AC$C$C$C$C$C$C$C$C$_p_p_p_p_p_p_p_p_p_p_p_p_A_A_A_A_A_A C$C$C$C$C$C$C$C$C$_A_A_AAjAjAjAj_K_K_K_K_K_K_K_p_p_pAjAjAjAjAjAj C$C$C$C$C$C$C$C$_A_A_AAjAjAjAj_K_K_K_K_K_K_K_K_K_p_pAjAjAjAjAjAj _p_p_p_p_pC$C$C$_A_A_AAjAjAjAj_K_K_K_K_K_KC$C$C$_p_pAjAjAjAjAjAj _p_p_p_p_p_p_pC$_A_AAjAjAjAj_K_K_K_K_K_KC$C$C$_p_p_pAjAjAjAjAjAj _p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_pAjAjAjAjAjAj _p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_pAjAjAjAjAjAj _p_p_p_p_p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAjAjAjAjAj _p_p_p_p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAjAjAjAjAj _p_p_p_p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAjAjAjAjAj _p_p_p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAjAjAjAj _p_p_p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAjAjAjAj _p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAjAj _p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAj _p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAj AjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAj AjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAj _A_A_K_K_KAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAj_K_K_K_KAjAjAj _A_A_K_K_K_KAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAj_K_K_K_K_K_KAjAj _A_A_p_p_p_p_p_p_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_p_p_p_p_p_p_A_A _A_A_p_p_p_p_p_p_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_p_p_p_p_p_p_A_A _A_A_p_p_p_p_p_p_A_A_AAj_K_K_K_K_K_K_K_K_K_KAjAj_p_p_p_p_p_p_A_A _A_A_p_p_p_p_p_p_A_AAjAj_K_K_K_K_K_K_K_K_K_KAjAj_p_p_p_p_p_p_A_A _A_A_p_p_p_p_p_p_A_AAjAj_K_K_K_K_K_K_K_K_K_KAjAj_p_p_p_p_p_p_A_A _A_A_p_p_p_p_p_A_A_AAjAjAj_K_K_K_K_K_K_K_K_KAjAjAj_p_p_p_p_p_A_A _A_AAjAj_A_A_A_A_A_AAjAjAj_K_K_K_K_K_K_K_K_KAjAjAjAj_A_AAjAj_A_A _A_AAjAjAj_A_A_A_A_AAjAjAjAj_K_K_K_K_K_K_K_KAjAjAjAj_A_AAjAj_A_A _A_AAjAjAjAjAj_A_A_AAjAjAjAj_K_K_K_K_K_K_K_KAjAjAjAjAjAjAjAj_A_A _A_AAjAjAjAjAjAj_A_AAjAjAjAj_K_K_K_K_K_K_K_KAjAjAjAjAjAjAjAj_A_A _A_A_p_p_K_K_K_K_A_AAjAjAjAj_K_K_K_K_K_K_K_KAjAjAj_p_KAjAjAj_A_A _A_A_p_p_K_K_K_K_A_AAjAjAjAj_K_K_K_K_K_K_K_KAjAj_p_p_K_KAjAj_A_A } # tile 221 (sub sokoban walls 3) { _A_A_A_A_A_AC$C$C$C$C$C$C$C$_p_p_p_p_p_p_p_p_p_p_p_p_A_A_A_A_A_A _A_A_A_A_AC$C$C$C$C$C$C$C$C$_p_p_p_p_p_p_p_p_p_p_p_p_A_A_A_A_A_A C$C$C$C$C$C$C$C$C$_A_A_AAjAjAjAj_K_K_K_K_K_K_K_p_p_pAjAjAjAjAjAj C$C$C$C$C$C$C$C$_A_A_AAjAjAjAj_K_K_K_K_K_K_K_K_K_p_pAjAjAjAjAjAj _p_p_p_p_pC$C$C$_A_A_AAjAjAjAj_K_K_K_K_K_KC$C$C$_p_pAjAjAjAjAjAj _p_p_p_p_p_p_pC$_A_AAjAjAjAj_K_K_K_K_K_KC$C$C$_p_p_pAjAjAjAjAjAj _p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_pAjAjAjAjAjAj _p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_pAjAjAjAjAjAj _p_p_p_p_p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAjAjAjAjAj _p_p_p_p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAjAjAjAjAj _p_p_p_p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAjAjAjAjAj _p_p_p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAjAjAjAj _p_p_p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAjAjAjAj _p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAjAj _p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAj _p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAj AjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAj AjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAj _A_A_K_K_KAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAj_K_K_K_KAjAjAj _A_A_K_K_K_KAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAj_K_K_K_K_K_KAjAj _A_A_p_p_p_p_p_p_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_p_p_p_p_p_p_A_A _A_A_p_p_p_p_p_p_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_p_p_p_p_p_p_A_A _A_A_p_p_p_p_p_p_A_A_AAj_K_K_K_K_K_K_K_K_K_KAjAj_p_p_p_p_p_p_A_A _A_A_p_p_p_p_p_p_A_AAjAj_K_K_K_K_K_K_K_K_K_KAjAj_p_p_p_p_p_p_A_A _A_A_p_p_p_p_p_p_A_AAjAj_K_K_K_K_K_K_K_K_K_KAjAj_p_p_p_p_p_p_A_A _A_A_p_p_p_p_p_A_A_AAjAjAj_K_K_K_K_K_K_K_K_KAjAjAj_p_p_p_p_p_A_A _A_AAjAj_A_A_A_A_A_AAjAjAj_K_K_K_K_K_K_K_K_KAjAjAjAj_A_AAjAj_A_A _A_AAjAjAj_A_A_A_A_AAjAjAjAj_K_K_K_K_K_K_K_KAjAjAjAj_A_AAjAj_A_A _A_AAjAjAjAjAj_A_A_AAjAjAjAj_K_K_K_K_K_K_K_KAjAjAjAjAjAjAjAj_A_A _A_AAjAjAjAjAjAj_A_AAjAjAjAj_K_K_K_K_K_K_K_KAjAjAjAjAjAjAjAj_A_A _A_A_p_p_K_K_K_K_A_AAjAjAjAj_K_K_K_K_K_K_K_KAjAjAj_p_KAjAjAj_A_A _A_A_p_p_K_K_K_K_A_AAjAjAjAj_K_K_K_K_K_K_K_KAjAj_p_p_K_KAjAj_A_A } # tile 222 (sub sokoban walls 4) { _A_A_A_A_A_AC$C$C$C$C$C$C$C$_p_p_p_p_p_p_p_p_p_p_p_p_A_A_A_A_A_A _A_A_A_A_AC$C$C$C$C$C$C$C$C$_p_p_p_p_p_p_p_p_p_p_p_p_A_A_A_A_A_A C$C$C$C$C$C$C$C$C$_A_A_AAjAjAjAj_K_K_K_K_K_K_K_p_p_pAjAjAjAjAjAj C$C$C$C$C$C$C$C$_A_A_AAjAjAjAj_K_K_K_K_K_K_K_K_K_p_pAjAjAjAjAjAj _p_p_p_p_pC$C$C$_A_A_AAjAjAjAj_K_K_K_K_K_KC$C$C$_p_pAjAjAjAjAjAj _p_p_p_p_p_p_pC$_A_AAjAjAjAj_K_K_K_K_K_KC$C$C$_p_p_pAjAjAjAjAjAj _p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_pAjAjAjAjAjAj _p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_pAjAjAjAjAjAj _p_p_p_p_p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAjAjAjAjAj _p_p_p_p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAjAjAjAjAj _p_p_p_p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAjAjAjAjAj _p_p_p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAjAjAjAj _p_p_p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAjAjAjAj _p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAjAj _p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAj _p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAj AjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAj AjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAj _K_K_KAjAjAjAj_p_K_K_K_K_K_K_KAjAjAjAj_p_K_K_K_K_KAjAjAjAj_p_K_K _K_K_K_KAjAj_p_K_K_K_K_K_K_K_K_KAjAj_p_K_K_K_K_K_K_KAjAj_p_K_K_K _K_K_K_KAjAj_K_K_K_K_K_K_K_K_K_KAjAj_K_K_K_K_K_K_K_KAjAj_K_K_K_K _K_K_KAjAjAjAj_K_K_K_K_K_K_K_KAjAjAjAj_K_K_K_K_K_KAjAjAjAj_K_K_K AjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAj AjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAj AjAjAj_p_K_K_K_K_K_K_KAjAjAjAj_p_K_K_K_K_K_K_KAjAjAjAj_p_K_K_K_K AjAj_p_K_K_K_K_K_K_K_K_KAjAj_p_K_K_K_K_K_K_K_K_KAjAj_p_K_K_K_K_K AjAj_K_K_K_K_K_K_K_K_K_KAjAj_K_K_K_K_K_K_K_K_K_KAjAj_K_K_K_K_K_K AjAjAj_K_K_K_K_K_K_K_KAjAjAjAj_K_K_K_K_K_K_K_KAjAjAjAj_K_K_K_K_K AjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAj AjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAj _A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A } # tile 223 (sub sokoban walls 5) { _A_A_A_A_A_AC$C$C$C$C$C$C$C$_p_p_p_p_p_p_p_p_p_p_p_p_A_A_A_A_A_A _A_A_A_A_AC$C$C$C$C$C$C$C$C$_p_p_p_p_p_p_p_p_p_p_p_p_A_A_A_A_A_A C$C$C$C$C$C$C$C$C$_A_A_AAjAjAjAj_K_K_K_K_K_K_K_p_p_pAjAjAjAjAjAj C$C$C$C$C$C$C$C$_A_A_AAjAjAjAj_K_K_K_K_K_K_K_K_K_p_pAjAjAjAjAjAj _p_p_p_p_pC$C$C$_A_A_AAjAjAjAj_K_K_K_K_K_KC$C$C$_p_pAjAjAjAjAjAj _p_p_p_p_p_p_pC$_A_AAjAjAjAj_K_K_K_K_K_KC$C$C$_p_p_pAjAjAjAjAjAj _p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_pAjAjAjAjAjAj _p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_pAjAjAjAjAjAj _p_p_p_p_p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAjAjAjAjAj _p_p_p_p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAjAjAjAjAj _p_p_p_p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAjAjAjAjAj _p_p_p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAjAjAjAj _p_p_p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAjAjAjAj _p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAjAj _p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAj _p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAj AjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAj AjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAj _K_K_KAjAjAjAj_p_K_K_K_K_K_K_KAjAjAjAj_p_K_K_K_K_KAjAjAjAj_p_K_K _K_K_K_KAjAj_p_K_K_K_K_K_K_K_K_KAjAj_p_K_K_K_K_K_K_KAjAj_p_K_K_K _K_K_K_KAjAj_K_K_K_K_K_K_K_K_K_KAjAj_K_K_K_K_K_K_K_KAjAj_K_K_K_K _K_K_KAjAjAjAj_K_K_K_K_K_K_K_KAjAjAjAj_K_K_K_K_K_KAjAjAjAj_K_K_K AjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAj AjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAj AjAjAj_p_K_K_K_K_K_K_KAjAjAjAj_p_K_K_K_K_K_K_KAjAjAjAj_p_K_K_K_K AjAj_p_K_K_K_K_K_K_K_K_KAjAj_p_K_K_K_K_K_K_K_K_KAjAj_p_K_K_K_K_K AjAj_K_K_K_K_K_K_K_K_K_KAjAj_K_K_K_K_K_K_K_K_K_KAjAj_K_K_K_K_K_K AjAjAj_K_K_K_K_K_K_K_KAjAjAjAj_K_K_K_K_K_K_K_KAjAjAjAj_K_K_K_K_K AjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAj AjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAj _A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A } # tile 224 (sub sokoban walls 6) { _A_A_A_A_A_AC$C$C$C$C$C$C$C$_p_p_p_p_p_p_p_p_p_p_p_p_A_A_A_A_A_A _A_A_A_A_AC$C$C$C$C$C$C$C$C$_p_p_p_p_p_p_p_p_p_p_p_p_A_A_A_A_A_A C$C$C$C$C$C$C$C$C$_A_A_AAjAjAjAj_K_K_K_K_K_K_K_p_p_pAjAjAjAjAjAj C$C$C$C$C$C$C$C$_A_A_AAjAjAjAj_K_K_K_K_K_K_K_K_K_p_pAjAjAjAjAjAj _p_p_p_p_pC$C$C$_A_A_AAjAjAjAj_K_K_K_K_K_KC$C$C$_p_pAjAjAjAjAjAj _p_p_p_p_p_p_pC$_A_AAjAjAjAj_K_K_K_K_K_KC$C$C$_p_p_pAjAjAjAjAjAj _p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_pAjAjAjAjAjAj _p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_pAjAjAjAjAjAj _p_p_p_p_p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAjAjAjAjAj _p_p_p_p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAjAjAjAjAj _p_p_p_p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAjAjAjAjAj _p_p_p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAjAjAjAj _p_p_p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAjAjAjAj _p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAjAj _p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAj _p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAj AjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAj AjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAj _A_A_K_K_KAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAj_K_K_K_KAjAjAj _A_A_K_K_K_KAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAj_K_K_K_K_K_KAjAj _A_A_p_p_p_p_p_p_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_p_p_p_p_p_p_A_A _A_A_p_p_p_p_p_p_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_p_p_p_p_p_p_A_A _A_A_p_p_p_p_p_p_A_A_AAj_K_K_K_K_K_K_K_K_K_KAjAj_p_p_p_p_p_p_A_A _A_A_p_p_p_p_p_p_A_AAjAj_K_K_K_K_K_K_K_K_K_KAjAj_p_p_p_p_p_p_A_A _A_A_p_p_p_p_p_p_A_AAjAj_K_K_K_K_K_K_K_K_K_KAjAj_p_p_p_p_p_p_A_A _A_A_p_p_p_p_p_A_A_AAjAjAj_K_K_K_K_K_K_K_K_KAjAjAj_p_p_p_p_p_A_A _A_AAjAj_A_A_A_A_A_AAjAjAj_K_K_K_K_K_K_K_K_KAjAjAjAj_A_AAjAj_A_A _A_AAjAjAj_A_A_A_A_AAjAjAjAj_K_K_K_K_K_K_K_KAjAjAjAj_A_AAjAj_A_A _A_AAjAjAjAjAj_A_A_AAjAjAjAj_K_K_K_K_K_K_K_KAjAjAjAjAjAjAjAj_A_A _A_AAjAjAjAjAjAj_A_AAjAjAjAj_K_K_K_K_K_K_K_KAjAjAjAjAjAjAjAj_A_A _A_A_p_p_K_K_K_K_A_AAjAjAjAj_K_K_K_K_K_K_K_KAjAjAj_p_KAjAjAj_A_A _A_A_p_p_K_K_K_K_A_AAjAjAjAj_K_K_K_K_K_K_K_KAjAj_p_p_K_KAjAj_A_A } # tile 225 (sub sokoban walls 7) { _A_A_A_A_A_AC$C$C$C$C$C$C$C$_p_p_p_p_p_p_p_p_p_p_p_p_A_A_A_A_A_A _A_A_A_A_AC$C$C$C$C$C$C$C$C$_p_p_p_p_p_p_p_p_p_p_p_p_A_A_A_A_A_A C$C$C$C$C$C$C$C$C$_A_A_AAjAjAjAj_K_K_K_K_K_K_K_p_p_pAjAjAjAjAjAj C$C$C$C$C$C$C$C$_A_A_AAjAjAjAj_K_K_K_K_K_K_K_K_K_p_pAjAjAjAjAjAj _p_p_p_p_pC$C$C$_A_A_AAjAjAjAj_K_K_K_K_K_KC$C$C$_p_pAjAjAjAjAjAj _p_p_p_p_p_p_pC$_A_AAjAjAjAj_K_K_K_K_K_KC$C$C$_p_p_pAjAjAjAjAjAj _p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_pAjAjAjAjAjAj _p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_pAjAjAjAjAjAj _p_p_p_p_p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAjAjAjAjAj _p_p_p_p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAjAjAjAjAj _p_p_p_p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAjAjAjAjAj _p_p_p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAjAjAjAj _p_p_p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAjAjAjAj _p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAjAj _p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAj _p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAj AjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAj AjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAj _K_K_KAjAjAjAj_p_K_K_K_K_K_K_KAjAjAjAj_p_K_K_K_K_KAjAjAjAj_p_K_K _K_K_K_KAjAj_p_K_K_K_K_K_K_K_K_KAjAj_p_K_K_K_K_K_K_KAjAj_p_K_K_K _K_K_K_KAjAj_K_K_K_K_K_K_K_K_K_KAjAj_K_K_K_K_K_K_K_KAjAj_K_K_K_K _K_K_KAjAjAjAj_K_K_K_K_K_K_K_KAjAjAjAj_K_K_K_K_K_KAjAjAjAj_K_K_K AjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAj AjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAj AjAjAj_p_K_K_K_K_K_K_KAjAjAjAj_p_K_K_K_K_K_K_KAjAjAjAj_p_K_K_K_K AjAj_p_K_K_K_K_K_K_K_K_KAjAj_p_K_K_K_K_K_K_K_K_KAjAj_p_K_K_K_K_K AjAj_K_K_K_K_K_K_K_K_K_KAjAj_K_K_K_K_K_K_K_K_K_KAjAj_K_K_K_K_K_K AjAjAj_K_K_K_K_K_K_K_KAjAjAjAj_K_K_K_K_K_K_K_KAjAjAjAj_K_K_K_K_K AjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAj AjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAj _A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A _A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A } # tile 226 (sub sokoban walls 8) { _A_A_A_A_A_AC$C$C$C$C$C$C$C$_p_p_p_p_p_p_p_p_p_p_p_p_A_A_A_A_A_A _A_A_A_A_AC$C$C$C$C$C$C$C$C$_p_p_p_p_p_p_p_p_p_p_p_p_A_A_A_A_A_A C$C$C$C$C$C$C$C$C$_A_A_AAjAjAjAj_K_K_K_K_K_K_K_p_p_pAjAjAjAjAjAj C$C$C$C$C$C$C$C$_A_A_AAjAjAjAj_K_K_K_K_K_K_K_K_K_p_pAjAjAjAjAjAj _p_p_p_p_pC$C$C$_A_A_AAjAjAjAj_K_K_K_K_K_KC$C$C$_p_pAjAjAjAjAjAj _p_p_p_p_p_p_pC$_A_AAjAjAjAj_K_K_K_K_K_KC$C$C$_p_p_pAjAjAjAjAjAj _p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_pAjAjAjAjAjAj _p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_pAjAjAjAjAjAj _p_p_p_p_p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAjAjAjAjAj _p_p_p_p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAjAjAjAjAj _p_p_p_p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAjAjAjAjAj _p_p_p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAjAjAjAj _p_p_p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAjAjAjAj _p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAjAj _p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAj _p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAj AjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAj AjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAj _A_A_K_K_KAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAj_K_K_K_KAjAjAj _A_A_K_K_K_KAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAj_K_K_K_K_K_KAjAj _A_A_p_p_p_p_p_p_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_p_p_p_p_p_p_A_A _A_A_p_p_p_p_p_p_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_p_p_p_p_p_p_A_A _A_A_p_p_p_p_p_p_A_A_AAj_K_K_K_K_K_K_K_K_K_KAjAj_p_p_p_p_p_p_A_A _A_A_p_p_p_p_p_p_A_AAjAj_K_K_K_K_K_K_K_K_K_KAjAj_p_p_p_p_p_p_A_A _A_A_p_p_p_p_p_p_A_AAjAj_K_K_K_K_K_K_K_K_K_KAjAj_p_p_p_p_p_p_A_A _A_A_p_p_p_p_p_A_A_AAjAjAj_K_K_K_K_K_K_K_K_KAjAjAj_p_p_p_p_p_A_A _A_AAjAj_A_A_A_A_A_AAjAjAj_K_K_K_K_K_K_K_K_KAjAjAjAj_A_AAjAj_A_A _A_AAjAjAj_A_A_A_A_AAjAjAjAj_K_K_K_K_K_K_K_KAjAjAjAj_A_AAjAj_A_A _A_AAjAjAjAjAj_A_A_AAjAjAjAj_K_K_K_K_K_K_K_KAjAjAjAjAjAjAjAj_A_A _A_AAjAjAjAjAjAj_A_AAjAjAjAj_K_K_K_K_K_K_K_KAjAjAjAjAjAjAjAj_A_A _A_A_p_p_K_K_K_K_A_AAjAjAjAj_K_K_K_K_K_K_K_KAjAjAj_p_KAjAjAj_A_A _A_A_p_p_K_K_K_K_A_AAjAjAjAj_K_K_K_K_K_K_K_KAjAj_p_p_K_KAjAj_A_A } # tile 227 (sub sokoban walls 9) { _A_A_A_A_A_AC$C$C$C$C$C$C$C$_p_p_p_p_p_p_p_p_p_p_p_p_A_A_A_A_A_A _A_A_A_A_AC$C$C$C$C$C$C$C$C$_p_p_p_p_p_p_p_p_p_p_p_p_A_A_A_A_A_A C$C$C$C$C$C$C$C$C$_A_A_AAjAjAjAj_K_K_K_K_K_K_K_p_p_pAjAjAjAjAjAj C$C$C$C$C$C$C$C$_A_A_AAjAjAjAj_K_K_K_K_K_K_K_K_K_p_pAjAjAjAjAjAj _p_p_p_p_pC$C$C$_A_A_AAjAjAjAj_K_K_K_K_K_KC$C$C$_p_pAjAjAjAjAjAj _p_p_p_p_p_p_pC$_A_AAjAjAjAj_K_K_K_K_K_KC$C$C$_p_p_pAjAjAjAjAjAj _p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_pAjAjAjAjAjAj _p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_pAjAjAjAjAjAj _p_p_p_p_p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAjAjAjAjAj _p_p_p_p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAjAjAjAjAj _p_p_p_p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAjAjAjAjAj _p_p_p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAjAjAjAj _p_p_p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAjAjAjAj _p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAjAj _p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAj _p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAj AjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAj AjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAj _A_A_K_K_KAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAj_K_K_K_KAjAjAj _A_A_K_K_K_KAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAj_K_K_K_K_K_KAjAj _A_A_p_p_p_p_p_p_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_p_p_p_p_p_p_A_A _A_A_p_p_p_p_p_p_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_p_p_p_p_p_p_A_A _A_A_p_p_p_p_p_p_A_A_AAj_K_K_K_K_K_K_K_K_K_KAjAj_p_p_p_p_p_p_A_A _A_A_p_p_p_p_p_p_A_AAjAj_K_K_K_K_K_K_K_K_K_KAjAj_p_p_p_p_p_p_A_A _A_A_p_p_p_p_p_p_A_AAjAj_K_K_K_K_K_K_K_K_K_KAjAj_p_p_p_p_p_p_A_A _A_A_p_p_p_p_p_A_A_AAjAjAj_K_K_K_K_K_K_K_K_KAjAjAj_p_p_p_p_p_A_A _A_AAjAj_A_A_A_A_A_AAjAjAj_K_K_K_K_K_K_K_K_KAjAjAjAj_A_AAjAj_A_A _A_AAjAjAj_A_A_A_A_AAjAjAjAj_K_K_K_K_K_K_K_KAjAjAjAj_A_AAjAj_A_A _A_AAjAjAjAjAj_A_A_AAjAjAjAj_K_K_K_K_K_K_K_KAjAjAjAjAjAjAjAj_A_A _A_AAjAjAjAjAjAj_A_AAjAjAjAj_K_K_K_K_K_K_K_KAjAjAjAjAjAjAjAj_A_A _A_A_p_p_K_K_K_K_A_AAjAjAjAj_K_K_K_K_K_K_K_KAjAjAj_p_KAjAjAj_A_A _A_A_p_p_K_K_K_K_A_AAjAjAjAj_K_K_K_K_K_K_K_KAjAj_p_p_K_KAjAj_A_A } # tile 228 (sub sokoban walls 10) { _A_A_A_A_A_AC$C$C$C$C$C$C$C$_p_p_p_p_p_p_p_p_p_p_p_p_A_A_A_A_A_A _A_A_A_A_AC$C$C$C$C$C$C$C$C$_p_p_p_p_p_p_p_p_p_p_p_p_A_A_A_A_A_A C$C$C$C$C$C$C$C$C$_A_A_AAjAjAjAj_K_K_K_K_K_K_K_p_p_pAjAjAjAjAjAj C$C$C$C$C$C$C$C$_A_A_AAjAjAjAj_K_K_K_K_K_K_K_K_K_p_pAjAjAjAjAjAj _p_p_p_p_pC$C$C$_A_A_AAjAjAjAj_K_K_K_K_K_KC$C$C$_p_pAjAjAjAjAjAj _p_p_p_p_p_p_pC$_A_AAjAjAjAj_K_K_K_K_K_KC$C$C$_p_p_pAjAjAjAjAjAj _p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_pAjAjAjAjAjAj _p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_p_pAjAjAjAjAjAj _p_p_p_p_p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAjAjAjAjAj _p_p_p_p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAjAjAjAjAj _p_p_p_p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAjAjAjAjAj _p_p_p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAjAjAjAj _p_p_p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAjAjAjAj _p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAjAj _p_p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAj _p_p_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_K_KAjAj AjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAj AjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAj _A_A_K_K_KAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAj_K_K_K_KAjAjAj _A_A_K_K_K_KAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAjAj_K_K_K_K_K_KAjAj _A_A_p_p_p_p_p_p_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_p_p_p_p_p_p_A_A _A_A_p_p_p_p_p_p_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_p_p_p_p_p_p_A_A _A_A_p_p_p_p_p_p_A_A_AAj_K_K_K_K_K_K_K_K_K_KAjAj_p_p_p_p_p_p_A_A _A_A_p_p_p_p_p_p_A_AAjAj_K_K_K_K_K_K_K_K_K_KAjAj_p_p_p_p_p_p_A_A _A_A_p_p_p_p_p_p_A_AAjAj_K_K_K_K_K_K_K_K_K_KAjAj_p_p_p_p_p_p_A_A _A_A_p_p_p_p_p_A_A_AAjAjAj_K_K_K_K_K_K_K_K_KAjAjAj_p_p_p_p_p_A_A _A_AAjAj_A_A_A_A_A_AAjAjAj_K_K_K_K_K_K_K_K_KAjAjAjAj_A_AAjAj_A_A _A_AAjAjAj_A_A_A_A_AAjAjAjAj_K_K_K_K_K_K_K_KAjAjAjAj_A_AAjAj_A_A _A_AAjAjAjAjAj_A_A_AAjAjAjAj_K_K_K_K_K_K_K_KAjAjAjAjAjAjAjAj_A_A _A_AAjAjAjAjAjAj_A_AAjAjAjAj_K_K_K_K_K_K_K_KAjAjAjAjAjAjAjAj_A_A _A_A_p_p_K_K_K_K_A_AAjAjAjAj_K_K_K_K_K_K_K_KAjAjAj_p_KAjAjAj_A_A _A_A_p_p_K_K_K_K_A_AAjAjAjAj_K_K_K_K_K_K_K_KAjAj_p_p_K_KAjAj_A_A } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/share/txtmerge.c��������������������������������������������������������������0000664�0000764�0000764�00000013247�10545462320�015557� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) J. Ali Harlow 2000 */ /* NetHack may be freely redistributed. See license for details. */ /* * Merge multiple txt tile files into one. Where a tile is present in more * than one file the last tile read is used. * The first tile file read must contain the required tile mapping. The * output file will contain this same mapping; tiles which do not match * any of the tiles found in the first file will be ignored. */ /*#include "config.h"*/ #include "hack.h" #include "tile.h" extern char *FDECL((strdup), (const char *)); struct tile { char *name; pixel *bitmap; unsigned char ph, source; }; static struct tile *tiles=NULL; static int no_tiles=0; static int alloc_tiles=0; static pixel file_bg=DEFAULT_BACKGROUND; static void set_background(bitmap) pixel (*bitmap)[MAX_TILE_X]; { int x, y; const pixel bg = DEFAULT_BACKGROUND; if (file_bg.r == bg.r && file_bg.g == bg.g && file_bg.b == bg.b) return; for(y = 0; y < tile_y; y++) for(x = 0; x < tile_x; x++) if (bitmap[y][x].r == file_bg.r && bitmap[y][x].g == file_bg.g && bitmap[y][x].b == file_bg.b) { bitmap[y][x].r = bg.r; bitmap[y][x].g = bg.g; bitmap[y][x].b = bg.b; } } static void read_tiles() { char ttype[BUFSZ]; int i, j, number; char name[BUFSZ]; pixel pixels[MAX_TILE_Y][MAX_TILE_X], *p; while (read_text_tile_info(pixels, ttype, &number, name)) { if (no_tiles == alloc_tiles) { if (alloc_tiles) alloc_tiles *= 2; else alloc_tiles = 1024; if (!tiles) tiles = (struct tile *)malloc(alloc_tiles * sizeof(*tiles)); else tiles = (struct tile *)realloc(tiles, alloc_tiles * sizeof(*tiles)); if (!tiles) { Fprintf(stderr, "Not enough memory\n"); exit(EXIT_FAILURE); } for(i = no_tiles; i < alloc_tiles; i++) { tiles[i].bitmap = (pixel *) malloc(tile_x * tile_y * sizeof(pixel)); if (!tiles[i].bitmap) { Fprintf(stderr, "Not enough memory\n"); exit(EXIT_FAILURE); } } } set_background(pixels); p = tiles[no_tiles].bitmap; for(j = 0; j < tile_y; j++) { memcpy(p, &pixels[j], tile_x * sizeof(pixel)); p += tile_x; } tiles[no_tiles].ph = strcmp(ttype, "placeholder") == 0; tiles[no_tiles].source = 1; if (!strcmp(name, "null")) tiles[no_tiles].name = NULL; else { tiles[no_tiles].name = strdup(name); if (!tiles[no_tiles].name) { Fprintf(stderr, "Not enough memory\n"); exit(EXIT_FAILURE); } } no_tiles++; } } static boolean match(name1, name2) const char *name1, *name2; { int n; char *s1, *s2; if (!strcmp(name1, "unknown") || !strcmp(name2, "unknown")) return FALSE; if (!strcmp(name1, name2)) return TRUE; s1 = strchr(name1, '/'); s2 = strchr(name2, '/'); if (s1 && !s2) { n = s1 - name1 - 1; if (strlen(name2) == n && !strncmp(name1, name2, n)) return TRUE; else return !strcmp(s1 + 2, name2); } else if (s2 && !s1) { n = s2 - name2 - 1; if (strlen(name1) == n && !strncmp(name1, name2, n)) return TRUE; else return !strcmp(name1, s2 + 2); } else return FALSE; } static void merge_tiles(source) int source; { char ttype[BUFSZ]; int number; char name[BUFSZ]; pixel tile[MAX_TILE_Y][MAX_TILE_X], *p; int i, j; while (read_text_tile_info(tile, ttype, &number, name)) { for(i = 0; i < no_tiles; i++) if (tiles[i].source != source && tiles[i].name && !strcmp(tiles[i].name, name)) break; if (i == no_tiles) for(i = 0; i < no_tiles; i++) if (tiles[i].source != source && tiles[i].name && match(tiles[i].name, name)) { Fprintf(stderr, "warning: replacing tile %s with %s\n", tiles[i].name, name); break; } if (i != no_tiles) { tiles[i].source = source; set_background(tile); p = tiles[i].bitmap; for(j = 0; j < tile_y; j++) { memcpy(p, &tile[j], tile_x * sizeof(pixel)); p += tile_x; } } else Fprintf(stderr, "info: tile %s ignored\n",name); } } static void write_tiles() { const char *type; pixel tile[MAX_TILE_Y][MAX_TILE_X], *p; int i, j; for(i = 0; i < no_tiles; i++) { if (tiles[i].ph) type = "placeholder"; else type = "tile"; p = tiles[i].bitmap; for(j = 0; j < tile_y; j++) { memcpy(&tile[j], p, tile_x * sizeof(pixel)); p += tile_x; } write_text_tile_info(tile, type, i, tiles[i].name); } } int main(argc, argv) int argc; char **argv; { int argn = 1, fn; char *outfile; if (argc > 2 && !strcmp(argv[1], "-p")) { if (!read_text_file_colormap(argv[2])) { perror(argv[2]); exit(EXIT_FAILURE); } init_colormap(); argn += 2; } if (argc - argn < 1) { Fprintf(stderr, "usage: txtmerge [-p palette-file] outfile [[-b<bg>] infile] ...\n"); exit(EXIT_FAILURE); } outfile = argv[argn++]; for(fn = 1; argn < argc; argn++) { if (argv[argn][0] == '-' && argv[argn][1] == 'b') { int r, g, b; pixel bg = DEFAULT_BACKGROUND; if (argv[argn][2]) { if (sscanf(argv[argn] + 2, "%02X%02X%02X", &r, &g, &b) != 3) { Fprintf(stderr, "Background %s not understood.\n", argv[argn] + 2); } else { bg.r = (unsigned char) r; bg.g = (unsigned char) g; bg.b = (unsigned char) b; } } file_bg.r = bg.r; file_bg.g = bg.g; file_bg.b = bg.b; } else { if (!fopen_text_file(argv[argn], RDTMODE)) exit(EXIT_FAILURE); if (fn == 1) read_tiles(); else merge_tiles(fn); fn++; fclose_text_file(); } } if (fn > 1) { if (!fopen_text_file(outfile, WRTMODE)) exit(EXIT_FAILURE); write_tiles(); fclose_text_file(); } exit(EXIT_SUCCESS); /*NOTREACHED*/ return 0; } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/Qt/���������������������������������������������������������������������������0000775�0000764�0000764�00000000000�10545462320�013027� 5����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/Qt/nhsplash.xpm���������������������������������������������������������������0000664�0000764�0000764�00000136055�10545462320�015407� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* 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.'.<Xk z. R a.u r.m.m @ @.sX3 x ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` 4Xc & d.gX; qXe z.=.Q G G G.).d v P.d PXrXo v PXoXoXo PX+ Xo ] Xm ] XH.0 iX>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 -.<Xy.C.' <Xu.`.R.R =.3.`.R.R.R.Z.r.R.r.r n.r n.r.y.Z B B B.h B B B B B B 1 @XIXIX@.Z.:.:.: ^ O O.4.4.4 O O.yX* o HXyXG .XVXVXU.% OX* n b o.r b.r.r b o n.r.`.h /.`.`.` E H H /.` o b o b b b.t.w b o.7.w ! x.&XM k ` ` ` `XM ;.u ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", " ` ` ` ` ` ` ` ` ` ` ` ` N M FXL W f.F h L 6 p.EXLX1.XXf. .<.'XPX< ( AXZ.;.<XJ EXG.P > EXk.{XP.{.{ - (XJ >._.]XPX<X-.O.;X-.R.R.`.{ B B B B./XIXI 0.w.R.7.:.r.r.:.J bX*.`.r O O.yXuXyXG A ..<XZ.%.r n.`.`X-X-.`X-X-X- HX-X-X6.;.<X6 ~ =.hXUXZ.5X<.]X-.` n nX*.7.7 EXkXPXP.bXl cXJXkXj ` ` `Xl ` N ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", " ` ` ` ` ` ` ` ` ` ` ` `Xp.X.X Y.[X; fX4 8.M.o W F.o <.O 9.].6Xc j CXG.fXZ.]X7Xk =.P =.@ =XbX7 7.=.3 = >.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<XdXU.} 1 1 m p.5XtX< u <.A.J =X<.GXJ E E k.= E - -.U ` `.+.@.k ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", " ` ` ` ` ` ` ` ` ` ` ` `.+ 6 M.[XF M | <X8 l.o.i.KX, /.h.~ /Xp.~.p EX> 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.]XPX<XD.'Xn X 6.<XG._. i.M.8 8.. {.FX8.AX-.7 /.7 b @ c &.D.l Q /.7.R p 6.' E >Xy.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.<XJXP E ,XJXJXk.+ ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", " ` ` ` ` ` ` ` ` ` ` ` ` &.I.e.iXLX%.8X;.I f 6 z { 9.n.&.DXp.6 Z j.yX*.J.G.G QX<X6Xu.;.;X<.; HXu.;X6X6.;Xt.fXAXA.O._ .Xn 6._ BXs A.F.FX6.Z.Z.:X3 g g @ @ @.D <X6 /.8.I.F.}X<.5.e.A.O.O A <XtX7 3.w.{XA.[.1 +X5 F +XF FX0 F +X0X5 F F.x.XX1.X.nXp ;XcXcXN.n.l.L {X8X8XL.[ LXLXq.H + 8.,.Y.8 - /XPXP CXJ.0 `.^.$.$ ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", " ` ` ` ` ` ` ` ` ` ` `XM $XL.H.[ Y Y W f.!XC A mXw.,.gXp.T.DXc 1 EX* /.JXP.GXuXtXZ ~.;X&XtXyX6XyXZ.5 p p 6..XhXe.V.!XA.. f.8.!.PXXX8X& ~ H.`.R.Z.r.q g.j.j.s.D {.8.8 pX8XZXZ.E.E.5.OX8.f.O Q.q.2XcXc.0.( MX0X4.g L + KX0 + K F F.1 K.xX5 d I.u.D.DXcXzXc ;.L.,.Y.a.8.[.H., L.H _ 8.HXq MXq.,XNXX zXJXPXPXzXPXV 3 ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", " ` ` ` ` ` ` ` ` ` ` r., l l.H.[X;.[X0.V |.a <.< 6.,X4X4X4 :.g.F z mX<.GX6XyXy.A m.AXt.A.5.5.5.5.A.AXy._Xt (XG.N ( | 9XAXh fXC A z.8 6.! p Q >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<X&XtXUX<.'XZ mXZ m <.' z AX, R.N R a.N q.N q sXh aXA q.V . {.K.Y 9XA B.h u.`.RX- o.+ 0.9.nX8 <XZ.F.o.EXyX<.< XX>.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.<X> -.}.+.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.<Xn X.'.<Xt < p.'.< ~.;.'.JXJ.}.h 3.{ 3 =X7X7 =.3 ZXd.P [ }XeXOXe X R R R s a R.B {.N XXO.| R.f 9.CXw >.} 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.< <XG ~XtXZX8.GX<Xt.;.PX<.U g.k % N ` ` ` ` ` x gXzXkXd i i.=.=.3.= e D CX> 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 _X<XJ.}.} c ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `", " ` ` ` ` ` `.TX:X3 Z i { aXe.<Xn .X>X>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 <X8 l.FXs.z < A.C p c ` ` ` ` ` ` x.T.k.+ k.UX=.= [.NXXX>.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.'.<X<.G C X X (X,.< > -.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 QX<Xn mXUXZXtXZ a.b ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `XS.kXzXB [X>X> 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 ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `" }; �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/Qt/knh-mini.xpm���������������������������������������������������������������0000664�0000764�0000764�00000001036�10545462320�015267� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* XPM */ static char *noname[] = { /* width height ncolors chars_per_pixel */ "16 16 7 1", /* colors */ " c #000000", ". c #DCDCDC", "X c #008080", "o c #A0A0A0", "O c None", "+ c #FFFFFF", "@ c #C3C3C3", /* pixels */ "OOOOOOOOOOOOOOOO", "OOO+O+++@@@O@OOO", "O+O+++++@@@@@O.O", "O+o+XXXXX X @ . ", "O+o+XXXX X X@ . ", "OO +XXXXX X @ O ", "OOO+XXXX X X@ OO", "OOO+XXXXX X @ OO", "OOO+XXXX X X@ OO", "OOOO+XXXX X@ OO", "OOOO+XXX X . OO", "OOO+O+XXX . . OO", "OO+++ +X . ... O", "O+++. O+. .... ", "OO+. OOOOOO.. O", "OOOOOOOOOOOOOOOO" }; ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/Qt/kse-mini.xpm���������������������������������������������������������������0000664�0000764�0000764�00000001036�10545462320�015271� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* XPM */ static char *noname[] = { /* width height ncolors chars_per_pixel */ "16 16 7 1", /* colors */ " c #000000", ". c #DCDCDC", "X c #800080", "o c #A0A0A0", "O c None", "+ c #FFFFFF", "@ c #C3C3C3", /* pixels */ "OOOOOOOOOOOOOOOO", "OOO+O+++@@@O@OOO", "O+O+++++@@@@@O.O", "O+o+XXXXX X @ . ", "O+o+XXXX X X@ . ", "OO +XXXXX X @ O ", "OOO+XXXX X X@ OO", "OOO+XXXXX X @ OO", "OOO+XXXX X X@ OO", "OOOO+XXXX X@ OO", "OOOO+XXX X . OO", "OOO+O+XXX . . OO", "OO+++ +X . ... O", "O+++. O+. .... ", "OO+. OOOOOO.. O", "OOOOOOOOOOOOOOOO" }; ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/Qt/kslashem.lnk���������������������������������������������������������������0000664�0000764�0000764�00000000700�10545462320�015341� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# KDE Config File # Call this file kslashem.kdelnk or kslashem.desktop [KDE Desktop Entry] Name=SlashEM Name[fr]=SlashEM Name[hu]=SlashEM Name[no]=SlashEM Name[sk]=SlashEM Name[cs]=SlashEM Name[hr]=SlashEM Name[pt]=SlashEM Name[pt_BR]=SlashEM Icon=kse.xpm Exec=kslashem -caption "%c" %i %m Type=Application DocPath=kslashem/index.html Comment=Variant of the role-playing game, NetHack - fight monsters and seek the Amulet of Yendor for your god! ����������������������������������������������������������������slashem-0.0.7E7F3/win/Qt/qttableview.cpp������������������������������������������������������������0000664�0000764�0000764�00000163042�10545462320�016070� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/********************************************************************** ** $Id: qttableview.cpp,v 1.1 2002/04/06 12:11:20 j_ali 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 <qscrollbar.h> #include <qpainter.h> #include <qdrawutil.h> #include <limits.h> 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). <img src=qtablevw-m.png> <img src=qtablevw-w.png> \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 <code>width() - x</code>. If \a h is negative, it is replaced with <code>height() - y</code>. 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: <dl compact> <dt> Tbl_vScrollBar <dd> - The table has a vertical scroll bar. <dt> Tbl_hScrollBar <dd> - The table has a horizontal scroll bar. <dt> Tbl_autoVScrollBar <dd> - The table has a vertical scroll bar if - and only if - the table is taller than the view. <dt> Tbl_autoHScrollBar <dd> The table has a horizontal scroll bar if - and only if - the table is wider than the view. <dt> Tbl_autoScrollBars <dd> - The union of the previous two flags. <dt> Tbl_clipCellPainting <dd> - The table uses QPainter::setClipRect() to make sure that paintCell() will not draw outside the cell boundaries. <dt> Tbl_cutCellsV <dd> - 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. <dt> Tbl_cutCellsH <dd> - 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. <dt> Tbl_cutCells <dd> - The union of the previous two flags. <dt> Tbl_scrollLastHCell <dd> - 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. <dt> Tbl_scrollLastVCell <dd> - 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. <dt> Tbl_scrollLastCell <dd> - The union of the previous two flags. <dt> Tbl_smoothHScrolling <dd> - 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. <dt> Tbl_smoothVScrolling <dd> - The table scrolls as smoothly as possible when scrolling vertically. When this flag is not set, scrolling is done one cell at a time. <dt> Tbl_smoothScrolling <dd> - The union of the previous two flags. <dt> Tbl_snapToHGrid <dd> - Except when the user is actually scrolling, the leftmost column shown snaps to the leftmost edge of the view. <dt> Tbl_snapToVGrid <dd> - Except when the user is actually scrolling, the top row snaps to the top edge of the view. <dt> Tbl_snapToGrid <dd> - The union of the previous two flags. </dl> 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( yPos<maxY?yPos:maxY ); if ( inherits( "QMultiLineEdit" ) ) paint.fillRect( r.intersect( updateR ), g.base() ); else paint.eraseRect( r.intersect( updateR ) ); } if ( yPos <= maxY ) { QRect r = viewR; r.setTop( yPos ); if ( inherits( "QMultiLineEdit" ) ) paint.fillRect( r.intersect( updateR ), g.base() ); else paint.eraseRect( r.intersect( updateR ) ); } } /*!\reimp */ void QtTableView::resizeEvent( QResizeEvent * ) { updateScrollBars( horValue | verValue | horSteps | horGeometry | horRange | verSteps | verGeometry | verRange ); showOrHideScrollBars(); updateFrameSize(); int maxX = QMIN( xOffs, maxXOffset() ); // ### can be slow int maxY = QMIN( yOffs, maxYOffset() ); setOffset( maxX, maxY ); } /*! Redraws all visible cells in the table view. */ void QtTableView::updateView() { repaint( viewRect() ); } /*! Returns a pointer to the vertical scroll bar mainly so you can connect() to its signals. Note that the scroll bar works in pixel values; use findRow() to translate to cell numbers. */ QScrollBar *QtTableView::verticalScrollBar() const { QtTableView *that = (QtTableView*)this; // semantic const if ( !vScrollBar ) { QScrollBar *sb = new QScrollBar( QScrollBar::Vertical, that ); #ifndef QT_NO_CURSOR sb->setCursor( 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 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/Qt/Info.plist�����������������������������������������������������������������0000664�0000764�0000764�00000001240�10545462320�014774� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>CFBundleGetInfoHTML</key> <string>http://www.nethack.org</string> <key>CFBundleGetInfoString</key> <string>Copyright (C) 1985-2003 Stichting Mathematisch Centrum</string> <key>CFBundleIconFile</key> <string>nethack.icns</string> <key>CFBundleIdentifier</key> <string>org.nethack.qt</string> <key>CFBundlePackageType</key> <string>APPL</string> <key>CFBundleShortVersionString</key> <string>3.4.3</string> <key>CFBundleSignature</key> <string>NHak</string> </dict> </plist> ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/Qt/Install.Qt�����������������������������������������������������������������0000664�0000764�0000764�00000011274�10545462320�014750� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Installing Slash'EM with a Qt or KDE interface ---------------------------------------------- This document describes the installation of Slash'EM 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: 1. follow the directions for the UNIX installation (in ../../sys/unix) to create the Makefiles. 2. ../../include/config.h define QT_GRAPHICS (search for it). You can comment out TTY_GRAPHICS if you want to, or leave it in to support both interfaces (in which case be sure you have the right curses libraries etc. required for that interface). You may define X11_GRAPHICS and/or GTK_GRAPHICS in addition to support multiple windowing ports (and tty as well, if you want) in the same executable if you so desire. 3. ../../src/Makefile add $(WINQTSRC), $(WINQTOBJ), and $(WINQTLIB) to WINSRC, WINOBJ, and WINLIB respectively, and compile. This will give you an executable supporting both Qt and tty windowing. Prepend -L$(QTDIR)/lib to LFLAGS. As part of your Qt installation, you should have an environment variable QTDIR defined which src/Makefile uses to find the Qt libraries and support files. If you don't have such a variable defined, then you can define QTDIR in src/Makefile to the appropriate place. You can also change the definitions of QTLIBDIR etc. if your installation is particularly unusual. Ensure CXX and LD are set to the compiler and linker you need for compiling and linking C++ software (e.g., set both to g++). To support multiple windowing ports, change the definitions of WINSRC, WINOBJ and WINLIB to include all the relevant variables. 4. ../../Makefile (the top-level makefile) change the CNF_SHARE_QTND setting to contain the files "x11tiles", "rip.xpm", and "nhsplash.xpm" and the CNF_SHARE_DATND to include $(CNF_SHARE_QTND): CNF_SHARE_QTND = x11tiles rip.xpm nhsplash.xpm CNF_SHARE_DATND = $(CNF_SHARE_QTND) If you want to support the other windowing ports, include their $(CNF_SHARE_XXXND) variables also. 5. Follow all the instructions in ../../sys/unix/Install.unx for the remainder of the installation process. 6. Consider adding the lines below to your .slashemrc (or equivalent if you don't run UNIX), as they are likely to give the best interface for this window port: TILESET=name:Small tiles,file:x11tiles OPTIONS=name:player,number_pad,menustyle:partial,!time,showexp OPTIONS=hilite_pet,toptenwin,msghistory:200,windowtype:Qt OPTIONS=tiles:Small tiles The Qt port has support for four extra variables which can also be specified. These are: qt_tilewidth The width of each tile in pixels qt_tileheight The height of each tile in pixels qt_fontsize The font size. One of huge, large, medium or small. These can be abreviated to h, l, m or s. qt_compact Set to 1 to run in a more compact mode suitable for handhelds or 0 for normal operation. If you are using KDE, you may want to also try the KDE version. It just uses the KDE menubar and follows other KDE conventions - there is no extra functionality. To do so: 1. Ensure that you have KDE 2.x libraries on your system (in 1999 KDE 1.x was the norm) 2. ../../src/Makefile Add $(KDECXXFLAGS) to the CXXFLAGS definition, $(KDELFLAGS) to the LFLAGS definition and $(WINKDELIB) to WINLIB. 3. Some additional files here - kse-mini.xpm, kse.xpm, and kslashem.lnk are useful if you want to install "kslashem" in the KDE games directory. If you are using Qtopia, you can compile NetHack for that environment with the following additional steps (this is untested with SlashEM): 1. First be sure that you can build a simple Qtopia application, such as the examples that ship with Qtopia. Do not attempt something as challenging to compile as NetHack before you can already build a Qtopia application for your target device. 2. If you are cross-compiling (eg. targetting an ARM-based handheld), be sure to follow the steps for cross-compiling in the Makefile.src and Makefile.utl files. 3. To CXXFLAGS in Makefile.src, add: -DQWS -I$(QPEDIR)/include -fno-rtti -fno-exceptions 4. Rather than -lqt in WINQTLIB, have: -L$(QPEDIR)/lib -lqpe -lqte 5. After building, use the "mkipks" program that ships with Qtopia to package the result into an ipk file. ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/Qt/knh.xpm��������������������������������������������������������������������0000664�0000764�0000764�00000004202�10545462320�014333� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* XPM */ static char *noname[] = { /* width height ncolors chars_per_pixel */ "40 40 20 1", /* colors */ " c #000000", ". c #0000C0", "X c #FFC0FF", "o c #FFC0C0", "O c #DCDCDC", "+ c #C0C0FF", "@ c #008080", "# c #A0A0A0", "$ c None", "% c #000080", "& c #585858", "* c #800080", "= c #FFFFFF", "- c #FFFFC0", "; c #00C0C0", ": c #C0FFFF", "> c #C0FFC0", ", c #C3C3C3", "< c #FFDCA8", "1 c #0000FF", /* pixels */ "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$", "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$", "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$", "$$$$$$$$=$$$$$$=,==<,=<,$$$$$$,$$$$$$$$$", "$$$$$$$$==$$$=====,=<>,<><$$$<>$$$$$$$$$", "$$$$$$$$===$====,==>,=<,<,,$,,<$$$$$$$$$", "$$$==$$$==========<=<,><,><<><,$$$,<$$$$", "$$$====$========,==,,=<>,<,>,<,$<><,$$$$", "$$$====$==========<=<,,<<><,<><$,,<>$$$$", "$$$$#&&&==$#$#$#@#$&@#&&@&&&&,, && $$", "$$$;#@&@==;#;#;#$;&#@&@$&@&@$>< &@ $$", "$$$====&==###1##.##@&#&@&&$&&<, <>O< $$", "$$$====&==$;##;##;&#@&@$&@&@&>, O<,> $$", "$$$==&@&==#1#;##.##@&#&@&$@$&,< ,< $$", "$$$$ ==###1#;##.#@$&&&@&&@-, $ $$", "$$$$$ =X;#;###&;#&@#&@$&@$&,< $$ $$$", "$$$$$$ ==#$+@+1##@#&@&$@&&&@<> $$$$$$", "$$$$$$$$=X;#1#$#@##@&#@&&&@$&<, $$$$$$", "$$$$$$$$==##;#;##1$#@&$@$&&@&>< $$$$$$", "$$$$$$$$=X;###1#@##@&#@&&@$&&O, $$$$$$", "$$$$$$$$==#1#;##;#.#@&&$@&@&@<> $$$$$$", "$$$$$$$$$==###;#*;#&@#&@&&$&O< $$$$$$$", "$$$$$$$$$==;#1,$;#&#@$@&$@&@<, $$$$$$$", "$$$$$$$$$$=X####.##@&#&&@&&<O $$$$$$$$", "$$$$$$$$$$==;#;##;*#@&@$&&@O< $$$$$$$", "$$$$$$$$==$==1##.#;&@+&&@&O< <, $$$$$$", "$$$$$$$===#:=#;###&+%&@$&O> ><, $$$$$$", "$$$$$$====@&=O##@#;&@#&&,< <,>< $$$$$", "$$$$$===#$== ==$1#&#&@&O> ,<$#,,> $$$$", "$$$$===#;#== ==$#;&@#O, >,#;&<,< $$$$", "$$$==$#;*@O< ====Oo,> <,&$#@&O, $$$", "$$$==;$#&&<, $===<,< <O@&;#&>< $$", "$$$==##;&O>, $$==,> $$ ,<&&#$@o, $$", "$$$===X=O,< $$$$$$$$$$$$$>OO,Oo> $$$", "$$$$====,< $$$$$$$$$$$$$$,<,>,<, $$$$", "$$$$$===<> $$$$$$$$$$$$$$$$><,<> $$$$", "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$", "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$", "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$", "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$" }; ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/Qt/qt_win.cpp�����������������������������������������������������������������0000664�0000764�0000764�00000377004�10545462320�015047� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// 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 <hohmuth@inf.tu-dresden.de> // - Userid control // Svante Gerhard <svante@algonet.se> // - .nethackrc tile and font size settings // Dirk Schoenberger <schoenberger@signsoft.com> // - KDE support // - SlashEm support // and many others for bug reports. // // Unfortunately, this doesn't use Qt as well as I would like, // primarily because NetHack is fundamentally a getkey-type program // rather than being event driven (hence the ugly key and click buffer) // and also because this is my first major application of Qt. // // The problem of NetHack's getkey requirement is solved by intercepting // key events by overiding QApplicion::notify(...), and putting them in // a buffer. Mouse clicks on the map window are treated with a similar // buffer. When the NetHack engine calls for a key, one is taken from // the buffer, or if that is empty, QApplication::enter_loop() is called. // Whenever keys or clicks go into the buffer, QApplication::exit_loop() // is called. // // Another problem is that some NetHack players are decade-long players who // demand complete keyboard control (while Qt and X11 conspire to make this // difficult by having widget-based focus rather than application based - // a good thing in general). This problem is solved by again using the key // event buffer. // // Out of all this hackery comes a silver lining however, as macros for // the super-expert and menus for the ultra-newbie are also made possible // by the key event buffer. // extern "C" { // This includes all the definitions we need from the NetHack main // engine. We pretend MSC is a STDC compiler, because C++ is close // 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 #include "hack.h" #include "func_tab.h" #include "dlb.h" #include "date.h" #include "patchlevel.h" #include "tile2x11.h" #undef Invisible #undef Warning #undef red #undef green #undef blue #undef Black #undef curs #undef TRUE #undef FALSE #undef min #undef max #undef alloc #undef lock #undef yn } #include "qt_win.h" #include <qregexp.h> #include <qpainter.h> #include <qdir.h> #include <qbitmap.h> #include <qkeycode.h> #include <qmenubar.h> #include <qpopupmenu.h> #include <qlayout.h> #include <qheader.h> #include <qradiobutton.h> #include <qtoolbar.h> #include <qtoolbutton.h> #include <qcombobox.h> #include <qvbox.h> #include <qdragobject.h> #include <qtextbrowser.h> #include <qhbox.h> #include <qsignalmapper.h> //#include <qgrid.h> //#include <qlabelled.h> #include <ctype.h> #include "qt_clust.h" #include "qt_xpms.h" #include <dirent.h> #ifdef Q_WS_MACX # include <sys/malloc.h> #else # include <malloc.h> #endif #ifdef _WS_X11_ // For userid control #include <unistd.h> #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 <qsound.h> # endif #endif #ifdef USER_SOUNDS extern "C" void play_sound_for_message(const char* str); #endif // Warwick prefers it this way... #define QT_CHOOSE_RACE_FIRST static const char nh_attribution[] = "<center><big>" DEF_GAME_NAME "</big>" "<br><small>by the " DEF_GAME_NAME " DevTeam</small></center>"; static QString aboutMsg() { QString msg; msg.sprintf( "Qt " DEF_GAME_NAME " is a version of " DEF_GAME_NAME " built\n" #ifdef KDE "using KDE and the Qt GUI toolkit.\n" #else "using the Qt GUI toolkit.\n" #endif "This is version " VERSION_STRING "\n\n" "Homepage:\n http://avrc.city.ac.uk/slashem.html\n\n" "Qt NetHack:\n http://trolls.troll.no/warwick/nethack\n" #ifdef KDE "KDE:\n http://www.kde.org\n" #endif "Qt:\n http://www.troll.no\n" "Slash'EM:\n http://www.slashem.org/"); return msg; } static void 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 ); } NetHackQtLineEdit::NetHackQtLineEdit() : QLineEdit(0) { } NetHackQtLineEdit::NetHackQtLineEdit(QWidget* parent, const char* name) : QLineEdit(parent,name) { } void NetHackQtLineEdit::fakeEvent(int key, int ascii, int state) { QKeyEvent fake(QEvent::KeyPress,key,ascii,state); keyPressEvent(&fake); } extern "C" { /* Used by tile/font-size patch below and in ../../src/files.c */ char *qt_tilewidth=NULL; char *qt_tileheight=NULL; char *qt_fontsize=NULL; #if defined(QWS) int qt_compact_mode = 1; #else int qt_compact_mode = 0; #endif extern const char *enc_stat[]; /* from botl.c */ extern const char *hu_stat[]; /* from eat.c */ extern const char *killed_by_prefix[]; extern int total_tiles_used; // from tile.c extern int tiles_per_row; // from tile.c extern int tiles_per_col; // from tile.c extern short glyph2tile[]; // from tile.c } static int tilefile_tile_W=16; static int tilefile_tile_H=16; #define TILEWMIN 1 #define TILEHMIN 1 /* XPM */ static const char * nh_icon[] = { "40 40 6 1", " s None c none", ". c #ffffff", "X c #dadab6", "o c #916cb6", "O c #6c476c", "+ c #000000", " ", " ", " ", " . .X..XX.XX X ", " .. .....X.XXXXXX XX ", " ... ....X..XX.XXXXX XXX ", " .. ..........X.XXXXXXXXXXX XX ", " .... ........X..XX.XXXXXXXXX XXXX ", " .... ..........X.XXXXXXXXXXX XXXX ", " ooOOO..ooooooOooOOoOOOOOOOXX+++OO++ ", " ooOOO..ooooooooOoOOOOOOOOOXX+++OO++ ", " ....O..ooooooOooOOoOOOOOOOXX+XXXX++ ", " ....O..ooooooooOoOOOOOOOOOXX+XXXX++ ", " ..OOO..ooooooOooOOoOOOOOOOXX+++XX++ ", " ++++..ooooooooOoOOOOOOOOOXX+++ +++ ", " +++..ooooooOooOOoOOOOOOOXX+++ + ", " ++..ooooooooOoOOOOOOOOOXX+++ ", " ..ooooooOooOOoOOOOOOOXX+++ ", " ..ooooooooOoOOOOOOOOOXX+++ ", " ..ooooooOooOOoOOOOOOOXX+++ ", " ..ooooooooOoOOOOOOOOOXX+++ ", " ..oooooOooOOoOOOOOOXX+++ ", " ..oooooooOoOOOOOOOOXX+++ ", " ..ooooOooOOoOOOOOXX+++ ", " ..ooooooOoOOOOOOOXX++++ ", " ..o..oooOooOOoOOOOXX+XX+++ ", " ...o..oooooOoOOOOOXX++XXX++ ", " ....OO..ooOooOOoOOXX+++XXXX++ ", " ...oo..+..oooOoOOOXX++XXooXXX++ ", " ...ooo..++..OooOOoXX+++XXooOXXX+ ", " ..oooOOXX+++....XXXX++++XXOOoOOXX+ ", " ..oooOOXX+++ ...XXX+++++XXOOooOXX++ ", " ..oooOXXX+++ ..XX+++ +XXOOooOXX++ ", " .....XXX++++ XXXXXXX++ ", " ....XX++++ XXXXXXX+ ", " ...XX+++ XXXXX++ ", " ", " ", " ", " "}; /* 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,64,1,this), tileheight(TILEHMIN,64,1,this), widthlbl(&tilewidth,"&Width:",this), heightlbl(&tileheight,"&Height:",this), whichsize("&Zoomed",this), fontsize(this), normal("times"), #ifdef WS_WIN normalfixed("courier new"), #else normalfixed("fixed"), #endif large("times"), theglyphs(0) { 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); tileheight.setValue(14); } else if (w<=900) { // ~800x600 default_fontsize=3; tilewidth.setValue(10); tileheight.setValue(17); } else if (w<=1100) { // ~1024x768 default_fontsize=2; tilewidth.setValue(12); tileheight.setValue(22); } else if (w<=1200) { // ~1152x900 default_fontsize=1; tilewidth.setValue(14); tileheight.setValue(26); } else { // ~1280x1024 and larger default_fontsize=0; tilewidth.setValue(16); tileheight.setValue(30); } // Tile/font sizes read from .nethackrc if (qt_tilewidth != NULL) { tilewidth.setValue(atoi(qt_tilewidth)); free(qt_tilewidth); } if (qt_tileheight != NULL) { tileheight.setValue(atoi(qt_tileheight)); free(qt_tileheight); } if (qt_fontsize != NULL) { switch (tolower(qt_fontsize[0])) { case 'h': default_fontsize = 0; break; 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); } theglyphs=new NetHackQtGlyphs(); resizeTiles(); connect(&tilewidth,SIGNAL(valueChanged(int)),this,SLOT(resizeTiles())); connect(&tileheight,SIGNAL(valueChanged(int)),this,SLOT(resizeTiles())); connect(&whichsize,SIGNAL(toggled(bool)),this,SLOT(setGlyphSize(bool))); fontsize.insertItem("Huge"); fontsize.insertItem("Large"); fontsize.insertItem("Medium"); fontsize.insertItem("Small"); fontsize.insertItem("Tiny"); fontsize.setCurrentItem(default_fontsize); connect(&fontsize,SIGNAL(activated(int)),this,SIGNAL(fontChanged())); QGridLayout* grid = new QGridLayout(this, 5, 2, 8); grid->addMultiCellWidget(&whichsize, 0, 0, 0, 1); grid->addWidget(&tilewidth, 1, 1); grid->addWidget(&widthlbl, 1, 0); grid->addWidget(&tileheight, 2, 1); grid->addWidget(&heightlbl, 2, 0); QLabel* flabel=new QLabel(&fontsize, "&Font:",this); grid->addWidget(flabel, 3, 0); grid->addWidget(&fontsize, 3, 1); QPushButton* dismiss=new QPushButton("Dismiss",this); dismiss->setDefault(TRUE); grid->addMultiCellWidget(dismiss, 4, 4, 0, 1); grid->setRowStretch(4,0); grid->setColStretch(1,1); grid->setColStretch(2,2); grid->activate(); connect(dismiss,SIGNAL(clicked()),this,SLOT(accept())); resize(150,140); } NetHackQtGlyphs& NetHackQtSettings::glyphs() { return *theglyphs; } void NetHackQtSettings::resizeTiles() { int w = tilewidth.value(); int h = tileheight.value(); theglyphs->setSize(w,h); emit tilesChanged(); } void NetHackQtSettings::toggleGlyphSize() { whichsize.toggle(); } void NetHackQtSettings::setGlyphSize(bool which) { QSize n = QSize(tilewidth.value(),tileheight.value()); if ( othersize.isValid() ) { tilewidth.blockSignals(TRUE); tileheight.blockSignals(TRUE); tilewidth.setValue(othersize.width()); tileheight.setValue(othersize.height()); tileheight.blockSignals(FALSE); tilewidth.blockSignals(FALSE); resizeTiles(); } othersize = n; } 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; } // Check to see if tile set has changed and update tiles if necessary. --ALI void NetHackQtSettings::updateTiles() { if (strcmp(theglyphs->tileSet(),tileset)) { delete theglyphs; theglyphs=new NetHackQtGlyphs(); resizeTiles(); } } NetHackQtSettings* qt_settings; NetHackQtKeyBuffer::NetHackQtKeyBuffer() : in(0), out(0) { } bool NetHackQtKeyBuffer::Empty() const { return in==out; } bool NetHackQtKeyBuffer::Full() const { return (in+1)%maxkey==out; } void NetHackQtKeyBuffer::Put(int k, int a, int state) { if ( Full() ) return; // Safety key[in]=k; ascii[in]=a; 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() { if ( Empty() ) return 0; int r=TopKey(); out=(out+1)%maxkey; return r; } int NetHackQtKeyBuffer::GetAscii() { if ( Empty() ) return 0; // Safety int r=TopAscii(); out=(out+1)%maxkey; return r; } int NetHackQtKeyBuffer::GetState() { if ( Empty() ) return 0; int r=TopState(); out=(out+1)%maxkey; return r; } int NetHackQtKeyBuffer::TopKey() const { if ( Empty() ) return 0; return key[out]; } int NetHackQtKeyBuffer::TopAscii() const { if ( Empty() ) return 0; return ascii[out]; } int NetHackQtKeyBuffer::TopState() const { if ( Empty() ) return 0; return state[out]; } NetHackQtClickBuffer::NetHackQtClickBuffer() : in(0), out(0) { } bool NetHackQtClickBuffer::Empty() const { return in==out; } bool NetHackQtClickBuffer::Full() const { return (in+1)%maxclick==out; } void NetHackQtClickBuffer::Put(int x, int y, int mod) { click[in].x=x; click[in].y=y; click[in].mod=mod; in=(in+1)%maxclick; } int NetHackQtClickBuffer::NextX() const { return click[out].x; } int NetHackQtClickBuffer::NextY() const { return click[out].y; } int NetHackQtClickBuffer::NextMod() const { return click[out].mod; } void NetHackQtClickBuffer::Get() { out=(out+1)%maxclick; } class NhPSListViewItem : public QListViewItem { public: NhPSListViewItem( QListView* parent, const QString& name ) : QListViewItem(parent, name) { } void setGlyph(int g) { NetHackQtGlyphs& glyphs = qt_settings->glyphs(); int gw = glyphs.width(); int gh = glyphs.height(); QPixmap pm(gw,gh); QPainter p(&pm); glyphs.drawGlyph(p, g, 0, 0); p.end(); setPixmap(0,pm); setHeight(QMAX(pm.height()+1,height())); } void paintCell( QPainter *p, const QColorGroup &cg, int column, int width, int alignment ) { if ( isSelectable() ) { QListViewItem::paintCell( p, cg, column, width, alignment ); } else { QColorGroup disabled( cg.foreground().light(), cg.button().light(), cg.light(), cg.dark(), cg.mid(), gray, cg.base() ); QListViewItem::paintCell( p, disabled, column, width, alignment ); } } }; class NhPSListViewRole : public NhPSListViewItem { public: NhPSListViewRole( QListView* parent, int id ) : NhPSListViewItem(parent, #ifdef QT_CHOOSE_RACE_FIRST // Lowerize - looks better QString(QChar(roles[id].name.m[0])).lower()+QString(roles[id].name.m+1) #else roles[id].name.m #endif ) { setGlyph(monnum_to_glyph(roles[id].malenum)); } }; class NhPSListViewRace : public NhPSListViewItem { public: NhPSListViewRace( QListView* parent, int id ) : NhPSListViewItem(parent, #ifdef QT_CHOOSE_RACE_FIRST // Capitalize - looks better QString(QChar(races[id].noun[0])).upper()+QString(races[id].noun+1) #else QString(QChar(races[id].noun[0])+QString(races[id].noun+1)) #endif ) { setGlyph(monnum_to_glyph(races[id].malenum)); } }; class NhPSListView : public QListView { public: NhPSListView( QWidget* parent ) : QListView(parent) { setSorting(-1); // order is identity header()->setClickEnabled(FALSE); } QSizePolicy sizePolicy() const { return QSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding); } QSize minimumSizeHint() const { return sizeHint(); } QSize sizeHint() const { QListView::sizeHint(); QSize sz = header()->sizeHint(); int h=0; QListViewItem* c=firstChild(); while (c) h+=c->height(),c = c->nextSibling(); sz += QSize(frameWidth()*2, h+frameWidth()*2); return sz; } 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) { QListViewItem* c=firstChild(); while (i--) c = c->nextSibling(); c->setSelected(TRUE); } }; NetHackQtPlayerSelector::NetHackQtPlayerSelector(NetHackQtKeyBuffer& ks) : QDialog(qApp->mainWidget(),"plsel",TRUE), keysource(ks), fully_specified_role(TRUE) { /* 0 1 2 + Name ------------------------------------+ 0 | | + ---- ------------------------------------+ + Role ---+ + Race ---+ + Gender ------+ | | | | | * Male | 1 | | | | | * Female | | | | | +--------------+ | | | | | | | | + Alignment ---+ 2 | | | | | * Male | | | | | | * Female | | | | | +--------------+ 3 | | | | ...stretch... | | | | 4 | | | | [ Play ] 5 | | | | [ Quit ] +---------+ +---------+ */ int marg=4; QGridLayout *l = new QGridLayout(this,6,3,marg,marg); QButtonGroup* namebox = new QButtonGroup(1,Horizontal,"Name",this); QLineEdit* name = new QLineEdit(namebox); name->setMaxLength(sizeof(plname)-1); if ( strncmp(plname,"player",6) && strncmp(plname,"games",5) ) name->setText(plname); connect(name, SIGNAL(textChanged(const QString&)), this, SLOT(selectName(const QString&)) ); name->setFocus(); 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 race = new NhPSListView(this); role = new NhPSListView(this); l->addMultiCellWidget( race, 1,5,0,0 ); l->addMultiCellWidget( role, 1,5,1,1 ); #else role = new NhPSListView(this); race = new NhPSListView(this); l->addMultiCellWidget( role, 1,5,0,0 ); l->addMultiCellWidget( race, 1,5,1,1 ); #endif role->addColumn("Role"); race->addColumn("Race"); l->addWidget( genderbox, 1, 2 ); l->addWidget( alignbox, 2, 2 ); l->addWidget( logo, 3, 2, AlignCenter ); l->setRowStretch( 3, 5 ); int i; int nrole; for (nrole=0; roles[nrole].name.m; nrole++) ; for (i=nrole-1; i>=0; i--) { // XXX QListView unsorted goes in rev. new NhPSListViewRole( role, i ); } connect( role, SIGNAL(selectionChanged()), this, SLOT(selectRole()) ); int nrace; for (nrace=0; races[nrace].noun; nrace++) ; for (i=nrace-1; i>=0; i--) { new NhPSListViewRace( race, i ); } connect( race, SIGNAL(selectionChanged()), this, SLOT(selectRace()) ); gender = new QRadioButton*[ROLE_GENDERS]; for (i=0; i<ROLE_GENDERS; i++) { gender[i] = new QRadioButton( genders[i].adj, genderbox ); } connect( genderbox, SIGNAL(clicked(int)), this, SLOT(selectGender(int)) ); alignment = new QRadioButton*[ROLE_ALIGNS]; for (i=0; i<ROLE_ALIGNS; i++) { alignment[i] = new QRadioButton( aligns[i].adj, alignbox ); } connect( alignbox, SIGNAL(clicked(int)), this, SLOT(selectAlignment(int)) ); QPushButton* ok = new QPushButton("Play",this); l->addWidget( ok, 4, 2 ); ok->setDefault(TRUE); connect( ok, SIGNAL(clicked()), this, SLOT(accept()) ); QPushButton* cancel = new QPushButton("Quit",this); 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 == ROLE_NONE || ro == ROLE_RANDOM) { ro = rn2(nrole); if (flags.initrole != ROLE_RANDOM) { fully_specified_role = FALSE; } } int ra = flags.initrace; if (ra == ROLE_NONE || ra == ROLE_RANDOM) { ra = rn2(nrace); if (flags.initrace != ROLE_RANDOM) { 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 >= 0 && flags.initrace < 0) { choose_race_first = FALSE; } #else choose_race_first = FALSE; if (flags.initrace >= 0 && flags.initrole < 0) { choose_race_first = TRUE; } #endif while (!validrace(ro,ra)) { if (choose_race_first) { ro = rn2(nrole); if (flags.initrole != ROLE_RANDOM) { fully_specified_role = FALSE; } } else { ra = rn2(nrace); if (flags.initrace != ROLE_RANDOM) { fully_specified_role = FALSE; } } } 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(a); QListViewItem* li; li = role->firstChild(); while (ro--) li=li->nextSibling(); role->setSelected(li,TRUE); li = race->firstChild(); while (ra--) li=li->nextSibling(); race->setSelected(li,TRUE); flags.initrace = race->selectedItemNumber(); flags.initrole = role->selectedItemNumber(); } void NetHackQtPlayerSelector::selectName(const QString& n) { strncpy(plname,n.latin1(),sizeof(plname)-1); } void NetHackQtPlayerSelector::selectRole() { int ra = race->selectedItemNumber(); int ro = role->selectedItemNumber(); if (ra == -1 || ro == -1) return; #ifdef QT_CHOOSE_RACE_FIRST selectRace(); #else QListViewItem* i=role->currentItem(); QListViewItem* valid=0; int j; NhPSListViewItem* item; item = (NhPSListViewItem*)role->firstChild(); for (j=0; roles[j].name.m; j++) { bool v = validrace(j,ra); item->setSelectable(TRUE); if ( !valid && v ) valid = item; item=(NhPSListViewItem*)item->nextSibling(); } if ( !validrace(role->selectedItemNumber(),ra) ) i = valid; role->setSelected(i,TRUE); item = (NhPSListViewItem*)role->firstChild(); for (j=0; roles[j].name.m; j++) { bool v = validrace(j,ra); item->setSelectable(v); item->repaint(); item=(NhPSListViewItem*)item->nextSibling(); } #endif flags.initrole = role->selectedItemNumber(); setupOthers(); } void NetHackQtPlayerSelector::selectRace() { int ra = race->selectedItemNumber(); int ro = role->selectedItemNumber(); if (ra == -1 || ro == -1) return; #ifndef 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); if ( !valid && v ) valid = item; item=(NhPSListViewItem*)item->nextSibling(); } if ( !validrace(ro,race->selectedItemNumber()) ) i = valid; race->setSelected(i,TRUE); item = (NhPSListViewItem*)race->firstChild(); for (j=0; races[j].noun; j++) { bool v = validrace(ro,j); item->setSelectable(v); item->repaint(); item=(NhPSListViewItem*)item->nextSibling(); } #endif flags.initrace = race->selectedItemNumber(); setupOthers(); } void NetHackQtPlayerSelector::setupOthers() { int ro = role->selectedItemNumber(); int ra = race->selectedItemNumber(); int valid=-1; int c=0; int j; for (j=0; j<ROLE_GENDERS; j++) { bool v = validgend(ro,ra,j); if ( gender[j]->isChecked() ) c = j; gender[j]->setEnabled(v); if ( valid<0 && v ) valid = j; } if ( !validgend(ro,ra,c) ) c = valid; int k; for (k=0; k<ROLE_GENDERS; k++) { gender[k]->setChecked(c==k); } selectGender(c); valid=-1; for (j=0; j<ROLE_ALIGNS; j++) { bool v = validalign(ro,ra,j); if ( alignment[j]->isChecked() ) c = j; alignment[j]->setEnabled(v); if ( valid<0 && v ) valid = j; } if ( !validalign(ro,ra,c) ) c = valid; for (k=0; k<ROLE_ALIGNS; k++) { alignment[k]->setChecked(c==k); } selectAlignment(c); } void NetHackQtPlayerSelector::selectGender(int i) { flags.initgend = i; } void NetHackQtPlayerSelector::selectAlignment(int i) { flags.initalign = i; } void NetHackQtPlayerSelector::done(int i) { setResult(i); qApp->exit_loop(); } void NetHackQtPlayerSelector::Quit() { done(R_Quit); qApp->exit_loop(); } void NetHackQtPlayerSelector::Random() { done(R_Rand); qApp->exit_loop(); } 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; } } NetHackQtStringRequestor::NetHackQtStringRequestor(NetHackQtKeyBuffer& ks, const char* p, const char* cancelstr) : QDialog(qApp->mainWidget(),"string",FALSE), prompt(p,this,"prompt"), input(this,"input"), keysource(ks) { cancel=new QPushButton(cancelstr,this); connect(cancel,SIGNAL(clicked()),this,SLOT(reject())); okay=new QPushButton("Okay",this); connect(okay,SIGNAL(clicked()),this,SLOT(accept())); connect(&input,SIGNAL(returnPressed()),this,SLOT(accept())); okay->setDefault(TRUE); setFocusPolicy(StrongFocus); } void NetHackQtStringRequestor::resizeEvent(QResizeEvent*) { const int margin=5; const int gutter=5; int h=(height()-margin*2-gutter); if (strlen(prompt.text()) > 16) { h/=3; prompt.setGeometry(margin,margin,width()-margin*2,h); input.setGeometry(width()*1/5,margin+h+gutter, (width()-margin-2-gutter)*4/5,h); } else { h/=2; prompt.setGeometry(margin,margin,(width()-margin*2-gutter)*2/5,h); input.setGeometry(prompt.geometry().right()+gutter,margin, (width()-margin-2-gutter)*3/5,h); } cancel->setGeometry(margin,input.geometry().bottom()+gutter, (width()-margin*2-gutter)/2,h); okay->setGeometry(cancel->geometry().right()+gutter,cancel->geometry().y(), cancel->width(),h); } void NetHackQtStringRequestor::SetDefault(const char* d) { input.setText(d); } bool NetHackQtStringRequestor::Get(char* buffer, int maxchar) { input.setMaxLength(maxchar); if (strlen(prompt.text()) > 16) { resize(fontMetrics().width(prompt.text())+50,fontMetrics().height()*6); } else { resize(fontMetrics().width(prompt.text())*2+50,fontMetrics().height()*4); } centerOnMain(this); show(); input.setFocus(); setResult(-1); while (result()==-1) { // Put keys in buffer (eg. from macros, from out-of-focus input) if (!keysource.Empty()) { while (!keysource.Empty()) { int key=keysource.TopKey(); int ascii=keysource.TopAscii(); int state=keysource.GetState(); if (ascii=='\r' || ascii=='\n') { // CR or LF in buffer causes confirmation strcpy(buffer,input.text()); return TRUE; } else if (ascii=='\033') { return FALSE; } else { input.fakeEvent(key,ascii,state); } } } qApp->enter_loop(); } // XXX Get rid of extra keys, since we couldn't get focus! while (!keysource.Empty()) keysource.GetKey(); if (result()) { strcpy(buffer,input.text()); return TRUE; } else { return FALSE; } } void NetHackQtStringRequestor::done(int i) { setResult(i); qApp->exit_loop(); } NetHackQtWindow::NetHackQtWindow() { } NetHackQtWindow::~NetHackQtWindow() { } // XXX Use "expected ..." for now, abort or default later. // void NetHackQtWindow::Clear() { puts("unexpected Clear"); } void NetHackQtWindow::Display(bool block) { puts("unexpected Display"); } bool NetHackQtWindow::Destroy() { return TRUE; } void NetHackQtWindow::CursorTo(int x,int y) { puts("unexpected CursorTo"); } void NetHackQtWindow::PutStr(int attr, const char* text) { puts("unexpected PutStr"); } void NetHackQtWindow::StartMenu() { puts("unexpected StartMenu"); } void NetHackQtWindow::AddMenu(int glyph, const ANY_P* identifier, char ch, char gch, int attr, const char* str, bool presel) { puts("unexpected AddMenu"); } void NetHackQtWindow::EndMenu(const char* prompt) { puts("unexpected EndMenu"); } int NetHackQtWindow::SelectMenu(int how, MENU_ITEM_P **menu_list) { puts("unexpected SelectMenu"); return 0; } void NetHackQtWindow::ClipAround(int x,int y) { puts("unexpected ClipAround"); } void NetHackQtWindow::PrintGlyph(int x,int y,int glyph) { puts("unexpected PrintGlyph"); } //void NetHackQtWindow::PrintGlyphCompose(int x,int y,int,int) { puts("unexpected PrintGlyphCompose"); } void NetHackQtWindow::UseRIP(int how) { puts("unexpected UseRIP"); } // XXX Hmmm... crash after saving bones file if Map window is // XXX deleted. Strange bug somewhere. bool NetHackQtMapWindow::Destroy() { return FALSE; } NetHackQtMapWindow::NetHackQtMapWindow(NetHackQtClickBuffer& click_sink) : clicksink(click_sink), change(10), rogue_font(0) { viewport.addChild(this); 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(); int gw = glyphs.width(); int gh = glyphs.height(); // Be exactly the size we want to be - full map... resize(COLNO*gw,ROWNO*gh); 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(); change.add(0,0,COLNO,ROWNO); delete rogue_font; rogue_font = 0; Display(FALSE); emit resized(); } NetHackQtMapWindow::~NetHackQtMapWindow() { // Remove from viewport porthole, since that is a destructible member. viewport.removeChild(this); recreate(0,0,QPoint(0,0)); } QWidget* NetHackQtMapWindow::Widget() { return &viewport; } void NetHackQtMapWindow::Scroll(int dx, int dy) { if (viewport.horizontalScrollBar()->isVisible()) { while (dx<0) { viewport.horizontalScrollBar()->subtractPage(); dx++; } while (dx>0) { viewport.horizontalScrollBar()->addPage(); dx--; } } if (viewport.verticalScrollBar()->isVisible()) { while (dy<0) { viewport.verticalScrollBar()->subtractPage(); dy++; } while (dy>0) { viewport.verticalScrollBar()->addPage(); dy--; } } } void NetHackQtMapWindow::Clear() { unsigned short stone=cmap_to_glyph(S_stone); /* * Tile set may have changed if tileset option changed via doset(). --ALI */ qt_settings->updateTiles(); for (int j=0; j<ROWNO; j++) { for (int i=0; i<COLNO; i++) { Glyph(i,j)=stone; } } change.clear(); change.add(0,0,COLNO,ROWNO); } void NetHackQtMapWindow::clickCursor() { clicksink.Put(cursor.x(),cursor.y(),CLICK_1); qApp->exit_loop(); } void NetHackQtMapWindow::mousePressEvent(QMouseEvent* event) { clicksink.Put( event->pos().x()/qt_settings->glyphs().width(), event->pos().y()/qt_settings->glyphs().height(), event->button()==LeftButton ? CLICK_1 : CLICK_2 ); qApp->exit_loop(); } #ifdef TEXTCOLOR static const QPen& nhcolor_to_pen(int c) { static QPen* pen=0; if ( !pen ) { pen = new QPen[17]; pen[0] = Qt::black; pen[1] = Qt::red; pen[2] = QColor(0,191,0); pen[3] = QColor(127,127,0); pen[4] = Qt::blue; pen[5] = Qt::magenta; pen[6] = Qt::cyan; pen[7] = Qt::gray; pen[8] = Qt::white; // no color pen[9] = QColor(255,127,0); pen[10] = QColor(127,255,127); pen[11] = Qt::yellow; pen[12] = QColor(127,127,255); pen[13] = QColor(255,127,255); pen[14] = QColor(127,255,255); pen[15] = Qt::white; pen[16] = Qt::black; } return pen[c]; } #endif void NetHackQtMapWindow::paintEvent(QPaintEvent* event) { QRect area=event->rect(); QRect garea; garea.setCoords( QMAX(0,area.left()/qt_settings->glyphs().width()), QMAX(0,area.top()/qt_settings->glyphs().height()), QMIN(COLNO-1,area.right()/qt_settings->glyphs().width()), QMIN(ROWNO-1,area.bottom()/qt_settings->glyphs().height()) ); QPainter painter; painter.begin(this); if ( #ifdef REINCARNATION Is_rogue_level(&u.uz) || #endif iflags.wc_ascii_map ) { // You enter a VERY primitive world! painter.setClipRect( event->rect() ); // (normally we don't clip) painter.fillRect( event->rect(), black ); if ( !rogue_font ) { // Find font... int pts = 5; QString fontfamily = iflags.wc_font_map ? iflags.wc_font_map : "Courier"; bool bold = FALSE; if ( fontfamily.right(5).lower() == "-bold" ) { fontfamily.truncate(fontfamily.length()-5); bold = TRUE; } while ( pts < 32 ) { QFont f(fontfamily, pts, bold ? QFont::Bold : QFont::Normal); painter.setFont(QFont(fontfamily, pts)); QFontMetrics fm = painter.fontMetrics(); if ( fm.width("M") > qt_settings->glyphs().width() ) break; if ( fm.height() > qt_settings->glyphs().height() ) break; pts++; } rogue_font = new QFont(fontfamily,pts-1); } painter.setFont(*rogue_font); for (int j=garea.top(); j<=garea.bottom(); j++) { 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 painter.drawText( i*qt_settings->glyphs().width(), j*qt_settings->glyphs().height(), qt_settings->glyphs().width(), qt_settings->glyphs().height(), AlignCenter, (const char*)&ch, 1 ); if (glyph_is_pet(g) #ifdef TEXTCOLOR && ::iflags.hilite_pet #endif ) { painter.drawPixmap(QPoint(i*qt_settings->glyphs().width(), j*qt_settings->glyphs().height()), pet_annotation); } } } painter.setFont(font()); } else { for (int j=garea.top(); j<=garea.bottom(); j++) { for (int i=garea.left(); i<=garea.right(); i++) { unsigned short g=Glyph(i,j); qt_settings->glyphs().drawCell(painter, g, i, j); if (glyph_is_pet(g) #ifdef TEXTCOLOR && ::iflags.hilite_pet #endif ) { painter.drawPixmap(QPoint(i*qt_settings->glyphs().width(), j*qt_settings->glyphs().height()), pet_annotation); } } } } if (garea.contains(cursor)) { #ifdef REINCARNATION if (Is_rogue_level(&u.uz)) { #ifdef TEXTCOLOR painter.setPen( white ); #else painter.setPen( green ); // REALLY primitive #endif } else #endif { int hp100; if (u.mtimedone) { hp100=u.mhmax ? u.mh*100/u.mhmax : 100; } else { hp100=u.uhpmax ? u.uhp*100/u.uhpmax : 100; } if (hp100 > 75) painter.setPen(white); else if (hp100 > 50) painter.setPen(yellow); else if (hp100 > 25) painter.setPen(QColor(0xff,0xbf,0x00)); // orange else if (hp100 > 10) painter.setPen(red); else painter.setPen(magenta); } painter.drawRect( cursor.x()*qt_settings->glyphs().width(),cursor.y()*qt_settings->glyphs().height(), 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(); } void NetHackQtMapWindow::Display(bool block) { for (int i=0; i<change.clusters(); i++) { const QRect& ch=change[i]; repaint( ch.x()*qt_settings->glyphs().width(), ch.y()*qt_settings->glyphs().height(), ch.width()*qt_settings->glyphs().width(), ch.height()*qt_settings->glyphs().height(), FALSE ); } change.clear(); if (block) { yn_function("Press a key when done viewing",0,'\0'); } } void NetHackQtMapWindow::CursorTo(int x,int y) { Changed(cursor.x(),cursor.y()); cursor.setX(x); cursor.setY(y); Changed(cursor.x(),cursor.y()); } void NetHackQtMapWindow::PutStr(int attr, const char* text) { puts("unexpected PutStr in MapWindow"); } void NetHackQtMapWindow::ClipAround(int x,int y) { // Convert to pixel of center of tile x=x*qt_settings->glyphs().width()+qt_settings->glyphs().width()/2; y=y*qt_settings->glyphs().height()+qt_settings->glyphs().height()/2; // Then ensure that pixel is visible viewport.center(x,y,0.45,0.45); } void NetHackQtMapWindow::PrintGlyph(int x,int y,int glyph) { Glyph(x,y)=glyph; Changed(x,y); } //void NetHackQtMapWindow::PrintGlyphCompose(int x,int y,int glyph1, int glyph2) //{ // TODO: composed graphics //} void NetHackQtMapWindow::Changed(int x, int y) { change.add(x,y); } class NetHackQtScrollText : public QTableView { struct UData { UData() : text(0), attr(0) { } ~UData() { if (text) free(text); } char* text; int attr; }; public: int uncleared; NetHackQtScrollText(int maxlength) : uncleared(0), maxitems(maxlength), first(0), count(0), item_cycle(maxlength) { setNumCols(1); setCellWidth(200); setCellHeight(fontMetrics().height()); setBackgroundColor(white); setTableFlags(Tbl_vScrollBar |Tbl_autoHScrollBar |Tbl_clipCellPainting |Tbl_smoothScrolling); } ~NetHackQtScrollText() { } void Scroll(int dx, int dy) { setXOffset(xOffset()+dx*viewWidth()); setYOffset(yOffset()+dy*viewHeight()); } void insertItem(int attr, const char* text) { setTopCell(count); setAutoUpdate(FALSE); int i; if (count<maxitems) { i=count++; setNumRows(count); } else { i=count-1; first=(first+1)%maxitems; } item(i).attr=attr; item(i).text=strdup(text); int w=datumWidth(item(i)); if (w > cellWidth()) { // Get wider. setCellWidth(w); } setTopCell(count); setAutoUpdate(TRUE); if (viewHeight() >= totalHeight()-cellHeight()) { repaint(); } else { scroll(0,cellHeight()); } } virtual void setFont(const QFont& font) { QTableView::setFont(font); setCellHeight(fontMetrics().height()); } protected: UData& item(int i) { return item_cycle[(first+i)%maxitems]; } const int maxitems; int first, count; QArray<UData> item_cycle; int datumWidth(const UData& uitem) { if (uitem.text) { int width=fontMetrics().width(uitem.text)+3; if (uitem.attr) { // XXX Too expensive to do properly, because // XXX we have to set the font of the widget // XXX just to get the font metrics information! // XXX Could hold a fake widget for that // XXX purpose, but this hack is less ugly. width+=width/10; } return width; } else { return 0; } } virtual void setupPainter(QPainter *p) { // XXX This shouldn't be needed - we set the bg in the constructor. p->setBackgroundColor(white); } virtual void paintCell(QPainter *p, int row, int col) { bool sel=FALSE; UData& uitem=item(row); if (!sel && row < count-uncleared) { p->setPen(darkGray); } else { p->setPen(black); } if (uitem.attr) { // XXX only bold QFont bold(font().family(),font().pointSize(),QFont::Bold); p->setFont(bold); } p->drawText(3, 0, cellWidth(), cellHeight(), AlignLeft|AlignVCenter, uitem.text); if (uitem.attr) { p->setFont(font()); } } }; NetHackQtMessageWindow::NetHackQtMessageWindow() : list(new NetHackQtScrollText(::iflags.msg_history)) { ::iflags.window_inited = 1; map = 0; connect(qt_settings,SIGNAL(fontChanged()),this,SLOT(updateFont())); updateFont(); } NetHackQtMessageWindow::~NetHackQtMessageWindow() { ::iflags.window_inited = 0; delete list; } 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) { list->Scroll(dx,dy); } void NetHackQtMessageWindow::Clear() { if ( map ) map->clearMessages(); if (list->uncleared) { list->uncleared=0; changed=TRUE; Display(FALSE); } } void NetHackQtMessageWindow::Display(bool block) { if (changed) { list->repaint(); changed=FALSE; } } void NetHackQtMessageWindow::PutStr(int attr, const char* text) { #ifdef USER_SOUNDS play_sound_for_message(text); #endif changed=TRUE; list->uncleared++; list->insertItem(attr,text); // Force scrollbar to bottom // XXX list->setTopItem(list->count()); if ( map ) map->putMessage(attr, text); } NetHackQtLabelledIcon::NetHackQtLabelledIcon(QWidget* parent, const char* l) : QWidget(parent), low_is_good(FALSE), prev_value(-123), turn_count(-1), label(new QLabel(l,this)), icon(0) { initHighlight(); } NetHackQtLabelledIcon::NetHackQtLabelledIcon(QWidget* parent, const char* l, const QPixmap& i) : QWidget(parent), low_is_good(FALSE), prev_value(-123), turn_count(-1), label(new QLabel(l,this)), icon(new QLabel(this)) { setIcon(i); initHighlight(); } void NetHackQtLabelledIcon::initHighlight() { const QPalette& pal=palette(); const QColorGroup& pa=pal.normal(); //QColorGroup good(white,darkGreen,pa.light(),pa.dark(),pa.mid(),white,pa.base()); QColorGroup good(black,green,pa.light(),pa.dark(),pa.mid(),black,pa.base()); QColorGroup bad(white,red,pa.light(),pa.dark(),pa.mid(),white,pa.base()); hl_good=pal.copy(); hl_good.setNormal(good); hl_good.setActive(good); hl_bad=pal.copy(); hl_bad.setNormal(bad); hl_bad.setActive(bad); } void NetHackQtLabelledIcon::setLabel(const char* t, bool lower) { if (!label) { label=new QLabel(this); label->setFont(font()); resizeEvent(0); } if (0!=strcmp(label->text(),t)) { label->setText(t); highlight(lower==low_is_good ? hl_good : hl_bad); } } void NetHackQtLabelledIcon::setLabel(const char* t, long v, long cv, const char* tail) { char buf[BUFSZ]; if (v==NoNum) { Sprintf(buf,"%s%s",t,tail); } else { Sprintf(buf,"%s%ld%s",t,v,tail); } setLabel(buf,cv<prev_value); prev_value=cv; } void NetHackQtLabelledIcon::setLabel(const char* t, long v, const char* tail) { setLabel(t,v,v,tail); } void NetHackQtLabelledIcon::setIcon(const QPixmap& i) { if (icon) icon->setPixmap(i); else { icon=new QLabel(this); icon->setPixmap(i); resizeEvent(0); } icon->resize(i.width(),i.height()); } void NetHackQtLabelledIcon::setFont(const QFont& f) { QWidget::setFont(f); if (label) label->setFont(f); } void NetHackQtLabelledIcon::show() { #if QT_VERSION >= 300 if (isHidden()) #else if (!isVisible()) #endif highlight(hl_bad); QWidget::show(); } void NetHackQtLabelledIcon::highlightWhenChanging() { turn_count=0; } void NetHackQtLabelledIcon::lowIsGood() { low_is_good=TRUE; } void NetHackQtLabelledIcon::dissipateHighlight() { if (turn_count>0) { turn_count--; if (!turn_count) unhighlight(); } } void NetHackQtLabelledIcon::highlight(const QPalette& hl) { if (label) { // Surely it is?! if (turn_count>=0) { label->setPalette(hl); turn_count=4; // `4' includes this turn, so dissipates after // 3 more keypresses. } else { label->setPalette(palette()); } } } void NetHackQtLabelledIcon::unhighlight() { if (label) { // Surely it is?! label->setPalette(palette()); } } void NetHackQtLabelledIcon::resizeEvent(QResizeEvent*) { setAlignments(); //int labw=label ? label->fontMetrics().width(label->text()) : 0; int labh=label ? label->fontMetrics().height() : 0; int icoh=icon ? icon->height() : 0; int h=icoh+labh; int icoy=(h>height() ? height()-labh-icoh : height()/2-h/2); int laby=icoy+icoh; if (icon) { icon->setGeometry(0,icoy,width(),icoh); } if (label) { label->setGeometry(0,laby,width(),labh); } } void NetHackQtLabelledIcon::setAlignments() { if (label) label->setAlignment(AlignHCenter|AlignVCenter); if (icon) icon->setAlignment(AlignHCenter|AlignVCenter); } static void tryload(QPixmap& pm, const char* fn) { #ifndef FILE_AREAS const char *filename = fn; #else char *filename = make_file_name(FILE_AREA_SHARE, fn); #endif if (!pm.load(filename)) { QString msg; msg.sprintf("Cannot load \"%s\"", fn); QMessageBox::warning(qApp->mainWidget(), "IO Error", msg); } #ifdef FILE_AREAS free(filename); #endif } NetHackQtStatusWindow::NetHackQtStatusWindow() : // Notes: // Alignment needs -2 init value, because -1 is an alignment. // Armor Class is an schar, so 256 is out of range. // Blank value is 0 and should never change. name(this,"(name)"), dlevel(this,"(dlevel)"), str(this,"STR"), dex(this,"DEX"), con(this,"CON"), intel(this,"INT"), wis(this,"WIS"), cha(this,"CHA"), gold(this,"Gold"), hp(this,"Hit Points"), power(this,"Power"), ac(this,"Armour Class"), level(this,"Level"), exp(this,"Experience"), align(this,"Alignment"), time(this,"Time"), score(this,"Score"), weight(this,"Weight"), hunger(this,""), confused(this,"Confused"), sick_fp(this,"Sick"), sick_il(this,"Ill"), blind(this,"Blind"), stunned(this,"Stunned"), hallu(this,"Hallu"), encumber(this,""), hline1(this), hline2(this), hline3(this), first_set(TRUE) { p_str = QPixmap(str_xpm); p_str = QPixmap(str_xpm); p_dex = QPixmap(dex_xpm); p_con = QPixmap(cns_xpm); p_int = QPixmap(int_xpm); p_wis = QPixmap(wis_xpm); p_cha = QPixmap(cha_xpm); p_chaotic = QPixmap(chaotic_xpm); p_neutral = QPixmap(neutral_xpm); p_lawful = QPixmap(lawful_xpm); p_satiated = QPixmap(satiated_xpm); p_hungry = QPixmap(hungry_xpm); p_confused = QPixmap(confused_xpm); p_sick_fp = QPixmap(sick_fp_xpm); p_sick_il = QPixmap(sick_il_xpm); p_blind = QPixmap(blind_xpm); p_stunned = QPixmap(stunned_xpm); p_hallu = QPixmap(hallu_xpm); p_encumber[0] = QPixmap(slt_enc_xpm); p_encumber[1] = QPixmap(mod_enc_xpm); p_encumber[2] = QPixmap(hvy_enc_xpm); p_encumber[3] = QPixmap(ext_enc_xpm); p_encumber[4] = QPixmap(ovr_enc_xpm); str.setIcon(p_str); dex.setIcon(p_dex); con.setIcon(p_con); intel.setIcon(p_int); wis.setIcon(p_wis); cha.setIcon(p_cha); align.setIcon(p_neutral); hunger.setIcon(p_hungry); confused.setIcon(p_confused); sick_fp.setIcon(p_sick_fp); sick_il.setIcon(p_sick_il); blind.setIcon(p_blind); stunned.setIcon(p_stunned); hallu.setIcon(p_hallu); encumber.setIcon(p_encumber[0]); hline1.setFrameStyle(QFrame::HLine|QFrame::Sunken); hline2.setFrameStyle(QFrame::HLine|QFrame::Sunken); hline3.setFrameStyle(QFrame::HLine|QFrame::Sunken); hline1.setLineWidth(1); hline2.setLineWidth(1); hline3.setLineWidth(1); connect(qt_settings,SIGNAL(fontChanged()),this,SLOT(doUpdate())); doUpdate(); } void NetHackQtStatusWindow::doUpdate() { const QFont& large=qt_settings->largeFont(); name.setFont(large); dlevel.setFont(large); const QFont& normal=qt_settings->normalFont(); str.setFont(normal); dex.setFont(normal); con.setFont(normal); intel.setFont(normal); wis.setFont(normal); cha.setFont(normal); gold.setFont(normal); hp.setFont(normal); power.setFont(normal); ac.setFont(normal); level.setFont(normal); exp.setFont(normal); align.setFont(normal); time.setFont(normal); score.setFont(normal); weight.setFont(normal); hunger.setFont(normal); confused.setFont(normal); sick_fp.setFont(normal); sick_il.setFont(normal); blind.setFont(normal); stunned.setFont(normal); hallu.setFont(normal); encumber.setFont(normal); updateStats(); } QWidget* NetHackQtStatusWindow::Widget() { return this; } void NetHackQtStatusWindow::Clear() { } void NetHackQtStatusWindow::Display(bool block) { } void NetHackQtStatusWindow::CursorTo(int,int y) { cursy=y; } void NetHackQtStatusWindow::PutStr(int attr, const char* text) { // do a complete update when line 0 is done (as per X11 fancy status) if (cursy==0) updateStats(); } void NetHackQtStatusWindow::resizeEvent(QResizeEvent*) { const float SP_name=0.13; // <Name> the <Class> (large) const float SP_dlev=0.13; // Level 3 in The Dungeons of Doom (large) const float SP_atr1=0.25; // STR DEX CON INT WIS CHA const float SP_hln1=0.02; // --- const float SP_atr2=0.09; // Au HP PW AC LVL EXP const float SP_hln2=0.02; // --- const float SP_time=0.09; // time score weight const float SP_hln3=0.02; // --- const float SP_stat=0.25; // Alignment, Poisoned, Hungry, Sick, etc. int h=height(); int x=0,y=0; int iw; // Width of an item across line int lh; // Height of a line of values lh=int(h*SP_name); name.setGeometry(0,0,width(),lh); y+=lh; lh=int(h*SP_dlev); dlevel.setGeometry(0,y,width(),lh); y+=lh; lh=int(h*SP_hln1); hline1.setGeometry(0,y,width(),lh); y+=lh; lh=int(h*SP_atr1); iw=width()/6; str.setGeometry(x,y,iw,lh); x+=iw; dex.setGeometry(x,y,iw,lh); x+=iw; con.setGeometry(x,y,iw,lh); x+=iw; intel.setGeometry(x,y,iw,lh); x+=iw; wis.setGeometry(x,y,iw,lh); x+=iw; cha.setGeometry(x,y,iw,lh); x+=iw; x=0; y+=lh; lh=int(h*SP_hln2); hline2.setGeometry(0,y,width(),lh); y+=lh; lh=int(h*SP_atr2); iw=width()/6; gold.setGeometry(x,y,iw,lh); x+=iw; hp.setGeometry(x,y,iw,lh); x+=iw; power.setGeometry(x,y,iw,lh); x+=iw; ac.setGeometry(x,y,iw,lh); x+=iw; level.setGeometry(x,y,iw,lh); x+=iw; exp.setGeometry(x,y,iw,lh); x+=iw; x=0; y+=lh; lh=int(h*SP_hln3); hline3.setGeometry(0,y,width(),lh); y+=lh; lh=int(h*SP_time); iw=width()/4; x+=iw/2; time.setGeometry(x,y,iw,lh); x+=iw; score.setGeometry(x,y,iw,lh); x+=iw; weight.setGeometry(x,y,iw,lh); x+=iw; x=0; y+=lh; lh=int(h*SP_stat); iw=width()/9; align.setGeometry(x,y,iw,lh); x+=iw; hunger.setGeometry(x,y,iw,lh); x+=iw; confused.setGeometry(x,y,iw,lh); x+=iw; sick_fp.setGeometry(x,y,iw,lh); x+=iw; sick_il.setGeometry(x,y,iw,lh); x+=iw; blind.setGeometry(x,y,iw,lh); x+=iw; stunned.setGeometry(x,y,iw,lh); x+=iw; hallu.setGeometry(x,y,iw,lh); x+=iw; encumber.setGeometry(x,y,iw,lh); x+=iw; x=0; y+=lh; } /* * Set all widget values to a null string. This is used after all spacings * have been calculated so that when the window is popped up we don't get all * kinds of funny values being displayed. */ void NetHackQtStatusWindow::nullOut() { } void NetHackQtStatusWindow::fadeHighlighting() { name.dissipateHighlight(); dlevel.dissipateHighlight(); str.dissipateHighlight(); dex.dissipateHighlight(); con.dissipateHighlight(); intel.dissipateHighlight(); wis.dissipateHighlight(); cha.dissipateHighlight(); gold.dissipateHighlight(); hp.dissipateHighlight(); power.dissipateHighlight(); ac.dissipateHighlight(); level.dissipateHighlight(); exp.dissipateHighlight(); align.dissipateHighlight(); time.dissipateHighlight(); score.dissipateHighlight(); weight.dissipateHighlight(); hunger.dissipateHighlight(); confused.dissipateHighlight(); sick_fp.dissipateHighlight(); sick_il.dissipateHighlight(); blind.dissipateHighlight(); stunned.dissipateHighlight(); hallu.dissipateHighlight(); encumber.dissipateHighlight(); } /* * Update the displayed status. The current code in botl.c updates * two lines of information. Both lines are always updated one after * the other. So only do our update when we update the second line. * * Information on the first line: * name, attributes, alignment, score * * Information on the second line: * dlvl, gold, hp, power, ac, {level & exp or HD **} * status (hunger, conf, halu, stun, sick, blind), time, weight, encumbrance * * [**] HD is shown instead of level and exp if mtimedone is non-zero. */ void NetHackQtStatusWindow::updateStats() { if (!parentWidget()) return; char buf[BUFSZ]; if (cursy != 0) return; /* do a complete update when line 0 is done */ if (ACURR(A_STR) > 118) { Sprintf(buf,"STR:%d",ACURR(A_STR)-100); } else if (ACURR(A_STR)==118) { Sprintf(buf,"STR:18/**"); } else if(ACURR(A_STR) > 18) { Sprintf(buf,"STR:18/%02d",ACURR(A_STR)-18); } else { Sprintf(buf,"STR:%d",ACURR(A_STR)); } str.setLabel(buf,NetHackQtLabelledIcon::NoNum,ACURR(A_STR)); dex.setLabel("DEX:",(long)ACURR(A_DEX)); con.setLabel("CON:",(long)ACURR(A_CON)); intel.setLabel("INT:",(long)ACURR(A_INT)); wis.setLabel("WIS:",(long)ACURR(A_WIS)); cha.setLabel("CHA:",(long)ACURR(A_CHA)); const char* hung=hu_stat[u.uhs]; if (hung[0]==' ') { hunger.hide(); } else { hunger.setIcon(u.uhs ? p_hungry : p_satiated); hunger.setLabel(hung); hunger.show(); } if (Confusion) confused.show(); else confused.hide(); if (Sick) { if (u.usick_type & SICK_VOMITABLE) { sick_fp.show(); } else { sick_fp.hide(); } if (u.usick_type & SICK_NONVOMITABLE) { sick_il.show(); } else { sick_il.hide(); } } else { sick_fp.hide(); sick_il.hide(); } if (Blind) blind.show(); else blind.hide(); if (Stunned) stunned.show(); else stunned.hide(); if (Hallucination) hallu.show(); else hallu.hide(); const char* enc=enc_stat[near_capacity()]; if (enc[0]==' ' || !enc[0]) { encumber.hide(); } else { encumber.setIcon(p_encumber[near_capacity()-1]); encumber.setLabel(enc); encumber.show(); } Strcpy(buf, plname); if ('a' <= buf[0] && buf[0] <= 'z') buf[0] += 'A'-'a'; Strcat(buf, " the "); if (u.mtimedone) { char mname[BUFSZ]; int k = 0; Strcpy(mname, mons[u.umonnum].mname); while(mname[k] != 0) { if ((k == 0 || (k > 0 && mname[k-1] == ' ')) && 'a' <= mname[k] && mname[k] <= 'z') { mname[k] += 'A' - 'a'; } k++; } Strcat(buf, mname); } else { Strcat(buf, rank_of(u.ulevel, pl_character[0], ::flags.female)); } name.setLabel(buf,NetHackQtLabelledIcon::NoNum,u.ulevel); if (describe_level(buf, FALSE)) { dlevel.setLabel(buf,(bool)TRUE); } else { Sprintf(buf, "%s, level ", dungeons[u.uz.dnum].dname); 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! Sprintf(buf, "/%d", u.mhmax); hp.setLabel("HP:",u.mh > 0 ? u.mh : 0,buf); level.setLabel("HD:",(long)mons[u.umonnum].mlevel); } else { // You're normal. Sprintf(buf, "/%d", u.uhpmax); hp.setLabel("HP:",u.uhp > 0 ? u.uhp : 0,buf); level.setLabel("Level:",(long)u.ulevel); } Sprintf(buf, "/%d", u.uenmax); power.setLabel("Pow:",u.uen,buf); ac.setLabel("AC:",(long)u.uac); #ifdef EXP_ON_BOTL if (::flags.showexp) { exp.setLabel("Exp:",(long)u.uexp); } else #endif { exp.setLabel(""); } if (u.ualign.type==A_CHAOTIC) { align.setIcon(p_chaotic); align.setLabel("Chaotic"); } else if (u.ualign.type==A_NEUTRAL) { align.setIcon(p_neutral); align.setLabel("Neutral"); } else { align.setIcon(p_lawful); align.setLabel("Lawful"); } if (::flags.time) time.setLabel("Time:",(long)moves); else time.setLabel(""); #ifdef SCORE_ON_BOTL if (::flags.showscore) { score.setLabel("Score:",(long)botl_score()); } else #endif { score.setLabel(""); } #ifdef SHOW_WEIGHT if (::flags.showweight) { Sprintf(buf, "/%ld", (long)weight_cap()); weight.setLabel("Weight:",(long)(inv_weight()+weight_cap()),buf); } else #endif { weight.setLabel(""); } if (first_set) { first_set=FALSE; name.highlightWhenChanging(); dlevel.highlightWhenChanging(); str.highlightWhenChanging(); dex.highlightWhenChanging(); con.highlightWhenChanging(); intel.highlightWhenChanging(); wis.highlightWhenChanging(); cha.highlightWhenChanging(); gold.highlightWhenChanging(); hp.highlightWhenChanging(); power.highlightWhenChanging(); ac.highlightWhenChanging(); ac.lowIsGood(); level.highlightWhenChanging(); exp.highlightWhenChanging(); align.highlightWhenChanging(); //time.highlightWhenChanging(); score.highlightWhenChanging(); weight.highlightWhenChanging(); hunger.highlightWhenChanging(); confused.highlightWhenChanging(); sick_fp.highlightWhenChanging(); sick_il.highlightWhenChanging(); blind.highlightWhenChanging(); stunned.highlightWhenChanging(); hallu.highlightWhenChanging(); encumber.highlightWhenChanging(); } } /* * Turn off hilighted status values after a certain amount of turns. */ void NetHackQtStatusWindow::checkTurnEvents() { } NetHackQtMenuDialog::NetHackQtMenuDialog() : QDialog(qApp->mainWidget(),0,FALSE) { } void NetHackQtMenuDialog::resizeEvent(QResizeEvent*) { emit Resized(); } void NetHackQtMenuDialog::Accept() { accept(); } void NetHackQtMenuDialog::Reject() { reject(); } void NetHackQtMenuDialog::SetResult(int r) { setResult(r); } void NetHackQtMenuDialog::done(int i) { setResult(i); qApp->exit_loop(); } // Table view columns: // // [pick-count] [accel] [glyph] [string] // // Maybe accel should be near string. We'll see. // pick-count normally blank. // double-clicking or click-on-count gives pop-up entry // string is green when selected // NetHackQtMenuWindow::NetHackQtMenuWindow(NetHackQtKeyBuffer& ks) : QTableView(), keysource(ks), dialog(new NetHackQtMenuDialog()), prompt(0), pressed(-1) { setNumCols(4); setCellHeight(QMAX(qt_settings->glyphs().height()+1,fontMetrics().height())); setBackgroundColor(lightGray); setFrameStyle(Panel|Sunken); setLineWidth(2); ok=new QPushButton("Ok",dialog); connect(ok,SIGNAL(clicked()),dialog,SLOT(accept())); cancel=new QPushButton("Cancel",dialog); connect(cancel,SIGNAL(clicked()),dialog,SLOT(reject())); all=new QPushButton("All",dialog); connect(all,SIGNAL(clicked()),this,SLOT(All())); none=new QPushButton("None",dialog); connect(none,SIGNAL(clicked()),this,SLOT(ChooseNone())); invert=new QPushButton("Invert",dialog); connect(invert,SIGNAL(clicked()),this,SLOT(Invert())); search=new QPushButton("Search",dialog); connect(search,SIGNAL(clicked()),this,SLOT(Search())); QPoint pos(0,ok->height()); recreate(dialog,0,pos); prompt.recreate(dialog,0,pos); setBackgroundColor(lightGray); connect(dialog,SIGNAL(Resized()),this,SLOT(Layout())); setTableFlags(Tbl_autoHScrollBar|Tbl_autoVScrollBar |Tbl_smoothScrolling|Tbl_clipCellPainting); setFocusPolicy(StrongFocus); } NetHackQtMenuWindow::~NetHackQtMenuWindow() { // Remove from dialog before we destruct it recreate(0,0,QPoint(0,0)); delete dialog; } void NetHackQtMenuWindow::focusInEvent(QFocusEvent *) { // Don't repaint at all, since nothing is using the focus colour } void NetHackQtMenuWindow::focusOutEvent(QFocusEvent *) { // Don't repaint at all, since nothing is using the focus colour } int NetHackQtMenuWindow::cellWidth(int col) { switch (col) { case 0: return fontMetrics().width("All "); break; case 1: return fontMetrics().width(" m "); break; case 2: return qt_settings->glyphs().width(); break; case 3: return str_width; } impossible("Extra column (#%d) in MenuWindow",col); return 0; } QWidget* NetHackQtMenuWindow::Widget() { return dialog; } void NetHackQtMenuWindow::StartMenu() { setNumRows((itemcount=0)); str_width=200; str_fixed=FALSE; next_accel=0; has_glyphs=FALSE; } NetHackQtMenuWindow::MenuItem::MenuItem() : str(0) { } NetHackQtMenuWindow::MenuItem::~MenuItem() { if (str) free((void*)str); } #define STR_MARGIN 4 void NetHackQtMenuWindow::AddMenu(int glyph, const ANY_P* identifier, char ch, char gch, int attr, const char* str, bool presel) { if (!ch && identifier->a_void!=0) { // Supply a keyboard accelerator. Limited supply. static char accel[]="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; if (accel[next_accel]) { ch=accel[next_accel++]; } } if ((int)item.size() < itemcount+1) { item.resize(itemcount*4+10); } item[itemcount].glyph=glyph; item[itemcount].identifier=*identifier; item[itemcount].ch=ch; item[itemcount].attr=attr; item[itemcount].str=strdup(str); item[itemcount].selected=presel; item[itemcount].count=-1; ++itemcount; str_fixed=str_fixed || strstr(str," "); if (glyph!=NO_GLYPH) has_glyphs=TRUE; } void NetHackQtMenuWindow::EndMenu(const char* p) { prompt.setText(p ? p : ""); } void NetHackQtMenuWindow::Layout() { int butw=totalWidth()/6; // 6 buttons int buth=fontMetrics().height()+8; // 8 for spacing & mitres int prompth=(prompt.text().isNull() ? 0 : buth); prompt.setGeometry(6,buth,dialog->width()-6,prompth); int h=dialog->height()-buth-prompth; setGeometry(0,buth+prompth, dialog->width(), h); // Below, we take care to use up full width int x=0; ok->setGeometry(x,0,butw,buth); x+=butw; butw=(dialog->width()-x)/5; cancel->setGeometry(x,0,butw,buth); x+=butw; butw=(dialog->width()-x)/4; all->setGeometry(x,0,butw,buth); x+=butw; butw=(dialog->width()-x)/3; none->setGeometry(x,0,butw,buth); x+=butw; butw=(dialog->width()-x)/2; invert->setGeometry(x,0,butw,buth); x+=butw; butw=(dialog->width()-x)/1; search->setGeometry(x,0,butw,buth); } int NetHackQtMenuWindow::SelectMenu(int h, MENU_ITEM_P **menu_list) { setFont(str_fixed ? qt_settings->normalFixedFont() : qt_settings->normalFont()); for (int i=0; i<itemcount; i++) { str_width=QMAX(str_width, STR_MARGIN+fontMetrics().width(item[i].str)); } setCellHeight(QMAX(qt_settings->glyphs().height()+1,fontMetrics().height())); setNumRows(itemcount); int buth=fontMetrics().height()+8; // 8 for spacing & mitres how=h; ok->setEnabled(how!=PICK_ONE);ok->setDefault(how!=PICK_ONE); cancel->setEnabled(how!=PICK_NONE); all->setEnabled(how==PICK_ANY); none->setEnabled(how==PICK_ANY); 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') dialog->Reject(); else if (k=='\r' || k=='\n' || k==' ') dialog->Accept(); else if (k==MENU_SEARCH) Search(); else if (k==MENU_SELECT_ALL) All(); else if (k==MENU_INVERT_ALL) Invert(); else if (k==MENU_UNSELECT_ALL) ChooseNone(); else { for (int i=0; i<itemcount; i++) { if (item[i].ch==k) ToggleSelect(i); } } } if (dialog->result()<0) qApp->enter_loop(); } //if ( (nhid != WIN_INVEN || !flags.perm_invent) ) // doesn't work yet { dialog->hide(); } int result=dialog->result(); // Consume ^M (which QDialog steals for default button) while (!keysource.Empty() && (keysource.TopAscii()=='\n' || keysource.TopAscii()=='\r')) keysource.GetAscii(); *menu_list=0; if (result>0 && how!=PICK_NONE) { if (how==PICK_ONE) { int i; for (i=0; i<itemcount && !item[i].selected; i++) ; if (i<itemcount) { *menu_list=(MENU_ITEM_P*)malloc(sizeof(MENU_ITEM_P)); (*menu_list)[0].item=item[i].identifier; (*menu_list)[0].count=item[i].count; return 1; } else { return 0; } } else { int count=0; for (int i=0; i<itemcount; i++) if (item[i].selected) count++; if (count) { *menu_list=(MENU_ITEM_P*)malloc(count*sizeof(MENU_ITEM_P)); int j=0; for (int i=0; i<itemcount; i++) { if (item[i].selected) { (*menu_list)[j].item=item[i].identifier; (*menu_list)[j].count=item[i].count; j++; } } return count; } else { return 0; } } } else { return -1; } } void NetHackQtMenuWindow::keyPressEvent(QKeyEvent* event) { if (viewHeight() < totalHeight() && !(event->state()&ShiftButton)) { if (event->key()==Key_Prior) { setYOffset(yOffset()-viewHeight()); } else if (event->key()==Key_Next) { setYOffset(yOffset()+viewHeight()); } else { event->ignore(); } } else { event->ignore(); } } void NetHackQtMenuWindow::All() { for (int i=0; i<itemcount; i++) { if (!item[i].selected) ToggleSelect(i); } } void NetHackQtMenuWindow::ChooseNone() { for (int i=0; i<itemcount; i++) { if (item[i].selected) ToggleSelect(i); } } void NetHackQtMenuWindow::Invert() { for (int i=0; i<itemcount; i++) { ToggleSelect(i); } } void NetHackQtMenuWindow::Search() { NetHackQtStringRequestor requestor(keysource,"Search for:"); char line[256]; if (requestor.Get(line)) { for (int i=0; i<itemcount; i++) { if (strstr(item[i].str,line)) ToggleSelect(i); } } } void NetHackQtMenuWindow::ToggleSelect(int i) { if (item[i].Selectable()) { item[i].selected = !item[i].selected; if ( !item[i].selected ) item[i].count=-1; updateCell(i,3); if (how==PICK_ONE) { dialog->Accept(); } } } void NetHackQtMenuWindow::paintCell(QPainter* painter, int row, int col) { // [pick-count] [accel] [glyph] [string] MenuItem& i = item[row]; painter->setPen(black); painter->setFont(font()); if (i.selected) { painter->setPen(darkGreen); } switch (col) { case 0: if ( i.ch || i.attr!=ATR_INVERSE ) { QString text; if ( i.selected && i.count == -1 ) { if ( i.str[0]>='0' && i.str[0]<='9' ) text = "All"; else text = "*"; } else if ( i.count<0 ) { text = "-"; } else { text.sprintf("%d",i.count); } painter->drawText(0,0,cellWidth(col),cellHeight(), 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); } break; case 2: if (i.glyph!=NO_GLYPH) { // Centered in height int y=(cellHeight()-qt_settings->glyphs().height())/2; if (y<0) y=0; qt_settings->glyphs().drawGlyph(*painter, i.glyph, 0, y); } break; case 3: // XXX should qt_settings have ALL the various fonts QFont newfont=font(); if (i.attr) { switch(i.attr) { case ATR_ULINE: newfont.setUnderline(TRUE); break; case ATR_BOLD: painter->setPen(red); break; case ATR_BLINK: newfont.setItalic(TRUE); break; case ATR_INVERSE: newfont=qt_settings->largeFont(); newfont.setWeight(QFont::Bold); if (i.selected) { painter->setPen(blue); } else { painter->setPen(darkBlue); } } } painter->setFont(newfont); painter->drawText(STR_MARGIN,0,cellWidth(col),cellHeight(), AlignLeft|AlignVCenter,i.str); } } void NetHackQtMenuWindow::mousePressEvent(QMouseEvent* event) { int col=findCol(event->pos().x()); int row=findRow(event->pos().y()); if (col<0 || row<0 || !item[row].Selectable()) return; if (how!=PICK_NONE) { if (col==0) { // Changing count. NetHackQtStringRequestor requestor(keysource,"Count:"); char buf[BUFSZ]; if (item[row].count>0) Sprintf(buf,"%d", item[row].count); else Strcpy(buf, ""); requestor.SetDefault(buf); if (requestor.Get(buf)) { item[row].count=atoi(buf); if (item[row].count==0) { item[row].count=-1; if (item[row].selected) ToggleSelect(row); } else { if (!item[row].selected) ToggleSelect(row); } updateCell(row,0); } } else { pressed=row; was_sel=item[row].selected; ToggleSelect(row); updateCell(row,0); } } } void NetHackQtMenuWindow::mouseReleaseEvent(QMouseEvent* event) { if (pressed>=0) { int p=pressed; pressed=-1; updateCell(p,3); } } void NetHackQtMenuWindow::mouseMoveEvent(QMouseEvent* event) { if (pressed>=0) { int col=findCol(event->pos().x()); int row=findRow(event->pos().y()); if (row>=0 && col>=0) { if (pressed!=row) { // reset to initial state if (item[pressed].selected!=was_sel) ToggleSelect(pressed); } else { // reset to new state if (item[pressed].selected==was_sel) ToggleSelect(pressed); } } } } class NetHackQtTextListBox : public QListBox { public: NetHackQtTextListBox(QWidget* parent) : QListBox(parent) { } int TotalWidth() { doLayout(); return contentsWidth(); } int TotalHeight() { doLayout(); return contentsHeight(); } virtual void setFont(const QFont &font) { QListBox::setFont(font); } void keyPressEvent(QKeyEvent* e) { QListBox::keyPressEvent(e); } }; QPixmap* NetHackQtRIP::pixmap=0; NetHackQtRIP::NetHackQtRIP(QWidget* parent) : QWidget(parent) { if (!pixmap) { pixmap=new QPixmap; tryload(*pixmap, "rip.xpm"); } riplines=0; resize(pixmap->width(),pixmap->height()); setFont(QFont("times",12)); // XXX may need to be configurable } void NetHackQtRIP::setLines(char** l, int n) { line=l; riplines=n; } QSize NetHackQtRIP::sizeHint() const { return pixmap->size(); } void NetHackQtRIP::paintEvent(QPaintEvent* event) { if ( riplines ) { int pix_x=(width()-pixmap->width())/2; int pix_y=(height()-pixmap->height())/2; // XXX positions based on RIP image int rip_text_x=pix_x+156; int rip_text_y=pix_y+67; int rip_text_h=94/riplines; QPainter painter; painter.begin(this); painter.drawPixmap(pix_x,pix_y,*pixmap); for (int i=0; i<riplines; i++) { painter.drawText(rip_text_x-i/2,rip_text_y+i*rip_text_h, 1,1,DontClip|AlignHCenter,line[i]); } painter.end(); } } NetHackQtTextWindow::NetHackQtTextWindow(NetHackQtKeyBuffer& ks) : QDialog(qApp->mainWidget(),0,FALSE), keysource(ks), use_rip(FALSE), str_fixed(FALSE), ok("Dismiss",this), search("Search",this), lines(new NetHackQtTextListBox(this)), rip(this) { 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() { update(); } NetHackQtTextWindow::~NetHackQtTextWindow() { } QWidget* NetHackQtTextWindow::Widget() { return this; } bool NetHackQtTextWindow::Destroy() { return !isVisible(); } void NetHackQtTextWindow::UseRIP(int how) { // Code from X11 windowport #define STONE_LINE_LEN 16 /* # 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 */ static char** rip_line=0; if (!rip_line) { rip_line=new char*[YEAR_LINE+1]; for (int i=0; i<YEAR_LINE+1; i++) { rip_line[i]=new char[STONE_LINE_LEN+1]; } } /* Follows same algorithm as genl_outrip() */ char buf[BUFSZ]; char *dpx; int line; /* Put name on stone */ 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) { 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 */ for (line=DEATH_LINE, dpx = buf; line<YEAR_LINE; line++) { register int i,i0; char tmpchar; if ( (i0=strlen(dpx)) > 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()); rip.setLines(rip_line,YEAR_LINE+1); use_rip=TRUE; } void NetHackQtTextWindow::Clear() { lines->clear(); use_rip=FALSE; str_fixed=FALSE; } void NetHackQtTextWindow::Display(bool block) { 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) { qApp->enter_loop(); if (result()==-1 && !keysource.Empty()) { char k=keysource.GetAscii(); if (k=='\033' || k==' ' || k=='\r' || k=='\n') { accept(); } else if (k=='/') { Search(); } } } } } void NetHackQtTextWindow::PutStr(int attr, const char* text) { str_fixed=str_fixed || strstr(text," "); lines->insertItem(text); } void NetHackQtTextWindow::done(int i) { setResult(i+1000); hide(); qApp->exit_loop(); } void NetHackQtTextWindow::keyPressEvent(QKeyEvent* e) { if ( e->ascii() != '\r' && e->ascii() != '\n' && e->ascii() != '\033' ) lines->keyPressEvent(e); else QDialog::keyPressEvent(e); } void NetHackQtTextWindow::Search() { NetHackQtStringRequestor requestor(keysource,"Search for:"); static char line[256]=""; requestor.SetDefault(line); if (requestor.Get(line)) { int current=lines->currentItem(); for (uint i=1; i<lines->count(); i++) { int lnum=(i+current)%lines->count(); QString str=lines->text(lnum); if (str.contains(line)) { lines->setCurrentItem(lnum); lines->centerCurrentItem(); return; } } lines->setCurrentItem(-1); } } NetHackQtDelay::NetHackQtDelay(int ms) : msec(ms) { } void NetHackQtDelay::wait() { startTimer(msec); qApp->enter_loop(); } void NetHackQtDelay::timerEvent(QTimerEvent* timer) { qApp->exit_loop(); killTimers(); } NetHackQtInvUsageWindow::NetHackQtInvUsageWindow(QWidget* parent) : QWidget(parent) { } void NetHackQtInvUsageWindow::drawWorn(QPainter& painter, obj* nhobj, int x, int y, bool canbe) { short int glyph; if (nhobj) glyph=obj_to_glyph(nhobj); else if (canbe) glyph=cmap_to_glyph(S_room); else glyph=cmap_to_glyph(S_stone); qt_settings->glyphs().drawCell(painter,glyph,x,y); } void NetHackQtInvUsageWindow::paintEvent(QPaintEvent*) { // 012 // //0 WhB //1 s"w //2 gCg //3 =A= //4 T //5 S QPainter painter; painter.begin(this); // Blanks drawWorn(painter,0,0,4,FALSE); drawWorn(painter,0,0,5,FALSE); drawWorn(painter,0,2,4,FALSE); drawWorn(painter,0,2,5,FALSE); drawWorn(painter,uarm,1,3); // Armour drawWorn(painter,uarmc,1,2); // Cloak drawWorn(painter,uarmh,1,0); // Helmet drawWorn(painter,uarms,0,1); // Shield drawWorn(painter,uarmg,0,2); // Gloves - repeated drawWorn(painter,uarmg,2,2); // Gloves - repeated #ifdef TOURIST drawWorn(painter,uarmf,1,5); // Shoes (feet) drawWorn(painter,uarmu,1,4); // Undershirt #else drawWorn(painter,0 ,1,5,FALSE); drawWorn(painter,uarmf,1,4); // Shoes (feet) #endif drawWorn(painter,uleft,0,3); // RingL drawWorn(painter,uright,2,3); // RingR drawWorn(painter,uwep,2,1); // Weapon drawWorn(painter,uswapwep,0,0); // Secondary weapon drawWorn(painter,uamul,1,1); // Amulet drawWorn(painter,ublindf,2,0); // Blindfold 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), dirkey(0) { QToolBar* toolbar = new QToolBar(this); #if QT_VERSION >= 210 setToolBarsMovable(FALSE); toolbar->setHorizontalStretchable(TRUE); toolbar->setVerticalStretchable(TRUE); #endif addToolBar(toolbar); menubar = menuBar(); setCaption("Qt " DEF_GAME_NAME); 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\tSy", "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\tShift+Q", "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\tShift+F", "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, "Steal\tAlt+B", "\342", 3}, { act2, "Throw\tt", "t", 2}, { act2, "Untrap\t#u", "#u", 3}, { 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, "Poly self\tAlt+Y", "\371", 3}, { magic, "Monster action\tAlt+M", "\355", 3}, { magic, "Technique\tAlt+T", "\364", 3}, { magic, "Turn undead\t#tu", "#tu", 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", "/y", 2}, { help, 0, 0, 1}, { info, "Inventory\ti", "i", 3}, #if 0 { 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; int count=0; for (i=0; item[i].menu; i++) if (item[i].name) count++; macro=new const char* [count]; game->insertItem("Qt settings...",1000); help->insertItem("About Qt " DEF_GAME_NAME "...",2000); //help->insertItem(DEF_GAME_NAME " 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))); #ifdef KDE setMenu (menubar); #endif int x=0,y=0; int w=QApplication::desktop()->width()-10; // XXX arbitrary extra space for frame int h=QApplication::desktop()->height()-50; int maxwn; int maxhn; if (qt_tilewidth != NULL) { maxwn = atoi(qt_tilewidth) * COLNO + 10; } else { maxwn = 1400; } if (qt_tileheight != NULL) { maxhn = atoi(qt_tileheight) * ROWNO * 6/4; } else { maxhn = 1024; } // Be exactly the size we want to be - full map... if (w>maxwn) { x+=(w-maxwn)/2; w=maxwn; // Doesn't need to be any wider } if (h>maxhn) { y+=(h-maxhn)/2; h=maxhn; // Doesn't need to be any taller } 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::zoomMap() { qt_settings->toggleGlyphSize(); } void NetHackQtMainWindow::raiseMap() { if ( stack->id(stack->visibleWidget()) == 0 ) { zoomMap(); } else { 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) { case 1000: centerOnMain(qt_settings); qt_settings->show(); break; case 2000: QMessageBox::about(this, "About Qt " DEF_GAME_NAME, 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; ShowIfReady(); } void NetHackQtMainWindow::AddMapWindow(NetHackQtMapWindow* window) { map=window; ShowIfReady(); connect(map,SIGNAL(resized()),this,SLOT(layout())); } void NetHackQtMainWindow::AddStatusWindow(NetHackQtStatusWindow* window) { status=window; ShowIfReady(); } void NetHackQtMainWindow::RemoveWindow(NetHackQtWindow* window) { if (window==status) { status=0; ShowIfReady(); } else if (window==map) { map=0; ShowIfReady(); } else if (window==message) { message=0; ShowIfReady(); } } void NetHackQtMainWindow::updateInventory() { if ( invusage ) invusage->repaint(FALSE); } void NetHackQtMainWindow::fadeHighlighting() { if (status) { status->fadeHighlighting(); } } 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); } } void NetHackQtMainWindow::resizeEvent(QResizeEvent*) { layout(); #ifdef KDE updateRects(); #endif } void NetHackQtMainWindow::keyReleaseEvent(QKeyEvent* event) { if ( dirkey ) { doKeys(QString(QChar(dirkey))); if ( !event->isAutoRepeat() ) dirkey = 0; } } void NetHackQtMainWindow::keyPressEvent(QKeyEvent* event) { // 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. // 321 // 4 0 // 567 if ( event->isAutoRepeat() && event->key() >= Key_Left && event->key() <= Key_Down ) return; const char* d = iflags.num_pad ? ndir : sdir; switch (event->key()) { case Key_Up: if ( dirkey == d[0] ) dirkey = d[1]; else if ( dirkey == d[4] ) dirkey = d[3]; else dirkey = d[2]; break; case Key_Down: if ( dirkey == d[0] ) dirkey = d[7]; else if ( dirkey == d[4] ) dirkey = d[5]; else dirkey = d[6]; break; case Key_Left: if ( dirkey == d[2] ) dirkey = d[1]; else if ( dirkey == d[6] ) dirkey = d[7]; else dirkey = d[0]; break; case Key_Right: if ( dirkey == d[2] ) dirkey = d[3]; else if ( dirkey == d[6] ) dirkey = d[5]; else dirkey = d[4]; break; case Key_Prior: dirkey = 0; if (message) message->Scroll(0,-1); break; case Key_Next: dirkey = 0; if (message) message->Scroll(0,+1); break; case Key_Space: if ( flags.rest_on_space ) { event->ignore(); return; } case Key_Enter: if ( map ) map->clickCursor(); break; default: dirkey = 0; event->ignore(); } } void NetHackQtMainWindow::closeEvent(QCloseEvent* e) { if ( program_state.something_worth_saving ) { switch ( QMessageBox::information( this, DEF_GAME_NAME, "This will end your " DEF_GAME_NAME " 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 { e->accept(); } } void NetHackQtMainWindow::ShowIfReady() { 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(); } } NetHackQtYnDialog::NetHackQtYnDialog(NetHackQtKeyBuffer& keysrc,const char* q,const char* ch,char df) : QDialog(qApp->mainWidget(),0,FALSE), question(q), choices(ch), def(df), keysource(keysrc) { setCaption(DEF_GAME_NAME ": Question"); } 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; const int extra=fontMetrics().height(); // Extra for group int x=margin, y=extra+margin; int butsize=fontMetrics().height()*2+5; QPushButton* button; for (int i=0; i<nchoices && ch[i]!='\033'; i++) { button=new QPushButton(QString(ch[i]),&group); if ( !enable.isNull() ) { if ( !enable.contains(ch[i]) ) button->setEnabled(FALSE); } button->setFixedSize(butsize,butsize); // Square if (ch[i]==def) button->setDefault(TRUE); if (i%10==9) { // last in row x=margin; y+=butsize+gutter; } else { x+=butsize+gutter; } } 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 (uint i=0; i<ch.length(); i++) { if (ch[i].latin1()=='q') ch_esc='q'; else if (!ch_esc && ch[i].latin1()=='n') ch_esc='n'; } setResult(-1); while (!choice) { if (!keysource.Empty()) { char k=keysource.GetAscii(); char ch_esc=0; for (uint i=0; i<ch.length(); i++) if (ch[i].latin1()==k) choice=k; if (!choice) { if (k=='\033' && ch_esc) choice=ch_esc; else if (k==' ' || k=='\r' || k=='\n') choice=def; // else choice remains 0 } } else if ( result() == 0 ) { choice = ch_esc ? ch_esc : def ? def : ' '; } else if ( result() == 1 ) { choice = def ? def : ch_esc ? ch_esc : ' '; } else if ( result() >= 1000 ) { choice = ch[result() - 1000].latin1(); } if ( !choice ) qApp->enter_loop(); } hide(); if (allow_count && !le->text().isEmpty()) { yn_number=atoi(le->text()); choice='#'; } 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(); if (keysource.Empty()) { return '\033'; } else { return keysource.GetAscii(); } } } void NetHackQtYnDialog::keyPressEvent(QKeyEvent* event) { // Don't want QDialog's Return/Esc behaviour event->ignore(); } void NetHackQtYnDialog::doneItem(int i) { done(i+1000); } void NetHackQtYnDialog::done(int i) { setResult(i); qApp->exit_loop(); } int NetHackQtGlyphs::loadTiles(const char *file) { int retval; #ifndef FILE_AREAS const char *tile_file = file; #else char *tile_file = make_file_name(FILE_AREA_SHARE, file); #endif retval = img.load(tile_file); #ifdef FILE_AREAS free(tile_file); #endif if (!retval) return 0; if ( iflags.wc_tile_width ) tilefile_tile_W = iflags.wc_tile_width; else tilefile_tile_W = img.width() / tiles_per_row; if ( iflags.wc_tile_height ) tilefile_tile_H = iflags.wc_tile_height; else tilefile_tile_H = img.height() / tiles_per_col; setSize(tilefile_tile_W, tilefile_tile_H); return 1; } NetHackQtGlyphs::NetHackQtGlyphs() { int i; int tw, th; const char* tile_file; QString msg; // Try user specified tile set first if (tileset[0] == '\0') pline("ASCII mode not supported in Qt port."); else { for(i = 0; i < no_tilesets; i++) if (!strcmp(tileset, tilesets[i].name)) break; tileset_index = i; // We don't really support transparency, but such // tile sets are still useable with the Qt port. if ((tilesets[i].flags & ~TILESET_TRANSPARENT) != 0) { msg.sprintf("Tile set %s has an unsupported flag set.", tileset); QMessageBox::warning(0, "IO Error", msg); } else if (i >= no_tilesets) impossible("Tile set %s not defined?", tileset); else if (loadTiles(tilesets[i].file)) return; else { msg.sprintf("Failed to load tile set %s.", tileset); QMessageBox::warning(0, "IO Error", msg); } } // Else choose first valid tile set for(i = 0; i < no_tilesets; i++) { if ((tilesets[i].flags & ~TILESET_TRANSPARENT) != 0) continue; if (loadTiles(tilesets[i].file)) { tileset_index = i; strcpy(tileset, tilesets[i].name); return; } } msg.sprintf("Cannot find a valid tile set"); QMessageBox::warning(0, "IO Error", msg); panic("No valid tiles found"); } void NetHackQtGlyphs::drawGlyph(QPainter& painter, int glyph, int x, int y) { int tile = glyph2tile[glyph]; int px = (tile%tiles_per_row)*width(); int py = tile/tiles_per_row*height(); painter.drawPixmap( x, y, pm, px,py, width(),height() ); } void NetHackQtGlyphs::drawCell(QPainter& painter, int glyph, int cellx, int celly) { drawGlyph(painter,glyph,cellx*width(),celly*height()); } void NetHackQtGlyphs::setSize(int w, int h) { if ( size == QSize(w,h) ) return; bool was1 = size == pm1.size(); size = QSize(w,h); if (!w || !h) return; // Still not decided if ( size == pm1.size() ) { pm = pm1; return; } if ( size == pm2.size() ) { pm = pm2; return; } if (w==tilefile_tile_W && h==tilefile_tile_H) { pm.convertFromImage(img); } else { QApplication::setOverrideCursor( Qt::waitCursor ); QImage scaled = img.smoothScale( w*img.width()/tilefile_tile_W, h*img.height()/tilefile_tile_H ); pm.convertFromImage(scaled,Qt::ThresholdDither|Qt::PreferDither); QApplication::restoreOverrideCursor(); } (was1 ? pm2 : pm1) = pm; } ////////////////////////////////////////////////////////////// // // The ugly C binding classes... // ////////////////////////////////////////////////////////////// NetHackQtMenuOrTextWindow::NetHackQtMenuOrTextWindow(NetHackQtKeyBuffer& ks) : actual(0), keysource(ks) { } QWidget* NetHackQtMenuOrTextWindow::Widget() { if (!actual) impossible("Widget called before we know if Menu or Text"); return actual->Widget(); } // Text void NetHackQtMenuOrTextWindow::Clear() { if (!actual) impossible("Clear called before we know if Menu or Text"); actual->Clear(); } void NetHackQtMenuOrTextWindow::Display(bool block) { if (!actual) impossible("Display called before we know if Menu or Text"); actual->Display(block); } bool NetHackQtMenuOrTextWindow::Destroy() { if (!actual) impossible("Destroy called before we know if Menu or Text"); return actual->Destroy(); } void NetHackQtMenuOrTextWindow::PutStr(int attr, const char* text) { if (!actual) actual=new NetHackQtTextWindow(keysource); actual->PutStr(attr,text); } // Menu void NetHackQtMenuOrTextWindow::StartMenu() { if (!actual) actual=new NetHackQtMenuWindow(keysource); actual->StartMenu(); } void NetHackQtMenuOrTextWindow::AddMenu(int glyph, const ANY_P* identifier, char ch, char gch, int attr, const char* str, bool presel) { if (!actual) impossible("AddMenu called before we know if Menu or Text"); actual->AddMenu(glyph,identifier,ch,gch,attr,str,presel); } void NetHackQtMenuOrTextWindow::EndMenu(const char* prompt) { if (!actual) impossible("EndMenu called before we know if Menu or Text"); actual->EndMenu(prompt); } int NetHackQtMenuOrTextWindow::SelectMenu(int how, MENU_ITEM_P **menu_list) { if (!actual) impossible("SelectMenu called before we know if Menu or Text"); return actual->SelectMenu(how,menu_list); } // XXX Should be from Options // // XXX Hmm. Tricky part is that perhaps some macros should only be active // XXX when a key is about to be gotten. For example, the user could // XXX define "-" to do "E-yyyyyyyy\r", but would still need "-" for // XXX other purposes. Maybe just too bad. // struct { int key; int state; const char* macro; } key_macro[]={ { Qt::Key_F1, 0, "n100." }, // Rest (x100) { Qt::Key_F2, 0, "n20s" }, // Search (x20) { Qt::Key_F3, 0, "o8o4o6o2o8o4o6o2o8o4o6o2" }, // Open all doors (x3) { Qt::Key_Tab, 0, "\001" }, { 0, 0, 0 } }; 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 ( iflags.wc_splash_screen && !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()); } void NetHackQtBind::qt_init_nhwindows(int* argc, char** argv) { #ifdef UNIX // Userid control // // Michael Hohmuth <hohmuth@inf.tu-dresden.de>... // // As the game runs setuid games, it must seteuid(getuid()) before // calling XOpenDisplay(), and reset the euid afterwards. // Otherwise, it can't read the $HOME/.Xauthority file and whines about // not being able to open the X display (if a magic-cookie // authorization mechanism is being used). uid_t gamesuid=geteuid(); seteuid(getuid()); #endif QApplication::setColorSpec(ManyColor); instance=new NetHackQtBind(*argc,argv); #ifdef UNIX seteuid(gamesuid); #endif #ifdef _WS_WIN_ // This nethack engine feature should be moved into windowport API nt_kbhit = NetHackQtBind::qt_kbhit; #endif } int NetHackQtBind::qt_kbhit() { return !keybuffer.Empty(); } static bool have_asked = FALSE; void NetHackQtBind::qt_player_selection() { if ( !have_asked ) qt_askname(); } NetHackQtSavedGameSelector::NetHackQtSavedGameSelector(const char** saved) : QDialog(qApp->mainWidget(),"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; } void NetHackQtBind::qt_askname() { have_asked = TRUE; // We do it all here, and nothing in askname char** saved = get_saved_games(); 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_games(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 *) { } void NetHackQtBind::qt_resume_nhwindows() { } static QArray<NetHackQtWindow*> id_to_window; winid NetHackQtBind::qt_create_nhwindow(int type) { winid id; for (id = 0; id < (winid) id_to_window.size(); id++) { if ( !id_to_window[id] ) break; } if ( id == (winid) id_to_window.size() ) id_to_window.resize(id+1); NetHackQtWindow* window=0; switch (type) { case NHW_MAP: { NetHackQtMapWindow* w=new NetHackQtMapWindow(clickbuffer); main->AddMapWindow(w); window=w; } break; case NHW_MESSAGE: { NetHackQtMessageWindow* w=new NetHackQtMessageWindow; main->AddMessageWindow(w); window=w; } break; case NHW_STATUS: { NetHackQtStatusWindow* w=new NetHackQtStatusWindow; main->AddStatusWindow(w); window=w; } break; case NHW_MENU: window=new NetHackQtMenuOrTextWindow(keybuffer); break; case NHW_TEXT: window=new NetHackQtTextWindow(keybuffer); } window->nhid = id; // 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; } void NetHackQtBind::qt_clear_nhwindow(winid wid) { NetHackQtWindow* window=id_to_window[wid]; window->Clear(); } void NetHackQtBind::qt_display_nhwindow(winid wid, BOOLEAN_P block) { NetHackQtWindow* window=id_to_window[wid]; window->Display(block); } void NetHackQtBind::qt_destroy_nhwindow(winid wid) { NetHackQtWindow* window=id_to_window[wid]; main->RemoveWindow(window); if (window->Destroy()) delete window; id_to_window[wid] = 0; } void NetHackQtBind::qt_curs(winid wid, int x, int y) { NetHackQtWindow* window=id_to_window[wid]; window->CursorTo(x,y); } void NetHackQtBind::qt_putstr(winid wid, int attr, const char *text) { NetHackQtWindow* window=id_to_window[wid]; window->PutStr(attr,text); } #ifdef FILE_AREAS void NetHackQtBind::qt_display_file(const char *filearea, const char *filename, BOOLEAN_P must_exist) #else void NetHackQtBind::qt_display_file(const char *filename, BOOLEAN_P must_exist) #endif { NetHackQtTextWindow* window=new NetHackQtTextWindow(keybuffer); bool complain = FALSE; #ifdef DLB { dlb *f; char buf[BUFSZ]; char *cr; window->Clear(); #ifdef FILE_AREAS f = dlb_fopen_area(filearea, filename, "r"); #else f = dlb_fopen(filename, "r"); #endif if (!f) { complain = must_exist; } else { while (dlb_fgets(buf, BUFSZ, f)) { if ((cr = index(buf, '\n')) != 0) *cr = 0; #ifdef MSDOS if ((cr = index(buf, '\r')) != 0) *cr = 0; #endif if (index(buf, '\t') != 0) (void) tabexpand(buf); window->PutStr(ATR_NONE, buf); } window->Display(FALSE); (void) dlb_fclose(f); } } #else #ifndef FILE_AREAS QFile file(filename); #else char *path; path = make_file_name(filearea, filename); QFile file(path); #endif if (file.open(IO_ReadOnly)) { char line[128]; while (file.readLine(line,127) >= 0) { line[strlen(line)-1]=0;// remove newline window->PutStr(ATR_NONE,line); } window->Display(FALSE); } else { complain = must_exist; } #ifdef FILE_AREAS free(path); #endif #endif if (complain) { QString message; message.sprintf("File not found: %s\n",filename); QMessageBox::message("File Error", (const char*)message, "Ignore"); } } void NetHackQtBind::qt_start_menu(winid wid) { NetHackQtWindow* window=id_to_window[wid]; window->StartMenu(); } void NetHackQtBind::qt_add_menu(winid wid, int glyph, const ANY_P * identifier, CHAR_P ch, CHAR_P gch, int attr, const char *str, BOOLEAN_P presel) { NetHackQtWindow* window=id_to_window[wid]; window->AddMenu(glyph, identifier, ch, gch, attr, str, presel); } void NetHackQtBind::qt_end_menu(winid wid, const char *prompt) { NetHackQtWindow* window=id_to_window[wid]; window->EndMenu(prompt); } int NetHackQtBind::qt_select_menu(winid wid, int how, MENU_ITEM_P **menu_list) { NetHackQtWindow* window=id_to_window[wid]; return window->SelectMenu(how,menu_list); } void NetHackQtBind::qt_update_inventory() { if (main) main->updateInventory(); /* doesn't work yet if (program_state.something_worth_saving && flags.perm_invent) display_inventory(NULL, FALSE); */ } void NetHackQtBind::qt_mark_synch() { } void NetHackQtBind::qt_wait_synch() { } void NetHackQtBind::qt_cliparound(int x, int y) { // XXXNH - winid should be a parameter! qt_cliparound_window(WIN_MAP,x,y); } void NetHackQtBind::qt_cliparound_window(winid wid, int x, int y) { NetHackQtWindow* window=id_to_window[wid]; window->ClipAround(x,y); } void NetHackQtBind::qt_print_glyph(winid wid,XCHAR_P x,XCHAR_P y,int glyph) { NetHackQtWindow* window=id_to_window[wid]; window->PrintGlyph(x,y,glyph); } //void NetHackQtBind::qt_print_glyph_compose(winid wid,XCHAR_P x,XCHAR_P y,int glyph1, int glyph2) //{ //NetHackQtWindow* window=id_to_window[wid]; //window->PrintGlyphCompose(x,y,glyph1,glyph2); //} void NetHackQtBind::qt_raw_print(const char *str) { puts(str); } void NetHackQtBind::qt_raw_print_bold(const char *str) { puts(str); } int NetHackQtBind::qt_nhgetch() { if (main) main->fadeHighlighting(); // Process events until a key arrives. // while (keybuffer.Empty()) { qApp->enter_loop(); } return keybuffer.GetAscii(); } int NetHackQtBind::qt_nh_poskey(int *x, int *y, int *mod) { if (main) main->fadeHighlighting(); // Process events until a key or map-click arrives. // while (keybuffer.Empty() && clickbuffer.Empty()) { qApp->enter_loop(); } if (!keybuffer.Empty()) { return keybuffer.GetAscii(); } else { *x=clickbuffer.NextX(); *y=clickbuffer.NextY(); *mod=clickbuffer.NextMod(); clickbuffer.Get(); return 0; } } void NetHackQtBind::qt_nhbell() { QApplication::beep(); } int NetHackQtBind::qt_doprev_message() { // Don't need it - uses scrollbar // XXX but could make this a shortcut return 0; } char NetHackQtBind::qt_yn_function(const char *question, const char *choices, CHAR_P def) { if (qt_settings->ynInMessages() && WIN_MESSAGE!=WIN_ERR) { // Similar to X11 windowport `slow' feature. char message[BUFSZ]; char yn_esc_map='\033'; if (choices) { char *cb, choicebuf[QBUFSZ]; Strcpy(choicebuf, choices); if ((cb = index(choicebuf, '\033')) != 0) { // anything beyond <esc> 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); } #ifdef USE_POPUPS // Improve some special-cases (DIRKS 08/02/23) if (strcmp (choices,"ynq") == 0) { switch (QMessageBox::information (qApp->mainWidget(),DEF_GAME_NAME, question,"&Yes","&No","&Quit",0,2)) { case 0: return 'y'; case 1: return 'n'; case 2: return 'q'; } } if (strcmp (choices,"yn") == 0) { switch (QMessageBox::information(qApp->mainWidget(),DEF_GAME_NAME, question,"&Yes", "&No",0,1)) { case 0: return 'y'; case 1: return 'n'; } } #endif NetHackQtBind::qt_putstr(WIN_MESSAGE, ATR_BOLD, message); int result=-1; while (result<0) { char ch=NetHackQtBind::qt_nhgetch(); if (ch=='\033') { result=yn_esc_map; } else if (choices && !index(choices,ch)) { if (def && (ch==' ' || ch=='\r' || ch=='\n')) { result=def; } else { NetHackQtBind::qt_nhbell(); // and try again... } } else { result=ch; } } NetHackQtBind::qt_clear_nhwindow(WIN_MESSAGE); return result; } else { NetHackQtYnDialog dialog(keybuffer,question,choices,def); return dialog.Exec(); } } void NetHackQtBind::qt_getlin(const char *prompt, char *line) { NetHackQtStringRequestor requestor(keybuffer,prompt); if (!requestor.Get(line)) { line[0]=0; } } NetHackQtExtCmdRequestor::NetHackQtExtCmdRequestor(NetHackQtKeyBuffer& ks) : QDialog(qApp->mainWidget(), "ext-cmd", FALSE), keysource(ks) { int marg=4; QVBoxLayout *l = new QVBoxLayout(this,marg,marg); QPushButton* can = new QPushButton("Cancel", this); can->setDefault(TRUE); can->setMinimumSize(can->sizeHint()); l->addWidget(can); QButtonGroup *group=new QButtonGroup("",0); QGroupBox *grid=new QGroupBox("Extended commands",this); l->addWidget(grid); int i; int butw=50; QFontMetrics fm = fontMetrics(); for (i=0; extcmdlist[i].ef_txt; i++) { butw = QMAX(butw,30+fm.width(extcmdlist[i].ef_txt)); } int ncols=4; int nrows=(i+ncols-1)/ncols; QVBoxLayout* bl = new QVBoxLayout(grid,marg); bl->addSpacing(fm.height()); QGridLayout* gl = new QGridLayout(nrows,ncols,marg); bl->addLayout(gl); for (i=0; extcmdlist[i].ef_txt; i++) { QPushButton* pb=new QPushButton(extcmdlist[i].ef_txt, grid); pb->setMinimumSize(butw,pb->sizeHint().height()); group->insert(pb); gl->addWidget(pb,i/ncols,i%ncols); } connect(group,SIGNAL(clicked(int)),this,SLOT(done(int))); bl->activate(); l->activate(); resize(1,1); connect(can,SIGNAL(clicked()),this,SLOT(cancel())); } void NetHackQtExtCmdRequestor::cancel() { setResult(-1); qApp->exit_loop(); } void NetHackQtExtCmdRequestor::done(int i) { setResult(i); qApp->exit_loop(); } int NetHackQtExtCmdRequestor::get() { const int none = -10; char str[32]; int cursor=0; resize(1,1); // pack centerOnMain(this); show(); setResult(none); while (result()==none) { while (result()==none && !keysource.Empty()) { char k=keysource.GetAscii(); if (k=='\r' || k=='\n' || k==' ' || k=='\033') { setResult(-1); } else { str[cursor++] = k; int r=-1; for (int i=0; extcmdlist[i].ef_txt; i++) { if (qstrnicmp(str, extcmdlist[i].ef_txt, cursor)==0) { if ( r == -1 ) r = i; else r = -2; } } if ( r == -1 ) { // no match! QApplication::beep(); cursor=0; } else if ( r != -2 ) { // only one match setResult(r); } } } if (result()==none) qApp->enter_loop(); } hide(); return result(); } int NetHackQtBind::qt_get_ext_cmd() { NetHackQtExtCmdRequestor requestor(keybuffer); return requestor.get(); } void NetHackQtBind::qt_number_pad(int) { // Ignore. } void NetHackQtBind::qt_delay_output() { NetHackQtDelay delay(15); delay.wait(); } void NetHackQtBind::qt_start_screen() { // Ignore. } void NetHackQtBind::qt_end_screen() { // Ignore. } void NetHackQtBind::qt_outrip(winid wid, int how) { NetHackQtWindow* window=id_to_window[wid]; window->UseRIP(how); } 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 && ((QKeyEvent*)event)->key() == Key_Alt ) return TRUE; bool result=QApplication::notify(receiver,event); if (event->type()==QEvent::KeyPress) { QKeyEvent* key_event=(QKeyEvent*)event; if (!key_event->isAccepted()) { const int k=key_event->key(); bool macro=FALSE; for (int i=0; !macro && key_macro[i].key; i++) { if (key_macro[i].key==k && ((key_macro[i].state&key_event->state())==key_macro[i].state)) { keybuffer.Put(key_macro[i].macro); macro=TRUE; } } char ch=key_event->ascii(); if ( !ch && (key_event->state() & Qt::ControlButton) ) { // On Mac, ascii control codes are not sent, force them. if ( k>=Qt::Key_A && k<=Qt::Key_Z ) ch = k - Qt::Key_A + 1; } if (!macro && ch) { bool alt = (key_event->state()&AltButton) || (k >= Key_0 && k <= Key_9 && (key_event->state()&ControlButton)); keybuffer.Put(key_event->key(),ch + (alt ? 128 : 0), key_event->state()); key_event->accept(); result=TRUE; } if (ch || macro) { qApp->exit_loop(); } } } return result; } NetHackQtBind* NetHackQtBind::instance=0; 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| WC_ASCII_MAP|WC_TILED_MAP| WC_FONT_MAP|WC_TILE_FILE|WC_TILE_WIDTH|WC_TILE_HEIGHT| WC_PLAYER_SELECTION|WC_SPLASH_SCREEN, 0L, NetHackQtBind::qt_init_nhwindows, NetHackQtBind::qt_player_selection, NetHackQtBind::qt_askname, NetHackQtBind::qt_get_nh_event, NetHackQtBind::qt_exit_nhwindows, NetHackQtBind::qt_suspend_nhwindows, NetHackQtBind::qt_resume_nhwindows, NetHackQtBind::qt_create_nhwindow, NetHackQtBind::qt_clear_nhwindow, NetHackQtBind::qt_display_nhwindow, NetHackQtBind::qt_destroy_nhwindow, NetHackQtBind::qt_curs, NetHackQtBind::qt_putstr, NetHackQtBind::qt_display_file, NetHackQtBind::qt_start_menu, NetHackQtBind::qt_add_menu, NetHackQtBind::qt_end_menu, NetHackQtBind::qt_select_menu, genl_message_menu, /* no need for X-specific handling */ NetHackQtBind::qt_update_inventory, NetHackQtBind::qt_mark_synch, NetHackQtBind::qt_wait_synch, #ifdef CLIPPING NetHackQtBind::qt_cliparound, #endif #ifdef POSITIONBAR donull, #endif NetHackQtBind::qt_print_glyph, //NetHackQtBind::qt_print_glyph_compose, NetHackQtBind::qt_raw_print, NetHackQtBind::qt_raw_print_bold, NetHackQtBind::qt_nhgetch, NetHackQtBind::qt_nh_poskey, NetHackQtBind::qt_nhbell, NetHackQtBind::qt_doprev_message, NetHackQtBind::qt_yn_function, NetHackQtBind::qt_getlin, NetHackQtBind::qt_get_ext_cmd, NetHackQtBind::qt_number_pad, NetHackQtBind::qt_delay_output, #ifdef CHANGE_COLOR /* only a Mac option currently */ donull, donull, #endif /* other defs that really should go away (they're tty specific) */ NetHackQtBind::qt_start_screen, NetHackQtBind::qt_end_screen, #ifdef GRAPHIC_TOMBSTONE NetHackQtBind::qt_outrip, #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 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/Qt/qpe-nethack.control��������������������������������������������������������0000664�0000764�0000764�00000000650�10545462320�016632� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Files: bin/nethack apps/Games/nethack.desktop games/lib/nethackdir/[a-r]* games/lib/nethackdir/[t-z]* games/lib/nethackdir/save games/lib/nethackdir/s*.* games/lib/nethackdir/[A-Z0-9]* Priority: optional Section: qpe/games Maintainer: Warwick Allison <warwick@trolltech.com> Architecture: arm Version: 3.4.0-1 Depends: qpe-base ($QPE_VERSION) Description: NetHack - The Dungeon Game Graphical version of NetHack for Qtopia ����������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/Qt/qt_clust.cpp���������������������������������������������������������������0000664�0000764�0000764�00000007161�10545462320�015376� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* 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" static void include(QRect& r, const QRect& rect) { if (rect.left()<r.left()) { r.setLeft(rect.left()); } if (rect.right()>r.right()) { r.setRight(rect.right()); } if (rect.top()<r.top()) { r.setTop(rect.top()); } if (rect.bottom()>r.bottom()) { r.setBottom(rect.bottom()); } } /* A Clusterizer groups rectangles (QRects) into non-overlapping rectangles by a merging heuristic. */ Clusterizer::Clusterizer(int maxclusters) : cluster(new QRect[maxclusters]), count(0), max(maxclusters) { } Clusterizer::~Clusterizer() { delete [] cluster; } void Clusterizer::clear() { count=0; } void Clusterizer::add(int x, int y) { add(QRect(x,y,1,1)); } void Clusterizer::add(int x, int y, int w, int h) { add(QRect(x,y,w,h)); } void Clusterizer::add(const QRect& rect) { QRect biggerrect(rect.x()-1,rect.y()-1,rect.width()+2,rect.height()+2); //assert(rect.width()>0 && rect.height()>0); int cursor; for (cursor=0; cursor<count; cursor++) { if (cluster[cursor].contains(rect)) { // Wholly contained already. return; } } int lowestcost=9999999; int cheapest=-1; for (cursor=0; cursor<count; cursor++) { if (cluster[cursor].intersects(biggerrect)) { QRect larger=cluster[cursor]; include(larger,rect); int cost=larger.width()*larger.height() - cluster[cursor].width()*cluster[cursor].height(); if (cost < lowestcost) { bool bad=FALSE; for (int c=0; c<count && !bad; c++) { bad=cluster[c].intersects(larger) && c!=cursor; } if (!bad) { cheapest=cursor; lowestcost=cost; } } } } if (cheapest>=0) { include(cluster[cheapest],rect); return; } if (count < max) { cluster[count++]=rect; return; } // Do cheapest of: // add to closest cluster // do cheapest cluster merge, add to new cluster lowestcost=9999999; cheapest=-1; for (cursor=0; cursor<count; cursor++) { QRect larger=cluster[cursor]; include(larger,rect); int cost=larger.width()*larger.height() - cluster[cursor].width()*cluster[cursor].height(); if (cost < lowestcost) { bool bad=FALSE; for (int c=0; c<count && !bad; c++) { bad=cluster[c].intersects(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. int cheapestmerge1=-1; int cheapestmerge2=-1; for (int merge1=0; merge1<count; merge1++) { for (int merge2=0; merge2<count; merge2++) { if (merge1!=merge2) { QRect larger=cluster[merge1]; include(larger,cluster[merge2]); int cost=larger.width()*larger.height() - cluster[merge1].width()*cluster[merge1].height() - cluster[merge2].width()*cluster[merge2].height(); if (cost < lowestcost) { bool bad=FALSE; for (int c=0; c<count && !bad; c++) { bad=cluster[c].intersects(larger) && c!=cursor; } if (!bad) { cheapestmerge1=merge1; cheapestmerge2=merge2; lowestcost=cost; } } } } } if (cheapestmerge1>=0) { include(cluster[cheapestmerge1],cluster[cheapestmerge2]); cluster[cheapestmerge2]=cluster[count--]; } else { // if (!cheapest) debugRectangles(rect); include(cluster[cheapest],rect); } // 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. } const QRect& Clusterizer::operator[](int i) { return cluster[i]; } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/Qt/knethack.lnk���������������������������������������������������������������0000664�0000764�0000764�00000000671�10545462320�015331� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# KDE Config File # Call this file knethack.kdelnk or knethack.desktop [KDE Desktop Entry] Name=Nethack Name[fr]=Nethack Name[hu]=Nethack Name[no]=Nethack Name[sk]=Nethack Name[cs]=Nethack Name[hr]=Nethack Name[pt]=Nethack Name[pt_BR]=Nethack Icon=knh.xpm Exec=knethack -caption "%c" %i %m Type=Application DocPath=knethack/index.html Comment=The classic Unix role-playing game - fight monsters and seek the Amulet of Yendor for your god! �����������������������������������������������������������������������slashem-0.0.7E7F3/win/Qt/nhicns.uu������������������������������������������������������������������0000664�0000764�0000764�00000206173�10545462320�014675� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������begin 640 nethack.icns M:6-N<P``PL9I8W,C````2``````````````````````````````````````` M``````````````````````````````````````````````!I<S,R```"#Z#& M`*B!Q@*[D<"%Q@B]F?'&IGZ1H(&$Q@G(N;^=B&F!H+?)@,8-V\K1QL<AFW1O M@)BYR>2`Q@J)8&,C9"%T(S\SO(+&"I1U5GU$0G?,X7MN@<8,PHAF6'^#<[QQ MAGV\RH#]O6L;&?(7'HHZA>IGJ@,80BYS#/&F3HGUOQI?&@W3&QH6!Q@E< MIW'&QES&QJ*5A,8$X6K&QJF'Q@6/QD3&QNR'Q@!A@<8`@)'&H,8`=H'&`@\5 M?87&"+:'[L:%;X"46H3&"<@-O(T^9W*9K<6`Q@W:KS'&PS.!&2M[-[+%XH#& M"A<311$U*!X1#!^G@L8*"RP0%@L1%@L9"Q:!Q@RO%A0?&A@-#F11'`T*@,8- M'2D-QL8<%0HC%1HC$0J`QA!^9KT1$@X-'33&-<8Q#L;&;('&"5(-(<;&)L;& MAWB$Q@0*.\;&-8?&!5W&1,;&"8?&`#.!Q@!AD<:@Q@!N@<8"#A5CA<8(M*+> MQGM_FJ=5A,8)QPS'H39E@:6\S(#&#=:D+L;#?8X8*G\VO,K@@,8*%A-!$$%# M'1`-'J."Q@H+'Q`6"PX5"A,*%8'&#*L6$QD:&`T-1S8:#`J`Q@T8(0W&QAP4 M"AH3%2$1"H#&$']BO0X1#@T;+L8UQB\-QL9F@<8)/0T?QL8=QL:#=(3&!`HM MQL8AA\8%4\9"QL8)A\8`*H'&`$*1QG,X;6L```$(____________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M_____________________TE#3B,```$(```````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M`````````````&EL,S(```;C@<8`R9S&`*F]Q@#%G<8`O(;&`]+JXKR0Q@*] MQ]:"Q@;LCVEW>7?#CL8$SH)_>[2`Q@B!9G^9F:BI<,R,QA&]G)B84,;'QH]Z MAI"0G:^RH,N,QA'AF-[-'B!;;V%WD*":K*R^QZN+QA*D=]OYG:7*97)R>Y.D MI[+&R=.KA\8`NX#&$N^;P[2ZPF)G<GZ`C:NVOL?7X)N!QAS*<564QDO&RL:> MKD@8Q;%A:F-E.9"4N+_'UN+&OX+&%2&^V4XH(I'&_D2*/SI)*RDA*$"2CL*' MQA6\BY1U5%AC>$GN+4I624-(7%XV6Z;/A\85K:[.'EMP9XF2;X)^9U9SBYF^ MGJI+S(?&%[.1R#5A6'R*?"_/=V]/MKG(OYR^Q']KQX3&&,BXFWUB86-NBH2- M6JAN<F6+B(9UD[7*IE2$QAG!OH!B98!P:'A]C5*)IIN@A8><GWJ:N\_0;H/& M!)-L=AYW@,8387*)?X/3LZ:MDY>4=7R,D;W`?=^!QAMO<GH.QL;5QL9B;GVI MQJ6'?:&*:89A;'R>K^]2@<8;QR$0%<;KF4?&6%MRS,2'E7AV:5EH;,;&Q8*U MVH+&`I$71(#&#T@_3&5EI-A[?(YF4]'&4L&`Q@*-I9:!Q@*U(:6!Q@Y1S,9M M@\!I<65AUL;&;WZ!Q@*>BF&!Q@#)A<8&YV^;:,!'=(#&`7N,@L8"RV'3B\8# M=I/&88'&`4VMD\8#PW?&:('&`7>1DL8$P&O&QE>!Q@&BGY+&`,F$Q@*_<FR2 MQ@"5A,8!S)";Q@'"7YO&`<B_IL:!Q@#(G,8`2[W&`,6=Q@"<AL8#M@D);Y#& M`H=VS8+&!A,8.V1G%R*.Q@0+<G$6EX#&""UB=H>'F*$PQ8S&$1)QAXH^QL?& M."UW@(>3I:>!<XS&$0I"U,LH'WH46BF`E)*CI;C#+HO&$C`AN_B.F<D?&F\P M:)F?JK_#SCJ'Q@"O@,82"9BYEZ^_(6-P=7M)HZNVP]/<$H'&',E?3"#&%\7* MQD@?0!BRI1ID3UPIAVRPM\/2X<:4@L85$0D)#!H2=\;];#0A$1`3$A$2/Y!/ MNX?&%0D0$A@;)"</'MD1$PL7"PL,#A<LF,N'QA4-#I07)R8B*@DH)!0*#`D+ M"Q<:#1K"A\86"A53%PP*#Q8>#\@,"T@.#@I[,0H)&A^%QA@7"A(<$`T.%A@9 M'"*'#!A1(3(F%P\*##@?A,89#`D9$!=&-$`>'!L?%Q41$VT:$PH6&@L,%"6# MQAL/"AH++\;&O"<A%QH:"0T1+!T6("LI&2@26"?9@<8;,R4="\;&Q<;&$1L3 M#0D0%3T5("`<,#4<%2L)'X'&&\(0#P[&Z2@NQ@PB&PD)&10I/DA,&`S&QK8: M$0F"Q@*.$!F`Q@\Z(@I&4`D)$1P80C[+Q@J)@,8"20D^@<8"KQN$@<8."\7& M5!X)$3!-6]/&Q@D*@<8"D`]0@<8`#(7&!N`J"1NU"C6`Q@$)1(+&`KM3T8O& M`PD.QAJ!Q@$P5)/&`PD)QC6!Q@$)$9+&!`HKQL9*@<8!"0J2Q@`)A,8"L@D? MDL8`,X3&`;T@F\8!PCV;Q@'(O:;&H<8`+[W&`,6=Q@"9AL8#JPD)69#&`G1G MSH+&!A$7,VIL%QV.Q@0+>(`6E8#&""1?@**BL*THQ8S&$1!DH:`]QL?&+R.& MF8^AN+F#;HS&$0DHU==6);X45R69IYNQK\#)(8O&$BT>K^RDJLD=&7$K<:NK MM<;)TB^'Q@"B@,82"9?`E;V]&F%R@']!K[N_R=;=$H'&',5`.AO&%,?)QD48 M,!ZPHAAA2ETECV.\O\G5W,:,@L85$`D)#1@1=<;VSR4;$0\3$A`2-9!'PH?& M%0D0$1@8&R`/%<\/$PL4"PL,#1<IFLR'QA4-#7P='Q\>(@D;'10)#`D+"Q,6 M#1>^A\86"A5`%@P*#A8<#K<+"S@.#@IB(@H)&1Z%QA@2"A(;#PP.%1@9&1>! M"Q@^'"4@%P\*"R,8A,89#`D8#Q8\+34>&Q@7%A$0$DL9$@H6%PL*$2"#QAL/ M"AD++L;&N2`?%AH9"0T0'QD4&R$A%Q\/1B/9@<8;*R(="\;&Q,;&$!H3#0D/ M%2\3&QP9(B\<$QX)%X'&&\(1#@[&XB$BQ@P9&PD)&!,C-#PW%PS&QK,9#PF" MQ@*0$!:`Q@\V'`H\/0D)$!L7,2O/Q@J!@,8"00DE@<8"L1E_@<8."L7&0!T) M$"HY1-/&Q@D*@<8"C`Y+@<8`"X7&!N`A"1.X"R^`Q@$)0H+&`KL_THO&`PD- MQAF!Q@$C49/&`PD)QBN!Q@$)$9+&!`HFQL9(@<8!"0J2Q@`)A,8"L@D<DL8` M*X3&`;T:F\8!P36;Q@'(O:;&;#AM:P``!`C_________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________:6-H(P```D@````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M``````````````````!I:#,R```.@(/&`.*LQ@#^K,8!;\FLQ@#$K<8`RJW& M`,BLQ@"\B\8%S\W;UM#+F<8`J(G&"-+MNYAXD8K)P)C&!<O"O\G&_H+&"^#Q M@VUF?I!P:7C)XY7&!\FN?7MSA^C9@<8,C(IB>H>8E)"DG8=WS)3&![W/>YF9 MCO'0@<8.IGJ'?H:.D9Z=H*NL@;#4DL8;R]6LJ)&18'?+QM#&KW9QF'.&AIF: MJ+"CN;"7SI'&'-VVZ32?IJ5D)20U/*)O77F1@9"2I)JFKK&^P)/*D,8=R,:I MN5WGO_6!G2NRB&-I:6MX@9&AH+"MM\+(R9;+D<8<S.]SO432TJBRQFU@;&5R M<GF0FIJJM;?%Q<S7D.",Q@##@<8<I-B!6ER_J,;8<U]H6')R@("AG+*PO+_' MSM'8C\2$Q@C;N''*N\;1/YV`QAW'W:LA[MN;QL9T8&MO<G6`AX28KJ^YQ,S) MTM_DML^#QB5F/D#/A,;S%R;.QM/"C?)$#@ZVR<]V74UR;RME9F61C[FZO\O/ MRH#&`+2#QB.[8QBBJ,9F@1.VGEPHQL8F0)0YT1EZ1B]$4S4I*C61FXV_Q-:+ MQB"EB9WI8((P8QX?(X1U9/,.(1Y`="4O(R0R/S8I,[F9O,R,QA_BFY5RBG56 M6V9;@UXV<?ZO&IYA>D)/64]C85YD98MBE(W&('B&DTNB;U%985R`J7E>8JM2 M:%%Y2G)Q>G=QL:-Z@4]BQ(S&(964A+9U-%-64%U]B'U$1-I"<G5W3IO,U<3A ML*A[NKEN7,V*QB3+O<!RS;Q;7F!J;'N*@(L]/L5P@G=C=G2$H\#`I*.QH\^8 M7,G(B,8DT="S@X%I9%E@9VM[E(!^A'$HRFN!>FECDX5C872KK+_+S*]*SX?& M)L+)RXB$:V977UA<;'][?(.!;7-9C[Q[FW%MBH;"I'V+K+S/U<IQOX;&)]_4 MT(-N85M=PKV>;VAXBW^%28B(C\N)FYNRJXYO>I-\G92QN]C8?J2%Q@=9TRMU M?6I8HH#&'=)U9GAJ>C&$C(S%I9:=CHRC>;"A:864FJ*[W^&*C83&!G]^W6]X M#EJ#QAR'=WQV<(5WTL>AAJ*,LHZ(9:&+9'I[B9F_TNI\A8/&"L5O;GD8$&+& MQM6I@,8;)3(:='+PP::+C8QXBGJ*6YYR<9)R<X2(G^#Q1H3&'Y5P&!`.9<;+ MS:E5S=U;:W5KL\7,K9"'FXV(:V1296I\@,8&N7&`F-/I1(3&'U6+,!"<QL;# ME$8\;U1I56.3J,6B?W-];%YO5EW&9&>7@<8%OX.,O73%@\8#<!<11X+&%[=! M0$O":&-_ILRDA(*&<%Q8;K;&R$?7M8+&`[=^O!^#Q@-^0!!Q@\8,I%)DQN=E M9;*QKV]W=X!@@<8":I:=@\8"R72EA,8"A12HA,8-5LC&QGU<9+&G;G9Q95*" MQ@);7)J$Q@2B=HF5R8+&`(:*Q@BR;XB@C,-63U>"Q@*-G[V%Q@*^@823Q@9< MP8S&<V3)@L8"SZ_)GL8%IN%]QFIM@\8"E*FKG<8&G\^1D\9FH8/&`EZ]G9W& M!M:'A\;&++B"Q@/)<.>)G,8"C]O#@,8!1+J"Q@/!>>R$G,8!R8:!Q@"V@\8# MBY?"LIS&`;*5B,8">+G6G<8`88G&`JV?@)W&`-R)Q@*8@,^JQ@'2T>O&@\8` MX:S&`/VLQ@%GR*S&`)RMQ@!KK<8`NZS&`*B+Q@7-=U]?:*^9Q@!VB<8(=@D/ M%3D5-`Q]F,8%KW)^R,;]@L8+OPDL+%YO@&H@1`S<E<8'R0\P3SI`YM2!Q@QR M&E-S=X>#@):37RI;E,8'M@Q1AX=\[K"!Q@Z%(Q-O>G^`DI24HZ):'-&2QAO* M"Q->@(!;6[7&SL:.%R\*<'IZAY*8I9RNIA/-D<8<VH@)&E>6C8(Z-DA7;AHG M'A%R@8>6DIZEJ[:Z++F0QAW(QA8-)N"\\W6-,+4^/BEG/3!RAY69I:6MNL+% M7JB1QAS%"2-<;,3$F*?&(3\@8W!P+(>2DJ*KKL#`Q--3W(S&`+V!QAPB"C%= M4ZZ8P-$:0&4V<'![*6R4J*>TNL/&R]1ZL(3&"-JS;:^QQC$[FX#&'<,*)3/L MSX'`QAD^:"MP<'N#:S>DJ+*]Q\7.W.*0Q(/&)5@P/Y<9Q@D/)LW&T[HK"6P. M#JO(RB!(/7!F%T9B6HXCL[2WQ,;*@,8`EX/&&;97%D\/"0P8$J9^41/&(3UF M057.#A@S%#4V@10%CIA%N,#3B\8@)!<3"1,6#T4.$!%!*37O#"@:%!X;%!$1 M$`P4%!^U=J?+C,8?"1`)$306.RLX(S42#BG]*PT*$!<+"0H*)S,,"1A9)VJ- MQB`7&`X[0A<;)R@M&Q$))#0I(!\*%PX)"@D,1Q<1,!`9'\&,QB$/"Q5-+!82 M$!`.%A,B"SBW$1`)%AX)"PD,&3@@"PT-%AO-BL8BJPD,$1,9$0H+"0L:%A,1 M##"V"0H452<U&1!]?5@/#RP*'1V*QB0+"0H6&R`-#`L*"AH9&AH1*0VO#`P= M/5H3&%HS-0T0#`L)%AO'A\8FKPD)%AD6%`L8'RDA&AH;&!@7#3$>#A<29#07 M40L,'`L.#0H)"AVXAL8G#@D)&!4-$!BQLW@Q/AT7'!@4%A@D"18152@/%AX3 M#A(2%A01"0D9?(7&!PT)#1H<#`R'@,8=S1M%*"0=#AD>&0D0%`\S*@\L#ALT M'AP7%0X)"2!)A,8&'1<**1T+#8/&`D,C'(`5%BT)"A$7(SX0%1@^&AX5(R,B M$0T?"AY,@\8*NBX8'`P/,<;&OUN`QAL1#Q$6#`D)#!<5%ST8.#$3#2P2<"LG M&Q@1%@D9A,8?5AL8#PL4QLN?02#-W!$4&A0*"0D-%14;'2PS*Q\8)0^`Q@:A M*!L5*`H9A,8?2'XI#V;&QKUM-A%5"A)#-PX2"0T;%QT[230T4\8E##6!Q@6V M,1,)#L.#Q@-N%1`E@L87MB`4#;H_6AT/"0D4&ADG5$`RL,;'"@F;@L8#CQD* M$(/&`WD_#RR#Q@Q^$!K&X%`8$`H*%QPF@%N!Q@()#%"#Q@.^%`VS@\8";!"0 MA,8`.X#&"3=2+PH-%B0A.#&"Q@())GF$Q@2'%Q)XN8'&`0L=BL8(CQ\+"5B[ M$0D3@L8"8"*FA<8"M%5UD\8&"0I$QB`4R(+&`LLWOI[&!48*$\8[(X/&`H8U MCYW&!GH)#&3&/82#Q@()"UF=Q@8*#&_&QBJV@L8#R`D)*9S&`ET)NH#&`42Z M@L8#NPP)%YS&`1H>@<8`M8/&`R`*"J*<Q@$N9(C&`CA=#IW&`#.)Q@*;4V&= MQ@#8B<8"DC.[JL8!SL7KQH/&`-RLQ@#VK,8!4\BLQ@":K<8`5ZS&`<>ZK,8` MIHO&!<UR7UUHHYG&`&Z)Q@AE"0X4+Q4E"V.8Q@6C8W'(QO:"Q@NZ"2$F6W^9 M:!PZ"]R5Q@?'#RI3.#78UH'&#$\83WF+H9Z9K*%>(U*4Q@>T"T>BHI'>HH'& M#GL>$W^%E9JFGZ>PL549T9+&&\4*$$J:FD53M,;9QH07*0ITA86BF["YJ;VN M$\V1QAS7A@D82JZ)S8^!E+%C&2,=$7J6E*J;K+&ROL,ILY#&'<?&$PP=V<?D MD*%7PC8Z(V4T)H&2J:6YLKS"R,Q7II'&',4)(4G/K:VPM<8?/!MA<G(BCYN; MKKF\QL;+UDS=C,8`C('&'"`*-:1.G+#&TAD\8S%R<G\G=YZVM[W!R<W/V'2K MA,8(UJ];I*S&+CF=@,8=PPDG?=VZCL;&&#MF*G)U?X)I-K6QO,30RM#=X)7$ M@\8E1RLU?QG&"0\FS<;2NBD)SP\/N\C.'D,Y<F<7/%]6D!^]O;[*S,J`Q@"5 M@\8COE4;.P\)#!<1I')3$L8>F,HML<T.%R\3,284$Q,4D)<XP,;5B\85(!83 M"1,5#T$-$!`T'$'D#$,>%!T<$X`0!PT4$QZY<J/*C,8?"1`)$"46*2$I'"X1 M#AOV'@P*#Q<+"0H*'BH+"1=/(F2-QB`3&`XX)Q<9'R$C&1`)&"H=&!T*%PT) M"@D+-A,0)1`7',&,Q@4-"Q4['Q:`$!@.%A(;"RRB#@\)%1D)"@D+$RL8"@P, M%1G-BL8BG@D,$`\4#PH+"0L:%A,1#"N8"0H402,O&1!C8T$/#1\*%QJ*QB,* M"0H5&AP,#`L*"AD6&AH1&PR:#`P=,T03&$,J+PT/#`H)$A>(Q@NK"0D6&143 M"Q89(1V`&A<8%Q8-*1H-%Q)'+!<V"PP:"PX,"@D*&K>&QB<."0D8%0P/%K2R M<24T'1<:&!$6&!X)%1%`'0\6&Q(.$A(4$0\)"1ASA<8'#0D,&AL,#(.`QAW. M&CLD'QT.&1H8"1`4#R0A#R(-%BL:&!42#0D)&T&$Q@88%PHA'`L-@\8<0B$< M%!44*`D*$1<:-`\3%R\5&A4A'1T1#!<*&T6#Q@JZ)!<<#`XHQL:Z3H#&&P\. M$!8+"0D,%A47,A<M(Q,-(1%K(209&!$0"1:$QA]/&AX."Q/&RH8P&\S<#Q0: M%`H)"0T5%1<9(BPA%Q<?#X#&!J$D&A0="A:$QA]&?R0.8L;&O6<K#DX)$3`J M#A`)#1H7&S$X+B@]QB,,-8'&!;(O$@D-PX/&`VL3#QV"QA>T&A(-NC9$'`X) M"1(9&!\^,"JOQL<+"9B"Q@..&0H/@\8#=S4.(H/&#'8/%\;@/1<."@H5'".` M18'&`@D,3X/&`\43#;&#Q@)F$)V$Q@`U@,8)-#TF"@T6(A\O)8+&`@D==H3& M!(,5$'2R@<8!"QJ*Q@B"'0L)5;D0"1&"Q@)<&J*%Q@*S26N3Q@8)"D+&'1/( M@L8"R2&]GL8%-`H3QBT?@\8"@B&*G<8&=@D,8<8O?X/&`@D+6)W&!@H,9\;& M*K6"Q@/("0DEG,8"4PG`@,8!0KF"Q@.Z"PD6G,8!%!Z!Q@"U@\8#'`D*H9S& M`2!<B,8"+TD,G<8`*HG&`I0]0IW&`,F)Q@*/)K*JQ@'1L>O&:#AM:P``"0C_ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M__________]I=#,R``!9E`````#_QHK&`LSWXOK&`O'^]/K&`_[^^-?YQ@/P M\^_=^<8$R-3-N<?YQ@/<:Z7/^L8"Q8_-_,8!N-+[Q@+#J\S[Q@+2LM_ZQ@/4 ML]C+^L8"OK_+^\8"J[?'^\8!ML_[Q@+3G-/ZQ@/(P;'0I\8%X\K*S,K7R\8" MO[#(HL8.W,G0U./CX=?<X-31Q\O.QL8#Q<.\UY_&$\O+Y-[CV-K@V<O)U=73 MTLW6R<32Q,8#VJ[@QYW&%LG6U^?KY<[#Q[BNHK;"P,F\S\C#W\C(P\8"J\/, MG,8:R-7GZ.C8L:R4DX%]=8&-B(Z%J;W#V\O,Q\?(P<8!I\N<QAK-ZO/2R:R$ M?7EU:VEA:'%E:VA[A)*MK\O,S-?"Q@FLSN/*QLC(O,O2@L8!_MV*Q@W?R/'P MUJI^@7!K969I>(!^#8F&<6AM:GMTCZK)RLS6P,81VJG!MI&*@8*(G+S:QL;^ M_O3$B<8+T]/SY*9^;F5E9VEX@(80C9"0J)NFD8E^<VI_D:K`Q,N_QA'1S::2 M<VYN:&]RA)*]W^WUUL.)QB&1T,RRA'%?9F9SDX&&AI:-D(J3DZ"DG**:F8=U M@9>:R<_CO,82U]/`?IYY?W^#?WAK:W*L\>.JU(G&(GZ5FX9K7V)F?H.+A921 MF9^<CY"1G*>FHJB<G)")?G"8OM7-N\82T=JV<Y&$E(^1BXA_>6B'].:1XHG& M)&N"D8)_=&5H@H*&A)"9D)V8DI21FJ>KG:6=H**@EGZ*FK#%Q]2YQA*[X,!_ M@82EF9>2E9F2?H/DZ83DB<8F:YRGA9:0;G%^>X2#A)6)DI"1E)29IJB:GZ&> MJZ^RG9>"BZR^U<C'M\83HMKLHY-VK9F6F)F8F9"IN-E\P,"(QB>8Z]MRBI"' M@(%[?H=_A(Z(D(^)GIFEFIJ=HJ:JK:RMM9*`A9ZISLO)ML84Q:_SS:O$Q9R0 MD)F0E9")TM%`;97'A\8GF.O)=WV%BH*3=GZ+AI"&D)"-F9B9F9N:J*BMH:NP MK:NTNJ%T=Z_-W[;&%=J;O_/-KD)LL9F5D)F0IK<J%W98G\J!Q@'-UH#&&9CK MH7EZ>&M]HY1W>'Z&AHF`C)"8D9Z:H*BH@+`+MJNPM<*WMXAUG\#GM,8*V>'5 M?NGNLVX0:(^`F3N@H:"OW3\>.#+-T\U;1$3-QL:>ZX9U9F-O=827CWJ&BX:& MD)"9D)&:DIJ>FJ:PLZNSL*^VMKO#J'2/N,2SQDO<WLJWQ>_2IC)-GYV2F::F M?M?10SHO*E%243\O1&9MM8[Q?F]T9FAM?81]C):.@)"0EIZ0DIJAFINDHZ6O MJZZUK;:]O[RVKI*1J<'3L<9,T.3&R*;4Z,-X,G&LPJJHN'BBA(:.)B(B(1\G M030V2GI\]()K>&]=:'%X<8N8D(&1BY.8EI::H*&BI:*HK*NNLK.RO,&^O\6M MEI6GR]>PQDW)XL;'HJ[QU*X[.:+GOKW6<'=LU>!`'B`A&25+,3A$1&ONB&=W M=U)D:&YI@8Z.A8V)D)2:GIB>IJJAI+"MK;*MN*^YO\'#R,BQFXNRW<>OQ@#5 M@,9*SICE[JB2.ENOP?SY1,/^_?JA+3=!+U(88W1/0V#:AV!Q=E9?:6AL=WV% MB8B/CYZ:I9*GH*BAI;"RL+6MMK>VO,+'S<K-RHV-M,?'L\9)R;3FZ::K=S^P MZ])$\O[UW;F0H**@91ZNQKD\;<6`8&AJ:5UI:W!G<G)XH(J+D)&:D:"@G*&F ML*VVL*NTNK3"PL/-Q\W'SJ1[N\NSQCC(E,3SW6Z.C9:\P437_M=LT)&@HJ&A M=[#&QN%P=VQ@9F9\96EK<')R9G**FXV&FIF1G*&CH:&PJ["`M@6ZP,O!PL*! MS@37PHJBR[/&)-"4XO/`<["3R&9$IO[62^G,H*BHI;:&O,;&;VMQ6F9F<FM; M:W"!<@EN?GB>CYRAFYJ?@*L5IK:RMK2ZP,?"Q\?)Q\[.U->\C:6\S:;&`>;1 MAL8CQ[F_[>VD?Y"5C410]<TXY-*GJ*BML,>UN-!K>75G9FAD:5EP@G(A?'AK MA)^0FIN:H:*BJZJNM*ZTNKV\Q\+'RL_&UM37U,Z9D:;&`LS:AX?&#\>7Q_#0 MA8>!6GE$ZXHXHLN`J`^TOLG"V,UL>G=>9FEF;FE?@G(D?GUQ>HJ*C:*?H*&K MLZNOL+2XP+N[Q,+'RL_-U]'7U=?.KI?&QZ/&`\G52[F&QB+(KZ7BYZ^-ASU4 M99)C.URIFZ>LM\G&QM7!;G9T6&9I:&QP6()R)7Z`>GQ]?XF>GJ"AL;"NL+*V MN[ZZO\3"Q\K*S=31U]C7X,V<H;_4D\8$RLO"OL6%Q@;'Q,+1*(C)AL83SYO- M\MN=C30=>&!U5T*CDYVQN-&`Q@JQ;7%R5V=I:6AO6X%R`75_@(`B?'J%CY:< MH;&KK["UM[NZNL'&PLC)Q\S1U-;:VM_@O8VMU\>0Q@O+R-#/KI^WP\;%Q,F` MQ@;)P+2P)1?-A\82N['J\KZ,/1U$QN.OB^R<BZ^TSX#&"YIN;7%::&EJ;F1I M;H!R$'U_@(!\AX9Y>X>0H:FLJ["R@+H4N[S"P\[(R<K1U-'8X-[@X<:6KLC' MC\8+Z-*OA'%@8*_#O+3A@,8&S=FR&!00HX?&$LB$RNGJL$U$%)WTSI;+EZ:/ MGL*`QBZ$:GMT6FAI;W!E<E%R<G%R?X"`986'AX5W@*2>L*RPL;JYNL7#PLC. MQ=')T='7V(#@!>7EQ9'"T(W&$\_:M8)Q8%E`1H.LI7N"Q\;>U?.R@!``;X+& M`>/;@<9%S)[2[^M:1$0>4DH8&"RQMLF<O<;&=W1[=5%H:6]P<G13;')B/WR` M4#9^AX>0D8&#F:>VPK>VN;JYP\?(R,?.T<W4U^/KSX'&`L>5I8W&5\N$54`^ M/C]`6*3`I8F`PL;([?.(%Q`0;,;&Y\S&P%/*QK3&QJ"XX?-L1$0>#G`B$`Y: MM]/&TL;+67!S<E1I9T-I<FIQ:7)(*F6`,C9?AW]KD9&.B8^8PKB`N@G!PL'( MR,K1S^#6A\8`MXW&9(HE'QT<'!TO<;S#H9..A;G(V<%Y2A`06,;&NF''8S*[ MQU*=QL2.R>QN1"PX)B2.&Q8U@X[&R,)726UR<&%I8SD^<EM6;G(S-3]@*C8R M>D)&D9&0D86.H;BZNL'#P\+(S<K?R,K(A\8`Q(W&3Z)I94L\%!0B<[+&IIR6 ME;^ULHQD;2$0.L3&H3FT22JJNC=SQL>BL=EV1#(R-1]<61\N9VG4S7<P1G!W M<T]H3S8Q;$A$86(L-C%"*38K6S<^@)$.EI"1D*:XNLC$PL+*UL?3F\9?Q;VW MD7M$*19PH[BJK:>GQ*>*54V&.A`<ILAX'H,U)GZG*4;&QKZ>S)1$/"\Z)AU[ M)RM&2\;++B-&='IR.6([-2E6,S9.42DV)BHL,RPX-3B1D8F)FY:)DJNXR\7" MQM38HL9.W8`:;9^-I<O)FK^M=D%"?UL4&DG)-1LJ)"8FB2DGNL7'G<[21SM5 M02D8*"HH*CINISA)2G1T:#!0-#4H*BDV/5,J-2$I,RDT*34KD8]G48";!Y6. MKL'"QL_BI<9,9Z.#B:76RZ?(FU)95W!W,2@0H2$?%Q\E&30I(66\S*%\GEM" MS=8['A$\+3PE*EY$4&)T<FTP*2DU*"DH-BE9-"DA*C,H-"HV*9&`*D*`FP:A MIY.\QM/*I<8@L;JAB[O/BXS>[H5E7VB+:E(L*&`Q*"8@)R$F*!X:<7%I@'$Q M9?3^L!`.#A@>'A@7*CY==G-L*B@H-2,A(S8D,50Q,41&2#8J*BEE.C8YPM3+ MJL;&R[:GQE7,U*N;T[MS>^G9?&E.87U::TYT9T193U-B7&Q:43UG/2@Q:7%Q MC?[)*C(A'%DI,1T8-%U[=F4K)S$\.CT]1CU,7DQ38&5J6CPI*#@[:4[2MEF( MQL;GV*?&5=3@LZW#N)*FIH"49GM.=6Q<7%59<GA6:&)C:&2#E&M;53%%8G%E M]]R<G#4_+G"1AHQ887UU8SP\3DI32E95559785AA9G!@5V=<3EE;19AB7V_& MJX;%I\95HL3*N(N2EJJ%5*)GG$QY8EIB7%Q-75)98GMFCH:D?8IO3C96;I37 MVK2L=E0X66E49%EB<W==1U%/5FQ5:5AG9F-O;&!D;(Z@EH-I8&I0<E)J4[ML M=+:GQE>GD=NO?Y66@FM-O6RE27=@6F)96%1:65IF;'&*A)F6FX!E0T=MBYK: MJZZ384QB8$](6&9V=EI$5U=F<&%Q87-D:W%O<GR,J+FNEG=ED(!S7&!*BU=M MN,;0I<98MH#DKHV>EF5>9=!\GD5I:%I<6U=F869?9E=Y=8:$HIV/>E\_:7%= MV)>GEVE6>VMG25IG?75:1E9==&]N=76#;'U^<HZ@K+:_LJ&"<ZFNBG%@3%E= M8K7)P\6DQEBCP]W&IHR4B6VMP*"(0T5Z74QO8EEE=5]=7G-KAFN0FIN2@DI8 M;#W5AI2#942'<'=G8E]V=5Q84U1Y=X2"G*6<KZ>)LKVIP,BAH)B/E[BTDX]? M2&=.E\1XOZ3&6,"KP[.<DXF(CK_`K7@V-F=X65I:66A86&UR>6MV?(J3GH^& M9#E(*^;&NU)$*'9B55UN971R9E)=57J1Q\W/V<O/L,W)R<:^L;&?G(23Q[JV MJY%@74YK66>BI,9:MGNYI:B>AW.6M,"X9C0J7V563%%14TA13%!EB(5\=81W M;(B+)QI5M.STP&E(EHM6:F]]?7)64%"-R-#4T]3*S\G4V.+EKZF"CJV<C86[ MN\+"PZZ77TU37('=O*'&6\NTPK:WGHN`;JN^Q[!A/4A495AC4UA=3F)K<8.$ M@XN%FX]J@UA+,1PEIMK2LY.+A6-R;GU^?41@@GVWP[S`R\?+U,O5TLZ\P(6% MHZZ=D[>NO\F]Q\2N@6U06%AKH,9@R+*APK"SGHUW;JG+S,J&:%A87F!H7F-H M9V5E>&AV?(V.AY5[B7]R3CTO,EG'RXF*=&-Z=G-\;%%D9&&%A7U^AXR0GZBY MSL&\OX*"HZZIC*"OM\&YPLO$NZAG65YMT,;&RYW&7\3*VL6VG))S8YJWPZ)S M9%I=8F-E7&1E865N<WIT@HF(?HB"D9N):&94*AQ19[:-C')N<X!_96QR96!T M;6AJ>GU^@82)?XR)F8*"IJ2HG8NPL+?%R<'*QL&9CG19JJR!JIO&8\G&T-C= MQK:>E7AFCZ.FC6QD7%YA8F%<9&-A9&]P?W6"@X=_AH*-F(U\=VU$)BH^GHFD M>G%QA8)C=G9H8V]G8V5]@']_?75D<G.">'N;H*B?B:^NL<7*P,O'R+"HA5J- MCF^=QL>9QF/0R=W5SK"QIYB'?'Y_6W1N;F-@6%Y87V5C:&-I;GIZ?7>)B(E_ M?WV%FX:4BVDO*2MWTXR%;8:)8G9Y=&YI8V!DA9*0D8=L9&%H9V%G=YFAE96K ML*R[QLC'R]#)PJ1X9D]YE;_)FL9BS^+;PIREI(.*?7Y[8FMI6F-;6&-:76I@ M9&1J9'-X@(&%B(*&C(B1=I^@BF]E+SU0W<*%:XM[76=V?7]L8V!@8YJCIYN$ M@GIXBGAJ;7!_I9.>M+"LNL:^R<K,T;Z?EV]?=XVWF,9DR+ZY[]G4H8MSA(5O M>&5E8G166%)B95I9969F;G%U>GN!?7>!?':0C8>1A'V#<'A)6&53U82'I9N- MA'60HHER8&!C;'V)FY6"E:[$H)BBBW5UBXN?H[BPM<"^VM//U];)N65EBI.8 MQA;#OL/2PL*LDW!PA'YS<VMC<6186EE58(%3)V-F:71^?'6!@8J!C7UZ>7R6 MEF1X>82:1+B7BKOGTK9\H9RJGH)_@F2`>A:&BIRZN+"GIIZ1?G6+CY.;K;^N MMLO!Q(#4!\*DB)QCQLB\E,9IO<O)P=#BTJ6.=76!?&MN7UM=7EA?9W1J<6UD M75]F9FMM;G-ZA'V$BGZ"=(F)F56(B(.7=F^?D,?;V[E^OYJLFH*"F8Z@F8-\ M>HB?H)VHI:2?A8)W?IV7DJVBO+F^R-'2T-+-PZUF?J1TRY+&:LO-W]',TMS1 MIY!S;G!U7V-[85U96HBDO:^SL;6=;&5N:69K;79^?(R*?81]A8V+2WF"BH^) M:W^9R,S<NH2OI:2QBI6)G*JNI9R+@H!V=WB`AY:$A7M\BI:0EI"EN["OP,76 MV=#6RY1ZF''`DL87R,W,U,G)E8"7BG!><'5A9WAB6UQ:L[[,@,91RKRIBW-G M:'!I<G-ZAHE\?X&%B8M`=(J-EXIO;Z7(Q]3*D*&HG*Z4H8F7L["IHI:5@WI[ MB(R,D'=^?7V(CHN0C9BMIZ:VMLG4T=K3LIN4<KO!R9#&%<&RE\##L5,O?H%L M67EW9VYH8%AC:L^$QD_<M(]W:G9H;&MX?()_=H&"AX8V>Y*,FHEP::[-R<C3 MH)NCE:&=HY.2KZJ;HYNLDHB.IJ>CE7AY=WN'A8>1CI.:G*&MJ[K)TMK2R,6= M?*FONY#&%+AQ1WJ]BU\O:WAH<7QT:%]=6%EGHH?&4-BM<GMI:')U>'2&=(%Z MBV4\CHN$A(UM;;#6T;V\KYJ8EINEG)R=BJ2*KYNTH7V7FJR[K*"%:75R?HJ/ MB)23C)2?GKJUQ]?,V^+`HWB,B<'&QXW&$[AI1RB=BXMD='1M<7QW9RQ16&5D MBL9.RXM9;'IR<GEF?71_=T)/?H>$?WEW>+;"UK.GP:B.J::PFYR>BIR*DK"5 MH8&7DY:[JIR3<6=Q=81U=(&-AJR2BKNKG,?&T^2_QI&<;J+&RHW&$[Q9A'R$ MA9[IDFEY='AT.`X]679MB\9-SJ1R975Y9G)X>W=_(FV;?HB1=&^NR+[+L)^M MM(V'G9.G=XV*D\"-HWV<CIMQ9J60BH:*<F5O>'=ZB'Q]B(J4HIR-QYS,T]'D MY+INE,:*C<83S'&FTX%BH\]W:W)Z>EX2#D16>'2-QDS(CV5R=GIU>'U</WYT M?X2!A+O+R\^YL*B6J[E_E8N*>(&OBIN0HHA]BW9J88J1I8Z7@')C>7E]<WB# MAGJ"CHR*KKRRS<OST-.V@DABRXS&$\?&I9-Q?7=\<W9T>F$8#P]$5F6$A,8! MR=B%QDN_1EUU<W5U:BAJ<H*"E83EX<O!VJZLMY.<D'F3JHB@>8Z1C:>+BW*/ M;'1G<HNUJ'MW=6AH;WAH=(!U>G^0?HV@I+"SRNS(R-ZS5U2-C<82R;)J;(R! M;71Z<FLD#@\/3%5DGH+&!-/!M*/(A,9+N$8J.4%3@"LW<W1^?(FI\^;CP+ZM MI:^.C(.)B*:$DWA\DH6=>'QVB7)I7EY_EJYS>8!MA)6!=7%P:7E]@H&`BI"E MH;+=S>CPXI1'=H[&"KY^;H:!='AX4CH1@`\#155<OX'&"-73TL:IJ)N>Q('& M3IQ0/"LI/E8[6W=U>W:1N^3=Z\"OJ9^LHH.`DX.>B(.">HJ`BW]R=WEN8&!9 M<HBD;W.`=HFUI:"=F8V$>'-[?("%DIJBQ<GOY.+)@'_'BLR,Q@>B>'U]>W-L M+X(/`T!76=:`QES)Y,W@WKV';G*VRL;&R'Y97S8I.2]B>'QT=W6>PM+4Z<*M MI9ZJLX-_EX*6CGB,?(%^>XAK=VIG66189X*7;&U\?7_'QL;'R+:8?75\?'J` M@96;K<'EU=OMPI"Z2\Z-Q@ZL?7IN.R$1$!`/#PY29(^!QD+9W=+%U:6(6%)@ MX<;&TU%?6F%B7F5U=7=J7XJ>R,+,V<ZZJK"3BI)WD(B(FWB$>7B*<69Q=V9F M5%)36&F`:G!Q=UC)A,82R:YW;GU\@9B;J;K2\_/DI%`VK(W&"-,L%Q`5*A(8 M$(`/`EE>RX#&@.M`UYR'D(%-5TAKRL:^4EI&6%U71%YE97"/P(O`N-C)Q,>< MJXB"F7U]G'Q]<7N*8V%G6UA@55-D5%M>86%F>(1Q7KN'Q@_9EWUX?X2-HJ[" MX^K41S9NCL8,QS517D!&0"D.#A-J9H7&,+1T>F4_4%$]0IV74T]84UAF1%%E M869]AX2MHN"XOKZIDX-^A(%U?GM\>&EX9EM77UR`4PQA7&"UY8M29VEG7H/2 MB,8/UK>!<GIUBY^QT=RU.&7&SHW&"Y-D9$!'+S<.#A1A?X7&0<2\O:M-0$\^ M.#I*0DA23UZ"<5AF8&!WAX>MH<6QQ[BYC)1[?XMY@8Y[B'%K:&!?5%=39%QG M8J;$RL.36FIB8WJ?O8?&#\C$OL"!=XV)AY7*SW5SSVF-Q@NO;TTB31T?#P\F M8I:(QB'"IF)"/STU-SE$2E-ALK1B9F!@@(^1G9^\N=ZYKYE^@'R`@'P:>XU] M:6I78UE866-L9X+`QL;(O'Q33F2/OJK<B<8-Q\>H@7^'B:C$M:]4.MB,Q@NW M;%443Q<3#P\_9K6)QC'%FG5#/CP]/T)*6XO$QVMK8&)[@8*/I:ZUW+.IGFY] M?'R!>GF#AGIG9UE=75Q=:'6$JH+&!Y%*2%ZMV["[BL8,T;ZDA8.$D:['N"(I MU8S&"[]C;!!)'1`0%5AWS8O&+K-,041)24)-<KC&QGAS86-N<G"!JY^OS;2I MGFES@'N&>GJ)>F]B8F!98&!B>X>K@\8(G$Q+5L/GOY/'B\8,R9N#?X"8O:TN M'\;&NXK&"LU>C!8S+Q`0+&RFC,8(S&Q.45)11%.G@,8AG7EH8&5M:W*MDZV\ MSJR==V:#>H)\<H1O9%Q?8&-@9G.=M(3&"*):6U:WT<R.QXS&"\F?@G:*FJ9R M);/$BHK&"M9PLD`Q0!`15W+EC<8'X8!24DY(9LF`QA'CBWEE8U9R<;B0K;;" MNI5T98.`>0-R>65B@F`"<KS*A<8(O5UJ<HV>H8O$CL8*OGUZ?9"K9Z^Y$+R* MQ@C"OEM1+!,9=WF/Q@6^4E`^6]*"QA?<?'=@9&1T>'RSL[[!BVUH?7ML:6MR M>&6!8`&$P(?&"--89W)6A7)RR(_&";1V=7J+HX1N$*Z+Q@?`A%X^'3-]J)#& M`]);4J6#QAS*I7%C85-B87*EK[>QBV9E>'-S>7AQ:6EE8%-*UXG&!H]E>U=: M8'61Q@O.:W9T?8MU6(F7>\N(Q@?%H(B#06.5PI#&`\BYN,*#QAS'PK9E7V-C M:W:7J[FLGFY=>'AY<&QB9E%*/TUYR(G&!M1?A)EN9Y*1Q@O'O8-X='UO;V=L M?,>)Q@6PS\B/>LJ=QAG(IF]E:&AVG*2RJ*1U8Z*KJ+!F55)(2DA1LXK&!LQN MD92@@YZ2Q@G'MY1M=69J8&2UBL8%R>;GE)/3G<89R,&>@7%L<(>3HJ6B>F:[ MP<#'8E),2T]/5<>+Q@5XB)2SB+"3Q@C(LIQ];F5RB<B*Q@78X-V-K<F?Q@O' MIXR)>FV`CZ.A?W&`Q@C%7U%/4%)3=\B+Q@6"<9F\AL"5Q@7,EXQ\E+6,Q@+- MF+*CQA3,RZQB>'REJX2*Q,;&N%]-6%)25M*,Q@614YW+ALJJQ@'8TJ;&$=:- M:G*SU*A_P<;&LV1R;E]EMHW&!9I3E<V;RM;&$.%QB]#SK92_QL:O;FIK:FK( MC<8%D&"XS9V]UL80RJ&GW]RVD+O&QJ]V:6=L<M6-Q@5W99_!IYO6QA"^K['3 MTJ-ZO,;&K'1E96>1RHW&!6ENBKVLDM7&$+JXO:^\I8MUO\;&JFYB9VK"C<8' MOV5[G\&KC,?2QA+$LJ^_RZ.C=W)ZPL;&J6)B57/?C,8'R:-EB[G"K(?3Q@FX M>KOCRH:"9V>)@,8$JD]A&GV-Q@C/96N>MK:SB,'2Q@B+H>;OK6%A4J"!Q@2Q M42LL;XW&"+%D?IZVSZ2(P='&")V0TO&O>E-NMX+&!,.`('*,C<8(F&2$M^K/ MM(:_T<8'8:GSQ69EI\Z$Q@.M++J,C<8(E&J#M_/9P9>ZT,8(T&JOY(A5N,+' MA,8#VC+%E8W&"'9ED,[NX:Z2O,_&!]_!;[2_:;+%AL8#S5/&Q(S&";Z*6WZD MV;F6BL#/Q@;4P9##F(/,B,8"@,;-C,8)HZE;;H2[FWN$Q,_&!<+!MM!_K8G& M`*Z-Q@G'BK1N>8*VF72/T,8%PKC(TXG-B<8`S(W&",F#D:*WM/"_G-'&!9R^ MI=I]TIK&",EYB;BSO-N\OM'&!,"GI**/F\8(S'B%KJ6EXZZXT<8$MHVAC<F; MQ@C'BX.3HI"\HL#1Q@2T@L:XR9S&!ZUZCY-]CX++T<8#OJ+2T)W&!ZEH@X"$ M@:+*T<8#P<C2V9W&!IY=?&^;D\K2Q@.TU-+:G<8%HVB*:;O,T\8"U];2GL8% MAYR-A+?@U,8!S]&>Q@61JM+?D<G4Q@#'G\8%U[O2S*?)U,8`UY_&!<B_V=&N MS-3&`,N@Q@2YWLG4P/C&!+['QM3#^<8#H,;&R?G&`'S\Q@#1I,;_QHK&`LSV MX?K&`O']\_K&`_W]\]/YQ@/O[^7*^L8"Q[N`^L8#V5=$Q/K&`L1=>OS&`8/$ M^\8"NE2G^L8#Q;EOV?K&`].)GLKZQ@*Y;;K[Q@*F@L#[Q@&.E_O&`M-OF/K& M`\B[<\2GQ@7<M[>DM\O+Q@*K9+VBQ@[6H4]*/S0U.C0Z.$IVG\3&Q@/#DI+3 MG\83Q:AU3ADA"0D+%1H*"14S4VB,I,W$Q@/9<[_'G<86P99J#0D*(`X,#Q4P M$`T,#!P*0&6AI;[#Q@*79<.<QAJ]G`T-"0D/&1H6&"$['1@5$S00#PT*-Y2R MPLC!Q@&BE9S&&GH*"24-#QDB)AH4,#,G+!44.!T9$Q$5"B:GT\+&"7*=W*1B M7%R)M<V"Q@']VHK&'ME<"0D*'"49%S9&5&=P;W5U?'IK1C4>&RT;$`PSI]/` MQA'96!8.%1@;&1DA;\/&QOW]\L.)Q@NH*`D*$!\?,%IC9V^`>A!^@("8BI6' MA&]6)!L5$`Q%M;_&$8D5.1D:%C`4%1PC+WK6[//*O8G&(7N*%0\8'$U<86Z# M='I[AGZ`?8J"E962DHR&:2D:%"LAA-R\QA+5.PPD-T=A:&EA4SLB,&OPX)#. MB<8B:W<R'Q0A7F)T>'UXA(&'CX^$@8&,EY>5G9.2>6=*,A8H/["[QA+('@T> M5U>'@(5]=&95.T3RXG;?B<8D4FU5)A(81&%T=7IW@8B!C8J'@X"(EIV3FI:8 MFI*'8#$5#UN+T;G&$J@5#1Y;59"'AH&$AX1E5]OE;MJ)QB9&C(DI$@\B3F]P M>79WAGR"@(>$A8B6GI*4FI:CI*Z1830A$$&OO,>WQ@B%"@D/($J*A(:!AP:` MFYW.:)FXB,8G9NK1*!@6%!EC;'1[<7E_>X"%>Y"*EY*2E)J>HJ2CI*J"4B45 M*X_`R;;&%+80"0D-4JYO@("'@(2`?,3%/Q=.Q(?&)V;JEQP<&2D=#4]O?7J! M>H"'?H>'D9&2DIB8I)JCI:2CJ[1]-$$2B-FVQA7520T)"A<V*G2'A("'@)>J M*!!<+D^W@<8!R]6`QAEFZEH<%AXZ*P\,3G-U>GI\>WZ`AXZ3DI28F("E"ZNC MI:JUKK%T'A$XX+3&"M;@R2,)"0H-#S==@(<[E)F4J=ID*%-%R]++>FQLR\;& M5.I0'"L/*B,9$ALW>GUZ>H"!AX>)DH^2E)*8I:BCJ*6HJZNTN*`N%@V)L\9+ MV]S'C`T)"0P,-$I-@8>7EWG3SVI;24%B9&)<2VR#@JU+\$\7)Q(T(1P9.1HY M<G:!@(60AXV2E9*3EIJ=I:.DJJBKLK6UKYE5%C"/T+'&3,WBQKLG"PD,"R0Z M5+F>F*YPI9*9GC(S,S$K-$I05F6(//(]%"$8.D$J($$8&T1Q@GV'CHB0DI65 MF9F;H*.CI:FMJ;.XM;F_EUDO7IK3L,9-PN'&QF`3"0L+$2E>U;2QT6]\@M7; M/2@M*APD1SU)8&PJ["X6&QTT7T,S.AX5&EAX?8>+BI21E)>@FIVEI:2HJ*^H MLKJWO\3$I6I+4*["K\8`TX#&2L0T"@D-"A8J<J7[^&S`_?SYES-*2S5.&F%S M;6H6U2\C'2`=56=@.B(:&QI6?8>2BY>.EY2?FIVEIZ:KIZNLKK:^PL7(R\-Y M*1FDQ+/&,+`-"0H/"AHC9^K1;/#]\]J@@)25E&`HI<:U61.V'RA")B(N9VAJ M3Q\M,@TT@8>)DHF`E!6:GJ6DJZ>CJ[2OMKVYQ,/+P\6(&QNUM,8P.0P)"1L. M0%%OOFS=_<MFPH"4E9J96X+&QN`=6R8H8B@;'V=H:G!P5"49$#5ZD)&.DX&: M`J6CI8"K!;2[PK>]O8'%!-2U+Q&?L\8DQ"()"0PK#CI<=FRP_<I'X[Z4F)B= MJU^)QL8:,R4D8EL9)59H:H%P"2P:,0V`DY63DIB`HQ6>JZFKJ[2UPKW"PL3# MQL70U+))$V_,IL8!Y="'QB.2"@D)*U$70U%L=?._,>',EYB8I*:_EI7$$AH: M*&)G-C0B:6^!<")L4SP9(5F1DY*:FYNCHJBMJ*NTM+>^OL+%RL#2T-30PU@N MD*7&`LS6A8?&#[T>#`D2/4X<5D)LY'\MC;Z`F`^IM\BZQ[D7&QPF8F=8(AM3 M@G`D=7-A.1DQ6(V8F9JBJ:.FJ*NQM;2UO;[#Q<;%U,K4T=2]D$!EQ:/&`[_0 M2;>'QB%U%PD)'EU(12YEG%PU3)9ZDIZNQ,;&T+`9'QTH8F=D-AU$@G`<=7MT M7ST^,%26F9JFIZ6EJ:NTM;2XP+[#Q<3(S\R`U`7<R&(TD]&3Q@3*RL"]Q87& M!L2;C,DGA,F&QA/$/0H)"4=^/"10;'-8/I-E@Z&ORX#&"I\:)2(H8V=G5B(Y M@7`!<7:`>R)H828<>(^:IZ.FI:NNLK2TN<*^Q,3#R<O0T=?6V]RM2E.PQ9#& M"\O&T,BCF;7#OK_"R8#&!K<7%J,D%LR'QA*4#PD)%6Q<(A^BX;"%Z(!KD*3) M@,8$?!PO)R&`9P-I,2MJ@'`G=7I[>W2#@5$J,6*2H:.DI:FTK[2UM[Z_Q</$ MQ<O/S-3<VMS?PC0MLI#&"^;$IFYD6UNMAXFDX(#&!H`)$A@/#Z"'QA*^&0P* M"0YJ;!I^\LIZNXJ777:]@,8N;A$6&"1G9VEL6AE"<'!M<'I[>T:`@X-^6R=8 MEJ6FI:JTL;2\NK[$QL#+Q,O+U-.`W`7DY+Q44\2-QA//U:1M9%M./T064T0K M4L3&U!$)#8`/`&^"Q@'<TH'&.J<7"@D)66QL*"\_&A@FIJN\;Z_&QDX8&Q8C M9V=I;'!./FEP32-Y>TX4>8.#AXYD%BZ9J[6SJ[&TL;G"@,,'Q<O+T-3@ZL^! MQ@+$3B"-QE>_;DP_,#`X/RM8>408&Y;&7`D)"A`/#VG&QN"_QH9&RL:7QL9A M#0D)56QL*`XI&A`.;:K0QLW&R!L<(1\Q9V4I9G!@+$AP-1=<>QX46(-W7XZ. M?UP;?+6P@+0)N+B\P\/%R\;<U8?&`)N-QF1S(A\5%!L;*1QY@B`4%R:?$PD* M"A$/#U;&QJ%5QSHAN[\HFL:M%PL)4VP_4SL6/B(/1#1YQL>^4PPD)1XX9UL9 M,'!5%#5P&A0G6Q44*W8E*HZ.C(ID,GBPM+2UNKF]P\7%W<;)R(?&`,"-QD^4 M9F-&-!04'Q]J6Q(0%!-1#`L*"A4/#S?"QG`KKB<6I[`6:<:^41();&Q-3%0G M-#0H0C)(T\QQ*`H<'QHM9DH5'F4^$C--%108-Q84'$L7'X".#I*#66Z`L+2] MOKN]Q-#%TYO&7\&XLHYT1"<5($4I"@X0$`D/#@L*&1`/&)['/0]V'1%TEQ0U MQL:8)CR9;%]+73LC/3]$02F^QB(0"A88%AQ?,10422,4+"05%!(7%Q04'A0< MCHZ%?IB/>5J*K\/!O<#.UZ+&/-QW%0T0#0D*"0\*#P\-#1H2#P\[PQ@.&A01 M%6L4&+F_PE&_Q&E<>%4[&B9#0$,V4I85%PL7%A0/1Q04$Q>`%`,2%A01@Q0$ M&8Z+7SN`F`=Y-9JSOKS)X:7&-3@,%A,,"@D-"A`1%Q,7$PX1#XT1$!`1$@X7 M%!%:B:=9(SM69\O*/2@46499.A<Z&181'R47#X`4"Q,4$Q03&QL4$1<3$H$4 M`XYV%R6`F`::HEYOP,[*I<8@FPH.%@T)%0L*"0H4(!$6$0D.#3\.#0T0#A$2 M$A$-*2DG@"DB,?+]H0L+#A@H*!@4%P\*&B$1)1@2%!(1$A01#AL.#AD*$A.` M%`M:(!0;O="UD<;&M6JGQCAO"0L0"1`-"0D*&1,:$A,-%!H6'ADC&R,?&Q@2 M%PP.#`T.)RDI0/W#$!<1#Q<4#A48#0H4'`\D$@Z!#!@*#`H0"B,E#0D1#!$2 M&1D@&L2G&UW&QN#0I\95.@D*#Q$."@P)$!8:8R@6$1(M)R<J*CDY/QU%%$49 M$"(0#A0F*2GNTBHG&!H.#`D5(@X0%QH.#PT)"@D*"@D*"0PG'#$7#`T0$0LH M$QP9:CH?0L:70\&GQCU#"@H+$@L)"Q84.").-1L.$BLB,R\N)3`Q+4D3+CD3 M'!@*#2$H/,W4/BL>'PP+"2\Z"Q$:'@\0"@H)"0L)"X`)%!<3*",,"@P1%BDC M&!<O(1TDL4$CL*?&5V`-"0L2"PL,&2>**40V&A`2)"DO*BPG+B@R.!PA0A(3 M%`D+%B@V?-<W*R@D#1$5-#D*#QD=#@\+"@D)#`D,"0L)#Q0;-1(0#0\5&RL3 M%1@:'1ME(B"NQLREQC1Z'@H,$0L.$QA.NS)`-147$Q\M)B$G+2XB+"4I&S\5 M#@\*"@LF*2[6*"@M)Q`8(2TH"@P6&H`-(`L)"0L)"PD+"0L5$TXD%`X1$@\F M$1,.%QP9'AT>I<>HPZ3&.'X^"@P/#!,E%HA]/S0U$B$9(1XD&B4>'1P;(B\3 M.2`/%`\)"B(F&=,N)QXE$1`C(!`)#1,8#0T,#(()&@L)"@D3%VE$#0\C&AP3 M%PL*&Q`7&AL:?+(GLZ3&/(P-"0H)$1@?%GQ]/3(V%!4@&!(4%Q03$1H4&!04 M&1T-$1L*"182%>&2<A$4#0T1&@H*%!8?$!$-#`D*"0N`"1@*#@H,/D48*2D6 M,1L-"@H-#1XE&AHY&Q^'I,8`4H`)-`X-$1@60'U20B@7&!@0"@L,#`H,"@P. M%A4,&!$;*@T+#`U1E^;R?0\2#0L7"0D0$Q$R,",5@@D""@D+@0D5*UAM5BHQ M%PH)$`D)"QD/(!@:&UW<B:'&/;4+"0H*#Q$3$ADAPWDS&!(9&`H-#`D+"@T) M#!(9&!$6$`\D#PD+#@T6C-7$9`T-"@T)"1`3$#14;4@,#1D.@`J`"1<*.&]] M;6U3&10-"AD,#`L)"1DL&!HD)"6@QA6X+`D)#0H2%1$4&!4I+A`6$!(,"A`+ M@@E%#`\7&A46&!(5$!`-$`X0'TNXM1<*"0T)"Q$5#3-174P<'S(P'1<7$P\- M$G5O?&UM4QD1$`P0#PP;"0L+#Q(A'"`?Q,;&Q9S&8'`-"0D*#`\4#A07$0T> M$181#0D)"PL,"0H,"PP4%AD6%QD6%Q41$!82#PX7/UV/-PD*"0D,$@T@+D]4 M*3=1120<'!L9'D!M5DYM;4,;$1`.#@P+#PD3"@H,-S0:'Y"83)*<Q@!&@`D[ M"@P/$P\4&!,,'146$0L)"@H+#`D+#0L,%!@8%Q@8%QD6$A08%!`,$A4QCD8X M"PD*"A`-&R%"33!%6DXJ@!L-'"Y28TP[9F(Z&!`0#@^`"PP)$@L)"C(R&B)G M;2*`F\9`M!`*"0D+"@X0%Q@<&Q`C&A4-#`D+#`P)"PP-"@T6'1D:&1<8&A@6 M&!L3$PTF#@T30\<>"@L*#0T;'2,Q/%I;6#F`%!\83UU31#!,03`.#A`.$`T- M"PD*#`H*#`P?+A\9('FWNYG&`44*@@E<$!88'!H;$1@1#0T+"0T/"PP0#@X1 M$18='!L:&1L;&!85'!(5%B@4#@PNVGT*#PL)"A(:'!PQ6EM;6A0/#A!?;4XR M(#,X)Q<7#!$-#0X+"@H)"PP*"A='&18@3TESF,8`NH()5!,6$1D9%QP1%!06 M"@D1$102%1@@&1P?'!86&AP<&QL<&!48%1D3&!8R$`P9,K81%@P/%1$7%!`: M/%M;6C,<%Q`T;4`9#A<:#Q$<&!$+$`\-#@L,"0J!"04,#10@*TJ8QD)I"0H* M"0D,$Q47&1H4&10-#!(,#A<=)2<R.3Q#/R4D&AL:&QL9&QL<&R87%1@;,AD1 M%AF@&2@0"0H*%@T0#AQM:&U,@!T"&2L:@`H;#`D)$!H9"PX1$!$,&0X*#`D) M"@D>6"<C*L9RB93&`Y`7"0J`"6(.%189&Q@1%PL+$1$,)C@T,2XM(R@T0THX M,"T@'1D=&1D:&B$7%Q,A+"`6$QPR&R,-"0H*%PL0#Q=M;&]7#A09'1\9$1`0 M"PD)"QL7$Q$.%Q</&PL0#PD*"@D0+A,1'$<R,<F2Q@+)*@N""0`/@!4,%A,. M#@H3#1$/9H^EH8"@3G<K,34\03@O'B$:&!@;&1T8%Q@7,AP5%A<N+AT*"0H* M%PT1$!%+86U)#0\1%!<7'!PD&Q$1#!D6%!`4&!83'@X.$0L4#0D*$0LA)QXF M(K>2Q@+`"@J!"1`+$A<4$!@7#@P/%`P4$Z.XR(#&1<>L@UTJ-CTO-28P'AH8 M'!\;&1@8$C4:%A<7-CD:"@D*"A00#Q(0*#U@21,/%1(3%!L?*!\5$1$>&A,/ M%QH8%!X2$1</%Q.!"0<H1!@>)J:HO)#&%;0+"@D+"0D.&!P3#!P;#0P2#PP6 M,<N$QD_6G5)!+"(V,SDE'A4>(AH9&Q81+1@8%AD_.A<+"0D+$1,/$Q$/&$M' M(!,?%!,/%B(I'!(0$R$A'1`6'AX6'A83'1(7'`H/"PDB1A46)'MQEI#&%*P1 M#`H+"PD-("@1#!L9"PP,"@X8AX?&&-!]*"4P/BHI)A<I'18=%Q41%A@9&1U% M,Q*`"30+#Q43$Q(/%#$Q-"`K%!0.&B@P'A`0$QPF-AD0)R0:)Q05'A<:*@L< M%PD9"@HC%!LJ0K[&QXW&$ZP1#`T."PL)'C48#!D<%`X,#!@@BL9.M5D;(QTE M)21"&Q0;%!@3&A@9&RQ;,@\)"@H/"1`8$A$.'S$V-"HK%0X3%1XE'!H0&R,F M+"`,+!DG-1L<&!$:*1`7,0U%#A!Y11$C*8?&RHW&!+07%0P2@`H+*#T@%!T9 M#PL,%1PCB\9-S8DF%!HF2"4<%A<1#A42%!87-3<9"PD*#@\/#A@7$1,Q3D4T M)PP6#R`C&!PK1$0M(#,@(A@9("@='2,=%RD:$11`$#$1*#40"0HC2+Q9C<83 MRBPV*",1"@DT,QP='18+"QD1(#:-QA&]710?(QT8(!`3%QD4%Q$A$0^`"3<* M#A`5#PX4%18D1#@K*A(5$1\?%R(F-#0A"1\9&A\9+"8<*1\9&R4;&!DK#ADH M$R`)-B@.'AP;M8S&$\>Q4#,K&A,H)"(:'1@-"P\9&Q-/A,8!N]"$QA#%N1\3 M'!\8&!H0%A<8$147"H`).`H,#0X3$!<6%!@B1#LK)A82%B$J&C,8'QX1"@\O M'!HA2S8?020;)!\;%B$8$A8O#R<)4D()#QH?=X[&$9I2-!L8&AL>&QP/"PX/ M&B,3>8+&!,V/95>RA,8.HR4.$1(/%A(3%!87#1(1@0DX"@L/#Q46&147$AM! M/S`I&!DA/T8M/!46&Q0+#"T>&15T<EM4*C-"'QP:'1H7'1T1+`E`&`D*#QH\ MCL81O&TV'!H8&QT5$PT-#P\3)A*K@<8(U:9'/CA@:8O"@<8.@R87#@\1%!47 M%Q@6#0\,@`D\"@H-$0\3%AH5&A(9/D(J*AD@,T94,CH1$AD5"PHK(A82=Z6: MD'E_>4$[+!\=&QT8$R(,.0D7%PL3.L)PRXS&"(<^'!H<&QL."X$/`PTG&L^` MQAO)XX$D-D,3#4VPRL;&R&8D'0X1%1,:'1P9&`\-@0DA"PH.$1$0%AL5&A89 M/#\C*ALD0#U9+C80$AD7"PLI(Q(18H#&%\?$J&UE33$G'QL:%AD/-@DE(0D+ M2ZP9RHW&!G\<'1L0$1&!#P,+$29=@<8;V-JGME-2&0HG2N#&QM,J&0\-$1$8 M&AH=%2`.#8()(`H,#A86%1L3%QDB/",F,BLL0AU.+SX3(R,A$1(D'PP-#(7& M$KZ16S$<'!L7$A@*)0D)"E@L%)B-Q@?3)A`/%1<2&(`/`PP7'+6`QH#J#<QO M*QH9%3P>,[G&N!\8@`HO#AD@%Q08&PL6#@T)#`D)#PT8&A(;$Q89*BPD-#HS M.%$I)2<R0$%143,B&QD1#`R:A\8/RHI((!L9%A$8"0\)"10448[&`\,K0EF` M/P4C"PL/)"2%QD"7-T<G)3TS#!E^@B,0"0P)$QDZ3C4I$Q`9$A$-#0D)#1$9 M'!D6%QD;)#P]/$11/"`H(RL]55);L^1R$1(1#0P5Q(C&#]6J2"4=&A(/#@D* M"AE`QLV-Q@N*7E\_.RDJ"PL/)3N%QD'`M+>/,#$Z*QDQ+R,.#`T,1%-*1E90 M&Q87#14-#@H*"1$4&QH9&AL6'2,R/4XW.S`P.T9)05FCQ,J_9!$-#`D++K:' MQ@_(P[:C.1\:%0\*"0D1/\I5C<8+JFQ((485%PX.$A9JB,89NYY7,R<?'!\; M#Q$,$)ZE1T5;6!H6%`X/$@^`"@(.$A2`&QP<%QP:(3U4.T=)/4Q4,D9QP,;& MQ[!/"PL)"0U*UHG&#<*UB"`:%@\,"@LB1!_0C,8+M&E2%$L4$`\.'QJ=B<88 MQ95D&B0>&1$/#@Y4P,)&-UE9(AL9$@T3#X`*%0L-$AP<&QL:&QHA05=-2%9) M5D`J;:""Q@)L#@J`"0$8FXK&#-&X;#H9%0\+"1,2$KZ,Q@6]7VL/1AN`#P(J M.L2+QBZD(B(>%`P1"RFCQL9*)U=:-1XA%PP5#PD*"0D+$!L<&1P>&R`Q25E; M2%M05#A,G8/&`G@2"X`)`0I*C,8-NG,P&Q,-"0T-$:/&N\6)Q@K*68L5,2D0 M$!8OBXS&",QC'`P.$AH.@H#&"VDF3EI1'",?"AH1"H`)$@P0&1T9'B4A,5)2 M5EM:6TE'<K*$Q@*&$0V!"0$@Q8S&#,AW+QH1"@L,$(K#AL")Q@K5:JT_+#\0 M$1\OY(W&!N!("0X:&AN!QAC<0R516B8?(0T<$0H)"@D-$AD='28E*%!:@EL" M48G*A<8(K@H)"0P)"1O`CL8*LAP8$`P-#BNK#[2*Q@B]O590)A(/'#V/Q@6W M"1(P(\2"QA?-(R5;5"LE'1X*"PD)"Q45'",Q/3,G/$F!6P%NP(?&!],)"@DE M"@D@D,8)ES$:$`L/$2`/J8O&!\!N33`:$QF0D,8#Q#,1A(/&"<I^)UI8,C4S M'PR`"@\6)!(?("4?("4]/491,AK4B<8&70D)(P\*.)'&"[XS(102"PX,98I( MJXC&!\6%348;&%S`D<8"M+"^@\8)Q[V725M,.2L4"8`*#Q4S#Q\?'APD(!P6 M$1H/0LB)Q@;%"0HS)0EDD<8+Q:U2*2L5(!`Y2V7"B<8%E!L:%A^UG<8'P7A% M23D?%`F`"@X.+11T;X20/@\.#`H,"9J*Q@;*&@DL*PF`DL8)Q*IJ/BU`+E%4 MJHK&!;8)"1A/S9W&%,BH?F(W'A8+"@D*"C`?JZBVOS,)"H`)`1"^B\8%,@DE M&PF+E,8'HH5<4TEE@\.*Q@70$0P]D,F?QA;`D%I&+@T+"@L)+"7#QL:_(`D+ M"@D*0XS&!4P/)@H)FI;&!)1V=82SC,8"*A6=H\84RK5T$0D,"@H=(<#&QJP@ M"@P*"1#$C,8%8",U"0FWJL8!T,2FQA'30`D)"@D2%[W&QIXK&AL6%)B-Q@6/ M/D,3";?6QA#@(PL*"0X1M\;&H1LM,QLDO8W&!8(E31,)D-;&$,HO"@H)#0NQ MQL:D'S9`)2'0C<8%9Q8\#0EOUL80F!0*"0D/#[7&QJ@D0D5$7,F-Q@4P#C,/ M"DG5QA"C20H*"0H-%+K&QJ<Q335&IXW&!K@5"QX-"C;3QA+$HF,*"0T,#`DG MP,;&I31*'TS9C,8(R88)"@L)"2G$TL8)KS$)"0H:#@T88H#&!*<?*A)WC<8# MRQ8*"8`*`1B]TL8(3A4)"0LS#1%\@<8$L4(3)F^-Q@B:"0P)"@D)%KO1Q@A^ M#PH)"@XC2:J"Q@3">QQPA(W&"&X)"0H)"0H2M]'&!S,)"0P;/:+.A,8#J"JT MA(W&`V`)"PJ`"0$+L=#&"+\8"@D;.J_"QX3&`]DQQ)*-Q@-$"0L*@`D!#++/ MQ@?9020*"C*BQ(;&`\U2QL.,Q@F8%PL*"0D*"A:[S\8&KB<A"0MLQ8C&`G[& MS8S&`E<9#(`)`PH),,+/Q@5U,!</#:>)Q@"JCL8"(BH,@`D"#"!FT,8$7AT9 M'Q**Q@#,CL8'&BL-#@P-#F[1Q@5O)$02'\V;Q@<F*`T>&2L9J]'&!'T]6$I= MF\8(RCPB&4)$"QFLT<8$E$\C3;>;Q@C'/QM,'$`E%KG1Q@.7,IF!G<8'D"A3 M.D-<,LC1Q@.M:\2TG<8'H3=023!9><G1Q@.^M<37G<8&FCY%1#=<N=+&`[+( MQ-F=Q@6>/RXOC:73Q@+4R\2>Q@6#BT!(JMS4Q@'$RY[&!(ZDQ->.U<8`Q)_& M!-2YQ,6BU<8`UI_&!<B\T\ZLRM3&`,N@Q@2VVLC3O_C&!+S$QM/"^,8$Q9S& MQLGYQ@!V_,8`RZ3&_\:*Q@+,\-SZQ@+K]NOZQ@/V]NS3^<8#ZN7?Q_K&`K6V M<_K&`]H_)\3ZQ@+%4VO\Q@%ZQ/O&`KL[E_O&`K%9V?K&`]-]E,7ZQ@*X7:[[ MQ@*D<+W[Q@&%?_O&`M)EC_K&`\>Z9<2GQ@7<MK:3MLS+Q@*J3[FBQ@[6E$=$ M/S0U,30Z.$1GC<3&Q@/%@X33G\83Q9UU1Q,8"0D+$!,*"1$I16B$F<[$Q@+9 M8;J>QA:[EED,"0H7#0P/$R,0#0P+%0HR4J*@N\/&`I12O9S&&KR)#`L)"0X5 M%Q48'C`9%Q43)A`.#`DKA['!R,'&`9^%G,8::PH)&PL.&1\C&A0F*B(B%!0N M'1D3#Q$*'IG3PL8)8XC<E4Y(2'ZTSH+&`?;.BL8>V4@)"0H6'AD7+3Q-97E_ M@("*A6L\+AL;*!<0"RF9T\#&$=E"%`P4&!H9&!I9O,;&]O;BPHG&"Y,="0H0 M'1TE5F%E>("%$)29F;"DKI*$?TX?&Q40##>TO\81>Q$C%QD5*A,5&B`N9L_E MY+2_B<8A8',2#A@;2UA><YJ!A8N>E)F,E)RHJJ*IG)9H(!H4(2!RW+S&$LPQ M#!PC06EO;FE6,QPI7.+3A\Z)QB)+528>$QY;7WN$C(J;F:*FI)*6FJ2OK:JN MGIM]:$0H%",_K+O&$K,8#1U/3I.4EH^#;UDV-^+4<=N)QB0Y2$4A$!<^8(*# MA8>3H9.FH)2>FJ.OLJ&LH:*EG8IC+!0/6'[.N<82D!`,'6!,EJ*@FY^BEV50 MS])IT8G&)CEN>"`1#QM-?WR$@X.<BIJ9E)N<HJZNFZ2FH:^WNZ)?,QX0+:BW MQ[?&$WX*"0\=0(&:GZ&BH:&9GIBY8HNVB,8G7./!(!@6$Q5Q=G^&@(66B)>2 MB:2@JYN;H:BLKK.QM+F"2B03'WN^R;;&%)@/"0D-0)MEF9FBF9V9BJVJ-1=' MQ(?&)USC@QL;&2$8#4A_CX63A9F/E**?FIJ<F["PLJ:ON;2ON+UZ+C<0<MFV MQA7"10P)"A,T'VFBG9FBF:VC*!!5)#NV@<8!U]2`QAE<XU(<%ALP(@\,/7F` MA86*?X69GY"EFZ>PL("Y"[NQN;O`O+EO&Q$NX+3&"M??QB`)"0H-#B93@*([ MIZ:GFL[`5J>=U]K7OL_/U\;&0>-(&R$.(2`9$A<SA8^%A9F6HI&1FY&;H9NM MN;JONKFON[N^P*0K%@QXL\9+V=+'BPT)"0P,+3),FZ*MK7_+U<RQJ*&OL*^S MK<_1NKQ`XD`7(Q(L'AP8,1DV?8&6F9VFD)&;IIN=JJBKMJ^RNZR[OK^^MYU1 M%BM\T+'&3,W9QKLC"PD,"R`I0KVLL+QYP<7+SV9\?'5@9GREN++$,N(S$Q\8 M-#TE'3<7&$9UFH^8FYB7FZ6EIJNGL+&OLK.UL[_!OL#&EULK39'3L,9-Q-S& MQEH1"0H+$"9'PK#!TY.IQ-/80E9I6"PH1W*3LL\BW2@3&ALR7#LO,AT5%E2) MAX^5HZ"9H*VQIJFYLK*VK+NOO,+`QLG+K&5$0JW`K\8`RX#&-L0P"@D-"A8B M6I?T\<^X]O3QG%^BC6!+)6!QP,P6R"D>&QP95&5<-"`:&1=.@H^DHJN1K:>O MIJN`N1"ZK+N[NL#$R,O3U\IU)Q6<Q+/&2;`-"0H."A4=4N/-S^[VY,Z<F:>J MIV!6N,:[LQ.8'2,X(1XL969H21PH)@TEBX^1FY&GIYZFJ[FTN[6ON+VOP,/` MRLG7R<N(&Q:TM,8W-`L)"1H--T)9R,_G]K90JYJGJJ:F4W[&QM\<4R`C7Q\: M'F5F:')R32(8$"^%G)J0GJ:IIJ:YK[F`NP6]PLF_P\.!RP37P"L1F;/&),0= M"0D,)PTT2+O/R/:T/M6LI["PJ[M>?L;&&2PC(5]8&"%59FB!<@DF&B4-AIZI MG)NC@*\5JKNSN[B]O\C#R,C)R<[+T]>V01%9S*;&`=_0A\8CDPH)"29*%CI0 MS\[DHRW3NZZPL+&YP9*2Q!$9&21?8RXK(&AQ@7(B=$PP&"!5FYV;IJ>GKZZN MNJZXO;[`Q<3(RL_&UM/7T\50)WNEQ@++JX&'Q@^\&@L)$3!3&8I/S^!U*HBJ M@+`/N,')NL>X%AL<(E]E5!\:4H)R)(!T7S(8*E2;HZ2FLKBOMK2XN[^]OL3# MR,K,RM?.U]37O)8X4,6CQ@.^F42YA\8A<A8)"1=?5&@^G,E5,4R)@:>TN\G& MQM&K&!X<(5]E8C,;/H)R)8!_=EPZ-RM;H*6FM[6RN;>[O;Z]P,;$R<K*T=/0 MU];7W<UG(XK1D\8#R<6[O(;&!L.:B9DBB,F&QA/$.0H)"42444A4K6E:0XM= MCK"[SX#&"ID9(QX@8&5E5!TO@7(!=H"`?PQD7",:?96FM:^TN;N\@+T"P<C$ M@,D,U,_3U=G9W-VU1D.NQ)#&"\G#S;>1E+3#O+W!R8#&!K(3%(@@',R'QA*3 M#@D)$G:R-!J5U;Z1V'QIC;'.@,8+>!HI(A]D969F)R9K@'(0?H!_?W>!@DLI M*%R:K;&ON;F`O1.^P,3%R\C)RL_3T-?=W-W?QS0GKY#&"]ZMH6E'146I<7Z> MW8#&!G4)$!X/#J*'QA*[&0H*"0VUSS1ZXK]UIXVM4W'#@,8N:1$6%R%D96=J M5AD_<G)M<H!_?SQ_@H)\4Q]!H+FNN;2]O+W#P<3*S,C/R<_/U]:`W07AX<)+ M0<2-QA/-PHQ(1D5"-3<5.R<B2<3&U0X)#8`.`'*"Q@'<TX'&.ID5"@D)H\_/ M5B1")1XBN;O!9:[&QCT8&Q4@9&5G:G)&*VER2AU\?T<4=X*"CY!=%2F>N\"_ MN[R]O,#(@,D'R\_7T]??X\V!Q@+$1QZ-QE>P:3HU*RLP-2!!8B<7&HG&2`D) M"A`.#FS&QN"\QF]!R<:5QL9>#`D)G\_/5@\;'A$/M:/3QL[&RAD;'QPI96,D M9')?(D=R-!==?QL45H*`79"0A5,7?<"\@+T)O[_"R<G*S\S=U(?&`)F-QF1N M*"(4$R`A)!I?:1@4%R:;$0D*"A`.#E;&QI]4QS4?NKPFF<:E%@L)GL]_IY$4 M)T8/>"YSQL?#50T<(1PP95@7+G)4$C!R&A0B6A44)GDG*9"0CHE>*G&\O;V_ MP+_"R<O*W<?)R(?&`,"-QD^6;FE(-186(!Q22!`0$Q)0#`L*"A0/#C7%QFLJ MK246J*T5:L:Z2Q$)I,^=JK=1.T-9BBY#T\QR*0L8'1DG9$05'60Z$BI*%106 M-A04&DH7'X"0#I:`5F>!O+W&Q,+#RM3(TIO&7\6_N)%T0B4:&S0?"@X0#PD/ M#@L*&!`.%J+'-0]S&A%WE1,VQL:0(3>WS[^MP9%"/:*E6"6\QA\0"Q46%1A= M*A041B`4(AT5%!(6%A,4&10:D)"&@I>0=$^5M\G&Q,?0UZ+&0]QV$@P0#0D* M"0\*#@\-#1D2#@XYQA,-&A,1%6D3%KB]P4.MQ\"TT*F&)4JDHZ0Y2Y(4%@P6 M%1(/1A04$A<3%!,1%100@!,'%!,4%Y"-73>`EP=W+YVVP\+.W*7&3"T,%1,, M"0D-"A`0%1$7$PX0#I<0#Q`0$@T3$Q!6?IE&'215R->T.58BLZ:SCQ<U%A00 M'B(6#Q,3%!(3$A03&1@3$!<3$A03%!.0>Q<D@)<&II]/6<?2RJ7&()8*#A4- M"14+"@D*$QL1%1`)#0PU#@P,#PT0$A(0#!L;&H`;%2;B]H8+"P\>5E8>%Q<0 M"AH?$"$8$A2`$`@4$0X4#@X6"Q"!$PM6&A06P].TC,;&M%.GQB%O"0L0"0X, M"0D*&!,8$1,+%!<6&189&!@;&142%0P-#`P.@!L3-_:X#A(0#A44#A<>#0H4 M&PX@$@Z!#!@+#`H/"AP9#`D1#!$2$Q0<&,2D&5W&QN#1I\95,0D*#@\,"@P) M$!460B46$1(B'Q\@(2@N-1DV$S<5$!</#A`9&QSERA\=$Q4-#`D4'`X/%AH. M#PT)"@D*"@D*"0P>%B@5"PP/$`L?$1D7834;.\:4.K^GQCT_"@D+$0L)"Q80 M(QLP,AL.$B,=*"DD'B8G(CD2)R,2%A0*#!@;),+,)Q\9%0P+"2DW"Q`9'0\/ M"@H)"0L)"X`)%!00'1H+"0P1$QT<&!0I&AH>K#H=KJ?&'5\-"0L1"PL,%R%@ M'"<N&A`2'R$D)2,A)B`F+1H=+X`1-@D+$ALA<<LD'Q\8#1$3+34*#A@<#@X+ M"@D)#`D,"0H)#1,5(A`/#`\3%"(2$Q47&!=?'!RKQLREQEAX%@H+$0L.$A5+ MBQXG*!46$QLD'AXB)B4?(R$F%S83#@\*"PL;&R7*'AP@&P\6'2<E"@L5&@P, M"PH)"0L)"PD+"0L5$C48$`T/$0X=#Q`.%A87&AH;HL:HQ:3&.'8E"@L.#!,@ M%8YC)R4H$!T6&QL?&!X<&1D8'BD3,!H/$PX)"Q<:%,PH(!H9#Q`@&P\)#!,8 M#0T+"X()&@L)"@D3$U,H"PP;%A<2%`L*%Q`4%QH8=K(EN:3&/'4-"0H)$!<; M%F%C)28O%!0>%A(4%103$!D3&!04&!@-$1<*"1(0$]-]6A`0#`T0%PH*$Q4< M#A`,"PD*"0N`"1@*#0H+)BD3'1T3(A<-"@H-#1@9&!@Q&1R#I,8`1H`)-`T- M$1<4-6,_,247%A</"@L+#`L+"@L.%A0,%Q$4'PT+"PP^E=CB8PX0#0L3"0D/ M$A`C)1@5@@D""@D+@0D5'D)(0AXB%`H)#@D)"A0.&Q88&4[<?J'&/;0+"0H* M#Q$3$!0;R5TJ%A`7%PH,#`D*"@P)"Q(9&!$5$`\?#PD,#@P4B<*M4`T,"@P) M"0\3#RP^2#@+#!0-@`J`"0L*(EEC2TL]%!,-"A2`"P4)"10F&!B`(:#&%;(H M"0D,"A(5$!04$"<C#Q8/$@L*#PN""44,#A<:%148$A00$`T/#1`>19J<%@H) M#`D+#Q4,)3Y&.AH;+"D;%Q83#PP/6UEB2$@]%!`0#`X-#!0)"PH/$!T:'!W$ MQL;%G,9@:`P)"0H+#Q0.%!4/#!<1%A$+"0D+"@L)"@L+#!,6&!87&!87$Q$0 M%A(/#14X3W@L"0H)"0P2#!PH/D`A+3XW(AP<&AD=,4U$0$A(*Q80$`X-"PL- M"1`*"@LC(A<9C95)CIS&`$"`"0X*"P\3#Q06$@P9%181"PF`"BD+"0L,"PL4 M&!@7&!<6&142%!<2#PL/%2EV-S(*"0H*$`P;(#4])S=$/"2`&PT<*#]$/3)% M0B84$!`.#8`+#`D/"@D*'A\8&F)I'WN;Q@&Q#H`)&PL*#A`6&!L:#R`9%0P, M"0L,#`D+#`P*#!8=&!J`%QP:%Q88%Q,3#1H-#!(WL1@*"PH-#!L=("LR1$5" M*8`4'Q@[1CXY)SDQ*@X.#PX/#0T+"0H+"@H+#!DC&A<==;:ZF<8!*0J""4D0 M%1<;&AL0%A`-#`H)#`X+#`\-#1`0%AL:&AD8&1D8%A4;$1,6&Q,.#"W.7`H. M"PD*$AH;&BI$145#$@\.$#](/B8<*"X>%Q8,$(`-#PL*"@D+"PH*$RX5%AM) M07"8Q@"T@@E2$A40&1D7'!`3%!8*"1`0$Q(3%QL8&AP;%A89&QP:&1L7%1@5 M&!,7%"8.#!@FH1$6#`X5$1<4$!@M145#+1L7$"U(+!0,%!8/$1P8$0L0#PT- M"PR#"04+#!,=(D.8QB!A"0H*"0D,$Q47&1D3&10-"Q$,#A48&1LF*2HY+R`A M&AN`&AX8&A@;&R,7%!47)A@1%19_%2$."0H*%@T0#AE(2D@\@!T"&"(6@`H; M#`D)$!H9"PX0$`\,%`P*#`D)"@D801\<(\9C?I3&`X<5"0J`"6(.%189&A<0 M%PL+$1$,(2\I*B0B'APK,CDO*B@?'!D;&1@:&B`6%Q(7(AT5$QHI%AT+"0D* M%PL0#A5(2&(X#A,9'!P8$1`0"PD)"QD7$A`.%18/%@H.#@D*"@D-(@\/&D(G M*\F2Q@+))PJ""0`/@!4K%A(.#@H2#1`.8(>EH)Z=H7(F)BDS.#$H'!P9&!@; M&!L8%Q<2+!L5%A8G*1F`"0(*%@V`$"D\14\P#0X0$Q87&QD<&!$1#!@6$Q`3 M%A42&@T.$0L0#`D*#@D9'1P='[62Q@*_"@J!"1`+$1<4$!@6#0L/$PL2$J"T MR8#&'<FJ@58B+#0H+2(H&QD7&QT:&1@8$2\7%A46+3$6"H`))!,0#Q(/(RQ% M,1`.$1(3%!H<(!D2$1`<&A,.%A@7%!D1$!(/$Q"!"0<=+Q49(*2BNY#&%;$+ M"0D+"0D.%QL3"QL:#`P1#PP5+LR$QD_6F4TV)1\M+"\A'10=(!D9&!41*148 M%1<R,A,+"0D*$1,/$Q$/%CDP&!(9$A,/%1P@%A$/$AT>&A`6&QL6&A42%Q$3 M%@H-"@D9,Q$5'7IGDY#&%*D0#`H+"PH,'B00"QH9"PP+"@T7@X?&$M%V)R0J M-"$F(Q4B&Q4=%Q,1%AB`&0(Z*Q&`"30+#A02$A$/$B(B)1DB$A,.%A\A&`\. M$!<@+!</(!\7(1,4&A86'PH4$@D3"0D=$1DA.;[&QXW&$ZD0#`P."PL)'"\7 M"Q@:$PX+#!<<BL9.M%$9'QT?(AXQ&A,:$Q,1&A<9&R)3)@\)"0H/"1`7$!`- M&2(J)1\B%`T3$QP>&!<.%AP=(AL+(A@@+QH9&!`7(`X2(@PI#`QA*1$<((/& MRHW&!+,5%`P2@`H+'S,=$QL9#PL,$QLAB\9-S9<C$QHC.2(;%A<1#142%!86 M+RH4"@D*#0\.#1@7$1,D/3PE'PP5#QL<%A<A,B<A&R4;'1<8'B,=&AT;%B`6 M$1,W#B(/'2@,"0H>.\).C<83RB(D'1\0"@DL+!L='18+"Q80'C:-QA&]4Q,< M'QT8'A`2%1D3%A$=$0Z`"3<*#1`4#@T3%!4>.BL>(!(5$1D=%2`A*B4<"1H5 M%QP7(AX;(1X9&2(:%Q@B#A09#Q8)(1T-&QD7M(S&$\><."0F&1(?("`9'1<, M"PX6&1%)A,8!NM&$QA#%N!H3&AP8%Q</%1<7$106"H$)&PP-#1,0%A84%!LJ M,"$>%1`6'2$8*14:&Q$*#R2`&A@Z*!XW(!H@'AL5'!<1$R,-'0D\)PD.%Q=R MC<82P)@]*1@8%QH=&AD/"PT.%QL3<(+&!,Y\4E*OA,8.H1X-$!(/%1$3%!87 M#1(0@0DX"@L/#A05&147$1HS-"4A&!0?,S8A-!05&10+#",9&!)S:U9)(BPU M'QP:&QH7&1@1'PDI$0D)#Q8TCL81OF`J&1D7&AP4$0T-#@X2'1*G@<8(TYXX M+"==:(C$@<8.?QX3#0\/%!,7%Q@6#0\+@`D\"@H-$0\2%AD5&A(8-#0A(AD: M+#=()#`1$1<5"PH@&Q40=Z.8BG5^;#LU)QX<&QL7$QH+(PD2$@L0,<-OS(S& M"(,U&QH;&QH."X$.`PT?&-"`QAO(WFX>+2H2#$:RR<;&QV`=&0P0$1(7'1L9 M%PX-@0DA"PH.$1`0%AH4&148,3`>(1D?-S!0(RP/$!86"PL?'A(078#&%\?( MHV5<12TD'AH:%18.(@D;&0D+0:P7S8W&!GH;'1H0$!.!#@,+$!U3@<8;U<Z0 MF$8\%@H?.]_&QM(A&`X,$!`7&AH;%1L.#8()(`H,#146%1H3%A@:,1PC)B(B M,1P])"X1&A@7$!$?&0L,#(7&$L6.4RL;'!H5$A0*&PD)"D$B%*.-Q@?2(A`. M&A<2'H`.`PP5&;2`QH#C0+IE)!<9$2D9++C&M!<3"PH*#A8;%Q,8%PL5#0P) M"PD)#PT7&1(:$Q08)"(@)2XJ+CP=&1PF+RT\/"H8&!<1"PN9A\8/RHT_'AL9 M%1$3"0P)"1$42H[&#,DG/U<U/34?"PL.'R"%QCF5+CTB'RLE#!AZ>Q@0"0P) M$Q8H/"L@$Q`8$1$*#`D)#!`8&QD5%Q@;'S$S,38\+1L=&"(J/SU%L.%R@!`# M#`L5Q(C&#]2C/B(=&A$/#0D)"A,^QLZ,Q@S'B%M>-3<D)@L+#AD\A<9!P+2V MC28K*R<4+2D=#@L,"SY+-C1"/1H5%PT3#`T*"@D1$QL:%QH;%AP>*C,\+"XE M)BDW-S%"G,3*OUL0#0P)"BNUA\8/R,*UHC`>&!0/"@D)$#W.3XW&"ZEM1B1# M%!8-#1(29(C&&;N<4RL@&!<;%@X.#`Z<J#LS14,9%10.#A`.@`HB#A$4&QH; M&Q<<&!TS.BLW-BTW/R<V:;_&QL>N2PL+"0D,0M:)Q@W"L((?&A0/#`H*'$4> MT8S&"[-I319*%P\.#QH8FHG&&,238A8=&!8/#@T-4\#%/"M$1!T8%Q$-$0Z` M"A4+#1`;&QD;&AH9'#<_.#1!-T$Q)&6>@L8":0T+@`D!$Y>*Q@S0M<&!4/ M"PD/$1*WC,8+O%UF#D,?#@X/(C;$B\8NIAL=&!(-$`HHH<;&0B)!1"D;'!4, M$@T)"@D)"Q`;'!@<'1D=)SQ"131%/$`R2)Z#Q@)W$`R`"0$*18S&#;EK+!L3 M#0D,#!"8QKK%B<8*S%B,$RLD#@\4*8>,Q@C,4!D+#A$6#8"`Q@MC(SQ$/AH? M'`H6#PJ`"1(+#QD=&1TB'25`/4!%1$4W/&FOA,8"@1$-@0D!(,6,Q@S(;S`: M$0D+#!"&PX;`B<8*U&BQ-2<U#Q`;)>&-Q@;?00D.&!88@<88W#PB/D,>'!X, M&`\*"0H)#!$9'1TC(B,]1(!%!$1%/W[*A<8(K0H)"0P)"1O`CL8*MQL6#PP- M#AZJ#K.*Q@C#O%5((A$0'#2/Q@6Z"1$K',2"QA?,(B)%/R$B&QH*"PD)"Q,4 M&QXK,RPB,3>!10%IOX?&!]()"@D="@D@D,8)E24:$`L/$1L.I(O&![]I2BL; M$QB=D,8#Q"L0?X/&"<IU(T-")BLJ'`R`"@\5'A$>'2(>'B,S,SP\)A77B<8& M4PD)'`X*-)'&"[XL'1,1"PX,8HT_GHC&!\6213X5&%3`D<8"L["]@\8)Q[R5 M/44Z+"$4"8`*`A,G#X`>"1L?'!L4$14-/,B)Q@;%"0H@&0E;D<8+Q;)'(",5 M'@\Q/%S!B<8%E1@7$QVPG<8'P&XX/"\9$PF`"@<-(1-Q9GZ4-(`-`PH+"9:* MQ@;*&`D>'0EZD\8(IV0O*3(F/C^HBL8%M0D)%DK,G<89R*)W6RX;%0H*"0H* M)!ZIHK/"*PD*"PD)#[V+Q@4O"1T4"864Q@>@>EE".%=VQ(K&!=$1##J)R9_& M%KZ-5$4J#0L*"@DE)</&QKX;"0L)"0I!C,8%2@T="@F3E<8%PY-J9("PC,8" M)Q25H\84RK1H$`D,"@H8(<#&QJD;"@P*"0_$C,8%8!@F"0FVJL8!T<2FQA'3 M-PD)"@D1%[W&QITA&1H4$Y2-Q@6%*RH/";;6QA#?'0L)"0X0ML;&H!HG+!D? MO8W&!7X9/`\)A];&$,DD"@H)#0NQQL:A'BHP(A_0C<8%8A0G#`EEUL80D!$* M"0D.#K3&QJ,A,SDT4\F-Q@4K#2(."D'5QA"=1`H*"0H-$[G&QJ0K.2XVHHW& M!K43"A8,"C+3QA+$H%@*"0T+#`DDO\;&I"TW'$79C,8(R8`)"@L)"2C$TL8! MK2R`"008#@T86H#&!*8<(1)WC<8#RQ8*"8`*`1>\TL8(1A,)"0LJ#1!X@<8$ ML3\3(G*-Q@B5"0L)"@D)%;K1Q@AZ#PH)"@T80Z."Q@3$?QIR@XW&"&\)"0H) M"0H1MM'&!RH)"0L8-9_-A,8#K"J]@XW&`U\)"@J`"0$+L=#&"+T7"@D6*;'! MQX3&`]DPQ9&-Q@,_"0H*@`D!#++/Q@?9/1H*"BB=Q8;&`\Q-QL.,Q@*0%@N` M"0,*"A6ZS\8&H1H8"0MEQ8C&`GS&S8S&`D\2"X`)`PH)+<+/Q@5='Q(-#:6) MQ@"LCL8"'AP,@`D"#!]CT,8$2Q82%Q**Q@#,CL8'&2$-#`L,#6K1Q@5E&2<. M'<Z;Q@<C)`P8%"$4I='&!&,E03A3F\8(RC$<%#<G"A2IT<8$CSP</+:;Q@C' M-QD[&34=$[C1Q@.5*8=PG<8'B"%!+#D^*<C1Q@.O8*VEG<8'G2X_-"E`<LG1 MQ@/!H:W0G<8&F38V+S%+N-+&`ZZSL->=Q@6<.R0D@Y73Q@+7N<2>Q@6"B3<] MH]34Q@&SSY[&!9"GK<B0P-3&`,B?Q@77N:VYG\#4Q@#7G\8%R,&_R*?'U,8` MRJ#&!+;6Q]*^^,8$O</&T\+XQ@3'F<;&R?G&`'3\Q@#/I,9T.&UK``!`"/__ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ M____________________________________________________________ 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 �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/Qt/tileedit.h�����������������������������������������������������������������0000664�0000764�0000764�00000005040�10545462320�015002� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* 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 #define QNHTILEEDIT_H #include <qtabwidget.h> #include <qpixmap.h> #include <qimage.h> #include <qvbox.h> class TilePickerTab : public QWidget { Q_OBJECT public: TilePickerTab(const char* basename, int id, QWidget* parent); bool save(); int numTiles(); signals: void pick(const QImage&); void pickName(const QString&); public slots: void setCurrent(const QImage&); protected: void paintEvent( QPaintEvent* ); QSize sizeHint() const; void mousePressEvent(QMouseEvent*); private: QString filename; int id; int last_pick; int num; QPixmap pixmap; QImage image; }; class TilePicker : public QTabWidget { Q_OBJECT public: TilePicker(QWidget* parent); void setTile(int tilenum, const QImage&); signals: void pick(const QImage&); void pickName(const QString&); public slots: void setCurrent(const QImage&); void save(); }; class TrivialTileEditor : public QWidget { Q_OBJECT public: TrivialTileEditor( QWidget* parent ); const QImage& image() const; signals: void edited(const QImage&); void pick(QRgb); public slots: void setColor(QRgb); void setImage( const QImage& ); protected: void paintEvent( QPaintEvent* ); void mousePressEvent(QMouseEvent*); void mouseReleaseEvent(QMouseEvent*); void mouseMoveEvent(QMouseEvent*); QSize sizeHint() const; QSize sizeForWidth(int) const; QSizePolicy sizePolicy() const; private: void fill(QPainter& painter, QPoint p, uchar from); QImage img; QColor pen; int penpixel; void paintPoint(QPainter& painter, QPoint p); QPoint screenPoint(QPoint) const; QPoint imagePoint(QPoint) const; }; class TilePalette : public QWidget { Q_OBJECT public: TilePalette( QWidget* parent ); ~TilePalette(); void setFromImage( const QImage& ); protected: void paintEvent( QPaintEvent* ); void mousePressEvent(QMouseEvent*); QSize sizeHint() const; QSizePolicy sizePolicy() const; signals: void pick(QRgb); public slots: void setColor(QRgb); private: int num; QRgb *rgb; }; class TileEditor : public QVBox { Q_OBJECT public: TileEditor(QWidget* parent); const QImage& image() const; signals: void edited(const QImage&); public slots: void edit(const QImage&); private: TrivialTileEditor editor; TilePalette palette; }; #endif ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/Qt/kse.xpm��������������������������������������������������������������������0000664�0000764�0000764�00000004202�10545462320�014335� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* XPM */ static char *noname[] = { /* width height ncolors chars_per_pixel */ "40 40 20 1", /* colors */ " c #000000", ". c #0000C0", "X c #C0FFFF", "o c #C0FFC0", "O c #DCDCDC", "+ c #C0CCFF", "@ c #800080", "# c #A0A0A0", "$ c None", "% c #000080", "& c #585858", "* c #008080", "= c #FFFFFF", "- c #FFFFC0", "; c #C000C0", ": c #FFC)FF", "> c #FFC0C0", ", c #C3C3C3", "< c #DCFFA8", "1 c #0000FF", /* pixels */ "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$", "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$", "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$", "$$$$$$$$=$$$$$$=,==<,=<,$$$$$$,$$$$$$$$$", "$$$$$$$$==$$$=====,=<>,<><$$$<>$$$$$$$$$", "$$$$$$$$===$====,==>,=<,<,,$,,<$$$$$$$$$", "$$$==$$$==========<=<,><,><<><,$$$,<$$$$", "$$$====$========,==,,=<>,<,>,<,$<><,$$$$", "$$$====$==========<=<,,<<><,<><$,,<>$$$$", "$$$$#&&&==$#$#$#@#$&@#&&@&&&&,, && $$", "$$$;#@&@==;#;#;#$;&#@&@$&@&@$>< &@ $$", "$$$====&==###1##.##@&#&@&&$&&<, <>O< $$", "$$$====&==$;##;##;&#@&@$&@&@&>, O<,> $$", "$$$==&@&==#1#;##.##@&#&@&$@$&,< ,< $$", "$$$$ ==###1#;##.#@$&&&@&&@-, $ $$", "$$$$$ =X;#;###&;#&@#&@$&@$&,< $$ $$$", "$$$$$$ ==#$+@+1##@#&@&$@&&&@<> $$$$$$", "$$$$$$$$=X;#1#$#@##@&#@&&&@$&<, $$$$$$", "$$$$$$$$==##;#;##1$#@&$@$&&@&>< $$$$$$", "$$$$$$$$=X;###1#@##@&#@&&@$&&O, $$$$$$", "$$$$$$$$==#1#;##;#.#@&&$@&@&@<> $$$$$$", "$$$$$$$$$==###;#*;#&@#&@&&$&O< $$$$$$$", "$$$$$$$$$==;#1,$;#&#@$@&$@&@<, $$$$$$$", "$$$$$$$$$$=X####.##@&#&&@&&<O $$$$$$$$", "$$$$$$$$$$==;#;##;*#@&@$&&@O< $$$$$$$", "$$$$$$$$==$==1##.#;&@+&&@&O< <, $$$$$$", "$$$$$$$===#:=#;###&+%&@$&O> ><, $$$$$$", "$$$$$$====@&=O##@#;&@#&&,< <,>< $$$$$", "$$$$$===#$== ==$1#&#&@&O> ,<$#,,> $$$$", "$$$$===#;#== ==$#;&@#O, >,#;&<,< $$$$", "$$$==$#;*@O< ====Oo,> <,&$#@&O, $$$", "$$$==;$#&&<, $===<,< <O@&;#&>< $$", "$$$==##;&O>, $$==,> $$ ,<&&#$@o, $$", "$$$===X=O,< $$$$$$$$$$$$$>OO,Oo> $$$", "$$$$====,< $$$$$$$$$$$$$$,<,>,<, $$$$", "$$$$$===<> $$$$$$$$$$$$$$$$><,<> $$$$", "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$", "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$", "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$", "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$" }; ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/win/Qt/tileedit.cpp���������������������������������������������������������������0000664�0000764�0000764�00000022420�10545462320�015336� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* SCCS Id: @(#)tileedit.cpp 3.4 1999/11/19 */ /* Copyright (c) Warwick Allison, 1999. */ /* NetHack may be freely redistributed. See license for details. */ /* Build this little utility program if you want to use it to edit the tile files. Move tileedit.cpp and tileedit.h to ../../util, add the 3 lines below to the Makefile there and "make tileedit". tileedit: tileedit.cpp $(TEXT_IO) moc -o tileedit.moc tileedit.h $(CC) -o tileedit -I../include -I$(QTDIR)/include -L$(QTDIR)/lib tileedit.cpp $(TEXT_IO) -lqt */ #include "tileedit.h" #include <qapplication.h> #include <qmainwindow.h> #include <qkeycode.h> #include <qpopupmenu.h> #include <qmenubar.h> #include <qpainter.h> #include <qstatusbar.h> #include <qhbox.h> #include <qlabel.h> extern "C" { #include "config.h" #include "tile.h" extern const char *FDECL(tilename, (int, int)); } #define TILES_ACROSS 20 TilePickerTab::TilePickerTab(const char* basename, int i, QWidget* parent) : QWidget(parent) { id = i; filename = basename; filename += ".txt"; num = 0; int index = 0; for (int real=0; real<2; real++) { if ( real ) { image.create( TILES_ACROSS*TILE_X, ((num+TILES_ACROSS-1)/TILES_ACROSS)*TILE_Y, 32 ); } if ( !fopen_text_file(filename.latin1(), RDTMODE) ) { // XXX handle better exit(1); } pixel p[TILE_Y][TILE_X]; while ( read_text_tile(p) ) { if ( real ) { int ox = (index%TILES_ACROSS)*TILE_X; int oy = (index/TILES_ACROSS)*TILE_Y; for ( int y=0; y<TILE_Y; y++ ) { QRgb* rgb = ((QRgb*)image.scanLine(oy+y)) + ox; for ( int x=0; x<TILE_X; x++ ) { *rgb++ = qRgb(p[y][x].r, p[y][x].g, p[y][x].b); } } index++; } else { // Just count... num++; } } fclose_text_file(); } image = image.convertDepth( 8, AvoidDither ); pixmap.convertFromImage( image ); } bool TilePickerTab::save() { if ( !fopen_text_file(filename.latin1(), WRTMODE) ) { // XXX handle better exit(1); } pixel p[TILE_Y][TILE_X]; for ( int index=0; index < num; index++ ) { int ox = (index%TILES_ACROSS)*TILE_X; int oy = (index/TILES_ACROSS)*TILE_Y; for ( int y=0; y<TILE_Y; y++ ) { uchar* c = image.scanLine(oy+y) + ox; for ( int x=0; x<TILE_X; x++ ) { QRgb rgb = image.color(*c++); p[y][x].r = qRed(rgb); p[y][x].g = qGreen(rgb); p[y][x].b = qBlue(rgb); } } write_text_tile(p); } fclose_text_file(); } void TilePickerTab::mousePressEvent(QMouseEvent* e) { int ox = e->x()-e->x()%TILE_X; int oy = e->y()-e->y()%TILE_Y; QImage subimage = image.copy(ox,oy,TILE_X,TILE_Y); if ( e->button() == RightButton ) { setCurrent(subimage); } else { last_pick = ox/TILE_X + oy/TILE_Y*TILES_ACROSS; } emit pick(subimage); emit pickName(tilename(id, last_pick)); } void TilePickerTab::setCurrent(const QImage& i) { int ox = last_pick%TILES_ACROSS * TILE_X; int oy = last_pick/TILES_ACROSS * TILE_Y; bitBlt( &image, ox, oy, &i ); bitBlt( &pixmap, ox, oy, &i ); repaint( ox, oy, TILE_X, TILE_Y, FALSE ); } QSize TilePickerTab::sizeHint() const { return pixmap.size(); } void TilePickerTab::paintEvent( QPaintEvent* ) { QPainter p(this); p.drawPixmap(0,0,pixmap); } static struct { const char* name; TilePickerTab* tab; } tileset[] = { { "monsters", 0 }, { "objects", 0 }, { "other", 0 }, { 0 } }; TilePicker::TilePicker(QWidget* parent) : QTabWidget(parent) { for (int i=0; tileset[i].name; i++) { QString tabname = tileset[i].name; tabname[0] = tabname[0].upper(); tileset[i].tab = new TilePickerTab(tileset[i].name,i+1,this); addTab( tileset[i].tab, tabname ); connect( tileset[i].tab, SIGNAL(pick(const QImage&)), this, SIGNAL(pick(const QImage&)) ); connect( tileset[i].tab, SIGNAL(pickName(const QString&)), this, SIGNAL(pickName(const QString&)) ); } } void TilePicker::setCurrent(const QImage& i) { ((TilePickerTab*)currentPage())->setCurrent(i); } void TilePicker::save() { for (int i=0; tileset[i].tab; i++) { tileset[i].tab->save(); } } TrivialTileEditor::TrivialTileEditor( QWidget* parent ) : QWidget(parent) { } const QImage& TrivialTileEditor::image() const { return img; } void TrivialTileEditor::setColor( QRgb rgb ) { pen = rgb; for (penpixel = 0; penpixel<img.numColors()-1 && (img.color(penpixel)&0xffffff)!=(pen.rgb()&0xffffff); penpixel++) continue; } void TrivialTileEditor::setImage( const QImage& i ) { img = i; setColor(pen.rgb()); // update penpixel repaint(FALSE); } void TrivialTileEditor::paintEvent( QPaintEvent* e ) { QRect r = e->rect(); QPoint tl = imagePoint(r.topLeft()); QPoint br = imagePoint(r.bottomRight()); r = QRect(tl,br).intersect(img.rect()); QPainter painter(this); for (int y=r.top(); y<=r.bottom(); y++) { for (int x=r.left(); x<=r.right(); x++) { paintPoint(painter,QPoint(x,y)); } } } void TrivialTileEditor::paintPoint(QPainter& painter, QPoint p) { QPoint p1 = screenPoint(p); QPoint p2 = screenPoint(p+QPoint(1,1)); QColor c = img.color(img.scanLine(p.y())[p.x()]); painter.fillRect(QRect(p1,p2-QPoint(1,1)), c); } void TrivialTileEditor::mousePressEvent(QMouseEvent* e) { QPoint p = imagePoint(e->pos()); if ( !img.rect().contains(p) ) return; uchar& pixel = img.scanLine(p.y())[p.x()]; if ( e->button() == LeftButton ) { pixel = penpixel; QPainter painter(this); paintPoint(painter,p); } else if ( e->button() == RightButton ) { emit pick( img.color(pixel) ); } else if ( e->button() == MidButton ) { QPainter painter(this); if ( pixel != penpixel ) fill(painter,p,pixel); } } void TrivialTileEditor::fill(QPainter& painter, QPoint p, uchar from) { if ( img.rect().contains(p) ) { uchar& pixel = img.scanLine(p.y())[p.x()]; if ( pixel == from ) { pixel = penpixel; paintPoint(painter,p); fill(painter, p+QPoint(-1,0), from); fill(painter, p+QPoint(+1,0), from); fill(painter, p+QPoint(0,-1), from); fill(painter, p+QPoint(0,+1), from); } } } void TrivialTileEditor::mouseReleaseEvent(QMouseEvent* e) { emit edited(image()); } 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); paintPoint(painter,p); } QPoint TrivialTileEditor::imagePoint(QPoint p) const { return QPoint(p.x()*TILE_X/width(), p.y()*TILE_Y/height()); } QPoint TrivialTileEditor::screenPoint(QPoint p) const { return QPoint(p.x()*width()/TILE_X, p.y()*height()/TILE_Y); } QSizePolicy TrivialTileEditor::sizePolicy() const { return QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding, TRUE ); } QSize TrivialTileEditor::sizeHint() const { return sizeForWidth(-1); } QSize TrivialTileEditor::sizeForWidth(int w) const { if ( w < 0 ) return QSize(TILE_X*32,TILE_Y*32); else return QSize(w,w*TILE_Y/TILE_X); } TilePalette::TilePalette( QWidget* parent ) : QWidget(parent) { num = 0; rgb = 0; } TilePalette::~TilePalette() { delete rgb; } void TilePalette::setFromImage( const QImage& i ) { num = i.numColors(); rgb = new QRgb[num]; memcpy(rgb, i.colorTable(), num*sizeof(QRgb)); repaint(FALSE); } void TilePalette::setColor(QRgb c) { for (int i=0; i<num; i++) if ( c == rgb[i] ) { emit pick(c); return; } } QSizePolicy TilePalette::sizePolicy() const { return QSizePolicy( QSizePolicy::Minimum, QSizePolicy::Minimum, FALSE ); } QSize TilePalette::sizeHint() const { return QSize(num*16,16); } void TilePalette::paintEvent( QPaintEvent* ) { QPainter p(this); for (int i=0; i<num; i++) { int x1 = width()*i/num; int x2 = width()*(i+1)/num; p.fillRect(x1,0,x2-x1,height(),QColor(rgb[i])); } } void TilePalette::mousePressEvent(QMouseEvent* e) { int c = e->x()*num/width(); emit pick(rgb[c]); } TileEditor::TileEditor(QWidget* parent) : QVBox(parent), editor(this), palette(this) { connect( &palette, SIGNAL(pick(QRgb)), &editor, SLOT(setColor(QRgb)) ); connect( &editor, SIGNAL(pick(QRgb)), &palette, SLOT(setColor(QRgb)) ); connect( &editor, SIGNAL(edited(const QImage&)), this, SIGNAL(edited(const QImage&)) ); } void TileEditor::edit(const QImage& i) { editor.setImage(i); palette.setFromImage(i); } const QImage& TileEditor::image() const { return editor.image(); } class Main : public QMainWindow { public: Main() : central(this), editor(¢ral), picker(¢ral) { QPopupMenu* file = new QPopupMenu(menuBar()); file->insertItem("&Save", &picker, SLOT(save()), CTRL+Key_S); file->insertSeparator(); file->insertItem("&Exit", qApp, SLOT(quit()), CTRL+Key_Q); menuBar()->insertItem("&File", file); connect( &picker, SIGNAL(pick(const QImage&)), &editor, SLOT(edit(const QImage&)) ); connect( &picker, SIGNAL(pickName(const QString&)), statusBar(), SLOT(message(const QString&)) ); connect( &editor, SIGNAL(edited(const QImage&)), &picker, SLOT(setCurrent(const QImage&)) ); setCentralWidget(¢ral); } private: QHBox central; TileEditor editor; TilePicker picker; }; main(int argc, char** argv) { QApplication app(argc,argv); Main m; app.setMainWidget(&m); m.show(); return app.exec(); } #include "tileedit.moc" ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/util/�����������������������������������������������������������������������������0000775�0000764�0000764�00000000000�10545462320�012623� 5����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/util/panic.c����������������������������������������������������������������������0000664�0000764�0000764�00000002375�10545462320�014070� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* 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. */ /* * This code was adapted from the code in end.c to run in a standalone * mode for the makedefs / drg code. */ #define NEED_VARARGS #include "config.h" #ifdef AZTEC #define abort() exit() #endif #ifdef VMS extern void NDECL(vms_abort); #endif /*VARARGS1*/ boolean panicking; void VDECL(panic, (char *,...)); void panic VA_DECL(char *,str) VA_START(str); VA_INIT(str, char *); if(panicking++) #ifdef SYSV (void) #endif abort(); /* avoid loops - this should never happen*/ (void) fputs(" ERROR: ", stderr); Vfprintf(stderr, str, VA_ARGS); (void) fflush(stderr); #if defined(UNIX) || defined(VMS) # ifdef SYSV (void) # endif abort(); /* generate core dump */ #endif VA_END(); exit(EXIT_FAILURE); /* redundant */ return; } #ifdef ALLOCA_HACK /* * In case bison-generated foo_yacc.c tries to use alloca(); if we don't * have it then just use malloc() instead. This may not work on some * systems, but they should either use yacc or get a real alloca routine. */ long *alloca(cnt) unsigned cnt; { return cnt ? malloc(cnt) : (long *)0; } #endif /*panic.c*/ �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/util/lev_comp.l�������������������������������������������������������������������0000664�0000764�0000764�00000020627�10545462320�014613� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������%{ /* SCCS Id: @(#)lev_lex.c 3.4 2002/03/27 */ /* Copyright (c) 1989 by Jean-Christophe Collet */ /* NetHack may be freely redistributed. See license for details. */ #define LEV_LEX_C #include "hack.h" #include "lev_comp.h" #include "sp_lev.h" /* Most of these don't exist in flex, yywrap is macro and * yyunput is properly declared in flex.skel. */ #if !defined(FLEX_SCANNER) && !defined(FLEXHACK_SCANNER) int FDECL(yyback, (int *,int)); int NDECL(yylook); int NDECL(yyinput); int NDECL(yywrap); int NDECL(yylex); /* Traditional lexes let yyunput() and yyoutput() default to int; * newer ones may declare them as void since they don't return * values. For even more fun, the lex supplied as part of the * newer unbundled compiler for SunOS 4.x adds the void declarations * (under __STDC__ or _cplusplus ifdefs -- otherwise they remain * int) while the bundled lex and the one with the older unbundled * compiler do not. To detect this, we need help from outside -- * sys/unix/Makefile.utl. * * Digital UNIX is difficult and still has int in spite of all * other signs. */ # if defined(NeXT) || defined(SVR4) || defined(_AIX32) # define VOIDYYPUT # endif # if !defined(VOIDYYPUT) && defined(POSIX_TYPES) # if !defined(BOS) && !defined(HISX) && !defined(_M_UNIX) && !defined(VMS) # define VOIDYYPUT # endif # endif # if !defined(VOIDYYPUT) && defined(WEIRD_LEX) # if defined(SUNOS4) && defined(__STDC__) && (WEIRD_LEX > 1) # define VOIDYYPUT # endif # endif # if defined(VOIDYYPUT) && defined(__osf__) # undef VOIDYYPUT # endif # ifdef VOIDYYPUT void FDECL(yyunput, (int)); void FDECL(yyoutput, (int)); # else int FDECL(yyunput, (int)); int FDECL(yyoutput, (int)); # endif #endif /* !FLEX_SCANNER && !FLEXHACK_SCANNER */ #ifdef FLEX_SCANNER #define YY_MALLOC_DECL \ genericptr_t FDECL(malloc, (size_t)); \ genericptr_t FDECL(realloc, (genericptr_t,size_t)); #endif void FDECL(init_yyin, (FILE *)); void FDECL(init_yyout, (FILE *)); /* * This doesn't always get put in lev_comp.h * (esp. when using older versions of bison). */ extern YYSTYPE yylval; int line_number = 1, colon_line_number = 1; 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(MAC_MPW) && !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 /* MAC_MPW && !FLEX_SCANNER && !FLEXHACK_SCANNER */ %} %e 1500 %p 5000 %n 1000 %s MAPC %% <MAPC>ENDMAP { BEGIN(INITIAL); yylval.map = (char *) alloc(map_cnt + 1); (void) strncpy(yylval.map, map, map_cnt); yylval.map[map_cnt] = 0; map_cnt = 0; return MAP_ID; } <MAPC>[-|}{+ABCISHKPLWTFZ\\#. 0123456789]*\r?\n { int len = yyleng; /* convert \r\n to \n */ if (len >= 2 && yytext[len - 2] == '\r') len -= 1; line_number++; (void) strncpy(map + map_cnt, yytext, len); map_cnt += len; map[map_cnt - 1] = '\n'; map[map_cnt] = '\0'; } ^#.*\n { line_number++; } : { colon_line_number = line_number; return ':'; } MESSAGE return MESSAGE_ID; MAZE return MAZE_ID; NOMAP return NOMAP_ID; LEVEL return LEVEL_ID; INIT_MAP return LEV_INIT_ID; FLAGS return FLAGS_ID; GEOMETRY return GEOMETRY_ID; ^MAP\r?\n { BEGIN(MAPC); line_number++; } OBJECT return OBJECT_ID; OBJFLAGS return OBJFLAGS_ID; CONTAINER return COBJECT_ID; MONSTER return MONSTER_ID; TRAP return TRAP_ID; DOOR return DOOR_ID; DRAWBRIDGE return DRAWBRIDGE_ID; MAZEWALK return MAZEWALK_ID; WALLIFY return WALLIFY_ID; REGION return REGION_ID; RANDOM_OBJECTS return RANDOM_OBJECTS_ID; RANDOM_MONSTERS return RANDOM_MONSTERS_ID; RANDOM_PLACES return RANDOM_PLACES_ID; ALTAR return ALTAR_ID; LADDER return LADDER_ID; STAIR return STAIR_ID; PORTAL return PORTAL_ID; TELEPORT_REGION return TELEPRT_ID; RANDOM_REGION return RANDOMREGION_ID; BRANCH return BRANCH_ID; FOUNTAIN return FOUNTAIN_ID; SINK return SINK_ID; POOL return POOL_ID; NON_DIGGABLE return NON_DIGGABLE_ID; NON_PASSWALL return NON_PASSWALL_ID; ROOM return ROOM_ID; SUBROOM return SUBROOM_ID; RANDOM_CORRIDORS return RAND_CORRIDOR_ID; CORRIDOR return CORRIDOR_ID; GOLD return GOLD_ID; ENGRAVING return ENGRAVING_ID; NAME return NAME_ID; CHANCE return CHANCE_ID; levregion return LEV; open { yylval.i=D_ISOPEN; return DOOR_STATE; } closed { yylval.i=D_CLOSED; return DOOR_STATE; } locked { yylval.i=D_LOCKED; return DOOR_STATE; } nodoor { yylval.i=D_NODOOR; return DOOR_STATE; } broken { yylval.i=D_BROKEN; return DOOR_STATE; } north { yylval.i=W_NORTH; return DIRECTION; } east { yylval.i=W_EAST; return DIRECTION; } south { yylval.i=W_SOUTH; return DIRECTION; } west { yylval.i=W_WEST; return DIRECTION; } random { yylval.i = -1; return RANDOM_TYPE; } none { yylval.i = -2; return NONE; } object return O_REGISTER; monster return M_REGISTER; place return P_REGISTER; align return A_REGISTER; region return R_REGISTER; left { yylval.i=1; return LEFT_OR_RIGHT; } half-left { yylval.i=2; return LEFT_OR_RIGHT; } center { yylval.i=3; return CENTER; } half-right { yylval.i=4; return LEFT_OR_RIGHT; } right { yylval.i=5; return LEFT_OR_RIGHT; } top { yylval.i=1; return TOP_OR_BOT; } bottom { yylval.i=5; return TOP_OR_BOT; } lit { yylval.i=1; return LIGHT_STATE; } unlit { yylval.i=0; return LIGHT_STATE; } filled { yylval.i=0; return FILLING; } unfilled { yylval.i=1; return FILLING; } noalign { yylval.i= AM_NONE; return ALIGNMENT; } law { yylval.i= AM_LAWFUL; return ALIGNMENT; } neutral { yylval.i= AM_NEUTRAL; return ALIGNMENT; } chaos { yylval.i= AM_CHAOTIC; return ALIGNMENT; } coaligned { yylval.i= AM_SPLEV_CO; return ALIGNMENT; } noncoaligned { yylval.i= AM_SPLEV_NONCO; return ALIGNMENT; } peaceful { yylval.i=1; return MON_ATTITUDE; } hostile { yylval.i=0; return MON_ATTITUDE; } asleep { yylval.i=1; return MON_ALERTNESS; } awake { yylval.i=0; return MON_ALERTNESS; } m_feature { yylval.i= M_AP_FURNITURE; return MON_APPEARANCE; } m_monster { yylval.i= M_AP_MONSTER; return MON_APPEARANCE; } m_object { yylval.i= M_AP_OBJECT; return MON_APPEARANCE; } sanctum { yylval.i=2; return ALTAR_TYPE; } shrine { yylval.i=1; return ALTAR_TYPE; } altar { yylval.i=0; return ALTAR_TYPE; } up { yylval.i=1; return UP_OR_DOWN; } down { yylval.i=0; return UP_OR_DOWN; } false { yylval.i=0; return BOOLEAN; } true { yylval.i=1; return BOOLEAN; } dust { yylval.i=DUST; return ENGRAVING_TYPE; } engrave { yylval.i=ENGRAVE; return ENGRAVING_TYPE; } burn { yylval.i=BURN; return ENGRAVING_TYPE; } mark { yylval.i=MARK; return ENGRAVING_TYPE; } scrawl { yylval.i=ENGR_BLOOD; return ENGRAVING_TYPE; } blessed { yylval.i=1; return CURSE_TYPE; } uncursed { yylval.i=2; return CURSE_TYPE; } cursed { yylval.i=3; return CURSE_TYPE; } contained { return CONTAINED; } o_lit { yylval.i=OBJF_LIT; return OBJFLAG_TYPE; } o_buried { yylval.i=OBJF_BURIED; return OBJFLAG_TYPE; } noteleport { yylval.i=NOTELEPORT; return FLAG_TYPE; } hardfloor { yylval.i=HARDFLOOR; return FLAG_TYPE; } nommap { yylval.i=NOMMAP; return FLAG_TYPE; } arboreal { yylval.i=ARBOREAL; return FLAG_TYPE; } /* KMH */ shortsighted { yylval.i=SHORTSIGHTED; return FLAG_TYPE; } spooky { yylval.i=SPOOKY; return FLAG_TYPE; } lethe { yylval.i=LETHE; return FLAG_TYPE; } \[\ *[0-9]+\%\ *\] { yylval.i = atoi(yytext + 1); return PERCENT; } [+\-]?[0-9]+ { yylval.i=atoi(yytext); return INTEGER; } \"[^"]*\" { yytext[yyleng-1] = 0; /* Discard the trailing \" */ yylval.map = (char *) alloc(strlen(yytext+1)+1); Strcpy(yylval.map, yytext+1); /* Discard the first \" */ return STRING; } \r?\n { line_number++; } [ \t]+ ; '\\.' { yylval.i = yytext[2]; return CHAR; } '.' { yylval.i = yytext[1]; return CHAR; } . { return yytext[0]; } %% #ifdef AMIGA long *alloc(n) unsigned n; { return ((long *)malloc (n)); } #endif /* routine to switch to another input file; needed for flex */ void init_yyin( input_f ) FILE *input_f; { #if defined(FLEX_SCANNER) || defined(FLEXHACK_SCANNER) if (yyin) yyrestart(input_f); else #endif yyin = input_f; } /* analogous routine (for completeness) */ void init_yyout( output_f ) FILE *output_f; { yyout = output_f; } /*lev_comp.l*/ ���������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/util/makedefs.c�������������������������������������������������������������������0000664�0000764�0000764�00000163633�10545462320�014562� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* SCCS Id: @(#)makedefs.c 3.4 2002/08/14 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* Copyright (c) M. Stephenson, 1990, 1991. */ /* Copyright (c) Dean Luick, 1990. */ /* NetHack may be freely redistributed. See license for details. */ #define MAKEDEFS_C /* use to conditionally include file sections */ /* #define DEBUG */ /* uncomment for debugging info */ #include "config.h" #include "permonst.h" #include "objclass.h" #include "monsym.h" #include "artilist.h" #include "mondata.h" #include "dungeon.h" #include "obj.h" #include "monst.h" #include "you.h" #include "flag.h" #include "dlb.h" /* version information */ #ifdef SHORT_FILENAMES #include "patchlev.h" #else #include "patchlevel.h" #endif #ifdef MAC # ifdef MAC_MPW # define MPWTOOL # include <CursorCtl.h> # include <string.h> # include <ctype.h> # else /* MAC without MPWTOOL */ # define MACsansMPWTOOL # endif /* MAC_MPW */ #endif /* MAC */ #ifndef MPWTOOL # define SpinCursor(x) #endif #define Fprintf (void) fprintf #define Fclose (void) fclose #define Unlink (void) unlink #if !defined(AMIGA) || defined(AZTEC_C) #define rewind(fp) fseek((fp),0L,SEEK_SET) /* guarantee a return value */ #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 NH_OPTIONS_FILE #define OPTIONS_FILE "options" #else #define OPTIONS_FILE NH_OPTIONS_FILE #endif #define ORACLE_FILE "oracles" #define DATA_FILE "data" #define RUMOR_FILE "rumors" #define DGN_I_FILE "dungeon.def" #define DGN_O_FILE "dungeon.pdf" #define MON_STR_C "monstr.c" #define QTXT_I_FILE "quest.txt" #define QTXT_O_FILE "quest.dat" #define VIS_TAB_H "vis_tab.h" #define VIS_TAB_C "vis_tab.c" /*WAC filename*/ /*input*/ #define FILE_H "file.h" /*output*/ #define FILENAME_H "filename.h" /* locations for those files */ #ifdef AMIGA # define FILE_PREFIX # define INCLUDE_TEMPLATE "NH:include/t.%s" # define SOURCE_TEMPLATE "NH:src/%s" # 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 # if defined(MAC) && !defined(__MACH__) /* MacOS 9 or earlier */ # 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 = "/* This source file is generated by 'makedefs'. Do not edit. */\n", *Dont_Edit_Data = "#\tThis data file is generated by 'makedefs'. Do not edit. \n"; static struct version_info version; #ifdef MAC_MPW static const char *data_template() { static char *result; if (result) return result; result = malloc(strlen(getenv("ObjDir"))+3); strcpy(result, getenv("ObjDir")); strcat(result, "%s"); return result; } #endif /* definitions used for vision tables */ #define TEST_WIDTH COLNO #define TEST_HEIGHT ROWNO #define BLOCK_WIDTH (TEST_WIDTH + 10) #define BLOCK_HEIGHT TEST_HEIGHT /* don't need extra spaces */ #define MAX_ROW (BLOCK_HEIGHT + TEST_HEIGHT) #define MAX_COL (BLOCK_WIDTH + TEST_WIDTH) /* Use this as an out-of-bound value in the close table. */ #define CLOSE_OFF_TABLE_STRING "99" /* for the close table */ #define FAR_OFF_TABLE_STRING "0xff" /* for the far table */ #define sign(z) ((z) < 0 ? -1 : ((z) ? 1 : 0)) #ifdef VISION_TABLES static char xclear[MAX_ROW][MAX_COL]; #endif /*-end of vision defs-*/ static char in_line[256], filename[600]; #ifdef FILE_PREFIX /* if defined, a first argument not starting with - is * taken as a text string to be prepended to any * output filename generated */ char *file_prefix=""; #endif #ifdef MACsansMPWTOOL int FDECL(main, (void)); #else int FDECL(main, (int,char **)); #endif void FDECL(do_makedefs, (char *)); void NDECL(do_objs); void NDECL(do_data); void NDECL(do_dungeon); void NDECL(do_date); void NDECL(do_options); void NDECL(do_monstr); void NDECL(do_permonst); void NDECL(do_questtxt); void NDECL(do_rumors); void NDECL(do_oracles); void NDECL(do_vision); /*WAC filenames*/ void NDECL(do_filenames); extern void NDECL(monst_init); /* monst.c */ extern void NDECL(objects_init); /* objects.c */ static void NDECL(make_version); static char *FDECL(version_string, (char *)); static char *FDECL(version_id_string, (char *,const char *)); static char *FDECL(xcrypt, (const char *)); static int FDECL(check_control, (char *)); static char *FDECL(without_control, (char *)); static boolean FDECL(d_filter, (char *)); static boolean FDECL(h_filter, (char *)); static boolean FDECL(ranged_attk,(struct permonst*)); static int FDECL(mstrength,(struct permonst *)); static void NDECL(build_savebones_compat_string); static boolean FDECL(qt_comment, (char *)); static boolean FDECL(qt_control, (char *)); static int FDECL(get_hdr, (char *)); static boolean FDECL(new_id, (char *)); static boolean FDECL(known_msg, (int,int)); static void FDECL(new_msg, (char *,int,int)); static void FDECL(do_qt_control, (char *)); static void FDECL(do_qt_text, (char *)); static void NDECL(adjust_qt_hdrs); static void NDECL(put_qt_hdrs); #ifdef VISION_TABLES static void NDECL(H_close_gen); static void NDECL(H_far_gen); static void NDECL(C_close_gen); static void NDECL(C_far_gen); static int FDECL(clear_path, (int,int,int,int)); #endif static char *FDECL(tmpdup, (const char *)); static char *FDECL(limit, (char *,int)); static char *FDECL(eos, (char *)); /*Stolen from hacklib.c*/ static char *FDECL(lcase, (char *)); static char *FDECL(ucase, (char *)); /* input, output, tmp */ static FILE *ifp, *ofp, *tfp; #if defined(__BORLANDC__) && !defined(_WIN32) extern unsigned _stklen = STKSIZ; #endif #ifdef MACsansMPWTOOL int main(void) { const char *def_options = "odefmvpqrhz"; char buf[100]; int len; printf("Enter options to run: [%s] ", def_options); fflush(stdout); fgets(buf, 100, stdin); len = strlen(buf); if (len <= 1) Strcpy(buf, def_options); else buf[len-1] = 0; /* remove return */ do_makedefs(buf); exit(EXIT_SUCCESS); return 0; } #else /* ! MAC */ int main(argc, argv) int argc; char *argv[]; { if ( (argc != 2) #ifdef FILE_PREFIX && (argc != 3) #endif ) { Fprintf(stderr, "Bad arg count (%d).\n", argc-1); (void) fflush(stderr); return 1; } #ifdef FILE_PREFIX if(argc >=2 && argv[1][0]!='-'){ file_prefix=argv[1]; argc--;argv++; } #endif do_makedefs(&argv[1][1]); exit(EXIT_SUCCESS); /*NOTREACHED*/ return 0; } #endif void do_makedefs(options) char *options; { boolean more_than_one; /* Note: these initializers don't do anything except guarantee that we're linked properly. */ monst_init(); objects_init(); /* construct the current version number */ make_version(); more_than_one = strlen(options) > 1; while (*options) { if (more_than_one) Fprintf(stderr, "makedefs -%c\n", *options); switch (*options) { case 'o': case 'O': do_objs(); break; case 'd': case 'D': do_data(); break; case 'e': case 'E': do_dungeon(); break; /*WAC do filenames*/ case 'f': case 'F': do_filenames(); break; case 'm': case 'M': do_monstr(); break; case 'v': case 'V': do_date(); do_options(); break; case 'p': case 'P': do_permonst(); break; case 'q': case 'Q': do_questtxt(); break; case 'r': case 'R': do_rumors(); break; case 'h': case 'H': do_oracles(); break; case 'z': case 'Z': do_vision(); break; default: Fprintf(stderr, "Unknown option '%c'.\n", *options); (void) fflush(stderr); exit(EXIT_FAILURE); } options++; } if (more_than_one) Fprintf(stderr, "Completed.\n"); /* feedback */ } /* trivial text encryption routine which can't be broken with `tr' */ static char *xcrypt(str) const char *str; { /* duplicated in src/hacklib.c */ static char buf[BUFSZ]; register const char *p; register char *q; register int bitmask; for (bitmask = 1, p = str, q = buf; *p; q++) { *q = *p++; if (*q & (32|64)) *q ^= bitmask; if ((bitmask <<= 1) >= 32) bitmask = 1; } *q = '\0'; return buf; } void do_rumors() { char *infile; long true_rumor_size; infile = malloc(strlen(DATA_IN_TEMPLATE) - 2 + strlen(RUMOR_FILE) + 5); filename[0]='\0'; #ifdef FILE_PREFIX Strcat(filename,file_prefix); #endif Sprintf(eos(filename), DATA_TEMPLATE, RUMOR_FILE); if (!(ofp = fopen(filename, WRTMODE))) { perror(filename); exit(EXIT_FAILURE); } Fprintf(ofp,Dont_Edit_Data); Sprintf(infile, DATA_IN_TEMPLATE, RUMOR_FILE); Strcat(infile, ".tru"); if (!(ifp = fopen(infile, RDTMODE))) { perror(infile); Fclose(ofp); Unlink(filename); /* kill empty output file */ exit(EXIT_FAILURE); } /* get size of true rumors file */ #ifndef VMS (void) fseek(ifp, 0L, SEEK_END); true_rumor_size = ftell(ifp); #else /* seek+tell is only valid for stream format files; since rumors.%%% might be in record format, count the actual data bytes instead. */ true_rumor_size = 0; while (fgets(in_line, sizeof in_line, ifp) != 0) true_rumor_size += strlen(in_line); /* includes newline */ #endif /* VMS */ Fprintf(ofp,"%06lx\n", true_rumor_size); (void) fseek(ifp, 0L, SEEK_SET); /* copy true rumors */ while (fgets(in_line, sizeof in_line, ifp) != 0) (void) fputs(xcrypt(in_line), ofp); Fclose(ifp); Sprintf(infile, DATA_IN_TEMPLATE, RUMOR_FILE); Strcat(infile, ".fal"); if (!(ifp = fopen(infile, RDTMODE))) { perror(infile); Fclose(ofp); Unlink(filename); /* kill incomplete output file */ exit(EXIT_FAILURE); } /* copy false rumors */ while (fgets(in_line, sizeof in_line, ifp) != 0) (void) fputs(xcrypt(in_line), ofp); Fclose(ifp); Fclose(ofp); free(infile); return; } /* * 3.4.1: way back in 3.2.1 `flags.nap' became unconditional but * TIMED_DELAY was erroneously left in VERSION_FEATURES and has * been there up through 3.4.0. Simply removing it now would * break save file compatibility with 3.4.0 files, so we will * explicitly mask it out during version checks. * This should go away in the next version update. */ #define IGNORED_FEATURES ( 0L \ | (1L << 23) /* TIMED_DELAY */ \ ) static void make_version() { register int i; /* * integer version number */ version.incarnation = ((unsigned long)VERSION_MAJOR << 24) | ((unsigned long)VERSION_MINOR << 16) | ((unsigned long)PATCHLEVEL << 8) | ((unsigned long)EDITLEVEL); /* * encoded feature list * Note: if any of these magic numbers are changed or reassigned, * EDITLEVEL in patchlevel.h should be incremented at the same time. * The actual values have no special meaning, and the category * groupings are just for convenience. */ version.feature_set = (unsigned long)(0L /* levels and/or topology (0..3) */ #ifdef REINCARNATION | (1L << 1) #endif #ifdef SINKS | (1L << 2) #endif #ifdef BLACKMARKET | (1L << 3) #endif /* monsters (4..7) */ #ifdef KOPS | (1L << 6) #endif #ifdef MAIL | (1L << 7) #endif /* objects (8..15) */ #ifdef P_SPOON | (1L << 9) #endif #ifdef TOURIST | (1L << 10) #endif #ifdef STEED | (1L << 11) #endif #ifdef GOLDOBJ | (1L << 12) #endif #ifdef FIREARMS | (1L << 13) #endif #ifdef LIGHTSABERS | (1L << 14) # ifdef D_SABER | (1L << 15) # endif #endif /* flag bits and/or other global variables (16..26) */ #ifdef DISPLAY_LAYERS | (1L << 16) #endif #ifdef TEXTCOLOR | (1L << 17) #endif #ifdef INSURANCE | (1L << 18) #endif #ifdef ELBERETH | (1L << 19) #endif #ifdef EXP_ON_BOTL | (1L << 20) #endif #ifdef SCORE_ON_BOTL | (1L << 21) #endif /* data format [COMPRESS excluded] (27..31) */ #ifdef ZEROCOMP | (1L << 27) #endif #ifdef RLECOMP | (1L << 28) #endif ); /* * Value used for object & monster sanity check. * (NROFARTIFACTS<<24) | (NUM_OBJECTS<<12) | (NUMMONS<<0) */ for (i = 1; artifact_names[i]; i++) continue; version.entity_count = (unsigned long) (i - 1); for (i = 1; objects[i].oc_class != ILLOBJ_CLASS; i++) continue; version.entity_count = (version.entity_count << 12) | (unsigned long) i; for (i = 0; mons[i].mlet; i++) continue; version.entity_count = (version.entity_count << 12) | (unsigned long) i; /* * Value used for compiler (word size/field alignment/padding) check. */ version.struct_sizes = (((unsigned long)sizeof (struct flag) << 24) | ((unsigned long)sizeof (struct obj) << 17) | ((unsigned long)sizeof (struct monst) << 10) | ((unsigned long)sizeof (struct you))); return; } static char * version_string(outbuf) char *outbuf; { Sprintf(outbuf, "%d.%d.%d", VERSION_MAJOR, VERSION_MINOR, PATCHLEVEL); #ifdef EDITLEVEL Sprintf(eos(outbuf), "E%d", EDITLEVEL); #ifdef FIXLEVEL Sprintf(eos(outbuf), "F%d", FIXLEVEL); #endif #endif return outbuf; } /* WAC use DEF_GAME_NAME */ static char * version_id_string(outbuf, build_date) char *outbuf; const char *build_date; { char subbuf[64], versbuf[64]; subbuf[0] = '\0'; #ifdef PORT_SUB_ID subbuf[0] = ' '; Strcpy(&subbuf[1], PORT_SUB_ID); #endif #if defined(ALPHA) Strcat(subbuf, " Alpha"); #elif defined(BETA) Strcat(subbuf, " Beta"); #endif Sprintf(outbuf, "%s %s%s Version %s - last build %s.", PORT_ID, DEF_GAME_NAME, subbuf, version_string(versbuf), build_date); return outbuf; } void do_date() { long clocktim = 0; char *c, *cbuf, buf[BUFSZ]; const char *ul_sfx; cbuf = malloc(600); filename[0]='\0'; #ifdef FILE_PREFIX Strcat(filename,file_prefix); #endif Sprintf(eos(filename), INCLUDE_TEMPLATE, DATE_FILE); if (!(ofp = fopen(filename, WRTMODE))) { 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 (void) time(&clocktim); Strcpy(cbuf, ctime(&clocktim)); #else (void) time((time_t *)&clocktim); Strcpy(cbuf, ctime((time_t *)&clocktim)); #endif for (c = cbuf; *c; c++) if (*c == '\n') break; *c = '\0'; /* strip off the '\n' */ #ifdef NHSTDC ul_sfx = "UL"; #else ul_sfx = "L"; #endif Fprintf(ofp,"#define BUILD_DATE \"%s\"\n", cbuf); Fprintf(ofp,"#define BUILD_TIME (%ldL)\n", clocktim); Fprintf(ofp,"\n"); Fprintf(ofp,"#define VERSION_NUMBER 0x%08lx%s\n", version.incarnation, ul_sfx); Fprintf(ofp,"#define VERSION_FEATURES 0x%08lx%s\n", version.feature_set, ul_sfx); #ifdef IGNORED_FEATURES Fprintf(ofp,"#define IGNORED_FEATURES 0x%08lx%s\n", (unsigned long) IGNORED_FEATURES, ul_sfx); #endif Fprintf(ofp,"#define VERSION_SANITY1 0x%08lx%s\n", version.entity_count, ul_sfx); Fprintf(ofp,"#define VERSION_SANITY2 0x%08lx%s\n", version.struct_sizes, ul_sfx); Fprintf(ofp,"\n"); Fprintf(ofp,"#define VERSION_STRING \"%s\"\n", version_string(buf)); Fprintf(ofp,"#define VERSION_ID \\\n \"%s\"\n", version_id_string(buf, cbuf)); #ifdef AMIGA { struct tm *tm = localtime((time_t *) &clocktim); 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); free(cbuf); return; } static char save_bones_compat_buf[BUFSZ]; static void build_savebones_compat_string() { #ifdef VERSION_COMPATIBILITY unsigned long uver = VERSION_COMPATIBILITY; #endif char editsuffix[20], ueditsuffix[20]; /* Add edit level suffices if either EDITLEVEL is defined, or * the first level we are compatible with was not edit level 0. */ #ifdef EDITLEVEL sprintf(editsuffix, "E%d", EDITLEVEL); sprintf(ueditsuffix, "E%lu", uver & 0x000000FFL); #else if (uver & 0x000000FFL) { strcpy(editsuffix, "E0"); sprintf(ueditsuffix, "E%lu", uver & 0x000000FFL); } else { editsuffix[0] = 0; ueditsuffix[0] = 0; } #endif Strcpy(save_bones_compat_buf, "save and bones files accepted from version"); #ifdef VERSION_COMPATIBILITY Sprintf(eos(save_bones_compat_buf), "s %lu.%lu.%lu%s through %d.%d.%d%s", ((uver & 0xFF000000L) >> 24), ((uver & 0x00FF0000L) >> 16), ((uver & 0x0000FF00L) >> 8), ueditsuffix, VERSION_MAJOR, VERSION_MINOR, PATCHLEVEL, editsuffix); #else Sprintf(eos(save_bones_compat_buf), " %d.%d.%d%s only", VERSION_MAJOR, VERSION_MINOR, PATCHLEVEL, editsuffix); #endif } static const char *build_opts[] = { #ifdef AMIGA_WBENCH "Amiga WorkBench support", #endif #ifdef ANSI_DEFAULT "ANSI default terminal", #endif #ifdef BLACKMARKET "blackmarket level", #endif /*WAC added for borg, invisible objects, keep_save,noartifactwish */ #ifdef BORG "borg", #endif #ifdef AUTOPICKUP_EXCEPTIONS "autopickup_exceptions", #endif #ifdef TEXTCOLOR "color", #endif #ifdef COM_COMPL "command line completion", #endif #ifdef COMPRESS "data file compression", #endif #ifdef DLB "data librarian", #endif #ifdef WIZARD "debug mode", #endif #ifdef ELBERETH "Elbereth", #endif #ifdef EXP_ON_BOTL "experience points on status line", #endif #ifdef MFLOPPY "floppy drive support", #endif #ifdef GOLDOBJ "gold object in inventories", #endif #ifdef INSURANCE "insurance files for recovering from crashes", #endif /*WAC invisible objects, keep_save, light sourced spells*/ #ifdef LIGHT_SRC_SPELL "light sourced spell effects", #endif #ifdef INVISIBLE_OBJECTS "invisible objects", #endif #ifdef KEEP_SAVE "keep savefiles", #endif #ifdef KOPS "Keystone Kops", #endif #ifdef HOLD_LOCKFILE_OPEN "exclusive lock on level 0 file", #endif #ifdef LOGFILE "log file", #endif #ifdef MAIL "mail daemon", #endif #ifdef GNUDOS "MSDOS protected mode", #endif #ifdef NEWS "news file", #endif /* WAC added noartifactwish version info*/ #ifdef NOARTIFACTWISH "no wishing for special artifacts", #endif #ifdef OVERLAY # ifdef MOVERLAY "MOVE overlays", # else # ifdef VROOMM "VROOMM overlays", # else "overlays", # endif # endif #endif #ifdef REDO "redo command", #endif #ifdef REINCARNATION "rogue level", #endif #ifdef STEED "saddles and riding", #endif #ifdef SCORE_ON_BOTL "score on status line", #endif #ifdef DISPLAY_LAYERS "display layers", #endif #ifdef CLIPPING "screen clipping", #endif #ifdef NO_TERMS # 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 # ifdef ALLEG_FX "screen control via Allegro library", # endif # ifndef MSWIN_GRAPHICS # ifdef WIN32CON "screen control via WIN32 console I/O", # endif # endif #endif #ifdef SEDUCE "seduction", #endif #ifdef SHELL "shell command", #endif #ifdef SHOW_DMG "show damage amounts", #endif #ifdef SHOW_WEIGHT "show weight of inventory", #endif #ifdef SINKS "sinks", #endif #ifdef SUSPEND "suspend command", #endif #ifdef TERMINFO "terminal info library", #else # if defined(TERMLIB) || ((!defined(MICRO) && !defined(WIN32)) && defined(TTY_GRAPHICS)) "terminal capability library", # endif #endif #ifdef TIMED_DELAY "timed wait for display effects", #endif #ifdef LIGHTSABERS # ifdef D_SABER "lightsabers and dim lightsabers", # else "lightsabers", # endif #endif #ifdef P_SPOON "Houchou", #endif #ifdef FIREARMS "firearms", #endif #ifdef TOURIST "tourists", #endif #ifdef USER_SOUNDS # ifdef USER_SOUNDS_REGEX "user sounds via regular expressions", # else "user sounds via pmatch", # endif #endif #ifdef PREFIXES_IN_USE "variable playground", #endif #ifdef VISION_TABLES "vision tables", #endif #ifdef WALLIFIED_MAZE "walled mazes", #endif #ifdef YEOMAN "yeomen", #endif #ifdef ZEROCOMP "zero-compressed save files", #endif save_bones_compat_buf, "basic NetHack features" }; static const char *window_opts[] = { #ifdef TTY_GRAPHICS "traditional tty-based graphics", #endif #ifdef X11_GRAPHICS "X11", #endif #ifdef QT_GRAPHICS "Qt", #endif #ifdef GTK_GRAPHICS #ifdef GTK_PROXY "proxified GTK", #else "GTK", #endif #endif #ifdef GNOME_GRAPHICS "Gnome", #endif #ifdef GL_GRAPHICS "GL", #endif #ifdef SDL_GRAPHICS "SDL", #endif #ifdef MAC "Mac", #endif #ifdef AMIGA_INTUITION "Amiga Intuition", #endif #ifdef GEM_GRAPHICS "Gem", #endif #ifdef MSWIN_GRAPHICS "mswin", #endif #ifdef BEOS_GRAPHICS "BeOS InterfaceKit", #endif #ifdef PROXY_GRAPHICS "Plug-in modules", #endif 0 }; void do_options() { register int i, length; register const char *str, *indent = " "; filename[0]='\0'; #ifdef FILE_PREFIX Strcat(filename,file_prefix); #endif Sprintf(eos(filename), DATA_TEMPLATE, OPTIONS_FILE); if (!(ofp = fopen(filename, WRTMODE))) { perror(filename); exit(EXIT_FAILURE); } build_savebones_compat_string(); Fprintf(ofp,"\n %s version %d.%d.%d", DEF_GAME_NAME, VERSION_MAJOR, VERSION_MINOR, PATCHLEVEL); #ifdef EDITLEVEL Fprintf(ofp, "E%d", EDITLEVEL); #ifdef FIXLEVEL Fprintf(ofp, "F%d", FIXLEVEL); #endif #endif #if defined(ALPHA) Fprintf(ofp, " [alpha]\n"); #elif defined(BETA) Fprintf(ofp, " [beta]\n"); #else Fprintf(ofp, "\n"); #endif Fprintf(ofp,"\nOptions compiled into this edition:\n"); length = COLNO + 1; /* force 1st item onto new line */ for (i = 0; i < SIZE(build_opts); i++) { str = build_opts[i]; if (length + strlen(str) > COLNO - 5) Fprintf(ofp,"\n%s", indent), length = strlen(indent); else Fprintf(ofp," "), length++; Fprintf(ofp,"%s", str), length += strlen(str); Fprintf(ofp,(i < SIZE(build_opts) - 1) ? "," : "."), length++; } Fprintf(ofp,"\n\nSupported windowing systems:\n"); length = COLNO + 1; /* force 1st item onto new line */ for (i = 0; i < SIZE(window_opts) - 1; i++) { str = window_opts[i]; if (length + strlen(str) > COLNO - 5) Fprintf(ofp,"\n%s", indent), length = strlen(indent); else Fprintf(ofp," "), length++; Fprintf(ofp,"%s", str), length += strlen(str); Fprintf(ofp, ","), length++; } Fprintf(ofp, "\n%swith a default of %s.", indent, DEFAULT_WINDOW_SYS); Fprintf(ofp,"\n\n"); Fclose(ofp); return; } /* routine to decide whether to discard something from data.base */ static boolean d_filter(line) char *line; { if (*line == '#') return TRUE; /* ignore comment lines */ return FALSE; } /* * New format (v3.1) of 'data' file which allows much faster lookups [pr] "do not edit" first record is a comment line 01234567 hexadecimal formatted offset to text area name-a first name of interest 123,4 offset to name's text, and number of lines for it name-b next name of interest name-c multiple names which share same description also 456,7 share a single offset,count line . sentinel to mark end of names 789,0 dummy record containing offset, count of EOF text-a 4 lines of descriptive text for name-a text-a at file position 0x01234567L + 123L text-a text-a text-b/text-c 7 lines of text for names-b and -c text-b/text-c at fseek(0x01234567L + 456L) ... * */ void do_data() { char *infile, *tempfile; boolean ok; long txt_offset; int entry_cnt, line_cnt; infile = malloc(strlen(DATA_IN_TEMPLATE) - 2 + strlen(DATA_FILE) + 6); tempfile = malloc(strlen(DATA_TEMPLATE) - 2 + strlen("database.tmp") + 1); Sprintf(tempfile, DATA_TEMPLATE, "database.tmp"); filename[0]='\0'; #ifdef FILE_PREFIX Strcat(filename,file_prefix); #endif Sprintf(eos(filename), DATA_TEMPLATE, DATA_FILE); Sprintf(infile, DATA_IN_TEMPLATE, DATA_FILE); Strcat(infile, #ifdef SHORT_FILENAMES ".bas" #else ".base" #endif ); if (!(ifp = fopen(infile, RDTMODE))) { /* data.base */ perror(infile); exit(EXIT_FAILURE); } if (!(ofp = fopen(filename, WRTMODE))) { /* data */ perror(filename); Fclose(ifp); exit(EXIT_FAILURE); } free(infile); if (!(tfp = fopen(tempfile, WRTMODE))) { /* database.tmp */ perror(tempfile); Fclose(ifp); Fclose(ofp); Unlink(filename); exit(EXIT_FAILURE); } /* output a dummy header record; we'll rewind and overwrite it later */ Fprintf(ofp, "%s%08lx\n", Dont_Edit_Data, 0L); entry_cnt = line_cnt = 0; /* read through the input file and split it into two sections */ while (fgets(in_line, sizeof in_line, ifp)) { if (d_filter(in_line)) continue; if (*in_line > ' ') { /* got an entry name */ /* first finish previous entry */ if (line_cnt) Fprintf(ofp, "%d\n", line_cnt), line_cnt = 0; /* output the entry name */ (void) fputs(in_line, ofp); entry_cnt++; /* update number of entries */ } else if (entry_cnt) { /* got some descriptive text */ /* update previous entry with current text offset */ if (!line_cnt) Fprintf(ofp, "%ld,", ftell(tfp)); /* save the text line in the scratch file */ (void) fputs(in_line, tfp); line_cnt++; /* update line counter */ } } /* output an end marker and then record the current position */ if (line_cnt) Fprintf(ofp, "%d\n", line_cnt); Fprintf(ofp, ".\n%ld,%d\n", ftell(tfp), 0); txt_offset = ftell(ofp); Fclose(ifp); /* all done with original input file */ /* reprocess the scratch file; 1st format an error msg, just in case */ Sprintf(in_line, "rewind of \"%s\"", tempfile); if (rewind(tfp) != 0) goto dead_data; /* copy all lines of text from the scratch file into the output file */ while (fgets(in_line, sizeof in_line, tfp)) (void) fputs(in_line, ofp); /* finished with scratch file */ Fclose(tfp); Unlink(tempfile); /* remove it */ free(tempfile); /* update the first record of the output file; prepare error msg 1st */ Sprintf(in_line, "rewind of \"%s\"", filename); ok = (rewind(ofp) == 0); if (ok) { Sprintf(in_line, "header rewrite of \"%s\"", filename); ok = (fprintf(ofp, "%s%08lx\n", Dont_Edit_Data, txt_offset) >= 0); } if (!ok) { dead_data: perror(in_line); /* report the problem */ /* close and kill the aborted output file, then give up */ Fclose(ofp); Unlink(filename); exit(EXIT_FAILURE); } /* all done */ Fclose(ofp); return; } /* routine to decide whether to discard something from oracles.txt */ static boolean h_filter(line) char *line; { static boolean skip = FALSE; char tag[sizeof in_line]; SpinCursor(3); if (*line == '#') return TRUE; /* ignore comment lines */ if (sscanf(line, "----- %s", tag) == 1) { skip = FALSE; #ifndef SINKS if (!strcmp(tag, "SINKS")) skip = TRUE; #endif #ifndef ELBERETH if (!strcmp(tag, "ELBERETH")) skip = TRUE; #endif } else if (skip && !strncmp(line, "-----", 5)) skip = FALSE; return skip; } static const char *special_oracle[] = { "\"...it is rather disconcerting to be confronted with the", "following theorem from [Baker, Gill, and Solovay, 1975].", "", "Theorem 7.18 There exist recursive languages A and B such that", " (1) P(A) == NP(A), and", " (2) P(B) != NP(B)", "", "This provides impressive evidence that the techniques that are", "currently available will not suffice for proving that P != NP or ", "that P == NP.\" [Garey and Johnson, p. 185.]" }; /* The oracle file consists of a "do not edit" comment, a decimal count N and set of N+1 hexadecimal fseek offsets, followed by N multiple-line records, separated by "---" lines. The first oracle is a special case. The input data contains just those multi-line records, separated by "-----" lines. */ void do_oracles() { char *infile, *tempfile; boolean in_oracle, ok; long txt_offset, offset, fpos; int oracle_cnt; register int i; infile = malloc(strlen(DATA_IN_TEMPLATE) - 2 + strlen(ORACLE_FILE) + 5); tempfile = malloc(strlen(DATA_TEMPLATE) - 2 + strlen("oracles.tmp") + 1); Sprintf(tempfile, DATA_TEMPLATE, "oracles.tmp"); filename[0]='\0'; #ifdef FILE_PREFIX Strcat(filename, file_prefix); #endif Sprintf(eos(filename), DATA_TEMPLATE, ORACLE_FILE); Sprintf(infile, DATA_IN_TEMPLATE, ORACLE_FILE); Strcat(infile, ".txt"); if (!(ifp = fopen(infile, RDTMODE))) { perror(infile); exit(EXIT_FAILURE); } free(infile); if (!(ofp = fopen(filename, WRTMODE))) { perror(filename); Fclose(ifp); exit(EXIT_FAILURE); } if (!(tfp = fopen(tempfile, WRTMODE))) { /* oracles.tmp */ perror(tempfile); Fclose(ifp); Fclose(ofp); Unlink(filename); exit(EXIT_FAILURE); } /* output a dummy header record; we'll rewind and overwrite it later */ Fprintf(ofp, "%s%5d\n", Dont_Edit_Data, 0); /* handle special oracle; it must come first */ (void) fputs("---\n", tfp); Fprintf(ofp, "%05lx\n", ftell(tfp)); /* start pos of special oracle */ for (i = 0; i < SIZE(special_oracle); i++) { (void) fputs(xcrypt(special_oracle[i]), tfp); (void) fputc('\n', tfp); } SpinCursor(3); oracle_cnt = 1; (void) fputs("---\n", tfp); Fprintf(ofp, "%05lx\n", ftell(tfp)); /* start pos of first oracle */ in_oracle = FALSE; while (fgets(in_line, sizeof in_line, ifp)) { SpinCursor(3); if (h_filter(in_line)) continue; if (!strncmp(in_line, "-----", 5)) { if (!in_oracle) continue; in_oracle = FALSE; oracle_cnt++; (void) fputs("---\n", tfp); Fprintf(ofp, "%05lx\n", ftell(tfp)); /* start pos of this oracle */ } else { in_oracle = TRUE; (void) fputs(xcrypt(in_line), tfp); } } if (in_oracle) { /* need to terminate last oracle */ oracle_cnt++; (void) fputs("---\n", tfp); Fprintf(ofp, "%05lx\n", ftell(tfp)); /* eof position */ } /* record the current position */ txt_offset = ftell(ofp); Fclose(ifp); /* all done with original input file */ /* reprocess the scratch file; 1st format an error msg, just in case */ Sprintf(in_line, "rewind of \"%s\"", tempfile); if (rewind(tfp) != 0) goto dead_data; /* copy all lines of text from the scratch file into the output file */ while (fgets(in_line, sizeof in_line, tfp)) (void) fputs(in_line, ofp); /* finished with scratch file */ Fclose(tfp); Unlink(tempfile); /* remove it */ free(tempfile); /* update the first record of the output file; prepare error msg 1st */ Sprintf(in_line, "rewind of \"%s\"", filename); ok = (rewind(ofp) == 0); if (ok) { Sprintf(in_line, "header rewrite of \"%s\"", filename); ok = (fprintf(ofp, "%s%5d\n", Dont_Edit_Data, oracle_cnt) >=0); } if (ok) { Sprintf(in_line, "data rewrite of \"%s\"", filename); for (i = 0; i <= oracle_cnt; i++) { #ifndef VMS /* alpha/vms v1.0; this fflush seems to confuse ftell */ if (!(ok = (fflush(ofp) == 0))) break; #endif if (!(ok = (fpos = ftell(ofp)) >= 0)) break; if (!(ok = (fseek(ofp, fpos, SEEK_SET) >= 0))) break; if (!(ok = (fscanf(ofp, "%5lx", &offset) == 1))) break; #ifdef MAC # ifdef __MWERKS__ /* MetroWerks CodeWarrior Pro 1's (AKA CW12) version of MSL (ANSI C Libraries) needs this rewind or else the fprintf stops working. This may also be true for CW11, but has never been checked. */ rewind(ofp); # endif #endif if (!(ok = (fseek(ofp, fpos, SEEK_SET) >= 0))) break; if (!(ok = (fprintf(ofp, "%05lx\n", offset + txt_offset) >= 0))) break; } } if (!ok) { dead_data: perror(in_line); /* report the problem */ /* close and kill the aborted output file, then give up */ /* KMH -- I don't know why it fails */ #ifndef MAC Fclose(ofp); Unlink(filename); exit(EXIT_FAILURE); #endif } /* all done */ Fclose(ofp); return; } static struct deflist { const char *defname; boolean true_or_false; } deflist[] = { #ifdef REINCARNATION { "REINCARNATION", TRUE }, #else { "REINCARNATION", FALSE }, #endif { 0, 0 } }; static int check_control(s) char *s; { int i; if(s[0] != '%') return(-1); for(i = 0; deflist[i].defname; i++) if(!strncmp(deflist[i].defname, s+1, strlen(deflist[i].defname))) return(i); return(-1); } static char * without_control(s) char *s; { return(s + 1 + strlen(deflist[check_control(in_line)].defname)); } void do_dungeon() { int rcnt = 0; Sprintf(filename, DATA_IN_TEMPLATE, DGN_I_FILE); if (!(ifp = fopen(filename, RDTMODE))) { perror(filename); exit(EXIT_FAILURE); } filename[0]='\0'; #ifdef FILE_PREFIX Strcat(filename, file_prefix); #endif Sprintf(eos(filename), DGN_TEMPLATE, DGN_O_FILE); if (!(ofp = fopen(filename, WRTMODE))) { perror(filename); exit(EXIT_FAILURE); } Fprintf(ofp,Dont_Edit_Data); while (fgets(in_line, sizeof in_line, ifp) != 0) { SpinCursor(3); rcnt++; if(in_line[0] == '#') continue; /* discard comments */ recheck: if(in_line[0] == '%') { int i = check_control(in_line); if(i >= 0) { if(!deflist[i].true_or_false) { while (fgets(in_line, sizeof in_line, ifp) != 0) if(check_control(in_line) != i) goto recheck; } else (void) fputs(without_control(in_line),ofp); } else { Fprintf(stderr, "Unknown control option '%s' in file %s at line %d.\n", in_line, DGN_I_FILE, rcnt); exit(EXIT_FAILURE); } } else (void) fputs(in_line,ofp); } Fclose(ifp); Fclose(ofp); return; } static boolean ranged_attk(ptr) /* returns TRUE if monster can attack at range */ register struct permonst *ptr; { register int i, j; register int atk_mask = (1<<AT_BREA) | (1<<AT_SPIT) | (1<<AT_GAZE); for(i = 0; i < NATTK; i++) { if((j=ptr->mattk[i].aatyp) >= AT_WEAP || (atk_mask & (1<<j))) return TRUE; } return(FALSE); } /* This routine is designed to return an integer value which represents * an approximation of monster strength. It uses a similar method of * determination as "experience()" to arrive at the strength. */ static int mstrength(ptr) struct permonst *ptr; { int i, tmp2, n, tmp = ptr->mlevel; if(tmp > 49) /* special fixed hp monster */ tmp = 2*(tmp - 6) / 4; /* For creation in groups */ n = (!!(ptr->geno & G_SGROUP)); n += (!!(ptr->geno & G_LGROUP)) << 1; n += (!!(ptr->geno & G_VLGROUP)) << 2; /* For ranged attacks */ if (ranged_attk(ptr)) n++; /* For higher ac values */ n += (ptr->ac < 4); n += (ptr->ac < 0); /* For very fast monsters */ n += (ptr->mmove >= 18); /* For each attack and "special" attack */ for(i = 0; i < NATTK; i++) { tmp2 = ptr->mattk[i].aatyp; n += (tmp2 > 0); n += (tmp2 == AT_MAGC); n += (tmp2 == AT_WEAP && (ptr->mflags2 & M2_STRONG)); } /* For each "special" damage type */ for(i = 0; i < NATTK; i++) { tmp2 = ptr->mattk[i].adtyp; if ((tmp2 == AD_DRLI) || (tmp2 == AD_STON) || (tmp2 == AD_DRST) || (tmp2 == AD_DRDX) || (tmp2 == AD_DRCO) || (tmp2 == AD_WERE)) n += 2; else if (strcmp(ptr->mname, "grid bug")) n += (tmp2 != AD_PHYS); n += ((int) (ptr->mattk[i].damd * ptr->mattk[i].damn) > 23); } /* tom's nasties */ if (extra_nasty(ptr)) n += 5; /* Leprechauns are special cases. They have many hit dice so they can hit and are hard to kill, but they don't really do much damage. */ if (!strcmp(ptr->mname, "leprechaun")) n -= 2; /* Finally, adjust the monster level 0 <= n <= 24 (approx.) */ if(n == 0) tmp--; else if(n >= 6) tmp += ( n / 2 ); else tmp += ( n / 3 + 1); return((tmp >= 0) ? tmp : 0); } void do_monstr() { register struct permonst *ptr; register int i, j; /* * create the source file, "monstr.c" */ filename[0]='\0'; #ifdef FILE_PREFIX Strcat(filename, file_prefix); #endif Sprintf(eos(filename), SOURCE_TEMPLATE, MON_STR_C); if (!(ofp = fopen(filename, WRTMODE))) { perror(filename); exit(EXIT_FAILURE); } Fprintf(ofp,Dont_Edit_Code); Fprintf(ofp,"#include \"config.h\"\n"); Fprintf(ofp,"\nconst int monstr[] = {\n"); for (ptr = &mons[0], j = 0; ptr->mlet; ptr++) { SpinCursor(3); i = mstrength(ptr); Fprintf(ofp,"%2d,%c", i, (++j & 15) ? ' ' : '\n'); } /* might want to insert a final 0 entry here instead of just newline */ Fprintf(ofp,"%s};\n", (j & 15) ? "\n" : ""); Fprintf(ofp,"\nvoid NDECL(monstr_init);\n"); Fprintf(ofp,"\nvoid\n"); Fprintf(ofp,"monstr_init()\n"); Fprintf(ofp,"{\n"); Fprintf(ofp," return;\n"); Fprintf(ofp,"}\n"); Fprintf(ofp,"\n/*monstr.c*/\n"); Fclose(ofp); return; } void do_permonst() { int i; char *c, *nam; filename[0]='\0'; #ifdef FILE_PREFIX Strcat(filename, file_prefix); #endif Sprintf(eos(filename), INCLUDE_TEMPLATE, MONST_FILE); if (!(ofp = fopen(filename, WRTMODE))) { 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"); if (strcmp(mons[0].mname, "playermon") != 0) Fprintf(ofp,"\n#define\tPM_PLAYERMON\t(-1)"); for (i = 0; mons[i].mlet; i++) { SpinCursor(3); Fprintf(ofp,"\n#define\tPM_"); if (mons[i].mlet == S_HUMAN && !strncmp(mons[i].mname, "were", 4)) Fprintf(ofp, "HUMAN_"); for (nam = c = tmpdup(mons[i].mname); *c; c++) if (*c >= 'a' && *c <= 'z') *c -= (char)('a' - 'A'); else if (*c < 'A' || *c > 'Z') *c = '_'; Fprintf(ofp,"%s\t%d", nam, i); } Fprintf(ofp,"\n\n#define\tNUMMONS\t%d\n", i); Fprintf(ofp,"\n#endif /* PM_H */\n"); Fclose(ofp); return; } /* Start of Quest text file processing. */ #include "qtext.h" static struct qthdr qt_hdr; static struct msghdr msg_hdr[N_HDR]; static struct qtmsg *curr_msg; static int qt_line; static boolean in_msg; #define NO_MSG 1 /* strlen of a null line returned by fgets() */ static boolean qt_comment(s) char *s; { if(s[0] == '#') return(TRUE); return((boolean)(!in_msg && strlen(s) == NO_MSG)); } static boolean qt_control(s) char *s; { return((boolean)(s[0] == '%' && (s[1] == 'C' || s[1] == 'E'))); } static int get_hdr (code) char *code; { int i; for(i = 0; i < qt_hdr.n_hdr; i++) if(!strncmp(code, qt_hdr.id[i], LEN_HDR)) return (++i); return(0); } static boolean new_id (code) char *code; { if(qt_hdr.n_hdr >= N_HDR) { Fprintf(stderr, OUT_OF_HEADERS, qt_line); return(FALSE); } strncpy(&qt_hdr.id[qt_hdr.n_hdr][0], code, LEN_HDR); msg_hdr[qt_hdr.n_hdr].n_msg = 0; qt_hdr.offset[qt_hdr.n_hdr++] = 0L; return(TRUE); } static boolean known_msg(num, id) int num, id; { int i; for(i = 0; i < msg_hdr[num].n_msg; i++) if(msg_hdr[num].qt_msg[i].msgnum == id) return(TRUE); return(FALSE); } static void new_msg(s, num, id) char *s; int num, id; { struct qtmsg *qt_msg; if(msg_hdr[num].n_msg >= N_MSG) { Fprintf(stderr, OUT_OF_MESSAGES, qt_line); } else { qt_msg = &(msg_hdr[num].qt_msg[msg_hdr[num].n_msg++]); qt_msg->msgnum = id; qt_msg->delivery = s[2]; qt_msg->offset = qt_msg->size = 0L; curr_msg = qt_msg; } } static void do_qt_control(s) char *s; { char code[BUFSZ]; int num, id = 0; switch(s[1]) { case 'C': if(in_msg) { Fprintf(stderr, CREC_IN_MSG, qt_line); break; } else { in_msg = TRUE; if (sscanf(&s[4], "%s %5d", code, &id) != 2) { Fprintf(stderr, UNREC_CREC, qt_line); break; } num = get_hdr(code); if (!num && !new_id(code)) break; num = get_hdr(code)-1; if(known_msg(num, id)) Fprintf(stderr, DUP_MSG, qt_line); else new_msg(s, num, id); } break; case 'E': if(!in_msg) { Fprintf(stderr, END_NOT_IN_MSG, qt_line); break; } else in_msg = FALSE; break; default: Fprintf(stderr, UNREC_CREC, qt_line); break; } } static void do_qt_text(s) char *s; { if (!in_msg) { Fprintf(stderr, TEXT_NOT_IN_MSG, qt_line); } curr_msg->size += strlen(s); return; } static void adjust_qt_hdrs() { int i, j; long count = 0L, hdr_offset = sizeof(int) + (sizeof(char)*LEN_HDR + sizeof(long)) * qt_hdr.n_hdr; for(i = 0; i < qt_hdr.n_hdr; i++) { qt_hdr.offset[i] = hdr_offset; hdr_offset += sizeof(int) + sizeof(struct qtmsg) * msg_hdr[i].n_msg; } for(i = 0; i < qt_hdr.n_hdr; i++) for(j = 0; j < msg_hdr[i].n_msg; j++) { msg_hdr[i].qt_msg[j].offset = hdr_offset + count; count += msg_hdr[i].qt_msg[j].size; } return; } static void put_qt_hdrs() { int i; /* * The main header record. */ #ifdef DEBUG Fprintf(stderr, "%ld: header info.\n", ftell(ofp)); #endif (void) fwrite((genericptr_t)&(qt_hdr.n_hdr), sizeof(int), 1, ofp); (void) fwrite((genericptr_t)&(qt_hdr.id[0][0]), sizeof(char)*LEN_HDR, qt_hdr.n_hdr, ofp); (void) fwrite((genericptr_t)&(qt_hdr.offset[0]), sizeof(long), qt_hdr.n_hdr, ofp); #ifdef DEBUG for(i = 0; i < qt_hdr.n_hdr; i++) Fprintf(stderr, "%c @ %ld, ", qt_hdr.id[i], qt_hdr.offset[i]); Fprintf(stderr, "\n"); #endif /* * The individual class headers. */ for(i = 0; i < qt_hdr.n_hdr; i++) { #ifdef DEBUG Fprintf(stderr, "%ld: %c header info.\n", ftell(ofp), qt_hdr.id[i]); #endif (void) fwrite((genericptr_t)&(msg_hdr[i].n_msg), sizeof(int), 1, ofp); (void) fwrite((genericptr_t)&(msg_hdr[i].qt_msg[0]), sizeof(struct qtmsg), msg_hdr[i].n_msg, ofp); #ifdef DEBUG { int j; for(j = 0; j < msg_hdr[i].n_msg; j++) Fprintf(stderr, "msg %d @ %ld (%ld)\n", msg_hdr[i].qt_msg[j].msgnum, msg_hdr[i].qt_msg[j].offset, msg_hdr[i].qt_msg[j].size); } #endif } } void do_questtxt() { Sprintf(filename, DATA_IN_TEMPLATE, QTXT_I_FILE); ifp = fopen(filename, RDTMODE); if(!ifp) { perror(filename); exit(EXIT_FAILURE); } filename[0]='\0'; #ifdef FILE_PREFIX Strcat(filename, file_prefix); #endif Sprintf(eos(filename), DATA_TEMPLATE, QTXT_O_FILE); if(!(ofp = fopen(filename, WRBMODE))) { perror(filename); Fclose(ifp); exit(EXIT_FAILURE); } qt_hdr.n_hdr = 0; qt_line = 0; in_msg = FALSE; while (fgets(in_line, 80, ifp) != 0) { SpinCursor (3); qt_line++; if(qt_control(in_line)) do_qt_control(in_line); else if(qt_comment(in_line)) continue; else do_qt_text(in_line); } (void) rewind(ifp); in_msg = FALSE; adjust_qt_hdrs(); put_qt_hdrs(); while (fgets(in_line, 80, ifp) != 0) { if(qt_control(in_line)) { in_msg = (in_line[1] == 'C'); continue; } else if(qt_comment(in_line)) continue; #ifdef DEBUG Fprintf(stderr, "%ld: %s", ftell(stdout), in_line); #endif (void) fputs(xcrypt(in_line), ofp); } Fclose(ifp); Fclose(ofp); return; } static char temp[32]; static char * limit(name,pref) /* limit a name to 30 characters length */ char *name; int pref; { (void) strncpy(temp, name, pref ? 26 : 30); temp[pref ? 26 : 30] = 0; return temp; } void do_objs() { int i, sum = 0; char *c, *objnam; int nspell = 0; int prefix = 0; char class = '\0'; boolean sumerr = FALSE; filename[0]='\0'; #ifdef FILE_PREFIX Strcat(filename, file_prefix); #endif Sprintf(eos(filename), INCLUDE_TEMPLATE, ONAME_FILE); if (!(ofp = fopen(filename, WRTMODE))) { 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"); for(i = 0; !i || objects[i].oc_class != ILLOBJ_CLASS; i++) { SpinCursor(3); objects[i].oc_name_idx = objects[i].oc_descr_idx = i; /* init */ if (!(objnam = tmpdup(OBJ_NAME(objects[i])))) continue; /* make sure probabilities add up to 1000 */ if(objects[i].oc_class != class) { if (sum && sum != 1000) { Fprintf(stderr, "prob error for class %d (%d%%)", class, sum); (void) fflush(stderr); sumerr = TRUE; } class = objects[i].oc_class; sum = 0; } for (c = objnam; *c; c++) if (*c >= 'a' && *c <= 'z') *c -= (char)('a' - 'A'); else if (*c < 'A' || *c > 'Z') *c = '_'; switch (class) { case WAND_CLASS: Fprintf(ofp,"#define\tWAN_"); prefix = 1; break; case RING_CLASS: Fprintf(ofp,"#define\tRIN_"); prefix = 1; break; case POTION_CLASS: Fprintf(ofp,"#define\tPOT_"); prefix = 1; break; case SPBOOK_CLASS: Fprintf(ofp,"#define\tSPE_"); prefix = 1; nspell++; break; case SCROLL_CLASS: Fprintf(ofp,"#define\tSCR_"); prefix = 1; break; case AMULET_CLASS: /* avoid trouble with stupid C preprocessors */ Fprintf(ofp,"#define\t"); if(objects[i].oc_material == PLASTIC) { Fprintf(ofp,"FAKE_AMULET_OF_YENDOR\t%d\n", i); prefix = -1; break; } break; case GEM_CLASS: /* avoid trouble with stupid C preprocessors */ if(objects[i].oc_material == GLASS) { Fprintf(ofp,"/* #define\t%s\t%d */\n", objnam, i); prefix = -1; break; } default: Fprintf(ofp,"#define\t"); } if (prefix >= 0) Fprintf(ofp,"%s\t%d\n", limit(objnam, prefix), i); prefix = 0; sum += objects[i].oc_prob; } /* check last set of probabilities */ if (sum && sum != 1000) { Fprintf(stderr, "prob error for class %d (%d%%)", class, sum); (void) fflush(stderr); sumerr = TRUE; } Fprintf(ofp,"#define\tLAST_GEM\t(JADE)\n"); Fprintf(ofp,"#define\tMAXSPELL\t%d\n", nspell+1); Fprintf(ofp,"#define\tNUM_OBJECTS\t%d\n", i); Fprintf(ofp, "\n/* Artifacts (unique objects) */\n\n"); for (i = 1; artifact_names[i]; i++) { SpinCursor(3); for (c = objnam = tmpdup(artifact_names[i]); *c; c++) if (*c >= 'a' && *c <= 'z') *c -= (char)('a' - 'A'); else if (*c < 'A' || *c > 'Z') *c = '_'; if (!strncmp(objnam, "THE_", 4)) objnam += 4; #ifdef TOURIST /* fudge _platinum_ YENDORIAN EXPRESS CARD */ if (!strncmp(objnam, "PLATINUM_", 9)) objnam += 9; #endif Fprintf(ofp,"#define\tART_%s\t%d\n", limit(objnam, 1), i); } Fprintf(ofp, "#define\tNROFARTIFACTS\t%d\n", i-1); Fprintf(ofp,"\n#endif /* ONAMES_H */\n"); Fclose(ofp); if (sumerr) exit(EXIT_FAILURE); return; } static char * tmpdup(str) const char *str; { static char buf[128]; if (!str) return (char *)0; (void)strncpy(buf, str, 127); return buf; } static char * eos(str) char *str; { while (*str) str++; return str; } /* * macro used to control vision algorithms: * VISION_TABLES => generate tables */ void do_vision() { #ifdef VISION_TABLES int i, j; /* Everything is clear. xclear may be malloc'ed. * Block the upper left corner (BLOCK_HEIGHTxBLOCK_WIDTH) */ for (i = 0; i < MAX_ROW; i++) for (j = 0; j < MAX_COL; j++) if (i < BLOCK_HEIGHT && j < BLOCK_WIDTH) xclear[i][j] = '\000'; else xclear[i][j] = '\001'; #endif /* VISION_TABLES */ SpinCursor(3); /* * create the include file, "vis_tab.h" */ filename[0]='\0'; #ifdef FILE_PREFIX Strcat(filename, file_prefix); #endif Sprintf(filename, INCLUDE_TEMPLATE, VIS_TAB_H); if (!(ofp = fopen(filename, WRTMODE))) { perror(filename); exit(EXIT_FAILURE); } Fprintf(ofp,Dont_Edit_Code); Fprintf(ofp,"#ifdef VISION_TABLES\n"); #ifdef VISION_TABLES H_close_gen(); H_far_gen(); #endif /* VISION_TABLES */ Fprintf(ofp,"\n#endif /* VISION_TABLES */\n"); Fclose(ofp); SpinCursor(3); /* * create the source file, "vis_tab.c" */ filename[0]='\0'; #ifdef FILE_PREFIX Strcat(filename, file_prefix); #endif Sprintf(filename, SOURCE_TEMPLATE, VIS_TAB_C); if (!(ofp = fopen(filename, WRTMODE))) { perror(filename); Sprintf(filename, INCLUDE_TEMPLATE, VIS_TAB_H); Unlink(filename); exit(EXIT_FAILURE); } Fprintf(ofp,Dont_Edit_Code); Fprintf(ofp,"#include \"config.h\"\n"); Fprintf(ofp,"#ifdef VISION_TABLES\n"); Fprintf(ofp,"#include \"vis_tab.h\"\n"); SpinCursor(3); #ifdef VISION_TABLES C_close_gen(); C_far_gen(); /* KMH -- vis_tab_init() needs prototype */ Fprintf(ofp, "\nvoid NDECL(vis_tab_init);\n"); Fprintf(ofp,"\nvoid vis_tab_init() { return; }\n"); #endif /* VISION_TABLES */ SpinCursor(3); Fprintf(ofp,"\n#endif /* VISION_TABLES */\n"); Fprintf(ofp,"\n/*vis_tab.c*/\n"); Fclose(ofp); return; } #ifdef VISION_TABLES /*-------------- vision tables --------------*\ * * Generate the close and far tables. This is done by setting up a * fake dungeon and moving our source to different positions relative * to a block and finding the first/last visible position. The fake * dungeon is all clear execpt for the upper left corner (BLOCK_HEIGHT * by BLOCK_WIDTH) is blocked. Then we move the source around relative * to the corner of the block. For each new position of the source * we check positions on rows "kittycorner" from the source. We check * positions until they are either in sight or out of sight (depends on * which table we are generating). The picture below shows the setup * for the generation of the close table. The generation of the far * table would switch the quadrants of the '@' and the "Check rows * here". * * * XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, * XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, * XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX,,,,,,,,, Check rows here ,,,,,,,,,,,, * XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, * XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXB,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, * ............................... * ............................... * .........@..................... * ............................... * * Table generation figure (close_table). The 'X's are blocked points. * The 'B' is a special blocked point. The '@' is the source. The ','s * are the target area. The '.' are just open areas. * * * Example usage of close_table[][][]. * * The table is as follows: * * dy = |row of '@' - row of 'B'| - 1 * dx = |col of '@' - col of 'B'| * * The first indices are the deltas from the source '@' and the block 'B'. * You must check for the value inside the abs value bars being zero. If * so then the block is on the same row and you don't need to do a table * lookup. The last value: * * dcy = |row of block - row to be checked| * * Is the value of the first visible spot on the check row from the * block column. So * * first visible col = close_table[dy][dx][dcy] + col of 'B' * \*-------------- vision tables --------------*/ static void H_close_gen() { Fprintf(ofp,"\n/* Close */\n"); Fprintf(ofp,"#define CLOSE_MAX_SB_DY %2d\t/* |src row - block row| - 1\t*/\n", TEST_HEIGHT-1); Fprintf(ofp,"#define CLOSE_MAX_SB_DX %2d\t/* |src col - block col|\t*/\n", TEST_WIDTH); Fprintf(ofp,"#define CLOSE_MAX_BC_DY %2d\t/* |block row - check row|\t*/\n", TEST_HEIGHT); Fprintf(ofp,"typedef struct {\n"); Fprintf(ofp," unsigned char close[CLOSE_MAX_SB_DX][CLOSE_MAX_BC_DY];\n"); Fprintf(ofp,"} close2d;\n"); Fprintf(ofp,"extern close2d close_table[CLOSE_MAX_SB_DY];\n"); return; } static void H_far_gen() { Fprintf(ofp,"\n/* Far */\n"); Fprintf(ofp,"#define FAR_MAX_SB_DY %2d\t/* |src row - block row|\t*/\n", TEST_HEIGHT); Fprintf(ofp,"#define FAR_MAX_SB_DX %2d\t/* |src col - block col| - 1\t*/\n", TEST_WIDTH-1); Fprintf(ofp,"#define FAR_MAX_BC_DY %2d\t/* |block row - check row| - 1\t*/\n", TEST_HEIGHT-1); Fprintf(ofp,"typedef struct {\n"); Fprintf(ofp," unsigned char far_q[FAR_MAX_SB_DX][FAR_MAX_BC_DY];\n"); Fprintf(ofp,"} far2d;\n"); Fprintf(ofp,"extern far2d far_table[FAR_MAX_SB_DY];\n"); return; } static void C_close_gen() { int i,dx,dy; int src_row, src_col; /* source */ int block_row, block_col; /* block */ int this_row; int no_more; const char *delim; block_row = BLOCK_HEIGHT-1; block_col = BLOCK_WIDTH-1; Fprintf(ofp,"\n#ifndef FAR_TABLE_ONLY\n"); Fprintf(ofp,"\nclose2d close_table[CLOSE_MAX_SB_DY] = {\n"); #ifndef no_vision_progress Fprintf(stderr,"\nclose:"); #endif for (dy = 1; dy < TEST_HEIGHT; dy++) { src_row = block_row + dy; Fprintf(ofp, "/* DY = %2d (- 1)*/\n {{\n", dy); #ifndef no_vision_progress Fprintf(stderr," %2d",dy), (void)fflush(stderr); #endif for (dx = 0; dx < TEST_WIDTH; dx++) { src_col = block_col - dx; Fprintf(ofp, " /*%2d*/ {", dx); no_more = 0; for (this_row = 0; this_row < TEST_HEIGHT; this_row++) { delim = (this_row < TEST_HEIGHT - 1) ? "," : ""; if (no_more) { Fprintf(ofp, "%s%s", CLOSE_OFF_TABLE_STRING, delim); continue; } SpinCursor(3); /* Find the first column that we can see. */ for (i = block_col+1; i < MAX_COL; i++) { if (clear_path(src_row,src_col,block_row-this_row,i)) break; } if (i == MAX_COL) no_more = 1; Fprintf(ofp, "%2d%s", i - block_col, delim); } Fprintf(ofp, "}%s", (dx < TEST_WIDTH - 1) ? ",\n" : "\n"); } Fprintf(ofp," }},\n"); } Fprintf(ofp,"}; /* close_table[] */\n"); /* closing brace for table */ Fprintf(ofp,"#endif /* !FAR_TABLE_ONLY */\n"); #ifndef no_vision_progress Fprintf(stderr,"\n"); #endif return; } static void C_far_gen() { int i,dx,dy; int src_row, src_col; /* source */ int block_row, block_col; /* block */ int this_row; const char *delim; block_row = BLOCK_HEIGHT-1; block_col = BLOCK_WIDTH-1; Fprintf(ofp,"\n#ifndef CLOSE_TABLE_ONLY\n"); Fprintf(ofp,"\nfar2d far_table[FAR_MAX_SB_DY] = {\n"); #ifndef no_vision_progress Fprintf(stderr,"\n_far_:"); #endif for (dy = 0; dy < TEST_HEIGHT; dy++) { src_row = block_row - dy; Fprintf(ofp, "/* DY = %2d */\n {{\n", dy); #ifndef no_vision_progress Fprintf(stderr," %2d",dy), (void)fflush(stderr); #endif for (dx = 1; dx < TEST_WIDTH; dx++) { src_col = block_col + dx; Fprintf(ofp, " /*%2d(-1)*/ {", dx); for (this_row = block_row+1; this_row < block_row+TEST_HEIGHT; this_row++) { delim = (this_row < block_row + TEST_HEIGHT - 1) ? "," : ""; SpinCursor(3); /* Find first col that we can see. */ for (i = 0; i <= block_col; i++) { if (clear_path(src_row,src_col,this_row,i)) break; } if (block_col-i < 0) Fprintf(ofp, "%s%s", FAR_OFF_TABLE_STRING, delim); else Fprintf(ofp, "%2d%s", block_col - i, delim); } Fprintf(ofp, "}%s", (dx < TEST_WIDTH - 1) ? ",\n" : "\n"); } Fprintf(ofp," }},\n"); } Fprintf(ofp,"}; /* far_table[] */\n"); /* closing brace for table */ Fprintf(ofp,"#endif /* !CLOSE_TABLE_ONLY */\n"); #ifndef no_vision_progress Fprintf(stderr,"\n"); #endif return; } /* * "Draw" a line from the hero to the given location. Stop if we hit a * wall. * * Generalized integer Bresenham's algorithm (fast line drawing) for * all quadrants. From _Procedural Elements for Computer Graphics_, by * David F. Rogers. McGraw-Hill, 1985. * * I have tried a little bit of optimization by pulling compares out of * the inner loops. * * NOTE: This had better *not* be called from a position on the * same row as the hero. */ static int clear_path(you_row,you_col,y2,x2) int you_row, you_col, y2, x2; { int dx, dy, s1, s2; register int i, error, x, y, dxs, dys; x = you_col; y = you_row; dx = abs(x2-you_col); dy = abs(y2-you_row); s1 = sign(x2-you_col); s2 = sign(y2-you_row); if (s1 == 0) { /* same column */ if (s2 == 1) { /* below (larger y2 value) */ for (i = you_row+1; i < y2; i++) if (!xclear[i][you_col]) return 0; } else { /* above (smaller y2 value) */ for (i = y2+1; i < you_row; i++) if (!xclear[i][you_col]) return 0; } return 1; } /* * Lines at 0 and 90 degrees have been weeded out. */ if (dy > dx) { error = dx; dx = dy; dy = error; /* swap the values */ dxs = dx << 1; /* save the shifted values */ dys = dy << 1; error = dys - dx; /* NOTE: error is used as a temporary above */ for (i = 0; i < dx; i++) { if (!xclear[y][x]) return 0; /* plot point */ while (error >= 0) { x += s1; error -= dxs; } y += s2; error += dys; } } else { dxs = dx << 1; /* save the shifted values */ dys = dy << 1; error = dys - dx; for (i = 0; i < dx; i++) { if (!xclear[y][x]) return 0; /* plot point */ while (error >= 0) { y += s2; error -= dxs; } x += s1; error += dys; } } return 1; } #endif /* VISION_TABLES */ /* KMH -- Now supports upper, lower, and mixed case filenames */ void do_filenames() { char *infile; int i; char buf[BUFSZ]; char lname[20] = DEF_GAME_NAME; char uname[20] = DEF_GAME_NAME; infile = malloc(strlen(INCLUDE_TEMPLATE) - 2 + strlen(FILE_H) + 1); (void) lcase(lname); (void) ucase(uname); /* * create the source file, "filename.h" */ filename[0]='\0'; #ifdef FILE_PREFIX Strcat(filename, file_prefix); #endif Sprintf(eos(filename), INCLUDE_TEMPLATE, FILENAME_H); if (!(ofp = fopen(filename, WRTMODE))) { perror(filename); exit(EXIT_FAILURE); } Fprintf(ofp,"/*\tSCCS Id: @(#)filename.h\t3.2\t96/05/17 */\n\n"); Fprintf(ofp,Dont_Edit_Code); /*OPEN file*/ Sprintf(infile, INCLUDE_TEMPLATE, FILE_H); if (!(ifp = fopen(infile, RDTMODE))) { perror(infile); Fclose(ofp); Unlink(filename); /* kill empty output file */ exit(EXIT_FAILURE); } free(infile); do { fgets(in_line, sizeof in_line, ifp); if (*in_line != '#') continue; sscanf(in_line, "# %s", buf); } while (strcmp(buf, "START") != 0); while (fgets(in_line, sizeof in_line, ifp)) { for ( i = 0; i < strlen(in_line); i++ ) { if (in_line[i] == '@') { /*differentiate uppercase, lowercase*/ /*assume DEF_GAME_NAME is uppercase*/ /* KMH -- Added mixed case */ if ((in_line[i+1] == 'l') || (in_line[i+1] == 'L')) (void) fputs(lname,ofp); else if ((in_line[i+1] == 'u') || (in_line[i+1] == 'U')) (void) fputs(uname,ofp); else (void) fputs(DEF_GAME_NAME,ofp); i=i+6; } else (void) fputc(in_line[i], ofp); } } Fclose(ifp); Fclose(ofp); return; } char * lcase(s) /* convert a string into all lowercase */ char *s; { register char *p; for (p = s; *p; p++) if ('A' <= *p && *p <= 'Z') *p |= 040; return s; } /* KMH -- added function */ char * ucase(s) /* convert a string into all lowercase */ char *s; { register char *p; for (p = s; *p; p++) if ('a' <= *p && *p <= 'z') *p &= ~040; return s; } #ifdef STRICT_REF_DEF NEARDATA struct flag flags; # ifdef ATTRIB_H struct attribs attrmax, attrmin; # endif #endif /* STRICT_REF_DEF */ /*makedefs.c*/ �����������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/util/dlb_main.c�������������������������������������������������������������������0000664�0000764�0000764�00000032477�10545462320�014551� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* 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. */ /* data librarian; only useful if you are making the library version, DLBLIB */ #include "config.h" #include "dlb.h" #if !defined(O_WRONLY) && !defined(MAC) && !defined(AZTEC_C) #include <fcntl.h> #endif #if defined(__DJGPP__) #include <string.h> #endif static void FDECL(xexit, (int)); #ifdef DLB #ifdef DLBLIB #define DLB_DIRECTORY "Directory" /* name of lib directory */ #define LIBLISTFILE "dlb.lst" /* default list file */ /* library functions (from dlb.c) */ extern boolean FDECL(open_library,(const char *,const char *,library *)); extern void FDECL(close_library,(library *)); char *FDECL(eos, (char *)); /* also used by dlb.c */ FILE *FDECL(fopen_datafile, (const char *,const char *)); #ifdef VMS extern char *FDECL(vms_basename, (const char *)); extern int FDECL(vms_open, (const char *,int,unsigned int)); #endif static void FDECL(Write, (int,char *,long)); static void NDECL(usage); static void NDECL(verbose_help); static void FDECL(write_dlb_directory, (int,int,libdir *,long,long,long)); static char default_progname[] = "dlb"; static char *progname = default_progname; /* fixed library and list file names - can be overridden if necessary */ static const char *library_file = DLBFILE; static const char *list_file = LIBLISTFILE; #ifdef AMIGA static char origdir[255]=""; #endif #ifndef O_BINARY #define O_BINARY 0 #endif #define MAX_DLB_FILES 300 /* max # of files we'll handle */ #define DLB_VERS 1 /* version of dlb file we will write */ /* * How the file is encoded within the library. Don't use a space * because (at least) the SunOS 4.1.3 C library will eat the white * space instead of preserving it like the man page says it should. */ #define ENC_NORMAL 'n' /* normal: not compressed in any way */ /* * If you know tar, you have a small clue how to use this (note: - does * NOT mean stdin/stdout). * * dlb COMMANDoptions arg... files... * commands: * dlb x extract all files * dlb c build the archive * dlb t list the archive * options: * v verbose * f file specify archive file (default DLBFILE) * I file specify file for list of files (default LIBLISTFILE) * C dir chdir to dir (used ONCE, not like tar's -C) */ static void usage() { (void) printf("Usage: %s [ctxCIfv] arguments... [files...]\n", progname); (void) printf(" default library is %s\n", library_file); (void) printf(" default list file is %s\n", list_file); xexit(EXIT_FAILURE); } static void verbose_help() { static const char *long_help[] = { "", "dlb COMMANDoptions args... files...", " commands:", " dlb ? print this text", " dlb h ditto", " dlb x extract all files", " dlb c create the archive", " dlb t list table of contents", " options:", " v verbose operation", " f file specify archive file name", " I file specify file for list of file names", " C dir change directory before processing any files", "", (char *)0 }; const char **str; for (str = long_help; *str; str++) (void) printf("%s\n", *str); usage(); } static void Write(out,buf,len) int out; char *buf; long len; { #if defined(MSDOS) && !defined(__DJGPP__) unsigned short slen; if (len > 65534) { printf("%d Length specified for write() too large for 16 bit env.", len); xexit(EXIT_FAILURE); } slen = (unsigned short)len; if (write(out,buf,slen) != slen) { #else if (write(out,buf,len) != len) { #endif printf("Write Error in '%s'\n",library_file); xexit(EXIT_FAILURE); } } #endif /* DLBLIB */ #endif /* DLB */ int main(argc, argv) int argc; char **argv; { #ifdef DLB #ifdef DLBLIB int i, r; int ap=2; /* argument pointer */ int cp; /* command pointer */ int iseen=0, fseen=0, verbose=0; /* flags */ char action=' '; library lib; if (argc > 0 && argv[0] && *argv[0]) progname = argv[0]; #ifdef VMS progname = vms_basename(progname); #endif if (argc<2) { usage(); /* doesn't return */ } for(cp=0;argv[1][cp];cp++){ switch(argv[1][cp]){ default: usage(); /* doesn't return */ case '-': /* silently ignore */ break; case '?': case 'h': verbose_help(); break; case 'I': if (ap == argc) usage(); list_file=argv[ap++]; if(iseen) printf("Warning: multiple I options. Previous ignored.\n"); iseen=1; break; case 'f': if (ap == argc) usage(); library_file=argv[ap++]; if(fseen) printf("Warning: multiple f options. Previous ignored.\n"); fseen=1; break; case 'C': if (ap == argc) usage(); #ifdef AMIGA if(!getcwd(origdir,sizeof(origdir))){ printf("Can't get current directory.\n"); xexit(EXIT_FAILURE); } #endif if(chdir(argv[ap++])){ printf("Can't chdir to %s\n",argv[--ap]); xexit(EXIT_FAILURE); } break; case 'v': verbose=1; break; case 't': case 'c': case 'x': if(action != ' '){ printf("Only one of t,x,c may be specified.\n"); usage(); } action=argv[1][cp]; break; } } if(argv[ap] && iseen){ printf("Too many arguments.\n"); xexit(EXIT_FAILURE); } switch(action){ default: printf("Internal error - action.\n"); xexit(EXIT_FAILURE); break; case 't': /* list archive */ if (!open_library(NULL, library_file, &lib)) { printf("Can't open dlb file\n"); xexit(EXIT_FAILURE); } for (i = 0; i < lib.nentries; i++) { if (verbose) printf("%-14s %6ld %6ld\n", lib.dir[i].fname, lib.dir[i].foffset, lib.dir[i].fsize); else printf("%s\n", lib.dir[i].fname); } if (verbose) printf("Revision:%ld File count:%ld String size:%ld\n", lib.rev, lib.nentries, lib.strsize); close_library(&lib); xexit(EXIT_SUCCESS); case 'x': { /* extract archive contents */ int f, n; long remainder, total_read; char buf[BUFSIZ]; if (!open_library(NULL, library_file, &lib)) { printf("Can't open dlb file\n"); xexit(EXIT_FAILURE); } for (i = 0; i < lib.nentries; i++) { if (argv[ap]) { /* if files are listed, see if current is wanted */ int c; for (c = ap; c < argc; c++) if (!FILENAME_CMP(lib.dir[i].fname, argv[c])) break; if (c == argc) continue; /* skip */ } else if (!FILENAME_CMP(lib.dir[i].fname, DLB_DIRECTORY)) { /* * Don't extract the directory unless the user * specifically asks for it. * * Perhaps we should never extract the directory??? */ continue; } fseek(lib.fdata, lib.dir[i].foffset, SEEK_SET); f = open(lib.dir[i].fname, O_WRONLY|O_TRUNC|O_BINARY|O_CREAT, 0640); if (f < 0) { printf("Can't create '%s'\n", lib.dir[i].fname); xexit(EXIT_FAILURE); } /* read chunks from library and write them out */ total_read = 0; do { remainder = lib.dir[i].fsize - total_read; if (remainder > (long) sizeof(buf)) r = (int) sizeof(buf); else r = remainder; n = fread(buf, 1, r, lib.fdata); if (n != r) { printf("Read Error in '%s'\n", lib.dir[i].fname); xexit(EXIT_FAILURE); } if (write(f, buf, n) != n) { printf("Write Error in '%s'\n", lib.dir[i].fname); xexit(EXIT_FAILURE); } total_read += n; } while (total_read != lib.dir[i].fsize); (void) close(f); if (verbose) printf("x %s\n", lib.dir[i].fname); } close_library(&lib); xexit(EXIT_SUCCESS); } case 'c': /* create archive */ { libdir ld[MAX_DLB_FILES]; char buf[BUFSIZ]; int fd, out, nfiles = 0; long dir_size, slen, flen, fsiz; boolean rewrite_directory = FALSE; /* * Get names from either/both an argv list and a file * list. This does not do any duplicate checking */ /* get file name in argv list */ if (argv[ap]) { for ( ; ap < argc; ap++, nfiles++) { if (nfiles >= MAX_DLB_FILES) { printf("Too many dlb files! Stopping at %d.\n", MAX_DLB_FILES); break; } ld[nfiles].fname = (char *) alloc(strlen(argv[ap]) + 1); Strcpy(ld[nfiles].fname, argv[ap]); } } if (iseen) { /* want to do a list file */ FILE *list = fopen(list_file, "r"); if (!list) { printf("Can't open %s\n",list_file); xexit(EXIT_FAILURE); } /* get file names, one per line */ for ( ; fgets(buf, sizeof(buf), list); nfiles++) { if (nfiles >= MAX_DLB_FILES) { printf("Too many dlb files! Stopping at %d.\n", MAX_DLB_FILES); break; } *(eos(buf)-1) = '\0'; /* strip newline */ ld[nfiles].fname = (char *) alloc(strlen(buf) + 1); Strcpy(ld[nfiles].fname, buf); } fclose(list); } if (nfiles == 0) { printf("No files to archive\n"); xexit(EXIT_FAILURE); } /* * Get file sizes and name string length. Don't include * the directory information yet. */ for (i = 0, slen = 0, flen = 0; i < nfiles; i++) { fd = open(ld[i].fname, O_RDONLY|O_BINARY, 0); if (fd < 0) { printf("Can't open %s\n", ld[i].fname); xexit(EXIT_FAILURE); } ld[i].fsize = lseek(fd, 0, SEEK_END); ld[i].foffset = flen; slen += strlen(ld[i].fname); /* don't add null (yet) */ flen += ld[i].fsize; close(fd); } /* open output file */ out = open(library_file, O_RDWR|O_TRUNC|O_BINARY|O_CREAT, FCMASK); if (out < 0) { printf("Can't open %s for output\n", library_file); xexit(EXIT_FAILURE); } /* caculate directory size */ dir_size = 40 /* header line (see below) */ + ((nfiles+1)*11) /* handling+file offset+SP+newline */ + slen+strlen(DLB_DIRECTORY); /* file names */ /* write directory */ write_dlb_directory(out, nfiles, ld, slen, dir_size, flen); flen = 0L; /* write each file */ for (i = 0; i < nfiles; i++) { fd = open(ld[i].fname, O_RDONLY|O_BINARY, 0); if (fd < 0) { printf("Can't open input file '%s'\n", ld[i].fname); xexit(EXIT_FAILURE); } if (verbose) printf("%s\n",ld[i].fname); fsiz = 0L; while ((r = read(fd, buf, sizeof buf)) != 0) { if (r == -1) { printf("Read Error in '%s'\n", ld[i].fname); xexit(EXIT_FAILURE); } if (write(out, buf, r) != r) { printf("Write Error in '%s'\n", ld[i].fname); xexit(EXIT_FAILURE); } fsiz += r; } (void) close(fd); if (fsiz != ld[i].fsize) rewrite_directory = TRUE; /* in case directory rewrite is needed */ ld[i].fsize = fsiz; ld[i].foffset = flen; flen += fsiz; } if (rewrite_directory) { if (verbose) printf("(rewriting dlb directory info)\n"); (void) lseek(out, 0, SEEK_SET); /* rewind */ write_dlb_directory(out, nfiles, ld, slen, dir_size, flen); } for (i = 0; i < nfiles; i++) free((genericptr_t) ld[i].fname), ld[i].fname = 0; (void) close(out); xexit(EXIT_SUCCESS); } } #endif /* DLBLIB */ #endif /* DLB */ xexit(EXIT_SUCCESS); /*NOTREACHED*/ return 0; } #ifdef DLB #ifdef DLBLIB static void write_dlb_directory(out, nfiles, ld, slen, dir_size, flen) int out, nfiles; libdir *ld; long slen, dir_size, flen; { char buf[BUFSIZ]; int i; sprintf(buf,"%3ld %8ld %8ld %8ld %8ld\n", (long) DLB_VERS, /* version of dlb file */ (long) nfiles+1, /* # of entries (includes directory) */ /* string length + room for nulls */ (long) slen+strlen(DLB_DIRECTORY)+nfiles+1, (long) dir_size, /* start of first file */ (long) flen+dir_size); /* total file size */ Write(out, buf, strlen(buf)); /* write each file entry */ #define ENTRY_FORMAT "%c%s %8ld\n" sprintf(buf, ENTRY_FORMAT, ENC_NORMAL, DLB_DIRECTORY, (long) 0); Write(out, buf, strlen(buf)); for (i = 0; i < nfiles; i++) { sprintf(buf, ENTRY_FORMAT, ENC_NORMAL, /* encoding */ ld[i].fname, /* name */ ld[i].foffset + dir_size); /* offset */ Write(out, buf, strlen(buf)); } } #endif /* DLBLIB */ #endif /* DLB */ static void xexit(retcd) int retcd; { #ifdef DLB #ifdef AMIGA if (origdir[0]) chdir(origdir); #endif #endif exit(retcd); } #ifdef DLB char * eos(s) char *s; { while (*s) s++; return s; } #ifdef VMS /* essential to have punctuation, to avoid logical names */ static FILE * vms_fopen(filename, mode) const char *filename, *mode; { char tmp[BUFSIZ]; if (!index(filename, '.') && !index(filename, ';')) filename = strcat(strcpy(tmp, filename), ";0"); return fopen(filename, mode, "mbc=16"); } #define fopen vms_fopen #endif /* VMS */ /* * open_library(dlb.c) needs this (which normally comes from src/files.c, * or sys/unix/unixunix.c if file areas are enabled). As yet only the UNIX * port supports file areas so this works. We might need access to the * actual port functions, rather than duplicating them here, if other ports * follow suit. */ #ifdef FILE_AREAS #ifdef UNIX FILE * fopen_datafile_area(filearea, filename, mode) const char *filearea, *filename, *mode; { FILE *fp; char *buf; int lenarea; if (filearea && filename[0]!='/') { lenarea = strlen(filearea); buf = (char *)alloc(lenarea+strlen(filename)+1); strcpy(buf, filearea); strcpy(buf+lenarea, filename); fp = fopen(buf, mode); free(buf); } else fp = fopen(filename, mode); return fp; } #endif #else /* FILE_AREAS */ FILE * fopen_datafile(filename, mode) const char *filename, *mode; { return fopen(filename, mode); } #endif /* FILE_AREAS */ #endif /* DLB */ #ifdef AMIGA #include "date.h" const char amiga_version_string[] = AMIGA_VERSION_STRING; #endif /*dlb_main.c*/ �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/util/dgn_main.c�������������������������������������������������������������������0000664�0000764�0000764�00000011557�10545462320�014554� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* 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. */ /* * This file contains the main function for the parser * and some useful functions needed by yacc */ #include "config.h" #include "dlb.h" /* Macintosh-specific code */ #if defined(__APPLE__) && defined(__MACH__) /* MacOS X has Unix-style files and processes */ # undef MAC #endif #ifdef MAC # ifdef MAC_MPW # define MPWTOOL #include <CursorCtl.h> # else /* put dungeon file in library location */ # define PREFIX ":lib:" # endif #endif #ifndef MPWTOOL # define SpinCursor(x) #endif #define MAX_ERRORS 25 extern int NDECL (yyparse); extern int line_number; const char *fname = "(stdin)"; int fatal_error = 0; int FDECL (main, (int,char **)); void FDECL (yyerror, (const char *)); void FDECL (yywarning, (const char *)); int NDECL (yywrap); void FDECL (init_yyin, (FILE *)); void FDECL (init_yyout, (FILE *)); #ifdef AZTEC_36 FILE *FDECL (freopen, (char *,char *,FILE *)); #endif #define Fprintf (void)fprintf #if defined(__BORLANDC__) && !defined(_WIN32) extern unsigned _stklen = STKSIZ; #endif int main(argc, argv) int argc; char **argv; { char *infile, *outfile, *basename; FILE *fin, *fout; int i, len; boolean errors_encountered = FALSE; #if defined(MAC) && (defined(THINK_C) || defined(__MWERKS__)) char *mark; static char *mac_argv[] = { "dgn_comp", /* dummy argv[0] */ ":dat:dungeon.pdf" }; argc = SIZE(mac_argv); argv = mac_argv; #endif infile = "(stdin)"; fin = stdin; outfile = "(stdout)"; fout = stdout; if (argc == 1) { /* Read standard input */ init_yyin(fin); init_yyout(fout); (void) yyparse(); if (fatal_error > 0) errors_encountered = TRUE; } else { /* Otherwise every argument is a filename */ infile = outfile = (char *)0; for(i=1; i<argc; i++) { if (infile) free(infile); infile = (char*)alloc(strlen(argv[i]) + 1); fname = strcpy(infile, argv[i]); /* the input file had better be a .pdf file */ len = strlen(fname) - 4; /* length excluding suffix */ if (len < 0 || strncmp(".pdf", fname + len, 4)) { Fprintf(stderr, "Error - file name \"%s\" in wrong format.\n", fname); errors_encountered = TRUE; free(infile); continue; } /* build output file name */ #if defined(MAC) && (defined(THINK_C) || defined(__MWERKS__)) /* extract basename from path to infile */ mark = strrchr(infile, ':'); mark = mark ? mark+1 : infile; basename = alloc(strlen(mark) + 1); Strcpy(basename, mark); mark = strchr(basename, '.'); if (mark) *mark = '\0'; #else /* Use the whole name - strip off the last 3 or 4 chars. */ #ifdef VMS /* avoid possible interaction with logical name */ len++; /* retain "." as trailing punctuation */ #endif basename = (char*)alloc(len + 1); (void) strncpy(basename, infile, len); basename[len] = '\0'; #endif if (outfile) free(outfile); #ifdef PREFIX outfile = alloc(strlen(PREFIX) + strlen(basename) + 1); Strcpy(outfile, PREFIX); #else outfile = (char*)alloc(strlen(basename) + 1); outfile[0] = '\0'; #endif (void) strcat(outfile, basename); free(basename); fin = freopen(infile, "r", stdin); if (!fin) { Fprintf(stderr, "Can't open %s for input.\n", infile); perror(infile); errors_encountered = TRUE; continue; } fout = freopen(outfile, WRBMODE, stdout); if (!fout) { Fprintf(stderr, "Can't open %s for output.\n", outfile); perror(outfile); errors_encountered = TRUE; continue; } init_yyin(fin); init_yyout(fout); (void) yyparse(); line_number = 1; if (fatal_error > 0) { errors_encountered = TRUE; fatal_error = 0; } } } if (fout && fout != stdout && fclose(fout) < 0) { Fprintf(stderr, "Can't finish output file."); perror(outfile); errors_encountered = TRUE; } exit(errors_encountered ? EXIT_FAILURE : EXIT_SUCCESS); /*NOTREACHED*/ return 0; } /* * Each time the parser detects an error, it uses this function. * Here we take count of the errors. To continue farther than * MAX_ERRORS wouldn't be reasonable. */ void yyerror(s) const char *s; { Fprintf(stderr, #ifndef MAC_MPW "%s : line %d : %s\n", #else "File %s ; Line %d # %s\n", #endif fname, line_number, s); if (++fatal_error > MAX_ERRORS) { (void) fprintf(stderr,"Too many errors, good bye!\n"); exit(EXIT_FAILURE); } } /* * Just display a warning (that is : a non fatal error) */ void yywarning(s) const char *s; { Fprintf(stderr, #ifndef MAC_MPW "%s : line %d : WARNING : %s\n", #else "File %s ; Line %d # WARNING : %s\n", #endif fname, line_number, s); } int yywrap() { SpinCursor(3); /* Don't know if this is a good place to put it ? Is it called for our grammar ? Often enough ? Too often ? -- h+ */ return 1; } /*dgn_main.c*/ �������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/util/lev_main.c�������������������������������������������������������������������0000664�0000764�0000764�00000116744�10545462320�014576� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* SCCS Id: @(#)lev_main.c 3.4 2002/03/27 */ /* Copyright (c) 1989 by Jean-Christophe Collet */ /* NetHack may be freely redistributed. See license for details. */ /* * This file contains the main function for the parser * and some useful functions needed by yacc */ #define LEVEL_COMPILER 1 /* Enable definition of internal structures */ #include "hack.h" #include "date.h" #include "sp_lev.h" #ifdef STRICT_REF_DEF #include "tcap.h" #endif /* ALI - We need the list of artifact names for artifact doors */ #define MAKEDEFS_C /* We only want the names, not the complete defn */ #include "artilist.h" #undef MAKEDEFS_C #ifdef MAC # ifdef MAC_MPW # define MPWTOOL # include <CursorCtl.h> # else # if !defined(__MACH__) # define PREFIX ":lib:" /* place output files here */ # endif # endif #endif #ifdef WIN_CE #define PREFIX "\\nethack\\dat\\" #endif #ifndef MPWTOOL # define SpinCursor(x) #endif #if defined(AMIGA) && defined(DLB) # define PREFIX "NH:slib/" #endif #ifndef O_WRONLY #include <fcntl.h> #endif #ifndef O_CREAT /* some older BSD systems do not define O_CREAT in <fcntl.h> */ #include <sys/file.h> #endif #ifndef O_BINARY /* used for micros, no-op for others */ # define O_BINARY 0 #endif #if defined(MICRO) || defined(WIN32) # define OMASK FCMASK #else # define OMASK 0644 #endif #define MAX_REGISTERS 10 #define ERR (-1) #define NewTab(type, size) (type **) alloc(sizeof(type *) * size) #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 extern int NDECL (yyparse); extern void FDECL (init_yyin, (FILE *)); extern void FDECL (init_yyout, (FILE *)); int FDECL (main, (int, char **)); void FDECL (yyerror, (const char *)); void FDECL (yywarning, (const char *)); int NDECL (yywrap); int FDECL(get_artifact_id, (char *)); int FDECL(get_floor_type, (CHAR_P)); int FDECL(get_room_type, (char *)); int FDECL(get_trap_type, (char *)); int FDECL(get_monster_id, (char *,CHAR_P)); int FDECL(get_object_id, (char *,CHAR_P)); boolean FDECL(check_monster_char, (CHAR_P)); boolean FDECL(check_object_char, (CHAR_P)); char FDECL(what_map_char, (CHAR_P)); void FDECL(scan_map, (char *)); void NDECL(wallify_map); boolean NDECL(check_subrooms); void FDECL(check_coord, (int,int,const char *)); void NDECL(store_part); void NDECL(store_room); boolean FDECL(write_level_file, (char *,splev *,specialmaze *)); void FDECL(free_rooms, (splev *)); extern void NDECL(monst_init); extern void NDECL(objects_init); extern void NDECL(decl_init); static boolean FDECL(write_common_data, (int,int,lev_init *,long)); static boolean FDECL(write_monsters, (int,char *,monster ***)); static boolean FDECL(write_objects, (int,char *,object ***)); static boolean FDECL(write_engravings, (int,char *,engraving ***)); static boolean FDECL(write_maze, (int,specialmaze *)); static boolean FDECL(write_rooms, (int,splev *)); static void NDECL(init_obj_classes); static struct { const char *name; int type; } trap_types[] = { { "arrow", ARROW_TRAP }, { "dart", DART_TRAP }, { "falling rock", ROCKTRAP }, { "board", SQKY_BOARD }, { "bear", BEAR_TRAP }, { "land mine", LANDMINE }, { "rolling boulder", ROLLING_BOULDER_TRAP }, { "sleep gas", SLP_GAS_TRAP }, { "rust", RUST_TRAP }, { "fire", FIRE_TRAP }, { "pit", PIT }, { "spiked pit", SPIKED_PIT }, { "hole", HOLE }, { "trap door", TRAPDOOR }, { "teleport", TELEP_TRAP }, { "level teleport", LEVEL_TELEP }, { "magic portal", MAGIC_PORTAL }, { "web", WEB }, { "statue", STATUE_TRAP }, { "magic", MAGIC_TRAP }, { "anti magic", ANTI_MAGIC }, { "polymorph", POLY_TRAP }, { 0, 0 } }; static struct { const char *name; int type; } room_types[] = { /* for historical reasons, room types are not contiguous numbers */ /* (type 1 is skipped) */ { "ordinary", OROOM }, { "throne", COURT }, { "swamp", SWAMP }, { "vault", VAULT }, { "beehive", BEEHIVE }, { "morgue", MORGUE }, { "barracks", BARRACKS }, { "zoo", ZOO }, { "delphi", DELPHI }, { "temple", TEMPLE }, { "realzoo", REALZOO }, { "giantcourt", GIANTCOURT }, { "dragonlair", DRAGONLAIR }, { "badfoodshop", BADFOODSHOP }, { "anthole", ANTHOLE }, { "cocknest", COCKNEST }, { "leprehall", LEPREHALL }, { "lemurepit", LEMUREPIT }, { "migohive", MIGOHIVE }, { "fungusfarm", FUNGUSFARM }, { "shop", SHOPBASE }, { "armor shop", ARMORSHOP }, { "scroll shop", SCROLLSHOP }, { "potion shop", POTIONSHOP }, { "weapon shop", WEAPONSHOP }, { "food shop", FOODSHOP }, { "ring shop", RINGSHOP }, { "wand shop", WANDSHOP }, { "tool shop", TOOLSHOP }, { "pet shop", PETSHOP }, /* Stephen White */ { "tin shop", TINSHOP }, /* Robin Johnson */ { "book shop", BOOKSHOP }, { "candle shop", CANDLESHOP }, #ifdef BLACKMARKET { "black market", BLACKSHOP }, #endif /* BLACKMARKET */ { 0, 0 } }; const char *fname = "(stdin)"; int fatal_error = 0; int want_warnings = 0; #ifdef FLEX23_BUG /* Flex 2.3 bug work around; not needed for 2.3.6 or later */ int yy_more_len = 0; #endif extern char tmpmessage[]; extern altar *tmpaltar[]; extern lad *tmplad[]; extern stair *tmpstair[]; extern digpos *tmpdig[]; extern digpos *tmppass[]; extern char *tmpmap[]; extern region *tmpreg[]; extern lev_region *tmplreg[]; extern door *tmpdoor[]; extern room_door *tmprdoor[]; extern trap *tmptrap[]; extern monster *tmpmonst[]; extern object *tmpobj[]; extern drawbridge *tmpdb[]; extern walk *tmpwalk[]; extern gold *tmpgold[]; extern fountain *tmpfountain[]; extern sink *tmpsink[]; extern pool *tmppool[]; extern engraving *tmpengraving[]; extern mazepart *tmppart[]; extern room *tmproom[]; extern lev_region *tmprndlreg[]; extern int n_olist, n_mlist, n_plist; extern unsigned int nrndlreg; extern unsigned int nlreg, nreg, ndoor, ntrap, nmons, nobj; extern unsigned int ndb, nwalk, npart, ndig, npass, nlad, nstair; extern unsigned int naltar, ncorridor, nrooms, ngold, nengraving; extern unsigned int nfountain, npool, nsink; extern unsigned int max_x_map, max_y_map; extern int line_number, colon_line_number; int main(argc, argv) int argc; char **argv; { FILE *fin; int i; boolean errors_encountered = FALSE; #if defined(MAC) && (defined(THINK_C) || defined(__MWERKS__)) static char *mac_argv[] = { "lev_comp", /* dummy argv[0] */ /* KMH -- had to add more from SLASH'EM */ ":dat:Arch.des", ":dat:Barb.des", ":dat:Caveman.des", ":dat:Flame.des", ":dat:Healer.des", ":dat:Hobbit.des", ":dat:Ice.des", ":dat:sokoban.des", ":dat:Knight.des", ":dat:Lycn.des", ":dat:Monk.des", ":dat:Necro.des", ":dat:Priest.des", ":dat:Rogue.des", ":dat:Ranger.des", ":dat:Samurai.des", #ifdef TOURIST ":dat:Tourist.des", #endif ":dat:Slayer.des", /* Should be Uslayer */ ":dat:Valkyrie.des", ":dat:Wizard.des", #ifdef YEOMAN ":dat:Yeoman.des", #endif #ifdef ZOUTHERN ":dat:Zouthern.des" #endif ":dat:beholder.des", ":dat:bigroom.des", ":dat:blkmar.des", ":dat:castle.des", ":dat:caves.des", ":dat:dragons.des", ":dat:endgame.des", ":dat:frnknstn.des", ":dat:gehennom.des", ":dat:giants.des", ":dat:guild.des", ":dat:knox.des", ":dat:kobold-1.des", ":dat:kobold-2.des", ":dat:lich.des", ":dat:mall-1.des", ":dat:mall-2.des", ":dat:medusa.des", ":dat:mtemple.des", ":dat:mines.des", ":dat:newmall.des", ":dat:nightmar.des", ":dat:nymph.des", ":dat:oracle.des", ":dat:rats.des", ":dat:sea.des", ":dat:sokoban.des", ":dat:spiders.des", ":dat:stor-1.des", ":dat:stor-2.des", ":dat:stor-3.des", ":dat:tomb.des", ":dat:tower.des", ":dat:yendor.des" }; argc = SIZE(mac_argv); argv = mac_argv; #endif /* Note: these initializers don't do anything except guarantee that we're linked properly. */ monst_init(); objects_init(); decl_init(); /* this one does something... */ init_obj_classes(); init_yyout(stdout); if (argc == 1) { /* Read standard input */ init_yyin(stdin); (void) yyparse(); if (fatal_error > 0) { errors_encountered = TRUE; } } else { /* Otherwise every argument is a filename */ for(i=1; i<argc; i++) { fname = argv[i]; if(!strcmp(fname, "-w")) { want_warnings++; continue; } fin = freopen(fname, "r", stdin); if (!fin) { (void) fprintf(stderr,"Can't open \"%s\" for input.\n", fname); perror(fname); errors_encountered = TRUE; } else { init_yyin(fin); (void) yyparse(); line_number = 1; if (fatal_error > 0) { errors_encountered = TRUE; fatal_error = 0; } } } } exit(errors_encountered ? EXIT_FAILURE : EXIT_SUCCESS); /*NOTREACHED*/ return 0; } /* * Each time the parser detects an error, it uses this function. * Here we take count of the errors. To continue farther than * MAX_ERRORS wouldn't be reasonable. * Assume that explicit calls from lev_comp.y have the 1st letter * capitalized, to allow printing of the line containing the start of * the current declaration, instead of the beginning of the next declaration. */ void yyerror(s) const char *s; { (void) fprintf(stderr, #ifndef MAC_MPW "%s: line %d : %s\n", #else "File %s ; Line %d :# %s\n", #endif fname, (*s >= 'A' && *s <= 'Z') ? colon_line_number : line_number, s); if (++fatal_error > MAX_ERRORS) { (void) fprintf(stderr,"Too many errors, good bye!\n"); exit(EXIT_FAILURE); } } /* * Just display a warning (that is : a non fatal error) */ void yywarning(s) const char *s; { (void) fprintf(stderr, #ifndef MAC_MPW "%s: line %d : WARNING : %s\n", #else "File %s ; Line %d # WARNING : %s\n", #endif fname, colon_line_number, s); } /* * Stub needed for lex interface. */ int yywrap() { return 1; } /* * Find the index of an artifact in the table, knowing its name. */ int get_artifact_id(s) char *s; { register int i; SpinCursor(3); for(i=0; artifact_names[i]; i++) if (!strcmp(s, artifact_names[i])) return ((int) i); return ERR; } /* * Find the type of floor, knowing its char representation. */ int get_floor_type(c) char c; { int val; SpinCursor(3); val = what_map_char(c); if(val == INVALID_TYPE) { val = ERR; yywarning("Invalid fill character in MAZE declaration"); } return val; } /* * Find the type of a room in the table, knowing its name. */ int get_room_type(s) char *s; { register int i; SpinCursor(3); for(i=0; room_types[i].name; i++) if (!strcmp(s, room_types[i].name)) return ((int) room_types[i].type); return ERR; } /* * Find the type of a trap in the table, knowing its name. */ int get_trap_type(s) char *s; { register int i; SpinCursor(3); for (i=0; trap_types[i].name; i++) if(!strcmp(s,trap_types[i].name)) return trap_types[i].type; return ERR; } /* * Find the index of a monster in the table, knowing its name. */ int get_monster_id(s, c) char *s; char c; { register int i, class; SpinCursor(3); class = c ? def_char_to_monclass(c) : 0; if (class == MAXMCLASSES) return ERR; for (i = LOW_PM; i < NUMMONS; i++) if (!class || class == mons[i].mlet) if (!strcmp(s, mons[i].mname)) return i; return ERR; } /* * Find the index of an object in the table, knowing its name. */ int get_object_id(s, c) char *s; char c; /* class */ { int i, class; const char *objname; SpinCursor(3); class = (c > 0) ? def_char_to_objclass(c) : 0; if (class == MAXOCLASSES) return ERR; for (i = class ? bases[class] : 0; i < NUM_OBJECTS; i++) { if (class && objects[i].oc_class != class) break; objname = obj_descr[i].oc_name; if (objname && !strcmp(s, objname)) return i; } return ERR; } static void init_obj_classes() { int i, class, prev_class; prev_class = -1; for (i = 0; i < NUM_OBJECTS; i++) { class = objects[i].oc_class; if (class != prev_class) { bases[class] = i; prev_class = class; } } } /* * Is the character 'c' a valid monster class ? */ boolean check_monster_char(c) char c; { return (def_char_to_monclass(c) != MAXMCLASSES); } /* * Is the character 'c' a valid object class ? */ boolean check_object_char(c) char c; { return (def_char_to_objclass(c) != MAXOCLASSES); } /* * Convert .des map letter into floor type. */ char what_map_char(c) char c; { SpinCursor(3); switch(c) { case ' ' : return(STONE); case '#' : return(CORR); case '.' : return(ROOM); case '-' : return(HWALL); case '|' : return(VWALL); case '+' : return(DOOR); case 'A' : return(AIR); case 'B' : return(CROSSWALL); /* hack: boundary location */ case 'C' : return(CLOUD); case 'S' : return(SDOOR); case 'H' : return(SCORR); case '{' : return(FOUNTAIN); case '\\' : return(THRONE); case 'K' : #ifdef SINKS return(SINK); #else yywarning("Sinks are not allowed in this version! Ignoring..."); return(ROOM); #endif case '}' : return(MOAT); case 'P' : return(POOL); case 'L' : return(LAVAPOOL); case 'I' : return(ICE); case 'W' : return(WATER); case 'T' : return (TREE); case 'F' : return (IRONBARS); /* Fe = iron */ case 'Z' : /* Kazi */ #ifdef SINKS return(TOILET); #else yywarning("Toilets are not allowed in this version! Ignoring..."); return(ROOM); #endif } return(INVALID_TYPE); } /* * Yep! LEX gives us the map in a raw mode. * Just analyze it here. */ void scan_map(map) char *map; { register int i, len; register char *s1, *s2; int max_len = 0; 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, '\n'); if (s2) { len = (int) (s2 - s1); s1 = s2 + 1; } else { len = (int) strlen(s1); s1 = (char *) 0; } if (len > max_len) max_len = len; } /* Then parse it now */ while (map && *map) { tmpmap[max_hig] = (char *) alloc(max_len); s1 = index(map, '\n'); if (s1) { len = (int) (s1 - map); s1++; } else { len = (int) strlen(map); s1 = map + len; } for(i=0; i<len; i++) if((tmpmap[max_hig][i] = what_map_char(map[i])) == INVALID_TYPE) { Sprintf(msg, "Invalid character @ (%d, %d) - replacing with stone", max_hig, i); yywarning(msg); tmpmap[max_hig][i] = STONE; } while(i < max_len) tmpmap[max_hig][i++] = STONE; map = s1; max_hig++; } /* Memorize boundaries */ max_x_map = max_len - 1; max_y_map = max_hig - 1; /* Store the map into the mazepart structure */ if(max_len > MAP_X_LIM || max_hig > MAP_Y_LIM) { Sprintf(msg, "Map too large! (max %d x %d)", MAP_X_LIM, MAP_Y_LIM); yyerror(msg); } tmppart[npart]->xsize = max_len; tmppart[npart]->ysize = max_hig; tmppart[npart]->map = (char **) alloc(max_hig*sizeof(char *)); for(i = 0; i< max_hig; i++) tmppart[npart]->map[i] = tmpmap[i]; } /* * If we have drawn a map without walls, this allows us to * auto-magically wallify it. */ #define Map_point(x,y) *(tmppart[npart]->map[y] + x) void wallify_map() { unsigned int x, y, xx, yy, lo_xx, lo_yy, hi_xx, hi_yy; for (y = 0; y <= max_y_map; y++) { SpinCursor(3); lo_yy = (y > 0) ? y - 1 : 0; hi_yy = (y < max_y_map) ? y + 1 : max_y_map; for (x = 0; x <= max_x_map; x++) { if (Map_point(x,y) != STONE) continue; lo_xx = (x > 0) ? x - 1 : 0; hi_xx = (x < max_x_map) ? x + 1 : max_x_map; for (yy = lo_yy; yy <= hi_yy; yy++) for (xx = lo_xx; xx <= hi_xx; xx++) if (IS_ROOM(Map_point(xx,yy)) || Map_point(xx,yy) == CROSSWALL) { Map_point(x,y) = (yy != y) ? HWALL : VWALL; yy = hi_yy; /* end `yy' loop */ break; /* end `xx' loop */ } } } } /* * We need to check the subrooms apartenance to an existing room. */ boolean check_subrooms() { unsigned i, j, n_subrooms; boolean found, ok = TRUE; char *last_parent, msg[256]; for (i = 0; i < nrooms; i++) if (tmproom[i]->parent) { found = FALSE; for(j = 0; j < nrooms; j++) if (tmproom[j]->name && !strcmp(tmproom[i]->parent, tmproom[j]->name)) { found = TRUE; break; } if (!found) { Sprintf(msg, "Subroom error : parent room '%s' not found!", tmproom[i]->parent); yyerror(msg); ok = FALSE; } } msg[0] = '\0'; last_parent = msg; for (i = 0; i < nrooms; i++) if (tmproom[i]->parent) { n_subrooms = 0; for(j = i; j < nrooms; j++) { /* * This is by no means perfect, but should cut down the duplicate error * messages by over 90%. The only problem will be when either subrooms * are mixed in the level definition (not likely but possible) or rooms * have subrooms that have subrooms. */ if (!strcmp(tmproom[i]->parent, last_parent)) continue; if (tmproom[j]->parent && !strcmp(tmproom[i]->parent, tmproom[j]->parent)) { n_subrooms++; if(n_subrooms > MAX_SUBROOMS) { Sprintf(msg, "Subroom error: too many subrooms attached to parent room '%s'!", tmproom[i]->parent); yyerror(msg); last_parent = tmproom[i]->parent; ok = FALSE; break; } } } } return ok; } /* * Check that coordinates (x,y) are roomlike locations. * Print warning "str" if they aren't. */ void check_coord(x, y, str) int x, y; const char *str; { char ebuf[60]; if (x >= 0 && y >= 0 && x <= (int)max_x_map && y <= (int)max_y_map && (IS_ROCK(tmpmap[y][x]) || IS_DOOR(tmpmap[y][x]))) { Sprintf(ebuf, "%s placed in wall at (%02d,%02d)?!", str, x, y); yywarning(ebuf); } } /* * Here we want to store the maze part we just got. */ void store_part() { register unsigned i; /* Ok, We got the whole part, now we store it. */ /* The Regions */ if ((tmppart[npart]->nreg = nreg) != 0) { tmppart[npart]->regions = NewTab(region, nreg); for(i=0;i<nreg;i++) tmppart[npart]->regions[i] = tmpreg[i]; } nreg = 0; /* The Level Regions */ if ((tmppart[npart]->nlreg = nlreg) != 0) { tmppart[npart]->lregions = NewTab(lev_region, nlreg); for(i=0;i<nlreg;i++) tmppart[npart]->lregions[i] = tmplreg[i]; } nlreg = 0; /* the random level regions */ if ((tmppart[npart]->nrndlreg = nrndlreg) != 0) { tmppart[npart]->rndlregions = NewTab(lev_region, nrndlreg); for(i=0;i<nrndlreg;i++) tmppart[npart]->rndlregions[i] = tmprndlreg[i]; } nrndlreg = 0; /* the doors */ if ((tmppart[npart]->ndoor = ndoor) != 0) { tmppart[npart]->doors = NewTab(door, ndoor); for(i=0;i<ndoor;i++) tmppart[npart]->doors[i] = tmpdoor[i]; } ndoor = 0; /* the drawbridges */ if ((tmppart[npart]->ndrawbridge = ndb) != 0) { tmppart[npart]->drawbridges = NewTab(drawbridge, ndb); for(i=0;i<ndb;i++) tmppart[npart]->drawbridges[i] = tmpdb[i]; } ndb = 0; /* The walkmaze directives */ if ((tmppart[npart]->nwalk = nwalk) != 0) { tmppart[npart]->walks = NewTab(walk, nwalk); for(i=0;i<nwalk;i++) tmppart[npart]->walks[i] = tmpwalk[i]; } nwalk = 0; /* The non_diggable directives */ if ((tmppart[npart]->ndig = ndig) != 0) { tmppart[npart]->digs = NewTab(digpos, ndig); for(i=0;i<ndig;i++) tmppart[npart]->digs[i] = tmpdig[i]; } ndig = 0; /* The non_passwall directives */ if ((tmppart[npart]->npass = npass) != 0) { tmppart[npart]->passs = NewTab(digpos, npass); for(i=0;i<npass;i++) tmppart[npart]->passs[i] = tmppass[i]; } npass = 0; /* The ladders */ if ((tmppart[npart]->nlad = nlad) != 0) { tmppart[npart]->lads = NewTab(lad, nlad); for(i=0;i<nlad;i++) tmppart[npart]->lads[i] = tmplad[i]; } nlad = 0; /* The stairs */ if ((tmppart[npart]->nstair = nstair) != 0) { tmppart[npart]->stairs = NewTab(stair, nstair); for(i=0;i<nstair;i++) tmppart[npart]->stairs[i] = tmpstair[i]; } nstair = 0; /* The altars */ if ((tmppart[npart]->naltar = naltar) != 0) { tmppart[npart]->altars = NewTab(altar, naltar); for(i=0;i<naltar;i++) tmppart[npart]->altars[i] = tmpaltar[i]; } naltar = 0; /* The fountains */ if ((tmppart[npart]->nfountain = nfountain) != 0) { tmppart[npart]->fountains = NewTab(fountain, nfountain); for(i=0;i<nfountain;i++) tmppart[npart]->fountains[i] = tmpfountain[i]; } nfountain = 0; /* the traps */ if ((tmppart[npart]->ntrap = ntrap) != 0) { tmppart[npart]->traps = NewTab(trap, ntrap); for(i=0;i<ntrap;i++) tmppart[npart]->traps[i] = tmptrap[i]; } ntrap = 0; /* the monsters */ if ((tmppart[npart]->nmonster = nmons) != 0) { tmppart[npart]->monsters = NewTab(monster, nmons); for(i=0;i<nmons;i++) tmppart[npart]->monsters[i] = tmpmonst[i]; } else tmppart[npart]->monsters = 0; nmons = 0; /* the objects */ if ((tmppart[npart]->nobject = nobj) != 0) { tmppart[npart]->objects = NewTab(object, nobj); for(i=0;i<nobj;i++) tmppart[npart]->objects[i] = tmpobj[i]; } else tmppart[npart]->objects = 0; nobj = 0; /* The gold piles */ if ((tmppart[npart]->ngold = ngold) != 0) { tmppart[npart]->golds = NewTab(gold, ngold); for(i=0;i<ngold;i++) tmppart[npart]->golds[i] = tmpgold[i]; } ngold = 0; /* The engravings */ if ((tmppart[npart]->nengraving = nengraving) != 0) { tmppart[npart]->engravings = NewTab(engraving, nengraving); for(i=0;i<nengraving;i++) tmppart[npart]->engravings[i] = tmpengraving[i]; } else tmppart[npart]->engravings = 0; nengraving = 0; npart++; n_plist = n_mlist = n_olist = 0; } /* * Here we want to store the room part we just got. */ void store_room() { register unsigned i; /* Ok, We got the whole room, now we store it. */ /* the doors */ if ((tmproom[nrooms]->ndoor = ndoor) != 0) { tmproom[nrooms]->doors = NewTab(room_door, ndoor); for(i=0;i<ndoor;i++) tmproom[nrooms]->doors[i] = tmprdoor[i]; } ndoor = 0; /* The stairs */ if ((tmproom[nrooms]->nstair = nstair) != 0) { tmproom[nrooms]->stairs = NewTab(stair, nstair); for(i=0;i<nstair;i++) tmproom[nrooms]->stairs[i] = tmpstair[i]; } nstair = 0; /* The altars */ if ((tmproom[nrooms]->naltar = naltar) != 0) { tmproom[nrooms]->altars = NewTab(altar, naltar); for(i=0;i<naltar;i++) tmproom[nrooms]->altars[i] = tmpaltar[i]; } naltar = 0; /* The fountains */ if ((tmproom[nrooms]->nfountain = nfountain) != 0) { tmproom[nrooms]->fountains = NewTab(fountain, nfountain); for(i=0;i<nfountain;i++) tmproom[nrooms]->fountains[i] = tmpfountain[i]; } nfountain = 0; /* The sinks */ if ((tmproom[nrooms]->nsink = nsink) != 0) { tmproom[nrooms]->sinks = NewTab(sink, nsink); for(i=0;i<nsink;i++) tmproom[nrooms]->sinks[i] = tmpsink[i]; } nsink = 0; /* The pools */ if ((tmproom[nrooms]->npool = npool) != 0) { tmproom[nrooms]->pools = NewTab(pool, npool); for(i=0;i<npool;i++) tmproom[nrooms]->pools[i] = tmppool[i]; } npool = 0; /* the traps */ if ((tmproom[nrooms]->ntrap = ntrap) != 0) { tmproom[nrooms]->traps = NewTab(trap, ntrap); for(i=0;i<ntrap;i++) tmproom[nrooms]->traps[i] = tmptrap[i]; } ntrap = 0; /* the monsters */ if ((tmproom[nrooms]->nmonster = nmons) != 0) { tmproom[nrooms]->monsters = NewTab(monster, nmons); for(i=0;i<nmons;i++) tmproom[nrooms]->monsters[i] = tmpmonst[i]; } else tmproom[nrooms]->monsters = 0; nmons = 0; /* the objects */ if ((tmproom[nrooms]->nobject = nobj) != 0) { tmproom[nrooms]->objects = NewTab(object, nobj); for(i=0;i<nobj;i++) tmproom[nrooms]->objects[i] = tmpobj[i]; } else tmproom[nrooms]->objects = 0; nobj = 0; /* The gold piles */ if ((tmproom[nrooms]->ngold = ngold) != 0) { tmproom[nrooms]->golds = NewTab(gold, ngold); for(i=0;i<ngold;i++) tmproom[nrooms]->golds[i] = tmpgold[i]; } ngold = 0; /* The engravings */ if ((tmproom[nrooms]->nengraving = nengraving) != 0) { tmproom[nrooms]->engravings = NewTab(engraving, nengraving); for(i=0;i<nengraving;i++) tmproom[nrooms]->engravings[i] = tmpengraving[i]; } else tmproom[nrooms]->engravings = 0; nengraving = 0; nrooms++; } void store_place_list(int npart, int nlist, int nloc, const struct coord *plist) { int i; char msg[256]; if (!tmppart[npart]->nloc) { tmppart[npart]->nloc = (char *) alloc(MAX_REGISTERS); tmppart[npart]->rloc_x = NewTab(char, MAX_REGISTERS); tmppart[npart]->rloc_y = NewTab(char, MAX_REGISTERS); } if (nlist < tmppart[npart]->nlocset) { Sprintf(msg, "Location registers for place list %d already initialized!", nlist); yyerror(msg); } else if (nlist > tmppart[npart]->nlocset) { Sprintf(msg, "Place list %d out of order!", nlist); yyerror(msg); } else { tmppart[npart]->nlocset++; tmppart[npart]->rloc_x[nlist] = (char *) alloc(n_plist); tmppart[npart]->rloc_y[nlist] = (char *) alloc(n_plist); for(i = 0; i < n_plist; i++) { tmppart[npart]->rloc_x[nlist][i] = plist[i].x; tmppart[npart]->rloc_y[nlist][i] = plist[i].y; } tmppart[npart]->nloc[nlist] = nloc; } } /* * Output some info common to all special levels. */ static boolean write_common_data(fd, typ, init, flgs) int fd, typ; lev_init *init; long flgs; { char c; uchar len; static struct version_info version_data = { VERSION_NUMBER, VERSION_FEATURES, VERSION_SANITY1, VERSION_SANITY2 }; Write(fd, &version_data, sizeof version_data); c = typ; Write(fd, &c, sizeof(c)); /* 1 byte header */ Write(fd, init, sizeof(lev_init)); Write(fd, &flgs, sizeof flgs); len = (uchar) strlen(tmpmessage); Write(fd, &len, sizeof len); if (len) Write(fd, tmpmessage, (int) len); tmpmessage[0] = '\0'; return TRUE; } /* * Output monster info, which needs string fixups, then release memory. */ static boolean write_monsters(fd, nmonster_p, monsters_p) int fd; char *nmonster_p; monster ***monsters_p; { monster *m; char *name, *appr; int j, n = (int)*nmonster_p; Write(fd, nmonster_p, sizeof *nmonster_p); for (j = 0; j < n; j++) { m = (*monsters_p)[j]; name = m->name.str; appr = m->appear_as.str; m->name.str = m->appear_as.str = 0; m->name.len = name ? strlen(name) : 0; m->appear_as.len = appr ? strlen(appr) : 0; Write(fd, m, sizeof *m); if (name) { Write(fd, name, m->name.len); Free(name); } if (appr) { Write(fd, appr, m->appear_as.len); Free(appr); } Free(m); } if (*monsters_p) { Free(*monsters_p); *monsters_p = 0; } *nmonster_p = 0; return TRUE; } /* * Output object info, which needs string fixup, then release memory. */ static boolean write_objects(fd, nobject_p, objects_p) int fd; char *nobject_p; object ***objects_p; { object *o; char *name; int j, n = (int)*nobject_p; Write(fd, nobject_p, sizeof *nobject_p); for (j = 0; j < n; j++) { o = (*objects_p)[j]; name = o->name.str; o->name.str = 0; /* reset in case `len' is narrower */ o->name.len = name ? strlen(name) : 0; Write(fd, o, sizeof *o); if (name) { Write(fd, name, o->name.len); Free(name); } Free(o); } if (*objects_p) { Free(*objects_p); *objects_p = 0; } *nobject_p = 0; return TRUE; } /* * Output engraving info, which needs string fixup, then release memory. */ static boolean write_engravings(fd, nengraving_p, engravings_p) int fd; char *nengraving_p; engraving ***engravings_p; { engraving *e; char *engr; int j, n = (int)*nengraving_p; Write(fd, nengraving_p, sizeof *nengraving_p); for (j = 0; j < n; j++) { e = (*engravings_p)[j]; engr = e->engr.str; e->engr.str = 0; /* reset in case `len' is narrower */ e->engr.len = strlen(engr); Write(fd, e, sizeof *e); Write(fd, engr, e->engr.len); Free(engr); Free(e); } if (*engravings_p) { Free(*engravings_p); *engravings_p = 0; } *nengraving_p = 0; return TRUE; } /* * Open and write maze or rooms file, based on which pointer is non-null. * Return TRUE on success, FALSE on failure. */ boolean write_level_file(filename, room_level, maze_level) char *filename; splev *room_level; specialmaze *maze_level; { int fout; char lbuf[60]; lbuf[0] = '\0'; #ifdef PREFIX Strcat(lbuf, PREFIX); #endif Strcat(lbuf, filename); Strcat(lbuf, LEV_EXT); fout = open(lbuf, O_WRONLY|O_CREAT|O_BINARY, OMASK); if (fout < 0) return FALSE; if (room_level) { if (!write_rooms(fout, room_level)) return FALSE; } else if (maze_level) { if (!write_maze(fout, maze_level)) return FALSE; } else panic("write_level_file"); (void) close(fout); return TRUE; } /* * Here we write the structure of the maze in the specified file (fd). * Also, we have to free the memory allocated via alloc(). */ static boolean write_maze(fd, maze) int fd; specialmaze *maze; { short i,j; mazepart *pt; if (!write_common_data(fd, SP_LEV_MAZE, &(maze->init_lev), maze->flags)) return FALSE; Write(fd, &(maze->filling), sizeof(maze->filling)); Write(fd, &(maze->numpart), sizeof(maze->numpart)); /* Number of parts */ for(i=0;i<maze->numpart;i++) { pt = maze->parts[i]; /* First, write the map */ Write(fd, &(pt->halign), sizeof(pt->halign)); Write(fd, &(pt->valign), sizeof(pt->valign)); Write(fd, &(pt->xsize), sizeof(pt->xsize)); Write(fd, &(pt->ysize), sizeof(pt->ysize)); for(j=0;j<pt->ysize;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); /* level region stuff */ Write(fd, &pt->nlreg, sizeof pt->nlreg); for (j = 0; j < pt->nlreg; j++) { lev_region *l = pt->lregions[j]; char *rname = l->rname.str; l->rname.str = 0; /* reset in case `len' is narrower */ l->rname.len = rname ? strlen(rname) : 0; Write(fd, l, sizeof *l); if (rname) { Write(fd, rname, l->rname.len); Free(rname); } Free(l); } if (pt->nlreg > 0) Free(pt->lregions); /* random level regions registers */ Write(fd, &pt->nrndlreg, sizeof pt->nrndlreg); for (j = 0; j < pt->nrndlreg; j++) { lev_region *l = pt->rndlregions[j]; char *rname = l->rname.str; l->rname.str = 0; /* reset in case `len' is narrower */ l->rname.len = rname ? strlen(rname) : 0; Write(fd, l, sizeof *l); if (rname) { Write(fd, rname, l->rname.len); Free(rname); } Free(l); } if (pt->nrndlreg > 0) Free(pt->rndlregions); /* The random registers */ Write(fd, &(pt->nrobjects), sizeof(pt->nrobjects)); if(pt->nrobjects) { Write(fd, pt->robjects, pt->nrobjects); Free(pt->robjects); } Write(fd, &(pt->nlocset), sizeof(pt->nlocset)); if (pt->nlocset) { Write(fd, pt->nloc, pt->nlocset); for (j = 0; j < pt->nlocset; j++) { Write(fd, pt->rloc_x[j], pt->nloc[j]); Write(fd, pt->rloc_y[j], pt->nloc[j]); Free(pt->rloc_x[j]); Free(pt->rloc_y[j]); } Free(pt->nloc); Free(pt->rloc_x); Free(pt->rloc_y); } Write(fd, &(pt->nrmonst), sizeof(pt->nrmonst)); if(pt->nrmonst) { Write(fd, pt->rmonst, pt->nrmonst); Free(pt->rmonst); } /* subrooms */ Write(fd, &(pt->nreg), sizeof(pt->nreg)); for(j=0;j<pt->nreg;j++) { Write(fd, pt->regions[j], sizeof(region)); Free(pt->regions[j]); } if(pt->nreg > 0) Free(pt->regions); /* the doors */ Write(fd, &(pt->ndoor), sizeof(pt->ndoor)); for(j=0;j<pt->ndoor;j++) { Write(fd, pt->doors[j], sizeof(door)); Free(pt->doors[j]); } if (pt->ndoor > 0) Free(pt->doors); /* The drawbridges */ Write(fd, &(pt->ndrawbridge), sizeof(pt->ndrawbridge)); for(j=0;j<pt->ndrawbridge;j++) { Write(fd, pt->drawbridges[j], sizeof(drawbridge)); Free(pt->drawbridges[j]); } if(pt->ndrawbridge > 0) Free(pt->drawbridges); /* The mazewalk directives */ Write(fd, &(pt->nwalk), sizeof(pt->nwalk)); for(j=0; j<pt->nwalk; j++) { Write(fd, pt->walks[j], sizeof(walk)); Free(pt->walks[j]); } if (pt->nwalk > 0) Free(pt->walks); /* The non_diggable directives */ Write(fd, &(pt->ndig), sizeof(pt->ndig)); for(j=0;j<pt->ndig;j++) { Write(fd, pt->digs[j], sizeof(digpos)); Free(pt->digs[j]); } if (pt->ndig > 0) Free(pt->digs); /* The non_passwall directives */ Write(fd, &(pt->npass), sizeof(pt->npass)); for(j=0;j<pt->npass;j++) { Write(fd, pt->passs[j], sizeof(digpos)); Free(pt->passs[j]); } if (pt->npass > 0) Free(pt->passs); /* The ladders */ Write(fd, &(pt->nlad), sizeof(pt->nlad)); for(j=0;j<pt->nlad;j++) { Write(fd, pt->lads[j], sizeof(lad)); Free(pt->lads[j]); } if (pt->nlad > 0) Free(pt->lads); /* The stairs */ Write(fd, &(pt->nstair), sizeof(pt->nstair)); for(j=0;j<pt->nstair;j++) { Write(fd, pt->stairs[j], sizeof(stair)); Free(pt->stairs[j]); } if (pt->nstair > 0) Free(pt->stairs); /* The altars */ Write(fd, &(pt->naltar), sizeof(pt->naltar)); for(j=0;j<pt->naltar;j++) { Write(fd, pt->altars[j], sizeof(altar)); Free(pt->altars[j]); } if (pt->naltar > 0) Free(pt->altars); /* The fountains */ Write(fd, &(pt->nfountain), sizeof(pt->nfountain)); for(j=0;j<pt->nfountain;j++) { Write(fd, pt->fountains[j], sizeof(fountain)); Free(pt->fountains[j]); } if (pt->nfountain > 0) Free(pt->fountains); /* The traps */ Write(fd, &(pt->ntrap), sizeof(pt->ntrap)); for(j=0;j<pt->ntrap;j++) { Write(fd, pt->traps[j], sizeof(trap)); Free(pt->traps[j]); } if (pt->ntrap) Free(pt->traps); /* The monsters */ if (!write_monsters(fd, &pt->nmonster, &pt->monsters)) return FALSE; /* The objects */ if (!write_objects(fd, &pt->nobject, &pt->objects)) return FALSE; /* The gold piles */ Write(fd, &(pt->ngold), sizeof(pt->ngold)); for(j=0;j<pt->ngold;j++) { Write(fd, pt->golds[j], sizeof(gold)); Free(pt->golds[j]); } if (pt->ngold > 0) Free(pt->golds); /* The engravings */ if (!write_engravings(fd, &pt->nengraving, &pt->engravings)) return FALSE; Free(pt); } Free(maze->parts); maze->parts = (mazepart **)0; maze->numpart = 0; return TRUE; } /* * Here we write the structure of the room level in the specified file (fd). */ static boolean write_rooms(fd, lev) int fd; splev *lev; { short i,j, size; room *pt; if (!write_common_data(fd, SP_LEV_ROOMS, &(lev->init_lev), lev->flags)) return FALSE; /* Random registers */ Write(fd, &lev->nrobjects, sizeof(lev->nrobjects)); if (lev->nrobjects) Write(fd, lev->robjects, lev->nrobjects); Write(fd, &lev->nrmonst, sizeof(lev->nrmonst)); if (lev->nrmonst) Write(fd, lev->rmonst, lev->nrmonst); Write(fd, &(lev->nroom), sizeof(lev->nroom)); /* Number of rooms */ for(i=0;i<lev->nroom;i++) { pt = lev->rooms[i]; /* Room characteristics */ size = (short) (pt->name ? strlen(pt->name) : 0); Write(fd, &size, sizeof(size)); if (size) Write(fd, pt->name, size); size = (short) (pt->parent ? strlen(pt->parent) : 0); Write(fd, &size, sizeof(size)); if (size) Write(fd, pt->parent, size); Write(fd, &(pt->x), sizeof(pt->x)); Write(fd, &(pt->y), sizeof(pt->y)); Write(fd, &(pt->w), sizeof(pt->w)); Write(fd, &(pt->h), sizeof(pt->h)); Write(fd, &(pt->xalign), sizeof(pt->xalign)); Write(fd, &(pt->yalign), sizeof(pt->yalign)); Write(fd, &(pt->rtype), sizeof(pt->rtype)); Write(fd, &(pt->chance), sizeof(pt->chance)); Write(fd, &(pt->rlit), sizeof(pt->rlit)); Write(fd, &(pt->filled), sizeof(pt->filled)); /* the doors */ Write(fd, &(pt->ndoor), sizeof(pt->ndoor)); for(j=0;j<pt->ndoor;j++) Write(fd, pt->doors[j], sizeof(room_door)); /* The stairs */ Write(fd, &(pt->nstair), sizeof(pt->nstair)); for(j=0;j<pt->nstair;j++) Write(fd, pt->stairs[j], sizeof(stair)); /* The altars */ Write(fd, &(pt->naltar), sizeof(pt->naltar)); for(j=0;j<pt->naltar;j++) Write(fd, pt->altars[j], sizeof(altar)); /* The fountains */ Write(fd, &(pt->nfountain), sizeof(pt->nfountain)); for(j=0;j<pt->nfountain;j++) Write(fd, pt->fountains[j], sizeof(fountain)); /* The sinks */ Write(fd, &(pt->nsink), sizeof(pt->nsink)); for(j=0;j<pt->nsink;j++) Write(fd, pt->sinks[j], sizeof(sink)); /* The pools */ Write(fd, &(pt->npool), sizeof(pt->npool)); for(j=0;j<pt->npool;j++) Write(fd, pt->pools[j], sizeof(pool)); /* The traps */ Write(fd, &(pt->ntrap), sizeof(pt->ntrap)); for(j=0;j<pt->ntrap;j++) Write(fd, pt->traps[j], sizeof(trap)); /* The monsters */ if (!write_monsters(fd, &pt->nmonster, &pt->monsters)) return FALSE; /* The objects */ if (!write_objects(fd, &pt->nobject, &pt->objects)) return FALSE; /* The gold piles */ Write(fd, &(pt->ngold), sizeof(pt->ngold)); for(j=0;j<pt->ngold;j++) Write(fd, pt->golds[j], sizeof(gold)); /* The engravings */ if (!write_engravings(fd, &pt->nengraving, &pt->engravings)) return FALSE; } /* The corridors */ Write(fd, &lev->ncorr, sizeof(lev->ncorr)); for (i=0; i < lev->ncorr; i++) Write(fd, lev->corrs[i], sizeof(corridor)); return TRUE; } /* * Release memory allocated to a rooms-style special level; maze-style * levels have the fields freed as they're written; monsters, objects, and * engravings are freed as written for both styles, so not handled here. */ void free_rooms(lev) splev *lev; { room *r; int j, n = lev->nroom; while(n--) { r = lev->rooms[n]; Free(r->name); Free(r->parent); if ((j = r->ndoor) != 0) { while(j--) Free(r->doors[j]); Free(r->doors); } if ((j = r->nstair) != 0) { while(j--) Free(r->stairs[j]); Free(r->stairs); } if ((j = r->naltar) != 0) { while (j--) Free(r->altars[j]); Free(r->altars); } if ((j = r->nfountain) != 0) { while(j--) Free(r->fountains[j]); Free(r->fountains); } if ((j = r->nsink) != 0) { while(j--) Free(r->sinks[j]); Free(r->sinks); } if ((j = r->npool) != 0) { while(j--) Free(r->pools[j]); Free(r->pools); } if ((j = r->ntrap) != 0) { while (j--) Free(r->traps[j]); Free(r->traps); } if ((j = r->ngold) != 0) { while(j--) Free(r->golds[j]); Free(r->golds); } Free(r); lev->rooms[n] = (room *)0; } Free(lev->rooms); lev->rooms = (room **)0; lev->nroom = 0; for (j = 0; j < lev->ncorr; j++) { Free(lev->corrs[j]); lev->corrs[j] = (corridor *)0; } Free(lev->corrs); lev->corrs = (corridor **)0; lev->ncorr = 0; Free(lev->robjects); lev->robjects = (char *)0; lev->nrobjects = 0; Free(lev->rmonst); lev->rmonst = (char *)0; lev->nrmonst = 0; } #ifdef STRICT_REF_DEF /* * Any globals declared in hack.h and descendents which aren't defined * in the modules linked into lev_comp should be defined here. These * definitions can be dummies: their sizes shouldn't matter as long as * as their types are correct; actual values are irrelevant. */ #define ARBITRARY_SIZE 1 /* attrib.c */ struct attribs attrmax, attrmin; /* files.c */ const char *configfile; char lock[ARBITRARY_SIZE]; char SAVEF[ARBITRARY_SIZE]; # ifdef MICRO char SAVEP[ARBITRARY_SIZE]; # endif /* termcap.c */ struct tc_lcl_data tc_lcl_data; # ifdef TEXTCOLOR # ifdef TOS const char *hilites[CLR_MAX]; # else char NEARDATA *hilites[CLR_MAX]; # endif # endif /* trap.c */ const char *traps[TRAPNUM]; /* window.c */ struct window_procs windowprocs; /* xxxtty.c */ # ifdef DEFINE_OSPEED short ospeed; # endif #endif /* STRICT_REF_DEF */ /*lev_main.c*/ ����������������������������slashem-0.0.7E7F3/util/dgn_comp.y�������������������������������������������������������������������0000664�0000764�0000764�00000041745�10545462320�014616� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������%{ /* 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. */ /* * This file contains the Dungeon Compiler code */ /* In case we're using bison in AIX. This definition must be * placed before any other C-language construct in the file * excluding comments and preprocessor directives (thanks IBM * for this wonderful feature...). * * Note: some cpps barf on this 'undefined control' (#pragma). * Addition of the leading space seems to prevent barfage for now, * and AIX will still see the directive in its non-standard locale. */ #ifdef _AIX #pragma alloca /* keep leading space! */ #endif #include "config.h" #include "date.h" #include "dgn_file.h" void FDECL(yyerror, (const char *)); void FDECL(yywarning, (const char *)); int NDECL(yylex); int NDECL(yyparse); int FDECL(getchain, (char *)); int NDECL(check_dungeon); int NDECL(check_branch); int NDECL(check_level); void NDECL(init_dungeon); void NDECL(init_branch); void NDECL(init_level); void NDECL(output_dgn); #define Free(ptr) free((genericptr_t)ptr) #ifdef AMIGA # undef printf #ifndef LATTICE # define memset(addr,val,len) setmem(addr,len,val) #endif #endif #define ERR (-1) static struct couple couple; static struct tmpdungeon tmpdungeon[MAXDUNGEON]; static struct tmplevel tmplevel[LEV_LIMIT]; static struct tmpbranch tmpbranch[BRANCH_LIMIT]; static int in_dungeon = 0, n_dgns = -1, n_levs = -1, n_brs = -1; extern int fatal_error; extern const char *fname; extern FILE *yyin, *yyout; /* from dgn_lex.c */ %} %union { int i; char* str; } %token <i> INTEGER %token <i> A_DUNGEON BRANCH CHBRANCH LEVEL RNDLEVEL CHLEVEL RNDCHLEVEL %token <i> UP_OR_DOWN PROTOFILE DESCRIPTION DESCRIPTOR LEVELDESC %token <i> ALIGNMENT LEVALIGN ENTRY STAIR NO_UP NO_DOWN PORTAL %token <str> STRING %type <i> optional_int direction branch_type bones_tag %start file %% file : /* nothing */ | dungeons { output_dgn(); } ; dungeons : dungeon | dungeons dungeon ; dungeon : dungeonline | dungeondesc | branches | levels ; dungeonline : A_DUNGEON ':' STRING bones_tag rcouple optional_int { init_dungeon(); if (strlen($3)+1 > sizeof(tmpdungeon[n_dgns].name)) yyerror("Dungeon name is too long"); Strcpy(tmpdungeon[n_dgns].name, $3); tmpdungeon[n_dgns].boneschar = (char)$4; tmpdungeon[n_dgns].lev.base = couple.base; tmpdungeon[n_dgns].lev.rand = couple.rand; tmpdungeon[n_dgns].chance = $6; Free($3); } ; optional_int : /* nothing */ { $$ = 0; } | INTEGER { $$ = $1; } ; dungeondesc : entry | descriptions | prototype ; entry : ENTRY ':' INTEGER { /* tmpdungeon[n_dgns].entry_lev = $3; */ yyerror("ENTRY is obsolete!"); } ; descriptions : desc ; desc : DESCRIPTION ':' DESCRIPTOR { if($<i>3 <= TOWN || $<i>3 >= D_ALIGN_CHAOTIC) yyerror("Illegal description - ignoring!"); else tmpdungeon[n_dgns].flags |= $<i>3 ; } | ALIGNMENT ':' DESCRIPTOR { if($<i>3 && $<i>3 < D_ALIGN_CHAOTIC) yyerror("Illegal alignment - ignoring!"); else tmpdungeon[n_dgns].flags |= $<i>3 ; } ; prototype : PROTOFILE ':' STRING { if (strlen($3)+1 > sizeof(tmpdungeon[n_dgns].protoname)) yyerror("Proto name is too long"); Strcpy(tmpdungeon[n_dgns].protoname, $3); Free($3); } ; levels : level1 | level2 | levdesc | chlevel1 | chlevel2 ; level1 : LEVEL ':' STRING bones_tag '@' acouple { init_level(); if (strlen($3)+1 > sizeof(tmplevel[n_levs].name)) yyerror("Level name is too long"); Strcpy(tmplevel[n_levs].name, $3); tmplevel[n_levs].boneschar = (char)$4; tmplevel[n_levs].lev.base = couple.base; tmplevel[n_levs].lev.rand = couple.rand; tmpdungeon[n_dgns].levels++; Free($3); } | RNDLEVEL ':' STRING bones_tag '@' acouple INTEGER { init_level(); if (strlen($3)+1 > sizeof(tmplevel[n_levs].name)) yyerror("Level name is too long"); Strcpy(tmplevel[n_levs].name, $3); tmplevel[n_levs].boneschar = (char)$4; tmplevel[n_levs].lev.base = couple.base; tmplevel[n_levs].lev.rand = couple.rand; tmplevel[n_levs].rndlevs = $7; tmpdungeon[n_dgns].levels++; Free($3); } ; level2 : LEVEL ':' STRING bones_tag '@' acouple INTEGER { init_level(); if (strlen($3)+1 > sizeof(tmplevel[n_levs].name)) yyerror("Level name is too long"); Strcpy(tmplevel[n_levs].name, $3); tmplevel[n_levs].boneschar = (char)$4; tmplevel[n_levs].lev.base = couple.base; tmplevel[n_levs].lev.rand = couple.rand; tmplevel[n_levs].chance = $7; tmpdungeon[n_dgns].levels++; Free($3); } | RNDLEVEL ':' STRING bones_tag '@' acouple INTEGER INTEGER { init_level(); if (strlen($3)+1 > sizeof(tmplevel[n_levs].name)) yyerror("Level name is too long"); Strcpy(tmplevel[n_levs].name, $3); tmplevel[n_levs].boneschar = (char)$4; tmplevel[n_levs].lev.base = couple.base; tmplevel[n_levs].lev.rand = couple.rand; tmplevel[n_levs].chance = $7; tmplevel[n_levs].rndlevs = $8; tmpdungeon[n_dgns].levels++; Free($3); } ; levdesc : LEVELDESC ':' DESCRIPTOR { if($<i>3 >= D_ALIGN_CHAOTIC) yyerror("Illegal description - ignoring!"); else tmplevel[n_levs].flags |= $<i>3 ; } | LEVALIGN ':' DESCRIPTOR { if($<i>3 && $<i>3 < D_ALIGN_CHAOTIC) yyerror("Illegal alignment - ignoring!"); else tmplevel[n_levs].flags |= $<i>3 ; } ; chlevel1 : CHLEVEL ':' STRING bones_tag STRING '+' rcouple { init_level(); if (strlen($3)+1 > sizeof(tmplevel[n_levs].name)) yyerror("Level name is too long"); Strcpy(tmplevel[n_levs].name, $3); tmplevel[n_levs].boneschar = (char)$4; tmplevel[n_levs].chain = getchain($5); tmplevel[n_levs].lev.base = couple.base; tmplevel[n_levs].lev.rand = couple.rand; if(!check_level()) n_levs--; else tmpdungeon[n_dgns].levels++; Free($3); Free($5); } | RNDCHLEVEL ':' STRING bones_tag STRING '+' rcouple INTEGER { init_level(); if (strlen($3)+1 > sizeof(tmplevel[n_levs].name)) yyerror("Level name is too long"); Strcpy(tmplevel[n_levs].name, $3); tmplevel[n_levs].boneschar = (char)$4; tmplevel[n_levs].chain = getchain($5); tmplevel[n_levs].lev.base = couple.base; tmplevel[n_levs].lev.rand = couple.rand; tmplevel[n_levs].rndlevs = $8; if(!check_level()) n_levs--; else tmpdungeon[n_dgns].levels++; Free($3); Free($5); } ; chlevel2 : CHLEVEL ':' STRING bones_tag STRING '+' rcouple INTEGER { init_level(); if (strlen($3)+1 > sizeof(tmplevel[n_levs].name)) yyerror("Level name is too long"); Strcpy(tmplevel[n_levs].name, $3); tmplevel[n_levs].boneschar = (char)$4; tmplevel[n_levs].chain = getchain($5); tmplevel[n_levs].lev.base = couple.base; tmplevel[n_levs].lev.rand = couple.rand; tmplevel[n_levs].chance = $8; if(!check_level()) n_levs--; else tmpdungeon[n_dgns].levels++; Free($3); Free($5); } | RNDCHLEVEL ':' STRING bones_tag STRING '+' rcouple INTEGER INTEGER { init_level(); if (strlen($3)+1 > sizeof(tmplevel[n_levs].name)) yyerror("Level name is too long"); Strcpy(tmplevel[n_levs].name, $3); tmplevel[n_levs].boneschar = (char)$4; tmplevel[n_levs].chain = getchain($5); tmplevel[n_levs].lev.base = couple.base; tmplevel[n_levs].lev.rand = couple.rand; tmplevel[n_levs].chance = $8; tmplevel[n_levs].rndlevs = $9; if(!check_level()) n_levs--; else tmpdungeon[n_dgns].levels++; Free($3); Free($5); } ; branches : branch | chbranch ; branch : BRANCH ':' STRING '@' acouple branch_type direction optional_int { init_branch(); if (strlen($3)+1 > sizeof(tmpbranch[n_brs].name)) yyerror("Dungeon name is too long"); Strcpy(tmpbranch[n_brs].name, $3); tmpbranch[n_brs].lev.base = couple.base; tmpbranch[n_brs].lev.rand = couple.rand; tmpbranch[n_brs].type = $6; tmpbranch[n_brs].up = $7; tmpbranch[n_brs].entry_lev = $8; if(!check_branch()) n_brs--; else tmpdungeon[n_dgns].branches++; Free($3); } ; chbranch : CHBRANCH ':' STRING STRING '+' rcouple branch_type direction optional_int { init_branch(); if (strlen($3)+1 > sizeof(tmpbranch[n_brs].name)) yyerror("Dungeon name is too long"); Strcpy(tmpbranch[n_brs].name, $3); tmpbranch[n_brs].chain = getchain($4); tmpbranch[n_brs].lev.base = couple.base; tmpbranch[n_brs].lev.rand = couple.rand; tmpbranch[n_brs].type = $7; tmpbranch[n_brs].up = $8; tmpbranch[n_brs].entry_lev = $9; if(!check_branch()) n_brs--; else tmpdungeon[n_dgns].branches++; Free($3); Free($4); } ; branch_type : /* nothing */ { $$ = TBR_STAIR; /* two way stair */ } | STAIR { $$ = TBR_STAIR; /* two way stair */ } | NO_UP { $$ = TBR_NO_UP; /* no up staircase */ } | NO_DOWN { $$ = TBR_NO_DOWN; /* no down staircase */ } | PORTAL { $$ = TBR_PORTAL; /* portal connection */ } ; direction : /* nothing */ { $$ = 0; /* defaults to down */ } | UP_OR_DOWN { $$ = $1; } ; bones_tag : STRING { char *p = $1; if (strlen(p) != 1) { if (strcmp(p, "none") != 0) yyerror("Bones marker must be a single char, or \"none\"!"); *p = '\0'; } $$ = *p; Free(p); } ; /* * acouple rules: * * (base, range) where: * * base is either a positive or negative integer with a value * less than or equal to MAXLEVEL. * base > 0 indicates the base level. * base < 0 indicates reverse index (-1 == lowest level) * * range is the random component. * if range is zero, there is no random component. * if range is -1 the dungeon loader will randomize between * the base and the end of the dungeon. * during dungeon load, range is always *added* to the base, * therefore range + base(converted) must not exceed MAXLEVEL. */ acouple : '(' INTEGER ',' INTEGER ')' { if ($2 < -MAXLEVEL || $2 > MAXLEVEL) { yyerror("Abs base out of dlevel range - zeroing!"); couple.base = couple.rand = 0; } else if ($4 < -1 || (($2 < 0) ? (MAXLEVEL + $2 + $4 + 1) > MAXLEVEL : ($2 + $4) > MAXLEVEL)) { yyerror("Abs range out of dlevel range - zeroing!"); couple.base = couple.rand = 0; } else { couple.base = $2; couple.rand = $4; } } ; /* * rcouple rules: * * (base, range) where: * * base is either a positive or negative integer with a value * less than or equal to MAXLEVEL. * base > 0 indicates a forward index. * base < 0 indicates a reverse index. * base == 0 indicates on the parent level. * * range is the random component. * if range is zero, there is no random component. * during dungeon load, range is always *added* to the base, * range + base(converted) may be very large. The dungeon * loader will then correct to "between here and the top/bottom". * * There is no practical way of specifying "between here and the * nth / nth last level". */ rcouple : '(' INTEGER ',' INTEGER ')' { if ($2 < -MAXLEVEL || $2 > MAXLEVEL) { yyerror("Rel base out of dlevel range - zeroing!"); couple.base = couple.rand = 0; } else { couple.base = $2; couple.rand = $4; } } ; %% void init_dungeon() { if(++n_dgns > MAXDUNGEON) { (void) fprintf(stderr, "FATAL - Too many dungeons (limit: %d).\n", MAXDUNGEON); (void) fprintf(stderr, "To increase the limit edit MAXDUNGEON in global.h\n"); exit(EXIT_FAILURE); } in_dungeon = 1; tmpdungeon[n_dgns].lev.base = 0; tmpdungeon[n_dgns].lev.rand = 0; tmpdungeon[n_dgns].chance = 100; Strcpy(tmpdungeon[n_dgns].name, ""); Strcpy(tmpdungeon[n_dgns].protoname, ""); tmpdungeon[n_dgns].flags = 0; tmpdungeon[n_dgns].levels = 0; tmpdungeon[n_dgns].branches = 0; } void init_level() { if(++n_levs > LEV_LIMIT) { yyerror("FATAL - Too many special levels defined."); exit(EXIT_FAILURE); } tmplevel[n_levs].lev.base = 0; tmplevel[n_levs].lev.rand = 0; tmplevel[n_levs].chance = 100; tmplevel[n_levs].rndlevs = 0; tmplevel[n_levs].flags = 0; Strcpy(tmplevel[n_levs].name, ""); tmplevel[n_levs].chain = -1; } void init_branch() { if(++n_brs > BRANCH_LIMIT) { yyerror("FATAL - Too many special levels defined."); exit(EXIT_FAILURE); } tmpbranch[n_brs].lev.base = 0; tmpbranch[n_brs].lev.rand = 0; Strcpy(tmpbranch[n_brs].name, ""); tmpbranch[n_brs].chain = -1; tmpbranch[n_brs].entry_lev = 0; } int getchain(s) char *s; { int i; if(strlen(s)) { for(i = n_levs - tmpdungeon[n_dgns].levels + 1; i <= n_levs; i++) if(!strcmp(tmplevel[i].name, s)) return i; yyerror("Can't locate the specified chain level."); return(-2); } return(-1); } /* * Consistancy checking routines: * * - A dungeon must have a unique name. * - A dungeon must have a originating "branch" command * (except, of course, for the first dungeon). * - A dungeon must have a proper depth (at least (1, 0)). */ int check_dungeon() { int i; for(i = 0; i < n_dgns; i++) if(!strcmp(tmpdungeon[i].name, tmpdungeon[n_dgns].name)) { yyerror("Duplicate dungeon name."); return(0); } if(n_dgns) for(i = 0; i < n_brs - tmpdungeon[n_dgns].branches; i++) { if(!strcmp(tmpbranch[i].name, tmpdungeon[n_dgns].name)) break; if(i >= n_brs - tmpdungeon[n_dgns].branches) { yyerror("Dungeon cannot be reached."); return(0); } } if(tmpdungeon[n_dgns].lev.base <= 0 || tmpdungeon[n_dgns].lev.rand < 0) { yyerror("Invalid dungeon depth specified."); return(0); } return(1); /* OK */ } /* * - A level must have a unique level name. * - If chained, the level used as reference for the chain * must be in this dungeon, must be previously defined, and * the level chained from must be "non-probabilistic" (ie. * have a 100% chance of existing). */ int check_level() { int i; if(!in_dungeon) { yyerror("Level defined outside of dungeon."); return(0); } for(i = 0; i < n_levs; i++) if(!strcmp(tmplevel[i].name, tmplevel[n_levs].name)) { yyerror("Duplicate level name."); return(0); } if(tmplevel[i].chain == -2) { yyerror("Invalid level chain reference."); return(0); } else if(tmplevel[i].chain != -1) { /* there is a chain */ /* KMH -- tmplevel[tmpbranch[i].chain].chance was in error */ if(tmplevel[tmplevel[i].chain].chance != 100) { yyerror("Level cannot chain from a probabilistic level."); return(0); } else if(tmplevel[i].chain == n_levs) { yyerror("A level cannot chain to itself!"); return(0); } } return(1); /* OK */ } /* * - A branch may not branch backwards - to avoid branch loops. * - A branch name need not be unique. * (ie. You can have many entry points to each dungeon). * - If chained, the level used as reference for the chain * must be in this dungeon, must be previously defined, and * the level chained from must be "non-probabilistic" (ie. * have a 100% chance of existing). */ int check_branch() { int i; if(!in_dungeon) { yyerror("Branch defined outside of dungeon."); return(0); } #if 0 for(i = 0; i < n_dgns; i++) if(!strcmp(tmpdungeon[i].name, tmpbranch[n_brs].name)) { yyerror("Reverse branching not allowed."); return(0); } #endif if(tmpbranch[n_dgns].chain == -2) { yyerror("Invalid branch chain reference."); return(0); } else if(tmpbranch[n_dgns].chain != -1) { /* it is chained */ if(tmplevel[tmpbranch[n_dgns].chain].chance != 100) { yyerror("Branch cannot chain from a probabilistic level."); return(0); } } return(1); /* OK */ } /* * Output the dungon definition into a file. * * The file will have the following format: * * [ nethack version ID ] * [ number of dungeons ] * [ first dungeon struct ] * [ levels for the first dungeon ] * ... * [ branches for the first dungeon ] * ... * [ second dungeon struct ] * ... */ void output_dgn() { int nd, cl = 0, nl = 0, cb = 0, nb = 0; static struct version_info version_data = { VERSION_NUMBER, VERSION_FEATURES, VERSION_SANITY1, VERSION_SANITY2 }; if(++n_dgns <= 0) { yyerror("FATAL - no dungeons were defined."); exit(EXIT_FAILURE); } if (fwrite((char *)&version_data, sizeof version_data, 1, yyout) != 1) { yyerror("FATAL - output failure."); exit(EXIT_FAILURE); } (void) fwrite((char *)&n_dgns, sizeof(int), 1, yyout); for (nd = 0; nd < n_dgns; nd++) { (void) fwrite((char *)&tmpdungeon[nd], sizeof(struct tmpdungeon), 1, yyout); nl += tmpdungeon[nd].levels; for(; cl < nl; cl++) (void) fwrite((char *)&tmplevel[cl], sizeof(struct tmplevel), 1, yyout); nb += tmpdungeon[nd].branches; for(; cb < nb; cb++) (void) fwrite((char *)&tmpbranch[cb], sizeof(struct tmpbranch), 1, yyout); } /* apparently necessary for Think C 5.x, otherwise harmless */ (void) fflush(yyout); } /*dgn_comp.y*/ ���������������������������slashem-0.0.7E7F3/util/lev_comp.y�������������������������������������������������������������������0000664�0000764�0000764�00000123666�10545462320�014637� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������%{ /* 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. */ /* * This file contains the Level Compiler code * It may handle special mazes & special room-levels */ #define LEVEL_COMPILER 1 /* Enable definition of internal structures */ /* In case we're using bison in AIX. This definition must be * placed before any other C-language construct in the file * excluding comments and preprocessor directives (thanks IBM * for this wonderful feature...). * * Note: some cpps barf on this 'undefined control' (#pragma). * Addition of the leading space seems to prevent barfage for now, * and AIX will still see the directive. */ #ifdef _AIX #pragma alloca /* keep leading space! */ #endif #include "hack.h" #include "sp_lev.h" #define MAX_REGISTERS 10 #define ERR (-1) /* many types of things are put in chars for transference to NetHack. * since some systems will use signed chars, limit everybody to the * same number for portability. */ #define MAX_OF_TYPE 128 #define New(type) \ (type *) memset((genericptr_t)alloc(sizeof(type)), 0, sizeof(type)) #define NewTab(type, size) (type **) alloc(sizeof(type *) * size) #define Free(ptr) free((genericptr_t)ptr) extern void FDECL(yyerror, (const char *)); extern void FDECL(yywarning, (const char *)); extern int NDECL(yylex); int NDECL(yyparse); extern int FDECL(get_artifact_id, (char *)); extern int FDECL(get_floor_type, (CHAR_P)); extern int FDECL(get_room_type, (char *)); extern int FDECL(get_trap_type, (char *)); extern int FDECL(get_monster_id, (char *,CHAR_P)); extern int FDECL(get_object_id, (char *,CHAR_P)); extern boolean FDECL(check_monster_char, (CHAR_P)); extern boolean FDECL(check_object_char, (CHAR_P)); extern char FDECL(what_map_char, (CHAR_P)); extern void FDECL(scan_map, (char *)); extern void NDECL(wallify_map); extern boolean NDECL(check_subrooms); extern void FDECL(check_coord, (int,int,const char *)); extern void NDECL(store_part); extern void NDECL(store_room); extern void FDECL(store_place_list, (int,int,int,const struct coord *)); extern boolean FDECL(write_level_file, (char *,splev *,specialmaze *)); extern void FDECL(free_rooms, (splev *)); static struct reg { int x1, y1; int x2, y2; } current_region; static struct coord current_coord, current_align; static struct size { int height; int width; } current_size; char tmpmessage[256]; digpos *tmppass[32]; char *tmpmap[ROWNO]; digpos *tmpdig[MAX_OF_TYPE]; region *tmpreg[MAX_OF_TYPE]; lev_region *tmplreg[MAX_OF_TYPE]; door *tmpdoor[MAX_OF_TYPE]; drawbridge *tmpdb[MAX_OF_TYPE]; walk *tmpwalk[MAX_OF_TYPE]; lev_region *tmprndlreg[MAX_REGISTERS]; room_door *tmprdoor[MAX_OF_TYPE]; trap *tmptrap[MAX_OF_TYPE]; monster *tmpmonst[MAX_OF_TYPE]; object *tmpobj[MAX_OF_TYPE]; altar *tmpaltar[MAX_OF_TYPE]; lad *tmplad[MAX_OF_TYPE]; stair *tmpstair[MAX_OF_TYPE]; gold *tmpgold[MAX_OF_TYPE]; engraving *tmpengraving[MAX_OF_TYPE]; fountain *tmpfountain[MAX_OF_TYPE]; sink *tmpsink[MAX_OF_TYPE]; pool *tmppool[MAX_OF_TYPE]; mazepart *tmppart[10]; room *tmproom[MAXNROFROOMS*2]; corridor *tmpcor[MAX_OF_TYPE]; static specialmaze maze; static splev special_lev; static lev_init init_lev; static char olist[MAX_REGISTERS], mlist[MAX_REGISTERS]; static struct coord plist[MAX_REGISTERS]; int n_olist = 0, n_mlist = 0, n_plist = 0; unsigned int nrndlreg = 0; unsigned int nlreg = 0, nreg = 0, ndoor = 0, ntrap = 0, nmons = 0, nobj = 0; unsigned int ndb = 0, nwalk = 0, npart = 0, ndig = 0, nlad = 0, nstair = 0; unsigned int naltar = 0, ncorridor = 0, nrooms = 0, ngold = 0, nengraving = 0; unsigned int nfountain = 0, npool = 0, nsink = 0, npass = 0; static int lev_flags = 0; unsigned int max_x_map, max_y_map; static xchar in_room; extern int fatal_error; extern int want_warnings; extern const char *fname; %} %union { int i; char* map; struct { xchar room; xchar wall; xchar door; } corpos; } %token <i> CHAR INTEGER BOOLEAN PERCENT %token <i> MESSAGE_ID MAZE_ID LEVEL_ID LEV_INIT_ID GEOMETRY_ID NOMAP_ID %token <i> OBJECT_ID COBJECT_ID MONSTER_ID TRAP_ID DOOR_ID DRAWBRIDGE_ID %token <i> MAZEWALK_ID WALLIFY_ID REGION_ID FILLING %token <i> RANDOM_OBJECTS_ID RANDOM_MONSTERS_ID RANDOM_PLACES_ID %token <i> ALTAR_ID LADDER_ID STAIR_ID NON_DIGGABLE_ID NON_PASSWALL_ID ROOM_ID %token <i> PORTAL_ID TELEPRT_ID BRANCH_ID LEV CHANCE_ID %token <i> CORRIDOR_ID GOLD_ID ENGRAVING_ID FOUNTAIN_ID POOL_ID SINK_ID NONE %token <i> RAND_CORRIDOR_ID DOOR_STATE LIGHT_STATE CURSE_TYPE ENGRAVING_TYPE %token <i> DIRECTION RANDOM_TYPE O_REGISTER M_REGISTER P_REGISTER A_REGISTER %token <i> ALIGNMENT LEFT_OR_RIGHT CENTER TOP_OR_BOT ALTAR_TYPE UP_OR_DOWN %token <i> SUBROOM_ID NAME_ID FLAGS_ID FLAG_TYPE MON_ATTITUDE MON_ALERTNESS %token <i> MON_APPEARANCE %token <i> CONTAINED %token <i> OBJFLAG_TYPE OBJFLAGS_ID RANDOMREGION_ID R_REGISTER %token <i> ',' ':' '(' ')' '[' ']' %token <map> STRING MAP_ID %type <i> h_justif v_justif trap_name room_type door_state light_state %type <i> alignment altar_type a_register roomfill filling door_pos %type <i> door_wall walled secret amount chance %type <i> engraving_type flags flag_list prefilled lev_region lev_init %type <i> monster monster_c m_register object object_c o_register %type <i> obj_flag_list %type <map> string maze_def level_def m_name o_name %type <corpos> corr_spec %start file %% file : /* nothing */ | levels ; levels : level | level levels ; level : maze_level | room_level ; maze_level : maze_def flags lev_init messages regions { unsigned i; if (fatal_error > 0) { (void) fprintf(stderr, "%s : %d errors detected. No output created!\n", fname, fatal_error); } else { maze.flags = $2; (void) memcpy((genericptr_t)&(maze.init_lev), (genericptr_t)&(init_lev), sizeof(lev_init)); maze.numpart = npart; maze.parts = NewTab(mazepart, npart); for(i=0;i<npart;i++) maze.parts[i] = tmppart[i]; if (!write_level_file($1, (splev *)0, &maze)) { yyerror("Can't write output file!!"); exit(EXIT_FAILURE); } npart = 0; } Free($1); } ; room_level : level_def flags lev_init messages rreg_init rooms corridors_def { unsigned i; if (fatal_error > 0) { (void) fprintf(stderr, "%s : %d errors detected. No output created!\n", fname, fatal_error); } else { special_lev.flags = (long) $2; (void) memcpy( (genericptr_t)&(special_lev.init_lev), (genericptr_t)&(init_lev), sizeof(lev_init)); special_lev.nroom = nrooms; special_lev.rooms = NewTab(room, nrooms); for(i=0; i<nrooms; i++) special_lev.rooms[i] = tmproom[i]; special_lev.ncorr = ncorridor; special_lev.corrs = NewTab(corridor, ncorridor); for(i=0; i<ncorridor; i++) special_lev.corrs[i] = tmpcor[i]; if (check_subrooms()) { if (!write_level_file($1, &special_lev, (specialmaze *)0)) { yyerror("Can't write output file!!"); exit(EXIT_FAILURE); } } free_rooms(&special_lev); nrooms = 0; ncorridor = 0; } Free($1); } ; level_def : LEVEL_ID ':' string { if (index($3, '.')) yyerror("Invalid dot ('.') in level name."); if ((int) strlen($3) > 8) yyerror("Level names limited to 8 characters."); $$ = $3; special_lev.nrmonst = special_lev.nrobjects = 0; n_mlist = n_olist = 0; } ; lev_init : /* nothing */ { /* in case we're processing multiple files, explicitly clear any stale settings */ (void) memset((genericptr_t) &init_lev, 0, sizeof init_lev); init_lev.init_present = FALSE; $$ = 0; } | LEV_INIT_ID ':' CHAR ',' CHAR ',' BOOLEAN ',' BOOLEAN ',' light_state ',' walled { init_lev.init_present = TRUE; init_lev.fg = what_map_char((char) $3); if (init_lev.fg == INVALID_TYPE) yyerror("Invalid foreground type."); init_lev.bg = what_map_char((char) $5); if (init_lev.bg == INVALID_TYPE) yyerror("Invalid background type."); init_lev.smoothed = $7; init_lev.joined = $9; if (init_lev.joined && init_lev.fg != CORR && init_lev.fg != ROOM) yyerror("Invalid foreground type for joined map."); init_lev.lit = $11; init_lev.walled = $13; $$ = 1; } ; walled : BOOLEAN | RANDOM_TYPE ; flags : /* nothing */ { $$ = 0; } | FLAGS_ID ':' flag_list { $$ = lev_flags; lev_flags = 0; /* clear for next user */ } ; flag_list : FLAG_TYPE ',' flag_list { lev_flags |= $1; } | FLAG_TYPE { lev_flags |= $1; } ; messages : /* nothing */ | message messages ; message : MESSAGE_ID ':' STRING { int i, j; i = (int) strlen($3) + 1; j = (int) strlen(tmpmessage); if (i + j > 255) { yyerror("Message string too long (>256 characters)"); } else { if (j) tmpmessage[j++] = '\n'; (void) strncpy(tmpmessage+j, $3, i - 1); tmpmessage[j + i - 1] = 0; } Free($3); } ; rreg_init : /* nothing */ | rreg_init init_rreg ; init_rreg : RANDOM_OBJECTS_ID ':' object_list { if(special_lev.nrobjects) { yyerror("Object registers already initialized!"); } else { special_lev.nrobjects = n_olist; special_lev.robjects = (char *) alloc(n_olist); (void) memcpy((genericptr_t)special_lev.robjects, (genericptr_t)olist, n_olist); } } | RANDOM_MONSTERS_ID ':' monster_list { if(special_lev.nrmonst) { yyerror("Monster registers already initialized!"); } else { special_lev.nrmonst = n_mlist; special_lev.rmonst = (char *) alloc(n_mlist); (void) memcpy((genericptr_t)special_lev.rmonst, (genericptr_t)mlist, n_mlist); } } ; rooms : /* Nothing - dummy room for use with INIT_MAP */ { tmproom[nrooms] = New(room); tmproom[nrooms]->name = (char *) 0; tmproom[nrooms]->parent = (char *) 0; tmproom[nrooms]->rtype = 0; tmproom[nrooms]->rlit = 0; tmproom[nrooms]->xalign = ERR; tmproom[nrooms]->yalign = ERR; tmproom[nrooms]->x = 0; tmproom[nrooms]->y = 0; tmproom[nrooms]->w = 2; tmproom[nrooms]->h = 2; in_room = 1; } | roomlist ; roomlist : aroom | aroom roomlist ; corridors_def : random_corridors | corridors ; random_corridors: RAND_CORRIDOR_ID { tmpcor[0] = New(corridor); tmpcor[0]->src.room = -1; ncorridor = 1; } ; corridors : /* nothing */ | corridors corridor ; corridor : CORRIDOR_ID ':' corr_spec ',' corr_spec { tmpcor[ncorridor] = New(corridor); tmpcor[ncorridor]->src.room = $3.room; tmpcor[ncorridor]->src.wall = $3.wall; tmpcor[ncorridor]->src.door = $3.door; tmpcor[ncorridor]->dest.room = $5.room; tmpcor[ncorridor]->dest.wall = $5.wall; tmpcor[ncorridor]->dest.door = $5.door; ncorridor++; if (ncorridor >= MAX_OF_TYPE) { yyerror("Too many corridors in level!"); ncorridor--; } } | CORRIDOR_ID ':' corr_spec ',' INTEGER { tmpcor[ncorridor] = New(corridor); tmpcor[ncorridor]->src.room = $3.room; tmpcor[ncorridor]->src.wall = $3.wall; tmpcor[ncorridor]->src.door = $3.door; tmpcor[ncorridor]->dest.room = -1; tmpcor[ncorridor]->dest.wall = $5; ncorridor++; if (ncorridor >= MAX_OF_TYPE) { yyerror("Too many corridors in level!"); ncorridor--; } } ; corr_spec : '(' INTEGER ',' DIRECTION ',' door_pos ')' { if ((unsigned) $2 >= nrooms) yyerror("Wrong room number!"); $$.room = $2; $$.wall = $4; $$.door = $6; } ; aroom : room_def room_details { store_room(); } | subroom_def room_details { store_room(); } ; subroom_def : SUBROOM_ID ':' room_type ',' light_state ',' subroom_pos ',' room_size ',' string roomfill { tmproom[nrooms] = New(room); tmproom[nrooms]->parent = $11; tmproom[nrooms]->name = (char *) 0; tmproom[nrooms]->rtype = $3; tmproom[nrooms]->rlit = $5; tmproom[nrooms]->filled = $12; tmproom[nrooms]->xalign = ERR; tmproom[nrooms]->yalign = ERR; tmproom[nrooms]->x = current_coord.x; tmproom[nrooms]->y = current_coord.y; tmproom[nrooms]->w = current_size.width; tmproom[nrooms]->h = current_size.height; in_room = 1; } ; room_def : ROOM_ID ':' room_type ',' light_state ',' room_pos ',' room_align ',' room_size roomfill { tmproom[nrooms] = New(room); tmproom[nrooms]->name = (char *) 0; tmproom[nrooms]->parent = (char *) 0; tmproom[nrooms]->rtype = $3; tmproom[nrooms]->rlit = $5; tmproom[nrooms]->filled = $12; tmproom[nrooms]->xalign = current_align.x; tmproom[nrooms]->yalign = current_align.y; tmproom[nrooms]->x = current_coord.x; tmproom[nrooms]->y = current_coord.y; tmproom[nrooms]->w = current_size.width; tmproom[nrooms]->h = current_size.height; in_room = 1; } ; roomfill : /* nothing */ { $$ = 1; } | ',' BOOLEAN { $$ = $2; } ; room_pos : '(' INTEGER ',' INTEGER ')' { if ( $2 < 1 || $2 > 5 || $4 < 1 || $4 > 5 ) { yyerror("Room position should be between 1 & 5!"); } else { current_coord.x = $2; current_coord.y = $4; } } | RANDOM_TYPE { current_coord.x = current_coord.y = ERR; } ; subroom_pos : '(' INTEGER ',' INTEGER ')' { if ( $2 < 0 || $4 < 0) { yyerror("Invalid subroom position !"); } else { current_coord.x = $2; current_coord.y = $4; } } | RANDOM_TYPE { current_coord.x = current_coord.y = ERR; } ; room_align : '(' h_justif ',' v_justif ')' { current_align.x = $2; current_align.y = $4; } | RANDOM_TYPE { current_align.x = current_align.y = ERR; } ; room_size : '(' INTEGER ',' INTEGER ')' { current_size.width = $2; current_size.height = $4; } | RANDOM_TYPE { current_size.height = current_size.width = ERR; } ; room_details : /* nothing */ | room_details room_detail ; room_detail : room_name | room_chance | room_door | monster_detail | object_detail | object_flags | trap_detail | altar_detail | fountain_detail | sink_detail | pool_detail | gold_detail | engraving_detail | stair_detail ; room_name : NAME_ID ':' string { if (tmproom[nrooms]->name) yyerror("This room already has a name!"); else tmproom[nrooms]->name = $3; } ; room_chance : CHANCE_ID ':' INTEGER { if (tmproom[nrooms]->chance) yyerror("This room already assigned a chance!"); else if (tmproom[nrooms]->rtype == OROOM) yyerror("Only typed rooms can have a chance!"); else if ($3 < 1 || $3 > 99) yyerror("The chance is supposed to be percentile."); else tmproom[nrooms]->chance = $3; } ; room_door : DOOR_ID ':' secret ',' door_state ',' door_wall ',' door_pos { /* ERR means random here */ if ($7 == ERR && $9 != ERR) { yyerror("If the door wall is random, so must be its pos!"); tmprdoor[ndoor] = (struct room_door *)0; } else { tmprdoor[ndoor] = New(room_door); tmprdoor[ndoor]->secret = $3; tmprdoor[ndoor]->mask = $5; tmprdoor[ndoor]->wall = $7; tmprdoor[ndoor]->pos = $9; tmprdoor[ndoor]->arti_key = 0; } } room_door_infos { if (tmprdoor[ndoor]) { ndoor++; if (ndoor >= MAX_OF_TYPE) { yyerror("Too many doors in room!"); ndoor--; } } } ; room_door_infos : /* nothing */ | room_door_infos room_door_info ; room_door_info : ',' string { int token = get_artifact_id($2); if (token == ERR) { char ebuf[100]; Sprintf(ebuf, "Undefined artifact key \"%s\"", $2); yyerror(ebuf); } else if (tmprdoor[ndoor]) tmprdoor[ndoor]->arti_key = token; } ; secret : BOOLEAN | RANDOM_TYPE ; door_wall : DIRECTION | RANDOM_TYPE ; door_pos : INTEGER | RANDOM_TYPE ; maze_def : MAZE_ID ':' string ',' filling { maze.filling = (schar) $5; if (index($3, '.')) yyerror("Invalid dot ('.') in level name."); if ((int) strlen($3) > 8) yyerror("Level names limited to 8 characters."); $$ = $3; in_room = 0; n_plist = n_mlist = n_olist = 0; } ; filling : CHAR { $$ = get_floor_type((char)$1); } | RANDOM_TYPE { $$ = -1; } ; regions : aregion | aregion regions ; aregion : map_definition reg_init map_details { store_part(); } ; map_definition : NOMAP_ID { tmppart[npart] = New(mazepart); tmppart[npart]->halign = 1; tmppart[npart]->valign = 1; tmppart[npart]->nrobjects = 0; tmppart[npart]->nloc = 0; tmppart[npart]->nrmonst = 0; tmppart[npart]->xsize = 1; tmppart[npart]->ysize = 1; tmppart[npart]->map = (char **) alloc(sizeof(char *)); tmppart[npart]->map[0] = (char *) alloc(1); tmppart[npart]->map[0][0] = STONE; max_x_map = COLNO-1; max_y_map = ROWNO; } | map_geometry MAP_ID { tmppart[npart] = New(mazepart); tmppart[npart]->halign = $<i>1 % 10; tmppart[npart]->valign = $<i>1 / 10; tmppart[npart]->nrobjects = 0; tmppart[npart]->nloc = 0; tmppart[npart]->nrmonst = 0; scan_map($2); Free($2); } ; map_geometry : GEOMETRY_ID ':' h_justif ',' v_justif { $<i>$ = $<i>3 + ($<i>5 * 10); } ; h_justif : LEFT_OR_RIGHT | CENTER ; v_justif : TOP_OR_BOT | CENTER ; reg_init : /* nothing */ | reg_init init_reg ; init_reg : RANDOM_OBJECTS_ID ':' object_list { if (tmppart[npart]->nrobjects) { yyerror("Object registers already initialized!"); } else { tmppart[npart]->robjects = (char *)alloc(n_olist); (void) memcpy((genericptr_t)tmppart[npart]->robjects, (genericptr_t)olist, n_olist); tmppart[npart]->nrobjects = n_olist; } } | RANDOM_PLACES_ID ':' place_list { if (tmppart[npart]->nlocset) yyerror("Location registers already initialized!"); else store_place_list(npart, 0, n_plist, plist); n_plist = 0; } | RANDOM_PLACES_ID '[' INTEGER ']' ':' place_list { if ($3 >= MAX_REGISTERS) yyerror("Register Index overflow!"); else store_place_list(npart, $3, n_plist, plist); n_plist = 0; } | RANDOM_MONSTERS_ID ':' monster_list { if (tmppart[npart]->nrmonst) { yyerror("Monster registers already initialized!"); } else { tmppart[npart]->rmonst = (char *) alloc(n_mlist); (void) memcpy((genericptr_t)tmppart[npart]->rmonst, (genericptr_t)mlist, n_mlist); tmppart[npart]->nrmonst = n_mlist; } } | rndlevregion { /* nothing */ } ; object_list : object { if (n_olist < MAX_REGISTERS) olist[n_olist++] = $<i>1; else yyerror("Object list too long!"); } | object ',' object_list { if (n_olist < MAX_REGISTERS) olist[n_olist++] = $<i>1; else yyerror("Object list too long!"); } ; monster_list : monster { if (n_mlist < MAX_REGISTERS) mlist[n_mlist++] = $<i>1; else yyerror("Monster list too long!"); } | monster ',' monster_list { if (n_mlist < MAX_REGISTERS) mlist[n_mlist++] = $<i>1; else yyerror("Monster list too long!"); } ; place_list : place { if (n_plist < MAX_REGISTERS) plist[n_plist++] = current_coord; else yyerror("Location list too long!"); } | place { if (n_plist < MAX_REGISTERS) plist[n_plist++] = current_coord; else yyerror("Location list too long!"); } ',' place_list ; map_details : /* nothing */ | map_details map_detail ; map_detail : monster_detail | object_detail | object_flags | door_detail | trap_detail | drawbridge_detail | region_detail | stair_region | portal_region | teleprt_region | branch_region | altar_detail | fountain_detail | mazewalk_detail | wallify_detail | ladder_detail | stair_detail | gold_detail | engraving_detail | diggable_detail | passwall_detail ; monster_detail : MONSTER_ID chance ':' monster_c ',' m_name ',' coordinate { tmpmonst[nmons] = New(monster); tmpmonst[nmons]->x = current_coord.x; tmpmonst[nmons]->y = current_coord.y; tmpmonst[nmons]->class = $<i>4; tmpmonst[nmons]->peaceful = -1; /* no override */ tmpmonst[nmons]->asleep = -1; tmpmonst[nmons]->align = - MAX_REGISTERS - 2; tmpmonst[nmons]->name.str = 0; tmpmonst[nmons]->appear = 0; tmpmonst[nmons]->appear_as.str = 0; tmpmonst[nmons]->chance = $2; tmpmonst[nmons]->id = NON_PM; if (!in_room) check_coord(current_coord.x, current_coord.y, "Monster"); if ($6) { int token = get_monster_id($6, (char) $<i>4); if (token == ERR) yywarning( "Invalid monster name! Making random monster."); else tmpmonst[nmons]->id = token; Free($6); } } monster_infos { if (++nmons >= MAX_OF_TYPE) { yyerror("Too many monsters in room or mazepart!"); nmons--; } } ; monster_infos : /* nothing */ | monster_infos monster_info ; monster_info : ',' string { tmpmonst[nmons]->name.str = $2; } | ',' MON_ATTITUDE { tmpmonst[nmons]->peaceful = $<i>2; } | ',' MON_ALERTNESS { tmpmonst[nmons]->asleep = $<i>2; } | ',' alignment { tmpmonst[nmons]->align = $<i>2; } | ',' MON_APPEARANCE string { tmpmonst[nmons]->appear = $<i>2; tmpmonst[nmons]->appear_as.str = $3; } ; object_detail : OBJECT_ID object_desc { } | COBJECT_ID object_desc { /* 1: is contents of preceeding object with 2 */ /* 2: is a container */ /* 0: neither */ tmpobj[nobj-1]->containment = 2; } ; object_desc : chance ':' object_c ',' o_name { tmpobj[nobj] = New(object); tmpobj[nobj]->class = $<i>3; tmpobj[nobj]->corpsenm = NON_PM; tmpobj[nobj]->curse_state = -1; tmpobj[nobj]->name.str = 0; tmpobj[nobj]->chance = $1; tmpobj[nobj]->id = -1; tmpobj[nobj]->oflags = 0; if ($5) { int token = get_object_id($5, $<i>3); if (token == ERR) yywarning( "Illegal object name! Making random object."); else tmpobj[nobj]->id = token; Free($5); } } ',' object_where object_infos { if (++nobj >= MAX_OF_TYPE) { yyerror("Too many objects in room or mazepart!"); nobj--; } } ; object_where : coordinate { tmpobj[nobj]->containment = 0; tmpobj[nobj]->x = current_coord.x; tmpobj[nobj]->y = current_coord.y; if (!in_room) check_coord(current_coord.x, current_coord.y, "Object"); } | CONTAINED { tmpobj[nobj]->containment = 1; /* random coordinate, will be overridden anyway */ tmpobj[nobj]->x = -MAX_REGISTERS-2; tmpobj[nobj]->y = -MAX_REGISTERS-2; } ; object_infos : /* nothing */ { tmpobj[nobj]->spe = -127; /* Note below: we're trying to make as many of these optional as * possible. We clearly can't make curse_state, enchantment, and * monster_id _all_ optional, since ",random" would be ambiguous. * We can't even just make enchantment mandatory, since if we do that * alone, ",random" requires too much lookahead to parse. */ } | ',' curse_state ',' monster_id ',' enchantment optional_name { } | ',' curse_state ',' enchantment optional_name { } | ',' monster_id ',' enchantment optional_name { } ; object_flags : OBJFLAGS_ID ':' obj_flag_list { if (nobj > 0) tmpobj[nobj-1]->oflags = $3; else yyerror("Need an object before object flags!"); } ; obj_flag_list : obj_flag_list ',' OBJFLAG_TYPE { $$ = ($1 | $3); } | OBJFLAG_TYPE { $$ = $1; } ; curse_state : RANDOM_TYPE { tmpobj[nobj]->curse_state = -1; } | CURSE_TYPE { tmpobj[nobj]->curse_state = $1; } ; monster_id : STRING { int token = get_monster_id($1, (char)0); if (token == ERR) /* "random" */ tmpobj[nobj]->corpsenm = NON_PM - 1; else tmpobj[nobj]->corpsenm = token; Free($1); } ; enchantment : RANDOM_TYPE { tmpobj[nobj]->spe = -127; } | INTEGER { tmpobj[nobj]->spe = $1; } ; optional_name : /* nothing */ | ',' NONE { } | ',' STRING { tmpobj[nobj]->name.str = $2; } ; door_detail : DOOR_ID ':' door_state ',' coordinate { tmpdoor[ndoor] = New(door); tmpdoor[ndoor]->x = current_coord.x; tmpdoor[ndoor]->y = current_coord.y; tmpdoor[ndoor]->mask = $<i>3; tmpdoor[ndoor]->arti_key = 0; if(current_coord.x >= 0 && current_coord.y >= 0 && tmpmap[current_coord.y][current_coord.x] != DOOR && tmpmap[current_coord.y][current_coord.x] != SDOOR) yyerror("Door decl doesn't match the map"); } door_infos { if (++ndoor >= MAX_OF_TYPE) { yyerror("Too many doors in mazepart!"); ndoor--; } } ; door_infos : /* nothing */ | door_infos door_info ; door_info : ',' string { int token = get_artifact_id($2); if (token == ERR) { char ebuf[100]; Sprintf(ebuf, "Undefined artifact key \"%s\"", $2); yyerror(ebuf); } else tmpdoor[ndoor]->arti_key = token; } ; trap_detail : TRAP_ID chance ':' trap_name ',' coordinate { tmptrap[ntrap] = New(trap); tmptrap[ntrap]->x = current_coord.x; tmptrap[ntrap]->y = current_coord.y; tmptrap[ntrap]->type = $<i>4; tmptrap[ntrap]->chance = $2; if (!in_room) check_coord(current_coord.x, current_coord.y, "Trap"); if (++ntrap >= MAX_OF_TYPE) { yyerror("Too many traps in room or mazepart!"); ntrap--; } } ; drawbridge_detail: DRAWBRIDGE_ID ':' coordinate ',' DIRECTION ',' door_state { int x, y, dir; tmpdb[ndb] = New(drawbridge); x = tmpdb[ndb]->x = current_coord.x; y = tmpdb[ndb]->y = current_coord.y; /* convert dir from a DIRECTION to a DB_DIR */ dir = $5; switch(dir) { case W_NORTH: dir = DB_NORTH; y--; break; case W_SOUTH: dir = DB_SOUTH; y++; break; case W_EAST: dir = DB_EAST; x++; break; case W_WEST: dir = DB_WEST; x--; break; default: yyerror("Invalid drawbridge direction"); break; } tmpdb[ndb]->dir = dir; if (current_coord.x >= 0 && current_coord.y >= 0 && !IS_WALL(tmpmap[y][x])) { char ebuf[60]; Sprintf(ebuf, "Wall needed for drawbridge (%02d, %02d)", current_coord.x, current_coord.y); yyerror(ebuf); } if ( $<i>7 == D_ISOPEN ) tmpdb[ndb]->db_open = 1; else if ( $<i>7 == D_CLOSED ) tmpdb[ndb]->db_open = 0; else yyerror("A drawbridge can only be open or closed!"); ndb++; if (ndb >= MAX_OF_TYPE) { yyerror("Too many drawbridges in mazepart!"); ndb--; } } ; mazewalk_detail : MAZEWALK_ID ':' coordinate ',' DIRECTION { tmpwalk[nwalk] = New(walk); tmpwalk[nwalk]->x = current_coord.x; tmpwalk[nwalk]->y = current_coord.y; tmpwalk[nwalk]->dir = $5; nwalk++; if (nwalk >= MAX_OF_TYPE) { yyerror("Too many mazewalks in mazepart!"); nwalk--; } } ; wallify_detail : WALLIFY_ID { wallify_map(); } ; ladder_detail : LADDER_ID ':' coordinate ',' UP_OR_DOWN { tmplad[nlad] = New(lad); tmplad[nlad]->x = current_coord.x; tmplad[nlad]->y = current_coord.y; tmplad[nlad]->up = $<i>5; if (!in_room) check_coord(current_coord.x, current_coord.y, "Ladder"); nlad++; if (nlad >= MAX_OF_TYPE) { yyerror("Too many ladders in mazepart!"); nlad--; } } ; stair_detail : STAIR_ID ':' coordinate ',' UP_OR_DOWN { tmpstair[nstair] = New(stair); tmpstair[nstair]->x = current_coord.x; tmpstair[nstair]->y = current_coord.y; tmpstair[nstair]->up = $<i>5; if (!in_room) check_coord(current_coord.x, current_coord.y, "Stairway"); nstair++; if (nstair >= MAX_OF_TYPE) { yyerror("Too many stairs in room or mazepart!"); nstair--; } } ; stair_region : STAIR_ID ':' lev_region { tmplreg[nlreg] = New(lev_region); tmplreg[nlreg]->in_islev = $3; tmplreg[nlreg]->inarea.x1 = current_region.x1; tmplreg[nlreg]->inarea.y1 = current_region.y1; tmplreg[nlreg]->inarea.x2 = current_region.x2; tmplreg[nlreg]->inarea.y2 = current_region.y2; } ',' lev_region ',' UP_OR_DOWN { tmplreg[nlreg]->del_islev = $6; tmplreg[nlreg]->delarea.x1 = current_region.x1; tmplreg[nlreg]->delarea.y1 = current_region.y1; tmplreg[nlreg]->delarea.x2 = current_region.x2; tmplreg[nlreg]->delarea.y2 = current_region.y2; if($8) tmplreg[nlreg]->rtype = LR_UPSTAIR; else tmplreg[nlreg]->rtype = LR_DOWNSTAIR; tmplreg[nlreg]->rname.str = 0; nlreg++; if (nlreg >= MAX_OF_TYPE) { yyerror("Too many levregions in mazepart!"); nlreg--; } } ; rndlevregion : RANDOMREGION_ID '[' INTEGER ']' ':' lev_region { if ((unsigned) $3 != nrndlreg) yyerror("Wrong random region number!"); tmprndlreg[nrndlreg] = New(lev_region); tmprndlreg[nrndlreg]->in_islev = $6; tmprndlreg[nrndlreg]->inarea.x1 = current_region.x1; tmprndlreg[nrndlreg]->inarea.y1 = current_region.y1; tmprndlreg[nrndlreg]->inarea.x2 = current_region.x2; tmprndlreg[nrndlreg]->inarea.y2 = current_region.y2; } ',' lev_region { tmprndlreg[nrndlreg]->del_islev = $9; tmprndlreg[nrndlreg]->delarea.x1 = current_region.x1; tmprndlreg[nrndlreg]->delarea.y1 = current_region.y1; tmprndlreg[nrndlreg]->delarea.x2 = current_region.x2; tmprndlreg[nrndlreg]->delarea.y2 = current_region.y2; tmprndlreg[nrndlreg]->rtype = 0; tmprndlreg[nrndlreg]->rname.str = (char *)0; nrndlreg++; if (nrndlreg >= MAX_REGISTERS) { yyerror("Too many random regions!"); nrndlreg--; } } ; portal_region : PORTAL_ID ':' lev_region { tmplreg[nlreg] = New(lev_region); tmplreg[nlreg]->in_islev = $3; tmplreg[nlreg]->inarea.x1 = current_region.x1; tmplreg[nlreg]->inarea.y1 = current_region.y1; tmplreg[nlreg]->inarea.x2 = current_region.x2; tmplreg[nlreg]->inarea.y2 = current_region.y2; } ',' lev_region ',' string { tmplreg[nlreg]->del_islev = $6; tmplreg[nlreg]->delarea.x1 = current_region.x1; tmplreg[nlreg]->delarea.y1 = current_region.y1; tmplreg[nlreg]->delarea.x2 = current_region.x2; tmplreg[nlreg]->delarea.y2 = current_region.y2; tmplreg[nlreg]->rtype = LR_PORTAL; tmplreg[nlreg]->rname.str = $8; nlreg++; if (nlreg >= MAX_OF_TYPE) { yyerror("Too many levregions in mazepart!"); nlreg--; } } ; teleprt_region : TELEPRT_ID ':' lev_region { tmplreg[nlreg] = New(lev_region); tmplreg[nlreg]->in_islev = $3; tmplreg[nlreg]->inarea.x1 = current_region.x1; tmplreg[nlreg]->inarea.y1 = current_region.y1; tmplreg[nlreg]->inarea.x2 = current_region.x2; tmplreg[nlreg]->inarea.y2 = current_region.y2; } ',' lev_region { tmplreg[nlreg]->del_islev = $6; tmplreg[nlreg]->delarea.x1 = current_region.x1; tmplreg[nlreg]->delarea.y1 = current_region.y1; tmplreg[nlreg]->delarea.x2 = current_region.x2; tmplreg[nlreg]->delarea.y2 = current_region.y2; } teleprt_detail { switch($<i>8) { case -1: tmplreg[nlreg]->rtype = LR_TELE; break; case 0: tmplreg[nlreg]->rtype = LR_DOWNTELE; break; case 1: tmplreg[nlreg]->rtype = LR_UPTELE; break; } tmplreg[nlreg]->rname.str = 0; nlreg++; if (nlreg >= MAX_OF_TYPE) { yyerror("Too many levregions in mazepart!"); nlreg--; } } ; branch_region : BRANCH_ID ':' lev_region { tmplreg[nlreg] = New(lev_region); tmplreg[nlreg]->in_islev = $3; tmplreg[nlreg]->inarea.x1 = current_region.x1; tmplreg[nlreg]->inarea.y1 = current_region.y1; tmplreg[nlreg]->inarea.x2 = current_region.x2; tmplreg[nlreg]->inarea.y2 = current_region.y2; } ',' lev_region { tmplreg[nlreg]->del_islev = $6; tmplreg[nlreg]->delarea.x1 = current_region.x1; tmplreg[nlreg]->delarea.y1 = current_region.y1; tmplreg[nlreg]->delarea.x2 = current_region.x2; tmplreg[nlreg]->delarea.y2 = current_region.y2; tmplreg[nlreg]->rtype = LR_BRANCH; tmplreg[nlreg]->rname.str = 0; nlreg++; if (nlreg >= MAX_OF_TYPE) { yyerror("Too many levregions in mazepart!"); nlreg--; } } ; teleprt_detail : /* empty */ { $<i>$ = -1; } | ',' UP_OR_DOWN { $<i>$ = $2; } ; lev_region : region { $$ = 0; } | LEV '(' INTEGER ',' INTEGER ',' INTEGER ',' INTEGER ')' { /* This series of if statements is a hack for MSC 5.1. It seems that its tiny little brain cannot compile if these are all one big if statement. */ if ($3 <= 0 || $3 >= COLNO) yyerror("Region out of level range!"); else if ($5 < 0 || $5 >= ROWNO) yyerror("Region out of level range!"); else if ($7 <= 0 || $7 >= COLNO) yyerror("Region out of level range!"); else if ($9 < 0 || $9 >= ROWNO) yyerror("Region out of level range!"); current_region.x1 = $3; current_region.y1 = $5; current_region.x2 = $7; current_region.y2 = $9; $$ = 1; } ; fountain_detail : FOUNTAIN_ID ':' coordinate { tmpfountain[nfountain] = New(fountain); tmpfountain[nfountain]->x = current_coord.x; tmpfountain[nfountain]->y = current_coord.y; if (!in_room) check_coord(current_coord.x, current_coord.y, "Fountain"); nfountain++; if (nfountain >= MAX_OF_TYPE) { yyerror("Too many fountains in room or mazepart!"); nfountain--; } } ; sink_detail : SINK_ID ':' coordinate { tmpsink[nsink] = New(sink); tmpsink[nsink]->x = current_coord.x; tmpsink[nsink]->y = current_coord.y; nsink++; if (nsink >= MAX_OF_TYPE) { yyerror("Too many sinks in room!"); nsink--; } } ; pool_detail : POOL_ID ':' coordinate { tmppool[npool] = New(pool); tmppool[npool]->x = current_coord.x; tmppool[npool]->y = current_coord.y; npool++; if (npool >= MAX_OF_TYPE) { yyerror("Too many pools in room!"); npool--; } } ; diggable_detail : NON_DIGGABLE_ID ':' region { tmpdig[ndig] = New(digpos); tmpdig[ndig]->x1 = current_region.x1; tmpdig[ndig]->y1 = current_region.y1; tmpdig[ndig]->x2 = current_region.x2; tmpdig[ndig]->y2 = current_region.y2; ndig++; if (ndig >= MAX_OF_TYPE) { yyerror("Too many diggables in mazepart!"); ndig--; } } ; passwall_detail : NON_PASSWALL_ID ':' region { tmppass[npass] = New(digpos); tmppass[npass]->x1 = current_region.x1; tmppass[npass]->y1 = current_region.y1; tmppass[npass]->x2 = current_region.x2; tmppass[npass]->y2 = current_region.y2; npass++; if (npass >= 32) { yyerror("Too many passwalls in mazepart!"); npass--; } } ; region_detail : REGION_ID ':' region ',' light_state ',' room_type prefilled { tmpreg[nreg] = New(region); tmpreg[nreg]->x1 = current_region.x1; tmpreg[nreg]->y1 = current_region.y1; tmpreg[nreg]->x2 = current_region.x2; tmpreg[nreg]->y2 = current_region.y2; tmpreg[nreg]->rlit = $<i>5; tmpreg[nreg]->rtype = $<i>7; if($<i>8 & 1) tmpreg[nreg]->rtype += MAXRTYPE+1; tmpreg[nreg]->rirreg = (($<i>8 & 2) != 0); if(current_region.x1 > current_region.x2 || current_region.y1 > current_region.y2) yyerror("Region start > end!"); if(tmpreg[nreg]->rtype == VAULT && (tmpreg[nreg]->rirreg || (tmpreg[nreg]->x2 - tmpreg[nreg]->x1 != 1) || (tmpreg[nreg]->y2 - tmpreg[nreg]->y1 != 1))) yyerror("Vaults must be exactly 2x2!"); if(want_warnings && !tmpreg[nreg]->rirreg && current_region.x1 > 0 && current_region.y1 > 0 && current_region.x2 < (int)max_x_map && current_region.y2 < (int)max_y_map) { /* check for walls in the room */ char ebuf[60]; register int x, y, nrock = 0; for(y=current_region.y1; y<=current_region.y2; y++) for(x=current_region.x1; x<=current_region.x2; x++) if(IS_ROCK(tmpmap[y][x]) || IS_DOOR(tmpmap[y][x])) nrock++; if(nrock) { Sprintf(ebuf, "Rock in room (%02d,%02d,%02d,%02d)?!", current_region.x1, current_region.y1, current_region.x2, current_region.y2); yywarning(ebuf); } if ( !IS_ROCK(tmpmap[current_region.y1-1][current_region.x1-1]) || !IS_ROCK(tmpmap[current_region.y2+1][current_region.x1-1]) || !IS_ROCK(tmpmap[current_region.y1-1][current_region.x2+1]) || !IS_ROCK(tmpmap[current_region.y2+1][current_region.x2+1])) { Sprintf(ebuf, "NonRock edge in room (%02d,%02d,%02d,%02d)?!", current_region.x1, current_region.y1, current_region.x2, current_region.y2); yywarning(ebuf); } } else if(tmpreg[nreg]->rirreg && !IS_ROOM(tmpmap[current_region.y1][current_region.x1])) { char ebuf[60]; Sprintf(ebuf, "Rock in irregular room (%02d,%02d)?!", current_region.x1, current_region.y1); yyerror(ebuf); } nreg++; if (nreg >= MAX_OF_TYPE) { yyerror("Too many regions in mazepart!"); nreg--; } } ; altar_detail : ALTAR_ID ':' coordinate ',' alignment ',' altar_type { tmpaltar[naltar] = New(altar); tmpaltar[naltar]->x = current_coord.x; tmpaltar[naltar]->y = current_coord.y; tmpaltar[naltar]->align = $<i>5; tmpaltar[naltar]->shrine = $<i>7; if (!in_room) check_coord(current_coord.x, current_coord.y, "Altar"); naltar++; if (naltar >= MAX_OF_TYPE) { yyerror("Too many altars in room or mazepart!"); naltar--; } } ; gold_detail : GOLD_ID ':' amount ',' coordinate { tmpgold[ngold] = New(gold); tmpgold[ngold]->x = current_coord.x; tmpgold[ngold]->y = current_coord.y; tmpgold[ngold]->amount = $<i>3; if (!in_room) check_coord(current_coord.x, current_coord.y, "Gold"); ngold++; if (ngold >= MAX_OF_TYPE) { yyerror("Too many golds in room or mazepart!"); ngold--; } } ; engraving_detail: ENGRAVING_ID ':' coordinate ',' engraving_type ',' string { tmpengraving[nengraving] = New(engraving); tmpengraving[nengraving]->x = current_coord.x; tmpengraving[nengraving]->y = current_coord.y; tmpengraving[nengraving]->engr.str = $7; tmpengraving[nengraving]->etype = $<i>5; if (!in_room) check_coord(current_coord.x, current_coord.y, "Engraving"); nengraving++; if (nengraving >= MAX_OF_TYPE) { yyerror("Too many engravings in room or mazepart!"); nengraving--; } } ; monster_c : monster | RANDOM_TYPE { $<i>$ = - MAX_REGISTERS - 1; } | m_register ; object_c : object | RANDOM_TYPE { $<i>$ = - MAX_REGISTERS - 1; } | o_register ; m_name : string | RANDOM_TYPE { $$ = (char *) 0; } ; o_name : string | RANDOM_TYPE { $$ = (char *) 0; } ; trap_name : string { int token = get_trap_type($1); if (token == ERR) yyerror("Unknown trap type!"); $<i>$ = token; Free($1); } | RANDOM_TYPE ; room_type : string { int token = get_room_type($1); if (token == ERR) { yywarning("Unknown room type! Making ordinary room..."); $<i>$ = OROOM; } else $<i>$ = token; Free($1); } | RANDOM_TYPE ; prefilled : /* empty */ { $<i>$ = 0; } | ',' FILLING { $<i>$ = $2; } | ',' FILLING ',' BOOLEAN { $<i>$ = $2 + ($4 << 1); } ; coordinate : coord | p_register | r_register | RANDOM_TYPE { current_coord.x = current_coord.y = -MAX_REGISTERS-2; } ; door_state : DOOR_STATE | RANDOM_TYPE ; light_state : LIGHT_STATE | RANDOM_TYPE ; alignment : ALIGNMENT | a_register | RANDOM_TYPE { $<i>$ = - MAX_REGISTERS - 1; } ; altar_type : ALTAR_TYPE | RANDOM_TYPE ; p_register : P_REGISTER '[' INTEGER ']' { if ( $3 >= MAX_REGISTERS ) yyerror("Register Index overflow!"); else { current_coord.x = -1; current_coord.y = - $3 - 1; } } | P_REGISTER '[' INTEGER ']' '[' INTEGER ']' { if ( $3 >= MAX_REGISTERS || $6 >= MAX_REGISTERS ) yyerror("Register Index overflow!"); else { current_coord.x = - $3 - 1; current_coord.y = - $6 - 1; } } ; r_register : R_REGISTER '[' INTEGER ']' { if ( $3 < 0 || $3 >= nrndlreg ) yyerror("Register Index overflow!"); else { current_coord.x = -MAX_REGISTERS-1; current_coord.y = - $3 - 1; } } ; o_register : O_REGISTER '[' INTEGER ']' { if ( $3 >= MAX_REGISTERS ) yyerror("Register Index overflow!"); else $<i>$ = - $3 - 1; } ; m_register : M_REGISTER '[' INTEGER ']' { if ( $3 >= MAX_REGISTERS ) yyerror("Register Index overflow!"); else $<i>$ = - $3 - 1; } ; a_register : A_REGISTER '[' INTEGER ']' { if ( $3 >= 3 ) yyerror("Register Index overflow!"); else $<i>$ = - $3 - 1; } ; place : coord | NONE { current_coord.x = (char)-1; current_coord.y = (char)-1; } ; monster : CHAR { if (check_monster_char((char) $1)) $<i>$ = $1 ; else { yyerror("Unknown monster class!"); $<i>$ = ERR; } } ; object : CHAR { char c = $1; if (check_object_char(c)) $<i>$ = c; else { yyerror("Unknown char class!"); $<i>$ = ERR; } } ; string : STRING ; amount : INTEGER | RANDOM_TYPE ; chance : /* empty */ { $$ = 100; /* default is 100% */ } | PERCENT { if ($1 <= 0 || $1 > 100) yyerror("Expected percentile chance."); $$ = $1; } ; engraving_type : ENGRAVING_TYPE | RANDOM_TYPE ; coord : '(' INTEGER ',' INTEGER ')' { if (!in_room && !init_lev.init_present && ($2 < 0 || $2 > (int)max_x_map || $4 < 0 || $4 > (int)max_y_map)) yyerror("Coordinates out of map range!"); current_coord.x = $2; current_coord.y = $4; } ; region : '(' INTEGER ',' INTEGER ',' INTEGER ',' INTEGER ')' { /* This series of if statements is a hack for MSC 5.1. It seems that its tiny little brain cannot compile if these are all one big if statement. */ if ($2 < 0 || $2 > (int)max_x_map) yyerror("Region out of map range!"); else if ($4 < 0 || $4 > (int)max_y_map) yyerror("Region out of map range!"); else if ($6 < 0 || $6 > (int)max_x_map) yyerror("Region out of map range!"); else if ($8 < 0 || $8 > (int)max_y_map) yyerror("Region out of map range!"); current_region.x1 = $2; current_region.y1 = $4; current_region.x2 = $6; current_region.y2 = $8; } ; %% /*lev_comp.y*/ ��������������������������������������������������������������������������slashem-0.0.7E7F3/util/dgn_comp.l�������������������������������������������������������������������0000664�0000764�0000764�00000011114�10545462320�014564� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������%{ /* SCCS Id: @(#)dgn_lex.c 3.4 2002/03/27 */ /* Copyright (c) 1989 by Jean-Christophe Collet */ /* Copyright (c) 1990 by M. Stephenson */ /* NetHack may be freely redistributed. See license for details. */ #define DGN_COMP #include "config.h" #include "dgn_comp.h" #include "dgn_file.h" /* * Most of these don't exist in flex, yywrap is macro and * yyunput is properly declared in flex.skel. */ #if !defined(FLEX_SCANNER) && !defined(FLEXHACK_SCANNER) int FDECL(yyback, (int *,int)); int NDECL(yylook); int NDECL(yyinput); int NDECL(yywrap); int NDECL(yylex); /* Traditional lexes let yyunput() and yyoutput() default to int; * newer ones may declare them as void since they don't return * values. For even more fun, the lex supplied as part of the * newer unbundled compiler for SunOS 4.x adds the void declarations * (under __STDC__ or _cplusplus ifdefs -- otherwise they remain * int) while the bundled lex and the one with the older unbundled * compiler do not. To detect this, we need help from outside -- * sys/unix/Makefile.utl. * * Digital UNIX is difficult and still has int in spite of all * other signs. */ # if defined(NeXT) || defined(SVR4) || defined(_AIX32) # define VOIDYYPUT # endif # if !defined(VOIDYYPUT) && defined(POSIX_TYPES) # if !defined(BOS) && !defined(HISX) && !defined(_M_UNIX) && !defined(VMS) # define VOIDYYPUT # endif # endif # if !defined(VOIDYYPUT) && defined(WEIRD_LEX) # if defined(SUNOS4) && defined(__STDC__) && (WEIRD_LEX > 1) # define VOIDYYPUT # endif # endif # if defined(VOIDYYPUT) && defined(__osf__) # undef VOIDYYPUT # endif # ifdef VOIDYYPUT void FDECL(yyunput, (int)); void FDECL(yyoutput, (int)); # else int FDECL(yyunput, (int)); int FDECL(yyoutput, (int)); # endif #endif /* !FLEX_SCANNER && !FLEXHACK_SCANNER */ #ifdef FLEX_SCANNER #define YY_MALLOC_DECL \ genericptr_t FDECL(malloc, (size_t)); \ genericptr_t FDECL(realloc, (genericptr_t,size_t)); #endif void FDECL(init_yyin, (FILE *)); void FDECL(init_yyout, (FILE *)); /* this doesn't always get put in dgn_comp.h * (esp. when using older versions of bison) */ extern YYSTYPE yylval; int line_number = 1; /* * This is a hack required by Michael Hamel to get things * working on the Mac. */ #if defined(MAC_MPW) && !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 /* MAC_MPW && !FLEX_SCANNER && !FLEXHACK_SCANNER */ %} %% DUNGEON return(A_DUNGEON); up { yylval.i=1; return(UP_OR_DOWN); } down { yylval.i=0; return(UP_OR_DOWN); } ENTRY return(ENTRY); stair return(STAIR); no_up return(NO_UP); no_down return(NO_DOWN); portal return(PORTAL); PROTOFILE return(PROTOFILE); DESCRIPTION return(DESCRIPTION); LEVELDESC return(LEVELDESC); ALIGNMENT return(ALIGNMENT); LEVALIGN return(LEVALIGN); town { yylval.i=TOWN ; return(DESCRIPTOR); } hellish { yylval.i=HELLISH ; return(DESCRIPTOR); } mazelike { yylval.i=MAZELIKE ; return(DESCRIPTOR); } roguelike { yylval.i=ROGUELIKE ; return(DESCRIPTOR); } unaligned { yylval.i=D_ALIGN_NONE ; return(DESCRIPTOR); } noalign { yylval.i=D_ALIGN_NONE ; return(DESCRIPTOR); } lawful { yylval.i=D_ALIGN_LAWFUL ; return(DESCRIPTOR); } neutral { yylval.i=D_ALIGN_NEUTRAL ; return(DESCRIPTOR); } chaotic { yylval.i=D_ALIGN_CHAOTIC ; return(DESCRIPTOR); } BRANCH return(BRANCH); CHAINBRANCH return(CHBRANCH); LEVEL return(LEVEL); RNDLEVEL return(RNDLEVEL); CHAINLEVEL return(CHLEVEL); RNDCHLEVEL return(RNDCHLEVEL); [-0-9]+ { yylval.i=atoi(yytext); return(INTEGER); } \"[^"]*\" { yytext[yyleng-1] = 0; /* Discard the trailing \" */ yylval.str = (char *) alloc(strlen(yytext+1)+1); Strcpy(yylval.str, yytext+1); /* Discard the first \" */ return(STRING); } ^#.*\n { line_number++; } \r?\n { line_number++; } [ \t]+ ; /* skip trailing tabs & spaces */ . { return yytext[0]; } %% /* routine to switch to another input file; needed for flex */ void init_yyin( input_f ) FILE *input_f; { #if defined(FLEX_SCANNER) || defined(FLEXHACK_SCANNER) if (yyin) yyrestart(input_f); else #endif yyin = input_f; } /* analogous routine (for completeness) */ void init_yyout( output_f ) FILE *output_f; { yyout = output_f; } /*dgn_comp.l*/ ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������slashem-0.0.7E7F3/util/recover.c��������������������������������������������������������������������0000664�0000764�0000764�00000020731�10545462320�014437� 0����������������������������������������������������������������������������������������������������ustar �ali�����������������������������ali��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* SCCS Id: @(#)recover.c 3.4 1999/10/23 */ /* Copyright (c) Janet Walz, 1992. */ /* NetHack may be freely redistributed. See license for details. */ /* * Utility for reconstructing NetHack save file from a set of individual * level files. Requires that the `checkpoint' option be enabled at the * time NetHack creates those level files. */ #include "config.h" #if !defined(O_WRONLY) && !defined(LSC) && !defined(AZTEC_C) #include <fcntl.h> #endif #ifdef WIN32 #include <errno.h> #include "win32api.h" #endif #ifdef VMS extern int FDECL(vms_creat, (const char *,unsigned)); extern int FDECL(vms_open, (const char *,int,unsigned)); #endif /* VMS */ int FDECL(restore_savefile, (char *)); void FDECL(set_levelfile_name, (int)); int FDECL(open_levelfile, (int)); 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 #define SAVESIZE (PL_NSIZ + 13) /* save/99999player.e */ #else # ifdef VMS #define SAVESIZE (PL_NSIZ + 22) /* [.save]<uid>player.e;1 */ # else # ifdef WIN32 #define SAVESIZE (PL_NSIZ + 40) /* username-player.NetHack-saved-game */ # else #define SAVESIZE FILENAMELEN /* from macconf.h or pcconf.h */ # endif # endif #endif #if defined(EXEPATH) 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 */ int main(argc, argv) int argc; char *argv[]; { int argno; const char *dir = (char *)0; #ifdef AMIGA char *startdir = (char *)0; #endif if (!dir) dir = getenv("NETHACKDIR"); if (!dir) dir = getenv("HACKDIR"); #if defined(EXEPATH) if (!dir) dir = exepath(argv[0]); #endif if (argc == 1 || (argc == 2 && !strcmp(argv[1], "-"))) { Fprintf(stderr, "Usage: %s [ -d directory ] base1 [ base2 ... ]\n", argv[0]); #if defined(WIN32) || defined(MSDOS) if (dir) { Fprintf(stderr, "\t(Unless you override it with -d, recover will look \n"); Fprintf(stderr, "\t in the %s directory on your system)\n", dir); } #endif exit(EXIT_FAILURE); } argno = 1; if (!strncmp(argv[argno], "-d", 2)) { dir = argv[argno]+2; if (*dir == '=' || *dir == ':') dir++; if (!*dir && argc > argno) { argno++; dir = argv[argno]; } if (!*dir) { Fprintf(stderr, "%s: flag -d must be followed by a directory name.\n", argv[0]); exit(EXIT_FAILURE); } argno++; } #if defined(SECURE) && !defined(VMS) if (dir # ifdef HACKDIR && strcmp(dir, HACKDIR) # endif ) { (void) setgid(getgid()); (void) setuid(getuid()); } #endif /* SECURE && !VMS */ #ifdef HACKDIR if (!dir) dir = HACKDIR; #endif #ifdef AMIGA startdir = getcwd(0,255); #endif if (dir && chdir((char *) dir) < 0) { Fprintf(stderr, "%s: cannot chdir to %s.\n", argv[0], dir); exit(EXIT_FAILURE); } while (argc > argno) { if (restore_savefile(argv[argno]) == 0) Fprintf(stderr, "recovered \"%s\" to %s\n", argv[argno], savename); argno++; } #ifdef AMIGA if (startdir) (void)chdir(startdir); #endif exit(EXIT_SUCCESS); /*NOTREACHED*/ return 0; } static char lock[256]; void set_levelfile_name(lev) int lev; { char *tf; tf = rindex(lock, '.'); if (!tf) tf = lock + strlen(lock); (void) sprintf(tf, ".%d", lev); #ifdef VMS (void) strcat(tf, ";1"); #endif } int open_levelfile(lev) int lev; { int fd; set_levelfile_name(lev); #if defined(MICRO) || defined(WIN32) || defined(MSDOS) fd = open(lock, O_RDONLY | O_BINARY); #else fd = open(lock, O_RDONLY, 0); #endif return fd; } int create_savefile() { int fd; #if defined(MICRO) || defined(WIN32) || defined(MSDOS) fd = open(savename, O_WRONLY | O_BINARY | O_CREAT | O_TRUNC, FCMASK); #else fd = creat(savename, FCMASK); #endif return fd; } void copy_bytes(ifd, ofd) int ifd, ofd; { char buf[BUFSIZ]; int nfrom, nto; do { nfrom = read(ifd, buf, BUFSIZ); nto = write(ofd, buf, nfrom); if (nto != nfrom) { Fprintf(stderr, "file copy failed!\n"); exit(EXIT_FAILURE); } } while (nfrom == BUFSIZ); } int restore_savefile(basename) char *basename; { int gfd, lfd, sfd; int lev, savelev, hpid; xchar levc; struct version_info version_data; /* level 0 file contains: * pid of creating process (ignored here) * level number for current level of save file * name of save file nethack would have created * and game state */ (void) strcpy(lock, basename); gfd = open_levelfile(0); if (gfd < 0) { #if defined(WIN32) && !defined(WIN_CE) if(errno == EACCES) { Fprintf(stderr, "\nThere are files from a game in progress under your name."); Fprintf(stderr,"\nThe files are locked or inaccessible."); Fprintf(stderr,"\nPerhaps the other game is still running?\n"); } else Fprintf(stderr, "\nTrouble accessing level 0 (errno = %d).\n", errno); #endif Fprintf(stderr, "Cannot open level 0 for %s.\n", basename); return(-1); } if (read(gfd, (genericptr_t) &hpid, sizeof hpid) != sizeof hpid) { Fprintf(stderr, "%s\n%s%s%s\n", "Checkpoint data incompletely written or subsequently clobbered;", "recovery for \"", basename, "\" impossible."); Close(gfd); return(-1); } if (read(gfd, (genericptr_t) &savelev, sizeof(savelev)) != sizeof(savelev)) { Fprintf(stderr, "Checkpointing was not in effect for %s -- recovery impossible.\n", basename); Close(gfd); return(-1); } if ((read(gfd, (genericptr_t) savename, sizeof savename) != sizeof savename) || (read(gfd, (genericptr_t) &version_data, sizeof version_data) != sizeof version_data)) { Fprintf(stderr, "Error reading %s -- can't recover.\n", lock); Close(gfd); return(-1); } /* save file should contain: * version info * current level (including pets) * (non-level-based) game state * other levels */ sfd = create_savefile(); if (sfd < 0) { Fprintf(stderr, "Cannot create savefile %s.\n", savename); Close(gfd); return(-1); } lfd = open_levelfile(savelev); if (lfd < 0) { Fprintf(stderr, "Cannot open level of save for %s.\n", basename); Close(gfd); Close(sfd); return(-1); } if (write(sfd, (genericptr_t) &version_data, sizeof version_data) != sizeof version_data) { Fprintf(stderr, "Error writing %s; recovery failed.\n", savename); Close(gfd); Close(sfd); return(-1); } copy_bytes(lfd, sfd); Close(lfd); (void) unlink(lock); copy_bytes(gfd, sfd); Close(gfd); set_levelfile_name(0); (void) unlink(lock); for (lev = 1; lev < 256; lev++) { /* level numbers are kept in xchars in save.c, so the * maximum level number (for the endlevel) must be < 256 */ if (lev != savelev) { lfd = open_levelfile(lev); if (lfd >= 0) { /* any or all of these may not exist */ levc = (xchar) lev; write(sfd, (genericptr_t) &levc, sizeof(levc)); copy_bytes(lfd, sfd); Close(lfd); (void) unlink(lock); } } } Close(sfd); #if 0 /* OBSOLETE, HackWB is no longer in use */ #ifdef AMIGA /* we need to create an icon for the saved game * or HackWB won't notice the file. */ { char iconfile[FILENAME]; int in, out; (void) sprintf(iconfile, "%s.info", savename); in = open("NetHack:default.icon", O_RDONLY); out = open(iconfile, O_WRONLY | O_TRUNC | O_CREAT); if(in > -1 && out > -1){ copy_bytes(in,out); } if(in > -1)close(in); if(out > -1)close(out); } #endif #endif return(0); } #ifdef EXEPATH # ifdef __DJGPP__ #define PATH_SEPARATOR '/' # else #define PATH_SEPARATOR '\\' # endif #define EXEPATHBUFSZ 256 char exepathbuf[EXEPATHBUFSZ]; char *exepath(str) char *str; { char *tmp, *tmp2; int bsize; 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; } #endif /* EXEPATH */ #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*/ �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������